From 906c0e7c76d0e306b0364542a23eb0e9a6b1a159 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 12 Dec 2023 13:30:41 +0100 Subject: [PATCH] rebase: reset all dependencies in tools/ subdir Signed-off-by: Niels de Vos --- tools/go.mod | 191 +- tools/go.sum | 1177 +- tools/tools.go | 2 +- .../AdaLogics/go-fuzz-headers/LICENSE | 201 + .../AdaLogics/go-fuzz-headers/README.md | 93 + .../AdaLogics/go-fuzz-headers/consumer.go | 899 + .../AdaLogics/go-fuzz-headers/funcs.go | 62 + .../AdaLogics/go-fuzz-headers/sql.go | 556 + .../github.com/Azure/go-ansiterm/SECURITY.md | 41 + .../github.com/BurntSushi/toml/decode.go | 42 +- .../BurntSushi/toml/decode_go116.go | 4 +- .../vendor/github.com/BurntSushi/toml/doc.go | 22 +- .../github.com/BurntSushi/toml/encode.go | 40 +- .../github.com/BurntSushi/toml/error.go | 67 +- .../vendor/github.com/BurntSushi/toml/lex.go | 2 +- .../vendor/github.com/BurntSushi/toml/meta.go | 4 +- .../Masterminds/semver/v3/.golangci.yml | 24 +- .../Masterminds/semver/v3/CHANGELOG.md | 20 + .../Masterminds/semver/v3/constraints.go | 30 +- .../github.com/Masterminds/semver/v3/doc.go | 178 +- .../Masterminds/semver/v3/version.go | 47 +- .../Masterminds/sprig/v3/CHANGELOG.md | 15 +- .../github.com/Masterminds/sprig/v3/README.md | 9 +- .../Microsoft/go-winio/.golangci.yml | 27 +- .../github.com/Microsoft/go-winio/hvsock.go | 6 +- .../Microsoft/go-winio/internal/fs/doc.go | 2 + .../Microsoft/go-winio/internal/fs/fs.go | 202 + .../go-winio/internal/fs/security.go | 12 + .../go-winio/internal/fs/zsyscall_windows.go | 64 + .../go-winio/internal/socket/socket.go | 4 +- .../go-winio/internal/stringbuffer/wstring.go | 132 + .../github.com/Microsoft/go-winio/pipe.go | 22 +- .../go-winio/tools/mkwinsyscall/doc.go | 57 + .../tools/mkwinsyscall/mkwinsyscall.go | 1059 + .../Microsoft/go-winio/zsyscall_windows.go | 19 - .../Microsoft/hcsshim/.gitattributes | 4 +- .../github.com/Microsoft/hcsshim/.gitignore | 15 +- .../Microsoft/hcsshim/.golangci.yml | 56 +- .../github.com/Microsoft/hcsshim/Makefile | 76 +- .../Microsoft/hcsshim/Protobuild.toml | 11 +- .../github.com/Microsoft/hcsshim/README.md | 20 +- .../github.com/Microsoft/hcsshim/SECURITY.md | 41 + .../hcsshim/computestorage/attach.go | 6 +- .../hcsshim/computestorage/destroy.go | 6 +- .../hcsshim/computestorage/detach.go | 6 +- .../hcsshim/computestorage/export.go | 12 +- .../hcsshim/computestorage/format.go | 12 +- .../hcsshim/computestorage/helpers.go | 14 +- .../hcsshim/computestorage/import.go | 6 +- .../hcsshim/computestorage/initialize.go | 6 +- .../Microsoft/hcsshim/computestorage/mount.go | 7 +- .../Microsoft/hcsshim/computestorage/setup.go | 14 +- .../hcsshim/computestorage/storage.go | 9 +- .../computestorage/zsyscall_windows.go | 187 +- .../github.com/Microsoft/hcsshim/container.go | 4 +- .../github.com/Microsoft/hcsshim/errors.go | 5 + .../Microsoft/hcsshim/functional_tests.ps1 | 12 - .../github.com/Microsoft/hcsshim/hcsshim.go | 12 +- .../Microsoft/hcsshim/hnsendpoint.go | 4 +- .../Microsoft/hcsshim/hnsglobals.go | 2 + .../Microsoft/hcsshim/hnsnetwork.go | 6 +- .../Microsoft/hcsshim/hnspolicylist.go | 2 + .../Microsoft/hcsshim/hnssupport.go | 2 + .../github.com/Microsoft/hcsshim/interface.go | 2 + .../Microsoft/hcsshim/internal/cow/cow.go | 8 + .../hcsshim/internal/hcs/callback.go | 2 + .../Microsoft/hcsshim/internal/hcs/doc.go | 1 + .../Microsoft/hcsshim/internal/hcs/errors.go | 159 +- .../Microsoft/hcsshim/internal/hcs/process.go | 152 +- .../hcsshim/internal/hcs/schema1/schema1.go | 4 +- .../hcs/schema2/cpu_group_property.go | 8 + .../internal/hcs/schema2/debug_options.go | 22 + .../internal/hcs/schema2/guest_state.go | 3 + .../hcs/schema2/isolation_settings.go | 21 + .../hcs/schema2/modify_setting_request.go | 4 +- .../internal/hcs/schema2/security_settings.go | 16 + .../internal/hcs/schema2/system_time.go | 28 + .../hcs/schema2/time_zone_information.go | 26 + .../hcsshim/internal/hcs/schema2/uefi.go | 2 + .../internal/hcs/schema2/virtual_machine.go | 4 + .../Microsoft/hcsshim/internal/hcs/service.go | 2 + .../Microsoft/hcsshim/internal/hcs/system.go | 104 +- .../Microsoft/hcsshim/internal/hcs/utils.go | 2 + .../hcsshim/internal/hcs/waithelper.go | 18 +- .../hcsshim/internal/hcserror/doc.go | 1 + .../hcsshim/internal/hcserror/hcserror.go | 19 +- .../Microsoft/hcsshim/internal/hns/doc.go | 1 + .../Microsoft/hcsshim/internal/hns/hns.go | 2 +- .../hcsshim/internal/hns/hnsendpoint.go | 6 +- .../hcsshim/internal/hns/hnsfuncs.go | 2 + .../hcsshim/internal/hns/hnsglobals.go | 2 + .../hcsshim/internal/hns/hnsnetwork.go | 9 +- .../hcsshim/internal/hns/hnspolicy.go | 18 +- .../hcsshim/internal/hns/hnspolicylist.go | 2 + .../hcsshim/internal/hns/hnssupport.go | 2 + .../hcsshim/internal/hns/namespace.go | 2 + .../hcsshim/internal/hns/zsyscall_windows.go | 10 +- .../Microsoft/hcsshim/internal/interop/doc.go | 1 + .../hcsshim/internal/interop/interop.go | 4 +- .../internal/interop/zsyscall_windows.go | 7 +- .../hcsshim/internal/jobobject/doc.go | 8 + .../hcsshim/internal/jobobject/iocp.go | 2 + .../hcsshim/internal/jobobject/jobobject.go | 155 +- .../hcsshim/internal/jobobject/limits.go | 2 + .../Microsoft/hcsshim/internal/log/context.go | 118 + .../Microsoft/hcsshim/internal/log/g.go | 23 - .../Microsoft/hcsshim/internal/log/hook.go | 45 + .../Microsoft/hcsshim/internal/log/scrub.go | 194 + .../hcsshim/internal/logfields/fields.go | 35 +- .../Microsoft/hcsshim/internal/memory/pool.go | 316 + .../hcsshim/internal/memory/types.go | 28 + .../Microsoft/hcsshim/internal/oc/span.go | 31 + .../internal/protocol/guestrequest/types.go | 56 + .../Microsoft/hcsshim/internal/safefile/do.go | 1 + .../hcsshim/internal/safefile/safeopen.go | 30 +- .../internal}/security/grantvmgroupaccess.go | 95 +- .../internal}/security/syscall_windows.go | 0 .../internal}/security/zsyscall_windows.go | 0 .../hcsshim/internal/vmcompute/doc.go | 1 + .../hcsshim/internal/vmcompute/vmcompute.go | 91 +- .../internal/vmcompute/zsyscall_windows.go | 355 +- .../hcsshim/internal/wclayer/activatelayer.go | 4 +- .../internal/wclayer/baselayerreader.go | 216 + .../{baselayer.go => baselayerwriter.go} | 3 +- .../internal/wclayer/converttobaselayer.go | 158 + .../hcsshim/internal/wclayer/createlayer.go | 4 +- .../internal/wclayer/createscratchlayer.go | 4 +- .../internal/wclayer/deactivatelayer.go | 4 +- .../hcsshim/internal/wclayer/destroylayer.go | 4 +- .../Microsoft/hcsshim/internal/wclayer/doc.go | 4 + .../internal/wclayer/expandscratchsize.go | 4 +- .../hcsshim/internal/wclayer/exportlayer.go | 21 +- .../internal/wclayer/getlayermountpath.go | 4 +- .../internal/wclayer/getsharedbaseimages.go | 4 +- .../hcsshim/internal/wclayer/grantvmaccess.go | 4 +- .../hcsshim/internal/wclayer/importlayer.go | 9 +- .../hcsshim/internal/wclayer/layerexists.go | 4 +- .../hcsshim/internal/wclayer/layerid.go | 4 +- .../hcsshim/internal/wclayer/layerutils.go | 46 +- .../hcsshim/internal/wclayer/legacy.go | 26 +- .../hcsshim/internal/wclayer/nametoguid.go | 4 +- .../hcsshim/internal/wclayer/preparelayer.go | 4 +- .../hcsshim/internal/wclayer/processimage.go | 6 +- .../internal/wclayer/unpreparelayer.go | 4 +- .../hcsshim/internal/wclayer/wclayer.go | 7 +- .../internal/wclayer/zsyscall_windows.go | 285 +- .../hcsshim/internal/winapi/bindflt.go | 19 + .../hcsshim/internal/winapi/console.go | 2 + .../hcsshim/internal/winapi/devices.go | 2 + .../Microsoft/hcsshim/internal/winapi/doc.go | 3 + .../hcsshim/internal/winapi/elevation.go | 11 + .../hcsshim/internal/winapi/errors.go | 2 + .../hcsshim/internal/winapi/filesystem.go | 69 +- .../hcsshim/internal/winapi/jobobject.go | 44 +- .../hcsshim/internal/winapi/ofreg.go | 5 + .../Microsoft/hcsshim/internal/winapi/path.go | 1 + .../hcsshim/internal/winapi/process.go | 42 +- .../hcsshim/internal/winapi/system.go | 2 + .../hcsshim/internal/winapi/thread.go | 1 + .../Microsoft/hcsshim/internal/winapi/user.go | 194 + .../hcsshim/internal/winapi/utils.go | 4 +- .../hcsshim/internal/winapi/winapi.go | 4 +- .../internal/winapi/zsyscall_windows.go | 391 +- .../github.com/Microsoft/hcsshim/layer.go | 5 + .../hcsshim/osversion/osversion_windows.go | 11 +- .../hcsshim/osversion/windowsbuilds.go | 40 +- .../Microsoft/hcsshim/pkg/ociwclayer/doc.go | 3 + .../hcsshim/pkg/ociwclayer/export.go | 43 +- .../hcsshim/pkg/ociwclayer/import.go | 8 +- .../github.com/Microsoft/hcsshim/process.go | 2 + .../github.com/Microsoft/hcsshim/tools.go | 5 + .../Microsoft/hcsshim/zsyscall_windows.go | 7 +- .../antlr4/runtime/Go/antlr/{ => v4}/LICENSE | 0 .../antlr4/runtime/Go/antlr/v4/antlrdoc.go | 68 + .../antlr4/runtime/Go/antlr/{ => v4}/atn.go | 27 +- .../runtime/Go/antlr/{ => v4}/atn_config.go | 54 +- .../Go/antlr/{ => v4}/atn_config_set.go | 80 +- .../{ => v4}/atn_deserialization_options.go | 2 +- .../Go/antlr/{ => v4}/atn_deserializer.go | 2 +- .../Go/antlr/{ => v4}/atn_simulator.go | 2 +- .../runtime/Go/antlr/{ => v4}/atn_state.go | 9 +- .../runtime/Go/antlr/{ => v4}/atn_type.go | 2 +- .../runtime/Go/antlr/{ => v4}/char_stream.go | 2 +- .../Go/antlr/{ => v4}/common_token_factory.go | 2 +- .../Go/antlr/{ => v4}/common_token_stream.go | 6 +- .../antlr4/runtime/Go/antlr/v4/comparators.go | 147 + .../antlr4/runtime/Go/antlr/{ => v4}/dfa.go | 54 +- .../Go/antlr/{ => v4}/dfa_serializer.go | 2 +- .../runtime/Go/antlr/{ => v4}/dfa_state.go | 54 +- .../{ => v4}/diagnostic_error_listener.go | 4 +- .../Go/antlr/{ => v4}/error_listener.go | 6 +- .../Go/antlr/{ => v4}/error_strategy.go | 38 +- .../runtime/Go/antlr/{ => v4}/errors.go | 5 +- .../runtime/Go/antlr/{ => v4}/file_stream.go | 2 +- .../runtime/Go/antlr/{ => v4}/input_stream.go | 2 +- .../runtime/Go/antlr/{ => v4}/int_stream.go | 2 +- .../runtime/Go/antlr/{ => v4}/interval_set.go | 6 +- .../antlr4/runtime/Go/antlr/v4/jcollect.go | 198 + .../antlr4/runtime/Go/antlr/{ => v4}/lexer.go | 6 +- .../runtime/Go/antlr/{ => v4}/lexer_action.go | 44 +- .../antlr/{ => v4}/lexer_action_executor.go | 27 +- .../Go/antlr/{ => v4}/lexer_atn_simulator.go | 17 +- .../runtime/Go/antlr/{ => v4}/ll1_analyzer.go | 30 +- .../runtime/Go/antlr/{ => v4}/parser.go | 14 +- .../Go/antlr/{ => v4}/parser_atn_simulator.go | 153 +- .../Go/antlr/{ => v4}/parser_rule_context.go | 4 +- .../Go/antlr/{ => v4}/prediction_context.go | 161 +- .../Go/antlr/{ => v4}/prediction_mode.go | 48 +- .../runtime/Go/antlr/{ => v4}/recognizer.go | 19 +- .../runtime/Go/antlr/{ => v4}/rule_context.go | 2 +- .../Go/antlr/{ => v4}/semantic_context.go | 81 +- .../antlr4/runtime/Go/antlr/{ => v4}/token.go | 3 +- .../runtime/Go/antlr/{ => v4}/token_source.go | 2 +- .../runtime/Go/antlr/{ => v4}/token_stream.go | 2 +- .../Go/antlr/{ => v4}/tokenstream_rewriter.go | 420 +- .../Go/antlr/{ => v4}/trace_listener.go | 2 +- .../runtime/Go/antlr/{ => v4}/transition.go | 2 +- .../antlr4/runtime/Go/antlr/{ => v4}/tree.go | 5 +- .../antlr4/runtime/Go/antlr/{ => v4}/trees.go | 9 +- .../antlr4/runtime/Go/antlr/{ => v4}/utils.go | 21 +- .../runtime/Go/antlr/{ => v4}/utils_set.go | 34 +- .../asaskevich/govalidator/validator.go | 33 +- .../cenkalti/backoff/v4/.travis.yml | 10 - .../github.com/cenkalti/backoff/v4/retry.go | 50 +- .../github.com/cespare/xxhash/v2/README.md | 31 +- .../github.com/cespare/xxhash/v2/testall.sh | 10 + .../github.com/cespare/xxhash/v2/xxhash.go | 47 +- .../cespare/xxhash/v2/xxhash_amd64.s | 336 +- .../cespare/xxhash/v2/xxhash_arm64.s | 183 + .../v2/{xxhash_amd64.go => xxhash_asm.go} | 2 + .../cespare/xxhash/v2/xxhash_other.go | 22 +- .../cespare/xxhash/v2/xxhash_safe.go | 1 + .../cespare/xxhash/v2/xxhash_unsafe.go | 3 +- .../containerd/api/events/container.pb.go | 431 + .../containerd/api/events/container.proto | 46 + .../api/events/container_fieldpath.pb.go | 95 + .../containerd/api/events/content.pb.go | 168 + .../containerd/api/events/content.proto | 28 + .../api/events/content_fieldpath.pb.go | 16 + .../containerd/containerd/api/events/doc.go | 19 + .../containerd/api/events/image.pb.go | 330 + .../containerd/api/events/image.proto | 38 + .../api/events/image_fieldpath.pb.go | 62 + .../containerd/api/events/namespace.pb.go | 330 + .../containerd/api/events/namespace.proto | 38 + .../api/events/namespace_fieldpath.pb.go | 62 + .../containerd/api/events/snapshot.pb.go | 342 + .../containerd/api/events/snapshot.proto | 41 + .../api/events/snapshot_fieldpath.pb.go | 52 + .../containerd/api/events/task.pb.go | 1020 + .../containerd/api/events/task.proto | 93 + .../api/events/task_fieldpath.pb.go | 191 + .../containerd/api/runtime/sandbox/v1/doc.go | 17 + .../api/runtime/sandbox/v1/sandbox.pb.go | 1480 + .../api/runtime/sandbox/v1/sandbox.proto | 136 + .../api/runtime/sandbox/v1/sandbox_grpc.pb.go | 377 + .../runtime/sandbox/v1/sandbox_ttrpc.pb.go | 156 + .../containerd/api/types/descriptor.pb.go | 206 + .../containerd/api/types/descriptor.proto | 33 + .../types/doc.go} | 2 + .../containerd/api/types/metrics.pb.go | 194 + .../containerd/api/types/metrics.proto | 30 + .../containerd/api/types/mount.pb.go | 202 + .../containerd/api/types/mount.proto | 43 + .../containerd/api/types/platform.pb.go | 184 + .../containerd/api/types/platform.proto | 29 + .../containerd/api/types/sandbox.pb.go | 346 + .../containerd/api/types/sandbox.proto | 51 + .../compression/compression_fuzzer.go} | 18 +- .../link_default.go} | 12 +- .../containerd/archive/link_freebsd.go | 82 + .../containerd/containerd/archive/tar.go | 97 +- .../containerd/archive/tar_mostunix.go | 1 - .../containerd/containerd/archive/tar_opts.go | 26 + .../containerd/containerd/archive/tar_unix.go | 8 +- .../containerd/archive/tar_windows.go | 29 +- .../containerd/archive/tarheader/tarheader.go | 82 + .../archive/tarheader/tarheader_unix.go | 59 + .../containerd/archive/time_unix.go | 1 - .../containerd/archive/time_windows.go | 15 +- .../containerd/containers/containers.go | 13 +- .../containerd/containerd/content/content.go | 69 +- .../containerd/containerd/content/helpers.go | 86 +- .../content/local/content_local_fuzzer.go | 76 + .../containerd/content/local/readerat.go | 5 + .../containerd/content/local/store.go | 14 +- .../containerd/content/local/store_bsd.go | 1 - .../containerd/content/local/store_openbsd.go | 1 - .../containerd/content/local/store_unix.go | 1 - .../fds.go => content/local/test_helper.go} | 27 +- .../containerd/containerd/events/events.go | 80 + .../containerd/containerd/filters/filter.go | 1 - .../containerd/containerd/filters/parser.go | 1 - .../containerd/containerd/filters/quote.go | 8 +- .../containerd/containerd/images/image.go | 4 +- .../containerd/images/mediatypes.go | 31 +- .../containerd/containerd/labels/labels.go | 8 + .../containerd/containerd/labels/validate.go | 11 +- .../containerd/containerd/leases/id.go | 2 +- .../containerd/containerd/leases/lease.go | 9 +- .../containerd/containerd/log/context.go | 3 + .../containerd/metadata/adaptors.go | 18 + .../containerd/metadata/boltutil/helpers.go | 28 +- .../containerd/containerd/metadata/buckets.go | 162 +- .../containerd/metadata/containers.go | 13 +- .../containerd/containerd/metadata/content.go | 29 +- .../containerd/containerd/metadata/db.go | 126 +- .../containerd/containerd/metadata/gc.go | 261 +- .../containerd/containerd/metadata/images.go | 17 +- .../containerd/containerd/metadata/sandbox.go | 373 + .../containerd/metadata/snapshot.go | 42 +- .../containerd/mount/fmountat_linux.go | 145 - .../containerd/mount/lookup_unix.go | 1 - .../containerd/mount/lookup_unsupported.go | 1 - .../containerd/mount/losetup_linux.go | 28 +- .../containerd/containerd/mount/mount.go | 39 +- .../containerd/mount/mount_freebsd.go | 15 +- .../containerd/mount/mount_linux.go | 40 +- .../containerd/containerd/mount/mount_unix.go | 57 +- .../containerd/mount/mount_unsupported.go | 46 + .../containerd/mount/mount_windows.go | 18 +- .../containerd/containerd/mount/temp.go | 2 +- .../containerd/containerd/mount/temp_unix.go | 1 - .../containerd/mount/temp_unsupported.go | 1 - .../containerd/containerd/namespaces/store.go | 2 - .../containerd/pkg/cleanup/context.go | 52 + .../containerd/pkg/epoch/context.go | 41 + .../containerd/containerd/pkg/epoch/epoch.go | 69 + .../containerd/pkg/randutil/randutil.go | 48 + .../pkg/userns/userns_unsupported.go | 1 - .../containerd/platforms/cpuinfo.go | 98 +- .../containerd/platforms/cpuinfo_linux.go | 161 + .../containerd/platforms/cpuinfo_other.go | 59 + .../containerd/platforms/database.go | 7 - .../containerd/platforms/defaults_darwin.go | 1 - .../containerd/platforms/defaults_freebsd.go | 43 + .../containerd/platforms/defaults_unix.go | 3 +- .../containerd/platforms/defaults_windows.go | 40 +- .../containerd/platforms/platforms.go | 49 +- .../platforms/platforms_other.go} | 20 +- .../containerd/platforms/platforms_windows.go | 34 + .../containerd/containerd/protobuf/any.go | 47 + .../socket_windows.go => protobuf/compare.go} | 31 +- .../containerd/protobuf/plugin/doc.go | 17 + .../protobuf/plugin/fieldpath.pb.go | 144 + .../protobuf/plugin/fieldpath.proto} | 27 +- .../protobuf/proto/proto.go} | 24 +- .../containerd/protobuf/timestamp.go | 36 + .../protobuf/types/types.go} | 24 +- .../containerd/reference/docker/helpers.go | 58 + .../containerd/reference/docker/normalize.go | 196 + .../containerd/reference/docker/reference.go | 453 + .../containerd/reference/docker/regexp.go | 191 + .../containerd/reference/docker/sort.go | 73 + .../containerd/remotes/docker/auth/fetch.go | 9 +- .../containerd/remotes/docker/authorizer.go | 10 +- .../remotes/docker/converter_fuzz.go | 55 + .../containerd/remotes/docker/fetcher.go | 108 +- .../containerd/remotes/docker/fetcher_fuzz.go | 81 + .../containerd/remotes/docker/handler.go | 7 +- .../containerd/remotes/docker/pusher.go | 166 +- .../containerd/remotes/docker/resolver.go | 79 +- .../remotes/docker/schema1/converter.go | 12 +- .../containerd/remotes/errors/errors.go | 2 +- .../containerd/containerd/remotes/handlers.go | 73 +- .../containerd/containerd/remotes/resolver.go | 16 +- .../containerd/containerd/sandbox/bridge.go | 77 + .../containerd/sandbox/controller.go | 125 + .../containerd/containerd/sandbox/helpers.go | 68 + .../containerd/containerd/sandbox/store.go | 116 + .../containerd/snapshots/snapshotter.go | 68 +- .../containerd/containerd/sys/epoll.go | 34 - .../containerd/containerd/sys/filesys_unix.go | 32 - .../containerd/sys/filesys_windows.go | 345 - .../containerd/containerd/sys/oom_linux.go | 82 - .../containerd/sys/oom_unsupported.go | 49 - .../containerd/containerd/sys/socket_unix.go | 81 - .../containerd/containerd/tracing/helpers.go | 94 + .../containerd/containerd/tracing/log.go | 66 + .../containerd/containerd/tracing/tracing.go | 117 + .../containerd/containerd/version/version.go | 2 +- .../github.com/containerd/continuity/AUTHORS | 12 +- .../containerd/continuity/fs/copy.go | 16 +- .../continuity/fs/copy_irregular_freebsd.go | 36 + .../continuity/fs/copy_irregular_unix.go | 40 + .../containerd/continuity/fs/copy_linux.go | 9 - .../containerd/continuity/fs/copy_windows.go | 4 +- .../containerd/continuity/fs/diff.go | 3 +- .../containerd/continuity/fs/dtype_linux.go | 2 +- .../containerd/continuity/sysx/generate.sh | 52 - .../stargz-snapshotter/estargz/build.go | 58 +- .../stargz-snapshotter/estargz/estargz.go | 17 +- .../stargz-snapshotter/estargz/gzip.go | 7 +- .../stargz-snapshotter/estargz/testutil.go | 80 +- .../stargz-snapshotter/estargz/types.go | 3 +- .../containerd/ttrpc/.gitattributes | 1 + .../github.com/containerd/ttrpc/.gitignore | 2 + .../github.com/containerd/ttrpc/.golangci.yml | 54 + .../github.com/containerd/ttrpc/Makefile | 180 + .../github.com/containerd/ttrpc/PROTOCOL.md | 240 + .../containerd/ttrpc/Protobuild.toml | 28 + .../github.com/containerd/ttrpc/README.md | 9 +- .../github.com/containerd/ttrpc/channel.go | 47 +- .../github.com/containerd/ttrpc/client.go | 506 +- .../github.com/containerd/ttrpc/codec.go | 2 +- .../vendor/github.com/containerd/ttrpc/doc.go | 23 + .../github.com/containerd/ttrpc/errors.go | 34 + .../github.com/containerd/ttrpc/handshake.go | 2 +- .../containerd/ttrpc/interceptor.go | 17 +- .../github.com/containerd/ttrpc/request.pb.go | 396 + .../github.com/containerd/ttrpc/request.proto | 29 + .../github.com/containerd/ttrpc/server.go | 311 +- .../github.com/containerd/ttrpc/services.go | 201 +- .../github.com/containerd/ttrpc/stream.go | 81 + .../containerd/ttrpc/stream_server.go | 22 + .../github.com/containerd/ttrpc/test.proto | 16 + .../github.com/containerd/ttrpc/types.go | 63 - .../containerd/ttrpc/unixcreds_linux.go | 8 +- .../containerd/typeurl/v2/.gitignore | 2 + .../github.com/containerd/typeurl/v2/LICENSE | 191 + .../containerd/typeurl/v2/README.md | 20 + .../github.com/containerd/typeurl/v2/doc.go | 83 + .../github.com/containerd/typeurl/v2/types.go | 273 + .../docker/distribution/.dockerignore | 1 + .../docker/distribution/.golangci.yml | 7 + .../github.com/docker/distribution/.mailmap | 6 +- .../github.com/docker/distribution/Dockerfile | 78 +- .../github.com/docker/distribution/Makefile | 2 +- .../docker/distribution/docker-bake.hcl | 21 +- .../distribution/reference/reference.go | 4 +- .../registry/api/v2/descriptors.go | 17 + .../distribution/registry/api/v2/errors.go | 9 + .../distribution/registry/client/errors.go | 2 + .../registry/client/repository.go | 4 +- .../registry/client/transport/http_reader.go | 1 - .../docker/docker/api/types/filters/parse.go | 8 +- .../docker/api/types/registry/registry.go | 49 +- .../docker/docker/pkg/ioutils/fswriters.go | 5 +- .../docker/docker/pkg/ioutils/temp_unix.go | 6 +- .../docker/docker/pkg/ioutils/temp_windows.go | 6 +- .../docker/docker/registry/endpoint_v1.go | 4 +- .../docker/docker/registry/registry.go | 7 +- .../docker/docker/registry/service_v2.go | 7 +- .../emicklei/go-restful/v3/CHANGES.md | 15 +- .../emicklei/go-restful/v3/constants.go | 2 + .../emicklei/go-restful/v3/request.go | 5 +- .../emicklei/go-restful/v3/response.go | 3 + .../emicklei/go-restful/v3/route.go | 4 +- .../emicklei/go-restful/v3/route_builder.go | 12 +- .../github.com/go-gorp/gorp/v3/.travis.yml | 4 +- .../github.com/go-gorp/gorp/v3/README.md | 7 +- .../github.com/go-gorp/gorp/v3/logging.go | 11 +- .../github.com/go-gorp/gorp/v3/test_all.sh | 32 +- .../github.com/go-logr/logr/.golangci.yaml | 3 - .../vendor/github.com/go-logr/logr/discard.go | 32 +- .../github.com/go-logr/logr/funcr/funcr.go | 27 +- tools/vendor/github.com/go-logr/logr/logr.go | 166 +- .../jsonreference/internal/normalize_url.go | 5 + .../github.com/gogo/protobuf/types/any.go | 140 - .../github.com/gogo/protobuf/types/any.pb.go | 694 - .../github.com/gogo/protobuf/types/api.pb.go | 2134 - .../gogo/protobuf/types/duration.go | 100 - .../gogo/protobuf/types/duration.pb.go | 517 - .../gogo/protobuf/types/duration_gogo.go | 100 - .../gogo/protobuf/types/empty.pb.go | 462 - .../gogo/protobuf/types/field_mask.pb.go | 738 - .../gogo/protobuf/types/protosize.go | 34 - .../gogo/protobuf/types/source_context.pb.go | 524 - .../gogo/protobuf/types/struct.pb.go | 2271 - .../gogo/protobuf/types/timestamp.go | 130 - .../gogo/protobuf/types/timestamp.pb.go | 539 - .../gogo/protobuf/types/timestamp_gogo.go | 94 - .../github.com/gogo/protobuf/types/type.pb.go | 3355 - .../gogo/protobuf/types/wrappers.pb.go | 2703 - .../gogo/protobuf/types/wrappers_gogo.go | 300 - .../migrate/v4/source/driver.go | 28 +- .../migrate/v4/source/errors.go | 15 + .../migrate/v4/source/file/file.go | 105 +- .../migrate/v4/source/iofs/README.md | 3 + .../migrate/v4/source/iofs/doc.go | 10 + .../migrate/v4/source/iofs/iofs.go | 176 + .../testdata/migrations/1_foobar.down.sql | 1 + .../iofs/testdata/migrations/1_foobar.up.sql | 1 + .../iofs/testdata/migrations/3_foobar.up.sql | 1 + .../testdata/migrations/4_foobar.down.sql | 1 + .../iofs/testdata/migrations/4_foobar.up.sql | 1 + .../testdata/migrations/5_foobar.down.sql | 1 + .../testdata/migrations/7_foobar.down.sql | 1 + .../iofs/testdata/migrations/7_foobar.up.sql | 1 + .../migrate/v4/source/migration.go | 18 +- .../golang-migrate/migrate/v4/source/parse.go | 5 +- .../github.com/google/cel-go/cel/BUILD.bazel | 5 +- .../github.com/google/cel-go/cel/decls.go | 79 +- .../github.com/google/cel-go/cel/env.go | 126 +- .../vendor/github.com/google/cel-go/cel/io.go | 4 +- .../github.com/google/cel-go/cel/library.go | 258 + .../github.com/google/cel-go/cel/macro.go | 14 +- .../github.com/google/cel-go/cel/options.go | 64 +- .../github.com/google/cel-go/cel/program.go | 114 +- .../google/cel-go/checker/BUILD.bazel | 4 +- .../google/cel-go/checker/checker.go | 139 +- .../github.com/google/cel-go/checker/cost.go | 57 +- .../google/cel-go/checker/decls/BUILD.bazel | 2 +- .../google/cel-go/checker/decls/decls.go | 8 +- .../github.com/google/cel-go/checker/env.go | 27 +- .../google/cel-go/checker/printer.go | 2 +- .../google/cel-go/checker/standard.go | 2 + .../github.com/google/cel-go/checker/types.go | 47 +- .../google/cel-go/common/BUILD.bazel | 2 +- .../cel-go/common/containers/BUILD.bazel | 4 +- .../google/cel-go/common/debug/BUILD.bazel | 2 +- .../google/cel-go/common/debug/debug.go | 14 +- .../github.com/google/cel-go/common/errors.go | 2 +- .../cel-go/common/operators/operators.go | 4 + .../cel-go/common/overloads/overloads.go | 10 + .../google/cel-go/common/types/BUILD.bazel | 10 +- .../google/cel-go/common/types/bool.go | 9 +- .../google/cel-go/common/types/bytes.go | 9 +- .../google/cel-go/common/types/double.go | 13 +- .../google/cel-go/common/types/duration.go | 17 +- .../google/cel-go/common/types/err.go | 25 +- .../google/cel-go/common/types/int.go | 23 +- .../google/cel-go/common/types/iterator.go | 4 +- .../google/cel-go/common/types/json_value.go | 1 + .../google/cel-go/common/types/list.go | 88 +- .../google/cel-go/common/types/map.go | 59 +- .../google/cel-go/common/types/null.go | 26 +- .../google/cel-go/common/types/object.go | 14 +- .../google/cel-go/common/types/optional.go | 108 + .../google/cel-go/common/types/pb/BUILD.bazel | 2 +- .../google/cel-go/common/types/pb/enum.go | 4 +- .../google/cel-go/common/types/pb/file.go | 83 +- .../google/cel-go/common/types/pb/pb.go | 53 +- .../google/cel-go/common/types/pb/type.go | 66 +- .../google/cel-go/common/types/provider.go | 30 +- .../cel-go/common/types/ref/BUILD.bazel | 2 +- .../cel-go/common/types/ref/provider.go | 8 +- .../cel-go/common/types/ref/reference.go | 15 +- .../google/cel-go/common/types/string.go | 9 +- .../google/cel-go/common/types/timestamp.go | 19 +- .../cel-go/common/types/traits/BUILD.bazel | 1 + .../types/traits/zeroer.go} | 26 +- .../google/cel-go/common/types/type.go | 4 +- .../google/cel-go/common/types/uint.go | 21 +- .../google/cel-go/common/types/unknown.go | 4 +- .../github.com/google/cel-go/ext/BUILD.bazel | 32 + .../github.com/google/cel-go/ext/README.md | 205 + .../github.com/google/cel-go/ext/bindings.go | 100 + .../github.com/google/cel-go/ext/encoders.go | 18 +- .../github.com/google/cel-go/ext/guards.go | 13 + .../github.com/google/cel-go/ext/math.go | 388 + .../github.com/google/cel-go/ext/native.go | 574 + .../github.com/google/cel-go/ext/protos.go | 145 + .../github.com/google/cel-go/ext/sets.go | 138 + .../github.com/google/cel-go/ext/strings.go | 776 +- .../google/cel-go/interpreter/BUILD.bazel | 7 +- .../google/cel-go/interpreter/activation.go | 30 +- .../cel-go/interpreter/attribute_patterns.go | 77 +- .../google/cel-go/interpreter/attributes.go | 1064 +- .../google/cel-go/interpreter/decorators.go | 11 +- .../google/cel-go/interpreter/formatting.go | 383 + .../cel-go/interpreter/functions/functions.go | 2 +- .../cel-go/interpreter/interpretable.go | 469 +- .../google/cel-go/interpreter/interpreter.go | 12 +- .../google/cel-go/interpreter/planner.go | 178 +- .../google/cel-go/interpreter/prune.go | 373 +- .../google/cel-go/interpreter/runtimecost.go | 58 +- .../google/cel-go/parser/BUILD.bazel | 8 +- .../google/cel-go/parser/gen/BUILD.bazel | 2 +- .../google/cel-go/parser/gen/CEL.g4 | 38 +- .../google/cel-go/parser/gen/CEL.interp | 5 +- .../cel-go/parser/gen/cel_base_listener.go | 48 +- .../cel-go/parser/gen/cel_base_visitor.go | 28 +- .../google/cel-go/parser/gen/cel_lexer.go | 4 +- .../google/cel-go/parser/gen/cel_listener.go | 48 +- .../google/cel-go/parser/gen/cel_parser.go | 2108 +- .../google/cel-go/parser/gen/cel_visitor.go | 26 +- .../google/cel-go/parser/gen/generate.sh | 2 +- .../github.com/google/cel-go/parser/helper.go | 179 +- .../github.com/google/cel-go/parser/input.go | 3 +- .../github.com/google/cel-go/parser/macro.go | 20 +- .../google/cel-go/parser/options.go | 25 +- .../github.com/google/cel-go/parser/parser.go | 479 +- .../google/cel-go/parser/unparser.go | 63 +- .../github.com/google/gnostic-models/LICENSE | 203 + .../google/gnostic-models/compiler/README.md | 4 + .../google/gnostic-models/compiler/context.go | 49 + .../google/gnostic-models/compiler/error.go | 70 + .../gnostic-models/compiler/extensions.go | 86 + .../google/gnostic-models/compiler/helpers.go | 397 + .../google/gnostic-models/compiler/main.go} | 8 +- .../google/gnostic-models/compiler/reader.go | 307 + .../gnostic-models/extensions/README.md | 13 + .../gnostic-models/extensions/extension.pb.go | 461 + .../gnostic-models/extensions/extension.proto | 97 + .../gnostic-models/extensions/extensions.go | 64 + .../gnostic-models/jsonschema/README.md | 4 + .../google/gnostic-models/jsonschema/base.go | 97 + .../gnostic-models/jsonschema/display.go | 229 + .../gnostic-models/jsonschema/models.go | 228 + .../gnostic-models/jsonschema/operations.go | 394 + .../gnostic-models/jsonschema/reader.go | 442 + .../gnostic-models/jsonschema/schema.json | 150 + .../gnostic-models/jsonschema/writer.go | 369 + .../gnostic-models/openapiv2/OpenAPIv2.go | 8820 +++ .../gnostic-models/openapiv2/OpenAPIv2.pb.go | 7342 ++ .../gnostic-models/openapiv2/OpenAPIv2.proto | 666 + .../google/gnostic-models/openapiv2/README.md | 14 + .../gnostic-models/openapiv2/document.go | 42 + .../gnostic-models/openapiv2/openapi-2.0.json | 1610 + .../openapiv3/OpenAPIv3.go | 9 +- .../openapiv3/OpenAPIv3.pb.go | 13 +- .../openapiv3/OpenAPIv3.proto | 2 +- .../openapiv3/README.md | 4 - .../openapiv3/document.go | 2 +- .../gnostic/openapiv3/annotations.pb.go | 183 - .../gnostic/openapiv3/annotations.proto | 60 - .../google/gnostic/openapiv3/openapi-3.0.json | 1251 - .../google/gnostic/openapiv3/openapi-3.1.json | 1250 - .../internal/compression/compression.go | 97 + .../internal/estargz/estargz.go | 9 +- .../go-containerregistry/internal/gzip/zip.go | 36 +- .../internal/redact/redact.go | 54 + .../internal/retry/retry.go | 19 +- .../internal/windows/windows.go | 3 +- .../internal/zstd/zstd.go | 116 + .../go-containerregistry/pkg/authn/README.md | 6 +- .../go-containerregistry/pkg/authn/authn.go | 87 +- .../pkg/authn/keychain.go | 54 +- .../pkg/compression/compression.go | 26 + .../go-containerregistry/pkg/crane/append.go | 28 +- .../go-containerregistry/pkg/crane/filemap.go | 7 +- .../go-containerregistry/pkg/crane/options.go | 11 + .../go-containerregistry/pkg/crane/pull.go | 7 +- .../pkg/legacy/tarball/write.go | 8 +- .../go-containerregistry/pkg/logs/logs.go | 12 +- .../go-containerregistry/pkg/name/digest.go | 27 +- .../go-containerregistry/pkg/name/errors.go | 8 +- .../go-containerregistry/pkg/name/ref.go | 14 +- .../go-containerregistry/pkg/v1/config.go | 7 +- .../pkg/v1/layout/blob.go | 3 +- .../pkg/v1/layout/index.go | 4 +- .../pkg/v1/layout/options.go | 14 + .../pkg/v1/layout/write.go | 165 +- .../pkg/v1/match/match.go | 4 +- .../pkg/v1/mutate/image.go | 9 +- .../pkg/v1/mutate/index.go | 9 +- .../pkg/v1/mutate/mutate.go | 73 +- .../pkg/v1/partial/compressed.go | 21 +- .../pkg/v1/partial/with.go | 22 +- .../go-containerregistry/pkg/v1/platform.go | 54 +- .../pkg/v1/remote/check.go | 23 +- .../pkg/v1/remote/descriptor.go | 10 +- .../pkg/v1/remote/image.go | 5 +- .../pkg/v1/remote/index.go | 6 +- .../pkg/v1/remote/mount.go | 13 + .../pkg/v1/remote/multi_write.go | 19 +- .../pkg/v1/remote/options.go | 39 +- .../pkg/v1/remote/progress.go | 69 + .../pkg/v1/remote/transport/bearer.go | 43 +- .../pkg/v1/remote/transport/error.go | 48 +- .../pkg/v1/remote/transport/ping.go | 206 +- .../pkg/v1/remote/transport/retry.go | 24 +- .../pkg/v1/remote/transport/transport.go | 20 +- .../pkg/v1/remote/write.go | 208 +- .../pkg/v1/stream/layer.go | 171 +- .../pkg/v1/tarball/image.go | 14 +- .../pkg/v1/tarball/layer.go | 117 +- .../pkg/v1/tarball/write.go | 6 + .../pkg/v1/types/types.go | 2 + .../pkg/v1/zz_deepcopy_generated.go | 1 + .../github.com/hashicorp/errwrap/LICENSE | 354 + .../github.com/hashicorp/errwrap/README.md | 89 + .../github.com/hashicorp/errwrap/errwrap.go | 178 + .../hashicorp/go-multierror/LICENSE | 353 + .../hashicorp/go-multierror/Makefile | 31 + .../hashicorp/go-multierror/README.md | 150 + .../hashicorp/go-multierror/append.go | 43 + .../hashicorp/go-multierror/flatten.go | 26 + .../hashicorp/go-multierror/format.go | 27 + .../hashicorp/go-multierror/group.go | 38 + .../hashicorp/go-multierror/multierror.go | 121 + .../hashicorp/go-multierror/prefix.go | 37 + .../hashicorp/go-multierror/sort.go | 16 + .../github.com/huandu/xstrings/.travis.yml | 7 - .../github.com/huandu/xstrings/README.md | 182 +- .../github.com/huandu/xstrings/convert.go | 75 +- .../github.com/huandu/xstrings/format.go | 28 +- .../github.com/huandu/xstrings/manipulate.go | 12 +- .../huandu/xstrings/stringbuilder.go | 3 +- .../huandu/xstrings/stringbuilder_go110.go | 3 +- .../github.com/huandu/xstrings/translate.go | 52 +- .../github.com/klauspost/compress/.gitignore | 7 + .../klauspost/compress/.goreleaser.yml | 2 +- .../github.com/klauspost/compress/README.md | 196 +- .../klauspost/compress/fse/compress.go | 31 +- .../klauspost/compress/fse/decompress.go | 4 +- .../klauspost/compress/huff0/bitreader.go | 130 +- .../klauspost/compress/huff0/bitwriter.go | 125 +- .../klauspost/compress/huff0/bytereader.go | 10 - .../klauspost/compress/huff0/compress.go | 127 +- .../klauspost/compress/huff0/decompress.go | 622 +- .../compress/huff0/decompress_amd64.go | 226 + .../compress/huff0/decompress_amd64.s | 830 + .../compress/huff0/decompress_generic.go | 299 + .../klauspost/compress/huff0/huff0.go | 2 + .../compress/internal/cpuinfo/cpuinfo.go | 34 + .../internal/cpuinfo/cpuinfo_amd64.go | 11 + .../compress/internal/cpuinfo/cpuinfo_amd64.s | 36 + .../compress/internal/snapref/encode_other.go | 28 +- .../klauspost/compress/zstd/README.md | 172 +- .../klauspost/compress/zstd/bitreader.go | 11 +- .../klauspost/compress/zstd/bitwriter.go | 76 - .../klauspost/compress/zstd/blockdec.go | 524 +- .../klauspost/compress/zstd/blockenc.go | 9 +- .../klauspost/compress/zstd/bytebuf.go | 27 +- .../klauspost/compress/zstd/bytereader.go | 6 - .../klauspost/compress/zstd/decodeheader.go | 93 +- .../klauspost/compress/zstd/decoder.go | 685 +- .../compress/zstd/decoder_options.go | 103 +- .../klauspost/compress/zstd/dict.go | 51 +- .../klauspost/compress/zstd/enc_base.go | 28 +- .../klauspost/compress/zstd/enc_best.go | 264 +- .../klauspost/compress/zstd/enc_better.go | 43 +- .../klauspost/compress/zstd/enc_dfast.go | 33 +- .../klauspost/compress/zstd/enc_fast.go | 24 +- .../klauspost/compress/zstd/encoder.go | 151 +- .../compress/zstd/encoder_options.go | 53 +- .../klauspost/compress/zstd/framedec.go | 334 +- .../klauspost/compress/zstd/fse_decoder.go | 128 +- .../compress/zstd/fse_decoder_amd64.go | 65 + .../compress/zstd/fse_decoder_amd64.s | 126 + .../compress/zstd/fse_decoder_generic.go | 72 + .../klauspost/compress/zstd/fse_encoder.go | 23 - .../klauspost/compress/zstd/hash.go | 6 - .../klauspost/compress/zstd/history.go | 67 +- .../compress/zstd/internal/xxhash/README.md | 49 +- .../compress/zstd/internal/xxhash/xxhash.go | 47 +- .../zstd/internal/xxhash/xxhash_amd64.s | 337 +- .../zstd/internal/xxhash/xxhash_arm64.s | 165 +- .../zstd/internal/xxhash/xxhash_asm.go | 5 +- .../zstd/internal/xxhash/xxhash_other.go | 23 +- .../klauspost/compress/zstd/seqdec.go | 326 +- .../klauspost/compress/zstd/seqdec_amd64.go | 394 + .../klauspost/compress/zstd/seqdec_amd64.s | 4175 ++ .../klauspost/compress/zstd/seqdec_generic.go | 237 + .../github.com/klauspost/compress/zstd/zip.go | 69 +- .../klauspost/compress/zstd/zstd.go | 55 +- .../github.com/mattn/go-sqlite3/README.md | 16 +- .../mattn/go-sqlite3/sqlite3-binding.c | 9473 ++- .../mattn/go-sqlite3/sqlite3-binding.h | 42 +- .../github.com/mattn/go-sqlite3/sqlite3.go | 6 +- .../go-sqlite3/sqlite3_opt_math_functions.go | 14 + .../mattn/go-sqlite3/sqlite3_opt_os_trace.go | 15 + .../mattn/go-sqlite3/sqlite3_windows.go | 1 - .../github.com/mattn/go-sqlite3/sqlite3ext.h | 12 + .../moby/sys/mountinfo/mounted_linux.go | 58 +- .../moby/sys/mountinfo/mounted_unix.go | 11 +- .../moby/sys/mountinfo/mountinfo.go | 6 +- .../moby/sys/mountinfo/mountinfo_bsd.go | 44 +- .../sys/mountinfo/mountinfo_freebsdlike.go | 14 + .../moby/sys/mountinfo/mountinfo_openbsd.go | 11 + .../sys/mountinfo/mountinfo_unsupported.go | 4 +- .../moby/sys/sequential}/LICENSE | 0 .../github.com/moby/sys/sequential/doc.go | 15 + .../moby/sys/sequential/sequential_unix.go | 45 + .../moby/sys/sequential/sequential_windows.go | 161 + tools/vendor/github.com/moby/term/doc.go | 3 + tools/vendor/github.com/moby/term/tc.go | 20 - tools/vendor/github.com/moby/term/term.go | 101 +- .../vendor/github.com/moby/term/term_unix.go | 98 + .../github.com/moby/term/term_windows.go | 99 +- .../moby/term/{termios.go => termios_unix.go} | 13 +- .../github.com/moby/term/termios_windows.go | 37 + .../moby/term/windows/ansi_reader.go | 4 +- .../github.com/moby/term/windows/console.go | 7 +- tools/vendor/github.com/moby/term/winsize.go | 21 - .../olekukonko/tablewriter/.gitignore | 15 - .../olekukonko/tablewriter/.travis.yml | 22 - .../olekukonko/tablewriter/LICENSE.md | 19 - .../olekukonko/tablewriter/README.md | 431 - .../github.com/olekukonko/tablewriter/csv.go | 52 - .../olekukonko/tablewriter/table.go | 967 - .../tablewriter/table_with_color.go | 136 - .../github.com/olekukonko/tablewriter/util.go | 93 - .../github.com/olekukonko/tablewriter/wrap.go | 99 - .../image-spec/specs-go/v1/config.go | 9 + .../image-spec/specs-go/version.go | 2 +- .../ansible-operator-plugins/LICENSE | 201 + .../internal/version/version.go | 32 + .../pkg}/plugins/ansible/v1/api.go | 4 +- .../plugins/ansible/v1/constants/constants.go | 0 .../pkg}/plugins/ansible/v1/init.go | 6 +- .../pkg}/plugins/ansible/v1/plugin.go | 2 +- .../pkg}/plugins/ansible/v1/scaffolds/api.go | 14 +- .../pkg}/plugins/ansible/v1/scaffolds/init.go | 18 +- .../internal/templates/config/crd/crd.go | 0 .../templates/config/crd/kustomization.go | 0 .../internal/templates/config/rbac/role.go | 0 .../config/testing/debug_logs_patch.go | 0 .../templates/config/testing/kustomization.go | 0 .../templates/config/testing/manager_image.go | 0 .../testing/pullpolicy/always_pull_patch.go | 0 .../pullpolicy/ifnotpresent_pull_patch.go | 0 .../testing/pullpolicy/never_pull_patch.go | 0 .../internal/templates/dockerfile.go | 2 +- .../scaffolds/internal/templates/gitignore.go | 0 .../scaffolds/internal/templates/makefile.go | 2 +- .../templates/molecule/mdefault/converge.go | 0 .../templates/molecule/mdefault/create.go | 0 .../templates/molecule/mdefault/destroy.go | 0 .../templates/molecule/mdefault/kustomize.go | 0 .../templates/molecule/mdefault/molecule.go | 9 - .../templates/molecule/mdefault/prepare.go | 0 .../molecule/mdefault/tasks_test_resource.go | 0 .../templates/molecule/mdefault/verify.go | 0 .../templates/molecule/mkind/converge.go | 0 .../templates/molecule/mkind/create.go | 0 .../templates/molecule/mkind/destroy.go | 0 .../templates/molecule/mkind/molecule.go | 9 - .../templates/playbooks/placeholder.go | 0 .../internal/templates/playbooks/playbook.go | 0 .../internal/templates/requirements.go | 4 +- .../internal/templates/roles/defaults_main.go | 2 +- .../internal/templates/roles/files_dir.go | 2 +- .../internal/templates/roles/handlers_main.go | 2 +- .../internal/templates/roles/meta_main.go | 2 +- .../internal/templates/roles/placeholder.go | 0 .../internal/templates/roles/readme.go | 2 +- .../internal/templates/roles/tasks_main.go | 2 +- .../internal/templates/roles/templates_dir.go | 2 +- .../internal/templates/roles/vars_main.go | 2 +- .../scaffolds/internal/templates/watches.go | 0 .../pkg/plugins/plugins.go | 19 + .../pkg/plugins/util/cleanup.go | 208 + .../pkg/plugins/util/message.go | 20 + .../v1alpha1/clusterserviceversion_types.go | 44 +- .../operators/v1alpha1/installplan_types.go | 3 + .../operators/v1alpha1/subscription_types.go | 6 + .../api/pkg/validation/internal/multiarch.go | 409 +- .../operator-registry/alpha/action/migrate.go | 52 +- .../operator-registry/alpha/action/render.go | 27 +- .../alpha/declcfg/declcfg.go | 90 +- .../operator-registry/alpha/declcfg/errors.go | 93 + .../operator-registry/alpha/declcfg/load.go | 276 +- .../operator-registry/alpha/declcfg/write.go | 49 +- .../alpha/property/property.go | 47 + .../alpha/property/scheme.go | 1 + .../operator-registry/pkg/api/api_to_model.go | 15 +- .../operator-registry/pkg/api/model_to_api.go | 84 +- .../pkg/registry/registry_to_model.go | 18 +- .../internal/annotations/metrics/metrics.go | 2 +- .../internal/bindata/olm/manifests.go | 96 +- .../internal/bindata/olm/versions.go | 2 +- .../internal/cmd/operator-sdk/cli/cli.go | 2 +- .../generate/internal/relatedimages.go | 6 +- .../internal/olm/client/client.go | 47 +- .../internal/olm/client/status.go | 6 +- .../operator-sdk/internal/olm/fbcutil/util.go | 12 +- .../internal/olm/operator/install_mode.go | 6 +- .../operator/registry/operator_installer.go | 12 +- .../internal/plugins/manifests/v2/init.go | 68 +- .../collectors/go_collector_latest.go | 2 + .../client_golang/prometheus/counter.go | 26 +- .../client_golang/prometheus/desc.go | 46 +- .../client_golang/prometheus/doc.go | 44 +- .../client_golang/prometheus/gauge.go | 26 +- .../prometheus/go_collector_latest.go | 7 +- .../client_golang/prometheus/histogram.go | 61 +- .../client_golang/prometheus/labels.go | 72 + .../client_golang/prometheus/metric.go | 6 +- .../client_golang/prometheus/promhttp/http.go | 19 +- .../prometheus/promhttp/instrument_client.go | 26 +- .../prometheus/promhttp/instrument_server.go | 101 +- .../prometheus/promhttp/option.go | 38 +- .../client_golang/prometheus/registry.go | 17 +- .../client_golang/prometheus/summary.go | 39 +- .../client_golang/prometheus/timer.go | 28 +- .../client_golang/prometheus/value.go | 10 +- .../client_golang/prometheus/vec.go | 79 +- .../client_golang/prometheus/vnext.go | 23 + .../client_golang/prometheus/wrap.go | 8 +- .../prometheus/client_model/go/metrics.pb.go | 1530 +- .../prometheus/common/expfmt/decode.go | 39 +- .../prometheus/common/expfmt/encode.go | 13 +- .../prometheus/common/expfmt/expfmt.go | 26 +- .../prometheus/common/expfmt/fuzz.go | 4 +- .../common/expfmt/openmetrics_create.go | 22 +- .../prometheus/common/expfmt/text_create.go | 3 +- .../prometheus/common/expfmt/text_parse.go | 12 +- .../bitbucket.org/ww/goautoneg/autoneg.go | 22 +- .../prometheus/common/model/time.go | 89 +- .../prometheus/common/model/value.go | 246 +- .../prometheus/common/model/value_float.go | 100 + .../common/model/value_histogram.go | 178 + .../prometheus/common/model/value_type.go | 83 + .../prometheus/procfs/Makefile.common | 23 +- .../github.com/prometheus/procfs/cpuinfo.go | 36 + .../prometheus/procfs/cpuinfo_loong64.go} | 15 +- .../prometheus/procfs/cpuinfo_others.go | 4 +- .../github.com/prometheus/procfs/doc.go | 51 +- .../vendor/github.com/prometheus/procfs/fs.go | 9 +- .../prometheus/procfs/fs_statfs_notype.go | 23 + .../prometheus/procfs/fs_statfs_type.go | 33 + .../prometheus/procfs/internal/util/parse.go | 15 + .../prometheus/procfs/mountstats.go | 9 +- .../prometheus/procfs/net_conntrackstat.go | 88 +- .../prometheus/procfs/net_softnet.go | 75 +- .../prometheus/procfs/net_wireless.go | 182 + .../github.com/prometheus/procfs/netstat.go | 54 +- .../github.com/prometheus/procfs/proc.go | 22 +- .../prometheus/procfs/proc_cgroup.go | 2 +- .../prometheus/procfs/proc_interrupts.go | 98 + .../prometheus/procfs/proc_netstat.go | 491 +- .../github.com/prometheus/procfs/proc_snmp.go | 318 +- .../prometheus/procfs/proc_snmp6.go | 364 +- .../github.com/prometheus/procfs/proc_stat.go | 10 +- .../prometheus/procfs/proc_status.go | 38 +- .../github.com/prometheus/procfs/stat.go | 22 +- .../github.com/prometheus/procfs/thread.go | 80 + .../vendor/github.com/prometheus/procfs/vm.go | 4 +- .../github.com/rubenv/sql-migrate/README.md | 9 +- .../github.com/rubenv/sql-migrate/migrate.go | 63 +- .../github.com/sirupsen/logrus/README.md | 8 +- .../github.com/sirupsen/logrus/writer.go | 34 +- .../stretchr/testify/assert/assertions.go | 78 +- .../github.com/xlab/treeprint/.gitignore | 3 + .../github.com/xlab/treeprint/treeprint.go | 84 +- tools/vendor/go.etcd.io/bbolt/.gitignore | 3 + tools/vendor/go.etcd.io/bbolt/.travis.yml | 18 - tools/vendor/go.etcd.io/bbolt/Makefile | 71 +- tools/vendor/go.etcd.io/bbolt/README.md | 21 +- tools/vendor/go.etcd.io/bbolt/bolt_arm64.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_loong64.go | 10 + tools/vendor/go.etcd.io/bbolt/bolt_mips64x.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_mipsx.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_ppc.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_ppc64.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_ppc64le.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_riscv64.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_s390x.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_unix.go | 1 + .../vendor/go.etcd.io/bbolt/bolt_unix_aix.go | 1 + tools/vendor/go.etcd.io/bbolt/bolt_windows.go | 62 +- .../vendor/go.etcd.io/bbolt/boltsync_unix.go | 1 + tools/vendor/go.etcd.io/bbolt/bucket.go | 54 +- tools/vendor/go.etcd.io/bbolt/compact.go | 9 +- tools/vendor/go.etcd.io/bbolt/cursor.go | 104 +- tools/vendor/go.etcd.io/bbolt/db.go | 179 +- tools/vendor/go.etcd.io/bbolt/doc.go | 8 +- tools/vendor/go.etcd.io/bbolt/errors.go | 7 + tools/vendor/go.etcd.io/bbolt/freelist.go | 19 +- tools/vendor/go.etcd.io/bbolt/mlock_unix.go | 3 +- .../vendor/go.etcd.io/bbolt/mlock_windows.go | 2 +- tools/vendor/go.etcd.io/bbolt/node.go | 28 +- tools/vendor/go.etcd.io/bbolt/page.go | 10 + tools/vendor/go.etcd.io/bbolt/tx.go | 382 +- tools/vendor/go.etcd.io/bbolt/tx_check.go | 226 + .../etcd/api/v3/v3rpc/rpctypes/error.go | 264 - tools/vendor/go.opencensus.io/Makefile | 8 +- tools/vendor/go.opencensus.io/opencensus.go | 2 +- tools/vendor/go.opencensus.io/trace/doc.go | 13 +- tools/vendor/go.opencensus.io/trace/lrumap.go | 2 +- .../go.opencensus.io/trace/trace_go11.go | 1 + .../go.opencensus.io/trace/trace_nongo11.go | 1 + .../go.opentelemetry.io/otel/.golangci.yml | 6 +- .../go.opentelemetry.io/otel/.lycheeignore | 3 + .../go.opentelemetry.io/otel/CHANGELOG.md | 320 +- .../go.opentelemetry.io/otel/CONTRIBUTING.md | 2 +- .../vendor/go.opentelemetry.io/otel/Makefile | 13 +- .../vendor/go.opentelemetry.io/otel/README.md | 5 + .../go.opentelemetry.io/otel/RELEASING.md | 11 +- .../otel/attribute/value.go | 95 +- .../otel/baggage/baggage.go | 16 +- .../go.opentelemetry.io/otel/codes/codes.go | 10 + .../otlp/internal/envconfig/envconfig.go | 81 +- .../exporters/otlp/internal/partialsuccess.go | 34 +- .../exporters/otlp/internal/retry/retry.go | 35 +- .../exporters/otlp/internal/wrappederror.go | 61 + .../otel/exporters/otlp/otlptrace/README.md | 4 +- .../otel/exporters/otlp/otlptrace/exporter.go | 7 +- .../internal/otlpconfig/envconfig.go | 27 +- .../otlptrace/internal/otlpconfig/options.go | 1 + .../otlp/otlptrace/otlptracegrpc/client.go | 11 +- .../go.opentelemetry.io/otel/handler.go | 25 +- .../otel/internal/attribute/attribute.go | 111 + .../otel/internal/global/internal_logging.go | 30 +- .../otel/metric/instrument/asyncfloat64.go | 131 + .../instrument/asyncfloat64/asyncfloat64.go | 70 - .../otel/metric/instrument/asyncint64.go | 131 + .../instrument/asyncint64/asyncint64.go | 70 - .../otel/metric/instrument/config.go | 69 - .../otel/metric/instrument/instrument.go | 60 + .../otel/metric/instrument/syncfloat64.go | 86 + .../instrument/syncfloat64/syncfloat64.go | 30 +- .../otel/metric/instrument/syncint64.go | 86 + .../metric/instrument/syncint64/syncint64.go | 30 +- .../metric/internal/global/instruments.go | 209 +- .../otel/metric/internal/global/meter.go | 319 +- .../go.opentelemetry.io/otel/metric/meter.go | 118 +- .../go.opentelemetry.io/otel/metric/noop.go | 127 +- .../otel/sdk/resource/builtin.go | 8 +- .../otel/sdk/resource/config.go | 2 + .../otel/sdk/resource/container.go | 4 +- .../otel/sdk/resource/env.go | 15 +- .../otel/sdk/resource/os.go | 4 +- .../otel/sdk/resource/process.go | 18 +- .../otel/sdk/trace/provider.go | 56 +- .../otel/sdk/trace/sampling.go | 10 +- .../otel/sdk/trace/span.go | 46 +- .../otel/sdk/trace/span_processor.go | 5 + .../otel/sdk/trace/tracer.go | 2 +- .../otel/semconv/internal/v2/http.go | 404 + .../otel/semconv/internal/v2/net.go | 324 + .../otel/semconv/v1.17.0/doc.go | 20 + .../otel/semconv/v1.17.0/event.go | 199 + .../otel/semconv/v1.17.0/exception.go | 20 + .../otel/semconv/v1.17.0/http.go} | 11 +- .../otel/semconv/v1.17.0/httpconv/http.go | 150 + .../otel/semconv/v1.17.0/resource.go | 2010 + .../otel/semconv/v1.17.0/schema.go | 20 + .../otel/semconv/v1.17.0/trace.go | 3375 + .../go.opentelemetry.io/otel/trace/config.go | 17 + .../go.opentelemetry.io/otel/trace/doc.go | 2 +- .../go.opentelemetry.io/otel/version.go | 2 +- .../go.opentelemetry.io/otel/versions.yaml | 7 +- tools/vendor/go.uber.org/atomic/.codecov.yml | 19 - tools/vendor/go.uber.org/atomic/.gitignore | 15 - tools/vendor/go.uber.org/atomic/CHANGELOG.md | 117 - tools/vendor/go.uber.org/atomic/LICENSE.txt | 19 - tools/vendor/go.uber.org/atomic/Makefile | 79 - tools/vendor/go.uber.org/atomic/README.md | 63 - tools/vendor/go.uber.org/atomic/bool.go | 88 - tools/vendor/go.uber.org/atomic/doc.go | 23 - tools/vendor/go.uber.org/atomic/duration.go | 89 - .../vendor/go.uber.org/atomic/duration_ext.go | 40 - tools/vendor/go.uber.org/atomic/error.go | 62 - tools/vendor/go.uber.org/atomic/float32.go | 77 - .../vendor/go.uber.org/atomic/float32_ext.go | 76 - tools/vendor/go.uber.org/atomic/float64.go | 77 - .../vendor/go.uber.org/atomic/float64_ext.go | 76 - tools/vendor/go.uber.org/atomic/gen.go | 27 - tools/vendor/go.uber.org/atomic/int32.go | 109 - tools/vendor/go.uber.org/atomic/int64.go | 109 - tools/vendor/go.uber.org/atomic/nocmp.go | 35 - .../go.uber.org/atomic/pointer_go118.go | 60 - .../go.uber.org/atomic/pointer_go119.go | 61 - tools/vendor/go.uber.org/atomic/string.go | 65 - tools/vendor/go.uber.org/atomic/string_ext.go | 43 - tools/vendor/go.uber.org/atomic/time_ext.go | 36 - tools/vendor/go.uber.org/atomic/uint32.go | 109 - tools/vendor/go.uber.org/atomic/uint64.go | 109 - tools/vendor/go.uber.org/atomic/uintptr.go | 109 - .../go.uber.org/atomic/unsafe_pointer.go | 65 - tools/vendor/go.uber.org/atomic/value.go | 31 - .../vendor/go.uber.org/multierr/CHANGELOG.md | 23 + tools/vendor/go.uber.org/multierr/README.md | 22 +- tools/vendor/go.uber.org/multierr/error.go | 406 +- .../error_post_go120.go} | 35 +- .../go.uber.org/multierr/error_pre_go120.go | 79 + tools/vendor/go.uber.org/multierr/glide.yaml | 8 - tools/vendor/go.uber.org/zap/.golangci.yml | 77 + tools/vendor/go.uber.org/zap/CHANGELOG.md | 242 +- tools/vendor/go.uber.org/zap/Makefile | 87 +- tools/vendor/go.uber.org/zap/README.md | 62 +- tools/vendor/go.uber.org/zap/array.go | 127 + tools/vendor/go.uber.org/zap/array_go118.go | 156 - tools/vendor/go.uber.org/zap/buffer/buffer.go | 5 + tools/vendor/go.uber.org/zap/buffer/pool.go | 20 +- tools/vendor/go.uber.org/zap/config.go | 84 +- tools/vendor/go.uber.org/zap/error.go | 14 +- tools/vendor/go.uber.org/zap/field.go | 194 +- tools/vendor/go.uber.org/zap/http_handler.go | 19 +- .../go.uber.org/zap/internal/level_enabler.go | 2 + .../bool_ext.go => zap/internal/pool/pool.go} | 49 +- .../stacktrace/stack.go} | 81 +- tools/vendor/go.uber.org/zap/level.go | 9 +- tools/vendor/go.uber.org/zap/logger.go | 48 +- tools/vendor/go.uber.org/zap/sink.go | 5 +- tools/vendor/go.uber.org/zap/sugar.go | 69 +- tools/vendor/go.uber.org/zap/writer.go | 12 +- .../zap/zapcore/console_encoder.go | 14 +- tools/vendor/go.uber.org/zap/zapcore/core.go | 6 +- tools/vendor/go.uber.org/zap/zapcore/entry.go | 22 +- tools/vendor/go.uber.org/zap/zapcore/error.go | 14 +- .../go.uber.org/zap/zapcore/json_encoder.go | 155 +- .../time.go => zap/zapcore/lazy_with.go} | 51 +- .../vendor/go.uber.org/zap/zapcore/sampler.go | 9 +- .../golang.org/x/crypto/bcrypt/bcrypt.go | 11 +- .../vendor/golang.org/x/crypto/cast5/cast5.go | 11 +- .../x/crypto/openpgp/armor/armor.go | 2 +- .../golang.org/x/crypto/openpgp/keys.go | 4 +- .../x/crypto/openpgp/packet/compressed.go | 2 +- tools/vendor/golang.org/x/exp/LICENSE | 27 + tools/vendor/golang.org/x/exp/PATENTS | 22 + .../x/exp/constraints/constraints.go | 50 + tools/vendor/golang.org/x/exp/slices/cmp.go | 44 + .../vendor/golang.org/x/exp/slices/slices.go | 499 + tools/vendor/golang.org/x/exp/slices/sort.go | 195 + .../golang.org/x/exp/slices/zsortanyfunc.go | 479 + .../golang.org/x/exp/slices/zsortordered.go | 481 + .../x/mod/internal/lazyregexp/lazyre.go | 2 +- .../vendor/golang.org/x/mod/modfile/print.go | 14 +- tools/vendor/golang.org/x/mod/modfile/read.go | 2 +- tools/vendor/golang.org/x/mod/modfile/rule.go | 144 +- tools/vendor/golang.org/x/mod/modfile/work.go | 65 +- .../vendor/golang.org/x/mod/module/module.go | 30 +- .../vendor/golang.org/x/mod/module/pseudo.go | 2 +- .../vendor/golang.org/x/mod/semver/semver.go | 6 +- .../x/net/context/ctxhttp/ctxhttp.go | 71 - .../vendor/golang.org/x/net/http2/Dockerfile | 51 - tools/vendor/golang.org/x/net/http2/Makefile | 3 - tools/vendor/golang.org/x/net/http2/server.go | 29 +- .../golang.org/x/net/http2/transport.go | 70 +- .../golang.org/x/net/http2/writesched.go | 3 +- .../x/net/http2/writesched_roundrobin.go | 119 + .../vendor/golang.org/x/net/idna/idna9.0.0.go | 2 +- .../golang.org/x/net/idna/tables13.0.0.go | 2988 +- .../golang.org/x/net/idna/tables15.0.0.go | 5145 ++ tools/vendor/golang.org/x/net/idna/trie.go | 21 - .../golang.org/x/net/idna/trie12.0.0.go | 31 + .../golang.org/x/net/idna/trie13.0.0.go | 31 + .../golang.org/x/net/internal/socks/socks.go | 2 +- tools/vendor/golang.org/x/oauth2/README.md | 12 +- .../golang.org/x/oauth2/internal/oauth2.go | 2 +- .../golang.org/x/oauth2/internal/token.go | 64 +- tools/vendor/golang.org/x/oauth2/oauth2.go | 33 +- tools/vendor/golang.org/x/oauth2/token.go | 33 +- .../golang.org/x/sync/errgroup/errgroup.go | 10 +- .../golang.org/x/sync/errgroup/go120.go | 14 + .../golang.org/x/sync/errgroup/pre_go120.go | 15 + .../x/sync/singleflight/singleflight.go | 214 + .../sys/internal/unsafeheader/unsafeheader.go | 30 - tools/vendor/golang.org/x/sys/unix/mkall.sh | 2 +- .../vendor/golang.org/x/sys/unix/mkerrors.sh | 12 +- .../golang.org/x/sys/unix/mmap_nomremap.go | 14 + tools/vendor/golang.org/x/sys/unix/mremap.go | 53 + .../golang.org/x/sys/unix/ptrace_darwin.go | 6 - .../golang.org/x/sys/unix/ptrace_ios.go | 6 - .../golang.org/x/sys/unix/syscall_aix.go | 17 - .../golang.org/x/sys/unix/syscall_bsd.go | 14 - .../golang.org/x/sys/unix/syscall_darwin.go | 236 +- .../x/sys/unix/syscall_darwin_amd64.go | 1 - .../x/sys/unix/syscall_darwin_arm64.go | 1 - .../x/sys/unix/syscall_dragonfly.go | 198 - .../golang.org/x/sys/unix/syscall_freebsd.go | 192 - .../golang.org/x/sys/unix/syscall_linux.go | 224 +- .../x/sys/unix/syscall_linux_amd64.go | 2 +- .../x/sys/unix/syscall_linux_arm64.go | 2 +- .../x/sys/unix/syscall_linux_loong64.go | 2 +- .../x/sys/unix/syscall_linux_mips64x.go | 2 +- .../x/sys/unix/syscall_linux_riscv64.go | 13 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 272 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 91 +- .../golang.org/x/sys/unix/syscall_solaris.go | 32 - .../golang.org/x/sys/unix/syscall_unix.go | 11 + .../x/sys/unix/syscall_zos_s390x.go | 15 - .../golang.org/x/sys/unix/zerrors_linux.go | 66 +- .../x/sys/unix/zerrors_linux_386.go | 11 + .../x/sys/unix/zerrors_linux_amd64.go | 11 + .../x/sys/unix/zerrors_linux_arm.go | 11 + .../x/sys/unix/zerrors_linux_arm64.go | 13 + .../x/sys/unix/zerrors_linux_loong64.go | 13 + .../x/sys/unix/zerrors_linux_mips.go | 11 + .../x/sys/unix/zerrors_linux_mips64.go | 11 + .../x/sys/unix/zerrors_linux_mips64le.go | 11 + .../x/sys/unix/zerrors_linux_mipsle.go | 11 + .../x/sys/unix/zerrors_linux_ppc.go | 11 + .../x/sys/unix/zerrors_linux_ppc64.go | 11 + .../x/sys/unix/zerrors_linux_ppc64le.go | 11 + .../x/sys/unix/zerrors_linux_riscv64.go | 11 + .../x/sys/unix/zerrors_linux_s390x.go | 11 + .../x/sys/unix/zerrors_linux_sparc64.go | 59 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 22 - .../x/sys/unix/zsyscall_aix_ppc64.go | 22 - .../x/sys/unix/zsyscall_darwin_amd64.go | 40 +- .../x/sys/unix/zsyscall_darwin_amd64.s | 149 - .../x/sys/unix/zsyscall_darwin_arm64.go | 40 +- .../x/sys/unix/zsyscall_darwin_arm64.s | 149 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 22 - .../x/sys/unix/zsyscall_freebsd_386.go | 22 - .../x/sys/unix/zsyscall_freebsd_amd64.go | 22 - .../x/sys/unix/zsyscall_freebsd_arm.go | 22 - .../x/sys/unix/zsyscall_freebsd_arm64.go | 22 - .../x/sys/unix/zsyscall_freebsd_riscv64.go | 22 - .../x/sys/unix/zsyscall_illumos_amd64.go | 10 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 69 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 16 + .../x/sys/unix/zsyscall_netbsd_386.go | 29 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 29 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 29 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 29 +- .../x/sys/unix/zsyscall_openbsd_386.go | 54 +- .../x/sys/unix/zsyscall_openbsd_386.s | 10 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 54 +- .../x/sys/unix/zsyscall_openbsd_amd64.s | 10 + .../x/sys/unix/zsyscall_openbsd_arm.go | 54 +- .../x/sys/unix/zsyscall_openbsd_arm.s | 10 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 54 +- .../x/sys/unix/zsyscall_openbsd_arm64.s | 10 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 54 +- .../x/sys/unix/zsyscall_openbsd_mips64.s | 10 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 54 +- .../x/sys/unix/zsyscall_openbsd_ppc64.s | 12 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 54 +- .../x/sys/unix/zsyscall_openbsd_riscv64.s | 10 + .../x/sys/unix/zsyscall_solaris_amd64.go | 256 +- .../x/sys/unix/zsyscall_zos_s390x.go | 11 - .../x/sys/unix/zsysnum_linux_386.go | 1 + .../x/sys/unix/zsysnum_linux_amd64.go | 1 + .../x/sys/unix/zsysnum_linux_arm.go | 1 + .../x/sys/unix/zsysnum_linux_arm64.go | 1 + .../x/sys/unix/zsysnum_linux_loong64.go | 1 + .../x/sys/unix/zsysnum_linux_mips.go | 1 + .../x/sys/unix/zsysnum_linux_mips64.go | 1 + .../x/sys/unix/zsysnum_linux_mips64le.go | 1 + .../x/sys/unix/zsysnum_linux_mipsle.go | 1 + .../x/sys/unix/zsysnum_linux_ppc.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 1 + .../x/sys/unix/zsysnum_linux_riscv64.go | 3 + .../x/sys/unix/zsysnum_linux_s390x.go | 2 + .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + .../golang.org/x/sys/unix/ztypes_linux.go | 103 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 + .../x/sys/unix/ztypes_linux_amd64.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 + .../x/sys/unix/ztypes_linux_arm64.go | 2 + .../x/sys/unix/ztypes_linux_loong64.go | 2 + .../x/sys/unix/ztypes_linux_mips.go | 2 + .../x/sys/unix/ztypes_linux_mips64.go | 2 + .../x/sys/unix/ztypes_linux_mips64le.go | 2 + .../x/sys/unix/ztypes_linux_mipsle.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 + .../x/sys/unix/ztypes_linux_ppc64.go | 2 + .../x/sys/unix/ztypes_linux_ppc64le.go | 2 + .../x/sys/unix/ztypes_linux_riscv64.go | 29 + .../x/sys/unix/ztypes_linux_s390x.go | 2 + .../x/sys/unix/ztypes_linux_sparc64.go | 2 + .../golang.org/x/sys/windows/env_windows.go | 6 +- .../golang.org/x/sys/windows/exec_windows.go | 92 +- .../x/sys/windows/security_windows.go | 21 +- .../golang.org/x/sys/windows/service.go | 11 + .../x/sys/windows/syscall_windows.go | 70 +- .../golang.org/x/sys/windows/types_windows.go | 13 +- .../x/sys/windows/zsyscall_windows.go | 71 +- tools/vendor/golang.org/x/term/term_unix.go | 2 +- .../golang.org/x/text/cases/tables13.0.0.go | 4 +- .../golang.org/x/text/cases/tables15.0.0.go | 2528 + .../x/text/feature/plural/common.go | 70 + .../x/text/feature/plural/message.go | 244 + .../x/text/feature/plural/plural.go | 262 + .../x/text/feature/plural/tables.go | 552 + .../x/text/internal/catmsg/catmsg.go | 417 + .../x/text/internal/catmsg/codec.go | 407 + .../x/text/internal/catmsg/varint.go | 62 + .../x/text/internal/format/format.go | 41 + .../x/text/internal/format/parser.go | 358 + .../text/internal/language/compact/tables.go | 356 +- .../x/text/internal/language/tables.go | 4686 +- .../x/text/internal/number/common.go | 55 + .../x/text/internal/number/decimal.go | 500 + .../x/text/internal/number/format.go | 535 + .../x/text/internal/number/number.go | 152 + .../x/text/internal/number/pattern.go | 485 + .../internal/number/roundingmode_string.go | 30 + .../x/text/internal/number/tables.go | 1219 + .../x/text/internal/stringset/set.go | 86 + .../golang.org/x/text/language/match.go | 2 +- .../golang.org/x/text/language/tables.go | 138 +- .../golang.org/x/text/message/catalog.go | 36 + .../x/text/message/catalog/catalog.go | 365 + .../golang.org/x/text/message/catalog/dict.go | 129 + .../golang.org/x/text/message/catalog/go19.go | 16 + .../x/text/message/catalog/gopre19.go | 24 + tools/vendor/golang.org/x/text/message/doc.go | 99 + .../golang.org/x/text/message/format.go | 510 + .../golang.org/x/text/message/message.go | 193 + .../vendor/golang.org/x/text/message/print.go | 984 + .../x/text/unicode/bidi/tables13.0.0.go | 4 +- .../x/text/unicode/bidi/tables15.0.0.go | 2043 + .../x/text/unicode/norm/tables13.0.0.go | 4 +- .../x/text/unicode/norm/tables15.0.0.go | 7908 ++ .../golang.org/x/text/unicode/norm/trie.go | 2 +- .../golang.org/x/text/width/tables13.0.0.go | 4 +- .../golang.org/x/text/width/tables15.0.0.go | 1368 + .../x/tools/cmd/stringer/stringer.go | 5 +- .../x/tools/go/gcexportdata/gcexportdata.go | 11 +- .../tools/go/internal/packagesdriver/sizes.go | 11 +- .../golang.org/x/tools/go/packages/doc.go | 2 +- .../golang.org/x/tools/go/packages/golist.go | 42 +- .../x/tools/go/packages/packages.go | 19 +- .../x/tools/go/types/objectpath/objectpath.go | 193 +- .../golang.org/x/tools/imports/forward.go | 4 +- .../x/tools/internal/event/tag/tag.go | 59 + .../x/tools/internal/fastwalk/fastwalk.go | 16 +- .../internal/fastwalk/fastwalk_portable.go | 11 +- .../x/tools/internal/gcimporter/bexport.go | 852 - .../x/tools/internal/gcimporter/bimport.go | 907 +- .../x/tools/internal/gcimporter/gcimporter.go | 18 +- .../x/tools/internal/gcimporter/iexport.go | 194 +- .../x/tools/internal/gcimporter/iimport.go | 197 +- .../tools/internal/gcimporter/ureader_yes.go | 9 + .../x/tools/internal/gocommand/invoke.go | 146 +- .../x/tools/internal/gocommand/version.go | 18 +- .../x/tools/internal/gopathwalk/walk.go | 20 +- .../x/tools/internal/imports/fix.go | 47 +- .../x/tools/internal/imports/imports.go | 9 +- .../x/tools/internal/imports/mod.go | 17 +- .../x/tools/internal/imports/mod_cache.go | 2 +- .../x/tools/internal/imports/zstdlib.go | 230 + .../x/tools/internal/typeparams/common.go | 26 + .../x/tools/internal/typeparams/coretype.go | 8 +- .../x/tools/internal/typeparams/termlist.go | 2 +- .../internal/typeparams/typeparams_go117.go | 2 +- .../internal/typeparams/typeparams_go118.go | 2 +- .../x/tools/internal/typeparams/typeterm.go | 9 +- .../internal/typesinternal/objectpath.go | 24 + .../x/tools/internal/typesinternal/types.go | 9 - .../genproto/googleapis/api/LICENSE | 202 + .../googleapis/api/expr/v1alpha1/syntax.pb.go | 247 +- .../googleapis/api/httpbody/httpbody.pb.go | 4 +- .../genproto/googleapis/rpc/LICENSE | 202 + .../rpc/errdetails/error_details.pb.go | 374 +- .../googleapis/rpc/status/status.pb.go | 10 +- .../google.golang.org/grpc/CONTRIBUTING.md | 29 +- .../grpc/balancer/balancer.go | 8 + .../grpc_binarylog_v1/binarylog.pb.go | 9 +- .../google.golang.org/grpc/clientconn.go | 67 +- .../grpc/codes/code_string.go | 51 +- .../google.golang.org/grpc/credentials/tls.go | 4 +- .../google.golang.org/grpc/dialoptions.go | 42 +- .../grpc/encoding/encoding.go | 4 +- .../grpc/encoding/gzip/gzip.go | 5 +- .../grpc/grpclog/loggerv2.go | 7 +- .../grpc/internal/binarylog/binarylog.go | 8 +- .../grpc/internal/binarylog/method_logger.go | 133 +- .../grpc/internal/binarylog/sink.go | 12 +- .../grpc/internal/envconfig/envconfig.go | 39 +- .../grpc/internal/envconfig/xds.go | 31 +- .../grpc/internal/grpclog/prefixLogger.go | 12 + .../grpc/internal/internal.go | 13 + .../grpc/internal/metadata/metadata.go | 62 +- .../internal/resolver/dns/dns_resolver.go | 6 +- .../resolver/passthrough/passthrough.go | 11 +- .../grpc/internal/resolver/unix/unix.go | 4 +- .../grpc/internal/transport/controlbuf.go | 116 +- .../grpc/internal/transport/defaults.go | 6 + .../grpc/internal/transport/handler_server.go | 45 +- .../grpc/internal/transport/http2_client.go | 115 +- .../grpc/internal/transport/http2_server.go | 161 +- .../grpc/internal/transport/http_util.go | 24 +- .../grpc/internal/transport/transport.go | 29 +- .../grpc/metadata/metadata.go | 13 +- .../google.golang.org/grpc/picker_wrapper.go | 28 +- .../google.golang.org/grpc/pickfirst.go | 6 +- .../google.golang.org/grpc/regenerate.sh | 7 +- .../grpc/resolver/resolver.go | 42 +- .../vendor/google.golang.org/grpc/rpc_util.go | 70 +- tools/vendor/google.golang.org/grpc/server.go | 230 +- .../google.golang.org/grpc/service_config.go | 10 +- .../google.golang.org/grpc/stats/stats.go | 22 +- tools/vendor/google.golang.org/grpc/stream.go | 103 +- .../vendor/google.golang.org/grpc/version.go | 2 +- tools/vendor/google.golang.org/grpc/vet.sh | 34 +- .../gopkg.in/evanphx/json-patch.v5/.gitignore | 6 + .../gopkg.in/evanphx/json-patch.v5/LICENSE | 25 + .../gopkg.in/evanphx/json-patch.v5/README.md | 317 + .../gopkg.in/evanphx/json-patch.v5/errors.go | 38 + .../gopkg.in/evanphx/json-patch.v5/merge.go | 389 + .../gopkg.in/evanphx/json-patch.v5/patch.go | 809 + .../helm/v3/internal/version/version.go | 2 +- .../helm.sh/helm/v3/pkg/action/action.go | 13 +- .../helm.sh/helm/v3/pkg/action/install.go | 27 +- .../helm.sh/helm/v3/pkg/action/status.go | 46 +- .../helm.sh/helm/v3/pkg/action/upgrade.go | 4 +- .../helm.sh/helm/v3/pkg/chart/dependency.go | 2 +- .../helm.sh/helm/v3/pkg/chart/metadata.go | 2 +- .../helm.sh/helm/v3/pkg/cli/environment.go | 9 +- .../helm.sh/helm/v3/pkg/cli/roundtripper.go | 80 + .../v3/pkg/downloader/chart_downloader.go | 25 +- .../helm.sh/helm/v3/pkg/engine/engine.go | 17 + .../helm.sh/helm/v3/pkg/getter/httpgetter.go | 1 - .../vendor/helm.sh/helm/v3/pkg/kube/client.go | 207 +- .../helm.sh/helm/v3/pkg/kube/fake/fake.go | 19 + .../helm.sh/helm/v3/pkg/kube/fake/printer.go | 14 + .../helm.sh/helm/v3/pkg/kube/interface.go | 24 + .../vendor/helm.sh/helm/v3/pkg/kube/ready.go | 8 +- tools/vendor/helm.sh/helm/v3/pkg/kube/wait.go | 26 +- .../helm.sh/helm/v3/pkg/release/info.go | 4 + .../helm.sh/helm/v3/pkg/repo/chartrepo.go | 30 +- .../admissionregistration/v1/generated.proto | 4 +- .../api/admissionregistration/v1/types.go | 4 +- .../v1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/generated.pb.go | 541 +- .../v1alpha1/generated.proto | 92 +- .../admissionregistration/v1alpha1/types.go | 105 +- .../v1alpha1/types_swagger_doc_generated.go | 25 +- .../v1alpha1/zz_generated.deepcopy.go | 33 +- .../v1beta1/generated.pb.go | 5927 +- .../v1beta1/generated.proto | 564 +- .../admissionregistration/v1beta1/register.go | 4 + .../admissionregistration/v1beta1/types.go | 594 +- .../v1beta1/types_swagger_doc_generated.go | 178 +- .../v1beta1/zz_generated.deepcopy.go | 448 +- .../zz_generated.prerelease-lifecycle.go | 72 + .../api/apidiscovery/v2beta1/generated.proto | 4 +- .../k8s.io/api/apidiscovery/v2beta1/types.go | 4 +- .../v1alpha1/generated.pb.go | 148 +- .../v1alpha1/generated.proto | 5 + .../api/apiserverinternal/v1alpha1/types.go | 5 + .../v1alpha1/types_swagger_doc_generated.go | 1 + .../v1alpha1/zz_generated.deepcopy.go | 5 + tools/vendor/k8s.io/api/apps/v1/types.go | 3 +- .../api/authentication/v1/generated.pb.go | 511 +- .../api/authentication/v1/generated.proto | 20 + .../k8s.io/api/authentication/v1/register.go | 1 + .../k8s.io/api/authentication/v1/types.go | 25 + .../v1/types_swagger_doc_generated.go | 19 + .../v1/zz_generated.deepcopy.go | 44 + .../k8s.io/api/batch/v1/generated.pb.go | 398 +- .../k8s.io/api/batch/v1/generated.proto | 66 +- tools/vendor/k8s.io/api/batch/v1/types.go | 96 +- .../batch/v1/types_swagger_doc_generated.go | 9 +- .../api/batch/v1/zz_generated.deepcopy.go | 25 + .../api/core/v1/annotation_key_constants.go | 6 +- .../vendor/k8s.io/api/core/v1/generated.pb.go | 3017 +- .../vendor/k8s.io/api/core/v1/generated.proto | 196 +- tools/vendor/k8s.io/api/core/v1/types.go | 238 +- .../core/v1/types_swagger_doc_generated.go | 68 +- .../k8s.io/api/core/v1/well_known_labels.go | 4 + .../api/core/v1/zz_generated.deepcopy.go | 75 +- .../k8s.io/api/discovery/v1/generated.proto | 2 + tools/vendor/k8s.io/api/discovery/v1/types.go | 2 + .../v1/types_swagger_doc_generated.go | 2 +- .../api/extensions/v1beta1/generated.pb.go | 610 +- .../api/extensions/v1beta1/generated.proto | 17 - .../k8s.io/api/extensions/v1beta1/types.go | 50 +- .../v1beta1/types_swagger_doc_generated.go | 10 - .../v1beta1/zz_generated.deepcopy.go | 24 - .../api/flowcontrol/v1alpha1/generated.pb.go | 477 +- .../api/flowcontrol/v1alpha1/generated.proto | 42 + .../k8s.io/api/flowcontrol/v1alpha1/types.go | 45 + .../v1alpha1/types_swagger_doc_generated.go | 11 + .../v1alpha1/zz_generated.deepcopy.go | 31 + .../api/flowcontrol/v1beta1/generated.pb.go | 476 +- .../api/flowcontrol/v1beta1/generated.proto | 42 + .../k8s.io/api/flowcontrol/v1beta1/types.go | 49 +- .../v1beta1/types_swagger_doc_generated.go | 11 + .../v1beta1/zz_generated.deepcopy.go | 31 + .../api/flowcontrol/v1beta2/generated.pb.go | 477 +- .../api/flowcontrol/v1beta2/generated.proto | 42 + .../k8s.io/api/flowcontrol/v1beta2/types.go | 49 +- .../v1beta2/types_swagger_doc_generated.go | 11 + .../v1beta2/zz_generated.deepcopy.go | 31 + .../api/flowcontrol/v1beta3/generated.pb.go | 475 +- .../api/flowcontrol/v1beta3/generated.proto | 46 +- .../k8s.io/api/flowcontrol/v1beta3/types.go | 53 +- .../v1beta3/types_swagger_doc_generated.go | 13 +- .../v1beta3/zz_generated.deepcopy.go | 31 + .../k8s.io/api/networking/v1/generated.pb.go | 443 +- .../k8s.io/api/networking/v1/generated.proto | 17 - .../vendor/k8s.io/api/networking/v1/types.go | 50 +- .../v1/types_swagger_doc_generated.go | 10 - .../networking/v1/zz_generated.deepcopy.go | 24 - .../vendor/k8s.io/api/rbac/v1/generated.proto | 2 + tools/vendor/k8s.io/api/rbac/v1/types.go | 2 + .../rbac/v1/types_swagger_doc_generated.go | 4 +- .../pkg/apis/apiextensions/deepcopy.go | 8 +- .../apis/apiextensions/types_jsonschema.go | 38 + .../pkg/apis/apiextensions/v1/deepcopy.go | 8 +- .../pkg/apis/apiextensions/v1/generated.pb.go | 474 +- .../pkg/apis/apiextensions/v1/generated.proto | 20 + .../apis/apiextensions/v1/types_jsonschema.go | 38 + .../v1/zz_generated.conversion.go | 4 + .../apiextensions/v1/zz_generated.deepcopy.go | 9 +- .../apis/apiextensions/v1beta1/deepcopy.go | 8 +- .../apiextensions/v1beta1/generated.pb.go | 479 +- .../apiextensions/v1beta1/generated.proto | 20 + .../apiextensions/v1beta1/types_jsonschema.go | 38 + .../v1beta1/zz_generated.conversion.go | 4 + .../v1beta1/zz_generated.deepcopy.go | 9 +- .../apiextensions/validation/validation.go | 107 +- .../apiextensions/zz_generated.deepcopy.go | 9 +- .../pkg/apiserver/schema/cel/compilation.go | 149 +- .../pkg/apiserver/schema/cel/validation.go | 179 +- .../apiserver/schema/zz_generated.deepcopy.go | 4 +- .../pkg/apiserver/validation/ratcheting.go | 412 + .../pkg/apiserver/validation/validation.go | 79 +- .../pkg/features/OWNERS | 4 + .../pkg/features/kube_features.go | 48 + .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 1 - .../k8s.io/apimachinery/pkg/api/meta/help.go | 83 +- .../apimachinery/pkg/api/resource/OWNERS | 1 - .../pkg/apis/meta/v1/generated.proto | 2 - .../apimachinery/pkg/apis/meta/v1/types.go | 22 +- .../apis/meta/v1/unstructured/unstructured.go | 5 + .../meta/v1/unstructured/unstructured_list.go | 9 + .../k8s.io/apimachinery/pkg/runtime/codec.go | 1 - .../apimachinery/pkg/runtime/converter.go | 4 +- .../apimachinery/pkg/runtime/interfaces.go | 5 + .../pkg/runtime/schema/group_version.go | 2 +- .../k8s.io/apimachinery/pkg/runtime/splice.go | 76 + .../apimachinery/pkg/types/namespacedname.go | 3 +- .../apimachinery/pkg/util/cache/expiring.go | 12 +- .../k8s.io/apimachinery/pkg/util/diff/diff.go | 37 +- .../k8s.io/apimachinery/pkg/util/dump/dump.go | 54 + .../pkg/util/httpstream/spdy/roundtripper.go | 4 +- .../apimachinery/pkg/util/intstr/intstr.go | 7 +- .../managedfields/internal/fieldmanager.go | 25 +- .../managedfields/internal/skipnonapplied.go | 14 +- .../managedfields/internal/structuredmerge.go | 3 + .../managedfields/internal/versioncheck.go | 52 + .../apimachinery/pkg/util/mergepatch/util.go | 4 +- .../k8s.io/apimachinery/pkg/util/net/util.go | 6 + .../pkg/util/strategicpatch/patch.go | 63 +- .../apimachinery/pkg/util/version/doc.go} | 25 +- .../apimachinery/pkg/util/version/version.go | 330 + .../k8s.io/apimachinery/pkg/util/wait/loop.go | 19 +- .../k8s.io/apimachinery/pkg/util/wait/poll.go | 28 +- .../k8s.io/apiserver/pkg/audit/context.go | 76 +- .../k8s.io/apiserver/pkg/audit/request.go | 29 +- .../k8s.io/apiserver/pkg/cel/common/values.go | 20 +- .../k8s.io/apiserver/pkg/cel/composited.go | 119 - .../apiserver/pkg/cel/environment/base.go | 119 + .../pkg/cel/environment/environment.go | 274 + .../k8s.io/apiserver/pkg/cel/library/authz.go | 62 +- .../k8s.io/apiserver/pkg/cel/library/cost.go | 4 +- .../apiserver/pkg/cel/library/libraries.go | 35 - .../apiserver/pkg/cel/library/quantity.go | 375 + .../k8s.io/apiserver/pkg/cel/library/regex.go | 4 +- .../k8s.io/apiserver/pkg/cel/library/test.go | 79 + .../apiserver/pkg/cel/openapi/adaptor.go | 147 + .../apiserver/pkg/cel/openapi/extensions.go | 62 + .../k8s.io/apiserver/pkg/cel/quantity.go | 76 + .../k8s.io/apiserver/pkg/cel/registry.go | 79 - .../vendor/k8s.io/apiserver/pkg/cel/types.go | 160 +- .../apiserver/pkg/features/kube_features.go | 57 +- .../pkg/util/webhook/authentication.go | 1 + .../apiserver/pkg/util/webhook/webhook.go | 2 +- .../v1alpha1/paramref.go | 27 +- .../v1alpha1/validatingadmissionpolicyspec.go | 14 + .../v1alpha1/variable.go | 48 + .../v1beta1/auditannotation.go | 48 + .../v1beta1/expressionwarning.go | 48 + .../v1beta1/matchresources.go | 90 + .../v1beta1/namedrulewithoperations.go | 95 + .../v1beta1/paramkind.go | 48 + .../admissionregistration/v1beta1/paramref.go | 71 + .../v1beta1/typechecking.go | 44 + .../v1beta1/validatingadmissionpolicy.go | 256 + .../validatingadmissionpolicybinding.go | 247 + .../validatingadmissionpolicybindingspec.go | 72 + .../v1beta1/validatingadmissionpolicyspec.go | 117 + .../validatingadmissionpolicystatus.go | 66 + .../v1beta1/validation.go | 70 + .../admissionregistration/v1beta1/variable.go | 48 + .../v1alpha1/serverstorageversion.go | 11 + .../applyconfigurations/batch/v1/jobspec.go | 27 + .../applyconfigurations/batch/v1/jobstatus.go | 18 + .../applyconfigurations/core/v1/container.go | 9 + .../core/v1/ephemeralcontainer.go | 8 + .../core/v1/ephemeralcontainercommon.go | 9 + .../applyconfigurations/core/v1/hostip.go | 39 + .../core/v1/persistentvolumeclaimstatus.go | 28 +- .../core/v1/persistentvolumestatus.go | 16 +- .../core/v1/podresourceclaimstatus.go | 48 + .../applyconfigurations/core/v1/podstatus.go | 56 +- .../extensions/v1beta1/networkpolicy.go | 11 +- .../extensions/v1beta1/networkpolicystatus.go | 48 - .../exemptprioritylevelconfiguration.go | 48 + .../prioritylevelconfigurationspec.go | 9 + .../exemptprioritylevelconfiguration.go | 48 + .../v1beta1/prioritylevelconfigurationspec.go | 9 + .../exemptprioritylevelconfiguration.go | 48 + .../v1beta2/prioritylevelconfigurationspec.go | 9 + .../exemptprioritylevelconfiguration.go | 48 + .../v1beta3/prioritylevelconfigurationspec.go | 9 + .../applyconfigurations/internal/internal.go | 440 +- .../networking/v1/networkpolicy.go | 11 +- .../networking/v1/networkpolicystatus.go | 48 - .../discovery/aggregated_discovery.go | 6 +- .../discovery/cached/disk/cached_discovery.go | 2 +- .../discovery/cached/memory/memcache.go | 2 +- .../client-go/discovery/discovery_client.go | 66 +- .../v1beta1/admissionregistration_client.go | 10 + .../v1beta1/generated_expansion.go | 4 + .../v1beta1/validatingadmissionpolicy.go | 243 + .../validatingadmissionpolicybinding.go | 197 + .../v1/authentication_client.go | 5 + .../authentication/v1/generated_expansion.go | 2 + .../authentication/v1/selfsubjectreview.go | 64 + .../typed/extensions/v1beta1/networkpolicy.go | 48 - .../typed/networking/v1/networkpolicy.go | 48 - .../vendor/k8s.io/client-go/openapi/client.go | 7 +- .../k8s.io/client-go/openapi/groupversion.go | 42 +- .../k8s.io/client-go/openapi/typeconverter.go | 48 + .../plugin/pkg/client/auth/exec/exec.go | 6 +- tools/vendor/k8s.io/client-go/rest/config.go | 10 +- tools/vendor/k8s.io/client-go/rest/request.go | 28 +- .../vendor/k8s.io/client-go/rest/url_utils.go | 4 +- .../k8s.io/client-go/tools/cache/OWNERS | 4 +- .../client-go/tools/cache/controller.go | 4 - .../client-go/tools/cache/object-names.go | 65 + .../k8s.io/client-go/tools/cache/reflector.go | 30 +- .../client-go/tools/cache/shared_informer.go | 37 +- .../k8s.io/client-go/tools/cache/store.go | 31 +- .../client-go/tools/clientcmd/api/types.go | 14 +- .../client-go/tools/clientcmd/loader.go | 24 +- .../k8s.io/client-go/tools/metrics/metrics.go | 48 + .../k8s.io/client-go/tools/pager/pager.go | 36 +- .../k8s.io/client-go/tools/record/event.go | 5 +- .../client-go/tools/watch/retrywatcher.go | 7 +- .../k8s.io/client-go/transport/cache.go | 6 + .../vendor/k8s.io/client-go/util/cert/cert.go | 34 +- .../k8s.io/component-base/metrics/http.go | 18 +- .../metrics/legacyregistry/registry.go | 8 +- .../metrics/prometheus/feature/metrics.go | 2 +- .../k8s.io/component-base/metrics/registry.go | 12 +- .../k8s.io/component-base/version/dynamic.go | 77 + .../k8s.io/component-base/version/version.go | 2 +- tools/vendor/k8s.io/klog/v2/format.go | 65 + .../klog/v2/internal/serialize/keyvalues.go | 47 +- tools/vendor/k8s.io/klog/v2/k8s_references.go | 12 +- tools/vendor/k8s.io/klog/v2/klog.go | 13 + .../k8s.io/kube-openapi/pkg/cached/cache.go | 166 +- .../kube-openapi/pkg/handler3/handler.go | 2 +- .../kube-openapi/pkg/util/proto/document.go | 2 +- .../pkg/util/proto/document_v3.go | 2 +- .../pkg/validation/spec/gnostic.go | 2 +- .../pkg/validation/strfmt/format.go | 81 - .../validation/validate/object_validator.go | 16 +- .../pkg/validation/validate/schema.go | 36 +- .../pkg/validation/validate/schema_option.go | 7 + .../validation/validate/slice_validator.go | 7 +- .../pkg/validation/validate/validator.go | 4 +- tools/vendor/k8s.io/utils/set/OWNERS | 8 + tools/vendor/k8s.io/utils/set/ordered.go | 53 + tools/vendor/k8s.io/utils/set/set.go | 229 + tools/vendor/k8s.io/utils/trace/trace.go | 19 + tools/vendor/modules.txt | 414 +- .../oras.land/oras-go/pkg/content/oci.go | 5 +- .../konnectivity-client/pkg/client/client.go | 19 +- .../pkg/client/metrics/metrics.go | 2 + .../tools/setup-envtest/README.md | 4 +- .../crd/markers/zz_generated.markerhelp.go | 1 - .../pkg/crd/zz_generated.markerhelp.go | 1 - .../controller-tools/pkg/deepcopy/gen.go | 1 - .../controller-tools/pkg/deepcopy/traverse.go | 3 +- .../pkg/deepcopy/zz_generated.markerhelp.go | 1 - .../pkg/genall/zz_generated.markerhelp.go | 1 - .../pkg/rbac/zz_generated.markerhelp.go | 1 - .../schemapatcher/zz_generated.markerhelp.go | 1 - .../controller-tools/pkg/webhook/parser.go | 85 +- .../pkg/webhook/zz_generated.markerhelp.go | 5 +- .../kustomize/api/filters/imagetag/updater.go | 2 +- .../kustomize/api/filters/nameref/nameref.go | 8 +- .../api/filters/namespace/namespace.go | 20 +- .../filters/patchjson6902/patchjson6902.go | 2 +- .../api/filters/replacement/replacement.go | 75 +- .../sigs.k8s.io/kustomize/api/ifc/ifc.go | 8 + .../accumulator/loadconfigfromcrds.go | 4 +- .../internal/accumulator/resaccumulator.go | 3 +- .../builtins/AnnotationsTransformer.go | 2 +- .../internal/builtins/ConfigMapGenerator.go | 2 +- .../api/internal/builtins/HashTransformer.go | 2 +- .../builtins/HelmChartInflationGenerator.go | 114 +- .../internal/builtins/IAMPolicyGenerator.go | 2 +- .../internal/builtins/ImageTagTransformer.go | 2 +- .../api/internal/builtins/LabelTransformer.go | 2 +- .../builtins/LegacyOrderTransformer.go | 46 - .../internal/builtins/NamespaceTransformer.go | 2 +- .../builtins/PatchJson6902Transformer.go | 8 +- .../PatchStrategicMergeTransformer.go | 2 +- .../api/internal/builtins/PatchTransformer.go | 146 +- .../internal/builtins/PrefixTransformer.go | 2 +- .../builtins/ReplacementTransformer.go | 2 +- .../builtins/ReplicaCountTransformer.go | 2 +- .../api/internal/builtins/SecretGenerator.go | 2 +- .../internal/builtins/SortOrderTransformer.go | 244 + .../internal/builtins/SuffixTransformer.go | 2 +- .../internal/builtins/ValueAddTransformer.go | 2 +- .../api/internal/generators/utils.go | 27 + .../kustomize/api/internal/git/cloner.go | 8 +- .../kustomize/api/internal/git/gitrunner.go | 8 +- .../kustomize/api/internal/git/repospec.go | 372 +- .../api/{ => internal}/image/image.go | 0 .../builtinpluginconsts/commonannotations.go | 0 .../builtinpluginconsts/commonlabels.go | 48 +- .../builtinpluginconsts/defaultconfig.go | 2 + .../konfig/builtinpluginconsts/doc.go | 0 .../konfig/builtinpluginconsts/images.go | 0 .../builtinpluginconsts/metadatalabels.go | 51 + .../konfig/builtinpluginconsts/nameprefix.go | 0 .../builtinpluginconsts/namereference.go | 0 .../konfig/builtinpluginconsts/namespace.go | 0 .../konfig/builtinpluginconsts/namesuffix.go | 0 .../konfig/builtinpluginconsts/replicas.go | 0 .../builtinpluginconsts/templatelabels.go | 8 + .../builtinpluginconsts/varreference.go | 0 .../api/{ => internal}/loader/errors.go | 0 .../api/{ => internal}/loader/fileloader.go | 168 +- .../api/{ => internal}/loader/loader.go | 0 .../{ => internal}/loader/loadrestrictions.go | 0 .../api/internal/localizer/builtinplugins.go | 152 + .../kustomize/api/internal/localizer/doc.go | 7 + .../api/internal/localizer/errors.go | 27 + .../api/internal/localizer/localizer.go | 613 + .../api/internal/localizer/locloader.go | 135 + .../kustomize/api/internal/localizer/util.go | 218 + .../builtinconfig/namebackreferences.go | 15 +- .../builtinconfig/transformerconfig.go | 71 +- .../builtinplugintype_string.go | 29 +- .../plugins/builtinhelpers/builtins.go | 5 +- .../internal/plugins/execplugin/execplugin.go | 13 +- .../api/internal/plugins/fnplugin/fnplugin.go | 15 +- .../api/internal/plugins/loader/loader.go | 55 +- .../target/errmissingkustomization.go | 10 +- .../api/internal/target/kusttarget.go | 99 +- .../target/kusttarget_configplugin.go | 8 +- .../api/internal/utils/errtimeout.go | 13 +- .../api/internal/utils/makeResIds.go | 13 +- .../kustomize/api/internal/utils/timedcall.go | 2 +- .../kustomize/api/krusty/kustomizer.go | 58 +- .../kustomize/api/krusty/localizer/runner.go | 17 + .../kustomize/api/krusty/options.go | 30 +- .../vendor/sigs.k8s.io/kustomize/api/kv/kv.go | 56 +- .../kustomize/api/pkg/loader/loader.go | 24 + .../kustomize/api/provenance/provenance.go | 58 +- .../kustomize/api/resmap/factory.go | 6 +- .../kustomize/api/resmap/reswrangler.go | 9 +- .../kustomize/api/resource/factory.go | 20 +- .../kustomize/api/resource/origin.go | 2 +- .../kustomize/api/resource/resource.go | 11 +- .../api/types/erronlybuiltinpluginsallowed.go | 10 +- .../kustomize/api/types/errunabletofind.go | 10 +- .../kustomize/api/types/fieldspec.go | 9 + .../sigs.k8s.io/kustomize/api/types/fix.go | 54 - .../kustomize/api/types/generatorargs.go | 2 +- .../kustomize/api/types/helmchartargs.go | 74 +- .../kustomize/api/types/inventory.go | 16 - .../kustomize/api/types/kustomization.go | 115 +- .../kustomize/api/types/pluginconfig.go | 6 +- .../kustomize/api/types/sortoptions.go | 28 + .../kustomize/cmd/config/configcobra/cfg.go | 11 +- .../kustomize/cmd/config/configcobra/cmds.go | 27 +- .../kustomize/cmd/config/configcobra/fn.go | 7 +- .../cmd/config/internal/commands/annotate.go | 147 - .../internal/commands/cmdcreatesetter.go | 230 - .../commands/cmdcreatesubstitution.go | 104 - .../internal/commands/cmddeletesetter.go | 102 - .../commands/cmddeletesubstitution.go | 98 - .../cmd/config/internal/commands/cmdinit.go | 63 - .../internal/commands/cmdlistsetters.go | 193 - .../cmd/config/internal/commands/cmdset.go | 140 - .../cmd/config/internal/commands/cmdwrap.go | 148 - .../cmd/config/internal/commands/cmdxargs.go | 234 - .../cmd/config/internal/commands/fmt.go | 134 - .../cmd/config/internal/commands/grep.go | 3 +- .../cmd/config/internal/commands/merge.go | 71 - .../cmd/config/internal/commands/merge3.go | 63 - .../cmd/config/internal/commands/sink.go | 64 - .../cmd/config/internal/commands/source.go | 91 - .../config/internal/generateddocs/api/docs.go | 4 +- .../kustomize/cmd/config/runner/runner.go | 1 - .../v4/commands/build/reorderoutput.go | 54 - .../v4/commands/build/reorderoutput_string.go | 25 - .../v4/commands/edit/add/flagsandargs.go | 107 - .../kustomize/v4/commands/version/version.go | 33 - .../kustomize/kustomize/{v4 => v5}/LICENSE | 0 .../{v4 => v5}/commands/build/build.go | 34 +- .../commands/build/flagaddmanagedby.go | 0 .../commands/build/flagenablehelm.go | 10 + .../commands/build/flagenableplugins.go | 0 .../commands/build/flagloadrestrictor.go | 0 .../commands/build/flagoutputpath.go | 0 .../commands/build/flagsforfunctions.go | 0 .../v5/commands/build/reorderoutput.go | 50 + .../{v4 => v5}/commands/build/writer.go | 0 .../kustomize/{v4 => v5}/commands/commands.go | 12 +- .../{v4 => v5}/commands/create/create.go | 10 +- .../{v4 => v5}/commands/edit/add/addbase.go | 2 +- .../commands/edit/add/addbuildmetadata.go | 4 +- .../commands/edit/add/addcomponent.go | 10 +- .../commands/edit/add/addconfigmap.go} | 146 +- .../commands/edit/add/addgenerator.go | 6 +- .../commands/edit/add/addmetadata.go | 20 +- .../{v4 => v5}/commands/edit/add/addpatch.go | 4 +- .../commands/edit/add/addresource.go | 14 +- .../commands/edit/add/addsecret.go} | 124 +- .../commands/edit/add/addtransformer.go | 6 +- .../{v4 => v5}/commands/edit/add/all.go | 2 +- .../kustomize/{v4 => v5}/commands/edit/all.go | 19 +- .../{v4 => v5}/commands/edit/fix/convert.go | 8 +- .../{v4 => v5}/commands/edit/fix/fix.go | 11 +- .../commands/edit/listbuiltin/listbuiltin.go | 0 .../{v4 => v5}/commands/edit/remove/all.go | 10 +- .../edit/remove/removebuildmetadata.go | 4 +- .../commands/edit/remove/removeconfigmap.go | 117 + .../commands/edit/remove/removemetadata.go | 2 +- .../commands/edit/remove/removepatch.go | 6 +- .../commands/edit/remove/removeresource.go | 2 +- .../v5/commands/edit/remove/removesecret.go | 117 + .../commands/edit/remove/removetransformer.go | 2 +- .../{v4 => v5}/commands/edit/set/all.go | 11 +- .../commands/edit/set/set_name_prefix.go | 4 +- .../commands/edit/set/set_name_suffix.go | 4 +- .../commands/edit/set/setannotation.go | 4 +- .../commands/edit/set/setbuildmetadata.go | 4 +- .../v5/commands/edit/set/setconfigmap.go | 151 + .../{v4 => v5}/commands/edit/set/setimage.go | 2 +- .../{v4 => v5}/commands/edit/set/setlabel.go | 4 +- .../commands/edit/set/setnamespace.go | 2 +- .../commands/edit/set/setreplicas.go | 2 +- .../internal/kustfile/kustomizationfile.go | 29 +- .../util/configmapSecretFlagsAndArgs.go | 217 + .../{v4 => v5}/commands/internal/util/util.go | 60 +- .../commands/internal/util/validate.go | 2 +- .../v5/commands/localize/localize.go | 94 + .../commands/openapi/fetch/fetch.go | 0 .../{v4 => v5}/commands/openapi/info/info.go | 0 .../{v4 => v5}/commands/openapi/openapi.go | 4 +- .../kustomize/v5/commands/version/version.go | 86 + .../kustomize/kustomize/{v4 => v5}/main.go | 2 +- .../kustomize/kyaml/errors/errors.go | 10 + .../kustomize/kyaml/filesys/confirmeddir.go | 6 +- .../kustomize/kyaml/filesys/fsondisk.go | 12 +- .../kustomize/kyaml/filesys/util.go | 42 +- .../kustomize/kyaml/fn/runtime/exec/exec.go | 2 +- .../fn/runtime/runtimeutil/functiontypes.go | 50 +- .../fn/runtime/runtimeutil/runtimeutil.go | 4 +- .../kyaml/fn/runtime/starlark/starlark.go | 6 +- .../github.com/qri-io/starlib/util/util.go | 6 +- .../kustomize/kyaml/kio/byteio_writer.go | 2 +- .../kustomize/kyaml/krmfile/doc.go | 19 - .../kustomize/kyaml/krmfile/krmfile.go | 10 - .../kustomize/kyaml/openapi/Makefile | 18 +- .../kustomize/kyaml/openapi/README.md | 46 +- .../openapi/kubernetesapi/openapiinfo.go | 6 +- .../openapi/kubernetesapi/v1212/swagger.go | 249 - .../openapi/kubernetesapi/v1_21_2/swagger.go | 249 + .../{v1212 => v1_21_2}/swagger.pb | 60072 ++++++++-------- .../kyaml/openapi/kustomizationapi/swagger.go | 3 +- .../kustomize/kyaml/openapi/openapi.go | 140 +- .../sigs.k8s.io/kustomize/kyaml/resid/gvk.go | 33 +- .../kustomize/kyaml/resid/resid.go | 19 - .../kustomize/kyaml/runfn/runfn.go | 5 +- .../kustomize/kyaml/sets/string.go | 2 +- .../kustomize/kyaml/setters2/add.go | 302 - .../kustomize/kyaml/setters2/delete.go | 171 - .../kustomize/kyaml/setters2/doc.go | 163 - .../kustomize/kyaml/setters2/list.go | 195 - .../kustomize/kyaml/setters2/set.go | 540 - .../setters2/settersutil/deletercreator.go | 55 - .../kyaml/setters2/settersutil/fieldsetter.go | 139 - .../setters2/settersutil/settercreator.go | 209 - .../settersutil/substitutioncreator.go | 466 - .../kustomize/kyaml/setters2/types.go | 74 - .../kustomize/kyaml/setters2/util.go | 31 - .../kustomize/kyaml/setters2/walk.go | 124 - .../kustomize/kyaml/utils/pathsplitter.go | 7 + .../sigs.k8s.io/kustomize/kyaml/yaml/alias.go | 12 +- .../kustomize/kyaml/yaml/compatibility.go | 6 +- .../kustomize/kyaml/yaml/filters.go | 2 +- .../sigs.k8s.io/kustomize/kyaml/yaml/fns.go | 138 +- .../sigs.k8s.io/kustomize/kyaml/yaml/kfns.go | 2 +- .../sigs.k8s.io/kustomize/kyaml/yaml/match.go | 92 +- .../kustomize/kyaml/yaml/merge2/merge2.go | 10 +- .../sigs.k8s.io/kustomize/kyaml/yaml/rnode.go | 216 +- .../sigs.k8s.io/kustomize/kyaml/yaml/types.go | 63 +- .../kyaml/yaml/walk/associative_sequence.go | 2 +- .../kustomize/kyaml/yaml/walk/map.go | 21 +- tools/vendor/sigs.k8s.io/yaml/LICENSE | 256 + tools/vendor/sigs.k8s.io/yaml/OWNERS | 8 +- tools/vendor/sigs.k8s.io/yaml/fields.go | 55 +- .../vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE | 201 + .../yaml/goyaml.v2/LICENSE.libyaml | 31 + .../go-yaml/yaml => yaml/goyaml.v2}/NOTICE | 0 .../vendor/sigs.k8s.io/yaml/goyaml.v2/OWNERS | 24 + .../sigs.k8s.io/yaml/goyaml.v2/README.md | 143 + .../vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go | 744 + .../sigs.k8s.io/yaml/goyaml.v2/decode.go | 815 + .../sigs.k8s.io/yaml/goyaml.v2/emitterc.go | 1685 + .../sigs.k8s.io/yaml/goyaml.v2/encode.go | 390 + .../sigs.k8s.io/yaml/goyaml.v2/parserc.go | 1095 + .../sigs.k8s.io/yaml/goyaml.v2/readerc.go | 412 + .../sigs.k8s.io/yaml/goyaml.v2/resolve.go | 258 + .../sigs.k8s.io/yaml/goyaml.v2/scannerc.go | 2711 + .../sigs.k8s.io/yaml/goyaml.v2/sorter.go | 113 + .../sigs.k8s.io/yaml/goyaml.v2/writerc.go | 26 + .../vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go | 478 + .../sigs.k8s.io/yaml/goyaml.v2/yamlh.go | 739 + .../yaml/goyaml.v2/yamlprivateh.go | 173 + .../go-yaml/yaml => yaml/goyaml.v3}/LICENSE | 0 .../vendor/sigs.k8s.io/yaml/goyaml.v3/NOTICE | 13 + .../vendor/sigs.k8s.io/yaml/goyaml.v3/OWNERS | 24 + .../go-yaml/yaml => yaml/goyaml.v3}/README.md | 10 + .../go-yaml/yaml => yaml/goyaml.v3}/apic.go | 0 .../go-yaml/yaml => yaml/goyaml.v3}/decode.go | 78 +- .../yaml => yaml/goyaml.v3}/emitterc.go | 57 +- .../go-yaml/yaml => yaml/goyaml.v3}/encode.go | 0 .../yaml => yaml/goyaml.v3}/parserc.go | 11 +- .../sigs.k8s.io/yaml/goyaml.v3/patch.go | 39 + .../yaml => yaml/goyaml.v3}/readerc.go | 0 .../yaml => yaml/goyaml.v3}/resolve.go | 0 .../yaml => yaml/goyaml.v3}/scannerc.go | 0 .../go-yaml/yaml => yaml/goyaml.v3}/sorter.go | 0 .../yaml => yaml/goyaml.v3}/writerc.go | 0 .../go-yaml/yaml => yaml/goyaml.v3}/yaml.go | 10 - .../go-yaml/yaml => yaml/goyaml.v3}/yamlh.go | 0 .../yaml => yaml/goyaml.v3}/yamlprivateh.go | 0 tools/vendor/sigs.k8s.io/yaml/yaml.go | 145 +- tools/vendor/sigs.k8s.io/yaml/yaml_go110.go | 17 + 1913 files changed, 195328 insertions(+), 92952 deletions(-) create mode 100644 tools/vendor/github.com/AdaLogics/go-fuzz-headers/LICENSE create mode 100644 tools/vendor/github.com/AdaLogics/go-fuzz-headers/README.md create mode 100644 tools/vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go create mode 100644 tools/vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go create mode 100644 tools/vendor/github.com/AdaLogics/go-fuzz-headers/sql.go create mode 100644 tools/vendor/github.com/Azure/go-ansiterm/SECURITY.md create mode 100644 tools/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/internal/fs/security.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/doc.go create mode 100644 tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/mkwinsyscall.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/SECURITY.md delete mode 100644 tools/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/log/context.go delete mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/log/g.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/log/hook.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/memory/types.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go rename tools/vendor/github.com/Microsoft/{go-winio/pkg => hcsshim/internal}/security/grantvmgroupaccess.go (63%) rename tools/vendor/github.com/Microsoft/{go-winio/pkg => hcsshim/internal}/security/syscall_windows.go (100%) rename tools/vendor/github.com/Microsoft/{go-winio/pkg => hcsshim/internal}/security/zsyscall_windows.go (100%) create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go rename tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/{baselayer.go => baselayerwriter.go} (99%) create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/ofreg.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go create mode 100644 tools/vendor/github.com/Microsoft/hcsshim/tools.go rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/LICENSE (100%) create mode 100644 tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn.go (72%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_config.go (84%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_config_set.go (81%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_deserialization_options.go (96%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_deserializer.go (99%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_simulator.go (94%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_state.go (97%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/atn_type.go (79%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/char_stream.go (82%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/common_token_factory.go (96%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/common_token_stream.go (98%) create mode 100644 tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/dfa.go (80%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/dfa_serializer.go (97%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/dfa_state.go (90%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/diagnostic_error_listener.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/error_listener.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/error_strategy.go (99%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/errors.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/file_stream.go (92%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/input_stream.go (96%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/int_stream.go (82%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/interval_set.go (98%) create mode 100644 tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/lexer.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/lexer_action.go (91%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/lexer_action_executor.go (88%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/lexer_atn_simulator.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/ll1_analyzer.go (87%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/parser.go (99%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/parser_atn_simulator.go (94%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/parser_rule_context.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/prediction_context.go (81%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/prediction_mode.go (95%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/recognizer.go (92%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/rule_context.go (97%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/semantic_context.go (85%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/token.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/token_source.go (85%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/token_stream.go (87%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/tokenstream_rewriter.go (58%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/trace_listener.go (93%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/transition.go (99%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/tree.go (98%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/trees.go (93%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/utils.go (94%) rename tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/{ => v4}/utils_set.go (80%) delete mode 100644 tools/vendor/github.com/cenkalti/backoff/v4/.travis.yml create mode 100644 tools/vendor/github.com/cespare/xxhash/v2/testall.sh create mode 100644 tools/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s rename tools/vendor/github.com/cespare/xxhash/v2/{xxhash_amd64.go => xxhash_asm.go} (73%) create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/container.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/container.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/container_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/content.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/content.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/content_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/doc.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/image.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/image.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/image_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/namespace.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/namespace.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/namespace_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/snapshot.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/snapshot.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/snapshot_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/task.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/task.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/events/task_fieldpath.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/doc.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_grpc.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_ttrpc.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/descriptor.proto rename tools/vendor/github.com/containerd/containerd/{mount/subprocess_unsafe_linux.s => api/types/doc.go} (97%) create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/metrics.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/metrics.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/mount.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/mount.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/platform.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/platform.proto create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/sandbox.pb.go create mode 100644 tools/vendor/github.com/containerd/containerd/api/types/sandbox.proto rename tools/vendor/github.com/containerd/containerd/{mount/subprocess_unsafe_linux.go => archive/compression/compression_fuzzer.go} (68%) rename tools/vendor/github.com/containerd/containerd/{sys/userns_deprecated.go => archive/link_default.go} (68%) create mode 100644 tools/vendor/github.com/containerd/containerd/archive/link_freebsd.go create mode 100644 tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader.go create mode 100644 tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader_unix.go create mode 100644 tools/vendor/github.com/containerd/containerd/content/local/content_local_fuzzer.go rename tools/vendor/github.com/containerd/containerd/{sys/fds.go => content/local/test_helper.go} (65%) create mode 100644 tools/vendor/github.com/containerd/containerd/events/events.go create mode 100644 tools/vendor/github.com/containerd/containerd/metadata/sandbox.go delete mode 100644 tools/vendor/github.com/containerd/containerd/mount/fmountat_linux.go create mode 100644 tools/vendor/github.com/containerd/containerd/mount/mount_unsupported.go create mode 100644 tools/vendor/github.com/containerd/containerd/pkg/cleanup/context.go create mode 100644 tools/vendor/github.com/containerd/containerd/pkg/epoch/context.go create mode 100644 tools/vendor/github.com/containerd/containerd/pkg/epoch/epoch.go create mode 100644 tools/vendor/github.com/containerd/containerd/pkg/randutil/randutil.go create mode 100644 tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go create mode 100644 tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go create mode 100644 tools/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go rename tools/vendor/github.com/containerd/{continuity/fs/copy_freebsd.go => containerd/platforms/platforms_other.go} (67%) create mode 100644 tools/vendor/github.com/containerd/containerd/platforms/platforms_windows.go create mode 100644 tools/vendor/github.com/containerd/containerd/protobuf/any.go rename tools/vendor/github.com/containerd/containerd/{sys/socket_windows.go => protobuf/compare.go} (58%) create mode 100644 tools/vendor/github.com/containerd/containerd/protobuf/plugin/doc.go create mode 100644 tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.pb.go rename tools/vendor/github.com/{gogo/protobuf/types/doc.go => containerd/containerd/protobuf/plugin/fieldpath.proto} (74%) rename tools/vendor/github.com/containerd/{continuity/fs/copy_device_unix.go => containerd/protobuf/proto/proto.go} (64%) create mode 100644 tools/vendor/github.com/containerd/containerd/protobuf/timestamp.go rename tools/vendor/github.com/containerd/{continuity/fs/copy_darwin.go => containerd/protobuf/types/types.go} (63%) create mode 100644 tools/vendor/github.com/containerd/containerd/reference/docker/helpers.go create mode 100644 tools/vendor/github.com/containerd/containerd/reference/docker/normalize.go create mode 100644 tools/vendor/github.com/containerd/containerd/reference/docker/reference.go create mode 100644 tools/vendor/github.com/containerd/containerd/reference/docker/regexp.go create mode 100644 tools/vendor/github.com/containerd/containerd/reference/docker/sort.go create mode 100644 tools/vendor/github.com/containerd/containerd/remotes/docker/converter_fuzz.go create mode 100644 tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher_fuzz.go create mode 100644 tools/vendor/github.com/containerd/containerd/sandbox/bridge.go create mode 100644 tools/vendor/github.com/containerd/containerd/sandbox/controller.go create mode 100644 tools/vendor/github.com/containerd/containerd/sandbox/helpers.go create mode 100644 tools/vendor/github.com/containerd/containerd/sandbox/store.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/epoll.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/filesys_unix.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/filesys_windows.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/oom_linux.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/oom_unsupported.go delete mode 100644 tools/vendor/github.com/containerd/containerd/sys/socket_unix.go create mode 100644 tools/vendor/github.com/containerd/containerd/tracing/helpers.go create mode 100644 tools/vendor/github.com/containerd/containerd/tracing/log.go create mode 100644 tools/vendor/github.com/containerd/containerd/tracing/tracing.go create mode 100644 tools/vendor/github.com/containerd/continuity/fs/copy_irregular_freebsd.go create mode 100644 tools/vendor/github.com/containerd/continuity/fs/copy_irregular_unix.go delete mode 100644 tools/vendor/github.com/containerd/continuity/sysx/generate.sh create mode 100644 tools/vendor/github.com/containerd/ttrpc/.gitattributes create mode 100644 tools/vendor/github.com/containerd/ttrpc/.golangci.yml create mode 100644 tools/vendor/github.com/containerd/ttrpc/Makefile create mode 100644 tools/vendor/github.com/containerd/ttrpc/PROTOCOL.md create mode 100644 tools/vendor/github.com/containerd/ttrpc/Protobuild.toml create mode 100644 tools/vendor/github.com/containerd/ttrpc/doc.go create mode 100644 tools/vendor/github.com/containerd/ttrpc/errors.go create mode 100644 tools/vendor/github.com/containerd/ttrpc/request.pb.go create mode 100644 tools/vendor/github.com/containerd/ttrpc/request.proto create mode 100644 tools/vendor/github.com/containerd/ttrpc/stream.go create mode 100644 tools/vendor/github.com/containerd/ttrpc/stream_server.go create mode 100644 tools/vendor/github.com/containerd/ttrpc/test.proto delete mode 100644 tools/vendor/github.com/containerd/ttrpc/types.go create mode 100644 tools/vendor/github.com/containerd/typeurl/v2/.gitignore create mode 100644 tools/vendor/github.com/containerd/typeurl/v2/LICENSE create mode 100644 tools/vendor/github.com/containerd/typeurl/v2/README.md create mode 100644 tools/vendor/github.com/containerd/typeurl/v2/doc.go create mode 100644 tools/vendor/github.com/containerd/typeurl/v2/types.go create mode 100644 tools/vendor/github.com/docker/distribution/.dockerignore delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/any.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/any.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/api.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/duration.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/duration.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/duration_gogo.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/empty.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/field_mask.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/protosize.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/source_context.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/struct.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/timestamp.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/timestamp.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/type.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/wrappers.pb.go delete mode 100644 tools/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/errors.go create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/README.md create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/doc.go create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/iofs.go create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.down.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.up.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/3_foobar.up.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.down.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.up.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/5_foobar.down.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.down.sql create mode 100644 tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.up.sql create mode 100644 tools/vendor/github.com/google/cel-go/common/types/optional.go rename tools/vendor/github.com/google/cel-go/{interpreter/coster.go => common/types/traits/zeroer.go} (50%) create mode 100644 tools/vendor/github.com/google/cel-go/ext/bindings.go create mode 100644 tools/vendor/github.com/google/cel-go/ext/math.go create mode 100644 tools/vendor/github.com/google/cel-go/ext/native.go create mode 100644 tools/vendor/github.com/google/cel-go/ext/protos.go create mode 100644 tools/vendor/github.com/google/cel-go/ext/sets.go create mode 100644 tools/vendor/github.com/google/cel-go/interpreter/formatting.go create mode 100644 tools/vendor/github.com/google/gnostic-models/LICENSE create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/README.md create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/context.go create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/error.go create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/extensions.go create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/helpers.go rename tools/vendor/{go.etcd.io/etcd/api/v3/v3rpc/rpctypes/doc.go => github.com/google/gnostic-models/compiler/main.go} (71%) create mode 100644 tools/vendor/github.com/google/gnostic-models/compiler/reader.go create mode 100644 tools/vendor/github.com/google/gnostic-models/extensions/README.md create mode 100644 tools/vendor/github.com/google/gnostic-models/extensions/extension.pb.go create mode 100644 tools/vendor/github.com/google/gnostic-models/extensions/extension.proto create mode 100644 tools/vendor/github.com/google/gnostic-models/extensions/extensions.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/README.md create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/base.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/display.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/models.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/operations.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/reader.go create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/schema.json create mode 100644 tools/vendor/github.com/google/gnostic-models/jsonschema/writer.go create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.pb.go create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/README.md create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/document.go create mode 100644 tools/vendor/github.com/google/gnostic-models/openapiv2/openapi-2.0.json rename tools/vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.go (99%) rename tools/vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.pb.go (99%) rename tools/vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.proto (99%) rename tools/vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/README.md (89%) rename tools/vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/document.go (96%) delete mode 100644 tools/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go delete mode 100644 tools/vendor/github.com/google/gnostic/openapiv3/annotations.proto delete mode 100644 tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json delete mode 100644 tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json create mode 100644 tools/vendor/github.com/google/go-containerregistry/internal/compression/compression.go create mode 100644 tools/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.go create mode 100644 tools/vendor/github.com/google/go-containerregistry/pkg/compression/compression.go create mode 100644 tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go create mode 100644 tools/vendor/github.com/hashicorp/errwrap/LICENSE create mode 100644 tools/vendor/github.com/hashicorp/errwrap/README.md create mode 100644 tools/vendor/github.com/hashicorp/errwrap/errwrap.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/LICENSE create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/Makefile create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/README.md create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/append.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/flatten.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/format.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/group.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/multierror.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/prefix.go create mode 100644 tools/vendor/github.com/hashicorp/go-multierror/sort.go delete mode 100644 tools/vendor/github.com/huandu/xstrings/.travis.yml create mode 100644 tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go create mode 100644 tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s create mode 100644 tools/vendor/github.com/klauspost/compress/huff0/decompress_generic.go create mode 100644 tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go create mode 100644 tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go create mode 100644 tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s create mode 100644 tools/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go create mode 100644 tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_math_functions.go create mode 100644 tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_os_trace.go create mode 100644 tools/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsdlike.go create mode 100644 tools/vendor/github.com/moby/sys/mountinfo/mountinfo_openbsd.go rename tools/vendor/{go.etcd.io/etcd/api/v3 => github.com/moby/sys/sequential}/LICENSE (100%) create mode 100644 tools/vendor/github.com/moby/sys/sequential/doc.go create mode 100644 tools/vendor/github.com/moby/sys/sequential/sequential_unix.go create mode 100644 tools/vendor/github.com/moby/sys/sequential/sequential_windows.go create mode 100644 tools/vendor/github.com/moby/term/doc.go delete mode 100644 tools/vendor/github.com/moby/term/tc.go create mode 100644 tools/vendor/github.com/moby/term/term_unix.go rename tools/vendor/github.com/moby/term/{termios.go => termios_unix.go} (50%) create mode 100644 tools/vendor/github.com/moby/term/termios_windows.go delete mode 100644 tools/vendor/github.com/moby/term/winsize.go delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/.gitignore delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/.travis.yml delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/LICENSE.md delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/README.md delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/csv.go delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/table.go delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/table_with_color.go delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/util.go delete mode 100644 tools/vendor/github.com/olekukonko/tablewriter/wrap.go create mode 100644 tools/vendor/github.com/operator-framework/ansible-operator-plugins/LICENSE create mode 100644 tools/vendor/github.com/operator-framework/ansible-operator-plugins/internal/version/version.go rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/api.go (96%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/constants/constants.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/init.go (96%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/plugin.go (95%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/api.go (76%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/init.go (72%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/crd/crd.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/crd/kustomization.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/rbac/role.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/debug_logs_patch.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/kustomization.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/manager_image.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/always_pull_patch.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/ifnotpresent_pull_patch.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/never_pull_patch.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go (95%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/gitignore.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/makefile.go (98%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/converge.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/create.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/destroy.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go (91%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/prepare.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/tasks_test_resource.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/verify.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/converge.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/create.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/destroy.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go (92%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/playbooks/placeholder.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/playbooks/playbook.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/requirements.go (94%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go (93%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go (92%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go (93%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go (97%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/placeholder.go (100%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go (96%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go (92%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go (92%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go (92%) rename tools/vendor/github.com/operator-framework/{operator-sdk/internal => ansible-operator-plugins/pkg}/plugins/ansible/v1/scaffolds/internal/templates/watches.go (100%) create mode 100644 tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/plugins.go create mode 100644 tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/cleanup.go create mode 100644 tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/message.go create mode 100644 tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/errors.go create mode 100644 tools/vendor/github.com/prometheus/client_golang/prometheus/vnext.go create mode 100644 tools/vendor/github.com/prometheus/common/model/value_float.go create mode 100644 tools/vendor/github.com/prometheus/common/model/value_histogram.go create mode 100644 tools/vendor/github.com/prometheus/common/model/value_type.go rename tools/vendor/{go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go => github.com/prometheus/procfs/cpuinfo_loong64.go} (73%) create mode 100644 tools/vendor/github.com/prometheus/procfs/fs_statfs_notype.go create mode 100644 tools/vendor/github.com/prometheus/procfs/fs_statfs_type.go create mode 100644 tools/vendor/github.com/prometheus/procfs/net_wireless.go create mode 100644 tools/vendor/github.com/prometheus/procfs/proc_interrupts.go create mode 100644 tools/vendor/github.com/prometheus/procfs/thread.go create mode 100644 tools/vendor/github.com/xlab/treeprint/.gitignore delete mode 100644 tools/vendor/go.etcd.io/bbolt/.travis.yml create mode 100644 tools/vendor/go.etcd.io/bbolt/bolt_loong64.go create mode 100644 tools/vendor/go.etcd.io/bbolt/tx_check.go delete mode 100644 tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/wrappederror.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64.go delete mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64/asyncfloat64.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64.go delete mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64/asyncint64.go delete mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/config.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/http.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/net.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/doc.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/exception.go rename tools/vendor/{go.etcd.io/etcd/api/v3/v3rpc/rpctypes/md.go => go.opentelemetry.io/otel/semconv/v1.17.0/http.go} (71%) create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/httpconv/http.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go create mode 100644 tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go delete mode 100644 tools/vendor/go.uber.org/atomic/.codecov.yml delete mode 100644 tools/vendor/go.uber.org/atomic/.gitignore delete mode 100644 tools/vendor/go.uber.org/atomic/CHANGELOG.md delete mode 100644 tools/vendor/go.uber.org/atomic/LICENSE.txt delete mode 100644 tools/vendor/go.uber.org/atomic/Makefile delete mode 100644 tools/vendor/go.uber.org/atomic/README.md delete mode 100644 tools/vendor/go.uber.org/atomic/bool.go delete mode 100644 tools/vendor/go.uber.org/atomic/doc.go delete mode 100644 tools/vendor/go.uber.org/atomic/duration.go delete mode 100644 tools/vendor/go.uber.org/atomic/duration_ext.go delete mode 100644 tools/vendor/go.uber.org/atomic/error.go delete mode 100644 tools/vendor/go.uber.org/atomic/float32.go delete mode 100644 tools/vendor/go.uber.org/atomic/float32_ext.go delete mode 100644 tools/vendor/go.uber.org/atomic/float64.go delete mode 100644 tools/vendor/go.uber.org/atomic/float64_ext.go delete mode 100644 tools/vendor/go.uber.org/atomic/gen.go delete mode 100644 tools/vendor/go.uber.org/atomic/int32.go delete mode 100644 tools/vendor/go.uber.org/atomic/int64.go delete mode 100644 tools/vendor/go.uber.org/atomic/nocmp.go delete mode 100644 tools/vendor/go.uber.org/atomic/pointer_go118.go delete mode 100644 tools/vendor/go.uber.org/atomic/pointer_go119.go delete mode 100644 tools/vendor/go.uber.org/atomic/string.go delete mode 100644 tools/vendor/go.uber.org/atomic/string_ext.go delete mode 100644 tools/vendor/go.uber.org/atomic/time_ext.go delete mode 100644 tools/vendor/go.uber.org/atomic/uint32.go delete mode 100644 tools/vendor/go.uber.org/atomic/uint64.go delete mode 100644 tools/vendor/go.uber.org/atomic/uintptr.go delete mode 100644 tools/vendor/go.uber.org/atomic/unsafe_pointer.go delete mode 100644 tools/vendor/go.uber.org/atomic/value.go rename tools/vendor/go.uber.org/{atomic/error_ext.go => multierr/error_post_go120.go} (65%) create mode 100644 tools/vendor/go.uber.org/multierr/error_pre_go120.go delete mode 100644 tools/vendor/go.uber.org/multierr/glide.yaml create mode 100644 tools/vendor/go.uber.org/zap/.golangci.yml delete mode 100644 tools/vendor/go.uber.org/zap/array_go118.go rename tools/vendor/go.uber.org/{atomic/bool_ext.go => zap/internal/pool/pool.go} (56%) rename tools/vendor/go.uber.org/zap/{stacktrace.go => internal/stacktrace/stack.go} (73%) rename tools/vendor/go.uber.org/{atomic/time.go => zap/zapcore/lazy_with.go} (60%) create mode 100644 tools/vendor/golang.org/x/exp/LICENSE create mode 100644 tools/vendor/golang.org/x/exp/PATENTS create mode 100644 tools/vendor/golang.org/x/exp/constraints/constraints.go create mode 100644 tools/vendor/golang.org/x/exp/slices/cmp.go create mode 100644 tools/vendor/golang.org/x/exp/slices/slices.go create mode 100644 tools/vendor/golang.org/x/exp/slices/sort.go create mode 100644 tools/vendor/golang.org/x/exp/slices/zsortanyfunc.go create mode 100644 tools/vendor/golang.org/x/exp/slices/zsortordered.go delete mode 100644 tools/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go delete mode 100644 tools/vendor/golang.org/x/net/http2/Dockerfile delete mode 100644 tools/vendor/golang.org/x/net/http2/Makefile create mode 100644 tools/vendor/golang.org/x/net/http2/writesched_roundrobin.go create mode 100644 tools/vendor/golang.org/x/net/idna/tables15.0.0.go create mode 100644 tools/vendor/golang.org/x/net/idna/trie12.0.0.go create mode 100644 tools/vendor/golang.org/x/net/idna/trie13.0.0.go create mode 100644 tools/vendor/golang.org/x/sync/errgroup/go120.go create mode 100644 tools/vendor/golang.org/x/sync/errgroup/pre_go120.go create mode 100644 tools/vendor/golang.org/x/sync/singleflight/singleflight.go delete mode 100644 tools/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go create mode 100644 tools/vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 tools/vendor/golang.org/x/sys/unix/mremap.go create mode 100644 tools/vendor/golang.org/x/text/cases/tables15.0.0.go create mode 100644 tools/vendor/golang.org/x/text/feature/plural/common.go create mode 100644 tools/vendor/golang.org/x/text/feature/plural/message.go create mode 100644 tools/vendor/golang.org/x/text/feature/plural/plural.go create mode 100644 tools/vendor/golang.org/x/text/feature/plural/tables.go create mode 100644 tools/vendor/golang.org/x/text/internal/catmsg/catmsg.go create mode 100644 tools/vendor/golang.org/x/text/internal/catmsg/codec.go create mode 100644 tools/vendor/golang.org/x/text/internal/catmsg/varint.go create mode 100644 tools/vendor/golang.org/x/text/internal/format/format.go create mode 100644 tools/vendor/golang.org/x/text/internal/format/parser.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/common.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/decimal.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/format.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/number.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/pattern.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/roundingmode_string.go create mode 100644 tools/vendor/golang.org/x/text/internal/number/tables.go create mode 100644 tools/vendor/golang.org/x/text/internal/stringset/set.go create mode 100644 tools/vendor/golang.org/x/text/message/catalog.go create mode 100644 tools/vendor/golang.org/x/text/message/catalog/catalog.go create mode 100644 tools/vendor/golang.org/x/text/message/catalog/dict.go create mode 100644 tools/vendor/golang.org/x/text/message/catalog/go19.go create mode 100644 tools/vendor/golang.org/x/text/message/catalog/gopre19.go create mode 100644 tools/vendor/golang.org/x/text/message/doc.go create mode 100644 tools/vendor/golang.org/x/text/message/format.go create mode 100644 tools/vendor/golang.org/x/text/message/message.go create mode 100644 tools/vendor/golang.org/x/text/message/print.go create mode 100644 tools/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 tools/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 tools/vendor/golang.org/x/text/width/tables15.0.0.go create mode 100644 tools/vendor/golang.org/x/tools/internal/event/tag/tag.go delete mode 100644 tools/vendor/golang.org/x/tools/internal/gcimporter/bexport.go create mode 100644 tools/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go create mode 100644 tools/vendor/google.golang.org/genproto/googleapis/api/LICENSE create mode 100644 tools/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/.gitignore create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/LICENSE create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/README.md create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/errors.go create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/merge.go create mode 100644 tools/vendor/gopkg.in/evanphx/json-patch.v5/patch.go create mode 100644 tools/vendor/helm.sh/helm/v3/pkg/cli/roundtripper.go create mode 100644 tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/ratcheting.go create mode 100644 tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS create mode 100644 tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go create mode 100644 tools/vendor/k8s.io/apimachinery/pkg/runtime/splice.go create mode 100644 tools/vendor/k8s.io/apimachinery/pkg/util/dump/dump.go create mode 100644 tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versioncheck.go rename tools/vendor/{sigs.k8s.io/kustomize/api/resmap/idslice.go => k8s.io/apimachinery/pkg/util/version/doc.go} (51%) create mode 100644 tools/vendor/k8s.io/apimachinery/pkg/util/version/version.go delete mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/composited.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/environment/base.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/environment/environment.go delete mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/library/libraries.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/library/quantity.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/library/test.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/openapi/adaptor.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/openapi/extensions.go create mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/quantity.go delete mode 100644 tools/vendor/k8s.io/apiserver/pkg/cel/registry.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/variable.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/auditannotation.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/expressionwarning.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/matchresources.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/namedrulewithoperations.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramkind.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramref.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/typechecking.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicy.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybinding.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybindingspec.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicyspec.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicystatus.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validation.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/variable.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostip.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaimstatus.go delete mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/exemptprioritylevelconfiguration.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/exemptprioritylevelconfiguration.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/exemptprioritylevelconfiguration.go create mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/exemptprioritylevelconfiguration.go delete mode 100644 tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go create mode 100644 tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicy.go create mode 100644 tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicybinding.go create mode 100644 tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/selfsubjectreview.go create mode 100644 tools/vendor/k8s.io/client-go/openapi/typeconverter.go create mode 100644 tools/vendor/k8s.io/client-go/tools/cache/object-names.go create mode 100644 tools/vendor/k8s.io/component-base/version/dynamic.go create mode 100644 tools/vendor/k8s.io/klog/v2/format.go create mode 100644 tools/vendor/k8s.io/utils/set/OWNERS create mode 100644 tools/vendor/k8s.io/utils/set/ordered.go create mode 100644 tools/vendor/k8s.io/utils/set/set.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LegacyOrderTransformer.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/image/image.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/commonannotations.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/commonlabels.go (78%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/defaultconfig.go (93%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/doc.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/images.go (100%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/metadatalabels.go rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/nameprefix.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/namereference.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/namespace.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/namesuffix.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/replicas.go (100%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/templatelabels.go rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/konfig/builtinpluginconsts/varreference.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/loader/errors.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/loader/fileloader.go (64%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/loader/loader.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/api/{ => internal}/loader/loadrestrictions.go (100%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/builtinplugins.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/doc.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/errors.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/localizer.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/locloader.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/util.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/krusty/localizer/runner.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/pkg/loader/loader.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/types/fix.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/types/inventory.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/api/types/sortoptions.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/annotate.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesetter.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesubstitution.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesetter.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesubstitution.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdinit.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdlistsetters.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdset.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdwrap.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdxargs.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/fmt.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge3.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/sink.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/source.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput_string.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/flagsandargs.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/version/version.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/LICENSE (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/build.go (79%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagaddmanagedby.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagenablehelm.go (63%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagenableplugins.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagloadrestrictor.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagoutputpath.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/flagsforfunctions.go (100%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/reorderoutput.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/build/writer.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/commands.go (82%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/create/create.go (92%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addbase.go (96%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addbuildmetadata.go (94%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addcomponent.go (87%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4/commands/edit/add/configmap.go => v5/commands/edit/add/addconfigmap.go} (54%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addgenerator.go (91%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addmetadata.go (84%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addpatch.go (96%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addresource.go (79%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4/commands/edit/add/secret.go => v5/commands/edit/add/addsecret.go} (65%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/addtransformer.go (91%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/add/all.go (97%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/all.go (68%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/fix/convert.go (98%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/fix/fix.go (89%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/listbuiltin/listbuiltin.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/all.go (80%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/removebuildmetadata.go (94%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeconfigmap.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/removemetadata.go (98%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/removepatch.go (94%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/removeresource.go (97%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removesecret.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/remove/removetransformer.go (96%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/all.go (81%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/set_name_prefix.go (95%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/set_name_suffix.go (95%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setannotation.go (95%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setbuildmetadata.go (94%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setconfigmap.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setimage.go (98%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setlabel.go (94%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setnamespace.go (96%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/edit/set/setreplicas.go (97%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/internal/kustfile/kustomizationfile.go (93%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/configmapSecretFlagsAndArgs.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/internal/util/util.go (55%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/internal/util/validate.go (92%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/localize/localize.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/openapi/fetch/fetch.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/openapi/info/info.go (100%) rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/commands/openapi/openapi.go (81%) create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/version/version.go rename tools/vendor/sigs.k8s.io/kustomize/kustomize/{v4 => v5}/main.go (83%) delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/doc.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/krmfile.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.go create mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.go rename tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/{v1212 => v1_21_2}/swagger.pb (98%) delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/add.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/delete.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/doc.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/list.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/set.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/deletercreator.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/fieldsetter.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/settercreator.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/substitutioncreator.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/types.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/util.go delete mode 100644 tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/walk.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE.libyaml rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v2}/NOTICE (100%) create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/OWNERS create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/README.md create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/decode.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/emitterc.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/encode.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/parserc.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/readerc.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/resolve.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/scannerc.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/sorter.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/writerc.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlh.go create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlprivateh.go rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/LICENSE (100%) create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v3/NOTICE create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v3/OWNERS rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/README.md (87%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/apic.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/decode.go (93%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/emitterc.go (95%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/encode.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/parserc.go (99%) create mode 100644 tools/vendor/sigs.k8s.io/yaml/goyaml.v3/patch.go rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/readerc.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/resolve.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/scannerc.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/sorter.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/writerc.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/yaml.go (98%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/yamlh.go (100%) rename tools/vendor/sigs.k8s.io/{kustomize/kyaml/internal/forked/github.com/go-yaml/yaml => yaml/goyaml.v3}/yamlprivateh.go (100%) diff --git a/tools/go.mod b/tools/go.mod index bf435a923..1b75eb501 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -3,47 +3,49 @@ module github.com/csi-addons/kubernetes-csi-addons/tools go 1.20 require ( - github.com/operator-framework/operator-sdk v1.29.0 + github.com/operator-framework/operator-sdk v1.32.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.31.0 - sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230620070423-a784ee78d04b - sigs.k8s.io/controller-tools v0.12.1 - sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 + sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20231212104454-76b5567314a8 + sigs.k8s.io/controller-tools v0.13.0 + sigs.k8s.io/kustomize/kustomize/v5 v5.3.0 ) require ( - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.2.0 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/BurntSushi/toml v1.2.1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.2 // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.3 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/Microsoft/hcsshim v0.9.4 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.10.0-rc.7 // indirect github.com/adrg/xdg v0.4.0 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/containerd/cgroups v1.0.4 // indirect - github.com/containerd/containerd v1.6.8 // indirect - github.com/containerd/continuity v0.2.2 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.10.1 // indirect - github.com/containerd/ttrpc v1.1.0 // indirect + github.com/containerd/cgroups v1.1.0 // indirect + github.com/containerd/containerd v1.7.0 // indirect + github.com/containerd/continuity v0.3.0 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.12.1 // indirect + github.com/containerd/ttrpc v1.2.1 // indirect + github.com/containerd/typeurl/v2 v2.1.0 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.19+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.19+incompatible // indirect + github.com/docker/cli v20.10.21+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v20.10.24+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect @@ -56,25 +58,26 @@ require ( github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.1.0 // indirect github.com/go-git/go-git/v5 v5.3.0 // indirect - github.com/go-gorp/gorp/v3 v3.0.2 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-gorp/gorp/v3 v3.0.5 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/go-logr/zapr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gobuffalo/envy v1.6.5 // indirect github.com/gobuffalo/flect v1.0.2 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-migrate/migrate/v4 v4.6.2 // indirect + github.com/golang-migrate/migrate/v4 v4.16.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/cel-go v0.12.6 // indirect + github.com/google/cel-go v0.16.0 // indirect github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.8.0 // indirect + github.com/google/go-containerregistry v0.13.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect @@ -84,8 +87,10 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/h2non/filetype v1.1.1 // indirect github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.2 // indirect + github.com/huandu/xstrings v1.4.0 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -95,7 +100,7 @@ require ( github.com/joho/godotenv v1.3.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.14.1 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/kr/text v0.2.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect @@ -107,8 +112,8 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/mattn/go-sqlite3 v1.14.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -116,36 +121,37 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/sys/mountinfo v0.5.0 // indirect - github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect + github.com/moby/sys/mountinfo v0.6.2 // indirect + github.com/moby/sys/sequential v0.5.0 // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.27.6 // indirect + github.com/onsi/gomega v1.27.10 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc2 // indirect - github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect + github.com/operator-framework/ansible-operator-plugins v1.32.0 // indirect + github.com/operator-framework/api v0.17.5 // indirect github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230413193425-4632388adc61 // indirect github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75 // indirect github.com/operator-framework/operator-manifest-tools v0.2.3-0.20230227155221-caa8b9e1ab12 // indirect - github.com/operator-framework/operator-registry v1.26.5-0.20230307160312-3bfcb23fa7d0 // indirect + github.com/operator-framework/operator-registry v1.28.0 // indirect github.com/otiai10/copy v1.2.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.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.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.16.0 // 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/rivo/uniseg v0.4.2 // indirect - github.com/rubenv/sql-migrate v1.2.0 // indirect + github.com/rubenv/sql-migrate v1.3.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cobra v1.7.0 // indirect @@ -153,69 +159,74 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.10.0 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/stretchr/testify v1.8.1 // indirect + github.com/stretchr/testify v1.8.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/thoas/go-funk v0.8.0 // indirect github.com/vbatts/tar-split v0.11.2 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/xlab/treeprint v1.1.0 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.etcd.io/etcd/api/v3 v3.5.7 // indirect - go.opencensus.io v0.23.0 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect - go.opentelemetry.io/otel v1.11.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect - go.opentelemetry.io/otel/metric v0.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.11.0 // indirect - go.opentelemetry.io/otel/trace v1.11.0 // indirect + go.opentelemetry.io/otel v1.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.14.0 // indirect + go.opentelemetry.io/otel/trace v1.14.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.starlark.net v0.0.0-20221010140840-6bf6f0955179 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.16.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.8.0 // indirect + golang.org/x/tools v0.14.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b // indirect - google.golang.org/grpc v1.51.0 // indirect + google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/grpc v1.54.0 // indirect + gopkg.in/evanphx/json-patch.v5 v5.6.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - helm.sh/helm/v3 v3.10.3 // indirect - k8s.io/api v0.27.1 // indirect - k8s.io/apiextensions-apiserver v0.27.1 // indirect - k8s.io/apimachinery v0.27.1 // indirect - k8s.io/apiserver v0.27.1 // indirect + helm.sh/helm/v3 v3.11.3 // indirect + k8s.io/api v0.28.0 // indirect + k8s.io/apiextensions-apiserver v0.28.0 // indirect + k8s.io/apimachinery v0.28.0 // indirect + k8s.io/apiserver v0.28.0 // indirect k8s.io/cli-runtime v0.26.2 // indirect - k8s.io/client-go v0.27.1 // indirect - k8s.io/component-base v0.27.1 // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect + k8s.io/client-go v0.28.0 // indirect + k8s.io/component-base v0.28.0 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/kubectl v0.26.2 // indirect - k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect - oras.land/oras-go v1.2.0 // indirect + k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect + oras.land/oras-go v1.2.2 // indirect rsc.io/letsencrypt v0.0.3 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 // indirect - sigs.k8s.io/controller-runtime v0.14.5 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 // indirect + sigs.k8s.io/controller-runtime v0.14.6 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kubebuilder/v3 v3.9.1 // indirect - sigs.k8s.io/kustomize/api v0.12.1 // indirect - sigs.k8s.io/kustomize/cmd/config v0.10.9 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect + sigs.k8s.io/kustomize/api v0.16.0 // indirect + sigs.k8s.io/kustomize/cmd/config v0.13.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.16.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) + +// requested older version does not contain go.opentelemetry.io/otel/metric/instrument/syncfloat64 +replace go.opentelemetry.io/otel/metric v1.21.0 => go.opentelemetry.io/otel/metric v0.35.0 diff --git a/tools/go.sum b/tools/go.sum index 4d573a6c6..5e1db2480 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -1,8 +1,5 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.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.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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= @@ -23,15 +20,6 @@ cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPT cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -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= @@ -41,7 +29,6 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 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= @@ -53,149 +40,79 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -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 v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= +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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= -github.com/BurntSushi/toml v1.2.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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -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.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.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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.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.4 h1:mnUj0ivWy6UzbB1uLFqKR6F+ZyiDc7j4iGgHTpO+5+I= -github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +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.7 h1:HBytQPxcv8Oy4244zbQbe6hnOnx544eL5QPUqhJldz8= +github.com/Microsoft/hcsshim v0.10.0-rc.7/go.mod h1:ILuwjA+kNW+MrN/w5un7n3mTqkwsFu4Bp05/okFUZlE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.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 h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -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/a8m/expect v1.0.0/go.mod h1:4IwSCMumY49ScypDnjNbYEjgVeqy1/U2cEs3Lat96eA= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= 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/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/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/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= 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-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 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-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -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.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.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 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -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/bugsnag-go v1.5.3 h1:yeRUT3mUE13jL1tGwvoQsKdVbAsQx9AJ+fqahKveP04= -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/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 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/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -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/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -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/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/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/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= @@ -204,209 +121,59 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP 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/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -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.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -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.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.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= -github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= -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.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -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/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/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.10.1 h1:hd1EoVjI2Ax8Cr64tdYqnJ4i4pZU49FkEf5kU8KxQng= -github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -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 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= -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/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/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/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/containerd v1.7.0 h1:G/ZQr3gMZs6ZT0qPUZ15znx5QSdQdASW11nXTLTM2Pg= +github.com/containerd/containerd v1.7.0/go.mod h1:QfR7Efgb/6X2BDpTPJRvPTYDE9rsF0FsXX9J8sIs/sc= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/stargz-snapshotter/estargz v0.12.1 h1:+7nYmHJb0tEkcRaAW+MHqoKaJYZmkikupxCqVtmPuY0= +github.com/containerd/stargz-snapshotter/estargz v0.12.1/go.mod h1:12VUuCq3qPq4y8yUW+l5w3+oXV3cx2Po3KSe/SmPGqw= +github.com/containerd/ttrpc v1.2.1 h1:VWv/Rzx023TBLv4WQ+9WPXlBG/s3rsRjY3i9AJ2BJdE= +github.com/containerd/ttrpc v1.2.1/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl/v2 v2.1.0 h1:yNAhJvbNEANt7ck48IlEGOxP7YAp6LLpGn5jZACDNIE= +github.com/containerd/typeurl/v2 v2.1.0/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-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/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-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-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 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/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.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= -github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= -github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= -github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4= -github.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A= -github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE= -github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= -github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= -github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8= -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/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/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -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-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= -github.com/distribution/distribution/v3 v3.0.0-20220526142353-ffbd94cbe269 h1:hbCT8ZPPMqefiAWD2ZKjn7ypokIGViTvBBg/ExLSdCk= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.19+incompatible h1:VKVBUb0KY/bx0FUCrCiNCL8wqgy8VxQli1dtNTn38AE= -github.com/docker/cli v20.10.19+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.7.0+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 v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.19+incompatible h1:lzEmjivyNHFHMNAFLXORMBXyGIhw/UP4DvJwvyKYq64= -github.com/docker/docker v20.10.19+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/distribution/distribution/v3 v3.0.0-20230611135314-6a57630cf401 h1:6b2DsTBdddsuYAcFwm723nRVeLaK4vH2rdhTmnWSMws= +github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU= +github.com/docker/cli v20.10.21+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 v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE= +github.com/docker/docker v20.10.24+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 h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -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 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= 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/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= 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/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/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -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.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -416,10 +183,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m 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 v4.9.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.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= @@ -437,19 +201,13 @@ github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBd github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 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/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -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/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= 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/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= -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/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -466,46 +224,26 @@ github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4 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-gorp/gorp/v3 v3.0.2 h1:ULqJXIekoqMx29FI5ekXXFoH1dT2Vc8UhnRzBg+Emz4= -github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmncaR6rwBY= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-gorp/gorp/v3 v3.0.5 h1:PUjzYdYu3HBOh8LE+UUmRG2P0IRDak9XMeGNvaeq4Ow= +github.com/go-gorp/gorp/v3 v3.0.5/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= 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-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/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 v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/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.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -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-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= 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.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.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -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/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/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.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -522,31 +260,19 @@ github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XE github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= -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/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -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-migrate/migrate/v4 v4.6.2 h1:LDDOHo/q1W5UDj6PbkxdCv7lv9yunyZHXvxuwDkGo3k= -github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= +github.com/golang-migrate/migrate/v4 v4.16.1 h1:O+0C55RbMN66pWm5MjO6mw0px6usGpY0+bkSGW9zCo0= +github.com/golang-migrate/migrate/v4 v4.16.1/go.mod h1:qXiwa/3Zeqaltm1MxOCZDYysW/F6folYiBgBG03l9hc= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= 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.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -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= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -562,7 +288,6 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -582,19 +307,17 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= 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.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.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= -github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= +github.com/google/cel-go v0.16.0 h1:DG9YQ8nFCFXAs/FDDwBxmL1tpKNrdlGUM9U3537bX/Y= +github.com/google/cel-go v0.16.0/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -607,21 +330,17 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= 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.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.8.0 h1:mtR24eN6rapCN+shds82qFEIWWmg64NPMuyCNT7/Ogc= -github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +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/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/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= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -634,48 +353,30 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -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/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.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -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/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.1/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.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= 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/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= @@ -683,27 +384,18 @@ github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= 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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +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.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -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-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +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-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= @@ -711,30 +403,22 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= 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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= 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.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/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= @@ -742,19 +426,12 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= 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/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/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/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= @@ -762,11 +439,8 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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 v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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.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= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -774,57 +448,42 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/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.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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.1 h1:hLQYb23E8/fO+1u53d02A97a8UnsddcvYzq4ERRU4ds= -github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/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/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= 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.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/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/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= 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/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/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.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= @@ -835,18 +494,13 @@ github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/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= @@ -854,30 +508,19 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ 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-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 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-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 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.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +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/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/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ= +github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -892,10 +535,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu 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.4.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/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -903,15 +544,12 @@ github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= 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/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 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/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/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/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +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= @@ -921,88 +559,40 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -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/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nelsam/hel/v2 v2.3.2/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= +github.com/nelsam/hel/v2 v2.3.3/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= 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/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/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -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.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -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.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -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/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= 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-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -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-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-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -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.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/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42 h1:d/Pnr19TnmIq3zQ6ebewC+5jt5zqYbRkvYd37YZENQY= -github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42/go.mod h1:l/cuwtPxkVUY7fzYgdust2m9tlmb8I4pOvbsUufRb24= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runtime-spec v1.1.0-rc.1 h1:wHa9jroFfKGQqFHj0I1fMRKLl0pfj+ynAqBxo3v6u9w= +github.com/operator-framework/ansible-operator-plugins v1.32.0 h1:pBHNI9hoLYTMHsf6w6ozVYucJx+piMmfm86v8pbKFOY= +github.com/operator-framework/ansible-operator-plugins v1.32.0/go.mod h1:G46APyI1JOzYW8BaSuPHxkTCfnEd0Hl0mwW8+bOn4IY= +github.com/operator-framework/api v0.17.5 h1:9d0pc6m1Vp4QeS8i5dhl/B0nifhKQdtw+iFsNx0An0Q= +github.com/operator-framework/api v0.17.5/go.mod h1:l/cuwtPxkVUY7fzYgdust2m9tlmb8I4pOvbsUufRb24= github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230413193425-4632388adc61 h1:FPO2hS4HNIU2pzWeX2KusKxqDFeGIURRMkxRtn/i570= github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230413193425-4632388adc61/go.mod h1:QpVyiSOKGbWADyNRl7LvMlRuuMGrWXJQdEYyHPQWMUg= github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75 h1:mjMid39qs1lEXpIldVmj7sa1wtuZvYge8oHkT0qOY0Y= github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75/go.mod h1:oQTt35EEUrDY8ca/kRWYz5omWsVhk9Sj78vKlHFqxjM= github.com/operator-framework/operator-manifest-tools v0.2.3-0.20230227155221-caa8b9e1ab12 h1:PXejNY6ZFU6CutIkowf/ECsuT/xcLAIgmXQxG43SHnY= github.com/operator-framework/operator-manifest-tools v0.2.3-0.20230227155221-caa8b9e1ab12/go.mod h1:5OAMYmIkFCiiHfS1r3HcIYu3F/sum38pofSoLZy7Cbw= -github.com/operator-framework/operator-registry v1.26.5-0.20230307160312-3bfcb23fa7d0 h1:TMYB8U+0F5MJJ6x6CGnri0bH/ea/wvJZ9dZzT5salfo= -github.com/operator-framework/operator-registry v1.26.5-0.20230307160312-3bfcb23fa7d0/go.mod h1:ChLO6+eQ6RMeVJ0K9DlJPjeP4iX+T5BwdxVYzuOdcMc= -github.com/operator-framework/operator-sdk v1.29.0 h1:fHHJd6JkIUWMtQCGfokLZBWYBV7xqFv3JHNSRZzNnjQ= -github.com/operator-framework/operator-sdk v1.29.0/go.mod h1:QO8gE736UilYLC61lOsUJYc190x2PCgW5TD13DBgONg= +github.com/operator-framework/operator-registry v1.28.0 h1:vtmd2WgJxkx7vuuOxW4k5Le/oo0SfonSeJVMU3rKIfk= +github.com/operator-framework/operator-registry v1.28.0/go.mod h1:UYw3uaZyHwHgnczLRYmUqMpgRgP2EfkqOsaR+LI+nK8= +github.com/operator-framework/operator-sdk v1.32.0 h1:2Wx7EVwrXhxEuwsm0RsgF3wEgeSGc7jwpnAmBG6f/y8= +github.com/operator-framework/operator-sdk v1.32.0/go.mod h1:NnTOc0sOT8YnPF7Q7o8dSAhHBpobVHyJ8n8cQMOnmco= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -1011,20 +601,15 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= 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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/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/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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= @@ -1034,124 +619,82 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb 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/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1 h1:oL4IBbcqwhhNWh31bjOX8C/OCy0zs9906d/VUru+bqg= -github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/poy/onpar v0.0.0-20200406201722-06f95a1c68e8/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= +github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= +github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= 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.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.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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/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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/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 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +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/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rubenv/sql-migrate v1.2.0 h1:fOXMPLMd41sK7Tg75SXDec15k3zg5WNV6SjuDRiNfcU= -github.com/rubenv/sql-migrate v1.2.0/go.mod h1:Z5uVnq7vrIrPmHbVFfR4YLHRZquxeHpckCnRq0P/K9Y= +github.com/rubenv/sql-migrate v1.3.1 h1:Vx+n4Du8X8VTYuXbhNxdEUoh6wiJERA0GlWocR5FrbA= +github.com/rubenv/sql-migrate v1.3.1/go.mod h1:YzG/Vh82CwyhTFXy+Mf5ahAiiEOpAlHurg+23VEzcsk= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= 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/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -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/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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/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/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 v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= 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= @@ -1159,17 +702,13 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0 h1:mXH0UwHS4D2HwWZa75im4xIQynLfblmWV7qcWpfv0yk= 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 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -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-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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1178,52 +717,29 @@ 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 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -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/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/thoas/go-funk v0.8.0 h1:JP9tKSvnpFVclYgDM0Is7FD9M4fhPvqA0s0BsXmzSRQ= github.com/thoas/go-funk v0.8.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= -github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -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/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -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/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/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/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.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= 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 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 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= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1231,104 +747,80 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/gorelic v0.0.7 h1:4DTF1WOM2ZZS/xMOkTFBOcb6XiHu/PKn3rVo6dbewQE= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= -github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= 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 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.7 h1:sbcmosSVesNrWOJ58ZQFitHMdncusIifYcrBfwrlJSY= -go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 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= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= 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/instrumentation/net/http/otelhttp v0.35.1 h1:sxoY9kG1s1WpSYNyzm24rlwH4lnRYFXUVVBmKMBfRgw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= -go.opentelemetry.io/otel v1.11.0 h1:kfToEGMDq6TrVrJ9Vht84Y8y9enykSZzDDZglV0kIEk= -go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 h1:pDDYmo0QadUPal5fwXoY1pmMpFcdyhXOmL5drCrI3vU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 h1:KtiUEhQmj/Pa874bVYKGNVdq8NPKiacPbaRRtgXi+t4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.11.0 h1:ZnKIL9V9Ztaq+ME43IUi/eo22mNsb6a7tGfzaOWB5fo= -go.opentelemetry.io/otel/sdk v1.11.0/go.mod h1:REusa8RsyKaq0OlyangWXaw97t2VogoO4SSEeKkSTAk= -go.opentelemetry.io/otel/trace v1.11.0 h1:20U/Vj42SX+mASlXLmSGBg6jpI1jQtv682lZtTAOVFI= -go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= +go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= +go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 h1:/fXHZHGvro6MVqV34fJzDhi7sHGpX3Ej/Qjmfn003ho= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0/go.mod h1:UFG7EBMRdXyFstOwH028U0sVf+AvukSGhF0g8+dmNG8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 h1:TKf2uAs2ueguzLaxOCBXNpHxfO/aC7PAdDsSH0IbeRQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0/go.mod h1:HrbCVv40OOLTABmOn1ZWty6CHXkU8DK/Urc43tHug70= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 h1:ap+y8RXX3Mu9apKVtOkM6WSFESLM8K3wNQyOU8sWHcc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0/go.mod h1:5w41DY6S9gZrbjuq6Y+753e96WfPha5IcsOSZTtullM= +go.opentelemetry.io/otel/metric v0.35.0 h1:aPT5jk/w7F9zW51L7WgRqNKDElBdyRLGuBtI5MX34e8= +go.opentelemetry.io/otel/metric v0.35.0/go.mod h1:qAcbhaTRFU6uG8QM7dDo7XvFsWcugziq/5YI065TokQ= +go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= +go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= +go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= +go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.starlark.net v0.0.0-20221010140840-6bf6f0955179 h1:Mc5MkF55Iasgq23vSYpL6/l7EJXtlNjzw+8hbMQ/ShY= go.starlark.net v0.0.0-20221010140840-6bf6f0955179/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= -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.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.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 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.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +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.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -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/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= 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-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-20190325154230-a5d413f7728c/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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-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.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -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.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1339,6 +831,8 @@ 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-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= 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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1364,38 +858,27 @@ 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.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-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-20181108082009-03003ca0c849/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/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-20191004110552-13f9640d40b9/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= @@ -1410,7 +893,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= @@ -1421,22 +903,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v 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-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-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/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.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-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= @@ -1447,15 +921,9 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -1467,60 +935,36 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 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-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-20190102155601-82a175fd1598/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-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-20190426135247-a129542de9ae/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-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-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= @@ -1529,30 +973,16 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-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-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-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-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1561,37 +991,30 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w 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-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= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210809222454-d867a43fc93e/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-20210823070655-63515b42dcdf/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-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-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-20220520151302-bc2c85ada10a/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-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/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.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1601,22 +1024,17 @@ 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.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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-20210220033141-f8bda1e9f3ba/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-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-20190114222345-bf090417da8b/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= @@ -1624,20 +1042,14 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/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-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-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-20190911174233-4f2ddba30aff/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-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-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1656,19 +1068,17 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK 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-20200313205530-4303120df7d8/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-20200501065659-ab2804fb9c9d/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= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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= @@ -1676,23 +1086,17 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= 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.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 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= @@ -1715,19 +1119,7 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -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= @@ -1735,14 +1127,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-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/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-20190522204451-c2c4e71fbf69/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= @@ -1751,7 +1140,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= @@ -1765,14 +1153,12 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/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= @@ -1783,41 +1169,20 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -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-20221014173430-6e2ab493f96b h1:IOQ/4u8ZSLV+xns0LQxzdAcdOJTDMWB+0shVM8KWXBE= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/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= @@ -1833,18 +1198,11 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -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.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1862,31 +1220,23 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 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= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -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/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/evanphx/json-patch.v5 v5.6.0 h1:BMT6KIwBD9CaU91PJCZIe46bDmBWa9ynTQgJIOpfQBk= +gopkg.in/evanphx/json-patch.v5 v5.6.0/go.mod h1:/kvTRh1TVm5wuM6OkHxqXtE/1nUZZpihg29RtuIyfvk= 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.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/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/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.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= @@ -1894,7 +1244,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.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= @@ -1905,14 +1254,9 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C 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 h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -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 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.10.3 h1:wL7IUZ7Zyukm5Kz0OUmIFZgKHuAgByCrUcJBtY0kDyw= -helm.sh/helm/v3 v3.10.3/go.mod h1:CXOcs02AYvrlPMWARNYNRgf2rNP7gLJQsi/Ubd4EDrI= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +helm.sh/helm/v3 v3.11.3 h1:n1X5yaQTP5DYywlBOZMl2gX398Gp6YwFp/IAVj6+5D4= +helm.sh/helm/v3 v3.11.3/go.mod h1:S+sOdQc3BLvt09a9rSlKKVs9x0N/yx+No0y3qFw+FQ8= 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= @@ -1920,93 +1264,56 @@ 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= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0= -k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E= -k8s.io/apiextensions-apiserver v0.27.1 h1:Hp7B3KxKHBZ/FxmVFVpaDiXI6CCSr49P1OJjxKO6o4g= -k8s.io/apiextensions-apiserver v0.27.1/go.mod h1:8jEvRDtKjVtWmdkhOqE84EcNWJt/uwF8PC4627UZghY= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc= -k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM= -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/apiserver v0.27.1 h1:phY+BtXjjzd+ta3a4kYbomC81azQSLa1K8jo9RBw7Lg= -k8s.io/apiserver v0.27.1/go.mod h1:UGrOjLY2KsieA9Fw6lLiTObxTb8Z1xEba4uqSuMY0WU= +k8s.io/api v0.28.0 h1:3j3VPWmN9tTDI68NETBWlDiA9qOiGJ7sdKeufehBYsM= +k8s.io/api v0.28.0/go.mod h1:0l8NZJzB0i/etuWnIXcwfIv+xnDOhL3lLW919AWYDuY= +k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= +k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apimachinery v0.28.0 h1:ScHS2AG16UlYWk63r46oU3D5y54T53cVI5mMJwwqFNA= +k8s.io/apimachinery v0.28.0/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= +k8s.io/apiserver v0.28.0 h1:wVh7bK6Xj7hq+5ntInysTeQRAOqqFoKGUOW2yj8DXrY= +k8s.io/apiserver v0.28.0/go.mod h1:MvLmtxhQ0Tb1SZk4hfJBjs8iqr5nhYeaFSaoEcz7Lk4= k8s.io/cli-runtime v0.26.2 h1:6XcIQOYW1RGNwFgRwejvyUyAojhToPmJLGr0JBMC5jw= k8s.io/cli-runtime v0.26.2/go.mod h1:U7sIXX7n6ZB+MmYQsyJratzPeJwgITqrSlpr1a5wM5I= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8= -k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -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/component-base v0.27.1 h1:kEB8p8lzi4gCs5f2SPU242vOumHJ6EOsOnDM3tTuDTM= -k8s.io/component-base v0.27.1/go.mod h1:UGEd8+gxE4YWoigz5/lb3af3Q24w98pDseXcXZjw+E0= -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/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/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.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -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-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= -k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= +k8s.io/client-go v0.28.0 h1:ebcPRDZsCjpj62+cMk1eGNX1QkMdRmQ6lmz5BLoFWeM= +k8s.io/client-go v0.28.0/go.mod h1:0Asy9Xt3U98RypWJmU1ZrRAGKhP6NqDPmptlAzK2kMc= +k8s.io/component-base v0.28.0 h1:HQKy1enJrOeJlTlN4a6dU09wtmXaUvThC0irImfqyxI= +k8s.io/component-base v0.28.0/go.mod h1:Yyf3+ZypLfMydVzuLBqJ5V7Kx6WwDr/5cN+dFjw1FNk= +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-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= k8s.io/kubectl v0.26.2 h1:SMPB4j48eVFxsYluBq3VLyqXtE6b72YnszkbTAtFye4= k8s.io/kubectl v0.26.2/go.mod h1:KYWOXSwp2BrDn3kPeoU/uKzKtdqvhK1dgZGd0+no4cM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -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= -oras.land/oras-go v1.2.0 h1:yoKosVIbsPoFMqAIFHTnrmOuafHal+J/r+I5bdbVWu4= -oras.land/oras-go v1.2.0/go.mod h1:pFNs7oHp2dYsYMSS82HaX5l4mpnGO7hbpPN6EWH2ltc= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +oras.land/oras-go v1.2.2 h1:0E9tOHUfrNH7TCDk5KU0jVBEzCqbfdyuVfGmJ7ZeRPE= +oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= 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.1.1 h1:MB1zkK+WMOmfLxEpjr1wEmkpcIhZC7kfTkZ0stg5bog= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1/go.mod h1:/4NLd21PQY0B+H+X0aDZdwUiVXYJQl/2NXA5KVtDiP4= -sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s= -sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230620070423-a784ee78d04b h1:OZOsH3AuA+PGDU1ksxqhnGjP14YJRcQOHzKTcKeJw3U= -sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230620070423-a784ee78d04b/go.mod h1:B6HLcvOy2S1qq2eWOFm9xepiKPMIc8Z9OXSPsnUDaR4= -sigs.k8s.io/controller-tools v0.12.1 h1:GyQqxzH5wksa4n3YDIJdJJOopztR5VDM+7qsyg5yE4U= -sigs.k8s.io/controller-tools v0.12.1/go.mod h1:rXlpTfFHZMpZA8aGq9ejArgZiieHd+fkk/fTatY8A2M= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= +sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20231212104454-76b5567314a8 h1:X5yAdZVLujJL51uQJHg3mCftGs2eG5Y1aP77XSimse4= +sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20231212104454-76b5567314a8/go.mod h1:TF/lVLWS+JNNaVqJuDDictY2hZSXSsIHCx4FClMvqFg= +sigs.k8s.io/controller-tools v0.13.0 h1:NfrvuZ4bxyolhDBt/rCZhDnx3M2hzlhgo5n3Iv2RykI= +sigs.k8s.io/controller-tools v0.13.0/go.mod h1:5vw3En2NazbejQGCeWKRrE7q4P+CW8/klfVqP8QZkgA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kubebuilder/v3 v3.9.1 h1:9JNKRg9GzlLBYwYRx1nQlwha8+Pd9gPyat1lj7T+jZw= sigs.k8s.io/kubebuilder/v3 v3.9.1/go.mod h1:Z4boifT/XHIZTVEAIZaPTXqjhuK8Msx2iPYJy8ic6vg= -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/cmd/config v0.10.9 h1:LV8AUwZPuvqhGfia50uNwsPwNg1xOy9koEf5hyBnYs4= -sigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 h1:cDW6AVMl6t/SLuQaezMET8hgnadZGIAr8tUrxFVOrpg= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.7/go.mod h1:VSNKEH9D9d9bLiWEGbS6Xbg/Ih0tgQalmPvntzRxZ/Q= -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/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/kustomize/api v0.16.0 h1:/zAR4FOQDCkgSDmVzV2uiFbuy9bhu3jEzthrHCuvm1g= +sigs.k8s.io/kustomize/api v0.16.0/go.mod h1:MnFZ7IP2YqVyVwMWoRxPtgl/5hpA+eCCrQR/866cm5c= +sigs.k8s.io/kustomize/cmd/config v0.13.0 h1:Z/bRyFQupMIqGz1KlRkLimK/VjtE4/Oj/DinJmQqTDc= +sigs.k8s.io/kustomize/cmd/config v0.13.0/go.mod h1:YlsZ9JysiHN7OjSmIZ17zvq9kl1oN2Osn+3wVyERkcM= +sigs.k8s.io/kustomize/kustomize/v5 v5.3.0 h1:OUKaQwArd1udTz3ykibOjaUwdfly6FnkQiDSSft6+Fg= +sigs.k8s.io/kustomize/kustomize/v5 v5.3.0/go.mod h1:qGalrWojwFYaT7KQXLo3kmLyuyr6VaIQYY+BWeRENus= +sigs.k8s.io/kustomize/kyaml v0.16.0 h1:6J33uKSoATlKZH16unr2XOhDI+otoe2sR3M8PDzW3K0= +sigs.k8s.io/kustomize/kyaml v0.16.0/go.mod h1:xOK/7i+vmE14N2FdFyugIshB8eF6ALpy7jI87Q2nRh4= 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= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/tools/tools.go b/tools/tools.go index afe91f752..1b3854de6 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -30,5 +30,5 @@ import ( _ "google.golang.org/protobuf/cmd/protoc-gen-go" _ "sigs.k8s.io/controller-runtime/tools/setup-envtest" _ "sigs.k8s.io/controller-tools/cmd/controller-gen" - _ "sigs.k8s.io/kustomize/kustomize/v4" + _ "sigs.k8s.io/kustomize/kustomize/v5" ) diff --git a/tools/vendor/github.com/AdaLogics/go-fuzz-headers/LICENSE b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/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/tools/vendor/github.com/AdaLogics/go-fuzz-headers/README.md b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/README.md new file mode 100644 index 000000000..0a0d60c74 --- /dev/null +++ b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/README.md @@ -0,0 +1,93 @@ +# go-fuzz-headers +This repository contains various helper functions for go fuzzing. It is mostly used in combination with [go-fuzz](https://github.com/dvyukov/go-fuzz), but compatibility with fuzzing in the standard library will also be supported. Any coverage guided fuzzing engine that provides an array or slice of bytes can be used with go-fuzz-headers. + + +## Usage +Using go-fuzz-headers is easy. First create a new consumer with the bytes provided by the fuzzing engine: + +```go +import ( + fuzz "github.com/AdaLogics/go-fuzz-headers" +) +data := []byte{'R', 'a', 'n', 'd', 'o', 'm'} +f := fuzz.NewConsumer(data) + +``` + +This creates a `Consumer` that consumes the bytes of the input as it uses them to fuzz different types. + +After that, `f` can be used to easily create fuzzed instances of different types. Below are some examples: + +### Structs +One of the most useful features of go-fuzz-headers is its ability to fill structs with the data provided by the fuzzing engine. This is done with a single line: +```go +type Person struct { + Name string + Age int +} +p := Person{} +// Fill p with values based on the data provided by the fuzzing engine: +err := f.GenerateStruct(&p) +``` + +This includes nested structs too. In this example, the fuzz Consumer will also insert values in `p.BestFriend`: +```go +type PersonI struct { + Name string + Age int + BestFriend PersonII +} +type PersonII struct { + Name string + Age int +} +p := PersonI{} +err := f.GenerateStruct(&p) +``` + +If the consumer should insert values for unexported fields as well as exported, this can be enabled with: + +```go +f.AllowUnexportedFields() +``` + +...and disabled with: + +```go +f.DisallowUnexportedFields() +``` + +### Other types: + +Other useful APIs: + +```go +createdString, err := f.GetString() // Gets a string +createdInt, err := f.GetInt() // Gets an integer +createdByte, err := f.GetByte() // Gets a byte +createdBytes, err := f.GetBytes() // Gets a byte slice +createdBool, err := f.GetBool() // Gets a boolean +err := f.FuzzMap(target_map) // Fills a map +createdTarBytes, err := f.TarBytes() // Gets bytes of a valid tar archive +err := f.CreateFiles(inThisDir) // Fills inThisDir with files +createdString, err := f.GetStringFrom("anyCharInThisString", ofThisLength) // Gets a string that consists of chars from "anyCharInThisString" and has the exact length "ofThisLength" +``` + +Most APIs are added as they are needed. + +## Projects that use go-fuzz-headers +- [runC](https://github.com/opencontainers/runc) +- [Istio](https://github.com/istio/istio) +- [Vitess](https://github.com/vitessio/vitess) +- [Containerd](https://github.com/containerd/containerd) + +Feel free to add your own project to the list, if you use go-fuzz-headers to fuzz it. + + + + +## Status +The project is under development and will be updated regularly. + +## References +go-fuzz-headers' approach to fuzzing structs is strongly inspired by [gofuzz](https://github.com/google/gofuzz). \ No newline at end of file diff --git a/tools/vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go new file mode 100644 index 000000000..fdde08a75 --- /dev/null +++ b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go @@ -0,0 +1,899 @@ +// Copyright 2023 The go-fuzz-headers 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 gofuzzheaders + +import ( + "archive/tar" + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math" + "os" + "path/filepath" + "reflect" + "strings" + "time" + "unsafe" + + securejoin "github.com/cyphar/filepath-securejoin" +) + +var ( + MaxTotalLen uint32 = 2000000 + maxDepth = 100 +) + +func SetMaxTotalLen(newLen uint32) { + MaxTotalLen = newLen +} + +type ConsumeFuzzer struct { + data []byte + dataTotal uint32 + CommandPart []byte + RestOfArray []byte + NumberOfCalls int + position uint32 + fuzzUnexportedFields bool + curDepth int + Funcs map[reflect.Type]reflect.Value +} + +func IsDivisibleBy(n int, divisibleby int) bool { + return (n % divisibleby) == 0 +} + +func NewConsumer(fuzzData []byte) *ConsumeFuzzer { + return &ConsumeFuzzer{ + data: fuzzData, + dataTotal: uint32(len(fuzzData)), + Funcs: make(map[reflect.Type]reflect.Value), + curDepth: 0, + } +} + +func (f *ConsumeFuzzer) Split(minCalls, maxCalls int) error { + if f.dataTotal == 0 { + return errors.New("could not split") + } + numberOfCalls := int(f.data[0]) + if numberOfCalls < minCalls || numberOfCalls > maxCalls { + return errors.New("bad number of calls") + } + if int(f.dataTotal) < numberOfCalls+numberOfCalls+1 { + return errors.New("length of data does not match required parameters") + } + + // Define part 2 and 3 of the data array + commandPart := f.data[1 : numberOfCalls+1] + restOfArray := f.data[numberOfCalls+1:] + + // Just a small check. It is necessary + if len(commandPart) != numberOfCalls { + return errors.New("length of commandPart does not match number of calls") + } + + // Check if restOfArray is divisible by numberOfCalls + if !IsDivisibleBy(len(restOfArray), numberOfCalls) { + return errors.New("length of commandPart does not match number of calls") + } + f.CommandPart = commandPart + f.RestOfArray = restOfArray + f.NumberOfCalls = numberOfCalls + return nil +} + +func (f *ConsumeFuzzer) AllowUnexportedFields() { + f.fuzzUnexportedFields = true +} + +func (f *ConsumeFuzzer) DisallowUnexportedFields() { + f.fuzzUnexportedFields = false +} + +func (f *ConsumeFuzzer) GenerateStruct(targetStruct interface{}) error { + e := reflect.ValueOf(targetStruct).Elem() + return f.fuzzStruct(e, false) +} + +func (f *ConsumeFuzzer) setCustom(v reflect.Value) error { + // First: see if we have a fuzz function for it. + doCustom, ok := f.Funcs[v.Type()] + if !ok { + return fmt.Errorf("could not find a custom function") + } + + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() { + if !v.CanSet() { + return fmt.Errorf("could not use a custom function") + } + v.Set(reflect.New(v.Type().Elem())) + } + case reflect.Map: + if v.IsNil() { + if !v.CanSet() { + return fmt.Errorf("could not use a custom function") + } + v.Set(reflect.MakeMap(v.Type())) + } + default: + return fmt.Errorf("could not use a custom function") + } + + verr := doCustom.Call([]reflect.Value{v, reflect.ValueOf(Continue{ + F: f, + })}) + + // check if we return an error + if verr[0].IsNil() { + return nil + } + return fmt.Errorf("could not use a custom function") +} + +func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error { + if f.curDepth >= maxDepth { + // return err or nil here? + return nil + } + f.curDepth++ + defer func() { f.curDepth-- }() + + // We check if we should check for custom functions + if customFunctions && e.IsValid() && e.CanAddr() { + err := f.setCustom(e.Addr()) + if err != nil { + return err + } + } + + switch e.Kind() { + case reflect.Struct: + for i := 0; i < e.NumField(); i++ { + var v reflect.Value + if !e.Field(i).CanSet() { + if f.fuzzUnexportedFields { + v = reflect.NewAt(e.Field(i).Type(), unsafe.Pointer(e.Field(i).UnsafeAddr())).Elem() + } + if err := f.fuzzStruct(v, customFunctions); err != nil { + return err + } + } else { + v = e.Field(i) + if err := f.fuzzStruct(v, customFunctions); err != nil { + return err + } + } + } + case reflect.String: + str, err := f.GetString() + if err != nil { + return err + } + if e.CanSet() { + e.SetString(str) + } + case reflect.Slice: + var maxElements uint32 + // Byte slices should not be restricted + if e.Type().String() == "[]uint8" { + maxElements = 10000000 + } else { + maxElements = 50 + } + + randQty, err := f.GetUint32() + if err != nil { + return err + } + numOfElements := randQty % maxElements + if (f.dataTotal - f.position) < numOfElements { + numOfElements = f.dataTotal - f.position + } + + uu := reflect.MakeSlice(e.Type(), int(numOfElements), int(numOfElements)) + + for i := 0; i < int(numOfElements); i++ { + // If we have more than 10, then we can proceed with that. + if err := f.fuzzStruct(uu.Index(i), customFunctions); err != nil { + if i >= 10 { + if e.CanSet() { + e.Set(uu) + } + return nil + } else { + return err + } + } + } + if e.CanSet() { + e.Set(uu) + } + case reflect.Uint16: + newInt, err := f.GetUint16() + if err != nil { + return err + } + if e.CanSet() { + e.SetUint(uint64(newInt)) + } + case reflect.Uint32: + newInt, err := f.GetUint32() + if err != nil { + return err + } + if e.CanSet() { + e.SetUint(uint64(newInt)) + } + case reflect.Uint64: + newInt, err := f.GetInt() + if err != nil { + return err + } + if e.CanSet() { + e.SetUint(uint64(newInt)) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + newInt, err := f.GetInt() + if err != nil { + return err + } + if e.CanSet() { + e.SetInt(int64(newInt)) + } + case reflect.Float32: + newFloat, err := f.GetFloat32() + if err != nil { + return err + } + if e.CanSet() { + e.SetFloat(float64(newFloat)) + } + case reflect.Float64: + newFloat, err := f.GetFloat64() + if err != nil { + return err + } + if e.CanSet() { + e.SetFloat(float64(newFloat)) + } + case reflect.Map: + if e.CanSet() { + e.Set(reflect.MakeMap(e.Type())) + const maxElements = 50 + randQty, err := f.GetInt() + if err != nil { + return err + } + numOfElements := randQty % maxElements + for i := 0; i < numOfElements; i++ { + key := reflect.New(e.Type().Key()).Elem() + if err := f.fuzzStruct(key, customFunctions); err != nil { + return err + } + val := reflect.New(e.Type().Elem()).Elem() + if err = f.fuzzStruct(val, customFunctions); err != nil { + return err + } + e.SetMapIndex(key, val) + } + } + case reflect.Ptr: + if e.CanSet() { + e.Set(reflect.New(e.Type().Elem())) + if err := f.fuzzStruct(e.Elem(), customFunctions); err != nil { + return err + } + return nil + } + case reflect.Uint8: + b, err := f.GetByte() + if err != nil { + return err + } + if e.CanSet() { + e.SetUint(uint64(b)) + } + } + return nil +} + +func (f *ConsumeFuzzer) GetStringArray() (reflect.Value, error) { + // The max size of the array: + const max uint32 = 20 + + arraySize := f.position + if arraySize > max { + arraySize = max + } + stringArray := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf("string")), int(arraySize), int(arraySize)) + if f.position+arraySize >= f.dataTotal { + return stringArray, errors.New("could not make string array") + } + + for i := 0; i < int(arraySize); i++ { + stringSize := uint32(f.data[f.position]) + if f.position+stringSize >= f.dataTotal { + return stringArray, nil + } + stringToAppend := string(f.data[f.position : f.position+stringSize]) + strVal := reflect.ValueOf(stringToAppend) + stringArray = reflect.Append(stringArray, strVal) + f.position += stringSize + } + return stringArray, nil +} + +func (f *ConsumeFuzzer) GetInt() (int, error) { + if f.position >= f.dataTotal { + return 0, errors.New("not enough bytes to create int") + } + returnInt := int(f.data[f.position]) + f.position++ + return returnInt, nil +} + +func (f *ConsumeFuzzer) GetByte() (byte, error) { + if f.position >= f.dataTotal { + return 0x00, errors.New("not enough bytes to get byte") + } + returnByte := f.data[f.position] + f.position++ + return returnByte, nil +} + +func (f *ConsumeFuzzer) GetNBytes(numberOfBytes int) ([]byte, error) { + if f.position >= f.dataTotal { + return nil, errors.New("not enough bytes to get byte") + } + returnBytes := make([]byte, 0, numberOfBytes) + for i := 0; i < numberOfBytes; i++ { + newByte, err := f.GetByte() + if err != nil { + return nil, err + } + returnBytes = append(returnBytes, newByte) + } + return returnBytes, nil +} + +func (f *ConsumeFuzzer) GetUint16() (uint16, error) { + u16, err := f.GetNBytes(2) + if err != nil { + return 0, err + } + littleEndian, err := f.GetBool() + if err != nil { + return 0, err + } + if littleEndian { + return binary.LittleEndian.Uint16(u16), nil + } + return binary.BigEndian.Uint16(u16), nil +} + +func (f *ConsumeFuzzer) GetUint32() (uint32, error) { + i, err := f.GetInt() + if err != nil { + return uint32(0), err + } + return uint32(i), nil +} + +func (f *ConsumeFuzzer) GetUint64() (uint64, error) { + u64, err := f.GetNBytes(8) + if err != nil { + return 0, err + } + littleEndian, err := f.GetBool() + if err != nil { + return 0, err + } + if littleEndian { + return binary.LittleEndian.Uint64(u64), nil + } + return binary.BigEndian.Uint64(u64), nil +} + +func (f *ConsumeFuzzer) GetBytes() ([]byte, error) { + if f.position >= f.dataTotal { + return nil, errors.New("not enough bytes to create byte array") + } + length, err := f.GetUint32() + if err != nil { + return nil, errors.New("not enough bytes to create byte array") + } + if f.position+length > MaxTotalLen { + return nil, errors.New("created too large a string") + } + byteBegin := f.position - 1 + if byteBegin >= f.dataTotal { + return nil, errors.New("not enough bytes to create byte array") + } + if length == 0 { + return nil, errors.New("zero-length is not supported") + } + if byteBegin+length >= f.dataTotal { + return nil, errors.New("not enough bytes to create byte array") + } + if byteBegin+length < byteBegin { + return nil, errors.New("numbers overflow") + } + f.position = byteBegin + length + return f.data[byteBegin:f.position], nil +} + +func (f *ConsumeFuzzer) GetString() (string, error) { + if f.position >= f.dataTotal { + return "nil", errors.New("not enough bytes to create string") + } + length, err := f.GetUint32() + if err != nil { + return "nil", errors.New("not enough bytes to create string") + } + if f.position > MaxTotalLen { + return "nil", errors.New("created too large a string") + } + byteBegin := f.position + if byteBegin >= f.dataTotal { + return "nil", errors.New("not enough bytes to create string") + } + if byteBegin+length > f.dataTotal { + return "nil", errors.New("not enough bytes to create string") + } + if byteBegin > byteBegin+length { + return "nil", errors.New("numbers overflow") + } + f.position = byteBegin + length + return string(f.data[byteBegin:f.position]), nil +} + +func (f *ConsumeFuzzer) GetBool() (bool, error) { + if f.position >= f.dataTotal { + return false, errors.New("not enough bytes to create bool") + } + if IsDivisibleBy(int(f.data[f.position]), 2) { + f.position++ + return true, nil + } else { + f.position++ + return false, nil + } +} + +func (f *ConsumeFuzzer) FuzzMap(m interface{}) error { + return f.GenerateStruct(m) +} + +func returnTarBytes(buf []byte) ([]byte, error) { + // Count files + var fileCounter int + tr := tar.NewReader(bytes.NewReader(buf)) + for { + _, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + fileCounter++ + } + if fileCounter >= 1 { + return buf, nil + } + return nil, fmt.Errorf("not enough files were created\n") +} + +func setTarHeaderFormat(hdr *tar.Header, f *ConsumeFuzzer) error { + ind, err := f.GetInt() + if err != nil { + return err + } + switch ind % 4 { + case 0: + hdr.Format = tar.FormatUnknown + case 1: + hdr.Format = tar.FormatUSTAR + case 2: + hdr.Format = tar.FormatPAX + case 3: + hdr.Format = tar.FormatGNU + } + return nil +} + +func setTarHeaderTypeflag(hdr *tar.Header, f *ConsumeFuzzer) error { + ind, err := f.GetInt() + if err != nil { + return err + } + switch ind % 13 { + case 0: + hdr.Typeflag = tar.TypeReg + case 1: + hdr.Typeflag = tar.TypeLink + linkname, err := f.GetString() + if err != nil { + return err + } + hdr.Linkname = linkname + case 2: + hdr.Typeflag = tar.TypeSymlink + linkname, err := f.GetString() + if err != nil { + return err + } + hdr.Linkname = linkname + case 3: + hdr.Typeflag = tar.TypeChar + case 4: + hdr.Typeflag = tar.TypeBlock + case 5: + hdr.Typeflag = tar.TypeDir + case 6: + hdr.Typeflag = tar.TypeFifo + case 7: + hdr.Typeflag = tar.TypeCont + case 8: + hdr.Typeflag = tar.TypeXHeader + case 9: + hdr.Typeflag = tar.TypeXGlobalHeader + case 10: + hdr.Typeflag = tar.TypeGNUSparse + case 11: + hdr.Typeflag = tar.TypeGNULongName + case 12: + hdr.Typeflag = tar.TypeGNULongLink + } + return nil +} + +func tooSmallFileBody(length uint32) bool { + if length < 2 { + return true + } + if length < 4 { + return true + } + if length < 10 { + return true + } + if length < 100 { + return true + } + if length < 500 { + return true + } + if length < 1000 { + return true + } + if length < 2000 { + return true + } + if length < 4000 { + return true + } + if length < 8000 { + return true + } + if length < 16000 { + return true + } + if length < 32000 { + return true + } + if length < 64000 { + return true + } + if length < 128000 { + return true + } + if length < 264000 { + return true + } + return false +} + +func (f *ConsumeFuzzer) createTarFileBody() ([]byte, error) { + length, err := f.GetUint32() + if err != nil { + return nil, errors.New("not enough bytes to create byte array") + } + + shouldUseLargeFileBody, err := f.GetBool() + if err != nil { + return nil, errors.New("not enough bytes to check long file body") + } + + if shouldUseLargeFileBody && tooSmallFileBody(length) { + return nil, errors.New("File body was too small") + } + + // A bit of optimization to attempt to create a file body + // when we don't have as many bytes left as "length" + remainingBytes := f.dataTotal - f.position + if remainingBytes == 0 { + return nil, errors.New("created too large a string") + } + if f.position+length > MaxTotalLen { + return nil, errors.New("created too large a string") + } + byteBegin := f.position + if byteBegin >= f.dataTotal { + return nil, errors.New("not enough bytes to create byte array") + } + if length == 0 { + return nil, errors.New("zero-length is not supported") + } + if byteBegin+length >= f.dataTotal { + return nil, errors.New("not enough bytes to create byte array") + } + if byteBegin+length < byteBegin { + return nil, errors.New("numbers overflow") + } + f.position = byteBegin + length + return f.data[byteBegin:f.position], nil +} + +// getTarFileName is similar to GetString(), but creates string based +// on the length of f.data to reduce the likelihood of overflowing +// f.data. +func (f *ConsumeFuzzer) getTarFilename() (string, error) { + length, err := f.GetUint32() + if err != nil { + return "nil", errors.New("not enough bytes to create string") + } + + // A bit of optimization to attempt to create a file name + // when we don't have as many bytes left as "length" + remainingBytes := f.dataTotal - f.position + if remainingBytes == 0 { + return "nil", errors.New("created too large a string") + } + if remainingBytes < 50 { + length = length % remainingBytes + } else if f.dataTotal < 500 { + length = length % f.dataTotal + } + if f.position > MaxTotalLen { + return "nil", errors.New("created too large a string") + } + byteBegin := f.position + if byteBegin >= f.dataTotal { + return "nil", errors.New("not enough bytes to create string") + } + if byteBegin+length > f.dataTotal { + return "nil", errors.New("not enough bytes to create string") + } + if byteBegin > byteBegin+length { + return "nil", errors.New("numbers overflow") + } + f.position = byteBegin + length + return string(f.data[byteBegin:f.position]), nil +} + +// TarBytes returns valid bytes for a tar archive +func (f *ConsumeFuzzer) TarBytes() ([]byte, error) { + numberOfFiles, err := f.GetInt() + if err != nil { + return nil, err + } + + var buf bytes.Buffer + tw := tar.NewWriter(&buf) + defer tw.Close() + + const maxNoOfFiles = 1000 + for i := 0; i < numberOfFiles%maxNoOfFiles; i++ { + filename, err := f.getTarFilename() + if err != nil { + return returnTarBytes(buf.Bytes()) + } + filebody, err := f.createTarFileBody() + if err != nil { + return returnTarBytes(buf.Bytes()) + } + sec, err := f.GetInt() + if err != nil { + return returnTarBytes(buf.Bytes()) + } + nsec, err := f.GetInt() + if err != nil { + return returnTarBytes(buf.Bytes()) + } + + hdr := &tar.Header{ + Name: filename, + Size: int64(len(filebody)), + Mode: 0o600, + ModTime: time.Unix(int64(sec), int64(nsec)), + } + if err := setTarHeaderTypeflag(hdr, f); err != nil { + return returnTarBytes(buf.Bytes()) + } + if err := setTarHeaderFormat(hdr, f); err != nil { + return returnTarBytes(buf.Bytes()) + } + if err := tw.WriteHeader(hdr); err != nil { + return returnTarBytes(buf.Bytes()) + } + if _, err := tw.Write(filebody); err != nil { + return returnTarBytes(buf.Bytes()) + } + } + return buf.Bytes(), nil +} + +// CreateFiles creates pseudo-random files in rootDir. +// It creates subdirs and places the files there. +// It is the callers responsibility to ensure that +// rootDir exists. +func (f *ConsumeFuzzer) CreateFiles(rootDir string) error { + numberOfFiles, err := f.GetInt() + if err != nil { + return err + } + maxNumberOfFiles := numberOfFiles % 4000 // This is completely arbitrary + if maxNumberOfFiles == 0 { + return errors.New("maxNumberOfFiles is nil") + } + + var noOfCreatedFiles int + for i := 0; i < maxNumberOfFiles; i++ { + // The file to create: + fileName, err := f.GetString() + if err != nil { + if noOfCreatedFiles > 0 { + // If files have been created, we don't return an error. + break + } else { + return errors.New("could not get fileName") + } + } + fullFilePath, err := securejoin.SecureJoin(rootDir, fileName) + if err != nil { + return err + } + + // Find the subdirectory of the file + if subDir := filepath.Dir(fileName); subDir != "" && subDir != "." { + // create the dir first; avoid going outside the root dir + if strings.Contains(subDir, "../") || (len(subDir) > 0 && subDir[0] == 47) || strings.Contains(subDir, "\\") { + continue + } + dirPath, err := securejoin.SecureJoin(rootDir, subDir) + if err != nil { + continue + } + if _, err := os.Stat(dirPath); os.IsNotExist(err) { + err2 := os.MkdirAll(dirPath, 0o777) + if err2 != nil { + continue + } + } + fullFilePath, err = securejoin.SecureJoin(dirPath, fileName) + if err != nil { + continue + } + } else { + // Create symlink + createSymlink, err := f.GetBool() + if err != nil { + if noOfCreatedFiles > 0 { + break + } else { + return errors.New("could not create the symlink") + } + } + if createSymlink { + symlinkTarget, err := f.GetString() + if err != nil { + return err + } + err = os.Symlink(symlinkTarget, fullFilePath) + if err != nil { + return err + } + // stop loop here, since a symlink needs no further action + noOfCreatedFiles++ + continue + } + // We create a normal file + fileContents, err := f.GetBytes() + if err != nil { + if noOfCreatedFiles > 0 { + break + } else { + return errors.New("could not create the file") + } + } + err = os.WriteFile(fullFilePath, fileContents, 0o666) + if err != nil { + continue + } + noOfCreatedFiles++ + } + } + return nil +} + +// GetStringFrom returns a string that can only consist of characters +// included in possibleChars. It returns an error if the created string +// does not have the specified length. +func (f *ConsumeFuzzer) GetStringFrom(possibleChars string, length int) (string, error) { + if (f.dataTotal - f.position) < uint32(length) { + return "", errors.New("not enough bytes to create a string") + } + output := make([]byte, 0, length) + for i := 0; i < length; i++ { + charIndex, err := f.GetInt() + if err != nil { + return string(output), err + } + output = append(output, possibleChars[charIndex%len(possibleChars)]) + } + return string(output), nil +} + +func (f *ConsumeFuzzer) GetRune() ([]rune, error) { + stringToConvert, err := f.GetString() + if err != nil { + return []rune("nil"), err + } + return []rune(stringToConvert), nil +} + +func (f *ConsumeFuzzer) GetFloat32() (float32, error) { + u32, err := f.GetNBytes(4) + if err != nil { + return 0, err + } + littleEndian, err := f.GetBool() + if err != nil { + return 0, err + } + if littleEndian { + u32LE := binary.LittleEndian.Uint32(u32) + return math.Float32frombits(u32LE), nil + } + u32BE := binary.BigEndian.Uint32(u32) + return math.Float32frombits(u32BE), nil +} + +func (f *ConsumeFuzzer) GetFloat64() (float64, error) { + u64, err := f.GetNBytes(8) + if err != nil { + return 0, err + } + littleEndian, err := f.GetBool() + if err != nil { + return 0, err + } + if littleEndian { + u64LE := binary.LittleEndian.Uint64(u64) + return math.Float64frombits(u64LE), nil + } + u64BE := binary.BigEndian.Uint64(u64) + return math.Float64frombits(u64BE), nil +} + +func (f *ConsumeFuzzer) CreateSlice(targetSlice interface{}) error { + return f.GenerateStruct(targetSlice) +} diff --git a/tools/vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go new file mode 100644 index 000000000..8ca3a61b8 --- /dev/null +++ b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go @@ -0,0 +1,62 @@ +// Copyright 2023 The go-fuzz-headers 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 gofuzzheaders + +import ( + "fmt" + "reflect" +) + +type Continue struct { + F *ConsumeFuzzer +} + +func (f *ConsumeFuzzer) AddFuncs(fuzzFuncs []interface{}) { + for i := range fuzzFuncs { + v := reflect.ValueOf(fuzzFuncs[i]) + if v.Kind() != reflect.Func { + panic("Need only funcs!") + } + t := v.Type() + if t.NumIn() != 2 || t.NumOut() != 1 { + fmt.Println(t.NumIn(), t.NumOut()) + + panic("Need 2 in and 1 out params. In must be the type. Out must be an error") + } + argT := t.In(0) + switch argT.Kind() { + case reflect.Ptr, reflect.Map: + default: + panic("fuzzFunc must take pointer or map type") + } + if t.In(1) != reflect.TypeOf(Continue{}) { + panic("fuzzFunc's second parameter must be type Continue") + } + f.Funcs[argT] = v + } +} + +func (f *ConsumeFuzzer) GenerateWithCustom(targetStruct interface{}) error { + e := reflect.ValueOf(targetStruct).Elem() + return f.fuzzStruct(e, true) +} + +func (c Continue) GenerateStruct(targetStruct interface{}) error { + return c.F.GenerateStruct(targetStruct) +} + +func (c Continue) GenerateStructWithCustom(targetStruct interface{}) error { + return c.F.GenerateWithCustom(targetStruct) +} diff --git a/tools/vendor/github.com/AdaLogics/go-fuzz-headers/sql.go b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/sql.go new file mode 100644 index 000000000..2afd49f84 --- /dev/null +++ b/tools/vendor/github.com/AdaLogics/go-fuzz-headers/sql.go @@ -0,0 +1,556 @@ +// Copyright 2023 The go-fuzz-headers 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 gofuzzheaders + +import ( + "fmt" + "strings" +) + +// returns a keyword by index +func getKeyword(f *ConsumeFuzzer) (string, error) { + index, err := f.GetInt() + if err != nil { + return keywords[0], err + } + for i, k := range keywords { + if i == index { + return k, nil + } + } + return keywords[0], fmt.Errorf("could not get a kw") +} + +// Simple utility function to check if a string +// slice contains a string. +func containsString(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + +// These keywords are used specifically for fuzzing Vitess +var keywords = []string{ + "accessible", "action", "add", "after", "against", "algorithm", + "all", "alter", "always", "analyze", "and", "as", "asc", "asensitive", + "auto_increment", "avg_row_length", "before", "begin", "between", + "bigint", "binary", "_binary", "_utf8mb4", "_utf8", "_latin1", "bit", + "blob", "bool", "boolean", "both", "by", "call", "cancel", "cascade", + "cascaded", "case", "cast", "channel", "change", "char", "character", + "charset", "check", "checksum", "coalesce", "code", "collate", "collation", + "column", "columns", "comment", "committed", "commit", "compact", "complete", + "compressed", "compression", "condition", "connection", "constraint", "continue", + "convert", "copy", "cume_dist", "substr", "substring", "create", "cross", + "csv", "current_date", "current_time", "current_timestamp", "current_user", + "cursor", "data", "database", "databases", "day", "day_hour", "day_microsecond", + "day_minute", "day_second", "date", "datetime", "dec", "decimal", "declare", + "default", "definer", "delay_key_write", "delayed", "delete", "dense_rank", + "desc", "describe", "deterministic", "directory", "disable", "discard", + "disk", "distinct", "distinctrow", "div", "double", "do", "drop", "dumpfile", + "duplicate", "dynamic", "each", "else", "elseif", "empty", "enable", + "enclosed", "encryption", "end", "enforced", "engine", "engines", "enum", + "error", "escape", "escaped", "event", "exchange", "exclusive", "exists", + "exit", "explain", "expansion", "export", "extended", "extract", "false", + "fetch", "fields", "first", "first_value", "fixed", "float", "float4", + "float8", "flush", "for", "force", "foreign", "format", "from", "full", + "fulltext", "function", "general", "generated", "geometry", "geometrycollection", + "get", "global", "gtid_executed", "grant", "group", "grouping", "groups", + "group_concat", "having", "header", "high_priority", "hosts", "hour", "hour_microsecond", + "hour_minute", "hour_second", "if", "ignore", "import", "in", "index", "indexes", + "infile", "inout", "inner", "inplace", "insensitive", "insert", "insert_method", + "int", "int1", "int2", "int3", "int4", "int8", "integer", "interval", + "into", "io_after_gtids", "is", "isolation", "iterate", "invoker", "join", + "json", "json_table", "key", "keys", "keyspaces", "key_block_size", "kill", "lag", + "language", "last", "last_value", "last_insert_id", "lateral", "lead", "leading", + "leave", "left", "less", "level", "like", "limit", "linear", "lines", + "linestring", "load", "local", "localtime", "localtimestamp", "lock", "logs", + "long", "longblob", "longtext", "loop", "low_priority", "manifest", + "master_bind", "match", "max_rows", "maxvalue", "mediumblob", "mediumint", + "mediumtext", "memory", "merge", "microsecond", "middleint", "min_rows", "minute", + "minute_microsecond", "minute_second", "mod", "mode", "modify", "modifies", + "multilinestring", "multipoint", "multipolygon", "month", "name", + "names", "natural", "nchar", "next", "no", "none", "not", "no_write_to_binlog", + "nth_value", "ntile", "null", "numeric", "of", "off", "offset", "on", + "only", "open", "optimize", "optimizer_costs", "option", "optionally", + "or", "order", "out", "outer", "outfile", "over", "overwrite", "pack_keys", + "parser", "partition", "partitioning", "password", "percent_rank", "plugins", + "point", "polygon", "precision", "primary", "privileges", "processlist", + "procedure", "query", "quarter", "range", "rank", "read", "reads", "read_write", + "real", "rebuild", "recursive", "redundant", "references", "regexp", "relay", + "release", "remove", "rename", "reorganize", "repair", "repeat", "repeatable", + "replace", "require", "resignal", "restrict", "return", "retry", "revert", + "revoke", "right", "rlike", "rollback", "row", "row_format", "row_number", + "rows", "s3", "savepoint", "schema", "schemas", "second", "second_microsecond", + "security", "select", "sensitive", "separator", "sequence", "serializable", + "session", "set", "share", "shared", "show", "signal", "signed", "slow", + "smallint", "spatial", "specific", "sql", "sqlexception", "sqlstate", + "sqlwarning", "sql_big_result", "sql_cache", "sql_calc_found_rows", + "sql_no_cache", "sql_small_result", "ssl", "start", "starting", + "stats_auto_recalc", "stats_persistent", "stats_sample_pages", "status", + "storage", "stored", "straight_join", "stream", "system", "vstream", + "table", "tables", "tablespace", "temporary", "temptable", "terminated", + "text", "than", "then", "time", "timestamp", "timestampadd", "timestampdiff", + "tinyblob", "tinyint", "tinytext", "to", "trailing", "transaction", "tree", + "traditional", "trigger", "triggers", "true", "truncate", "uncommitted", + "undefined", "undo", "union", "unique", "unlock", "unsigned", "update", + "upgrade", "usage", "use", "user", "user_resources", "using", "utc_date", + "utc_time", "utc_timestamp", "validation", "values", "variables", "varbinary", + "varchar", "varcharacter", "varying", "vgtid_executed", "virtual", "vindex", + "vindexes", "view", "vitess", "vitess_keyspaces", "vitess_metadata", + "vitess_migration", "vitess_migrations", "vitess_replication_status", + "vitess_shards", "vitess_tablets", "vschema", "warnings", "when", + "where", "while", "window", "with", "without", "work", "write", "xor", + "year", "year_month", "zerofill", +} + +// Keywords that could get an additional keyword +var needCustomString = []string{ + "DISTINCTROW", "FROM", // Select keywords: + "GROUP BY", "HAVING", "WINDOW", + "FOR", + "ORDER BY", "LIMIT", + "INTO", "PARTITION", "AS", // Insert Keywords: + "ON DUPLICATE KEY UPDATE", + "WHERE", "LIMIT", // Delete keywords + "INFILE", "INTO TABLE", "CHARACTER SET", // Load keywords + "TERMINATED BY", "ENCLOSED BY", + "ESCAPED BY", "STARTING BY", + "TERMINATED BY", "STARTING BY", + "IGNORE", + "VALUE", "VALUES", // Replace tokens + "SET", // Update tokens + "ENGINE =", // Drop tokens + "DEFINER =", "ON SCHEDULE", "RENAME TO", // Alter tokens + "COMMENT", "DO", "INITIAL_SIZE = ", "OPTIONS", +} + +var alterTableTokens = [][]string{ + {"CUSTOM_FUZZ_STRING"}, + {"CUSTOM_ALTTER_TABLE_OPTIONS"}, + {"PARTITION_OPTIONS_FOR_ALTER_TABLE"}, +} + +var alterTokens = [][]string{ + { + "DATABASE", "SCHEMA", "DEFINER = ", "EVENT", "FUNCTION", "INSTANCE", + "LOGFILE GROUP", "PROCEDURE", "SERVER", + }, + {"CUSTOM_FUZZ_STRING"}, + { + "ON SCHEDULE", "ON COMPLETION PRESERVE", "ON COMPLETION NOT PRESERVE", + "ADD UNDOFILE", "OPTIONS", + }, + {"RENAME TO", "INITIAL_SIZE = "}, + {"ENABLE", "DISABLE", "DISABLE ON SLAVE", "ENGINE"}, + {"COMMENT"}, + {"DO"}, +} + +var setTokens = [][]string{ + {"CHARACTER SET", "CHARSET", "CUSTOM_FUZZ_STRING", "NAMES"}, + {"CUSTOM_FUZZ_STRING", "DEFAULT", "="}, + {"CUSTOM_FUZZ_STRING"}, +} + +var dropTokens = [][]string{ + {"TEMPORARY", "UNDO"}, + { + "DATABASE", "SCHEMA", "EVENT", "INDEX", "LOGFILE GROUP", + "PROCEDURE", "FUNCTION", "SERVER", "SPATIAL REFERENCE SYSTEM", + "TABLE", "TABLESPACE", "TRIGGER", "VIEW", + }, + {"IF EXISTS"}, + {"CUSTOM_FUZZ_STRING"}, + {"ON", "ENGINE = ", "RESTRICT", "CASCADE"}, +} + +var renameTokens = [][]string{ + {"TABLE"}, + {"CUSTOM_FUZZ_STRING"}, + {"TO"}, + {"CUSTOM_FUZZ_STRING"}, +} + +var truncateTokens = [][]string{ + {"TABLE"}, + {"CUSTOM_FUZZ_STRING"}, +} + +var createTokens = [][]string{ + {"OR REPLACE", "TEMPORARY", "UNDO"}, // For create spatial reference system + { + "UNIQUE", "FULLTEXT", "SPATIAL", "ALGORITHM = UNDEFINED", "ALGORITHM = MERGE", + "ALGORITHM = TEMPTABLE", + }, + { + "DATABASE", "SCHEMA", "EVENT", "FUNCTION", "INDEX", "LOGFILE GROUP", + "PROCEDURE", "SERVER", "SPATIAL REFERENCE SYSTEM", "TABLE", "TABLESPACE", + "TRIGGER", "VIEW", + }, + {"IF NOT EXISTS"}, + {"CUSTOM_FUZZ_STRING"}, +} + +/* +// For future use. +var updateTokens = [][]string{ + {"LOW_PRIORITY"}, + {"IGNORE"}, + {"SET"}, + {"WHERE"}, + {"ORDER BY"}, + {"LIMIT"}, +} +*/ + +var replaceTokens = [][]string{ + {"LOW_PRIORITY", "DELAYED"}, + {"INTO"}, + {"PARTITION"}, + {"CUSTOM_FUZZ_STRING"}, + {"VALUES", "VALUE"}, +} + +var loadTokens = [][]string{ + {"DATA"}, + {"LOW_PRIORITY", "CONCURRENT", "LOCAL"}, + {"INFILE"}, + {"REPLACE", "IGNORE"}, + {"INTO TABLE"}, + {"PARTITION"}, + {"CHARACTER SET"}, + {"FIELDS", "COLUMNS"}, + {"TERMINATED BY"}, + {"OPTIONALLY"}, + {"ENCLOSED BY"}, + {"ESCAPED BY"}, + {"LINES"}, + {"STARTING BY"}, + {"TERMINATED BY"}, + {"IGNORE"}, + {"LINES", "ROWS"}, + {"CUSTOM_FUZZ_STRING"}, +} + +// These Are everything that comes after "INSERT" +var insertTokens = [][]string{ + {"LOW_PRIORITY", "DELAYED", "HIGH_PRIORITY", "IGNORE"}, + {"INTO"}, + {"PARTITION"}, + {"CUSTOM_FUZZ_STRING"}, + {"AS"}, + {"ON DUPLICATE KEY UPDATE"}, +} + +// These are everything that comes after "SELECT" +var selectTokens = [][]string{ + {"*", "CUSTOM_FUZZ_STRING", "DISTINCTROW"}, + {"HIGH_PRIORITY"}, + {"STRAIGHT_JOIN"}, + {"SQL_SMALL_RESULT", "SQL_BIG_RESULT", "SQL_BUFFER_RESULT"}, + {"SQL_NO_CACHE", "SQL_CALC_FOUND_ROWS"}, + {"CUSTOM_FUZZ_STRING"}, + {"FROM"}, + {"WHERE"}, + {"GROUP BY"}, + {"HAVING"}, + {"WINDOW"}, + {"ORDER BY"}, + {"LIMIT"}, + {"CUSTOM_FUZZ_STRING"}, + {"FOR"}, +} + +// These are everything that comes after "DELETE" +var deleteTokens = [][]string{ + {"LOW_PRIORITY", "QUICK", "IGNORE", "FROM", "AS"}, + {"PARTITION"}, + {"WHERE"}, + {"ORDER BY"}, + {"LIMIT"}, +} + +var alter_table_options = []string{ + "ADD", "COLUMN", "FIRST", "AFTER", "INDEX", "KEY", "FULLTEXT", "SPATIAL", + "CONSTRAINT", "UNIQUE", "FOREIGN KEY", "CHECK", "ENFORCED", "DROP", "ALTER", + "NOT", "INPLACE", "COPY", "SET", "VISIBLE", "INVISIBLE", "DEFAULT", "CHANGE", + "CHARACTER SET", "COLLATE", "DISABLE", "ENABLE", "KEYS", "TABLESPACE", "LOCK", + "FORCE", "MODIFY", "SHARED", "EXCLUSIVE", "NONE", "ORDER BY", "RENAME COLUMN", + "AS", "=", "ASC", "DESC", "WITH", "WITHOUT", "VALIDATION", "ADD PARTITION", + "DROP PARTITION", "DISCARD PARTITION", "IMPORT PARTITION", "TRUNCATE PARTITION", + "COALESCE PARTITION", "REORGANIZE PARTITION", "EXCHANGE PARTITION", + "ANALYZE PARTITION", "CHECK PARTITION", "OPTIMIZE PARTITION", "REBUILD PARTITION", + "REPAIR PARTITION", "REMOVE PARTITIONING", "USING", "BTREE", "HASH", "COMMENT", + "KEY_BLOCK_SIZE", "WITH PARSER", "AUTOEXTEND_SIZE", "AUTO_INCREMENT", "AVG_ROW_LENGTH", + "CHECKSUM", "INSERT_METHOD", "ROW_FORMAT", "DYNAMIC", "FIXED", "COMPRESSED", "REDUNDANT", + "COMPACT", "SECONDARY_ENGINE_ATTRIBUTE", "STATS_AUTO_RECALC", "STATS_PERSISTENT", + "STATS_SAMPLE_PAGES", "ZLIB", "LZ4", "ENGINE_ATTRIBUTE", "KEY_BLOCK_SIZE", "MAX_ROWS", + "MIN_ROWS", "PACK_KEYS", "PASSWORD", "COMPRESSION", "CONNECTION", "DIRECTORY", + "DELAY_KEY_WRITE", "ENCRYPTION", "STORAGE", "DISK", "MEMORY", "UNION", +} + +// Creates an 'alter table' statement. 'alter table' is an exception +// in that it has its own function. The majority of statements +// are created by 'createStmt()'. +func createAlterTableStmt(f *ConsumeFuzzer) (string, error) { + maxArgs, err := f.GetInt() + if err != nil { + return "", err + } + maxArgs = maxArgs % 30 + if maxArgs == 0 { + return "", fmt.Errorf("could not create alter table stmt") + } + + var stmt strings.Builder + stmt.WriteString("ALTER TABLE ") + for i := 0; i < maxArgs; i++ { + // Calculate if we get existing token or custom string + tokenType, err := f.GetInt() + if err != nil { + return "", err + } + if tokenType%4 == 1 { + customString, err := f.GetString() + if err != nil { + return "", err + } + stmt.WriteString(" " + customString) + } else { + tokenIndex, err := f.GetInt() + if err != nil { + return "", err + } + stmt.WriteString(" " + alter_table_options[tokenIndex%len(alter_table_options)]) + } + } + return stmt.String(), nil +} + +func chooseToken(tokens []string, f *ConsumeFuzzer) (string, error) { + index, err := f.GetInt() + if err != nil { + return "", err + } + var token strings.Builder + token.WriteString(tokens[index%len(tokens)]) + if token.String() == "CUSTOM_FUZZ_STRING" { + customFuzzString, err := f.GetString() + if err != nil { + return "", err + } + return customFuzzString, nil + } + + // Check if token requires an argument + if containsString(needCustomString, token.String()) { + customFuzzString, err := f.GetString() + if err != nil { + return "", err + } + token.WriteString(" " + customFuzzString) + } + return token.String(), nil +} + +var stmtTypes = map[string][][]string{ + "DELETE": deleteTokens, + "INSERT": insertTokens, + "SELECT": selectTokens, + "LOAD": loadTokens, + "REPLACE": replaceTokens, + "CREATE": createTokens, + "DROP": dropTokens, + "RENAME": renameTokens, + "TRUNCATE": truncateTokens, + "SET": setTokens, + "ALTER": alterTokens, + "ALTER TABLE": alterTableTokens, // ALTER TABLE has its own set of tokens +} + +var stmtTypeEnum = map[int]string{ + 0: "DELETE", + 1: "INSERT", + 2: "SELECT", + 3: "LOAD", + 4: "REPLACE", + 5: "CREATE", + 6: "DROP", + 7: "RENAME", + 8: "TRUNCATE", + 9: "SET", + 10: "ALTER", + 11: "ALTER TABLE", +} + +func createStmt(f *ConsumeFuzzer) (string, error) { + stmtIndex, err := f.GetInt() + if err != nil { + return "", err + } + stmtIndex = stmtIndex % len(stmtTypes) + + queryType := stmtTypeEnum[stmtIndex] + tokens := stmtTypes[queryType] + + // We have custom creator for ALTER TABLE + if queryType == "ALTER TABLE" { + query, err := createAlterTableStmt(f) + if err != nil { + return "", err + } + return query, nil + } + + // Here we are creating a query that is not + // an 'alter table' query. For available + // queries, see "stmtTypes" + + // First specify the first query keyword: + var query strings.Builder + query.WriteString(queryType) + + // Next create the args for the + queryArgs, err := createStmtArgs(tokens, f) + if err != nil { + return "", err + } + query.WriteString(" " + queryArgs) + return query.String(), nil +} + +// Creates the arguments of a statements. In a select statement +// that would be everything after "select". +func createStmtArgs(tokenslice [][]string, f *ConsumeFuzzer) (string, error) { + var query, token strings.Builder + + // We go through the tokens in the tokenslice, + // create the respective token and add it to + // "query" + for _, tokens := range tokenslice { + // For extra randomization, the fuzzer can + // choose to not include this token. + includeThisToken, err := f.GetBool() + if err != nil { + return "", err + } + if !includeThisToken { + continue + } + + // There may be several tokens to choose from: + if len(tokens) > 1 { + chosenToken, err := chooseToken(tokens, f) + if err != nil { + return "", err + } + query.WriteString(" " + chosenToken) + } else { + token.WriteString(tokens[0]) + + // In case the token is "CUSTOM_FUZZ_STRING" + // we will then create a non-structured string + if token.String() == "CUSTOM_FUZZ_STRING" { + customFuzzString, err := f.GetString() + if err != nil { + return "", err + } + query.WriteString(" " + customFuzzString) + continue + } + + // Check if token requires an argument. + // Tokens that take an argument can be found + // in 'needCustomString'. If so, we add a + // non-structured string to the token. + if containsString(needCustomString, token.String()) { + customFuzzString, err := f.GetString() + if err != nil { + return "", err + } + token.WriteString(fmt.Sprintf(" %s", customFuzzString)) + } + query.WriteString(fmt.Sprintf(" %s", token.String())) + } + } + return query.String(), nil +} + +// Creates a semi-structured query. It creates a string +// that is a combination of the keywords and random strings. +func createQuery(f *ConsumeFuzzer) (string, error) { + queryLen, err := f.GetInt() + if err != nil { + return "", err + } + maxLen := queryLen % 60 + if maxLen == 0 { + return "", fmt.Errorf("could not create a query") + } + var query strings.Builder + for i := 0; i < maxLen; i++ { + // Get a new token: + useKeyword, err := f.GetBool() + if err != nil { + return "", err + } + if useKeyword { + keyword, err := getKeyword(f) + if err != nil { + return "", err + } + query.WriteString(" " + keyword) + } else { + customString, err := f.GetString() + if err != nil { + return "", err + } + query.WriteString(" " + customString) + } + } + if query.String() == "" { + return "", fmt.Errorf("could not create a query") + } + return query.String(), nil +} + +// GetSQLString is the API that users interact with. +// +// Usage: +// +// f := NewConsumer(data) +// sqlString, err := f.GetSQLString() +func (f *ConsumeFuzzer) GetSQLString() (string, error) { + var query string + veryStructured, err := f.GetBool() + if err != nil { + return "", err + } + if veryStructured { + query, err = createStmt(f) + if err != nil { + return "", err + } + } else { + query, err = createQuery(f) + if err != nil { + return "", err + } + } + return query, nil +} diff --git a/tools/vendor/github.com/Azure/go-ansiterm/SECURITY.md b/tools/vendor/github.com/Azure/go-ansiterm/SECURITY.md new file mode 100644 index 000000000..e138ec5d6 --- /dev/null +++ b/tools/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/tools/vendor/github.com/BurntSushi/toml/decode.go b/tools/vendor/github.com/BurntSushi/toml/decode.go index 09523315b..0ca1dc4fe 100644 --- a/tools/vendor/github.com/BurntSushi/toml/decode.go +++ b/tools/vendor/github.com/BurntSushi/toml/decode.go @@ -21,7 +21,9 @@ type Unmarshaler interface { UnmarshalTOML(interface{}) error } -// Unmarshal decodes the contents of `data` in TOML format into a pointer `v`. +// Unmarshal decodes the contents of data in TOML format into a pointer v. +// +// See [Decoder] for a description of the decoding process. func Unmarshal(data []byte, v interface{}) error { _, err := NewDecoder(bytes.NewReader(data)).Decode(v) return err @@ -29,13 +31,12 @@ func Unmarshal(data []byte, v interface{}) error { // Decode the TOML data in to the pointer v. // -// See the documentation on Decoder for a description of the decoding process. +// See [Decoder] for a description of the decoding process. func Decode(data string, v interface{}) (MetaData, error) { return NewDecoder(strings.NewReader(data)).Decode(v) } -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at path and decode it for you. +// DecodeFile reads the contents of a file and decodes it with [Decode]. func DecodeFile(path string, v interface{}) (MetaData, error) { fp, err := os.Open(path) if err != nil { @@ -48,7 +49,7 @@ func DecodeFile(path string, v interface{}) (MetaData, error) { // Primitive is a TOML value that hasn't been decoded into a Go value. // // This type can be used for any value, which will cause decoding to be delayed. -// You can use the PrimitiveDecode() function to "manually" decode these values. +// You can use [PrimitiveDecode] to "manually" decode these values. // // NOTE: The underlying representation of a `Primitive` value is subject to // change. Do not rely on it. @@ -70,15 +71,15 @@ const ( // Decoder decodes TOML data. // -// TOML tables correspond to Go structs or maps (dealer's choice – they can be -// used interchangeably). +// TOML tables correspond to Go structs or maps; they can be used +// interchangeably, but structs offer better type safety. // // TOML table arrays correspond to either a slice of structs or a slice of maps. // -// TOML datetimes correspond to Go time.Time values. Local datetimes are parsed -// in the local timezone. +// TOML datetimes correspond to [time.Time]. Local datetimes are parsed in the +// local timezone. // -// time.Duration types are treated as nanoseconds if the TOML value is an +// [time.Duration] types are treated as nanoseconds if the TOML value is an // integer, or they're parsed with time.ParseDuration() if they're strings. // // All other TOML types (float, string, int, bool and array) correspond to the @@ -90,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 @@ -168,17 +169,16 @@ func (dec *Decoder) Decode(v interface{}) (MetaData, error) { return md, md.unify(p.mapping, rv) } -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) +// PrimitiveDecode is just like the other Decode* functions, except it decodes a +// TOML value that has already been parsed. Valid primitive values can *only* be +// obtained from values filled by the decoder functions, including this method. +// (i.e., v may contain more [Primitive] values.) // -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) +// Meta data for primitive values is included in the meta data returned by the +// Decode* functions with one exception: keys returned by the Undecoded method +// will only reflect keys that were decoded. Namely, any keys hidden behind a +// Primitive will be considered undecoded. Executing this method will update the +// undecoded keys in the meta data. (See the example.) func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { md.context = primValue.context defer func() { md.context = nil }() diff --git a/tools/vendor/github.com/BurntSushi/toml/decode_go116.go b/tools/vendor/github.com/BurntSushi/toml/decode_go116.go index eddfb641b..086d0b686 100644 --- a/tools/vendor/github.com/BurntSushi/toml/decode_go116.go +++ b/tools/vendor/github.com/BurntSushi/toml/decode_go116.go @@ -7,8 +7,8 @@ import ( "io/fs" ) -// DecodeFS is just like Decode, except it will automatically read the contents -// of the file at `path` from a fs.FS instance. +// DecodeFS reads the contents of a file from [fs.FS] and decodes it with +// [Decode]. func DecodeFS(fsys fs.FS, path string, v interface{}) (MetaData, error) { fp, err := fsys.Open(path) if err != nil { diff --git a/tools/vendor/github.com/BurntSushi/toml/doc.go b/tools/vendor/github.com/BurntSushi/toml/doc.go index 099c4a77d..81a7c0fe9 100644 --- a/tools/vendor/github.com/BurntSushi/toml/doc.go +++ b/tools/vendor/github.com/BurntSushi/toml/doc.go @@ -1,13 +1,11 @@ -/* -Package toml implements decoding and encoding of TOML files. - -This package supports TOML v1.0.0, as listed on https://toml.io - -There is also support for delaying decoding with the Primitive type, and -querying the set of keys in a TOML document with the MetaData type. - -The github.com/BurntSushi/toml/cmd/tomlv package implements a TOML validator, -and can be used to verify if TOML document is valid. It can also be used to -print the type of each key. -*/ +// Package toml implements decoding and encoding of TOML files. +// +// This package supports TOML v1.0.0, as specified at https://toml.io +// +// There is also support for delaying decoding with the Primitive type, and +// querying the set of keys in a TOML document with the MetaData type. +// +// The github.com/BurntSushi/toml/cmd/tomlv package implements a TOML validator, +// and can be used to verify if TOML document is valid. It can also be used to +// print the type of each key. package toml diff --git a/tools/vendor/github.com/BurntSushi/toml/encode.go b/tools/vendor/github.com/BurntSushi/toml/encode.go index dc8568d1b..930e1d521 100644 --- a/tools/vendor/github.com/BurntSushi/toml/encode.go +++ b/tools/vendor/github.com/BurntSushi/toml/encode.go @@ -79,12 +79,12 @@ type Marshaler interface { // Encoder encodes a Go to a TOML document. // // The mapping between Go values and TOML values should be precisely the same as -// for the Decode* functions. +// for [Decode]. // // time.Time is encoded as a RFC 3339 string, and time.Duration as its string // representation. // -// The toml.Marshaler and encoder.TextMarshaler interfaces are supported to +// The [Marshaler] and [encoding.TextMarshaler] interfaces are supported to // encoding the value as custom TOML. // // If you want to write arbitrary binary data then you will need to use @@ -130,7 +130,7 @@ func NewEncoder(w io.Writer) *Encoder { } } -// Encode writes a TOML representation of the Go value to the Encoder's writer. +// Encode writes a TOML representation of the Go value to the [Encoder]'s writer. // // An error is returned if the value given cannot be encoded to a valid TOML // document. @@ -261,7 +261,7 @@ func (enc *Encoder) eElement(rv reflect.Value) { enc.eElement(reflect.ValueOf(v)) return } - encPanic(errors.New(fmt.Sprintf("Unable to convert \"%s\" to neither int64 nor float64", n))) + encPanic(fmt.Errorf("unable to convert %q to int64 or float64", n)) } switch rv.Kind() { @@ -504,7 +504,8 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) { if opts.name != "" { keyName = opts.name } - if opts.omitempty && isEmpty(fieldVal) { + + if opts.omitempty && enc.isEmpty(fieldVal) { continue } if opts.omitzero && isZero(fieldVal) { @@ -648,12 +649,26 @@ func isZero(rv reflect.Value) bool { return false } -func isEmpty(rv reflect.Value) bool { +func (enc *Encoder) isEmpty(rv reflect.Value) bool { switch rv.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: return rv.Len() == 0 case reflect.Struct: - return reflect.Zero(rv.Type()).Interface() == rv.Interface() + if rv.Type().Comparable() { + return reflect.Zero(rv.Type()).Interface() == rv.Interface() + } + // Need to also check if all the fields are empty, otherwise something + // like this with uncomparable types will always return true: + // + // type a struct{ field b } + // 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)) { + return false + } + } + return true case reflect.Bool: return !rv.Bool() } @@ -668,16 +683,15 @@ func (enc *Encoder) newline() { // Write a key/value pair: // -// key = +// key = // // This is also used for "k = v" in inline tables; so something like this will // be written in three calls: // -// ┌────────────────────┠-// │ ┌───┠┌─────â”│ -// v v v v vv -// key = {k = v, k2 = v2} -// +// ┌───────────────────┠+// │ ┌───┠┌────â”│ +// v v v v vv +// key = {k = 1, k2 = 2} func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) { if len(key) == 0 { encPanic(errNoKey) diff --git a/tools/vendor/github.com/BurntSushi/toml/error.go b/tools/vendor/github.com/BurntSushi/toml/error.go index 2ac24e77e..f4f390e64 100644 --- a/tools/vendor/github.com/BurntSushi/toml/error.go +++ b/tools/vendor/github.com/BurntSushi/toml/error.go @@ -5,57 +5,60 @@ import ( "strings" ) -// ParseError is returned when there is an error parsing the TOML syntax. -// -// For example invalid syntax, duplicate keys, etc. +// ParseError is returned when there is an error parsing the TOML syntax such as +// invalid syntax, duplicate keys, etc. // // In addition to the error message itself, you can also print detailed location -// information with context by using ErrorWithPosition(): +// information with context by using [ErrorWithPosition]: // -// toml: error: Key 'fruit' was already created and cannot be used as an array. +// toml: error: Key 'fruit' was already created and cannot be used as an array. // -// At line 4, column 2-7: +// At line 4, column 2-7: // -// 2 | fruit = [] -// 3 | -// 4 | [[fruit]] # Not allowed -// ^^^^^ +// 2 | fruit = [] +// 3 | +// 4 | [[fruit]] # Not allowed +// ^^^^^ // -// Furthermore, the ErrorWithUsage() can be used to print the above with some -// more detailed usage guidance: +// [ErrorWithUsage] can be used to print the above with some more detailed usage +// guidance: // -// toml: error: newlines not allowed within inline tables +// toml: error: newlines not allowed within inline tables // -// At line 1, column 18: +// At line 1, column 18: // -// 1 | x = [{ key = 42 # -// ^ +// 1 | x = [{ key = 42 # +// ^ // -// Error help: +// Error help: // -// Inline tables must always be on a single line: +// Inline tables must always be on a single line: // -// table = {key = 42, second = 43} +// table = {key = 42, second = 43} // -// It is invalid to split them over multiple lines like so: +// It is invalid to split them over multiple lines like so: // -// # INVALID -// table = { -// key = 42, -// second = 43 -// } +// # INVALID +// table = { +// key = 42, +// second = 43 +// } // -// Use regular for this: +// Use regular for this: // -// [table] -// key = 42 -// second = 43 +// [table] +// key = 42 +// second = 43 type ParseError struct { Message string // Short technical message. Usage string // Longer message with usage guidance; may be blank. Position Position // Position of the error LastKey string // Last parsed key, may be blank. - Line int // Line the error occurred. Deprecated: use Position. + + // Line the error occurred. + // + // Deprecated: use [Position]. + Line int err error input string @@ -83,7 +86,7 @@ func (pe ParseError) Error() string { // ErrorWithUsage() returns the error with detailed location context. // -// See the documentation on ParseError. +// See the documentation on [ParseError]. func (pe ParseError) ErrorWithPosition() string { if pe.input == "" { // Should never happen, but just in case. return pe.Error() @@ -124,7 +127,7 @@ func (pe ParseError) ErrorWithPosition() string { // ErrorWithUsage() returns the error with detailed location context and usage // guidance. // -// See the documentation on ParseError. +// See the documentation on [ParseError]. func (pe ParseError) ErrorWithUsage() string { m := pe.ErrorWithPosition() if u, ok := pe.err.(interface{ Usage() string }); ok && u.Usage() != "" { diff --git a/tools/vendor/github.com/BurntSushi/toml/lex.go b/tools/vendor/github.com/BurntSushi/toml/lex.go index 28ed4dd35..d4d70871d 100644 --- a/tools/vendor/github.com/BurntSushi/toml/lex.go +++ b/tools/vendor/github.com/BurntSushi/toml/lex.go @@ -771,7 +771,7 @@ 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 +// a string. It assumes that the beginning ''' has already been consumed and // ignored. func lexMultilineRawString(lx *lexer) stateFn { r := lx.next() diff --git a/tools/vendor/github.com/BurntSushi/toml/meta.go b/tools/vendor/github.com/BurntSushi/toml/meta.go index d284f2a0c..71847a041 100644 --- a/tools/vendor/github.com/BurntSushi/toml/meta.go +++ b/tools/vendor/github.com/BurntSushi/toml/meta.go @@ -71,7 +71,7 @@ func (md *MetaData) Keys() []Key { // Undecoded returns all keys that have not been decoded in the order in which // they appear in the original TOML document. // -// This includes keys that haven't been decoded because of a Primitive value. +// This includes keys that haven't been decoded because of a [Primitive] value. // Once the Primitive value is decoded, the keys will be considered decoded. // // Also note that decoding into an empty interface will result in no decoding, @@ -89,7 +89,7 @@ func (md *MetaData) Undecoded() []Key { return undecoded } -// Key represents any TOML key, including key groups. Use (MetaData).Keys to get +// Key represents any TOML key, including key groups. Use [MetaData.Keys] to get // values of this type. type Key []string diff --git a/tools/vendor/github.com/Masterminds/semver/v3/.golangci.yml b/tools/vendor/github.com/Masterminds/semver/v3/.golangci.yml index fdbdf1448..c87d1c4b9 100644 --- a/tools/vendor/github.com/Masterminds/semver/v3/.golangci.yml +++ b/tools/vendor/github.com/Masterminds/semver/v3/.golangci.yml @@ -4,23 +4,27 @@ run: linters: disable-all: true enable: + - misspell + - structcheck + - govet + - staticcheck - deadcode - - dupl - errcheck - - gofmt - - goimports - - golint - - gosimple - - govet + - varcheck + - unparam - ineffassign - - misspell - nakedret - - structcheck + - gocyclo + - dupl + - goimports + - revive + - gosec + - gosimple + - typecheck - unused - - varcheck linters-settings: gofmt: simplify: true dupl: - threshold: 400 + threshold: 600 diff --git a/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md b/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md index 1f90c38d2..f12626423 100644 --- a/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md +++ b/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 3.2.0 (2022-11-28) + +### Added + +- #190: Added text marshaling and unmarshaling +- #167: Added JSON marshalling for constraints (thanks @SimonTheLeg) +- #173: Implement encoding.TextMarshaler and encoding.TextUnmarshaler on Version (thanks @MarkRosemaker) +- #179: Added New() version constructor (thanks @kazhuravlev) + +### Changed + +- #182/#183: Updated CI testing setup + +### Fixed + +- #186: Fixing issue where validation of constraint section gave false positives +- #176: Fix constraints check with *-0 (thanks @mtt0) +- #181: Fixed Caret operator (^) gives unexpected results when the minor version in constraint is 0 (thanks @arshchimni) +- #161: Fixed godoc (thanks @afirth) + ## 3.1.1 (2020-11-23) ### Fixed diff --git a/tools/vendor/github.com/Masterminds/semver/v3/constraints.go b/tools/vendor/github.com/Masterminds/semver/v3/constraints.go index 547613f04..203072e46 100644 --- a/tools/vendor/github.com/Masterminds/semver/v3/constraints.go +++ b/tools/vendor/github.com/Masterminds/semver/v3/constraints.go @@ -134,6 +134,23 @@ func (cs Constraints) String() string { return strings.Join(buf, " || ") } +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (cs *Constraints) UnmarshalText(text []byte) error { + temp, err := NewConstraint(string(text)) + if err != nil { + return err + } + + *cs = *temp + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (cs Constraints) MarshalText() ([]byte, error) { + return []byte(cs.String()), nil +} + var constraintOps map[string]cfunc var constraintRegex *regexp.Regexp var constraintRangeRegex *regexp.Regexp @@ -180,8 +197,13 @@ func init() { ops, cvRegex)) + // The first time a constraint shows up will look slightly different from + // future times it shows up due to a leading space or comma in a given + // string. validConstraintRegex = regexp.MustCompile(fmt.Sprintf( - `^(\s*(%s)\s*(%s)\s*\,?)+$`, + `^(\s*(%s)\s*(%s)\s*)((?:\s+|,\s*)(%s)\s*(%s)\s*)*$`, + ops, + cvRegex, ops, cvRegex)) } @@ -233,7 +255,7 @@ func parseConstraint(c string) (*constraint, error) { patchDirty := false dirty := false if isX(m[3]) || m[3] == "" { - ver = "0.0.0" + ver = fmt.Sprintf("0.0.0%s", m[6]) dirty = true } else if isX(strings.TrimPrefix(m[4], ".")) || m[4] == "" { minorDirty = true @@ -534,6 +556,10 @@ func constraintCaret(v *Version, c *constraint) (bool, error) { } return false, fmt.Errorf("%s does not have same minor version as %s. Expected minor versions to match when constraint major version is 0", v, c.orig) } + // ^ when the minor is 0 and minor > 0 is =0.0.z + if c.con.Minor() == 0 && v.Minor() > 0 { + return false, fmt.Errorf("%s does not have same minor version as %s", v, c.orig) + } // At this point the major is 0 and the minor is 0 and not dirty. The patch // is not dirty so we need to check if they are equal. If they are not equal diff --git a/tools/vendor/github.com/Masterminds/semver/v3/doc.go b/tools/vendor/github.com/Masterminds/semver/v3/doc.go index 391aa46b7..74f97caa5 100644 --- a/tools/vendor/github.com/Masterminds/semver/v3/doc.go +++ b/tools/vendor/github.com/Masterminds/semver/v3/doc.go @@ -3,12 +3,12 @@ Package semver provides the ability to work with Semantic Versions (http://semve Specifically it provides the ability to: - * Parse semantic versions - * Sort semantic versions - * Check if a semantic version fits within a set of constraints - * Optionally work with a `v` prefix + - Parse semantic versions + - Sort semantic versions + - Check if a semantic version fits within a set of constraints + - Optionally work with a `v` prefix -Parsing Semantic Versions +# Parsing Semantic Versions There are two functions that can parse semantic versions. The `StrictNewVersion` function only parses valid version 2 semantic versions as outlined in the @@ -21,48 +21,48 @@ that can be sorted, compared, and used in constraints. When parsing a version an optional error can be returned if there is an issue parsing the version. For example, - v, err := semver.NewVersion("1.2.3-beta.1+b345") + v, err := semver.NewVersion("1.2.3-beta.1+b345") The version object has methods to get the parts of the version, compare it to other versions, convert the version back into a string, and get the original string. For more details please see the documentation at https://godoc.org/github.com/Masterminds/semver. -Sorting Semantic Versions +# Sorting Semantic Versions A set of versions can be sorted using the `sort` package from the standard library. For example, - raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} - vs := make([]*semver.Version, len(raw)) - for i, r := range raw { - v, err := semver.NewVersion(r) - if err != nil { - t.Errorf("Error parsing version: %s", err) - } + raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} + vs := make([]*semver.Version, len(raw)) + for i, r := range raw { + v, err := semver.NewVersion(r) + if err != nil { + t.Errorf("Error parsing version: %s", err) + } - vs[i] = v - } + vs[i] = v + } - sort.Sort(semver.Collection(vs)) + sort.Sort(semver.Collection(vs)) -Checking Version Constraints and Comparing Versions +# Checking Version Constraints and Comparing Versions There are two methods for comparing versions. One uses comparison methods on `Version` instances and the other is using Constraints. There are some important differences to notes between these two methods of comparison. -1. When two versions are compared using functions such as `Compare`, `LessThan`, - and others it will follow the specification and always include prereleases - within the comparison. It will provide an answer valid with the comparison - spec section at https://semver.org/#spec-item-11 -2. When constraint checking is used for checks or validation it will follow a - different set of rules that are common for ranges with tools like npm/js - and Rust/Cargo. This includes considering prereleases to be invalid if the - ranges does not include on. If you want to have it include pre-releases a - simple solution is to include `-0` in your range. -3. Constraint ranges can have some complex rules including the shorthard use of - ~ and ^. For more details on those see the options below. + 1. When two versions are compared using functions such as `Compare`, `LessThan`, + and others it will follow the specification and always include prereleases + within the comparison. It will provide an answer valid with the comparison + spec section at https://semver.org/#spec-item-11 + 2. When constraint checking is used for checks or validation it will follow a + different set of rules that are common for ranges with tools like npm/js + and Rust/Cargo. This includes considering prereleases to be invalid if the + ranges does not include on. If you want to have it include pre-releases a + simple solution is to include `-0` in your range. + 3. Constraint ranges can have some complex rules including the shorthard use of + ~ and ^. For more details on those see the options below. There are differences between the two methods or checking versions because the comparison methods on `Version` follow the specification while comparison ranges @@ -76,19 +76,19 @@ patters with their versions. Checking a version against version constraints is one of the most featureful parts of the package. - c, err := semver.NewConstraint(">= 1.2.3") - if err != nil { - // Handle constraint not being parsable. - } + c, err := semver.NewConstraint(">= 1.2.3") + if err != nil { + // Handle constraint not being parsable. + } - v, err := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parsable. - } - // Check if the version meets the constraints. The a variable will be true. - a := c.Check(v) + v, err := semver.NewVersion("1.3") + if err != nil { + // Handle version not being parsable. + } + // Check if the version meets the constraints. The a variable will be true. + a := c.Check(v) -Basic Comparisons +# Basic Comparisons There are two elements to the comparisons. First, a comparison string is a list of comma or space separated AND comparisons. These are then separated by || (OR) @@ -99,31 +99,31 @@ greater than or equal to 4.2.3. This can also be written as The basic comparisons are: - * `=`: equal (aliased to no operator) - * `!=`: not equal - * `>`: greater than - * `<`: less than - * `>=`: greater than or equal to - * `<=`: less than or equal to + - `=`: equal (aliased to no operator) + - `!=`: not equal + - `>`: greater than + - `<`: less than + - `>=`: greater than or equal to + - `<=`: less than or equal to -Hyphen Range Comparisons +# Hyphen Range Comparisons There are multiple methods to handle ranges and the first is hyphens ranges. These look like: - * `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` - * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5` + - `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` + - `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5` -Wildcards In Comparisons +# Wildcards In Comparisons The `x`, `X`, and `*` characters can be used as a wildcard character. This works for all comparison operators. When used on the `=` operator it falls back to the tilde operation. For example, - * `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` - * `>= 1.2.x` is equivalent to `>= 1.2.0` - * `<= 2.x` is equivalent to `<= 3` - * `*` is equivalent to `>= 0.0.0` + - `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` + - `>= 1.2.x` is equivalent to `>= 1.2.0` + - `<= 2.x` is equivalent to `<= 3` + - `*` is equivalent to `>= 0.0.0` Tilde Range Comparisons (Patch) @@ -131,11 +131,11 @@ The tilde (`~`) comparison operator is for patch level ranges when a minor version is specified and major level changes when the minor number is missing. For example, - * `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0` - * `~1` is equivalent to `>= 1, < 2` - * `~2.3` is equivalent to `>= 2.3 < 2.4` - * `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` - * `~1.x` is equivalent to `>= 1 < 2` + - `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0` + - `~1` is equivalent to `>= 1, < 2` + - `~2.3` is equivalent to `>= 2.3 < 2.4` + - `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` + - `~1.x` is equivalent to `>= 1 < 2` Caret Range Comparisons (Major) @@ -144,41 +144,41 @@ The caret (`^`) comparison operator is for major level changes once a stable as the API stability level. This is useful when comparisons of API versions as a major change is API breaking. For example, - * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` - * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` - * `^2.3` is equivalent to `>= 2.3, < 3` - * `^2.x` is equivalent to `>= 2.0.0, < 3` - * `^0.2.3` is equivalent to `>=0.2.3 <0.3.0` - * `^0.2` is equivalent to `>=0.2.0 <0.3.0` - * `^0.0.3` is equivalent to `>=0.0.3 <0.0.4` - * `^0.0` is equivalent to `>=0.0.0 <0.1.0` - * `^0` is equivalent to `>=0.0.0 <1.0.0` + - `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` + - `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` + - `^2.3` is equivalent to `>= 2.3, < 3` + - `^2.x` is equivalent to `>= 2.0.0, < 3` + - `^0.2.3` is equivalent to `>=0.2.3 <0.3.0` + - `^0.2` is equivalent to `>=0.2.0 <0.3.0` + - `^0.0.3` is equivalent to `>=0.0.3 <0.0.4` + - `^0.0` is equivalent to `>=0.0.0 <0.1.0` + - `^0` is equivalent to `>=0.0.0 <1.0.0` -Validation +# Validation In addition to testing a version against a constraint, a version can be validated against a constraint. When validation fails a slice of errors containing why a version didn't meet the constraint is returned. For example, - c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") - if err != nil { - // Handle constraint not being parseable. - } - - v, _ := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parseable. - } - - // Validate a version against a constraint. - a, msgs := c.Validate(v) - // a is false - for _, m := range msgs { - fmt.Println(m) - - // Loops over the errors which would read - // "1.3 is greater than 1.2.3" - // "1.3 is less than 1.4" - } + c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") + if err != nil { + // Handle constraint not being parseable. + } + + v, _ := semver.NewVersion("1.3") + if err != nil { + // Handle version not being parseable. + } + + // Validate a version against a constraint. + a, msgs := c.Validate(v) + // a is false + for _, m := range msgs { + fmt.Println(m) + + // Loops over the errors which would read + // "1.3 is greater than 1.2.3" + // "1.3 is less than 1.4" + } */ package semver diff --git a/tools/vendor/github.com/Masterminds/semver/v3/version.go b/tools/vendor/github.com/Masterminds/semver/v3/version.go index d6b9cda3e..7c4bed334 100644 --- a/tools/vendor/github.com/Masterminds/semver/v3/version.go +++ b/tools/vendor/github.com/Masterminds/semver/v3/version.go @@ -55,14 +55,16 @@ func init() { versionRegex = regexp.MustCompile("^" + semVerRegex + "$") } -const num string = "0123456789" -const allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num +const ( + num string = "0123456789" + allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num +) // StrictNewVersion parses a given version and returns an instance of Version or // an error if unable to parse the version. Only parses valid semantic versions. // Performs checking that can find errors within the version. -// If you want to coerce a version, such as 1 or 1.2, and perse that as the 1.x -// releases of semver provided use the NewSemver() function. +// If you want to coerce a version such as 1 or 1.2 and parse it as the 1.x +// releases of semver did, use the NewVersion() function. func StrictNewVersion(v string) (*Version, error) { // Parsing here does not use RegEx in order to increase performance and reduce // allocations. @@ -207,6 +209,23 @@ func NewVersion(v string) (*Version, error) { return sv, nil } +// New creates a new instance of Version with each of the parts passed in as +// arguments instead of parsing a version string. +func New(major, minor, patch uint64, pre, metadata string) *Version { + v := Version{ + major: major, + minor: minor, + patch: patch, + pre: pre, + metadata: metadata, + original: "", + } + + v.original = v.String() + + return &v +} + // MustParse parses a given version and panics on error. func MustParse(v string) *Version { sv, err := NewVersion(v) @@ -267,7 +286,6 @@ func (v Version) Metadata() string { // originalVPrefix returns the original 'v' prefix if any. func (v Version) originalVPrefix() string { - // Note, only lowercase v is supported as a prefix by the parser. if v.original != "" && v.original[:1] == "v" { return v.original[:1] @@ -436,6 +454,23 @@ func (v Version) MarshalJSON() ([]byte, error) { return json.Marshal(v.String()) } +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (v *Version) UnmarshalText(text []byte) error { + temp, err := NewVersion(string(text)) + if err != nil { + return err + } + + *v = *temp + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (v Version) MarshalText() ([]byte, error) { + return []byte(v.String()), nil +} + // Scan implements the SQL.Scanner interface. func (v *Version) Scan(value interface{}) error { var s string @@ -470,7 +505,6 @@ func compareSegment(v, o uint64) int { } func comparePrerelease(v, o string) int { - // split the prelease versions by their part. The separator, per the spec, // is a . sparts := strings.Split(v, ".") @@ -562,7 +596,6 @@ func comparePrePart(s, o string) int { return 1 } return -1 - } // Like strings.ContainsAny but does an only instead of any. diff --git a/tools/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md b/tools/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md index fcdd4e88a..2ce45dd4e 100644 --- a/tools/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md +++ b/tools/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md @@ -1,8 +1,21 @@ # Changelog +## Release 3.2.3 (2022-11-29) + +### Changed + +- Updated docs (thanks @book987 @aJetHorn @neelayu @pellizzetti @apricote @SaigyoujiYuyuko233 @AlekSi) +- #348: Updated huandu/xstrings which fixed a snake case bug (thanks @yxxhero) +- #353: Updated masterminds/semver which included bug fixes +- #354: Updated golang.org/x/crypto which included bug fixes + +## Release 3.2.2 (2021-02-04) + +This is a re-release of 3.2.1 to satisfy something with the Go module system. + ## Release 3.2.1 (2021-02-04) -### Changed +### Changed - Upgraded `Masterminds/goutils` to `v1.1.1`. see the [Security Advisory](https://github.com/Masterminds/goutils/security/advisories/GHSA-xg2h-wx96-xgxr) diff --git a/tools/vendor/github.com/Masterminds/sprig/v3/README.md b/tools/vendor/github.com/Masterminds/sprig/v3/README.md index c37ba01c2..3e22c60e1 100644 --- a/tools/vendor/github.com/Masterminds/sprig/v3/README.md +++ b/tools/vendor/github.com/Masterminds/sprig/v3/README.md @@ -17,10 +17,9 @@ JavaScript libraries, such as [underscore.js](http://underscorejs.org/). ## IMPORTANT NOTES Sprig leverages [mergo](https://github.com/imdario/mergo) to handle merges. In -its v0.3.9 release there was a behavior change that impacts merging template -functions in sprig. It is currently recommended to use v0.3.8 of that package. -Using v0.3.9 will cause sprig tests to fail. The issue in mergo is tracked at -https://github.com/imdario/mergo/issues/139. +its v0.3.9 release, there was a behavior change that impacts merging template +functions in sprig. It is currently recommended to use v0.3.10 or later of that package. +Using v0.3.9 will cause sprig tests to fail. ## Package Versions @@ -51,7 +50,7 @@ To load the Sprig `FuncMap`: ```go import ( - "github.com/Masterminds/sprig" + "github.com/Masterminds/sprig/v3" "html/template" ) diff --git a/tools/vendor/github.com/Microsoft/go-winio/.golangci.yml b/tools/vendor/github.com/Microsoft/go-winio/.golangci.yml index af403bb13..7b503d26a 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/.golangci.yml +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/hvsock.go b/tools/vendor/github.com/Microsoft/go-winio/hvsock.go index 52f1c280f..c88191658 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/hvsock.go +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go b/tools/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go new file mode 100644 index 000000000..1f6538817 --- /dev/null +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go b/tools/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go new file mode 100644 index 000000000..509b3ec64 --- /dev/null +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/fs/security.go b/tools/vendor/github.com/Microsoft/go-winio/internal/fs/security.go new file mode 100644 index 000000000..81760ac67 --- /dev/null +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go new file mode 100644 index 000000000..e2f7bb24e --- /dev/null +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go b/tools/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go index 39e8c05f8..aeb7b7250 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go b/tools/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go new file mode 100644 index 000000000..7ad505702 --- /dev/null +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/pipe.go b/tools/vendor/github.com/Microsoft/go-winio/pipe.go index ca6e38fc0..25cc81103 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/pipe.go +++ b/tools/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/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/doc.go b/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/doc.go new file mode 100644 index 000000000..20b172ccf --- /dev/null +++ b/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/doc.go @@ -0,0 +1,57 @@ +/* +mkwinsyscall generates windows system call bodies + +It parses all files specified on command line containing function +prototypes (like syscall_windows.go) and prints system call bodies +to standard output. + +The prototypes are marked by lines beginning with "//sys" and read +like func declarations if //sys is replaced by func, but: + + - The parameter lists must give a name for each argument. This + includes return parameters. + + - The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + + - If the return parameter is an error number, it must be named err. + + - If go func name needs to be different from its winapi dll name, + the winapi name could be specified at the end, after "=" sign, like + + //sys LoadLibrary(libname string) (handle uint32, err error) = LoadLibraryA + + - Each function that returns err needs to supply a condition, that + return value of winapi will be tested against to detect failure. + This would set err to windows "last-error", otherwise it will be nil. + The value can be provided at end of //sys declaration, like + + //sys LoadLibrary(libname string) (handle uint32, err error) [failretval==-1] = LoadLibraryA + + and is [failretval==0] by default. + + - If the function name ends in a "?", then the function not existing is non- + fatal, and an error will be returned instead of panicking. + +Usage: + + mkwinsyscall [flags] [path ...] + +Flags + + -output string + Output file name (standard output if omitted). + -sort + Sort DLL and function declarations (default true). + Intended to help transition from older versions of mkwinsyscall by making diffs + easier to read and understand. + -systemdll + Whether all DLLs should be loaded from the Windows system directory (default true). + -trace + Generate print statement after every syscall. + -utf16 + Encode string arguments as UTF-16 for syscalls not ending in 'A' or 'W' (default true). + -winio + Import this package ("github.com/Microsoft/go-winio"). +*/ +package main diff --git a/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/mkwinsyscall.go b/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/mkwinsyscall.go new file mode 100644 index 000000000..20d9e3d27 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/go-winio/tools/mkwinsyscall/mkwinsyscall.go @@ -0,0 +1,1059 @@ +//go:build windows + +// Copyright 2013 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 main + +import ( + "bufio" + "bytes" + "errors" + "flag" + "fmt" + "go/format" + "go/parser" + "go/token" + "io" + "log" + "os" + "path/filepath" + "runtime" + "sort" + "strconv" + "strings" + "text/template" + + "golang.org/x/sys/windows" +) + +const ( + pkgSyscall = "syscall" + pkgWindows = "windows" + + // common types. + + tBool = "bool" + tBoolPtr = "*bool" + tError = "error" + tString = "string" + + // error variable names. + + varErr = "err" + varErrNTStatus = "ntStatus" + varErrHR = "hr" +) + +var ( + filename = flag.String("output", "", "output file name (standard output if omitted)") + printTraceFlag = flag.Bool("trace", false, "generate print statement after every syscall") + systemDLL = flag.Bool("systemdll", true, "whether all DLLs should be loaded from the Windows system directory") + winio = flag.Bool("winio", false, `import this package ("github.com/Microsoft/go-winio")`) + utf16 = flag.Bool("utf16", true, "encode string arguments as UTF-16 for syscalls not ending in 'A' or 'W'") + sortdecls = flag.Bool("sort", true, "sort DLL and function declarations") +) + +func trim(s string) string { + return strings.Trim(s, " \t") +} + +func endsIn(s string, c byte) bool { + return len(s) >= 1 && s[len(s)-1] == c +} + +var packageName string + +func packagename() string { + return packageName +} + +func windowsdot() string { + if packageName == pkgWindows { + return "" + } + return pkgWindows + "." +} + +func syscalldot() string { + if packageName == pkgSyscall { + return "" + } + return pkgSyscall + "." +} + +// Param is function parameter. +type Param struct { + Name string + Type string + fn *Fn + tmpVarIdx int +} + +// tmpVar returns temp variable name that will be used to represent p during syscall. +func (p *Param) tmpVar() string { + if p.tmpVarIdx < 0 { + p.tmpVarIdx = p.fn.curTmpVarIdx + p.fn.curTmpVarIdx++ + } + return fmt.Sprintf("_p%d", p.tmpVarIdx) +} + +// BoolTmpVarCode returns source code for bool temp variable. +func (p *Param) BoolTmpVarCode() string { + const code = `var %[1]s uint32 + if %[2]s { + %[1]s = 1 + }` + return fmt.Sprintf(code, p.tmpVar(), p.Name) +} + +// BoolPointerTmpVarCode returns source code for bool temp variable. +func (p *Param) BoolPointerTmpVarCode() string { + const code = `var %[1]s uint32 + if *%[2]s { + %[1]s = 1 + }` + return fmt.Sprintf(code, p.tmpVar(), p.Name) +} + +// SliceTmpVarCode returns source code for slice temp variable. +func (p *Param) SliceTmpVarCode() string { + const code = `var %s *%s + if len(%s) > 0 { + %s = &%s[0] + }` + tmp := p.tmpVar() + return fmt.Sprintf(code, tmp, p.Type[2:], p.Name, tmp, p.Name) +} + +// StringTmpVarCode returns source code for string temp variable. +func (p *Param) StringTmpVarCode() string { + errvar := p.fn.Rets.ErrorVarName() + if errvar == "" { + errvar = "_" + } + tmp := p.tmpVar() + const code = `var %s %s + %s, %s = %s(%s)` + s := fmt.Sprintf(code, tmp, p.fn.StrconvType(), tmp, errvar, p.fn.StrconvFunc(), p.Name) + if errvar == "-" { + return s + } + const morecode = ` + if %s != nil { + return + }` + return s + fmt.Sprintf(morecode, errvar) +} + +// TmpVarCode returns source code for temp variable. +func (p *Param) TmpVarCode() string { + switch { + case p.Type == tBool: + return p.BoolTmpVarCode() + case p.Type == tBoolPtr: + return p.BoolPointerTmpVarCode() + case strings.HasPrefix(p.Type, "[]"): + return p.SliceTmpVarCode() + default: + return "" + } +} + +// TmpVarReadbackCode returns source code for reading back the temp variable into the original variable. +func (p *Param) TmpVarReadbackCode() string { + switch { + case p.Type == tBoolPtr: + return fmt.Sprintf("*%s = %s != 0", p.Name, p.tmpVar()) + default: + return "" + } +} + +// TmpVarHelperCode returns source code for helper's temp variable. +func (p *Param) TmpVarHelperCode() string { + if p.Type != "string" { + return "" + } + return p.StringTmpVarCode() +} + +// SyscallArgList returns source code fragments representing p parameter +// in syscall. Slices are translated into 2 syscall parameters: pointer to +// the first element and length. +func (p *Param) SyscallArgList() []string { + t := p.HelperType() + var s string + switch { + case t == tBoolPtr: + s = fmt.Sprintf("unsafe.Pointer(&%s)", p.tmpVar()) + case t[0] == '*': + s = fmt.Sprintf("unsafe.Pointer(%s)", p.Name) + case t == tBool: + s = p.tmpVar() + case strings.HasPrefix(t, "[]"): + return []string{ + fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.tmpVar()), + fmt.Sprintf("uintptr(len(%s))", p.Name), + } + default: + s = p.Name + } + return []string{fmt.Sprintf("uintptr(%s)", s)} +} + +// IsError determines if p parameter is used to return error. +func (p *Param) IsError() bool { + return p.Name == varErr && p.Type == tError +} + +// HelperType returns type of parameter p used in helper function. +func (p *Param) HelperType() string { + if p.Type == tString { + return p.fn.StrconvType() + } + return p.Type +} + +// join concatenates parameters ps into a string with sep separator. +// Each parameter is converted into string by applying fn to it +// before conversion. +func join(ps []*Param, fn func(*Param) string, sep string) string { + if len(ps) == 0 { + return "" + } + a := make([]string, 0) + for _, p := range ps { + a = append(a, fn(p)) + } + return strings.Join(a, sep) +} + +// Rets describes function return parameters. +type Rets struct { + Name string + Type string + ReturnsError bool + FailCond string + fnMaybeAbsent bool +} + +// ErrorVarName returns error variable name for r. +func (r *Rets) ErrorVarName() string { + if r.ReturnsError { + return varErr + } + if r.Type == tError { + return r.Name + } + return "" +} + +// ToParams converts r into slice of *Param. +func (r *Rets) ToParams() []*Param { + ps := make([]*Param, 0) + if len(r.Name) > 0 { + ps = append(ps, &Param{Name: r.Name, Type: r.Type}) + } + if r.ReturnsError { + ps = append(ps, &Param{Name: varErr, Type: tError}) + } + return ps +} + +// List returns source code of syscall return parameters. +func (r *Rets) List() string { + s := join(r.ToParams(), func(p *Param) string { return p.Name + " " + p.Type }, ", ") + if len(s) > 0 { + s = "(" + s + ")" + } else if r.fnMaybeAbsent { + s = "(err error)" + } + return s +} + +// PrintList returns source code of trace printing part correspondent +// to syscall return values. +func (r *Rets) PrintList() string { + return join(r.ToParams(), func(p *Param) string { return fmt.Sprintf(`"%s=", %s, `, p.Name, p.Name) }, `", ", `) +} + +// SetReturnValuesCode returns source code that accepts syscall return values. +func (r *Rets) SetReturnValuesCode() string { + if r.Name == "" && !r.ReturnsError { + return "" + } + retvar := "r0" + if r.Name == "" { + retvar = "r1" + } + errvar := "_" + if r.ReturnsError { + errvar = "e1" + } + return fmt.Sprintf("%s, _, %s := ", retvar, errvar) +} + +func (r *Rets) useLongHandleErrorCode(retvar string) string { + const code = `if %s { + err = errnoErr(e1) + }` + cond := retvar + " == 0" + if r.FailCond != "" { + cond = strings.Replace(r.FailCond, "failretval", retvar, 1) + } + return fmt.Sprintf(code, cond) +} + +// SetErrorCode returns source code that sets return parameters. +func (r *Rets) SetErrorCode() string { + const code = `if r0 != 0 { + %s = %sErrno(r0) + }` + const ntStatus = `if r0 != 0 { + %s = %sNTStatus(r0) + }` + const hrCode = `if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + %s = %sErrno(r0) + }` + + if r.Name == "" && !r.ReturnsError { + return "" + } + if r.Name == "" { + return r.useLongHandleErrorCode("r1") + } + if r.Type == tError { + switch r.Name { + case varErrNTStatus, strings.ToLower(varErrNTStatus): // allow ntstatus to work + return fmt.Sprintf(ntStatus, r.Name, windowsdot()) + case varErrHR: + return fmt.Sprintf(hrCode, r.Name, syscalldot()) + default: + return fmt.Sprintf(code, r.Name, syscalldot()) + } + } + + var s string + switch { + case r.Type[0] == '*': + s = fmt.Sprintf("%s = (%s)(unsafe.Pointer(r0))", r.Name, r.Type) + case r.Type == tBool: + s = fmt.Sprintf("%s = r0 != 0", r.Name) + default: + s = fmt.Sprintf("%s = %s(r0)", r.Name, r.Type) + } + if !r.ReturnsError { + return s + } + return s + "\n\t" + r.useLongHandleErrorCode(r.Name) +} + +// Fn describes syscall function. +type Fn struct { + Name string + Params []*Param + Rets *Rets + PrintTrace bool + dllname string + dllfuncname string + src string + // TODO: get rid of this field and just use parameter index instead + curTmpVarIdx int // insure tmp variables have uniq names +} + +// extractParams parses s to extract function parameters. +func extractParams(s string, f *Fn) ([]*Param, error) { + s = trim(s) + if s == "" { + return nil, nil + } + a := strings.Split(s, ",") + ps := make([]*Param, len(a)) + for i := range ps { + s2 := trim(a[i]) + b := strings.Split(s2, " ") + if len(b) != 2 { + b = strings.Split(s2, "\t") + if len(b) != 2 { + return nil, errors.New("Could not extract function parameter from \"" + s2 + "\"") + } + } + ps[i] = &Param{ + Name: trim(b[0]), + Type: trim(b[1]), + fn: f, + tmpVarIdx: -1, + } + } + return ps, nil +} + +// extractSection extracts text out of string s starting after start +// and ending just before end. found return value will indicate success, +// and prefix, body and suffix will contain correspondent parts of string s. +func extractSection(s string, start, end rune) (prefix, body, suffix string, found bool) { + s = trim(s) + if strings.HasPrefix(s, string(start)) { + // no prefix + body = s[1:] + } else { + a := strings.SplitN(s, string(start), 2) + if len(a) != 2 { + return "", "", s, false + } + prefix = a[0] + body = a[1] + } + a := strings.SplitN(body, string(end), 2) + if len(a) != 2 { + return "", "", "", false + } + return prefix, a[0], a[1], true +} + +// newFn parses string s and return created function Fn. +func newFn(s string) (*Fn, error) { + s = trim(s) + f := &Fn{ + Rets: &Rets{}, + src: s, + PrintTrace: *printTraceFlag, + } + // function name and args + prefix, body, s, found := extractSection(s, '(', ')') + if !found || prefix == "" { + return nil, errors.New("Could not extract function name and parameters from \"" + f.src + "\"") + } + f.Name = prefix + var err error + f.Params, err = extractParams(body, f) + if err != nil { + return nil, err + } + // return values + _, body, s, found = extractSection(s, '(', ')') + if found { + r, err := extractParams(body, f) + if err != nil { + return nil, err + } + switch len(r) { + case 0: + case 1: + if r[0].IsError() { + f.Rets.ReturnsError = true + } else { + f.Rets.Name = r[0].Name + f.Rets.Type = r[0].Type + } + case 2: + if !r[1].IsError() { + return nil, errors.New("Only last windows error is allowed as second return value in \"" + f.src + "\"") + } + f.Rets.ReturnsError = true + f.Rets.Name = r[0].Name + f.Rets.Type = r[0].Type + default: + return nil, errors.New("Too many return values in \"" + f.src + "\"") + } + } + // fail condition + _, body, s, found = extractSection(s, '[', ']') + if found { + f.Rets.FailCond = body + } + // dll and dll function names + s = trim(s) + if s == "" { + return f, nil + } + if !strings.HasPrefix(s, "=") { + return nil, errors.New("Could not extract dll name from \"" + f.src + "\"") + } + s = trim(s[1:]) + if i := strings.LastIndex(s, "."); i >= 0 { + f.dllname = s[:i] + f.dllfuncname = s[i+1:] + } else { + f.dllfuncname = s + } + if f.dllfuncname == "" { + return nil, fmt.Errorf("function name is not specified in %q", s) + } + if n := f.dllfuncname; endsIn(n, '?') { + f.dllfuncname = n[:len(n)-1] + f.Rets.fnMaybeAbsent = true + } + return f, nil +} + +// DLLName returns DLL name for function f. +func (f *Fn) DLLName() string { + if f.dllname == "" { + return "kernel32" + } + return f.dllname +} + +// DLLVar returns a valid Go identifier that represents DLLName. +func (f *Fn) DLLVar() string { + id := strings.Map(func(r rune) rune { + switch r { + case '.', '-': + return '_' + default: + return r + } + }, f.DLLName()) + if !token.IsIdentifier(id) { + panic(fmt.Errorf("could not create Go identifier for DLLName %q", f.DLLName())) + } + return id +} + +// DLLFuncName returns DLL function name for function f. +func (f *Fn) DLLFuncName() string { + if f.dllfuncname == "" { + return f.Name + } + return f.dllfuncname +} + +// ParamList returns source code for function f parameters. +func (f *Fn) ParamList() string { + return join(f.Params, func(p *Param) string { return p.Name + " " + p.Type }, ", ") +} + +// HelperParamList returns source code for helper function f parameters. +func (f *Fn) HelperParamList() string { + return join(f.Params, func(p *Param) string { return p.Name + " " + p.HelperType() }, ", ") +} + +// ParamPrintList returns source code of trace printing part correspondent +// to syscall input parameters. +func (f *Fn) ParamPrintList() string { + return join(f.Params, func(p *Param) string { return fmt.Sprintf(`"%s=", %s, `, p.Name, p.Name) }, `", ", `) +} + +// ParamCount return number of syscall parameters for function f. +func (f *Fn) ParamCount() int { + n := 0 + for _, p := range f.Params { + n += len(p.SyscallArgList()) + } + return n +} + +// SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/... +// to use. It returns parameter count for correspondent SyscallX function. +func (f *Fn) SyscallParamCount() int { + n := f.ParamCount() + switch { + case n <= 3: + return 3 + case n <= 6: + return 6 + case n <= 9: + return 9 + case n <= 12: + return 12 + case n <= 15: + return 15 + default: + panic("too many arguments to system call") + } +} + +// Syscall determines which SyscallX function to use for function f. +func (f *Fn) Syscall() string { + c := f.SyscallParamCount() + if c == 3 { + return syscalldot() + "Syscall" + } + return syscalldot() + "Syscall" + strconv.Itoa(c) +} + +// SyscallParamList returns source code for SyscallX parameters for function f. +func (f *Fn) SyscallParamList() string { + a := make([]string, 0) + for _, p := range f.Params { + a = append(a, p.SyscallArgList()...) + } + for len(a) < f.SyscallParamCount() { + a = append(a, "0") + } + return strings.Join(a, ", ") +} + +// HelperCallParamList returns source code of call into function f helper. +func (f *Fn) HelperCallParamList() string { + a := make([]string, 0, len(f.Params)) + for _, p := range f.Params { + s := p.Name + if p.Type == tString { + s = p.tmpVar() + } + a = append(a, s) + } + return strings.Join(a, ", ") +} + +// MaybeAbsent returns source code for handling functions that are possibly unavailable. +func (f *Fn) MaybeAbsent() string { + if !f.Rets.fnMaybeAbsent { + return "" + } + const code = `%[1]s = proc%[2]s.Find() + if %[1]s != nil { + return + }` + errorVar := f.Rets.ErrorVarName() + if errorVar == "" { + errorVar = varErr + } + return fmt.Sprintf(code, errorVar, f.DLLFuncName()) +} + +// IsUTF16 is true, if f is W (UTF-16) function and false for all A (ASCII) functions. +// Functions ending in neither will default to UTF-16, unless the `-utf16` flag is set +// to `false`. +func (f *Fn) IsUTF16() bool { + s := f.DLLFuncName() + return endsIn(s, 'W') || (*utf16 && !endsIn(s, 'A')) +} + +// StrconvFunc returns name of Go string to OS string function for f. +func (f *Fn) StrconvFunc() string { + if f.IsUTF16() { + return syscalldot() + "UTF16PtrFromString" + } + return syscalldot() + "BytePtrFromString" +} + +// StrconvType returns Go type name used for OS string for f. +func (f *Fn) StrconvType() string { + if f.IsUTF16() { + return "*uint16" + } + return "*byte" +} + +// HasStringParam is true, if f has at least one string parameter. +// Otherwise it is false. +func (f *Fn) HasStringParam() bool { + for _, p := range f.Params { + if p.Type == tString { + return true + } + } + return false +} + +// HelperName returns name of function f helper. +func (f *Fn) HelperName() string { + if !f.HasStringParam() { + return f.Name + } + return "_" + f.Name +} + +// DLL is a DLL's filename and a string that is valid in a Go identifier that should be used when +// naming a variable that refers to the DLL. +type DLL struct { + Name string + Var string +} + +// Source files and functions. +type Source struct { + Funcs []*Fn + DLLFuncNames []*Fn + Files []string + StdLibImports []string + ExternalImports []string +} + +func (src *Source) Import(pkg string) { + src.StdLibImports = append(src.StdLibImports, pkg) + sort.Strings(src.StdLibImports) +} + +func (src *Source) ExternalImport(pkg string) { + src.ExternalImports = append(src.ExternalImports, pkg) + sort.Strings(src.ExternalImports) +} + +// ParseFiles parses files listed in fs and extracts all syscall +// functions listed in sys comments. It returns source files +// and functions collection *Source if successful. +func ParseFiles(fs []string) (*Source, error) { + src := &Source{ + Funcs: make([]*Fn, 0), + Files: make([]string, 0), + StdLibImports: []string{ + "unsafe", + }, + ExternalImports: make([]string, 0), + } + for _, file := range fs { + if err := src.ParseFile(file); err != nil { + return nil, err + } + } + src.DLLFuncNames = make([]*Fn, 0, len(src.Funcs)) + uniq := make(map[string]bool, len(src.Funcs)) + for _, fn := range src.Funcs { + name := fn.DLLFuncName() + if !uniq[name] { + src.DLLFuncNames = append(src.DLLFuncNames, fn) + uniq[name] = true + } + } + return src, nil +} + +// DLLs return dll names for a source set src. +func (src *Source) DLLs() []DLL { + uniq := make(map[string]bool) + r := make([]DLL, 0) + for _, f := range src.Funcs { + id := f.DLLVar() + if _, found := uniq[id]; !found { + uniq[id] = true + r = append(r, DLL{f.DLLName(), id}) + } + } + if *sortdecls { + sort.Slice(r, func(i, j int) bool { + return r[i].Var < r[j].Var + }) + } + return r +} + +// ParseFile adds additional file (or files, if path is a glob pattern) path to a source set src. +func (src *Source) ParseFile(path string) error { + file, err := os.Open(path) + if err == nil { + defer file.Close() + return src.parseFile(file) + } else if !(errors.Is(err, os.ErrNotExist) || errors.Is(err, windows.ERROR_INVALID_NAME)) { + return err + } + + paths, err := filepath.Glob(path) + if err != nil { + return err + } + + for _, path := range paths { + file, err := os.Open(path) + if err != nil { + return err + } + err = src.parseFile(file) + file.Close() + if err != nil { + return err + } + } + + return nil +} + +func (src *Source) parseFile(file *os.File) error { + s := bufio.NewScanner(file) + for s.Scan() { + t := trim(s.Text()) + if len(t) < 7 { + continue + } + if !strings.HasPrefix(t, "//sys") { + continue + } + t = t[5:] + if !(t[0] == ' ' || t[0] == '\t') { + continue + } + f, err := newFn(t[1:]) + if err != nil { + return err + } + src.Funcs = append(src.Funcs, f) + } + if err := s.Err(); err != nil { + return err + } + src.Files = append(src.Files, file.Name()) + if *sortdecls { + sort.Slice(src.Funcs, func(i, j int) bool { + fi, fj := src.Funcs[i], src.Funcs[j] + if fi.DLLName() == fj.DLLName() { + return fi.DLLFuncName() < fj.DLLFuncName() + } + return fi.DLLName() < fj.DLLName() + }) + } + + // get package name + fset := token.NewFileSet() + _, err := file.Seek(0, 0) + if err != nil { + return err + } + pkg, err := parser.ParseFile(fset, "", file, parser.PackageClauseOnly) + if err != nil { + return err + } + packageName = pkg.Name.Name + + return nil +} + +// IsStdRepo reports whether src is part of standard library. +func (src *Source) IsStdRepo() (bool, error) { + if len(src.Files) == 0 { + return false, errors.New("no input files provided") + } + abspath, err := filepath.Abs(src.Files[0]) + if err != nil { + return false, err + } + goroot := runtime.GOROOT() + if runtime.GOOS == "windows" { + abspath = strings.ToLower(abspath) + goroot = strings.ToLower(goroot) + } + sep := string(os.PathSeparator) + if !strings.HasSuffix(goroot, sep) { + goroot += sep + } + return strings.HasPrefix(abspath, goroot), nil +} + +// Generate output source file from a source set src. +func (src *Source) Generate(w io.Writer) error { + const ( + pkgStd = iota // any package in std library + pkgXSysWindows // x/sys/windows package + pkgOther + ) + isStdRepo, err := src.IsStdRepo() + if err != nil { + return err + } + var pkgtype int + switch { + case isStdRepo: + pkgtype = pkgStd + case packageName == "windows": + // TODO: this needs better logic than just using package name + pkgtype = pkgXSysWindows + default: + pkgtype = pkgOther + } + if *systemDLL { + switch pkgtype { + case pkgStd: + src.Import("internal/syscall/windows/sysdll") + case pkgXSysWindows: + default: + src.ExternalImport("golang.org/x/sys/windows") + } + } + if *winio { + src.ExternalImport("github.com/Microsoft/go-winio") + } + if packageName != "syscall" { + src.Import("syscall") + } + funcMap := template.FuncMap{ + "packagename": packagename, + "syscalldot": syscalldot, + "newlazydll": func(dll string) string { + arg := "\"" + dll + ".dll\"" + if !*systemDLL { + return syscalldot() + "NewLazyDLL(" + arg + ")" + } + if strings.HasPrefix(dll, "api_") || strings.HasPrefix(dll, "ext_") { + arg = strings.Replace(arg, "_", "-", -1) + } + switch pkgtype { + case pkgStd: + return syscalldot() + "NewLazyDLL(sysdll.Add(" + arg + "))" + case pkgXSysWindows: + return "NewLazySystemDLL(" + arg + ")" + default: + return "windows.NewLazySystemDLL(" + arg + ")" + } + }, + } + t := template.Must(template.New("main").Funcs(funcMap).Parse(srcTemplate)) + err = t.Execute(w, src) + if err != nil { + return errors.New("Failed to execute template: " + err.Error()) + } + return nil +} + +func writeTempSourceFile(data []byte) (string, error) { + f, err := os.CreateTemp("", "mkwinsyscall-generated-*.go") + if err != nil { + return "", err + } + _, err = f.Write(data) + if closeErr := f.Close(); err == nil { + err = closeErr + } + if err != nil { + os.Remove(f.Name()) // best effort + return "", err + } + return f.Name(), nil +} + +func usage() { + fmt.Fprintf(os.Stderr, "usage: mkwinsyscall [flags] [path ...]\n") + flag.PrintDefaults() + os.Exit(1) +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + src, err := ParseFiles(flag.Args()) + if err != nil { + log.Fatal(err) + } + + var buf bytes.Buffer + if err := src.Generate(&buf); err != nil { + log.Fatal(err) + } + + data, err := format.Source(buf.Bytes()) + if err != nil { + log.Printf("failed to format source: %v", err) + f, err := writeTempSourceFile(buf.Bytes()) + if err != nil { + log.Fatalf("failed to write unformatted source to file: %v", err) + } + log.Fatalf("for diagnosis, wrote unformatted source to %v", f) + } + if *filename == "" { + _, err = os.Stdout.Write(data) + } else { + //nolint:gosec // G306: code file, no need for wants 0600 + err = os.WriteFile(*filename, data, 0644) + } + if err != nil { + log.Fatal(err) + } +} + +// TODO: use println instead to print in the following template + +const srcTemplate = ` +{{define "main"}} //go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. + +package {{packagename}} + +import ( +{{range .StdLibImports}}"{{.}}" +{{end}} + +{{range .ExternalImports}}"{{.}}" +{{end}} +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = {{syscalldot}}Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = {{syscalldot}}EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e {{syscalldot}}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 ( +{{template "dlls" .}} +{{template "funcnames" .}}) +{{range .Funcs}}{{if .HasStringParam}}{{template "helperbody" .}}{{end}}{{template "funcbody" .}}{{end}} +{{end}} + +{{/* help functions */}} + +{{define "dlls"}}{{range .DLLs}} mod{{.Var}} = {{newlazydll .Name}} +{{end}}{{end}} + +{{define "funcnames"}}{{range .DLLFuncNames}} proc{{.DLLFuncName}} = mod{{.DLLVar}}.NewProc("{{.DLLFuncName}}") +{{end}}{{end}} + +{{define "helperbody"}} +func {{.Name}}({{.ParamList}}) {{template "results" .}}{ +{{template "helpertmpvars" .}} return {{.HelperName}}({{.HelperCallParamList}}) +} +{{end}} + +{{define "funcbody"}} +func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{ +{{template "maybeabsent" .}} {{template "tmpvars" .}} {{template "syscall" .}} {{template "tmpvarsreadback" .}} +{{template "seterror" .}}{{template "printtrace" .}} return +} +{{end}} + +{{define "helpertmpvars"}}{{range .Params}}{{if .TmpVarHelperCode}} {{.TmpVarHelperCode}} +{{end}}{{end}}{{end}} + +{{define "maybeabsent"}}{{if .MaybeAbsent}}{{.MaybeAbsent}} +{{end}}{{end}} + +{{define "tmpvars"}}{{range .Params}}{{if .TmpVarCode}} {{.TmpVarCode}} +{{end}}{{end}}{{end}} + +{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}} + +{{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall}}(proc{{.DLLFuncName}}.Addr(), {{.ParamCount}}, {{.SyscallParamList}}){{end}} + +{{define "tmpvarsreadback"}}{{range .Params}}{{if .TmpVarReadbackCode}} +{{.TmpVarReadbackCode}}{{end}}{{end}}{{end}} + +{{define "seterror"}}{{if .Rets.SetErrorCode}} {{.Rets.SetErrorCode}} +{{end}}{{end}} + +{{define "printtrace"}}{{if .PrintTrace}} print("SYSCALL: {{.Name}}(", {{.ParamPrintList}}") (", {{.Rets.PrintList}}")\n") +{{end}}{{end}} + +` diff --git a/tools/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go index 83f45a135..469b16f63 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go +++ b/tools/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/tools/vendor/github.com/Microsoft/hcsshim/.gitattributes b/tools/vendor/github.com/Microsoft/hcsshim/.gitattributes index 94f480de9..dd0d09faa 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/.gitattributes +++ b/tools/vendor/github.com/Microsoft/hcsshim/.gitattributes @@ -1 +1,3 @@ -* text=auto eol=lf \ No newline at end of file +* text=auto eol=lf +vendor/** -text +test/vendor/** -text \ No newline at end of file diff --git a/tools/vendor/github.com/Microsoft/hcsshim/.gitignore b/tools/vendor/github.com/Microsoft/hcsshim/.gitignore index 54ed6f06c..785972e03 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/.gitignore +++ b/tools/vendor/github.com/Microsoft/hcsshim/.gitignore @@ -6,6 +6,7 @@ # Ignore vscode setting files .vscode/ +.idea/ # Test binary, build with `go test -c` *.test @@ -23,16 +24,26 @@ service/pkg/ *.img *.vhd *.tar.gz +*.tar # Make stuff .rootfs-done bin/* rootfs/* +rootfs-conv/* *.o /build/ deps/* out/* -.idea/ -.vscode/ \ No newline at end of file +# test results +test/results + +# go workspace files +go.work +go.work.sum + +# keys and related artifacts +*.pem +*.cose diff --git a/tools/vendor/github.com/Microsoft/hcsshim/.golangci.yml b/tools/vendor/github.com/Microsoft/hcsshim/.golangci.yml index 2400e7f1e..fdc2a385b 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/.golangci.yml +++ b/tools/vendor/github.com/Microsoft/hcsshim/.golangci.yml @@ -1,23 +1,51 @@ run: timeout: 8m + tests: true + build-tags: + - admin + - functional + - integration + skip-dirs: + # paths are relative to module root + - cri-containerd/test-images linters: enable: - - stylecheck + # defaults: + # - errcheck + # - gosimple + # - govet + # - ineffassign + # - staticcheck + # - typecheck + # - unused + + - gofmt # whether code was gofmt-ed + - nolintlint # ill-formed or insufficient nolint directives + - stylecheck # golint replacement + - thelper # test helpers without t.Helper() 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 is relative to module root, which is ./test/ + - path: cri-containerd + linters: + - stylecheck + text: "^ST1003: should not use underscores in package names$" + source: "^package cri_containerd$" + + # 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. - path: layer.go linters: - stylecheck @@ -28,11 +56,21 @@ issues: - stylecheck Text: "ST1003:" - - path: internal\\hcs\\schema2\\ + - path: cmd\\ncproxy\\nodenetsvc\\ + linters: + - stylecheck + Text: "ST1003:" + + - path: cmd\\ncproxy_mock\\ linters: - stylecheck Text: "ST1003:" + - path: internal\\hcs\\schema2\\ + linters: + - stylecheck + - gofmt + - path: internal\\wclayer\\ linters: - stylecheck @@ -96,4 +134,4 @@ issues: - path: internal\\hcserror\\ linters: - stylecheck - Text: "ST1003:" \ No newline at end of file + Text: "ST1003:" diff --git a/tools/vendor/github.com/Microsoft/hcsshim/Makefile b/tools/vendor/github.com/Microsoft/hcsshim/Makefile index a8f5516cd..742c76d84 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/Makefile +++ b/tools/vendor/github.com/Microsoft/hcsshim/Makefile @@ -1,4 +1,5 @@ BASE:=base.tar.gz +DEV_BUILD:=0 GO:=go GO_FLAGS:=-ldflags "-s -w" # strip Go binaries @@ -12,16 +13,31 @@ GO_FLAGS_EXTRA:= ifeq "$(GOMODVENDOR)" "1" GO_FLAGS_EXTRA += -mod=vendor endif +GO_BUILD_TAGS:= +ifneq ($(strip $(GO_BUILD_TAGS)),) +GO_FLAGS_EXTRA += -tags="$(GO_BUILD_TAGS)" +endif GO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA) SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST)))) +# additional directories to search for rule prerequisites and targets +VPATH=$(SRCROOT) + +DELTA_TARGET=out/delta.tar.gz + +ifeq "$(DEV_BUILD)" "1" +DELTA_TARGET=out/delta-dev.tar.gz +endif # The link aliases for gcstools GCS_TOOLS=\ - generichook + generichook \ + install-drivers .PHONY: all always rootfs test +.DEFAULT_GOAL := all + all: out/initrd.img out/rootfs.tar.gz clean: @@ -29,21 +45,13 @@ clean: rm -rf bin deps rootfs out test: - cd $(SRCROOT) && go test -v ./internal/guest/... + 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 +rootfs: out/rootfs.vhd + +out/rootfs.vhd: out/rootfs.tar.gz bin/cmd/tar2ext4 + gzip -f -d ./out/rootfs.tar.gz + bin/cmd/tar2ext4 -vhd -i ./out/rootfs.tar -o $@ out/rootfs.tar.gz: out/initrd.img rm -rf rootfs-conv @@ -52,13 +60,45 @@ out/rootfs.tar.gz: out/initrd.img 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 +out/initrd.img: $(BASE) $(DELTA_TARGET) $(SRCROOT)/hack/catcpio.sh + $(SRCROOT)/hack/catcpio.sh "$(BASE)" $(DELTA_TARGET) > out/initrd.img.uncompressed gzip -c out/initrd.img.uncompressed > $@ rm out/initrd.img.uncompressed +# This target includes utilities which may be useful for testing purposes. +out/delta-dev.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report + rm -rf rootfs-dev + mkdir rootfs-dev + tar -xzf out/delta.tar.gz -C rootfs-dev + cp bin/internal/tools/snp-report rootfs-dev/bin/ + tar -zcf $@ -C rootfs-dev . + rm -rf rootfs-dev + +out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths Makefile + @mkdir -p out + rm -rf rootfs + mkdir -p rootfs/bin/ + mkdir -p rootfs/info/ + cp bin/init rootfs/ + cp bin/vsockexec rootfs/bin/ + cp bin/cmd/gcs rootfs/bin/ + cp bin/cmd/gcstools rootfs/bin/ + cp bin/cmd/hooks/wait-paths rootfs/bin/ + for tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done + git -C $(SRCROOT) rev-parse HEAD > rootfs/info/gcs.commit && \ + git -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/info/gcs.branch && \ + date --iso-8601=minute --utc > rootfs/info/tar.date + $(if $(and $(realpath $(subst .tar,.testdata.json,$(BASE))), $(shell which jq)), \ + jq -r '.IMAGE_NAME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/image.name && \ + jq -r '.DATETIME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/build.date) + tar -zcf $@ -C rootfs . + rm -rf rootfs + -include deps/cmd/gcs.gomake -include deps/cmd/gcstools.gomake +-include deps/cmd/hooks/wait-paths.gomake +-include deps/cmd/tar2ext4.gomake +-include deps/internal/tools/snp-report.gomake # Implicit rule for includes that define Go targets. %.gomake: $(SRCROOT)/Makefile @@ -72,8 +112,6 @@ out/initrd.img: $(BASE) out/delta.tar.gz $(SRCROOT)/hack/catcpio.sh @/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 $@ $^ diff --git a/tools/vendor/github.com/Microsoft/hcsshim/Protobuild.toml b/tools/vendor/github.com/Microsoft/hcsshim/Protobuild.toml index ee18671aa..471f13386 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/Protobuild.toml +++ b/tools/vendor/github.com/Microsoft/hcsshim/Protobuild.toml @@ -1,4 +1,4 @@ -version = "unstable" +version = "1" generator = "gogoctrd" plugins = ["grpc", "fieldpath"] @@ -14,11 +14,6 @@ plugins = ["grpc", "fieldpath"] # 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] @@ -36,6 +31,10 @@ plugins = ["grpc", "fieldpath"] prefixes = ["github.com/Microsoft/hcsshim/internal/shimdiag"] plugins = ["ttrpc"] +[[overrides]] +prefixes = ["github.com/Microsoft/hcsshim/internal/extendedtask"] +plugins = ["ttrpc"] + [[overrides]] prefixes = ["github.com/Microsoft/hcsshim/internal/computeagent"] plugins = ["ttrpc"] diff --git a/tools/vendor/github.com/Microsoft/hcsshim/README.md b/tools/vendor/github.com/Microsoft/hcsshim/README.md index b8ca926a9..5a1361539 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/README.md +++ b/tools/vendor/github.com/Microsoft/hcsshim/README.md @@ -75,24 +75,6 @@ certify they either authored the work themselves or otherwise have permission to 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/). @@ -101,7 +83,7 @@ contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additio ## Dependencies -This project requires Golang 1.9 or newer to build. +This project requires Golang 1.17 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). diff --git a/tools/vendor/github.com/Microsoft/hcsshim/SECURITY.md b/tools/vendor/github.com/Microsoft/hcsshim/SECURITY.md new file mode 100644 index 000000000..869fdfe2b --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/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/tools/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go index 7f1f2823d..54c4b3bc4 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -17,8 +19,8 @@ import ( // // `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 + title := "hcsshim::AttachLayerStorageFilter" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go index 8e28e6c50..5058d3b55 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -12,8 +14,8 @@ import ( // // `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 + title := "hcsshim::DestroyLayer" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go index 435473257..daf1bfff2 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -12,8 +14,8 @@ import ( // // `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 + title := "hcsshim::DetachLayerStorageFilter" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/export.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/export.go index a1b12dd12..c6370a5c9 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/export.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/export.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -19,8 +21,8 @@ import ( // // `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 + title := "hcsshim::ExportLayer" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -28,17 +30,17 @@ func ExportLayer(ctx context.Context, layerPath, exportFolderPath string, layerD trace.StringAttribute("exportFolderPath", exportFolderPath), ) - ldbytes, err := json.Marshal(layerData) + ldBytes, err := json.Marshal(layerData) if err != nil { return err } - obytes, err := json.Marshal(options) + oBytes, err := json.Marshal(options) if err != nil { return err } - err = hcsExportLayer(layerPath, exportFolderPath, string(ldbytes), string(obytes)) + err = hcsExportLayer(layerPath, exportFolderPath, string(ldBytes), string(oBytes)) if err != nil { return errors.Wrap(err, "failed to export layer") } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/format.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/format.go index 83c0fa33f..2140e5c9f 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/format.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/format.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -5,16 +7,20 @@ import ( "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. +// +// NOTE: This API had a breaking change in the operating system after Windows Server 2019. +// On ws2019 the API expects to get passed a file handle from CreateFile for the vhd that +// the caller wants to format. On > ws2019, its expected that the caller passes a vhd handle +// that can be obtained from the virtdisk APIs. func FormatWritableLayerVhd(ctx context.Context, vhdHandle windows.Handle) (err error) { - title := "hcsshim.FormatWritableLayerVhd" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck + title := "hcsshim::FormatWritableLayerVhd" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go index 87fee452c..c3608dcec 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -6,10 +8,12 @@ import ( "path/filepath" "syscall" - "github.com/Microsoft/go-winio/pkg/security" "github.com/Microsoft/go-winio/vhd" + "github.com/Microsoft/hcsshim/internal/memory" "github.com/pkg/errors" "golang.org/x/sys/windows" + + "github.com/Microsoft/hcsshim/internal/security" ) const defaultVHDXBlockSizeInMB = 1 @@ -59,8 +63,8 @@ func SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVh createParams := &vhd.CreateVirtualDiskParameters{ Version: 2, Version2: vhd.CreateVersion2{ - MaximumSize: sizeInGB * 1024 * 1024 * 1024, - BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, + MaximumSize: sizeInGB * memory.GiB, + BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB, }, } handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) @@ -135,8 +139,8 @@ func SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdP createParams := &vhd.CreateVirtualDiskParameters{ Version: 2, Version2: vhd.CreateVersion2{ - MaximumSize: sizeInGB * 1024 * 1024 * 1024, - BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, + MaximumSize: sizeInGB * memory.GiB, + BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB, }, } handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/import.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/import.go index 0c61dab32..e1c87416a 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/import.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/import.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -19,8 +21,8 @@ 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 + title := "hcsshim::ImportLayer" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go index 53ed8ea6e..d0c621605 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -16,8 +18,8 @@ import ( // // `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 + title := "hcsshim::InitializeWritableLayer" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go index fcdbbef81..4f4d8ebf2 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -6,14 +8,13 @@ import ( "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 + title := "hcsshim::GetLayerVhdMountPath" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go index 06aaf841e..1c685aed0 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go @@ -1,3 +1,5 @@ +//go:build windows + package computestorage import ( @@ -21,8 +23,8 @@ import ( // // `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 + title := "hcsshim::SetupBaseOSLayer" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -48,12 +50,16 @@ func SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.H // `volumePath` is the path to the volume to be used for setup. // // `options` are the options applied while processing the layer. +// +// NOTE: This API is only available on builds of Windows greater than 19645. Inside we +// check if the hosts build has the API available by using 'GetVersion' which requires +// the calling application to be manifested. https://docs.microsoft.com/en-us/windows/win32/sbscs/manifests 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 + title := "hcsshim::SetupBaseOSVolume" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go index 95aff9c18..82d68cb8b 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go @@ -7,7 +7,7 @@ import ( hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" ) -//go:generate go run ../mksyscall_windows.go -output zsyscall_windows.go storage.go +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -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? @@ -20,10 +20,13 @@ import ( //sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath? //sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume? +type Version = hcsschema.Version +type Layer = hcsschema.Layer + // 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"` + SchemaVersion Version `json:"SchemaVersion,omitempty"` + Layers []Layer `json:"Layers,omitempty"` } // ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall. diff --git a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go index 4f9518067..9cf479181 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package computestorage @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } @@ -39,42 +42,86 @@ func errnoErr(e syscall.Errno) error { 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") + procHcsDestoryLayer = modcomputestorage.NewProc("HcsDestoryLayer") procHcsDetachLayerStorageFilter = modcomputestorage.NewProc("HcsDetachLayerStorageFilter") + procHcsExportLayer = modcomputestorage.NewProc("HcsExportLayer") procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") procHcsGetLayerVhdMountPath = modcomputestorage.NewProc("HcsGetLayerVhdMountPath") + procHcsImportLayer = modcomputestorage.NewProc("HcsImportLayer") + procHcsInitializeWritableLayer = modcomputestorage.NewProc("HcsInitializeWritableLayer") + procHcsSetupBaseOSLayer = modcomputestorage.NewProc("HcsSetupBaseOSLayer") procHcsSetupBaseOSVolume = modcomputestorage.NewProc("HcsSetupBaseOSVolume") ) -func hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) { +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(sourceFolderPath) + _p1, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } - var _p2 *uint16 - _p2, hr = syscall.UTF16PtrFromString(layerData) + return _hcsAttachLayerStorageFilter(_p0, _p1) +} + +func _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr error) { + hr = procHcsAttachLayerStorageFilter.Find() if hr != nil { return } - return _hcsImportLayer(_p0, _p1, _p2) + 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 _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) { - if hr = procHcsImportLayer.Find(); hr != nil { +func hcsDestroyLayer(layerPath string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsImportLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(sourceFolderPath)), uintptr(unsafe.Pointer(layerData))) + return _hcsDestroyLayer(_p0) +} + +func _hcsDestroyLayer(layerPath *uint16) (hr error) { + hr = procHcsDestoryLayer.Find() + if 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 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) { + hr = procHcsDetachLayerStorageFilter.Find() + if 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 @@ -109,7 +156,8 @@ func hcsExportLayer(layerPath string, exportFolderPath string, layerData string, } func _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uint16, options *uint16) (hr error) { - if hr = procHcsExportLayer.Find(); hr != nil { + hr = procHcsExportLayer.Find() + if 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) @@ -122,20 +170,27 @@ func _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uin return } -func hcsDestroyLayer(layerPath string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) +func hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) { + hr = procHcsFormatWritableLayerVhd.Find() if hr != nil { return } - return _hcsDestroyLayer(_p0) + 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 _hcsDestroyLayer(layerPath *uint16) (hr error) { - if hr = procHcsDestoryLayer.Find(); hr != nil { +func hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) { + hr = procHcsGetLayerVhdMountPath.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsDestoryLayer.Addr(), 1, uintptr(unsafe.Pointer(layerPath)), 0, 0) + r0, _, _ := syscall.Syscall(procHcsGetLayerVhdMountPath.Addr(), 2, uintptr(vhdHandle), uintptr(unsafe.Pointer(mountPath)), 0) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -145,25 +200,31 @@ func _hcsDestroyLayer(layerPath *uint16) (hr error) { return } -func hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) { +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(options) + _p1, hr = syscall.UTF16PtrFromString(sourceFolderPath) if hr != nil { return } - return _hcsSetupBaseOSLayer(_p0, handle, _p1) + var _p2 *uint16 + _p2, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + return _hcsImportLayer(_p0, _p1, _p2) } -func _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) { - if hr = procHcsSetupBaseOSLayer.Find(); hr != nil { +func _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) { + hr = procHcsImportLayer.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsSetupBaseOSLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(handle), uintptr(unsafe.Pointer(options))) + 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 @@ -193,7 +254,8 @@ func hcsInitializeWritableLayer(writableLayerPath string, layerData string, opti } func _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, options *uint16) (hr error) { - if hr = procHcsInitializeWritableLayer.Find(); hr != nil { + hr = procHcsInitializeWritableLayer.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procHcsInitializeWritableLayer.Addr(), 3, uintptr(unsafe.Pointer(writableLayerPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options))) @@ -206,76 +268,26 @@ func _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, o return } -func hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) { +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(layerData) + _p1, hr = syscall.UTF16PtrFromString(options) 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 + return _hcsSetupBaseOSLayer(_p0, handle, _p1) } -func hcsDetachLayerStorageFilter(layerPath string) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(layerPath) +func _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) { + hr = procHcsSetupBaseOSLayer.Find() 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) + 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 @@ -305,7 +317,8 @@ func hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) ( } func _hcsSetupBaseOSVolume(layerPath *uint16, volumePath *uint16, options *uint16) (hr error) { - if hr = procHcsSetupBaseOSVolume.Find(); hr != nil { + hr = procHcsSetupBaseOSVolume.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procHcsSetupBaseOSVolume.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(options))) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/container.go b/tools/vendor/github.com/Microsoft/hcsshim/container.go index bfd722898..c8f09f88b 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/container.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/container.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( @@ -60,7 +62,7 @@ type container struct { waitCh chan struct{} } -// createComputeSystemAdditionalJSON is read from the environment at initialisation +// createContainerAdditionalJSON is read from the environment at initialization // time. It allows an environment variable to define additional JSON which // is merged in the CreateComputeSystem call to HCS. var createContainerAdditionalJSON []byte diff --git a/tools/vendor/github.com/Microsoft/hcsshim/errors.go b/tools/vendor/github.com/Microsoft/hcsshim/errors.go index f367022e7..594bbfb7a 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/errors.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/errors.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( @@ -50,6 +52,9 @@ var ( // ErrUnexpectedValue is an error encountered when hcs returns an invalid value ErrUnexpectedValue = hcs.ErrUnexpectedValue + // ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied + ErrOperationDenied = hcs.ErrOperationDenied + // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container ErrVmcomputeAlreadyStopped = hcs.ErrVmcomputeAlreadyStopped diff --git a/tools/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 b/tools/vendor/github.com/Microsoft/hcsshim/functional_tests.ps1 deleted file mode 100644 index ce6edbcf3..000000000 --- a/tools/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/tools/vendor/github.com/Microsoft/hcsshim/hcsshim.go b/tools/vendor/github.com/Microsoft/hcsshim/hcsshim.go index ceb3ac85e..13f80e4a8 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hcsshim.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hcsshim.go @@ -1,15 +1,17 @@ +//go:build windows + // Shim for the Host Compute Service (HCS) to manage Windows Server // containers and Hyper-V containers. package hcsshim import ( - "syscall" + "golang.org/x/sys/windows" "github.com/Microsoft/hcsshim/internal/hcserror" ) -//go:generate go run mksyscall_windows.go -output zsyscall_windows.go hcsshim.go +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hcsshim.go //sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId @@ -17,9 +19,9 @@ 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) + ERROR_GEN_FAILURE = windows.ERROR_GEN_FAILURE + ERROR_SHUTDOWN_IN_PROGRESS = windows.ERROR_SHUTDOWN_IN_PROGRESS + WSAEINVAL = windows.WSAEINVAL // Timeout on wait calls TimeoutInfinite = 0xFFFFFFFF diff --git a/tools/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go b/tools/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go index 9e0059447..d8a73de98 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( @@ -13,7 +15,7 @@ type HNSEndpointStats = hns.EndpointStats // Namespace represents a Compartment. type Namespace = hns.Namespace -//SystemType represents the type of the system on which actions are done +// SystemType represents the type of the system on which actions are done type SystemType string // SystemType const diff --git a/tools/vendor/github.com/Microsoft/hcsshim/hnsglobals.go b/tools/vendor/github.com/Microsoft/hcsshim/hnsglobals.go index 2b5381904..c564bf4a3 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hnsglobals.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hnsglobals.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go b/tools/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go index f775fa1d0..925c21249 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hnsnetwork.go @@ -1,14 +1,16 @@ +//go:build windows + package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) -// Subnet is assoicated with a network and represents a list +// Subnet is associated 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 +// MacPool is associated with a network and represents a list // of macaddresses available to the network type MacPool = hns.MacPool diff --git a/tools/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go b/tools/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go index 55aaa4a50..9bfe61ee8 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/hnssupport.go b/tools/vendor/github.com/Microsoft/hcsshim/hnssupport.go index 69405244b..d97681e0c 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/hnssupport.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/hnssupport.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/interface.go b/tools/vendor/github.com/Microsoft/hcsshim/interface.go index 300eb5996..81a281951 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/interface.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/interface.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go index 27a62a723..b60cd383b 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go @@ -1,3 +1,5 @@ +//go:build windows + package cow import ( @@ -86,6 +88,12 @@ type Container interface { // 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/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go index d13772b03..7b27173c3 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go new file mode 100644 index 000000000..d792dda98 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go @@ -0,0 +1 @@ +package hcs diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go index e21354ffd..3e10f5c7e 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( @@ -51,6 +53,9 @@ var ( // ErrUnexpectedValue is an error encountered when hcs returns an invalid value ErrUnexpectedValue = errors.New("unexpected value returned from hcs") + // ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied + ErrOperationDenied = errors.New("operation denied") + // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container ErrVmcomputeAlreadyStopped = syscall.Errno(0xc0370110) @@ -82,7 +87,7 @@ var ( // 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 + // ErrInvalidHandle is an error that can be encountered when querying the properties of a compute system when the handle to that // compute system has already been closed. ErrInvalidHandle = syscall.Errno(0x6) ) @@ -152,33 +157,38 @@ func (e *HcsError) Error() string { return s } +func (e *HcsError) Is(target error) bool { + return errors.Is(e.Err, target) +} + +// unwrap isnt really needed, but helpful convince function + +func (e *HcsError) Unwrap() error { + return e.Err +} + +// Deprecated: net.Error.Temporary is deprecated. func (e *HcsError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() + err := e.netError() + return (err != nil) && err.Temporary() } func (e *HcsError) Timeout() bool { - err, ok := e.Err.(net.Error) - return ok && err.Timeout() + err := e.netError() + return (err != nil) && 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 +func (e *HcsError) netError() (err net.Error) { + if errors.As(e.Unwrap(), &err) { + return err + } + return nil } -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 + HcsError + ID string } var _ net.Error = &SystemError{} @@ -191,29 +201,32 @@ func (e *SystemError) Error() string { return s } -func (e *SystemError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() -} - -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 { + var e *SystemError + if errors.As(err, &e) { return err } + return &SystemError{ - ID: system.ID(), - Op: op, - Err: err, - Events: events, + ID: system.ID(), + HcsError: HcsError{ + Op: op, + Err: err, + Events: events, + }, } } +// ProcessError is an error encountered in HCS during an operation on a Process object +type ProcessError struct { + HcsError + SystemID string + Pid int +} + +var _ net.Error = &ProcessError{} + 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 { @@ -222,27 +235,20 @@ func (e *ProcessError) Error() string { return s } -func (e *ProcessError) Temporary() bool { - err, ok := e.Err.(net.Error) - return ok && err.Temporary() -} - -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 { + var e *ProcessError + if errors.As(err, &e) { return err } return &ProcessError{ Pid: process.Pid(), SystemID: process.SystemID(), - Op: op, - Err: err, - Events: events, + HcsError: HcsError{ + Op: op, + Err: err, + Events: events, + }, } } @@ -251,41 +257,41 @@ func makeProcessError(process *Process, op string, err error, events []ErrorEven // 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 + return IsAny(err, ErrComputeSystemDoesNotExist, 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 + return errors.Is(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 + return errors.Is(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 + return errors.Is(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() { + // HcsError and co. implement Timeout regardless of whether the errors they wrap do, + // so `errors.As(err, net.Error)`` will always be true. + // Using `errors.As(err.Unwrap(), net.Err)` wont work for general errors. + // So first check if there an `ErrTimeout` in the chain, then convert to a net error. + if errors.Is(err, ErrTimeout) { return true } - err = getInnerError(err) - return err == ErrTimeout + + var nerr net.Error + return errors.As(err, &nerr) && nerr.Timeout() } // IsAlreadyStopped returns a boolean indicating whether the error is caused by @@ -294,10 +300,7 @@ func IsTimeout(err error) bool { // 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 + return IsAny(err, ErrVmcomputeAlreadyStopped, ErrProcessAlreadyStopped, ErrElementNotFound) } // IsNotSupported returns a boolean indicating whether the error is caused by @@ -306,38 +309,28 @@ func IsAlreadyStopped(err error) bool { // 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 + return IsAny(err, ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported, ErrVmcomputeUnknownMessage) } // IsOperationInvalidState returns true when err is caused by // `ErrVmcomputeOperationInvalidState`. func IsOperationInvalidState(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeOperationInvalidState + return errors.Is(err, ErrVmcomputeOperationInvalidState) } // IsAccessIsDenied returns true when err is caused by // `ErrVmcomputeOperationAccessIsDenied`. func IsAccessIsDenied(err error) bool { - err = getInnerError(err) - return err == ErrVmcomputeOperationAccessIsDenied + return errors.Is(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 +// IsAny is a vectorized version of [errors.Is], it returns true if err is one of targets. +func IsAny(err error, targets ...error) bool { + for _, e := range targets { + if errors.Is(err, e) { + return true + } } - return err + return false } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go index f4605922a..e437e297c 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( @@ -10,6 +12,7 @@ import ( "syscall" "time" + "github.com/Microsoft/hcsshim/internal/cow" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/vmcompute" @@ -36,6 +39,8 @@ type Process struct { waitError error } +var _ cow.Process = &Process{} + func newProcess(process vmcompute.HcsProcess, processID int, computeSystem *System) *Process { return &Process{ handle: process, @@ -89,10 +94,7 @@ func (process *Process) processSignalResult(ctx context.Context, err error) (boo case nil: return true, nil case ErrVmcomputeOperationInvalidState, ErrComputeSystemDoesNotExist, ErrElementNotFound: - select { - case <-process.waitBlock: - // The process exit notification has already arrived. - default: + if !process.stopped() { // 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. @@ -114,9 +116,9 @@ func (process *Process) processSignalResult(ctx context.Context, err error) (boo // Signal signals the process with `options`. // -// For LCOW `guestrequest.SignalProcessOptionsLCOW`. +// For LCOW `guestresource.SignalProcessOptionsLCOW`. // -// For WCOW `guestrequest.SignalProcessOptionsWCOW`. +// For WCOW `guestresource.SignalProcessOptionsWCOW`. func (process *Process) Signal(ctx context.Context, options interface{}) (bool, error) { process.handleLock.RLock() defer process.handleLock.RUnlock() @@ -152,6 +154,10 @@ func (process *Process) Kill(ctx context.Context) (bool, error) { return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) } + if process.stopped() { + return false, makeProcessError(process, operation, ErrProcessAlreadyStopped, 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 @@ -161,7 +167,39 @@ func (process *Process) Kill(ctx context.Context) (bool, error) { return true, nil } - resultJSON, err := vmcompute.HcsTerminateProcess(ctx, process.handle) + // HCS serializes the signals sent to a target pid per compute system handle. + // To avoid SIGKILL being serialized behind other signals, we open a new compute + // system handle to deliver the kill signal. + // If the calls to opening a new compute system handle fail, we forcefully + // terminate the container itself so that no container is left behind + hcsSystem, err := OpenComputeSystem(ctx, process.system.id) + if err != nil { + // log error and force termination of container + log.G(ctx).WithField("err", err).Error("OpenComputeSystem() call failed") + err = process.system.Terminate(ctx) + // if the Terminate() call itself ever failed, log and return error + if err != nil { + log.G(ctx).WithField("err", err).Error("Terminate() call failed") + return false, err + } + process.system.Close() + return true, nil + } + defer hcsSystem.Close() + + newProcessHandle, err := hcsSystem.OpenProcess(ctx, process.Pid()) + if err != nil { + // Return true only if the target process has either already + // exited, or does not exist. + if IsAlreadyStopped(err) { + return true, nil + } else { + return false, err + } + } + defer newProcessHandle.Close() + + resultJSON, err := vmcompute.HcsTerminateProcess(ctx, newProcessHandle.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). @@ -185,9 +223,9 @@ func (process *Process) Kill(ctx context.Context) (bool, error) { } } events := processHcsResult(ctx, resultJSON) - delivered, err := process.processSignalResult(ctx, err) + delivered, err := newProcessHandle.processSignalResult(ctx, err) if err != nil { - err = makeProcessError(process, operation, err, events) + err = makeProcessError(newProcessHandle, operation, err, events) } process.killSignalDelivered = delivered @@ -201,7 +239,7 @@ func (process *Process) Kill(ctx context.Context) (bool, error) { // call multiple times. func (process *Process) waitBackground() { operation := "hcs::Process::waitBackground" - ctx, span := trace.StartSpan(context.Background(), operation) + ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), @@ -227,12 +265,12 @@ func (process *Process) waitBackground() { propertiesJSON, resultJSON, err = vmcompute.HcsGetProcessProperties(ctx, process.handle) events := processHcsResult(ctx, resultJSON) if err != nil { - err = makeProcessError(process, operation, err, events) //nolint:ineffassign + err = makeProcessError(process, operation, err, events) } else { properties := &processStatus{} err = json.Unmarshal([]byte(propertiesJSON), properties) if err != nil { - err = makeProcessError(process, operation, err, nil) //nolint:ineffassign + err = makeProcessError(process, operation, err, nil) } else { if properties.LastWaitResult != 0 { log.G(ctx).WithField("wait-result", properties.LastWaitResult).Warning("non-zero last wait result") @@ -254,12 +292,22 @@ func (process *Process) waitBackground() { } // Wait waits for the process to exit. If the process has already exited returns -// the pervious error (if any). +// the previous error (if any). func (process *Process) Wait() error { <-process.waitBlock return process.waitError } +// Exited returns if the process has stopped +func (process *Process) stopped() bool { + select { + case <-process.waitBlock: + return true + default: + return false + } +} + // ResizeConsole resizes the console of the process. func (process *Process) ResizeConsole(ctx context.Context, width, height uint16) error { process.handleLock.RLock() @@ -296,15 +344,13 @@ func (process *Process) ResizeConsole(ctx context.Context, width, height uint16) // 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: + if !process.stopped() { return -1, makeProcessError(process, "hcs::Process::ExitCode", ErrInvalidProcessState, nil) } + if process.waitError != nil { + return -1, process.waitError + } + return process.exitCode, nil } // StdioLegacy returns the stdin, stdout, and stderr pipes, respectively. Closing @@ -312,7 +358,7 @@ func (process *Process) ExitCode() (int, error) { // 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) + ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -350,7 +396,7 @@ func (process *Process) StdioLegacy() (_ io.WriteCloser, _ io.ReadCloser, _ io.R } // Stdio returns the stdin, stdout, and stderr pipes, respectively. -// To close them, close the process handle. +// To close them, close the process handle, or use the `CloseStd*` functions. func (process *Process) Stdio() (stdin io.Writer, stdout, stderr io.Reader) { process.stdioLock.Lock() defer process.stdioLock.Unlock() @@ -359,46 +405,57 @@ func (process *Process) Stdio() (stdin io.Writer, stdout, stderr io.Reader) { // 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 { +func (process *Process) CloseStdin(ctx context.Context) (err error) { + operation := "hcs::Process::CloseStdin" + ctx, span := trace.StartSpan(ctx, 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() - operation := "hcs::Process::CloseStdin" - if process.handle == 0 { return makeProcessError(process, operation, ErrAlreadyClosed, nil) } - modifyRequest := processModifyRequest{ - Operation: modifyCloseHandle, - CloseHandle: &closeHandle{ - Handle: stdIn, - }, + process.stdioLock.Lock() + defer process.stdioLock.Unlock() + if process.stdin == nil { + return nil } - modifyRequestb, err := json.Marshal(modifyRequest) - if err != nil { - return err - } + //HcsModifyProcess request to close stdin will fail if the process has already exited + if !process.stopped() { + modifyRequest := processModifyRequest{ + Operation: modifyCloseHandle, + CloseHandle: &closeHandle{ + Handle: stdIn, + }, + } - resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) - events := processHcsResult(ctx, resultJSON) - if err != nil { - return makeProcessError(process, operation, err, events) - } + modifyRequestb, err := json.Marshal(modifyRequest) + if err != nil { + return err + } - process.stdioLock.Lock() - if process.stdin != nil { - process.stdin.Close() - process.stdin = nil + resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) + events := processHcsResult(ctx, resultJSON) + if err != nil { + return makeProcessError(process, operation, err, events) + } } - process.stdioLock.Unlock() + + process.stdin.Close() + process.stdin = nil return nil } func (process *Process) CloseStdout(ctx context.Context) (err error) { - ctx, span := trace.StartSpan(ctx, "hcs::Process::CloseStdout") //nolint:ineffassign,staticcheck + ctx, span := oc.StartSpan(ctx, "hcs::Process::CloseStdout") //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -422,7 +479,7 @@ func (process *Process) CloseStdout(ctx context.Context) (err error) { } func (process *Process) CloseStderr(ctx context.Context) (err error) { - ctx, span := trace.StartSpan(ctx, "hcs::Process::CloseStderr") //nolint:ineffassign,staticcheck + ctx, span := oc.StartSpan(ctx, "hcs::Process::CloseStderr") //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -441,7 +498,6 @@ func (process *Process) CloseStderr(ctx context.Context) (err error) { if process.stderr != nil { process.stderr.Close() process.stderr = nil - } return nil } @@ -450,7 +506,7 @@ func (process *Process) CloseStderr(ctx context.Context) (err error) { // or wait on it. func (process *Process) Close() (err error) { operation := "hcs::Process::Close" - ctx, span := trace.StartSpan(context.Background(), operation) + ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go index b621c5593..d1f219cfa 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go @@ -1,3 +1,5 @@ +//go:build windows + package schema1 import ( @@ -101,7 +103,7 @@ type ContainerConfig struct { 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 + DNSSearchList string `json:",omitempty"` // Comma separated 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 diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go index bbad6a2c4..31fe07c3a 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go @@ -9,6 +9,14 @@ package hcsschema +type CPUGroupPropertyCode uint32 + +const ( + CPUCapacityProperty = 0x00010000 + CPUSchedulingPriorityProperty = 0x00020000 + IdleLPReserveProperty = 0x00030000 +) + type CpuGroupProperty struct { PropertyCode uint32 `json:"PropertyCode,omitempty"` PropertyValue uint32 `json:"PropertyValue,omitempty"` diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go new file mode 100644 index 000000000..5385850fe --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go @@ -0,0 +1,22 @@ +/* + * 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 DebugOptions struct { + // BugcheckSavedStateFileName is the path for the file in which the guest VM state will be saved when + // the guest crashes. + BugcheckSavedStateFileName string `json:"BugcheckSavedStateFileName,omitempty"` + // BugcheckNoCrashdumpSavedStateFileName is the path of the file in which the guest VM state will be + // saved when the guest crashes but the guest isn't able to generate the crash dump. This usually + // happens in early boot failures. + BugcheckNoCrashdumpSavedStateFileName string `json:"BugcheckNoCrashdumpSavedStateFileName,omitempty"` + TripleFaultSavedStateFileName string `json:"TripleFaultSavedStateFileName,omitempty"` + FirmwareDumpFileName string `json:"FirmwareDumpFileName,omitempty"` +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go index ef1eec886..a48a65394 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go @@ -14,6 +14,9 @@ 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 guest state file type affected by different guest isolation modes - whether a file or block storage. + GuestStateFileType string `json:"GuestStateFileType,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"` diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go new file mode 100644 index 000000000..3726a297e --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go @@ -0,0 +1,21 @@ +/* + * 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 IsolationSettings struct { + // Guest isolation type options to decide virtual trust levels of virtual machine + IsolationType string `json:"IsolationType,omitempty"` + // Configuration to debug HCL layer for HCS VM TODO: Task 31102306: Miss the way to prevent the exposure of private debug configuration in HCS TODO: Think about the secret configurations which are private in VMMS VM (only edit by hvsedit) + DebugHost string `json:"DebugHost,omitempty"` + DebugPort int64 `json:"DebugPort,omitempty"` + // Optional data passed by host on isolated virtual machine start + LaunchData string `json:"LaunchData,omitempty"` + HclEnabled bool `json:"HclEnabled,omitempty"` +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go index d29455a3e..6364da8e2 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go @@ -9,10 +9,12 @@ package hcsschema +import "github.com/Microsoft/hcsshim/internal/protocol/guestrequest" + type ModifySettingRequest struct { ResourcePath string `json:"ResourcePath,omitempty"` - RequestType string `json:"RequestType,omitempty"` + RequestType guestrequest.RequestType `json:"RequestType,omitempty"` // NOTE: Swagger generated as string. Locally updated. Settings interface{} `json:"Settings,omitempty"` // NOTE: Swagger generated as *interface{}. Locally updated diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go new file mode 100644 index 000000000..14f0299e3 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go @@ -0,0 +1,16 @@ +/* + * 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 SecuritySettings struct { + // Enablement of Trusted Platform Module on the computer system + EnableTpm bool `json:"EnableTpm,omitempty"` + Isolation *IsolationSettings `json:"Isolation,omitempty"` +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go new file mode 100644 index 000000000..72de80149 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go @@ -0,0 +1,28 @@ +/* + * 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 SystemTime struct { + Year int32 `json:"Year,omitempty"` + + Month int32 `json:"Month,omitempty"` + + DayOfWeek int32 `json:"DayOfWeek,omitempty"` + + Day int32 `json:"Day,omitempty"` + + Hour int32 `json:"Hour,omitempty"` + + Minute int32 `json:"Minute,omitempty"` + + Second int32 `json:"Second,omitempty"` + + Milliseconds int32 `json:"Milliseconds,omitempty"` +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go new file mode 100644 index 000000000..529743d75 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go @@ -0,0 +1,26 @@ +/* + * 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 TimeZoneInformation struct { + Bias int32 `json:"Bias,omitempty"` + + StandardName string `json:"StandardName,omitempty"` + + StandardDate *SystemTime `json:"StandardDate,omitempty"` + + StandardBias int32 `json:"StandardBias,omitempty"` + + DaylightName string `json:"DaylightName,omitempty"` + + DaylightDate *SystemTime `json:"DaylightDate,omitempty"` + + DaylightBias int32 `json:"DaylightBias,omitempty"` +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go index 0e48ece50..9228923fe 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go @@ -12,6 +12,8 @@ package hcsschema type Uefi struct { EnableDebugger bool `json:"EnableDebugger,omitempty"` + ApplySecureBootTemplate string `json:"ApplySecureBootTemplate,omitempty"` + SecureBootTemplateId string `json:"SecureBootTemplateId,omitempty"` BootThis *UefiBootEntry `json:"BootThis,omitempty"` diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go index 2d22b1bcb..1e0fab289 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go @@ -29,4 +29,8 @@ type VirtualMachine struct { StorageQoS *StorageQoS `json:"StorageQoS,omitempty"` GuestConnection *GuestConnection `json:"GuestConnection,omitempty"` + + SecuritySettings *SecuritySettings `json:"SecuritySettings,omitempty"` + + DebugOptions *DebugOptions `json:"DebugOptions,omitempty"` } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go index a634dfc15..a46b0051d 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go index 1d45a703b..cf20adefc 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( @@ -37,6 +39,9 @@ type System struct { startTime time.Time } +var _ cow.Container = &System{} +var _ cow.ProcessHost = &System{} + func newSystem(id string) *System { return &System{ id: id, @@ -55,7 +60,7 @@ func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface in // hcsCreateComputeSystemContext is an async operation. Start the outer span // here to measure the full create time. - ctx, span := trace.StartSpan(ctx, operation) + ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", id)) @@ -89,7 +94,8 @@ func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface in } } - events, err := processAsyncHcsResult(ctx, createError, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.SystemCreate) + 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 @@ -190,7 +196,7 @@ func (computeSystem *System) Start(ctx context.Context) (err error) { // hcsStartComputeSystemContext is an async operation. Start the outer span // here to measure the full start time. - ctx, span := trace.StartSpan(ctx, operation) + ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -198,12 +204,15 @@ func (computeSystem *System) Start(ctx context.Context) (err error) { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() + // prevent starting an exited system because waitblock we do not recreate waitBlock + // or rerun waitBackground, so we have no way to be notified of it closing again 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) + events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, + hcsNotificationSystemStartCompleted, &timeout.SystemStart) if err != nil { return makeSystemError(computeSystem, operation, err, events) } @@ -223,7 +232,7 @@ func (computeSystem *System) Shutdown(ctx context.Context) error { operation := "hcs::System::Shutdown" - if computeSystem.handle == 0 { + if computeSystem.handle == 0 || computeSystem.stopped() { return nil } @@ -244,7 +253,7 @@ func (computeSystem *System) Terminate(ctx context.Context) error { operation := "hcs::System::Terminate" - if computeSystem.handle == 0 { + if computeSystem.handle == 0 || computeSystem.stopped() { return nil } @@ -265,7 +274,7 @@ func (computeSystem *System) Terminate(ctx context.Context) error { // safe to call multiple times. func (computeSystem *System) waitBackground() { operation := "hcs::System::waitBackground" - ctx, span := trace.StartSpan(context.Background(), operation) + ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -287,24 +296,40 @@ func (computeSystem *System) waitBackground() { 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.waitBlock - return computeSystem.waitError + <-computeSystem.WaitChannel() + return computeSystem.WaitError() } -// ExitError returns an error describing the reason the compute system terminated. -func (computeSystem *System) ExitError() error { +// stopped returns true if the compute system stopped. +func (computeSystem *System) stopped() bool { select { case <-computeSystem.waitBlock: - if computeSystem.waitError != nil { - return computeSystem.waitError - } - return computeSystem.exitError + return true default: + } + return false +} + +// ExitError returns an error describing the reason the compute system terminated. +func (computeSystem *System) ExitError() error { + if !computeSystem.stopped() { return errors.New("container not exited") } + if computeSystem.waitError != nil { + return computeSystem.waitError + } + return computeSystem.exitError } // Properties returns the requested container properties targeting a V1 schema container. @@ -314,6 +339,10 @@ func (computeSystem *System) Properties(ctx context.Context, types ...schema1.Pr operation := "hcs::System::Properties" + if computeSystem.handle == 0 { + return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) + } + queryBytes, err := json.Marshal(schema1.PropertyQuery{PropertyTypes: types}) if err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) @@ -341,7 +370,11 @@ func (computeSystem *System) Properties(ctx context.Context, types ...schema1.Pr // 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) { +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. @@ -407,7 +440,7 @@ func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcssch // 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 + // working set ourselves and ask for everything else separately. 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: // @@ -447,6 +480,10 @@ func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcssch func (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) { operation := "hcs::System::PropertiesV2" + if computeSystem.handle == 0 { + return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) + } + queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types}) if err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) @@ -495,7 +532,7 @@ func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschem 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)) + logEntry = logEntry.WithError(fmt.Errorf("failed to query compute system properties in-proc: %w", err)) fallbackTypes = types } @@ -527,9 +564,9 @@ func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschem func (computeSystem *System) Pause(ctx context.Context) (err error) { operation := "hcs::System::Pause" - // hcsPauseComputeSystemContext is an async peration. Start the outer span + // hcsPauseComputeSystemContext is an async operation. Start the outer span // here to measure the full pause time. - ctx, span := trace.StartSpan(ctx, operation) + ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -542,7 +579,8 @@ func (computeSystem *System) Pause(ctx context.Context) (err error) { } resultJSON, err := vmcompute.HcsPauseComputeSystem(ctx, computeSystem.handle, "") - events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemPauseCompleted, &timeout.SystemPause) + events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, + hcsNotificationSystemPauseCompleted, &timeout.SystemPause) if err != nil { return makeSystemError(computeSystem, operation, err, events) } @@ -556,7 +594,7 @@ func (computeSystem *System) Resume(ctx context.Context) (err error) { // hcsResumeComputeSystemContext is an async operation. Start the outer span // here to measure the full restore time. - ctx, span := trace.StartSpan(ctx, operation) + ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -569,7 +607,8 @@ func (computeSystem *System) Resume(ctx context.Context) (err error) { } resultJSON, err := vmcompute.HcsResumeComputeSystem(ctx, computeSystem.handle, "") - events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemResumeCompleted, &timeout.SystemResume) + events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, + hcsNotificationSystemResumeCompleted, &timeout.SystemResume) if err != nil { return makeSystemError(computeSystem, operation, err, events) } @@ -581,9 +620,9 @@ func (computeSystem *System) Resume(ctx context.Context) (err error) { func (computeSystem *System) Save(ctx context.Context, options interface{}) (err error) { operation := "hcs::System::Save" - // hcsSaveComputeSystemContext is an async peration. Start the outer span + // hcsSaveComputeSystemContext is an async operation. Start the outer span // here to measure the full save time. - ctx, span := trace.StartSpan(ctx, operation) + ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -601,7 +640,8 @@ func (computeSystem *System) Save(ctx context.Context, options interface{}) (err } result, err := vmcompute.HcsSaveComputeSystem(ctx, computeSystem.handle, string(saveOptions)) - events, err := processAsyncHcsResult(ctx, err, result, computeSystem.callbackNumber, hcsNotificationSystemSaveCompleted, &timeout.SystemSave) + events, err := processAsyncHcsResult(ctx, err, result, computeSystem.callbackNumber, + hcsNotificationSystemSaveCompleted, &timeout.SystemSave) if err != nil { return makeSystemError(computeSystem, operation, err, events) } @@ -626,6 +666,11 @@ func (computeSystem *System) createProcess(ctx context.Context, operation string processInfo, processHandle, resultJSON, err := vmcompute.HcsCreateProcess(ctx, computeSystem.handle, configuration) events := processHcsResult(ctx, resultJSON) if err != nil { + if v2, ok := c.(*hcsschema.ProcessParameters); ok { + operation += ": " + v2.CommandLine + } else if v1, ok := c.(*schema1.ProcessConfig); ok { + operation += ": " + v1.CommandLine + } return nil, nil, makeSystemError(computeSystem, operation, err, events) } @@ -692,7 +737,7 @@ func (computeSystem *System) OpenProcess(ctx context.Context, pid int) (*Process // 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) + ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) @@ -735,7 +780,8 @@ func (computeSystem *System) registerCallback(ctx context.Context) error { callbackMap[callbackNumber] = callbackContext callbackMapLock.Unlock() - callbackHandle, err := vmcompute.HcsRegisterComputeSystemCallback(ctx, computeSystem.handle, notificationWatcherCallback, callbackNumber) + callbackHandle, err := vmcompute.HcsRegisterComputeSystemCallback(ctx, computeSystem.handle, + notificationWatcherCallback, callbackNumber) if err != nil { return err } @@ -762,7 +808,7 @@ func (computeSystem *System) unregisterCallback(ctx context.Context) error { return nil } - // hcsUnregisterComputeSystemCallback has its own syncronization + // hcsUnregisterComputeSystemCallback has its own synchronization // to wait for all callbacks to complete. We must NOT hold the callbackMapLock. err := vmcompute.HcsUnregisterComputeSystemCallback(ctx, handle) if err != nil { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go index 3342e5bb9..5dcb97eb3 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go index db4e14fdf..3a51ed195 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go @@ -1,3 +1,5 @@ +//go:build windows + package hcs import ( @@ -7,7 +9,14 @@ import ( "github.com/Microsoft/hcsshim/internal/log" ) -func processAsyncHcsResult(ctx context.Context, err error, resultJSON string, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration) ([]ErrorEvent, error) { +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) @@ -16,7 +25,12 @@ func processAsyncHcsResult(ctx context.Context, err error, resultJSON string, ca return events, err } -func waitForNotification(ctx context.Context, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration) error { +func waitForNotification( + ctx context.Context, + callbackNumber uintptr, + expectedNotification hcsNotification, + timeout *time.Duration, +) error { callbackMapLock.RLock() if _, ok := callbackMap[callbackNumber]; !ok { callbackMapLock.RUnlock() diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go new file mode 100644 index 000000000..ce7067678 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go @@ -0,0 +1 @@ +package hcserror diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go index 921c2c855..a70d80da0 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go @@ -1,11 +1,13 @@ +//go:build windows + package hcserror import ( + "errors" "fmt" - "syscall" -) -const ERROR_GEN_FAILURE = syscall.Errno(31) + "golang.org/x/sys/windows" +) type HcsError struct { title string @@ -30,18 +32,21 @@ func (e *HcsError) Error() string { 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 { + var e *windows.DLLError + if errors.As(err, &e) { return err } return &HcsError{title, rest, err} } func Win32FromError(err error) uint32 { - if herr, ok := err.(*HcsError); ok { + var herr *HcsError + if errors.As(err, &herr) { return Win32FromError(herr.Err) } - if code, ok := err.(syscall.Errno); ok { + var code windows.Errno + if errors.As(err, &code) { return uint32(code) } - return uint32(ERROR_GEN_FAILURE) + return uint32(windows.ERROR_GEN_FAILURE) } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go new file mode 100644 index 000000000..f6d35df0e --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go @@ -0,0 +1 @@ +package hns diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go index b2e475f53..ec4c907d1 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go @@ -2,7 +2,7 @@ package hns import "fmt" -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go hns.go +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hns.go //sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall? diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go index 7cf954c7b..593664419 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go @@ -1,3 +1,5 @@ +//go:build windows + package hns import ( @@ -34,7 +36,7 @@ type HNSEndpoint struct { SharedContainers []string `json:",omitempty"` } -//SystemType represents the type of the system on which actions are done +// SystemType represents the type of the system on which actions are done type SystemType string // SystemType const @@ -146,7 +148,6 @@ func (endpoint *HNSEndpoint) IsAttached(vID string) (bool, error) { } return false, nil - } // Create Endpoint by sending EndpointRequest to HNS. TODO: Create a separate HNS interface to place all these methods @@ -281,7 +282,6 @@ func (endpoint *HNSEndpoint) HostAttach(compartmentID uint16) error { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) - } // HostDetach detaches a nic on the host diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go index 2df4a57f5..0a8f36d83 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go @@ -1,3 +1,5 @@ +//go:build windows + package hns import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go index a8d8cc56a..464bb8954 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go @@ -1,3 +1,5 @@ +//go:build windows + package hns type HNSGlobals struct { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go index f12d3ab04..8861faee7 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go @@ -1,13 +1,16 @@ +//go:build windows + package hns import ( "encoding/json" "errors" - "github.com/sirupsen/logrus" "net" + + "github.com/sirupsen/logrus" ) -// Subnet is assoicated with a network and represents a list +// Subnet is associated with a network and represents a list // of subnets available to the network type Subnet struct { AddressPrefix string `json:",omitempty"` @@ -15,7 +18,7 @@ type Subnet struct { Policies []json.RawMessage `json:",omitempty"` } -// MacPool is assoicated with a network and represents a list +// MacPool is associated with a network and represents a list // of macaddresses available to the network type MacPool struct { StartMacAddress string `json:",omitempty"` diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go index 84b368218..082c018a4 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go @@ -94,15 +94,15 @@ type ACLPolicy struct { 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"` + 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 { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go index 31322a681..b98db40e8 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go @@ -1,3 +1,5 @@ +//go:build windows + package hns import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go index d5efba7f2..b9c30b901 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go @@ -1,3 +1,5 @@ +//go:build windows + package hns import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go index d3b04eefe..749588ad3 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go @@ -1,3 +1,5 @@ +//go:build windows + package hns import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go index 204633a48..a35ee945d 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package hns @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } @@ -62,7 +65,8 @@ func _hnsCall(method string, path string, object string, response **uint16) (hr } func __hnsCall(method *uint16, path *uint16, object *uint16, response **uint16) (hr error) { - if hr = procHNSCall.Find(); hr != nil { + hr = procHNSCall.Find() + if 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) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go new file mode 100644 index 000000000..cb554867f --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go @@ -0,0 +1 @@ +package interop diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go index 922f7c679..a56469656 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go @@ -1,3 +1,5 @@ +//go:build windows + package interop import ( @@ -5,7 +7,7 @@ import ( "unsafe" ) -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go interop.go +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go interop.go //sys coTaskMemFree(buffer unsafe.Pointer) = api_ms_win_core_com_l1_1_0.CoTaskMemFree diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go index 12b0c71c5..a17a11250 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package interop @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go new file mode 100644 index 000000000..34b53d6e4 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go @@ -0,0 +1,8 @@ +// This package 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 +package jobobject diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go index 5d6acd69e..bcca84b0d 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go @@ -1,3 +1,5 @@ +//go:build windows + package jobobject import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go index c9fdd921a..64afd35dc 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go @@ -1,10 +1,15 @@ +//go:build windows + package jobobject import ( "context" "errors" "fmt" + "os" + "path/filepath" "sync" + "sync/atomic" "unsafe" "github.com/Microsoft/hcsshim/internal/queue" @@ -12,19 +17,14 @@ import ( "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 + handle windows.Handle + // All accesses to this MUST be done atomically except in `Open` as the object + // is being created in the function. 1 signifies that this job is currently a silo. + silo uint32 mq *queue.MessageQueue handleLock sync.RWMutex } @@ -56,6 +56,7 @@ const ( var ( ErrAlreadyClosed = errors.New("the handle has already been closed") ErrNotRegistered = errors.New("job is not registered to receive notifications") + ErrNotSilo = errors.New("job is not a silo") ) // Options represents the set of configurable options when making or opening a job object. @@ -68,6 +69,9 @@ type Options struct { // `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject. // Defaults to false. UseNTVariant bool + // `Silo` specifies to promote the job to a silo. This additionally sets the flag + // JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE as it is required for the upgrade to complete. + Silo bool // `IOTracking` enables tracking I/O statistics on the job object. More specifically this // calls SetInformationJobObject with the JobObjectIoAttribution class. EnableIOTracking bool @@ -143,6 +147,16 @@ func Create(ctx context.Context, options *Options) (_ *JobObject, err error) { } } + if options.Silo { + // This is a required setting for upgrading to a silo. + if err := job.SetTerminateOnLastHandleClose(); err != nil { + return nil, err + } + if err := job.PromoteToSilo(); err != nil { + return nil, err + } + } + return job, nil } @@ -163,7 +177,7 @@ func Open(ctx context.Context, options *Options) (_ *JobObject, err error) { } var jobHandle windows.Handle - if options != nil && options.UseNTVariant { + if options.UseNTVariant { oa := winapi.ObjectAttributes{ Length: unsafe.Sizeof(winapi.ObjectAttributes{}), ObjectName: unicodeJobName, @@ -174,7 +188,7 @@ func Open(ctx context.Context, options *Options) (_ *JobObject, err error) { return nil, winapi.RtlNtStatusToDosError(status) } } else { - jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer) + jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, 0, unicodeJobName.Buffer) if err != nil { return nil, err } @@ -190,9 +204,13 @@ func Open(ctx context.Context, options *Options) (_ *JobObject, err error) { handle: jobHandle, } + if isJobSilo(jobHandle) { + job.silo = 1 + } + // 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 { + if options.Notifications { mq, err := setupNotifications(ctx, job) if err != nil { return nil, err @@ -450,6 +468,119 @@ func (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFO return &info, nil } +// ApplyFileBinding makes a file binding using the Bind Filter from target to root. If the job has +// not been upgraded to a silo this call will fail. The binding is only applied and visible for processes +// running in the job, any processes on the host or in another job will not be able to see the binding. +func (job *JobObject) ApplyFileBinding(root, target string, readOnly bool) error { + job.handleLock.RLock() + defer job.handleLock.RUnlock() + + if job.handle == 0 { + return ErrAlreadyClosed + } + + if !job.isSilo() { + return ErrNotSilo + } + + // The parent directory needs to exist for the bind to work. MkdirAll stats and + // returns nil if the directory exists internally so we should be fine to mkdirall + // every time. + if err := os.MkdirAll(filepath.Dir(root), 0); err != nil { + return err + } + + rootPtr, err := windows.UTF16PtrFromString(root) + if err != nil { + return err + } + + targetPtr, err := windows.UTF16PtrFromString(target) + if err != nil { + return err + } + + flags := winapi.BINDFLT_FLAG_USE_CURRENT_SILO_MAPPING + if readOnly { + flags |= winapi.BINDFLT_FLAG_READ_ONLY_MAPPING + } + + if err := winapi.BfSetupFilter( + job.handle, + flags, + rootPtr, + targetPtr, + nil, + 0, + ); err != nil { + return fmt.Errorf("failed to bind target %q to root %q for job object: %w", target, root, err) + } + return nil +} + +// isJobSilo is a helper to determine if a job object that was opened is a silo. This should ONLY be called +// from `Open` and any callers in this package afterwards should use `job.isSilo()` +func isJobSilo(h windows.Handle) bool { + // None of the information from the structure that this info class expects will be used, this is just used as + // the call will fail if the job hasn't been upgraded to a silo so we can use this to tell when we open a job + // if it's a silo or not. Because none of the info matters simply define a dummy struct with the size that the call + // expects which is 16 bytes. + type isSiloObj struct { + _ [16]byte + } + var siloInfo isSiloObj + err := winapi.QueryInformationJobObject( + h, + winapi.JobObjectSiloBasicInformation, + unsafe.Pointer(&siloInfo), + uint32(unsafe.Sizeof(siloInfo)), + nil, + ) + return err == nil +} + +// PromoteToSilo promotes a job object to a silo. There must be no running processess +// in the job for this to succeed. If the job is already a silo this is a no-op. +func (job *JobObject) PromoteToSilo() error { + job.handleLock.RLock() + defer job.handleLock.RUnlock() + + if job.handle == 0 { + return ErrAlreadyClosed + } + + if job.isSilo() { + return nil + } + + pids, err := job.Pids() + if err != nil { + return err + } + + if len(pids) != 0 { + return fmt.Errorf("job cannot have running processes to be promoted to a silo, found %d running processes", len(pids)) + } + + _, err = windows.SetInformationJobObject( + job.handle, + winapi.JobObjectCreateSilo, + 0, + 0, + ) + if err != nil { + return fmt.Errorf("failed to promote job to silo: %w", err) + } + + atomic.StoreUint32(&job.silo, 1) + return nil +} + +// isSilo returns if the job object is a silo. +func (job *JobObject) isSilo() bool { + return atomic.LoadUint32(&job.silo) == 1 +} + // 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) { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go index 4efde292c..03f71d9a4 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go @@ -1,3 +1,5 @@ +//go:build windows + package jobobject import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/log/context.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/context.go new file mode 100644 index 000000000..d17d909d9 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/context.go @@ -0,0 +1,118 @@ +package log + +import ( + "context" + + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" +) + +type entryContextKeyType int + +const _entryContextKey entryContextKeyType = iota + +var ( + // L is the default, blank logging entry. WithField and co. all return a copy + // of the original entry, so this will not leak fields between calls. + // + // Do NOT modify fields directly, as that will corrupt state for all users and + // is not thread safe. + // Instead, use `L.With*` or `L.Dup()`. Or `G(context.Background())`. + L = logrus.NewEntry(logrus.StandardLogger()) + + // G is an alias for GetEntry + G = GetEntry + + // S is an alias for SetEntry + S = SetEntry + + // U is an alias for UpdateContext + U = UpdateContext +) + +// GetEntry returns a `logrus.Entry` stored in the context, if one exists. +// Otherwise, it returns a default entry that points to the current context. +// +// Note: if the a new entry is returned, it will reference the passed in context. +// However, existing contexts may be stored in parent contexts and additionally reference +// earlier contexts. +// Use `UpdateContext` to update the entry and context. +func GetEntry(ctx context.Context) *logrus.Entry { + entry := fromContext(ctx) + + if entry == nil { + entry = L.WithContext(ctx) + } + + return entry +} + +// SetEntry updates the log entry in the context with the provided fields, and +// returns both. It is equivalent to: +// +// entry := GetEntry(ctx).WithFields(fields) +// ctx = WithContext(ctx, entry) +// +// See WithContext for more information. +func SetEntry(ctx context.Context, fields logrus.Fields) (context.Context, *logrus.Entry) { + e := GetEntry(ctx) + if len(fields) > 0 { + e = e.WithFields(fields) + } + return WithContext(ctx, e) +} + +// UpdateContext extracts the log entry from the context, and, if the entry's +// context points to a parent's of the current context, ands the entry +// to the most recent context. It is equivalent to: +// +// entry := GetEntry(ctx) +// ctx = WithContext(ctx, entry) +// +// This allows the entry to reference the most recent context and any new +// values (such as span contexts) added to it. +// +// See WithContext for more information. +func UpdateContext(ctx context.Context) context.Context { + // there is no way to check its ctx (and not one of its parents) that contains `e` + // so, at a slight cost, force add `e` to the context + ctx, _ = WithContext(ctx, GetEntry(ctx)) + return ctx +} + +// WithContext returns a context that contains the provided log entry. +// The entry can be extracted with `GetEntry` (`G`) +// +// The entry in the context is a copy of `entry` (generated by `entry.WithContext`) +func WithContext(ctx context.Context, entry *logrus.Entry) (context.Context, *logrus.Entry) { + // regardless of the order, entry.Context != GetEntry(ctx) + // here, the returned entry will reference the supplied context + entry = entry.WithContext(ctx) + ctx = context.WithValue(ctx, _entryContextKey, entry) + + return ctx, entry +} + +// Copy extracts the tracing Span and logging entry from the src Context, if they +// exist, and adds them to the dst Context. +// +// This is useful to share tracing and logging between contexts, but not the +// cancellation. For example, if the src Context has been cancelled but cleanup +// operations triggered by the cancellation require a non-cancelled context to +// execute. +func Copy(dst context.Context, src context.Context) context.Context { + if s := trace.FromContext(src); s != nil { + dst = trace.NewContext(dst, s) + } + + if e := fromContext(src); e != nil { + dst, _ = WithContext(dst, e) + } + + return dst +} + +func fromContext(ctx context.Context) *logrus.Entry { + e, _ := ctx.Value(_entryContextKey).(*logrus.Entry) + return e +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/log/g.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/g.go deleted file mode 100644 index ba6b1a4a5..000000000 --- a/tools/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/tools/vendor/github.com/Microsoft/hcsshim/internal/log/hook.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/hook.go new file mode 100644 index 000000000..8f8940592 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/hook.go @@ -0,0 +1,45 @@ +package log + +import ( + "github.com/Microsoft/hcsshim/internal/logfields" + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" +) + +// Hook serves to intercept and format `logrus.Entry`s before they are passed +// to the ETW hook. +// +// The containerd shim discards the (formatted) logrus output, and outputs only via ETW. +// The Linux GCS outputs logrus entries over stdout, which is consumed by the shim and +// then re-output via the ETW hook. +type Hook struct{} + +var _ logrus.Hook = &Hook{} + +func NewHook() *Hook { + return &Hook{} +} + +func (h *Hook) Levels() []logrus.Level { + return logrus.AllLevels +} + +func (h *Hook) Fire(e *logrus.Entry) (err error) { + h.addSpanContext(e) + + return nil +} + +func (h *Hook) addSpanContext(e *logrus.Entry) { + ctx := e.Context + if ctx == nil { + return + } + span := trace.FromContext(ctx) + if span == nil { + return + } + sctx := span.SpanContext() + e.Data[logfields.TraceID] = sctx.TraceID.String() + e.Data[logfields.SpanID] = sctx.SpanID.String() +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go new file mode 100644 index 000000000..d51e0fd89 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go @@ -0,0 +1,194 @@ +package log + +import ( + "bytes" + "encoding/json" + "errors" + "strings" + "sync/atomic" + + hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" +) + +// This package scrubs objects of potentially sensitive information to pass to logging + +type genMap = map[string]interface{} +type scrubberFunc func(genMap) error + +const _scrubbedReplacement = "" + +var ( + ErrUnknownType = errors.New("encoded object is of unknown type") + + // case sensitive keywords, so "env" is not a substring on "Environment" + _scrubKeywords = [][]byte{[]byte("env"), []byte("Environment")} + + _scrub int32 +) + +// SetScrubbing enables scrubbing +func SetScrubbing(enable bool) { + v := int32(0) // cant convert from bool to int32 directly + if enable { + v = 1 + } + atomic.StoreInt32(&_scrub, v) +} + +// IsScrubbingEnabled checks if scrubbing is enabled +func IsScrubbingEnabled() bool { + v := atomic.LoadInt32(&_scrub) + return v != 0 +} + +// ScrubProcessParameters scrubs HCS Create Process requests with config parameters of +// type internal/hcs/schema2.ScrubProcessParameters (aka hcsshema.ScrubProcessParameters) +func ScrubProcessParameters(s string) (string, error) { + // todo: deal with v1 ProcessConfig + b := []byte(s) + if !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) { + return s, nil + } + + pp := hcsschema.ProcessParameters{} + if err := json.Unmarshal(b, &pp); err != nil { + return "", err + } + pp.Environment = map[string]string{_scrubbedReplacement: _scrubbedReplacement} + + buf := bytes.NewBuffer(b[:0]) + if err := encode(buf, pp); err != nil { + return "", err + } + return strings.TrimSpace(buf.String()), nil +} + +// ScrubBridgeCreate scrubs requests sent over the bridge of type +// internal/gcs/protocol.containerCreate wrapping an internal/hcsoci.linuxHostedSystem +func ScrubBridgeCreate(b []byte) ([]byte, error) { + return scrubBytes(b, scrubBridgeCreate) +} + +func scrubBridgeCreate(m genMap) error { + if !isRequestBase(m) { + return ErrUnknownType + } + if ss, ok := m["ContainerConfig"]; ok { + // ContainerConfig is a json encoded struct passed as a regular string field + s, ok := ss.(string) + if !ok { + return ErrUnknownType + } + b, err := scrubBytes([]byte(s), scrubLinuxHostedSystem) + if err != nil { + return err + } + m["ContainerConfig"] = string(b) + return nil + } + return ErrUnknownType +} + +func scrubLinuxHostedSystem(m genMap) error { + if m, ok := index(m, "OciSpecification"); ok { + if _, ok := m["annotations"]; ok { + m["annotations"] = map[string]string{_scrubbedReplacement: _scrubbedReplacement} + } + if m, ok := index(m, "process"); ok { + if _, ok := m["env"]; ok { + m["env"] = []string{_scrubbedReplacement} + return nil + } + } + } + return ErrUnknownType +} + +// ScrubBridgeExecProcess scrubs requests sent over the bridge of type +// internal/gcs/protocol.containerExecuteProcess +func ScrubBridgeExecProcess(b []byte) ([]byte, error) { + return scrubBytes(b, scrubExecuteProcess) +} + +func scrubExecuteProcess(m genMap) error { + if !isRequestBase(m) { + return ErrUnknownType + } + if m, ok := index(m, "Settings"); ok { + if ss, ok := m["ProcessParameters"]; ok { + // ProcessParameters is a json encoded struct passed as a regular sting field + s, ok := ss.(string) + if !ok { + return ErrUnknownType + } + + s, err := ScrubProcessParameters(s) + if err != nil { + return err + } + + m["ProcessParameters"] = s + return nil + } + } + return ErrUnknownType +} + +func scrubBytes(b []byte, scrub scrubberFunc) ([]byte, error) { + if !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) { + return b, nil + } + + m := make(genMap) + if err := json.Unmarshal(b, &m); err != nil { + return nil, err + } + + // could use regexp, but if the env strings contain braces, the regexp fails + // parsing into individual structs would require access to private structs + if err := scrub(m); err != nil { + return nil, err + } + + buf := &bytes.Buffer{} + if err := encode(buf, m); err != nil { + return nil, err + } + + return bytes.TrimSpace(buf.Bytes()), nil +} + +func encode(buf *bytes.Buffer, v interface{}) error { + enc := json.NewEncoder(buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(v); err != nil { + return err + } + return nil +} + +func isRequestBase(m genMap) bool { + // neither of these are (currently) `omitempty` + _, a := m["ActivityId"] + _, c := m["ContainerId"] + return a && c +} + +// combination `m, ok := m[s]` and `m, ok := m.(genMap)` +func index(m genMap, s string) (genMap, bool) { + if m, ok := m[s]; ok { + mm, ok := m.(genMap) + return mm, ok + } + + return m, false +} + +func hasKeywords(b []byte) bool { + for _, bb := range _scrubKeywords { + if bytes.Contains(b, bb) { + return true + } + } + return false +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go index cf2c166d9..3e175e522 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go @@ -3,21 +3,44 @@ package logfields const ( // Identifiers + Name = "name" + Namespace = "namespace" + Operation = "operation" + + ID = "id" + SandboxID = "sid" ContainerID = "cid" - UVMID = "uvm-id" + ExecID = "eid" ProcessID = "pid" + TaskID = "tid" + UVMID = "uvm-id" + + // networking and IO + + File = "file" + Path = "path" + Bytes = "bytes" + Pipe = "pipe" // Common Misc - // Timeout represents an operation timeout. - Timeout = "timeout" + Attempt = "attemptNo" JSON = "json" + // Time + + StartTime = "startTime" + EndTime = "endTime" + Duration = "duration" + Timeout = "timeout" + // Keys/values Field = "field" + Key = "key" OCIAnnotation = "oci-annotation" Value = "value" + Options = "options" // Golang type's @@ -29,4 +52,10 @@ const ( // runhcs VMShimOperation = "vmshim-op" + + // logging and tracing + + TraceID = "traceID" + SpanID = "spanID" + ParentSpanID = "parentSpanID" ) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go new file mode 100644 index 000000000..1ef5814d7 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go @@ -0,0 +1,316 @@ +package memory + +import ( + "github.com/pkg/errors" +) + +const ( + minimumClassSize = MiB + maximumClassSize = 4 * GiB + memoryClassNumber = 7 +) + +var ( + ErrInvalidMemoryClass = errors.New("invalid memory class") + ErrEarlyMerge = errors.New("not all children have been freed") + ErrEmptyPoolOperation = errors.New("operation on empty pool") +) + +// GetMemoryClassType returns the minimum memory class type that can hold a device of +// a given size. The smallest class is 1MB and the largest one is 4GB with 2 bit offset +// intervals in between, for a total of 7 different classes. This function does not +// do a validity check +func GetMemoryClassType(s uint64) classType { + s = (s - 1) >> 20 + memCls := uint32(0) + for s > 0 { + s = s >> 2 + memCls++ + } + return classType(memCls) +} + +// GetMemoryClassSize returns size in bytes for a given memory class +func GetMemoryClassSize(memCls classType) (uint64, error) { + if memCls >= memoryClassNumber { + return 0, ErrInvalidMemoryClass + } + return minimumClassSize << (2 * memCls), nil +} + +// region represents a contiguous memory block +type region struct { + // parent region that has been split into 4 + parent *region + class classType + // offset represents offset in bytes + offset uint64 +} + +// memoryPool tracks free and busy (used) memory regions +type memoryPool struct { + free map[uint64]*region + busy map[uint64]*region +} + +// PoolAllocator implements a memory allocation strategy similar to buddy-malloc https://github.com/evanw/buddy-malloc/blob/master/buddy-malloc.c +// We borrow the idea of spanning a tree of fixed size regions on top of a contiguous memory +// space. +// +// There are a total of 7 different region sizes that can be allocated, with the smallest +// being 1MB and the largest 4GB (the default maximum size of a Virtual PMem device). +// +// For efficiency and to reduce fragmentation an entire region is allocated when requested. +// When there's no available region of requested size, we try to allocate more memory for +// this particular size by splitting the next available larger region into smaller ones, e.g. +// if there's no region available for size class 0, we try splitting a region from class 1, +// then class 2 etc, until we are able to do so or hit the upper limit. +type PoolAllocator struct { + pools [memoryClassNumber]*memoryPool +} + +var _ MappedRegion = ®ion{} +var _ Allocator = &PoolAllocator{} + +func (r *region) Offset() uint64 { + return r.offset +} + +func (r *region) Size() uint64 { + sz, err := GetMemoryClassSize(r.class) + if err != nil { + panic(err) + } + return sz +} + +func (r *region) Type() classType { + return r.class +} + +func newEmptyMemoryPool() *memoryPool { + return &memoryPool{ + free: make(map[uint64]*region), + busy: make(map[uint64]*region), + } +} + +func NewPoolMemoryAllocator() PoolAllocator { + pa := PoolAllocator{} + p := newEmptyMemoryPool() + // by default we allocate a single region with maximum possible size (class type) + p.free[0] = ®ion{ + class: memoryClassNumber - 1, + offset: 0, + } + pa.pools[memoryClassNumber-1] = p + return pa +} + +// Allocate checks memory region pool for the given `size` and returns a free region with +// minimal offset, if none available tries expanding matched memory pool. +// +// Internally it's done via moving a region from free pool into a busy pool +func (pa *PoolAllocator) Allocate(size uint64) (MappedRegion, error) { + memCls := GetMemoryClassType(size) + if memCls >= memoryClassNumber { + return nil, ErrInvalidMemoryClass + } + + // find region with the smallest offset + nextCls, nextOffset, err := pa.findNextOffset(memCls) + if err != nil { + return nil, err + } + + // this means that there are no more regions for the current class, try expanding + if nextCls != memCls { + if err := pa.split(memCls); err != nil { + if err == ErrInvalidMemoryClass { + return nil, ErrNotEnoughSpace + } + return nil, err + } + } + + if err := pa.markBusy(memCls, nextOffset); err != nil { + return nil, err + } + + // by this point memory pool for memCls should have been created, + // either prior or during split call + if r := pa.pools[memCls].busy[nextOffset]; r != nil { + return r, nil + } + + return nil, ErrNotEnoughSpace +} + +// Release marks a memory region of class `memCls` and offset `offset` as free and tries to merge smaller regions into +// a bigger one +func (pa *PoolAllocator) Release(reg MappedRegion) error { + mp := pa.pools[reg.Type()] + if mp == nil { + return ErrEmptyPoolOperation + } + + err := pa.markFree(reg.Type(), reg.Offset()) + if err != nil { + return err + } + + n := mp.free[reg.Offset()] + if n == nil { + return ErrNotAllocated + } + if err := pa.merge(n.parent); err != nil { + if err != ErrEarlyMerge { + return err + } + } + return nil +} + +// findNextOffset finds next region location for a given memCls +func (pa *PoolAllocator) findNextOffset(memCls classType) (classType, uint64, error) { + for mc := memCls; mc < memoryClassNumber; mc++ { + pi := pa.pools[mc] + if pi == nil || len(pi.free) == 0 { + continue + } + + target := uint64(maximumClassSize) + for offset := range pi.free { + if offset < target { + target = offset + } + } + return mc, target, nil + } + return 0, 0, ErrNotEnoughSpace +} + +// split tries to recursively split a bigger memory region into smaller ones until it succeeds or hits the upper limit +func (pa *PoolAllocator) split(clsType classType) error { + nextClsType := clsType + 1 + if nextClsType >= memoryClassNumber { + return ErrInvalidMemoryClass + } + + nextPool := pa.pools[nextClsType] + if nextPool == nil { + nextPool = newEmptyMemoryPool() + pa.pools[nextClsType] = nextPool + } + + cls, offset, err := pa.findNextOffset(nextClsType) + if err != nil { + return err + } + // not enough memory in the next class, try to recursively expand + if cls != nextClsType { + if err := pa.split(nextClsType); err != nil { + return err + } + } + + if err := pa.markBusy(nextClsType, offset); err != nil { + return err + } + + // memCls validity has been checked already, we can ignore the error + clsSize, _ := GetMemoryClassSize(clsType) + + nextReg := nextPool.busy[offset] + if nextReg == nil { + return ErrNotAllocated + } + + // expand memCls + cp := pa.pools[clsType] + if cp == nil { + cp = newEmptyMemoryPool() + pa.pools[clsType] = cp + } + // create 4 smaller regions + for i := uint64(0); i < 4; i++ { + offset := nextReg.offset + i*clsSize + reg := ®ion{ + parent: nextReg, + class: clsType, + offset: offset, + } + cp.free[offset] = reg + } + return nil +} + +func (pa *PoolAllocator) merge(parent *region) error { + // nothing to merge + if parent == nil { + return nil + } + + childCls := parent.class - 1 + childPool := pa.pools[childCls] + // no child nodes to merge, try to merge parent + if childPool == nil { + return pa.merge(parent.parent) + } + + childSize, err := GetMemoryClassSize(childCls) + if err != nil { + return err + } + + // check if all the child nodes are free + var children []*region + for i := uint64(0); i < 4; i++ { + child, free := childPool.free[parent.offset+i*childSize] + if !free { + return ErrEarlyMerge + } + children = append(children, child) + } + + // at this point all the child nodes will be free and we can merge + for _, child := range children { + delete(childPool.free, child.offset) + } + + if err := pa.markFree(parent.class, parent.offset); err != nil { + return err + } + + return pa.merge(parent.parent) +} + +// markFree internally moves a region with `offset` from busy to free map +func (pa *PoolAllocator) markFree(memCls classType, offset uint64) error { + clsPool := pa.pools[memCls] + if clsPool == nil { + return ErrEmptyPoolOperation + } + + if reg, exists := clsPool.busy[offset]; exists { + clsPool.free[offset] = reg + delete(clsPool.busy, offset) + return nil + } + return ErrNotAllocated +} + +// markBusy internally moves a region with `offset` from free to busy map +func (pa *PoolAllocator) markBusy(memCls classType, offset uint64) error { + clsPool := pa.pools[memCls] + if clsPool == nil { + return ErrEmptyPoolOperation + } + + if reg, exists := clsPool.free[offset]; exists { + clsPool.busy[offset] = reg + delete(clsPool.free, offset) + return nil + } + return ErrNotAllocated +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/types.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/types.go new file mode 100644 index 000000000..d6cdb8cc4 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/memory/types.go @@ -0,0 +1,28 @@ +package memory + +import "github.com/pkg/errors" + +type classType uint32 + +const ( + MiB = 1024 * 1024 + GiB = 1024 * MiB +) + +var ( + ErrNotEnoughSpace = errors.New("not enough space") + ErrNotAllocated = errors.New("no memory allocated at the given offset") +) + +// MappedRegion represents a memory block with an offset +type MappedRegion interface { + Offset() uint64 + Size() uint64 + Type() classType +} + +// Allocator is an interface for memory allocation +type Allocator interface { + Allocate(uint64) (MappedRegion, error) + Release(MappedRegion) error +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go index fee4765cb..0e2b7e9bf 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/oc/span.go @@ -1,9 +1,14 @@ package oc import ( + "context" + + "github.com/Microsoft/hcsshim/internal/log" "go.opencensus.io/trace" ) +var DefaultSampler = trace.AlwaysSample() + // 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) { @@ -15,3 +20,29 @@ func SetSpanStatus(span *trace.Span, err error) { } span.SetStatus(status) } + +// StartSpan wraps "go.opencensus.io/trace".StartSpan, but, if the span is sampling, +// adds a log entry to the context that points to the newly created span. +func StartSpan(ctx context.Context, name string, o ...trace.StartOption) (context.Context, *trace.Span) { + ctx, s := trace.StartSpan(ctx, name, o...) + return update(ctx, s) +} + +// StartSpanWithRemoteParent wraps "go.opencensus.io/trace".StartSpanWithRemoteParent. +// +// See StartSpan for more information. +func StartSpanWithRemoteParent(ctx context.Context, name string, parent trace.SpanContext, o ...trace.StartOption) (context.Context, *trace.Span) { + ctx, s := trace.StartSpanWithRemoteParent(ctx, name, parent, o...) + return update(ctx, s) +} + +func update(ctx context.Context, s *trace.Span) (context.Context, *trace.Span) { + if s.IsRecordingEvents() { + ctx = log.UpdateContext(ctx) + } + + return ctx, s +} + +var WithServerSpanKind = trace.WithSpanKind(trace.SpanKindServer) +var WithClientSpanKind = trace.WithSpanKind(trace.SpanKindClient) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go new file mode 100644 index 000000000..d8d0c20b1 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go @@ -0,0 +1,56 @@ +package guestrequest + +// These are constants for v2 schema modify requests. + +type RequestType string +type ResourceType string + +// RequestType const +const ( + RequestTypeAdd RequestType = "Add" + RequestTypeRemove RequestType = "Remove" + RequestTypePreAdd RequestType = "PreAdd" // For networking + RequestTypeUpdate RequestType = "Update" +) + +type SignalValueWCOW string + +const ( + SignalValueWCOWCtrlC SignalValueWCOW = "CtrlC" + SignalValueWCOWCtrlBreak SignalValueWCOW = "CtrlBreak" + SignalValueWCOWCtrlClose SignalValueWCOW = "CtrlClose" + SignalValueWCOWCtrlLogOff SignalValueWCOW = "CtrlLogOff" + SignalValueWCOWCtrlShutdown SignalValueWCOW = "CtrlShutdown" +) + +// ModificationRequest is for modify commands passed to the guest. +type ModificationRequest struct { + RequestType RequestType `json:"RequestType,omitempty"` + ResourceType ResourceType `json:"ResourceType,omitempty"` + Settings interface{} `json:"Settings,omitempty"` +} + +type NetworkModifyRequest struct { + AdapterId string `json:"AdapterId,omitempty"` //nolint:stylecheck + RequestType RequestType `json:"RequestType,omitempty"` + Settings interface{} `json:"Settings,omitempty"` +} + +type RS4NetworkModifyRequest struct { + AdapterInstanceId string `json:"AdapterInstanceId,omitempty"` //nolint:stylecheck + RequestType RequestType `json:"RequestType,omitempty"` + Settings interface{} `json:"Settings,omitempty"` +} + +var ( + // V5 GUIDs for SCSI controllers + // These GUIDs are created with namespace GUID "d422512d-2bf2-4752-809d-7b82b5fcb1b4" + // and index as names. For example, first GUID is created like this: + // guid.NewV5("d422512d-2bf2-4752-809d-7b82b5fcb1b4", []byte("0")) + ScsiControllerGuids = []string{ + "df6d0690-79e5-55b6-a5ec-c1e2f77f580a", + "0110f83b-de10-5172-a266-78bca56bf50a", + "b5d2d8d4-3a75-51bf-945b-3444dc6b8579", + "305891a9-b251-5dfe-91a2-c25d9212275b", + } +) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go new file mode 100644 index 000000000..f211d25e7 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go @@ -0,0 +1 @@ +package safefile diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go index 66b8d7e03..74967f21a 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go @@ -1,3 +1,5 @@ +//go:build windows + package safefile import ( @@ -156,7 +158,6 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. 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 } @@ -339,6 +340,33 @@ func MkdirRelative(path string, root *os.File) error { return err } +// MkdirAllRelative creates each directory in the path relative to a root, failing if +// any existing intermediate path components are reparse points. +func MkdirAllRelative(path string, root *os.File) error { + pathParts := strings.Split(filepath.Clean(path), (string)(filepath.Separator)) + for index := range pathParts { + partialPath := filepath.Join(pathParts[0 : index+1]...) + stat, err := LstatRelative(partialPath, root) + + if err != nil { + if os.IsNotExist(err) { + if err := MkdirRelative(partialPath, root); err != nil { + return err + } + continue + } + return err + } + + if !stat.IsDir() { + fullPath := filepath.Join(root.Name(), partialPath) + return &os.PathError{Op: "mkdir", Path: fullPath, Err: syscall.ENOTDIR} + } + } + + return nil +} + // 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) { diff --git a/tools/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/security/grantvmgroupaccess.go similarity index 63% rename from tools/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go rename to tools/vendor/github.com/Microsoft/hcsshim/internal/security/grantvmgroupaccess.go index 6df87b749..bfcc15769 100644 --- a/tools/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/security/grantvmgroupaccess.go @@ -20,34 +20,43 @@ type ( 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 - } +type explicitAccess struct { + //nolint:structcheck + accessPermissions accessMask + //nolint:structcheck + accessMode accessMode + //nolint:structcheck + inheritance inheritMode + //nolint:structcheck + 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 - } -) +type trustee struct { + //nolint:unused,structcheck + multipleTrustee *trustee + //nolint:unused,structcheck + multipleTrusteeOperation int32 + trusteeForm trusteeForm + trusteeType trusteeType + name uintptr +} const ( - accessMaskDesiredPermission accessMask = 1 << 31 // GENERIC_READ + AccessMaskNone accessMask = 0 + AccessMaskRead accessMask = 1 << 31 // GENERIC_READ + AccessMaskWrite accessMask = 1 << 30 // GENERIC_WRITE + AccessMaskExecute accessMask = 1 << 29 // GENERIC_EXECUTE + AccessMaskAll accessMask = 1 << 28 // GENERIC_ALL + + accessMaskDesiredPermission = AccessMaskRead accessModeGrant accessMode = 1 desiredAccessReadControl desiredAccess = 0x20000 desiredAccessWriteDac desiredAccess = 0x40000 - //cspell:disable-next-line gvmga = "GrantVmGroupAccess:" inheritModeNoInheritance inheritMode = 0x0 @@ -60,20 +69,28 @@ const ( shareModeRead shareMode = 0x1 shareModeWrite shareMode = 0x2 - sidVMGroup = "S-1-5-83-0" + //nolint:stylecheck // ST1003 + sidVmGroup = "S-1-5-83-0" - trusteeFormIsSID trusteeForm = 0 + trusteeFormIsSid trusteeForm = 0 trusteeTypeWellKnownGroup trusteeType = 5 ) -// GrantVMGroupAccess sets the DACL for a specified file or directory to +// 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 { +func GrantVmGroupAccess(name string) error { //nolint:stylecheck // ST1003 + return GrantVmGroupAccessWithMask(name, accessMaskDesiredPermission) +} + +// GrantVmGroupAccessWithMask sets the desired DACL for a specified file or +// directory. +func GrantVmGroupAccessWithMask(name string, access accessMask) error { //nolint:stylecheck // ST1003 + if access == 0 || access<<4 != 0 { + return fmt.Errorf("invalid access mask: 0x%08x", access) + } // Stat (to determine if `name` is a directory). s, err := os.Stat(name) if err != nil { @@ -85,7 +102,9 @@ func GrantVmGroupAccess(name string) error { if err != nil { return err // Already wrapped } - defer syscall.CloseHandle(fd) //nolint:errcheck + defer func() { + _ = syscall.CloseHandle(fd) + }() // Get the current DACL and Security Descriptor. Must defer LocalFree on success. ot := objectTypeFileObject @@ -95,15 +114,19 @@ func GrantVmGroupAccess(name string) error { 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 + defer func() { + _, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd))) + }() // 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) + newDACL, err := generateDACLWithAcesAdded(name, s.IsDir(), access, origDACL) if err != nil { return err // Already wrapped } - defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) //nolint:errcheck + defer func() { + _, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) + }() // 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 { @@ -118,28 +141,28 @@ func GrantVmGroupAccess(name string) error { 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) + return 0, fmt.Errorf("syscall.UTF16FromString %s: %w", name, err) } da := uint32(desiredAccessReadControl | desiredAccessWriteDac) sm := uint32(shareModeRead | shareModeWrite) fa := uint32(syscall.FILE_ATTRIBUTE_NORMAL) if isDir { - fa |= syscall.FILE_FLAG_BACKUP_SEMANTICS + fa = uint32(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 0, 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) { +func generateDACLWithAcesAdded(name string, isDir bool, desiredAccess accessMask, origDACL uintptr) (uintptr, error) { // Generate pointers to the SIDs based on the string SIDs - sid, err := syscall.StringToSid(sidVMGroup) + sid, err := syscall.StringToSid(sidVmGroup) if err != nil { - return 0, fmt.Errorf("%s syscall.StringToSid %s %s: %w", gvmga, name, sidVMGroup, err) + return 0, fmt.Errorf("%s syscall.StringToSid %s %s: %w", gvmga, name, sidVmGroup, err) } inheritance := inheritModeNoInheritance @@ -149,11 +172,11 @@ func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintp eaArray := []explicitAccess{ { - accessPermissions: accessMaskDesiredPermission, + accessPermissions: desiredAccess, accessMode: accessModeGrant, inheritance: inheritance, trustee: trustee{ - trusteeForm: trusteeFormIsSID, + trusteeForm: trusteeFormIsSid, trusteeType: trusteeTypeWellKnownGroup, name: uintptr(unsafe.Pointer(sid)), }, diff --git a/tools/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/security/syscall_windows.go similarity index 100% rename from tools/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go rename to tools/vendor/github.com/Microsoft/hcsshim/internal/security/syscall_windows.go diff --git a/tools/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/security/zsyscall_windows.go similarity index 100% rename from tools/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go rename to tools/vendor/github.com/Microsoft/hcsshim/internal/security/zsyscall_windows.go diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go new file mode 100644 index 000000000..9dd00c812 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go @@ -0,0 +1 @@ +package vmcompute diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go index e7f114b67..79b14ef97 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go @@ -1,3 +1,5 @@ +//go:build windows + package vmcompute import ( @@ -5,15 +7,17 @@ import ( "syscall" "time" + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" + "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 +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -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? @@ -62,7 +66,7 @@ type HcsCallback syscall.Handle type HcsProcessInformation struct { // ProcessId is the pid of the created process. ProcessId uint32 - reserved uint32 //nolint:structcheck + _ uint32 // reserved padding // 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. @@ -72,12 +76,28 @@ type HcsProcessInformation struct { } func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error { + now := time.Now() if timeout > 0 { var cancel gcontext.CancelFunc ctx, cancel = gcontext.WithTimeout(ctx, timeout) defer cancel() } + // if ctx already has prior deadlines, the shortest timeout takes precedence and is used. + // find the true timeout for reporting + // + // this is mostly an issue with (*UtilityVM).Start(context.Context), which sets its + // own (2 minute) timeout. + deadline, ok := ctx.Deadline() + trueTimeout := timeout + if ok { + trueTimeout = deadline.Sub(now) + log.G(ctx).WithFields(logrus.Fields{ + logfields.Timeout: trueTimeout, + "desiredTimeout": timeout, + }).Trace("Executing syscall with deadline") + } + done := make(chan error, 1) go func() { done <- f() @@ -85,8 +105,10 @@ func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error 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.") + log.G(ctx).WithField(logfields.Timeout, trueTimeout). + 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: @@ -95,7 +117,7 @@ func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error } func HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSystems, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsEnumerateComputeSystems") + ctx, span := oc.StartSpan(ctx, "HcsEnumerateComputeSystems") defer span.End() defer func() { if result != "" { @@ -122,7 +144,7 @@ func HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSyst } func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration string, identity syscall.Handle) (computeSystem HcsSystem, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCreateComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsCreateComputeSystem") defer span.End() defer func() { if result != "" { @@ -147,7 +169,7 @@ func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration strin } func HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSystem, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsOpenComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsOpenComputeSystem") defer span.End() defer func() { if result != "" { @@ -167,7 +189,7 @@ func HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSys } func HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCloseComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsCloseComputeSystem") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -177,7 +199,7 @@ func HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr er } func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsStartComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsStartComputeSystem") defer span.End() defer func() { if result != "" { @@ -200,7 +222,7 @@ func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, option } func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsShutdownComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsShutdownComputeSystem") defer span.End() defer func() { if result != "" { @@ -223,7 +245,7 @@ func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, opt } func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsTerminateComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsTerminateComputeSystem") defer span.End() defer func() { if result != "" { @@ -246,7 +268,7 @@ func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, op } func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsPauseComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsPauseComputeSystem") defer span.End() defer func() { if result != "" { @@ -269,7 +291,7 @@ func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, option } func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsResumeComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsResumeComputeSystem") defer span.End() defer func() { if result != "" { @@ -292,7 +314,7 @@ func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, optio } func HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem, propertyQuery string) (properties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetComputeSystemProperties") + ctx, span := oc.StartSpan(ctx, "HcsGetComputeSystemProperties") defer span.End() defer func() { if result != "" { @@ -319,7 +341,7 @@ func HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem } func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, configuration string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsModifyComputeSystem") defer span.End() defer func() { if result != "" { @@ -340,7 +362,7 @@ func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, confi } func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyServiceSettings") + ctx, span := oc.StartSpan(ctx, "HcsModifyServiceSettings") defer span.End() defer func() { if result != "" { @@ -361,7 +383,7 @@ func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result str } func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsRegisterComputeSystemCallback") + ctx, span := oc.StartSpan(ctx, "HcsRegisterComputeSystemCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -371,7 +393,7 @@ func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSys } func HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsUnregisterComputeSystemCallback") + ctx, span := oc.StartSpan(ctx, "HcsUnregisterComputeSystemCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -381,7 +403,7 @@ func HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle Hcs } func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processParameters string) (processInformation HcsProcessInformation, process HcsProcess, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCreateProcess") + ctx, span := oc.StartSpan(ctx, "HcsCreateProcess") defer span.End() defer func() { if result != "" { @@ -389,7 +411,12 @@ func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processPara } oc.SetSpanStatus(span, hr) }() - span.AddAttributes(trace.StringAttribute("processParameters", processParameters)) + if span.IsRecordingEvents() { + // wont handle v1 process parameters + if s, err := log.ScrubProcessParameters(processParameters); err == nil { + span.AddAttributes(trace.StringAttribute("processParameters", s)) + } + } return processInformation, process, result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 @@ -402,7 +429,7 @@ func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processPara } func HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) (process HcsProcess, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsOpenProcess") + ctx, span := oc.StartSpan(ctx, "HcsOpenProcess") defer span.End() defer func() { if result != "" { @@ -423,7 +450,7 @@ func HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) ( } func HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsCloseProcess") + ctx, span := oc.StartSpan(ctx, "HcsCloseProcess") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -433,7 +460,7 @@ func HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) { } func HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsTerminateProcess") + ctx, span := oc.StartSpan(ctx, "HcsTerminateProcess") defer span.End() defer func() { if result != "" { @@ -453,7 +480,7 @@ func HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result strin } func HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsSignalProcess") + ctx, span := oc.StartSpan(ctx, "HcsSignalProcess") defer span.End() defer func() { if result != "" { @@ -474,7 +501,7 @@ func HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) } func HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInformation HcsProcessInformation, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetProcessInfo") + ctx, span := oc.StartSpan(ctx, "HcsGetProcessInfo") defer span.End() defer func() { if result != "" { @@ -494,7 +521,7 @@ func HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInforma } func HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processProperties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetProcessProperties") + ctx, span := oc.StartSpan(ctx, "HcsGetProcessProperties") defer span.End() defer func() { if result != "" { @@ -520,7 +547,7 @@ func HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processP } func HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsModifyProcess") + ctx, span := oc.StartSpan(ctx, "HcsModifyProcess") defer span.End() defer func() { if result != "" { @@ -541,7 +568,7 @@ func HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) } func HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (properties, result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsGetServiceProperties") + ctx, span := oc.StartSpan(ctx, "HcsGetServiceProperties") defer span.End() defer func() { if result != "" { @@ -568,7 +595,7 @@ func HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (proper } func HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsRegisterProcessCallback") + ctx, span := oc.StartSpan(ctx, "HcsRegisterProcessCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -578,7 +605,7 @@ func HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callba } func HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { - ctx, span := trace.StartSpan(ctx, "HcsUnregisterProcessCallback") + ctx, span := oc.StartSpan(ctx, "HcsUnregisterProcessCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() @@ -588,7 +615,7 @@ func HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallba } func HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { - ctx, span := trace.StartSpan(ctx, "HcsSaveComputeSystem") + ctx, span := oc.StartSpan(ctx, "HcsSaveComputeSystem") defer span.End() defer func() { if result != "" { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go index cae55058d..42368872b 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package vmcompute @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } @@ -39,48 +42,55 @@ func errnoErr(e syscall.Errno) error { 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") + procHcsCloseProcess = modvmcompute.NewProc("HcsCloseProcess") + procHcsCreateComputeSystem = modvmcompute.NewProc("HcsCreateComputeSystem") + procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess") + procHcsEnumerateComputeSystems = modvmcompute.NewProc("HcsEnumerateComputeSystems") procHcsGetComputeSystemProperties = modvmcompute.NewProc("HcsGetComputeSystemProperties") + procHcsGetProcessInfo = modvmcompute.NewProc("HcsGetProcessInfo") + procHcsGetProcessProperties = modvmcompute.NewProc("HcsGetProcessProperties") + procHcsGetServiceProperties = modvmcompute.NewProc("HcsGetServiceProperties") procHcsModifyComputeSystem = modvmcompute.NewProc("HcsModifyComputeSystem") + procHcsModifyProcess = modvmcompute.NewProc("HcsModifyProcess") procHcsModifyServiceSettings = modvmcompute.NewProc("HcsModifyServiceSettings") + procHcsOpenComputeSystem = modvmcompute.NewProc("HcsOpenComputeSystem") + procHcsOpenProcess = modvmcompute.NewProc("HcsOpenProcess") + procHcsPauseComputeSystem = modvmcompute.NewProc("HcsPauseComputeSystem") procHcsRegisterComputeSystemCallback = modvmcompute.NewProc("HcsRegisterComputeSystemCallback") - procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback") + procHcsRegisterProcessCallback = modvmcompute.NewProc("HcsRegisterProcessCallback") + procHcsResumeComputeSystem = modvmcompute.NewProc("HcsResumeComputeSystem") procHcsSaveComputeSystem = modvmcompute.NewProc("HcsSaveComputeSystem") - procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess") - procHcsOpenProcess = modvmcompute.NewProc("HcsOpenProcess") - procHcsCloseProcess = modvmcompute.NewProc("HcsCloseProcess") - procHcsTerminateProcess = modvmcompute.NewProc("HcsTerminateProcess") + procHcsShutdownComputeSystem = modvmcompute.NewProc("HcsShutdownComputeSystem") procHcsSignalProcess = modvmcompute.NewProc("HcsSignalProcess") - procHcsGetProcessInfo = modvmcompute.NewProc("HcsGetProcessInfo") - procHcsGetProcessProperties = modvmcompute.NewProc("HcsGetProcessProperties") - procHcsModifyProcess = modvmcompute.NewProc("HcsModifyProcess") - procHcsGetServiceProperties = modvmcompute.NewProc("HcsGetServiceProperties") - procHcsRegisterProcessCallback = modvmcompute.NewProc("HcsRegisterProcessCallback") + procHcsStartComputeSystem = modvmcompute.NewProc("HcsStartComputeSystem") + procHcsTerminateComputeSystem = modvmcompute.NewProc("HcsTerminateComputeSystem") + procHcsTerminateProcess = modvmcompute.NewProc("HcsTerminateProcess") + procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback") procHcsUnregisterProcessCallback = modvmcompute.NewProc("HcsUnregisterProcessCallback") ) -func hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(query) +func hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) { + hr = procHcsCloseComputeSystem.Find() if hr != nil { return } - return _hcsEnumerateComputeSystems(_p0, computeSystems, result) + 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 _hcsEnumerateComputeSystems(query *uint16, computeSystems **uint16, result **uint16) (hr error) { - if hr = procHcsEnumerateComputeSystems.Find(); hr != nil { +func hcsCloseProcess(process HcsProcess) (hr error) { + hr = procHcsCloseProcess.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsEnumerateComputeSystems.Addr(), 3, uintptr(unsafe.Pointer(query)), uintptr(unsafe.Pointer(computeSystems)), uintptr(unsafe.Pointer(result))) + r0, _, _ := syscall.Syscall(procHcsCloseProcess.Addr(), 1, uintptr(process), 0, 0) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -105,7 +115,8 @@ func hcsCreateComputeSystem(id string, configuration string, identity syscall.Ha } func _hcsCreateComputeSystem(id *uint16, configuration *uint16, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) { - if hr = procHcsCreateComputeSystem.Find(); hr != nil { + hr = procHcsCreateComputeSystem.Find() + if 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) @@ -118,34 +129,21 @@ func _hcsCreateComputeSystem(id *uint16, configuration *uint16, identity syscall return } -func hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) { +func hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(id) + _p0, hr = syscall.UTF16PtrFromString(processParameters) 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 + return _hcsCreateProcess(computeSystem, _p0, processInformation, process, result) } -func hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) { - if hr = procHcsCloseComputeSystem.Find(); hr != nil { +func _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { + hr = procHcsCreateProcess.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsCloseComputeSystem.Addr(), 1, uintptr(computeSystem), 0, 0) + 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 @@ -155,20 +153,21 @@ func hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) { return } -func hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { +func hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) + _p0, hr = syscall.UTF16PtrFromString(query) if hr != nil { return } - return _hcsStartComputeSystem(computeSystem, _p0, result) + return _hcsEnumerateComputeSystems(_p0, computeSystems, result) } -func _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsStartComputeSystem.Find(); hr != nil { +func _hcsEnumerateComputeSystems(query *uint16, computeSystems **uint16, result **uint16) (hr error) { + hr = procHcsEnumerateComputeSystems.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsStartComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) + 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 @@ -178,20 +177,21 @@ func _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **u return } -func hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { +func hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) + _p0, hr = syscall.UTF16PtrFromString(propertyQuery) if hr != nil { return } - return _hcsShutdownComputeSystem(computeSystem, _p0, result) + return _hcsGetComputeSystemProperties(computeSystem, _p0, properties, result) } -func _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsShutdownComputeSystem.Find(); hr != nil { +func _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { + hr = procHcsGetComputeSystemProperties.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsShutdownComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) + 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 @@ -201,20 +201,12 @@ func _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result return } -func hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) +func hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) { + hr = procHcsGetProcessInfo.Find() 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))) + 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 @@ -224,20 +216,12 @@ func _hcsTerminateComputeSystem(computeSystem HcsSystem, options *uint16, result return } -func hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) +func hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) { + hr = procHcsGetProcessProperties.Find() 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))) + 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 @@ -247,20 +231,21 @@ func _hcsPauseComputeSystem(computeSystem HcsSystem, options *uint16, result **u return } -func hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { +func hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(options) + _p0, hr = syscall.UTF16PtrFromString(propertyQuery) if hr != nil { return } - return _hcsResumeComputeSystem(computeSystem, _p0, result) + return _hcsGetServiceProperties(_p0, properties, result) } -func _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsResumeComputeSystem.Find(); hr != nil { +func _hcsGetServiceProperties(propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { + hr = procHcsGetServiceProperties.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsResumeComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) + 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 @@ -270,20 +255,21 @@ func _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result ** return } -func hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) { +func hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(propertyQuery) + _p0, hr = syscall.UTF16PtrFromString(configuration) if hr != nil { return } - return _hcsGetComputeSystemProperties(computeSystem, _p0, properties, result) + return _hcsModifyComputeSystem(computeSystem, _p0, result) } -func _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { - if hr = procHcsGetComputeSystemProperties.Find(); hr != nil { +func _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, result **uint16) (hr error) { + hr = procHcsModifyComputeSystem.Find() + if 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) + 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 @@ -293,20 +279,21 @@ func _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint return } -func hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) { +func hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(configuration) + _p0, hr = syscall.UTF16PtrFromString(settings) if hr != nil { return } - return _hcsModifyComputeSystem(computeSystem, _p0, result) + return _hcsModifyProcess(process, _p0, result) } -func _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, result **uint16) (hr error) { - if hr = procHcsModifyComputeSystem.Find(); hr != nil { +func _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (hr error) { + hr = procHcsModifyProcess.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsModifyComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(configuration)), uintptr(unsafe.Pointer(result))) + 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 @@ -326,7 +313,8 @@ func hcsModifyServiceSettings(settings string, result **uint16) (hr error) { } func _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) { - if hr = procHcsModifyServiceSettings.Find(); hr != nil { + hr = procHcsModifyServiceSettings.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procHcsModifyServiceSettings.Addr(), 2, uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result)), 0) @@ -339,11 +327,21 @@ func _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) { return } -func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { - if hr = procHcsRegisterComputeSystemCallback.Find(); hr != nil { +func hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(id) + if hr != nil { return } - r0, _, _ := syscall.Syscall6(procHcsRegisterComputeSystemCallback.Addr(), 4, uintptr(computeSystem), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)), 0, 0) + return _hcsOpenComputeSystem(_p0, computeSystem, result) +} + +func _hcsOpenComputeSystem(id *uint16, computeSystem *HcsSystem, result **uint16) (hr error) { + hr = procHcsOpenComputeSystem.Find() + if 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 @@ -353,11 +351,12 @@ func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, return } -func hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) { - if hr = procHcsUnregisterComputeSystemCallback.Find(); hr != nil { +func hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) { + hr = procHcsOpenProcess.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsUnregisterComputeSystemCallback.Addr(), 1, uintptr(callbackHandle), 0, 0) + 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 @@ -367,20 +366,21 @@ func hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) { return } -func hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { +func hcsPauseComputeSystem(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) + return _hcsPauseComputeSystem(computeSystem, _p0, result) } -func _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { - if hr = procHcsSaveComputeSystem.Find(); hr != nil { +func _hcsPauseComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsPauseComputeSystem.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsSaveComputeSystem.Addr(), 3, uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) + 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 @@ -390,20 +390,27 @@ func _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **ui return } -func hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(processParameters) +func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { + hr = procHcsRegisterComputeSystemCallback.Find() if hr != nil { return } - return _hcsCreateProcess(computeSystem, _p0, processInformation, process, result) + 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 _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { - if hr = procHcsCreateProcess.Find(); hr != nil { +func hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { + hr = procHcsRegisterProcessCallback.Find() + if 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) + 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 @@ -413,11 +420,21 @@ func _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, proce return } -func hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) { - if hr = procHcsOpenProcess.Find(); hr != nil { +func hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(options) + if hr != nil { return } - r0, _, _ := syscall.Syscall6(procHcsOpenProcess.Addr(), 4, uintptr(computeSystem), uintptr(pid), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result)), 0, 0) + return _hcsResumeComputeSystem(computeSystem, _p0, result) +} + +func _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsResumeComputeSystem.Find() + if 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 @@ -427,11 +444,21 @@ func hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, re return } -func hcsCloseProcess(process HcsProcess) (hr error) { - if hr = procHcsCloseProcess.Find(); hr != nil { +func hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(options) + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsCloseProcess.Addr(), 1, uintptr(process), 0, 0) + return _hcsSaveComputeSystem(computeSystem, _p0, result) +} + +func _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsSaveComputeSystem.Find() + if 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 @@ -441,11 +468,21 @@ func hcsCloseProcess(process HcsProcess) (hr error) { return } -func hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) { - if hr = procHcsTerminateProcess.Find(); hr != nil { +func hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(options) + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsTerminateProcess.Addr(), 2, uintptr(process), uintptr(unsafe.Pointer(result)), 0) + return _hcsShutdownComputeSystem(computeSystem, _p0, result) +} + +func _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsShutdownComputeSystem.Find() + if 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 @@ -465,7 +502,8 @@ func hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr e } func _hcsSignalProcess(process HcsProcess, options *uint16, result **uint16) (hr error) { - if hr = procHcsSignalProcess.Find(); hr != nil { + hr = procHcsSignalProcess.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procHcsSignalProcess.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) @@ -478,25 +516,21 @@ func _hcsSignalProcess(process HcsProcess, options *uint16, result **uint16) (hr return } -func hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) { - if hr = procHcsGetProcessInfo.Find(); hr != nil { +func hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(options) + if 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 + return _hcsStartComputeSystem(computeSystem, _p0, result) } -func hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) { - if hr = procHcsGetProcessProperties.Find(); hr != nil { +func _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsStartComputeSystem.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsGetProcessProperties.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(processProperties)), uintptr(unsafe.Pointer(result))) + 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 @@ -506,20 +540,21 @@ func hcsGetProcessProperties(process HcsProcess, processProperties **uint16, res return } -func hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) { +func hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(settings) + _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } - return _hcsModifyProcess(process, _p0, result) + return _hcsTerminateComputeSystem(computeSystem, _p0, result) } -func _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (hr error) { - if hr = procHcsModifyProcess.Find(); hr != nil { +func _hcsTerminateComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { + hr = procHcsTerminateComputeSystem.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procHcsModifyProcess.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result))) + 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 @@ -529,20 +564,12 @@ func _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (h return } -func hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(propertyQuery) +func hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) { + hr = procHcsTerminateProcess.Find() 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))) + r0, _, _ := syscall.Syscall(procHcsTerminateProcess.Addr(), 2, uintptr(process), uintptr(unsafe.Pointer(result)), 0) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -552,11 +579,12 @@ func _hcsGetServiceProperties(propertyQuery *uint16, properties **uint16, result return } -func hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { - if hr = procHcsRegisterProcessCallback.Find(); hr != nil { +func hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) { + hr = procHcsUnregisterComputeSystemCallback.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall6(procHcsRegisterProcessCallback.Addr(), 4, uintptr(process), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)), 0, 0) + r0, _, _ := syscall.Syscall(procHcsUnregisterComputeSystemCallback.Addr(), 1, uintptr(callbackHandle), 0, 0) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -567,7 +595,8 @@ func hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context ui } func hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) { - if hr = procHcsUnregisterProcessCallback.Find(); hr != nil { + hr = procHcsUnregisterProcessCallback.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procHcsUnregisterProcessCallback.Addr(), 1, uintptr(callbackHandle), 0, 0) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go index 5debe974d..e12253c94 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -14,7 +16,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go new file mode 100644 index 000000000..ec4423eff --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go @@ -0,0 +1,216 @@ +package wclayer + +import ( + "errors" + "io" + "os" + "path/filepath" + "strings" + "syscall" + + "github.com/Microsoft/go-winio" + "github.com/Microsoft/hcsshim/internal/longpath" + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +type baseLayerReader struct { + s *trace.Span + root string + result chan *fileEntry + proceed chan bool + currentFile *os.File + backupReader *winio.BackupFileReader +} + +func newBaseLayerReader(root string, s *trace.Span) (r *baseLayerReader) { + r = &baseLayerReader{ + s: s, + root: root, + result: make(chan *fileEntry), + proceed: make(chan bool), + } + go r.walk() + return r +} + +func (r *baseLayerReader) walkUntilCancelled() error { + root, err := longpath.LongAbs(r.root) + if err != nil { + return err + } + + r.root = root + + err = filepath.Walk(filepath.Join(r.root, filesPath), 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 + } + + r.result <- &fileEntry{path, info, nil} + if !<-r.proceed { + return errorIterationCanceled + } + + return nil + }) + + if err == errorIterationCanceled { + return nil + } + + if err != nil { + return err + } + + utilityVMAbsPath := filepath.Join(r.root, utilityVMPath) + utilityVMFilesAbsPath := filepath.Join(r.root, utilityVMFilesPath) + + // Ignore a UtilityVM without Files, that's not _really_ a UtiltyVM + if _, err = os.Lstat(utilityVMFilesAbsPath); err != nil { + if os.IsNotExist(err) { + return io.EOF + } + return err + } + + err = filepath.Walk(utilityVMAbsPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if path != utilityVMAbsPath && path != utilityVMFilesAbsPath && !hasPathPrefix(path, utilityVMFilesAbsPath) { + if info.IsDir() { + return filepath.SkipDir + } + return nil + } + + r.result <- &fileEntry{path, info, nil} + if !<-r.proceed { + return errorIterationCanceled + } + + return nil + }) + + if err == errorIterationCanceled { + return nil + } + + if err != nil { + return err + } + + return io.EOF +} + +func (r *baseLayerReader) 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 *baseLayerReader) reset() { + if r.backupReader != nil { + r.backupReader.Close() + r.backupReader = nil + } + if r.currentFile != nil { + r.currentFile.Close() + r.currentFile = nil + } +} + +func (r *baseLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) { + r.reset() + r.proceed <- true + fe := <-r.result + if fe == nil { + err = errors.New("BaseLayerReader closed") + return + } + if fe.err != nil { + err = fe.err + return + } + + path, err = filepath.Rel(r.root, fe.path) + if err != nil { + return + } + + 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 + } + + size = fe.fi.Size() + r.backupReader = winio.NewBackupFileReader(f, true) + + r.currentFile = f + f = nil + return +} + +func (r *baseLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) { + fileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile) + if err != nil { + return 0, nil, err + } + fileIDInfo, err := winio.GetFileID(r.currentFile) + if err != nil { + return 0, nil, err + } + return fileStandardInfo.NumberOfLinks, fileIDInfo, nil +} + +func (r *baseLayerReader) Read(b []byte) (int, error) { + if r.backupReader == nil { + return 0, io.EOF + } + return r.backupReader.Read(b) +} + +func (r *baseLayerReader) Close() (err error) { + defer r.s.End() + defer func() { + oc.SetSpanStatus(r.s, err) + close(r.proceed) + }() + r.proceed <- false + // The r.result channel will be closed once walk() returns + <-r.result + r.reset() + return nil +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerwriter.go similarity index 99% rename from tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go rename to tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerwriter.go index 3ec708d1e..aea8b421e 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerwriter.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -48,7 +50,6 @@ func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error { if err != nil { return err } - } return nil } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go new file mode 100644 index 000000000..ceb3b5083 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go @@ -0,0 +1,158 @@ +package wclayer + +import ( + "context" + "fmt" + "os" + "path/filepath" + "syscall" + + "github.com/Microsoft/hcsshim/internal/hcserror" + "github.com/Microsoft/hcsshim/internal/longpath" + "github.com/Microsoft/hcsshim/internal/oc" + "github.com/Microsoft/hcsshim/internal/safefile" + "github.com/Microsoft/hcsshim/internal/winapi" + "github.com/pkg/errors" + "go.opencensus.io/trace" + "golang.org/x/sys/windows" +) + +var hiveNames = []string{"DEFAULT", "SAM", "SECURITY", "SOFTWARE", "SYSTEM"} + +// Ensure the given file exists as an ordinary file, and create a minimal hive file if not. +func ensureHive(path string, root *os.File) (err error) { + _, err = safefile.LstatRelative(path, root) + if err != nil && !os.IsNotExist(err) { + return fmt.Errorf("accessing %s: %w", path, err) + } + + version := windows.RtlGetVersion() + if version == nil { + return fmt.Errorf("failed to get OS version") + } + + var fullPath string + fullPath, err = longpath.LongAbs(filepath.Join(root.Name(), path)) + if err != nil { + return fmt.Errorf("getting path: %w", err) + } + + var key syscall.Handle + err = winapi.ORCreateHive(&key) + if err != nil { + return fmt.Errorf("creating hive: %w", err) + } + + defer func() { + closeErr := winapi.ORCloseHive(key) + if closeErr != nil && err == nil { + err = fmt.Errorf("closing hive key: %w", closeErr) + } + }() + + err = winapi.ORSaveHive(key, fullPath, version.MajorVersion, version.MinorVersion) + if err != nil { + return fmt.Errorf("saving hive: %w", err) + } + + return nil +} + +func ensureBaseLayer(root *os.File) (hasUtilityVM bool, err error) { + // The base layer registry hives will be copied from here + const hiveSourcePath = "Files\\Windows\\System32\\config" + if err = safefile.MkdirAllRelative(hiveSourcePath, root); err != nil { + return + } + + for _, hiveName := range hiveNames { + hivePath := filepath.Join(hiveSourcePath, hiveName) + if err = ensureHive(hivePath, root); err != nil { + return + } + } + + stat, err := safefile.LstatRelative(utilityVMFilesPath, root) + + if os.IsNotExist(err) { + return false, nil + } + + if err != nil { + return + } + + if !stat.Mode().IsDir() { + fullPath := filepath.Join(root.Name(), utilityVMFilesPath) + return false, errors.Errorf("%s has unexpected file mode %s", fullPath, stat.Mode().String()) + } + + const bcdRelativePath = "EFI\\Microsoft\\Boot\\BCD" + + // Just check that this exists as a regular file. If it exists but is not a valid registry hive, + // ProcessUtilityVMImage will complain: + // "The registry could not read in, or write out, or flush, one of the files that contain the system's image of the registry." + bcdPath := filepath.Join(utilityVMFilesPath, bcdRelativePath) + + stat, err = safefile.LstatRelative(bcdPath, root) + if err != nil { + return false, errors.Wrapf(err, "UtilityVM must contain '%s'", bcdRelativePath) + } + + if !stat.Mode().IsRegular() { + fullPath := filepath.Join(root.Name(), bcdPath) + return false, errors.Errorf("%s has unexpected file mode %s", fullPath, stat.Mode().String()) + } + + return true, nil +} + +func convertToBaseLayer(ctx context.Context, root *os.File) error { + hasUtilityVM, err := ensureBaseLayer(root) + + if err != nil { + return err + } + + if err := ProcessBaseLayer(ctx, root.Name()); err != nil { + return err + } + + if !hasUtilityVM { + return nil + } + + err = safefile.EnsureNotReparsePointRelative(utilityVMPath, root) + if err != nil { + return err + } + + utilityVMPath := filepath.Join(root.Name(), utilityVMPath) + return ProcessUtilityVMImage(ctx, utilityVMPath) +} + +// ConvertToBaseLayer processes a candidate base layer, i.e. a directory +// containing the desired file content under Files/, and optionally the +// desired file content for a UtilityVM under UtilityVM/Files/ +func ConvertToBaseLayer(ctx context.Context, path string) (err error) { + title := "hcsshim::ConvertToBaseLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes(trace.StringAttribute("path", path)) + + root, err := safefile.OpenRoot(path) + if err != nil { + return hcserror.New(err, title+" - failed", "") + } + defer func() { + if err2 := root.Close(); err == nil && err2 != nil { + err = hcserror.New(err2, title+" - failed", "") + } + }() + + if err = convertToBaseLayer(ctx, root); err != nil { + return hcserror.New(err, title+" - failed", "") + } + return nil +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go index 480aee872..932475723 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go index 131aa94f1..5c9d5d250 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -13,7 +15,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go index d5bf2f5bd..e3bc77cbc 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -11,7 +13,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go index 424467ac3..d0a59efe1 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go new file mode 100644 index 000000000..dd1d55580 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go @@ -0,0 +1,4 @@ +// 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 diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go index 035c9041e..e2ec27ad0 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -16,7 +18,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go index 97b27eb7d..d4c677aab 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go @@ -1,8 +1,9 @@ +//go:build windows + package wclayer import ( "context" - "io/ioutil" "os" "strings" @@ -19,7 +20,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -40,9 +41,16 @@ func ExportLayer(ctx context.Context, path string, exportFolderPath string, pare return nil } +// LayerReader is an interface that supports reading an existing container image layer. type LayerReader interface { + // Next advances to the next file and returns the name, size, and file info Next() (string, int64, *winio.FileBasicInfo, error) + // LinkInfo returns the number of links and the file identifier for the current file. + LinkInfo() (uint32, *winio.FileIDInfo, error) + // Read reads data from the current file, in the format of a Win32 backup stream, and + // returns the number of bytes read. Read(b []byte) (int, error) + // Close finishes the layer reading process and releases any resources. Close() error } @@ -50,7 +58,7 @@ type LayerReader interface { // 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") + ctx, span := oc.StartSpan(ctx, "hcsshim::NewLayerReader") defer func() { if err != nil { oc.SetSpanStatus(span, err) @@ -61,7 +69,12 @@ func NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) trace.StringAttribute("path", path), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) - exportPath, err := ioutil.TempDir("", "hcs") + if len(parentLayerPaths) == 0 { + // This is a base layer. It gets exported differently. + return newBaseLayerReader(path, span), nil + } + + exportPath, err := os.MkdirTemp("", "hcs") if err != nil { return nil, err } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go index 8d213f587..715e06e37 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -16,7 +18,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go index ae1fff840..5e400fb20 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -14,7 +16,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go index 4b282fef9..20217ed81 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -11,7 +13,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go index 687550f0b..50f669a26 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go @@ -1,8 +1,9 @@ +//go:build windows + package wclayer import ( "context" - "io/ioutil" "os" "path/filepath" "strings" @@ -20,7 +21,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( @@ -124,7 +125,7 @@ func (r *legacyLayerWriterWrapper) Close() (err error) { // 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") + ctx, span := oc.StartSpan(ctx, "hcsshim::NewLayerWriter") defer func() { if err != nil { oc.SetSpanStatus(span, err) @@ -148,7 +149,7 @@ func NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) }, nil } - importPath, err := ioutil.TempDir("", "hcs") + importPath, err := os.MkdirTemp("", "hcs") if err != nil { return nil, err } diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go index 01e672339..4d82977ea 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go index 0ce34a30f..d4805f144 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go index 1ec893c6a..d5d2cb137 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer // This file contains utility functions to support storage (graph) related @@ -11,7 +13,9 @@ import ( "github.com/sirupsen/logrus" ) -/* To pass into syscall, we need a struct matching the following: +/* +To pass into syscall, we need a struct matching the following: + enum GraphDriverType { DiffDriver, @@ -34,32 +38,34 @@ var ( stdDriverInfo = driverInfo{1, &utf16EmptyString} ) -/* To pass into syscall, we need a struct matching the following: +/* +To pass into syscall, we need a struct matching the following: + typedef struct _WC_LAYER_DESCRIPTOR { - // - // The ID of the layer - // + // + // The ID of the layer + // - GUID LayerId; + GUID LayerId; - // - // Additional flags - // + // + // Additional flags + // - union { - struct { - ULONG Reserved : 31; - ULONG Dirty : 1; // Created from sandbox as a result of snapshot - }; - ULONG Value; - } 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 - // + // + // Path to the layer root directory, null-terminated + // - PCWSTR Path; + PCWSTR Path; } WC_LAYER_DESCRIPTOR, *PWC_LAYER_DESCRIPTOR; */ diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go index b7f3064f2..ee8da5df9 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -6,7 +8,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -262,7 +263,6 @@ func (r *legacyLayerReader) Next() (path string, size int64, fileInfo *winio.Fil // 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 @@ -294,6 +294,18 @@ func (r *legacyLayerReader) Next() (path string, size int64, fileInfo *winio.Fil return } +func (r *legacyLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) { + fileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile) + if err != nil { + return 0, nil, err + } + fileIDInfo, err := winio.GetFileID(r.currentFile) + if err != nil { + return 0, nil, err + } + return fileStandardInfo.NumberOfLinks, fileIDInfo, nil +} + func (r *legacyLayerReader) Read(b []byte) (int, error) { if r.backupReader == nil { if r.currentFile == nil { @@ -349,7 +361,7 @@ type legacyLayerWriter struct { currentIsDir bool } -// newLegacyLayerWriter returns a LayerWriter that can write the contaler layer +// newLegacyLayerWriter returns a LayerWriter that can write the container layer // transport format to disk. func newLegacyLayerWriter(root string, parentRoots []string, destRoot string) (w *legacyLayerWriter, err error) { w = &legacyLayerWriter{ @@ -376,7 +388,7 @@ func newLegacyLayerWriter(root string, parentRoots []string, destRoot string) (w } w.parentRoots = append(w.parentRoots, f) } - w.bufWriter = bufio.NewWriterSize(ioutil.Discard, 65536) + w.bufWriter = bufio.NewWriterSize(io.Discard, 65536) return } @@ -419,7 +431,7 @@ func (w *legacyLayerWriter) reset() error { if err != nil { return err } - w.bufWriter.Reset(ioutil.Discard) + w.bufWriter.Reset(io.Discard) if w.currentIsDir { r := w.currentFile br := winio.NewBackupStreamReader(r) @@ -695,7 +707,7 @@ func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) erro // 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) + w.bufWriter.Reset(io.Discard) return err } } @@ -730,7 +742,7 @@ func (w *legacyLayerWriter) AddLink(name string, target string) error { return errors.New("invalid hard link in layer") } - // Find to try the target of the link in a previously added file. If that + // Try to find 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 { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go index 09950297c..c45fa2750 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -14,7 +16,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("objectName", name)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go index 90129faef..b66e07124 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -19,7 +21,7 @@ var prepareLayerLock sync.Mutex // 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) + ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go index 30bcdff5f..7c49cbda4 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) @@ -28,7 +30,7 @@ func ProcessBaseLayer(ctx context.Context, path string) (err error) { // 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 + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go index 71b130c52..fe20702c1 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -12,7 +14,7 @@ import ( // the given id. func UnprepareLayer(ctx context.Context, path string) (err error) { title := "hcsshim::UnprepareLayer" - ctx, span := trace.StartSpan(ctx, title) //nolint:ineffassign,staticcheck + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go index 9b1e06d50..39682b817 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go @@ -1,11 +1,10 @@ -// Package wclayer provides bindings to HCS's legacy layer management API and -// provides a higher level interface around these calls for container layer -// management. +//go:build windows + package wclayer import "github.com/Microsoft/go-winio/pkg/guid" -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go wclayer.go +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -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? diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go index 67f917f07..0cb509c46 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package wclayer @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } @@ -37,33 +40,75 @@ func errnoErr(e syscall.Errno) error { } var ( - modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") - modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") + modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") + procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW") + procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") + procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") 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") + procExpandSandboxSize = modvmcompute.NewProc("ExpandSandboxSize") procExportLayer = modvmcompute.NewProc("ExportLayer") - procGetLayerMountPath = modvmcompute.NewProc("GetLayerMountPath") procGetBaseImages = modvmcompute.NewProc("GetBaseImages") + procGetLayerMountPath = modvmcompute.NewProc("GetLayerMountPath") + procGrantVmAccess = modvmcompute.NewProc("GrantVmAccess") 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") + procUnprepareLayer = modvmcompute.NewProc("UnprepareLayer") ) +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 { + err = errnoErr(e1) + } + 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 { + err = errnoErr(e1) + } + 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 { + err = errnoErr(e1) + } + return +} + func activateLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) @@ -74,7 +119,8 @@ func activateLayer(info *driverInfo, id string) (hr error) { } func _activateLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procActivateLayer.Find(); hr != nil { + hr = procActivateLayer.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procActivateLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) @@ -102,13 +148,14 @@ func copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LA } func _copyLayer(info *driverInfo, srcId *uint16, dstId *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { + hr = procCopyLayer.Find() + if hr != nil { + return + } 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 { @@ -134,7 +181,8 @@ func createLayer(info *driverInfo, id string, parent string) (hr error) { } func _createLayer(info *driverInfo, id *uint16, parent *uint16) (hr error) { - if hr = procCreateLayer.Find(); hr != nil { + hr = procCreateLayer.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procCreateLayer.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(parent))) @@ -157,13 +205,14 @@ func createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors } func _createSandboxLayer(info *driverInfo, id *uint16, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { + hr = procCreateSandboxLayer.Find() + if hr != nil { + return + } 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 { @@ -174,20 +223,21 @@ func _createSandboxLayer(info *driverInfo, id *uint16, parent uintptr, descripto return } -func expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) { +func deactivateLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } - return _expandSandboxSize(info, _p0, size) + return _deactivateLayer(info, _p0) } -func _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) { - if hr = procExpandSandboxSize.Find(); hr != nil { +func _deactivateLayer(info *driverInfo, id *uint16) (hr error) { + hr = procDeactivateLayer.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procExpandSandboxSize.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(size)) + 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 @@ -197,20 +247,21 @@ func _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) { return } -func deactivateLayer(info *driverInfo, id string) (hr error) { +func destroyLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } - return _deactivateLayer(info, _p0) + return _destroyLayer(info, _p0) } -func _deactivateLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procDeactivateLayer.Find(); hr != nil { +func _destroyLayer(info *driverInfo, id *uint16) (hr error) { + hr = procDestroyLayer.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procDeactivateLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) + 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 @@ -220,20 +271,21 @@ func _deactivateLayer(info *driverInfo, id *uint16) (hr error) { return } -func destroyLayer(info *driverInfo, id string) (hr error) { +func expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } - return _destroyLayer(info, _p0) + return _expandSandboxSize(info, _p0, size) } -func _destroyLayer(info *driverInfo, id *uint16) (hr error) { - if hr = procDestroyLayer.Find(); hr != nil { +func _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) { + hr = procExpandSandboxSize.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procDestroyLayer.Addr(), 2, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), 0) + 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 @@ -258,14 +310,30 @@ func exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYE } func _exportLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { + hr = procExportLayer.Find() + if hr != nil { + return + } var _p2 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p2 = &descriptors[0] } - if hr = procExportLayer.Find(); hr != nil { + 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 getBaseImages(buffer **uint16) (hr error) { + hr = procGetBaseImages.Find() + if 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) + r0, _, _ := syscall.Syscall(procGetBaseImages.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -285,7 +353,8 @@ func getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uin } func _getLayerMountPath(info *driverInfo, id *uint16, length *uintptr, buffer *uint16) (hr error) { - if hr = procGetLayerMountPath.Find(); hr != nil { + hr = procGetLayerMountPath.Find() + if 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) @@ -298,11 +367,26 @@ func _getLayerMountPath(info *driverInfo, id *uint16, length *uintptr, buffer *u return } -func getBaseImages(buffer **uint16) (hr error) { - if hr = procGetBaseImages.Find(); hr != nil { +func grantVmAccess(vmid string, filepath string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(vmid) + if hr != nil { return } - r0, _, _ := syscall.Syscall(procGetBaseImages.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0) + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(filepath) + if hr != nil { + return + } + return _grantVmAccess(_p0, _p1) +} + +func _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) { + hr = procGrantVmAccess.Find() + if 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 @@ -327,13 +411,14 @@ func importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYE } func _importLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { + hr = procImportLayer.Find() + if hr != nil { + return + } 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 { @@ -354,7 +439,8 @@ func layerExists(info *driverInfo, id string, exists *uint32) (hr error) { } func _layerExists(info *driverInfo, id *uint16, exists *uint32) (hr error) { - if hr = procLayerExists.Find(); hr != nil { + hr = procLayerExists.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procLayerExists.Addr(), 3, uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(exists))) @@ -377,7 +463,8 @@ func nameToGuid(name string, guid *_guid) (hr error) { } func _nameToGuid(name *uint16, guid *_guid) (hr error) { - if hr = procNameToGuid.Find(); hr != nil { + hr = procNameToGuid.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procNameToGuid.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(guid)), 0) @@ -400,13 +487,14 @@ func prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR } func _prepareLayer(info *driverInfo, id *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { + hr = procPrepareLayer.Find() + if hr != nil { + return + } 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 { @@ -417,29 +505,6 @@ func _prepareLayer(info *driverInfo, id *uint16, descriptors []WC_LAYER_DESCRIPT 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) @@ -450,7 +515,8 @@ func processBaseImage(path string) (hr error) { } func _processBaseImage(path *uint16) (hr error) { - if hr = procProcessBaseImage.Find(); hr != nil { + hr = procProcessBaseImage.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procProcessBaseImage.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) @@ -473,7 +539,8 @@ func processUtilityImage(path string) (hr error) { } func _processUtilityImage(path *uint16) (hr error) { - if hr = procProcessUtilityImage.Find(); hr != nil { + hr = procProcessUtilityImage.Find() + if hr != nil { return } r0, _, _ := syscall.Syscall(procProcessUtilityImage.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) @@ -486,25 +553,21 @@ func _processUtilityImage(path *uint16) (hr error) { return } -func grantVmAccess(vmid string, filepath string) (hr error) { +func unprepareLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(vmid) - if hr != nil { - return - } - var _p1 *uint16 - _p1, hr = syscall.UTF16PtrFromString(filepath) + _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } - return _grantVmAccess(_p0, _p1) + return _unprepareLayer(info, _p0) } -func _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) { - if hr = procGrantVmAccess.Find(); hr != nil { +func _unprepareLayer(info *driverInfo, id *uint16) (hr error) { + hr = procUnprepareLayer.Find() + if hr != nil { return } - r0, _, _ := syscall.Syscall(procGrantVmAccess.Addr(), 2, uintptr(unsafe.Pointer(vmid)), uintptr(unsafe.Pointer(filepath)), 0) + 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 @@ -513,57 +576,3 @@ func _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) { } 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/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go new file mode 100644 index 000000000..559d44325 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go @@ -0,0 +1,19 @@ +package winapi + +const ( + BINDFLT_FLAG_READ_ONLY_MAPPING uint32 = 0x00000001 + BINDFLT_FLAG_MERGED_BIND_MAPPING uint32 = 0x00000002 + BINDFLT_FLAG_USE_CURRENT_SILO_MAPPING uint32 = 0x00000004 +) + +// HRESULT +// BfSetupFilter( +// _In_opt_ HANDLE JobHandle, +// _In_ ULONG Flags, +// _In_ LPCWSTR VirtualizationRootPath, +// _In_ LPCWSTR VirtualizationTargetPath, +// _In_reads_opt_( VirtualizationExceptionPathCount ) LPCWSTR* VirtualizationExceptionPaths, +// _In_opt_ ULONG VirtualizationExceptionPathCount +// ); +// +//sys BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) = bindfltapi.BfSetupFilter? diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go index def952541..4547cdd8e 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go index df28ea242..7875466ca 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import "github.com/Microsoft/go-winio/pkg/guid" diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go new file mode 100644 index 000000000..9acc0bfc1 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go @@ -0,0 +1,3 @@ +// 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 diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go new file mode 100644 index 000000000..40cbf8712 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go @@ -0,0 +1,11 @@ +//go:build windows + +package winapi + +import ( + "golang.org/x/sys/windows" +) + +func IsElevated() bool { + return windows.GetCurrentProcessToken().IsElevated() +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go index 4e80ef68c..49ce924cb 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import "syscall" diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go index 7ce52afd5..3dcb3faa0 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go @@ -1,5 +1,8 @@ +//go:build windows + package winapi +//sys CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) = kernel32.CopyFileW //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 @@ -34,34 +37,35 @@ const ( // 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; +// +// 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 ( @@ -98,10 +102,11 @@ type FileLinkInformation struct { } // C declaration: -// typedef struct _FILE_ID_INFO { -// ULONGLONG VolumeSerialNumber; -// FILE_ID_128 FileId; -// } FILE_ID_INFO, *PFILE_ID_INFO; +// +// 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 { diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go index 7eb13f8f0..b0deb5c72 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import ( @@ -55,6 +57,8 @@ const ( JobObjectLimitViolationInformation uint32 = 13 JobObjectMemoryUsageInformation uint32 = 28 JobObjectNotificationLimitInformation2 uint32 = 33 + JobObjectCreateSilo uint32 = 35 + JobObjectSiloBasicInformation uint32 = 36 JobObjectIoAttribution uint32 = 42 ) @@ -111,29 +115,27 @@ type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct { TotalTerminateProcesses uint32 } -//https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information +// 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; -// +// 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; -// +// 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 @@ -141,12 +143,11 @@ type JOBOBJECT_IO_ATTRIBUTION_STATS struct { 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; -// +// 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 @@ -183,7 +184,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { // LPCWSTR lpName // ); // -//sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW +//sys OpenJobObject(desiredAccess uint32, inheritHandle int32, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW // DWORD SetIoRateControlInformationJobObject( // HANDLE hJob, @@ -198,6 +199,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { // 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 @@ -206,6 +208,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { // _In_ ACCESS_MASK DesiredAccess, // _In_ POBJECT_ATTRIBUTES ObjectAttributes // ); +// //sys NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtOpenJobObject // NTSTATUS @@ -215,4 +218,5 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { // _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/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/ofreg.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/ofreg.go new file mode 100644 index 000000000..d8f7afe8a --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/ofreg.go @@ -0,0 +1,5 @@ +package winapi + +//sys ORCreateHive(key *syscall.Handle) (regerrno error) = offreg.ORCreateHive +//sys ORSaveHive(key syscall.Handle, file string, OsMajorVersion uint32, OsMinorVersion uint32) (regerrno error) = offreg.ORSaveHive +//sys ORCloseHive(key syscall.Handle) (regerrno error) = offreg.ORCloseHive diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go index 908920e87..c6a149b55 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go @@ -8,4 +8,5 @@ package winapi // 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/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go index 222529f43..f4ae94cfa 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go @@ -20,22 +20,20 @@ const ProcessVmCounters = 3 // //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; -// +// 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 @@ -51,13 +49,11 @@ type VM_COUNTERS_EX struct { PrivateUsage uintptr } -// typedef struct _VM_COUNTERS_EX2 -// { -// VM_COUNTERS_EX CountersEx; -// SIZE_T PrivateWorkingSetSize; -// SIZE_T SharedCommitUsage; -// } VM_COUNTERS_EX2, *PVM_COUNTERS_EX2; -// +// 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 diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go index 78fe01a4b..cb494aaa6 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import "golang.org/x/sys/windows" diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go index 4724713e3..f23141a83 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go @@ -9,4 +9,5 @@ package winapi // 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/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go new file mode 100644 index 000000000..84d4cc294 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go @@ -0,0 +1,194 @@ +//go:build windows + +package winapi + +import ( + "syscall" + + "golang.org/x/sys/windows" +) + +const UserNameCharLimit = 20 + +const ( + USER_PRIV_GUEST uint32 = iota + USER_PRIV_USER + USER_PRIV_ADMIN +) + +const ( + UF_NORMAL_ACCOUNT = 0x00200 + UF_DONT_EXPIRE_PASSWD = 0x10000 +) + +const NERR_UserNotFound = syscall.Errno(0x8AD) + +// typedef struct _LOCALGROUP_MEMBERS_INFO_0 { +// PSID lgrmi0_sid; +// } LOCALGROUP_MEMBERS_INFO_0, *PLOCALGROUP_MEMBERS_INFO_0, *LPLOCALGROUP_MEMBERS_INFO_0; +type LocalGroupMembersInfo0 struct { + Sid *windows.SID +} + +// typedef struct _LOCALGROUP_INFO_1 { +// LPWSTR lgrpi1_name; +// LPWSTR lgrpi1_comment; +// } LOCALGROUP_INFO_1, *PLOCALGROUP_INFO_1, *LPLOCALGROUP_INFO_1; +type LocalGroupInfo1 struct { + Name *uint16 + Comment *uint16 +} + +// typedef struct _USER_INFO_1 { +// LPWSTR usri1_name; +// LPWSTR usri1_password; +// DWORD usri1_password_age; +// DWORD usri1_priv; +// LPWSTR usri1_home_dir; +// LPWSTR usri1_comment; +// DWORD usri1_flags; +// LPWSTR usri1_script_path; +// } USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1; +type UserInfo1 struct { + Name *uint16 + Password *uint16 + PasswordAge uint32 + Priv uint32 + HomeDir *uint16 + Comment *uint16 + Flags uint32 + ScriptPath *uint16 +} + +// NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetInfo( +// [in] LPCWSTR servername, +// [in] LPCWSTR groupname, +// [in] DWORD level, +// [out] LPBYTE *bufptr +// ); +// +//sys netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) = netapi32.NetLocalGroupGetInfo + +// NetLocalGroupGetInfo is a slightly go friendlier wrapper around the NetLocalGroupGetInfo function. Instead of taking in *uint16's, it takes in +// go strings and does the conversion internally. +func NetLocalGroupGetInfo(serverName, groupName string, level uint32, bufPtr **byte) (err error) { + var ( + serverNameUTF16 *uint16 + groupNameUTF16 *uint16 + ) + if serverName != "" { + serverNameUTF16, err = windows.UTF16PtrFromString(serverName) + if err != nil { + return err + } + } + if groupName != "" { + groupNameUTF16, err = windows.UTF16PtrFromString(groupName) + if err != nil { + return err + } + } + return netLocalGroupGetInfo( + serverNameUTF16, + groupNameUTF16, + level, + bufPtr, + ) +} + +// NET_API_STATUS NET_API_FUNCTION NetUserAdd( +// [in] LPCWSTR servername, +// [in] DWORD level, +// [in] LPBYTE buf, +// [out] LPDWORD parm_err +// ); +// +//sys netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) = netapi32.NetUserAdd + +// NetUserAdd is a slightly go friendlier wrapper around the NetUserAdd function. Instead of taking in *uint16's, it takes in +// go strings and does the conversion internally. +func NetUserAdd(serverName string, level uint32, buf *byte, parm_err *uint32) (err error) { + var serverNameUTF16 *uint16 + if serverName != "" { + serverNameUTF16, err = windows.UTF16PtrFromString(serverName) + if err != nil { + return err + } + } + return netUserAdd( + serverNameUTF16, + level, + buf, + parm_err, + ) +} + +// NET_API_STATUS NET_API_FUNCTION NetUserDel( +// [in] LPCWSTR servername, +// [in] LPCWSTR username +// ); +// +//sys netUserDel(serverName *uint16, username *uint16) (status error) = netapi32.NetUserDel + +// NetUserDel is a slightly go friendlier wrapper around the NetUserDel function. Instead of taking in *uint16's, it takes in +// go strings and does the conversion internally. +func NetUserDel(serverName, userName string) (err error) { + var ( + serverNameUTF16 *uint16 + userNameUTF16 *uint16 + ) + if serverName != "" { + serverNameUTF16, err = windows.UTF16PtrFromString(serverName) + if err != nil { + return err + } + } + if userName != "" { + userNameUTF16, err = windows.UTF16PtrFromString(userName) + if err != nil { + return err + } + } + return netUserDel( + serverNameUTF16, + userNameUTF16, + ) +} + +// NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers( +// [in] LPCWSTR servername, +// [in] LPCWSTR groupname, +// [in] DWORD level, +// [in] LPBYTE buf, +// [in] DWORD totalentries +// ); +// +//sys netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) = netapi32.NetLocalGroupAddMembers + +// NetLocalGroupAddMembers is a slightly go friendlier wrapper around the NetLocalGroupAddMembers function. Instead of taking in *uint16's, it takes in +// go strings and does the conversion internally. +func NetLocalGroupAddMembers(serverName, groupName string, level uint32, buf *byte, totalEntries uint32) (err error) { + var ( + serverNameUTF16 *uint16 + groupNameUTF16 *uint16 + ) + if serverName != "" { + serverNameUTF16, err = windows.UTF16PtrFromString(serverName) + if err != nil { + return err + } + } + if groupName != "" { + groupNameUTF16, err = windows.UTF16PtrFromString(groupName) + if err != nil { + return err + } + } + return netLocalGroupAddMembers( + serverNameUTF16, + groupNameUTF16, + level, + buf, + totalEntries, + ) +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go index 859b753c2..a2da57070 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import ( @@ -32,7 +34,7 @@ type UnicodeString struct { // 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 +// 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 diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go index d2cc9d9fb..6a90e3a69 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go @@ -1,5 +1,3 @@ -// 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 +//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go diff --git a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go index 1f16cf0b8..c607245eb 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package winapi @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } @@ -37,44 +40,68 @@ func errnoErr(e syscall.Errno) error { } 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") + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modbindfltapi = windows.NewLazySystemDLL("bindfltapi.dll") + modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll") + modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modnetapi32 = windows.NewLazySystemDLL("netapi32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + modoffreg = windows.NewLazySystemDLL("offreg.dll") - procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") - procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") - procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") - procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") + procLogonUserW = modadvapi32.NewProc("LogonUserW") + procBfSetupFilter = modbindfltapi.NewProc("BfSetupFilter") + procCM_Get_DevNode_PropertyW = modcfgmgr32.NewProc("CM_Get_DevNode_PropertyW") + procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA") + procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA") + procCM_Locate_DevNodeW = modcfgmgr32.NewProc("CM_Locate_DevNodeW") procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId") - procSearchPathW = modkernel32.NewProc("SearchPathW") + procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") + procCopyFileW = modkernel32.NewProc("CopyFileW") + procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread") + procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") 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") + procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW") + procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject") + procQueryIoRateControlInformationJobObject = modkernel32.NewProc("QueryIoRateControlInformationJobObject") + procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") + procSearchPathW = modkernel32.NewProc("SearchPathW") + procSetIoRateControlInformationJobObject = modkernel32.NewProc("SetIoRateControlInformationJobObject") + procNetLocalGroupAddMembers = modnetapi32.NewProc("NetLocalGroupAddMembers") + procNetLocalGroupGetInfo = modnetapi32.NewProc("NetLocalGroupGetInfo") + procNetUserAdd = modnetapi32.NewProc("NetUserAdd") + procNetUserDel = modnetapi32.NewProc("NetUserDel") procNtCreateFile = modntdll.NewProc("NtCreateFile") - procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") + procNtCreateJobObject = modntdll.NewProc("NtCreateJobObject") procNtOpenDirectoryObject = modntdll.NewProc("NtOpenDirectoryObject") + procNtOpenJobObject = modntdll.NewProc("NtOpenJobObject") procNtQueryDirectoryObject = modntdll.NewProc("NtQueryDirectoryObject") + procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess") + procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") + procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError") + procORCloseHive = modoffreg.NewProc("ORCloseHive") + procORCreateHive = modoffreg.NewProc("ORCreateHive") + procORSaveHive = modoffreg.NewProc("ORSaveHive") ) -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) +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 { + err = errnoErr(e1) + } + return +} + +func BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) { + hr = procBfSetupFilter.Find() + if hr != nil { + return + } + r0, _, _ := syscall.Syscall6(procBfSetupFilter.Addr(), 6, uintptr(jobHandle), uintptr(flags), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(virtTargetPath)), uintptr(unsafe.Pointer(virtExceptions)), uintptr(virtExceptionPathCount)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff @@ -84,13 +111,8 @@ func createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Han 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) +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 @@ -100,135 +122,99 @@ func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) { 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) +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 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 +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 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 - } +func CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(pDeviceID) + if hr != nil { + return } - return + return _CMLocateDevNode(pdnDevInst, _p0, uFlags) } -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 +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 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 - } +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 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 - } - } +func ClosePseudoConsole(hpc windows.Handle) { + syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(hpc), 0, 0) 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 - } +func CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) { + r1, _, e1 := syscall.Syscall(procCopyFileW.Addr(), 3, uintptr(unsafe.Pointer(existingFileName)), uintptr(unsafe.Pointer(newFileName)), uintptr(failIfExists)) + if r1 == 0 { + err = errnoErr(e1) } 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 +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 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) +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 { + err = errnoErr(e1) + } 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) +func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { + r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) + amount = 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))) +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 - } + err = errnoErr(e1) } return } @@ -244,31 +230,34 @@ func LocalFree(ptr uintptr) { 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) +func OpenJobObject(desiredAccess uint32, inheritHandle int32, lpName *uint16) (handle windows.Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenJobObjectW.Addr(), 3, uintptr(desiredAccess), uintptr(inheritHandle), uintptr(unsafe.Pointer(lpName))) + handle = windows.Handle(r0) + if handle == 0 { + err = errnoErr(e1) + } return } -func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { - r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) - amount = uint32(r0) +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 { + err = errnoErr(e1) + } 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) +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 { + err = errnoErr(e1) } 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) +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 @@ -278,33 +267,52 @@ func CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags u return } -func CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) { - var _p0 *uint16 - _p0, hr = syscall.UTF16PtrFromString(pDeviceID) - if hr != nil { - 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 { + err = errnoErr(e1) } - return _CMLocateDevNode(pdnDevInst, _p0, uFlags) + return } -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) +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 { + err = errnoErr(e1) } 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) +func netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) { + r0, _, _ := syscall.Syscall6(procNetLocalGroupAddMembers.Addr(), 5, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(totalEntries), 0) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) { + r0, _, _ := syscall.Syscall6(procNetLocalGroupGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(bufptr)), 0, 0) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) { + r0, _, _ := syscall.Syscall6(procNetUserAdd.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(parm_err)), 0, 0) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func netUserDel(serverName *uint16, username *uint16) (status error) { + r0, _, _ := syscall.Syscall(procNetUserDel.Addr(), 2, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(username)), 0) + if r0 != 0 { + status = syscall.Errno(r0) } return } @@ -315,8 +323,8 @@ func NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb 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) +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 } @@ -327,24 +335,44 @@ func NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttribu 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 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 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 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 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 RtlNtStatusToDosError(status uint32) (winerr error) { r0, _, _ := syscall.Syscall(procRtlNtStatusToDosError.Addr(), 1, uintptr(status), 0, 0) if r0 != 0 { @@ -352,3 +380,36 @@ func RtlNtStatusToDosError(status uint32) (winerr error) { } return } + +func ORCloseHive(key syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procORCloseHive.Addr(), 1, uintptr(key), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func ORCreateHive(key *syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procORCreateHive.Addr(), 1, uintptr(unsafe.Pointer(key)), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func ORSaveHive(key syscall.Handle, file string, OsMajorVersion uint32, OsMinorVersion uint32) (regerrno error) { + var _p0 *uint16 + _p0, regerrno = syscall.UTF16PtrFromString(file) + if regerrno != nil { + return + } + return _ORSaveHive(key, _p0, OsMajorVersion, OsMinorVersion) +} + +func _ORSaveHive(key syscall.Handle, file *uint16, OsMajorVersion uint32, OsMinorVersion uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procORSaveHive.Addr(), 4, uintptr(key), uintptr(unsafe.Pointer(file)), uintptr(OsMajorVersion), uintptr(OsMinorVersion), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/layer.go b/tools/vendor/github.com/Microsoft/hcsshim/layer.go index 891616370..afd1ddd0a 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/layer.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/layer.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( @@ -68,6 +70,9 @@ func ProcessUtilityVMImage(path string) error { func UnprepareLayer(info DriverInfo, layerId string) error { return wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId)) } +func ConvertToBaseLayer(path string) error { + return wclayer.ConvertToBaseLayer(context.Background(), path) +} type DriverInfo struct { Flavour int diff --git a/tools/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go index 3ab3bcd89..6c435d2b6 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go @@ -45,6 +45,15 @@ func Build() uint16 { return Get().Build } -func (osv OSVersion) ToString() string { +// String returns the OSVersion formatted as a string. It implements the +// [fmt.Stringer] interface. +func (osv OSVersion) String() string { return fmt.Sprintf("%d.%d.%d", osv.MajorVersion, osv.MinorVersion, osv.Build) } + +// ToString returns the OSVersion formatted as a string. +// +// Deprecated: use [OSVersion.String]. +func (osv OSVersion) ToString() string { + return osv.String() +} diff --git a/tools/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go b/tools/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go index 75dce5d82..446369591 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go @@ -1,37 +1,63 @@ package osversion +// Windows Client and Server build numbers. +// +// See: +// https://learn.microsoft.com/en-us/windows/release-health/release-information +// https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info +// https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information const ( // RS1 (version 1607, codename "Redstone 1") corresponds to Windows Server // 2016 (ltsc2016) and Windows 10 (Anniversary Update). RS1 = 14393 + // V1607 (version 1607, codename "Redstone 1") is an alias for [RS1]. + V1607 = RS1 + // LTSC2016 (Windows Server 2016) is an alias for [RS1]. + LTSC2016 = RS1 // RS2 (version 1703, codename "Redstone 2") was a client-only update, and // corresponds to Windows 10 (Creators Update). RS2 = 15063 + // V1703 (version 1703, codename "Redstone 2") is an alias for [RS2]. + V1703 = RS2 // RS3 (version 1709, codename "Redstone 3") corresponds to Windows Server // 1709 (Semi-Annual Channel (SAC)), and Windows 10 (Fall Creators Update). RS3 = 16299 + // V1709 (version 1709, codename "Redstone 3") is an alias for [RS3]. + V1709 = RS3 // RS4 (version 1803, codename "Redstone 4") corresponds to Windows Server // 1803 (Semi-Annual Channel (SAC)), and Windows 10 (April 2018 Update). RS4 = 17134 + // V1803 (version 1803, codename "Redstone 4") is an alias for [RS4]. + V1803 = RS4 // RS5 (version 1809, codename "Redstone 5") corresponds to Windows Server // 2019 (ltsc2019), and Windows 10 (October 2018 Update). RS5 = 17763 + // V1809 (version 1809, codename "Redstone 5") is an alias for [RS5]. + V1809 = RS5 + // LTSC2019 (Windows Server 2019) is an alias for [RS5]. + LTSC2019 = RS5 - // V19H1 (version 1903) corresponds to Windows Server 1903 (semi-annual + // V19H1 (version 1903, codename 19H1) corresponds to Windows Server 1903 (semi-annual // channel). V19H1 = 18362 + // V1903 (version 1903) is an alias for [V19H1]. + V1903 = V19H1 - // V19H2 (version 1909) corresponds to Windows Server 1909 (semi-annual + // V19H2 (version 1909, codename 19H2) corresponds to Windows Server 1909 (semi-annual // channel). V19H2 = 18363 + // V1909 (version 1909) is an alias for [V19H2]. + V1909 = V19H2 - // V20H1 (version 2004) corresponds to Windows Server 2004 (semi-annual + // V20H1 (version 2004, codename 20H1) corresponds to Windows Server 2004 (semi-annual // channel). V20H1 = 19041 + // V2004 (version 2004) is an alias for [V20H1]. + V2004 = V20H1 // V20H2 corresponds to Windows Server 20H2 (semi-annual channel). V20H2 = 19042 @@ -44,7 +70,15 @@ const ( // V21H2Server corresponds to Windows Server 2022 (ltsc2022). V21H2Server = 20348 + // LTSC2022 (Windows Server 2022) is an alias for [V21H2Server] + LTSC2022 = V21H2Server // V21H2Win11 corresponds to Windows 11 (original release). V21H2Win11 = 22000 + + // V22H2Win10 corresponds to Windows 10 (2022 Update). + V22H2Win10 = 19045 + + // V22H2Win11 corresponds to Windows 11 (2022 Update). + V22H2Win11 = 22621 ) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go new file mode 100644 index 000000000..0ec1aa05c --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go @@ -0,0 +1,3 @@ +// Package ociwclayer provides functions for importing and exporting Windows +// container layers from and to their OCI tar representation. +package ociwclayer diff --git a/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go index e3f1be333..1c2c82c70 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go @@ -1,5 +1,5 @@ -// Package ociwclayer provides functions for importing and exporting Windows -// container layers from and to their OCI tar representation. +//go:build windows + package ociwclayer import ( @@ -9,11 +9,9 @@ import ( "path/filepath" "github.com/Microsoft/go-winio/backuptar" - "github.com/Microsoft/hcsshim" + "github.com/Microsoft/hcsshim/internal/wclayer" ) -var driverInfo = hcsshim.DriverInfo{} - // ExportLayerToTar writes an OCI layer tar stream from the provided on-disk layer. // The caller must specify the parent layers, if any, ordered from lowest to // highest layer. @@ -21,25 +19,25 @@ var driverInfo = hcsshim.DriverInfo{} // The layer will be mounted for this process, so the caller should ensure that // it is not currently mounted. func ExportLayerToTar(ctx context.Context, w io.Writer, path string, parentLayerPaths []string) error { - err := hcsshim.ActivateLayer(driverInfo, path) + err := wclayer.ActivateLayer(ctx, path) if err != nil { return err } defer func() { - _ = hcsshim.DeactivateLayer(driverInfo, path) + _ = wclayer.DeactivateLayer(ctx, path) }() // Prepare and unprepare the layer to ensure that it has been initialized. - err = hcsshim.PrepareLayer(driverInfo, path, parentLayerPaths) + err = wclayer.PrepareLayer(ctx, path, parentLayerPaths) if err != nil { return err } - err = hcsshim.UnprepareLayer(driverInfo, path) + err = wclayer.UnprepareLayer(ctx, path) if err != nil { return err } - r, err := hcsshim.NewLayerReader(driverInfo, path, parentLayerPaths) + r, err := wclayer.NewLayerReader(ctx, path, parentLayerPaths) if err != nil { return err } @@ -52,7 +50,9 @@ func ExportLayerToTar(ctx context.Context, w io.Writer, path string, parentLayer return cerr } -func writeTarFromLayer(ctx context.Context, r hcsshim.LayerReader, w io.Writer) error { +func writeTarFromLayer(ctx context.Context, r wclayer.LayerReader, w io.Writer) error { + linkRecords := make(map[[16]byte]string) + t := tar.NewWriter(w) for { select { @@ -78,6 +78,27 @@ func writeTarFromLayer(ctx context.Context, r hcsshim.LayerReader, w io.Writer) return err } } else { + numberOfLinks, fileIDInfo, err := r.LinkInfo() + if err != nil { + return err + } + if numberOfLinks > 1 { + if linkName, ok := linkRecords[fileIDInfo.FileID]; ok { + // We've seen this file before, by another name, so put a hardlink in the tar stream. + hdr := backuptar.BasicInfoHeader(name, 0, fileInfo) + hdr.Mode = 0644 + hdr.Typeflag = tar.TypeLink + hdr.Linkname = linkName + if err := t.WriteHeader(hdr); err != nil { + return err + } + continue + } + + // All subsequent names for this file will be hard-linked to this name + linkRecords[fileIDInfo.FileID] = filepath.ToSlash(name) + } + err = backuptar.WriteTarFileFromBackupStream(t, r, name, size, fileInfo) if err != nil { return err diff --git a/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go index e74a6b594..c9fb6df27 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go @@ -1,3 +1,5 @@ +//go:build windows + package ociwclayer import ( @@ -12,7 +14,7 @@ import ( winio "github.com/Microsoft/go-winio" "github.com/Microsoft/go-winio/backuptar" - "github.com/Microsoft/hcsshim" + "github.com/Microsoft/hcsshim/internal/wclayer" ) const whiteoutPrefix = ".wh." @@ -41,7 +43,7 @@ func ImportLayerFromTar(ctx context.Context, r io.Reader, path string, parentLay if err != nil { return 0, err } - w, err := hcsshim.NewLayerWriter(hcsshim.DriverInfo{}, path, parentLayerPaths) + w, err := wclayer.NewLayerWriter(ctx, path, parentLayerPaths) if err != nil { return 0, err } @@ -56,7 +58,7 @@ func ImportLayerFromTar(ctx context.Context, r io.Reader, path string, parentLay return n, nil } -func writeLayerFromTar(ctx context.Context, r io.Reader, w hcsshim.LayerWriter, root string) (int64, error) { +func writeLayerFromTar(ctx context.Context, r io.Reader, w wclayer.LayerWriter, root string) (int64, error) { t := tar.NewReader(r) hdr, err := t.Next() totalSize := int64(0) diff --git a/tools/vendor/github.com/Microsoft/hcsshim/process.go b/tools/vendor/github.com/Microsoft/hcsshim/process.go index 3362c6833..44df91cde 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/process.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/process.go @@ -1,3 +1,5 @@ +//go:build windows + package hcsshim import ( diff --git a/tools/vendor/github.com/Microsoft/hcsshim/tools.go b/tools/vendor/github.com/Microsoft/hcsshim/tools.go new file mode 100644 index 000000000..3964e2f02 --- /dev/null +++ b/tools/vendor/github.com/Microsoft/hcsshim/tools.go @@ -0,0 +1,5 @@ +//go:build tools + +package hcsshim + +import _ "github.com/Microsoft/go-winio/tools/mkwinsyscall" diff --git a/tools/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go b/tools/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go index 8bed84857..9b619b6e6 100644 --- a/tools/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go +++ b/tools/vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go @@ -1,4 +1,6 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT +//go:build windows + +// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package hcsshim @@ -19,6 +21,7 @@ const ( var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent @@ -26,7 +29,7 @@ var ( func errnoErr(e syscall.Errno) error { switch e { case 0: - return nil + return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/LICENSE b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/LICENSE similarity index 100% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/LICENSE rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/LICENSE diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go new file mode 100644 index 000000000..ab5121267 --- /dev/null +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go @@ -0,0 +1,68 @@ +/* +Package antlr implements the Go version of the ANTLR 4 runtime. + +# The ANTLR Tool + +ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, +or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. +From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface +(or visitor) that makes it easy to respond to the recognition of phrases of interest. + +# Code Generation + +ANTLR supports the generation of code in a number of [target languages], and the generated code is supported by a +runtime library, written specifically to support the generated code in the target language. This library is the +runtime for the Go target. + +To generate code for the go target, it is generally recommended to place the source grammar files in a package of +their own, and use the `.sh` script method of generating code, using the go generate directive. In that same directory +it is usual, though not required, to place the antlr tool that should be used to generate the code. That does mean +that the antlr tool JAR file will be checked in to your source code control though, so you are free to use any other +way of specifying the version of the ANTLR tool to use, such as aliasing in `.zshrc` or equivalent, or a profile in +your IDE, or configuration in your CI system. + +Here is a general template for an ANTLR based recognizer in Go: + + . + ├── myproject + ├── parser + │ ├── mygrammar.g4 + │ ├── antlr-4.12.0-complete.jar + │ ├── error_listeners.go + │ ├── generate.go + │ ├── generate.sh + ├── go.mod + ├── go.sum + ├── main.go + └── main_test.go + +Make sure that the package statement in your grammar file(s) reflects the go package they exist in. +The generate.go file then looks like this: + + package parser + + //go:generate ./generate.sh + +And the generate.sh file will look similar to this: + + #!/bin/sh + + alias antlr4='java -Xmx500M -cp "./antlr4-4.12.0-complete.jar:$CLASSPATH" org.antlr.v4.Tool' + antlr4 -Dlanguage=Go -no-visitor -package parser *.g4 + +depending on whether you want visitors or listeners or any other ANTLR options. + +From the command line at the root of your package “myproject†you can then simply issue the command: + + go generate ./... + +# Copyright Notice + +Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. + +Use of this file is governed by the BSD 3-clause license, which can be found in the [LICENSE.txt] file in the project root. + +[target languages]: https://github.com/antlr/antlr4/tree/master/runtime +[LICENSE.txt]: https://github.com/antlr/antlr4/blob/master/LICENSE.txt +*/ +package antlr diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go similarity index 72% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go index a4e2079e6..98010d2e6 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -6,11 +6,24 @@ package antlr import "sync" +// ATNInvalidAltNumber is used to represent an ALT number that has yet to be calculated or +// which is invalid for a particular struct such as [*antlr.BaseRuleContext] var ATNInvalidAltNumber int +// ATN represents an “[Augmented Transition Network]â€, though general in ANTLR the term +// “Augmented Recursive Transition Network†though there are some descriptions of “[Recursive Transition Network]†+// in existence. +// +// ATNs represent the main networks in the system and are serialized by the code generator and support [ALL(*)]. +// +// [Augmented Transition Network]: https://en.wikipedia.org/wiki/Augmented_transition_network +// [ALL(*)]: https://www.antlr.org/papers/allstar-techreport.pdf +// [Recursive Transition Network]: https://en.wikipedia.org/wiki/Recursive_transition_network type ATN struct { // DecisionToState is the decision points for all rules, subrules, optional - // blocks, ()+, ()*, etc. Used to build DFA predictors for them. + // blocks, ()+, ()*, etc. Each subrule/rule is a decision point, and we must track them so we + // can go back later and build DFA predictors for them. This includes + // all the rules, subrules, optional blocks, ()+, ()* etc... DecisionToState []DecisionState // grammarType is the ATN type and is used for deserializing ATNs from strings. @@ -45,6 +58,8 @@ type ATN struct { edgeMu sync.RWMutex } +// NewATN returns a new ATN struct representing the given grammarType and is used +// for runtime deserialization of ATNs from the code generated by the ANTLR tool func NewATN(grammarType int, maxTokenType int) *ATN { return &ATN{ grammarType: grammarType, @@ -53,7 +68,7 @@ func NewATN(grammarType int, maxTokenType int) *ATN { } } -// NextTokensInContext computes the set of valid tokens that can occur starting +// NextTokensInContext computes and returns the set of valid tokens that can occur starting // in state s. If ctx is nil, the set of tokens will not include what can follow // the rule surrounding s. In other words, the set will be restricted to tokens // reachable staying within the rule of s. @@ -61,8 +76,8 @@ func (a *ATN) NextTokensInContext(s ATNState, ctx RuleContext) *IntervalSet { return NewLL1Analyzer(a).Look(s, nil, ctx) } -// NextTokensNoContext computes the set of valid tokens that can occur starting -// in s and staying in same rule. Token.EPSILON is in set if we reach end of +// NextTokensNoContext computes and returns the set of valid tokens that can occur starting +// in state s and staying in same rule. [antlr.Token.EPSILON] is in set if we reach end of // rule. func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet { a.mu.Lock() @@ -76,6 +91,8 @@ func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet { return iset } +// NextTokens computes and returns the set of valid tokens starting in state s, by +// calling either [NextTokensNoContext] (ctx == nil) or [NextTokensInContext] (ctx != nil). func (a *ATN) NextTokens(s ATNState, ctx RuleContext) *IntervalSet { if ctx == nil { return a.NextTokensNoContext(s) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go similarity index 84% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go index 97ba417f7..7619fa172 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -8,19 +8,14 @@ import ( "fmt" ) -type comparable interface { - equals(other interface{}) bool -} - // ATNConfig is a tuple: (ATN state, predicted alt, syntactic, semantic // context). The syntactic context is a graph-structured stack node whose // path(s) to the root is the rule invocation(s) chain used to arrive at the // state. The semantic context is the tree of semantic predicates encountered // before reaching an ATN state. type ATNConfig interface { - comparable - - hash() int + Equals(o Collectable[ATNConfig]) bool + Hash() int GetState() ATNState GetAlt() int @@ -47,7 +42,7 @@ type BaseATNConfig struct { reachesIntoOuterContext int } -func NewBaseATNConfig7(old *BaseATNConfig) *BaseATNConfig { // TODO: Dup +func NewBaseATNConfig7(old *BaseATNConfig) ATNConfig { // TODO: Dup return &BaseATNConfig{ state: old.state, alt: old.alt, @@ -135,11 +130,16 @@ func (b *BaseATNConfig) SetReachesIntoOuterContext(v int) { b.reachesIntoOuterContext = v } +// Equals is the default comparison function for an ATNConfig when no specialist implementation is required +// for a collection. +// // An ATN configuration is equal to another if both have the same state, they // predict the same alternative, and syntactic/semantic contexts are the same. -func (b *BaseATNConfig) equals(o interface{}) bool { +func (b *BaseATNConfig) Equals(o Collectable[ATNConfig]) bool { if b == o { return true + } else if o == nil { + return false } var other, ok = o.(*BaseATNConfig) @@ -153,30 +153,32 @@ func (b *BaseATNConfig) equals(o interface{}) bool { if b.context == nil { equal = other.context == nil } else { - equal = b.context.equals(other.context) + equal = b.context.Equals(other.context) } var ( nums = b.state.GetStateNumber() == other.state.GetStateNumber() alts = b.alt == other.alt - cons = b.semanticContext.equals(other.semanticContext) + cons = b.semanticContext.Equals(other.semanticContext) sups = b.precedenceFilterSuppressed == other.precedenceFilterSuppressed ) return nums && alts && cons && sups && equal } -func (b *BaseATNConfig) hash() int { +// Hash is the default hash function for BaseATNConfig, when no specialist hash function +// is required for a collection +func (b *BaseATNConfig) Hash() int { var c int if b.context != nil { - c = b.context.hash() + c = b.context.Hash() } h := murmurInit(7) h = murmurUpdate(h, b.state.GetStateNumber()) h = murmurUpdate(h, b.alt) h = murmurUpdate(h, c) - h = murmurUpdate(h, b.semanticContext.hash()) + h = murmurUpdate(h, b.semanticContext.Hash()) return murmurFinish(h, 4) } @@ -243,7 +245,9 @@ func NewLexerATNConfig1(state ATNState, alt int, context PredictionContext) *Lex return &LexerATNConfig{BaseATNConfig: NewBaseATNConfig5(state, alt, context, SemanticContextNone)} } -func (l *LexerATNConfig) hash() int { +// Hash is the default hash function for LexerATNConfig objects, it can be used directly or via +// the default comparator [ObjEqComparator]. +func (l *LexerATNConfig) Hash() int { var f int if l.passedThroughNonGreedyDecision { f = 1 @@ -253,15 +257,20 @@ func (l *LexerATNConfig) hash() int { h := murmurInit(7) h = murmurUpdate(h, l.state.GetStateNumber()) h = murmurUpdate(h, l.alt) - h = murmurUpdate(h, l.context.hash()) - h = murmurUpdate(h, l.semanticContext.hash()) + h = murmurUpdate(h, l.context.Hash()) + h = murmurUpdate(h, l.semanticContext.Hash()) h = murmurUpdate(h, f) - h = murmurUpdate(h, l.lexerActionExecutor.hash()) + h = murmurUpdate(h, l.lexerActionExecutor.Hash()) h = murmurFinish(h, 6) return h } -func (l *LexerATNConfig) equals(other interface{}) bool { +// Equals is the default comparison function for LexerATNConfig objects, it can be used directly or via +// the default comparator [ObjEqComparator]. +func (l *LexerATNConfig) Equals(other Collectable[ATNConfig]) bool { + if l == other { + return true + } var othert, ok = other.(*LexerATNConfig) if l == other { @@ -275,7 +284,7 @@ func (l *LexerATNConfig) equals(other interface{}) bool { var b bool if l.lexerActionExecutor != nil { - b = !l.lexerActionExecutor.equals(othert.lexerActionExecutor) + b = !l.lexerActionExecutor.Equals(othert.lexerActionExecutor) } else { b = othert.lexerActionExecutor != nil } @@ -284,10 +293,9 @@ func (l *LexerATNConfig) equals(other interface{}) bool { return false } - return l.BaseATNConfig.equals(othert.BaseATNConfig) + return l.BaseATNConfig.Equals(othert.BaseATNConfig) } - func checkNonGreedyDecision(source *LexerATNConfig, target ATNState) bool { var ds, ok = target.(DecisionState) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go similarity index 81% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go index 49ad4a719..43e9b33f3 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go @@ -1,24 +1,25 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. package antlr -import "fmt" +import ( + "fmt" +) type ATNConfigSet interface { - hash() int + Hash() int + Equals(o Collectable[ATNConfig]) bool Add(ATNConfig, *DoubleDict) bool AddAll([]ATNConfig) bool - GetStates() Set + GetStates() *JStore[ATNState, Comparator[ATNState]] GetPredicates() []SemanticContext GetItems() []ATNConfig OptimizeConfigs(interpreter *BaseATNSimulator) - Equals(other interface{}) bool - Length() int IsEmpty() bool Contains(ATNConfig) bool @@ -57,7 +58,7 @@ type BaseATNConfigSet struct { // effectively doubles the number of objects associated with ATNConfigs. All // keys are hashed by (s, i, _, pi), not including the context. Wiped out when // read-only because a set becomes a DFA state. - configLookup Set + configLookup *JStore[ATNConfig, Comparator[ATNConfig]] // configs is the added elements. configs []ATNConfig @@ -83,7 +84,7 @@ type BaseATNConfigSet struct { // readOnly is whether it is read-only. Do not // allow any code to manipulate the set if true because DFA states will point at - // sets and those must not change. It not protect other fields; conflictingAlts + // sets and those must not change. It not, protect other fields; conflictingAlts // in particular, which is assigned after readOnly. readOnly bool @@ -104,7 +105,7 @@ func (b *BaseATNConfigSet) Alts() *BitSet { func NewBaseATNConfigSet(fullCtx bool) *BaseATNConfigSet { return &BaseATNConfigSet{ cachedHash: -1, - configLookup: newArray2DHashSetWithCap(hashATNConfig, equalATNConfigs, 16, 2), + configLookup: NewJStore[ATNConfig, Comparator[ATNConfig]](aConfCompInst), fullCtx: fullCtx, } } @@ -126,9 +127,11 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool { b.dipsIntoOuterContext = true } - existing := b.configLookup.Add(config).(ATNConfig) + existing, present := b.configLookup.Put(config) - if existing == config { + // The config was not already in the set + // + if !present { b.cachedHash = -1 b.configs = append(b.configs, config) // Track order here return true @@ -154,11 +157,14 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool { return true } -func (b *BaseATNConfigSet) GetStates() Set { - states := newArray2DHashSet(nil, nil) +func (b *BaseATNConfigSet) GetStates() *JStore[ATNState, Comparator[ATNState]] { + + // states uses the standard comparator provided by the ATNState instance + // + states := NewJStore[ATNState, Comparator[ATNState]](aStateEqInst) for i := 0; i < len(b.configs); i++ { - states.Add(b.configs[i].GetState()) + states.Put(b.configs[i].GetState()) } return states @@ -214,7 +220,34 @@ func (b *BaseATNConfigSet) AddAll(coll []ATNConfig) bool { return false } -func (b *BaseATNConfigSet) Equals(other interface{}) bool { +// Compare is a hack function just to verify that adding DFAstares to the known +// set works, so long as comparison of ATNConfigSet s works. For that to work, we +// need to make sure that the set of ATNConfigs in two sets are equivalent. We can't +// know the order, so we do this inefficient hack. If this proves the point, then +// we can change the config set to a better structure. +func (b *BaseATNConfigSet) Compare(bs *BaseATNConfigSet) bool { + if len(b.configs) != len(bs.configs) { + return false + } + + for _, c := range b.configs { + found := false + for _, c2 := range bs.configs { + if c.Equals(c2) { + found = true + break + } + } + + if !found { + return false + } + + } + return true +} + +func (b *BaseATNConfigSet) Equals(other Collectable[ATNConfig]) bool { if b == other { return true } else if _, ok := other.(*BaseATNConfigSet); !ok { @@ -224,15 +257,15 @@ func (b *BaseATNConfigSet) Equals(other interface{}) bool { other2 := other.(*BaseATNConfigSet) return b.configs != nil && - // TODO: b.configs.equals(other2.configs) && // TODO: Is b necessary? b.fullCtx == other2.fullCtx && b.uniqueAlt == other2.uniqueAlt && b.conflictingAlts == other2.conflictingAlts && b.hasSemanticContext == other2.hasSemanticContext && - b.dipsIntoOuterContext == other2.dipsIntoOuterContext + b.dipsIntoOuterContext == other2.dipsIntoOuterContext && + b.Compare(other2) } -func (b *BaseATNConfigSet) hash() int { +func (b *BaseATNConfigSet) Hash() int { if b.readOnly { if b.cachedHash == -1 { b.cachedHash = b.hashCodeConfigs() @@ -247,7 +280,7 @@ func (b *BaseATNConfigSet) hash() int { func (b *BaseATNConfigSet) hashCodeConfigs() int { h := 1 for _, config := range b.configs { - h = 31*h + config.hash() + h = 31*h + config.Hash() } return h } @@ -283,7 +316,7 @@ func (b *BaseATNConfigSet) Clear() { b.configs = make([]ATNConfig, 0) b.cachedHash = -1 - b.configLookup = newArray2DHashSet(nil, equalATNConfigs) + b.configLookup = NewJStore[ATNConfig, Comparator[ATNConfig]](atnConfCompInst) } func (b *BaseATNConfigSet) FullContext() bool { @@ -365,7 +398,8 @@ type OrderedATNConfigSet struct { func NewOrderedATNConfigSet() *OrderedATNConfigSet { b := NewBaseATNConfigSet(false) - b.configLookup = newArray2DHashSet(nil, nil) + // This set uses the standard Hash() and Equals() from ATNConfig + b.configLookup = NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst) return &OrderedATNConfigSet{BaseATNConfigSet: b} } @@ -375,7 +409,7 @@ func hashATNConfig(i interface{}) int { hash := 7 hash = 31*hash + o.GetState().GetStateNumber() hash = 31*hash + o.GetAlt() - hash = 31*hash + o.GetSemanticContext().hash() + hash = 31*hash + o.GetSemanticContext().Hash() return hash } @@ -403,5 +437,5 @@ func equalATNConfigs(a, b interface{}) bool { return false } - return ai.GetSemanticContext().equals(bi.GetSemanticContext()) + return ai.GetSemanticContext().Equals(bi.GetSemanticContext()) } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go similarity index 96% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go index cb8eafb0b..3c975ec7b 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go similarity index 99% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go index aea9bbfa9..3888856b4 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go similarity index 94% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go index d5454d6d5..41529115f 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go similarity index 97% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go index 3835bb2e9..1f2a56bc3 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -49,7 +49,8 @@ type ATNState interface { AddTransition(Transition, int) String() string - hash() int + Hash() int + Equals(Collectable[ATNState]) bool } type BaseATNState struct { @@ -123,7 +124,7 @@ func (as *BaseATNState) SetNextTokenWithinRule(v *IntervalSet) { as.NextTokenWithinRule = v } -func (as *BaseATNState) hash() int { +func (as *BaseATNState) Hash() int { return as.stateNumber } @@ -131,7 +132,7 @@ func (as *BaseATNState) String() string { return strconv.Itoa(as.stateNumber) } -func (as *BaseATNState) equals(other interface{}) bool { +func (as *BaseATNState) Equals(other Collectable[ATNState]) bool { if ot, ok := other.(ATNState); ok { return as.stateNumber == ot.GetStateNumber() } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go similarity index 79% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go index a7b48976b..3a515a145 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go similarity index 82% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go index 70c1207f7..c33f0adb5 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go similarity index 96% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go index 330ff8f31..1bb0314ea 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go index c90e9b890..c6c9485a2 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -331,10 +331,12 @@ func (c *CommonTokenStream) GetTextFromRuleContext(interval RuleContext) string func (c *CommonTokenStream) GetTextFromInterval(interval *Interval) string { c.lazyInit() - c.Fill() if interval == nil { + c.Fill() interval = NewInterval(0, len(c.tokens)-1) + } else { + c.Sync(interval.Stop) } start := interval.Start diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go new file mode 100644 index 000000000..9ea320053 --- /dev/null +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go @@ -0,0 +1,147 @@ +package antlr + +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. +// Use of this file is governed by the BSD 3-clause license that +// can be found in the LICENSE.txt file in the project root. + +// This file contains all the implementations of custom comparators used for generic collections when the +// Hash() and Equals() funcs supplied by the struct objects themselves need to be overridden. Normally, we would +// put the comparators in the source file for the struct themselves, but given the organization of this code is +// sorta kinda based upon the Java code, I found it confusing trying to find out which comparator was where and used by +// which instantiation of a collection. For instance, an Array2DHashSet in the Java source, when used with ATNConfig +// collections requires three different comparators depending on what the collection is being used for. Collecting - pun intended - +// all the comparators here, makes it much easier to see which implementation of hash and equals is used by which collection. +// It also makes it easy to verify that the Hash() and Equals() functions marry up with the Java implementations. + +// ObjEqComparator is the equivalent of the Java ObjectEqualityComparator, which is the default instance of +// Equality comparator. We do not have inheritance in Go, only interfaces, so we use generics to enforce some +// type safety and avoid having to implement this for every type that we want to perform comparison on. +// +// This comparator works by using the standard Hash() and Equals() methods of the type T that is being compared. Which +// allows us to use it in any collection instance that does nto require a special hash or equals implementation. +type ObjEqComparator[T Collectable[T]] struct{} + +var ( + aStateEqInst = &ObjEqComparator[ATNState]{} + aConfEqInst = &ObjEqComparator[ATNConfig]{} + aConfCompInst = &ATNConfigComparator[ATNConfig]{} + atnConfCompInst = &BaseATNConfigComparator[ATNConfig]{} + dfaStateEqInst = &ObjEqComparator[*DFAState]{} + semctxEqInst = &ObjEqComparator[SemanticContext]{} + atnAltCfgEqInst = &ATNAltConfigComparator[ATNConfig]{} +) + +// Equals2 delegates to the Equals() method of type T +func (c *ObjEqComparator[T]) Equals2(o1, o2 T) bool { + return o1.Equals(o2) +} + +// Hash1 delegates to the Hash() method of type T +func (c *ObjEqComparator[T]) Hash1(o T) int { + + return o.Hash() +} + +type SemCComparator[T Collectable[T]] struct{} + +// ATNConfigComparator is used as the compartor for the configLookup field of an ATNConfigSet +// and has a custom Equals() and Hash() implementation, because equality is not based on the +// standard Hash() and Equals() methods of the ATNConfig type. +type ATNConfigComparator[T Collectable[T]] struct { +} + +// Equals2 is a custom comparator for ATNConfigs specifically for configLookup +func (c *ATNConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool { + + // Same pointer, must be equal, even if both nil + // + if o1 == o2 { + return true + + } + + // If either are nil, but not both, then the result is false + // + if o1 == nil || o2 == nil { + return false + } + + return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() && + o1.GetAlt() == o2.GetAlt() && + o1.GetSemanticContext().Equals(o2.GetSemanticContext()) +} + +// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup +func (c *ATNConfigComparator[T]) Hash1(o ATNConfig) int { + hash := 7 + hash = 31*hash + o.GetState().GetStateNumber() + hash = 31*hash + o.GetAlt() + hash = 31*hash + o.GetSemanticContext().Hash() + return hash +} + +// ATNAltConfigComparator is used as the comparator for mapping configs to Alt Bitsets +type ATNAltConfigComparator[T Collectable[T]] struct { +} + +// Equals2 is a custom comparator for ATNConfigs specifically for configLookup +func (c *ATNAltConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool { + + // Same pointer, must be equal, even if both nil + // + if o1 == o2 { + return true + + } + + // If either are nil, but not both, then the result is false + // + if o1 == nil || o2 == nil { + return false + } + + return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() && + o1.GetContext().Equals(o2.GetContext()) +} + +// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup +func (c *ATNAltConfigComparator[T]) Hash1(o ATNConfig) int { + h := murmurInit(7) + h = murmurUpdate(h, o.GetState().GetStateNumber()) + h = murmurUpdate(h, o.GetContext().Hash()) + return murmurFinish(h, 2) +} + +// BaseATNConfigComparator is used as the comparator for the configLookup field of a BaseATNConfigSet +// and has a custom Equals() and Hash() implementation, because equality is not based on the +// standard Hash() and Equals() methods of the ATNConfig type. +type BaseATNConfigComparator[T Collectable[T]] struct { +} + +// Equals2 is a custom comparator for ATNConfigs specifically for baseATNConfigSet +func (c *BaseATNConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool { + + // Same pointer, must be equal, even if both nil + // + if o1 == o2 { + return true + + } + + // If either are nil, but not both, then the result is false + // + if o1 == nil || o2 == nil { + return false + } + + return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() && + o1.GetAlt() == o2.GetAlt() && + o1.GetSemanticContext().Equals(o2.GetSemanticContext()) +} + +// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup, but in fact just +// delegates to the standard Hash() method of the ATNConfig type. +func (c *BaseATNConfigComparator[T]) Hash1(o ATNConfig) int { + + return o.Hash() +} diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go similarity index 80% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go index d55a2a87d..bfd43e1f7 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go @@ -1,13 +1,9 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. package antlr -import ( - "sort" -) - type DFA struct { // atnStartState is the ATN state in which this was created atnStartState DecisionState @@ -15,8 +11,15 @@ type DFA struct { decision int // states is all the DFA states. Use Map to get the old state back; Set can only - // indicate whether it is there. - states map[int]*DFAState + // indicate whether it is there. Go maps implement key hash collisions and so on and are very + // good, but the DFAState is an object and can't be used directly as the key as it can in say JAva + // amd C#, whereby if the hashcode is the same for two objects, then Equals() is called against them + // to see if they really are the same object. + // + // + states *JStore[*DFAState, *ObjEqComparator[*DFAState]] + + numstates int s0 *DFAState @@ -29,7 +32,7 @@ func NewDFA(atnStartState DecisionState, decision int) *DFA { dfa := &DFA{ atnStartState: atnStartState, decision: decision, - states: make(map[int]*DFAState), + states: NewJStore[*DFAState, *ObjEqComparator[*DFAState]](dfaStateEqInst), } if s, ok := atnStartState.(*StarLoopEntryState); ok && s.precedenceRuleDecision { dfa.precedenceDfa = true @@ -92,7 +95,8 @@ func (d *DFA) getPrecedenceDfa() bool { // true or nil otherwise, and d.precedenceDfa is updated. func (d *DFA) setPrecedenceDfa(precedenceDfa bool) { if d.getPrecedenceDfa() != precedenceDfa { - d.setStates(make(map[int]*DFAState)) + d.states = NewJStore[*DFAState, *ObjEqComparator[*DFAState]](dfaStateEqInst) + d.numstates = 0 if precedenceDfa { precedenceState := NewDFAState(-1, NewBaseATNConfigSet(false)) @@ -117,38 +121,12 @@ func (d *DFA) setS0(s *DFAState) { d.s0 = s } -func (d *DFA) getState(hash int) (*DFAState, bool) { - s, ok := d.states[hash] - return s, ok -} - -func (d *DFA) setStates(states map[int]*DFAState) { - d.states = states -} - -func (d *DFA) setState(hash int, state *DFAState) { - d.states[hash] = state -} - -func (d *DFA) numStates() int { - return len(d.states) -} - -type dfaStateList []*DFAState - -func (d dfaStateList) Len() int { return len(d) } -func (d dfaStateList) Less(i, j int) bool { return d[i].stateNumber < d[j].stateNumber } -func (d dfaStateList) Swap(i, j int) { d[i], d[j] = d[j], d[i] } - // sortedStates returns the states in d sorted by their state number. func (d *DFA) sortedStates() []*DFAState { - vs := make([]*DFAState, 0, len(d.states)) - - for _, v := range d.states { - vs = append(vs, v) - } - sort.Sort(dfaStateList(vs)) + vs := d.states.SortedSlice(func(i, j *DFAState) bool { + return i.stateNumber < j.stateNumber + }) return vs } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go similarity index 97% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go index bf2ccc06c..84d0a31e5 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go similarity index 90% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go index 970ed1986..c90dec55c 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -90,16 +90,16 @@ func NewDFAState(stateNumber int, configs ATNConfigSet) *DFAState { } // GetAltSet gets the set of all alts mentioned by all ATN configurations in d. -func (d *DFAState) GetAltSet() Set { - alts := newArray2DHashSet(nil, nil) +func (d *DFAState) GetAltSet() []int { + var alts []int if d.configs != nil { for _, c := range d.configs.GetItems() { - alts.Add(c.GetAlt()) + alts = append(alts, c.GetAlt()) } } - if alts.Len() == 0 { + if len(alts) == 0 { return nil } @@ -130,27 +130,6 @@ func (d *DFAState) setPrediction(v int) { d.prediction = v } -// equals returns whether d equals other. Two DFAStates are equal if their ATN -// configuration sets are the same. This method is used to see if a state -// already exists. -// -// Because the number of alternatives and number of ATN configurations are -// finite, there is a finite number of DFA states that can be processed. This is -// necessary to show that the algorithm terminates. -// -// Cannot test the DFA state numbers here because in -// ParserATNSimulator.addDFAState we need to know if any other state exists that -// has d exact set of ATN configurations. The stateNumber is irrelevant. -func (d *DFAState) equals(other interface{}) bool { - if d == other { - return true - } else if _, ok := other.(*DFAState); !ok { - return false - } - - return d.configs.Equals(other.(*DFAState).configs) -} - func (d *DFAState) String() string { var s string if d.isAcceptState { @@ -164,8 +143,27 @@ func (d *DFAState) String() string { return fmt.Sprintf("%d:%s%s", d.stateNumber, fmt.Sprint(d.configs), s) } -func (d *DFAState) hash() int { +func (d *DFAState) Hash() int { h := murmurInit(7) - h = murmurUpdate(h, d.configs.hash()) + h = murmurUpdate(h, d.configs.Hash()) return murmurFinish(h, 1) } + +// Equals returns whether d equals other. Two DFAStates are equal if their ATN +// configuration sets are the same. This method is used to see if a state +// already exists. +// +// Because the number of alternatives and number of ATN configurations are +// finite, there is a finite number of DFA states that can be processed. This is +// necessary to show that the algorithm terminates. +// +// Cannot test the DFA state numbers here because in +// ParserATNSimulator.addDFAState we need to know if any other state exists that +// has d exact set of ATN configurations. The stateNumber is irrelevant. +func (d *DFAState) Equals(o Collectable[*DFAState]) bool { + if d == o { + return true + } + + return d.configs.Equals(o.(*DFAState).configs) +} diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go index 1fec43d9d..c55bcc19b 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -87,7 +87,6 @@ func (d *DiagnosticErrorListener) getDecisionDescription(recognizer Parser, dfa return strconv.Itoa(decision) + " (" + ruleName + ")" } -// // Computes the set of conflicting or ambiguous alternatives from a // configuration set, if that information was not already provided by the // parser. @@ -97,7 +96,6 @@ func (d *DiagnosticErrorListener) getDecisionDescription(recognizer Parser, dfa // @param configs The conflicting or ambiguous configuration set. // @return Returns {@code ReportedAlts} if it is not {@code nil}, otherwise // returns the set of alternatives represented in {@code configs}. -// func (d *DiagnosticErrorListener) getConflictingAlts(ReportedAlts *BitSet, set ATNConfigSet) *BitSet { if ReportedAlts != nil { return ReportedAlts diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go index 028e1a9d7..f679f0dcd 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -48,12 +48,9 @@ func NewConsoleErrorListener() *ConsoleErrorListener { return new(ConsoleErrorListener) } -// // Provides a default instance of {@link ConsoleErrorListener}. -// var ConsoleErrorListenerINSTANCE = NewConsoleErrorListener() -// // {@inheritDoc} // //

@@ -64,7 +61,6 @@ var ConsoleErrorListenerINSTANCE = NewConsoleErrorListener() //

 // line line:charPositionInLine msg
 // 
-// func (c *ConsoleErrorListener) SyntaxError(recognizer Recognizer, offendingSymbol interface{}, line, column int, msg string, e RecognitionException) { fmt.Fprintln(os.Stderr, "line "+strconv.Itoa(line)+":"+strconv.Itoa(column)+" "+msg) } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go similarity index 99% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go index c4080dbfd..5c0a637ba 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -23,7 +23,6 @@ type ErrorStrategy interface { // This is the default implementation of {@link ANTLRErrorStrategy} used for // error Reporting and recovery in ANTLR parsers. -// type DefaultErrorStrategy struct { errorRecoveryMode bool lastErrorIndex int @@ -61,12 +60,10 @@ func (d *DefaultErrorStrategy) reset(recognizer Parser) { d.endErrorCondition(recognizer) } -// // This method is called to enter error recovery mode when a recognition // exception is Reported. // // @param recognizer the parser instance -// func (d *DefaultErrorStrategy) beginErrorCondition(recognizer Parser) { d.errorRecoveryMode = true } @@ -75,28 +72,23 @@ func (d *DefaultErrorStrategy) InErrorRecoveryMode(recognizer Parser) bool { return d.errorRecoveryMode } -// // This method is called to leave error recovery mode after recovering from // a recognition exception. // // @param recognizer -// func (d *DefaultErrorStrategy) endErrorCondition(recognizer Parser) { d.errorRecoveryMode = false d.lastErrorStates = nil d.lastErrorIndex = -1 } -// // {@inheritDoc} // //

The default implementation simply calls {@link //endErrorCondition}.

-// func (d *DefaultErrorStrategy) ReportMatch(recognizer Parser) { d.endErrorCondition(recognizer) } -// // {@inheritDoc} // //

The default implementation returns immediately if the handler is already @@ -114,7 +106,6 @@ func (d *DefaultErrorStrategy) ReportMatch(recognizer Parser) { //

  • All other types: calls {@link Parser//NotifyErrorListeners} to Report // the exception
  • // -// func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionException) { // if we've already Reported an error and have not Matched a token // yet successfully, don't Report any errors. @@ -142,7 +133,6 @@ func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionExcep //

    The default implementation reSynchronizes the parser by consuming tokens // until we find one in the reSynchronization set--loosely the set of tokens // that can follow the current rule.

    -// func (d *DefaultErrorStrategy) Recover(recognizer Parser, e RecognitionException) { if d.lastErrorIndex == recognizer.GetInputStream().Index() && @@ -206,7 +196,6 @@ func (d *DefaultErrorStrategy) Recover(recognizer Parser, e RecognitionException // compare token set at the start of the loop and at each iteration. If for // some reason speed is suffering for you, you can turn off d // functionality by simply overriding d method as a blank { }.

    -// func (d *DefaultErrorStrategy) Sync(recognizer Parser) { // If already recovering, don't try to Sync if d.InErrorRecoveryMode(recognizer) { @@ -247,7 +236,6 @@ func (d *DefaultErrorStrategy) Sync(recognizer Parser) { // // @param recognizer the parser instance // @param e the recognition exception -// func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *NoViableAltException) { tokens := recognizer.GetTokenStream() var input string @@ -264,7 +252,6 @@ func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *N recognizer.NotifyErrorListeners(msg, e.offendingToken, e) } -// // This is called by {@link //ReportError} when the exception is an // {@link InputMisMatchException}. // @@ -272,14 +259,12 @@ func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *N // // @param recognizer the parser instance // @param e the recognition exception -// func (this *DefaultErrorStrategy) ReportInputMisMatch(recognizer Parser, e *InputMisMatchException) { msg := "mismatched input " + this.GetTokenErrorDisplay(e.offendingToken) + " expecting " + e.getExpectedTokens().StringVerbose(recognizer.GetLiteralNames(), recognizer.GetSymbolicNames(), false) recognizer.NotifyErrorListeners(msg, e.offendingToken, e) } -// // This is called by {@link //ReportError} when the exception is a // {@link FailedPredicateException}. // @@ -287,7 +272,6 @@ func (this *DefaultErrorStrategy) ReportInputMisMatch(recognizer Parser, e *Inpu // // @param recognizer the parser instance // @param e the recognition exception -// func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *FailedPredicateException) { ruleName := recognizer.GetRuleNames()[recognizer.GetParserRuleContext().GetRuleIndex()] msg := "rule " + ruleName + " " + e.message @@ -310,7 +294,6 @@ func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *Faile // {@link Parser//NotifyErrorListeners}.

    // // @param recognizer the parser instance -// func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) { if d.InErrorRecoveryMode(recognizer) { return @@ -339,7 +322,6 @@ func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) { // {@link Parser//NotifyErrorListeners}.

    // // @param recognizer the parser instance -// func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) { if d.InErrorRecoveryMode(recognizer) { return @@ -392,15 +374,14 @@ func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) { // derivation: // //
    -// => ID '=' '(' INT ')' ('+' atom)* ''
    +// => ID '=' '(' INT ')' ('+' atom)* â€
     // ^
     // 
    // -// The attempt to Match {@code ')'} will fail when it sees {@code ''} and -// call {@link //recoverInline}. To recover, it sees that {@code LA(1)==''} +// The attempt to Match {@code ')'} will fail when it sees {@code â€} and +// call {@link //recoverInline}. To recover, it sees that {@code LA(1)==â€} // is in the set of tokens that can follow the {@code ')'} token reference // in rule {@code atom}. It can assume that you forgot the {@code ')'}. -// func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token { // SINGLE TOKEN DELETION MatchedSymbol := d.SingleTokenDeletion(recognizer) @@ -418,7 +399,6 @@ func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token { panic(NewInputMisMatchException(recognizer)) } -// // This method implements the single-token insertion inline error recovery // strategy. It is called by {@link //recoverInline} if the single-token // deletion strategy fails to recover from the mismatched input. If this @@ -434,7 +414,6 @@ func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token { // @param recognizer the parser instance // @return {@code true} if single-token insertion is a viable recovery // strategy for the current mismatched input, otherwise {@code false} -// func (d *DefaultErrorStrategy) SingleTokenInsertion(recognizer Parser) bool { currentSymbolType := recognizer.GetTokenStream().LA(1) // if current token is consistent with what could come after current @@ -469,7 +448,6 @@ func (d *DefaultErrorStrategy) SingleTokenInsertion(recognizer Parser) bool { // @return the successfully Matched {@link Token} instance if single-token // deletion successfully recovers from the mismatched input, otherwise // {@code nil} -// func (d *DefaultErrorStrategy) SingleTokenDeletion(recognizer Parser) Token { NextTokenType := recognizer.GetTokenStream().LA(2) expecting := d.GetExpectedTokens(recognizer) @@ -507,7 +485,6 @@ func (d *DefaultErrorStrategy) SingleTokenDeletion(recognizer Parser) Token { // a CommonToken of the appropriate type. The text will be the token. // If you change what tokens must be created by the lexer, // override d method to create the appropriate tokens. -// func (d *DefaultErrorStrategy) GetMissingSymbol(recognizer Parser) Token { currentSymbol := recognizer.GetCurrentToken() expecting := d.GetExpectedTokens(recognizer) @@ -546,7 +523,6 @@ func (d *DefaultErrorStrategy) GetExpectedTokens(recognizer Parser) *IntervalSet // the token). This is better than forcing you to override a method in // your token objects because you don't have to go modify your lexer // so that it creates a NewJava type. -// func (d *DefaultErrorStrategy) GetTokenErrorDisplay(t Token) string { if t == nil { return "" @@ -578,7 +554,7 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string { // from within the rule i.e., the FIRST computation done by // ANTLR stops at the end of a rule. // -// EXAMPLE +// # EXAMPLE // // When you find a "no viable alt exception", the input is not // consistent with any of the alternatives for rule r. The best @@ -597,7 +573,6 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string { // c : ID // | INT // -// // At each rule invocation, the set of tokens that could follow // that rule is pushed on a stack. Here are the various // context-sensitive follow sets: @@ -660,7 +635,6 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string { // // Like Grosch I implement context-sensitive FOLLOW sets that are combined // at run-time upon error to avoid overhead during parsing. -// func (d *DefaultErrorStrategy) getErrorRecoverySet(recognizer Parser) *IntervalSet { atn := recognizer.GetInterpreter().atn ctx := recognizer.GetParserRuleContext() @@ -733,7 +707,6 @@ func NewBailErrorStrategy() *BailErrorStrategy { // in a {@link ParseCancellationException} so it is not caught by the // rule func catches. Use {@link Exception//getCause()} to get the // original {@link RecognitionException}. -// func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) { context := recognizer.GetParserRuleContext() for context != nil { @@ -749,7 +722,6 @@ func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) { // Make sure we don't attempt to recover inline if the parser // successfully recovers, it won't panic an exception. -// func (b *BailErrorStrategy) RecoverInline(recognizer Parser) Token { b.Recover(recognizer, NewInputMisMatchException(recognizer)) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go index 2ef74926e..3954c1378 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -74,7 +74,6 @@ func (b *BaseRecognitionException) GetInputStream() IntStream { //

    If the state number is not known, b method returns -1.

    -// // Gets the set of input symbols which could potentially follow the // previously Matched symbol at the time b exception was panicn. // @@ -136,7 +135,6 @@ type NoViableAltException struct { // to take based upon the remaining input. It tracks the starting token // of the offending input and also knows where the parser was // in the various paths when the error. Reported by ReportNoViableAlternative() -// func NewNoViableAltException(recognizer Parser, input TokenStream, startToken Token, offendingToken Token, deadEndConfigs ATNConfigSet, ctx ParserRuleContext) *NoViableAltException { if ctx == nil { @@ -177,7 +175,6 @@ type InputMisMatchException struct { // This signifies any kind of mismatched input exceptions such as // when the current input does not Match the expected token. -// func NewInputMisMatchException(recognizer Parser) *InputMisMatchException { i := new(InputMisMatchException) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go similarity index 92% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go index 842170c08..bd6ad5efe 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go similarity index 96% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go index 5ff270f53..a8b889ced 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go similarity index 82% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go index 438e0ea6e..4778878bd 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go index 1e9393adb..c1e155e81 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -223,6 +223,10 @@ func (i *IntervalSet) StringVerbose(literalNames []string, symbolicNames []strin return i.toIndexString() } +func (i *IntervalSet) GetIntervals() []*Interval { + return i.intervals +} + func (i *IntervalSet) toCharString() string { names := make([]string, len(i.intervals)) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go new file mode 100644 index 000000000..e5a74f0c6 --- /dev/null +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go @@ -0,0 +1,198 @@ +package antlr + +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. +// Use of this file is governed by the BSD 3-clause license that +// can be found in the LICENSE.txt file in the project root. + +import ( + "sort" +) + +// Collectable is an interface that a struct should implement if it is to be +// usable as a key in these collections. +type Collectable[T any] interface { + Hash() int + Equals(other Collectable[T]) bool +} + +type Comparator[T any] interface { + Hash1(o T) int + Equals2(T, T) bool +} + +// JStore implements a container that allows the use of a struct to calculate the key +// for a collection of values akin to map. This is not meant to be a full-blown HashMap but just +// serve the needs of the ANTLR Go runtime. +// +// For ease of porting the logic of the runtime from the master target (Java), this collection +// operates in a similar way to Java, in that it can use any struct that supplies a Hash() and Equals() +// function as the key. The values are stored in a standard go map which internally is a form of hashmap +// itself, the key for the go map is the hash supplied by the key object. The collection is able to deal with +// hash conflicts by using a simple slice of values associated with the hash code indexed bucket. That isn't +// particularly efficient, but it is simple, and it works. As this is specifically for the ANTLR runtime, and +// we understand the requirements, then this is fine - this is not a general purpose collection. +type JStore[T any, C Comparator[T]] struct { + store map[int][]T + len int + comparator Comparator[T] +} + +func NewJStore[T any, C Comparator[T]](comparator Comparator[T]) *JStore[T, C] { + + if comparator == nil { + panic("comparator cannot be nil") + } + + s := &JStore[T, C]{ + store: make(map[int][]T, 1), + comparator: comparator, + } + return s +} + +// Put will store given value in the collection. Note that the key for storage is generated from +// the value itself - this is specifically because that is what ANTLR needs - this would not be useful +// as any kind of general collection. +// +// If the key has a hash conflict, then the value will be added to the slice of values associated with the +// hash, unless the value is already in the slice, in which case the existing value is returned. Value equivalence is +// tested by calling the equals() method on the key. +// +// # If the given value is already present in the store, then the existing value is returned as v and exists is set to true +// +// If the given value is not present in the store, then the value is added to the store and returned as v and exists is set to false. +func (s *JStore[T, C]) Put(value T) (v T, exists bool) { //nolint:ireturn + + kh := s.comparator.Hash1(value) + + for _, v1 := range s.store[kh] { + if s.comparator.Equals2(value, v1) { + return v1, true + } + } + s.store[kh] = append(s.store[kh], value) + s.len++ + return value, false +} + +// Get will return the value associated with the key - the type of the key is the same type as the value +// which would not generally be useful, but this is a specific thing for ANTLR where the key is +// generated using the object we are going to store. +func (s *JStore[T, C]) Get(key T) (T, bool) { //nolint:ireturn + + kh := s.comparator.Hash1(key) + + for _, v := range s.store[kh] { + if s.comparator.Equals2(key, v) { + return v, true + } + } + return key, false +} + +// Contains returns true if the given key is present in the store +func (s *JStore[T, C]) Contains(key T) bool { //nolint:ireturn + + _, present := s.Get(key) + return present +} + +func (s *JStore[T, C]) SortedSlice(less func(i, j T) bool) []T { + vs := make([]T, 0, len(s.store)) + for _, v := range s.store { + vs = append(vs, v...) + } + sort.Slice(vs, func(i, j int) bool { + return less(vs[i], vs[j]) + }) + + return vs +} + +func (s *JStore[T, C]) Each(f func(T) bool) { + for _, e := range s.store { + for _, v := range e { + f(v) + } + } +} + +func (s *JStore[T, C]) Len() int { + return s.len +} + +func (s *JStore[T, C]) Values() []T { + vs := make([]T, 0, len(s.store)) + for _, e := range s.store { + for _, v := range e { + vs = append(vs, v) + } + } + return vs +} + +type entry[K, V any] struct { + key K + val V +} + +type JMap[K, V any, C Comparator[K]] struct { + store map[int][]*entry[K, V] + len int + comparator Comparator[K] +} + +func NewJMap[K, V any, C Comparator[K]](comparator Comparator[K]) *JMap[K, V, C] { + return &JMap[K, V, C]{ + store: make(map[int][]*entry[K, V], 1), + comparator: comparator, + } +} + +func (m *JMap[K, V, C]) Put(key K, val V) { + kh := m.comparator.Hash1(key) + + m.store[kh] = append(m.store[kh], &entry[K, V]{key, val}) + m.len++ +} + +func (m *JMap[K, V, C]) Values() []V { + vs := make([]V, 0, len(m.store)) + for _, e := range m.store { + for _, v := range e { + vs = append(vs, v.val) + } + } + return vs +} + +func (m *JMap[K, V, C]) Get(key K) (V, bool) { + + var none V + kh := m.comparator.Hash1(key) + for _, e := range m.store[kh] { + if m.comparator.Equals2(e.key, key) { + return e.val, true + } + } + return none, false +} + +func (m *JMap[K, V, C]) Len() int { + return len(m.store) +} + +func (m *JMap[K, V, C]) Delete(key K) { + kh := m.comparator.Hash1(key) + for i, e := range m.store[kh] { + if m.comparator.Equals2(e.key, key) { + m.store[kh] = append(m.store[kh][:i], m.store[kh][i+1:]...) + m.len-- + return + } + } +} + +func (m *JMap[K, V, C]) Clear() { + m.store = make(map[int][]*entry[K, V]) +} diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go index b04f04572..6533f0516 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -232,8 +232,6 @@ func (b *BaseLexer) NextToken() Token { } return b.token } - - return nil } // Instruct the lexer to Skip creating a token for current lexer rule @@ -342,7 +340,7 @@ func (b *BaseLexer) GetCharIndex() int { } // Return the text Matched so far for the current token or any text override. -//Set the complete text of l token it wipes any previous changes to the text. +// Set the complete text of l token it wipes any previous changes to the text. func (b *BaseLexer) GetText() string { if b.text != "" { return b.text diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go similarity index 91% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go index 5a325be13..111656c29 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -21,8 +21,8 @@ type LexerAction interface { getActionType() int getIsPositionDependent() bool execute(lexer Lexer) - hash() int - equals(other LexerAction) bool + Hash() int + Equals(other LexerAction) bool } type BaseLexerAction struct { @@ -51,15 +51,14 @@ func (b *BaseLexerAction) getIsPositionDependent() bool { return b.isPositionDependent } -func (b *BaseLexerAction) hash() int { +func (b *BaseLexerAction) Hash() int { return b.actionType } -func (b *BaseLexerAction) equals(other LexerAction) bool { +func (b *BaseLexerAction) Equals(other LexerAction) bool { return b == other } -// // Implements the {@code Skip} lexer action by calling {@link Lexer//Skip}. // //

    The {@code Skip} command does not have any parameters, so l action is @@ -85,7 +84,8 @@ func (l *LexerSkipAction) String() string { return "skip" } -// Implements the {@code type} lexer action by calling {@link Lexer//setType} +// Implements the {@code type} lexer action by calling {@link Lexer//setType} +// // with the assigned type. type LexerTypeAction struct { *BaseLexerAction @@ -104,14 +104,14 @@ func (l *LexerTypeAction) execute(lexer Lexer) { lexer.SetType(l.thetype) } -func (l *LexerTypeAction) hash() int { +func (l *LexerTypeAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.thetype) return murmurFinish(h, 2) } -func (l *LexerTypeAction) equals(other LexerAction) bool { +func (l *LexerTypeAction) Equals(other LexerAction) bool { if l == other { return true } else if _, ok := other.(*LexerTypeAction); !ok { @@ -148,14 +148,14 @@ func (l *LexerPushModeAction) execute(lexer Lexer) { lexer.PushMode(l.mode) } -func (l *LexerPushModeAction) hash() int { +func (l *LexerPushModeAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.mode) return murmurFinish(h, 2) } -func (l *LexerPushModeAction) equals(other LexerAction) bool { +func (l *LexerPushModeAction) Equals(other LexerAction) bool { if l == other { return true } else if _, ok := other.(*LexerPushModeAction); !ok { @@ -245,14 +245,14 @@ func (l *LexerModeAction) execute(lexer Lexer) { lexer.SetMode(l.mode) } -func (l *LexerModeAction) hash() int { +func (l *LexerModeAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.mode) return murmurFinish(h, 2) } -func (l *LexerModeAction) equals(other LexerAction) bool { +func (l *LexerModeAction) Equals(other LexerAction) bool { if l == other { return true } else if _, ok := other.(*LexerModeAction); !ok { @@ -303,7 +303,7 @@ func (l *LexerCustomAction) execute(lexer Lexer) { lexer.Action(nil, l.ruleIndex, l.actionIndex) } -func (l *LexerCustomAction) hash() int { +func (l *LexerCustomAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.ruleIndex) @@ -311,13 +311,14 @@ func (l *LexerCustomAction) hash() int { return murmurFinish(h, 3) } -func (l *LexerCustomAction) equals(other LexerAction) bool { +func (l *LexerCustomAction) Equals(other LexerAction) bool { if l == other { return true } else if _, ok := other.(*LexerCustomAction); !ok { return false } else { - return l.ruleIndex == other.(*LexerCustomAction).ruleIndex && l.actionIndex == other.(*LexerCustomAction).actionIndex + return l.ruleIndex == other.(*LexerCustomAction).ruleIndex && + l.actionIndex == other.(*LexerCustomAction).actionIndex } } @@ -344,14 +345,14 @@ func (l *LexerChannelAction) execute(lexer Lexer) { lexer.SetChannel(l.channel) } -func (l *LexerChannelAction) hash() int { +func (l *LexerChannelAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.channel) return murmurFinish(h, 2) } -func (l *LexerChannelAction) equals(other LexerAction) bool { +func (l *LexerChannelAction) Equals(other LexerAction) bool { if l == other { return true } else if _, ok := other.(*LexerChannelAction); !ok { @@ -412,10 +413,10 @@ func (l *LexerIndexedCustomAction) execute(lexer Lexer) { l.lexerAction.execute(lexer) } -func (l *LexerIndexedCustomAction) hash() int { +func (l *LexerIndexedCustomAction) Hash() int { h := murmurInit(0) h = murmurUpdate(h, l.offset) - h = murmurUpdate(h, l.lexerAction.hash()) + h = murmurUpdate(h, l.lexerAction.Hash()) return murmurFinish(h, 2) } @@ -425,6 +426,7 @@ func (l *LexerIndexedCustomAction) equals(other LexerAction) bool { } else if _, ok := other.(*LexerIndexedCustomAction); !ok { return false } else { - return l.offset == other.(*LexerIndexedCustomAction).offset && l.lexerAction == other.(*LexerIndexedCustomAction).lexerAction + return l.offset == other.(*LexerIndexedCustomAction).offset && + l.lexerAction.Equals(other.(*LexerIndexedCustomAction).lexerAction) } } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go similarity index 88% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go index 056941dd6..be1ba7a7e 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go @@ -1,9 +1,11 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. package antlr +import "golang.org/x/exp/slices" + // Represents an executor for a sequence of lexer actions which traversed during // the Matching operation of a lexer rule (token). // @@ -12,8 +14,8 @@ package antlr // not cause bloating of the {@link DFA} created for the lexer.

    type LexerActionExecutor struct { - lexerActions []LexerAction - cachedHash int + lexerActions []LexerAction + cachedHash int } func NewLexerActionExecutor(lexerActions []LexerAction) *LexerActionExecutor { @@ -30,7 +32,7 @@ func NewLexerActionExecutor(lexerActions []LexerAction) *LexerActionExecutor { // of the performance-critical {@link LexerATNConfig//hashCode} operation. l.cachedHash = murmurInit(57) for _, a := range lexerActions { - l.cachedHash = murmurUpdate(l.cachedHash, a.hash()) + l.cachedHash = murmurUpdate(l.cachedHash, a.Hash()) } return l @@ -151,14 +153,17 @@ func (l *LexerActionExecutor) execute(lexer Lexer, input CharStream, startIndex } } -func (l *LexerActionExecutor) hash() int { +func (l *LexerActionExecutor) Hash() int { if l == nil { + // TODO: Why is this here? l should not be nil return 61 } + + // TODO: This is created from the action itself when the struct is created - will this be an issue at some point? Java uses the runtime assign hashcode return l.cachedHash } -func (l *LexerActionExecutor) equals(other interface{}) bool { +func (l *LexerActionExecutor) Equals(other interface{}) bool { if l == other { return true } @@ -169,5 +174,13 @@ func (l *LexerActionExecutor) equals(other interface{}) bool { if othert == nil { return false } - return l.cachedHash == othert.cachedHash && &l.lexerActions == &othert.lexerActions + if l.cachedHash != othert.cachedHash { + return false + } + if len(l.lexerActions) != len(othert.lexerActions) { + return false + } + return slices.EqualFunc(l.lexerActions, othert.lexerActions, func(i, j LexerAction) bool { + return i.Equals(j) + }) } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go index dc05153ea..c573b7521 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -591,19 +591,24 @@ func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet, suppressEdge bool) proposed.lexerActionExecutor = firstConfigWithRuleStopState.(*LexerATNConfig).lexerActionExecutor proposed.setPrediction(l.atn.ruleToTokenType[firstConfigWithRuleStopState.GetState().GetRuleIndex()]) } - hash := proposed.hash() dfa := l.decisionToDFA[l.mode] l.atn.stateMu.Lock() defer l.atn.stateMu.Unlock() - existing, ok := dfa.getState(hash) - if ok { + existing, present := dfa.states.Get(proposed) + if present { + + // This state was already present, so just return it. + // proposed = existing } else { - proposed.stateNumber = dfa.numStates() + + // We need to add the new state + // + proposed.stateNumber = dfa.states.Len() configs.SetReadOnly(true) proposed.configs = configs - dfa.setState(hash, proposed) + dfa.states.Put(proposed) } if !suppressEdge { dfa.setS0(proposed) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go similarity index 87% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go index 6ffb37de6..76689615a 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -14,14 +14,15 @@ func NewLL1Analyzer(atn *ATN) *LL1Analyzer { return la } -//* Special value added to the lookahead sets to indicate that we hit -// a predicate during analysis if {@code seeThruPreds==false}. -/// +// - Special value added to the lookahead sets to indicate that we hit +// a predicate during analysis if {@code seeThruPreds==false}. +// +// / const ( LL1AnalyzerHitPred = TokenInvalidType ) -//* +// * // Calculates the SLL(1) expected lookahead set for each outgoing transition // of an {@link ATNState}. The returned array has one element for each // outgoing transition in {@code s}. If the closure from transition @@ -38,7 +39,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet { look := make([]*IntervalSet, count) for alt := 0; alt < count; alt++ { look[alt] = NewIntervalSet() - lookBusy := newArray2DHashSet(nil, nil) + lookBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst) seeThruPreds := false // fail to get lookahead upon pred la.look1(s.GetTransitions()[alt].getTarget(), nil, BasePredictionContextEMPTY, look[alt], lookBusy, NewBitSet(), seeThruPreds, false) // Wipe out lookahead for la alternative if we found nothing @@ -50,7 +51,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet { return look } -//* +// * // Compute set of tokens that can follow {@code s} in the ATN in the // specified {@code ctx}. // @@ -67,7 +68,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet { // // @return The set of tokens that can follow {@code s} in the ATN in the // specified {@code ctx}. -/// +// / func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet { r := NewIntervalSet() seeThruPreds := true // ignore preds get all lookahead @@ -75,7 +76,7 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet if ctx != nil { lookContext = predictionContextFromRuleContext(s.GetATN(), ctx) } - la.look1(s, stopState, lookContext, r, newArray2DHashSet(nil, nil), NewBitSet(), seeThruPreds, true) + la.look1(s, stopState, lookContext, r, NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst), NewBitSet(), seeThruPreds, true) return r } @@ -109,14 +110,14 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet // outermost context is reached. This parameter has no effect if {@code ctx} // is {@code nil}. -func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) { +func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) { returnState := la.atn.states[ctx.getReturnState(i)] la.look1(returnState, stopState, ctx.GetParent(i), look, lookBusy, calledRuleStack, seeThruPreds, addEOF) } -func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool) { +func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool) { c := NewBaseATNConfig6(s, 0, ctx) @@ -124,8 +125,11 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look return } - lookBusy.Add(c) + _, present := lookBusy.Put(c) + if present { + return + } if s == stopState { if ctx == nil { look.addOne(TokenEpsilon) @@ -198,7 +202,7 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look } } -func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) { +func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) { newContext := SingletonBasePredictionContextCreate(ctx, t1.followState.GetStateNumber()) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go similarity index 99% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go index 2ab2f5605..d26bf0639 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -91,7 +91,6 @@ func NewBaseParser(input TokenStream) *BaseParser { // bypass alternatives. // // @see ATNDeserializationOptions//isGenerateRuleBypassTransitions() -// var bypassAltsAtnCache = make(map[string]int) // reset the parser's state// @@ -230,7 +229,6 @@ func (p *BaseParser) GetParseListeners() []ParseTreeListener { // @param listener the listener to add // // @panics nilPointerException if {@code} listener is {@code nil} -// func (p *BaseParser) AddParseListener(listener ParseTreeListener) { if listener == nil { panic("listener") @@ -241,13 +239,11 @@ func (p *BaseParser) AddParseListener(listener ParseTreeListener) { p.parseListeners = append(p.parseListeners, listener) } -// // Remove {@code listener} from the list of parse listeners. // //

    If {@code listener} is {@code nil} or has not been added as a parse // listener, p.method does nothing.

    // @param listener the listener to remove -// func (p *BaseParser) RemoveParseListener(listener ParseTreeListener) { if p.parseListeners != nil { @@ -289,11 +285,9 @@ func (p *BaseParser) TriggerEnterRuleEvent() { } } -// // Notify any parse listeners of an exit rule event. // // @see //addParseListener -// func (p *BaseParser) TriggerExitRuleEvent() { if p.parseListeners != nil { // reverse order walk of listeners @@ -330,7 +324,6 @@ func (p *BaseParser) setTokenFactory(factory TokenFactory) { // // @panics UnsupportedOperationException if the current parser does not // implement the {@link //getSerializedATN()} method. -// func (p *BaseParser) GetATNWithBypassAlts() { // TODO @@ -402,7 +395,6 @@ func (p *BaseParser) SetTokenStream(input TokenStream) { // Match needs to return the current input symbol, which gets put // into the label for the associated token ref e.g., x=ID. -// func (p *BaseParser) GetCurrentToken() Token { return p.input.LT(1) } @@ -624,7 +616,6 @@ func (p *BaseParser) IsExpectedToken(symbol int) bool { // respectively. // // @see ATN//getExpectedTokens(int, RuleContext) -// func (p *BaseParser) GetExpectedTokens() *IntervalSet { return p.Interpreter.atn.getExpectedTokens(p.state, p.ctx) } @@ -686,7 +677,7 @@ func (p *BaseParser) GetDFAStrings() string { func (p *BaseParser) DumpDFA() { seenOne := false for _, dfa := range p.Interpreter.decisionToDFA { - if dfa.numStates() > 0 { + if dfa.states.Len() > 0 { if seenOne { fmt.Println() } @@ -703,7 +694,6 @@ func (p *BaseParser) GetSourceName() string { // During a parse is sometimes useful to listen in on the rule entry and exit // events as well as token Matches. p.is for quick and dirty debugging. -// func (p *BaseParser) SetTrace(trace *TraceListener) { if trace == nil { p.RemoveParseListener(p.tracer) diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go similarity index 94% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go index 888d51297..8bcc46a0d 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -11,11 +11,11 @@ import ( ) var ( - ParserATNSimulatorDebug = false - ParserATNSimulatorListATNDecisions = false - ParserATNSimulatorDFADebug = false - ParserATNSimulatorRetryDebug = false - TurnOffLRLoopEntryBranchOpt = false + ParserATNSimulatorDebug = false + ParserATNSimulatorTraceATNSim = false + ParserATNSimulatorDFADebug = false + ParserATNSimulatorRetryDebug = false + TurnOffLRLoopEntryBranchOpt = false ) type ParserATNSimulator struct { @@ -70,8 +70,8 @@ func (p *ParserATNSimulator) reset() { } func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, outerContext ParserRuleContext) int { - if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions { - fmt.Println("AdaptivePredict decision " + strconv.Itoa(decision) + + if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim { + fmt.Println("adaptivePredict decision " + strconv.Itoa(decision) + " exec LA(1)==" + p.getLookaheadName(input) + " line " + strconv.Itoa(input.LT(1).GetLine()) + ":" + strconv.Itoa(input.LT(1).GetColumn())) @@ -111,15 +111,15 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou if s0 == nil { if outerContext == nil { - outerContext = RuleContextEmpty + outerContext = ParserRuleContextEmpty } - if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions { + if ParserATNSimulatorDebug { fmt.Println("predictATN decision " + strconv.Itoa(dfa.decision) + " exec LA(1)==" + p.getLookaheadName(input) + ", outerContext=" + outerContext.String(p.parser.GetRuleNames(), nil)) } fullCtx := false - s0Closure := p.computeStartState(dfa.atnStartState, RuleContextEmpty, fullCtx) + s0Closure := p.computeStartState(dfa.atnStartState, ParserRuleContextEmpty, fullCtx) p.atn.stateMu.Lock() if dfa.getPrecedenceDfa() { @@ -174,17 +174,18 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou // Reporting insufficient predicates // cover these cases: -// dead end -// single alt -// single alt + preds -// conflict -// conflict + preds // +// dead end +// single alt +// single alt + preds +// conflict +// conflict + preds func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, startIndex int, outerContext ParserRuleContext) int { - if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions { + if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim { fmt.Println("execATN decision " + strconv.Itoa(dfa.decision) + - " exec LA(1)==" + p.getLookaheadName(input) + + ", DFA state " + s0.String() + + ", LA(1)==" + p.getLookaheadName(input) + " line " + strconv.Itoa(input.LT(1).GetLine()) + ":" + strconv.Itoa(input.LT(1).GetColumn())) } @@ -277,8 +278,6 @@ func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, t = input.LA(1) } } - - panic("Should not have reached p state") } // Get an existing target state for an edge in the DFA. If the target state @@ -384,7 +383,7 @@ func (p *ParserATNSimulator) predicateDFAState(dfaState *DFAState, decisionState // comes back with reach.uniqueAlt set to a valid alt func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 ATNConfigSet, input TokenStream, startIndex int, outerContext ParserRuleContext) int { - if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions { + if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim { fmt.Println("execATNWithFullContext " + s0.String()) } @@ -492,9 +491,6 @@ func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 AT } func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCtx bool) ATNConfigSet { - if ParserATNSimulatorDebug { - fmt.Println("in computeReachSet, starting closure: " + closure.String()) - } if p.mergeCache == nil { p.mergeCache = NewDoubleDict() } @@ -570,7 +566,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // if reach == nil { reach = NewBaseATNConfigSet(fullCtx) - closureBusy := newArray2DHashSet(nil, nil) + closureBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst) treatEOFAsEpsilon := t == TokenEOF amount := len(intermediate.configs) for k := 0; k < amount; k++ { @@ -610,6 +606,11 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt reach.Add(skippedStopStates[l], p.mergeCache) } } + + if ParserATNSimulatorTraceATNSim { + fmt.Println("computeReachSet " + closure.String() + " -> " + reach.String()) + } + if len(reach.GetItems()) == 0 { return nil } @@ -617,7 +618,6 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt return reach } -// // Return a configuration set containing only the configurations from // {@code configs} which are in a {@link RuleStopState}. If all // configurations in {@code configs} are already in a rule stop state, p @@ -636,7 +636,6 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // @return {@code configs} if all configurations in {@code configs} are in a // rule stop state, otherwise return a Newconfiguration set containing only // the configurations from {@code configs} which are in a rule stop state -// func (p *ParserATNSimulator) removeAllConfigsNotInRuleStopState(configs ATNConfigSet, lookToEndOfRule bool) ATNConfigSet { if PredictionModeallConfigsInRuleStopStates(configs) { return configs @@ -662,16 +661,20 @@ func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, full // always at least the implicit call to start rule initialContext := predictionContextFromRuleContext(p.atn, ctx) configs := NewBaseATNConfigSet(fullCtx) + if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim { + fmt.Println("computeStartState from ATN state " + a.String() + + " initialContext=" + initialContext.String()) + } + for i := 0; i < len(a.GetTransitions()); i++ { target := a.GetTransitions()[i].getTarget() c := NewBaseATNConfig6(target, i+1, initialContext) - closureBusy := newArray2DHashSet(nil, nil) + closureBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](atnConfCompInst) p.closure(c, configs, closureBusy, true, fullCtx, false) } return configs } -// // This method transforms the start state computed by // {@link //computeStartState} to the special start state used by a // precedence DFA for a particular precedence value. The transformation @@ -726,7 +729,6 @@ func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, full // @return The transformed configuration set representing the start state // for a precedence DFA at a particular precedence level (determined by // calling {@link Parser//getPrecedence}). -// func (p *ParserATNSimulator) applyPrecedenceFilter(configs ATNConfigSet) ATNConfigSet { statesFromAlt1 := make(map[int]PredictionContext) @@ -760,7 +762,7 @@ func (p *ParserATNSimulator) applyPrecedenceFilter(configs ATNConfigSet) ATNConf // (basically a graph subtraction algorithm). if !config.getPrecedenceFilterSuppressed() { context := statesFromAlt1[config.GetState().GetStateNumber()] - if context != nil && context.equals(config.GetContext()) { + if context != nil && context.Equals(config.GetContext()) { // eliminated continue } @@ -824,7 +826,6 @@ func (p *ParserATNSimulator) getPredicatePredictions(ambigAlts *BitSet, altToPre return pairs } -// // This method is used to improve the localization of error messages by // choosing an alternative rather than panicing a // {@link NoViableAltException} in particular prediction scenarios where the @@ -869,7 +870,6 @@ func (p *ParserATNSimulator) getPredicatePredictions(ambigAlts *BitSet, altToPre // @return The value to return from {@link //AdaptivePredict}, or // {@link ATN//INVALID_ALT_NUMBER} if a suitable alternative was not // identified and {@link //AdaptivePredict} should Report an error instead. -// func (p *ParserATNSimulator) getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(configs ATNConfigSet, outerContext ParserRuleContext) int { cfgs := p.splitAccordingToSemanticValidity(configs, outerContext) semValidConfigs := cfgs[0] @@ -938,11 +938,11 @@ func (p *ParserATNSimulator) splitAccordingToSemanticValidity(configs ATNConfigS } // Look through a list of predicate/alt pairs, returning alts for the -// pairs that win. A {@code NONE} predicate indicates an alt containing an -// unpredicated config which behaves as "always true." If !complete -// then we stop at the first predicate that evaluates to true. This -// includes pairs with nil predicates. // +// pairs that win. A {@code NONE} predicate indicates an alt containing an +// unpredicated config which behaves as "always true." If !complete +// then we stop at the first predicate that evaluates to true. This +// includes pairs with nil predicates. func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPrediction, outerContext ParserRuleContext, complete bool) *BitSet { predictions := NewBitSet() for i := 0; i < len(predPredictions); i++ { @@ -972,16 +972,16 @@ func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPredicti return predictions } -func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx, treatEOFAsEpsilon bool) { +func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx, treatEOFAsEpsilon bool) { initialDepth := 0 p.closureCheckingStopState(config, configs, closureBusy, collectPredicates, fullCtx, initialDepth, treatEOFAsEpsilon) } -func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { - if ParserATNSimulatorDebug { +func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { + if ParserATNSimulatorTraceATNSim { fmt.Println("closure(" + config.String() + ")") - fmt.Println("configs(" + configs.String() + ")") + //fmt.Println("configs(" + configs.String() + ")") if config.GetReachesIntoOuterContext() > 50 { panic("problem") } @@ -1031,7 +1031,7 @@ func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs } // Do the actual work of walking epsilon edges// -func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { +func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { state := config.GetState() // optimization if !state.GetEpsilonOnlyTransitions() { @@ -1066,7 +1066,8 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, c.SetReachesIntoOuterContext(c.GetReachesIntoOuterContext() + 1) - if closureBusy.Add(c) != c { + _, present := closureBusy.Put(c) + if present { // avoid infinite recursion for right-recursive rules continue } @@ -1077,9 +1078,13 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, fmt.Println("dips into outer ctx: " + c.String()) } } else { - if !t.getIsEpsilon() && closureBusy.Add(c) != c { - // avoid infinite recursion for EOF* and EOF+ - continue + + if !t.getIsEpsilon() { + _, present := closureBusy.Put(c) + if present { + // avoid infinite recursion for EOF* and EOF+ + continue + } } if _, ok := t.(*RuleTransition); ok { // latch when newDepth goes negative - once we step out of the entry context we can't return @@ -1104,7 +1109,16 @@ func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config ATNC // left-recursion elimination. For efficiency, also check if // the context has an empty stack case. If so, it would mean // global FOLLOW so we can't perform optimization - if startLoop, ok := _p.(StarLoopEntryState); !ok || !startLoop.precedenceRuleDecision || config.GetContext().isEmpty() || config.GetContext().hasEmptyPath() { + if _p.GetStateType() != ATNStateStarLoopEntry { + return false + } + startLoop, ok := _p.(*StarLoopEntryState) + if !ok { + return false + } + if !startLoop.precedenceRuleDecision || + config.GetContext().isEmpty() || + config.GetContext().hasEmptyPath() { return false } @@ -1117,8 +1131,8 @@ func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config ATNC return false } } - - decisionStartState := _p.(BlockStartState).GetTransitions()[0].getTarget().(BlockStartState) + x := _p.GetTransitions()[0].getTarget() + decisionStartState := x.(BlockStartState) blockEndStateNum := decisionStartState.getEndState().stateNumber blockEndState := p.atn.states[blockEndStateNum].(*BlockEndState) @@ -1355,13 +1369,12 @@ func (p *ParserATNSimulator) GetTokenName(t int) string { return "EOF" } - if p.parser != nil && p.parser.GetLiteralNames() != nil { - if t >= len(p.parser.GetLiteralNames()) { - fmt.Println(strconv.Itoa(t) + " ttype out of range: " + strings.Join(p.parser.GetLiteralNames(), ",")) - // fmt.Println(p.parser.GetInputStream().(TokenStream).GetAllText()) // p seems incorrect - } else { - return p.parser.GetLiteralNames()[t] + "<" + strconv.Itoa(t) + ">" - } + if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetLiteralNames()) { + return p.parser.GetLiteralNames()[t] + "<" + strconv.Itoa(t) + ">" + } + + if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetSymbolicNames()) { + return p.parser.GetSymbolicNames()[t] + "<" + strconv.Itoa(t) + ">" } return strconv.Itoa(t) @@ -1372,9 +1385,9 @@ func (p *ParserATNSimulator) getLookaheadName(input TokenStream) string { } // Used for debugging in AdaptivePredict around execATN but I cut -// it out for clarity now that alg. works well. We can leave p -// "dead" code for a bit. // +// it out for clarity now that alg. works well. We can leave p +// "dead" code for a bit. func (p *ParserATNSimulator) dumpDeadEndConfigs(nvae *NoViableAltException) { panic("Not implemented") @@ -1421,7 +1434,6 @@ func (p *ParserATNSimulator) getUniqueAlt(configs ATNConfigSet) int { return alt } -// // Add an edge to the DFA, if possible. This method calls // {@link //addDFAState} to ensure the {@code to} state is present in the // DFA. If {@code from} is {@code nil}, or if {@code t} is outside the @@ -1440,7 +1452,6 @@ func (p *ParserATNSimulator) getUniqueAlt(configs ATNConfigSet) int { // @return If {@code to} is {@code nil}, p method returns {@code nil} // otherwise p method returns the result of calling {@link //addDFAState} // on {@code to} -// func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFAState) *DFAState { if ParserATNSimulatorDebug { fmt.Println("EDGE " + from.String() + " -> " + to.String() + " upon " + p.GetTokenName(t)) @@ -1472,7 +1483,6 @@ func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFA return to } -// // Add state {@code D} to the DFA if it is not already present, and return // the actual instance stored in the DFA. If a state equivalent to {@code D} // is already in the DFA, the existing state is returned. Otherwise p @@ -1486,25 +1496,30 @@ func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFA // @return The state stored in the DFA. This will be either the existing // state if {@code D} is already in the DFA, or {@code D} itself if the // state was not already present. -// func (p *ParserATNSimulator) addDFAState(dfa *DFA, d *DFAState) *DFAState { if d == ATNSimulatorError { return d } - hash := d.hash() - existing, ok := dfa.getState(hash) - if ok { + existing, present := dfa.states.Get(d) + if present { + if ParserATNSimulatorTraceATNSim { + fmt.Print("addDFAState " + d.String() + " exists") + } return existing } - d.stateNumber = dfa.numStates() + + // The state was not present, so update it with configs + // + d.stateNumber = dfa.states.Len() if !d.configs.ReadOnly() { d.configs.OptimizeConfigs(p.BaseATNSimulator) d.configs.SetReadOnly(true) } - dfa.setState(hash, d) - if ParserATNSimulatorDebug { - fmt.Println("adding NewDFA state: " + d.String()) + dfa.states.Put(d) + if ParserATNSimulatorTraceATNSim { + fmt.Println("addDFAState new " + d.String()) } + return d } diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go index 49cd10c5f..1c8cee747 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -340,7 +340,7 @@ func (prc *BaseParserRuleContext) String(ruleNames []string, stop RuleContext) s return s } -var RuleContextEmpty = NewBaseParserRuleContext(nil, -1) +var ParserRuleContextEmpty = NewBaseParserRuleContext(nil, -1) type InterpreterRuleContext interface { ParserRuleContext diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go similarity index 81% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go index 9fdfd52b2..ba62af361 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go @@ -1,10 +1,12 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. package antlr import ( + "fmt" + "golang.org/x/exp/slices" "strconv" ) @@ -26,10 +28,10 @@ var ( ) type PredictionContext interface { - hash() int + Hash() int + Equals(interface{}) bool GetParent(int) PredictionContext getReturnState(int) int - equals(PredictionContext) bool length() int isEmpty() bool hasEmptyPath() bool @@ -53,7 +55,7 @@ func (b *BasePredictionContext) isEmpty() bool { func calculateHash(parent PredictionContext, returnState int) int { h := murmurInit(1) - h = murmurUpdate(h, parent.hash()) + h = murmurUpdate(h, parent.Hash()) h = murmurUpdate(h, returnState) return murmurFinish(h, 2) } @@ -86,7 +88,6 @@ func NewPredictionContextCache() *PredictionContextCache { // Add a context to the cache and return it. If the context already exists, // return that one instead and do not add a Newcontext to the cache. // Protect shared cache from unsafe thread access. -// func (p *PredictionContextCache) add(ctx PredictionContext) PredictionContext { if ctx == BasePredictionContextEMPTY { return BasePredictionContextEMPTY @@ -160,28 +161,28 @@ func (b *BaseSingletonPredictionContext) hasEmptyPath() bool { return b.returnState == BasePredictionContextEmptyReturnState } -func (b *BaseSingletonPredictionContext) equals(other PredictionContext) bool { +func (b *BaseSingletonPredictionContext) Hash() int { + return b.cachedHash +} + +func (b *BaseSingletonPredictionContext) Equals(other interface{}) bool { if b == other { return true - } else if _, ok := other.(*BaseSingletonPredictionContext); !ok { + } + if _, ok := other.(*BaseSingletonPredictionContext); !ok { return false - } else if b.hash() != other.hash() { - return false // can't be same if hash is different } otherP := other.(*BaseSingletonPredictionContext) - if b.returnState != other.getReturnState(0) { + if b.returnState != otherP.getReturnState(0) { return false - } else if b.parentCtx == nil { + } + if b.parentCtx == nil { return otherP.parentCtx == nil } - return b.parentCtx.equals(otherP.parentCtx) -} - -func (b *BaseSingletonPredictionContext) hash() int { - return b.cachedHash + return b.parentCtx.Equals(otherP.parentCtx) } func (b *BaseSingletonPredictionContext) String() string { @@ -215,7 +216,7 @@ func NewEmptyPredictionContext() *EmptyPredictionContext { p := new(EmptyPredictionContext) p.BaseSingletonPredictionContext = NewBaseSingletonPredictionContext(nil, BasePredictionContextEmptyReturnState) - + p.cachedHash = calculateEmptyHash() return p } @@ -231,7 +232,11 @@ func (e *EmptyPredictionContext) getReturnState(index int) int { return e.returnState } -func (e *EmptyPredictionContext) equals(other PredictionContext) bool { +func (e *EmptyPredictionContext) Hash() int { + return e.cachedHash +} + +func (e *EmptyPredictionContext) Equals(other interface{}) bool { return e == other } @@ -254,7 +259,7 @@ func NewArrayPredictionContext(parents []PredictionContext, returnStates []int) hash := murmurInit(1) for _, parent := range parents { - hash = murmurUpdate(hash, parent.hash()) + hash = murmurUpdate(hash, parent.Hash()) } for _, returnState := range returnStates { @@ -298,18 +303,31 @@ func (a *ArrayPredictionContext) getReturnState(index int) int { return a.returnStates[index] } -func (a *ArrayPredictionContext) equals(other PredictionContext) bool { - if _, ok := other.(*ArrayPredictionContext); !ok { +// Equals is the default comparison function for ArrayPredictionContext when no specialized +// implementation is needed for a collection +func (a *ArrayPredictionContext) Equals(o interface{}) bool { + if a == o { + return true + } + other, ok := o.(*ArrayPredictionContext) + if !ok { return false - } else if a.cachedHash != other.hash() { + } + if a.cachedHash != other.Hash() { return false // can't be same if hash is different - } else { - otherP := other.(*ArrayPredictionContext) - return &a.returnStates == &otherP.returnStates && &a.parents == &otherP.parents } + + // Must compare the actual array elements and not just the array address + // + return slices.Equal(a.returnStates, other.returnStates) && + slices.EqualFunc(a.parents, other.parents, func(x, y PredictionContext) bool { + return x.Equals(y) + }) } -func (a *ArrayPredictionContext) hash() int { +// Hash is the default hash function for ArrayPredictionContext when no specialized +// implementation is needed for a collection +func (a *ArrayPredictionContext) Hash() int { return a.BasePredictionContext.cachedHash } @@ -343,11 +361,11 @@ func (a *ArrayPredictionContext) String() string { // / func predictionContextFromRuleContext(a *ATN, outerContext RuleContext) PredictionContext { if outerContext == nil { - outerContext = RuleContextEmpty + outerContext = ParserRuleContextEmpty } // if we are in RuleContext of start rule, s, then BasePredictionContext // is EMPTY. Nobody called us. (if we are empty, return empty) - if outerContext.GetParent() == nil || outerContext == RuleContextEmpty { + if outerContext.GetParent() == nil || outerContext == ParserRuleContextEmpty { return BasePredictionContextEMPTY } // If we have a parent, convert it to a BasePredictionContext graph @@ -359,11 +377,20 @@ func predictionContextFromRuleContext(a *ATN, outerContext RuleContext) Predicti } func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext { - // share same graph if both same - if a == b { + + // Share same graph if both same + // + if a == b || a.Equals(b) { return a } + // In Java, EmptyPredictionContext inherits from SingletonPredictionContext, and so the test + // in java for SingletonPredictionContext will succeed and a new ArrayPredictionContext will be created + // from it. + // In go, EmptyPredictionContext does not equate to SingletonPredictionContext and so that conversion + // will fail. We need to test for both Empty and Singleton and create an ArrayPredictionContext from + // either of them. + ac, ok1 := a.(*BaseSingletonPredictionContext) bc, ok2 := b.(*BaseSingletonPredictionContext) @@ -380,17 +407,32 @@ func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) return b } } - // convert singleton so both are arrays to normalize - if _, ok := a.(*BaseSingletonPredictionContext); ok { - a = NewArrayPredictionContext([]PredictionContext{a.GetParent(0)}, []int{a.getReturnState(0)}) + + // Convert Singleton or Empty so both are arrays to normalize - We should not use the existing parameters + // here. + // + // TODO: I think that maybe the Prediction Context structs should be redone as there is a chance we will see this mess again - maybe redo the logic here + + var arp, arb *ArrayPredictionContext + var ok bool + if arp, ok = a.(*ArrayPredictionContext); ok { + } else if _, ok = a.(*BaseSingletonPredictionContext); ok { + arp = NewArrayPredictionContext([]PredictionContext{a.GetParent(0)}, []int{a.getReturnState(0)}) + } else if _, ok = a.(*EmptyPredictionContext); ok { + arp = NewArrayPredictionContext([]PredictionContext{}, []int{}) } - if _, ok := b.(*BaseSingletonPredictionContext); ok { - b = NewArrayPredictionContext([]PredictionContext{b.GetParent(0)}, []int{b.getReturnState(0)}) + + if arb, ok = b.(*ArrayPredictionContext); ok { + } else if _, ok = b.(*BaseSingletonPredictionContext); ok { + arb = NewArrayPredictionContext([]PredictionContext{b.GetParent(0)}, []int{b.getReturnState(0)}) + } else if _, ok = b.(*EmptyPredictionContext); ok { + arb = NewArrayPredictionContext([]PredictionContext{}, []int{}) } - return mergeArrays(a.(*ArrayPredictionContext), b.(*ArrayPredictionContext), rootIsWildcard, mergeCache) + + // Both arp and arb + return mergeArrays(arp, arb, rootIsWildcard, mergeCache) } -// // Merge two {@link SingletonBasePredictionContext} instances. // //

    Stack tops equal, parents merge is same return left graph.
    @@ -423,11 +465,11 @@ func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) // / func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext { if mergeCache != nil { - previous := mergeCache.Get(a.hash(), b.hash()) + previous := mergeCache.Get(a.Hash(), b.Hash()) if previous != nil { return previous.(PredictionContext) } - previous = mergeCache.Get(b.hash(), a.hash()) + previous = mergeCache.Get(b.Hash(), a.Hash()) if previous != nil { return previous.(PredictionContext) } @@ -436,7 +478,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, rootMerge := mergeRoot(a, b, rootIsWildcard) if rootMerge != nil { if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), rootMerge) + mergeCache.set(a.Hash(), b.Hash(), rootMerge) } return rootMerge } @@ -456,7 +498,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, // Newjoined parent so create Newsingleton pointing to it, a' spc := SingletonBasePredictionContextCreate(parent, a.returnState) if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), spc) + mergeCache.set(a.Hash(), b.Hash(), spc) } return spc } @@ -478,7 +520,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, parents := []PredictionContext{singleParent, singleParent} apc := NewArrayPredictionContext(parents, payloads) if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), apc) + mergeCache.set(a.Hash(), b.Hash(), apc) } return apc } @@ -494,12 +536,11 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, } apc := NewArrayPredictionContext(parents, payloads) if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), apc) + mergeCache.set(a.Hash(), b.Hash(), apc) } return apc } -// // Handle case where at least one of {@code a} or {@code b} is // {@link //EMPTY}. In the following diagrams, the symbol {@code $} is used // to represent {@link //EMPTY}. @@ -561,7 +602,6 @@ func mergeRoot(a, b SingletonPredictionContext, rootIsWildcard bool) PredictionC return nil } -// // Merge two {@link ArrayBasePredictionContext} instances. // //

    Different tops, different parents.
    @@ -583,12 +623,18 @@ func mergeRoot(a, b SingletonPredictionContext, rootIsWildcard bool) PredictionC // / func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext { if mergeCache != nil { - previous := mergeCache.Get(a.hash(), b.hash()) + previous := mergeCache.Get(a.Hash(), b.Hash()) if previous != nil { + if ParserATNSimulatorTraceATNSim { + fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous") + } return previous.(PredictionContext) } - previous = mergeCache.Get(b.hash(), a.hash()) + previous = mergeCache.Get(b.Hash(), a.Hash()) if previous != nil { + if ParserATNSimulatorTraceATNSim { + fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous") + } return previous.(PredictionContext) } } @@ -608,7 +654,7 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache * payload := a.returnStates[i] // $+$ = $ bothDollars := payload == BasePredictionContextEmptyReturnState && aParent == nil && bParent == nil - axAX := (aParent != nil && bParent != nil && aParent == bParent) // ax+ax + axAX := aParent != nil && bParent != nil && aParent == bParent // ax+ax // -> // ax if bothDollars || axAX { @@ -651,7 +697,7 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache * if k == 1 { // for just one merged element, return singleton top pc := SingletonBasePredictionContextCreate(mergedParents[0], mergedReturnStates[0]) if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), pc) + mergeCache.set(a.Hash(), b.Hash(), pc) } return pc } @@ -663,27 +709,36 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache * // if we created same array as a or b, return that instead // TODO: track whether this is possible above during merge sort for speed + // TODO: In go, I do not think we can just do M == xx as M is a brand new allocation. This could be causing allocation problems if M == a { if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), a) + mergeCache.set(a.Hash(), b.Hash(), a) + } + if ParserATNSimulatorTraceATNSim { + fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> a") } return a } if M == b { if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), b) + mergeCache.set(a.Hash(), b.Hash(), b) + } + if ParserATNSimulatorTraceATNSim { + fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> b") } return b } combineCommonParents(mergedParents) if mergeCache != nil { - mergeCache.set(a.hash(), b.hash(), M) + mergeCache.set(a.Hash(), b.Hash(), M) + } + if ParserATNSimulatorTraceATNSim { + fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> " + M.String()) } return M } -// // Make pass over all M {@code parents} merge any {@code equals()} // ones. // / diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go similarity index 95% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go index 15718f912..7b9b72fab 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -70,7 +70,6 @@ const ( PredictionModeLLExactAmbigDetection = 2 ) -// // Computes the SLL prediction termination condition. // //

    @@ -108,9 +107,9 @@ const ( // The single-alt-state thing lets prediction continue upon rules like // (otherwise, it would admit defeat too soon):

    // -//

    {@code [12|1|[], 6|2|[], 12|2|[]]. s : (ID | ID ID?) '' }

    +//

    {@code [12|1|[], 6|2|[], 12|2|[]]. s : (ID | ID ID?) †}

    // -//

    When the ATN simulation reaches the state before {@code ''}, it has a +//

    When the ATN simulation reaches the state before {@code â€}, it has a // DFA state that looks like: {@code [12|1|[], 6|2|[], 12|2|[]]}. Naturally // {@code 12|1|[]} and {@code 12|2|[]} conflict, but we cannot stop // processing this node because alternative to has another way to continue, @@ -152,16 +151,15 @@ const ( // //

    Before testing these configurations against others, we have to merge // {@code x} and {@code x'} (without modifying the existing configurations). -// For example, we test {@code (x+x')==x''} when looking for conflicts in +// For example, we test {@code (x+x')==xâ€} when looking for conflicts in // the following configurations.

    // -//

    {@code (s, 1, x, {}), (s, 1, x', {p}), (s, 2, x'', {})}

    +//

    {@code (s, 1, x, {}), (s, 1, x', {p}), (s, 2, xâ€, {})}

    // //

    If the configuration set has predicates (as indicated by // {@link ATNConfigSet//hasSemanticContext}), this algorithm makes a copy of // the configurations to strip out all of the predicates so that a standard // {@link ATNConfigSet} will merge everything ignoring predicates.

    -// func PredictionModehasSLLConflictTerminatingPrediction(mode int, configs ATNConfigSet) bool { // Configs in rule stop states indicate reaching the end of the decision // rule (local context) or end of start rule (full context). If all @@ -229,7 +227,6 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool { return true } -// // Full LL prediction termination. // //

    Can we stop looking ahead during ATN simulation or is there some @@ -334,7 +331,7 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool { // // //

  • {@code (s, 1, x)}, {@code (s, 2, x)}, {@code (s', 1, y)}, -// {@code (s', 2, y)}, {@code (s'', 1, z)} yields non-conflicting set +// {@code (s', 2, y)}, {@code (sâ€, 1, z)} yields non-conflicting set // {@code {1}} U conflicting sets {@code min({1,2})} U {@code min({1,2})} = // {@code {1}} => stop and predict 1
  • // @@ -369,31 +366,26 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool { // two or one and three so we keep going. We can only stop prediction when // we need exact ambiguity detection when the sets look like // {@code A={{1,2}}} or {@code {{1,2},{1,2}}}, etc...

    -// func PredictionModeresolvesToJustOneViableAlt(altsets []*BitSet) int { return PredictionModegetSingleViableAlt(altsets) } -// // Determines if every alternative subset in {@code altsets} contains more // than one alternative. // // @param altsets a collection of alternative subsets // @return {@code true} if every {@link BitSet} in {@code altsets} has // {@link BitSet//cardinality cardinality} > 1, otherwise {@code false} -// func PredictionModeallSubsetsConflict(altsets []*BitSet) bool { return !PredictionModehasNonConflictingAltSet(altsets) } -// // Determines if any single alternative subset in {@code altsets} contains // exactly one alternative. // // @param altsets a collection of alternative subsets // @return {@code true} if {@code altsets} contains a {@link BitSet} with // {@link BitSet//cardinality cardinality} 1, otherwise {@code false} -// func PredictionModehasNonConflictingAltSet(altsets []*BitSet) bool { for i := 0; i < len(altsets); i++ { alts := altsets[i] @@ -404,14 +396,12 @@ func PredictionModehasNonConflictingAltSet(altsets []*BitSet) bool { return false } -// // Determines if any single alternative subset in {@code altsets} contains // more than one alternative. // // @param altsets a collection of alternative subsets // @return {@code true} if {@code altsets} contains a {@link BitSet} with // {@link BitSet//cardinality cardinality} > 1, otherwise {@code false} -// func PredictionModehasConflictingAltSet(altsets []*BitSet) bool { for i := 0; i < len(altsets); i++ { alts := altsets[i] @@ -422,13 +412,11 @@ func PredictionModehasConflictingAltSet(altsets []*BitSet) bool { return false } -// // Determines if every alternative subset in {@code altsets} is equivalent. // // @param altsets a collection of alternative subsets // @return {@code true} if every member of {@code altsets} is equal to the // others, otherwise {@code false} -// func PredictionModeallSubsetsEqual(altsets []*BitSet) bool { var first *BitSet @@ -444,13 +432,11 @@ func PredictionModeallSubsetsEqual(altsets []*BitSet) bool { return true } -// // Returns the unique alternative predicted by all alternative subsets in // {@code altsets}. If no such alternative exists, this method returns // {@link ATN//INVALID_ALT_NUMBER}. // // @param altsets a collection of alternative subsets -// func PredictionModegetUniqueAlt(altsets []*BitSet) int { all := PredictionModeGetAlts(altsets) if all.length() == 1 { @@ -466,7 +452,6 @@ func PredictionModegetUniqueAlt(altsets []*BitSet) int { // // @param altsets a collection of alternative subsets // @return the set of represented alternatives in {@code altsets} -// func PredictionModeGetAlts(altsets []*BitSet) *BitSet { all := NewBitSet() for _, alts := range altsets { @@ -475,44 +460,35 @@ func PredictionModeGetAlts(altsets []*BitSet) *BitSet { return all } -// -// This func gets the conflicting alt subsets from a configuration set. +// PredictionModegetConflictingAltSubsets gets the conflicting alt subsets from a configuration set. // For each configuration {@code c} in {@code configs}: // //
     // map[c] U= c.{@link ATNConfig//alt alt} // map hash/equals uses s and x, not
     // alt and not pred
     // 
    -// func PredictionModegetConflictingAltSubsets(configs ATNConfigSet) []*BitSet { - configToAlts := make(map[int]*BitSet) + configToAlts := NewJMap[ATNConfig, *BitSet, *ATNAltConfigComparator[ATNConfig]](atnAltCfgEqInst) for _, c := range configs.GetItems() { - key := 31 * c.GetState().GetStateNumber() + c.GetContext().hash() - alts, ok := configToAlts[key] + alts, ok := configToAlts.Get(c) if !ok { alts = NewBitSet() - configToAlts[key] = alts + configToAlts.Put(c, alts) } alts.add(c.GetAlt()) } - values := make([]*BitSet, 0, 10) - for _, v := range configToAlts { - values = append(values, v) - } - return values + return configToAlts.Values() } -// -// Get a map from state to alt subset from a configuration set. For each +// PredictionModeGetStateToAltMap gets a map from state to alt subset from a configuration set. For each // configuration {@code c} in {@code configs}: // //
     // map[c.{@link ATNConfig//state state}] U= c.{@link ATNConfig//alt alt}
     // 
    -// func PredictionModeGetStateToAltMap(configs ATNConfigSet) *AltDict { m := NewAltDict() diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go similarity index 92% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go index 93efcf355..bfe542d09 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -49,7 +49,7 @@ var tokenTypeMapCache = make(map[string]int) var ruleIndexMapCache = make(map[string]int) func (b *BaseRecognizer) checkVersion(toolVersion string) { - runtimeVersion := "4.10.1" + runtimeVersion := "4.12.0" if runtimeVersion != toolVersion { fmt.Println("ANTLR runtime and generated code versions disagree: " + runtimeVersion + "!=" + toolVersion) } @@ -108,7 +108,6 @@ func (b *BaseRecognizer) SetState(v int) { // Get a map from rule names to rule indexes. // //

    Used for XPath and tree pattern compilation.

    -// func (b *BaseRecognizer) GetRuleIndexMap() map[string]int { panic("Method not defined!") @@ -171,18 +170,18 @@ func (b *BaseRecognizer) GetErrorHeader(e RecognitionException) string { } // How should a token be displayed in an error message? The default -// is to display just the text, but during development you might -// want to have a lot of information spit out. Override in that case -// to use t.String() (which, for CommonToken, dumps everything about -// the token). This is better than forcing you to override a method in -// your token objects because you don't have to go modify your lexer -// so that it creates a NewJava type. +// +// is to display just the text, but during development you might +// want to have a lot of information spit out. Override in that case +// to use t.String() (which, for CommonToken, dumps everything about +// the token). This is better than forcing you to override a method in +// your token objects because you don't have to go modify your lexer +// so that it creates a NewJava type. // // @deprecated This method is not called by the ANTLR 4 Runtime. Specific // implementations of {@link ANTLRErrorStrategy} may provide a similar // feature when necessary. For example, see // {@link DefaultErrorStrategy//GetTokenErrorDisplay}. -// func (b *BaseRecognizer) GetTokenErrorDisplay(t Token) string { if t == nil { return "" diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go similarity index 97% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go index 600cf8c06..210699ba2 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go similarity index 85% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go index 9ada43077..a702e99de 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -18,12 +18,12 @@ import ( // type SemanticContext interface { - comparable + Equals(other Collectable[SemanticContext]) bool + Hash() int evaluate(parser Recognizer, outerContext RuleContext) bool evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext - hash() int String() string } @@ -78,7 +78,7 @@ func NewPredicate(ruleIndex, predIndex int, isCtxDependent bool) *Predicate { //The default {@link SemanticContext}, which is semantically equivalent to //a predicate of the form {@code {true}?}. -var SemanticContextNone SemanticContext = NewPredicate(-1, -1, false) +var SemanticContextNone = NewPredicate(-1, -1, false) func (p *Predicate) evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext { return p @@ -95,7 +95,7 @@ func (p *Predicate) evaluate(parser Recognizer, outerContext RuleContext) bool { return parser.Sempred(localctx, p.ruleIndex, p.predIndex) } -func (p *Predicate) equals(other interface{}) bool { +func (p *Predicate) Equals(other Collectable[SemanticContext]) bool { if p == other { return true } else if _, ok := other.(*Predicate); !ok { @@ -107,7 +107,7 @@ func (p *Predicate) equals(other interface{}) bool { } } -func (p *Predicate) hash() int { +func (p *Predicate) Hash() int { h := murmurInit(0) h = murmurUpdate(h, p.ruleIndex) h = murmurUpdate(h, p.predIndex) @@ -151,17 +151,22 @@ func (p *PrecedencePredicate) compareTo(other *PrecedencePredicate) int { return p.precedence - other.precedence } -func (p *PrecedencePredicate) equals(other interface{}) bool { - if p == other { - return true - } else if _, ok := other.(*PrecedencePredicate); !ok { +func (p *PrecedencePredicate) Equals(other Collectable[SemanticContext]) bool { + + var op *PrecedencePredicate + var ok bool + if op, ok = other.(*PrecedencePredicate); !ok { return false - } else { - return p.precedence == other.(*PrecedencePredicate).precedence } + + if p == op { + return true + } + + return p.precedence == other.(*PrecedencePredicate).precedence } -func (p *PrecedencePredicate) hash() int { +func (p *PrecedencePredicate) Hash() int { h := uint32(1) h = 31*h + uint32(p.precedence) return int(h) @@ -171,10 +176,10 @@ func (p *PrecedencePredicate) String() string { return "{" + strconv.Itoa(p.precedence) + ">=prec}?" } -func PrecedencePredicatefilterPrecedencePredicates(set Set) []*PrecedencePredicate { +func PrecedencePredicatefilterPrecedencePredicates(set *JStore[SemanticContext, Comparator[SemanticContext]]) []*PrecedencePredicate { result := make([]*PrecedencePredicate, 0) - set.Each(func(v interface{}) bool { + set.Each(func(v SemanticContext) bool { if c2, ok := v.(*PrecedencePredicate); ok { result = append(result, c2) } @@ -193,21 +198,21 @@ type AND struct { func NewAND(a, b SemanticContext) *AND { - operands := newArray2DHashSet(nil, nil) + operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst) if aa, ok := a.(*AND); ok { for _, o := range aa.opnds { - operands.Add(o) + operands.Put(o) } } else { - operands.Add(a) + operands.Put(a) } if ba, ok := b.(*AND); ok { for _, o := range ba.opnds { - operands.Add(o) + operands.Put(o) } } else { - operands.Add(b) + operands.Put(b) } precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands) if len(precedencePredicates) > 0 { @@ -220,7 +225,7 @@ func NewAND(a, b SemanticContext) *AND { } } - operands.Add(reduced) + operands.Put(reduced) } vs := operands.Values() @@ -235,14 +240,15 @@ func NewAND(a, b SemanticContext) *AND { return and } -func (a *AND) equals(other interface{}) bool { +func (a *AND) Equals(other Collectable[SemanticContext]) bool { if a == other { return true - } else if _, ok := other.(*AND); !ok { + } + if _, ok := other.(*AND); !ok { return false } else { for i, v := range other.(*AND).opnds { - if !a.opnds[i].equals(v) { + if !a.opnds[i].Equals(v) { return false } } @@ -250,13 +256,11 @@ func (a *AND) equals(other interface{}) bool { } } -// // {@inheritDoc} // //

    // The evaluation of predicates by a context is short-circuiting, but // unordered.

    -// func (a *AND) evaluate(parser Recognizer, outerContext RuleContext) bool { for i := 0; i < len(a.opnds); i++ { if !a.opnds[i].evaluate(parser, outerContext) { @@ -304,18 +308,18 @@ func (a *AND) evalPrecedence(parser Recognizer, outerContext RuleContext) Semant return result } -func (a *AND) hash() int { +func (a *AND) Hash() int { h := murmurInit(37) // Init with a value different from OR for _, op := range a.opnds { - h = murmurUpdate(h, op.hash()) + h = murmurUpdate(h, op.Hash()) } return murmurFinish(h, len(a.opnds)) } -func (a *OR) hash() int { +func (a *OR) Hash() int { h := murmurInit(41) // Init with a value different from AND for _, op := range a.opnds { - h = murmurUpdate(h, op.hash()) + h = murmurUpdate(h, op.Hash()) } return murmurFinish(h, len(a.opnds)) } @@ -345,21 +349,21 @@ type OR struct { func NewOR(a, b SemanticContext) *OR { - operands := newArray2DHashSet(nil, nil) + operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst) if aa, ok := a.(*OR); ok { for _, o := range aa.opnds { - operands.Add(o) + operands.Put(o) } } else { - operands.Add(a) + operands.Put(a) } if ba, ok := b.(*OR); ok { for _, o := range ba.opnds { - operands.Add(o) + operands.Put(o) } } else { - operands.Add(b) + operands.Put(b) } precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands) if len(precedencePredicates) > 0 { @@ -372,7 +376,7 @@ func NewOR(a, b SemanticContext) *OR { } } - operands.Add(reduced) + operands.Put(reduced) } vs := operands.Values() @@ -388,14 +392,14 @@ func NewOR(a, b SemanticContext) *OR { return o } -func (o *OR) equals(other interface{}) bool { +func (o *OR) Equals(other Collectable[SemanticContext]) bool { if o == other { return true } else if _, ok := other.(*OR); !ok { return false } else { for i, v := range other.(*OR).opnds { - if !o.opnds[i].equals(v) { + if !o.opnds[i].Equals(v) { return false } } @@ -406,7 +410,6 @@ func (o *OR) equals(other interface{}) bool { //

    // The evaluation of predicates by o context is short-circuiting, but // unordered.

    -// func (o *OR) evaluate(parser Recognizer, outerContext RuleContext) bool { for i := 0; i < len(o.opnds); i++ { if o.opnds[i].evaluate(parser, outerContext) { diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go similarity index 98% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go index 2d8e99095..f73b06bc6 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. @@ -158,7 +158,6 @@ func NewCommonToken(source *TokenSourceCharStreamPair, tokenType, channel, start // {@link Token//GetInputStream}.

    // // @param oldToken The token to copy. -// func (c *CommonToken) clone() *CommonToken { t := NewCommonToken(c.source, c.tokenType, c.channel, c.start, c.stop) t.tokenIndex = c.GetTokenIndex() diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go similarity index 85% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go index e023978fe..a3f36eaa6 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go similarity index 87% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go index df92c8147..1527d43f6 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. diff --git a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go similarity index 58% rename from tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go rename to tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go index 96a03f02a..b3e38af34 100644 --- a/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go +++ b/tools/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go @@ -1,15 +1,15 @@ -// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. +// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved. // Use of this file is governed by the BSD 3-clause license that // can be found in the LICENSE.txt file in the project root. + package antlr import ( -"bytes" -"fmt" + "bytes" + "fmt" ) - -// +// // Useful for rewriting out a buffered input token stream after doing some // augmentation or other manipulations on it. @@ -85,12 +85,10 @@ import ( // If you don't use named rewrite streams, a "default" stream is used as the // first example shows.

    - - -const( +const ( Default_Program_Name = "default" - Program_Init_Size = 100 - Min_Token_Index = 0 + Program_Init_Size = 100 + Min_Token_Index = 0 ) // Define the rewrite operation hierarchy @@ -98,13 +96,13 @@ const( type RewriteOperation interface { // Execute the rewrite operation by possibly adding to the buffer. // Return the index of the next token to operate on. - Execute(buffer *bytes.Buffer) int - String() string - GetInstructionIndex() int - GetIndex() int - GetText() string - GetOpName() string - GetTokens() TokenStream + Execute(buffer *bytes.Buffer) int + String() string + GetInstructionIndex() int + GetIndex() int + GetText() string + GetOpName() string + GetTokens() TokenStream SetInstructionIndex(val int) SetIndex(int) SetText(string) @@ -114,63 +112,62 @@ type RewriteOperation interface { type BaseRewriteOperation struct { //Current index of rewrites list - instruction_index int + instruction_index int //Token buffer index - index int + index int //Substitution text - text string + text string //Actual operation name - op_name string + op_name string //Pointer to token steam - tokens TokenStream + tokens TokenStream } -func (op *BaseRewriteOperation)GetInstructionIndex() int{ +func (op *BaseRewriteOperation) GetInstructionIndex() int { return op.instruction_index } -func (op *BaseRewriteOperation)GetIndex() int{ +func (op *BaseRewriteOperation) GetIndex() int { return op.index } -func (op *BaseRewriteOperation)GetText() string{ +func (op *BaseRewriteOperation) GetText() string { return op.text } -func (op *BaseRewriteOperation)GetOpName() string{ +func (op *BaseRewriteOperation) GetOpName() string { return op.op_name } -func (op *BaseRewriteOperation)GetTokens() TokenStream{ +func (op *BaseRewriteOperation) GetTokens() TokenStream { return op.tokens } -func (op *BaseRewriteOperation)SetInstructionIndex(val int){ +func (op *BaseRewriteOperation) SetInstructionIndex(val int) { op.instruction_index = val } -func (op *BaseRewriteOperation)SetIndex(val int) { +func (op *BaseRewriteOperation) SetIndex(val int) { op.index = val } -func (op *BaseRewriteOperation)SetText(val string){ +func (op *BaseRewriteOperation) SetText(val string) { op.text = val } -func (op *BaseRewriteOperation)SetOpName(val string){ +func (op *BaseRewriteOperation) SetOpName(val string) { op.op_name = val } -func (op *BaseRewriteOperation)SetTokens(val TokenStream) { +func (op *BaseRewriteOperation) SetTokens(val TokenStream) { op.tokens = val } - -func (op *BaseRewriteOperation) Execute(buffer *bytes.Buffer) int{ +func (op *BaseRewriteOperation) Execute(buffer *bytes.Buffer) int { return op.index } -func (op *BaseRewriteOperation) String() string { +func (op *BaseRewriteOperation) String() string { return fmt.Sprintf("<%s@%d:\"%s\">", op.op_name, op.tokens.Get(op.GetIndex()), @@ -179,26 +176,25 @@ func (op *BaseRewriteOperation) String() string { } - type InsertBeforeOp struct { BaseRewriteOperation } -func NewInsertBeforeOp(index int, text string, stream TokenStream) *InsertBeforeOp{ - return &InsertBeforeOp{BaseRewriteOperation:BaseRewriteOperation{ - index:index, - text:text, - op_name:"InsertBeforeOp", - tokens:stream, +func NewInsertBeforeOp(index int, text string, stream TokenStream) *InsertBeforeOp { + return &InsertBeforeOp{BaseRewriteOperation: BaseRewriteOperation{ + index: index, + text: text, + op_name: "InsertBeforeOp", + tokens: stream, }} } -func (op *InsertBeforeOp) Execute(buffer *bytes.Buffer) int{ +func (op *InsertBeforeOp) Execute(buffer *bytes.Buffer) int { buffer.WriteString(op.text) - if op.tokens.Get(op.index).GetTokenType() != TokenEOF{ + if op.tokens.Get(op.index).GetTokenType() != TokenEOF { buffer.WriteString(op.tokens.Get(op.index).GetText()) } - return op.index+1 + return op.index + 1 } func (op *InsertBeforeOp) String() string { @@ -213,20 +209,20 @@ type InsertAfterOp struct { BaseRewriteOperation } -func NewInsertAfterOp(index int, text string, stream TokenStream) *InsertAfterOp{ - return &InsertAfterOp{BaseRewriteOperation:BaseRewriteOperation{ - index:index+1, - text:text, - tokens:stream, +func NewInsertAfterOp(index int, text string, stream TokenStream) *InsertAfterOp { + return &InsertAfterOp{BaseRewriteOperation: BaseRewriteOperation{ + index: index + 1, + text: text, + tokens: stream, }} } func (op *InsertAfterOp) Execute(buffer *bytes.Buffer) int { buffer.WriteString(op.text) - if op.tokens.Get(op.index).GetTokenType() != TokenEOF{ + if op.tokens.Get(op.index).GetTokenType() != TokenEOF { buffer.WriteString(op.tokens.Get(op.index).GetText()) } - return op.index+1 + return op.index + 1 } func (op *InsertAfterOp) String() string { @@ -235,28 +231,28 @@ func (op *InsertAfterOp) String() string { // I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp // instructions. -type ReplaceOp struct{ +type ReplaceOp struct { BaseRewriteOperation LastIndex int } -func NewReplaceOp(from, to int, text string, stream TokenStream)*ReplaceOp { +func NewReplaceOp(from, to int, text string, stream TokenStream) *ReplaceOp { return &ReplaceOp{ - BaseRewriteOperation:BaseRewriteOperation{ - index:from, - text:text, - op_name:"ReplaceOp", - tokens:stream, + BaseRewriteOperation: BaseRewriteOperation{ + index: from, + text: text, + op_name: "ReplaceOp", + tokens: stream, }, - LastIndex:to, + LastIndex: to, } } -func (op *ReplaceOp)Execute(buffer *bytes.Buffer) int{ - if op.text != ""{ +func (op *ReplaceOp) Execute(buffer *bytes.Buffer) int { + if op.text != "" { buffer.WriteString(op.text) } - return op.LastIndex +1 + return op.LastIndex + 1 } func (op *ReplaceOp) String() string { @@ -268,54 +264,54 @@ func (op *ReplaceOp) String() string { op.tokens.Get(op.index), op.tokens.Get(op.LastIndex), op.text) } - type TokenStreamRewriter struct { //Our source stream - tokens TokenStream + tokens TokenStream // You may have multiple, named streams of rewrite operations. // I'm calling these things "programs." // Maps String (name) → rewrite (List) - programs map[string][]RewriteOperation - last_rewrite_token_indexes map[string]int + programs map[string][]RewriteOperation + last_rewrite_token_indexes map[string]int } -func NewTokenStreamRewriter(tokens TokenStream) *TokenStreamRewriter{ +func NewTokenStreamRewriter(tokens TokenStream) *TokenStreamRewriter { return &TokenStreamRewriter{ - tokens: tokens, - programs: map[string][]RewriteOperation{ - Default_Program_Name:make([]RewriteOperation,0, Program_Init_Size), + tokens: tokens, + programs: map[string][]RewriteOperation{ + Default_Program_Name: make([]RewriteOperation, 0, Program_Init_Size), }, - last_rewrite_token_indexes: map[string]int{}, + last_rewrite_token_indexes: map[string]int{}, } } -func (tsr *TokenStreamRewriter) GetTokenStream() TokenStream{ +func (tsr *TokenStreamRewriter) GetTokenStream() TokenStream { return tsr.tokens } -// Rollback the instruction stream for a program so that -// the indicated instruction (via instructionIndex) is no -// longer in the stream. UNTESTED! -func (tsr *TokenStreamRewriter) Rollback(program_name string, instruction_index int){ - is, ok := tsr.programs[program_name] - if ok{ +// Rollback the instruction stream for a program so that +// the indicated instruction (via instructionIndex) is no +// longer in the stream. UNTESTED! +func (tsr *TokenStreamRewriter) Rollback(program_name string, instruction_index int) { + is, ok := tsr.programs[program_name] + if ok { tsr.programs[program_name] = is[Min_Token_Index:instruction_index] } } -func (tsr *TokenStreamRewriter) RollbackDefault(instruction_index int){ +func (tsr *TokenStreamRewriter) RollbackDefault(instruction_index int) { tsr.Rollback(Default_Program_Name, instruction_index) } -//Reset the program so that no instructions exist -func (tsr *TokenStreamRewriter) DeleteProgram(program_name string){ + +// Reset the program so that no instructions exist +func (tsr *TokenStreamRewriter) DeleteProgram(program_name string) { tsr.Rollback(program_name, Min_Token_Index) //TODO: double test on that cause lower bound is not included } -func (tsr *TokenStreamRewriter) DeleteProgramDefault(){ +func (tsr *TokenStreamRewriter) DeleteProgramDefault() { tsr.DeleteProgram(Default_Program_Name) } -func (tsr *TokenStreamRewriter) InsertAfter(program_name string, index int, text string){ +func (tsr *TokenStreamRewriter) InsertAfter(program_name string, index int, text string) { // to insert after, just insert before next index (even if past end) var op RewriteOperation = NewInsertAfterOp(index, text, tsr.tokens) rewrites := tsr.GetProgram(program_name) @@ -323,31 +319,31 @@ func (tsr *TokenStreamRewriter) InsertAfter(program_name string, index int, text tsr.AddToProgram(program_name, op) } -func (tsr *TokenStreamRewriter) InsertAfterDefault(index int, text string){ +func (tsr *TokenStreamRewriter) InsertAfterDefault(index int, text string) { tsr.InsertAfter(Default_Program_Name, index, text) } -func (tsr *TokenStreamRewriter) InsertAfterToken(program_name string, token Token, text string){ +func (tsr *TokenStreamRewriter) InsertAfterToken(program_name string, token Token, text string) { tsr.InsertAfter(program_name, token.GetTokenIndex(), text) } -func (tsr* TokenStreamRewriter) InsertBefore(program_name string, index int, text string){ +func (tsr *TokenStreamRewriter) InsertBefore(program_name string, index int, text string) { var op RewriteOperation = NewInsertBeforeOp(index, text, tsr.tokens) rewrites := tsr.GetProgram(program_name) op.SetInstructionIndex(len(rewrites)) tsr.AddToProgram(program_name, op) } -func (tsr *TokenStreamRewriter) InsertBeforeDefault(index int, text string){ +func (tsr *TokenStreamRewriter) InsertBeforeDefault(index int, text string) { tsr.InsertBefore(Default_Program_Name, index, text) } -func (tsr *TokenStreamRewriter) InsertBeforeToken(program_name string,token Token, text string){ +func (tsr *TokenStreamRewriter) InsertBeforeToken(program_name string, token Token, text string) { tsr.InsertBefore(program_name, token.GetTokenIndex(), text) } -func (tsr *TokenStreamRewriter) Replace(program_name string, from, to int, text string){ - if from > to || from < 0 || to < 0 || to >= tsr.tokens.Size(){ +func (tsr *TokenStreamRewriter) Replace(program_name string, from, to int, text string) { + if from > to || from < 0 || to < 0 || to >= tsr.tokens.Size() { panic(fmt.Sprintf("replace: range invalid: %d..%d(size=%d)", from, to, tsr.tokens.Size())) } @@ -357,207 +353,216 @@ func (tsr *TokenStreamRewriter) Replace(program_name string, from, to int, text tsr.AddToProgram(program_name, op) } -func (tsr *TokenStreamRewriter)ReplaceDefault(from, to int, text string) { +func (tsr *TokenStreamRewriter) ReplaceDefault(from, to int, text string) { tsr.Replace(Default_Program_Name, from, to, text) } -func (tsr *TokenStreamRewriter)ReplaceDefaultPos(index int, text string){ +func (tsr *TokenStreamRewriter) ReplaceDefaultPos(index int, text string) { tsr.ReplaceDefault(index, index, text) } -func (tsr *TokenStreamRewriter)ReplaceToken(program_name string, from, to Token, text string){ +func (tsr *TokenStreamRewriter) ReplaceToken(program_name string, from, to Token, text string) { tsr.Replace(program_name, from.GetTokenIndex(), to.GetTokenIndex(), text) } -func (tsr *TokenStreamRewriter)ReplaceTokenDefault(from, to Token, text string){ +func (tsr *TokenStreamRewriter) ReplaceTokenDefault(from, to Token, text string) { tsr.ReplaceToken(Default_Program_Name, from, to, text) } -func (tsr *TokenStreamRewriter)ReplaceTokenDefaultPos(index Token, text string){ +func (tsr *TokenStreamRewriter) ReplaceTokenDefaultPos(index Token, text string) { tsr.ReplaceTokenDefault(index, index, text) } -func (tsr *TokenStreamRewriter)Delete(program_name string, from, to int){ - tsr.Replace(program_name, from, to, "" ) +func (tsr *TokenStreamRewriter) Delete(program_name string, from, to int) { + tsr.Replace(program_name, from, to, "") } -func (tsr *TokenStreamRewriter)DeleteDefault(from, to int){ +func (tsr *TokenStreamRewriter) DeleteDefault(from, to int) { tsr.Delete(Default_Program_Name, from, to) } -func (tsr *TokenStreamRewriter)DeleteDefaultPos(index int){ - tsr.DeleteDefault(index,index) +func (tsr *TokenStreamRewriter) DeleteDefaultPos(index int) { + tsr.DeleteDefault(index, index) } -func (tsr *TokenStreamRewriter)DeleteToken(program_name string, from, to Token) { +func (tsr *TokenStreamRewriter) DeleteToken(program_name string, from, to Token) { tsr.ReplaceToken(program_name, from, to, "") } -func (tsr *TokenStreamRewriter)DeleteTokenDefault(from,to Token){ +func (tsr *TokenStreamRewriter) DeleteTokenDefault(from, to Token) { tsr.DeleteToken(Default_Program_Name, from, to) } -func (tsr *TokenStreamRewriter)GetLastRewriteTokenIndex(program_name string)int { +func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndex(program_name string) int { i, ok := tsr.last_rewrite_token_indexes[program_name] - if !ok{ + if !ok { return -1 } return i } -func (tsr *TokenStreamRewriter)GetLastRewriteTokenIndexDefault()int{ +func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndexDefault() int { return tsr.GetLastRewriteTokenIndex(Default_Program_Name) } -func (tsr *TokenStreamRewriter)SetLastRewriteTokenIndex(program_name string, i int){ +func (tsr *TokenStreamRewriter) SetLastRewriteTokenIndex(program_name string, i int) { tsr.last_rewrite_token_indexes[program_name] = i } -func (tsr *TokenStreamRewriter)InitializeProgram(name string)[]RewriteOperation{ +func (tsr *TokenStreamRewriter) InitializeProgram(name string) []RewriteOperation { is := make([]RewriteOperation, 0, Program_Init_Size) tsr.programs[name] = is return is } -func (tsr *TokenStreamRewriter)AddToProgram(name string, op RewriteOperation){ +func (tsr *TokenStreamRewriter) AddToProgram(name string, op RewriteOperation) { is := tsr.GetProgram(name) is = append(is, op) tsr.programs[name] = is } -func (tsr *TokenStreamRewriter)GetProgram(name string) []RewriteOperation { +func (tsr *TokenStreamRewriter) GetProgram(name string) []RewriteOperation { is, ok := tsr.programs[name] - if !ok{ + if !ok { is = tsr.InitializeProgram(name) } return is } -// Return the text from the original tokens altered per the -// instructions given to this rewriter. -func (tsr *TokenStreamRewriter)GetTextDefault() string{ + +// Return the text from the original tokens altered per the +// instructions given to this rewriter. +func (tsr *TokenStreamRewriter) GetTextDefault() string { return tsr.GetText( Default_Program_Name, NewInterval(0, tsr.tokens.Size()-1)) } -// Return the text from the original tokens altered per the -// instructions given to this rewriter. -func (tsr *TokenStreamRewriter)GetText(program_name string, interval *Interval) string { + +// Return the text from the original tokens altered per the +// instructions given to this rewriter. +func (tsr *TokenStreamRewriter) GetText(program_name string, interval *Interval) string { rewrites := tsr.programs[program_name] start := interval.Start - stop := interval.Stop + stop := interval.Stop // ensure start/end are in range stop = min(stop, tsr.tokens.Size()-1) - start = max(start,0) - if rewrites == nil || len(rewrites) == 0{ + start = max(start, 0) + if rewrites == nil || len(rewrites) == 0 { return tsr.tokens.GetTextFromInterval(interval) // no instructions to execute } buf := bytes.Buffer{} // First, optimize instruction stream indexToOp := reduceToSingleOperationPerIndex(rewrites) // Walk buffer, executing instructions and emitting tokens - for i:=start; i<=stop && i= tsr.tokens.Size()-1 {buf.WriteString(op.GetText())} + for _, op := range indexToOp { + if op.GetIndex() >= tsr.tokens.Size()-1 { + buf.WriteString(op.GetText()) + } } } return buf.String() } -// We need to combine operations and report invalid operations (like -// overlapping replaces that are not completed nested). Inserts to -// same index need to be combined etc... Here are the cases: +// We need to combine operations and report invalid operations (like +// overlapping replaces that are not completed nested). Inserts to +// same index need to be combined etc... Here are the cases: // -// I.i.u I.j.v leave alone, nonoverlapping -// I.i.u I.i.v combine: Iivu +// I.i.u I.j.v leave alone, nonoverlapping +// I.i.u I.i.v combine: Iivu // -// R.i-j.u R.x-y.v | i-j in x-y delete first R -// R.i-j.u R.i-j.v delete first R -// R.i-j.u R.x-y.v | x-y in i-j ERROR -// R.i-j.u R.x-y.v | boundaries overlap ERROR +// R.i-j.u R.x-y.v | i-j in x-y delete first R +// R.i-j.u R.i-j.v delete first R +// R.i-j.u R.x-y.v | x-y in i-j ERROR +// R.i-j.u R.x-y.v | boundaries overlap ERROR // -// Delete special case of replace (text==null): -// D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right) +// Delete special case of replace (text==null): +// D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right) // -// I.i.u R.x-y.v | i in (x+1)-y delete I (since insert before -// we're not deleting i) -// I.i.u R.x-y.v | i not in (x+1)-y leave alone, nonoverlapping -// R.x-y.v I.i.u | i in x-y ERROR -// R.x-y.v I.x.u R.x-y.uv (combine, delete I) -// R.x-y.v I.i.u | i not in x-y leave alone, nonoverlapping +// I.i.u R.x-y.v | i in (x+1)-y delete I (since insert before +// we're not deleting i) +// I.i.u R.x-y.v | i not in (x+1)-y leave alone, nonoverlapping +// R.x-y.v I.i.u | i in x-y ERROR +// R.x-y.v I.x.u R.x-y.uv (combine, delete I) +// R.x-y.v I.i.u | i not in x-y leave alone, nonoverlapping // -// I.i.u = insert u before op @ index i -// R.x-y.u = replace x-y indexed tokens with u +// I.i.u = insert u before op @ index i +// R.x-y.u = replace x-y indexed tokens with u // -// First we need to examine replaces. For any replace op: +// First we need to examine replaces. For any replace op: // -// 1. wipe out any insertions before op within that range. -// 2. Drop any replace op before that is contained completely within -// that range. -// 3. Throw exception upon boundary overlap with any previous replace. +// 1. wipe out any insertions before op within that range. +// 2. Drop any replace op before that is contained completely within +// that range. +// 3. Throw exception upon boundary overlap with any previous replace. // -// Then we can deal with inserts: +// Then we can deal with inserts: // -// 1. for any inserts to same index, combine even if not adjacent. -// 2. for any prior replace with same left boundary, combine this -// insert with replace and delete this replace. -// 3. throw exception if index in same range as previous replace +// 1. for any inserts to same index, combine even if not adjacent. +// 2. for any prior replace with same left boundary, combine this +// insert with replace and delete this replace. +// 3. throw exception if index in same range as previous replace // -// Don't actually delete; make op null in list. Easier to walk list. -// Later we can throw as we add to index → op map. +// Don't actually delete; make op null in list. Easier to walk list. +// Later we can throw as we add to index → op map. // -// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the -// inserted stuff would be before the replace range. But, if you -// add tokens in front of a method body '{' and then delete the method -// body, I think the stuff before the '{' you added should disappear too. +// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the +// inserted stuff would be before the replace range. But, if you +// add tokens in front of a method body '{' and then delete the method +// body, I think the stuff before the '{' you added should disappear too. // -// Return a map from token index to operation. -// -func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]RewriteOperation{ +// Return a map from token index to operation. +func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]RewriteOperation { // WALK REPLACES - for i:=0; i < len(rewrites); i++{ + for i := 0; i < len(rewrites); i++ { op := rewrites[i] - if op == nil{continue} + if op == nil { + continue + } rop, ok := op.(*ReplaceOp) - if !ok{continue} + if !ok { + continue + } // Wipe prior inserts within range - for j:=0; j rop.index && iop.index <=rop.LastIndex{ + } else if iop.index > rop.index && iop.index <= rop.LastIndex { // delete insert as it's a no-op. rewrites[iop.instruction_index] = nil } } } // Drop any prior replaces contained within - for j:=0; j=rop.index && prevop.LastIndex <= rop.LastIndex{ + for j := 0; j < i && j < len(rewrites); j++ { + if prevop, ok := rewrites[j].(*ReplaceOp); ok { + if prevop.index >= rop.index && prevop.LastIndex <= rop.LastIndex { // delete replace as it's a no-op. rewrites[prevop.instruction_index] = nil continue @@ -566,61 +571,67 @@ func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]Rewrit disjoint := prevop.LastIndex < rop.index || prevop.index > rop.LastIndex // Delete special case of replace (text==null): // D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right) - if prevop.text == "" && rop.text == "" && !disjoint{ + if prevop.text == "" && rop.text == "" && !disjoint { rewrites[prevop.instruction_index] = nil rop.index = min(prevop.index, rop.index) rop.LastIndex = max(prevop.LastIndex, rop.LastIndex) println("new rop" + rop.String()) //TODO: remove console write, taken from Java version - }else if !disjoint{ + } else if !disjoint { panic("replace op boundaries of " + rop.String() + " overlap with previous " + prevop.String()) } } } } // WALK INSERTS - for i:=0; i < len(rewrites); i++ { + for i := 0; i < len(rewrites); i++ { op := rewrites[i] - if op == nil{continue} + if op == nil { + continue + } //hack to replicate inheritance in composition _, iok := rewrites[i].(*InsertBeforeOp) _, aok := rewrites[i].(*InsertAfterOp) - if !iok && !aok{continue} + if !iok && !aok { + continue + } iop := rewrites[i] // combine current insert with prior if any at same index // deviating a bit from TokenStreamRewriter.java - hard to incorporate inheritance logic - for j:=0; j= rop.index && iop.GetIndex() <= rop.LastIndex{ - panic("insert op "+iop.String()+" within boundaries of previous "+rop.String()) + if iop.GetIndex() >= rop.index && iop.GetIndex() <= rop.LastIndex { + panic("insert op " + iop.String() + " within boundaries of previous " + rop.String()) } } } } m := map[int]RewriteOperation{} - for i:=0; i < len(rewrites); i++{ + for i := 0; i < len(rewrites); i++ { op := rewrites[i] - if op == nil {continue} - if _, ok := m[op.GetIndex()]; ok{ + if op == nil { + continue + } + if _, ok := m[op.GetIndex()]; ok { panic("should only be one op per index") } m[op.GetIndex()] = op @@ -628,22 +639,21 @@ func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]Rewrit return m } - /* Quick fixing Go lack of overloads - */ +*/ -func max(a,b int)int{ - if a>b{ +func max(a, b int) int { + if a > b { return a - }else { + } else { return b } } -func min(a,b int)int{ - if a as.threshold { as.expand() } @@ -98,7 +96,7 @@ func (as *array2DHashSet) expand() { b := as.getBuckets(o) bucketLength := newBucketLengths[b] - var newBucket []interface{} + var newBucket []Collectable[any] if bucketLength == 0 { // new bucket newBucket = as.createBucket(as.initialBucketCapacity) @@ -107,7 +105,7 @@ func (as *array2DHashSet) expand() { newBucket = newTable[b] if bucketLength == len(newBucket) { // expand - newBucketCopy := make([]interface{}, len(newBucket)<<1) + newBucketCopy := make([]Collectable[any], len(newBucket)<<1) copy(newBucketCopy[:bucketLength], newBucket) newBucket = newBucketCopy newTable[b] = newBucket @@ -124,7 +122,7 @@ func (as *array2DHashSet) Len() int { return as.n } -func (as *array2DHashSet) Get(o interface{}) interface{} { +func (as *array2DHashSet) Get(o Collectable[any]) interface{} { if o == nil { return nil } @@ -147,7 +145,7 @@ func (as *array2DHashSet) Get(o interface{}) interface{} { return nil } -func (as *array2DHashSet) innerAdd(o interface{}) interface{} { +func (as *array2DHashSet) innerAdd(o Collectable[any]) interface{} { b := as.getBuckets(o) bucket := as.buckets[b] @@ -178,7 +176,7 @@ func (as *array2DHashSet) innerAdd(o interface{}) interface{} { // full bucket, expand and add to end oldLength := len(bucket) - bucketCopy := make([]interface{}, oldLength<<1) + bucketCopy := make([]Collectable[any], oldLength<<1) copy(bucketCopy[:oldLength], bucket) bucket = bucketCopy as.buckets[b] = bucket @@ -187,22 +185,22 @@ func (as *array2DHashSet) innerAdd(o interface{}) interface{} { return o } -func (as *array2DHashSet) getBuckets(value interface{}) int { +func (as *array2DHashSet) getBuckets(value Collectable[any]) int { hash := as.hashcodeFunction(value) return hash & (len(as.buckets) - 1) } -func (as *array2DHashSet) createBuckets(cap int) [][]interface{} { - return make([][]interface{}, cap) +func (as *array2DHashSet) createBuckets(cap int) [][]Collectable[any] { + return make([][]Collectable[any], cap) } -func (as *array2DHashSet) createBucket(cap int) []interface{} { - return make([]interface{}, cap) +func (as *array2DHashSet) createBucket(cap int) []Collectable[any] { + return make([]Collectable[any], cap) } func newArray2DHashSetWithCap( hashcodeFunction func(interface{}) int, - equalsFunction func(interface{}, interface{}) bool, + equalsFunction func(Collectable[any], Collectable[any]) bool, initCap int, initBucketCap int, ) *array2DHashSet { @@ -231,7 +229,7 @@ func newArray2DHashSetWithCap( func newArray2DHashSet( hashcodeFunction func(interface{}) int, - equalsFunction func(interface{}, interface{}) bool, + equalsFunction func(Collectable[any], Collectable[any]) bool, ) *array2DHashSet { return newArray2DHashSetWithCap(hashcodeFunction, equalsFunction, _initalCapacity, _initalBucketCapacity) } diff --git a/tools/vendor/github.com/asaskevich/govalidator/validator.go b/tools/vendor/github.com/asaskevich/govalidator/validator.go index 46ecfc84a..c9c4fac06 100644 --- a/tools/vendor/github.com/asaskevich/govalidator/validator.go +++ b/tools/vendor/github.com/asaskevich/govalidator/validator.go @@ -454,27 +454,26 @@ func IsCreditCard(str string) bool { if !rxCreditCard.MatchString(sanitized) { return false } + + number, _ := ToInt(sanitized) + number, lastDigit := number / 10, number % 10 + var sum int64 - var digit string - var tmpNum int64 - var shouldDouble bool - for i := len(sanitized) - 1; i >= 0; i-- { - digit = sanitized[i:(i + 1)] - tmpNum, _ = ToInt(digit) - if shouldDouble { - tmpNum *= 2 - if tmpNum >= 10 { - sum += (tmpNum % 10) + 1 - } else { - sum += tmpNum + for i:=0; number > 0; i++ { + digit := number % 10 + + if i % 2 == 0 { + digit *= 2 + if digit > 9 { + digit -= 9 } - } else { - sum += tmpNum } - shouldDouble = !shouldDouble + + sum += digit + number = number / 10 } - - return sum%10 == 0 + + return (sum + lastDigit) % 10 == 0 } // IsISBN10 checks if the string is an ISBN version 10. diff --git a/tools/vendor/github.com/cenkalti/backoff/v4/.travis.yml b/tools/vendor/github.com/cenkalti/backoff/v4/.travis.yml deleted file mode 100644 index c79105c2f..000000000 --- a/tools/vendor/github.com/cenkalti/backoff/v4/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go -go: - - 1.13 - - 1.x - - tip -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/tools/vendor/github.com/cenkalti/backoff/v4/retry.go b/tools/vendor/github.com/cenkalti/backoff/v4/retry.go index 1ce2507eb..b9c0c51cd 100644 --- a/tools/vendor/github.com/cenkalti/backoff/v4/retry.go +++ b/tools/vendor/github.com/cenkalti/backoff/v4/retry.go @@ -5,10 +5,20 @@ import ( "time" ) +// An OperationWithData is executing by RetryWithData() or RetryNotifyWithData(). +// The operation will be retried using a backoff policy if it returns an error. +type OperationWithData[T any] func() (T, error) + // An Operation is executing by Retry() or RetryNotify(). // The operation will be retried using a backoff policy if it returns an error. type Operation func() error +func (o Operation) withEmptyData() OperationWithData[struct{}] { + return func() (struct{}, error) { + return struct{}{}, o() + } +} + // Notify is a notify-on-error function. It receives an operation error and // backoff delay if the operation failed (with an error). // @@ -28,18 +38,41 @@ func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } +// RetryWithData is like Retry but returns data in the response too. +func RetryWithData[T any](o OperationWithData[T], b BackOff) (T, error) { + return RetryNotifyWithData(o, b, nil) +} + // RetryNotify calls notify function with the error and wait duration // for each failed attempt before sleep. func RetryNotify(operation Operation, b BackOff, notify Notify) error { return RetryNotifyWithTimer(operation, b, notify, nil) } +// RetryNotifyWithData is like RetryNotify but returns data in the response too. +func RetryNotifyWithData[T any](operation OperationWithData[T], b BackOff, notify Notify) (T, error) { + return doRetryNotify(operation, b, notify, nil) +} + // RetryNotifyWithTimer calls notify function with the error and wait duration using the given Timer // for each failed attempt before sleep. // A default timer that uses system timer is used when nil is passed. func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify, t Timer) error { - var err error - var next time.Duration + _, err := doRetryNotify(operation.withEmptyData(), b, notify, t) + return err +} + +// RetryNotifyWithTimerAndData is like RetryNotifyWithTimer but returns data in the response too. +func RetryNotifyWithTimerAndData[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) { + return doRetryNotify(operation, b, notify, t) +} + +func doRetryNotify[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) { + var ( + err error + next time.Duration + res T + ) if t == nil { t = &defaultTimer{} } @@ -52,21 +85,22 @@ func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify, t Timer b.Reset() for { - if err = operation(); err == nil { - return nil + res, err = operation() + if err == nil { + return res, nil } var permanent *PermanentError if errors.As(err, &permanent) { - return permanent.Err + return res, permanent.Err } if next = b.NextBackOff(); next == Stop { if cerr := ctx.Err(); cerr != nil { - return cerr + return res, cerr } - return err + return res, err } if notify != nil { @@ -77,7 +111,7 @@ func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify, t Timer select { case <-ctx.Done(): - return ctx.Err() + return res, ctx.Err() case <-t.C(): } } diff --git a/tools/vendor/github.com/cespare/xxhash/v2/README.md b/tools/vendor/github.com/cespare/xxhash/v2/README.md index 792b4a60b..8bf0e5b78 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/README.md +++ b/tools/vendor/github.com/cespare/xxhash/v2/README.md @@ -3,8 +3,7 @@ [![Go Reference](https://pkg.go.dev/badge/github.com/cespare/xxhash/v2.svg)](https://pkg.go.dev/github.com/cespare/xxhash/v2) [![Test](https://github.com/cespare/xxhash/actions/workflows/test.yml/badge.svg)](https://github.com/cespare/xxhash/actions/workflows/test.yml) -xxhash is a Go implementation of the 64-bit -[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a +xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a high-quality hashing algorithm that is much faster than anything in the Go standard library. @@ -25,8 +24,11 @@ func (*Digest) WriteString(string) (int, error) func (*Digest) Sum64() uint64 ``` -This implementation provides a fast pure-Go implementation and an even faster -assembly implementation for amd64. +The package is written with optimized pure Go and also contains even faster +assembly implementations for amd64 and arm64. If desired, the `purego` build tag +opts into using the Go code even on those architectures. + +[xxHash]: http://cyan4973.github.io/xxHash/ ## Compatibility @@ -45,19 +47,20 @@ I recommend using the latest release of Go. Here are some quick benchmarks comparing the pure-Go and assembly implementations of Sum64. -| input size | purego | asm | -| --- | --- | --- | -| 5 B | 979.66 MB/s | 1291.17 MB/s | -| 100 B | 7475.26 MB/s | 7973.40 MB/s | -| 4 KB | 17573.46 MB/s | 17602.65 MB/s | -| 10 MB | 17131.46 MB/s | 17142.16 MB/s | +| input size | purego | asm | +| ---------- | --------- | --------- | +| 4 B | 1.3 GB/s | 1.2 GB/s | +| 16 B | 2.9 GB/s | 3.5 GB/s | +| 100 B | 6.9 GB/s | 8.1 GB/s | +| 4 KB | 11.7 GB/s | 16.7 GB/s | +| 10 MB | 12.0 GB/s | 17.3 GB/s | -These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using -the following commands under Go 1.11.2: +These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C +CPU using the following commands under Go 1.19.2: ``` -$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' -$ go test -benchtime 10s -bench '/xxhash,direct,bytes' +benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$') +benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') ``` ## Projects using this package diff --git a/tools/vendor/github.com/cespare/xxhash/v2/testall.sh b/tools/vendor/github.com/cespare/xxhash/v2/testall.sh new file mode 100644 index 000000000..94b9c4439 --- /dev/null +++ b/tools/vendor/github.com/cespare/xxhash/v2/testall.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -eu -o pipefail + +# Small convenience script for running the tests with various combinations of +# arch/tags. This assumes we're running on amd64 and have qemu available. + +go test ./... +go test -tags purego ./... +GOARCH=arm64 go test +GOARCH=arm64 go test -tags purego diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash.go b/tools/vendor/github.com/cespare/xxhash/v2/xxhash.go index 15c835d54..a9e0d45c9 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash.go +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash.go @@ -16,19 +16,11 @@ const ( prime5 uint64 = 2870177450012600261 ) -// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where -// possible in the Go code is worth a small (but measurable) performance boost -// by avoiding some MOVQs. Vars are needed for the asm and also are useful for -// convenience in the Go code in a few places where we need to intentionally -// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the -// result overflows a uint64). -var ( - prime1v = prime1 - prime2v = prime2 - prime3v = prime3 - prime4v = prime4 - prime5v = prime5 -) +// Store the primes in an array as well. +// +// The consts are used when possible in Go code to avoid MOVs but we need a +// contiguous array of the assembly code. +var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} // Digest implements hash.Hash64. type Digest struct { @@ -50,10 +42,10 @@ func New() *Digest { // Reset clears the Digest's state so that it can be reused. func (d *Digest) Reset() { - d.v1 = prime1v + prime2 + d.v1 = primes[0] + prime2 d.v2 = prime2 d.v3 = 0 - d.v4 = -prime1v + d.v4 = -primes[0] d.total = 0 d.n = 0 } @@ -69,21 +61,23 @@ func (d *Digest) Write(b []byte) (n int, err error) { n = len(b) d.total += uint64(n) + memleft := d.mem[d.n&(len(d.mem)-1):] + if d.n+n < 32 { // This new data doesn't even fill the current block. - copy(d.mem[d.n:], b) + copy(memleft, b) d.n += n return } if d.n > 0 { // Finish off the partial block. - copy(d.mem[d.n:], b) + c := copy(memleft, b) d.v1 = round(d.v1, u64(d.mem[0:8])) d.v2 = round(d.v2, u64(d.mem[8:16])) d.v3 = round(d.v3, u64(d.mem[16:24])) d.v4 = round(d.v4, u64(d.mem[24:32])) - b = b[32-d.n:] + b = b[c:] d.n = 0 } @@ -133,21 +127,20 @@ func (d *Digest) Sum64() uint64 { h += d.total - i, end := 0, d.n - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(d.mem[i:i+8])) + b := d.mem[:d.n&(len(d.mem)-1)] + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(d.mem[i:i+4])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for i < end { - h ^= uint64(d.mem[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 - i++ } h ^= h >> 33 diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s index be8db5bf7..3e8b13257 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s @@ -1,215 +1,209 @@ +//go:build !appengine && gc && !purego // +build !appengine // +build gc // +build !purego #include "textflag.h" -// Register allocation: -// AX h -// SI pointer to advance through b -// DX n -// BX loop end -// R8 v1, k1 -// R9 v2 -// R10 v3 -// R11 v4 -// R12 tmp -// R13 prime1v -// R14 prime2v -// DI prime4v - -// round reads from and advances the buffer pointer in SI. -// It assumes that R13 has prime1v and R14 has prime2v. -#define round(r) \ - MOVQ (SI), R12 \ - ADDQ $8, SI \ - IMULQ R14, R12 \ - ADDQ R12, r \ - ROLQ $31, r \ - IMULQ R13, r - -// mergeRound applies a merge round on the two registers acc and val. -// It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v. -#define mergeRound(acc, val) \ - IMULQ R14, val \ - ROLQ $31, val \ - IMULQ R13, val \ - XORQ val, acc \ - IMULQ R13, acc \ - ADDQ DI, acc +// Registers: +#define h AX +#define d AX +#define p SI // pointer to advance through b +#define n DX +#define end BX // loop end +#define v1 R8 +#define v2 R9 +#define v3 R10 +#define v4 R11 +#define x R12 +#define prime1 R13 +#define prime2 R14 +#define prime4 DI + +#define round(acc, x) \ + IMULQ prime2, x \ + ADDQ x, acc \ + ROLQ $31, acc \ + IMULQ prime1, acc + +// round0 performs the operation x = round(0, x). +#define round0(x) \ + IMULQ prime2, x \ + ROLQ $31, x \ + IMULQ prime1, x + +// mergeRound applies a merge round on the two registers acc and x. +// It assumes that prime1, prime2, and prime4 have been loaded. +#define mergeRound(acc, x) \ + round0(x) \ + XORQ x, acc \ + IMULQ prime1, acc \ + ADDQ prime4, acc + +// blockLoop processes as many 32-byte blocks as possible, +// updating v1, v2, v3, and v4. It assumes that there is at least one block +// to process. +#define blockLoop() \ +loop: \ + MOVQ +0(p), x \ + round(v1, x) \ + MOVQ +8(p), x \ + round(v2, x) \ + MOVQ +16(p), x \ + round(v3, x) \ + MOVQ +24(p), x \ + round(v4, x) \ + ADDQ $32, p \ + CMPQ p, end \ + JLE loop // func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOSPLIT, $0-32 +TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 // Load fixed primes. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 - MOVQ ·prime4v(SB), DI + MOVQ ·primes+0(SB), prime1 + MOVQ ·primes+8(SB), prime2 + MOVQ ·primes+24(SB), prime4 // Load slice. - MOVQ b_base+0(FP), SI - MOVQ b_len+8(FP), DX - LEAQ (SI)(DX*1), BX + MOVQ b_base+0(FP), p + MOVQ b_len+8(FP), n + LEAQ (p)(n*1), end // The first loop limit will be len(b)-32. - SUBQ $32, BX + SUBQ $32, end // Check whether we have at least one block. - CMPQ DX, $32 + CMPQ n, $32 JLT noBlocks // Set up initial state (v1, v2, v3, v4). - MOVQ R13, R8 - ADDQ R14, R8 - MOVQ R14, R9 - XORQ R10, R10 - XORQ R11, R11 - SUBQ R13, R11 - - // Loop until SI > BX. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ SI, BX - JLE blockLoop - - MOVQ R8, AX - ROLQ $1, AX - MOVQ R9, R12 - ROLQ $7, R12 - ADDQ R12, AX - MOVQ R10, R12 - ROLQ $12, R12 - ADDQ R12, AX - MOVQ R11, R12 - ROLQ $18, R12 - ADDQ R12, AX - - mergeRound(AX, R8) - mergeRound(AX, R9) - mergeRound(AX, R10) - mergeRound(AX, R11) + MOVQ prime1, v1 + ADDQ prime2, v1 + MOVQ prime2, v2 + XORQ v3, v3 + XORQ v4, v4 + SUBQ prime1, v4 + + blockLoop() + + MOVQ v1, h + ROLQ $1, h + MOVQ v2, x + ROLQ $7, x + ADDQ x, h + MOVQ v3, x + ROLQ $12, x + ADDQ x, h + MOVQ v4, x + ROLQ $18, x + ADDQ x, h + + mergeRound(h, v1) + mergeRound(h, v2) + mergeRound(h, v3) + mergeRound(h, v4) JMP afterBlocks noBlocks: - MOVQ ·prime5v(SB), AX + MOVQ ·primes+32(SB), h afterBlocks: - ADDQ DX, AX - - // Right now BX has len(b)-32, and we want to loop until SI > len(b)-8. - ADDQ $24, BX - - CMPQ SI, BX - JG fourByte - -wordLoop: - // Calculate k1. - MOVQ (SI), R8 - ADDQ $8, SI - IMULQ R14, R8 - ROLQ $31, R8 - IMULQ R13, R8 - - XORQ R8, AX - ROLQ $27, AX - IMULQ R13, AX - ADDQ DI, AX - - CMPQ SI, BX - JLE wordLoop - -fourByte: - ADDQ $4, BX - CMPQ SI, BX - JG singles - - MOVL (SI), R8 - ADDQ $4, SI - IMULQ R13, R8 - XORQ R8, AX - - ROLQ $23, AX - IMULQ R14, AX - ADDQ ·prime3v(SB), AX - -singles: - ADDQ $4, BX - CMPQ SI, BX + ADDQ n, h + + ADDQ $24, end + CMPQ p, end + JG try4 + +loop8: + MOVQ (p), x + ADDQ $8, p + round0(x) + XORQ x, h + ROLQ $27, h + IMULQ prime1, h + ADDQ prime4, h + + CMPQ p, end + JLE loop8 + +try4: + ADDQ $4, end + CMPQ p, end + JG try1 + + MOVL (p), x + ADDQ $4, p + IMULQ prime1, x + XORQ x, h + + ROLQ $23, h + IMULQ prime2, h + ADDQ ·primes+16(SB), h + +try1: + ADDQ $4, end + CMPQ p, end JGE finalize -singlesLoop: - MOVBQZX (SI), R12 - ADDQ $1, SI - IMULQ ·prime5v(SB), R12 - XORQ R12, AX +loop1: + MOVBQZX (p), x + ADDQ $1, p + IMULQ ·primes+32(SB), x + XORQ x, h + ROLQ $11, h + IMULQ prime1, h - ROLQ $11, AX - IMULQ R13, AX - - CMPQ SI, BX - JL singlesLoop + CMPQ p, end + JL loop1 finalize: - MOVQ AX, R12 - SHRQ $33, R12 - XORQ R12, AX - IMULQ R14, AX - MOVQ AX, R12 - SHRQ $29, R12 - XORQ R12, AX - IMULQ ·prime3v(SB), AX - MOVQ AX, R12 - SHRQ $32, R12 - XORQ R12, AX - - MOVQ AX, ret+24(FP) + MOVQ h, x + SHRQ $33, x + XORQ x, h + IMULQ prime2, h + MOVQ h, x + SHRQ $29, x + XORQ x, h + IMULQ ·primes+16(SB), h + MOVQ h, x + SHRQ $32, x + XORQ x, h + + MOVQ h, ret+24(FP) RET -// writeBlocks uses the same registers as above except that it uses AX to store -// the d pointer. - // func writeBlocks(d *Digest, b []byte) int -TEXT ·writeBlocks(SB), NOSPLIT, $0-40 +TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 // Load fixed primes needed for round. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 + MOVQ ·primes+0(SB), prime1 + MOVQ ·primes+8(SB), prime2 // Load slice. - MOVQ b_base+8(FP), SI - MOVQ b_len+16(FP), DX - LEAQ (SI)(DX*1), BX - SUBQ $32, BX + MOVQ b_base+8(FP), p + MOVQ b_len+16(FP), n + LEAQ (p)(n*1), end + SUBQ $32, end // Load vN from d. - MOVQ d+0(FP), AX - MOVQ 0(AX), R8 // v1 - MOVQ 8(AX), R9 // v2 - MOVQ 16(AX), R10 // v3 - MOVQ 24(AX), R11 // v4 + MOVQ s+0(FP), d + MOVQ 0(d), v1 + MOVQ 8(d), v2 + MOVQ 16(d), v3 + MOVQ 24(d), v4 // We don't need to check the loop condition here; this function is // always called with at least one block of data to process. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ SI, BX - JLE blockLoop + blockLoop() // Copy vN back to d. - MOVQ R8, 0(AX) - MOVQ R9, 8(AX) - MOVQ R10, 16(AX) - MOVQ R11, 24(AX) - - // The number of bytes written is SI minus the old base pointer. - SUBQ b_base+8(FP), SI - MOVQ SI, ret+32(FP) + MOVQ v1, 0(d) + MOVQ v2, 8(d) + MOVQ v3, 16(d) + MOVQ v4, 24(d) + + // The number of bytes written is p minus the old base pointer. + SUBQ b_base+8(FP), p + MOVQ p, ret+32(FP) RET diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s new file mode 100644 index 000000000..7e3145a22 --- /dev/null +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s @@ -0,0 +1,183 @@ +//go:build !appengine && gc && !purego +// +build !appengine +// +build gc +// +build !purego + +#include "textflag.h" + +// Registers: +#define digest R1 +#define h R2 // return value +#define p R3 // input pointer +#define n R4 // input length +#define nblocks R5 // n / 32 +#define prime1 R7 +#define prime2 R8 +#define prime3 R9 +#define prime4 R10 +#define prime5 R11 +#define v1 R12 +#define v2 R13 +#define v3 R14 +#define v4 R15 +#define x1 R20 +#define x2 R21 +#define x3 R22 +#define x4 R23 + +#define round(acc, x) \ + MADD prime2, acc, x, acc \ + ROR $64-31, acc \ + MUL prime1, acc + +// round0 performs the operation x = round(0, x). +#define round0(x) \ + MUL prime2, x \ + ROR $64-31, x \ + MUL prime1, x + +#define mergeRound(acc, x) \ + round0(x) \ + EOR x, acc \ + MADD acc, prime4, prime1, acc + +// blockLoop processes as many 32-byte blocks as possible, +// updating v1, v2, v3, and v4. It assumes that n >= 32. +#define blockLoop() \ + LSR $5, n, nblocks \ + PCALIGN $16 \ + loop: \ + LDP.P 16(p), (x1, x2) \ + LDP.P 16(p), (x3, x4) \ + round(v1, x1) \ + round(v2, x2) \ + round(v3, x3) \ + round(v4, x4) \ + SUB $1, nblocks \ + CBNZ nblocks, loop + +// func Sum64(b []byte) uint64 +TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 + LDP b_base+0(FP), (p, n) + + LDP ·primes+0(SB), (prime1, prime2) + LDP ·primes+16(SB), (prime3, prime4) + MOVD ·primes+32(SB), prime5 + + CMP $32, n + CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 } + BLT afterLoop + + ADD prime1, prime2, v1 + MOVD prime2, v2 + MOVD $0, v3 + NEG prime1, v4 + + blockLoop() + + ROR $64-1, v1, x1 + ROR $64-7, v2, x2 + ADD x1, x2 + ROR $64-12, v3, x3 + ROR $64-18, v4, x4 + ADD x3, x4 + ADD x2, x4, h + + mergeRound(h, v1) + mergeRound(h, v2) + mergeRound(h, v3) + mergeRound(h, v4) + +afterLoop: + ADD n, h + + TBZ $4, n, try8 + LDP.P 16(p), (x1, x2) + + round0(x1) + + // NOTE: here and below, sequencing the EOR after the ROR (using a + // rotated register) is worth a small but measurable speedup for small + // inputs. + ROR $64-27, h + EOR x1 @> 64-27, h, h + MADD h, prime4, prime1, h + + round0(x2) + ROR $64-27, h + EOR x2 @> 64-27, h, h + MADD h, prime4, prime1, h + +try8: + TBZ $3, n, try4 + MOVD.P 8(p), x1 + + round0(x1) + ROR $64-27, h + EOR x1 @> 64-27, h, h + MADD h, prime4, prime1, h + +try4: + TBZ $2, n, try2 + MOVWU.P 4(p), x2 + + MUL prime1, x2 + ROR $64-23, h + EOR x2 @> 64-23, h, h + MADD h, prime3, prime2, h + +try2: + TBZ $1, n, try1 + MOVHU.P 2(p), x3 + AND $255, x3, x1 + LSR $8, x3, x2 + + MUL prime5, x1 + ROR $64-11, h + EOR x1 @> 64-11, h, h + MUL prime1, h + + MUL prime5, x2 + ROR $64-11, h + EOR x2 @> 64-11, h, h + MUL prime1, h + +try1: + TBZ $0, n, finalize + MOVBU (p), x4 + + MUL prime5, x4 + ROR $64-11, h + EOR x4 @> 64-11, h, h + MUL prime1, h + +finalize: + EOR h >> 33, h + MUL prime2, h + EOR h >> 29, h + MUL prime3, h + EOR h >> 32, h + + MOVD h, ret+24(FP) + RET + +// func writeBlocks(d *Digest, b []byte) int +TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 + LDP ·primes+0(SB), (prime1, prime2) + + // Load state. Assume v[1-4] are stored contiguously. + MOVD d+0(FP), digest + LDP 0(digest), (v1, v2) + LDP 16(digest), (v3, v4) + + LDP b_base+8(FP), (p, n) + + blockLoop() + + // Store updated state. + STP (v1, v2), 0(digest) + STP (v3, v4), 16(digest) + + BIC $31, n + MOVD n, ret+32(FP) + RET diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go similarity index 73% rename from tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go rename to tools/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go index ad14b807f..9216e0a40 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go @@ -1,3 +1,5 @@ +//go:build (amd64 || arm64) && !appengine && gc && !purego +// +build amd64 arm64 // +build !appengine // +build gc // +build !purego diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_other.go index 4a5a82160..26df13bba 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_other.go +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_other.go @@ -1,4 +1,5 @@ -// +build !amd64 appengine !gc purego +//go:build (!amd64 && !arm64) || appengine || !gc || purego +// +build !amd64,!arm64 appengine !gc purego package xxhash @@ -14,10 +15,10 @@ func Sum64(b []byte) uint64 { var h uint64 if n >= 32 { - v1 := prime1v + prime2 + v1 := primes[0] + prime2 v2 := prime2 v3 := uint64(0) - v4 := -prime1v + v4 := -primes[0] for len(b) >= 32 { v1 = round(v1, u64(b[0:8:len(b)])) v2 = round(v2, u64(b[8:16:len(b)])) @@ -36,19 +37,18 @@ func Sum64(b []byte) uint64 { h += uint64(n) - i, end := 0, len(b) - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(b[i:i+8:len(b)])) + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for ; i < end; i++ { - h ^= uint64(b[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 } diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go index fc9bea7a3..e86f1b5fd 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go @@ -1,3 +1,4 @@ +//go:build appengine // +build appengine // This file contains the safe implementations of otherwise unsafe-using code. diff --git a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go index 376e0ca2e..1c1638fd8 100644 --- a/tools/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go +++ b/tools/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go @@ -1,3 +1,4 @@ +//go:build !appengine // +build !appengine // This file encapsulates usage of unsafe. @@ -11,7 +12,7 @@ import ( // In the future it's possible that compiler optimizations will make these // XxxString functions unnecessary by realizing that calls such as -// Sum64([]byte(s)) don't need to copy s. See https://golang.org/issue/2205. +// Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205. // If that happens, even if we keep these functions they can be replaced with // the trivial safe code. diff --git a/tools/vendor/github.com/containerd/containerd/api/events/container.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/container.pb.go new file mode 100644 index 000000000..d7d40258c --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/container.pb.go @@ -0,0 +1,431 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/container.proto + +package events + +import ( + _ "github.com/containerd/containerd/protobuf/plugin" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +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 ContainerCreate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` + Runtime *ContainerCreate_Runtime `protobuf:"bytes,3,opt,name=runtime,proto3" json:"runtime,omitempty"` +} + +func (x *ContainerCreate) Reset() { + *x = ContainerCreate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_container_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerCreate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerCreate) ProtoMessage() {} + +func (x *ContainerCreate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_container_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) +} + +// Deprecated: Use ContainerCreate.ProtoReflect.Descriptor instead. +func (*ContainerCreate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_container_proto_rawDescGZIP(), []int{0} +} + +func (x *ContainerCreate) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *ContainerCreate) GetImage() string { + if x != nil { + return x.Image + } + return "" +} + +func (x *ContainerCreate) GetRuntime() *ContainerCreate_Runtime { + if x != nil { + return x.Runtime + } + return nil +} + +type ContainerUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` + Labels map[string]string `protobuf:"bytes,3,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SnapshotKey string `protobuf:"bytes,4,opt,name=snapshot_key,json=snapshotKey,proto3" json:"snapshot_key,omitempty"` +} + +func (x *ContainerUpdate) Reset() { + *x = ContainerUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_container_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerUpdate) ProtoMessage() {} + +func (x *ContainerUpdate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_container_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) +} + +// Deprecated: Use ContainerUpdate.ProtoReflect.Descriptor instead. +func (*ContainerUpdate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_container_proto_rawDescGZIP(), []int{1} +} + +func (x *ContainerUpdate) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *ContainerUpdate) GetImage() string { + if x != nil { + return x.Image + } + return "" +} + +func (x *ContainerUpdate) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +func (x *ContainerUpdate) GetSnapshotKey() string { + if x != nil { + return x.SnapshotKey + } + return "" +} + +type ContainerDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *ContainerDelete) Reset() { + *x = ContainerDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_container_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerDelete) ProtoMessage() {} + +func (x *ContainerDelete) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_container_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) +} + +// Deprecated: Use ContainerDelete.ProtoReflect.Descriptor instead. +func (*ContainerDelete) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_container_proto_rawDescGZIP(), []int{2} +} + +func (x *ContainerDelete) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +type ContainerCreate_Runtime struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Options *anypb.Any `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` +} + +func (x *ContainerCreate_Runtime) Reset() { + *x = ContainerCreate_Runtime{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_container_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerCreate_Runtime) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerCreate_Runtime) ProtoMessage() {} + +func (x *ContainerCreate_Runtime) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_container_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) +} + +// Deprecated: Use ContainerCreate_Runtime.ProtoReflect.Descriptor instead. +func (*ContainerCreate_Runtime) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_container_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *ContainerCreate_Runtime) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ContainerCreate_Runtime) GetOptions() *anypb.Any { + if x != nil { + return x.Options + } + return nil +} + +var File_github_com_containerd_containerd_api_events_container_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_container_proto_rawDesc = []byte{ + 0x0a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x40, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x01, + 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x4d, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xdd, 0x01, 0x0a, + 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4b, 0x65, + 0x79, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x0f, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x42, + 0x38, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0xa0, 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_container_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_container_proto_rawDescData = file_github_com_containerd_containerd_api_events_container_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_container_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_container_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_container_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_container_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_container_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_container_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_github_com_containerd_containerd_api_events_container_proto_goTypes = []interface{}{ + (*ContainerCreate)(nil), // 0: containerd.events.ContainerCreate + (*ContainerUpdate)(nil), // 1: containerd.events.ContainerUpdate + (*ContainerDelete)(nil), // 2: containerd.events.ContainerDelete + (*ContainerCreate_Runtime)(nil), // 3: containerd.events.ContainerCreate.Runtime + nil, // 4: containerd.events.ContainerUpdate.LabelsEntry + (*anypb.Any)(nil), // 5: google.protobuf.Any +} +var file_github_com_containerd_containerd_api_events_container_proto_depIdxs = []int32{ + 3, // 0: containerd.events.ContainerCreate.runtime:type_name -> containerd.events.ContainerCreate.Runtime + 4, // 1: containerd.events.ContainerUpdate.labels:type_name -> containerd.events.ContainerUpdate.LabelsEntry + 5, // 2: containerd.events.ContainerCreate.Runtime.options:type_name -> google.protobuf.Any + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_container_proto_init() } +func file_github_com_containerd_containerd_api_events_container_proto_init() { + if File_github_com_containerd_containerd_api_events_container_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_container_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_container_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_container_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerDelete); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_container_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerCreate_Runtime); 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_github_com_containerd_containerd_api_events_container_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_container_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_container_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_container_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_container_proto = out.File + file_github_com_containerd_containerd_api_events_container_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_container_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_container_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/container.proto b/tools/vendor/github.com/containerd/containerd/api/events/container.proto new file mode 100644 index 000000000..29fd18f88 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/container.proto @@ -0,0 +1,46 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.events; + +import "google/protobuf/any.proto"; +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message ContainerCreate { + string id = 1; + string image = 2; + message Runtime { + string name = 1; + google.protobuf.Any options = 2; + } + Runtime runtime = 3; +} + +message ContainerUpdate { + string id = 1; + string image = 2; + map labels = 3; + string snapshot_key = 4; +} + +message ContainerDelete { + string id = 1; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/container_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/container_fieldpath.pb.go new file mode 100644 index 000000000..c23b07762 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/container_fieldpath.pb.go @@ -0,0 +1,95 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/container.proto +package events + +import ( + v2 "github.com/containerd/typeurl/v2" + strings "strings" +) + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ContainerCreate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "id": + return string(m.ID), len(m.ID) > 0 + case "image": + return string(m.Image), len(m.Image) > 0 + case "runtime": + // NOTE(stevvooe): This is probably not correct in many cases. + // We assume that the target message also implements the Field + // method, which isn't likely true in a lot of cases. + // + // If you have a broken build and have found this comment, + // you may be closer to a solution. + if m.Runtime == nil { + return "", false + } + return m.Runtime.Field(fieldpath[1:]) + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ContainerCreate_Runtime) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + case "options": + decoded, err := v2.UnmarshalAny(m.Options) + if err != nil { + return "", false + } + adaptor, ok := decoded.(interface{ Field([]string) (string, bool) }) + if !ok { + return "", false + } + return adaptor.Field(fieldpath[1:]) + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ContainerUpdate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "id": + return string(m.ID), len(m.ID) > 0 + case "image": + return string(m.Image), len(m.Image) > 0 + case "labels": + // Labels fields have been special-cased by name. If this breaks, + // add better special casing to fieldpath plugin. + if len(m.Labels) == 0 { + return "", false + } + value, ok := m.Labels[strings.Join(fieldpath[1:], ".")] + return value, ok + case "snapshot_key": + return string(m.SnapshotKey), len(m.SnapshotKey) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ContainerDelete) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "id": + return string(m.ID), len(m.ID) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/content.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/content.pb.go new file mode 100644 index 000000000..9e3f843e2 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/content.pb.go @@ -0,0 +1,168 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/content.proto + +package events + +import ( + _ "github.com/containerd/containerd/protobuf/plugin" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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 ContentDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Digest string `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"` +} + +func (x *ContentDelete) Reset() { + *x = ContentDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_content_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContentDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentDelete) ProtoMessage() {} + +func (x *ContentDelete) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_content_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) +} + +// Deprecated: Use ContentDelete.ProtoReflect.Descriptor instead. +func (*ContentDelete) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_content_proto_rawDescGZIP(), []int{0} +} + +func (x *ContentDelete) GetDigest() string { + if x != nil { + return x.Digest + } + return "" +} + +var File_github_com_containerd_containerd_api_events_content_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_content_proto_rawDesc = []byte{ + 0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x40, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x27, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x42, 0x38, 0x5a, 0x32, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0xa0, + 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_content_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_content_proto_rawDescData = file_github_com_containerd_containerd_api_events_content_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_content_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_content_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_content_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_content_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_content_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_content_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_github_com_containerd_containerd_api_events_content_proto_goTypes = []interface{}{ + (*ContentDelete)(nil), // 0: containerd.events.ContentDelete +} +var file_github_com_containerd_containerd_api_events_content_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_content_proto_init() } +func file_github_com_containerd_containerd_api_events_content_proto_init() { + if File_github_com_containerd_containerd_api_events_content_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_content_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContentDelete); 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_github_com_containerd_containerd_api_events_content_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_content_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_content_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_content_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_content_proto = out.File + file_github_com_containerd_containerd_api_events_content_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_content_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_content_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/content.proto b/tools/vendor/github.com/containerd/containerd/api/events/content.proto new file mode 100644 index 000000000..97d424139 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/content.proto @@ -0,0 +1,28 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.events; + +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message ContentDelete { + string digest = 1; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/content_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/content_fieldpath.pb.go new file mode 100644 index 000000000..9485b664c --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/content_fieldpath.pb.go @@ -0,0 +1,16 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/content.proto +package events + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ContentDelete) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "digest": + return string(m.Digest), len(m.Digest) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/doc.go b/tools/vendor/github.com/containerd/containerd/api/events/doc.go new file mode 100644 index 000000000..354bef79f --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/doc.go @@ -0,0 +1,19 @@ +/* + 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 events has protobuf types for various events that are used in +// containerd. +package events diff --git a/tools/vendor/github.com/containerd/containerd/api/events/image.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/image.pb.go new file mode 100644 index 000000000..111af29e6 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/image.pb.go @@ -0,0 +1,330 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/image.proto + +package events + +import ( + _ "github.com/containerd/containerd/protobuf/plugin" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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 ImageCreate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ImageCreate) Reset() { + *x = ImageCreate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_image_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImageCreate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImageCreate) ProtoMessage() {} + +func (x *ImageCreate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_image_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) +} + +// Deprecated: Use ImageCreate.ProtoReflect.Descriptor instead. +func (*ImageCreate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_image_proto_rawDescGZIP(), []int{0} +} + +func (x *ImageCreate) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ImageCreate) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type ImageUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ImageUpdate) Reset() { + *x = ImageUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_image_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImageUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImageUpdate) ProtoMessage() {} + +func (x *ImageUpdate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_image_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) +} + +// Deprecated: Use ImageUpdate.ProtoReflect.Descriptor instead. +func (*ImageUpdate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_image_proto_rawDescGZIP(), []int{1} +} + +func (x *ImageUpdate) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ImageUpdate) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type ImageDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *ImageDelete) Reset() { + *x = ImageDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_image_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImageDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImageDelete) ProtoMessage() {} + +func (x *ImageDelete) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_image_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) +} + +// Deprecated: Use ImageDelete.ProtoReflect.Descriptor instead. +func (*ImageDelete) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_image_proto_rawDescGZIP(), []int{2} +} + +func (x *ImageDelete) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_github_com_containerd_containerd_api_events_image_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_image_proto_rawDesc = []byte{ + 0x0a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x0b, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4e, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, + 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x0b, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, + 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x0b, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x38, 0x5a, 0x32, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0xa0, 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_image_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_image_proto_rawDescData = file_github_com_containerd_containerd_api_events_image_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_image_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_image_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_image_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_image_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_image_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_image_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_github_com_containerd_containerd_api_events_image_proto_goTypes = []interface{}{ + (*ImageCreate)(nil), // 0: containerd.services.images.v1.ImageCreate + (*ImageUpdate)(nil), // 1: containerd.services.images.v1.ImageUpdate + (*ImageDelete)(nil), // 2: containerd.services.images.v1.ImageDelete + nil, // 3: containerd.services.images.v1.ImageCreate.LabelsEntry + nil, // 4: containerd.services.images.v1.ImageUpdate.LabelsEntry +} +var file_github_com_containerd_containerd_api_events_image_proto_depIdxs = []int32{ + 3, // 0: containerd.services.images.v1.ImageCreate.labels:type_name -> containerd.services.images.v1.ImageCreate.LabelsEntry + 4, // 1: containerd.services.images.v1.ImageUpdate.labels:type_name -> containerd.services.images.v1.ImageUpdate.LabelsEntry + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_image_proto_init() } +func file_github_com_containerd_containerd_api_events_image_proto_init() { + if File_github_com_containerd_containerd_api_events_image_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_image_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImageCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_image_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImageUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_image_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImageDelete); 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_github_com_containerd_containerd_api_events_image_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_image_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_image_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_image_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_image_proto = out.File + file_github_com_containerd_containerd_api_events_image_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_image_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_image_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/image.proto b/tools/vendor/github.com/containerd/containerd/api/events/image.proto new file mode 100644 index 000000000..c09c7384f --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/image.proto @@ -0,0 +1,38 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.services.images.v1; + +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message ImageCreate { + string name = 1; + map labels = 2; +} + +message ImageUpdate { + string name = 1; + map labels = 2; +} + +message ImageDelete { + string name = 1; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/image_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/image_fieldpath.pb.go new file mode 100644 index 000000000..2a56fcf9d --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/image_fieldpath.pb.go @@ -0,0 +1,62 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/image.proto +package events + +import ( + strings "strings" +) + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ImageCreate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + case "labels": + // Labels fields have been special-cased by name. If this breaks, + // add better special casing to fieldpath plugin. + if len(m.Labels) == 0 { + return "", false + } + value, ok := m.Labels[strings.Join(fieldpath[1:], ".")] + return value, ok + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ImageUpdate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + case "labels": + // Labels fields have been special-cased by name. If this breaks, + // add better special casing to fieldpath plugin. + if len(m.Labels) == 0 { + return "", false + } + value, ok := m.Labels[strings.Join(fieldpath[1:], ".")] + return value, ok + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *ImageDelete) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/namespace.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/namespace.pb.go new file mode 100644 index 000000000..801c1219e --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/namespace.pb.go @@ -0,0 +1,330 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/namespace.proto + +package events + +import ( + _ "github.com/containerd/containerd/protobuf/plugin" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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 NamespaceCreate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *NamespaceCreate) Reset() { + *x = NamespaceCreate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamespaceCreate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamespaceCreate) ProtoMessage() {} + +func (x *NamespaceCreate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_namespace_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) +} + +// Deprecated: Use NamespaceCreate.ProtoReflect.Descriptor instead. +func (*NamespaceCreate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_namespace_proto_rawDescGZIP(), []int{0} +} + +func (x *NamespaceCreate) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamespaceCreate) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type NamespaceUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *NamespaceUpdate) Reset() { + *x = NamespaceUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamespaceUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamespaceUpdate) ProtoMessage() {} + +func (x *NamespaceUpdate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_namespace_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) +} + +// Deprecated: Use NamespaceUpdate.ProtoReflect.Descriptor instead. +func (*NamespaceUpdate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_namespace_proto_rawDescGZIP(), []int{1} +} + +func (x *NamespaceUpdate) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamespaceUpdate) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type NamespaceDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *NamespaceDelete) Reset() { + *x = NamespaceDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamespaceDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamespaceDelete) ProtoMessage() {} + +func (x *NamespaceDelete) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_namespace_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) +} + +// Deprecated: Use NamespaceDelete.ProtoReflect.Descriptor instead. +func (*NamespaceDelete) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_namespace_proto_rawDescGZIP(), []int{2} +} + +func (x *NamespaceDelete) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_github_com_containerd_containerd_api_events_namespace_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_namespace_proto_rawDesc = []byte{ + 0x0a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x1a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xa8, 0x01, 0x0a, 0x0f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa8, 0x01, + 0x0a, 0x0f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, + 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x25, 0x0a, 0x0f, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, + 0x38, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0xa0, 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_namespace_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_namespace_proto_rawDescData = file_github_com_containerd_containerd_api_events_namespace_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_namespace_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_namespace_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_namespace_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_namespace_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_namespace_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_github_com_containerd_containerd_api_events_namespace_proto_goTypes = []interface{}{ + (*NamespaceCreate)(nil), // 0: containerd.events.NamespaceCreate + (*NamespaceUpdate)(nil), // 1: containerd.events.NamespaceUpdate + (*NamespaceDelete)(nil), // 2: containerd.events.NamespaceDelete + nil, // 3: containerd.events.NamespaceCreate.LabelsEntry + nil, // 4: containerd.events.NamespaceUpdate.LabelsEntry +} +var file_github_com_containerd_containerd_api_events_namespace_proto_depIdxs = []int32{ + 3, // 0: containerd.events.NamespaceCreate.labels:type_name -> containerd.events.NamespaceCreate.LabelsEntry + 4, // 1: containerd.events.NamespaceUpdate.labels:type_name -> containerd.events.NamespaceUpdate.LabelsEntry + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_namespace_proto_init() } +func file_github_com_containerd_containerd_api_events_namespace_proto_init() { + if File_github_com_containerd_containerd_api_events_namespace_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceDelete); 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_github_com_containerd_containerd_api_events_namespace_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_namespace_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_namespace_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_namespace_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_namespace_proto = out.File + file_github_com_containerd_containerd_api_events_namespace_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_namespace_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_namespace_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/namespace.proto b/tools/vendor/github.com/containerd/containerd/api/events/namespace.proto new file mode 100644 index 000000000..9bae531d7 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/namespace.proto @@ -0,0 +1,38 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.events; + +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message NamespaceCreate { + string name = 1; + map labels = 2; +} + +message NamespaceUpdate { + string name = 1; + map labels = 2; +} + +message NamespaceDelete { + string name = 1; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/namespace_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/namespace_fieldpath.pb.go new file mode 100644 index 000000000..93d20a676 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/namespace_fieldpath.pb.go @@ -0,0 +1,62 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/namespace.proto +package events + +import ( + strings "strings" +) + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *NamespaceCreate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + case "labels": + // Labels fields have been special-cased by name. If this breaks, + // add better special casing to fieldpath plugin. + if len(m.Labels) == 0 { + return "", false + } + value, ok := m.Labels[strings.Join(fieldpath[1:], ".")] + return value, ok + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *NamespaceUpdate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + case "labels": + // Labels fields have been special-cased by name. If this breaks, + // add better special casing to fieldpath plugin. + if len(m.Labels) == 0 { + return "", false + } + value, ok := m.Labels[strings.Join(fieldpath[1:], ".")] + return value, ok + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *NamespaceDelete) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "name": + return string(m.Name), len(m.Name) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/snapshot.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/snapshot.pb.go new file mode 100644 index 000000000..e074f9df2 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/snapshot.pb.go @@ -0,0 +1,342 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/snapshot.proto + +package events + +import ( + _ "github.com/containerd/containerd/protobuf/plugin" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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 SnapshotPrepare struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Parent string `protobuf:"bytes,2,opt,name=parent,proto3" json:"parent,omitempty"` + Snapshotter string `protobuf:"bytes,5,opt,name=snapshotter,proto3" json:"snapshotter,omitempty"` +} + +func (x *SnapshotPrepare) Reset() { + *x = SnapshotPrepare{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPrepare) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPrepare) ProtoMessage() {} + +func (x *SnapshotPrepare) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_snapshot_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) +} + +// Deprecated: Use SnapshotPrepare.ProtoReflect.Descriptor instead. +func (*SnapshotPrepare) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescGZIP(), []int{0} +} + +func (x *SnapshotPrepare) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SnapshotPrepare) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *SnapshotPrepare) GetSnapshotter() string { + if x != nil { + return x.Snapshotter + } + return "" +} + +type SnapshotCommit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Snapshotter string `protobuf:"bytes,5,opt,name=snapshotter,proto3" json:"snapshotter,omitempty"` +} + +func (x *SnapshotCommit) Reset() { + *x = SnapshotCommit{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotCommit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotCommit) ProtoMessage() {} + +func (x *SnapshotCommit) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_snapshot_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) +} + +// Deprecated: Use SnapshotCommit.ProtoReflect.Descriptor instead. +func (*SnapshotCommit) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescGZIP(), []int{1} +} + +func (x *SnapshotCommit) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SnapshotCommit) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotCommit) GetSnapshotter() string { + if x != nil { + return x.Snapshotter + } + return "" +} + +type SnapshotRemove struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Snapshotter string `protobuf:"bytes,5,opt,name=snapshotter,proto3" json:"snapshotter,omitempty"` +} + +func (x *SnapshotRemove) Reset() { + *x = SnapshotRemove{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotRemove) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotRemove) ProtoMessage() {} + +func (x *SnapshotRemove) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_snapshot_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) +} + +// Deprecated: Use SnapshotRemove.ProtoReflect.Descriptor instead. +func (*SnapshotRemove) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescGZIP(), []int{2} +} + +func (x *SnapshotRemove) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SnapshotRemove) GetSnapshotter() string { + if x != nil { + return x.Snapshotter + } + return "" +} + +var File_github_com_containerd_containerd_api_events_snapshot_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_snapshot_proto_rawDesc = []byte{ + 0x0a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x5d, 0x0a, 0x0f, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, + 0x22, 0x58, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x0e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x74, 0x65, 0x72, + 0x42, 0x38, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0xa0, 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescData = file_github_com_containerd_containerd_api_events_snapshot_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_snapshot_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_github_com_containerd_containerd_api_events_snapshot_proto_goTypes = []interface{}{ + (*SnapshotPrepare)(nil), // 0: containerd.events.SnapshotPrepare + (*SnapshotCommit)(nil), // 1: containerd.events.SnapshotCommit + (*SnapshotRemove)(nil), // 2: containerd.events.SnapshotRemove +} +var file_github_com_containerd_containerd_api_events_snapshot_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_snapshot_proto_init() } +func file_github_com_containerd_containerd_api_events_snapshot_proto_init() { + if File_github_com_containerd_containerd_api_events_snapshot_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPrepare); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCommit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRemove); 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_github_com_containerd_containerd_api_events_snapshot_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_snapshot_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_snapshot_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_snapshot_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_snapshot_proto = out.File + file_github_com_containerd_containerd_api_events_snapshot_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_snapshot_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_snapshot_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/snapshot.proto b/tools/vendor/github.com/containerd/containerd/api/events/snapshot.proto new file mode 100644 index 000000000..effd86913 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/snapshot.proto @@ -0,0 +1,41 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.events; + +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message SnapshotPrepare { + string key = 1; + string parent = 2; + string snapshotter = 5; +} + +message SnapshotCommit { + string key = 1; + string name = 2; + string snapshotter = 5; +} + +message SnapshotRemove { + string key = 1; + string snapshotter = 5; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/snapshot_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/snapshot_fieldpath.pb.go new file mode 100644 index 000000000..c89d1ab4a --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/snapshot_fieldpath.pb.go @@ -0,0 +1,52 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/snapshot.proto +package events + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *SnapshotPrepare) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "key": + return string(m.Key), len(m.Key) > 0 + case "parent": + return string(m.Parent), len(m.Parent) > 0 + case "snapshotter": + return string(m.Snapshotter), len(m.Snapshotter) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *SnapshotCommit) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "key": + return string(m.Key), len(m.Key) > 0 + case "name": + return string(m.Name), len(m.Name) > 0 + case "snapshotter": + return string(m.Snapshotter), len(m.Snapshotter) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *SnapshotRemove) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "key": + return string(m.Key), len(m.Key) > 0 + case "snapshotter": + return string(m.Snapshotter), len(m.Snapshotter) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/task.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/task.pb.go new file mode 100644 index 000000000..33fd521b6 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/task.pb.go @@ -0,0 +1,1020 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/events/task.proto + +package events + +import ( + types "github.com/containerd/containerd/api/types" + _ "github.com/containerd/containerd/protobuf/plugin" + 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" +) + +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 TaskCreate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Bundle string `protobuf:"bytes,2,opt,name=bundle,proto3" json:"bundle,omitempty"` + Rootfs []*types.Mount `protobuf:"bytes,3,rep,name=rootfs,proto3" json:"rootfs,omitempty"` + IO *TaskIO `protobuf:"bytes,4,opt,name=io,proto3" json:"io,omitempty"` + Checkpoint string `protobuf:"bytes,5,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` + Pid uint32 `protobuf:"varint,6,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *TaskCreate) Reset() { + *x = TaskCreate{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskCreate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskCreate) ProtoMessage() {} + +func (x *TaskCreate) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskCreate.ProtoReflect.Descriptor instead. +func (*TaskCreate) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{0} +} + +func (x *TaskCreate) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskCreate) GetBundle() string { + if x != nil { + return x.Bundle + } + return "" +} + +func (x *TaskCreate) GetRootfs() []*types.Mount { + if x != nil { + return x.Rootfs + } + return nil +} + +func (x *TaskCreate) GetIO() *TaskIO { + if x != nil { + return x.IO + } + return nil +} + +func (x *TaskCreate) GetCheckpoint() string { + if x != nil { + return x.Checkpoint + } + return "" +} + +func (x *TaskCreate) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +type TaskStart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *TaskStart) Reset() { + *x = TaskStart{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskStart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskStart) ProtoMessage() {} + +func (x *TaskStart) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskStart.ProtoReflect.Descriptor instead. +func (*TaskStart) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{1} +} + +func (x *TaskStart) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskStart) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +type TaskDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` + ExitStatus uint32 `protobuf:"varint,3,opt,name=exit_status,json=exitStatus,proto3" json:"exit_status,omitempty"` + ExitedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=exited_at,json=exitedAt,proto3" json:"exited_at,omitempty"` + // id is the specific exec. By default if omitted will be `""` thus matches + // the init exec of the task matching `container_id`. + ID string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *TaskDelete) Reset() { + *x = TaskDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskDelete) ProtoMessage() {} + +func (x *TaskDelete) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskDelete.ProtoReflect.Descriptor instead. +func (*TaskDelete) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{2} +} + +func (x *TaskDelete) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskDelete) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +func (x *TaskDelete) GetExitStatus() uint32 { + if x != nil { + return x.ExitStatus + } + return 0 +} + +func (x *TaskDelete) GetExitedAt() *timestamppb.Timestamp { + if x != nil { + return x.ExitedAt + } + return nil +} + +func (x *TaskDelete) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +type TaskIO struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stdin string `protobuf:"bytes,1,opt,name=stdin,proto3" json:"stdin,omitempty"` + Stdout string `protobuf:"bytes,2,opt,name=stdout,proto3" json:"stdout,omitempty"` + Stderr string `protobuf:"bytes,3,opt,name=stderr,proto3" json:"stderr,omitempty"` + Terminal bool `protobuf:"varint,4,opt,name=terminal,proto3" json:"terminal,omitempty"` +} + +func (x *TaskIO) Reset() { + *x = TaskIO{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskIO) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskIO) ProtoMessage() {} + +func (x *TaskIO) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskIO.ProtoReflect.Descriptor instead. +func (*TaskIO) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{3} +} + +func (x *TaskIO) GetStdin() string { + if x != nil { + return x.Stdin + } + return "" +} + +func (x *TaskIO) GetStdout() string { + if x != nil { + return x.Stdout + } + return "" +} + +func (x *TaskIO) GetStderr() string { + if x != nil { + return x.Stderr + } + return "" +} + +func (x *TaskIO) GetTerminal() bool { + if x != nil { + return x.Terminal + } + return false +} + +type TaskExit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Pid uint32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` + ExitStatus uint32 `protobuf:"varint,4,opt,name=exit_status,json=exitStatus,proto3" json:"exit_status,omitempty"` + ExitedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=exited_at,json=exitedAt,proto3" json:"exited_at,omitempty"` +} + +func (x *TaskExit) Reset() { + *x = TaskExit{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskExit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskExit) ProtoMessage() {} + +func (x *TaskExit) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskExit.ProtoReflect.Descriptor instead. +func (*TaskExit) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{4} +} + +func (x *TaskExit) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskExit) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *TaskExit) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +func (x *TaskExit) GetExitStatus() uint32 { + if x != nil { + return x.ExitStatus + } + return 0 +} + +func (x *TaskExit) GetExitedAt() *timestamppb.Timestamp { + if x != nil { + return x.ExitedAt + } + return nil +} + +type TaskOOM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` +} + +func (x *TaskOOM) Reset() { + *x = TaskOOM{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskOOM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskOOM) ProtoMessage() {} + +func (x *TaskOOM) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskOOM.ProtoReflect.Descriptor instead. +func (*TaskOOM) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{5} +} + +func (x *TaskOOM) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +type TaskExecAdded struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + ExecID string `protobuf:"bytes,2,opt,name=exec_id,json=execId,proto3" json:"exec_id,omitempty"` +} + +func (x *TaskExecAdded) Reset() { + *x = TaskExecAdded{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskExecAdded) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskExecAdded) ProtoMessage() {} + +func (x *TaskExecAdded) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskExecAdded.ProtoReflect.Descriptor instead. +func (*TaskExecAdded) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{6} +} + +func (x *TaskExecAdded) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskExecAdded) GetExecID() string { + if x != nil { + return x.ExecID + } + return "" +} + +type TaskExecStarted struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + ExecID string `protobuf:"bytes,2,opt,name=exec_id,json=execId,proto3" json:"exec_id,omitempty"` + Pid uint32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *TaskExecStarted) Reset() { + *x = TaskExecStarted{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskExecStarted) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskExecStarted) ProtoMessage() {} + +func (x *TaskExecStarted) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskExecStarted.ProtoReflect.Descriptor instead. +func (*TaskExecStarted) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{7} +} + +func (x *TaskExecStarted) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskExecStarted) GetExecID() string { + if x != nil { + return x.ExecID + } + return "" +} + +func (x *TaskExecStarted) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +type TaskPaused struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` +} + +func (x *TaskPaused) Reset() { + *x = TaskPaused{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskPaused) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskPaused) ProtoMessage() {} + +func (x *TaskPaused) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskPaused.ProtoReflect.Descriptor instead. +func (*TaskPaused) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{8} +} + +func (x *TaskPaused) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +type TaskResumed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` +} + +func (x *TaskResumed) Reset() { + *x = TaskResumed{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskResumed) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskResumed) ProtoMessage() {} + +func (x *TaskResumed) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskResumed.ProtoReflect.Descriptor instead. +func (*TaskResumed) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{9} +} + +func (x *TaskResumed) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +type TaskCheckpointed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Checkpoint string `protobuf:"bytes,2,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` +} + +func (x *TaskCheckpointed) Reset() { + *x = TaskCheckpointed{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_events_task_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskCheckpointed) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskCheckpointed) ProtoMessage() {} + +func (x *TaskCheckpointed) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_events_task_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) +} + +// Deprecated: Use TaskCheckpointed.ProtoReflect.Descriptor instead. +func (*TaskCheckpointed) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP(), []int{10} +} + +func (x *TaskCheckpointed) GetContainerID() string { + if x != nil { + return x.ContainerID + } + return "" +} + +func (x *TaskCheckpointed) GetCheckpoint() string { + if x != nil { + return x.Checkpoint + } + return "" +} + +var File_github_com_containerd_containerd_api_events_task_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_events_task_proto_rawDesc = []byte{ + 0x0a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 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, 0x1a, 0x36, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd5, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, + 0x73, 0x12, 0x29, 0x0a, 0x02, 0x69, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x4f, 0x52, 0x02, 0x69, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x40, + 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x22, 0xab, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x03, 0x70, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x04, 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, 0x08, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6a, + 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x4f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x64, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x45, 0x78, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x78, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, + 0x09, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x08, 0x65, 0x78, + 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x2c, 0x0a, 0x07, 0x54, 0x61, 0x73, 0x6b, 0x4f, 0x4f, + 0x4d, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, + 0x64, 0x22, 0x5f, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x64, 0x22, 0x30, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6d, + 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x38, 0x5a, 0x32, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0xa0, 0xf4, 0x1e, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_events_task_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_events_task_proto_rawDescData = file_github_com_containerd_containerd_api_events_task_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_events_task_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_events_task_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_events_task_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_events_task_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_events_task_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_events_task_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_github_com_containerd_containerd_api_events_task_proto_goTypes = []interface{}{ + (*TaskCreate)(nil), // 0: containerd.events.TaskCreate + (*TaskStart)(nil), // 1: containerd.events.TaskStart + (*TaskDelete)(nil), // 2: containerd.events.TaskDelete + (*TaskIO)(nil), // 3: containerd.events.TaskIO + (*TaskExit)(nil), // 4: containerd.events.TaskExit + (*TaskOOM)(nil), // 5: containerd.events.TaskOOM + (*TaskExecAdded)(nil), // 6: containerd.events.TaskExecAdded + (*TaskExecStarted)(nil), // 7: containerd.events.TaskExecStarted + (*TaskPaused)(nil), // 8: containerd.events.TaskPaused + (*TaskResumed)(nil), // 9: containerd.events.TaskResumed + (*TaskCheckpointed)(nil), // 10: containerd.events.TaskCheckpointed + (*types.Mount)(nil), // 11: containerd.types.Mount + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp +} +var file_github_com_containerd_containerd_api_events_task_proto_depIdxs = []int32{ + 11, // 0: containerd.events.TaskCreate.rootfs:type_name -> containerd.types.Mount + 3, // 1: containerd.events.TaskCreate.io:type_name -> containerd.events.TaskIO + 12, // 2: containerd.events.TaskDelete.exited_at:type_name -> google.protobuf.Timestamp + 12, // 3: containerd.events.TaskExit.exited_at:type_name -> google.protobuf.Timestamp + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_events_task_proto_init() } +func file_github_com_containerd_containerd_api_events_task_proto_init() { + if File_github_com_containerd_containerd_api_events_task_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskStart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskDelete); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskIO); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskExit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskOOM); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskExecAdded); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskExecStarted); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskPaused); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskResumed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_events_task_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskCheckpointed); 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_github_com_containerd_containerd_api_events_task_proto_rawDesc, + NumEnums: 0, + NumMessages: 11, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_events_task_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_events_task_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_events_task_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_events_task_proto = out.File + file_github_com_containerd_containerd_api_events_task_proto_rawDesc = nil + file_github_com_containerd_containerd_api_events_task_proto_goTypes = nil + file_github_com_containerd_containerd_api_events_task_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/task.proto b/tools/vendor/github.com/containerd/containerd/api/events/task.proto new file mode 100644 index 000000000..238564dfe --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/task.proto @@ -0,0 +1,93 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.events; + +import "google/protobuf/timestamp.proto"; +import "github.com/containerd/containerd/api/types/mount.proto"; +import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; + +option go_package = "github.com/containerd/containerd/api/events;events"; +option (containerd.plugin.fieldpath_all) = true; + +message TaskCreate { + string container_id = 1; + string bundle = 2; + repeated containerd.types.Mount rootfs = 3; + TaskIO io = 4; + string checkpoint = 5; + uint32 pid = 6; +} + +message TaskStart { + string container_id = 1; + uint32 pid = 2; +} + +message TaskDelete { + string container_id = 1; + uint32 pid = 2; + uint32 exit_status = 3; + google.protobuf.Timestamp exited_at = 4; + // id is the specific exec. By default if omitted will be `""` thus matches + // the init exec of the task matching `container_id`. + string id = 5; +} + +message TaskIO { + string stdin = 1; + string stdout = 2; + string stderr = 3; + bool terminal = 4; +} + +message TaskExit { + string container_id = 1; + string id = 2; + uint32 pid = 3; + uint32 exit_status = 4; + google.protobuf.Timestamp exited_at = 5; +} + +message TaskOOM { + string container_id = 1; +} + +message TaskExecAdded { + string container_id = 1; + string exec_id = 2; +} + +message TaskExecStarted { + string container_id = 1; + string exec_id = 2; + uint32 pid = 3; +} + +message TaskPaused { + string container_id = 1; +} + +message TaskResumed { + string container_id = 1; +} + +message TaskCheckpointed { + string container_id = 1; + string checkpoint = 2; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/events/task_fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/api/events/task_fieldpath.pb.go new file mode 100644 index 000000000..633fc3a65 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/events/task_fieldpath.pb.go @@ -0,0 +1,191 @@ +// Code generated by protoc-gen-go-fieldpath. DO NOT EDIT. +// source: github.com/containerd/containerd/api/events/task.proto +package events + +import ( + fmt "fmt" +) + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskCreate) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + // unhandled: rootfs + // unhandled: pid + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "bundle": + return string(m.Bundle), len(m.Bundle) > 0 + case "io": + // NOTE(stevvooe): This is probably not correct in many cases. + // We assume that the target message also implements the Field + // method, which isn't likely true in a lot of cases. + // + // If you have a broken build and have found this comment, + // you may be closer to a solution. + if m.IO == nil { + return "", false + } + return m.IO.Field(fieldpath[1:]) + case "checkpoint": + return string(m.Checkpoint), len(m.Checkpoint) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskStart) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + // unhandled: pid + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskDelete) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + // unhandled: pid + // unhandled: exit_status + // unhandled: exited_at + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "id": + return string(m.ID), len(m.ID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskIO) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "stdin": + return string(m.Stdin), len(m.Stdin) > 0 + case "stdout": + return string(m.Stdout), len(m.Stdout) > 0 + case "stderr": + return string(m.Stderr), len(m.Stderr) > 0 + case "terminal": + return fmt.Sprint(m.Terminal), true + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskExit) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + // unhandled: pid + // unhandled: exit_status + // unhandled: exited_at + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "id": + return string(m.ID), len(m.ID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskOOM) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskExecAdded) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "exec_id": + return string(m.ExecID), len(m.ExecID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskExecStarted) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + // unhandled: pid + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "exec_id": + return string(m.ExecID), len(m.ExecID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskPaused) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskResumed) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + } + return "", false +} + +// Field returns the value for the given fieldpath as a string, if defined. +// If the value is not defined, the second value will be false. +func (m *TaskCheckpointed) Field(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + switch fieldpath[0] { + case "container_id": + return string(m.ContainerID), len(m.ContainerID) > 0 + case "checkpoint": + return string(m.Checkpoint), len(m.Checkpoint) > 0 + } + return "", false +} diff --git a/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/doc.go b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/doc.go new file mode 100644 index 000000000..f960350c1 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/doc.go @@ -0,0 +1,17 @@ +/* + 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 sandbox diff --git a/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.pb.go b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.pb.go new file mode 100644 index 000000000..5b3d4aa78 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.pb.go @@ -0,0 +1,1480 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto + +package sandbox + +import ( + types "github.com/containerd/containerd/api/types" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +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 CreateSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + BundlePath string `protobuf:"bytes,2,opt,name=bundle_path,json=bundlePath,proto3" json:"bundle_path,omitempty"` + Rootfs []*types.Mount `protobuf:"bytes,3,rep,name=rootfs,proto3" json:"rootfs,omitempty"` + Options *anypb.Any `protobuf:"bytes,4,opt,name=options,proto3" json:"options,omitempty"` + NetnsPath string `protobuf:"bytes,5,opt,name=netns_path,json=netnsPath,proto3" json:"netns_path,omitempty"` +} + +func (x *CreateSandboxRequest) Reset() { + *x = CreateSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSandboxRequest) ProtoMessage() {} + +func (x *CreateSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use CreateSandboxRequest.ProtoReflect.Descriptor instead. +func (*CreateSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *CreateSandboxRequest) GetBundlePath() string { + if x != nil { + return x.BundlePath + } + return "" +} + +func (x *CreateSandboxRequest) GetRootfs() []*types.Mount { + if x != nil { + return x.Rootfs + } + return nil +} + +func (x *CreateSandboxRequest) GetOptions() *anypb.Any { + if x != nil { + return x.Options + } + return nil +} + +func (x *CreateSandboxRequest) GetNetnsPath() string { + if x != nil { + return x.NetnsPath + } + return "" +} + +type CreateSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CreateSandboxResponse) Reset() { + *x = CreateSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSandboxResponse) ProtoMessage() {} + +func (x *CreateSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use CreateSandboxResponse.ProtoReflect.Descriptor instead. +func (*CreateSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{1} +} + +type StartSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` +} + +func (x *StartSandboxRequest) Reset() { + *x = StartSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartSandboxRequest) ProtoMessage() {} + +func (x *StartSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use StartSandboxRequest.ProtoReflect.Descriptor instead. +func (*StartSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{2} +} + +func (x *StartSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +type StartSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` +} + +func (x *StartSandboxResponse) Reset() { + *x = StartSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartSandboxResponse) ProtoMessage() {} + +func (x *StartSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use StartSandboxResponse.ProtoReflect.Descriptor instead. +func (*StartSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{3} +} + +func (x *StartSandboxResponse) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +func (x *StartSandboxResponse) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +type PlatformRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` +} + +func (x *PlatformRequest) Reset() { + *x = PlatformRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlatformRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlatformRequest) ProtoMessage() {} + +func (x *PlatformRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use PlatformRequest.ProtoReflect.Descriptor instead. +func (*PlatformRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{4} +} + +func (x *PlatformRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +type PlatformResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform *types.Platform `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` +} + +func (x *PlatformResponse) Reset() { + *x = PlatformResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlatformResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlatformResponse) ProtoMessage() {} + +func (x *PlatformResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use PlatformResponse.ProtoReflect.Descriptor instead. +func (*PlatformResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{5} +} + +func (x *PlatformResponse) GetPlatform() *types.Platform { + if x != nil { + return x.Platform + } + return nil +} + +type StopSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + TimeoutSecs uint32 `protobuf:"varint,2,opt,name=timeout_secs,json=timeoutSecs,proto3" json:"timeout_secs,omitempty"` +} + +func (x *StopSandboxRequest) Reset() { + *x = StopSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopSandboxRequest) ProtoMessage() {} + +func (x *StopSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use StopSandboxRequest.ProtoReflect.Descriptor instead. +func (*StopSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{6} +} + +func (x *StopSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *StopSandboxRequest) GetTimeoutSecs() uint32 { + if x != nil { + return x.TimeoutSecs + } + return 0 +} + +type StopSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StopSandboxResponse) Reset() { + *x = StopSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopSandboxResponse) ProtoMessage() {} + +func (x *StopSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use StopSandboxResponse.ProtoReflect.Descriptor instead. +func (*StopSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{7} +} + +type UpdateSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + Resources *anypb.Any `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"` + Annotations map[string]string `protobuf:"bytes,3,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *UpdateSandboxRequest) Reset() { + *x = UpdateSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSandboxRequest) ProtoMessage() {} + +func (x *UpdateSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use UpdateSandboxRequest.ProtoReflect.Descriptor instead. +func (*UpdateSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *UpdateSandboxRequest) GetResources() *anypb.Any { + if x != nil { + return x.Resources + } + return nil +} + +func (x *UpdateSandboxRequest) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +type WaitSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` +} + +func (x *WaitSandboxRequest) Reset() { + *x = WaitSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WaitSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WaitSandboxRequest) ProtoMessage() {} + +func (x *WaitSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use WaitSandboxRequest.ProtoReflect.Descriptor instead. +func (*WaitSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{9} +} + +func (x *WaitSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +type WaitSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExitStatus uint32 `protobuf:"varint,1,opt,name=exit_status,json=exitStatus,proto3" json:"exit_status,omitempty"` + ExitedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=exited_at,json=exitedAt,proto3" json:"exited_at,omitempty"` +} + +func (x *WaitSandboxResponse) Reset() { + *x = WaitSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WaitSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WaitSandboxResponse) ProtoMessage() {} + +func (x *WaitSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use WaitSandboxResponse.ProtoReflect.Descriptor instead. +func (*WaitSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{10} +} + +func (x *WaitSandboxResponse) GetExitStatus() uint32 { + if x != nil { + return x.ExitStatus + } + return 0 +} + +func (x *WaitSandboxResponse) GetExitedAt() *timestamppb.Timestamp { + if x != nil { + return x.ExitedAt + } + return nil +} + +type UpdateSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *UpdateSandboxResponse) Reset() { + *x = UpdateSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSandboxResponse) ProtoMessage() {} + +func (x *UpdateSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_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) +} + +// Deprecated: Use UpdateSandboxResponse.ProtoReflect.Descriptor instead. +func (*UpdateSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{11} +} + +type SandboxStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + Verbose bool `protobuf:"varint,2,opt,name=verbose,proto3" json:"verbose,omitempty"` +} + +func (x *SandboxStatusRequest) Reset() { + *x = SandboxStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SandboxStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SandboxStatusRequest) ProtoMessage() {} + +func (x *SandboxStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[12] + 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 SandboxStatusRequest.ProtoReflect.Descriptor instead. +func (*SandboxStatusRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{12} +} + +func (x *SandboxStatusRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *SandboxStatusRequest) GetVerbose() bool { + if x != nil { + return x.Verbose + } + return false +} + +type SandboxStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Info map[string]string `protobuf:"bytes,4,rep,name=info,proto3" json:"info,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + ExitedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=exited_at,json=exitedAt,proto3" json:"exited_at,omitempty"` + Extra *anypb.Any `protobuf:"bytes,7,opt,name=extra,proto3" json:"extra,omitempty"` +} + +func (x *SandboxStatusResponse) Reset() { + *x = SandboxStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SandboxStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SandboxStatusResponse) ProtoMessage() {} + +func (x *SandboxStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[13] + 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 SandboxStatusResponse.ProtoReflect.Descriptor instead. +func (*SandboxStatusResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{13} +} + +func (x *SandboxStatusResponse) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *SandboxStatusResponse) GetPid() uint32 { + if x != nil { + return x.Pid + } + return 0 +} + +func (x *SandboxStatusResponse) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *SandboxStatusResponse) GetInfo() map[string]string { + if x != nil { + return x.Info + } + return nil +} + +func (x *SandboxStatusResponse) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SandboxStatusResponse) GetExitedAt() *timestamppb.Timestamp { + if x != nil { + return x.ExitedAt + } + return nil +} + +func (x *SandboxStatusResponse) GetExtra() *anypb.Any { + if x != nil { + return x.Extra + } + return nil +} + +type PingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` +} + +func (x *PingRequest) Reset() { + *x = PingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingRequest) ProtoMessage() {} + +func (x *PingRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[14] + 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 PingRequest.ProtoReflect.Descriptor instead. +func (*PingRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{14} +} + +func (x *PingRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +type PingResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PingResponse) Reset() { + *x = PingResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingResponse) ProtoMessage() {} + +func (x *PingResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[15] + 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 PingResponse.ProtoReflect.Descriptor instead. +func (*PingResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{15} +} + +type ShutdownSandboxRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` +} + +func (x *ShutdownSandboxRequest) Reset() { + *x = ShutdownSandboxRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ShutdownSandboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ShutdownSandboxRequest) ProtoMessage() {} + +func (x *ShutdownSandboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[16] + 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 ShutdownSandboxRequest.ProtoReflect.Descriptor instead. +func (*ShutdownSandboxRequest) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{16} +} + +func (x *ShutdownSandboxRequest) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +type ShutdownSandboxResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ShutdownSandboxResponse) Reset() { + *x = ShutdownSandboxResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ShutdownSandboxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ShutdownSandboxResponse) ProtoMessage() {} + +func (x *ShutdownSandboxResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[17] + 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 ShutdownSandboxResponse.ProtoReflect.Descriptor instead. +func (*ShutdownSandboxResponse) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP(), []int{17} +} + +var File_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDesc = []byte{ + 0x0a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 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, 0x1a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x39, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2f, + 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x12, + 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x6e, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x6e, 0x73, 0x50, 0x61, 0x74, 0x68, 0x22, 0x17, + 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x22, 0x63, 0x0a, + 0x14, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0x30, 0x0a, 0x0f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x22, 0x56, 0x0a, 0x12, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x91, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x44, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x12, 0x57, 0x61, 0x69, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x13, 0x57, 0x61, 0x69, 0x74, + 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 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, + 0x08, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x14, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x22, 0x8b, 0x03, 0x0a, 0x15, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 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, 0x08, 0x65, 0x78, 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x49, 0x6e, 0x66, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x2c, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x22, + 0x0e, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x37, 0x0a, 0x16, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x68, 0x75, 0x74, + 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0xbe, 0x07, 0x0a, 0x07, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, + 0x7a, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0c, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x74, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x0b, 0x57, 0x61, 0x69, 0x74, 0x53, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x53, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, + 0x0d, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x0b, 0x50, 0x69, 0x6e, + 0x67, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x75, + 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2f, 0x76, 0x31, 0x3b, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescData = file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_goTypes = []interface{}{ + (*CreateSandboxRequest)(nil), // 0: containerd.runtime.sandbox.v1.CreateSandboxRequest + (*CreateSandboxResponse)(nil), // 1: containerd.runtime.sandbox.v1.CreateSandboxResponse + (*StartSandboxRequest)(nil), // 2: containerd.runtime.sandbox.v1.StartSandboxRequest + (*StartSandboxResponse)(nil), // 3: containerd.runtime.sandbox.v1.StartSandboxResponse + (*PlatformRequest)(nil), // 4: containerd.runtime.sandbox.v1.PlatformRequest + (*PlatformResponse)(nil), // 5: containerd.runtime.sandbox.v1.PlatformResponse + (*StopSandboxRequest)(nil), // 6: containerd.runtime.sandbox.v1.StopSandboxRequest + (*StopSandboxResponse)(nil), // 7: containerd.runtime.sandbox.v1.StopSandboxResponse + (*UpdateSandboxRequest)(nil), // 8: containerd.runtime.sandbox.v1.UpdateSandboxRequest + (*WaitSandboxRequest)(nil), // 9: containerd.runtime.sandbox.v1.WaitSandboxRequest + (*WaitSandboxResponse)(nil), // 10: containerd.runtime.sandbox.v1.WaitSandboxResponse + (*UpdateSandboxResponse)(nil), // 11: containerd.runtime.sandbox.v1.UpdateSandboxResponse + (*SandboxStatusRequest)(nil), // 12: containerd.runtime.sandbox.v1.SandboxStatusRequest + (*SandboxStatusResponse)(nil), // 13: containerd.runtime.sandbox.v1.SandboxStatusResponse + (*PingRequest)(nil), // 14: containerd.runtime.sandbox.v1.PingRequest + (*PingResponse)(nil), // 15: containerd.runtime.sandbox.v1.PingResponse + (*ShutdownSandboxRequest)(nil), // 16: containerd.runtime.sandbox.v1.ShutdownSandboxRequest + (*ShutdownSandboxResponse)(nil), // 17: containerd.runtime.sandbox.v1.ShutdownSandboxResponse + nil, // 18: containerd.runtime.sandbox.v1.UpdateSandboxRequest.AnnotationsEntry + nil, // 19: containerd.runtime.sandbox.v1.SandboxStatusResponse.InfoEntry + (*types.Mount)(nil), // 20: containerd.types.Mount + (*anypb.Any)(nil), // 21: google.protobuf.Any + (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp + (*types.Platform)(nil), // 23: containerd.types.Platform +} +var file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_depIdxs = []int32{ + 20, // 0: containerd.runtime.sandbox.v1.CreateSandboxRequest.rootfs:type_name -> containerd.types.Mount + 21, // 1: containerd.runtime.sandbox.v1.CreateSandboxRequest.options:type_name -> google.protobuf.Any + 22, // 2: containerd.runtime.sandbox.v1.StartSandboxResponse.created_at:type_name -> google.protobuf.Timestamp + 23, // 3: containerd.runtime.sandbox.v1.PlatformResponse.platform:type_name -> containerd.types.Platform + 21, // 4: containerd.runtime.sandbox.v1.UpdateSandboxRequest.resources:type_name -> google.protobuf.Any + 18, // 5: containerd.runtime.sandbox.v1.UpdateSandboxRequest.annotations:type_name -> containerd.runtime.sandbox.v1.UpdateSandboxRequest.AnnotationsEntry + 22, // 6: containerd.runtime.sandbox.v1.WaitSandboxResponse.exited_at:type_name -> google.protobuf.Timestamp + 19, // 7: containerd.runtime.sandbox.v1.SandboxStatusResponse.info:type_name -> containerd.runtime.sandbox.v1.SandboxStatusResponse.InfoEntry + 22, // 8: containerd.runtime.sandbox.v1.SandboxStatusResponse.created_at:type_name -> google.protobuf.Timestamp + 22, // 9: containerd.runtime.sandbox.v1.SandboxStatusResponse.exited_at:type_name -> google.protobuf.Timestamp + 21, // 10: containerd.runtime.sandbox.v1.SandboxStatusResponse.extra:type_name -> google.protobuf.Any + 0, // 11: containerd.runtime.sandbox.v1.Sandbox.CreateSandbox:input_type -> containerd.runtime.sandbox.v1.CreateSandboxRequest + 2, // 12: containerd.runtime.sandbox.v1.Sandbox.StartSandbox:input_type -> containerd.runtime.sandbox.v1.StartSandboxRequest + 4, // 13: containerd.runtime.sandbox.v1.Sandbox.Platform:input_type -> containerd.runtime.sandbox.v1.PlatformRequest + 6, // 14: containerd.runtime.sandbox.v1.Sandbox.StopSandbox:input_type -> containerd.runtime.sandbox.v1.StopSandboxRequest + 9, // 15: containerd.runtime.sandbox.v1.Sandbox.WaitSandbox:input_type -> containerd.runtime.sandbox.v1.WaitSandboxRequest + 12, // 16: containerd.runtime.sandbox.v1.Sandbox.SandboxStatus:input_type -> containerd.runtime.sandbox.v1.SandboxStatusRequest + 14, // 17: containerd.runtime.sandbox.v1.Sandbox.PingSandbox:input_type -> containerd.runtime.sandbox.v1.PingRequest + 16, // 18: containerd.runtime.sandbox.v1.Sandbox.ShutdownSandbox:input_type -> containerd.runtime.sandbox.v1.ShutdownSandboxRequest + 1, // 19: containerd.runtime.sandbox.v1.Sandbox.CreateSandbox:output_type -> containerd.runtime.sandbox.v1.CreateSandboxResponse + 3, // 20: containerd.runtime.sandbox.v1.Sandbox.StartSandbox:output_type -> containerd.runtime.sandbox.v1.StartSandboxResponse + 5, // 21: containerd.runtime.sandbox.v1.Sandbox.Platform:output_type -> containerd.runtime.sandbox.v1.PlatformResponse + 7, // 22: containerd.runtime.sandbox.v1.Sandbox.StopSandbox:output_type -> containerd.runtime.sandbox.v1.StopSandboxResponse + 10, // 23: containerd.runtime.sandbox.v1.Sandbox.WaitSandbox:output_type -> containerd.runtime.sandbox.v1.WaitSandboxResponse + 13, // 24: containerd.runtime.sandbox.v1.Sandbox.SandboxStatus:output_type -> containerd.runtime.sandbox.v1.SandboxStatusResponse + 15, // 25: containerd.runtime.sandbox.v1.Sandbox.PingSandbox:output_type -> containerd.runtime.sandbox.v1.PingResponse + 17, // 26: containerd.runtime.sandbox.v1.Sandbox.ShutdownSandbox:output_type -> containerd.runtime.sandbox.v1.ShutdownSandboxResponse + 19, // [19:27] is the sub-list for method output_type + 11, // [11:19] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_init() } +func file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_init() { + if File_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSandboxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartSandboxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlatformRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlatformResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopSandboxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WaitSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WaitSandboxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSandboxResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SandboxStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SandboxStatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PingResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShutdownSandboxRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShutdownSandboxResponse); 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_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDesc, + NumEnums: 0, + NumMessages: 20, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto = out.File + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_rawDesc = nil + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_goTypes = nil + file_github_com_containerd_containerd_api_runtime_sandbox_v1_sandbox_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto new file mode 100644 index 000000000..a051f3ea3 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto @@ -0,0 +1,136 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.runtime.sandbox.v1; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +import "github.com/containerd/containerd/api/types/mount.proto"; +import "github.com/containerd/containerd/api/types/platform.proto"; + +option go_package = "github.com/containerd/containerd/api/runtime/sandbox/v1;sandbox"; + +// Sandbox is an optional interface that shim may implement to support sandboxes environments. +// A typical example of sandbox is microVM or pause container - an entity that groups containers and/or +// holds resources relevant for this group. +service Sandbox { + // CreateSandbox will be called right after sandbox shim instance launched. + // It is a good place to initialize sandbox environment. + rpc CreateSandbox(CreateSandboxRequest) returns (CreateSandboxResponse); + + // StartSandbox will start previsouly created sandbox. + rpc StartSandbox(StartSandboxRequest) returns (StartSandboxResponse); + + // Platform queries the platform the sandbox is going to run containers on. + // containerd will use this to generate a proper OCI spec. + rpc Platform(PlatformRequest) returns (PlatformResponse); + + // StopSandbox will stop existing sandbox instance + rpc StopSandbox(StopSandboxRequest) returns (StopSandboxResponse); + + // WaitSandbox blocks until sanbox exits. + rpc WaitSandbox(WaitSandboxRequest) returns (WaitSandboxResponse); + + // SandboxStatus will return current status of the running sandbox instance + rpc SandboxStatus(SandboxStatusRequest) returns (SandboxStatusResponse); + + // PingSandbox is a lightweight API call to check whether sandbox alive. + rpc PingSandbox(PingRequest) returns (PingResponse); + + // ShutdownSandbox must shutdown shim instance. + rpc ShutdownSandbox(ShutdownSandboxRequest) returns (ShutdownSandboxResponse); +} + +message CreateSandboxRequest { + string sandbox_id = 1; + string bundle_path = 2; + repeated containerd.types.Mount rootfs = 3; + google.protobuf.Any options = 4; + string netns_path = 5; +} + +message CreateSandboxResponse {} + +message StartSandboxRequest { + string sandbox_id = 1; +} + +message StartSandboxResponse { + uint32 pid = 1; + google.protobuf.Timestamp created_at = 2; +} + +message PlatformRequest { + string sandbox_id = 1; +} + +message PlatformResponse { + containerd.types.Platform platform = 1; +} + +message StopSandboxRequest { + string sandbox_id = 1; + uint32 timeout_secs = 2; +} + +message StopSandboxResponse {} + +message UpdateSandboxRequest { + string sandbox_id = 1; + google.protobuf.Any resources = 2; + map annotations = 3; +} + +message WaitSandboxRequest { + string sandbox_id = 1; +} + +message WaitSandboxResponse { + uint32 exit_status = 1; + google.protobuf.Timestamp exited_at = 2; +} + +message UpdateSandboxResponse {} + +message SandboxStatusRequest { + string sandbox_id = 1; + bool verbose = 2; +} + +message SandboxStatusResponse { + string sandbox_id = 1; + uint32 pid = 2; + string state = 3; + map info = 4; + google.protobuf.Timestamp created_at = 5; + google.protobuf.Timestamp exited_at = 6; + google.protobuf.Any extra = 7; +} + +message PingRequest { + string sandbox_id = 1; +} + +message PingResponse {} + +message ShutdownSandboxRequest { + string sandbox_id = 1; +} + +message ShutdownSandboxResponse {} diff --git a/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_grpc.pb.go b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_grpc.pb.go new file mode 100644 index 000000000..f79424986 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_grpc.pb.go @@ -0,0 +1,377 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.20.1 +// source: github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto + +package sandbox + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// SandboxClient is the client API for Sandbox 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. +type SandboxClient interface { + // CreateSandbox will be called right after sandbox shim instance launched. + // It is a good place to initialize sandbox environment. + CreateSandbox(ctx context.Context, in *CreateSandboxRequest, opts ...grpc.CallOption) (*CreateSandboxResponse, error) + // StartSandbox will start previsouly created sandbox. + StartSandbox(ctx context.Context, in *StartSandboxRequest, opts ...grpc.CallOption) (*StartSandboxResponse, error) + // Platform queries the platform the sandbox is going to run containers on. + // containerd will use this to generate a proper OCI spec. + Platform(ctx context.Context, in *PlatformRequest, opts ...grpc.CallOption) (*PlatformResponse, error) + // StopSandbox will stop existing sandbox instance + StopSandbox(ctx context.Context, in *StopSandboxRequest, opts ...grpc.CallOption) (*StopSandboxResponse, error) + // WaitSandbox blocks until sanbox exits. + WaitSandbox(ctx context.Context, in *WaitSandboxRequest, opts ...grpc.CallOption) (*WaitSandboxResponse, error) + // SandboxStatus will return current status of the running sandbox instance + SandboxStatus(ctx context.Context, in *SandboxStatusRequest, opts ...grpc.CallOption) (*SandboxStatusResponse, error) + // PingSandbox is a lightweight API call to check whether sandbox alive. + PingSandbox(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) + // ShutdownSandbox must shutdown shim instance. + ShutdownSandbox(ctx context.Context, in *ShutdownSandboxRequest, opts ...grpc.CallOption) (*ShutdownSandboxResponse, error) +} + +type sandboxClient struct { + cc grpc.ClientConnInterface +} + +func NewSandboxClient(cc grpc.ClientConnInterface) SandboxClient { + return &sandboxClient{cc} +} + +func (c *sandboxClient) CreateSandbox(ctx context.Context, in *CreateSandboxRequest, opts ...grpc.CallOption) (*CreateSandboxResponse, error) { + out := new(CreateSandboxResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/CreateSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) StartSandbox(ctx context.Context, in *StartSandboxRequest, opts ...grpc.CallOption) (*StartSandboxResponse, error) { + out := new(StartSandboxResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/StartSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) Platform(ctx context.Context, in *PlatformRequest, opts ...grpc.CallOption) (*PlatformResponse, error) { + out := new(PlatformResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/Platform", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) StopSandbox(ctx context.Context, in *StopSandboxRequest, opts ...grpc.CallOption) (*StopSandboxResponse, error) { + out := new(StopSandboxResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/StopSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) WaitSandbox(ctx context.Context, in *WaitSandboxRequest, opts ...grpc.CallOption) (*WaitSandboxResponse, error) { + out := new(WaitSandboxResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/WaitSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) SandboxStatus(ctx context.Context, in *SandboxStatusRequest, opts ...grpc.CallOption) (*SandboxStatusResponse, error) { + out := new(SandboxStatusResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/SandboxStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) PingSandbox(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { + out := new(PingResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/PingSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sandboxClient) ShutdownSandbox(ctx context.Context, in *ShutdownSandboxRequest, opts ...grpc.CallOption) (*ShutdownSandboxResponse, error) { + out := new(ShutdownSandboxResponse) + err := c.cc.Invoke(ctx, "/containerd.runtime.sandbox.v1.Sandbox/ShutdownSandbox", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SandboxServer is the server API for Sandbox service. +// All implementations must embed UnimplementedSandboxServer +// for forward compatibility +type SandboxServer interface { + // CreateSandbox will be called right after sandbox shim instance launched. + // It is a good place to initialize sandbox environment. + CreateSandbox(context.Context, *CreateSandboxRequest) (*CreateSandboxResponse, error) + // StartSandbox will start previsouly created sandbox. + StartSandbox(context.Context, *StartSandboxRequest) (*StartSandboxResponse, error) + // Platform queries the platform the sandbox is going to run containers on. + // containerd will use this to generate a proper OCI spec. + Platform(context.Context, *PlatformRequest) (*PlatformResponse, error) + // StopSandbox will stop existing sandbox instance + StopSandbox(context.Context, *StopSandboxRequest) (*StopSandboxResponse, error) + // WaitSandbox blocks until sanbox exits. + WaitSandbox(context.Context, *WaitSandboxRequest) (*WaitSandboxResponse, error) + // SandboxStatus will return current status of the running sandbox instance + SandboxStatus(context.Context, *SandboxStatusRequest) (*SandboxStatusResponse, error) + // PingSandbox is a lightweight API call to check whether sandbox alive. + PingSandbox(context.Context, *PingRequest) (*PingResponse, error) + // ShutdownSandbox must shutdown shim instance. + ShutdownSandbox(context.Context, *ShutdownSandboxRequest) (*ShutdownSandboxResponse, error) + mustEmbedUnimplementedSandboxServer() +} + +// UnimplementedSandboxServer must be embedded to have forward compatible implementations. +type UnimplementedSandboxServer struct { +} + +func (UnimplementedSandboxServer) CreateSandbox(context.Context, *CreateSandboxRequest) (*CreateSandboxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSandbox not implemented") +} +func (UnimplementedSandboxServer) StartSandbox(context.Context, *StartSandboxRequest) (*StartSandboxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartSandbox not implemented") +} +func (UnimplementedSandboxServer) Platform(context.Context, *PlatformRequest) (*PlatformResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Platform not implemented") +} +func (UnimplementedSandboxServer) StopSandbox(context.Context, *StopSandboxRequest) (*StopSandboxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopSandbox not implemented") +} +func (UnimplementedSandboxServer) WaitSandbox(context.Context, *WaitSandboxRequest) (*WaitSandboxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WaitSandbox not implemented") +} +func (UnimplementedSandboxServer) SandboxStatus(context.Context, *SandboxStatusRequest) (*SandboxStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SandboxStatus not implemented") +} +func (UnimplementedSandboxServer) PingSandbox(context.Context, *PingRequest) (*PingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PingSandbox not implemented") +} +func (UnimplementedSandboxServer) ShutdownSandbox(context.Context, *ShutdownSandboxRequest) (*ShutdownSandboxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ShutdownSandbox not implemented") +} +func (UnimplementedSandboxServer) mustEmbedUnimplementedSandboxServer() {} + +// UnsafeSandboxServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SandboxServer will +// result in compilation errors. +type UnsafeSandboxServer interface { + mustEmbedUnimplementedSandboxServer() +} + +func RegisterSandboxServer(s grpc.ServiceRegistrar, srv SandboxServer) { + s.RegisterService(&Sandbox_ServiceDesc, srv) +} + +func _Sandbox_CreateSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSandboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).CreateSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/CreateSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).CreateSandbox(ctx, req.(*CreateSandboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_StartSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartSandboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).StartSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/StartSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).StartSandbox(ctx, req.(*StartSandboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_Platform_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PlatformRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).Platform(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/Platform", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).Platform(ctx, req.(*PlatformRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_StopSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StopSandboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).StopSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/StopSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).StopSandbox(ctx, req.(*StopSandboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_WaitSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WaitSandboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).WaitSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/WaitSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).WaitSandbox(ctx, req.(*WaitSandboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_SandboxStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SandboxStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).SandboxStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/SandboxStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).SandboxStatus(ctx, req.(*SandboxStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_PingSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).PingSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/PingSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).PingSandbox(ctx, req.(*PingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Sandbox_ShutdownSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ShutdownSandboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SandboxServer).ShutdownSandbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/containerd.runtime.sandbox.v1.Sandbox/ShutdownSandbox", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SandboxServer).ShutdownSandbox(ctx, req.(*ShutdownSandboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Sandbox_ServiceDesc is the grpc.ServiceDesc for Sandbox service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Sandbox_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "containerd.runtime.sandbox.v1.Sandbox", + HandlerType: (*SandboxServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateSandbox", + Handler: _Sandbox_CreateSandbox_Handler, + }, + { + MethodName: "StartSandbox", + Handler: _Sandbox_StartSandbox_Handler, + }, + { + MethodName: "Platform", + Handler: _Sandbox_Platform_Handler, + }, + { + MethodName: "StopSandbox", + Handler: _Sandbox_StopSandbox_Handler, + }, + { + MethodName: "WaitSandbox", + Handler: _Sandbox_WaitSandbox_Handler, + }, + { + MethodName: "SandboxStatus", + Handler: _Sandbox_SandboxStatus_Handler, + }, + { + MethodName: "PingSandbox", + Handler: _Sandbox_PingSandbox_Handler, + }, + { + MethodName: "ShutdownSandbox", + Handler: _Sandbox_ShutdownSandbox_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto", +} diff --git a/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_ttrpc.pb.go b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_ttrpc.pb.go new file mode 100644 index 000000000..d935fe611 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_ttrpc.pb.go @@ -0,0 +1,156 @@ +// Code generated by protoc-gen-go-ttrpc. DO NOT EDIT. +// source: github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto +package sandbox + +import ( + context "context" + ttrpc "github.com/containerd/ttrpc" +) + +type TTRPCSandboxService interface { + CreateSandbox(context.Context, *CreateSandboxRequest) (*CreateSandboxResponse, error) + StartSandbox(context.Context, *StartSandboxRequest) (*StartSandboxResponse, error) + Platform(context.Context, *PlatformRequest) (*PlatformResponse, error) + StopSandbox(context.Context, *StopSandboxRequest) (*StopSandboxResponse, error) + WaitSandbox(context.Context, *WaitSandboxRequest) (*WaitSandboxResponse, error) + SandboxStatus(context.Context, *SandboxStatusRequest) (*SandboxStatusResponse, error) + PingSandbox(context.Context, *PingRequest) (*PingResponse, error) + ShutdownSandbox(context.Context, *ShutdownSandboxRequest) (*ShutdownSandboxResponse, error) +} + +func RegisterTTRPCSandboxService(srv *ttrpc.Server, svc TTRPCSandboxService) { + srv.RegisterService("containerd.runtime.sandbox.v1.Sandbox", &ttrpc.ServiceDesc{ + Methods: map[string]ttrpc.Method{ + "CreateSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req CreateSandboxRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.CreateSandbox(ctx, &req) + }, + "StartSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req StartSandboxRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.StartSandbox(ctx, &req) + }, + "Platform": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req PlatformRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.Platform(ctx, &req) + }, + "StopSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req StopSandboxRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.StopSandbox(ctx, &req) + }, + "WaitSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req WaitSandboxRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.WaitSandbox(ctx, &req) + }, + "SandboxStatus": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req SandboxStatusRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.SandboxStatus(ctx, &req) + }, + "PingSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req PingRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.PingSandbox(ctx, &req) + }, + "ShutdownSandbox": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + var req ShutdownSandboxRequest + if err := unmarshal(&req); err != nil { + return nil, err + } + return svc.ShutdownSandbox(ctx, &req) + }, + }, + }) +} + +type ttrpcsandboxClient struct { + client *ttrpc.Client +} + +func NewTTRPCSandboxClient(client *ttrpc.Client) TTRPCSandboxService { + return &ttrpcsandboxClient{ + client: client, + } +} + +func (c *ttrpcsandboxClient) CreateSandbox(ctx context.Context, req *CreateSandboxRequest) (*CreateSandboxResponse, error) { + var resp CreateSandboxResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "CreateSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) StartSandbox(ctx context.Context, req *StartSandboxRequest) (*StartSandboxResponse, error) { + var resp StartSandboxResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "StartSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) Platform(ctx context.Context, req *PlatformRequest) (*PlatformResponse, error) { + var resp PlatformResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "Platform", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) StopSandbox(ctx context.Context, req *StopSandboxRequest) (*StopSandboxResponse, error) { + var resp StopSandboxResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "StopSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) WaitSandbox(ctx context.Context, req *WaitSandboxRequest) (*WaitSandboxResponse, error) { + var resp WaitSandboxResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "WaitSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) SandboxStatus(ctx context.Context, req *SandboxStatusRequest) (*SandboxStatusResponse, error) { + var resp SandboxStatusResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "SandboxStatus", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) PingSandbox(ctx context.Context, req *PingRequest) (*PingResponse, error) { + var resp PingResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "PingSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func (c *ttrpcsandboxClient) ShutdownSandbox(ctx context.Context, req *ShutdownSandboxRequest) (*ShutdownSandboxResponse, error) { + var resp ShutdownSandboxResponse + if err := c.client.Call(ctx, "containerd.runtime.sandbox.v1.Sandbox", "ShutdownSandbox", req, &resp); err != nil { + return nil, err + } + return &resp, nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go b/tools/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go new file mode 100644 index 000000000..f3db1c52d --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go @@ -0,0 +1,206 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/types/descriptor.proto + +package types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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) +) + +// Descriptor describes a blob in a content store. +// +// This descriptor can be used to reference content from an +// oci descriptor found in a manifest. +// See https://godoc.org/github.com/opencontainers/image-spec/specs-go/v1#Descriptor +type Descriptor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MediaType string `protobuf:"bytes,1,opt,name=media_type,json=mediaType,proto3" json:"media_type,omitempty"` + Digest string `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"` + Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + Annotations map[string]string `protobuf:"bytes,5,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Descriptor) Reset() { + *x = Descriptor{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_descriptor_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Descriptor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Descriptor) ProtoMessage() {} + +func (x *Descriptor) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_descriptor_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) +} + +// Deprecated: Use Descriptor.ProtoReflect.Descriptor instead. +func (*Descriptor) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescGZIP(), []int{0} +} + +func (x *Descriptor) GetMediaType() string { + if x != nil { + return x.MediaType + } + return "" +} + +func (x *Descriptor) GetDigest() string { + if x != nil { + return x.Digest + } + return "" +} + +func (x *Descriptor) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Descriptor) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +var File_github_com_containerd_containerd_api_types_descriptor_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_types_descriptor_proto_rawDesc = []byte{ + 0x0a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, + 0xe8, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescData = file_github_com_containerd_containerd_api_types_descriptor_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_types_descriptor_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_types_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_github_com_containerd_containerd_api_types_descriptor_proto_goTypes = []interface{}{ + (*Descriptor)(nil), // 0: containerd.types.Descriptor + nil, // 1: containerd.types.Descriptor.AnnotationsEntry +} +var file_github_com_containerd_containerd_api_types_descriptor_proto_depIdxs = []int32{ + 1, // 0: containerd.types.Descriptor.annotations:type_name -> containerd.types.Descriptor.AnnotationsEntry + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_types_descriptor_proto_init() } +func file_github_com_containerd_containerd_api_types_descriptor_proto_init() { + if File_github_com_containerd_containerd_api_types_descriptor_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_types_descriptor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Descriptor); 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_github_com_containerd_containerd_api_types_descriptor_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_types_descriptor_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_types_descriptor_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_types_descriptor_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_types_descriptor_proto = out.File + file_github_com_containerd_containerd_api_types_descriptor_proto_rawDesc = nil + file_github_com_containerd_containerd_api_types_descriptor_proto_goTypes = nil + file_github_com_containerd_containerd_api_types_descriptor_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/descriptor.proto b/tools/vendor/github.com/containerd/containerd/api/types/descriptor.proto new file mode 100644 index 000000000..faaf416dd --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/descriptor.proto @@ -0,0 +1,33 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.types; + +option go_package = "github.com/containerd/containerd/api/types;types"; + +// Descriptor describes a blob in a content store. +// +// This descriptor can be used to reference content from an +// oci descriptor found in a manifest. +// See https://godoc.org/github.com/opencontainers/image-spec/specs-go/v1#Descriptor +message Descriptor { + string media_type = 1; + string digest = 2; + int64 size = 3; + map annotations = 5; +} diff --git a/tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.s b/tools/vendor/github.com/containerd/containerd/api/types/doc.go similarity index 97% rename from tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.s rename to tools/vendor/github.com/containerd/containerd/api/types/doc.go index c073fa4ad..475b465ed 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.s +++ b/tools/vendor/github.com/containerd/containerd/api/types/doc.go @@ -13,3 +13,5 @@ See the License for the specific language governing permissions and limitations under the License. */ + +package types diff --git a/tools/vendor/github.com/containerd/containerd/api/types/metrics.pb.go b/tools/vendor/github.com/containerd/containerd/api/types/metrics.pb.go new file mode 100644 index 000000000..b18ce1c5b --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/metrics.pb.go @@ -0,0 +1,194 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/types/metrics.proto + +package types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +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 Metric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + ID string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Data *anypb.Any `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *Metric) Reset() { + *x = Metric{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_metrics_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Metric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Metric) ProtoMessage() {} + +func (x *Metric) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_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) +} + +// Deprecated: Use Metric.ProtoReflect.Descriptor instead. +func (*Metric) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_metrics_proto_rawDescGZIP(), []int{0} +} + +func (x *Metric) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *Metric) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *Metric) GetData() *anypb.Any { + if x != nil { + return x.Data + } + return nil +} + +var File_github_com_containerd_containerd_api_types_metrics_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_types_metrics_proto_rawDesc = []byte{ + 0x0a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 0x7c, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 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, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_types_metrics_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_types_metrics_proto_rawDescData = file_github_com_containerd_containerd_api_types_metrics_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_types_metrics_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_types_metrics_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_types_metrics_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_types_metrics_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_types_metrics_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_types_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_github_com_containerd_containerd_api_types_metrics_proto_goTypes = []interface{}{ + (*Metric)(nil), // 0: containerd.types.Metric + (*timestamppb.Timestamp)(nil), // 1: google.protobuf.Timestamp + (*anypb.Any)(nil), // 2: google.protobuf.Any +} +var file_github_com_containerd_containerd_api_types_metrics_proto_depIdxs = []int32{ + 1, // 0: containerd.types.Metric.timestamp:type_name -> google.protobuf.Timestamp + 2, // 1: containerd.types.Metric.data:type_name -> google.protobuf.Any + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_types_metrics_proto_init() } +func file_github_com_containerd_containerd_api_types_metrics_proto_init() { + if File_github_com_containerd_containerd_api_types_metrics_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_types_metrics_proto_msgTypes[0].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 + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_github_com_containerd_containerd_api_types_metrics_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_types_metrics_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_types_metrics_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_types_metrics_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_types_metrics_proto = out.File + file_github_com_containerd_containerd_api_types_metrics_proto_rawDesc = nil + file_github_com_containerd_containerd_api_types_metrics_proto_goTypes = nil + file_github_com_containerd_containerd_api_types_metrics_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/metrics.proto b/tools/vendor/github.com/containerd/containerd/api/types/metrics.proto new file mode 100644 index 000000000..3e6a7751e --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/metrics.proto @@ -0,0 +1,30 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.types; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/containerd/containerd/api/types;types"; + +message Metric { + google.protobuf.Timestamp timestamp = 1; + string id = 2; + google.protobuf.Any data = 3; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/mount.pb.go b/tools/vendor/github.com/containerd/containerd/api/types/mount.pb.go new file mode 100644 index 000000000..ff77a7d7b --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/mount.pb.go @@ -0,0 +1,202 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/types/mount.proto + +package types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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) +) + +// Mount describes mounts for a container. +// +// This type is the lingua franca of ContainerD. All services provide mounts +// to be used with the container at creation time. +// +// The Mount type follows the structure of the mount syscall, including a type, +// source, target and options. +type Mount struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Type defines the nature of the mount. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Source specifies the name of the mount. Depending on mount type, this + // may be a volume name or a host path, or even ignored. + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + // Target path in container + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` + // Options specifies zero or more fstab style mount options. + Options []string `protobuf:"bytes,4,rep,name=options,proto3" json:"options,omitempty"` +} + +func (x *Mount) Reset() { + *x = Mount{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_mount_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Mount) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Mount) ProtoMessage() {} + +func (x *Mount) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_mount_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) +} + +// Deprecated: Use Mount.ProtoReflect.Descriptor instead. +func (*Mount) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_mount_proto_rawDescGZIP(), []int{0} +} + +func (x *Mount) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Mount) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *Mount) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *Mount) GetOptions() []string { + if x != nil { + return x.Options + } + return nil +} + +var File_github_com_containerd_containerd_api_types_mount_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_types_mount_proto_rawDesc = []byte{ + 0x0a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x05, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_types_mount_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_types_mount_proto_rawDescData = file_github_com_containerd_containerd_api_types_mount_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_types_mount_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_types_mount_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_types_mount_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_types_mount_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_types_mount_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_types_mount_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_github_com_containerd_containerd_api_types_mount_proto_goTypes = []interface{}{ + (*Mount)(nil), // 0: containerd.types.Mount +} +var file_github_com_containerd_containerd_api_types_mount_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_types_mount_proto_init() } +func file_github_com_containerd_containerd_api_types_mount_proto_init() { + if File_github_com_containerd_containerd_api_types_mount_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_types_mount_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Mount); 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_github_com_containerd_containerd_api_types_mount_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_types_mount_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_types_mount_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_types_mount_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_types_mount_proto = out.File + file_github_com_containerd_containerd_api_types_mount_proto_rawDesc = nil + file_github_com_containerd_containerd_api_types_mount_proto_goTypes = nil + file_github_com_containerd_containerd_api_types_mount_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/mount.proto b/tools/vendor/github.com/containerd/containerd/api/types/mount.proto new file mode 100644 index 000000000..54e0a0cdd --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/mount.proto @@ -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. +*/ + +syntax = "proto3"; + +package containerd.types; + +option go_package = "github.com/containerd/containerd/api/types;types"; + +// Mount describes mounts for a container. +// +// This type is the lingua franca of ContainerD. All services provide mounts +// to be used with the container at creation time. +// +// The Mount type follows the structure of the mount syscall, including a type, +// source, target and options. +message Mount { + // Type defines the nature of the mount. + string type = 1; + + // Source specifies the name of the mount. Depending on mount type, this + // may be a volume name or a host path, or even ignored. + string source = 2; + + // Target path in container + string target = 3; + + // Options specifies zero or more fstab style mount options. + repeated string options = 4; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/platform.pb.go b/tools/vendor/github.com/containerd/containerd/api/types/platform.pb.go new file mode 100644 index 000000000..3e206cbaf --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/platform.pb.go @@ -0,0 +1,184 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/types/platform.proto + +package types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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) +) + +// Platform follows the structure of the OCI platform specification, from +// descriptors. +type Platform struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OS string `protobuf:"bytes,1,opt,name=os,proto3" json:"os,omitempty"` + Architecture string `protobuf:"bytes,2,opt,name=architecture,proto3" json:"architecture,omitempty"` + Variant string `protobuf:"bytes,3,opt,name=variant,proto3" json:"variant,omitempty"` +} + +func (x *Platform) Reset() { + *x = Platform{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_platform_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Platform) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Platform) ProtoMessage() {} + +func (x *Platform) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_platform_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) +} + +// Deprecated: Use Platform.ProtoReflect.Descriptor instead. +func (*Platform) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_platform_proto_rawDescGZIP(), []int{0} +} + +func (x *Platform) GetOS() string { + if x != nil { + return x.OS + } + return "" +} + +func (x *Platform) GetArchitecture() string { + if x != nil { + return x.Architecture + } + return "" +} + +func (x *Platform) GetVariant() string { + if x != nil { + return x.Variant + } + return "" +} + +var File_github_com_containerd_containerd_api_types_platform_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_types_platform_proto_rawDesc = []byte{ + 0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x58, 0x0a, + 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_types_platform_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_types_platform_proto_rawDescData = file_github_com_containerd_containerd_api_types_platform_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_types_platform_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_types_platform_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_types_platform_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_types_platform_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_types_platform_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_types_platform_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_github_com_containerd_containerd_api_types_platform_proto_goTypes = []interface{}{ + (*Platform)(nil), // 0: containerd.types.Platform +} +var file_github_com_containerd_containerd_api_types_platform_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_types_platform_proto_init() } +func file_github_com_containerd_containerd_api_types_platform_proto_init() { + if File_github_com_containerd_containerd_api_types_platform_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_types_platform_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Platform); 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_github_com_containerd_containerd_api_types_platform_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_types_platform_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_types_platform_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_types_platform_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_types_platform_proto = out.File + file_github_com_containerd_containerd_api_types_platform_proto_rawDesc = nil + file_github_com_containerd_containerd_api_types_platform_proto_goTypes = nil + file_github_com_containerd_containerd_api_types_platform_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/platform.proto b/tools/vendor/github.com/containerd/containerd/api/types/platform.proto new file mode 100644 index 000000000..b6088251f --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/platform.proto @@ -0,0 +1,29 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.types; + +option go_package = "github.com/containerd/containerd/api/types;types"; + +// Platform follows the structure of the OCI platform specification, from +// descriptors. +message Platform { + string os = 1; + string architecture = 2; + string variant = 3; +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/sandbox.pb.go b/tools/vendor/github.com/containerd/containerd/api/types/sandbox.pb.go new file mode 100644 index 000000000..67594f416 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/sandbox.pb.go @@ -0,0 +1,346 @@ +// +//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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/api/types/sandbox.proto + +package types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +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) +) + +// Sandbox represents a sandbox metadata object that keeps all info required by controller to +// work with a particular instance. +type Sandbox struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // SandboxID is a unique instance identifier within namespace + SandboxID string `protobuf:"bytes,1,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + // Runtime specifies which runtime to use for executing this container. + Runtime *Sandbox_Runtime `protobuf:"bytes,2,opt,name=runtime,proto3" json:"runtime,omitempty"` + // Spec is sandbox configuration (kin of OCI runtime spec), spec's data will be written to a config.json file in the + // bundle directory (similary to OCI spec). + Spec *anypb.Any `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + // Labels provides an area to include arbitrary data on containers. + Labels map[string]string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // CreatedAt is the time the container was first created. + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // UpdatedAt is the last time the container was mutated. + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Extensions allow clients to provide optional blobs that can be handled by runtime. + Extensions map[string]*anypb.Any `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Sandbox) Reset() { + *x = Sandbox{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Sandbox) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Sandbox) ProtoMessage() {} + +func (x *Sandbox) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_sandbox_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) +} + +// Deprecated: Use Sandbox.ProtoReflect.Descriptor instead. +func (*Sandbox) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescGZIP(), []int{0} +} + +func (x *Sandbox) GetSandboxID() string { + if x != nil { + return x.SandboxID + } + return "" +} + +func (x *Sandbox) GetRuntime() *Sandbox_Runtime { + if x != nil { + return x.Runtime + } + return nil +} + +func (x *Sandbox) GetSpec() *anypb.Any { + if x != nil { + return x.Spec + } + return nil +} + +func (x *Sandbox) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +func (x *Sandbox) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *Sandbox) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *Sandbox) GetExtensions() map[string]*anypb.Any { + if x != nil { + return x.Extensions + } + return nil +} + +type Sandbox_Runtime struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name is the name of the runtime. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Options specify additional runtime initialization options for the shim (this data will be available in StartShim). + // Typically this data expected to be runtime shim implementation specific. + Options *anypb.Any `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` +} + +func (x *Sandbox_Runtime) Reset() { + *x = Sandbox_Runtime{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Sandbox_Runtime) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Sandbox_Runtime) ProtoMessage() {} + +func (x *Sandbox_Runtime) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_containerd_api_types_sandbox_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) +} + +// Deprecated: Use Sandbox_Runtime.ProtoReflect.Descriptor instead. +func (*Sandbox_Runtime) Descriptor() ([]byte, []int) { + return file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *Sandbox_Runtime) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Sandbox_Runtime) GetOptions() *anypb.Any { + if x != nil { + return x.Options + } + return nil +} + +var File_github_com_containerd_containerd_api_types_sandbox_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_api_types_sandbox_proto_rawDesc = []byte{ + 0x0a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 0xee, 0x04, 0x0a, 0x07, 0x53, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x49, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4d, 0x0a, 0x07, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x53, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescOnce sync.Once + file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescData = file_github_com_containerd_containerd_api_types_sandbox_proto_rawDesc +) + +func file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescGZIP() []byte { + file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescOnce.Do(func() { + file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescData) + }) + return file_github_com_containerd_containerd_api_types_sandbox_proto_rawDescData +} + +var file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_github_com_containerd_containerd_api_types_sandbox_proto_goTypes = []interface{}{ + (*Sandbox)(nil), // 0: containerd.types.Sandbox + (*Sandbox_Runtime)(nil), // 1: containerd.types.Sandbox.Runtime + nil, // 2: containerd.types.Sandbox.LabelsEntry + nil, // 3: containerd.types.Sandbox.ExtensionsEntry + (*anypb.Any)(nil), // 4: google.protobuf.Any + (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp +} +var file_github_com_containerd_containerd_api_types_sandbox_proto_depIdxs = []int32{ + 1, // 0: containerd.types.Sandbox.runtime:type_name -> containerd.types.Sandbox.Runtime + 4, // 1: containerd.types.Sandbox.spec:type_name -> google.protobuf.Any + 2, // 2: containerd.types.Sandbox.labels:type_name -> containerd.types.Sandbox.LabelsEntry + 5, // 3: containerd.types.Sandbox.created_at:type_name -> google.protobuf.Timestamp + 5, // 4: containerd.types.Sandbox.updated_at:type_name -> google.protobuf.Timestamp + 3, // 5: containerd.types.Sandbox.extensions:type_name -> containerd.types.Sandbox.ExtensionsEntry + 4, // 6: containerd.types.Sandbox.Runtime.options:type_name -> google.protobuf.Any + 4, // 7: containerd.types.Sandbox.ExtensionsEntry.value:type_name -> google.protobuf.Any + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_api_types_sandbox_proto_init() } +func file_github_com_containerd_containerd_api_types_sandbox_proto_init() { + if File_github_com_containerd_containerd_api_types_sandbox_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Sandbox); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Sandbox_Runtime); 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_github_com_containerd_containerd_api_types_sandbox_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_api_types_sandbox_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_api_types_sandbox_proto_depIdxs, + MessageInfos: file_github_com_containerd_containerd_api_types_sandbox_proto_msgTypes, + }.Build() + File_github_com_containerd_containerd_api_types_sandbox_proto = out.File + file_github_com_containerd_containerd_api_types_sandbox_proto_rawDesc = nil + file_github_com_containerd_containerd_api_types_sandbox_proto_goTypes = nil + file_github_com_containerd_containerd_api_types_sandbox_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/containerd/api/types/sandbox.proto b/tools/vendor/github.com/containerd/containerd/api/types/sandbox.proto new file mode 100644 index 000000000..b60770619 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/api/types/sandbox.proto @@ -0,0 +1,51 @@ +/* + 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. +*/ + +syntax = "proto3"; + +package containerd.types; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/containerd/containerd/api/types;types"; + +// Sandbox represents a sandbox metadata object that keeps all info required by controller to +// work with a particular instance. +message Sandbox { + // SandboxID is a unique instance identifier within namespace + string sandbox_id = 1; + message Runtime { + // Name is the name of the runtime. + string name = 1; + // Options specify additional runtime initialization options for the shim (this data will be available in StartShim). + // Typically this data expected to be runtime shim implementation specific. + google.protobuf.Any options = 2; + } + // Runtime specifies which runtime to use for executing this container. + Runtime runtime = 2; + // Spec is sandbox configuration (kin of OCI runtime spec), spec's data will be written to a config.json file in the + // bundle directory (similary to OCI spec). + google.protobuf.Any spec = 3; + // Labels provides an area to include arbitrary data on containers. + map labels = 4; + // CreatedAt is the time the container was first created. + google.protobuf.Timestamp created_at = 5; + // UpdatedAt is the last time the container was mutated. + google.protobuf.Timestamp updated_at = 6; + // Extensions allow clients to provide optional blobs that can be handled by runtime. + map extensions = 7; +} diff --git a/tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.go b/tools/vendor/github.com/containerd/containerd/archive/compression/compression_fuzzer.go similarity index 68% rename from tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.go rename to tools/vendor/github.com/containerd/containerd/archive/compression/compression_fuzzer.go index c7cb0c034..3516494ac 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/subprocess_unsafe_linux.go +++ b/tools/vendor/github.com/containerd/containerd/archive/compression/compression_fuzzer.go @@ -1,3 +1,5 @@ +//go:build gofuzz + /* Copyright The containerd Authors. @@ -14,17 +16,13 @@ limitations under the License. */ -package mount +package compression import ( - _ "unsafe" // required for go:linkname. + "bytes" ) -//go:linkname beforeFork syscall.runtime_BeforeFork -func beforeFork() - -//go:linkname afterFork syscall.runtime_AfterFork -func afterFork() - -//go:linkname afterForkInChild syscall.runtime_AfterForkInChild -func afterForkInChild() +func FuzzDecompressStream(data []byte) int { + _, _ = DecompressStream(bytes.NewReader(data)) + return 1 +} diff --git a/tools/vendor/github.com/containerd/containerd/sys/userns_deprecated.go b/tools/vendor/github.com/containerd/containerd/archive/link_default.go similarity index 68% rename from tools/vendor/github.com/containerd/containerd/sys/userns_deprecated.go rename to tools/vendor/github.com/containerd/containerd/archive/link_default.go index 53acf5547..84a8997eb 100644 --- a/tools/vendor/github.com/containerd/containerd/sys/userns_deprecated.go +++ b/tools/vendor/github.com/containerd/containerd/archive/link_default.go @@ -1,3 +1,5 @@ +//go:build !freebsd + /* Copyright The containerd Authors. @@ -14,10 +16,10 @@ limitations under the License. */ -package sys +package archive -import "github.com/containerd/containerd/pkg/userns" +import "os" -// 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 +func link(oldname, newname string) error { + return os.Link(oldname, newname) +} diff --git a/tools/vendor/github.com/containerd/containerd/archive/link_freebsd.go b/tools/vendor/github.com/containerd/containerd/archive/link_freebsd.go new file mode 100644 index 000000000..2097db06b --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/archive/link_freebsd.go @@ -0,0 +1,82 @@ +/* + 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 archive + +import ( + "os" + "syscall" + + "golang.org/x/sys/unix" +) + +func link(oldname, newname string) error { + e := ignoringEINTR(func() error { + return unix.Linkat(unix.AT_FDCWD, oldname, unix.AT_FDCWD, newname, 0) + }) + if e != nil { + return &os.LinkError{Op: "link", Old: oldname, New: newname, Err: e} + } + return nil +} + +// The following contents were copied from Go 1.18.2. +// Use of this source code is governed by the following +// BSD-style license: +// +// 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. + +// ignoringEINTR makes a function call and repeats it if it returns an +// EINTR error. This appears to be required even though we install all +// signal handlers with SA_RESTART: see #22838, #38033, #38836, #40846. +// Also #20400 and #36644 are issues in which a signal handler is +// installed without setting SA_RESTART. None of these are the common case, +// but there are enough of them that it seems that we can't avoid +// an EINTR loop. +func ignoringEINTR(fn func() error) error { + for { + err := fn() + if err != syscall.EINTR { + return err + } + } +} diff --git a/tools/vendor/github.com/containerd/containerd/archive/tar.go b/tools/vendor/github.com/containerd/containerd/archive/tar.go index a57074e77..28b623dcf 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/tar.go +++ b/tools/vendor/github.com/containerd/containerd/archive/tar.go @@ -24,13 +24,14 @@ import ( "io" "os" "path/filepath" - "runtime" "strings" "sync" "syscall" "time" + "github.com/containerd/containerd/archive/tarheader" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/pkg/epoch" "github.com/containerd/containerd/pkg/userns" "github.com/containerd/continuity/fs" ) @@ -51,11 +52,11 @@ var errInvalidArchive = errors.New("invalid archive") // files will be prepended with the prefix ".wh.". This style is // based off AUFS whiteouts. // See https://github.com/opencontainers/image-spec/blob/main/layer.md -func Diff(ctx context.Context, a, b string) io.ReadCloser { +func Diff(ctx context.Context, a, b string, opts ...WriteDiffOpt) io.ReadCloser { r, w := io.Pipe() go func() { - err := WriteDiff(ctx, w, a, b) + err := WriteDiff(ctx, w, a, b, opts...) if err != nil { log.G(ctx).WithError(err).Debugf("write diff failed") } @@ -81,6 +82,10 @@ func WriteDiff(ctx context.Context, w io.Writer, a, b string, opts ...WriteDiffO return fmt.Errorf("failed to apply option: %w", err) } } + if tm := epoch.FromContext(ctx); tm != nil && options.SourceDateEpoch == nil { + options.SourceDateEpoch = tm + } + if options.writeDiffFunc == nil { options.writeDiffFunc = writeDiffNaive } @@ -95,8 +100,14 @@ func WriteDiff(ctx context.Context, w io.Writer, a, b string, opts ...WriteDiffO // files will be prepended with the prefix ".wh.". This style is // based off AUFS whiteouts. // See https://github.com/opencontainers/image-spec/blob/main/layer.md -func writeDiffNaive(ctx context.Context, w io.Writer, a, b string, _ WriteDiffOptions) error { - cw := NewChangeWriter(w, b) +func writeDiffNaive(ctx context.Context, w io.Writer, a, b string, o WriteDiffOptions) error { + var opts []ChangeWriterOpt + if o.SourceDateEpoch != nil { + opts = append(opts, + WithModTimeUpperBound(*o.SourceDateEpoch), + WithWhiteoutTime(*o.SourceDateEpoch)) + } + cw := NewChangeWriter(w, b, opts...) err := fs.Changes(ctx, a, b, cw.HandleChange) if err != nil { return fmt.Errorf("failed to create diff tar stream: %w", err) @@ -120,6 +131,8 @@ const ( whiteoutOpaqueDir = whiteoutMetaPrefix + ".opq" paxSchilyXattr = "SCHILY.xattr." + + userXattrPrefix = "user." ) // Apply applies a tar stream of an OCI style diff tar. @@ -288,7 +301,7 @@ func applyNaive(ctx context.Context, root string, r io.Reader, options ApplyOpti srcData := io.Reader(tr) srcHdr := hdr - if err := createTarFile(ctx, path, root, srcHdr, srcData); err != nil { + if err := createTarFile(ctx, path, root, srcHdr, srcData, options.NoSameOwner); err != nil { return 0, err } @@ -313,7 +326,7 @@ func applyNaive(ctx context.Context, root string, r io.Reader, options ApplyOpti return size, nil } -func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header, reader io.Reader) error { +func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header, reader io.Reader, noSameOwner bool) error { // hdr.Mode is in linux format, which we can use for syscalls, // but for os.Foo() calls we need the mode converted to os.FileMode, // so use hdrInfo.Mode() (they differ for e.g. setuid bits) @@ -329,6 +342,7 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header } } + //nolint:staticcheck // TypeRegA is deprecated but we may still receive an external tar with TypeRegA case tar.TypeReg, tar.TypeRegA: file, err := openFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, hdrInfo.Mode()) if err != nil { @@ -361,7 +375,7 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header return err } - if err := os.Link(targetPath, path); err != nil { + if err := link(targetPath, path); err != nil { return err } @@ -378,8 +392,7 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header return fmt.Errorf("unhandled tar header type %d", hdr.Typeflag) } - // Lchown is not supported on Windows. - if runtime.GOOS != "windows" { + if !noSameOwner { if err := os.Lchown(path, hdr.Uid, hdr.Gid); err != nil { err = fmt.Errorf("failed to Lchown %q for UID %d, GID %d: %w", path, hdr.Uid, hdr.Gid, err) if errors.Is(err, syscall.EINVAL) && userns.RunningInUserNS() { @@ -393,11 +406,19 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header if strings.HasPrefix(key, paxSchilyXattr) { key = key[len(paxSchilyXattr):] if err := setxattr(path, key, value); err != nil { + if errors.Is(err, syscall.EPERM) && strings.HasPrefix(key, userXattrPrefix) { + // In the user.* namespace, only regular files and directories can have extended attributes. + // See https://man7.org/linux/man-pages/man7/xattr.7.html for details. + if fi, err := os.Lstat(path); err == nil && (!fi.Mode().IsRegular() && !fi.Mode().IsDir()) { + log.G(ctx).WithError(err).Warnf("ignored xattr %s in archive", key) + continue + } + } if errors.Is(err, syscall.ENOTSUP) { log.G(ctx).WithError(err).Warnf("ignored xattr %s in archive", key) continue } - return err + return fmt.Errorf("failed to setxattr %q for key %q: %w", path, key, err) } } } @@ -481,26 +502,48 @@ func mkparent(ctx context.Context, path, root string, parents []string) error { // See also https://github.com/opencontainers/image-spec/blob/main/layer.md for details // about OCI layers type ChangeWriter struct { - tw *tar.Writer - source string - whiteoutT time.Time - inodeSrc map[uint64]string - inodeRefs map[uint64][]string - addedDirs map[string]struct{} + tw *tar.Writer + source string + modTimeUpperBound *time.Time + whiteoutT time.Time + inodeSrc map[uint64]string + inodeRefs map[uint64][]string + addedDirs map[string]struct{} +} + +// ChangeWriterOpt can be specified in NewChangeWriter. +type ChangeWriterOpt func(cw *ChangeWriter) + +// WithModTimeUpperBound sets the mod time upper bound. +func WithModTimeUpperBound(tm time.Time) ChangeWriterOpt { + return func(cw *ChangeWriter) { + cw.modTimeUpperBound = &tm + } +} + +// WithWhiteoutTime sets the whiteout timestamp. +func WithWhiteoutTime(tm time.Time) ChangeWriterOpt { + return func(cw *ChangeWriter) { + cw.whiteoutT = tm + } } // NewChangeWriter returns ChangeWriter that writes tar stream of the source directory // to the privided writer. Change information (add/modify/delete/unmodified) for each // file needs to be passed through HandleChange method. -func NewChangeWriter(w io.Writer, source string) *ChangeWriter { - return &ChangeWriter{ +func NewChangeWriter(w io.Writer, source string, opts ...ChangeWriterOpt) *ChangeWriter { + cw := &ChangeWriter{ tw: tar.NewWriter(w), source: source, - whiteoutT: time.Now(), + whiteoutT: time.Now(), // can be overridden with WithWhiteoutTime(time.Time) ChangeWriterOpt . inodeSrc: map[uint64]string{}, inodeRefs: map[uint64][]string{}, addedDirs: map[string]struct{}{}, } + for _, o := range opts { + o(cw) + } + return cw } // HandleChange receives filesystem change information and reflect that information to @@ -544,7 +587,8 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e } } - hdr, err := tar.FileInfoHeader(f, link) + // Use FileInfoHeaderNoLookups to avoid propagating user names and group names from the host + hdr, err := tarheader.FileInfoHeaderNoLookups(f, link) if err != nil { return err } @@ -553,6 +597,9 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e // truncate timestamp for compatibility. without PAX stdlib rounds timestamps instead hdr.Format = tar.FormatPAX + if cw.modTimeUpperBound != nil && hdr.ModTime.After(*cw.modTimeUpperBound) { + hdr.ModTime = *cw.modTimeUpperBound + } hdr.ModTime = hdr.ModTime.Truncate(time.Second) hdr.AccessTime = time.Time{} hdr.ChangeTime = time.Time{} @@ -564,11 +611,9 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e return fmt.Errorf("failed to make path relative: %w", err) } } - name, err = tarName(name) - if err != nil { - return fmt.Errorf("cannot canonicalize path: %w", err) - } - // suffix with '/' for directories + // Canonicalize to POSIX-style paths using forward slashes. Directory + // entries must end with a slash. + name = filepath.ToSlash(name) if f.IsDir() && !strings.HasSuffix(name, "/") { name += "/" } diff --git a/tools/vendor/github.com/containerd/containerd/archive/tar_mostunix.go b/tools/vendor/github.com/containerd/containerd/archive/tar_mostunix.go index d2d970356..ca5e602a0 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/tar_mostunix.go +++ b/tools/vendor/github.com/containerd/containerd/archive/tar_mostunix.go @@ -1,5 +1,4 @@ //go:build !windows && !freebsd -// +build !windows,!freebsd /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/archive/tar_opts.go b/tools/vendor/github.com/containerd/containerd/archive/tar_opts.go index 58985555a..ac3a03c8d 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/tar_opts.go +++ b/tools/vendor/github.com/containerd/containerd/archive/tar_opts.go @@ -20,6 +20,7 @@ import ( "archive/tar" "context" "io" + "time" ) // ApplyOptions provides additional options for an Apply operation @@ -27,6 +28,7 @@ type ApplyOptions struct { Filter Filter // Filter tar headers ConvertWhiteout ConvertWhiteout // Convert whiteout files Parents []string // Parent directories to handle inherited attributes without CoW + NoSameOwner bool // NoSameOwner will not attempt to preserve the owner specified in the tar archive. applyFunc func(context.Context, string, io.Reader, ApplyOptions) (int64, error) } @@ -61,6 +63,15 @@ func WithConvertWhiteout(c ConvertWhiteout) ApplyOpt { } } +// WithNoSameOwner is same as '--no-same-owner` in 'tar' command. +// It'll skip attempt to preserve the owner specified in the tar archive. +func WithNoSameOwner() ApplyOpt { + return func(options *ApplyOptions) error { + options.NoSameOwner = true + return nil + } +} + // WithParents provides parent directories for resolving inherited attributes // directory from the filesystem. // Inherited attributes are searched from first to last, making the first @@ -79,7 +90,22 @@ type WriteDiffOptions struct { ParentLayers []string // Windows needs the full list of parent layers writeDiffFunc func(context.Context, io.Writer, string, string, WriteDiffOptions) error + + // SourceDateEpoch specifies the following timestamps to provide control for reproducibility. + // - The upper bound timestamp of the diff contents + // - The timestamp of the whiteouts + // + // See also https://reproducible-builds.org/docs/source-date-epoch/ . + SourceDateEpoch *time.Time } // WriteDiffOpt allows setting mutable archive write properties on creation type WriteDiffOpt func(options *WriteDiffOptions) error + +// WithSourceDateEpoch specifies the SOURCE_DATE_EPOCH without touching the env vars. +func WithSourceDateEpoch(tm *time.Time) WriteDiffOpt { + return func(options *WriteDiffOptions) error { + options.SourceDateEpoch = tm + return nil + } +} diff --git a/tools/vendor/github.com/containerd/containerd/archive/tar_unix.go b/tools/vendor/github.com/containerd/containerd/archive/tar_unix.go index 2f3a3a392..8e883eee6 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/tar_unix.go +++ b/tools/vendor/github.com/containerd/containerd/archive/tar_unix.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows /* Copyright The containerd Authors. @@ -34,10 +33,6 @@ import ( "golang.org/x/sys/unix" ) -func tarName(p string) (string, error) { - return p, nil -} - func chmodTarEntry(perm os.FileMode) os.FileMode { return perm } @@ -62,8 +57,7 @@ func setHeaderForSpecialDevice(hdr *tar.Header, name string, fi os.FileInfo) err return errors.New("unsupported stat type") } - // Rdev is int32 on darwin/bsd, int64 on linux/solaris - rdev := uint64(s.Rdev) // nolint: unconvert + rdev := uint64(s.Rdev) //nolint:nolintlint,unconvert // rdev is int32 on darwin/bsd, int64 on linux/solaris // Currently go does not fill in the major/minors if s.Mode&syscall.S_IFBLK != 0 || diff --git a/tools/vendor/github.com/containerd/containerd/archive/tar_windows.go b/tools/vendor/github.com/containerd/containerd/archive/tar_windows.go index 4b71c1e30..dc8f64ee4 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/tar_windows.go +++ b/tools/vendor/github.com/containerd/containerd/archive/tar_windows.go @@ -23,24 +23,9 @@ import ( "os" "strings" - "github.com/containerd/containerd/sys" + "github.com/moby/sys/sequential" ) -// tarName returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func tarName(p string) (string, error) { - // windows: convert windows style relative path with backslashes - // into forward slashes. Since windows does not allow '/' or '\' - // in file names, it is mostly safe to replace however we must - // check just in case - if strings.Contains(p, "/") { - return "", fmt.Errorf("windows path contains forward slash: %s", p) - } - - return strings.Replace(p, string(os.PathSeparator), "/", -1), nil -} - // 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 { @@ -57,15 +42,15 @@ func setHeaderForSpecialDevice(*tar.Header, string, os.FileInfo) error { } func open(p string) (*os.File, error) { - // We use sys.OpenSequential to ensure we use sequential file - // access on Windows to avoid depleting the standby list. - return sys.OpenSequential(p) + // We use sequential file access to avoid depleting the standby list on + // Windows. + return sequential.Open(p) } func openFile(name string, flag int, perm os.FileMode) (*os.File, error) { - // Source is regular file. We use sys.OpenFileSequential to use sequential - // file access to avoid depleting the standby list on Windows. - return sys.OpenFileSequential(name, flag, perm) + // Source is regular file. We use sequential file access to avoid depleting + // the standby list on Windows. + return sequential.OpenFile(name, flag, perm) } func mkdir(path string, perm os.FileMode) error { diff --git a/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader.go b/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader.go new file mode 100644 index 000000000..2f93842c1 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader.go @@ -0,0 +1,82 @@ +/* + 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. +*/ + +/* + Portions from https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive.go#L419-L464 + Copyright (C) Docker/Moby authors. + Licensed under the Apache License, Version 2.0 + NOTICE: https://github.com/moby/moby/blob/v23.0.1/NOTICE +*/ + +package tarheader + +import ( + "archive/tar" + "os" +) + +// nosysFileInfo hides the system-dependent info of the wrapped FileInfo to +// prevent tar.FileInfoHeader from introspecting it and potentially calling into +// glibc. +// +// From https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive.go#L419-L434 . +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. +// +// From https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive.go#L436-L437 . +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. +// +// From https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive.go#L439-L464 . +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 +} diff --git a/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader_unix.go b/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader_unix.go new file mode 100644 index 000000000..98ad8f945 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/archive/tarheader/tarheader_unix.go @@ -0,0 +1,59 @@ +//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. +*/ + +/* + Portions from https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive_unix.go#L52-L70 + Copyright (C) Docker/Moby authors. + Licensed under the Apache License, Version 2.0 + NOTICE: https://github.com/moby/moby/blob/v23.0.1/NOTICE +*/ + +package tarheader + +import ( + "archive/tar" + "os" + "syscall" + + "golang.org/x/sys/unix" +) + +func init() { + sysStat = statUnix +} + +// statUnix populates hdr from system-dependent fields of fi without performing +// any OS lookups. +// From https://github.com/moby/moby/blob/v23.0.1/pkg/archive/archive_unix.go#L52-L70 +func statUnix(fi os.FileInfo, hdr *tar.Header) error { + s, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return nil + } + + 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))) + hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) + } + + return nil +} diff --git a/tools/vendor/github.com/containerd/containerd/archive/time_unix.go b/tools/vendor/github.com/containerd/containerd/archive/time_unix.go index 043e37453..b5a10d528 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/time_unix.go +++ b/tools/vendor/github.com/containerd/containerd/archive/time_unix.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/archive/time_windows.go b/tools/vendor/github.com/containerd/containerd/archive/time_windows.go index 71f397821..d906a3e5e 100644 --- a/tools/vendor/github.com/containerd/containerd/archive/time_windows.go +++ b/tools/vendor/github.com/containerd/containerd/archive/time_windows.go @@ -25,18 +25,17 @@ import ( // chtimes will set the create time on a file using the given modtime. // This requires calling SetFileTime and explicitly including the create time. func chtimes(path string, atime, mtime time.Time) error { - ctimespec := windows.NsecToTimespec(mtime.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(mtime.UnixNano()) return windows.SetFileTime(h, &c, nil, nil) } diff --git a/tools/vendor/github.com/containerd/containerd/containers/containers.go b/tools/vendor/github.com/containerd/containerd/containers/containers.go index 7174bbd6a..49f389133 100644 --- a/tools/vendor/github.com/containerd/containerd/containers/containers.go +++ b/tools/vendor/github.com/containerd/containerd/containers/containers.go @@ -20,7 +20,7 @@ import ( "context" "time" - "github.com/gogo/protobuf/types" + "github.com/containerd/typeurl/v2" ) // Container represents the set of data pinned by a container. Unless otherwise @@ -53,7 +53,7 @@ type Container struct { // container. // // This field is required but mutable. - Spec *types.Any + Spec typeurl.Any // SnapshotKey specifies the snapshot key to use for the container's root // filesystem. When starting a task from this container, a caller should @@ -75,13 +75,18 @@ type Container struct { UpdatedAt time.Time // Extensions stores client-specified metadata - Extensions map[string]types.Any + Extensions map[string]typeurl.Any + + // SandboxID is an identifier of sandbox this container belongs to. + // + // This property is optional, but can't be changed after creation. + SandboxID string } // RuntimeInfo holds runtime specific information type RuntimeInfo struct { Name string - Options *types.Any + Options typeurl.Any } // Store interacts with the underlying container storage diff --git a/tools/vendor/github.com/containerd/containerd/content/content.go b/tools/vendor/github.com/containerd/containerd/content/content.go index ff17a8417..b7230d88b 100644 --- a/tools/vendor/github.com/containerd/containerd/content/content.go +++ b/tools/vendor/github.com/containerd/containerd/content/content.go @@ -25,6 +25,26 @@ import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) +// Store combines the methods of content-oriented interfaces into a set that +// are commonly provided by complete implementations. +// +// Overall content lifecycle: +// - Ingester is used to initiate a write operation (aka ingestion) +// - IngestManager is used to manage (e.g. list, abort) active ingestions +// - Once an ingestion is complete (see Writer.Commit), Provider is used to +// query a single piece of content by its digest +// - Manager is used to manage (e.g. list, delete) previously committed content +// +// Note that until ingestion is complete, its content is not visible through +// Provider or Manager. Once ingestion is complete, it is no longer exposed +// through IngestManager. +type Store interface { + Manager + Provider + IngestManager + Ingester +} + // ReaderAt extends the standard io.ReaderAt interface with reporting of Size and io.Closer type ReaderAt interface { io.ReaderAt @@ -42,10 +62,30 @@ type Provider interface { // Ingester writes content type Ingester interface { - // Some implementations require WithRef to be included in opts. + // Writer initiates a writing operation (aka ingestion). A single ingestion + // is uniquely identified by its ref, provided using a WithRef option. + // Writer can be called multiple times with the same ref to access the same + // ingestion. + // Once all the data is written, use Writer.Commit to complete the ingestion. Writer(ctx context.Context, opts ...WriterOpt) (Writer, error) } +// IngestManager provides methods for managing ingestions. An ingestion is a +// not-yet-complete writing operation initiated using Ingester and identified +// by a ref string. +type IngestManager interface { + // Status returns the status of the provided ref. + Status(ctx context.Context, ref string) (Status, error) + + // ListStatuses returns the status of any active ingestions whose ref match + // the provided regular expression. If empty, all active ingestions will be + // returned. + ListStatuses(ctx context.Context, filters ...string) ([]Status, error) + + // Abort completely cancels the ingest operation targeted by ref. + Abort(ctx context.Context, ref string) error +} + // Info holds content specific information // // TODO(stevvooe): Consider a very different name for this struct. Info is way @@ -58,7 +98,7 @@ type Info struct { Labels map[string]string } -// Status of a content operation +// Status of a content operation (i.e. an ingestion) type Status struct { Ref string Offset int64 @@ -94,21 +134,7 @@ type Manager interface { Delete(ctx context.Context, dgst digest.Digest) error } -// IngestManager provides methods for managing ingests. -type IngestManager interface { - // Status returns the status of the provided ref. - Status(ctx context.Context, ref string) (Status, error) - - // ListStatuses returns the status of any active ingestions whose ref match the - // provided regular expression. If empty, all active ingestions will be - // returned. - ListStatuses(ctx context.Context, filters ...string) ([]Status, error) - - // Abort completely cancels the ingest operation targeted by ref. - Abort(ctx context.Context, ref string) error -} - -// Writer handles the write of content into a content store +// Writer handles writing of content into a content store type Writer interface { // Close closes the writer, if the writer has not been // committed this allows resuming or aborting. @@ -131,15 +157,6 @@ type Writer interface { Truncate(size int64) error } -// Store combines the methods of content-oriented interfaces into a set that -// are commonly provided by complete implementations. -type Store interface { - Manager - Provider - IngestManager - Ingester -} - // Opt is used to alter the mutable properties of content type Opt func(*Info) error diff --git a/tools/vendor/github.com/containerd/containerd/content/helpers.go b/tools/vendor/github.com/containerd/containerd/content/helpers.go index 3ec1ffce0..5404109a6 100644 --- a/tools/vendor/github.com/containerd/containerd/content/helpers.go +++ b/tools/vendor/github.com/containerd/containerd/content/helpers.go @@ -21,15 +21,21 @@ import ( "errors" "fmt" "io" - "math/rand" "sync" "time" "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/log" + "github.com/containerd/containerd/pkg/randutil" "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) +// maxResets is the no.of times the Copy() method can tolerate a reset of the body +const maxResets = 5 + +var ErrReset = errors.New("writer has been reset") + var bufPool = sync.Pool{ New: func() interface{} { buffer := make([]byte, 1<<20) @@ -37,16 +43,26 @@ var bufPool = sync.Pool{ }, } +type reader interface { + Reader() io.Reader +} + // NewReader returns a io.Reader from a ReaderAt func NewReader(ra ReaderAt) io.Reader { - rd := io.NewSectionReader(ra, 0, ra.Size()) - return rd + if rd, ok := ra.(reader); ok { + return rd.Reader() + } + return io.NewSectionReader(ra, 0, ra.Size()) } // ReadBlob retrieves the entire contents of the blob from the provider. // // Avoid using this for large blobs, such as layers. func ReadBlob(ctx context.Context, provider Provider, desc ocispec.Descriptor) ([]byte, error) { + if int64(len(desc.Data)) == desc.Size && digest.FromBytes(desc.Data) == desc.Digest { + return desc.Data, nil + } + ra, err := provider.ReaderAt(ctx, desc) if err != nil { return nil, err @@ -80,7 +96,7 @@ func WriteBlob(ctx context.Context, cs Ingester, ref string, r io.Reader, desc o return fmt.Errorf("failed to open writer: %w", err) } - return nil // all ready present + return nil // already present } defer cw.Close() @@ -107,7 +123,7 @@ func OpenWriter(ctx context.Context, cs Ingester, opts ...WriterOpt) (Writer, er // error or abort. Requires asserting for an ingest manager select { - case <-time.After(time.Millisecond * time.Duration(rand.Intn(retry))): + case <-time.After(time.Millisecond * time.Duration(randutil.Intn(retry))): if retry < 2048 { retry = retry << 1 } @@ -131,35 +147,63 @@ func OpenWriter(ctx context.Context, cs Ingester, opts ...WriterOpt) (Writer, er // the size or digest is unknown, these values may be empty. // // Copy is buffered, so no need to wrap reader in buffered io. -func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected digest.Digest, opts ...Opt) error { +func Copy(ctx context.Context, cw Writer, or io.Reader, size int64, expected digest.Digest, opts ...Opt) error { ws, err := cw.Status() if err != nil { return fmt.Errorf("failed to get status: %w", err) } - + r := or if ws.Offset > 0 { - r, err = seekReader(r, ws.Offset, size) + r, err = seekReader(or, ws.Offset, size) if err != nil { return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err) } } - copied, err := copyWithBuffer(cw, r) - if err != nil { - return fmt.Errorf("failed to copy: %w", err) - } - if size != 0 && copied < size-ws.Offset { - // Short writes would return its own error, this indicates a read failure - return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF) - } - - if err := cw.Commit(ctx, size, expected, opts...); err != nil { - if !errdefs.IsAlreadyExists(err) { - return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err) + for i := 0; i < maxResets; i++ { + if i >= 1 { + log.G(ctx).WithField("digest", expected).Debugf("retrying copy due to reset") + } + copied, err := copyWithBuffer(cw, r) + if errors.Is(err, ErrReset) { + ws, err := cw.Status() + if err != nil { + return fmt.Errorf("failed to get status: %w", err) + } + r, err = seekReader(or, ws.Offset, size) + if err != nil { + return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err) + } + continue + } + if err != nil { + return fmt.Errorf("failed to copy: %w", err) + } + if size != 0 && copied < size-ws.Offset { + // Short writes would return its own error, this indicates a read failure + return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF) } + if err := cw.Commit(ctx, size, expected, opts...); err != nil { + if errors.Is(err, ErrReset) { + ws, err := cw.Status() + if err != nil { + return fmt.Errorf("failed to get status: %w", err) + } + r, err = seekReader(or, ws.Offset, size) + if err != nil { + return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err) + } + continue + } + if !errdefs.IsAlreadyExists(err) { + return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err) + } + } + return nil } - return nil + log.G(ctx).WithField("digest", expected).Errorf("failed to copy after %d retries", maxResets) + return fmt.Errorf("failed to copy after %d retries", maxResets) } // CopyReaderAt copies to a writer from a given reader at for the given diff --git a/tools/vendor/github.com/containerd/containerd/content/local/content_local_fuzzer.go b/tools/vendor/github.com/containerd/containerd/content/local/content_local_fuzzer.go new file mode 100644 index 000000000..a523f28d9 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/content/local/content_local_fuzzer.go @@ -0,0 +1,76 @@ +//go:build gofuzz + +/* + 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 local + +import ( + "bufio" + "bytes" + "context" + _ "crypto/sha256" + "io" + "testing" + + "github.com/opencontainers/go-digest" + + "github.com/containerd/containerd/content" +) + +func FuzzContentStoreWriter(data []byte) int { + t := &testing.T{} + ctx := context.Background() + ctx, _, cs, cleanup := contentStoreEnv(t) + defer cleanup() + + cw, err := cs.Writer(ctx, content.WithRef("myref")) + if err != nil { + return 0 + } + if err := cw.Close(); err != nil { + return 0 + } + + // reopen, so we can test things + cw, err = cs.Writer(ctx, content.WithRef("myref")) + if err != nil { + return 0 + } + + err = checkCopyFuzz(int64(len(data)), cw, bufio.NewReader(io.NopCloser(bytes.NewReader(data)))) + if err != nil { + return 0 + } + expected := digest.FromBytes(data) + + if err = cw.Commit(ctx, int64(len(data)), expected); err != nil { + return 0 + } + return 1 +} + +func checkCopyFuzz(size int64, dst io.Writer, src io.Reader) error { + nn, err := io.Copy(dst, src) + if err != nil { + return err + } + + if nn != size { + return err + } + return nil +} diff --git a/tools/vendor/github.com/containerd/containerd/content/local/readerat.go b/tools/vendor/github.com/containerd/containerd/content/local/readerat.go index a83c171bb..899e85c0b 100644 --- a/tools/vendor/github.com/containerd/containerd/content/local/readerat.go +++ b/tools/vendor/github.com/containerd/containerd/content/local/readerat.go @@ -18,6 +18,7 @@ package local import ( "fmt" + "io" "os" "github.com/containerd/containerd/content" @@ -65,3 +66,7 @@ func (ra sizeReaderAt) Size() int64 { func (ra sizeReaderAt) Close() error { return ra.fp.Close() } + +func (ra sizeReaderAt) Reader() io.Reader { + return io.LimitReader(ra.fp, ra.size) +} diff --git a/tools/vendor/github.com/containerd/containerd/content/local/store.go b/tools/vendor/github.com/containerd/containerd/content/local/store.go index 457bbcd0e..baae3565b 100644 --- a/tools/vendor/github.com/containerd/containerd/content/local/store.go +++ b/tools/vendor/github.com/containerd/containerd/content/local/store.go @@ -20,7 +20,6 @@ import ( "context" "fmt" "io" - "math/rand" "os" "path/filepath" "strconv" @@ -32,9 +31,10 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/filters" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/pkg/randutil" "github.com/sirupsen/logrus" - digest "github.com/opencontainers/go-digest" + "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -262,7 +262,7 @@ func (s *store) Walk(ctx context.Context, fn content.WalkFunc, fs ...string) err return nil } - dgst := digest.NewDigestFromHex(alg.String(), filepath.Base(path)) + dgst := digest.NewDigestFromEncoded(alg, filepath.Base(path)) if err := dgst.Validate(); err != nil { // log error but don't report log.L.WithError(err).WithField("path", path).Error("invalid digest for blob path") @@ -473,7 +473,7 @@ func (s *store) Writer(ctx context.Context, opts ...content.WriterOpt) (content. lockErr = nil break } - time.Sleep(time.Millisecond * time.Duration(rand.Intn(1< 0 + case "topic": + return e.Topic, len(e.Topic) > 0 + case "event": + decoded, err := typeurl.UnmarshalAny(e.Event) + if err != nil { + return "", false + } + + adaptor, ok := decoded.(interface { + Field([]string) (string, bool) + }) + if !ok { + return "", false + } + return adaptor.Field(fieldpath[1:]) + } + return "", false +} + +// Event is a generic interface for any type of event +type Event interface{} + +// Publisher posts the event. +type Publisher interface { + Publish(ctx context.Context, topic string, event Event) error +} + +// Forwarder forwards an event to the underlying event bus +type Forwarder interface { + Forward(ctx context.Context, envelope *Envelope) error +} + +// Subscriber allows callers to subscribe to events +type Subscriber interface { + Subscribe(ctx context.Context, filters ...string) (ch <-chan *Envelope, errs <-chan error) +} diff --git a/tools/vendor/github.com/containerd/containerd/filters/filter.go b/tools/vendor/github.com/containerd/containerd/filters/filter.go index cf09d8d9e..e13f2625c 100644 --- a/tools/vendor/github.com/containerd/containerd/filters/filter.go +++ b/tools/vendor/github.com/containerd/containerd/filters/filter.go @@ -65,7 +65,6 @@ // ``` // name==foo,labels.bar // ``` -// package filters import ( diff --git a/tools/vendor/github.com/containerd/containerd/filters/parser.go b/tools/vendor/github.com/containerd/containerd/filters/parser.go index 49182d7b7..32767909b 100644 --- a/tools/vendor/github.com/containerd/containerd/filters/parser.go +++ b/tools/vendor/github.com/containerd/containerd/filters/parser.go @@ -45,7 +45,6 @@ field := quoted | [A-Za-z] [A-Za-z0-9_]+ operator := "==" | "!=" | "~=" value := quoted | [^\s,]+ quoted := - */ func Parse(s string) (Filter, error) { // special case empty to match all diff --git a/tools/vendor/github.com/containerd/containerd/filters/quote.go b/tools/vendor/github.com/containerd/containerd/filters/quote.go index b76aab9b4..5c800ef84 100644 --- a/tools/vendor/github.com/containerd/containerd/filters/quote.go +++ b/tools/vendor/github.com/containerd/containerd/filters/quote.go @@ -31,10 +31,10 @@ var errQuoteSyntax = errors.New("quote syntax error") // or character literal represented by the string s. // It returns four values: // -// 1) value, the decoded Unicode code point or byte value; -// 2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; -// 3) tail, the remainder of the string after the character; and -// 4) an error that will be nil if the character is syntactically valid. +// 1. value, the decoded Unicode code point or byte value; +// 2. multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; +// 3. tail, the remainder of the string after the character; and +// 4. an error that will be nil if the character is syntactically valid. // // The second argument, quote, specifies the type of literal being parsed // and therefore which escaped quote character is permitted. diff --git a/tools/vendor/github.com/containerd/containerd/images/image.go b/tools/vendor/github.com/containerd/containerd/images/image.go index d45afe482..2d2e36a9a 100644 --- a/tools/vendor/github.com/containerd/containerd/images/image.go +++ b/tools/vendor/github.com/containerd/containerd/images/image.go @@ -138,7 +138,7 @@ type platformManifest struct { // TODO(stevvooe): This violates the current platform agnostic approach to this // package by returning a specific manifest type. We'll need to refactor this // to return a manifest descriptor or decide that we want to bring the API in -// this direction because this abstraction is not needed.` +// this direction because this abstraction is not needed. func Manifest(ctx context.Context, provider content.Provider, image ocispec.Descriptor, platform platforms.MatchComparer) (ocispec.Manifest, error) { var ( limit = 1 @@ -311,7 +311,7 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip return false, nil, nil, nil, fmt.Errorf("failed to check image %v: %w", image.Digest, err) } - // TODO(stevvooe): It is possible that referenced conponents could have + // TODO(stevvooe): It is possible that referenced components could have // children, but this is rare. For now, we ignore this and only verify // that manifest components are present. required = append([]ocispec.Descriptor{mfst.Config}, mfst.Layers...) diff --git a/tools/vendor/github.com/containerd/containerd/images/mediatypes.go b/tools/vendor/github.com/containerd/containerd/images/mediatypes.go index 671e160e1..067963bab 100644 --- a/tools/vendor/github.com/containerd/containerd/images/mediatypes.go +++ b/tools/vendor/github.com/containerd/containerd/images/mediatypes.go @@ -38,7 +38,9 @@ const ( MediaTypeDockerSchema2Config = "application/vnd.docker.container.image.v1+json" MediaTypeDockerSchema2Manifest = "application/vnd.docker.distribution.manifest.v2+json" MediaTypeDockerSchema2ManifestList = "application/vnd.docker.distribution.manifest.list.v2+json" + // Checkpoint/Restore Media Types + MediaTypeContainerd1Checkpoint = "application/vnd.containerd.container.criu.checkpoint.criu.tar" MediaTypeContainerd1CheckpointPreDump = "application/vnd.containerd.container.criu.checkpoint.predump.tar" MediaTypeContainerd1Resource = "application/vnd.containerd.container.resource.tar" @@ -47,9 +49,12 @@ const ( MediaTypeContainerd1CheckpointOptions = "application/vnd.containerd.container.checkpoint.options.v1+proto" MediaTypeContainerd1CheckpointRuntimeName = "application/vnd.containerd.container.checkpoint.runtime.name" MediaTypeContainerd1CheckpointRuntimeOptions = "application/vnd.containerd.container.checkpoint.runtime.options+proto" - // Legacy Docker schema1 manifest + + // MediaTypeDockerSchema1Manifest is the legacy Docker schema1 manifest MediaTypeDockerSchema1Manifest = "application/vnd.docker.distribution.manifest.v1+prettyjws" - // Encypted media types + + // Encrypted media types + MediaTypeImageLayerEncrypted = ocispec.MediaTypeImageLayer + "+encrypted" MediaTypeImageLayerGzipEncrypted = ocispec.MediaTypeImageLayerGzip + "+encrypted" ) @@ -93,16 +98,23 @@ func DiffCompression(ctx context.Context, mediaType string) (string, error) { // parseMediaTypes splits the media type into the base type and // an array of sorted extensions -func parseMediaTypes(mt string) (string, []string) { +func parseMediaTypes(mt string) (mediaType string, suffixes []string) { if mt == "" { return "", []string{} } + mediaType, ext, ok := strings.Cut(mt, "+") + if !ok { + return mediaType, []string{} + } - s := strings.Split(mt, "+") - ext := s[1:] - sort.Strings(ext) - - return s[0], ext + // Splitting the extensions following the mediatype "(+)gzip+encrypted". + // We expect this to be a limited list, so add an arbitrary limit (50). + // + // Note that DiffCompression is only using the last element, so perhaps we + // should split on the last "+" only. + suffixes = strings.SplitN(ext, "+", 50) + sort.Strings(suffixes) + return mediaType, suffixes } // IsNonDistributable returns true if the media type is non-distributable. @@ -118,8 +130,7 @@ func IsLayerType(mt string) bool { } // Parse Docker media types, strip off any + suffixes first - base, _ := parseMediaTypes(mt) - switch base { + switch base, _ := parseMediaTypes(mt); base { case MediaTypeDockerSchema2Layer, MediaTypeDockerSchema2LayerGzip, MediaTypeDockerSchema2LayerForeign, MediaTypeDockerSchema2LayerForeignGzip: return true diff --git a/tools/vendor/github.com/containerd/containerd/labels/labels.go b/tools/vendor/github.com/containerd/containerd/labels/labels.go index d76ff2cf9..0f9bab5c5 100644 --- a/tools/vendor/github.com/containerd/containerd/labels/labels.go +++ b/tools/vendor/github.com/containerd/containerd/labels/labels.go @@ -19,3 +19,11 @@ package labels // LabelUncompressed is added to compressed layer contents. // The value is digest of the uncompressed content. const LabelUncompressed = "containerd.io/uncompressed" + +// LabelSharedNamespace is added to a namespace to allow that namespaces +// contents to be shared. +const LabelSharedNamespace = "containerd.io/namespace.shareable" + +// LabelDistributionSource is added to content to indicate its origin. +// e.g., "containerd.io/distribution.source.docker.io=library/redis" +const LabelDistributionSource = "containerd.io/distribution.source" diff --git a/tools/vendor/github.com/containerd/containerd/labels/validate.go b/tools/vendor/github.com/containerd/containerd/labels/validate.go index 1fd527adb..f83b5dde2 100644 --- a/tools/vendor/github.com/containerd/containerd/labels/validate.go +++ b/tools/vendor/github.com/containerd/containerd/labels/validate.go @@ -24,15 +24,18 @@ import ( const ( maxSize = 4096 + // maximum length of key portion of error message if len of key + len of value > maxSize + keyMaxLen = 64 ) // Validate a label's key and value are under 4096 bytes func Validate(k, v string) error { - if (len(k) + len(v)) > maxSize { - if len(k) > 10 { - k = k[:10] + total := len(k) + len(v) + if total > maxSize { + if len(k) > keyMaxLen { + k = k[:keyMaxLen] } - return fmt.Errorf("label key and value greater than maximum size (%d bytes), key: %s: %w", maxSize, k, errdefs.ErrInvalidArgument) + return fmt.Errorf("label key and value length (%d bytes) greater than maximum size (%d bytes), key: %s: %w", total, maxSize, k, errdefs.ErrInvalidArgument) } return nil } diff --git a/tools/vendor/github.com/containerd/containerd/leases/id.go b/tools/vendor/github.com/containerd/containerd/leases/id.go index 8781a1d72..8f5dc93f3 100644 --- a/tools/vendor/github.com/containerd/containerd/leases/id.go +++ b/tools/vendor/github.com/containerd/containerd/leases/id.go @@ -17,9 +17,9 @@ package leases import ( + "crypto/rand" "encoding/base64" "fmt" - "math/rand" "time" ) diff --git a/tools/vendor/github.com/containerd/containerd/leases/lease.go b/tools/vendor/github.com/containerd/containerd/leases/lease.go index 058d06559..fc0ca3491 100644 --- a/tools/vendor/github.com/containerd/containerd/leases/lease.go +++ b/tools/vendor/github.com/containerd/containerd/leases/lease.go @@ -65,10 +65,15 @@ func SynchronousDelete(ctx context.Context, o *DeleteOptions) error { return nil } -// WithLabels sets labels on a lease +// WithLabels merges labels on a lease func WithLabels(labels map[string]string) Opt { return func(l *Lease) error { - l.Labels = labels + if l.Labels == nil { + l.Labels = map[string]string{} + } + for k, v := range labels { + l.Labels[k] = v + } return nil } } diff --git a/tools/vendor/github.com/containerd/containerd/log/context.go b/tools/vendor/github.com/containerd/containerd/log/context.go index 0db9562b8..92cfcd91a 100644 --- a/tools/vendor/github.com/containerd/containerd/log/context.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/metadata/adaptors.go b/tools/vendor/github.com/containerd/containerd/metadata/adaptors.go index c5d576f84..dbff7bacd 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/adaptors.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/adaptors.go @@ -24,6 +24,7 @@ import ( "github.com/containerd/containerd/filters" "github.com/containerd/containerd/images" "github.com/containerd/containerd/leases" + "github.com/containerd/containerd/sandbox" "github.com/containerd/containerd/snapshots" ) @@ -149,6 +150,23 @@ func adaptSnapshot(info snapshots.Info) filters.Adaptor { }) } +func adaptSandbox(instance *sandbox.Sandbox) filters.Adaptor { + return filters.AdapterFunc(func(fieldpath []string) (string, bool) { + if len(fieldpath) == 0 { + return "", false + } + + switch fieldpath[0] { + case "id": + return instance.ID, true + case "labels": + return checkMap(fieldpath[1:], instance.Labels) + default: + return "", false + } + }) +} + func checkMap(fieldpath []string, m map[string]string) (string, bool) { if len(m) == 0 { return "", false diff --git a/tools/vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go b/tools/vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go index 4722a5226..8f8df3361 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go @@ -20,8 +20,10 @@ import ( "fmt" "time" - "github.com/gogo/protobuf/proto" - "github.com/gogo/protobuf/types" + "github.com/containerd/containerd/protobuf" + "github.com/containerd/containerd/protobuf/proto" + "github.com/containerd/containerd/protobuf/types" + "github.com/containerd/typeurl/v2" bolt "go.etcd.io/bbolt" ) @@ -151,7 +153,7 @@ func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error { // WriteExtensions will write a KV map to the given bucket, // where `K` is a string key and `V` is a protobuf's Any type that represents a generic extension. -func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { +func WriteExtensions(bkt *bolt.Bucket, extensions map[string]typeurl.Any) error { if len(extensions) == 0 { return nil } @@ -162,7 +164,8 @@ func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { } for name, ext := range extensions { - p, err := proto.Marshal(&ext) + ext := protobuf.FromAny(ext) + p, err := proto.Marshal(ext) if err != nil { return err } @@ -176,9 +179,9 @@ func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { } // ReadExtensions will read back a map of extensions from the given bucket, previously written by WriteExtensions -func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { +func ReadExtensions(bkt *bolt.Bucket) (map[string]typeurl.Any, error) { var ( - extensions = make(map[string]types.Any) + extensions = make(map[string]typeurl.Any) ebkt = bkt.Bucket(bucketKeyExtensions) ) @@ -192,7 +195,7 @@ func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { return err } - extensions[string(k)] = t + extensions[string(k)] = &t return nil }); err != nil { return nil, err @@ -202,18 +205,19 @@ func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { } // WriteAny write a protobuf's Any type to the bucket -func WriteAny(bkt *bolt.Bucket, name []byte, any *types.Any) error { - if any == nil { +func WriteAny(bkt *bolt.Bucket, name []byte, any typeurl.Any) error { + pbany := protobuf.FromAny(any) + if pbany == nil { return nil } - data, err := proto.Marshal(any) + data, err := proto.Marshal(pbany) if err != nil { - return err + return fmt.Errorf("failed to marshal: %w", err) } if err := bkt.Put(name, data); err != nil { - return err + return fmt.Errorf("put failed: %w", err) } return nil diff --git a/tools/vendor/github.com/containerd/containerd/metadata/buckets.go b/tools/vendor/github.com/containerd/containerd/metadata/buckets.go index d23be84fe..8dcf10f47 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/buckets.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/buckets.go @@ -26,7 +26,7 @@ // // Generically, we try to do the following: // -// /// -> +// /// -> // // version: Currently, this is "v1". Additions can be made to v1 in a backwards // compatible way. If the layout changes, a new version must be made, along @@ -44,74 +44,82 @@ // // Below is the current database schema. This should be updated each time // the structure is changed in addition to adding a migration and incrementing -// the database version. Note that `╘â•â•*...*` refers to maps with arbitrary -// keys. -// ├──version : - Latest version, see migrations -// └──v1 - Schema version bucket +// the database version. +// Notes: +// +// - `╘â•â•*...*` refers to maps with arbitrary keys +// +// - `version` is a key to a numeric value identifying the minor revisions +// of schema version +// +// - a namespace in a schema bucket cannot be named "version" +// +// └──v1 - Schema version bucket +// ├──version : - Latest version, see migrations // ╘â•â•*namespace* -// ├──labels -// │  ╘â•â•*key* : - Label value -// ├──image -// │  ╘â•â•*image name* -// │   ├──createdat : - Created at -// │   ├──updatedat : - Updated at -// │   ├──target -// │   │  ├──digest : - Descriptor digest -// │   │  ├──mediatype : - Descriptor media type -// │   │  └──size : - Descriptor size -// │   └──labels -// │   ╘â•â•*key* : - Label value -// ├──containers -// │  ╘â•â•*container id* -// │   ├──createdat : - Created at -// │   ├──updatedat : - Updated at -// │   ├──spec : - Proto marshaled spec -// │   ├──image : - Image name -// │   ├──snapshotter : - Snapshotter name -// │   ├──snapshotKey : - Snapshot key -// │   ├──runtime -// │   │  ├──name : - Runtime name -// │   │  ├──extensions -// │   │  │  ╘â•â•*name* : - Proto marshaled extension -// │   │  └──options : - Proto marshaled options -// │   └──labels -// │   ╘â•â•*key* : - Label value -// ├──snapshots -// │  ╘â•â•*snapshotter* -// │   ╘â•â•*snapshot key* -// │    ├──name : - Snapshot name in backend -// │   ├──createdat : - Created at -// │   ├──updatedat : - Updated at -// │    ├──parent : - Parent snapshot name -// │   ├──children -// │   │  ╘â•â•*snapshot key* : - Child snapshot reference -// │   └──labels -// │   ╘â•â•*key* : - Label value -// ├──content -// │  ├──blob -// │  │ ╘â•â•*blob digest* -// │  │ ├──createdat : - Created at -// │  │ ├──updatedat : - Updated at -// │  │   ├──size : - Blob size -// │  │ └──labels -// │  │ ╘â•â•*key* : - Label value -// │  └──ingests -// │   ╘â•â•*ingest reference* -// │    ├──ref : - Ingest reference in backend -// │   ├──expireat : - Time to expire ingest -// │   └──expected : - Expected commit digest -// └──leases -// ╘â•â•*lease id* -//   ├──createdat : - Created at -// ├──labels -// │ ╘â•â•*key* : - Label value -//   ├──snapshots -// │  ╘â•â•*snapshotter* -// │   ╘â•â•*snapshot key* : - Snapshot reference -//   ├──content -// │  ╘â•â•*blob digest* : - Content blob reference -// └──ingests -//   ╘â•â•*ingest reference* : - Content ingest reference +// ├──labels +// │  ╘â•â•*key* : - Label value +// ├──image +// │  ╘â•â•*image name* +// │   ├──createdat : - Created at +// │   ├──updatedat : - Updated at +// │   ├──target +// │   │  ├──digest : - Descriptor digest +// │   │  ├──mediatype : - Descriptor media type +// │   │  └──size : - Descriptor size +// │   └──labels +// │   ╘â•â•*key* : - Label value +// ├──containers +// │  ╘â•â•*container id* +// │   ├──createdat : - Created at +// │   ├──updatedat : - Updated at +// │   ├──spec : - Proto marshaled spec +// │   ├──image : - Image name +// │   ├──snapshotter : - Snapshotter name +// │   ├──snapshotKey : - Snapshot key +// │   ├──runtime +// │   │  ├──name : - Runtime name +// │   │  ├──extensions +// │   │  │  ╘â•â•*name* : - Proto marshaled extension +// │   │  └──options : - Proto marshaled options +// │   └──labels +// │   ╘â•â•*key* : - Label value +// ├──snapshots +// │  ╘â•â•*snapshotter* +// │   ╘â•â•*snapshot key* +// │    ├──name : - Snapshot name in backend +// │   ├──createdat : - Created at +// │   ├──updatedat : - Updated at +// │    ├──parent : - Parent snapshot name +// │   ├──children +// │   │  ╘â•â•*snapshot key* : - Child snapshot reference +// │   └──labels +// │   ╘â•â•*key* : - Label value +// ├──content +// │  ├──blob +// │  │ ╘â•â•*blob digest* +// │  │ ├──createdat : - Created at +// │  │ ├──updatedat : - Updated at +// │  │   ├──size : - Blob size +// │  │ └──labels +// │  │ ╘â•â•*key* : - Label value +// │  └──ingests +// │   ╘â•â•*ingest reference* +// │    ├──ref : - Ingest reference in backend +// │   ├──expireat : - Time to expire ingest +// │   └──expected : - Expected commit digest +// └──leases +// ╘â•â•*lease id* +// ├──createdat : - Created at +// ├──labels +// │ ╘â•â•*key* : - Label value +// ├──snapshots +// │  ╘â•â•*snapshotter* +// │   ╘â•â•*snapshot key* : - Snapshot reference +// ├──content +// │  ╘â•â•*blob digest* : - Content blob reference +// └──ingests +// ╘â•â•*ingest reference* : - Content ingest reference package metadata import ( @@ -130,6 +138,7 @@ var ( bucketKeyObjectBlob = []byte("blob") // stores content links bucketKeyObjectIngests = []byte("ingests") // stores ingest objects bucketKeyObjectLeases = []byte("leases") // stores leases + bucketKeyObjectSandboxes = []byte("sandboxes") // stores sandboxes bucketKeyDigest = []byte("digest") bucketKeyMediaType = []byte("mediatype") @@ -149,6 +158,7 @@ var ( bucketKeyExpected = []byte("expected") bucketKeyRef = []byte("ref") bucketKeyExpireAt = []byte("expireat") + bucketKeySandboxID = []byte("sandboxid") deprecatedBucketKeyObjectIngest = []byte("ingest") // stores ingest links, deprecated in v1.2 ) @@ -270,3 +280,19 @@ func createIngestBucket(tx *bolt.Tx, namespace, ref string) (*bolt.Bucket, error func getIngestBucket(tx *bolt.Tx, namespace, ref string) *bolt.Bucket { return getBucket(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectIngests, []byte(ref)) } + +func createSandboxBucket(tx *bolt.Tx, namespace string) (*bolt.Bucket, error) { + return createBucketIfNotExists( + tx, + []byte(namespace), + bucketKeyObjectSandboxes, + ) +} + +func getSandboxBucket(tx *bolt.Tx, namespace string) *bolt.Bucket { + return getBucket( + tx, + []byte(namespace), + bucketKeyObjectSandboxes, + ) +} diff --git a/tools/vendor/github.com/containerd/containerd/metadata/containers.go b/tools/vendor/github.com/containerd/containerd/metadata/containers.go index 97002e588..d97d9c6cd 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/containers.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/containers.go @@ -30,8 +30,9 @@ import ( "github.com/containerd/containerd/labels" "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/namespaces" - "github.com/gogo/protobuf/proto" - "github.com/gogo/protobuf/types" + "github.com/containerd/containerd/protobuf/proto" + "github.com/containerd/containerd/protobuf/types" + "github.com/containerd/typeurl/v2" bolt "go.etcd.io/bbolt" ) @@ -211,7 +212,7 @@ func (s *containerStore) Update(ctx context.Context, container containers.Contai if strings.HasPrefix(path, "extensions.") { if updated.Extensions == nil { - updated.Extensions = map[string]types.Any{} + updated.Extensions = map[string]typeurl.Any{} } key := strings.TrimPrefix(path, "extensions.") updated.Extensions[key] = container.Extensions[key] @@ -358,6 +359,8 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error { } container.Extensions = extensions + case string(bucketKeySandboxID): + container.SandboxID = string(v) } return nil @@ -406,5 +409,9 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error { return err } + if err := bkt.Put(bucketKeySandboxID, []byte(container.SandboxID)); err != nil { + return err + } + return boltutil.WriteLabels(bkt, container.Labels) } diff --git a/tools/vendor/github.com/containerd/containerd/metadata/content.go b/tools/vendor/github.com/containerd/containerd/metadata/content.go index 66d0ee263..2df665fcf 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/content.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/content.go @@ -398,7 +398,7 @@ func (cs *contentStore) Writer(ctx context.Context, opts ...content.WriterOpt) ( return nil } - if cs.shared { + if cs.shared || isSharedContent(tx, wOpts.Desc.Digest) { if st, err := cs.Store.Info(ctx, wOpts.Desc.Digest); err == nil { // Ensure the expected size is the same, it is likely // an error if the size is mismatched but the caller @@ -706,6 +706,33 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err }) } +func isSharedContent(tx *bolt.Tx, dgst digest.Digest) bool { + v1bkt := tx.Bucket(bucketKeyVersion) + if v1bkt == nil { + return false + } + // iterate through each namespace + v1c := v1bkt.Cursor() + for nk, _ := v1c.First(); nk != nil; nk, _ = v1c.Next() { + ns := string(nk) + lbkt := getNamespaceLabelsBucket(tx, ns) + if lbkt == nil { + continue + } + // iterate through each label + lbc := lbkt.Cursor() + for k, v := lbc.First(); k != nil; k, v = lbc.Next() { + if string(k) == labels.LabelSharedNamespace { + if string(v) == "true" && getBlobBucket(tx, ns, dgst) != nil { + return true + } + break + } + } + } + return false +} + func validateInfo(info *content.Info) error { for k, v := range info.Labels { if err := labels.Validate(k, v); err != nil { diff --git a/tools/vendor/github.com/containerd/containerd/metadata/db.go b/tools/vendor/github.com/containerd/containerd/metadata/db.go index 2d9cbf31a..8241930a9 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/db.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/db.go @@ -26,9 +26,13 @@ import ( "sync/atomic" "time" + eventstypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/content" + "github.com/containerd/containerd/events" "github.com/containerd/containerd/gc" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/pkg/cleanup" "github.com/containerd/containerd/snapshots" bolt "go.etcd.io/bbolt" ) @@ -56,9 +60,18 @@ func WithPolicyIsolated(o *dbOptions) { o.shared = false } +// WithEventsPublisher adds an events publisher to the +// metadata db to directly publish events +func WithEventsPublisher(p events.Publisher) DBOpt { + return func(o *dbOptions) { + o.publisher = p + } +} + // dbOptions configure db options. type dbOptions struct { - shared bool + shared bool + publisher events.Publisher } // DB represents a metadata database backed by a bolt @@ -94,6 +107,9 @@ type DB struct { // set indicating whether any dirty flags are set mutationCallbacks []func(bool) + // collectible resources + collectors map[gc.ResourceType]Collector + dbopts dbOptions } @@ -215,8 +231,8 @@ func (m *DB) ContentStore() content.Store { return m.cs } -// Snapshotter returns a namespaced content store for -// the requested snapshotter name proxied to a snapshotter. +// Snapshotter returns a snapshotter for the requested snapshotter name +// proxied to a snapshotter. func (m *DB) Snapshotter(name string) snapshots.Snapshotter { sn, ok := m.ss[name] if !ok { @@ -265,6 +281,63 @@ func (m *DB) RegisterMutationCallback(fn func(bool)) { m.wlock.Unlock() } +// RegisterCollectibleResource registers a resource type which can be +// referenced by metadata resources and garbage collected. +// Collectible Resources are useful ephemeral resources which need to +// be tracked by go away after reboot or process restart. +// +// A few limitations to consider: +// - Collectible Resources cannot reference other resources. +// - A failure to complete collection will not fail the garbage collection, +// however, the resources can be collected in a later run. +// - Collectible Resources must track whether the resource is active and/or +// lease membership. +func (m *DB) RegisterCollectibleResource(t gc.ResourceType, c Collector) { + if t < resourceEnd { + panic("cannot re-register metadata resource") + } else if t >= gc.ResourceMax { + panic("resource type greater than max") + } + + m.wlock.Lock() + defer m.wlock.Unlock() + + if m.collectors == nil { + m.collectors = map[gc.ResourceType]Collector{} + } + + if _, ok := m.collectors[t]; ok { + panic("cannot register collectible type twice") + } + m.collectors[t] = c +} + +// namespacedEvent is used to handle any event for a namespace +type namespacedEvent struct { + namespace string + event interface{} +} + +func (m *DB) publishEvents(events []namespacedEvent) { + ctx := context.Background() + if publisher := m.dbopts.publisher; publisher != nil { + for _, ne := range events { + ctx := namespaces.WithNamespace(ctx, ne.namespace) + var topic string + switch ne.event.(type) { + case *eventstypes.SnapshotRemove: + topic = "/snapshot/remove" + default: + log.G(ctx).WithField("event", ne.event).Debug("unhandled event type from garbage collection removal") + continue + } + if err := publisher.Publish(ctx, topic, ne.event); err != nil { + log.G(ctx).WithError(err).WithField("topic", topic).Debug("publish event failed") + } + } + } +} + // GCStats holds the duration for the different phases of the garbage collector type GCStats struct { MetaD time.Duration @@ -281,13 +354,16 @@ func (s GCStats) Elapsed() time.Duration { func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) { m.wlock.Lock() t1 := time.Now() + c := startGCContext(ctx, m.collectors) - marked, err := m.getMarked(ctx) + marked, err := m.getMarked(ctx, c) // Pass in gc context if err != nil { m.wlock.Unlock() + c.cancel(ctx) return nil, err } + events := []namespacedEvent{} if err := m.db.Update(func(tx *bolt.Tx) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -301,25 +377,43 @@ func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) { if idx := strings.IndexRune(n.Key, '/'); idx > 0 { m.dirtySS[n.Key[:idx]] = struct{}{} } + // queue event to publish after successful commit } else if n.Type == ResourceContent || n.Type == ResourceIngest { m.dirtyCS = true } - return remove(ctx, tx, n) + + event, err := c.remove(ctx, tx, n) + if event != nil && err == nil { + events = append(events, + namespacedEvent{ + namespace: n.Namespace, + event: event, + }) + } + return err } - if err := scanAll(ctx, tx, rm); err != nil { + if err := c.scanAll(ctx, tx, rm); err != nil { // From gc context return fmt.Errorf("failed to scan and remove: %w", err) } return nil }); err != nil { m.wlock.Unlock() + c.cancel(ctx) return nil, err } var stats GCStats var wg sync.WaitGroup + // Flush events asynchronously after commit + wg.Add(1) + go func() { + m.publishEvents(events) + wg.Done() + }() + // reset dirty, no need for atomic inside of wlock.Lock m.dirty = 0 @@ -331,7 +425,7 @@ func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) { log.G(ctx).WithField("snapshotter", snapshotterName).Debug("schedule snapshotter cleanup") go func(snapshotterName string) { st1 := time.Now() - m.cleanupSnapshotter(snapshotterName) + m.cleanupSnapshotter(ctx, snapshotterName) sl.Lock() stats.SnapshotD[snapshotterName] = time.Since(st1) @@ -348,7 +442,7 @@ func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) { log.G(ctx).Debug("schedule content cleanup") go func() { ct1 := time.Now() - m.cleanupContent() + m.cleanupContent(ctx) stats.ContentD = time.Since(ct1) wg.Done() }() @@ -358,13 +452,15 @@ func (m *DB) GarbageCollect(ctx context.Context) (gc.Stats, error) { stats.MetaD = time.Since(t1) m.wlock.Unlock() + c.finish(ctx) + wg.Wait() return stats, err } // getMarked returns all resources that are used. -func (m *DB) getMarked(ctx context.Context) (map[gc.Node]struct{}, error) { +func (m *DB) getMarked(ctx context.Context, c *gcContext) (map[gc.Node]struct{}, error) { var marked map[gc.Node]struct{} if err := m.db.View(func(tx *bolt.Tx) error { ctx, cancel := context.WithCancel(ctx) @@ -383,7 +479,7 @@ func (m *DB) getMarked(ctx context.Context) (map[gc.Node]struct{}, error) { } }() // Call roots - if err := scanRoots(ctx, tx, roots); err != nil { + if err := c.scanRoots(ctx, tx, roots); err != nil { // From gc context cancel() return err } @@ -392,7 +488,7 @@ func (m *DB) getMarked(ctx context.Context) (map[gc.Node]struct{}, error) { refs := func(n gc.Node) ([]gc.Node, error) { var sn []gc.Node - if err := references(ctx, tx, n, func(nn gc.Node) { + if err := c.references(ctx, tx, n, func(nn gc.Node) { // From gc context sn = append(sn, nn) }); err != nil { return nil, err @@ -412,8 +508,8 @@ func (m *DB) getMarked(ctx context.Context) (map[gc.Node]struct{}, error) { return marked, nil } -func (m *DB) cleanupSnapshotter(name string) (time.Duration, error) { - ctx := context.Background() +func (m *DB) cleanupSnapshotter(ctx context.Context, name string) (time.Duration, error) { + ctx = cleanup.Background(ctx) sn, ok := m.ss[name] if !ok { return 0, nil @@ -429,8 +525,8 @@ func (m *DB) cleanupSnapshotter(name string) (time.Duration, error) { return d, err } -func (m *DB) cleanupContent() (time.Duration, error) { - ctx := context.Background() +func (m *DB) cleanupContent(ctx context.Context) (time.Duration, error) { + ctx = cleanup.Background(ctx) if m.cs == nil { return 0, nil } diff --git a/tools/vendor/github.com/containerd/containerd/metadata/gc.go b/tools/vendor/github.com/containerd/containerd/metadata/gc.go index 60bf410a6..5518a4487 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/gc.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/gc.go @@ -20,9 +20,11 @@ import ( "bytes" "context" "fmt" + "sort" "strings" "time" + eventstypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/gc" "github.com/containerd/containerd/log" bolt "go.etcd.io/bbolt" @@ -43,6 +45,10 @@ const ( ResourceLease // ResourceIngest specifies a content ingest ResourceIngest + // resourceEnd is the end of specified resource types + resourceEnd + // ResourceStream specifies a stream + ResourceStream ) const ( @@ -52,15 +58,162 @@ const ( var ( labelGCRoot = []byte("containerd.io/gc.root") + labelGCRef = []byte("containerd.io/gc.ref.") labelGCSnapRef = []byte("containerd.io/gc.ref.snapshot.") labelGCContentRef = []byte("containerd.io/gc.ref.content") labelGCExpire = []byte("containerd.io/gc.expire") labelGCFlat = []byte("containerd.io/gc.flat") ) +// CollectionContext manages a resource collection during a single run of +// the garbage collector. The context is responsible for managing access to +// resources as well as tracking removal. +// Implementations should defer any longer running operations to the Finish +// function and optimize other functions for running fast during garbage +// collection write locks. +type CollectionContext interface { + // Sends all known resources + All(func(gc.Node)) + + // Active sends all active resources + // Leased resources may be excluded since lease ownership should take + // precedence over active status. + Active(namespace string, fn func(gc.Node)) + + // Leased sends all resources associated with the given lease + Leased(namespace, lease string, fn func(gc.Node)) + + // Remove marks the given resource as removed + Remove(gc.Node) + + // Cancel is called to cleanup a context after a failed collection + Cancel() error + + // Finish is called to cleanup a context after a successful collection + Finish() error +} + +// Collector is an interface to manage resource collection for any collectible +// resource registered for garbage collection. +type Collector interface { + StartCollection(context.Context) (CollectionContext, error) + + ReferenceLabel() string +} + +type gcContext struct { + labelHandlers []referenceLabelHandler + contexts map[gc.ResourceType]CollectionContext +} + +type referenceLabelHandler struct { + key []byte + fn func(string, []byte, []byte, func(gc.Node)) +} + +func startGCContext(ctx context.Context, collectors map[gc.ResourceType]Collector) *gcContext { + var contexts map[gc.ResourceType]CollectionContext + labelHandlers := []referenceLabelHandler{ + { + key: labelGCContentRef, + fn: func(ns string, k, v []byte, fn func(gc.Node)) { + if ks := string(k); ks != string(labelGCContentRef) { + // Allow reference naming separated by . or /, ignore names + if ks[len(labelGCContentRef)] != '.' && ks[len(labelGCContentRef)] != '/' { + return + } + } + + fn(gcnode(ResourceContent, ns, string(v))) + }, + }, + { + key: labelGCSnapRef, + fn: func(ns string, k, v []byte, fn func(gc.Node)) { + snapshotter := k[len(labelGCSnapRef):] + if i := bytes.IndexByte(snapshotter, '/'); i >= 0 { + snapshotter = snapshotter[:i] + } + fn(gcnode(ResourceSnapshot, ns, fmt.Sprintf("%s/%s", snapshotter, v))) + }, + }, + } + if len(collectors) > 0 { + contexts = map[gc.ResourceType]CollectionContext{} + for rt, collector := range collectors { + rt := rt + c, err := collector.StartCollection(ctx) + if err != nil { + // Only skipping this resource this round + continue + } + + if reflabel := collector.ReferenceLabel(); reflabel != "" { + key := append(labelGCRef, reflabel...) + labelHandlers = append(labelHandlers, referenceLabelHandler{ + key: key, + fn: func(ns string, k, v []byte, fn func(gc.Node)) { + if ks := string(k); ks != string(key) { + // Allow reference naming separated by . or /, ignore names + if ks[len(key)] != '.' && ks[len(key)] != '/' { + return + } + } + + fn(gcnode(rt, ns, string(v))) + }, + }) + } + contexts[rt] = c + } + // Sort labelHandlers to ensure key seeking is always forwardS + sort.Slice(labelHandlers, func(i, j int) bool { + return bytes.Compare(labelHandlers[i].key, labelHandlers[j].key) < 0 + }) + } + return &gcContext{ + labelHandlers: labelHandlers, + contexts: contexts, + } +} + +func (c *gcContext) all(fn func(gc.Node)) { + for _, gctx := range c.contexts { + gctx.All(fn) + } +} + +func (c *gcContext) active(namespace string, fn func(gc.Node)) { + for _, gctx := range c.contexts { + gctx.Active(namespace, fn) + } +} + +func (c *gcContext) leased(namespace, lease string, fn func(gc.Node)) { + for _, gctx := range c.contexts { + gctx.Leased(namespace, lease, fn) + } +} + +func (c *gcContext) cancel(ctx context.Context) { + for _, gctx := range c.contexts { + if err := gctx.Cancel(); err != nil { + log.G(ctx).WithError(err).Error("failed to cancel collection context") + } + } +} + +func (c *gcContext) finish(ctx context.Context) { + for _, gctx := range c.contexts { + if err := gctx.Finish(); err != nil { + log.G(ctx).WithError(err).Error("failed to finish collection context") + } + } +} + // scanRoots sends the given channel "root" resources that are certainly used. // The caller could look the references of the resources to find all resources that are used. -func scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { +func (c *gcContext) scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { v1bkt := tx.Bucket(bucketKeyVersion) if v1bkt == nil { return nil @@ -170,6 +323,8 @@ func scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { } } + c.leased(ns, string(k), fn) + return nil }); err != nil { return err @@ -188,7 +343,7 @@ func scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { contentKey := string(target.Get(bucketKeyDigest)) fn(gcnode(ResourceContent, ns, contentKey)) } - return sendLabelRefs(ns, ibkt.Bucket(k), fn) + return c.sendLabelRefs(ns, ibkt.Bucket(k), fn) }); err != nil { return err } @@ -247,7 +402,7 @@ func scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { fn(gcnode(ResourceSnapshot, ns, fmt.Sprintf("%s/%s", snapshotter, ss))) } - return sendLabelRefs(ns, cibkt, fn) + return c.sendLabelRefs(ns, cibkt, fn) }); err != nil { return err } @@ -274,12 +429,28 @@ func scanRoots(ctx context.Context, tx *bolt.Tx, nc chan<- gc.Node) error { return err } } + + bbkt := nbkt.Bucket(bucketKeyObjectSandboxes) + if bbkt != nil { + if err := bbkt.ForEach(func(k, v []byte) error { + if v != nil { + return nil + } + + sbbkt := bbkt.Bucket(k) + return c.sendLabelRefs(ns, sbbkt, fn) + }); err != nil { + return err + } + } + + c.active(ns, fn) } return cerr } // references finds the resources that are reachable from the given node. -func references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node)) error { +func (c *gcContext) references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node)) error { switch node.Type { case ResourceContent: bkt := getBucket(tx, bucketKeyVersion, []byte(node.Namespace), bucketKeyObjectContent, bucketKeyObjectBlob, []byte(node.Key)) @@ -288,15 +459,12 @@ func references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node) return nil } - return sendLabelRefs(node.Namespace, bkt, fn) + return c.sendLabelRefs(node.Namespace, bkt, fn) case ResourceSnapshot, resourceSnapshotFlat: - parts := strings.SplitN(node.Key, "/", 2) - if len(parts) != 2 { + ss, name, ok := strings.Cut(node.Key, "/") + if !ok { return fmt.Errorf("invalid snapshot gc key %s", node.Key) } - ss := parts[0] - name := parts[1] - bkt := getBucket(tx, bucketKeyVersion, []byte(node.Namespace), bucketKeyObjectSnapshots, []byte(ss), []byte(name)) if bkt == nil { // Node may be created from dead edge @@ -312,7 +480,7 @@ func references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node) return nil } - return sendLabelRefs(node.Namespace, bkt, fn) + return c.sendLabelRefs(node.Namespace, bkt, fn) case ResourceIngest: // Send expected value bkt := getBucket(tx, bucketKeyVersion, []byte(node.Namespace), bucketKeyObjectContent, bucketKeyObjectIngests, []byte(node.Key)) @@ -332,7 +500,7 @@ func references(ctx context.Context, tx *bolt.Tx, node gc.Node, fn func(gc.Node) } // scanAll finds all resources regardless whether the resources are used or not. -func scanAll(ctx context.Context, tx *bolt.Tx, fn func(ctx context.Context, n gc.Node) error) error { +func (c *gcContext) scanAll(ctx context.Context, tx *bolt.Tx, fn func(ctx context.Context, n gc.Node) error) error { v1bkt := tx.Bucket(bucketKeyVersion) if v1bkt == nil { return nil @@ -409,19 +577,27 @@ func scanAll(ctx context.Context, tx *bolt.Tx, fn func(ctx context.Context, n gc } } + c.all(func(n gc.Node) { + _ = fn(ctx, n) + }) + return nil } // remove all buckets for the given node. -func remove(ctx context.Context, tx *bolt.Tx, node gc.Node) error { +func (c *gcContext) remove(ctx context.Context, tx *bolt.Tx, node gc.Node) (interface{}, error) { v1bkt := tx.Bucket(bucketKeyVersion) if v1bkt == nil { - return nil + return nil, nil } nsbkt := v1bkt.Bucket([]byte(node.Namespace)) if nsbkt == nil { - return nil + // Still remove object if refenced outside the db + if cc, ok := c.contexts[node.Type]; ok { + cc.Remove(node) + } + return nil, nil } switch node.Type { @@ -432,25 +608,28 @@ func remove(ctx context.Context, tx *bolt.Tx, node gc.Node) error { } if cbkt != nil { log.G(ctx).WithField("key", node.Key).Debug("remove content") - return cbkt.DeleteBucket([]byte(node.Key)) + return nil, cbkt.DeleteBucket([]byte(node.Key)) } case ResourceSnapshot: sbkt := nsbkt.Bucket(bucketKeyObjectSnapshots) if sbkt != nil { - parts := strings.SplitN(node.Key, "/", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid snapshot gc key %s", node.Key) + ss, key, ok := strings.Cut(node.Key, "/") + if !ok { + return nil, fmt.Errorf("invalid snapshot gc key %s", node.Key) } - ssbkt := sbkt.Bucket([]byte(parts[0])) + ssbkt := sbkt.Bucket([]byte(ss)) if ssbkt != nil { - log.G(ctx).WithField("key", parts[1]).WithField("snapshotter", parts[0]).Debug("remove snapshot") - return ssbkt.DeleteBucket([]byte(parts[1])) + log.G(ctx).WithField("key", key).WithField("snapshotter", ss).Debug("remove snapshot") + return &eventstypes.SnapshotRemove{ + Key: key, + Snapshotter: ss, + }, ssbkt.DeleteBucket([]byte(key)) } } case ResourceLease: lbkt := nsbkt.Bucket(bucketKeyObjectLeases) if lbkt != nil { - return lbkt.DeleteBucket([]byte(node.Key)) + return nil, lbkt.DeleteBucket([]byte(node.Key)) } case ResourceIngest: ibkt := nsbkt.Bucket(bucketKeyObjectContent) @@ -459,39 +638,31 @@ func remove(ctx context.Context, tx *bolt.Tx, node gc.Node) error { } if ibkt != nil { log.G(ctx).WithField("ref", node.Key).Debug("remove ingest") - return ibkt.DeleteBucket([]byte(node.Key)) + return nil, ibkt.DeleteBucket([]byte(node.Key)) + } + default: + cc, ok := c.contexts[node.Type] + if ok { + cc.Remove(node) + } else { + log.G(ctx).WithField("ref", node.Key).WithField("type", node.Type).Info("no remove defined for resource") } } - return nil + return nil, nil } // sendLabelRefs sends all snapshot and content references referred to by the labels in the bkt -func sendLabelRefs(ns string, bkt *bolt.Bucket, fn func(gc.Node)) error { +func (c *gcContext) sendLabelRefs(ns string, bkt *bolt.Bucket, fn func(gc.Node)) error { lbkt := bkt.Bucket(bucketKeyObjectLabels) if lbkt != nil { lc := lbkt.Cursor() - - labelRef := string(labelGCContentRef) - for k, v := lc.Seek(labelGCContentRef); k != nil && strings.HasPrefix(string(k), labelRef); k, v = lc.Next() { - if ks := string(k); ks != labelRef { - // Allow reference naming separated by . or /, ignore names - if ks[len(labelRef)] != '.' && ks[len(labelRef)] != '/' { - continue - } + for i := range c.labelHandlers { + labelRef := string(c.labelHandlers[i].key) + for k, v := lc.Seek(c.labelHandlers[i].key); k != nil && strings.HasPrefix(string(k), labelRef); k, v = lc.Next() { + c.labelHandlers[i].fn(ns, k, v, fn) } - - fn(gcnode(ResourceContent, ns, string(v))) } - - for k, v := lc.Seek(labelGCSnapRef); k != nil && strings.HasPrefix(string(k), string(labelGCSnapRef)); k, v = lc.Next() { - snapshotter := k[len(labelGCSnapRef):] - if i := bytes.IndexByte(snapshotter, '/'); i >= 0 { - snapshotter = snapshotter[:i] - } - fn(gcnode(ResourceSnapshot, ns, fmt.Sprintf("%s/%s", snapshotter, v))) - } - } return nil } diff --git a/tools/vendor/github.com/containerd/containerd/metadata/images.go b/tools/vendor/github.com/containerd/containerd/metadata/images.go index 8355b712e..ff5b624cc 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/images.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/images.go @@ -31,6 +31,7 @@ import ( "github.com/containerd/containerd/labels" "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/pkg/epoch" digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" bolt "go.etcd.io/bbolt" @@ -144,7 +145,15 @@ func (s *imageStore) Create(ctx context.Context, image images.Image) (images.Ima return fmt.Errorf("image %q: %w", image.Name, errdefs.ErrAlreadyExists) } - image.CreatedAt = time.Now().UTC() + // The value of `image.CreatedAt` passed from the caller is discarded here. + // Ideally we should return an error when the value is already set. + // However, as `image.CreatedAt` is defined as a non-pointer `time.Time`, we can't compare it to nil. + // And we can't compare it to `time.Time{}` either, as `time.Time{}` is a proper timestamp (1970-01-01 00:00:00). + if tm := epoch.FromContext(ctx); tm != nil { + image.CreatedAt = tm.UTC() + } else { + image.CreatedAt = time.Now().UTC() + } image.UpdatedAt = image.CreatedAt return writeImage(ibkt, &image) }); err != nil { @@ -228,7 +237,11 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths } updated.CreatedAt = createdat - updated.UpdatedAt = time.Now().UTC() + if tm := epoch.FromContext(ctx); tm != nil { + updated.UpdatedAt = tm.UTC() + } else { + updated.UpdatedAt = time.Now().UTC() + } return writeImage(ibkt, &updated) }); err != nil { return images.Image{}, err diff --git a/tools/vendor/github.com/containerd/containerd/metadata/sandbox.go b/tools/vendor/github.com/containerd/containerd/metadata/sandbox.go new file mode 100644 index 000000000..5766647d3 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/metadata/sandbox.go @@ -0,0 +1,373 @@ +/* + 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 metadata + +import ( + "context" + "errors" + "fmt" + "strings" + "time" + + "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/filters" + "github.com/containerd/containerd/identifiers" + "github.com/containerd/containerd/metadata/boltutil" + "github.com/containerd/containerd/namespaces" + api "github.com/containerd/containerd/sandbox" + "github.com/containerd/typeurl/v2" + "go.etcd.io/bbolt" +) + +type sandboxStore struct { + db *DB +} + +var _ api.Store = (*sandboxStore)(nil) + +// NewSandboxStore creates a datababase client for sandboxes +func NewSandboxStore(db *DB) api.Store { + return &sandboxStore{db: db} +} + +// Create a sandbox record in the store +func (s *sandboxStore) Create(ctx context.Context, sandbox api.Sandbox) (api.Sandbox, error) { + ns, err := namespaces.NamespaceRequired(ctx) + if err != nil { + return api.Sandbox{}, err + } + + sandbox.CreatedAt = time.Now().UTC() + sandbox.UpdatedAt = sandbox.CreatedAt + + if err := s.validate(&sandbox); err != nil { + return api.Sandbox{}, fmt.Errorf("failed to validate sandbox: %w", err) + } + + if err := s.db.Update(func(tx *bbolt.Tx) error { + parent, err := createSandboxBucket(tx, ns) + if err != nil { + return fmt.Errorf("create error: %w", err) + } + + if err := s.write(parent, &sandbox, false); err != nil { + return fmt.Errorf("write error: %w", err) + } + + return nil + }); err != nil { + return api.Sandbox{}, err + } + + return sandbox, nil +} + +// Update the sandbox with the provided sandbox object and fields +func (s *sandboxStore) Update(ctx context.Context, sandbox api.Sandbox, fieldpaths ...string) (api.Sandbox, error) { + ns, err := namespaces.NamespaceRequired(ctx) + if err != nil { + return api.Sandbox{}, err + } + + ret := api.Sandbox{} + if err := update(ctx, s.db, func(tx *bbolt.Tx) error { + parent := getSandboxBucket(tx, ns) + if parent == nil { + return fmt.Errorf("no sandbox buckets: %w", errdefs.ErrNotFound) + } + + updated, err := s.read(parent, []byte(sandbox.ID)) + if err != nil { + return err + } + + if len(fieldpaths) == 0 { + fieldpaths = []string{"labels", "extensions", "spec", "runtime"} + + if updated.Runtime.Name != sandbox.Runtime.Name { + return fmt.Errorf("sandbox.Runtime.Name field is immutable: %w", errdefs.ErrInvalidArgument) + } + } + + for _, path := range fieldpaths { + if strings.HasPrefix(path, "labels.") { + if updated.Labels == nil { + updated.Labels = map[string]string{} + } + + key := strings.TrimPrefix(path, "labels.") + updated.Labels[key] = sandbox.Labels[key] + continue + } else if strings.HasPrefix(path, "extensions.") { + if updated.Extensions == nil { + updated.Extensions = map[string]typeurl.Any{} + } + + key := strings.TrimPrefix(path, "extensions.") + updated.Extensions[key] = sandbox.Extensions[key] + continue + } + + switch path { + case "labels": + updated.Labels = sandbox.Labels + case "extensions": + updated.Extensions = sandbox.Extensions + case "runtime": + updated.Runtime = sandbox.Runtime + case "spec": + updated.Spec = sandbox.Spec + default: + return fmt.Errorf("cannot update %q field on sandbox %q: %w", path, sandbox.ID, errdefs.ErrInvalidArgument) + } + } + + updated.UpdatedAt = time.Now().UTC() + + if err := s.validate(&updated); err != nil { + return err + } + + if err := s.write(parent, &updated, true); err != nil { + return err + } + + ret = updated + return nil + }); err != nil { + return api.Sandbox{}, err + } + + return ret, nil +} + +// Get sandbox metadata using the id +func (s *sandboxStore) Get(ctx context.Context, id string) (api.Sandbox, error) { + ns, err := namespaces.NamespaceRequired(ctx) + if err != nil { + return api.Sandbox{}, err + } + + ret := api.Sandbox{} + if err := view(ctx, s.db, func(tx *bbolt.Tx) error { + bucket := getSandboxBucket(tx, ns) + if bucket == nil { + return fmt.Errorf("no sandbox buckets: %w", errdefs.ErrNotFound) + } + + out, err := s.read(bucket, []byte(id)) + if err != nil { + return err + } + + ret = out + return nil + }); err != nil { + return api.Sandbox{}, err + } + + return ret, nil +} + +// List returns sandboxes that match one or more of the provided filters +func (s *sandboxStore) List(ctx context.Context, fields ...string) ([]api.Sandbox, error) { + ns, err := namespaces.NamespaceRequired(ctx) + if err != nil { + return nil, err + } + + filter, err := filters.ParseAll(fields...) + if err != nil { + return nil, fmt.Errorf("%s: %w", err.Error(), errdefs.ErrInvalidArgument) + } + + var ( + list []api.Sandbox + ) + + if err := view(ctx, s.db, func(tx *bbolt.Tx) error { + bucket := getSandboxBucket(tx, ns) + if bucket == nil { + // We haven't created any sandboxes yet, just return empty list + return nil + } + + if err := bucket.ForEach(func(k, v []byte) error { + info, err := s.read(bucket, k) + if err != nil { + return fmt.Errorf("failed to read bucket %q: %w", string(k), err) + } + + if filter.Match(adaptSandbox(&info)) { + list = append(list, info) + } + + return nil + }); err != nil { + return err + } + + return nil + }); err != nil { + return nil, err + } + + return list, nil +} + +// Delete a sandbox from metadata store using the id +func (s *sandboxStore) Delete(ctx context.Context, id string) error { + ns, err := namespaces.NamespaceRequired(ctx) + if err != nil { + return err + } + + if err := update(ctx, s.db, func(tx *bbolt.Tx) error { + buckets := getSandboxBucket(tx, ns) + if buckets == nil { + return fmt.Errorf("no sandbox buckets: %w", errdefs.ErrNotFound) + } + + if err := buckets.DeleteBucket([]byte(id)); err != nil { + return fmt.Errorf("failed to delete sandbox %q: %w", id, err) + } + + return nil + }); err != nil { + return err + } + + return nil +} + +func (s *sandboxStore) write(parent *bbolt.Bucket, instance *api.Sandbox, overwrite bool) error { + var ( + bucket *bbolt.Bucket + err error + id = []byte(instance.ID) + ) + + if overwrite { + bucket, err = parent.CreateBucketIfNotExists(id) + if err != nil { + return err + } + } else { + bucket = parent.Bucket(id) + if bucket != nil { + return fmt.Errorf("sandbox bucket %q already exists: %w", instance.ID, errdefs.ErrAlreadyExists) + } + + bucket, err = parent.CreateBucket(id) + if err != nil { + return err + } + } + + if err := boltutil.WriteTimestamps(bucket, instance.CreatedAt, instance.UpdatedAt); err != nil { + return err + } + + if err := boltutil.WriteLabels(bucket, instance.Labels); err != nil { + return err + } + + if err := boltutil.WriteExtensions(bucket, instance.Extensions); err != nil { + return err + } + + if err := boltutil.WriteAny(bucket, bucketKeySpec, instance.Spec); err != nil { + return err + } + + runtimeBucket, err := bucket.CreateBucketIfNotExists(bucketKeyRuntime) + if err != nil { + return err + } + + if err := runtimeBucket.Put(bucketKeyName, []byte(instance.Runtime.Name)); err != nil { + return err + } + + if err := boltutil.WriteAny(runtimeBucket, bucketKeyOptions, instance.Runtime.Options); err != nil { + return err + } + + return nil +} + +func (s *sandboxStore) read(parent *bbolt.Bucket, id []byte) (api.Sandbox, error) { + var ( + inst api.Sandbox + err error + ) + + bucket := parent.Bucket(id) + if bucket == nil { + return api.Sandbox{}, fmt.Errorf("bucket %q not found: %w", id, errdefs.ErrNotFound) + } + + inst.ID = string(id) + + inst.Labels, err = boltutil.ReadLabels(bucket) + if err != nil { + return api.Sandbox{}, err + } + + if err := boltutil.ReadTimestamps(bucket, &inst.CreatedAt, &inst.UpdatedAt); err != nil { + return api.Sandbox{}, err + } + + inst.Spec, err = boltutil.ReadAny(bucket, bucketKeySpec) + if err != nil { + return api.Sandbox{}, err + } + + runtimeBucket := bucket.Bucket(bucketKeyRuntime) + if runtimeBucket == nil { + return api.Sandbox{}, errors.New("no runtime bucket") + } + + inst.Runtime.Name = string(runtimeBucket.Get(bucketKeyName)) + inst.Runtime.Options, err = boltutil.ReadAny(runtimeBucket, bucketKeyOptions) + if err != nil { + return api.Sandbox{}, err + } + + inst.Extensions, err = boltutil.ReadExtensions(bucket) + if err != nil { + return api.Sandbox{}, err + } + + return inst, nil +} + +func (s *sandboxStore) validate(new *api.Sandbox) error { + if err := identifiers.Validate(new.ID); err != nil { + return fmt.Errorf("invalid sandbox ID: %w", err) + } + + if new.CreatedAt.IsZero() { + return fmt.Errorf("creation date must not be zero: %w", errdefs.ErrInvalidArgument) + } + + if new.UpdatedAt.IsZero() { + return fmt.Errorf("updated date must not be zero: %w", errdefs.ErrInvalidArgument) + } + + return nil +} diff --git a/tools/vendor/github.com/containerd/containerd/metadata/snapshot.go b/tools/vendor/github.com/containerd/containerd/metadata/snapshot.go index 348602093..e7774d36e 100644 --- a/tools/vendor/github.com/containerd/containerd/metadata/snapshot.go +++ b/tools/vendor/github.com/containerd/containerd/metadata/snapshot.go @@ -24,6 +24,7 @@ import ( "sync/atomic" "time" + eventstypes "github.com/containerd/containerd/api/events" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/filters" "github.com/containerd/containerd/labels" @@ -273,7 +274,22 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, er } func (s *snapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) { - return s.createSnapshot(ctx, key, parent, false, opts) + mounts, err := s.createSnapshot(ctx, key, parent, false, opts) + if err != nil { + return nil, err + } + + if s.db.dbopts.publisher != nil { + if err := s.db.dbopts.publisher.Publish(ctx, "/snapshot/prepare", &eventstypes.SnapshotPrepare{ + Key: key, + Parent: parent, + Snapshotter: s.name, + }); err != nil { + return nil, err + } + } + + return mounts, nil } func (s *snapshotter) View(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) { @@ -618,6 +634,16 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap return err } + if s.db.dbopts.publisher != nil { + if err := s.db.dbopts.publisher.Publish(ctx, "/snapshot/commit", &eventstypes.SnapshotCommit{ + Key: key, + Name: name, + Snapshotter: s.name, + }); err != nil { + return err + } + } + return nil } @@ -631,7 +657,7 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { return err } - return update(ctx, s.db, func(tx *bolt.Tx) error { + if err := update(ctx, s.db, func(tx *bolt.Tx) error { var sbkt *bolt.Bucket bkt := getSnapshotterBucket(tx, ns, s.name) if bkt != nil { @@ -674,7 +700,17 @@ func (s *snapshotter) Remove(ctx context.Context, key string) error { s.db.dirtySS[s.name] = struct{}{} return nil - }) + }); err != nil { + return err + } + + if s.db.dbopts.publisher != nil { + return s.db.dbopts.publisher.Publish(ctx, "/snapshot/remove", &eventstypes.SnapshotRemove{ + Key: key, + Snapshotter: s.name, + }) + } + return nil } type infoPair struct { diff --git a/tools/vendor/github.com/containerd/containerd/mount/fmountat_linux.go b/tools/vendor/github.com/containerd/containerd/mount/fmountat_linux.go deleted file mode 100644 index 850a92acf..000000000 --- a/tools/vendor/github.com/containerd/containerd/mount/fmountat_linux.go +++ /dev/null @@ -1,145 +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 mount - -import ( - "fmt" - "runtime" - "syscall" - "unsafe" - - "github.com/containerd/containerd/log" - "golang.org/x/sys/unix" -) - -// fMountat performs mount from the provided directory. -func fMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data string) error { - var ( - sourceP, targetP, fstypeP, dataP *byte - pid uintptr - err error - errno, status syscall.Errno - ) - - sourceP, err = syscall.BytePtrFromString(source) - if err != nil { - return err - } - - targetP, err = syscall.BytePtrFromString(target) - if err != nil { - return err - } - - fstypeP, err = syscall.BytePtrFromString(fstype) - if err != nil { - return err - } - - if data != "" { - dataP, err = syscall.BytePtrFromString(data) - if err != nil { - return err - } - } - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - var pipefds [2]int - if err := syscall.Pipe2(pipefds[:], syscall.O_CLOEXEC); err != nil { - return fmt.Errorf("failed to open pipe: %w", err) - } - - defer func() { - // close both ends of the pipe in a deferred function, since open file - // descriptor table is shared with child - syscall.Close(pipefds[0]) - syscall.Close(pipefds[1]) - }() - - pid, errno = forkAndMountat(dirfd, - uintptr(unsafe.Pointer(sourceP)), - uintptr(unsafe.Pointer(targetP)), - uintptr(unsafe.Pointer(fstypeP)), - flags, - uintptr(unsafe.Pointer(dataP)), - pipefds[1], - ) - - if errno != 0 { - return fmt.Errorf("failed to fork thread: %w", errno) - } - - defer func() { - _, err := unix.Wait4(int(pid), nil, 0, nil) - for err == syscall.EINTR { - _, err = unix.Wait4(int(pid), nil, 0, nil) - } - - if err != nil { - log.L.WithError(err).Debugf("failed to find pid=%d process", pid) - } - }() - - _, _, errno = syscall.RawSyscall(syscall.SYS_READ, - uintptr(pipefds[0]), - uintptr(unsafe.Pointer(&status)), - unsafe.Sizeof(status)) - if errno != 0 { - return fmt.Errorf("failed to read pipe: %w", errno) - } - - if status != 0 { - return fmt.Errorf("failed to mount: %w", status) - } - - return nil -} - -// forkAndMountat will fork thread, change working dir and mount. -// -// precondition: the runtime OS thread must be locked. -func forkAndMountat(dirfd uintptr, source, target, fstype, flags, data uintptr, pipefd int) (pid uintptr, errno syscall.Errno) { - - // block signal during clone - beforeFork() - - // the cloned thread shares the open file descriptor, but the thread - // never be reused by runtime. - pid, _, errno = syscall.RawSyscall6(syscall.SYS_CLONE, uintptr(syscall.SIGCHLD)|syscall.CLONE_FILES, 0, 0, 0, 0, 0) - if errno != 0 || pid != 0 { - // restore all signals - afterFork() - return - } - - // restore all signals - afterForkInChild() - - // change working dir - _, _, errno = syscall.RawSyscall(syscall.SYS_FCHDIR, dirfd, 0, 0) - if errno != 0 { - goto childerr - } - _, _, errno = syscall.RawSyscall6(syscall.SYS_MOUNT, source, target, fstype, flags, data, 0) - -childerr: - _, _, errno = syscall.RawSyscall(syscall.SYS_WRITE, uintptr(pipefd), uintptr(unsafe.Pointer(&errno)), unsafe.Sizeof(errno)) - syscall.RawSyscall(syscall.SYS_EXIT, uintptr(errno), 0, 0) - panic("unreachable") -} diff --git a/tools/vendor/github.com/containerd/containerd/mount/lookup_unix.go b/tools/vendor/github.com/containerd/containerd/mount/lookup_unix.go index 44881750b..6fb16f6dd 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/lookup_unix.go +++ b/tools/vendor/github.com/containerd/containerd/mount/lookup_unix.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/mount/lookup_unsupported.go b/tools/vendor/github.com/containerd/containerd/mount/lookup_unsupported.go index 2e954b1ae..1daf96d5c 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/lookup_unsupported.go +++ b/tools/vendor/github.com/containerd/containerd/mount/lookup_unsupported.go @@ -1,5 +1,4 @@ //go:build windows -// +build windows /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/mount/losetup_linux.go b/tools/vendor/github.com/containerd/containerd/mount/losetup_linux.go index 9a6801790..567ebb4e9 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/losetup_linux.go +++ b/tools/vendor/github.com/containerd/containerd/mount/losetup_linux.go @@ -19,13 +19,11 @@ package mount import ( "errors" "fmt" - "math/rand" "os" "strings" - "syscall" "time" - "unsafe" + "github.com/containerd/containerd/pkg/randutil" "golang.org/x/sys/unix" ) @@ -47,22 +45,13 @@ type LoopParams struct { Direct bool } -func ioctl(fd, req, args uintptr) (uintptr, uintptr, error) { - r1, r2, errno := syscall.Syscall(syscall.SYS_IOCTL, fd, req, args) - if errno != 0 { - return 0, 0, errno - } - - return r1, r2, nil -} - func getFreeLoopDev() (uint32, error) { ctrl, err := os.OpenFile(loopControlPath, os.O_RDWR, 0) if err != nil { return 0, fmt.Errorf("could not open %v: %v", loopControlPath, err) } defer ctrl.Close() - num, _, err := ioctl(ctrl.Fd(), unix.LOOP_CTL_GET_FREE, 0) + num, err := unix.IoctlRetInt(int(ctrl.Fd()), unix.LOOP_CTL_GET_FREE) if err != nil { return 0, fmt.Errorf("could not get free loop device: %w", err) } @@ -96,7 +85,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re }() // 2. Set FD - if _, _, err = ioctl(loop.Fd(), unix.LOOP_SET_FD, back.Fd()); err != nil { + if err := unix.IoctlSetInt(int(loop.Fd()), unix.LOOP_SET_FD, int(back.Fd())); err != nil { return nil, fmt.Errorf("could not set loop fd for device: %s: %w", loopDev, err) } @@ -115,7 +104,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re info.Flags |= unix.LO_FLAGS_DIRECT_IO } - _, _, err = ioctl(loop.Fd(), unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(&info))) + err = unix.IoctlLoopSetStatus64(int(loop.Fd()), &info) if err == nil { return loop, nil } @@ -124,13 +113,13 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re // Retry w/o direct IO flag in case kernel does not support it. The downside is that // it will suffer from double cache problem. info.Flags &= ^(uint32(unix.LO_FLAGS_DIRECT_IO)) - _, _, err = ioctl(loop.Fd(), unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(&info))) + err = unix.IoctlLoopSetStatus64(int(loop.Fd()), &info) if err == nil { return loop, nil } } - _, _, _ = ioctl(loop.Fd(), unix.LOOP_CLR_FD, 0) + _ = unix.IoctlSetInt(int(loop.Fd()), unix.LOOP_CLR_FD, 0) return nil, fmt.Errorf("failed to set loop device info: %v", err) } @@ -163,7 +152,7 @@ func setupLoop(backingFile string, param LoopParams) (*os.File, error) { // with EBUSY when trying to set it up. if strings.Contains(err.Error(), ebusyString) { // Fallback a bit to avoid live lock - time.Sleep(time.Millisecond * time.Duration(rand.Intn(retry*10))) + time.Sleep(time.Millisecond * time.Duration(randutil.Intn(retry*10))) continue } return nil, err @@ -182,8 +171,7 @@ func removeLoop(loopdev string) error { } defer file.Close() - _, _, err = ioctl(file.Fd(), unix.LOOP_CLR_FD, 0) - return err + return unix.IoctlSetInt(int(file.Fd()), unix.LOOP_CLR_FD, 0) } // AttachLoopDevice attaches a specified backing file to a loop device diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount.go b/tools/vendor/github.com/containerd/containerd/mount/mount.go index b25556b2e..21dd0f903 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/mount.go +++ b/tools/vendor/github.com/containerd/containerd/mount/mount.go @@ -16,6 +16,12 @@ package mount +import ( + "fmt" + + "github.com/containerd/continuity/fs" +) + // Mount is the lingua franca of containerd. A mount represents a // serialized mount syscall. Components either emit or consume mounts. type Mount struct { @@ -24,12 +30,16 @@ type Mount struct { // Source specifies where to mount from. Depending on the host system, this // can be a source path or device. Source string + // Target specifies an optional subdirectory as a mountpoint. It assumes that + // the subdirectory exists in a parent mount. + Target string // Options contains zero or more fstab-style mount options. Typically, // these are platform specific. Options []string } -// All mounts all the provided mounts to the provided target +// All mounts all the provided mounts to the provided target. If submounts are +// present, it assumes that parent mounts come before child mounts. func All(mounts []Mount, target string) error { for _, m := range mounts { if err := m.Mount(target); err != nil { @@ -38,3 +48,30 @@ func All(mounts []Mount, target string) error { } return nil } + +// UnmountMounts unmounts all the mounts under a target in the reverse order of +// the mounts array provided. +func UnmountMounts(mounts []Mount, target string, flags int) error { + for i := len(mounts) - 1; i >= 0; i-- { + mountpoint, err := fs.RootPath(target, mounts[i].Target) + if err != nil { + return err + } + + if err := UnmountAll(mountpoint, flags); err != nil { + if i == len(mounts)-1 { // last mount + return err + } + } + } + return nil +} + +// Mount to the provided target path. +func (m *Mount) Mount(target string) error { + target, err := fs.RootPath(target, m.Target) + if err != nil { + return fmt.Errorf("failed to join path %q with root %q: %w", m.Target, target, err) + } + return m.mount(target) +} diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount_freebsd.go b/tools/vendor/github.com/containerd/containerd/mount/mount_freebsd.go index 3711383c6..f41df3dea 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/mount_freebsd.go +++ b/tools/vendor/github.com/containerd/containerd/mount/mount_freebsd.go @@ -31,15 +31,12 @@ var ( ErrNotImplementOnUnix = errors.New("not implemented under unix") ) -// Mount to the provided target path. -func (m *Mount) Mount(target string) error { - // The "syscall" and "golang.org/x/sys/unix" packages do not define a Mount - // function for FreeBSD, so instead we execute mount(8) and trust it to do - // the right thing - return m.mountWithHelper(target) -} - -func (m *Mount) mountWithHelper(target string) error { +// Mount to the provided target. +// +// The "syscall" and "golang.org/x/sys/unix" packages do not define a Mount +// function for FreeBSD, so instead we execute mount(8) and trust it to do +// the right thing +func (m *Mount) mount(target string) error { // target: "/foo/target" // command: "mount -o ro -t nullfs /foo/source /foo/merged" // Note: FreeBSD mount(8) is particular about the order of flags and arguments diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount_linux.go b/tools/vendor/github.com/containerd/containerd/mount/mount_linux.go index a69f65c2d..4183333db 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/mount_linux.go +++ b/tools/vendor/github.com/containerd/containerd/mount/mount_linux.go @@ -21,6 +21,7 @@ import ( "fmt" "os" "path" + "runtime" "strings" "time" @@ -41,7 +42,7 @@ func init() { // // If m.Type starts with "fuse." or "fuse3.", "mount.fuse" or "mount.fuse3" // helper binary is called. -func (m *Mount) Mount(target string) (err error) { +func (m *Mount) mount(target string) (err error) { for _, helperBinary := range allowedHelperBinaries { // helperBinary = "mount.fuse", typePrefix = "fuse." typePrefix := strings.TrimPrefix(helperBinary, "mount.") + "." @@ -363,24 +364,29 @@ func mountAt(chdir string, source, target, fstype string, flags uintptr, data st return unix.Mount(source, target, fstype, flags, data) } - f, err := os.Open(chdir) - if err != nil { - return fmt.Errorf("failed to mountat: %w", err) - } - defer f.Close() + ch := make(chan error, 1) + go func() { + runtime.LockOSThread() - fs, err := f.Stat() - if err != nil { - return fmt.Errorf("failed to mountat: %w", err) - } + // Do not unlock this thread. + // If the thread is unlocked go will try to use it for other goroutines. + // However it is not possible to restore the thread state after CLONE_FS. + // + // Once the goroutine exits the thread should eventually be terminated by go. - if !fs.IsDir() { - return fmt.Errorf("failed to mountat: %s is not dir", chdir) - } - if err := fMountat(f.Fd(), source, target, fstype, flags, data); err != nil { - return fmt.Errorf("failed to mountat: %w", err) - } - return nil + if err := unix.Unshare(unix.CLONE_FS); err != nil { + ch <- err + return + } + + if err := unix.Chdir(chdir); err != nil { + ch <- err + return + } + + ch <- unix.Mount(source, target, fstype, flags, data) + }() + return <-ch } func (m *Mount) mountWithHelper(helperBinary, typePrefix, target string) error { diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount_unix.go b/tools/vendor/github.com/containerd/containerd/mount/mount_unix.go index 795bb4bfe..46dfd1c34 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/mount_unix.go +++ b/tools/vendor/github.com/containerd/containerd/mount/mount_unix.go @@ -1,5 +1,4 @@ -//go:build darwin || openbsd -// +build darwin openbsd +//go:build !windows && !darwin && !openbsd /* Copyright The containerd Authors. @@ -19,24 +18,44 @@ package mount -import "errors" +import ( + "sort" -var ( - // ErrNotImplementOnUnix is returned for methods that are not implemented - ErrNotImplementOnUnix = errors.New("not implemented under unix") + "github.com/moby/sys/mountinfo" ) -// Mount is not implemented on this platform -func (m *Mount) Mount(target string) error { - return ErrNotImplementOnUnix -} - -// Unmount is not implemented on this platform -func Unmount(mount string, flags int) error { - return ErrNotImplementOnUnix -} - -// UnmountAll is not implemented on this platform -func UnmountAll(mount string, flags int) error { - return ErrNotImplementOnUnix +// UnmountRecursive unmounts the target and all mounts underneath, starting +// with the deepest mount first. +func UnmountRecursive(target string, flags int) error { + if target == "" { + return nil + } + mounts, err := mountinfo.GetMounts(mountinfo.PrefixFilter(target)) + if err != nil { + return err + } + + targetSet := make(map[string]struct{}) + for _, m := range mounts { + targetSet[m.Mountpoint] = struct{}{} + } + + var targets []string + for m := range targetSet { + targets = append(targets, m) + } + + // Make the deepest mount be first + sort.SliceStable(targets, func(i, j int) bool { + return len(targets[i]) > len(targets[j]) + }) + + for i, target := range targets { + if err := UnmountAll(target, flags); err != nil { + if i == len(targets)-1 { // last mount + return err + } + } + } + return nil } diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount_unsupported.go b/tools/vendor/github.com/containerd/containerd/mount/mount_unsupported.go new file mode 100644 index 000000000..894467a99 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/mount/mount_unsupported.go @@ -0,0 +1,46 @@ +//go:build darwin || openbsd + +/* + 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 mount + +import "errors" + +var ( + // ErrNotImplementOnUnix is returned for methods that are not implemented + ErrNotImplementOnUnix = errors.New("not implemented under unix") +) + +// Mount is not implemented on this platform +func (m *Mount) mount(target string) error { + return ErrNotImplementOnUnix +} + +// Unmount is not implemented on this platform +func Unmount(mount string, flags int) error { + return ErrNotImplementOnUnix +} + +// UnmountAll is not implemented on this platform +func UnmountAll(mount string, flags int) error { + return ErrNotImplementOnUnix +} + +// UnmountRecursive is not implemented on this platform +func UnmountRecursive(mount string, flags int) error { + return ErrNotImplementOnUnix +} diff --git a/tools/vendor/github.com/containerd/containerd/mount/mount_windows.go b/tools/vendor/github.com/containerd/containerd/mount/mount_windows.go index 87fed8268..b73fe3646 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/mount_windows.go +++ b/tools/vendor/github.com/containerd/containerd/mount/mount_windows.go @@ -18,7 +18,6 @@ package mount import ( "encoding/json" - "errors" "fmt" "os" "path/filepath" @@ -27,13 +26,8 @@ import ( "github.com/Microsoft/hcsshim" ) -var ( - // ErrNotImplementOnWindows is returned when an action is not implemented for windows - ErrNotImplementOnWindows = errors.New("not implemented under windows") -) - -// Mount to the provided target -func (m *Mount) Mount(target string) error { +// Mount to the provided target. +func (m *Mount) mount(target string) error { if m.Type != "windows-layer" { return fmt.Errorf("invalid windows mount type: '%s'", m.Type) } @@ -64,8 +58,9 @@ func (m *Mount) Mount(target string) error { return fmt.Errorf("failed to get layer mount path for %s: %w", m.Source, err) } mountPath = mountPath + `\` + if err = os.Symlink(mountPath, target); err != nil { - return fmt.Errorf("failed to link mount to taget %s: %w", target, err) + return fmt.Errorf("failed to link mount to target %s: %w", target, err) } return nil } @@ -111,3 +106,8 @@ func Unmount(mount string, flags int) error { func UnmountAll(mount string, flags int) error { return Unmount(mount, flags) } + +// UnmountRecursive unmounts from the provided path +func UnmountRecursive(mount string, flags int) error { + return UnmountAll(mount, flags) +} diff --git a/tools/vendor/github.com/containerd/containerd/mount/temp.go b/tools/vendor/github.com/containerd/containerd/mount/temp.go index 13eedaf03..349c2404e 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/temp.go +++ b/tools/vendor/github.com/containerd/containerd/mount/temp.go @@ -49,7 +49,7 @@ func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) erro // We should do defer first, if not we will not do Unmount when only a part of Mounts are failed. defer func() { - if uerr = UnmountAll(root, 0); uerr != nil { + if uerr = UnmountMounts(mounts, root, 0); uerr != nil { uerr = fmt.Errorf("failed to unmount %s: %w", root, uerr) if err == nil { err = uerr diff --git a/tools/vendor/github.com/containerd/containerd/mount/temp_unix.go b/tools/vendor/github.com/containerd/containerd/mount/temp_unix.go index e96970081..5ddd2cd16 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/temp_unix.go +++ b/tools/vendor/github.com/containerd/containerd/mount/temp_unix.go @@ -1,5 +1,4 @@ //go:build !windows && !darwin -// +build !windows,!darwin /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/mount/temp_unsupported.go b/tools/vendor/github.com/containerd/containerd/mount/temp_unsupported.go index feec90a76..3ccc0444f 100644 --- a/tools/vendor/github.com/containerd/containerd/mount/temp_unsupported.go +++ b/tools/vendor/github.com/containerd/containerd/mount/temp_unsupported.go @@ -1,5 +1,4 @@ //go:build windows || darwin -// +build windows darwin /* Copyright The containerd Authors. diff --git a/tools/vendor/github.com/containerd/containerd/namespaces/store.go b/tools/vendor/github.com/containerd/containerd/namespaces/store.go index 5936772cb..a1b2571bb 100644 --- a/tools/vendor/github.com/containerd/containerd/namespaces/store.go +++ b/tools/vendor/github.com/containerd/containerd/namespaces/store.go @@ -24,8 +24,6 @@ import "context" // oriented. A namespace is really just a name and a set of labels. Objects // that belong to a namespace are returned when the namespace is assigned to a // given context. -// -// type Store interface { Create(ctx context.Context, namespace string, labels map[string]string) error Labels(ctx context.Context, namespace string) (map[string]string, error) diff --git a/tools/vendor/github.com/containerd/containerd/pkg/cleanup/context.go b/tools/vendor/github.com/containerd/containerd/pkg/cleanup/context.go new file mode 100644 index 000000000..62741c4ca --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/pkg/cleanup/context.go @@ -0,0 +1,52 @@ +/* + 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 providing utilies to help cleanup +package cleanup + +import ( + "context" + "time" +) + +type clearCancel struct { + context.Context +} + +func (cc clearCancel) Deadline() (deadline time.Time, ok bool) { + return +} + +func (cc clearCancel) Done() <-chan struct{} { + return nil +} + +func (cc clearCancel) Err() error { + return nil +} + +// Background creates a new context which clears out the parent errors +func Background(ctx context.Context) context.Context { + return clearCancel{ctx} +} + +// Do runs the provided function with a context in which the +// errors are cleared out and will timeout after 10 seconds. +func Do(ctx context.Context, do func(context.Context)) { + ctx, cancel := context.WithTimeout(clearCancel{ctx}, 10*time.Second) + do(ctx) + cancel() +} diff --git a/tools/vendor/github.com/containerd/containerd/pkg/epoch/context.go b/tools/vendor/github.com/containerd/containerd/pkg/epoch/context.go new file mode 100644 index 000000000..fd16f9519 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/pkg/epoch/context.go @@ -0,0 +1,41 @@ +/* + 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 epoch + +import ( + "context" + "time" +) + +type ( + epochKey struct{} +) + +// WithSourceDateEpoch associates the context with the epoch. +func WithSourceDateEpoch(ctx context.Context, tm *time.Time) context.Context { + return context.WithValue(ctx, epochKey{}, tm) +} + +// FromContext returns the epoch associated with the context. +// FromContext does not fall back to read the SOURCE_DATE_EPOCH env var. +func FromContext(ctx context.Context) *time.Time { + v := ctx.Value(epochKey{}) + if v == nil { + return nil + } + return v.(*time.Time) +} diff --git a/tools/vendor/github.com/containerd/containerd/pkg/epoch/epoch.go b/tools/vendor/github.com/containerd/containerd/pkg/epoch/epoch.go new file mode 100644 index 000000000..124e8edb5 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/pkg/epoch/epoch.go @@ -0,0 +1,69 @@ +/* + 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 epoch provides SOURCE_DATE_EPOCH utilities. +package epoch + +import ( + "fmt" + "os" + "strconv" + "time" + + "github.com/sirupsen/logrus" +) + +// SourceDateEpochEnv is the SOURCE_DATE_EPOCH env var. +// See https://reproducible-builds.org/docs/source-date-epoch/ +const SourceDateEpochEnv = "SOURCE_DATE_EPOCH" + +// SourceDateEpoch returns the SOURCE_DATE_EPOCH env var as *time.Time. +// If the env var is not set, SourceDateEpoch returns nil without an error. +func SourceDateEpoch() (*time.Time, error) { + v, ok := os.LookupEnv(SourceDateEpochEnv) + if !ok || v == "" { + return nil, nil // not an error + } + i64, err := strconv.ParseInt(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid %s value %q: %w", SourceDateEpochEnv, v, err) + } + unix := time.Unix(i64, 0).UTC() + return &unix, nil +} + +// SourceDateEpochOrNow returns the SOURCE_DATE_EPOCH time if available, +// otherwise returns the current time. +func SourceDateEpochOrNow() time.Time { + epoch, err := SourceDateEpoch() + if err != nil { + logrus.WithError(err).Warnf("Invalid %s", SourceDateEpochEnv) + } + if epoch != nil { + return *epoch + } + return time.Now().UTC() +} + +// SetSourceDateEpoch sets the SOURCE_DATE_EPOCH env var. +func SetSourceDateEpoch(tm time.Time) { + os.Setenv(SourceDateEpochEnv, fmt.Sprintf("%d", tm.Unix())) +} + +// UnsetSourceDateEpoch unsets the SOURCE_DATE_EPOCH env var. +func UnsetSourceDateEpoch() { + os.Unsetenv(SourceDateEpochEnv) +} diff --git a/tools/vendor/github.com/containerd/containerd/pkg/randutil/randutil.go b/tools/vendor/github.com/containerd/containerd/pkg/randutil/randutil.go new file mode 100644 index 000000000..f4b657d7d --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/pkg/randutil/randutil.go @@ -0,0 +1,48 @@ +/* + 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 randutil provides utilities for [cyrpto/rand]. +package randutil + +import ( + "crypto/rand" + "math" + "math/big" +) + +// Int63n is similar to [math/rand.Int63n] but uses [crypto/rand.Reader] under the hood. +func Int63n(n int64) int64 { + b, err := rand.Int(rand.Reader, big.NewInt(n)) + if err != nil { + panic(err) + } + return b.Int64() +} + +// Int63 is similar to [math/rand.Int63] but uses [crypto/rand.Reader] under the hood. +func Int63() int64 { + return Int63n(math.MaxInt64) +} + +// Intn is similar to [math/rand.Intn] but uses [crypto/rand.Reader] under the hood. +func Intn(n int) int { + return int(Int63n(int64(n))) +} + +// Int is similar to [math/rand.Int] but uses [crypto/rand.Reader] under the hood. +func Int() int { + return int(Int63()) +} diff --git a/tools/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go b/tools/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go index 4f8d7dd2d..c67f773d0 100644 --- a/tools/vendor/github.com/containerd/containerd/pkg/userns/userns_unsupported.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo.go b/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo.go index 046e0356d..8c600fc96 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go b/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_linux.go new file mode 100644 index 000000000..722d86c35 --- /dev/null +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go b/tools/vendor/github.com/containerd/containerd/platforms/cpuinfo_other.go new file mode 100644 index 000000000..fa5f19c42 --- /dev/null +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/database.go b/tools/vendor/github.com/containerd/containerd/platforms/database.go index dbe9957ca..2e26fd3b4 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/database.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go b/tools/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go index e249fe48d..72355ca85 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/defaults_darwin.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go b/tools/vendor/github.com/containerd/containerd/platforms/defaults_freebsd.go new file mode 100644 index 000000000..d3fe89e07 --- /dev/null +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/defaults_unix.go b/tools/vendor/github.com/containerd/containerd/platforms/defaults_unix.go index 49690f1b3..44acc47eb 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/defaults_unix.go +++ b/tools/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/tools/vendor/github.com/containerd/containerd/platforms/defaults_windows.go b/tools/vendor/github.com/containerd/containerd/platforms/defaults_windows.go index c1aaf72ca..fd5756516 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/defaults_windows.go +++ b/tools/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,25 +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 imagespec.Platform) bool { - if m.defaults.Match(p) { - // TODO(windows): Figure out whether OSVersion is deprecated. - return strings.HasPrefix(p.OSVersion, m.osVersionPrefix) +func (m windowsmatcher) Match(p specs.Platform) bool { + match := m.defaultMatcher.Match(p) + + 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) @@ -78,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/tools/vendor/github.com/containerd/containerd/platforms/platforms.go b/tools/vendor/github.com/containerd/containerd/platforms/platforms.go index 8f955d036..8dcde7db7 100644 --- a/tools/vendor/github.com/containerd/containerd/platforms/platforms.go +++ b/tools/vendor/github.com/containerd/containerd/platforms/platforms.go @@ -27,40 +27,40 @@ // The vast majority of use cases should simply use the match function with // user input. The first step is to parse a specifier into a matcher: // -// m, err := Parse("linux") -// if err != nil { ... } +// m, err := Parse("linux") +// if err != nil { ... } // // Once you have a matcher, use it to match against the platform declared by a // component, typically from an image or runtime. Since extracting an images // platform is a little more involved, we'll use an example against the // platform default: // -// if ok := m.Match(Default()); !ok { /* doesn't match */ } +// if ok := m.Match(Default()); !ok { /* doesn't match */ } // // This can be composed in loops for resolving runtimes or used as a filter for // fetch and select images. // // More details of the specifier syntax and platform spec follow. // -// Declaring Platform Support +// # Declaring Platform Support // // Components that have strict platform requirements should use the OCI // platform specification to declare their support. Typically, this will be // images and runtimes that should make these declaring which platform they // support specifically. This looks roughly as follows: // -// type Platform struct { -// Architecture string -// OS string -// Variant string -// } +// type Platform struct { +// Architecture string +// OS string +// Variant string +// } // // Most images and runtimes should at least set Architecture and OS, according // to their GOARCH and GOOS values, respectively (follow the OCI image // specification when in doubt). ARM should set variant under certain // discussions, which are outlined below. // -// Platform Specifiers +// # Platform Specifiers // // While the OCI platform specifications provide a tool for components to // specify structured information, user input typically doesn't need the full @@ -77,7 +77,7 @@ // where the architecture may be known but a runtime may support images from // different operating systems. // -// Normalization +// # Normalization // // Because not all users are familiar with the way the Go runtime represents // platforms, several normalizations have been provided to make this package @@ -85,17 +85,17 @@ // // The following are performed for architectures: // -// Value Normalized -// aarch64 arm64 -// armhf arm -// armel arm/v6 -// i386 386 -// x86_64 amd64 -// x86-64 amd64 +// Value Normalized +// aarch64 arm64 +// armhf arm +// armel arm/v6 +// i386 386 +// x86_64 amd64 +// x86-64 amd64 // // We also normalize the operating system `macos` to `darwin`. // -// ARM Support +// # ARM Support // // To qualify ARM architecture, the Variant field is used to qualify the arm // version. The most common arm version, v7, is represented without the variant @@ -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/tools/vendor/github.com/containerd/continuity/fs/copy_freebsd.go b/tools/vendor/github.com/containerd/containerd/platforms/platforms_other.go similarity index 67% rename from tools/vendor/github.com/containerd/continuity/fs/copy_freebsd.go rename to tools/vendor/github.com/containerd/containerd/platforms/platforms_other.go index 4aaf743e5..03f4dcd99 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy_freebsd.go +++ b/tools/vendor/github.com/containerd/containerd/platforms/platforms_other.go @@ -1,5 +1,4 @@ -//go:build freebsd -// +build freebsd +//go:build !windows /* Copyright The containerd Authors. @@ -17,20 +16,15 @@ limitations under the License. */ -package fs +package platforms import ( - "errors" - "os" - "syscall" - - "golang.org/x/sys/unix" + specs "github.com/opencontainers/image-spec/specs-go/v1" ) -func copyDevice(dst string, fi os.FileInfo) error { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return errors.New("unsupported stat type") +// NewMatcher returns the default Matcher for containerd +func newDefaultMatcher(platform specs.Platform) Matcher { + return &matcher{ + Platform: Normalize(platform), } - return unix.Mknod(dst, uint32(fi.Mode()), st.Rdev) } diff --git a/tools/vendor/github.com/containerd/containerd/platforms/platforms_windows.go b/tools/vendor/github.com/containerd/containerd/platforms/platforms_windows.go new file mode 100644 index 000000000..950e2a2dd --- /dev/null +++ b/tools/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/tools/vendor/github.com/containerd/containerd/protobuf/any.go b/tools/vendor/github.com/containerd/containerd/protobuf/any.go new file mode 100644 index 000000000..84da2a33d --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/protobuf/any.go @@ -0,0 +1,47 @@ +/* + 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 protobuf + +import ( + "github.com/containerd/typeurl/v2" + "google.golang.org/protobuf/types/known/anypb" +) + +// FromAny converts typeurl.Any to github.com/containerd/containerd/protobuf/types.Any. +func FromAny(from typeurl.Any) *anypb.Any { + if from == nil { + return nil + } + + if pbany, ok := from.(*anypb.Any); ok { + return pbany + } + + return &anypb.Any{ + TypeUrl: from.GetTypeUrl(), + Value: from.GetValue(), + } +} + +// FromAny converts an arbitrary interface to github.com/containerd/containerd/protobuf/types.Any. +func MarshalAnyToProto(from interface{}) (*anypb.Any, error) { + any, err := typeurl.MarshalAny(from) + if err != nil { + return nil, err + } + return FromAny(any), nil +} diff --git a/tools/vendor/github.com/containerd/containerd/sys/socket_windows.go b/tools/vendor/github.com/containerd/containerd/protobuf/compare.go similarity index 58% rename from tools/vendor/github.com/containerd/containerd/sys/socket_windows.go rename to tools/vendor/github.com/containerd/containerd/protobuf/compare.go index 1ae12bc51..602a4bcac 100644 --- a/tools/vendor/github.com/containerd/containerd/sys/socket_windows.go +++ b/tools/vendor/github.com/containerd/containerd/protobuf/compare.go @@ -14,17 +14,28 @@ limitations under the License. */ -package sys +package protobuf import ( - "net" - - "github.com/Microsoft/go-winio" + "github.com/google/go-cmp/cmp" + "google.golang.org/protobuf/proto" ) -// 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) -} +var Compare = cmp.FilterValues( + func(x, y interface{}) bool { + _, xok := x.(proto.Message) + _, yok := y.(proto.Message) + return xok && yok + }, + cmp.Comparer(func(x, y interface{}) bool { + vx, ok := x.(proto.Message) + if !ok { + return false + } + vy, ok := y.(proto.Message) + if !ok { + return false + } + return proto.Equal(vx, vy) + }), +) diff --git a/tools/vendor/github.com/containerd/containerd/protobuf/plugin/doc.go b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/doc.go new file mode 100644 index 000000000..401a6d5cc --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/doc.go @@ -0,0 +1,17 @@ +/* + 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 plugin diff --git a/tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.pb.go b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.pb.go new file mode 100644 index 000000000..1bab0c776 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.pb.go @@ -0,0 +1,144 @@ +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/containerd/protobuf/plugin/fieldpath.proto + +package plugin + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +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) +) + +var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63300, + Name: "containerd.plugin.fieldpath_all", + Tag: "varint,63300,opt,name=fieldpath_all", + Filename: "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64400, + Name: "containerd.plugin.fieldpath", + Tag: "varint,64400,opt,name=fieldpath", + Filename: "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // optional bool fieldpath_all = 63300; + E_FieldpathAll = &file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // optional bool fieldpath = 64400; + E_Fieldpath = &file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes[1] +) + +var File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto protoreflect.FileDescriptor + +var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc = []byte{ + 0x0a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x43, 0x0a, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 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, 0x18, 0xc4, 0xee, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x41, 0x6c, 0x6c, 0x3a, 0x3f, 0x0a, 0x09, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x12, 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, 0x18, 0x90, 0xf7, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x42, 0x32, 0x5a, + 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, +} + +var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes = []interface{}{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MessageOptions)(nil), // 1: google.protobuf.MessageOptions +} +var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs = []int32{ + 0, // 0: containerd.plugin.fieldpath_all:extendee -> google.protobuf.FileOptions + 1, // 1: containerd.plugin.fieldpath:extendee -> google.protobuf.MessageOptions + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 0, // [0:2] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_init() } +func file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_init() { + if File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 2, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes, + DependencyIndexes: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs, + ExtensionInfos: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes, + }.Build() + File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto = out.File + file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc = nil + file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes = nil + file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/gogo/protobuf/types/doc.go b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.proto similarity index 74% rename from tools/vendor/github.com/gogo/protobuf/types/doc.go rename to tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.proto index ff2810af1..de98dd899 100644 --- a/tools/vendor/github.com/gogo/protobuf/types/doc.go +++ b/tools/vendor/github.com/containerd/containerd/protobuf/plugin/fieldpath.proto @@ -1,7 +1,7 @@ -// Go support for Protocol Buffers - Google's data interchange format +// Protocol Buffers for Go with Gadgets // -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf +// 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 @@ -13,9 +13,6 @@ // 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 @@ -29,7 +26,17 @@ // (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 types contains code for interacting with well-known types. -*/ -package types +syntax = "proto2"; +package containerd.plugin; + +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/containerd/containerd/protobuf/plugin"; + +extend google.protobuf.FileOptions { + optional bool fieldpath_all = 63300; +} + +extend google.protobuf.MessageOptions { + optional bool fieldpath = 64400; +} diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_device_unix.go b/tools/vendor/github.com/containerd/containerd/protobuf/proto/proto.go similarity index 64% rename from tools/vendor/github.com/containerd/continuity/fs/copy_device_unix.go rename to tools/vendor/github.com/containerd/containerd/protobuf/proto/proto.go index f821890cb..6c5e7b75e 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy_device_unix.go +++ b/tools/vendor/github.com/containerd/containerd/protobuf/proto/proto.go @@ -1,6 +1,3 @@ -//go:build openbsd || solaris || netbsd -// +build openbsd solaris netbsd - /* Copyright The containerd Authors. @@ -17,20 +14,17 @@ limitations under the License. */ -package fs +// Package proto provides convinient aliases that make google.golang.org/protobuf migration easier. +package proto import ( - "errors" - "os" - "syscall" - - "golang.org/x/sys/unix" + google "google.golang.org/protobuf/proto" ) -func copyDevice(dst string, fi os.FileInfo) error { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return errors.New("unsupported stat type") - } - return unix.Mknod(dst, uint32(fi.Mode()), int(st.Rdev)) +func Marshal(input google.Message) ([]byte, error) { + return google.Marshal(input) +} + +func Unmarshal(input []byte, output google.Message) error { + return google.Unmarshal(input, output) } diff --git a/tools/vendor/github.com/containerd/containerd/protobuf/timestamp.go b/tools/vendor/github.com/containerd/containerd/protobuf/timestamp.go new file mode 100644 index 000000000..0615f823b --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/protobuf/timestamp.go @@ -0,0 +1,36 @@ +/* + 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 protobuf + +import ( + "time" + + "google.golang.org/protobuf/types/known/timestamppb" +) + +// Once we migrate off from gogo/protobuf, we can use the function below, which don't return any errors. +// https://github.com/protocolbuffers/protobuf-go/blob/v1.28.0/types/known/timestamppb/timestamp.pb.go#L200-L208 + +// ToTimestamp creates protobuf's Timestamp from time.Time. +func ToTimestamp(from time.Time) *timestamppb.Timestamp { + return timestamppb.New(from) +} + +// FromTimestamp creates time.Time from protobuf's Timestamp. +func FromTimestamp(from *timestamppb.Timestamp) time.Time { + return from.AsTime() +} diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_darwin.go b/tools/vendor/github.com/containerd/containerd/protobuf/types/types.go similarity index 63% rename from tools/vendor/github.com/containerd/continuity/fs/copy_darwin.go rename to tools/vendor/github.com/containerd/containerd/protobuf/types/types.go index ce55f0aa2..1a920a2f9 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy_darwin.go +++ b/tools/vendor/github.com/containerd/containerd/protobuf/types/types.go @@ -1,6 +1,3 @@ -//go:build darwin -// +build darwin - /* Copyright The containerd Authors. @@ -17,20 +14,15 @@ limitations under the License. */ -package fs +// Package types provides convinient aliases that make google.golang.org/protobuf migration easier. +package types import ( - "errors" - "os" - "syscall" - - "golang.org/x/sys/unix" + "google.golang.org/genproto/protobuf/field_mask" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/emptypb" ) -func copyDevice(dst string, fi os.FileInfo) error { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return errors.New("unsupported stat type") - } - return unix.Mknod(dst, uint32(fi.Mode()), int(st.Rdev)) -} +type Empty = emptypb.Empty +type Any = anypb.Any +type FieldMask = field_mask.FieldMask diff --git a/tools/vendor/github.com/containerd/containerd/reference/docker/helpers.go b/tools/vendor/github.com/containerd/containerd/reference/docker/helpers.go new file mode 100644 index 000000000..386025104 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/reference/docker/helpers.go @@ -0,0 +1,58 @@ +/* + 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 docker + +import "path" + +// IsNameOnly returns true if reference only contains a repo name. +func IsNameOnly(ref Named) bool { + if _, ok := ref.(NamedTagged); ok { + return false + } + if _, ok := ref.(Canonical); ok { + return false + } + return true +} + +// FamiliarName returns the familiar name string +// for the given named, familiarizing if needed. +func FamiliarName(ref Named) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().Name() + } + return ref.Name() +} + +// FamiliarString returns the familiar string representation +// for the given reference, familiarizing if needed. +func FamiliarString(ref Reference) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().String() + } + return ref.String() +} + +// FamiliarMatch reports whether ref matches the specified pattern. +// See https://godoc.org/path#Match for supported patterns. +func FamiliarMatch(pattern string, ref Reference) (bool, error) { + matched, err := path.Match(pattern, FamiliarString(ref)) + if namedRef, isNamed := ref.(Named); isNamed && !matched { + matched, _ = path.Match(pattern, FamiliarName(namedRef)) + } + return matched, err +} diff --git a/tools/vendor/github.com/containerd/containerd/reference/docker/normalize.go b/tools/vendor/github.com/containerd/containerd/reference/docker/normalize.go new file mode 100644 index 000000000..b299bf6c0 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/reference/docker/normalize.go @@ -0,0 +1,196 @@ +/* + 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 docker + +import ( + "fmt" + "strings" + + "github.com/opencontainers/go-digest" +) + +var ( + legacyDefaultDomain = "index.docker.io" + defaultDomain = "docker.io" + officialRepoName = "library" + defaultTag = "latest" +) + +// normalizedNamed represents a name which has been +// normalized and has a familiar form. A familiar name +// is what is used in Docker UI. An example normalized +// name is "docker.io/library/ubuntu" and corresponding +// familiar name of "ubuntu". +type normalizedNamed interface { + Named + Familiar() Named +} + +// ParseNormalizedNamed parses a string into a named reference +// transforming a familiar name from Docker UI to a fully +// qualified reference. If the value may be an identifier +// use ParseAnyReference. +func ParseNormalizedNamed(s string) (Named, error) { + if ok := anchoredIdentifierRegexp.MatchString(s); ok { + return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s) + } + domain, remainder := splitDockerDomain(s) + var remoteName string + if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 { + remoteName = remainder[:tagSep] + } else { + remoteName = remainder + } + if strings.ToLower(remoteName) != remoteName { + return nil, fmt.Errorf("invalid reference format: repository name (%s) must be lowercase", remoteName) + } + + ref, err := Parse(domain + "/" + remainder) + if err != nil { + return nil, err + } + named, isNamed := ref.(Named) + if !isNamed { + return nil, fmt.Errorf("reference %s has no name", ref.String()) + } + return named, nil +} + +// ParseDockerRef normalizes the image reference following the docker convention. This is added +// mainly for backward compatibility. +// The reference returned can only be either tagged or digested. For reference contains both tag +// and digest, the function returns digested reference, e.g. docker.io/library/busybox:latest@ +// sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa will be returned as +// docker.io/library/busybox@sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa. +func ParseDockerRef(ref string) (Named, error) { + named, err := ParseNormalizedNamed(ref) + if err != nil { + return nil, err + } + if _, ok := named.(NamedTagged); ok { + if canonical, ok := named.(Canonical); ok { + // The reference is both tagged and digested, only + // return digested. + newNamed, err := WithName(canonical.Name()) + if err != nil { + return nil, err + } + newCanonical, err := WithDigest(newNamed, canonical.Digest()) + if err != nil { + return nil, err + } + return newCanonical, nil + } + } + return TagNameOnly(named), nil +} + +// splitDockerDomain splits a repository name to domain and remotename string. +// If no valid domain is found, the default domain is used. Repository name +// needs to be already validated before. +func splitDockerDomain(name string) (domain, remainder string) { + i := strings.IndexRune(name, '/') + if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost" && strings.ToLower(name[:i]) == name[:i]) { + domain, remainder = defaultDomain, name + } else { + domain, remainder = name[:i], name[i+1:] + } + if domain == legacyDefaultDomain { + domain = defaultDomain + } + if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { + remainder = officialRepoName + "/" + remainder + } + return +} + +// familiarizeName returns a shortened version of the name familiar +// to the Docker UI. Familiar names have the default domain +// "docker.io" and "library/" repository prefix removed. +// For example, "docker.io/library/redis" will have the familiar +// name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp". +// Returns a familiarized named only reference. +func familiarizeName(named namedRepository) repository { + repo := repository{ + domain: named.Domain(), + path: named.Path(), + } + + if repo.domain == defaultDomain { + repo.domain = "" + // Handle official repositories which have the pattern "library/" + if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { + repo.path = split[1] + } + } + return repo +} + +func (r reference) Familiar() Named { + return reference{ + namedRepository: familiarizeName(r.namedRepository), + tag: r.tag, + digest: r.digest, + } +} + +func (r repository) Familiar() Named { + return familiarizeName(r) +} + +func (t taggedReference) Familiar() Named { + return taggedReference{ + namedRepository: familiarizeName(t.namedRepository), + tag: t.tag, + } +} + +func (c canonicalReference) Familiar() Named { + return canonicalReference{ + namedRepository: familiarizeName(c.namedRepository), + digest: c.digest, + } +} + +// TagNameOnly adds the default tag "latest" to a reference if it only has +// a repo name. +func TagNameOnly(ref Named) Named { + if IsNameOnly(ref) { + namedTagged, err := WithTag(ref, defaultTag) + if err != nil { + // Default tag must be valid, to create a NamedTagged + // type with non-validated input the WithTag function + // should be used instead + panic(err) + } + return namedTagged + } + return ref +} + +// ParseAnyReference parses a reference string as a possible identifier, +// full digest, or familiar name. +func ParseAnyReference(ref string) (Reference, error) { + if ok := anchoredIdentifierRegexp.MatchString(ref); ok { + return digestReference("sha256:" + ref), nil + } + if dgst, err := digest.Parse(ref); err == nil { + return digestReference(dgst), nil + } + + return ParseNormalizedNamed(ref) +} diff --git a/tools/vendor/github.com/containerd/containerd/reference/docker/reference.go b/tools/vendor/github.com/containerd/containerd/reference/docker/reference.go new file mode 100644 index 000000000..4dc00474e --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/reference/docker/reference.go @@ -0,0 +1,453 @@ +/* + 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 docker provides a general type to represent any way of referencing images within the registry. +// Its main purpose is to abstract tags and digests (content-addressable hash). +// +// Grammar +// +// reference := name [ ":" tag ] [ "@" digest ] +// name := [domain '/'] path-component ['/' path-component]* +// domain := host [':' port-number] +// host := domain-name | IPv4address | \[ IPv6address \] ; rfc3986 appendix-A +// domain-name := domain-component ['.' domain-component]* +// 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]+/ +// separator := /[_.]|__|[-]*/ +// +// tag := /[\w][\w.-]{0,127}/ +// +// digest := digest-algorithm ":" digest-hex +// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]* +// digest-algorithm-separator := /[+.-_]/ +// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/ +// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value +// +// identifier := /[a-f0-9]{64}/ +// short-identifier := /[a-f0-9]{6,64}/ +package docker + +import ( + "errors" + "fmt" + "strings" + + "github.com/opencontainers/go-digest" +) + +const ( + // NameTotalLengthMax is the maximum total number of characters in a repository name. + NameTotalLengthMax = 255 +) + +var ( + // ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference. + ErrReferenceInvalidFormat = errors.New("invalid reference format") + + // ErrTagInvalidFormat represents an error while trying to parse a string as a tag. + ErrTagInvalidFormat = errors.New("invalid tag format") + + // ErrDigestInvalidFormat represents an error while trying to parse a string as a tag. + ErrDigestInvalidFormat = errors.New("invalid digest format") + + // ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters. + ErrNameContainsUppercase = errors.New("repository name must be lowercase") + + // ErrNameEmpty is returned for empty, invalid repository names. + ErrNameEmpty = errors.New("repository name must have at least one component") + + // ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax. + ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax) + + // ErrNameNotCanonical is returned when a name is not canonical. + ErrNameNotCanonical = errors.New("repository name must be canonical") +) + +// Reference is an opaque object reference identifier that may include +// modifiers such as a hostname, name, tag, and digest. +type Reference interface { + // String returns the full reference + String() string +} + +// Field provides a wrapper type for resolving correct reference types when +// working with encoding. +type Field struct { + reference Reference +} + +// AsField wraps a reference in a Field for encoding. +func AsField(reference Reference) Field { + return Field{reference} +} + +// Reference unwraps the reference type from the field to +// return the Reference object. This object should be +// of the appropriate type to further check for different +// reference types. +func (f Field) Reference() Reference { + return f.reference +} + +// MarshalText serializes the field to byte text which +// is the string of the reference. +func (f Field) MarshalText() (p []byte, err error) { + return []byte(f.reference.String()), nil +} + +// UnmarshalText parses text bytes by invoking the +// reference parser to ensure the appropriately +// typed reference object is wrapped by field. +func (f *Field) UnmarshalText(p []byte) error { + r, err := Parse(string(p)) + if err != nil { + return err + } + + f.reference = r + return nil +} + +// Named is an object with a full name +type Named interface { + Reference + Name() string +} + +// Tagged is an object which has a tag +type Tagged interface { + Reference + Tag() string +} + +// NamedTagged is an object including a name and tag. +type NamedTagged interface { + Named + Tag() string +} + +// Digested is an object which has a digest +// in which it can be referenced by +type Digested interface { + Reference + Digest() digest.Digest +} + +// Canonical reference is an object with a fully unique +// name including a name with domain and digest +type Canonical interface { + Named + Digest() digest.Digest +} + +// namedRepository is a reference to a repository with a name. +// A namedRepository has both domain and path components. +type namedRepository interface { + Named + Domain() string + Path() string +} + +// Domain returns the domain part of the Named reference +func Domain(named Named) string { + if r, ok := named.(namedRepository); ok { + return r.Domain() + } + domain, _ := splitDomain(named.Name()) + return domain +} + +// Path returns the name without the domain part of the Named reference +func Path(named Named) (name string) { + if r, ok := named.(namedRepository); ok { + return r.Path() + } + _, path := splitDomain(named.Name()) + return path +} + +func splitDomain(name string) (string, string) { + match := anchoredNameRegexp.FindStringSubmatch(name) + if len(match) != 3 { + return "", name + } + return match[1], match[2] +} + +// SplitHostname splits a named reference into a +// hostname and name string. If no valid hostname is +// found, the hostname is empty and the full value +// is returned as name +// DEPRECATED: Use Domain or Path +func SplitHostname(named Named) (string, string) { + if r, ok := named.(namedRepository); ok { + return r.Domain(), r.Path() + } + return splitDomain(named.Name()) +} + +// Parse parses s and returns a syntactically valid Reference. +// If an error was encountered it is returned, along with a nil Reference. +// NOTE: Parse will not handle short digests. +func Parse(s string) (Reference, error) { + matches := ReferenceRegexp.FindStringSubmatch(s) + if matches == nil { + if s == "" { + return nil, ErrNameEmpty + } + if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil { + return nil, ErrNameContainsUppercase + } + return nil, ErrReferenceInvalidFormat + } + + if len(matches[1]) > NameTotalLengthMax { + return nil, ErrNameTooLong + } + + var repo repository + + nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1]) + if len(nameMatch) == 3 { + repo.domain = nameMatch[1] + repo.path = nameMatch[2] + } else { + repo.domain = "" + repo.path = matches[1] + } + + ref := reference{ + namedRepository: repo, + tag: matches[2], + } + if matches[3] != "" { + var err error + ref.digest, err = digest.Parse(matches[3]) + if err != nil { + return nil, err + } + } + + r := getBestReferenceType(ref) + if r == nil { + return nil, ErrNameEmpty + } + + return r, nil +} + +// ParseNamed parses s and returns a syntactically valid reference implementing +// the Named interface. The reference must have a name and be in the canonical +// form, otherwise an error is returned. +// If an error was encountered it is returned, along with a nil Reference. +// NOTE: ParseNamed will not handle short digests. +func ParseNamed(s string) (Named, error) { + named, err := ParseNormalizedNamed(s) + if err != nil { + return nil, err + } + if named.String() != s { + return nil, ErrNameNotCanonical + } + return named, nil +} + +// WithName returns a named object representing the given string. If the input +// is invalid ErrReferenceInvalidFormat will be returned. +func WithName(name string) (Named, error) { + if len(name) > NameTotalLengthMax { + return nil, ErrNameTooLong + } + + match := anchoredNameRegexp.FindStringSubmatch(name) + if match == nil || len(match) != 3 { + return nil, ErrReferenceInvalidFormat + } + return repository{ + domain: match[1], + path: match[2], + }, nil +} + +// WithTag combines the name from "name" and the tag from "tag" to form a +// reference incorporating both the name and the tag. +func WithTag(name Named, tag string) (NamedTagged, error) { + if !anchoredTagRegexp.MatchString(tag) { + return nil, ErrTagInvalidFormat + } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } + if canonical, ok := name.(Canonical); ok { + return reference{ + namedRepository: repo, + tag: tag, + digest: canonical.Digest(), + }, nil + } + return taggedReference{ + namedRepository: repo, + tag: tag, + }, nil +} + +// WithDigest combines the name from "name" and the digest from "digest" to form +// a reference incorporating both the name and the digest. +func WithDigest(name Named, digest digest.Digest) (Canonical, error) { + if !anchoredDigestRegexp.MatchString(digest.String()) { + return nil, ErrDigestInvalidFormat + } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } + if tagged, ok := name.(Tagged); ok { + return reference{ + namedRepository: repo, + tag: tagged.Tag(), + digest: digest, + }, nil + } + return canonicalReference{ + namedRepository: repo, + digest: digest, + }, nil +} + +// TrimNamed removes any tag or digest from the named reference. +func TrimNamed(ref Named) Named { + repo := repository{} + if r, ok := ref.(namedRepository); ok { + repo.domain, repo.path = r.Domain(), r.Path() + } else { + repo.domain, repo.path = splitDomain(ref.Name()) + } + return repo +} + +func getBestReferenceType(ref reference) Reference { + if ref.Name() == "" { + // Allow digest only references + if ref.digest != "" { + return digestReference(ref.digest) + } + return nil + } + if ref.tag == "" { + if ref.digest != "" { + return canonicalReference{ + namedRepository: ref.namedRepository, + digest: ref.digest, + } + } + return ref.namedRepository + } + if ref.digest == "" { + return taggedReference{ + namedRepository: ref.namedRepository, + tag: ref.tag, + } + } + + return ref +} + +type reference struct { + namedRepository + tag string + digest digest.Digest +} + +func (r reference) String() string { + return r.Name() + ":" + r.tag + "@" + r.digest.String() +} + +func (r reference) Tag() string { + return r.tag +} + +func (r reference) Digest() digest.Digest { + return r.digest +} + +type repository struct { + domain string + path string +} + +func (r repository) String() string { + return r.Name() +} + +func (r repository) Name() string { + if r.domain == "" { + return r.path + } + return r.domain + "/" + r.path +} + +func (r repository) Domain() string { + return r.domain +} + +func (r repository) Path() string { + return r.path +} + +type digestReference digest.Digest + +func (d digestReference) String() string { + return digest.Digest(d).String() +} + +func (d digestReference) Digest() digest.Digest { + return digest.Digest(d) +} + +type taggedReference struct { + namedRepository + tag string +} + +func (t taggedReference) String() string { + return t.Name() + ":" + t.tag +} + +func (t taggedReference) Tag() string { + return t.tag +} + +type canonicalReference struct { + namedRepository + digest digest.Digest +} + +func (c canonicalReference) String() string { + return c.Name() + "@" + c.digest.String() +} + +func (c canonicalReference) Digest() digest.Digest { + return c.digest +} diff --git a/tools/vendor/github.com/containerd/containerd/reference/docker/regexp.go b/tools/vendor/github.com/containerd/containerd/reference/docker/regexp.go new file mode 100644 index 000000000..4be3c575e --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/reference/docker/regexp.go @@ -0,0 +1,191 @@ +/* + 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 docker + +import "regexp" + +var ( + // alphaNumeric defines the alpha numeric atom, typically a + // component of names. This only allows lower case characters and digits. + alphaNumeric = `[a-z0-9]+` + + // separator defines the separators allowed to be embedded in name + // components. This allow one period, one or two underscore and multiple + // dashes. Repeated dashes and underscores are intentionally treated + // differently. In order to support valid hostnames as name components, + // supporting repeated dash was added. Additionally double underscore is + // now allowed as a separator to loosen the restriction for previously + // supported names. + separator = `(?:[._]|__|[-]*)` + + // nameComponent restricts registry path component names to start + // with at least one letter or number, with following parts able to be + // separated by one period, one or two underscore and multiple dashes. + nameComponent = expression( + alphaNumeric, + optional(repeated(separator, alphaNumeric))) + + // domainNameComponent restricts the registry domain component of a + // repository name to start with a component as defined by DomainRegexp. + domainNameComponent = `(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])` + + // ipv6address are enclosed between square brackets and may be represented + // in many ways, see rfc5952. Only IPv6 in compressed or uncompressed format + // are allowed, IPv6 zone identifiers (rfc6874) or Special addresses such as + // IPv4-Mapped are deliberately excluded. + ipv6address = expression( + literal(`[`), `(?:[a-fA-F0-9:]+)`, literal(`]`), + ) + + // domainName defines the structure of potential domain components + // that may be part of image names. This is purposely a subset of what is + // allowed by DNS to ensure backwards compatibility with Docker image + // names. This includes IPv4 addresses on decimal format. + domainName = expression( + domainNameComponent, + optional(repeated(literal(`.`), domainNameComponent)), + ) + + // host defines the structure of potential domains based on the URI + // Host subcomponent on rfc3986. It may be a subset of DNS domain name, + // or an IPv4 address in decimal format, or an IPv6 address between square + // brackets (excluding zone identifiers as defined by rfc6874 or special + // addresses such as IPv4-Mapped). + host = `(?:` + domainName + `|` + ipv6address + `)` + + // allowed by the URI Host subcomponent on rfc3986 to ensure backwards + // compatibility with Docker image names. + domain = expression( + host, + optional(literal(`:`), `[0-9]+`)) + + // DomainRegexp defines the structure of potential domain components + // that may be part of image names. This is purposely a subset of what is + // allowed by DNS to ensure backwards compatibility with Docker image + // names. + DomainRegexp = regexp.MustCompile(domain) + + tag = `[\w][\w.-]{0,127}` + // TagRegexp matches valid tag names. From docker/docker:graph/tags.go. + TagRegexp = regexp.MustCompile(tag) + + anchoredTag = anchored(tag) + // anchoredTagRegexp matches valid tag names, anchored at the start and + // end of the matched string. + anchoredTagRegexp = regexp.MustCompile(anchoredTag) + + digestPat = `[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}` + // DigestRegexp matches valid digests. + DigestRegexp = regexp.MustCompile(digestPat) + + anchoredDigest = anchored(digestPat) + // anchoredDigestRegexp matches valid digests, anchored at the start and + // end of the matched string. + anchoredDigestRegexp = regexp.MustCompile(anchoredDigest) + + namePat = expression( + optional(domain, literal(`/`)), + nameComponent, + optional(repeated(literal(`/`), nameComponent))) + // NameRegexp is the format for the name component of references. The + // regexp has capturing groups for the domain and name part omitting + // the separating forward slash from either. + NameRegexp = regexp.MustCompile(namePat) + + anchoredName = anchored( + optional(capture(domain), literal(`/`)), + capture(nameComponent, + optional(repeated(literal(`/`), nameComponent)))) + // anchoredNameRegexp is used to parse a name value, capturing the + // domain and trailing components. + anchoredNameRegexp = regexp.MustCompile(anchoredName) + + referencePat = anchored(capture(namePat), + optional(literal(":"), capture(tag)), + optional(literal("@"), capture(digestPat))) + // ReferenceRegexp is the full supported format of a reference. The regexp + // is anchored and has capturing groups for name, tag, and digest + // components. + ReferenceRegexp = regexp.MustCompile(referencePat) + + identifier = `([a-f0-9]{64})` + // IdentifierRegexp is the format for string identifier used as a + // content addressable identifier using sha256. These identifiers + // are like digests without the algorithm, since sha256 is used. + IdentifierRegexp = regexp.MustCompile(identifier) + + shortIdentifier = `([a-f0-9]{6,64})` + // ShortIdentifierRegexp is the format used to represent a prefix + // of an identifier. A prefix may be used to match a sha256 identifier + // within a list of trusted identifiers. + ShortIdentifierRegexp = regexp.MustCompile(shortIdentifier) + + anchoredIdentifier = anchored(identifier) + // anchoredIdentifierRegexp is used to check or match an + // identifier value, anchored at start and end of string. + anchoredIdentifierRegexp = regexp.MustCompile(anchoredIdentifier) +) + +// literal compiles s into a literal regular expression, escaping any regexp +// reserved characters. +func literal(s string) string { + re := regexp.MustCompile(regexp.QuoteMeta(s)) + + if _, complete := re.LiteralPrefix(); !complete { + panic("must be a literal") + } + + return re.String() +} + +// expression defines a full expression, where each regular expression must +// follow the previous. +func expression(res ...string) string { + var s string + for _, re := range res { + s += re + } + + return s +} + +// optional wraps the expression in a non-capturing group and makes the +// production optional. +func optional(res ...string) string { + return group(expression(res...)) + `?` +} + +// repeated wraps the regexp in a non-capturing group to get one or more +// matches. +func repeated(res ...string) string { + return group(expression(res...)) + `+` +} + +// group wraps the regexp in a non-capturing group. +func group(res ...string) string { + return `(?:` + expression(res...) + `)` +} + +// capture wraps the expression in a capturing group. +func capture(res ...string) string { + return `(` + expression(res...) + `)` +} + +// anchored anchors the regular expression by adding start and end delimiters. +func anchored(res ...string) string { + return `^` + expression(res...) + `$` +} diff --git a/tools/vendor/github.com/containerd/containerd/reference/docker/sort.go b/tools/vendor/github.com/containerd/containerd/reference/docker/sort.go new file mode 100644 index 000000000..984e37528 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/reference/docker/sort.go @@ -0,0 +1,73 @@ +/* + 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 docker + +import ( + "sort" +) + +// Sort sorts string references preferring higher information references +// The precedence is as follows: +// 1. Name + Tag + Digest +// 2. Name + Tag +// 3. Name + Digest +// 4. Name +// 5. Digest +// 6. Parse error +func Sort(references []string) []string { + var prefs []Reference + var bad []string + + for _, ref := range references { + pref, err := ParseAnyReference(ref) + if err != nil { + bad = append(bad, ref) + } else { + prefs = append(prefs, pref) + } + } + sort.Slice(prefs, func(a, b int) bool { + ar := refRank(prefs[a]) + br := refRank(prefs[b]) + if ar == br { + return prefs[a].String() < prefs[b].String() + } + return ar < br + }) + sort.Strings(bad) + var refs []string + for _, pref := range prefs { + refs = append(refs, pref.String()) + } + return append(refs, bad...) +} + +func refRank(ref Reference) uint8 { + if _, ok := ref.(Named); ok { + if _, ok = ref.(Tagged); ok { + if _, ok = ref.(Digested); ok { + return 1 + } + return 2 + } + if _, ok = ref.(Digested); ok { + return 3 + } + return 4 + } + return 5 +} diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go index c259873d2..64c6a38f9 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go @@ -29,7 +29,6 @@ import ( "github.com/containerd/containerd/log" remoteserrors "github.com/containerd/containerd/remotes/errors" "github.com/containerd/containerd/version" - "golang.org/x/net/context/ctxhttp" ) var ( @@ -115,7 +114,7 @@ func FetchTokenWithOAuth(ctx context.Context, client *http.Client, headers http. form.Set("access_type", "offline") } - req, err := http.NewRequest("POST", to.Realm, strings.NewReader(form.Encode())) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, to.Realm, strings.NewReader(form.Encode())) if err != nil { return nil, err } @@ -127,7 +126,7 @@ func FetchTokenWithOAuth(ctx context.Context, client *http.Client, headers http. req.Header.Set("User-Agent", "containerd/"+version.Version) } - resp, err := ctxhttp.Do(ctx, client, req) + resp, err := client.Do(req) if err != nil { return nil, err } @@ -162,7 +161,7 @@ type FetchTokenResponse struct { // FetchToken fetches a token using a GET request func FetchToken(ctx context.Context, client *http.Client, headers http.Header, to TokenOptions) (*FetchTokenResponse, error) { - req, err := http.NewRequest("GET", to.Realm, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, to.Realm, nil) if err != nil { return nil, err } @@ -194,7 +193,7 @@ func FetchToken(ctx context.Context, client *http.Client, headers http.Header, t req.URL.RawQuery = reqParams.Encode() - resp, err := ctxhttp.Do(ctx, client, req) + resp, err := client.Do(req) if err != nil { return nil, err } diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go index eaa0e5dbd..8fc823144 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go @@ -29,7 +29,6 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/remotes/docker/auth" remoteerrors "github.com/containerd/containerd/remotes/errors" - "github.com/sirupsen/logrus" ) type dockerAuthorizer struct { @@ -45,13 +44,6 @@ type dockerAuthorizer struct { onFetchRefreshToken OnFetchRefreshToken } -// NewAuthorizer creates a Docker authorizer using the provided function to -// get credentials for the token server or basic auth. -// Deprecated: Use NewDockerAuthorizer -func NewAuthorizer(client *http.Client, f func(string) (string, string, error)) Authorizer { - return NewDockerAuthorizer(WithAuthClient(client), WithAuthCreds(f)) -} - type authorizerConfig struct { credentials func(string) (string, string, error) client *http.Client @@ -319,7 +311,7 @@ func (ah *authHandler) doBearerAuth(ctx context.Context) (token, refreshToken st } return resp.Token, resp.RefreshToken, nil } - log.G(ctx).WithFields(logrus.Fields{ + log.G(ctx).WithFields(log.Fields{ "status": errStatus.Status, "body": string(errStatus.Body), }).Debugf("token request failed") diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/converter_fuzz.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/converter_fuzz.go new file mode 100644 index 000000000..908205392 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/converter_fuzz.go @@ -0,0 +1,55 @@ +//go:build gofuzz + +/* + 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 docker + +import ( + "context" + "os" + + fuzz "github.com/AdaLogics/go-fuzz-headers" + "github.com/containerd/containerd/content/local" + "github.com/containerd/containerd/log" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/sirupsen/logrus" +) + +func FuzzConvertManifest(data []byte) int { + ctx := context.Background() + + // Do not log the message below + // level=warning msg="do nothing for media type: ..." + log.G(ctx).Logger.SetLevel(logrus.PanicLevel) + + f := fuzz.NewConsumer(data) + desc := ocispec.Descriptor{} + err := f.GenerateStruct(&desc) + if err != nil { + return 0 + } + tmpdir, err := os.MkdirTemp("", "fuzzing-") + if err != nil { + return 0 + } + cs, err := local.NewStore(tmpdir) + if err != nil { + return 0 + } + _, _ = ConvertManifest(ctx, cs, desc) + return 1 +} diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher.go index 11a75356e..ecf245933 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher.go @@ -29,6 +29,7 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" "github.com/containerd/containerd/log" + digest "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -52,18 +53,17 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R return newHTTPReadSeeker(desc.Size, func(offset int64) (io.ReadCloser, error) { // firstly try fetch via external urls for _, us := range desc.URLs { - ctx = log.WithLogger(ctx, log.G(ctx).WithField("url", us)) - u, err := url.Parse(us) if err != nil { - log.G(ctx).WithError(err).Debug("failed to parse") + log.G(ctx).WithError(err).Debugf("failed to parse %q", us) continue } if u.Scheme != "http" && u.Scheme != "https" { log.G(ctx).Debug("non-http(s) alternative url is unsupported") continue } - log.G(ctx).Debug("trying alternative url") + ctx = log.WithLogger(ctx, log.G(ctx).WithField("url", u)) + log.G(ctx).Info("request") // Try this first, parse it host := RegistryHost{ @@ -151,8 +151,106 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R }) } +func (r dockerFetcher) createGetReq(ctx context.Context, host RegistryHost, ps ...string) (*request, int64, error) { + headReq := r.request(host, http.MethodHead, ps...) + if err := headReq.addNamespace(r.refspec.Hostname()); err != nil { + return nil, 0, err + } + + headResp, err := headReq.doWithRetries(ctx, nil) + if err != nil { + return nil, 0, err + } + if headResp.Body != nil { + headResp.Body.Close() + } + if headResp.StatusCode > 299 { + return nil, 0, fmt.Errorf("unexpected HEAD status code %v: %s", headReq.String(), headResp.Status) + } + + getReq := r.request(host, http.MethodGet, ps...) + if err := getReq.addNamespace(r.refspec.Hostname()); err != nil { + return nil, 0, err + } + return getReq, headResp.ContentLength, nil +} + +func (r dockerFetcher) FetchByDigest(ctx context.Context, dgst digest.Digest) (io.ReadCloser, ocispec.Descriptor, error) { + var desc ocispec.Descriptor + ctx = log.WithLogger(ctx, log.G(ctx).WithField("digest", dgst)) + + hosts := r.filterHosts(HostCapabilityPull) + if len(hosts) == 0 { + return nil, desc, fmt.Errorf("no pull hosts: %w", errdefs.ErrNotFound) + } + + ctx, err := ContextWithRepositoryScope(ctx, r.refspec, false) + if err != nil { + return nil, desc, err + } + + var ( + getReq *request + sz int64 + firstErr error + ) + + for _, host := range r.hosts { + getReq, sz, err = r.createGetReq(ctx, host, "blobs", dgst.String()) + if err == nil { + break + } + // Store the error for referencing later + if firstErr == nil { + firstErr = err + } + } + + if getReq == nil { + // Fall back to the "manifests" endpoint + for _, host := range r.hosts { + getReq, sz, err = r.createGetReq(ctx, host, "manifests", dgst.String()) + if err == nil { + break + } + // Store the error for referencing later + if firstErr == nil { + firstErr = err + } + } + } + + if getReq == nil { + if errdefs.IsNotFound(firstErr) { + firstErr = fmt.Errorf("could not fetch content %v from remote: %w", dgst, errdefs.ErrNotFound) + } + if firstErr == nil { + firstErr = fmt.Errorf("could not fetch content %v from remote: (unknown)", dgst) + } + return nil, desc, firstErr + } + + seeker, err := newHTTPReadSeeker(sz, func(offset int64) (io.ReadCloser, error) { + return r.open(ctx, getReq, "", offset) + }) + if err != nil { + return nil, desc, err + } + + desc = ocispec.Descriptor{ + MediaType: "application/octet-stream", + Digest: dgst, + Size: sz, + } + return seeker, desc, nil +} + func (r dockerFetcher) open(ctx context.Context, req *request, mediatype string, offset int64) (_ io.ReadCloser, retErr error) { - req.header.Set("Accept", strings.Join([]string{mediatype, `*/*`}, ", ")) + if mediatype == "" { + req.header.Set("Accept", "*/*") + } else { + req.header.Set("Accept", strings.Join([]string{mediatype, `*/*`}, ", ")) + } if offset > 0 { // Note: "Accept-Ranges: bytes" cannot be trusted as some endpoints diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher_fuzz.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher_fuzz.go new file mode 100644 index 000000000..b98886c59 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/fetcher_fuzz.go @@ -0,0 +1,81 @@ +//go:build gofuzz + +/* + 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 docker + +import ( + "context" + "fmt" + "io" + "net/http" + "net/http/httptest" + "net/url" + + refDocker "github.com/containerd/containerd/reference/docker" +) + +func FuzzFetcher(data []byte) int { + dataLen := len(data) + if dataLen == 0 { + return -1 + } + + s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + rw.Header().Set("content-range", fmt.Sprintf("bytes %d-%d/%d", 0, dataLen-1, dataLen)) + rw.Header().Set("content-length", fmt.Sprintf("%d", dataLen)) + rw.Write(data) + })) + defer s.Close() + + u, err := url.Parse(s.URL) + if err != nil { + return 0 + } + + f := dockerFetcher{&dockerBase{ + repository: "nonempty", + }} + host := RegistryHost{ + Client: s.Client(), + Host: u.Host, + Scheme: u.Scheme, + Path: u.Path, + } + + ctx := context.Background() + req := f.request(host, http.MethodGet) + rc, err := f.open(ctx, req, "", 0) + if err != nil { + return 0 + } + b, err := io.ReadAll(rc) + if err != nil { + return 0 + } + + expected := data + if len(b) != len(expected) { + panic("len of request is not equal to len of expected but should be") + } + return 1 +} + +func FuzzParseDockerRef(data []byte) int { + _, _ = refDocker.ParseDockerRef(string(data)) + return 1 +} diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/handler.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/handler.go index 529cfbc27..27638ccc0 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/handler.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/handler.go @@ -30,11 +30,6 @@ import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) -var ( - // labelDistributionSource describes the source blob comes from. - labelDistributionSource = "containerd.io/distribution.source" -) - // AppendDistributionSourceLabel updates the label of blob with distribution source. func AppendDistributionSourceLabel(manager content.Manager, ref string) (images.HandlerFunc, error) { refspec, err := reference.Parse(ref) @@ -108,7 +103,7 @@ func appendDistributionSourceLabel(originLabel, repo string) string { } func distributionSourceLabelKey(source string) string { - return fmt.Sprintf("%s.%s", labelDistributionSource, source) + return fmt.Sprintf("%s.%s", labels.LabelDistributionSource, source) } // selectRepositoryMountCandidate will select the repo which has longest diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/pusher.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/pusher.go index c786ad215..ef6e8056a 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/pusher.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/pusher.go @@ -24,6 +24,7 @@ import ( "net/http" "net/url" "strings" + "sync" "time" "github.com/containerd/containerd/content" @@ -190,6 +191,9 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str if resp == nil { resp, err = req.doWithRetries(ctx, nil) if err != nil { + if errors.Is(err, ErrInvalidAuthorization) { + return nil, fmt.Errorf("push access denied, repository does not exist or may require authorization: %w", err) + } return nil, err } } @@ -261,27 +265,20 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str // TODO: Support chunked upload - pr, pw := io.Pipe() - respC := make(chan response, 1) - body := io.NopCloser(pr) + pushw := newPushWriter(p.dockerBase, ref, desc.Digest, p.tracker, isManifest) req.body = func() (io.ReadCloser, error) { - if body == nil { - return nil, errors.New("cannot reuse body, request must be retried") - } - // Only use the body once since pipe cannot be seeked - ob := body - body = nil - return ob, nil + pr, pw := io.Pipe() + pushw.setPipe(pw) + return io.NopCloser(pr), nil } req.size = desc.Size go func() { - defer close(respC) resp, err := req.doWithRetries(ctx, nil) if err != nil { - respC <- response{err: err} - pr.CloseWithError(err) + pushw.setError(err) + pushw.Close() return } @@ -290,20 +287,13 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str default: err := remoteserrors.NewUnexpectedStatusErr(resp) log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response") - pr.CloseWithError(err) + pushw.setError(err) + pushw.Close() } - respC <- response{Response: resp} + pushw.setResponse(resp) }() - return &pushWriter{ - base: p.dockerBase, - ref: ref, - pipe: pw, - responseC: respC, - isManifest: isManifest, - expected: desc.Digest, - tracker: p.tracker, - }, nil + return pushw, nil } func getManifestPath(object string, dgst digest.Digest) []string { @@ -325,29 +315,89 @@ func getManifestPath(object string, dgst digest.Digest) []string { return []string{"manifests", object} } -type response struct { - *http.Response - err error -} - type pushWriter struct { base *dockerBase ref string - pipe *io.PipeWriter - responseC <-chan response + pipe *io.PipeWriter + + pipeC chan *io.PipeWriter + respC chan *http.Response + closeOnce sync.Once + errC chan error + isManifest bool expected digest.Digest tracker StatusTracker } +func newPushWriter(db *dockerBase, ref string, expected digest.Digest, tracker StatusTracker, isManifest bool) *pushWriter { + // Initialize and create response + return &pushWriter{ + base: db, + ref: ref, + expected: expected, + tracker: tracker, + pipeC: make(chan *io.PipeWriter, 1), + respC: make(chan *http.Response, 1), + errC: make(chan error, 1), + isManifest: isManifest, + } +} + +func (pw *pushWriter) setPipe(p *io.PipeWriter) { + pw.pipeC <- p +} + +func (pw *pushWriter) setError(err error) { + pw.errC <- err +} +func (pw *pushWriter) setResponse(resp *http.Response) { + pw.respC <- resp +} + func (pw *pushWriter) Write(p []byte) (n int, err error) { status, err := pw.tracker.GetStatus(pw.ref) if err != nil { return n, err } + + if pw.pipe == nil { + p, ok := <-pw.pipeC + if !ok { + return 0, io.ErrClosedPipe + } + pw.pipe = p + } else { + select { + case p, ok := <-pw.pipeC: + if !ok { + return 0, io.ErrClosedPipe + } + pw.pipe.CloseWithError(content.ErrReset) + pw.pipe = p + + // If content has already been written, the bytes + // cannot be written and the caller must reset + status.Offset = 0 + status.UpdatedAt = time.Now() + pw.tracker.SetStatus(pw.ref, status) + return 0, content.ErrReset + default: + } + } + n, err = pw.pipe.Write(p) + if errors.Is(err, io.ErrClosedPipe) { + // if the pipe is closed, we might have the original error on the error + // channel - so we should try and get it + select { + case err2 := <-pw.errC: + err = err2 + default: + } + } status.Offset += int64(n) status.UpdatedAt = time.Now() pw.tracker.SetStatus(pw.ref, status) @@ -355,13 +405,21 @@ func (pw *pushWriter) Write(p []byte) (n int, err error) { } func (pw *pushWriter) Close() error { - status, err := pw.tracker.GetStatus(pw.ref) - if err == nil && !status.Committed { - // Closing an incomplete writer. Record this as an error so that following write can retry it. - status.ErrClosed = errors.New("closed incomplete writer") - pw.tracker.SetStatus(pw.ref, status) + // Ensure pipeC is closed but handle `Close()` being + // called multiple times without panicking + pw.closeOnce.Do(func() { + close(pw.pipeC) + }) + if pw.pipe != nil { + status, err := pw.tracker.GetStatus(pw.ref) + if err == nil && !status.Committed { + // Closing an incomplete writer. Record this as an error so that following write can retry it. + status.ErrClosed = errors.New("closed incomplete writer") + pw.tracker.SetStatus(pw.ref, status) + } + return pw.pipe.Close() } - return pw.pipe.Close() + return nil } func (pw *pushWriter) Status() (content.Status, error) { @@ -380,7 +438,7 @@ func (pw *pushWriter) Digest() digest.Digest { func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt) error { // Check whether read has already thrown an error - if _, err := pw.pipe.Write([]byte{}); err != nil && err != io.ErrClosedPipe { + if _, err := pw.pipe.Write([]byte{}); err != nil && !errors.Is(err, io.ErrClosedPipe) { return fmt.Errorf("pipe error before commit: %w", err) } @@ -388,18 +446,40 @@ func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Di return err } // TODO: timeout waiting for response - resp := <-pw.responseC - if resp.err != nil { - return resp.err + var resp *http.Response + select { + case err := <-pw.errC: + return err + case resp = <-pw.respC: + defer resp.Body.Close() + case p, ok := <-pw.pipeC: + // check whether the pipe has changed in the commit, because sometimes Write + // can complete successfully, but the pipe may have changed. In that case, the + // content needs to be reset. + if !ok { + return io.ErrClosedPipe + } + pw.pipe.CloseWithError(content.ErrReset) + pw.pipe = p + + // If content has already been written, the bytes + // cannot be written again and the caller must reset + status, err := pw.tracker.GetStatus(pw.ref) + if err != nil { + return err + } + status.Offset = 0 + status.UpdatedAt = time.Now() + pw.tracker.SetStatus(pw.ref, status) + return content.ErrReset } - defer resp.Response.Body.Close() // 201 is specified return status, some registries return // 200, 202 or 204. switch resp.StatusCode { case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: default: - return remoteserrors.NewUnexpectedStatusErr(resp.Response) + return remoteserrors.NewUnexpectedStatusErr(resp) } status, err := pw.tracker.GetStatus(pw.ref) diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/resolver.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/resolver.go index 9bbbc2622..48737413b 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/resolver.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/resolver.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "net" "net/http" "net/url" "path" @@ -31,12 +32,12 @@ import ( "github.com/containerd/containerd/log" "github.com/containerd/containerd/reference" "github.com/containerd/containerd/remotes" - "github.com/containerd/containerd/remotes/docker/schema1" + "github.com/containerd/containerd/remotes/docker/schema1" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. + remoteerrors "github.com/containerd/containerd/remotes/errors" + "github.com/containerd/containerd/tracing" "github.com/containerd/containerd/version" - digest "github.com/opencontainers/go-digest" + "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/sirupsen/logrus" - "golang.org/x/net/context/ctxhttp" ) var ( @@ -69,6 +70,9 @@ type Authorizer interface { // unmodified. It may also add an `Authorization` header as // "bearer " // "basic " + // + // It may return remotes/errors.ErrUnexpectedStatus, which for example, + // can be used by the caller to find out the status code returned by the registry. Authorize(context.Context, *http.Request) error // AddResponses adds a 401 response for the authorizer to consider when @@ -151,7 +155,8 @@ func NewResolver(options ResolverOptions) remotes.Resolver { images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageManifest, - ocispec.MediaTypeImageIndex, "*/*"}, ", ")) + ocispec.MediaTypeImageIndex, "*/*", + }, ", ")) } else { resolveHeader["Accept"] = options.Headers["Accept"] delete(options.Headers, "Accept") @@ -298,11 +303,11 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp if resp.StatusCode > 399 { // Set firstErr when encountering the first non-404 status code. if firstErr == nil { - firstErr = fmt.Errorf("pulling from host %s failed with status code %v: %v", host.Host, u, resp.Status) + firstErr = remoteerrors.NewUnexpectedStatusErr(resp) } continue // try another host } - return "", ocispec.Descriptor{}, fmt.Errorf("pulling from host %s failed with unexpected status code %v: %v", host.Host, u, resp.Status) + return "", ocispec.Descriptor{}, remoteerrors.NewUnexpectedStatusErr(resp) } size := resp.ContentLength contentType := getManifestMediaType(resp) @@ -339,26 +344,31 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp if err != nil { return "", ocispec.Descriptor{}, err } - defer resp.Body.Close() bodyReader := countingReader{reader: resp.Body} contentType = getManifestMediaType(resp) - if dgst == "" { + err = func() error { + defer resp.Body.Close() + if dgst != "" { + _, err = io.Copy(io.Discard, &bodyReader) + return err + } + if contentType == images.MediaTypeDockerSchema1Manifest { b, err := schema1.ReadStripSignature(&bodyReader) if err != nil { - return "", ocispec.Descriptor{}, err + return err } dgst = digest.FromBytes(b) - } else { - dgst, err = digest.FromReader(&bodyReader) - if err != nil { - return "", ocispec.Descriptor{}, err - } + return nil } - } else if _, err := io.Copy(io.Discard, &bodyReader); err != nil { + + dgst, err = digest.FromReader(&bodyReader) + return err + }() + if err != nil { return "", ocispec.Descriptor{}, err } size = bodyReader.bytesRead @@ -524,7 +534,7 @@ type request struct { func (r *request) do(ctx context.Context) (*http.Response, error) { u := r.host.Scheme + "://" + r.host.Host + r.path - req, err := http.NewRequest(r.method, u, nil) + req, err := http.NewRequestWithContext(ctx, r.method, u, nil) if err != nil { return nil, err } @@ -550,7 +560,7 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { return nil, fmt.Errorf("failed to authorize: %w", err) } - var client = &http.Client{} + client := &http.Client{} if r.host.Client != nil { *client = *r.host.Client } @@ -565,11 +575,18 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { return nil } } - - resp, err := ctxhttp.Do(ctx, client, req) + _, httpSpan := tracing.StartSpan( + ctx, + tracing.Name("remotes.docker.resolver", "HTTPRequest"), + tracing.WithHTTPRequest(req), + ) + defer httpSpan.End() + resp, err := client.Do(req) if err != nil { + httpSpan.SetStatus(err) return nil, fmt.Errorf("failed to do request: %w", err) } + httpSpan.SetAttributes(tracing.HTTPStatusCodeAttributes(resp.StatusCode)...) log.G(ctx).WithFields(responseFields(resp)).Debug("fetch response received") return resp, nil } @@ -629,7 +646,7 @@ func (r *request) String() string { return r.host.Scheme + "://" + r.host.Host + r.path } -func requestFields(req *http.Request) logrus.Fields { +func requestFields(req *http.Request) log.Fields { fields := map[string]interface{}{ "request.method": req.Method, } @@ -647,10 +664,10 @@ func requestFields(req *http.Request) logrus.Fields { } } - return logrus.Fields(fields) + return log.Fields(fields) } -func responseFields(resp *http.Response) logrus.Fields { +func responseFields(resp *http.Response) log.Fields { fields := map[string]interface{}{ "response.status": resp.Status, } @@ -665,5 +682,19 @@ func responseFields(resp *http.Response) logrus.Fields { } } - return logrus.Fields(fields) + return log.Fields(fields) +} + +// IsLocalhost checks if the registry host is local. +func IsLocalhost(host string) bool { + if h, _, err := net.SplitHostPort(host); err == nil { + host = h + } + + if host == "localhost" { + return true + } + + ip := net.ParseIP(host) + return ip.IsLoopback() } diff --git a/tools/vendor/github.com/containerd/containerd/remotes/docker/schema1/converter.go b/tools/vendor/github.com/containerd/containerd/remotes/docker/schema1/converter.go index efa4e8d6e..8c9e520cd 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/docker/schema1/converter.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/docker/schema1/converter.go @@ -14,6 +14,9 @@ limitations under the License. */ +// Package schema1 provides a converter to fetch an image formatted in Docker Image Manifest v2, Schema 1. +// +// Deprecated: use images formatted in Docker Image Manifest v2, Schema 2, or OCI Image Spec v1. package schema1 import ( @@ -33,6 +36,7 @@ import ( "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + "github.com/containerd/containerd/labels" "github.com/containerd/containerd/log" "github.com/containerd/containerd/remotes" digest "github.com/opencontainers/go-digest" @@ -363,12 +367,12 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro cinfo := content.Info{ Digest: desc.Digest, Labels: map[string]string{ - "containerd.io/uncompressed": state.diffID.String(), + labels.LabelUncompressed: state.diffID.String(), labelDockerSchema1EmptyLayer: strconv.FormatBool(state.empty), }, } - if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed", fmt.Sprintf("labels.%s", labelDockerSchema1EmptyLayer)); err != nil { + if _, err := c.contentStore.Update(ctx, cinfo, "labels."+labels.LabelUncompressed, fmt.Sprintf("labels.%s", labelDockerSchema1EmptyLayer)); err != nil { return fmt.Errorf("failed to update uncompressed label: %w", err) } @@ -387,7 +391,7 @@ func (c *Converter) reuseLabelBlobState(ctx context.Context, desc ocispec.Descri } desc.Size = cinfo.Size - diffID, ok := cinfo.Labels["containerd.io/uncompressed"] + diffID, ok := cinfo.Labels[labels.LabelUncompressed] if !ok { return false, nil } @@ -406,7 +410,7 @@ func (c *Converter) reuseLabelBlobState(ctx context.Context, desc ocispec.Descri bState := blobState{empty: isEmpty} if bState.diffID, err = digest.Parse(diffID); err != nil { - log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label containerd.io/uncompressed: %v", diffID) + log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label %s: %v", labels.LabelUncompressed, diffID) return false, nil } diff --git a/tools/vendor/github.com/containerd/containerd/remotes/errors/errors.go b/tools/vendor/github.com/containerd/containerd/remotes/errors/errors.go index 67ccb23df..f60ff0fc2 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/errors/errors.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/errors/errors.go @@ -33,7 +33,7 @@ type ErrUnexpectedStatus struct { } func (e ErrUnexpectedStatus) Error() string { - return fmt.Sprintf("unexpected status: %s", e.Status) + return fmt.Sprintf("unexpected status from %s request to %s: %s", e.RequestMethod, e.RequestURL, e.Status) } // NewUnexpectedStatusErr creates an ErrUnexpectedStatus from HTTP response diff --git a/tools/vendor/github.com/containerd/containerd/remotes/handlers.go b/tools/vendor/github.com/containerd/containerd/remotes/handlers.go index 8bcafb22a..31de55516 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/handlers.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/handlers.go @@ -17,6 +17,7 @@ package remotes import ( + "bytes" "context" "errors" "fmt" @@ -27,10 +28,10 @@ import ( "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + "github.com/containerd/containerd/labels" "github.com/containerd/containerd/log" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/sirupsen/logrus" "golang.org/x/sync/semaphore" ) @@ -90,7 +91,7 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string { // recursive fetch. func FetchHandler(ingester content.Ingester, fetcher Fetcher) images.HandlerFunc { return func(ctx context.Context, desc ocispec.Descriptor) (subdescs []ocispec.Descriptor, err error) { - ctx = log.WithLogger(ctx, log.G(ctx).WithFields(logrus.Fields{ + ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{ "digest": desc.Digest, "mediatype": desc.MediaType, "size": desc.Size, @@ -100,20 +101,21 @@ func FetchHandler(ingester content.Ingester, fetcher Fetcher) images.HandlerFunc case images.MediaTypeDockerSchema1Manifest: return nil, fmt.Errorf("%v not supported", desc.MediaType) default: - err := fetch(ctx, ingester, fetcher, desc) + err := Fetch(ctx, ingester, fetcher, desc) + if errdefs.IsAlreadyExists(err) { + return nil, nil + } return nil, err } } } -func fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc ocispec.Descriptor) error { +// Fetch fetches the given digest into the provided ingester +func Fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc ocispec.Descriptor) error { log.G(ctx).Debug("fetch") cw, err := content.OpenWriter(ctx, ingester, content.WithRef(MakeRefKey(ctx, desc)), content.WithDescriptor(desc)) if err != nil { - if errdefs.IsAlreadyExists(err) { - return nil - } return err } defer cw.Close() @@ -135,7 +137,11 @@ func fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc if err != nil && !errdefs.IsAlreadyExists(err) { return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err) } - return nil + return err + } + + if desc.Size == int64(len(desc.Data)) { + return content.Copy(ctx, cw, bytes.NewReader(desc.Data), desc.Size, desc.Digest) } rc, err := fetcher.Fetch(ctx, desc) @@ -151,7 +157,7 @@ func fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc // using a writer from the pusher. func PushHandler(pusher Pusher, provider content.Provider) images.HandlerFunc { return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { - ctx = log.WithLogger(ctx, log.G(ctx).WithFields(logrus.Fields{ + ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{ "digest": desc.Digest, "mediatype": desc.MediaType, "size": desc.Size, @@ -197,17 +203,25 @@ func push(ctx context.Context, provider content.Provider, pusher Pusher, desc oc // // Base handlers can be provided which will be called before any push specific // handlers. -func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, store content.Store, limiter *semaphore.Weighted, platform platforms.MatchComparer, wrapper func(h images.Handler) images.Handler) error { +// +// If the passed in content.Provider is also a content.Manager then this will +// also annotate the distribution sources in the manager. +func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, store content.Provider, limiter *semaphore.Weighted, platform platforms.MatchComparer, wrapper func(h images.Handler) images.Handler) error { var m sync.Mutex - manifestStack := []ocispec.Descriptor{} + manifests := []ocispec.Descriptor{} + indexStack := []ocispec.Descriptor{} filterHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { switch desc.MediaType { - case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest, - images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: + case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: m.Lock() - manifestStack = append(manifestStack, desc) + manifests = append(manifests, desc) + m.Unlock() + return nil, images.ErrStopHandler + case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: + m.Lock() + indexStack = append(indexStack, desc) m.Unlock() return nil, images.ErrStopHandler default: @@ -219,13 +233,14 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st platformFilterhandler := images.FilterPlatforms(images.ChildrenHandler(store), platform) - annotateHandler := annotateDistributionSourceHandler(platformFilterhandler, store) + var handler images.Handler + if m, ok := store.(content.Manager); ok { + annotateHandler := annotateDistributionSourceHandler(platformFilterhandler, m) + handler = images.Handlers(annotateHandler, filterHandler, pushHandler) + } else { + handler = images.Handlers(platformFilterhandler, filterHandler, pushHandler) + } - var handler images.Handler = images.Handlers( - annotateHandler, - filterHandler, - pushHandler, - ) if wrapper != nil { handler = wrapper(handler) } @@ -234,16 +249,18 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st return err } + if err := images.Dispatch(ctx, pushHandler, limiter, manifests...); err != nil { + return err + } + // Iterate in reverse order as seen, parent always uploaded after child - for i := len(manifestStack) - 1; i >= 0; i-- { - _, err := pushHandler(ctx, manifestStack[i]) + for i := len(indexStack) - 1; i >= 0; i-- { + err := images.Dispatch(ctx, pushHandler, limiter, indexStack[i]) if err != nil { // TODO(estesp): until we have a more complete method for index push, we need to report // missing dependencies in an index/manifest list by sensing the "400 Bad Request" // as a marker for this problem - if (manifestStack[i].MediaType == ocispec.MediaTypeImageIndex || - manifestStack[i].MediaType == images.MediaTypeDockerSchema2ManifestList) && - errors.Unwrap(err) != nil && strings.Contains(errors.Unwrap(err).Error(), "400 Bad Request") { + if errors.Unwrap(err) != nil && strings.Contains(errors.Unwrap(err).Error(), "400 Bad Request") { return fmt.Errorf("manifest list/index references to blobs and/or manifests are missing in your target registry: %w", err) } return err @@ -257,8 +274,8 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st // An example of this kind of content would be a Windows base layer, which is not supposed to be redistributed. // // This is based on the media type of the content: -// - application/vnd.oci.image.layer.nondistributable -// - application/vnd.docker.image.rootfs.foreign +// - application/vnd.oci.image.layer.nondistributable +// - application/vnd.docker.image.rootfs.foreign func SkipNonDistributableBlobs(f images.HandlerFunc) images.HandlerFunc { return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { if images.IsNonDistributable(desc.MediaType) { @@ -351,7 +368,7 @@ func annotateDistributionSourceHandler(f images.HandlerFunc, manager content.Man } for k, v := range info.Labels { - if !strings.HasPrefix(k, "containerd.io/distribution.source.") { + if !strings.HasPrefix(k, labels.LabelDistributionSource+".") { continue } diff --git a/tools/vendor/github.com/containerd/containerd/remotes/resolver.go b/tools/vendor/github.com/containerd/containerd/remotes/resolver.go index 624b14f05..f200c84bc 100644 --- a/tools/vendor/github.com/containerd/containerd/remotes/resolver.go +++ b/tools/vendor/github.com/containerd/containerd/remotes/resolver.go @@ -21,6 +21,7 @@ import ( "io" "github.com/containerd/containerd/content" + "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -33,7 +34,7 @@ type Resolver interface { // reference a specific host or be matched against a specific handler. // // The returned name should be used to identify the referenced entity. - // Dependending on the remote namespace, this may be immutable or mutable. + // Depending on the remote namespace, this may be immutable or mutable. // While the name may differ from ref, it should itself be a valid ref. // // If the resolution fails, an error will be returned. @@ -50,12 +51,23 @@ type Resolver interface { Pusher(ctx context.Context, ref string) (Pusher, error) } -// Fetcher fetches content +// Fetcher fetches content. +// A fetcher implementation may implement the FetcherByDigest interface too. type Fetcher interface { // Fetch the resource identified by the descriptor. Fetch(ctx context.Context, desc ocispec.Descriptor) (io.ReadCloser, error) } +// FetcherByDigest fetches content by the digest. +type FetcherByDigest interface { + // FetchByDigest fetches the resource identified by the digest. + // + // FetcherByDigest usually returns an incomplete descriptor. + // Typically, the media type is always set to "application/octet-stream", + // and the annotations are unset. + FetchByDigest(ctx context.Context, dgst digest.Digest) (io.ReadCloser, ocispec.Descriptor, error) +} + // Pusher pushes content type Pusher interface { // Push returns a content writer for the given resource identified diff --git a/tools/vendor/github.com/containerd/containerd/sandbox/bridge.go b/tools/vendor/github.com/containerd/containerd/sandbox/bridge.go new file mode 100644 index 000000000..bc7d999ce --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/sandbox/bridge.go @@ -0,0 +1,77 @@ +/* + 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 sandbox + +import ( + "context" + "fmt" + + "github.com/containerd/ttrpc" + "google.golang.org/grpc" + + api "github.com/containerd/containerd/api/runtime/sandbox/v1" +) + +// NewClient returns a new sandbox client that handles both GRPC and TTRPC clients. +func NewClient(client interface{}) (api.TTRPCSandboxService, error) { + switch c := client.(type) { + case *ttrpc.Client: + return api.NewTTRPCSandboxClient(c), nil + case grpc.ClientConnInterface: + return &grpcBridge{api.NewSandboxClient(c)}, nil + default: + return nil, fmt.Errorf("unsupported client type %T", client) + } +} + +type grpcBridge struct { + client api.SandboxClient +} + +var _ api.TTRPCSandboxService = (*grpcBridge)(nil) + +func (g *grpcBridge) CreateSandbox(ctx context.Context, request *api.CreateSandboxRequest) (*api.CreateSandboxResponse, error) { + return g.client.CreateSandbox(ctx, request) +} + +func (g *grpcBridge) StartSandbox(ctx context.Context, request *api.StartSandboxRequest) (*api.StartSandboxResponse, error) { + return g.client.StartSandbox(ctx, request) +} + +func (g *grpcBridge) Platform(ctx context.Context, request *api.PlatformRequest) (*api.PlatformResponse, error) { + return g.client.Platform(ctx, request) +} + +func (g *grpcBridge) StopSandbox(ctx context.Context, request *api.StopSandboxRequest) (*api.StopSandboxResponse, error) { + return g.client.StopSandbox(ctx, request) +} + +func (g *grpcBridge) WaitSandbox(ctx context.Context, request *api.WaitSandboxRequest) (*api.WaitSandboxResponse, error) { + return g.client.WaitSandbox(ctx, request) +} + +func (g *grpcBridge) SandboxStatus(ctx context.Context, request *api.SandboxStatusRequest) (*api.SandboxStatusResponse, error) { + return g.client.SandboxStatus(ctx, request) +} + +func (g *grpcBridge) PingSandbox(ctx context.Context, request *api.PingRequest) (*api.PingResponse, error) { + return g.client.PingSandbox(ctx, request) +} + +func (g *grpcBridge) ShutdownSandbox(ctx context.Context, request *api.ShutdownSandboxRequest) (*api.ShutdownSandboxResponse, error) { + return g.client.ShutdownSandbox(ctx, request) +} diff --git a/tools/vendor/github.com/containerd/containerd/sandbox/controller.go b/tools/vendor/github.com/containerd/containerd/sandbox/controller.go new file mode 100644 index 000000000..b74f82c10 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/sandbox/controller.go @@ -0,0 +1,125 @@ +/* + 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 sandbox + +import ( + "context" + "fmt" + "time" + + "github.com/containerd/containerd/api/types" + "github.com/containerd/containerd/platforms" + "github.com/containerd/typeurl/v2" +) + +type CreateOptions struct { + Rootfs []*types.Mount + // Options are used to pass arbitrary options to the shim when creating a new sandbox. + // CRI will use this to pass PodSandboxConfig. + // Don't confuse this with Runtime options, which are passed at shim instance start + // to setup global shim configuration. + Options typeurl.Any + NetNSPath string +} + +type CreateOpt func(*CreateOptions) error + +// WithRootFS is used to create a sandbox with the provided rootfs mount +// TODO: Switch to mount.Mount once target added +func WithRootFS(m []*types.Mount) CreateOpt { + return func(co *CreateOptions) error { + co.Rootfs = m + return nil + } +} + +// WithOptions allows passing arbitrary options when creating a new sandbox. +func WithOptions(options any) CreateOpt { + return func(co *CreateOptions) error { + var err error + co.Options, err = typeurl.MarshalAny(options) + if err != nil { + return fmt.Errorf("failed to marshal sandbox options: %w", err) + } + + return nil + } +} + +// WithNetNSPath used to assign network namespace path of a sandbox. +func WithNetNSPath(netNSPath string) CreateOpt { + return func(co *CreateOptions) error { + co.NetNSPath = netNSPath + return nil + } +} + +type StopOptions struct { + Timeout *time.Duration +} + +type StopOpt func(*StopOptions) + +func WithTimeout(timeout time.Duration) StopOpt { + return func(so *StopOptions) { + so.Timeout = &timeout + } +} + +// Controller is an interface to manage sandboxes at runtime. +// When running in sandbox mode, shim expected to implement `SandboxService`. +// Shim lifetimes are now managed manually via sandbox API by the containerd's client. +type Controller interface { + // Create is used to initialize sandbox environment. (mounts, any) + Create(ctx context.Context, sandboxID string, opts ...CreateOpt) error + // Start will start previously created sandbox. + Start(ctx context.Context, sandboxID string) (ControllerInstance, error) + // Platform returns target sandbox OS that will be used by Controller. + // containerd will rely on this to generate proper OCI spec. + Platform(_ctx context.Context, _sandboxID string) (platforms.Platform, error) + // Stop will stop sandbox instance + Stop(ctx context.Context, sandboxID string, opts ...StopOpt) error + // Wait blocks until sandbox process exits. + Wait(ctx context.Context, sandboxID string) (ExitStatus, error) + // Status will query sandbox process status. It is heavier than Ping call and must be used whenever you need to + // gather metadata about current sandbox state (status, uptime, resource use, etc). + Status(ctx context.Context, sandboxID string, verbose bool) (ControllerStatus, error) + // Shutdown deletes and cleans all tasks and sandbox instance. + Shutdown(ctx context.Context, sandboxID string) error +} + +type ControllerInstance struct { + SandboxID string + Pid uint32 + CreatedAt time.Time + Labels map[string]string +} + +type ExitStatus struct { + ExitStatus uint32 + ExitedAt time.Time +} + +type ControllerStatus struct { + SandboxID string + Pid uint32 + State string + Info map[string]string + CreatedAt time.Time + ExitedAt time.Time + Extra typeurl.Any +} diff --git a/tools/vendor/github.com/containerd/containerd/sandbox/helpers.go b/tools/vendor/github.com/containerd/containerd/sandbox/helpers.go new file mode 100644 index 000000000..bfe0b23d3 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/sandbox/helpers.go @@ -0,0 +1,68 @@ +/* + 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 sandbox + +import ( + "github.com/containerd/containerd/api/types" + "github.com/containerd/containerd/protobuf" + gogo_types "github.com/containerd/containerd/protobuf/types" + "github.com/containerd/typeurl/v2" +) + +// ToProto will map Sandbox struct to it's protobuf definition +func ToProto(sandbox *Sandbox) *types.Sandbox { + extensions := make(map[string]*gogo_types.Any) + for k, v := range sandbox.Extensions { + extensions[k] = protobuf.FromAny(v) + } + return &types.Sandbox{ + SandboxID: sandbox.ID, + Runtime: &types.Sandbox_Runtime{ + Name: sandbox.Runtime.Name, + Options: protobuf.FromAny(sandbox.Runtime.Options), + }, + Labels: sandbox.Labels, + CreatedAt: protobuf.ToTimestamp(sandbox.CreatedAt), + UpdatedAt: protobuf.ToTimestamp(sandbox.UpdatedAt), + Extensions: extensions, + Spec: protobuf.FromAny(sandbox.Spec), + } +} + +// FromProto map protobuf sandbox definition to Sandbox struct +func FromProto(sandboxpb *types.Sandbox) Sandbox { + runtime := RuntimeOpts{ + Name: sandboxpb.Runtime.Name, + Options: sandboxpb.Runtime.Options, + } + + extensions := make(map[string]typeurl.Any) + for k, v := range sandboxpb.Extensions { + v := v + extensions[k] = v + } + + return Sandbox{ + ID: sandboxpb.SandboxID, + Labels: sandboxpb.Labels, + Runtime: runtime, + Spec: sandboxpb.Spec, + CreatedAt: protobuf.FromTimestamp(sandboxpb.CreatedAt), + UpdatedAt: protobuf.FromTimestamp(sandboxpb.UpdatedAt), + Extensions: extensions, + } +} diff --git a/tools/vendor/github.com/containerd/containerd/sandbox/store.go b/tools/vendor/github.com/containerd/containerd/sandbox/store.go new file mode 100644 index 000000000..cda646dde --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/sandbox/store.go @@ -0,0 +1,116 @@ +/* + 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 sandbox + +import ( + "context" + "fmt" + "time" + + "github.com/containerd/containerd/errdefs" + "github.com/containerd/typeurl/v2" +) + +// Sandbox is an object stored in metadata database +type Sandbox struct { + // ID uniquely identifies the sandbox in a namespace + ID string + // Labels provide metadata extension for a sandbox + Labels map[string]string + // Runtime shim to use for this sandbox + Runtime RuntimeOpts + // Spec carries the runtime specification used to implement the sandbox + Spec typeurl.Any + // CreatedAt is the time at which the sandbox was created + CreatedAt time.Time + // UpdatedAt is the time at which the sandbox was updated + UpdatedAt time.Time + // Extensions stores client-specified metadata + Extensions map[string]typeurl.Any +} + +// RuntimeOpts holds runtime specific information +type RuntimeOpts struct { + Name string + Options typeurl.Any +} + +// Store is a storage interface for sandbox metadata objects +type Store interface { + // Create a sandbox record in the store + Create(ctx context.Context, sandbox Sandbox) (Sandbox, error) + + // Update the sandbox with the provided sandbox object and fields + Update(ctx context.Context, sandbox Sandbox, fieldpaths ...string) (Sandbox, error) + + // Get sandbox metadata using the id + Get(ctx context.Context, id string) (Sandbox, error) + + // List returns sandboxes that match one or more of the provided filters + List(ctx context.Context, filters ...string) ([]Sandbox, error) + + // Delete a sandbox from metadata store using the id + Delete(ctx context.Context, id string) error +} + +// AddExtension is a helper function to add sandbox metadata extension. +func (s *Sandbox) AddExtension(name string, obj interface{}) error { + if s.Extensions == nil { + s.Extensions = map[string]typeurl.Any{} + } + + out, err := typeurl.MarshalAny(obj) + if err != nil { + return fmt.Errorf("failed to marshal sandbox extension %q: %w", name, err) + } + + s.Extensions[name] = out + return nil +} + +// AddLabel adds a label to sandbox's labels. +func (s *Sandbox) AddLabel(name string, value string) { + if s.Labels == nil { + s.Labels = map[string]string{} + } + + s.Labels[name] = value +} + +// GetExtension retrieves a sandbox extension by name. +func (s *Sandbox) GetExtension(name string, obj interface{}) error { + out, ok := s.Extensions[name] + if !ok { + return errdefs.ErrNotFound + } + + if err := typeurl.UnmarshalTo(out, obj); err != nil { + return fmt.Errorf("failed to unmarshal sandbox extension %q: %w", name, err) + } + + return nil +} + +// GetLabel retrieves a sandbox label by name. +func (s *Sandbox) GetLabel(name string) (string, error) { + out, ok := s.Labels[name] + if !ok { + return "", fmt.Errorf("unable to find label %q in sandbox metadata: %w", name, errdefs.ErrNotFound) + } + + return out, nil +} diff --git a/tools/vendor/github.com/containerd/containerd/snapshots/snapshotter.go b/tools/vendor/github.com/containerd/containerd/snapshots/snapshotter.go index 8b0ea85e6..5fa5aa530 100644 --- a/tools/vendor/github.com/containerd/containerd/snapshots/snapshotter.go +++ b/tools/vendor/github.com/containerd/containerd/snapshots/snapshotter.go @@ -33,6 +33,11 @@ const ( UnpackKeyFormat = UnpackKeyPrefix + "-%s %s" inheritedLabelsPrefix = "containerd.io/snapshot/" labelSnapshotRef = "containerd.io/snapshot.ref" + + // LabelSnapshotUIDMapping is the label used for UID mappings + LabelSnapshotUIDMapping = "containerd.io/snapshot/uidmapping" + // LabelSnapshotGIDMapping is the label used for GID mappings + LabelSnapshotGIDMapping = "containerd.io/snapshot/gidmapping" ) // Kind identifies the kind of snapshot. @@ -94,7 +99,7 @@ func (k *Kind) UnmarshalJSON(b []byte) error { } // Info provides information about a particular snapshot. -// JSON marshallability is supported for interactive with tools like ctr, +// JSON marshalling is supported for interacting with tools like ctr, type Info struct { Kind Kind // active or committed snapshot Name string // name or key of snapshot @@ -102,8 +107,8 @@ type Info struct { // Labels for a snapshot. // - // Note: only labels prefixed with `containerd.io/snapshot/` will be inherited by the - // snapshotter's `Prepare`, `View`, or `Commit` calls. + // Note: only labels prefixed with `containerd.io/snapshot/` will be inherited + // by the snapshotter's `Prepare`, `View`, or `Commit` calls. Labels map[string]string `json:",omitempty"` Created time.Time `json:",omitempty"` // Created time Updated time.Time `json:",omitempty"` // Last update time @@ -122,7 +127,7 @@ type Usage struct { func (u *Usage) Add(other Usage) { u.Size += other.Size - // TODO(stevvooe): assumes independent inodes, but provides and upper + // TODO(stevvooe): assumes independent inodes, but provides an upper // bound. This should be pretty close, assuming the inodes for a // snapshot are roughly unique to it. Don't trust this assumption. u.Inodes += other.Inodes @@ -153,10 +158,10 @@ type WalkFunc func(context.Context, Info) error // For consistency, we define the following terms to be used throughout this // interface for snapshotter implementations: // -// `ctx` - refers to a context.Context -// `key` - refers to an active snapshot -// `name` - refers to a committed snapshot -// `parent` - refers to the parent in relation +// `ctx` - refers to a context.Context +// `key` - refers to an active snapshot +// `name` - refers to a committed snapshot +// `parent` - refers to the parent in relation // // Most methods take various combinations of these identifiers. Typically, // `name` and `parent` will be used in cases where a method *only* takes @@ -165,19 +170,18 @@ type WalkFunc func(context.Context, Info) error // same key space. For example, an active snapshot may not share the same key // with a committed snapshot. // -// We cover several examples below to demonstrate the utility of a snapshot -// snapshotter. +// We cover several examples below to demonstrate the utility of the snapshotter. // -// Importing a Layer +// # Importing a Layer // -// To import a layer, we simply have the Snapshotter provide a list of +// To import a layer, we simply have the snapshotter provide a list of // mounts to be applied such that our dst will capture a changeset. We start // out by getting a path to the layer tar file and creating a temp location to // unpack it to: // // layerPath, tmpDir := getLayerPath(), mkTmpDir() // just a path to layer tar file. // -// We start by using a Snapshotter to Prepare a new snapshot transaction, using a +// We start by using the snapshotter to Prepare a new snapshot transaction, using a // key and descending from the empty parent "". To prevent our layer from being // garbage collected during unpacking, we add the `containerd.io/gc.root` label: // @@ -185,9 +189,9 @@ type WalkFunc func(context.Context, Info) error // "containerd.io/gc.root": time.Now().UTC().Format(time.RFC3339), // }) // mounts, err := snapshotter.Prepare(ctx, key, "", noGcOpt) -// if err != nil { ... } +// if err != nil { ... } // -// We get back a list of mounts from Snapshotter.Prepare, with the key identifying +// We get back a list of mounts from snapshotter.Prepare(), with the key identifying // the active snapshot. Mount this to the temporary location with the // following: // @@ -202,10 +206,10 @@ type WalkFunc func(context.Context, Info) error // // layer, err := os.Open(layerPath) // if err != nil { ... } -// digest, err := unpackLayer(tmpLocation, layer) // unpack into layer location -// if err != nil { ... } +// digest, err := unpackLayer(tmpLocation, layer) // unpack into layer location +// if err != nil { ... } // -// When the above completes, we should have a filesystem the represents the +// When the above completes, we should have a filesystem that represents the // contents of the layer. Careful implementations should verify that digest // matches the expected DiffID. When completed, we unmount the mounts: // @@ -218,36 +222,36 @@ type WalkFunc func(context.Context, Info) error // // if err := snapshotter.Commit(ctx, digest.String(), key, noGcOpt); err != nil { ... } // -// Now, we have a layer in the Snapshotter that can be accessed with the digest +// Now, we have a layer in the snapshotter that can be accessed with the digest // provided during commit. // -// Importing the Next Layer +// # Importing the Next Layer // // Making a layer depend on the above is identical to the process described // above except that the parent is provided as parent when calling -// Manager.Prepare, assuming a clean, unique key identifier: +// snapshotter.Prepare(), assuming a clean, unique key identifier: // -// mounts, err := snapshotter.Prepare(ctx, key, parentDigest, noGcOpt) +// mounts, err := snapshotter.Prepare(ctx, key, parentDigest, noGcOpt) // // We then mount, apply and commit, as we did above. The new snapshot will be // based on the content of the previous one. // -// Running a Container +// # Running a Container // -// To run a container, we simply provide Snapshotter.Prepare the committed image +// To run a container, we simply provide snapshotter.Prepare() the committed image // snapshot as the parent. After mounting, the prepared path can // be used directly as the container's filesystem: // -// mounts, err := snapshotter.Prepare(ctx, containerKey, imageRootFSChainID) +// mounts, err := snapshotter.Prepare(ctx, containerKey, imageRootFSChainID) // // The returned mounts can then be passed directly to the container runtime. If -// one would like to create a new image from the filesystem, Manager.Commit is +// one would like to create a new image from the filesystem, snapshotter.Commit() is // called: // -// if err := snapshotter.Commit(ctx, newImageSnapshot, containerKey); err != nil { ... } +// if err := snapshotter.Commit(ctx, newImageSnapshot, containerKey); err != nil { ... } // -// Alternatively, for most container runs, Snapshotter.Remove will be called to -// signal the Snapshotter to abandon the changes. +// Alternatively, for most container runs, snapshotter.Remove() will be called to +// signal the snapshotter to abandon the changes. type Snapshotter interface { // Stat returns the info for an active or committed snapshot by name or // key. @@ -267,12 +271,12 @@ type Snapshotter interface { // The running time of this call for active snapshots is dependent on // implementation, but may be proportional to the size of the resource. // Callers should take this into consideration. Implementations should - // attempt to honer context cancellation and avoid taking locks when making + // attempt to honor context cancellation and avoid taking locks when making // the calculation. Usage(ctx context.Context, key string) (Usage, error) // Mounts returns the mounts for the active snapshot transaction identified - // by key. Can be called on an read-write or readonly transaction. This is + // by key. Can be called on a read-write or readonly transaction. This is // available only for active snapshots. // // This can be used to recover mounts after calling View or Prepare. @@ -298,7 +302,7 @@ type Snapshotter interface { // committed back to the snapshot snapshotter. View returns a readonly view on // the parent, with the active snapshot being tracked by the given key. // - // This method operates identically to Prepare, except that Mounts returned + // This method operates identically to Prepare, except the mounts returned // may have the readonly flag set. Any modifications to the underlying // filesystem will be ignored. Implementations may perform this in a more // efficient manner that differs from what would be attempted with diff --git a/tools/vendor/github.com/containerd/containerd/sys/epoll.go b/tools/vendor/github.com/containerd/containerd/sys/epoll.go deleted file mode 100644 index 73a57013f..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/sys/filesys_unix.go b/tools/vendor/github.com/containerd/containerd/sys/filesys_unix.go deleted file mode 100644 index 805a7a736..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/sys/filesys_windows.go b/tools/vendor/github.com/containerd/containerd/sys/filesys_windows.go deleted file mode 100644 index 87ebacc20..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/sys/oom_linux.go b/tools/vendor/github.com/containerd/containerd/sys/oom_linux.go deleted file mode 100644 index bb2a3eafb..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/sys/oom_unsupported.go b/tools/vendor/github.com/containerd/containerd/sys/oom_unsupported.go deleted file mode 100644 index fa0db5a10..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/sys/socket_unix.go b/tools/vendor/github.com/containerd/containerd/sys/socket_unix.go deleted file mode 100644 index 367e19cad..000000000 --- a/tools/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/tools/vendor/github.com/containerd/containerd/tracing/helpers.go b/tools/vendor/github.com/containerd/containerd/tracing/helpers.go new file mode 100644 index 000000000..981da6c79 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/tracing/helpers.go @@ -0,0 +1,94 @@ +/* + 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 tracing + +import ( + "encoding/json" + "fmt" + "strings" + + "go.opentelemetry.io/otel/attribute" +) + +const ( + spanDelimiter = "." +) + +func makeSpanName(names ...string) string { + return strings.Join(names, spanDelimiter) +} + +func any(k string, v interface{}) attribute.KeyValue { + if v == nil { + return attribute.String(k, "") + } + + switch typed := v.(type) { + case bool: + return attribute.Bool(k, typed) + case []bool: + return attribute.BoolSlice(k, typed) + case int: + return attribute.Int(k, typed) + case []int: + return attribute.IntSlice(k, typed) + case int8: + return attribute.Int(k, int(typed)) + case []int8: + ls := make([]int, 0, len(typed)) + for _, i := range typed { + ls = append(ls, int(i)) + } + return attribute.IntSlice(k, ls) + case int16: + return attribute.Int(k, int(typed)) + case []int16: + ls := make([]int, 0, len(typed)) + for _, i := range typed { + ls = append(ls, int(i)) + } + return attribute.IntSlice(k, ls) + case int32: + return attribute.Int64(k, int64(typed)) + case []int32: + ls := make([]int64, 0, len(typed)) + for _, i := range typed { + ls = append(ls, int64(i)) + } + return attribute.Int64Slice(k, ls) + case int64: + return attribute.Int64(k, typed) + case []int64: + return attribute.Int64Slice(k, typed) + case float64: + return attribute.Float64(k, typed) + case []float64: + return attribute.Float64Slice(k, typed) + case string: + return attribute.String(k, typed) + case []string: + return attribute.StringSlice(k, typed) + } + + if stringer, ok := v.(fmt.Stringer); ok { + return attribute.String(k, stringer.String()) + } + if b, err := json.Marshal(v); b != nil && err == nil { + return attribute.String(k, string(b)) + } + return attribute.String(k, fmt.Sprintf("%v", v)) +} diff --git a/tools/vendor/github.com/containerd/containerd/tracing/log.go b/tools/vendor/github.com/containerd/containerd/tracing/log.go new file mode 100644 index 000000000..98fa16f93 --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/tracing/log.go @@ -0,0 +1,66 @@ +/* + 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 tracing + +import ( + "github.com/sirupsen/logrus" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" +) + +// NewLogrusHook creates a new logrus hook +func NewLogrusHook() *LogrusHook { + return &LogrusHook{} +} + +// LogrusHook is a logrus hook which adds logrus events to active spans. +// If the span is not recording or the span context is invalid, the hook is a no-op. +type LogrusHook struct{} + +// Levels returns the logrus levels that this hook is interested in. +func (h *LogrusHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire is called when a log event occurs. +func (h *LogrusHook) Fire(entry *logrus.Entry) error { + span := trace.SpanFromContext(entry.Context) + if span == nil { + return nil + } + + if !span.SpanContext().IsValid() || !span.IsRecording() { + return nil + } + + span.AddEvent( + entry.Message, + trace.WithAttributes(logrusDataToAttrs(entry.Data)...), + trace.WithAttributes(attribute.String("level", entry.Level.String())), + trace.WithTimestamp(entry.Time), + ) + + return nil +} + +func logrusDataToAttrs(data logrus.Fields) []attribute.KeyValue { + attrs := make([]attribute.KeyValue, 0, len(data)) + for k, v := range data { + attrs = append(attrs, any(k, v)) + } + return attrs +} diff --git a/tools/vendor/github.com/containerd/containerd/tracing/tracing.go b/tools/vendor/github.com/containerd/containerd/tracing/tracing.go new file mode 100644 index 000000000..7fe7bfd5b --- /dev/null +++ b/tools/vendor/github.com/containerd/containerd/tracing/tracing.go @@ -0,0 +1,117 @@ +/* + 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 tracing + +import ( + "context" + "net/http" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" + httpconv "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv" + "go.opentelemetry.io/otel/trace" +) + +// StartConfig defines configuration for a new span object. +type StartConfig struct { + spanOpts []trace.SpanStartOption +} + +type SpanOpt func(config *StartConfig) + +// WithHTTPRequest marks span as a HTTP request operation from client to server. +// It'll append attributes from the HTTP request object and mark it with `SpanKindClient` type. +func WithHTTPRequest(request *http.Request) SpanOpt { + return func(config *StartConfig) { + config.spanOpts = append(config.spanOpts, + trace.WithSpanKind(trace.SpanKindClient), // A client making a request to a server + trace.WithAttributes(httpconv.ClientRequest(request)...), // Add HTTP attributes + ) + } +} + +// StartSpan starts child span in a context. +func StartSpan(ctx context.Context, opName string, opts ...SpanOpt) (context.Context, *Span) { + config := StartConfig{} + for _, fn := range opts { + fn(&config) + } + tracer := otel.Tracer("") + if parent := trace.SpanFromContext(ctx); parent != nil && parent.SpanContext().IsValid() { + tracer = parent.TracerProvider().Tracer("") + } + ctx, span := tracer.Start(ctx, opName, config.spanOpts...) + return ctx, &Span{otelSpan: span} +} + +// SpanFromContext returns the current Span from the context. +func SpanFromContext(ctx context.Context) *Span { + return &Span{ + otelSpan: trace.SpanFromContext(ctx), + } +} + +// Span is wrapper around otel trace.Span. +// Span is the individual component of a trace. It represents a +// single named and timed operation of a workflow that is traced. +type Span struct { + otelSpan trace.Span +} + +// End completes the span. +func (s *Span) End() { + s.otelSpan.End() +} + +// AddEvent adds an event with provided name and options. +func (s *Span) AddEvent(name string, options ...trace.EventOption) { + s.otelSpan.AddEvent(name, options...) +} + +// SetStatus sets the status of the current span. +// If an error is encountered, it records the error and sets span status to Error. +func (s *Span) SetStatus(err error) { + if err != nil { + s.otelSpan.RecordError(err) + s.otelSpan.SetStatus(codes.Error, err.Error()) + } else { + s.otelSpan.SetStatus(codes.Ok, "") + } +} + +// SetAttributes sets kv as attributes of the span. +func (s *Span) SetAttributes(kv ...attribute.KeyValue) { + s.otelSpan.SetAttributes(kv...) +} + +// Name sets the span name by joining a list of strings in dot separated format. +func Name(names ...string) string { + return makeSpanName(names...) +} + +// Attribute takes a key value pair and returns attribute.KeyValue type. +func Attribute(k string, v interface{}) attribute.KeyValue { + return any(k, v) +} + +// HTTPStatusCodeAttributes generates attributes of the HTTP namespace as specified by the OpenTelemetry +// specification for a span. +func HTTPStatusCodeAttributes(code int) []attribute.KeyValue { + return []attribute.KeyValue{semconv.HTTPStatusCodeKey.Int(code)} +} diff --git a/tools/vendor/github.com/containerd/containerd/version/version.go b/tools/vendor/github.com/containerd/containerd/version/version.go index a4156cb7a..c9f9dd55e 100644 --- a/tools/vendor/github.com/containerd/containerd/version/version.go +++ b/tools/vendor/github.com/containerd/containerd/version/version.go @@ -23,7 +23,7 @@ var ( Package = "github.com/containerd/containerd" // Version holds the complete version number. Filled in at linking time. - Version = "1.6.8+unknown" + Version = "1.7.0+unknown" // Revision is filled with the VCS (e.g. git) revision being used to build // the program at linking time. diff --git a/tools/vendor/github.com/containerd/continuity/AUTHORS b/tools/vendor/github.com/containerd/continuity/AUTHORS index deef28c1d..0b4a03cd4 100644 --- a/tools/vendor/github.com/containerd/continuity/AUTHORS +++ b/tools/vendor/github.com/containerd/continuity/AUTHORS @@ -1,8 +1,6 @@ -Aaron Lehmann +Aaron Lehmann Akash Gupta Akihiro Suda -Akihiro Suda -Akihiro Suda Andrew Pennebaker Brandon Philips Brian Goff @@ -10,9 +8,9 @@ Christopher Jones Daniel, Dao Quang Minh Darren Stahl Derek McGowan -Derek McGowan Edward Pilatowicz Fu Wei +Gabriel Adrian Samfira Hajime Tazaki Ian Campbell Ivan Markin @@ -20,20 +18,18 @@ Jacob Blain Christen Justin Cormack Justin Cummins Kasper Fabæch Brandt +Kazuyoshi Kato Kir Kolyshkin Michael Crosby -Michael Crosby Michael Wan Mike Brown Niels de Vos -Phil Estes Phil Estes -Phil Estes Sam Whited Samuel Karp Sebastiaan van Stijn Shengjing Zhu -Stephen J Day +Stephen J Day Tibor Vass Tobias Klauser Tom Faulhaber diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy.go b/tools/vendor/github.com/containerd/continuity/fs/copy.go index 8e23934e9..6982a761b 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy.go +++ b/tools/vendor/github.com/containerd/continuity/fs/copy.go @@ -22,6 +22,8 @@ import ( "os" "path/filepath" "sync" + + "github.com/sirupsen/logrus" ) var bufferPool = &sync.Pool{ @@ -31,7 +33,7 @@ var bufferPool = &sync.Pool{ }, } -// XAttrErrorHandlers transform a non-nil xattr error. +// XAttrErrorHandler transform a non-nil xattr error. // Return nil to ignore an error. // xattrKey can be empty for listxattr operation. type XAttrErrorHandler func(dst, src, xattrKey string, err error) error @@ -152,13 +154,15 @@ func copyDirectory(dst, src string, inodes map[uint64]string, o *copyDirOpts) er if err := os.Symlink(link, target); err != nil { return fmt.Errorf("failed to create symlink: %s: %w", target, err) } - case (fi.Mode() & os.ModeDevice) == os.ModeDevice: - if err := copyDevice(target, fi); err != nil { - return fmt.Errorf("failed to create device: %w", err) + case (fi.Mode() & os.ModeDevice) == os.ModeDevice, + (fi.Mode() & os.ModeNamedPipe) == os.ModeNamedPipe, + (fi.Mode() & os.ModeSocket) == os.ModeSocket: + if err := copyIrregular(target, fi); err != nil { + return fmt.Errorf("failed to create irregular file: %w", err) } default: - // TODO: Support pipes and sockets - return fmt.Errorf("unsupported mode %s: %w", fi.Mode(), err) + logrus.Warnf("unsupported mode: %s: %s", source, fi.Mode()) + continue } if err := copyFileInfo(fi, source, target); err != nil { diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_freebsd.go b/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_freebsd.go new file mode 100644 index 000000000..cfe9d8020 --- /dev/null +++ b/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_freebsd.go @@ -0,0 +1,36 @@ +/* + 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 fs + +import ( + "fmt" + "os" + "syscall" +) + +// copyIrregular covers devices, pipes, and sockets +func copyIrregular(dst string, fi os.FileInfo) error { + st, ok := fi.Sys().(*syscall.Stat_t) // not *unix.Stat_t + if !ok { + return fmt.Errorf("unsupported stat type: %s: %v", dst, fi.Mode()) + } + var rDev uint64 // uint64 on FreeBSD, int on other unixen + if fi.Mode()&os.ModeDevice == os.ModeDevice { + rDev = st.Rdev + } + return syscall.Mknod(dst, uint32(st.Mode), rDev) +} diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_unix.go b/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_unix.go new file mode 100644 index 000000000..99fc8a965 --- /dev/null +++ b/tools/vendor/github.com/containerd/continuity/fs/copy_irregular_unix.go @@ -0,0 +1,40 @@ +//go:build !windows && !freebsd +// +build !windows,!freebsd + +/* + 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 fs + +import ( + "fmt" + "os" + "syscall" +) + +// copyIrregular covers devices, pipes, and sockets +func copyIrregular(dst string, fi os.FileInfo) error { + st, ok := fi.Sys().(*syscall.Stat_t) // not *unix.Stat_t + if !ok { + return fmt.Errorf("unsupported stat type: %s: %v", dst, fi.Mode()) + } + var rDev int + if fi.Mode()&os.ModeDevice == os.ModeDevice { + rDev = int(st.Rdev) + } + //nolint:unconvert + return syscall.Mknod(dst, uint32(st.Mode), rDev) +} diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_linux.go b/tools/vendor/github.com/containerd/continuity/fs/copy_linux.go index 938407662..1906e5e01 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy_linux.go +++ b/tools/vendor/github.com/containerd/continuity/fs/copy_linux.go @@ -17,7 +17,6 @@ package fs import ( - "errors" "fmt" "io" "os" @@ -144,11 +143,3 @@ func copyXAttrs(dst, src string, excludes map[string]struct{}, errorHandler XAtt return nil } - -func copyDevice(dst string, fi os.FileInfo) error { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return errors.New("unsupported stat type") - } - return unix.Mknod(dst, uint32(fi.Mode()), int(st.Rdev)) -} diff --git a/tools/vendor/github.com/containerd/continuity/fs/copy_windows.go b/tools/vendor/github.com/containerd/continuity/fs/copy_windows.go index e3f0cdd58..4dad9441d 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/copy_windows.go +++ b/tools/vendor/github.com/containerd/continuity/fs/copy_windows.go @@ -85,6 +85,6 @@ func copyXAttrs(dst, src string, excludes map[string]struct{}, errorHandler XAtt return nil } -func copyDevice(dst string, fi os.FileInfo) error { - return errors.New("device copy not supported") +func copyIrregular(dst string, fi os.FileInfo) error { + return errors.New("irregular copy not supported") } diff --git a/tools/vendor/github.com/containerd/continuity/fs/diff.go b/tools/vendor/github.com/containerd/continuity/fs/diff.go index e64f9e73d..3cd4eee6f 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/diff.go +++ b/tools/vendor/github.com/containerd/continuity/fs/diff.go @@ -22,9 +22,8 @@ import ( "path/filepath" "strings" - "golang.org/x/sync/errgroup" - "github.com/sirupsen/logrus" + "golang.org/x/sync/errgroup" ) // ChangeKind is the type of modification that diff --git a/tools/vendor/github.com/containerd/continuity/fs/dtype_linux.go b/tools/vendor/github.com/containerd/continuity/fs/dtype_linux.go index ddd6c7937..a8eab1db8 100644 --- a/tools/vendor/github.com/containerd/continuity/fs/dtype_linux.go +++ b/tools/vendor/github.com/containerd/continuity/fs/dtype_linux.go @@ -35,7 +35,7 @@ func locateDummyIfEmpty(path string) (string, error) { if len(children) != 0 { return "", nil } - dummyFile, err := ioutil.TempFile(path, "fsutils-dummy") + dummyFile, err := os.CreateTemp(path, "fsutils-dummy") if err != nil { return "", err } diff --git a/tools/vendor/github.com/containerd/continuity/sysx/generate.sh b/tools/vendor/github.com/containerd/continuity/sysx/generate.sh deleted file mode 100644 index 87d708d7a..000000000 --- a/tools/vendor/github.com/containerd/continuity/sysx/generate.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# 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. - - -set -e - -mksyscall="$(go env GOROOT)/src/syscall/mksyscall.pl" - -fix() { - sed 's,^package syscall$,package sysx,' \ - | sed 's,^import "unsafe"$,import (\n\t"syscall"\n\t"unsafe"\n),' \ - | gofmt -r='BytePtrFromString -> syscall.BytePtrFromString' \ - | gofmt -r='Syscall6 -> syscall.Syscall6' \ - | gofmt -r='Syscall -> syscall.Syscall' \ - | gofmt -r='SYS_GETXATTR -> syscall.SYS_GETXATTR' \ - | gofmt -r='SYS_LISTXATTR -> syscall.SYS_LISTXATTR' \ - | gofmt -r='SYS_SETXATTR -> syscall.SYS_SETXATTR' \ - | gofmt -r='SYS_REMOVEXATTR -> syscall.SYS_REMOVEXATTR' \ - | gofmt -r='SYS_LGETXATTR -> syscall.SYS_LGETXATTR' \ - | gofmt -r='SYS_LLISTXATTR -> syscall.SYS_LLISTXATTR' \ - | gofmt -r='SYS_LSETXATTR -> syscall.SYS_LSETXATTR' \ - | gofmt -r='SYS_LREMOVEXATTR -> syscall.SYS_LREMOVEXATTR' -} - -if [ "$GOARCH" == "" ] || [ "$GOOS" == "" ]; then - echo "Must specify \$GOARCH and \$GOOS" - exit 1 -fi - -mkargs="" - -if [ "$GOARCH" == "386" ] || [ "$GOARCH" == "arm" ]; then - mkargs="-l32" -fi - -for f in "$@"; do - $mksyscall $mkargs "${f}_${GOOS}.go" | fix > "${f}_${GOOS}_${GOARCH}.go" -done - diff --git a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/build.go b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/build.go index 708b26689..0da3efe4c 100644 --- a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/build.go +++ b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/build.go @@ -26,9 +26,10 @@ import ( "archive/tar" "bytes" "compress/gzip" + "context" + "errors" "fmt" "io" - "io/ioutil" "os" "path" "runtime" @@ -38,7 +39,6 @@ import ( "github.com/containerd/stargz-snapshotter/estargz/errorutil" "github.com/klauspost/compress/zstd" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" "golang.org/x/sync/errgroup" ) @@ -48,6 +48,7 @@ type options struct { prioritizedFiles []string missedPrioritizedFiles *[]string compression Compression + ctx context.Context } type Option func(o *options) error @@ -104,6 +105,14 @@ func WithCompression(compression Compression) Option { } } +// WithContext specifies a context that can be used for clean canceleration. +func WithContext(ctx context.Context) Option { + return func(o *options) error { + o.ctx = ctx + return nil + } +} + // Blob is an eStargz blob. type Blob struct { io.ReadCloser @@ -139,12 +148,29 @@ func Build(tarBlob *io.SectionReader, opt ...Option) (_ *Blob, rErr error) { opts.compression = newGzipCompressionWithLevel(opts.compressionLevel) } layerFiles := newTempFiles() + ctx := opts.ctx + if ctx == nil { + ctx = context.Background() + } + done := make(chan struct{}) + defer close(done) + go func() { + select { + case <-done: + // nop + case <-ctx.Done(): + layerFiles.CleanupAll() + } + }() defer func() { if rErr != nil { if err := layerFiles.CleanupAll(); err != nil { - rErr = errors.Wrapf(rErr, "failed to cleanup tmp files: %v", err) + rErr = fmt.Errorf("failed to cleanup tmp files: %v: %w", err, rErr) } } + if cErr := ctx.Err(); cErr != nil { + rErr = fmt.Errorf("error from context %q: %w", cErr, rErr) + } }() tarBlob, err := decompressBlob(tarBlob, layerFiles) if err != nil { @@ -307,7 +333,7 @@ func sortEntries(in io.ReaderAt, prioritized []string, missedPrioritized *[]stri // Import tar file. intar, err := importTar(in) if err != nil { - return nil, errors.Wrap(err, "failed to sort") + return nil, fmt.Errorf("failed to sort: %w", err) } // Sort the tar file respecting to the prioritized files list. @@ -318,7 +344,7 @@ func sortEntries(in io.ReaderAt, prioritized []string, missedPrioritized *[]stri *missedPrioritized = append(*missedPrioritized, l) continue // allow not found } - return nil, errors.Wrap(err, "failed to sort tar entries") + return nil, fmt.Errorf("failed to sort tar entries: %w", err) } } if len(prioritized) == 0 { @@ -371,7 +397,7 @@ func importTar(in io.ReaderAt) (*tarFile, error) { tf := &tarFile{} pw, err := newCountReader(in) if err != nil { - return nil, errors.Wrap(err, "failed to make position watcher") + return nil, fmt.Errorf("failed to make position watcher: %w", err) } tr := tar.NewReader(pw) @@ -383,7 +409,7 @@ func importTar(in io.ReaderAt) (*tarFile, error) { if err == io.EOF { break } else { - return nil, errors.Wrap(err, "failed to parse tar file") + return nil, fmt.Errorf("failed to parse tar file, %w", err) } } switch cleanEntryName(h.Name) { @@ -420,7 +446,7 @@ func moveRec(name string, in *tarFile, out *tarFile) error { _, okIn := in.get(name) _, okOut := out.get(name) if !okIn && !okOut { - return errors.Wrapf(errNotFound, "file: %q", name) + return fmt.Errorf("file: %q: %w", name, errNotFound) } parent, _ := path.Split(strings.TrimSuffix(name, "/")) @@ -506,12 +532,13 @@ func newTempFiles() *tempFiles { } type tempFiles struct { - files []*os.File - filesMu sync.Mutex + files []*os.File + filesMu sync.Mutex + cleanupOnce sync.Once } func (tf *tempFiles) TempFile(dir, pattern string) (*os.File, error) { - f, err := ioutil.TempFile(dir, pattern) + f, err := os.CreateTemp(dir, pattern) if err != nil { return nil, err } @@ -521,7 +548,14 @@ func (tf *tempFiles) TempFile(dir, pattern string) (*os.File, error) { return f, nil } -func (tf *tempFiles) CleanupAll() error { +func (tf *tempFiles) CleanupAll() (err error) { + tf.cleanupOnce.Do(func() { + err = tf.cleanupAll() + }) + return +} + +func (tf *tempFiles) cleanupAll() error { tf.filesMu.Lock() defer tf.filesMu.Unlock() var allErr []error diff --git a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.go b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.go index e56319545..921e59ec6 100644 --- a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.go +++ b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.go @@ -27,10 +27,10 @@ import ( "bytes" "compress/gzip" "crypto/sha256" + "errors" "fmt" "hash" "io" - "io/ioutil" "os" "path" "sort" @@ -40,7 +40,6 @@ import ( "github.com/containerd/stargz-snapshotter/estargz/errorutil" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" "github.com/vbatts/tar-split/archive/tar" ) @@ -107,7 +106,7 @@ type Telemetry struct { } // Open opens a stargz file for reading. -// The behaviour is configurable using options. +// The behavior is configurable using options. // // Note that each entry name is normalized as the path that is relative to root. func Open(sr *io.SectionReader, opt ...OpenOption) (*Reader, error) { @@ -385,8 +384,7 @@ func (r *Reader) Verifiers() (TOCEntryVerifier, error) { if e.Digest != "" { d, err := digest.Parse(e.Digest) if err != nil { - return nil, errors.Wrapf(err, - "failed to parse regular file digest %q", e.Digest) + return nil, fmt.Errorf("failed to parse regular file digest %q: %w", e.Digest, err) } regDigestMap[e.Offset] = d } else { @@ -401,8 +399,7 @@ func (r *Reader) Verifiers() (TOCEntryVerifier, error) { if e.ChunkDigest != "" { d, err := digest.Parse(e.ChunkDigest) if err != nil { - return nil, errors.Wrapf(err, - "failed to parse chunk digest %q", e.ChunkDigest) + return nil, fmt.Errorf("failed to parse chunk digest %q: %w", e.ChunkDigest, err) } chunkDigestMap[e.Offset] = d } else { @@ -581,7 +578,7 @@ func (fr *fileReader) ReadAt(p []byte, off int64) (n int, err error) { return 0, fmt.Errorf("fileReader.ReadAt.decompressor.Reader: %v", err) } defer dr.Close() - if n, err := io.CopyN(ioutil.Discard, dr, off); n != off || err != nil { + if n, err := io.CopyN(io.Discard, dr, off); n != off || err != nil { return 0, fmt.Errorf("discard of %d bytes = %v, %v", off, n, err) } return io.ReadFull(dr, p) @@ -647,7 +644,7 @@ func Unpack(sr *io.SectionReader, c Decompressor) (io.ReadCloser, error) { } blobPayloadSize, _, _, err := c.ParseFooter(footer) if err != nil { - return nil, errors.Wrapf(err, "failed to parse footer") + return nil, fmt.Errorf("failed to parse footer: %w", err) } return c.Reader(io.LimitReader(sr, blobPayloadSize)) } @@ -935,7 +932,7 @@ func (w *Writer) appendTar(r io.Reader, lossless bool) error { } } } - remainDest := ioutil.Discard + remainDest := io.Discard if lossless { remainDest = dst // Preserve the remaining bytes in lossless mode } diff --git a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.go b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.go index 7330849cb..591d7a62e 100644 --- a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.go +++ b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.go @@ -34,7 +34,6 @@ import ( "strconv" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) type gzipCompression struct { @@ -150,7 +149,7 @@ func (gz *GzipDecompressor) ParseFooter(p []byte) (blobPayloadSize, tocOffset, t } tocOffset, err = strconv.ParseInt(string(subfield[:16]), 16, 64) if err != nil { - return 0, 0, 0, errors.Wrapf(err, "legacy: failed to parse toc offset") + return 0, 0, 0, fmt.Errorf("legacy: failed to parse toc offset: %w", err) } return tocOffset, tocOffset, 0, nil } @@ -179,7 +178,7 @@ func (gz *LegacyGzipDecompressor) ParseFooter(p []byte) (blobPayloadSize, tocOff } zr, err := gzip.NewReader(bytes.NewReader(p)) if err != nil { - return 0, 0, 0, errors.Wrapf(err, "legacy: failed to get footer gzip reader") + return 0, 0, 0, fmt.Errorf("legacy: failed to get footer gzip reader: %w", err) } defer zr.Close() extra := zr.Header.Extra @@ -191,7 +190,7 @@ func (gz *LegacyGzipDecompressor) ParseFooter(p []byte) (blobPayloadSize, tocOff } tocOffset, err = strconv.ParseInt(string(extra[:16]), 16, 64) if err != nil { - return 0, 0, 0, errors.Wrapf(err, "legacy: failed to parse toc offset") + return 0, 0, 0, fmt.Errorf("legacy: failed to parse toc offset: %w", err) } return tocOffset, tocOffset, 0, nil } diff --git a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.go b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.go index 9224e456d..37448cae0 100644 --- a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.go +++ b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.go @@ -28,10 +28,11 @@ import ( "compress/gzip" "crypto/sha256" "encoding/json" + "errors" "fmt" "io" - "io/ioutil" "os" + "path/filepath" "reflect" "sort" "strings" @@ -41,7 +42,6 @@ import ( "github.com/containerd/stargz-snapshotter/estargz/errorutil" "github.com/klauspost/compress/zstd" digest "github.com/opencontainers/go-digest" - "github.com/pkg/errors" ) // TestingController is Compression with some helper methods necessary for testing. @@ -287,11 +287,11 @@ func isSameTarGz(t *testing.T, controller TestingController, a, b []byte) bool { return false } - aFile, err := ioutil.ReadAll(aTar) + aFile, err := io.ReadAll(aTar) if err != nil { t.Fatal("failed to read tar payload of A") } - bFile, err := ioutil.ReadAll(bTar) + bFile, err := io.ReadAll(bTar) if err != nil { t.Fatal("failed to read tar payload of B") } @@ -1062,18 +1062,18 @@ func parseStargz(sgz *io.SectionReader, controller TestingController) (decodedJT fSize := controller.FooterSize() footer := make([]byte, fSize) if _, err := sgz.ReadAt(footer, sgz.Size()-fSize); err != nil { - return nil, 0, errors.Wrap(err, "error reading footer") + return nil, 0, fmt.Errorf("error reading footer: %w", err) } _, tocOffset, _, err := controller.ParseFooter(footer[positive(int64(len(footer))-fSize):]) if err != nil { - return nil, 0, errors.Wrapf(err, "failed to parse footer") + return nil, 0, fmt.Errorf("failed to parse footer: %w", err) } // Decode the TOC JSON tocReader := io.NewSectionReader(sgz, tocOffset, sgz.Size()-tocOffset-fSize) decodedJTOC, _, err = controller.ParseTOC(tocReader) if err != nil { - return nil, 0, errors.Wrap(err, "failed to parse TOC") + return nil, 0, fmt.Errorf("failed to parse TOC: %w", err) } return decodedJTOC, tocOffset, nil } @@ -1314,6 +1314,18 @@ func testWriteAndOpen(t *testing.T, controllers ...TestingController) { ), wantFailOnLossLess: true, }, + { + name: "hardlink should be replaced to the destination entry", + in: tarOf( + dir("foo/"), + file("foo/foo1", "test"), + link("foolink", "foo/foo1"), + ), + wantNumGz: 4, // dir, foo1 + link, TOC, footer + want: checks( + mustSameEntry("foo/foo1", "foolink"), + ), + }, } for _, tt := range tests { @@ -1731,6 +1743,60 @@ func hasEntryOwner(entry string, owner owner) stargzCheck { }) } +func mustSameEntry(files ...string) stargzCheck { + return stargzCheckFn(func(t *testing.T, r *Reader) { + var first *TOCEntry + for _, f := range files { + if first == nil { + var ok bool + first, ok = r.Lookup(f) + if !ok { + t.Errorf("unknown first file on Lookup: %q", f) + return + } + } + + // Test Lookup + e, ok := r.Lookup(f) + if !ok { + t.Errorf("unknown file on Lookup: %q", f) + return + } + if e != first { + t.Errorf("Lookup: %+v(%p) != %+v(%p)", e, e, first, first) + return + } + + // Test LookupChild + pe, ok := r.Lookup(filepath.Dir(filepath.Clean(f))) + if !ok { + t.Errorf("failed to get parent of %q", f) + return + } + e, ok = pe.LookupChild(filepath.Base(filepath.Clean(f))) + if !ok { + t.Errorf("failed to get %q as the child of %+v", f, pe) + return + } + if e != first { + t.Errorf("LookupChild: %+v(%p) != %+v(%p)", e, e, first, first) + return + } + + // Test ForeachChild + pe.ForeachChild(func(baseName string, e *TOCEntry) bool { + if baseName == filepath.Base(filepath.Clean(f)) { + if e != first { + t.Errorf("ForeachChild: %+v(%p) != %+v(%p)", e, e, first, first) + return false + } + } + return true + }) + } + }) +} + func tarOf(s ...tarEntry) []tarEntry { return s } type tarEntry interface { diff --git a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/types.go b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/types.go index 384ff7fd7..3bc74463e 100644 --- a/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/types.go +++ b/tools/vendor/github.com/containerd/stargz-snapshotter/estargz/types.go @@ -159,7 +159,8 @@ type TOCEntry struct { // NumLink is the number of entry names pointing to this entry. // Zero means one name references this entry. - NumLink int + // This field is calculated during runtime and not recorded in TOC JSON. + NumLink int `json:"-"` // Xattrs are the extended attribute for the entry. Xattrs map[string][]byte `json:"xattrs,omitempty"` diff --git a/tools/vendor/github.com/containerd/ttrpc/.gitattributes b/tools/vendor/github.com/containerd/ttrpc/.gitattributes new file mode 100644 index 000000000..d207b1802 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/.gitattributes @@ -0,0 +1 @@ +*.go text eol=lf diff --git a/tools/vendor/github.com/containerd/ttrpc/.gitignore b/tools/vendor/github.com/containerd/ttrpc/.gitignore index ea58090bd..88ceb2764 100644 --- a/tools/vendor/github.com/containerd/ttrpc/.gitignore +++ b/tools/vendor/github.com/containerd/ttrpc/.gitignore @@ -1,4 +1,5 @@ # Binaries for programs and plugins +/bin/ *.exe *.dll *.so @@ -9,3 +10,4 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +coverage.txt diff --git a/tools/vendor/github.com/containerd/ttrpc/.golangci.yml b/tools/vendor/github.com/containerd/ttrpc/.golangci.yml new file mode 100644 index 000000000..c8be4980c --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/.golangci.yml @@ -0,0 +1,54 @@ +linters: + enable: + - structcheck + - varcheck + - staticcheck + - unconvert + - gofmt + - goimports + - revive + - ineffassign + - vet + - unused + - misspell + disable: + - errcheck + +linters-settings: + revive: + ignore-generated-headers: true + rules: + - name: blank-imports + - name: context-as-argument + - name: context-keys-type + - name: dot-imports + - name: error-return + - name: error-strings + - name: error-naming + - name: exported + - name: if-return + - name: increment-decrement + - name: var-naming + arguments: [["UID", "GID"], []] + - name: var-declaration + - name: package-comments + - name: range + - name: receiver-naming + - name: time-naming + - name: unexported-return + - name: indent-error-flow + - name: errorf + - name: empty-block + - name: superfluous-else + - name: unused-parameter + - name: unreachable-code + - name: redefines-builtin-id + +issues: + include: + - EXC0002 + +run: + timeout: 8m + skip-dirs: + - example diff --git a/tools/vendor/github.com/containerd/ttrpc/Makefile b/tools/vendor/github.com/containerd/ttrpc/Makefile new file mode 100644 index 000000000..474194239 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/Makefile @@ -0,0 +1,180 @@ +# 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. + + +# Go command to use for build +GO ?= go +INSTALL ?= install + +# Root directory of the project (absolute path). +ROOTDIR=$(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +WHALE = "🇩" +ONI = "👹" + +# Project binaries. +COMMANDS=protoc-gen-go-ttrpc protoc-gen-gogottrpc + +ifdef BUILDTAGS + GO_BUILDTAGS = ${BUILDTAGS} +endif +GO_BUILDTAGS ?= +GO_TAGS=$(if $(GO_BUILDTAGS),-tags "$(strip $(GO_BUILDTAGS))",) + +# Project packages. +PACKAGES=$(shell $(GO) list ${GO_TAGS} ./... | grep -v /example) +TESTPACKAGES=$(shell $(GO) list ${GO_TAGS} ./... | grep -v /cmd | grep -v /integration | grep -v /example) +BINPACKAGES=$(addprefix ./cmd/,$(COMMANDS)) + +#Replaces ":" (*nix), ";" (windows) with newline for easy parsing +GOPATHS=$(shell echo ${GOPATH} | tr ":" "\n" | tr ";" "\n") + +TESTFLAGS_RACE= +GO_BUILD_FLAGS= +# See Golang issue re: '-trimpath': https://github.com/golang/go/issues/13809 +GO_GCFLAGS=$(shell \ + set -- ${GOPATHS}; \ + echo "-gcflags=-trimpath=$${1}/src"; \ + ) + +BINARIES=$(addprefix bin/,$(COMMANDS)) + +# Flags passed to `go test` +TESTFLAGS ?= $(TESTFLAGS_RACE) $(EXTRA_TESTFLAGS) +TESTFLAGS_PARALLEL ?= 8 + +# Use this to replace `go test` with, for instance, `gotestsum` +GOTEST ?= $(GO) test + +.PHONY: clean all AUTHORS build binaries test integration generate protos check-protos coverage ci check help install vendor install-protobuf install-protobuild +.DEFAULT: default + +# Forcibly set the default goal to all, in case an include above brought in a rule definition. +.DEFAULT_GOAL := all + +all: binaries + +check: proto-fmt ## run all linters + @echo "$(WHALE) $@" + GOGC=75 golangci-lint run + +ci: check binaries check-protos coverage # coverage-integration ## to be used by the CI + +AUTHORS: .mailmap .git/HEAD + git log --format='%aN <%aE>' | sort -fu > $@ + +generate: protos + @echo "$(WHALE) $@" + @PATH="${ROOTDIR}/bin:${PATH}" $(GO) generate -x ${PACKAGES} + +protos: bin/protoc-gen-gogottrpc bin/protoc-gen-go-ttrpc ## generate protobuf + @echo "$(WHALE) $@" + @(PATH="${ROOTDIR}/bin:${PATH}" protobuild --quiet ${PACKAGES}) + +check-protos: protos ## check if protobufs needs to be generated again + @echo "$(WHALE) $@" + @test -z "$$(git status --short | grep ".pb.go" | tee /dev/stderr)" || \ + ((git diff | cat) && \ + (echo "$(ONI) please run 'make protos' when making changes to proto files" && false)) + +check-api-descriptors: protos ## check that protobuf changes aren't present. + @echo "$(WHALE) $@" + @test -z "$$(git status --short | grep ".pb.txt" | tee /dev/stderr)" || \ + ((git diff $$(find . -name '*.pb.txt') | cat) && \ + (echo "$(ONI) please run 'make protos' when making changes to proto files and check-in the generated descriptor file changes" && false)) + +proto-fmt: ## check format of proto files + @echo "$(WHALE) $@" + @test -z "$$(find . -name '*.proto' -type f -exec grep -Hn -e "^ " {} \; | tee /dev/stderr)" || \ + (echo "$(ONI) please indent proto files with tabs only" && false) + @test -z "$$(find . -name '*.proto' -type f -exec grep -Hn "Meta meta = " {} \; | grep -v '(gogoproto.nullable) = false' | tee /dev/stderr)" || \ + (echo "$(ONI) meta fields in proto files must have option (gogoproto.nullable) = false" && false) + +build: ## build the go packages + @echo "$(WHALE) $@" + @$(GO) build ${DEBUG_GO_GCFLAGS} ${GO_GCFLAGS} ${GO_BUILD_FLAGS} ${EXTRA_FLAGS} ${PACKAGES} + +test: ## run tests, except integration tests and tests that require root + @echo "$(WHALE) $@" + @$(GOTEST) ${TESTFLAGS} ${TESTPACKAGES} + +integration: ## run integration tests + @echo "$(WHALE) $@" + @cd "${ROOTDIR}/integration" && $(GOTEST) -v ${TESTFLAGS} -parallel ${TESTFLAGS_PARALLEL} . + +benchmark: ## run benchmarks tests + @echo "$(WHALE) $@" + @$(GO) test ${TESTFLAGS} -bench . -run Benchmark + +FORCE: + +define BUILD_BINARY +@echo "$(WHALE) $@" +@$(GO) build ${DEBUG_GO_GCFLAGS} ${GO_GCFLAGS} ${GO_BUILD_FLAGS} -o $@ ${GO_TAGS} ./$< +endef + +# Build a binary from a cmd. +bin/%: cmd/% FORCE + $(call BUILD_BINARY) + +binaries: $(BINARIES) ## build binaries + @echo "$(WHALE) $@" + +clean: ## clean up binaries + @echo "$(WHALE) $@" + @rm -f $(BINARIES) + +install: ## install binaries + @echo "$(WHALE) $@ $(BINPACKAGES)" + @$(GO) install $(BINPACKAGES) + +install-protobuf: + @echo "$(WHALE) $@" + @script/install-protobuf + +install-protobuild: + @echo "$(WHALE) $@" + @$(GO) install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.1 + @$(GO) install github.com/containerd/protobuild@14832ccc41429f5c4f81028e5af08aa233a219cf + +coverage: ## generate coverprofiles from the unit tests, except tests that require root + @echo "$(WHALE) $@" + @rm -f coverage.txt + @$(GO) test -i ${TESTFLAGS} ${TESTPACKAGES} 2> /dev/null + @( for pkg in ${PACKAGES}; do \ + $(GO) test ${TESTFLAGS} \ + -cover \ + -coverprofile=profile.out \ + -covermode=atomic $$pkg || exit; \ + if [ -f profile.out ]; then \ + cat profile.out >> coverage.txt; \ + rm profile.out; \ + fi; \ + done ) + +vendor: ## ensure all the go.mod/go.sum files are up-to-date + @echo "$(WHALE) $@" + @$(GO) mod tidy + @$(GO) mod verify + +verify-vendor: ## verify if all the go.mod/go.sum files are up-to-date + @echo "$(WHALE) $@" + @$(GO) mod tidy + @$(GO) mod verify + @test -z "$$(git status --short | grep "go.sum" | tee /dev/stderr)" || \ + ((git diff | cat) && \ + (echo "$(ONI) make sure to checkin changes after go mod tidy" && false)) + +help: ## this help + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort diff --git a/tools/vendor/github.com/containerd/ttrpc/PROTOCOL.md b/tools/vendor/github.com/containerd/ttrpc/PROTOCOL.md new file mode 100644 index 000000000..12b43f6bd --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/PROTOCOL.md @@ -0,0 +1,240 @@ +# Protocol Specification + +The ttrpc protocol is client/server protocol to support multiple request streams +over a single connection with lightweight framing. The client represents the +process which initiated the underlying connection and the server is the process +which accepted the connection. The protocol is currently defined as +asymmetrical, with clients sending requests and servers sending responses. Both +clients and servers are able to send stream data. The roles are also used in +determining the stream identifiers, with client initiated streams using odd +number identifiers and server initiated using even number. The protocol may be +extended in the future to support server initiated streams, that is not +supported in the latest version. + +## Purpose + +The ttrpc protocol is designed to be lightweight and optimized for low latency +and reliable connections between processes on the same host. The protocol does +not include features for handling unreliable connections such as handshakes, +resets, pings, or flow control. The protocol is designed to make low-overhead +implementations as simple as possible. It is not intended as a suitable +replacement for HTTP2/3 over the network. + +## Message Frame + +Each Message Frame consists of a 10-byte message header followed +by message data. The data length and stream ID are both big-endian +4-byte unsigned integers. The message type is an unsigned 1-byte +integer. The flags are also an unsigned 1-byte integer and +use is defined by the message type. + + +---------------------------------------------------------------+ + | Data Length (32) | + +---------------------------------------------------------------+ + | Stream ID (32) | + +---------------+-----------------------------------------------+ + | Msg Type (8) | + +---------------+ + | Flags (8) | + +---------------+-----------------------------------------------+ + | Data (*) | + +---------------------------------------------------------------+ + +The Data Length field represents the number of bytes in the Data field. The +total frame size will always be Data Length + 10 bytes. The maximum data length +is 4MB and any larger size should be rejected. Due to the maximum data size +being less than 16MB, the first frame byte should always be zero. This first +byte should be considered reserved for future use. + +The Stream ID must be odd for client initiated streams and even for server +initiated streams. Server initiated streams are not currently supported. + +## Mesage Types + +| Message Type | Name | Description | +|--------------|----------|----------------------------------| +| 0x01 | Request | Initiates stream | +| 0x02 | Response | Final stream data and terminates | +| 0x03 | Data | Stream data | + +### Request + +The request message is used to initiate stream and send along request data for +properly routing and handling the stream. The stream may indicate unary without +any inbound or outbound stream data with only a response is expected on the +stream. The request may also indicate the stream is still open for more data and +no response is expected until data is finished. If the remote indicates the +stream is closed, the request may be considered non-unary but without anymore +stream data sent. In the case of `remote closed`, the remote still expects to +receive a response or stream data. For compatibility with non streaming clients, +a request with empty flags indicates a unary request. + +#### Request Flags + +| Flag | Name | Description | +|------|-----------------|--------------------------------------------------| +| 0x01 | `remote closed` | Non-unary, but no more data expected from remote | +| 0x02 | `remote open` | Non-unary, remote is still sending data | + +### Response + +The response message is used to end a stream with data, an empty response, or +an error. A response message is the only expected message after a unary request. +A non-unary request does not require a response message if the server is sending +back stream data. A non-unary stream may return a single response message but no +other stream data may follow. + +#### Response Flags + +No response flags are defined at this time, flags should be empty. + +### Data + +The data message is used to send data on an already initialized stream. Either +client or server may send data. A data message is not allowed on a unary stream. +A data message should not be sent after indicating `remote closed` to the peer. +The last data message on a stream must set the `remote closed` flag. + +The `no data` flag is used to indicate that the data message does not include +any data. This is normally used with the `remote closed` flag to indicate the +stream is now closed without transmitting any data. Since ttrpc normally +transmits a single object per message, a zero length data message may be +interpreted as an empty object. For example, transmitting the number zero as a +protobuf message ends up with a data length of zero, but the message is still +considered data and should be processed. + +#### Data Flags + +| Flag | Name | Description | +|------|-----------------|-----------------------------------| +| 0x01 | `remote closed` | No more data expected from remote | +| 0x04 | `no data` | This message does not have data | + +## Streaming + +All ttrpc requests use streams to transfer data. Unary streams will only have +two messages sent per stream, a request from a client and a response from the +server. Non-unary streams, however, may send any numbers of messages from the +client and the server. This makes stream management more complicated than unary +streams since both client and server need to track additional state. To keep +this management as simple as possible, ttrpc minimizes the number of states and +uses two flags instead of control frames. Each stream has two states while a +stream is still alive: `local closed` and `remote closed`. Each peer considers +local and remote from their own perspective and sets flags from the other peer's +perspective. For example, if a client sends a data frame with the +`remote closed` flag, that is indicating that the client is now `local closed` +and the server will be `remote closed`. A unary operation does not need to send +these flags since each received message always indicates `remote closed`. Once a +peer is both `local closed` and `remote closed`, the stream is considered +finished and may be cleaned up. + +Due to the asymmetric nature of the current protocol, a client should +always be in the `local closed` state before `remote closed` and a server should +always be in the `remote closed` state before `local closed`. This happens +because the client is always initiating requests and a client always expects a +final response back from a server to indicate the initiated request has been +fulfilled. This may mean server sends a final empty response to finish a stream +even after it has already completed sending data before the client. + +### Unary State Diagram + + +--------+ +--------+ + | Client | | Server | + +---+----+ +----+---+ + | +---------+ | + local >---------------+ Request +--------------------> remote + closed | +---------+ | closed + | | + | +----------+ | + finished <--------------+ Response +--------------------< finished + | +----------+ | + | | + +### Non-Unary State Diagrams + +RC: `remote closed` flag +RO: `remote open` flag + + +--------+ +--------+ + | Client | | Server | + +---+----+ +----+---+ + | +--------------+ | + >-------------+ Request [RO] +-----------------> + | +--------------+ | + | | + | +------+ | + >-----------------+ Data +---------------------> + | +------+ | + | | + | +-----------+ | + local >---------------+ Data [RC] +------------------> remote + closed | +-----------+ | closed + | | + | +----------+ | + finished <--------------+ Response +--------------------< finished + | +----------+ | + | | + + +--------+ +--------+ + | Client | | Server | + +---+----+ +----+---+ + | +--------------+ | + local >-------------+ Request [RC] +-----------------> remote + closed | +--------------+ | closed + | | + | +------+ | + <-----------------+ Data +---------------------< + | +------+ | + | | + | +-----------+ | + finished <---------------+ Data [RC] +------------------< finished + | +-----------+ | + | | + + +--------+ +--------+ + | Client | | Server | + +---+----+ +----+---+ + | +--------------+ | + >-------------+ Request [RO] +-----------------> + | +--------------+ | + | | + | +------+ | + >-----------------+ Data +---------------------> + | +------+ | + | | + | +------+ | + <-----------------+ Data +---------------------< + | +------+ | + | | + | +------+ | + >-----------------+ Data +---------------------> + | +------+ | + | | + | +-----------+ | + local >---------------+ Data [RC] +------------------> remote + closed | +-----------+ | closed + | | + | +------+ | + <-----------------+ Data +---------------------< + | +------+ | + | | + | +-----------+ | + finished <---------------+ Data [RC] +------------------< finished + | +-----------+ | + | | + +## RPC + +While this protocol is defined primarily to support Remote Procedure Calls, the +protocol does not define the request and response types beyond the messages +defined in the protocol. The implementation provides a default protobuf +definition of request and response which may be used for cross language rpc. +All implementations should at least define a request type which support +routing by procedure name and a response type which supports call status. + +## Version History + +| Version | Features | +|---------|---------------------| +| 1.0 | Unary requests only | +| 1.2 | Streaming support | diff --git a/tools/vendor/github.com/containerd/ttrpc/Protobuild.toml b/tools/vendor/github.com/containerd/ttrpc/Protobuild.toml new file mode 100644 index 000000000..0f6ccbd1e --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/Protobuild.toml @@ -0,0 +1,28 @@ +version = "2" +generators = ["go"] + +# 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 = ["."] + + # 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] + "google/protobuf/any.proto" = "github.com/gogo/protobuf/types" + "proto/status.proto" = "google.golang.org/genproto/googleapis/rpc/status" + +[[overrides]] +# enable ttrpc and disable fieldpath and grpc for the shim +prefixes = ["github.com/containerd/ttrpc/integration/streaming"] +generators = ["go", "go-ttrpc"] + +[overrides.parameters.go-ttrpc] +prefix = "TTRPC" diff --git a/tools/vendor/github.com/containerd/ttrpc/README.md b/tools/vendor/github.com/containerd/ttrpc/README.md index 547a1297d..675a5179e 100644 --- a/tools/vendor/github.com/containerd/ttrpc/README.md +++ b/tools/vendor/github.com/containerd/ttrpc/README.md @@ -1,7 +1,6 @@ # ttrpc [![Build Status](https://github.com/containerd/ttrpc/workflows/CI/badge.svg)](https://github.com/containerd/ttrpc/actions?query=workflow%3ACI) -[![codecov](https://codecov.io/gh/containerd/ttrpc/branch/main/graph/badge.svg)](https://codecov.io/gh/containerd/ttrpc) GRPC for low-memory environments. @@ -20,13 +19,17 @@ Please note that while this project supports generating either end of the protocol, the generated service definitions will be incompatible with regular GRPC services, as they do not speak the same protocol. +# Protocol + +See the [protocol specification](./PROTOCOL.md). + # Usage Create a gogo vanity binary (see [`cmd/protoc-gen-gogottrpc/main.go`](cmd/protoc-gen-gogottrpc/main.go) for an example with the ttrpc plugin enabled. -It's recommended to use [`protobuild`](https://github.com//stevvooe/protobuild) +It's recommended to use [`protobuild`](https://github.com/containerd/protobuild) to build the protobufs for this project, but this will work with protoc directly, if required. @@ -37,13 +40,11 @@ directly, if required. - The client and server interface are identical whereas in GRPC there is a client and server interface that are different. - The Go stdlib context package is used instead. -- No support for streams yet. # Status TODO: -- [ ] Document protocol layout - [ ] Add testing under concurrent load to ensure - [ ] Verify connection error handling diff --git a/tools/vendor/github.com/containerd/ttrpc/channel.go b/tools/vendor/github.com/containerd/ttrpc/channel.go index 81116a5e2..feafd9a6b 100644 --- a/tools/vendor/github.com/containerd/ttrpc/channel.go +++ b/tools/vendor/github.com/containerd/ttrpc/channel.go @@ -38,6 +38,26 @@ type messageType uint8 const ( messageTypeRequest messageType = 0x1 messageTypeResponse messageType = 0x2 + messageTypeData messageType = 0x3 +) + +func (mt messageType) String() string { + switch mt { + case messageTypeRequest: + return "request" + case messageTypeResponse: + return "response" + case messageTypeData: + return "data" + default: + return "unknown" + } +} + +const ( + flagRemoteClosed uint8 = 0x1 + flagRemoteOpen uint8 = 0x2 + flagNoData uint8 = 0x4 ) // messageHeader represents the fixed-length message header of 10 bytes sent @@ -46,7 +66,7 @@ type messageHeader struct { Length uint32 // length excluding this header. b[:4] StreamID uint32 // identifies which request stream message is a part of. b[4:8] Type messageType // message type b[8] - Flags uint8 // reserved b[9] + Flags uint8 // type specific flags b[9] } func readMessageHeader(p []byte, r io.Reader) (messageHeader, error) { @@ -111,22 +131,31 @@ func (ch *channel) recv() (messageHeader, []byte, error) { return mh, nil, status.Errorf(codes.ResourceExhausted, "message length %v exceed maximum message size of %v", mh.Length, messageLengthMax) } - p := ch.getmbuf(int(mh.Length)) - if _, err := io.ReadFull(ch.br, p); err != nil { - return messageHeader{}, nil, fmt.Errorf("failed reading message: %w", err) + var p []byte + if mh.Length > 0 { + p = ch.getmbuf(int(mh.Length)) + if _, err := io.ReadFull(ch.br, p); err != nil { + return messageHeader{}, nil, fmt.Errorf("failed reading message: %w", err) + } } return mh, p, nil } -func (ch *channel) send(streamID uint32, t messageType, p []byte) error { - if err := writeMessageHeader(ch.bw, ch.hwbuf[:], messageHeader{Length: uint32(len(p)), StreamID: streamID, Type: t}); err != nil { +func (ch *channel) send(streamID uint32, t messageType, flags uint8, p []byte) error { + // TODO: Error on send rather than on recv + //if len(p) > messageLengthMax { + // return status.Errorf(codes.InvalidArgument, "refusing to send, message length %v exceed maximum message size of %v", len(p), messageLengthMax) + //} + if err := writeMessageHeader(ch.bw, ch.hwbuf[:], messageHeader{Length: uint32(len(p)), StreamID: streamID, Type: t, Flags: flags}); err != nil { return err } - _, err := ch.bw.Write(p) - if err != nil { - return err + if len(p) > 0 { + _, err := ch.bw.Write(p) + if err != nil { + return err + } } return ch.bw.Flush() diff --git a/tools/vendor/github.com/containerd/ttrpc/client.go b/tools/vendor/github.com/containerd/ttrpc/client.go index 26c3dd2a9..0abc7025d 100644 --- a/tools/vendor/github.com/containerd/ttrpc/client.go +++ b/tools/vendor/github.com/containerd/ttrpc/client.go @@ -19,30 +19,30 @@ package ttrpc import ( "context" "errors" + "fmt" "io" "net" - "os" "strings" "sync" "syscall" "time" - "github.com/gogo/protobuf/proto" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" ) -// ErrClosed is returned by client methods when the underlying connection is -// closed. -var ErrClosed = errors.New("ttrpc: closed") - // Client for a ttrpc server type Client struct { codec codec conn net.Conn channel *channel - calls chan *callRequest + + streamLock sync.RWMutex + streams map[streamID]*stream + nextStreamID streamID + sendLock sync.Mutex ctx context.Context closed func() @@ -51,8 +51,6 @@ type Client struct { userCloseFunc func() userCloseWaitCh chan struct{} - errOnce sync.Once - err error interceptor UnaryClientInterceptor } @@ -73,13 +71,16 @@ func WithUnaryClientInterceptor(i UnaryClientInterceptor) ClientOpts { } } +// NewClient creates a new ttrpc client using the given connection func NewClient(conn net.Conn, opts ...ClientOpts) *Client { ctx, cancel := context.WithCancel(context.Background()) + channel := newChannel(conn) c := &Client{ codec: codec{}, conn: conn, - channel: newChannel(conn), - calls: make(chan *callRequest), + channel: channel, + streams: make(map[streamID]*stream), + nextStreamID: 1, closed: cancel, ctx: ctx, userCloseFunc: func() {}, @@ -95,13 +96,13 @@ func NewClient(conn net.Conn, opts ...ClientOpts) *Client { return c } -type callRequest struct { - ctx context.Context - req *Request - resp *Response // response will be written back here - errs chan error // error written here on completion +func (c *Client) send(sid uint32, mt messageType, flags uint8, b []byte) error { + c.sendLock.Lock() + defer c.sendLock.Unlock() + return c.channel.send(sid, mt, flags, b) } +// Call makes a unary request and returns with response func (c *Client) Call(ctx context.Context, service, method string, req, resp interface{}) error { payload, err := c.codec.Marshal(req) if err != nil { @@ -113,6 +114,7 @@ func (c *Client) Call(ctx context.Context, service, method string, req, resp int Service: service, Method: method, Payload: payload, + // TODO: metadata from context } cresp = &Response{} @@ -123,7 +125,7 @@ func (c *Client) Call(ctx context.Context, service, method string, req, resp int } if dl, ok := ctx.Deadline(); ok { - creq.TimeoutNano = dl.Sub(time.Now()).Nanoseconds() + creq.TimeoutNano = time.Until(dl).Nanoseconds() } info := &UnaryClientInfo{ @@ -143,36 +145,137 @@ func (c *Client) Call(ctx context.Context, service, method string, req, resp int return nil } -func (c *Client) dispatch(ctx context.Context, req *Request, resp *Response) error { - errs := make(chan error, 1) - call := &callRequest{ - ctx: ctx, - req: req, - resp: resp, - errs: errs, +// StreamDesc describes the stream properties, whether the stream has +// a streaming client, a streaming server, or both +type StreamDesc struct { + StreamingClient bool + StreamingServer bool +} + +// ClientStream is used to send or recv messages on the underlying stream +type ClientStream interface { + CloseSend() error + SendMsg(m interface{}) error + RecvMsg(m interface{}) error +} + +type clientStream struct { + ctx context.Context + s *stream + c *Client + desc *StreamDesc + localClosed bool + remoteClosed bool +} + +func (cs *clientStream) CloseSend() error { + if !cs.desc.StreamingClient { + return fmt.Errorf("%w: cannot close non-streaming client", ErrProtocol) } + if cs.localClosed { + return ErrStreamClosed + } + err := cs.s.send(messageTypeData, flagRemoteClosed|flagNoData, nil) + if err != nil { + return filterCloseErr(err) + } + cs.localClosed = true + return nil +} - select { - case <-ctx.Done(): - return ctx.Err() - case c.calls <- call: - case <-c.ctx.Done(): - return c.error() +func (cs *clientStream) SendMsg(m interface{}) error { + if !cs.desc.StreamingClient { + return fmt.Errorf("%w: cannot send data from non-streaming client", ErrProtocol) + } + if cs.localClosed { + return ErrStreamClosed } - select { - case <-ctx.Done(): - return ctx.Err() - case err := <-errs: + var ( + payload []byte + err error + ) + if m != nil { + payload, err = cs.c.codec.Marshal(m) + if err != nil { + return err + } + } + + err = cs.s.send(messageTypeData, 0, payload) + if err != nil { return filterCloseErr(err) - case <-c.ctx.Done(): - return c.error() } + + return nil } +func (cs *clientStream) RecvMsg(m interface{}) error { + if cs.remoteClosed { + return io.EOF + } + select { + case <-cs.ctx.Done(): + return cs.ctx.Err() + case msg, ok := <-cs.s.recv: + if !ok { + return cs.s.recvErr + } + + if msg.header.Type == messageTypeResponse { + resp := &Response{} + err := proto.Unmarshal(msg.payload[:msg.header.Length], resp) + // return the payload buffer for reuse + cs.c.channel.putmbuf(msg.payload) + if err != nil { + return err + } + + if err := cs.c.codec.Unmarshal(resp.Payload, m); err != nil { + return err + } + + if resp.Status != nil && resp.Status.Code != int32(codes.OK) { + return status.ErrorProto(resp.Status) + } + + cs.c.deleteStream(cs.s) + cs.remoteClosed = true + + return nil + } else if msg.header.Type == messageTypeData { + if !cs.desc.StreamingServer { + cs.c.deleteStream(cs.s) + cs.remoteClosed = true + return fmt.Errorf("received data from non-streaming server: %w", ErrProtocol) + } + if msg.header.Flags&flagRemoteClosed == flagRemoteClosed { + cs.c.deleteStream(cs.s) + cs.remoteClosed = true + + if msg.header.Flags&flagNoData == flagNoData { + return io.EOF + } + } + + err := cs.c.codec.Unmarshal(msg.payload[:msg.header.Length], m) + cs.c.channel.putmbuf(msg.payload) + if err != nil { + return err + } + return nil + } + + return fmt.Errorf("unexpected %q message received: %w", msg.header.Type, ErrProtocol) + } +} + +// Close closes the ttrpc connection and underlying connection func (c *Client) Close() error { c.closeOnce.Do(func() { c.closed() + + c.conn.Close() }) return nil } @@ -188,194 +291,105 @@ func (c *Client) UserOnCloseWait(ctx context.Context) error { } } -type message struct { - messageHeader - p []byte - err error -} +func (c *Client) run() { + err := c.receiveLoop() + c.Close() + c.cleanupStreams(err) -// callMap provides access to a map of active calls, guarded by a mutex. -type callMap struct { - m sync.Mutex - activeCalls map[uint32]*callRequest - closeErr error + c.userCloseFunc() + close(c.userCloseWaitCh) } -// newCallMap returns a new callMap with an empty set of active calls. -func newCallMap() *callMap { - return &callMap{ - activeCalls: make(map[uint32]*callRequest), - } -} +func (c *Client) receiveLoop() error { + for { + select { + case <-c.ctx.Done(): + return ErrClosed + default: + var ( + msg = &streamMessage{} + err error + ) + + msg.header, msg.payload, err = c.channel.recv() + if err != nil { + _, ok := status.FromError(err) + if !ok { + // treat all errors that are not an rpc status as terminal. + // all others poison the connection. + return filterCloseErr(err) + } + } + sid := streamID(msg.header.StreamID) + s := c.getStream(sid) + if s == nil { + logrus.WithField("stream", sid).Errorf("ttrpc: received message on inactive stream") + continue + } -// set adds a call entry to the map with the given streamID key. -func (cm *callMap) set(streamID uint32, cr *callRequest) error { - cm.m.Lock() - defer cm.m.Unlock() - if cm.closeErr != nil { - return cm.closeErr + if err != nil { + s.closeWithError(err) + } else { + if err := s.receive(c.ctx, msg); err != nil { + logrus.WithError(err).WithField("stream", sid).Errorf("ttrpc: failed to handle message") + } + } + } } - cm.activeCalls[streamID] = cr - return nil } -// get looks up the call entry for the given streamID key, then removes it -// from the map and returns it. -func (cm *callMap) get(streamID uint32) (cr *callRequest, ok bool, err error) { - cm.m.Lock() - defer cm.m.Unlock() - if cm.closeErr != nil { - return nil, false, cm.closeErr - } - cr, ok = cm.activeCalls[streamID] - if ok { - delete(cm.activeCalls, streamID) - } - return -} +// createStream creates a new stream and registers it with the client +// Introduce stream types for multiple or single response +func (c *Client) createStream(flags uint8, b []byte) (*stream, error) { + c.streamLock.Lock() -// abort sends the given error to each active call, and clears the map. -// Once abort has been called, any subsequent calls to the callMap will return the error passed to abort. -func (cm *callMap) abort(err error) error { - cm.m.Lock() - defer cm.m.Unlock() - if cm.closeErr != nil { - return cm.closeErr - } - for streamID, call := range cm.activeCalls { - call.errs <- err - delete(cm.activeCalls, streamID) + // Check if closed since lock acquired to prevent adding + // anything after cleanup completes + select { + case <-c.ctx.Done(): + c.streamLock.Unlock() + return nil, ErrClosed + default: } - cm.closeErr = err - return nil -} - -func (c *Client) run() { - var ( - waiters = newCallMap() - receiverDone = make(chan struct{}) - ) - // Sender goroutine - // Receives calls from dispatch, adds them to the set of active calls, and sends them - // to the server. - go func() { - var streamID uint32 = 1 - for { - select { - case <-c.ctx.Done(): - return - case call := <-c.calls: - id := streamID - streamID += 2 // enforce odd client initiated request ids - if err := waiters.set(id, call); err != nil { - call.errs <- err // errs is buffered so should not block. - continue - } - if err := c.send(id, messageTypeRequest, call.req); err != nil { - call.errs <- err // errs is buffered so should not block. - waiters.get(id) // remove from waiters set - } - } - } - }() - - // Receiver goroutine - // Receives responses from the server, looks up the call info in the set of active calls, - // and notifies the caller of the response. - go func() { - defer close(receiverDone) - for { - select { - case <-c.ctx.Done(): - c.setError(c.ctx.Err()) - return - default: - mh, p, err := c.channel.recv() - if err != nil { - _, ok := status.FromError(err) - if !ok { - // treat all errors that are not an rpc status as terminal. - // all others poison the connection. - c.setError(filterCloseErr(err)) - return - } - } - msg := &message{ - messageHeader: mh, - p: p[:mh.Length], - err: err, - } - call, ok, err := waiters.get(mh.StreamID) - if err != nil { - logrus.Errorf("ttrpc: failed to look up active call: %s", err) - continue - } - if !ok { - logrus.Errorf("ttrpc: received message for unknown channel %v", mh.StreamID) - continue - } - call.errs <- c.recv(call.resp, msg) - } - } - }() + // Stream ID should be allocated at same time + s := newStream(c.nextStreamID, c) + c.streams[s.id] = s + c.nextStreamID = c.nextStreamID + 2 - defer func() { - c.conn.Close() - c.userCloseFunc() - close(c.userCloseWaitCh) - }() + c.sendLock.Lock() + defer c.sendLock.Unlock() + c.streamLock.Unlock() - for { - select { - case <-receiverDone: - // The receiver has exited. - // don't return out, let the close of the context trigger the abort of waiters - c.Close() - case <-c.ctx.Done(): - // Abort all active calls. This will also prevent any new calls from being added - // to waiters. - waiters.abort(c.error()) - return - } + if err := c.channel.send(uint32(s.id), messageTypeRequest, flags, b); err != nil { + return s, filterCloseErr(err) } -} -func (c *Client) error() error { - c.errOnce.Do(func() { - if c.err == nil { - c.err = ErrClosed - } - }) - return c.err + return s, nil } -func (c *Client) setError(err error) { - c.errOnce.Do(func() { - c.err = err - }) +func (c *Client) deleteStream(s *stream) { + c.streamLock.Lock() + delete(c.streams, s.id) + c.streamLock.Unlock() + s.closeWithError(nil) } -func (c *Client) send(streamID uint32, mtype messageType, msg interface{}) error { - p, err := c.codec.Marshal(msg) - if err != nil { - return err - } - - return c.channel.send(streamID, mtype, p) +func (c *Client) getStream(sid streamID) *stream { + c.streamLock.RLock() + s := c.streams[sid] + c.streamLock.RUnlock() + return s } -func (c *Client) recv(resp *Response, msg *message) error { - if msg.err != nil { - return msg.err - } +func (c *Client) cleanupStreams(err error) { + c.streamLock.Lock() + defer c.streamLock.Unlock() - if msg.Type != messageTypeResponse { - return errors.New("unknown message type received") + for sid, s := range c.streams { + s.closeWithError(err) + delete(c.streams, sid) } - - defer c.channel.putmbuf(msg.p) - return proto.Unmarshal(msg.p, resp) } // filterCloseErr rewrites EOF and EPIPE errors to ErrClosed. Use when @@ -388,6 +402,8 @@ func filterCloseErr(err error) error { return nil case err == io.EOF: return ErrClosed + case errors.Is(err, io.ErrClosedPipe): + return ErrClosed case errors.Is(err, io.EOF): return ErrClosed case strings.Contains(err.Error(), "use of closed network connection"): @@ -395,11 +411,9 @@ func filterCloseErr(err error) error { default: // if we have an epipe on a write or econnreset on a read , we cast to errclosed var oerr *net.OpError - if errors.As(err, &oerr) && (oerr.Op == "write" || oerr.Op == "read") { - serr, sok := oerr.Err.(*os.SyscallError) - if sok && ((serr.Err == syscall.EPIPE && oerr.Op == "write") || - (serr.Err == syscall.ECONNRESET && oerr.Op == "read")) { - + if errors.As(err, &oerr) { + if (oerr.Op == "write" && errors.Is(err, syscall.EPIPE)) || + (oerr.Op == "read" && errors.Is(err, syscall.ECONNRESET)) { return ErrClosed } } @@ -407,3 +421,81 @@ func filterCloseErr(err error) error { return err } + +// NewStream creates a new stream with the given stream descriptor to the +// specified service and method. If not a streaming client, the request object +// may be provided. +func (c *Client) NewStream(ctx context.Context, desc *StreamDesc, service, method string, req interface{}) (ClientStream, error) { + var payload []byte + if req != nil { + var err error + payload, err = c.codec.Marshal(req) + if err != nil { + return nil, err + } + } + + request := &Request{ + Service: service, + Method: method, + Payload: payload, + // TODO: metadata from context + } + p, err := c.codec.Marshal(request) + if err != nil { + return nil, err + } + + var flags uint8 + if desc.StreamingClient { + flags = flagRemoteOpen + } else { + flags = flagRemoteClosed + } + s, err := c.createStream(flags, p) + if err != nil { + return nil, err + } + + return &clientStream{ + ctx: ctx, + s: s, + c: c, + desc: desc, + }, nil +} + +func (c *Client) dispatch(ctx context.Context, req *Request, resp *Response) error { + p, err := c.codec.Marshal(req) + if err != nil { + return err + } + + s, err := c.createStream(0, p) + if err != nil { + return err + } + defer c.deleteStream(s) + + select { + case <-ctx.Done(): + return ctx.Err() + case <-c.ctx.Done(): + return ErrClosed + case msg, ok := <-s.recv: + if !ok { + return s.recvErr + } + + if msg.header.Type == messageTypeResponse { + err = proto.Unmarshal(msg.payload[:msg.header.Length], resp) + } else { + err = fmt.Errorf("unexpected %q message received: %w", msg.header.Type, ErrProtocol) + } + + // return the payload buffer for reuse + c.channel.putmbuf(msg.payload) + + return err + } +} diff --git a/tools/vendor/github.com/containerd/ttrpc/codec.go b/tools/vendor/github.com/containerd/ttrpc/codec.go index 880634c27..3e82722a4 100644 --- a/tools/vendor/github.com/containerd/ttrpc/codec.go +++ b/tools/vendor/github.com/containerd/ttrpc/codec.go @@ -19,7 +19,7 @@ package ttrpc import ( "fmt" - "github.com/gogo/protobuf/proto" + "google.golang.org/protobuf/proto" ) type codec struct{} diff --git a/tools/vendor/github.com/containerd/ttrpc/doc.go b/tools/vendor/github.com/containerd/ttrpc/doc.go new file mode 100644 index 000000000..d80cd424c --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/doc.go @@ -0,0 +1,23 @@ +/* + 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 ttrpc defines and implements a low level simple transfer protocol +optimized for low latency and reliable connections between processes on the same +host. The protocol uses simple framing for sending requests, responses, and data +using multiple streams. +*/ +package ttrpc diff --git a/tools/vendor/github.com/containerd/ttrpc/errors.go b/tools/vendor/github.com/containerd/ttrpc/errors.go new file mode 100644 index 000000000..ec14b7952 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/errors.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 ttrpc + +import "errors" + +var ( + // ErrProtocol is a general error in the handling the protocol. + ErrProtocol = errors.New("protocol error") + + // ErrClosed is returned by client methods when the underlying connection is + // closed. + ErrClosed = errors.New("ttrpc: closed") + + // ErrServerClosed is returned when the Server has closed its connection. + ErrServerClosed = errors.New("ttrpc: server closed") + + // ErrStreamClosed is when the streaming connection is closed. + ErrStreamClosed = errors.New("ttrpc: stream closed") +) diff --git a/tools/vendor/github.com/containerd/ttrpc/handshake.go b/tools/vendor/github.com/containerd/ttrpc/handshake.go index a424b67a4..3c6b610d3 100644 --- a/tools/vendor/github.com/containerd/ttrpc/handshake.go +++ b/tools/vendor/github.com/containerd/ttrpc/handshake.go @@ -45,6 +45,6 @@ func (fn handshakerFunc) Handshake(ctx context.Context, conn net.Conn) (net.Conn return fn(ctx, conn) } -func noopHandshake(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error) { +func noopHandshake(_ context.Context, conn net.Conn) (net.Conn, interface{}, error) { return conn, nil, nil } diff --git a/tools/vendor/github.com/containerd/ttrpc/interceptor.go b/tools/vendor/github.com/containerd/ttrpc/interceptor.go index c1219dac6..7ff5e9d33 100644 --- a/tools/vendor/github.com/containerd/ttrpc/interceptor.go +++ b/tools/vendor/github.com/containerd/ttrpc/interceptor.go @@ -28,6 +28,13 @@ type UnaryClientInfo struct { FullMethod string } +// StreamServerInfo provides information about the server request +type StreamServerInfo struct { + FullMethod string + StreamingClient bool + StreamingServer bool +} + // Unmarshaler contains the server request data and allows it to be unmarshaled // into a concrete type type Unmarshaler func(interface{}) error @@ -41,10 +48,18 @@ type UnaryServerInterceptor func(context.Context, Unmarshaler, *UnaryServerInfo, // UnaryClientInterceptor specifies the interceptor function for client request/response type UnaryClientInterceptor func(context.Context, *Request, *Response, *UnaryClientInfo, Invoker) error -func defaultServerInterceptor(ctx context.Context, unmarshal Unmarshaler, info *UnaryServerInfo, method Method) (interface{}, error) { +func defaultServerInterceptor(ctx context.Context, unmarshal Unmarshaler, _ *UnaryServerInfo, method Method) (interface{}, error) { return method(ctx, unmarshal) } func defaultClientInterceptor(ctx context.Context, req *Request, resp *Response, _ *UnaryClientInfo, invoker Invoker) error { return invoker(ctx, req, resp) } + +type StreamServerInterceptor func(context.Context, StreamServer, *StreamServerInfo, StreamHandler) (interface{}, error) + +func defaultStreamServerInterceptor(ctx context.Context, ss StreamServer, _ *StreamServerInfo, stream StreamHandler) (interface{}, error) { + return stream(ctx, ss) +} + +type StreamClientInterceptor func(context.Context) diff --git a/tools/vendor/github.com/containerd/ttrpc/request.pb.go b/tools/vendor/github.com/containerd/ttrpc/request.pb.go new file mode 100644 index 000000000..3921ae5a3 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/request.pb.go @@ -0,0 +1,396 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.1 +// source: github.com/containerd/ttrpc/request.proto + +package ttrpc + +import ( + status "google.golang.org/genproto/googleapis/rpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +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 Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` + Payload []byte `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"` + TimeoutNano int64 `protobuf:"varint,4,opt,name=timeout_nano,json=timeoutNano,proto3" json:"timeout_nano,omitempty"` + Metadata []*KeyValue `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_ttrpc_request_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_ttrpc_request_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) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_github_com_containerd_ttrpc_request_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetService() string { + if x != nil { + return x.Service + } + return "" +} + +func (x *Request) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *Request) GetPayload() []byte { + if x != nil { + return x.Payload + } + return nil +} + +func (x *Request) GetTimeoutNano() int64 { + if x != nil { + return x.TimeoutNano + } + return 0 +} + +func (x *Request) GetMetadata() []*KeyValue { + if x != nil { + return x.Metadata + } + return nil +} + +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Payload []byte `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *Response) Reset() { + *x = Response{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_ttrpc_request_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_ttrpc_request_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) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_github_com_containerd_ttrpc_request_proto_rawDescGZIP(), []int{1} +} + +func (x *Response) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +func (x *Response) GetPayload() []byte { + if x != nil { + return x.Payload + } + return nil +} + +type StringList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + List []string `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"` +} + +func (x *StringList) Reset() { + *x = StringList{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_ttrpc_request_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringList) ProtoMessage() {} + +func (x *StringList) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_ttrpc_request_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) +} + +// Deprecated: Use StringList.ProtoReflect.Descriptor instead. +func (*StringList) Descriptor() ([]byte, []int) { + return file_github_com_containerd_ttrpc_request_proto_rawDescGZIP(), []int{2} +} + +func (x *StringList) GetList() []string { + if x != nil { + return x.List + } + return nil +} + +type KeyValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *KeyValue) Reset() { + *x = KeyValue{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_containerd_ttrpc_request_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KeyValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KeyValue) ProtoMessage() {} + +func (x *KeyValue) ProtoReflect() protoreflect.Message { + mi := &file_github_com_containerd_ttrpc_request_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) +} + +// Deprecated: Use KeyValue.ProtoReflect.Descriptor instead. +func (*KeyValue) Descriptor() ([]byte, []int) { + return file_github_com_containerd_ttrpc_request_proto_rawDescGZIP(), []int{3} +} + +func (x *KeyValue) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *KeyValue) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +var File_github_com_containerd_ttrpc_request_proto protoreflect.FileDescriptor + +var file_github_com_containerd_ttrpc_request_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x74, 0x74, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x74, 0x74, 0x72, + 0x70, 0x63, 0x1a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4e, 0x61, 0x6e, + 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x45, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x20, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1d, 0x5a, 0x1b, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x74, 0x74, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_github_com_containerd_ttrpc_request_proto_rawDescOnce sync.Once + file_github_com_containerd_ttrpc_request_proto_rawDescData = file_github_com_containerd_ttrpc_request_proto_rawDesc +) + +func file_github_com_containerd_ttrpc_request_proto_rawDescGZIP() []byte { + file_github_com_containerd_ttrpc_request_proto_rawDescOnce.Do(func() { + file_github_com_containerd_ttrpc_request_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_containerd_ttrpc_request_proto_rawDescData) + }) + return file_github_com_containerd_ttrpc_request_proto_rawDescData +} + +var file_github_com_containerd_ttrpc_request_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_github_com_containerd_ttrpc_request_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: ttrpc.Request + (*Response)(nil), // 1: ttrpc.Response + (*StringList)(nil), // 2: ttrpc.StringList + (*KeyValue)(nil), // 3: ttrpc.KeyValue + (*status.Status)(nil), // 4: Status +} +var file_github_com_containerd_ttrpc_request_proto_depIdxs = []int32{ + 3, // 0: ttrpc.Request.metadata:type_name -> ttrpc.KeyValue + 4, // 1: ttrpc.Response.status:type_name -> Status + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_github_com_containerd_ttrpc_request_proto_init() } +func file_github_com_containerd_ttrpc_request_proto_init() { + if File_github_com_containerd_ttrpc_request_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_containerd_ttrpc_request_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_ttrpc_request_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_ttrpc_request_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_containerd_ttrpc_request_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KeyValue); 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_github_com_containerd_ttrpc_request_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_github_com_containerd_ttrpc_request_proto_goTypes, + DependencyIndexes: file_github_com_containerd_ttrpc_request_proto_depIdxs, + MessageInfos: file_github_com_containerd_ttrpc_request_proto_msgTypes, + }.Build() + File_github_com_containerd_ttrpc_request_proto = out.File + file_github_com_containerd_ttrpc_request_proto_rawDesc = nil + file_github_com_containerd_ttrpc_request_proto_goTypes = nil + file_github_com_containerd_ttrpc_request_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/containerd/ttrpc/request.proto b/tools/vendor/github.com/containerd/ttrpc/request.proto new file mode 100644 index 000000000..37da334fc --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/request.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package ttrpc; + +import "proto/status.proto"; + +option go_package = "github.com/containerd/ttrpc"; + +message Request { + string service = 1; + string method = 2; + bytes payload = 3; + int64 timeout_nano = 4; + repeated KeyValue metadata = 5; +} + +message Response { + Status status = 1; + bytes payload = 2; +} + +message StringList { + repeated string list = 1; +} + +message KeyValue { + string key = 1; + string value = 2; +} diff --git a/tools/vendor/github.com/containerd/ttrpc/server.go b/tools/vendor/github.com/containerd/ttrpc/server.go index b0e48073e..2efda2bc9 100644 --- a/tools/vendor/github.com/containerd/ttrpc/server.go +++ b/tools/vendor/github.com/containerd/ttrpc/server.go @@ -24,6 +24,7 @@ import ( "net" "sync" "sync/atomic" + "syscall" "time" "github.com/sirupsen/logrus" @@ -31,10 +32,6 @@ import ( "google.golang.org/grpc/status" ) -var ( - ErrServerClosed = errors.New("ttrpc: server closed") -) - type Server struct { config *serverConfig services *serviceSet @@ -66,8 +63,14 @@ func NewServer(opts ...ServerOpt) (*Server, error) { }, nil } +// Register registers a map of methods to method handlers +// TODO: Remove in 2.0, does not support streams func (s *Server) Register(name string, methods map[string]Method) { - s.services.register(name, methods) + s.services.register(name, &ServiceDesc{Methods: methods}) +} + +func (s *Server) RegisterService(name string, desc *ServiceDesc) { + s.services.register(name, desc) } func (s *Server) Serve(ctx context.Context, l net.Listener) error { @@ -118,12 +121,18 @@ func (s *Server) Serve(ctx context.Context, l net.Listener) error { approved, handshake, err := handshaker.Handshake(ctx, conn) if err != nil { - logrus.WithError(err).Errorf("ttrpc: refusing connection after handshake") + logrus.WithError(err).Error("ttrpc: refusing connection after handshake") + conn.Close() + continue + } + + sc, err := s.newConn(approved, handshake) + if err != nil { + logrus.WithError(err).Error("ttrpc: create connection failed") conn.Close() continue } - sc := s.newConn(approved, handshake) go sc.run(ctx) } } @@ -142,15 +151,20 @@ func (s *Server) Shutdown(ctx context.Context) error { ticker := time.NewTicker(200 * time.Millisecond) defer ticker.Stop() for { - if s.closeIdleConns() { - return lnerr + s.closeIdleConns() + + if s.countConnection() == 0 { + break } + select { case <-ctx.Done(): return ctx.Err() case <-ticker.C: } } + + return lnerr } // Close the server without waiting for active connections. @@ -202,11 +216,18 @@ func (s *Server) closeListeners() error { return err } -func (s *Server) addConnection(c *serverConn) { +func (s *Server) addConnection(c *serverConn) error { s.mu.Lock() defer s.mu.Unlock() + select { + case <-s.done: + return ErrServerClosed + default: + } + s.connections[c] = struct{}{} + return nil } func (s *Server) delConnection(c *serverConn) { @@ -223,20 +244,17 @@ func (s *Server) countConnection() int { return len(s.connections) } -func (s *Server) closeIdleConns() bool { +func (s *Server) closeIdleConns() { s.mu.Lock() defer s.mu.Unlock() - quiescent := true + for c := range s.connections { - st, ok := c.getState() - if !ok || st != connStateIdle { - quiescent = false + if st, ok := c.getState(); !ok || st == connStateActive { continue } c.close() delete(s.connections, c) } - return quiescent } type connState int @@ -260,7 +278,7 @@ func (cs connState) String() string { } } -func (s *Server) newConn(conn net.Conn, handshake interface{}) *serverConn { +func (s *Server) newConn(conn net.Conn, handshake interface{}) (*serverConn, error) { c := &serverConn{ server: s, conn: conn, @@ -268,8 +286,11 @@ func (s *Server) newConn(conn net.Conn, handshake interface{}) *serverConn { shutdown: make(chan struct{}), } c.setState(connStateIdle) - s.addConnection(c) - return c + if err := s.addConnection(c); err != nil { + c.close() + return nil, err + } + return c, nil } type serverConn struct { @@ -301,27 +322,25 @@ func (c *serverConn) close() error { func (c *serverConn) run(sctx context.Context) { type ( - request struct { - id uint32 - req *Request - } - response struct { - id uint32 - resp *Response + id uint32 + status *status.Status + data []byte + closeStream bool + streaming bool } ) var ( - ch = newChannel(c.conn) - ctx, cancel = context.WithCancel(sctx) - active int - state connState = connStateIdle - responses = make(chan response) - requests = make(chan request) - recvErr = make(chan error, 1) - shutdown = c.shutdown - done = make(chan struct{}) + ch = newChannel(c.conn) + ctx, cancel = context.WithCancel(sctx) + state connState = connStateIdle + responses = make(chan response) + recvErr = make(chan error, 1) + done = make(chan struct{}) + streams = sync.Map{} + active int32 + lastStreamID uint32 ) defer c.conn.Close() @@ -329,27 +348,26 @@ func (c *serverConn) run(sctx context.Context) { defer close(done) defer c.server.delConnection(c) - go func(recvErr chan error) { - defer close(recvErr) - sendImmediate := func(id uint32, st *status.Status) bool { - select { - case responses <- response{ - // even though we've had an invalid stream id, we send it - // back on the same stream id so the client knows which - // stream id was bad. - id: id, - resp: &Response{ - Status: st.Proto(), - }, - }: - return true - case <-c.shutdown: - return false - case <-done: - return false - } + sendStatus := func(id uint32, st *status.Status) bool { + select { + case responses <- response{ + // even though we've had an invalid stream id, we send it + // back on the same stream id so the client knows which + // stream id was bad. + id: id, + status: st, + closeStream: true, + }: + return true + case <-c.shutdown: + return false + case <-done: + return false } + } + go func(recvErr chan error) { + defer close(recvErr) for { select { case <-c.shutdown: @@ -369,112 +387,173 @@ func (c *serverConn) run(sctx context.Context) { // in this case, we send an error for that particular message // when the status is defined. - if !sendImmediate(mh.StreamID, status) { + if !sendStatus(mh.StreamID, status) { return } continue } - if mh.Type != messageTypeRequest { - // we must ignore this for future compat. - continue - } - - var req Request - if err := c.server.codec.Unmarshal(p, &req); err != nil { - ch.putmbuf(p) - if !sendImmediate(mh.StreamID, status.Newf(codes.InvalidArgument, "unmarshal request error: %v", err)) { - return - } - continue - } - ch.putmbuf(p) - if mh.StreamID%2 != 1 { // enforce odd client initiated identifiers. - if !sendImmediate(mh.StreamID, status.Newf(codes.InvalidArgument, "StreamID must be odd for client initiated streams")) { + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "StreamID must be odd for client initiated streams")) { return } continue } - // Forward the request to the main loop. We don't wait on s.done - // because we have already accepted the client request. - select { - case requests <- request{ - id: mh.StreamID, - req: &req, - }: - case <-done: - return + if mh.Type == messageTypeData { + i, ok := streams.Load(mh.StreamID) + if !ok { + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "StreamID is no longer active")) { + return + } + } + sh := i.(*streamHandler) + if mh.Flags&flagNoData != flagNoData { + unmarshal := func(obj interface{}) error { + err := protoUnmarshal(p, obj) + ch.putmbuf(p) + return err + } + + if err := sh.data(unmarshal); err != nil { + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "data handling error: %v", err)) { + return + } + } + } + + if mh.Flags&flagRemoteClosed == flagRemoteClosed { + sh.closeSend() + if len(p) > 0 { + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "data close message cannot include data")) { + return + } + } + } + } else if mh.Type == messageTypeRequest { + if mh.StreamID <= lastStreamID { + // enforce odd client initiated identifiers. + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "StreamID cannot be re-used and must increment")) { + return + } + continue + + } + lastStreamID = mh.StreamID + + // TODO: Make request type configurable + // Unmarshaller which takes in a byte array and returns an interface? + var req Request + if err := c.server.codec.Unmarshal(p, &req); err != nil { + ch.putmbuf(p) + if !sendStatus(mh.StreamID, status.Newf(codes.InvalidArgument, "unmarshal request error: %v", err)) { + return + } + continue + } + ch.putmbuf(p) + + id := mh.StreamID + respond := func(status *status.Status, data []byte, streaming, closeStream bool) error { + select { + case responses <- response{ + id: id, + status: status, + data: data, + closeStream: closeStream, + streaming: streaming, + }: + case <-done: + return ErrClosed + } + return nil + } + sh, err := c.server.services.handle(ctx, &req, respond) + if err != nil { + status, _ := status.FromError(err) + if !sendStatus(mh.StreamID, status) { + return + } + continue + } + + streams.Store(id, sh) + atomic.AddInt32(&active, 1) } + // TODO: else we must ignore this for future compat. log this? } }(recvErr) for { - newstate := state - switch { - case active > 0: + var ( + newstate connState + shutdown chan struct{} + ) + + activeN := atomic.LoadInt32(&active) + if activeN > 0 { newstate = connStateActive shutdown = nil - case active == 0: + } else { newstate = connStateIdle shutdown = c.shutdown // only enable this branch in idle mode } - if newstate != state { c.setState(newstate) state = newstate } select { - case request := <-requests: - active++ - go func(id uint32) { - ctx, cancel := getRequestContext(ctx, request.req) - defer cancel() - - p, status := c.server.services.call(ctx, request.req.Service, request.req.Method, request.req.Payload) - resp := &Response{ - Status: status.Proto(), - Payload: p, + case response := <-responses: + if !response.streaming || response.status.Code() != codes.OK { + p, err := c.server.codec.Marshal(&Response{ + Status: response.status.Proto(), + Payload: response.data, + }) + if err != nil { + logrus.WithError(err).Error("failed marshaling response") + return } - select { - case responses <- response{ - id: id, - resp: resp, - }: - case <-done: + if err := ch.send(response.id, messageTypeResponse, 0, p); err != nil { + logrus.WithError(err).Error("failed sending message on channel") + return + } + } else { + var flags uint8 + if response.closeStream { + flags = flagRemoteClosed + } + if response.data == nil { + flags = flags | flagNoData + } + if err := ch.send(response.id, messageTypeData, flags, response.data); err != nil { + logrus.WithError(err).Error("failed sending message on channel") + return } - }(request.id) - case response := <-responses: - p, err := c.server.codec.Marshal(response.resp) - if err != nil { - logrus.WithError(err).Error("failed marshaling response") - return } - if err := ch.send(response.id, messageTypeResponse, p); err != nil { - logrus.WithError(err).Error("failed sending message on channel") - return + if response.closeStream { + // The ttrpc protocol currently does not support the case where + // the server is localClosed but not remoteClosed. Once the server + // is closing, the whole stream may be considered finished + streams.Delete(response.id) + atomic.AddInt32(&active, -1) } - - active-- case err := <-recvErr: // TODO(stevvooe): Not wildly clear what we should do in this // branch. Basically, it means that we are no longer receiving // requests due to a terminal error. recvErr = nil // connection is now "closing" - if err == io.EOF || err == io.ErrUnexpectedEOF { + if err == io.EOF || err == io.ErrUnexpectedEOF || errors.Is(err, syscall.ECONNRESET) { // The client went away and we should stop processing // requests, so that the client connection is closed return } - if err != nil { - logrus.WithError(err).Error("error receiving message") - } + logrus.WithError(err).Error("error receiving message") + // else, initiate shutdown case <-shutdown: return } diff --git a/tools/vendor/github.com/containerd/ttrpc/services.go b/tools/vendor/github.com/containerd/ttrpc/services.go index f359e9611..6aabfbb4d 100644 --- a/tools/vendor/github.com/containerd/ttrpc/services.go +++ b/tools/vendor/github.com/containerd/ttrpc/services.go @@ -25,43 +25,62 @@ import ( "path" "unsafe" - "github.com/gogo/protobuf/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" ) type Method func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) +type StreamHandler func(context.Context, StreamServer) (interface{}, error) + +type Stream struct { + Handler StreamHandler + StreamingClient bool + StreamingServer bool +} + type ServiceDesc struct { Methods map[string]Method - - // TODO(stevvooe): Add stream support. + Streams map[string]Stream } type serviceSet struct { - services map[string]ServiceDesc - interceptor UnaryServerInterceptor + services map[string]*ServiceDesc + unaryInterceptor UnaryServerInterceptor + streamInterceptor StreamServerInterceptor } func newServiceSet(interceptor UnaryServerInterceptor) *serviceSet { return &serviceSet{ - services: make(map[string]ServiceDesc), - interceptor: interceptor, + services: make(map[string]*ServiceDesc), + unaryInterceptor: interceptor, + streamInterceptor: defaultStreamServerInterceptor, } } -func (s *serviceSet) register(name string, methods map[string]Method) { +func (s *serviceSet) register(name string, desc *ServiceDesc) { if _, ok := s.services[name]; ok { panic(fmt.Errorf("duplicate service %v registered", name)) } - s.services[name] = ServiceDesc{ - Methods: methods, - } + s.services[name] = desc } -func (s *serviceSet) call(ctx context.Context, serviceName, methodName string, p []byte) ([]byte, *status.Status) { - p, err := s.dispatch(ctx, serviceName, methodName, p) +func (s *serviceSet) unaryCall(ctx context.Context, method Method, info *UnaryServerInfo, data []byte) (p []byte, st *status.Status) { + unmarshal := func(obj interface{}) error { + return protoUnmarshal(data, obj) + } + + resp, err := s.unaryInterceptor(ctx, unmarshal, info, method) + if err == nil { + if isNil(resp) { + err = errors.New("ttrpc: marshal called with nil") + } else { + p, err = protoMarshal(resp) + } + } + st, ok := status.FromError(err) if !ok { st = status.New(convertCode(err), err.Error()) @@ -70,38 +89,142 @@ func (s *serviceSet) call(ctx context.Context, serviceName, methodName string, p return p, st } -func (s *serviceSet) dispatch(ctx context.Context, serviceName, methodName string, p []byte) ([]byte, error) { - method, err := s.resolve(serviceName, methodName) - if err != nil { - return nil, err +func (s *serviceSet) streamCall(ctx context.Context, stream StreamHandler, info *StreamServerInfo, ss StreamServer) (p []byte, st *status.Status) { + resp, err := s.streamInterceptor(ctx, ss, info, stream) + if err == nil { + p, err = protoMarshal(resp) + } + st, ok := status.FromError(err) + if !ok { + st = status.New(convertCode(err), err.Error()) } + return +} - unmarshal := func(obj interface{}) error { - switch v := obj.(type) { - case proto.Message: - if err := proto.Unmarshal(p, v); err != nil { - return status.Errorf(codes.Internal, "ttrpc: error unmarshalling payload: %v", err.Error()) +func (s *serviceSet) handle(ctx context.Context, req *Request, respond func(*status.Status, []byte, bool, bool) error) (*streamHandler, error) { + srv, ok := s.services[req.Service] + if !ok { + return nil, status.Errorf(codes.Unimplemented, "service %v", req.Service) + } + + if method, ok := srv.Methods[req.Method]; ok { + go func() { + ctx, cancel := getRequestContext(ctx, req) + defer cancel() + + info := &UnaryServerInfo{ + FullMethod: fullPath(req.Service, req.Method), } - default: - return status.Errorf(codes.Internal, "ttrpc: error unsupported request type: %T", v) + p, st := s.unaryCall(ctx, method, info, req.Payload) + + respond(st, p, false, true) + }() + return nil, nil + } + if stream, ok := srv.Streams[req.Method]; ok { + ctx, cancel := getRequestContext(ctx, req) + info := &StreamServerInfo{ + FullMethod: fullPath(req.Service, req.Method), + StreamingClient: stream.StreamingClient, + StreamingServer: stream.StreamingServer, } - return nil + sh := &streamHandler{ + ctx: ctx, + respond: respond, + recv: make(chan Unmarshaler, 5), + info: info, + } + go func() { + defer cancel() + p, st := s.streamCall(ctx, stream.Handler, info, sh) + respond(st, p, stream.StreamingServer, true) + }() + + if req.Payload != nil { + unmarshal := func(obj interface{}) error { + return protoUnmarshal(req.Payload, obj) + } + if err := sh.data(unmarshal); err != nil { + return nil, err + } + } + + return sh, nil } + return nil, status.Errorf(codes.Unimplemented, "method %v", req.Method) +} + +type streamHandler struct { + ctx context.Context + respond func(*status.Status, []byte, bool, bool) error + recv chan Unmarshaler + info *StreamServerInfo + + remoteClosed bool + localClosed bool +} - info := &UnaryServerInfo{ - FullMethod: fullPath(serviceName, methodName), +func (s *streamHandler) closeSend() { + if !s.remoteClosed { + s.remoteClosed = true + close(s.recv) + } +} + +func (s *streamHandler) data(unmarshal Unmarshaler) error { + if s.remoteClosed { + return ErrStreamClosed + } + select { + case s.recv <- unmarshal: + return nil + case <-s.ctx.Done(): + return s.ctx.Err() } +} - resp, err := s.interceptor(ctx, unmarshal, info, method) +func (s *streamHandler) SendMsg(m interface{}) error { + if s.localClosed { + return ErrStreamClosed + } + p, err := protoMarshal(m) if err != nil { - return nil, err + return err } + return s.respond(nil, p, true, false) +} + +func (s *streamHandler) RecvMsg(m interface{}) error { + select { + case unmarshal, ok := <-s.recv: + if !ok { + return io.EOF + } + return unmarshal(m) + case <-s.ctx.Done(): + return s.ctx.Err() - if isNil(resp) { - return nil, errors.New("ttrpc: marshal called with nil") } +} - switch v := resp.(type) { +func protoUnmarshal(p []byte, obj interface{}) error { + switch v := obj.(type) { + case proto.Message: + if err := proto.Unmarshal(p, v); err != nil { + return status.Errorf(codes.Internal, "ttrpc: error unmarshalling payload: %v", err.Error()) + } + default: + return status.Errorf(codes.Internal, "ttrpc: error unsupported request type: %T", v) + } + return nil +} + +func protoMarshal(obj interface{}) ([]byte, error) { + if obj == nil { + return nil, nil + } + + switch v := obj.(type) { case proto.Message: r, err := proto.Marshal(v) if err != nil { @@ -114,20 +237,6 @@ func (s *serviceSet) dispatch(ctx context.Context, serviceName, methodName strin } } -func (s *serviceSet) resolve(service, method string) (Method, error) { - srv, ok := s.services[service] - if !ok { - return nil, status.Errorf(codes.Unimplemented, "service %v", service) - } - - mthd, ok := srv.Methods[method] - if !ok { - return nil, status.Errorf(codes.Unimplemented, "method %v", method) - } - - return mthd, nil -} - // convertCode maps stdlib go errors into grpc space. // // This is ripped from the grpc-go code base. diff --git a/tools/vendor/github.com/containerd/ttrpc/stream.go b/tools/vendor/github.com/containerd/ttrpc/stream.go new file mode 100644 index 000000000..5f264fe67 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/stream.go @@ -0,0 +1,81 @@ +/* + 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 ttrpc + +import ( + "context" + "sync" +) + +type streamID uint32 + +type streamMessage struct { + header messageHeader + payload []byte +} + +type stream struct { + id streamID + sender sender + recv chan *streamMessage + + closeOnce sync.Once + recvErr error +} + +func newStream(id streamID, send sender) *stream { + return &stream{ + id: id, + sender: send, + recv: make(chan *streamMessage, 1), + } +} + +func (s *stream) closeWithError(err error) error { + s.closeOnce.Do(func() { + if s.recv != nil { + close(s.recv) + if err != nil { + s.recvErr = err + } else { + s.recvErr = ErrClosed + } + + } + }) + return nil +} + +func (s *stream) send(mt messageType, flags uint8, b []byte) error { + return s.sender.send(uint32(s.id), mt, flags, b) +} + +func (s *stream) receive(ctx context.Context, msg *streamMessage) error { + if s.recvErr != nil { + return s.recvErr + } + select { + case s.recv <- msg: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +type sender interface { + send(uint32, messageType, uint8, []byte) error +} diff --git a/tools/vendor/github.com/containerd/ttrpc/stream_server.go b/tools/vendor/github.com/containerd/ttrpc/stream_server.go new file mode 100644 index 000000000..b6d1ba720 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/stream_server.go @@ -0,0 +1,22 @@ +/* + 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 ttrpc + +type StreamServer interface { + SendMsg(m interface{}) error + RecvMsg(m interface{}) error +} diff --git a/tools/vendor/github.com/containerd/ttrpc/test.proto b/tools/vendor/github.com/containerd/ttrpc/test.proto new file mode 100644 index 000000000..0e114d556 --- /dev/null +++ b/tools/vendor/github.com/containerd/ttrpc/test.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package ttrpc; + +option go_package = "github.com/containerd/ttrpc/internal"; + +message TestPayload { + string foo = 1; + int64 deadline = 2; + string metadata = 3; +} + +message EchoPayload { + int64 seq = 1; + string msg = 2; +} diff --git a/tools/vendor/github.com/containerd/ttrpc/types.go b/tools/vendor/github.com/containerd/ttrpc/types.go deleted file mode 100644 index 9a1c19a72..000000000 --- a/tools/vendor/github.com/containerd/ttrpc/types.go +++ /dev/null @@ -1,63 +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 ttrpc - -import ( - "fmt" - - spb "google.golang.org/genproto/googleapis/rpc/status" -) - -type Request struct { - Service string `protobuf:"bytes,1,opt,name=service,proto3"` - Method string `protobuf:"bytes,2,opt,name=method,proto3"` - Payload []byte `protobuf:"bytes,3,opt,name=payload,proto3"` - TimeoutNano int64 `protobuf:"varint,4,opt,name=timeout_nano,proto3"` - Metadata []*KeyValue `protobuf:"bytes,5,rep,name=metadata,proto3"` -} - -func (r *Request) Reset() { *r = Request{} } -func (r *Request) String() string { return fmt.Sprintf("%+#v", r) } -func (r *Request) ProtoMessage() {} - -type Response struct { - Status *spb.Status `protobuf:"bytes,1,opt,name=status,proto3"` - Payload []byte `protobuf:"bytes,2,opt,name=payload,proto3"` -} - -func (r *Response) Reset() { *r = Response{} } -func (r *Response) String() string { return fmt.Sprintf("%+#v", r) } -func (r *Response) ProtoMessage() {} - -type StringList struct { - List []string `protobuf:"bytes,1,rep,name=list,proto3"` -} - -func (r *StringList) Reset() { *r = StringList{} } -func (r *StringList) String() string { return fmt.Sprintf("%+#v", r) } -func (r *StringList) ProtoMessage() {} - -func makeStringList(item ...string) StringList { return StringList{List: item} } - -type KeyValue struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3"` - Value string `protobuf:"bytes,2,opt,name=value,proto3"` -} - -func (m *KeyValue) Reset() { *m = KeyValue{} } -func (*KeyValue) ProtoMessage() {} -func (m *KeyValue) String() string { return fmt.Sprintf("%+#v", m) } diff --git a/tools/vendor/github.com/containerd/ttrpc/unixcreds_linux.go b/tools/vendor/github.com/containerd/ttrpc/unixcreds_linux.go index a59dad60c..c82c9f9d4 100644 --- a/tools/vendor/github.com/containerd/ttrpc/unixcreds_linux.go +++ b/tools/vendor/github.com/containerd/ttrpc/unixcreds_linux.go @@ -29,7 +29,7 @@ import ( type UnixCredentialsFunc func(*unix.Ucred) error -func (fn UnixCredentialsFunc) Handshake(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error) { +func (fn UnixCredentialsFunc) Handshake(_ context.Context, conn net.Conn) (net.Conn, interface{}, error) { uc, err := requireUnixSocket(conn) if err != nil { return nil, nil, fmt.Errorf("ttrpc.UnixCredentialsFunc: require unix socket: %w", err) @@ -50,7 +50,7 @@ func (fn UnixCredentialsFunc) Handshake(ctx context.Context, conn net.Conn) (net } if ucredErr != nil { - return nil, nil, fmt.Errorf("ttrpc.UnixCredentialsFunc: failed to retrieve socket peer credentials: %w", err) + return nil, nil, fmt.Errorf("ttrpc.UnixCredentialsFunc: failed to retrieve socket peer credentials: %w", ucredErr) } if err := fn(ucred); err != nil { @@ -88,10 +88,6 @@ func UnixSocketRequireSameUser() UnixCredentialsFunc { return UnixSocketRequireUidGid(euid, egid) } -func requireRoot(ucred *unix.Ucred) error { - return requireUidGid(ucred, 0, 0) -} - func requireUidGid(ucred *unix.Ucred, uid, gid int) error { if (uid != -1 && uint32(uid) != ucred.Uid) || (gid != -1 && uint32(gid) != ucred.Gid) { return fmt.Errorf("ttrpc: invalid credentials: %v", syscall.EPERM) diff --git a/tools/vendor/github.com/containerd/typeurl/v2/.gitignore b/tools/vendor/github.com/containerd/typeurl/v2/.gitignore new file mode 100644 index 000000000..d53846778 --- /dev/null +++ b/tools/vendor/github.com/containerd/typeurl/v2/.gitignore @@ -0,0 +1,2 @@ +*.test +coverage.txt diff --git a/tools/vendor/github.com/containerd/typeurl/v2/LICENSE b/tools/vendor/github.com/containerd/typeurl/v2/LICENSE new file mode 100644 index 000000000..584149b6e --- /dev/null +++ b/tools/vendor/github.com/containerd/typeurl/v2/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 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 + + 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/tools/vendor/github.com/containerd/typeurl/v2/README.md b/tools/vendor/github.com/containerd/typeurl/v2/README.md new file mode 100644 index 000000000..e3d0742f4 --- /dev/null +++ b/tools/vendor/github.com/containerd/typeurl/v2/README.md @@ -0,0 +1,20 @@ +# typeurl + +[![PkgGoDev](https://pkg.go.dev/badge/github.com/containerd/typeurl)](https://pkg.go.dev/github.com/containerd/typeurl) +[![Build Status](https://github.com/containerd/typeurl/workflows/CI/badge.svg)](https://github.com/containerd/typeurl/actions?query=workflow%3ACI) +[![codecov](https://codecov.io/gh/containerd/typeurl/branch/master/graph/badge.svg)](https://codecov.io/gh/containerd/typeurl) +[![Go Report Card](https://goreportcard.com/badge/github.com/containerd/typeurl)](https://goreportcard.com/report/github.com/containerd/typeurl) + +A Go package for managing the registration, marshaling, and unmarshaling of encoded types. + +This package helps when types are sent over a ttrpc/GRPC API and marshaled as a protobuf [Any](https://pkg.go.dev/google.golang.org/protobuf@v1.27.1/types/known/anypb#Any) + +## Project details + +**typeurl** is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE). +As a containerd sub-project, you will find the: + * [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md), + * [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS), + * and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md) + +information in our [`containerd/project`](https://github.com/containerd/project) repository. diff --git a/tools/vendor/github.com/containerd/typeurl/v2/doc.go b/tools/vendor/github.com/containerd/typeurl/v2/doc.go new file mode 100644 index 000000000..c0d0fd205 --- /dev/null +++ b/tools/vendor/github.com/containerd/typeurl/v2/doc.go @@ -0,0 +1,83 @@ +/* + 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 typeurl + +// Package typeurl assists with managing the registration, marshaling, and +// unmarshaling of types encoded as protobuf.Any. +// +// A protobuf.Any is a proto message that can contain any arbitrary data. It +// consists of two components, a TypeUrl and a Value, and its proto definition +// looks like this: +// +// message Any { +// string type_url = 1; +// bytes value = 2; +// } +// +// The TypeUrl is used to distinguish the contents from other proto.Any +// messages. This typeurl library manages these URLs to enable automagic +// marshaling and unmarshaling of the contents. +// +// For example, consider this go struct: +// +// type Foo struct { +// Field1 string +// Field2 string +// } +// +// To use typeurl, types must first be registered. This is typically done in +// the init function +// +// func init() { +// typeurl.Register(&Foo{}, "Foo") +// } +// +// This will register the type Foo with the url path "Foo". The arguments to +// Register are variadic, and are used to construct a url path. Consider this +// example, from the github.com/containerd/containerd/client package: +// +// func init() { +// const prefix = "types.containerd.io" +// // register TypeUrls for commonly marshaled external types +// major := strconv.Itoa(specs.VersionMajor) +// typeurl.Register(&specs.Spec{}, prefix, "opencontainers/runtime-spec", major, "Spec") +// // this function has more Register calls, which are elided. +// } +// +// This registers several types under a more complex url, which ends up mapping +// to `types.containerd.io/opencontainers/runtime-spec/1/Spec` (or some other +// value for major). +// +// Once a type is registered, it can be marshaled to a proto.Any message simply +// by calling `MarshalAny`, like this: +// +// foo := &Foo{Field1: "value1", Field2: "value2"} +// anyFoo, err := typeurl.MarshalAny(foo) +// +// MarshalAny will resolve the correct URL for the type. If the type in +// question implements the proto.Message interface, then it will be marshaled +// as a proto message. Otherwise, it will be marshaled as json. This means that +// typeurl will work on any arbitrary data, whether or not it has a proto +// definition, as long as it can be serialized to json. +// +// To unmarshal, the process is simply inverse: +// +// iface, err := typeurl.UnmarshalAny(anyFoo) +// foo := iface.(*Foo) +// +// The correct type is automatically chosen from the type registry, and the +// returned interface can be cast straight to that type. diff --git a/tools/vendor/github.com/containerd/typeurl/v2/types.go b/tools/vendor/github.com/containerd/typeurl/v2/types.go new file mode 100644 index 000000000..41398f407 --- /dev/null +++ b/tools/vendor/github.com/containerd/typeurl/v2/types.go @@ -0,0 +1,273 @@ +/* + 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 typeurl + +import ( + "encoding/json" + "errors" + "fmt" + "path" + "reflect" + "sync" + + gogoproto "github.com/gogo/protobuf/proto" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoregistry" +) + +var ( + mu sync.RWMutex + registry = make(map[reflect.Type]string) +) + +// Definitions of common error types used throughout typeurl. +// +// These error types are used with errors.Wrap and errors.Wrapf to add context +// to an error. +// +// To detect an error class, use errors.Is() functions to tell whether an +// error is of this type. + +var ( + ErrNotFound = errors.New("not found") +) + +// Any contains an arbitrary protcol buffer message along with its type. +// +// While there is google.golang.org/protobuf/types/known/anypb.Any, +// we'd like to have our own to hide the underlying protocol buffer +// implementations from containerd clients. +// +// https://developers.google.com/protocol-buffers/docs/proto3#any +type Any interface { + // GetTypeUrl returns a URL/resource name that uniquely identifies + // the type of the serialized protocol buffer message. + GetTypeUrl() string + + // GetValue returns a valid serialized protocol buffer of the type that + // GetTypeUrl() indicates. + GetValue() []byte +} + +type anyType struct { + typeURL string + value []byte +} + +func (a *anyType) GetTypeUrl() string { + if a == nil { + return "" + } + return a.typeURL +} + +func (a *anyType) GetValue() []byte { + if a == nil { + return nil + } + return a.value +} + +// Register a type with a base URL for JSON marshaling. When the MarshalAny and +// UnmarshalAny functions are called they will treat the Any type value as JSON. +// To use protocol buffers for handling the Any value the proto.Register +// function should be used instead of this function. +func Register(v interface{}, args ...string) { + var ( + t = tryDereference(v) + p = path.Join(args...) + ) + mu.Lock() + defer mu.Unlock() + if et, ok := registry[t]; ok { + if et != p { + panic(fmt.Errorf("type registered with alternate path %q != %q", et, p)) + } + return + } + registry[t] = p +} + +// TypeURL returns the type url for a registered type. +func TypeURL(v interface{}) (string, error) { + mu.RLock() + u, ok := registry[tryDereference(v)] + mu.RUnlock() + if !ok { + switch t := v.(type) { + case proto.Message: + return string(t.ProtoReflect().Descriptor().FullName()), nil + case gogoproto.Message: + return gogoproto.MessageName(t), nil + default: + return "", fmt.Errorf("type %s: %w", reflect.TypeOf(v), ErrNotFound) + } + } + return u, nil +} + +// Is returns true if the type of the Any is the same as v. +func Is(any Any, v interface{}) bool { + // call to check that v is a pointer + tryDereference(v) + url, err := TypeURL(v) + if err != nil { + return false + } + return any.GetTypeUrl() == url +} + +// MarshalAny marshals the value v into an any with the correct TypeUrl. +// If the provided object is already a proto.Any message, then it will be +// returned verbatim. If it is of type proto.Message, it will be marshaled as a +// protocol buffer. Otherwise, the object will be marshaled to json. +func MarshalAny(v interface{}) (Any, error) { + var marshal func(v interface{}) ([]byte, error) + switch t := v.(type) { + case Any: + // avoid reserializing the type if we have an any. + return t, nil + case proto.Message: + marshal = func(v interface{}) ([]byte, error) { + return proto.Marshal(t) + } + case gogoproto.Message: + marshal = func(v interface{}) ([]byte, error) { + return gogoproto.Marshal(t) + } + default: + marshal = json.Marshal + } + + url, err := TypeURL(v) + if err != nil { + return nil, err + } + + data, err := marshal(v) + if err != nil { + return nil, err + } + return &anyType{ + typeURL: url, + value: data, + }, nil +} + +// UnmarshalAny unmarshals the any type into a concrete type. +func UnmarshalAny(any Any) (interface{}, error) { + return UnmarshalByTypeURL(any.GetTypeUrl(), any.GetValue()) +} + +// UnmarshalByTypeURL unmarshals the given type and value to into a concrete type. +func UnmarshalByTypeURL(typeURL string, value []byte) (interface{}, error) { + return unmarshal(typeURL, value, nil) +} + +// UnmarshalTo unmarshals the any type into a concrete type passed in the out +// argument. It is identical to UnmarshalAny, but lets clients provide a +// destination type through the out argument. +func UnmarshalTo(any Any, out interface{}) error { + return UnmarshalToByTypeURL(any.GetTypeUrl(), any.GetValue(), out) +} + +// UnmarshalToByTypeURL unmarshals the given type and value into a concrete type passed +// in the out argument. It is identical to UnmarshalByTypeURL, but lets clients +// provide a destination type through the out argument. +func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error { + _, err := unmarshal(typeURL, value, out) + return err +} + +func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) { + if value == nil { + return nil, nil + } + + t, err := getTypeByUrl(typeURL) + if err != nil { + return nil, err + } + + if v == nil { + v = reflect.New(t.t).Interface() + } else { + // Validate interface type provided by client + vURL, err := TypeURL(v) + if err != nil { + return nil, err + } + if typeURL != vURL { + return nil, fmt.Errorf("can't unmarshal type %q to output %q", typeURL, vURL) + } + } + + if t.isProto { + switch t := v.(type) { + case proto.Message: + err = proto.Unmarshal(value, t) + case gogoproto.Message: + err = gogoproto.Unmarshal(value, t) + } + } else { + err = json.Unmarshal(value, v) + } + + return v, err +} + +type urlType struct { + t reflect.Type + isProto bool +} + +func getTypeByUrl(url string) (urlType, error) { + mu.RLock() + for t, u := range registry { + if u == url { + mu.RUnlock() + return urlType{ + t: t, + }, nil + } + } + mu.RUnlock() + // fallback to proto registry + t := gogoproto.MessageType(url) + if t != nil { + return urlType{ + // get the underlying Elem because proto returns a pointer to the type + t: t.Elem(), + isProto: true, + }, nil + } + mt, err := protoregistry.GlobalTypes.FindMessageByURL(url) + if err != nil { + return urlType{}, fmt.Errorf("type with url %s: %w", url, ErrNotFound) + } + empty := mt.New().Interface() + return urlType{t: reflect.TypeOf(empty).Elem(), isProto: true}, nil +} + +func tryDereference(v interface{}) reflect.Type { + t := reflect.TypeOf(v) + if t.Kind() == reflect.Ptr { + // require check of pointer but dereference to register + return t.Elem() + } + panic("v is not a pointer to a type") +} diff --git a/tools/vendor/github.com/docker/distribution/.dockerignore b/tools/vendor/github.com/docker/distribution/.dockerignore new file mode 100644 index 000000000..e660fd93d --- /dev/null +++ b/tools/vendor/github.com/docker/distribution/.dockerignore @@ -0,0 +1 @@ +bin/ diff --git a/tools/vendor/github.com/docker/distribution/.golangci.yml b/tools/vendor/github.com/docker/distribution/.golangci.yml index 1ba6cb916..36c083b0f 100644 --- a/tools/vendor/github.com/docker/distribution/.golangci.yml +++ b/tools/vendor/github.com/docker/distribution/.golangci.yml @@ -18,3 +18,10 @@ run: deadline: 2m skip-dirs: - vendor + +issues: + exclude-rules: + # io/ioutil is deprecated, but won't be removed until Go v2. It's safe to ignore for the release/2.8 branch. + - text: "SA1019: \"io/ioutil\" has been deprecated since Go 1.16" + linters: + - staticcheck diff --git a/tools/vendor/github.com/docker/distribution/.mailmap b/tools/vendor/github.com/docker/distribution/.mailmap index 8f3738f3d..d94c3936e 100644 --- a/tools/vendor/github.com/docker/distribution/.mailmap +++ b/tools/vendor/github.com/docker/distribution/.mailmap @@ -44,6 +44,8 @@ Thomas Berger Thomas Berger Samuel Karp Samuel Karp Justin Cormack sayboras -CrazyMax CrazyMax <1951866+crazy-max@users.noreply.github.com> -CrazyMax +Hayley Swimelar +Jose D. Gomez R +Shengjing Zhu +Silvin Lubecki <31478878+silvin-lubecki@users.noreply.github.com> diff --git a/tools/vendor/github.com/docker/distribution/Dockerfile b/tools/vendor/github.com/docker/distribution/Dockerfile index ae8c040c7..fb54b6813 100644 --- a/tools/vendor/github.com/docker/distribution/Dockerfile +++ b/tools/vendor/github.com/docker/distribution/Dockerfile @@ -1,49 +1,59 @@ -# syntax=docker/dockerfile:1.3 +# syntax=docker/dockerfile:1 -ARG GO_VERSION=1.16.15 -ARG GORELEASER_XX_VERSION=1.2.5 +ARG GO_VERSION=1.19.9 +ARG ALPINE_VERSION=3.16 +ARG XX_VERSION=1.2.1 -FROM --platform=$BUILDPLATFORM crazymax/goreleaser-xx:${GORELEASER_XX_VERSION} AS goreleaser-xx -FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS base -COPY --from=goreleaser-xx / / -RUN apk add --no-cache file git +FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx +FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS base +COPY --from=xx / / +RUN apk add --no-cache bash coreutils file git +ENV GO111MODULE=auto +ENV CGO_ENABLED=0 WORKDIR /go/src/github.com/docker/distribution +FROM base AS version +ARG PKG="github.com/docker/distribution" +RUN --mount=target=. \ + VERSION=$(git describe --match 'v[0-9]*' --dirty='.m' --always --tags) REVISION=$(git rev-parse HEAD)$(if ! git diff --no-ext-diff --quiet --exit-code; then echo .m; fi); \ + echo "-X ${PKG}/version.Version=${VERSION#v} -X ${PKG}/version.Revision=${REVISION} -X ${PKG}/version.Package=${PKG}" | tee /tmp/.ldflags; \ + echo -n "${VERSION}" | tee /tmp/.version; + FROM base AS build -ENV GO111MODULE=auto -ENV CGO_ENABLED=0 -# GIT_REF is used by goreleaser-xx to handle the proper git ref when available. -# It will fallback to the working tree info if empty and use "git tag --points-at" -# or "git describe" to define the version info. -ARG GIT_REF ARG TARGETPLATFORM -ARG PKG="github.com/distribution/distribution" +ARG LDFLAGS="-s -w" ARG BUILDTAGS="include_oss include_gcs" -RUN --mount=type=bind,rw \ - --mount=type=cache,target=/root/.cache/go-build \ - --mount=target=/go/pkg/mod,type=cache \ - goreleaser-xx --debug \ - --name="registry" \ - --dist="/out" \ - --main="./cmd/registry" \ - --flags="-v" \ - --ldflags="-s -w -X '$PKG/version.Version={{.Version}}' -X '$PKG/version.Revision={{.Commit}}' -X '$PKG/version.Package=$PKG'" \ - --tags="$BUILDTAGS" \ - --files="LICENSE" \ - --files="README.md" - -FROM scratch AS artifact -COPY --from=build /out/*.tar.gz / -COPY --from=build /out/*.zip / -COPY --from=build /out/*.sha256 / +RUN --mount=type=bind,target=/go/src/github.com/docker/distribution,rw \ + --mount=type=cache,target=/root/.cache/go-build \ + --mount=target=/go/pkg/mod,type=cache \ + --mount=type=bind,source=/tmp/.ldflags,target=/tmp/.ldflags,from=version \ + set -x ; xx-go build -trimpath -ldflags "$(cat /tmp/.ldflags) ${LDFLAGS}" -o /usr/bin/registry ./cmd/registry \ + && xx-verify --static /usr/bin/registry FROM scratch AS binary -COPY --from=build /usr/local/bin/registry* / +COPY --from=build /usr/bin/registry / + +FROM base AS releaser +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT +WORKDIR /work +RUN --mount=from=binary,target=/build \ + --mount=type=bind,target=/src \ + --mount=type=bind,source=/tmp/.version,target=/tmp/.version,from=version \ + VERSION=$(cat /tmp/.version) \ + && mkdir -p /out \ + && cp /build/registry /src/README.md /src/LICENSE . \ + && tar -czvf "/out/registry_${VERSION#v}_${TARGETOS}_${TARGETARCH}${TARGETVARIANT}.tar.gz" * \ + && sha256sum -z "/out/registry_${VERSION#v}_${TARGETOS}_${TARGETARCH}${TARGETVARIANT}.tar.gz" | awk '{ print $1 }' > "/out/registry_${VERSION#v}_${TARGETOS}_${TARGETARCH}${TARGETVARIANT}.tar.gz.sha256" + +FROM scratch AS artifact +COPY --from=releaser /out / -FROM alpine:3.14 +FROM alpine:${ALPINE_VERSION} RUN apk add --no-cache ca-certificates COPY cmd/registry/config-dev.yml /etc/docker/registry/config.yml -COPY --from=build /usr/local/bin/registry /bin/registry +COPY --from=binary /registry /bin/registry VOLUME ["/var/lib/registry"] EXPOSE 5000 ENTRYPOINT ["registry"] diff --git a/tools/vendor/github.com/docker/distribution/Makefile b/tools/vendor/github.com/docker/distribution/Makefile index 331da2732..75e118201 100644 --- a/tools/vendor/github.com/docker/distribution/Makefile +++ b/tools/vendor/github.com/docker/distribution/Makefile @@ -50,7 +50,7 @@ version/version.go: check: ## run all linters (TODO: enable "unused", "varcheck", "ineffassign", "unconvert", "staticheck", "goimports", "structcheck") @echo "$(WHALE) $@" - golangci-lint run + @GO111MODULE=off golangci-lint run test: ## run tests, except integration test with test.short @echo "$(WHALE) $@" diff --git a/tools/vendor/github.com/docker/distribution/docker-bake.hcl b/tools/vendor/github.com/docker/distribution/docker-bake.hcl index 4dd5a100c..91686e608 100644 --- a/tools/vendor/github.com/docker/distribution/docker-bake.hcl +++ b/tools/vendor/github.com/docker/distribution/docker-bake.hcl @@ -1,15 +1,3 @@ -// GITHUB_REF is the actual ref that triggers the workflow -// https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables -variable "GITHUB_REF" { - default = "" -} - -target "_common" { - args = { - GIT_REF = GITHUB_REF - } -} - group "default" { targets = ["image-local"] } @@ -20,13 +8,11 @@ target "docker-metadata-action" { } target "binary" { - inherits = ["_common"] target = "binary" output = ["./bin"] } target "artifact" { - inherits = ["_common"] target = "artifact" output = ["./bin"] } @@ -43,8 +29,13 @@ target "artifact-all" { ] } +// Special target: https://github.com/docker/metadata-action#bake-definition +target "docker-metadata-action" { + tags = ["registry:local"] +} + target "image" { - inherits = ["_common", "docker-metadata-action"] + inherits = ["docker-metadata-action"] } target "image-local" { diff --git a/tools/vendor/github.com/docker/distribution/reference/reference.go b/tools/vendor/github.com/docker/distribution/reference/reference.go index 8c0c23b2f..b7cd00b0d 100644 --- a/tools/vendor/github.com/docker/distribution/reference/reference.go +++ b/tools/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/tools/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go b/tools/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go index a9616c58a..c3bf90f71 100644 --- a/tools/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go +++ b/tools/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go @@ -134,6 +134,19 @@ var ( }, } + invalidPaginationResponseDescriptor = ResponseDescriptor{ + Name: "Invalid pagination number", + Description: "The received parameter n was invalid in some way, as described by the error code. The client should resolve the issue and retry the request.", + StatusCode: http.StatusBadRequest, + Body: BodyDescriptor{ + ContentType: "application/json", + Format: errorsBody, + }, + ErrorCodes: []errcode.ErrorCode{ + ErrorCodePaginationNumberInvalid, + }, + } + repositoryNotFoundResponseDescriptor = ResponseDescriptor{ Name: "No Such Repository Error", StatusCode: http.StatusNotFound, @@ -490,6 +503,7 @@ var routeDescriptors = []RouteDescriptor{ }, }, Failures: []ResponseDescriptor{ + invalidPaginationResponseDescriptor, unauthorizedResponseDescriptor, repositoryNotFoundResponseDescriptor, deniedResponseDescriptor, @@ -1578,6 +1592,9 @@ var routeDescriptors = []RouteDescriptor{ }, }, }, + Failures: []ResponseDescriptor{ + invalidPaginationResponseDescriptor, + }, }, }, }, diff --git a/tools/vendor/github.com/docker/distribution/registry/api/v2/errors.go b/tools/vendor/github.com/docker/distribution/registry/api/v2/errors.go index 97d6923aa..87e9f3c14 100644 --- a/tools/vendor/github.com/docker/distribution/registry/api/v2/errors.go +++ b/tools/vendor/github.com/docker/distribution/registry/api/v2/errors.go @@ -133,4 +133,13 @@ var ( longer proceed.`, HTTPStatusCode: http.StatusNotFound, }) + + ErrorCodePaginationNumberInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ + Value: "PAGINATION_NUMBER_INVALID", + Message: "invalid number of results requested", + Description: `Returned when the "n" parameter (number of results + to return) is not an integer, "n" is negative or "n" is bigger than + the maximum allowed.`, + HTTPStatusCode: http.StatusBadRequest, + }) ) diff --git a/tools/vendor/github.com/docker/distribution/registry/client/errors.go b/tools/vendor/github.com/docker/distribution/registry/client/errors.go index 52d49d5d2..024df43dd 100644 --- a/tools/vendor/github.com/docker/distribution/registry/client/errors.go +++ b/tools/vendor/github.com/docker/distribution/registry/client/errors.go @@ -55,6 +55,8 @@ func parseHTTPErrorResponse(statusCode int, r io.Reader) error { switch statusCode { case http.StatusUnauthorized: return errcode.ErrorCodeUnauthorized.WithMessage(detailsErr.Details) + case http.StatusForbidden: + return errcode.ErrorCodeDenied.WithMessage(detailsErr.Details) case http.StatusTooManyRequests: return errcode.ErrorCodeTooManyRequests.WithMessage(detailsErr.Details) default: diff --git a/tools/vendor/github.com/docker/distribution/registry/client/repository.go b/tools/vendor/github.com/docker/distribution/registry/client/repository.go index 3e2ae66d3..04e5a3ba0 100644 --- a/tools/vendor/github.com/docker/distribution/registry/client/repository.go +++ b/tools/vendor/github.com/docker/distribution/registry/client/repository.go @@ -114,9 +114,7 @@ func (r *registry) Repositories(ctx context.Context, entries []string, last stri return 0, err } - for cnt := range ctlg.Repositories { - entries[cnt] = ctlg.Repositories[cnt] - } + copy(entries, ctlg.Repositories) numFilled = len(ctlg.Repositories) link := resp.Header.Get("Link") diff --git a/tools/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go b/tools/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go index 1d0b382fb..9120dbed6 100644 --- a/tools/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go +++ b/tools/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go @@ -180,7 +180,6 @@ func (hrs *httpReadSeeker) reader() (io.Reader, error) { // context.GetLogger(hrs.context).Infof("Range: %s", req.Header.Get("Range")) } - req.Header.Add("Accept-Encoding", "identity") resp, err := hrs.client.Do(req) if err != nil { return nil, err diff --git a/tools/vendor/github.com/docker/docker/api/types/filters/parse.go b/tools/vendor/github.com/docker/docker/api/types/filters/parse.go index 4bc91cffd..b4976a347 100644 --- a/tools/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/tools/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) } @@ -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) } diff --git a/tools/vendor/github.com/docker/docker/api/types/registry/registry.go b/tools/vendor/github.com/docker/docker/api/types/registry/registry.go index 53e47084c..62a88f5be 100644 --- a/tools/vendor/github.com/docker/docker/api/types/registry/registry.go +++ b/tools/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -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 diff --git a/tools/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go b/tools/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go index 534d66ac2..82671d8cd 100644 --- a/tools/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go +++ b/tools/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/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go b/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go index 4e67ec2f5..748912230 100644 --- a/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go +++ b/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go @@ -3,9 +3,9 @@ package ioutils // import "github.com/docker/docker/pkg/ioutils" -import "io/ioutil" +import "os" -// TempDir on Unix systems is equivalent to ioutil.TempDir. +// TempDir on Unix systems is equivalent to os.MkdirTemp. func TempDir(dir, prefix string) (string, error) { - return ioutil.TempDir(dir, prefix) + return os.MkdirTemp(dir, prefix) } diff --git a/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go b/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go index ecaba2e36..a57fd9af6 100644 --- a/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go +++ b/tools/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go @@ -1,14 +1,14 @@ package ioutils // import "github.com/docker/docker/pkg/ioutils" import ( - "io/ioutil" + "os" "github.com/docker/docker/pkg/longpath" ) -// TempDir is the equivalent of ioutil.TempDir, except that the result is in Windows longpath format. +// 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 := ioutil.TempDir(dir, prefix) + tempDir, err := os.MkdirTemp(dir, prefix) if err != nil { return "", err } diff --git a/tools/vendor/github.com/docker/docker/registry/endpoint_v1.go b/tools/vendor/github.com/docker/docker/registry/endpoint_v1.go index a355a4f87..3b5ab2f5f 100644 --- a/tools/vendor/github.com/docker/docker/registry/endpoint_v1.go +++ b/tools/vendor/github.com/docker/docker/registry/endpoint_v1.go @@ -4,7 +4,7 @@ import ( "crypto/tls" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "net/url" "strings" @@ -158,7 +158,7 @@ func (e *V1Endpoint) Ping() (PingResult, error) { defer resp.Body.Close() - jsonString, err := ioutil.ReadAll(resp.Body) + jsonString, err := io.ReadAll(resp.Body) if err != nil { return PingResult{Standalone: false}, fmt.Errorf("error while reading the http response: %s", err) } diff --git a/tools/vendor/github.com/docker/docker/registry/registry.go b/tools/vendor/github.com/docker/docker/registry/registry.go index 7a70bf28b..bcf2509f2 100644 --- a/tools/vendor/github.com/docker/docker/registry/registry.go +++ b/tools/vendor/github.com/docker/docker/registry/registry.go @@ -5,7 +5,6 @@ import ( "crypto/tls" "errors" "fmt" - "io/ioutil" "net" "net/http" "os" @@ -54,7 +53,7 @@ func newTLSConfig(hostname string, isSecure bool) (*tls.Config, error) { return tlsConfig, nil } -func hasFile(files []os.FileInfo, name string) bool { +func hasFile(files []os.DirEntry, name string) bool { for _, f := range files { if f.Name() == name { return true @@ -67,7 +66,7 @@ func hasFile(files []os.FileInfo, name string) bool { // including roots and certificate pairs and updates the // provided TLS configuration. func ReadCertsDirectory(tlsConfig *tls.Config, directory string) error { - fs, err := ioutil.ReadDir(directory) + fs, err := os.ReadDir(directory) if err != nil && !os.IsNotExist(err) { return err } @@ -82,7 +81,7 @@ func ReadCertsDirectory(tlsConfig *tls.Config, directory string) error { tlsConfig.RootCAs = systemPool } logrus.Debugf("crt: %s", filepath.Join(directory, f.Name())) - data, err := ioutil.ReadFile(filepath.Join(directory, f.Name())) + data, err := os.ReadFile(filepath.Join(directory, f.Name())) if err != nil { return err } diff --git a/tools/vendor/github.com/docker/docker/registry/service_v2.go b/tools/vendor/github.com/docker/docker/registry/service_v2.go index 3e3a5b41f..154ac7c93 100644 --- a/tools/vendor/github.com/docker/docker/registry/service_v2.go +++ b/tools/vendor/github.com/docker/docker/registry/service_v2.go @@ -9,6 +9,9 @@ import ( func (s *DefaultService) lookupV2Endpoints(hostname string) (endpoints []APIEndpoint, err error) { tlsConfig := tlsconfig.ServerDefault() + + ana := allowNondistributableArtifacts(s.config, hostname) + if hostname == DefaultNamespace || hostname == IndexHostname { for _, mirror := range s.config.Mirrors { if !strings.HasPrefix(mirror, "http://") && !strings.HasPrefix(mirror, "https://") { @@ -36,13 +39,13 @@ func (s *DefaultService) lookupV2Endpoints(hostname string) (endpoints []APIEndp Official: true, TrimHostname: true, TLSConfig: tlsConfig, + + AllowNondistributableArtifacts: ana, }) return endpoints, nil } - ana := allowNondistributableArtifacts(s.config, hostname) - tlsConfig, err = s.tlsConfig(hostname) if err != nil { return nil, err diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md index 74a378157..02a73ccfd 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md +++ b/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -1,10 +1,21 @@ # Change history of go-restful -## [v3.9.0] - 20221-07-21 +## [v3.10.1] - 2022-11-19 + +- fix broken 3.10.0 by using path package for joining paths + +## [v3.10.0] - 2022-10-11 - BROKEN + +- changed tokenizer to match std route match behavior; do not trimright the path (#511) +- Add MIME_ZIP (#512) +- Add MIME_ZIP and HEADER_ContentDisposition (#513) +- Changed how to get query parameter issue #510 + +## [v3.9.0] - 2022-07-21 - add support for http.Handler implementations to work as FilterFunction, issue #504 (thanks to https://github.com/ggicci) -## [v3.8.0] - 20221-06-06 +## [v3.8.0] - 2022-06-06 - use exact matching of allowed domain entries, issue #489 (#493) - this changes fixes [security] Authorization Bypass Through User-Controlled Key diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/constants.go b/tools/vendor/github.com/emicklei/go-restful/v3/constants.go index 203439c5e..2328bde6c 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/constants.go +++ b/tools/vendor/github.com/emicklei/go-restful/v3/constants.go @@ -7,12 +7,14 @@ package restful const ( MIME_XML = "application/xml" // Accept or Content-Type used in Consumes() and/or Produces() MIME_JSON = "application/json" // Accept or Content-Type used in Consumes() and/or Produces() + MIME_ZIP = "application/zip" // Accept or Content-Type used in Consumes() and/or Produces() MIME_OCTET = "application/octet-stream" // If Content-Type is not present in request, use the default HEADER_Allow = "Allow" HEADER_Accept = "Accept" HEADER_Origin = "Origin" HEADER_ContentType = "Content-Type" + HEADER_ContentDisposition = "Content-Disposition" HEADER_LastModified = "Last-Modified" HEADER_AcceptEncoding = "Accept-Encoding" HEADER_ContentEncoding = "Content-Encoding" diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/request.go b/tools/vendor/github.com/emicklei/go-restful/v3/request.go index 5725a0759..0020095e8 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/request.go +++ b/tools/vendor/github.com/emicklei/go-restful/v3/request.go @@ -31,7 +31,8 @@ func NewRequest(httpRequest *http.Request) *Request { // a "Unable to unmarshal content of type:" response is returned. // Valid values are restful.MIME_JSON and restful.MIME_XML // Example: -// restful.DefaultRequestContentType(restful.MIME_JSON) +// +// restful.DefaultRequestContentType(restful.MIME_JSON) func DefaultRequestContentType(mime string) { defaultRequestContentType = mime } @@ -48,7 +49,7 @@ func (r *Request) PathParameters() map[string]string { // QueryParameter returns the (first) Query parameter value by its name func (r *Request) QueryParameter(name string) string { - return r.Request.FormValue(name) + return r.Request.URL.Query().Get(name) } // QueryParameters returns the all the query parameters values by name diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/response.go b/tools/vendor/github.com/emicklei/go-restful/v3/response.go index 8f0b56aa2..a41a92cc2 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/response.go +++ b/tools/vendor/github.com/emicklei/go-restful/v3/response.go @@ -109,6 +109,9 @@ func (r *Response) EntityWriter() (EntityReaderWriter, bool) { if DefaultResponseMimeType == MIME_XML { return entityAccessRegistry.accessorAt(MIME_XML) } + if DefaultResponseMimeType == MIME_ZIP { + return entityAccessRegistry.accessorAt(MIME_ZIP) + } // Fallback to whatever the route says it can produce. // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html for _, each := range r.routeProduces { diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/route.go b/tools/vendor/github.com/emicklei/go-restful/v3/route.go index 193f4a6b0..ea05b3da8 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/route.go +++ b/tools/vendor/github.com/emicklei/go-restful/v3/route.go @@ -164,7 +164,7 @@ func tokenizePath(path string) []string { if "/" == path { return nil } - return strings.Split(strings.Trim(path, "/"), "/") + return strings.Split(strings.TrimLeft(path, "/"), "/") } // for debugging @@ -176,3 +176,5 @@ func (r *Route) String() string { func (r *Route) EnableContentEncoding(enabled bool) { r.contentEncodingEnabled = &enabled } + +var TrimRightSlashEnabled = false diff --git a/tools/vendor/github.com/emicklei/go-restful/v3/route_builder.go b/tools/vendor/github.com/emicklei/go-restful/v3/route_builder.go index 23641b6dd..830ebf148 100644 --- a/tools/vendor/github.com/emicklei/go-restful/v3/route_builder.go +++ b/tools/vendor/github.com/emicklei/go-restful/v3/route_builder.go @@ -7,6 +7,7 @@ package restful import ( "fmt" "os" + "path" "reflect" "runtime" "strings" @@ -46,11 +47,12 @@ type RouteBuilder struct { // Do evaluates each argument with the RouteBuilder itself. // This allows you to follow DRY principles without breaking the fluent programming style. // Example: -// ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500)) // -// func Returns500(b *RouteBuilder) { -// b.Returns(500, "Internal Server Error", restful.ServiceError{}) -// } +// ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500)) +// +// func Returns500(b *RouteBuilder) { +// b.Returns(500, "Internal Server Error", restful.ServiceError{}) +// } func (b *RouteBuilder) Do(oneArgBlocks ...func(*RouteBuilder)) *RouteBuilder { for _, each := range oneArgBlocks { each(b) @@ -352,7 +354,7 @@ func (b *RouteBuilder) Build() Route { } func concatPath(path1, path2 string) string { - return strings.TrimRight(path1, "/") + "/" + strings.TrimLeft(path2, "/") + return path.Join(path1, path2) } var anonymousFuncCount int32 diff --git a/tools/vendor/github.com/go-gorp/gorp/v3/.travis.yml b/tools/vendor/github.com/go-gorp/gorp/v3/.travis.yml index c53677203..958d260ac 100644 --- a/tools/vendor/github.com/go-gorp/gorp/v3/.travis.yml +++ b/tools/vendor/github.com/go-gorp/gorp/v3/.travis.yml @@ -1,7 +1,7 @@ language: go go: -- "1.12.x" -- "1.13.x" +- "1.15.x" +- "1.16.x" - tip matrix: diff --git a/tools/vendor/github.com/go-gorp/gorp/v3/README.md b/tools/vendor/github.com/go-gorp/gorp/v3/README.md index 8a4fb987b..983fe4343 100644 --- a/tools/vendor/github.com/go-gorp/gorp/v3/README.md +++ b/tools/vendor/github.com/go-gorp/gorp/v3/README.md @@ -1,11 +1,8 @@ # Go Relational Persistence -[![build status](https://img.shields.io/travis/go-gorp/gorp/master.svg)](http://travis-ci.org/go-gorp/gorp) -[![code coverage](https://img.shields.io/coveralls/go-gorp/gorp.svg)](https://coveralls.io/r/go-gorp/gorp) +[![build status](https://github.com/go-gorp/gorp/actions/workflows/go.yml/badge.svg)](https://github.com/go-gorp/gorp/actions) [![issues](https://img.shields.io/github/issues/go-gorp/gorp.svg)](https://github.com/go-gorp/gorp/issues) -[![godoc v1](https://img.shields.io/badge/godoc-v1-375EAB.svg)](https://godoc.org/gopkg.in/gorp.v1) -[![godoc v2](https://img.shields.io/badge/godoc-v2-375EAB.svg)](https://godoc.org/gopkg.in/gorp.v2) -[![godoc bleeding edge](https://img.shields.io/badge/godoc-bleeding--edge-375EAB.svg)](https://godoc.org/github.com/go-gorp/gorp) +[![Go Reference](https://pkg.go.dev/badge/github.com/go-gorp/gorp/v3.svg)](https://pkg.go.dev/github.com/go-gorp/gorp/v3) ### Update 2016-11-13: Future versions diff --git a/tools/vendor/github.com/go-gorp/gorp/v3/logging.go b/tools/vendor/github.com/go-gorp/gorp/v3/logging.go index 0ca920e7c..e8cba3db2 100644 --- a/tools/vendor/github.com/go-gorp/gorp/v3/logging.go +++ b/tools/vendor/github.com/go-gorp/gorp/v3/logging.go @@ -6,7 +6,12 @@ package gorp import "fmt" -type GorpLogger interface { +// GorpLogger is a deprecated alias of Logger. +type GorpLogger = Logger + +// Logger is the type that gorp uses to log SQL statements. +// See DbMap.TraceOn. +type Logger interface { Printf(format string, v ...interface{}) } @@ -18,10 +23,10 @@ type GorpLogger interface { // Use TraceOn if you want to spy on the SQL statements that gorp // generates. // -// Note that the base log.Logger type satisfies GorpLogger, but adapters can +// Note that the base log.Logger type satisfies Logger, but adapters can // easily be written for other logging packages (e.g., the golang-sanctioned // glog framework). -func (m *DbMap) TraceOn(prefix string, logger GorpLogger) { +func (m *DbMap) TraceOn(prefix string, logger Logger) { m.logger = logger if prefix == "" { m.logPrefix = prefix diff --git a/tools/vendor/github.com/go-gorp/gorp/v3/test_all.sh b/tools/vendor/github.com/go-gorp/gorp/v3/test_all.sh index 9d8cd0c30..91007d645 100644 --- a/tools/vendor/github.com/go-gorp/gorp/v3/test_all.sh +++ b/tools/vendor/github.com/go-gorp/gorp/v3/test_all.sh @@ -3,39 +3,21 @@ # on macs, you may need to: # export GOBUILDFLAG=-ldflags -linkmode=external -coveralls_testflags="-v -covermode=count -coverprofile=coverage.out" - echo "Running unit tests" go test -race -echo "Testing against mysql" -export GORP_TEST_DSN=gorptest/gorptest/gorptest -export GORP_TEST_DIALECT=mysql -go test -tags integration $coveralls_testflags $GOBUILDFLAG $@ . - -echo "Testing against gomysql" -export GORP_TEST_DSN=gorptest:gorptest@/gorptest -export GORP_TEST_DIALECT=gomysql -go test -tags integration $coveralls_testflags $GOBUILDFLAG $@ . - echo "Testing against postgres" -export GORP_TEST_DSN="user=gorptest password=gorptest dbname=gorptest sslmode=disable" +export GORP_TEST_DSN="host=postgres user=gorptest password=gorptest dbname=gorptest sslmode=disable" export GORP_TEST_DIALECT=postgres -go test -tags integration $coveralls_testflags $GOBUILDFLAG $@ . +go test -tags integration $GOBUILDFLAG $@ . echo "Testing against sqlite" export GORP_TEST_DSN=/tmp/gorptest.bin export GORP_TEST_DIALECT=sqlite -go test -tags integration $coveralls_testflags $GOBUILDFLAG $@ . +go test -tags integration $GOBUILDFLAG $@ . rm -f /tmp/gorptest.bin -case $(go version) in - *go1.4*) - if [ "$(type -p goveralls)" != "" ]; then - goveralls -covermode=count -coverprofile=coverage.out -service=travis-ci - elif [ -x $HOME/gopath/bin/goveralls ]; then - $HOME/gopath/bin/goveralls -covermode=count -coverprofile=coverage.out -service=travis-ci - fi - ;; - *) ;; -esac +echo "Testing against mysql" +export GORP_TEST_DSN="gorptest:gorptest@tcp(mysql)/gorptest" +export GORP_TEST_DIALECT=mysql +go test -tags integration $GOBUILDFLAG $@ . diff --git a/tools/vendor/github.com/go-logr/logr/.golangci.yaml b/tools/vendor/github.com/go-logr/logr/.golangci.yaml index 94ff801df..0cffafa7b 100644 --- a/tools/vendor/github.com/go-logr/logr/.golangci.yaml +++ b/tools/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/tools/vendor/github.com/go-logr/logr/discard.go b/tools/vendor/github.com/go-logr/logr/discard.go index 9d92a38f1..99fe8be93 100644 --- a/tools/vendor/github.com/go-logr/logr/discard.go +++ b/tools/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/tools/vendor/github.com/go-logr/logr/funcr/funcr.go b/tools/vendor/github.com/go-logr/logr/funcr/funcr.go index 7accdb0c4..e52f0cd01 100644 --- a/tools/vendor/github.com/go-logr/logr/funcr/funcr.go +++ b/tools/vendor/github.com/go-logr/logr/funcr/funcr.go @@ -21,13 +21,13 @@ limitations under the License. // github.com/go-logr/logr.LogSink with output through an arbitrary // "write" function. See New and NewJSON for details. // -// Custom LogSinks +// # Custom LogSinks // // For users who need more control, a funcr.Formatter can be embedded inside // your own custom LogSink implementation. This is useful when the LogSink // needs to implement additional methods, for example. // -// Formatting +// # Formatting // // This will respect logr.Marshaler, fmt.Stringer, and error interfaces for // values which are being logged. When rendering a struct, funcr will use Go's @@ -37,6 +37,7 @@ package funcr import ( "bytes" "encoding" + "encoding/json" "fmt" "path/filepath" "reflect" @@ -217,7 +218,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter { prefix: "", values: nil, depth: 0, - opts: opts, + opts: &opts, } return f } @@ -231,7 +232,7 @@ type Formatter struct { values []interface{} valuesStr string depth int - opts Options + opts *Options } // outputFormat indicates which outputFormat to use. @@ -447,6 +448,7 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if flags&flagRawStruct == 0 { buf.WriteByte('{') } + printComma := false // testing i>0 is not enough because of JSON omitted fields for i := 0; i < t.NumField(); i++ { fld := t.Field(i) if fld.PkgPath != "" { @@ -478,9 +480,10 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if omitempty && isEmpty(v.Field(i)) { continue } - if i > 0 { + if printComma { buf.WriteByte(',') } + printComma = true // if we got here, we are rendering a field if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" { buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1)) continue @@ -500,6 +503,20 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s } return buf.String() case reflect.Slice, reflect.Array: + // If this is outputing as JSON make sure this isn't really a json.RawMessage. + // If so just emit "as-is" and don't pretty it as that will just print + // it as [X,Y,Z,...] which isn't terribly useful vs the string form you really want. + if f.outputFormat == outputJSON { + if rm, ok := value.(json.RawMessage); ok { + // If it's empty make sure we emit an empty value as the array style would below. + if len(rm) > 0 { + buf.Write(rm) + } else { + buf.WriteString("null") + } + return buf.String() + } + } buf.WriteByte('[') for i := 0; i < v.Len(); i++ { if i > 0 { diff --git a/tools/vendor/github.com/go-logr/logr/logr.go b/tools/vendor/github.com/go-logr/logr/logr.go index c3b56b3d2..e027aea3f 100644 --- a/tools/vendor/github.com/go-logr/logr/logr.go +++ b/tools/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/tools/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/tools/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go index fb376fce2..f0610cf1e 100644 --- a/tools/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go +++ b/tools/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -26,11 +26,16 @@ var rxDupSlashes = regexp.MustCompile(`/{2,}`) // - FlagLowercaseHost // - FlagRemoveDefaultPort // - FlagRemoveDuplicateSlashes (and this was mixed in with the |) +// +// This also normalizes the URL into its urlencoded form by removing RawPath and RawFragment. func NormalizeURL(u *url.URL) { lowercaseScheme(u) lowercaseHost(u) removeDefaultPort(u) removeDuplicateSlashes(u) + + u.RawPath = "" + u.RawFragment = "" } func lowercaseScheme(u *url.URL) { diff --git a/tools/vendor/github.com/gogo/protobuf/types/any.go b/tools/vendor/github.com/gogo/protobuf/types/any.go deleted file mode 100644 index df4787de3..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/any.go +++ /dev/null @@ -1,140 +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 types - -// This file implements functions to marshal proto.Message to/from -// google.protobuf.Any message. - -import ( - "fmt" - "reflect" - "strings" - - "github.com/gogo/protobuf/proto" -) - -const googleApis = "type.googleapis.com/" - -// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. -// -// Note that regular type assertions should be done using the Is -// function. AnyMessageName is provided for less common use cases like filtering a -// sequence of Any messages based on a set of allowed message type names. -func AnyMessageName(any *Any) (string, error) { - if any == nil { - return "", fmt.Errorf("message is nil") - } - slash := strings.LastIndex(any.TypeUrl, "/") - if slash < 0 { - return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) - } - return any.TypeUrl[slash+1:], nil -} - -// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. -func MarshalAny(pb proto.Message) (*Any, error) { - value, err := proto.Marshal(pb) - if err != nil { - return nil, err - } - return &Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil -} - -// DynamicAny is a value that can be passed to UnmarshalAny to automatically -// allocate a proto.Message for the type specified in a google.protobuf.Any -// message. The allocated message is stored in the embedded proto.Message. -// -// Example: -// -// var x ptypes.DynamicAny -// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } -// fmt.Printf("unmarshaled message: %v", x.Message) -type DynamicAny struct { - proto.Message -} - -// Empty returns a new proto.Message of the type specified in a -// google.protobuf.Any message. It returns an error if corresponding message -// type isn't linked in. -func EmptyAny(any *Any) (proto.Message, error) { - aname, err := AnyMessageName(any) - if err != nil { - return nil, err - } - - t := proto.MessageType(aname) - if t == nil { - return nil, fmt.Errorf("any: message type %q isn't linked in", aname) - } - return reflect.New(t.Elem()).Interface().(proto.Message), nil -} - -// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any -// message and places the decoded result in pb. It returns an error if type of -// contents of Any message does not match type of pb message. -// -// pb can be a proto.Message, or a *DynamicAny. -func UnmarshalAny(any *Any, pb proto.Message) error { - if d, ok := pb.(*DynamicAny); ok { - if d.Message == nil { - var err error - d.Message, err = EmptyAny(any) - if err != nil { - return err - } - } - return UnmarshalAny(any, d.Message) - } - - aname, err := AnyMessageName(any) - if err != nil { - return err - } - - mname := proto.MessageName(pb) - if aname != mname { - return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) - } - return proto.Unmarshal(any.Value, pb) -} - -// Is returns true if any value contains a given message type. -func Is(any *Any, pb proto.Message) bool { - // The following is equivalent to AnyMessageName(any) == proto.MessageName(pb), - // but it avoids scanning TypeUrl for the slash. - if any == nil { - return false - } - name := proto.MessageName(pb) - prefix := len(any.TypeUrl) - len(name) - return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name -} diff --git a/tools/vendor/github.com/gogo/protobuf/types/any.pb.go b/tools/vendor/github.com/gogo/protobuf/types/any.pb.go deleted file mode 100644 index e3d4d9490..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/any.pb.go +++ /dev/null @@ -1,694 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/any.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// 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 := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, 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 -// methods only use the fully qualified type name after the last '/' -// 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; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// 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 Any struct { - // A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // 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.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // 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"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Any) Reset() { *m = Any{} } -func (*Any) ProtoMessage() {} -func (*Any) Descriptor() ([]byte, []int) { - return fileDescriptor_b53526c13ae22eb4, []int{0} -} -func (*Any) XXX_WellKnownType() string { return "Any" } -func (m *Any) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Any.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 *Any) XXX_Merge(src proto.Message) { - xxx_messageInfo_Any.Merge(m, src) -} -func (m *Any) XXX_Size() int { - return m.Size() -} -func (m *Any) XXX_DiscardUnknown() { - xxx_messageInfo_Any.DiscardUnknown(m) -} - -var xxx_messageInfo_Any proto.InternalMessageInfo - -func (m *Any) GetTypeUrl() string { - if m != nil { - return m.TypeUrl - } - return "" -} - -func (m *Any) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (*Any) XXX_MessageName() string { - return "google.protobuf.Any" -} -func init() { - proto.RegisterType((*Any)(nil), "google.protobuf.Any") -} - -func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) } - -var fileDescriptor_b53526c13ae22eb4 = []byte{ - // 211 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, - 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, - 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, - 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, - 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xaa, 0xbf, 0xf1, 0x50, 0x8e, - 0xe1, 0xc3, 0x43, 0x39, 0xc6, 0x1f, 0x0f, 0xe5, 0x18, 0x1b, 0x1e, 0xc9, 0x31, 0xae, 0x78, 0x24, - 0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, - 0x24, 0xc7, 0xf0, 0x01, 0x24, 0xfe, 0x58, 0x8e, 0xf1, 0xc4, 0x63, 0x39, 0x46, 0x2e, 0xe1, 0xe4, - 0xfc, 0x5c, 0x3d, 0x34, 0xeb, 0x9d, 0x38, 0x1c, 0xf3, 0x2a, 0x03, 0x40, 0x9c, 0x00, 0xc6, 0x28, - 0x56, 0x90, 0x8d, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x94, - 0x06, 0x40, 0x95, 0xea, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, 0x94, - 0x25, 0xb1, 0x81, 0xcd, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x81, 0x82, 0xd3, 0xed, - 0x00, 0x00, 0x00, -} - -func (this *Any) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Any) - if !ok { - that2, ok := that.(Any) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.TypeUrl != that1.TypeUrl { - if this.TypeUrl < that1.TypeUrl { - return -1 - } - return 1 - } - if c := bytes.Compare(this.Value, that1.Value); c != 0 { - return c - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Any) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Any) - if !ok { - that2, ok := that.(Any) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.TypeUrl != that1.TypeUrl { - return false - } - if !bytes.Equal(this.Value, that1.Value) { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Any) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&types.Any{") - s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 valueToGoStringAny(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 (m *Any) 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 *Any) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Any) 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.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintAny(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.TypeUrl) > 0 { - i -= len(m.TypeUrl) - copy(dAtA[i:], m.TypeUrl) - i = encodeVarintAny(dAtA, i, uint64(len(m.TypeUrl))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintAny(dAtA []byte, offset int, v uint64) int { - offset -= sovAny(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedAny(r randyAny, easy bool) *Any { - this := &Any{} - this.TypeUrl = string(randStringAny(r)) - v1 := r.Intn(100) - this.Value = make([]byte, v1) - for i := 0; i < v1; i++ { - this.Value[i] = byte(r.Intn(256)) - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedAny(r, 3) - } - return this -} - -type randyAny interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneAny(r randyAny) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringAny(r randyAny) string { - v2 := r.Intn(100) - tmps := make([]rune, v2) - for i := 0; i < v2; i++ { - tmps[i] = randUTF8RuneAny(r) - } - return string(tmps) -} -func randUnrecognizedAny(r randyAny, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldAny(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldAny(dAtA []byte, r randyAny, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) - v3 := r.Int63() - if r.Intn(2) == 0 { - v3 *= -1 - } - dAtA = encodeVarintPopulateAny(dAtA, uint64(v3)) - case 1: - dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateAny(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateAny(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *Any) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TypeUrl) - if l > 0 { - n += 1 + l + sovAny(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovAny(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovAny(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozAny(x uint64) (n int) { - return sovAny(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Any) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Any{`, - `TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringAny(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Any) 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 ErrIntOverflowAny - } - 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: Any: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Any: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAny - } - 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 ErrInvalidLengthAny - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAny - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TypeUrl = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAny - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAny - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAny - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) - if m.Value == nil { - m.Value = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAny(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAny - } - 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 skipAny(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, ErrIntOverflowAny - } - 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, ErrIntOverflowAny - } - 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, ErrIntOverflowAny - } - 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, ErrInvalidLengthAny - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupAny - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthAny - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthAny = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowAny = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupAny = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/api.pb.go b/tools/vendor/github.com/gogo/protobuf/types/api.pb.go deleted file mode 100644 index 83e886920..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/api.pb.go +++ /dev/null @@ -1,2134 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/api.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// Api is a light-weight descriptor for an API Interface. -// -// Interfaces are also described as "protocol buffer services" in some contexts, -// such as by the "service" keyword in a .proto file, but they are different -// from API Services, which represent a concrete implementation of an interface -// as opposed to simply a description of methods and bindings. They are also -// sometimes simply referred to as "APIs" in other contexts, such as the name of -// this message itself. See https://cloud.google.com/apis/design/glossary for -// detailed terminology. -type Api struct { - // The fully qualified name of this interface, including package name - // followed by the interface's simple name. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The methods of this interface, in unspecified order. - Methods []*Method `protobuf:"bytes,2,rep,name=methods,proto3" json:"methods,omitempty"` - // Any metadata attached to the interface. - Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` - // A version string for this interface. If specified, must have the form - // `major-version.minor-version`, as in `1.10`. If the minor version is - // omitted, it defaults to zero. If the entire version field is empty, the - // major version is derived from the package name, as outlined below. If the - // field is not empty, the version in the package name will be verified to be - // consistent with what is provided here. - // - // The versioning schema uses [semantic - // versioning](http://semver.org) where the major version number - // indicates a breaking change and the minor version an additive, - // non-breaking change. Both version numbers are signals to users - // what to expect from different versions, and should be carefully - // chosen based on the product plan. - // - // The major version is also reflected in the package name of the - // interface, which must end in `v`, as in - // `google.feature.v1`. For major versions 0 and 1, the suffix can - // be omitted. Zero major versions must only be used for - // experimental, non-GA interfaces. - // - // - Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` - // Source context for the protocol buffer service represented by this - // message. - SourceContext *SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` - // Included interfaces. See [Mixin][]. - Mixins []*Mixin `protobuf:"bytes,6,rep,name=mixins,proto3" json:"mixins,omitempty"` - // The source syntax of the service. - Syntax Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Api) Reset() { *m = Api{} } -func (*Api) ProtoMessage() {} -func (*Api) Descriptor() ([]byte, []int) { - return fileDescriptor_a2ec32096296c143, []int{0} -} -func (m *Api) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Api) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Api.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 *Api) XXX_Merge(src proto.Message) { - xxx_messageInfo_Api.Merge(m, src) -} -func (m *Api) XXX_Size() int { - return m.Size() -} -func (m *Api) XXX_DiscardUnknown() { - xxx_messageInfo_Api.DiscardUnknown(m) -} - -var xxx_messageInfo_Api proto.InternalMessageInfo - -func (m *Api) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Api) GetMethods() []*Method { - if m != nil { - return m.Methods - } - return nil -} - -func (m *Api) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (m *Api) GetVersion() string { - if m != nil { - return m.Version - } - return "" -} - -func (m *Api) GetSourceContext() *SourceContext { - if m != nil { - return m.SourceContext - } - return nil -} - -func (m *Api) GetMixins() []*Mixin { - if m != nil { - return m.Mixins - } - return nil -} - -func (m *Api) GetSyntax() Syntax { - if m != nil { - return m.Syntax - } - return Syntax_SYNTAX_PROTO2 -} - -func (*Api) XXX_MessageName() string { - return "google.protobuf.Api" -} - -// Method represents a method of an API interface. -type Method struct { - // The simple name of this method. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // A URL of the input message type. - RequestTypeUrl string `protobuf:"bytes,2,opt,name=request_type_url,json=requestTypeUrl,proto3" json:"request_type_url,omitempty"` - // If true, the request is streamed. - RequestStreaming bool `protobuf:"varint,3,opt,name=request_streaming,json=requestStreaming,proto3" json:"request_streaming,omitempty"` - // The URL of the output message type. - ResponseTypeUrl string `protobuf:"bytes,4,opt,name=response_type_url,json=responseTypeUrl,proto3" json:"response_type_url,omitempty"` - // If true, the response is streamed. - ResponseStreaming bool `protobuf:"varint,5,opt,name=response_streaming,json=responseStreaming,proto3" json:"response_streaming,omitempty"` - // Any metadata attached to the method. - Options []*Option `protobuf:"bytes,6,rep,name=options,proto3" json:"options,omitempty"` - // The source syntax of this method. - Syntax Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Method) Reset() { *m = Method{} } -func (*Method) ProtoMessage() {} -func (*Method) Descriptor() ([]byte, []int) { - return fileDescriptor_a2ec32096296c143, []int{1} -} -func (m *Method) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Method.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 *Method) XXX_Merge(src proto.Message) { - xxx_messageInfo_Method.Merge(m, src) -} -func (m *Method) XXX_Size() int { - return m.Size() -} -func (m *Method) XXX_DiscardUnknown() { - xxx_messageInfo_Method.DiscardUnknown(m) -} - -var xxx_messageInfo_Method proto.InternalMessageInfo - -func (m *Method) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Method) GetRequestTypeUrl() string { - if m != nil { - return m.RequestTypeUrl - } - return "" -} - -func (m *Method) GetRequestStreaming() bool { - if m != nil { - return m.RequestStreaming - } - return false -} - -func (m *Method) GetResponseTypeUrl() string { - if m != nil { - return m.ResponseTypeUrl - } - return "" -} - -func (m *Method) GetResponseStreaming() bool { - if m != nil { - return m.ResponseStreaming - } - return false -} - -func (m *Method) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (m *Method) GetSyntax() Syntax { - if m != nil { - return m.Syntax - } - return Syntax_SYNTAX_PROTO2 -} - -func (*Method) XXX_MessageName() string { - return "google.protobuf.Method" -} - -// Declares an API Interface to be included in this interface. The including -// interface must redeclare all the methods from the included interface, but -// documentation and options are inherited as follows: -// -// - If after comment and whitespace stripping, the documentation -// string of the redeclared method is empty, it will be inherited -// from the original method. -// -// - Each annotation belonging to the service config (http, -// visibility) which is not set in the redeclared method will be -// inherited. -// -// - If an http annotation is inherited, the path pattern will be -// modified as follows. Any version prefix will be replaced by the -// version of the including interface plus the [root][] path if -// specified. -// -// Example of a simple mixin: -// -// package google.acl.v1; -// service AccessControl { -// // Get the underlying ACL object. -// rpc GetAcl(GetAclRequest) returns (Acl) { -// option (google.api.http).get = "/v1/{resource=**}:getAcl"; -// } -// } -// -// package google.storage.v2; -// service Storage { -// rpc GetAcl(GetAclRequest) returns (Acl); -// -// // Get a data record. -// rpc GetData(GetDataRequest) returns (Data) { -// option (google.api.http).get = "/v2/{resource=**}"; -// } -// } -// -// Example of a mixin configuration: -// -// apis: -// - name: google.storage.v2.Storage -// mixins: -// - name: google.acl.v1.AccessControl -// -// The mixin construct implies that all methods in `AccessControl` are -// also declared with same name and request/response types in -// `Storage`. A documentation generator or annotation processor will -// see the effective `Storage.GetAcl` method after inherting -// documentation and annotations as follows: -// -// service Storage { -// // Get the underlying ACL object. -// rpc GetAcl(GetAclRequest) returns (Acl) { -// option (google.api.http).get = "/v2/{resource=**}:getAcl"; -// } -// ... -// } -// -// Note how the version in the path pattern changed from `v1` to `v2`. -// -// If the `root` field in the mixin is specified, it should be a -// relative path under which inherited HTTP paths are placed. Example: -// -// apis: -// - name: google.storage.v2.Storage -// mixins: -// - name: google.acl.v1.AccessControl -// root: acls -// -// This implies the following inherited HTTP annotation: -// -// service Storage { -// // Get the underlying ACL object. -// rpc GetAcl(GetAclRequest) returns (Acl) { -// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; -// } -// ... -// } -type Mixin struct { - // The fully qualified name of the interface which is included. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // If non-empty specifies a path under which inherited HTTP paths - // are rooted. - Root string `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Mixin) Reset() { *m = Mixin{} } -func (*Mixin) ProtoMessage() {} -func (*Mixin) Descriptor() ([]byte, []int) { - return fileDescriptor_a2ec32096296c143, []int{2} -} -func (m *Mixin) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Mixin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Mixin.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 *Mixin) XXX_Merge(src proto.Message) { - xxx_messageInfo_Mixin.Merge(m, src) -} -func (m *Mixin) XXX_Size() int { - return m.Size() -} -func (m *Mixin) XXX_DiscardUnknown() { - xxx_messageInfo_Mixin.DiscardUnknown(m) -} - -var xxx_messageInfo_Mixin proto.InternalMessageInfo - -func (m *Mixin) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Mixin) GetRoot() string { - if m != nil { - return m.Root - } - return "" -} - -func (*Mixin) XXX_MessageName() string { - return "google.protobuf.Mixin" -} -func init() { - proto.RegisterType((*Api)(nil), "google.protobuf.Api") - proto.RegisterType((*Method)(nil), "google.protobuf.Method") - proto.RegisterType((*Mixin)(nil), "google.protobuf.Mixin") -} - -func init() { proto.RegisterFile("google/protobuf/api.proto", fileDescriptor_a2ec32096296c143) } - -var fileDescriptor_a2ec32096296c143 = []byte{ - // 467 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x31, 0x6f, 0x13, 0x31, - 0x14, 0xc7, 0xeb, 0xbb, 0xe4, 0x52, 0x5c, 0x91, 0x82, 0x91, 0xc0, 0x64, 0xb0, 0x4e, 0x15, 0xc3, - 0x09, 0xc4, 0x45, 0x94, 0x4f, 0xd0, 0x20, 0xd4, 0x01, 0x21, 0xa2, 0x0b, 0x08, 0x89, 0x25, 0x4a, - 0x83, 0x09, 0x96, 0xee, 0x6c, 0x63, 0x3b, 0x90, 0x4c, 0xf0, 0x59, 0x98, 0x10, 0x23, 0xdf, 0x80, - 0xad, 0x23, 0x23, 0x23, 0xb9, 0x2e, 0x8c, 0x1d, 0x19, 0x91, 0x7d, 0xe7, 0xa6, 0x5c, 0x83, 0x04, - 0x9b, 0xdf, 0xfb, 0xff, 0xfc, 0xf7, 0x7b, 0x7f, 0xc3, 0x9b, 0x33, 0x21, 0x66, 0x39, 0xed, 0x4b, - 0x25, 0x8c, 0x38, 0x9a, 0xbf, 0xea, 0x4f, 0x24, 0x4b, 0x5d, 0x81, 0x76, 0x2b, 0x29, 0xf5, 0x52, - 0xef, 0x56, 0x93, 0xd5, 0x62, 0xae, 0xa6, 0x74, 0x3c, 0x15, 0xdc, 0xd0, 0x85, 0xa9, 0xc0, 0x5e, - 0xaf, 0x49, 0x99, 0xa5, 0xac, 0x4d, 0xf6, 0xbe, 0x06, 0x30, 0x3c, 0x90, 0x0c, 0x21, 0xd8, 0xe2, - 0x93, 0x82, 0x62, 0x10, 0x83, 0xe4, 0x52, 0xe6, 0xce, 0xe8, 0x1e, 0xec, 0x14, 0xd4, 0xbc, 0x16, - 0x2f, 0x35, 0x0e, 0xe2, 0x30, 0xd9, 0xd9, 0xbf, 0x91, 0x36, 0x06, 0x48, 0x1f, 0x3b, 0x3d, 0xf3, - 0x9c, 0xbd, 0x22, 0xa4, 0x61, 0x82, 0x6b, 0x1c, 0xfe, 0xe5, 0xca, 0x13, 0xa7, 0x67, 0x9e, 0x43, - 0x18, 0x76, 0xde, 0x52, 0xa5, 0x99, 0xe0, 0xb8, 0xe5, 0x1e, 0xf7, 0x25, 0x7a, 0x08, 0xbb, 0x7f, - 0xee, 0x83, 0xdb, 0x31, 0x48, 0x76, 0xf6, 0xc9, 0x05, 0xcf, 0x91, 0xc3, 0x1e, 0x54, 0x54, 0x76, - 0x59, 0x9f, 0x2f, 0x51, 0x0a, 0xa3, 0x82, 0x2d, 0x18, 0xd7, 0x38, 0x72, 0x23, 0x5d, 0xbf, 0xb8, - 0x85, 0x95, 0xb3, 0x9a, 0x42, 0x7d, 0x18, 0xe9, 0x25, 0x37, 0x93, 0x05, 0xee, 0xc4, 0x20, 0xe9, - 0x6e, 0x58, 0x61, 0xe4, 0xe4, 0xac, 0xc6, 0xf6, 0xbe, 0x04, 0x30, 0xaa, 0x82, 0xd8, 0x18, 0x63, - 0x02, 0xaf, 0x28, 0xfa, 0x66, 0x4e, 0xb5, 0x19, 0xdb, 0xe0, 0xc7, 0x73, 0x95, 0xe3, 0xc0, 0xe9, - 0xdd, 0xba, 0xff, 0x74, 0x29, 0xe9, 0x33, 0x95, 0xa3, 0x3b, 0xf0, 0xaa, 0x27, 0xb5, 0x51, 0x74, - 0x52, 0x30, 0x3e, 0xc3, 0x61, 0x0c, 0x92, 0xed, 0xcc, 0x5b, 0x8c, 0x7c, 0x1f, 0xdd, 0xb6, 0xb0, - 0x96, 0x82, 0x6b, 0xba, 0xf6, 0xad, 0x12, 0xdc, 0xf5, 0x82, 0x37, 0xbe, 0x0b, 0xd1, 0x19, 0xbb, - 0x76, 0x6e, 0x3b, 0xe7, 0x33, 0x97, 0xb5, 0xf5, 0xb9, 0x5f, 0x8c, 0xfe, 0xf1, 0x17, 0xff, 0x3b, - 0xb4, 0x3e, 0x6c, 0xbb, 0xd8, 0x37, 0x46, 0x86, 0x60, 0x4b, 0x09, 0x61, 0xea, 0x98, 0xdc, 0x79, - 0xf0, 0xfe, 0xfb, 0x8a, 0x6c, 0x9d, 0xae, 0x08, 0xf8, 0xb5, 0x22, 0xe0, 0x43, 0x49, 0xc0, 0xa7, - 0x92, 0x80, 0xe3, 0x92, 0x80, 0x6f, 0x25, 0x01, 0x3f, 0x4a, 0x02, 0x7e, 0x96, 0x64, 0xeb, 0xd4, - 0xf6, 0x4f, 0x08, 0x38, 0x3e, 0x21, 0x00, 0x5e, 0x9b, 0x8a, 0xa2, 0x39, 0xc6, 0x60, 0xfb, 0x40, - 0xb2, 0xa1, 0x2d, 0x86, 0xe0, 0x45, 0xdb, 0xe6, 0xa6, 0x3f, 0x06, 0xe1, 0xe1, 0x70, 0xf0, 0x39, - 0x20, 0x87, 0x15, 0x3a, 0xf4, 0x13, 0x3f, 0xa7, 0x79, 0xfe, 0x88, 0x8b, 0x77, 0xdc, 0xc6, 0xa8, - 0x8f, 0x22, 0xe7, 0x71, 0xff, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x64, 0x40, 0x40, 0xa1, - 0x03, 0x00, 0x00, -} - -func (this *Api) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Api) - if !ok { - that2, ok := that.(Api) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if len(this.Methods) != len(that1.Methods) { - if len(this.Methods) < len(that1.Methods) { - return -1 - } - return 1 - } - for i := range this.Methods { - if c := this.Methods[i].Compare(that1.Methods[i]); c != 0 { - return c - } - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if this.Version != that1.Version { - if this.Version < that1.Version { - return -1 - } - return 1 - } - if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { - return c - } - if len(this.Mixins) != len(that1.Mixins) { - if len(this.Mixins) < len(that1.Mixins) { - return -1 - } - return 1 - } - for i := range this.Mixins { - if c := this.Mixins[i].Compare(that1.Mixins[i]); c != 0 { - return c - } - } - if this.Syntax != that1.Syntax { - if this.Syntax < that1.Syntax { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Method) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Method) - if !ok { - that2, ok := that.(Method) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if this.RequestTypeUrl != that1.RequestTypeUrl { - if this.RequestTypeUrl < that1.RequestTypeUrl { - return -1 - } - return 1 - } - if this.RequestStreaming != that1.RequestStreaming { - if !this.RequestStreaming { - return -1 - } - return 1 - } - if this.ResponseTypeUrl != that1.ResponseTypeUrl { - if this.ResponseTypeUrl < that1.ResponseTypeUrl { - return -1 - } - return 1 - } - if this.ResponseStreaming != that1.ResponseStreaming { - if !this.ResponseStreaming { - return -1 - } - return 1 - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if this.Syntax != that1.Syntax { - if this.Syntax < that1.Syntax { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Mixin) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Mixin) - if !ok { - that2, ok := that.(Mixin) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if this.Root != that1.Root { - if this.Root < that1.Root { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Api) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Api) - if !ok { - that2, ok := that.(Api) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if len(this.Methods) != len(that1.Methods) { - return false - } - for i := range this.Methods { - if !this.Methods[i].Equal(that1.Methods[i]) { - return false - } - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if this.Version != that1.Version { - return false - } - if !this.SourceContext.Equal(that1.SourceContext) { - return false - } - if len(this.Mixins) != len(that1.Mixins) { - return false - } - for i := range this.Mixins { - if !this.Mixins[i].Equal(that1.Mixins[i]) { - return false - } - } - if this.Syntax != that1.Syntax { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Method) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Method) - if !ok { - that2, ok := that.(Method) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if this.RequestTypeUrl != that1.RequestTypeUrl { - return false - } - if this.RequestStreaming != that1.RequestStreaming { - return false - } - if this.ResponseTypeUrl != that1.ResponseTypeUrl { - return false - } - if this.ResponseStreaming != that1.ResponseStreaming { - return false - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if this.Syntax != that1.Syntax { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Mixin) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Mixin) - if !ok { - that2, ok := that.(Mixin) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if this.Root != that1.Root { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Api) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 11) - s = append(s, "&types.Api{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - if this.Methods != nil { - s = append(s, "Methods: "+fmt.Sprintf("%#v", this.Methods)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - s = append(s, "Version: "+fmt.Sprintf("%#v", this.Version)+",\n") - if this.SourceContext != nil { - s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") - } - if this.Mixins != nil { - s = append(s, "Mixins: "+fmt.Sprintf("%#v", this.Mixins)+",\n") - } - s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\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 *Method) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 11) - s = append(s, "&types.Method{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - s = append(s, "RequestTypeUrl: "+fmt.Sprintf("%#v", this.RequestTypeUrl)+",\n") - s = append(s, "RequestStreaming: "+fmt.Sprintf("%#v", this.RequestStreaming)+",\n") - s = append(s, "ResponseTypeUrl: "+fmt.Sprintf("%#v", this.ResponseTypeUrl)+",\n") - s = append(s, "ResponseStreaming: "+fmt.Sprintf("%#v", this.ResponseStreaming)+",\n") - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\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 *Mixin) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&types.Mixin{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - s = append(s, "Root: "+fmt.Sprintf("%#v", this.Root)+",\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 valueToGoStringApi(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 (m *Api) 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 *Api) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Api) 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.Syntax != 0 { - i = encodeVarintApi(dAtA, i, uint64(m.Syntax)) - i-- - dAtA[i] = 0x38 - } - if len(m.Mixins) > 0 { - for iNdEx := len(m.Mixins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Mixins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if m.SourceContext != nil { - { - size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.Version) > 0 { - i -= len(m.Version) - copy(dAtA[i:], m.Version) - i = encodeVarintApi(dAtA, i, uint64(len(m.Version))) - i-- - dAtA[i] = 0x22 - } - if len(m.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Methods) > 0 { - for iNdEx := len(m.Methods) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Methods[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Method) 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 *Method) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Method) 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.Syntax != 0 { - i = encodeVarintApi(dAtA, i, uint64(m.Syntax)) - i-- - dAtA[i] = 0x38 - } - if len(m.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if m.ResponseStreaming { - i-- - if m.ResponseStreaming { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if len(m.ResponseTypeUrl) > 0 { - i -= len(m.ResponseTypeUrl) - copy(dAtA[i:], m.ResponseTypeUrl) - i = encodeVarintApi(dAtA, i, uint64(len(m.ResponseTypeUrl))) - i-- - dAtA[i] = 0x22 - } - if m.RequestStreaming { - i-- - if m.RequestStreaming { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.RequestTypeUrl) > 0 { - i -= len(m.RequestTypeUrl) - copy(dAtA[i:], m.RequestTypeUrl) - i = encodeVarintApi(dAtA, i, uint64(len(m.RequestTypeUrl))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Mixin) 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 *Mixin) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Mixin) 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.Root) > 0 { - i -= len(m.Root) - copy(dAtA[i:], m.Root) - i = encodeVarintApi(dAtA, i, uint64(len(m.Root))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintApi(dAtA []byte, offset int, v uint64) int { - offset -= sovApi(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedApi(r randyApi, easy bool) *Api { - this := &Api{} - this.Name = string(randStringApi(r)) - if r.Intn(5) != 0 { - v1 := r.Intn(5) - this.Methods = make([]*Method, v1) - for i := 0; i < v1; i++ { - this.Methods[i] = NewPopulatedMethod(r, easy) - } - } - if r.Intn(5) != 0 { - v2 := r.Intn(5) - this.Options = make([]*Option, v2) - for i := 0; i < v2; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - this.Version = string(randStringApi(r)) - if r.Intn(5) != 0 { - this.SourceContext = NewPopulatedSourceContext(r, easy) - } - if r.Intn(5) != 0 { - v3 := r.Intn(5) - this.Mixins = make([]*Mixin, v3) - for i := 0; i < v3; i++ { - this.Mixins[i] = NewPopulatedMixin(r, easy) - } - } - this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedApi(r, 8) - } - return this -} - -func NewPopulatedMethod(r randyApi, easy bool) *Method { - this := &Method{} - this.Name = string(randStringApi(r)) - this.RequestTypeUrl = string(randStringApi(r)) - this.RequestStreaming = bool(bool(r.Intn(2) == 0)) - this.ResponseTypeUrl = string(randStringApi(r)) - this.ResponseStreaming = bool(bool(r.Intn(2) == 0)) - if r.Intn(5) != 0 { - v4 := r.Intn(5) - this.Options = make([]*Option, v4) - for i := 0; i < v4; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedApi(r, 8) - } - return this -} - -func NewPopulatedMixin(r randyApi, easy bool) *Mixin { - this := &Mixin{} - this.Name = string(randStringApi(r)) - this.Root = string(randStringApi(r)) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedApi(r, 3) - } - return this -} - -type randyApi interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneApi(r randyApi) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringApi(r randyApi) string { - v5 := r.Intn(100) - tmps := make([]rune, v5) - for i := 0; i < v5; i++ { - tmps[i] = randUTF8RuneApi(r) - } - return string(tmps) -} -func randUnrecognizedApi(r randyApi, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldApi(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldApi(dAtA []byte, r randyApi, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) - v6 := r.Int63() - if r.Intn(2) == 0 { - v6 *= -1 - } - dAtA = encodeVarintPopulateApi(dAtA, uint64(v6)) - case 1: - dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateApi(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateApi(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *Api) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - if len(m.Methods) > 0 { - for _, e := range m.Methods { - l = e.Size() - n += 1 + l + sovApi(uint64(l)) - } - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovApi(uint64(l)) - } - } - l = len(m.Version) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - if m.SourceContext != nil { - l = m.SourceContext.Size() - n += 1 + l + sovApi(uint64(l)) - } - if len(m.Mixins) > 0 { - for _, e := range m.Mixins { - l = e.Size() - n += 1 + l + sovApi(uint64(l)) - } - } - if m.Syntax != 0 { - n += 1 + sovApi(uint64(m.Syntax)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Method) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - l = len(m.RequestTypeUrl) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - if m.RequestStreaming { - n += 2 - } - l = len(m.ResponseTypeUrl) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - if m.ResponseStreaming { - n += 2 - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovApi(uint64(l)) - } - } - if m.Syntax != 0 { - n += 1 + sovApi(uint64(m.Syntax)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Mixin) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - l = len(m.Root) - if l > 0 { - n += 1 + l + sovApi(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovApi(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozApi(x uint64) (n int) { - return sovApi(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Api) String() string { - if this == nil { - return "nil" - } - repeatedStringForMethods := "[]*Method{" - for _, f := range this.Methods { - repeatedStringForMethods += strings.Replace(f.String(), "Method", "Method", 1) + "," - } - repeatedStringForMethods += "}" - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(fmt.Sprintf("%v", f), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - repeatedStringForMixins := "[]*Mixin{" - for _, f := range this.Mixins { - repeatedStringForMixins += strings.Replace(f.String(), "Mixin", "Mixin", 1) + "," - } - repeatedStringForMixins += "}" - s := strings.Join([]string{`&Api{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Methods:` + repeatedStringForMethods + `,`, - `Options:` + repeatedStringForOptions + `,`, - `Version:` + fmt.Sprintf("%v", this.Version) + `,`, - `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, - `Mixins:` + repeatedStringForMixins + `,`, - `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Method) String() string { - if this == nil { - return "nil" - } - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(fmt.Sprintf("%v", f), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - s := strings.Join([]string{`&Method{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `RequestTypeUrl:` + fmt.Sprintf("%v", this.RequestTypeUrl) + `,`, - `RequestStreaming:` + fmt.Sprintf("%v", this.RequestStreaming) + `,`, - `ResponseTypeUrl:` + fmt.Sprintf("%v", this.ResponseTypeUrl) + `,`, - `ResponseStreaming:` + fmt.Sprintf("%v", this.ResponseStreaming) + `,`, - `Options:` + repeatedStringForOptions + `,`, - `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Mixin) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Mixin{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Root:` + fmt.Sprintf("%v", this.Root) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringApi(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Api) 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 ErrIntOverflowApi - } - 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: Api: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Api: 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 ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Methods", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Methods = append(m.Methods, &Method{}) - if err := m.Methods[len(m.Methods)-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 Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-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 Version", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Version = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SourceContext", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SourceContext == nil { - m.SourceContext = &SourceContext{} - } - if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Mixins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Mixins = append(m.Mixins, &Mixin{}) - if err := m.Mixins[len(m.Mixins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) - } - m.Syntax = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Syntax |= Syntax(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipApi(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApi - } - 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 *Method) 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 ErrIntOverflowApi - } - 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: Method: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Method: 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 ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RequestTypeUrl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RequestTypeUrl = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RequestStreaming", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.RequestStreaming = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResponseTypeUrl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ResponseTypeUrl = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ResponseStreaming", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ResponseStreaming = bool(v != 0) - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) - } - m.Syntax = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Syntax |= Syntax(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipApi(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApi - } - 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 *Mixin) 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 ErrIntOverflowApi - } - 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: Mixin: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Mixin: 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 ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Root", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - 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 ErrInvalidLengthApi - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Root = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApi(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApi - } - 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 skipApi(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, ErrIntOverflowApi - } - 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, ErrIntOverflowApi - } - 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, ErrIntOverflowApi - } - 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, ErrInvalidLengthApi - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupApi - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthApi - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthApi = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupApi = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/duration.go b/tools/vendor/github.com/gogo/protobuf/types/duration.go deleted file mode 100644 index 979b8e78a..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/duration.go +++ /dev/null @@ -1,100 +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 types - -// This file implements conversions between google.protobuf.Duration -// and time.Duration. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Range of a Duration in seconds, as specified in - // google/protobuf/duration.proto. This is about 10,000 years in seconds. - maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) - minSeconds = -maxSeconds -) - -// validateDuration determines whether the Duration is valid according to the -// definition in google/protobuf/duration.proto. A valid Duration -// may still be too large to fit into a time.Duration (the range of Duration -// is about 10,000 years, and the range of time.Duration is about 290). -func validateDuration(d *Duration) error { - if d == nil { - return errors.New("duration: nil Duration") - } - if d.Seconds < minSeconds || d.Seconds > maxSeconds { - return fmt.Errorf("duration: %#v: seconds out of range", d) - } - if d.Nanos <= -1e9 || d.Nanos >= 1e9 { - return fmt.Errorf("duration: %#v: nanos out of range", d) - } - // Seconds and Nanos must have the same sign, unless d.Nanos is zero. - if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { - return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) - } - return nil -} - -// DurationFromProto converts a Duration to a time.Duration. DurationFromProto -// returns an error if the Duration is invalid or is too large to be -// represented in a time.Duration. -func DurationFromProto(p *Duration) (time.Duration, error) { - if err := validateDuration(p); err != nil { - return 0, err - } - d := time.Duration(p.Seconds) * time.Second - if int64(d/time.Second) != p.Seconds { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - if p.Nanos != 0 { - d += time.Duration(p.Nanos) * time.Nanosecond - if (d < 0) != (p.Nanos < 0) { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - } - return d, nil -} - -// DurationProto converts a time.Duration to a Duration. -func DurationProto(d time.Duration) *Duration { - nanos := d.Nanoseconds() - secs := nanos / 1e9 - nanos -= secs * 1e9 - return &Duration{ - Seconds: secs, - Nanos: int32(nanos), - } -} diff --git a/tools/vendor/github.com/gogo/protobuf/types/duration.pb.go b/tools/vendor/github.com/gogo/protobuf/types/duration.pb.go deleted file mode 100644 index 4deafcb1c..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/duration.pb.go +++ /dev/null @@ -1,517 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/duration.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// A Duration represents a signed, fixed-length span of time represented -// as a count of seconds and fractions of seconds at nanosecond -// resolution. It is independent of any calendar and concepts like "day" -// or "month". It is related to Timestamp in that the difference between -// two Timestamp values is a Duration and it can be added or subtracted -// from a Timestamp. Range is approximately +-10,000 years. -// -// # Examples -// -// Example 1: Compute Duration from two Timestamps in pseudo code. -// -// Timestamp start = ...; -// Timestamp end = ...; -// Duration duration = ...; -// -// 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 (durations.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 = ...; -// -// 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; -// } -// -// Example 3: Compute Duration from datetime.timedelta in Python. -// -// td = datetime.timedelta(days=3, minutes=10) -// duration = Duration() -// duration.FromTimedelta(td) -// -// # JSON Mapping -// -// In JSON format, the Duration type is encoded as a string rather than an -// object, where the string ends in the suffix "s" (indicating seconds) and -// is preceded by the number of seconds, with nanoseconds expressed as -// fractional seconds. For example, 3 seconds with 0 nanoseconds should be -// 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 { - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. Note: these bounds are computed from: - // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Duration) Reset() { *m = Duration{} } -func (*Duration) ProtoMessage() {} -func (*Duration) Descriptor() ([]byte, []int) { - return fileDescriptor_23597b2ebd7ac6c5, []int{0} -} -func (*Duration) XXX_WellKnownType() string { return "Duration" } -func (m *Duration) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Duration.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 *Duration) XXX_Merge(src proto.Message) { - xxx_messageInfo_Duration.Merge(m, src) -} -func (m *Duration) XXX_Size() int { - return m.Size() -} -func (m *Duration) XXX_DiscardUnknown() { - xxx_messageInfo_Duration.DiscardUnknown(m) -} - -var xxx_messageInfo_Duration proto.InternalMessageInfo - -func (m *Duration) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Duration) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -func (*Duration) XXX_MessageName() string { - return "google.protobuf.Duration" -} -func init() { - proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") -} - -func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) } - -var fileDescriptor_23597b2ebd7ac6c5 = []byte{ - // 209 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, - 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, - 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, - 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, - 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0x7f, 0xe3, 0xa1, 0x1c, - 0xc3, 0x87, 0x87, 0x72, 0x8c, 0x2b, 0x1e, 0xc9, 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, - 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e, 0xc9, 0x31, 0x7c, 0x78, 0x24, 0xc7, 0xb8, 0xe2, - 0xb1, 0x1c, 0xe3, 0x89, 0xc7, 0x72, 0x8c, 0x5c, 0xc2, 0xc9, 0xf9, 0xb9, 0x7a, 0x68, 0x56, 0x3b, - 0xf1, 0xc2, 0x2c, 0x0e, 0x00, 0x89, 0x04, 0x30, 0x46, 0xb1, 0x96, 0x54, 0x16, 0xa4, 0x16, 0xff, - 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0xa2, 0x25, 0x00, - 0xaa, 0x45, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b, 0x2f, 0xbf, 0x3c, 0x2f, 0x04, 0xa4, 0x32, 0x89, - 0x0d, 0x6c, 0x96, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x1c, 0x64, 0x4e, 0xf6, 0x00, 0x00, - 0x00, -} - -func (this *Duration) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Duration) - if !ok { - that2, ok := that.(Duration) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Seconds != that1.Seconds { - if this.Seconds < that1.Seconds { - return -1 - } - return 1 - } - if this.Nanos != that1.Nanos { - if this.Nanos < that1.Nanos { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Duration) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Duration) - if !ok { - that2, ok := that.(Duration) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Seconds != that1.Seconds { - return false - } - if this.Nanos != that1.Nanos { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Duration) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&types.Duration{") - s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") - s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\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 valueToGoStringDuration(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 (m *Duration) 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 *Duration) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Duration) 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.Nanos != 0 { - i = encodeVarintDuration(dAtA, i, uint64(m.Nanos)) - i-- - dAtA[i] = 0x10 - } - if m.Seconds != 0 { - i = encodeVarintDuration(dAtA, i, uint64(m.Seconds)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintDuration(dAtA []byte, offset int, v uint64) int { - offset -= sovDuration(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Duration) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Seconds != 0 { - n += 1 + sovDuration(uint64(m.Seconds)) - } - if m.Nanos != 0 { - n += 1 + sovDuration(uint64(m.Nanos)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovDuration(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozDuration(x uint64) (n int) { - return sovDuration(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Duration) 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 ErrIntOverflowDuration - } - 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: Duration: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Duration: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) - } - m.Seconds = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDuration - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Seconds |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) - } - m.Nanos = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDuration - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Nanos |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipDuration(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthDuration - } - 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 skipDuration(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, ErrIntOverflowDuration - } - 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, ErrIntOverflowDuration - } - 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, ErrIntOverflowDuration - } - 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, ErrInvalidLengthDuration - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupDuration - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthDuration - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthDuration = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowDuration = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupDuration = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/duration_gogo.go b/tools/vendor/github.com/gogo/protobuf/types/duration_gogo.go deleted file mode 100644 index 90e7670e2..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/duration_gogo.go +++ /dev/null @@ -1,100 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, 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 types - -import ( - "fmt" - "time" -) - -func NewPopulatedDuration(r interface { - Int63() int64 -}, easy bool) *Duration { - this := &Duration{} - maxSecs := time.Hour.Nanoseconds() / 1e9 - max := 2 * maxSecs - s := int64(r.Int63()) % max - s -= maxSecs - neg := int64(1) - if s < 0 { - neg = -1 - } - this.Seconds = s - this.Nanos = int32(neg * (r.Int63() % 1e9)) - return this -} - -func (d *Duration) String() string { - td, err := DurationFromProto(d) - if err != nil { - return fmt.Sprintf("(%v)", err) - } - return td.String() -} - -func NewPopulatedStdDuration(r interface { - Int63() int64 -}, easy bool) *time.Duration { - dur := NewPopulatedDuration(r, easy) - d, err := DurationFromProto(dur) - if err != nil { - return nil - } - return &d -} - -func SizeOfStdDuration(d time.Duration) int { - dur := DurationProto(d) - return dur.Size() -} - -func StdDurationMarshal(d time.Duration) ([]byte, error) { - size := SizeOfStdDuration(d) - buf := make([]byte, size) - _, err := StdDurationMarshalTo(d, buf) - return buf, err -} - -func StdDurationMarshalTo(d time.Duration, data []byte) (int, error) { - dur := DurationProto(d) - return dur.MarshalTo(data) -} - -func StdDurationUnmarshal(d *time.Duration, data []byte) error { - dur := &Duration{} - if err := dur.Unmarshal(data); err != nil { - return err - } - dd, err := DurationFromProto(dur) - if err != nil { - return err - } - *d = dd - return nil -} diff --git a/tools/vendor/github.com/gogo/protobuf/types/empty.pb.go b/tools/vendor/github.com/gogo/protobuf/types/empty.pb.go deleted file mode 100644 index 9e94748b3..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/empty.pb.go +++ /dev/null @@ -1,462 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/empty.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// A generic empty message that you can re-use to avoid defining duplicated -// empty messages in your APIs. A typical example is to use it as the request -// or the response type of an API method. For instance: -// -// service Foo { -// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); -// } -// -// The JSON representation for `Empty` is empty JSON object `{}`. -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Empty) Reset() { *m = Empty{} } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_900544acb223d5b8, []int{0} -} -func (*Empty) XXX_WellKnownType() string { return "Empty" } -func (m *Empty) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Empty.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 *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) -} -func (m *Empty) XXX_Size() int { - return m.Size() -} -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) -} - -var xxx_messageInfo_Empty proto.InternalMessageInfo - -func (*Empty) XXX_MessageName() string { - return "google.protobuf.Empty" -} -func init() { - proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") -} - -func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) } - -var fileDescriptor_900544acb223d5b8 = []byte{ - // 176 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, - 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, - 0x90, 0xbc, 0x53, 0x0b, 0xe3, 0x8d, 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xfe, 0x78, 0x28, - 0xc7, 0xd8, 0xf0, 0x48, 0x8e, 0x71, 0xc5, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, - 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0xf1, 0xc5, 0x23, 0x39, 0x86, 0x0f, 0x20, 0xf1, 0xc7, 0x72, - 0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x19, 0xe8, 0xc4, 0x05, - 0x36, 0x2e, 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0xfe, 0xc1, 0xc8, - 0xb8, 0x88, 0x89, 0xd9, 0x3d, 0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x7d, 0x00, 0x54, 0xbd, - 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8, - 0x20, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x21, 0xbe, 0xb6, 0x31, 0xc6, 0x00, 0x00, 0x00, -} - -func (this *Empty) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Empty) - if !ok { - that2, ok := that.(Empty) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Empty) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Empty) - if !ok { - that2, ok := that.(Empty) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Empty) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 4) - s = append(s, "&types.Empty{") - 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 valueToGoStringEmpty(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 (m *Empty) 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 *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) 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) - } - return len(dAtA) - i, nil -} - -func encodeVarintEmpty(dAtA []byte, offset int, v uint64) int { - offset -= sovEmpty(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedEmpty(r randyEmpty, easy bool) *Empty { - this := &Empty{} - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedEmpty(r, 1) - } - return this -} - -type randyEmpty interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneEmpty(r randyEmpty) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringEmpty(r randyEmpty) string { - v1 := r.Intn(100) - tmps := make([]rune, v1) - for i := 0; i < v1; i++ { - tmps[i] = randUTF8RuneEmpty(r) - } - return string(tmps) -} -func randUnrecognizedEmpty(r randyEmpty, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldEmpty(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldEmpty(dAtA []byte, r randyEmpty, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) - v2 := r.Int63() - if r.Intn(2) == 0 { - v2 *= -1 - } - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(v2)) - case 1: - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateEmpty(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovEmpty(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEmpty(x uint64) (n int) { - return sovEmpty(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Empty) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Empty{`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringEmpty(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Empty) 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 ErrIntOverflowEmpty - } - 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: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipEmpty(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEmpty - } - 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 skipEmpty(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, ErrIntOverflowEmpty - } - 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, ErrIntOverflowEmpty - } - 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, ErrIntOverflowEmpty - } - 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, ErrInvalidLengthEmpty - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEmpty - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEmpty - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEmpty = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEmpty = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEmpty = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/field_mask.pb.go b/tools/vendor/github.com/gogo/protobuf/types/field_mask.pb.go deleted file mode 100644 index 6ae346d92..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/field_mask.pb.go +++ /dev/null @@ -1,738 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/field_mask.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// `FieldMask` represents a set of symbolic field paths, for example: -// -// 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 -// message in `f.b`. -// -// Field masks are used to specify a subset of fields that should be -// returned by a get operation or modified by an update operation. -// Field masks also have a custom JSON encoding (see below). -// -// # Field Masks in Projections -// -// When used in the context of a projection, a response message or -// sub-message is filtered by the API to only contain those fields as -// 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 -// -// 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 -// } -// } -// -// A repeated field is not allowed except at the last position of a -// paths string. -// -// If a FieldMask object is not present in a get operation, the -// operation applies to all fields (as if a FieldMask of all fields -// had been specified). -// -// Note that a field mask does not necessarily apply to the -// top-level response message. In case of a REST get operation, the -// field mask applies directly to the response, but in case of a REST -// list operation, the mask instead applies to each individual message -// in the returned resource list. In case of a REST custom method, -// other definitions may be used. Where the mask applies will be -// clearly documented together with its declaration in the API. In -// any case, the effect on the returned resource/resources is required -// behavior for APIs. -// -// # Field Masks in Update Operations -// -// A field mask in update operations specifies which fields of the -// targeted resource are going to be updated. The API is required -// to only change the values of the fields as specified in the mask -// and leave the others untouched. If a resource is passed in to -// describe the updated values, the API ignores the values of all -// fields not covered by the mask. -// -// If a repeated field is specified for an update operation, new values will -// be appended to the existing repeated field in the target resource. Note that -// a repeated field is only allowed in the last position of a `paths` string. -// -// If a sub-message is specified in the last position of the field mask for an -// update operation, then new value will be merged into the existing sub-message -// in the target resource. -// -// For example, given the target message: -// -// f { -// b { -// d: 1 -// x: 2 -// } -// c: [1] -// } -// -// And an update message: -// -// f { -// b { -// d: 10 -// } -// c: [2] -// } -// -// then if the field mask is: -// -// paths: ["f.b", "f.c"] -// -// then the result will be: -// -// f { -// b { -// d: 10 -// x: 2 -// } -// c: [1, 2] -// } -// -// An implementation may provide options to override this default behavior for -// repeated and message fields. -// -// In order to reset a field's value to the default, the field must -// be in the mask and set to the default value in the provided resource. -// Hence, in order to reset all fields of a resource, provide a default -// instance of the resource and set all fields in the mask, or do -// not provide a mask as described below. -// -// If a field mask is not present on update, the operation applies to -// all fields (as if a field mask of all fields has been specified). -// Note that in the presence of schema evolution, this may mean that -// fields the client does not know and has therefore not filled into -// the request will be reset to their default. If this is unwanted -// behavior, a specific service may require a client to always specify -// a field mask, producing an error if not. -// -// As with get operations, the location of the resource which -// describes the updated values in the request message depends on the -// operation kind. In any case, the effect of the field mask is -// required to be honored by the API. -// -// ## Considerations for HTTP REST -// -// The HTTP kind of an update operation which uses a field mask must -// be set to PATCH instead of PUT in order to satisfy HTTP semantics -// (PUT must only be used for full updates). -// -// # JSON Encoding of Field Masks -// -// In JSON, a field mask is encoded as a single string where paths are -// separated by a comma. Fields name in each path are converted -// to/from lower-camel naming conventions. -// -// 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; -// } -// -// In proto a field mask for `Profile` may look as such: -// -// mask { -// paths: "user.display_name" -// paths: "photo" -// } -// -// In JSON, the same mask is represented as below: -// -// { -// 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; -// } -// } -// -// The field mask can be: -// -// mask { -// paths: "name" -// } -// -// Or: -// -// mask { -// paths: "sub_message" -// } -// -// Note that oneof type names ("test_oneof" in this case) cannot be used in -// paths. -// -// ## Field Mask Verification -// -// The implementation of any API method which has a FieldMask type field in the -// request should verify the included field paths, and return an -// `INVALID_ARGUMENT` error if any path is duplicated or unmappable. -type FieldMask struct { - // The set of field mask paths. - Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FieldMask) Reset() { *m = FieldMask{} } -func (*FieldMask) ProtoMessage() {} -func (*FieldMask) Descriptor() ([]byte, []int) { - return fileDescriptor_5158202634f0da48, []int{0} -} -func (m *FieldMask) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *FieldMask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_FieldMask.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 *FieldMask) XXX_Merge(src proto.Message) { - xxx_messageInfo_FieldMask.Merge(m, src) -} -func (m *FieldMask) XXX_Size() int { - return m.Size() -} -func (m *FieldMask) XXX_DiscardUnknown() { - xxx_messageInfo_FieldMask.DiscardUnknown(m) -} - -var xxx_messageInfo_FieldMask proto.InternalMessageInfo - -func (m *FieldMask) GetPaths() []string { - if m != nil { - return m.Paths - } - return nil -} - -func (*FieldMask) XXX_MessageName() string { - return "google.protobuf.FieldMask" -} -func init() { - proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask") -} - -func init() { proto.RegisterFile("google/protobuf/field_mask.proto", fileDescriptor_5158202634f0da48) } - -var fileDescriptor_5158202634f0da48 = []byte{ - // 203 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcb, 0x4c, 0xcd, - 0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x03, 0x8b, 0x09, 0xf1, 0x43, 0x54, 0xe8, 0xc1, 0x54, - 0x28, 0x29, 0x72, 0x71, 0xba, 0x81, 0x14, 0xf9, 0x26, 0x16, 0x67, 0x0b, 0x89, 0x70, 0xb1, 0x16, - 0x24, 0x96, 0x64, 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6b, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x1d, 0x8c, - 0x37, 0x1e, 0xca, 0x31, 0x7c, 0x78, 0x28, 0xc7, 0xf8, 0xe3, 0xa1, 0x1c, 0x63, 0xc3, 0x23, 0x39, - 0xc6, 0x15, 0x8f, 0xe4, 0x18, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, - 0x39, 0xc6, 0x17, 0x8f, 0xe4, 0x18, 0x3e, 0x80, 0xc4, 0x1f, 0xcb, 0x31, 0x9e, 0x78, 0x2c, 0xc7, - 0xc8, 0x25, 0x9c, 0x9c, 0x9f, 0xab, 0x87, 0x66, 0x95, 0x13, 0x1f, 0xdc, 0xa2, 0x00, 0x90, 0x50, - 0x00, 0x63, 0x14, 0x6b, 0x49, 0x65, 0x41, 0x6a, 0xf1, 0x0f, 0x46, 0xc6, 0x45, 0x4c, 0xcc, 0xee, - 0x01, 0x4e, 0xab, 0x98, 0xe4, 0xdc, 0x21, 0x7a, 0x02, 0xa0, 0x7a, 0xf4, 0xc2, 0x53, 0x73, 0x72, - 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, 0x2a, 0x93, 0xd8, 0xc0, 0x86, 0x19, 0x03, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x43, 0xa0, 0x83, 0xd0, 0xe9, 0x00, 0x00, 0x00, -} - -func (this *FieldMask) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*FieldMask) - if !ok { - that2, ok := that.(FieldMask) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if len(this.Paths) != len(that1.Paths) { - if len(this.Paths) < len(that1.Paths) { - return -1 - } - return 1 - } - for i := range this.Paths { - if this.Paths[i] != that1.Paths[i] { - if this.Paths[i] < that1.Paths[i] { - return -1 - } - return 1 - } - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *FieldMask) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*FieldMask) - if !ok { - that2, ok := that.(FieldMask) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if len(this.Paths) != len(that1.Paths) { - return false - } - for i := range this.Paths { - if this.Paths[i] != that1.Paths[i] { - return false - } - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *FieldMask) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.FieldMask{") - s = append(s, "Paths: "+fmt.Sprintf("%#v", this.Paths)+",\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 valueToGoStringFieldMask(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 (m *FieldMask) 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 *FieldMask) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *FieldMask) 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.Paths) > 0 { - for iNdEx := len(m.Paths) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Paths[iNdEx]) - copy(dAtA[i:], m.Paths[iNdEx]) - i = encodeVarintFieldMask(dAtA, i, uint64(len(m.Paths[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintFieldMask(dAtA []byte, offset int, v uint64) int { - offset -= sovFieldMask(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedFieldMask(r randyFieldMask, easy bool) *FieldMask { - this := &FieldMask{} - v1 := r.Intn(10) - this.Paths = make([]string, v1) - for i := 0; i < v1; i++ { - this.Paths[i] = string(randStringFieldMask(r)) - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedFieldMask(r, 2) - } - return this -} - -type randyFieldMask interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneFieldMask(r randyFieldMask) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringFieldMask(r randyFieldMask) string { - v2 := r.Intn(100) - tmps := make([]rune, v2) - for i := 0; i < v2; i++ { - tmps[i] = randUTF8RuneFieldMask(r) - } - return string(tmps) -} -func randUnrecognizedFieldMask(r randyFieldMask, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldFieldMask(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldFieldMask(dAtA []byte, r randyFieldMask, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) - v3 := r.Int63() - if r.Intn(2) == 0 { - v3 *= -1 - } - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(v3)) - case 1: - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateFieldMask(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *FieldMask) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Paths) > 0 { - for _, s := range m.Paths { - l = len(s) - n += 1 + l + sovFieldMask(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovFieldMask(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozFieldMask(x uint64) (n int) { - return sovFieldMask(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *FieldMask) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&FieldMask{`, - `Paths:` + fmt.Sprintf("%v", this.Paths) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringFieldMask(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *FieldMask) 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 ErrIntOverflowFieldMask - } - 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: FieldMask: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FieldMask: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowFieldMask - } - 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 ErrInvalidLengthFieldMask - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthFieldMask - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipFieldMask(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthFieldMask - } - 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 skipFieldMask(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, ErrIntOverflowFieldMask - } - 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, ErrIntOverflowFieldMask - } - 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, ErrIntOverflowFieldMask - } - 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, ErrInvalidLengthFieldMask - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupFieldMask - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthFieldMask - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthFieldMask = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowFieldMask = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupFieldMask = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/protosize.go b/tools/vendor/github.com/gogo/protobuf/types/protosize.go deleted file mode 100644 index 3a2d1b7e1..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/protosize.go +++ /dev/null @@ -1,34 +0,0 @@ -package types - -func (m *Any) ProtoSize() (n int) { return m.Size() } -func (m *Api) ProtoSize() (n int) { return m.Size() } -func (m *Method) ProtoSize() (n int) { return m.Size() } -func (m *Mixin) ProtoSize() (n int) { return m.Size() } -func (m *Duration) ProtoSize() (n int) { return m.Size() } -func (m *Empty) ProtoSize() (n int) { return m.Size() } -func (m *FieldMask) ProtoSize() (n int) { return m.Size() } -func (m *SourceContext) ProtoSize() (n int) { return m.Size() } -func (m *Struct) ProtoSize() (n int) { return m.Size() } -func (m *Value) ProtoSize() (n int) { return m.Size() } -func (m *Value_NullValue) ProtoSize() (n int) { return m.Size() } -func (m *Value_NumberValue) ProtoSize() (n int) { return m.Size() } -func (m *Value_StringValue) ProtoSize() (n int) { return m.Size() } -func (m *Value_BoolValue) ProtoSize() (n int) { return m.Size() } -func (m *Value_StructValue) ProtoSize() (n int) { return m.Size() } -func (m *Value_ListValue) ProtoSize() (n int) { return m.Size() } -func (m *ListValue) ProtoSize() (n int) { return m.Size() } -func (m *Timestamp) ProtoSize() (n int) { return m.Size() } -func (m *Type) ProtoSize() (n int) { return m.Size() } -func (m *Field) ProtoSize() (n int) { return m.Size() } -func (m *Enum) ProtoSize() (n int) { return m.Size() } -func (m *EnumValue) ProtoSize() (n int) { return m.Size() } -func (m *Option) ProtoSize() (n int) { return m.Size() } -func (m *DoubleValue) ProtoSize() (n int) { return m.Size() } -func (m *FloatValue) ProtoSize() (n int) { return m.Size() } -func (m *Int64Value) ProtoSize() (n int) { return m.Size() } -func (m *UInt64Value) ProtoSize() (n int) { return m.Size() } -func (m *Int32Value) ProtoSize() (n int) { return m.Size() } -func (m *UInt32Value) ProtoSize() (n int) { return m.Size() } -func (m *BoolValue) ProtoSize() (n int) { return m.Size() } -func (m *StringValue) ProtoSize() (n int) { return m.Size() } -func (m *BytesValue) ProtoSize() (n int) { return m.Size() } diff --git a/tools/vendor/github.com/gogo/protobuf/types/source_context.pb.go b/tools/vendor/github.com/gogo/protobuf/types/source_context.pb.go deleted file mode 100644 index 8e6ce71b2..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/source_context.pb.go +++ /dev/null @@ -1,524 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/source_context.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// `SourceContext` represents information about the source of a -// protobuf element, like the file in which it is defined. -type SourceContext struct { - // The path-qualified name of the .proto file that contained the associated - // protobuf element. For example: `"google/protobuf/source_context.proto"`. - FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SourceContext) Reset() { *m = SourceContext{} } -func (*SourceContext) ProtoMessage() {} -func (*SourceContext) Descriptor() ([]byte, []int) { - return fileDescriptor_b686cdb126d509db, []int{0} -} -func (m *SourceContext) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SourceContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SourceContext.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 *SourceContext) XXX_Merge(src proto.Message) { - xxx_messageInfo_SourceContext.Merge(m, src) -} -func (m *SourceContext) XXX_Size() int { - return m.Size() -} -func (m *SourceContext) XXX_DiscardUnknown() { - xxx_messageInfo_SourceContext.DiscardUnknown(m) -} - -var xxx_messageInfo_SourceContext proto.InternalMessageInfo - -func (m *SourceContext) GetFileName() string { - if m != nil { - return m.FileName - } - return "" -} - -func (*SourceContext) XXX_MessageName() string { - return "google.protobuf.SourceContext" -} -func init() { - proto.RegisterType((*SourceContext)(nil), "google.protobuf.SourceContext") -} - -func init() { - proto.RegisterFile("google/protobuf/source_context.proto", fileDescriptor_b686cdb126d509db) -} - -var fileDescriptor_b686cdb126d509db = []byte{ - // 212 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xce, 0x2f, 0x2d, - 0x4a, 0x4e, 0x8d, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xad, 0x28, 0xd1, 0x03, 0x8b, 0x0b, 0xf1, 0x43, - 0x54, 0xe9, 0xc1, 0x54, 0x29, 0xe9, 0x70, 0xf1, 0x06, 0x83, 0x15, 0x3a, 0x43, 0xd4, 0x09, 0x49, - 0x73, 0x71, 0xa6, 0x65, 0xe6, 0xa4, 0xc6, 0xe7, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, - 0x70, 0x06, 0x71, 0x80, 0x04, 0xfc, 0x12, 0x73, 0x53, 0x9d, 0x3a, 0x19, 0x6f, 0x3c, 0x94, 0x63, - 0xf8, 0xf0, 0x50, 0x8e, 0xf1, 0xc7, 0x43, 0x39, 0xc6, 0x86, 0x47, 0x72, 0x8c, 0x2b, 0x1e, 0xc9, - 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e, - 0xc9, 0x31, 0x7c, 0x00, 0x89, 0x3f, 0x96, 0x63, 0x3c, 0xf1, 0x58, 0x8e, 0x91, 0x4b, 0x38, 0x39, - 0x3f, 0x57, 0x0f, 0xcd, 0x56, 0x27, 0x21, 0x14, 0x3b, 0x03, 0x40, 0xc2, 0x01, 0x8c, 0x51, 0xac, - 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, - 0x34, 0x05, 0x40, 0x35, 0xe9, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, - 0x94, 0x25, 0xb1, 0x81, 0x4d, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x37, 0x2a, 0xa1, - 0xf9, 0x00, 0x00, 0x00, -} - -func (this *SourceContext) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*SourceContext) - if !ok { - that2, ok := that.(SourceContext) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.FileName != that1.FileName { - if this.FileName < that1.FileName { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *SourceContext) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*SourceContext) - if !ok { - that2, ok := that.(SourceContext) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.FileName != that1.FileName { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *SourceContext) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.SourceContext{") - s = append(s, "FileName: "+fmt.Sprintf("%#v", this.FileName)+",\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 valueToGoStringSourceContext(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 (m *SourceContext) 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 *SourceContext) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SourceContext) 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.FileName) > 0 { - i -= len(m.FileName) - copy(dAtA[i:], m.FileName) - i = encodeVarintSourceContext(dAtA, i, uint64(len(m.FileName))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintSourceContext(dAtA []byte, offset int, v uint64) int { - offset -= sovSourceContext(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedSourceContext(r randySourceContext, easy bool) *SourceContext { - this := &SourceContext{} - this.FileName = string(randStringSourceContext(r)) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedSourceContext(r, 2) - } - return this -} - -type randySourceContext interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneSourceContext(r randySourceContext) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringSourceContext(r randySourceContext) string { - v1 := r.Intn(100) - tmps := make([]rune, v1) - for i := 0; i < v1; i++ { - tmps[i] = randUTF8RuneSourceContext(r) - } - return string(tmps) -} -func randUnrecognizedSourceContext(r randySourceContext, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldSourceContext(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldSourceContext(dAtA []byte, r randySourceContext, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) - v2 := r.Int63() - if r.Intn(2) == 0 { - v2 *= -1 - } - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(v2)) - case 1: - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateSourceContext(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *SourceContext) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FileName) - if l > 0 { - n += 1 + l + sovSourceContext(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovSourceContext(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozSourceContext(x uint64) (n int) { - return sovSourceContext(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *SourceContext) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&SourceContext{`, - `FileName:` + fmt.Sprintf("%v", this.FileName) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringSourceContext(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *SourceContext) 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 ErrIntOverflowSourceContext - } - 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: SourceContext: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SourceContext: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FileName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSourceContext - } - 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 ErrInvalidLengthSourceContext - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSourceContext - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FileName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSourceContext(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSourceContext - } - 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 skipSourceContext(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, ErrIntOverflowSourceContext - } - 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, ErrIntOverflowSourceContext - } - 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, ErrIntOverflowSourceContext - } - 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, ErrInvalidLengthSourceContext - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupSourceContext - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthSourceContext - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthSourceContext = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowSourceContext = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupSourceContext = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/struct.pb.go b/tools/vendor/github.com/gogo/protobuf/types/struct.pb.go deleted file mode 100644 index c0457312e..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/struct.pb.go +++ /dev/null @@ -1,2271 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/struct.proto - -package types - -import ( - bytes "bytes" - encoding_binary "encoding/binary" - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - io "io" - math "math" - math_bits "math/bits" - reflect "reflect" - strconv "strconv" - 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 - -// `NullValue` is a singleton enumeration to represent the null value for the -// `Value` type union. -// -// The JSON representation for `NullValue` is JSON `null`. -type NullValue int32 - -const ( - // Null value. - NullValue_NULL_VALUE NullValue = 0 -) - -var NullValue_name = map[int32]string{ - 0: "NULL_VALUE", -} - -var NullValue_value = map[string]int32{ - "NULL_VALUE": 0, -} - -func (NullValue) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_df322afd6c9fb402, []int{0} -} - -func (NullValue) XXX_WellKnownType() string { return "NullValue" } - -// `Struct` represents a structured data value, consisting of fields -// which map to dynamically typed values. In some languages, `Struct` -// might be supported by a native representation. For example, in -// scripting languages like JS a struct is represented as an -// object. The details of that representation are described together -// with the proto support for the language. -// -// The JSON representation for `Struct` is JSON object. -type Struct struct { - // Unordered map of dynamically typed values. - Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Struct) Reset() { *m = Struct{} } -func (*Struct) ProtoMessage() {} -func (*Struct) Descriptor() ([]byte, []int) { - return fileDescriptor_df322afd6c9fb402, []int{0} -} -func (*Struct) XXX_WellKnownType() string { return "Struct" } -func (m *Struct) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Struct.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 *Struct) XXX_Merge(src proto.Message) { - xxx_messageInfo_Struct.Merge(m, src) -} -func (m *Struct) XXX_Size() int { - return m.Size() -} -func (m *Struct) XXX_DiscardUnknown() { - xxx_messageInfo_Struct.DiscardUnknown(m) -} - -var xxx_messageInfo_Struct proto.InternalMessageInfo - -func (m *Struct) GetFields() map[string]*Value { - if m != nil { - return m.Fields - } - return nil -} - -func (*Struct) XXX_MessageName() string { - return "google.protobuf.Struct" -} - -// `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. -// -// The JSON representation for `Value` is JSON value. -type Value struct { - // The kind of value. - // - // Types that are valid to be assigned to Kind: - // *Value_NullValue - // *Value_NumberValue - // *Value_StringValue - // *Value_BoolValue - // *Value_StructValue - // *Value_ListValue - Kind isValue_Kind `protobuf_oneof:"kind"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Value) Reset() { *m = Value{} } -func (*Value) ProtoMessage() {} -func (*Value) Descriptor() ([]byte, []int) { - return fileDescriptor_df322afd6c9fb402, []int{1} -} -func (*Value) XXX_WellKnownType() string { return "Value" } -func (m *Value) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Value.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 *Value) XXX_Merge(src proto.Message) { - xxx_messageInfo_Value.Merge(m, src) -} -func (m *Value) XXX_Size() int { - return m.Size() -} -func (m *Value) XXX_DiscardUnknown() { - xxx_messageInfo_Value.DiscardUnknown(m) -} - -var xxx_messageInfo_Value proto.InternalMessageInfo - -type isValue_Kind interface { - isValue_Kind() - Equal(interface{}) bool - MarshalTo([]byte) (int, error) - Size() int - Compare(interface{}) int -} - -type Value_NullValue struct { - NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof" json:"null_value,omitempty"` -} -type Value_NumberValue struct { - NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof" json:"number_value,omitempty"` -} -type Value_StringValue struct { - StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof" json:"string_value,omitempty"` -} -type Value_BoolValue struct { - BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof" json:"bool_value,omitempty"` -} -type Value_StructValue struct { - StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,proto3,oneof" json:"struct_value,omitempty"` -} -type Value_ListValue struct { - ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,proto3,oneof" json:"list_value,omitempty"` -} - -func (*Value_NullValue) isValue_Kind() {} -func (*Value_NumberValue) isValue_Kind() {} -func (*Value_StringValue) isValue_Kind() {} -func (*Value_BoolValue) isValue_Kind() {} -func (*Value_StructValue) isValue_Kind() {} -func (*Value_ListValue) isValue_Kind() {} - -func (m *Value) GetKind() isValue_Kind { - if m != nil { - return m.Kind - } - return nil -} - -func (m *Value) GetNullValue() NullValue { - if x, ok := m.GetKind().(*Value_NullValue); ok { - return x.NullValue - } - return NullValue_NULL_VALUE -} - -func (m *Value) GetNumberValue() float64 { - if x, ok := m.GetKind().(*Value_NumberValue); ok { - return x.NumberValue - } - return 0 -} - -func (m *Value) GetStringValue() string { - if x, ok := m.GetKind().(*Value_StringValue); ok { - return x.StringValue - } - return "" -} - -func (m *Value) GetBoolValue() bool { - if x, ok := m.GetKind().(*Value_BoolValue); ok { - return x.BoolValue - } - return false -} - -func (m *Value) GetStructValue() *Struct { - if x, ok := m.GetKind().(*Value_StructValue); ok { - return x.StructValue - } - return nil -} - -func (m *Value) GetListValue() *ListValue { - if x, ok := m.GetKind().(*Value_ListValue); ok { - return x.ListValue - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Value) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Value_NullValue)(nil), - (*Value_NumberValue)(nil), - (*Value_StringValue)(nil), - (*Value_BoolValue)(nil), - (*Value_StructValue)(nil), - (*Value_ListValue)(nil), - } -} - -func (*Value) XXX_MessageName() string { - return "google.protobuf.Value" -} - -// `ListValue` is a wrapper around a repeated field of values. -// -// The JSON representation for `ListValue` is JSON array. -type ListValue struct { - // Repeated field of dynamically typed values. - Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListValue) Reset() { *m = ListValue{} } -func (*ListValue) ProtoMessage() {} -func (*ListValue) Descriptor() ([]byte, []int) { - return fileDescriptor_df322afd6c9fb402, []int{2} -} -func (*ListValue) XXX_WellKnownType() string { return "ListValue" } -func (m *ListValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListValue.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 *ListValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListValue.Merge(m, src) -} -func (m *ListValue) XXX_Size() int { - return m.Size() -} -func (m *ListValue) XXX_DiscardUnknown() { - xxx_messageInfo_ListValue.DiscardUnknown(m) -} - -var xxx_messageInfo_ListValue proto.InternalMessageInfo - -func (m *ListValue) GetValues() []*Value { - if m != nil { - return m.Values - } - return nil -} - -func (*ListValue) XXX_MessageName() string { - return "google.protobuf.ListValue" -} -func init() { - proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) - proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") - proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry") - proto.RegisterType((*Value)(nil), "google.protobuf.Value") - proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") -} - -func init() { proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor_df322afd6c9fb402) } - -var fileDescriptor_df322afd6c9fb402 = []byte{ - // 443 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xb1, 0x6f, 0xd3, 0x40, - 0x14, 0xc6, 0xfd, 0x9c, 0xc6, 0x22, 0xcf, 0xa8, 0x54, 0x87, 0x04, 0x51, 0x41, 0x47, 0x94, 0x2e, - 0x11, 0x42, 0xae, 0x14, 0x16, 0x44, 0x58, 0x88, 0x54, 0x5a, 0x89, 0xa8, 0x32, 0x86, 0x16, 0x89, - 0x25, 0xc2, 0xae, 0x1b, 0x59, 0xbd, 0xde, 0x55, 0xf6, 0x1d, 0x28, 0x1b, 0x0b, 0xff, 0x03, 0x33, - 0x13, 0x62, 0xe4, 0xaf, 0xe8, 0xc8, 0xc8, 0x48, 0xdc, 0x85, 0xb1, 0x63, 0x47, 0x74, 0x77, 0xb6, - 0x41, 0x8d, 0xb2, 0xf9, 0x7d, 0xf7, 0x7b, 0xdf, 0x7b, 0xdf, 0x33, 0xde, 0x9f, 0x09, 0x31, 0x63, - 0xe9, 0xf6, 0x59, 0x2e, 0xa4, 0x88, 0xd5, 0xf1, 0x76, 0x21, 0x73, 0x95, 0xc8, 0xc0, 0xd4, 0xe4, - 0x96, 0x7d, 0x0d, 0xea, 0xd7, 0xfe, 0x17, 0x40, 0xef, 0xb5, 0x21, 0xc8, 0x08, 0xbd, 0xe3, 0x2c, - 0x65, 0x47, 0x45, 0x17, 0x7a, 0xad, 0x81, 0x3f, 0xdc, 0x0a, 0xae, 0xc1, 0x81, 0x05, 0x83, 0x17, - 0x86, 0xda, 0xe1, 0x32, 0x9f, 0x47, 0x55, 0xcb, 0xe6, 0x2b, 0xf4, 0xff, 0x93, 0xc9, 0x06, 0xb6, - 0x4e, 0xd2, 0x79, 0x17, 0x7a, 0x30, 0xe8, 0x44, 0xfa, 0x93, 0x3c, 0xc2, 0xf6, 0x87, 0xf7, 0x4c, - 0xa5, 0x5d, 0xb7, 0x07, 0x03, 0x7f, 0x78, 0x67, 0xc9, 0xfc, 0x50, 0xbf, 0x46, 0x16, 0x7a, 0xea, - 0x3e, 0x81, 0xfe, 0x0f, 0x17, 0xdb, 0x46, 0x24, 0x23, 0x44, 0xae, 0x18, 0x9b, 0x5a, 0x03, 0x6d, - 0xba, 0x3e, 0xdc, 0x5c, 0x32, 0xd8, 0x57, 0x8c, 0x19, 0x7e, 0xcf, 0x89, 0x3a, 0xbc, 0x2e, 0xc8, - 0x16, 0xde, 0xe4, 0xea, 0x34, 0x4e, 0xf3, 0xe9, 0xbf, 0xf9, 0xb0, 0xe7, 0x44, 0xbe, 0x55, 0x1b, - 0xa8, 0x90, 0x79, 0xc6, 0x67, 0x15, 0xd4, 0xd2, 0x8b, 0x6b, 0xc8, 0xaa, 0x16, 0x7a, 0x80, 0x18, - 0x0b, 0x51, 0xaf, 0xb1, 0xd6, 0x83, 0xc1, 0x0d, 0x3d, 0x4a, 0x6b, 0x16, 0x78, 0x66, 0x5c, 0x54, - 0x22, 0x2b, 0xa4, 0x6d, 0xa2, 0xde, 0x5d, 0x71, 0xc7, 0xca, 0x5e, 0x25, 0xb2, 0x49, 0xc9, 0xb2, - 0xa2, 0xee, 0xf5, 0x4c, 0xef, 0x72, 0xca, 0x49, 0x56, 0xc8, 0x26, 0x25, 0xab, 0x8b, 0xb1, 0x87, - 0x6b, 0x27, 0x19, 0x3f, 0xea, 0x8f, 0xb0, 0xd3, 0x10, 0x24, 0x40, 0xcf, 0x98, 0xd5, 0x7f, 0x74, - 0xd5, 0xd1, 0x2b, 0xea, 0xe1, 0x3d, 0xec, 0x34, 0x47, 0x24, 0xeb, 0x88, 0xfb, 0x07, 0x93, 0xc9, - 0xf4, 0xf0, 0xf9, 0xe4, 0x60, 0x67, 0xc3, 0x19, 0x7f, 0x86, 0x5f, 0x0b, 0xea, 0x5c, 0x2e, 0x28, - 0x5c, 0x2d, 0x28, 0x7c, 0x2a, 0x29, 0x7c, 0x2b, 0x29, 0x9c, 0x97, 0x14, 0x7e, 0x96, 0x14, 0x7e, - 0x97, 0x14, 0xfe, 0x94, 0xd4, 0xb9, 0xd4, 0xfa, 0x05, 0x85, 0xf3, 0x0b, 0x0a, 0x78, 0x3b, 0x11, - 0xa7, 0xd7, 0x47, 0x8e, 0x7d, 0x9b, 0x3e, 0xd4, 0x75, 0x08, 0xef, 0xda, 0x72, 0x7e, 0x96, 0x16, - 0x57, 0x00, 0x5f, 0xdd, 0xd6, 0x6e, 0x38, 0xfe, 0xee, 0xd2, 0x5d, 0xdb, 0x10, 0xd6, 0x3b, 0xbe, - 0x4d, 0x19, 0x7b, 0xc9, 0xc5, 0x47, 0xfe, 0x46, 0x93, 0xb1, 0x67, 0x9c, 0x1e, 0xff, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0x26, 0x30, 0xdb, 0xbe, 0xe9, 0x02, 0x00, 0x00, -} - -func (this *Struct) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Struct) - if !ok { - that2, ok := that.(Struct) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if len(this.Fields) != len(that1.Fields) { - if len(this.Fields) < len(that1.Fields) { - return -1 - } - return 1 - } - for i := range this.Fields { - if c := this.Fields[i].Compare(that1.Fields[i]); c != 0 { - return c - } - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Value) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value) - if !ok { - that2, ok := that.(Value) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if that1.Kind == nil { - if this.Kind != nil { - return 1 - } - } else if this.Kind == nil { - return -1 - } else { - thisType := -1 - switch this.Kind.(type) { - case *Value_NullValue: - thisType = 0 - case *Value_NumberValue: - thisType = 1 - case *Value_StringValue: - thisType = 2 - case *Value_BoolValue: - thisType = 3 - case *Value_StructValue: - thisType = 4 - case *Value_ListValue: - thisType = 5 - default: - panic(fmt.Sprintf("compare: unexpected type %T in oneof", this.Kind)) - } - that1Type := -1 - switch that1.Kind.(type) { - case *Value_NullValue: - that1Type = 0 - case *Value_NumberValue: - that1Type = 1 - case *Value_StringValue: - that1Type = 2 - case *Value_BoolValue: - that1Type = 3 - case *Value_StructValue: - that1Type = 4 - case *Value_ListValue: - that1Type = 5 - default: - panic(fmt.Sprintf("compare: unexpected type %T in oneof", that1.Kind)) - } - if thisType == that1Type { - if c := this.Kind.Compare(that1.Kind); c != 0 { - return c - } - } else if thisType < that1Type { - return -1 - } else if thisType > that1Type { - return 1 - } - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Value_NullValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_NullValue) - if !ok { - that2, ok := that.(Value_NullValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.NullValue != that1.NullValue { - if this.NullValue < that1.NullValue { - return -1 - } - return 1 - } - return 0 -} -func (this *Value_NumberValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_NumberValue) - if !ok { - that2, ok := that.(Value_NumberValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.NumberValue != that1.NumberValue { - if this.NumberValue < that1.NumberValue { - return -1 - } - return 1 - } - return 0 -} -func (this *Value_StringValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_StringValue) - if !ok { - that2, ok := that.(Value_StringValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.StringValue != that1.StringValue { - if this.StringValue < that1.StringValue { - return -1 - } - return 1 - } - return 0 -} -func (this *Value_BoolValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_BoolValue) - if !ok { - that2, ok := that.(Value_BoolValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.BoolValue != that1.BoolValue { - if !this.BoolValue { - return -1 - } - return 1 - } - return 0 -} -func (this *Value_StructValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_StructValue) - if !ok { - that2, ok := that.(Value_StructValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := this.StructValue.Compare(that1.StructValue); c != 0 { - return c - } - return 0 -} -func (this *Value_ListValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Value_ListValue) - if !ok { - that2, ok := that.(Value_ListValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := this.ListValue.Compare(that1.ListValue); c != 0 { - return c - } - return 0 -} -func (this *ListValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*ListValue) - if !ok { - that2, ok := that.(ListValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if len(this.Values) != len(that1.Values) { - if len(this.Values) < len(that1.Values) { - return -1 - } - return 1 - } - for i := range this.Values { - if c := this.Values[i].Compare(that1.Values[i]); c != 0 { - return c - } - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (x NullValue) String() string { - s, ok := NullValue_name[int32(x)] - if ok { - return s - } - return strconv.Itoa(int(x)) -} -func (this *Struct) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Struct) - if !ok { - that2, ok := that.(Struct) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if len(this.Fields) != len(that1.Fields) { - return false - } - for i := range this.Fields { - if !this.Fields[i].Equal(that1.Fields[i]) { - return false - } - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Value) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value) - if !ok { - that2, ok := that.(Value) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if that1.Kind == nil { - if this.Kind != nil { - return false - } - } else if this.Kind == nil { - return false - } else if !this.Kind.Equal(that1.Kind) { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Value_NullValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_NullValue) - if !ok { - that2, ok := that.(Value_NullValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.NullValue != that1.NullValue { - return false - } - return true -} -func (this *Value_NumberValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_NumberValue) - if !ok { - that2, ok := that.(Value_NumberValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.NumberValue != that1.NumberValue { - return false - } - return true -} -func (this *Value_StringValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_StringValue) - if !ok { - that2, ok := that.(Value_StringValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.StringValue != that1.StringValue { - return false - } - return true -} -func (this *Value_BoolValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_BoolValue) - if !ok { - that2, ok := that.(Value_BoolValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.BoolValue != that1.BoolValue { - return false - } - return true -} -func (this *Value_StructValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_StructValue) - if !ok { - that2, ok := that.(Value_StructValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.StructValue.Equal(that1.StructValue) { - return false - } - return true -} -func (this *Value_ListValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Value_ListValue) - if !ok { - that2, ok := that.(Value_ListValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.ListValue.Equal(that1.ListValue) { - return false - } - return true -} -func (this *ListValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*ListValue) - if !ok { - that2, ok := that.(ListValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if len(this.Values) != len(that1.Values) { - return false - } - for i := range this.Values { - if !this.Values[i].Equal(that1.Values[i]) { - return false - } - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Struct) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.Struct{") - keysForFields := make([]string, 0, len(this.Fields)) - for k := range this.Fields { - keysForFields = append(keysForFields, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForFields) - mapStringForFields := "map[string]*Value{" - for _, k := range keysForFields { - mapStringForFields += fmt.Sprintf("%#v: %#v,", k, this.Fields[k]) - } - mapStringForFields += "}" - if this.Fields != nil { - s = append(s, "Fields: "+mapStringForFields+",\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 *Value) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 10) - s = append(s, "&types.Value{") - if this.Kind != nil { - s = append(s, "Kind: "+fmt.Sprintf("%#v", this.Kind)+",\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 *Value_NullValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_NullValue{` + - `NullValue:` + fmt.Sprintf("%#v", this.NullValue) + `}`}, ", ") - return s -} -func (this *Value_NumberValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_NumberValue{` + - `NumberValue:` + fmt.Sprintf("%#v", this.NumberValue) + `}`}, ", ") - return s -} -func (this *Value_StringValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_StringValue{` + - `StringValue:` + fmt.Sprintf("%#v", this.StringValue) + `}`}, ", ") - return s -} -func (this *Value_BoolValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_BoolValue{` + - `BoolValue:` + fmt.Sprintf("%#v", this.BoolValue) + `}`}, ", ") - return s -} -func (this *Value_StructValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_StructValue{` + - `StructValue:` + fmt.Sprintf("%#v", this.StructValue) + `}`}, ", ") - return s -} -func (this *Value_ListValue) GoString() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&types.Value_ListValue{` + - `ListValue:` + fmt.Sprintf("%#v", this.ListValue) + `}`}, ", ") - return s -} -func (this *ListValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.ListValue{") - if this.Values != nil { - s = append(s, "Values: "+fmt.Sprintf("%#v", this.Values)+",\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 valueToGoStringStruct(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 (m *Struct) 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 *Struct) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Struct) 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.Fields) > 0 { - for k := range m.Fields { - v := m.Fields[k] - baseI := i - if v != nil { - { - size, err := v.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStruct(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintStruct(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintStruct(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Value) 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 *Value) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value) 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.Kind != nil { - { - size := m.Kind.Size() - i -= size - if _, err := m.Kind.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Value_NullValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_NullValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - i = encodeVarintStruct(dAtA, i, uint64(m.NullValue)) - i-- - dAtA[i] = 0x8 - return len(dAtA) - i, nil -} -func (m *Value_NumberValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_NumberValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - i -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.NumberValue)))) - i-- - dAtA[i] = 0x11 - return len(dAtA) - i, nil -} -func (m *Value_StringValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_StringValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - i -= len(m.StringValue) - copy(dAtA[i:], m.StringValue) - i = encodeVarintStruct(dAtA, i, uint64(len(m.StringValue))) - i-- - dAtA[i] = 0x1a - return len(dAtA) - i, nil -} -func (m *Value_BoolValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_BoolValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - i-- - if m.BoolValue { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - return len(dAtA) - i, nil -} -func (m *Value_StructValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_StructValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.StructValue != nil { - { - size, err := m.StructValue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStruct(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Value_ListValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Value_ListValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ListValue != nil { - { - size, err := m.ListValue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStruct(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} -func (m *ListValue) 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 *ListValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListValue) 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.Values) > 0 { - for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Values[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStruct(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintStruct(dAtA []byte, offset int, v uint64) int { - offset -= sovStruct(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedStruct(r randyStruct, easy bool) *Struct { - this := &Struct{} - if r.Intn(5) == 0 { - v1 := r.Intn(10) - this.Fields = make(map[string]*Value) - for i := 0; i < v1; i++ { - this.Fields[randStringStruct(r)] = NewPopulatedValue(r, easy) - } - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedStruct(r, 2) - } - return this -} - -func NewPopulatedValue(r randyStruct, easy bool) *Value { - this := &Value{} - oneofNumber_Kind := []int32{1, 2, 3, 4, 5, 6}[r.Intn(6)] - switch oneofNumber_Kind { - case 1: - this.Kind = NewPopulatedValue_NullValue(r, easy) - case 2: - this.Kind = NewPopulatedValue_NumberValue(r, easy) - case 3: - this.Kind = NewPopulatedValue_StringValue(r, easy) - case 4: - this.Kind = NewPopulatedValue_BoolValue(r, easy) - case 5: - this.Kind = NewPopulatedValue_StructValue(r, easy) - case 6: - this.Kind = NewPopulatedValue_ListValue(r, easy) - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedStruct(r, 7) - } - return this -} - -func NewPopulatedValue_NullValue(r randyStruct, easy bool) *Value_NullValue { - this := &Value_NullValue{} - this.NullValue = NullValue([]int32{0}[r.Intn(1)]) - return this -} -func NewPopulatedValue_NumberValue(r randyStruct, easy bool) *Value_NumberValue { - this := &Value_NumberValue{} - this.NumberValue = float64(r.Float64()) - if r.Intn(2) == 0 { - this.NumberValue *= -1 - } - return this -} -func NewPopulatedValue_StringValue(r randyStruct, easy bool) *Value_StringValue { - this := &Value_StringValue{} - this.StringValue = string(randStringStruct(r)) - return this -} -func NewPopulatedValue_BoolValue(r randyStruct, easy bool) *Value_BoolValue { - this := &Value_BoolValue{} - this.BoolValue = bool(bool(r.Intn(2) == 0)) - return this -} -func NewPopulatedValue_StructValue(r randyStruct, easy bool) *Value_StructValue { - this := &Value_StructValue{} - this.StructValue = NewPopulatedStruct(r, easy) - return this -} -func NewPopulatedValue_ListValue(r randyStruct, easy bool) *Value_ListValue { - this := &Value_ListValue{} - this.ListValue = NewPopulatedListValue(r, easy) - return this -} -func NewPopulatedListValue(r randyStruct, easy bool) *ListValue { - this := &ListValue{} - if r.Intn(5) == 0 { - v2 := r.Intn(5) - this.Values = make([]*Value, v2) - for i := 0; i < v2; i++ { - this.Values[i] = NewPopulatedValue(r, easy) - } - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedStruct(r, 2) - } - return this -} - -type randyStruct interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneStruct(r randyStruct) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringStruct(r randyStruct) string { - v3 := r.Intn(100) - tmps := make([]rune, v3) - for i := 0; i < v3; i++ { - tmps[i] = randUTF8RuneStruct(r) - } - return string(tmps) -} -func randUnrecognizedStruct(r randyStruct, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldStruct(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldStruct(dAtA []byte, r randyStruct, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) - v4 := r.Int63() - if r.Intn(2) == 0 { - v4 *= -1 - } - dAtA = encodeVarintPopulateStruct(dAtA, uint64(v4)) - case 1: - dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateStruct(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateStruct(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *Struct) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Fields) > 0 { - for k, v := range m.Fields { - _ = k - _ = v - l = 0 - if v != nil { - l = v.Size() - l += 1 + sovStruct(uint64(l)) - } - mapEntrySize := 1 + len(k) + sovStruct(uint64(len(k))) + l - n += mapEntrySize + 1 + sovStruct(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Value) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Kind != nil { - n += m.Kind.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Value_NullValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 1 + sovStruct(uint64(m.NullValue)) - return n -} -func (m *Value_NumberValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 9 - return n -} -func (m *Value_StringValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.StringValue) - n += 1 + l + sovStruct(uint64(l)) - return n -} -func (m *Value_BoolValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 2 - return n -} -func (m *Value_StructValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.StructValue != nil { - l = m.StructValue.Size() - n += 1 + l + sovStruct(uint64(l)) - } - return n -} -func (m *Value_ListValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ListValue != nil { - l = m.ListValue.Size() - n += 1 + l + sovStruct(uint64(l)) - } - return n -} -func (m *ListValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Values) > 0 { - for _, e := range m.Values { - l = e.Size() - n += 1 + l + sovStruct(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovStruct(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozStruct(x uint64) (n int) { - return sovStruct(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Struct) String() string { - if this == nil { - return "nil" - } - keysForFields := make([]string, 0, len(this.Fields)) - for k := range this.Fields { - keysForFields = append(keysForFields, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForFields) - mapStringForFields := "map[string]*Value{" - for _, k := range keysForFields { - mapStringForFields += fmt.Sprintf("%v: %v,", k, this.Fields[k]) - } - mapStringForFields += "}" - s := strings.Join([]string{`&Struct{`, - `Fields:` + mapStringForFields + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Value) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value{`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Value_NullValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_NullValue{`, - `NullValue:` + fmt.Sprintf("%v", this.NullValue) + `,`, - `}`, - }, "") - return s -} -func (this *Value_NumberValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_NumberValue{`, - `NumberValue:` + fmt.Sprintf("%v", this.NumberValue) + `,`, - `}`, - }, "") - return s -} -func (this *Value_StringValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_StringValue{`, - `StringValue:` + fmt.Sprintf("%v", this.StringValue) + `,`, - `}`, - }, "") - return s -} -func (this *Value_BoolValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_BoolValue{`, - `BoolValue:` + fmt.Sprintf("%v", this.BoolValue) + `,`, - `}`, - }, "") - return s -} -func (this *Value_StructValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_StructValue{`, - `StructValue:` + strings.Replace(fmt.Sprintf("%v", this.StructValue), "Struct", "Struct", 1) + `,`, - `}`, - }, "") - return s -} -func (this *Value_ListValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Value_ListValue{`, - `ListValue:` + strings.Replace(fmt.Sprintf("%v", this.ListValue), "ListValue", "ListValue", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ListValue) String() string { - if this == nil { - return "nil" - } - repeatedStringForValues := "[]*Value{" - for _, f := range this.Values { - repeatedStringForValues += strings.Replace(f.String(), "Value", "Value", 1) + "," - } - repeatedStringForValues += "}" - s := strings.Join([]string{`&ListValue{`, - `Values:` + repeatedStringForValues + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringStruct(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Struct) 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 ErrIntOverflowStruct - } - 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: Struct: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Struct: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStruct - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStruct - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Fields == nil { - m.Fields = make(map[string]*Value) - } - var mapkey string - var mapvalue *Value - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthStruct - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthStruct - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthStruct - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLengthStruct - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &Value{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := skipStruct(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStruct - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Fields[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStruct(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStruct - } - 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 *Value) 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 ErrIntOverflowStruct - } - 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: Value: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Value: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NullValue", wireType) - } - var v NullValue - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= NullValue(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Kind = &Value_NullValue{v} - case 2: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field NumberValue", wireType) - } - var v uint64 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - m.Kind = &Value_NumberValue{float64(math.Float64frombits(v))} - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - 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 ErrInvalidLengthStruct - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStruct - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Kind = &Value_StringValue{string(dAtA[iNdEx:postIndex])} - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Kind = &Value_BoolValue{b} - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StructValue", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStruct - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStruct - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Struct{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Kind = &Value_StructValue{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListValue", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStruct - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStruct - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ListValue{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Kind = &Value_ListValue{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStruct(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStruct - } - 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 *ListValue) 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 ErrIntOverflowStruct - } - 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: ListValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStruct - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStruct - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStruct - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Values = append(m.Values, &Value{}) - if err := m.Values[len(m.Values)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStruct(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStruct - } - 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 skipStruct(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, ErrIntOverflowStruct - } - 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, ErrIntOverflowStruct - } - 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, ErrIntOverflowStruct - } - 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, ErrInvalidLengthStruct - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupStruct - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthStruct - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthStruct = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowStruct = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupStruct = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/timestamp.go b/tools/vendor/github.com/gogo/protobuf/types/timestamp.go deleted file mode 100644 index 232ada57c..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/timestamp.go +++ /dev/null @@ -1,130 +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 types - -// This file implements operations on google.protobuf.Timestamp. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Seconds field of the earliest valid Timestamp. - // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - minValidSeconds = -62135596800 - // Seconds field just after the latest valid Timestamp. - // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - maxValidSeconds = 253402300800 -) - -// validateTimestamp determines whether a Timestamp is valid. -// A valid timestamp represents a time in the range -// [0001-01-01, 10000-01-01) and has a Nanos field -// in the range [0, 1e9). -// -// If the Timestamp is valid, validateTimestamp returns nil. -// Otherwise, it returns an error that describes -// the problem. -// -// Every valid Timestamp can be represented by a time.Time, but the converse is not true. -func validateTimestamp(ts *Timestamp) error { - if ts == nil { - return errors.New("timestamp: nil Timestamp") - } - if ts.Seconds < minValidSeconds { - return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) - } - if ts.Seconds >= maxValidSeconds { - return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) - } - if ts.Nanos < 0 || ts.Nanos >= 1e9 { - return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) - } - return nil -} - -// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. -// It returns an error if the argument is invalid. -// -// Unlike most Go functions, if Timestamp returns an error, the first return value -// is not the zero time.Time. Instead, it is the value obtained from the -// time.Unix function when passed the contents of the Timestamp, in the UTC -// locale. This may or may not be a meaningful time; many invalid Timestamps -// do map to valid time.Times. -// -// A nil Timestamp returns an error. The first return value in that case is -// undefined. -func TimestampFromProto(ts *Timestamp) (time.Time, error) { - // Don't return the zero value on error, because corresponds to a valid - // timestamp. Instead return whatever time.Unix gives us. - var t time.Time - if ts == nil { - t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp - } else { - t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() - } - return t, validateTimestamp(ts) -} - -// TimestampNow returns a google.protobuf.Timestamp for the current time. -func TimestampNow() *Timestamp { - ts, err := TimestampProto(time.Now()) - if err != nil { - panic("ptypes: time.Now() out of Timestamp range") - } - return ts -} - -// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. -// It returns an error if the resulting Timestamp is invalid. -func TimestampProto(t time.Time) (*Timestamp, error) { - ts := &Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } - if err := validateTimestamp(ts); err != nil { - return nil, err - } - return ts, nil -} - -// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid -// Timestamps, it returns an error message in parentheses. -func TimestampString(ts *Timestamp) string { - t, err := TimestampFromProto(ts) - if err != nil { - return fmt.Sprintf("(%v)", err) - } - return t.Format(time.RFC3339Nano) -} diff --git a/tools/vendor/github.com/gogo/protobuf/types/timestamp.pb.go b/tools/vendor/github.com/gogo/protobuf/types/timestamp.pb.go deleted file mode 100644 index 45db7b3bb..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/timestamp.pb.go +++ /dev/null @@ -1,539 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/timestamp.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - 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 - -// A Timestamp represents a point in time independent of any time zone or local -// calendar, encoded as a count of seconds and fractions of seconds at -// nanosecond resolution. The count is relative to an epoch at UTC midnight on -// January 1, 1970, in the proleptic Gregorian calendar which extends the -// Gregorian calendar backwards to year one. -// -// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap -// second table is needed for interpretation, using a [24-hour linear -// smear](https://developers.google.com/time/smear). -// -// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By -// restricting to that range, we ensure that we can convert to and from [RFC -// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. -// -// # Examples -// -// Example 1: Compute Timestamp from POSIX `time()`. -// -// Timestamp timestamp; -// timestamp.set_seconds(time(NULL)); -// timestamp.set_nanos(0); -// -// Example 2: Compute Timestamp from POSIX `gettimeofday()`. -// -// struct timeval tv; -// gettimeofday(&tv, NULL); -// -// 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; -// -// // 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(); -// -// -// Example 5: Compute Timestamp from current time in Python. -// -// timestamp = Timestamp() -// timestamp.GetCurrentTime() -// -// # JSON Mapping -// -// In JSON format, the Timestamp type is encoded as a string in the -// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the -// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" -// where {year} is always expressed using four digits while {month}, {day}, -// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional -// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), -// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone -// is required. A proto3 JSON serializer should always use UTC (as indicated by -// "Z") when printing the Timestamp type and a proto3 JSON parser should be -// able to accept both UTC and other timezones (as indicated by an offset). -// -// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past -// 01:30 UTC on January 15, 2017. -// -// In JavaScript, one can convert a Date object to this format using the -// standard -// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) -// method. In Python, a standard `datetime.datetime` object can be converted -// to this format using -// [`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 -// ) to obtain a formatter capable of generating timestamps in this format. -// -// -type Timestamp struct { - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Timestamp) Reset() { *m = Timestamp{} } -func (*Timestamp) ProtoMessage() {} -func (*Timestamp) Descriptor() ([]byte, []int) { - return fileDescriptor_292007bbfe81227e, []int{0} -} -func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } -func (m *Timestamp) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Timestamp.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 *Timestamp) XXX_Merge(src proto.Message) { - xxx_messageInfo_Timestamp.Merge(m, src) -} -func (m *Timestamp) XXX_Size() int { - return m.Size() -} -func (m *Timestamp) XXX_DiscardUnknown() { - xxx_messageInfo_Timestamp.DiscardUnknown(m) -} - -var xxx_messageInfo_Timestamp proto.InternalMessageInfo - -func (m *Timestamp) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Timestamp) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -func (*Timestamp) XXX_MessageName() string { - return "google.protobuf.Timestamp" -} -func init() { - proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") -} - -func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) } - -var fileDescriptor_292007bbfe81227e = []byte{ - // 212 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, - 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, - 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, - 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, - 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x03, 0xe3, 0x8d, - 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xae, 0x78, 0x24, 0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3, - 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, 0x24, 0xc7, 0xf0, 0xe1, 0x91, 0x1c, - 0xe3, 0x8a, 0xc7, 0x72, 0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, - 0x59, 0xee, 0xc4, 0x07, 0xb7, 0x3a, 0x00, 0x24, 0x14, 0xc0, 0x18, 0xc5, 0x5a, 0x52, 0x59, 0x90, - 0x5a, 0xfc, 0x83, 0x91, 0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, - 0x9e, 0x00, 0xa8, 0x1e, 0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2, 0xbc, 0x10, 0x90, - 0xca, 0x24, 0x36, 0xb0, 0x61, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x23, 0x83, 0xdd, - 0xfa, 0x00, 0x00, 0x00, -} - -func (this *Timestamp) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Timestamp) - if !ok { - that2, ok := that.(Timestamp) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Seconds != that1.Seconds { - if this.Seconds < that1.Seconds { - return -1 - } - return 1 - } - if this.Nanos != that1.Nanos { - if this.Nanos < that1.Nanos { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Timestamp) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Timestamp) - if !ok { - that2, ok := that.(Timestamp) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Seconds != that1.Seconds { - return false - } - if this.Nanos != that1.Nanos { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Timestamp) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&types.Timestamp{") - s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") - s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\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 valueToGoStringTimestamp(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 (m *Timestamp) 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 *Timestamp) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Timestamp) 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.Nanos != 0 { - i = encodeVarintTimestamp(dAtA, i, uint64(m.Nanos)) - i-- - dAtA[i] = 0x10 - } - if m.Seconds != 0 { - i = encodeVarintTimestamp(dAtA, i, uint64(m.Seconds)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTimestamp(dAtA []byte, offset int, v uint64) int { - offset -= sovTimestamp(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Timestamp) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Seconds != 0 { - n += 1 + sovTimestamp(uint64(m.Seconds)) - } - if m.Nanos != 0 { - n += 1 + sovTimestamp(uint64(m.Nanos)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovTimestamp(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTimestamp(x uint64) (n int) { - return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Timestamp) 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 ErrIntOverflowTimestamp - } - 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: Timestamp: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) - } - m.Seconds = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTimestamp - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Seconds |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) - } - m.Nanos = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTimestamp - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Nanos |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTimestamp(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTimestamp - } - 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 skipTimestamp(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, ErrIntOverflowTimestamp - } - 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, ErrIntOverflowTimestamp - } - 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, ErrIntOverflowTimestamp - } - 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, ErrInvalidLengthTimestamp - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTimestamp - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTimestamp - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTimestamp = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTimestamp = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTimestamp = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go b/tools/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go deleted file mode 100644 index e03fa1315..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go +++ /dev/null @@ -1,94 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, 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 types - -import ( - "time" -) - -func NewPopulatedTimestamp(r interface { - Int63() int64 -}, easy bool) *Timestamp { - this := &Timestamp{} - ns := int64(r.Int63()) - this.Seconds = ns / 1e9 - this.Nanos = int32(ns % 1e9) - return this -} - -func (ts *Timestamp) String() string { - return TimestampString(ts) -} - -func NewPopulatedStdTime(r interface { - Int63() int64 -}, easy bool) *time.Time { - timestamp := NewPopulatedTimestamp(r, easy) - t, err := TimestampFromProto(timestamp) - if err != nil { - return nil - } - return &t -} - -func SizeOfStdTime(t time.Time) int { - ts, err := TimestampProto(t) - if err != nil { - return 0 - } - return ts.Size() -} - -func StdTimeMarshal(t time.Time) ([]byte, error) { - size := SizeOfStdTime(t) - buf := make([]byte, size) - _, err := StdTimeMarshalTo(t, buf) - return buf, err -} - -func StdTimeMarshalTo(t time.Time, data []byte) (int, error) { - ts, err := TimestampProto(t) - if err != nil { - return 0, err - } - return ts.MarshalTo(data) -} - -func StdTimeUnmarshal(t *time.Time, data []byte) error { - ts := &Timestamp{} - if err := ts.Unmarshal(data); err != nil { - return err - } - tt, err := TimestampFromProto(ts) - if err != nil { - return err - } - *t = tt - return nil -} diff --git a/tools/vendor/github.com/gogo/protobuf/types/type.pb.go b/tools/vendor/github.com/gogo/protobuf/types/type.pb.go deleted file mode 100644 index 791427bb2..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/type.pb.go +++ /dev/null @@ -1,3355 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/type.proto - -package types - -import ( - bytes "bytes" - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" - reflect "reflect" - strconv "strconv" - 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 - -// The syntax in which a protocol buffer element is defined. -type Syntax int32 - -const ( - // Syntax `proto2`. - Syntax_SYNTAX_PROTO2 Syntax = 0 - // Syntax `proto3`. - Syntax_SYNTAX_PROTO3 Syntax = 1 -) - -var Syntax_name = map[int32]string{ - 0: "SYNTAX_PROTO2", - 1: "SYNTAX_PROTO3", -} - -var Syntax_value = map[string]int32{ - "SYNTAX_PROTO2": 0, - "SYNTAX_PROTO3": 1, -} - -func (Syntax) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{0} -} - -// Basic field types. -type Field_Kind int32 - -const ( - // Field type unknown. - Field_TYPE_UNKNOWN Field_Kind = 0 - // Field type double. - Field_TYPE_DOUBLE Field_Kind = 1 - // Field type float. - Field_TYPE_FLOAT Field_Kind = 2 - // Field type int64. - Field_TYPE_INT64 Field_Kind = 3 - // Field type uint64. - Field_TYPE_UINT64 Field_Kind = 4 - // Field type int32. - Field_TYPE_INT32 Field_Kind = 5 - // Field type fixed64. - Field_TYPE_FIXED64 Field_Kind = 6 - // Field type fixed32. - Field_TYPE_FIXED32 Field_Kind = 7 - // Field type bool. - Field_TYPE_BOOL Field_Kind = 8 - // Field type string. - Field_TYPE_STRING Field_Kind = 9 - // Field type group. Proto2 syntax only, and deprecated. - Field_TYPE_GROUP Field_Kind = 10 - // Field type message. - Field_TYPE_MESSAGE Field_Kind = 11 - // Field type bytes. - Field_TYPE_BYTES Field_Kind = 12 - // Field type uint32. - Field_TYPE_UINT32 Field_Kind = 13 - // Field type enum. - Field_TYPE_ENUM Field_Kind = 14 - // Field type sfixed32. - Field_TYPE_SFIXED32 Field_Kind = 15 - // Field type sfixed64. - Field_TYPE_SFIXED64 Field_Kind = 16 - // Field type sint32. - Field_TYPE_SINT32 Field_Kind = 17 - // Field type sint64. - Field_TYPE_SINT64 Field_Kind = 18 -) - -var Field_Kind_name = map[int32]string{ - 0: "TYPE_UNKNOWN", - 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 Field_Kind_value = map[string]int32{ - "TYPE_UNKNOWN": 0, - "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 (Field_Kind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{1, 0} -} - -// Whether a field is optional, required, or repeated. -type Field_Cardinality int32 - -const ( - // For fields with unknown cardinality. - Field_CARDINALITY_UNKNOWN Field_Cardinality = 0 - // For optional fields. - Field_CARDINALITY_OPTIONAL Field_Cardinality = 1 - // For required fields. Proto2 syntax only. - Field_CARDINALITY_REQUIRED Field_Cardinality = 2 - // For repeated fields. - Field_CARDINALITY_REPEATED Field_Cardinality = 3 -) - -var Field_Cardinality_name = map[int32]string{ - 0: "CARDINALITY_UNKNOWN", - 1: "CARDINALITY_OPTIONAL", - 2: "CARDINALITY_REQUIRED", - 3: "CARDINALITY_REPEATED", -} - -var Field_Cardinality_value = map[string]int32{ - "CARDINALITY_UNKNOWN": 0, - "CARDINALITY_OPTIONAL": 1, - "CARDINALITY_REQUIRED": 2, - "CARDINALITY_REPEATED": 3, -} - -func (Field_Cardinality) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{1, 1} -} - -// A protocol buffer message type. -type Type struct { - // The fully qualified message name. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The list of fields. - Fields []*Field `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` - // The list of types appearing in `oneof` definitions in this type. - Oneofs []string `protobuf:"bytes,3,rep,name=oneofs,proto3" json:"oneofs,omitempty"` - // The protocol buffer options. - Options []*Option `protobuf:"bytes,4,rep,name=options,proto3" json:"options,omitempty"` - // The source context. - SourceContext *SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` - // The source syntax. - Syntax Syntax `protobuf:"varint,6,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Type) Reset() { *m = Type{} } -func (*Type) ProtoMessage() {} -func (*Type) Descriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{0} -} -func (m *Type) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Type) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Type.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 *Type) XXX_Merge(src proto.Message) { - xxx_messageInfo_Type.Merge(m, src) -} -func (m *Type) XXX_Size() int { - return m.Size() -} -func (m *Type) XXX_DiscardUnknown() { - xxx_messageInfo_Type.DiscardUnknown(m) -} - -var xxx_messageInfo_Type proto.InternalMessageInfo - -func (m *Type) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Type) GetFields() []*Field { - if m != nil { - return m.Fields - } - return nil -} - -func (m *Type) GetOneofs() []string { - if m != nil { - return m.Oneofs - } - return nil -} - -func (m *Type) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (m *Type) GetSourceContext() *SourceContext { - if m != nil { - return m.SourceContext - } - return nil -} - -func (m *Type) GetSyntax() Syntax { - if m != nil { - return m.Syntax - } - return Syntax_SYNTAX_PROTO2 -} - -func (*Type) XXX_MessageName() string { - return "google.protobuf.Type" -} - -// A single field of a message type. -type Field struct { - // The field type. - Kind Field_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=google.protobuf.Field_Kind" json:"kind,omitempty"` - // The field cardinality. - Cardinality Field_Cardinality `protobuf:"varint,2,opt,name=cardinality,proto3,enum=google.protobuf.Field_Cardinality" json:"cardinality,omitempty"` - // The field number. - Number int32 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` - // The field name. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - // The field type URL, without the scheme, for message or enumeration - // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`. - TypeUrl string `protobuf:"bytes,6,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` - // The index of the field type in `Type.oneofs`, for message or enumeration - // types. The first type has index 1; zero means the type is not in the list. - OneofIndex int32 `protobuf:"varint,7,opt,name=oneof_index,json=oneofIndex,proto3" json:"oneof_index,omitempty"` - // Whether to use alternative packed wire representation. - Packed bool `protobuf:"varint,8,opt,name=packed,proto3" json:"packed,omitempty"` - // The protocol buffer options. - Options []*Option `protobuf:"bytes,9,rep,name=options,proto3" json:"options,omitempty"` - // The field JSON name. - JsonName string `protobuf:"bytes,10,opt,name=json_name,json=jsonName,proto3" json:"json_name,omitempty"` - // The string value of the default value of this field. Proto2 syntax only. - DefaultValue string `protobuf:"bytes,11,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Field) Reset() { *m = Field{} } -func (*Field) ProtoMessage() {} -func (*Field) Descriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{1} -} -func (m *Field) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Field.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 *Field) XXX_Merge(src proto.Message) { - xxx_messageInfo_Field.Merge(m, src) -} -func (m *Field) XXX_Size() int { - return m.Size() -} -func (m *Field) XXX_DiscardUnknown() { - xxx_messageInfo_Field.DiscardUnknown(m) -} - -var xxx_messageInfo_Field proto.InternalMessageInfo - -func (m *Field) GetKind() Field_Kind { - if m != nil { - return m.Kind - } - return Field_TYPE_UNKNOWN -} - -func (m *Field) GetCardinality() Field_Cardinality { - if m != nil { - return m.Cardinality - } - return Field_CARDINALITY_UNKNOWN -} - -func (m *Field) GetNumber() int32 { - if m != nil { - return m.Number - } - return 0 -} - -func (m *Field) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Field) GetTypeUrl() string { - if m != nil { - return m.TypeUrl - } - return "" -} - -func (m *Field) GetOneofIndex() int32 { - if m != nil { - return m.OneofIndex - } - return 0 -} - -func (m *Field) GetPacked() bool { - if m != nil { - return m.Packed - } - return false -} - -func (m *Field) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (m *Field) GetJsonName() string { - if m != nil { - return m.JsonName - } - return "" -} - -func (m *Field) GetDefaultValue() string { - if m != nil { - return m.DefaultValue - } - return "" -} - -func (*Field) XXX_MessageName() string { - return "google.protobuf.Field" -} - -// Enum type definition. -type Enum struct { - // Enum type name. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Enum value definitions. - Enumvalue []*EnumValue `protobuf:"bytes,2,rep,name=enumvalue,proto3" json:"enumvalue,omitempty"` - // Protocol buffer options. - Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` - // The source context. - SourceContext *SourceContext `protobuf:"bytes,4,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` - // The source syntax. - Syntax Syntax `protobuf:"varint,5,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Enum) Reset() { *m = Enum{} } -func (*Enum) ProtoMessage() {} -func (*Enum) Descriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{2} -} -func (m *Enum) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Enum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Enum.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 *Enum) XXX_Merge(src proto.Message) { - xxx_messageInfo_Enum.Merge(m, src) -} -func (m *Enum) XXX_Size() int { - return m.Size() -} -func (m *Enum) XXX_DiscardUnknown() { - xxx_messageInfo_Enum.DiscardUnknown(m) -} - -var xxx_messageInfo_Enum proto.InternalMessageInfo - -func (m *Enum) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Enum) GetEnumvalue() []*EnumValue { - if m != nil { - return m.Enumvalue - } - return nil -} - -func (m *Enum) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (m *Enum) GetSourceContext() *SourceContext { - if m != nil { - return m.SourceContext - } - return nil -} - -func (m *Enum) GetSyntax() Syntax { - if m != nil { - return m.Syntax - } - return Syntax_SYNTAX_PROTO2 -} - -func (*Enum) XXX_MessageName() string { - return "google.protobuf.Enum" -} - -// Enum value definition. -type EnumValue struct { - // Enum value name. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Enum value number. - Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` - // Protocol buffer options. - Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnumValue) Reset() { *m = EnumValue{} } -func (*EnumValue) ProtoMessage() {} -func (*EnumValue) Descriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{3} -} -func (m *EnumValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnumValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnumValue.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 *EnumValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnumValue.Merge(m, src) -} -func (m *EnumValue) XXX_Size() int { - return m.Size() -} -func (m *EnumValue) XXX_DiscardUnknown() { - xxx_messageInfo_EnumValue.DiscardUnknown(m) -} - -var xxx_messageInfo_EnumValue proto.InternalMessageInfo - -func (m *EnumValue) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *EnumValue) GetNumber() int32 { - if m != nil { - return m.Number - } - return 0 -} - -func (m *EnumValue) GetOptions() []*Option { - if m != nil { - return m.Options - } - return nil -} - -func (*EnumValue) XXX_MessageName() string { - return "google.protobuf.EnumValue" -} - -// A protocol buffer option, which can be attached to a message, field, -// enumeration, etc. -type Option struct { - // The option's name. For protobuf built-in options (options defined in - // descriptor.proto), this is the short name. For example, `"map_entry"`. - // For custom options, it should be the fully-qualified name. For example, - // `"google.api.http"`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The option's value packed in an Any message. If the value is a primitive, - // the corresponding wrapper type defined in google/protobuf/wrappers.proto - // should be used. If the value is an enum, it should be stored as an int32 - // value using the google.protobuf.Int32Value type. - Value *Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Option) Reset() { *m = Option{} } -func (*Option) ProtoMessage() {} -func (*Option) Descriptor() ([]byte, []int) { - return fileDescriptor_dd271cc1e348c538, []int{4} -} -func (m *Option) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Option.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 *Option) XXX_Merge(src proto.Message) { - xxx_messageInfo_Option.Merge(m, src) -} -func (m *Option) XXX_Size() int { - return m.Size() -} -func (m *Option) XXX_DiscardUnknown() { - xxx_messageInfo_Option.DiscardUnknown(m) -} - -var xxx_messageInfo_Option proto.InternalMessageInfo - -func (m *Option) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Option) GetValue() *Any { - if m != nil { - return m.Value - } - return nil -} - -func (*Option) XXX_MessageName() string { - return "google.protobuf.Option" -} -func init() { - proto.RegisterEnum("google.protobuf.Syntax", Syntax_name, Syntax_value) - proto.RegisterEnum("google.protobuf.Field_Kind", Field_Kind_name, Field_Kind_value) - proto.RegisterEnum("google.protobuf.Field_Cardinality", Field_Cardinality_name, Field_Cardinality_value) - proto.RegisterType((*Type)(nil), "google.protobuf.Type") - proto.RegisterType((*Field)(nil), "google.protobuf.Field") - proto.RegisterType((*Enum)(nil), "google.protobuf.Enum") - proto.RegisterType((*EnumValue)(nil), "google.protobuf.EnumValue") - proto.RegisterType((*Option)(nil), "google.protobuf.Option") -} - -func init() { proto.RegisterFile("google/protobuf/type.proto", fileDescriptor_dd271cc1e348c538) } - -var fileDescriptor_dd271cc1e348c538 = []byte{ - // 840 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcf, 0x73, 0xda, 0x46, - 0x14, 0xf6, 0x0a, 0x21, 0xa3, 0x87, 0xc1, 0x9b, 0x4d, 0x26, 0x51, 0x9c, 0x19, 0x95, 0xa1, 0x3d, - 0x30, 0x39, 0xe0, 0x29, 0x78, 0x3c, 0xbd, 0x82, 0x91, 0x29, 0x63, 0x22, 0xa9, 0x8b, 0x68, 0xe2, - 0x5e, 0x18, 0x0c, 0x72, 0x86, 0x44, 0xac, 0x18, 0x24, 0x5a, 0x73, 0xeb, 0x4c, 0xcf, 0xfd, 0x27, - 0x7a, 0xea, 0xf4, 0xdc, 0x3f, 0xc2, 0xc7, 0x1e, 0x7b, 0xac, 0xc9, 0xa5, 0xc7, 0x1c, 0x73, 0x6b, - 0x67, 0x57, 0x20, 0x8b, 0x1f, 0x9d, 0x49, 0xdb, 0x1b, 0xef, 0xfb, 0xbe, 0xf7, 0x73, 0x9f, 0x1e, - 0x70, 0xf4, 0xda, 0xf7, 0x5f, 0x7b, 0xee, 0xf1, 0x64, 0xea, 0x87, 0xfe, 0xd5, 0xec, 0xfa, 0x38, - 0x9c, 0x4f, 0xdc, 0xb2, 0xb0, 0xc8, 0x61, 0xc4, 0x95, 0x57, 0xdc, 0xd1, 0xd3, 0x4d, 0x71, 0x9f, - 0xcd, 0x23, 0xf6, 0xe8, 0xb3, 0x4d, 0x2a, 0xf0, 0x67, 0xd3, 0x81, 0xdb, 0x1b, 0xf8, 0x2c, 0x74, - 0x6f, 0xc2, 0x48, 0x55, 0xfc, 0x51, 0x02, 0xd9, 0x99, 0x4f, 0x5c, 0x42, 0x40, 0x66, 0xfd, 0xb1, - 0xab, 0xa1, 0x02, 0x2a, 0xa9, 0x54, 0xfc, 0x26, 0x65, 0x50, 0xae, 0x47, 0xae, 0x37, 0x0c, 0x34, - 0xa9, 0x90, 0x2a, 0x65, 0x2b, 0x8f, 0xcb, 0x1b, 0xf9, 0xcb, 0xe7, 0x9c, 0xa6, 0x4b, 0x15, 0x79, - 0x0c, 0x8a, 0xcf, 0x5c, 0xff, 0x3a, 0xd0, 0x52, 0x85, 0x54, 0x49, 0xa5, 0x4b, 0x8b, 0x7c, 0x0e, - 0xfb, 0xfe, 0x24, 0x1c, 0xf9, 0x2c, 0xd0, 0x64, 0x11, 0xe8, 0xc9, 0x56, 0x20, 0x4b, 0xf0, 0x74, - 0xa5, 0x23, 0x06, 0xe4, 0xd7, 0xeb, 0xd5, 0xd2, 0x05, 0x54, 0xca, 0x56, 0xf4, 0x2d, 0xcf, 0x8e, - 0x90, 0x9d, 0x45, 0x2a, 0x9a, 0x0b, 0x92, 0x26, 0x39, 0x06, 0x25, 0x98, 0xb3, 0xb0, 0x7f, 0xa3, - 0x29, 0x05, 0x54, 0xca, 0xef, 0x48, 0xdc, 0x11, 0x34, 0x5d, 0xca, 0x8a, 0xbf, 0x2a, 0x90, 0x16, - 0x4d, 0x91, 0x63, 0x90, 0xdf, 0x8e, 0xd8, 0x50, 0x0c, 0x24, 0x5f, 0x79, 0xb6, 0xbb, 0xf5, 0xf2, - 0xc5, 0x88, 0x0d, 0xa9, 0x10, 0x92, 0x06, 0x64, 0x07, 0xfd, 0xe9, 0x70, 0xc4, 0xfa, 0xde, 0x28, - 0x9c, 0x6b, 0x92, 0xf0, 0x2b, 0xfe, 0x83, 0xdf, 0xd9, 0xbd, 0x92, 0x26, 0xdd, 0xf8, 0x0c, 0xd9, - 0x6c, 0x7c, 0xe5, 0x4e, 0xb5, 0x54, 0x01, 0x95, 0xd2, 0x74, 0x69, 0xc5, 0xef, 0x23, 0x27, 0xde, - 0xe7, 0x29, 0x64, 0xf8, 0x72, 0xf4, 0x66, 0x53, 0x4f, 0xf4, 0xa7, 0xd2, 0x7d, 0x6e, 0x77, 0xa7, - 0x1e, 0xf9, 0x04, 0xb2, 0x62, 0xf8, 0xbd, 0x11, 0x1b, 0xba, 0x37, 0xda, 0xbe, 0x88, 0x05, 0x02, - 0x6a, 0x71, 0x84, 0xe7, 0x99, 0xf4, 0x07, 0x6f, 0xdd, 0xa1, 0x96, 0x29, 0xa0, 0x52, 0x86, 0x2e, - 0xad, 0xe4, 0x5b, 0xa9, 0x1f, 0xf9, 0x56, 0xcf, 0x40, 0x7d, 0x13, 0xf8, 0xac, 0x27, 0xea, 0x03, - 0x51, 0x47, 0x86, 0x03, 0x26, 0xaf, 0xf1, 0x53, 0xc8, 0x0d, 0xdd, 0xeb, 0xfe, 0xcc, 0x0b, 0x7b, - 0xdf, 0xf6, 0xbd, 0x99, 0xab, 0x65, 0x85, 0xe0, 0x60, 0x09, 0x7e, 0xcd, 0xb1, 0xe2, 0xad, 0x04, - 0x32, 0x9f, 0x24, 0xc1, 0x70, 0xe0, 0x5c, 0xda, 0x46, 0xaf, 0x6b, 0x5e, 0x98, 0xd6, 0x4b, 0x13, - 0xef, 0x91, 0x43, 0xc8, 0x0a, 0xa4, 0x61, 0x75, 0xeb, 0x6d, 0x03, 0x23, 0x92, 0x07, 0x10, 0xc0, - 0x79, 0xdb, 0xaa, 0x39, 0x58, 0x8a, 0xed, 0x96, 0xe9, 0x9c, 0x9e, 0xe0, 0x54, 0xec, 0xd0, 0x8d, - 0x00, 0x39, 0x29, 0xa8, 0x56, 0x70, 0x3a, 0xce, 0x71, 0xde, 0x7a, 0x65, 0x34, 0x4e, 0x4f, 0xb0, - 0xb2, 0x8e, 0x54, 0x2b, 0x78, 0x9f, 0xe4, 0x40, 0x15, 0x48, 0xdd, 0xb2, 0xda, 0x38, 0x13, 0xc7, - 0xec, 0x38, 0xb4, 0x65, 0x36, 0xb1, 0x1a, 0xc7, 0x6c, 0x52, 0xab, 0x6b, 0x63, 0x88, 0x23, 0xbc, - 0x30, 0x3a, 0x9d, 0x5a, 0xd3, 0xc0, 0xd9, 0x58, 0x51, 0xbf, 0x74, 0x8c, 0x0e, 0x3e, 0x58, 0x2b, - 0xab, 0x5a, 0xc1, 0xb9, 0x38, 0x85, 0x61, 0x76, 0x5f, 0xe0, 0x3c, 0x79, 0x00, 0xb9, 0x28, 0xc5, - 0xaa, 0x88, 0xc3, 0x0d, 0xe8, 0xf4, 0x04, 0xe3, 0xfb, 0x42, 0xa2, 0x28, 0x0f, 0xd6, 0x80, 0xd3, - 0x13, 0x4c, 0x8a, 0x21, 0x64, 0x13, 0xbb, 0x45, 0x9e, 0xc0, 0xc3, 0xb3, 0x1a, 0x6d, 0xb4, 0xcc, - 0x5a, 0xbb, 0xe5, 0x5c, 0x26, 0xe6, 0xaa, 0xc1, 0xa3, 0x24, 0x61, 0xd9, 0x4e, 0xcb, 0x32, 0x6b, - 0x6d, 0x8c, 0x36, 0x19, 0x6a, 0x7c, 0xd5, 0x6d, 0x51, 0xa3, 0x81, 0xa5, 0x6d, 0xc6, 0x36, 0x6a, - 0x8e, 0xd1, 0xc0, 0xa9, 0xe2, 0x5f, 0x08, 0x64, 0x83, 0xcd, 0xc6, 0x3b, 0xcf, 0xc8, 0x17, 0xa0, - 0xba, 0x6c, 0x36, 0x8e, 0x9e, 0x3f, 0xba, 0x24, 0x47, 0x5b, 0x4b, 0xc5, 0xbd, 0xc5, 0x32, 0xd0, - 0x7b, 0x71, 0x72, 0x19, 0x53, 0xff, 0xf9, 0x70, 0xc8, 0xff, 0xef, 0x70, 0xa4, 0x3f, 0xee, 0x70, - 0xbc, 0x01, 0x35, 0x6e, 0x61, 0xe7, 0x14, 0xee, 0x3f, 0x6c, 0x69, 0xed, 0xc3, 0xfe, 0xf7, 0x3d, - 0x16, 0xbf, 0x04, 0x25, 0x82, 0x76, 0x26, 0x7a, 0x0e, 0xe9, 0xd5, 0xa8, 0x79, 0xe3, 0x8f, 0xb6, - 0xc2, 0xd5, 0xd8, 0x9c, 0x46, 0x92, 0xe7, 0x65, 0x50, 0xa2, 0x3e, 0xf8, 0xb2, 0x75, 0x2e, 0x4d, - 0xa7, 0xf6, 0xaa, 0x67, 0x53, 0xcb, 0xb1, 0x2a, 0x78, 0x6f, 0x13, 0xaa, 0x62, 0x54, 0xff, 0x01, - 0xfd, 0x7e, 0xa7, 0xef, 0xbd, 0xbf, 0xd3, 0xd1, 0x87, 0x3b, 0x1d, 0x7d, 0xbf, 0xd0, 0xd1, 0xcf, - 0x0b, 0x1d, 0xdd, 0x2e, 0x74, 0xf4, 0xdb, 0x42, 0x47, 0x7f, 0x2c, 0x74, 0xf4, 0xe7, 0x42, 0xdf, - 0x7b, 0xcf, 0xf1, 0x77, 0x3a, 0xba, 0x7d, 0xa7, 0x23, 0x78, 0x38, 0xf0, 0xc7, 0x9b, 0x25, 0xd4, - 0x55, 0xfe, 0x9f, 0x63, 0x73, 0xcb, 0x46, 0xdf, 0xa4, 0xf9, 0xd1, 0x0a, 0x3e, 0x20, 0xf4, 0x93, - 0x94, 0x6a, 0xda, 0xf5, 0x5f, 0x24, 0xbd, 0x19, 0xc9, 0xed, 0x55, 0xc5, 0x2f, 0x5d, 0xcf, 0xbb, - 0x60, 0xfe, 0x77, 0x8c, 0xbb, 0x05, 0x57, 0x8a, 0x88, 0x53, 0xfd, 0x3b, 0x00, 0x00, 0xff, 0xff, - 0xbc, 0x2a, 0x5e, 0x82, 0x2b, 0x07, 0x00, 0x00, -} - -func (this *Type) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Type) - if !ok { - that2, ok := that.(Type) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if len(this.Fields) != len(that1.Fields) { - if len(this.Fields) < len(that1.Fields) { - return -1 - } - return 1 - } - for i := range this.Fields { - if c := this.Fields[i].Compare(that1.Fields[i]); c != 0 { - return c - } - } - if len(this.Oneofs) != len(that1.Oneofs) { - if len(this.Oneofs) < len(that1.Oneofs) { - return -1 - } - return 1 - } - for i := range this.Oneofs { - if this.Oneofs[i] != that1.Oneofs[i] { - if this.Oneofs[i] < that1.Oneofs[i] { - return -1 - } - return 1 - } - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { - return c - } - if this.Syntax != that1.Syntax { - if this.Syntax < that1.Syntax { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Field) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Field) - if !ok { - that2, ok := that.(Field) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Kind != that1.Kind { - if this.Kind < that1.Kind { - return -1 - } - return 1 - } - if this.Cardinality != that1.Cardinality { - if this.Cardinality < that1.Cardinality { - return -1 - } - return 1 - } - if this.Number != that1.Number { - if this.Number < that1.Number { - return -1 - } - return 1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if this.TypeUrl != that1.TypeUrl { - if this.TypeUrl < that1.TypeUrl { - return -1 - } - return 1 - } - if this.OneofIndex != that1.OneofIndex { - if this.OneofIndex < that1.OneofIndex { - return -1 - } - return 1 - } - if this.Packed != that1.Packed { - if !this.Packed { - return -1 - } - return 1 - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if this.JsonName != that1.JsonName { - if this.JsonName < that1.JsonName { - return -1 - } - return 1 - } - if this.DefaultValue != that1.DefaultValue { - if this.DefaultValue < that1.DefaultValue { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Enum) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Enum) - if !ok { - that2, ok := that.(Enum) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if len(this.Enumvalue) != len(that1.Enumvalue) { - if len(this.Enumvalue) < len(that1.Enumvalue) { - return -1 - } - return 1 - } - for i := range this.Enumvalue { - if c := this.Enumvalue[i].Compare(that1.Enumvalue[i]); c != 0 { - return c - } - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { - return c - } - if this.Syntax != that1.Syntax { - if this.Syntax < that1.Syntax { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *EnumValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*EnumValue) - if !ok { - that2, ok := that.(EnumValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if this.Number != that1.Number { - if this.Number < that1.Number { - return -1 - } - return 1 - } - if len(this.Options) != len(that1.Options) { - if len(this.Options) < len(that1.Options) { - return -1 - } - return 1 - } - for i := range this.Options { - if c := this.Options[i].Compare(that1.Options[i]); c != 0 { - return c - } - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Option) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Option) - if !ok { - that2, ok := that.(Option) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Name != that1.Name { - if this.Name < that1.Name { - return -1 - } - return 1 - } - if c := this.Value.Compare(that1.Value); c != 0 { - return c - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (x Syntax) String() string { - s, ok := Syntax_name[int32(x)] - if ok { - return s - } - return strconv.Itoa(int(x)) -} -func (x Field_Kind) String() string { - s, ok := Field_Kind_name[int32(x)] - if ok { - return s - } - return strconv.Itoa(int(x)) -} -func (x Field_Cardinality) String() string { - s, ok := Field_Cardinality_name[int32(x)] - if ok { - return s - } - return strconv.Itoa(int(x)) -} -func (this *Type) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Type) - if !ok { - that2, ok := that.(Type) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if len(this.Fields) != len(that1.Fields) { - return false - } - for i := range this.Fields { - if !this.Fields[i].Equal(that1.Fields[i]) { - return false - } - } - if len(this.Oneofs) != len(that1.Oneofs) { - return false - } - for i := range this.Oneofs { - if this.Oneofs[i] != that1.Oneofs[i] { - return false - } - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if !this.SourceContext.Equal(that1.SourceContext) { - return false - } - if this.Syntax != that1.Syntax { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Field) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Field) - if !ok { - that2, ok := that.(Field) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Kind != that1.Kind { - return false - } - if this.Cardinality != that1.Cardinality { - return false - } - if this.Number != that1.Number { - return false - } - if this.Name != that1.Name { - return false - } - if this.TypeUrl != that1.TypeUrl { - return false - } - if this.OneofIndex != that1.OneofIndex { - return false - } - if this.Packed != that1.Packed { - return false - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if this.JsonName != that1.JsonName { - return false - } - if this.DefaultValue != that1.DefaultValue { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Enum) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Enum) - if !ok { - that2, ok := that.(Enum) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if len(this.Enumvalue) != len(that1.Enumvalue) { - return false - } - for i := range this.Enumvalue { - if !this.Enumvalue[i].Equal(that1.Enumvalue[i]) { - return false - } - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if !this.SourceContext.Equal(that1.SourceContext) { - return false - } - if this.Syntax != that1.Syntax { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *EnumValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*EnumValue) - if !ok { - that2, ok := that.(EnumValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if this.Number != that1.Number { - return false - } - if len(this.Options) != len(that1.Options) { - return false - } - for i := range this.Options { - if !this.Options[i].Equal(that1.Options[i]) { - return false - } - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Option) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Option) - if !ok { - that2, ok := that.(Option) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Name != that1.Name { - return false - } - if !this.Value.Equal(that1.Value) { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Type) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 10) - s = append(s, "&types.Type{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - if this.Fields != nil { - s = append(s, "Fields: "+fmt.Sprintf("%#v", this.Fields)+",\n") - } - s = append(s, "Oneofs: "+fmt.Sprintf("%#v", this.Oneofs)+",\n") - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.SourceContext != nil { - s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") - } - s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\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 *Field) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 14) - s = append(s, "&types.Field{") - s = append(s, "Kind: "+fmt.Sprintf("%#v", this.Kind)+",\n") - s = append(s, "Cardinality: "+fmt.Sprintf("%#v", this.Cardinality)+",\n") - s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\n") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n") - s = append(s, "OneofIndex: "+fmt.Sprintf("%#v", this.OneofIndex)+",\n") - s = append(s, "Packed: "+fmt.Sprintf("%#v", this.Packed)+",\n") - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - s = append(s, "JsonName: "+fmt.Sprintf("%#v", this.JsonName)+",\n") - s = append(s, "DefaultValue: "+fmt.Sprintf("%#v", this.DefaultValue)+",\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 *Enum) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 9) - s = append(s, "&types.Enum{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - if this.Enumvalue != nil { - s = append(s, "Enumvalue: "+fmt.Sprintf("%#v", this.Enumvalue)+",\n") - } - if this.Options != nil { - s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") - } - if this.SourceContext != nil { - s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") - } - s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\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 *EnumValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&types.EnumValue{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\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 *Option) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&types.Option{") - s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") - if this.Value != nil { - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 valueToGoStringType(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 (m *Type) 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 *Type) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Type) 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.Syntax != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Syntax)) - i-- - dAtA[i] = 0x30 - } - if m.SourceContext != nil { - { - size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.Oneofs) > 0 { - for iNdEx := len(m.Oneofs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Oneofs[iNdEx]) - copy(dAtA[i:], m.Oneofs[iNdEx]) - i = encodeVarintType(dAtA, i, uint64(len(m.Oneofs[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Fields) > 0 { - for iNdEx := len(m.Fields) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Fields[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintType(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Field) 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 *Field) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Field) 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.DefaultValue) > 0 { - i -= len(m.DefaultValue) - copy(dAtA[i:], m.DefaultValue) - i = encodeVarintType(dAtA, i, uint64(len(m.DefaultValue))) - i-- - dAtA[i] = 0x5a - } - if len(m.JsonName) > 0 { - i -= len(m.JsonName) - copy(dAtA[i:], m.JsonName) - i = encodeVarintType(dAtA, i, uint64(len(m.JsonName))) - i-- - dAtA[i] = 0x52 - } - if len(m.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - } - if m.Packed { - i-- - if m.Packed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if m.OneofIndex != 0 { - i = encodeVarintType(dAtA, i, uint64(m.OneofIndex)) - i-- - dAtA[i] = 0x38 - } - if len(m.TypeUrl) > 0 { - i -= len(m.TypeUrl) - copy(dAtA[i:], m.TypeUrl) - i = encodeVarintType(dAtA, i, uint64(len(m.TypeUrl))) - i-- - dAtA[i] = 0x32 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintType(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x22 - } - if m.Number != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Number)) - i-- - dAtA[i] = 0x18 - } - if m.Cardinality != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Cardinality)) - i-- - dAtA[i] = 0x10 - } - if m.Kind != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Kind)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Enum) 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 *Enum) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Enum) 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.Syntax != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Syntax)) - i-- - dAtA[i] = 0x28 - } - if m.SourceContext != nil { - { - size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if len(m.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Enumvalue) > 0 { - for iNdEx := len(m.Enumvalue) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Enumvalue[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintType(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnumValue) 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 *EnumValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnumValue) 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.Options) > 0 { - for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.Number != 0 { - i = encodeVarintType(dAtA, i, uint64(m.Number)) - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintType(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Option) 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 *Option) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Option) 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 != nil { - { - size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintType(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintType(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintType(dAtA []byte, offset int, v uint64) int { - offset -= sovType(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedType(r randyType, easy bool) *Type { - this := &Type{} - this.Name = string(randStringType(r)) - if r.Intn(5) != 0 { - v1 := r.Intn(5) - this.Fields = make([]*Field, v1) - for i := 0; i < v1; i++ { - this.Fields[i] = NewPopulatedField(r, easy) - } - } - v2 := r.Intn(10) - this.Oneofs = make([]string, v2) - for i := 0; i < v2; i++ { - this.Oneofs[i] = string(randStringType(r)) - } - if r.Intn(5) != 0 { - v3 := r.Intn(5) - this.Options = make([]*Option, v3) - for i := 0; i < v3; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - if r.Intn(5) != 0 { - this.SourceContext = NewPopulatedSourceContext(r, easy) - } - this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedType(r, 7) - } - return this -} - -func NewPopulatedField(r randyType, easy bool) *Field { - this := &Field{} - this.Kind = Field_Kind([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}[r.Intn(19)]) - this.Cardinality = Field_Cardinality([]int32{0, 1, 2, 3}[r.Intn(4)]) - this.Number = int32(r.Int31()) - if r.Intn(2) == 0 { - this.Number *= -1 - } - this.Name = string(randStringType(r)) - this.TypeUrl = string(randStringType(r)) - this.OneofIndex = int32(r.Int31()) - if r.Intn(2) == 0 { - this.OneofIndex *= -1 - } - this.Packed = bool(bool(r.Intn(2) == 0)) - if r.Intn(5) != 0 { - v4 := r.Intn(5) - this.Options = make([]*Option, v4) - for i := 0; i < v4; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - this.JsonName = string(randStringType(r)) - this.DefaultValue = string(randStringType(r)) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedType(r, 12) - } - return this -} - -func NewPopulatedEnum(r randyType, easy bool) *Enum { - this := &Enum{} - this.Name = string(randStringType(r)) - if r.Intn(5) != 0 { - v5 := r.Intn(5) - this.Enumvalue = make([]*EnumValue, v5) - for i := 0; i < v5; i++ { - this.Enumvalue[i] = NewPopulatedEnumValue(r, easy) - } - } - if r.Intn(5) != 0 { - v6 := r.Intn(5) - this.Options = make([]*Option, v6) - for i := 0; i < v6; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - if r.Intn(5) != 0 { - this.SourceContext = NewPopulatedSourceContext(r, easy) - } - this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedType(r, 6) - } - return this -} - -func NewPopulatedEnumValue(r randyType, easy bool) *EnumValue { - this := &EnumValue{} - this.Name = string(randStringType(r)) - this.Number = int32(r.Int31()) - if r.Intn(2) == 0 { - this.Number *= -1 - } - if r.Intn(5) != 0 { - v7 := r.Intn(5) - this.Options = make([]*Option, v7) - for i := 0; i < v7; i++ { - this.Options[i] = NewPopulatedOption(r, easy) - } - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedType(r, 4) - } - return this -} - -func NewPopulatedOption(r randyType, easy bool) *Option { - this := &Option{} - this.Name = string(randStringType(r)) - if r.Intn(5) != 0 { - this.Value = NewPopulatedAny(r, easy) - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedType(r, 3) - } - return this -} - -type randyType interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneType(r randyType) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringType(r randyType) string { - v8 := r.Intn(100) - tmps := make([]rune, v8) - for i := 0; i < v8; i++ { - tmps[i] = randUTF8RuneType(r) - } - return string(tmps) -} -func randUnrecognizedType(r randyType, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldType(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldType(dAtA []byte, r randyType, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateType(dAtA, uint64(key)) - v9 := r.Int63() - if r.Intn(2) == 0 { - v9 *= -1 - } - dAtA = encodeVarintPopulateType(dAtA, uint64(v9)) - case 1: - dAtA = encodeVarintPopulateType(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateType(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateType(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateType(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateType(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *Type) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if len(m.Fields) > 0 { - for _, e := range m.Fields { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - if len(m.Oneofs) > 0 { - for _, s := range m.Oneofs { - l = len(s) - n += 1 + l + sovType(uint64(l)) - } - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - if m.SourceContext != nil { - l = m.SourceContext.Size() - n += 1 + l + sovType(uint64(l)) - } - if m.Syntax != 0 { - n += 1 + sovType(uint64(m.Syntax)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Field) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Kind != 0 { - n += 1 + sovType(uint64(m.Kind)) - } - if m.Cardinality != 0 { - n += 1 + sovType(uint64(m.Cardinality)) - } - if m.Number != 0 { - n += 1 + sovType(uint64(m.Number)) - } - l = len(m.Name) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - l = len(m.TypeUrl) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if m.OneofIndex != 0 { - n += 1 + sovType(uint64(m.OneofIndex)) - } - if m.Packed { - n += 2 - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - l = len(m.JsonName) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - l = len(m.DefaultValue) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Enum) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if len(m.Enumvalue) > 0 { - for _, e := range m.Enumvalue { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - if m.SourceContext != nil { - l = m.SourceContext.Size() - n += 1 + l + sovType(uint64(l)) - } - if m.Syntax != 0 { - n += 1 + sovType(uint64(m.Syntax)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnumValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if m.Number != 0 { - n += 1 + sovType(uint64(m.Number)) - } - if len(m.Options) > 0 { - for _, e := range m.Options { - l = e.Size() - n += 1 + l + sovType(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Option) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovType(uint64(l)) - } - if m.Value != nil { - l = m.Value.Size() - n += 1 + l + sovType(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovType(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozType(x uint64) (n int) { - return sovType(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Type) String() string { - if this == nil { - return "nil" - } - repeatedStringForFields := "[]*Field{" - for _, f := range this.Fields { - repeatedStringForFields += strings.Replace(f.String(), "Field", "Field", 1) + "," - } - repeatedStringForFields += "}" - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - s := strings.Join([]string{`&Type{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Fields:` + repeatedStringForFields + `,`, - `Oneofs:` + fmt.Sprintf("%v", this.Oneofs) + `,`, - `Options:` + repeatedStringForOptions + `,`, - `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, - `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Field) String() string { - if this == nil { - return "nil" - } - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - s := strings.Join([]string{`&Field{`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, - `Cardinality:` + fmt.Sprintf("%v", this.Cardinality) + `,`, - `Number:` + fmt.Sprintf("%v", this.Number) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`, - `OneofIndex:` + fmt.Sprintf("%v", this.OneofIndex) + `,`, - `Packed:` + fmt.Sprintf("%v", this.Packed) + `,`, - `Options:` + repeatedStringForOptions + `,`, - `JsonName:` + fmt.Sprintf("%v", this.JsonName) + `,`, - `DefaultValue:` + fmt.Sprintf("%v", this.DefaultValue) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Enum) String() string { - if this == nil { - return "nil" - } - repeatedStringForEnumvalue := "[]*EnumValue{" - for _, f := range this.Enumvalue { - repeatedStringForEnumvalue += strings.Replace(f.String(), "EnumValue", "EnumValue", 1) + "," - } - repeatedStringForEnumvalue += "}" - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - s := strings.Join([]string{`&Enum{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Enumvalue:` + repeatedStringForEnumvalue + `,`, - `Options:` + repeatedStringForOptions + `,`, - `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, - `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *EnumValue) String() string { - if this == nil { - return "nil" - } - repeatedStringForOptions := "[]*Option{" - for _, f := range this.Options { - repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," - } - repeatedStringForOptions += "}" - s := strings.Join([]string{`&EnumValue{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Number:` + fmt.Sprintf("%v", this.Number) + `,`, - `Options:` + repeatedStringForOptions + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Option) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Option{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Value:` + strings.Replace(fmt.Sprintf("%v", this.Value), "Any", "Any", 1) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringType(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Type) 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 ErrIntOverflowType - } - 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: Type: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Type: 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 ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Fields = append(m.Fields, &Field{}) - if err := m.Fields[len(m.Fields)-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 Oneofs", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Oneofs = append(m.Oneofs, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-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 SourceContext", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SourceContext == nil { - m.SourceContext = &SourceContext{} - } - if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) - } - m.Syntax = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Syntax |= Syntax(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipType(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthType - } - 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 *Field) 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 ErrIntOverflowType - } - 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: Field: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Field: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) - } - m.Kind = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Kind |= Field_Kind(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Cardinality", wireType) - } - m.Cardinality = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Cardinality |= Field_Cardinality(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Number", wireType) - } - m.Number = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Number |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - 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 ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TypeUrl = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OneofIndex", wireType) - } - m.OneofIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.OneofIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Packed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Packed = bool(v != 0) - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field JsonName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.JsonName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultValue", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultValue = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipType(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthType - } - 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 *Enum) 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 ErrIntOverflowType - } - 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: Enum: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Enum: 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 ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Enumvalue", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Enumvalue = append(m.Enumvalue, &EnumValue{}) - if err := m.Enumvalue[len(m.Enumvalue)-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 Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-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 SourceContext", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SourceContext == nil { - m.SourceContext = &SourceContext{} - } - if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) - } - m.Syntax = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Syntax |= Syntax(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipType(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthType - } - 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 *EnumValue) 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 ErrIntOverflowType - } - 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: EnumValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnumValue: 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 ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - 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 Number", wireType) - } - m.Number = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Number |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Options = append(m.Options, &Option{}) - if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipType(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthType - } - 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 *Option) 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 ErrIntOverflowType - } - 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: Option: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Option: 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 ErrIntOverflowType - } - 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 ErrInvalidLengthType - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowType - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthType - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthType - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Value == nil { - m.Value = &Any{} - } - if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipType(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthType - } - 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 skipType(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, ErrIntOverflowType - } - 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, ErrIntOverflowType - } - 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, ErrIntOverflowType - } - 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, ErrInvalidLengthType - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupType - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthType - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthType = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowType = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupType = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/wrappers.pb.go b/tools/vendor/github.com/gogo/protobuf/types/wrappers.pb.go deleted file mode 100644 index 8d415420a..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/wrappers.pb.go +++ /dev/null @@ -1,2703 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: google/protobuf/wrappers.proto - -package types - -import ( - bytes "bytes" - encoding_binary "encoding/binary" - fmt "fmt" - 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 - -// Wrapper message for `double`. -// -// The JSON representation for `DoubleValue` is JSON number. -type DoubleValue struct { - // The double value. - Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DoubleValue) Reset() { *m = DoubleValue{} } -func (*DoubleValue) ProtoMessage() {} -func (*DoubleValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{0} -} -func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } -func (m *DoubleValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DoubleValue.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 *DoubleValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_DoubleValue.Merge(m, src) -} -func (m *DoubleValue) XXX_Size() int { - return m.Size() -} -func (m *DoubleValue) XXX_DiscardUnknown() { - xxx_messageInfo_DoubleValue.DiscardUnknown(m) -} - -var xxx_messageInfo_DoubleValue proto.InternalMessageInfo - -func (m *DoubleValue) GetValue() float64 { - if m != nil { - return m.Value - } - return 0 -} - -func (*DoubleValue) XXX_MessageName() string { - return "google.protobuf.DoubleValue" -} - -// Wrapper message for `float`. -// -// The JSON representation for `FloatValue` is JSON number. -type FloatValue struct { - // The float value. - Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FloatValue) Reset() { *m = FloatValue{} } -func (*FloatValue) ProtoMessage() {} -func (*FloatValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{1} -} -func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } -func (m *FloatValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_FloatValue.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 *FloatValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_FloatValue.Merge(m, src) -} -func (m *FloatValue) XXX_Size() int { - return m.Size() -} -func (m *FloatValue) XXX_DiscardUnknown() { - xxx_messageInfo_FloatValue.DiscardUnknown(m) -} - -var xxx_messageInfo_FloatValue proto.InternalMessageInfo - -func (m *FloatValue) GetValue() float32 { - if m != nil { - return m.Value - } - return 0 -} - -func (*FloatValue) XXX_MessageName() string { - return "google.protobuf.FloatValue" -} - -// Wrapper message for `int64`. -// -// The JSON representation for `Int64Value` is JSON string. -type Int64Value struct { - // The int64 value. - Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Int64Value) Reset() { *m = Int64Value{} } -func (*Int64Value) ProtoMessage() {} -func (*Int64Value) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{2} -} -func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } -func (m *Int64Value) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Int64Value.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 *Int64Value) XXX_Merge(src proto.Message) { - xxx_messageInfo_Int64Value.Merge(m, src) -} -func (m *Int64Value) XXX_Size() int { - return m.Size() -} -func (m *Int64Value) XXX_DiscardUnknown() { - xxx_messageInfo_Int64Value.DiscardUnknown(m) -} - -var xxx_messageInfo_Int64Value proto.InternalMessageInfo - -func (m *Int64Value) GetValue() int64 { - if m != nil { - return m.Value - } - return 0 -} - -func (*Int64Value) XXX_MessageName() string { - return "google.protobuf.Int64Value" -} - -// Wrapper message for `uint64`. -// -// The JSON representation for `UInt64Value` is JSON string. -type UInt64Value struct { - // The uint64 value. - Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UInt64Value) Reset() { *m = UInt64Value{} } -func (*UInt64Value) ProtoMessage() {} -func (*UInt64Value) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{3} -} -func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } -func (m *UInt64Value) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UInt64Value.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 *UInt64Value) XXX_Merge(src proto.Message) { - xxx_messageInfo_UInt64Value.Merge(m, src) -} -func (m *UInt64Value) XXX_Size() int { - return m.Size() -} -func (m *UInt64Value) XXX_DiscardUnknown() { - xxx_messageInfo_UInt64Value.DiscardUnknown(m) -} - -var xxx_messageInfo_UInt64Value proto.InternalMessageInfo - -func (m *UInt64Value) GetValue() uint64 { - if m != nil { - return m.Value - } - return 0 -} - -func (*UInt64Value) XXX_MessageName() string { - return "google.protobuf.UInt64Value" -} - -// Wrapper message for `int32`. -// -// The JSON representation for `Int32Value` is JSON number. -type Int32Value struct { - // The int32 value. - Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Int32Value) Reset() { *m = Int32Value{} } -func (*Int32Value) ProtoMessage() {} -func (*Int32Value) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{4} -} -func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } -func (m *Int32Value) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Int32Value.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 *Int32Value) XXX_Merge(src proto.Message) { - xxx_messageInfo_Int32Value.Merge(m, src) -} -func (m *Int32Value) XXX_Size() int { - return m.Size() -} -func (m *Int32Value) XXX_DiscardUnknown() { - xxx_messageInfo_Int32Value.DiscardUnknown(m) -} - -var xxx_messageInfo_Int32Value proto.InternalMessageInfo - -func (m *Int32Value) GetValue() int32 { - if m != nil { - return m.Value - } - return 0 -} - -func (*Int32Value) XXX_MessageName() string { - return "google.protobuf.Int32Value" -} - -// Wrapper message for `uint32`. -// -// The JSON representation for `UInt32Value` is JSON number. -type UInt32Value struct { - // The uint32 value. - Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UInt32Value) Reset() { *m = UInt32Value{} } -func (*UInt32Value) ProtoMessage() {} -func (*UInt32Value) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{5} -} -func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } -func (m *UInt32Value) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UInt32Value.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 *UInt32Value) XXX_Merge(src proto.Message) { - xxx_messageInfo_UInt32Value.Merge(m, src) -} -func (m *UInt32Value) XXX_Size() int { - return m.Size() -} -func (m *UInt32Value) XXX_DiscardUnknown() { - xxx_messageInfo_UInt32Value.DiscardUnknown(m) -} - -var xxx_messageInfo_UInt32Value proto.InternalMessageInfo - -func (m *UInt32Value) GetValue() uint32 { - if m != nil { - return m.Value - } - return 0 -} - -func (*UInt32Value) XXX_MessageName() string { - return "google.protobuf.UInt32Value" -} - -// Wrapper message for `bool`. -// -// The JSON representation for `BoolValue` is JSON `true` and `false`. -type BoolValue struct { - // The bool value. - Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BoolValue) Reset() { *m = BoolValue{} } -func (*BoolValue) ProtoMessage() {} -func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{6} -} -func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } -func (m *BoolValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BoolValue.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 *BoolValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_BoolValue.Merge(m, src) -} -func (m *BoolValue) XXX_Size() int { - return m.Size() -} -func (m *BoolValue) XXX_DiscardUnknown() { - xxx_messageInfo_BoolValue.DiscardUnknown(m) -} - -var xxx_messageInfo_BoolValue proto.InternalMessageInfo - -func (m *BoolValue) GetValue() bool { - if m != nil { - return m.Value - } - return false -} - -func (*BoolValue) XXX_MessageName() string { - return "google.protobuf.BoolValue" -} - -// Wrapper message for `string`. -// -// The JSON representation for `StringValue` is JSON string. -type StringValue struct { - // The string value. - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StringValue) Reset() { *m = StringValue{} } -func (*StringValue) ProtoMessage() {} -func (*StringValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{7} -} -func (*StringValue) XXX_WellKnownType() string { return "StringValue" } -func (m *StringValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StringValue.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 *StringValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_StringValue.Merge(m, src) -} -func (m *StringValue) XXX_Size() int { - return m.Size() -} -func (m *StringValue) XXX_DiscardUnknown() { - xxx_messageInfo_StringValue.DiscardUnknown(m) -} - -var xxx_messageInfo_StringValue proto.InternalMessageInfo - -func (m *StringValue) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -func (*StringValue) XXX_MessageName() string { - return "google.protobuf.StringValue" -} - -// Wrapper message for `bytes`. -// -// The JSON representation for `BytesValue` is JSON string. -type BytesValue struct { - // The bytes value. - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BytesValue) Reset() { *m = BytesValue{} } -func (*BytesValue) ProtoMessage() {} -func (*BytesValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5377b62bda767935, []int{8} -} -func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } -func (m *BytesValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BytesValue.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 *BytesValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_BytesValue.Merge(m, src) -} -func (m *BytesValue) XXX_Size() int { - return m.Size() -} -func (m *BytesValue) XXX_DiscardUnknown() { - xxx_messageInfo_BytesValue.DiscardUnknown(m) -} - -var xxx_messageInfo_BytesValue proto.InternalMessageInfo - -func (m *BytesValue) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (*BytesValue) XXX_MessageName() string { - return "google.protobuf.BytesValue" -} -func init() { - proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") - proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") - proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") - proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") - proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") - proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") - proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") - proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") - proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") -} - -func init() { proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor_5377b62bda767935) } - -var fileDescriptor_5377b62bda767935 = []byte{ - // 285 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, - 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, - 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, - 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, - 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, - 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, - 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, - 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, - 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x3b, - 0xe3, 0x8d, 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xfe, 0x78, 0x28, 0xc7, 0xd8, 0xf0, 0x48, - 0x8e, 0x71, 0xc5, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, - 0x48, 0x8e, 0xf1, 0xc5, 0x23, 0x39, 0x86, 0x0f, 0x20, 0xf1, 0xc7, 0x72, 0x8c, 0x27, 0x1e, 0xcb, - 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x45, 0x87, 0x13, 0x6f, 0x38, 0x34, 0xbe, 0x02, - 0x40, 0x22, 0x01, 0x8c, 0x51, 0xac, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x3f, 0x18, 0x19, 0x17, 0x31, - 0x31, 0xbb, 0x07, 0x38, 0xad, 0x62, 0x92, 0x73, 0x87, 0x68, 0x09, 0x80, 0x6a, 0xd1, 0x0b, 0x4f, - 0xcd, 0xc9, 0xf1, 0xce, 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0xa9, 0x4c, 0x62, 0x03, 0x9b, 0x65, 0x0c, - 0x08, 0x00, 0x00, 0xff, 0xff, 0x31, 0x55, 0x64, 0x90, 0x0a, 0x02, 0x00, 0x00, -} - -func (this *DoubleValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*DoubleValue) - if !ok { - that2, ok := that.(DoubleValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *FloatValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*FloatValue) - if !ok { - that2, ok := that.(FloatValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Int64Value) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Int64Value) - if !ok { - that2, ok := that.(Int64Value) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *UInt64Value) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*UInt64Value) - if !ok { - that2, ok := that.(UInt64Value) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *Int32Value) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*Int32Value) - if !ok { - that2, ok := that.(Int32Value) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *UInt32Value) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*UInt32Value) - if !ok { - that2, ok := that.(UInt32Value) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *BoolValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*BoolValue) - if !ok { - that2, ok := that.(BoolValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if !this.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *StringValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*StringValue) - if !ok { - that2, ok := that.(StringValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if this.Value != that1.Value { - if this.Value < that1.Value { - return -1 - } - return 1 - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *BytesValue) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*BytesValue) - if !ok { - that2, ok := that.(BytesValue) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := bytes.Compare(this.Value, that1.Value); c != 0 { - return c - } - if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { - return c - } - return 0 -} -func (this *DoubleValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*DoubleValue) - if !ok { - that2, ok := that.(DoubleValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *FloatValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*FloatValue) - if !ok { - that2, ok := that.(FloatValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Int64Value) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Int64Value) - if !ok { - that2, ok := that.(Int64Value) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *UInt64Value) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*UInt64Value) - if !ok { - that2, ok := that.(UInt64Value) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *Int32Value) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Int32Value) - if !ok { - that2, ok := that.(Int32Value) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *UInt32Value) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*UInt32Value) - if !ok { - that2, ok := that.(UInt32Value) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *BoolValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*BoolValue) - if !ok { - that2, ok := that.(BoolValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *StringValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*StringValue) - if !ok { - that2, ok := that.(StringValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *BytesValue) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*BytesValue) - if !ok { - that2, ok := that.(BytesValue) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !bytes.Equal(this.Value, that1.Value) { - return false - } - if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { - return false - } - return true -} -func (this *DoubleValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.DoubleValue{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *FloatValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.FloatValue{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *Int64Value) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.Int64Value{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *UInt64Value) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.UInt64Value{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *Int32Value) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.Int32Value{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *UInt32Value) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.UInt32Value{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *BoolValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.BoolValue{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *StringValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.StringValue{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 *BytesValue) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 5) - s = append(s, "&types.BytesValue{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\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 valueToGoStringWrappers(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 (m *DoubleValue) 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 *DoubleValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DoubleValue) 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 -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) - i-- - dAtA[i] = 0x9 - } - return len(dAtA) - i, nil -} - -func (m *FloatValue) 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 *FloatValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *FloatValue) 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 -= 4 - encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.Value)))) - i-- - dAtA[i] = 0xd - } - return len(dAtA) - i, nil -} - -func (m *Int64Value) 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 *Int64Value) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Int64Value) 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 = encodeVarintWrappers(dAtA, i, uint64(m.Value)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *UInt64Value) 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 *UInt64Value) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UInt64Value) 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 = encodeVarintWrappers(dAtA, i, uint64(m.Value)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Int32Value) 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 *Int32Value) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Int32Value) 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 = encodeVarintWrappers(dAtA, i, uint64(m.Value)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *UInt32Value) 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 *UInt32Value) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UInt32Value) 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 = encodeVarintWrappers(dAtA, i, uint64(m.Value)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *BoolValue) 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 *BoolValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BoolValue) 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 { - i-- - if m.Value { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *StringValue) 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 *StringValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StringValue) 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.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintWrappers(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *BytesValue) 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 *BytesValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BytesValue) 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.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintWrappers(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintWrappers(dAtA []byte, offset int, v uint64) int { - offset -= sovWrappers(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func NewPopulatedDoubleValue(r randyWrappers, easy bool) *DoubleValue { - this := &DoubleValue{} - this.Value = float64(r.Float64()) - if r.Intn(2) == 0 { - this.Value *= -1 - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedFloatValue(r randyWrappers, easy bool) *FloatValue { - this := &FloatValue{} - this.Value = float32(r.Float32()) - if r.Intn(2) == 0 { - this.Value *= -1 - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedInt64Value(r randyWrappers, easy bool) *Int64Value { - this := &Int64Value{} - this.Value = int64(r.Int63()) - if r.Intn(2) == 0 { - this.Value *= -1 - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedUInt64Value(r randyWrappers, easy bool) *UInt64Value { - this := &UInt64Value{} - this.Value = uint64(uint64(r.Uint32())) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedInt32Value(r randyWrappers, easy bool) *Int32Value { - this := &Int32Value{} - this.Value = int32(r.Int31()) - if r.Intn(2) == 0 { - this.Value *= -1 - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedUInt32Value(r randyWrappers, easy bool) *UInt32Value { - this := &UInt32Value{} - this.Value = uint32(r.Uint32()) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedBoolValue(r randyWrappers, easy bool) *BoolValue { - this := &BoolValue{} - this.Value = bool(bool(r.Intn(2) == 0)) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedStringValue(r randyWrappers, easy bool) *StringValue { - this := &StringValue{} - this.Value = string(randStringWrappers(r)) - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -func NewPopulatedBytesValue(r randyWrappers, easy bool) *BytesValue { - this := &BytesValue{} - v1 := r.Intn(100) - this.Value = make([]byte, v1) - for i := 0; i < v1; i++ { - this.Value[i] = byte(r.Intn(256)) - } - if !easy && r.Intn(10) != 0 { - this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) - } - return this -} - -type randyWrappers interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneWrappers(r randyWrappers) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} -func randStringWrappers(r randyWrappers) string { - v2 := r.Intn(100) - tmps := make([]rune, v2) - for i := 0; i < v2; i++ { - tmps[i] = randUTF8RuneWrappers(r) - } - return string(tmps) -} -func randUnrecognizedWrappers(r randyWrappers, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldWrappers(dAtA, r, fieldNumber, wire) - } - return dAtA -} -func randFieldWrappers(dAtA []byte, r randyWrappers, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) - v3 := r.Int63() - if r.Intn(2) == 0 { - v3 *= -1 - } - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(v3)) - case 1: - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} -func encodeVarintPopulateWrappers(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} -func (m *DoubleValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 9 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *FloatValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 5 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Int64Value) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 1 + sovWrappers(uint64(m.Value)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *UInt64Value) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 1 + sovWrappers(uint64(m.Value)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Int32Value) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 1 + sovWrappers(uint64(m.Value)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *UInt32Value) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != 0 { - n += 1 + sovWrappers(uint64(m.Value)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *BoolValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StringValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Value) - if l > 0 { - n += 1 + l + sovWrappers(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *BytesValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Value) - if l > 0 { - n += 1 + l + sovWrappers(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovWrappers(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozWrappers(x uint64) (n int) { - return sovWrappers(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *DoubleValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&DoubleValue{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *FloatValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&FloatValue{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Int64Value) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Int64Value{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *UInt64Value) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&UInt64Value{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *Int32Value) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Int32Value{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *UInt32Value) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&UInt32Value{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *BoolValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&BoolValue{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *StringValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&StringValue{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func (this *BytesValue) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&BytesValue{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, - `}`, - }, "") - return s -} -func valueToStringWrappers(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *DoubleValue) 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 ErrIntOverflowWrappers - } - 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: DoubleValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DoubleValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var v uint64 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - m.Value = float64(math.Float64frombits(v)) - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *FloatValue) 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 ErrIntOverflowWrappers - } - 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: FloatValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FloatValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 5 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var v uint32 - if (iNdEx + 4) > l { - return io.ErrUnexpectedEOF - } - v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) - iNdEx += 4 - m.Value = float32(math.Float32frombits(v)) - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *Int64Value) 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 ErrIntOverflowWrappers - } - 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: Int64Value: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Int64Value: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowWrappers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Value |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *UInt64Value) 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 ErrIntOverflowWrappers - } - 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: UInt64Value: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UInt64Value: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowWrappers - } - 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 := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *Int32Value) 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 ErrIntOverflowWrappers - } - 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: Int32Value: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Int32Value: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowWrappers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Value |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *UInt32Value) 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 ErrIntOverflowWrappers - } - 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: UInt32Value: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UInt32Value: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowWrappers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Value |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *BoolValue) 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 ErrIntOverflowWrappers - } - 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: BoolValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWrappers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Value = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *StringValue) 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 ErrIntOverflowWrappers - } - 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: StringValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StringValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWrappers - } - 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 ErrInvalidLengthWrappers - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthWrappers - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 *BytesValue) 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 ErrIntOverflowWrappers - } - 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: BytesValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BytesValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWrappers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthWrappers - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthWrappers - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) - if m.Value == nil { - m.Value = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipWrappers(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWrappers - } - 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 skipWrappers(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, ErrIntOverflowWrappers - } - 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, ErrIntOverflowWrappers - } - 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, ErrIntOverflowWrappers - } - 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, ErrInvalidLengthWrappers - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupWrappers - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthWrappers - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthWrappers = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowWrappers = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupWrappers = fmt.Errorf("proto: unexpected end of group") -) diff --git a/tools/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go b/tools/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go deleted file mode 100644 index d905df360..000000000 --- a/tools/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go +++ /dev/null @@ -1,300 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, 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 types - -func NewPopulatedStdDouble(r randyWrappers, easy bool) *float64 { - v := NewPopulatedDoubleValue(r, easy) - return &v.Value -} - -func SizeOfStdDouble(v float64) int { - pv := &DoubleValue{Value: v} - return pv.Size() -} - -func StdDoubleMarshal(v float64) ([]byte, error) { - size := SizeOfStdDouble(v) - buf := make([]byte, size) - _, err := StdDoubleMarshalTo(v, buf) - return buf, err -} - -func StdDoubleMarshalTo(v float64, data []byte) (int, error) { - pv := &DoubleValue{Value: v} - return pv.MarshalTo(data) -} - -func StdDoubleUnmarshal(v *float64, data []byte) error { - pv := &DoubleValue{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdFloat(r randyWrappers, easy bool) *float32 { - v := NewPopulatedFloatValue(r, easy) - return &v.Value -} - -func SizeOfStdFloat(v float32) int { - pv := &FloatValue{Value: v} - return pv.Size() -} - -func StdFloatMarshal(v float32) ([]byte, error) { - size := SizeOfStdFloat(v) - buf := make([]byte, size) - _, err := StdFloatMarshalTo(v, buf) - return buf, err -} - -func StdFloatMarshalTo(v float32, data []byte) (int, error) { - pv := &FloatValue{Value: v} - return pv.MarshalTo(data) -} - -func StdFloatUnmarshal(v *float32, data []byte) error { - pv := &FloatValue{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdInt64(r randyWrappers, easy bool) *int64 { - v := NewPopulatedInt64Value(r, easy) - return &v.Value -} - -func SizeOfStdInt64(v int64) int { - pv := &Int64Value{Value: v} - return pv.Size() -} - -func StdInt64Marshal(v int64) ([]byte, error) { - size := SizeOfStdInt64(v) - buf := make([]byte, size) - _, err := StdInt64MarshalTo(v, buf) - return buf, err -} - -func StdInt64MarshalTo(v int64, data []byte) (int, error) { - pv := &Int64Value{Value: v} - return pv.MarshalTo(data) -} - -func StdInt64Unmarshal(v *int64, data []byte) error { - pv := &Int64Value{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdUInt64(r randyWrappers, easy bool) *uint64 { - v := NewPopulatedUInt64Value(r, easy) - return &v.Value -} - -func SizeOfStdUInt64(v uint64) int { - pv := &UInt64Value{Value: v} - return pv.Size() -} - -func StdUInt64Marshal(v uint64) ([]byte, error) { - size := SizeOfStdUInt64(v) - buf := make([]byte, size) - _, err := StdUInt64MarshalTo(v, buf) - return buf, err -} - -func StdUInt64MarshalTo(v uint64, data []byte) (int, error) { - pv := &UInt64Value{Value: v} - return pv.MarshalTo(data) -} - -func StdUInt64Unmarshal(v *uint64, data []byte) error { - pv := &UInt64Value{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdInt32(r randyWrappers, easy bool) *int32 { - v := NewPopulatedInt32Value(r, easy) - return &v.Value -} - -func SizeOfStdInt32(v int32) int { - pv := &Int32Value{Value: v} - return pv.Size() -} - -func StdInt32Marshal(v int32) ([]byte, error) { - size := SizeOfStdInt32(v) - buf := make([]byte, size) - _, err := StdInt32MarshalTo(v, buf) - return buf, err -} - -func StdInt32MarshalTo(v int32, data []byte) (int, error) { - pv := &Int32Value{Value: v} - return pv.MarshalTo(data) -} - -func StdInt32Unmarshal(v *int32, data []byte) error { - pv := &Int32Value{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdUInt32(r randyWrappers, easy bool) *uint32 { - v := NewPopulatedUInt32Value(r, easy) - return &v.Value -} - -func SizeOfStdUInt32(v uint32) int { - pv := &UInt32Value{Value: v} - return pv.Size() -} - -func StdUInt32Marshal(v uint32) ([]byte, error) { - size := SizeOfStdUInt32(v) - buf := make([]byte, size) - _, err := StdUInt32MarshalTo(v, buf) - return buf, err -} - -func StdUInt32MarshalTo(v uint32, data []byte) (int, error) { - pv := &UInt32Value{Value: v} - return pv.MarshalTo(data) -} - -func StdUInt32Unmarshal(v *uint32, data []byte) error { - pv := &UInt32Value{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdBool(r randyWrappers, easy bool) *bool { - v := NewPopulatedBoolValue(r, easy) - return &v.Value -} - -func SizeOfStdBool(v bool) int { - pv := &BoolValue{Value: v} - return pv.Size() -} - -func StdBoolMarshal(v bool) ([]byte, error) { - size := SizeOfStdBool(v) - buf := make([]byte, size) - _, err := StdBoolMarshalTo(v, buf) - return buf, err -} - -func StdBoolMarshalTo(v bool, data []byte) (int, error) { - pv := &BoolValue{Value: v} - return pv.MarshalTo(data) -} - -func StdBoolUnmarshal(v *bool, data []byte) error { - pv := &BoolValue{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdString(r randyWrappers, easy bool) *string { - v := NewPopulatedStringValue(r, easy) - return &v.Value -} - -func SizeOfStdString(v string) int { - pv := &StringValue{Value: v} - return pv.Size() -} - -func StdStringMarshal(v string) ([]byte, error) { - size := SizeOfStdString(v) - buf := make([]byte, size) - _, err := StdStringMarshalTo(v, buf) - return buf, err -} - -func StdStringMarshalTo(v string, data []byte) (int, error) { - pv := &StringValue{Value: v} - return pv.MarshalTo(data) -} - -func StdStringUnmarshal(v *string, data []byte) error { - pv := &StringValue{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} -func NewPopulatedStdBytes(r randyWrappers, easy bool) *[]byte { - v := NewPopulatedBytesValue(r, easy) - return &v.Value -} - -func SizeOfStdBytes(v []byte) int { - pv := &BytesValue{Value: v} - return pv.Size() -} - -func StdBytesMarshal(v []byte) ([]byte, error) { - size := SizeOfStdBytes(v) - buf := make([]byte, size) - _, err := StdBytesMarshalTo(v, buf) - return buf, err -} - -func StdBytesMarshalTo(v []byte, data []byte) (int, error) { - pv := &BytesValue{Value: v} - return pv.MarshalTo(data) -} - -func StdBytesUnmarshal(v *[]byte, data []byte) error { - pv := &BytesValue{} - if err := pv.Unmarshal(data); err != nil { - return err - } - *v = pv.Value - return nil -} diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/driver.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/driver.go index 05f97adab..396eabfae 100644 --- a/tools/vendor/github.com/golang-migrate/migrate/v4/source/driver.go +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/driver.go @@ -17,23 +17,23 @@ var drivers = make(map[string]Driver) // Driver is the interface every source driver must implement. // // How to implement a source driver? -// 1. Implement this interface. -// 2. Optionally, add a function named `WithInstance`. -// This function should accept an existing source instance and a Config{} struct -// and return a driver instance. -// 3. Add a test that calls source/testing.go:Test() -// 4. Add own tests for Open(), WithInstance() (when provided) and Close(). -// All other functions are tested by tests in source/testing. -// Saves you some time and makes sure all source drivers behave the same way. -// 5. Call Register in init(). +// 1. Implement this interface. +// 2. Optionally, add a function named `WithInstance`. +// This function should accept an existing source instance and a Config{} struct +// and return a driver instance. +// 3. Add a test that calls source/testing.go:Test() +// 4. Add own tests for Open(), WithInstance() (when provided) and Close(). +// All other functions are tested by tests in source/testing. +// Saves you some time and makes sure all source drivers behave the same way. +// 5. Call Register in init(). // // Guidelines: -// * All configuration input must come from the URL string in func Open() +// - All configuration input must come from the URL string in func Open() // or the Config{} struct in WithInstance. Don't os.Getenv(). -// * Drivers are supposed to be read only. -// * Ideally don't load any contents (into memory) in Open or WithInstance. +// - Drivers are supposed to be read only. +// - Ideally don't load any contents (into memory) in Open or WithInstance. type Driver interface { - // Open returns a a new driver instance configured with parameters + // Open returns a new driver instance configured with parameters // coming from the URL string. Migrate will call this function // only once per instance. Open(url string) (Driver, error) @@ -87,7 +87,7 @@ func Open(url string) (Driver, error) { d, ok := drivers[u.Scheme] driversMu.RUnlock() if !ok { - return nil, fmt.Errorf("source driver: unknown driver %v (forgotten import?)", u.Scheme) + return nil, fmt.Errorf("source driver: unknown driver '%s' (forgotten import?)", u.Scheme) } return d.Open(url) diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/errors.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/errors.go new file mode 100644 index 000000000..93d66e0d4 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/errors.go @@ -0,0 +1,15 @@ +package source + +import "os" + +// ErrDuplicateMigration is an error type for reporting duplicate migration +// files. +type ErrDuplicateMigration struct { + Migration + os.FileInfo +} + +// Error implements error interface. +func (e ErrDuplicateMigration) Error() string { + return "duplicate migration file: " + e.Name() +} diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/file/file.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/file/file.go index a0c641931..d8b21dffb 100644 --- a/tools/vendor/github.com/golang-migrate/migrate/v4/source/file/file.go +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/file/file.go @@ -1,15 +1,12 @@ package file import ( - "fmt" - "io" - "io/ioutil" nurl "net/url" "os" - "path" "path/filepath" "github.com/golang-migrate/migrate/v4/source" + "github.com/golang-migrate/migrate/v4/source/iofs" ) func init() { @@ -17,17 +14,31 @@ func init() { } type File struct { - url string - path string - migrations *source.Migrations + iofs.PartialDriver + url string + path string } func (f *File) Open(url string) (source.Driver, error) { - u, err := nurl.Parse(url) + p, err := parseURL(url) if err != nil { return nil, err } + nf := &File{ + url: url, + path: p, + } + if err := nf.Init(os.DirFS(p), "."); err != nil { + return nil, err + } + return nf, nil +} +func parseURL(url string) (string, error) { + u, err := nurl.Parse(url) + if err != nil { + return "", err + } // concat host and path to restore full path // host might be `.` p := u.Opaque @@ -39,7 +50,7 @@ func (f *File) Open(url string) (source.Driver, error) { // default to current directory if no path wd, err := os.Getwd() if err != nil { - return nil, err + return "", err } p = wd @@ -47,81 +58,9 @@ func (f *File) Open(url string) (source.Driver, error) { // make path absolute if relative abs, err := filepath.Abs(p) if err != nil { - return nil, err + return "", err } p = abs } - - // scan directory - files, err := ioutil.ReadDir(p) - if err != nil { - return nil, err - } - - nf := &File{ - url: url, - path: p, - migrations: source.NewMigrations(), - } - - for _, fi := range files { - if !fi.IsDir() { - m, err := source.DefaultParse(fi.Name()) - if err != nil { - continue // ignore files that we can't parse - } - if !nf.migrations.Append(m) { - return nil, fmt.Errorf("unable to parse file %v", fi.Name()) - } - } - } - return nf, nil -} - -func (f *File) Close() error { - // nothing do to here - return nil -} - -func (f *File) First() (version uint, err error) { - if v, ok := f.migrations.First(); ok { - return v, nil - } - return 0, &os.PathError{Op: "first", Path: f.path, Err: os.ErrNotExist} -} - -func (f *File) Prev(version uint) (prevVersion uint, err error) { - if v, ok := f.migrations.Prev(version); ok { - return v, nil - } - return 0, &os.PathError{Op: fmt.Sprintf("prev for version %v", version), Path: f.path, Err: os.ErrNotExist} -} - -func (f *File) Next(version uint) (nextVersion uint, err error) { - if v, ok := f.migrations.Next(version); ok { - return v, nil - } - return 0, &os.PathError{Op: fmt.Sprintf("next for version %v", version), Path: f.path, Err: os.ErrNotExist} -} - -func (f *File) ReadUp(version uint) (r io.ReadCloser, identifier string, err error) { - if m, ok := f.migrations.Up(version); ok { - r, err := os.Open(path.Join(f.path, m.Raw)) - if err != nil { - return nil, "", err - } - return r, m.Identifier, nil - } - return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: f.path, Err: os.ErrNotExist} -} - -func (f *File) ReadDown(version uint) (r io.ReadCloser, identifier string, err error) { - if m, ok := f.migrations.Down(version); ok { - r, err := os.Open(path.Join(f.path, m.Raw)) - if err != nil { - return nil, "", err - } - return r, m.Identifier, nil - } - return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: f.path, Err: os.ErrNotExist} + return p, nil } diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/README.md b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/README.md new file mode 100644 index 000000000..d75b328b9 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/README.md @@ -0,0 +1,3 @@ +# iofs + +https://pkg.go.dev/github.com/golang-migrate/migrate/v4/source/iofs diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/doc.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/doc.go new file mode 100644 index 000000000..6b2c862e0 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/doc.go @@ -0,0 +1,10 @@ +/* +Package iofs provides the Go 1.16+ io/fs#FS driver. + +It can accept various file systems (like embed.FS, archive/zip#Reader) implementing io/fs#FS. + +This driver cannot be used with Go versions 1.15 and below. + +Also, Opening with a URL scheme is not supported. +*/ +package iofs diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/iofs.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/iofs.go new file mode 100644 index 000000000..dc934a5fe --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/iofs.go @@ -0,0 +1,176 @@ +//go:build go1.16 +// +build go1.16 + +package iofs + +import ( + "errors" + "fmt" + "io" + "io/fs" + "path" + "strconv" + + "github.com/golang-migrate/migrate/v4/source" +) + +type driver struct { + PartialDriver +} + +// New returns a new Driver from io/fs#FS and a relative path. +func New(fsys fs.FS, path string) (source.Driver, error) { + var i driver + if err := i.Init(fsys, path); err != nil { + return nil, fmt.Errorf("failed to init driver with path %s: %w", path, err) + } + return &i, nil +} + +// Open is part of source.Driver interface implementation. +// Open cannot be called on the iofs passthrough driver. +func (d *driver) Open(url string) (source.Driver, error) { + return nil, errors.New("Open() cannot be called on the iofs passthrough driver") +} + +// PartialDriver is a helper service for creating new source drivers working with +// io/fs.FS instances. It implements all source.Driver interface methods +// except for Open(). New driver could embed this struct and add missing Open() +// method. +// +// To prepare PartialDriver for use Init() function. +type PartialDriver struct { + migrations *source.Migrations + fsys fs.FS + path string +} + +// Init prepares not initialized IoFS instance to read migrations from a +// io/fs#FS instance and a relative path. +func (d *PartialDriver) Init(fsys fs.FS, path string) error { + entries, err := fs.ReadDir(fsys, path) + if err != nil { + return err + } + + ms := source.NewMigrations() + for _, e := range entries { + if e.IsDir() { + continue + } + m, err := source.DefaultParse(e.Name()) + if err != nil { + continue + } + file, err := e.Info() + if err != nil { + return err + } + if !ms.Append(m) { + return source.ErrDuplicateMigration{ + Migration: *m, + FileInfo: file, + } + } + } + + d.fsys = fsys + d.path = path + d.migrations = ms + return nil +} + +// Close is part of source.Driver interface implementation. +// Closes the file system if possible. +func (d *PartialDriver) Close() error { + c, ok := d.fsys.(io.Closer) + if !ok { + return nil + } + return c.Close() +} + +// First is part of source.Driver interface implementation. +func (d *PartialDriver) First() (version uint, err error) { + if version, ok := d.migrations.First(); ok { + return version, nil + } + return 0, &fs.PathError{ + Op: "first", + Path: d.path, + Err: fs.ErrNotExist, + } +} + +// Prev is part of source.Driver interface implementation. +func (d *PartialDriver) Prev(version uint) (prevVersion uint, err error) { + if version, ok := d.migrations.Prev(version); ok { + return version, nil + } + return 0, &fs.PathError{ + Op: "prev for version " + strconv.FormatUint(uint64(version), 10), + Path: d.path, + Err: fs.ErrNotExist, + } +} + +// Next is part of source.Driver interface implementation. +func (d *PartialDriver) Next(version uint) (nextVersion uint, err error) { + if version, ok := d.migrations.Next(version); ok { + return version, nil + } + return 0, &fs.PathError{ + Op: "next for version " + strconv.FormatUint(uint64(version), 10), + Path: d.path, + Err: fs.ErrNotExist, + } +} + +// ReadUp is part of source.Driver interface implementation. +func (d *PartialDriver) ReadUp(version uint) (r io.ReadCloser, identifier string, err error) { + if m, ok := d.migrations.Up(version); ok { + body, err := d.open(path.Join(d.path, m.Raw)) + if err != nil { + return nil, "", err + } + return body, m.Identifier, nil + } + return nil, "", &fs.PathError{ + Op: "read up for version " + strconv.FormatUint(uint64(version), 10), + Path: d.path, + Err: fs.ErrNotExist, + } +} + +// ReadDown is part of source.Driver interface implementation. +func (d *PartialDriver) ReadDown(version uint) (r io.ReadCloser, identifier string, err error) { + if m, ok := d.migrations.Down(version); ok { + body, err := d.open(path.Join(d.path, m.Raw)) + if err != nil { + return nil, "", err + } + return body, m.Identifier, nil + } + return nil, "", &fs.PathError{ + Op: "read down for version " + strconv.FormatUint(uint64(version), 10), + Path: d.path, + Err: fs.ErrNotExist, + } +} + +func (d *PartialDriver) open(path string) (fs.File, error) { + f, err := d.fsys.Open(path) + if err == nil { + return f, nil + } + // Some non-standard file systems may return errors that don't include the path, that + // makes debugging harder. + if !errors.As(err, new(*fs.PathError)) { + err = &fs.PathError{ + Op: "open", + Path: path, + Err: err, + } + } + return nil, err +} diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.down.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.down.sql new file mode 100644 index 000000000..4267951a5 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.down.sql @@ -0,0 +1 @@ +1 down diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.up.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.up.sql new file mode 100644 index 000000000..046fd5a5d --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/1_foobar.up.sql @@ -0,0 +1 @@ +1 up diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/3_foobar.up.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/3_foobar.up.sql new file mode 100644 index 000000000..77c1b77dc --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/3_foobar.up.sql @@ -0,0 +1 @@ +3 up diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.down.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.down.sql new file mode 100644 index 000000000..b405d8bd0 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.down.sql @@ -0,0 +1 @@ +4 down diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.up.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.up.sql new file mode 100644 index 000000000..eba61bb94 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/4_foobar.up.sql @@ -0,0 +1 @@ +4 up diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/5_foobar.down.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/5_foobar.down.sql new file mode 100644 index 000000000..6dc96e206 --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/5_foobar.down.sql @@ -0,0 +1 @@ +5 down diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.down.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.down.sql new file mode 100644 index 000000000..46636016b --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.down.sql @@ -0,0 +1 @@ +7 down diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.up.sql b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.up.sql new file mode 100644 index 000000000..cdbc410ee --- /dev/null +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/iofs/testdata/migrations/7_foobar.up.sql @@ -0,0 +1 @@ +7 up diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/migration.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/migration.go index b8bb79020..74f6523cb 100644 --- a/tools/vendor/github.com/golang-migrate/migrate/v4/source/migration.go +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/migration.go @@ -66,11 +66,13 @@ func (i *Migrations) Append(m *Migration) (ok bool) { } func (i *Migrations) buildIndex() { - i.index = make(uintSlice, 0) + i.index = make(uintSlice, 0, len(i.migrations)) for version := range i.migrations { i.index = append(i.index, version) } - sort.Sort(i.index) + sort.Slice(i.index, func(x, y int) bool { + return i.index[x] < i.index[y] + }) } func (i *Migrations) First() (version uint, ok bool) { @@ -126,18 +128,6 @@ func (i *Migrations) findPos(version uint) int { type uintSlice []uint -func (s uintSlice) Len() int { - return len(s) -} - -func (s uintSlice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s uintSlice) Less(i, j int) bool { - return s[i] < s[j] -} - func (s uintSlice) Search(x uint) int { return sort.Search(len(s), func(i int) bool { return s[i] >= x }) } diff --git a/tools/vendor/github.com/golang-migrate/migrate/v4/source/parse.go b/tools/vendor/github.com/golang-migrate/migrate/v4/source/parse.go index 2f888fe75..df085ae29 100644 --- a/tools/vendor/github.com/golang-migrate/migrate/v4/source/parse.go +++ b/tools/vendor/github.com/golang-migrate/migrate/v4/source/parse.go @@ -16,8 +16,9 @@ var ( ) // Regex matches the following pattern: -// 123_name.up.ext -// 123_name.down.ext +// +// 123_name.up.ext +// 123_name.down.ext var Regex = regexp.MustCompile(`^([0-9]+)_(.*)\.(` + string(Down) + `|` + string(Up) + `)\.(.*)$`) // Parse returns Migration for matching Regex pattern. diff --git a/tools/vendor/github.com/google/cel-go/cel/BUILD.bazel b/tools/vendor/github.com/google/cel-go/cel/BUILD.bazel index e973abfc5..433132113 100644 --- a/tools/vendor/github.com/google/cel-go/cel/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/cel/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//checker/decls:go_default_library", "//common:go_default_library", "//common/containers:go_default_library", + "//common/operators:go_default_library", "//common/overloads:go_default_library", "//common/types:go_default_library", "//common/types/pb:go_default_library", @@ -31,7 +32,7 @@ go_library( "//interpreter:go_default_library", "//interpreter/functions:go_default_library", "//parser:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//reflect/protodesc:go_default_library", "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", @@ -69,7 +70,7 @@ go_test( "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", "@io_bazel_rules_go//proto/wkt:descriptor_go_proto", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", ], diff --git a/tools/vendor/github.com/google/cel-go/cel/decls.go b/tools/vendor/github.com/google/cel-go/cel/decls.go index f2df721d0..c0624d1e5 100644 --- a/tools/vendor/github.com/google/cel-go/cel/decls.go +++ b/tools/vendor/github.com/google/cel-go/cel/decls.go @@ -139,7 +139,7 @@ var ( kind: TypeKind, runtimeType: types.TypeType, } - //UintType represents a uint type. + // UintType represents a uint type. UintType = &Type{ kind: UintKind, runtimeType: types.UintType, @@ -222,7 +222,8 @@ func (t *Type) equals(other *Type) bool { // - The from types are the same instance // - The target type is dynamic // - The fromType has the same kind and type name as the target type, and all parameters of the target type -// are IsAssignableType() from the parameters of the fromType. +// +// are IsAssignableType() from the parameters of the fromType. func (t *Type) defaultIsAssignableType(fromType *Type) bool { if t == fromType || t.isDyn() { return true @@ -312,6 +313,11 @@ func NullableType(wrapped *Type) *Type { } } +// OptionalType creates an abstract parameterized type instance corresponding to CEL's notion of optional. +func OptionalType(param *Type) *Type { + return OpaqueType("optional", param) +} + // OpaqueType creates an abstract parameterized type with a given name. func OpaqueType(name string, params ...*Type) *Type { return &Type{ @@ -365,7 +371,9 @@ func Variable(name string, t *Type) EnvOption { // // - Overloads are searched in the order they are declared // - Dynamic dispatch for lists and maps is limited by inspection of the list and map contents -// at runtime. Empty lists and maps will result in a 'default dispatch' +// +// at runtime. Empty lists and maps will result in a 'default dispatch' +// // - In the event that a default dispatch occurs, the first overload provided is the one invoked // // If you intend to use overloads which differentiate based on the key or element type of a list or @@ -405,7 +413,7 @@ func Function(name string, opts ...FunctionOpt) EnvOption { // FunctionOpt defines a functional option for configuring a function declaration. type FunctionOpt func(*functionDecl) (*functionDecl, error) -// SingletonUnaryBinding creates a singleton function defintion to be used for all function overloads. +// SingletonUnaryBinding creates a singleton function definition to be used for all function overloads. // // Note, this approach works well if operand is expected to have a specific trait which it implements, // e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. @@ -431,7 +439,17 @@ func SingletonUnaryBinding(fn functions.UnaryOp, traits ...int) FunctionOpt { // // Note, this approach works well if operand is expected to have a specific trait which it implements, // e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +// +// Deprecated: use SingletonBinaryBinding func SingletonBinaryImpl(fn functions.BinaryOp, traits ...int) FunctionOpt { + return SingletonBinaryBinding(fn, traits...) +} + +// SingletonBinaryBinding creates a singleton function definition to be used with all function overloads. +// +// Note, this approach works well if operand is expected to have a specific trait which it implements, +// e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +func SingletonBinaryBinding(fn functions.BinaryOp, traits ...int) FunctionOpt { trait := 0 for _, t := range traits { trait = trait | t @@ -453,7 +471,17 @@ func SingletonBinaryImpl(fn functions.BinaryOp, traits ...int) FunctionOpt { // // Note, this approach works well if operand is expected to have a specific trait which it implements, // e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +// +// Deprecated: use SingletonFunctionBinding func SingletonFunctionImpl(fn functions.FunctionOp, traits ...int) FunctionOpt { + return SingletonFunctionBinding(fn, traits...) +} + +// SingletonFunctionBinding creates a singleton function definition to be used with all function overloads. +// +// Note, this approach works well if operand is expected to have a specific trait which it implements, +// e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +func SingletonFunctionBinding(fn functions.FunctionOp, traits ...int) FunctionOpt { trait := 0 for _, t := range traits { trait = trait | t @@ -720,9 +748,8 @@ func (f *functionDecl) addOverload(overload *overloadDecl) error { // Allow redefinition of an overload implementation so long as the signatures match. f.overloads[index] = overload return nil - } else { - return fmt.Errorf("overload redefinition in function. %s: %s has multiple definitions", f.name, o.id) } + return fmt.Errorf("overload redefinition in function. %s: %s has multiple definitions", f.name, o.id) } } f.overloads = append(f.overloads, overload) @@ -1177,3 +1204,43 @@ func collectParamNames(paramNames map[string]struct{}, arg *Type) { collectParamNames(paramNames, param) } } + +func typeValueToKind(tv *types.TypeValue) (Kind, error) { + switch tv { + case types.BoolType: + return BoolKind, nil + case types.DoubleType: + return DoubleKind, nil + case types.IntType: + return IntKind, nil + case types.UintType: + return UintKind, nil + case types.ListType: + return ListKind, nil + case types.MapType: + return MapKind, nil + case types.StringType: + return StringKind, nil + case types.BytesType: + return BytesKind, nil + case types.DurationType: + return DurationKind, nil + case types.TimestampType: + return TimestampKind, nil + case types.NullType: + return NullTypeKind, nil + case types.TypeType: + return TypeKind, nil + default: + switch tv.TypeName() { + case "dyn": + return DynKind, nil + case "google.protobuf.Any": + return AnyKind, nil + case "optional": + return OpaqueKind, nil + default: + return 0, fmt.Errorf("no known conversion for type of %s", tv.TypeName()) + } + } +} diff --git a/tools/vendor/github.com/google/cel-go/cel/env.go b/tools/vendor/github.com/google/cel-go/cel/env.go index 4e9ecdd64..d9c2ef63f 100644 --- a/tools/vendor/github.com/google/cel-go/cel/env.go +++ b/tools/vendor/github.com/google/cel-go/cel/env.go @@ -102,15 +102,18 @@ type Env struct { provider ref.TypeProvider features map[int]bool appliedFeatures map[int]bool + libraries map[string]bool // Internal parser representation - prsr *parser.Parser + prsr *parser.Parser + prsrOpts []parser.Option // Internal checker representation - chk *checker.Env - chkErr error - chkOnce sync.Once - chkOpts []checker.Option + chkMutex sync.Mutex + chk *checker.Env + chkErr error + chkOnce sync.Once + chkOpts []checker.Option // Program options tied to the environment progOpts []ProgramOption @@ -159,6 +162,7 @@ func NewCustomEnv(opts ...EnvOption) (*Env, error) { provider: registry, features: map[int]bool{}, appliedFeatures: map[int]bool{}, + libraries: map[string]bool{}, progOpts: []ProgramOption{}, }).configure(opts) } @@ -175,14 +179,14 @@ func (e *Env) Check(ast *Ast) (*Ast, *Issues) { pe, _ := AstToParsedExpr(ast) // Construct the internal checker env, erroring if there is an issue adding the declarations. - err := e.initChecker() + chk, err := e.initChecker() if err != nil { errs := common.NewErrors(ast.Source()) - errs.ReportError(common.NoLocation, e.chkErr.Error()) + errs.ReportError(common.NoLocation, err.Error()) return nil, NewIssues(errs) } - res, errs := checker.Check(pe, ast.Source(), e.chk) + res, errs := checker.Check(pe, ast.Source(), chk) if len(errs.GetErrors()) > 0 { return nil, NewIssues(errs) } @@ -236,10 +240,14 @@ func (e *Env) CompileSource(src Source) (*Ast, *Issues) { // TypeProvider are immutable, or that their underlying implementations are based on the // ref.TypeRegistry which provides a Copy method which will be invoked by this method. func (e *Env) Extend(opts ...EnvOption) (*Env, error) { - if e.chkErr != nil { - return nil, e.chkErr + chk, chkErr := e.getCheckerOrError() + if chkErr != nil { + return nil, chkErr } + prsrOptsCopy := make([]parser.Option, len(e.prsrOpts)) + copy(prsrOptsCopy, e.prsrOpts) + // The type-checker is configured with Declarations. The declarations may either be provided // as options which have not yet been validated, or may come from a previous checker instance // whose types have already been validated. @@ -248,10 +256,10 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { // Copy the declarations if needed. decsCopy := []*exprpb.Decl{} - if e.chk != nil { + if chk != nil { // If the type-checker has already been instantiated, then the e.declarations have been - // valdiated within the chk instance. - chkOptsCopy = append(chkOptsCopy, checker.ValidatedDeclarations(e.chk)) + // validated within the chk instance. + chkOptsCopy = append(chkOptsCopy, checker.ValidatedDeclarations(chk)) } else { // If the type-checker has not been instantiated, ensure the unvalidated declarations are // provided to the extended Env instance. @@ -304,8 +312,11 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { for k, v := range e.functions { funcsCopy[k] = v } + libsCopy := make(map[string]bool, len(e.libraries)) + for k, v := range e.libraries { + libsCopy[k] = v + } - // TODO: functions copy needs to happen here. ext := &Env{ Container: e.Container, declarations: decsCopy, @@ -315,8 +326,10 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { adapter: adapter, features: featuresCopy, appliedFeatures: appliedFeaturesCopy, + libraries: libsCopy, provider: provider, chkOpts: chkOptsCopy, + prsrOpts: prsrOptsCopy, } return ext.configure(opts) } @@ -328,6 +341,12 @@ func (e *Env) HasFeature(flag int) bool { return has && enabled } +// HasLibrary returns whether a specific SingletonLibrary has been configured in the environment. +func (e *Env) HasLibrary(libName string) bool { + configured, exists := e.libraries[libName] + return exists && configured +} + // Parse parses the input expression value `txt` to a Ast and/or a set of Issues. // // This form of Parse creates a Source value for the input `txt` and forwards to the @@ -422,8 +441,8 @@ func (e *Env) UnknownVars() interpreter.PartialActivation { // TODO: Consider adding an option to generate a Program.Residual to avoid round-tripping to an // Ast format and then Program again. func (e *Env) ResidualAst(a *Ast, details *EvalDetails) (*Ast, error) { - pruned := interpreter.PruneAst(a.Expr(), details.State()) - expr, err := AstToString(ParsedExprToAst(&exprpb.ParsedExpr{Expr: pruned})) + pruned := interpreter.PruneAst(a.Expr(), a.SourceInfo().GetMacroCalls(), details.State()) + expr, err := AstToString(ParsedExprToAst(pruned)) if err != nil { return nil, err } @@ -443,12 +462,12 @@ func (e *Env) ResidualAst(a *Ast, details *EvalDetails) (*Ast, error) { // EstimateCost estimates the cost of a type checked CEL expression using the length estimates of input data and // extension functions provided by estimator. -func (e *Env) EstimateCost(ast *Ast, estimator checker.CostEstimator) (checker.CostEstimate, error) { +func (e *Env) EstimateCost(ast *Ast, estimator checker.CostEstimator, opts ...checker.CostOption) (checker.CostEstimate, error) { checked, err := AstToCheckedExpr(ast) if err != nil { return checker.CostEstimate{}, fmt.Errorf("EsimateCost could not inspect Ast: %v", err) } - return checker.Cost(checked, estimator), nil + return checker.Cost(checked, estimator, opts...) } // configure applies a series of EnvOptions to the current environment. @@ -464,17 +483,9 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { } // If the default UTC timezone fix has been enabled, make sure the library is configured - if e.HasFeature(featureDefaultUTCTimeZone) { - if _, found := e.appliedFeatures[featureDefaultUTCTimeZone]; !found { - e, err = Lib(timeUTCLibrary{})(e) - if err != nil { - return nil, err - } - // record that the feature has been applied since it will generate declarations - // and functions which will be propagated on Extend() calls and which should only - // be registered once. - e.appliedFeatures[featureDefaultUTCTimeZone] = true - } + e, err = e.maybeApplyFeature(featureDefaultUTCTimeZone, Lib(timeUTCLibrary{})) + if err != nil { + return nil, err } // Initialize all of the functions configured within the environment. @@ -486,7 +497,10 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { } // Configure the parser. - prsrOpts := []parser.Option{parser.Macros(e.macros...)} + prsrOpts := []parser.Option{} + prsrOpts = append(prsrOpts, e.prsrOpts...) + prsrOpts = append(prsrOpts, parser.Macros(e.macros...)) + if e.HasFeature(featureEnableMacroCallTracking) { prsrOpts = append(prsrOpts, parser.PopulateMacroCalls(true)) } @@ -497,7 +511,7 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { // Ensure that the checker init happens eagerly rather than lazily. if e.HasFeature(featureEagerlyValidateDeclarations) { - err := e.initChecker() + _, err := e.initChecker() if err != nil { return nil, err } @@ -506,7 +520,7 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { return e, nil } -func (e *Env) initChecker() error { +func (e *Env) initChecker() (*checker.Env, error) { e.chkOnce.Do(func() { chkOpts := []checker.Option{} chkOpts = append(chkOpts, e.chkOpts...) @@ -518,32 +532,68 @@ func (e *Env) initChecker() error { ce, err := checker.NewEnv(e.Container, e.provider, chkOpts...) if err != nil { - e.chkErr = err + e.setCheckerOrError(nil, err) return } // Add the statically configured declarations. err = ce.Add(e.declarations...) if err != nil { - e.chkErr = err + e.setCheckerOrError(nil, err) return } // Add the function declarations which are derived from the FunctionDecl instances. for _, fn := range e.functions { fnDecl, err := functionDeclToExprDecl(fn) if err != nil { - e.chkErr = err + e.setCheckerOrError(nil, err) return } err = ce.Add(fnDecl) if err != nil { - e.chkErr = err + e.setCheckerOrError(nil, err) return } } // Add function declarations here separately. - e.chk = ce + e.setCheckerOrError(ce, nil) }) - return e.chkErr + return e.getCheckerOrError() +} + +// setCheckerOrError sets the checker.Env or error state in a concurrency-safe manner +func (e *Env) setCheckerOrError(chk *checker.Env, chkErr error) { + e.chkMutex.Lock() + e.chk = chk + e.chkErr = chkErr + e.chkMutex.Unlock() +} + +// getCheckerOrError gets the checker.Env or error state in a concurrency-safe manner +func (e *Env) getCheckerOrError() (*checker.Env, error) { + e.chkMutex.Lock() + defer e.chkMutex.Unlock() + return e.chk, e.chkErr +} + +// maybeApplyFeature determines whether the feature-guarded option is enabled, and if so applies +// the feature if it has not already been enabled. +func (e *Env) maybeApplyFeature(feature int, option EnvOption) (*Env, error) { + if !e.HasFeature(feature) { + return e, nil + } + _, applied := e.appliedFeatures[feature] + if applied { + return e, nil + } + e, err := option(e) + if err != nil { + return nil, err + } + // record that the feature has been applied since it will generate declarations + // and functions which will be propagated on Extend() calls and which should only + // be registered once. + e.appliedFeatures[feature] = true + return e, nil } // Issues defines methods for inspecting the error details of parse and check calls. diff --git a/tools/vendor/github.com/google/cel-go/cel/io.go b/tools/vendor/github.com/google/cel-go/cel/io.go index e721c97f6..93ded3cf1 100644 --- a/tools/vendor/github.com/google/cel-go/cel/io.go +++ b/tools/vendor/github.com/google/cel-go/cel/io.go @@ -19,14 +19,14 @@ import ( "fmt" "reflect" + "google.golang.org/protobuf/proto" + "github.com/google/cel-go/common" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" "github.com/google/cel-go/parser" - "google.golang.org/protobuf/proto" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" anypb "google.golang.org/protobuf/types/known/anypb" ) diff --git a/tools/vendor/github.com/google/cel-go/cel/library.go b/tools/vendor/github.com/google/cel-go/cel/library.go index 5ca528459..bcfd44f78 100644 --- a/tools/vendor/github.com/google/cel-go/cel/library.go +++ b/tools/vendor/github.com/google/cel-go/cel/library.go @@ -20,10 +20,27 @@ import ( "time" "github.com/google/cel-go/checker" + "github.com/google/cel-go/common" + "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/overloads" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + "github.com/google/cel-go/interpreter" "github.com/google/cel-go/interpreter/functions" + "github.com/google/cel-go/parser" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +const ( + optMapMacro = "optMap" + hasValueFunc = "hasValue" + optionalNoneFunc = "optional.none" + optionalOfFunc = "optional.of" + optionalOfNonZeroValueFunc = "optional.ofNonZeroValue" + valueFunc = "value" + unusedIterVar = "#unused" ) // Library provides a collection of EnvOption and ProgramOption values used to configure a CEL @@ -42,10 +59,27 @@ type Library interface { ProgramOptions() []ProgramOption } +// SingletonLibrary refines the Library interface to ensure that libraries in this format are only +// configured once within the environment. +type SingletonLibrary interface { + Library + + // LibraryName provides a namespaced name which is used to check whether the library has already + // been configured in the environment. + LibraryName() string +} + // Lib creates an EnvOption out of a Library, allowing libraries to be provided as functional args, // and to be linked to each other. func Lib(l Library) EnvOption { + singleton, isSingleton := l.(SingletonLibrary) return func(e *Env) (*Env, error) { + if isSingleton { + if e.HasLibrary(singleton.LibraryName()) { + return e, nil + } + e.libraries[singleton.LibraryName()] = true + } var err error for _, opt := range l.CompileOptions() { e, err = opt(e) @@ -67,6 +101,11 @@ func StdLib() EnvOption { // features documented in the specification. type stdLibrary struct{} +// LibraryName implements the SingletonLibrary interface method. +func (stdLibrary) LibraryName() string { + return "cel.lib.std" +} + // EnvOptions returns options for the standard CEL function declarations and macros. func (stdLibrary) CompileOptions() []EnvOption { return []EnvOption{ @@ -82,6 +121,225 @@ func (stdLibrary) ProgramOptions() []ProgramOption { } } +type optionalLibrary struct{} + +// LibraryName implements the SingletonLibrary interface method. +func (optionalLibrary) LibraryName() string { + return "cel.lib.optional" +} + +// CompileOptions implements the Library interface method. +func (optionalLibrary) CompileOptions() []EnvOption { + paramTypeK := TypeParamType("K") + paramTypeV := TypeParamType("V") + optionalTypeV := OptionalType(paramTypeV) + listTypeV := ListType(paramTypeV) + mapTypeKV := MapType(paramTypeK, paramTypeV) + + return []EnvOption{ + // Enable the optional syntax in the parser. + enableOptionalSyntax(), + + // Introduce the optional type. + Types(types.OptionalType), + + // Configure the optMap macro. + Macros(NewReceiverMacro(optMapMacro, 2, optMap)), + + // Global and member functions for working with optional values. + Function(optionalOfFunc, + Overload("optional_of", []*Type{paramTypeV}, optionalTypeV, + UnaryBinding(func(value ref.Val) ref.Val { + return types.OptionalOf(value) + }))), + Function(optionalOfNonZeroValueFunc, + Overload("optional_ofNonZeroValue", []*Type{paramTypeV}, optionalTypeV, + UnaryBinding(func(value ref.Val) ref.Val { + v, isZeroer := value.(traits.Zeroer) + if !isZeroer || !v.IsZeroValue() { + return types.OptionalOf(value) + } + return types.OptionalNone + }))), + Function(optionalNoneFunc, + Overload("optional_none", []*Type{}, optionalTypeV, + FunctionBinding(func(values ...ref.Val) ref.Val { + return types.OptionalNone + }))), + Function(valueFunc, + MemberOverload("optional_value", []*Type{optionalTypeV}, paramTypeV, + UnaryBinding(func(value ref.Val) ref.Val { + opt := value.(*types.Optional) + return opt.GetValue() + }))), + Function(hasValueFunc, + MemberOverload("optional_hasValue", []*Type{optionalTypeV}, BoolType, + UnaryBinding(func(value ref.Val) ref.Val { + opt := value.(*types.Optional) + return types.Bool(opt.HasValue()) + }))), + + // Implementation of 'or' and 'orValue' are special-cased to support short-circuiting in the + // evaluation chain. + Function("or", + MemberOverload("optional_or_optional", []*Type{optionalTypeV, optionalTypeV}, optionalTypeV)), + Function("orValue", + MemberOverload("optional_orValue_value", []*Type{optionalTypeV, paramTypeV}, paramTypeV)), + + // OptSelect is handled specially by the type-checker, so the receiver's field type is used to determine the + // optput type. + Function(operators.OptSelect, + Overload("select_optional_field", []*Type{DynType, StringType}, optionalTypeV)), + + // OptIndex is handled mostly like any other indexing operation on a list or map, so the type-checker can use + // these signatures to determine type-agreement without any special handling. + Function(operators.OptIndex, + Overload("list_optindex_optional_int", []*Type{listTypeV, IntType}, optionalTypeV), + Overload("optional_list_optindex_optional_int", []*Type{OptionalType(listTypeV), IntType}, optionalTypeV), + Overload("map_optindex_optional_value", []*Type{mapTypeKV, paramTypeK}, optionalTypeV), + Overload("optional_map_optindex_optional_value", []*Type{OptionalType(mapTypeKV), paramTypeK}, optionalTypeV)), + + // Index overloads to accommodate using an optional value as the operand. + Function(operators.Index, + Overload("optional_list_index_int", []*Type{OptionalType(listTypeV), IntType}, optionalTypeV), + Overload("optional_map_index_optional_value", []*Type{OptionalType(mapTypeKV), paramTypeK}, optionalTypeV)), + } +} + +func optMap(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + varIdent := args[0] + varName := "" + switch varIdent.GetExprKind().(type) { + case *exprpb.Expr_IdentExpr: + varName = varIdent.GetIdentExpr().GetName() + default: + return nil, &common.Error{ + Message: "optMap() variable name must be a simple identifier", + Location: meh.OffsetLocation(varIdent.GetId()), + } + } + mapExpr := args[1] + return meh.GlobalCall( + operators.Conditional, + meh.ReceiverCall(hasValueFunc, target), + meh.GlobalCall(optionalOfFunc, + meh.Fold( + unusedIterVar, + meh.NewList(), + varName, + meh.ReceiverCall(valueFunc, target), + meh.LiteralBool(false), + meh.Ident(varName), + mapExpr, + ), + ), + meh.GlobalCall(optionalNoneFunc), + ), nil +} + +// ProgramOptions implements the Library interface method. +func (optionalLibrary) ProgramOptions() []ProgramOption { + return []ProgramOption{ + CustomDecorator(decorateOptionalOr), + } +} + +func enableOptionalSyntax() EnvOption { + return func(e *Env) (*Env, error) { + e.prsrOpts = append(e.prsrOpts, parser.EnableOptionalSyntax(true)) + return e, nil + } +} + +func decorateOptionalOr(i interpreter.Interpretable) (interpreter.Interpretable, error) { + call, ok := i.(interpreter.InterpretableCall) + if !ok { + return i, nil + } + args := call.Args() + if len(args) != 2 { + return i, nil + } + switch call.Function() { + case "or": + if call.OverloadID() != "" && call.OverloadID() != "optional_or_optional" { + return i, nil + } + return &evalOptionalOr{ + id: call.ID(), + lhs: args[0], + rhs: args[1], + }, nil + case "orValue": + if call.OverloadID() != "" && call.OverloadID() != "optional_orValue_value" { + return i, nil + } + return &evalOptionalOrValue{ + id: call.ID(), + lhs: args[0], + rhs: args[1], + }, nil + default: + return i, nil + } +} + +// evalOptionalOr selects between two optional values, either the first if it has a value, or +// the second optional expression is evaluated and returned. +type evalOptionalOr struct { + id int64 + lhs interpreter.Interpretable + rhs interpreter.Interpretable +} + +// ID implements the Interpretable interface method. +func (opt *evalOptionalOr) ID() int64 { + return opt.id +} + +// Eval evaluates the left-hand side optional to determine whether it contains a value, else +// proceeds with the right-hand side evaluation. +func (opt *evalOptionalOr) Eval(ctx interpreter.Activation) ref.Val { + // short-circuit lhs. + optLHS := opt.lhs.Eval(ctx) + optVal, ok := optLHS.(*types.Optional) + if !ok { + return optLHS + } + if optVal.HasValue() { + return optVal + } + return opt.rhs.Eval(ctx) +} + +// evalOptionalOrValue selects between an optional or a concrete value. If the optional has a value, +// its value is returned, otherwise the alternative value expression is evaluated and returned. +type evalOptionalOrValue struct { + id int64 + lhs interpreter.Interpretable + rhs interpreter.Interpretable +} + +// ID implements the Interpretable interface method. +func (opt *evalOptionalOrValue) ID() int64 { + return opt.id +} + +// Eval evaluates the left-hand side optional to determine whether it contains a value, else +// proceeds with the right-hand side evaluation. +func (opt *evalOptionalOrValue) Eval(ctx interpreter.Activation) ref.Val { + // short-circuit lhs. + optLHS := opt.lhs.Eval(ctx) + optVal, ok := optLHS.(*types.Optional) + if !ok { + return optLHS + } + if optVal.HasValue() { + return optVal.GetValue() + } + return opt.rhs.Eval(ctx) +} + type timeUTCLibrary struct{} func (timeUTCLibrary) CompileOptions() []EnvOption { diff --git a/tools/vendor/github.com/google/cel-go/cel/macro.go b/tools/vendor/github.com/google/cel-go/cel/macro.go index e43cb4eee..e48c5bf8e 100644 --- a/tools/vendor/github.com/google/cel-go/cel/macro.go +++ b/tools/vendor/github.com/google/cel-go/cel/macro.go @@ -17,6 +17,7 @@ package cel import ( "github.com/google/cel-go/common" "github.com/google/cel-go/parser" + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) @@ -26,8 +27,11 @@ import ( // a Macro should be created per arg-count or as a var arg macro. type Macro = parser.Macro -// MacroExpander converts a call and its associated arguments into a new CEL abstract syntax tree, or an error -// if the input arguments are not suitable for the expansion requirements for the macro in question. +// MacroExpander converts a call and its associated arguments into a new CEL abstract syntax tree. +// +// If the MacroExpander determines within the implementation that an expansion is not needed it may return +// a nil Expr value to indicate a non-match. However, if an expansion is to be performed, but the arguments +// are not well-formed, the result of the expansion will be an error. // // The MacroExpander accepts as arguments a MacroExprHelper as well as the arguments used in the function call // and produces as output an Expr ast node. @@ -81,8 +85,10 @@ func ExistsOneMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*ex // input to produce an output list. // // There are two call patterns supported by map: -// .map(, ) -// .map(, , ) +// +// .map(, ) +// .map(, , ) +// // In the second form only iterVar values which return true when provided to the predicate expression // are transformed. func MapMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { diff --git a/tools/vendor/github.com/google/cel-go/cel/options.go b/tools/vendor/github.com/google/cel-go/cel/options.go index 21c757010..07f3d6c71 100644 --- a/tools/vendor/github.com/google/cel-go/cel/options.go +++ b/tools/vendor/github.com/google/cel-go/cel/options.go @@ -29,6 +29,7 @@ import ( "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" "github.com/google/cel-go/interpreter/functions" + "github.com/google/cel-go/parser" exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" descpb "google.golang.org/protobuf/types/descriptorpb" @@ -61,6 +62,10 @@ const ( // on a CEL timestamp operation. This fixes the scenario where the input time // is not already in UTC. featureDefaultUTCTimeZone + + // Enable the use of optional types in the syntax, type-system, type-checking, + // and runtime. + featureOptionalTypes ) // EnvOption is a functional interface for configuring the environment. @@ -163,19 +168,19 @@ func Container(name string) EnvOption { // Abbreviations can be useful when working with variables, functions, and especially types from // multiple namespaces: // -// // CEL object construction -// qual.pkg.version.ObjTypeName{ -// field: alt.container.ver.FieldTypeName{value: ...} -// } +// // CEL object construction +// qual.pkg.version.ObjTypeName{ +// field: alt.container.ver.FieldTypeName{value: ...} +// } // // Only one the qualified names above may be used as the CEL container, so at least one of these // references must be a long qualified name within an otherwise short CEL program. Using the // following abbreviations, the program becomes much simpler: // -// // CEL Go option -// Abbrevs("qual.pkg.version.ObjTypeName", "alt.container.ver.FieldTypeName") -// // Simplified Object construction -// ObjTypeName{field: FieldTypeName{value: ...}} +// // CEL Go option +// Abbrevs("qual.pkg.version.ObjTypeName", "alt.container.ver.FieldTypeName") +// // Simplified Object construction +// ObjTypeName{field: FieldTypeName{value: ...}} // // There are a few rules for the qualified names and the simple abbreviations generated from them: // - Qualified names must be dot-delimited, e.g. `package.subpkg.name`. @@ -188,9 +193,12 @@ func Container(name string) EnvOption { // - Expanded abbreviations do not participate in namespace resolution. // - Abbreviation expansion is done instead of the container search for a matching identifier. // - Containers follow C++ namespace resolution rules with searches from the most qualified name -// to the least qualified name. +// +// to the least qualified name. +// // - Container references within the CEL program may be relative, and are resolved to fully -// qualified names at either type-check time or program plan time, whichever comes first. +// +// qualified names at either type-check time or program plan time, whichever comes first. // // If there is ever a case where an identifier could be in both the container and as an // abbreviation, the abbreviation wins as this will ensure that the meaning of a program is @@ -216,7 +224,7 @@ func Abbrevs(qualifiedNames ...string) EnvOption { // environment by default. // // Note: This option must be specified after the CustomTypeProvider option when used together. -func Types(addTypes ...interface{}) EnvOption { +func Types(addTypes ...any) EnvOption { return func(e *Env) (*Env, error) { reg, isReg := e.provider.(ref.TypeRegistry) if !isReg { @@ -253,7 +261,7 @@ func Types(addTypes ...interface{}) EnvOption { // // TypeDescs are hermetic to a single Env object, but may be copied to other Env values via // extension or by re-using the same EnvOption with another NewEnv() call. -func TypeDescs(descs ...interface{}) EnvOption { +func TypeDescs(descs ...any) EnvOption { return func(e *Env) (*Env, error) { reg, isReg := e.provider.(ref.TypeRegistry) if !isReg { @@ -350,8 +358,8 @@ func Functions(funcs ...*functions.Overload) ProgramOption { // variables with the same name provided to the Eval() call. If Globals is used in a Library with // a Lib EnvOption, vars may shadow variables provided by previously added libraries. // -// The vars value may either be an `interpreter.Activation` instance or a `map[string]interface{}`. -func Globals(vars interface{}) ProgramOption { +// The vars value may either be an `interpreter.Activation` instance or a `map[string]any`. +func Globals(vars any) ProgramOption { return func(p *prog) (*prog, error) { defaultVars, err := interpreter.NewActivation(vars) if err != nil { @@ -404,6 +412,9 @@ const ( // OptTrackCost enables the runtime cost calculation while validation and return cost within evalDetails // cost calculation is available via func ActualCost() OptTrackCost EvalOption = 1 << iota + + // OptCheckStringFormat enables compile-time checking of string.format calls for syntax/cardinality. + OptCheckStringFormat EvalOption = 1 << iota ) // EvalOptions sets one or more evaluation options which may affect the evaluation or Result. @@ -534,6 +545,13 @@ func DefaultUTCTimeZone(enabled bool) EnvOption { return features(featureDefaultUTCTimeZone, enabled) } +// OptionalTypes enable support for optional syntax and types in CEL. The optional value type makes +// it possible to express whether variables have been provided, whether a result has been computed, +// and in the future whether an object field path, map key value, or list index has a value. +func OptionalTypes() EnvOption { + return Lib(optionalLibrary{}) +} + // features sets the given feature flags. See list of Feature constants above. func features(flag int, enabled bool) EnvOption { return func(e *Env) (*Env, error) { @@ -541,3 +559,21 @@ func features(flag int, enabled bool) EnvOption { return e, nil } } + +// ParserRecursionLimit adjusts the AST depth the parser will tolerate. +// Defaults defined in the parser package. +func ParserRecursionLimit(limit int) EnvOption { + return func(e *Env) (*Env, error) { + e.prsrOpts = append(e.prsrOpts, parser.MaxRecursionDepth(limit)) + return e, nil + } +} + +// ParserExpressionSizeLimit adjusts the number of code points the expression parser is allowed to parse. +// Defaults defined in the parser package. +func ParserExpressionSizeLimit(limit int) EnvOption { + return func(e *Env) (*Env, error) { + e.prsrOpts = append(e.prsrOpts, parser.ExpressionSizeCodePointLimit(limit)) + return e, nil + } +} diff --git a/tools/vendor/github.com/google/cel-go/cel/program.go b/tools/vendor/github.com/google/cel-go/cel/program.go index 6219a4da5..a630f5bfa 100644 --- a/tools/vendor/github.com/google/cel-go/cel/program.go +++ b/tools/vendor/github.com/google/cel-go/cel/program.go @@ -17,21 +17,20 @@ package cel import ( "context" "fmt" - "math" "sync" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" - "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) // Program is an evaluable view of an Ast. type Program interface { // Eval returns the result of an evaluation of the Ast and environment against the input vars. // - // The vars value may either be an `interpreter.Activation` or a `map[string]interface{}`. + // The vars value may either be an `interpreter.Activation` or a `map[string]any`. // // If the `OptTrackState`, `OptTrackCost` or `OptExhaustiveEval` flags are used, the `details` response will // be non-nil. Given this caveat on `details`, the return state from evaluation will be: @@ -43,16 +42,16 @@ type Program interface { // An unsuccessful evaluation is typically the result of a series of incompatible `EnvOption` // or `ProgramOption` values used in the creation of the evaluation environment or executable // program. - Eval(interface{}) (ref.Val, *EvalDetails, error) + Eval(any) (ref.Val, *EvalDetails, error) // ContextEval evaluates the program with a set of input variables and a context object in order // to support cancellation and timeouts. This method must be used in conjunction with the // InterruptCheckFrequency() option for cancellation interrupts to be impact evaluation. // - // The vars value may either be an `interpreter.Activation` or `map[string]interface{}`. + // The vars value may either be an `interpreter.Activation` or `map[string]any`. // // The output contract for `ContextEval` is otherwise identical to the `Eval` method. - ContextEval(context.Context, interface{}) (ref.Val, *EvalDetails, error) + ContextEval(context.Context, any) (ref.Val, *EvalDetails, error) } // NoVars returns an empty Activation. @@ -65,7 +64,7 @@ func NoVars() interpreter.Activation { // // The `vars` value may either be an interpreter.Activation or any valid input to the // interpreter.NewActivation call. -func PartialVars(vars interface{}, +func PartialVars(vars any, unknowns ...*interpreter.AttributePattern) (interpreter.PartialActivation, error) { return interpreter.NewPartialActivation(vars, unknowns...) } @@ -207,6 +206,37 @@ func newProgram(e *Env, ast *Ast, opts []ProgramOption) (Program, error) { if len(p.regexOptimizations) > 0 { decorators = append(decorators, interpreter.CompileRegexConstants(p.regexOptimizations...)) } + // Enable compile-time checking of syntax/cardinality for string.format calls. + if p.evalOpts&OptCheckStringFormat == OptCheckStringFormat { + var isValidType func(id int64, validTypes ...*types.TypeValue) (bool, error) + if ast.IsChecked() { + isValidType = func(id int64, validTypes ...*types.TypeValue) (bool, error) { + t, err := ExprTypeToType(ast.typeMap[id]) + if err != nil { + return false, err + } + if t.kind == DynKind { + return true, nil + } + for _, vt := range validTypes { + k, err := typeValueToKind(vt) + if err != nil { + return false, err + } + if k == t.kind { + return true, nil + } + } + return false, nil + } + } else { + // if the AST isn't type-checked, short-circuit validation + isValidType = func(id int64, validTypes ...*types.TypeValue) (bool, error) { + return true, nil + } + } + decorators = append(decorators, interpreter.InterpolateFormattedString(isValidType)) + } // Enable exhaustive eval, state tracking and cost tracking last since they require a factory. if p.evalOpts&(OptExhaustiveEval|OptTrackState|OptTrackCost) != 0 { @@ -268,7 +298,7 @@ func (p *prog) initInterpretable(ast *Ast, decs []interpreter.InterpretableDecor } // Eval implements the Program interface method. -func (p *prog) Eval(input interface{}) (v ref.Val, det *EvalDetails, err error) { +func (p *prog) Eval(input any) (v ref.Val, det *EvalDetails, err error) { // Configure error recovery for unexpected panics during evaluation. Note, the use of named // return values makes it possible to modify the error response during the recovery // function. @@ -287,11 +317,11 @@ func (p *prog) Eval(input interface{}) (v ref.Val, det *EvalDetails, err error) switch v := input.(type) { case interpreter.Activation: vars = v - case map[string]interface{}: + case map[string]any: vars = activationPool.Setup(v) defer activationPool.Put(vars) default: - return nil, nil, fmt.Errorf("invalid input, wanted Activation or map[string]interface{}, got: (%T)%v", input, input) + return nil, nil, fmt.Errorf("invalid input, wanted Activation or map[string]any, got: (%T)%v", input, input) } if p.defaultVars != nil { vars = interpreter.NewHierarchicalActivation(p.defaultVars, vars) @@ -307,7 +337,7 @@ func (p *prog) Eval(input interface{}) (v ref.Val, det *EvalDetails, err error) } // ContextEval implements the Program interface. -func (p *prog) ContextEval(ctx context.Context, input interface{}) (ref.Val, *EvalDetails, error) { +func (p *prog) ContextEval(ctx context.Context, input any) (ref.Val, *EvalDetails, error) { if ctx == nil { return nil, nil, fmt.Errorf("context can not be nil") } @@ -318,22 +348,17 @@ func (p *prog) ContextEval(ctx context.Context, input interface{}) (ref.Val, *Ev case interpreter.Activation: vars = ctxActivationPool.Setup(v, ctx.Done(), p.interruptCheckFrequency) defer ctxActivationPool.Put(vars) - case map[string]interface{}: + case map[string]any: rawVars := activationPool.Setup(v) defer activationPool.Put(rawVars) vars = ctxActivationPool.Setup(rawVars, ctx.Done(), p.interruptCheckFrequency) defer ctxActivationPool.Put(vars) default: - return nil, nil, fmt.Errorf("invalid input, wanted Activation or map[string]interface{}, got: (%T)%v", input, input) + return nil, nil, fmt.Errorf("invalid input, wanted Activation or map[string]any, got: (%T)%v", input, input) } return p.Eval(vars) } -// Cost implements the Coster interface method. -func (p *prog) Cost() (min, max int64) { - return estimateCost(p.interpretable) -} - // progFactory is a helper alias for marking a program creation factory function. type progFactory func(interpreter.EvalState, *interpreter.CostTracker) (Program, error) @@ -354,7 +379,7 @@ func newProgGen(factory progFactory) (Program, error) { } // Eval implements the Program interface method. -func (gen *progGen) Eval(input interface{}) (ref.Val, *EvalDetails, error) { +func (gen *progGen) Eval(input any) (ref.Val, *EvalDetails, error) { // The factory based Eval() differs from the standard evaluation model in that it generates a // new EvalState instance for each call to ensure that unique evaluations yield unique stateful // results. @@ -379,7 +404,7 @@ func (gen *progGen) Eval(input interface{}) (ref.Val, *EvalDetails, error) { } // ContextEval implements the Program interface method. -func (gen *progGen) ContextEval(ctx context.Context, input interface{}) (ref.Val, *EvalDetails, error) { +func (gen *progGen) ContextEval(ctx context.Context, input any) (ref.Val, *EvalDetails, error) { if ctx == nil { return nil, nil, fmt.Errorf("context can not be nil") } @@ -406,29 +431,6 @@ func (gen *progGen) ContextEval(ctx context.Context, input interface{}) (ref.Val return v, det, nil } -// Cost implements the Coster interface method. -func (gen *progGen) Cost() (min, max int64) { - // Use an empty state value since no evaluation is performed. - p, err := gen.factory(emptyEvalState, nil) - if err != nil { - return 0, math.MaxInt64 - } - return estimateCost(p) -} - -// EstimateCost returns the heuristic cost interval for the program. -func EstimateCost(p Program) (min, max int64) { - return estimateCost(p) -} - -func estimateCost(i interface{}) (min, max int64) { - c, ok := i.(interpreter.Coster) - if !ok { - return 0, math.MaxInt64 - } - return c.Cost() -} - type ctxEvalActivation struct { parent interpreter.Activation interrupt <-chan struct{} @@ -438,7 +440,7 @@ type ctxEvalActivation struct { // ResolveName implements the Activation interface method, but adds a special #interrupted variable // which is capable of testing whether a 'done' signal is provided from a context.Context channel. -func (a *ctxEvalActivation) ResolveName(name string) (interface{}, bool) { +func (a *ctxEvalActivation) ResolveName(name string) (any, bool) { if name == "#interrupted" { a.interruptCheckCount++ if a.interruptCheckCount%a.interruptCheckFrequency == 0 { @@ -461,7 +463,7 @@ func (a *ctxEvalActivation) Parent() interpreter.Activation { func newCtxEvalActivationPool() *ctxEvalActivationPool { return &ctxEvalActivationPool{ Pool: sync.Pool{ - New: func() interface{} { + New: func() any { return &ctxEvalActivation{} }, }, @@ -483,21 +485,21 @@ func (p *ctxEvalActivationPool) Setup(vars interpreter.Activation, done <-chan s } type evalActivation struct { - vars map[string]interface{} - lazyVars map[string]interface{} + vars map[string]any + lazyVars map[string]any } // ResolveName looks up the value of the input variable name, if found. // // Lazy bindings may be supplied within the map-based input in either of the following forms: -// - func() interface{} +// - func() any // - func() ref.Val // // The lazy binding will only be invoked once per evaluation. // // Values which are not represented as ref.Val types on input may be adapted to a ref.Val using // the ref.TypeAdapter configured in the environment. -func (a *evalActivation) ResolveName(name string) (interface{}, bool) { +func (a *evalActivation) ResolveName(name string) (any, bool) { v, found := a.vars[name] if !found { return nil, false @@ -510,7 +512,7 @@ func (a *evalActivation) ResolveName(name string) (interface{}, bool) { lazy := obj() a.lazyVars[name] = lazy return lazy, true - case func() interface{}: + case func() any: if resolved, found := a.lazyVars[name]; found { return resolved, true } @@ -530,8 +532,8 @@ func (a *evalActivation) Parent() interpreter.Activation { func newEvalActivationPool() *evalActivationPool { return &evalActivationPool{ Pool: sync.Pool{ - New: func() interface{} { - return &evalActivation{lazyVars: make(map[string]interface{})} + New: func() any { + return &evalActivation{lazyVars: make(map[string]any)} }, }, } @@ -542,13 +544,13 @@ type evalActivationPool struct { } // Setup initializes a pooled Activation object with the map input. -func (p *evalActivationPool) Setup(vars map[string]interface{}) *evalActivation { +func (p *evalActivationPool) Setup(vars map[string]any) *evalActivation { a := p.Pool.Get().(*evalActivation) a.vars = vars return a } -func (p *evalActivationPool) Put(value interface{}) { +func (p *evalActivationPool) Put(value any) { a := value.(*evalActivation) for k := range a.lazyVars { delete(a.lazyVars, k) @@ -559,7 +561,7 @@ func (p *evalActivationPool) Put(value interface{}) { var ( emptyEvalState = interpreter.NewEvalState() - // activationPool is an internally managed pool of Activation values that wrap map[string]interface{} inputs + // activationPool is an internally managed pool of Activation values that wrap map[string]any inputs activationPool = newEvalActivationPool() // ctxActivationPool is an internally managed pool of Activation values that expose a special #interrupted variable diff --git a/tools/vendor/github.com/google/cel-go/checker/BUILD.bazel b/tools/vendor/github.com/google/cel-go/checker/BUILD.bazel index bec40b6e6..1c6ddb7f7 100644 --- a/tools/vendor/github.com/google/cel-go/checker/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/checker/BUILD.bazel @@ -30,7 +30,7 @@ go_library( "//common/types/pb:go_default_library", "//common/types/ref:go_default_library", "//parser:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/emptypb:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", @@ -54,7 +54,7 @@ go_test( "//test:go_default_library", "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", - "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr_v4//:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/checker/checker.go b/tools/vendor/github.com/google/cel-go/checker/checker.go index fcddb1b2c..257cffecf 100644 --- a/tools/vendor/github.com/google/cel-go/checker/checker.go +++ b/tools/vendor/github.com/google/cel-go/checker/checker.go @@ -23,6 +23,7 @@ import ( "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common" "github.com/google/cel-go/common/containers" + "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/types/ref" "google.golang.org/protobuf/proto" @@ -173,8 +174,8 @@ func (c *checker) checkSelect(e *exprpb.Expr) { // Rewrite the node to be a variable reference to the resolved fully-qualified // variable name. - c.setType(e, ident.GetIdent().Type) - c.setReference(e, newIdentReference(ident.GetName(), ident.GetIdent().Value)) + c.setType(e, ident.GetIdent().GetType()) + c.setReference(e, newIdentReference(ident.GetName(), ident.GetIdent().GetValue())) identName := ident.GetName() e.ExprKind = &exprpb.Expr_IdentExpr{ IdentExpr: &exprpb.Expr_Ident{ @@ -185,9 +186,37 @@ func (c *checker) checkSelect(e *exprpb.Expr) { } } + resultType := c.checkSelectField(e, sel.GetOperand(), sel.GetField(), false) + if sel.TestOnly { + resultType = decls.Bool + } + c.setType(e, substitute(c.mappings, resultType, false)) +} + +func (c *checker) checkOptSelect(e *exprpb.Expr) { + // Collect metadata related to the opt select call packaged by the parser. + call := e.GetCallExpr() + operand := call.GetArgs()[0] + field := call.GetArgs()[1] + fieldName, isString := maybeUnwrapString(field) + if !isString { + c.errors.ReportError(c.location(field), "unsupported optional field selection: %v", field) + return + } + + // Perform type-checking using the field selection logic. + resultType := c.checkSelectField(e, operand, fieldName, true) + c.setType(e, substitute(c.mappings, resultType, false)) +} + +func (c *checker) checkSelectField(e, operand *exprpb.Expr, field string, optional bool) *exprpb.Type { // Interpret as field selection, first traversing down the operand. - c.check(sel.GetOperand()) - targetType := substitute(c.mappings, c.getType(sel.GetOperand()), false) + c.check(operand) + operandType := substitute(c.mappings, c.getType(operand), false) + + // If the target type is 'optional', unwrap it for the sake of this check. + targetType, isOpt := maybeUnwrapOptional(operandType) + // Assume error type by default as most types do not support field selection. resultType := decls.Error switch kindOf(targetType) { @@ -199,7 +228,7 @@ func (c *checker) checkSelect(e *exprpb.Expr) { // Objects yield their field type declaration as the selection result type, but only if // the field is defined. messageType := targetType - if fieldType, found := c.lookupFieldType(c.location(e), messageType.GetMessageType(), sel.GetField()); found { + if fieldType, found := c.lookupFieldType(c.location(e), messageType.GetMessageType(), field); found { resultType = fieldType.Type } case kindTypeParam: @@ -212,16 +241,17 @@ func (c *checker) checkSelect(e *exprpb.Expr) { default: // Dynamic / error values are treated as DYN type. Errors are handled this way as well // in order to allow forward progress on the check. - if isDynOrError(targetType) { - resultType = decls.Dyn - } else { + if !isDynOrError(targetType) { c.errors.typeDoesNotSupportFieldSelection(c.location(e), targetType) } + resultType = decls.Dyn } - if sel.TestOnly { - resultType = decls.Bool + + // If the target type was optional coming in, then the result must be optional going out. + if isOpt || optional { + return decls.NewOptionalType(resultType) } - c.setType(e, substitute(c.mappings, resultType, false)) + return resultType } func (c *checker) checkCall(e *exprpb.Expr) { @@ -229,15 +259,19 @@ func (c *checker) checkCall(e *exprpb.Expr) { // please consider the impact on planner.go and consolidate implementations or mirror code // as appropriate. call := e.GetCallExpr() - target := call.GetTarget() - args := call.GetArgs() fnName := call.GetFunction() + if fnName == operators.OptSelect { + c.checkOptSelect(e) + return + } + args := call.GetArgs() // Traverse arguments. for _, arg := range args { c.check(arg) } + target := call.GetTarget() // Regular static call with simple name. if target == nil { // Check for the existence of the function. @@ -359,6 +393,9 @@ func (c *checker) resolveOverload( } if resultType == nil { + for i, arg := range argTypes { + argTypes[i] = substitute(c.mappings, arg, true) + } c.errors.noMatchingOverload(loc, fn.GetName(), argTypes, target != nil) resultType = decls.Error return nil @@ -369,16 +406,29 @@ func (c *checker) resolveOverload( func (c *checker) checkCreateList(e *exprpb.Expr) { create := e.GetListExpr() - var elemType *exprpb.Type - for _, e := range create.GetElements() { + var elemsType *exprpb.Type + optionalIndices := create.GetOptionalIndices() + optionals := make(map[int32]bool, len(optionalIndices)) + for _, optInd := range optionalIndices { + optionals[optInd] = true + } + for i, e := range create.GetElements() { c.check(e) - elemType = c.joinTypes(c.location(e), elemType, c.getType(e)) + elemType := c.getType(e) + if optionals[int32(i)] { + var isOptional bool + elemType, isOptional = maybeUnwrapOptional(elemType) + if !isOptional && !isDyn(elemType) { + c.errors.typeMismatch(c.location(e), decls.NewOptionalType(elemType), elemType) + } + } + elemsType = c.joinTypes(c.location(e), elemsType, elemType) } - if elemType == nil { + if elemsType == nil { // If the list is empty, assign free type var to elem type. - elemType = c.newTypeVar() + elemsType = c.newTypeVar() } - c.setType(e, decls.NewListType(elemType)) + c.setType(e, decls.NewListType(elemsType)) } func (c *checker) checkCreateStruct(e *exprpb.Expr) { @@ -392,22 +442,31 @@ func (c *checker) checkCreateStruct(e *exprpb.Expr) { func (c *checker) checkCreateMap(e *exprpb.Expr) { mapVal := e.GetStructExpr() - var keyType *exprpb.Type - var valueType *exprpb.Type + var mapKeyType *exprpb.Type + var mapValueType *exprpb.Type for _, ent := range mapVal.GetEntries() { key := ent.GetMapKey() c.check(key) - keyType = c.joinTypes(c.location(key), keyType, c.getType(key)) - - c.check(ent.Value) - valueType = c.joinTypes(c.location(ent.Value), valueType, c.getType(ent.Value)) + mapKeyType = c.joinTypes(c.location(key), mapKeyType, c.getType(key)) + + val := ent.GetValue() + c.check(val) + valType := c.getType(val) + if ent.GetOptionalEntry() { + var isOptional bool + valType, isOptional = maybeUnwrapOptional(valType) + if !isOptional && !isDyn(valType) { + c.errors.typeMismatch(c.location(val), decls.NewOptionalType(valType), valType) + } + } + mapValueType = c.joinTypes(c.location(val), mapValueType, valType) } - if keyType == nil { + if mapKeyType == nil { // If the map is empty, assign free type variables to typeKey and value type. - keyType = c.newTypeVar() - valueType = c.newTypeVar() + mapKeyType = c.newTypeVar() + mapValueType = c.newTypeVar() } - c.setType(e, decls.NewMapType(keyType, valueType)) + c.setType(e, decls.NewMapType(mapKeyType, mapValueType)) } func (c *checker) checkCreateMessage(e *exprpb.Expr) { @@ -449,15 +508,21 @@ func (c *checker) checkCreateMessage(e *exprpb.Expr) { c.check(value) fieldType := decls.Error - if t, found := c.lookupFieldType( - c.locationByID(ent.GetId()), - messageType.GetMessageType(), - field); found { - fieldType = t.Type + ft, found := c.lookupFieldType(c.locationByID(ent.GetId()), messageType.GetMessageType(), field) + if found { + fieldType = ft.Type + } + + valType := c.getType(value) + if ent.GetOptionalEntry() { + var isOptional bool + valType, isOptional = maybeUnwrapOptional(valType) + if !isOptional && !isDyn(valType) { + c.errors.typeMismatch(c.location(value), decls.NewOptionalType(valType), valType) + } } - if !c.isAssignable(fieldType, c.getType(value)) { - c.errors.fieldTypeMismatch( - c.locationByID(ent.Id), field, fieldType, c.getType(value)) + if !c.isAssignable(fieldType, valType) { + c.errors.fieldTypeMismatch(c.locationByID(ent.Id), field, fieldType, valType) } } } diff --git a/tools/vendor/github.com/google/cel-go/checker/cost.go b/tools/vendor/github.com/google/cel-go/checker/cost.go index 7312d1fe2..8ae8d18bf 100644 --- a/tools/vendor/github.com/google/cel-go/checker/cost.go +++ b/tools/vendor/github.com/google/cel-go/checker/cost.go @@ -92,7 +92,10 @@ func (e astNode) ComputedSize() *SizeEstimate { case *exprpb.Expr_ConstExpr: switch ck := ek.ConstExpr.GetConstantKind().(type) { case *exprpb.Constant_StringValue: - v = uint64(len(ck.StringValue)) + // converting to runes here is an O(n) operation, but + // this is consistent with how size is computed at runtime, + // and how the language definition defines string size + v = uint64(len([]rune(ck.StringValue))) case *exprpb.Constant_BytesValue: v = uint64(len(ck.BytesValue)) case *exprpb.Constant_BoolValue, *exprpb.Constant_DoubleValue, *exprpb.Constant_DurationValue, @@ -258,6 +261,8 @@ type coster struct { computedSizes map[int64]SizeEstimate checkedExpr *exprpb.CheckedExpr estimator CostEstimator + // presenceTestCost will either be a zero or one based on whether has() macros count against cost computations. + presenceTestCost CostEstimate } // Use a stack of iterVar -> iterRange Expr Ids to handle shadowed variable names. @@ -280,16 +285,39 @@ func (vs iterRangeScopes) peek(varName string) (int64, bool) { return 0, false } +// CostOption configures flags which affect cost computations. +type CostOption func(*coster) error + +// PresenceTestHasCost determines whether presence testing has a cost of one or zero. +// Defaults to presence test has a cost of one. +func PresenceTestHasCost(hasCost bool) CostOption { + return func(c *coster) error { + if hasCost { + c.presenceTestCost = selectAndIdentCost + return nil + } + c.presenceTestCost = CostEstimate{Min: 0, Max: 0} + return nil + } +} + // Cost estimates the cost of the parsed and type checked CEL expression. -func Cost(checker *exprpb.CheckedExpr, estimator CostEstimator) CostEstimate { - c := coster{ - checkedExpr: checker, - estimator: estimator, - exprPath: map[int64][]string{}, - iterRanges: map[string][]int64{}, - computedSizes: map[int64]SizeEstimate{}, +func Cost(checker *exprpb.CheckedExpr, estimator CostEstimator, opts ...CostOption) (CostEstimate, error) { + c := &coster{ + checkedExpr: checker, + estimator: estimator, + exprPath: map[int64][]string{}, + iterRanges: map[string][]int64{}, + computedSizes: map[int64]SizeEstimate{}, + presenceTestCost: CostEstimate{Min: 1, Max: 1}, + } + for _, opt := range opts { + err := opt(c) + if err != nil { + return CostEstimate{}, err + } } - return c.cost(checker.GetExpr()) + return c.cost(checker.GetExpr()), nil } func (c *coster) cost(e *exprpb.Expr) CostEstimate { @@ -340,6 +368,12 @@ func (c *coster) costSelect(e *exprpb.Expr) CostEstimate { sel := e.GetSelectExpr() var sum CostEstimate if sel.GetTestOnly() { + // recurse, but do not add any cost + // this is equivalent to how evalTestOnly increments the runtime cost counter + // but does not add any additional cost for the qualifier, except here we do + // the reverse (ident adds cost) + sum = sum.Add(c.presenceTestCost) + sum = sum.Add(c.cost(sel.GetOperand())) return sum } sum = sum.Add(c.cost(sel.GetOperand())) @@ -503,7 +537,10 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args } switch overloadID { // O(n) functions - case overloads.StartsWithString, overloads.EndsWithString, overloads.StringToBytes, overloads.BytesToString: + case overloads.StartsWithString, overloads.EndsWithString, overloads.StringToBytes, overloads.BytesToString, overloads.ExtQuoteString, overloads.ExtFormatString: + if overloadID == overloads.ExtFormatString { + return CallEstimate{CostEstimate: c.sizeEstimate(*target).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} + } if len(args) == 1 { return CallEstimate{CostEstimate: c.sizeEstimate(args[0]).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} } diff --git a/tools/vendor/github.com/google/cel-go/checker/decls/BUILD.bazel b/tools/vendor/github.com/google/cel-go/checker/decls/BUILD.bazel index 5a24f1da8..9384be450 100644 --- a/tools/vendor/github.com/google/cel-go/checker/decls/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/checker/decls/BUILD.bazel @@ -13,7 +13,7 @@ go_library( ], importpath = "github.com/google/cel-go/checker/decls", deps = [ - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//types/known/emptypb:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", ], diff --git a/tools/vendor/github.com/google/cel-go/checker/decls/decls.go b/tools/vendor/github.com/google/cel-go/checker/decls/decls.go index 88a99282d..0d91bef51 100644 --- a/tools/vendor/github.com/google/cel-go/checker/decls/decls.go +++ b/tools/vendor/github.com/google/cel-go/checker/decls/decls.go @@ -16,9 +16,9 @@ package decls import ( + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" emptypb "google.golang.org/protobuf/types/known/emptypb" structpb "google.golang.org/protobuf/types/known/structpb" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) var ( @@ -64,6 +64,12 @@ func NewAbstractType(name string, paramTypes ...*exprpb.Type) *exprpb.Type { ParameterTypes: paramTypes}}} } +// NewOptionalType constructs an abstract type indicating that the parameterized type +// may be contained within the object. +func NewOptionalType(paramType *exprpb.Type) *exprpb.Type { + return NewAbstractType("optional", paramType) +} + // NewFunctionType creates a function invocation contract, typically only used // by type-checking steps after overload resolution. func NewFunctionType(resultType *exprpb.Type, diff --git a/tools/vendor/github.com/google/cel-go/checker/env.go b/tools/vendor/github.com/google/cel-go/checker/env.go index c7eeb04ee..be89d2d68 100644 --- a/tools/vendor/github.com/google/cel-go/checker/env.go +++ b/tools/vendor/github.com/google/cel-go/checker/env.go @@ -226,7 +226,7 @@ func (e *Env) setFunction(decl *exprpb.Decl) []errorMsg { newOverloads := []*exprpb.Decl_FunctionDecl_Overload{} for _, overload := range overloads { existing, found := existingOverloads[overload.GetOverloadId()] - if !found || !proto.Equal(existing, overload) { + if !found || !overloadsEqual(existing, overload) { newOverloads = append(newOverloads, overload) } } @@ -264,6 +264,31 @@ func (e *Env) isOverloadDisabled(overloadID string) bool { return found } +// overloadsEqual returns whether two overloads have identical signatures. +// +// type parameter names are ignored as they may be specified in any order and have no bearing on overload +// equivalence +func overloadsEqual(o1, o2 *exprpb.Decl_FunctionDecl_Overload) bool { + return o1.GetOverloadId() == o2.GetOverloadId() && + o1.GetIsInstanceFunction() == o2.GetIsInstanceFunction() && + paramsEqual(o1.GetParams(), o2.GetParams()) && + proto.Equal(o1.GetResultType(), o2.GetResultType()) +} + +// paramsEqual returns whether two lists have equal length and all types are equal +func paramsEqual(p1, p2 []*exprpb.Type) bool { + if len(p1) != len(p2) { + return false + } + for i, a := range p1 { + b := p2[i] + if !proto.Equal(a, b) { + return false + } + } + return true +} + // sanitizeFunction replaces well-known types referenced by message name with their equivalent // CEL built-in type instances. func sanitizeFunction(decl *exprpb.Decl) *exprpb.Decl { diff --git a/tools/vendor/github.com/google/cel-go/checker/printer.go b/tools/vendor/github.com/google/cel-go/checker/printer.go index e2ed35be8..0cecc5210 100644 --- a/tools/vendor/github.com/google/cel-go/checker/printer.go +++ b/tools/vendor/github.com/google/cel-go/checker/printer.go @@ -26,7 +26,7 @@ type semanticAdorner struct { var _ debug.Adorner = &semanticAdorner{} -func (a *semanticAdorner) GetMetadata(elem interface{}) string { +func (a *semanticAdorner) GetMetadata(elem any) string { result := "" e, isExpr := elem.(*exprpb.Expr) if !isExpr { diff --git a/tools/vendor/github.com/google/cel-go/checker/standard.go b/tools/vendor/github.com/google/cel-go/checker/standard.go index 5b48a9046..e64337ba4 100644 --- a/tools/vendor/github.com/google/cel-go/checker/standard.go +++ b/tools/vendor/github.com/google/cel-go/checker/standard.go @@ -287,6 +287,8 @@ func init() { decls.NewInstanceOverload(overloads.EndsWithString, []*exprpb.Type{decls.String, decls.String}, decls.Bool)), decls.NewFunction(overloads.Matches, + decls.NewOverload(overloads.Matches, + []*exprpb.Type{decls.String, decls.String}, decls.Bool), decls.NewInstanceOverload(overloads.MatchesString, []*exprpb.Type{decls.String, decls.String}, decls.Bool)), decls.NewFunction(overloads.StartsWith, diff --git a/tools/vendor/github.com/google/cel-go/checker/types.go b/tools/vendor/github.com/google/cel-go/checker/types.go index 8683797d5..28d21c9d9 100644 --- a/tools/vendor/github.com/google/cel-go/checker/types.go +++ b/tools/vendor/github.com/google/cel-go/checker/types.go @@ -90,6 +90,14 @@ func FormatCheckedType(t *exprpb.Type) string { return "!error!" case kindTypeParam: return t.GetTypeParam() + case kindAbstract: + at := t.GetAbstractType() + params := at.GetParameterTypes() + paramStrs := make([]string, len(params)) + for i, p := range params { + paramStrs[i] = FormatCheckedType(p) + } + return fmt.Sprintf("%s(%s)", at.GetName(), strings.Join(paramStrs, ", ")) } return t.String() } @@ -110,12 +118,39 @@ func isDyn(t *exprpb.Type) bool { // isDynOrError returns true if the input is either an Error, DYN, or well-known ANY message. func isDynOrError(t *exprpb.Type) bool { - switch kindOf(t) { - case kindError: - return true - default: - return isDyn(t) + return isError(t) || isDyn(t) +} + +func isError(t *exprpb.Type) bool { + return kindOf(t) == kindError +} + +func isOptional(t *exprpb.Type) bool { + if kindOf(t) == kindAbstract { + at := t.GetAbstractType() + return at.GetName() == "optional" + } + return false +} + +func maybeUnwrapOptional(t *exprpb.Type) (*exprpb.Type, bool) { + if isOptional(t) { + at := t.GetAbstractType() + return at.GetParameterTypes()[0], true + } + return t, false +} + +func maybeUnwrapString(e *exprpb.Expr) (string, bool) { + switch e.GetExprKind().(type) { + case *exprpb.Expr_ConstExpr: + literal := e.GetConstExpr() + switch literal.GetConstantKind().(type) { + case *exprpb.Constant_StringValue: + return literal.GetStringValue(), true + } } + return "", false } // isEqualOrLessSpecific checks whether one type is equal or less specific than the other one. @@ -236,7 +271,7 @@ func internalIsAssignable(m *mapping, t1 *exprpb.Type, t2 *exprpb.Type) bool { // substitution for t1, and whether t2 has a type substitution in mapping m. // // The type t2 is a valid substitution for t1 if any of the following statements is true -// - t2 has a type substitition (t2sub) equal to t1 +// - t2 has a type substitution (t2sub) equal to t1 // - t2 has a type substitution (t2sub) assignable to t1 // - t2 does not occur within t1. func isValidTypeSubstitution(m *mapping, t1, t2 *exprpb.Type) (valid, hasSub bool) { diff --git a/tools/vendor/github.com/google/cel-go/common/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/BUILD.bazel index a0058aebe..d6165b13a 100644 --- a/tools/vendor/github.com/google/cel-go/common/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/BUILD.bazel @@ -17,7 +17,7 @@ go_library( importpath = "github.com/google/cel-go/common", deps = [ "//common/runes:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_x_text//width:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/common/containers/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/containers/BUILD.bazel index 18142d94e..3f3f07887 100644 --- a/tools/vendor/github.com/google/cel-go/common/containers/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/containers/BUILD.bazel @@ -12,7 +12,7 @@ go_library( ], importpath = "github.com/google/cel-go/common/containers", deps = [ - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", ], ) @@ -26,6 +26,6 @@ go_test( ":go_default_library", ], deps = [ - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/common/debug/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/debug/BUILD.bazel index cf5c5d246..1f029839c 100644 --- a/tools/vendor/github.com/google/cel-go/common/debug/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/debug/BUILD.bazel @@ -13,6 +13,6 @@ go_library( importpath = "github.com/google/cel-go/common/debug", deps = [ "//common:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/common/debug/debug.go b/tools/vendor/github.com/google/cel-go/common/debug/debug.go index bec885424..5dab156ef 100644 --- a/tools/vendor/github.com/google/cel-go/common/debug/debug.go +++ b/tools/vendor/github.com/google/cel-go/common/debug/debug.go @@ -29,7 +29,7 @@ import ( // representation of an expression. type Adorner interface { // GetMetadata for the input context. - GetMetadata(ctx interface{}) string + GetMetadata(ctx any) string } // Writer manages writing expressions to an internal string. @@ -46,7 +46,7 @@ type emptyDebugAdorner struct { var emptyAdorner Adorner = &emptyDebugAdorner{} -func (a *emptyDebugAdorner) GetMetadata(e interface{}) string { +func (a *emptyDebugAdorner) GetMetadata(e any) string { return "" } @@ -170,6 +170,9 @@ func (w *debugWriter) appendObject(obj *exprpb.Expr_CreateStruct) { w.append(",") w.appendLine() } + if entry.GetOptionalEntry() { + w.append("?") + } w.append(entry.GetFieldKey()) w.append(":") w.Buffer(entry.GetValue()) @@ -191,6 +194,9 @@ func (w *debugWriter) appendMap(obj *exprpb.Expr_CreateStruct) { w.append(",") w.appendLine() } + if entry.GetOptionalEntry() { + w.append("?") + } w.Buffer(entry.GetMapKey()) w.append(":") w.Buffer(entry.GetValue()) @@ -269,7 +275,7 @@ func (w *debugWriter) append(s string) { w.buffer.WriteString(s) } -func (w *debugWriter) appendFormat(f string, args ...interface{}) { +func (w *debugWriter) appendFormat(f string, args ...any) { w.append(fmt.Sprintf(f, args...)) } @@ -280,7 +286,7 @@ func (w *debugWriter) doIndent() { } } -func (w *debugWriter) adorn(e interface{}) { +func (w *debugWriter) adorn(e any) { w.append(w.adorner.GetMetadata(e)) } diff --git a/tools/vendor/github.com/google/cel-go/common/errors.go b/tools/vendor/github.com/google/cel-go/common/errors.go index daebba860..1565085ab 100644 --- a/tools/vendor/github.com/google/cel-go/common/errors.go +++ b/tools/vendor/github.com/google/cel-go/common/errors.go @@ -38,7 +38,7 @@ func NewErrors(source Source) *Errors { } // ReportError records an error at a source location. -func (e *Errors) ReportError(l Location, format string, args ...interface{}) { +func (e *Errors) ReportError(l Location, format string, args ...any) { e.numErrors++ if e.numErrors > e.maxErrorsToReport { return diff --git a/tools/vendor/github.com/google/cel-go/common/operators/operators.go b/tools/vendor/github.com/google/cel-go/common/operators/operators.go index fa25dfb7f..f9b39bda3 100644 --- a/tools/vendor/github.com/google/cel-go/common/operators/operators.go +++ b/tools/vendor/github.com/google/cel-go/common/operators/operators.go @@ -37,6 +37,8 @@ const ( Modulo = "_%_" Negate = "-_" Index = "_[_]" + OptIndex = "_[?_]" + OptSelect = "_?._" // Macros, must have a valid identifier. Has = "has" @@ -99,6 +101,8 @@ var ( LogicalNot: {displayName: "!", precedence: 2, arity: 1}, Negate: {displayName: "-", precedence: 2, arity: 1}, Index: {displayName: "", precedence: 1, arity: 2}, + OptIndex: {displayName: "", precedence: 1, arity: 2}, + OptSelect: {displayName: "", precedence: 1, arity: 2}, } ) diff --git a/tools/vendor/github.com/google/cel-go/common/overloads/overloads.go b/tools/vendor/github.com/google/cel-go/common/overloads/overloads.go index 9ebaf6fab..9d50f4367 100644 --- a/tools/vendor/github.com/google/cel-go/common/overloads/overloads.go +++ b/tools/vendor/github.com/google/cel-go/common/overloads/overloads.go @@ -148,6 +148,11 @@ const ( StartsWith = "startsWith" ) +// Extension function overloads with complex behaviors that need to be referenced in runtime and static analysis cost computations. +const ( + ExtQuoteString = "strings_quote" +) + // String function overload names. const ( ContainsString = "contains_string" @@ -156,6 +161,11 @@ const ( StartsWithString = "starts_with_string" ) +// Extension function overloads with complex behaviors that need to be referenced in runtime and static analysis cost computations. +const ( + ExtFormatString = "string_format" +) + // Time-based functions. const ( TimeGetFullYear = "getFullYear" diff --git a/tools/vendor/github.com/google/cel-go/common/types/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/types/BUILD.bazel index 5f1b1cd1f..89c4feacb 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/types/BUILD.bazel @@ -22,6 +22,7 @@ go_library( "map.go", "null.go", "object.go", + "optional.go", "overflow.go", "provider.go", "string.go", @@ -38,10 +39,8 @@ go_library( "//common/types/ref:go_default_library", "//common/types/traits:go_default_library", "@com_github_stoewer_go_strcase//:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", - "@org_golang_google_genproto//googleapis/rpc/status:go_default_library", - "@org_golang_google_grpc//codes:go_default_library", - "@org_golang_google_grpc//status:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_rpc//status:go_default_library", "@org_golang_google_protobuf//encoding/protojson:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", @@ -68,6 +67,7 @@ go_test( "map_test.go", "null_test.go", "object_test.go", + "optional_test.go", "provider_test.go", "string_test.go", "timestamp_test.go", @@ -80,7 +80,7 @@ go_test( "//common/types/ref:go_default_library", "//test:go_default_library", "//test/proto3pb:test_all_types_go_proto", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//encoding/protojson:go_default_library", "@org_golang_google_protobuf//types/known/anypb:go_default_library", "@org_golang_google_protobuf//types/known/durationpb:go_default_library", diff --git a/tools/vendor/github.com/google/cel-go/common/types/bool.go b/tools/vendor/github.com/google/cel-go/common/types/bool.go index 1b55ba952..a634ecc28 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/bool.go +++ b/tools/vendor/github.com/google/cel-go/common/types/bool.go @@ -62,7 +62,7 @@ func (b Bool) Compare(other ref.Val) ref.Val { } // ConvertToNative implements the ref.Val interface method. -func (b Bool) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (b Bool) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Bool: return reflect.ValueOf(b).Convert(typeDesc).Interface(), nil @@ -114,6 +114,11 @@ func (b Bool) Equal(other ref.Val) ref.Val { return Bool(ok && b == otherBool) } +// IsZeroValue returns true if the boolean value is false. +func (b Bool) IsZeroValue() bool { + return b == False +} + // Negate implements the traits.Negater interface method. func (b Bool) Negate() ref.Val { return !b @@ -125,7 +130,7 @@ func (b Bool) Type() ref.Type { } // Value implements the ref.Val interface method. -func (b Bool) Value() interface{} { +func (b Bool) Value() any { return bool(b) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/bytes.go b/tools/vendor/github.com/google/cel-go/common/types/bytes.go index 3575717ec..bef190759 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/bytes.go +++ b/tools/vendor/github.com/google/cel-go/common/types/bytes.go @@ -63,7 +63,7 @@ func (b Bytes) Compare(other ref.Val) ref.Val { } // ConvertToNative implements the ref.Val interface method. -func (b Bytes) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (b Bytes) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Array, reflect.Slice: return reflect.ValueOf(b).Convert(typeDesc).Interface(), nil @@ -116,6 +116,11 @@ func (b Bytes) Equal(other ref.Val) ref.Val { return Bool(ok && bytes.Equal(b, otherBytes)) } +// IsZeroValue returns true if the byte array is empty. +func (b Bytes) IsZeroValue() bool { + return len(b) == 0 +} + // Size implements the traits.Sizer interface method. func (b Bytes) Size() ref.Val { return Int(len(b)) @@ -127,6 +132,6 @@ func (b Bytes) Type() ref.Type { } // Value implements the ref.Val interface method. -func (b Bytes) Value() interface{} { +func (b Bytes) Value() any { return []byte(b) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/double.go b/tools/vendor/github.com/google/cel-go/common/types/double.go index a6ec52a0f..bda9f31a6 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/double.go +++ b/tools/vendor/github.com/google/cel-go/common/types/double.go @@ -78,7 +78,7 @@ func (d Double) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (d Double) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (d Double) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Float32: v := float32(d) @@ -134,13 +134,13 @@ func (d Double) ConvertToType(typeVal ref.Type) ref.Val { case IntType: i, err := doubleToInt64Checked(float64(d)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(i) case UintType: i, err := doubleToUint64Checked(float64(d)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(i) case DoubleType: @@ -182,6 +182,11 @@ func (d Double) Equal(other ref.Val) ref.Val { } } +// IsZeroValue returns true if double value is 0.0 +func (d Double) IsZeroValue() bool { + return float64(d) == 0.0 +} + // Multiply implements traits.Multiplier.Multiply. func (d Double) Multiply(other ref.Val) ref.Val { otherDouble, ok := other.(Double) @@ -211,6 +216,6 @@ func (d Double) Type() ref.Type { } // Value implements ref.Val.Value. -func (d Double) Value() interface{} { +func (d Double) Value() any { return float64(d) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/duration.go b/tools/vendor/github.com/google/cel-go/common/types/duration.go index 418349fa6..c90ac1bee 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/duration.go +++ b/tools/vendor/github.com/google/cel-go/common/types/duration.go @@ -57,14 +57,14 @@ func (d Duration) Add(other ref.Val) ref.Val { dur2 := other.(Duration) val, err := addDurationChecked(d.Duration, dur2.Duration) if err != nil { - return wrapErr(err) + return WrapErr(err) } return durationOf(val) case TimestampType: ts := other.(Timestamp).Time val, err := addTimeDurationChecked(ts, d.Duration) if err != nil { - return wrapErr(err) + return WrapErr(err) } return timestampOf(val) } @@ -90,7 +90,7 @@ func (d Duration) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (d Duration) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (d Duration) ConvertToNative(typeDesc reflect.Type) (any, error) { // If the duration is already assignable to the desired type return it. if reflect.TypeOf(d.Duration).AssignableTo(typeDesc) { return d.Duration, nil @@ -138,11 +138,16 @@ func (d Duration) Equal(other ref.Val) ref.Val { return Bool(ok && d.Duration == otherDur.Duration) } +// IsZeroValue returns true if the duration value is zero +func (d Duration) IsZeroValue() bool { + return d.Duration == 0 +} + // Negate implements traits.Negater.Negate. func (d Duration) Negate() ref.Val { val, err := negateDurationChecked(d.Duration) if err != nil { - return wrapErr(err) + return WrapErr(err) } return durationOf(val) } @@ -165,7 +170,7 @@ func (d Duration) Subtract(subtrahend ref.Val) ref.Val { } val, err := subtractDurationChecked(d.Duration, subtraDur.Duration) if err != nil { - return wrapErr(err) + return WrapErr(err) } return durationOf(val) } @@ -176,7 +181,7 @@ func (d Duration) Type() ref.Type { } // Value implements ref.Val.Value. -func (d Duration) Value() interface{} { +func (d Duration) Value() any { return d.Duration } diff --git a/tools/vendor/github.com/google/cel-go/common/types/err.go b/tools/vendor/github.com/google/cel-go/common/types/err.go index 93d79cdcb..b4874d9d4 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/err.go +++ b/tools/vendor/github.com/google/cel-go/common/types/err.go @@ -22,6 +22,12 @@ import ( "github.com/google/cel-go/common/types/ref" ) +// Error interface which allows types types.Err values to be treated as error values. +type Error interface { + error + ref.Val +} + // Err type which extends the built-in go error and implements ref.Val. type Err struct { error @@ -51,7 +57,7 @@ var ( // NewErr creates a new Err described by the format string and args. // TODO: Audit the use of this function and standardize the error messages and codes. -func NewErr(format string, args ...interface{}) ref.Val { +func NewErr(format string, args ...any) ref.Val { return &Err{fmt.Errorf(format, args...)} } @@ -62,7 +68,7 @@ func NoSuchOverloadErr() ref.Val { // UnsupportedRefValConversionErr returns a types.NewErr instance with a no such conversion // message that indicates that the native value could not be converted to a CEL ref.Val. -func UnsupportedRefValConversionErr(val interface{}) ref.Val { +func UnsupportedRefValConversionErr(val any) ref.Val { return NewErr("unsupported conversion to ref.Val: (%T)%v", val, val) } @@ -74,20 +80,20 @@ func MaybeNoSuchOverloadErr(val ref.Val) ref.Val { // ValOrErr either returns the existing error or creates a new one. // TODO: Audit the use of this function and standardize the error messages and codes. -func ValOrErr(val ref.Val, format string, args ...interface{}) ref.Val { +func ValOrErr(val ref.Val, format string, args ...any) ref.Val { if val == nil || !IsUnknownOrError(val) { return NewErr(format, args...) } return val } -// wrapErr wraps an existing Go error value into a CEL Err value. -func wrapErr(err error) ref.Val { +// WrapErr wraps an existing Go error value into a CEL Err value. +func WrapErr(err error) ref.Val { return &Err{error: err} } // ConvertToNative implements ref.Val.ConvertToNative. -func (e *Err) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (e *Err) ConvertToNative(typeDesc reflect.Type) (any, error) { return nil, e.error } @@ -114,10 +120,15 @@ func (e *Err) Type() ref.Type { } // Value implements ref.Val.Value. -func (e *Err) Value() interface{} { +func (e *Err) Value() any { return e.error } +// Is implements errors.Is. +func (e *Err) Is(target error) bool { + return e.error.Error() == target.Error() +} + // IsError returns whether the input element ref.Type or ref.Val is equal to // the ErrType singleton. func IsError(val ref.Val) bool { diff --git a/tools/vendor/github.com/google/cel-go/common/types/int.go b/tools/vendor/github.com/google/cel-go/common/types/int.go index 95f25dcd8..f5a9511c8 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/int.go +++ b/tools/vendor/github.com/google/cel-go/common/types/int.go @@ -66,7 +66,7 @@ func (i Int) Add(other ref.Val) ref.Val { } val, err := addInt64Checked(int64(i), int64(otherInt)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -89,7 +89,7 @@ func (i Int) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (i Int) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (i Int) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Int, reflect.Int32: // Enums are also mapped as int32 derivations. @@ -176,7 +176,7 @@ func (i Int) ConvertToType(typeVal ref.Type) ref.Val { case UintType: u, err := int64ToUint64Checked(int64(i)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(u) case DoubleType: @@ -204,7 +204,7 @@ func (i Int) Divide(other ref.Val) ref.Val { } val, err := divideInt64Checked(int64(i), int64(otherInt)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -226,6 +226,11 @@ func (i Int) Equal(other ref.Val) ref.Val { } } +// IsZeroValue returns true if integer is equal to 0 +func (i Int) IsZeroValue() bool { + return i == IntZero +} + // Modulo implements traits.Modder.Modulo. func (i Int) Modulo(other ref.Val) ref.Val { otherInt, ok := other.(Int) @@ -234,7 +239,7 @@ func (i Int) Modulo(other ref.Val) ref.Val { } val, err := moduloInt64Checked(int64(i), int64(otherInt)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -247,7 +252,7 @@ func (i Int) Multiply(other ref.Val) ref.Val { } val, err := multiplyInt64Checked(int64(i), int64(otherInt)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -256,7 +261,7 @@ func (i Int) Multiply(other ref.Val) ref.Val { func (i Int) Negate() ref.Val { val, err := negateInt64Checked(int64(i)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -269,7 +274,7 @@ func (i Int) Subtract(subtrahend ref.Val) ref.Val { } val, err := subtractInt64Checked(int64(i), int64(subtraInt)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(val) } @@ -280,7 +285,7 @@ func (i Int) Type() ref.Type { } // Value implements ref.Val.Value. -func (i Int) Value() interface{} { +func (i Int) Value() any { return int64(i) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/iterator.go b/tools/vendor/github.com/google/cel-go/common/types/iterator.go index 490662778..9f224ad4f 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/iterator.go +++ b/tools/vendor/github.com/google/cel-go/common/types/iterator.go @@ -34,7 +34,7 @@ var ( // interpreter. type baseIterator struct{} -func (*baseIterator) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (*baseIterator) ConvertToNative(typeDesc reflect.Type) (any, error) { return nil, fmt.Errorf("type conversion on iterators not supported") } @@ -50,6 +50,6 @@ func (*baseIterator) Type() ref.Type { return IteratorType } -func (*baseIterator) Value() interface{} { +func (*baseIterator) Value() any { return nil } diff --git a/tools/vendor/github.com/google/cel-go/common/types/json_value.go b/tools/vendor/github.com/google/cel-go/common/types/json_value.go index cd63b5194..13a4efe7a 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/json_value.go +++ b/tools/vendor/github.com/google/cel-go/common/types/json_value.go @@ -25,4 +25,5 @@ var ( jsonValueType = reflect.TypeOf(&structpb.Value{}) jsonListValueType = reflect.TypeOf(&structpb.ListValue{}) jsonStructType = reflect.TypeOf(&structpb.Struct{}) + jsonNullType = reflect.TypeOf(structpb.NullValue_NULL_VALUE) ) diff --git a/tools/vendor/github.com/google/cel-go/common/types/list.go b/tools/vendor/github.com/google/cel-go/common/types/list.go index 7230f7ea1..de5f2099b 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/list.go +++ b/tools/vendor/github.com/google/cel-go/common/types/list.go @@ -17,12 +17,14 @@ package types import ( "fmt" "reflect" + "strings" - "github.com/google/cel-go/common/types/ref" - "github.com/google/cel-go/common/types/traits" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + anypb "google.golang.org/protobuf/types/known/anypb" structpb "google.golang.org/protobuf/types/known/structpb" ) @@ -40,13 +42,13 @@ var ( // NewDynamicList returns a traits.Lister with heterogenous elements. // value should be an array of "native" types, i.e. any type that // NativeToValue() can convert to a ref.Val. -func NewDynamicList(adapter ref.TypeAdapter, value interface{}) traits.Lister { +func NewDynamicList(adapter ref.TypeAdapter, value any) traits.Lister { refValue := reflect.ValueOf(value) return &baseList{ TypeAdapter: adapter, value: value, size: refValue.Len(), - get: func(i int) interface{} { + get: func(i int) any { return refValue.Index(i).Interface() }, } @@ -58,7 +60,7 @@ func NewStringList(adapter ref.TypeAdapter, elems []string) traits.Lister { TypeAdapter: adapter, value: elems, size: len(elems), - get: func(i int) interface{} { return elems[i] }, + get: func(i int) any { return elems[i] }, } } @@ -70,7 +72,7 @@ func NewRefValList(adapter ref.TypeAdapter, elems []ref.Val) traits.Lister { TypeAdapter: adapter, value: elems, size: len(elems), - get: func(i int) interface{} { return elems[i] }, + get: func(i int) any { return elems[i] }, } } @@ -80,7 +82,7 @@ func NewProtoList(adapter ref.TypeAdapter, list protoreflect.List) traits.Lister TypeAdapter: adapter, value: list, size: list.Len(), - get: func(i int) interface{} { return list.Get(i).Interface() }, + get: func(i int) any { return list.Get(i).Interface() }, } } @@ -91,22 +93,25 @@ func NewJSONList(adapter ref.TypeAdapter, l *structpb.ListValue) traits.Lister { TypeAdapter: adapter, value: l, size: len(vals), - get: func(i int) interface{} { return vals[i] }, + get: func(i int) any { return vals[i] }, } } // NewMutableList creates a new mutable list whose internal state can be modified. func NewMutableList(adapter ref.TypeAdapter) traits.MutableLister { var mutableValues []ref.Val - return &mutableList{ + l := &mutableList{ baseList: &baseList{ TypeAdapter: adapter, value: mutableValues, size: 0, - get: func(i int) interface{} { return mutableValues[i] }, }, mutableValues: mutableValues, } + l.get = func(i int) any { + return l.mutableValues[i] + } + return l } // baseList points to a list containing elements of any type. @@ -114,7 +119,7 @@ func NewMutableList(adapter ref.TypeAdapter) traits.MutableLister { // The `ref.TypeAdapter` enables native type to CEL type conversions. type baseList struct { ref.TypeAdapter - value interface{} + value any // size indicates the number of elements within the list. // Since objects are immutable the size of a list is static. @@ -122,7 +127,7 @@ type baseList struct { // get returns a value at the specified integer index. // The index is guaranteed to be checked against the list index range. - get func(int) interface{} + get func(int) any } // Add implements the traits.Adder interface method. @@ -157,7 +162,7 @@ func (l *baseList) Contains(elem ref.Val) ref.Val { } // ConvertToNative implements the ref.Val interface method. -func (l *baseList) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (l *baseList) ConvertToNative(typeDesc reflect.Type) (any, error) { // If the underlying list value is assignable to the reflected type return it. if reflect.TypeOf(l.value).AssignableTo(typeDesc) { return l.value, nil @@ -240,7 +245,7 @@ func (l *baseList) Equal(other ref.Val) ref.Val { // Get implements the traits.Indexer interface method. func (l *baseList) Get(index ref.Val) ref.Val { - ind, err := indexOrError(index) + ind, err := IndexOrError(index) if err != nil { return ValOrErr(index, err.Error()) } @@ -250,6 +255,11 @@ func (l *baseList) Get(index ref.Val) ref.Val { return l.NativeToValue(l.get(ind)) } +// IsZeroValue returns true if the list is empty. +func (l *baseList) IsZeroValue() bool { + return l.size == 0 +} + // Iterator implements the traits.Iterable interface method. func (l *baseList) Iterator() traits.Iterator { return newListIterator(l) @@ -266,10 +276,24 @@ func (l *baseList) Type() ref.Type { } // Value implements the ref.Val interface method. -func (l *baseList) Value() interface{} { +func (l *baseList) Value() any { return l.value } +// String converts the list to a human readable string form. +func (l *baseList) String() string { + var sb strings.Builder + sb.WriteString("[") + for i := 0; i < l.size; i++ { + sb.WriteString(fmt.Sprintf("%v", l.get(i))) + if i != l.size-1 { + sb.WriteString(", ") + } + } + sb.WriteString("]") + return sb.String() +} + // mutableList aggregates values into its internal storage. For use with internal CEL variables only. type mutableList struct { *baseList @@ -305,7 +329,7 @@ func (l *mutableList) ToImmutableList() traits.Lister { // The `ref.TypeAdapter` enables native type to CEL type conversions. type concatList struct { ref.TypeAdapter - value interface{} + value any prevList traits.Lister nextList traits.Lister } @@ -351,8 +375,8 @@ func (l *concatList) Contains(elem ref.Val) ref.Val { } // ConvertToNative implements the ref.Val interface method. -func (l *concatList) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { - combined := NewDynamicList(l.TypeAdapter, l.Value().([]interface{})) +func (l *concatList) ConvertToNative(typeDesc reflect.Type) (any, error) { + combined := NewDynamicList(l.TypeAdapter, l.Value().([]any)) return combined.ConvertToNative(typeDesc) } @@ -396,7 +420,7 @@ func (l *concatList) Equal(other ref.Val) ref.Val { // Get implements the traits.Indexer interface method. func (l *concatList) Get(index ref.Val) ref.Val { - ind, err := indexOrError(index) + ind, err := IndexOrError(index) if err != nil { return ValOrErr(index, err.Error()) } @@ -408,6 +432,11 @@ func (l *concatList) Get(index ref.Val) ref.Val { return l.nextList.Get(offset) } +// IsZeroValue returns true if the list is empty. +func (l *concatList) IsZeroValue() bool { + return l.Size().(Int) == 0 +} + // Iterator implements the traits.Iterable interface method. func (l *concatList) Iterator() traits.Iterator { return newListIterator(l) @@ -418,15 +447,29 @@ func (l *concatList) Size() ref.Val { return l.prevList.Size().(Int).Add(l.nextList.Size()) } +// String converts the concatenated list to a human-readable string. +func (l *concatList) String() string { + var sb strings.Builder + sb.WriteString("[") + for i := Int(0); i < l.Size().(Int); i++ { + sb.WriteString(fmt.Sprintf("%v", l.Get(i))) + if i != l.Size().(Int)-1 { + sb.WriteString(", ") + } + } + sb.WriteString("]") + return sb.String() +} + // Type implements the ref.Val interface method. func (l *concatList) Type() ref.Type { return ListType } // Value implements the ref.Val interface method. -func (l *concatList) Value() interface{} { +func (l *concatList) Value() any { if l.value == nil { - merged := make([]interface{}, l.Size().(Int)) + merged := make([]any, l.Size().(Int)) prevLen := l.prevList.Size().(Int) for i := Int(0); i < prevLen; i++ { merged[i] = l.prevList.Get(i).Value() @@ -469,7 +512,8 @@ func (it *listIterator) Next() ref.Val { return nil } -func indexOrError(index ref.Val) (int, error) { +// IndexOrError converts an input index value into either a lossless integer index or an error. +func IndexOrError(index ref.Val) (int, error) { switch iv := index.(type) { case Int: return int(iv), nil diff --git a/tools/vendor/github.com/google/cel-go/common/types/map.go b/tools/vendor/github.com/google/cel-go/common/types/map.go index 586559402..213be4ac9 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/map.go +++ b/tools/vendor/github.com/google/cel-go/common/types/map.go @@ -17,20 +17,22 @@ package types import ( "fmt" "reflect" + "strings" - "github.com/google/cel-go/common/types/pb" - "github.com/google/cel-go/common/types/ref" - "github.com/google/cel-go/common/types/traits" "github.com/stoewer/go-strcase" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" + "github.com/google/cel-go/common/types/pb" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + anypb "google.golang.org/protobuf/types/known/anypb" structpb "google.golang.org/protobuf/types/known/structpb" ) // NewDynamicMap returns a traits.Mapper value with dynamic key, value pairs. -func NewDynamicMap(adapter ref.TypeAdapter, value interface{}) traits.Mapper { +func NewDynamicMap(adapter ref.TypeAdapter, value any) traits.Mapper { refValue := reflect.ValueOf(value) return &baseMap{ TypeAdapter: adapter, @@ -65,7 +67,7 @@ func NewRefValMap(adapter ref.TypeAdapter, value map[ref.Val]ref.Val) traits.Map } // NewStringInterfaceMap returns a specialized traits.Mapper with string keys and interface values. -func NewStringInterfaceMap(adapter ref.TypeAdapter, value map[string]interface{}) traits.Mapper { +func NewStringInterfaceMap(adapter ref.TypeAdapter, value map[string]any) traits.Mapper { return &baseMap{ TypeAdapter: adapter, mapAccessor: newStringIfaceMapAccessor(adapter, value), @@ -125,7 +127,7 @@ type baseMap struct { mapAccessor // value is the native Go value upon which the map type operators. - value interface{} + value any // size is the number of entries in the map. size int @@ -138,7 +140,7 @@ func (m *baseMap) Contains(index ref.Val) ref.Val { } // ConvertToNative implements the ref.Val interface method. -func (m *baseMap) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (m *baseMap) ConvertToNative(typeDesc reflect.Type) (any, error) { // If the map is already assignable to the desired type return it, e.g. interfaces and // maps with the same key value types. if reflect.TypeOf(m.value).AssignableTo(typeDesc) { @@ -275,18 +277,42 @@ func (m *baseMap) Get(key ref.Val) ref.Val { return v } +// IsZeroValue returns true if the map is empty. +func (m *baseMap) IsZeroValue() bool { + return m.size == 0 +} + // Size implements the traits.Sizer interface method. func (m *baseMap) Size() ref.Val { return Int(m.size) } +// String converts the map into a human-readable string. +func (m *baseMap) String() string { + var sb strings.Builder + sb.WriteString("{") + it := m.Iterator() + i := 0 + for it.HasNext() == True { + k := it.Next() + v, _ := m.Find(k) + sb.WriteString(fmt.Sprintf("%v: %v", k, v)) + if i != m.size-1 { + sb.WriteString(", ") + } + i++ + } + sb.WriteString("}") + return sb.String() +} + // Type implements the ref.Val interface method. func (m *baseMap) Type() ref.Type { return MapType } // Value implements the ref.Val interface method. -func (m *baseMap) Value() interface{} { +func (m *baseMap) Value() any { return m.value } @@ -498,7 +524,7 @@ func (a *stringMapAccessor) Iterator() traits.Iterator { } } -func newStringIfaceMapAccessor(adapter ref.TypeAdapter, mapVal map[string]interface{}) mapAccessor { +func newStringIfaceMapAccessor(adapter ref.TypeAdapter, mapVal map[string]any) mapAccessor { return &stringIfaceMapAccessor{ TypeAdapter: adapter, mapVal: mapVal, @@ -507,7 +533,7 @@ func newStringIfaceMapAccessor(adapter ref.TypeAdapter, mapVal map[string]interf type stringIfaceMapAccessor struct { ref.TypeAdapter - mapVal map[string]interface{} + mapVal map[string]any } // Find uses native map accesses to find the key, returning (value, true) if present. @@ -556,7 +582,7 @@ func (m *protoMap) Contains(key ref.Val) ref.Val { // ConvertToNative implements the ref.Val interface method. // // Note, assignment to Golang struct types is not yet supported. -func (m *protoMap) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (m *protoMap) ConvertToNative(typeDesc reflect.Type) (any, error) { // If the map is already assignable to the desired type return it, e.g. interfaces and // maps with the same key value types. switch typeDesc { @@ -601,9 +627,9 @@ func (m *protoMap) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { m.value.Range(func(key protoreflect.MapKey, val protoreflect.Value) bool { ntvKey := key.Interface() ntvVal := val.Interface() - switch ntvVal.(type) { + switch pv := ntvVal.(type) { case protoreflect.Message: - ntvVal = ntvVal.(protoreflect.Message).Interface() + ntvVal = pv.Interface() } if keyType == otherKeyType && valType == otherValType { mapVal.SetMapIndex(reflect.ValueOf(ntvKey), reflect.ValueOf(ntvVal)) @@ -732,6 +758,11 @@ func (m *protoMap) Get(key ref.Val) ref.Val { return v } +// IsZeroValue returns true if the map is empty. +func (m *protoMap) IsZeroValue() bool { + return m.value.Len() == 0 +} + // Iterator implements the traits.Iterable interface method. func (m *protoMap) Iterator() traits.Iterator { // Copy the keys to make their order stable. @@ -758,7 +789,7 @@ func (m *protoMap) Type() ref.Type { } // Value implements the ref.Val interface method. -func (m *protoMap) Value() interface{} { +func (m *protoMap) Value() any { return m.value } diff --git a/tools/vendor/github.com/google/cel-go/common/types/null.go b/tools/vendor/github.com/google/cel-go/common/types/null.go index 3d3503c27..38927a112 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/null.go +++ b/tools/vendor/github.com/google/cel-go/common/types/null.go @@ -18,9 +18,10 @@ import ( "fmt" "reflect" - "github.com/google/cel-go/common/types/ref" "google.golang.org/protobuf/proto" + "github.com/google/cel-go/common/types/ref" + anypb "google.golang.org/protobuf/types/known/anypb" structpb "google.golang.org/protobuf/types/known/structpb" ) @@ -34,14 +35,20 @@ var ( // NullValue singleton. NullValue = Null(structpb.NullValue_NULL_VALUE) - jsonNullType = reflect.TypeOf(structpb.NullValue_NULL_VALUE) + // golang reflect type for Null values. + nullReflectType = reflect.TypeOf(NullValue) ) // ConvertToNative implements ref.Val.ConvertToNative. -func (n Null) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (n Null) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Int32: - return reflect.ValueOf(n).Convert(typeDesc).Interface(), nil + switch typeDesc { + case jsonNullType: + return structpb.NullValue_NULL_VALUE, nil + case nullReflectType: + return n, nil + } case reflect.Ptr: switch typeDesc { case anyValueType: @@ -54,6 +61,10 @@ func (n Null) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { return anypb.New(pb.(proto.Message)) case jsonValueType: return structpb.NewNullValue(), nil + case boolWrapperType, byteWrapperType, doubleWrapperType, floatWrapperType, + int32WrapperType, int64WrapperType, stringWrapperType, uint32WrapperType, + uint64WrapperType: + return nil, nil } case reflect.Interface: nv := n.Value() @@ -86,12 +97,17 @@ func (n Null) Equal(other ref.Val) ref.Val { return Bool(NullType == other.Type()) } +// IsZeroValue returns true as null always represents an absent value. +func (n Null) IsZeroValue() bool { + return true +} + // Type implements ref.Val.Type. func (n Null) Type() ref.Type { return NullType } // Value implements ref.Val.Value. -func (n Null) Value() interface{} { +func (n Null) Value() any { return structpb.NullValue_NULL_VALUE } diff --git a/tools/vendor/github.com/google/cel-go/common/types/object.go b/tools/vendor/github.com/google/cel-go/common/types/object.go index 5faf85511..9955e2dce 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/object.go +++ b/tools/vendor/github.com/google/cel-go/common/types/object.go @@ -18,11 +18,12 @@ import ( "fmt" "reflect" - "github.com/google/cel-go/common/types/pb" - "github.com/google/cel-go/common/types/ref" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" + "github.com/google/cel-go/common/types/pb" + "github.com/google/cel-go/common/types/ref" + anypb "google.golang.org/protobuf/types/known/anypb" structpb "google.golang.org/protobuf/types/known/structpb" ) @@ -52,7 +53,7 @@ func NewObject(adapter ref.TypeAdapter, typeValue: typeValue} } -func (o *protoObj) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (o *protoObj) ConvertToNative(typeDesc reflect.Type) (any, error) { srcPB := o.value if reflect.TypeOf(srcPB).AssignableTo(typeDesc) { return srcPB, nil @@ -133,6 +134,11 @@ func (o *protoObj) IsSet(field ref.Val) ref.Val { return False } +// IsZeroValue returns true if the protobuf object is empty. +func (o *protoObj) IsZeroValue() bool { + return proto.Equal(o.value, o.typeDesc.Zero()) +} + func (o *protoObj) Get(index ref.Val) ref.Val { protoFieldName, ok := index.(String) if !ok { @@ -154,6 +160,6 @@ func (o *protoObj) Type() ref.Type { return o.typeValue } -func (o *protoObj) Value() interface{} { +func (o *protoObj) Value() any { return o.value } diff --git a/tools/vendor/github.com/google/cel-go/common/types/optional.go b/tools/vendor/github.com/google/cel-go/common/types/optional.go new file mode 100644 index 000000000..54cb35b1a --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/common/types/optional.go @@ -0,0 +1,108 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "errors" + "fmt" + "reflect" + + "github.com/google/cel-go/common/types/ref" +) + +var ( + // OptionalType indicates the runtime type of an optional value. + OptionalType = NewTypeValue("optional") + + // OptionalNone is a sentinel value which is used to indicate an empty optional value. + OptionalNone = &Optional{} +) + +// OptionalOf returns an optional value which wraps a concrete CEL value. +func OptionalOf(value ref.Val) *Optional { + return &Optional{value: value} +} + +// Optional value which points to a value if non-empty. +type Optional struct { + value ref.Val +} + +// HasValue returns true if the optional has a value. +func (o *Optional) HasValue() bool { + return o.value != nil +} + +// GetValue returns the wrapped value contained in the optional. +func (o *Optional) GetValue() ref.Val { + if !o.HasValue() { + return NewErr("optional.none() dereference") + } + return o.value +} + +// ConvertToNative implements the ref.Val interface method. +func (o *Optional) ConvertToNative(typeDesc reflect.Type) (any, error) { + if !o.HasValue() { + return nil, errors.New("optional.none() dereference") + } + return o.value.ConvertToNative(typeDesc) +} + +// ConvertToType implements the ref.Val interface method. +func (o *Optional) ConvertToType(typeVal ref.Type) ref.Val { + switch typeVal { + case OptionalType: + return o + case TypeType: + return OptionalType + } + return NewErr("type conversion error from '%s' to '%s'", OptionalType, typeVal) +} + +// Equal determines whether the values contained by two optional values are equal. +func (o *Optional) Equal(other ref.Val) ref.Val { + otherOpt, isOpt := other.(*Optional) + if !isOpt { + return False + } + if !o.HasValue() { + return Bool(!otherOpt.HasValue()) + } + if !otherOpt.HasValue() { + return False + } + return o.value.Equal(otherOpt.value) +} + +func (o *Optional) String() string { + if o.HasValue() { + return fmt.Sprintf("optional(%v)", o.GetValue()) + } + return "optional.none()" +} + +// Type implements the ref.Val interface method. +func (o *Optional) Type() ref.Type { + return OptionalType +} + +// Value returns the underlying 'Value()' of the wrapped value, if present. +func (o *Optional) Value() any { + if o.value == nil { + return nil + } + return o.value.Value() +} diff --git a/tools/vendor/github.com/google/cel-go/common/types/pb/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/types/pb/BUILD.bazel index f23ac9c0e..e2b9d37b5 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/pb/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/types/pb/BUILD.bazel @@ -17,7 +17,7 @@ go_library( ], importpath = "github.com/google/cel-go/common/types/pb", deps = [ - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//encoding/protowire:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", diff --git a/tools/vendor/github.com/google/cel-go/common/types/pb/enum.go b/tools/vendor/github.com/google/cel-go/common/types/pb/enum.go index 4a26b5c7c..09a154630 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/pb/enum.go +++ b/tools/vendor/github.com/google/cel-go/common/types/pb/enum.go @@ -18,9 +18,9 @@ import ( "google.golang.org/protobuf/reflect/protoreflect" ) -// NewEnumValueDescription produces an enum value description with the fully qualified enum value +// newEnumValueDescription produces an enum value description with the fully qualified enum value // name and the enum value descriptor. -func NewEnumValueDescription(name string, desc protoreflect.EnumValueDescriptor) *EnumValueDescription { +func newEnumValueDescription(name string, desc protoreflect.EnumValueDescriptor) *EnumValueDescription { return &EnumValueDescription{ enumValueName: name, desc: desc, diff --git a/tools/vendor/github.com/google/cel-go/common/types/pb/file.go b/tools/vendor/github.com/google/cel-go/common/types/pb/file.go index 0bcade75f..e323afb1d 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/pb/file.go +++ b/tools/vendor/github.com/google/cel-go/common/types/pb/file.go @@ -18,32 +18,66 @@ import ( "fmt" "google.golang.org/protobuf/reflect/protoreflect" + + dynamicpb "google.golang.org/protobuf/types/dynamicpb" ) -// NewFileDescription returns a FileDescription instance with a complete listing of all the message -// types and enum values declared within any scope in the file. -func NewFileDescription(fileDesc protoreflect.FileDescriptor, pbdb *Db) *FileDescription { +// newFileDescription returns a FileDescription instance with a complete listing of all the message +// types and enum values, as well as a map of extensions declared within any scope in the file. +func newFileDescription(fileDesc protoreflect.FileDescriptor, pbdb *Db) (*FileDescription, extensionMap) { metadata := collectFileMetadata(fileDesc) enums := make(map[string]*EnumValueDescription) for name, enumVal := range metadata.enumValues { - enums[name] = NewEnumValueDescription(name, enumVal) + enums[name] = newEnumValueDescription(name, enumVal) } types := make(map[string]*TypeDescription) for name, msgType := range metadata.msgTypes { - types[name] = NewTypeDescription(name, msgType) + types[name] = newTypeDescription(name, msgType, pbdb.extensions) + } + fileExtMap := make(extensionMap) + for typeName, extensions := range metadata.msgExtensionMap { + messageExtMap, found := fileExtMap[typeName] + if !found { + messageExtMap = make(map[string]*FieldDescription) + } + for _, ext := range extensions { + extDesc := dynamicpb.NewExtensionType(ext).TypeDescriptor() + messageExtMap[string(ext.FullName())] = newFieldDescription(extDesc) + } + fileExtMap[typeName] = messageExtMap } return &FileDescription{ + name: fileDesc.Path(), types: types, enums: enums, - } + }, fileExtMap } // FileDescription holds a map of all types and enum values declared within a proto file. type FileDescription struct { + name string types map[string]*TypeDescription enums map[string]*EnumValueDescription } +// Copy creates a copy of the FileDescription with updated Db references within its types. +func (fd *FileDescription) Copy(pbdb *Db) *FileDescription { + typesCopy := make(map[string]*TypeDescription, len(fd.types)) + for k, v := range fd.types { + typesCopy[k] = v.Copy(pbdb) + } + return &FileDescription{ + name: fd.name, + types: typesCopy, + enums: fd.enums, + } +} + +// GetName returns the fully qualified file path for the file. +func (fd *FileDescription) GetName() string { + return fd.name +} + // GetEnumDescription returns an EnumDescription for a qualified enum value // name declared within the .proto file. func (fd *FileDescription) GetEnumDescription(enumName string) (*EnumValueDescription, bool) { @@ -94,6 +128,10 @@ type fileMetadata struct { msgTypes map[string]protoreflect.MessageDescriptor // enumValues maps from fully-qualified enum value to enum value descriptor. enumValues map[string]protoreflect.EnumValueDescriptor + // msgExtensionMap maps from the protobuf message name being extended to a set of extensions + // for the type. + msgExtensionMap map[string][]protoreflect.ExtensionDescriptor + // TODO: support enum type definitions for use in future type-check enhancements. } @@ -102,28 +140,38 @@ type fileMetadata struct { func collectFileMetadata(fileDesc protoreflect.FileDescriptor) *fileMetadata { msgTypes := make(map[string]protoreflect.MessageDescriptor) enumValues := make(map[string]protoreflect.EnumValueDescriptor) - collectMsgTypes(fileDesc.Messages(), msgTypes, enumValues) + msgExtensionMap := make(map[string][]protoreflect.ExtensionDescriptor) + collectMsgTypes(fileDesc.Messages(), msgTypes, enumValues, msgExtensionMap) collectEnumValues(fileDesc.Enums(), enumValues) + collectExtensions(fileDesc.Extensions(), msgExtensionMap) return &fileMetadata{ - msgTypes: msgTypes, - enumValues: enumValues, + msgTypes: msgTypes, + enumValues: enumValues, + msgExtensionMap: msgExtensionMap, } } // collectMsgTypes recursively collects messages, nested messages, and nested enums into a map of // fully qualified protobuf names to descriptors. -func collectMsgTypes(msgTypes protoreflect.MessageDescriptors, msgTypeMap map[string]protoreflect.MessageDescriptor, enumValueMap map[string]protoreflect.EnumValueDescriptor) { +func collectMsgTypes(msgTypes protoreflect.MessageDescriptors, + msgTypeMap map[string]protoreflect.MessageDescriptor, + enumValueMap map[string]protoreflect.EnumValueDescriptor, + msgExtensionMap map[string][]protoreflect.ExtensionDescriptor) { for i := 0; i < msgTypes.Len(); i++ { msgType := msgTypes.Get(i) msgTypeMap[string(msgType.FullName())] = msgType nestedMsgTypes := msgType.Messages() if nestedMsgTypes.Len() != 0 { - collectMsgTypes(nestedMsgTypes, msgTypeMap, enumValueMap) + collectMsgTypes(nestedMsgTypes, msgTypeMap, enumValueMap, msgExtensionMap) } nestedEnumTypes := msgType.Enums() if nestedEnumTypes.Len() != 0 { collectEnumValues(nestedEnumTypes, enumValueMap) } + nestedExtensions := msgType.Extensions() + if nestedExtensions.Len() != 0 { + collectExtensions(nestedExtensions, msgExtensionMap) + } } } @@ -139,3 +187,16 @@ func collectEnumValues(enumTypes protoreflect.EnumDescriptors, enumValueMap map[ } } } + +func collectExtensions(extensions protoreflect.ExtensionDescriptors, msgExtensionMap map[string][]protoreflect.ExtensionDescriptor) { + for i := 0; i < extensions.Len(); i++ { + ext := extensions.Get(i) + extendsMsg := string(ext.ContainingMessage().FullName()) + msgExts, found := msgExtensionMap[extendsMsg] + if !found { + msgExts = []protoreflect.ExtensionDescriptor{} + } + msgExts = append(msgExts, ext) + msgExtensionMap[extendsMsg] = msgExts + } +} diff --git a/tools/vendor/github.com/google/cel-go/common/types/pb/pb.go b/tools/vendor/github.com/google/cel-go/common/types/pb/pb.go index 457b47cee..eadebcb04 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/pb/pb.go +++ b/tools/vendor/github.com/google/cel-go/common/types/pb/pb.go @@ -40,13 +40,19 @@ type Db struct { revFileDescriptorMap map[string]*FileDescription // files contains the deduped set of FileDescriptions whose types are contained in the pb.Db. files []*FileDescription + // extensions contains the mapping between a given type name, extension name and its FieldDescription + extensions map[string]map[string]*FieldDescription } +// extensionsMap is a type alias to a map[typeName]map[extensionName]*FieldDescription +type extensionMap = map[string]map[string]*FieldDescription + var ( // DefaultDb used at evaluation time or unless overridden at check time. DefaultDb = &Db{ revFileDescriptorMap: make(map[string]*FileDescription), files: []*FileDescription{}, + extensions: make(extensionMap), } ) @@ -80,6 +86,7 @@ func NewDb() *Db { pbdb := &Db{ revFileDescriptorMap: make(map[string]*FileDescription), files: []*FileDescription{}, + extensions: make(extensionMap), } // The FileDescription objects in the default db contain lazily initialized TypeDescription // values which may point to the state contained in the DefaultDb irrespective of this shallow @@ -96,19 +103,34 @@ func NewDb() *Db { // Copy creates a copy of the current database with its own internal descriptor mapping. func (pbdb *Db) Copy() *Db { copy := NewDb() - for k, v := range pbdb.revFileDescriptorMap { - copy.revFileDescriptorMap[k] = v - } - for _, f := range pbdb.files { + for _, fd := range pbdb.files { hasFile := false - for _, f2 := range copy.files { - if f2 == f { + for _, fd2 := range copy.files { + if fd2 == fd { hasFile = true } } if !hasFile { - copy.files = append(copy.files, f) + fd = fd.Copy(copy) + copy.files = append(copy.files, fd) + } + for _, enumValName := range fd.GetEnumNames() { + copy.revFileDescriptorMap[enumValName] = fd + } + for _, msgTypeName := range fd.GetTypeNames() { + copy.revFileDescriptorMap[msgTypeName] = fd + } + copy.revFileDescriptorMap[fd.GetName()] = fd + } + for typeName, extFieldMap := range pbdb.extensions { + copyExtFieldMap, found := copy.extensions[typeName] + if !found { + copyExtFieldMap = make(map[string]*FieldDescription, len(extFieldMap)) } + for extFieldName, fd := range extFieldMap { + copyExtFieldMap[extFieldName] = fd + } + copy.extensions[typeName] = copyExtFieldMap } return copy } @@ -137,17 +159,30 @@ func (pbdb *Db) RegisterDescriptor(fileDesc protoreflect.FileDescriptor) (*FileD if err == nil { fileDesc = globalFD } - fd = NewFileDescription(fileDesc, pbdb) + var fileExtMap extensionMap + fd, fileExtMap = newFileDescription(fileDesc, pbdb) for _, enumValName := range fd.GetEnumNames() { pbdb.revFileDescriptorMap[enumValName] = fd } for _, msgTypeName := range fd.GetTypeNames() { pbdb.revFileDescriptorMap[msgTypeName] = fd } - pbdb.revFileDescriptorMap[fileDesc.Path()] = fd + pbdb.revFileDescriptorMap[fd.GetName()] = fd // Return the specific file descriptor registered. pbdb.files = append(pbdb.files, fd) + + // Index the protobuf message extensions from the file into the pbdb + for typeName, extMap := range fileExtMap { + typeExtMap, found := pbdb.extensions[typeName] + if !found { + pbdb.extensions[typeName] = extMap + continue + } + for extName, field := range extMap { + typeExtMap[extName] = field + } + } return fd, nil } diff --git a/tools/vendor/github.com/google/cel-go/common/types/pb/type.go b/tools/vendor/github.com/google/cel-go/common/types/pb/type.go index 912076fa4..df9532156 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/pb/type.go +++ b/tools/vendor/github.com/google/cel-go/common/types/pb/type.go @@ -38,22 +38,23 @@ type description interface { Zero() proto.Message } -// NewTypeDescription produces a TypeDescription value for the fully-qualified proto type name +// newTypeDescription produces a TypeDescription value for the fully-qualified proto type name // with a given descriptor. -func NewTypeDescription(typeName string, desc protoreflect.MessageDescriptor) *TypeDescription { +func newTypeDescription(typeName string, desc protoreflect.MessageDescriptor, extensions extensionMap) *TypeDescription { msgType := dynamicpb.NewMessageType(desc) msgZero := dynamicpb.NewMessage(desc) fieldMap := map[string]*FieldDescription{} fields := desc.Fields() for i := 0; i < fields.Len(); i++ { f := fields.Get(i) - fieldMap[string(f.Name())] = NewFieldDescription(f) + fieldMap[string(f.Name())] = newFieldDescription(f) } return &TypeDescription{ typeName: typeName, desc: desc, msgType: msgType, fieldMap: fieldMap, + extensions: extensions, reflectType: reflectTypeOf(msgZero), zeroMsg: zeroValueOf(msgZero), } @@ -66,10 +67,24 @@ type TypeDescription struct { desc protoreflect.MessageDescriptor msgType protoreflect.MessageType fieldMap map[string]*FieldDescription + extensions extensionMap reflectType reflect.Type zeroMsg proto.Message } +// Copy copies the type description with updated references to the Db. +func (td *TypeDescription) Copy(pbdb *Db) *TypeDescription { + return &TypeDescription{ + typeName: td.typeName, + desc: td.desc, + msgType: td.msgType, + fieldMap: td.fieldMap, + extensions: pbdb.extensions, + reflectType: td.reflectType, + zeroMsg: td.zeroMsg, + } +} + // FieldMap returns a string field name to FieldDescription map. func (td *TypeDescription) FieldMap() map[string]*FieldDescription { return td.fieldMap @@ -78,16 +93,21 @@ func (td *TypeDescription) FieldMap() map[string]*FieldDescription { // FieldByName returns (FieldDescription, true) if the field name is declared within the type. func (td *TypeDescription) FieldByName(name string) (*FieldDescription, bool) { fd, found := td.fieldMap[name] + if found { + return fd, true + } + extFieldMap, found := td.extensions[td.typeName] if !found { return nil, false } - return fd, true + fd, found = extFieldMap[name] + return fd, found } // MaybeUnwrap accepts a proto message as input and unwraps it to a primitive CEL type if possible. // // This method returns the unwrapped value and 'true', else the original value and 'false'. -func (td *TypeDescription) MaybeUnwrap(msg proto.Message) (interface{}, bool, error) { +func (td *TypeDescription) MaybeUnwrap(msg proto.Message) (any, bool, error) { return unwrap(td, msg) } @@ -111,8 +131,8 @@ func (td *TypeDescription) Zero() proto.Message { return td.zeroMsg } -// NewFieldDescription creates a new field description from a protoreflect.FieldDescriptor. -func NewFieldDescription(fieldDesc protoreflect.FieldDescriptor) *FieldDescription { +// newFieldDescription creates a new field description from a protoreflect.FieldDescriptor. +func newFieldDescription(fieldDesc protoreflect.FieldDescriptor) *FieldDescription { var reflectType reflect.Type var zeroMsg proto.Message switch fieldDesc.Kind() { @@ -124,9 +144,17 @@ func NewFieldDescription(fieldDesc protoreflect.FieldDescriptor) *FieldDescripti default: reflectType = reflectTypeOf(fieldDesc.Default().Interface()) if fieldDesc.IsList() { - parentMsg := dynamicpb.NewMessage(fieldDesc.ContainingMessage()) - listField := parentMsg.NewField(fieldDesc).List() - elem := listField.NewElement().Interface() + var elemValue protoreflect.Value + if fieldDesc.IsExtension() { + et := dynamicpb.NewExtensionType(fieldDesc) + elemValue = et.New().List().NewElement() + } else { + parentMsgType := fieldDesc.ContainingMessage() + parentMsg := dynamicpb.NewMessage(parentMsgType) + listField := parentMsg.NewField(fieldDesc).List() + elemValue = listField.NewElement() + } + elem := elemValue.Interface() switch elemType := elem.(type) { case protoreflect.Message: elem = elemType.Interface() @@ -140,8 +168,8 @@ func NewFieldDescription(fieldDesc protoreflect.FieldDescriptor) *FieldDescripti } var keyType, valType *FieldDescription if fieldDesc.IsMap() { - keyType = NewFieldDescription(fieldDesc.MapKey()) - valType = NewFieldDescription(fieldDesc.MapValue()) + keyType = newFieldDescription(fieldDesc.MapKey()) + valType = newFieldDescription(fieldDesc.MapValue()) } return &FieldDescription{ desc: fieldDesc, @@ -195,7 +223,7 @@ func (fd *FieldDescription) Descriptor() protoreflect.FieldDescriptor { // // This function implements the FieldType.IsSet function contract which can be used to operate on // more than just protobuf field accesses; however, the target here must be a protobuf.Message. -func (fd *FieldDescription) IsSet(target interface{}) bool { +func (fd *FieldDescription) IsSet(target any) bool { switch v := target.(type) { case proto.Message: pbRef := v.ProtoReflect() @@ -219,14 +247,14 @@ func (fd *FieldDescription) IsSet(target interface{}) bool { // // This function implements the FieldType.GetFrom function contract which can be used to operate // on more than just protobuf field accesses; however, the target here must be a protobuf.Message. -func (fd *FieldDescription) GetFrom(target interface{}) (interface{}, error) { +func (fd *FieldDescription) GetFrom(target any) (any, error) { v, ok := target.(proto.Message) if !ok { return nil, fmt.Errorf("unsupported field selection target: (%T)%v", target, target) } pbRef := v.ProtoReflect() pbDesc := pbRef.Descriptor() - var fieldVal interface{} + var fieldVal any if pbDesc == fd.desc.ContainingMessage() { // When the target protobuf shares the same message descriptor instance as the field // descriptor, use the cached field descriptor value. @@ -289,7 +317,7 @@ func (fd *FieldDescription) IsList() bool { // // This function returns the unwrapped value and 'true' on success, or the original value // and 'false' otherwise. -func (fd *FieldDescription) MaybeUnwrapDynamic(msg protoreflect.Message) (interface{}, bool, error) { +func (fd *FieldDescription) MaybeUnwrapDynamic(msg protoreflect.Message) (any, bool, error) { return unwrapDynamic(fd, msg) } @@ -362,7 +390,7 @@ func checkedWrap(t *exprpb.Type) *exprpb.Type { // input message is a *dynamicpb.Message which obscures the typing information from Go. // // Returns the unwrapped value and 'true' if unwrapped, otherwise the input value and 'false'. -func unwrap(desc description, msg proto.Message) (interface{}, bool, error) { +func unwrap(desc description, msg proto.Message) (any, bool, error) { switch v := msg.(type) { case *anypb.Any: dynMsg, err := v.UnmarshalNew() @@ -418,7 +446,7 @@ func unwrap(desc description, msg proto.Message) (interface{}, bool, error) { // unwrapDynamic unwraps a reflected protobuf Message value. // // Returns the unwrapped value and 'true' if unwrapped, otherwise the input value and 'false'. -func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, bool, error) { +func unwrapDynamic(desc description, refMsg protoreflect.Message) (any, bool, error) { msg := refMsg.Interface() if !refMsg.IsValid() { msg = desc.Zero() @@ -508,7 +536,7 @@ func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, // reflectTypeOf intercepts the reflect.Type call to ensure that dynamicpb.Message types preserve // well-known protobuf reflected types expected by the CEL type system. -func reflectTypeOf(val interface{}) reflect.Type { +func reflectTypeOf(val any) reflect.Type { switch v := val.(type) { case proto.Message: return reflect.TypeOf(zeroValueOf(v)) diff --git a/tools/vendor/github.com/google/cel-go/common/types/provider.go b/tools/vendor/github.com/google/cel-go/common/types/provider.go index 02087d14e..e66951f5b 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/provider.go +++ b/tools/vendor/github.com/google/cel-go/common/types/provider.go @@ -19,11 +19,12 @@ import ( "reflect" "time" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + "github.com/google/cel-go/common/types/pb" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" anypb "google.golang.org/protobuf/types/known/anypb" @@ -195,7 +196,7 @@ func (p *protoTypeRegistry) RegisterType(types ...ref.Type) error { // providing support for custom proto-based types. // // This method should be the inverse of ref.Val.ConvertToNative. -func (p *protoTypeRegistry) NativeToValue(value interface{}) ref.Val { +func (p *protoTypeRegistry) NativeToValue(value any) ref.Val { if val, found := nativeToValue(p, value); found { return val } @@ -249,7 +250,7 @@ var ( ) // NativeToValue implements the ref.TypeAdapter interface. -func (a *defaultTypeAdapter) NativeToValue(value interface{}) ref.Val { +func (a *defaultTypeAdapter) NativeToValue(value any) ref.Val { if val, found := nativeToValue(a, value); found { return val } @@ -258,7 +259,7 @@ func (a *defaultTypeAdapter) NativeToValue(value interface{}) ref.Val { // nativeToValue returns the converted (ref.Val, true) of a conversion is found, // otherwise (nil, false) -func nativeToValue(a ref.TypeAdapter, value interface{}) (ref.Val, bool) { +func nativeToValue(a ref.TypeAdapter, value any) (ref.Val, bool) { switch v := value.(type) { case nil: return NullValue, true @@ -364,7 +365,7 @@ func nativeToValue(a ref.TypeAdapter, value interface{}) (ref.Val, bool) { // specializations for common map types. case map[string]string: return NewStringStringMap(a, v), true - case map[string]interface{}: + case map[string]any: return NewStringInterfaceMap(a, v), true case map[ref.Val]ref.Val: return NewRefValMap(a, v), true @@ -479,9 +480,12 @@ func msgSetField(target protoreflect.Message, field *pb.FieldDescription, val re if err != nil { return fieldTypeConversionError(field, err) } - switch v.(type) { + if v == nil { + return nil + } + switch pv := v.(type) { case proto.Message: - v = v.(proto.Message).ProtoReflect() + v = pv.ProtoReflect() } target.Set(field.Descriptor(), protoreflect.ValueOf(v)) return nil @@ -495,6 +499,9 @@ func msgSetListField(target protoreflect.List, listField *pb.FieldDescription, l if err != nil { return fieldTypeConversionError(listField, err) } + if elemVal == nil { + continue + } switch ev := elemVal.(type) { case proto.Message: elemVal = ev.ProtoReflect() @@ -519,9 +526,12 @@ func msgSetMapField(target protoreflect.Map, mapField *pb.FieldDescription, mapV if err != nil { return fieldTypeConversionError(mapField, err) } - switch v.(type) { + if v == nil { + continue + } + switch pv := v.(type) { case proto.Message: - v = v.(proto.Message).ProtoReflect() + v = pv.ProtoReflect() } target.Set(protoreflect.ValueOf(k).MapKey(), protoreflect.ValueOf(v)) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/ref/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/types/ref/BUILD.bazel index 1d0f46899..79330c332 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/ref/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/types/ref/BUILD.bazel @@ -13,7 +13,7 @@ go_library( ], importpath = "github.com/google/cel-go/common/types/ref", deps = [ - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", ], diff --git a/tools/vendor/github.com/google/cel-go/common/types/ref/provider.go b/tools/vendor/github.com/google/cel-go/common/types/ref/provider.go index 91a711fa7..7eabbb9ca 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/ref/provider.go +++ b/tools/vendor/github.com/google/cel-go/common/types/ref/provider.go @@ -39,8 +39,6 @@ type TypeProvider interface { // FieldFieldType returns the field type for a checked type value. Returns // false if the field could not be found. - // - // Used during type-checking only. FindFieldType(messageType string, fieldName string) (*FieldType, bool) // NewValue creates a new type value from a qualified name and map of field @@ -55,7 +53,7 @@ type TypeProvider interface { // TypeAdapter converts native Go values of varying type and complexity to equivalent CEL values. type TypeAdapter interface { // NativeToValue converts the input `value` to a CEL `ref.Val`. - NativeToValue(value interface{}) Val + NativeToValue(value any) Val } // TypeRegistry allows third-parties to add custom types to CEL. Not all `TypeProvider` @@ -97,7 +95,7 @@ type FieldType struct { } // FieldTester is used to test field presence on an input object. -type FieldTester func(target interface{}) bool +type FieldTester func(target any) bool // FieldGetter is used to get the field value from an input object, if set. -type FieldGetter func(target interface{}) (interface{}, error) +type FieldGetter func(target any) (any, error) diff --git a/tools/vendor/github.com/google/cel-go/common/types/ref/reference.go b/tools/vendor/github.com/google/cel-go/common/types/ref/reference.go index 3098580c9..e0d58145c 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/ref/reference.go +++ b/tools/vendor/github.com/google/cel-go/common/types/ref/reference.go @@ -37,9 +37,18 @@ type Type interface { type Val interface { // ConvertToNative converts the Value to a native Go struct according to the // reflected type description, or error if the conversion is not feasible. - ConvertToNative(typeDesc reflect.Type) (interface{}, error) + // + // The ConvertToNative method is intended to be used to support conversion between CEL types + // and native types during object creation expressions or by clients who need to adapt the, + // returned CEL value into an equivalent Go value instance. + // + // When implementing or using ConvertToNative, the following guidelines apply: + // - Use ConvertToNative when marshalling CEL evaluation results to native types. + // - Do not use ConvertToNative within CEL extension functions. + // - Document whether your implementation supports non-CEL field types, such as Go or Protobuf. + ConvertToNative(typeDesc reflect.Type) (any, error) - // ConvertToType supports type conversions between value types supported by the expression language. + // ConvertToType supports type conversions between CEL value types supported by the expression language. ConvertToType(typeValue Type) Val // Equal returns true if the `other` value has the same type and content as the implementing struct. @@ -50,5 +59,5 @@ type Val interface { // Value returns the raw value of the instance which may not be directly compatible with the expression // language types. - Value() interface{} + Value() any } diff --git a/tools/vendor/github.com/google/cel-go/common/types/string.go b/tools/vendor/github.com/google/cel-go/common/types/string.go index b6d665683..a65cc14e4 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/string.go +++ b/tools/vendor/github.com/google/cel-go/common/types/string.go @@ -72,7 +72,7 @@ func (s String) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (s String) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (s String) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.String: if reflect.TypeOf(s).AssignableTo(typeDesc) { @@ -154,6 +154,11 @@ func (s String) Equal(other ref.Val) ref.Val { return Bool(ok && s == otherString) } +// IsZeroValue returns true if the string is empty. +func (s String) IsZeroValue() bool { + return len(s) == 0 +} + // Match implements traits.Matcher.Match. func (s String) Match(pattern ref.Val) ref.Val { pat, ok := pattern.(String) @@ -189,7 +194,7 @@ func (s String) Type() ref.Type { } // Value implements ref.Val.Value. -func (s String) Value() interface{} { +func (s String) Value() any { return string(s) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/timestamp.go b/tools/vendor/github.com/google/cel-go/common/types/timestamp.go index 7513a1b21..c784f2e54 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/timestamp.go +++ b/tools/vendor/github.com/google/cel-go/common/types/timestamp.go @@ -89,7 +89,7 @@ func (t Timestamp) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (t Timestamp) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (t Timestamp) ConvertToNative(typeDesc reflect.Type) (any, error) { // If the timestamp is already assignable to the desired type return it. if reflect.TypeOf(t.Time).AssignableTo(typeDesc) { return t.Time, nil @@ -138,6 +138,11 @@ func (t Timestamp) Equal(other ref.Val) ref.Val { return Bool(ok && t.Time.Equal(otherTime.Time)) } +// IsZeroValue returns true if the timestamp is epoch 0. +func (t Timestamp) IsZeroValue() bool { + return t.IsZero() +} + // Receive implements traits.Receiver.Receive. func (t Timestamp) Receive(function string, overload string, args []ref.Val) ref.Val { switch len(args) { @@ -160,14 +165,14 @@ func (t Timestamp) Subtract(subtrahend ref.Val) ref.Val { dur := subtrahend.(Duration) val, err := subtractTimeDurationChecked(t.Time, dur.Duration) if err != nil { - return wrapErr(err) + return WrapErr(err) } return timestampOf(val) case TimestampType: t2 := subtrahend.(Timestamp).Time val, err := subtractTimeChecked(t.Time, t2) if err != nil { - return wrapErr(err) + return WrapErr(err) } return durationOf(val) } @@ -180,7 +185,7 @@ func (t Timestamp) Type() ref.Type { } // Value implements ref.Val.Value. -func (t Timestamp) Value() interface{} { +func (t Timestamp) Value() any { return t.Time } @@ -288,7 +293,7 @@ func timeZone(tz ref.Val, visitor timestampVisitor) timestampVisitor { if ind == -1 { loc, err := time.LoadLocation(val) if err != nil { - return wrapErr(err) + return WrapErr(err) } return visitor(t.In(loc)) } @@ -297,11 +302,11 @@ func timeZone(tz ref.Val, visitor timestampVisitor) timestampVisitor { // in the format ^(+|-)(0[0-9]|1[0-4]):[0-5][0-9]$. The numerical input is parsed in terms of hours and minutes. hr, err := strconv.Atoi(string(val[0:ind])) if err != nil { - return wrapErr(err) + return WrapErr(err) } min, err := strconv.Atoi(string(val[ind+1:])) if err != nil { - return wrapErr(err) + return WrapErr(err) } var offset int if string(val[0]) == "-" { diff --git a/tools/vendor/github.com/google/cel-go/common/types/traits/BUILD.bazel b/tools/vendor/github.com/google/cel-go/common/types/traits/BUILD.bazel index 86e54af61..b19eb8301 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/traits/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/common/types/traits/BUILD.bazel @@ -20,6 +20,7 @@ go_library( "receiver.go", "sizer.go", "traits.go", + "zeroer.go", ], importpath = "github.com/google/cel-go/common/types/traits", deps = [ diff --git a/tools/vendor/github.com/google/cel-go/interpreter/coster.go b/tools/vendor/github.com/google/cel-go/common/types/traits/zeroer.go similarity index 50% rename from tools/vendor/github.com/google/cel-go/interpreter/coster.go rename to tools/vendor/github.com/google/cel-go/common/types/traits/zeroer.go index ac573d574..0b7c830a2 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/coster.go +++ b/tools/vendor/github.com/google/cel-go/common/types/traits/zeroer.go @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,24 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package interpreter +package traits -import "math" - -// TODO: remove Coster. - -// Coster calculates the heuristic cost incurred during evaluation. -// Deprecated: Please migrate cel.EstimateCost, it supports length estimates for input data and cost estimates for -// extension functions. -type Coster interface { - Cost() (min, max int64) -} - -// estimateCost returns the heuristic cost interval for the program. -func estimateCost(i interface{}) (min, max int64) { - c, ok := i.(Coster) - if !ok { - return 0, math.MaxInt64 - } - return c.Cost() +// Zeroer interface for testing whether a CEL value is a zero value for its type. +type Zeroer interface { + // IsZeroValue indicates whether the object is the zero value for the type. + IsZeroValue() bool } diff --git a/tools/vendor/github.com/google/cel-go/common/types/type.go b/tools/vendor/github.com/google/cel-go/common/types/type.go index 21160974b..164a46050 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/type.go +++ b/tools/vendor/github.com/google/cel-go/common/types/type.go @@ -53,7 +53,7 @@ func NewObjectTypeValue(name string) *TypeValue { } // ConvertToNative implements ref.Val.ConvertToNative. -func (t *TypeValue) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (t *TypeValue) ConvertToNative(typeDesc reflect.Type) (any, error) { // TODO: replace the internal type representation with a proto-value. return nil, fmt.Errorf("type conversion not supported for 'type'") } @@ -97,6 +97,6 @@ func (t *TypeValue) TypeName() string { } // Value implements ref.Val.Value. -func (t *TypeValue) Value() interface{} { +func (t *TypeValue) Value() any { return t.name } diff --git a/tools/vendor/github.com/google/cel-go/common/types/uint.go b/tools/vendor/github.com/google/cel-go/common/types/uint.go index ca266e045..615c7ec52 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/uint.go +++ b/tools/vendor/github.com/google/cel-go/common/types/uint.go @@ -59,7 +59,7 @@ func (i Uint) Add(other ref.Val) ref.Val { } val, err := addUint64Checked(uint64(i), uint64(otherUint)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(val) } @@ -82,7 +82,7 @@ func (i Uint) Compare(other ref.Val) ref.Val { } // ConvertToNative implements ref.Val.ConvertToNative. -func (i Uint) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (i Uint) ConvertToNative(typeDesc reflect.Type) (any, error) { switch typeDesc.Kind() { case reflect.Uint, reflect.Uint32: v, err := uint64ToUint32Checked(uint64(i)) @@ -149,7 +149,7 @@ func (i Uint) ConvertToType(typeVal ref.Type) ref.Val { case IntType: v, err := uint64ToInt64Checked(uint64(i)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Int(v) case UintType: @@ -172,7 +172,7 @@ func (i Uint) Divide(other ref.Val) ref.Val { } div, err := divideUint64Checked(uint64(i), uint64(otherUint)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(div) } @@ -194,6 +194,11 @@ func (i Uint) Equal(other ref.Val) ref.Val { } } +// IsZeroValue returns true if the uint is zero. +func (i Uint) IsZeroValue() bool { + return i == 0 +} + // Modulo implements traits.Modder.Modulo. func (i Uint) Modulo(other ref.Val) ref.Val { otherUint, ok := other.(Uint) @@ -202,7 +207,7 @@ func (i Uint) Modulo(other ref.Val) ref.Val { } mod, err := moduloUint64Checked(uint64(i), uint64(otherUint)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(mod) } @@ -215,7 +220,7 @@ func (i Uint) Multiply(other ref.Val) ref.Val { } val, err := multiplyUint64Checked(uint64(i), uint64(otherUint)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(val) } @@ -228,7 +233,7 @@ func (i Uint) Subtract(subtrahend ref.Val) ref.Val { } val, err := subtractUint64Checked(uint64(i), uint64(subtraUint)) if err != nil { - return wrapErr(err) + return WrapErr(err) } return Uint(val) } @@ -239,7 +244,7 @@ func (i Uint) Type() ref.Type { } // Value implements ref.Val.Value. -func (i Uint) Value() interface{} { +func (i Uint) Value() any { return uint64(i) } diff --git a/tools/vendor/github.com/google/cel-go/common/types/unknown.go b/tools/vendor/github.com/google/cel-go/common/types/unknown.go index 95b47426f..bc411c15b 100644 --- a/tools/vendor/github.com/google/cel-go/common/types/unknown.go +++ b/tools/vendor/github.com/google/cel-go/common/types/unknown.go @@ -30,7 +30,7 @@ var ( ) // ConvertToNative implements ref.Val.ConvertToNative. -func (u Unknown) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { +func (u Unknown) ConvertToNative(typeDesc reflect.Type) (any, error) { return u.Value(), nil } @@ -50,7 +50,7 @@ func (u Unknown) Type() ref.Type { } // Value implements ref.Val.Value. -func (u Unknown) Value() interface{} { +func (u Unknown) Value() any { return []int64(u) } diff --git a/tools/vendor/github.com/google/cel-go/ext/BUILD.bazel b/tools/vendor/github.com/google/cel-go/ext/BUILD.bazel index 9c2520b40..4bcf8a283 100644 --- a/tools/vendor/github.com/google/cel-go/ext/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/ext/BUILD.bazel @@ -9,14 +9,30 @@ go_library( srcs = [ "encoders.go", "guards.go", + "math.go", + "native.go", + "protos.go", + "sets.go", "strings.go", ], importpath = "github.com/google/cel-go/ext", visibility = ["//visibility:public"], deps = [ "//cel:go_default_library", + "//checker/decls:go_default_library", + "//common:go_default_library", + "//common/overloads:go_default_library", "//common/types:go_default_library", + "//common/types/pb:go_default_library", "//common/types/ref:go_default_library", + "//common/types/traits:go_default_library", + "//interpreter:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", + "@org_golang_google_protobuf//types/known/structpb", + "@org_golang_x_text//language:go_default_library", + "@org_golang_x_text//message:go_default_library", ], ) @@ -25,6 +41,10 @@ go_test( size = "small", srcs = [ "encoders_test.go", + "math_test.go", + "native_test.go", + "protos_test.go", + "sets_test.go", "strings_test.go", ], embed = [ @@ -32,5 +52,17 @@ go_test( ], deps = [ "//cel:go_default_library", + "//checker:go_default_library", + "//common:go_default_library", + "//common/types:go_default_library", + "//common/types/ref:go_default_library", + "//common/types/traits:go_default_library", + "//test:go_default_library", + "//test/proto2pb:go_default_library", + "//test/proto3pb:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + "@org_golang_google_protobuf//types/known/wrapperspb:go_default_library", + "@org_golang_google_protobuf//encoding/protojson:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/ext/README.md b/tools/vendor/github.com/google/cel-go/ext/README.md index 5ddcc4151..ef0eb2ab7 100644 --- a/tools/vendor/github.com/google/cel-go/ext/README.md +++ b/tools/vendor/github.com/google/cel-go/ext/README.md @@ -3,6 +3,30 @@ CEL extensions are a related set of constants, functions, macros, or other features which may not be covered by the core CEL spec. +## Bindings + +Returns a cel.EnvOption to configure support for local variable bindings +in expressions. + +# Cel.Bind + +Binds a simple identifier to an initialization expression which may be used +in a subsequenct result expression. Bindings may also be nested within each +other. + + cel.bind(, , ) + +Examples: + + cel.bind(a, 'hello', + cel.bind(b, 'world', a + b + b + a)) // "helloworldworldhello" + + // Avoid a list allocation within the exists comprehension. + cel.bind(valid_values, [a, b, c], + [d, e, f].exists(elem, elem in valid_values)) + +Local bindings are not guaranteed to be evaluated before use. + ## Encoders Encoding utilies for marshalling data into standardized representations. @@ -31,6 +55,156 @@ Example: base64.encode(b'hello') // return 'aGVsbG8=' +## Math + +Math helper macros and functions. + +Note, all macros use the 'math' namespace; however, at the time of macro +expansion the namespace looks just like any other identifier. If you are +currently using a variable named 'math', the macro will likely work just as +intended; however, there is some chance for collision. + +### Math.Greatest + +Returns the greatest valued number present in the arguments to the macro. + +Greatest is a variable argument count macro which must take at least one +argument. Simple numeric and list literals are supported as valid argument +types; however, other literals will be flagged as errors during macro +expansion. If the argument expression does not resolve to a numeric or +list(numeric) type during type-checking, or during runtime then an error +will be produced. If a list argument is empty, this too will produce an +error. + + math.greatest(, ...) -> + +Examples: + + math.greatest(1) // 1 + math.greatest(1u, 2u) // 2u + math.greatest(-42.0, -21.5, -100.0) // -21.5 + math.greatest([-42.0, -21.5, -100.0]) // -21.5 + math.greatest(numbers) // numbers must be list(numeric) + + math.greatest() // parse error + math.greatest('string') // parse error + math.greatest(a, b) // check-time error if a or b is non-numeric + math.greatest(dyn('string')) // runtime error + +### Math.Least + +Returns the least valued number present in the arguments to the macro. + +Least is a variable argument count macro which must take at least one +argument. Simple numeric and list literals are supported as valid argument +types; however, other literals will be flagged as errors during macro +expansion. If the argument expression does not resolve to a numeric or +list(numeric) type during type-checking, or during runtime then an error +will be produced. If a list argument is empty, this too will produce an error. + + math.least(, ...) -> + +Examples: + + math.least(1) // 1 + math.least(1u, 2u) // 1u + math.least(-42.0, -21.5, -100.0) // -100.0 + math.least([-42.0, -21.5, -100.0]) // -100.0 + math.least(numbers) // numbers must be list(numeric) + + math.least() // parse error + math.least('string') // parse error + math.least(a, b) // check-time error if a or b is non-numeric + math.least(dyn('string')) // runtime error + +## Protos + +Protos configure extended macros and functions for proto manipulation. + +Note, all macros use the 'proto' namespace; however, at the time of macro +expansion the namespace looks just like any other identifier. If you are +currently using a variable named 'proto', the macro will likely work just as +you intend; however, there is some chance for collision. + +### Protos.GetExt + +Macro which generates a select expression that retrieves an extension field +from the input proto2 syntax message. If the field is not set, the default +value forthe extension field is returned according to safe-traversal semantics. + + proto.getExt(, ) -> + +Example: + + proto.getExt(msg, google.expr.proto2.test.int32_ext) // returns int value + +### Protos.HasExt + +Macro which generates a test-only select expression that determines whether +an extension field is set on a proto2 syntax message. + + proto.hasExt(, ) -> + +Example: + + proto.hasExt(msg, google.expr.proto2.test.int32_ext) // returns true || false + +## Sets + +Sets provides set relationship tests. + +There is no set type within CEL, and while one may be introduced in the +future, there are cases where a `list` type is known to behave like a set. +For such cases, this library provides some basic functionality for +determining set containment, equivalence, and intersection. + +### Sets.Contains + +Returns whether the first list argument contains all elements in the second +list argument. The list may contain elements of any type and standard CEL +equality is used to determine whether a value exists in both lists. If the +second list is empty, the result will always return true. + + sets.contains(list(T), list(T)) -> bool + +Examples: + + sets.contains([], []) // true + sets.contains([], [1]) // false + sets.contains([1, 2, 3, 4], [2, 3]) // true + sets.contains([1, 2.0, 3u], [1.0, 2u, 3]) // true + +### Sets.Equivalent + +Returns whether the first and second list are set equivalent. Lists are set +equivalent if for every item in the first list, there is an element in the +second which is equal. The lists may not be of the same size as they do not +guarantee the elements within them are unique, so size does not factor into +the computation. + + sets.equivalent(list(T), list(T)) -> bool + +Examples: + + sets.equivalent([], []) // true + sets.equivalent([1], [1, 1]) // true + sets.equivalent([1], [1u, 1.0]) // true + sets.equivalent([1, 2, 3], [3u, 2.0, 1]) // true + +### Sets.Intersects + +Returns whether the first list has at least one element whose value is equal +to an element in the second list. If either list is empty, the result will +be false. + + sets.intersects(list(T), list(T)) -> bool + +Examples: + + sets.intersects([1], []) // false + sets.intersects([1], [1, 2]) // true + sets.intersects([[1], [2, 3]], [[1, 2], [2, 3.0]]) // true + ## Strings Extended functions for string manipulation. As a general note, all indices are @@ -70,6 +244,23 @@ Examples: 'hello mellow'.indexOf('ello', 2) // returns 7 'hello mellow'.indexOf('ello', 20) // error +### Join + +Returns a new string where the elements of string list are concatenated. + +The function also accepts an optional separator which is placed between +elements in the resulting string. + + >.join() -> + >.join() -> + +Examples: + + ['hello', 'mellow'].join() // returns 'hellomellow' + ['hello', 'mellow'].join(' ') // returns 'hello mellow' + [].join() // returns '' + [].join('/') // returns '' + ### LastIndexOf Returns the integer index of the last occurrence of the search string. If the @@ -105,6 +296,20 @@ Examples: 'TacoCat'.lowerAscii() // returns 'tacocat' 'TacoCÆt Xii'.lowerAscii() // returns 'tacocÆt xii' +### Quote + +**Introduced in version 1** + +Takes the given string and makes it safe to print (without any formatting due to escape sequences). +If any invalid UTF-8 characters are encountered, they are replaced with \uFFFD. + + strings.quote() + +Examples: + + strings.quote('single-quote with "double quote"') // returns '"single-quote with \"double quote\""' + strings.quote("two escape sequences \a\n") // returns '"two escape sequences \\a\\n"' + ### Replace Returns a new string based on the target, which replaces the occurrences of a diff --git a/tools/vendor/github.com/google/cel-go/ext/bindings.go b/tools/vendor/github.com/google/cel-go/ext/bindings.go new file mode 100644 index 000000000..9cc3c3efe --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/ext/bindings.go @@ -0,0 +1,100 @@ +// 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +// Bindings returns a cel.EnvOption to configure support for local variable +// bindings in expressions. +// +// # Cel.Bind +// +// Binds a simple identifier to an initialization expression which may be used +// in a subsequenct result expression. Bindings may also be nested within each +// other. +// +// cel.bind(, , ) +// +// Examples: +// +// cel.bind(a, 'hello', +// cel.bind(b, 'world', a + b + b + a)) // "helloworldworldhello" +// +// // Avoid a list allocation within the exists comprehension. +// cel.bind(valid_values, [a, b, c], +// [d, e, f].exists(elem, elem in valid_values)) +// +// Local bindings are not guaranteed to be evaluated before use. +func Bindings() cel.EnvOption { + return cel.Lib(celBindings{}) +} + +const ( + celNamespace = "cel" + bindMacro = "bind" + unusedIterVar = "#unused" +) + +type celBindings struct{} + +func (celBindings) LibraryName() string { + return "cel.lib.ext.cel.bindings" +} + +func (celBindings) CompileOptions() []cel.EnvOption { + return []cel.EnvOption{ + cel.Macros( + // cel.bind(var, , ) + cel.NewReceiverMacro(bindMacro, 3, celBind), + ), + } +} + +func (celBindings) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +func celBind(meh cel.MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if !macroTargetMatchesNamespace(celNamespace, target) { + return nil, nil + } + varIdent := args[0] + varName := "" + switch varIdent.GetExprKind().(type) { + case *exprpb.Expr_IdentExpr: + varName = varIdent.GetIdentExpr().GetName() + default: + return nil, &common.Error{ + Message: "cel.bind() variable names must be simple identifers", + Location: meh.OffsetLocation(varIdent.GetId()), + } + } + varInit := args[1] + resultExpr := args[2] + return meh.Fold( + unusedIterVar, + meh.NewList(), + varName, + varInit, + meh.LiteralBool(false), + meh.Ident(varName), + resultExpr, + ), nil +} diff --git a/tools/vendor/github.com/google/cel-go/ext/encoders.go b/tools/vendor/github.com/google/cel-go/ext/encoders.go index 22e38c39f..d9f9cb515 100644 --- a/tools/vendor/github.com/google/cel-go/ext/encoders.go +++ b/tools/vendor/github.com/google/cel-go/ext/encoders.go @@ -26,34 +26,38 @@ import ( // Encoders returns a cel.EnvOption to configure extended functions for string, byte, and object // encodings. // -// Base64.Decode +// # Base64.Decode // // Decodes base64-encoded string to bytes. // // This function will return an error if the string input is not base64-encoded. // -// base64.decode() -> +// base64.decode() -> // // Examples: // -// base64.decode('aGVsbG8=') // return b'hello' -// base64.decode('aGVsbG8') // error +// base64.decode('aGVsbG8=') // return b'hello' +// base64.decode('aGVsbG8') // error // -// Base64.Encode +// # Base64.Encode // // Encodes bytes to a base64-encoded string. // -// base64.encode() -> +// base64.encode() -> // // Examples: // -// base64.encode(b'hello') // return b'aGVsbG8=' +// base64.encode(b'hello') // return b'aGVsbG8=' func Encoders() cel.EnvOption { return cel.Lib(encoderLib{}) } type encoderLib struct{} +func (encoderLib) LibraryName() string { + return "cel.lib.ext.encoders" +} + func (encoderLib) CompileOptions() []cel.EnvOption { return []cel.EnvOption{ cel.Function("base64.decode", diff --git a/tools/vendor/github.com/google/cel-go/ext/guards.go b/tools/vendor/github.com/google/cel-go/ext/guards.go index 0794f859b..4c7786a69 100644 --- a/tools/vendor/github.com/google/cel-go/ext/guards.go +++ b/tools/vendor/github.com/google/cel-go/ext/guards.go @@ -17,6 +17,7 @@ package ext import ( "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) // function invocation guards for common call signatures within extension functions. @@ -48,3 +49,15 @@ func listStringOrError(strs []string, err error) ref.Val { } return types.DefaultTypeAdapter.NativeToValue(strs) } + +func macroTargetMatchesNamespace(ns string, target *exprpb.Expr) bool { + switch target.GetExprKind().(type) { + case *exprpb.Expr_IdentExpr: + if target.GetIdentExpr().GetName() != ns { + return false + } + return true + default: + return false + } +} diff --git a/tools/vendor/github.com/google/cel-go/ext/math.go b/tools/vendor/github.com/google/cel-go/ext/math.go new file mode 100644 index 000000000..1c8ad585a --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/ext/math.go @@ -0,0 +1,388 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "fmt" + "strings" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +// Math returns a cel.EnvOption to configure namespaced math helper macros and +// functions. +// +// Note, all macros use the 'math' namespace; however, at the time of macro +// expansion the namespace looks just like any other identifier. If you are +// currently using a variable named 'math', the macro will likely work just as +// intended; however, there is some chance for collision. +// +// # Math.Greatest +// +// Returns the greatest valued number present in the arguments to the macro. +// +// Greatest is a variable argument count macro which must take at least one +// argument. Simple numeric and list literals are supported as valid argument +// types; however, other literals will be flagged as errors during macro +// expansion. If the argument expression does not resolve to a numeric or +// list(numeric) type during type-checking, or during runtime then an error +// will be produced. If a list argument is empty, this too will produce an +// error. +// +// math.greatest(, ...) -> +// +// Examples: +// +// math.greatest(1) // 1 +// math.greatest(1u, 2u) // 2u +// math.greatest(-42.0, -21.5, -100.0) // -21.5 +// math.greatest([-42.0, -21.5, -100.0]) // -21.5 +// math.greatest(numbers) // numbers must be list(numeric) +// +// math.greatest() // parse error +// math.greatest('string') // parse error +// math.greatest(a, b) // check-time error if a or b is non-numeric +// math.greatest(dyn('string')) // runtime error +// +// # Math.Least +// +// Returns the least valued number present in the arguments to the macro. +// +// Least is a variable argument count macro which must take at least one +// argument. Simple numeric and list literals are supported as valid argument +// types; however, other literals will be flagged as errors during macro +// expansion. If the argument expression does not resolve to a numeric or +// list(numeric) type during type-checking, or during runtime then an error +// will be produced. If a list argument is empty, this too will produce an +// error. +// +// math.least(, ...) -> +// +// Examples: +// +// math.least(1) // 1 +// math.least(1u, 2u) // 1u +// math.least(-42.0, -21.5, -100.0) // -100.0 +// math.least([-42.0, -21.5, -100.0]) // -100.0 +// math.least(numbers) // numbers must be list(numeric) +// +// math.least() // parse error +// math.least('string') // parse error +// math.least(a, b) // check-time error if a or b is non-numeric +// math.least(dyn('string')) // runtime error +func Math() cel.EnvOption { + return cel.Lib(mathLib{}) +} + +const ( + mathNamespace = "math" + leastMacro = "least" + greatestMacro = "greatest" + minFunc = "math.@min" + maxFunc = "math.@max" +) + +type mathLib struct{} + +// LibraryName implements the SingletonLibrary interface method. +func (mathLib) LibraryName() string { + return "cel.lib.ext.math" +} + +// CompileOptions implements the Library interface method. +func (mathLib) CompileOptions() []cel.EnvOption { + return []cel.EnvOption{ + cel.Macros( + // math.least(num, ...) + cel.NewReceiverVarArgMacro(leastMacro, mathLeast), + // math.greatest(num, ...) + cel.NewReceiverVarArgMacro(greatestMacro, mathGreatest), + ), + cel.Function(minFunc, + cel.Overload("math_@min_double", []*cel.Type{cel.DoubleType}, cel.DoubleType, + cel.UnaryBinding(identity)), + cel.Overload("math_@min_int", []*cel.Type{cel.IntType}, cel.IntType, + cel.UnaryBinding(identity)), + cel.Overload("math_@min_uint", []*cel.Type{cel.UintType}, cel.UintType, + cel.UnaryBinding(identity)), + cel.Overload("math_@min_double_double", []*cel.Type{cel.DoubleType, cel.DoubleType}, cel.DoubleType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_int_int", []*cel.Type{cel.IntType, cel.IntType}, cel.IntType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_uint_uint", []*cel.Type{cel.UintType, cel.UintType}, cel.UintType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_int_uint", []*cel.Type{cel.IntType, cel.UintType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_int_double", []*cel.Type{cel.IntType, cel.DoubleType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_double_int", []*cel.Type{cel.DoubleType, cel.IntType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_double_uint", []*cel.Type{cel.DoubleType, cel.UintType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_uint_int", []*cel.Type{cel.UintType, cel.IntType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_uint_double", []*cel.Type{cel.UintType, cel.DoubleType}, cel.DynType, + cel.BinaryBinding(minPair)), + cel.Overload("math_@min_list_double", []*cel.Type{cel.ListType(cel.DoubleType)}, cel.DoubleType, + cel.UnaryBinding(minList)), + cel.Overload("math_@min_list_int", []*cel.Type{cel.ListType(cel.IntType)}, cel.IntType, + cel.UnaryBinding(minList)), + cel.Overload("math_@min_list_uint", []*cel.Type{cel.ListType(cel.UintType)}, cel.UintType, + cel.UnaryBinding(minList)), + ), + cel.Function(maxFunc, + cel.Overload("math_@max_double", []*cel.Type{cel.DoubleType}, cel.DoubleType, + cel.UnaryBinding(identity)), + cel.Overload("math_@max_int", []*cel.Type{cel.IntType}, cel.IntType, + cel.UnaryBinding(identity)), + cel.Overload("math_@max_uint", []*cel.Type{cel.UintType}, cel.UintType, + cel.UnaryBinding(identity)), + cel.Overload("math_@max_double_double", []*cel.Type{cel.DoubleType, cel.DoubleType}, cel.DoubleType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_int_int", []*cel.Type{cel.IntType, cel.IntType}, cel.IntType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_uint_uint", []*cel.Type{cel.UintType, cel.UintType}, cel.UintType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_int_uint", []*cel.Type{cel.IntType, cel.UintType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_int_double", []*cel.Type{cel.IntType, cel.DoubleType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_double_int", []*cel.Type{cel.DoubleType, cel.IntType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_double_uint", []*cel.Type{cel.DoubleType, cel.UintType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_uint_int", []*cel.Type{cel.UintType, cel.IntType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_uint_double", []*cel.Type{cel.UintType, cel.DoubleType}, cel.DynType, + cel.BinaryBinding(maxPair)), + cel.Overload("math_@max_list_double", []*cel.Type{cel.ListType(cel.DoubleType)}, cel.DoubleType, + cel.UnaryBinding(maxList)), + cel.Overload("math_@max_list_int", []*cel.Type{cel.ListType(cel.IntType)}, cel.IntType, + cel.UnaryBinding(maxList)), + cel.Overload("math_@max_list_uint", []*cel.Type{cel.ListType(cel.UintType)}, cel.UintType, + cel.UnaryBinding(maxList)), + ), + } +} + +// ProgramOptions implements the Library interface method. +func (mathLib) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +func mathLeast(meh cel.MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if !macroTargetMatchesNamespace(mathNamespace, target) { + return nil, nil + } + switch len(args) { + case 0: + return nil, &common.Error{ + Message: "math.least() requires at least one argument", + Location: meh.OffsetLocation(target.GetId()), + } + case 1: + if isListLiteralWithValidArgs(args[0]) || isValidArgType(args[0]) { + return meh.GlobalCall(minFunc, args[0]), nil + } + return nil, &common.Error{ + Message: "math.least() invalid single argument value", + Location: meh.OffsetLocation(args[0].GetId()), + } + case 2: + err := checkInvalidArgs(meh, "math.least()", args) + if err != nil { + return nil, err + } + return meh.GlobalCall(minFunc, args...), nil + default: + err := checkInvalidArgs(meh, "math.least()", args) + if err != nil { + return nil, err + } + return meh.GlobalCall(minFunc, meh.NewList(args...)), nil + } +} + +func mathGreatest(meh cel.MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if !macroTargetMatchesNamespace(mathNamespace, target) { + return nil, nil + } + switch len(args) { + case 0: + return nil, &common.Error{ + Message: "math.greatest() requires at least one argument", + Location: meh.OffsetLocation(target.GetId()), + } + case 1: + if isListLiteralWithValidArgs(args[0]) || isValidArgType(args[0]) { + return meh.GlobalCall(maxFunc, args[0]), nil + } + return nil, &common.Error{ + Message: "math.greatest() invalid single argument value", + Location: meh.OffsetLocation(args[0].GetId()), + } + case 2: + err := checkInvalidArgs(meh, "math.greatest()", args) + if err != nil { + return nil, err + } + return meh.GlobalCall(maxFunc, args...), nil + default: + err := checkInvalidArgs(meh, "math.greatest()", args) + if err != nil { + return nil, err + } + return meh.GlobalCall(maxFunc, meh.NewList(args...)), nil + } +} + +func identity(val ref.Val) ref.Val { + return val +} + +func minPair(first, second ref.Val) ref.Val { + cmp, ok := first.(traits.Comparer) + if !ok { + return types.MaybeNoSuchOverloadErr(first) + } + out := cmp.Compare(second) + if types.IsUnknownOrError(out) { + return maybeSuffixError(out, "math.@min") + } + if out == types.IntOne { + return second + } + return first +} + +func minList(numList ref.Val) ref.Val { + l := numList.(traits.Lister) + size := l.Size().(types.Int) + if size == types.IntZero { + return types.NewErr("math.@min(list) argument must not be empty") + } + min := l.Get(types.IntZero) + for i := types.IntOne; i < size; i++ { + min = minPair(min, l.Get(i)) + } + switch min.Type() { + case types.IntType, types.DoubleType, types.UintType, types.UnknownType: + return min + default: + return types.NewErr("no such overload: math.@min") + } +} + +func maxPair(first, second ref.Val) ref.Val { + cmp, ok := first.(traits.Comparer) + if !ok { + return types.MaybeNoSuchOverloadErr(first) + } + out := cmp.Compare(second) + if types.IsUnknownOrError(out) { + return maybeSuffixError(out, "math.@max") + } + if out == types.IntNegOne { + return second + } + return first +} + +func maxList(numList ref.Val) ref.Val { + l := numList.(traits.Lister) + size := l.Size().(types.Int) + if size == types.IntZero { + return types.NewErr("math.@max(list) argument must not be empty") + } + max := l.Get(types.IntZero) + for i := types.IntOne; i < size; i++ { + max = maxPair(max, l.Get(i)) + } + switch max.Type() { + case types.IntType, types.DoubleType, types.UintType, types.UnknownType: + return max + default: + return types.NewErr("no such overload: math.@max") + } +} + +func checkInvalidArgs(meh cel.MacroExprHelper, funcName string, args []*exprpb.Expr) *common.Error { + for _, arg := range args { + err := checkInvalidArgLiteral(funcName, arg) + if err != nil { + return &common.Error{ + Message: err.Error(), + Location: meh.OffsetLocation(arg.GetId()), + } + } + } + return nil +} + +func checkInvalidArgLiteral(funcName string, arg *exprpb.Expr) error { + if !isValidArgType(arg) { + return fmt.Errorf("%s simple literal arguments must be numeric", funcName) + } + return nil +} + +func isValidArgType(arg *exprpb.Expr) bool { + switch arg.GetExprKind().(type) { + case *exprpb.Expr_ConstExpr: + c := arg.GetConstExpr() + switch c.GetConstantKind().(type) { + case *exprpb.Constant_DoubleValue, *exprpb.Constant_Int64Value, *exprpb.Constant_Uint64Value: + return true + default: + return false + } + case *exprpb.Expr_ListExpr, *exprpb.Expr_StructExpr: + return false + default: + return true + } +} + +func isListLiteralWithValidArgs(arg *exprpb.Expr) bool { + switch arg.GetExprKind().(type) { + case *exprpb.Expr_ListExpr: + list := arg.GetListExpr() + if len(list.GetElements()) == 0 { + return false + } + for _, e := range list.GetElements() { + if !isValidArgType(e) { + return false + } + } + return true + } + return false +} + +func maybeSuffixError(val ref.Val, suffix string) ref.Val { + if types.IsError(val) { + msg := val.(*types.Err).String() + if !strings.Contains(msg, suffix) { + return types.NewErr("%s: %s", msg, suffix) + } + } + return val +} diff --git a/tools/vendor/github.com/google/cel-go/ext/native.go b/tools/vendor/github.com/google/cel-go/ext/native.go new file mode 100644 index 000000000..acbc44b6d --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/ext/native.go @@ -0,0 +1,574 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "fmt" + "reflect" + "strings" + "time" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/checker/decls" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/pb" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" + structpb "google.golang.org/protobuf/types/known/structpb" +) + +var ( + nativeObjTraitMask = traits.FieldTesterType | traits.IndexerType + jsonValueType = reflect.TypeOf(&structpb.Value{}) + jsonStructType = reflect.TypeOf(&structpb.Struct{}) +) + +// NativeTypes creates a type provider which uses reflect.Type and reflect.Value instances +// to produce type definitions that can be used within CEL. +// +// All struct types in Go are exposed to CEL via their simple package name and struct type name: +// +// ```go +// package identity +// +// type Account struct { +// ID int +// } +// +// ``` +// +// The type `identity.Account` would be exported to CEL using the same qualified name, e.g. +// `identity.Account{ID: 1234}` would create a new `Account` instance with the `ID` field +// populated. +// +// Only exported fields are exposed via NativeTypes, and the type-mapping between Go and CEL +// is as follows: +// +// | Go type | CEL type | +// |-------------------------------------|-----------| +// | bool | bool | +// | []byte | bytes | +// | float32, float64 | double | +// | int, int8, int16, int32, int64 | int | +// | string | string | +// | uint, uint8, uint16, uint32, uint64 | uint | +// | time.Duration | duration | +// | time.Time | timestamp | +// | array, slice | list | +// | map | map | +// +// Please note, if you intend to configure support for proto messages in addition to native +// types, you will need to provide the protobuf types before the golang native types. The +// same advice holds if you are using custom type adapters and type providers. The native type +// provider composes over whichever type adapter and provider is configured in the cel.Env at +// the time that it is invoked. +func NativeTypes(refTypes ...any) cel.EnvOption { + return func(env *cel.Env) (*cel.Env, error) { + tp, err := newNativeTypeProvider(env.TypeAdapter(), env.TypeProvider(), refTypes...) + if err != nil { + return nil, err + } + env, err = cel.CustomTypeAdapter(tp)(env) + if err != nil { + return nil, err + } + return cel.CustomTypeProvider(tp)(env) + } +} + +func newNativeTypeProvider(adapter ref.TypeAdapter, provider ref.TypeProvider, refTypes ...any) (*nativeTypeProvider, error) { + nativeTypes := make(map[string]*nativeType, len(refTypes)) + for _, refType := range refTypes { + switch rt := refType.(type) { + case reflect.Type: + t, err := newNativeType(rt) + if err != nil { + return nil, err + } + nativeTypes[t.TypeName()] = t + case reflect.Value: + t, err := newNativeType(rt.Type()) + if err != nil { + return nil, err + } + nativeTypes[t.TypeName()] = t + default: + return nil, fmt.Errorf("unsupported native type: %v (%T) must be reflect.Type or reflect.Value", rt, rt) + } + } + return &nativeTypeProvider{ + nativeTypes: nativeTypes, + baseAdapter: adapter, + baseProvider: provider, + }, nil +} + +type nativeTypeProvider struct { + nativeTypes map[string]*nativeType + baseAdapter ref.TypeAdapter + baseProvider ref.TypeProvider +} + +// EnumValue proxies to the ref.TypeProvider configured at the times the NativeTypes +// option was configured. +func (tp *nativeTypeProvider) EnumValue(enumName string) ref.Val { + return tp.baseProvider.EnumValue(enumName) +} + +// FindIdent looks up natives type instances by qualified identifier, and if not found +// proxies to the composed ref.TypeProvider. +func (tp *nativeTypeProvider) FindIdent(typeName string) (ref.Val, bool) { + if t, found := tp.nativeTypes[typeName]; found { + return t, true + } + return tp.baseProvider.FindIdent(typeName) +} + +// FindType looks up CEL type-checker type definition by qualified identifier, and if not found +// proxies to the composed ref.TypeProvider. +func (tp *nativeTypeProvider) FindType(typeName string) (*exprpb.Type, bool) { + if _, found := tp.nativeTypes[typeName]; found { + return decls.NewTypeType(decls.NewObjectType(typeName)), true + } + return tp.baseProvider.FindType(typeName) +} + +// FindFieldType looks up a native type's field definition, and if the type name is not a native +// type then proxies to the composed ref.TypeProvider +func (tp *nativeTypeProvider) FindFieldType(typeName, fieldName string) (*ref.FieldType, bool) { + t, found := tp.nativeTypes[typeName] + if !found { + return tp.baseProvider.FindFieldType(typeName, fieldName) + } + refField, isDefined := t.hasField(fieldName) + if !found || !isDefined { + return nil, false + } + exprType, ok := convertToExprType(refField.Type) + if !ok { + return nil, false + } + return &ref.FieldType{ + Type: exprType, + IsSet: func(obj any) bool { + refVal := reflect.Indirect(reflect.ValueOf(obj)) + refField := refVal.FieldByName(fieldName) + return !refField.IsZero() + }, + GetFrom: func(obj any) (any, error) { + refVal := reflect.Indirect(reflect.ValueOf(obj)) + refField := refVal.FieldByName(fieldName) + return getFieldValue(tp, refField), nil + }, + }, true +} + +// NewValue implements the ref.TypeProvider interface method. +func (tp *nativeTypeProvider) NewValue(typeName string, fields map[string]ref.Val) ref.Val { + t, found := tp.nativeTypes[typeName] + if !found { + return tp.baseProvider.NewValue(typeName, fields) + } + refPtr := reflect.New(t.refType) + refVal := refPtr.Elem() + for fieldName, val := range fields { + refFieldDef, isDefined := t.hasField(fieldName) + if !isDefined { + return types.NewErr("no such field: %s", fieldName) + } + fieldVal, err := val.ConvertToNative(refFieldDef.Type) + if err != nil { + return types.NewErr(err.Error()) + } + refField := refVal.FieldByIndex(refFieldDef.Index) + refFieldVal := reflect.ValueOf(fieldVal) + refField.Set(refFieldVal) + } + return tp.NativeToValue(refPtr.Interface()) +} + +// NewValue adapts native values to CEL values and will proxy to the composed type adapter +// for non-native types. +func (tp *nativeTypeProvider) NativeToValue(val any) ref.Val { + if val == nil { + return types.NullValue + } + if v, ok := val.(ref.Val); ok { + return v + } + rawVal := reflect.ValueOf(val) + refVal := rawVal + if refVal.Kind() == reflect.Ptr { + refVal = reflect.Indirect(refVal) + } + // This isn't quite right if you're also supporting proto, + // but maybe an acceptable limitation. + switch refVal.Kind() { + case reflect.Array, reflect.Slice: + switch val := val.(type) { + case []byte: + return tp.baseAdapter.NativeToValue(val) + default: + return types.NewDynamicList(tp, val) + } + case reflect.Map: + return types.NewDynamicMap(tp, val) + case reflect.Struct: + switch val := val.(type) { + case proto.Message, *pb.Map, protoreflect.List, protoreflect.Message, protoreflect.Value, + time.Time: + return tp.baseAdapter.NativeToValue(val) + default: + return newNativeObject(tp, val, rawVal) + } + default: + return tp.baseAdapter.NativeToValue(val) + } +} + +// convertToExprType converts the Golang reflect.Type to a protobuf exprpb.Type. +func convertToExprType(refType reflect.Type) (*exprpb.Type, bool) { + switch refType.Kind() { + case reflect.Bool: + return decls.Bool, true + case reflect.Float32, reflect.Float64: + return decls.Double, true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if refType == durationType { + return decls.Duration, true + } + return decls.Int, true + case reflect.String: + return decls.String, true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return decls.Uint, true + case reflect.Array, reflect.Slice: + refElem := refType.Elem() + if refElem == reflect.TypeOf(byte(0)) { + return decls.Bytes, true + } + elemType, ok := convertToExprType(refElem) + if !ok { + return nil, false + } + return decls.NewListType(elemType), true + case reflect.Map: + keyType, ok := convertToExprType(refType.Key()) + if !ok { + return nil, false + } + // Ensure the key type is a int, bool, uint, string + elemType, ok := convertToExprType(refType.Elem()) + if !ok { + return nil, false + } + return decls.NewMapType(keyType, elemType), true + case reflect.Struct: + if refType == timestampType { + return decls.Timestamp, true + } + return decls.NewObjectType( + fmt.Sprintf("%s.%s", simplePkgAlias(refType.PkgPath()), refType.Name()), + ), true + case reflect.Pointer: + if refType.Implements(pbMsgInterfaceType) { + pbMsg := reflect.New(refType.Elem()).Interface().(protoreflect.ProtoMessage) + return decls.NewObjectType(string(pbMsg.ProtoReflect().Descriptor().FullName())), true + } + return convertToExprType(refType.Elem()) + } + return nil, false +} + +func newNativeObject(adapter ref.TypeAdapter, val any, refValue reflect.Value) ref.Val { + valType, err := newNativeType(refValue.Type()) + if err != nil { + return types.NewErr(err.Error()) + } + return &nativeObj{ + TypeAdapter: adapter, + val: val, + valType: valType, + refValue: refValue, + } +} + +type nativeObj struct { + ref.TypeAdapter + val any + valType *nativeType + refValue reflect.Value +} + +// ConvertToNative implements the ref.Val interface method. +// +// CEL does not have a notion of pointers, so whether a field is a pointer or value +// is handled as part of this conversion step. +func (o *nativeObj) ConvertToNative(typeDesc reflect.Type) (any, error) { + if o.refValue.Type() == typeDesc { + return o.val, nil + } + if o.refValue.Kind() == reflect.Pointer && o.refValue.Type().Elem() == typeDesc { + return o.refValue.Elem().Interface(), nil + } + if typeDesc.Kind() == reflect.Pointer && o.refValue.Type() == typeDesc.Elem() { + ptr := reflect.New(typeDesc.Elem()) + ptr.Elem().Set(o.refValue) + return ptr.Interface(), nil + } + switch typeDesc { + case jsonValueType: + jsonStruct, err := o.ConvertToNative(jsonStructType) + if err != nil { + return nil, err + } + return structpb.NewStructValue(jsonStruct.(*structpb.Struct)), nil + case jsonStructType: + refVal := reflect.Indirect(o.refValue) + refType := refVal.Type() + fields := make(map[string]*structpb.Value, refVal.NumField()) + for i := 0; i < refVal.NumField(); i++ { + fieldType := refType.Field(i) + fieldValue := refVal.Field(i) + if !fieldValue.IsValid() || fieldValue.IsZero() { + continue + } + fieldCELVal := o.NativeToValue(fieldValue.Interface()) + fieldJSONVal, err := fieldCELVal.ConvertToNative(jsonValueType) + if err != nil { + return nil, err + } + fields[fieldType.Name] = fieldJSONVal.(*structpb.Value) + } + return &structpb.Struct{Fields: fields}, nil + } + return nil, fmt.Errorf("type conversion error from '%v' to '%v'", o.Type(), typeDesc) +} + +// ConvertToType implements the ref.Val interface method. +func (o *nativeObj) ConvertToType(typeVal ref.Type) ref.Val { + switch typeVal { + case types.TypeType: + return o.valType + default: + if typeVal.TypeName() == o.valType.typeName { + return o + } + } + return types.NewErr("type conversion error from '%s' to '%s'", o.Type(), typeVal) +} + +// Equal implements the ref.Val interface method. +// +// Note, that in Golang a pointer to a value is not equal to the value it contains. +// In CEL pointers and values to which they point are equal. +func (o *nativeObj) Equal(other ref.Val) ref.Val { + otherNtv, ok := other.(*nativeObj) + if !ok { + return types.False + } + val := o.val + otherVal := otherNtv.val + refVal := o.refValue + otherRefVal := otherNtv.refValue + if refVal.Kind() != otherRefVal.Kind() { + if refVal.Kind() == reflect.Pointer { + val = refVal.Elem().Interface() + } else if otherRefVal.Kind() == reflect.Pointer { + otherVal = otherRefVal.Elem().Interface() + } + } + return types.Bool(reflect.DeepEqual(val, otherVal)) +} + +// IsZeroValue indicates whether the contained Golang value is a zero value. +// +// Golang largely follows proto3 semantics for zero values. +func (o *nativeObj) IsZeroValue() bool { + return reflect.Indirect(o.refValue).IsZero() +} + +// IsSet tests whether a field which is defined is set to a non-default value. +func (o *nativeObj) IsSet(field ref.Val) ref.Val { + refField, refErr := o.getReflectedField(field) + if refErr != nil { + return refErr + } + return types.Bool(!refField.IsZero()) +} + +// Get returns the value fo a field name. +func (o *nativeObj) Get(field ref.Val) ref.Val { + refField, refErr := o.getReflectedField(field) + if refErr != nil { + return refErr + } + return adaptFieldValue(o, refField) +} + +func (o *nativeObj) getReflectedField(field ref.Val) (reflect.Value, ref.Val) { + fieldName, ok := field.(types.String) + if !ok { + return reflect.Value{}, types.MaybeNoSuchOverloadErr(field) + } + fieldNameStr := string(fieldName) + refField, isDefined := o.valType.hasField(fieldNameStr) + if !isDefined { + return reflect.Value{}, types.NewErr("no such field: %s", fieldName) + } + refVal := reflect.Indirect(o.refValue) + return refVal.FieldByIndex(refField.Index), nil +} + +// Type implements the ref.Val interface method. +func (o *nativeObj) Type() ref.Type { + return o.valType +} + +// Value implements the ref.Val interface method. +func (o *nativeObj) Value() any { + return o.val +} + +func newNativeType(rawType reflect.Type) (*nativeType, error) { + refType := rawType + if refType.Kind() == reflect.Pointer { + refType = refType.Elem() + } + if !isValidObjectType(refType) { + return nil, fmt.Errorf("unsupported reflect.Type %v, must be reflect.Struct", rawType) + } + return &nativeType{ + typeName: fmt.Sprintf("%s.%s", simplePkgAlias(refType.PkgPath()), refType.Name()), + refType: refType, + }, nil +} + +type nativeType struct { + typeName string + refType reflect.Type +} + +// ConvertToNative implements ref.Val.ConvertToNative. +func (t *nativeType) ConvertToNative(typeDesc reflect.Type) (any, error) { + return nil, fmt.Errorf("type conversion error for type to '%v'", typeDesc) +} + +// ConvertToType implements ref.Val.ConvertToType. +func (t *nativeType) ConvertToType(typeVal ref.Type) ref.Val { + switch typeVal { + case types.TypeType: + return types.TypeType + } + return types.NewErr("type conversion error from '%s' to '%s'", types.TypeType, typeVal) +} + +// Equal returns true of both type names are equal to each other. +func (t *nativeType) Equal(other ref.Val) ref.Val { + otherType, ok := other.(ref.Type) + return types.Bool(ok && t.TypeName() == otherType.TypeName()) +} + +// HasTrait implements the ref.Type interface method. +func (t *nativeType) HasTrait(trait int) bool { + return nativeObjTraitMask&trait == trait +} + +// String implements the strings.Stringer interface method. +func (t *nativeType) String() string { + return t.typeName +} + +// Type implements the ref.Val interface method. +func (t *nativeType) Type() ref.Type { + return types.TypeType +} + +// TypeName implements the ref.Type interface method. +func (t *nativeType) TypeName() string { + return t.typeName +} + +// Value implements the ref.Val interface method. +func (t *nativeType) Value() any { + return t.typeName +} + +// hasField returns whether a field name has a corresponding Golang reflect.StructField +func (t *nativeType) hasField(fieldName string) (reflect.StructField, bool) { + f, found := t.refType.FieldByName(fieldName) + if !found || !f.IsExported() || !isSupportedType(f.Type) { + return reflect.StructField{}, false + } + return f, true +} + +func adaptFieldValue(adapter ref.TypeAdapter, refField reflect.Value) ref.Val { + return adapter.NativeToValue(getFieldValue(adapter, refField)) +} + +func getFieldValue(adapter ref.TypeAdapter, refField reflect.Value) any { + if refField.IsZero() { + switch refField.Kind() { + case reflect.Array, reflect.Slice: + return types.NewDynamicList(adapter, []ref.Val{}) + case reflect.Map: + return types.NewDynamicMap(adapter, map[ref.Val]ref.Val{}) + case reflect.Struct: + if refField.Type() == timestampType { + return types.Timestamp{Time: time.Unix(0, 0)} + } + return reflect.New(refField.Type()).Elem().Interface() + case reflect.Pointer: + return reflect.New(refField.Type().Elem()).Interface() + } + } + return refField.Interface() +} + +func simplePkgAlias(pkgPath string) string { + paths := strings.Split(pkgPath, "/") + if len(paths) == 0 { + return "" + } + return paths[len(paths)-1] +} + +func isValidObjectType(refType reflect.Type) bool { + return refType.Kind() == reflect.Struct +} + +func isSupportedType(refType reflect.Type) bool { + switch refType.Kind() { + case reflect.Chan, reflect.Complex64, reflect.Complex128, reflect.Func, reflect.UnsafePointer, reflect.Uintptr: + return false + case reflect.Array, reflect.Slice: + return isSupportedType(refType.Elem()) + case reflect.Map: + return isSupportedType(refType.Key()) && isSupportedType(refType.Elem()) + } + return true +} + +var ( + pbMsgInterfaceType = reflect.TypeOf((*protoreflect.ProtoMessage)(nil)).Elem() + timestampType = reflect.TypeOf(time.Now()) + durationType = reflect.TypeOf(time.Nanosecond) +) diff --git a/tools/vendor/github.com/google/cel-go/ext/protos.go b/tools/vendor/github.com/google/cel-go/ext/protos.go new file mode 100644 index 000000000..b905e710c --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/ext/protos.go @@ -0,0 +1,145 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +// Protos returns a cel.EnvOption to configure extended macros and functions for +// proto manipulation. +// +// Note, all macros use the 'proto' namespace; however, at the time of macro +// expansion the namespace looks just like any other identifier. If you are +// currently using a variable named 'proto', the macro will likely work just as +// intended; however, there is some chance for collision. +// +// # Protos.GetExt +// +// Macro which generates a select expression that retrieves an extension field +// from the input proto2 syntax message. If the field is not set, the default +// value forthe extension field is returned according to safe-traversal semantics. +// +// proto.getExt(, ) -> +// +// Examples: +// +// proto.getExt(msg, google.expr.proto2.test.int32_ext) // returns int value +// +// # Protos.HasExt +// +// Macro which generates a test-only select expression that determines whether +// an extension field is set on a proto2 syntax message. +// +// proto.hasExt(, ) -> +// +// Examples: +// +// proto.hasExt(msg, google.expr.proto2.test.int32_ext) // returns true || false +func Protos() cel.EnvOption { + return cel.Lib(protoLib{}) +} + +var ( + protoNamespace = "proto" + hasExtension = "hasExt" + getExtension = "getExt" +) + +type protoLib struct{} + +// LibraryName implements the SingletonLibrary interface method. +func (protoLib) LibraryName() string { + return "cel.lib.ext.protos" +} + +// CompileOptions implements the Library interface method. +func (protoLib) CompileOptions() []cel.EnvOption { + return []cel.EnvOption{ + cel.Macros( + // proto.getExt(msg, select_expression) + cel.NewReceiverMacro(getExtension, 2, getProtoExt), + // proto.hasExt(msg, select_expression) + cel.NewReceiverMacro(hasExtension, 2, hasProtoExt), + ), + } +} + +// ProgramOptions implements the Library interface method. +func (protoLib) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +// hasProtoExt generates a test-only select expression for a fully-qualified extension name on a protobuf message. +func hasProtoExt(meh cel.MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if !macroTargetMatchesNamespace(protoNamespace, target) { + return nil, nil + } + extensionField, err := getExtFieldName(meh, args[1]) + if err != nil { + return nil, err + } + return meh.PresenceTest(args[0], extensionField), nil +} + +// getProtoExt generates a select expression for a fully-qualified extension name on a protobuf message. +func getProtoExt(meh cel.MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if !macroTargetMatchesNamespace(protoNamespace, target) { + return nil, nil + } + extFieldName, err := getExtFieldName(meh, args[1]) + if err != nil { + return nil, err + } + return meh.Select(args[0], extFieldName), nil +} + +func getExtFieldName(meh cel.MacroExprHelper, expr *exprpb.Expr) (string, *common.Error) { + isValid := false + extensionField := "" + switch expr.GetExprKind().(type) { + case *exprpb.Expr_SelectExpr: + extensionField, isValid = validateIdentifier(expr) + } + if !isValid { + return "", &common.Error{ + Message: "invalid extension field", + Location: meh.OffsetLocation(expr.GetId()), + } + } + return extensionField, nil +} + +func validateIdentifier(expr *exprpb.Expr) (string, bool) { + switch expr.GetExprKind().(type) { + case *exprpb.Expr_IdentExpr: + return expr.GetIdentExpr().GetName(), true + case *exprpb.Expr_SelectExpr: + sel := expr.GetSelectExpr() + if sel.GetTestOnly() { + return "", false + } + opStr, isIdent := validateIdentifier(sel.GetOperand()) + if !isIdent { + return "", false + } + return opStr + "." + sel.GetField(), true + default: + return "", false + } +} diff --git a/tools/vendor/github.com/google/cel-go/ext/sets.go b/tools/vendor/github.com/google/cel-go/ext/sets.go new file mode 100644 index 000000000..4820d6199 --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/ext/sets.go @@ -0,0 +1,138 @@ +// 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" +) + +// Sets returns a cel.EnvOption to configure namespaced set relationship +// functions. +// +// There is no set type within CEL, and while one may be introduced in the +// future, there are cases where a `list` type is known to behave like a set. +// For such cases, this library provides some basic functionality for +// determining set containment, equivalence, and intersection. +// +// # Sets.Contains +// +// Returns whether the first list argument contains all elements in the second +// list argument. The list may contain elements of any type and standard CEL +// equality is used to determine whether a value exists in both lists. If the +// second list is empty, the result will always return true. +// +// sets.contains(list(T), list(T)) -> bool +// +// Examples: +// +// sets.contains([], []) // true +// sets.contains([], [1]) // false +// sets.contains([1, 2, 3, 4], [2, 3]) // true +// sets.contains([1, 2.0, 3u], [1.0, 2u, 3]) // true +// +// # Sets.Equivalent +// +// Returns whether the first and second list are set equivalent. Lists are set +// equivalent if for every item in the first list, there is an element in the +// second which is equal. The lists may not be of the same size as they do not +// guarantee the elements within them are unique, so size does not factor into +// the computation. +// +// Examples: +// +// sets.equivalent([], []) // true +// sets.equivalent([1], [1, 1]) // true +// sets.equivalent([1], [1u, 1.0]) // true +// sets.equivalent([1, 2, 3], [3u, 2.0, 1]) // true +// +// # Sets.Intersects +// +// Returns whether the first list has at least one element whose value is equal +// to an element in the second list. If either list is empty, the result will +// be false. +// +// Examples: +// +// sets.intersects([1], []) // false +// sets.intersects([1], [1, 2]) // true +// sets.intersects([[1], [2, 3]], [[1, 2], [2, 3.0]]) // true +func Sets() cel.EnvOption { + return cel.Lib(setsLib{}) +} + +type setsLib struct{} + +// LibraryName implements the SingletonLibrary interface method. +func (setsLib) LibraryName() string { + return "cel.lib.ext.sets" +} + +// CompileOptions implements the Library interface method. +func (setsLib) CompileOptions() []cel.EnvOption { + listType := cel.ListType(cel.TypeParamType("T")) + return []cel.EnvOption{ + cel.Function("sets.contains", + cel.Overload("list_sets_contains_list", []*cel.Type{listType, listType}, cel.BoolType, + cel.BinaryBinding(setsContains))), + cel.Function("sets.equivalent", + cel.Overload("list_sets_equivalent_list", []*cel.Type{listType, listType}, cel.BoolType, + cel.BinaryBinding(setsEquivalent))), + cel.Function("sets.intersects", + cel.Overload("list_sets_intersects_list", []*cel.Type{listType, listType}, cel.BoolType, + cel.BinaryBinding(setsIntersects))), + } +} + +// ProgramOptions implements the Library interface method. +func (setsLib) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +func setsIntersects(listA, listB ref.Val) ref.Val { + lA := listA.(traits.Lister) + lB := listB.(traits.Lister) + it := lA.Iterator() + for it.HasNext() == types.True { + exists := lB.Contains(it.Next()) + if exists == types.True { + return types.True + } + } + return types.False +} + +func setsContains(list, sublist ref.Val) ref.Val { + l := list.(traits.Lister) + sub := sublist.(traits.Lister) + it := sub.Iterator() + for it.HasNext() == types.True { + exists := l.Contains(it.Next()) + if exists != types.True { + return exists + } + } + return types.True +} + +func setsEquivalent(listA, listB ref.Val) ref.Val { + aContainsB := setsContains(listA, listB) + if aContainsB != types.True { + return aContainsB + } + return setsContains(listB, listA) +} diff --git a/tools/vendor/github.com/google/cel-go/ext/strings.go b/tools/vendor/github.com/google/cel-go/ext/strings.go index 6ce239ac2..8455d5829 100644 --- a/tools/vendor/github.com/google/cel-go/ext/strings.go +++ b/tools/vendor/github.com/google/cel-go/ext/strings.go @@ -19,32 +19,92 @@ package ext import ( "fmt" + "math" "reflect" + "sort" "strings" "unicode" + "unicode/utf8" + + "golang.org/x/text/language" + "golang.org/x/text/message" "github.com/google/cel-go/cel" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + "github.com/google/cel-go/interpreter" +) + +const ( + defaultLocale = "en-US" + defaultPrecision = 6 ) // Strings returns a cel.EnvOption to configure extended functions for string manipulation. // As a general note, all indices are zero-based. // -// CharAt +// # CharAt // // Returns the character at the given position. If the position is negative, or greater than // the length of the string, the function will produce an error: // -// .charAt() -> +// .charAt() -> // // Examples: // -// 'hello'.charAt(4) // return 'o' -// 'hello'.charAt(5) // return '' -// 'hello'.charAt(-1) // error +// 'hello'.charAt(4) // return 'o' +// 'hello'.charAt(5) // return '' +// 'hello'.charAt(-1) // error +// +// # Format +// +// Introduced at version: 1 +// +// Returns a new string with substitutions being performed, printf-style. +// The valid formatting clauses are: +// +// `%s` - substitutes a string. This can also be used on bools, lists, maps, bytes, +// Duration and Timestamp, in addition to all numerical types (int, uint, and double). +// Note that the dot/period decimal separator will always be used when printing a list +// or map that contains a double, and that null can be passed (which results in the +// string "null") in addition to types. +// `%d` - substitutes an integer. +// `%f` - substitutes a double with fixed-point precision. The default precision is 6, but +// this can be adjusted. The strings `Infinity`, `-Infinity`, and `NaN` are also valid input +// for this clause. +// `%e` - substitutes a double in scientific notation. The default precision is 6, but this +// can be adjusted. +// `%b` - substitutes an integer with its equivalent binary string. Can also be used on bools. +// `%x` - substitutes an integer with its equivalent in hexadecimal, or if given a string or +// bytes, will output each character's equivalent in hexadecimal. +// `%X` - same as above, but with A-F capitalized. +// `%o` - substitutes an integer with its equivalent in octal. +// +// .format() -> +// +// Examples: // -// IndexOf +// "this is a string: %s\nand an integer: %d".format(["str", 42]) // returns "this is a string: str\nand an integer: 42" +// "a double substituted with %%s: %s".format([64.2]) // returns "a double substituted with %s: 64.2" +// "string type: %s".format([type(string)]) // returns "string type: string" +// "timestamp: %s".format([timestamp("2023-02-03T23:31:20+00:00")]) // returns "timestamp: 2023-02-03T23:31:20Z" +// "duration: %s".format([duration("1h45m47s")]) // returns "duration: 6347s" +// "%f".format([3.14]) // returns "3.140000" +// "scientific notation: %e".format([2.71828]) // returns "scientific notation: 2.718280\u202f\u00d7\u202f10\u2070\u2070" +// "5 in binary: %b".format([5]), // returns "5 in binary; 101" +// "26 in hex: %x".format([26]), // returns "26 in hex: 1a" +// "26 in hex (uppercase): %X".format([26]) // returns "26 in hex (uppercase): 1A" +// "30 in octal: %o".format([30]) // returns "30 in octal: 36" +// "a map inside a list: %s".format([[1, 2, 3, {"a": "x", "b": "y", "c": "z"}]]) // returns "a map inside a list: [1, 2, 3, {"a":"x", "b":"y", "c":"d"}]" +// "true bool: %s - false bool: %s\nbinary bool: %b".format([true, false, true]) // returns "true bool: true - false bool: false\nbinary bool: 1" +// +// Passing an incorrect type (an integer to `%s`) is considered an error, as well as attempting +// to use more formatting clauses than there are arguments (`%d %d %d` while passing two ints, for instance). +// If compile-time checking is enabled, and the formatting string is a constant, and the argument list is a literal, +// then letting any arguments go unused/unformatted is also considered an error. +// +// # IndexOf // // Returns the integer index of the first occurrence of the search string. If the search string is // not found the function returns -1. @@ -52,19 +112,19 @@ import ( // The function also accepts an optional position from which to begin the substring search. If the // substring is the empty string, the index where the search starts is returned (zero or custom). // -// .indexOf() -> -// .indexOf(, ) -> +// .indexOf() -> +// .indexOf(, ) -> // // Examples: // -// 'hello mellow'.indexOf('') // returns 0 -// 'hello mellow'.indexOf('ello') // returns 1 -// 'hello mellow'.indexOf('jello') // returns -1 -// 'hello mellow'.indexOf('', 2) // returns 2 -// 'hello mellow'.indexOf('ello', 2) // returns 7 -// 'hello mellow'.indexOf('ello', 20) // error +// 'hello mellow'.indexOf('') // returns 0 +// 'hello mellow'.indexOf('ello') // returns 1 +// 'hello mellow'.indexOf('jello') // returns -1 +// 'hello mellow'.indexOf('', 2) // returns 2 +// 'hello mellow'.indexOf('ello', 2) // returns 7 +// 'hello mellow'.indexOf('ello', 20) // error // -// Join +// # Join // // Returns a new string where the elements of string list are concatenated. // @@ -75,12 +135,12 @@ import ( // // Examples: // -// ['hello', 'mellow'].join() // returns 'hellomellow' -// ['hello', 'mellow'].join(' ') // returns 'hello mellow' -// [].join() // returns '' -// [].join('/') // returns '' +// ['hello', 'mellow'].join() // returns 'hellomellow' +// ['hello', 'mellow'].join(' ') // returns 'hello mellow' +// [].join() // returns '' +// [].join('/') // returns '' // -// LastIndexOf +// # LastIndexOf // // Returns the integer index at the start of the last occurrence of the search string. If the // search string is not found the function returns -1. @@ -89,31 +149,45 @@ import ( // considered as the beginning of the substring match. If the substring is the empty string, // the index where the search starts is returned (string length or custom). // -// .lastIndexOf() -> -// .lastIndexOf(, ) -> +// .lastIndexOf() -> +// .lastIndexOf(, ) -> // // Examples: // -// 'hello mellow'.lastIndexOf('') // returns 12 -// 'hello mellow'.lastIndexOf('ello') // returns 7 -// 'hello mellow'.lastIndexOf('jello') // returns -1 -// 'hello mellow'.lastIndexOf('ello', 6) // returns 1 -// 'hello mellow'.lastIndexOf('ello', -1) // error +// 'hello mellow'.lastIndexOf('') // returns 12 +// 'hello mellow'.lastIndexOf('ello') // returns 7 +// 'hello mellow'.lastIndexOf('jello') // returns -1 +// 'hello mellow'.lastIndexOf('ello', 6) // returns 1 +// 'hello mellow'.lastIndexOf('ello', -1) // error // -// LowerAscii +// # LowerAscii // // Returns a new string where all ASCII characters are lower-cased. // // This function does not perform Unicode case-mapping for characters outside the ASCII range. // -// .lowerAscii() -> +// .lowerAscii() -> +// +// Examples: +// +// 'TacoCat'.lowerAscii() // returns 'tacocat' +// 'TacoCÆt Xii'.lowerAscii() // returns 'tacocÆt xii' +// +// # Quote +// +// Introduced in version: 1 +// +// Takes the given string and makes it safe to print (without any formatting due to escape sequences). +// If any invalid UTF-8 characters are encountered, they are replaced with \uFFFD. +// +// strings.quote() // // Examples: // -// 'TacoCat'.lowerAscii() // returns 'tacocat' -// 'TacoCÆt Xii'.lowerAscii() // returns 'tacocÆt xii' +// strings.quote('single-quote with "double quote"') // returns '"single-quote with \"double quote\""' +// strings.quote("two escape sequences \a\n") // returns '"two escape sequences \\a\\n"' // -// Replace +// # Replace // // Returns a new string based on the target, which replaces the occurrences of a search string // with a replacement string if present. The function accepts an optional limit on the number of @@ -122,17 +196,17 @@ import ( // When the replacement limit is 0, the result is the original string. When the limit is a negative // number, the function behaves the same as replace all. // -// .replace(, ) -> -// .replace(, , ) -> +// .replace(, ) -> +// .replace(, , ) -> // // Examples: // -// 'hello hello'.replace('he', 'we') // returns 'wello wello' -// 'hello hello'.replace('he', 'we', -1) // returns 'wello wello' -// 'hello hello'.replace('he', 'we', 1) // returns 'wello hello' -// 'hello hello'.replace('he', 'we', 0) // returns 'hello hello' +// 'hello hello'.replace('he', 'we') // returns 'wello wello' +// 'hello hello'.replace('he', 'we', -1) // returns 'wello wello' +// 'hello hello'.replace('he', 'we', 1) // returns 'wello hello' +// 'hello hello'.replace('he', 'we', 0) // returns 'hello hello' // -// Split +// # Split // // Returns a list of strings split from the input by the given separator. The function accepts // an optional argument specifying a limit on the number of substrings produced by the split. @@ -141,18 +215,18 @@ import ( // target string to split. When the limit is a negative number, the function behaves the same as // split all. // -// .split() -> > -// .split(, ) -> > +// .split() -> > +// .split(, ) -> > // // Examples: // -// 'hello hello hello'.split(' ') // returns ['hello', 'hello', 'hello'] -// 'hello hello hello'.split(' ', 0) // returns [] -// 'hello hello hello'.split(' ', 1) // returns ['hello hello hello'] -// 'hello hello hello'.split(' ', 2) // returns ['hello', 'hello hello'] -// 'hello hello hello'.split(' ', -1) // returns ['hello', 'hello', 'hello'] +// 'hello hello hello'.split(' ') // returns ['hello', 'hello', 'hello'] +// 'hello hello hello'.split(' ', 0) // returns [] +// 'hello hello hello'.split(' ', 1) // returns ['hello hello hello'] +// 'hello hello hello'.split(' ', 2) // returns ['hello', 'hello hello'] +// 'hello hello hello'.split(' ', -1) // returns ['hello', 'hello', 'hello'] // -// Substring +// # Substring // // Returns the substring given a numeric range corresponding to character positions. Optionally // may omit the trailing range for a substring from a given character position until the end of @@ -162,48 +236,102 @@ import ( // error to specify an end range that is lower than the start range, or for either the start or end // index to be negative or exceed the string length. // -// .substring() -> -// .substring(, ) -> +// .substring() -> +// .substring(, ) -> // // Examples: // -// 'tacocat'.substring(4) // returns 'cat' -// 'tacocat'.substring(0, 4) // returns 'taco' -// 'tacocat'.substring(-1) // error -// 'tacocat'.substring(2, 1) // error +// 'tacocat'.substring(4) // returns 'cat' +// 'tacocat'.substring(0, 4) // returns 'taco' +// 'tacocat'.substring(-1) // error +// 'tacocat'.substring(2, 1) // error // -// Trim +// # Trim // // Returns a new string which removes the leading and trailing whitespace in the target string. // The trim function uses the Unicode definition of whitespace which does not include the // zero-width spaces. See: https://en.wikipedia.org/wiki/Whitespace_character#Unicode // -// .trim() -> +// .trim() -> // // Examples: // -// ' \ttrim\n '.trim() // returns 'trim' +// ' \ttrim\n '.trim() // returns 'trim' // -// UpperAscii +// # UpperAscii // // Returns a new string where all ASCII characters are upper-cased. // // This function does not perform Unicode case-mapping for characters outside the ASCII range. // -// .upperAscii() -> +// .upperAscii() -> // // Examples: // -// 'TacoCat'.upperAscii() // returns 'TACOCAT' -// 'TacoCÆt Xii'.upperAscii() // returns 'TACOCÆT XII' -func Strings() cel.EnvOption { - return cel.Lib(stringLib{}) +// 'TacoCat'.upperAscii() // returns 'TACOCAT' +// 'TacoCÆt Xii'.upperAscii() // returns 'TACOCÆT XII' +func Strings(options ...StringsOption) cel.EnvOption { + s := &stringLib{version: math.MaxUint32} + for _, o := range options { + s = o(s) + } + return cel.Lib(s) +} + +type stringLib struct { + locale string + version uint32 +} + +// LibraryName implements the SingletonLibrary interface method. +func (*stringLib) LibraryName() string { + return "cel.lib.ext.strings" } -type stringLib struct{} +// StringsOption is a functional interface for configuring the strings library. +type StringsOption func(*stringLib) *stringLib -func (stringLib) CompileOptions() []cel.EnvOption { - return []cel.EnvOption{ +// StringsLocale configures the library with the given locale. The locale tag will +// be checked for validity at the time that EnvOptions are configured. If this option +// is not passed, string.format will behave as if en_US was passed as the locale. +func StringsLocale(locale string) StringsOption { + return func(sl *stringLib) *stringLib { + sl.locale = locale + return sl + } +} + +// StringsVersion configures the version of the string library. The version limits which +// functions are available. Only functions introduced below or equal to the given +// version included in the library. See the library documentation to determine +// which version a function was introduced at. If the documentation does not +// state which version a function was introduced at, it can be assumed to be +// introduced at version 0, when the library was first created. +// If this option is not set, all functions are available. +func StringsVersion(version uint32) func(lib *stringLib) *stringLib { + return func(sl *stringLib) *stringLib { + sl.version = version + return sl + } +} + +// CompileOptions implements the Library interface method. +func (sl *stringLib) CompileOptions() []cel.EnvOption { + formatLocale := "en_US" + if sl.locale != "" { + // ensure locale is properly-formed if set + _, err := language.Parse(sl.locale) + if err != nil { + return []cel.EnvOption{ + func(e *cel.Env) (*cel.Env, error) { + return nil, fmt.Errorf("failed to parse locale: %w", err) + }, + } + } + formatLocale = sl.locale + } + + opts := []cel.EnvOption{ cel.Function("charAt", cel.MemberOverload("string_char_at_int", []*cel.Type{cel.StringType, cel.IntType}, cel.StringType, cel.BinaryBinding(func(str, ind ref.Val) ref.Val { @@ -303,28 +431,64 @@ func (stringLib) CompileOptions() []cel.EnvOption { s := str.(types.String) return stringOrError(upperASCII(string(s))) }))), - cel.Function("join", - cel.MemberOverload("list_join", []*cel.Type{cel.ListType(cel.StringType)}, cel.StringType, - cel.UnaryBinding(func(list ref.Val) ref.Val { - l, err := list.ConvertToNative(stringListType) - if err != nil { - return types.NewErr(err.Error()) - } - return stringOrError(join(l.([]string))) - })), - cel.MemberOverload("list_join_string", []*cel.Type{cel.ListType(cel.StringType), cel.StringType}, cel.StringType, - cel.BinaryBinding(func(list, delim ref.Val) ref.Val { - l, err := list.ConvertToNative(stringListType) - if err != nil { - return types.NewErr(err.Error()) - } - d := delim.(types.String) - return stringOrError(joinSeparator(l.([]string), string(d))) + } + if sl.version >= 1 { + opts = append(opts, cel.Function("format", + cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := string(args[0].(types.String)) + formatArgs := args[1].(traits.Lister) + return stringOrError(interpreter.ParseFormatString(s, &stringFormatter{}, &stringArgList{formatArgs}, formatLocale)) }))), + cel.Function("strings.quote", cel.Overload("strings_quote", []*cel.Type{cel.StringType}, cel.StringType, + cel.UnaryBinding(func(str ref.Val) ref.Val { + s := str.(types.String) + return stringOrError(quote(string(s))) + })))) + + } + if sl.version >= 2 { + opts = append(opts, + cel.Function("join", + cel.MemberOverload("list_join", []*cel.Type{cel.ListType(cel.StringType)}, cel.StringType, + cel.UnaryBinding(func(list ref.Val) ref.Val { + l := list.(traits.Lister) + return stringOrError(joinValSeparator(l, "")) + })), + cel.MemberOverload("list_join_string", []*cel.Type{cel.ListType(cel.StringType), cel.StringType}, cel.StringType, + cel.BinaryBinding(func(list, delim ref.Val) ref.Val { + l := list.(traits.Lister) + d := delim.(types.String) + return stringOrError(joinValSeparator(l, string(d))) + }))), + ) + } else { + opts = append(opts, + cel.Function("join", + cel.MemberOverload("list_join", []*cel.Type{cel.ListType(cel.StringType)}, cel.StringType, + cel.UnaryBinding(func(list ref.Val) ref.Val { + l, err := list.ConvertToNative(stringListType) + if err != nil { + return types.NewErr(err.Error()) + } + return stringOrError(join(l.([]string))) + })), + cel.MemberOverload("list_join_string", []*cel.Type{cel.ListType(cel.StringType), cel.StringType}, cel.StringType, + cel.BinaryBinding(func(list, delim ref.Val) ref.Val { + l, err := list.ConvertToNative(stringListType) + if err != nil { + return types.NewErr(err.Error()) + } + d := delim.(types.String) + return stringOrError(joinSeparator(l.([]string), string(d))) + }))), + ) } + return opts } -func (stringLib) ProgramOptions() []cel.ProgramOption { +// ProgramOptions implements the Library interface method. +func (*stringLib) ProgramOptions() []cel.ProgramOption { return []cel.ProgramOption{} } @@ -478,6 +642,452 @@ func join(strs []string) (string, error) { return strings.Join(strs, ""), nil } +func joinValSeparator(strs traits.Lister, separator string) (string, error) { + sz := strs.Size().(types.Int) + var sb strings.Builder + for i := types.Int(0); i < sz; i++ { + if i != 0 { + sb.WriteString(separator) + } + elem := strs.Get(i) + str, ok := elem.(types.String) + if !ok { + return "", fmt.Errorf("join: invalid input: %v", elem) + } + sb.WriteString(string(str)) + } + return sb.String(), nil +} + +type clauseImpl func(ref.Val, string) (string, error) + +func clauseForType(argType ref.Type) (clauseImpl, error) { + switch argType { + case types.IntType, types.UintType: + return formatDecimal, nil + case types.StringType, types.BytesType, types.BoolType, types.NullType, types.TypeType: + return FormatString, nil + case types.TimestampType, types.DurationType: + // special case to ensure timestamps/durations get printed as CEL literals + return func(arg ref.Val, locale string) (string, error) { + argStrVal := arg.ConvertToType(types.StringType) + argStr := argStrVal.Value().(string) + if arg.Type() == types.TimestampType { + return fmt.Sprintf("timestamp(%q)", argStr), nil + } + if arg.Type() == types.DurationType { + return fmt.Sprintf("duration(%q)", argStr), nil + } + return "", fmt.Errorf("cannot convert argument of type %s to timestamp/duration", arg.Type().TypeName()) + }, nil + case types.ListType: + return formatList, nil + case types.MapType: + return formatMap, nil + case types.DoubleType: + // avoid formatFixed so we can output a period as the decimal separator in order + // to always be a valid CEL literal + return func(arg ref.Val, locale string) (string, error) { + argDouble, ok := arg.Value().(float64) + if !ok { + return "", fmt.Errorf("couldn't convert %s to float64", arg.Type().TypeName()) + } + fmtStr := fmt.Sprintf("%%.%df", defaultPrecision) + return fmt.Sprintf(fmtStr, argDouble), nil + }, nil + case types.TypeType: + return func(arg ref.Val, locale string) (string, error) { + return fmt.Sprintf("type(%s)", arg.Value().(string)), nil + }, nil + default: + return nil, fmt.Errorf("no formatting function for %s", argType.TypeName()) + } +} + +func formatList(arg ref.Val, locale string) (string, error) { + argList := arg.(traits.Lister) + argIterator := argList.Iterator() + var listStrBuilder strings.Builder + _, err := listStrBuilder.WriteRune('[') + if err != nil { + return "", fmt.Errorf("error writing to list string: %w", err) + } + for argIterator.HasNext() == types.True { + member := argIterator.Next() + memberFormat, err := clauseForType(member.Type()) + if err != nil { + return "", err + } + unquotedStr, err := memberFormat(member, locale) + if err != nil { + return "", err + } + str := quoteForCEL(member, unquotedStr) + _, err = listStrBuilder.WriteString(str) + if err != nil { + return "", fmt.Errorf("error writing to list string: %w", err) + } + if argIterator.HasNext() == types.True { + _, err = listStrBuilder.WriteString(", ") + if err != nil { + return "", fmt.Errorf("error writing to list string: %w", err) + } + } + } + _, err = listStrBuilder.WriteRune(']') + if err != nil { + return "", fmt.Errorf("error writing to list string: %w", err) + } + return listStrBuilder.String(), nil +} + +func formatMap(arg ref.Val, locale string) (string, error) { + argMap := arg.(traits.Mapper) + argIterator := argMap.Iterator() + type mapPair struct { + key string + value string + } + argPairs := make([]mapPair, argMap.Size().Value().(int64)) + i := 0 + for argIterator.HasNext() == types.True { + key := argIterator.Next() + var keyFormat clauseImpl + switch key.Type() { + case types.StringType, types.BoolType: + keyFormat = FormatString + case types.IntType, types.UintType: + keyFormat = formatDecimal + default: + return "", fmt.Errorf("no formatting function for map key of type %s", key.Type().TypeName()) + } + unquotedKeyStr, err := keyFormat(key, locale) + if err != nil { + return "", err + } + keyStr := quoteForCEL(key, unquotedKeyStr) + value, found := argMap.Find(key) + if !found { + return "", fmt.Errorf("could not find key: %q", key) + } + valueFormat, err := clauseForType(value.Type()) + if err != nil { + return "", err + } + unquotedValueStr, err := valueFormat(value, locale) + if err != nil { + return "", err + } + valueStr := quoteForCEL(value, unquotedValueStr) + argPairs[i] = mapPair{keyStr, valueStr} + i++ + } + sort.SliceStable(argPairs, func(x, y int) bool { + return argPairs[x].key < argPairs[y].key + }) + var mapStrBuilder strings.Builder + _, err := mapStrBuilder.WriteRune('{') + if err != nil { + return "", fmt.Errorf("error writing to map string: %w", err) + } + for i, entry := range argPairs { + _, err = mapStrBuilder.WriteString(fmt.Sprintf("%s:%s", entry.key, entry.value)) + if err != nil { + return "", fmt.Errorf("error writing to map string: %w", err) + } + if i < len(argPairs)-1 { + _, err = mapStrBuilder.WriteString(", ") + if err != nil { + return "", fmt.Errorf("error writing to map string: %w", err) + } + } + } + _, err = mapStrBuilder.WriteRune('}') + if err != nil { + return "", fmt.Errorf("error writing to map string: %w", err) + } + return mapStrBuilder.String(), nil +} + +// quoteForCEL takes a formatted, unquoted value and quotes it in a manner +// suitable for embedding directly in CEL. +func quoteForCEL(refVal ref.Val, unquotedValue string) string { + switch refVal.Type() { + case types.StringType: + return fmt.Sprintf("%q", unquotedValue) + case types.BytesType: + return fmt.Sprintf("b%q", unquotedValue) + case types.DoubleType: + // special case to handle infinity/NaN + num := refVal.Value().(float64) + if math.IsInf(num, 1) || math.IsInf(num, -1) || math.IsNaN(num) { + return fmt.Sprintf("%q", unquotedValue) + } + return unquotedValue + default: + return unquotedValue + } +} + +// FormatString returns the string representation of a CEL value. +// It is used to implement the %s specifier in the (string).format() extension +// function. +func FormatString(arg ref.Val, locale string) (string, error) { + switch arg.Type() { + case types.ListType: + return formatList(arg, locale) + case types.MapType: + return formatMap(arg, locale) + case types.IntType, types.UintType, types.DoubleType, + types.BoolType, types.StringType, types.TimestampType, types.BytesType, types.DurationType, types.TypeType: + argStrVal := arg.ConvertToType(types.StringType) + argStr, ok := argStrVal.Value().(string) + if !ok { + return "", fmt.Errorf("could not convert argument %q to string", argStrVal) + } + return argStr, nil + case types.NullType: + return "null", nil + default: + return "", fmt.Errorf("string clause can only be used on strings, bools, bytes, ints, doubles, maps, lists, types, durations, and timestamps, was given %s", arg.Type().TypeName()) + } +} + +func formatDecimal(arg ref.Val, locale string) (string, error) { + switch arg.Type() { + case types.IntType: + argInt, ok := arg.ConvertToType(types.IntType).Value().(int64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to int64", arg.Value()) + } + return fmt.Sprintf("%d", argInt), nil + case types.UintType: + argInt, ok := arg.ConvertToType(types.UintType).Value().(uint64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to uint64", arg.Value()) + } + return fmt.Sprintf("%d", argInt), nil + default: + return "", fmt.Errorf("decimal clause can only be used on integers, was given %s", arg.Type().TypeName()) + } +} + +func matchLanguage(locale string) (language.Tag, error) { + matcher, err := makeMatcher(locale) + if err != nil { + return language.Und, err + } + tag, _ := language.MatchStrings(matcher, locale) + return tag, nil +} + +func makeMatcher(locale string) (language.Matcher, error) { + tags := make([]language.Tag, 0) + tag, err := language.Parse(locale) + if err != nil { + return nil, err + } + tags = append(tags, tag) + return language.NewMatcher(tags), nil +} + +// quote implements a string quoting function. The string will be wrapped in +// double quotes, and all valid CEL escape sequences will be escaped to show up +// literally if printed. If the input contains any invalid UTF-8, the invalid runes +// will be replaced with utf8.RuneError. +func quote(s string) (string, error) { + var quotedStrBuilder strings.Builder + for _, c := range sanitize(s) { + switch c { + case '\a': + quotedStrBuilder.WriteString("\\a") + case '\b': + quotedStrBuilder.WriteString("\\b") + case '\f': + quotedStrBuilder.WriteString("\\f") + case '\n': + quotedStrBuilder.WriteString("\\n") + case '\r': + quotedStrBuilder.WriteString("\\r") + case '\t': + quotedStrBuilder.WriteString("\\t") + case '\v': + quotedStrBuilder.WriteString("\\v") + case '\\': + quotedStrBuilder.WriteString("\\\\") + case '"': + quotedStrBuilder.WriteString("\\\"") + default: + quotedStrBuilder.WriteRune(c) + } + } + escapedStr := quotedStrBuilder.String() + return "\"" + escapedStr + "\"", nil +} + +// sanitize replaces all invalid runes in the given string with utf8.RuneError. +func sanitize(s string) string { + var sanitizedStringBuilder strings.Builder + for _, r := range s { + if !utf8.ValidRune(r) { + sanitizedStringBuilder.WriteRune(utf8.RuneError) + } else { + sanitizedStringBuilder.WriteRune(r) + } + } + return sanitizedStringBuilder.String() +} + +type stringFormatter struct{} + +func (c *stringFormatter) String(arg ref.Val, locale string) (string, error) { + return FormatString(arg, locale) +} + +func (c *stringFormatter) Decimal(arg ref.Val, locale string) (string, error) { + return formatDecimal(arg, locale) +} + +func (c *stringFormatter) Fixed(precision *int) func(ref.Val, string) (string, error) { + if precision == nil { + precision = new(int) + *precision = defaultPrecision + } + return func(arg ref.Val, locale string) (string, error) { + strException := false + if arg.Type() == types.StringType { + argStr := arg.Value().(string) + if argStr == "NaN" || argStr == "Infinity" || argStr == "-Infinity" { + strException = true + } + } + if arg.Type() != types.DoubleType && !strException { + return "", fmt.Errorf("fixed-point clause can only be used on doubles, was given %s", arg.Type().TypeName()) + } + argFloatVal := arg.ConvertToType(types.DoubleType) + argFloat, ok := argFloatVal.Value().(float64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to float64", argFloatVal.Value()) + } + fmtStr := fmt.Sprintf("%%.%df", *precision) + + matchedLocale, err := matchLanguage(locale) + if err != nil { + return "", fmt.Errorf("error matching locale: %w", err) + } + return message.NewPrinter(matchedLocale).Sprintf(fmtStr, argFloat), nil + } +} + +func (c *stringFormatter) Scientific(precision *int) func(ref.Val, string) (string, error) { + if precision == nil { + precision = new(int) + *precision = defaultPrecision + } + return func(arg ref.Val, locale string) (string, error) { + strException := false + if arg.Type() == types.StringType { + argStr := arg.Value().(string) + if argStr == "NaN" || argStr == "Infinity" || argStr == "-Infinity" { + strException = true + } + } + if arg.Type() != types.DoubleType && !strException { + return "", fmt.Errorf("scientific clause can only be used on doubles, was given %s", arg.Type().TypeName()) + } + argFloatVal := arg.ConvertToType(types.DoubleType) + argFloat, ok := argFloatVal.Value().(float64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to float64", argFloatVal.Value()) + } + matchedLocale, err := matchLanguage(locale) + if err != nil { + return "", fmt.Errorf("error matching locale: %w", err) + } + fmtStr := fmt.Sprintf("%%%de", *precision) + return message.NewPrinter(matchedLocale).Sprintf(fmtStr, argFloat), nil + } +} + +func (c *stringFormatter) Binary(arg ref.Val, locale string) (string, error) { + switch arg.Type() { + case types.IntType: + argInt := arg.Value().(int64) + // locale is intentionally unused as integers formatted as binary + // strings are locale-independent + return fmt.Sprintf("%b", argInt), nil + case types.UintType: + argInt := arg.Value().(uint64) + return fmt.Sprintf("%b", argInt), nil + case types.BoolType: + argBool := arg.Value().(bool) + if argBool { + return "1", nil + } + return "0", nil + default: + return "", fmt.Errorf("only integers and bools can be formatted as binary, was given %s", arg.Type().TypeName()) + } +} + +func (c *stringFormatter) Hex(useUpper bool) func(ref.Val, string) (string, error) { + return func(arg ref.Val, locale string) (string, error) { + fmtStr := "%x" + if useUpper { + fmtStr = "%X" + } + switch arg.Type() { + case types.StringType, types.BytesType: + if arg.Type() == types.BytesType { + return fmt.Sprintf(fmtStr, arg.Value().([]byte)), nil + } + return fmt.Sprintf(fmtStr, arg.Value().(string)), nil + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to int64", arg.Value()) + } + return fmt.Sprintf(fmtStr, argInt), nil + case types.UintType: + argInt, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("could not convert \"%s\" to uint64", arg.Value()) + } + return fmt.Sprintf(fmtStr, argInt), nil + default: + return "", fmt.Errorf("only integers, byte buffers, and strings can be formatted as hex, was given %s", arg.Type().TypeName()) + } + } +} + +func (c *stringFormatter) Octal(arg ref.Val, locale string) (string, error) { + switch arg.Type() { + case types.IntType: + argInt := arg.Value().(int64) + return fmt.Sprintf("%o", argInt), nil + case types.UintType: + argInt := arg.Value().(uint64) + return fmt.Sprintf("%o", argInt), nil + default: + return "", fmt.Errorf("octal clause can only be used on integers, was given %s", arg.Type().TypeName()) + } +} + +type stringArgList struct { + args traits.Lister +} + +func (c *stringArgList) Arg(index int64) (ref.Val, error) { + if index >= c.args.Size().Value().(int64) { + return nil, fmt.Errorf("index %d out of range", index) + } + return c.args.Get(types.Int(index)), nil +} + +func (c *stringArgList) ArgSize() int64 { + return c.args.Size().Value().(int64) +} + var ( stringListType = reflect.TypeOf([]string{}) ) diff --git a/tools/vendor/github.com/google/cel-go/interpreter/BUILD.bazel b/tools/vendor/github.com/google/cel-go/interpreter/BUILD.bazel index 04a3ec744..b6d04e000 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/interpreter/BUILD.bazel @@ -11,10 +11,10 @@ go_library( "activation.go", "attribute_patterns.go", "attributes.go", - "coster.go", "decorators.go", "dispatcher.go", "evalstate.go", + "formatting.go", "interpretable.go", "interpreter.go", "optimizations.go", @@ -32,7 +32,7 @@ go_library( "//common/types/ref:go_default_library", "//common/types/traits:go_default_library", "//interpreter/functions:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/durationpb:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", @@ -49,6 +49,7 @@ go_test( "attributes_test.go", "interpreter_test.go", "prune_test.go", + "runtimecost_test.go", ], embed = [ ":go_default_library", @@ -65,7 +66,7 @@ go_test( "//test:go_default_library", "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/anypb:go_default_library", ], diff --git a/tools/vendor/github.com/google/cel-go/interpreter/activation.go b/tools/vendor/github.com/google/cel-go/interpreter/activation.go index 8686d4f04..f82e4e903 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/activation.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/activation.go @@ -28,7 +28,7 @@ import ( type Activation interface { // ResolveName returns a value from the activation by qualified name, or false if the name // could not be found. - ResolveName(name string) (interface{}, bool) + ResolveName(name string) (any, bool) // Parent returns the parent of the current activation, may be nil. // If non-nil, the parent will be searched during resolve calls. @@ -43,23 +43,23 @@ func EmptyActivation() Activation { // emptyActivation is a variable-free activation. type emptyActivation struct{} -func (emptyActivation) ResolveName(string) (interface{}, bool) { return nil, false } -func (emptyActivation) Parent() Activation { return nil } +func (emptyActivation) ResolveName(string) (any, bool) { return nil, false } +func (emptyActivation) Parent() Activation { return nil } // NewActivation returns an activation based on a map-based binding where the map keys are // expected to be qualified names used with ResolveName calls. // -// The input `bindings` may either be of type `Activation` or `map[string]interface{}`. +// The input `bindings` may either be of type `Activation` or `map[string]any`. // // Lazy bindings may be supplied within the map-based input in either of the following forms: -// - func() interface{} +// - func() any // - func() ref.Val // // The output of the lazy binding will overwrite the variable reference in the internal map. // // Values which are not represented as ref.Val types on input may be adapted to a ref.Val using // the ref.TypeAdapter configured in the environment. -func NewActivation(bindings interface{}) (Activation, error) { +func NewActivation(bindings any) (Activation, error) { if bindings == nil { return nil, errors.New("bindings must be non-nil") } @@ -67,7 +67,7 @@ func NewActivation(bindings interface{}) (Activation, error) { if isActivation { return a, nil } - m, isMap := bindings.(map[string]interface{}) + m, isMap := bindings.(map[string]any) if !isMap { return nil, fmt.Errorf( "activation input must be an activation or map[string]interface: got %T", @@ -81,7 +81,7 @@ func NewActivation(bindings interface{}) (Activation, error) { // Named bindings may lazily supply values by providing a function which accepts no arguments and // produces an interface value. type mapActivation struct { - bindings map[string]interface{} + bindings map[string]any } // Parent implements the Activation interface method. @@ -90,7 +90,7 @@ func (a *mapActivation) Parent() Activation { } // ResolveName implements the Activation interface method. -func (a *mapActivation) ResolveName(name string) (interface{}, bool) { +func (a *mapActivation) ResolveName(name string) (any, bool) { obj, found := a.bindings[name] if !found { return nil, false @@ -100,7 +100,7 @@ func (a *mapActivation) ResolveName(name string) (interface{}, bool) { obj = fn() a.bindings[name] = obj } - fnRaw, isLazy := obj.(func() interface{}) + fnRaw, isLazy := obj.(func() any) if isLazy { obj = fnRaw() a.bindings[name] = obj @@ -121,7 +121,7 @@ func (a *hierarchicalActivation) Parent() Activation { } // ResolveName implements the Activation interface method. -func (a *hierarchicalActivation) ResolveName(name string) (interface{}, bool) { +func (a *hierarchicalActivation) ResolveName(name string) (any, bool) { if object, found := a.child.ResolveName(name); found { return object, found } @@ -138,8 +138,8 @@ func NewHierarchicalActivation(parent Activation, child Activation) Activation { // representing field and index operations that should result in a 'types.Unknown' result. // // The `bindings` value may be any value type supported by the interpreter.NewActivation call, -// but is typically either an existing Activation or map[string]interface{}. -func NewPartialActivation(bindings interface{}, +// but is typically either an existing Activation or map[string]any. +func NewPartialActivation(bindings any, unknowns ...*AttributePattern) (PartialActivation, error) { a, err := NewActivation(bindings) if err != nil { @@ -184,7 +184,7 @@ func (v *varActivation) Parent() Activation { } // ResolveName implements the Activation interface method. -func (v *varActivation) ResolveName(name string) (interface{}, bool) { +func (v *varActivation) ResolveName(name string) (any, bool) { if name == v.name { return v.val, true } @@ -194,7 +194,7 @@ func (v *varActivation) ResolveName(name string) (interface{}, bool) { var ( // pool of var activations to reduce allocations during folds. varActivationPool = &sync.Pool{ - New: func() interface{} { + New: func() any { return &varActivation{} }, } diff --git a/tools/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go b/tools/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go index b33f7f7fd..afb7c8d5b 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go @@ -15,8 +15,6 @@ package interpreter import ( - "fmt" - "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" @@ -36,9 +34,9 @@ import ( // // Examples: // -// 1. ns.myvar["complex-value"] -// 2. ns.myvar["complex-value"][0] -// 3. ns.myvar["complex-value"].*.name +// 1. ns.myvar["complex-value"] +// 2. ns.myvar["complex-value"][0] +// 3. ns.myvar["complex-value"].*.name // // The first example is simple: match an attribute where the variable is 'ns.myvar' with a // field access on 'complex-value'. The second example expands the match to indicate that only @@ -108,7 +106,7 @@ func (apat *AttributePattern) QualifierPatterns() []*AttributeQualifierPattern { // AttributeQualifierPattern holds a wildcard or valued qualifier pattern. type AttributeQualifierPattern struct { wildcard bool - value interface{} + value any } // Matches returns true if the qualifier pattern is a wildcard, or the Qualifier implements the @@ -134,44 +132,44 @@ func (qpat *AttributeQualifierPattern) Matches(q Qualifier) bool { type qualifierValueEquator interface { // QualifierValueEquals returns true if the input value is equal to the value held in the // Qualifier. - QualifierValueEquals(value interface{}) bool + QualifierValueEquals(value any) bool } // QualifierValueEquals implementation for boolean qualifiers. -func (q *boolQualifier) QualifierValueEquals(value interface{}) bool { +func (q *boolQualifier) QualifierValueEquals(value any) bool { bval, ok := value.(bool) return ok && q.value == bval } // QualifierValueEquals implementation for field qualifiers. -func (q *fieldQualifier) QualifierValueEquals(value interface{}) bool { +func (q *fieldQualifier) QualifierValueEquals(value any) bool { sval, ok := value.(string) return ok && q.Name == sval } // QualifierValueEquals implementation for string qualifiers. -func (q *stringQualifier) QualifierValueEquals(value interface{}) bool { +func (q *stringQualifier) QualifierValueEquals(value any) bool { sval, ok := value.(string) return ok && q.value == sval } // QualifierValueEquals implementation for int qualifiers. -func (q *intQualifier) QualifierValueEquals(value interface{}) bool { +func (q *intQualifier) QualifierValueEquals(value any) bool { return numericValueEquals(value, q.celValue) } // QualifierValueEquals implementation for uint qualifiers. -func (q *uintQualifier) QualifierValueEquals(value interface{}) bool { +func (q *uintQualifier) QualifierValueEquals(value any) bool { return numericValueEquals(value, q.celValue) } // QualifierValueEquals implementation for double qualifiers. -func (q *doubleQualifier) QualifierValueEquals(value interface{}) bool { +func (q *doubleQualifier) QualifierValueEquals(value any) bool { return numericValueEquals(value, q.celValue) } // numericValueEquals uses CEL equality to determine whether two number values are -func numericValueEquals(value interface{}, celValue ref.Val) bool { +func numericValueEquals(value any, celValue ref.Val) bool { val := types.DefaultTypeAdapter.NativeToValue(value) return celValue.Equal(val) == types.True } @@ -272,13 +270,9 @@ func (fac *partialAttributeFactory) matchesUnknownPatterns( if err != nil { return nil, err } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } // If this resolution behavior ever changes, new implementations of the // qualifierValueEquator may be required to handle proper resolution. - qual, err = fac.NewQualifier(nil, qual.ID(), val) + qual, err = fac.NewQualifier(nil, qual.ID(), val, attr.IsOptional()) if err != nil { return nil, err } @@ -338,24 +332,10 @@ func (m *attributeMatcher) AddQualifier(qual Qualifier) (Attribute, error) { return m, nil } -// Resolve is an implementation of the Attribute interface method which uses the -// attributeMatcher TryResolve implementation rather than the embedded NamespacedAttribute -// Resolve implementation. -func (m *attributeMatcher) Resolve(vars Activation) (interface{}, error) { - obj, found, err := m.TryResolve(vars) - if err != nil { - return nil, err - } - if !found { - return nil, fmt.Errorf("no such attribute: %v", m.NamespacedAttribute) - } - return obj, nil -} - -// TryResolve is an implementation of the NamespacedAttribute interface method which tests +// Resolve is an implementation of the NamespacedAttribute interface method which tests // for matching unknown attribute patterns and returns types.Unknown if present. Otherwise, // the standard Resolve logic applies. -func (m *attributeMatcher) TryResolve(vars Activation) (interface{}, bool, error) { +func (m *attributeMatcher) Resolve(vars Activation) (any, error) { id := m.NamespacedAttribute.ID() // Bug in how partial activation is resolved, should search parents as well. partial, isPartial := toPartialActivation(vars) @@ -366,30 +346,23 @@ func (m *attributeMatcher) TryResolve(vars Activation) (interface{}, bool, error m.CandidateVariableNames(), m.qualifiers) if err != nil { - return nil, true, err + return nil, err } if unk != nil { - return unk, true, nil + return unk, nil } } - return m.NamespacedAttribute.TryResolve(vars) + return m.NamespacedAttribute.Resolve(vars) } // Qualify is an implementation of the Qualifier interface method. -func (m *attributeMatcher) Qualify(vars Activation, obj interface{}) (interface{}, error) { - val, err := m.Resolve(vars) - if err != nil { - return nil, err - } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } - qual, err := m.fac.NewQualifier(nil, m.ID(), val) - if err != nil { - return nil, err - } - return qual.Qualify(vars, obj) +func (m *attributeMatcher) Qualify(vars Activation, obj any) (any, error) { + return attrQualify(m.fac, vars, obj, m) +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (m *attributeMatcher) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return attrQualifyIfPresent(m.fac, vars, obj, m, presenceOnly) } func toPartialActivation(vars Activation) (PartialActivation, bool) { diff --git a/tools/vendor/github.com/google/cel-go/interpreter/attributes.go b/tools/vendor/github.com/google/cel-go/interpreter/attributes.go index 4f1772ea3..1b19dc2b5 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/attributes.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/attributes.go @@ -16,7 +16,7 @@ package interpreter import ( "fmt" - "math" + "strings" "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/types" @@ -61,7 +61,7 @@ type AttributeFactory interface { // The qualifier may consider the object type being qualified, if present. If absent, the // qualification should be considered dynamic and the qualification should still work, though // it may be sub-optimal. - NewQualifier(objType *exprpb.Type, qualID int64, val interface{}) (Qualifier, error) + NewQualifier(objType *exprpb.Type, qualID int64, val any, opt bool) (Qualifier, error) } // Qualifier marker interface for designating different qualifier values and where they appear @@ -70,9 +70,21 @@ type Qualifier interface { // ID where the qualifier appears within an expression. ID() int64 + // IsOptional specifies whether the qualifier is optional. + // Instead of a direct qualification, an optional qualifier will be resolved via QualifyIfPresent + // rather than Qualify. A non-optional qualifier may also be resolved through QualifyIfPresent if + // the object to qualify is itself optional. + IsOptional() bool + // Qualify performs a qualification, e.g. field selection, on the input object and returns - // the value or error that results. - Qualify(vars Activation, obj interface{}) (interface{}, error) + // the value of the access and whether the value was set. A non-nil value with a false presence + // test result indicates that the value being returned is the default value. + Qualify(vars Activation, obj any) (any, error) + + // QualifyIfPresent qualifies the object if the qualifier is declared or defined on the object. + // The 'presenceOnly' flag indicates that the value is not necessary, just a boolean status as + // to whether the qualifier is present. + QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) } // ConstantQualifier interface embeds the Qualifier interface and provides an option to inspect the @@ -82,6 +94,7 @@ type Qualifier interface { type ConstantQualifier interface { Qualifier + // Value returns the constant value associated with the qualifier. Value() ref.Val } @@ -90,12 +103,16 @@ type ConstantQualifier interface { type Attribute interface { Qualifier - // AddQualifier adds a qualifier on the Attribute or error if the qualification is not a valid - // qualifier type. + // AddQualifier adds a qualifier on the Attribute or error if the qualification is not a valid qualifier type. AddQualifier(Qualifier) (Attribute, error) - // Resolve returns the value of the Attribute given the current Activation. - Resolve(Activation) (interface{}, error) + // Resolve returns the value of the Attribute and whether it was present given an Activation. + // For objects which support safe traversal, the value may be non-nil and the presence flag be false. + // + // If an error is encountered during attribute resolution, it will be returned immediately. + // If the attribute cannot be resolved within the Activation, the result must be: `nil`, `error` + // with the error indicating which variable was missing. + Resolve(Activation) (any, error) } // NamespacedAttribute values are a variable within a namespace, and an optional set of qualifiers @@ -107,22 +124,14 @@ type NamespacedAttribute interface { // the CEL namespace resolution order. CandidateVariableNames() []string - // Qualifiers returns the list of qualifiers associated with the Attribute.s + // Qualifiers returns the list of qualifiers associated with the Attribute. Qualifiers() []Qualifier - - // TryResolve attempts to return the value of the attribute given the current Activation. - // If an error is encountered during attribute resolution, it will be returned immediately. - // If the attribute cannot be resolved within the Activation, the result must be: `nil`, - // `false`, `nil`. - TryResolve(Activation) (interface{}, bool, error) } // NewAttributeFactory returns a default AttributeFactory which is produces Attribute values // capable of resolving types by simple names and qualify the values using the supported qualifier // types: bool, int, string, and uint. -func NewAttributeFactory(cont *containers.Container, - a ref.TypeAdapter, - p ref.TypeProvider) AttributeFactory { +func NewAttributeFactory(cont *containers.Container, a ref.TypeAdapter, p ref.TypeProvider) AttributeFactory { return &attrFactory{ container: cont, adapter: a, @@ -190,9 +199,7 @@ func (r *attrFactory) RelativeAttribute(id int64, operand Interpretable) Attribu } // NewQualifier is an implementation of the AttributeFactory interface. -func (r *attrFactory) NewQualifier(objType *exprpb.Type, - qualID int64, - val interface{}) (Qualifier, error) { +func (r *attrFactory) NewQualifier(objType *exprpb.Type, qualID int64, val any, opt bool) (Qualifier, error) { // Before creating a new qualifier check to see if this is a protobuf message field access. // If so, use the precomputed GetFrom qualification method rather than the standard // stringQualifier. @@ -205,10 +212,11 @@ func (r *attrFactory) NewQualifier(objType *exprpb.Type, Name: str, FieldType: ft, adapter: r.adapter, + optional: opt, }, nil } } - return newQualifier(r.adapter, qualID, val) + return newQualifier(r.adapter, qualID, val, opt) } type absoluteAttribute struct { @@ -224,19 +232,18 @@ type absoluteAttribute struct { // ID implements the Attribute interface method. func (a *absoluteAttribute) ID() int64 { - return a.id + qualCount := len(a.qualifiers) + if qualCount == 0 { + return a.id + } + return a.qualifiers[qualCount-1].ID() } -// Cost implements the Coster interface method. -func (a *absoluteAttribute) Cost() (min, max int64) { - for _, q := range a.qualifiers { - minQ, maxQ := estimateCost(q) - min += minQ - max += maxQ - } - min++ // For object retrieval. - max++ - return +// IsOptional returns trivially false for an attribute as the attribute represents a fully +// qualified variable name. If the attribute is used in an optional manner, then an attrQualifier +// is created and marks the attribute as optional. +func (a *absoluteAttribute) IsOptional() bool { + return false } // AddQualifier implements the Attribute interface method. @@ -256,33 +263,13 @@ func (a *absoluteAttribute) Qualifiers() []Qualifier { } // Qualify is an implementation of the Qualifier interface method. -func (a *absoluteAttribute) Qualify(vars Activation, obj interface{}) (interface{}, error) { - val, err := a.Resolve(vars) - if err != nil { - return nil, err - } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } - qual, err := a.fac.NewQualifier(nil, a.id, val) - if err != nil { - return nil, err - } - return qual.Qualify(vars, obj) +func (a *absoluteAttribute) Qualify(vars Activation, obj any) (any, error) { + return attrQualify(a.fac, vars, obj, a) } -// Resolve returns the resolved Attribute value given the Activation, or error if the Attribute -// variable is not found, or if its Qualifiers cannot be applied successfully. -func (a *absoluteAttribute) Resolve(vars Activation) (interface{}, error) { - obj, found, err := a.TryResolve(vars) - if err != nil { - return nil, err - } - if found { - return obj, nil - } - return nil, fmt.Errorf("no such attribute: %v", a) +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (a *absoluteAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return attrQualifyIfPresent(a.fac, vars, obj, a, presenceOnly) } // String implements the Stringer interface method. @@ -290,36 +277,47 @@ func (a *absoluteAttribute) String() string { return fmt.Sprintf("id: %v, names: %v", a.id, a.namespaceNames) } -// TryResolve iterates through the namespaced variable names until one is found within the -// Activation or TypeProvider. +// Resolve returns the resolved Attribute value given the Activation, or error if the Attribute +// variable is not found, or if its Qualifiers cannot be applied successfully. // // If the variable name cannot be found as an Activation variable or in the TypeProvider as -// a type, then the result is `nil`, `false`, `nil` per the interface requirement. -func (a *absoluteAttribute) TryResolve(vars Activation) (interface{}, bool, error) { +// a type, then the result is `nil`, `error` with the error indicating the name of the first +// variable searched as missing. +func (a *absoluteAttribute) Resolve(vars Activation) (any, error) { for _, nm := range a.namespaceNames { // If the variable is found, process it. Otherwise, wait until the checks to // determine whether the type is unknown before returning. - op, found := vars.ResolveName(nm) + obj, found := vars.ResolveName(nm) if found { - var err error - for _, qual := range a.qualifiers { - op, err = qual.Qualify(vars, op) - if err != nil { - return nil, true, err + obj, isOpt, err := applyQualifiers(vars, obj, a.qualifiers) + if err != nil { + return nil, err + } + if isOpt { + val := a.adapter.NativeToValue(obj) + if types.IsUnknown(val) { + return val, nil } + return types.OptionalOf(val), nil } - return op, true, nil + return obj, nil } // Attempt to resolve the qualified type name if the name is not a variable identifier. typ, found := a.provider.FindIdent(nm) if found { if len(a.qualifiers) == 0 { - return typ, true, nil + return typ, nil } - return nil, true, fmt.Errorf("no such attribute: %v", typ) } } - return nil, false, nil + var attrNames strings.Builder + for i, nm := range a.namespaceNames { + if i != 0 { + attrNames.WriteString(", ") + } + attrNames.WriteString(nm) + } + return nil, missingAttribute(attrNames.String()) } type conditionalAttribute struct { @@ -333,17 +331,19 @@ type conditionalAttribute struct { // ID is an implementation of the Attribute interface method. func (a *conditionalAttribute) ID() int64 { + // There's a field access after the conditional. + if a.truthy.ID() == a.falsy.ID() { + return a.truthy.ID() + } + // Otherwise return the conditional id as the consistent id being tracked. return a.id } -// Cost provides the heuristic cost of a ternary operation ? : . -// The cost is computed as cost(expr) plus the min/max costs of evaluating either -// `t` or `f`. -func (a *conditionalAttribute) Cost() (min, max int64) { - tMin, tMax := estimateCost(a.truthy) - fMin, fMax := estimateCost(a.falsy) - eMin, eMax := estimateCost(a.expr) - return eMin + findMin(tMin, fMin), eMax + findMax(tMax, fMax) +// IsOptional returns trivially false for an attribute as the attribute represents a fully +// qualified variable name. If the attribute is used in an optional manner, then an attrQualifier +// is created and marks the attribute as optional. +func (a *conditionalAttribute) IsOptional() bool { + return false } // AddQualifier appends the same qualifier to both sides of the conditional, in effect managing @@ -361,28 +361,18 @@ func (a *conditionalAttribute) AddQualifier(qual Qualifier) (Attribute, error) { } // Qualify is an implementation of the Qualifier interface method. -func (a *conditionalAttribute) Qualify(vars Activation, obj interface{}) (interface{}, error) { - val, err := a.Resolve(vars) - if err != nil { - return nil, err - } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } - qual, err := a.fac.NewQualifier(nil, a.id, val) - if err != nil { - return nil, err - } - return qual.Qualify(vars, obj) +func (a *conditionalAttribute) Qualify(vars Activation, obj any) (any, error) { + return attrQualify(a.fac, vars, obj, a) +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (a *conditionalAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return attrQualifyIfPresent(a.fac, vars, obj, a, presenceOnly) } // Resolve evaluates the condition, and then resolves the truthy or falsy branch accordingly. -func (a *conditionalAttribute) Resolve(vars Activation) (interface{}, error) { +func (a *conditionalAttribute) Resolve(vars Activation) (any, error) { val := a.expr.Eval(vars) - if types.IsError(val) { - return nil, val.(*types.Err) - } if val == types.True { return a.truthy.Resolve(vars) } @@ -410,33 +400,14 @@ type maybeAttribute struct { // ID is an implementation of the Attribute interface method. func (a *maybeAttribute) ID() int64 { - return a.id + return a.attrs[0].ID() } -// Cost implements the Coster interface method. The min cost is computed as the minimal cost among -// all the possible attributes, the max cost ditto. -func (a *maybeAttribute) Cost() (min, max int64) { - min, max = math.MaxInt64, 0 - for _, a := range a.attrs { - minA, maxA := estimateCost(a) - min = findMin(min, minA) - max = findMax(max, maxA) - } - return -} - -func findMin(x, y int64) int64 { - if x < y { - return x - } - return y -} - -func findMax(x, y int64) int64 { - if x > y { - return x - } - return y +// IsOptional returns trivially false for an attribute as the attribute represents a fully +// qualified variable name. If the attribute is used in an optional manner, then an attrQualifier +// is created and marks the attribute as optional. +func (a *maybeAttribute) IsOptional() bool { + return false } // AddQualifier adds a qualifier to each possible attribute variant, and also creates @@ -446,21 +417,21 @@ func findMax(x, y int64) int64 { // // 1. Create a maybe attribute from a simple identifier when it occurs in a parsed-only expression // -// mb = MaybeAttribute(, "a") +// mb = MaybeAttribute(, "a") // -// Initializing the maybe attribute creates an absolute attribute internally which includes the -// possible namespaced names of the attribute. In this example, let's assume we are in namespace -// 'ns', then the maybe is either one of the following variable names: +// Initializing the maybe attribute creates an absolute attribute internally which includes the +// possible namespaced names of the attribute. In this example, let's assume we are in namespace +// 'ns', then the maybe is either one of the following variable names: // -// possible variables names -- ns.a, a +// possible variables names -- ns.a, a // // 2. Adding a qualifier to the maybe means that the variable name could be a longer qualified -// name, or a field selection on one of the possible variable names produced earlier: +// name, or a field selection on one of the possible variable names produced earlier: // -// mb.AddQualifier("b") +// mb.AddQualifier("b") // -// possible variables names -- ns.a.b, a.b -// possible field selection -- ns.a['b'], a['b'] +// possible variables names -- ns.a.b, a.b +// possible field selection -- ns.a['b'], a['b'] // // If none of the attributes within the maybe resolves a value, the result is an error. func (a *maybeAttribute) AddQualifier(qual Qualifier) (Attribute, error) { @@ -486,43 +457,49 @@ func (a *maybeAttribute) AddQualifier(qual Qualifier) (Attribute, error) { } } // Next, ensure the most specific variable / type reference is searched first. - a.attrs = append([]NamespacedAttribute{a.fac.AbsoluteAttribute(qual.ID(), augmentedNames...)}, a.attrs...) + if len(augmentedNames) != 0 { + a.attrs = append([]NamespacedAttribute{a.fac.AbsoluteAttribute(qual.ID(), augmentedNames...)}, a.attrs...) + } return a, nil } // Qualify is an implementation of the Qualifier interface method. -func (a *maybeAttribute) Qualify(vars Activation, obj interface{}) (interface{}, error) { - val, err := a.Resolve(vars) - if err != nil { - return nil, err - } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } - qual, err := a.fac.NewQualifier(nil, a.id, val) - if err != nil { - return nil, err - } - return qual.Qualify(vars, obj) +func (a *maybeAttribute) Qualify(vars Activation, obj any) (any, error) { + return attrQualify(a.fac, vars, obj, a) +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (a *maybeAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return attrQualifyIfPresent(a.fac, vars, obj, a, presenceOnly) } // Resolve follows the variable resolution rules to determine whether the attribute is a variable // or a field selection. -func (a *maybeAttribute) Resolve(vars Activation) (interface{}, error) { +func (a *maybeAttribute) Resolve(vars Activation) (any, error) { + var maybeErr error for _, attr := range a.attrs { - obj, found, err := attr.TryResolve(vars) + obj, err := attr.Resolve(vars) // Return an error if one is encountered. if err != nil { - return nil, err - } - // If the object was found, return it. - if found { - return obj, nil + resErr, ok := err.(*resolutionError) + if !ok { + return nil, err + } + // If this was not a missing variable error, return it. + if !resErr.isMissingAttribute() { + return nil, err + } + // When the variable is missing in a maybe attribute we defer erroring. + if maybeErr == nil { + maybeErr = resErr + } + // Continue attempting to resolve possible variables. + continue } + return obj, nil } // Else, produce a no such attribute error. - return nil, fmt.Errorf("no such attribute: %v", a) + return nil, maybeErr } // String is an implementation of the Stringer interface method. @@ -540,18 +517,18 @@ type relativeAttribute struct { // ID is an implementation of the Attribute interface method. func (a *relativeAttribute) ID() int64 { - return a.id + qualCount := len(a.qualifiers) + if qualCount == 0 { + return a.id + } + return a.qualifiers[qualCount-1].ID() } -// Cost implements the Coster interface method. -func (a *relativeAttribute) Cost() (min, max int64) { - min, max = estimateCost(a.operand) - for _, qual := range a.qualifiers { - minQ, maxQ := estimateCost(qual) - min += minQ - max += maxQ - } - return +// IsOptional returns trivially false for an attribute as the attribute represents a fully +// qualified variable name. If the attribute is used in an optional manner, then an attrQualifier +// is created and marks the attribute as optional. +func (a *relativeAttribute) IsOptional() bool { + return false } // AddQualifier implements the Attribute interface method. @@ -561,24 +538,17 @@ func (a *relativeAttribute) AddQualifier(qual Qualifier) (Attribute, error) { } // Qualify is an implementation of the Qualifier interface method. -func (a *relativeAttribute) Qualify(vars Activation, obj interface{}) (interface{}, error) { - val, err := a.Resolve(vars) - if err != nil { - return nil, err - } - unk, isUnk := val.(types.Unknown) - if isUnk { - return unk, nil - } - qual, err := a.fac.NewQualifier(nil, a.id, val) - if err != nil { - return nil, err - } - return qual.Qualify(vars, obj) +func (a *relativeAttribute) Qualify(vars Activation, obj any) (any, error) { + return attrQualify(a.fac, vars, obj, a) +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (a *relativeAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return attrQualifyIfPresent(a.fac, vars, obj, a, presenceOnly) } // Resolve expression value and qualifier relative to the expression result. -func (a *relativeAttribute) Resolve(vars Activation) (interface{}, error) { +func (a *relativeAttribute) Resolve(vars Activation) (any, error) { // First, evaluate the operand. v := a.operand.Eval(vars) if types.IsError(v) { @@ -587,14 +557,16 @@ func (a *relativeAttribute) Resolve(vars Activation) (interface{}, error) { if types.IsUnknown(v) { return v, nil } - // Next, qualify it. Qualification handles unknowns as well, so there's no need to recheck. - var err error - var obj interface{} = v - for _, qual := range a.qualifiers { - obj, err = qual.Qualify(vars, obj) - if err != nil { - return nil, err + obj, isOpt, err := applyQualifiers(vars, v, a.qualifiers) + if err != nil { + return nil, err + } + if isOpt { + val := a.adapter.NativeToValue(obj) + if types.IsUnknown(val) { + return val, nil } + return types.OptionalOf(val), nil } return obj, nil } @@ -604,42 +576,93 @@ func (a *relativeAttribute) String() string { return fmt.Sprintf("id: %v, operand: %v", a.id, a.operand) } -func newQualifier(adapter ref.TypeAdapter, id int64, v interface{}) (Qualifier, error) { +func newQualifier(adapter ref.TypeAdapter, id int64, v any, opt bool) (Qualifier, error) { var qual Qualifier switch val := v.(type) { case Attribute: - return &attrQualifier{id: id, Attribute: val}, nil + // Note, attributes are initially identified as non-optional since they represent a top-level + // field access; however, when used as a relative qualifier, e.g. a[?b.c], then an attrQualifier + // is created which intercepts the IsOptional check for the attribute in order to return the + // correct result. + return &attrQualifier{ + id: id, + Attribute: val, + optional: opt, + }, nil case string: - qual = &stringQualifier{id: id, value: val, celValue: types.String(val), adapter: adapter} + qual = &stringQualifier{ + id: id, + value: val, + celValue: types.String(val), + adapter: adapter, + optional: opt, + } case int: - qual = &intQualifier{id: id, value: int64(val), celValue: types.Int(val), adapter: adapter} + qual = &intQualifier{ + id: id, value: int64(val), celValue: types.Int(val), adapter: adapter, optional: opt, + } case int32: - qual = &intQualifier{id: id, value: int64(val), celValue: types.Int(val), adapter: adapter} + qual = &intQualifier{ + id: id, value: int64(val), celValue: types.Int(val), adapter: adapter, optional: opt, + } case int64: - qual = &intQualifier{id: id, value: val, celValue: types.Int(val), adapter: adapter} + qual = &intQualifier{ + id: id, value: val, celValue: types.Int(val), adapter: adapter, optional: opt, + } case uint: - qual = &uintQualifier{id: id, value: uint64(val), celValue: types.Uint(val), adapter: adapter} + qual = &uintQualifier{ + id: id, value: uint64(val), celValue: types.Uint(val), adapter: adapter, optional: opt, + } case uint32: - qual = &uintQualifier{id: id, value: uint64(val), celValue: types.Uint(val), adapter: adapter} + qual = &uintQualifier{ + id: id, value: uint64(val), celValue: types.Uint(val), adapter: adapter, optional: opt, + } case uint64: - qual = &uintQualifier{id: id, value: val, celValue: types.Uint(val), adapter: adapter} + qual = &uintQualifier{ + id: id, value: val, celValue: types.Uint(val), adapter: adapter, optional: opt, + } case bool: - qual = &boolQualifier{id: id, value: val, celValue: types.Bool(val), adapter: adapter} + qual = &boolQualifier{ + id: id, value: val, celValue: types.Bool(val), adapter: adapter, optional: opt, + } case float32: - qual = &doubleQualifier{id: id, value: float64(val), celValue: types.Double(val), adapter: adapter} + qual = &doubleQualifier{ + id: id, + value: float64(val), + celValue: types.Double(val), + adapter: adapter, + optional: opt, + } case float64: - qual = &doubleQualifier{id: id, value: val, celValue: types.Double(val), adapter: adapter} + qual = &doubleQualifier{ + id: id, value: val, celValue: types.Double(val), adapter: adapter, optional: opt, + } case types.String: - qual = &stringQualifier{id: id, value: string(val), celValue: val, adapter: adapter} + qual = &stringQualifier{ + id: id, value: string(val), celValue: val, adapter: adapter, optional: opt, + } case types.Int: - qual = &intQualifier{id: id, value: int64(val), celValue: val, adapter: adapter} + qual = &intQualifier{ + id: id, value: int64(val), celValue: val, adapter: adapter, optional: opt, + } case types.Uint: - qual = &uintQualifier{id: id, value: uint64(val), celValue: val, adapter: adapter} + qual = &uintQualifier{ + id: id, value: uint64(val), celValue: val, adapter: adapter, optional: opt, + } case types.Bool: - qual = &boolQualifier{id: id, value: bool(val), celValue: val, adapter: adapter} + qual = &boolQualifier{ + id: id, value: bool(val), celValue: val, adapter: adapter, optional: opt, + } case types.Double: - qual = &doubleQualifier{id: id, value: float64(val), celValue: val, adapter: adapter} + qual = &doubleQualifier{ + id: id, value: float64(val), celValue: val, adapter: adapter, optional: opt, + } + case types.Unknown: + qual = &unknownQualifier{id: id, value: val} default: + if q, ok := v.(Qualifier); ok { + return q, nil + } return nil, fmt.Errorf("invalid qualifier type: %T", v) } return qual, nil @@ -648,15 +671,18 @@ func newQualifier(adapter ref.TypeAdapter, id int64, v interface{}) (Qualifier, type attrQualifier struct { id int64 Attribute + optional bool } +// ID implements the Qualifier interface method and returns the qualification instruction id +// rather than the attribute id. func (q *attrQualifier) ID() int64 { return q.id } -// Cost returns zero for constant field qualifiers -func (q *attrQualifier) Cost() (min, max int64) { - return estimateCost(q.Attribute) +// IsOptional implements the Qualifier interface method. +func (q *attrQualifier) IsOptional() bool { + return q.optional } type stringQualifier struct { @@ -664,6 +690,7 @@ type stringQualifier struct { value string celValue ref.Val adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -671,58 +698,87 @@ func (q *stringQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *stringQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *stringQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (q *stringQualifier) Qualify(vars Activation, obj any) (any, error) { + val, _, err := q.qualifyInternal(vars, obj, false, false) + return val, err +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *stringQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.qualifyInternal(vars, obj, true, presenceOnly) +} + +func (q *stringQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { s := q.value - isMap := false - isKey := false switch o := obj.(type) { - case map[string]interface{}: - isMap = true - obj, isKey = o[s] + case map[string]any: + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]string: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]int: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]int32: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]int64: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]uint: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]uint32: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]uint64: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]float32: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]float64: - isMap = true - obj, isKey = o[s] + obj, isKey := o[s] + if isKey { + return obj, true, nil + } case map[string]bool: - isMap = true - obj, isKey = o[s] - case types.Unknown: - return o, nil - default: - elem, err := refResolve(q.adapter, q.celValue, obj) - if err != nil { - return nil, err + obj, isKey := o[s] + if isKey { + return obj, true, nil } - return elem, nil + default: + return refQualify(q.adapter, obj, q.celValue, presenceTest, presenceOnly) } - if isMap && !isKey { - return nil, fmt.Errorf("no such key: %v", s) + if presenceTest { + return nil, false, nil } - return obj, nil + return nil, false, missingKey(q.celValue) } // Value implements the ConstantQualifier interface @@ -730,16 +786,12 @@ func (q *stringQualifier) Value() ref.Val { return q.celValue } -// Cost returns zero for constant field qualifiers -func (q *stringQualifier) Cost() (min, max int64) { - return 0, 0 -} - type intQualifier struct { id int64 value int64 celValue ref.Val adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -747,97 +799,113 @@ func (q *intQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *intQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *intQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (q *intQualifier) Qualify(vars Activation, obj any) (any, error) { + val, _, err := q.qualifyInternal(vars, obj, false, false) + return val, err +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *intQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.qualifyInternal(vars, obj, true, presenceOnly) +} + +func (q *intQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { i := q.value - isMap := false - isKey := false - isIndex := false + var isMap bool switch o := obj.(type) { // The specialized map types supported by an int qualifier are considerably fewer than the set // of specialized map types supported by string qualifiers since they are less frequently used // than string-based map keys. Additional specializations may be added in the future if // desired. - case map[int]interface{}: + case map[int]any: isMap = true - obj, isKey = o[int(i)] - case map[int32]interface{}: + obj, isKey := o[int(i)] + if isKey { + return obj, true, nil + } + case map[int32]any: isMap = true - obj, isKey = o[int32(i)] - case map[int64]interface{}: + obj, isKey := o[int32(i)] + if isKey { + return obj, true, nil + } + case map[int64]any: isMap = true - obj, isKey = o[i] - case []interface{}: - isIndex = i >= 0 && i < int64(len(o)) + obj, isKey := o[i] + if isKey { + return obj, true, nil + } + case []any: + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []string: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []int: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []int32: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []int64: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []uint: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []uint32: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []uint64: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []float32: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []float64: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } case []bool: - isIndex = i >= 0 && i < int64(len(o)) + isIndex := i >= 0 && i < int64(len(o)) if isIndex { - obj = o[i] + return o[i], true, nil } - case types.Unknown: - return o, nil default: - elem, err := refResolve(q.adapter, q.celValue, obj) - if err != nil { - return nil, err - } - return elem, nil + return refQualify(q.adapter, obj, q.celValue, presenceTest, presenceOnly) } - if isMap && !isKey { - return nil, fmt.Errorf("no such key: %v", i) + if presenceTest { + return nil, false, nil } - if !isMap && !isIndex { - return nil, fmt.Errorf("index out of bounds: %v", i) + if isMap { + return nil, false, missingKey(q.celValue) } - return obj, nil + return nil, false, missingIndex(q.celValue) } // Value implements the ConstantQualifier interface @@ -845,16 +913,12 @@ func (q *intQualifier) Value() ref.Val { return q.celValue } -// Cost returns zero for constant field qualifiers -func (q *intQualifier) Cost() (min, max int64) { - return 0, 0 -} - type uintQualifier struct { id int64 value uint64 celValue ref.Val adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -862,38 +926,51 @@ func (q *uintQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *uintQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *uintQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (q *uintQualifier) Qualify(vars Activation, obj any) (any, error) { + val, _, err := q.qualifyInternal(vars, obj, false, false) + return val, err +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *uintQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.qualifyInternal(vars, obj, true, presenceOnly) +} + +func (q *uintQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { u := q.value - isMap := false - isKey := false switch o := obj.(type) { // The specialized map types supported by a uint qualifier are considerably fewer than the set // of specialized map types supported by string qualifiers since they are less frequently used // than string-based map keys. Additional specializations may be added in the future if // desired. - case map[uint]interface{}: - isMap = true - obj, isKey = o[uint(u)] - case map[uint32]interface{}: - isMap = true - obj, isKey = o[uint32(u)] - case map[uint64]interface{}: - isMap = true - obj, isKey = o[u] - case types.Unknown: - return o, nil - default: - elem, err := refResolve(q.adapter, q.celValue, obj) - if err != nil { - return nil, err + case map[uint]any: + obj, isKey := o[uint(u)] + if isKey { + return obj, true, nil + } + case map[uint32]any: + obj, isKey := o[uint32(u)] + if isKey { + return obj, true, nil } - return elem, nil + case map[uint64]any: + obj, isKey := o[u] + if isKey { + return obj, true, nil + } + default: + return refQualify(q.adapter, obj, q.celValue, presenceTest, presenceOnly) } - if isMap && !isKey { - return nil, fmt.Errorf("no such key: %v", u) + if presenceTest { + return nil, false, nil } - return obj, nil + return nil, false, missingKey(q.celValue) } // Value implements the ConstantQualifier interface @@ -901,16 +978,12 @@ func (q *uintQualifier) Value() ref.Val { return q.celValue } -// Cost returns zero for constant field qualifiers -func (q *uintQualifier) Cost() (min, max int64) { - return 0, 0 -} - type boolQualifier struct { id int64 value bool celValue ref.Val adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -918,30 +991,37 @@ func (q *boolQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *boolQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *boolQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (q *boolQualifier) Qualify(vars Activation, obj any) (any, error) { + val, _, err := q.qualifyInternal(vars, obj, false, false) + return val, err +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *boolQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.qualifyInternal(vars, obj, true, presenceOnly) +} + +func (q *boolQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { b := q.value - isKey := false switch o := obj.(type) { - // The specialized map types supported by a bool qualifier are considerably fewer than the set - // of specialized map types supported by string qualifiers since they are less frequently used - // than string-based map keys. Additional specializations may be added in the future if - // desired. - case map[bool]interface{}: - obj, isKey = o[b] - case types.Unknown: - return o, nil - default: - elem, err := refResolve(q.adapter, q.celValue, obj) - if err != nil { - return nil, err + case map[bool]any: + obj, isKey := o[b] + if isKey { + return obj, true, nil } - return elem, nil + default: + return refQualify(q.adapter, obj, q.celValue, presenceTest, presenceOnly) } - if !isKey { - return nil, fmt.Errorf("no such key: %v", b) + if presenceTest { + return nil, false, nil } - return obj, nil + return nil, false, missingKey(q.celValue) } // Value implements the ConstantQualifier interface @@ -949,11 +1029,6 @@ func (q *boolQualifier) Value() ref.Val { return q.celValue } -// Cost returns zero for constant field qualifiers -func (q *boolQualifier) Cost() (min, max int64) { - return 0, 0 -} - // fieldQualifier indicates that the qualification is a well-defined field with a known // field type. When the field type is known this can be used to improve the speed and // efficiency of field resolution. @@ -962,6 +1037,7 @@ type fieldQualifier struct { Name string FieldType *ref.FieldType adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -969,12 +1045,39 @@ func (q *fieldQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *fieldQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *fieldQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (q *fieldQualifier) Qualify(vars Activation, obj any) (any, error) { if rv, ok := obj.(ref.Val); ok { obj = rv.Value() } - return q.FieldType.GetFrom(obj) + val, err := q.FieldType.GetFrom(obj) + if err != nil { + return nil, err + } + return val, nil +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *fieldQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + if rv, ok := obj.(ref.Val); ok { + obj = rv.Value() + } + if !q.FieldType.IsSet(obj) { + return nil, false, nil + } + if presenceOnly { + return nil, true, nil + } + val, err := q.FieldType.GetFrom(obj) + if err != nil { + return nil, false, err + } + return val, true, nil } // Value implements the ConstantQualifier interface @@ -982,11 +1085,6 @@ func (q *fieldQualifier) Value() ref.Val { return types.String(q.Name) } -// Cost returns zero for constant field qualifiers -func (q *fieldQualifier) Cost() (min, max int64) { - return 0, 0 -} - // doubleQualifier qualifies a CEL object, map, or list using a double value. // // This qualifier is used for working with dynamic data like JSON or protobuf.Any where the value @@ -997,6 +1095,7 @@ type doubleQualifier struct { value float64 celValue ref.Val adapter ref.TypeAdapter + optional bool } // ID is an implementation of the Qualifier interface method. @@ -1004,48 +1103,237 @@ func (q *doubleQualifier) ID() int64 { return q.id } +// IsOptional implements the Qualifier interface method. +func (q *doubleQualifier) IsOptional() bool { + return q.optional +} + // Qualify implements the Qualifier interface method. -func (q *doubleQualifier) Qualify(vars Activation, obj interface{}) (interface{}, error) { - switch o := obj.(type) { - case types.Unknown: - return o, nil - default: - elem, err := refResolve(q.adapter, q.celValue, obj) - if err != nil { - return nil, err +func (q *doubleQualifier) Qualify(vars Activation, obj any) (any, error) { + val, _, err := q.qualifyInternal(vars, obj, false, false) + return val, err +} + +func (q *doubleQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.qualifyInternal(vars, obj, true, presenceOnly) +} + +func (q *doubleQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { + return refQualify(q.adapter, obj, q.celValue, presenceTest, presenceOnly) +} + +// Value implements the ConstantQualifier interface +func (q *doubleQualifier) Value() ref.Val { + return q.celValue +} + +// unknownQualifier is a simple qualifier which always returns a preconfigured set of unknown values +// for any value subject to qualification. This is consistent with CEL's unknown handling elsewhere. +type unknownQualifier struct { + id int64 + value types.Unknown +} + +// ID is an implementation of the Qualifier interface method. +func (q *unknownQualifier) ID() int64 { + return q.id +} + +// IsOptional returns trivially false as an the unknown value is always returned. +func (q *unknownQualifier) IsOptional() bool { + return false +} + +// Qualify returns the unknown value associated with this qualifier. +func (q *unknownQualifier) Qualify(vars Activation, obj any) (any, error) { + return q.value, nil +} + +// QualifyIfPresent is an implementation of the Qualifier interface method. +func (q *unknownQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return q.value, true, nil +} + +// Value implements the ConstantQualifier interface +func (q *unknownQualifier) Value() ref.Val { + return q.value +} + +func applyQualifiers(vars Activation, obj any, qualifiers []Qualifier) (any, bool, error) { + optObj, isOpt := obj.(*types.Optional) + if isOpt { + if !optObj.HasValue() { + return optObj, false, nil } - return elem, nil + obj = optObj.GetValue().Value() } + + var err error + for _, qual := range qualifiers { + var qualObj any + isOpt = isOpt || qual.IsOptional() + if isOpt { + var present bool + qualObj, present, err = qual.QualifyIfPresent(vars, obj, false) + if err != nil { + return nil, false, err + } + if !present { + // We return optional none here with a presence of 'false' as the layers + // above will attempt to call types.OptionalOf() on a present value if any + // of the qualifiers is optional. + return types.OptionalNone, false, nil + } + } else { + qualObj, err = qual.Qualify(vars, obj) + if err != nil { + return nil, false, err + } + } + obj = qualObj + } + return obj, isOpt, nil +} + +// attrQualify performs a qualification using the result of an attribute evaluation. +func attrQualify(fac AttributeFactory, vars Activation, obj any, qualAttr Attribute) (any, error) { + val, err := qualAttr.Resolve(vars) + if err != nil { + return nil, err + } + qual, err := fac.NewQualifier(nil, qualAttr.ID(), val, qualAttr.IsOptional()) + if err != nil { + return nil, err + } + return qual.Qualify(vars, obj) } -// refResolve attempts to convert the value to a CEL value and then uses reflection methods -// to try and resolve the qualifier. -func refResolve(adapter ref.TypeAdapter, idx ref.Val, obj interface{}) (ref.Val, error) { +// attrQualifyIfPresent conditionally performs the qualification of the result of attribute is present +// on the target object. +func attrQualifyIfPresent(fac AttributeFactory, vars Activation, obj any, qualAttr Attribute, + presenceOnly bool) (any, bool, error) { + val, err := qualAttr.Resolve(vars) + if err != nil { + return nil, false, err + } + qual, err := fac.NewQualifier(nil, qualAttr.ID(), val, qualAttr.IsOptional()) + if err != nil { + return nil, false, err + } + return qual.QualifyIfPresent(vars, obj, presenceOnly) +} + +// refQualify attempts to convert the value to a CEL value and then uses reflection methods to try and +// apply the qualifier with the option to presence test field accesses before retrieving field values. +func refQualify(adapter ref.TypeAdapter, obj any, idx ref.Val, presenceTest, presenceOnly bool) (ref.Val, bool, error) { celVal := adapter.NativeToValue(obj) - mapper, isMapper := celVal.(traits.Mapper) - if isMapper { - elem, found := mapper.Find(idx) - if !found { - return nil, fmt.Errorf("no such key: %v", idx) + switch v := celVal.(type) { + case types.Unknown: + return v, true, nil + case *types.Err: + return nil, false, v + case traits.Mapper: + val, found := v.Find(idx) + // If the index is of the wrong type for the map, then it is possible + // for the Find call to produce an error. + if types.IsError(val) { + return nil, false, val.(*types.Err) } - return elem, nil - } - indexer, isIndexer := celVal.(traits.Indexer) - if isIndexer { - elem := indexer.Get(idx) - if types.IsError(elem) { - return nil, elem.(*types.Err) + if found { + return val, true, nil + } + if presenceTest { + return nil, false, nil + } + return nil, false, missingKey(idx) + case traits.Lister: + // If the index argument is not a valid numeric type, then it is possible + // for the index operation to produce an error. + i, err := types.IndexOrError(idx) + if err != nil { + return nil, false, err + } + celIndex := types.Int(i) + if i >= 0 && celIndex < v.Size().(types.Int) { + return v.Get(idx), true, nil + } + if presenceTest { + return nil, false, nil + } + return nil, false, missingIndex(idx) + case traits.Indexer: + if presenceTest { + ft, ok := v.(traits.FieldTester) + if ok { + presence := ft.IsSet(idx) + if types.IsError(presence) { + return nil, false, presence.(*types.Err) + } + // If not found or presence only test, then return. + // Otherwise, if found, obtain the value later on. + if presenceOnly || presence == types.False { + return nil, presence == types.True, nil + } + } + } + val := v.Get(idx) + if types.IsError(val) { + return nil, false, val.(*types.Err) + } + return val, true, nil + default: + if presenceTest { + return nil, false, nil } - return elem, nil + return nil, false, missingKey(idx) } - if types.IsUnknown(celVal) { - return celVal, nil +} + +// resolutionError is a custom error type which encodes the different error states which may +// occur during attribute resolution. +type resolutionError struct { + missingAttribute string + missingIndex ref.Val + missingKey ref.Val +} + +func (e *resolutionError) isMissingAttribute() bool { + return e.missingAttribute != "" +} + +func missingIndex(missing ref.Val) *resolutionError { + return &resolutionError{ + missingIndex: missing, + } +} + +func missingKey(missing ref.Val) *resolutionError { + return &resolutionError{ + missingKey: missing, } - // TODO: If the types.Err value contains more than just an error message at some point in the - // future, then it would be reasonable to return error values as ref.Val types rather than - // simple go error types. - if types.IsError(celVal) { - return nil, celVal.(*types.Err) +} + +func missingAttribute(attr string) *resolutionError { + return &resolutionError{ + missingAttribute: attr, + } +} + +// Error implements the error interface method. +func (e *resolutionError) Error() string { + if e.missingKey != nil { + return fmt.Sprintf("no such key: %v", e.missingKey) } - return nil, fmt.Errorf("no such key: %v", idx) + if e.missingIndex != nil { + return fmt.Sprintf("index out of bounds: %v", e.missingIndex) + } + if e.missingAttribute != "" { + return fmt.Sprintf("no such attribute(s): %s", e.missingAttribute) + } + return "invalid attribute" +} + +// Is implements the errors.Is() method used by more recent versions of Go. +func (e *resolutionError) Is(err error) bool { + return err.Error() == e.Error() } diff --git a/tools/vendor/github.com/google/cel-go/interpreter/decorators.go b/tools/vendor/github.com/google/cel-go/interpreter/decorators.go index bdbbad43e..208487b7d 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/decorators.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/decorators.go @@ -29,7 +29,7 @@ type InterpretableDecorator func(Interpretable) (Interpretable, error) func decObserveEval(observer EvalObserver) InterpretableDecorator { return func(i Interpretable) (Interpretable, error) { switch inst := i.(type) { - case *evalWatch, *evalWatchAttr, *evalWatchConst: + case *evalWatch, *evalWatchAttr, *evalWatchConst, *evalWatchConstructor: // these instruction are already watching, return straight-away. return i, nil case InterpretableAttribute: @@ -42,6 +42,11 @@ func decObserveEval(observer EvalObserver) InterpretableDecorator { InterpretableConst: inst, observer: observer, }, nil + case InterpretableConstructor: + return &evalWatchConstructor{ + constructor: inst, + observer: observer, + }, nil default: return &evalWatch{ Interpretable: i, @@ -224,8 +229,8 @@ func maybeOptimizeSetMembership(i Interpretable, inlist InterpretableCall) (Inte valueSet := make(map[ref.Val]ref.Val) for it.HasNext() == types.True { elem := it.Next() - if !types.IsPrimitiveType(elem) { - // Note, non-primitive type are not yet supported. + if !types.IsPrimitiveType(elem) || elem.Type() == types.BytesType { + // Note, non-primitive type are not yet supported, and []byte isn't hashable. return i, nil } valueSet[elem] = types.True diff --git a/tools/vendor/github.com/google/cel-go/interpreter/formatting.go b/tools/vendor/github.com/google/cel-go/interpreter/formatting.go new file mode 100644 index 000000000..6a98f6fa5 --- /dev/null +++ b/tools/vendor/github.com/google/cel-go/interpreter/formatting.go @@ -0,0 +1,383 @@ +// 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package interpreter + +import ( + "errors" + "fmt" + "strconv" + "strings" + "unicode" + + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" +) + +type typeVerifier func(int64, ...*types.TypeValue) (bool, error) + +// InterpolateFormattedString checks the syntax and cardinality of any string.format calls present in the expression and reports +// any errors at compile time. +func InterpolateFormattedString(verifier typeVerifier) InterpretableDecorator { + return func(inter Interpretable) (Interpretable, error) { + call, ok := inter.(InterpretableCall) + if !ok { + return inter, nil + } + if call.OverloadID() != "string_format" { + return inter, nil + } + args := call.Args() + if len(args) != 2 { + return nil, fmt.Errorf("wrong number of arguments to string.format (expected 2, got %d)", len(args)) + } + fmtStrInter, ok := args[0].(InterpretableConst) + if !ok { + return inter, nil + } + var fmtArgsInter InterpretableConstructor + fmtArgsInter, ok = args[1].(InterpretableConstructor) + if !ok { + return inter, nil + } + if fmtArgsInter.Type() != types.ListType { + // don't necessarily return an error since the list may be DynType + return inter, nil + } + formatStr := fmtStrInter.Value().Value().(string) + initVals := fmtArgsInter.InitVals() + + formatCheck := &formatCheck{ + args: initVals, + verifier: verifier, + } + // use a placeholder locale, since locale doesn't affect syntax + _, err := ParseFormatString(formatStr, formatCheck, formatCheck, "en_US") + if err != nil { + return nil, err + } + seenArgs := formatCheck.argsRequested + if len(initVals) > seenArgs { + return nil, fmt.Errorf("too many arguments supplied to string.format (expected %d, got %d)", seenArgs, len(initVals)) + } + return inter, nil + } +} + +type formatCheck struct { + args []Interpretable + argsRequested int + curArgIndex int64 + enableCheckArgTypes bool + verifier typeVerifier +} + +func (c *formatCheck) String(arg ref.Val, locale string) (string, error) { + valid, err := verifyString(c.args[c.curArgIndex], c.verifier) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("string clause can only be used on strings, bools, bytes, ints, doubles, maps, lists, types, durations, and timestamps") + } + return "", nil +} + +func (c *formatCheck) Decimal(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + valid, err := c.verifier(id, types.IntType, types.UintType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("integer clause can only be used on integers") + } + return "", nil +} + +func (c *formatCheck) Fixed(precision *int) func(ref.Val, string) (string, error) { + return func(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + // we allow StringType since "NaN", "Infinity", and "-Infinity" are also valid values + valid, err := c.verifier(id, types.DoubleType, types.StringType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("fixed-point clause can only be used on doubles") + } + return "", nil + } +} + +func (c *formatCheck) Scientific(precision *int) func(ref.Val, string) (string, error) { + return func(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + valid, err := c.verifier(id, types.DoubleType, types.StringType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("scientific clause can only be used on doubles") + } + return "", nil + } +} + +func (c *formatCheck) Binary(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + valid, err := c.verifier(id, types.IntType, types.UintType, types.BoolType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("only integers and bools can be formatted as binary") + } + return "", nil +} + +func (c *formatCheck) Hex(useUpper bool) func(ref.Val, string) (string, error) { + return func(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + valid, err := c.verifier(id, types.IntType, types.UintType, types.StringType, types.BytesType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("only integers, byte buffers, and strings can be formatted as hex") + } + return "", nil + } +} + +func (c *formatCheck) Octal(arg ref.Val, locale string) (string, error) { + id := c.args[c.curArgIndex].ID() + valid, err := c.verifier(id, types.IntType, types.UintType) + if err != nil { + return "", err + } + if !valid { + return "", errors.New("octal clause can only be used on integers") + } + return "", nil +} + +func (c *formatCheck) Arg(index int64) (ref.Val, error) { + c.argsRequested++ + c.curArgIndex = index + // return a dummy value - this is immediately passed to back to us + // through one of the FormatCallback functions, so anything will do + return types.Int(0), nil +} + +func (c *formatCheck) ArgSize() int64 { + return int64(len(c.args)) +} + +func verifyString(sub Interpretable, verifier typeVerifier) (bool, error) { + subVerified, err := verifier(sub.ID(), + types.ListType, types.MapType, types.IntType, types.UintType, types.DoubleType, + types.BoolType, types.StringType, types.TimestampType, types.BytesType, types.DurationType, types.TypeType, types.NullType) + if err != nil { + return false, err + } + if !subVerified { + return false, nil + } + con, ok := sub.(InterpretableConstructor) + if ok { + members := con.InitVals() + for _, m := range members { + // recursively verify if we're dealing with a list/map + verified, err := verifyString(m, verifier) + if err != nil { + return false, err + } + if !verified { + return false, nil + } + } + } + return true, nil + +} + +// FormatStringInterpolator is an interface that allows user-defined behavior +// for formatting clause implementations, as well as argument retrieval. +// Each function is expected to support the appropriate types as laid out in +// the string.format documentation, and to return an error if given an inappropriate type. +type FormatStringInterpolator interface { + // String takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a string, or an error if one occurred. + String(ref.Val, string) (string, error) + + // Decimal takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a decimal integer, or an error if one occurred. + Decimal(ref.Val, string) (string, error) + + // Fixed takes an int pointer representing precision (or nil if none was given) and + // returns a function operating in a similar manner to String and Decimal, taking a + // ref.Val and locale and returning the appropriate string. A closure is returned + // so precision can be set without needing an additional function call/configuration. + Fixed(*int) func(ref.Val, string) (string, error) + + // Scientific functions identically to Fixed, except the string returned from the closure + // is expected to be in scientific notation. + Scientific(*int) func(ref.Val, string) (string, error) + + // Binary takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a binary integer, or an error if one occurred. + Binary(ref.Val, string) (string, error) + + // Hex takes a boolean that, if true, indicates the hex string output by the returned + // closure should use uppercase letters for A-F. + Hex(bool) func(ref.Val, string) (string, error) + + // Octal takes a ref.Val and a string representing the current locale identifier and + // returns the Val formatted in octal, or an error if one occurred. + Octal(ref.Val, string) (string, error) +} + +// FormatList is an interface that allows user-defined list-like datatypes to be used +// for formatting clause implementations. +type FormatList interface { + // Arg returns the ref.Val at the given index, or an error if one occurred. + Arg(int64) (ref.Val, error) + // ArgSize returns the length of the argument list. + ArgSize() int64 +} + +type clauseImpl func(ref.Val, string) (string, error) + +// ParseFormatString formats a string according to the string.format syntax, taking the clause implementations +// from the provided FormatCallback and the args from the given FormatList. +func ParseFormatString(formatStr string, callback FormatStringInterpolator, list FormatList, locale string) (string, error) { + i := 0 + argIndex := 0 + var builtStr strings.Builder + for i < len(formatStr) { + if formatStr[i] == '%' { + if i+1 < len(formatStr) && formatStr[i+1] == '%' { + err := builtStr.WriteByte('%') + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i += 2 + continue + } else { + argAny, err := list.Arg(int64(argIndex)) + if err != nil { + return "", err + } + if i+1 >= len(formatStr) { + return "", errors.New("unexpected end of string") + } + if int64(argIndex) >= list.ArgSize() { + return "", fmt.Errorf("index %d out of range", argIndex) + } + numRead, val, refErr := parseAndFormatClause(formatStr[i:], argAny, callback, list, locale) + if refErr != nil { + return "", refErr + } + _, err = builtStr.WriteString(val) + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i += numRead + argIndex++ + } + } else { + err := builtStr.WriteByte(formatStr[i]) + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i++ + } + } + return builtStr.String(), nil +} + +// parseAndFormatClause parses the format clause at the start of the given string with val, and returns +// how many characters were consumed and the substituted string form of val, or an error if one occurred. +func parseAndFormatClause(formatStr string, val ref.Val, callback FormatStringInterpolator, list FormatList, locale string) (int, string, error) { + i := 1 + read, formatter, err := parseFormattingClause(formatStr[i:], callback) + i += read + if err != nil { + return -1, "", fmt.Errorf("could not parse formatting clause: %s", err) + } + + valStr, err := formatter(val, locale) + if err != nil { + return -1, "", fmt.Errorf("error during formatting: %s", err) + } + return i, valStr, nil +} + +func parseFormattingClause(formatStr string, callback FormatStringInterpolator) (int, clauseImpl, error) { + i := 0 + read, precision, err := parsePrecision(formatStr[i:]) + i += read + if err != nil { + return -1, nil, fmt.Errorf("error while parsing precision: %w", err) + } + r := rune(formatStr[i]) + i++ + switch r { + case 's': + return i, callback.String, nil + case 'd': + return i, callback.Decimal, nil + case 'f': + return i, callback.Fixed(precision), nil + case 'e': + return i, callback.Scientific(precision), nil + case 'b': + return i, callback.Binary, nil + case 'x', 'X': + return i, callback.Hex(unicode.IsUpper(r)), nil + case 'o': + return i, callback.Octal, nil + default: + return -1, nil, fmt.Errorf("unrecognized formatting clause \"%c\"", r) + } +} + +func parsePrecision(formatStr string) (int, *int, error) { + i := 0 + if formatStr[i] != '.' { + return i, nil, nil + } + i++ + var buffer strings.Builder + for { + if i >= len(formatStr) { + return -1, nil, errors.New("could not find end of precision specifier") + } + if !isASCIIDigit(rune(formatStr[i])) { + break + } + buffer.WriteByte(formatStr[i]) + i++ + } + precision, err := strconv.Atoi(buffer.String()) + if err != nil { + return -1, nil, fmt.Errorf("error while converting precision to integer: %w", err) + } + return i, &precision, nil +} + +func isASCIIDigit(r rune) bool { + return r <= unicode.MaxASCII && unicode.IsDigit(r) +} diff --git a/tools/vendor/github.com/google/cel-go/interpreter/functions/functions.go b/tools/vendor/github.com/google/cel-go/interpreter/functions/functions.go index dd1e9ddd5..981601752 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/functions/functions.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/functions/functions.go @@ -58,5 +58,5 @@ type UnaryOp func(value ref.Val) ref.Val type BinaryOp func(lhs ref.Val, rhs ref.Val) ref.Val // FunctionOp is a function with accepts zero or more arguments and produces -// an value (as interface{}) or error as a result. +// a value or error as a result. type FunctionOp func(values ...ref.Val) ref.Val diff --git a/tools/vendor/github.com/google/cel-go/interpreter/interpretable.go b/tools/vendor/github.com/google/cel-go/interpreter/interpretable.go index 4fdd12028..32e2bcb7d 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/interpretable.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/interpretable.go @@ -15,7 +15,7 @@ package interpreter import ( - "math" + "fmt" "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/overloads" @@ -64,10 +64,18 @@ type InterpretableAttribute interface { // Qualify replicates the Attribute.Qualify method to permit extension and interception // of object qualification. - Qualify(vars Activation, obj interface{}) (interface{}, error) + Qualify(vars Activation, obj any) (any, error) + + // QualifyIfPresent qualifies the object if the qualifier is declared or defined on the object. + // The 'presenceOnly' flag indicates that the value is not necessary, just a boolean status as + // to whether the qualifier is present. + QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) + + // IsOptional indicates whether the resulting value is an optional type. + IsOptional() bool // Resolve returns the value of the Attribute given the current Activation. - Resolve(Activation) (interface{}, error) + Resolve(Activation) (any, error) } // InterpretableCall interface for inspecting Interpretable instructions related to function calls. @@ -103,10 +111,8 @@ type InterpretableConstructor interface { // Core Interpretable implementations used during the program planning phase. type evalTestOnly struct { - id int64 - op Interpretable - field types.String - fieldType *ref.FieldType + id int64 + InterpretableAttribute } // ID implements the Interpretable interface method. @@ -116,44 +122,55 @@ func (test *evalTestOnly) ID() int64 { // Eval implements the Interpretable interface method. func (test *evalTestOnly) Eval(ctx Activation) ref.Val { - // Handle field selection on a proto in the most efficient way possible. - if test.fieldType != nil { - opAttr, ok := test.op.(InterpretableAttribute) - if ok { - opVal, err := opAttr.Resolve(ctx) - if err != nil { - return types.NewErr(err.Error()) - } - refVal, ok := opVal.(ref.Val) - if ok { - opVal = refVal.Value() - } - if test.fieldType.IsSet(opVal) { - return types.True - } - return types.False - } + val, err := test.Resolve(ctx) + // Return an error if the resolve step fails + if err != nil { + return types.WrapErr(err) } + if optVal, isOpt := val.(*types.Optional); isOpt { + return types.Bool(optVal.HasValue()) + } + return test.Adapter().NativeToValue(val) +} + +// AddQualifier appends a qualifier that will always and only perform a presence test. +func (test *evalTestOnly) AddQualifier(q Qualifier) (Attribute, error) { + cq, ok := q.(ConstantQualifier) + if !ok { + return nil, fmt.Errorf("test only expressions must have constant qualifiers: %v", q) + } + return test.InterpretableAttribute.AddQualifier(&testOnlyQualifier{ConstantQualifier: cq}) +} + +type testOnlyQualifier struct { + ConstantQualifier +} - obj := test.op.Eval(ctx) - tester, ok := obj.(traits.FieldTester) - if ok { - return tester.IsSet(test.field) +// Qualify determines whether the test-only qualifier is present on the input object. +func (q *testOnlyQualifier) Qualify(vars Activation, obj any) (any, error) { + out, present, err := q.ConstantQualifier.QualifyIfPresent(vars, obj, true) + if err != nil { + return nil, err + } + if unk, isUnk := out.(types.Unknown); isUnk { + return unk, nil } - container, ok := obj.(traits.Container) - if ok { - return container.Contains(test.field) + if opt, isOpt := out.(types.Optional); isOpt { + return opt.HasValue(), nil } - return types.ValOrErr(obj, "invalid type for field selection.") + return present, nil } -// Cost provides the heuristic cost of a `has(field)` macro. The cost has at least 1 for determining -// if the field exists, apart from the cost of accessing the field. -func (test *evalTestOnly) Cost() (min, max int64) { - min, max = estimateCost(test.op) - min++ - max++ - return +// QualifyIfPresent returns whether the target field in the test-only expression is present. +func (q *testOnlyQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + // Only ever test for presence. + return q.ConstantQualifier.QualifyIfPresent(vars, obj, true) +} + +// QualifierValueEquals determines whether the test-only constant qualifier equals the input value. +func (q *testOnlyQualifier) QualifierValueEquals(value any) bool { + // The input qualifier will always be of type string + return q.ConstantQualifier.Value().Value() == value } // NewConstValue creates a new constant valued Interpretable. @@ -179,11 +196,6 @@ func (cons *evalConst) Eval(ctx Activation) ref.Val { return cons.val } -// Cost returns zero for a constant valued Interpretable. -func (cons *evalConst) Cost() (min, max int64) { - return 0, 0 -} - // Value implements the InterpretableConst interface method. func (cons *evalConst) Value() ref.Val { return cons.val @@ -233,12 +245,6 @@ func (or *evalOr) Eval(ctx Activation) ref.Val { return types.ValOrErr(rVal, "no such overload") } -// Cost implements the Coster interface method. The minimum possible cost incurs when the left-hand -// side expr is sufficient in determining the evaluation result. -func (or *evalOr) Cost() (min, max int64) { - return calShortCircuitBinaryOpsCost(or.lhs, or.rhs) -} - type evalAnd struct { id int64 lhs Interpretable @@ -283,18 +289,6 @@ func (and *evalAnd) Eval(ctx Activation) ref.Val { return types.ValOrErr(rVal, "no such overload") } -// Cost implements the Coster interface method. The minimum possible cost incurs when the left-hand -// side expr is sufficient in determining the evaluation result. -func (and *evalAnd) Cost() (min, max int64) { - return calShortCircuitBinaryOpsCost(and.lhs, and.rhs) -} - -func calShortCircuitBinaryOpsCost(lhs, rhs Interpretable) (min, max int64) { - lMin, lMax := estimateCost(lhs) - _, rMax := estimateCost(rhs) - return lMin, lMax + rMax + 1 -} - type evalEq struct { id int64 lhs Interpretable @@ -319,11 +313,6 @@ func (eq *evalEq) Eval(ctx Activation) ref.Val { return types.Equal(lVal, rVal) } -// Cost implements the Coster interface method. -func (eq *evalEq) Cost() (min, max int64) { - return calExhaustiveBinaryOpsCost(eq.lhs, eq.rhs) -} - // Function implements the InterpretableCall interface method. func (*evalEq) Function() string { return operators.Equals @@ -363,11 +352,6 @@ func (ne *evalNe) Eval(ctx Activation) ref.Val { return types.Bool(types.Equal(lVal, rVal) != types.True) } -// Cost implements the Coster interface method. -func (ne *evalNe) Cost() (min, max int64) { - return calExhaustiveBinaryOpsCost(ne.lhs, ne.rhs) -} - // Function implements the InterpretableCall interface method. func (*evalNe) Function() string { return operators.NotEquals @@ -400,11 +384,6 @@ func (zero *evalZeroArity) Eval(ctx Activation) ref.Val { return zero.impl() } -// Cost returns 1 representing the heuristic cost of the function. -func (zero *evalZeroArity) Cost() (min, max int64) { - return 1, 1 -} - // Function implements the InterpretableCall interface method. func (zero *evalZeroArity) Function() string { return zero.function @@ -456,14 +435,6 @@ func (un *evalUnary) Eval(ctx Activation) ref.Val { return types.NewErr("no such overload: %s", un.function) } -// Cost implements the Coster interface method. -func (un *evalUnary) Cost() (min, max int64) { - min, max = estimateCost(un.arg) - min++ // add cost for function - max++ - return -} - // Function implements the InterpretableCall interface method. func (un *evalUnary) Function() string { return un.function @@ -522,11 +493,6 @@ func (bin *evalBinary) Eval(ctx Activation) ref.Val { return types.NewErr("no such overload: %s", bin.function) } -// Cost implements the Coster interface method. -func (bin *evalBinary) Cost() (min, max int64) { - return calExhaustiveBinaryOpsCost(bin.lhs, bin.rhs) -} - // Function implements the InterpretableCall interface method. func (bin *evalBinary) Function() string { return bin.function @@ -593,14 +559,6 @@ func (fn *evalVarArgs) Eval(ctx Activation) ref.Val { return types.NewErr("no such overload: %s", fn.function) } -// Cost implements the Coster interface method. -func (fn *evalVarArgs) Cost() (min, max int64) { - min, max = sumOfCost(fn.args) - min++ // add cost for function - max++ - return -} - // Function implements the InterpretableCall interface method. func (fn *evalVarArgs) Function() string { return fn.function @@ -617,9 +575,11 @@ func (fn *evalVarArgs) Args() []Interpretable { } type evalList struct { - id int64 - elems []Interpretable - adapter ref.TypeAdapter + id int64 + elems []Interpretable + optionals []bool + hasOptionals bool + adapter ref.TypeAdapter } // ID implements the Interpretable interface method. @@ -629,14 +589,24 @@ func (l *evalList) ID() int64 { // Eval implements the Interpretable interface method. func (l *evalList) Eval(ctx Activation) ref.Val { - elemVals := make([]ref.Val, len(l.elems)) + elemVals := make([]ref.Val, 0, len(l.elems)) // If any argument is unknown or error early terminate. for i, elem := range l.elems { elemVal := elem.Eval(ctx) if types.IsUnknownOrError(elemVal) { return elemVal } - elemVals[i] = elemVal + if l.hasOptionals && l.optionals[i] { + optVal, ok := elemVal.(*types.Optional) + if !ok { + return invalidOptionalElementInit(elemVal) + } + if !optVal.HasValue() { + continue + } + elemVal = optVal.GetValue() + } + elemVals = append(elemVals, elemVal) } return l.adapter.NativeToValue(elemVals) } @@ -649,16 +619,13 @@ func (l *evalList) Type() ref.Type { return types.ListType } -// Cost implements the Coster interface method. -func (l *evalList) Cost() (min, max int64) { - return sumOfCost(l.elems) -} - type evalMap struct { - id int64 - keys []Interpretable - vals []Interpretable - adapter ref.TypeAdapter + id int64 + keys []Interpretable + vals []Interpretable + optionals []bool + hasOptionals bool + adapter ref.TypeAdapter } // ID implements the Interpretable interface method. @@ -679,6 +646,17 @@ func (m *evalMap) Eval(ctx Activation) ref.Val { if types.IsUnknownOrError(valVal) { return valVal } + if m.hasOptionals && m.optionals[i] { + optVal, ok := valVal.(*types.Optional) + if !ok { + return invalidOptionalEntryInit(keyVal, valVal) + } + if !optVal.HasValue() { + delete(entries, keyVal) + continue + } + valVal = optVal.GetValue() + } entries[keyVal] = valVal } return m.adapter.NativeToValue(entries) @@ -704,19 +682,14 @@ func (m *evalMap) Type() ref.Type { return types.MapType } -// Cost implements the Coster interface method. -func (m *evalMap) Cost() (min, max int64) { - kMin, kMax := sumOfCost(m.keys) - vMin, vMax := sumOfCost(m.vals) - return kMin + vMin, kMax + vMax -} - type evalObj struct { - id int64 - typeName string - fields []string - vals []Interpretable - provider ref.TypeProvider + id int64 + typeName string + fields []string + vals []Interpretable + optionals []bool + hasOptionals bool + provider ref.TypeProvider } // ID implements the Interpretable interface method. @@ -733,6 +706,17 @@ func (o *evalObj) Eval(ctx Activation) ref.Val { if types.IsUnknownOrError(val) { return val } + if o.hasOptionals && o.optionals[i] { + optVal, ok := val.(*types.Optional) + if !ok { + return invalidOptionalEntryInit(field, val) + } + if !optVal.HasValue() { + delete(fieldVals, field) + continue + } + val = optVal.GetValue() + } fieldVals[field] = val } return o.provider.NewValue(o.typeName, fieldVals) @@ -746,21 +730,6 @@ func (o *evalObj) Type() ref.Type { return types.NewObjectTypeValue(o.typeName) } -// Cost implements the Coster interface method. -func (o *evalObj) Cost() (min, max int64) { - return sumOfCost(o.vals) -} - -func sumOfCost(interps []Interpretable) (min, max int64) { - min, max = 0, 0 - for _, in := range interps { - minT, maxT := estimateCost(in) - min += minT - max += maxT - } - return -} - type evalFold struct { id int64 accuVar string @@ -842,38 +811,6 @@ func (fold *evalFold) Eval(ctx Activation) ref.Val { return res } -// Cost implements the Coster interface method. -func (fold *evalFold) Cost() (min, max int64) { - // Compute the cost for evaluating iterRange. - iMin, iMax := estimateCost(fold.iterRange) - - // Compute the size of iterRange. If the size depends on the input, return the maximum possible - // cost range. - foldRange := fold.iterRange.Eval(EmptyActivation()) - if !foldRange.Type().HasTrait(traits.IterableType) { - return 0, math.MaxInt64 - } - var rangeCnt int64 - it := foldRange.(traits.Iterable).Iterator() - for it.HasNext() == types.True { - it.Next() - rangeCnt++ - } - aMin, aMax := estimateCost(fold.accu) - cMin, cMax := estimateCost(fold.cond) - sMin, sMax := estimateCost(fold.step) - rMin, rMax := estimateCost(fold.result) - if fold.exhaustive { - cMin = cMin * rangeCnt - sMin = sMin * rangeCnt - } - - // The cond and step costs are multiplied by size(iterRange). The minimum possible cost incurs - // when the evaluation result can be determined by the first iteration. - return iMin + aMin + cMin + sMin + rMin, - iMax + aMax + cMax*rangeCnt + sMax*rangeCnt + rMax -} - // Optional Interpretable implementations that specialize, subsume, or extend the core evaluation // plan via decorators. @@ -893,17 +830,15 @@ func (e *evalSetMembership) ID() int64 { // Eval implements the Interpretable interface method. func (e *evalSetMembership) Eval(ctx Activation) ref.Val { val := e.arg.Eval(ctx) + if types.IsUnknownOrError(val) { + return val + } if ret, found := e.valueSet[val]; found { return ret } return types.False } -// Cost implements the Coster interface method. -func (e *evalSetMembership) Cost() (min, max int64) { - return estimateCost(e.arg) -} - // evalWatch is an Interpretable implementation that wraps the execution of a given // expression so that it may observe the computed value and send it to an observer. type evalWatch struct { @@ -918,15 +853,10 @@ func (e *evalWatch) Eval(ctx Activation) ref.Val { return val } -// Cost implements the Coster interface method. -func (e *evalWatch) Cost() (min, max int64) { - return estimateCost(e.Interpretable) -} - -// evalWatchAttr describes a watcher of an instAttr Interpretable. +// evalWatchAttr describes a watcher of an InterpretableAttribute Interpretable. // // Since the watcher may be selected against at a later stage in program planning, the watcher -// must implement the instAttr interface by proxy. +// must implement the InterpretableAttribute interface by proxy. type evalWatchAttr struct { InterpretableAttribute observer EvalObserver @@ -953,11 +883,6 @@ func (e *evalWatchAttr) AddQualifier(q Qualifier) (Attribute, error) { return e, err } -// Cost implements the Coster interface method. -func (e *evalWatchAttr) Cost() (min, max int64) { - return estimateCost(e.InterpretableAttribute) -} - // Eval implements the Interpretable interface method. func (e *evalWatchAttr) Eval(vars Activation) ref.Val { val := e.InterpretableAttribute.Eval(vars) @@ -973,17 +898,12 @@ type evalWatchConstQual struct { adapter ref.TypeAdapter } -// Cost implements the Coster interface method. -func (e *evalWatchConstQual) Cost() (min, max int64) { - return estimateCost(e.ConstantQualifier) -} - // Qualify observes the qualification of a object via a constant boolean, int, string, or uint. -func (e *evalWatchConstQual) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (e *evalWatchConstQual) Qualify(vars Activation, obj any) (any, error) { out, err := e.ConstantQualifier.Qualify(vars, obj) var val ref.Val if err != nil { - val = types.NewErr(err.Error()) + val = types.WrapErr(err) } else { val = e.adapter.NativeToValue(out) } @@ -991,8 +911,25 @@ func (e *evalWatchConstQual) Qualify(vars Activation, obj interface{}) (interfac return out, err } +// QualifyIfPresent conditionally qualifies the variable and only records a value if one is present. +func (e *evalWatchConstQual) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + out, present, err := e.ConstantQualifier.QualifyIfPresent(vars, obj, presenceOnly) + var val ref.Val + if err != nil { + val = types.WrapErr(err) + } else if out != nil { + val = e.adapter.NativeToValue(out) + } else if presenceOnly { + val = types.Bool(present) + } + if present || presenceOnly { + e.observer(e.ID(), e.ConstantQualifier, val) + } + return out, present, err +} + // QualifierValueEquals tests whether the incoming value is equal to the qualifying constant. -func (e *evalWatchConstQual) QualifierValueEquals(value interface{}) bool { +func (e *evalWatchConstQual) QualifierValueEquals(value any) bool { qve, ok := e.ConstantQualifier.(qualifierValueEquator) return ok && qve.QualifierValueEquals(value) } @@ -1004,17 +941,12 @@ type evalWatchQual struct { adapter ref.TypeAdapter } -// Cost implements the Coster interface method. -func (e *evalWatchQual) Cost() (min, max int64) { - return estimateCost(e.Qualifier) -} - // Qualify observes the qualification of a object via a value computed at runtime. -func (e *evalWatchQual) Qualify(vars Activation, obj interface{}) (interface{}, error) { +func (e *evalWatchQual) Qualify(vars Activation, obj any) (any, error) { out, err := e.Qualifier.Qualify(vars, obj) var val ref.Val if err != nil { - val = types.NewErr(err.Error()) + val = types.WrapErr(err) } else { val = e.adapter.NativeToValue(out) } @@ -1022,6 +954,23 @@ func (e *evalWatchQual) Qualify(vars Activation, obj interface{}) (interface{}, return out, err } +// QualifyIfPresent conditionally qualifies the variable and only records a value if one is present. +func (e *evalWatchQual) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + out, present, err := e.Qualifier.QualifyIfPresent(vars, obj, presenceOnly) + var val ref.Val + if err != nil { + val = types.WrapErr(err) + } else if out != nil { + val = e.adapter.NativeToValue(out) + } else if presenceOnly { + val = types.Bool(present) + } + if present || presenceOnly { + e.observer(e.ID(), e.Qualifier, val) + } + return out, present, err +} + // evalWatchConst describes a watcher of an instConst Interpretable. type evalWatchConst struct { InterpretableConst @@ -1035,11 +984,6 @@ func (e *evalWatchConst) Eval(vars Activation) ref.Val { return val } -// Cost implements the Coster interface method. -func (e *evalWatchConst) Cost() (min, max int64) { - return estimateCost(e.InterpretableConst) -} - // evalExhaustiveOr is just like evalOr, but does not short-circuit argument evaluation. type evalExhaustiveOr struct { id int64 @@ -1078,12 +1022,7 @@ func (or *evalExhaustiveOr) Eval(ctx Activation) ref.Val { if types.IsError(lVal) { return lVal } - return types.ValOrErr(rVal, "no such overload") -} - -// Cost implements the Coster interface method. -func (or *evalExhaustiveOr) Cost() (min, max int64) { - return calExhaustiveBinaryOpsCost(or.lhs, or.rhs) + return types.MaybeNoSuchOverloadErr(rVal) } // evalExhaustiveAnd is just like evalAnd, but does not short-circuit argument evaluation. @@ -1124,18 +1063,7 @@ func (and *evalExhaustiveAnd) Eval(ctx Activation) ref.Val { if types.IsError(lVal) { return lVal } - return types.ValOrErr(rVal, "no such overload") -} - -// Cost implements the Coster interface method. -func (and *evalExhaustiveAnd) Cost() (min, max int64) { - return calExhaustiveBinaryOpsCost(and.lhs, and.rhs) -} - -func calExhaustiveBinaryOpsCost(lhs, rhs Interpretable) (min, max int64) { - lMin, lMax := estimateCost(lhs) - rMin, rMax := estimateCost(rhs) - return lMin + rMin + 1, lMax + rMax + 1 + return types.MaybeNoSuchOverloadErr(rVal) } // evalExhaustiveConditional is like evalConditional, but does not short-circuit argument @@ -1154,77 +1082,114 @@ func (cond *evalExhaustiveConditional) ID() int64 { // Eval implements the Interpretable interface method. func (cond *evalExhaustiveConditional) Eval(ctx Activation) ref.Val { cVal := cond.attr.expr.Eval(ctx) - tVal, err := cond.attr.truthy.Resolve(ctx) - if err != nil { - return types.NewErr(err.Error()) - } - fVal, err := cond.attr.falsy.Resolve(ctx) - if err != nil { - return types.NewErr(err.Error()) - } + tVal, tErr := cond.attr.truthy.Resolve(ctx) + fVal, fErr := cond.attr.falsy.Resolve(ctx) cBool, ok := cVal.(types.Bool) if !ok { return types.ValOrErr(cVal, "no such overload") } if cBool { + if tErr != nil { + return types.WrapErr(tErr) + } return cond.adapter.NativeToValue(tVal) } + if fErr != nil { + return types.WrapErr(fErr) + } return cond.adapter.NativeToValue(fVal) } -// Cost implements the Coster interface method. -func (cond *evalExhaustiveConditional) Cost() (min, max int64) { - return cond.attr.Cost() -} - // evalAttr evaluates an Attribute value. type evalAttr struct { - adapter ref.TypeAdapter - attr Attribute + adapter ref.TypeAdapter + attr Attribute + optional bool } +var _ InterpretableAttribute = &evalAttr{} + // ID of the attribute instruction. func (a *evalAttr) ID() int64 { return a.attr.ID() } -// AddQualifier implements the instAttr interface method. +// AddQualifier implements the InterpretableAttribute interface method. func (a *evalAttr) AddQualifier(qual Qualifier) (Attribute, error) { attr, err := a.attr.AddQualifier(qual) a.attr = attr return attr, err } -// Attr implements the instAttr interface method. +// Attr implements the InterpretableAttribute interface method. func (a *evalAttr) Attr() Attribute { return a.attr } -// Adapter implements the instAttr interface method. +// Adapter implements the InterpretableAttribute interface method. func (a *evalAttr) Adapter() ref.TypeAdapter { return a.adapter } -// Cost implements the Coster interface method. -func (a *evalAttr) Cost() (min, max int64) { - return estimateCost(a.attr) -} - // Eval implements the Interpretable interface method. func (a *evalAttr) Eval(ctx Activation) ref.Val { v, err := a.attr.Resolve(ctx) if err != nil { - return types.NewErr(err.Error()) + return types.WrapErr(err) } return a.adapter.NativeToValue(v) } // Qualify proxies to the Attribute's Qualify method. -func (a *evalAttr) Qualify(ctx Activation, obj interface{}) (interface{}, error) { +func (a *evalAttr) Qualify(ctx Activation, obj any) (any, error) { return a.attr.Qualify(ctx, obj) } +// QualifyIfPresent proxies to the Attribute's QualifyIfPresent method. +func (a *evalAttr) QualifyIfPresent(ctx Activation, obj any, presenceOnly bool) (any, bool, error) { + return a.attr.QualifyIfPresent(ctx, obj, presenceOnly) +} + +func (a *evalAttr) IsOptional() bool { + return a.optional +} + // Resolve proxies to the Attribute's Resolve method. -func (a *evalAttr) Resolve(ctx Activation) (interface{}, error) { +func (a *evalAttr) Resolve(ctx Activation) (any, error) { return a.attr.Resolve(ctx) } + +type evalWatchConstructor struct { + constructor InterpretableConstructor + observer EvalObserver +} + +// InitVals implements the InterpretableConstructor InitVals function. +func (c *evalWatchConstructor) InitVals() []Interpretable { + return c.constructor.InitVals() +} + +// Type implements the InterpretableConstructor Type function. +func (c *evalWatchConstructor) Type() ref.Type { + return c.constructor.Type() +} + +// ID implements the Interpretable ID function. +func (c *evalWatchConstructor) ID() int64 { + return c.constructor.ID() +} + +// Eval implements the Interpretable Eval function. +func (c *evalWatchConstructor) Eval(ctx Activation) ref.Val { + val := c.constructor.Eval(ctx) + c.observer(c.ID(), c.constructor, val) + return val +} + +func invalidOptionalEntryInit(field any, value ref.Val) ref.Val { + return types.NewErr("cannot initialize optional entry '%v' from non-optional value %v", field, value) +} + +func invalidOptionalElementInit(value ref.Val) ref.Val { + return types.NewErr("cannot initialize optional list element from non-optional value %v", value) +} diff --git a/tools/vendor/github.com/google/cel-go/interpreter/interpreter.go b/tools/vendor/github.com/google/cel-go/interpreter/interpreter.go index b3fd14f8b..707a6105a 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/interpreter.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/interpreter.go @@ -29,19 +29,17 @@ import ( type Interpreter interface { // NewInterpretable creates an Interpretable from a checked expression and an // optional list of InterpretableDecorator values. - NewInterpretable(checked *exprpb.CheckedExpr, - decorators ...InterpretableDecorator) (Interpretable, error) + NewInterpretable(checked *exprpb.CheckedExpr, decorators ...InterpretableDecorator) (Interpretable, error) // NewUncheckedInterpretable returns an Interpretable from a parsed expression // and an optional list of InterpretableDecorator values. - NewUncheckedInterpretable(expr *exprpb.Expr, - decorators ...InterpretableDecorator) (Interpretable, error) + NewUncheckedInterpretable(expr *exprpb.Expr, decorators ...InterpretableDecorator) (Interpretable, error) } // EvalObserver is a functional interface that accepts an expression id and an observed value. // The id identifies the expression that was evaluated, the programStep is the Interpretable or Qualifier that // was evaluated and value is the result of the evaluation. -type EvalObserver func(id int64, programStep interface{}, value ref.Val) +type EvalObserver func(id int64, programStep any, value ref.Val) // Observe constructs a decorator that calls all the provided observers in order after evaluating each Interpretable // or Qualifier during program evaluation. @@ -49,7 +47,7 @@ func Observe(observers ...EvalObserver) InterpretableDecorator { if len(observers) == 1 { return decObserveEval(observers[0]) } - observeFn := func(id int64, programStep interface{}, val ref.Val) { + observeFn := func(id int64, programStep any, val ref.Val) { for _, observer := range observers { observer(id, programStep, val) } @@ -96,7 +94,7 @@ func TrackState(state EvalState) InterpretableDecorator { // This decorator is not thread-safe, and the EvalState must be reset between Eval() // calls. func EvalStateObserver(state EvalState) EvalObserver { - return func(id int64, programStep interface{}, val ref.Val) { + return func(id int64, programStep any, val ref.Val) { state.SetValue(id, val) } } diff --git a/tools/vendor/github.com/google/cel-go/interpreter/planner.go b/tools/vendor/github.com/google/cel-go/interpreter/planner.go index 882e0419a..0b65d0fa9 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/planner.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/planner.go @@ -20,7 +20,6 @@ import ( "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/operators" - "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter/functions" @@ -189,16 +188,7 @@ func (p *planner) planSelect(expr *exprpb.Expr) (Interpretable, error) { if err != nil { return nil, err } - - // Determine the field type if this is a proto message type. - var fieldType *ref.FieldType opType := p.typeMap[sel.GetOperand().GetId()] - if opType.GetMessageType() != "" { - ft, found := p.provider.FindFieldType(opType.GetMessageType(), sel.GetField()) - if found && ft.IsSet != nil && ft.GetFrom != nil { - fieldType = ft - } - } // If the Select was marked TestOnly, this is a presence test. // @@ -211,37 +201,31 @@ func (p *planner) planSelect(expr *exprpb.Expr) (Interpretable, error) { // If a string named 'a.b.c' is declared in the environment and referenced within `has(a.b.c)`, // it is not clear whether has should error or follow the convention defined for structured // values. - if sel.TestOnly { - // Return the test only eval expression. - return &evalTestOnly{ - id: expr.GetId(), - field: types.String(sel.GetField()), - fieldType: fieldType, - op: op, - }, nil - } - // Build a qualifier. - qual, err := p.attrFactory.NewQualifier( - opType, expr.GetId(), sel.GetField()) - if err != nil { - return nil, err - } - // Lastly, create a field selection Interpretable. + + // Establish the attribute reference. attr, isAttr := op.(InterpretableAttribute) - if isAttr { - _, err = attr.AddQualifier(qual) - return attr, err + if !isAttr { + attr, err = p.relativeAttr(op.ID(), op, false) + if err != nil { + return nil, err + } } - relAttr, err := p.relativeAttr(op.ID(), op) + // Build a qualifier for the attribute. + qual, err := p.attrFactory.NewQualifier(opType, expr.GetId(), sel.GetField(), false) if err != nil { return nil, err } - _, err = relAttr.AddQualifier(qual) - if err != nil { - return nil, err + // Modify the attribute to be test-only. + if sel.GetTestOnly() { + attr = &evalTestOnly{ + id: expr.GetId(), + InterpretableAttribute: attr, + } } - return relAttr, nil + // Append the qualifier on the attribute. + _, err = attr.AddQualifier(qual) + return attr, err } // planCall creates a callable Interpretable while specializing for common functions and invocation @@ -286,7 +270,9 @@ func (p *planner) planCall(expr *exprpb.Expr) (Interpretable, error) { case operators.NotEquals: return p.planCallNotEqual(expr, args) case operators.Index: - return p.planCallIndex(expr, args) + return p.planCallIndex(expr, args, false) + case operators.OptSelect, operators.OptIndex: + return p.planCallIndex(expr, args, true) } // Otherwise, generate Interpretable calls specialized by argument count. @@ -423,8 +409,7 @@ func (p *planner) planCallVarArgs(expr *exprpb.Expr, } // planCallEqual generates an equals (==) Interpretable. -func (p *planner) planCallEqual(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallEqual(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { return &evalEq{ id: expr.GetId(), lhs: args[0], @@ -433,8 +418,7 @@ func (p *planner) planCallEqual(expr *exprpb.Expr, } // planCallNotEqual generates a not equals (!=) Interpretable. -func (p *planner) planCallNotEqual(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallNotEqual(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { return &evalNe{ id: expr.GetId(), lhs: args[0], @@ -443,8 +427,7 @@ func (p *planner) planCallNotEqual(expr *exprpb.Expr, } // planCallLogicalAnd generates a logical and (&&) Interpretable. -func (p *planner) planCallLogicalAnd(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallLogicalAnd(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { return &evalAnd{ id: expr.GetId(), lhs: args[0], @@ -453,8 +436,7 @@ func (p *planner) planCallLogicalAnd(expr *exprpb.Expr, } // planCallLogicalOr generates a logical or (||) Interpretable. -func (p *planner) planCallLogicalOr(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallLogicalOr(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { return &evalOr{ id: expr.GetId(), lhs: args[0], @@ -463,10 +445,8 @@ func (p *planner) planCallLogicalOr(expr *exprpb.Expr, } // planCallConditional generates a conditional / ternary (c ? t : f) Interpretable. -func (p *planner) planCallConditional(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallConditional(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { cond := args[0] - t := args[1] var tAttr Attribute truthyAttr, isTruthyAttr := t.(InterpretableAttribute) @@ -493,48 +473,54 @@ func (p *planner) planCallConditional(expr *exprpb.Expr, // planCallIndex either extends an attribute with the argument to the index operation, or creates // a relative attribute based on the return of a function call or operation. -func (p *planner) planCallIndex(expr *exprpb.Expr, - args []Interpretable) (Interpretable, error) { +func (p *planner) planCallIndex(expr *exprpb.Expr, args []Interpretable, optional bool) (Interpretable, error) { op := args[0] ind := args[1] - opAttr, err := p.relativeAttr(op.ID(), op) - if err != nil { - return nil, err - } opType := p.typeMap[expr.GetCallExpr().GetTarget().GetId()] - indConst, isIndConst := ind.(InterpretableConst) - if isIndConst { - qual, err := p.attrFactory.NewQualifier( - opType, expr.GetId(), indConst.Value()) + + // Establish the attribute reference. + var err error + attr, isAttr := op.(InterpretableAttribute) + if !isAttr { + attr, err = p.relativeAttr(op.ID(), op, false) if err != nil { return nil, err } - _, err = opAttr.AddQualifier(qual) - return opAttr, err } - indAttr, isIndAttr := ind.(InterpretableAttribute) - if isIndAttr { - qual, err := p.attrFactory.NewQualifier( - opType, expr.GetId(), indAttr) - if err != nil { - return nil, err - } - _, err = opAttr.AddQualifier(qual) - return opAttr, err + + // Construct the qualifier type. + var qual Qualifier + switch ind := ind.(type) { + case InterpretableConst: + qual, err = p.attrFactory.NewQualifier(opType, expr.GetId(), ind.Value(), optional) + case InterpretableAttribute: + qual, err = p.attrFactory.NewQualifier(opType, expr.GetId(), ind, optional) + default: + qual, err = p.relativeAttr(expr.GetId(), ind, optional) } - indQual, err := p.relativeAttr(expr.GetId(), ind) if err != nil { return nil, err } - _, err = opAttr.AddQualifier(indQual) - return opAttr, err + + // Add the qualifier to the attribute + _, err = attr.AddQualifier(qual) + return attr, err } // planCreateList generates a list construction Interpretable. func (p *planner) planCreateList(expr *exprpb.Expr) (Interpretable, error) { list := expr.GetListExpr() - elems := make([]Interpretable, len(list.GetElements())) - for i, elem := range list.GetElements() { + optionalIndices := list.GetOptionalIndices() + elements := list.GetElements() + optionals := make([]bool, len(elements)) + for _, index := range optionalIndices { + if index < 0 || index >= int32(len(elements)) { + return nil, fmt.Errorf("optional index %d out of element bounds [0, %d]", index, len(elements)) + } + optionals[index] = true + } + elems := make([]Interpretable, len(elements)) + for i, elem := range elements { elemVal, err := p.Plan(elem) if err != nil { return nil, err @@ -542,9 +528,11 @@ func (p *planner) planCreateList(expr *exprpb.Expr) (Interpretable, error) { elems[i] = elemVal } return &evalList{ - id: expr.GetId(), - elems: elems, - adapter: p.adapter, + id: expr.GetId(), + elems: elems, + optionals: optionals, + hasOptionals: len(optionals) != 0, + adapter: p.adapter, }, nil } @@ -555,6 +543,7 @@ func (p *planner) planCreateStruct(expr *exprpb.Expr) (Interpretable, error) { return p.planCreateObj(expr) } entries := str.GetEntries() + optionals := make([]bool, len(entries)) keys := make([]Interpretable, len(entries)) vals := make([]Interpretable, len(entries)) for i, entry := range entries { @@ -569,23 +558,27 @@ func (p *planner) planCreateStruct(expr *exprpb.Expr) (Interpretable, error) { return nil, err } vals[i] = valVal + optionals[i] = entry.GetOptionalEntry() } return &evalMap{ - id: expr.GetId(), - keys: keys, - vals: vals, - adapter: p.adapter, + id: expr.GetId(), + keys: keys, + vals: vals, + optionals: optionals, + hasOptionals: len(optionals) != 0, + adapter: p.adapter, }, nil } // planCreateObj generates an object construction Interpretable. func (p *planner) planCreateObj(expr *exprpb.Expr) (Interpretable, error) { obj := expr.GetStructExpr() - typeName, defined := p.resolveTypeName(obj.MessageName) + typeName, defined := p.resolveTypeName(obj.GetMessageName()) if !defined { - return nil, fmt.Errorf("unknown type: %s", typeName) + return nil, fmt.Errorf("unknown type: %s", obj.GetMessageName()) } entries := obj.GetEntries() + optionals := make([]bool, len(entries)) fields := make([]string, len(entries)) vals := make([]Interpretable, len(entries)) for i, entry := range entries { @@ -595,13 +588,16 @@ func (p *planner) planCreateObj(expr *exprpb.Expr) (Interpretable, error) { return nil, err } vals[i] = val + optionals[i] = entry.GetOptionalEntry() } return &evalObj{ - id: expr.GetId(), - typeName: typeName, - fields: fields, - vals: vals, - provider: p.provider, + id: expr.GetId(), + typeName: typeName, + fields: fields, + vals: vals, + optionals: optionals, + hasOptionals: len(optionals) != 0, + provider: p.provider, }, nil } @@ -753,14 +749,18 @@ func (p *planner) resolveFunction(expr *exprpb.Expr) (*exprpb.Expr, string, stri return target, fnName, "" } -func (p *planner) relativeAttr(id int64, eval Interpretable) (InterpretableAttribute, error) { +// relativeAttr indicates that the attribute in this case acts as a qualifier and as such needs to +// be observed to ensure that it's evaluation value is properly recorded for state tracking. +func (p *planner) relativeAttr(id int64, eval Interpretable, opt bool) (InterpretableAttribute, error) { eAttr, ok := eval.(InterpretableAttribute) if !ok { eAttr = &evalAttr{ - adapter: p.adapter, - attr: p.attrFactory.RelativeAttribute(id, eval), + adapter: p.adapter, + attr: p.attrFactory.RelativeAttribute(id, eval), + optional: opt, } } + // This looks like it should either decorate the new evalAttr node, or early return the InterpretableAttribute decAttr, err := p.decorate(eAttr, nil) if err != nil { return nil, err diff --git a/tools/vendor/github.com/google/cel-go/interpreter/prune.go b/tools/vendor/github.com/google/cel-go/interpreter/prune.go index eab46e0c0..d1b5d6bd6 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/prune.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/prune.go @@ -16,6 +16,7 @@ package interpreter import ( "github.com/google/cel-go/common/operators" + "github.com/google/cel-go/common/overloads" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" @@ -26,6 +27,7 @@ import ( type astPruner struct { expr *exprpb.Expr + macroCalls map[int64]*exprpb.Expr state EvalState nextExprID int64 } @@ -65,13 +67,22 @@ type astPruner struct { // compiled and constant folded expressions, but is not willing to constant // fold(and thus cache results of) some external calls, then they can prepare // the overloads accordingly. -func PruneAst(expr *exprpb.Expr, state EvalState) *exprpb.Expr { +func PruneAst(expr *exprpb.Expr, macroCalls map[int64]*exprpb.Expr, state EvalState) *exprpb.ParsedExpr { + pruneState := NewEvalState() + for _, id := range state.IDs() { + v, _ := state.Value(id) + pruneState.SetValue(id, v) + } pruner := &astPruner{ expr: expr, - state: state, - nextExprID: 1} - newExpr, _ := pruner.prune(expr) - return newExpr + macroCalls: macroCalls, + state: pruneState, + nextExprID: getMaxID(expr)} + newExpr, _ := pruner.maybePrune(expr) + return &exprpb.ParsedExpr{ + Expr: newExpr, + SourceInfo: &exprpb.SourceInfo{MacroCalls: pruner.macroCalls}, + } } func (p *astPruner) createLiteral(id int64, val *exprpb.Constant) *exprpb.Expr { @@ -84,28 +95,50 @@ func (p *astPruner) createLiteral(id int64, val *exprpb.Constant) *exprpb.Expr { } func (p *astPruner) maybeCreateLiteral(id int64, val ref.Val) (*exprpb.Expr, bool) { - switch val.Type() { - case types.BoolType: + switch v := val.(type) { + case types.Bool: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_BoolValue{BoolValue: val.Value().(bool)}}), true - case types.IntType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_BoolValue{BoolValue: bool(v)}}), true + case types.Bytes: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_Int64Value{Int64Value: val.Value().(int64)}}), true - case types.UintType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_BytesValue{BytesValue: []byte(v)}}), true + case types.Double: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_Uint64Value{Uint64Value: val.Value().(uint64)}}), true - case types.StringType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_DoubleValue{DoubleValue: float64(v)}}), true + case types.Duration: + p.state.SetValue(id, val) + durationString := string(v.ConvertToType(types.StringType).(types.String)) + return &exprpb.Expr{ + Id: id, + ExprKind: &exprpb.Expr_CallExpr{ + CallExpr: &exprpb.Expr_Call{ + Function: overloads.TypeConvertDuration, + Args: []*exprpb.Expr{ + p.createLiteral(p.nextID(), + &exprpb.Constant{ConstantKind: &exprpb.Constant_StringValue{StringValue: durationString}}), + }, + }, + }, + }, true + case types.Int: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_StringValue{StringValue: val.Value().(string)}}), true - case types.DoubleType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_Int64Value{Int64Value: int64(v)}}), true + case types.Uint: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_DoubleValue{DoubleValue: val.Value().(float64)}}), true - case types.BytesType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_Uint64Value{Uint64Value: uint64(v)}}), true + case types.String: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_BytesValue{BytesValue: val.Value().([]byte)}}), true - case types.NullType: + &exprpb.Constant{ConstantKind: &exprpb.Constant_StringValue{StringValue: string(v)}}), true + case types.Null: + p.state.SetValue(id, val) return p.createLiteral(id, - &exprpb.Constant{ConstantKind: &exprpb.Constant_NullValue{NullValue: val.Value().(structpb.NullValue)}}), true + &exprpb.Constant{ConstantKind: &exprpb.Constant_NullValue{NullValue: v.Value().(structpb.NullValue)}}), true } // Attempt to build a list literal. @@ -123,6 +156,7 @@ func (p *astPruner) maybeCreateLiteral(id int64, val ref.Val) (*exprpb.Expr, boo } elemExprs[i] = elemExpr } + p.state.SetValue(id, val) return &exprpb.Expr{ Id: id, ExprKind: &exprpb.Expr_ListExpr{ @@ -162,6 +196,7 @@ func (p *astPruner) maybeCreateLiteral(id int64, val ref.Val) (*exprpb.Expr, boo entries[i] = entry i++ } + p.state.SetValue(id, val) return &exprpb.Expr{ Id: id, ExprKind: &exprpb.Expr_StructExpr{ @@ -177,70 +212,147 @@ func (p *astPruner) maybeCreateLiteral(id int64, val ref.Val) (*exprpb.Expr, boo return nil, false } -func (p *astPruner) maybePruneAndOr(node *exprpb.Expr) (*exprpb.Expr, bool) { - if !p.existsWithUnknownValue(node.GetId()) { +func (p *astPruner) maybePruneOptional(elem *exprpb.Expr) (*exprpb.Expr, bool) { + elemVal, found := p.value(elem.GetId()) + if found && elemVal.Type() == types.OptionalType { + opt := elemVal.(*types.Optional) + if !opt.HasValue() { + return nil, true + } + if newElem, pruned := p.maybeCreateLiteral(elem.GetId(), opt.GetValue()); pruned { + return newElem, true + } + } + return elem, false +} + +func (p *astPruner) maybePruneIn(node *exprpb.Expr) (*exprpb.Expr, bool) { + // elem in list + call := node.GetCallExpr() + val, exists := p.maybeValue(call.GetArgs()[1].GetId()) + if !exists { return nil, false } + if sz, ok := val.(traits.Sizer); ok && sz.Size() == types.IntZero { + return p.maybeCreateLiteral(node.GetId(), types.False) + } + return nil, false +} +func (p *astPruner) maybePruneLogicalNot(node *exprpb.Expr) (*exprpb.Expr, bool) { + call := node.GetCallExpr() + arg := call.GetArgs()[0] + val, exists := p.maybeValue(arg.GetId()) + if !exists { + return nil, false + } + if b, ok := val.(types.Bool); ok { + return p.maybeCreateLiteral(node.GetId(), !b) + } + return nil, false +} + +func (p *astPruner) maybePruneOr(node *exprpb.Expr) (*exprpb.Expr, bool) { call := node.GetCallExpr() // We know result is unknown, so we have at least one unknown arg // and if one side is a known value, we know we can ignore it. - if p.existsWithKnownValue(call.Args[0].GetId()) { - return call.Args[1], true + if v, exists := p.maybeValue(call.GetArgs()[0].GetId()); exists { + if v == types.True { + return p.maybeCreateLiteral(node.GetId(), types.True) + } + return call.GetArgs()[1], true } - if p.existsWithKnownValue(call.Args[1].GetId()) { - return call.Args[0], true + if v, exists := p.maybeValue(call.GetArgs()[1].GetId()); exists { + if v == types.True { + return p.maybeCreateLiteral(node.GetId(), types.True) + } + return call.GetArgs()[0], true } return nil, false } -func (p *astPruner) maybePruneConditional(node *exprpb.Expr) (*exprpb.Expr, bool) { - if !p.existsWithUnknownValue(node.GetId()) { - return nil, false +func (p *astPruner) maybePruneAnd(node *exprpb.Expr) (*exprpb.Expr, bool) { + call := node.GetCallExpr() + // We know result is unknown, so we have at least one unknown arg + // and if one side is a known value, we know we can ignore it. + if v, exists := p.maybeValue(call.GetArgs()[0].GetId()); exists { + if v == types.False { + return p.maybeCreateLiteral(node.GetId(), types.False) + } + return call.GetArgs()[1], true + } + if v, exists := p.maybeValue(call.GetArgs()[1].GetId()); exists { + if v == types.False { + return p.maybeCreateLiteral(node.GetId(), types.False) + } + return call.GetArgs()[0], true } + return nil, false +} +func (p *astPruner) maybePruneConditional(node *exprpb.Expr) (*exprpb.Expr, bool) { call := node.GetCallExpr() - condVal, condValueExists := p.value(call.Args[0].GetId()) - if !condValueExists || types.IsUnknownOrError(condVal) { + cond, exists := p.maybeValue(call.GetArgs()[0].GetId()) + if !exists { return nil, false } - - if condVal.Value().(bool) { - return call.Args[1], true + if cond.Value().(bool) { + return call.GetArgs()[1], true } - return call.Args[2], true + return call.GetArgs()[2], true } func (p *astPruner) maybePruneFunction(node *exprpb.Expr) (*exprpb.Expr, bool) { + if _, exists := p.value(node.GetId()); !exists { + return nil, false + } call := node.GetCallExpr() - if call.Function == operators.LogicalOr || call.Function == operators.LogicalAnd { - return p.maybePruneAndOr(node) + if call.Function == operators.LogicalOr { + return p.maybePruneOr(node) + } + if call.Function == operators.LogicalAnd { + return p.maybePruneAnd(node) } if call.Function == operators.Conditional { return p.maybePruneConditional(node) } - + if call.Function == operators.In { + return p.maybePruneIn(node) + } + if call.Function == operators.LogicalNot { + return p.maybePruneLogicalNot(node) + } return nil, false } +func (p *astPruner) maybePrune(node *exprpb.Expr) (*exprpb.Expr, bool) { + return p.prune(node) +} + func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { if node == nil { return node, false } - val, valueExists := p.value(node.GetId()) - if valueExists && !types.IsUnknownOrError(val) { + val, valueExists := p.maybeValue(node.GetId()) + if valueExists { if newNode, ok := p.maybeCreateLiteral(node.GetId(), val); ok { + delete(p.macroCalls, node.GetId()) return newNode, true } } + if macro, found := p.macroCalls[node.GetId()]; found { + // prune the expression in terms of the macro call instead of the expanded form. + if newMacro, pruned := p.prune(macro); pruned { + p.macroCalls[node.GetId()] = newMacro + } + } // We have either an unknown/error value, or something we don't want to // transform, or expression was not evaluated. If possible, drill down // more. - switch node.GetExprKind().(type) { case *exprpb.Expr_SelectExpr: - if operand, pruned := p.prune(node.GetSelectExpr().GetOperand()); pruned { + if operand, pruned := p.maybePrune(node.GetSelectExpr().GetOperand()); pruned { return &exprpb.Expr{ Id: node.GetId(), ExprKind: &exprpb.Expr_SelectExpr{ @@ -253,10 +365,6 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { }, true } case *exprpb.Expr_CallExpr: - if newExpr, pruned := p.maybePruneFunction(node); pruned { - newExpr, _ = p.prune(newExpr) - return newExpr, true - } var prunedCall bool call := node.GetCallExpr() args := call.GetArgs() @@ -268,40 +376,75 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { } for i, arg := range args { newArgs[i] = arg - if newArg, prunedArg := p.prune(arg); prunedArg { + if newArg, prunedArg := p.maybePrune(arg); prunedArg { prunedCall = true newArgs[i] = newArg } } - if newTarget, prunedTarget := p.prune(call.GetTarget()); prunedTarget { + if newTarget, prunedTarget := p.maybePrune(call.GetTarget()); prunedTarget { prunedCall = true newCall.Target = newTarget } + newNode := &exprpb.Expr{ + Id: node.GetId(), + ExprKind: &exprpb.Expr_CallExpr{ + CallExpr: newCall, + }, + } + if newExpr, pruned := p.maybePruneFunction(newNode); pruned { + newExpr, _ = p.maybePrune(newExpr) + return newExpr, true + } if prunedCall { - return &exprpb.Expr{ - Id: node.GetId(), - ExprKind: &exprpb.Expr_CallExpr{ - CallExpr: newCall, - }, - }, true + return newNode, true } case *exprpb.Expr_ListExpr: elems := node.GetListExpr().GetElements() - newElems := make([]*exprpb.Expr, len(elems)) + optIndices := node.GetListExpr().GetOptionalIndices() + optIndexMap := map[int32]bool{} + for _, i := range optIndices { + optIndexMap[i] = true + } + newOptIndexMap := make(map[int32]bool, len(optIndexMap)) + newElems := make([]*exprpb.Expr, 0, len(elems)) var prunedList bool + + prunedIdx := 0 for i, elem := range elems { - newElems[i] = elem - if newElem, prunedElem := p.prune(elem); prunedElem { - newElems[i] = newElem + _, isOpt := optIndexMap[int32(i)] + if isOpt { + newElem, pruned := p.maybePruneOptional(elem) + if pruned { + prunedList = true + if newElem != nil { + newElems = append(newElems, newElem) + prunedIdx++ + } + continue + } + newOptIndexMap[int32(prunedIdx)] = true + } + if newElem, prunedElem := p.maybePrune(elem); prunedElem { + newElems = append(newElems, newElem) prunedList = true + } else { + newElems = append(newElems, elem) } + prunedIdx++ + } + optIndices = make([]int32, len(newOptIndexMap)) + idx := 0 + for i := range newOptIndexMap { + optIndices[idx] = i + idx++ } if prunedList { return &exprpb.Expr{ Id: node.GetId(), ExprKind: &exprpb.Expr_ListExpr{ ListExpr: &exprpb.Expr_CreateList{ - Elements: newElems, + Elements: newElems, + OptionalIndices: optIndices, }, }, }, true @@ -313,8 +456,8 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { newEntries := make([]*exprpb.Expr_CreateStruct_Entry, len(entries)) for i, entry := range entries { newEntries[i] = entry - newKey, prunedKey := p.prune(entry.GetMapKey()) - newValue, prunedValue := p.prune(entry.GetValue()) + newKey, prunedKey := p.maybePrune(entry.GetMapKey()) + newValue, prunedValue := p.maybePrune(entry.GetValue()) if !prunedKey && !prunedValue { continue } @@ -331,6 +474,7 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { MapKey: newKey, } } + newEntry.OptionalEntry = entry.GetOptionalEntry() newEntries[i] = newEntry } if prunedStruct { @@ -344,27 +488,6 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { }, }, true } - case *exprpb.Expr_ComprehensionExpr: - compre := node.GetComprehensionExpr() - // Only the range of the comprehension is pruned since the state tracking only records - // the last iteration of the comprehension and not each step in the evaluation which - // means that the any residuals computed in between might be inaccurate. - if newRange, pruned := p.prune(compre.GetIterRange()); pruned { - return &exprpb.Expr{ - Id: node.GetId(), - ExprKind: &exprpb.Expr_ComprehensionExpr{ - ComprehensionExpr: &exprpb.Expr_Comprehension{ - IterVar: compre.GetIterVar(), - IterRange: newRange, - AccuVar: compre.GetAccuVar(), - AccuInit: compre.GetAccuInit(), - LoopCondition: compre.GetLoopCondition(), - LoopStep: compre.GetLoopStep(), - Result: compre.GetResult(), - }, - }, - }, true - } } return node, false } @@ -374,24 +497,82 @@ func (p *astPruner) value(id int64) (ref.Val, bool) { return val, (found && val != nil) } -func (p *astPruner) existsWithUnknownValue(id int64) bool { - val, valueExists := p.value(id) - return valueExists && types.IsUnknown(val) +func (p *astPruner) maybeValue(id int64) (ref.Val, bool) { + val, found := p.value(id) + if !found || types.IsUnknownOrError(val) { + return nil, false + } + return val, true } -func (p *astPruner) existsWithKnownValue(id int64) bool { - val, valueExists := p.value(id) - return valueExists && !types.IsUnknown(val) +func (p *astPruner) nextID() int64 { + next := p.nextExprID + p.nextExprID++ + return next } -func (p *astPruner) nextID() int64 { - for { - _, found := p.state.Value(p.nextExprID) - if !found { - next := p.nextExprID - p.nextExprID++ - return next +type astVisitor struct { + // visitEntry is called on every expr node, including those within a map/struct entry. + visitExpr func(expr *exprpb.Expr) + // visitEntry is called before entering the key, value of a map/struct entry. + visitEntry func(entry *exprpb.Expr_CreateStruct_Entry) +} + +func getMaxID(expr *exprpb.Expr) int64 { + maxID := int64(1) + visit(expr, maxIDVisitor(&maxID)) + return maxID +} + +func maxIDVisitor(maxID *int64) astVisitor { + return astVisitor{ + visitExpr: func(e *exprpb.Expr) { + if e.GetId() >= *maxID { + *maxID = e.GetId() + 1 + } + }, + visitEntry: func(e *exprpb.Expr_CreateStruct_Entry) { + if e.GetId() >= *maxID { + *maxID = e.GetId() + 1 + } + }, + } +} + +func visit(expr *exprpb.Expr, visitor astVisitor) { + exprs := []*exprpb.Expr{expr} + for len(exprs) != 0 { + e := exprs[0] + visitor.visitExpr(e) + exprs = exprs[1:] + switch e.GetExprKind().(type) { + case *exprpb.Expr_SelectExpr: + exprs = append(exprs, e.GetSelectExpr().GetOperand()) + case *exprpb.Expr_CallExpr: + call := e.GetCallExpr() + if call.GetTarget() != nil { + exprs = append(exprs, call.GetTarget()) + } + exprs = append(exprs, call.GetArgs()...) + case *exprpb.Expr_ComprehensionExpr: + compre := e.GetComprehensionExpr() + exprs = append(exprs, + compre.GetIterRange(), + compre.GetAccuInit(), + compre.GetLoopCondition(), + compre.GetLoopStep(), + compre.GetResult()) + case *exprpb.Expr_ListExpr: + list := e.GetListExpr() + exprs = append(exprs, list.GetElements()...) + case *exprpb.Expr_StructExpr: + for _, entry := range e.GetStructExpr().GetEntries() { + visitor.visitEntry(entry) + if entry.GetMapKey() != nil { + exprs = append(exprs, entry.GetMapKey()) + } + exprs = append(exprs, entry.GetValue()) + } } - p.nextExprID++ } } diff --git a/tools/vendor/github.com/google/cel-go/interpreter/runtimecost.go b/tools/vendor/github.com/google/cel-go/interpreter/runtimecost.go index 06b6b27ef..80e7f6134 100644 --- a/tools/vendor/github.com/google/cel-go/interpreter/runtimecost.go +++ b/tools/vendor/github.com/google/cel-go/interpreter/runtimecost.go @@ -36,7 +36,7 @@ type ActualCostEstimator interface { // CostObserver provides an observer that tracks runtime cost. func CostObserver(tracker *CostTracker) EvalObserver { - observer := func(id int64, programStep interface{}, val ref.Val) { + observer := func(id int64, programStep any, val ref.Val) { switch t := programStep.(type) { case ConstantQualifier: // TODO: Push identifiers on to the stack before observing constant qualifiers that apply to them @@ -53,6 +53,11 @@ func CostObserver(tracker *CostTracker) EvalObserver { tracker.stack.drop(t.Attr().ID()) tracker.cost += common.SelectAndIdentCost } + if !tracker.presenceTestHasCost { + if _, isTestOnly := programStep.(*evalTestOnly); isTestOnly { + tracker.cost -= common.SelectAndIdentCost + } + } case *evalExhaustiveConditional: // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. tracker.stack.drop(t.attr.falsy.ID(), t.attr.truthy.ID(), t.attr.expr.ID()) @@ -95,21 +100,58 @@ func CostObserver(tracker *CostTracker) EvalObserver { return observer } -// CostTracker represents the information needed for tacking runtime cost +// CostTrackerOption configures the behavior of CostTracker objects. +type CostTrackerOption func(*CostTracker) error + +// CostTrackerLimit sets the runtime limit on the evaluation cost during execution and will terminate the expression +// evaluation if the limit is exceeded. +func CostTrackerLimit(limit uint64) CostTrackerOption { + return func(tracker *CostTracker) error { + tracker.Limit = &limit + return nil + } +} + +// PresenceTestHasCost determines whether presence testing has a cost of one or zero. +// Defaults to presence test has a cost of one. +func PresenceTestHasCost(hasCost bool) CostTrackerOption { + return func(tracker *CostTracker) error { + tracker.presenceTestHasCost = hasCost + return nil + } +} + +// NewCostTracker creates a new CostTracker with a given estimator and a set of functional CostTrackerOption values. +func NewCostTracker(estimator ActualCostEstimator, opts ...CostTrackerOption) (*CostTracker, error) { + tracker := &CostTracker{ + Estimator: estimator, + presenceTestHasCost: true, + } + for _, opt := range opts { + err := opt(tracker) + if err != nil { + return nil, err + } + } + return tracker, nil +} + +// CostTracker represents the information needed for tracking runtime cost. type CostTracker struct { - Estimator ActualCostEstimator - Limit *uint64 + Estimator ActualCostEstimator + Limit *uint64 + presenceTestHasCost bool cost uint64 stack refValStack } // ActualCost returns the runtime cost -func (c CostTracker) ActualCost() uint64 { +func (c *CostTracker) ActualCost() uint64 { return c.cost } -func (c CostTracker) costCall(call InterpretableCall, argValues []ref.Val, result ref.Val) uint64 { +func (c *CostTracker) costCall(call InterpretableCall, argValues []ref.Val, result ref.Val) uint64 { var cost uint64 if c.Estimator != nil { callCost := c.Estimator.CallCost(call.Function(), call.OverloadID(), argValues, result) @@ -122,7 +164,7 @@ func (c CostTracker) costCall(call InterpretableCall, argValues []ref.Val, resul // if user has their own implementation of ActualCostEstimator, make sure to cover the mapping between overloadId and cost calculation switch call.OverloadID() { // O(n) functions - case overloads.StartsWithString, overloads.EndsWithString, overloads.StringToBytes, overloads.BytesToString: + case overloads.StartsWithString, overloads.EndsWithString, overloads.StringToBytes, overloads.BytesToString, overloads.ExtQuoteString, overloads.ExtFormatString: cost += uint64(math.Ceil(float64(c.actualSize(argValues[0])) * common.StringTraversalCostFactor)) case overloads.InList: // If a list is composed entirely of constant values this is O(1), but we don't account for that here. @@ -179,7 +221,7 @@ func (c CostTracker) costCall(call InterpretableCall, argValues []ref.Val, resul } // actualSize returns the size of value -func (c CostTracker) actualSize(value ref.Val) uint64 { +func (c *CostTracker) actualSize(value ref.Val) uint64 { if sz, ok := value.(traits.Sizer); ok { return uint64(sz.Size().(types.Int)) } diff --git a/tools/vendor/github.com/google/cel-go/parser/BUILD.bazel b/tools/vendor/github.com/google/cel-go/parser/BUILD.bazel index b76e6e484..67ecc9554 100644 --- a/tools/vendor/github.com/google/cel-go/parser/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/parser/BUILD.bazel @@ -23,8 +23,8 @@ go_library( "//common/operators:go_default_library", "//common/runes:go_default_library", "//parser/gen:go_default_library", - "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr_v4//:go_default_library", + "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", ], @@ -34,6 +34,7 @@ go_test( name = "go_default_test", size = "small", srcs = [ + "helper_test.go", "parser_test.go", "unescape_test.go", "unparser_test.go", @@ -45,7 +46,8 @@ go_test( "//common/debug:go_default_library", "//parser/gen:go_default_library", "//test:go_default_library", - "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr_v4//:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", + "@org_golang_google_protobuf//testing/protocmp:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel b/tools/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel index 22711310c..654d1de7a 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel +++ b/tools/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel @@ -21,6 +21,6 @@ go_library( ], importpath = "github.com/google/cel-go/parser/gen", deps = [ - "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr_v4//:go_default_library", ], ) diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/CEL.g4 b/tools/vendor/github.com/google/cel-go/parser/gen/CEL.g4 index 11145ec37..b011da803 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/CEL.g4 +++ b/tools/vendor/github.com/google/cel-go/parser/gen/CEL.g4 @@ -52,16 +52,18 @@ unary member : primary # PrimaryExpr - | member op='.' id=IDENTIFIER (open='(' args=exprList? ')')? # SelectOrCall - | member op='[' index=expr ']' # Index - | member op='{' entries=fieldInitializerList? ','? '}' # CreateMessage + | member op='.' (opt='?')? id=IDENTIFIER # Select + | member op='.' id=IDENTIFIER open='(' args=exprList? ')' # MemberCall + | member op='[' (opt='?')? index=expr ']' # Index ; primary : leadingDot='.'? id=IDENTIFIER (op='(' args=exprList? ')')? # IdentOrGlobalCall | '(' e=expr ')' # Nested - | op='[' elems=exprList? ','? ']' # CreateList + | op='[' elems=listInit? ','? ']' # CreateList | op='{' entries=mapInitializerList? ','? '}' # CreateStruct + | leadingDot='.'? ids+=IDENTIFIER (ops+='.' ids+=IDENTIFIER)* + op='{' entries=fieldInitializerList? ','? '}' # CreateMessage | literal # ConstantLiteral ; @@ -69,23 +71,35 @@ exprList : e+=expr (',' e+=expr)* ; +listInit + : elems+=optExpr (',' elems+=optExpr)* + ; + fieldInitializerList - : fields+=IDENTIFIER cols+=':' values+=expr (',' fields+=IDENTIFIER cols+=':' values+=expr)* + : fields+=optField cols+=':' values+=expr (',' fields+=optField cols+=':' values+=expr)* + ; + +optField + : (opt='?')? IDENTIFIER ; mapInitializerList - : keys+=expr cols+=':' values+=expr (',' keys+=expr cols+=':' values+=expr)* + : keys+=optExpr cols+=':' values+=expr (',' keys+=optExpr cols+=':' values+=expr)* + ; + +optExpr + : (opt='?')? e=expr ; literal : sign=MINUS? tok=NUM_INT # Int - | tok=NUM_UINT # Uint + | tok=NUM_UINT # Uint | sign=MINUS? tok=NUM_FLOAT # Double - | tok=STRING # String - | tok=BYTES # Bytes - | tok=CEL_TRUE # BoolTrue - | tok=CEL_FALSE # BoolFalse - | tok=NUL # Null + | tok=STRING # String + | tok=BYTES # Bytes + | tok=CEL_TRUE # BoolTrue + | tok=CEL_FALSE # BoolFalse + | tok=NUL # Null ; // Lexer Rules diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/CEL.interp b/tools/vendor/github.com/google/cel-go/parser/gen/CEL.interp index 13e3a10d1..75b8bb3e2 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/CEL.interp +++ b/tools/vendor/github.com/google/cel-go/parser/gen/CEL.interp @@ -87,10 +87,13 @@ unary member primary exprList +listInit fieldInitializerList +optField mapInitializerList +optExpr literal atn: -[4, 1, 36, 209, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 36, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 41, 8, 2, 10, 2, 12, 2, 44, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 49, 8, 3, 10, 3, 12, 3, 52, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 60, 8, 4, 10, 4, 12, 4, 63, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 74, 8, 5, 10, 5, 12, 5, 77, 9, 5, 1, 6, 1, 6, 4, 6, 81, 8, 6, 11, 6, 12, 6, 82, 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 3, 6, 92, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 7, 3, 7, 105, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 115, 8, 7, 1, 7, 3, 7, 118, 8, 7, 1, 7, 5, 7, 121, 8, 7, 10, 7, 12, 7, 124, 9, 7, 1, 8, 3, 8, 127, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 132, 8, 8, 1, 8, 3, 8, 135, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 143, 8, 8, 1, 8, 3, 8, 146, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, 8, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 163, 8, 9, 10, 9, 12, 9, 166, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 175, 8, 10, 10, 10, 12, 10, 178, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 188, 8, 11, 10, 11, 12, 11, 191, 9, 11, 1, 12, 3, 12, 194, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 199, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 207, 8, 12, 1, 12, 0, 3, 8, 10, 14, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 235, 0, 26, 1, 0, 0, 0, 2, 29, 1, 0, 0, 0, 4, 37, 1, 0, 0, 0, 6, 45, 1, 0, 0, 0, 8, 53, 1, 0, 0, 0, 10, 64, 1, 0, 0, 0, 12, 91, 1, 0, 0, 0, 14, 93, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 159, 1, 0, 0, 0, 20, 167, 1, 0, 0, 0, 22, 179, 1, 0, 0, 0, 24, 206, 1, 0, 0, 0, 26, 27, 3, 2, 1, 0, 27, 28, 5, 0, 0, 1, 28, 1, 1, 0, 0, 0, 29, 35, 3, 4, 2, 0, 30, 31, 5, 20, 0, 0, 31, 32, 3, 4, 2, 0, 32, 33, 5, 21, 0, 0, 33, 34, 3, 2, 1, 0, 34, 36, 1, 0, 0, 0, 35, 30, 1, 0, 0, 0, 35, 36, 1, 0, 0, 0, 36, 3, 1, 0, 0, 0, 37, 42, 3, 6, 3, 0, 38, 39, 5, 9, 0, 0, 39, 41, 3, 6, 3, 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 5, 1, 0, 0, 0, 44, 42, 1, 0, 0, 0, 45, 50, 3, 8, 4, 0, 46, 47, 5, 8, 0, 0, 47, 49, 3, 8, 4, 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 7, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 6, 4, -1, 0, 54, 55, 3, 10, 5, 0, 55, 61, 1, 0, 0, 0, 56, 57, 10, 1, 0, 0, 57, 58, 7, 0, 0, 0, 58, 60, 3, 8, 4, 2, 59, 56, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 9, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 65, 6, 5, -1, 0, 65, 66, 3, 12, 6, 0, 66, 75, 1, 0, 0, 0, 67, 68, 10, 2, 0, 0, 68, 69, 7, 1, 0, 0, 69, 74, 3, 10, 5, 3, 70, 71, 10, 1, 0, 0, 71, 72, 7, 2, 0, 0, 72, 74, 3, 10, 5, 2, 73, 67, 1, 0, 0, 0, 73, 70, 1, 0, 0, 0, 74, 77, 1, 0, 0, 0, 75, 73, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 11, 1, 0, 0, 0, 77, 75, 1, 0, 0, 0, 78, 92, 3, 14, 7, 0, 79, 81, 5, 19, 0, 0, 80, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 92, 3, 14, 7, 0, 85, 87, 5, 18, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 3, 14, 7, 0, 91, 78, 1, 0, 0, 0, 91, 80, 1, 0, 0, 0, 91, 86, 1, 0, 0, 0, 92, 13, 1, 0, 0, 0, 93, 94, 6, 7, -1, 0, 94, 95, 3, 16, 8, 0, 95, 122, 1, 0, 0, 0, 96, 97, 10, 3, 0, 0, 97, 98, 5, 16, 0, 0, 98, 104, 5, 36, 0, 0, 99, 101, 5, 14, 0, 0, 100, 102, 3, 18, 9, 0, 101, 100, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 105, 5, 15, 0, 0, 104, 99, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 121, 1, 0, 0, 0, 106, 107, 10, 2, 0, 0, 107, 108, 5, 10, 0, 0, 108, 109, 3, 2, 1, 0, 109, 110, 5, 11, 0, 0, 110, 121, 1, 0, 0, 0, 111, 112, 10, 1, 0, 0, 112, 114, 5, 12, 0, 0, 113, 115, 3, 20, 10, 0, 114, 113, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 117, 1, 0, 0, 0, 116, 118, 5, 17, 0, 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, 121, 5, 13, 0, 0, 120, 96, 1, 0, 0, 0, 120, 106, 1, 0, 0, 0, 120, 111, 1, 0, 0, 0, 121, 124, 1, 0, 0, 0, 122, 120, 1, 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 15, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 125, 127, 5, 16, 0, 0, 126, 125, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 134, 5, 36, 0, 0, 129, 131, 5, 14, 0, 0, 130, 132, 3, 18, 9, 0, 131, 130, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 5, 15, 0, 0, 134, 129, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 158, 1, 0, 0, 0, 136, 137, 5, 14, 0, 0, 137, 138, 3, 2, 1, 0, 138, 139, 5, 15, 0, 0, 139, 158, 1, 0, 0, 0, 140, 142, 5, 10, 0, 0, 141, 143, 3, 18, 9, 0, 142, 141, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 146, 5, 17, 0, 0, 145, 144, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 158, 5, 11, 0, 0, 148, 150, 5, 12, 0, 0, 149, 151, 3, 22, 11, 0, 150, 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 5, 17, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 158, 5, 13, 0, 0, 156, 158, 3, 24, 12, 0, 157, 126, 1, 0, 0, 0, 157, 136, 1, 0, 0, 0, 157, 140, 1, 0, 0, 0, 157, 148, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 17, 1, 0, 0, 0, 159, 164, 3, 2, 1, 0, 160, 161, 5, 17, 0, 0, 161, 163, 3, 2, 1, 0, 162, 160, 1, 0, 0, 0, 163, 166, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 19, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 168, 5, 36, 0, 0, 168, 169, 5, 21, 0, 0, 169, 176, 3, 2, 1, 0, 170, 171, 5, 17, 0, 0, 171, 172, 5, 36, 0, 0, 172, 173, 5, 21, 0, 0, 173, 175, 3, 2, 1, 0, 174, 170, 1, 0, 0, 0, 175, 178, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 21, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 21, 0, 0, 181, 189, 3, 2, 1, 0, 182, 183, 5, 17, 0, 0, 183, 184, 3, 2, 1, 0, 184, 185, 5, 21, 0, 0, 185, 186, 3, 2, 1, 0, 186, 188, 1, 0, 0, 0, 187, 182, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 23, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 5, 18, 0, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 207, 5, 32, 0, 0, 196, 207, 5, 33, 0, 0, 197, 199, 5, 18, 0, 0, 198, 197, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 207, 5, 31, 0, 0, 201, 207, 5, 34, 0, 0, 202, 207, 5, 35, 0, 0, 203, 207, 5, 26, 0, 0, 204, 207, 5, 27, 0, 0, 205, 207, 5, 28, 0, 0, 206, 193, 1, 0, 0, 0, 206, 196, 1, 0, 0, 0, 206, 198, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 25, 1, 0, 0, 0, 29, 35, 42, 50, 61, 73, 75, 82, 88, 91, 101, 104, 114, 117, 120, 122, 126, 131, 134, 142, 145, 150, 153, 157, 164, 176, 189, 193, 198, 206] \ No newline at end of file +[4, 1, 36, 251, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 42, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 47, 8, 2, 10, 2, 12, 2, 50, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 55, 8, 3, 10, 3, 12, 3, 58, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 66, 8, 4, 10, 4, 12, 4, 69, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 80, 8, 5, 10, 5, 12, 5, 83, 9, 5, 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 1, 6, 4, 6, 93, 8, 6, 11, 6, 12, 6, 94, 1, 6, 3, 6, 98, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 106, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 114, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 120, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 125, 8, 7, 10, 7, 12, 7, 128, 9, 7, 1, 8, 3, 8, 131, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 136, 8, 8, 1, 8, 3, 8, 139, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 147, 8, 8, 1, 8, 3, 8, 150, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 155, 8, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, 167, 8, 8, 10, 8, 12, 8, 170, 9, 8, 1, 8, 1, 8, 3, 8, 174, 8, 8, 1, 8, 3, 8, 177, 8, 8, 1, 8, 1, 8, 3, 8, 181, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 186, 8, 9, 10, 9, 12, 9, 189, 9, 9, 1, 10, 1, 10, 1, 10, 5, 10, 194, 8, 10, 10, 10, 12, 10, 197, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 207, 8, 11, 10, 11, 12, 11, 210, 9, 11, 1, 12, 3, 12, 213, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 225, 8, 13, 10, 13, 12, 13, 228, 9, 13, 1, 14, 3, 14, 231, 8, 14, 1, 14, 1, 14, 1, 15, 3, 15, 236, 8, 15, 1, 15, 1, 15, 1, 15, 3, 15, 241, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 249, 8, 15, 1, 15, 0, 3, 8, 10, 14, 16, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 281, 0, 32, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 43, 1, 0, 0, 0, 6, 51, 1, 0, 0, 0, 8, 59, 1, 0, 0, 0, 10, 70, 1, 0, 0, 0, 12, 97, 1, 0, 0, 0, 14, 99, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 182, 1, 0, 0, 0, 20, 190, 1, 0, 0, 0, 22, 198, 1, 0, 0, 0, 24, 212, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 230, 1, 0, 0, 0, 30, 248, 1, 0, 0, 0, 32, 33, 3, 2, 1, 0, 33, 34, 5, 0, 0, 1, 34, 1, 1, 0, 0, 0, 35, 41, 3, 4, 2, 0, 36, 37, 5, 20, 0, 0, 37, 38, 3, 4, 2, 0, 38, 39, 5, 21, 0, 0, 39, 40, 3, 2, 1, 0, 40, 42, 1, 0, 0, 0, 41, 36, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 3, 1, 0, 0, 0, 43, 48, 3, 6, 3, 0, 44, 45, 5, 9, 0, 0, 45, 47, 3, 6, 3, 0, 46, 44, 1, 0, 0, 0, 47, 50, 1, 0, 0, 0, 48, 46, 1, 0, 0, 0, 48, 49, 1, 0, 0, 0, 49, 5, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 51, 56, 3, 8, 4, 0, 52, 53, 5, 8, 0, 0, 53, 55, 3, 8, 4, 0, 54, 52, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 7, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 60, 6, 4, -1, 0, 60, 61, 3, 10, 5, 0, 61, 67, 1, 0, 0, 0, 62, 63, 10, 1, 0, 0, 63, 64, 7, 0, 0, 0, 64, 66, 3, 8, 4, 2, 65, 62, 1, 0, 0, 0, 66, 69, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 9, 1, 0, 0, 0, 69, 67, 1, 0, 0, 0, 70, 71, 6, 5, -1, 0, 71, 72, 3, 12, 6, 0, 72, 81, 1, 0, 0, 0, 73, 74, 10, 2, 0, 0, 74, 75, 7, 1, 0, 0, 75, 80, 3, 10, 5, 3, 76, 77, 10, 1, 0, 0, 77, 78, 7, 2, 0, 0, 78, 80, 3, 10, 5, 2, 79, 73, 1, 0, 0, 0, 79, 76, 1, 0, 0, 0, 80, 83, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 11, 1, 0, 0, 0, 83, 81, 1, 0, 0, 0, 84, 98, 3, 14, 7, 0, 85, 87, 5, 19, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 98, 3, 14, 7, 0, 91, 93, 5, 18, 0, 0, 92, 91, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 92, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 3, 14, 7, 0, 97, 84, 1, 0, 0, 0, 97, 86, 1, 0, 0, 0, 97, 92, 1, 0, 0, 0, 98, 13, 1, 0, 0, 0, 99, 100, 6, 7, -1, 0, 100, 101, 3, 16, 8, 0, 101, 126, 1, 0, 0, 0, 102, 103, 10, 3, 0, 0, 103, 105, 5, 16, 0, 0, 104, 106, 5, 20, 0, 0, 105, 104, 1, 0, 0, 0, 105, 106, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 125, 5, 36, 0, 0, 108, 109, 10, 2, 0, 0, 109, 110, 5, 16, 0, 0, 110, 111, 5, 36, 0, 0, 111, 113, 5, 14, 0, 0, 112, 114, 3, 18, 9, 0, 113, 112, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 125, 5, 15, 0, 0, 116, 117, 10, 1, 0, 0, 117, 119, 5, 10, 0, 0, 118, 120, 5, 20, 0, 0, 119, 118, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 122, 3, 2, 1, 0, 122, 123, 5, 11, 0, 0, 123, 125, 1, 0, 0, 0, 124, 102, 1, 0, 0, 0, 124, 108, 1, 0, 0, 0, 124, 116, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 15, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 129, 131, 5, 16, 0, 0, 130, 129, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 138, 5, 36, 0, 0, 133, 135, 5, 14, 0, 0, 134, 136, 3, 18, 9, 0, 135, 134, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 139, 5, 15, 0, 0, 138, 133, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 181, 1, 0, 0, 0, 140, 141, 5, 14, 0, 0, 141, 142, 3, 2, 1, 0, 142, 143, 5, 15, 0, 0, 143, 181, 1, 0, 0, 0, 144, 146, 5, 10, 0, 0, 145, 147, 3, 20, 10, 0, 146, 145, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 149, 1, 0, 0, 0, 148, 150, 5, 17, 0, 0, 149, 148, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 181, 5, 11, 0, 0, 152, 154, 5, 12, 0, 0, 153, 155, 3, 26, 13, 0, 154, 153, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 157, 1, 0, 0, 0, 156, 158, 5, 17, 0, 0, 157, 156, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 181, 5, 13, 0, 0, 160, 162, 5, 16, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 168, 5, 36, 0, 0, 164, 165, 5, 16, 0, 0, 165, 167, 5, 36, 0, 0, 166, 164, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 173, 5, 12, 0, 0, 172, 174, 3, 22, 11, 0, 173, 172, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 177, 5, 17, 0, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 181, 5, 13, 0, 0, 179, 181, 3, 30, 15, 0, 180, 130, 1, 0, 0, 0, 180, 140, 1, 0, 0, 0, 180, 144, 1, 0, 0, 0, 180, 152, 1, 0, 0, 0, 180, 161, 1, 0, 0, 0, 180, 179, 1, 0, 0, 0, 181, 17, 1, 0, 0, 0, 182, 187, 3, 2, 1, 0, 183, 184, 5, 17, 0, 0, 184, 186, 3, 2, 1, 0, 185, 183, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 19, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 190, 195, 3, 28, 14, 0, 191, 192, 5, 17, 0, 0, 192, 194, 3, 28, 14, 0, 193, 191, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 21, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 199, 3, 24, 12, 0, 199, 200, 5, 21, 0, 0, 200, 208, 3, 2, 1, 0, 201, 202, 5, 17, 0, 0, 202, 203, 3, 24, 12, 0, 203, 204, 5, 21, 0, 0, 204, 205, 3, 2, 1, 0, 205, 207, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 23, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 211, 213, 5, 20, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 36, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 3, 28, 14, 0, 217, 218, 5, 21, 0, 0, 218, 226, 3, 2, 1, 0, 219, 220, 5, 17, 0, 0, 220, 221, 3, 28, 14, 0, 221, 222, 5, 21, 0, 0, 222, 223, 3, 2, 1, 0, 223, 225, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 27, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 229, 231, 5, 20, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 3, 2, 1, 0, 233, 29, 1, 0, 0, 0, 234, 236, 5, 18, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 249, 5, 32, 0, 0, 238, 249, 5, 33, 0, 0, 239, 241, 5, 18, 0, 0, 240, 239, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 249, 5, 31, 0, 0, 243, 249, 5, 34, 0, 0, 244, 249, 5, 35, 0, 0, 245, 249, 5, 26, 0, 0, 246, 249, 5, 27, 0, 0, 247, 249, 5, 28, 0, 0, 248, 235, 1, 0, 0, 0, 248, 238, 1, 0, 0, 0, 248, 240, 1, 0, 0, 0, 248, 243, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 248, 245, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 247, 1, 0, 0, 0, 249, 31, 1, 0, 0, 0, 35, 41, 48, 56, 67, 79, 81, 88, 94, 97, 105, 113, 119, 124, 126, 130, 135, 138, 146, 149, 154, 157, 161, 168, 173, 176, 180, 187, 195, 208, 212, 226, 230, 235, 240, 248] \ No newline at end of file diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go b/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go index 969a59861..0247f470a 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go +++ b/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go @@ -1,7 +1,7 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.12.0. DO NOT EDIT. package gen // CEL -import "github.com/antlr/antlr4/runtime/Go/antlr" +import "github.com/antlr/antlr4/runtime/Go/antlr/v4" // BaseCELListener is a complete listener for a parse tree produced by CELParser. type BaseCELListener struct{} @@ -74,11 +74,17 @@ func (s *BaseCELListener) EnterNegate(ctx *NegateContext) {} // ExitNegate is called when production Negate is exited. func (s *BaseCELListener) ExitNegate(ctx *NegateContext) {} -// EnterSelectOrCall is called when production SelectOrCall is entered. -func (s *BaseCELListener) EnterSelectOrCall(ctx *SelectOrCallContext) {} +// EnterMemberCall is called when production MemberCall is entered. +func (s *BaseCELListener) EnterMemberCall(ctx *MemberCallContext) {} -// ExitSelectOrCall is called when production SelectOrCall is exited. -func (s *BaseCELListener) ExitSelectOrCall(ctx *SelectOrCallContext) {} +// ExitMemberCall is called when production MemberCall is exited. +func (s *BaseCELListener) ExitMemberCall(ctx *MemberCallContext) {} + +// EnterSelect is called when production Select is entered. +func (s *BaseCELListener) EnterSelect(ctx *SelectContext) {} + +// ExitSelect is called when production Select is exited. +func (s *BaseCELListener) ExitSelect(ctx *SelectContext) {} // EnterPrimaryExpr is called when production PrimaryExpr is entered. func (s *BaseCELListener) EnterPrimaryExpr(ctx *PrimaryExprContext) {} @@ -92,12 +98,6 @@ func (s *BaseCELListener) EnterIndex(ctx *IndexContext) {} // ExitIndex is called when production Index is exited. func (s *BaseCELListener) ExitIndex(ctx *IndexContext) {} -// EnterCreateMessage is called when production CreateMessage is entered. -func (s *BaseCELListener) EnterCreateMessage(ctx *CreateMessageContext) {} - -// ExitCreateMessage is called when production CreateMessage is exited. -func (s *BaseCELListener) ExitCreateMessage(ctx *CreateMessageContext) {} - // EnterIdentOrGlobalCall is called when production IdentOrGlobalCall is entered. func (s *BaseCELListener) EnterIdentOrGlobalCall(ctx *IdentOrGlobalCallContext) {} @@ -122,6 +122,12 @@ func (s *BaseCELListener) EnterCreateStruct(ctx *CreateStructContext) {} // ExitCreateStruct is called when production CreateStruct is exited. func (s *BaseCELListener) ExitCreateStruct(ctx *CreateStructContext) {} +// EnterCreateMessage is called when production CreateMessage is entered. +func (s *BaseCELListener) EnterCreateMessage(ctx *CreateMessageContext) {} + +// ExitCreateMessage is called when production CreateMessage is exited. +func (s *BaseCELListener) ExitCreateMessage(ctx *CreateMessageContext) {} + // EnterConstantLiteral is called when production ConstantLiteral is entered. func (s *BaseCELListener) EnterConstantLiteral(ctx *ConstantLiteralContext) {} @@ -134,18 +140,36 @@ func (s *BaseCELListener) EnterExprList(ctx *ExprListContext) {} // ExitExprList is called when production exprList is exited. func (s *BaseCELListener) ExitExprList(ctx *ExprListContext) {} +// EnterListInit is called when production listInit is entered. +func (s *BaseCELListener) EnterListInit(ctx *ListInitContext) {} + +// ExitListInit is called when production listInit is exited. +func (s *BaseCELListener) ExitListInit(ctx *ListInitContext) {} + // EnterFieldInitializerList is called when production fieldInitializerList is entered. func (s *BaseCELListener) EnterFieldInitializerList(ctx *FieldInitializerListContext) {} // ExitFieldInitializerList is called when production fieldInitializerList is exited. func (s *BaseCELListener) ExitFieldInitializerList(ctx *FieldInitializerListContext) {} +// EnterOptField is called when production optField is entered. +func (s *BaseCELListener) EnterOptField(ctx *OptFieldContext) {} + +// ExitOptField is called when production optField is exited. +func (s *BaseCELListener) ExitOptField(ctx *OptFieldContext) {} + // EnterMapInitializerList is called when production mapInitializerList is entered. func (s *BaseCELListener) EnterMapInitializerList(ctx *MapInitializerListContext) {} // ExitMapInitializerList is called when production mapInitializerList is exited. func (s *BaseCELListener) ExitMapInitializerList(ctx *MapInitializerListContext) {} +// EnterOptExpr is called when production optExpr is entered. +func (s *BaseCELListener) EnterOptExpr(ctx *OptExprContext) {} + +// ExitOptExpr is called when production optExpr is exited. +func (s *BaseCELListener) ExitOptExpr(ctx *OptExprContext) {} + // EnterInt is called when production Int is entered. func (s *BaseCELListener) EnterInt(ctx *IntContext) {} diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go b/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go index 8e84579ed..52a7f4dc5 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go +++ b/tools/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go @@ -1,7 +1,7 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.12.0. DO NOT EDIT. package gen // CEL -import "github.com/antlr/antlr4/runtime/Go/antlr" +import "github.com/antlr/antlr4/runtime/Go/antlr/v4" type BaseCELVisitor struct { *antlr.BaseParseTreeVisitor @@ -43,19 +43,19 @@ func (v *BaseCELVisitor) VisitNegate(ctx *NegateContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseCELVisitor) VisitSelectOrCall(ctx *SelectOrCallContext) interface{} { +func (v *BaseCELVisitor) VisitMemberCall(ctx *MemberCallContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseCELVisitor) VisitPrimaryExpr(ctx *PrimaryExprContext) interface{} { +func (v *BaseCELVisitor) VisitSelect(ctx *SelectContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseCELVisitor) VisitIndex(ctx *IndexContext) interface{} { +func (v *BaseCELVisitor) VisitPrimaryExpr(ctx *PrimaryExprContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseCELVisitor) VisitCreateMessage(ctx *CreateMessageContext) interface{} { +func (v *BaseCELVisitor) VisitIndex(ctx *IndexContext) interface{} { return v.VisitChildren(ctx) } @@ -75,6 +75,10 @@ func (v *BaseCELVisitor) VisitCreateStruct(ctx *CreateStructContext) interface{} return v.VisitChildren(ctx) } +func (v *BaseCELVisitor) VisitCreateMessage(ctx *CreateMessageContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BaseCELVisitor) VisitConstantLiteral(ctx *ConstantLiteralContext) interface{} { return v.VisitChildren(ctx) } @@ -83,14 +87,26 @@ func (v *BaseCELVisitor) VisitExprList(ctx *ExprListContext) interface{} { return v.VisitChildren(ctx) } +func (v *BaseCELVisitor) VisitListInit(ctx *ListInitContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BaseCELVisitor) VisitFieldInitializerList(ctx *FieldInitializerListContext) interface{} { return v.VisitChildren(ctx) } +func (v *BaseCELVisitor) VisitOptField(ctx *OptFieldContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BaseCELVisitor) VisitMapInitializerList(ctx *MapInitializerListContext) interface{} { return v.VisitChildren(ctx) } +func (v *BaseCELVisitor) VisitOptExpr(ctx *OptExprContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BaseCELVisitor) VisitInt(ctx *IntContext) interface{} { return v.VisitChildren(ctx) } diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go b/tools/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go index 7b4cca62e..98ddc06d0 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go +++ b/tools/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.12.0. DO NOT EDIT. package gen @@ -7,7 +7,7 @@ import ( "sync" "unicode" - "github.com/antlr/antlr4/runtime/Go/antlr" + "github.com/antlr/antlr4/runtime/Go/antlr/v4" ) // Suppress unused import error diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/cel_listener.go b/tools/vendor/github.com/google/cel-go/parser/gen/cel_listener.go index 1b631b6e1..73b7f1d39 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/cel_listener.go +++ b/tools/vendor/github.com/google/cel-go/parser/gen/cel_listener.go @@ -1,7 +1,7 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.12.0. DO NOT EDIT. package gen // CEL -import "github.com/antlr/antlr4/runtime/Go/antlr" +import "github.com/antlr/antlr4/runtime/Go/antlr/v4" // CELListener is a complete listener for a parse tree produced by CELParser. type CELListener interface { @@ -34,8 +34,11 @@ type CELListener interface { // EnterNegate is called when entering the Negate production. EnterNegate(c *NegateContext) - // EnterSelectOrCall is called when entering the SelectOrCall production. - EnterSelectOrCall(c *SelectOrCallContext) + // EnterMemberCall is called when entering the MemberCall production. + EnterMemberCall(c *MemberCallContext) + + // EnterSelect is called when entering the Select production. + EnterSelect(c *SelectContext) // EnterPrimaryExpr is called when entering the PrimaryExpr production. EnterPrimaryExpr(c *PrimaryExprContext) @@ -43,9 +46,6 @@ type CELListener interface { // EnterIndex is called when entering the Index production. EnterIndex(c *IndexContext) - // EnterCreateMessage is called when entering the CreateMessage production. - EnterCreateMessage(c *CreateMessageContext) - // EnterIdentOrGlobalCall is called when entering the IdentOrGlobalCall production. EnterIdentOrGlobalCall(c *IdentOrGlobalCallContext) @@ -58,18 +58,30 @@ type CELListener interface { // EnterCreateStruct is called when entering the CreateStruct production. EnterCreateStruct(c *CreateStructContext) + // EnterCreateMessage is called when entering the CreateMessage production. + EnterCreateMessage(c *CreateMessageContext) + // EnterConstantLiteral is called when entering the ConstantLiteral production. EnterConstantLiteral(c *ConstantLiteralContext) // EnterExprList is called when entering the exprList production. EnterExprList(c *ExprListContext) + // EnterListInit is called when entering the listInit production. + EnterListInit(c *ListInitContext) + // EnterFieldInitializerList is called when entering the fieldInitializerList production. EnterFieldInitializerList(c *FieldInitializerListContext) + // EnterOptField is called when entering the optField production. + EnterOptField(c *OptFieldContext) + // EnterMapInitializerList is called when entering the mapInitializerList production. EnterMapInitializerList(c *MapInitializerListContext) + // EnterOptExpr is called when entering the optExpr production. + EnterOptExpr(c *OptExprContext) + // EnterInt is called when entering the Int production. EnterInt(c *IntContext) @@ -121,8 +133,11 @@ type CELListener interface { // ExitNegate is called when exiting the Negate production. ExitNegate(c *NegateContext) - // ExitSelectOrCall is called when exiting the SelectOrCall production. - ExitSelectOrCall(c *SelectOrCallContext) + // ExitMemberCall is called when exiting the MemberCall production. + ExitMemberCall(c *MemberCallContext) + + // ExitSelect is called when exiting the Select production. + ExitSelect(c *SelectContext) // ExitPrimaryExpr is called when exiting the PrimaryExpr production. ExitPrimaryExpr(c *PrimaryExprContext) @@ -130,9 +145,6 @@ type CELListener interface { // ExitIndex is called when exiting the Index production. ExitIndex(c *IndexContext) - // ExitCreateMessage is called when exiting the CreateMessage production. - ExitCreateMessage(c *CreateMessageContext) - // ExitIdentOrGlobalCall is called when exiting the IdentOrGlobalCall production. ExitIdentOrGlobalCall(c *IdentOrGlobalCallContext) @@ -145,18 +157,30 @@ type CELListener interface { // ExitCreateStruct is called when exiting the CreateStruct production. ExitCreateStruct(c *CreateStructContext) + // ExitCreateMessage is called when exiting the CreateMessage production. + ExitCreateMessage(c *CreateMessageContext) + // ExitConstantLiteral is called when exiting the ConstantLiteral production. ExitConstantLiteral(c *ConstantLiteralContext) // ExitExprList is called when exiting the exprList production. ExitExprList(c *ExprListContext) + // ExitListInit is called when exiting the listInit production. + ExitListInit(c *ListInitContext) + // ExitFieldInitializerList is called when exiting the fieldInitializerList production. ExitFieldInitializerList(c *FieldInitializerListContext) + // ExitOptField is called when exiting the optField production. + ExitOptField(c *OptFieldContext) + // ExitMapInitializerList is called when exiting the mapInitializerList production. ExitMapInitializerList(c *MapInitializerListContext) + // ExitOptExpr is called when exiting the optExpr production. + ExitOptExpr(c *OptExprContext) + // ExitInt is called when exiting the Int production. ExitInt(c *IntContext) diff --git a/tools/vendor/github.com/google/cel-go/parser/gen/cel_parser.go b/tools/vendor/github.com/google/cel-go/parser/gen/cel_parser.go index afb3fe0d1..0cb6c8eae 100644 --- a/tools/vendor/github.com/google/cel-go/parser/gen/cel_parser.go +++ b/tools/vendor/github.com/google/cel-go/parser/gen/cel_parser.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.12.0. DO NOT EDIT. package gen // CEL import ( @@ -6,7 +6,7 @@ import ( "strconv" "sync" - "github.com/antlr/antlr4/runtime/Go/antlr" + "github.com/antlr/antlr4/runtime/Go/antlr/v4" ) // Suppress unused import errors @@ -46,106 +46,125 @@ func celParserInit() { } staticData.ruleNames = []string{ "start", "expr", "conditionalOr", "conditionalAnd", "relation", "calc", - "unary", "member", "primary", "exprList", "fieldInitializerList", "mapInitializerList", - "literal", + "unary", "member", "primary", "exprList", "listInit", "fieldInitializerList", + "optField", "mapInitializerList", "optExpr", "literal", } staticData.predictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 1, 36, 209, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 1, 36, 251, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, - 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 36, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 41, 8, 2, 10, 2, - 12, 2, 44, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 49, 8, 3, 10, 3, 12, 3, 52, 9, - 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 60, 8, 4, 10, 4, 12, 4, 63, - 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 74, 8, - 5, 10, 5, 12, 5, 77, 9, 5, 1, 6, 1, 6, 4, 6, 81, 8, 6, 11, 6, 12, 6, 82, - 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 3, 6, 92, 8, 6, 1, - 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 7, 3, - 7, 105, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 115, - 8, 7, 1, 7, 3, 7, 118, 8, 7, 1, 7, 5, 7, 121, 8, 7, 10, 7, 12, 7, 124, - 9, 7, 1, 8, 3, 8, 127, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 132, 8, 8, 1, 8, 3, - 8, 135, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 143, 8, 8, 1, 8, - 3, 8, 146, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, - 8, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 163, 8, 9, 10, - 9, 12, 9, 166, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, - 10, 175, 8, 10, 10, 10, 12, 10, 178, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, - 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 188, 8, 11, 10, 11, 12, 11, 191, 9, - 11, 1, 12, 3, 12, 194, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 199, 8, 12, 1, - 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 207, 8, 12, 1, 12, 0, 3, - 8, 10, 14, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 3, 1, - 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 235, 0, 26, 1, 0, 0, 0, 2, - 29, 1, 0, 0, 0, 4, 37, 1, 0, 0, 0, 6, 45, 1, 0, 0, 0, 8, 53, 1, 0, 0, 0, - 10, 64, 1, 0, 0, 0, 12, 91, 1, 0, 0, 0, 14, 93, 1, 0, 0, 0, 16, 157, 1, - 0, 0, 0, 18, 159, 1, 0, 0, 0, 20, 167, 1, 0, 0, 0, 22, 179, 1, 0, 0, 0, - 24, 206, 1, 0, 0, 0, 26, 27, 3, 2, 1, 0, 27, 28, 5, 0, 0, 1, 28, 1, 1, - 0, 0, 0, 29, 35, 3, 4, 2, 0, 30, 31, 5, 20, 0, 0, 31, 32, 3, 4, 2, 0, 32, - 33, 5, 21, 0, 0, 33, 34, 3, 2, 1, 0, 34, 36, 1, 0, 0, 0, 35, 30, 1, 0, - 0, 0, 35, 36, 1, 0, 0, 0, 36, 3, 1, 0, 0, 0, 37, 42, 3, 6, 3, 0, 38, 39, - 5, 9, 0, 0, 39, 41, 3, 6, 3, 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, - 42, 40, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 5, 1, 0, 0, 0, 44, 42, 1, 0, - 0, 0, 45, 50, 3, 8, 4, 0, 46, 47, 5, 8, 0, 0, 47, 49, 3, 8, 4, 0, 48, 46, - 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, - 51, 7, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 6, 4, -1, 0, 54, 55, 3, - 10, 5, 0, 55, 61, 1, 0, 0, 0, 56, 57, 10, 1, 0, 0, 57, 58, 7, 0, 0, 0, - 58, 60, 3, 8, 4, 2, 59, 56, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, - 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 9, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, - 65, 6, 5, -1, 0, 65, 66, 3, 12, 6, 0, 66, 75, 1, 0, 0, 0, 67, 68, 10, 2, - 0, 0, 68, 69, 7, 1, 0, 0, 69, 74, 3, 10, 5, 3, 70, 71, 10, 1, 0, 0, 71, - 72, 7, 2, 0, 0, 72, 74, 3, 10, 5, 2, 73, 67, 1, 0, 0, 0, 73, 70, 1, 0, - 0, 0, 74, 77, 1, 0, 0, 0, 75, 73, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 11, - 1, 0, 0, 0, 77, 75, 1, 0, 0, 0, 78, 92, 3, 14, 7, 0, 79, 81, 5, 19, 0, - 0, 80, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, - 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 92, 3, 14, 7, 0, 85, 87, 5, 18, 0, - 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, - 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 3, 14, 7, 0, 91, 78, 1, 0, 0, 0, - 91, 80, 1, 0, 0, 0, 91, 86, 1, 0, 0, 0, 92, 13, 1, 0, 0, 0, 93, 94, 6, - 7, -1, 0, 94, 95, 3, 16, 8, 0, 95, 122, 1, 0, 0, 0, 96, 97, 10, 3, 0, 0, - 97, 98, 5, 16, 0, 0, 98, 104, 5, 36, 0, 0, 99, 101, 5, 14, 0, 0, 100, 102, - 3, 18, 9, 0, 101, 100, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 103, 1, 0, - 0, 0, 103, 105, 5, 15, 0, 0, 104, 99, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, - 105, 121, 1, 0, 0, 0, 106, 107, 10, 2, 0, 0, 107, 108, 5, 10, 0, 0, 108, - 109, 3, 2, 1, 0, 109, 110, 5, 11, 0, 0, 110, 121, 1, 0, 0, 0, 111, 112, - 10, 1, 0, 0, 112, 114, 5, 12, 0, 0, 113, 115, 3, 20, 10, 0, 114, 113, 1, - 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 117, 1, 0, 0, 0, 116, 118, 5, 17, 0, - 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, - 121, 5, 13, 0, 0, 120, 96, 1, 0, 0, 0, 120, 106, 1, 0, 0, 0, 120, 111, - 1, 0, 0, 0, 121, 124, 1, 0, 0, 0, 122, 120, 1, 0, 0, 0, 122, 123, 1, 0, - 0, 0, 123, 15, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 125, 127, 5, 16, 0, 0, - 126, 125, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, - 134, 5, 36, 0, 0, 129, 131, 5, 14, 0, 0, 130, 132, 3, 18, 9, 0, 131, 130, - 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 5, 15, - 0, 0, 134, 129, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 158, 1, 0, 0, 0, - 136, 137, 5, 14, 0, 0, 137, 138, 3, 2, 1, 0, 138, 139, 5, 15, 0, 0, 139, - 158, 1, 0, 0, 0, 140, 142, 5, 10, 0, 0, 141, 143, 3, 18, 9, 0, 142, 141, - 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 146, 5, 17, - 0, 0, 145, 144, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, - 147, 158, 5, 11, 0, 0, 148, 150, 5, 12, 0, 0, 149, 151, 3, 22, 11, 0, 150, - 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, - 5, 17, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, - 0, 0, 155, 158, 5, 13, 0, 0, 156, 158, 3, 24, 12, 0, 157, 126, 1, 0, 0, - 0, 157, 136, 1, 0, 0, 0, 157, 140, 1, 0, 0, 0, 157, 148, 1, 0, 0, 0, 157, - 156, 1, 0, 0, 0, 158, 17, 1, 0, 0, 0, 159, 164, 3, 2, 1, 0, 160, 161, 5, - 17, 0, 0, 161, 163, 3, 2, 1, 0, 162, 160, 1, 0, 0, 0, 163, 166, 1, 0, 0, - 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 19, 1, 0, 0, 0, 166, - 164, 1, 0, 0, 0, 167, 168, 5, 36, 0, 0, 168, 169, 5, 21, 0, 0, 169, 176, - 3, 2, 1, 0, 170, 171, 5, 17, 0, 0, 171, 172, 5, 36, 0, 0, 172, 173, 5, - 21, 0, 0, 173, 175, 3, 2, 1, 0, 174, 170, 1, 0, 0, 0, 175, 178, 1, 0, 0, - 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 21, 1, 0, 0, 0, 178, - 176, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 21, 0, 0, 181, 189, - 3, 2, 1, 0, 182, 183, 5, 17, 0, 0, 183, 184, 3, 2, 1, 0, 184, 185, 5, 21, - 0, 0, 185, 186, 3, 2, 1, 0, 186, 188, 1, 0, 0, 0, 187, 182, 1, 0, 0, 0, - 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, - 23, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 5, 18, 0, 0, 193, 192, - 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 207, 5, 32, - 0, 0, 196, 207, 5, 33, 0, 0, 197, 199, 5, 18, 0, 0, 198, 197, 1, 0, 0, - 0, 198, 199, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 207, 5, 31, 0, 0, 201, - 207, 5, 34, 0, 0, 202, 207, 5, 35, 0, 0, 203, 207, 5, 26, 0, 0, 204, 207, - 5, 27, 0, 0, 205, 207, 5, 28, 0, 0, 206, 193, 1, 0, 0, 0, 206, 196, 1, - 0, 0, 0, 206, 198, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, - 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, - 25, 1, 0, 0, 0, 29, 35, 42, 50, 61, 73, 75, 82, 88, 91, 101, 104, 114, - 117, 120, 122, 126, 131, 134, 142, 145, 150, 153, 157, 164, 176, 189, 193, - 198, 206, + 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, + 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 42, 8, 1, 1, + 2, 1, 2, 1, 2, 5, 2, 47, 8, 2, 10, 2, 12, 2, 50, 9, 2, 1, 3, 1, 3, 1, 3, + 5, 3, 55, 8, 3, 10, 3, 12, 3, 58, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, + 4, 5, 4, 66, 8, 4, 10, 4, 12, 4, 69, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, + 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 80, 8, 5, 10, 5, 12, 5, 83, 9, 5, 1, 6, 1, + 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 1, 6, 4, 6, 93, 8, 6, 11, 6, + 12, 6, 94, 1, 6, 3, 6, 98, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, + 7, 106, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 114, 8, 7, 1, 7, + 1, 7, 1, 7, 1, 7, 3, 7, 120, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 125, 8, 7, 10, + 7, 12, 7, 128, 9, 7, 1, 8, 3, 8, 131, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 136, + 8, 8, 1, 8, 3, 8, 139, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, + 147, 8, 8, 1, 8, 3, 8, 150, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 155, 8, 8, 1, + 8, 3, 8, 158, 8, 8, 1, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, + 167, 8, 8, 10, 8, 12, 8, 170, 9, 8, 1, 8, 1, 8, 3, 8, 174, 8, 8, 1, 8, + 3, 8, 177, 8, 8, 1, 8, 1, 8, 3, 8, 181, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 186, + 8, 9, 10, 9, 12, 9, 189, 9, 9, 1, 10, 1, 10, 1, 10, 5, 10, 194, 8, 10, + 10, 10, 12, 10, 197, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, + 11, 1, 11, 5, 11, 207, 8, 11, 10, 11, 12, 11, 210, 9, 11, 1, 12, 3, 12, + 213, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, + 13, 1, 13, 5, 13, 225, 8, 13, 10, 13, 12, 13, 228, 9, 13, 1, 14, 3, 14, + 231, 8, 14, 1, 14, 1, 14, 1, 15, 3, 15, 236, 8, 15, 1, 15, 1, 15, 1, 15, + 3, 15, 241, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 249, + 8, 15, 1, 15, 0, 3, 8, 10, 14, 16, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, + 22, 24, 26, 28, 30, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, + 281, 0, 32, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 43, 1, 0, 0, 0, 6, 51, 1, + 0, 0, 0, 8, 59, 1, 0, 0, 0, 10, 70, 1, 0, 0, 0, 12, 97, 1, 0, 0, 0, 14, + 99, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 182, 1, 0, 0, 0, 20, 190, 1, 0, + 0, 0, 22, 198, 1, 0, 0, 0, 24, 212, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, + 230, 1, 0, 0, 0, 30, 248, 1, 0, 0, 0, 32, 33, 3, 2, 1, 0, 33, 34, 5, 0, + 0, 1, 34, 1, 1, 0, 0, 0, 35, 41, 3, 4, 2, 0, 36, 37, 5, 20, 0, 0, 37, 38, + 3, 4, 2, 0, 38, 39, 5, 21, 0, 0, 39, 40, 3, 2, 1, 0, 40, 42, 1, 0, 0, 0, + 41, 36, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 3, 1, 0, 0, 0, 43, 48, 3, 6, + 3, 0, 44, 45, 5, 9, 0, 0, 45, 47, 3, 6, 3, 0, 46, 44, 1, 0, 0, 0, 47, 50, + 1, 0, 0, 0, 48, 46, 1, 0, 0, 0, 48, 49, 1, 0, 0, 0, 49, 5, 1, 0, 0, 0, + 50, 48, 1, 0, 0, 0, 51, 56, 3, 8, 4, 0, 52, 53, 5, 8, 0, 0, 53, 55, 3, + 8, 4, 0, 54, 52, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, + 57, 1, 0, 0, 0, 57, 7, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 60, 6, 4, -1, + 0, 60, 61, 3, 10, 5, 0, 61, 67, 1, 0, 0, 0, 62, 63, 10, 1, 0, 0, 63, 64, + 7, 0, 0, 0, 64, 66, 3, 8, 4, 2, 65, 62, 1, 0, 0, 0, 66, 69, 1, 0, 0, 0, + 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 9, 1, 0, 0, 0, 69, 67, 1, 0, + 0, 0, 70, 71, 6, 5, -1, 0, 71, 72, 3, 12, 6, 0, 72, 81, 1, 0, 0, 0, 73, + 74, 10, 2, 0, 0, 74, 75, 7, 1, 0, 0, 75, 80, 3, 10, 5, 3, 76, 77, 10, 1, + 0, 0, 77, 78, 7, 2, 0, 0, 78, 80, 3, 10, 5, 2, 79, 73, 1, 0, 0, 0, 79, + 76, 1, 0, 0, 0, 80, 83, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, + 0, 82, 11, 1, 0, 0, 0, 83, 81, 1, 0, 0, 0, 84, 98, 3, 14, 7, 0, 85, 87, + 5, 19, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, + 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 98, 3, 14, 7, 0, 91, 93, 5, + 18, 0, 0, 92, 91, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 92, 1, 0, 0, 0, 94, + 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 3, 14, 7, 0, 97, 84, 1, 0, + 0, 0, 97, 86, 1, 0, 0, 0, 97, 92, 1, 0, 0, 0, 98, 13, 1, 0, 0, 0, 99, 100, + 6, 7, -1, 0, 100, 101, 3, 16, 8, 0, 101, 126, 1, 0, 0, 0, 102, 103, 10, + 3, 0, 0, 103, 105, 5, 16, 0, 0, 104, 106, 5, 20, 0, 0, 105, 104, 1, 0, + 0, 0, 105, 106, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 125, 5, 36, 0, 0, + 108, 109, 10, 2, 0, 0, 109, 110, 5, 16, 0, 0, 110, 111, 5, 36, 0, 0, 111, + 113, 5, 14, 0, 0, 112, 114, 3, 18, 9, 0, 113, 112, 1, 0, 0, 0, 113, 114, + 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 125, 5, 15, 0, 0, 116, 117, 10, + 1, 0, 0, 117, 119, 5, 10, 0, 0, 118, 120, 5, 20, 0, 0, 119, 118, 1, 0, + 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 122, 3, 2, 1, 0, + 122, 123, 5, 11, 0, 0, 123, 125, 1, 0, 0, 0, 124, 102, 1, 0, 0, 0, 124, + 108, 1, 0, 0, 0, 124, 116, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, + 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 15, 1, 0, 0, 0, 128, 126, 1, 0, + 0, 0, 129, 131, 5, 16, 0, 0, 130, 129, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, + 131, 132, 1, 0, 0, 0, 132, 138, 5, 36, 0, 0, 133, 135, 5, 14, 0, 0, 134, + 136, 3, 18, 9, 0, 135, 134, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 137, + 1, 0, 0, 0, 137, 139, 5, 15, 0, 0, 138, 133, 1, 0, 0, 0, 138, 139, 1, 0, + 0, 0, 139, 181, 1, 0, 0, 0, 140, 141, 5, 14, 0, 0, 141, 142, 3, 2, 1, 0, + 142, 143, 5, 15, 0, 0, 143, 181, 1, 0, 0, 0, 144, 146, 5, 10, 0, 0, 145, + 147, 3, 20, 10, 0, 146, 145, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 149, + 1, 0, 0, 0, 148, 150, 5, 17, 0, 0, 149, 148, 1, 0, 0, 0, 149, 150, 1, 0, + 0, 0, 150, 151, 1, 0, 0, 0, 151, 181, 5, 11, 0, 0, 152, 154, 5, 12, 0, + 0, 153, 155, 3, 26, 13, 0, 154, 153, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, + 155, 157, 1, 0, 0, 0, 156, 158, 5, 17, 0, 0, 157, 156, 1, 0, 0, 0, 157, + 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 181, 5, 13, 0, 0, 160, 162, + 5, 16, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, + 0, 0, 163, 168, 5, 36, 0, 0, 164, 165, 5, 16, 0, 0, 165, 167, 5, 36, 0, + 0, 166, 164, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, + 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 173, + 5, 12, 0, 0, 172, 174, 3, 22, 11, 0, 173, 172, 1, 0, 0, 0, 173, 174, 1, + 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 177, 5, 17, 0, 0, 176, 175, 1, 0, 0, + 0, 176, 177, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 181, 5, 13, 0, 0, 179, + 181, 3, 30, 15, 0, 180, 130, 1, 0, 0, 0, 180, 140, 1, 0, 0, 0, 180, 144, + 1, 0, 0, 0, 180, 152, 1, 0, 0, 0, 180, 161, 1, 0, 0, 0, 180, 179, 1, 0, + 0, 0, 181, 17, 1, 0, 0, 0, 182, 187, 3, 2, 1, 0, 183, 184, 5, 17, 0, 0, + 184, 186, 3, 2, 1, 0, 185, 183, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, + 185, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 19, 1, 0, 0, 0, 189, 187, 1, + 0, 0, 0, 190, 195, 3, 28, 14, 0, 191, 192, 5, 17, 0, 0, 192, 194, 3, 28, + 14, 0, 193, 191, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, + 195, 196, 1, 0, 0, 0, 196, 21, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 199, + 3, 24, 12, 0, 199, 200, 5, 21, 0, 0, 200, 208, 3, 2, 1, 0, 201, 202, 5, + 17, 0, 0, 202, 203, 3, 24, 12, 0, 203, 204, 5, 21, 0, 0, 204, 205, 3, 2, + 1, 0, 205, 207, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, + 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 23, 1, 0, 0, 0, 210, 208, + 1, 0, 0, 0, 211, 213, 5, 20, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, + 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 36, 0, 0, 215, 25, 1, 0, 0, 0, + 216, 217, 3, 28, 14, 0, 217, 218, 5, 21, 0, 0, 218, 226, 3, 2, 1, 0, 219, + 220, 5, 17, 0, 0, 220, 221, 3, 28, 14, 0, 221, 222, 5, 21, 0, 0, 222, 223, + 3, 2, 1, 0, 223, 225, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 225, 228, 1, 0, + 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 27, 1, 0, 0, 0, + 228, 226, 1, 0, 0, 0, 229, 231, 5, 20, 0, 0, 230, 229, 1, 0, 0, 0, 230, + 231, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 3, 2, 1, 0, 233, 29, 1, + 0, 0, 0, 234, 236, 5, 18, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, + 0, 236, 237, 1, 0, 0, 0, 237, 249, 5, 32, 0, 0, 238, 249, 5, 33, 0, 0, + 239, 241, 5, 18, 0, 0, 240, 239, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, + 242, 1, 0, 0, 0, 242, 249, 5, 31, 0, 0, 243, 249, 5, 34, 0, 0, 244, 249, + 5, 35, 0, 0, 245, 249, 5, 26, 0, 0, 246, 249, 5, 27, 0, 0, 247, 249, 5, + 28, 0, 0, 248, 235, 1, 0, 0, 0, 248, 238, 1, 0, 0, 0, 248, 240, 1, 0, 0, + 0, 248, 243, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 248, 245, 1, 0, 0, 0, 248, + 246, 1, 0, 0, 0, 248, 247, 1, 0, 0, 0, 249, 31, 1, 0, 0, 0, 35, 41, 48, + 56, 67, 79, 81, 88, 94, 97, 105, 113, 119, 124, 126, 130, 135, 138, 146, + 149, 154, 157, 161, 168, 173, 176, 180, 187, 195, 208, 212, 226, 230, 235, + 240, 248, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -234,9 +253,12 @@ const ( CELParserRULE_member = 7 CELParserRULE_primary = 8 CELParserRULE_exprList = 9 - CELParserRULE_fieldInitializerList = 10 - CELParserRULE_mapInitializerList = 11 - CELParserRULE_literal = 12 + CELParserRULE_listInit = 10 + CELParserRULE_fieldInitializerList = 11 + CELParserRULE_optField = 12 + CELParserRULE_mapInitializerList = 13 + CELParserRULE_optExpr = 14 + CELParserRULE_literal = 15 ) // IStartContext is an interface to support dynamic dispatch. @@ -252,6 +274,10 @@ type IStartContext interface { // SetE sets the e rule contexts. SetE(IExprContext) + // Getter signatures + EOF() antlr.TerminalNode + Expr() IExprContext + // IsStartContext differentiates from other interfaces. IsStartContext() } @@ -363,14 +389,14 @@ func (p *CELParser) Start() (localctx IStartContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(26) + p.SetState(32) var _x = p.Expr() localctx.(*StartContext).e = _x } { - p.SetState(27) + p.SetState(33) p.Match(CELParserEOF) } @@ -408,6 +434,13 @@ type IExprContext interface { // SetE2 sets the e2 rule contexts. SetE2(IExprContext) + // Getter signatures + AllConditionalOr() []IConditionalOrContext + ConditionalOr(i int) IConditionalOrContext + COLON() antlr.TerminalNode + QUESTIONMARK() antlr.TerminalNode + Expr() IExprContext + // IsExprContext differentiates from other interfaces. IsExprContext() } @@ -580,37 +613,37 @@ func (p *CELParser) Expr() (localctx IExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(29) + p.SetState(35) var _x = p.ConditionalOr() localctx.(*ExprContext).e = _x } - p.SetState(35) + p.SetState(41) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == CELParserQUESTIONMARK { { - p.SetState(30) + p.SetState(36) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*ExprContext).op = _m } { - p.SetState(31) + p.SetState(37) var _x = p.ConditionalOr() localctx.(*ExprContext).e1 = _x } { - p.SetState(32) + p.SetState(38) p.Match(CELParserCOLON) } { - p.SetState(33) + p.SetState(39) var _x = p.Expr() @@ -659,6 +692,12 @@ type IConditionalOrContext interface { // SetE1 sets the e1 rule context list. SetE1([]IConditionalAndContext) + // Getter signatures + AllConditionalAnd() []IConditionalAndContext + ConditionalAnd(i int) IConditionalAndContext + AllLOGICAL_OR() []antlr.TerminalNode + LOGICAL_OR(i int) antlr.TerminalNode + // IsConditionalOrContext differentiates from other interfaces. IsConditionalOrContext() } @@ -820,19 +859,19 @@ func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(37) + p.SetState(43) var _x = p.ConditionalAnd() localctx.(*ConditionalOrContext).e = _x } - p.SetState(42) + p.SetState(48) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == CELParserLOGICAL_OR { { - p.SetState(38) + p.SetState(44) var _m = p.Match(CELParserLOGICAL_OR) @@ -840,7 +879,7 @@ func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { } localctx.(*ConditionalOrContext).ops = append(localctx.(*ConditionalOrContext).ops, localctx.(*ConditionalOrContext).s9) { - p.SetState(39) + p.SetState(45) var _x = p.ConditionalAnd() @@ -848,7 +887,7 @@ func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { } localctx.(*ConditionalOrContext).e1 = append(localctx.(*ConditionalOrContext).e1, localctx.(*ConditionalOrContext)._conditionalAnd) - p.SetState(44) + p.SetState(50) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -893,6 +932,12 @@ type IConditionalAndContext interface { // SetE1 sets the e1 rule context list. SetE1([]IRelationContext) + // Getter signatures + AllRelation() []IRelationContext + Relation(i int) IRelationContext + AllLOGICAL_AND() []antlr.TerminalNode + LOGICAL_AND(i int) antlr.TerminalNode + // IsConditionalAndContext differentiates from other interfaces. IsConditionalAndContext() } @@ -1054,19 +1099,19 @@ func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(45) + p.SetState(51) var _x = p.relation(0) localctx.(*ConditionalAndContext).e = _x } - p.SetState(50) + p.SetState(56) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == CELParserLOGICAL_AND { { - p.SetState(46) + p.SetState(52) var _m = p.Match(CELParserLOGICAL_AND) @@ -1074,7 +1119,7 @@ func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { } localctx.(*ConditionalAndContext).ops = append(localctx.(*ConditionalAndContext).ops, localctx.(*ConditionalAndContext).s8) { - p.SetState(47) + p.SetState(53) var _x = p.relation(0) @@ -1082,7 +1127,7 @@ func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { } localctx.(*ConditionalAndContext).e1 = append(localctx.(*ConditionalAndContext).e1, localctx.(*ConditionalAndContext)._relation) - p.SetState(52) + p.SetState(58) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -1103,6 +1148,18 @@ type IRelationContext interface { // SetOp sets the op token. SetOp(antlr.Token) + // Getter signatures + Calc() ICalcContext + AllRelation() []IRelationContext + Relation(i int) IRelationContext + LESS() antlr.TerminalNode + LESS_EQUALS() antlr.TerminalNode + GREATER_EQUALS() antlr.TerminalNode + GREATER() antlr.TerminalNode + EQUALS() antlr.TerminalNode + NOT_EQUALS() antlr.TerminalNode + IN() antlr.TerminalNode + // IsRelationContext differentiates from other interfaces. IsRelationContext() } @@ -1291,12 +1348,12 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(54) + p.SetState(60) p.calc(0) } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(61) + p.SetState(67) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) @@ -1308,13 +1365,13 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { _prevctx = localctx localctx = NewRelationContext(p, _parentctx, _parentState) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_relation) - p.SetState(56) + p.SetState(62) if !(p.Precpred(p.GetParserRuleContext(), 1)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 1)", "")) } { - p.SetState(57) + p.SetState(63) var _lt = p.GetTokenStream().LT(1) @@ -1322,7 +1379,7 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { _la = p.GetTokenStream().LA(1) - if !(((_la)&-(0x1f+1)) == 0 && ((1<.map(, ) -// .map(, , ) +// +// .map(, ) +// .map(, , ) +// // In the second form only iterVar values which return true when provided to the predicate expression // are transformed. func MakeMap(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { diff --git a/tools/vendor/github.com/google/cel-go/parser/options.go b/tools/vendor/github.com/google/cel-go/parser/options.go index b50686a91..674c697c5 100644 --- a/tools/vendor/github.com/google/cel-go/parser/options.go +++ b/tools/vendor/github.com/google/cel-go/parser/options.go @@ -18,11 +18,13 @@ import "fmt" type options struct { maxRecursionDepth int + errorReportingLimit int errorRecoveryTokenLookaheadLimit int errorRecoveryLimit int expressionSizeCodePointLimit int macros map[string]Macro populateMacroCalls bool + enableOptionalSyntax bool } // Option configures the behavior of the parser. @@ -45,7 +47,7 @@ func MaxRecursionDepth(limit int) Option { // successfully resume. In some pathological cases, the parser can look through quite a large set of input which // in turn generates a lot of back-tracking and performance degredation. // -// The limit must be > 1, and is recommended to be less than the default of 256. +// The limit must be >= 1, and is recommended to be less than the default of 256. func ErrorRecoveryLookaheadTokenLimit(limit int) Option { return func(opts *options) error { if limit < 1 { @@ -67,6 +69,19 @@ func ErrorRecoveryLimit(limit int) Option { } } +// ErrorReportingLimit limits the number of syntax error reports before terminating parsing. +// +// The limit must be at least 1. If unset, the limit will be 100. +func ErrorReportingLimit(limit int) Option { + return func(opts *options) error { + if limit < 1 { + return fmt.Errorf("error reporting limit must be at least 1: %d", limit) + } + opts.errorReportingLimit = limit + return nil + } +} + // ExpressionSizeCodePointLimit is an option which limits the maximum code point count of an // expression. func ExpressionSizeCodePointLimit(expressionSizeCodePointLimit int) Option { @@ -102,3 +117,11 @@ func PopulateMacroCalls(populateMacroCalls bool) Option { return nil } } + +// EnableOptionalSyntax enables syntax for optional field and index selection. +func EnableOptionalSyntax(optionalSyntax bool) Option { + return func(opts *options) error { + opts.enableOptionalSyntax = optionalSyntax + return nil + } +} diff --git a/tools/vendor/github.com/google/cel-go/parser/parser.go b/tools/vendor/github.com/google/cel-go/parser/parser.go index 072f62457..e6f70f906 100644 --- a/tools/vendor/github.com/google/cel-go/parser/parser.go +++ b/tools/vendor/github.com/google/cel-go/parser/parser.go @@ -18,11 +18,13 @@ package parser import ( "fmt" + "regexp" "strconv" "strings" "sync" - "github.com/antlr/antlr4/runtime/Go/antlr" + antlr "github.com/antlr/antlr4/runtime/Go/antlr/v4" + "github.com/google/cel-go/common" "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/runes" @@ -45,6 +47,9 @@ func NewParser(opts ...Option) (*Parser, error) { return nil, err } } + if p.errorReportingLimit == 0 { + p.errorReportingLimit = 100 + } if p.maxRecursionDepth == 0 { p.maxRecursionDepth = 250 } @@ -89,9 +94,11 @@ func (p *Parser) Parse(source common.Source) (*exprpb.ParsedExpr, *common.Errors helper: newParserHelper(source), macros: p.macros, maxRecursionDepth: p.maxRecursionDepth, + errorReportingLimit: p.errorReportingLimit, errorRecoveryLimit: p.errorRecoveryLimit, errorRecoveryLookaheadTokenLimit: p.errorRecoveryTokenLookaheadLimit, populateMacroCalls: p.populateMacroCalls, + enableOptionalSyntax: p.enableOptionalSyntax, } buf, ok := source.(runes.Buffer) if !ok { @@ -178,7 +185,7 @@ func (rl *recursionListener) EnterEveryRule(ctx antlr.ParserRuleContext) { } else { *depth++ } - if *depth >= rl.maxDepth { + if *depth > rl.maxDepth { panic(&recursionError{ message: fmt.Sprintf("expression recursion limit exceeded: %d", rl.maxDepth), }) @@ -197,6 +204,16 @@ func (rl *recursionListener) ExitEveryRule(ctx antlr.ParserRuleContext) { var _ antlr.ParseTreeListener = &recursionListener{} +type tooManyErrors struct { + errorReportingLimit int +} + +func (t *tooManyErrors) Error() string { + return fmt.Sprintf("More than %d syntax errors", t.errorReportingLimit) +} + +var _ error = &tooManyErrors{} + type recoveryLimitError struct { message string } @@ -271,17 +288,20 @@ type parser struct { helper *parserHelper macros map[string]Macro recursionDepth int + errorReports int maxRecursionDepth int + errorReportingLimit int errorRecoveryLimit int errorRecoveryLookaheadTokenLimit int populateMacroCalls bool + enableOptionalSyntax bool } var ( _ gen.CELVisitor = (*parser)(nil) lexerPool *sync.Pool = &sync.Pool{ - New: func() interface{} { + New: func() any { l := gen.NewCELLexer(nil) l.RemoveErrorListeners() return l @@ -289,7 +309,7 @@ var ( } parserPool *sync.Pool = &sync.Pool{ - New: func() interface{} { + New: func() any { p := gen.NewCELParser(nil) p.RemoveErrorListeners() return p @@ -302,14 +322,14 @@ func (p *parser) parse(expr runes.Buffer, desc string) *exprpb.Expr { lexer := lexerPool.Get().(*gen.CELLexer) prsr := parserPool.Get().(*gen.CELParser) - // Unfortunately ANTLR Go runtime is missing (*antlr.BaseParser).RemoveParseListeners, so this is - // good enough until that is exported. prsrListener := &recursionListener{ maxDepth: p.maxRecursionDepth, ruleTypeDepth: map[int]*int{}, } defer func() { + // Unfortunately ANTLR Go runtime is missing (*antlr.BaseParser).RemoveParseListeners, + // so this is good enough until that is exported. // Reset the lexer and parser before putting them back in the pool. lexer.RemoveErrorListeners() prsr.RemoveParseListener(prsrListener) @@ -340,6 +360,8 @@ func (p *parser) parse(expr runes.Buffer, desc string) *exprpb.Expr { p.errors.ReportError(common.NoLocation, err.Error()) case *recursionError: p.errors.ReportError(common.NoLocation, err.Error()) + case *tooManyErrors: + // do nothing case *recoveryLimitError: // do nothing, listeners already notified and error reported. default: @@ -352,57 +374,85 @@ func (p *parser) parse(expr runes.Buffer, desc string) *exprpb.Expr { } // Visitor implementations. -func (p *parser) Visit(tree antlr.ParseTree) interface{} { - p.recursionDepth++ - if p.recursionDepth > p.maxRecursionDepth { - panic(&recursionError{message: "max recursion depth exceeded"}) - } - defer func() { - p.recursionDepth-- - }() - switch tree.(type) { +func (p *parser) Visit(tree antlr.ParseTree) any { + t := unnest(tree) + switch tree := t.(type) { case *gen.StartContext: - return p.VisitStart(tree.(*gen.StartContext)) + return p.VisitStart(tree) case *gen.ExprContext: - return p.VisitExpr(tree.(*gen.ExprContext)) + p.checkAndIncrementRecursionDepth() + out := p.VisitExpr(tree) + p.decrementRecursionDepth() + return out case *gen.ConditionalAndContext: - return p.VisitConditionalAnd(tree.(*gen.ConditionalAndContext)) + return p.VisitConditionalAnd(tree) case *gen.ConditionalOrContext: - return p.VisitConditionalOr(tree.(*gen.ConditionalOrContext)) + return p.VisitConditionalOr(tree) case *gen.RelationContext: - return p.VisitRelation(tree.(*gen.RelationContext)) + p.checkAndIncrementRecursionDepth() + out := p.VisitRelation(tree) + p.decrementRecursionDepth() + return out case *gen.CalcContext: - return p.VisitCalc(tree.(*gen.CalcContext)) + p.checkAndIncrementRecursionDepth() + out := p.VisitCalc(tree) + p.decrementRecursionDepth() + return out case *gen.LogicalNotContext: - return p.VisitLogicalNot(tree.(*gen.LogicalNotContext)) - case *gen.MemberExprContext: - return p.VisitMemberExpr(tree.(*gen.MemberExprContext)) - case *gen.PrimaryExprContext: - return p.VisitPrimaryExpr(tree.(*gen.PrimaryExprContext)) - case *gen.SelectOrCallContext: - return p.VisitSelectOrCall(tree.(*gen.SelectOrCallContext)) + return p.VisitLogicalNot(tree) + case *gen.IdentOrGlobalCallContext: + return p.VisitIdentOrGlobalCall(tree) + case *gen.SelectContext: + p.checkAndIncrementRecursionDepth() + out := p.VisitSelect(tree) + p.decrementRecursionDepth() + return out + case *gen.MemberCallContext: + p.checkAndIncrementRecursionDepth() + out := p.VisitMemberCall(tree) + p.decrementRecursionDepth() + return out case *gen.MapInitializerListContext: - return p.VisitMapInitializerList(tree.(*gen.MapInitializerListContext)) + return p.VisitMapInitializerList(tree) case *gen.NegateContext: - return p.VisitNegate(tree.(*gen.NegateContext)) + return p.VisitNegate(tree) case *gen.IndexContext: - return p.VisitIndex(tree.(*gen.IndexContext)) + p.checkAndIncrementRecursionDepth() + out := p.VisitIndex(tree) + p.decrementRecursionDepth() + return out case *gen.UnaryContext: - return p.VisitUnary(tree.(*gen.UnaryContext)) + return p.VisitUnary(tree) case *gen.CreateListContext: - return p.VisitCreateList(tree.(*gen.CreateListContext)) + return p.VisitCreateList(tree) case *gen.CreateMessageContext: - return p.VisitCreateMessage(tree.(*gen.CreateMessageContext)) + return p.VisitCreateMessage(tree) case *gen.CreateStructContext: - return p.VisitCreateStruct(tree.(*gen.CreateStructContext)) + return p.VisitCreateStruct(tree) + case *gen.IntContext: + return p.VisitInt(tree) + case *gen.UintContext: + return p.VisitUint(tree) + case *gen.DoubleContext: + return p.VisitDouble(tree) + case *gen.StringContext: + return p.VisitString(tree) + case *gen.BytesContext: + return p.VisitBytes(tree) + case *gen.BoolFalseContext: + return p.VisitBoolFalse(tree) + case *gen.BoolTrueContext: + return p.VisitBoolTrue(tree) + case *gen.NullContext: + return p.VisitNull(tree) } // Report at least one error if the parser reaches an unknown parse element. // Typically, this happens if the parser has already encountered a syntax error elsewhere. if len(p.errors.GetErrors()) == 0 { txt := "<>" - if tree != nil { - txt = fmt.Sprintf("<<%T>>", tree) + if t != nil { + txt = fmt.Sprintf("<<%T>>", t) } return p.reportError(common.NoLocation, "unknown parse element encountered: %s", txt) } @@ -411,12 +461,12 @@ func (p *parser) Visit(tree antlr.ParseTree) interface{} { } // Visit a parse tree produced by CELParser#start. -func (p *parser) VisitStart(ctx *gen.StartContext) interface{} { +func (p *parser) VisitStart(ctx *gen.StartContext) any { return p.Visit(ctx.Expr()) } // Visit a parse tree produced by CELParser#expr. -func (p *parser) VisitExpr(ctx *gen.ExprContext) interface{} { +func (p *parser) VisitExpr(ctx *gen.ExprContext) any { result := p.Visit(ctx.GetE()).(*exprpb.Expr) if ctx.GetOp() == nil { return result @@ -428,11 +478,8 @@ func (p *parser) VisitExpr(ctx *gen.ExprContext) interface{} { } // Visit a parse tree produced by CELParser#conditionalOr. -func (p *parser) VisitConditionalOr(ctx *gen.ConditionalOrContext) interface{} { +func (p *parser) VisitConditionalOr(ctx *gen.ConditionalOrContext) any { result := p.Visit(ctx.GetE()).(*exprpb.Expr) - if ctx.GetOps() == nil { - return result - } b := newBalancer(p.helper, operators.LogicalOr, result) rest := ctx.GetE1() for i, op := range ctx.GetOps() { @@ -447,11 +494,8 @@ func (p *parser) VisitConditionalOr(ctx *gen.ConditionalOrContext) interface{} { } // Visit a parse tree produced by CELParser#conditionalAnd. -func (p *parser) VisitConditionalAnd(ctx *gen.ConditionalAndContext) interface{} { +func (p *parser) VisitConditionalAnd(ctx *gen.ConditionalAndContext) any { result := p.Visit(ctx.GetE()).(*exprpb.Expr) - if ctx.GetOps() == nil { - return result - } b := newBalancer(p.helper, operators.LogicalAnd, result) rest := ctx.GetE1() for i, op := range ctx.GetOps() { @@ -466,10 +510,7 @@ func (p *parser) VisitConditionalAnd(ctx *gen.ConditionalAndContext) interface{} } // Visit a parse tree produced by CELParser#relation. -func (p *parser) VisitRelation(ctx *gen.RelationContext) interface{} { - if ctx.Calc() != nil { - return p.Visit(ctx.Calc()) - } +func (p *parser) VisitRelation(ctx *gen.RelationContext) any { opText := "" if ctx.GetOp() != nil { opText = ctx.GetOp().GetText() @@ -484,10 +525,7 @@ func (p *parser) VisitRelation(ctx *gen.RelationContext) interface{} { } // Visit a parse tree produced by CELParser#calc. -func (p *parser) VisitCalc(ctx *gen.CalcContext) interface{} { - if ctx.Unary() != nil { - return p.Visit(ctx.Unary()) - } +func (p *parser) VisitCalc(ctx *gen.CalcContext) any { opText := "" if ctx.GetOp() != nil { opText = ctx.GetOp().GetText() @@ -501,27 +539,12 @@ func (p *parser) VisitCalc(ctx *gen.CalcContext) interface{} { return p.reportError(ctx, "operator not found") } -func (p *parser) VisitUnary(ctx *gen.UnaryContext) interface{} { +func (p *parser) VisitUnary(ctx *gen.UnaryContext) any { return p.helper.newLiteralString(ctx, "<>") } -// Visit a parse tree produced by CELParser#MemberExpr. -func (p *parser) VisitMemberExpr(ctx *gen.MemberExprContext) interface{} { - switch ctx.Member().(type) { - case *gen.PrimaryExprContext: - return p.VisitPrimaryExpr(ctx.Member().(*gen.PrimaryExprContext)) - case *gen.SelectOrCallContext: - return p.VisitSelectOrCall(ctx.Member().(*gen.SelectOrCallContext)) - case *gen.IndexContext: - return p.VisitIndex(ctx.Member().(*gen.IndexContext)) - case *gen.CreateMessageContext: - return p.VisitCreateMessage(ctx.Member().(*gen.CreateMessageContext)) - } - return p.reportError(ctx, "unsupported simple expression") -} - // Visit a parse tree produced by CELParser#LogicalNot. -func (p *parser) VisitLogicalNot(ctx *gen.LogicalNotContext) interface{} { +func (p *parser) VisitLogicalNot(ctx *gen.LogicalNotContext) any { if len(ctx.GetOps())%2 == 0 { return p.Visit(ctx.Member()) } @@ -530,7 +553,7 @@ func (p *parser) VisitLogicalNot(ctx *gen.LogicalNotContext) interface{} { return p.globalCallOrMacro(opID, operators.LogicalNot, target) } -func (p *parser) VisitNegate(ctx *gen.NegateContext) interface{} { +func (p *parser) VisitNegate(ctx *gen.NegateContext) any { if len(ctx.GetOps())%2 == 0 { return p.Visit(ctx.Member()) } @@ -539,60 +562,77 @@ func (p *parser) VisitNegate(ctx *gen.NegateContext) interface{} { return p.globalCallOrMacro(opID, operators.Negate, target) } -// Visit a parse tree produced by CELParser#SelectOrCall. -func (p *parser) VisitSelectOrCall(ctx *gen.SelectOrCallContext) interface{} { +// VisitSelect visits a parse tree produced by CELParser#Select. +func (p *parser) VisitSelect(ctx *gen.SelectContext) any { operand := p.Visit(ctx.Member()).(*exprpb.Expr) // Handle the error case where no valid identifier is specified. - if ctx.GetId() == nil { + if ctx.GetId() == nil || ctx.GetOp() == nil { return p.helper.newExpr(ctx) } id := ctx.GetId().GetText() - if ctx.GetOpen() != nil { - opID := p.helper.id(ctx.GetOpen()) - return p.receiverCallOrMacro(opID, id, operand, p.visitList(ctx.GetArgs())...) + if ctx.GetOpt() != nil { + if !p.enableOptionalSyntax { + return p.reportError(ctx.GetOp(), "unsupported syntax '.?'") + } + return p.helper.newGlobalCall( + ctx.GetOp(), + operators.OptSelect, + operand, + p.helper.newLiteralString(ctx.GetId(), id)) } return p.helper.newSelect(ctx.GetOp(), operand, id) } -// Visit a parse tree produced by CELParser#PrimaryExpr. -func (p *parser) VisitPrimaryExpr(ctx *gen.PrimaryExprContext) interface{} { - switch ctx.Primary().(type) { - case *gen.NestedContext: - return p.VisitNested(ctx.Primary().(*gen.NestedContext)) - case *gen.IdentOrGlobalCallContext: - return p.VisitIdentOrGlobalCall(ctx.Primary().(*gen.IdentOrGlobalCallContext)) - case *gen.CreateListContext: - return p.VisitCreateList(ctx.Primary().(*gen.CreateListContext)) - case *gen.CreateStructContext: - return p.VisitCreateStruct(ctx.Primary().(*gen.CreateStructContext)) - case *gen.ConstantLiteralContext: - return p.VisitConstantLiteral(ctx.Primary().(*gen.ConstantLiteralContext)) +// VisitMemberCall visits a parse tree produced by CELParser#MemberCall. +func (p *parser) VisitMemberCall(ctx *gen.MemberCallContext) any { + operand := p.Visit(ctx.Member()).(*exprpb.Expr) + // Handle the error case where no valid identifier is specified. + if ctx.GetId() == nil { + return p.helper.newExpr(ctx) } - - return p.reportError(ctx, "invalid primary expression") + id := ctx.GetId().GetText() + opID := p.helper.id(ctx.GetOpen()) + return p.receiverCallOrMacro(opID, id, operand, p.visitExprList(ctx.GetArgs())...) } // Visit a parse tree produced by CELParser#Index. -func (p *parser) VisitIndex(ctx *gen.IndexContext) interface{} { +func (p *parser) VisitIndex(ctx *gen.IndexContext) any { target := p.Visit(ctx.Member()).(*exprpb.Expr) + // Handle the error case where no valid identifier is specified. + if ctx.GetOp() == nil { + return p.helper.newExpr(ctx) + } opID := p.helper.id(ctx.GetOp()) index := p.Visit(ctx.GetIndex()).(*exprpb.Expr) - return p.globalCallOrMacro(opID, operators.Index, target, index) + operator := operators.Index + if ctx.GetOpt() != nil { + if !p.enableOptionalSyntax { + return p.reportError(ctx.GetOp(), "unsupported syntax '[?'") + } + operator = operators.OptIndex + } + return p.globalCallOrMacro(opID, operator, target, index) } // Visit a parse tree produced by CELParser#CreateMessage. -func (p *parser) VisitCreateMessage(ctx *gen.CreateMessageContext) interface{} { - target := p.Visit(ctx.Member()).(*exprpb.Expr) - objID := p.helper.id(ctx.GetOp()) - if messageName, found := p.extractQualifiedName(target); found { - entries := p.VisitIFieldInitializerList(ctx.GetEntries()).([]*exprpb.Expr_CreateStruct_Entry) - return p.helper.newObject(objID, messageName, entries...) +func (p *parser) VisitCreateMessage(ctx *gen.CreateMessageContext) any { + messageName := "" + for _, id := range ctx.GetIds() { + if len(messageName) != 0 { + messageName += "." + } + messageName += id.GetText() + } + if ctx.GetLeadingDot() != nil { + messageName = "." + messageName } - return p.helper.newExpr(objID) + objID := p.helper.id(ctx.GetOp()) + entries := p.VisitIFieldInitializerList(ctx.GetEntries()).([]*exprpb.Expr_CreateStruct_Entry) + return p.helper.newObject(objID, messageName, entries...) } // Visit a parse tree of field initializers. -func (p *parser) VisitIFieldInitializerList(ctx gen.IFieldInitializerListContext) interface{} { +func (p *parser) VisitIFieldInitializerList(ctx gen.IFieldInitializerListContext) any { if ctx == nil || ctx.GetFields() == nil { // This is the result of a syntax error handled elswhere, return empty. return []*exprpb.Expr_CreateStruct_Entry{} @@ -607,15 +647,27 @@ func (p *parser) VisitIFieldInitializerList(ctx gen.IFieldInitializerListContext return []*exprpb.Expr_CreateStruct_Entry{} } initID := p.helper.id(cols[i]) + optField := f.(*gen.OptFieldContext) + optional := optField.GetOpt() != nil + if !p.enableOptionalSyntax && optional { + p.reportError(optField, "unsupported syntax '?'") + continue + } + // The field may be empty due to a prior error. + id := optField.IDENTIFIER() + if id == nil { + return []*exprpb.Expr_CreateStruct_Entry{} + } + fieldName := id.GetText() value := p.Visit(vals[i]).(*exprpb.Expr) - field := p.helper.newObjectField(initID, f.GetText(), value) + field := p.helper.newObjectField(initID, fieldName, value, optional) result[i] = field } return result } // Visit a parse tree produced by CELParser#IdentOrGlobalCall. -func (p *parser) VisitIdentOrGlobalCall(ctx *gen.IdentOrGlobalCallContext) interface{} { +func (p *parser) VisitIdentOrGlobalCall(ctx *gen.IdentOrGlobalCallContext) any { identName := "" if ctx.GetLeadingDot() != nil { identName = "." @@ -632,24 +684,20 @@ func (p *parser) VisitIdentOrGlobalCall(ctx *gen.IdentOrGlobalCallContext) inter identName += id if ctx.GetOp() != nil { opID := p.helper.id(ctx.GetOp()) - return p.globalCallOrMacro(opID, identName, p.visitList(ctx.GetArgs())...) + return p.globalCallOrMacro(opID, identName, p.visitExprList(ctx.GetArgs())...) } return p.helper.newIdent(ctx.GetId(), identName) } -// Visit a parse tree produced by CELParser#Nested. -func (p *parser) VisitNested(ctx *gen.NestedContext) interface{} { - return p.Visit(ctx.GetE()) -} - // Visit a parse tree produced by CELParser#CreateList. -func (p *parser) VisitCreateList(ctx *gen.CreateListContext) interface{} { +func (p *parser) VisitCreateList(ctx *gen.CreateListContext) any { listID := p.helper.id(ctx.GetOp()) - return p.helper.newList(listID, p.visitList(ctx.GetElems())...) + elems, optionals := p.visitListInit(ctx.GetElems()) + return p.helper.newList(listID, elems, optionals...) } // Visit a parse tree produced by CELParser#CreateStruct. -func (p *parser) VisitCreateStruct(ctx *gen.CreateStructContext) interface{} { +func (p *parser) VisitCreateStruct(ctx *gen.CreateStructContext) any { structID := p.helper.id(ctx.GetOp()) entries := []*exprpb.Expr_CreateStruct_Entry{} if ctx.GetEntries() != nil { @@ -658,31 +706,8 @@ func (p *parser) VisitCreateStruct(ctx *gen.CreateStructContext) interface{} { return p.helper.newMap(structID, entries...) } -// Visit a parse tree produced by CELParser#ConstantLiteral. -func (p *parser) VisitConstantLiteral(ctx *gen.ConstantLiteralContext) interface{} { - switch ctx.Literal().(type) { - case *gen.IntContext: - return p.VisitInt(ctx.Literal().(*gen.IntContext)) - case *gen.UintContext: - return p.VisitUint(ctx.Literal().(*gen.UintContext)) - case *gen.DoubleContext: - return p.VisitDouble(ctx.Literal().(*gen.DoubleContext)) - case *gen.StringContext: - return p.VisitString(ctx.Literal().(*gen.StringContext)) - case *gen.BytesContext: - return p.VisitBytes(ctx.Literal().(*gen.BytesContext)) - case *gen.BoolFalseContext: - return p.VisitBoolFalse(ctx.Literal().(*gen.BoolFalseContext)) - case *gen.BoolTrueContext: - return p.VisitBoolTrue(ctx.Literal().(*gen.BoolTrueContext)) - case *gen.NullContext: - return p.VisitNull(ctx.Literal().(*gen.NullContext)) - } - return p.reportError(ctx, "invalid literal") -} - // Visit a parse tree produced by CELParser#mapInitializerList. -func (p *parser) VisitMapInitializerList(ctx *gen.MapInitializerListContext) interface{} { +func (p *parser) VisitMapInitializerList(ctx *gen.MapInitializerListContext) any { if ctx == nil || ctx.GetKeys() == nil { // This is the result of a syntax error handled elswhere, return empty. return []*exprpb.Expr_CreateStruct_Entry{} @@ -697,16 +722,22 @@ func (p *parser) VisitMapInitializerList(ctx *gen.MapInitializerListContext) int // This is the result of a syntax error detected elsewhere. return []*exprpb.Expr_CreateStruct_Entry{} } - key := p.Visit(keys[i]).(*exprpb.Expr) + optKey := keys[i] + optional := optKey.GetOpt() != nil + if !p.enableOptionalSyntax && optional { + p.reportError(optKey, "unsupported syntax '?'") + continue + } + key := p.Visit(optKey.GetE()).(*exprpb.Expr) value := p.Visit(vals[i]).(*exprpb.Expr) - entry := p.helper.newMapEntry(colID, key, value) + entry := p.helper.newMapEntry(colID, key, value, optional) result[i] = entry } return result } // Visit a parse tree produced by CELParser#Int. -func (p *parser) VisitInt(ctx *gen.IntContext) interface{} { +func (p *parser) VisitInt(ctx *gen.IntContext) any { text := ctx.GetTok().GetText() base := 10 if strings.HasPrefix(text, "0x") { @@ -724,7 +755,7 @@ func (p *parser) VisitInt(ctx *gen.IntContext) interface{} { } // Visit a parse tree produced by CELParser#Uint. -func (p *parser) VisitUint(ctx *gen.UintContext) interface{} { +func (p *parser) VisitUint(ctx *gen.UintContext) any { text := ctx.GetTok().GetText() // trim the 'u' designator included in the uint literal. text = text[:len(text)-1] @@ -741,7 +772,7 @@ func (p *parser) VisitUint(ctx *gen.UintContext) interface{} { } // Visit a parse tree produced by CELParser#Double. -func (p *parser) VisitDouble(ctx *gen.DoubleContext) interface{} { +func (p *parser) VisitDouble(ctx *gen.DoubleContext) any { txt := ctx.GetTok().GetText() if ctx.GetSign() != nil { txt = ctx.GetSign().GetText() + txt @@ -755,42 +786,66 @@ func (p *parser) VisitDouble(ctx *gen.DoubleContext) interface{} { } // Visit a parse tree produced by CELParser#String. -func (p *parser) VisitString(ctx *gen.StringContext) interface{} { +func (p *parser) VisitString(ctx *gen.StringContext) any { s := p.unquote(ctx, ctx.GetText(), false) return p.helper.newLiteralString(ctx, s) } // Visit a parse tree produced by CELParser#Bytes. -func (p *parser) VisitBytes(ctx *gen.BytesContext) interface{} { +func (p *parser) VisitBytes(ctx *gen.BytesContext) any { b := []byte(p.unquote(ctx, ctx.GetTok().GetText()[1:], true)) return p.helper.newLiteralBytes(ctx, b) } // Visit a parse tree produced by CELParser#BoolTrue. -func (p *parser) VisitBoolTrue(ctx *gen.BoolTrueContext) interface{} { +func (p *parser) VisitBoolTrue(ctx *gen.BoolTrueContext) any { return p.helper.newLiteralBool(ctx, true) } // Visit a parse tree produced by CELParser#BoolFalse. -func (p *parser) VisitBoolFalse(ctx *gen.BoolFalseContext) interface{} { +func (p *parser) VisitBoolFalse(ctx *gen.BoolFalseContext) any { return p.helper.newLiteralBool(ctx, false) } // Visit a parse tree produced by CELParser#Null. -func (p *parser) VisitNull(ctx *gen.NullContext) interface{} { +func (p *parser) VisitNull(ctx *gen.NullContext) any { return p.helper.newLiteral(ctx, &exprpb.Constant{ ConstantKind: &exprpb.Constant_NullValue{ NullValue: structpb.NullValue_NULL_VALUE}}) } -func (p *parser) visitList(ctx gen.IExprListContext) []*exprpb.Expr { +func (p *parser) visitExprList(ctx gen.IExprListContext) []*exprpb.Expr { if ctx == nil { return []*exprpb.Expr{} } return p.visitSlice(ctx.GetE()) } +func (p *parser) visitListInit(ctx gen.IListInitContext) ([]*exprpb.Expr, []int32) { + if ctx == nil { + return []*exprpb.Expr{}, []int32{} + } + elements := ctx.GetElems() + result := make([]*exprpb.Expr, len(elements)) + optionals := []int32{} + for i, e := range elements { + ex := p.Visit(e.GetE()).(*exprpb.Expr) + if ex == nil { + return []*exprpb.Expr{}, []int32{} + } + result[i] = ex + if e.GetOpt() != nil { + if !p.enableOptionalSyntax { + p.reportError(e.GetOpt(), "unsupported syntax '?'") + continue + } + optionals = append(optionals, int32(i)) + } + } + return result, optionals +} + func (p *parser) visitSlice(expressions []gen.IExprContext) []*exprpb.Expr { if expressions == nil { return []*exprpb.Expr{} @@ -803,26 +858,7 @@ func (p *parser) visitSlice(expressions []gen.IExprContext) []*exprpb.Expr { return result } -func (p *parser) extractQualifiedName(e *exprpb.Expr) (string, bool) { - if e == nil { - return "", false - } - switch e.GetExprKind().(type) { - case *exprpb.Expr_IdentExpr: - return e.GetIdentExpr().GetName(), true - case *exprpb.Expr_SelectExpr: - s := e.GetSelectExpr() - if prefix, found := p.extractQualifiedName(s.GetOperand()); found { - return prefix + "." + s.GetField(), true - } - } - // TODO: Add a method to Source to get location from character offset. - location := p.helper.getLocation(e.GetId()) - p.reportError(location, "expected a qualified name") - return "", false -} - -func (p *parser) unquote(ctx interface{}, value string, isBytes bool) string { +func (p *parser) unquote(ctx any, value string, isBytes bool) string { text, err := unescape(value, isBytes) if err != nil { p.reportError(ctx, "%s", err.Error()) @@ -831,7 +867,7 @@ func (p *parser) unquote(ctx interface{}, value string, isBytes bool) string { return text } -func (p *parser) reportError(ctx interface{}, format string, args ...interface{}) *exprpb.Expr { +func (p *parser) reportError(ctx any, format string, args ...any) *exprpb.Expr { var location common.Location switch ctx.(type) { case common.Location: @@ -847,10 +883,24 @@ func (p *parser) reportError(ctx interface{}, format string, args ...interface{} } // ANTLR Parse listener implementations -func (p *parser) SyntaxError(recognizer antlr.Recognizer, offendingSymbol interface{}, line, column int, msg string, e antlr.RecognitionException) { - // TODO: Snippet +func (p *parser) SyntaxError(recognizer antlr.Recognizer, offendingSymbol any, line, column int, msg string, e antlr.RecognitionException) { l := p.helper.source.NewLocation(line, column) - p.errors.syntaxError(l, msg) + // Hack to keep existing error messages consistent with previous versions of CEL when a reserved word + // is used as an identifier. This behavior needs to be overhauled to provide consistent, normalized error + // messages out of ANTLR to prevent future breaking changes related to error message content. + if strings.Contains(msg, "no viable alternative") { + msg = reservedIdentifier.ReplaceAllString(msg, mismatchedReservedIdentifier) + } + // Ensure that no more than 100 syntax errors are reported as this will halt attempts to recover from a + // seriously broken expression. + if p.errorReports < p.errorReportingLimit { + p.errorReports++ + p.errors.syntaxError(l, msg) + } else { + tme := &tooManyErrors{errorReportingLimit: p.errorReportingLimit} + p.errors.syntaxError(l, tme.Error()) + panic(tme) + } } func (p *parser) ReportAmbiguity(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex int, exact bool, ambigAlts *antlr.BitSet, configs antlr.ATNConfigSet) { @@ -892,14 +942,95 @@ func (p *parser) expandMacro(exprID int64, function string, target *exprpb.Expr, eh.parserHelper = p.helper eh.id = exprID expr, err := macro.Expander()(eh, target, args) + // An error indicates that the macro was matched, but the arguments were not well-formed. if err != nil { if err.Location != nil { return p.reportError(err.Location, err.Message), true } return p.reportError(p.helper.getLocation(exprID), err.Message), true } + // A nil value from the macro indicates that the macro implementation decided that + // an expansion should not be performed. + if expr == nil { + return nil, false + } if p.populateMacroCalls { p.helper.addMacroCall(expr.GetId(), function, target, args...) } return expr, true } + +func (p *parser) checkAndIncrementRecursionDepth() { + p.recursionDepth++ + if p.recursionDepth > p.maxRecursionDepth { + panic(&recursionError{message: "max recursion depth exceeded"}) + } +} + +func (p *parser) decrementRecursionDepth() { + p.recursionDepth-- +} + +// unnest traverses down the left-hand side of the parse graph until it encounters the first compound +// parse node or the first leaf in the parse graph. +func unnest(tree antlr.ParseTree) antlr.ParseTree { + for tree != nil { + switch t := tree.(type) { + case *gen.ExprContext: + // conditionalOr op='?' conditionalOr : expr + if t.GetOp() != nil { + return t + } + // conditionalOr + tree = t.GetE() + case *gen.ConditionalOrContext: + // conditionalAnd (ops=|| conditionalAnd)* + if t.GetOps() != nil && len(t.GetOps()) > 0 { + return t + } + // conditionalAnd + tree = t.GetE() + case *gen.ConditionalAndContext: + // relation (ops=&& relation)* + if t.GetOps() != nil && len(t.GetOps()) > 0 { + return t + } + // relation + tree = t.GetE() + case *gen.RelationContext: + // relation op relation + if t.GetOp() != nil { + return t + } + // calc + tree = t.Calc() + case *gen.CalcContext: + // calc op calc + if t.GetOp() != nil { + return t + } + // unary + tree = t.Unary() + case *gen.MemberExprContext: + // member expands to one of: primary, select, index, or create message + tree = t.Member() + case *gen.PrimaryExprContext: + // primary expands to one of identifier, nested, create list, create struct, literal + tree = t.Primary() + case *gen.NestedContext: + // contains a nested 'expr' + tree = t.GetE() + case *gen.ConstantLiteralContext: + // expands to a primitive literal + tree = t.Literal() + default: + return t + } + } + return tree +} + +var ( + reservedIdentifier = regexp.MustCompile("no viable alternative at input '.(true|false|null)'") + mismatchedReservedIdentifier = "mismatched input '$1' expecting IDENTIFIER" +) diff --git a/tools/vendor/github.com/google/cel-go/parser/unparser.go b/tools/vendor/github.com/google/cel-go/parser/unparser.go index a459bb4a9..c3c40a0dd 100644 --- a/tools/vendor/github.com/google/cel-go/parser/unparser.go +++ b/tools/vendor/github.com/google/cel-go/parser/unparser.go @@ -106,9 +106,15 @@ func (un *unparser) visitCall(expr *exprpb.Expr) error { // ternary operator case operators.Conditional: return un.visitCallConditional(expr) + // optional select operator + case operators.OptSelect: + return un.visitOptSelect(expr) // index operator case operators.Index: return un.visitCallIndex(expr) + // optional index operator + case operators.OptIndex: + return un.visitCallOptIndex(expr) // unary operators case operators.LogicalNot, operators.Negate: return un.visitCallUnary(expr) @@ -218,6 +224,14 @@ func (un *unparser) visitCallFunc(expr *exprpb.Expr) error { } func (un *unparser) visitCallIndex(expr *exprpb.Expr) error { + return un.visitCallIndexInternal(expr, "[") +} + +func (un *unparser) visitCallOptIndex(expr *exprpb.Expr) error { + return un.visitCallIndexInternal(expr, "[?") +} + +func (un *unparser) visitCallIndexInternal(expr *exprpb.Expr, op string) error { c := expr.GetCallExpr() args := c.GetArgs() nested := isBinaryOrTernaryOperator(args[0]) @@ -225,7 +239,7 @@ func (un *unparser) visitCallIndex(expr *exprpb.Expr) error { if err != nil { return err } - un.str.WriteString("[") + un.str.WriteString(op) err = un.visit(args[1]) if err != nil { return err @@ -262,6 +276,9 @@ func (un *unparser) visitConst(expr *exprpb.Expr) error { // represent the float using the minimum required digits d := strconv.FormatFloat(c.GetDoubleValue(), 'g', -1, 64) un.str.WriteString(d) + if !strings.Contains(d, ".") { + un.str.WriteString(".0") + } case *exprpb.Constant_Int64Value: i := strconv.FormatInt(c.GetInt64Value(), 10) un.str.WriteString(i) @@ -289,8 +306,15 @@ func (un *unparser) visitIdent(expr *exprpb.Expr) error { func (un *unparser) visitList(expr *exprpb.Expr) error { l := expr.GetListExpr() elems := l.GetElements() + optIndices := make(map[int]bool, len(elems)) + for _, idx := range l.GetOptionalIndices() { + optIndices[int(idx)] = true + } un.str.WriteString("[") for i, elem := range elems { + if optIndices[i] { + un.str.WriteString("?") + } err := un.visit(elem) if err != nil { return err @@ -303,20 +327,32 @@ func (un *unparser) visitList(expr *exprpb.Expr) error { return nil } +func (un *unparser) visitOptSelect(expr *exprpb.Expr) error { + c := expr.GetCallExpr() + args := c.GetArgs() + operand := args[0] + field := args[1].GetConstExpr().GetStringValue() + return un.visitSelectInternal(operand, false, ".?", field) +} + func (un *unparser) visitSelect(expr *exprpb.Expr) error { sel := expr.GetSelectExpr() + return un.visitSelectInternal(sel.GetOperand(), sel.GetTestOnly(), ".", sel.GetField()) +} + +func (un *unparser) visitSelectInternal(operand *exprpb.Expr, testOnly bool, op string, field string) error { // handle the case when the select expression was generated by the has() macro. - if sel.GetTestOnly() { + if testOnly { un.str.WriteString("has(") } - nested := !sel.GetTestOnly() && isBinaryOrTernaryOperator(sel.GetOperand()) - err := un.visitMaybeNested(sel.GetOperand(), nested) + nested := !testOnly && isBinaryOrTernaryOperator(operand) + err := un.visitMaybeNested(operand, nested) if err != nil { return err } - un.str.WriteString(".") - un.str.WriteString(sel.GetField()) - if sel.GetTestOnly() { + un.str.WriteString(op) + un.str.WriteString(field) + if testOnly { un.str.WriteString(")") } return nil @@ -339,6 +375,9 @@ func (un *unparser) visitStructMsg(expr *exprpb.Expr) error { un.str.WriteString("{") for i, entry := range entries { f := entry.GetFieldKey() + if entry.GetOptionalEntry() { + un.str.WriteString("?") + } un.str.WriteString(f) un.str.WriteString(": ") v := entry.GetValue() @@ -360,6 +399,9 @@ func (un *unparser) visitStructMap(expr *exprpb.Expr) error { un.str.WriteString("{") for i, entry := range entries { k := entry.GetMapKey() + if entry.GetOptionalEntry() { + un.str.WriteString("?") + } err := un.visit(k) if err != nil { return err @@ -492,11 +534,10 @@ func (un *unparser) writeOperatorWithWrapping(fun string, unmangled string) bool un.str.WriteString(" ") } return true - } else { - un.str.WriteString(" ") - un.str.WriteString(unmangled) - un.str.WriteString(" ") } + un.str.WriteString(" ") + un.str.WriteString(unmangled) + un.str.WriteString(" ") return false } diff --git a/tools/vendor/github.com/google/gnostic-models/LICENSE b/tools/vendor/github.com/google/gnostic-models/LICENSE new file mode 100644 index 000000000..6b0b1270f --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/LICENSE @@ -0,0 +1,203 @@ + + 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/tools/vendor/github.com/google/gnostic-models/compiler/README.md b/tools/vendor/github.com/google/gnostic-models/compiler/README.md new file mode 100644 index 000000000..ee9783d23 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/README.md @@ -0,0 +1,4 @@ +# Compiler support code + +This directory contains compiler support code used by Gnostic and Gnostic +extensions. diff --git a/tools/vendor/github.com/google/gnostic-models/compiler/context.go b/tools/vendor/github.com/google/gnostic-models/compiler/context.go new file mode 100644 index 000000000..1bfe96121 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/context.go @@ -0,0 +1,49 @@ +// Copyright 2017 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 compiler + +import ( + yaml "gopkg.in/yaml.v3" +) + +// Context contains state of the compiler as it traverses a document. +type Context struct { + Parent *Context + Name string + Node *yaml.Node + ExtensionHandlers *[]ExtensionHandler +} + +// NewContextWithExtensions returns a new object representing the compiler state +func NewContextWithExtensions(name string, node *yaml.Node, parent *Context, extensionHandlers *[]ExtensionHandler) *Context { + return &Context{Name: name, Node: node, Parent: parent, ExtensionHandlers: extensionHandlers} +} + +// NewContext returns a new object representing the compiler state +func NewContext(name string, node *yaml.Node, parent *Context) *Context { + if parent != nil { + return &Context{Name: name, Node: node, Parent: parent, ExtensionHandlers: parent.ExtensionHandlers} + } + return &Context{Name: name, Parent: parent, ExtensionHandlers: nil} +} + +// Description returns a text description of the compiler state +func (context *Context) Description() string { + name := context.Name + if context.Parent != nil { + name = context.Parent.Description() + "." + name + } + return name +} diff --git a/tools/vendor/github.com/google/gnostic-models/compiler/error.go b/tools/vendor/github.com/google/gnostic-models/compiler/error.go new file mode 100644 index 000000000..6f40515d6 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/error.go @@ -0,0 +1,70 @@ +// Copyright 2017 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 compiler + +import "fmt" + +// Error represents compiler errors and their location in the document. +type Error struct { + Context *Context + Message string +} + +// NewError creates an Error. +func NewError(context *Context, message string) *Error { + return &Error{Context: context, Message: message} +} + +func (err *Error) locationDescription() string { + if err.Context.Node != nil { + return fmt.Sprintf("[%d,%d] %s", err.Context.Node.Line, err.Context.Node.Column, err.Context.Description()) + } + return err.Context.Description() +} + +// Error returns the string value of an Error. +func (err *Error) Error() string { + if err.Context == nil { + return err.Message + } + return err.locationDescription() + " " + err.Message +} + +// ErrorGroup is a container for groups of Error values. +type ErrorGroup struct { + Errors []error +} + +// NewErrorGroupOrNil returns a new ErrorGroup for a slice of errors or nil if the slice is empty. +func NewErrorGroupOrNil(errors []error) error { + if len(errors) == 0 { + return nil + } else if len(errors) == 1 { + return errors[0] + } else { + return &ErrorGroup{Errors: errors} + } +} + +func (group *ErrorGroup) Error() string { + result := "" + for i, err := range group.Errors { + if i > 0 { + result += "\n" + } + result += err.Error() + } + return result +} diff --git a/tools/vendor/github.com/google/gnostic-models/compiler/extensions.go b/tools/vendor/github.com/google/gnostic-models/compiler/extensions.go new file mode 100644 index 000000000..250c81e8c --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/extensions.go @@ -0,0 +1,86 @@ +// Copyright 2017 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 compiler + +import ( + "bytes" + "fmt" + "os/exec" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" + yaml "gopkg.in/yaml.v3" + + extensions "github.com/google/gnostic-models/extensions" +) + +// ExtensionHandler describes a binary that is called by the compiler to handle specification extensions. +type ExtensionHandler struct { + Name string +} + +// CallExtension calls a binary extension handler. +func CallExtension(context *Context, in *yaml.Node, extensionName string) (handled bool, response *any.Any, err error) { + if context == nil || context.ExtensionHandlers == nil { + return false, nil, nil + } + handled = false + for _, handler := range *(context.ExtensionHandlers) { + response, err = handler.handle(in, extensionName) + if response == nil { + continue + } else { + handled = true + break + } + } + return handled, response, err +} + +func (extensionHandlers *ExtensionHandler) handle(in *yaml.Node, extensionName string) (*any.Any, error) { + if extensionHandlers.Name != "" { + yamlData, _ := yaml.Marshal(in) + request := &extensions.ExtensionHandlerRequest{ + CompilerVersion: &extensions.Version{ + Major: 0, + Minor: 1, + Patch: 0, + }, + Wrapper: &extensions.Wrapper{ + Version: "unknown", // TODO: set this to the type/version of spec being parsed. + Yaml: string(yamlData), + ExtensionName: extensionName, + }, + } + requestBytes, _ := proto.Marshal(request) + cmd := exec.Command(extensionHandlers.Name) + cmd.Stdin = bytes.NewReader(requestBytes) + output, err := cmd.Output() + if err != nil { + return nil, err + } + response := &extensions.ExtensionHandlerResponse{} + err = proto.Unmarshal(output, response) + if err != nil || !response.Handled { + return nil, err + } + if len(response.Errors) != 0 { + return nil, fmt.Errorf("Errors when parsing: %+v for field %s by vendor extension handler %s. Details %+v", in, extensionName, extensionHandlers.Name, strings.Join(response.Errors, ",")) + } + return response.Value, nil + } + return nil, nil +} diff --git a/tools/vendor/github.com/google/gnostic-models/compiler/helpers.go b/tools/vendor/github.com/google/gnostic-models/compiler/helpers.go new file mode 100644 index 000000000..975d65e8f --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/helpers.go @@ -0,0 +1,397 @@ +// Copyright 2017 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 compiler + +import ( + "fmt" + "regexp" + "sort" + "strconv" + + "gopkg.in/yaml.v3" + + "github.com/google/gnostic-models/jsonschema" +) + +// compiler helper functions, usually called from generated code + +// UnpackMap gets a *yaml.Node if possible. +func UnpackMap(in *yaml.Node) (*yaml.Node, bool) { + if in == nil { + return nil, false + } + return in, true +} + +// SortedKeysForMap returns the sorted keys of a yamlv2.MapSlice. +func SortedKeysForMap(m *yaml.Node) []string { + keys := make([]string, 0) + if m.Kind == yaml.MappingNode { + for i := 0; i < len(m.Content); i += 2 { + keys = append(keys, m.Content[i].Value) + } + } + sort.Strings(keys) + return keys +} + +// MapHasKey returns true if a yamlv2.MapSlice contains a specified key. +func MapHasKey(m *yaml.Node, key string) bool { + if m == nil { + return false + } + if m.Kind == yaml.MappingNode { + for i := 0; i < len(m.Content); i += 2 { + itemKey := m.Content[i].Value + if key == itemKey { + return true + } + } + } + return false +} + +// MapValueForKey gets the value of a map value for a specified key. +func MapValueForKey(m *yaml.Node, key string) *yaml.Node { + if m == nil { + return nil + } + if m.Kind == yaml.MappingNode { + for i := 0; i < len(m.Content); i += 2 { + itemKey := m.Content[i].Value + if key == itemKey { + return m.Content[i+1] + } + } + } + return nil +} + +// ConvertInterfaceArrayToStringArray converts an array of interfaces to an array of strings, if possible. +func ConvertInterfaceArrayToStringArray(interfaceArray []interface{}) []string { + stringArray := make([]string, 0) + for _, item := range interfaceArray { + v, ok := item.(string) + if ok { + stringArray = append(stringArray, v) + } + } + return stringArray +} + +// SequenceNodeForNode returns a node if it is a SequenceNode. +func SequenceNodeForNode(node *yaml.Node) (*yaml.Node, bool) { + if node.Kind != yaml.SequenceNode { + return nil, false + } + return node, true +} + +// BoolForScalarNode returns the bool value of a node. +func BoolForScalarNode(node *yaml.Node) (bool, bool) { + if node == nil { + return false, false + } + if node.Kind == yaml.DocumentNode { + return BoolForScalarNode(node.Content[0]) + } + if node.Kind != yaml.ScalarNode { + return false, false + } + if node.Tag != "!!bool" { + return false, false + } + v, err := strconv.ParseBool(node.Value) + if err != nil { + return false, false + } + return v, true +} + +// IntForScalarNode returns the integer value of a node. +func IntForScalarNode(node *yaml.Node) (int64, bool) { + if node == nil { + return 0, false + } + if node.Kind == yaml.DocumentNode { + return IntForScalarNode(node.Content[0]) + } + if node.Kind != yaml.ScalarNode { + return 0, false + } + if node.Tag != "!!int" { + return 0, false + } + v, err := strconv.ParseInt(node.Value, 10, 64) + if err != nil { + return 0, false + } + return v, true +} + +// FloatForScalarNode returns the float value of a node. +func FloatForScalarNode(node *yaml.Node) (float64, bool) { + if node == nil { + return 0.0, false + } + if node.Kind == yaml.DocumentNode { + return FloatForScalarNode(node.Content[0]) + } + if node.Kind != yaml.ScalarNode { + return 0.0, false + } + if (node.Tag != "!!int") && (node.Tag != "!!float") { + return 0.0, false + } + v, err := strconv.ParseFloat(node.Value, 64) + if err != nil { + return 0.0, false + } + return v, true +} + +// StringForScalarNode returns the string value of a node. +func StringForScalarNode(node *yaml.Node) (string, bool) { + if node == nil { + return "", false + } + if node.Kind == yaml.DocumentNode { + return StringForScalarNode(node.Content[0]) + } + switch node.Kind { + case yaml.ScalarNode: + switch node.Tag { + case "!!int": + return node.Value, true + case "!!str": + return node.Value, true + case "!!timestamp": + return node.Value, true + case "!!null": + return "", true + default: + return "", false + } + default: + return "", false + } +} + +// StringArrayForSequenceNode converts a sequence node to an array of strings, if possible. +func StringArrayForSequenceNode(node *yaml.Node) []string { + stringArray := make([]string, 0) + for _, item := range node.Content { + v, ok := StringForScalarNode(item) + if ok { + stringArray = append(stringArray, v) + } + } + return stringArray +} + +// MissingKeysInMap identifies which keys from a list of required keys are not in a map. +func MissingKeysInMap(m *yaml.Node, requiredKeys []string) []string { + missingKeys := make([]string, 0) + for _, k := range requiredKeys { + if !MapHasKey(m, k) { + missingKeys = append(missingKeys, k) + } + } + return missingKeys +} + +// InvalidKeysInMap returns keys in a map that don't match a list of allowed keys and patterns. +func InvalidKeysInMap(m *yaml.Node, allowedKeys []string, allowedPatterns []*regexp.Regexp) []string { + invalidKeys := make([]string, 0) + if m == nil || m.Kind != yaml.MappingNode { + return invalidKeys + } + for i := 0; i < len(m.Content); i += 2 { + key := m.Content[i].Value + found := false + // does the key match an allowed key? + for _, allowedKey := range allowedKeys { + if key == allowedKey { + found = true + break + } + } + if !found { + // does the key match an allowed pattern? + for _, allowedPattern := range allowedPatterns { + if allowedPattern.MatchString(key) { + found = true + break + } + } + if !found { + invalidKeys = append(invalidKeys, key) + } + } + } + return invalidKeys +} + +// NewNullNode creates a new Null node. +func NewNullNode() *yaml.Node { + node := &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!null", + } + return node +} + +// NewMappingNode creates a new Mapping node. +func NewMappingNode() *yaml.Node { + return &yaml.Node{ + Kind: yaml.MappingNode, + Content: make([]*yaml.Node, 0), + } +} + +// NewSequenceNode creates a new Sequence node. +func NewSequenceNode() *yaml.Node { + node := &yaml.Node{ + Kind: yaml.SequenceNode, + Content: make([]*yaml.Node, 0), + } + return node +} + +// NewScalarNodeForString creates a new node to hold a string. +func NewScalarNodeForString(s string) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Value: s, + } +} + +// NewSequenceNodeForStringArray creates a new node to hold an array of strings. +func NewSequenceNodeForStringArray(strings []string) *yaml.Node { + node := &yaml.Node{ + Kind: yaml.SequenceNode, + Content: make([]*yaml.Node, 0), + } + for _, s := range strings { + node.Content = append(node.Content, NewScalarNodeForString(s)) + } + return node +} + +// NewScalarNodeForBool creates a new node to hold a bool. +func NewScalarNodeForBool(b bool) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!bool", + Value: fmt.Sprintf("%t", b), + } +} + +// NewScalarNodeForFloat creates a new node to hold a float. +func NewScalarNodeForFloat(f float64) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!float", + Value: fmt.Sprintf("%g", f), + } +} + +// NewScalarNodeForInt creates a new node to hold an integer. +func NewScalarNodeForInt(i int64) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!int", + Value: fmt.Sprintf("%d", i), + } +} + +// PluralProperties returns the string "properties" pluralized. +func PluralProperties(count int) string { + if count == 1 { + return "property" + } + return "properties" +} + +// StringArrayContainsValue returns true if a string array contains a specified value. +func StringArrayContainsValue(array []string, value string) bool { + for _, item := range array { + if item == value { + return true + } + } + return false +} + +// StringArrayContainsValues returns true if a string array contains all of a list of specified values. +func StringArrayContainsValues(array []string, values []string) bool { + for _, value := range values { + if !StringArrayContainsValue(array, value) { + return false + } + } + return true +} + +// StringValue returns the string value of an item. +func StringValue(item interface{}) (value string, ok bool) { + value, ok = item.(string) + if ok { + return value, ok + } + intValue, ok := item.(int) + if ok { + return strconv.Itoa(intValue), true + } + return "", false +} + +// Description returns a human-readable represention of an item. +func Description(item interface{}) string { + value, ok := item.(*yaml.Node) + if ok { + return jsonschema.Render(value) + } + return fmt.Sprintf("%+v", item) +} + +// Display returns a description of a node for use in error messages. +func Display(node *yaml.Node) string { + switch node.Kind { + case yaml.ScalarNode: + switch node.Tag { + case "!!str": + return fmt.Sprintf("%s (string)", node.Value) + } + } + return fmt.Sprintf("%+v (%T)", node, node) +} + +// Marshal creates a yaml version of a structure in our preferred style +func Marshal(in *yaml.Node) []byte { + clearStyle(in) + //bytes, _ := yaml.Marshal(&yaml.Node{Kind: yaml.DocumentNode, Content: []*yaml.Node{in}}) + bytes, _ := yaml.Marshal(in) + + return bytes +} + +func clearStyle(node *yaml.Node) { + node.Style = 0 + for _, c := range node.Content { + clearStyle(c) + } +} diff --git a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/doc.go b/tools/vendor/github.com/google/gnostic-models/compiler/main.go similarity index 71% rename from tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/doc.go rename to tools/vendor/github.com/google/gnostic-models/compiler/main.go index f72c6a644..ce9fcc456 100644 --- a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/doc.go +++ b/tools/vendor/github.com/google/gnostic-models/compiler/main.go @@ -1,10 +1,10 @@ -// Copyright 2016 The etcd Authors +// Copyright 2017 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 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -12,5 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package rpctypes has types and values shared by the etcd server and client for v3 RPC interaction. -package rpctypes +// Package compiler provides support functions to generated compiler code. +package compiler diff --git a/tools/vendor/github.com/google/gnostic-models/compiler/reader.go b/tools/vendor/github.com/google/gnostic-models/compiler/reader.go new file mode 100644 index 000000000..be0e8b40c --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/compiler/reader.go @@ -0,0 +1,307 @@ +// Copyright 2017 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 compiler + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" + "path/filepath" + "strings" + "sync" + + yaml "gopkg.in/yaml.v3" +) + +var verboseReader = false + +var fileCache map[string][]byte +var infoCache map[string]*yaml.Node + +var fileCacheEnable = true +var infoCacheEnable = true + +// These locks are used to synchronize accesses to the fileCache and infoCache +// maps (above). They are global state and can throw thread-related errors +// when modified from separate goroutines. The general strategy is to protect +// all public functions in this file with mutex Lock() calls. As a result, to +// avoid deadlock, these public functions should not call other public +// functions, so some public functions have private equivalents. +// In the future, we might consider replacing the maps with sync.Map and +// eliminating these mutexes. +var fileCacheMutex sync.Mutex +var infoCacheMutex sync.Mutex + +func initializeFileCache() { + if fileCache == nil { + fileCache = make(map[string][]byte, 0) + } +} + +func initializeInfoCache() { + if infoCache == nil { + infoCache = make(map[string]*yaml.Node, 0) + } +} + +// EnableFileCache turns on file caching. +func EnableFileCache() { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + fileCacheEnable = true +} + +// EnableInfoCache turns on parsed info caching. +func EnableInfoCache() { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + infoCacheEnable = true +} + +// DisableFileCache turns off file caching. +func DisableFileCache() { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + fileCacheEnable = false +} + +// DisableInfoCache turns off parsed info caching. +func DisableInfoCache() { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + infoCacheEnable = false +} + +// RemoveFromFileCache removes an entry from the file cache. +func RemoveFromFileCache(fileurl string) { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + if !fileCacheEnable { + return + } + initializeFileCache() + delete(fileCache, fileurl) +} + +// RemoveFromInfoCache removes an entry from the info cache. +func RemoveFromInfoCache(filename string) { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + if !infoCacheEnable { + return + } + initializeInfoCache() + delete(infoCache, filename) +} + +// GetInfoCache returns the info cache map. +func GetInfoCache() map[string]*yaml.Node { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + if infoCache == nil { + initializeInfoCache() + } + return infoCache +} + +// ClearFileCache clears the file cache. +func ClearFileCache() { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + fileCache = make(map[string][]byte, 0) +} + +// ClearInfoCache clears the info cache. +func ClearInfoCache() { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + infoCache = make(map[string]*yaml.Node) +} + +// ClearCaches clears all caches. +func ClearCaches() { + ClearFileCache() + ClearInfoCache() +} + +// FetchFile gets a specified file from the local filesystem or a remote location. +func FetchFile(fileurl string) ([]byte, error) { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + return fetchFile(fileurl) +} + +func fetchFile(fileurl string) ([]byte, error) { + var bytes []byte + initializeFileCache() + if fileCacheEnable { + bytes, ok := fileCache[fileurl] + if ok { + if verboseReader { + log.Printf("Cache hit %s", fileurl) + } + return bytes, nil + } + if verboseReader { + log.Printf("Fetching %s", fileurl) + } + } + response, err := http.Get(fileurl) + if err != nil { + return nil, err + } + defer response.Body.Close() + if response.StatusCode != 200 { + return nil, fmt.Errorf("Error downloading %s: %s", fileurl, response.Status) + } + bytes, err = ioutil.ReadAll(response.Body) + if fileCacheEnable && err == nil { + fileCache[fileurl] = bytes + } + return bytes, err +} + +// ReadBytesForFile reads the bytes of a file. +func ReadBytesForFile(filename string) ([]byte, error) { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + return readBytesForFile(filename) +} + +func readBytesForFile(filename string) ([]byte, error) { + // is the filename a url? + fileurl, _ := url.Parse(filename) + if fileurl.Scheme != "" { + // yes, fetch it + bytes, err := fetchFile(filename) + if err != nil { + return nil, err + } + return bytes, nil + } + // no, it's a local filename + bytes, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + return bytes, nil +} + +// ReadInfoFromBytes unmarshals a file as a *yaml.Node. +func ReadInfoFromBytes(filename string, bytes []byte) (*yaml.Node, error) { + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + return readInfoFromBytes(filename, bytes) +} + +func readInfoFromBytes(filename string, bytes []byte) (*yaml.Node, error) { + initializeInfoCache() + if infoCacheEnable { + cachedInfo, ok := infoCache[filename] + if ok { + if verboseReader { + log.Printf("Cache hit info for file %s", filename) + } + return cachedInfo, nil + } + if verboseReader { + log.Printf("Reading info for file %s", filename) + } + } + var info yaml.Node + err := yaml.Unmarshal(bytes, &info) + if err != nil { + return nil, err + } + if infoCacheEnable && len(filename) > 0 { + infoCache[filename] = &info + } + return &info, nil +} + +// ReadInfoForRef reads a file and return the fragment needed to resolve a $ref. +func ReadInfoForRef(basefile string, ref string) (*yaml.Node, error) { + fileCacheMutex.Lock() + defer fileCacheMutex.Unlock() + infoCacheMutex.Lock() + defer infoCacheMutex.Unlock() + initializeInfoCache() + if infoCacheEnable { + info, ok := infoCache[ref] + if ok { + if verboseReader { + log.Printf("Cache hit for ref %s#%s", basefile, ref) + } + return info, nil + } + if verboseReader { + log.Printf("Reading info for ref %s#%s", basefile, ref) + } + } + basedir, _ := filepath.Split(basefile) + parts := strings.Split(ref, "#") + var filename string + if parts[0] != "" { + filename = parts[0] + if _, err := url.ParseRequestURI(parts[0]); err != nil { + // It is not an URL, so the file is local + filename = basedir + parts[0] + } + } else { + filename = basefile + } + bytes, err := readBytesForFile(filename) + if err != nil { + return nil, err + } + info, err := readInfoFromBytes(filename, bytes) + if info != nil && info.Kind == yaml.DocumentNode { + info = info.Content[0] + } + if err != nil { + log.Printf("File error: %v\n", err) + } else { + if info == nil { + return nil, NewError(nil, fmt.Sprintf("could not resolve %s", ref)) + } + if len(parts) > 1 { + path := strings.Split(parts[1], "/") + for i, key := range path { + if i > 0 { + m := info + if true { + found := false + for i := 0; i < len(m.Content); i += 2 { + if m.Content[i].Value == key { + info = m.Content[i+1] + found = true + } + } + if !found { + infoCache[ref] = nil + return nil, NewError(nil, fmt.Sprintf("could not resolve %s", ref)) + } + } + } + } + } + } + if infoCacheEnable { + infoCache[ref] = info + } + return info, nil +} diff --git a/tools/vendor/github.com/google/gnostic-models/extensions/README.md b/tools/vendor/github.com/google/gnostic-models/extensions/README.md new file mode 100644 index 000000000..4b5d63e58 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/extensions/README.md @@ -0,0 +1,13 @@ +# Extensions + +**Extension Support is experimental.** + +This directory contains support code for building Gnostic extensio handlers and +associated examples. + +Extension handlers can be used to compile vendor or specification extensions +into protocol buffer structures. + +Like plugins, extension handlers are built as separate executables. Extension +bodies are written to extension handlers as serialized +ExtensionHandlerRequests. diff --git a/tools/vendor/github.com/google/gnostic-models/extensions/extension.pb.go b/tools/vendor/github.com/google/gnostic-models/extensions/extension.pb.go new file mode 100644 index 000000000..a71df8abe --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/extensions/extension.pb.go @@ -0,0 +1,461 @@ +// Copyright 2017 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.19.3 +// source: extensions/extension.proto + +package gnostic_extension_v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +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) +) + +// The version number of Gnostic. +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix string `protobuf:"bytes,4,opt,name=suffix,proto3" json:"suffix,omitempty"` +} + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_extensions_extension_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_extensions_extension_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) +} + +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_extensions_extension_proto_rawDescGZIP(), []int{0} +} + +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major + } + return 0 +} + +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor + } + return 0 +} + +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch + } + return 0 +} + +func (x *Version) GetSuffix() string { + if x != nil { + return x.Suffix + } + return "" +} + +// An encoded Request is written to the ExtensionHandler's stdin. +type ExtensionHandlerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The extension to process. + Wrapper *Wrapper `protobuf:"bytes,1,opt,name=wrapper,proto3" json:"wrapper,omitempty"` + // The version number of Gnostic. + CompilerVersion *Version `protobuf:"bytes,2,opt,name=compiler_version,json=compilerVersion,proto3" json:"compiler_version,omitempty"` +} + +func (x *ExtensionHandlerRequest) Reset() { + *x = ExtensionHandlerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_extensions_extension_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtensionHandlerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionHandlerRequest) ProtoMessage() {} + +func (x *ExtensionHandlerRequest) ProtoReflect() protoreflect.Message { + mi := &file_extensions_extension_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) +} + +// Deprecated: Use ExtensionHandlerRequest.ProtoReflect.Descriptor instead. +func (*ExtensionHandlerRequest) Descriptor() ([]byte, []int) { + return file_extensions_extension_proto_rawDescGZIP(), []int{1} +} + +func (x *ExtensionHandlerRequest) GetWrapper() *Wrapper { + if x != nil { + return x.Wrapper + } + return nil +} + +func (x *ExtensionHandlerRequest) GetCompilerVersion() *Version { + if x != nil { + return x.CompilerVersion + } + return nil +} + +// The extensions writes an encoded ExtensionHandlerResponse to stdout. +type ExtensionHandlerResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // true if the extension is handled by the extension handler; false otherwise + Handled bool `protobuf:"varint,1,opt,name=handled,proto3" json:"handled,omitempty"` + // Error message(s). If non-empty, the extension handling failed. + // The extension handler process should exit with status code zero + // even if it reports an error in this way. + // + // This should be used to indicate errors which prevent the extension from + // operating as intended. Errors which indicate a problem in gnostic + // itself -- such as the input Document being unparseable -- should be + // reported by writing a message to stderr and exiting with a non-zero + // status code. + Errors []string `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` + // text output + Value *anypb.Any `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *ExtensionHandlerResponse) Reset() { + *x = ExtensionHandlerResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_extensions_extension_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtensionHandlerResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionHandlerResponse) ProtoMessage() {} + +func (x *ExtensionHandlerResponse) ProtoReflect() protoreflect.Message { + mi := &file_extensions_extension_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) +} + +// Deprecated: Use ExtensionHandlerResponse.ProtoReflect.Descriptor instead. +func (*ExtensionHandlerResponse) Descriptor() ([]byte, []int) { + return file_extensions_extension_proto_rawDescGZIP(), []int{2} +} + +func (x *ExtensionHandlerResponse) GetHandled() bool { + if x != nil { + return x.Handled + } + return false +} + +func (x *ExtensionHandlerResponse) GetErrors() []string { + if x != nil { + return x.Errors + } + return nil +} + +func (x *ExtensionHandlerResponse) GetValue() *anypb.Any { + if x != nil { + return x.Value + } + return nil +} + +type Wrapper struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // version of the OpenAPI specification in which this extension was written. + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // Name of the extension. + ExtensionName string `protobuf:"bytes,2,opt,name=extension_name,json=extensionName,proto3" json:"extension_name,omitempty"` + // YAML-formatted extension value. + Yaml string `protobuf:"bytes,3,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *Wrapper) Reset() { + *x = Wrapper{} + if protoimpl.UnsafeEnabled { + mi := &file_extensions_extension_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Wrapper) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Wrapper) ProtoMessage() {} + +func (x *Wrapper) ProtoReflect() protoreflect.Message { + mi := &file_extensions_extension_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) +} + +// Deprecated: Use Wrapper.ProtoReflect.Descriptor instead. +func (*Wrapper) Descriptor() ([]byte, []int) { + return file_extensions_extension_proto_rawDescGZIP(), []int{3} +} + +func (x *Wrapper) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Wrapper) GetExtensionName() string { + if x != nil { + return x.ExtensionName + } + return "" +} + +func (x *Wrapper) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +var File_extensions_extension_proto protoreflect.FileDescriptor + +var file_extensions_extension_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x63, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, + 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x75, 0x66, 0x66, + 0x69, 0x78, 0x22, 0x9c, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, + 0x0a, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x52, 0x07, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x78, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, + 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x07, 0x57, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x42, 0x4d, 0x0a, 0x0e, 0x6f, + 0x72, 0x67, 0x2e, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x47, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x01, 0x5a, 0x21, 0x2e, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x4e, 0x58, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_extensions_extension_proto_rawDescOnce sync.Once + file_extensions_extension_proto_rawDescData = file_extensions_extension_proto_rawDesc +) + +func file_extensions_extension_proto_rawDescGZIP() []byte { + file_extensions_extension_proto_rawDescOnce.Do(func() { + file_extensions_extension_proto_rawDescData = protoimpl.X.CompressGZIP(file_extensions_extension_proto_rawDescData) + }) + return file_extensions_extension_proto_rawDescData +} + +var file_extensions_extension_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_extensions_extension_proto_goTypes = []interface{}{ + (*Version)(nil), // 0: gnostic.extension.v1.Version + (*ExtensionHandlerRequest)(nil), // 1: gnostic.extension.v1.ExtensionHandlerRequest + (*ExtensionHandlerResponse)(nil), // 2: gnostic.extension.v1.ExtensionHandlerResponse + (*Wrapper)(nil), // 3: gnostic.extension.v1.Wrapper + (*anypb.Any)(nil), // 4: google.protobuf.Any +} +var file_extensions_extension_proto_depIdxs = []int32{ + 3, // 0: gnostic.extension.v1.ExtensionHandlerRequest.wrapper:type_name -> gnostic.extension.v1.Wrapper + 0, // 1: gnostic.extension.v1.ExtensionHandlerRequest.compiler_version:type_name -> gnostic.extension.v1.Version + 4, // 2: gnostic.extension.v1.ExtensionHandlerResponse.value:type_name -> google.protobuf.Any + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_extensions_extension_proto_init() } +func file_extensions_extension_proto_init() { + if File_extensions_extension_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_extensions_extension_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extensions_extension_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtensionHandlerRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extensions_extension_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtensionHandlerResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extensions_extension_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Wrapper); 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_extensions_extension_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_extensions_extension_proto_goTypes, + DependencyIndexes: file_extensions_extension_proto_depIdxs, + MessageInfos: file_extensions_extension_proto_msgTypes, + }.Build() + File_extensions_extension_proto = out.File + file_extensions_extension_proto_rawDesc = nil + file_extensions_extension_proto_goTypes = nil + file_extensions_extension_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/google/gnostic-models/extensions/extension.proto b/tools/vendor/github.com/google/gnostic-models/extensions/extension.proto new file mode 100644 index 000000000..875137c1a --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/extensions/extension.proto @@ -0,0 +1,97 @@ +// Copyright 2017 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. + +syntax = "proto3"; + +package gnostic.extension.v1; + +import "google/protobuf/any.proto"; + +// This option lets the proto compiler generate Java code inside the package +// name (see below) instead of inside an outer class. It creates a simpler +// developer experience by reducing one-level of name nesting and be +// consistent with most programming languages that don't support outer classes. +option java_multiple_files = true; + +// The Java outer classname should be the filename in UpperCamelCase. This +// class is only used to hold proto descriptor, so developers don't need to +// work with it directly. +option java_outer_classname = "GnosticExtension"; + +// The Java package name must be proto package name with proper prefix. +option java_package = "org.gnostic.v1"; + +// A reasonable prefix for the Objective-C symbols generated from the package. +// It should at a minimum be 3 characters long, all uppercase, and convention +// is to use an abbreviation of the package name. Something short, but +// hopefully unique enough to not conflict with things that may come along in +// the future. 'GPB' is reserved for the protocol buffer implementation itself. +// +// "Gnostic Extension" +option objc_class_prefix = "GNX"; + +// The Go package name. +option go_package = "./extensions;gnostic_extension_v1"; + +// The version number of Gnostic. +message Version { + int32 major = 1; + int32 minor = 2; + int32 patch = 3; + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + string suffix = 4; +} + +// An encoded Request is written to the ExtensionHandler's stdin. +message ExtensionHandlerRequest { + + // The extension to process. + Wrapper wrapper = 1; + + // The version number of Gnostic. + Version compiler_version = 2; +} + +// The extensions writes an encoded ExtensionHandlerResponse to stdout. +message ExtensionHandlerResponse { + + // true if the extension is handled by the extension handler; false otherwise + bool handled = 1; + + // Error message(s). If non-empty, the extension handling failed. + // The extension handler process should exit with status code zero + // even if it reports an error in this way. + // + // This should be used to indicate errors which prevent the extension from + // operating as intended. Errors which indicate a problem in gnostic + // itself -- such as the input Document being unparseable -- should be + // reported by writing a message to stderr and exiting with a non-zero + // status code. + repeated string errors = 2; + + // text output + google.protobuf.Any value = 3; +} + +message Wrapper { + // version of the OpenAPI specification in which this extension was written. + string version = 1; + + // Name of the extension. + string extension_name = 2; + + // YAML-formatted extension value. + string yaml = 3; +} diff --git a/tools/vendor/github.com/google/gnostic-models/extensions/extensions.go b/tools/vendor/github.com/google/gnostic-models/extensions/extensions.go new file mode 100644 index 000000000..ec8afd009 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/extensions/extensions.go @@ -0,0 +1,64 @@ +// Copyright 2017 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 gnostic_extension_v1 + +import ( + "io/ioutil" + "log" + "os" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" +) + +type extensionHandler func(name string, yamlInput string) (bool, proto.Message, error) + +// Main implements the main program of an extension handler. +func Main(handler extensionHandler) { + // unpack the request + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Println("File error:", err.Error()) + os.Exit(1) + } + if len(data) == 0 { + log.Println("No input data.") + os.Exit(1) + } + request := &ExtensionHandlerRequest{} + err = proto.Unmarshal(data, request) + if err != nil { + log.Println("Input error:", err.Error()) + os.Exit(1) + } + // call the handler + handled, output, err := handler(request.Wrapper.ExtensionName, request.Wrapper.Yaml) + // respond with the output of the handler + response := &ExtensionHandlerResponse{ + Handled: false, // default assumption + Errors: make([]string, 0), + } + if err != nil { + response.Errors = append(response.Errors, err.Error()) + } else if handled { + response.Handled = true + response.Value, err = ptypes.MarshalAny(output) + if err != nil { + response.Errors = append(response.Errors, err.Error()) + } + } + responseBytes, _ := proto.Marshal(response) + os.Stdout.Write(responseBytes) +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/README.md b/tools/vendor/github.com/google/gnostic-models/jsonschema/README.md new file mode 100644 index 000000000..6793c5179 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/README.md @@ -0,0 +1,4 @@ +# jsonschema + +This directory contains code for reading, writing, and manipulating JSON +schemas. diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/base.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/base.go new file mode 100644 index 000000000..5fcc4885a --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/base.go @@ -0,0 +1,97 @@ +// Copyright 2017 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +package jsonschema + +import ( + "encoding/base64" +) + +func baseSchemaBytes() ([]byte, error){ + return base64.StdEncoding.DecodeString( +`ewogICAgImlkIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAi +JHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAogICAgImRl +c2NyaXB0aW9uIjogIkNvcmUgc2NoZW1hIG1ldGEtc2NoZW1hIiwKICAgICJkZWZpbml0aW9ucyI6IHsK +ICAgICAgICAic2NoZW1hQXJyYXkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAg +ICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjIiB9CiAg +ICAgICAgfSwKICAgICAgICAicG9zaXRpdmVJbnRlZ2VyIjogewogICAgICAgICAgICAidHlwZSI6ICJp +bnRlZ2VyIiwKICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgfSwKICAgICAgICAicG9zaXRp +dmVJbnRlZ2VyRGVmYXVsdDAiOiB7CiAgICAgICAgICAgICJhbGxPZiI6IFsgeyAiJHJlZiI6ICIjL2Rl +ZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlciIgfSwgeyAiZGVmYXVsdCI6IDAgfSBdCiAgICAgICAgfSwK +ICAgICAgICAic2ltcGxlVHlwZXMiOiB7CiAgICAgICAgICAgICJlbnVtIjogWyAiYXJyYXkiLCAiYm9v +bGVhbiIsICJpbnRlZ2VyIiwgIm51bGwiLCAibnVtYmVyIiwgIm9iamVjdCIsICJzdHJpbmciIF0KICAg +ICAgICB9LAogICAgICAgICJzdHJpbmdBcnJheSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXki +LAogICAgICAgICAgICAiaXRlbXMiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgIm1p +bkl0ZW1zIjogMSwKICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZQogICAgICAgIH0KICAgIH0s +CiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImlkIjogewog +ICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAg +ICAgICB9LAogICAgICAgICIkc2NoZW1hIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAog +ICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICB9LAogICAgICAgICJ0aXRsZSI6IHsKICAg +ICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgImRlc2NyaXB0aW9uIjog +ewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAiZGVmYXVsdCI6 +IHt9LAogICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAog +ICAgICAgICAgICAibWluaW11bSI6IDAsCiAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogdHJ1 +ZQogICAgICAgIH0sCiAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm51bWJl +ciIKICAgICAgICB9LAogICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAidHlw +ZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgIH0sCiAgICAg +ICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICB9LAogICAg +ICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAg +ICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIm1heExlbmd0aCI6IHsg +IiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIiIH0sCiAgICAgICAgIm1pbkxlbmd0 +aCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCIgfSwKICAg +ICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAg +ImZvcm1hdCI6ICJyZWdleCIKICAgICAgICB9LAogICAgICAgICJhZGRpdGlvbmFsSXRlbXMiOiB7CiAg +ICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYm9vbGVhbiIgfSwK +ICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIyIgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAi +ZGVmYXVsdCI6IHt9CiAgICAgICAgfSwKICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJhbnlP +ZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAgICAgIHsgIiRy +ZWYiOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIgfQogICAgICAgICAgICBdLAogICAgICAgICAg +ICAiZGVmYXVsdCI6IHt9CiAgICAgICAgfSwKICAgICAgICAibWF4SXRlbXMiOiB7ICIkcmVmIjogIiMv +ZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIiB9LAogICAgICAgICJtaW5JdGVtcyI6IHsgIiRyZWYi +OiAiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCIgfSwKICAgICAgICAidW5pcXVl +SXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAiZGVmYXVs +dCI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAibWF4UHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIy9k +ZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIiIH0sCiAgICAgICAgIm1pblByb3BlcnRpZXMiOiB7ICIk +cmVmIjogIiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAiIH0sCiAgICAgICAgInJl +cXVpcmVkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cmluZ0FycmF5IiB9LAogICAgICAgICJh +ZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAg +ICAgeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjIiB9CiAg +ICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZWZhdWx0Ijoge30KICAgICAgICB9LAogICAgICAgICJk +ZWZpbml0aW9ucyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImFk +ZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAiZGVmYXVsdCI6 +IHt9CiAgICAgICAgfSwKICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAi +b2JqZWN0IiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjIiB9 +LAogICAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgfSwKICAgICAgICAicGF0dGVyblByb3Bl +cnRpZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJhZGRpdGlv +bmFsUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAgImRlZmF1bHQiOiB7fQog +ICAgICAgIH0sCiAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2Jq +ZWN0IiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAg +ImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAg +ICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkiIH0KICAgICAgICAgICAg +ICAgIF0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAg +ICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgInVu +aXF1ZUl0ZW1zIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICJh +bnlPZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBl +cyIgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIs +CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NpbXBs +ZVR5cGVzIiB9LAogICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAg +ICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAg +ICAgICAgfSwKICAgICAgICAiYWxsT2YiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJy +YXkiIH0sCiAgICAgICAgImFueU9mIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5 +IiB9LAogICAgICAgICJvbmVPZiI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIg +fSwKICAgICAgICAibm90IjogeyAiJHJlZiI6ICIjIiB9CiAgICB9LAogICAgImRlcGVuZGVuY2llcyI6 +IHsKICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IFsgIm1heGltdW0iIF0sCiAgICAgICAgImV4Y2x1 +c2l2ZU1pbmltdW0iOiBbICJtaW5pbXVtIiBdCiAgICB9LAogICAgImRlZmF1bHQiOiB7fQp9Cg==`)} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/display.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/display.go new file mode 100644 index 000000000..028a760a9 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/display.go @@ -0,0 +1,229 @@ +// Copyright 2017 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 jsonschema + +import ( + "fmt" + "strings" +) + +// +// DISPLAY +// The following methods display Schemas. +// + +// Description returns a string representation of a string or string array. +func (s *StringOrStringArray) Description() string { + if s.String != nil { + return *s.String + } + if s.StringArray != nil { + return strings.Join(*s.StringArray, ", ") + } + return "" +} + +// Returns a string representation of a Schema. +func (schema *Schema) String() string { + return schema.describeSchema("") +} + +// Helper: Returns a string representation of a Schema indented by a specified string. +func (schema *Schema) describeSchema(indent string) string { + result := "" + if schema.Schema != nil { + result += indent + "$schema: " + *(schema.Schema) + "\n" + } + if schema.ID != nil { + result += indent + "id: " + *(schema.ID) + "\n" + } + if schema.MultipleOf != nil { + result += indent + fmt.Sprintf("multipleOf: %+v\n", *(schema.MultipleOf)) + } + if schema.Maximum != nil { + result += indent + fmt.Sprintf("maximum: %+v\n", *(schema.Maximum)) + } + if schema.ExclusiveMaximum != nil { + result += indent + fmt.Sprintf("exclusiveMaximum: %+v\n", *(schema.ExclusiveMaximum)) + } + if schema.Minimum != nil { + result += indent + fmt.Sprintf("minimum: %+v\n", *(schema.Minimum)) + } + if schema.ExclusiveMinimum != nil { + result += indent + fmt.Sprintf("exclusiveMinimum: %+v\n", *(schema.ExclusiveMinimum)) + } + if schema.MaxLength != nil { + result += indent + fmt.Sprintf("maxLength: %+v\n", *(schema.MaxLength)) + } + if schema.MinLength != nil { + result += indent + fmt.Sprintf("minLength: %+v\n", *(schema.MinLength)) + } + if schema.Pattern != nil { + result += indent + fmt.Sprintf("pattern: %+v\n", *(schema.Pattern)) + } + if schema.AdditionalItems != nil { + s := schema.AdditionalItems.Schema + if s != nil { + result += indent + "additionalItems:\n" + result += s.describeSchema(indent + " ") + } else { + b := *(schema.AdditionalItems.Boolean) + result += indent + fmt.Sprintf("additionalItems: %+v\n", b) + } + } + if schema.Items != nil { + result += indent + "items:\n" + items := schema.Items + if items.SchemaArray != nil { + for i, s := range *(items.SchemaArray) { + result += indent + " " + fmt.Sprintf("%d", i) + ":\n" + result += s.describeSchema(indent + " " + " ") + } + } else if items.Schema != nil { + result += items.Schema.describeSchema(indent + " " + " ") + } + } + if schema.MaxItems != nil { + result += indent + fmt.Sprintf("maxItems: %+v\n", *(schema.MaxItems)) + } + if schema.MinItems != nil { + result += indent + fmt.Sprintf("minItems: %+v\n", *(schema.MinItems)) + } + if schema.UniqueItems != nil { + result += indent + fmt.Sprintf("uniqueItems: %+v\n", *(schema.UniqueItems)) + } + if schema.MaxProperties != nil { + result += indent + fmt.Sprintf("maxProperties: %+v\n", *(schema.MaxProperties)) + } + if schema.MinProperties != nil { + result += indent + fmt.Sprintf("minProperties: %+v\n", *(schema.MinProperties)) + } + if schema.Required != nil { + result += indent + fmt.Sprintf("required: %+v\n", *(schema.Required)) + } + if schema.AdditionalProperties != nil { + s := schema.AdditionalProperties.Schema + if s != nil { + result += indent + "additionalProperties:\n" + result += s.describeSchema(indent + " ") + } else { + b := *(schema.AdditionalProperties.Boolean) + result += indent + fmt.Sprintf("additionalProperties: %+v\n", b) + } + } + if schema.Properties != nil { + result += indent + "properties:\n" + for _, pair := range *(schema.Properties) { + name := pair.Name + s := pair.Value + result += indent + " " + name + ":\n" + result += s.describeSchema(indent + " " + " ") + } + } + if schema.PatternProperties != nil { + result += indent + "patternProperties:\n" + for _, pair := range *(schema.PatternProperties) { + name := pair.Name + s := pair.Value + result += indent + " " + name + ":\n" + result += s.describeSchema(indent + " " + " ") + } + } + if schema.Dependencies != nil { + result += indent + "dependencies:\n" + for _, pair := range *(schema.Dependencies) { + name := pair.Name + schemaOrStringArray := pair.Value + s := schemaOrStringArray.Schema + if s != nil { + result += indent + " " + name + ":\n" + result += s.describeSchema(indent + " " + " ") + } else { + a := schemaOrStringArray.StringArray + if a != nil { + result += indent + " " + name + ":\n" + for _, s2 := range *a { + result += indent + " " + " " + s2 + "\n" + } + } + } + + } + } + if schema.Enumeration != nil { + result += indent + "enumeration:\n" + for _, value := range *(schema.Enumeration) { + if value.String != nil { + result += indent + " " + fmt.Sprintf("%+v\n", *value.String) + } else { + result += indent + " " + fmt.Sprintf("%+v\n", *value.Bool) + } + } + } + if schema.Type != nil { + result += indent + fmt.Sprintf("type: %+v\n", schema.Type.Description()) + } + if schema.AllOf != nil { + result += indent + "allOf:\n" + for _, s := range *(schema.AllOf) { + result += s.describeSchema(indent + " ") + result += indent + "-\n" + } + } + if schema.AnyOf != nil { + result += indent + "anyOf:\n" + for _, s := range *(schema.AnyOf) { + result += s.describeSchema(indent + " ") + result += indent + "-\n" + } + } + if schema.OneOf != nil { + result += indent + "oneOf:\n" + for _, s := range *(schema.OneOf) { + result += s.describeSchema(indent + " ") + result += indent + "-\n" + } + } + if schema.Not != nil { + result += indent + "not:\n" + result += schema.Not.describeSchema(indent + " ") + } + if schema.Definitions != nil { + result += indent + "definitions:\n" + for _, pair := range *(schema.Definitions) { + name := pair.Name + s := pair.Value + result += indent + " " + name + ":\n" + result += s.describeSchema(indent + " " + " ") + } + } + if schema.Title != nil { + result += indent + "title: " + *(schema.Title) + "\n" + } + if schema.Description != nil { + result += indent + "description: " + *(schema.Description) + "\n" + } + if schema.Default != nil { + result += indent + "default:\n" + result += indent + fmt.Sprintf(" %+v\n", *(schema.Default)) + } + if schema.Format != nil { + result += indent + "format: " + *(schema.Format) + "\n" + } + if schema.Ref != nil { + result += indent + "$ref: " + *(schema.Ref) + "\n" + } + return result +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/models.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/models.go new file mode 100644 index 000000000..4781bdc5f --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/models.go @@ -0,0 +1,228 @@ +// Copyright 2017 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 jsonschema supports the reading, writing, and manipulation +// of JSON Schemas. +package jsonschema + +import "gopkg.in/yaml.v3" + +// The Schema struct models a JSON Schema and, because schemas are +// defined hierarchically, contains many references to itself. +// All fields are pointers and are nil if the associated values +// are not specified. +type Schema struct { + Schema *string // $schema + ID *string // id keyword used for $ref resolution scope + Ref *string // $ref, i.e. JSON Pointers + + // http://json-schema.org/latest/json-schema-validation.html + // 5.1. Validation keywords for numeric instances (number and integer) + MultipleOf *SchemaNumber + Maximum *SchemaNumber + ExclusiveMaximum *bool + Minimum *SchemaNumber + ExclusiveMinimum *bool + + // 5.2. Validation keywords for strings + MaxLength *int64 + MinLength *int64 + Pattern *string + + // 5.3. Validation keywords for arrays + AdditionalItems *SchemaOrBoolean + Items *SchemaOrSchemaArray + MaxItems *int64 + MinItems *int64 + UniqueItems *bool + + // 5.4. Validation keywords for objects + MaxProperties *int64 + MinProperties *int64 + Required *[]string + AdditionalProperties *SchemaOrBoolean + Properties *[]*NamedSchema + PatternProperties *[]*NamedSchema + Dependencies *[]*NamedSchemaOrStringArray + + // 5.5. Validation keywords for any instance type + Enumeration *[]SchemaEnumValue + Type *StringOrStringArray + AllOf *[]*Schema + AnyOf *[]*Schema + OneOf *[]*Schema + Not *Schema + Definitions *[]*NamedSchema + + // 6. Metadata keywords + Title *string + Description *string + Default *yaml.Node + + // 7. Semantic validation with "format" + Format *string +} + +// These helper structs represent "combination" types that generally can +// have values of one type or another. All are used to represent parts +// of Schemas. + +// SchemaNumber represents a value that can be either an Integer or a Float. +type SchemaNumber struct { + Integer *int64 + Float *float64 +} + +// NewSchemaNumberWithInteger creates and returns a new object +func NewSchemaNumberWithInteger(i int64) *SchemaNumber { + result := &SchemaNumber{} + result.Integer = &i + return result +} + +// NewSchemaNumberWithFloat creates and returns a new object +func NewSchemaNumberWithFloat(f float64) *SchemaNumber { + result := &SchemaNumber{} + result.Float = &f + return result +} + +// SchemaOrBoolean represents a value that can be either a Schema or a Boolean. +type SchemaOrBoolean struct { + Schema *Schema + Boolean *bool +} + +// NewSchemaOrBooleanWithSchema creates and returns a new object +func NewSchemaOrBooleanWithSchema(s *Schema) *SchemaOrBoolean { + result := &SchemaOrBoolean{} + result.Schema = s + return result +} + +// NewSchemaOrBooleanWithBoolean creates and returns a new object +func NewSchemaOrBooleanWithBoolean(b bool) *SchemaOrBoolean { + result := &SchemaOrBoolean{} + result.Boolean = &b + return result +} + +// StringOrStringArray represents a value that can be either +// a String or an Array of Strings. +type StringOrStringArray struct { + String *string + StringArray *[]string +} + +// NewStringOrStringArrayWithString creates and returns a new object +func NewStringOrStringArrayWithString(s string) *StringOrStringArray { + result := &StringOrStringArray{} + result.String = &s + return result +} + +// NewStringOrStringArrayWithStringArray creates and returns a new object +func NewStringOrStringArrayWithStringArray(a []string) *StringOrStringArray { + result := &StringOrStringArray{} + result.StringArray = &a + return result +} + +// SchemaOrStringArray represents a value that can be either +// a Schema or an Array of Strings. +type SchemaOrStringArray struct { + Schema *Schema + StringArray *[]string +} + +// SchemaOrSchemaArray represents a value that can be either +// a Schema or an Array of Schemas. +type SchemaOrSchemaArray struct { + Schema *Schema + SchemaArray *[]*Schema +} + +// NewSchemaOrSchemaArrayWithSchema creates and returns a new object +func NewSchemaOrSchemaArrayWithSchema(s *Schema) *SchemaOrSchemaArray { + result := &SchemaOrSchemaArray{} + result.Schema = s + return result +} + +// NewSchemaOrSchemaArrayWithSchemaArray creates and returns a new object +func NewSchemaOrSchemaArrayWithSchemaArray(a []*Schema) *SchemaOrSchemaArray { + result := &SchemaOrSchemaArray{} + result.SchemaArray = &a + return result +} + +// SchemaEnumValue represents a value that can be part of an +// enumeration in a Schema. +type SchemaEnumValue struct { + String *string + Bool *bool +} + +// NamedSchema is a name-value pair that is used to emulate maps +// with ordered keys. +type NamedSchema struct { + Name string + Value *Schema +} + +// NewNamedSchema creates and returns a new object +func NewNamedSchema(name string, value *Schema) *NamedSchema { + return &NamedSchema{Name: name, Value: value} +} + +// NamedSchemaOrStringArray is a name-value pair that is used +// to emulate maps with ordered keys. +type NamedSchemaOrStringArray struct { + Name string + Value *SchemaOrStringArray +} + +// Access named subschemas by name + +func namedSchemaArrayElementWithName(array *[]*NamedSchema, name string) *Schema { + if array == nil { + return nil + } + for _, pair := range *array { + if pair.Name == name { + return pair.Value + } + } + return nil +} + +// PropertyWithName returns the selected element. +func (s *Schema) PropertyWithName(name string) *Schema { + return namedSchemaArrayElementWithName(s.Properties, name) +} + +// PatternPropertyWithName returns the selected element. +func (s *Schema) PatternPropertyWithName(name string) *Schema { + return namedSchemaArrayElementWithName(s.PatternProperties, name) +} + +// DefinitionWithName returns the selected element. +func (s *Schema) DefinitionWithName(name string) *Schema { + return namedSchemaArrayElementWithName(s.Definitions, name) +} + +// AddProperty adds a named property. +func (s *Schema) AddProperty(name string, property *Schema) { + *s.Properties = append(*s.Properties, NewNamedSchema(name, property)) +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/operations.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/operations.go new file mode 100644 index 000000000..ba8dd4a91 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/operations.go @@ -0,0 +1,394 @@ +// Copyright 2017 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 jsonschema + +import ( + "fmt" + "log" + "strings" +) + +// +// OPERATIONS +// The following methods perform operations on Schemas. +// + +// IsEmpty returns true if no members of the Schema are specified. +func (schema *Schema) IsEmpty() bool { + return (schema.Schema == nil) && + (schema.ID == nil) && + (schema.MultipleOf == nil) && + (schema.Maximum == nil) && + (schema.ExclusiveMaximum == nil) && + (schema.Minimum == nil) && + (schema.ExclusiveMinimum == nil) && + (schema.MaxLength == nil) && + (schema.MinLength == nil) && + (schema.Pattern == nil) && + (schema.AdditionalItems == nil) && + (schema.Items == nil) && + (schema.MaxItems == nil) && + (schema.MinItems == nil) && + (schema.UniqueItems == nil) && + (schema.MaxProperties == nil) && + (schema.MinProperties == nil) && + (schema.Required == nil) && + (schema.AdditionalProperties == nil) && + (schema.Properties == nil) && + (schema.PatternProperties == nil) && + (schema.Dependencies == nil) && + (schema.Enumeration == nil) && + (schema.Type == nil) && + (schema.AllOf == nil) && + (schema.AnyOf == nil) && + (schema.OneOf == nil) && + (schema.Not == nil) && + (schema.Definitions == nil) && + (schema.Title == nil) && + (schema.Description == nil) && + (schema.Default == nil) && + (schema.Format == nil) && + (schema.Ref == nil) +} + +// IsEqual returns true if two schemas are equal. +func (schema *Schema) IsEqual(schema2 *Schema) bool { + return schema.String() == schema2.String() +} + +// SchemaOperation represents a function that can be applied to a Schema. +type SchemaOperation func(schema *Schema, context string) + +// Applies a specified function to a Schema and all of the Schemas that it contains. +func (schema *Schema) applyToSchemas(operation SchemaOperation, context string) { + + if schema.AdditionalItems != nil { + s := schema.AdditionalItems.Schema + if s != nil { + s.applyToSchemas(operation, "AdditionalItems") + } + } + + if schema.Items != nil { + if schema.Items.SchemaArray != nil { + for _, s := range *(schema.Items.SchemaArray) { + s.applyToSchemas(operation, "Items.SchemaArray") + } + } else if schema.Items.Schema != nil { + schema.Items.Schema.applyToSchemas(operation, "Items.Schema") + } + } + + if schema.AdditionalProperties != nil { + s := schema.AdditionalProperties.Schema + if s != nil { + s.applyToSchemas(operation, "AdditionalProperties") + } + } + + if schema.Properties != nil { + for _, pair := range *(schema.Properties) { + s := pair.Value + s.applyToSchemas(operation, "Properties") + } + } + if schema.PatternProperties != nil { + for _, pair := range *(schema.PatternProperties) { + s := pair.Value + s.applyToSchemas(operation, "PatternProperties") + } + } + + if schema.Dependencies != nil { + for _, pair := range *(schema.Dependencies) { + schemaOrStringArray := pair.Value + s := schemaOrStringArray.Schema + if s != nil { + s.applyToSchemas(operation, "Dependencies") + } + } + } + + if schema.AllOf != nil { + for _, s := range *(schema.AllOf) { + s.applyToSchemas(operation, "AllOf") + } + } + if schema.AnyOf != nil { + for _, s := range *(schema.AnyOf) { + s.applyToSchemas(operation, "AnyOf") + } + } + if schema.OneOf != nil { + for _, s := range *(schema.OneOf) { + s.applyToSchemas(operation, "OneOf") + } + } + if schema.Not != nil { + schema.Not.applyToSchemas(operation, "Not") + } + + if schema.Definitions != nil { + for _, pair := range *(schema.Definitions) { + s := pair.Value + s.applyToSchemas(operation, "Definitions") + } + } + + operation(schema, context) +} + +// CopyProperties copies all non-nil properties from the source Schema to the schema Schema. +func (schema *Schema) CopyProperties(source *Schema) { + if source.Schema != nil { + schema.Schema = source.Schema + } + if source.ID != nil { + schema.ID = source.ID + } + if source.MultipleOf != nil { + schema.MultipleOf = source.MultipleOf + } + if source.Maximum != nil { + schema.Maximum = source.Maximum + } + if source.ExclusiveMaximum != nil { + schema.ExclusiveMaximum = source.ExclusiveMaximum + } + if source.Minimum != nil { + schema.Minimum = source.Minimum + } + if source.ExclusiveMinimum != nil { + schema.ExclusiveMinimum = source.ExclusiveMinimum + } + if source.MaxLength != nil { + schema.MaxLength = source.MaxLength + } + if source.MinLength != nil { + schema.MinLength = source.MinLength + } + if source.Pattern != nil { + schema.Pattern = source.Pattern + } + if source.AdditionalItems != nil { + schema.AdditionalItems = source.AdditionalItems + } + if source.Items != nil { + schema.Items = source.Items + } + if source.MaxItems != nil { + schema.MaxItems = source.MaxItems + } + if source.MinItems != nil { + schema.MinItems = source.MinItems + } + if source.UniqueItems != nil { + schema.UniqueItems = source.UniqueItems + } + if source.MaxProperties != nil { + schema.MaxProperties = source.MaxProperties + } + if source.MinProperties != nil { + schema.MinProperties = source.MinProperties + } + if source.Required != nil { + schema.Required = source.Required + } + if source.AdditionalProperties != nil { + schema.AdditionalProperties = source.AdditionalProperties + } + if source.Properties != nil { + schema.Properties = source.Properties + } + if source.PatternProperties != nil { + schema.PatternProperties = source.PatternProperties + } + if source.Dependencies != nil { + schema.Dependencies = source.Dependencies + } + if source.Enumeration != nil { + schema.Enumeration = source.Enumeration + } + if source.Type != nil { + schema.Type = source.Type + } + if source.AllOf != nil { + schema.AllOf = source.AllOf + } + if source.AnyOf != nil { + schema.AnyOf = source.AnyOf + } + if source.OneOf != nil { + schema.OneOf = source.OneOf + } + if source.Not != nil { + schema.Not = source.Not + } + if source.Definitions != nil { + schema.Definitions = source.Definitions + } + if source.Title != nil { + schema.Title = source.Title + } + if source.Description != nil { + schema.Description = source.Description + } + if source.Default != nil { + schema.Default = source.Default + } + if source.Format != nil { + schema.Format = source.Format + } + if source.Ref != nil { + schema.Ref = source.Ref + } +} + +// TypeIs returns true if the Type of a Schema includes the specified type +func (schema *Schema) TypeIs(typeName string) bool { + if schema.Type != nil { + // the schema Type is either a string or an array of strings + if schema.Type.String != nil { + return (*(schema.Type.String) == typeName) + } else if schema.Type.StringArray != nil { + for _, n := range *(schema.Type.StringArray) { + if n == typeName { + return true + } + } + } + } + return false +} + +// ResolveRefs resolves "$ref" elements in a Schema and its children. +// But if a reference refers to an object type, is inside a oneOf, or contains a oneOf, +// the reference is kept and we expect downstream tools to separately model these +// referenced schemas. +func (schema *Schema) ResolveRefs() { + rootSchema := schema + count := 1 + for count > 0 { + count = 0 + schema.applyToSchemas( + func(schema *Schema, context string) { + if schema.Ref != nil { + resolvedRef, err := rootSchema.resolveJSONPointer(*(schema.Ref)) + if err != nil { + log.Printf("%+v", err) + } else if resolvedRef.TypeIs("object") { + // don't substitute for objects, we'll model the referenced schema with a class + } else if context == "OneOf" { + // don't substitute for references inside oneOf declarations + } else if resolvedRef.OneOf != nil { + // don't substitute for references that contain oneOf declarations + } else if resolvedRef.AdditionalProperties != nil { + // don't substitute for references that look like objects + } else { + schema.Ref = nil + schema.CopyProperties(resolvedRef) + count++ + } + } + }, "") + } +} + +// resolveJSONPointer resolves JSON pointers. +// This current implementation is very crude and custom for OpenAPI 2.0 schemas. +// It panics for any pointer that it is unable to resolve. +func (schema *Schema) resolveJSONPointer(ref string) (result *Schema, err error) { + parts := strings.Split(ref, "#") + if len(parts) == 2 { + documentName := parts[0] + "#" + if documentName == "#" && schema.ID != nil { + documentName = *(schema.ID) + } + path := parts[1] + document := schemas[documentName] + pathParts := strings.Split(path, "/") + + // we currently do a very limited (hard-coded) resolution of certain paths and log errors for missed cases + if len(pathParts) == 1 { + return document, nil + } else if len(pathParts) == 3 { + switch pathParts[1] { + case "definitions": + dictionary := document.Definitions + for _, pair := range *dictionary { + if pair.Name == pathParts[2] { + result = pair.Value + } + } + case "properties": + dictionary := document.Properties + for _, pair := range *dictionary { + if pair.Name == pathParts[2] { + result = pair.Value + } + } + default: + break + } + } + } + if result == nil { + return nil, fmt.Errorf("unresolved pointer: %+v", ref) + } + return result, nil +} + +// ResolveAllOfs replaces "allOf" elements by merging their properties into the parent Schema. +func (schema *Schema) ResolveAllOfs() { + schema.applyToSchemas( + func(schema *Schema, context string) { + if schema.AllOf != nil { + for _, allOf := range *(schema.AllOf) { + schema.CopyProperties(allOf) + } + schema.AllOf = nil + } + }, "resolveAllOfs") +} + +// ResolveAnyOfs replaces all "anyOf" elements with "oneOf". +func (schema *Schema) ResolveAnyOfs() { + schema.applyToSchemas( + func(schema *Schema, context string) { + if schema.AnyOf != nil { + schema.OneOf = schema.AnyOf + schema.AnyOf = nil + } + }, "resolveAnyOfs") +} + +// return a pointer to a copy of a passed-in string +func stringptr(input string) (output *string) { + return &input +} + +// CopyOfficialSchemaProperty copies a named property from the official JSON Schema definition +func (schema *Schema) CopyOfficialSchemaProperty(name string) { + *schema.Properties = append(*schema.Properties, + NewNamedSchema(name, + &Schema{Ref: stringptr("http://json-schema.org/draft-04/schema#/properties/" + name)})) +} + +// CopyOfficialSchemaProperties copies named properties from the official JSON Schema definition +func (schema *Schema) CopyOfficialSchemaProperties(names []string) { + for _, name := range names { + schema.CopyOfficialSchemaProperty(name) + } +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/reader.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/reader.go new file mode 100644 index 000000000..b8583d466 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/reader.go @@ -0,0 +1,442 @@ +// Copyright 2017 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. + +//go:generate go run generate-base.go + +package jsonschema + +import ( + "fmt" + "io/ioutil" + "strconv" + + "gopkg.in/yaml.v3" +) + +// This is a global map of all known Schemas. +// It is initialized when the first Schema is created and inserted. +var schemas map[string]*Schema + +// NewBaseSchema builds a schema object from an embedded json representation. +func NewBaseSchema() (schema *Schema, err error) { + b, err := baseSchemaBytes() + if err != nil { + return nil, err + } + var node yaml.Node + err = yaml.Unmarshal(b, &node) + if err != nil { + return nil, err + } + return NewSchemaFromObject(&node), nil +} + +// NewSchemaFromFile reads a schema from a file. +// Currently this assumes that schemas are stored in the source distribution of this project. +func NewSchemaFromFile(filename string) (schema *Schema, err error) { + file, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + var node yaml.Node + err = yaml.Unmarshal(file, &node) + if err != nil { + return nil, err + } + return NewSchemaFromObject(&node), nil +} + +// NewSchemaFromObject constructs a schema from a parsed JSON object. +// Due to the complexity of the schema representation, this is a +// custom reader and not the standard Go JSON reader (encoding/json). +func NewSchemaFromObject(jsonData *yaml.Node) *Schema { + switch jsonData.Kind { + case yaml.DocumentNode: + return NewSchemaFromObject(jsonData.Content[0]) + case yaml.MappingNode: + schema := &Schema{} + + for i := 0; i < len(jsonData.Content); i += 2 { + k := jsonData.Content[i].Value + v := jsonData.Content[i+1] + + switch k { + case "$schema": + schema.Schema = schema.stringValue(v) + case "id": + schema.ID = schema.stringValue(v) + + case "multipleOf": + schema.MultipleOf = schema.numberValue(v) + case "maximum": + schema.Maximum = schema.numberValue(v) + case "exclusiveMaximum": + schema.ExclusiveMaximum = schema.boolValue(v) + case "minimum": + schema.Minimum = schema.numberValue(v) + case "exclusiveMinimum": + schema.ExclusiveMinimum = schema.boolValue(v) + + case "maxLength": + schema.MaxLength = schema.intValue(v) + case "minLength": + schema.MinLength = schema.intValue(v) + case "pattern": + schema.Pattern = schema.stringValue(v) + + case "additionalItems": + schema.AdditionalItems = schema.schemaOrBooleanValue(v) + case "items": + schema.Items = schema.schemaOrSchemaArrayValue(v) + case "maxItems": + schema.MaxItems = schema.intValue(v) + case "minItems": + schema.MinItems = schema.intValue(v) + case "uniqueItems": + schema.UniqueItems = schema.boolValue(v) + + case "maxProperties": + schema.MaxProperties = schema.intValue(v) + case "minProperties": + schema.MinProperties = schema.intValue(v) + case "required": + schema.Required = schema.arrayOfStringsValue(v) + case "additionalProperties": + schema.AdditionalProperties = schema.schemaOrBooleanValue(v) + case "properties": + schema.Properties = schema.mapOfSchemasValue(v) + case "patternProperties": + schema.PatternProperties = schema.mapOfSchemasValue(v) + case "dependencies": + schema.Dependencies = schema.mapOfSchemasOrStringArraysValue(v) + + case "enum": + schema.Enumeration = schema.arrayOfEnumValuesValue(v) + + case "type": + schema.Type = schema.stringOrStringArrayValue(v) + case "allOf": + schema.AllOf = schema.arrayOfSchemasValue(v) + case "anyOf": + schema.AnyOf = schema.arrayOfSchemasValue(v) + case "oneOf": + schema.OneOf = schema.arrayOfSchemasValue(v) + case "not": + schema.Not = NewSchemaFromObject(v) + case "definitions": + schema.Definitions = schema.mapOfSchemasValue(v) + + case "title": + schema.Title = schema.stringValue(v) + case "description": + schema.Description = schema.stringValue(v) + + case "default": + schema.Default = v + + case "format": + schema.Format = schema.stringValue(v) + case "$ref": + schema.Ref = schema.stringValue(v) + default: + fmt.Printf("UNSUPPORTED (%s)\n", k) + } + } + + // insert schema in global map + if schema.ID != nil { + if schemas == nil { + schemas = make(map[string]*Schema, 0) + } + schemas[*(schema.ID)] = schema + } + return schema + + default: + fmt.Printf("schemaValue: unexpected node %+v\n", jsonData) + return nil + } + + return nil +} + +// +// BUILDERS +// The following methods build elements of Schemas from interface{} values. +// Each returns nil if it is unable to build the desired element. +// + +// Gets the string value of an interface{} value if possible. +func (schema *Schema) stringValue(v *yaml.Node) *string { + switch v.Kind { + case yaml.ScalarNode: + return &v.Value + default: + fmt.Printf("stringValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets the numeric value of an interface{} value if possible. +func (schema *Schema) numberValue(v *yaml.Node) *SchemaNumber { + number := &SchemaNumber{} + switch v.Kind { + case yaml.ScalarNode: + switch v.Tag { + case "!!float": + v2, _ := strconv.ParseFloat(v.Value, 64) + number.Float = &v2 + return number + case "!!int": + v2, _ := strconv.ParseInt(v.Value, 10, 64) + number.Integer = &v2 + return number + default: + fmt.Printf("stringValue: unexpected node %+v\n", v) + } + default: + fmt.Printf("stringValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets the integer value of an interface{} value if possible. +func (schema *Schema) intValue(v *yaml.Node) *int64 { + switch v.Kind { + case yaml.ScalarNode: + switch v.Tag { + case "!!float": + v2, _ := strconv.ParseFloat(v.Value, 64) + v3 := int64(v2) + return &v3 + case "!!int": + v2, _ := strconv.ParseInt(v.Value, 10, 64) + return &v2 + default: + fmt.Printf("intValue: unexpected node %+v\n", v) + } + default: + fmt.Printf("intValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets the bool value of an interface{} value if possible. +func (schema *Schema) boolValue(v *yaml.Node) *bool { + switch v.Kind { + case yaml.ScalarNode: + switch v.Tag { + case "!!bool": + v2, _ := strconv.ParseBool(v.Value) + return &v2 + default: + fmt.Printf("boolValue: unexpected node %+v\n", v) + } + default: + fmt.Printf("boolValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets a map of Schemas from an interface{} value if possible. +func (schema *Schema) mapOfSchemasValue(v *yaml.Node) *[]*NamedSchema { + switch v.Kind { + case yaml.MappingNode: + m := make([]*NamedSchema, 0) + for i := 0; i < len(v.Content); i += 2 { + k2 := v.Content[i].Value + v2 := v.Content[i+1] + pair := &NamedSchema{Name: k2, Value: NewSchemaFromObject(v2)} + m = append(m, pair) + } + return &m + default: + fmt.Printf("mapOfSchemasValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets an array of Schemas from an interface{} value if possible. +func (schema *Schema) arrayOfSchemasValue(v *yaml.Node) *[]*Schema { + switch v.Kind { + case yaml.SequenceNode: + m := make([]*Schema, 0) + for _, v2 := range v.Content { + switch v2.Kind { + case yaml.MappingNode: + s := NewSchemaFromObject(v2) + m = append(m, s) + default: + fmt.Printf("arrayOfSchemasValue: unexpected node %+v\n", v2) + } + } + return &m + case yaml.MappingNode: + m := make([]*Schema, 0) + s := NewSchemaFromObject(v) + m = append(m, s) + return &m + default: + fmt.Printf("arrayOfSchemasValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets a Schema or an array of Schemas from an interface{} value if possible. +func (schema *Schema) schemaOrSchemaArrayValue(v *yaml.Node) *SchemaOrSchemaArray { + switch v.Kind { + case yaml.SequenceNode: + m := make([]*Schema, 0) + for _, v2 := range v.Content { + switch v2.Kind { + case yaml.MappingNode: + s := NewSchemaFromObject(v2) + m = append(m, s) + default: + fmt.Printf("schemaOrSchemaArrayValue: unexpected node %+v\n", v2) + } + } + return &SchemaOrSchemaArray{SchemaArray: &m} + case yaml.MappingNode: + s := NewSchemaFromObject(v) + return &SchemaOrSchemaArray{Schema: s} + default: + fmt.Printf("schemaOrSchemaArrayValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets an array of strings from an interface{} value if possible. +func (schema *Schema) arrayOfStringsValue(v *yaml.Node) *[]string { + switch v.Kind { + case yaml.ScalarNode: + a := []string{v.Value} + return &a + case yaml.SequenceNode: + a := make([]string, 0) + for _, v2 := range v.Content { + switch v2.Kind { + case yaml.ScalarNode: + a = append(a, v2.Value) + default: + fmt.Printf("arrayOfStringsValue: unexpected node %+v\n", v2) + } + } + return &a + default: + fmt.Printf("arrayOfStringsValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets a string or an array of strings from an interface{} value if possible. +func (schema *Schema) stringOrStringArrayValue(v *yaml.Node) *StringOrStringArray { + switch v.Kind { + case yaml.ScalarNode: + s := &StringOrStringArray{} + s.String = &v.Value + return s + case yaml.SequenceNode: + a := make([]string, 0) + for _, v2 := range v.Content { + switch v2.Kind { + case yaml.ScalarNode: + a = append(a, v2.Value) + default: + fmt.Printf("arrayOfStringsValue: unexpected node %+v\n", v2) + } + } + s := &StringOrStringArray{} + s.StringArray = &a + return s + default: + fmt.Printf("arrayOfStringsValue: unexpected node %+v\n", v) + } + return nil +} + +// Gets an array of enum values from an interface{} value if possible. +func (schema *Schema) arrayOfEnumValuesValue(v *yaml.Node) *[]SchemaEnumValue { + a := make([]SchemaEnumValue, 0) + switch v.Kind { + case yaml.SequenceNode: + for _, v2 := range v.Content { + switch v2.Kind { + case yaml.ScalarNode: + switch v2.Tag { + case "!!str": + a = append(a, SchemaEnumValue{String: &v2.Value}) + case "!!bool": + v3, _ := strconv.ParseBool(v2.Value) + a = append(a, SchemaEnumValue{Bool: &v3}) + default: + fmt.Printf("arrayOfEnumValuesValue: unexpected type %s\n", v2.Tag) + } + default: + fmt.Printf("arrayOfEnumValuesValue: unexpected node %+v\n", v2) + } + } + default: + fmt.Printf("arrayOfEnumValuesValue: unexpected node %+v\n", v) + } + return &a +} + +// Gets a map of schemas or string arrays from an interface{} value if possible. +func (schema *Schema) mapOfSchemasOrStringArraysValue(v *yaml.Node) *[]*NamedSchemaOrStringArray { + m := make([]*NamedSchemaOrStringArray, 0) + switch v.Kind { + case yaml.MappingNode: + for i := 0; i < len(v.Content); i += 2 { + k2 := v.Content[i].Value + v2 := v.Content[i+1] + switch v2.Kind { + case yaml.SequenceNode: + a := make([]string, 0) + for _, v3 := range v2.Content { + switch v3.Kind { + case yaml.ScalarNode: + a = append(a, v3.Value) + default: + fmt.Printf("mapOfSchemasOrStringArraysValue: unexpected node %+v\n", v3) + } + } + s := &SchemaOrStringArray{} + s.StringArray = &a + pair := &NamedSchemaOrStringArray{Name: k2, Value: s} + m = append(m, pair) + default: + fmt.Printf("mapOfSchemasOrStringArraysValue: unexpected node %+v\n", v2) + } + } + default: + fmt.Printf("mapOfSchemasOrStringArraysValue: unexpected node %+v\n", v) + } + return &m +} + +// Gets a schema or a boolean value from an interface{} value if possible. +func (schema *Schema) schemaOrBooleanValue(v *yaml.Node) *SchemaOrBoolean { + schemaOrBoolean := &SchemaOrBoolean{} + switch v.Kind { + case yaml.ScalarNode: + v2, _ := strconv.ParseBool(v.Value) + schemaOrBoolean.Boolean = &v2 + case yaml.MappingNode: + schemaOrBoolean.Schema = NewSchemaFromObject(v) + default: + fmt.Printf("schemaOrBooleanValue: unexpected node %+v\n", v) + } + return schemaOrBoolean +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/schema.json b/tools/vendor/github.com/google/gnostic-models/jsonschema/schema.json new file mode 100644 index 000000000..85eb502a6 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/schema.json @@ -0,0 +1,150 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "positiveInteger": { + "type": "integer", + "minimum": 0 + }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { + "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uri" + }, + "$schema": { + "type": "string", + "format": "uri" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": {}, + "multipleOf": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": {} +} diff --git a/tools/vendor/github.com/google/gnostic-models/jsonschema/writer.go b/tools/vendor/github.com/google/gnostic-models/jsonschema/writer.go new file mode 100644 index 000000000..340dc5f93 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/jsonschema/writer.go @@ -0,0 +1,369 @@ +// Copyright 2017 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 jsonschema + +import ( + "fmt" + + "gopkg.in/yaml.v3" +) + +const indentation = " " + +func renderMappingNode(node *yaml.Node, indent string) (result string) { + result = "{\n" + innerIndent := indent + indentation + for i := 0; i < len(node.Content); i += 2 { + // first print the key + key := node.Content[i].Value + result += fmt.Sprintf("%s\"%+v\": ", innerIndent, key) + // then the value + value := node.Content[i+1] + switch value.Kind { + case yaml.ScalarNode: + result += "\"" + value.Value + "\"" + case yaml.MappingNode: + result += renderMappingNode(value, innerIndent) + case yaml.SequenceNode: + result += renderSequenceNode(value, innerIndent) + default: + result += fmt.Sprintf("???MapItem(Key:%+v, Value:%T)", value, value) + } + if i < len(node.Content)-2 { + result += "," + } + result += "\n" + } + + result += indent + "}" + return result +} + +func renderSequenceNode(node *yaml.Node, indent string) (result string) { + result = "[\n" + innerIndent := indent + indentation + for i := 0; i < len(node.Content); i++ { + item := node.Content[i] + switch item.Kind { + case yaml.ScalarNode: + result += innerIndent + "\"" + item.Value + "\"" + case yaml.MappingNode: + result += innerIndent + renderMappingNode(item, innerIndent) + "" + default: + result += innerIndent + fmt.Sprintf("???ArrayItem(%+v)", item) + } + if i < len(node.Content)-1 { + result += "," + } + result += "\n" + } + result += indent + "]" + return result +} + +func renderStringArray(array []string, indent string) (result string) { + result = "[\n" + innerIndent := indent + indentation + for i, item := range array { + result += innerIndent + "\"" + item + "\"" + if i < len(array)-1 { + result += "," + } + result += "\n" + } + result += indent + "]" + return result +} + +// Render renders a yaml.Node as JSON +func Render(node *yaml.Node) string { + if node.Kind == yaml.DocumentNode { + if len(node.Content) == 1 { + return Render(node.Content[0]) + } + } else if node.Kind == yaml.MappingNode { + return renderMappingNode(node, "") + "\n" + } else if node.Kind == yaml.SequenceNode { + return renderSequenceNode(node, "") + "\n" + } + return "" +} + +func (object *SchemaNumber) nodeValue() *yaml.Node { + if object.Integer != nil { + return nodeForInt64(*object.Integer) + } else if object.Float != nil { + return nodeForFloat64(*object.Float) + } else { + return nil + } +} + +func (object *SchemaOrBoolean) nodeValue() *yaml.Node { + if object.Schema != nil { + return object.Schema.nodeValue() + } else if object.Boolean != nil { + return nodeForBoolean(*object.Boolean) + } else { + return nil + } +} + +func nodeForStringArray(array []string) *yaml.Node { + content := make([]*yaml.Node, 0) + for _, item := range array { + content = append(content, nodeForString(item)) + } + return nodeForSequence(content) +} + +func nodeForSchemaArray(array []*Schema) *yaml.Node { + content := make([]*yaml.Node, 0) + for _, item := range array { + content = append(content, item.nodeValue()) + } + return nodeForSequence(content) +} + +func (object *StringOrStringArray) nodeValue() *yaml.Node { + if object.String != nil { + return nodeForString(*object.String) + } else if object.StringArray != nil { + return nodeForStringArray(*(object.StringArray)) + } else { + return nil + } +} + +func (object *SchemaOrStringArray) nodeValue() *yaml.Node { + if object.Schema != nil { + return object.Schema.nodeValue() + } else if object.StringArray != nil { + return nodeForStringArray(*(object.StringArray)) + } else { + return nil + } +} + +func (object *SchemaOrSchemaArray) nodeValue() *yaml.Node { + if object.Schema != nil { + return object.Schema.nodeValue() + } else if object.SchemaArray != nil { + return nodeForSchemaArray(*(object.SchemaArray)) + } else { + return nil + } +} + +func (object *SchemaEnumValue) nodeValue() *yaml.Node { + if object.String != nil { + return nodeForString(*object.String) + } else if object.Bool != nil { + return nodeForBoolean(*object.Bool) + } else { + return nil + } +} + +func nodeForNamedSchemaArray(array *[]*NamedSchema) *yaml.Node { + content := make([]*yaml.Node, 0) + for _, pair := range *(array) { + content = appendPair(content, pair.Name, pair.Value.nodeValue()) + } + return nodeForMapping(content) +} + +func nodeForNamedSchemaOrStringArray(array *[]*NamedSchemaOrStringArray) *yaml.Node { + content := make([]*yaml.Node, 0) + for _, pair := range *(array) { + content = appendPair(content, pair.Name, pair.Value.nodeValue()) + } + return nodeForMapping(content) +} + +func nodeForSchemaEnumArray(array *[]SchemaEnumValue) *yaml.Node { + content := make([]*yaml.Node, 0) + for _, item := range *array { + content = append(content, item.nodeValue()) + } + return nodeForSequence(content) +} + +func nodeForMapping(content []*yaml.Node) *yaml.Node { + return &yaml.Node{ + Kind: yaml.MappingNode, + Content: content, + } +} + +func nodeForSequence(content []*yaml.Node) *yaml.Node { + return &yaml.Node{ + Kind: yaml.SequenceNode, + Content: content, + } +} + +func nodeForString(value string) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Value: value, + } +} + +func nodeForBoolean(value bool) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!bool", + Value: fmt.Sprintf("%t", value), + } +} + +func nodeForInt64(value int64) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!int", + Value: fmt.Sprintf("%d", value), + } +} + +func nodeForFloat64(value float64) *yaml.Node { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!float", + Value: fmt.Sprintf("%f", value), + } +} + +func appendPair(nodes []*yaml.Node, name string, value *yaml.Node) []*yaml.Node { + nodes = append(nodes, nodeForString(name)) + nodes = append(nodes, value) + return nodes +} + +func (schema *Schema) nodeValue() *yaml.Node { + n := &yaml.Node{Kind: yaml.MappingNode} + content := make([]*yaml.Node, 0) + if schema.Title != nil { + content = appendPair(content, "title", nodeForString(*schema.Title)) + } + if schema.ID != nil { + content = appendPair(content, "id", nodeForString(*schema.ID)) + } + if schema.Schema != nil { + content = appendPair(content, "$schema", nodeForString(*schema.Schema)) + } + if schema.Type != nil { + content = appendPair(content, "type", schema.Type.nodeValue()) + } + if schema.Items != nil { + content = appendPair(content, "items", schema.Items.nodeValue()) + } + if schema.Description != nil { + content = appendPair(content, "description", nodeForString(*schema.Description)) + } + if schema.Required != nil { + content = appendPair(content, "required", nodeForStringArray(*schema.Required)) + } + if schema.AdditionalProperties != nil { + content = appendPair(content, "additionalProperties", schema.AdditionalProperties.nodeValue()) + } + if schema.PatternProperties != nil { + content = appendPair(content, "patternProperties", nodeForNamedSchemaArray(schema.PatternProperties)) + } + if schema.Properties != nil { + content = appendPair(content, "properties", nodeForNamedSchemaArray(schema.Properties)) + } + if schema.Dependencies != nil { + content = appendPair(content, "dependencies", nodeForNamedSchemaOrStringArray(schema.Dependencies)) + } + if schema.Ref != nil { + content = appendPair(content, "$ref", nodeForString(*schema.Ref)) + } + if schema.MultipleOf != nil { + content = appendPair(content, "multipleOf", schema.MultipleOf.nodeValue()) + } + if schema.Maximum != nil { + content = appendPair(content, "maximum", schema.Maximum.nodeValue()) + } + if schema.ExclusiveMaximum != nil { + content = appendPair(content, "exclusiveMaximum", nodeForBoolean(*schema.ExclusiveMaximum)) + } + if schema.Minimum != nil { + content = appendPair(content, "minimum", schema.Minimum.nodeValue()) + } + if schema.ExclusiveMinimum != nil { + content = appendPair(content, "exclusiveMinimum", nodeForBoolean(*schema.ExclusiveMinimum)) + } + if schema.MaxLength != nil { + content = appendPair(content, "maxLength", nodeForInt64(*schema.MaxLength)) + } + if schema.MinLength != nil { + content = appendPair(content, "minLength", nodeForInt64(*schema.MinLength)) + } + if schema.Pattern != nil { + content = appendPair(content, "pattern", nodeForString(*schema.Pattern)) + } + if schema.AdditionalItems != nil { + content = appendPair(content, "additionalItems", schema.AdditionalItems.nodeValue()) + } + if schema.MaxItems != nil { + content = appendPair(content, "maxItems", nodeForInt64(*schema.MaxItems)) + } + if schema.MinItems != nil { + content = appendPair(content, "minItems", nodeForInt64(*schema.MinItems)) + } + if schema.UniqueItems != nil { + content = appendPair(content, "uniqueItems", nodeForBoolean(*schema.UniqueItems)) + } + if schema.MaxProperties != nil { + content = appendPair(content, "maxProperties", nodeForInt64(*schema.MaxProperties)) + } + if schema.MinProperties != nil { + content = appendPair(content, "minProperties", nodeForInt64(*schema.MinProperties)) + } + if schema.Enumeration != nil { + content = appendPair(content, "enum", nodeForSchemaEnumArray(schema.Enumeration)) + } + if schema.AllOf != nil { + content = appendPair(content, "allOf", nodeForSchemaArray(*schema.AllOf)) + } + if schema.AnyOf != nil { + content = appendPair(content, "anyOf", nodeForSchemaArray(*schema.AnyOf)) + } + if schema.OneOf != nil { + content = appendPair(content, "oneOf", nodeForSchemaArray(*schema.OneOf)) + } + if schema.Not != nil { + content = appendPair(content, "not", schema.Not.nodeValue()) + } + if schema.Definitions != nil { + content = appendPair(content, "definitions", nodeForNamedSchemaArray(schema.Definitions)) + } + if schema.Default != nil { + // m = append(m, yaml.MapItem{Key: "default", Value: *schema.Default}) + } + if schema.Format != nil { + content = appendPair(content, "format", nodeForString(*schema.Format)) + } + n.Content = content + return n +} + +// JSONString returns a json representation of a schema. +func (schema *Schema) JSONString() string { + node := schema.nodeValue() + return Render(node) +} diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go new file mode 100644 index 000000000..d71fe6d54 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go @@ -0,0 +1,8820 @@ +// Copyright 2020 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +package openapi_v2 + +import ( + "fmt" + "regexp" + "strings" + + "gopkg.in/yaml.v3" + + "github.com/google/gnostic-models/compiler" +) + +// Version returns the package name (and OpenAPI version). +func Version() string { + return "openapi_v2" +} + +// NewAdditionalPropertiesItem creates an object of type AdditionalPropertiesItem if possible, returning an error if not. +func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*AdditionalPropertiesItem, error) { + errors := make([]error, 0) + x := &AdditionalPropertiesItem{} + matched := false + // Schema schema = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchema(m, compiler.NewContext("schema", m, context)) + if matchingError == nil { + x.Oneof = &AdditionalPropertiesItem_Schema{Schema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // bool boolean = 2; + boolValue, ok := compiler.BoolForScalarNode(in) + if ok { + x.Oneof = &AdditionalPropertiesItem_Boolean{Boolean: boolValue} + matched = true + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAny creates an object of type Any if possible, returning an error if not. +func NewAny(in *yaml.Node, context *compiler.Context) (*Any, error) { + errors := make([]error, 0) + x := &Any{} + bytes := compiler.Marshal(in) + x.Yaml = string(bytes) + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewApiKeySecurity creates an object of type ApiKeySecurity if possible, returning an error if not. +func NewApiKeySecurity(in *yaml.Node, context *compiler.Context) (*ApiKeySecurity, error) { + errors := make([]error, 0) + x := &ApiKeySecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "in", "name", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [apiKey] + if ok && !compiler.StringArrayContainsValue([]string{"apiKey"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 2; + v2 := compiler.MapValueForKey(m, "name") + if v2 != nil { + x.Name, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 3; + v3 := compiler.MapValueForKey(m, "in") + if v3 != nil { + x.In, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [header query] + if ok && !compiler.StringArrayContainsValue([]string{"header", "query"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 5; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewBasicAuthenticationSecurity creates an object of type BasicAuthenticationSecurity if possible, returning an error if not. +func NewBasicAuthenticationSecurity(in *yaml.Node, context *compiler.Context) (*BasicAuthenticationSecurity, error) { + errors := make([]error, 0) + x := &BasicAuthenticationSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [basic] + if ok && !compiler.StringArrayContainsValue([]string{"basic"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewBodyParameter creates an object of type BodyParameter if possible, returning an error if not. +func NewBodyParameter(in *yaml.Node, context *compiler.Context) (*BodyParameter, error) { + errors := make([]error, 0) + x := &BodyParameter{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "schema"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "in", "name", "required", "schema"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 2; + v2 := compiler.MapValueForKey(m, "name") + if v2 != nil { + x.Name, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 3; + v3 := compiler.MapValueForKey(m, "in") + if v3 != nil { + x.In, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [body] + if ok && !compiler.StringArrayContainsValue([]string{"body"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 4; + v4 := compiler.MapValueForKey(m, "required") + if v4 != nil { + x.Required, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schema schema = 5; + v5 := compiler.MapValueForKey(m, "schema") + if v5 != nil { + var err error + x.Schema, err = NewSchema(v5, compiler.NewContext("schema", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewContact creates an object of type Contact if possible, returning an error if not. +func NewContact(in *yaml.Node, context *compiler.Context) (*Contact, error) { + errors := make([]error, 0) + x := &Contact{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"email", "name", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string email = 3; + v3 := compiler.MapValueForKey(m, "email") + if v3 != nil { + x.Email, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for email: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 4; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDefault creates an object of type Default if possible, returning an error if not. +func NewDefault(in *yaml.Node, context *compiler.Context) (*Default, error) { + errors := make([]error, 0) + x := &Default{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDefinitions creates an object of type Definitions if possible, returning an error if not. +func NewDefinitions(in *yaml.Node, context *compiler.Context) (*Definitions, error) { + errors := make([]error, 0) + x := &Definitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchema additional_properties = 1; + // MAP: Schema + x.AdditionalProperties = make([]*NamedSchema, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSchema{} + pair.Name = k + var err error + pair.Value, err = NewSchema(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDocument creates an object of type Document if possible, returning an error if not. +func NewDocument(in *yaml.Node, context *compiler.Context) (*Document, error) { + errors := make([]error, 0) + x := &Document{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"info", "paths", "swagger"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"basePath", "consumes", "definitions", "externalDocs", "host", "info", "parameters", "paths", "produces", "responses", "schemes", "security", "securityDefinitions", "swagger", "tags"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string swagger = 1; + v1 := compiler.MapValueForKey(m, "swagger") + if v1 != nil { + x.Swagger, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for swagger: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [2.0] + if ok && !compiler.StringArrayContainsValue([]string{"2.0"}, x.Swagger) { + message := fmt.Sprintf("has unexpected value for swagger: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Info info = 2; + v2 := compiler.MapValueForKey(m, "info") + if v2 != nil { + var err error + x.Info, err = NewInfo(v2, compiler.NewContext("info", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // string host = 3; + v3 := compiler.MapValueForKey(m, "host") + if v3 != nil { + x.Host, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for host: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string base_path = 4; + v4 := compiler.MapValueForKey(m, "basePath") + if v4 != nil { + x.BasePath, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for basePath: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string schemes = 5; + v5 := compiler.MapValueForKey(m, "schemes") + if v5 != nil { + v, ok := compiler.SequenceNodeForNode(v5) + if ok { + x.Schemes = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for schemes: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [http https ws wss] + if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { + message := fmt.Sprintf("has unexpected value for schemes: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string consumes = 6; + v6 := compiler.MapValueForKey(m, "consumes") + if v6 != nil { + v, ok := compiler.SequenceNodeForNode(v6) + if ok { + x.Consumes = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for consumes: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string produces = 7; + v7 := compiler.MapValueForKey(m, "produces") + if v7 != nil { + v, ok := compiler.SequenceNodeForNode(v7) + if ok { + x.Produces = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for produces: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Paths paths = 8; + v8 := compiler.MapValueForKey(m, "paths") + if v8 != nil { + var err error + x.Paths, err = NewPaths(v8, compiler.NewContext("paths", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // Definitions definitions = 9; + v9 := compiler.MapValueForKey(m, "definitions") + if v9 != nil { + var err error + x.Definitions, err = NewDefinitions(v9, compiler.NewContext("definitions", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // ParameterDefinitions parameters = 10; + v10 := compiler.MapValueForKey(m, "parameters") + if v10 != nil { + var err error + x.Parameters, err = NewParameterDefinitions(v10, compiler.NewContext("parameters", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // ResponseDefinitions responses = 11; + v11 := compiler.MapValueForKey(m, "responses") + if v11 != nil { + var err error + x.Responses, err = NewResponseDefinitions(v11, compiler.NewContext("responses", v11, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated SecurityRequirement security = 12; + v12 := compiler.MapValueForKey(m, "security") + if v12 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := compiler.SequenceNodeForNode(v12) + if ok { + for _, item := range a.Content { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // SecurityDefinitions security_definitions = 13; + v13 := compiler.MapValueForKey(m, "securityDefinitions") + if v13 != nil { + var err error + x.SecurityDefinitions, err = NewSecurityDefinitions(v13, compiler.NewContext("securityDefinitions", v13, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Tag tags = 14; + v14 := compiler.MapValueForKey(m, "tags") + if v14 != nil { + // repeated Tag + x.Tags = make([]*Tag, 0) + a, ok := compiler.SequenceNodeForNode(v14) + if ok { + for _, item := range a.Content { + y, err := NewTag(item, compiler.NewContext("tags", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Tags = append(x.Tags, y) + } + } + } + // ExternalDocs external_docs = 15; + v15 := compiler.MapValueForKey(m, "externalDocs") + if v15 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v15, compiler.NewContext("externalDocs", v15, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 16; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExamples creates an object of type Examples if possible, returning an error if not. +func NewExamples(in *yaml.Node, context *compiler.Context) (*Examples, error) { + errors := make([]error, 0) + x := &Examples{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExternalDocs creates an object of type ExternalDocs if possible, returning an error if not. +func NewExternalDocs(in *yaml.Node, context *compiler.Context) (*ExternalDocs, error) { + errors := make([]error, 0) + x := &ExternalDocs{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"url"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewFileSchema creates an object of type FileSchema if possible, returning an error if not. +func NewFileSchema(in *yaml.Node, context *compiler.Context) (*FileSchema, error) { + errors := make([]error, 0) + x := &FileSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"default", "description", "example", "externalDocs", "format", "readOnly", "required", "title", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string format = 1; + v1 := compiler.MapValueForKey(m, "format") + if v1 != nil { + x.Format, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 2; + v2 := compiler.MapValueForKey(m, "title") + if v2 != nil { + x.Title, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 4; + v4 := compiler.MapValueForKey(m, "default") + if v4 != nil { + var err error + x.Default, err = NewAny(v4, compiler.NewContext("default", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string required = 5; + v5 := compiler.MapValueForKey(m, "required") + if v5 != nil { + v, ok := compiler.SequenceNodeForNode(v5) + if ok { + x.Required = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [file] + if ok && !compiler.StringArrayContainsValue([]string{"file"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool read_only = 7; + v7 := compiler.MapValueForKey(m, "readOnly") + if v7 != nil { + x.ReadOnly, ok = compiler.BoolForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 8; + v8 := compiler.MapValueForKey(m, "externalDocs") + if v8 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v8, compiler.NewContext("externalDocs", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 9; + v9 := compiler.MapValueForKey(m, "example") + if v9 != nil { + var err error + x.Example, err = NewAny(v9, compiler.NewContext("example", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 10; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewFormDataParameterSubSchema creates an object of type FormDataParameterSubSchema if possible, returning an error if not. +func NewFormDataParameterSubSchema(in *yaml.Node, context *compiler.Context) (*FormDataParameterSubSchema, error) { + errors := make([]error, 0) + x := &FormDataParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = compiler.BoolForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [formData] + if ok && !compiler.StringArrayContainsValue([]string{"formData"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 5; + v5 := compiler.MapValueForKey(m, "allowEmptyValue") + if v5 != nil { + x.AllowEmptyValue, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array file] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array", "file"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 7; + v7 := compiler.MapValueForKey(m, "format") + if v7 != nil { + x.Format, ok = compiler.StringForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 8; + v8 := compiler.MapValueForKey(m, "items") + if v8 != nil { + var err error + x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 9; + v9 := compiler.MapValueForKey(m, "collectionFormat") + if v9 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes multi] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 10; + v10 := compiler.MapValueForKey(m, "default") + if v10 != nil { + var err error + x.Default, err = NewAny(v10, compiler.NewContext("default", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + v, ok := compiler.FloatForScalarNode(v11) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v12) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + v, ok := compiler.FloatForScalarNode(v13) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v14) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := compiler.IntForScalarNode(v16) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v17) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := compiler.IntForScalarNode(v19) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v20) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v20)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 21; + v21 := compiler.MapValueForKey(m, "enum") + if v21 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v21) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 22; + v22 := compiler.MapValueForKey(m, "multipleOf") + if v22 != nil { + v, ok := compiler.FloatForScalarNode(v22) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v22)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 23; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeader creates an object of type Header if possible, returning an error if not. +func NewHeader(in *yaml.Node, context *compiler.Context) (*Header, error) { + errors := make([]error, 0) + x := &Header{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number integer boolean array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 3; + v3 := compiler.MapValueForKey(m, "items") + if v3 != nil { + var err error + x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 4; + v4 := compiler.MapValueForKey(m, "collectionFormat") + if v4 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 6; + v6 := compiler.MapValueForKey(m, "maximum") + if v6 != nil { + v, ok := compiler.FloatForScalarNode(v6) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 7; + v7 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v7 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 8; + v8 := compiler.MapValueForKey(m, "minimum") + if v8 != nil { + v, ok := compiler.FloatForScalarNode(v8) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 9; + v9 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v9 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 10; + v10 := compiler.MapValueForKey(m, "maxLength") + if v10 != nil { + t, ok := compiler.IntForScalarNode(v10) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 11; + v11 := compiler.MapValueForKey(m, "minLength") + if v11 != nil { + t, ok := compiler.IntForScalarNode(v11) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 12; + v12 := compiler.MapValueForKey(m, "pattern") + if v12 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v12) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 13; + v13 := compiler.MapValueForKey(m, "maxItems") + if v13 != nil { + t, ok := compiler.IntForScalarNode(v13) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 14; + v14 := compiler.MapValueForKey(m, "minItems") + if v14 != nil { + t, ok := compiler.IntForScalarNode(v14) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 15; + v15 := compiler.MapValueForKey(m, "uniqueItems") + if v15 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v15) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 16; + v16 := compiler.MapValueForKey(m, "enum") + if v16 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v16) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 17; + v17 := compiler.MapValueForKey(m, "multipleOf") + if v17 != nil { + v, ok := compiler.FloatForScalarNode(v17) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 18; + v18 := compiler.MapValueForKey(m, "description") + if v18 != nil { + x.Description, ok = compiler.StringForScalarNode(v18) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 19; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeaderParameterSubSchema creates an object of type HeaderParameterSubSchema if possible, returning an error if not. +func NewHeaderParameterSubSchema(in *yaml.Node, context *compiler.Context) (*HeaderParameterSubSchema, error) { + errors := make([]error, 0) + x := &HeaderParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = compiler.BoolForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [header] + if ok && !compiler.StringArrayContainsValue([]string{"header"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 5; + v5 := compiler.MapValueForKey(m, "type") + if v5 != nil { + x.Type, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 6; + v6 := compiler.MapValueForKey(m, "format") + if v6 != nil { + x.Format, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 7; + v7 := compiler.MapValueForKey(m, "items") + if v7 != nil { + var err error + x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 8; + v8 := compiler.MapValueForKey(m, "collectionFormat") + if v8 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 9; + v9 := compiler.MapValueForKey(m, "default") + if v9 != nil { + var err error + x.Default, err = NewAny(v9, compiler.NewContext("default", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 10; + v10 := compiler.MapValueForKey(m, "maximum") + if v10 != nil { + v, ok := compiler.FloatForScalarNode(v10) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 11; + v11 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v11 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v11) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 12; + v12 := compiler.MapValueForKey(m, "minimum") + if v12 != nil { + v, ok := compiler.FloatForScalarNode(v12) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 13; + v13 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v13 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v13) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 14; + v14 := compiler.MapValueForKey(m, "maxLength") + if v14 != nil { + t, ok := compiler.IntForScalarNode(v14) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 15; + v15 := compiler.MapValueForKey(m, "minLength") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 16; + v16 := compiler.MapValueForKey(m, "pattern") + if v16 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v16) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 17; + v17 := compiler.MapValueForKey(m, "maxItems") + if v17 != nil { + t, ok := compiler.IntForScalarNode(v17) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 18; + v18 := compiler.MapValueForKey(m, "minItems") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 19; + v19 := compiler.MapValueForKey(m, "uniqueItems") + if v19 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v19) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v20) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 21; + v21 := compiler.MapValueForKey(m, "multipleOf") + if v21 != nil { + v, ok := compiler.FloatForScalarNode(v21) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v21)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 22; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeaders creates an object of type Headers if possible, returning an error if not. +func NewHeaders(in *yaml.Node, context *compiler.Context) (*Headers, error) { + errors := make([]error, 0) + x := &Headers{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedHeader additional_properties = 1; + // MAP: Header + x.AdditionalProperties = make([]*NamedHeader, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedHeader{} + pair.Name = k + var err error + pair.Value, err = NewHeader(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewInfo creates an object of type Info if possible, returning an error if not. +func NewInfo(in *yaml.Node, context *compiler.Context) (*Info, error) { + errors := make([]error, 0) + x := &Info{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"title", "version"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"contact", "description", "license", "termsOfService", "title", "version"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string title = 1; + v1 := compiler.MapValueForKey(m, "title") + if v1 != nil { + x.Title, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string version = 2; + v2 := compiler.MapValueForKey(m, "version") + if v2 != nil { + x.Version, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for version: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string terms_of_service = 4; + v4 := compiler.MapValueForKey(m, "termsOfService") + if v4 != nil { + x.TermsOfService, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for termsOfService: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Contact contact = 5; + v5 := compiler.MapValueForKey(m, "contact") + if v5 != nil { + var err error + x.Contact, err = NewContact(v5, compiler.NewContext("contact", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // License license = 6; + v6 := compiler.MapValueForKey(m, "license") + if v6 != nil { + var err error + x.License, err = NewLicense(v6, compiler.NewContext("license", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 7; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewItemsItem creates an object of type ItemsItem if possible, returning an error if not. +func NewItemsItem(in *yaml.Node, context *compiler.Context) (*ItemsItem, error) { + errors := make([]error, 0) + x := &ItemsItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value for item array: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.Schema = make([]*Schema, 0) + y, err := NewSchema(m, compiler.NewContext("", m, context)) + if err != nil { + return nil, err + } + x.Schema = append(x.Schema, y) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewJsonReference creates an object of type JsonReference if possible, returning an error if not. +func NewJsonReference(in *yaml.Node, context *compiler.Context) (*JsonReference, error) { + errors := make([]error, 0) + x := &JsonReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"$ref"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLicense creates an object of type License if possible, returning an error if not. +func NewLicense(in *yaml.Node, context *compiler.Context) (*License, error) { + errors := make([]error, 0) + x := &License{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"name", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedAny creates an object of type NamedAny if possible, returning an error if not. +func NewNamedAny(in *yaml.Node, context *compiler.Context) (*NamedAny, error) { + errors := make([]error, 0) + x := &NamedAny{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewAny(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedHeader creates an object of type NamedHeader if possible, returning an error if not. +func NewNamedHeader(in *yaml.Node, context *compiler.Context) (*NamedHeader, error) { + errors := make([]error, 0) + x := &NamedHeader{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Header value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewHeader(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedParameter creates an object of type NamedParameter if possible, returning an error if not. +func NewNamedParameter(in *yaml.Node, context *compiler.Context) (*NamedParameter, error) { + errors := make([]error, 0) + x := &NamedParameter{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Parameter value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewParameter(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedPathItem creates an object of type NamedPathItem if possible, returning an error if not. +func NewNamedPathItem(in *yaml.Node, context *compiler.Context) (*NamedPathItem, error) { + errors := make([]error, 0) + x := &NamedPathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PathItem value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewPathItem(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResponse creates an object of type NamedResponse if possible, returning an error if not. +func NewNamedResponse(in *yaml.Node, context *compiler.Context) (*NamedResponse, error) { + errors := make([]error, 0) + x := &NamedResponse{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Response value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResponse(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResponseValue creates an object of type NamedResponseValue if possible, returning an error if not. +func NewNamedResponseValue(in *yaml.Node, context *compiler.Context) (*NamedResponseValue, error) { + errors := make([]error, 0) + x := &NamedResponseValue{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ResponseValue value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResponseValue(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSchema creates an object of type NamedSchema if possible, returning an error if not. +func NewNamedSchema(in *yaml.Node, context *compiler.Context) (*NamedSchema, error) { + errors := make([]error, 0) + x := &NamedSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schema value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSchema(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSecurityDefinitionsItem creates an object of type NamedSecurityDefinitionsItem if possible, returning an error if not. +func NewNamedSecurityDefinitionsItem(in *yaml.Node, context *compiler.Context) (*NamedSecurityDefinitionsItem, error) { + errors := make([]error, 0) + x := &NamedSecurityDefinitionsItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SecurityDefinitionsItem value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSecurityDefinitionsItem(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedString creates an object of type NamedString if possible, returning an error if not. +func NewNamedString(in *yaml.Node, context *compiler.Context) (*NamedString, error) { + errors := make([]error, 0) + x := &NamedString{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + x.Value, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for value: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedStringArray creates an object of type NamedStringArray if possible, returning an error if not. +func NewNamedStringArray(in *yaml.Node, context *compiler.Context) (*NamedStringArray, error) { + errors := make([]error, 0) + x := &NamedStringArray{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // StringArray value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewStringArray(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNonBodyParameter creates an object of type NonBodyParameter if possible, returning an error if not. +func NewNonBodyParameter(in *yaml.Node, context *compiler.Context) (*NonBodyParameter, error) { + errors := make([]error, 0) + x := &NonBodyParameter{} + matched := false + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // HeaderParameterSubSchema header_parameter_sub_schema = 1; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewHeaderParameterSubSchema(m, compiler.NewContext("headerParameterSubSchema", m, context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_HeaderParameterSubSchema{HeaderParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // FormDataParameterSubSchema form_data_parameter_sub_schema = 2; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewFormDataParameterSubSchema(m, compiler.NewContext("formDataParameterSubSchema", m, context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_FormDataParameterSubSchema{FormDataParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // QueryParameterSubSchema query_parameter_sub_schema = 3; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewQueryParameterSubSchema(m, compiler.NewContext("queryParameterSubSchema", m, context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_QueryParameterSubSchema{QueryParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // PathParameterSubSchema path_parameter_sub_schema = 4; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewPathParameterSubSchema(m, compiler.NewContext("pathParameterSubSchema", m, context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_PathParameterSubSchema{PathParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid NonBodyParameter") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2AccessCodeSecurity creates an object of type Oauth2AccessCodeSecurity if possible, returning an error if not. +func NewOauth2AccessCodeSecurity(in *yaml.Node, context *compiler.Context) (*Oauth2AccessCodeSecurity, error) { + errors := make([]error, 0) + x := &Oauth2AccessCodeSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"authorizationUrl", "flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [accessCode] + if ok && !compiler.StringArrayContainsValue([]string{"accessCode"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string authorization_url = 4; + v4 := compiler.MapValueForKey(m, "authorizationUrl") + if v4 != nil { + x.AuthorizationUrl, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string token_url = 5; + v5 := compiler.MapValueForKey(m, "tokenUrl") + if v5 != nil { + x.TokenUrl, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 6; + v6 := compiler.MapValueForKey(m, "description") + if v6 != nil { + x.Description, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 7; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2ApplicationSecurity creates an object of type Oauth2ApplicationSecurity if possible, returning an error if not. +func NewOauth2ApplicationSecurity(in *yaml.Node, context *compiler.Context) (*Oauth2ApplicationSecurity, error) { + errors := make([]error, 0) + x := &Oauth2ApplicationSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [application] + if ok && !compiler.StringArrayContainsValue([]string{"application"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string token_url = 4; + v4 := compiler.MapValueForKey(m, "tokenUrl") + if v4 != nil { + x.TokenUrl, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2ImplicitSecurity creates an object of type Oauth2ImplicitSecurity if possible, returning an error if not. +func NewOauth2ImplicitSecurity(in *yaml.Node, context *compiler.Context) (*Oauth2ImplicitSecurity, error) { + errors := make([]error, 0) + x := &Oauth2ImplicitSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"authorizationUrl", "flow", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [implicit] + if ok && !compiler.StringArrayContainsValue([]string{"implicit"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string authorization_url = 4; + v4 := compiler.MapValueForKey(m, "authorizationUrl") + if v4 != nil { + x.AuthorizationUrl, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2PasswordSecurity creates an object of type Oauth2PasswordSecurity if possible, returning an error if not. +func NewOauth2PasswordSecurity(in *yaml.Node, context *compiler.Context) (*Oauth2PasswordSecurity, error) { + errors := make([]error, 0) + x := &Oauth2PasswordSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [password] + if ok && !compiler.StringArrayContainsValue([]string{"password"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string token_url = 4; + v4 := compiler.MapValueForKey(m, "tokenUrl") + if v4 != nil { + x.TokenUrl, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2Scopes creates an object of type Oauth2Scopes if possible, returning an error if not. +func NewOauth2Scopes(in *yaml.Node, context *compiler.Context) (*Oauth2Scopes, error) { + errors := make([]error, 0) + x := &Oauth2Scopes{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedString additional_properties = 1; + // MAP: string + x.AdditionalProperties = make([]*NamedString, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedString{} + pair.Name = k + pair.Value, _ = compiler.StringForScalarNode(v) + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOperation creates an object of type Operation if possible, returning an error if not. +func NewOperation(in *yaml.Node, context *compiler.Context) (*Operation, error) { + errors := make([]error, 0) + x := &Operation{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"responses"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"consumes", "deprecated", "description", "externalDocs", "operationId", "parameters", "produces", "responses", "schemes", "security", "summary", "tags"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated string tags = 1; + v1 := compiler.MapValueForKey(m, "tags") + if v1 != nil { + v, ok := compiler.SequenceNodeForNode(v1) + if ok { + x.Tags = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for tags: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 4; + v4 := compiler.MapValueForKey(m, "externalDocs") + if v4 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v4, compiler.NewContext("externalDocs", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // string operation_id = 5; + v5 := compiler.MapValueForKey(m, "operationId") + if v5 != nil { + x.OperationId, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string produces = 6; + v6 := compiler.MapValueForKey(m, "produces") + if v6 != nil { + v, ok := compiler.SequenceNodeForNode(v6) + if ok { + x.Produces = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for produces: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string consumes = 7; + v7 := compiler.MapValueForKey(m, "consumes") + if v7 != nil { + v, ok := compiler.SequenceNodeForNode(v7) + if ok { + x.Consumes = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for consumes: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated ParametersItem parameters = 8; + v8 := compiler.MapValueForKey(m, "parameters") + if v8 != nil { + // repeated ParametersItem + x.Parameters = make([]*ParametersItem, 0) + a, ok := compiler.SequenceNodeForNode(v8) + if ok { + for _, item := range a.Content { + y, err := NewParametersItem(item, compiler.NewContext("parameters", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // Responses responses = 9; + v9 := compiler.MapValueForKey(m, "responses") + if v9 != nil { + var err error + x.Responses, err = NewResponses(v9, compiler.NewContext("responses", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string schemes = 10; + v10 := compiler.MapValueForKey(m, "schemes") + if v10 != nil { + v, ok := compiler.SequenceNodeForNode(v10) + if ok { + x.Schemes = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for schemes: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [http https ws wss] + if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { + message := fmt.Sprintf("has unexpected value for schemes: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 11; + v11 := compiler.MapValueForKey(m, "deprecated") + if v11 != nil { + x.Deprecated, ok = compiler.BoolForScalarNode(v11) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated SecurityRequirement security = 12; + v12 := compiler.MapValueForKey(m, "security") + if v12 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := compiler.SequenceNodeForNode(v12) + if ok { + for _, item := range a.Content { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // repeated NamedAny vendor_extension = 13; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameter creates an object of type Parameter if possible, returning an error if not. +func NewParameter(in *yaml.Node, context *compiler.Context) (*Parameter, error) { + errors := make([]error, 0) + x := &Parameter{} + matched := false + // BodyParameter body_parameter = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewBodyParameter(m, compiler.NewContext("bodyParameter", m, context)) + if matchingError == nil { + x.Oneof = &Parameter_BodyParameter{BodyParameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // NonBodyParameter non_body_parameter = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewNonBodyParameter(m, compiler.NewContext("nonBodyParameter", m, context)) + if matchingError == nil { + x.Oneof = &Parameter_NonBodyParameter{NonBodyParameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid Parameter") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameterDefinitions creates an object of type ParameterDefinitions if possible, returning an error if not. +func NewParameterDefinitions(in *yaml.Node, context *compiler.Context) (*ParameterDefinitions, error) { + errors := make([]error, 0) + x := &ParameterDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedParameter additional_properties = 1; + // MAP: Parameter + x.AdditionalProperties = make([]*NamedParameter, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedParameter{} + pair.Name = k + var err error + pair.Value, err = NewParameter(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParametersItem creates an object of type ParametersItem if possible, returning an error if not. +func NewParametersItem(in *yaml.Node, context *compiler.Context) (*ParametersItem, error) { + errors := make([]error, 0) + x := &ParametersItem{} + matched := false + // Parameter parameter = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewParameter(m, compiler.NewContext("parameter", m, context)) + if matchingError == nil { + x.Oneof = &ParametersItem_Parameter{Parameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // JsonReference json_reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", m, context)) + if matchingError == nil { + x.Oneof = &ParametersItem_JsonReference{JsonReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid ParametersItem") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPathItem creates an object of type PathItem if possible, returning an error if not. +func NewPathItem(in *yaml.Node, context *compiler.Context) (*PathItem, error) { + errors := make([]error, 0) + x := &PathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"$ref", "delete", "get", "head", "options", "parameters", "patch", "post", "put"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Operation get = 2; + v2 := compiler.MapValueForKey(m, "get") + if v2 != nil { + var err error + x.Get, err = NewOperation(v2, compiler.NewContext("get", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation put = 3; + v3 := compiler.MapValueForKey(m, "put") + if v3 != nil { + var err error + x.Put, err = NewOperation(v3, compiler.NewContext("put", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation post = 4; + v4 := compiler.MapValueForKey(m, "post") + if v4 != nil { + var err error + x.Post, err = NewOperation(v4, compiler.NewContext("post", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation delete = 5; + v5 := compiler.MapValueForKey(m, "delete") + if v5 != nil { + var err error + x.Delete, err = NewOperation(v5, compiler.NewContext("delete", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation options = 6; + v6 := compiler.MapValueForKey(m, "options") + if v6 != nil { + var err error + x.Options, err = NewOperation(v6, compiler.NewContext("options", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation head = 7; + v7 := compiler.MapValueForKey(m, "head") + if v7 != nil { + var err error + x.Head, err = NewOperation(v7, compiler.NewContext("head", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation patch = 8; + v8 := compiler.MapValueForKey(m, "patch") + if v8 != nil { + var err error + x.Patch, err = NewOperation(v8, compiler.NewContext("patch", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated ParametersItem parameters = 9; + v9 := compiler.MapValueForKey(m, "parameters") + if v9 != nil { + // repeated ParametersItem + x.Parameters = make([]*ParametersItem, 0) + a, ok := compiler.SequenceNodeForNode(v9) + if ok { + for _, item := range a.Content { + y, err := NewParametersItem(item, compiler.NewContext("parameters", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // repeated NamedAny vendor_extension = 10; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPathParameterSubSchema creates an object of type PathParameterSubSchema if possible, returning an error if not. +func NewPathParameterSubSchema(in *yaml.Node, context *compiler.Context) (*PathParameterSubSchema, error) { + errors := make([]error, 0) + x := &PathParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"required"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = compiler.BoolForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [path] + if ok && !compiler.StringArrayContainsValue([]string{"path"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 5; + v5 := compiler.MapValueForKey(m, "type") + if v5 != nil { + x.Type, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 6; + v6 := compiler.MapValueForKey(m, "format") + if v6 != nil { + x.Format, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 7; + v7 := compiler.MapValueForKey(m, "items") + if v7 != nil { + var err error + x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 8; + v8 := compiler.MapValueForKey(m, "collectionFormat") + if v8 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 9; + v9 := compiler.MapValueForKey(m, "default") + if v9 != nil { + var err error + x.Default, err = NewAny(v9, compiler.NewContext("default", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 10; + v10 := compiler.MapValueForKey(m, "maximum") + if v10 != nil { + v, ok := compiler.FloatForScalarNode(v10) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 11; + v11 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v11 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v11) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 12; + v12 := compiler.MapValueForKey(m, "minimum") + if v12 != nil { + v, ok := compiler.FloatForScalarNode(v12) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 13; + v13 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v13 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v13) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 14; + v14 := compiler.MapValueForKey(m, "maxLength") + if v14 != nil { + t, ok := compiler.IntForScalarNode(v14) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 15; + v15 := compiler.MapValueForKey(m, "minLength") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 16; + v16 := compiler.MapValueForKey(m, "pattern") + if v16 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v16) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 17; + v17 := compiler.MapValueForKey(m, "maxItems") + if v17 != nil { + t, ok := compiler.IntForScalarNode(v17) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 18; + v18 := compiler.MapValueForKey(m, "minItems") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 19; + v19 := compiler.MapValueForKey(m, "uniqueItems") + if v19 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v19) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v20) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 21; + v21 := compiler.MapValueForKey(m, "multipleOf") + if v21 != nil { + v, ok := compiler.FloatForScalarNode(v21) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v21)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 22; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPaths creates an object of type Paths if possible, returning an error if not. +func NewPaths(in *yaml.Node, context *compiler.Context) (*Paths, error) { + errors := make([]error, 0) + x := &Paths{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern0, pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedAny vendor_extension = 1; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + // repeated NamedPathItem path = 2; + // MAP: PathItem ^/ + x.Path = make([]*NamedPathItem, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "/") { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.Path = append(x.Path, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPrimitivesItems creates an object of type PrimitivesItems if possible, returning an error if not. +func NewPrimitivesItems(in *yaml.Node, context *compiler.Context) (*PrimitivesItems, error) { + errors := make([]error, 0) + x := &PrimitivesItems{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"collectionFormat", "default", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number integer boolean array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 3; + v3 := compiler.MapValueForKey(m, "items") + if v3 != nil { + var err error + x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 4; + v4 := compiler.MapValueForKey(m, "collectionFormat") + if v4 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 6; + v6 := compiler.MapValueForKey(m, "maximum") + if v6 != nil { + v, ok := compiler.FloatForScalarNode(v6) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 7; + v7 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v7 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 8; + v8 := compiler.MapValueForKey(m, "minimum") + if v8 != nil { + v, ok := compiler.FloatForScalarNode(v8) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 9; + v9 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v9 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 10; + v10 := compiler.MapValueForKey(m, "maxLength") + if v10 != nil { + t, ok := compiler.IntForScalarNode(v10) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 11; + v11 := compiler.MapValueForKey(m, "minLength") + if v11 != nil { + t, ok := compiler.IntForScalarNode(v11) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 12; + v12 := compiler.MapValueForKey(m, "pattern") + if v12 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v12) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 13; + v13 := compiler.MapValueForKey(m, "maxItems") + if v13 != nil { + t, ok := compiler.IntForScalarNode(v13) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 14; + v14 := compiler.MapValueForKey(m, "minItems") + if v14 != nil { + t, ok := compiler.IntForScalarNode(v14) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 15; + v15 := compiler.MapValueForKey(m, "uniqueItems") + if v15 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v15) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 16; + v16 := compiler.MapValueForKey(m, "enum") + if v16 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v16) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 17; + v17 := compiler.MapValueForKey(m, "multipleOf") + if v17 != nil { + v, ok := compiler.FloatForScalarNode(v17) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 18; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewProperties creates an object of type Properties if possible, returning an error if not. +func NewProperties(in *yaml.Node, context *compiler.Context) (*Properties, error) { + errors := make([]error, 0) + x := &Properties{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchema additional_properties = 1; + // MAP: Schema + x.AdditionalProperties = make([]*NamedSchema, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSchema{} + pair.Name = k + var err error + pair.Value, err = NewSchema(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewQueryParameterSubSchema creates an object of type QueryParameterSubSchema if possible, returning an error if not. +func NewQueryParameterSubSchema(in *yaml.Node, context *compiler.Context) (*QueryParameterSubSchema, error) { + errors := make([]error, 0) + x := &QueryParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = compiler.BoolForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [query] + if ok && !compiler.StringArrayContainsValue([]string{"query"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 5; + v5 := compiler.MapValueForKey(m, "allowEmptyValue") + if v5 != nil { + x.AllowEmptyValue, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 7; + v7 := compiler.MapValueForKey(m, "format") + if v7 != nil { + x.Format, ok = compiler.StringForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 8; + v8 := compiler.MapValueForKey(m, "items") + if v8 != nil { + var err error + x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 9; + v9 := compiler.MapValueForKey(m, "collectionFormat") + if v9 != nil { + x.CollectionFormat, ok = compiler.StringForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes multi] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 10; + v10 := compiler.MapValueForKey(m, "default") + if v10 != nil { + var err error + x.Default, err = NewAny(v10, compiler.NewContext("default", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + v, ok := compiler.FloatForScalarNode(v11) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v12) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + v, ok := compiler.FloatForScalarNode(v13) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v14) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := compiler.IntForScalarNode(v16) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v17) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := compiler.IntForScalarNode(v19) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v20) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v20)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 21; + v21 := compiler.MapValueForKey(m, "enum") + if v21 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v21) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 22; + v22 := compiler.MapValueForKey(m, "multipleOf") + if v22 != nil { + v, ok := compiler.FloatForScalarNode(v22) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v22)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 23; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponse creates an object of type Response if possible, returning an error if not. +func NewResponse(in *yaml.Node, context *compiler.Context) (*Response, error) { + errors := make([]error, 0) + x := &Response{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"description"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "examples", "headers", "schema"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SchemaItem schema = 2; + v2 := compiler.MapValueForKey(m, "schema") + if v2 != nil { + var err error + x.Schema, err = NewSchemaItem(v2, compiler.NewContext("schema", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // Headers headers = 3; + v3 := compiler.MapValueForKey(m, "headers") + if v3 != nil { + var err error + x.Headers, err = NewHeaders(v3, compiler.NewContext("headers", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // Examples examples = 4; + v4 := compiler.MapValueForKey(m, "examples") + if v4 != nil { + var err error + x.Examples, err = NewExamples(v4, compiler.NewContext("examples", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 5; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponseDefinitions creates an object of type ResponseDefinitions if possible, returning an error if not. +func NewResponseDefinitions(in *yaml.Node, context *compiler.Context) (*ResponseDefinitions, error) { + errors := make([]error, 0) + x := &ResponseDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedResponse additional_properties = 1; + // MAP: Response + x.AdditionalProperties = make([]*NamedResponse, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedResponse{} + pair.Name = k + var err error + pair.Value, err = NewResponse(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponseValue creates an object of type ResponseValue if possible, returning an error if not. +func NewResponseValue(in *yaml.Node, context *compiler.Context) (*ResponseValue, error) { + errors := make([]error, 0) + x := &ResponseValue{} + matched := false + // Response response = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewResponse(m, compiler.NewContext("response", m, context)) + if matchingError == nil { + x.Oneof = &ResponseValue_Response{Response: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // JsonReference json_reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", m, context)) + if matchingError == nil { + x.Oneof = &ResponseValue_JsonReference{JsonReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid ResponseValue") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponses creates an object of type Responses if possible, returning an error if not. +func NewResponses(in *yaml.Node, context *compiler.Context) (*Responses, error) { + errors := make([]error, 0) + x := &Responses{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern2, pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedResponseValue response_code = 1; + // MAP: ResponseValue ^([0-9]{3})$|^(default)$ + x.ResponseCode = make([]*NamedResponseValue, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if pattern2.MatchString(k) { + pair := &NamedResponseValue{} + pair.Name = k + var err error + pair.Value, err = NewResponseValue(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.ResponseCode = append(x.ResponseCode, pair) + } + } + } + // repeated NamedAny vendor_extension = 2; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchema creates an object of type Schema if possible, returning an error if not. +func NewSchema(in *yaml.Node, context *compiler.Context) (*Schema, error) { + errors := make([]error, 0) + x := &Schema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"$ref", "additionalProperties", "allOf", "default", "description", "discriminator", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "externalDocs", "format", "items", "maxItems", "maxLength", "maxProperties", "maximum", "minItems", "minLength", "minProperties", "minimum", "multipleOf", "pattern", "properties", "readOnly", "required", "title", "type", "uniqueItems", "xml"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 3; + v3 := compiler.MapValueForKey(m, "title") + if v3 != nil { + x.Title, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // float multiple_of = 6; + v6 := compiler.MapValueForKey(m, "multipleOf") + if v6 != nil { + v, ok := compiler.FloatForScalarNode(v6) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float maximum = 7; + v7 := compiler.MapValueForKey(m, "maximum") + if v7 != nil { + v, ok := compiler.FloatForScalarNode(v7) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 8; + v8 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v8 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 9; + v9 := compiler.MapValueForKey(m, "minimum") + if v9 != nil { + v, ok := compiler.FloatForScalarNode(v9) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 10; + v10 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v10 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v10) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 11; + v11 := compiler.MapValueForKey(m, "maxLength") + if v11 != nil { + t, ok := compiler.IntForScalarNode(v11) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 12; + v12 := compiler.MapValueForKey(m, "minLength") + if v12 != nil { + t, ok := compiler.IntForScalarNode(v12) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 13; + v13 := compiler.MapValueForKey(m, "pattern") + if v13 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v13) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 14; + v14 := compiler.MapValueForKey(m, "maxItems") + if v14 != nil { + t, ok := compiler.IntForScalarNode(v14) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 15; + v15 := compiler.MapValueForKey(m, "minItems") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 16; + v16 := compiler.MapValueForKey(m, "uniqueItems") + if v16 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v16) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_properties = 17; + v17 := compiler.MapValueForKey(m, "maxProperties") + if v17 != nil { + t, ok := compiler.IntForScalarNode(v17) + if ok { + x.MaxProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxProperties: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_properties = 18; + v18 := compiler.MapValueForKey(m, "minProperties") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MinProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minProperties: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string required = 19; + v19 := compiler.MapValueForKey(m, "required") + if v19 != nil { + v, ok := compiler.SequenceNodeForNode(v19) + if ok { + x.Required = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v20) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // AdditionalPropertiesItem additional_properties = 21; + v21 := compiler.MapValueForKey(m, "additionalProperties") + if v21 != nil { + var err error + x.AdditionalProperties, err = NewAdditionalPropertiesItem(v21, compiler.NewContext("additionalProperties", v21, context)) + if err != nil { + errors = append(errors, err) + } + } + // TypeItem type = 22; + v22 := compiler.MapValueForKey(m, "type") + if v22 != nil { + var err error + x.Type, err = NewTypeItem(v22, compiler.NewContext("type", v22, context)) + if err != nil { + errors = append(errors, err) + } + } + // ItemsItem items = 23; + v23 := compiler.MapValueForKey(m, "items") + if v23 != nil { + var err error + x.Items, err = NewItemsItem(v23, compiler.NewContext("items", v23, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Schema all_of = 24; + v24 := compiler.MapValueForKey(m, "allOf") + if v24 != nil { + // repeated Schema + x.AllOf = make([]*Schema, 0) + a, ok := compiler.SequenceNodeForNode(v24) + if ok { + for _, item := range a.Content { + y, err := NewSchema(item, compiler.NewContext("allOf", item, context)) + if err != nil { + errors = append(errors, err) + } + x.AllOf = append(x.AllOf, y) + } + } + } + // Properties properties = 25; + v25 := compiler.MapValueForKey(m, "properties") + if v25 != nil { + var err error + x.Properties, err = NewProperties(v25, compiler.NewContext("properties", v25, context)) + if err != nil { + errors = append(errors, err) + } + } + // string discriminator = 26; + v26 := compiler.MapValueForKey(m, "discriminator") + if v26 != nil { + x.Discriminator, ok = compiler.StringForScalarNode(v26) + if !ok { + message := fmt.Sprintf("has unexpected value for discriminator: %s", compiler.Display(v26)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool read_only = 27; + v27 := compiler.MapValueForKey(m, "readOnly") + if v27 != nil { + x.ReadOnly, ok = compiler.BoolForScalarNode(v27) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %s", compiler.Display(v27)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Xml xml = 28; + v28 := compiler.MapValueForKey(m, "xml") + if v28 != nil { + var err error + x.Xml, err = NewXml(v28, compiler.NewContext("xml", v28, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExternalDocs external_docs = 29; + v29 := compiler.MapValueForKey(m, "externalDocs") + if v29 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v29, compiler.NewContext("externalDocs", v29, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 30; + v30 := compiler.MapValueForKey(m, "example") + if v30 != nil { + var err error + x.Example, err = NewAny(v30, compiler.NewContext("example", v30, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 31; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemaItem creates an object of type SchemaItem if possible, returning an error if not. +func NewSchemaItem(in *yaml.Node, context *compiler.Context) (*SchemaItem, error) { + errors := make([]error, 0) + x := &SchemaItem{} + matched := false + // Schema schema = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchema(m, compiler.NewContext("schema", m, context)) + if matchingError == nil { + x.Oneof = &SchemaItem_Schema{Schema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // FileSchema file_schema = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewFileSchema(m, compiler.NewContext("fileSchema", m, context)) + if matchingError == nil { + x.Oneof = &SchemaItem_FileSchema{FileSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid SchemaItem") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityDefinitions creates an object of type SecurityDefinitions if possible, returning an error if not. +func NewSecurityDefinitions(in *yaml.Node, context *compiler.Context) (*SecurityDefinitions, error) { + errors := make([]error, 0) + x := &SecurityDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSecurityDefinitionsItem additional_properties = 1; + // MAP: SecurityDefinitionsItem + x.AdditionalProperties = make([]*NamedSecurityDefinitionsItem, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSecurityDefinitionsItem{} + pair.Name = k + var err error + pair.Value, err = NewSecurityDefinitionsItem(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityDefinitionsItem creates an object of type SecurityDefinitionsItem if possible, returning an error if not. +func NewSecurityDefinitionsItem(in *yaml.Node, context *compiler.Context) (*SecurityDefinitionsItem, error) { + errors := make([]error, 0) + x := &SecurityDefinitionsItem{} + matched := false + // BasicAuthenticationSecurity basic_authentication_security = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewBasicAuthenticationSecurity(m, compiler.NewContext("basicAuthenticationSecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{BasicAuthenticationSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // ApiKeySecurity api_key_security = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewApiKeySecurity(m, compiler.NewContext("apiKeySecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{ApiKeySecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2ImplicitSecurity oauth2_implicit_security = 3; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2ImplicitSecurity(m, compiler.NewContext("oauth2ImplicitSecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{Oauth2ImplicitSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2PasswordSecurity oauth2_password_security = 4; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2PasswordSecurity(m, compiler.NewContext("oauth2PasswordSecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{Oauth2PasswordSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2ApplicationSecurity oauth2_application_security = 5; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2ApplicationSecurity(m, compiler.NewContext("oauth2ApplicationSecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{Oauth2ApplicationSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2AccessCodeSecurity oauth2_access_code_security = 6; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2AccessCodeSecurity(m, compiler.NewContext("oauth2AccessCodeSecurity", m, context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{Oauth2AccessCodeSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid SecurityDefinitionsItem") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityRequirement creates an object of type SecurityRequirement if possible, returning an error if not. +func NewSecurityRequirement(in *yaml.Node, context *compiler.Context) (*SecurityRequirement, error) { + errors := make([]error, 0) + x := &SecurityRequirement{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedStringArray additional_properties = 1; + // MAP: StringArray + x.AdditionalProperties = make([]*NamedStringArray, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedStringArray{} + pair.Name = k + var err error + pair.Value, err = NewStringArray(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStringArray creates an object of type StringArray if possible, returning an error if not. +func NewStringArray(in *yaml.Node, context *compiler.Context) (*StringArray, error) { + errors := make([]error, 0) + x := &StringArray{} + x.Value = make([]string, 0) + for _, node := range in.Content { + s, _ := compiler.StringForScalarNode(node) + x.Value = append(x.Value, s) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewTag creates an object of type Tag if possible, returning an error if not. +func NewTag(in *yaml.Node, context *compiler.Context) (*Tag, error) { + errors := make([]error, 0) + x := &Tag{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "externalDocs", "name"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 3; + v3 := compiler.MapValueForKey(m, "externalDocs") + if v3 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v3, compiler.NewContext("externalDocs", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 4; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewTypeItem creates an object of type TypeItem if possible, returning an error if not. +func NewTypeItem(in *yaml.Node, context *compiler.Context) (*TypeItem, error) { + errors := make([]error, 0) + x := &TypeItem{} + v1 := in + switch v1.Kind { + case yaml.ScalarNode: + x.Value = make([]string, 0) + x.Value = append(x.Value, v1.Value) + case yaml.SequenceNode: + x.Value = make([]string, 0) + for _, v := range v1.Content { + value := v.Value + ok := v.Kind == yaml.ScalarNode + if ok { + x.Value = append(x.Value, value) + } else { + message := fmt.Sprintf("has unexpected value for string array element: %+v (%T)", value, value) + errors = append(errors, compiler.NewError(context, message)) + } + } + default: + message := fmt.Sprintf("has unexpected value for string array: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewVendorExtension creates an object of type VendorExtension if possible, returning an error if not. +func NewVendorExtension(in *yaml.Node, context *compiler.Context) (*VendorExtension, error) { + errors := make([]error, 0) + x := &VendorExtension{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewXml creates an object of type Xml if possible, returning an error if not. +func NewXml(in *yaml.Node, context *compiler.Context) (*Xml, error) { + errors := make([]error, 0) + x := &Xml{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"attribute", "name", "namespace", "prefix", "wrapped"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string namespace = 2; + v2 := compiler.MapValueForKey(m, "namespace") + if v2 != nil { + x.Namespace, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for namespace: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string prefix = 3; + v3 := compiler.MapValueForKey(m, "prefix") + if v3 != nil { + x.Prefix, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for prefix: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool attribute = 4; + v4 := compiler.MapValueForKey(m, "attribute") + if v4 != nil { + x.Attribute, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for attribute: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool wrapped = 5; + v5 := compiler.MapValueForKey(m, "wrapped") + if v5 != nil { + x.Wrapped, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for wrapped: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside AdditionalPropertiesItem objects. +func (m *AdditionalPropertiesItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*AdditionalPropertiesItem_Schema) + if ok { + _, err := p.Schema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Any objects. +func (m *Any) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ApiKeySecurity objects. +func (m *ApiKeySecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside BasicAuthenticationSecurity objects. +func (m *BasicAuthenticationSecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside BodyParameter objects. +func (m *BodyParameter) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Contact objects. +func (m *Contact) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Default objects. +func (m *Default) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Definitions objects. +func (m *Definitions) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Document objects. +func (m *Document) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Info != nil { + _, err := m.Info.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Paths != nil { + _, err := m.Paths.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Definitions != nil { + _, err := m.Definitions.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Parameters != nil { + _, err := m.Parameters.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.SecurityDefinitions != nil { + _, err := m.SecurityDefinitions.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Tags { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Examples objects. +func (m *Examples) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ExternalDocs objects. +func (m *ExternalDocs) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside FileSchema objects. +func (m *FileSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside FormDataParameterSubSchema objects. +func (m *FormDataParameterSubSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Header objects. +func (m *Header) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside HeaderParameterSubSchema objects. +func (m *HeaderParameterSubSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Headers objects. +func (m *Headers) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Info objects. +func (m *Info) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Contact != nil { + _, err := m.Contact.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.License != nil { + _, err := m.License.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ItemsItem objects. +func (m *ItemsItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.Schema { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside JsonReference objects. +func (m *JsonReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewJsonReference(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside License objects. +func (m *License) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedAny objects. +func (m *NamedAny) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedHeader objects. +func (m *NamedHeader) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedParameter objects. +func (m *NamedParameter) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedPathItem objects. +func (m *NamedPathItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedResponse objects. +func (m *NamedResponse) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedResponseValue objects. +func (m *NamedResponseValue) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSchema objects. +func (m *NamedSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSecurityDefinitionsItem objects. +func (m *NamedSecurityDefinitionsItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedString objects. +func (m *NamedString) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedStringArray objects. +func (m *NamedStringArray) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NonBodyParameter objects. +func (m *NonBodyParameter) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*NonBodyParameter_HeaderParameterSubSchema) + if ok { + _, err := p.HeaderParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_FormDataParameterSubSchema) + if ok { + _, err := p.FormDataParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_QueryParameterSubSchema) + if ok { + _, err := p.QueryParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_PathParameterSubSchema) + if ok { + _, err := p.PathParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2AccessCodeSecurity objects. +func (m *Oauth2AccessCodeSecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2ApplicationSecurity objects. +func (m *Oauth2ApplicationSecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2ImplicitSecurity objects. +func (m *Oauth2ImplicitSecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2PasswordSecurity objects. +func (m *Oauth2PasswordSecurity) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2Scopes objects. +func (m *Oauth2Scopes) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Operation objects. +func (m *Operation) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Parameter objects. +func (m *Parameter) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*Parameter_BodyParameter) + if ok { + _, err := p.BodyParameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*Parameter_NonBodyParameter) + if ok { + _, err := p.NonBodyParameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParameterDefinitions objects. +func (m *ParameterDefinitions) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParametersItem objects. +func (m *ParametersItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ParametersItem_Parameter) + if ok { + _, err := p.Parameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ParametersItem_JsonReference) + if ok { + info, err := p.JsonReference.ResolveReferences(root) + if err != nil { + return nil, err + } else if info != nil { + n, err := NewParametersItem(info, nil) + if err != nil { + return nil, err + } else if n != nil { + *m = *n + return nil, nil + } + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PathItem objects. +func (m *PathItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewPathItem(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Get != nil { + _, err := m.Get.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Put != nil { + _, err := m.Put.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Post != nil { + _, err := m.Post.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Delete != nil { + _, err := m.Delete.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Options != nil { + _, err := m.Options.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Head != nil { + _, err := m.Head.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Patch != nil { + _, err := m.Patch.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PathParameterSubSchema objects. +func (m *PathParameterSubSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Paths objects. +func (m *Paths) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.Path { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PrimitivesItems objects. +func (m *PrimitivesItems) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Properties objects. +func (m *Properties) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside QueryParameterSubSchema objects. +func (m *QueryParameterSubSchema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Response objects. +func (m *Response) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Headers != nil { + _, err := m.Headers.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponseDefinitions objects. +func (m *ResponseDefinitions) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponseValue objects. +func (m *ResponseValue) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ResponseValue_Response) + if ok { + _, err := p.Response.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ResponseValue_JsonReference) + if ok { + info, err := p.JsonReference.ResolveReferences(root) + if err != nil { + return nil, err + } else if info != nil { + n, err := NewResponseValue(info, nil) + if err != nil { + return nil, err + } else if n != nil { + *m = *n + return nil, nil + } + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Responses objects. +func (m *Responses) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.ResponseCode { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Schema objects. +func (m *Schema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewSchema(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.AdditionalProperties != nil { + _, err := m.AdditionalProperties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Type != nil { + _, err := m.Type.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.AllOf { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Properties != nil { + _, err := m.Properties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Xml != nil { + _, err := m.Xml.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SchemaItem objects. +func (m *SchemaItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SchemaItem_Schema) + if ok { + _, err := p.Schema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SchemaItem_FileSchema) + if ok { + _, err := p.FileSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityDefinitions objects. +func (m *SecurityDefinitions) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityDefinitionsItem objects. +func (m *SecurityDefinitionsItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_BasicAuthenticationSecurity) + if ok { + _, err := p.BasicAuthenticationSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_ApiKeySecurity) + if ok { + _, err := p.ApiKeySecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ImplicitSecurity) + if ok { + _, err := p.Oauth2ImplicitSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2PasswordSecurity) + if ok { + _, err := p.Oauth2PasswordSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ApplicationSecurity) + if ok { + _, err := p.Oauth2ApplicationSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) + if ok { + _, err := p.Oauth2AccessCodeSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityRequirement objects. +func (m *SecurityRequirement) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside StringArray objects. +func (m *StringArray) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Tag objects. +func (m *Tag) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside TypeItem objects. +func (m *TypeItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside VendorExtension objects. +func (m *VendorExtension) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Xml objects. +func (m *Xml) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ToRawInfo returns a description of AdditionalPropertiesItem suitable for JSON or YAML export. +func (m *AdditionalPropertiesItem) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // AdditionalPropertiesItem + // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return compiler.NewScalarNodeForBool(v1.Boolean) + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Any suitable for JSON or YAML export. +func (m *Any) ToRawInfo() *yaml.Node { + var err error + var node yaml.Node + err = yaml.Unmarshal([]byte(m.Yaml), &node) + if err == nil { + if node.Kind == yaml.DocumentNode { + return node.Content[0] + } + return &node + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of ApiKeySecurity suitable for JSON or YAML export. +func (m *ApiKeySecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of BasicAuthenticationSecurity suitable for JSON or YAML export. +func (m *BasicAuthenticationSecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of BodyParameter suitable for JSON or YAML export. +func (m *BodyParameter) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, m.Schema.ToRawInfo()) + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Contact suitable for JSON or YAML export. +func (m *Contact) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Url != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + } + if m.Email != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("email")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Email)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Default suitable for JSON or YAML export. +func (m *Default) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Definitions suitable for JSON or YAML export. +func (m *Definitions) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Document suitable for JSON or YAML export. +func (m *Document) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("swagger")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Swagger)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("info")) + info.Content = append(info.Content, m.Info.ToRawInfo()) + if m.Host != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("host")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Host)) + } + if m.BasePath != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("basePath")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.BasePath)) + } + if len(m.Schemes) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schemes")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Schemes)) + } + if len(m.Consumes) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("consumes")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Consumes)) + } + if len(m.Produces) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("produces")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Produces)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("paths")) + info.Content = append(info.Content, m.Paths.ToRawInfo()) + if m.Definitions != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("definitions")) + info.Content = append(info.Content, m.Definitions.ToRawInfo()) + } + if m.Parameters != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, m.Parameters.ToRawInfo()) + } + if m.Responses != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("responses")) + info.Content = append(info.Content, m.Responses.ToRawInfo()) + } + if len(m.Security) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Security { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("security")) + info.Content = append(info.Content, items) + } + if m.SecurityDefinitions != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("securityDefinitions")) + info.Content = append(info.Content, m.SecurityDefinitions.ToRawInfo()) + } + if len(m.Tags) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Tags { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("tags")) + info.Content = append(info.Content, items) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Examples suitable for JSON or YAML export. +func (m *Examples) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ExternalDocs suitable for JSON or YAML export. +func (m *ExternalDocs) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of FileSchema suitable for JSON or YAML export. +func (m *FileSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Title != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("title")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Title)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if len(m.Required) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Required)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + if m.ReadOnly != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of FormDataParameterSubSchema suitable for JSON or YAML export. +func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.In != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.AllowEmptyValue != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Header suitable for JSON or YAML export. +func (m *Header) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of HeaderParameterSubSchema suitable for JSON or YAML export. +func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.In != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Headers suitable for JSON or YAML export. +func (m *Headers) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Info suitable for JSON or YAML export. +func (m *Info) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("title")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Title)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("version")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Version)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.TermsOfService != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("termsOfService")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TermsOfService)) + } + if m.Contact != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("contact")) + info.Content = append(info.Content, m.Contact.ToRawInfo()) + } + if m.License != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("license")) + info.Content = append(info.Content, m.License.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ItemsItem suitable for JSON or YAML export. +func (m *ItemsItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.Schema) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Schema { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, items) + } + return info +} + +// ToRawInfo returns a description of JsonReference suitable for JSON or YAML export. +func (m *JsonReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("$ref")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.XRef)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + return info +} + +// ToRawInfo returns a description of License suitable for JSON or YAML export. +func (m *License) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + if m.Url != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of NamedAny suitable for JSON or YAML export. +func (m *NamedAny) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Value != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, m.Value.ToRawInfo()) + } + return info +} + +// ToRawInfo returns a description of NamedHeader suitable for JSON or YAML export. +func (m *NamedHeader) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:Header StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedParameter suitable for JSON or YAML export. +func (m *NamedParameter) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedPathItem suitable for JSON or YAML export. +func (m *NamedPathItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:PathItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResponse suitable for JSON or YAML export. +func (m *NamedResponse) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResponseValue suitable for JSON or YAML export. +func (m *NamedResponseValue) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:ResponseValue StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSchema suitable for JSON or YAML export. +func (m *NamedSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSecurityDefinitionsItem suitable for JSON or YAML export. +func (m *NamedSecurityDefinitionsItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:SecurityDefinitionsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedString suitable for JSON or YAML export. +func (m *NamedString) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Value != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Value)) + } + return info +} + +// ToRawInfo returns a description of NamedStringArray suitable for JSON or YAML export. +func (m *NamedStringArray) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:StringArray StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NonBodyParameter suitable for JSON or YAML export. +func (m *NonBodyParameter) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // NonBodyParameter + // {Name:headerParameterSubSchema Type:HeaderParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetHeaderParameterSubSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:formDataParameterSubSchema Type:FormDataParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetFormDataParameterSubSchema() + if v1 != nil { + return v1.ToRawInfo() + } + // {Name:queryParameterSubSchema Type:QueryParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v2 := m.GetQueryParameterSubSchema() + if v2 != nil { + return v2.ToRawInfo() + } + // {Name:pathParameterSubSchema Type:PathParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v3 := m.GetPathParameterSubSchema() + if v3 != nil { + return v3.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Oauth2AccessCodeSecurity suitable for JSON or YAML export. +func (m *Oauth2AccessCodeSecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("flow")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Flow)) + if m.Scopes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scopes")) + info.Content = append(info.Content, m.Scopes.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("authorizationUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.AuthorizationUrl)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("tokenUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TokenUrl)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Oauth2ApplicationSecurity suitable for JSON or YAML export. +func (m *Oauth2ApplicationSecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("flow")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Flow)) + if m.Scopes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scopes")) + info.Content = append(info.Content, m.Scopes.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("tokenUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TokenUrl)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Oauth2ImplicitSecurity suitable for JSON or YAML export. +func (m *Oauth2ImplicitSecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("flow")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Flow)) + if m.Scopes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scopes")) + info.Content = append(info.Content, m.Scopes.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("authorizationUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.AuthorizationUrl)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Oauth2PasswordSecurity suitable for JSON or YAML export. +func (m *Oauth2PasswordSecurity) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("flow")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Flow)) + if m.Scopes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scopes")) + info.Content = append(info.Content, m.Scopes.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("tokenUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TokenUrl)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Oauth2Scopes suitable for JSON or YAML export. +func (m *Oauth2Scopes) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Operation suitable for JSON or YAML export. +func (m *Operation) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.Tags) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("tags")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Tags)) + } + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.OperationId != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("operationId")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.OperationId)) + } + if len(m.Produces) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("produces")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Produces)) + } + if len(m.Consumes) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("consumes")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Consumes)) + } + if len(m.Parameters) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Parameters { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, items) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("responses")) + info.Content = append(info.Content, m.Responses.ToRawInfo()) + if len(m.Schemes) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schemes")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Schemes)) + } + if m.Deprecated != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) + } + if len(m.Security) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Security { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("security")) + info.Content = append(info.Content, items) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. +func (m *Parameter) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // Parameter + // {Name:bodyParameter Type:BodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetBodyParameter() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:nonBodyParameter Type:NonBodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetNonBodyParameter() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of ParameterDefinitions suitable for JSON or YAML export. +func (m *ParameterDefinitions) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ParametersItem suitable for JSON or YAML export. +func (m *ParametersItem) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // ParametersItem + // {Name:parameter Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetParameter() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetJsonReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of PathItem suitable for JSON or YAML export. +func (m *PathItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.XRef != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("$ref")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.XRef)) + } + if m.Get != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("get")) + info.Content = append(info.Content, m.Get.ToRawInfo()) + } + if m.Put != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("put")) + info.Content = append(info.Content, m.Put.ToRawInfo()) + } + if m.Post != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("post")) + info.Content = append(info.Content, m.Post.ToRawInfo()) + } + if m.Delete != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("delete")) + info.Content = append(info.Content, m.Delete.ToRawInfo()) + } + if m.Options != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("options")) + info.Content = append(info.Content, m.Options.ToRawInfo()) + } + if m.Head != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("head")) + info.Content = append(info.Content, m.Head.ToRawInfo()) + } + if m.Patch != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("patch")) + info.Content = append(info.Content, m.Patch.ToRawInfo()) + } + if len(m.Parameters) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Parameters { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, items) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of PathParameterSubSchema suitable for JSON or YAML export. +func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + if m.In != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Paths suitable for JSON or YAML export. +func (m *Paths) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + if m.Path != nil { + for _, item := range m.Path { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of PrimitivesItems suitable for JSON or YAML export. +func (m *PrimitivesItems) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Properties suitable for JSON or YAML export. +func (m *Properties) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of QueryParameterSubSchema suitable for JSON or YAML export. +func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.In != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.AllowEmptyValue != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Items != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, m.Items.ToRawInfo()) + } + if m.CollectionFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("collectionFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.CollectionFormat)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Response suitable for JSON or YAML export. +func (m *Response) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + if m.Schema != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, m.Schema.ToRawInfo()) + } + if m.Headers != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("headers")) + info.Content = append(info.Content, m.Headers.ToRawInfo()) + } + if m.Examples != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("examples")) + info.Content = append(info.Content, m.Examples.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ResponseDefinitions suitable for JSON or YAML export. +func (m *ResponseDefinitions) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ResponseValue suitable for JSON or YAML export. +func (m *ResponseValue) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // ResponseValue + // {Name:response Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetResponse() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetJsonReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Responses suitable for JSON or YAML export. +func (m *Responses) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.ResponseCode != nil { + for _, item := range m.ResponseCode { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Schema suitable for JSON or YAML export. +func (m *Schema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.XRef != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("$ref")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.XRef)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.Title != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("title")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Title)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if m.MaxProperties != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxProperties")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxProperties)) + } + if m.MinProperties != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minProperties")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinProperties)) + } + if len(m.Required) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Required)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.AdditionalProperties != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("additionalProperties")) + info.Content = append(info.Content, m.AdditionalProperties.ToRawInfo()) + } + if m.Type != nil { + if len(m.Type.Value) == 1 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type.Value[0])) + } else { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Type.Value)) + } + } + if m.Items != nil { + items := compiler.NewSequenceNode() + for _, item := range m.Items.Schema { + items.Content = append(items.Content, item.ToRawInfo()) + } + if len(items.Content) == 1 { + items = items.Content[0] + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, items) + } + if len(m.AllOf) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.AllOf { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("allOf")) + info.Content = append(info.Content, items) + } + if m.Properties != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("properties")) + info.Content = append(info.Content, m.Properties.ToRawInfo()) + } + if m.Discriminator != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("discriminator")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Discriminator)) + } + if m.ReadOnly != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) + } + if m.Xml != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("xml")) + info.Content = append(info.Content, m.Xml.ToRawInfo()) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SchemaItem suitable for JSON or YAML export. +func (m *SchemaItem) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // SchemaItem + // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:fileSchema Type:FileSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetFileSchema() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of SecurityDefinitions suitable for JSON or YAML export. +func (m *SecurityDefinitions) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SecurityDefinitionsItem suitable for JSON or YAML export. +func (m *SecurityDefinitionsItem) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // SecurityDefinitionsItem + // {Name:basicAuthenticationSecurity Type:BasicAuthenticationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetBasicAuthenticationSecurity() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:apiKeySecurity Type:ApiKeySecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetApiKeySecurity() + if v1 != nil { + return v1.ToRawInfo() + } + // {Name:oauth2ImplicitSecurity Type:Oauth2ImplicitSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v2 := m.GetOauth2ImplicitSecurity() + if v2 != nil { + return v2.ToRawInfo() + } + // {Name:oauth2PasswordSecurity Type:Oauth2PasswordSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v3 := m.GetOauth2PasswordSecurity() + if v3 != nil { + return v3.ToRawInfo() + } + // {Name:oauth2ApplicationSecurity Type:Oauth2ApplicationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v4 := m.GetOauth2ApplicationSecurity() + if v4 != nil { + return v4.ToRawInfo() + } + // {Name:oauth2AccessCodeSecurity Type:Oauth2AccessCodeSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v5 := m.GetOauth2AccessCodeSecurity() + if v5 != nil { + return v5.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of SecurityRequirement suitable for JSON or YAML export. +func (m *SecurityRequirement) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. +func (m *StringArray) ToRawInfo() *yaml.Node { + return compiler.NewSequenceNodeForStringArray(m.Value) +} + +// ToRawInfo returns a description of Tag suitable for JSON or YAML export. +func (m *Tag) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of TypeItem suitable for JSON or YAML export. +func (m *TypeItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.Value) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Value)) + } + return info +} + +// ToRawInfo returns a description of VendorExtension suitable for JSON or YAML export. +func (m *VendorExtension) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Xml suitable for JSON or YAML export. +func (m *Xml) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Namespace != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("namespace")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Namespace)) + } + if m.Prefix != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("prefix")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Prefix)) + } + if m.Attribute != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("attribute")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Attribute)) + } + if m.Wrapped != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("wrapped")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Wrapped)) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +var ( + pattern0 = regexp.MustCompile("^x-") + pattern1 = regexp.MustCompile("^/") + pattern2 = regexp.MustCompile("^([0-9]{3})$|^(default)$") +) diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.pb.go b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.pb.go new file mode 100644 index 000000000..65c4c913c --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.pb.go @@ -0,0 +1,7342 @@ +// Copyright 2020 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.19.3 +// source: openapiv2/OpenAPIv2.proto + +package openapi_v2 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +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 AdditionalPropertiesItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *AdditionalPropertiesItem_Schema + // *AdditionalPropertiesItem_Boolean + Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"` +} + +func (x *AdditionalPropertiesItem) Reset() { + *x = AdditionalPropertiesItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AdditionalPropertiesItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdditionalPropertiesItem) ProtoMessage() {} + +func (x *AdditionalPropertiesItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use AdditionalPropertiesItem.ProtoReflect.Descriptor instead. +func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{0} +} + +func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *AdditionalPropertiesItem) GetSchema() *Schema { + if x, ok := x.GetOneof().(*AdditionalPropertiesItem_Schema); ok { + return x.Schema + } + return nil +} + +func (x *AdditionalPropertiesItem) GetBoolean() bool { + if x, ok := x.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return x.Boolean + } + return false +} + +type isAdditionalPropertiesItem_Oneof interface { + isAdditionalPropertiesItem_Oneof() +} + +type AdditionalPropertiesItem_Schema struct { + Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3,oneof"` +} + +type AdditionalPropertiesItem_Boolean struct { + Boolean bool `protobuf:"varint,2,opt,name=boolean,proto3,oneof"` +} + +func (*AdditionalPropertiesItem_Schema) isAdditionalPropertiesItem_Oneof() {} + +func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {} + +type Any struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value *anypb.Any `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *Any) Reset() { + *x = Any{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Any) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Any) ProtoMessage() {} + +func (x *Any) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Any.ProtoReflect.Descriptor instead. +func (*Any) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{1} +} + +func (x *Any) GetValue() *anypb.Any { + if x != nil { + return x.Value + } + return nil +} + +func (x *Any) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +type ApiKeySecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + In string `protobuf:"bytes,3,opt,name=in,proto3" json:"in,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *ApiKeySecurity) Reset() { + *x = ApiKeySecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApiKeySecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApiKeySecurity) ProtoMessage() {} + +func (x *ApiKeySecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use ApiKeySecurity.ProtoReflect.Descriptor instead. +func (*ApiKeySecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{2} +} + +func (x *ApiKeySecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ApiKeySecurity) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ApiKeySecurity) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *ApiKeySecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ApiKeySecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type BasicAuthenticationSecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *BasicAuthenticationSecurity) Reset() { + *x = BasicAuthenticationSecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BasicAuthenticationSecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BasicAuthenticationSecurity) ProtoMessage() {} + +func (x *BasicAuthenticationSecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use BasicAuthenticationSecurity.ProtoReflect.Descriptor instead. +func (*BasicAuthenticationSecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{3} +} + +func (x *BasicAuthenticationSecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *BasicAuthenticationSecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *BasicAuthenticationSecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type BodyParameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,3,opt,name=in,proto3" json:"in,omitempty"` + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + Schema *Schema `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *BodyParameter) Reset() { + *x = BodyParameter{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BodyParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BodyParameter) ProtoMessage() {} + +func (x *BodyParameter) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use BodyParameter.ProtoReflect.Descriptor instead. +func (*BodyParameter) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{4} +} + +func (x *BodyParameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *BodyParameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BodyParameter) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *BodyParameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *BodyParameter) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +func (x *BodyParameter) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// Contact information for the owners of the API. +type Contact struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifying name of the contact person/organization. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URL pointing to the contact information. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + // The email address of the contact person/organization. + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Contact) Reset() { + *x = Contact{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Contact.ProtoReflect.Descriptor instead. +func (*Contact) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{5} +} + +func (x *Contact) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Contact) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Default struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Default) Reset() { + *x = Default{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Default) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Default) ProtoMessage() {} + +func (x *Default) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Default.ProtoReflect.Descriptor instead. +func (*Default) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{6} +} + +func (x *Default) GetAdditionalProperties() []*NamedAny { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// One or more JSON objects describing the schemas being consumed and produced by the API. +type Definitions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Definitions) Reset() { + *x = Definitions{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Definitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Definitions) ProtoMessage() {} + +func (x *Definitions) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Definitions.ProtoReflect.Descriptor instead. +func (*Definitions) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{7} +} + +func (x *Definitions) GetAdditionalProperties() []*NamedSchema { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type Document struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The Swagger version of this document. + Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"` + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + // The host (name or ip) of the API. Example: 'swagger.io' + Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` + // The base path to the API. Example: '/api'. + BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + // The transfer protocol of the API. + Schemes []string `protobuf:"bytes,5,rep,name=schemes,proto3" json:"schemes,omitempty"` + // A list of MIME types accepted by the API. + Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + // A list of MIME types the API can produce. + Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + Paths *Paths `protobuf:"bytes,8,opt,name=paths,proto3" json:"paths,omitempty"` + Definitions *Definitions `protobuf:"bytes,9,opt,name=definitions,proto3" json:"definitions,omitempty"` + Parameters *ParameterDefinitions `protobuf:"bytes,10,opt,name=parameters,proto3" json:"parameters,omitempty"` + Responses *ResponseDefinitions `protobuf:"bytes,11,opt,name=responses,proto3" json:"responses,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,13,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"` + Tags []*Tag `protobuf:"bytes,14,rep,name=tags,proto3" json:"tags,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,15,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,16,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Document) Reset() { + *x = Document{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Document) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Document) ProtoMessage() {} + +func (x *Document) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Document.ProtoReflect.Descriptor instead. +func (*Document) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{8} +} + +func (x *Document) GetSwagger() string { + if x != nil { + return x.Swagger + } + return "" +} + +func (x *Document) GetInfo() *Info { + if x != nil { + return x.Info + } + return nil +} + +func (x *Document) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *Document) GetBasePath() string { + if x != nil { + return x.BasePath + } + return "" +} + +func (x *Document) GetSchemes() []string { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Document) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Document) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Document) GetPaths() *Paths { + if x != nil { + return x.Paths + } + return nil +} + +func (x *Document) GetDefinitions() *Definitions { + if x != nil { + return x.Definitions + } + return nil +} + +func (x *Document) GetParameters() *ParameterDefinitions { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Document) GetResponses() *ResponseDefinitions { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Document) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Document) GetSecurityDefinitions() *SecurityDefinitions { + if x != nil { + return x.SecurityDefinitions + } + return nil +} + +func (x *Document) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Document) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Document) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Examples struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Examples) Reset() { + *x = Examples{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Examples) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Examples) ProtoMessage() {} + +func (x *Examples) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use Examples.ProtoReflect.Descriptor instead. +func (*Examples) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{9} +} + +func (x *Examples) GetAdditionalProperties() []*NamedAny { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// information about external documentation +type ExternalDocs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *ExternalDocs) Reset() { + *x = ExternalDocs{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExternalDocs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocs) ProtoMessage() {} + +func (x *ExternalDocs) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use ExternalDocs.ProtoReflect.Descriptor instead. +func (*ExternalDocs) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{10} +} + +func (x *ExternalDocs) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ExternalDocs) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *ExternalDocs) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// A deterministic version of a JSON Schema object. +type FileSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Format string `protobuf:"bytes,1,opt,name=format,proto3" json:"format,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Default *Any `protobuf:"bytes,4,opt,name=default,proto3" json:"default,omitempty"` + Required []string `protobuf:"bytes,5,rep,name=required,proto3" json:"required,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"` + ReadOnly bool `protobuf:"varint,7,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + Example *Any `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *FileSchema) Reset() { + *x = FileSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileSchema) ProtoMessage() {} + +func (x *FileSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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) +} + +// Deprecated: Use FileSchema.ProtoReflect.Descriptor instead. +func (*FileSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{11} +} + +func (x *FileSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *FileSchema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *FileSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *FileSchema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *FileSchema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *FileSchema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *FileSchema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *FileSchema) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *FileSchema) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *FileSchema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type FormDataParameterSubSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // allows sending a parameter by name only or with an empty value. + AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,7,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,10,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,21,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *FormDataParameterSubSchema) Reset() { + *x = FormDataParameterSubSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FormDataParameterSubSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FormDataParameterSubSchema) ProtoMessage() {} + +func (x *FormDataParameterSubSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[12] + 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 FormDataParameterSubSchema.ProtoReflect.Descriptor instead. +func (*FormDataParameterSubSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{12} +} + +func (x *FormDataParameterSubSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *FormDataParameterSubSchema) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *FormDataParameterSubSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *FormDataParameterSubSchema) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FormDataParameterSubSchema) GetAllowEmptyValue() bool { + if x != nil { + return x.AllowEmptyValue + } + return false +} + +func (x *FormDataParameterSubSchema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *FormDataParameterSubSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *FormDataParameterSubSchema) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *FormDataParameterSubSchema) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *FormDataParameterSubSchema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *FormDataParameterSubSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *FormDataParameterSubSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *FormDataParameterSubSchema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *FormDataParameterSubSchema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *FormDataParameterSubSchema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *FormDataParameterSubSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *FormDataParameterSubSchema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Header struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,6,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,8,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,12,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,16,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + Description string `protobuf:"bytes,18,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,19,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Header) Reset() { + *x = Header{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[13] + 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 Header.ProtoReflect.Descriptor instead. +func (*Header) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{13} +} + +func (x *Header) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Header) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Header) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *Header) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *Header) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *Header) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *Header) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *Header) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *Header) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *Header) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *Header) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *Header) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Header) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *Header) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *Header) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *Header) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *Header) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Header) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type HeaderParameterSubSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,9,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,10,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,12,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,16,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *HeaderParameterSubSchema) Reset() { + *x = HeaderParameterSubSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeaderParameterSubSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderParameterSubSchema) ProtoMessage() {} + +func (x *HeaderParameterSubSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[14] + 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 HeaderParameterSubSchema.ProtoReflect.Descriptor instead. +func (*HeaderParameterSubSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{14} +} + +func (x *HeaderParameterSubSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *HeaderParameterSubSchema) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *HeaderParameterSubSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *HeaderParameterSubSchema) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HeaderParameterSubSchema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *HeaderParameterSubSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *HeaderParameterSubSchema) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *HeaderParameterSubSchema) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *HeaderParameterSubSchema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *HeaderParameterSubSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *HeaderParameterSubSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *HeaderParameterSubSchema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *HeaderParameterSubSchema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *HeaderParameterSubSchema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *HeaderParameterSubSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *HeaderParameterSubSchema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Headers struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedHeader `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Headers) Reset() { + *x = Headers{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Headers) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Headers) ProtoMessage() {} + +func (x *Headers) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[15] + 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 Headers.ProtoReflect.Descriptor instead. +func (*Headers) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{15} +} + +func (x *Headers) GetAdditionalProperties() []*NamedHeader { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// General information about the API. +type Info struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A unique and precise title of the API. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // A semantic version number of the API. + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // The terms of service for the API. + TermsOfService string `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + Contact *Contact `protobuf:"bytes,5,opt,name=contact,proto3" json:"contact,omitempty"` + License *License `protobuf:"bytes,6,opt,name=license,proto3" json:"license,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Info) Reset() { + *x = Info{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[16] + 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 Info.ProtoReflect.Descriptor instead. +func (*Info) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{16} +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.License + } + return nil +} + +func (x *Info) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type ItemsItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Schema []*Schema `protobuf:"bytes,1,rep,name=schema,proto3" json:"schema,omitempty"` +} + +func (x *ItemsItem) Reset() { + *x = ItemsItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ItemsItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItemsItem) ProtoMessage() {} + +func (x *ItemsItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[17] + 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 ItemsItem.ProtoReflect.Descriptor instead. +func (*ItemsItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{17} +} + +func (x *ItemsItem) GetSchema() []*Schema { + if x != nil { + return x.Schema + } + return nil +} + +type JsonReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *JsonReference) Reset() { + *x = JsonReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JsonReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JsonReference) ProtoMessage() {} + +func (x *JsonReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[18] + 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 JsonReference.ProtoReflect.Descriptor instead. +func (*JsonReference) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{18} +} + +func (x *JsonReference) GetXRef() string { + if x != nil { + return x.XRef + } + return "" +} + +func (x *JsonReference) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type License struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the license type. It's encouraged to use an OSI compatible license. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URL pointing to the license. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *License) Reset() { + *x = License{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[19] + 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 License.ProtoReflect.Descriptor instead. +func (*License) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{19} +} + +func (x *License) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *License) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +type NamedAny struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedAny) Reset() { + *x = NamedAny{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedAny) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedAny) ProtoMessage() {} + +func (x *NamedAny) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[20] + 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 NamedAny.ProtoReflect.Descriptor instead. +func (*NamedAny) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{20} +} + +func (x *NamedAny) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedAny) GetValue() *Any { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs. +type NamedHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Header `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedHeader) Reset() { + *x = NamedHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedHeader) ProtoMessage() {} + +func (x *NamedHeader) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[21] + 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 NamedHeader.ProtoReflect.Descriptor instead. +func (*NamedHeader) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{21} +} + +func (x *NamedHeader) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedHeader) GetValue() *Header { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. +type NamedParameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Parameter `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedParameter) Reset() { + *x = NamedParameter{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedParameter) ProtoMessage() {} + +func (x *NamedParameter) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[22] + 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 NamedParameter.ProtoReflect.Descriptor instead. +func (*NamedParameter) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{22} +} + +func (x *NamedParameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedParameter) GetValue() *Parameter { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +type NamedPathItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *PathItem `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedPathItem) Reset() { + *x = NamedPathItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedPathItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedPathItem) ProtoMessage() {} + +func (x *NamedPathItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_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 NamedPathItem.ProtoReflect.Descriptor instead. +func (*NamedPathItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{23} +} + +func (x *NamedPathItem) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedPathItem) GetValue() *PathItem { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs. +type NamedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Response `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedResponse) Reset() { + *x = NamedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedResponse) ProtoMessage() {} + +func (x *NamedResponse) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[24] + 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 NamedResponse.ProtoReflect.Descriptor instead. +func (*NamedResponse) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{24} +} + +func (x *NamedResponse) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedResponse) GetValue() *Response { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs. +type NamedResponseValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *ResponseValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedResponseValue) Reset() { + *x = NamedResponseValue{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedResponseValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedResponseValue) ProtoMessage() {} + +func (x *NamedResponseValue) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[25] + 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 NamedResponseValue.ProtoReflect.Descriptor instead. +func (*NamedResponseValue) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{25} +} + +func (x *NamedResponseValue) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedResponseValue) GetValue() *ResponseValue { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. +type NamedSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Schema `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedSchema) Reset() { + *x = NamedSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedSchema) ProtoMessage() {} + +func (x *NamedSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[26] + 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 NamedSchema.ProtoReflect.Descriptor instead. +func (*NamedSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{26} +} + +func (x *NamedSchema) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedSchema) GetValue() *Schema { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs. +type NamedSecurityDefinitionsItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *SecurityDefinitionsItem `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedSecurityDefinitionsItem) Reset() { + *x = NamedSecurityDefinitionsItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedSecurityDefinitionsItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedSecurityDefinitionsItem) ProtoMessage() {} + +func (x *NamedSecurityDefinitionsItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[27] + 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 NamedSecurityDefinitionsItem.ProtoReflect.Descriptor instead. +func (*NamedSecurityDefinitionsItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{27} +} + +func (x *NamedSecurityDefinitionsItem) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedSecurityDefinitionsItem) GetValue() *SecurityDefinitionsItem { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +type NamedString struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedString) Reset() { + *x = NamedString{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedString) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedString) ProtoMessage() {} + +func (x *NamedString) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[28] + 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 NamedString.ProtoReflect.Descriptor instead. +func (*NamedString) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{28} +} + +func (x *NamedString) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedString) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. +type NamedStringArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *StringArray `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedStringArray) Reset() { + *x = NamedStringArray{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedStringArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedStringArray) ProtoMessage() {} + +func (x *NamedStringArray) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[29] + 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 NamedStringArray.ProtoReflect.Descriptor instead. +func (*NamedStringArray) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{29} +} + +func (x *NamedStringArray) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedStringArray) GetValue() *StringArray { + if x != nil { + return x.Value + } + return nil +} + +type NonBodyParameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *NonBodyParameter_HeaderParameterSubSchema + // *NonBodyParameter_FormDataParameterSubSchema + // *NonBodyParameter_QueryParameterSubSchema + // *NonBodyParameter_PathParameterSubSchema + Oneof isNonBodyParameter_Oneof `protobuf_oneof:"oneof"` +} + +func (x *NonBodyParameter) Reset() { + *x = NonBodyParameter{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NonBodyParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NonBodyParameter) ProtoMessage() {} + +func (x *NonBodyParameter) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[30] + 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 NonBodyParameter.ProtoReflect.Descriptor instead. +func (*NonBodyParameter) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{30} +} + +func (m *NonBodyParameter) GetOneof() isNonBodyParameter_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *NonBodyParameter) GetHeaderParameterSubSchema() *HeaderParameterSubSchema { + if x, ok := x.GetOneof().(*NonBodyParameter_HeaderParameterSubSchema); ok { + return x.HeaderParameterSubSchema + } + return nil +} + +func (x *NonBodyParameter) GetFormDataParameterSubSchema() *FormDataParameterSubSchema { + if x, ok := x.GetOneof().(*NonBodyParameter_FormDataParameterSubSchema); ok { + return x.FormDataParameterSubSchema + } + return nil +} + +func (x *NonBodyParameter) GetQueryParameterSubSchema() *QueryParameterSubSchema { + if x, ok := x.GetOneof().(*NonBodyParameter_QueryParameterSubSchema); ok { + return x.QueryParameterSubSchema + } + return nil +} + +func (x *NonBodyParameter) GetPathParameterSubSchema() *PathParameterSubSchema { + if x, ok := x.GetOneof().(*NonBodyParameter_PathParameterSubSchema); ok { + return x.PathParameterSubSchema + } + return nil +} + +type isNonBodyParameter_Oneof interface { + isNonBodyParameter_Oneof() +} + +type NonBodyParameter_HeaderParameterSubSchema struct { + HeaderParameterSubSchema *HeaderParameterSubSchema `protobuf:"bytes,1,opt,name=header_parameter_sub_schema,json=headerParameterSubSchema,proto3,oneof"` +} + +type NonBodyParameter_FormDataParameterSubSchema struct { + FormDataParameterSubSchema *FormDataParameterSubSchema `protobuf:"bytes,2,opt,name=form_data_parameter_sub_schema,json=formDataParameterSubSchema,proto3,oneof"` +} + +type NonBodyParameter_QueryParameterSubSchema struct { + QueryParameterSubSchema *QueryParameterSubSchema `protobuf:"bytes,3,opt,name=query_parameter_sub_schema,json=queryParameterSubSchema,proto3,oneof"` +} + +type NonBodyParameter_PathParameterSubSchema struct { + PathParameterSubSchema *PathParameterSubSchema `protobuf:"bytes,4,opt,name=path_parameter_sub_schema,json=pathParameterSubSchema,proto3,oneof"` +} + +func (*NonBodyParameter_HeaderParameterSubSchema) isNonBodyParameter_Oneof() {} + +func (*NonBodyParameter_FormDataParameterSubSchema) isNonBodyParameter_Oneof() {} + +func (*NonBodyParameter_QueryParameterSubSchema) isNonBodyParameter_Oneof() {} + +func (*NonBodyParameter_PathParameterSubSchema) isNonBodyParameter_Oneof() {} + +type Oauth2AccessCodeSecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"` + AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + TokenUrl string `protobuf:"bytes,5,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Oauth2AccessCodeSecurity) Reset() { + *x = Oauth2AccessCodeSecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Oauth2AccessCodeSecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Oauth2AccessCodeSecurity) ProtoMessage() {} + +func (x *Oauth2AccessCodeSecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[31] + 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 Oauth2AccessCodeSecurity.ProtoReflect.Descriptor instead. +func (*Oauth2AccessCodeSecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{31} +} + +func (x *Oauth2AccessCodeSecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Oauth2AccessCodeSecurity) GetFlow() string { + if x != nil { + return x.Flow + } + return "" +} + +func (x *Oauth2AccessCodeSecurity) GetScopes() *Oauth2Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *Oauth2AccessCodeSecurity) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *Oauth2AccessCodeSecurity) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *Oauth2AccessCodeSecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Oauth2AccessCodeSecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Oauth2ApplicationSecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"` + TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Oauth2ApplicationSecurity) Reset() { + *x = Oauth2ApplicationSecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Oauth2ApplicationSecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Oauth2ApplicationSecurity) ProtoMessage() {} + +func (x *Oauth2ApplicationSecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[32] + 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 Oauth2ApplicationSecurity.ProtoReflect.Descriptor instead. +func (*Oauth2ApplicationSecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{32} +} + +func (x *Oauth2ApplicationSecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Oauth2ApplicationSecurity) GetFlow() string { + if x != nil { + return x.Flow + } + return "" +} + +func (x *Oauth2ApplicationSecurity) GetScopes() *Oauth2Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *Oauth2ApplicationSecurity) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *Oauth2ApplicationSecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Oauth2ApplicationSecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Oauth2ImplicitSecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"` + AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Oauth2ImplicitSecurity) Reset() { + *x = Oauth2ImplicitSecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Oauth2ImplicitSecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Oauth2ImplicitSecurity) ProtoMessage() {} + +func (x *Oauth2ImplicitSecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[33] + 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 Oauth2ImplicitSecurity.ProtoReflect.Descriptor instead. +func (*Oauth2ImplicitSecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{33} +} + +func (x *Oauth2ImplicitSecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Oauth2ImplicitSecurity) GetFlow() string { + if x != nil { + return x.Flow + } + return "" +} + +func (x *Oauth2ImplicitSecurity) GetScopes() *Oauth2Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *Oauth2ImplicitSecurity) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *Oauth2ImplicitSecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Oauth2ImplicitSecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Oauth2PasswordSecurity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"` + TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Oauth2PasswordSecurity) Reset() { + *x = Oauth2PasswordSecurity{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Oauth2PasswordSecurity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Oauth2PasswordSecurity) ProtoMessage() {} + +func (x *Oauth2PasswordSecurity) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[34] + 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 Oauth2PasswordSecurity.ProtoReflect.Descriptor instead. +func (*Oauth2PasswordSecurity) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{34} +} + +func (x *Oauth2PasswordSecurity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Oauth2PasswordSecurity) GetFlow() string { + if x != nil { + return x.Flow + } + return "" +} + +func (x *Oauth2PasswordSecurity) GetScopes() *Oauth2Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *Oauth2PasswordSecurity) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *Oauth2PasswordSecurity) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Oauth2PasswordSecurity) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Oauth2Scopes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Oauth2Scopes) Reset() { + *x = Oauth2Scopes{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Oauth2Scopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Oauth2Scopes) ProtoMessage() {} + +func (x *Oauth2Scopes) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[35] + 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 Oauth2Scopes.ProtoReflect.Descriptor instead. +func (*Oauth2Scopes) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{35} +} + +func (x *Oauth2Scopes) GetAdditionalProperties() []*NamedString { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type Operation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + // A brief summary of the operation. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A longer description of the operation, GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // A unique identifier of the operation. + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + // A list of MIME types the API can produce. + Produces []string `protobuf:"bytes,6,rep,name=produces,proto3" json:"produces,omitempty"` + // A list of MIME types the API can consume. + Consumes []string `protobuf:"bytes,7,rep,name=consumes,proto3" json:"consumes,omitempty"` + // The parameters needed to send a valid API call. + Parameters []*ParametersItem `protobuf:"bytes,8,rep,name=parameters,proto3" json:"parameters,omitempty"` + Responses *Responses `protobuf:"bytes,9,opt,name=responses,proto3" json:"responses,omitempty"` + // The transfer protocol of the API. + Schemes []string `protobuf:"bytes,10,rep,name=schemes,proto3" json:"schemes,omitempty"` + Deprecated bool `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,13,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Operation) Reset() { + *x = Operation{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[36] + 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 Operation.ProtoReflect.Descriptor instead. +func (*Operation) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{36} +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Operation) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Operation) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Operation) GetParameters() []*ParametersItem { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Operation) GetResponses() *Responses { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Operation) GetSchemes() []string { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Operation) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Parameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *Parameter_BodyParameter + // *Parameter_NonBodyParameter + Oneof isParameter_Oneof `protobuf_oneof:"oneof"` +} + +func (x *Parameter) Reset() { + *x = Parameter{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Parameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameter) ProtoMessage() {} + +func (x *Parameter) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[37] + 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 Parameter.ProtoReflect.Descriptor instead. +func (*Parameter) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{37} +} + +func (m *Parameter) GetOneof() isParameter_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *Parameter) GetBodyParameter() *BodyParameter { + if x, ok := x.GetOneof().(*Parameter_BodyParameter); ok { + return x.BodyParameter + } + return nil +} + +func (x *Parameter) GetNonBodyParameter() *NonBodyParameter { + if x, ok := x.GetOneof().(*Parameter_NonBodyParameter); ok { + return x.NonBodyParameter + } + return nil +} + +type isParameter_Oneof interface { + isParameter_Oneof() +} + +type Parameter_BodyParameter struct { + BodyParameter *BodyParameter `protobuf:"bytes,1,opt,name=body_parameter,json=bodyParameter,proto3,oneof"` +} + +type Parameter_NonBodyParameter struct { + NonBodyParameter *NonBodyParameter `protobuf:"bytes,2,opt,name=non_body_parameter,json=nonBodyParameter,proto3,oneof"` +} + +func (*Parameter_BodyParameter) isParameter_Oneof() {} + +func (*Parameter_NonBodyParameter) isParameter_Oneof() {} + +// One or more JSON representations for parameters +type ParameterDefinitions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ParameterDefinitions) Reset() { + *x = ParameterDefinitions{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParameterDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParameterDefinitions) ProtoMessage() {} + +func (x *ParameterDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[38] + 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 ParameterDefinitions.ProtoReflect.Descriptor instead. +func (*ParameterDefinitions) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{38} +} + +func (x *ParameterDefinitions) GetAdditionalProperties() []*NamedParameter { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type ParametersItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *ParametersItem_Parameter + // *ParametersItem_JsonReference + Oneof isParametersItem_Oneof `protobuf_oneof:"oneof"` +} + +func (x *ParametersItem) Reset() { + *x = ParametersItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParametersItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParametersItem) ProtoMessage() {} + +func (x *ParametersItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[39] + 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 ParametersItem.ProtoReflect.Descriptor instead. +func (*ParametersItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{39} +} + +func (m *ParametersItem) GetOneof() isParametersItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *ParametersItem) GetParameter() *Parameter { + if x, ok := x.GetOneof().(*ParametersItem_Parameter); ok { + return x.Parameter + } + return nil +} + +func (x *ParametersItem) GetJsonReference() *JsonReference { + if x, ok := x.GetOneof().(*ParametersItem_JsonReference); ok { + return x.JsonReference + } + return nil +} + +type isParametersItem_Oneof interface { + isParametersItem_Oneof() +} + +type ParametersItem_Parameter struct { + Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,proto3,oneof"` +} + +type ParametersItem_JsonReference struct { + JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,proto3,oneof"` +} + +func (*ParametersItem_Parameter) isParametersItem_Oneof() {} + +func (*ParametersItem_JsonReference) isParametersItem_Oneof() {} + +type PathItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Get *Operation `protobuf:"bytes,2,opt,name=get,proto3" json:"get,omitempty"` + Put *Operation `protobuf:"bytes,3,opt,name=put,proto3" json:"put,omitempty"` + Post *Operation `protobuf:"bytes,4,opt,name=post,proto3" json:"post,omitempty"` + Delete *Operation `protobuf:"bytes,5,opt,name=delete,proto3" json:"delete,omitempty"` + Options *Operation `protobuf:"bytes,6,opt,name=options,proto3" json:"options,omitempty"` + Head *Operation `protobuf:"bytes,7,opt,name=head,proto3" json:"head,omitempty"` + Patch *Operation `protobuf:"bytes,8,opt,name=patch,proto3" json:"patch,omitempty"` + // The parameters needed to send a valid API call. + Parameters []*ParametersItem `protobuf:"bytes,9,rep,name=parameters,proto3" json:"parameters,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *PathItem) Reset() { + *x = PathItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PathItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathItem) ProtoMessage() {} + +func (x *PathItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[40] + 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 PathItem.ProtoReflect.Descriptor instead. +func (*PathItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{40} +} + +func (x *PathItem) GetXRef() string { + if x != nil { + return x.XRef + } + return "" +} + +func (x *PathItem) GetGet() *Operation { + if x != nil { + return x.Get + } + return nil +} + +func (x *PathItem) GetPut() *Operation { + if x != nil { + return x.Put + } + return nil +} + +func (x *PathItem) GetPost() *Operation { + if x != nil { + return x.Post + } + return nil +} + +func (x *PathItem) GetDelete() *Operation { + if x != nil { + return x.Delete + } + return nil +} + +func (x *PathItem) GetOptions() *Operation { + if x != nil { + return x.Options + } + return nil +} + +func (x *PathItem) GetHead() *Operation { + if x != nil { + return x.Head + } + return nil +} + +func (x *PathItem) GetPatch() *Operation { + if x != nil { + return x.Patch + } + return nil +} + +func (x *PathItem) GetParameters() []*ParametersItem { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *PathItem) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type PathParameterSubSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,9,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,10,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,12,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,16,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *PathParameterSubSchema) Reset() { + *x = PathParameterSubSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PathParameterSubSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathParameterSubSchema) ProtoMessage() {} + +func (x *PathParameterSubSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[41] + 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 PathParameterSubSchema.ProtoReflect.Descriptor instead. +func (*PathParameterSubSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{41} +} + +func (x *PathParameterSubSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *PathParameterSubSchema) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *PathParameterSubSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *PathParameterSubSchema) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PathParameterSubSchema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *PathParameterSubSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *PathParameterSubSchema) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *PathParameterSubSchema) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *PathParameterSubSchema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *PathParameterSubSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *PathParameterSubSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *PathParameterSubSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *PathParameterSubSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *PathParameterSubSchema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *PathParameterSubSchema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *PathParameterSubSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *PathParameterSubSchema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *PathParameterSubSchema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *PathParameterSubSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *PathParameterSubSchema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *PathParameterSubSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *PathParameterSubSchema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// Relative paths to the individual endpoints. They must be relative to the 'basePath'. +type Paths struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VendorExtension []*NamedAny `protobuf:"bytes,1,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` + Path []*NamedPathItem `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"` +} + +func (x *Paths) Reset() { + *x = Paths{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Paths) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Paths) ProtoMessage() {} + +func (x *Paths) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[42] + 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 Paths.ProtoReflect.Descriptor instead. +func (*Paths) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{42} +} + +func (x *Paths) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +func (x *Paths) GetPath() []*NamedPathItem { + if x != nil { + return x.Path + } + return nil +} + +type PrimitivesItems struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,6,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,8,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,12,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,16,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,18,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *PrimitivesItems) Reset() { + *x = PrimitivesItems{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrimitivesItems) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrimitivesItems) ProtoMessage() {} + +func (x *PrimitivesItems) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[43] + 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 PrimitivesItems.ProtoReflect.Descriptor instead. +func (*PrimitivesItems) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{43} +} + +func (x *PrimitivesItems) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *PrimitivesItems) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *PrimitivesItems) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *PrimitivesItems) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *PrimitivesItems) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *PrimitivesItems) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *PrimitivesItems) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *PrimitivesItems) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *PrimitivesItems) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *PrimitivesItems) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *PrimitivesItems) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *PrimitivesItems) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *PrimitivesItems) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *PrimitivesItems) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *PrimitivesItems) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *PrimitivesItems) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *PrimitivesItems) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *PrimitivesItems) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Properties struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Properties) Reset() { + *x = Properties{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Properties) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Properties) ProtoMessage() {} + +func (x *Properties) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[44] + 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 Properties.ProtoReflect.Descriptor instead. +func (*Properties) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{44} +} + +func (x *Properties) GetAdditionalProperties() []*NamedSchema { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type QueryParameterSubSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // allows sending a parameter by name only or with an empty value. + AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"` + Format string `protobuf:"bytes,7,opt,name=format,proto3" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items,proto3" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,10,opt,name=default,proto3" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,21,rep,name=enum,proto3" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *QueryParameterSubSchema) Reset() { + *x = QueryParameterSubSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParameterSubSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParameterSubSchema) ProtoMessage() {} + +func (x *QueryParameterSubSchema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[45] + 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 QueryParameterSubSchema.ProtoReflect.Descriptor instead. +func (*QueryParameterSubSchema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{45} +} + +func (x *QueryParameterSubSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *QueryParameterSubSchema) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *QueryParameterSubSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *QueryParameterSubSchema) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *QueryParameterSubSchema) GetAllowEmptyValue() bool { + if x != nil { + return x.AllowEmptyValue + } + return false +} + +func (x *QueryParameterSubSchema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *QueryParameterSubSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *QueryParameterSubSchema) GetItems() *PrimitivesItems { + if x != nil { + return x.Items + } + return nil +} + +func (x *QueryParameterSubSchema) GetCollectionFormat() string { + if x != nil { + return x.CollectionFormat + } + return "" +} + +func (x *QueryParameterSubSchema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *QueryParameterSubSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *QueryParameterSubSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *QueryParameterSubSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *QueryParameterSubSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *QueryParameterSubSchema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *QueryParameterSubSchema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *QueryParameterSubSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *QueryParameterSubSchema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *QueryParameterSubSchema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *QueryParameterSubSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *QueryParameterSubSchema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *QueryParameterSubSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *QueryParameterSubSchema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Schema *SchemaItem `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + Headers *Headers `protobuf:"bytes,3,opt,name=headers,proto3" json:"headers,omitempty"` + Examples *Examples `protobuf:"bytes,4,opt,name=examples,proto3" json:"examples,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Response) Reset() { + *x = Response{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[46] + 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 Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{46} +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Response) GetSchema() *SchemaItem { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Response) GetHeaders() *Headers { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Response) GetExamples() *Examples { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Response) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// One or more JSON representations for responses +type ResponseDefinitions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedResponse `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ResponseDefinitions) Reset() { + *x = ResponseDefinitions{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponseDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseDefinitions) ProtoMessage() {} + +func (x *ResponseDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[47] + 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 ResponseDefinitions.ProtoReflect.Descriptor instead. +func (*ResponseDefinitions) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{47} +} + +func (x *ResponseDefinitions) GetAdditionalProperties() []*NamedResponse { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type ResponseValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *ResponseValue_Response + // *ResponseValue_JsonReference + Oneof isResponseValue_Oneof `protobuf_oneof:"oneof"` +} + +func (x *ResponseValue) Reset() { + *x = ResponseValue{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponseValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseValue) ProtoMessage() {} + +func (x *ResponseValue) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[48] + 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 ResponseValue.ProtoReflect.Descriptor instead. +func (*ResponseValue) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{48} +} + +func (m *ResponseValue) GetOneof() isResponseValue_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *ResponseValue) GetResponse() *Response { + if x, ok := x.GetOneof().(*ResponseValue_Response); ok { + return x.Response + } + return nil +} + +func (x *ResponseValue) GetJsonReference() *JsonReference { + if x, ok := x.GetOneof().(*ResponseValue_JsonReference); ok { + return x.JsonReference + } + return nil +} + +type isResponseValue_Oneof interface { + isResponseValue_Oneof() +} + +type ResponseValue_Response struct { + Response *Response `protobuf:"bytes,1,opt,name=response,proto3,oneof"` +} + +type ResponseValue_JsonReference struct { + JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,proto3,oneof"` +} + +func (*ResponseValue_Response) isResponseValue_Oneof() {} + +func (*ResponseValue_JsonReference) isResponseValue_Oneof() {} + +// Response objects names can either be any valid HTTP status code or 'default'. +type Responses struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResponseCode []*NamedResponseValue `protobuf:"bytes,1,rep,name=response_code,json=responseCode,proto3" json:"response_code,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,2,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Responses) Reset() { + *x = Responses{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Responses) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Responses) ProtoMessage() {} + +func (x *Responses) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[49] + 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 Responses.ProtoReflect.Descriptor instead. +func (*Responses) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{49} +} + +func (x *Responses) GetResponseCode() []*NamedResponseValue { + if x != nil { + return x.ResponseCode + } + return nil +} + +func (x *Responses) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +// A deterministic version of a JSON Schema object. +type Schema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"` + MultipleOf float64 `protobuf:"fixed64,6,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + Maximum float64 `protobuf:"fixed64,7,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,8,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,9,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,10,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,11,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,12,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,14,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,15,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,16,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + MaxProperties int64 `protobuf:"varint,17,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + MinProperties int64 `protobuf:"varint,18,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + Required []string `protobuf:"bytes,19,rep,name=required,proto3" json:"required,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"` + AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,21,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + Type *TypeItem `protobuf:"bytes,22,opt,name=type,proto3" json:"type,omitempty"` + Items *ItemsItem `protobuf:"bytes,23,opt,name=items,proto3" json:"items,omitempty"` + AllOf []*Schema `protobuf:"bytes,24,rep,name=all_of,json=allOf,proto3" json:"all_of,omitempty"` + Properties *Properties `protobuf:"bytes,25,opt,name=properties,proto3" json:"properties,omitempty"` + Discriminator string `protobuf:"bytes,26,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + ReadOnly bool `protobuf:"varint,27,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + Xml *Xml `protobuf:"bytes,28,opt,name=xml,proto3" json:"xml,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,29,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + Example *Any `protobuf:"bytes,30,opt,name=example,proto3" json:"example,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,31,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Schema) Reset() { + *x = Schema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[50] + 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 Schema.ProtoReflect.Descriptor instead. +func (*Schema) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{50} +} + +func (x *Schema) GetXRef() string { + if x != nil { + return x.XRef + } + return "" +} + +func (x *Schema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Schema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Schema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Schema) GetDefault() *Any { + if x != nil { + return x.Default + } + return nil +} + +func (x *Schema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *Schema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *Schema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *Schema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *Schema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *Schema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *Schema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *Schema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Schema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *Schema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *Schema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *Schema) GetMaxProperties() int64 { + if x != nil { + return x.MaxProperties + } + return 0 +} + +func (x *Schema) GetMinProperties() int64 { + if x != nil { + return x.MinProperties + } + return 0 +} + +func (x *Schema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *Schema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *Schema) GetAdditionalProperties() *AdditionalPropertiesItem { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +func (x *Schema) GetType() *TypeItem { + if x != nil { + return x.Type + } + return nil +} + +func (x *Schema) GetItems() *ItemsItem { + if x != nil { + return x.Items + } + return nil +} + +func (x *Schema) GetAllOf() []*Schema { + if x != nil { + return x.AllOf + } + return nil +} + +func (x *Schema) GetProperties() *Properties { + if x != nil { + return x.Properties + } + return nil +} + +func (x *Schema) GetDiscriminator() string { + if x != nil { + return x.Discriminator + } + return "" +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *Schema) GetXml() *Xml { + if x != nil { + return x.Xml + } + return nil +} + +func (x *Schema) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *Schema) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type SchemaItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *SchemaItem_Schema + // *SchemaItem_FileSchema + Oneof isSchemaItem_Oneof `protobuf_oneof:"oneof"` +} + +func (x *SchemaItem) Reset() { + *x = SchemaItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchemaItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchemaItem) ProtoMessage() {} + +func (x *SchemaItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[51] + 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 SchemaItem.ProtoReflect.Descriptor instead. +func (*SchemaItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{51} +} + +func (m *SchemaItem) GetOneof() isSchemaItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *SchemaItem) GetSchema() *Schema { + if x, ok := x.GetOneof().(*SchemaItem_Schema); ok { + return x.Schema + } + return nil +} + +func (x *SchemaItem) GetFileSchema() *FileSchema { + if x, ok := x.GetOneof().(*SchemaItem_FileSchema); ok { + return x.FileSchema + } + return nil +} + +type isSchemaItem_Oneof interface { + isSchemaItem_Oneof() +} + +type SchemaItem_Schema struct { + Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3,oneof"` +} + +type SchemaItem_FileSchema struct { + FileSchema *FileSchema `protobuf:"bytes,2,opt,name=file_schema,json=fileSchema,proto3,oneof"` +} + +func (*SchemaItem_Schema) isSchemaItem_Oneof() {} + +func (*SchemaItem_FileSchema) isSchemaItem_Oneof() {} + +type SecurityDefinitions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSecurityDefinitionsItem `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *SecurityDefinitions) Reset() { + *x = SecurityDefinitions{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitions) ProtoMessage() {} + +func (x *SecurityDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[52] + 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 SecurityDefinitions.ProtoReflect.Descriptor instead. +func (*SecurityDefinitions) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{52} +} + +func (x *SecurityDefinitions) GetAdditionalProperties() []*NamedSecurityDefinitionsItem { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type SecurityDefinitionsItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *SecurityDefinitionsItem_BasicAuthenticationSecurity + // *SecurityDefinitionsItem_ApiKeySecurity + // *SecurityDefinitionsItem_Oauth2ImplicitSecurity + // *SecurityDefinitionsItem_Oauth2PasswordSecurity + // *SecurityDefinitionsItem_Oauth2ApplicationSecurity + // *SecurityDefinitionsItem_Oauth2AccessCodeSecurity + Oneof isSecurityDefinitionsItem_Oneof `protobuf_oneof:"oneof"` +} + +func (x *SecurityDefinitionsItem) Reset() { + *x = SecurityDefinitionsItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityDefinitionsItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitionsItem) ProtoMessage() {} + +func (x *SecurityDefinitionsItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[53] + 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 SecurityDefinitionsItem.ProtoReflect.Descriptor instead. +func (*SecurityDefinitionsItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{53} +} + +func (m *SecurityDefinitionsItem) GetOneof() isSecurityDefinitionsItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *SecurityDefinitionsItem) GetBasicAuthenticationSecurity() *BasicAuthenticationSecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_BasicAuthenticationSecurity); ok { + return x.BasicAuthenticationSecurity + } + return nil +} + +func (x *SecurityDefinitionsItem) GetApiKeySecurity() *ApiKeySecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_ApiKeySecurity); ok { + return x.ApiKeySecurity + } + return nil +} + +func (x *SecurityDefinitionsItem) GetOauth2ImplicitSecurity() *Oauth2ImplicitSecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_Oauth2ImplicitSecurity); ok { + return x.Oauth2ImplicitSecurity + } + return nil +} + +func (x *SecurityDefinitionsItem) GetOauth2PasswordSecurity() *Oauth2PasswordSecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_Oauth2PasswordSecurity); ok { + return x.Oauth2PasswordSecurity + } + return nil +} + +func (x *SecurityDefinitionsItem) GetOauth2ApplicationSecurity() *Oauth2ApplicationSecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_Oauth2ApplicationSecurity); ok { + return x.Oauth2ApplicationSecurity + } + return nil +} + +func (x *SecurityDefinitionsItem) GetOauth2AccessCodeSecurity() *Oauth2AccessCodeSecurity { + if x, ok := x.GetOneof().(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity); ok { + return x.Oauth2AccessCodeSecurity + } + return nil +} + +type isSecurityDefinitionsItem_Oneof interface { + isSecurityDefinitionsItem_Oneof() +} + +type SecurityDefinitionsItem_BasicAuthenticationSecurity struct { + BasicAuthenticationSecurity *BasicAuthenticationSecurity `protobuf:"bytes,1,opt,name=basic_authentication_security,json=basicAuthenticationSecurity,proto3,oneof"` +} + +type SecurityDefinitionsItem_ApiKeySecurity struct { + ApiKeySecurity *ApiKeySecurity `protobuf:"bytes,2,opt,name=api_key_security,json=apiKeySecurity,proto3,oneof"` +} + +type SecurityDefinitionsItem_Oauth2ImplicitSecurity struct { + Oauth2ImplicitSecurity *Oauth2ImplicitSecurity `protobuf:"bytes,3,opt,name=oauth2_implicit_security,json=oauth2ImplicitSecurity,proto3,oneof"` +} + +type SecurityDefinitionsItem_Oauth2PasswordSecurity struct { + Oauth2PasswordSecurity *Oauth2PasswordSecurity `protobuf:"bytes,4,opt,name=oauth2_password_security,json=oauth2PasswordSecurity,proto3,oneof"` +} + +type SecurityDefinitionsItem_Oauth2ApplicationSecurity struct { + Oauth2ApplicationSecurity *Oauth2ApplicationSecurity `protobuf:"bytes,5,opt,name=oauth2_application_security,json=oauth2ApplicationSecurity,proto3,oneof"` +} + +type SecurityDefinitionsItem_Oauth2AccessCodeSecurity struct { + Oauth2AccessCodeSecurity *Oauth2AccessCodeSecurity `protobuf:"bytes,6,opt,name=oauth2_access_code_security,json=oauth2AccessCodeSecurity,proto3,oneof"` +} + +func (*SecurityDefinitionsItem_BasicAuthenticationSecurity) isSecurityDefinitionsItem_Oneof() {} + +func (*SecurityDefinitionsItem_ApiKeySecurity) isSecurityDefinitionsItem_Oneof() {} + +func (*SecurityDefinitionsItem_Oauth2ImplicitSecurity) isSecurityDefinitionsItem_Oneof() {} + +func (*SecurityDefinitionsItem_Oauth2PasswordSecurity) isSecurityDefinitionsItem_Oneof() {} + +func (*SecurityDefinitionsItem_Oauth2ApplicationSecurity) isSecurityDefinitionsItem_Oneof() {} + +func (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) isSecurityDefinitionsItem_Oneof() {} + +type SecurityRequirement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[54] + 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 SecurityRequirement.ProtoReflect.Descriptor instead. +func (*SecurityRequirement) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{54} +} + +func (x *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type StringArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` +} + +func (x *StringArray) Reset() { + *x = StringArray{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringArray) ProtoMessage() {} + +func (x *StringArray) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[55] + 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 StringArray.ProtoReflect.Descriptor instead. +func (*StringArray) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{55} +} + +func (x *StringArray) GetValue() []string { + if x != nil { + return x.Value + } + return nil +} + +type Tag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Tag) Reset() { + *x = Tag{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[56] + 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 Tag.ProtoReflect.Descriptor instead. +func (*Tag) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{56} +} + +func (x *Tag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Tag) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +type TypeItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` +} + +func (x *TypeItem) Reset() { + *x = TypeItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TypeItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TypeItem) ProtoMessage() {} + +func (x *TypeItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[57] + 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 TypeItem.ProtoReflect.Descriptor instead. +func (*TypeItem) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{57} +} + +func (x *TypeItem) GetValue() []string { + if x != nil { + return x.Value + } + return nil +} + +// Any property starting with x- is valid. +type VendorExtension struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *VendorExtension) Reset() { + *x = VendorExtension{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VendorExtension) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VendorExtension) ProtoMessage() {} + +func (x *VendorExtension) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[58] + 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 VendorExtension.ProtoReflect.Descriptor instead. +func (*VendorExtension) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{58} +} + +func (x *VendorExtension) GetAdditionalProperties() []*NamedAny { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type Xml struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` + Attribute bool `protobuf:"varint,4,opt,name=attribute,proto3" json:"attribute,omitempty"` + Wrapped bool `protobuf:"varint,5,opt,name=wrapped,proto3" json:"wrapped,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"` +} + +func (x *Xml) Reset() { + *x = Xml{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Xml) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Xml) ProtoMessage() {} + +func (x *Xml) ProtoReflect() protoreflect.Message { + mi := &file_openapiv2_OpenAPIv2_proto_msgTypes[59] + 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 Xml.ProtoReflect.Descriptor instead. +func (*Xml) Descriptor() ([]byte, []int) { + return file_openapiv2_OpenAPIv2_proto_rawDescGZIP(), []int{59} +} + +func (x *Xml) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Xml) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Xml) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *Xml) GetAttribute() bool { + if x != nil { + return x.Attribute + } + return false +} + +func (x *Xml) GetWrapped() bool { + if x != nil { + return x.Wrapped + } + return false +} + +func (x *Xml) GetVendorExtension() []*NamedAny { + if x != nil { + return x.VendorExtension + } + return nil +} + +var File_openapiv2_OpenAPIv2_proto protoreflect.FileDescriptor + +var file_openapiv2_OpenAPIv2_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x4f, 0x70, 0x65, 0x6e, + 0x41, 0x50, 0x49, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x6d, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2c, + 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x0a, 0x07, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, + 0x66, 0x22, 0x45, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x22, 0xab, 0x01, 0x0a, 0x0e, 0x41, 0x70, 0x69, + 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x1b, 0x42, 0x61, 0x73, 0x69, 0x63, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x10, + 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xde, 0x01, + 0x0a, 0x0d, 0x42, 0x6f, 0x64, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3f, 0x0a, + 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x86, + 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x49, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x5b, 0x0a, + 0x0b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xe8, 0x05, 0x0a, 0x08, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x24, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x62, 0x61, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x12, 0x39, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, + 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, + 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x52, 0x0a, 0x14, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x23, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x08, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x12, 0x49, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x83, 0x01, 0x0a, + 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xff, 0x02, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x06, 0x0a, 0x1a, 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x31, 0x0a, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x29, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x04, 0x65, + 0x6e, 0x75, 0x6d, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xab, 0x05, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, + 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, + 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, + 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, + 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, + 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0xfd, 0x05, 0x0a, 0x18, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, + 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, + 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x04, 0x65, 0x6e, 0x75, + 0x6d, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, + 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, + 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x57, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x04, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x6f, 0x66, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2d, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x2d, 0x0a, + 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x10, + 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x37, 0x0a, + 0x09, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x44, 0x0a, 0x0d, 0x4a, 0x73, 0x6f, 0x6e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x11, 0x0a, 0x04, 0x5f, 0x72, 0x65, 0x66, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x52, 0x65, 0x66, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x07, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3f, 0x0a, + 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x45, + 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4b, 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x51, 0x0a, 0x0e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x59, 0x0a, 0x12, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x4b, 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x6d, 0x0a, 0x1c, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x37, + 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 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, 0x55, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, + 0x03, 0x0a, 0x10, 0x4e, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x12, 0x65, 0x0a, 0x1b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, + 0x52, 0x18, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x6c, 0x0a, 0x1e, 0x66, 0x6f, + 0x72, 0x6d, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x1a, 0x66, 0x6f, + 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, + 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x48, 0x00, 0x52, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x5f, 0x0a, 0x19, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x74, + 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x16, 0x70, 0x61, 0x74, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x07, 0x0a, + 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0xa1, 0x02, 0x0a, 0x18, 0x4f, 0x61, 0x75, 0x74, 0x68, + 0x32, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x30, 0x0a, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x19, 0x4f, + 0x61, 0x75, 0x74, 0x68, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x30, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x61, + 0x75, 0x74, 0x68, 0x32, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x82, 0x02, 0x0a, 0x16, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x49, 0x6d, 0x70, + 0x6c, 0x69, 0x63, 0x69, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xf2, 0x01, 0x0a, 0x16, 0x4f, 0x61, 0x75, 0x74, + 0x68, 0x32, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x76, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x0c, + 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x9e, 0x04, 0x0a, 0x09, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, + 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x49, 0x74, + 0x65, 0x6d, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x33, + 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, + 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x09, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0e, 0x62, 0x6f, 0x64, + 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x42, + 0x6f, 0x64, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0d, + 0x62, 0x6f, 0x64, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x4c, 0x0a, + 0x12, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x6f, 0x6e, 0x42, 0x6f, + 0x64, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x67, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, + 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x49, 0x74, 0x65, 0x6d, + 0x12, 0x35, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0e, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4a, 0x73, 0x6f, + 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6a, 0x73, + 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x22, 0xcf, 0x03, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, + 0x6d, 0x12, 0x11, 0x0a, 0x04, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x52, 0x65, 0x66, 0x12, 0x27, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, + 0x03, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x03, 0x70, 0x75, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x70, 0x6f, 0x73, + 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x29, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x05, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfb, 0x05, 0x0a, 0x16, 0x50, 0x61, 0x74, 0x68, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x31, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x29, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, + 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x23, 0x0a, + 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, 0x6e, + 0x75, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, + 0x66, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x4f, 0x66, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x3f, 0x0a, + 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, + 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x05, + 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x31, 0x0a, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x29, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x04, 0x65, + 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x5a, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x4c, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa8, + 0x06, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x53, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, + 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, + 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfe, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2d, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x07, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x52, + 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x13, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x4e, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4a, 0x73, 0x6f, + 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6a, 0x73, + 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x11, 0x0a, 0x04, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x4f, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, + 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x23, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, + 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x59, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x6c, 0x6c, 0x5f, 0x6f, 0x66, + 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x4f, + 0x66, 0x12, 0x36, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x1b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x21, 0x0a, 0x03, + 0x78, 0x6d, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x58, 0x6d, 0x6c, 0x52, 0x03, 0x78, 0x6d, 0x6c, 0x12, + 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, + 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x29, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1f, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, 0x0a, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x39, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x5d, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0xe9, 0x04, 0x0a, 0x17, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x6d, 0x0a, 0x1d, + 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x1b, + 0x62, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x10, 0x61, + 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x48, 0x00, 0x52, 0x0e, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x18, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x69, 0x6d, + 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x16, 0x6f, 0x61, 0x75, + 0x74, 0x68, 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x18, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x16, 0x6f, 0x61, 0x75, + 0x74, 0x68, 0x32, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x67, 0x0a, 0x1b, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x48, + 0x00, 0x52, 0x19, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x1b, + 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x61, 0x75, 0x74, 0x68, 0x32, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x18, 0x6f, 0x61, 0x75, 0x74, 0x68, + 0x32, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x68, 0x0a, 0x13, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x23, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x03, + 0x54, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, + 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x08, 0x54, 0x79, 0x70, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5c, 0x0a, 0x0f, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, + 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xc8, 0x01, 0x0a, 0x03, 0x58, 0x6d, + 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x3e, 0x0a, 0x0e, 0x6f, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x5f, 0x76, 0x32, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x16, 0x2e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x32, 0xa2, 0x02, + 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_openapiv2_OpenAPIv2_proto_rawDescOnce sync.Once + file_openapiv2_OpenAPIv2_proto_rawDescData = file_openapiv2_OpenAPIv2_proto_rawDesc +) + +func file_openapiv2_OpenAPIv2_proto_rawDescGZIP() []byte { + file_openapiv2_OpenAPIv2_proto_rawDescOnce.Do(func() { + file_openapiv2_OpenAPIv2_proto_rawDescData = protoimpl.X.CompressGZIP(file_openapiv2_OpenAPIv2_proto_rawDescData) + }) + return file_openapiv2_OpenAPIv2_proto_rawDescData +} + +var file_openapiv2_OpenAPIv2_proto_msgTypes = make([]protoimpl.MessageInfo, 60) +var file_openapiv2_OpenAPIv2_proto_goTypes = []interface{}{ + (*AdditionalPropertiesItem)(nil), // 0: openapi.v2.AdditionalPropertiesItem + (*Any)(nil), // 1: openapi.v2.Any + (*ApiKeySecurity)(nil), // 2: openapi.v2.ApiKeySecurity + (*BasicAuthenticationSecurity)(nil), // 3: openapi.v2.BasicAuthenticationSecurity + (*BodyParameter)(nil), // 4: openapi.v2.BodyParameter + (*Contact)(nil), // 5: openapi.v2.Contact + (*Default)(nil), // 6: openapi.v2.Default + (*Definitions)(nil), // 7: openapi.v2.Definitions + (*Document)(nil), // 8: openapi.v2.Document + (*Examples)(nil), // 9: openapi.v2.Examples + (*ExternalDocs)(nil), // 10: openapi.v2.ExternalDocs + (*FileSchema)(nil), // 11: openapi.v2.FileSchema + (*FormDataParameterSubSchema)(nil), // 12: openapi.v2.FormDataParameterSubSchema + (*Header)(nil), // 13: openapi.v2.Header + (*HeaderParameterSubSchema)(nil), // 14: openapi.v2.HeaderParameterSubSchema + (*Headers)(nil), // 15: openapi.v2.Headers + (*Info)(nil), // 16: openapi.v2.Info + (*ItemsItem)(nil), // 17: openapi.v2.ItemsItem + (*JsonReference)(nil), // 18: openapi.v2.JsonReference + (*License)(nil), // 19: openapi.v2.License + (*NamedAny)(nil), // 20: openapi.v2.NamedAny + (*NamedHeader)(nil), // 21: openapi.v2.NamedHeader + (*NamedParameter)(nil), // 22: openapi.v2.NamedParameter + (*NamedPathItem)(nil), // 23: openapi.v2.NamedPathItem + (*NamedResponse)(nil), // 24: openapi.v2.NamedResponse + (*NamedResponseValue)(nil), // 25: openapi.v2.NamedResponseValue + (*NamedSchema)(nil), // 26: openapi.v2.NamedSchema + (*NamedSecurityDefinitionsItem)(nil), // 27: openapi.v2.NamedSecurityDefinitionsItem + (*NamedString)(nil), // 28: openapi.v2.NamedString + (*NamedStringArray)(nil), // 29: openapi.v2.NamedStringArray + (*NonBodyParameter)(nil), // 30: openapi.v2.NonBodyParameter + (*Oauth2AccessCodeSecurity)(nil), // 31: openapi.v2.Oauth2AccessCodeSecurity + (*Oauth2ApplicationSecurity)(nil), // 32: openapi.v2.Oauth2ApplicationSecurity + (*Oauth2ImplicitSecurity)(nil), // 33: openapi.v2.Oauth2ImplicitSecurity + (*Oauth2PasswordSecurity)(nil), // 34: openapi.v2.Oauth2PasswordSecurity + (*Oauth2Scopes)(nil), // 35: openapi.v2.Oauth2Scopes + (*Operation)(nil), // 36: openapi.v2.Operation + (*Parameter)(nil), // 37: openapi.v2.Parameter + (*ParameterDefinitions)(nil), // 38: openapi.v2.ParameterDefinitions + (*ParametersItem)(nil), // 39: openapi.v2.ParametersItem + (*PathItem)(nil), // 40: openapi.v2.PathItem + (*PathParameterSubSchema)(nil), // 41: openapi.v2.PathParameterSubSchema + (*Paths)(nil), // 42: openapi.v2.Paths + (*PrimitivesItems)(nil), // 43: openapi.v2.PrimitivesItems + (*Properties)(nil), // 44: openapi.v2.Properties + (*QueryParameterSubSchema)(nil), // 45: openapi.v2.QueryParameterSubSchema + (*Response)(nil), // 46: openapi.v2.Response + (*ResponseDefinitions)(nil), // 47: openapi.v2.ResponseDefinitions + (*ResponseValue)(nil), // 48: openapi.v2.ResponseValue + (*Responses)(nil), // 49: openapi.v2.Responses + (*Schema)(nil), // 50: openapi.v2.Schema + (*SchemaItem)(nil), // 51: openapi.v2.SchemaItem + (*SecurityDefinitions)(nil), // 52: openapi.v2.SecurityDefinitions + (*SecurityDefinitionsItem)(nil), // 53: openapi.v2.SecurityDefinitionsItem + (*SecurityRequirement)(nil), // 54: openapi.v2.SecurityRequirement + (*StringArray)(nil), // 55: openapi.v2.StringArray + (*Tag)(nil), // 56: openapi.v2.Tag + (*TypeItem)(nil), // 57: openapi.v2.TypeItem + (*VendorExtension)(nil), // 58: openapi.v2.VendorExtension + (*Xml)(nil), // 59: openapi.v2.Xml + (*anypb.Any)(nil), // 60: google.protobuf.Any +} +var file_openapiv2_OpenAPIv2_proto_depIdxs = []int32{ + 50, // 0: openapi.v2.AdditionalPropertiesItem.schema:type_name -> openapi.v2.Schema + 60, // 1: openapi.v2.Any.value:type_name -> google.protobuf.Any + 20, // 2: openapi.v2.ApiKeySecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 3: openapi.v2.BasicAuthenticationSecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 50, // 4: openapi.v2.BodyParameter.schema:type_name -> openapi.v2.Schema + 20, // 5: openapi.v2.BodyParameter.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 6: openapi.v2.Contact.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 7: openapi.v2.Default.additional_properties:type_name -> openapi.v2.NamedAny + 26, // 8: openapi.v2.Definitions.additional_properties:type_name -> openapi.v2.NamedSchema + 16, // 9: openapi.v2.Document.info:type_name -> openapi.v2.Info + 42, // 10: openapi.v2.Document.paths:type_name -> openapi.v2.Paths + 7, // 11: openapi.v2.Document.definitions:type_name -> openapi.v2.Definitions + 38, // 12: openapi.v2.Document.parameters:type_name -> openapi.v2.ParameterDefinitions + 47, // 13: openapi.v2.Document.responses:type_name -> openapi.v2.ResponseDefinitions + 54, // 14: openapi.v2.Document.security:type_name -> openapi.v2.SecurityRequirement + 52, // 15: openapi.v2.Document.security_definitions:type_name -> openapi.v2.SecurityDefinitions + 56, // 16: openapi.v2.Document.tags:type_name -> openapi.v2.Tag + 10, // 17: openapi.v2.Document.external_docs:type_name -> openapi.v2.ExternalDocs + 20, // 18: openapi.v2.Document.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 19: openapi.v2.Examples.additional_properties:type_name -> openapi.v2.NamedAny + 20, // 20: openapi.v2.ExternalDocs.vendor_extension:type_name -> openapi.v2.NamedAny + 1, // 21: openapi.v2.FileSchema.default:type_name -> openapi.v2.Any + 10, // 22: openapi.v2.FileSchema.external_docs:type_name -> openapi.v2.ExternalDocs + 1, // 23: openapi.v2.FileSchema.example:type_name -> openapi.v2.Any + 20, // 24: openapi.v2.FileSchema.vendor_extension:type_name -> openapi.v2.NamedAny + 43, // 25: openapi.v2.FormDataParameterSubSchema.items:type_name -> openapi.v2.PrimitivesItems + 1, // 26: openapi.v2.FormDataParameterSubSchema.default:type_name -> openapi.v2.Any + 1, // 27: openapi.v2.FormDataParameterSubSchema.enum:type_name -> openapi.v2.Any + 20, // 28: openapi.v2.FormDataParameterSubSchema.vendor_extension:type_name -> openapi.v2.NamedAny + 43, // 29: openapi.v2.Header.items:type_name -> openapi.v2.PrimitivesItems + 1, // 30: openapi.v2.Header.default:type_name -> openapi.v2.Any + 1, // 31: openapi.v2.Header.enum:type_name -> openapi.v2.Any + 20, // 32: openapi.v2.Header.vendor_extension:type_name -> openapi.v2.NamedAny + 43, // 33: openapi.v2.HeaderParameterSubSchema.items:type_name -> openapi.v2.PrimitivesItems + 1, // 34: openapi.v2.HeaderParameterSubSchema.default:type_name -> openapi.v2.Any + 1, // 35: openapi.v2.HeaderParameterSubSchema.enum:type_name -> openapi.v2.Any + 20, // 36: openapi.v2.HeaderParameterSubSchema.vendor_extension:type_name -> openapi.v2.NamedAny + 21, // 37: openapi.v2.Headers.additional_properties:type_name -> openapi.v2.NamedHeader + 5, // 38: openapi.v2.Info.contact:type_name -> openapi.v2.Contact + 19, // 39: openapi.v2.Info.license:type_name -> openapi.v2.License + 20, // 40: openapi.v2.Info.vendor_extension:type_name -> openapi.v2.NamedAny + 50, // 41: openapi.v2.ItemsItem.schema:type_name -> openapi.v2.Schema + 20, // 42: openapi.v2.License.vendor_extension:type_name -> openapi.v2.NamedAny + 1, // 43: openapi.v2.NamedAny.value:type_name -> openapi.v2.Any + 13, // 44: openapi.v2.NamedHeader.value:type_name -> openapi.v2.Header + 37, // 45: openapi.v2.NamedParameter.value:type_name -> openapi.v2.Parameter + 40, // 46: openapi.v2.NamedPathItem.value:type_name -> openapi.v2.PathItem + 46, // 47: openapi.v2.NamedResponse.value:type_name -> openapi.v2.Response + 48, // 48: openapi.v2.NamedResponseValue.value:type_name -> openapi.v2.ResponseValue + 50, // 49: openapi.v2.NamedSchema.value:type_name -> openapi.v2.Schema + 53, // 50: openapi.v2.NamedSecurityDefinitionsItem.value:type_name -> openapi.v2.SecurityDefinitionsItem + 55, // 51: openapi.v2.NamedStringArray.value:type_name -> openapi.v2.StringArray + 14, // 52: openapi.v2.NonBodyParameter.header_parameter_sub_schema:type_name -> openapi.v2.HeaderParameterSubSchema + 12, // 53: openapi.v2.NonBodyParameter.form_data_parameter_sub_schema:type_name -> openapi.v2.FormDataParameterSubSchema + 45, // 54: openapi.v2.NonBodyParameter.query_parameter_sub_schema:type_name -> openapi.v2.QueryParameterSubSchema + 41, // 55: openapi.v2.NonBodyParameter.path_parameter_sub_schema:type_name -> openapi.v2.PathParameterSubSchema + 35, // 56: openapi.v2.Oauth2AccessCodeSecurity.scopes:type_name -> openapi.v2.Oauth2Scopes + 20, // 57: openapi.v2.Oauth2AccessCodeSecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 35, // 58: openapi.v2.Oauth2ApplicationSecurity.scopes:type_name -> openapi.v2.Oauth2Scopes + 20, // 59: openapi.v2.Oauth2ApplicationSecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 35, // 60: openapi.v2.Oauth2ImplicitSecurity.scopes:type_name -> openapi.v2.Oauth2Scopes + 20, // 61: openapi.v2.Oauth2ImplicitSecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 35, // 62: openapi.v2.Oauth2PasswordSecurity.scopes:type_name -> openapi.v2.Oauth2Scopes + 20, // 63: openapi.v2.Oauth2PasswordSecurity.vendor_extension:type_name -> openapi.v2.NamedAny + 28, // 64: openapi.v2.Oauth2Scopes.additional_properties:type_name -> openapi.v2.NamedString + 10, // 65: openapi.v2.Operation.external_docs:type_name -> openapi.v2.ExternalDocs + 39, // 66: openapi.v2.Operation.parameters:type_name -> openapi.v2.ParametersItem + 49, // 67: openapi.v2.Operation.responses:type_name -> openapi.v2.Responses + 54, // 68: openapi.v2.Operation.security:type_name -> openapi.v2.SecurityRequirement + 20, // 69: openapi.v2.Operation.vendor_extension:type_name -> openapi.v2.NamedAny + 4, // 70: openapi.v2.Parameter.body_parameter:type_name -> openapi.v2.BodyParameter + 30, // 71: openapi.v2.Parameter.non_body_parameter:type_name -> openapi.v2.NonBodyParameter + 22, // 72: openapi.v2.ParameterDefinitions.additional_properties:type_name -> openapi.v2.NamedParameter + 37, // 73: openapi.v2.ParametersItem.parameter:type_name -> openapi.v2.Parameter + 18, // 74: openapi.v2.ParametersItem.json_reference:type_name -> openapi.v2.JsonReference + 36, // 75: openapi.v2.PathItem.get:type_name -> openapi.v2.Operation + 36, // 76: openapi.v2.PathItem.put:type_name -> openapi.v2.Operation + 36, // 77: openapi.v2.PathItem.post:type_name -> openapi.v2.Operation + 36, // 78: openapi.v2.PathItem.delete:type_name -> openapi.v2.Operation + 36, // 79: openapi.v2.PathItem.options:type_name -> openapi.v2.Operation + 36, // 80: openapi.v2.PathItem.head:type_name -> openapi.v2.Operation + 36, // 81: openapi.v2.PathItem.patch:type_name -> openapi.v2.Operation + 39, // 82: openapi.v2.PathItem.parameters:type_name -> openapi.v2.ParametersItem + 20, // 83: openapi.v2.PathItem.vendor_extension:type_name -> openapi.v2.NamedAny + 43, // 84: openapi.v2.PathParameterSubSchema.items:type_name -> openapi.v2.PrimitivesItems + 1, // 85: openapi.v2.PathParameterSubSchema.default:type_name -> openapi.v2.Any + 1, // 86: openapi.v2.PathParameterSubSchema.enum:type_name -> openapi.v2.Any + 20, // 87: openapi.v2.PathParameterSubSchema.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 88: openapi.v2.Paths.vendor_extension:type_name -> openapi.v2.NamedAny + 23, // 89: openapi.v2.Paths.path:type_name -> openapi.v2.NamedPathItem + 43, // 90: openapi.v2.PrimitivesItems.items:type_name -> openapi.v2.PrimitivesItems + 1, // 91: openapi.v2.PrimitivesItems.default:type_name -> openapi.v2.Any + 1, // 92: openapi.v2.PrimitivesItems.enum:type_name -> openapi.v2.Any + 20, // 93: openapi.v2.PrimitivesItems.vendor_extension:type_name -> openapi.v2.NamedAny + 26, // 94: openapi.v2.Properties.additional_properties:type_name -> openapi.v2.NamedSchema + 43, // 95: openapi.v2.QueryParameterSubSchema.items:type_name -> openapi.v2.PrimitivesItems + 1, // 96: openapi.v2.QueryParameterSubSchema.default:type_name -> openapi.v2.Any + 1, // 97: openapi.v2.QueryParameterSubSchema.enum:type_name -> openapi.v2.Any + 20, // 98: openapi.v2.QueryParameterSubSchema.vendor_extension:type_name -> openapi.v2.NamedAny + 51, // 99: openapi.v2.Response.schema:type_name -> openapi.v2.SchemaItem + 15, // 100: openapi.v2.Response.headers:type_name -> openapi.v2.Headers + 9, // 101: openapi.v2.Response.examples:type_name -> openapi.v2.Examples + 20, // 102: openapi.v2.Response.vendor_extension:type_name -> openapi.v2.NamedAny + 24, // 103: openapi.v2.ResponseDefinitions.additional_properties:type_name -> openapi.v2.NamedResponse + 46, // 104: openapi.v2.ResponseValue.response:type_name -> openapi.v2.Response + 18, // 105: openapi.v2.ResponseValue.json_reference:type_name -> openapi.v2.JsonReference + 25, // 106: openapi.v2.Responses.response_code:type_name -> openapi.v2.NamedResponseValue + 20, // 107: openapi.v2.Responses.vendor_extension:type_name -> openapi.v2.NamedAny + 1, // 108: openapi.v2.Schema.default:type_name -> openapi.v2.Any + 1, // 109: openapi.v2.Schema.enum:type_name -> openapi.v2.Any + 0, // 110: openapi.v2.Schema.additional_properties:type_name -> openapi.v2.AdditionalPropertiesItem + 57, // 111: openapi.v2.Schema.type:type_name -> openapi.v2.TypeItem + 17, // 112: openapi.v2.Schema.items:type_name -> openapi.v2.ItemsItem + 50, // 113: openapi.v2.Schema.all_of:type_name -> openapi.v2.Schema + 44, // 114: openapi.v2.Schema.properties:type_name -> openapi.v2.Properties + 59, // 115: openapi.v2.Schema.xml:type_name -> openapi.v2.Xml + 10, // 116: openapi.v2.Schema.external_docs:type_name -> openapi.v2.ExternalDocs + 1, // 117: openapi.v2.Schema.example:type_name -> openapi.v2.Any + 20, // 118: openapi.v2.Schema.vendor_extension:type_name -> openapi.v2.NamedAny + 50, // 119: openapi.v2.SchemaItem.schema:type_name -> openapi.v2.Schema + 11, // 120: openapi.v2.SchemaItem.file_schema:type_name -> openapi.v2.FileSchema + 27, // 121: openapi.v2.SecurityDefinitions.additional_properties:type_name -> openapi.v2.NamedSecurityDefinitionsItem + 3, // 122: openapi.v2.SecurityDefinitionsItem.basic_authentication_security:type_name -> openapi.v2.BasicAuthenticationSecurity + 2, // 123: openapi.v2.SecurityDefinitionsItem.api_key_security:type_name -> openapi.v2.ApiKeySecurity + 33, // 124: openapi.v2.SecurityDefinitionsItem.oauth2_implicit_security:type_name -> openapi.v2.Oauth2ImplicitSecurity + 34, // 125: openapi.v2.SecurityDefinitionsItem.oauth2_password_security:type_name -> openapi.v2.Oauth2PasswordSecurity + 32, // 126: openapi.v2.SecurityDefinitionsItem.oauth2_application_security:type_name -> openapi.v2.Oauth2ApplicationSecurity + 31, // 127: openapi.v2.SecurityDefinitionsItem.oauth2_access_code_security:type_name -> openapi.v2.Oauth2AccessCodeSecurity + 29, // 128: openapi.v2.SecurityRequirement.additional_properties:type_name -> openapi.v2.NamedStringArray + 10, // 129: openapi.v2.Tag.external_docs:type_name -> openapi.v2.ExternalDocs + 20, // 130: openapi.v2.Tag.vendor_extension:type_name -> openapi.v2.NamedAny + 20, // 131: openapi.v2.VendorExtension.additional_properties:type_name -> openapi.v2.NamedAny + 20, // 132: openapi.v2.Xml.vendor_extension:type_name -> openapi.v2.NamedAny + 133, // [133:133] is the sub-list for method output_type + 133, // [133:133] is the sub-list for method input_type + 133, // [133:133] is the sub-list for extension type_name + 133, // [133:133] is the sub-list for extension extendee + 0, // [0:133] is the sub-list for field type_name +} + +func init() { file_openapiv2_OpenAPIv2_proto_init() } +func file_openapiv2_OpenAPIv2_proto_init() { + if File_openapiv2_OpenAPIv2_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_openapiv2_OpenAPIv2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AdditionalPropertiesItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Any); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApiKeySecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BasicAuthenticationSecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BodyParameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Contact); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Default); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Definitions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Document); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Examples); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExternalDocs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FormDataParameterSubSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Header); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeaderParameterSubSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Headers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Info); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ItemsItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JsonReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedAny); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedParameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedPathItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedResponseValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedSecurityDefinitionsItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedString); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedStringArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NonBodyParameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Oauth2AccessCodeSecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Oauth2ApplicationSecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Oauth2ImplicitSecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Oauth2PasswordSecurity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Oauth2Scopes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Operation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Parameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParameterDefinitions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParametersItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PathItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PathParameterSubSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Paths); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrimitivesItems); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Properties); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryParameterSubSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponseDefinitions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponseValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Responses); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Schema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchemaItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityDefinitions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityDefinitionsItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityRequirement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TypeItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VendorExtension); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Xml); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_openapiv2_OpenAPIv2_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*AdditionalPropertiesItem_Schema)(nil), + (*AdditionalPropertiesItem_Boolean)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[30].OneofWrappers = []interface{}{ + (*NonBodyParameter_HeaderParameterSubSchema)(nil), + (*NonBodyParameter_FormDataParameterSubSchema)(nil), + (*NonBodyParameter_QueryParameterSubSchema)(nil), + (*NonBodyParameter_PathParameterSubSchema)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[37].OneofWrappers = []interface{}{ + (*Parameter_BodyParameter)(nil), + (*Parameter_NonBodyParameter)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[39].OneofWrappers = []interface{}{ + (*ParametersItem_Parameter)(nil), + (*ParametersItem_JsonReference)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[48].OneofWrappers = []interface{}{ + (*ResponseValue_Response)(nil), + (*ResponseValue_JsonReference)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[51].OneofWrappers = []interface{}{ + (*SchemaItem_Schema)(nil), + (*SchemaItem_FileSchema)(nil), + } + file_openapiv2_OpenAPIv2_proto_msgTypes[53].OneofWrappers = []interface{}{ + (*SecurityDefinitionsItem_BasicAuthenticationSecurity)(nil), + (*SecurityDefinitionsItem_ApiKeySecurity)(nil), + (*SecurityDefinitionsItem_Oauth2ImplicitSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2PasswordSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2ApplicationSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_openapiv2_OpenAPIv2_proto_rawDesc, + NumEnums: 0, + NumMessages: 60, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_openapiv2_OpenAPIv2_proto_goTypes, + DependencyIndexes: file_openapiv2_OpenAPIv2_proto_depIdxs, + MessageInfos: file_openapiv2_OpenAPIv2_proto_msgTypes, + }.Build() + File_openapiv2_OpenAPIv2_proto = out.File + file_openapiv2_OpenAPIv2_proto_rawDesc = nil + file_openapiv2_OpenAPIv2_proto_goTypes = nil + file_openapiv2_OpenAPIv2_proto_depIdxs = nil +} diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto new file mode 100644 index 000000000..1c59b2f4a --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto @@ -0,0 +1,666 @@ +// Copyright 2020 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +syntax = "proto3"; + +package openapi.v2; + +import "google/protobuf/any.proto"; + +// This option lets the proto compiler generate Java code inside the package +// name (see below) instead of inside an outer class. It creates a simpler +// developer experience by reducing one-level of name nesting and be +// consistent with most programming languages that don't support outer classes. +option java_multiple_files = true; + +// The Java outer classname should be the filename in UpperCamelCase. This +// class is only used to hold proto descriptor, so developers don't need to +// work with it directly. +option java_outer_classname = "OpenAPIProto"; + +// The Java package name must be proto package name with proper prefix. +option java_package = "org.openapi_v2"; + +// A reasonable prefix for the Objective-C symbols generated from the package. +// It should at a minimum be 3 characters long, all uppercase, and convention +// is to use an abbreviation of the package name. Something short, but +// hopefully unique enough to not conflict with things that may come along in +// the future. 'GPB' is reserved for the protocol buffer implementation itself. +option objc_class_prefix = "OAS"; + +// The Go package name. +option go_package = "./openapiv2;openapi_v2"; + +message AdditionalPropertiesItem { + oneof oneof { + Schema schema = 1; + bool boolean = 2; + } +} + +message Any { + google.protobuf.Any value = 1; + string yaml = 2; +} + +message ApiKeySecurity { + string type = 1; + string name = 2; + string in = 3; + string description = 4; + repeated NamedAny vendor_extension = 5; +} + +message BasicAuthenticationSecurity { + string type = 1; + string description = 2; + repeated NamedAny vendor_extension = 3; +} + +message BodyParameter { + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + string description = 1; + // The name of the parameter. + string name = 2; + // Determines the location of the parameter. + string in = 3; + // Determines whether or not this parameter is required or optional. + bool required = 4; + Schema schema = 5; + repeated NamedAny vendor_extension = 6; +} + +// Contact information for the owners of the API. +message Contact { + // The identifying name of the contact person/organization. + string name = 1; + // The URL pointing to the contact information. + string url = 2; + // The email address of the contact person/organization. + string email = 3; + repeated NamedAny vendor_extension = 4; +} + +message Default { + repeated NamedAny additional_properties = 1; +} + +// One or more JSON objects describing the schemas being consumed and produced by the API. +message Definitions { + repeated NamedSchema additional_properties = 1; +} + +message Document { + // The Swagger version of this document. + string swagger = 1; + Info info = 2; + // The host (name or ip) of the API. Example: 'swagger.io' + string host = 3; + // The base path to the API. Example: '/api'. + string base_path = 4; + // The transfer protocol of the API. + repeated string schemes = 5; + // A list of MIME types accepted by the API. + repeated string consumes = 6; + // A list of MIME types the API can produce. + repeated string produces = 7; + Paths paths = 8; + Definitions definitions = 9; + ParameterDefinitions parameters = 10; + ResponseDefinitions responses = 11; + repeated SecurityRequirement security = 12; + SecurityDefinitions security_definitions = 13; + repeated Tag tags = 14; + ExternalDocs external_docs = 15; + repeated NamedAny vendor_extension = 16; +} + +message Examples { + repeated NamedAny additional_properties = 1; +} + +// information about external documentation +message ExternalDocs { + string description = 1; + string url = 2; + repeated NamedAny vendor_extension = 3; +} + +// A deterministic version of a JSON Schema object. +message FileSchema { + string format = 1; + string title = 2; + string description = 3; + Any default = 4; + repeated string required = 5; + string type = 6; + bool read_only = 7; + ExternalDocs external_docs = 8; + Any example = 9; + repeated NamedAny vendor_extension = 10; +} + +message FormDataParameterSubSchema { + // Determines whether or not this parameter is required or optional. + bool required = 1; + // Determines the location of the parameter. + string in = 2; + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + string description = 3; + // The name of the parameter. + string name = 4; + // allows sending a parameter by name only or with an empty value. + bool allow_empty_value = 5; + string type = 6; + string format = 7; + PrimitivesItems items = 8; + string collection_format = 9; + Any default = 10; + double maximum = 11; + bool exclusive_maximum = 12; + double minimum = 13; + bool exclusive_minimum = 14; + int64 max_length = 15; + int64 min_length = 16; + string pattern = 17; + int64 max_items = 18; + int64 min_items = 19; + bool unique_items = 20; + repeated Any enum = 21; + double multiple_of = 22; + repeated NamedAny vendor_extension = 23; +} + +message Header { + string type = 1; + string format = 2; + PrimitivesItems items = 3; + string collection_format = 4; + Any default = 5; + double maximum = 6; + bool exclusive_maximum = 7; + double minimum = 8; + bool exclusive_minimum = 9; + int64 max_length = 10; + int64 min_length = 11; + string pattern = 12; + int64 max_items = 13; + int64 min_items = 14; + bool unique_items = 15; + repeated Any enum = 16; + double multiple_of = 17; + string description = 18; + repeated NamedAny vendor_extension = 19; +} + +message HeaderParameterSubSchema { + // Determines whether or not this parameter is required or optional. + bool required = 1; + // Determines the location of the parameter. + string in = 2; + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + string description = 3; + // The name of the parameter. + string name = 4; + string type = 5; + string format = 6; + PrimitivesItems items = 7; + string collection_format = 8; + Any default = 9; + double maximum = 10; + bool exclusive_maximum = 11; + double minimum = 12; + bool exclusive_minimum = 13; + int64 max_length = 14; + int64 min_length = 15; + string pattern = 16; + int64 max_items = 17; + int64 min_items = 18; + bool unique_items = 19; + repeated Any enum = 20; + double multiple_of = 21; + repeated NamedAny vendor_extension = 22; +} + +message Headers { + repeated NamedHeader additional_properties = 1; +} + +// General information about the API. +message Info { + // A unique and precise title of the API. + string title = 1; + // A semantic version number of the API. + string version = 2; + // A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed. + string description = 3; + // The terms of service for the API. + string terms_of_service = 4; + Contact contact = 5; + License license = 6; + repeated NamedAny vendor_extension = 7; +} + +message ItemsItem { + repeated Schema schema = 1; +} + +message JsonReference { + string _ref = 1; + string description = 2; +} + +message License { + // The name of the license type. It's encouraged to use an OSI compatible license. + string name = 1; + // The URL pointing to the license. + string url = 2; + repeated NamedAny vendor_extension = 3; +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +message NamedAny { + // Map key + string name = 1; + // Mapped value + Any value = 2; +} + +// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs. +message NamedHeader { + // Map key + string name = 1; + // Mapped value + Header value = 2; +} + +// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. +message NamedParameter { + // Map key + string name = 1; + // Mapped value + Parameter value = 2; +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +message NamedPathItem { + // Map key + string name = 1; + // Mapped value + PathItem value = 2; +} + +// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs. +message NamedResponse { + // Map key + string name = 1; + // Mapped value + Response value = 2; +} + +// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs. +message NamedResponseValue { + // Map key + string name = 1; + // Mapped value + ResponseValue value = 2; +} + +// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. +message NamedSchema { + // Map key + string name = 1; + // Mapped value + Schema value = 2; +} + +// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs. +message NamedSecurityDefinitionsItem { + // Map key + string name = 1; + // Mapped value + SecurityDefinitionsItem value = 2; +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +message NamedString { + // Map key + string name = 1; + // Mapped value + string value = 2; +} + +// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. +message NamedStringArray { + // Map key + string name = 1; + // Mapped value + StringArray value = 2; +} + +message NonBodyParameter { + oneof oneof { + HeaderParameterSubSchema header_parameter_sub_schema = 1; + FormDataParameterSubSchema form_data_parameter_sub_schema = 2; + QueryParameterSubSchema query_parameter_sub_schema = 3; + PathParameterSubSchema path_parameter_sub_schema = 4; + } +} + +message Oauth2AccessCodeSecurity { + string type = 1; + string flow = 2; + Oauth2Scopes scopes = 3; + string authorization_url = 4; + string token_url = 5; + string description = 6; + repeated NamedAny vendor_extension = 7; +} + +message Oauth2ApplicationSecurity { + string type = 1; + string flow = 2; + Oauth2Scopes scopes = 3; + string token_url = 4; + string description = 5; + repeated NamedAny vendor_extension = 6; +} + +message Oauth2ImplicitSecurity { + string type = 1; + string flow = 2; + Oauth2Scopes scopes = 3; + string authorization_url = 4; + string description = 5; + repeated NamedAny vendor_extension = 6; +} + +message Oauth2PasswordSecurity { + string type = 1; + string flow = 2; + Oauth2Scopes scopes = 3; + string token_url = 4; + string description = 5; + repeated NamedAny vendor_extension = 6; +} + +message Oauth2Scopes { + repeated NamedString additional_properties = 1; +} + +message Operation { + repeated string tags = 1; + // A brief summary of the operation. + string summary = 2; + // A longer description of the operation, GitHub Flavored Markdown is allowed. + string description = 3; + ExternalDocs external_docs = 4; + // A unique identifier of the operation. + string operation_id = 5; + // A list of MIME types the API can produce. + repeated string produces = 6; + // A list of MIME types the API can consume. + repeated string consumes = 7; + // The parameters needed to send a valid API call. + repeated ParametersItem parameters = 8; + Responses responses = 9; + // The transfer protocol of the API. + repeated string schemes = 10; + bool deprecated = 11; + repeated SecurityRequirement security = 12; + repeated NamedAny vendor_extension = 13; +} + +message Parameter { + oneof oneof { + BodyParameter body_parameter = 1; + NonBodyParameter non_body_parameter = 2; + } +} + +// One or more JSON representations for parameters +message ParameterDefinitions { + repeated NamedParameter additional_properties = 1; +} + +message ParametersItem { + oneof oneof { + Parameter parameter = 1; + JsonReference json_reference = 2; + } +} + +message PathItem { + string _ref = 1; + Operation get = 2; + Operation put = 3; + Operation post = 4; + Operation delete = 5; + Operation options = 6; + Operation head = 7; + Operation patch = 8; + // The parameters needed to send a valid API call. + repeated ParametersItem parameters = 9; + repeated NamedAny vendor_extension = 10; +} + +message PathParameterSubSchema { + // Determines whether or not this parameter is required or optional. + bool required = 1; + // Determines the location of the parameter. + string in = 2; + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + string description = 3; + // The name of the parameter. + string name = 4; + string type = 5; + string format = 6; + PrimitivesItems items = 7; + string collection_format = 8; + Any default = 9; + double maximum = 10; + bool exclusive_maximum = 11; + double minimum = 12; + bool exclusive_minimum = 13; + int64 max_length = 14; + int64 min_length = 15; + string pattern = 16; + int64 max_items = 17; + int64 min_items = 18; + bool unique_items = 19; + repeated Any enum = 20; + double multiple_of = 21; + repeated NamedAny vendor_extension = 22; +} + +// Relative paths to the individual endpoints. They must be relative to the 'basePath'. +message Paths { + repeated NamedAny vendor_extension = 1; + repeated NamedPathItem path = 2; +} + +message PrimitivesItems { + string type = 1; + string format = 2; + PrimitivesItems items = 3; + string collection_format = 4; + Any default = 5; + double maximum = 6; + bool exclusive_maximum = 7; + double minimum = 8; + bool exclusive_minimum = 9; + int64 max_length = 10; + int64 min_length = 11; + string pattern = 12; + int64 max_items = 13; + int64 min_items = 14; + bool unique_items = 15; + repeated Any enum = 16; + double multiple_of = 17; + repeated NamedAny vendor_extension = 18; +} + +message Properties { + repeated NamedSchema additional_properties = 1; +} + +message QueryParameterSubSchema { + // Determines whether or not this parameter is required or optional. + bool required = 1; + // Determines the location of the parameter. + string in = 2; + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + string description = 3; + // The name of the parameter. + string name = 4; + // allows sending a parameter by name only or with an empty value. + bool allow_empty_value = 5; + string type = 6; + string format = 7; + PrimitivesItems items = 8; + string collection_format = 9; + Any default = 10; + double maximum = 11; + bool exclusive_maximum = 12; + double minimum = 13; + bool exclusive_minimum = 14; + int64 max_length = 15; + int64 min_length = 16; + string pattern = 17; + int64 max_items = 18; + int64 min_items = 19; + bool unique_items = 20; + repeated Any enum = 21; + double multiple_of = 22; + repeated NamedAny vendor_extension = 23; +} + +message Response { + string description = 1; + SchemaItem schema = 2; + Headers headers = 3; + Examples examples = 4; + repeated NamedAny vendor_extension = 5; +} + +// One or more JSON representations for responses +message ResponseDefinitions { + repeated NamedResponse additional_properties = 1; +} + +message ResponseValue { + oneof oneof { + Response response = 1; + JsonReference json_reference = 2; + } +} + +// Response objects names can either be any valid HTTP status code or 'default'. +message Responses { + repeated NamedResponseValue response_code = 1; + repeated NamedAny vendor_extension = 2; +} + +// A deterministic version of a JSON Schema object. +message Schema { + string _ref = 1; + string format = 2; + string title = 3; + string description = 4; + Any default = 5; + double multiple_of = 6; + double maximum = 7; + bool exclusive_maximum = 8; + double minimum = 9; + bool exclusive_minimum = 10; + int64 max_length = 11; + int64 min_length = 12; + string pattern = 13; + int64 max_items = 14; + int64 min_items = 15; + bool unique_items = 16; + int64 max_properties = 17; + int64 min_properties = 18; + repeated string required = 19; + repeated Any enum = 20; + AdditionalPropertiesItem additional_properties = 21; + TypeItem type = 22; + ItemsItem items = 23; + repeated Schema all_of = 24; + Properties properties = 25; + string discriminator = 26; + bool read_only = 27; + Xml xml = 28; + ExternalDocs external_docs = 29; + Any example = 30; + repeated NamedAny vendor_extension = 31; +} + +message SchemaItem { + oneof oneof { + Schema schema = 1; + FileSchema file_schema = 2; + } +} + +message SecurityDefinitions { + repeated NamedSecurityDefinitionsItem additional_properties = 1; +} + +message SecurityDefinitionsItem { + oneof oneof { + BasicAuthenticationSecurity basic_authentication_security = 1; + ApiKeySecurity api_key_security = 2; + Oauth2ImplicitSecurity oauth2_implicit_security = 3; + Oauth2PasswordSecurity oauth2_password_security = 4; + Oauth2ApplicationSecurity oauth2_application_security = 5; + Oauth2AccessCodeSecurity oauth2_access_code_security = 6; + } +} + +message SecurityRequirement { + repeated NamedStringArray additional_properties = 1; +} + +message StringArray { + repeated string value = 1; +} + +message Tag { + string name = 1; + string description = 2; + ExternalDocs external_docs = 3; + repeated NamedAny vendor_extension = 4; +} + +message TypeItem { + repeated string value = 1; +} + +// Any property starting with x- is valid. +message VendorExtension { + repeated NamedAny additional_properties = 1; +} + +message Xml { + string name = 1; + string namespace = 2; + string prefix = 3; + bool attribute = 4; + bool wrapped = 5; + repeated NamedAny vendor_extension = 6; +} + diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/README.md b/tools/vendor/github.com/google/gnostic-models/openapiv2/README.md new file mode 100644 index 000000000..5276128d3 --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/README.md @@ -0,0 +1,14 @@ +# OpenAPI v2 Protocol Buffer Models + +This directory contains a Protocol Buffer-language model and related code for +supporting OpenAPI v2. + +Gnostic applications and plugins can use OpenAPIv2.proto to generate Protocol +Buffer support code for their preferred languages. + +OpenAPIv2.go is used by Gnostic to read JSON and YAML OpenAPI descriptions into +the Protocol Buffer-based datastructures generated from OpenAPIv2.proto. + +OpenAPIv2.proto and OpenAPIv2.go are generated by the Gnostic compiler +generator, and OpenAPIv2.pb.go is generated by protoc, the Protocol Buffer +compiler, and protoc-gen-go, the Protocol Buffer Go code generation plugin. diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/document.go b/tools/vendor/github.com/google/gnostic-models/openapiv2/document.go new file mode 100644 index 000000000..e96ac0d6d --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/document.go @@ -0,0 +1,42 @@ +// Copyright 2020 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 openapi_v2 + +import ( + "gopkg.in/yaml.v3" + + "github.com/google/gnostic-models/compiler" +) + +// ParseDocument reads an OpenAPI v2 description from a YAML/JSON representation. +func ParseDocument(b []byte) (*Document, error) { + info, err := compiler.ReadInfoFromBytes("", b) + if err != nil { + return nil, err + } + root := info.Content[0] + return NewDocument(root, compiler.NewContextWithExtensions("$root", root, nil, nil)) +} + +// YAMLValue produces a serialized YAML representation of the document. +func (d *Document) YAMLValue(comment string) ([]byte, error) { + rawInfo := d.ToRawInfo() + rawInfo = &yaml.Node{ + Kind: yaml.DocumentNode, + Content: []*yaml.Node{rawInfo}, + HeadComment: comment, + } + return yaml.Marshal(rawInfo) +} diff --git a/tools/vendor/github.com/google/gnostic-models/openapiv2/openapi-2.0.json b/tools/vendor/github.com/google/gnostic-models/openapiv2/openapi-2.0.json new file mode 100644 index 000000000..afa12b79b --- /dev/null +++ b/tools/vendor/github.com/google/gnostic-models/openapiv2/openapi-2.0.json @@ -0,0 +1,1610 @@ +{ + "title": "A JSON Schema for Swagger 2.0 API.", + "id": "http://swagger.io/v2/schema.json#", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "required": [ + "swagger", + "info", + "paths" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "swagger": { + "type": "string", + "enum": [ + "2.0" + ], + "description": "The Swagger version of this document." + }, + "info": { + "$ref": "#/definitions/info" + }, + "host": { + "type": "string", + "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", + "description": "The host (name or ip) of the API. Example: 'swagger.io'" + }, + "basePath": { + "type": "string", + "pattern": "^/", + "description": "The base path to the API. Example: '/api'." + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "consumes": { + "description": "A list of MIME types accepted by the API.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "paths": { + "$ref": "#/definitions/paths" + }, + "definitions": { + "$ref": "#/definitions/definitions" + }, + "parameters": { + "$ref": "#/definitions/parameterDefinitions" + }, + "responses": { + "$ref": "#/definitions/responseDefinitions" + }, + "security": { + "$ref": "#/definitions/security" + }, + "securityDefinitions": { + "$ref": "#/definitions/securityDefinitions" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/tag" + }, + "uniqueItems": true + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "definitions": { + "info": { + "type": "object", + "description": "General information about the API.", + "required": [ + "version", + "title" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "title": { + "type": "string", + "description": "A unique and precise title of the API." + }, + "version": { + "type": "string", + "description": "A semantic version number of the API." + }, + "description": { + "type": "string", + "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." + }, + "termsOfService": { + "type": "string", + "description": "The terms of service for the API." + }, + "contact": { + "$ref": "#/definitions/contact" + }, + "license": { + "$ref": "#/definitions/license" + } + } + }, + "contact": { + "type": "object", + "description": "Contact information for the owners of the API.", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The identifying name of the contact person/organization." + }, + "url": { + "type": "string", + "description": "The URL pointing to the contact information.", + "format": "uri" + }, + "email": { + "type": "string", + "description": "The email address of the contact person/organization.", + "format": "email" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "license": { + "type": "object", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the license type. It's encouraged to use an OSI compatible license." + }, + "url": { + "type": "string", + "description": "The URL pointing to the license.", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "paths": { + "type": "object", + "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + }, + "^/": { + "$ref": "#/definitions/pathItem" + } + }, + "additionalProperties": false + }, + "definitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "description": "One or more JSON objects describing the schemas being consumed and produced by the API." + }, + "parameterDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameter" + }, + "description": "One or more JSON representations for parameters" + }, + "responseDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/response" + }, + "description": "One or more JSON representations for responses" + }, + "externalDocs": { + "type": "object", + "additionalProperties": false, + "description": "information about external documentation", + "required": [ + "url" + ], + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "examples": { + "type": "object", + "additionalProperties": true + }, + "mimeType": { + "type": "string", + "description": "The MIME type of the HTTP message." + }, + "operation": { + "type": "object", + "required": [ + "responses" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "summary": { + "type": "string", + "description": "A brief summary of the operation." + }, + "description": { + "type": "string", + "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "operationId": { + "type": "string", + "description": "A unique identifier of the operation." + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "consumes": { + "description": "A list of MIME types the API can consume.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "parameters": { + "$ref": "#/definitions/parametersList" + }, + "responses": { + "$ref": "#/definitions/responses" + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "deprecated": { + "type": "boolean", + "default": false + }, + "security": { + "$ref": "#/definitions/security" + } + } + }, + "pathItem": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "get": { + "$ref": "#/definitions/operation" + }, + "put": { + "$ref": "#/definitions/operation" + }, + "post": { + "$ref": "#/definitions/operation" + }, + "delete": { + "$ref": "#/definitions/operation" + }, + "options": { + "$ref": "#/definitions/operation" + }, + "head": { + "$ref": "#/definitions/operation" + }, + "patch": { + "$ref": "#/definitions/operation" + }, + "parameters": { + "$ref": "#/definitions/parametersList" + } + } + }, + "responses": { + "type": "object", + "description": "Response objects names can either be any valid HTTP status code or 'default'.", + "minProperties": 1, + "additionalProperties": false, + "patternProperties": { + "^([0-9]{3})$|^(default)$": { + "$ref": "#/definitions/responseValue" + }, + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "not": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + } + }, + "responseValue": { + "oneOf": [ + { + "$ref": "#/definitions/response" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "response": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string" + }, + "schema": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/fileSchema" + } + ] + }, + "headers": { + "$ref": "#/definitions/headers" + }, + "examples": { + "$ref": "#/definitions/examples" + } + }, + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/header" + } + }, + "header": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "vendorExtension": { + "description": "Any property starting with x- is valid.", + "additionalProperties": true, + "additionalItems": true + }, + "bodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "schema" + ], + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "body" + ] + }, + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "schema": { + "$ref": "#/definitions/schema" + } + }, + "additionalProperties": false + }, + "headerParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "header" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "queryParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "query" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "formDataParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "formData" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array", + "file" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "pathParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "required" + ], + "properties": { + "required": { + "type": "boolean", + "enum": [ + true + ], + "description": "Determines whether or not this parameter is required or optional." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "path" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "nonBodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "type" + ], + "oneOf": [ + { + "$ref": "#/definitions/headerParameterSubSchema" + }, + { + "$ref": "#/definitions/formDataParameterSubSchema" + }, + { + "$ref": "#/definitions/queryParameterSubSchema" + }, + { + "$ref": "#/definitions/pathParameterSubSchema" + } + ] + }, + "parameter": { + "oneOf": [ + { + "$ref": "#/definitions/bodyParameter" + }, + { + "$ref": "#/definitions/nonBodyParameter" + } + ] + }, + "schema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "maxProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "boolean" + } + ], + "default": {} + }, + "type": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/type" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + } + ], + "default": {} + }, + "allOf": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "default": {} + }, + "discriminator": { + "type": "string" + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "xml": { + "$ref": "#/definitions/xml" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "fileSchema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "type" + ], + "properties": { + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "type": { + "type": "string", + "enum": [ + "file" + ] + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "primitivesItems": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "securityRequirement": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "attribute": { + "type": "boolean", + "default": false + }, + "wrapped": { + "type": "boolean", + "default": false + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "tag": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "securityDefinitions": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/basicAuthenticationSecurity" + }, + { + "$ref": "#/definitions/apiKeySecurity" + }, + { + "$ref": "#/definitions/oauth2ImplicitSecurity" + }, + { + "$ref": "#/definitions/oauth2PasswordSecurity" + }, + { + "$ref": "#/definitions/oauth2ApplicationSecurity" + }, + { + "$ref": "#/definitions/oauth2AccessCodeSecurity" + } + ] + } + }, + "basicAuthenticationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "apiKeySecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name", + "in" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "apiKey" + ] + }, + "name": { + "type": "string" + }, + "in": { + "type": "string", + "enum": [ + "header", + "query" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ImplicitSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "implicit" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2PasswordSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "password" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ApplicationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "application" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2AccessCodeSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "accessCode" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2Scopes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "mediaTypeList": { + "type": "array", + "items": { + "$ref": "#/definitions/mimeType" + }, + "uniqueItems": true + }, + "parametersList": { + "type": "array", + "description": "The parameters needed to send a valid API call.", + "additionalItems": false, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/parameter" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "uniqueItems": true + }, + "schemesList": { + "type": "array", + "description": "The transfer protocol of the API.", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + }, + "uniqueItems": true + }, + "collectionFormat": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes" + ], + "default": "csv" + }, + "collectionFormatWithMulti": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes", + "multi" + ], + "default": "csv" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "jsonReference": { + "type": "object", + "required": [ + "$ref" + ], + "additionalProperties": false, + "properties": { + "$ref": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go similarity index 99% rename from tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go rename to tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go index d54a84db7..4b1131ce1 100644 --- a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go +++ b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go @@ -23,7 +23,7 @@ import ( "gopkg.in/yaml.v3" - "github.com/google/gnostic/compiler" + "github.com/google/gnostic-models/compiler" ) // Version returns the package name (and OpenAPI version). @@ -8560,12 +8560,7 @@ func (m *Strings) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) - info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Value)) - } - } + // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} return info } diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.pb.go similarity index 99% rename from tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go rename to tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.pb.go index 90a56f552..945b8d11f 100644 --- a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go +++ b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.pb.go @@ -16,8 +16,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.19.4 +// protoc-gen-go v1.27.1 +// protoc v3.19.3 // source: openapiv3/OpenAPIv3.proto package openapi_v3 @@ -6760,13 +6760,12 @@ var file_openapiv3_OpenAPIv3_proto_rawDesc = []byte{ 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x3e, 0x0a, 0x0e, 0x6f, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2f, 0x6f, 0x70, 0x65, 0x6e, - 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, - 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5a, 0x16, 0x2e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.proto similarity index 99% rename from tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto rename to tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.proto index 7aede5ed9..1be335b89 100644 --- a/tools/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto +++ b/tools/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.proto @@ -42,7 +42,7 @@ option java_package = "org.openapi_v3"; option objc_class_prefix = "OAS"; // The Go package name. -option go_package = "github.com/google/gnostic/openapiv3;openapi_v3"; +option go_package = "./openapiv3;openapi_v3"; message AdditionalPropertiesItem { oneof oneof { diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/README.md b/tools/vendor/github.com/google/gnostic-models/openapiv3/README.md similarity index 89% rename from tools/vendor/github.com/google/gnostic/openapiv3/README.md rename to tools/vendor/github.com/google/gnostic-models/openapiv3/README.md index 83603b82a..5ee12d92e 100644 --- a/tools/vendor/github.com/google/gnostic/openapiv3/README.md +++ b/tools/vendor/github.com/google/gnostic-models/openapiv3/README.md @@ -19,7 +19,3 @@ for OpenAPI. The schema-generator directory contains support code which generates openapi-3.1.json from the OpenAPI 3.1 specification document (Markdown). - -### How to rebuild - -`protoc -I=. -I=third_party --go_out=. --go_opt=paths=source_relative openapiv3/*.proto` \ No newline at end of file diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/document.go b/tools/vendor/github.com/google/gnostic-models/openapiv3/document.go similarity index 96% rename from tools/vendor/github.com/google/gnostic/openapiv3/document.go rename to tools/vendor/github.com/google/gnostic-models/openapiv3/document.go index ef10d1d90..1cee46773 100644 --- a/tools/vendor/github.com/google/gnostic/openapiv3/document.go +++ b/tools/vendor/github.com/google/gnostic-models/openapiv3/document.go @@ -17,7 +17,7 @@ package openapi_v3 import ( "gopkg.in/yaml.v3" - "github.com/google/gnostic/compiler" + "github.com/google/gnostic-models/compiler" ) // ParseDocument reads an OpenAPI v3 description from a YAML/JSON representation. diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go b/tools/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go deleted file mode 100644 index ae242f304..000000000 --- a/tools/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2022 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. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.19.4 -// source: openapiv3/annotations.proto - -package openapi_v3 - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - descriptorpb "google.golang.org/protobuf/types/descriptorpb" - reflect "reflect" -) - -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) -) - -var file_openapiv3_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ - { - ExtendedType: (*descriptorpb.FileOptions)(nil), - ExtensionType: (*Document)(nil), - Field: 1143, - Name: "openapi.v3.document", - Tag: "bytes,1143,opt,name=document", - Filename: "openapiv3/annotations.proto", - }, - { - ExtendedType: (*descriptorpb.MethodOptions)(nil), - ExtensionType: (*Operation)(nil), - Field: 1143, - Name: "openapi.v3.operation", - Tag: "bytes,1143,opt,name=operation", - Filename: "openapiv3/annotations.proto", - }, - { - ExtendedType: (*descriptorpb.MessageOptions)(nil), - ExtensionType: (*Schema)(nil), - Field: 1143, - Name: "openapi.v3.schema", - Tag: "bytes,1143,opt,name=schema", - Filename: "openapiv3/annotations.proto", - }, - { - ExtendedType: (*descriptorpb.FieldOptions)(nil), - ExtensionType: (*Schema)(nil), - Field: 1143, - Name: "openapi.v3.property", - Tag: "bytes,1143,opt,name=property", - Filename: "openapiv3/annotations.proto", - }, -} - -// Extension fields to descriptorpb.FileOptions. -var ( - // optional openapi.v3.Document document = 1143; - E_Document = &file_openapiv3_annotations_proto_extTypes[0] -) - -// Extension fields to descriptorpb.MethodOptions. -var ( - // optional openapi.v3.Operation operation = 1143; - E_Operation = &file_openapiv3_annotations_proto_extTypes[1] -) - -// Extension fields to descriptorpb.MessageOptions. -var ( - // optional openapi.v3.Schema schema = 1143; - E_Schema = &file_openapiv3_annotations_proto_extTypes[2] -) - -// Extension fields to descriptorpb.FieldOptions. -var ( - // optional openapi.v3.Schema property = 1143; - E_Property = &file_openapiv3_annotations_proto_extTypes[3] -) - -var File_openapiv3_annotations_proto protoreflect.FileDescriptor - -var file_openapiv3_annotations_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, - 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x1a, 0x19, 0x6f, 0x70, 0x65, 0x6e, 0x61, - 0x70, 0x69, 0x76, 0x33, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x76, 0x33, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x4f, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x1c, 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, - 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x54, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 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, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x4c, 0x0a, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 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, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x4e, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 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, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x5a, 0x0a, 0x0e, 0x6f, - 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0x42, 0x10, 0x41, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2f, 0x6f, 0x70, 0x65, - 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, - 0x33, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_openapiv3_annotations_proto_goTypes = []interface{}{ - (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions - (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions - (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions - (*descriptorpb.FieldOptions)(nil), // 3: google.protobuf.FieldOptions - (*Document)(nil), // 4: openapi.v3.Document - (*Operation)(nil), // 5: openapi.v3.Operation - (*Schema)(nil), // 6: openapi.v3.Schema -} -var file_openapiv3_annotations_proto_depIdxs = []int32{ - 0, // 0: openapi.v3.document:extendee -> google.protobuf.FileOptions - 1, // 1: openapi.v3.operation:extendee -> google.protobuf.MethodOptions - 2, // 2: openapi.v3.schema:extendee -> google.protobuf.MessageOptions - 3, // 3: openapi.v3.property:extendee -> google.protobuf.FieldOptions - 4, // 4: openapi.v3.document:type_name -> openapi.v3.Document - 5, // 5: openapi.v3.operation:type_name -> openapi.v3.Operation - 6, // 6: openapi.v3.schema:type_name -> openapi.v3.Schema - 6, // 7: openapi.v3.property:type_name -> openapi.v3.Schema - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 4, // [4:8] is the sub-list for extension type_name - 0, // [0:4] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_openapiv3_annotations_proto_init() } -func file_openapiv3_annotations_proto_init() { - if File_openapiv3_annotations_proto != nil { - return - } - file_openapiv3_OpenAPIv3_proto_init() - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_openapiv3_annotations_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 4, - NumServices: 0, - }, - GoTypes: file_openapiv3_annotations_proto_goTypes, - DependencyIndexes: file_openapiv3_annotations_proto_depIdxs, - ExtensionInfos: file_openapiv3_annotations_proto_extTypes, - }.Build() - File_openapiv3_annotations_proto = out.File - file_openapiv3_annotations_proto_rawDesc = nil - file_openapiv3_annotations_proto_goTypes = nil - file_openapiv3_annotations_proto_depIdxs = nil -} diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/annotations.proto b/tools/vendor/github.com/google/gnostic/openapiv3/annotations.proto deleted file mode 100644 index 0bd87810d..000000000 --- a/tools/vendor/github.com/google/gnostic/openapiv3/annotations.proto +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022 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. - -syntax = "proto3"; - -package openapi.v3; - -import "openapiv3/OpenAPIv3.proto"; -import "google/protobuf/descriptor.proto"; - -// This option lets the proto compiler generate Java code inside the package -// name (see below) instead of inside an outer class. It creates a simpler -// developer experience by reducing one-level of name nesting and be -// consistent with most programming languages that don't support outer classes. -option java_multiple_files = true; - -// The Java outer classname should be the filename in UpperCamelCase. This -// class is only used to hold proto descriptor, so developers don't need to -// work with it directly. -option java_outer_classname = "AnnotationsProto"; - -// The Java package name must be proto package name with proper prefix. -option java_package = "org.openapi_v3"; - -// A reasonable prefix for the Objective-C symbols generated from the package. -// It should at a minimum be 3 characters long, all uppercase, and convention -// is to use an abbreviation of the package name. Something short, but -// hopefully unique enough to not conflict with things that may come along in -// the future. 'GPB' is reserved for the protocol buffer implementation itself. -option objc_class_prefix = "OAS"; - -// The Go package name. -option go_package = "github.com/google/gnostic/openapiv3;openapi_v3"; - -extend google.protobuf.FileOptions { - Document document = 1143; -} - -extend google.protobuf.MethodOptions { - Operation operation = 1143; -} - -extend google.protobuf.MessageOptions { - Schema schema = 1143; -} - -extend google.protobuf.FieldOptions { - Schema property = 1143; -} \ No newline at end of file diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json b/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json deleted file mode 100644 index d5caed162..000000000 --- a/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json +++ /dev/null @@ -1,1251 +0,0 @@ -{ - "title": "A JSON Schema for OpenAPI 3.0.", - "id": "http://openapis.org/v3/schema.json#", - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "description": "This is the root document object of the OpenAPI document.", - "required": [ - "openapi", - "info", - "paths" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "openapi": { - "type": "string" - }, - "info": { - "$ref": "#/definitions/info" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - }, - "paths": { - "$ref": "#/definitions/paths" - }, - "components": { - "$ref": "#/definitions/components" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/tag" - }, - "uniqueItems": true - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "definitions": { - "info": { - "type": "object", - "description": "The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.", - "required": [ - "title", - "version" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "termsOfService": { - "type": "string" - }, - "contact": { - "$ref": "#/definitions/contact" - }, - "license": { - "$ref": "#/definitions/license" - }, - "version": { - "type": "string" - } - } - }, - "contact": { - "type": "object", - "description": "Contact information for the exposed API.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - }, - "email": { - "type": "string", - "format": "email" - } - } - }, - "license": { - "type": "object", - "description": "License information for the exposed API.", - "required": [ - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "server": { - "type": "object", - "description": "An object representing a Server.", - "required": [ - "url" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "url": { - "type": "string" - }, - "description": { - "type": "string" - }, - "variables": { - "$ref": "#/definitions/serverVariables" - } - } - }, - "serverVariable": { - "type": "object", - "description": "An object representing a Server Variable for server URL template substitution.", - "required": [ - "default" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "enum": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "default": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "components": { - "type": "object", - "description": "Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "schemas": { - "$ref": "#/definitions/schemasOrReferences" - }, - "responses": { - "$ref": "#/definitions/responsesOrReferences" - }, - "parameters": { - "$ref": "#/definitions/parametersOrReferences" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "requestBodies": { - "$ref": "#/definitions/requestBodiesOrReferences" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "securitySchemes": { - "$ref": "#/definitions/securitySchemesOrReferences" - }, - "links": { - "$ref": "#/definitions/linksOrReferences" - }, - "callbacks": { - "$ref": "#/definitions/callbacksOrReferences" - } - } - }, - "paths": { - "type": "object", - "description": "Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints.", - "additionalProperties": false, - "patternProperties": { - "^/": { - "$ref": "#/definitions/pathItem" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - } - }, - "pathItem": { - "type": "object", - "description": "Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "get": { - "$ref": "#/definitions/operation" - }, - "put": { - "$ref": "#/definitions/operation" - }, - "post": { - "$ref": "#/definitions/operation" - }, - "delete": { - "$ref": "#/definitions/operation" - }, - "options": { - "$ref": "#/definitions/operation" - }, - "head": { - "$ref": "#/definitions/operation" - }, - "patch": { - "$ref": "#/definitions/operation" - }, - "trace": { - "$ref": "#/definitions/operation" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/parameterOrReference" - }, - "uniqueItems": true - } - } - }, - "operation": { - "type": "object", - "description": "Describes a single API operation on a path.", - "required": [ - "responses" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/parameterOrReference" - }, - "uniqueItems": true - }, - "requestBody": { - "$ref": "#/definitions/requestBodyOrReference" - }, - "responses": { - "$ref": "#/definitions/responses" - }, - "callbacks": { - "$ref": "#/definitions/callbacksOrReferences" - }, - "deprecated": { - "type": "boolean" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - } - } - }, - "externalDocs": { - "type": "object", - "description": "Allows referencing an external resource for extended documentation.", - "required": [ - "url" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "parameter": { - "type": "object", - "description": "Describes a single operation parameter. A unique parameter is defined by a combination of a name and location.", - "required": [ - "name", - "in" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "in": { - "type": "string" - }, - "description": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "deprecated": { - "type": "boolean" - }, - "allowEmptyValue": { - "type": "boolean" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - }, - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - } - } - }, - "requestBody": { - "type": "object", - "description": "Describes a single request body.", - "required": [ - "content" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - }, - "required": { - "type": "boolean" - } - } - }, - "mediaType": { - "type": "object", - "description": "Each Media Type Object provides schema and examples for the media type identified by its key.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "encoding": { - "$ref": "#/definitions/encodings" - } - } - }, - "encoding": { - "type": "object", - "description": "A single encoding definition applied to a single schema property.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "contentType": { - "type": "string" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - } - } - }, - "responses": { - "type": "object", - "description": "A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call.", - "additionalProperties": false, - "patternProperties": { - "^([0-9X]{3})$": { - "$ref": "#/definitions/responseOrReference" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "default": { - "$ref": "#/definitions/responseOrReference" - } - } - }, - "response": { - "type": "object", - "description": "Describes a single response from an API Operation, including design-time, static `links` to operations based on the response.", - "required": [ - "description" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - }, - "links": { - "$ref": "#/definitions/linksOrReferences" - } - } - }, - "callback": { - "type": "object", - "description": "A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.", - "additionalProperties": false, - "patternProperties": { - "^": { - "$ref": "#/definitions/pathItem" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - } - }, - "example": { - "type": "object", - "description": "", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/any" - }, - "externalValue": { - "type": "string" - } - } - }, - "link": { - "type": "object", - "description": "The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "operationRef": { - "type": "string" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "$ref": "#/definitions/anysOrExpressions" - }, - "requestBody": { - "$ref": "#/definitions/anyOrExpression" - }, - "description": { - "type": "string" - }, - "server": { - "$ref": "#/definitions/server" - } - } - }, - "header": { - "type": "object", - "description": "The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "deprecated": { - "type": "boolean" - }, - "allowEmptyValue": { - "type": "boolean" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - }, - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - } - } - }, - "tag": { - "type": "object", - "description": "Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.", - "required": [ - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - } - }, - "reference": { - "type": "object", - "description": "A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.", - "required": [ - "$ref" - ], - "additionalProperties": false, - "properties": { - "$ref": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "schema": { - "type": "object", - "description": "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 an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "nullable": { - "type": "boolean" - }, - "discriminator": { - "$ref": "#/definitions/discriminator" - }, - "readOnly": { - "type": "boolean" - }, - "writeOnly": { - "type": "boolean" - }, - "xml": { - "$ref": "#/definitions/xml" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": { - "$ref": "#/definitions/any" - }, - "deprecated": { - "type": "boolean" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxLength" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minLength" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxItems" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minItems" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "maxProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxProperties" - }, - "minProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minProperties" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/required" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "type": { - "type": "string" - }, - "allOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "oneOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "anyOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "not": { - "$ref": "#/definitions/schema" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/schemaOrReference" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - } - ] - }, - "properties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemaOrReference" - } - }, - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/schemaOrReference" - }, - { - "type": "boolean" - } - ] - }, - "default": { - "$ref": "#/definitions/defaultType" - }, - "description": { - "type": "string" - }, - "format": { - "type": "string" - } - } - }, - "discriminator": { - "type": "object", - "description": "When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered.", - "required": [ - "propertyName" - ], - "additionalProperties": false, - "properties": { - "propertyName": { - "type": "string" - }, - "mapping": { - "$ref": "#/definitions/strings" - } - } - }, - "xml": { - "type": "object", - "description": "A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - }, - "prefix": { - "type": "string" - }, - "attribute": { - "type": "boolean" - }, - "wrapped": { - "type": "boolean" - } - } - }, - "securityScheme": { - "type": "object", - "description": "Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header or as a query parameter), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect Discovery.", - "required": [ - "type" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "type": { - "type": "string" - }, - "description": { - "type": "string" - }, - "name": { - "type": "string" - }, - "in": { - "type": "string" - }, - "scheme": { - "type": "string" - }, - "bearerFormat": { - "type": "string" - }, - "flows": { - "$ref": "#/definitions/oauthFlows" - }, - "openIdConnectUrl": { - "type": "string" - } - } - }, - "oauthFlows": { - "type": "object", - "description": "Allows configuration of the supported OAuth Flows.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "implicit": { - "$ref": "#/definitions/oauthFlow" - }, - "password": { - "$ref": "#/definitions/oauthFlow" - }, - "clientCredentials": { - "$ref": "#/definitions/oauthFlow" - }, - "authorizationCode": { - "$ref": "#/definitions/oauthFlow" - } - } - }, - "oauthFlow": { - "type": "object", - "description": "Configuration details for a supported OAuth Flow", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "authorizationUrl": { - "type": "string" - }, - "tokenUrl": { - "type": "string" - }, - "refreshUrl": { - "type": "string" - }, - "scopes": { - "$ref": "#/definitions/strings" - } - } - }, - "securityRequirement": { - "type": "object", - "description": "Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the Open API object or Operation Object, only one of Security Requirement Objects in the list needs to be satisfied to authorize the request.", - "additionalProperties": false, - "patternProperties": { - "^[a-zA-Z0-9\\.\\-_]+$": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - } - }, - "anyOrExpression": { - "oneOf": [ - { - "$ref": "#/definitions/any" - }, - { - "$ref": "#/definitions/expression" - } - ] - }, - "callbackOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/callback" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "exampleOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/example" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "headerOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/header" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "linkOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/link" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "parameterOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/parameter" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "requestBodyOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/requestBody" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "responseOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/response" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "schemaOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "securitySchemeOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/securityScheme" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "anysOrExpressions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/anyOrExpression" - } - }, - "callbacksOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/callbackOrReference" - } - }, - "encodings": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/encoding" - } - }, - "examplesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/exampleOrReference" - } - }, - "headersOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/headerOrReference" - } - }, - "linksOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/linkOrReference" - } - }, - "mediaTypes": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/mediaType" - } - }, - "parametersOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/parameterOrReference" - } - }, - "requestBodiesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/requestBodyOrReference" - } - }, - "responsesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/responseOrReference" - } - }, - "schemasOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemaOrReference" - } - }, - "securitySchemesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/securitySchemeOrReference" - } - }, - "serverVariables": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/serverVariable" - } - }, - "strings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "object": { - "type": "object", - "additionalProperties": true - }, - "any": { - "additionalProperties": true - }, - "expression": { - "type": "object", - "additionalProperties": true - }, - "specificationExtension": { - "description": "Any property starting with x- is valid.", - "oneOf": [ - { - "type": "null" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "object" - }, - { - "type": "array" - } - ] - }, - "defaultType": { - "oneOf": [ - { - "type": "null" - }, - { - "type": "array" - }, - { - "type": "object" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "string" - } - ] - } - } -} diff --git a/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json b/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json deleted file mode 100644 index ed0b83adf..000000000 --- a/tools/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json +++ /dev/null @@ -1,1250 +0,0 @@ -{ - "title": "A JSON Schema for OpenAPI 3.0.", - "id": "http://openapis.org/v3/schema.json#", - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "description": "This is the root document object of the OpenAPI document.", - "required": [ - "openapi", - "info", - "paths" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "openapi": { - "type": "string" - }, - "info": { - "$ref": "#/definitions/info" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - }, - "paths": { - "$ref": "#/definitions/paths" - }, - "components": { - "$ref": "#/definitions/components" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/tag" - }, - "uniqueItems": true - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "definitions": { - "info": { - "type": "object", - "description": "The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.", - "required": [ - "title", - "version" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "termsOfService": { - "type": "string" - }, - "contact": { - "$ref": "#/definitions/contact" - }, - "license": { - "$ref": "#/definitions/license" - }, - "version": { - "type": "string" - }, - "summary": { - "type": "string" - } - } - }, - "contact": { - "type": "object", - "description": "Contact information for the exposed API.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - }, - "email": { - "type": "string", - "format": "email" - } - } - }, - "license": { - "type": "object", - "description": "License information for the exposed API.", - "required": [ - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "server": { - "type": "object", - "description": "An object representing a Server.", - "required": [ - "url" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "url": { - "type": "string" - }, - "description": { - "type": "string" - }, - "variables": { - "$ref": "#/definitions/serverVariables" - } - } - }, - "serverVariable": { - "type": "object", - "description": "An object representing a Server Variable for server URL template substitution.", - "required": [ - "default" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "enum": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "default": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "components": { - "type": "object", - "description": "Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "schemas": { - "$ref": "#/definitions/schemasOrReferences" - }, - "responses": { - "$ref": "#/definitions/responsesOrReferences" - }, - "parameters": { - "$ref": "#/definitions/parametersOrReferences" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "requestBodies": { - "$ref": "#/definitions/requestBodiesOrReferences" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "securitySchemes": { - "$ref": "#/definitions/securitySchemesOrReferences" - }, - "links": { - "$ref": "#/definitions/linksOrReferences" - }, - "callbacks": { - "$ref": "#/definitions/callbacksOrReferences" - } - } - }, - "paths": { - "type": "object", - "description": "Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints.", - "additionalProperties": false, - "patternProperties": { - "^/": { - "$ref": "#/definitions/pathItem" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - } - }, - "pathItem": { - "type": "object", - "description": "Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "get": { - "$ref": "#/definitions/operation" - }, - "put": { - "$ref": "#/definitions/operation" - }, - "post": { - "$ref": "#/definitions/operation" - }, - "delete": { - "$ref": "#/definitions/operation" - }, - "options": { - "$ref": "#/definitions/operation" - }, - "head": { - "$ref": "#/definitions/operation" - }, - "patch": { - "$ref": "#/definitions/operation" - }, - "trace": { - "$ref": "#/definitions/operation" - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/parameterOrReference" - }, - "uniqueItems": true - } - } - }, - "operation": { - "type": "object", - "description": "Describes a single API operation on a path.", - "required": [ - "responses" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "type": "array", - "items": { - "$ref": "#/definitions/parameterOrReference" - }, - "uniqueItems": true - }, - "requestBody": { - "$ref": "#/definitions/requestBodyOrReference" - }, - "responses": { - "$ref": "#/definitions/responses" - }, - "callbacks": { - "$ref": "#/definitions/callbacksOrReferences" - }, - "deprecated": { - "type": "boolean" - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "servers": { - "type": "array", - "items": { - "$ref": "#/definitions/server" - }, - "uniqueItems": true - } - } - }, - "externalDocs": { - "type": "object", - "description": "Allows referencing an external resource for extended documentation.", - "required": [ - "url" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "parameter": { - "type": "object", - "description": "Describes a single operation parameter. A unique parameter is defined by a combination of a name and location.", - "required": [ - "name", - "in" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "in": { - "type": "string" - }, - "description": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "deprecated": { - "type": "boolean" - }, - "allowEmptyValue": { - "type": "boolean" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - }, - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - } - } - }, - "requestBody": { - "type": "object", - "description": "Describes a single request body.", - "required": [ - "content" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - }, - "required": { - "type": "boolean" - } - } - }, - "mediaType": { - "type": "object", - "description": "Each Media Type Object provides schema and examples for the media type identified by its key.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "encoding": { - "$ref": "#/definitions/encodings" - } - } - }, - "encoding": { - "type": "object", - "description": "A single encoding definition applied to a single schema property.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "contentType": { - "type": "string" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - } - } - }, - "responses": { - "type": "object", - "description": "A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call.", - "additionalProperties": false, - "patternProperties": { - "^([0-9X]{3})$": { - "$ref": "#/definitions/responseOrReference" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "default": { - "$ref": "#/definitions/responseOrReference" - } - } - }, - "response": { - "type": "object", - "description": "Describes a single response from an API Operation, including design-time, static `links` to operations based on the response.", - "required": [ - "description" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "headers": { - "$ref": "#/definitions/headersOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - }, - "links": { - "$ref": "#/definitions/linksOrReferences" - } - } - }, - "callback": { - "type": "object", - "description": "A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.", - "additionalProperties": false, - "patternProperties": { - "^": { - "$ref": "#/definitions/pathItem" - }, - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - } - }, - "example": { - "type": "object", - "description": "", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "summary": { - "type": "string" - }, - "description": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/any" - }, - "externalValue": { - "type": "string" - } - } - }, - "link": { - "type": "object", - "description": "The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "operationRef": { - "type": "string" - }, - "operationId": { - "type": "string" - }, - "parameters": { - "$ref": "#/definitions/anyOrExpression" - }, - "requestBody": { - "$ref": "#/definitions/anyOrExpression" - }, - "description": { - "type": "string" - }, - "server": { - "$ref": "#/definitions/server" - } - } - }, - "header": { - "type": "object", - "description": "The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "description": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "deprecated": { - "type": "boolean" - }, - "allowEmptyValue": { - "type": "boolean" - }, - "style": { - "type": "string" - }, - "explode": { - "type": "boolean" - }, - "allowReserved": { - "type": "boolean" - }, - "schema": { - "$ref": "#/definitions/schemaOrReference" - }, - "example": { - "$ref": "#/definitions/any" - }, - "examples": { - "$ref": "#/definitions/examplesOrReferences" - }, - "content": { - "$ref": "#/definitions/mediaTypes" - } - } - }, - "tag": { - "type": "object", - "description": "Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.", - "required": [ - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - } - }, - "reference": { - "type": "object", - "description": "A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.", - "required": [ - "$ref" - ], - "additionalProperties": false, - "properties": { - "$ref": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "schema": { - "type": "object", - "description": "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 an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "nullable": { - "type": "boolean" - }, - "discriminator": { - "$ref": "#/definitions/discriminator" - }, - "readOnly": { - "type": "boolean" - }, - "writeOnly": { - "type": "boolean" - }, - "xml": { - "$ref": "#/definitions/xml" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": { - "$ref": "#/definitions/any" - }, - "deprecated": { - "type": "boolean" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxLength" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minLength" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxItems" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minItems" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "maxProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maxProperties" - }, - "minProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minProperties" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/required" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "type": { - "type": "string" - }, - "allOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "oneOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "anyOf": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - }, - "not": { - "$ref": "#/definitions/schema" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/schemaOrReference" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/schemaOrReference" - }, - "minItems": 1 - } - ] - }, - "properties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemaOrReference" - } - }, - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/schemaOrReference" - }, - { - "type": "boolean" - } - ] - }, - "default": { - "$ref": "#/definitions/defaultType" - }, - "description": { - "type": "string" - }, - "format": { - "type": "string" - } - } - }, - "discriminator": { - "type": "object", - "description": "When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered.", - "required": [ - "propertyName" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "propertyName": { - "type": "string" - }, - "mapping": { - "$ref": "#/definitions/strings" - } - } - }, - "xml": { - "type": "object", - "description": "A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - }, - "prefix": { - "type": "string" - }, - "attribute": { - "type": "boolean" - }, - "wrapped": { - "type": "boolean" - } - } - }, - "securityScheme": { - "type": "object", - "description": "Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect. Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.", - "required": [ - "type" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "type": { - "type": "string" - }, - "description": { - "type": "string" - }, - "name": { - "type": "string" - }, - "in": { - "type": "string" - }, - "scheme": { - "type": "string" - }, - "bearerFormat": { - "type": "string" - }, - "flows": { - "$ref": "#/definitions/oauthFlows" - }, - "openIdConnectUrl": { - "type": "string" - } - } - }, - "oauthFlows": { - "type": "object", - "description": "Allows configuration of the supported OAuth Flows.", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "implicit": { - "$ref": "#/definitions/oauthFlow" - }, - "password": { - "$ref": "#/definitions/oauthFlow" - }, - "clientCredentials": { - "$ref": "#/definitions/oauthFlow" - }, - "authorizationCode": { - "$ref": "#/definitions/oauthFlow" - } - } - }, - "oauthFlow": { - "type": "object", - "description": "Configuration details for a supported OAuth Flow", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/specificationExtension" - } - }, - "properties": { - "authorizationUrl": { - "type": "string" - }, - "tokenUrl": { - "type": "string" - }, - "refreshUrl": { - "type": "string" - }, - "scopes": { - "$ref": "#/definitions/strings" - } - } - }, - "securityRequirement": { - "type": "object", - "description": "Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - }, - "anyOrExpression": { - "oneOf": [ - { - "$ref": "#/definitions/any" - }, - { - "$ref": "#/definitions/expression" - } - ] - }, - "callbackOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/callback" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "exampleOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/example" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "headerOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/header" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "linkOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/link" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "parameterOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/parameter" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "requestBodyOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/requestBody" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "responseOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/response" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "schemaOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "securitySchemeOrReference": { - "oneOf": [ - { - "$ref": "#/definitions/securityScheme" - }, - { - "$ref": "#/definitions/reference" - } - ] - }, - "callbacksOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/callbackOrReference" - } - }, - "encodings": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/encoding" - } - }, - "examplesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/exampleOrReference" - } - }, - "headersOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/headerOrReference" - } - }, - "linksOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/linkOrReference" - } - }, - "mediaTypes": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/mediaType" - } - }, - "parametersOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/parameterOrReference" - } - }, - "requestBodiesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/requestBodyOrReference" - } - }, - "responsesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/responseOrReference" - } - }, - "schemasOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemaOrReference" - } - }, - "securitySchemesOrReferences": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/securitySchemeOrReference" - } - }, - "serverVariables": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/serverVariable" - } - }, - "strings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "object": { - "type": "object", - "additionalProperties": true - }, - "any": { - "additionalProperties": true - }, - "expression": { - "type": "object", - "additionalProperties": true - }, - "specificationExtension": { - "description": "Any property starting with x- is valid.", - "oneOf": [ - { - "type": "null" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "object" - }, - { - "type": "array" - } - ] - }, - "defaultType": { - "oneOf": [ - { - "type": "null" - }, - { - "type": "array" - }, - { - "type": "object" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "string" - } - ] - } - } -} diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/compression/compression.go b/tools/vendor/github.com/google/go-containerregistry/internal/compression/compression.go new file mode 100644 index 000000000..012487150 --- /dev/null +++ b/tools/vendor/github.com/google/go-containerregistry/internal/compression/compression.go @@ -0,0 +1,97 @@ +// Copyright 2022 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 compression abstracts over gzip and zstd. +package compression + +import ( + "bufio" + "bytes" + "io" + + "github.com/google/go-containerregistry/internal/gzip" + "github.com/google/go-containerregistry/internal/zstd" + "github.com/google/go-containerregistry/pkg/compression" +) + +// Opener represents e.g. opening a file. +type Opener = func() (io.ReadCloser, error) + +// GetCompression detects whether an Opener is compressed and which algorithm is used. +func GetCompression(opener Opener) (compression.Compression, error) { + rc, err := opener() + if err != nil { + return compression.None, err + } + defer rc.Close() + + cp, _, err := PeekCompression(rc) + if err != nil { + return compression.None, err + } + + return cp, nil +} + +// PeekCompression detects whether the input stream is compressed and which algorithm is used. +// +// If r implements Peek, we will use that directly, otherwise a small number +// of bytes are buffered to Peek at the gzip/zstd header, and the returned +// PeekReader can be used as a replacement for the consumed input io.Reader. +func PeekCompression(r io.Reader) (compression.Compression, PeekReader, error) { + pr := intoPeekReader(r) + + if isGZip, _, err := checkHeader(pr, gzip.MagicHeader); err != nil { + return compression.None, pr, err + } else if isGZip { + return compression.GZip, pr, nil + } + + if isZStd, _, err := checkHeader(pr, zstd.MagicHeader); err != nil { + return compression.None, pr, err + } else if isZStd { + return compression.ZStd, pr, nil + } + + return compression.None, pr, nil +} + +// PeekReader is an io.Reader that also implements Peek a la bufio.Reader. +type PeekReader interface { + io.Reader + Peek(n int) ([]byte, error) +} + +// IntoPeekReader creates a PeekReader from an io.Reader. +// If the reader already has a Peek method, it will just return the passed reader. +func intoPeekReader(r io.Reader) PeekReader { + if p, ok := r.(PeekReader); ok { + return p + } + + return bufio.NewReader(r) +} + +// CheckHeader checks whether the first bytes from a PeekReader match an expected header +func checkHeader(pr PeekReader, expectedHeader []byte) (bool, PeekReader, error) { + header, err := pr.Peek(len(expectedHeader)) + if err != nil { + // https://github.com/google/go-containerregistry/issues/367 + if err == io.EOF { + return false, pr, nil + } + return false, pr, err + } + return bytes.Equal(header, expectedHeader), pr, nil +} diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.go b/tools/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.go index 35b1d8e7f..69021bcee 100644 --- a/tools/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.go +++ b/tools/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.go @@ -18,7 +18,6 @@ package estargz import ( "bytes" "io" - "io/ioutil" "github.com/containerd/stargz-snapshotter/estargz" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -29,9 +28,9 @@ var _ io.ReadCloser = (*estargz.Blob)(nil) // ReadCloser reads uncompressed tarball input from the io.ReadCloser and // returns: -// * An io.ReadCloser from which compressed data may be read, and -// * A v1.Hash with the hash of the estargz table of contents, or -// * An error if the estargz processing encountered a problem. +// - An io.ReadCloser from which compressed data may be read, and +// - A v1.Hash with the hash of the estargz table of contents, or +// - An error if the estargz processing encountered a problem. // // Refer to estargz for the options: // https://pkg.go.dev/github.com/containerd/stargz-snapshotter/estargz@v0.4.1#Option @@ -39,7 +38,7 @@ func ReadCloser(r io.ReadCloser, opts ...estargz.Option) (*estargz.Blob, v1.Hash defer r.Close() // TODO(#876): Avoid buffering into memory. - bs, err := ioutil.ReadAll(r) + bs, err := io.ReadAll(r) if err != nil { return nil, v1.Hash{}, err } diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/gzip/zip.go b/tools/vendor/github.com/google/go-containerregistry/internal/gzip/zip.go index 1a52694e8..018c0f8c0 100644 --- a/tools/vendor/github.com/google/go-containerregistry/internal/gzip/zip.go +++ b/tools/vendor/github.com/google/go-containerregistry/internal/gzip/zip.go @@ -24,7 +24,8 @@ import ( "github.com/google/go-containerregistry/internal/and" ) -var gzipMagicHeader = []byte{'\x1f', '\x8b'} +// MagicHeader is the start of gzip files. +var MagicHeader = []byte{'\x1f', '\x8b'} // ReadCloser reads uncompressed input data from the io.ReadCloser and // returns an io.ReadCloser from which compressed data may be read. @@ -84,7 +85,7 @@ func ReadCloserLevel(r io.ReadCloser, level int) io.ReadCloser { } // UnzipReadCloser reads compressed input data from the io.ReadCloser and -// returns an io.ReadCloser from which uncompessed data may be read. +// returns an io.ReadCloser from which uncompressed data may be read. func UnzipReadCloser(r io.ReadCloser) (io.ReadCloser, error) { gr, err := gzip.NewReader(r) if err != nil { @@ -113,34 +114,5 @@ func Is(r io.Reader) (bool, error) { if err != nil { return false, err } - return bytes.Equal(magicHeader, gzipMagicHeader), nil -} - -// PeekReader is an io.Reader that also implements Peek a la bufio.Reader. -type PeekReader interface { - io.Reader - Peek(n int) ([]byte, error) -} - -// Peek detects whether the input stream is gzip compressed. -// -// If r implements Peek, we will use that directly, otherwise a small number -// of bytes are buffered to Peek at the gzip header, and the returned -// PeekReader can be used as a replacement for the consumed input io.Reader. -func Peek(r io.Reader) (bool, PeekReader, error) { - var pr PeekReader - if p, ok := r.(PeekReader); ok { - pr = p - } else { - pr = bufio.NewReader(r) - } - header, err := pr.Peek(2) - if err != nil { - // https://github.com/google/go-containerregistry/issues/367 - if err == io.EOF { - return false, pr, nil - } - return false, pr, err - } - return bytes.Equal(header, gzipMagicHeader), pr, nil + return bytes.Equal(magicHeader, MagicHeader), nil } diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/redact/redact.go b/tools/vendor/github.com/google/go-containerregistry/internal/redact/redact.go index dc9c56b7f..b2e3f186c 100644 --- a/tools/vendor/github.com/google/go-containerregistry/internal/redact/redact.go +++ b/tools/vendor/github.com/google/go-containerregistry/internal/redact/redact.go @@ -17,6 +17,8 @@ package redact import ( "context" + "errors" + "net/url" ) type contextKey string @@ -33,3 +35,55 @@ func FromContext(ctx context.Context) (bool, string) { reason, ok := ctx.Value(redactKey).(string) return ok, reason } + +// Error redacts potentially sensitive query parameter values in the URL from the error's message. +// +// If the error is a *url.Error, this returns a *url.Error with the URL redacted. +// Any other error type, or nil, is returned unchanged. +func Error(err error) error { + // If the error is a url.Error, we can redact the URL. + // Otherwise (including if err is nil), we can't redact. + var uerr *url.Error + if ok := errors.As(err, &uerr); !ok { + return err + } + u, perr := url.Parse(uerr.URL) + if perr != nil { + return err // If the URL can't be parsed, just return the original error. + } + uerr.URL = URL(u).String() // Update the URL to the redacted URL. + return uerr +} + +// The set of query string keys that we expect to send as part of the registry +// protocol. Anything else is potentially dangerous to leak, as it's probably +// from a redirect. These redirects often included tokens or signed URLs. +var paramAllowlist = map[string]struct{}{ + // Token exchange + "scope": {}, + "service": {}, + // Cross-repo mounting + "mount": {}, + "from": {}, + // Layer PUT + "digest": {}, + // Listing tags and catalog + "n": {}, + "last": {}, +} + +// URL redacts potentially sensitive query parameter values from the URL's query string. +func URL(u *url.URL) *url.URL { + qs := u.Query() + for k, v := range qs { + for i := range v { + if _, ok := paramAllowlist[k]; !ok { + // key is not in the Allowlist + v[i] = "REDACTED" + } + } + } + r := *u + r.RawQuery = qs.Encode() + return &r +} diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/retry/retry.go b/tools/vendor/github.com/google/go-containerregistry/internal/retry/retry.go index 133cb1c12..c9e356450 100644 --- a/tools/vendor/github.com/google/go-containerregistry/internal/retry/retry.go +++ b/tools/vendor/github.com/google/go-containerregistry/internal/retry/retry.go @@ -18,6 +18,7 @@ package retry import ( "context" + "errors" "fmt" "github.com/google/go-containerregistry/internal/retry/wait" @@ -36,7 +37,7 @@ type temporary interface { // IsTemporary returns true if err implements Temporary() and it returns true. func IsTemporary(err error) bool { - if err == context.DeadlineExceeded { + if errors.Is(err, context.DeadlineExceeded) { return false } if te, ok := err.(temporary); ok && te.Temporary() { @@ -75,3 +76,19 @@ func Retry(f func() error, p Predicate, backoff wait.Backoff) (err error) { wait.ExponentialBackoff(backoff, condition) return } + +type contextKey string + +var key = contextKey("never") + +// Never returns a context that signals something should not be retried. +// This is a hack and can be used to communicate across package boundaries +// to avoid retry amplification. +func Never(ctx context.Context) context.Context { + return context.WithValue(ctx, key, true) +} + +// Ever returns true if the context was wrapped by Never. +func Ever(ctx context.Context) bool { + return ctx.Value(key) == nil +} diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/windows/windows.go b/tools/vendor/github.com/google/go-containerregistry/internal/windows/windows.go index f6a1ade08..62d04cfb3 100644 --- a/tools/vendor/github.com/google/go-containerregistry/internal/windows/windows.go +++ b/tools/vendor/github.com/google/go-containerregistry/internal/windows/windows.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "path" "strings" @@ -104,7 +103,7 @@ func Windows(layer v1.Layer) (v1.Layer, error) { b := w.Bytes() // gzip the contents, then create the layer opener := func() (io.ReadCloser, error) { - return gzip.ReadCloser(ioutil.NopCloser(bytes.NewReader(b))), nil + return gzip.ReadCloser(io.NopCloser(bytes.NewReader(b))), nil } layer, err = tarball.LayerFromOpener(opener) if err != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.go b/tools/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.go new file mode 100644 index 000000000..cccf54a30 --- /dev/null +++ b/tools/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.go @@ -0,0 +1,116 @@ +// Copyright 2022 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 zstd provides helper functions for interacting with zstd streams. +package zstd + +import ( + "bufio" + "bytes" + "io" + + "github.com/google/go-containerregistry/internal/and" + "github.com/klauspost/compress/zstd" +) + +// MagicHeader is the start of zstd files. +var MagicHeader = []byte{'\x28', '\xb5', '\x2f', '\xfd'} + +// ReadCloser reads uncompressed input data from the io.ReadCloser and +// returns an io.ReadCloser from which compressed data may be read. +// This uses zstd level 1 for the compression. +func ReadCloser(r io.ReadCloser) io.ReadCloser { + return ReadCloserLevel(r, 1) +} + +// ReadCloserLevel reads uncompressed input data from the io.ReadCloser and +// returns an io.ReadCloser from which compressed data may be read. +func ReadCloserLevel(r io.ReadCloser, level int) io.ReadCloser { + pr, pw := io.Pipe() + + // For highly compressible layers, zstd.Writer will output a very small + // number of bytes per Write(). This is normally fine, but when pushing + // to a registry, we want to ensure that we're taking full advantage of + // the available bandwidth instead of sending tons of tiny writes over + // the wire. + // 64K ought to be small enough for anybody. + bw := bufio.NewWriterSize(pw, 2<<16) + + // Returns err so we can pw.CloseWithError(err) + go func() error { + // TODO(go1.14): Just defer {pw,zw,r}.Close like you'd expect. + // Context: https://golang.org/issue/24283 + zw, err := zstd.NewWriter(bw, zstd.WithEncoderLevel(zstd.EncoderLevelFromZstd(level))) + if err != nil { + return pw.CloseWithError(err) + } + + if _, err := io.Copy(zw, r); err != nil { + defer r.Close() + defer zw.Close() + return pw.CloseWithError(err) + } + + // Close zstd writer to Flush it and write zstd trailers. + if err := zw.Close(); err != nil { + return pw.CloseWithError(err) + } + + // Flush bufio writer to ensure we write out everything. + if err := bw.Flush(); err != nil { + return pw.CloseWithError(err) + } + + // We don't really care if these fail. + defer pw.Close() + defer r.Close() + + return nil + }() + + return pr +} + +// UnzipReadCloser reads compressed input data from the io.ReadCloser and +// returns an io.ReadCloser from which uncompressed data may be read. +func UnzipReadCloser(r io.ReadCloser) (io.ReadCloser, error) { + gr, err := zstd.NewReader(r) + if err != nil { + return nil, err + } + return &and.ReadCloser{ + Reader: gr, + CloseFunc: func() error { + // If the unzip fails, then this seems to return the same + // error as the read. We don't want this to interfere with + // us closing the main ReadCloser, since this could leave + // an open file descriptor (fails on Windows). + gr.Close() + return r.Close() + }, + }, nil +} + +// Is detects whether the input stream is compressed. +func Is(r io.Reader) (bool, error) { + magicHeader := make([]byte, 4) + n, err := r.Read(magicHeader) + if n == 0 && err == io.EOF { + return false, nil + } + if err != nil { + return false, err + } + return bytes.Equal(magicHeader, MagicHeader), nil +} diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/README.md b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/README.md index 115789885..042bddec0 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/README.md +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/README.md @@ -68,7 +68,7 @@ import ( func main() { // ... - ecrHelper := ecr.ECRHelper{ClientFactory: api.DefaultClientFactory()} + ecrHelper := ecr.ECRHelper{ClientFactory: api.DefaultClientFactory{}} img, err := remote.Get(ref, remote.WithAuthFromKeychain(authn.NewKeychainFromHelper(ecrHelper))) if err != nil { panic(err) @@ -110,8 +110,8 @@ For example: kc := authn.NewMultiKeychain( authn.DefaultKeychain, google.Keychain, - authn.NewFromHelper(ecr.ECRHelper{ClientFactory: api.DefaultClientFactory{}}), - authn.NewFromHelper(acr.ACRCredHelper{}), + authn.NewKeychainFromHelper(ecr.ECRHelper{ClientFactory: api.DefaultClientFactory{}}), + authn.NewKeychainFromHelper(acr.ACRCredHelper{}), ) ``` diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/authn.go b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/authn.go index 690e81d05..172d218e4 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/authn.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/authn.go @@ -14,6 +14,19 @@ package authn +import ( + "encoding/base64" + "encoding/json" + "fmt" + "strings" +) + +// Authenticator is used to authenticate Docker transports. +type Authenticator interface { + // Authorization returns the value to use in an http transport's Authorization header. + Authorization() (*AuthConfig, error) +} + // AuthConfig contains authorization information for connecting to a Registry // Inlined what we use from github.com/docker/cli/cli/config/types type AuthConfig struct { @@ -29,8 +42,74 @@ type AuthConfig struct { RegistryToken string `json:"registrytoken,omitempty"` } -// Authenticator is used to authenticate Docker transports. -type Authenticator interface { - // Authorization returns the value to use in an http transport's Authorization header. - Authorization() (*AuthConfig, error) +// This is effectively a copy of the type AuthConfig. This simplifies +// JSON unmarshalling since AuthConfig methods are not inherited +type authConfig AuthConfig + +// UnmarshalJSON implements json.Unmarshaler +func (a *AuthConfig) UnmarshalJSON(data []byte) error { + var shadow authConfig + err := json.Unmarshal(data, &shadow) + if err != nil { + return err + } + + *a = (AuthConfig)(shadow) + + if len(shadow.Auth) != 0 { + var derr error + a.Username, a.Password, derr = decodeDockerConfigFieldAuth(shadow.Auth) + if derr != nil { + err = fmt.Errorf("unable to decode auth field: %w", derr) + } + } else if len(a.Username) != 0 && len(a.Password) != 0 { + a.Auth = encodeDockerConfigFieldAuth(shadow.Username, shadow.Password) + } + + return err +} + +// MarshalJSON implements json.Marshaler +func (a AuthConfig) MarshalJSON() ([]byte, error) { + shadow := (authConfig)(a) + shadow.Auth = encodeDockerConfigFieldAuth(shadow.Username, shadow.Password) + return json.Marshal(shadow) +} + +// decodeDockerConfigFieldAuth deserializes the "auth" field from dockercfg into a +// username and a password. The format of the auth field is base64(:). +// +// From https://github.com/kubernetes/kubernetes/blob/75e49ec824b183288e1dbaccfd7dbe77d89db381/pkg/credentialprovider/config.go +// Copyright 2014 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +func decodeDockerConfigFieldAuth(field string) (username, password string, err error) { + var decoded []byte + // StdEncoding can only decode padded string + // RawStdEncoding can only decode unpadded string + if strings.HasSuffix(strings.TrimSpace(field), "=") { + // decode padded data + decoded, err = base64.StdEncoding.DecodeString(field) + } else { + // decode unpadded data + decoded, err = base64.RawStdEncoding.DecodeString(field) + } + + if err != nil { + return + } + + parts := strings.SplitN(string(decoded), ":", 2) + if len(parts) != 2 { + err = fmt.Errorf("must be formatted as base64(username:password)") + return + } + + username = parts[0] + password = parts[1] + + return +} + +func encodeDockerConfigFieldAuth(username, password string) string { + return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go index f79b7260e..a4a88b3d5 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go @@ -75,15 +75,11 @@ func (dk *defaultKeychain) Resolve(target Resource) (Authenticator, error) { foundDockerConfig := false home, err := homedir.Dir() if err == nil { - if _, err := os.Stat(filepath.Join(home, ".docker/config.json")); err == nil { - foundDockerConfig = true - } + foundDockerConfig = fileExists(filepath.Join(home, ".docker/config.json")) } // If $HOME/.docker/config.json isn't found, check $DOCKER_CONFIG (if set) if !foundDockerConfig && os.Getenv("DOCKER_CONFIG") != "" { - if _, err := os.Stat(filepath.Join(os.Getenv("DOCKER_CONFIG"), "config.json")); err == nil { - foundDockerConfig = true - } + foundDockerConfig = fileExists(filepath.Join(os.Getenv("DOCKER_CONFIG"), "config.json")) } // If either of those locations are found, load it using Docker's // config.Load, which may fail if the config can't be parsed. @@ -101,10 +97,8 @@ func (dk *defaultKeychain) Resolve(target Resource) (Authenticator, error) { } } else { f, err := os.Open(filepath.Join(os.Getenv("XDG_RUNTIME_DIR"), "containers/auth.json")) - if os.IsNotExist(err) { + if err != nil { return Anonymous, nil - } else if err != nil { - return nil, err } defer f.Close() cf, err = config.LoadFromReader(f) @@ -116,20 +110,31 @@ func (dk *defaultKeychain) Resolve(target Resource) (Authenticator, error) { // See: // https://github.com/google/ko/issues/90 // https://github.com/moby/moby/blob/fc01c2b481097a6057bec3cd1ab2d7b4488c50c4/registry/config.go#L397-L404 - key := target.RegistryStr() - if key == name.DefaultRegistry { - key = DefaultAuthKey - } + var cfg, empty types.AuthConfig + for _, key := range []string{ + target.String(), + target.RegistryStr(), + } { + if key == name.DefaultRegistry { + key = DefaultAuthKey + } - cfg, err := cf.GetAuthConfig(key) - if err != nil { - return nil, err + cfg, err = cf.GetAuthConfig(key) + if err != nil { + return nil, err + } + // cf.GetAuthConfig automatically sets the ServerAddress attribute. Since + // we don't make use of it, clear the value for a proper "is-empty" test. + // See: https://github.com/google/go-containerregistry/issues/1510 + cfg.ServerAddress = "" + if cfg != empty { + break + } } - - empty := types.AuthConfig{} if cfg == empty { return Anonymous, nil } + return FromConfig(AuthConfig{ Username: cfg.Username, Password: cfg.Password, @@ -139,6 +144,12 @@ func (dk *defaultKeychain) Resolve(target Resource) (Authenticator, error) { }), nil } +// fileExists returns true if the given path exists and is not a directory. +func fileExists(path string) bool { + fi, err := os.Stat(path) + return err == nil && !fi.IsDir() +} + // Helper is a subset of the Docker credential helper credentials.Helper // interface used by NewKeychainFromHelper. // @@ -156,9 +167,14 @@ func NewKeychainFromHelper(h Helper) Keychain { return wrapper{h} } type wrapper struct{ h Helper } func (w wrapper) Resolve(r Resource) (Authenticator, error) { - u, p, err := w.h.Get(r.String()) + u, p, err := w.h.Get(r.RegistryStr()) if err != nil { return Anonymous, nil } + // If the secret being stored is an identity token, the Username should be set to + // ref: https://docs.docker.com/engine/reference/commandline/login/#credential-helper-protocol + if u == "" { + return FromConfig(AuthConfig{Username: u, IdentityToken: p}), nil + } return FromConfig(AuthConfig{Username: u, Password: p}), nil } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/compression/compression.go b/tools/vendor/github.com/google/go-containerregistry/pkg/compression/compression.go new file mode 100644 index 000000000..6686c2d8d --- /dev/null +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/compression/compression.go @@ -0,0 +1,26 @@ +// Copyright 2022 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 compression abstracts over gzip and zstd. +package compression + +// Compression is an enumeration of the supported compression algorithms +type Compression string + +// The collection of known MediaType values. +const ( + None Compression = "none" + GZip Compression = "gzip" + ZStd Compression = "zstd" +) diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/append.go b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/append.go index 92d6b7b3b..f1c2ef69a 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/append.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/append.go @@ -23,12 +23,10 @@ import ( "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/stream" "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/google/go-containerregistry/pkg/v1/types" ) func isWindows(img v1.Image) (bool, error) { - if img == nil { - return false, nil - } cfg, err := img.ConfigFile() if err != nil { return false, err @@ -42,14 +40,30 @@ func isWindows(img v1.Image) (bool, error) { // "windows"), the contents of the tarballs will be modified to be suitable for // a Windows container image.`, func Append(base v1.Image, paths ...string) (v1.Image, error) { + if base == nil { + return nil, fmt.Errorf("invalid argument: base") + } + win, err := isWindows(base) if err != nil { return nil, fmt.Errorf("getting base image: %w", err) } + baseMediaType, err := base.MediaType() + + if err != nil { + return nil, fmt.Errorf("getting base image media type: %w", err) + } + + layerType := types.DockerLayer + + if baseMediaType == types.OCIManifestSchema1 { + layerType = types.OCILayer + } + layers := make([]v1.Layer, 0, len(paths)) for _, path := range paths { - layer, err := getLayer(path) + layer, err := getLayer(path, layerType) if err != nil { return nil, fmt.Errorf("reading layer %q: %w", path, err) } @@ -67,16 +81,16 @@ func Append(base v1.Image, paths ...string) (v1.Image, error) { return mutate.AppendLayers(base, layers...) } -func getLayer(path string) (v1.Layer, error) { +func getLayer(path string, layerType types.MediaType) (v1.Layer, error) { f, err := streamFile(path) if err != nil { return nil, err } if f != nil { - return stream.NewLayer(f), nil + return stream.NewLayer(f, stream.WithMediaType(layerType)), nil } - return tarball.LayerFromFile(path) + return tarball.LayerFromFile(path, tarball.WithMediaType(layerType)) } // If we're dealing with a named pipe, trying to open it multiple times will diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.go b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.go index e9eee1ba4..36dfc2a64 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.go @@ -17,6 +17,7 @@ package crane import ( "archive/tar" "bytes" + "io" "sort" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -52,7 +53,11 @@ func Layer(filemap map[string][]byte) (v1.Layer, error) { if err := w.Close(); err != nil { return nil, err } - return tarball.LayerFromReader(b) + + // Return a new copy of the buffer each time it's opened. + return tarball.LayerFromOpener(func() (io.ReadCloser, error) { + return io.NopCloser(bytes.NewBuffer(b.Bytes())), nil + }) } // Image creates a image with the given filemaps as its contents. These images are reproducible and consistent. diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/options.go b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/options.go index 6e1177e4d..2e992789b 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/options.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/options.go @@ -29,6 +29,7 @@ type Options struct { Name []name.Option Remote []remote.Option Platform *v1.Platform + Keychain authn.Keychain } // GetOptions exposes the underlying []remote.Option, []name.Option, and @@ -44,6 +45,7 @@ func makeOptions(opts ...Option) Options { Remote: []remote.Option{ remote.WithAuthFromKeychain(authn.DefaultKeychain), }, + Keychain: authn.DefaultKeychain, } for _, o := range opts { o(&opt) @@ -86,6 +88,7 @@ func WithAuthFromKeychain(keys authn.Keychain) Option { return func(o *Options) { // Replace the default keychain at position 0. o.Remote[0] = remote.WithAuthFromKeychain(keys) + o.Keychain = keys } } @@ -108,6 +111,14 @@ func WithUserAgent(ua string) Option { } } +// WithNondistributable is an option that allows pushing non-distributable +// layers. +func WithNondistributable() Option { + return func(o *Options) { + o.Remote = append(o.Remote, remote.WithNondistributable) + } +} + // WithContext is a functional option for setting the context. func WithContext(ctx context.Context) Option { return func(o *Options) { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/pull.go b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/pull.go index b19ac7c21..7e6e5b7b6 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/crane/pull.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/crane/pull.go @@ -133,11 +133,8 @@ func MultiSaveOCI(imgMap map[string]v1.Image, path string) error { return err } } - for ref, img := range imgMap { - anns := map[string]string{ - "dev.ggcr.image.name": ref, - } - if err = p.AppendImage(img, layout.WithAnnotations(anns)); err != nil { + for _, img := range imgMap { + if err = p.AppendImage(img); err != nil { return err } } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.go b/tools/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.go index 77b5eabcd..2a2b73c1b 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.go @@ -187,9 +187,11 @@ func filterEmpty(h []v1.History) []v1.History { // One manifest.json file at the top level containing information about several images. // One repositories file mapping from the image / to to the id of the top most layer. // For every layer, a directory named with the layer ID is created with the following contents: -// layer.tar - The uncompressed layer tarball. -// .json- Layer metadata json. -// VERSION- Schema version string. Always set to "1.0". +// +// layer.tar - The uncompressed layer tarball. +// .json- Layer metadata json. +// VERSION- Schema version string. Always set to "1.0". +// // One file for the config blob, named after its SHA. func MultiWrite(refToImage map[name.Reference]v1.Image, w io.Writer) error { tf := tar.NewWriter(w) diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/logs/logs.go b/tools/vendor/github.com/google/go-containerregistry/pkg/logs/logs.go index 5d25d63d6..a5d25b188 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/logs/logs.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/logs/logs.go @@ -16,24 +16,24 @@ package logs import ( - "io/ioutil" + "io" "log" ) var ( // Warn is used to log non-fatal errors. - Warn = log.New(ioutil.Discard, "", log.LstdFlags) + Warn = log.New(io.Discard, "", log.LstdFlags) // Progress is used to log notable, successful events. - Progress = log.New(ioutil.Discard, "", log.LstdFlags) + Progress = log.New(io.Discard, "", log.LstdFlags) // Debug is used to log information that is useful for debugging. - Debug = log.New(ioutil.Discard, "", log.LstdFlags) + Debug = log.New(io.Discard, "", log.LstdFlags) ) // Enabled checks to see if the logger's writer is set to something other -// than ioutil.Discard. This allows callers to avoid expensive operations +// than io.Discard. This allows callers to avoid expensive operations // that will end up in /dev/null anyway. func Enabled(l *log.Logger) bool { - return l.Writer() != ioutil.Discard + return l.Writer() != io.Discard } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/name/digest.go b/tools/vendor/github.com/google/go-containerregistry/pkg/name/digest.go index e465aef49..c4a2e693e 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/name/digest.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/name/digest.go @@ -15,16 +15,14 @@ package name import ( + _ "crypto/sha256" // Recommended by go-digest. "strings" -) -const ( - // These have the form: sha256: - // TODO(dekkagaijin): replace with opencontainers/go-digest or docker/distribution's validation. - digestChars = "sh:0123456789abcdef" - digestDelim = "@" + "github.com/opencontainers/go-digest" ) +const digestDelim = "@" + // Digest stores a digest name in a structured form. type Digest struct { Repository @@ -60,10 +58,6 @@ func (d Digest) String() string { return d.original } -func checkDigest(name string) error { - return checkElement("digest", name, digestChars, 7+64, 7+64) -} - // NewDigest returns a new Digest representing the given name. func NewDigest(name string, opts ...Option) (Digest, error) { // Split on "@" @@ -72,10 +66,13 @@ func NewDigest(name string, opts ...Option) (Digest, error) { return Digest{}, newErrBadName("a digest must contain exactly one '@' separator (e.g. registry/repository@digest) saw: %s", name) } base := parts[0] - digest := parts[1] - - // Always check that the digest is valid. - if err := checkDigest(digest); err != nil { + dig := parts[1] + prefix := digest.Canonical.String() + ":" + if !strings.HasPrefix(dig, prefix) { + return Digest{}, newErrBadName("unsupported digest algorithm: %s", dig) + } + hex := strings.TrimPrefix(dig, prefix) + if err := digest.Canonical.Validate(hex); err != nil { return Digest{}, err } @@ -90,7 +87,7 @@ func NewDigest(name string, opts ...Option) (Digest, error) { } return Digest{ Repository: repo, - digest: digest, + digest: dig, original: name, }, nil } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/name/errors.go b/tools/vendor/github.com/google/go-containerregistry/pkg/name/errors.go index 035e35069..bf004ffcf 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/name/errors.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/name/errors.go @@ -28,8 +28,14 @@ func (e *ErrBadName) Error() string { return e.info } +// Is reports whether target is an error of type ErrBadName +func (e *ErrBadName) Is(target error) bool { + var berr *ErrBadName + return errors.As(target, &berr) +} + // newErrBadName returns a ErrBadName which returns the given formatted string from Error(). -func newErrBadName(fmtStr string, args ...interface{}) *ErrBadName { +func newErrBadName(fmtStr string, args ...any) *ErrBadName { return &ErrBadName{fmt.Sprintf(fmtStr, args...)} } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/name/ref.go b/tools/vendor/github.com/google/go-containerregistry/pkg/name/ref.go index 955c59a7b..912ab3301 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/name/ref.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/name/ref.go @@ -56,16 +56,16 @@ type stringConst string // To discourage its use in scenarios where the value is not known at code // authoring time, it must be passed a string constant: // -// const str = "valid/string" -// MustParseReference(str) -// MustParseReference("another/valid/string") -// MustParseReference(str + "/and/more") +// const str = "valid/string" +// MustParseReference(str) +// MustParseReference("another/valid/string") +// MustParseReference(str + "/and/more") // // These will not compile: // -// var str = "valid/string" -// MustParseReference(str) -// MustParseReference(strings.Join([]string{"valid", "string"}, "/")) +// var str = "valid/string" +// MustParseReference(str) +// MustParseReference(strings.Join([]string{"valid", "string"}, "/")) func MustParseReference(s stringConst, opts ...Option) Reference { ref, err := ParseReference(string(s), opts...) if err != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/config.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/config.go index a950b397c..08ec0158f 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/config.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/config.go @@ -37,6 +37,7 @@ type ConfigFile struct { RootFS RootFS `json:"rootfs"` Config Config `json:"config"` OSVersion string `json:"os.version,omitempty"` + Variant string `json:"variant,omitempty"` } // History is one entry of a list recording how this container image was built. @@ -89,8 +90,10 @@ type HealthConfig struct { } // Config is a submessage of the config file described as: -// The execution parameters which SHOULD be used as a base when running -// a container using the image. +// +// The execution parameters which SHOULD be used as a base when running +// a container using the image. +// // The names of the fields in this message are chosen to reflect the JSON // payload of the Config as defined here: // https://git.io/vrAET diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.go index ba90d4cdb..2e5f4358d 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.go @@ -16,7 +16,6 @@ package layout import ( "io" - "io/ioutil" "os" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -30,7 +29,7 @@ func (l Path) Blob(h v1.Hash) (io.ReadCloser, error) { // Bytes is a convenience function to return a blob from the Path as // a byte slice. func (l Path) Bytes(h v1.Hash) ([]byte, error) { - return ioutil.ReadFile(l.blobPath(h)) + return os.ReadFile(l.blobPath(h)) } func (l Path) blobPath(h v1.Hash) string { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.go index 6b7da2c22..7404f186b 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.go @@ -19,7 +19,7 @@ import ( "errors" "fmt" "io" - "io/ioutil" + "os" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/partial" @@ -45,7 +45,7 @@ func ImageIndexFromPath(path string) (v1.ImageIndex, error) { // ImageIndex returns a v1.ImageIndex for the Path. func (l Path) ImageIndex() (v1.ImageIndex, error) { - rawIndex, err := ioutil.ReadFile(l.path("index.json")) + rawIndex, err := os.ReadFile(l.path("index.json")) if err != nil { return nil, err } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.go index c322d7757..a26f9f371 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.go @@ -1,3 +1,17 @@ +// 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 layout import v1 "github.com/google/go-containerregistry/pkg/v1" diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.go index f912b124e..906b12aec 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.go @@ -17,15 +17,18 @@ package layout import ( "bytes" "encoding/json" + "errors" + "fmt" "io" - "io/ioutil" "os" "path/filepath" + "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/mutate" "github.com/google/go-containerregistry/pkg/v1/partial" + "github.com/google/go-containerregistry/pkg/v1/stream" "github.com/google/go-containerregistry/pkg/v1/types" "golang.org/x/sync/errgroup" ) @@ -41,33 +44,17 @@ func (l Path) AppendImage(img v1.Image, options ...Option) error { return err } - mt, err := img.MediaType() + desc, err := partial.Descriptor(img) 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, - } - o := makeOptions(options...) for _, opt := range o.descOpts { - opt(&desc) + opt(desc) } - return l.AppendDescriptor(desc) + return l.AppendDescriptor(*desc) } // AppendIndex writes a v1.ImageIndex to the Path and updates @@ -77,33 +64,17 @@ func (l Path) AppendIndex(ii v1.ImageIndex, options ...Option) error { return err } - mt, err := ii.MediaType() + desc, err := partial.Descriptor(ii) if err != nil { return err } - d, err := ii.Digest() - if err != nil { - return err - } - - manifest, err := ii.RawManifest() - if err != nil { - return err - } - - desc := v1.Descriptor{ - MediaType: mt, - Size: int64(len(manifest)), - Digest: d, - } - o := makeOptions(options...) for _, opt := range o.descOpts { - opt(&desc) + opt(desc) } - return l.AppendDescriptor(desc) + return l.AppendDescriptor(*desc) } // AppendDescriptor adds a descriptor to the index.json of the Path. @@ -215,40 +186,110 @@ func (l Path) WriteFile(name string, data []byte, perm os.FileMode) error { return err } - return ioutil.WriteFile(l.path(name), data, perm) + return os.WriteFile(l.path(name), data, perm) } // WriteBlob copies a file to the blobs/ directory in the Path from the given ReadCloser at // blobs/{hash.Algorithm}/{hash.Hex}. func (l Path) WriteBlob(hash v1.Hash, r io.ReadCloser) error { + return l.writeBlob(hash, -1, r, nil) +} + +func (l Path) writeBlob(hash v1.Hash, size int64, rc io.ReadCloser, renamer func() (v1.Hash, error)) error { + if hash.Hex == "" && renamer == nil { + panic("writeBlob called an invalid hash and no renamer") + } + dir := l.path("blobs", hash.Algorithm) if err := os.MkdirAll(dir, os.ModePerm); err != nil && !os.IsExist(err) { return err } + // Check if blob already exists and is the correct size file := filepath.Join(dir, hash.Hex) - if _, err := os.Stat(file); err == nil { - // Blob already exists, that's fine. + if s, err := os.Stat(file); err == nil && !s.IsDir() && (s.Size() == size || size == -1) { return nil } - w, err := os.Create(file) + + // If a renamer func was provided write to a temporary file + open := func() (*os.File, error) { return os.Create(file) } + if renamer != nil { + open = func() (*os.File, error) { return os.CreateTemp(dir, hash.Hex) } + } + w, err := open() if err != nil { return err } + if renamer != nil { + // Delete temp file if an error is encountered before renaming + defer func() { + if err := os.Remove(w.Name()); err != nil && !errors.Is(err, os.ErrNotExist) { + logs.Warn.Printf("error removing temporary file after encountering an error while writing blob: %v", err) + } + }() + } defer w.Close() - _, err = io.Copy(w, r) - return err -} + // Write to file and exit if not renaming + if n, err := io.Copy(w, rc); err != nil || renamer == nil { + return err + } else if size != -1 && n != size { + return fmt.Errorf("expected blob size %d, but only wrote %d", size, n) + } -// TODO: A streaming version of WriteBlob so we don't have to know the hash -// before we write it. + // Always close reader before renaming, since Close computes the digest in + // the case of streaming layers. If Close is not called explicitly, it will + // occur in a goroutine that is not guaranteed to succeed before renamer is + // called. When renamer is the layer's Digest method, it can return + // ErrNotComputed. + if err := rc.Close(); err != nil { + return err + } -// TODO: For streaming layers we should write to a tmp file then Rename to the -// final digest. + // Always close file before renaming + if err := w.Close(); err != nil { + return err + } + + // Rename file based on the final hash + finalHash, err := renamer() + if err != nil { + return fmt.Errorf("error getting final digest of layer: %w", err) + } + + renamePath := l.path("blobs", finalHash.Algorithm, finalHash.Hex) + return os.Rename(w.Name(), renamePath) +} + +// writeLayer writes the compressed layer to a blob. Unlike WriteBlob it will +// write to a temporary file (suffixed with .tmp) within the layout until the +// compressed reader is fully consumed and written to disk. Also unlike +// WriteBlob, it will not skip writing and exit without error when a blob file +// exists, but does not have the correct size. (The blob hash is not +// considered, because it may be expensive to compute.) func (l Path) writeLayer(layer v1.Layer) error { d, err := layer.Digest() - if err != nil { + if errors.Is(err, stream.ErrNotComputed) { + // Allow digest errors, since streams may not have calculated the hash + // yet. Instead, use an empty value, which will be transformed into a + // random file name with `os.CreateTemp` and the final digest will be + // calculated after writing to a temp file and before renaming to the + // final path. + d = v1.Hash{Algorithm: "sha256", Hex: ""} + } else if err != nil { + return err + } + + s, err := layer.Size() + if errors.Is(err, stream.ErrNotComputed) { + // Allow size errors, since streams may not have calculated the size + // yet. Instead, use zero as a sentinel value meaning that no size + // comparison can be done and any sized blob file should be considered + // valid and not overwritten. + // + // TODO: Provide an option to always overwrite blobs. + s = -1 + } else if err != nil { return err } @@ -257,7 +298,10 @@ func (l Path) writeLayer(layer v1.Layer) error { return err } - return l.WriteBlob(d, r) + if err := l.writeBlob(d, s, r, layer.Digest); err != nil { + return fmt.Errorf("error writing layer: %w", err) + } + return nil } // RemoveBlob removes a file from the blobs directory in the Path @@ -306,7 +350,7 @@ func (l Path) WriteImage(img v1.Image) error { if err != nil { return err } - if err := l.WriteBlob(cfgName, ioutil.NopCloser(bytes.NewReader(cfgBlob))); err != nil { + if err := l.WriteBlob(cfgName, io.NopCloser(bytes.NewReader(cfgBlob))); err != nil { return err } @@ -320,7 +364,7 @@ func (l Path) WriteImage(img v1.Image) error { return err } - return l.WriteBlob(d, ioutil.NopCloser(bytes.NewReader(manifest))) + return l.WriteBlob(d, io.NopCloser(bytes.NewReader(manifest))) } type withLayer interface { @@ -415,12 +459,15 @@ func (l Path) WriteIndex(ii v1.ImageIndex) error { // // The contents are written in the following format: // At the top level, there is: -// One oci-layout file containing the version of this image-layout. -// One index.json file listing descriptors for the contained images. +// +// One oci-layout file containing the version of this image-layout. +// One index.json file listing descriptors for the contained images. +// // Under blobs/, there is, for each image: -// One file for each layer, named after the layer's SHA. -// One file for each config blob, named after its SHA. -// One file for each manifest blob, named after its SHA. +// +// One file for each layer, named after the layer's SHA. +// One file for each config blob, named after its SHA. +// One file for each manifest blob, named after its SHA. func Write(path string, ii v1.ImageIndex) (Path, error) { lp := Path(path) // Always just write oci-layout file, since it's small. diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.go index 0f886667a..98b1ff909 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.go @@ -25,7 +25,9 @@ import ( type Matcher func(desc v1.Descriptor) bool // Name returns a match.Matcher that matches based on the value of the -// "org.opencontainers.image.ref.name" annotation: +// +// "org.opencontainers.image.ref.name" annotation: +// // github.com/opencontainers/image-spec/blob/v1.0.1/annotations.md#pre-defined-annotation-keys func Name(name string) Matcher { return Annotation(imagespec.AnnotationRefName, name) diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go index 834cee15f..93c230e3b 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go @@ -18,7 +18,6 @@ import ( "bytes" "encoding/json" "errors" - "strings" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/partial" @@ -141,14 +140,8 @@ func (i *image) compute() error { manifest.Config.MediaType = *i.configMediaType } - // With OCI media types, this should not be set, see discussion: - // https://github.com/opencontainers/image-spec/pull/795 if i.mediaType != nil { - if strings.Contains(string(*i.mediaType), types.OCIVendorPrefix) { - manifest.MediaType = "" - } else if strings.Contains(string(*i.mediaType), types.DockerVendorPrefix) { - manifest.MediaType = *i.mediaType - } + manifest.MediaType = *i.mediaType } if i.annotations != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go index d9694b29e..841995f15 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go @@ -17,7 +17,6 @@ package mutate import ( "encoding/json" "fmt" - "strings" "github.com/google/go-containerregistry/pkg/logs" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -131,14 +130,8 @@ func (i *index) compute() error { manifest.Manifests = manifests - // With OCI media types, this should not be set, see discussion: - // https://github.com/opencontainers/image-spec/pull/795 if i.mediaType != nil { - if strings.Contains(string(*i.mediaType), types.OCIVendorPrefix) { - manifest.MediaType = "" - } else if strings.Contains(string(*i.mediaType), types.DockerVendorPrefix) { - manifest.MediaType = *i.mediaType - } + manifest.MediaType = *i.mediaType } if i.annotations != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go index 7a1f59fed..022fc818a 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go @@ -21,7 +21,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "path/filepath" "strings" "time" @@ -126,15 +125,15 @@ type Annotatable interface { // The annotatable 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 := Annotations(empty.Image, map[string]string{ -// "foo": "bar", -// }).(v1.Image) +// img := Annotations(empty.Image, map[string]string{ +// "foo": "bar", +// }).(v1.Image) // // Or for an index: // -// idx := Annotations(empty.Index, map[string]string{ -// "foo": "bar", -// }).(v1.ImageIndex) +// idx := Annotations(empty.Index, map[string]string{ +// "foo": "bar", +// }).(v1.ImageIndex) // // If the input Annotatable is not an Image or ImageIndex, the result will // attempt to lazily annotate the raw manifest. @@ -164,7 +163,7 @@ func (a arbitraryRawManifest) RawManifest() ([]byte, error) { if err != nil { return nil, err } - var m map[string]interface{} + var m map[string]any if err := json.Unmarshal(b, &m); err != nil { return nil, err } @@ -244,6 +243,7 @@ func extract(img v1.Image, w io.Writer) error { if err != nil { return fmt.Errorf("retrieving image layers: %w", err) } + // we iterate through the layers in reverse order because it makes handling // whiteout layers more efficient, since we can just keep track of the removed // files as we see .wh. layers and ignore those in previous layers. @@ -267,6 +267,10 @@ func extract(img v1.Image, w io.Writer) error { // Some tools prepend everything with "./", so if we don't Clean the // name, we may have duplicate entries, which angers tar-split. header.Name = filepath.Clean(header.Name) + // force PAX format to remove Name/Linkname length limit of 100 characters + // required by USTAR and to not depend on internal tar package guess which + // prefers USTAR over PAX + header.Format = tar.FormatPAX basename := filepath.Base(header.Name) dirname := filepath.Dir(header.Name) @@ -297,7 +301,9 @@ func extract(img v1.Image, w io.Writer) error { // any entries with a matching (or child) name fileMap[name] = tombstone || !(header.Typeflag == tar.TypeDir) if !tombstone { - tarWriter.WriteHeader(header) + if err := tarWriter.WriteHeader(header); err != nil { + return err + } if header.Size > 0 { if _, err := io.CopyN(tarWriter, tarReader, header.Size); err != nil { return err @@ -326,6 +332,13 @@ func inWhiteoutDir(fileMap map[string]bool, file string) bool { return false } +func max(a, b int) int { + if a > b { + return a + } + return b +} + // Time sets all timestamps in an image to the given timestamp. func Time(img v1.Image, t time.Time) (v1.Image, error) { newImage := empty.Image @@ -335,24 +348,43 @@ func Time(img v1.Image, t time.Time) (v1.Image, error) { return nil, fmt.Errorf("getting image layers: %w", err) } - // Strip away all timestamps from layers - newLayers := make([]v1.Layer, len(layers)) - for idx, layer := range layers { - newLayer, err := layerTime(layer, t) + ocf, err := img.ConfigFile() + if err != nil { + return nil, fmt.Errorf("getting original config file: %w", err) + } + + addendums := make([]Addendum, max(len(ocf.History), len(layers))) + var historyIdx, addendumIdx int + for layerIdx := 0; layerIdx < len(layers); addendumIdx, layerIdx = addendumIdx+1, layerIdx+1 { + newLayer, err := layerTime(layers[layerIdx], t) if err != nil { return nil, fmt.Errorf("setting layer times: %w", err) } - newLayers[idx] = newLayer + + // try to search for the history entry that corresponds to this layer + for ; historyIdx < len(ocf.History); historyIdx++ { + addendums[addendumIdx].History = ocf.History[historyIdx] + // if it's an EmptyLayer, do not set the Layer and have the Addendum with just the History + // and move on to the next History entry + if ocf.History[historyIdx].EmptyLayer { + addendumIdx++ + continue + } + // otherwise, we can exit from the cycle + historyIdx++ + break + } + addendums[addendumIdx].Layer = newLayer } - newImage, err = AppendLayers(newImage, newLayers...) - if err != nil { - return nil, fmt.Errorf("appending layers: %w", err) + // add all leftover History entries + for ; historyIdx < len(ocf.History); historyIdx, addendumIdx = historyIdx+1, addendumIdx+1 { + addendums[addendumIdx].History = ocf.History[historyIdx] } - ocf, err := img.ConfigFile() + newImage, err = Append(newImage, addendums...) if err != nil { - return nil, fmt.Errorf("getting original config file: %w", err) + return nil, fmt.Errorf("appending layers: %w", err) } cf, err := newImage.ConfigFile() @@ -377,6 +409,7 @@ func Time(img v1.Image, t time.Time) (v1.Image, error) { h.Comment = ocf.History[i].Comment h.EmptyLayer = ocf.History[i].EmptyLayer // Explicitly ignore Author field; which hinders reproducibility + h.Author = "" cfg.History[i] = h } @@ -423,7 +456,7 @@ func layerTime(layer v1.Layer, t time.Time) (v1.Layer, error) { b := w.Bytes() // gzip the contents, then create the layer opener := func() (io.ReadCloser, error) { - return gzip.ReadCloser(ioutil.NopCloser(bytes.NewReader(b))), nil + return gzip.ReadCloser(io.NopCloser(bytes.NewReader(b))), nil } layer, err = tarball.LayerFromOpener(opener) if err != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.go index c99951728..44989ac96 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.go @@ -18,7 +18,10 @@ import ( "io" "github.com/google/go-containerregistry/internal/and" + "github.com/google/go-containerregistry/internal/compression" "github.com/google/go-containerregistry/internal/gzip" + "github.com/google/go-containerregistry/internal/zstd" + comp "github.com/google/go-containerregistry/pkg/compression" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) @@ -51,23 +54,27 @@ func (cle *compressedLayerExtender) Uncompressed() (io.ReadCloser, error) { return nil, err } - // Often, the "compressed" bytes are not actually gzip-compressed. - // Peek at the first two bytes to determine whether or not it's correct to - // wrap this with gzip.UnzipReadCloser. - gzipped, pr, err := gzip.Peek(rc) + // Often, the "compressed" bytes are not actually-compressed. + // Peek at the first two bytes to determine whether it's correct to + // wrap this with gzip.UnzipReadCloser or zstd.UnzipReadCloser. + cp, pr, err := compression.PeekCompression(rc) if err != nil { return nil, err } + prc := &and.ReadCloser{ Reader: pr, CloseFunc: rc.Close, } - if !gzipped { + switch cp { + case comp.GZip: + return gzip.UnzipReadCloser(prc) + case comp.ZStd: + return zstd.UnzipReadCloser(prc) + default: return prc, nil } - - return gzip.UnzipReadCloser(prc) } // DiffID implements v1.Layer diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go index 3a5c61572..3ad499289 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" @@ -67,12 +66,12 @@ func (cl *configLayer) DiffID() (v1.Hash, error) { // Uncompressed implements v1.Layer func (cl *configLayer) Uncompressed() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewBuffer(cl.content)), nil + return io.NopCloser(bytes.NewBuffer(cl.content)), nil } // Compressed implements v1.Layer func (cl *configLayer) Compressed() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewBuffer(cl.content)), nil + return io.NopCloser(bytes.NewBuffer(cl.content)), nil } // Size implements v1.Layer @@ -88,9 +87,22 @@ func (cl *configLayer) MediaType() (types.MediaType, error) { var _ v1.Layer = (*configLayer)(nil) +// withConfigLayer allows partial image implementations to provide a layer +// for their config file. +type withConfigLayer interface { + ConfigLayer() (v1.Layer, error) +} + // ConfigLayer implements v1.Layer from the raw config bytes. // This is so that clients (e.g. remote) can access the config as a blob. +// +// Images that want to return a specific layer implementation can implement +// withConfigLayer. func ConfigLayer(i WithRawConfigFile) (v1.Layer, error) { + if wcl, ok := unwrap(i).(withConfigLayer); ok { + return wcl.ConfigLayer() + } + h, err := ConfigName(i) if err != nil { return nil, err @@ -342,7 +354,7 @@ func UncompressedSize(l v1.Layer) (int64, error) { } defer rc.Close() - return io.Copy(ioutil.Discard, rc) + return io.Copy(io.Discard, rc) } type withExists interface { @@ -372,7 +384,7 @@ func Exists(l v1.Layer) (bool, error) { // Recursively unwrap our wrappers so that we can check for the original implementation. // We might want to expose this? -func unwrap(i interface{}) interface{} { +func unwrap(i any) any { if ule, ok := i.(*uncompressedLayerExtender); ok { return unwrap(ule.UncompressedLayer) } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go index b52f163bf..9ee91ee29 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/platform.go @@ -15,7 +15,9 @@ package v1 import ( + "fmt" "sort" + "strings" ) // Platform represents the target os/arch for an image. @@ -28,11 +30,59 @@ type Platform struct { Features []string `json:"features,omitempty"` } +func (p Platform) String() string { + if p.OS == "" { + return "" + } + var b strings.Builder + b.WriteString(p.OS) + if p.Architecture != "" { + b.WriteString("/") + b.WriteString(p.Architecture) + } + if p.Variant != "" { + b.WriteString("/") + b.WriteString(p.Variant) + } + if p.OSVersion != "" { + b.WriteString(":") + b.WriteString(p.OSVersion) + } + return b.String() +} + +// ParsePlatform parses a string representing a Platform, if possible. +func ParsePlatform(s string) (*Platform, error) { + var p Platform + parts := strings.Split(strings.TrimSpace(s), ":") + if len(parts) == 2 { + p.OSVersion = parts[1] + } + parts = strings.Split(parts[0], "/") + if len(parts) > 0 { + p.OS = parts[0] + } + if len(parts) > 1 { + p.Architecture = parts[1] + } + if len(parts) > 2 { + p.Variant = parts[2] + } + if len(parts) > 3 { + return nil, fmt.Errorf("too many slashes in platform spec: %s", s) + } + return &p, nil +} + // Equals returns true if the given platform is semantically equivalent to this one. // The order of Features and OSFeatures is not important. func (p Platform) Equals(o Platform) bool { - return p.OS == o.OS && p.Architecture == o.Architecture && p.Variant == o.Variant && p.OSVersion == o.OSVersion && - stringSliceEqualIgnoreOrder(p.OSFeatures, o.OSFeatures) && stringSliceEqualIgnoreOrder(p.Features, o.Features) + return p.OS == o.OS && + p.Architecture == o.Architecture && + p.Variant == o.Variant && + p.OSVersion == o.OSVersion && + stringSliceEqualIgnoreOrder(p.OSFeatures, o.OSFeatures) && + stringSliceEqualIgnoreOrder(p.Features, o.Features) } // stringSliceEqual compares 2 string slices and returns if their contents are identical. diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.go index 25d86956f..b4395c239 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.go @@ -1,3 +1,17 @@ +// 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 remote import ( @@ -24,7 +38,7 @@ func CheckPushPermission(ref name.Reference, kc authn.Keychain, t http.RoundTrip } scopes := []string{ref.Scope(transport.PushScope)} - tr, err := transport.New(ref.Context().Registry, auth, t, scopes) + tr, err := transport.NewWithContext(context.TODO(), ref.Context().Registry, auth, t, scopes) if err != nil { return fmt.Errorf("creating push check transport for %v failed: %w", ref.Context().Registry, err) } @@ -35,11 +49,10 @@ func CheckPushPermission(ref name.Reference, kc authn.Keychain, t http.RoundTrip // authorize a push. Figure out how to return early here when we can, // to avoid a roundtrip for spec-compliant registries. w := writer{ - repo: ref.Context(), - client: &http.Client{Transport: tr}, - context: context.Background(), + repo: ref.Context(), + client: &http.Client{Transport: tr}, } - loc, _, err := w.initiateUpload("", "") + loc, _, err := w.initiateUpload(context.Background(), "", "", "") if loc != "" { // Since we're only initiating the upload to check whether we // can, we should attempt to cancel it, in case initiating diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go index 755e81929..9c8ae168f 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go @@ -19,11 +19,11 @@ import ( "context" "fmt" "io" - "io/ioutil" "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" @@ -259,7 +259,7 @@ func (f *fetcher) fetchManifest(ref name.Reference, acceptable []types.MediaType return nil, nil, err } - manifest, err := ioutil.ReadAll(resp.Body) + manifest, err := io.ReadAll(resp.Body) if err != nil { return nil, nil, err } @@ -367,7 +367,7 @@ func (f *fetcher) fetchBlob(ctx context.Context, size int64, h v1.Hash) (io.Read resp, err := f.Client.Do(req.WithContext(ctx)) if err != nil { - return nil, err + return nil, redact.Error(err) } if err := transport.CheckError(resp, http.StatusOK); err != nil { @@ -398,7 +398,7 @@ func (f *fetcher) headBlob(h v1.Hash) (*http.Response, error) { resp, err := f.Client.Do(req.WithContext(f.context)) if err != nil { - return nil, err + return nil, redact.Error(err) } if err := transport.CheckError(resp, http.StatusOK); err != nil { @@ -418,7 +418,7 @@ func (f *fetcher) blobExists(h v1.Hash) (bool, error) { resp, err := f.Client.Do(req.WithContext(f.context)) if err != nil { - return false, err + return false, redact.Error(err) } defer resp.Body.Close() diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go index a36416d8c..4e17de76e 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go @@ -17,7 +17,6 @@ package remote import ( "bytes" "io" - "io/ioutil" "net/http" "net/url" "sync" @@ -115,7 +114,7 @@ func (r *remoteImage) RawConfigFile() ([]byte, error) { } defer body.Close() - r.config, err = ioutil.ReadAll(body) + r.config, err = io.ReadAll(body) if err != nil { return nil, err } @@ -153,7 +152,7 @@ func (rl *remoteImageLayer) Compressed() (io.ReadCloser, error) { } if d.Data != nil { - return verify.ReadCloser(ioutil.NopCloser(bytes.NewReader(d.Data)), d.Size, d.Digest) + return verify.ReadCloser(io.NopCloser(bytes.NewReader(d.Data)), d.Size, d.Digest) } // We don't want to log binary layers -- this can break terminals. diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go index 989857918..a4ee74c05 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go @@ -194,10 +194,12 @@ func (r *remoteIndex) imageByPlatform(platform v1.Platform) (v1.Image, error) { // This naively matches the first manifest with matching platform attributes. // // We should probably use this instead: -// github.com/containerd/containerd/platforms +// +// github.com/containerd/containerd/platforms // // But first we'd need to migrate to: -// github.com/opencontainers/image-spec/specs-go/v1 +// +// github.com/opencontainers/image-spec/specs-go/v1 func (r *remoteIndex) childByPlatform(platform v1.Platform) (*Descriptor, error) { index, err := r.IndexManifest() if err != nil { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.go index 728997044..36d088567 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.go @@ -93,3 +93,16 @@ func (mi *mountableImage) LayerByDiffID(d v1.Hash) (v1.Layer, error) { func (mi *mountableImage) Descriptor() (*v1.Descriptor, error) { return partial.Descriptor(mi.Image) } + +// ConfigLayer retains the original reference so that it can be mounted. +// See partial.ConfigLayer. +func (mi *mountableImage) ConfigLayer() (v1.Layer, error) { + l, err := partial.ConfigLayer(mi.Image) + if err != nil { + return nil, err + } + return &MountableLayer{ + Layer: l, + Reference: mi.Reference, + }, nil +} diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go index 7e41d94c4..7f32413ce 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go @@ -87,32 +87,31 @@ func MultiWrite(m map[name.Reference]Taggable, options ...Option) (rerr error) { return err } w := writer{ - repo: repo, - client: &http.Client{Transport: tr}, - context: o.context, - updates: o.updates, - lastUpdate: &v1.Update{}, - backoff: o.retryBackoff, - predicate: o.retryPredicate, + repo: repo, + client: &http.Client{Transport: tr}, + backoff: o.retryBackoff, + predicate: o.retryPredicate, } // 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() { _ = sendError(o.updates, rerr) }() + defer func() { _ = w.progress.err(rerr) }() for _, b := range blobs { size, err := b.Size() if err != nil { return err } - w.lastUpdate.Total += size + w.progress.total(size) } countManifest := func(t Taggable) error { b, err := t.RawManifest() if err != nil { return err } - w.lastUpdate.Total += int64(len(b)) + w.progress.total(int64(len(b))) return nil } for _, i := range images { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go index 3ed1d7dd0..91b9005c9 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go @@ -59,7 +59,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, syscall.EPIPE) { + if retry.IsTemporary(err) || errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF) || errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) { logs.Warn.Printf("retrying %v", err) return true } @@ -74,6 +74,22 @@ var defaultRetryBackoff = Backoff{ Steps: 3, } +// Useful for tests +var fastBackoff = Backoff{ + Duration: 1.0 * time.Millisecond, + Factor: 3.0, + Jitter: 0.1, + Steps: 3, +} + +var retryableStatusCodes = []int{ + http.StatusRequestTimeout, + http.StatusInternalServerError, + http.StatusBadGateway, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout, +} + const ( defaultJobs = 4 @@ -84,13 +100,10 @@ const ( // DefaultTransport is based on http.DefaultTransport with modifications // documented inline below. -var DefaultTransport = &http.Transport{ +var DefaultTransport http.RoundTripper = &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ - // By default we wrap the transport in retries, so reduce the - // default dial timeout to 5s to avoid 5x 30s of connection - // timeouts when doing the "ping" on certain http registries. - Timeout: 5 * time.Second, + Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, ForceAttemptHTTP2: true, @@ -102,7 +115,6 @@ var DefaultTransport = &http.Transport{ func makeOptions(target authn.Resource, opts ...Option) (*options, error) { o := &options{ - auth: authn.Anonymous, transport: DefaultTransport, platform: defaultPlatform, context: context.Background(), @@ -118,12 +130,19 @@ func makeOptions(target authn.Resource, opts ...Option) (*options, error) { } } - if o.keychain != nil { + switch { + case o.auth != nil && o.keychain != nil: + // 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 } // transport.Wrapper is a signal that consumers are opt-ing into providing their own transport without any additional wrapping. @@ -137,7 +156,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) + o.transport = transport.NewRetry(o.transport, transport.WithRetryPredicate(defaultRetryPredicate), transport.WithRetryStatusCodes(retryableStatusCodes...)) // Wrap this last to prevent transport.New from double-wrapping. if o.userAgent != "" { @@ -163,6 +182,7 @@ func WithTransport(t http.RoundTripper) Option { // WithAuth is a functional option for overriding the default authenticator // for remote operations. +// It is an error to use both WithAuth and WithAuthFromKeychain in the same Option set. // // The default authenticator is authn.Anonymous. func WithAuth(auth authn.Authenticator) Option { @@ -175,6 +195,7 @@ func WithAuth(auth authn.Authenticator) Option { // WithAuthFromKeychain is a functional option for overriding the default // authenticator for remote operations, using an authn.Keychain to find // credentials. +// It is an error to use both WithAuth and WithAuthFromKeychain in the same Option set. // // The default authenticator is authn.Anonymous. func WithAuthFromKeychain(keys authn.Keychain) Option { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go new file mode 100644 index 000000000..1f4396350 --- /dev/null +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go @@ -0,0 +1,69 @@ +// Copyright 2022 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 ( + "io" + "sync" + "sync/atomic" + + v1 "github.com/google/go-containerregistry/pkg/v1" +) + +type progress struct { + sync.Mutex + updates chan<- v1.Update + lastUpdate *v1.Update +} + +func (p *progress) total(delta int64) { + atomic.AddInt64(&p.lastUpdate.Total, delta) +} + +func (p *progress) complete(delta int64) { + p.Lock() + defer p.Unlock() + p.updates <- v1.Update{ + Total: p.lastUpdate.Total, + Complete: atomic.AddInt64(&p.lastUpdate.Complete, delta), + } +} + +func (p *progress) err(err error) error { + if err != nil && p.updates != nil { + p.updates <- v1.Update{Error: err} + } + return err +} + +type progressReader struct { + rc io.ReadCloser + + count *int64 // number of bytes this reader has read, to support resetting on retry. + progress *progress +} + +func (r *progressReader) Read(b []byte) (int, error) { + n, err := r.rc.Read(b) + if err != nil { + return n, err + } + atomic.AddInt64(r.count, int64(n)) + // TODO: warn/debug log if sending takes too long, or if sending is blocked while context is canceled. + r.progress.complete(int64(n)) + return n, nil +} + +func (r *progressReader) Close() error { return r.rc.Close() } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.go index 37bbab21b..ea07ff6ab 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.go @@ -19,7 +19,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "net" "net/http" "net/url" @@ -87,26 +87,27 @@ func (bt *bearerTransport) RoundTrip(in *http.Request) (*http.Response, error) { // If we hit a WWW-Authenticate challenge, it might be due to expired tokens or insufficient scope. if challenges := authchallenge.ResponseChallenges(res); len(challenges) != 0 { + // close out old response, since we will not return it. + res.Body.Close() + + newScopes := []string{} for _, wac := range challenges { // TODO(jonjohnsonjr): Should we also update "realm" or "service"? - if scope, ok := wac.Parameters["scope"]; ok { - // From https://tools.ietf.org/html/rfc6750#section-3 - // The "scope" attribute is defined in Section 3.3 of [RFC6749]. The - // "scope" attribute is a space-delimited list of case-sensitive scope - // values indicating the required scope of the access token for - // accessing the requested resource. - scopes := strings.Split(scope, " ") - + if want, ok := wac.Parameters["scope"]; ok { // Add any scopes that we don't already request. got := stringSet(bt.scopes) - for _, want := range scopes { - if _, ok := got[want]; !ok { - bt.scopes = append(bt.scopes, want) - } + if _, ok := got[want]; !ok { + newScopes = append(newScopes, want) } } } + // Some registries seem to only look at the first scope parameter during a token exchange. + // If a request fails because it's missing a scope, we should put those at the beginning, + // otherwise the registry might just ignore it :/ + newScopes = append(newScopes, bt.scopes...) + bt.scopes = newScopes + // TODO(jonjohnsonjr): Teach transport.Error about "error" and "error_description" from challenge. // Retry the request to attempt to get a valid token. @@ -235,7 +236,9 @@ func (bt *bearerTransport) refreshOauth(ctx context.Context) ([]byte, error) { v := url.Values{} v.Set("scope", strings.Join(bt.scopes, " ")) - v.Set("service", bt.service) + if bt.service != "" { + v.Set("service", bt.service) + } v.Set("client_id", defaultUserAgent) if auth.IdentityToken != "" { v.Set("grant_type", "refresh_token") @@ -265,11 +268,13 @@ func (bt *bearerTransport) refreshOauth(ctx context.Context) ([]byte, error) { defer resp.Body.Close() if err := CheckError(resp, http.StatusOK); err != nil { - logs.Warn.Printf("No matching credentials were found for %q", bt.registry) + if bt.basic == authn.Anonymous { + logs.Warn.Printf("No matching credentials were found for %q", bt.registry) + } return nil, err } - return ioutil.ReadAll(resp.Body) + return io.ReadAll(resp.Body) } // https://docs.docker.com/registry/spec/auth/token/ @@ -305,9 +310,11 @@ func (bt *bearerTransport) refreshBasic(ctx context.Context) ([]byte, error) { defer resp.Body.Close() if err := CheckError(resp, http.StatusOK); err != nil { - logs.Warn.Printf("No matching credentials were found for %q", bt.registry) + if bt.basic == authn.Anonymous { + logs.Warn.Printf("No matching credentials were found for %q", bt.registry) + } return nil, err } - return ioutil.ReadAll(resp.Body) + return io.ReadAll(resp.Body) } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go index b94b180cc..c0e433730 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go @@ -17,28 +17,12 @@ package transport import ( "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" - "net/url" "strings" -) -// The set of query string keys that we expect to send as part of the registry -// protocol. Anything else is potentially dangerous to leak, as it's probably -// from a redirect. These redirects often included tokens or signed URLs. -var paramAllowlist = map[string]struct{}{ - // Token exchange - "scope": {}, - "service": {}, - // Cross-repo mounting - "mount": {}, - "from": {}, - // Layer PUT - "digest": {}, - // Listing tags and catalog - "n": {}, - "last": {}, -} + "github.com/google/go-containerregistry/internal/redact" +) // Error implements error to support the following error specification: // https://github.com/docker/distribution/blob/master/docs/spec/api.md#errors @@ -59,7 +43,7 @@ var _ error = (*Error)(nil) func (e *Error) Error() string { prefix := "" if e.Request != nil { - prefix = fmt.Sprintf("%s %s: ", e.Request.Method, redactURL(e.Request.URL)) + prefix = fmt.Sprintf("%s %s: ", e.Request.Method, redact.URL(e.Request.URL)) } return prefix + e.responseErr() } @@ -100,27 +84,11 @@ func (e *Error) Temporary() bool { return true } -// TODO(jonjohnsonjr): Consider moving to internal/redact. -func redactURL(original *url.URL) *url.URL { - qs := original.Query() - for k, v := range qs { - for i := range v { - if _, ok := paramAllowlist[k]; !ok { - // key is not in the Allowlist - v[i] = "REDACTED" - } - } - } - redacted := *original - redacted.RawQuery = qs.Encode() - return &redacted -} - // Diagnostic represents a single error returned by a Docker registry interaction. type Diagnostic struct { - Code ErrorCode `json:"code"` - Message string `json:"message,omitempty"` - Detail interface{} `json:"detail,omitempty"` + Code ErrorCode `json:"code"` + Message string `json:"message,omitempty"` + Detail any `json:"detail,omitempty"` } // String stringifies the Diagnostic in the form: $Code: $Message[; $Detail] @@ -185,7 +153,7 @@ func CheckError(resp *http.Response, codes ...int) error { return nil } } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return err } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.go index 897aa703c..d852ef845 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.go @@ -19,11 +19,12 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "strings" + "time" authchallenge "github.com/docker/distribution/registry/client/auth/challenge" + "github.com/google/go-containerregistry/pkg/logs" "github.com/google/go-containerregistry/pkg/name" ) @@ -35,6 +36,9 @@ const ( bearer challenge = "bearer" ) +// 300ms is the default fallback period for go's DNS dialer but we could make this configurable. +var fallbackDelay = 300 * time.Millisecond + type pingResp struct { challenge challenge @@ -50,27 +54,7 @@ func (c challenge) Canonical() challenge { return challenge(strings.ToLower(string(c))) } -func parseChallenge(suffix string) map[string]string { - kv := make(map[string]string) - for _, token := range strings.Split(suffix, ",") { - // Trim any whitespace around each token. - token = strings.Trim(token, " ") - - // Break the token into a key/value pair - if parts := strings.SplitN(token, "=", 2); len(parts) == 2 { - // Unquote the value, if it is quoted. - kv[parts[0]] = strings.Trim(parts[1], `"`) - } else { - // If there was only one part, treat is as a key with an empty value - kv[token] = "" - } - } - return kv -} - func ping(ctx context.Context, reg name.Registry, t http.RoundTripper) (*pingResp, error) { - client := http.Client{Transport: t} - // This first attempts to use "https" for every request, falling back to http // if the registry matches our localhost heuristic or if it is intentionally // set to insecure via name.NewInsecureRegistry. @@ -78,54 +62,117 @@ func ping(ctx context.Context, reg name.Registry, t http.RoundTripper) (*pingRes if reg.Scheme() == "http" { schemes = append(schemes, "http") } + if len(schemes) == 1 { + return pingSingle(ctx, reg, t, schemes[0]) + } + return pingParallel(ctx, reg, t, schemes) +} - var errs []string - for _, scheme := range schemes { - url := fmt.Sprintf("%s://%s/v2/", scheme, reg.Name()) - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, err - } - resp, err := client.Do(req.WithContext(ctx)) - if err != nil { - errs = append(errs, err.Error()) - // Potentially retry with http. - continue - } - defer func() { - // By draining the body, make sure to reuse the connection made by - // the ping for the following access to the registry - io.Copy(ioutil.Discard, resp.Body) - resp.Body.Close() - }() - - switch resp.StatusCode { - case http.StatusOK: - // If we get a 200, then no authentication is needed. +func pingSingle(ctx context.Context, reg name.Registry, t http.RoundTripper, scheme string) (*pingResp, error) { + client := http.Client{Transport: t} + url := fmt.Sprintf("%s://%s/v2/", scheme, reg.Name()) + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, err + } + resp, err := client.Do(req.WithContext(ctx)) + if err != nil { + return nil, err + } + defer func() { + // By draining the body, make sure to reuse the connection made by + // the ping for the following access to the registry + io.Copy(io.Discard, resp.Body) + resp.Body.Close() + }() + + switch resp.StatusCode { + case http.StatusOK: + // If we get a 200, then no authentication is needed. + return &pingResp{ + challenge: anonymous, + scheme: scheme, + }, nil + case http.StatusUnauthorized: + if challenges := authchallenge.ResponseChallenges(resp); len(challenges) != 0 { + // If we hit more than one, let's try to find one that we know how to handle. + wac := pickFromMultipleChallenges(challenges) return &pingResp{ - challenge: anonymous, - scheme: scheme, + challenge: challenge(wac.Scheme).Canonical(), + parameters: wac.Parameters, + scheme: scheme, }, nil - case http.StatusUnauthorized: - if challenges := authchallenge.ResponseChallenges(resp); len(challenges) != 0 { - // If we hit more than one, let's try to find one that we know how to handle. - wac := pickFromMultipleChallenges(challenges) - return &pingResp{ - challenge: challenge(wac.Scheme).Canonical(), - parameters: wac.Parameters, - scheme: scheme, - }, nil + } + // Otherwise, just return the challenge without parameters. + return &pingResp{ + challenge: challenge(resp.Header.Get("WWW-Authenticate")).Canonical(), + scheme: scheme, + }, nil + default: + return nil, CheckError(resp, http.StatusOK, http.StatusUnauthorized) + } +} + +// Based on the golang happy eyeballs dialParallel impl in net/dial.go. +func pingParallel(ctx context.Context, reg name.Registry, t http.RoundTripper, schemes []string) (*pingResp, error) { + returned := make(chan struct{}) + defer close(returned) + + type pingResult struct { + *pingResp + error + primary bool + done bool + } + + results := make(chan pingResult) + + startRacer := func(ctx context.Context, scheme string) { + pr, err := pingSingle(ctx, reg, t, scheme) + select { + case results <- pingResult{pingResp: pr, error: err, primary: scheme == "https", done: true}: + case <-returned: + if pr != nil { + logs.Debug.Printf("%s lost race", scheme) + } + } + } + + var primary, fallback pingResult + + primaryCtx, primaryCancel := context.WithCancel(ctx) + defer primaryCancel() + go startRacer(primaryCtx, schemes[0]) + + fallbackTimer := time.NewTimer(fallbackDelay) + defer fallbackTimer.Stop() + + for { + select { + case <-fallbackTimer.C: + fallbackCtx, fallbackCancel := context.WithCancel(ctx) + defer fallbackCancel() + go startRacer(fallbackCtx, schemes[1]) + + case res := <-results: + if res.error == nil { + return res.pingResp, nil + } + if res.primary { + primary = res + } else { + fallback = res + } + if primary.done && fallback.done { + return nil, multierrs([]error{primary.error, fallback.error}) + } + if res.primary && fallbackTimer.Stop() { + // Primary failed and we haven't started the fallback, + // reset time to start fallback immediately. + fallbackTimer.Reset(0) } - // Otherwise, just return the challenge without parameters. - return &pingResp{ - challenge: challenge(resp.Header.Get("WWW-Authenticate")).Canonical(), - scheme: scheme, - }, nil - default: - return nil, CheckError(resp, http.StatusOK, http.StatusUnauthorized) } } - return nil, errors.New(strings.Join(errs, "; ")) } func pickFromMultipleChallenges(challenges []authchallenge.Challenge) authchallenge.Challenge { @@ -145,3 +192,36 @@ func pickFromMultipleChallenges(challenges []authchallenge.Challenge) authchalle return challenges[0] } + +type multierrs []error + +func (m multierrs) Error() string { + var b strings.Builder + hasWritten := false + for _, err := range m { + if hasWritten { + b.WriteString("; ") + } + hasWritten = true + b.WriteString(err.Error()) + } + return b.String() +} + +func (m multierrs) As(target any) bool { + for _, err := range m { + if errors.As(err, target) { + return true + } + } + return false +} + +func (m multierrs) Is(target error) bool { + for _, err := range m { + if errors.Is(err, target) { + return true + } + } + return false +} diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go index 0a45dc75b..e5621e305 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go @@ -21,12 +21,12 @@ import ( "github.com/google/go-containerregistry/internal/retry" ) -// Sleep for 0.1, 0.3, 0.9, 2.7 seconds. This should cover networking blips. +// Sleep for 0.1 then 0.3 seconds. This should cover networking blips. var defaultBackoff = retry.Backoff{ Duration: 100 * time.Millisecond, Factor: 3.0, Jitter: 0.1, - Steps: 5, + Steps: 3, } var _ http.RoundTripper = (*retryTransport)(nil) @@ -36,6 +36,7 @@ type retryTransport struct { inner http.RoundTripper backoff retry.Backoff predicate retry.Predicate + codes []int } // Option is a functional option for retryTransport. @@ -44,6 +45,7 @@ type Option func(*options) type options struct { backoff retry.Backoff predicate retry.Predicate + codes []int } // Backoff is an alias of retry.Backoff to expose this configuration option to consumers of this lib @@ -63,6 +65,13 @@ func WithRetryPredicate(predicate func(error) bool) Option { } } +// WithRetryStatusCodes sets which http response codes will be retried. +func WithRetryStatusCodes(codes ...int) Option { + return func(o *options) { + o.codes = codes + } +} + // NewRetry returns a transport that retries errors. func NewRetry(inner http.RoundTripper, opts ...Option) http.RoundTripper { o := &options{ @@ -78,12 +87,23 @@ func NewRetry(inner http.RoundTripper, opts ...Option) http.RoundTripper { inner: inner, backoff: o.backoff, predicate: o.predicate, + codes: o.codes, } } func (t *retryTransport) RoundTrip(in *http.Request) (out *http.Response, err error) { roundtrip := func() error { out, err = t.inner.RoundTrip(in) + if !retry.Ever(in.Context()) { + return nil + } + if out != nil { + for _, code := range t.codes { + if out.StatusCode == code { + return CheckError(out) + } + } + } return err } retry.Retry(roundtrip, t.predicate, t.backoff) diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.go index 121904df3..01fe1fa82 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.go @@ -27,15 +27,24 @@ import ( // setup to authenticate with the remote registry "reg", in the capacity // laid out by the specified scopes. // -// TODO(jonjohnsonjr): Deprecate this. +// Deprecated: Use NewWithContext. func New(reg name.Registry, auth authn.Authenticator, t http.RoundTripper, scopes []string) (http.RoundTripper, error) { return NewWithContext(context.Background(), reg, auth, t, scopes) } // NewWithContext returns a new RoundTripper based on the provided RoundTripper that has been -// setup to authenticate with the remote registry "reg", in the capacity +// set up to authenticate with the remote registry "reg", in the capacity // laid out by the specified scopes. +// In case the RoundTripper is already of the type Wrapper it assumes +// authentication was already done prior to this call, so it just returns +// the provided RoundTripper without further action func NewWithContext(ctx context.Context, reg name.Registry, auth authn.Authenticator, t http.RoundTripper, scopes []string) (http.RoundTripper, error) { + // When the transport provided is of the type Wrapper this function assumes that the caller already + // executed the necessary login and check. + switch t.(type) { + case *Wrapper: + return t, nil + } // The handshake: // 1. Use "t" to ping() the registry for the authentication challenge. // @@ -76,12 +85,7 @@ func NewWithContext(ctx context.Context, reg name.Registry, auth authn.Authentic if !ok { return nil, fmt.Errorf("malformed www-authenticate, missing realm: %v", pr.parameters) } - service, ok := pr.parameters["service"] - if !ok { - // If the service parameter is not specified, then default it to the registry - // with which we are talking. - service = reg.String() - } + service := pr.parameters["service"] bt := &bearerTransport{ inner: t, basic: auth, diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go index 41b19fcae..99e9fe837 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go @@ -23,7 +23,6 @@ import ( "net/http" "net/url" "strings" - "sync/atomic" "github.com/google/go-containerregistry/internal/redact" "github.com/google/go-containerregistry/internal/retry" @@ -49,20 +48,21 @@ func Write(ref name.Reference, img v1.Image, options ...Option) (rerr error) { return err } - var lastUpdate *v1.Update + var p *progress if o.updates != nil { - lastUpdate = &v1.Update{} - lastUpdate.Total, err = countImage(img, o.allowNondistributableArtifacts) + p = &progress{updates: o.updates} + p.lastUpdate = &v1.Update{} + p.lastUpdate.Total, err = countImage(img, o.allowNondistributableArtifacts) if err != nil { return err } defer close(o.updates) - defer func() { _ = sendError(o.updates, rerr) }() + defer func() { _ = p.err(rerr) }() } - return writeImage(o.context, ref, img, o, lastUpdate) + return writeImage(o.context, ref, img, o, p) } -func writeImage(ctx context.Context, ref name.Reference, img v1.Image, o *options, lastUpdate *v1.Update) error { +func writeImage(ctx context.Context, ref name.Reference, img v1.Image, o *options, progress *progress) error { ls, err := img.Layers() if err != nil { return err @@ -73,13 +73,11 @@ func writeImage(ctx context.Context, ref name.Reference, img v1.Image, o *option return err } w := writer{ - repo: ref.Context(), - client: &http.Client{Transport: tr}, - context: ctx, - updates: o.updates, - lastUpdate: lastUpdate, - backoff: o.retryBackoff, - predicate: o.retryPredicate, + repo: ref.Context(), + client: &http.Client{Transport: tr}, + progress: progress, + backoff: o.retryBackoff, + predicate: o.retryPredicate, } // Upload individual blobs and collect any errors. @@ -170,21 +168,12 @@ func writeImage(ctx context.Context, ref name.Reference, img v1.Image, o *option // writer writes the elements of an image to a remote image reference. type writer struct { - repo name.Repository - client *http.Client - context context.Context - - updates chan<- v1.Update - lastUpdate *v1.Update - backoff Backoff - predicate retry.Predicate -} + repo name.Repository + client *http.Client -func sendError(ch chan<- v1.Update, err error) error { - if err != nil && ch != nil { - ch <- v1.Update{Error: err} - } - return err + progress *progress + backoff Backoff + predicate retry.Predicate } // url returns a url.Url for the specified path in the context of this remote image reference. @@ -216,7 +205,7 @@ func (w *writer) nextLocation(resp *http.Response) (string, error) { // HEAD request to the blob store API. GCR performs an existence check on the // initiation if "mount" is specified, even if no "from" sources are specified. // However, this is not broadly applicable to all registries, e.g. ECR. -func (w *writer) checkExistingBlob(h v1.Hash) (bool, error) { +func (w *writer) checkExistingBlob(ctx context.Context, h v1.Hash) (bool, error) { u := w.url(fmt.Sprintf("/v2/%s/blobs/%s", w.repo.RepositoryStr(), h.String())) req, err := http.NewRequest(http.MethodHead, u.String(), nil) @@ -224,7 +213,7 @@ func (w *writer) checkExistingBlob(h v1.Hash) (bool, error) { return false, err } - resp, err := w.client.Do(req.WithContext(w.context)) + resp, err := w.client.Do(req.WithContext(ctx)) if err != nil { return false, err } @@ -239,7 +228,7 @@ func (w *writer) checkExistingBlob(h v1.Hash) (bool, error) { // checkExistingManifest checks if a manifest exists already in the repository // by making a HEAD request to the manifest API. -func (w *writer) checkExistingManifest(h v1.Hash, mt types.MediaType) (bool, error) { +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) @@ -248,7 +237,7 @@ func (w *writer) checkExistingManifest(h v1.Hash, mt types.MediaType) (bool, err } req.Header.Set("Accept", string(mt)) - resp, err := w.client.Do(req.WithContext(w.context)) + resp, err := w.client.Do(req.WithContext(ctx)) if err != nil { return false, err } @@ -267,13 +256,16 @@ func (w *writer) checkExistingManifest(h v1.Hash, mt types.MediaType) (bool, err // On success, the layer was either mounted (nothing more to do) or a blob // upload was initiated and the body of that blob should be sent to the returned // location. -func (w *writer) initiateUpload(from, mount string) (location string, mounted bool, err error) { +func (w *writer) initiateUpload(ctx context.Context, from, mount, origin string) (location string, mounted bool, err error) { u := w.url(fmt.Sprintf("/v2/%s/blobs/uploads/", w.repo.RepositoryStr())) uv := url.Values{} if mount != "" && from != "" { // Quay will fail if we specify a "mount" without a "from". - uv["mount"] = []string{mount} - uv["from"] = []string{from} + uv.Set("mount", mount) + uv.Set("from", from) + if origin != "" { + uv.Set("origin", origin) + } } u.RawQuery = uv.Encode() @@ -283,13 +275,18 @@ func (w *writer) initiateUpload(from, mount string) (location string, mounted bo return "", false, err } req.Header.Set("Content-Type", "application/json") - resp, err := w.client.Do(req.WithContext(w.context)) + resp, err := w.client.Do(req.WithContext(ctx)) if err != nil { return "", false, err } defer resp.Body.Close() if err := transport.CheckError(resp, http.StatusCreated, http.StatusAccepted); err != nil { + if origin != "" && origin != w.repo.RegistryStr() { + // https://github.com/google/go-containerregistry/issues/1404 + logs.Warn.Printf("retrying without mount: %v", err) + return w.initiateUpload(ctx, "", "", "") + } return "", false, err } @@ -307,46 +304,34 @@ func (w *writer) initiateUpload(from, mount string) (location string, mounted bo } } -type progressReader struct { - rc io.ReadCloser - - count *int64 // number of bytes this reader has read, to support resetting on retry. - updates chan<- v1.Update - lastUpdate *v1.Update -} - -func (r *progressReader) Read(b []byte) (int, error) { - n, err := r.rc.Read(b) - if err != nil { - return n, err - } - atomic.AddInt64(r.count, int64(n)) - // TODO: warn/debug log if sending takes too long, or if sending is blocked while context is cancelled. - r.updates <- v1.Update{ - Total: r.lastUpdate.Total, - Complete: atomic.AddInt64(&r.lastUpdate.Complete, int64(n)), - } - return n, nil -} - -func (r *progressReader) Close() error { return r.rc.Close() } - // streamBlob streams the contents of the blob to the specified location. // On failure, this will return an error. On success, this will return the location // header indicating how to commit the streamed blob. -func (w *writer) streamBlob(ctx context.Context, blob io.ReadCloser, streamLocation string) (commitLocation string, rerr error) { +func (w *writer) streamBlob(ctx context.Context, layer v1.Layer, streamLocation string) (commitLocation string, rerr error) { reset := func() {} defer func() { if rerr != nil { reset() } }() - if w.updates != nil { + blob, err := layer.Compressed() + if err != nil { + return "", err + } + + getBody := layer.Compressed + if w.progress != nil { var count int64 - blob = &progressReader{rc: blob, updates: w.updates, lastUpdate: w.lastUpdate, count: &count} + blob = &progressReader{rc: blob, progress: w.progress, count: &count} + getBody = func() (io.ReadCloser, error) { + blob, err := layer.Compressed() + if err != nil { + return nil, err + } + return &progressReader{rc: blob, progress: w.progress, count: &count}, nil + } reset = func() { - atomic.AddInt64(&w.lastUpdate.Complete, -count) - w.updates <- *w.lastUpdate + w.progress.complete(-count) } } @@ -354,6 +339,10 @@ func (w *writer) streamBlob(ctx context.Context, blob io.ReadCloser, streamLocat if err != nil { return "", err } + if _, ok := layer.(*stream.Layer); !ok { + // We can't retry streaming layers. + req.GetBody = getBody + } req.Header.Set("Content-Type", "application/octet-stream") resp, err := w.client.Do(req.WithContext(ctx)) @@ -373,7 +362,7 @@ func (w *writer) streamBlob(ctx context.Context, blob io.ReadCloser, streamLocat // commitBlob commits this blob by sending a PUT to the location returned from // streaming the blob. -func (w *writer) commitBlob(location, digest string) error { +func (w *writer) commitBlob(ctx context.Context, location, digest string) error { u, err := url.Parse(location) if err != nil { return err @@ -388,7 +377,7 @@ func (w *writer) commitBlob(location, digest string) error { } req.Header.Set("Content-Type", "application/octet-stream") - resp, err := w.client.Do(req.WithContext(w.context)) + resp, err := w.client.Do(req.WithContext(ctx)) if err != nil { return err } @@ -399,45 +388,42 @@ func (w *writer) commitBlob(location, digest string) error { // incrProgress increments and sends a progress update, if WithProgress is used. func (w *writer) incrProgress(written int64) { - if w.updates == nil { + if w.progress == nil { return } - w.updates <- v1.Update{ - Total: w.lastUpdate.Total, - Complete: atomic.AddInt64(&w.lastUpdate.Complete, written), - } + w.progress.complete(written) } // uploadOne performs a complete upload of a single layer. func (w *writer) uploadOne(ctx context.Context, l v1.Layer) error { - var from, mount string - if h, err := l.Digest(); err == nil { - // If we know the digest, this isn't a streaming layer. Do an existence - // check so we can skip uploading the layer if possible. - existing, err := w.checkExistingBlob(h) - if err != nil { - return err - } - if existing { - size, err := l.Size() + tryUpload := func() error { + ctx := retry.Never(ctx) + var from, mount, origin string + if h, err := l.Digest(); err == nil { + // If we know the digest, this isn't a streaming layer. Do an existence + // check so we can skip uploading the layer if possible. + existing, err := w.checkExistingBlob(ctx, h) if err != nil { return err } - w.incrProgress(size) - logs.Progress.Printf("existing blob: %v", h) - return nil - } + if existing { + size, err := l.Size() + if err != nil { + return err + } + w.incrProgress(size) + logs.Progress.Printf("existing blob: %v", h) + return nil + } - mount = h.String() - } - if ml, ok := l.(*MountableLayer); ok { - if w.repo.RegistryStr() == ml.Reference.Context().RegistryStr() { + mount = h.String() + } + if ml, ok := l.(*MountableLayer); ok { from = ml.Reference.Context().RepositoryStr() + origin = ml.Reference.Context().RegistryStr() } - } - tryUpload := func() error { - location, mounted, err := w.initiateUpload(from, mount) + location, mounted, err := w.initiateUpload(ctx, from, mount, origin) if err != nil { return err } else if mounted { @@ -465,11 +451,7 @@ func (w *writer) uploadOne(ctx context.Context, l v1.Layer) error { ctx = redact.NewContext(ctx, "omitting binary blobs from logs") } - blob, err := l.Compressed() - if err != nil { - return err - } - location, err = w.streamBlob(ctx, blob, location) + location, err = w.streamBlob(ctx, l, location) if err != nil { return err } @@ -480,7 +462,7 @@ func (w *writer) uploadOne(ctx context.Context, l v1.Layer) error { } digest := h.String() - if err := w.commitBlob(location, digest); err != nil { + if err := w.commitBlob(ctx, location, digest); err != nil { return err } logs.Progress.Printf("pushed blob: %s", digest) @@ -508,7 +490,7 @@ func (w *writer) writeIndex(ctx context.Context, ref name.Reference, ii v1.Image // 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(desc.Digest, desc.MediaType) + exists, err := w.checkExistingManifest(ctx, desc.Digest, desc.MediaType) if err != nil { return err } @@ -531,7 +513,7 @@ func (w *writer) writeIndex(ctx context.Context, ref name.Reference, ii v1.Image if err != nil { return err } - if err := writeImage(ctx, ref, img, o, w.lastUpdate); err != nil { + if err := writeImage(ctx, ref, img, o, w.progress); err != nil { return err } default: @@ -598,6 +580,7 @@ func unpackTaggable(t Taggable) ([]byte, *v1.Descriptor, error) { // commitManifest does a PUT of the image's manifest. func (w *writer) commitManifest(ctx context.Context, t Taggable, ref name.Reference) error { tryUpload := func() error { + ctx := retry.Never(ctx) raw, desc, err := unpackTaggable(t) if err != nil { return err @@ -673,20 +656,21 @@ func WriteIndex(ref name.Reference, ii v1.ImageIndex, options ...Option) (rerr e w := writer{ repo: ref.Context(), client: &http.Client{Transport: tr}, - context: o.context, - updates: o.updates, backoff: o.retryBackoff, predicate: o.retryPredicate, } if o.updates != nil { - w.lastUpdate = &v1.Update{} - w.lastUpdate.Total, err = countIndex(ii, o.allowNondistributableArtifacts) + 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 } - defer close(o.updates) - defer func() { sendError(o.updates, rerr) }() } return w.writeIndex(o.context, ref, ii, options...) @@ -814,15 +798,16 @@ func WriteLayer(repo name.Repository, layer v1.Layer, options ...Option) (rerr e w := writer{ repo: repo, client: &http.Client{Transport: tr}, - context: o.context, - updates: o.updates, 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() { sendError(o.updates, rerr) }() + defer func() { w.progress.err(rerr) }() // TODO: support streaming layers which update the total count as they write. if _, ok := layer.(*stream.Layer); ok { @@ -832,7 +817,7 @@ func WriteLayer(repo name.Repository, layer v1.Layer, options ...Option) (rerr e if err != nil { return err } - w.lastUpdate = &v1.Update{Total: size} + w.progress.total(size) } return w.uploadOne(o.context, layer) } @@ -883,7 +868,6 @@ func Put(ref name.Reference, t Taggable, options ...Option) error { w := writer{ repo: ref.Context(), client: &http.Client{Transport: tr}, - context: o.context, backoff: o.retryBackoff, predicate: o.retryPredicate, } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go index e91f57ab3..9dd3e5ffb 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package stream implements a single-pass streaming v1.Layer. package stream import ( @@ -48,6 +49,7 @@ type Layer struct { mu sync.Mutex digest, diffID *v1.Hash size int64 + mediaType types.MediaType } var _ v1.Layer = (*Layer)(nil) @@ -62,11 +64,21 @@ func WithCompressionLevel(level int) LayerOption { } } +// WithMediaType is a functional option for overriding the layer's media type. +func WithMediaType(mt types.MediaType) LayerOption { + return func(l *Layer) { + l.mediaType = mt + } +} + // NewLayer creates a Layer from an io.ReadCloser. func NewLayer(rc io.ReadCloser, opts ...LayerOption) *Layer { layer := &Layer{ blob: rc, compression: gzip.BestSpeed, + // We use DockerLayer for now as uncompressed layers + // are unimplemented + mediaType: types.DockerLayer, } for _, opt := range opts { @@ -108,9 +120,7 @@ func (l *Layer) Size() (int64, error) { // MediaType implements v1.Layer func (l *Layer) MediaType() (types.MediaType, error) { - // We return DockerLayer for now as uncompressed layers - // are unimplemented - return types.DockerLayer, nil + return l.mediaType, nil } // Uncompressed implements v1.Layer. @@ -126,18 +136,36 @@ func (l *Layer) Compressed() (io.ReadCloser, error) { return newCompressedReader(l) } -type compressedReader struct { - closer io.Closer // original blob's Closer. +// finalize sets the layer to consumed and computes all hash and size values. +func (l *Layer) finalize(uncompressed, compressed hash.Hash, size int64) error { + l.mu.Lock() + defer l.mu.Unlock() + + diffID, err := v1.NewHash("sha256:" + hex.EncodeToString(uncompressed.Sum(nil))) + if err != nil { + return err + } + l.diffID = &diffID + + digest, err := v1.NewHash("sha256:" + hex.EncodeToString(compressed.Sum(nil))) + if err != nil { + return err + } + l.digest = &digest - h, zh hash.Hash // collects digests of compressed and uncompressed stream. - pr io.Reader - bw *bufio.Writer - count *countWriter + l.size = size + l.consumed = true + return nil +} - l *Layer // stream.Layer to update upon Close. +type compressedReader struct { + pr io.Reader + closer func() error } func newCompressedReader(l *Layer) (*compressedReader, error) { + // Collect digests of compressed and uncompressed stream and size of + // compressed stream. h := sha256.New() zh := sha256.New() count := &countWriter{} @@ -158,24 +186,74 @@ func newCompressedReader(l *Layer) (*compressedReader, error) { return nil, err } + doneDigesting := make(chan struct{}) + cr := &compressedReader{ - closer: newMultiCloser(zw, l.blob), - pr: pr, - bw: bw, - h: h, - zh: zh, - count: count, - l: l, + pr: pr, + closer: func() error { + // Immediately close pw without error. There are three ways to get + // here. + // + // 1. There was a copy error due from the underlying reader, in which + // case the error will not be overwritten. + // 2. Copying from the underlying reader completed successfully. + // 3. Close has been called before the underlying reader has been + // fully consumed. In this case pw must be closed in order to + // keep the flush of bw from blocking indefinitely. + // + // NOTE: pw.Close never returns an error. The signature is only to + // implement io.Closer. + _ = pw.Close() + + // Close the inner ReadCloser. + // + // NOTE: net/http will call close on success, so if we've already + // closed the inner rc, it's not an error. + if err := l.blob.Close(); err != nil && !errors.Is(err, os.ErrClosed) { + return err + } + + // Finalize layer with its digest and size values. + <-doneDigesting + return l.finalize(h, zh, count.n) + }, } go func() { - if _, err := io.Copy(io.MultiWriter(h, zw), l.blob); err != nil { + // Copy blob into the gzip writer, which also hashes and counts the + // size of the compressed output, and hasher of the raw contents. + _, copyErr := io.Copy(io.MultiWriter(h, zw), l.blob) + + // Close the gzip writer once copying is done. If this is done in the + // Close method of compressedReader instead, then it can cause a panic + // when the compressedReader is closed before the blob is fully + // consumed and io.Copy in this goroutine is still blocking. + closeErr := zw.Close() + + // Check errors from writing and closing streams. + if copyErr != nil { + close(doneDigesting) + pw.CloseWithError(copyErr) + return + } + if closeErr != nil { + close(doneDigesting) + pw.CloseWithError(closeErr) + return + } + + // Flush the buffer once all writes are complete to the gzip writer. + if err := bw.Flush(); err != nil { + close(doneDigesting) pw.CloseWithError(err) return } - // 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. + + // Notify closer that digests are done being written. + close(doneDigesting) + + // Close the compressed reader to calculate digest/diffID/size. This + // will cause pr to return EOF which will cause readers of the + // Compressed stream to finish reading. pw.CloseWithError(cr.Close()) }() @@ -184,36 +262,7 @@ func newCompressedReader(l *Layer) (*compressedReader, error) { func (cr *compressedReader) Read(b []byte) (int, error) { return cr.pr.Read(b) } -func (cr *compressedReader) Close() error { - cr.l.mu.Lock() - defer cr.l.mu.Unlock() - - // Close the inner ReadCloser. - if err := cr.closer.Close(); err != nil { - return err - } - - // Flush the buffer. - if err := cr.bw.Flush(); err != nil { - return err - } - - diffID, err := v1.NewHash("sha256:" + hex.EncodeToString(cr.h.Sum(nil))) - if err != nil { - return err - } - cr.l.diffID = &diffID - - digest, err := v1.NewHash("sha256:" + hex.EncodeToString(cr.zh.Sum(nil))) - if err != nil { - return err - } - cr.l.digest = &digest - - cr.l.size = cr.count.n - cr.l.consumed = true - return nil -} +func (cr *compressedReader) Close() error { return cr.closer() } // countWriter counts bytes written to it. type countWriter struct{ n int64 } @@ -222,21 +271,3 @@ func (c *countWriter) Write(p []byte) (int, error) { c.n += int64(len(p)) return len(p), nil } - -// multiCloser is a Closer that collects multiple Closers and Closes them in order. -type multiCloser []io.Closer - -var _ io.Closer = (multiCloser)(nil) - -func newMultiCloser(c ...io.Closer) multiCloser { return multiCloser(c) } - -func (m multiCloser) Close() error { - for _, c := range m { - // NOTE: net/http will call close on success, so if we've already - // closed the inner rc, it's not an error. - if err := c.Close(); err != nil && !errors.Is(err, os.ErrClosed) { - return err - } - } - return nil -} diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go index b2e44df75..1f977e16a 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go @@ -21,13 +21,13 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path" "path/filepath" "sync" - "github.com/google/go-containerregistry/internal/gzip" + comp "github.com/google/go-containerregistry/internal/compression" + "github.com/google/go-containerregistry/pkg/compression" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/partial" @@ -166,7 +166,13 @@ func (i *image) areLayersCompressed() (bool, error) { return false, err } defer blob.Close() - return gzip.Is(blob) + + cp, _, err := comp.PeekCompression(blob) + if err != nil { + return false, err + } + + return cp != compression.None, nil } func (i *image) loadTarDescriptorAndConfig() error { @@ -195,7 +201,7 @@ func (i *image) loadTarDescriptorAndConfig() error { } defer cfg.Close() - i.config, err = ioutil.ReadAll(cfg) + i.config, err = io.ReadAll(cfg) if err != nil { return err } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go index 5ec1d5515..a344e9206 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go @@ -17,15 +17,19 @@ package tarball import ( "bytes" "compress/gzip" + "fmt" "io" - "io/ioutil" "os" "sync" "github.com/containerd/stargz-snapshotter/estargz" "github.com/google/go-containerregistry/internal/and" + comp "github.com/google/go-containerregistry/internal/compression" gestargz "github.com/google/go-containerregistry/internal/estargz" ggzip "github.com/google/go-containerregistry/internal/gzip" + "github.com/google/go-containerregistry/internal/zstd" + "github.com/google/go-containerregistry/pkg/compression" + "github.com/google/go-containerregistry/pkg/logs" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) @@ -36,9 +40,11 @@ type layer struct { size int64 compressedopener Opener uncompressedopener Opener - compression int + compression compression.Compression + compressionLevel int annotations map[string]string estgzopts []estargz.Option + mediaType types.MediaType } // Descriptor implements partial.withDescriptor. @@ -51,7 +57,7 @@ func (l *layer) Descriptor() (*v1.Descriptor, error) { Size: l.size, Digest: digest, Annotations: l.annotations, - MediaType: types.DockerLayer, + MediaType: l.mediaType, }, nil } @@ -82,17 +88,45 @@ func (l *layer) Size() (int64, error) { // MediaType implements v1.Layer func (l *layer) MediaType() (types.MediaType, error) { - return types.DockerLayer, nil + return l.mediaType, nil } // LayerOption applies options to layer type LayerOption func(*layer) +// WithCompression is a functional option for overriding the default +// compression algorithm used for compressing uncompressed tarballs. +// Please note that WithCompression(compression.ZStd) should be used +// in conjunction with WithMediaType(types.OCILayerZStd) +func WithCompression(comp compression.Compression) LayerOption { + return func(l *layer) { + switch comp { + case compression.ZStd: + l.compression = compression.ZStd + case compression.GZip: + l.compression = compression.GZip + case compression.None: + logs.Warn.Printf("Compression type 'none' is not supported for tarball layers; using gzip compression.") + l.compression = compression.GZip + default: + logs.Warn.Printf("Unexpected compression type for WithCompression(): %s; using gzip compression instead.", comp) + l.compression = compression.GZip + } + } +} + // WithCompressionLevel is a functional option for overriding the default // compression level used for compressing uncompressed tarballs. func WithCompressionLevel(level int) LayerOption { return func(l *layer) { - l.compression = level + l.compressionLevel = level + } +} + +// WithMediaType is a functional option for overriding the layer's media type. +func WithMediaType(mt types.MediaType) LayerOption { + return func(l *layer) { + l.mediaType = mt } } @@ -119,7 +153,7 @@ func WithCompressedCaching(l *layer) { return nil, err } - return ioutil.NopCloser(bytes.NewBuffer(buf.Bytes())), nil + return io.NopCloser(bytes.NewBuffer(buf.Bytes())), nil } } @@ -140,7 +174,7 @@ func WithEstargz(l *layer) { if err != nil { return nil, err } - eopts := append(l.estgzopts, estargz.WithCompressionLevel(l.compression)) + eopts := append(l.estgzopts, estargz.WithCompressionLevel(l.compressionLevel)) rc, h, err := gestargz.ReadCloser(crc, eopts...) if err != nil { return nil, err @@ -187,30 +221,28 @@ func LayerFromFile(path string, opts ...LayerOption) (v1.Layer, error) { // the uncompressed path may end up gzipping things multiple times: // 1. Compute the layer SHA256 // 2. Upload the compressed layer. +// // Since gzip can be expensive, we support an option to memoize the // compression that can be passed here: tarball.WithCompressedCaching func LayerFromOpener(opener Opener, opts ...LayerOption) (v1.Layer, error) { - rc, err := opener() - if err != nil { - return nil, err - } - defer rc.Close() - - compressed, err := ggzip.Is(rc) + comp, err := comp.GetCompression(opener) if err != nil { return nil, err } layer := &layer{ - compression: gzip.BestSpeed, - annotations: make(map[string]string, 1), + compression: compression.GZip, + compressionLevel: gzip.BestSpeed, + annotations: make(map[string]string, 1), + mediaType: types.DockerLayer, } if estgz := os.Getenv("GGCR_EXPERIMENT_ESTARGZ"); estgz == "1" { opts = append([]LayerOption{WithEstargz}, opts...) } - if compressed { + switch comp { + case compression.GZip: layer.compressedopener = opener layer.uncompressedopener = func() (io.ReadCloser, error) { urc, err := opener() @@ -219,14 +251,28 @@ func LayerFromOpener(opener Opener, opts ...LayerOption) (v1.Layer, error) { } return ggzip.UnzipReadCloser(urc) } - } else { + case compression.ZStd: + layer.compressedopener = opener + layer.uncompressedopener = func() (io.ReadCloser, error) { + urc, err := opener() + if err != nil { + return nil, err + } + return zstd.UnzipReadCloser(urc) + } + default: layer.uncompressedopener = opener layer.compressedopener = func() (io.ReadCloser, error) { crc, err := opener() if err != nil { return nil, err } - return ggzip.ReadCloserLevel(crc, layer.compression), nil + + if layer.compression == compression.ZStd { + return zstd.ReadCloserLevel(crc, layer.compressionLevel), nil + } + + return ggzip.ReadCloserLevel(crc, layer.compressionLevel), nil } } @@ -234,6 +280,23 @@ func LayerFromOpener(opener Opener, opts ...LayerOption) (v1.Layer, error) { opt(layer) } + // Warn if media type does not match compression + var mediaTypeMismatch = false + switch layer.compression { + case compression.GZip: + mediaTypeMismatch = + layer.mediaType != types.OCILayer && + layer.mediaType != types.OCIRestrictedLayer && + layer.mediaType != types.DockerLayer + + case compression.ZStd: + mediaTypeMismatch = layer.mediaType != types.OCILayerZStd + } + + if mediaTypeMismatch { + logs.Warn.Printf("Unexpected mediaType (%s) for selected compression in %s in LayerFromOpener().", layer.mediaType, layer.compression) + } + if layer.digest, layer.size, err = computeDigest(layer.compressedopener); err != nil { return nil, err } @@ -249,15 +312,19 @@ func LayerFromOpener(opener Opener, opts ...LayerOption) (v1.Layer, error) { } // LayerFromReader returns a v1.Layer given a io.Reader. +// +// The reader's contents are read and buffered to a temp file in the process. +// +// Deprecated: Use LayerFromOpener or stream.NewLayer instead, if possible. func LayerFromReader(reader io.Reader, opts ...LayerOption) (v1.Layer, error) { - // Buffering due to Opener requiring multiple calls. - a, err := ioutil.ReadAll(reader) + tmp, err := os.CreateTemp("", "") if err != nil { - return nil, err + return nil, fmt.Errorf("creating temp file to buffer reader: %w", err) + } + if _, err := io.Copy(tmp, reader); err != nil { + return nil, fmt.Errorf("writing temp file to buffer reader: %w", err) } - return LayerFromOpener(func() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewReader(a)), nil - }, opts...) + return LayerFromFile(tmp.Name(), opts...) } func computeDigest(opener Opener) (v1.Hash, int64, error) { diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go index add390df8..7d7a0b3b6 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go @@ -315,6 +315,7 @@ func getSizeAndManifest(refToImage map[name.Reference]v1.Image) (int64, []byte, func calculateTarballSize(refToImage map[name.Reference]v1.Image, mBytes []byte) (size int64, err error) { imageToTags := dedupRefToImage(refToImage) + seenLayerDigests := make(map[string]struct{}) for img, name := range imageToTags { manifest, err := img.Manifest() if err != nil { @@ -322,6 +323,11 @@ func calculateTarballSize(refToImage map[name.Reference]v1.Image, mBytes []byte) } size += calculateSingleFileInTarSize(manifest.Config.Size) for _, l := range manifest.Layers { + hex := l.Digest.Hex + if _, ok := seenLayerDigests[hex]; ok { + continue + } + seenLayerDigests[hex] = struct{}{} size += calculateSingleFileInTarSize(l.Size) } } diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go index 21f223650..363e989fe 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package types holds common OCI media types. package types // MediaType is an enumeration of the supported mime types that an element of an image might have. @@ -24,6 +25,7 @@ const ( OCIManifestSchema1 MediaType = "application/vnd.oci.image.manifest.v1+json" OCIConfigJSON MediaType = "application/vnd.oci.image.config.v1+json" OCILayer MediaType = "application/vnd.oci.image.layer.v1.tar+gzip" + OCILayerZStd MediaType = "application/vnd.oci.image.layer.v1.tar+zstd" OCIRestrictedLayer MediaType = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip" OCIUncompressedLayer MediaType = "application/vnd.oci.image.layer.v1.tar" OCIUncompressedRestrictedLayer MediaType = "application/vnd.oci.image.layer.nondistributable.v1.tar" diff --git a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go index b32b8b77a..0cb1586f1 100644 --- a/tools/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go +++ b/tools/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated // Copyright 2018 Google LLC All Rights Reserved. diff --git a/tools/vendor/github.com/hashicorp/errwrap/LICENSE b/tools/vendor/github.com/hashicorp/errwrap/LICENSE new file mode 100644 index 000000000..c33dcc7c9 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/errwrap/LICENSE @@ -0,0 +1,354 @@ +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/tools/vendor/github.com/hashicorp/errwrap/README.md b/tools/vendor/github.com/hashicorp/errwrap/README.md new file mode 100644 index 000000000..444df08f8 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/errwrap/README.md @@ -0,0 +1,89 @@ +# errwrap + +`errwrap` is a package for Go that formalizes the pattern of wrapping errors +and checking if an error contains another error. + +There is a common pattern in Go of taking a returned `error` value and +then wrapping it (such as with `fmt.Errorf`) before returning it. The problem +with this pattern is that you completely lose the original `error` structure. + +Arguably the _correct_ approach is that you should make a custom structure +implementing the `error` interface, and have the original error as a field +on that structure, such [as this example](http://golang.org/pkg/os/#PathError). +This is a good approach, but you have to know the entire chain of possible +rewrapping that happens, when you might just care about one. + +`errwrap` formalizes this pattern (it doesn't matter what approach you use +above) by giving a single interface for wrapping errors, checking if a specific +error is wrapped, and extracting that error. + +## Installation and Docs + +Install using `go get github.com/hashicorp/errwrap`. + +Full documentation is available at +http://godoc.org/github.com/hashicorp/errwrap + +## Usage + +#### Basic Usage + +Below is a very basic example of its usage: + +```go +// A function that always returns an error, but wraps it, like a real +// function might. +func tryOpen() error { + _, err := os.Open("/i/dont/exist") + if err != nil { + return errwrap.Wrapf("Doesn't exist: {{err}}", err) + } + + return nil +} + +func main() { + err := tryOpen() + + // We can use the Contains helpers to check if an error contains + // another error. It is safe to do this with a nil error, or with + // an error that doesn't even use the errwrap package. + if errwrap.Contains(err, "does not exist") { + // Do something + } + if errwrap.ContainsType(err, new(os.PathError)) { + // Do something + } + + // Or we can use the associated `Get` functions to just extract + // a specific error. This would return nil if that specific error doesn't + // exist. + perr := errwrap.GetType(err, new(os.PathError)) +} +``` + +#### Custom Types + +If you're already making custom types that properly wrap errors, then +you can get all the functionality of `errwraps.Contains` and such by +implementing the `Wrapper` interface with just one function. Example: + +```go +type AppError { + Code ErrorCode + Err error +} + +func (e *AppError) WrappedErrors() []error { + return []error{e.Err} +} +``` + +Now this works: + +```go +err := &AppError{Err: fmt.Errorf("an error")} +if errwrap.ContainsType(err, fmt.Errorf("")) { + // This will work! +} +``` diff --git a/tools/vendor/github.com/hashicorp/errwrap/errwrap.go b/tools/vendor/github.com/hashicorp/errwrap/errwrap.go new file mode 100644 index 000000000..44e368e56 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/errwrap/errwrap.go @@ -0,0 +1,178 @@ +// Package errwrap implements methods to formalize error wrapping in Go. +// +// All of the top-level functions that take an `error` are built to be able +// to take any error, not just wrapped errors. This allows you to use errwrap +// without having to type-check and type-cast everywhere. +package errwrap + +import ( + "errors" + "reflect" + "strings" +) + +// WalkFunc is the callback called for Walk. +type WalkFunc func(error) + +// Wrapper is an interface that can be implemented by custom types to +// have all the Contains, Get, etc. functions in errwrap work. +// +// When Walk reaches a Wrapper, it will call the callback for every +// wrapped error in addition to the wrapper itself. Since all the top-level +// functions in errwrap use Walk, this means that all those functions work +// with your custom type. +type Wrapper interface { + WrappedErrors() []error +} + +// Wrap defines that outer wraps inner, returning an error type that +// can be cleanly used with the other methods in this package, such as +// Contains, GetAll, etc. +// +// This function won't modify the error message at all (the outer message +// will be used). +func Wrap(outer, inner error) error { + return &wrappedError{ + Outer: outer, + Inner: inner, + } +} + +// Wrapf wraps an error with a formatting message. This is similar to using +// `fmt.Errorf` to wrap an error. If you're using `fmt.Errorf` to wrap +// errors, you should replace it with this. +// +// format is the format of the error message. The string '{{err}}' will +// be replaced with the original error message. +// +// Deprecated: Use fmt.Errorf() +func Wrapf(format string, err error) error { + outerMsg := "" + if err != nil { + outerMsg = err.Error() + } + + outer := errors.New(strings.Replace( + format, "{{err}}", outerMsg, -1)) + + return Wrap(outer, err) +} + +// Contains checks if the given error contains an error with the +// message msg. If err is not a wrapped error, this will always return +// false unless the error itself happens to match this msg. +func Contains(err error, msg string) bool { + return len(GetAll(err, msg)) > 0 +} + +// ContainsType checks if the given error contains an error with +// the same concrete type as v. If err is not a wrapped error, this will +// check the err itself. +func ContainsType(err error, v interface{}) bool { + return len(GetAllType(err, v)) > 0 +} + +// Get is the same as GetAll but returns the deepest matching error. +func Get(err error, msg string) error { + es := GetAll(err, msg) + if len(es) > 0 { + return es[len(es)-1] + } + + return nil +} + +// GetType is the same as GetAllType but returns the deepest matching error. +func GetType(err error, v interface{}) error { + es := GetAllType(err, v) + if len(es) > 0 { + return es[len(es)-1] + } + + return nil +} + +// GetAll gets all the errors that might be wrapped in err with the +// given message. The order of the errors is such that the outermost +// matching error (the most recent wrap) is index zero, and so on. +func GetAll(err error, msg string) []error { + var result []error + + Walk(err, func(err error) { + if err.Error() == msg { + result = append(result, err) + } + }) + + return result +} + +// GetAllType gets all the errors that are the same type as v. +// +// The order of the return value is the same as described in GetAll. +func GetAllType(err error, v interface{}) []error { + var result []error + + var search string + if v != nil { + search = reflect.TypeOf(v).String() + } + Walk(err, func(err error) { + var needle string + if err != nil { + needle = reflect.TypeOf(err).String() + } + + if needle == search { + result = append(result, err) + } + }) + + return result +} + +// Walk walks all the wrapped errors in err and calls the callback. If +// err isn't a wrapped error, this will be called once for err. If err +// is a wrapped error, the callback will be called for both the wrapper +// that implements error as well as the wrapped error itself. +func Walk(err error, cb WalkFunc) { + if err == nil { + return + } + + switch e := err.(type) { + case *wrappedError: + cb(e.Outer) + Walk(e.Inner, cb) + case Wrapper: + cb(err) + + for _, err := range e.WrappedErrors() { + Walk(err, cb) + } + case interface{ Unwrap() error }: + cb(err) + Walk(e.Unwrap(), cb) + default: + cb(err) + } +} + +// wrappedError is an implementation of error that has both the +// outer and inner errors. +type wrappedError struct { + Outer error + Inner error +} + +func (w *wrappedError) Error() string { + return w.Outer.Error() +} + +func (w *wrappedError) WrappedErrors() []error { + return []error{w.Outer, w.Inner} +} + +func (w *wrappedError) Unwrap() error { + return w.Inner +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/LICENSE b/tools/vendor/github.com/hashicorp/go-multierror/LICENSE new file mode 100644 index 000000000..82b4de97c --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/LICENSE @@ -0,0 +1,353 @@ +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/tools/vendor/github.com/hashicorp/go-multierror/Makefile b/tools/vendor/github.com/hashicorp/go-multierror/Makefile new file mode 100644 index 000000000..b97cd6ed0 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/Makefile @@ -0,0 +1,31 @@ +TEST?=./... + +default: test + +# test runs the test suite and vets the code. +test: generate + @echo "==> Running tests..." + @go list $(TEST) \ + | grep -v "/vendor/" \ + | xargs -n1 go test -timeout=60s -parallel=10 ${TESTARGS} + +# testrace runs the race checker +testrace: generate + @echo "==> Running tests (race)..." + @go list $(TEST) \ + | grep -v "/vendor/" \ + | xargs -n1 go test -timeout=60s -race ${TESTARGS} + +# updatedeps installs all the dependencies needed to run and build. +updatedeps: + @sh -c "'${CURDIR}/scripts/deps.sh' '${NAME}'" + +# generate runs `go generate` to build the dynamically generated source files. +generate: + @echo "==> Generating..." + @find . -type f -name '.DS_Store' -delete + @go list ./... \ + | grep -v "/vendor/" \ + | xargs -n1 go generate + +.PHONY: default test testrace updatedeps generate diff --git a/tools/vendor/github.com/hashicorp/go-multierror/README.md b/tools/vendor/github.com/hashicorp/go-multierror/README.md new file mode 100644 index 000000000..71dd308ed --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/README.md @@ -0,0 +1,150 @@ +# go-multierror + +[![CircleCI](https://img.shields.io/circleci/build/github/hashicorp/go-multierror/master)](https://circleci.com/gh/hashicorp/go-multierror) +[![Go Reference](https://pkg.go.dev/badge/github.com/hashicorp/go-multierror.svg)](https://pkg.go.dev/github.com/hashicorp/go-multierror) +![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/hashicorp/go-multierror) + +[circleci]: https://app.circleci.com/pipelines/github/hashicorp/go-multierror +[godocs]: https://pkg.go.dev/github.com/hashicorp/go-multierror + +`go-multierror` is a package for Go that provides a mechanism for +representing a list of `error` values as a single `error`. + +This allows a function in Go to return an `error` that might actually +be a list of errors. If the caller knows this, they can unwrap the +list and access the errors. If the caller doesn't know, the error +formats to a nice human-readable format. + +`go-multierror` is fully compatible with the Go standard library +[errors](https://golang.org/pkg/errors/) package, including the +functions `As`, `Is`, and `Unwrap`. This provides a standardized approach +for introspecting on error values. + +## Installation and Docs + +Install using `go get github.com/hashicorp/go-multierror`. + +Full documentation is available at +https://pkg.go.dev/github.com/hashicorp/go-multierror + +### Requires go version 1.13 or newer + +`go-multierror` requires go version 1.13 or newer. Go 1.13 introduced +[error wrapping](https://golang.org/doc/go1.13#error_wrapping), which +this library takes advantage of. + +If you need to use an earlier version of go, you can use the +[v1.0.0](https://github.com/hashicorp/go-multierror/tree/v1.0.0) +tag, which doesn't rely on features in go 1.13. + +If you see compile errors that look like the below, it's likely that +you're on an older version of go: + +``` +/go/src/github.com/hashicorp/go-multierror/multierror.go:112:9: undefined: errors.As +/go/src/github.com/hashicorp/go-multierror/multierror.go:117:9: undefined: errors.Is +``` + +## Usage + +go-multierror is easy to use and purposely built to be unobtrusive in +existing Go applications/libraries that may not be aware of it. + +**Building a list of errors** + +The `Append` function is used to create a list of errors. This function +behaves a lot like the Go built-in `append` function: it doesn't matter +if the first argument is nil, a `multierror.Error`, or any other `error`, +the function behaves as you would expect. + +```go +var result error + +if err := step1(); err != nil { + result = multierror.Append(result, err) +} +if err := step2(); err != nil { + result = multierror.Append(result, err) +} + +return result +``` + +**Customizing the formatting of the errors** + +By specifying a custom `ErrorFormat`, you can customize the format +of the `Error() string` function: + +```go +var result *multierror.Error + +// ... accumulate errors here, maybe using Append + +if result != nil { + result.ErrorFormat = func([]error) string { + return "errors!" + } +} +``` + +**Accessing the list of errors** + +`multierror.Error` implements `error` so if the caller doesn't know about +multierror, it will work just fine. But if you're aware a multierror might +be returned, you can use type switches to access the list of errors: + +```go +if err := something(); err != nil { + if merr, ok := err.(*multierror.Error); ok { + // Use merr.Errors + } +} +``` + +You can also use the standard [`errors.Unwrap`](https://golang.org/pkg/errors/#Unwrap) +function. This will continue to unwrap into subsequent errors until none exist. + +**Extracting an error** + +The standard library [`errors.As`](https://golang.org/pkg/errors/#As) +function can be used directly with a multierror to extract a specific error: + +```go +// Assume err is a multierror value +err := somefunc() + +// We want to know if "err" has a "RichErrorType" in it and extract it. +var errRich RichErrorType +if errors.As(err, &errRich) { + // It has it, and now errRich is populated. +} +``` + +**Checking for an exact error value** + +Some errors are returned as exact errors such as the [`ErrNotExist`](https://golang.org/pkg/os/#pkg-variables) +error in the `os` package. You can check if this error is present by using +the standard [`errors.Is`](https://golang.org/pkg/errors/#Is) function. + +```go +// Assume err is a multierror value +err := somefunc() +if errors.Is(err, os.ErrNotExist) { + // err contains os.ErrNotExist +} +``` + +**Returning a multierror only if there are errors** + +If you build a `multierror.Error`, you can use the `ErrorOrNil` function +to return an `error` implementation only if there are errors to return: + +```go +var result *multierror.Error + +// ... accumulate errors here + +// Return the `error` only if errors were added to the multierror, otherwise +// return nil since there are no errors. +return result.ErrorOrNil() +``` diff --git a/tools/vendor/github.com/hashicorp/go-multierror/append.go b/tools/vendor/github.com/hashicorp/go-multierror/append.go new file mode 100644 index 000000000..3e2589bfd --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/append.go @@ -0,0 +1,43 @@ +package multierror + +// Append is a helper function that will append more errors +// onto an Error in order to create a larger multi-error. +// +// If err is not a multierror.Error, then it will be turned into +// one. If any of the errs are multierr.Error, they will be flattened +// one level into err. +// Any nil errors within errs will be ignored. If err is nil, a new +// *Error will be returned. +func Append(err error, errs ...error) *Error { + switch err := err.(type) { + case *Error: + // Typed nils can reach here, so initialize if we are nil + if err == nil { + err = new(Error) + } + + // Go through each error and flatten + for _, e := range errs { + switch e := e.(type) { + case *Error: + if e != nil { + err.Errors = append(err.Errors, e.Errors...) + } + default: + if e != nil { + err.Errors = append(err.Errors, e) + } + } + } + + return err + default: + newErrs := make([]error, 0, len(errs)+1) + if err != nil { + newErrs = append(newErrs, err) + } + newErrs = append(newErrs, errs...) + + return Append(&Error{}, newErrs...) + } +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/flatten.go b/tools/vendor/github.com/hashicorp/go-multierror/flatten.go new file mode 100644 index 000000000..aab8e9abe --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/flatten.go @@ -0,0 +1,26 @@ +package multierror + +// Flatten flattens the given error, merging any *Errors together into +// a single *Error. +func Flatten(err error) error { + // If it isn't an *Error, just return the error as-is + if _, ok := err.(*Error); !ok { + return err + } + + // Otherwise, make the result and flatten away! + flatErr := new(Error) + flatten(err, flatErr) + return flatErr +} + +func flatten(err error, flatErr *Error) { + switch err := err.(type) { + case *Error: + for _, e := range err.Errors { + flatten(e, flatErr) + } + default: + flatErr.Errors = append(flatErr.Errors, err) + } +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/format.go b/tools/vendor/github.com/hashicorp/go-multierror/format.go new file mode 100644 index 000000000..47f13c49a --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/format.go @@ -0,0 +1,27 @@ +package multierror + +import ( + "fmt" + "strings" +) + +// ErrorFormatFunc is a function callback that is called by Error to +// turn the list of errors into a string. +type ErrorFormatFunc func([]error) string + +// ListFormatFunc is a basic formatter that outputs the number of errors +// that occurred along with a bullet point list of the errors. +func ListFormatFunc(es []error) string { + if len(es) == 1 { + return fmt.Sprintf("1 error occurred:\n\t* %s\n\n", es[0]) + } + + points := make([]string, len(es)) + for i, err := range es { + points[i] = fmt.Sprintf("* %s", err) + } + + return fmt.Sprintf( + "%d errors occurred:\n\t%s\n\n", + len(es), strings.Join(points, "\n\t")) +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/group.go b/tools/vendor/github.com/hashicorp/go-multierror/group.go new file mode 100644 index 000000000..9c29efb7f --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/group.go @@ -0,0 +1,38 @@ +package multierror + +import "sync" + +// Group is a collection of goroutines which return errors that need to be +// coalesced. +type Group struct { + mutex sync.Mutex + err *Error + wg sync.WaitGroup +} + +// Go calls the given function in a new goroutine. +// +// If the function returns an error it is added to the group multierror which +// is returned by Wait. +func (g *Group) Go(f func() error) { + g.wg.Add(1) + + go func() { + defer g.wg.Done() + + if err := f(); err != nil { + g.mutex.Lock() + g.err = Append(g.err, err) + g.mutex.Unlock() + } + }() +} + +// Wait blocks until all function calls from the Go method have returned, then +// returns the multierror. +func (g *Group) Wait() *Error { + g.wg.Wait() + g.mutex.Lock() + defer g.mutex.Unlock() + return g.err +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/multierror.go b/tools/vendor/github.com/hashicorp/go-multierror/multierror.go new file mode 100644 index 000000000..f54574326 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/multierror.go @@ -0,0 +1,121 @@ +package multierror + +import ( + "errors" + "fmt" +) + +// Error is an error type to track multiple errors. This is used to +// accumulate errors in cases and return them as a single "error". +type Error struct { + Errors []error + ErrorFormat ErrorFormatFunc +} + +func (e *Error) Error() string { + fn := e.ErrorFormat + if fn == nil { + fn = ListFormatFunc + } + + return fn(e.Errors) +} + +// ErrorOrNil returns an error interface if this Error represents +// a list of errors, or returns nil if the list of errors is empty. This +// function is useful at the end of accumulation to make sure that the value +// returned represents the existence of errors. +func (e *Error) ErrorOrNil() error { + if e == nil { + return nil + } + if len(e.Errors) == 0 { + return nil + } + + return e +} + +func (e *Error) GoString() string { + return fmt.Sprintf("*%#v", *e) +} + +// WrappedErrors returns the list of errors that this Error is wrapping. It is +// an implementation of the errwrap.Wrapper interface so that multierror.Error +// can be used with that library. +// +// This method is not safe to be called concurrently. Unlike accessing the +// Errors field directly, this function also checks if the multierror is nil to +// prevent a null-pointer panic. It satisfies the errwrap.Wrapper interface. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + return e.Errors +} + +// Unwrap returns an error from Error (or nil if there are no errors). +// This error returned will further support Unwrap to get the next error, +// etc. The order will match the order of Errors in the multierror.Error +// at the time of calling. +// +// The resulting error supports errors.As/Is/Unwrap so you can continue +// to use the stdlib errors package to introspect further. +// +// This will perform a shallow copy of the errors slice. Any errors appended +// to this error after calling Unwrap will not be available until a new +// Unwrap is called on the multierror.Error. +func (e *Error) Unwrap() error { + // If we have no errors then we do nothing + if e == nil || len(e.Errors) == 0 { + return nil + } + + // If we have exactly one error, we can just return that directly. + if len(e.Errors) == 1 { + return e.Errors[0] + } + + // Shallow copy the slice + errs := make([]error, len(e.Errors)) + copy(errs, e.Errors) + return chain(errs) +} + +// chain implements the interfaces necessary for errors.Is/As/Unwrap to +// work in a deterministic way with multierror. A chain tracks a list of +// errors while accounting for the current represented error. This lets +// Is/As be meaningful. +// +// Unwrap returns the next error. In the cleanest form, Unwrap would return +// the wrapped error here but we can't do that if we want to properly +// get access to all the errors. Instead, users are recommended to use +// Is/As to get the correct error type out. +// +// Precondition: []error is non-empty (len > 0) +type chain []error + +// Error implements the error interface +func (e chain) Error() string { + return e[0].Error() +} + +// Unwrap implements errors.Unwrap by returning the next error in the +// chain or nil if there are no more errors. +func (e chain) Unwrap() error { + if len(e) == 1 { + return nil + } + + return e[1:] +} + +// As implements errors.As by attempting to map to the current value. +func (e chain) As(target interface{}) bool { + return errors.As(e[0], target) +} + +// Is implements errors.Is by comparing the current value directly. +func (e chain) Is(target error) bool { + return errors.Is(e[0], target) +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/prefix.go b/tools/vendor/github.com/hashicorp/go-multierror/prefix.go new file mode 100644 index 000000000..5c477abe4 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/prefix.go @@ -0,0 +1,37 @@ +package multierror + +import ( + "fmt" + + "github.com/hashicorp/errwrap" +) + +// Prefix is a helper function that will prefix some text +// to the given error. If the error is a multierror.Error, then +// it will be prefixed to each wrapped error. +// +// This is useful to use when appending multiple multierrors +// together in order to give better scoping. +func Prefix(err error, prefix string) error { + if err == nil { + return nil + } + + format := fmt.Sprintf("%s {{err}}", prefix) + switch err := err.(type) { + case *Error: + // Typed nils can reach here, so initialize if we are nil + if err == nil { + err = new(Error) + } + + // Wrap each of the errors + for i, e := range err.Errors { + err.Errors[i] = errwrap.Wrapf(format, e) + } + + return err + default: + return errwrap.Wrapf(format, err) + } +} diff --git a/tools/vendor/github.com/hashicorp/go-multierror/sort.go b/tools/vendor/github.com/hashicorp/go-multierror/sort.go new file mode 100644 index 000000000..fecb14e81 --- /dev/null +++ b/tools/vendor/github.com/hashicorp/go-multierror/sort.go @@ -0,0 +1,16 @@ +package multierror + +// Len implements sort.Interface function for length +func (err Error) Len() int { + return len(err.Errors) +} + +// Swap implements sort.Interface function for swapping elements +func (err Error) Swap(i, j int) { + err.Errors[i], err.Errors[j] = err.Errors[j], err.Errors[i] +} + +// Less implements sort.Interface function for determining order +func (err Error) Less(i, j int) bool { + return err.Errors[i].Error() < err.Errors[j].Error() +} diff --git a/tools/vendor/github.com/huandu/xstrings/.travis.yml b/tools/vendor/github.com/huandu/xstrings/.travis.yml deleted file mode 100644 index d6460be41..000000000 --- a/tools/vendor/github.com/huandu/xstrings/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls -script: - - go test -v -covermode=count -coverprofile=coverage.out - - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ ! -z "$COVERALLS_TOKEN" ]; then $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN; fi' diff --git a/tools/vendor/github.com/huandu/xstrings/README.md b/tools/vendor/github.com/huandu/xstrings/README.md index 292bf2f39..750c3c7eb 100644 --- a/tools/vendor/github.com/huandu/xstrings/README.md +++ b/tools/vendor/github.com/huandu/xstrings/README.md @@ -1,7 +1,7 @@ -# xstrings # +# xstrings -[![Build Status](https://travis-ci.org/huandu/xstrings.svg?branch=master)](https://travis-ci.org/huandu/xstrings) -[![GoDoc](https://godoc.org/github.com/huandu/xstrings?status.svg)](https://godoc.org/github.com/huandu/xstrings) +[![Build Status](https://github.com/huandu/xstrings/workflows/Go/badge.svg)](https://github.com/huandu/xstrings/actions) +[![Go Doc](https://godoc.org/github.com/huandu/xstrings?status.svg)](https://pkg.go.dev/github.com/huandu/xstrings) [![Go Report](https://goreportcard.com/badge/github.com/huandu/xstrings)](https://goreportcard.com/report/github.com/huandu/xstrings) [![Coverage Status](https://coveralls.io/repos/github/huandu/xstrings/badge.svg?branch=master)](https://coveralls.io/github/huandu/xstrings?branch=master) @@ -9,109 +9,109 @@ Go package [xstrings](https://godoc.org/github.com/huandu/xstrings) is a collect All functions are well tested and carefully tuned for performance. -## Propose a new function ## +## Propose a new function Please review [contributing guideline](CONTRIBUTING.md) and [create new issue](https://github.com/huandu/xstrings/issues) to state why it should be included. -## Install ## +## Install Use `go get` to install this library. go get github.com/huandu/xstrings -## API document ## +## API document See [GoDoc](https://godoc.org/github.com/huandu/xstrings) for full document. -## Function list ## +## Function list Go functions have a unique naming style. One, who has experience in other language but new in Go, may have difficulties to find out right string function to use. Here is a list of functions in [strings](http://golang.org/pkg/strings) and [xstrings](https://godoc.org/github.com/huandu/xstrings) with enough extra information about how to map these functions to their friends in other languages. Hope this list could be helpful for fresh gophers. -### Package `xstrings` functions ### - -*Keep this table sorted by Function in ascending order.* - -| Function | Friends | # | -| -------- | ------- | --- | -| [Center](https://godoc.org/github.com/huandu/xstrings#Center) | `str.center` in Python; `String#center` in Ruby | [#30](https://github.com/huandu/xstrings/issues/30) | -| [Count](https://godoc.org/github.com/huandu/xstrings#Count) | `String#count` in Ruby | [#16](https://github.com/huandu/xstrings/issues/16) | -| [Delete](https://godoc.org/github.com/huandu/xstrings#Delete) | `String#delete` in Ruby | [#17](https://github.com/huandu/xstrings/issues/17) | -| [ExpandTabs](https://godoc.org/github.com/huandu/xstrings#ExpandTabs) | `str.expandtabs` in Python | [#27](https://github.com/huandu/xstrings/issues/27) | -| [FirstRuneToLower](https://godoc.org/github.com/huandu/xstrings#FirstRuneToLower) | `lcfirst` in PHP or Perl | [#15](https://github.com/huandu/xstrings/issues/15) | -| [FirstRuneToUpper](https://godoc.org/github.com/huandu/xstrings#FirstRuneToUpper) | `String#capitalize` in Ruby; `ucfirst` in PHP or Perl | [#15](https://github.com/huandu/xstrings/issues/15) | -| [Insert](https://godoc.org/github.com/huandu/xstrings#Insert) | `String#insert` in Ruby | [#18](https://github.com/huandu/xstrings/issues/18) | -| [LastPartition](https://godoc.org/github.com/huandu/xstrings#LastPartition) | `str.rpartition` in Python; `String#rpartition` in Ruby | [#19](https://github.com/huandu/xstrings/issues/19) | -| [LeftJustify](https://godoc.org/github.com/huandu/xstrings#LeftJustify) | `str.ljust` in Python; `String#ljust` in Ruby | [#28](https://github.com/huandu/xstrings/issues/28) | -| [Len](https://godoc.org/github.com/huandu/xstrings#Len) | `mb_strlen` in PHP | [#23](https://github.com/huandu/xstrings/issues/23) | -| [Partition](https://godoc.org/github.com/huandu/xstrings#Partition) | `str.partition` in Python; `String#partition` in Ruby | [#10](https://github.com/huandu/xstrings/issues/10) | -| [Reverse](https://godoc.org/github.com/huandu/xstrings#Reverse) | `String#reverse` in Ruby; `strrev` in PHP; `reverse` in Perl | [#7](https://github.com/huandu/xstrings/issues/7) | -| [RightJustify](https://godoc.org/github.com/huandu/xstrings#RightJustify) | `str.rjust` in Python; `String#rjust` in Ruby | [#29](https://github.com/huandu/xstrings/issues/29) | -| [RuneWidth](https://godoc.org/github.com/huandu/xstrings#RuneWidth) | - | [#27](https://github.com/huandu/xstrings/issues/27) | -| [Scrub](https://godoc.org/github.com/huandu/xstrings#Scrub) | `String#scrub` in Ruby | [#20](https://github.com/huandu/xstrings/issues/20) | -| [Shuffle](https://godoc.org/github.com/huandu/xstrings#Shuffle) | `str_shuffle` in PHP | [#13](https://github.com/huandu/xstrings/issues/13) | -| [ShuffleSource](https://godoc.org/github.com/huandu/xstrings#ShuffleSource) | `str_shuffle` in PHP | [#13](https://github.com/huandu/xstrings/issues/13) | -| [Slice](https://godoc.org/github.com/huandu/xstrings#Slice) | `mb_substr` in PHP | [#9](https://github.com/huandu/xstrings/issues/9) | -| [Squeeze](https://godoc.org/github.com/huandu/xstrings#Squeeze) | `String#squeeze` in Ruby | [#11](https://github.com/huandu/xstrings/issues/11) | -| [Successor](https://godoc.org/github.com/huandu/xstrings#Successor) | `String#succ` or `String#next` in Ruby | [#22](https://github.com/huandu/xstrings/issues/22) | -| [SwapCase](https://godoc.org/github.com/huandu/xstrings#SwapCase) | `str.swapcase` in Python; `String#swapcase` in Ruby | [#12](https://github.com/huandu/xstrings/issues/12) | -| [ToCamelCase](https://godoc.org/github.com/huandu/xstrings#ToCamelCase) | `String#camelize` in RoR | [#1](https://github.com/huandu/xstrings/issues/1) | -| [ToKebab](https://godoc.org/github.com/huandu/xstrings#ToKebabCase) | - | [#41](https://github.com/huandu/xstrings/issues/41) | -| [ToSnakeCase](https://godoc.org/github.com/huandu/xstrings#ToSnakeCase) | `String#underscore` in RoR | [#1](https://github.com/huandu/xstrings/issues/1) | -| [Translate](https://godoc.org/github.com/huandu/xstrings#Translate) | `str.translate` in Python; `String#tr` in Ruby; `strtr` in PHP; `tr///` in Perl | [#21](https://github.com/huandu/xstrings/issues/21) | -| [Width](https://godoc.org/github.com/huandu/xstrings#Width) | `mb_strwidth` in PHP | [#26](https://github.com/huandu/xstrings/issues/26) | -| [WordCount](https://godoc.org/github.com/huandu/xstrings#WordCount) | `str_word_count` in PHP | [#14](https://github.com/huandu/xstrings/issues/14) | -| [WordSplit](https://godoc.org/github.com/huandu/xstrings#WordSplit) | - | [#14](https://github.com/huandu/xstrings/issues/14) | - -### Package `strings` functions ### - -*Keep this table sorted by Function in ascending order.* - -| Function | Friends | -| -------- | ------- | -| [Contains](http://golang.org/pkg/strings/#Contains) | `String#include?` in Ruby | -| [ContainsAny](http://golang.org/pkg/strings/#ContainsAny) | - | -| [ContainsRune](http://golang.org/pkg/strings/#ContainsRune) | - | -| [Count](http://golang.org/pkg/strings/#Count) | `str.count` in Python; `substr_count` in PHP | -| [EqualFold](http://golang.org/pkg/strings/#EqualFold) | `stricmp` in PHP; `String#casecmp` in Ruby | -| [Fields](http://golang.org/pkg/strings/#Fields) | `str.split` in Python; `split` in Perl; `String#split` in Ruby | -| [FieldsFunc](http://golang.org/pkg/strings/#FieldsFunc) | - | -| [HasPrefix](http://golang.org/pkg/strings/#HasPrefix) | `str.startswith` in Python; `String#start_with?` in Ruby | -| [HasSuffix](http://golang.org/pkg/strings/#HasSuffix) | `str.endswith` in Python; `String#end_with?` in Ruby | -| [Index](http://golang.org/pkg/strings/#Index) | `str.index` in Python; `String#index` in Ruby; `strpos` in PHP; `index` in Perl | -| [IndexAny](http://golang.org/pkg/strings/#IndexAny) | - | -| [IndexByte](http://golang.org/pkg/strings/#IndexByte) | - | -| [IndexFunc](http://golang.org/pkg/strings/#IndexFunc) | - | -| [IndexRune](http://golang.org/pkg/strings/#IndexRune) | - | -| [Join](http://golang.org/pkg/strings/#Join) | `str.join` in Python; `Array#join` in Ruby; `implode` in PHP; `join` in Perl | -| [LastIndex](http://golang.org/pkg/strings/#LastIndex) | `str.rindex` in Python; `String#rindex`; `strrpos` in PHP; `rindex` in Perl | -| [LastIndexAny](http://golang.org/pkg/strings/#LastIndexAny) | - | -| [LastIndexFunc](http://golang.org/pkg/strings/#LastIndexFunc) | - | -| [Map](http://golang.org/pkg/strings/#Map) | `String#each_codepoint` in Ruby | -| [Repeat](http://golang.org/pkg/strings/#Repeat) | operator `*` in Python and Ruby; `str_repeat` in PHP | -| [Replace](http://golang.org/pkg/strings/#Replace) | `str.replace` in Python; `String#sub` in Ruby; `str_replace` in PHP | -| [Split](http://golang.org/pkg/strings/#Split) | `str.split` in Python; `String#split` in Ruby; `explode` in PHP; `split` in Perl | -| [SplitAfter](http://golang.org/pkg/strings/#SplitAfter) | - | -| [SplitAfterN](http://golang.org/pkg/strings/#SplitAfterN) | - | -| [SplitN](http://golang.org/pkg/strings/#SplitN) | `str.split` in Python; `String#split` in Ruby; `explode` in PHP; `split` in Perl | -| [Title](http://golang.org/pkg/strings/#Title) | `str.title` in Python | -| [ToLower](http://golang.org/pkg/strings/#ToLower) | `str.lower` in Python; `String#downcase` in Ruby; `strtolower` in PHP; `lc` in Perl | -| [ToLowerSpecial](http://golang.org/pkg/strings/#ToLowerSpecial) | - | -| [ToTitle](http://golang.org/pkg/strings/#ToTitle) | - | -| [ToTitleSpecial](http://golang.org/pkg/strings/#ToTitleSpecial) | - | -| [ToUpper](http://golang.org/pkg/strings/#ToUpper) | `str.upper` in Python; `String#upcase` in Ruby; `strtoupper` in PHP; `uc` in Perl | -| [ToUpperSpecial](http://golang.org/pkg/strings/#ToUpperSpecial) | - | -| [Trim](http://golang.org/pkg/strings/#Trim) | `str.strip` in Python; `String#strip` in Ruby; `trim` in PHP | -| [TrimFunc](http://golang.org/pkg/strings/#TrimFunc) | - | -| [TrimLeft](http://golang.org/pkg/strings/#TrimLeft) | `str.lstrip` in Python; `String#lstrip` in Ruby; `ltrim` in PHP | -| [TrimLeftFunc](http://golang.org/pkg/strings/#TrimLeftFunc) | - | -| [TrimPrefix](http://golang.org/pkg/strings/#TrimPrefix) | - | -| [TrimRight](http://golang.org/pkg/strings/#TrimRight) | `str.rstrip` in Python; `String#rstrip` in Ruby; `rtrim` in PHP | -| [TrimRightFunc](http://golang.org/pkg/strings/#TrimRightFunc) | - | -| [TrimSpace](http://golang.org/pkg/strings/#TrimSpace) | `str.strip` in Python; `String#strip` in Ruby; `trim` in PHP | -| [TrimSuffix](http://golang.org/pkg/strings/#TrimSuffix) | `String#chomp` in Ruby; `chomp` in Perl | - -## License ## +### Package `xstrings` functions + +_Keep this table sorted by Function in ascending order._ + +| Function | Friends | # | +| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | --------------------------------------------------- | +| [Center](https://godoc.org/github.com/huandu/xstrings#Center) | `str.center` in Python; `String#center` in Ruby | [#30](https://github.com/huandu/xstrings/issues/30) | +| [Count](https://godoc.org/github.com/huandu/xstrings#Count) | `String#count` in Ruby | [#16](https://github.com/huandu/xstrings/issues/16) | +| [Delete](https://godoc.org/github.com/huandu/xstrings#Delete) | `String#delete` in Ruby | [#17](https://github.com/huandu/xstrings/issues/17) | +| [ExpandTabs](https://godoc.org/github.com/huandu/xstrings#ExpandTabs) | `str.expandtabs` in Python | [#27](https://github.com/huandu/xstrings/issues/27) | +| [FirstRuneToLower](https://godoc.org/github.com/huandu/xstrings#FirstRuneToLower) | `lcfirst` in PHP or Perl | [#15](https://github.com/huandu/xstrings/issues/15) | +| [FirstRuneToUpper](https://godoc.org/github.com/huandu/xstrings#FirstRuneToUpper) | `String#capitalize` in Ruby; `ucfirst` in PHP or Perl | [#15](https://github.com/huandu/xstrings/issues/15) | +| [Insert](https://godoc.org/github.com/huandu/xstrings#Insert) | `String#insert` in Ruby | [#18](https://github.com/huandu/xstrings/issues/18) | +| [LastPartition](https://godoc.org/github.com/huandu/xstrings#LastPartition) | `str.rpartition` in Python; `String#rpartition` in Ruby | [#19](https://github.com/huandu/xstrings/issues/19) | +| [LeftJustify](https://godoc.org/github.com/huandu/xstrings#LeftJustify) | `str.ljust` in Python; `String#ljust` in Ruby | [#28](https://github.com/huandu/xstrings/issues/28) | +| [Len](https://godoc.org/github.com/huandu/xstrings#Len) | `mb_strlen` in PHP | [#23](https://github.com/huandu/xstrings/issues/23) | +| [Partition](https://godoc.org/github.com/huandu/xstrings#Partition) | `str.partition` in Python; `String#partition` in Ruby | [#10](https://github.com/huandu/xstrings/issues/10) | +| [Reverse](https://godoc.org/github.com/huandu/xstrings#Reverse) | `String#reverse` in Ruby; `strrev` in PHP; `reverse` in Perl | [#7](https://github.com/huandu/xstrings/issues/7) | +| [RightJustify](https://godoc.org/github.com/huandu/xstrings#RightJustify) | `str.rjust` in Python; `String#rjust` in Ruby | [#29](https://github.com/huandu/xstrings/issues/29) | +| [RuneWidth](https://godoc.org/github.com/huandu/xstrings#RuneWidth) | - | [#27](https://github.com/huandu/xstrings/issues/27) | +| [Scrub](https://godoc.org/github.com/huandu/xstrings#Scrub) | `String#scrub` in Ruby | [#20](https://github.com/huandu/xstrings/issues/20) | +| [Shuffle](https://godoc.org/github.com/huandu/xstrings#Shuffle) | `str_shuffle` in PHP | [#13](https://github.com/huandu/xstrings/issues/13) | +| [ShuffleSource](https://godoc.org/github.com/huandu/xstrings#ShuffleSource) | `str_shuffle` in PHP | [#13](https://github.com/huandu/xstrings/issues/13) | +| [Slice](https://godoc.org/github.com/huandu/xstrings#Slice) | `mb_substr` in PHP | [#9](https://github.com/huandu/xstrings/issues/9) | +| [Squeeze](https://godoc.org/github.com/huandu/xstrings#Squeeze) | `String#squeeze` in Ruby | [#11](https://github.com/huandu/xstrings/issues/11) | +| [Successor](https://godoc.org/github.com/huandu/xstrings#Successor) | `String#succ` or `String#next` in Ruby | [#22](https://github.com/huandu/xstrings/issues/22) | +| [SwapCase](https://godoc.org/github.com/huandu/xstrings#SwapCase) | `str.swapcase` in Python; `String#swapcase` in Ruby | [#12](https://github.com/huandu/xstrings/issues/12) | +| [ToCamelCase](https://godoc.org/github.com/huandu/xstrings#ToCamelCase) | `String#camelize` in RoR | [#1](https://github.com/huandu/xstrings/issues/1) | +| [ToKebab](https://godoc.org/github.com/huandu/xstrings#ToKebabCase) | - | [#41](https://github.com/huandu/xstrings/issues/41) | +| [ToSnakeCase](https://godoc.org/github.com/huandu/xstrings#ToSnakeCase) | `String#underscore` in RoR | [#1](https://github.com/huandu/xstrings/issues/1) | +| [Translate](https://godoc.org/github.com/huandu/xstrings#Translate) | `str.translate` in Python; `String#tr` in Ruby; `strtr` in PHP; `tr///` in Perl | [#21](https://github.com/huandu/xstrings/issues/21) | +| [Width](https://godoc.org/github.com/huandu/xstrings#Width) | `mb_strwidth` in PHP | [#26](https://github.com/huandu/xstrings/issues/26) | +| [WordCount](https://godoc.org/github.com/huandu/xstrings#WordCount) | `str_word_count` in PHP | [#14](https://github.com/huandu/xstrings/issues/14) | +| [WordSplit](https://godoc.org/github.com/huandu/xstrings#WordSplit) | - | [#14](https://github.com/huandu/xstrings/issues/14) | + +### Package `strings` functions + +_Keep this table sorted by Function in ascending order._ + +| Function | Friends | +| --------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| [Contains](http://golang.org/pkg/strings/#Contains) | `String#include?` in Ruby | +| [ContainsAny](http://golang.org/pkg/strings/#ContainsAny) | - | +| [ContainsRune](http://golang.org/pkg/strings/#ContainsRune) | - | +| [Count](http://golang.org/pkg/strings/#Count) | `str.count` in Python; `substr_count` in PHP | +| [EqualFold](http://golang.org/pkg/strings/#EqualFold) | `stricmp` in PHP; `String#casecmp` in Ruby | +| [Fields](http://golang.org/pkg/strings/#Fields) | `str.split` in Python; `split` in Perl; `String#split` in Ruby | +| [FieldsFunc](http://golang.org/pkg/strings/#FieldsFunc) | - | +| [HasPrefix](http://golang.org/pkg/strings/#HasPrefix) | `str.startswith` in Python; `String#start_with?` in Ruby | +| [HasSuffix](http://golang.org/pkg/strings/#HasSuffix) | `str.endswith` in Python; `String#end_with?` in Ruby | +| [Index](http://golang.org/pkg/strings/#Index) | `str.index` in Python; `String#index` in Ruby; `strpos` in PHP; `index` in Perl | +| [IndexAny](http://golang.org/pkg/strings/#IndexAny) | - | +| [IndexByte](http://golang.org/pkg/strings/#IndexByte) | - | +| [IndexFunc](http://golang.org/pkg/strings/#IndexFunc) | - | +| [IndexRune](http://golang.org/pkg/strings/#IndexRune) | - | +| [Join](http://golang.org/pkg/strings/#Join) | `str.join` in Python; `Array#join` in Ruby; `implode` in PHP; `join` in Perl | +| [LastIndex](http://golang.org/pkg/strings/#LastIndex) | `str.rindex` in Python; `String#rindex`; `strrpos` in PHP; `rindex` in Perl | +| [LastIndexAny](http://golang.org/pkg/strings/#LastIndexAny) | - | +| [LastIndexFunc](http://golang.org/pkg/strings/#LastIndexFunc) | - | +| [Map](http://golang.org/pkg/strings/#Map) | `String#each_codepoint` in Ruby | +| [Repeat](http://golang.org/pkg/strings/#Repeat) | operator `*` in Python and Ruby; `str_repeat` in PHP | +| [Replace](http://golang.org/pkg/strings/#Replace) | `str.replace` in Python; `String#sub` in Ruby; `str_replace` in PHP | +| [Split](http://golang.org/pkg/strings/#Split) | `str.split` in Python; `String#split` in Ruby; `explode` in PHP; `split` in Perl | +| [SplitAfter](http://golang.org/pkg/strings/#SplitAfter) | - | +| [SplitAfterN](http://golang.org/pkg/strings/#SplitAfterN) | - | +| [SplitN](http://golang.org/pkg/strings/#SplitN) | `str.split` in Python; `String#split` in Ruby; `explode` in PHP; `split` in Perl | +| [Title](http://golang.org/pkg/strings/#Title) | `str.title` in Python | +| [ToLower](http://golang.org/pkg/strings/#ToLower) | `str.lower` in Python; `String#downcase` in Ruby; `strtolower` in PHP; `lc` in Perl | +| [ToLowerSpecial](http://golang.org/pkg/strings/#ToLowerSpecial) | - | +| [ToTitle](http://golang.org/pkg/strings/#ToTitle) | - | +| [ToTitleSpecial](http://golang.org/pkg/strings/#ToTitleSpecial) | - | +| [ToUpper](http://golang.org/pkg/strings/#ToUpper) | `str.upper` in Python; `String#upcase` in Ruby; `strtoupper` in PHP; `uc` in Perl | +| [ToUpperSpecial](http://golang.org/pkg/strings/#ToUpperSpecial) | - | +| [Trim](http://golang.org/pkg/strings/#Trim) | `str.strip` in Python; `String#strip` in Ruby; `trim` in PHP | +| [TrimFunc](http://golang.org/pkg/strings/#TrimFunc) | - | +| [TrimLeft](http://golang.org/pkg/strings/#TrimLeft) | `str.lstrip` in Python; `String#lstrip` in Ruby; `ltrim` in PHP | +| [TrimLeftFunc](http://golang.org/pkg/strings/#TrimLeftFunc) | - | +| [TrimPrefix](http://golang.org/pkg/strings/#TrimPrefix) | - | +| [TrimRight](http://golang.org/pkg/strings/#TrimRight) | `str.rstrip` in Python; `String#rstrip` in Ruby; `rtrim` in PHP | +| [TrimRightFunc](http://golang.org/pkg/strings/#TrimRightFunc) | - | +| [TrimSpace](http://golang.org/pkg/strings/#TrimSpace) | `str.strip` in Python; `String#strip` in Ruby; `trim` in PHP | +| [TrimSuffix](http://golang.org/pkg/strings/#TrimSuffix) | `String#chomp` in Ruby; `chomp` in Perl | + +## License This library is licensed under MIT license. See LICENSE for details. diff --git a/tools/vendor/github.com/huandu/xstrings/convert.go b/tools/vendor/github.com/huandu/xstrings/convert.go index 3d5a34950..cba0d0725 100644 --- a/tools/vendor/github.com/huandu/xstrings/convert.go +++ b/tools/vendor/github.com/huandu/xstrings/convert.go @@ -12,11 +12,12 @@ import ( // ToCamelCase is to convert words separated by space, underscore and hyphen to camel case. // // Some samples. -// "some_words" => "SomeWords" -// "http_server" => "HttpServer" -// "no_https" => "NoHttps" -// "_complex__case_" => "_Complex_Case_" -// "some words" => "SomeWords" +// +// "some_words" => "SomeWords" +// "http_server" => "HttpServer" +// "no_https" => "NoHttps" +// "_complex__case_" => "_Complex_Case_" +// "some words" => "SomeWords" func ToCamelCase(str string) string { if len(str) == 0 { return "" @@ -61,7 +62,6 @@ func ToCamelCase(str string) string { if isConnector(r1) { r0 = unicode.ToUpper(r0) } else { - r0 = unicode.ToLower(r0) buf.WriteRune(r1) } } @@ -74,16 +74,17 @@ func ToCamelCase(str string) string { // snake case format. // // Some samples. -// "FirstName" => "first_name" -// "HTTPServer" => "http_server" -// "NoHTTPS" => "no_https" -// "GO_PATH" => "go_path" -// "GO PATH" => "go_path" // space is converted to underscore. -// "GO-PATH" => "go_path" // hyphen is converted to underscore. -// "http2xx" => "http_2xx" // insert an underscore before a number and after an alphabet. -// "HTTP20xOK" => "http_20x_ok" -// "Duration2m3s" => "duration_2m3s" -// "Bld4Floor3rd" => "bld4_floor_3rd" +// +// "FirstName" => "first_name" +// "HTTPServer" => "http_server" +// "NoHTTPS" => "no_https" +// "GO_PATH" => "go_path" +// "GO PATH" => "go_path" // space is converted to underscore. +// "GO-PATH" => "go_path" // hyphen is converted to underscore. +// "http2xx" => "http_2xx" // insert an underscore before a number and after an alphabet. +// "HTTP20xOK" => "http_20x_ok" +// "Duration2m3s" => "duration_2m3s" +// "Bld4Floor3rd" => "bld4_floor_3rd" func ToSnakeCase(str string) string { return camelCaseToLowerCase(str, '_') } @@ -92,16 +93,17 @@ func ToSnakeCase(str string) string { // kebab case format. // // Some samples. -// "FirstName" => "first-name" -// "HTTPServer" => "http-server" -// "NoHTTPS" => "no-https" -// "GO_PATH" => "go-path" -// "GO PATH" => "go-path" // space is converted to '-'. -// "GO-PATH" => "go-path" // hyphen is converted to '-'. -// "http2xx" => "http-2xx" // insert an underscore before a number and after an alphabet. -// "HTTP20xOK" => "http-20x-ok" -// "Duration2m3s" => "duration-2m3s" -// "Bld4Floor3rd" => "bld4-floor-3rd" +// +// "FirstName" => "first-name" +// "HTTPServer" => "http-server" +// "NoHTTPS" => "no-https" +// "GO_PATH" => "go-path" +// "GO PATH" => "go-path" // space is converted to '-'. +// "GO-PATH" => "go-path" // hyphen is converted to '-'. +// "http2xx" => "http-2xx" // insert an underscore before a number and after an alphabet. +// "HTTP20xOK" => "http-20x-ok" +// "Duration2m3s" => "duration-2m3s" +// "Bld4Floor3rd" => "bld4-floor-3rd" func ToKebabCase(str string) string { return camelCaseToLowerCase(str, '-') } @@ -130,7 +132,7 @@ func camelCaseToLowerCase(str string, connector rune) string { wt, word, remaining = nextWord(remaining) } - if wt != invalidWord && wt != punctWord { + if wt != invalidWord && wt != punctWord && wt != connectorWord { buf.WriteRune(connector) } @@ -510,17 +512,18 @@ func ShuffleSource(str string, src rand.Source) string { // regardless whether the result is a valid rune or not. // // Only following characters are alphanumeric. -// * a - z -// * A - Z -// * 0 - 9 +// - a - z +// - A - Z +// - 0 - 9 // // Samples (borrowed from ruby's String#succ document): -// "abcd" => "abce" -// "THX1138" => "THX1139" -// "<>" => "<>" -// "1999zzz" => "2000aaa" -// "ZZZ9999" => "AAAA0000" -// "***" => "**+" +// +// "abcd" => "abce" +// "THX1138" => "THX1139" +// "<>" => "<>" +// "1999zzz" => "2000aaa" +// "ZZZ9999" => "AAAA0000" +// "***" => "**+" func Successor(str string) string { if str == "" { return str diff --git a/tools/vendor/github.com/huandu/xstrings/format.go b/tools/vendor/github.com/huandu/xstrings/format.go index 8cd76c525..b32219bbd 100644 --- a/tools/vendor/github.com/huandu/xstrings/format.go +++ b/tools/vendor/github.com/huandu/xstrings/format.go @@ -17,9 +17,10 @@ import ( // If tabSize <= 0, ExpandTabs panics with error. // // Samples: -// ExpandTabs("a\tbc\tdef\tghij\tk", 4) => "a bc def ghij k" -// ExpandTabs("abcdefg\thij\nk\tl", 4) => "abcdefg hij\nk l" -// ExpandTabs("z中\tæ–‡\tw", 4) => "z中 æ–‡ w" +// +// ExpandTabs("a\tbc\tdef\tghij\tk", 4) => "a bc def ghij k" +// ExpandTabs("abcdefg\thij\nk\tl", 4) => "abcdefg hij\nk l" +// ExpandTabs("z中\tæ–‡\tw", 4) => "z中 æ–‡ w" func ExpandTabs(str string, tabSize int) string { if tabSize <= 0 { panic("tab size must be positive") @@ -74,9 +75,10 @@ func ExpandTabs(str string, tabSize int) string { // If pad is an empty string, str will be returned. // // Samples: -// LeftJustify("hello", 4, " ") => "hello" -// LeftJustify("hello", 10, " ") => "hello " -// LeftJustify("hello", 10, "123") => "hello12312" +// +// LeftJustify("hello", 4, " ") => "hello" +// LeftJustify("hello", 10, " ") => "hello " +// LeftJustify("hello", 10, "123") => "hello12312" func LeftJustify(str string, length int, pad string) string { l := Len(str) @@ -100,9 +102,10 @@ func LeftJustify(str string, length int, pad string) string { // If pad is an empty string, str will be returned. // // Samples: -// RightJustify("hello", 4, " ") => "hello" -// RightJustify("hello", 10, " ") => " hello" -// RightJustify("hello", 10, "123") => "12312hello" +// +// RightJustify("hello", 4, " ") => "hello" +// RightJustify("hello", 10, " ") => " hello" +// RightJustify("hello", 10, "123") => "12312hello" func RightJustify(str string, length int, pad string) string { l := Len(str) @@ -126,9 +129,10 @@ func RightJustify(str string, length int, pad string) string { // If pad is an empty string, str will be returned. // // Samples: -// Center("hello", 4, " ") => "hello" -// Center("hello", 10, " ") => " hello " -// Center("hello", 10, "123") => "12hello123" +// +// Center("hello", 4, " ") => "hello" +// Center("hello", 10, " ") => " hello " +// Center("hello", 10, "123") => "12hello123" func Center(str string, length int, pad string) string { l := Len(str) diff --git a/tools/vendor/github.com/huandu/xstrings/manipulate.go b/tools/vendor/github.com/huandu/xstrings/manipulate.go index 64075f9bb..ab42fe0fe 100644 --- a/tools/vendor/github.com/huandu/xstrings/manipulate.go +++ b/tools/vendor/github.com/huandu/xstrings/manipulate.go @@ -79,10 +79,12 @@ func Slice(str string, start, end int) string { // The return value is a slice of strings with head, match and tail. // // If str contains sep, for example "hello" and "l", Partition returns -// "he", "l", "lo" +// +// "he", "l", "lo" // // If str doesn't contain sep, for example "hello" and "x", Partition returns -// "hello", "", "" +// +// "hello", "", "" func Partition(str, sep string) (head, match, tail string) { index := strings.Index(str, sep) @@ -101,10 +103,12 @@ func Partition(str, sep string) (head, match, tail string) { // The return value is a slice of strings with head, match and tail. // // If str contains sep, for example "hello" and "l", LastPartition returns -// "hel", "l", "o" +// +// "hel", "l", "o" // // If str doesn't contain sep, for example "hello" and "x", LastPartition returns -// "", "", "hello" +// +// "", "", "hello" func LastPartition(str, sep string) (head, match, tail string) { index := strings.LastIndex(str, sep) diff --git a/tools/vendor/github.com/huandu/xstrings/stringbuilder.go b/tools/vendor/github.com/huandu/xstrings/stringbuilder.go index bb0919d32..06812fea0 100644 --- a/tools/vendor/github.com/huandu/xstrings/stringbuilder.go +++ b/tools/vendor/github.com/huandu/xstrings/stringbuilder.go @@ -1,4 +1,5 @@ -//+build go1.10 +//go:build go1.10 +// +build go1.10 package xstrings diff --git a/tools/vendor/github.com/huandu/xstrings/stringbuilder_go110.go b/tools/vendor/github.com/huandu/xstrings/stringbuilder_go110.go index dac389d13..ccaa5aedd 100644 --- a/tools/vendor/github.com/huandu/xstrings/stringbuilder_go110.go +++ b/tools/vendor/github.com/huandu/xstrings/stringbuilder_go110.go @@ -1,4 +1,5 @@ -//+build !go1.10 +//go:build !go1.10 +// +build !go1.10 package xstrings diff --git a/tools/vendor/github.com/huandu/xstrings/translate.go b/tools/vendor/github.com/huandu/xstrings/translate.go index 42e694fb1..1fac6a00b 100644 --- a/tools/vendor/github.com/huandu/xstrings/translate.go +++ b/tools/vendor/github.com/huandu/xstrings/translate.go @@ -416,14 +416,16 @@ func (tr *Translator) HasPattern() bool { // // From and to are patterns representing a set of characters. Pattern is defined as following. // -// * Special characters -// * '-' means a range of runes, e.g. -// * "a-z" means all characters from 'a' to 'z' inclusive; -// * "z-a" means all characters from 'z' to 'a' inclusive. -// * '^' as first character means a set of all runes excepted listed, e.g. -// * "^a-z" means all characters except 'a' to 'z' inclusive. -// * '\' escapes special characters. -// * Normal character represents itself, e.g. "abc" is a set including 'a', 'b' and 'c'. +// Special characters: +// +// 1. '-' means a range of runes, e.g. +// "a-z" means all characters from 'a' to 'z' inclusive; +// "z-a" means all characters from 'z' to 'a' inclusive. +// 2. '^' as first character means a set of all runes excepted listed, e.g. +// "^a-z" means all characters except 'a' to 'z' inclusive. +// 3. '\' escapes special characters. +// +// Normal character represents itself, e.g. "abc" is a set including 'a', 'b' and 'c'. // // Translate will try to find a 1:1 mapping from from to to. // If to is smaller than from, last rune in to will be used to map "out of range" characters in from. @@ -433,12 +435,13 @@ func (tr *Translator) HasPattern() bool { // If the to pattern is an empty string, Translate works exactly the same as Delete. // // Samples: -// Translate("hello", "aeiou", "12345") => "h2ll4" -// Translate("hello", "a-z", "A-Z") => "HELLO" -// Translate("hello", "z-a", "a-z") => "svool" -// Translate("hello", "aeiou", "*") => "h*ll*" -// Translate("hello", "^l", "*") => "**ll*" -// Translate("hello ^ world", `\^lo`, "*") => "he*** * w*r*d" +// +// Translate("hello", "aeiou", "12345") => "h2ll4" +// Translate("hello", "a-z", "A-Z") => "HELLO" +// Translate("hello", "z-a", "a-z") => "svool" +// Translate("hello", "aeiou", "*") => "h*ll*" +// Translate("hello", "^l", "*") => "**ll*" +// Translate("hello ^ world", `\^lo`, "*") => "he*** * w*r*d" func Translate(str, from, to string) string { tr := NewTranslator(from, to) return tr.Translate(str) @@ -448,9 +451,10 @@ func Translate(str, from, to string) string { // Pattern is defined in Translate function. // // Samples: -// Delete("hello", "aeiou") => "hll" -// Delete("hello", "a-k") => "llo" -// Delete("hello", "^a-k") => "he" +// +// Delete("hello", "aeiou") => "hll" +// Delete("hello", "a-k") => "llo" +// Delete("hello", "^a-k") => "he" func Delete(str, pattern string) string { tr := NewTranslator(pattern, "") return tr.Translate(str) @@ -460,9 +464,10 @@ func Delete(str, pattern string) string { // Pattern is defined in Translate function. // // Samples: -// Count("hello", "aeiou") => 3 -// Count("hello", "a-k") => 3 -// Count("hello", "^a-k") => 2 +// +// Count("hello", "aeiou") => 3 +// Count("hello", "a-k") => 3 +// Count("hello", "^a-k") => 2 func Count(str, pattern string) int { if pattern == "" || str == "" { return 0 @@ -491,9 +496,10 @@ func Count(str, pattern string) int { // If pattern is not empty, only runes matching the pattern will be squeezed. // // Samples: -// Squeeze("hello", "") => "helo" -// Squeeze("hello", "m-z") => "hello" -// Squeeze("hello world", " ") => "hello world" +// +// Squeeze("hello", "") => "helo" +// Squeeze("hello", "m-z") => "hello" +// Squeeze("hello world", " ") => "hello world" func Squeeze(str, pattern string) string { var last, r rune var size int diff --git a/tools/vendor/github.com/klauspost/compress/.gitignore b/tools/vendor/github.com/klauspost/compress/.gitignore index b35f8449b..d31b37815 100644 --- a/tools/vendor/github.com/klauspost/compress/.gitignore +++ b/tools/vendor/github.com/klauspost/compress/.gitignore @@ -23,3 +23,10 @@ _testmain.go *.test *.prof /s2/cmd/_s2sx/sfx-exe + +# Linux perf files +perf.data +perf.data.old + +# gdb history +.gdb_history diff --git a/tools/vendor/github.com/klauspost/compress/.goreleaser.yml b/tools/vendor/github.com/klauspost/compress/.goreleaser.yml index 0af08e65e..7a008a4d2 100644 --- a/tools/vendor/github.com/klauspost/compress/.goreleaser.yml +++ b/tools/vendor/github.com/klauspost/compress/.goreleaser.yml @@ -3,7 +3,7 @@ before: hooks: - ./gen.sh - - go install mvdan.cc/garble@latest + - go install mvdan.cc/garble@v0.9.3 builds: - diff --git a/tools/vendor/github.com/klauspost/compress/README.md b/tools/vendor/github.com/klauspost/compress/README.md index e8ff994f8..efab55e65 100644 --- a/tools/vendor/github.com/klauspost/compress/README.md +++ b/tools/vendor/github.com/klauspost/compress/README.md @@ -9,7 +9,6 @@ This package provides various compression algorithms. * [huff0](https://github.com/klauspost/compress/tree/master/huff0) and [FSE](https://github.com/klauspost/compress/tree/master/fse) implementations for raw entropy encoding. * [gzhttp](https://github.com/klauspost/compress/tree/master/gzhttp) Provides client and server wrappers for handling gzipped requests efficiently. * [pgzip](https://github.com/klauspost/pgzip) is a separate package that provides a very fast parallel gzip implementation. -* [fuzz package](https://github.com/klauspost/compress-fuzz) for fuzz testing all compressors/decompressors here. [![Go Reference](https://pkg.go.dev/badge/klauspost/compress.svg)](https://pkg.go.dev/github.com/klauspost/compress?tab=subdirectories) [![Go](https://github.com/klauspost/compress/actions/workflows/go.yml/badge.svg)](https://github.com/klauspost/compress/actions/workflows/go.yml) @@ -17,13 +16,189 @@ This package provides various compression algorithms. # changelog +* 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 + * zstd: Minor speed tweaks by @greatroar in https://github.com/klauspost/compress/pull/716 https://github.com/klauspost/compress/pull/720 + * export NoGzipResponseWriter for custom ResponseWriter wrappers by @harshavardhana in https://github.com/klauspost/compress/pull/722 + * s2: Add example for indexing and existing stream https://github.com/klauspost/compress/pull/723 + +* Dec 11, 2022 (v1.15.13) + * zstd: Add [MaxEncodedSize](https://pkg.go.dev/github.com/klauspost/compress@v1.15.13/zstd#Encoder.MaxEncodedSize) to encoder https://github.com/klauspost/compress/pull/691 + * zstd: Various tweaks and improvements https://github.com/klauspost/compress/pull/693 https://github.com/klauspost/compress/pull/695 https://github.com/klauspost/compress/pull/696 https://github.com/klauspost/compress/pull/701 https://github.com/klauspost/compress/pull/702 https://github.com/klauspost/compress/pull/703 https://github.com/klauspost/compress/pull/704 https://github.com/klauspost/compress/pull/705 https://github.com/klauspost/compress/pull/706 https://github.com/klauspost/compress/pull/707 https://github.com/klauspost/compress/pull/708 + +* Oct 26, 2022 (v1.15.12) + + * zstd: Tweak decoder allocs. https://github.com/klauspost/compress/pull/680 + * gzhttp: Always delete `HeaderNoCompression` https://github.com/klauspost/compress/pull/683 + +* Sept 26, 2022 (v1.15.11) + + * flate: Improve level 1-3 compression https://github.com/klauspost/compress/pull/678 + * zstd: Improve "best" compression by @nightwolfz in https://github.com/klauspost/compress/pull/677 + * zstd: Fix+reduce decompression allocations https://github.com/klauspost/compress/pull/668 + * zstd: Fix non-effective noescape tag https://github.com/klauspost/compress/pull/667 + +* Sept 16, 2022 (v1.15.10) + + * zstd: Add [WithDecodeAllCapLimit](https://pkg.go.dev/github.com/klauspost/compress@v1.15.10/zstd#WithDecodeAllCapLimit) https://github.com/klauspost/compress/pull/649 + * Add Go 1.19 - deprecate Go 1.16 https://github.com/klauspost/compress/pull/651 + * flate: Improve level 5+6 compression https://github.com/klauspost/compress/pull/656 + * zstd: Improve "better" compresssion https://github.com/klauspost/compress/pull/657 + * s2: Improve "best" compression https://github.com/klauspost/compress/pull/658 + * s2: Improve "better" compression. https://github.com/klauspost/compress/pull/635 + * s2: Slightly faster non-assembly decompression https://github.com/klauspost/compress/pull/646 + * Use arrays for constant size copies https://github.com/klauspost/compress/pull/659 + +* July 21, 2022 (v1.15.9) + + * zstd: Fix decoder crash on amd64 (no BMI) on invalid input https://github.com/klauspost/compress/pull/645 + * zstd: Disable decoder extended memory copies (amd64) due to possible crashes https://github.com/klauspost/compress/pull/644 + * zstd: Allow single segments up to "max decoded size" by @klauspost in https://github.com/klauspost/compress/pull/643 + +* July 13, 2022 (v1.15.8) + + * gzip: fix stack exhaustion bug in Reader.Read https://github.com/klauspost/compress/pull/641 + * s2: Add Index header trim/restore https://github.com/klauspost/compress/pull/638 + * zstd: Optimize seqdeq amd64 asm by @greatroar in https://github.com/klauspost/compress/pull/636 + * zstd: Improve decoder memcopy https://github.com/klauspost/compress/pull/637 + * huff0: Pass a single bitReader pointer to asm by @greatroar in https://github.com/klauspost/compress/pull/634 + * zstd: Branchless getBits for amd64 w/o BMI2 by @greatroar in https://github.com/klauspost/compress/pull/640 + * gzhttp: Remove header before writing https://github.com/klauspost/compress/pull/639 + +* June 29, 2022 (v1.15.7) + + * s2: Fix absolute forward seeks https://github.com/klauspost/compress/pull/633 + * zip: Merge upstream https://github.com/klauspost/compress/pull/631 + * zip: Re-add zip64 fix https://github.com/klauspost/compress/pull/624 + * zstd: translate fseDecoder.buildDtable into asm by @WojciechMula in https://github.com/klauspost/compress/pull/598 + * flate: Faster histograms https://github.com/klauspost/compress/pull/620 + * deflate: Use compound hcode https://github.com/klauspost/compress/pull/622 + +* June 3, 2022 (v1.15.6) + * s2: Improve coding for long, close matches https://github.com/klauspost/compress/pull/613 + * s2c: Add Snappy/S2 stream recompression https://github.com/klauspost/compress/pull/611 + * zstd: Always use configured block size https://github.com/klauspost/compress/pull/605 + * zstd: Fix incorrect hash table placement for dict encoding in default https://github.com/klauspost/compress/pull/606 + * zstd: Apply default config to ZipDecompressor without options https://github.com/klauspost/compress/pull/608 + * gzhttp: Exclude more common archive formats https://github.com/klauspost/compress/pull/612 + * s2: Add ReaderIgnoreCRC https://github.com/klauspost/compress/pull/609 + * s2: Remove sanity load on index creation https://github.com/klauspost/compress/pull/607 + * snappy: Use dedicated function for scoring https://github.com/klauspost/compress/pull/614 + * s2c+s2d: Use official snappy framed extension https://github.com/klauspost/compress/pull/610 + +* May 25, 2022 (v1.15.5) + * s2: Add concurrent stream decompression https://github.com/klauspost/compress/pull/602 + * s2: Fix final emit oob read crash on amd64 https://github.com/klauspost/compress/pull/601 + * huff0: asm implementation of Decompress1X by @WojciechMula https://github.com/klauspost/compress/pull/596 + * zstd: Use 1 less goroutine for stream decoding https://github.com/klauspost/compress/pull/588 + * zstd: Copy literal in 16 byte blocks when possible https://github.com/klauspost/compress/pull/592 + * zstd: Speed up when WithDecoderLowmem(false) https://github.com/klauspost/compress/pull/599 + * zstd: faster next state update in BMI2 version of decode by @WojciechMula in https://github.com/klauspost/compress/pull/593 + * huff0: Do not check max size when reading table. https://github.com/klauspost/compress/pull/586 + * flate: Inplace hashing for level 7-9 by @klauspost in https://github.com/klauspost/compress/pull/590 + + +* May 11, 2022 (v1.15.4) + * huff0: decompress directly into output by @WojciechMula in [#577](https://github.com/klauspost/compress/pull/577) + * inflate: Keep dict on stack [#581](https://github.com/klauspost/compress/pull/581) + * zstd: Faster decoding memcopy in asm [#583](https://github.com/klauspost/compress/pull/583) + * zstd: Fix ignored crc [#580](https://github.com/klauspost/compress/pull/580) + +* May 5, 2022 (v1.15.3) + * zstd: Allow to ignore checksum checking by @WojciechMula [#572](https://github.com/klauspost/compress/pull/572) + * s2: Fix incorrect seek for io.SeekEnd in [#575](https://github.com/klauspost/compress/pull/575) + +* Apr 26, 2022 (v1.15.2) + * zstd: Add x86-64 assembly for decompression on streams and blocks. Contributed by [@WojciechMula](https://github.com/WojciechMula). Typically 2x faster. [#528](https://github.com/klauspost/compress/pull/528) [#531](https://github.com/klauspost/compress/pull/531) [#545](https://github.com/klauspost/compress/pull/545) [#537](https://github.com/klauspost/compress/pull/537) + * zstd: Add options to ZipDecompressor and fixes [#539](https://github.com/klauspost/compress/pull/539) + * s2: Use sorted search for index [#555](https://github.com/klauspost/compress/pull/555) + * Minimum version is Go 1.16, added CI test on 1.18. + +* Mar 11, 2022 (v1.15.1) + * huff0: Add x86 assembly of Decode4X by @WojciechMula in [#512](https://github.com/klauspost/compress/pull/512) + * zstd: Reuse zip decoders in [#514](https://github.com/klauspost/compress/pull/514) + * zstd: Detect extra block data and report as corrupted in [#520](https://github.com/klauspost/compress/pull/520) + * zstd: Handle zero sized frame content size stricter in [#521](https://github.com/klauspost/compress/pull/521) + * zstd: Add stricter block size checks in [#523](https://github.com/klauspost/compress/pull/523) + +* Mar 3, 2022 (v1.15.0) + * zstd: Refactor decoder by @klauspost in [#498](https://github.com/klauspost/compress/pull/498) + * zstd: Add stream encoding without goroutines by @klauspost in [#505](https://github.com/klauspost/compress/pull/505) + * huff0: Prevent single blocks exceeding 16 bits by @klauspost in[#507](https://github.com/klauspost/compress/pull/507) + * flate: Inline literal emission by @klauspost in [#509](https://github.com/klauspost/compress/pull/509) + * gzhttp: Add zstd to transport by @klauspost in [#400](https://github.com/klauspost/compress/pull/400) + * gzhttp: Make content-type optional by @klauspost in [#510](https://github.com/klauspost/compress/pull/510) + +Both compression and decompression now supports "synchronous" stream operations. This means that whenever "concurrency" is set to 1, they will operate without spawning goroutines. + +Stream decompression is now faster on asynchronous, since the goroutine allocation much more effectively splits the workload. On typical streams this will typically use 2 cores fully for decompression. When a stream has finished decoding no goroutines will be left over, so decoders can now safely be pooled and still be garbage collected. + +While the release has been extensively tested, it is recommended to testing when upgrading. + +
    + See changes to v1.14.x + +* Feb 22, 2022 (v1.14.4) + * flate: Fix rare huffman only (-2) corruption. [#503](https://github.com/klauspost/compress/pull/503) + * zip: Update deprecated CreateHeaderRaw to correctly call CreateRaw by @saracen in [#502](https://github.com/klauspost/compress/pull/502) + * zip: don't read data descriptor early by @saracen in [#501](https://github.com/klauspost/compress/pull/501) #501 + * huff0: Use static decompression buffer up to 30% faster by @klauspost in [#499](https://github.com/klauspost/compress/pull/499) [#500](https://github.com/klauspost/compress/pull/500) + +* Feb 17, 2022 (v1.14.3) + * flate: Improve fastest levels compression speed ~10% more throughput. [#482](https://github.com/klauspost/compress/pull/482) [#489](https://github.com/klauspost/compress/pull/489) [#490](https://github.com/klauspost/compress/pull/490) [#491](https://github.com/klauspost/compress/pull/491) [#494](https://github.com/klauspost/compress/pull/494) [#478](https://github.com/klauspost/compress/pull/478) + * flate: Faster decompression speed, ~5-10%. [#483](https://github.com/klauspost/compress/pull/483) + * s2: Faster compression with Go v1.18 and amd64 microarch level 3+. [#484](https://github.com/klauspost/compress/pull/484) [#486](https://github.com/klauspost/compress/pull/486) + +* Jan 25, 2022 (v1.14.2) + * zstd: improve header decoder by @dsnet [#476](https://github.com/klauspost/compress/pull/476) + * zstd: Add bigger default blocks [#469](https://github.com/klauspost/compress/pull/469) + * zstd: Remove unused decompression buffer [#470](https://github.com/klauspost/compress/pull/470) + * zstd: Fix logically dead code by @ningmingxiao [#472](https://github.com/klauspost/compress/pull/472) + * flate: Improve level 7-9 [#471](https://github.com/klauspost/compress/pull/471) [#473](https://github.com/klauspost/compress/pull/473) + * zstd: Add noasm tag for xxhash [#475](https://github.com/klauspost/compress/pull/475) + * Jan 11, 2022 (v1.14.1) * s2: Add stream index in [#462](https://github.com/klauspost/compress/pull/462) * flate: Speed and efficiency improvements in [#439](https://github.com/klauspost/compress/pull/439) [#461](https://github.com/klauspost/compress/pull/461) [#455](https://github.com/klauspost/compress/pull/455) [#452](https://github.com/klauspost/compress/pull/452) [#458](https://github.com/klauspost/compress/pull/458) * zstd: Performance improvement in [#420]( https://github.com/klauspost/compress/pull/420) [#456](https://github.com/klauspost/compress/pull/456) [#437](https://github.com/klauspost/compress/pull/437) [#467](https://github.com/klauspost/compress/pull/467) [#468](https://github.com/klauspost/compress/pull/468) * zstd: add arm64 xxhash assembly in [#464](https://github.com/klauspost/compress/pull/464) * Add garbled for binaries for s2 in [#445](https://github.com/klauspost/compress/pull/445) +
    +
    + See changes to v1.13.x + * Aug 30, 2021 (v1.13.5) * gz/zlib/flate: Alias stdlib errors [#425](https://github.com/klauspost/compress/pull/425) * s2: Add block support to commandline tools [#413](https://github.com/klauspost/compress/pull/413) @@ -52,7 +227,12 @@ This package provides various compression algorithms. * Added [gzhttp](https://github.com/klauspost/compress/tree/master/gzhttp#gzip-handler) which allows wrapping HTTP servers and clients with GZIP compressors. * zstd: Detect short invalid signatures [#382](https://github.com/klauspost/compress/pull/382) * zstd: Spawn decoder goroutine only if needed. [#380](https://github.com/klauspost/compress/pull/380) +
    + +
    + See changes to v1.12.x + * May 25, 2021 (v1.12.3) * deflate: Better/faster Huffman encoding [#374](https://github.com/klauspost/compress/pull/374) * deflate: Allocate less for history. [#375](https://github.com/klauspost/compress/pull/375) @@ -74,9 +254,10 @@ This package provides various compression algorithms. * s2c/s2d/s2sx: Always truncate when writing files [#352](https://github.com/klauspost/compress/pull/352) * zstd: Reduce memory usage further when using [WithLowerEncoderMem](https://pkg.go.dev/github.com/klauspost/compress/zstd#WithLowerEncoderMem) [#346](https://github.com/klauspost/compress/pull/346) * s2: Fix potential problem with amd64 assembly and profilers [#349](https://github.com/klauspost/compress/pull/349) +
    - See changes prior to v1.12.1 + See changes to v1.11.x * Mar 26, 2021 (v1.11.13) * zstd: Big speedup on small dictionary encodes [#344](https://github.com/klauspost/compress/pull/344) [#345](https://github.com/klauspost/compress/pull/345) @@ -135,7 +316,7 @@ This package provides various compression algorithms.
    - See changes prior to v1.11.0 + See changes to v1.10.x * July 8, 2020 (v1.10.11) * zstd: Fix extra block when compressing with ReadFrom. [#278](https://github.com/klauspost/compress/pull/278) @@ -297,11 +478,6 @@ This package provides various compression algorithms. # deflate usage -* [High Throughput Benchmark](http://blog.klauspost.com/go-gzipdeflate-benchmarks/). -* [Small Payload/Webserver Benchmarks](http://blog.klauspost.com/gzip-performance-for-go-webservers/). -* [Linear Time Compression](http://blog.klauspost.com/constant-time-gzipzip-compression/). -* [Re-balancing Deflate Compression Levels](https://blog.klauspost.com/rebalancing-deflate-compression-levels/) - The packages are drop-in replacements for standard libraries. Simply replace the import path to use them: | old import | new import | Documentation @@ -323,6 +499,8 @@ Memory usage is typically 1MB for a Writer. stdlib is in the same range. If you expect to have a lot of concurrently allocated Writers consider using the stateless compress described below. +For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing). + # Stateless compression This package offers stateless compression as a special option for gzip/deflate. @@ -446,6 +624,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/tools/vendor/github.com/klauspost/compress/fse/compress.go b/tools/vendor/github.com/klauspost/compress/fse/compress.go index 6f341914c..dac97e58a 100644 --- a/tools/vendor/github.com/klauspost/compress/fse/compress.go +++ b/tools/vendor/github.com/klauspost/compress/fse/compress.go @@ -146,54 +146,51 @@ func (s *Scratch) compress(src []byte) error { c1.encodeZero(tt[src[ip-2]]) ip -= 2 } + src = src[:ip] // Main compression loop. switch { case !s.zeroBits && s.actualTableLog <= 8: // We can encode 4 symbols without requiring a flush. // We do not need to check if any output is 0 bits. - for ip >= 4 { + for ; len(src) >= 4; src = src[:len(src)-4] { s.bw.flush32() - v3, v2, v1, v0 := src[ip-4], src[ip-3], src[ip-2], src[ip-1] + v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] c2.encode(tt[v0]) c1.encode(tt[v1]) c2.encode(tt[v2]) c1.encode(tt[v3]) - ip -= 4 } case !s.zeroBits: // We do not need to check if any output is 0 bits. - for ip >= 4 { + for ; len(src) >= 4; src = src[:len(src)-4] { s.bw.flush32() - v3, v2, v1, v0 := src[ip-4], src[ip-3], src[ip-2], src[ip-1] + v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] c2.encode(tt[v0]) c1.encode(tt[v1]) s.bw.flush32() c2.encode(tt[v2]) c1.encode(tt[v3]) - ip -= 4 } case s.actualTableLog <= 8: // We can encode 4 symbols without requiring a flush - for ip >= 4 { + for ; len(src) >= 4; src = src[:len(src)-4] { s.bw.flush32() - v3, v2, v1, v0 := src[ip-4], src[ip-3], src[ip-2], src[ip-1] + v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] c2.encodeZero(tt[v0]) c1.encodeZero(tt[v1]) c2.encodeZero(tt[v2]) c1.encodeZero(tt[v3]) - ip -= 4 } default: - for ip >= 4 { + for ; len(src) >= 4; src = src[:len(src)-4] { s.bw.flush32() - v3, v2, v1, v0 := src[ip-4], src[ip-3], src[ip-2], src[ip-1] + v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] c2.encodeZero(tt[v0]) c1.encodeZero(tt[v1]) s.bw.flush32() c2.encodeZero(tt[v2]) c1.encodeZero(tt[v3]) - ip -= 4 } } @@ -459,15 +456,17 @@ func (s *Scratch) countSimple(in []byte) (max int) { for _, v := range in { s.count[v]++ } - m := uint32(0) + m, symlen := uint32(0), s.symbolLen for i, v := range s.count[:] { + if v == 0 { + continue + } if v > m { m = v } - if v > 0 { - s.symbolLen = uint16(i) + 1 - } + symlen = uint16(i) + 1 } + s.symbolLen = symlen return int(m) } diff --git a/tools/vendor/github.com/klauspost/compress/fse/decompress.go b/tools/vendor/github.com/klauspost/compress/fse/decompress.go index 926f5f153..cc05d0f7e 100644 --- a/tools/vendor/github.com/klauspost/compress/fse/decompress.go +++ b/tools/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/tools/vendor/github.com/klauspost/compress/huff0/bitreader.go b/tools/vendor/github.com/klauspost/compress/huff0/bitreader.go index a4979e886..e36d9742f 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/bitreader.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/bitreader.go @@ -8,115 +8,10 @@ package huff0 import ( "encoding/binary" "errors" + "fmt" "io" ) -// bitReader reads a bitstream in reverse. -// The last set bit indicates the start of the stream and is used -// for aligning the input. -type bitReader struct { - in []byte - off uint // next byte to read is at in[off - 1] - value uint64 - bitsRead uint8 -} - -// init initializes and resets the bit reader. -func (b *bitReader) init(in []byte) error { - if len(in) < 1 { - return errors.New("corrupt stream: too short") - } - b.in = in - b.off = uint(len(in)) - // The highest bit of the last byte indicates where to start - v := in[len(in)-1] - if v == 0 { - return errors.New("corrupt stream, did not find end of stream") - } - b.bitsRead = 64 - b.value = 0 - if len(in) >= 8 { - b.fillFastStart() - } else { - b.fill() - b.fill() - } - b.bitsRead += 8 - uint8(highBit32(uint32(v))) - return nil -} - -// peekBitsFast requires that at least one bit is requested every time. -// There are no checks if the buffer is filled. -func (b *bitReader) peekBitsFast(n uint8) uint16 { - const regMask = 64 - 1 - v := uint16((b.value << (b.bitsRead & regMask)) >> ((regMask + 1 - n) & regMask)) - return v -} - -// fillFast() will make sure at least 32 bits are available. -// There must be at least 4 bytes available. -func (b *bitReader) fillFast() { - if b.bitsRead < 32 { - return - } - - // 2 bounds checks. - v := b.in[b.off-4 : b.off] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 - b.off -= 4 -} - -func (b *bitReader) advance(n uint8) { - b.bitsRead += n -} - -// fillFastStart() assumes the bitreader is empty and there is at least 8 bytes to read. -func (b *bitReader) fillFastStart() { - // Do single re-slice to avoid bounds checks. - b.value = binary.LittleEndian.Uint64(b.in[b.off-8:]) - b.bitsRead = 0 - b.off -= 8 -} - -// fill() will make sure at least 32 bits are available. -func (b *bitReader) fill() { - if b.bitsRead < 32 { - return - } - if b.off > 4 { - v := b.in[b.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 - b.off -= 4 - return - } - for b.off > 0 { - b.value = (b.value << 8) | uint64(b.in[b.off-1]) - b.bitsRead -= 8 - b.off-- - } -} - -// finished returns true if all bits have been read from the bit stream. -func (b *bitReader) finished() bool { - return b.off == 0 && b.bitsRead >= 64 -} - -// close the bitstream and returns an error if out-of-buffer reads occurred. -func (b *bitReader) close() error { - // Release reference. - b.in = nil - if b.bitsRead > 64 { - return io.ErrUnexpectedEOF - } - return nil -} - // bitReader reads a bitstream in reverse. // The last set bit indicates the start of the stream and is used // for aligning the input. @@ -172,7 +67,6 @@ func (b *bitReaderBytes) fillFast() { // 2 bounds checks. v := b.in[b.off-4 : b.off] - v = v[:4] low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) b.value |= uint64(low) << (b.bitsRead - 32) b.bitsRead -= 32 @@ -193,8 +87,7 @@ func (b *bitReaderBytes) fill() { return } if b.off > 4 { - v := b.in[b.off-4:] - v = v[:4] + v := b.in[b.off-4 : b.off] low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) b.value |= uint64(low) << (b.bitsRead - 32) b.bitsRead -= 32 @@ -213,10 +106,17 @@ func (b *bitReaderBytes) finished() bool { return b.off == 0 && b.bitsRead >= 64 } +func (b *bitReaderBytes) remaining() uint { + return b.off*8 + uint(64-b.bitsRead) +} + // close the bitstream and returns an error if out-of-buffer reads occurred. func (b *bitReaderBytes) close() error { // Release reference. b.in = nil + if b.remaining() > 0 { + return fmt.Errorf("corrupt input: %d bits remain on stream", b.remaining()) + } if b.bitsRead > 64 { return io.ErrUnexpectedEOF } @@ -277,7 +177,6 @@ func (b *bitReaderShifted) fillFast() { // 2 bounds checks. v := b.in[b.off-4 : b.off] - v = v[:4] low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) b.value |= uint64(low) << ((b.bitsRead - 32) & 63) b.bitsRead -= 32 @@ -298,8 +197,7 @@ func (b *bitReaderShifted) fill() { return } if b.off > 4 { - v := b.in[b.off-4:] - v = v[:4] + v := b.in[b.off-4 : b.off] low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) b.value |= uint64(low) << ((b.bitsRead - 32) & 63) b.bitsRead -= 32 @@ -313,15 +211,17 @@ func (b *bitReaderShifted) fill() { } } -// finished returns true if all bits have been read from the bit stream. -func (b *bitReaderShifted) finished() bool { - return b.off == 0 && b.bitsRead >= 64 +func (b *bitReaderShifted) remaining() uint { + return b.off*8 + uint(64-b.bitsRead) } // close the bitstream and returns an error if out-of-buffer reads occurred. func (b *bitReaderShifted) close() error { // Release reference. b.in = nil + if b.remaining() > 0 { + return fmt.Errorf("corrupt input: %d bits remain on stream", b.remaining()) + } if b.bitsRead > 64 { return io.ErrUnexpectedEOF } diff --git a/tools/vendor/github.com/klauspost/compress/huff0/bitwriter.go b/tools/vendor/github.com/klauspost/compress/huff0/bitwriter.go index 6bce4e87d..aed2347ce 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/bitwriter.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/bitwriter.go @@ -5,8 +5,6 @@ package huff0 -import "fmt" - // bitWriter will write bits. // First bit will be LSB of the first byte of output. type bitWriter struct { @@ -23,14 +21,6 @@ var bitMask16 = [32]uint16{ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF} /* up to 16 bits */ -// addBits16NC will add up to 16 bits. -// It will not check if there is space for them, -// so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16NC(value uint16, bits uint8) { - b.bitContainer |= uint64(value&bitMask16[bits&31]) << (b.nBits & 63) - b.nBits += 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) { @@ -70,102 +60,20 @@ func (b *bitWriter) encTwoSymbols(ct cTable, av, bv byte) { b.nBits += encA.nBits + encB.nBits } -// addBits16ZeroNC will add up to 16 bits. +// 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 it has flushed recently. -// This is fastest if bits can be zero. -func (b *bitWriter) addBits16ZeroNC(value uint16, bits uint8) { - if bits == 0 { - return - } - value <<= (16 - bits) & 15 - value >>= (16 - bits) & 15 - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// flush will flush all pending full bytes. -// There will be at least 56 bits available for writing when this has been called. -// Using flush32 is faster, but leaves less space for writing. -func (b *bitWriter) flush() { - v := b.nBits >> 3 - switch v { - case 0: - return - case 1: - b.out = append(b.out, - byte(b.bitContainer), - ) - b.bitContainer >>= 1 << 3 - case 2: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - ) - b.bitContainer >>= 2 << 3 - case 3: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - ) - b.bitContainer >>= 3 << 3 - case 4: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - ) - b.bitContainer >>= 4 << 3 - case 5: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - ) - b.bitContainer >>= 5 << 3 - case 6: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - ) - b.bitContainer >>= 6 << 3 - case 7: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - ) - b.bitContainer >>= 7 << 3 - case 8: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - byte(b.bitContainer>>56), - ) - b.bitContainer = 0 - b.nBits = 0 - return - default: - panic(fmt.Errorf("bits (%d) > 64", b.nBits)) - } - b.nBits &= 7 +// 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. @@ -201,10 +109,3 @@ func (b *bitWriter) close() error { b.flushAlign() return nil } - -// reset and continue writing by appending to out. -func (b *bitWriter) reset(out []byte) { - b.bitContainer = 0 - b.nBits = 0 - b.out = out -} diff --git a/tools/vendor/github.com/klauspost/compress/huff0/bytereader.go b/tools/vendor/github.com/klauspost/compress/huff0/bytereader.go index 50bcdf6ea..4dcab8d23 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/bytereader.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/bytereader.go @@ -20,11 +20,6 @@ func (b *byteReader) init(in []byte) { b.off = 0 } -// advance the stream b n bytes. -func (b *byteReader) advance(n uint) { - b.off += int(n) -} - // Int32 returns a little endian int32 starting at current offset. func (b byteReader) Int32() int32 { v3 := int32(b.b[b.off+3]) @@ -43,11 +38,6 @@ func (b byteReader) Uint32() uint32 { return (v3 << 24) | (v2 << 16) | (v1 << 8) | v0 } -// unread returns the unread portion of the input. -func (b byteReader) unread() []byte { - return b.b[b.off:] -} - // remain will return the number of bytes remaining. func (b byteReader) remain() int { return len(b.b) - b.off diff --git a/tools/vendor/github.com/klauspost/compress/huff0/compress.go b/tools/vendor/github.com/klauspost/compress/huff0/compress.go index 8323dc053..4ee4fa18d 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/compress.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/compress.go @@ -2,6 +2,7 @@ package huff0 import ( "fmt" + "math" "runtime" "sync" ) @@ -247,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 { @@ -289,6 +289,10 @@ func (s *Scratch) compress4X(src []byte) ([]byte, error) { if err != nil { return nil, err } + if len(s.Out)-idx > math.MaxUint16 { + // We cannot store the size in the jump table + return nil, ErrIncompressible + } // Write compressed length as little endian before block. if i < 3 { // Last length is not written. @@ -332,6 +336,10 @@ func (s *Scratch) compress4Xp(src []byte) ([]byte, error) { return nil, errs[i] } o := s.tmpOut[i] + if len(o) > math.MaxUint16 { + // We cannot store the size in the jump table + return nil, ErrIncompressible + } // Write compressed length as little endian before block. if i < 3 { // Last length is not written. @@ -356,29 +364,29 @@ func (s *Scratch) countSimple(in []byte) (max int, reuse bool) { m := uint32(0) if len(s.prevTable) > 0 { for i, v := range s.count[:] { + if v == 0 { + continue + } if v > m { m = v } - if v > 0 { - s.symbolLen = uint16(i) + 1 - if i >= len(s.prevTable) { - reuse = false - } else { - if s.prevTable[i].nBits == 0 { - reuse = false - } - } + s.symbolLen = uint16(i) + 1 + if i >= len(s.prevTable) { + reuse = false + } else if s.prevTable[i].nBits == 0 { + reuse = false } } return int(m), reuse } for i, v := range s.count[:] { + if v == 0 { + continue + } if v > m { m = v } - if v > 0 { - s.symbolLen = uint16(i) + 1 - } + s.symbolLen = uint16(i) + 1 } return int(m), false } @@ -395,6 +403,7 @@ func (s *Scratch) canUseTable(c cTable) bool { return true } +//lint:ignore U1000 used for debugging func (s *Scratch) validateTable(c cTable) bool { if len(c) < int(s.symbolLen) { return false @@ -474,34 +483,35 @@ func (s *Scratch) buildCTable() error { // Different from reference implementation. huffNode0 := s.nodes[0 : huffNodesLen+1] - for huffNode[nonNullRank].count == 0 { + for huffNode[nonNullRank].count() == 0 { nonNullRank-- } lowS := int16(nonNullRank) nodeRoot := nodeNb + lowS - 1 lowN := nodeNb - huffNode[nodeNb].count = huffNode[lowS].count + huffNode[lowS-1].count - huffNode[lowS].parent, huffNode[lowS-1].parent = uint16(nodeNb), uint16(nodeNb) + huffNode[nodeNb].setCount(huffNode[lowS].count() + huffNode[lowS-1].count()) + huffNode[lowS].setParent(nodeNb) + huffNode[lowS-1].setParent(nodeNb) nodeNb++ lowS -= 2 for n := nodeNb; n <= nodeRoot; n++ { - huffNode[n].count = 1 << 30 + huffNode[n].setCount(1 << 30) } // fake entry, strong barrier - huffNode0[0].count = 1 << 31 + huffNode0[0].setCount(1 << 31) // create parents for nodeNb <= nodeRoot { var n1, n2 int16 - if huffNode0[lowS+1].count < huffNode0[lowN+1].count { + if huffNode0[lowS+1].count() < huffNode0[lowN+1].count() { n1 = lowS lowS-- } else { n1 = lowN lowN++ } - if huffNode0[lowS+1].count < huffNode0[lowN+1].count { + if huffNode0[lowS+1].count() < huffNode0[lowN+1].count() { n2 = lowS lowS-- } else { @@ -509,18 +519,19 @@ func (s *Scratch) buildCTable() error { lowN++ } - huffNode[nodeNb].count = huffNode0[n1+1].count + huffNode0[n2+1].count - huffNode0[n1+1].parent, huffNode0[n2+1].parent = uint16(nodeNb), uint16(nodeNb) + huffNode[nodeNb].setCount(huffNode0[n1+1].count() + huffNode0[n2+1].count()) + huffNode0[n1+1].setParent(nodeNb) + huffNode0[n2+1].setParent(nodeNb) nodeNb++ } // distribute weights (unlimited tree height) - huffNode[nodeRoot].nbBits = 0 + huffNode[nodeRoot].setNbBits(0) for n := nodeRoot - 1; n >= startNode; n-- { - huffNode[n].nbBits = huffNode[huffNode[n].parent].nbBits + 1 + huffNode[n].setNbBits(huffNode[huffNode[n].parent()].nbBits() + 1) } for n := uint16(0); n <= nonNullRank; n++ { - huffNode[n].nbBits = huffNode[huffNode[n].parent].nbBits + 1 + huffNode[n].setNbBits(huffNode[huffNode[n].parent()].nbBits() + 1) } s.actualTableLog = s.setMaxHeight(int(nonNullRank)) maxNbBits := s.actualTableLog @@ -532,7 +543,7 @@ func (s *Scratch) buildCTable() error { var nbPerRank [tableLogMax + 1]uint16 var valPerRank [16]uint16 for _, v := range huffNode[:nonNullRank+1] { - nbPerRank[v.nbBits]++ + nbPerRank[v.nbBits()]++ } // determine stating value per rank { @@ -547,7 +558,7 @@ func (s *Scratch) buildCTable() error { // push nbBits per symbol, symbol order for _, v := range huffNode[:nonNullRank+1] { - s.cTable[v.symbol].nBits = v.nbBits + s.cTable[v.symbol()].nBits = v.nbBits() } // assign value within rank, symbol order @@ -593,12 +604,12 @@ func (s *Scratch) huffSort() { pos := rank[r].current rank[r].current++ prev := nodes[(pos-1)&huffNodesMask] - for pos > rank[r].base && c > prev.count { + for pos > rank[r].base && c > prev.count() { nodes[pos&huffNodesMask] = prev pos-- prev = nodes[(pos-1)&huffNodesMask] } - nodes[pos&huffNodesMask] = nodeElt{count: c, symbol: byte(n)} + nodes[pos&huffNodesMask] = makeNodeElt(c, byte(n)) } } @@ -607,7 +618,7 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { huffNode := s.nodes[1 : huffNodesLen+1] //huffNode = huffNode[: huffNodesLen] - largestBits := huffNode[lastNonNull].nbBits + largestBits := huffNode[lastNonNull].nbBits() // early exit : no elt > maxNbBits if largestBits <= maxNbBits { @@ -617,14 +628,14 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { baseCost := int(1) << (largestBits - maxNbBits) n := uint32(lastNonNull) - for huffNode[n].nbBits > maxNbBits { - totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits)) - huffNode[n].nbBits = maxNbBits + for huffNode[n].nbBits() > maxNbBits { + totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits())) + huffNode[n].setNbBits(maxNbBits) n-- } // n stops at huffNode[n].nbBits <= maxNbBits - for huffNode[n].nbBits == maxNbBits { + for huffNode[n].nbBits() == maxNbBits { n-- } // n end at index of smallest symbol using < maxNbBits @@ -645,10 +656,10 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { { currentNbBits := maxNbBits for pos := int(n); pos >= 0; pos-- { - if huffNode[pos].nbBits >= currentNbBits { + if huffNode[pos].nbBits() >= currentNbBits { continue } - currentNbBits = huffNode[pos].nbBits // < maxNbBits + currentNbBits = huffNode[pos].nbBits() // < maxNbBits rankLast[maxNbBits-currentNbBits] = uint32(pos) } } @@ -665,8 +676,8 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { if lowPos == noSymbol { break } - highTotal := huffNode[highPos].count - lowTotal := 2 * huffNode[lowPos].count + highTotal := huffNode[highPos].count() + lowTotal := 2 * huffNode[lowPos].count() if highTotal <= lowTotal { break } @@ -682,13 +693,14 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { // this rank is no longer empty rankLast[nBitsToDecrease-1] = rankLast[nBitsToDecrease] } - huffNode[rankLast[nBitsToDecrease]].nbBits++ + huffNode[rankLast[nBitsToDecrease]].setNbBits(1 + + huffNode[rankLast[nBitsToDecrease]].nbBits()) if rankLast[nBitsToDecrease] == 0 { /* special case, reached largest symbol */ rankLast[nBitsToDecrease] = noSymbol } else { rankLast[nBitsToDecrease]-- - if huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits-nBitsToDecrease { + if huffNode[rankLast[nBitsToDecrease]].nbBits() != maxNbBits-nBitsToDecrease { rankLast[nBitsToDecrease] = noSymbol /* this rank is now empty */ } } @@ -696,15 +708,15 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { for totalCost < 0 { /* Sometimes, cost correction overshoot */ if rankLast[1] == noSymbol { /* special case : no rank 1 symbol (using maxNbBits-1); let's create one from largest rank 0 (using maxNbBits) */ - for huffNode[n].nbBits == maxNbBits { + for huffNode[n].nbBits() == maxNbBits { n-- } - huffNode[n+1].nbBits-- + huffNode[n+1].setNbBits(huffNode[n+1].nbBits() - 1) rankLast[1] = n + 1 totalCost++ continue } - huffNode[rankLast[1]+1].nbBits-- + huffNode[rankLast[1]+1].setNbBits(huffNode[rankLast[1]+1].nbBits() - 1) rankLast[1]++ totalCost++ } @@ -712,9 +724,26 @@ func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { return maxNbBits } -type nodeElt struct { - count uint32 - parent uint16 - symbol byte - nbBits uint8 +// A nodeElt is the fields +// +// count uint32 +// parent uint16 +// symbol byte +// nbBits uint8 +// +// in some order, all squashed into an integer so that the compiler +// always loads and stores entire nodeElts instead of separate fields. +type nodeElt uint64 + +func makeNodeElt(count uint32, symbol byte) nodeElt { + return nodeElt(count) | nodeElt(symbol)<<48 } + +func (e *nodeElt) count() uint32 { return uint32(*e) } +func (e *nodeElt) parent() uint16 { return uint16(*e >> 32) } +func (e *nodeElt) symbol() byte { return byte(*e >> 48) } +func (e *nodeElt) nbBits() uint8 { return uint8(*e >> 56) } + +func (e *nodeElt) setCount(c uint32) { *e = (*e)&0xffffffff00000000 | nodeElt(c) } +func (e *nodeElt) setParent(p int16) { *e = (*e)&0xffff0000ffffffff | nodeElt(uint16(p))<<32 } +func (e *nodeElt) setNbBits(n uint8) { *e = (*e)&0x00ffffffffffffff | nodeElt(n)<<56 } diff --git a/tools/vendor/github.com/klauspost/compress/huff0/decompress.go b/tools/vendor/github.com/klauspost/compress/huff0/decompress.go index 2a06bd1a7..3c0b398c7 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/decompress.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/decompress.go @@ -4,13 +4,13 @@ import ( "errors" "fmt" "io" + "sync" "github.com/klauspost/compress/fse" ) type dTable struct { single []dEntrySingle - double []dEntryDouble } // single-symbols decoding @@ -18,13 +18,6 @@ type dEntrySingle struct { entry uint16 } -// double-symbols decoding -type dEntryDouble struct { - seq [4]byte - nBits uint8 - len uint8 -} - // Uses special code for all tables that are < 8 bits. const use8BitTables = true @@ -34,7 +27,7 @@ const use8BitTables = true // If no Scratch is provided a new one is allocated. // The returned Scratch can be used for encoding or decoding input using this table. func ReadTable(in []byte, s *Scratch) (s2 *Scratch, remain []byte, err error) { - s, err = s.prepare(in) + s, err = s.prepare(nil) if err != nil { return s, nil, err } @@ -68,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") @@ -216,6 +209,7 @@ func (s *Scratch) Decoder() *Decoder { return &Decoder{ dt: s.dt, actualTableLog: s.actualTableLog, + bufs: &s.decPool, } } @@ -223,103 +217,15 @@ func (s *Scratch) Decoder() *Decoder { type Decoder struct { dt dTable actualTableLog uint8 + bufs *sync.Pool } -// Decompress1X will decompress a 1X encoded stream. -// The cap of the output buffer will be the maximum decompressed size. -// The length of the supplied input must match the end of a block exactly. -func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - if use8BitTables && d.actualTableLog <= 8 { - return d.decompress1X8Bit(dst, src) - } - var br bitReaderShifted - err := br.init(src) - if err != nil { - return dst, err - } - maxDecodedSize := cap(dst) - dst = dst[:0] - - // Avoid bounds check by always having full sized table. - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - dt := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - var buf [256]byte - var off uint8 - - for br.off >= 8 { - br.fillFast() - v := dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - // Refill - br.fillFast() - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - - if len(dst)+int(off) > maxDecodedSize { - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:off]...) - - // br < 8, so uint8 is fine - bitsLeft := uint8(br.off)*8 + 64 - br.bitsRead - for bitsLeft > 0 { - br.fill() - if false && br.bitsRead >= 32 { - if br.off >= 4 { - v := br.in[br.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - br.value = (br.value << 32) | uint64(low) - br.bitsRead -= 32 - br.off -= 4 - } else { - for br.off > 0 { - br.value = (br.value << 8) | uint64(br.in[br.off-1]) - br.bitsRead -= 8 - br.off-- - } - } - } - if len(dst) >= maxDecodedSize { - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - v := d.dt.single[br.peekBitsFast(d.actualTableLog)&tlMask] - nBits := uint8(v.entry) - br.advance(nBits) - bitsLeft -= nBits - dst = append(dst, uint8(v.entry>>8)) +func (d *Decoder) buffer() *[4][256]byte { + buf, ok := d.bufs.Get().(*[4][256]byte) + if ok { + return buf } - return dst, br.close() + return &[4][256]byte{} } // decompress1X8Bit will decompress a 1X encoded stream with tablelog <= 8. @@ -341,7 +247,8 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { dt := d.dt.single[:256] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + bufs := d.buffer() + buf := &bufs[0] var off uint8 switch d.actualTableLog { @@ -369,6 +276,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { if off == 0 { if len(dst)+256 > maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } dst = append(dst, buf[:]...) @@ -398,6 +306,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { if off == 0 { if len(dst)+256 > maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } dst = append(dst, buf[:]...) @@ -426,6 +335,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -455,6 +365,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -484,6 +395,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -513,6 +425,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -542,6 +455,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -571,6 +485,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -578,10 +493,12 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { } } default: + d.bufs.Put(bufs) return nil, fmt.Errorf("invalid tablelog: %d", d.actualTableLog) } if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -601,6 +518,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { } if len(dst) >= maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } v := dt[br.peekByteFast()>>shift] @@ -609,6 +527,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { bitsLeft -= int8(nBits) dst = append(dst, uint8(v.entry>>8)) } + d.bufs.Put(bufs) return dst, br.close() } @@ -628,7 +547,8 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { dt := d.dt.single[:256] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + bufs := d.buffer() + buf := &bufs[0] var off uint8 const shift = 56 @@ -655,6 +575,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -663,6 +584,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { } if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -679,6 +601,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { } } if len(dst) >= maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -688,195 +611,10 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { bitsLeft -= int8(nBits) dst = append(dst, uint8(v.entry>>8)) } + d.bufs.Put(bufs) return dst, br.close() } -// Decompress4X will decompress a 4X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// The *capacity* of the dst slice must match the destination size of -// the uncompressed data exactly. -func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - if len(src) < 6+(4*1) { - return nil, errors.New("input too small") - } - if use8BitTables && d.actualTableLog <= 8 { - return d.decompress4X8bit(dst, src) - } - - var br [4]bitReaderShifted - start := 6 - for i := 0; i < 3; i++ { - length := int(src[i*2]) | (int(src[i*2+1]) << 8) - if start+length >= len(src) { - return nil, errors.New("truncated input (or invalid offset)") - } - err := br[i].init(src[start : start+length]) - if err != nil { - return nil, err - } - start += length - } - err := br[3].init(src[start:]) - if err != nil { - return nil, err - } - - // destination, offset to match first output - dstSize := cap(dst) - dst = dst[:dstSize] - out := dst - dstEvery := (dstSize + 3) / 4 - - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - single := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - var buf [256]byte - var off uint8 - var decoded int - - // Decode 2 values from each decoder/loop. - const bufoff = 256 / 4 - for { - if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { - break - } - - { - const stream = 0 - const stream2 = 1 - br[stream].fillFast() - br[stream2].fillFast() - - val := br[stream].peekBitsFast(d.actualTableLog) - val2 := br[stream2].peekBitsFast(d.actualTableLog) - v := single[val&tlMask] - v2 := single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream] = uint8(v.entry >> 8) - buf[off+bufoff*stream2] = uint8(v2.entry >> 8) - - val = br[stream].peekBitsFast(d.actualTableLog) - val2 = br[stream2].peekBitsFast(d.actualTableLog) - v = single[val&tlMask] - v2 = single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream+1] = uint8(v.entry >> 8) - buf[off+bufoff*stream2+1] = uint8(v2.entry >> 8) - } - - { - const stream = 2 - const stream2 = 3 - br[stream].fillFast() - br[stream2].fillFast() - - val := br[stream].peekBitsFast(d.actualTableLog) - val2 := br[stream2].peekBitsFast(d.actualTableLog) - v := single[val&tlMask] - v2 := single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream] = uint8(v.entry >> 8) - buf[off+bufoff*stream2] = uint8(v2.entry >> 8) - - val = br[stream].peekBitsFast(d.actualTableLog) - val2 = br[stream2].peekBitsFast(d.actualTableLog) - v = single[val&tlMask] - v2 = single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream+1] = uint8(v.entry >> 8) - buf[off+bufoff*stream2+1] = uint8(v2.entry >> 8) - } - - off += 2 - - if off == bufoff { - if bufoff > dstEvery { - return nil, errors.New("corruption detected: stream overrun 1") - } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 - out = out[bufoff:] - decoded += 256 - // There must at least be 3 buffers left. - if len(out) < dstEvery*3 { - return nil, errors.New("corruption detected: stream overrun 2") - } - } - } - if off > 0 { - ioff := int(off) - if len(out) < dstEvery*3+ioff { - return nil, errors.New("corruption detected: stream overrun 3") - } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) - decoded += int(off) * 4 - out = out[off:] - } - - // Decode remaining. - for i := range br { - offset := dstEvery * i - br := &br[i] - bitsLeft := br.off*8 + uint(64-br.bitsRead) - for bitsLeft > 0 { - br.fill() - if false && br.bitsRead >= 32 { - if br.off >= 4 { - v := br.in[br.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - br.value = (br.value << 32) | uint64(low) - br.bitsRead -= 32 - br.off -= 4 - } else { - for br.off > 0 { - br.value = (br.value << 8) | uint64(br.in[br.off-1]) - br.bitsRead -= 8 - br.off-- - } - } - } - // end inline... - if offset >= len(out) { - return nil, errors.New("corruption detected: stream overrun 4") - } - - // Read value and increment offset. - val := br.peekBitsFast(d.actualTableLog) - v := single[val&tlMask].entry - nBits := uint8(v) - br.advance(nBits) - bitsLeft -= uint(nBits) - out[offset] = uint8(v >> 8) - offset++ - } - decoded += offset - dstEvery*i - err = br.close() - if err != nil { - return nil, err - } - } - if dstSize != decoded { - return nil, errors.New("corruption detected: short output block") - } - return dst, nil -} - // Decompress4X will decompress a 4X encoded stream. // The length of the supplied input must match the end of a block exactly. // The *capacity* of the dst slice must match the destination size of @@ -916,12 +654,12 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { single := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + buf := d.buffer() var off uint8 var decoded int // Decode 4 values from each decoder/loop. - const bufoff = 256 / 4 + const bufoff = 256 for { if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { break @@ -942,8 +680,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -951,8 +689,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -960,8 +698,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -969,8 +707,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) - buf[off+bufoff*stream+3] = uint8(v >> 8) + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } { @@ -987,8 +725,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -996,8 +734,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -1005,8 +743,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -1014,49 +752,61 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) - buf[off+bufoff*stream+3] = uint8(v >> 8) + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } off += 4 - if off == bufoff { + if off == 0 { if bufoff > dstEvery { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 1") } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 - out = out[bufoff:] - decoded += 256 // There must at least be 3 buffers left. - if len(out) < dstEvery*3 { + if len(out)-bufoff < dstEvery*3 { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 2") } + //copy(out, buf[0][:]) + //copy(out[dstEvery:], buf[1][:]) + //copy(out[dstEvery*2:], buf[2][:]) + *(*[bufoff]byte)(out) = buf[0] + *(*[bufoff]byte)(out[dstEvery:]) = buf[1] + *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] + *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] + out = out[bufoff:] + decoded += bufoff * 4 } } if off > 0 { ioff := int(off) if len(out) < dstEvery*3+ioff { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 3") } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) decoded += int(off) * 4 out = out[off:] } // Decode remaining. + // Decode remaining. + remainBytes := dstEvery - (decoded / 4) for i := range br { offset := dstEvery * i + endsAt := offset + remainBytes + if endsAt > len(out) { + endsAt = len(out) + } br := &br[i] - bitsLeft := int(br.off*8) + int(64-br.bitsRead) + bitsLeft := br.remaining() for bitsLeft > 0 { if br.finished() { + d.bufs.Put(buf) return nil, io.ErrUnexpectedEOF } if br.bitsRead >= 56 { @@ -1076,7 +826,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { } } // end inline... - if offset >= len(out) { + if offset >= endsAt { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 4") } @@ -1084,16 +835,22 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { v := single[uint8(br.value>>shift)].entry nBits := uint8(v) br.advance(nBits) - bitsLeft -= int(nBits) + bitsLeft -= uint(nBits) out[offset] = uint8(v >> 8) offset++ } + if offset != endsAt { + d.bufs.Put(buf) + return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) + } decoded += offset - dstEvery*i err = br.close() if err != nil { + d.bufs.Put(buf) return nil, err } } + d.bufs.Put(buf) if dstSize != decoded { return nil, errors.New("corruption detected: short output block") } @@ -1131,16 +888,15 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { const shift = 56 const tlSize = 1 << 8 - const tlMask = tlSize - 1 single := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + buf := d.buffer() var off uint8 var decoded int // Decode 4 values from each decoder/loop. - const bufoff = 256 / 4 + const bufoff = 256 for { if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { break @@ -1150,106 +906,116 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { // Interleave 2 decodes. const stream = 0 const stream2 = 1 - br[stream].fillFast() - br[stream2].fillFast() - - v := single[uint8(br[stream].value>>shift)].entry - v2 := single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+3] = uint8(v >> 8) - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) + br1 := &br[stream] + br2 := &br[stream2] + br1.fillFast() + br2.fillFast() + + v := single[uint8(br1.value>>shift)].entry + v2 := single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } { const stream = 2 const stream2 = 3 - br[stream].fillFast() - br[stream2].fillFast() - - v := single[uint8(br[stream].value>>shift)].entry - v2 := single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+3] = uint8(v >> 8) - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) + br1 := &br[stream] + br2 := &br[stream2] + br1.fillFast() + br2.fillFast() + + v := single[uint8(br1.value>>shift)].entry + v2 := single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } off += 4 - if off == bufoff { + if off == 0 { if bufoff > dstEvery { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 1") } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 - out = out[bufoff:] - decoded += 256 // There must at least be 3 buffers left. - if len(out) < dstEvery*3 { + if len(out)-bufoff < dstEvery*3 { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 2") } + + //copy(out, buf[0][:]) + //copy(out[dstEvery:], buf[1][:]) + //copy(out[dstEvery*2:], buf[2][:]) + // copy(out[dstEvery*3:], buf[3][:]) + *(*[bufoff]byte)(out) = buf[0] + *(*[bufoff]byte)(out[dstEvery:]) = buf[1] + *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] + *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] + out = out[bufoff:] + decoded += bufoff * 4 } } if off > 0 { @@ -1257,21 +1023,27 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { if len(out) < dstEvery*3+ioff { return nil, errors.New("corruption detected: stream overrun 3") } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) decoded += int(off) * 4 out = out[off:] } // Decode remaining. + remainBytes := dstEvery - (decoded / 4) for i := range br { offset := dstEvery * i + endsAt := offset + remainBytes + if endsAt > len(out) { + endsAt = len(out) + } br := &br[i] - bitsLeft := int(br.off*8) + int(64-br.bitsRead) + bitsLeft := br.remaining() for bitsLeft > 0 { if br.finished() { + d.bufs.Put(buf) return nil, io.ErrUnexpectedEOF } if br.bitsRead >= 56 { @@ -1291,7 +1063,8 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { } } // end inline... - if offset >= len(out) { + if offset >= endsAt { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 4") } @@ -1299,16 +1072,23 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { v := single[br.peekByteFast()].entry nBits := uint8(v) br.advance(nBits) - bitsLeft -= int(nBits) + bitsLeft -= uint(nBits) out[offset] = uint8(v >> 8) offset++ } + if offset != endsAt { + d.bufs.Put(buf) + return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) + } + decoded += offset - dstEvery*i err = br.close() if err != nil { + d.bufs.Put(buf) return nil, err } } + d.bufs.Put(buf) if dstSize != decoded { return nil, errors.New("corruption detected: short output block") } diff --git a/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go b/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go new file mode 100644 index 000000000..ba7e8e6b0 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go @@ -0,0 +1,226 @@ +//go:build amd64 && !appengine && !noasm && gc +// +build amd64,!appengine,!noasm,gc + +// This file contains the specialisation of Decoder.Decompress4X +// and Decoder.Decompress1X that use an asm implementation of thir main loops. +package huff0 + +import ( + "errors" + "fmt" + + "github.com/klauspost/compress/internal/cpuinfo" +) + +// decompress4x_main_loop_x86 is an x86 assembler implementation +// of Decompress4X when tablelog > 8. +// +//go:noescape +func decompress4x_main_loop_amd64(ctx *decompress4xContext) + +// decompress4x_8b_loop_x86 is an x86 assembler implementation +// of Decompress4X when tablelog <= 8 which decodes 4 entries +// per loop. +// +//go:noescape +func decompress4x_8b_main_loop_amd64(ctx *decompress4xContext) + +// fallback8BitSize is the size where using Go version is faster. +const fallback8BitSize = 800 + +type decompress4xContext struct { + pbr *[4]bitReaderShifted + peekBits uint8 + out *byte + dstEvery int + tbl *dEntrySingle + decoded int + limit *byte +} + +// Decompress4X will decompress a 4X encoded stream. +// The length of the supplied input must match the end of a block exactly. +// The *capacity* of the dst slice must match the destination size of +// the uncompressed data exactly. +func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { + if len(d.dt.single) == 0 { + return nil, errors.New("no table loaded") + } + if len(src) < 6+(4*1) { + return nil, errors.New("input too small") + } + + use8BitTables := d.actualTableLog <= 8 + if cap(dst) < fallback8BitSize && use8BitTables { + return d.decompress4X8bit(dst, src) + } + + var br [4]bitReaderShifted + // Decode "jump table" + start := 6 + for i := 0; i < 3; i++ { + length := int(src[i*2]) | (int(src[i*2+1]) << 8) + if start+length >= len(src) { + return nil, errors.New("truncated input (or invalid offset)") + } + err := br[i].init(src[start : start+length]) + if err != nil { + return nil, err + } + start += length + } + err := br[3].init(src[start:]) + if err != nil { + return nil, err + } + + // destination, offset to match first output + dstSize := cap(dst) + dst = dst[:dstSize] + out := dst + dstEvery := (dstSize + 3) / 4 + + const tlSize = 1 << tableLogMax + const tlMask = tlSize - 1 + single := d.dt.single[:tlSize] + + var decoded int + + if len(out) > 4*4 && !(br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4) { + ctx := decompress4xContext{ + pbr: &br, + peekBits: uint8((64 - d.actualTableLog) & 63), // see: bitReaderShifted.peekBitsFast() + out: &out[0], + dstEvery: dstEvery, + tbl: &single[0], + limit: &out[dstEvery-4], // Always stop decoding when first buffer gets here to avoid writing OOB on last. + } + if use8BitTables { + decompress4x_8b_main_loop_amd64(&ctx) + } else { + decompress4x_main_loop_amd64(&ctx) + } + + decoded = ctx.decoded + out = out[decoded/4:] + } + + // Decode remaining. + remainBytes := dstEvery - (decoded / 4) + for i := range br { + offset := dstEvery * i + endsAt := offset + remainBytes + if endsAt > len(out) { + endsAt = len(out) + } + br := &br[i] + bitsLeft := br.remaining() + for bitsLeft > 0 { + br.fill() + if offset >= endsAt { + return nil, errors.New("corruption detected: stream overrun 4") + } + + // Read value and increment offset. + val := br.peekBitsFast(d.actualTableLog) + v := single[val&tlMask].entry + nBits := uint8(v) + br.advance(nBits) + bitsLeft -= uint(nBits) + out[offset] = uint8(v >> 8) + offset++ + } + if offset != endsAt { + return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) + } + decoded += offset - dstEvery*i + err = br.close() + if err != nil { + return nil, err + } + } + if dstSize != decoded { + return nil, errors.New("corruption detected: short output block") + } + return dst, nil +} + +// decompress4x_main_loop_x86 is an x86 assembler implementation +// of Decompress1X when tablelog > 8. +// +//go:noescape +func decompress1x_main_loop_amd64(ctx *decompress1xContext) + +// decompress4x_main_loop_x86 is an x86 with BMI2 assembler implementation +// of Decompress1X when tablelog > 8. +// +//go:noescape +func decompress1x_main_loop_bmi2(ctx *decompress1xContext) + +type decompress1xContext struct { + pbr *bitReaderShifted + peekBits uint8 + out *byte + outCap int + tbl *dEntrySingle + decoded int +} + +// Error reported by asm implementations +const error_max_decoded_size_exeeded = -1 + +// Decompress1X will decompress a 1X encoded stream. +// The cap of the output buffer will be the maximum decompressed size. +// The length of the supplied input must match the end of a block exactly. +func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { + if len(d.dt.single) == 0 { + return nil, errors.New("no table loaded") + } + var br bitReaderShifted + err := br.init(src) + if err != nil { + return dst, err + } + maxDecodedSize := cap(dst) + dst = dst[:maxDecodedSize] + + const tlSize = 1 << tableLogMax + const tlMask = tlSize - 1 + + if maxDecodedSize >= 4 { + ctx := decompress1xContext{ + pbr: &br, + out: &dst[0], + outCap: maxDecodedSize, + peekBits: uint8((64 - d.actualTableLog) & 63), // see: bitReaderShifted.peekBitsFast() + tbl: &d.dt.single[0], + } + + if cpuinfo.HasBMI2() { + decompress1x_main_loop_bmi2(&ctx) + } else { + decompress1x_main_loop_amd64(&ctx) + } + if ctx.decoded == error_max_decoded_size_exeeded { + return nil, ErrMaxDecodedSizeExceeded + } + + dst = dst[:ctx.decoded] + } + + // br < 8, so uint8 is fine + bitsLeft := uint8(br.off)*8 + 64 - br.bitsRead + for bitsLeft > 0 { + br.fill() + if len(dst) >= maxDecodedSize { + br.close() + return nil, ErrMaxDecodedSizeExceeded + } + v := d.dt.single[br.peekBitsFast(d.actualTableLog)&tlMask] + nBits := uint8(v.entry) + br.advance(nBits) + bitsLeft -= nBits + dst = append(dst, uint8(v.entry>>8)) + } + return dst, br.close() +} diff --git a/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s b/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s new file mode 100644 index 000000000..c4c7ab2d1 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s @@ -0,0 +1,830 @@ +// Code generated by command: go run gen.go -out ../decompress_amd64.s -pkg=huff0. DO NOT EDIT. + +//go:build amd64 && !appengine && !noasm && gc + +// func decompress4x_main_loop_amd64(ctx *decompress4xContext) +TEXT ·decompress4x_main_loop_amd64(SB), $0-8 + // Preload values + MOVQ ctx+0(FP), AX + MOVBQZX 8(AX), DI + MOVQ 16(AX), BX + MOVQ 48(AX), SI + MOVQ 24(AX), R8 + MOVQ 32(AX), R9 + MOVQ (AX), R10 + + // Main loop +main_loop: + XORL DX, DX + CMPQ BX, SI + SETGE DL + + // br0.fillFast32() + MOVQ 32(R10), R11 + MOVBQZX 40(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill0 + MOVQ 24(R10), AX + SUBQ $0x20, R12 + SUBQ $0x04, AX + MOVQ (R10), R13 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (AX)(R13*1), R13 + MOVQ R12, CX + SHLQ CL, R13 + MOVQ AX, 24(R10) + ORQ R13, R11 + + // exhausted += (br0.off < 4) + CMPQ AX, $0x04 + ADCB $+0, DL + +skip_fill0: + // val0 := br0.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br0.peekTopBits(peekBits) + MOVQ DI, CX + MOVQ R11, R13 + SHRQ CL, R13 + + // v1 := table[val1&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v1.entry)) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // these two writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + MOVW AX, (BX) + + // update the bitreader structure + MOVQ R11, 32(R10) + MOVB R12, 40(R10) + + // br1.fillFast32() + MOVQ 80(R10), R11 + MOVBQZX 88(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill1 + MOVQ 72(R10), AX + SUBQ $0x20, R12 + SUBQ $0x04, AX + MOVQ 48(R10), R13 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (AX)(R13*1), R13 + MOVQ R12, CX + SHLQ CL, R13 + MOVQ AX, 72(R10) + ORQ R13, R11 + + // exhausted += (br1.off < 4) + CMPQ AX, $0x04 + ADCB $+0, DL + +skip_fill1: + // val0 := br1.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br1.peekTopBits(peekBits) + MOVQ DI, CX + MOVQ R11, R13 + SHRQ CL, R13 + + // v1 := table[val1&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v1.entry)) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // these two writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + MOVW AX, (BX)(R8*1) + + // update the bitreader structure + MOVQ R11, 80(R10) + MOVB R12, 88(R10) + + // br2.fillFast32() + MOVQ 128(R10), R11 + MOVBQZX 136(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill2 + MOVQ 120(R10), AX + SUBQ $0x20, R12 + SUBQ $0x04, AX + MOVQ 96(R10), R13 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (AX)(R13*1), R13 + MOVQ R12, CX + SHLQ CL, R13 + MOVQ AX, 120(R10) + ORQ R13, R11 + + // exhausted += (br2.off < 4) + CMPQ AX, $0x04 + ADCB $+0, DL + +skip_fill2: + // val0 := br2.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br2.peekTopBits(peekBits) + MOVQ DI, CX + MOVQ R11, R13 + SHRQ CL, R13 + + // v1 := table[val1&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v1.entry)) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // these two writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + MOVW AX, (BX)(R8*2) + + // update the bitreader structure + MOVQ R11, 128(R10) + MOVB R12, 136(R10) + + // br3.fillFast32() + MOVQ 176(R10), R11 + MOVBQZX 184(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill3 + MOVQ 168(R10), AX + SUBQ $0x20, R12 + SUBQ $0x04, AX + MOVQ 144(R10), R13 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (AX)(R13*1), R13 + MOVQ R12, CX + SHLQ CL, R13 + MOVQ AX, 168(R10) + ORQ R13, R11 + + // exhausted += (br3.off < 4) + CMPQ AX, $0x04 + ADCB $+0, DL + +skip_fill3: + // val0 := br3.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br3.peekTopBits(peekBits) + MOVQ DI, CX + MOVQ R11, R13 + SHRQ CL, R13 + + // v1 := table[val1&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v1.entry)) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // these two writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + LEAQ (R8)(R8*2), CX + MOVW AX, (BX)(CX*1) + + // update the bitreader structure + MOVQ R11, 176(R10) + MOVB R12, 184(R10) + ADDQ $0x02, BX + TESTB DL, DL + JZ main_loop + MOVQ ctx+0(FP), AX + SUBQ 16(AX), BX + SHLQ $0x02, BX + MOVQ BX, 40(AX) + RET + +// func decompress4x_8b_main_loop_amd64(ctx *decompress4xContext) +TEXT ·decompress4x_8b_main_loop_amd64(SB), $0-8 + // Preload values + MOVQ ctx+0(FP), CX + MOVBQZX 8(CX), DI + MOVQ 16(CX), BX + MOVQ 48(CX), SI + MOVQ 24(CX), R8 + MOVQ 32(CX), R9 + MOVQ (CX), R10 + + // Main loop +main_loop: + XORL DX, DX + CMPQ BX, SI + SETGE DL + + // br0.fillFast32() + MOVQ 32(R10), R11 + MOVBQZX 40(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill0 + MOVQ 24(R10), R13 + SUBQ $0x20, R12 + SUBQ $0x04, R13 + MOVQ (R10), R14 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (R13)(R14*1), R14 + MOVQ R12, CX + SHLQ CL, R14 + MOVQ R13, 24(R10) + ORQ R14, R11 + + // exhausted += (br0.off < 4) + CMPQ R13, $0x04 + ADCB $+0, DL + +skip_fill0: + // val0 := br0.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br0.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v1 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v1.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // val2 := br0.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v2 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v2.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // val3 := br0.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v3 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br0.advance(uint8(v3.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // these four writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + // out[id * dstEvery + 3] = uint8(v2.entry >> 8) + // out[id * dstEvery + 4] = uint8(v3.entry >> 8) + MOVL AX, (BX) + + // update the bitreader structure + MOVQ R11, 32(R10) + MOVB R12, 40(R10) + + // br1.fillFast32() + MOVQ 80(R10), R11 + MOVBQZX 88(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill1 + MOVQ 72(R10), R13 + SUBQ $0x20, R12 + SUBQ $0x04, R13 + MOVQ 48(R10), R14 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (R13)(R14*1), R14 + MOVQ R12, CX + SHLQ CL, R14 + MOVQ R13, 72(R10) + ORQ R14, R11 + + // exhausted += (br1.off < 4) + CMPQ R13, $0x04 + ADCB $+0, DL + +skip_fill1: + // val0 := br1.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br1.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v1 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v1.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // val2 := br1.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v2 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v2.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // val3 := br1.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v3 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br1.advance(uint8(v3.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // these four writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + // out[id * dstEvery + 3] = uint8(v2.entry >> 8) + // out[id * dstEvery + 4] = uint8(v3.entry >> 8) + MOVL AX, (BX)(R8*1) + + // update the bitreader structure + MOVQ R11, 80(R10) + MOVB R12, 88(R10) + + // br2.fillFast32() + MOVQ 128(R10), R11 + MOVBQZX 136(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill2 + MOVQ 120(R10), R13 + SUBQ $0x20, R12 + SUBQ $0x04, R13 + MOVQ 96(R10), R14 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (R13)(R14*1), R14 + MOVQ R12, CX + SHLQ CL, R14 + MOVQ R13, 120(R10) + ORQ R14, R11 + + // exhausted += (br2.off < 4) + CMPQ R13, $0x04 + ADCB $+0, DL + +skip_fill2: + // val0 := br2.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br2.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v1 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v1.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // val2 := br2.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v2 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v2.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // val3 := br2.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v3 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br2.advance(uint8(v3.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // these four writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + // out[id * dstEvery + 3] = uint8(v2.entry >> 8) + // out[id * dstEvery + 4] = uint8(v3.entry >> 8) + MOVL AX, (BX)(R8*2) + + // update the bitreader structure + MOVQ R11, 128(R10) + MOVB R12, 136(R10) + + // br3.fillFast32() + MOVQ 176(R10), R11 + MOVBQZX 184(R10), R12 + CMPQ R12, $0x20 + JBE skip_fill3 + MOVQ 168(R10), R13 + SUBQ $0x20, R12 + SUBQ $0x04, R13 + MOVQ 144(R10), R14 + + // b.value |= uint64(low) << (b.bitsRead & 63) + MOVL (R13)(R14*1), R14 + MOVQ R12, CX + SHLQ CL, R14 + MOVQ R13, 168(R10) + ORQ R14, R11 + + // exhausted += (br3.off < 4) + CMPQ R13, $0x04 + ADCB $+0, DL + +skip_fill3: + // val0 := br3.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v0 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v0.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + + // val1 := br3.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v1 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v1.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // val2 := br3.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v2 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v2.entry) + MOVB CH, AH + SHLQ CL, R11 + ADDB CL, R12 + + // val3 := br3.peekTopBits(peekBits) + MOVQ R11, R13 + MOVQ DI, CX + SHRQ CL, R13 + + // v3 := table[val0&mask] + MOVW (R9)(R13*2), CX + + // br3.advance(uint8(v3.entry) + MOVB CH, AL + SHLQ CL, R11 + ADDB CL, R12 + BSWAPL AX + + // these four writes get coalesced + // out[id * dstEvery + 0] = uint8(v0.entry >> 8) + // out[id * dstEvery + 1] = uint8(v1.entry >> 8) + // out[id * dstEvery + 3] = uint8(v2.entry >> 8) + // out[id * dstEvery + 4] = uint8(v3.entry >> 8) + LEAQ (R8)(R8*2), CX + MOVL AX, (BX)(CX*1) + + // update the bitreader structure + MOVQ R11, 176(R10) + MOVB R12, 184(R10) + ADDQ $0x04, BX + TESTB DL, DL + JZ main_loop + MOVQ ctx+0(FP), AX + SUBQ 16(AX), BX + SHLQ $0x02, BX + MOVQ BX, 40(AX) + RET + +// func decompress1x_main_loop_amd64(ctx *decompress1xContext) +TEXT ·decompress1x_main_loop_amd64(SB), $0-8 + MOVQ ctx+0(FP), CX + MOVQ 16(CX), DX + MOVQ 24(CX), BX + CMPQ BX, $0x04 + JB error_max_decoded_size_exceeded + LEAQ (DX)(BX*1), BX + MOVQ (CX), SI + MOVQ (SI), R8 + MOVQ 24(SI), R9 + MOVQ 32(SI), R10 + MOVBQZX 40(SI), R11 + MOVQ 32(CX), SI + MOVBQZX 8(CX), DI + JMP loop_condition + +main_loop: + // Check if we have room for 4 bytes in the output buffer + LEAQ 4(DX), CX + CMPQ CX, BX + JGE error_max_decoded_size_exceeded + + // Decode 4 values + CMPQ R11, $0x20 + JL bitReader_fillFast_1_end + SUBQ $0x20, R11 + SUBQ $0x04, R9 + MOVL (R8)(R9*1), R12 + MOVQ R11, CX + SHLQ CL, R12 + ORQ R12, R10 + +bitReader_fillFast_1_end: + MOVQ DI, CX + MOVQ R10, R12 + SHRQ CL, R12 + MOVW (SI)(R12*2), CX + MOVB CH, AL + MOVBQZX CL, CX + ADDQ CX, R11 + SHLQ CL, R10 + MOVQ DI, CX + MOVQ R10, R12 + SHRQ CL, R12 + MOVW (SI)(R12*2), CX + MOVB CH, AH + MOVBQZX CL, CX + ADDQ CX, R11 + SHLQ CL, R10 + BSWAPL AX + CMPQ R11, $0x20 + JL bitReader_fillFast_2_end + SUBQ $0x20, R11 + SUBQ $0x04, R9 + MOVL (R8)(R9*1), R12 + MOVQ R11, CX + SHLQ CL, R12 + ORQ R12, R10 + +bitReader_fillFast_2_end: + MOVQ DI, CX + MOVQ R10, R12 + SHRQ CL, R12 + MOVW (SI)(R12*2), CX + MOVB CH, AH + MOVBQZX CL, CX + ADDQ CX, R11 + SHLQ CL, R10 + MOVQ DI, CX + MOVQ R10, R12 + SHRQ CL, R12 + MOVW (SI)(R12*2), CX + MOVB CH, AL + MOVBQZX CL, CX + ADDQ CX, R11 + SHLQ CL, R10 + BSWAPL AX + + // Store the decoded values + MOVL AX, (DX) + ADDQ $0x04, DX + +loop_condition: + CMPQ R9, $0x08 + JGE main_loop + + // Update ctx structure + MOVQ ctx+0(FP), AX + SUBQ 16(AX), DX + MOVQ DX, 40(AX) + MOVQ (AX), AX + MOVQ R9, 24(AX) + MOVQ R10, 32(AX) + MOVB R11, 40(AX) + RET + + // Report error +error_max_decoded_size_exceeded: + MOVQ ctx+0(FP), AX + MOVQ $-1, CX + MOVQ CX, 40(AX) + RET + +// func decompress1x_main_loop_bmi2(ctx *decompress1xContext) +// Requires: BMI2 +TEXT ·decompress1x_main_loop_bmi2(SB), $0-8 + MOVQ ctx+0(FP), CX + MOVQ 16(CX), DX + MOVQ 24(CX), BX + CMPQ BX, $0x04 + JB error_max_decoded_size_exceeded + LEAQ (DX)(BX*1), BX + MOVQ (CX), SI + MOVQ (SI), R8 + MOVQ 24(SI), R9 + MOVQ 32(SI), R10 + MOVBQZX 40(SI), R11 + MOVQ 32(CX), SI + MOVBQZX 8(CX), DI + JMP loop_condition + +main_loop: + // Check if we have room for 4 bytes in the output buffer + LEAQ 4(DX), CX + CMPQ CX, BX + JGE error_max_decoded_size_exceeded + + // Decode 4 values + CMPQ R11, $0x20 + JL bitReader_fillFast_1_end + SUBQ $0x20, R11 + SUBQ $0x04, R9 + MOVL (R8)(R9*1), CX + SHLXQ R11, CX, CX + ORQ CX, R10 + +bitReader_fillFast_1_end: + SHRXQ DI, R10, CX + MOVW (SI)(CX*2), CX + MOVB CH, AL + MOVBQZX CL, CX + ADDQ CX, R11 + SHLXQ CX, R10, R10 + SHRXQ DI, R10, CX + MOVW (SI)(CX*2), CX + MOVB CH, AH + MOVBQZX CL, CX + ADDQ CX, R11 + SHLXQ CX, R10, R10 + BSWAPL AX + CMPQ R11, $0x20 + JL bitReader_fillFast_2_end + SUBQ $0x20, R11 + SUBQ $0x04, R9 + MOVL (R8)(R9*1), CX + SHLXQ R11, CX, CX + ORQ CX, R10 + +bitReader_fillFast_2_end: + SHRXQ DI, R10, CX + MOVW (SI)(CX*2), CX + MOVB CH, AH + MOVBQZX CL, CX + ADDQ CX, R11 + SHLXQ CX, R10, R10 + SHRXQ DI, R10, CX + MOVW (SI)(CX*2), CX + MOVB CH, AL + MOVBQZX CL, CX + ADDQ CX, R11 + SHLXQ CX, R10, R10 + BSWAPL AX + + // Store the decoded values + MOVL AX, (DX) + ADDQ $0x04, DX + +loop_condition: + CMPQ R9, $0x08 + JGE main_loop + + // Update ctx structure + MOVQ ctx+0(FP), AX + SUBQ 16(AX), DX + MOVQ DX, 40(AX) + MOVQ (AX), AX + MOVQ R9, 24(AX) + MOVQ R10, 32(AX) + MOVB R11, 40(AX) + RET + + // Report error +error_max_decoded_size_exceeded: + MOVQ ctx+0(FP), AX + MOVQ $-1, CX + MOVQ CX, 40(AX) + RET diff --git a/tools/vendor/github.com/klauspost/compress/huff0/decompress_generic.go b/tools/vendor/github.com/klauspost/compress/huff0/decompress_generic.go new file mode 100644 index 000000000..908c17de6 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/huff0/decompress_generic.go @@ -0,0 +1,299 @@ +//go:build !amd64 || appengine || !gc || noasm +// +build !amd64 appengine !gc noasm + +// This file contains a generic implementation of Decoder.Decompress4X. +package huff0 + +import ( + "errors" + "fmt" +) + +// Decompress4X will decompress a 4X encoded stream. +// The length of the supplied input must match the end of a block exactly. +// The *capacity* of the dst slice must match the destination size of +// the uncompressed data exactly. +func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { + if len(d.dt.single) == 0 { + return nil, errors.New("no table loaded") + } + if len(src) < 6+(4*1) { + return nil, errors.New("input too small") + } + if use8BitTables && d.actualTableLog <= 8 { + return d.decompress4X8bit(dst, src) + } + + var br [4]bitReaderShifted + // Decode "jump table" + start := 6 + for i := 0; i < 3; i++ { + length := int(src[i*2]) | (int(src[i*2+1]) << 8) + if start+length >= len(src) { + return nil, errors.New("truncated input (or invalid offset)") + } + err := br[i].init(src[start : start+length]) + if err != nil { + return nil, err + } + start += length + } + err := br[3].init(src[start:]) + if err != nil { + return nil, err + } + + // destination, offset to match first output + dstSize := cap(dst) + dst = dst[:dstSize] + out := dst + dstEvery := (dstSize + 3) / 4 + + const tlSize = 1 << tableLogMax + const tlMask = tlSize - 1 + single := d.dt.single[:tlSize] + + // Use temp table to avoid bound checks/append penalty. + buf := d.buffer() + var off uint8 + var decoded int + + // Decode 2 values from each decoder/loop. + const bufoff = 256 + for { + if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { + break + } + + { + const stream = 0 + const stream2 = 1 + br[stream].fillFast() + br[stream2].fillFast() + + val := br[stream].peekBitsFast(d.actualTableLog) + val2 := br[stream2].peekBitsFast(d.actualTableLog) + v := single[val&tlMask] + v2 := single[val2&tlMask] + br[stream].advance(uint8(v.entry)) + br[stream2].advance(uint8(v2.entry)) + buf[stream][off] = uint8(v.entry >> 8) + buf[stream2][off] = uint8(v2.entry >> 8) + + val = br[stream].peekBitsFast(d.actualTableLog) + val2 = br[stream2].peekBitsFast(d.actualTableLog) + v = single[val&tlMask] + v2 = single[val2&tlMask] + br[stream].advance(uint8(v.entry)) + br[stream2].advance(uint8(v2.entry)) + buf[stream][off+1] = uint8(v.entry >> 8) + buf[stream2][off+1] = uint8(v2.entry >> 8) + } + + { + const stream = 2 + const stream2 = 3 + br[stream].fillFast() + br[stream2].fillFast() + + val := br[stream].peekBitsFast(d.actualTableLog) + val2 := br[stream2].peekBitsFast(d.actualTableLog) + v := single[val&tlMask] + v2 := single[val2&tlMask] + br[stream].advance(uint8(v.entry)) + br[stream2].advance(uint8(v2.entry)) + buf[stream][off] = uint8(v.entry >> 8) + buf[stream2][off] = uint8(v2.entry >> 8) + + val = br[stream].peekBitsFast(d.actualTableLog) + val2 = br[stream2].peekBitsFast(d.actualTableLog) + v = single[val&tlMask] + v2 = single[val2&tlMask] + br[stream].advance(uint8(v.entry)) + br[stream2].advance(uint8(v2.entry)) + buf[stream][off+1] = uint8(v.entry >> 8) + buf[stream2][off+1] = uint8(v2.entry >> 8) + } + + off += 2 + + if off == 0 { + if bufoff > dstEvery { + d.bufs.Put(buf) + return nil, errors.New("corruption detected: stream overrun 1") + } + // There must at least be 3 buffers left. + if len(out)-bufoff < dstEvery*3 { + d.bufs.Put(buf) + return nil, errors.New("corruption detected: stream overrun 2") + } + //copy(out, buf[0][:]) + //copy(out[dstEvery:], buf[1][:]) + //copy(out[dstEvery*2:], buf[2][:]) + //copy(out[dstEvery*3:], buf[3][:]) + *(*[bufoff]byte)(out) = buf[0] + *(*[bufoff]byte)(out[dstEvery:]) = buf[1] + *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] + *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] + out = out[bufoff:] + decoded += bufoff * 4 + } + } + if off > 0 { + ioff := int(off) + if len(out) < dstEvery*3+ioff { + d.bufs.Put(buf) + return nil, errors.New("corruption detected: stream overrun 3") + } + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) + decoded += int(off) * 4 + out = out[off:] + } + + // Decode remaining. + remainBytes := dstEvery - (decoded / 4) + for i := range br { + offset := dstEvery * i + endsAt := offset + remainBytes + if endsAt > len(out) { + endsAt = len(out) + } + br := &br[i] + bitsLeft := br.remaining() + for bitsLeft > 0 { + br.fill() + if offset >= endsAt { + d.bufs.Put(buf) + return nil, errors.New("corruption detected: stream overrun 4") + } + + // Read value and increment offset. + val := br.peekBitsFast(d.actualTableLog) + v := single[val&tlMask].entry + nBits := uint8(v) + br.advance(nBits) + bitsLeft -= uint(nBits) + out[offset] = uint8(v >> 8) + offset++ + } + if offset != endsAt { + d.bufs.Put(buf) + return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) + } + decoded += offset - dstEvery*i + err = br.close() + if err != nil { + return nil, err + } + } + d.bufs.Put(buf) + if dstSize != decoded { + return nil, errors.New("corruption detected: short output block") + } + return dst, nil +} + +// Decompress1X will decompress a 1X encoded stream. +// The cap of the output buffer will be the maximum decompressed size. +// The length of the supplied input must match the end of a block exactly. +func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { + if len(d.dt.single) == 0 { + return nil, errors.New("no table loaded") + } + if use8BitTables && d.actualTableLog <= 8 { + return d.decompress1X8Bit(dst, src) + } + var br bitReaderShifted + err := br.init(src) + if err != nil { + return dst, err + } + maxDecodedSize := cap(dst) + dst = dst[:0] + + // Avoid bounds check by always having full sized table. + const tlSize = 1 << tableLogMax + const tlMask = tlSize - 1 + dt := d.dt.single[:tlSize] + + // Use temp table to avoid bound checks/append penalty. + bufs := d.buffer() + buf := &bufs[0] + var off uint8 + + for br.off >= 8 { + br.fillFast() + v := dt[br.peekBitsFast(d.actualTableLog)&tlMask] + br.advance(uint8(v.entry)) + buf[off+0] = uint8(v.entry >> 8) + + v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] + br.advance(uint8(v.entry)) + buf[off+1] = uint8(v.entry >> 8) + + // Refill + br.fillFast() + + v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] + br.advance(uint8(v.entry)) + buf[off+2] = uint8(v.entry >> 8) + + v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] + br.advance(uint8(v.entry)) + buf[off+3] = uint8(v.entry >> 8) + + off += 4 + if off == 0 { + if len(dst)+256 > maxDecodedSize { + br.close() + d.bufs.Put(bufs) + return nil, ErrMaxDecodedSizeExceeded + } + dst = append(dst, buf[:]...) + } + } + + if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) + br.close() + return nil, ErrMaxDecodedSizeExceeded + } + dst = append(dst, buf[:off]...) + + // br < 8, so uint8 is fine + bitsLeft := uint8(br.off)*8 + 64 - br.bitsRead + for bitsLeft > 0 { + br.fill() + if false && br.bitsRead >= 32 { + if br.off >= 4 { + v := br.in[br.off-4:] + v = v[:4] + low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) + br.value = (br.value << 32) | uint64(low) + br.bitsRead -= 32 + br.off -= 4 + } else { + for br.off > 0 { + br.value = (br.value << 8) | uint64(br.in[br.off-1]) + br.bitsRead -= 8 + br.off-- + } + } + } + if len(dst) >= maxDecodedSize { + d.bufs.Put(bufs) + br.close() + return nil, ErrMaxDecodedSizeExceeded + } + v := d.dt.single[br.peekBitsFast(d.actualTableLog)&tlMask] + nBits := uint8(v.entry) + br.advance(nBits) + bitsLeft -= nBits + dst = append(dst, uint8(v.entry>>8)) + } + d.bufs.Put(bufs) + return dst, br.close() +} diff --git a/tools/vendor/github.com/klauspost/compress/huff0/huff0.go b/tools/vendor/github.com/klauspost/compress/huff0/huff0.go index 3ee00ecb4..e8ad17ad0 100644 --- a/tools/vendor/github.com/klauspost/compress/huff0/huff0.go +++ b/tools/vendor/github.com/klauspost/compress/huff0/huff0.go @@ -8,6 +8,7 @@ import ( "fmt" "math" "math/bits" + "sync" "github.com/klauspost/compress/fse" ) @@ -116,6 +117,7 @@ type Scratch struct { nodes []nodeElt tmpOut [4][]byte fse *fse.Scratch + decPool sync.Pool // *[4][256]byte buffers. huffWeight [maxSymbolValue + 1]byte } diff --git a/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go new file mode 100644 index 000000000..3954c5121 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go @@ -0,0 +1,34 @@ +// Package cpuinfo gives runtime info about the current CPU. +// +// This is a very limited module meant for use internally +// in this project. For more versatile solution check +// https://github.com/klauspost/cpuid. +package cpuinfo + +// HasBMI1 checks whether an x86 CPU supports the BMI1 extension. +func HasBMI1() bool { + return hasBMI1 +} + +// HasBMI2 checks whether an x86 CPU supports the BMI2 extension. +func HasBMI2() bool { + return hasBMI2 +} + +// DisableBMI2 will disable BMI2, for testing purposes. +// Call returned function to restore previous state. +func DisableBMI2() func() { + old := hasBMI2 + hasBMI2 = false + return func() { + hasBMI2 = old + } +} + +// HasBMI checks whether an x86 CPU supports both BMI1 and BMI2 extensions. +func HasBMI() bool { + return HasBMI1() && HasBMI2() +} + +var hasBMI1 bool +var hasBMI2 bool diff --git a/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go new file mode 100644 index 000000000..e802579c4 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go @@ -0,0 +1,11 @@ +//go:build amd64 && !appengine && !noasm && gc +// +build amd64,!appengine,!noasm,gc + +package cpuinfo + +// go:noescape +func x86extensions() (bmi1, bmi2 bool) + +func init() { + hasBMI1, hasBMI2 = x86extensions() +} diff --git a/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s new file mode 100644 index 000000000..4465fbe9e --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s @@ -0,0 +1,36 @@ +// +build !appengine +// +build gc +// +build !noasm + +#include "textflag.h" +#include "funcdata.h" +#include "go_asm.h" + +TEXT ·x86extensions(SB), NOSPLIT, $0 + // 1. determine max EAX value + XORQ AX, AX + CPUID + + CMPQ AX, $7 + JB unsupported + + // 2. EAX = 7, ECX = 0 --- see Table 3-8 "Information Returned by CPUID Instruction" + MOVQ $7, AX + MOVQ $0, CX + CPUID + + BTQ $3, BX // bit 3 = BMI1 + SETCS AL + + BTQ $8, BX // bit 8 = BMI2 + SETCS AH + + MOVB AL, bmi1+0(FP) + MOVB AH, bmi2+1(FP) + RET + +unsupported: + XORQ AX, AX + MOVB AL, bmi1+0(FP) + MOVB AL, bmi2+1(FP) + RET diff --git a/tools/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go b/tools/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go index 511bba65d..05db94d39 100644 --- a/tools/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go +++ b/tools/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go @@ -18,6 +18,7 @@ func load64(b []byte, i int) uint64 { // emitLiteral writes a literal chunk and returns the number of bytes written. // // It assumes that: +// // dst is long enough to hold the encoded bytes // 1 <= len(lit) && len(lit) <= 65536 func emitLiteral(dst, lit []byte) int { @@ -42,6 +43,7 @@ func emitLiteral(dst, lit []byte) int { // emitCopy writes a copy chunk and returns the number of bytes written. // // It assumes that: +// // dst is long enough to hold the encoded bytes // 1 <= offset && offset <= 65535 // 4 <= length && length <= 65535 @@ -89,6 +91,7 @@ func emitCopy(dst []byte, offset, length int) int { // 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 { @@ -100,13 +103,36 @@ 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. // // It also assumes that: +// // len(dst) >= MaxEncodedLen(len(src)) && -// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize +// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize func encodeBlock(dst, src []byte) (d int) { // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. // The table element type is uint16, as s < sLimit and sLimit < len(src) diff --git a/tools/vendor/github.com/klauspost/compress/zstd/README.md b/tools/vendor/github.com/klauspost/compress/zstd/README.md index c8f0f16fc..65b38abed 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/README.md +++ b/tools/vendor/github.com/klauspost/compress/zstd/README.md @@ -12,6 +12,8 @@ The `zstd` package is provided as open source software using a Go standard licen Currently the package is heavily optimized for 64 bit processors and will be significantly slower on 32 bit processors. +For seekable zstd streams, see [this excellent package](https://github.com/SaveTheRbtz/zstd-seekable-format-go). + ## Installation Install using `go get -u github.com/klauspost/compress`. The package is located in `github.com/klauspost/compress/zstd`. @@ -78,6 +80,9 @@ of a stream. This is independent of the `WithEncoderConcurrency(n)`, but that is in the future. So if you want to limit concurrency for future updates, specify the concurrency you would like. +If you would like stream encoding to be done without spawning async goroutines, use `WithEncoderConcurrency(1)` +which will compress input as each block is completed, blocking on writes until each has completed. + You can specify your desired compression level using `WithEncoderLevel()` option. Currently only pre-defined compression settings can be specified. @@ -104,7 +109,8 @@ and seems to ignore concatenated streams, even though [it is part of the spec](h For compressing small blocks, the returned encoder has a function called `EncodeAll(src, dst []byte) []byte`. `EncodeAll` will encode all input in src and append it to dst. -This function can be called concurrently, but each call will only run on a single goroutine. +This function can be called concurrently. +Each call will only run on a same goroutine as the caller. Encoded blocks can be concatenated and the result will be the combined input stream. Data compressed with EncodeAll can be decoded with the Decoder, using either a stream or `DecodeAll`. @@ -149,10 +155,10 @@ http://sun.aei.polsl.pl/~sdeor/corpus/silesia.zip This package: file out level insize outsize millis mb/s -silesia.tar zskp 1 211947520 73101992 643 313.87 -silesia.tar zskp 2 211947520 67504318 969 208.38 -silesia.tar zskp 3 211947520 64595893 2007 100.68 -silesia.tar zskp 4 211947520 60995370 8825 22.90 +silesia.tar zskp 1 211947520 73821326 634 318.47 +silesia.tar zskp 2 211947520 67655404 1508 133.96 +silesia.tar zskp 3 211947520 64746933 3000 67.37 +silesia.tar zskp 4 211947520 60073508 16926 11.94 cgo zstd: silesia.tar zstd 1 211947520 73605392 543 371.56 @@ -161,94 +167,94 @@ silesia.tar zstd 6 211947520 62916450 1913 105.66 silesia.tar zstd 9 211947520 60212393 5063 39.92 gzip, stdlib/this package: -silesia.tar gzstd 1 211947520 80007735 1654 122.21 -silesia.tar gzkp 1 211947520 80136201 1152 175.45 +silesia.tar gzstd 1 211947520 80007735 1498 134.87 +silesia.tar gzkp 1 211947520 80088272 1009 200.31 GOB stream of binary data. Highly compressible. https://files.klauspost.com/compress/gob-stream.7z file out level insize outsize millis mb/s -gob-stream zskp 1 1911399616 235022249 3088 590.30 -gob-stream zskp 2 1911399616 205669791 3786 481.34 -gob-stream zskp 3 1911399616 175034659 9636 189.17 -gob-stream zskp 4 1911399616 165609838 50369 36.19 +gob-stream zskp 1 1911399616 233948096 3230 564.34 +gob-stream zskp 2 1911399616 203997694 4997 364.73 +gob-stream zskp 3 1911399616 173526523 13435 135.68 +gob-stream zskp 4 1911399616 162195235 47559 38.33 gob-stream zstd 1 1911399616 249810424 2637 691.26 gob-stream zstd 3 1911399616 208192146 3490 522.31 gob-stream zstd 6 1911399616 193632038 6687 272.56 gob-stream zstd 9 1911399616 177620386 16175 112.70 -gob-stream gzstd 1 1911399616 357382641 10251 177.82 -gob-stream gzkp 1 1911399616 359753026 5438 335.20 +gob-stream gzstd 1 1911399616 357382013 9046 201.49 +gob-stream gzkp 1 1911399616 359136669 4885 373.08 The test data for the Large Text Compression Benchmark is the first 10^9 bytes of the English Wikipedia dump on Mar. 3, 2006. http://mattmahoney.net/dc/textdata.html file out level insize outsize millis mb/s -enwik9 zskp 1 1000000000 343848582 3609 264.18 -enwik9 zskp 2 1000000000 317276632 5746 165.97 -enwik9 zskp 3 1000000000 292243069 12162 78.41 -enwik9 zskp 4 1000000000 262183768 82837 11.51 +enwik9 zskp 1 1000000000 343833605 3687 258.64 +enwik9 zskp 2 1000000000 317001237 7672 124.29 +enwik9 zskp 3 1000000000 291915823 15923 59.89 +enwik9 zskp 4 1000000000 261710291 77697 12.27 enwik9 zstd 1 1000000000 358072021 3110 306.65 enwik9 zstd 3 1000000000 313734672 4784 199.35 enwik9 zstd 6 1000000000 295138875 10290 92.68 enwik9 zstd 9 1000000000 278348700 28549 33.40 -enwik9 gzstd 1 1000000000 382578136 9604 99.30 -enwik9 gzkp 1 1000000000 383825945 6544 145.73 +enwik9 gzstd 1 1000000000 382578136 8608 110.78 +enwik9 gzkp 1 1000000000 382781160 5628 169.45 Highly compressible JSON file. https://files.klauspost.com/compress/github-june-2days-2019.json.zst file out level insize outsize millis mb/s -github-june-2days-2019.json zskp 1 6273951764 699045015 10620 563.40 -github-june-2days-2019.json zskp 2 6273951764 617881763 11687 511.96 -github-june-2days-2019.json zskp 3 6273951764 524340691 34043 175.75 -github-june-2days-2019.json zskp 4 6273951764 470320075 170190 35.16 +github-june-2days-2019.json zskp 1 6273951764 697439532 9789 611.17 +github-june-2days-2019.json zskp 2 6273951764 610876538 18553 322.49 +github-june-2days-2019.json zskp 3 6273951764 517662858 44186 135.41 +github-june-2days-2019.json zskp 4 6273951764 464617114 165373 36.18 github-june-2days-2019.json zstd 1 6273951764 766284037 8450 708.00 github-june-2days-2019.json zstd 3 6273951764 661889476 10927 547.57 github-june-2days-2019.json zstd 6 6273951764 642756859 22996 260.18 github-june-2days-2019.json zstd 9 6273951764 601974523 52413 114.16 -github-june-2days-2019.json gzstd 1 6273951764 1164400847 29948 199.79 -github-june-2days-2019.json gzkp 1 6273951764 1125417694 21788 274.61 +github-june-2days-2019.json gzstd 1 6273951764 1164397768 26793 223.32 +github-june-2days-2019.json gzkp 1 6273951764 1120631856 17693 338.16 VM Image, Linux mint with a few installed applications: https://files.klauspost.com/compress/rawstudio-mint14.7z file out level insize outsize millis mb/s -rawstudio-mint14.tar zskp 1 8558382592 3667489370 20210 403.84 -rawstudio-mint14.tar zskp 2 8558382592 3364592300 31873 256.07 -rawstudio-mint14.tar zskp 3 8558382592 3158085214 77675 105.08 -rawstudio-mint14.tar zskp 4 8558382592 2965110639 857750 9.52 +rawstudio-mint14.tar zskp 1 8558382592 3718400221 18206 448.29 +rawstudio-mint14.tar zskp 2 8558382592 3326118337 37074 220.15 +rawstudio-mint14.tar zskp 3 8558382592 3163842361 87306 93.49 +rawstudio-mint14.tar zskp 4 8558382592 2970480650 783862 10.41 rawstudio-mint14.tar zstd 1 8558382592 3609250104 17136 476.27 rawstudio-mint14.tar zstd 3 8558382592 3341679997 29262 278.92 rawstudio-mint14.tar zstd 6 8558382592 3235846406 77904 104.77 rawstudio-mint14.tar zstd 9 8558382592 3160778861 140946 57.91 -rawstudio-mint14.tar gzstd 1 8558382592 3926257486 57722 141.40 -rawstudio-mint14.tar gzkp 1 8558382592 3962605659 45113 180.92 +rawstudio-mint14.tar gzstd 1 8558382592 3926234992 51345 158.96 +rawstudio-mint14.tar gzkp 1 8558382592 3960117298 36722 222.26 CSV data: https://files.klauspost.com/compress/nyc-taxi-data-10M.csv.zst file out level insize outsize millis mb/s -nyc-taxi-data-10M.csv zskp 1 3325605752 641339945 8925 355.35 -nyc-taxi-data-10M.csv zskp 2 3325605752 591748091 11268 281.44 -nyc-taxi-data-10M.csv zskp 3 3325605752 530289687 25239 125.66 -nyc-taxi-data-10M.csv zskp 4 3325605752 476268884 135958 23.33 +nyc-taxi-data-10M.csv zskp 1 3325605752 641319332 9462 335.17 +nyc-taxi-data-10M.csv zskp 2 3325605752 588976126 17570 180.50 +nyc-taxi-data-10M.csv zskp 3 3325605752 529329260 32432 97.79 +nyc-taxi-data-10M.csv zskp 4 3325605752 474949772 138025 22.98 nyc-taxi-data-10M.csv zstd 1 3325605752 687399637 8233 385.18 nyc-taxi-data-10M.csv zstd 3 3325605752 598514411 10065 315.07 nyc-taxi-data-10M.csv zstd 6 3325605752 570522953 20038 158.27 nyc-taxi-data-10M.csv zstd 9 3325605752 517554797 64565 49.12 -nyc-taxi-data-10M.csv gzstd 1 3325605752 928656485 23876 132.83 -nyc-taxi-data-10M.csv gzkp 1 3325605752 922257165 16780 189.00 +nyc-taxi-data-10M.csv gzstd 1 3325605752 928654908 21270 149.11 +nyc-taxi-data-10M.csv gzkp 1 3325605752 922273214 13929 227.68 ``` ## Decompressor @@ -283,8 +289,13 @@ func Decompress(in io.Reader, out io.Writer) error { } ``` -It is important to use the "Close" function when you no longer need the Reader to stop running goroutines. -See "Allocation-less operation" below. +It is important to use the "Close" function when you no longer need the Reader to stop running goroutines, +when running with default settings. +Goroutines will exit once an error has been returned, including `io.EOF` at the end of a stream. + +Streams are decoded concurrently in 4 asynchronous stages to give the best possible throughput. +However, if you prefer synchronous decompression, use `WithDecoderConcurrency(1)` which will decompress data +as it is being requested only. For decoding buffers, it could look something like this: @@ -293,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) +var decoder, _ = zstd.NewReader(nil, WithDecoderConcurrency(0)) // Decompress a buffer. We don't supply a destination buffer, // so it will be allocated by the decoder. @@ -303,9 +314,12 @@ func Decompress(src []byte) ([]byte, error) { ``` Both of these cases should provide the functionality needed. -The decoder can be used for *concurrent* decompression of multiple buffers. +The decoder can be used for *concurrent* decompression of multiple buffers. +By default 4 decompressors will be created. + It will only allow a certain number of concurrent operations to run. -To tweak that yourself use the `WithDecoderConcurrency(n)` option when creating the decoder. +To tweak that yourself use the `WithDecoderConcurrency(n)` option when creating the decoder. +It is possible to use `WithDecoderConcurrency(0)` to create GOMAXPROCS decoders. ### Dictionaries @@ -357,62 +371,48 @@ In this case no unneeded allocations should be made. The buffer decoder does everything on the same goroutine and does nothing concurrently. It can however decode several buffers concurrently. Use `WithDecoderConcurrency(n)` to limit that. -The stream decoder operates on +The stream decoder will create goroutines that: -* One goroutine reads input and splits the input to several block decoders. -* A number of decoders will decode blocks. -* A goroutine coordinates these blocks and sends history from one to the next. +1) Reads input and splits the input into blocks. +2) Decompression of literals. +3) Decompression of sequences. +4) Reconstruction of output stream. So effectively this also means the decoder will "read ahead" and prepare data to always be available for output. +The concurrency level will, for streams, determine how many blocks ahead the compression will start. + Since "blocks" are quite dependent on the output of the previous block stream decoding will only have limited concurrency. -In practice this means that concurrency is often limited to utilizing about 2 cores effectively. - - +In practice this means that concurrency is often limited to utilizing about 3 cores effectively. + ### Benchmarks -These are some examples of performance compared to [datadog cgo library](https://github.com/DataDog/zstd). - The first two are streaming decodes and the last are smaller inputs. - + +Running on AMD Ryzen 9 3950X 16-Core Processor. AMD64 assembly used. + ``` -BenchmarkDecoderSilesia-8 3 385000067 ns/op 550.51 MB/s 5498 B/op 8 allocs/op -BenchmarkDecoderSilesiaCgo-8 6 197666567 ns/op 1072.25 MB/s 270672 B/op 8 allocs/op - -BenchmarkDecoderEnwik9-8 1 2027001600 ns/op 493.34 MB/s 10496 B/op 18 allocs/op -BenchmarkDecoderEnwik9Cgo-8 2 979499200 ns/op 1020.93 MB/s 270672 B/op 8 allocs/op - -Concurrent performance: - -BenchmarkDecoder_DecodeAllParallel/kppkn.gtb.zst-16 28915 42469 ns/op 4340.07 MB/s 114 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/geo.protodata.zst-16 116505 9965 ns/op 11900.16 MB/s 16 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/plrabn12.txt.zst-16 8952 134272 ns/op 3588.70 MB/s 915 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/lcet10.txt.zst-16 11820 102538 ns/op 4161.90 MB/s 594 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/asyoulik.txt.zst-16 34782 34184 ns/op 3661.88 MB/s 60 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/alice29.txt.zst-16 27712 43447 ns/op 3500.58 MB/s 99 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/html_x_4.zst-16 62826 18750 ns/op 21845.10 MB/s 104 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/paper-100k.pdf.zst-16 631545 1794 ns/op 57078.74 MB/s 2 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/fireworks.jpeg.zst-16 1690140 712 ns/op 172938.13 MB/s 1 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/urls.10K.zst-16 10432 113593 ns/op 6180.73 MB/s 1143 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/html.zst-16 113206 10671 ns/op 9596.27 MB/s 15 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/comp-data.bin.zst-16 1530615 779 ns/op 5229.49 MB/s 0 B/op 0 allocs/op - -BenchmarkDecoder_DecodeAllParallelCgo/kppkn.gtb.zst-16 65217 16192 ns/op 11383.34 MB/s 46 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/geo.protodata.zst-16 292671 4039 ns/op 29363.19 MB/s 6 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/plrabn12.txt.zst-16 26314 46021 ns/op 10470.43 MB/s 293 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/lcet10.txt.zst-16 33897 34900 ns/op 12227.96 MB/s 205 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/asyoulik.txt.zst-16 104348 11433 ns/op 10949.01 MB/s 20 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/alice29.txt.zst-16 75949 15510 ns/op 9805.60 MB/s 32 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/html_x_4.zst-16 173910 6756 ns/op 60624.29 MB/s 37 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/paper-100k.pdf.zst-16 923076 1339 ns/op 76474.87 MB/s 1 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/fireworks.jpeg.zst-16 922920 1351 ns/op 91102.57 MB/s 2 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/urls.10K.zst-16 27649 43618 ns/op 16096.19 MB/s 407 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/html.zst-16 279073 4160 ns/op 24614.18 MB/s 6 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallelCgo/comp-data.bin.zst-16 749938 1579 ns/op 2581.71 MB/s 0 B/op 0 allocs/op +BenchmarkDecoderSilesia-32 5 206878840 ns/op 1024.50 MB/s 49808 B/op 43 allocs/op +BenchmarkDecoderEnwik9-32 1 1271809000 ns/op 786.28 MB/s 72048 B/op 52 allocs/op + +Concurrent blocks, performance: + +BenchmarkDecoder_DecodeAllParallel/kppkn.gtb.zst-32 67356 17857 ns/op 10321.96 MB/s 22.48 pct 102 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/geo.protodata.zst-32 266656 4421 ns/op 26823.21 MB/s 11.89 pct 19 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/plrabn12.txt.zst-32 20992 56842 ns/op 8477.17 MB/s 39.90 pct 754 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/lcet10.txt.zst-32 27456 43932 ns/op 9714.01 MB/s 33.27 pct 524 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/asyoulik.txt.zst-32 78432 15047 ns/op 8319.15 MB/s 40.34 pct 66 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/alice29.txt.zst-32 65800 18436 ns/op 8249.63 MB/s 37.75 pct 88 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/html_x_4.zst-32 102993 11523 ns/op 35546.09 MB/s 3.637 pct 143 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/paper-100k.pdf.zst-32 1000000 1070 ns/op 95720.98 MB/s 80.53 pct 3 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/fireworks.jpeg.zst-32 749802 1752 ns/op 70272.35 MB/s 100.0 pct 5 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/urls.10K.zst-32 22640 52934 ns/op 13263.37 MB/s 26.25 pct 1014 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/html.zst-32 226412 5232 ns/op 19572.27 MB/s 14.49 pct 20 B/op 0 allocs/op +BenchmarkDecoder_DecodeAllParallel/comp-data.bin.zst-32 923041 1276 ns/op 3194.71 MB/s 31.26 pct 0 B/op 0 allocs/op ``` -This reflects the performance around May 2020, but this may be out of date. +This reflects the performance around May 2022, but this may be out of date. ## Zstd inside ZIP files diff --git a/tools/vendor/github.com/klauspost/compress/zstd/bitreader.go b/tools/vendor/github.com/klauspost/compress/zstd/bitreader.go index 753d17df6..97299d499 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/bitreader.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/bitreader.go @@ -7,6 +7,7 @@ package zstd import ( "encoding/binary" "errors" + "fmt" "io" "math/bits" ) @@ -62,13 +63,6 @@ func (b *bitReader) get32BitsFast(n uint8) uint32 { return v } -func (b *bitReader) get16BitsFast(n uint8) uint16 { - const regMask = 64 - 1 - v := uint16((b.value << (b.bitsRead & regMask)) >> ((regMask + 1 - n) & regMask)) - b.bitsRead += n - return v -} - // fillFast() will make sure at least 32 bits are available. // There must be at least 4 bytes available. func (b *bitReader) fillFast() { @@ -132,6 +126,9 @@ func (b *bitReader) remain() uint { func (b *bitReader) close() error { // Release reference. b.in = nil + if !b.finished() { + return fmt.Errorf("%d extra bits on block, should be 0", b.remain()) + } if b.bitsRead > 64 { return io.ErrUnexpectedEOF } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/bitwriter.go b/tools/vendor/github.com/klauspost/compress/zstd/bitwriter.go index b36618285..78b3c61be 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/bitwriter.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/bitwriter.go @@ -5,8 +5,6 @@ package zstd -import "fmt" - // bitWriter will write bits. // First bit will be LSB of the first byte of output. type bitWriter struct { @@ -73,80 +71,6 @@ func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { b.nBits += bits } -// flush will flush all pending full bytes. -// There will be at least 56 bits available for writing when this has been called. -// Using flush32 is faster, but leaves less space for writing. -func (b *bitWriter) flush() { - v := b.nBits >> 3 - switch v { - case 0: - case 1: - b.out = append(b.out, - byte(b.bitContainer), - ) - case 2: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - ) - case 3: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - ) - case 4: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - ) - case 5: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - ) - case 6: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - ) - case 7: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - ) - case 8: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - byte(b.bitContainer>>56), - ) - default: - panic(fmt.Errorf("bits (%d) > 64", b.nBits)) - } - b.bitContainer >>= v << 3 - b.nBits &= 7 -} - // 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/tools/vendor/github.com/klauspost/compress/zstd/blockdec.go b/tools/vendor/github.com/klauspost/compress/zstd/blockdec.go index 8a98c4562..5f272d87f 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/blockdec.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/blockdec.go @@ -5,9 +5,14 @@ package zstd import ( + "bytes" + "encoding/binary" "errors" "fmt" + "hash/crc32" "io" + "os" + "path/filepath" "sync" "github.com/klauspost/compress/huff0" @@ -38,14 +43,14 @@ const ( // maxCompressedBlockSize is the biggest allowed compressed block size (128KB) maxCompressedBlockSize = 128 << 10 + compressedBlockOverAlloc = 16 + maxCompressedBlockSizeAlloc = 128<<10 + compressedBlockOverAlloc + // Maximum possible block size (all Raw+Uncompressed). maxBlockSize = (1 << 21) - 1 - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#literals_section_header - maxCompressedLiteralSize = 1 << 18 - maxRLELiteralSize = 1 << 20 - maxMatchLen = 131074 - maxSequences = 0x7f00 + 0xffff + maxMatchLen = 131074 + maxSequences = 0x7f00 + 0xffff // We support slightly less than the reference decoder to be able to // use ints on 32 bit archs. @@ -76,20 +81,28 @@ type blockDec struct { // Window size of the block. WindowSize uint64 - history chan *history - input chan struct{} - result chan decodeOutput - sequenceBuf []seq - err error - decWG sync.WaitGroup + err error + + // Check against this crc, if hasCRC is true. + checkCRC uint32 + hasCRC bool // Frame to use for singlethreaded decoding. // Should not be used by the decoder itself since parent may be another frame. localFrame *frameDec + sequence []seqVals + + async struct { + newHist *history + literals []byte + seqData []byte + seqSize int // Size of uncompressed sequences + fcs uint64 + } + // Block is RLE, this is the size. RLESize uint32 - tmp [4]byte Type blockType @@ -109,13 +122,8 @@ func (b *blockDec) String() string { func newBlockDec(lowMem bool) *blockDec { b := blockDec{ - lowMem: lowMem, - result: make(chan decodeOutput, 1), - input: make(chan struct{}, 1), - history: make(chan *history, 1), + lowMem: lowMem, } - b.decWG.Add(1) - go b.startDecoder() return &b } @@ -133,11 +141,17 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { b.Type = blockType((bh >> 1) & 3) // find size. cSize := int(bh >> 3) - maxSize := maxBlockSize + maxSize := maxCompressedBlockSizeAlloc switch b.Type { case blockTypeReserved: return ErrReservedBlockType case blockTypeRLE: + if cSize > maxCompressedBlockSize || cSize > int(b.WindowSize) { + if debugDecoder { + printf("rle block too big: csize:%d block: %+v\n", uint64(cSize), b) + } + return ErrWindowSizeExceeded + } b.RLESize = uint32(cSize) if b.lowMem { maxSize = cSize @@ -148,9 +162,9 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { println("Data size on stream:", cSize) } b.RLESize = 0 - maxSize = maxCompressedBlockSize + maxSize = maxCompressedBlockSizeAlloc if windowSize < maxCompressedBlockSize && b.lowMem { - maxSize = int(windowSize) + maxSize = int(windowSize) + compressedBlockOverAlloc } if cSize > maxCompressedBlockSize || uint64(cSize) > b.WindowSize { if debugDecoder { @@ -158,7 +172,19 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { } return ErrCompressedSizeTooBig } + // Empty compressed blocks must at least be 2 bytes + // for Literals_Block_Type and one for Sequences_Section_Header. + if cSize < 2 { + return ErrBlockTooSmall + } case blockTypeRaw: + if cSize > maxCompressedBlockSize || cSize > int(b.WindowSize) { + if debugDecoder { + printf("rle block too big: csize:%d block: %+v\n", uint64(cSize), b) + } + return ErrWindowSizeExceeded + } + b.RLESize = 0 // We do not need a destination for raw blocks. maxSize = -1 @@ -167,16 +193,14 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { } // Read block data. - if cap(b.dataStorage) < cSize { + if _, ok := br.(*byteBuf); !ok && cap(b.dataStorage) < cSize { + // byteBuf doesn't need a destination buffer. if b.lowMem || cSize > maxCompressedBlockSize { - b.dataStorage = make([]byte, 0, cSize) + b.dataStorage = make([]byte, 0, cSize+compressedBlockOverAlloc) } else { - b.dataStorage = make([]byte, 0, maxCompressedBlockSize) + b.dataStorage = make([]byte, 0, maxCompressedBlockSizeAlloc) } } - if cap(b.dst) <= maxSize { - b.dst = make([]byte, 0, maxSize+1) - } b.data, err = br.readBig(cSize, b.dataStorage) if err != nil { if debugDecoder { @@ -185,6 +209,9 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { } return err } + if cap(b.dst) <= maxSize { + b.dst = make([]byte, 0, maxSize+1) + } return nil } @@ -193,85 +220,14 @@ func (b *blockDec) sendErr(err error) { b.Last = true b.Type = blockTypeReserved b.err = err - b.input <- struct{}{} } // Close will release resources. // Closed blockDec cannot be reset. func (b *blockDec) Close() { - close(b.input) - close(b.history) - close(b.result) - b.decWG.Wait() } -// decodeAsync will prepare decoding the block when it receives input. -// This will separate output and history. -func (b *blockDec) startDecoder() { - defer b.decWG.Done() - for range b.input { - //println("blockDec: Got block input") - switch b.Type { - case blockTypeRLE: - if cap(b.dst) < int(b.RLESize) { - if b.lowMem { - b.dst = make([]byte, b.RLESize) - } else { - b.dst = make([]byte, maxBlockSize) - } - } - o := decodeOutput{ - d: b, - b: b.dst[:b.RLESize], - err: nil, - } - v := b.data[0] - for i := range o.b { - o.b[i] = v - } - hist := <-b.history - hist.append(o.b) - b.result <- o - case blockTypeRaw: - o := decodeOutput{ - d: b, - b: b.data, - err: nil, - } - hist := <-b.history - hist.append(o.b) - b.result <- o - case blockTypeCompressed: - b.dst = b.dst[:0] - err := b.decodeCompressed(nil) - o := decodeOutput{ - d: b, - b: b.dst, - err: err, - } - if debugDecoder { - println("Decompressed to", len(b.dst), "bytes, error:", err) - } - b.result <- o - case blockTypeReserved: - // Used for returning errors. - <-b.history - b.result <- decodeOutput{ - d: b, - b: nil, - err: b.err, - } - default: - panic("Invalid block type") - } - if debugDecoder { - println("blockDec: Finished block") - } - } -} - -// decodeAsync will prepare decoding the block when it receives the history. -// If history is provided, it will not fetch it from the channel. +// decodeBuf func (b *blockDec) decodeBuf(hist *history) error { switch b.Type { case blockTypeRLE: @@ -279,7 +235,7 @@ func (b *blockDec) decodeBuf(hist *history) error { if b.lowMem { b.dst = make([]byte, b.RLESize) } else { - b.dst = make([]byte, maxBlockSize) + b.dst = make([]byte, maxCompressedBlockSize) } } b.dst = b.dst[:b.RLESize] @@ -294,14 +250,23 @@ func (b *blockDec) decodeBuf(hist *history) error { return nil case blockTypeCompressed: saved := b.dst - b.dst = hist.b - hist.b = nil + // Append directly to history + if hist.ignoreBuffer == 0 { + b.dst = hist.b + hist.b = nil + } else { + b.dst = b.dst[:0] + } err := b.decodeCompressed(hist) if debugDecoder { println("Decompressed to total", len(b.dst), "bytes, hash:", xxhash.Sum64(b.dst), "error:", err) } - hist.b = b.dst - b.dst = saved + if hist.ignoreBuffer == 0 { + hist.b = b.dst + b.dst = saved + } else { + hist.appendKeep(b.dst) + } return err case blockTypeReserved: // Used for returning errors. @@ -311,30 +276,18 @@ func (b *blockDec) decodeBuf(hist *history) error { } } -// decodeCompressed will start decompressing a block. -// If no history is supplied the decoder will decodeAsync as much as possible -// before fetching from blockDec.history -func (b *blockDec) decodeCompressed(hist *history) error { - in := b.data - delayedHistory := hist == nil - - if delayedHistory { - // We must always grab history. - defer func() { - if hist == nil { - <-b.history - } - }() - } +func (b *blockDec) decodeLiterals(in []byte, hist *history) (remain []byte, err error) { // There must be at least one byte for Literals_Block_Type and one for Sequences_Section_Header if len(in) < 2 { - return ErrBlockTooSmall + return in, ErrBlockTooSmall } + litType := literalsBlockType(in[0] & 3) var litRegenSize int var litCompSize int sizeFormat := (in[0] >> 2) & 3 var fourStreams bool + var literals []byte switch litType { case literalsBlockRaw, literalsBlockRLE: switch sizeFormat { @@ -350,7 +303,7 @@ func (b *blockDec) decodeCompressed(hist *history) error { // Regenerated_Size uses 20 bits (0-1048575). Literals_Section_Header uses 3 bytes. if len(in) < 3 { println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } litRegenSize = int(in[0]>>4) + (int(in[1]) << 4) + (int(in[2]) << 12) in = in[3:] @@ -361,7 +314,7 @@ func (b *blockDec) decodeCompressed(hist *history) error { // Both Regenerated_Size and Compressed_Size use 10 bits (0-1023). if len(in) < 3 { println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) litRegenSize = int(n & 1023) @@ -372,7 +325,7 @@ func (b *blockDec) decodeCompressed(hist *history) error { fourStreams = true if len(in) < 4 { println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) + (uint64(in[3]) << 20) litRegenSize = int(n & 16383) @@ -382,7 +335,7 @@ func (b *blockDec) decodeCompressed(hist *history) error { fourStreams = true if len(in) < 5 { println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) + (uint64(in[3]) << 20) + (uint64(in[4]) << 28) litRegenSize = int(n & 262143) @@ -393,13 +346,15 @@ func (b *blockDec) decodeCompressed(hist *history) error { if debugDecoder { println("literals type:", litType, "litRegenSize:", litRegenSize, "litCompSize:", litCompSize, "sizeFormat:", sizeFormat, "4X:", fourStreams) } - var literals []byte - var huff *huff0.Scratch + if litRegenSize > int(b.WindowSize) || litRegenSize > maxCompressedBlockSize { + return in, ErrWindowSizeExceeded + } + switch litType { case literalsBlockRaw: if len(in) < litRegenSize { println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litRegenSize) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } literals = in[:litRegenSize] in = in[litRegenSize:] @@ -407,19 +362,13 @@ func (b *blockDec) decodeCompressed(hist *history) error { case literalsBlockRLE: if len(in) < 1 { println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", 1) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } if cap(b.literalBuf) < litRegenSize { if b.lowMem { - b.literalBuf = make([]byte, litRegenSize) + b.literalBuf = make([]byte, litRegenSize, litRegenSize+compressedBlockOverAlloc) } else { - if litRegenSize > maxCompressedLiteralSize { - // Exceptional - b.literalBuf = make([]byte, litRegenSize) - } else { - b.literalBuf = make([]byte, litRegenSize, maxCompressedLiteralSize) - - } + b.literalBuf = make([]byte, litRegenSize, maxCompressedBlockSize+compressedBlockOverAlloc) } } literals = b.literalBuf[:litRegenSize] @@ -434,7 +383,7 @@ func (b *blockDec) decodeCompressed(hist *history) error { case literalsBlockTreeless: if len(in) < litCompSize { println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litCompSize) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } // Store compressed literals, so we defer decoding until we get history. literals = in[:litCompSize] @@ -442,31 +391,68 @@ func (b *blockDec) decodeCompressed(hist *history) error { if debugDecoder { printf("Found %d compressed literals\n", litCompSize) } + huff := hist.huffTree + if huff == nil { + return in, errors.New("literal block was treeless, but no history was defined") + } + // Ensure we have space to store it. + if cap(b.literalBuf) < litRegenSize { + if b.lowMem { + b.literalBuf = make([]byte, 0, litRegenSize+compressedBlockOverAlloc) + } else { + b.literalBuf = make([]byte, 0, maxCompressedBlockSize+compressedBlockOverAlloc) + } + } + var err error + // Use our out buffer. + huff.MaxDecodedSize = litRegenSize + if fourStreams { + literals, err = huff.Decoder().Decompress4X(b.literalBuf[:0:litRegenSize], literals) + } else { + literals, err = huff.Decoder().Decompress1X(b.literalBuf[:0:litRegenSize], literals) + } + // Make sure we don't leak our literals buffer + if err != nil { + println("decompressing literals:", err) + return in, err + } + if len(literals) != litRegenSize { + return in, fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) + } + case literalsBlockCompressed: if len(in) < litCompSize { println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litCompSize) - return ErrBlockTooSmall + return in, ErrBlockTooSmall } literals = in[:litCompSize] in = in[litCompSize:] - huff = huffDecoderPool.Get().(*huff0.Scratch) - var err error // Ensure we have space to store it. if cap(b.literalBuf) < litRegenSize { if b.lowMem { - b.literalBuf = make([]byte, 0, litRegenSize) + b.literalBuf = make([]byte, 0, litRegenSize+compressedBlockOverAlloc) } else { - b.literalBuf = make([]byte, 0, maxCompressedLiteralSize) + b.literalBuf = make([]byte, 0, maxCompressedBlockSize+compressedBlockOverAlloc) } } - if huff == nil { - huff = &huff0.Scratch{} + huff := hist.huffTree + if huff == nil || (hist.dict != nil && huff == hist.dict.litEnc) { + huff = huffDecoderPool.Get().(*huff0.Scratch) + if huff == nil { + huff = &huff0.Scratch{} + } + } + 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) - return err + return in, err } + hist.huffTree = huff + huff.MaxDecodedSize = litRegenSize // Use our out buffer. if fourStreams { literals, err = huff.Decoder().Decompress4X(b.literalBuf[:0:litRegenSize], literals) @@ -475,27 +461,63 @@ func (b *blockDec) decodeCompressed(hist *history) error { } if err != nil { println("decoding compressed literals:", err) - return err + return in, err } // Make sure we don't leak our literals buffer if len(literals) != litRegenSize { - return fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) + return in, fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) } + // Re-cap to get extra size. + literals = b.literalBuf[:len(literals)] if debugDecoder { printf("Decompressed %d literals into %d bytes\n", litCompSize, litRegenSize) } } + hist.decoders.literals = literals + return in, nil +} + +// decodeCompressed will start decompressing a block. +func (b *blockDec) decodeCompressed(hist *history) error { + in := b.data + in, err := b.decodeLiterals(in, hist) + if err != nil { + return err + } + err = b.prepareSequences(in, hist) + if err != nil { + return err + } + if hist.decoders.nSeqs == 0 { + b.dst = append(b.dst, hist.decoders.literals...) + return nil + } + before := len(hist.decoders.out) + err = hist.decoders.decodeSync(hist.b[hist.ignoreBuffer:]) + if err != nil { + return err + } + if hist.decoders.maxSyncLen > 0 { + hist.decoders.maxSyncLen += uint64(before) + hist.decoders.maxSyncLen -= uint64(len(hist.decoders.out)) + } + b.dst = hist.decoders.out + hist.recentOffsets = hist.decoders.prevOffset + return nil +} +func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) { + if debugDecoder { + printf("prepareSequences: %d byte(s) input\n", len(in)) + } // Decode Sequences // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#sequences-section if len(in) < 1 { return ErrBlockTooSmall } + var nSeqs int seqHeader := in[0] - nSeqs := 0 switch { - case seqHeader == 0: - in = in[1:] case seqHeader < 128: nSeqs = int(seqHeader) in = in[1:] @@ -512,19 +534,16 @@ func (b *blockDec) decodeCompressed(hist *history) error { nSeqs = 0x7f00 + int(in[1]) + (int(in[2]) << 8) in = in[3:] } - // Allocate sequences - if cap(b.sequenceBuf) < nSeqs { - if b.lowMem { - b.sequenceBuf = make([]seq, nSeqs) - } else { - // Allocate max - b.sequenceBuf = make([]seq, nSeqs, maxSequences) + if nSeqs == 0 && len(in) != 0 { + // When no sequences, there should not be any more data... + if debugDecoder { + printf("prepareSequences: 0 sequences, but %d byte(s) left on stream\n", len(in)) } - } else { - // Reuse buffer - b.sequenceBuf = b.sequenceBuf[:nSeqs] + return ErrUnexpectedBlockSize } - var seqs = &sequenceDecs{} + + var seqs = &hist.decoders + seqs.nSeqs = nSeqs if nSeqs > 0 { if len(in) < 1 { return ErrBlockTooSmall @@ -553,6 +572,9 @@ func (b *blockDec) decodeCompressed(hist *history) error { } switch mode { case compModePredefined: + if seq.fse != nil && !seq.fse.preDefined { + fseDecoderPool.Put(seq.fse) + } seq.fse = &fsePredef[i] case compModeRLE: if br.remain() < 1 { @@ -560,34 +582,36 @@ func (b *blockDec) decodeCompressed(hist *history) error { } v := br.Uint8() br.advance(1) - dec := fseDecoderPool.Get().(*fseDecoder) + if seq.fse == nil || seq.fse.preDefined { + seq.fse = fseDecoderPool.Get().(*fseDecoder) + } symb, err := decSymbolValue(v, symbolTableX[i]) if err != nil { printf("RLE Transform table (%v) error: %v", tableIndex(i), err) return err } - dec.setRLE(symb) - seq.fse = dec + seq.fse.setRLE(symb) if debugDecoder { printf("RLE set to %+v, code: %v", symb, v) } case compModeFSE: println("Reading table for", tableIndex(i)) - dec := fseDecoderPool.Get().(*fseDecoder) - err := dec.readNCount(&br, uint16(maxTableSymbol[i])) + if seq.fse == nil || seq.fse.preDefined { + seq.fse = fseDecoderPool.Get().(*fseDecoder) + } + err := seq.fse.readNCount(&br, uint16(maxTableSymbol[i])) if err != nil { println("Read table error:", err) return err } - err = dec.transform(symbolTableX[i]) + err = seq.fse.transform(symbolTableX[i]) if err != nil { println("Transform table error:", err) return err } if debugDecoder { - println("Read table ok", "symbolLen:", dec.symbolLen) + println("Read table ok", "symbolLen:", seq.fse.symbolLen) } - seq.fse = dec case compModeRepeat: seq.repeat = true } @@ -597,140 +621,106 @@ func (b *blockDec) decodeCompressed(hist *history) error { } in = br.unread() } - - // Wait for history. - // All time spent after this is critical since it is strictly sequential. - if hist == nil { - hist = <-b.history - if hist.error { - return ErrDecoderClosed - } - } - - // Decode treeless literal block. - if litType == literalsBlockTreeless { - // TODO: We could send the history early WITHOUT the stream history. - // This would allow decoding treeless literals before the byte history is available. - // Silencia stats: Treeless 4393, with: 32775, total: 37168, 11% treeless. - // So not much obvious gain here. - - if hist.huffTree == nil { - return errors.New("literal block was treeless, but no history was defined") - } - // Ensure we have space to store it. - if cap(b.literalBuf) < litRegenSize { - if b.lowMem { - b.literalBuf = make([]byte, 0, litRegenSize) - } else { - b.literalBuf = make([]byte, 0, maxCompressedLiteralSize) - } - } - var err error - // Use our out buffer. - huff = hist.huffTree - if fourStreams { - literals, err = huff.Decoder().Decompress4X(b.literalBuf[:0:litRegenSize], literals) - } else { - literals, err = huff.Decoder().Decompress1X(b.literalBuf[:0:litRegenSize], literals) - } - // Make sure we don't leak our literals buffer - if err != nil { - println("decompressing literals:", err) - return err - } - if len(literals) != litRegenSize { - return fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) - } - } else { - if hist.huffTree != nil && huff != nil { - if hist.dict == nil || hist.dict.litEnc != hist.huffTree { - huffDecoderPool.Put(hist.huffTree) - } - hist.huffTree = nil - } - } - if huff != nil { - hist.huffTree = huff - } if debugDecoder { - println("Final literals:", len(literals), "hash:", xxhash.Sum64(literals), "and", nSeqs, "sequences.") + println("Literals:", len(seqs.literals), "hash:", xxhash.Sum64(seqs.literals), "and", seqs.nSeqs, "sequences.") } if nSeqs == 0 { - // Decompressed content is defined entirely as Literals Section content. - b.dst = append(b.dst, literals...) - if delayedHistory { - hist.append(literals) + if len(b.sequence) > 0 { + b.sequence = b.sequence[:0] } return nil } + br := seqs.br + if br == nil { + br = &bitReader{} + } + if err := br.init(in); err != nil { + return err + } - seqs, err := seqs.mergeHistory(&hist.decoders) - if err != nil { + if err := seqs.initialize(br, hist, b.dst); err != nil { + println("initializing sequences:", err) return err } - if debugDecoder { - println("History merged ok") + // Extract blocks... + if false && hist.dict == nil { + fatalErr := func(err error) { + if err != nil { + panic(err) + } + } + fn := fmt.Sprintf("n-%d-lits-%d-prev-%d-%d-%d-win-%d.blk", hist.decoders.nSeqs, len(hist.decoders.literals), hist.recentOffsets[0], hist.recentOffsets[1], hist.recentOffsets[2], hist.windowSize) + var buf bytes.Buffer + fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.litLengths.fse)) + fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.matchLengths.fse)) + fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.offsets.fse)) + buf.Write(in) + os.WriteFile(filepath.Join("testdata", "seqs", fn), buf.Bytes(), os.ModePerm) } - br := &bitReader{} - if err := br.init(in); err != nil { - return err + + return nil +} + +func (b *blockDec) decodeSequences(hist *history) error { + if cap(b.sequence) < hist.decoders.nSeqs { + if b.lowMem { + b.sequence = make([]seqVals, 0, hist.decoders.nSeqs) + } else { + b.sequence = make([]seqVals, 0, 0x7F00+0xffff) + } + } + b.sequence = b.sequence[:hist.decoders.nSeqs] + if hist.decoders.nSeqs == 0 { + hist.decoders.seqSize = len(hist.decoders.literals) + return nil } + hist.decoders.windowSize = hist.windowSize + hist.decoders.prevOffset = hist.recentOffsets - // TODO: Investigate if sending history without decoders are faster. - // This would allow the sequences to be decoded async and only have to construct stream history. - // If only recent offsets were not transferred, this would be an obvious win. - // Also, if first 3 sequences don't reference recent offsets, all sequences can be decoded. + err := hist.decoders.decode(b.sequence) + hist.recentOffsets = hist.decoders.prevOffset + return err +} +func (b *blockDec) executeSequences(hist *history) error { hbytes := hist.b if len(hbytes) > hist.windowSize { hbytes = hbytes[len(hbytes)-hist.windowSize:] - // We do not need history any more. + // We do not need history anymore. if hist.dict != nil { hist.dict.content = nil } } - - if err := seqs.initialize(br, hist, literals, b.dst); err != nil { - println("initializing sequences:", err) - return err - } - - err = seqs.decode(nSeqs, br, hbytes) + hist.decoders.windowSize = hist.windowSize + hist.decoders.out = b.dst[:0] + err := hist.decoders.execute(b.sequence, hbytes) if err != nil { return err } - if !br.finished() { - return fmt.Errorf("%d extra bits on block, should be 0", br.remain()) - } + return b.updateHistory(hist) +} - err = br.close() - if err != nil { - printf("Closing sequences: %v, %+v\n", err, *br) - } +func (b *blockDec) updateHistory(hist *history) error { if len(b.data) > maxCompressedBlockSize { return fmt.Errorf("compressed block size too large (%d)", len(b.data)) } // Set output and release references. - b.dst = seqs.out - seqs.out, seqs.literals, seqs.hist = nil, nil, nil + b.dst = hist.decoders.out + hist.recentOffsets = hist.decoders.prevOffset - if !delayedHistory { - // If we don't have delayed history, no need to update. - hist.recentOffsets = seqs.prevOffset - return nil - } if b.Last { // if last block we don't care about history. println("Last block, no history returned") hist.b = hist.b[:0] return nil + } else { + hist.append(b.dst) + if debugDecoder { + println("Finished block with ", len(b.sequence), "sequences. Added", len(b.dst), "to history, now length", len(hist.b)) + } } - hist.append(b.dst) - hist.recentOffsets = seqs.prevOffset - if debugDecoder { - println("Finished block with literals:", len(literals), "and", nSeqs, "sequences.") - } + hist.decoders.out, hist.decoders.literals = nil, nil return nil } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/blockenc.go b/tools/vendor/github.com/klauspost/compress/zstd/blockenc.go index 12e8f6f0b..fd4a36f73 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/blockenc.go +++ b/tools/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/tools/vendor/github.com/klauspost/compress/zstd/bytebuf.go b/tools/vendor/github.com/klauspost/compress/zstd/bytebuf.go index aab71c6cf..55a388553 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/bytebuf.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/bytebuf.go @@ -7,7 +7,6 @@ package zstd import ( "fmt" "io" - "io/ioutil" ) type byteBuffer interface { @@ -23,7 +22,7 @@ type byteBuffer interface { readByte() (byte, error) // Skip n bytes. - skipN(n int) error + skipN(n int64) error } // in-memory buffer @@ -52,23 +51,22 @@ func (b *byteBuf) readBig(n int, dst []byte) ([]byte, error) { return r, nil } -func (b *byteBuf) remain() []byte { - return *b -} - 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:] return r, nil } -func (b *byteBuf) skipN(n int) error { +func (b *byteBuf) skipN(n int64) error { bb := *b - if len(bb) < n { + if n < 0 { + return fmt.Errorf("negative skip (%d) requested", n) + } + if int64(len(bb)) < n { return io.ErrUnexpectedEOF } *b = bb[n:] @@ -111,8 +109,11 @@ 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 + } return 0, err } if n2 != 1 { @@ -121,9 +122,9 @@ func (r *readerWrapper) readByte() (byte, error) { return r.tmp[0], nil } -func (r *readerWrapper) skipN(n int) error { - n2, err := io.CopyN(ioutil.Discard, r.r, int64(n)) - if n2 != int64(n) { +func (r *readerWrapper) skipN(n int64) error { + n2, err := io.CopyN(io.Discard, r.r, n) + if n2 != n { err = io.ErrUnexpectedEOF } return err diff --git a/tools/vendor/github.com/klauspost/compress/zstd/bytereader.go b/tools/vendor/github.com/klauspost/compress/zstd/bytereader.go index 2c4fca17f..0e59a242d 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/bytereader.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/bytereader.go @@ -13,12 +13,6 @@ type byteReader struct { off int } -// init will initialize the reader and set the input. -func (b *byteReader) init(in []byte) { - b.b = in - b.off = 0 -} - // advance the stream b n bytes. func (b *byteReader) advance(n uint) { b.off += int(n) diff --git a/tools/vendor/github.com/klauspost/compress/zstd/decodeheader.go b/tools/vendor/github.com/klauspost/compress/zstd/decodeheader.go index 69736e8d4..f6a240970 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/decodeheader.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/decodeheader.go @@ -4,7 +4,7 @@ package zstd import ( - "bytes" + "encoding/binary" "errors" "io" ) @@ -15,18 +15,50 @@ const HeaderMaxSize = 14 + 3 // Header contains information about the first frame and block within that. type Header struct { - // Window Size the window of data to keep while decoding. - // Will only be set if HasFCS is false. - WindowSize uint64 + // SingleSegment specifies whether the data is to be decompressed into a + // single contiguous memory segment. + // It implies that WindowSize is invalid and that FrameContentSize is valid. + SingleSegment bool - // Frame content size. - // Expected size of the entire frame. - FrameContentSize uint64 + // WindowSize is the window of data to keep while decoding. + // Will only be set if SingleSegment is false. + WindowSize uint64 // Dictionary ID. // If 0, no dictionary. DictionaryID uint32 + // HasFCS specifies whether FrameContentSize has a valid value. + HasFCS bool + + // FrameContentSize is the expected uncompressed size of the entire frame. + FrameContentSize uint64 + + // Skippable will be true if the frame is meant to be skipped. + // This implies that FirstBlock.OK is false. + Skippable bool + + // SkippableID is the user-specific ID for the skippable frame. + // Valid values are between 0 to 15, inclusive. + SkippableID int + + // SkippableSize is the length of the user data to skip following + // the header. + SkippableSize uint32 + + // HeaderSize is the raw size of the frame header. + // + // For normal frames, it includes the size of the magic number and + // the size of the header (per section 3.1.1.1). + // It does not include the size for any data blocks (section 3.1.1.2) nor + // the size for the trailing content checksum. + // + // For skippable frames, this counts the size of the magic number + // along with the size of the size field of the payload. + // It does not include the size of the skippable payload itself. + // The total frame size is the HeaderSize plus the SkippableSize. + HeaderSize int + // First block information. FirstBlock struct { // OK will be set if first block could be decoded. @@ -51,17 +83,9 @@ type Header struct { CompressedSize int } - // Skippable will be true if the frame is meant to be skipped. - // No other information will be populated. - Skippable bool - // If set there is a checksum present for the block content. + // The checksum field at the end is always 4 bytes long. HasCheckSum bool - - // If this is true FrameContentSize will have a valid value - HasFCS bool - - SingleSegment bool } // Decode the header from the beginning of the stream. @@ -71,39 +95,46 @@ type Header struct { // If there isn't enough input, io.ErrUnexpectedEOF is returned. // The FirstBlock.OK will indicate if enough information was available to decode the first block header. func (h *Header) Decode(in []byte) error { + *h = Header{} if len(in) < 4 { return io.ErrUnexpectedEOF } + h.HeaderSize += 4 b, in := in[:4], in[4:] - if !bytes.Equal(b, frameMagic) { - if !bytes.Equal(b[1:4], skippableFrameMagic) || b[0]&0xf0 != 0x50 { + if string(b) != frameMagic { + if string(b[1:4]) != skippableFrameMagic || b[0]&0xf0 != 0x50 { return ErrMagicMismatch } - *h = Header{Skippable: true} + if len(in) < 4 { + return io.ErrUnexpectedEOF + } + h.HeaderSize += 4 + h.Skippable = true + h.SkippableID = int(b[0] & 0xf) + h.SkippableSize = binary.LittleEndian.Uint32(in) return nil } + + // Read Window_Descriptor + // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor if len(in) < 1 { return io.ErrUnexpectedEOF } - - // Clear output - *h = Header{} fhd, in := in[0], in[1:] + h.HeaderSize++ h.SingleSegment = fhd&(1<<5) != 0 h.HasCheckSum = fhd&(1<<2) != 0 - if fhd&(1<<3) != 0 { return errors.New("reserved bit set on frame header") } - // Read Window_Descriptor - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor if !h.SingleSegment { if len(in) < 1 { return io.ErrUnexpectedEOF } var wd byte wd, in = in[0], in[1:] + h.HeaderSize++ windowLog := 10 + (wd >> 3) windowBase := uint64(1) << windowLog windowAdd := (windowBase / 8) * uint64(wd&0x7) @@ -120,10 +151,8 @@ func (h *Header) Decode(in []byte) error { return io.ErrUnexpectedEOF } b, in = in[:size], in[size:] - if b == nil { - return io.ErrUnexpectedEOF - } - switch size { + h.HeaderSize += int(size) + switch len(b) { case 1: h.DictionaryID = uint32(b[0]) case 2: @@ -152,10 +181,8 @@ func (h *Header) Decode(in []byte) error { return io.ErrUnexpectedEOF } b, in = in[:fcsSize], in[fcsSize:] - if b == nil { - return io.ErrUnexpectedEOF - } - switch fcsSize { + h.HeaderSize += int(fcsSize) + switch len(b) { case 1: h.FrameContentSize = uint64(b[0]) case 2: diff --git a/tools/vendor/github.com/klauspost/compress/zstd/decoder.go b/tools/vendor/github.com/klauspost/compress/zstd/decoder.go index f430f58b5..f04aaa21e 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/decoder.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/decoder.go @@ -5,9 +5,12 @@ package zstd import ( - "errors" + "context" + "encoding/binary" "io" "sync" + + "github.com/klauspost/compress/zstd/internal/xxhash" ) // Decoder provides decoding of zstandard streams. @@ -22,15 +25,22 @@ type Decoder struct { // Unreferenced decoders, ready for use. decoders chan *blockDec - // Streams ready to be decoded. - stream chan decodeStream - // Current read position used for Reader functionality. current decoderState + // sync stream decoding + syncStream struct { + decodedFrame uint64 + br readerWrapper + enabled bool + inFrame bool + dstBuf []byte + } + + frame *frameDec + // Custom dictionaries. - // Always uses copies. - dicts map[uint32]dict + dicts map[uint32]*dict // streamWg is the waitgroup for all streams streamWg sync.WaitGroup @@ -46,7 +56,10 @@ type decoderState struct { output chan decodeOutput // cancel remaining output. - cancel chan struct{} + cancel context.CancelFunc + + // crc of current frame + crc *xxhash.Digest flushed bool } @@ -81,7 +94,7 @@ func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) { return nil, err } } - d.current.output = make(chan decodeOutput, d.o.concurrent) + d.current.crc = xxhash.New() d.current.flushed = true if r == nil { @@ -89,7 +102,7 @@ func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) { } // Transfer option dicts. - d.dicts = make(map[uint32]dict, len(d.o.dicts)) + d.dicts = make(map[uint32]*dict, len(d.o.dicts)) for _, dc := range d.o.dicts { d.dicts[dc.id] = dc } @@ -130,7 +143,7 @@ func (d *Decoder) Read(p []byte) (int, error) { break } if !d.nextBlock(n == 0) { - return n, nil + return n, d.current.err } } } @@ -162,6 +175,7 @@ func (d *Decoder) Reset(r io.Reader) error { d.drainOutput() + d.syncStream.br.r = nil if r == nil { d.current.err = ErrDecoderNilInput if len(d.current.b) > 0 { @@ -172,21 +186,23 @@ func (d *Decoder) Reset(r io.Reader) error { } // If bytes buffer and < 5MB, do sync decoding anyway. - if bb, ok := r.(byter); ok && bb.Len() < 5<<20 { + if bb, ok := r.(byter); ok && bb.Len() < d.o.decodeBufsBelow && !d.o.limitToCap { bb2 := bb if debugDecoder { println("*bytes.Buffer detected, doing sync decode, len:", bb.Len()) } b := bb2.Bytes() var dst []byte - if cap(d.current.b) > 0 { - dst = d.current.b + if cap(d.syncStream.dstBuf) > 0 { + dst = d.syncStream.dstBuf[:0] } - dst, err := d.DecodeAll(b, dst[:0]) + dst, err := d.DecodeAll(b, dst) if err == nil { err = io.EOF } + // Save output buffer + d.syncStream.dstBuf = dst d.current.b = dst d.current.err = err d.current.flushed = true @@ -195,33 +211,40 @@ func (d *Decoder) Reset(r io.Reader) error { } return nil } - - if d.stream == nil { - d.stream = make(chan decodeStream, 1) - d.streamWg.Add(1) - go d.startStreamDecoder(d.stream) - } - // Remove current block. + d.stashDecoder() d.current.decodeOutput = decodeOutput{} d.current.err = nil - d.current.cancel = make(chan struct{}) d.current.flushed = false d.current.d = nil + d.syncStream.dstBuf = nil - d.stream <- decodeStream{ - r: r, - output: d.current.output, - cancel: d.current.cancel, + // Ensure no-one else is still running... + d.streamWg.Wait() + if d.frame == nil { + d.frame = newFrameDec(d.o) } + + if d.o.concurrent == 1 { + return d.startSyncDecoder(r) + } + + d.current.output = make(chan decodeOutput, d.o.concurrent) + ctx, cancel := context.WithCancel(context.Background()) + d.current.cancel = cancel + d.streamWg.Add(1) + go d.startStreamDecoder(ctx, r, d.current.output) + return nil } // drainOutput will drain the output until errEndOfStream is sent. func (d *Decoder) drainOutput() { if d.current.cancel != nil { - println("cancelling current") - close(d.current.cancel) + if debugDecoder { + println("cancelling current") + } + d.current.cancel() d.current.cancel = nil } if d.current.d != nil { @@ -243,12 +266,9 @@ func (d *Decoder) drainOutput() { } d.decoders <- v.d } - if v.err == errEndOfStream { - println("current flushed") - d.current.flushed = true - return - } } + d.current.output = nil + d.current.flushed = true } // WriteTo writes data to w until there's no more data to write or when an error occurs. @@ -287,19 +307,23 @@ func (d *Decoder) WriteTo(w io.Writer) (int64, error) { // DecodeAll can be used concurrently. // The Decoder concurrency limits will be respected. func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) { - if d.current.err == ErrDecoderClosed { + if d.decoders == nil { return dst, ErrDecoderClosed } // Grab a block decoder and frame decoder. block := <-d.decoders frame := block.localFrame + initialSize := len(dst) defer func() { if debugDecoder { printf("re-adding decoder: %p", block) } frame.rawInput = nil frame.bBuf = nil + if frame.history.decoders.br != nil { + frame.history.decoders.br.in = nil + } d.decoders <- block }() frame.bBuf = input @@ -307,34 +331,45 @@ func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) { for { frame.history.reset() err := frame.reset(&frame.bBuf) - if err == io.EOF { - if debugDecoder { - println("frame reset return EOF") - } - return dst, nil - } - if frame.DictionaryID != nil { - dict, ok := d.dicts[*frame.DictionaryID] - if !ok { - return nil, ErrUnknownDictionary - } - frame.history.setDict(&dict) - } if err != nil { + if err == io.EOF { + if debugDecoder { + println("frame reset return EOF") + } + return dst, nil + } return dst, err } - if frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)) { - return dst, ErrDecoderSizeExceeded + if err = d.setDict(frame); err != nil { + return nil, err } - if frame.FrameContentSize > 0 && frame.FrameContentSize < 1<<30 { - // Never preallocate moe than 1 GB up front. + if frame.WindowSize > d.o.maxWindowSize { + if debugDecoder { + println("window size exceeded:", frame.WindowSize, ">", d.o.maxWindowSize) + } + return dst, ErrWindowSizeExceeded + } + if frame.FrameContentSize != fcsUnknown { + if frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)-initialSize) { + if debugDecoder { + println("decoder size exceeded; fcs:", frame.FrameContentSize, "> mcs:", d.o.maxDecodedSize-uint64(len(dst)-initialSize), "len:", len(dst)) + } + return dst, ErrDecoderSizeExceeded + } + if d.o.limitToCap && frame.FrameContentSize > uint64(cap(dst)-len(dst)) { + if debugDecoder { + println("decoder size exceeded; fcs:", frame.FrameContentSize, "> (cap-len)", cap(dst)-len(dst)) + } + return dst, ErrDecoderSizeExceeded + } if cap(dst)-len(dst) < int(frame.FrameContentSize) { - dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize)) + dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize)+compressedBlockOverAlloc) copy(dst2, dst) dst = dst2 } } - if cap(dst) == 0 { + + if cap(dst) == 0 && !d.o.limitToCap { // Allocate len(input) * 2 by default if nothing is provided // and we didn't get frame content size. size := len(input) * 2 @@ -352,6 +387,9 @@ func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) { if err != nil { return dst, err } + if uint64(len(dst)-initialSize) > d.o.maxDecodedSize { + return dst, ErrDecoderSizeExceeded + } if len(frame.bBuf) == 0 { if debugDecoder { println("frame dbuf empty") @@ -368,33 +406,167 @@ func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) { // If non-blocking mode is used the returned boolean will be false // if no data was available without blocking. func (d *Decoder) nextBlock(blocking bool) (ok bool) { - if d.current.d != nil { - if debugDecoder { - printf("re-adding current decoder %p", d.current.d) - } - d.decoders <- d.current.d - d.current.d = nil - } if d.current.err != nil { // Keep error state. - return blocking + return false } + d.current.b = d.current.b[:0] + // SYNC: + if d.syncStream.enabled { + if !blocking { + return false + } + ok = d.nextBlockSync() + if !ok { + d.stashDecoder() + } + return ok + } + + //ASYNC: + d.stashDecoder() if blocking { - d.current.decodeOutput = <-d.current.output + d.current.decodeOutput, ok = <-d.current.output } else { select { - case d.current.decodeOutput = <-d.current.output: + case d.current.decodeOutput, ok = <-d.current.output: default: return false } } + if !ok { + // This should not happen, so signal error state... + d.current.err = io.ErrUnexpectedEOF + return false + } + next := d.current.decodeOutput + if next.d != nil && next.d.async.newHist != nil { + d.current.crc.Reset() + } if debugDecoder { - println("got", len(d.current.b), "bytes, error:", d.current.err) + var tmp [4]byte + binary.LittleEndian.PutUint32(tmp[:], uint32(xxhash.Sum64(next.b))) + println("got", len(d.current.b), "bytes, error:", d.current.err, "data crc:", tmp) + } + + if d.o.ignoreChecksum { + return true + } + + if len(next.b) > 0 { + d.current.crc.Write(next.b) + } + if next.err == nil && next.d != nil && next.d.hasCRC { + got := uint32(d.current.crc.Sum64()) + if got != next.d.checkCRC { + if debugDecoder { + printf("CRC Check Failed: %08x (got) != %08x (on stream)\n", got, next.d.checkCRC) + } + d.current.err = ErrCRCMismatch + } else { + if debugDecoder { + printf("CRC ok %08x\n", got) + } + } + } + + return true +} + +func (d *Decoder) nextBlockSync() (ok bool) { + if d.current.d == nil { + d.current.d = <-d.decoders + } + for len(d.current.b) == 0 { + if !d.syncStream.inFrame { + d.frame.history.reset() + d.current.err = d.frame.reset(&d.syncStream.br) + if d.current.err == nil { + d.current.err = d.setDict(d.frame) + } + if d.current.err != nil { + return false + } + if d.frame.WindowSize > d.o.maxDecodedSize || d.frame.WindowSize > d.o.maxWindowSize { + d.current.err = ErrDecoderSizeExceeded + return false + } + + d.syncStream.decodedFrame = 0 + d.syncStream.inFrame = true + } + d.current.err = d.frame.next(d.current.d) + if d.current.err != nil { + return false + } + d.frame.history.ensureBlock() + if debugDecoder { + println("History trimmed:", len(d.frame.history.b), "decoded already:", d.syncStream.decodedFrame) + } + histBefore := len(d.frame.history.b) + d.current.err = d.current.d.decodeBuf(&d.frame.history) + + if d.current.err != nil { + println("error after:", d.current.err) + return false + } + d.current.b = d.frame.history.b[histBefore:] + if debugDecoder { + println("history after:", len(d.frame.history.b)) + } + + // Check frame size (before CRC) + d.syncStream.decodedFrame += uint64(len(d.current.b)) + if d.syncStream.decodedFrame > d.frame.FrameContentSize { + if debugDecoder { + printf("DecodedFrame (%d) > FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize) + } + d.current.err = ErrFrameSizeExceeded + return false + } + + // Check FCS + if d.current.d.Last && d.frame.FrameContentSize != fcsUnknown && d.syncStream.decodedFrame != d.frame.FrameContentSize { + if debugDecoder { + printf("DecodedFrame (%d) != FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize) + } + d.current.err = ErrFrameSizeMismatch + return false + } + + // Update/Check CRC + if d.frame.HasCheckSum { + if !d.o.ignoreChecksum { + d.frame.crc.Write(d.current.b) + } + if d.current.d.Last { + if !d.o.ignoreChecksum { + d.current.err = d.frame.checkCRC() + } else { + d.current.err = d.frame.consumeCRC() + } + if d.current.err != nil { + println("CRC error:", d.current.err) + return false + } + } + } + d.syncStream.inFrame = !d.current.d.Last } return true } +func (d *Decoder) stashDecoder() { + if d.current.d != nil { + if debugDecoder { + printf("re-adding current decoder %p", d.current.d) + } + d.decoders <- d.current.d + d.current.d = nil + } +} + // Close will release all resources. // It is NOT possible to reuse the decoder after this. func (d *Decoder) Close() { @@ -402,10 +574,10 @@ func (d *Decoder) Close() { return } d.drainOutput() - if d.stream != nil { - close(d.stream) + if d.current.cancel != nil { + d.current.cancel() d.streamWg.Wait() - d.stream = nil + d.current.cancel = nil } if d.decoders != nil { close(d.decoders) @@ -456,100 +628,321 @@ type decodeOutput struct { err error } -type decodeStream struct { - r io.Reader - - // Blocks ready to be written to output. - output chan decodeOutput - - // cancel reading from the input - cancel chan struct{} +func (d *Decoder) startSyncDecoder(r io.Reader) error { + d.frame.history.reset() + d.syncStream.br = readerWrapper{r: r} + d.syncStream.inFrame = false + d.syncStream.enabled = true + d.syncStream.decodedFrame = 0 + return nil } -// errEndOfStream indicates that everything from the stream was read. -var errEndOfStream = errors.New("end-of-stream") - // Create Decoder: -// Spawn n block decoders. These accept tasks to decode a block. -// Create goroutine that handles stream processing, this will send history to decoders as they are available. -// Decoders update the history as they decode. -// When a block is returned: -// a) history is sent to the next decoder, -// b) content written to CRC. -// c) return data to WRITER. -// d) wait for next block to return data. -// Once WRITTEN, the decoders reused by the writer frame decoder for re-use. -func (d *Decoder) startStreamDecoder(inStream chan decodeStream) { +// ASYNC: +// Spawn 3 go routines. +// 0: Read frames and decode block literals. +// 1: Decode sequences. +// 2: Execute sequences, send to output. +func (d *Decoder) startStreamDecoder(ctx context.Context, r io.Reader, output chan decodeOutput) { defer d.streamWg.Done() - frame := newFrameDec(d.o) - for stream := range inStream { - if debugDecoder { - println("got new stream") + br := readerWrapper{r: r} + + var seqDecode = make(chan *blockDec, d.o.concurrent) + var seqExecute = make(chan *blockDec, d.o.concurrent) + + // Async 1: Decode sequences... + go func() { + var hist history + var hasErr bool + + for block := range seqDecode { + if hasErr { + if block != nil { + seqExecute <- block + } + continue + } + if block.async.newHist != nil { + if debugDecoder { + println("Async 1: new history, recent:", block.async.newHist.recentOffsets) + } + hist.reset() + hist.decoders = block.async.newHist.decoders + hist.recentOffsets = block.async.newHist.recentOffsets + hist.windowSize = block.async.newHist.windowSize + if block.async.newHist.dict != nil { + hist.setDict(block.async.newHist.dict) + } + } + if block.err != nil || block.Type != blockTypeCompressed { + hasErr = block.err != nil + seqExecute <- block + continue + } + + hist.decoders.literals = block.async.literals + block.err = block.prepareSequences(block.async.seqData, &hist) + if debugDecoder && block.err != nil { + println("prepareSequences returned:", block.err) + } + hasErr = block.err != nil + if block.err == nil { + block.err = block.decodeSequences(&hist) + if debugDecoder && block.err != nil { + println("decodeSequences returned:", block.err) + } + hasErr = block.err != nil + // block.async.sequence = hist.decoders.seq[:hist.decoders.nSeqs] + block.async.seqSize = hist.decoders.seqSize + } + seqExecute <- block } - br := readerWrapper{r: stream.r} - decodeStream: - for { - frame.history.reset() - err := frame.reset(&br) - if debugDecoder && err != nil { - println("Frame decoder returned", err) + close(seqExecute) + hist.reset() + }() + + var wg sync.WaitGroup + wg.Add(1) + + // Async 3: Execute sequences... + frameHistCache := d.frame.history.b + go func() { + var hist history + var decodedFrame uint64 + var fcs uint64 + var hasErr bool + for block := range seqExecute { + out := decodeOutput{err: block.err, d: block} + if block.err != nil || hasErr { + hasErr = true + output <- out + continue + } + if block.async.newHist != nil { + if debugDecoder { + println("Async 2: new history") + } + hist.reset() + hist.windowSize = block.async.newHist.windowSize + hist.allocFrameBuffer = block.async.newHist.allocFrameBuffer + if block.async.newHist.dict != nil { + hist.setDict(block.async.newHist.dict) + } + + if cap(hist.b) < hist.allocFrameBuffer { + if cap(frameHistCache) >= hist.allocFrameBuffer { + hist.b = frameHistCache + } else { + hist.b = make([]byte, 0, hist.allocFrameBuffer) + println("Alloc history sized", hist.allocFrameBuffer) + } + } + hist.b = hist.b[:0] + fcs = block.async.fcs + decodedFrame = 0 } - if err == nil && frame.DictionaryID != nil { - dict, ok := d.dicts[*frame.DictionaryID] - if !ok { - err = ErrUnknownDictionary + do := decodeOutput{err: block.err, d: block} + switch block.Type { + case blockTypeRLE: + if debugDecoder { + println("add rle block length:", block.RLESize) + } + + if cap(block.dst) < int(block.RLESize) { + if block.lowMem { + block.dst = make([]byte, block.RLESize) + } else { + block.dst = make([]byte, maxCompressedBlockSize) + } + } + block.dst = block.dst[:block.RLESize] + v := block.data[0] + for i := range block.dst { + block.dst[i] = v + } + hist.append(block.dst) + do.b = block.dst + case blockTypeRaw: + if debugDecoder { + println("add raw block length:", len(block.data)) + } + hist.append(block.data) + do.b = block.data + case blockTypeCompressed: + if debugDecoder { + println("execute with history length:", len(hist.b), "window:", hist.windowSize) + } + hist.decoders.seqSize = block.async.seqSize + hist.decoders.literals = block.async.literals + do.err = block.executeSequences(&hist) + hasErr = do.err != nil + if debugDecoder && hasErr { + println("executeSequences returned:", do.err) + } + do.b = block.dst + } + if !hasErr { + decodedFrame += uint64(len(do.b)) + if decodedFrame > fcs { + println("fcs exceeded", block.Last, fcs, decodedFrame) + do.err = ErrFrameSizeExceeded + hasErr = true + } else if block.Last && fcs != fcsUnknown && decodedFrame != fcs { + do.err = ErrFrameSizeMismatch + hasErr = true } else { - frame.history.setDict(&dict) + if debugDecoder { + println("fcs ok", block.Last, fcs, decodedFrame) + } } } - if err != nil { - stream.output <- decodeOutput{ - err: err, + output <- do + } + close(output) + frameHistCache = hist.b + wg.Done() + if debugDecoder { + println("decoder goroutines finished") + } + hist.reset() + }() + + var hist history +decodeStream: + for { + var hasErr bool + hist.reset() + decodeBlock := func(block *blockDec) { + if hasErr { + if block != nil { + seqDecode <- block } - break + return } + if block.err != nil || block.Type != blockTypeCompressed { + hasErr = block.err != nil + seqDecode <- block + return + } + + remain, err := block.decodeLiterals(block.data, &hist) + block.err = err + hasErr = block.err != nil + if err == nil { + block.async.literals = hist.decoders.literals + block.async.seqData = remain + } else if debugDecoder { + println("decodeLiterals error:", err) + } + seqDecode <- block + } + frame := d.frame + if debugDecoder { + println("New frame...") + } + var historySent bool + frame.history.reset() + err := frame.reset(&br) + if debugDecoder && err != nil { + println("Frame decoder returned", err) + } + if err == nil { + err = d.setDict(frame) + } + if err == nil && d.frame.WindowSize > d.o.maxWindowSize { if debugDecoder { - println("starting frame decoder") - } - - // This goroutine will forward history between frames. - frame.frameDone.Add(1) - frame.initAsync() - - go frame.startDecoder(stream.output) - decodeFrame: - // Go through all blocks of the frame. - for { - dec := <-d.decoders - select { - case <-stream.cancel: - if !frame.sendErr(dec, io.EOF) { - // To not let the decoder dangle, send it back. - stream.output <- decodeOutput{d: dec} - } - break decodeStream - default: + println("decoder size exceeded, fws:", d.frame.WindowSize, "> mws:", d.o.maxWindowSize) + } + + err = ErrDecoderSizeExceeded + } + if err != nil { + select { + case <-ctx.Done(): + case dec := <-d.decoders: + dec.sendErr(err) + decodeBlock(dec) + } + break decodeStream + } + + // Go through all blocks of the frame. + for { + var dec *blockDec + select { + case <-ctx.Done(): + break decodeStream + case dec = <-d.decoders: + // Once we have a decoder, we MUST return it. + } + err := frame.next(dec) + if !historySent { + h := frame.history + if debugDecoder { + println("Alloc History:", h.allocFrameBuffer) + } + hist.reset() + if h.dict != nil { + hist.setDict(h.dict) } - err := frame.next(dec) - switch err { - case io.EOF: - // End of current frame, no error - println("EOF on next block") - break decodeFrame - case nil: - continue - default: - println("block decoder returned", err) - break decodeStream + dec.async.newHist = &h + dec.async.fcs = frame.FrameContentSize + historySent = true + } else { + dec.async.newHist = nil + } + if debugDecoder && err != nil { + println("next block returned error:", err) + } + dec.err = err + dec.hasCRC = false + if dec.Last && frame.HasCheckSum && err == nil { + crc, err := frame.rawInput.readSmall(4) + if len(crc) < 4 { + if err == nil { + err = io.ErrUnexpectedEOF + + } + println("CRC missing?", err) + dec.err = err + } else { + dec.checkCRC = binary.LittleEndian.Uint32(crc) + dec.hasCRC = true + if debugDecoder { + printf("found crc to check: %08x\n", dec.checkCRC) + } } } - // All blocks have started decoding, check if there are more frames. - println("waiting for done") - frame.frameDone.Wait() - println("done waiting...") + err = dec.err + last := dec.Last + decodeBlock(dec) + if err != nil { + break decodeStream + } + if last { + break + } } - frame.frameDone.Wait() - println("Sending EOS") - stream.output <- decodeOutput{err: errEndOfStream} } + close(seqDecode) + wg.Wait() + hist.reset() + d.frame.history.b = frameHistCache +} + +func (d *Decoder) setDict(frame *frameDec) (err error) { + dict, ok := d.dicts[frame.DictionaryID] + if ok { + if debugDecoder { + println("setting dict", frame.DictionaryID) + } + frame.history.setDict(dict) + } else if frame.DictionaryID != 0 { + // A zero or missing dictionary id is ambiguous: + // either dictionary zero, or no dictionary. In particular, + // zstd --patch-from uses this id for the source file, + // so only return an error if the dictionary id is not zero. + err = ErrUnknownDictionary + } + return err } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/decoder_options.go b/tools/vendor/github.com/klauspost/compress/zstd/decoder_options.go index 95cc9b8b8..07a90dd7a 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/decoder_options.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/decoder_options.go @@ -6,6 +6,8 @@ package zstd import ( "errors" + "fmt" + "math/bits" "runtime" ) @@ -14,21 +16,28 @@ type DOption func(*decoderOptions) error // options retains accumulated state of multiple options. type decoderOptions struct { - lowMem bool - concurrent int - maxDecodedSize uint64 - maxWindowSize uint64 - dicts []dict + lowMem bool + concurrent int + maxDecodedSize uint64 + maxWindowSize uint64 + dicts []*dict + ignoreChecksum bool + limitToCap bool + decodeBufsBelow int } func (o *decoderOptions) setDefault() { *o = decoderOptions{ // use less ram: true for now, but may change. - lowMem: true, - concurrent: runtime.GOMAXPROCS(0), - maxWindowSize: MaxWindowSize, + lowMem: true, + concurrent: runtime.GOMAXPROCS(0), + maxWindowSize: MaxWindowSize, + decodeBufsBelow: 128 << 10, } - o.maxDecodedSize = 1 << 63 + if o.concurrent > 4 { + o.concurrent = 4 + } + o.maxDecodedSize = 64 << 30 } // WithDecoderLowmem will set whether to use a lower amount of memory, @@ -37,16 +46,25 @@ func WithDecoderLowmem(b bool) DOption { return func(o *decoderOptions) error { o.lowMem = b; return nil } } -// WithDecoderConcurrency will set the concurrency, -// meaning the maximum number of decoders to run concurrently. -// The value supplied must be at least 1. -// By default this will be set to GOMAXPROCS. +// WithDecoderConcurrency sets the number of created decoders. +// When decoding block with DecodeAll, this will limit the number +// of possible concurrently running decodes. +// When decoding streams, this will limit the number of +// inflight blocks. +// When decoding streams and setting maximum to 1, +// no async decoding will be done. +// When a value of 0 is provided GOMAXPROCS will be used. +// By default this will be set to 4 or GOMAXPROCS, whatever is lower. func WithDecoderConcurrency(n int) DOption { return func(o *decoderOptions) error { - if n <= 0 { + if n < 0 { return errors.New("concurrency must be at least 1") } - o.concurrent = n + if n == 0 { + o.concurrent = runtime.GOMAXPROCS(0) + } else { + o.concurrent = n + } return nil } } @@ -54,7 +72,7 @@ func WithDecoderConcurrency(n int) DOption { // WithDecoderMaxMemory allows to set a maximum decoded size for in-memory // non-streaming operations or maximum window size for streaming operations. // This can be used to control memory usage of potentially hostile content. -// Maximum and default is 1 << 63 bytes. +// Maximum is 1 << 63 bytes. Default is 64GiB. func WithDecoderMaxMemory(n uint64) DOption { return func(o *decoderOptions) error { if n == 0 { @@ -69,7 +87,13 @@ func WithDecoderMaxMemory(n uint64) DOption { } // WithDecoderDicts allows to register one or more dictionaries for the decoder. -// If several dictionaries with the same ID is provided the last one will be used. +// +// Each slice in dict must be in the [dictionary format] produced by +// "zstd --train" from the Zstandard reference implementation. +// +// If several dictionaries with the same ID are provided, the last one will be used. +// +// [dictionary format]: https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-format func WithDecoderDicts(dicts ...[]byte) DOption { return func(o *decoderOptions) error { for _, b := range dicts { @@ -77,8 +101,20 @@ func WithDecoderDicts(dicts ...[]byte) DOption { if err != nil { return err } - o.dicts = append(o.dicts, *d) + o.dicts = append(o.dicts, d) + } + return nil + } +} + +// WithEncoderDictRaw 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 { + if bits.UintSize > 32 && uint(len(content)) > dictMaxLength { + return fmt.Errorf("dictionary of size %d > 2GiB too large", len(content)) } + o.dicts = append(o.dicts, &dict{id: id, content: content, offsets: [3]int{1, 4, 8}}) return nil } } @@ -100,3 +136,34 @@ func WithDecoderMaxWindow(size uint64) DOption { return nil } } + +// WithDecodeAllCapLimit will limit DecodeAll to decoding cap(dst)-len(dst) bytes, +// or any size set in WithDecoderMaxMemory. +// This can be used to limit decoding to a specific maximum output size. +// Disabled by default. +func WithDecodeAllCapLimit(b bool) DOption { + return func(o *decoderOptions) error { + o.limitToCap = b + return nil + } +} + +// WithDecodeBuffersBelow will fully decode readers that have a +// `Bytes() []byte` and `Len() int` interface similar to bytes.Buffer. +// This typically uses less allocations but will have the full decompressed object in memory. +// Note that DecodeAllCapLimit will disable this, as well as giving a size of 0 or less. +// Default is 128KiB. +func WithDecodeBuffersBelow(size int) DOption { + return func(o *decoderOptions) error { + o.decodeBufsBelow = size + return nil + } +} + +// IgnoreChecksum allows to forcibly ignore checksum checking. +func IgnoreChecksum(b bool) DOption { + return func(o *decoderOptions) error { + o.ignoreChecksum = b + return nil + } +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/dict.go b/tools/vendor/github.com/klauspost/compress/zstd/dict.go index a36ae83ef..ca0951452 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/dict.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/dict.go @@ -1,7 +1,6 @@ package zstd import ( - "bytes" "encoding/binary" "errors" "fmt" @@ -20,7 +19,10 @@ type dict struct { content []byte } -var dictMagic = [4]byte{0x37, 0xa4, 0x30, 0xec} +const dictMagic = "\x37\xa4\x30\xec" + +// Maximum dictionary size for the reference implementation (1.5.3) is 2 GiB. +const dictMaxLength = 1 << 31 // ID returns the dictionary id or 0 if d is nil. func (d *dict) ID() uint32 { @@ -30,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) { @@ -50,7 +76,7 @@ func loadDict(b []byte) (*dict, error) { ofDec: sequenceDec{fse: &fseDecoder{}}, mlDec: sequenceDec{fse: &fseDecoder{}}, } - if !bytes.Equal(b[:4], dictMagic[:]) { + if string(b[:4]) != dictMagic { return nil, ErrMagicMismatch } d.id = binary.LittleEndian.Uint32(b[4:8]) @@ -62,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 @@ -120,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/tools/vendor/github.com/klauspost/compress/zstd/enc_base.go b/tools/vendor/github.com/klauspost/compress/zstd/enc_base.go index 15ae8ee80..e008b9929 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/enc_base.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/enc_base.go @@ -16,6 +16,7 @@ type fastBase struct { cur int32 // maximum offset. Should be at least 2x block size. maxMatchOff int32 + bufferReset int32 hist []byte crc *xxhash.Digest tmp [8]byte @@ -56,8 +57,8 @@ func (e *fastBase) Block() *blockEnc { } func (e *fastBase) addBlock(src []byte) int32 { - if debugAsserts && e.cur > bufferReset { - panic(fmt.Sprintf("ecur (%d) > buffer reset (%d)", e.cur, bufferReset)) + if debugAsserts && e.cur > e.bufferReset { + panic(fmt.Sprintf("ecur (%d) > buffer reset (%d)", e.cur, e.bufferReset)) } // check if we have space already if len(e.hist)+len(src) > cap(e.hist) { @@ -126,24 +127,7 @@ func (e *fastBase) matchlen(s, t int32, src []byte) int32 { panic(fmt.Sprintf("len(src)-s (%d) > maxCompressedBlockSize (%d)", len(src)-int(s), maxCompressedBlockSize)) } } - a := src[s:] - b := src[t:] - b = b[:len(a)] - end := int32((len(a) >> 3) << 3) - for i := int32(0); i < end; i += 8 { - if diff := load6432(a, i) ^ load6432(b, i); diff != 0 { - return i + int32(bits.TrailingZeros64(diff)>>3) - } - } - - a = a[end:] - b = b[end:] - for i := range a { - if a[i] != b[i] { - return int32(i) + end - } - } - return int32(len(a)) + end + return int32(matchLen(src[s:], src[t:])) } // Reset the encoding table. @@ -165,13 +149,13 @@ 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 } // We offset current position so everything will be out of reach. // If above reset line, history will be purged. - if e.cur < bufferReset { + if e.cur < e.bufferReset { e.cur += e.maxMatchOff + int32(len(e.hist)) } e.hist = e.hist[:0] diff --git a/tools/vendor/github.com/klauspost/compress/zstd/enc_best.go b/tools/vendor/github.com/klauspost/compress/zstd/enc_best.go index 96028ecd8..9819d4145 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/enc_best.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/enc_best.go @@ -34,7 +34,7 @@ type match struct { est int32 } -const highScore = 25000 +const highScore = maxMatchLen * 8 // estBits will estimate output bits from predefined tables. func (m *match) estBits(bitsPerByte int32) { @@ -84,14 +84,10 @@ func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = prevEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = prevEntry{} - } + e.table = [bestShortTableSize]prevEntry{} + e.longTable = [bestLongTableSize]prevEntry{} e.cur = e.maxMatchOff break } @@ -163,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]) @@ -177,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) @@ -192,49 +186,96 @@ encodeLoop: panic("offset0 was 0") } - bestOf := func(a, b match) match { - if a.est+(a.s-b.s)*bitsPerByte>>10 < b.est+(b.s-a.s)*bitsPerByte>>10 { - 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 + } } - best := bestOf(matchAt(candidateL.offset-e.cur, s, uint32(cv), -1), matchAt(candidateL.prev-e.cur, s, uint32(cv), -1)) - best = bestOf(best, matchAt(candidateS.offset-e.cur, s, uint32(cv), -1)) - best = bestOf(best, matchAt(candidateS.prev-e.cur, s, uint32(cv), -1)) + 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 - best = bestOf(best, matchAt(spp-offset1, spp, cv32, 1)) - best = bestOf(best, matchAt(spp-offset2, spp, cv32, 2)) - best = bestOf(best, matchAt(spp-offset3, spp, cv32, 3)) - if best.length > 0 { - cv32 = uint32(cv >> 24) - spp += 2 - best = bestOf(best, matchAt(spp-offset1, spp, cv32, 1)) - best = bestOf(best, matchAt(spp-offset2, spp, cv32, 2)) - best = bestOf(best, matchAt(spp-offset3, spp, cv32, 3)) + 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... @@ -249,40 +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 - best = bestOf(best, 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 - best = bestOf(best, matchAt(candidateL.offset-e.cur, s, uint32(cv), -1)) - best = bestOf(best, matchAt(candidateL.prev-e.cur, s, uint32(cv), -1)) - best = bestOf(best, matchAt(candidateL2.offset-e.cur, s+1, uint32(cv2), -1)) - best = bestOf(best, matchAt(candidateL2.prev-e.cur, s+1, uint32(cv2), -1)) + 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... - best = bestOf(best, matchAt(e.table[hashLen(cv2>>8, bestShortTableBits, bestShortLen)].offset-e.cur, s+2, uint32(cv2>>8), -1)) + 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] - if pos := candidateEnd.offset - e.cur - best.length; pos >= 0 { - bestEnd := bestOf(best, matchAt(pos, best.s, load3232(src, best.s), -1)) - if pos := candidateEnd.prev - e.cur - best.length; pos >= 0 { - bestEnd = bestOf(bestEnd, matchAt(pos, best.s, load3232(src, best.s), -1)) + + // 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 } } } @@ -295,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) @@ -349,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 @@ -372,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 { @@ -404,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) @@ -416,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/tools/vendor/github.com/klauspost/compress/zstd/enc_better.go b/tools/vendor/github.com/klauspost/compress/zstd/enc_better.go index 602c05ee0..8582f31a7 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/enc_better.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/enc_better.go @@ -62,14 +62,10 @@ func (e *betterFastEncoder) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = prevEntry{} - } + e.table = [betterShortTableSize]tableEntry{} + e.longTable = [betterLongTableSize]prevEntry{} e.cur = e.maxMatchOff break } @@ -156,8 +152,8 @@ encodeLoop: panic("offset0 was 0") } - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) + nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] @@ -416,15 +412,23 @@ encodeLoop: // Try to find a better match by searching for a long match at the end of the current best match if s+matched < sLimit { + // Allow some bytes at the beginning to mismatch. + // Sweet spot is around 3 bytes, but depends on input. + // The skipped bytes are tested in Extend backwards, + // and still picked up as part of the match if they do. + const skipBeginning = 3 + nextHashL := hashLen(load6432(src, s+matched), betterLongTableBits, betterLongLen) - cv := load3232(src, s) + s2 := s + skipBeginning + cv := load3232(src, s2) candidateL := e.longTable[nextHashL] - coffsetL := candidateL.offset - e.cur - matched - if coffsetL >= 0 && coffsetL < s && s-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { + coffsetL := candidateL.offset - e.cur - matched + skipBeginning + if coffsetL >= 0 && coffsetL < s2 && s2-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s+4, coffsetL+4, src) + 4 + matchedNext := e.matchlen(s2+4, coffsetL+4, src) + 4 if matchedNext > matched { t = coffsetL + s = s2 matched = matchedNext if debugMatches { println("long match at end-of-match") @@ -434,12 +438,13 @@ encodeLoop: // Check prev long... if true { - coffsetL = candidateL.prev - e.cur - matched - if coffsetL >= 0 && coffsetL < s && s-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { + coffsetL = candidateL.prev - e.cur - matched + skipBeginning + if coffsetL >= 0 && coffsetL < s2 && s2-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s+4, coffsetL+4, src) + 4 + matchedNext := e.matchlen(s2+4, coffsetL+4, src) + 4 if matchedNext > matched { t = coffsetL + s = s2 matched = matchedNext if debugMatches { println("prev long match at end-of-match") @@ -518,8 +523,8 @@ encodeLoop: } // Store this, since we have it. - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) + nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) // We have at least 4 byte match. // No need to check backwards. We come straight from a match @@ -578,7 +583,7 @@ func (e *betterFastEncoderDict) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { for i := range e.table[:] { e.table[i] = tableEntry{} @@ -674,8 +679,8 @@ encodeLoop: panic("offset0 was 0") } - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) + nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] @@ -1047,8 +1052,8 @@ encodeLoop: } // Store this, since we have it. - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) + nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) // We have at least 4 byte match. // No need to check backwards. We come straight from a match diff --git a/tools/vendor/github.com/klauspost/compress/zstd/enc_dfast.go b/tools/vendor/github.com/klauspost/compress/zstd/enc_dfast.go index d6b310424..7d425109a 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/enc_dfast.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/enc_dfast.go @@ -44,14 +44,10 @@ func (e *doubleFastEncoder) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = tableEntry{} - } + e.table = [dFastShortTableSize]tableEntry{} + e.longTable = [dFastLongTableSize]tableEntry{} e.cur = e.maxMatchOff break } @@ -127,8 +123,8 @@ encodeLoop: panic("offset0 was 0") } - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) + nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] @@ -388,7 +384,7 @@ func (e *doubleFastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - if e.cur >= bufferReset { + if e.cur >= e.bufferReset { for i := range e.table[:] { e.table[i] = tableEntry{} } @@ -439,8 +435,8 @@ encodeLoop: var t int32 for { - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) + nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] @@ -685,7 +681,7 @@ encodeLoop: } // We do not store history, so we must offset e.cur to avoid false matches for next user. - if e.cur < bufferReset { + if e.cur < e.bufferReset { e.cur += int32(len(src)) } } @@ -700,7 +696,7 @@ func (e *doubleFastEncoderDict) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { for i := range e.table[:] { e.table[i] = tableEntry{} @@ -785,8 +781,8 @@ encodeLoop: panic("offset0 was 0") } - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) + nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) candidateL := e.longTable[nextHashL] candidateS := e.table[nextHashS] @@ -969,7 +965,7 @@ encodeLoop: te0 := tableEntry{offset: index0 + e.cur, val: uint32(cv0)} te1 := tableEntry{offset: index1 + e.cur, val: uint32(cv1)} longHash1 := hashLen(cv0, dFastLongTableBits, dFastLongLen) - longHash2 := hashLen(cv0, dFastLongTableBits, dFastLongLen) + longHash2 := hashLen(cv1, dFastLongTableBits, dFastLongLen) e.longTable[longHash1] = te0 e.longTable[longHash2] = te1 e.markLongShardDirty(longHash1) @@ -1002,8 +998,8 @@ encodeLoop: } // Store this, since we have it. - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) + nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) // We have at least 4 byte match. // No need to check backwards. We come straight from a match @@ -1103,7 +1099,8 @@ func (e *doubleFastEncoderDict) Reset(d *dict, singleBlock bool) { } if allDirty || dirtyShardCnt > dLongTableShardCnt/2 { - copy(e.longTable[:], e.dictLongTable) + //copy(e.longTable[:], e.dictLongTable) + e.longTable = *(*[dFastLongTableSize]tableEntry)(e.dictLongTable) for i := range e.longTableShardDirty { e.longTableShardDirty[i] = false } @@ -1114,7 +1111,9 @@ func (e *doubleFastEncoderDict) Reset(d *dict, singleBlock bool) { continue } - copy(e.longTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize], e.dictLongTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize]) + // copy(e.longTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize], e.dictLongTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize]) + *(*[dLongTableShardSize]tableEntry)(e.longTable[i*dLongTableShardSize:]) = *(*[dLongTableShardSize]tableEntry)(e.dictLongTable[i*dLongTableShardSize:]) + e.longTableShardDirty[i] = false } } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/enc_fast.go b/tools/vendor/github.com/klauspost/compress/zstd/enc_fast.go index 5f08a2830..315b1a8f2 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/enc_fast.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/enc_fast.go @@ -43,7 +43,7 @@ func (e *fastEncoder) Encode(blk *blockEnc, src []byte) { ) // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { for i := range e.table[:] { e.table[i] = tableEntry{} @@ -85,7 +85,7 @@ func (e *fastEncoder) Encode(blk *blockEnc, src []byte) { // TEMPLATE const hashLog = tableBits // seems global, but would be nice to tweak. - const kSearchStrength = 7 + const kSearchStrength = 6 // nextEmit is where in src the next emitLiteral should start from. nextEmit := s @@ -304,13 +304,13 @@ func (e *fastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { minNonLiteralBlockSize = 1 + 1 + inputMargin ) if debugEncoder { - if len(src) > maxBlockSize { + if len(src) > maxCompressedBlockSize { panic("src too big") } } // Protect against e.cur wraparound. - if e.cur >= bufferReset { + if e.cur >= e.bufferReset { for i := range e.table[:] { e.table[i] = tableEntry{} } @@ -334,7 +334,7 @@ func (e *fastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { // TEMPLATE const hashLog = tableBits // seems global, but would be nice to tweak. - const kSearchStrength = 8 + const kSearchStrength = 6 // nextEmit is where in src the next emitLiteral should start from. nextEmit := s @@ -538,7 +538,7 @@ encodeLoop: println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) } // We do not store history, so we must offset e.cur to avoid false matches for next user. - if e.cur < bufferReset { + if e.cur < e.bufferReset { e.cur += int32(len(src)) } } @@ -555,11 +555,9 @@ func (e *fastEncoderDict) Encode(blk *blockEnc, src []byte) { return } // Protect against e.cur wraparound. - for e.cur >= bufferReset { + for e.cur >= e.bufferReset-int32(len(e.hist)) { if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } + e.table = [tableSize]tableEntry{} e.cur = e.maxMatchOff break } @@ -871,7 +869,8 @@ func (e *fastEncoderDict) Reset(d *dict, singleBlock bool) { const shardCnt = tableShardCnt const shardSize = tableShardSize if e.allDirty || dirtyShardCnt > shardCnt*4/6 { - copy(e.table[:], e.dictTable) + //copy(e.table[:], e.dictTable) + e.table = *(*[tableSize]tableEntry)(e.dictTable) for i := range e.tableShardDirty { e.tableShardDirty[i] = false } @@ -883,7 +882,8 @@ func (e *fastEncoderDict) Reset(d *dict, singleBlock bool) { continue } - copy(e.table[i*shardSize:(i+1)*shardSize], e.dictTable[i*shardSize:(i+1)*shardSize]) + //copy(e.table[i*shardSize:(i+1)*shardSize], e.dictTable[i*shardSize:(i+1)*shardSize]) + *(*[shardSize]tableEntry)(e.table[i*shardSize:]) = *(*[shardSize]tableEntry)(e.dictTable[i*shardSize:]) e.tableShardDirty[i] = false } e.allDirty = false diff --git a/tools/vendor/github.com/klauspost/compress/zstd/encoder.go b/tools/vendor/github.com/klauspost/compress/zstd/encoder.go index e6e315969..4de0aed0d 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/encoder.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/encoder.go @@ -8,6 +8,7 @@ import ( "crypto/rand" "fmt" "io" + "math" rdebug "runtime/debug" "sync" @@ -98,23 +99,25 @@ func (e *Encoder) Reset(w io.Writer) { if cap(s.filling) == 0 { s.filling = make([]byte, 0, e.o.blockSize) } - if cap(s.current) == 0 { - s.current = make([]byte, 0, e.o.blockSize) - } - if cap(s.previous) == 0 { - s.previous = make([]byte, 0, e.o.blockSize) + if e.o.concurrent > 1 { + if cap(s.current) == 0 { + s.current = make([]byte, 0, e.o.blockSize) + } + if cap(s.previous) == 0 { + s.previous = make([]byte, 0, e.o.blockSize) + } + s.current = s.current[:0] + s.previous = s.previous[:0] + if s.writing == nil { + s.writing = &blockEnc{lowMem: e.o.lowMem} + s.writing.init() + } + s.writing.initNewEncode() } if s.encoder == nil { s.encoder = e.o.encoder() } - if s.writing == nil { - s.writing = &blockEnc{lowMem: e.o.lowMem} - s.writing.init() - } - s.writing.initNewEncode() s.filling = s.filling[:0] - s.current = s.current[:0] - s.previous = s.previous[:0] s.encoder.Reset(e.o.dict, false) s.headerWritten = false s.eofWritten = false @@ -258,6 +261,32 @@ func (e *Encoder) nextBlock(final bool) error { return s.err } + // SYNC: + if e.o.concurrent == 1 { + src := s.filling + s.nInput += int64(len(s.filling)) + if debugEncoder { + println("Adding sync block,", len(src), "bytes, final:", final) + } + enc := s.encoder + blk := enc.Block() + blk.reset(nil) + enc.Encode(blk, src) + blk.last = final + if final { + s.eofWritten = true + } + + 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)) + s.filling = s.filling[:0] + return s.err + } + // Move blocks forward. s.filling, s.current, s.previous = s.previous[:0], s.filling, s.current s.nInput += int64(len(s.current)) @@ -300,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) @@ -486,8 +501,8 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { // If a non-single block is needed the encoder will reset again. e.encoders <- enc }() - // Use single segments when above minimum window and below 1MB. - single := len(src) < 1<<20 && len(src) > MinWindowSize + // Use single segments when above minimum window and below window size. + single := len(src) <= e.o.windowSize && len(src) > MinWindowSize if e.o.single != nil { single = *e.o.single } @@ -509,7 +524,7 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { } // If we can do everything in one block, prefer that. - if len(src) <= maxCompressedBlockSize { + if len(src) <= e.o.blockSize { enc.Reset(e.o.dict, true) // Slightly faster with no history and everything in one block. if e.o.crc { @@ -525,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) @@ -562,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) } } @@ -597,3 +588,37 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { } return dst } + +// MaxEncodedSize returns the expected maximum +// size of an encoded block or stream. +func (e *Encoder) MaxEncodedSize(size int) int { + frameHeader := 4 + 2 // magic + frame header & window descriptor + if e.o.dict != nil { + frameHeader += 4 + } + // Frame content size: + if size < 256 { + frameHeader++ + } else if size < 65536+256 { + frameHeader += 2 + } else if size < math.MaxInt32 { + frameHeader += 4 + } else { + frameHeader += 8 + } + // Final crc + if e.o.crc { + frameHeader += 4 + } + + // Max overhead is 3 bytes/block. + // There cannot be 0 blocks. + blocks := (size + e.o.blockSize) / e.o.blockSize + + // Combine, add padding. + maxSz := frameHeader + 3*blocks + size + if e.o.pad > 1 { + maxSz += calcSkippableFrame(int64(maxSz), int64(e.o.pad)) + } + return maxSz +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/encoder_options.go b/tools/vendor/github.com/klauspost/compress/zstd/encoder_options.go index 7d29e1d68..50f70533b 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/encoder_options.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/encoder_options.go @@ -3,6 +3,8 @@ package zstd import ( "errors" "fmt" + "math" + "math/bits" "runtime" "strings" ) @@ -24,6 +26,7 @@ type encoderOptions struct { allLitEntropy bool customWindow bool customALEntropy bool + customBlockSize bool lowMem bool dict *dict } @@ -33,10 +36,10 @@ func (o *encoderOptions) setDefault() { concurrent: runtime.GOMAXPROCS(0), crc: true, single: nil, - blockSize: 1 << 16, + blockSize: maxCompressedBlockSize, windowSize: 8 << 20, level: SpeedDefault, - allLitEntropy: true, + allLitEntropy: false, lowMem: false, } } @@ -46,22 +49,22 @@ func (o encoderOptions) encoder() encoder { switch o.level { case SpeedFastest: if o.dict != nil { - return &fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}}} + return &fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} } - return &fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}} + return &fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} case SpeedDefault: if o.dict != nil { - return &doubleFastEncoderDict{fastEncoderDict: fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}}}} + return &doubleFastEncoderDict{fastEncoderDict: fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}}} } - return &doubleFastEncoder{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}}} + return &doubleFastEncoder{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} case SpeedBetterCompression: if o.dict != nil { - return &betterFastEncoderDict{betterFastEncoder: betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}}} + return &betterFastEncoderDict{betterFastEncoder: betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} } - return &betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}} + return &betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} case SpeedBestCompression: - return &bestFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), lowMem: o.lowMem}} + return &bestFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} } panic("unknown compression level") } @@ -75,6 +78,7 @@ func WithEncoderCRC(b bool) EOption { // WithEncoderConcurrency will set the concurrency, // meaning the maximum number of encoders to run concurrently. // The value supplied must be at least 1. +// For streams, setting a value of 1 will disable async compression. // By default this will be set to GOMAXPROCS. func WithEncoderConcurrency(n int) EOption { return func(o *encoderOptions) error { @@ -106,6 +110,7 @@ func WithWindowSize(n int) EOption { o.customWindow = true if o.blockSize > o.windowSize { o.blockSize = o.windowSize + o.customBlockSize = true } return nil } @@ -188,10 +193,9 @@ func EncoderLevelFromZstd(level int) EncoderLevel { return SpeedDefault case level >= 6 && level < 10: return SpeedBetterCompression - case level >= 10: + default: return SpeedBestCompression } - return SpeedDefault } // String provides a string representation of the compression level. @@ -222,6 +226,9 @@ func WithEncoderLevel(l EncoderLevel) EOption { switch o.level { case SpeedFastest: o.windowSize = 4 << 20 + if !o.customBlockSize { + o.blockSize = 1 << 16 + } case SpeedDefault: o.windowSize = 8 << 20 case SpeedBetterCompression: @@ -231,7 +238,7 @@ func WithEncoderLevel(l EncoderLevel) EOption { } } if !o.customALEntropy { - o.allLitEntropy = l > SpeedFastest + o.allLitEntropy = l > SpeedDefault } return nil @@ -278,7 +285,7 @@ func WithNoEntropyCompression(b bool) EOption { // a decoder is allowed to reject a compressed frame which requests a memory size beyond decoder's authorized range. // For broader compatibility, decoders are recommended to support memory sizes of at least 8 MB. // This is only a recommendation, each decoder is free to support higher or lower limits, depending on local limitations. -// If this is not specified, block encodes will automatically choose this based on the input size. +// If this is not specified, block encodes will automatically choose this based on the input size and the window size. // This setting has no effect on streamed encodes. func WithSingleSegment(b bool) EOption { return func(o *encoderOptions) error { @@ -299,7 +306,13 @@ func WithLowerEncoderMem(b bool) EOption { } // WithEncoderDict allows to register a dictionary that will be used for the encode. +// +// The slice dict must be in the [dictionary format] produced by +// "zstd --train" from the Zstandard reference implementation. +// // The encoder *may* choose to use no dictionary instead for certain payloads. +// +// [dictionary format]: https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-format func WithEncoderDict(dict []byte) EOption { return func(o *encoderOptions) error { d, err := loadDict(dict) @@ -310,3 +323,17 @@ func WithEncoderDict(dict []byte) EOption { return nil } } + +// WithEncoderDictRaw registers a dictionary that may be used by the encoder. +// +// The slice content may contain arbitrary data. It will be used as an initial +// history. +func WithEncoderDictRaw(id uint32, content []byte) EOption { + return func(o *encoderOptions) error { + if bits.UintSize > 32 && uint(len(content)) > dictMaxLength { + return fmt.Errorf("dictionary of size %d > 2GiB too large", len(content)) + } + o.dict = &dict{id: id, content: content, offsets: [3]int{1, 4, 8}} + return nil + } +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/framedec.go b/tools/vendor/github.com/klauspost/compress/zstd/framedec.go index 989c79f8c..cc0aa2274 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/framedec.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/framedec.go @@ -5,26 +5,20 @@ package zstd import ( - "bytes" + "encoding/binary" "encoding/hex" "errors" - "hash" "io" - "sync" "github.com/klauspost/compress/zstd/internal/xxhash" ) type frameDec struct { - o decoderOptions - crc hash.Hash64 - offset int64 + o decoderOptions + crc *xxhash.Digest WindowSize uint64 - // In order queue of blocks being decoded. - decoding chan *blockDec - // Frame history passed between blocks history history @@ -34,15 +28,10 @@ type frameDec struct { bBuf byteBuf FrameContentSize uint64 - frameDone sync.WaitGroup - DictionaryID *uint32 + DictionaryID uint32 HasCheckSum bool SingleSegment bool - - // asyncRunning indicates whether the async routine processes input on 'decoding'. - asyncRunningMu sync.Mutex - asyncRunning bool } const ( @@ -54,9 +43,9 @@ const ( MaxWindowSize = 1 << 29 ) -var ( - frameMagic = []byte{0x28, 0xb5, 0x2f, 0xfd} - skippableFrameMagic = []byte{0x2a, 0x4d, 0x18} +const ( + frameMagic = "\x28\xb5\x2f\xfd" + skippableFrameMagic = "\x2a\x4d\x18" ) func newFrameDec(o decoderOptions) *frameDec { @@ -100,9 +89,9 @@ func (d *frameDec) reset(br byteBuffer) error { copy(signature[1:], b) } - if !bytes.Equal(signature[1:4], skippableFrameMagic) || signature[0]&0xf0 != 0x50 { + if string(signature[1:4]) != skippableFrameMagic || signature[0]&0xf0 != 0x50 { if debugDecoder { - println("Not skippable", hex.EncodeToString(signature[:]), hex.EncodeToString(skippableFrameMagic)) + println("Not skippable", hex.EncodeToString(signature[:]), hex.EncodeToString([]byte(skippableFrameMagic))) } // Break if not skippable frame. break @@ -117,7 +106,7 @@ func (d *frameDec) reset(br byteBuffer) error { } n := uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) println("Skipping frame with", n, "bytes.") - err = br.skipN(int(n)) + err = br.skipN(int64(n)) if err != nil { if debugDecoder { println("Reading discarded frame", err) @@ -125,9 +114,9 @@ func (d *frameDec) reset(br byteBuffer) error { return err } } - if !bytes.Equal(signature[:], frameMagic) { + if string(signature[:]) != frameMagic { if debugDecoder { - println("Got magic numbers: ", signature, "want:", frameMagic) + println("Got magic numbers: ", signature, "want:", []byte(frameMagic)) } return ErrMagicMismatch } @@ -166,7 +155,7 @@ func (d *frameDec) reset(br byteBuffer) error { // Read Dictionary_ID // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary_id - d.DictionaryID = nil + d.DictionaryID = 0 if size := fhd & 3; size != 0 { if size == 3 { size = 4 @@ -178,7 +167,7 @@ func (d *frameDec) reset(br byteBuffer) error { return err } var id uint32 - switch size { + switch len(b) { case 1: id = uint32(b[0]) case 2: @@ -189,11 +178,7 @@ func (d *frameDec) reset(br byteBuffer) error { if debugDecoder { println("Dict size", size, "ID:", id) } - if id > 0 { - // ID 0 means "sorry, no dictionary anyway". - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-format - d.DictionaryID = &id - } + d.DictionaryID = id } // Read Frame_Content_Size @@ -208,14 +193,14 @@ func (d *frameDec) reset(br byteBuffer) error { default: fcsSize = 1 << v } - d.FrameContentSize = 0 + d.FrameContentSize = fcsUnknown if fcsSize > 0 { b, err := br.readSmall(fcsSize) if err != nil { println("Reading Frame content", err) return err } - switch fcsSize { + switch len(b) { case 1: d.FrameContentSize = uint64(b[0]) case 2: @@ -229,9 +214,10 @@ func (d *frameDec) reset(br byteBuffer) error { d.FrameContentSize = uint64(d1) | (uint64(d2) << 32) } if debugDecoder { - println("field size bits:", v, "fcsSize:", fcsSize, "FrameContentSize:", d.FrameContentSize, hex.EncodeToString(b[:fcsSize]), "singleseg:", d.SingleSegment, "window:", d.WindowSize) + println("Read FCS:", d.FrameContentSize) } } + // Move this to shared. d.HasCheckSum = fhd&(1<<2) != 0 if d.HasCheckSum { @@ -241,20 +227,27 @@ func (d *frameDec) reset(br byteBuffer) error { d.crc.Reset() } + if d.WindowSize > d.o.maxWindowSize { + if debugDecoder { + printf("window size %d > max %d\n", d.WindowSize, d.o.maxWindowSize) + } + return ErrWindowSizeExceeded + } + if d.WindowSize == 0 && d.SingleSegment { // We may not need window in this case. d.WindowSize = d.FrameContentSize if d.WindowSize < MinWindowSize { d.WindowSize = MinWindowSize } - } - - if d.WindowSize > uint64(d.o.maxWindowSize) { - if debugDecoder { - printf("window size %d > max %d\n", d.WindowSize, d.o.maxWindowSize) + if d.WindowSize > d.o.maxDecodedSize { + if debugDecoder { + printf("window size %d > max %d\n", d.WindowSize, d.o.maxWindowSize) + } + return ErrDecoderSizeExceeded } - return ErrWindowSizeExceeded } + // The minimum Window_Size is 1 KB. if d.WindowSize < MinWindowSize { if debugDecoder { @@ -263,11 +256,23 @@ func (d *frameDec) reset(br byteBuffer) error { return ErrWindowSizeTooSmall } d.history.windowSize = int(d.WindowSize) - if d.o.lowMem && d.history.windowSize < maxBlockSize { - d.history.maxSize = d.history.windowSize * 2 + if !d.o.lowMem || d.history.windowSize < maxBlockSize { + // Alloc 2x window size if not low-mem, or window size below 2MB. + d.history.allocFrameBuffer = d.history.windowSize * 2 } else { - d.history.maxSize = d.history.windowSize + maxBlockSize + if d.o.lowMem { + // Alloc with 1MB extra. + d.history.allocFrameBuffer = d.history.windowSize + maxBlockSize/2 + } else { + // Alloc with 2MB extra. + d.history.allocFrameBuffer = d.history.windowSize + maxBlockSize + } } + + if debugDecoder { + println("Frame: Dict:", d.DictionaryID, "FrameContentSize:", d.FrameContentSize, "singleseg:", d.SingleSegment, "window:", d.WindowSize, "crc:", d.HasCheckSum) + } + // history contains input - maybe we do something d.rawInput = br return nil @@ -276,209 +281,85 @@ func (d *frameDec) reset(br byteBuffer) error { // next will start decoding the next block from stream. func (d *frameDec) next(block *blockDec) error { if debugDecoder { - printf("decoding new block %p:%p", block, block.data) + println("decoding new block") } err := block.reset(d.rawInput, d.WindowSize) if err != nil { println("block error:", err) // Signal the frame decoder we have a problem. - d.sendErr(block, err) + block.sendErr(err) return err } - block.input <- struct{}{} - if debugDecoder { - println("next block:", block) - } - d.asyncRunningMu.Lock() - defer d.asyncRunningMu.Unlock() - if !d.asyncRunning { - return nil - } - if block.Last { - // We indicate the frame is done by sending io.EOF - d.decoding <- block - return io.EOF - } - d.decoding <- block return nil } -// sendEOF will queue an error block on the frame. -// This will cause the frame decoder to return when it encounters the block. -// Returns true if the decoder was added. -func (d *frameDec) sendErr(block *blockDec, err error) bool { - d.asyncRunningMu.Lock() - defer d.asyncRunningMu.Unlock() - if !d.asyncRunning { - return false - } - - println("sending error", err.Error()) - block.sendErr(err) - d.decoding <- block - return true -} - -// 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 - } - var tmp [4]byte - got := d.crc.Sum64() - // Flip to match file order. - tmp[0] = byte(got >> 0) - tmp[1] = byte(got >> 8) - tmp[2] = byte(got >> 16) - tmp[3] = byte(got >> 24) - // We can overwrite upper tmp now - want, err := d.rawInput.readSmall(4) + buf, err := d.rawInput.readSmall(4) if err != nil { println("CRC missing?", err) return err } - if !bytes.Equal(tmp[:], want) { + want := binary.LittleEndian.Uint32(buf[:4]) + got := uint32(d.crc.Sum64()) + + if got != want { if debugDecoder { - println("CRC Check Failed:", tmp[:], "!=", want) + printf("CRC check failed: got %08x, want %08x\n", got, want) } return ErrCRCMismatch } if debugDecoder { - println("CRC ok", tmp[:]) + printf("CRC ok %08x\n", got) } return nil } -func (d *frameDec) initAsync() { - if !d.o.lowMem && !d.SingleSegment { - // set max extra size history to 2MB. - d.history.maxSize = d.history.windowSize + maxBlockSize - } - // re-alloc if more than one extra block size. - if d.o.lowMem && cap(d.history.b) > d.history.maxSize+maxBlockSize { - d.history.b = make([]byte, 0, d.history.maxSize) - } - if cap(d.history.b) < d.history.maxSize { - d.history.b = make([]byte, 0, d.history.maxSize) - } - if cap(d.decoding) < d.o.concurrent { - d.decoding = make(chan *blockDec, d.o.concurrent) - } - if debugDecoder { - h := d.history - printf("history init. len: %d, cap: %d", len(h.b), cap(h.b)) - } - d.asyncRunningMu.Lock() - d.asyncRunning = true - d.asyncRunningMu.Unlock() -} - -// startDecoder will start decoding blocks and write them to the writer. -// The decoder will stop as soon as an error occurs or at end of frame. -// When the frame has finished decoding the *bufio.Reader -// containing the remaining input will be sent on frameDec.frameDone. -func (d *frameDec) startDecoder(output chan decodeOutput) { - written := int64(0) - - defer func() { - d.asyncRunningMu.Lock() - d.asyncRunning = false - d.asyncRunningMu.Unlock() - - // Drain the currently decoding. - d.history.error = true - flushdone: - for { - select { - case b := <-d.decoding: - b.history <- &d.history - output <- <-b.result - default: - break flushdone - } - } - println("frame decoder done, signalling done") - d.frameDone.Done() - }() - // Get decoder for first block. - block := <-d.decoding - block.history <- &d.history - for { - var next *blockDec - // Get result - r := <-block.result - if r.err != nil { - println("Result contained error", r.err) - output <- r - return - } - if debugDecoder { - println("got result, from ", d.offset, "to", d.offset+int64(len(r.b))) - d.offset += int64(len(r.b)) - } - if !block.Last { - // Send history to next block - select { - case next = <-d.decoding: - if debugDecoder { - println("Sending ", len(d.history.b), "bytes as history") - } - next.history <- &d.history - default: - // Wait until we have sent the block, so - // other decoders can potentially get the decoder. - next = nil - } - } - - // Add checksum, async to decoding. - if d.HasCheckSum { - n, err := d.crc.Write(r.b) - if err != nil { - r.err = err - if n != len(r.b) { - r.err = io.ErrShortWrite - } - output <- r - return - } - } - written += int64(len(r.b)) - if d.SingleSegment && uint64(written) > d.FrameContentSize { - println("runDecoder: single segment and", uint64(written), ">", d.FrameContentSize) - r.err = ErrFrameSizeExceeded - output <- r - return - } - if block.Last { - r.err = d.checkCRC() - output <- r - return - } - output <- r - if next == nil { - // There was no decoder available, we wait for one now that we have sent to the writer. - if debugDecoder { - println("Sending ", len(d.history.b), " bytes as history") - } - next = <-d.decoding - next.history <- &d.history - } - block = next +// consumeCRC skips over the checksum, assuming the frame has one. +func (d *frameDec) consumeCRC() error { + _, err := d.rawInput.readSmall(4) + if err != nil { + println("CRC missing?", err) } + return err } -// runDecoder will create a sync decoder that will decode a block of data. +// runDecoder will run the decoder for the remainder of the frame. func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) { saved := d.history.b // We use the history for output to avoid copying it. d.history.b = dst + d.history.ignoreBuffer = len(dst) // Store input length, so we only check new data. crcStart := len(dst) + d.history.decoders.maxSyncLen = 0 + if d.o.limitToCap { + d.history.decoders.maxSyncLen = uint64(cap(dst) - len(dst)) + } + if d.FrameContentSize != fcsUnknown { + if !d.o.limitToCap || d.FrameContentSize+uint64(len(dst)) < d.history.decoders.maxSyncLen { + d.history.decoders.maxSyncLen = d.FrameContentSize + uint64(len(dst)) + } + if d.history.decoders.maxSyncLen > d.o.maxDecodedSize { + if debugDecoder { + println("maxSyncLen:", d.history.decoders.maxSyncLen, "> maxDecodedSize:", d.o.maxDecodedSize) + } + return dst, ErrDecoderSizeExceeded + } + if debugDecoder { + println("maxSyncLen:", d.history.decoders.maxSyncLen) + } + if !d.o.limitToCap && uint64(cap(dst)) < d.history.decoders.maxSyncLen { + // Alloc for output + dst2 := make([]byte, len(dst), d.history.decoders.maxSyncLen+compressedBlockOverAlloc) + copy(dst2, dst) + dst = dst2 + } + } var err error for { err = dec.reset(d.rawInput, d.WindowSize) @@ -489,30 +370,41 @@ func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) { println("next block:", dec) } err = dec.decodeBuf(&d.history) - if err != nil || dec.Last { + if err != nil { + break + } + if uint64(len(d.history.b)-crcStart) > d.o.maxDecodedSize { + println("runDecoder: maxDecodedSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.o.maxDecodedSize) + err = ErrDecoderSizeExceeded break } - if uint64(len(d.history.b)) > d.o.maxDecodedSize { + if d.o.limitToCap && len(d.history.b) > cap(dst) { + println("runDecoder: cap exceeded", uint64(len(d.history.b)), ">", cap(dst)) err = ErrDecoderSizeExceeded break } - if d.SingleSegment && uint64(len(d.history.b)) > d.o.maxDecodedSize { - println("runDecoder: single segment and", uint64(len(d.history.b)), ">", d.o.maxDecodedSize) + if uint64(len(d.history.b)-crcStart) > d.FrameContentSize { + println("runDecoder: FrameContentSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.FrameContentSize) err = ErrFrameSizeExceeded break } + if dec.Last { + break + } + if debugDecoder { + println("runDecoder: FrameContentSize", uint64(len(d.history.b)-crcStart), "<=", d.FrameContentSize) + } } dst = d.history.b if err == nil { - if d.HasCheckSum { - 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() - } + if d.FrameContentSize != fcsUnknown && uint64(len(d.history.b)-crcStart) != d.FrameContentSize { + err = ErrFrameSizeMismatch + } else if d.HasCheckSum { + if d.o.ignoreChecksum { + err = d.consumeCRC() + } else { + d.crc.Write(dst[crcStart:]) + err = d.checkCRC() } } } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder.go b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder.go index bb3d4fd6c..2f8860a72 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder.go @@ -5,8 +5,10 @@ package zstd import ( + "encoding/binary" "errors" "fmt" + "io" ) const ( @@ -178,10 +180,32 @@ func (s *fseDecoder) readNCount(b *byteReader, maxSymbol uint16) error { return fmt.Errorf("corruption detected (total %d != %d)", gotTotal, 1<> 3) - // println(s.norm[:s.symbolLen], s.symbolLen) return s.buildDtable() } +func (s *fseDecoder) mustReadFrom(r io.Reader) { + fatalErr := func(err error) { + if err != nil { + panic(err) + } + } + // dt [maxTablesize]decSymbol // Decompression table. + // symbolLen uint16 // Length of active part of the symbol table. + // actualTableLog uint8 // Selected tablelog. + // maxBits uint8 // Maximum number of additional bits + // // used for table creation to avoid allocations. + // stateTable [256]uint16 + // norm [maxSymbolValue + 1]int16 + // preDefined bool + fatalErr(binary.Read(r, binary.LittleEndian, &s.dt)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.symbolLen)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.actualTableLog)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.maxBits)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.stateTable)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.norm)) + fatalErr(binary.Read(r, binary.LittleEndian, &s.preDefined)) +} + // decSymbol contains information about a state entry, // Including the state offset base, the output symbol and // the number of bits to read for the low part of the destination state. @@ -204,18 +228,10 @@ func (d decSymbol) newState() uint16 { return uint16(d >> 16) } -func (d decSymbol) baseline() uint32 { - return uint32(d >> 32) -} - func (d decSymbol) baselineInt() int { return int(d >> 32) } -func (d *decSymbol) set(nbits, addBits uint8, newState uint16, baseline uint32) { - *d = decSymbol(nbits) | (decSymbol(addBits) << 8) | (decSymbol(newState) << 16) | (decSymbol(baseline) << 32) -} - func (d *decSymbol) setNBits(nBits uint8) { const mask = 0xffffffffffffff00 *d = (*d & mask) | decSymbol(nBits) @@ -231,11 +247,6 @@ func (d *decSymbol) setNewState(state uint16) { *d = (*d & mask) | decSymbol(state)<<16 } -func (d *decSymbol) setBaseline(baseline uint32) { - const mask = 0xffffffff - *d = (*d & mask) | decSymbol(baseline)<<32 -} - func (d *decSymbol) setExt(addBits uint8, baseline uint32) { const mask = 0xffff00ff *d = (*d & mask) | (decSymbol(addBits) << 8) | (decSymbol(baseline) << 32) @@ -257,68 +268,6 @@ func (s *fseDecoder) setRLE(symbol decSymbol) { s.dt[0] = symbol } -// buildDtable will build the decoding table. -func (s *fseDecoder) buildDtable() error { - tableSize := uint32(1 << s.actualTableLog) - highThreshold := tableSize - 1 - symbolNext := s.stateTable[:256] - - // Init, lay down lowprob symbols - { - for i, v := range s.norm[:s.symbolLen] { - if v == -1 { - s.dt[highThreshold].setAddBits(uint8(i)) - highThreshold-- - symbolNext[i] = 1 - } else { - symbolNext[i] = uint16(v) - } - } - } - // Spread symbols - { - tableMask := tableSize - 1 - step := tableStep(tableSize) - position := uint32(0) - for ss, v := range s.norm[:s.symbolLen] { - for i := 0; i < int(v); i++ { - s.dt[position].setAddBits(uint8(ss)) - position = (position + step) & tableMask - for position > highThreshold { - // lowprob area - position = (position + step) & tableMask - } - } - } - if position != 0 { - // position must reach all cells once, otherwise normalizedCounter is incorrect - return errors.New("corrupted input (position != 0)") - } - } - - // Build Decoding table - { - tableSize := uint16(1 << s.actualTableLog) - for u, v := range s.dt[:tableSize] { - symbol := v.addBits() - nextState := symbolNext[symbol] - symbolNext[symbol] = nextState + 1 - nBits := s.actualTableLog - byte(highBits(uint32(nextState))) - s.dt[u&maxTableMask].setNBits(nBits) - newState := (nextState << nBits) - tableSize - if newState > tableSize { - return fmt.Errorf("newState (%d) outside table size (%d)", newState, tableSize) - } - if newState == uint16(u) && nBits == 0 { - // Seems weird that this is possible with nbits > 0. - return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, u) - } - s.dt[u&maxTableMask].setNewState(newState) - } - } - return nil -} - // transform will transform the decoder table into a table usable for // decoding without having to apply the transformation while decoding. // The state will contain the base value and the number of bits to read. @@ -352,34 +301,7 @@ func (s *fseState) init(br *bitReader, tableLog uint8, dt []decSymbol) { s.state = dt[br.getBits(tableLog)] } -// next returns the current symbol and sets the next state. -// At least tablelog bits must be available in the bit reader. -func (s *fseState) next(br *bitReader) { - lowBits := uint16(br.getBits(s.state.nbBits())) - s.state = s.dt[s.state.newState()+lowBits] -} - -// finished returns true if all bits have been read from the bitstream -// and the next state would require reading bits from the input. -func (s *fseState) finished(br *bitReader) bool { - return br.finished() && s.state.nbBits() > 0 -} - -// final returns the current state symbol without decoding the next. -func (s *fseState) final() (int, uint8) { - return s.state.baselineInt(), s.state.addBits() -} - // final returns the current state symbol without decoding the next. func (s decSymbol) final() (int, uint8) { return s.baselineInt(), s.addBits() } - -// nextFast returns the next symbol and sets the next state. -// This can only be used if no symbols are 0 bits. -// At least tablelog bits must be available in the bit reader. -func (s *fseState) nextFast(br *bitReader) (uint32, uint8) { - lowBits := br.get16BitsFast(s.state.nbBits()) - s.state = s.dt[s.state.newState()+lowBits] - return s.state.baseline(), s.state.addBits() -} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go new file mode 100644 index 000000000..d04a829b0 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go @@ -0,0 +1,65 @@ +//go:build amd64 && !appengine && !noasm && gc +// +build amd64,!appengine,!noasm,gc + +package zstd + +import ( + "fmt" +) + +type buildDtableAsmContext struct { + // inputs + stateTable *uint16 + norm *int16 + dt *uint64 + + // outputs --- set by the procedure in the case of error; + // for interpretation please see the error handling part below + errParam1 uint64 + errParam2 uint64 +} + +// buildDtable_asm is an x86 assembly implementation of fseDecoder.buildDtable. +// Function returns non-zero exit code on error. +// +//go:noescape +func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int + +// please keep in sync with _generate/gen_fse.go +const ( + errorCorruptedNormalizedCounter = 1 + errorNewStateTooBig = 2 + errorNewStateNoBits = 3 +) + +// buildDtable will build the decoding table. +func (s *fseDecoder) buildDtable() error { + ctx := buildDtableAsmContext{ + stateTable: &s.stateTable[0], + norm: &s.norm[0], + dt: (*uint64)(&s.dt[0]), + } + code := buildDtable_asm(s, &ctx) + + if code != 0 { + switch code { + case errorCorruptedNormalizedCounter: + position := ctx.errParam1 + return fmt.Errorf("corrupted input (position=%d, expected 0)", position) + + case errorNewStateTooBig: + newState := decSymbol(ctx.errParam1) + size := ctx.errParam2 + return fmt.Errorf("newState (%d) outside table size (%d)", newState, size) + + case errorNewStateNoBits: + newState := decSymbol(ctx.errParam1) + oldState := decSymbol(ctx.errParam2) + return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, oldState) + + default: + return fmt.Errorf("buildDtable_asm returned unhandled nonzero code = %d", code) + } + } + return nil +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s new file mode 100644 index 000000000..bcde39869 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s @@ -0,0 +1,126 @@ +// Code generated by command: go run gen_fse.go -out ../fse_decoder_amd64.s -pkg=zstd. DO NOT EDIT. + +//go:build !appengine && !noasm && gc && !noasm + +// func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int +TEXT ·buildDtable_asm(SB), $0-24 + MOVQ ctx+8(FP), CX + MOVQ s+0(FP), DI + + // Load values + MOVBQZX 4098(DI), DX + XORQ AX, AX + BTSQ DX, AX + MOVQ (CX), BX + MOVQ 16(CX), SI + LEAQ -1(AX), R8 + MOVQ 8(CX), CX + MOVWQZX 4096(DI), DI + + // End load values + // Init, lay down lowprob symbols + XORQ R9, R9 + JMP init_main_loop_condition + +init_main_loop: + MOVWQSX (CX)(R9*2), R10 + CMPW R10, $-1 + JNE do_not_update_high_threshold + MOVB R9, 1(SI)(R8*8) + DECQ R8 + MOVQ $0x0000000000000001, R10 + +do_not_update_high_threshold: + MOVW R10, (BX)(R9*2) + INCQ R9 + +init_main_loop_condition: + CMPQ R9, DI + JL init_main_loop + + // Spread symbols + // Calculate table step + MOVQ AX, R9 + SHRQ $0x01, R9 + MOVQ AX, R10 + SHRQ $0x03, R10 + LEAQ 3(R9)(R10*1), R9 + + // Fill add bits values + LEAQ -1(AX), R10 + XORQ R11, R11 + XORQ R12, R12 + JMP spread_main_loop_condition + +spread_main_loop: + XORQ R13, R13 + MOVWQSX (CX)(R12*2), R14 + JMP spread_inner_loop_condition + +spread_inner_loop: + MOVB R12, 1(SI)(R11*8) + +adjust_position: + ADDQ R9, R11 + ANDQ R10, R11 + CMPQ R11, R8 + JG adjust_position + INCQ R13 + +spread_inner_loop_condition: + CMPQ R13, R14 + JL spread_inner_loop + INCQ R12 + +spread_main_loop_condition: + CMPQ R12, DI + JL spread_main_loop + TESTQ R11, R11 + JZ spread_check_ok + MOVQ ctx+8(FP), AX + MOVQ R11, 24(AX) + MOVQ $+1, ret+16(FP) + RET + +spread_check_ok: + // Build Decoding table + XORQ DI, DI + +build_table_main_table: + MOVBQZX 1(SI)(DI*8), CX + MOVWQZX (BX)(CX*2), R8 + LEAQ 1(R8), R9 + MOVW R9, (BX)(CX*2) + MOVQ R8, R9 + BSRQ R9, R9 + MOVQ DX, CX + SUBQ R9, CX + SHLQ CL, R8 + SUBQ AX, R8 + MOVB CL, (SI)(DI*8) + MOVW R8, 2(SI)(DI*8) + CMPQ R8, AX + JLE build_table_check1_ok + MOVQ ctx+8(FP), CX + MOVQ R8, 24(CX) + MOVQ AX, 32(CX) + MOVQ $+2, ret+16(FP) + RET + +build_table_check1_ok: + TESTB CL, CL + JNZ build_table_check2_ok + CMPW R8, DI + JNE build_table_check2_ok + MOVQ ctx+8(FP), AX + MOVQ R8, 24(AX) + MOVQ DI, 32(AX) + MOVQ $+3, ret+16(FP) + RET + +build_table_check2_ok: + INCQ DI + CMPQ DI, AX + JL build_table_main_table + MOVQ $+0, ret+16(FP) + RET diff --git a/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go new file mode 100644 index 000000000..332e51fe4 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go @@ -0,0 +1,72 @@ +//go:build !amd64 || appengine || !gc || noasm +// +build !amd64 appengine !gc noasm + +package zstd + +import ( + "errors" + "fmt" +) + +// buildDtable will build the decoding table. +func (s *fseDecoder) buildDtable() error { + tableSize := uint32(1 << s.actualTableLog) + highThreshold := tableSize - 1 + symbolNext := s.stateTable[:256] + + // Init, lay down lowprob symbols + { + for i, v := range s.norm[:s.symbolLen] { + if v == -1 { + s.dt[highThreshold].setAddBits(uint8(i)) + highThreshold-- + symbolNext[i] = 1 + } else { + symbolNext[i] = uint16(v) + } + } + } + + // Spread symbols + { + tableMask := tableSize - 1 + step := tableStep(tableSize) + position := uint32(0) + for ss, v := range s.norm[:s.symbolLen] { + for i := 0; i < int(v); i++ { + s.dt[position].setAddBits(uint8(ss)) + position = (position + step) & tableMask + for position > highThreshold { + // lowprob area + position = (position + step) & tableMask + } + } + } + if position != 0 { + // position must reach all cells once, otherwise normalizedCounter is incorrect + return errors.New("corrupted input (position != 0)") + } + } + + // Build Decoding table + { + tableSize := uint16(1 << s.actualTableLog) + for u, v := range s.dt[:tableSize] { + symbol := v.addBits() + nextState := symbolNext[symbol] + symbolNext[symbol] = nextState + 1 + nBits := s.actualTableLog - byte(highBits(uint32(nextState))) + s.dt[u&maxTableMask].setNBits(nBits) + newState := (nextState << nBits) - tableSize + if newState > tableSize { + return fmt.Errorf("newState (%d) outside table size (%d)", newState, tableSize) + } + if newState == uint16(u) && nBits == 0 { + // Seems weird that this is possible with nbits > 0. + return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, u) + } + s.dt[u&maxTableMask].setNewState(newState) + } + } + return nil +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/fse_encoder.go b/tools/vendor/github.com/klauspost/compress/zstd/fse_encoder.go index 5442061b1..ab26326a8 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/fse_encoder.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/fse_encoder.go @@ -76,21 +76,6 @@ func (s *fseEncoder) HistogramFinished(maxSymbol uint8, maxCount int) { s.clearCount = maxCount != 0 } -// prepare will prepare and allocate scratch tables used for both compression and decompression. -func (s *fseEncoder) prepare() (*fseEncoder, error) { - if s == nil { - s = &fseEncoder{} - } - s.useRLE = false - if s.clearCount && s.maxCount == 0 { - for i := range s.count { - s.count[i] = 0 - } - s.clearCount = false - } - return s, nil -} - // allocCtable will allocate tables needed for compression. // If existing tables a re big enough, they are simply re-used. func (s *fseEncoder) allocCtable() { @@ -709,14 +694,6 @@ func (c *cState) init(bw *bitWriter, ct *cTable, first symbolTransform) { c.state = c.stateTable[lu] } -// encode the output symbol provided and write it to the bitstream. -func (c *cState) encode(symbolTT symbolTransform) { - nbBitsOut := (uint32(c.state) + symbolTT.deltaNbBits) >> 16 - dstState := int32(c.state>>(nbBitsOut&15)) + int32(symbolTT.deltaFindState) - c.bw.addBits16NC(c.state, uint8(nbBitsOut)) - c.state = c.stateTable[dstState] -} - // flush will write the tablelog to the output and flush the remaining full bytes. func (c *cState) flush(tableLog uint8) { c.bw.flush32() diff --git a/tools/vendor/github.com/klauspost/compress/zstd/hash.go b/tools/vendor/github.com/klauspost/compress/zstd/hash.go index cf33f29a1..5d73c21eb 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/hash.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/hash.go @@ -33,9 +33,3 @@ func hashLen(u uint64, length, mls uint8) uint32 { return (uint32(u) * prime4bytes) >> (32 - length) } } - -// hash3 returns the hash of the lower 3 bytes of u to fit in a hash table with h bits. -// Preferably h should be a constant and should always be <32. -func hash3(u uint32, h uint8) uint32 { - return ((u << (32 - 24)) * prime3bytes) >> ((32 - h) & 31) -} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/history.go b/tools/vendor/github.com/klauspost/compress/zstd/history.go index f783e32d2..09164856d 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/history.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/history.go @@ -10,40 +10,48 @@ import ( // history contains the information transferred between blocks. type history struct { - b []byte - huffTree *huff0.Scratch - recentOffsets [3]int + // Literal decompression + huffTree *huff0.Scratch + + // Sequence decompression decoders sequenceDecs - windowSize int - maxSize int - error bool - dict *dict + recentOffsets [3]int + + // History buffer... + b []byte + + // ignoreBuffer is meant to ignore a number of bytes + // when checking for matches in history + ignoreBuffer int + + windowSize int + allocFrameBuffer int // needed? + error bool + dict *dict } // reset will reset the history to initial state of a frame. // The history must already have been initialized to the desired size. func (h *history) reset() { h.b = h.b[:0] + h.ignoreBuffer = 0 h.error = false h.recentOffsets = [3]int{1, 4, 8} - if f := h.decoders.litLengths.fse; f != nil && !f.preDefined { - fseDecoderPool.Put(f) - } - if f := h.decoders.offsets.fse; f != nil && !f.preDefined { - fseDecoderPool.Put(f) - } - if f := h.decoders.matchLengths.fse; f != nil && !f.preDefined { - fseDecoderPool.Put(f) - } - h.decoders = sequenceDecs{} + h.decoders.freeDecoders() + h.decoders = sequenceDecs{br: h.decoders.br} + h.freeHuffDecoder() + h.huffTree = nil + h.dict = nil + //printf("history created: %+v (l: %d, c: %d)", *h, len(h.b), cap(h.b)) +} + +func (h *history) freeHuffDecoder() { if h.huffTree != nil { if h.dict == nil || h.dict.litEnc != h.huffTree { huffDecoderPool.Put(h.huffTree) + h.huffTree = nil } } - h.huffTree = nil - h.dict = nil - //printf("history created: %+v (l: %d, c: %d)", *h, len(h.b), cap(h.b)) } func (h *history) setDict(dict *dict) { @@ -54,6 +62,7 @@ func (h *history) setDict(dict *dict) { h.decoders.litLengths = dict.llDec h.decoders.offsets = dict.ofDec h.decoders.matchLengths = dict.mlDec + h.decoders.dict = dict.content h.recentOffsets = dict.offsets h.huffTree = dict.litEnc } @@ -83,6 +92,24 @@ func (h *history) append(b []byte) { copy(h.b[h.windowSize-len(b):], b) } +// ensureBlock will ensure there is space for at least one block... +func (h *history) ensureBlock() { + if cap(h.b) < h.allocFrameBuffer { + h.b = make([]byte, 0, h.allocFrameBuffer) + return + } + + avail := cap(h.b) - len(h.b) + if avail >= h.windowSize || avail > maxCompressedBlockSize { + return + } + // Move data down so we only have window size left. + // We know we have less than window size in b at this point. + discard := len(h.b) - h.windowSize + copy(h.b, h.b[discard:]) + h.b = h.b[:h.windowSize] +} + // append bytes to history without ever discarding anything. func (h *history) appendKeep(b []byte) { h.b = append(h.b, b...) diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md index 69aa3bb58..777290d44 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md @@ -2,12 +2,7 @@ VENDORED: Go to [github.com/cespare/xxhash](https://github.com/cespare/xxhash) for original package. - -[![GoDoc](https://godoc.org/github.com/cespare/xxhash?status.svg)](https://godoc.org/github.com/cespare/xxhash) -[![Build Status](https://travis-ci.org/cespare/xxhash.svg?branch=master)](https://travis-ci.org/cespare/xxhash) - -xxhash is a Go implementation of the 64-bit -[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a +xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a high-quality hashing algorithm that is much faster than anything in the Go standard library. @@ -28,31 +23,49 @@ func (*Digest) WriteString(string) (int, error) func (*Digest) Sum64() uint64 ``` -This implementation provides a fast pure-Go implementation and an even faster -assembly implementation for amd64. +The package is written with optimized pure Go and also contains even faster +assembly implementations for amd64 and arm64. If desired, the `purego` build tag +opts into using the Go code even on those architectures. + +[xxHash]: http://cyan4973.github.io/xxHash/ + +## Compatibility + +This package is in a module and the latest code is in version 2 of the module. +You need a version of Go with at least "minimal module compatibility" to use +github.com/cespare/xxhash/v2: + +* 1.9.7+ for Go 1.9 +* 1.10.3+ for Go 1.10 +* Go 1.11 or later + +I recommend using the latest release of Go. ## Benchmarks Here are some quick benchmarks comparing the pure-Go and assembly implementations of Sum64. -| input size | purego | asm | -| --- | --- | --- | -| 5 B | 979.66 MB/s | 1291.17 MB/s | -| 100 B | 7475.26 MB/s | 7973.40 MB/s | -| 4 KB | 17573.46 MB/s | 17602.65 MB/s | -| 10 MB | 17131.46 MB/s | 17142.16 MB/s | +| input size | purego | asm | +| ---------- | --------- | --------- | +| 4 B | 1.3 GB/s | 1.2 GB/s | +| 16 B | 2.9 GB/s | 3.5 GB/s | +| 100 B | 6.9 GB/s | 8.1 GB/s | +| 4 KB | 11.7 GB/s | 16.7 GB/s | +| 10 MB | 12.0 GB/s | 17.3 GB/s | -These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using -the following commands under Go 1.11.2: +These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C +CPU using the following commands under Go 1.19.2: ``` -$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' -$ go test -benchtime 10s -bench '/xxhash,direct,bytes' +benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$') +benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') ``` ## Projects using this package - [InfluxDB](https://github.com/influxdata/influxdb) - [Prometheus](https://github.com/prometheus/prometheus) +- [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) - [FreeCache](https://github.com/coocood/freecache) +- [FastCache](https://github.com/VictoriaMetrics/fastcache) diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go index 2c112a0ab..fc40c8200 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go @@ -18,19 +18,11 @@ const ( prime5 uint64 = 2870177450012600261 ) -// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where -// possible in the Go code is worth a small (but measurable) performance boost -// by avoiding some MOVQs. Vars are needed for the asm and also are useful for -// convenience in the Go code in a few places where we need to intentionally -// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the -// result overflows a uint64). -var ( - prime1v = prime1 - prime2v = prime2 - prime3v = prime3 - prime4v = prime4 - prime5v = prime5 -) +// Store the primes in an array as well. +// +// The consts are used when possible in Go code to avoid MOVs but we need a +// contiguous array of the assembly code. +var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} // Digest implements hash.Hash64. type Digest struct { @@ -52,10 +44,10 @@ func New() *Digest { // Reset clears the Digest's state so that it can be reused. func (d *Digest) Reset() { - d.v1 = prime1v + prime2 + d.v1 = primes[0] + prime2 d.v2 = prime2 d.v3 = 0 - d.v4 = -prime1v + d.v4 = -primes[0] d.total = 0 d.n = 0 } @@ -71,21 +63,23 @@ func (d *Digest) Write(b []byte) (n int, err error) { n = len(b) d.total += uint64(n) + memleft := d.mem[d.n&(len(d.mem)-1):] + if d.n+n < 32 { // This new data doesn't even fill the current block. - copy(d.mem[d.n:], b) + copy(memleft, b) d.n += n return } if d.n > 0 { // Finish off the partial block. - copy(d.mem[d.n:], b) + c := copy(memleft, b) d.v1 = round(d.v1, u64(d.mem[0:8])) d.v2 = round(d.v2, u64(d.mem[8:16])) d.v3 = round(d.v3, u64(d.mem[16:24])) d.v4 = round(d.v4, u64(d.mem[24:32])) - b = b[32-d.n:] + b = b[c:] d.n = 0 } @@ -135,21 +129,20 @@ func (d *Digest) Sum64() uint64 { h += d.total - i, end := 0, d.n - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(d.mem[i:i+8])) + b := d.mem[:d.n&(len(d.mem)-1)] + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(d.mem[i:i+4])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for i < end { - h ^= uint64(d.mem[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 - i++ } h ^= h >> 33 diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s index be8db5bf7..ddb63aa91 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s @@ -1,215 +1,210 @@ +//go:build !appengine && gc && !purego && !noasm // +build !appengine // +build gc // +build !purego +// +build !noasm #include "textflag.h" -// Register allocation: -// AX h -// SI pointer to advance through b -// DX n -// BX loop end -// R8 v1, k1 -// R9 v2 -// R10 v3 -// R11 v4 -// R12 tmp -// R13 prime1v -// R14 prime2v -// DI prime4v - -// round reads from and advances the buffer pointer in SI. -// It assumes that R13 has prime1v and R14 has prime2v. -#define round(r) \ - MOVQ (SI), R12 \ - ADDQ $8, SI \ - IMULQ R14, R12 \ - ADDQ R12, r \ - ROLQ $31, r \ - IMULQ R13, r - -// mergeRound applies a merge round on the two registers acc and val. -// It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v. -#define mergeRound(acc, val) \ - IMULQ R14, val \ - ROLQ $31, val \ - IMULQ R13, val \ - XORQ val, acc \ - IMULQ R13, acc \ - ADDQ DI, acc +// Registers: +#define h AX +#define d AX +#define p SI // pointer to advance through b +#define n DX +#define end BX // loop end +#define v1 R8 +#define v2 R9 +#define v3 R10 +#define v4 R11 +#define x R12 +#define prime1 R13 +#define prime2 R14 +#define prime4 DI + +#define round(acc, x) \ + IMULQ prime2, x \ + ADDQ x, acc \ + ROLQ $31, acc \ + IMULQ prime1, acc + +// round0 performs the operation x = round(0, x). +#define round0(x) \ + IMULQ prime2, x \ + ROLQ $31, x \ + IMULQ prime1, x + +// mergeRound applies a merge round on the two registers acc and x. +// It assumes that prime1, prime2, and prime4 have been loaded. +#define mergeRound(acc, x) \ + round0(x) \ + XORQ x, acc \ + IMULQ prime1, acc \ + ADDQ prime4, acc + +// blockLoop processes as many 32-byte blocks as possible, +// updating v1, v2, v3, and v4. It assumes that there is at least one block +// to process. +#define blockLoop() \ +loop: \ + MOVQ +0(p), x \ + round(v1, x) \ + MOVQ +8(p), x \ + round(v2, x) \ + MOVQ +16(p), x \ + round(v3, x) \ + MOVQ +24(p), x \ + round(v4, x) \ + ADDQ $32, p \ + CMPQ p, end \ + JLE loop // func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOSPLIT, $0-32 +TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 // Load fixed primes. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 - MOVQ ·prime4v(SB), DI + MOVQ ·primes+0(SB), prime1 + MOVQ ·primes+8(SB), prime2 + MOVQ ·primes+24(SB), prime4 // Load slice. - MOVQ b_base+0(FP), SI - MOVQ b_len+8(FP), DX - LEAQ (SI)(DX*1), BX + MOVQ b_base+0(FP), p + MOVQ b_len+8(FP), n + LEAQ (p)(n*1), end // The first loop limit will be len(b)-32. - SUBQ $32, BX + SUBQ $32, end // Check whether we have at least one block. - CMPQ DX, $32 + CMPQ n, $32 JLT noBlocks // Set up initial state (v1, v2, v3, v4). - MOVQ R13, R8 - ADDQ R14, R8 - MOVQ R14, R9 - XORQ R10, R10 - XORQ R11, R11 - SUBQ R13, R11 - - // Loop until SI > BX. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ SI, BX - JLE blockLoop - - MOVQ R8, AX - ROLQ $1, AX - MOVQ R9, R12 - ROLQ $7, R12 - ADDQ R12, AX - MOVQ R10, R12 - ROLQ $12, R12 - ADDQ R12, AX - MOVQ R11, R12 - ROLQ $18, R12 - ADDQ R12, AX - - mergeRound(AX, R8) - mergeRound(AX, R9) - mergeRound(AX, R10) - mergeRound(AX, R11) + MOVQ prime1, v1 + ADDQ prime2, v1 + MOVQ prime2, v2 + XORQ v3, v3 + XORQ v4, v4 + SUBQ prime1, v4 + + blockLoop() + + MOVQ v1, h + ROLQ $1, h + MOVQ v2, x + ROLQ $7, x + ADDQ x, h + MOVQ v3, x + ROLQ $12, x + ADDQ x, h + MOVQ v4, x + ROLQ $18, x + ADDQ x, h + + mergeRound(h, v1) + mergeRound(h, v2) + mergeRound(h, v3) + mergeRound(h, v4) JMP afterBlocks noBlocks: - MOVQ ·prime5v(SB), AX + MOVQ ·primes+32(SB), h afterBlocks: - ADDQ DX, AX - - // Right now BX has len(b)-32, and we want to loop until SI > len(b)-8. - ADDQ $24, BX - - CMPQ SI, BX - JG fourByte - -wordLoop: - // Calculate k1. - MOVQ (SI), R8 - ADDQ $8, SI - IMULQ R14, R8 - ROLQ $31, R8 - IMULQ R13, R8 - - XORQ R8, AX - ROLQ $27, AX - IMULQ R13, AX - ADDQ DI, AX - - CMPQ SI, BX - JLE wordLoop - -fourByte: - ADDQ $4, BX - CMPQ SI, BX - JG singles - - MOVL (SI), R8 - ADDQ $4, SI - IMULQ R13, R8 - XORQ R8, AX - - ROLQ $23, AX - IMULQ R14, AX - ADDQ ·prime3v(SB), AX - -singles: - ADDQ $4, BX - CMPQ SI, BX + ADDQ n, h + + ADDQ $24, end + CMPQ p, end + JG try4 + +loop8: + MOVQ (p), x + ADDQ $8, p + round0(x) + XORQ x, h + ROLQ $27, h + IMULQ prime1, h + ADDQ prime4, h + + CMPQ p, end + JLE loop8 + +try4: + ADDQ $4, end + CMPQ p, end + JG try1 + + MOVL (p), x + ADDQ $4, p + IMULQ prime1, x + XORQ x, h + + ROLQ $23, h + IMULQ prime2, h + ADDQ ·primes+16(SB), h + +try1: + ADDQ $4, end + CMPQ p, end JGE finalize -singlesLoop: - MOVBQZX (SI), R12 - ADDQ $1, SI - IMULQ ·prime5v(SB), R12 - XORQ R12, AX +loop1: + MOVBQZX (p), x + ADDQ $1, p + IMULQ ·primes+32(SB), x + XORQ x, h + ROLQ $11, h + IMULQ prime1, h - ROLQ $11, AX - IMULQ R13, AX - - CMPQ SI, BX - JL singlesLoop + CMPQ p, end + JL loop1 finalize: - MOVQ AX, R12 - SHRQ $33, R12 - XORQ R12, AX - IMULQ R14, AX - MOVQ AX, R12 - SHRQ $29, R12 - XORQ R12, AX - IMULQ ·prime3v(SB), AX - MOVQ AX, R12 - SHRQ $32, R12 - XORQ R12, AX - - MOVQ AX, ret+24(FP) + MOVQ h, x + SHRQ $33, x + XORQ x, h + IMULQ prime2, h + MOVQ h, x + SHRQ $29, x + XORQ x, h + IMULQ ·primes+16(SB), h + MOVQ h, x + SHRQ $32, x + XORQ x, h + + MOVQ h, ret+24(FP) RET -// writeBlocks uses the same registers as above except that it uses AX to store -// the d pointer. - // func writeBlocks(d *Digest, b []byte) int -TEXT ·writeBlocks(SB), NOSPLIT, $0-40 +TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 // Load fixed primes needed for round. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 + MOVQ ·primes+0(SB), prime1 + MOVQ ·primes+8(SB), prime2 // Load slice. - MOVQ b_base+8(FP), SI - MOVQ b_len+16(FP), DX - LEAQ (SI)(DX*1), BX - SUBQ $32, BX + MOVQ b_base+8(FP), p + MOVQ b_len+16(FP), n + LEAQ (p)(n*1), end + SUBQ $32, end // Load vN from d. - MOVQ d+0(FP), AX - MOVQ 0(AX), R8 // v1 - MOVQ 8(AX), R9 // v2 - MOVQ 16(AX), R10 // v3 - MOVQ 24(AX), R11 // v4 + MOVQ s+0(FP), d + MOVQ 0(d), v1 + MOVQ 8(d), v2 + MOVQ 16(d), v3 + MOVQ 24(d), v4 // We don't need to check the loop condition here; this function is // always called with at least one block of data to process. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ SI, BX - JLE blockLoop + blockLoop() // Copy vN back to d. - MOVQ R8, 0(AX) - MOVQ R9, 8(AX) - MOVQ R10, 16(AX) - MOVQ R11, 24(AX) - - // The number of bytes written is SI minus the old base pointer. - SUBQ b_base+8(FP), SI - MOVQ SI, ret+32(FP) + MOVQ v1, 0(d) + MOVQ v2, 8(d) + MOVQ v3, 16(d) + MOVQ v4, 24(d) + + // The number of bytes written is p minus the old base pointer. + SUBQ b_base+8(FP), p + MOVQ p, ret+32(FP) RET diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s index 662609589..17901e080 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s @@ -1,13 +1,17 @@ -// +build gc,!purego +//go:build !appengine && gc && !purego && !noasm +// +build !appengine +// +build gc +// +build !purego +// +build !noasm #include "textflag.h" -// Register allocation. +// Registers: #define digest R1 -#define h R2 // Return value. -#define p R3 // Input pointer. -#define len R4 -#define nblocks R5 // len / 32. +#define h R2 // return value +#define p R3 // input pointer +#define n R4 // input length +#define nblocks R5 // n / 32 #define prime1 R7 #define prime2 R8 #define prime3 R9 @@ -22,65 +26,55 @@ #define x3 R22 #define x4 R23 -#define round(acc, x) \ - MADD prime2, acc, x, acc \ - ROR $64-31, acc \ - MUL prime1, acc \ - -// x = round(0, x). -#define round0(x) \ - MUL prime2, x \ - ROR $64-31, x \ - MUL prime1, x \ - -#define mergeRound(x) \ - round0(x) \ - EOR x, h \ - MADD h, prime4, prime1, h \ - -// Update v[1-4] with 32-byte blocks. Assumes len >= 32. -#define blocksLoop() \ - LSR $5, len, nblocks \ - PCALIGN $16 \ -loop: \ - LDP.P 32(p), (x1, x2) \ - round(v1, x1) \ - LDP -16(p), (x3, x4) \ - round(v2, x2) \ - SUB $1, nblocks \ - round(v3, x3) \ - round(v4, x4) \ - CBNZ nblocks, loop \ - - -// The primes are repeated here to ensure that they're stored -// in a contiguous array, so we can load them with LDP. -DATA primes<> +0(SB)/8, $11400714785074694791 -DATA primes<> +8(SB)/8, $14029467366897019727 -DATA primes<>+16(SB)/8, $1609587929392839161 -DATA primes<>+24(SB)/8, $9650029242287828579 -DATA primes<>+32(SB)/8, $2870177450012600261 -GLOBL primes<>(SB), NOPTR+RODATA, $40 - +#define round(acc, x) \ + MADD prime2, acc, x, acc \ + ROR $64-31, acc \ + MUL prime1, acc + +// round0 performs the operation x = round(0, x). +#define round0(x) \ + MUL prime2, x \ + ROR $64-31, x \ + MUL prime1, x + +#define mergeRound(acc, x) \ + round0(x) \ + EOR x, acc \ + MADD acc, prime4, prime1, acc + +// blockLoop processes as many 32-byte blocks as possible, +// updating v1, v2, v3, and v4. It assumes that n >= 32. +#define blockLoop() \ + LSR $5, n, nblocks \ + PCALIGN $16 \ + loop: \ + LDP.P 16(p), (x1, x2) \ + LDP.P 16(p), (x3, x4) \ + round(v1, x1) \ + round(v2, x2) \ + round(v3, x3) \ + round(v4, x4) \ + SUB $1, nblocks \ + CBNZ nblocks, loop // func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOFRAME+NOSPLIT, $0-32 - LDP b_base+0(FP), (p, len) +TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 + LDP b_base+0(FP), (p, n) - LDP primes<> +0(SB), (prime1, prime2) - LDP primes<>+16(SB), (prime3, prime4) - MOVD primes<>+32(SB), prime5 + LDP ·primes+0(SB), (prime1, prime2) + LDP ·primes+16(SB), (prime3, prime4) + MOVD ·primes+32(SB), prime5 - CMP $32, len - CSEL LO, prime5, ZR, h // if len < 32 { h = prime5 } else { h = 0 } - BLO afterLoop + CMP $32, n + CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 } + BLT afterLoop ADD prime1, prime2, v1 MOVD prime2, v2 MOVD $0, v3 NEG prime1, v4 - blocksLoop() + blockLoop() ROR $64-1, v1, x1 ROR $64-7, v2, x2 @@ -90,100 +84,101 @@ TEXT ·Sum64(SB), NOFRAME+NOSPLIT, $0-32 ADD x3, x4 ADD x2, x4, h - mergeRound(v1) - mergeRound(v2) - mergeRound(v3) - mergeRound(v4) + mergeRound(h, v1) + mergeRound(h, v2) + mergeRound(h, v3) + mergeRound(h, v4) afterLoop: - ADD len, h + ADD n, h - TBZ $4, len, try8 + TBZ $4, n, try8 LDP.P 16(p), (x1, x2) round0(x1) + + // NOTE: here and below, sequencing the EOR after the ROR (using a + // rotated register) is worth a small but measurable speedup for small + // inputs. ROR $64-27, h EOR x1 @> 64-27, h, h MADD h, prime4, prime1, h round0(x2) ROR $64-27, h - EOR x2 @> 64-27, h + EOR x2 @> 64-27, h, h MADD h, prime4, prime1, h try8: - TBZ $3, len, try4 + TBZ $3, n, try4 MOVD.P 8(p), x1 round0(x1) ROR $64-27, h - EOR x1 @> 64-27, h + EOR x1 @> 64-27, h, h MADD h, prime4, prime1, h try4: - TBZ $2, len, try2 + TBZ $2, n, try2 MOVWU.P 4(p), x2 MUL prime1, x2 ROR $64-23, h - EOR x2 @> 64-23, h + EOR x2 @> 64-23, h, h MADD h, prime3, prime2, h try2: - TBZ $1, len, try1 + TBZ $1, n, try1 MOVHU.P 2(p), x3 AND $255, x3, x1 LSR $8, x3, x2 MUL prime5, x1 ROR $64-11, h - EOR x1 @> 64-11, h + EOR x1 @> 64-11, h, h MUL prime1, h MUL prime5, x2 ROR $64-11, h - EOR x2 @> 64-11, h + EOR x2 @> 64-11, h, h MUL prime1, h try1: - TBZ $0, len, end + TBZ $0, n, finalize MOVBU (p), x4 MUL prime5, x4 ROR $64-11, h - EOR x4 @> 64-11, h + EOR x4 @> 64-11, h, h MUL prime1, h -end: +finalize: EOR h >> 33, h - MUL prime2, h + MUL prime2, h EOR h >> 29, h - MUL prime3, h + MUL prime3, h EOR h >> 32, h MOVD h, ret+24(FP) RET - // func writeBlocks(d *Digest, b []byte) int -// -// Assumes len(b) >= 32. -TEXT ·writeBlocks(SB), NOFRAME+NOSPLIT, $0-40 - LDP primes<>(SB), (prime1, prime2) +TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 + LDP ·primes+0(SB), (prime1, prime2) // Load state. Assume v[1-4] are stored contiguously. MOVD d+0(FP), digest - LDP 0(digest), (v1, v2) + LDP 0(digest), (v1, v2) LDP 16(digest), (v3, v4) - LDP b_base+8(FP), (p, len) + LDP b_base+8(FP), (p, n) - blocksLoop() + blockLoop() // Store updated state. - STP (v1, v2), 0(digest) + STP (v1, v2), 0(digest) STP (v3, v4), 16(digest) - BIC $31, len - MOVD len, ret+32(FP) + BIC $31, n + MOVD n, ret+32(FP) RET diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go index 9216e0a40..d4221edf4 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go @@ -1,8 +1,9 @@ -//go:build (amd64 || arm64) && !appengine && gc && !purego +//go:build (amd64 || arm64) && !appengine && gc && !purego && !noasm // +build amd64 arm64 // +build !appengine // +build gc // +build !purego +// +build !noasm package xxhash @@ -12,4 +13,4 @@ package xxhash func Sum64(b []byte) uint64 //go:noescape -func writeBlocks(d *Digest, b []byte) int +func writeBlocks(s *Digest, b []byte) int diff --git a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go index 2deb1ca75..0be16cefc 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go @@ -1,5 +1,5 @@ -//go:build (!amd64 && !arm64) || appengine || !gc || purego -// +build !amd64,!arm64 appengine !gc purego +//go:build (!amd64 && !arm64) || appengine || !gc || purego || noasm +// +build !amd64,!arm64 appengine !gc purego noasm package xxhash @@ -15,10 +15,10 @@ func Sum64(b []byte) uint64 { var h uint64 if n >= 32 { - v1 := prime1v + prime2 + v1 := primes[0] + prime2 v2 := prime2 v3 := uint64(0) - v4 := -prime1v + v4 := -primes[0] for len(b) >= 32 { v1 = round(v1, u64(b[0:8:len(b)])) v2 = round(v2, u64(b[8:16:len(b)])) @@ -37,19 +37,18 @@ func Sum64(b []byte) uint64 { h += uint64(n) - i, end := 0, len(b) - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(b[i:i+8:len(b)])) + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for ; i < end; i++ { - h ^= uint64(b[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/seqdec.go b/tools/vendor/github.com/klauspost/compress/zstd/seqdec.go index bc731e4cb..9405fcf10 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/seqdec.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/seqdec.go @@ -20,6 +20,10 @@ type seq struct { llCode, mlCode, ofCode uint8 } +type seqVals struct { + ll, ml, mo int +} + func (s seq) String() string { if s.offset <= 3 { if s.offset == 0 { @@ -61,16 +65,19 @@ type sequenceDecs struct { offsets sequenceDec matchLengths sequenceDec prevOffset [3]int - hist []byte dict []byte literals []byte out []byte + nSeqs int + br *bitReader + seqSize int windowSize int maxBits uint8 + maxSyncLen uint64 } // initialize all 3 decoders from the stream input. -func (s *sequenceDecs) initialize(br *bitReader, hist *history, literals, out []byte) error { +func (s *sequenceDecs) initialize(br *bitReader, hist *history, out []byte) error { if err := s.litLengths.init(br); err != nil { return errors.New("litLengths:" + err.Error()) } @@ -80,8 +87,7 @@ func (s *sequenceDecs) initialize(br *bitReader, hist *history, literals, out [] if err := s.matchLengths.init(br); err != nil { return errors.New("matchLengths:" + err.Error()) } - s.literals = literals - s.hist = hist.b + s.br = br s.prevOffset = hist.recentOffsets s.maxBits = s.litLengths.fse.maxBits + s.offsets.fse.maxBits + s.matchLengths.fse.maxBits s.windowSize = hist.windowSize @@ -93,16 +99,149 @@ func (s *sequenceDecs) initialize(br *bitReader, hist *history, literals, out [] return nil } +func (s *sequenceDecs) freeDecoders() { + if f := s.litLengths.fse; f != nil && !f.preDefined { + fseDecoderPool.Put(f) + s.litLengths.fse = nil + } + if f := s.offsets.fse; f != nil && !f.preDefined { + fseDecoderPool.Put(f) + s.offsets.fse = nil + } + if f := s.matchLengths.fse; f != nil && !f.preDefined { + fseDecoderPool.Put(f) + s.matchLengths.fse = nil + } +} + +// execute will execute the decoded sequence with the provided history. +// The sequence must be evaluated before being sent. +func (s *sequenceDecs) execute(seqs []seqVals, hist []byte) error { + if len(s.dict) == 0 { + return s.executeSimple(seqs, hist) + } + + // Ensure we have enough output size... + if len(s.out)+s.seqSize > cap(s.out) { + addBytes := s.seqSize + len(s.out) + s.out = append(s.out, make([]byte, addBytes)...) + s.out = s.out[:len(s.out)-addBytes] + } + + if debugDecoder { + printf("Execute %d seqs with hist %d, dict %d, literals: %d into %d bytes\n", len(seqs), len(hist), len(s.dict), len(s.literals), s.seqSize) + } + + var t = len(s.out) + out := s.out[:t+s.seqSize] + + for _, seq := range seqs { + // Add literals + copy(out[t:], s.literals[:seq.ll]) + t += seq.ll + s.literals = s.literals[seq.ll:] + + // Copy from dictionary... + if seq.mo > t+len(hist) || seq.mo > s.windowSize { + if len(s.dict) == 0 { + return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist)) + } + + // we may be in dictionary. + dictO := len(s.dict) - (seq.mo - (t + len(hist))) + if dictO < 0 || dictO >= len(s.dict) { + return fmt.Errorf("match offset (%d) bigger than current history+dict (%d)", seq.mo, t+len(hist)+len(s.dict)) + } + end := dictO + seq.ml + if end > len(s.dict) { + n := len(s.dict) - dictO + copy(out[t:], s.dict[dictO:]) + t += n + seq.ml -= n + } else { + copy(out[t:], s.dict[dictO:end]) + t += end - dictO + continue + } + } + + // Copy from history. + if v := seq.mo - t; v > 0 { + // v is the start position in history from end. + start := len(hist) - v + if seq.ml > v { + // Some goes into current block. + // Copy remainder of history + copy(out[t:], hist[start:]) + t += v + seq.ml -= v + } else { + copy(out[t:], hist[start:start+seq.ml]) + t += seq.ml + continue + } + } + // We must be in current buffer now + if seq.ml > 0 { + start := t - seq.mo + if seq.ml <= t-start { + // No overlap + copy(out[t:], out[start:start+seq.ml]) + t += seq.ml + continue + } else { + // Overlapping copy + // Extend destination slice and copy one byte at the time. + src := out[start : start+seq.ml] + dst := out[t:] + dst = dst[:len(src)] + t += len(src) + // Destination is the space we just added. + for i := range src { + dst[i] = src[i] + } + } + } + } + + // Add final literals + copy(out[t:], s.literals) + if debugDecoder { + t += len(s.literals) + if t != len(out) { + panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) + } + } + s.out = out + + return nil +} + // decode sequences from the stream with the provided history. -func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { +func (s *sequenceDecs) decodeSync(hist []byte) error { + supported, err := s.decodeSyncSimple(hist) + if supported { + return err + } + + br := s.br + seqs := s.nSeqs startSize := len(s.out) // Grab full sizes tables, to avoid bounds checks. llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize] llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state + out := s.out + maxBlockSize := maxCompressedBlockSize + if s.windowSize < maxBlockSize { + 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 @@ -151,7 +290,7 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { if temp == 0 { // 0 is not valid; input is corrupted; force offset to 1 - println("temp was 0") + println("WARNING: temp was 0") temp = 1 } @@ -176,51 +315,49 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { if ll > len(s.literals) { return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, len(s.literals)) } - size := ll + ml + len(s.out) + size := ll + ml + len(out) if size-startSize > maxBlockSize { - return fmt.Errorf("output (%d) bigger than max block size", size) + return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) } - if size > cap(s.out) { + if size > cap(out) { // Not enough size, which can happen under high volume block streaming conditions // but could be if destination slice is too small for sync operations. // over-allocating here can create a large amount of GC pressure so we try to keep // it as contained as possible - used := len(s.out) - startSize + used := len(out) - startSize addBytes := 256 + ll + ml + used>>2 // Clamp to max block size. if used+addBytes > maxBlockSize { addBytes = maxBlockSize - used } - s.out = append(s.out, make([]byte, addBytes)...) - s.out = s.out[:len(s.out)-addBytes] + out = append(out, make([]byte, addBytes)...) + out = out[:len(out)-addBytes] } if ml > maxMatchLen { return fmt.Errorf("match len (%d) bigger than max allowed length", ml) } // Add literals - s.out = append(s.out, s.literals[:ll]...) + out = append(out, s.literals[:ll]...) s.literals = s.literals[ll:] - out := s.out if mo == 0 && ml > 0 { return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) } - if mo > len(s.out)+len(hist) || mo > s.windowSize { + if mo > len(out)+len(hist) || mo > s.windowSize { if len(s.dict) == 0 { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(s.out)+len(hist)) + return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize) } // we may be in dictionary. - dictO := len(s.dict) - (mo - (len(s.out) + len(hist))) + dictO := len(s.dict) - (mo - (len(out) + len(hist))) if dictO < 0 || dictO >= len(s.dict) { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(s.out)+len(hist)) + return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize) } end := dictO + ml if end > len(s.dict) { out = append(out, s.dict[dictO:]...) - mo -= len(s.dict) - dictO ml -= len(s.dict) - dictO } else { out = append(out, s.dict[dictO:end]...) @@ -231,26 +368,25 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { // Copy from history. // TODO: Blocks without history could be made to ignore this completely. - if v := mo - len(s.out); v > 0 { + if v := mo - len(out); v > 0 { // v is the start position in history from end. - start := len(s.hist) - v + start := len(hist) - v if ml > v { // Some goes into current block. // Copy remainder of history - out = append(out, s.hist[start:]...) - mo -= v + out = append(out, hist[start:]...) ml -= v } else { - out = append(out, s.hist[start:start+ml]...) + out = append(out, hist[start:start+ml]...) ml = 0 } } // We must be in current buffer now if ml > 0 { - start := len(s.out) - mo - if ml <= len(s.out)-start { + start := len(out) - mo + if ml <= len(out)-start { // No overlap - out = append(out, s.out[start:start+ml]...) + out = append(out, out[start:start+ml]...) } else { // Overlapping copy // Extend destination slice and copy one byte at the time. @@ -264,7 +400,6 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { } } } - s.out = out if i == 0 { // This is the last sequence, so we shouldn't update state. break @@ -279,6 +414,7 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { ofState = ofTable[ofState.newState()&maxTableMask] } else { bits := br.get32BitsFast(nBits) + lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31)) llState = llTable[(llState.newState()+lowBits)&maxTableMask] @@ -291,19 +427,13 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error { } } - // Add final literals - s.out = append(s.out, s.literals...) - return nil -} + if size := len(s.literals) + len(out) - startSize; size > maxBlockSize { + return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) + } -// update states, at least 27 bits must be available. -func (s *sequenceDecs) update(br *bitReader) { - // Max 8 bits - s.litLengths.state.next(br) - // Max 9 bits - s.matchLengths.state.next(br) - // Max 8 bits - s.offsets.state.next(br) + // Add final literals + s.out = append(out, s.literals...) + return br.close() } var bitMask [16]uint16 @@ -314,87 +444,6 @@ func init() { } } -// update states, at least 27 bits must be available. -func (s *sequenceDecs) updateAlt(br *bitReader) { - // Update all 3 states at once. Approx 20% faster. - a, b, c := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state - - nBits := a.nbBits() + b.nbBits() + c.nbBits() - if nBits == 0 { - s.litLengths.state.state = s.litLengths.state.dt[a.newState()] - s.matchLengths.state.state = s.matchLengths.state.dt[b.newState()] - s.offsets.state.state = s.offsets.state.dt[c.newState()] - return - } - bits := br.get32BitsFast(nBits) - lowBits := uint16(bits >> ((c.nbBits() + b.nbBits()) & 31)) - s.litLengths.state.state = s.litLengths.state.dt[a.newState()+lowBits] - - lowBits = uint16(bits >> (c.nbBits() & 31)) - lowBits &= bitMask[b.nbBits()&15] - s.matchLengths.state.state = s.matchLengths.state.dt[b.newState()+lowBits] - - lowBits = uint16(bits) & bitMask[c.nbBits()&15] - s.offsets.state.state = s.offsets.state.dt[c.newState()+lowBits] -} - -// nextFast will return new states when there are at least 4 unused bytes left on the stream when done. -func (s *sequenceDecs) nextFast(br *bitReader, llState, mlState, ofState decSymbol) (ll, mo, ml int) { - // Final will not read from stream. - ll, llB := llState.final() - ml, mlB := mlState.final() - mo, moB := ofState.final() - - // extra bits are stored in reverse order. - br.fillFast() - mo += br.getBits(moB) - if s.maxBits > 32 { - br.fillFast() - } - ml += br.getBits(mlB) - ll += br.getBits(llB) - - if moB > 1 { - s.prevOffset[2] = s.prevOffset[1] - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = mo - return - } - // mo = s.adjustOffset(mo, ll, moB) - // Inlined for rather big speedup - if ll == 0 { - // There is an exception though, when current sequence's literals_length = 0. - // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, - // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. - mo++ - } - - if mo == 0 { - mo = s.prevOffset[0] - return - } - var temp int - if mo == 3 { - temp = s.prevOffset[0] - 1 - } else { - temp = s.prevOffset[mo] - } - - if temp == 0 { - // 0 is not valid; input is corrupted; force offset to 1 - println("temp was 0") - temp = 1 - } - - if mo != 1 { - s.prevOffset[2] = s.prevOffset[1] - } - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = temp - mo = temp - return -} - func (s *sequenceDecs) next(br *bitReader, llState, mlState, ofState decSymbol) (ll, mo, ml int) { // Final will not read from stream. ll, llB := llState.final() @@ -457,36 +506,3 @@ func (s *sequenceDecs) adjustOffset(offset, litLen int, offsetB uint8) int { s.prevOffset[0] = temp return temp } - -// mergeHistory will merge history. -func (s *sequenceDecs) mergeHistory(hist *sequenceDecs) (*sequenceDecs, error) { - for i := uint(0); i < 3; i++ { - var sNew, sHist *sequenceDec - switch i { - default: - // same as "case 0": - sNew = &s.litLengths - sHist = &hist.litLengths - case 1: - sNew = &s.offsets - sHist = &hist.offsets - case 2: - sNew = &s.matchLengths - sHist = &hist.matchLengths - } - if sNew.repeat { - if sHist.fse == nil { - return nil, fmt.Errorf("sequence stream %d, repeat requested, but no history", i) - } - continue - } - if sNew.fse == nil { - return nil, fmt.Errorf("sequence stream %d, no fse found", i) - } - if sHist.fse != nil && !sHist.fse.preDefined { - fseDecoderPool.Put(sHist.fse) - } - sHist.fse = sNew.fse - } - return hist, nil -} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go new file mode 100644 index 000000000..8adabd828 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go @@ -0,0 +1,394 @@ +//go:build amd64 && !appengine && !noasm && gc +// +build amd64,!appengine,!noasm,gc + +package zstd + +import ( + "fmt" + "io" + + "github.com/klauspost/compress/internal/cpuinfo" +) + +type decodeSyncAsmContext struct { + llTable []decSymbol + mlTable []decSymbol + ofTable []decSymbol + llState uint64 + mlState uint64 + ofState uint64 + iteration int + litRemain int + out []byte + outPosition int + literals []byte + litPosition int + history []byte + windowSize int + ll int // set on error (not for all errors, please refer to _generate/gen.go) + ml int // set on error (not for all errors, please refer to _generate/gen.go) + mo int // set on error (not for all errors, please refer to _generate/gen.go) +} + +// sequenceDecs_decodeSync_amd64 implements the main loop of sequenceDecs.decodeSync in x86 asm. +// +// Please refer to seqdec_generic.go for the reference implementation. +// +//go:noescape +func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int + +// sequenceDecs_decodeSync_bmi2 implements the main loop of sequenceDecs.decodeSync in x86 asm with BMI2 extensions. +// +//go:noescape +func sequenceDecs_decodeSync_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int + +// sequenceDecs_decodeSync_safe_amd64 does the same as above, but does not write more than output buffer. +// +//go:noescape +func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int + +// sequenceDecs_decodeSync_safe_bmi2 does the same as above, but does not write more than output buffer. +// +//go:noescape +func sequenceDecs_decodeSync_safe_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int + +// decode sequences from the stream with the provided history but without a dictionary. +func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { + if len(s.dict) > 0 { + return false, nil + } + if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSize { + return false, nil + } + + // FIXME: Using unsafe memory copies leads to rare, random crashes + // with fuzz testing. It is therefore disabled for now. + const useSafe = true + /* + useSafe := false + if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSizeAlloc { + useSafe = true + } + if s.maxSyncLen > 0 && cap(s.out)-len(s.out)-compressedBlockOverAlloc < int(s.maxSyncLen) { + useSafe = true + } + if cap(s.literals) < len(s.literals)+compressedBlockOverAlloc { + useSafe = true + } + */ + + br := s.br + + maxBlockSize := maxCompressedBlockSize + if s.windowSize < maxBlockSize { + maxBlockSize = s.windowSize + } + + ctx := decodeSyncAsmContext{ + llTable: s.litLengths.fse.dt[:maxTablesize], + mlTable: s.matchLengths.fse.dt[:maxTablesize], + ofTable: s.offsets.fse.dt[:maxTablesize], + llState: uint64(s.litLengths.state.state), + mlState: uint64(s.matchLengths.state.state), + ofState: uint64(s.offsets.state.state), + iteration: s.nSeqs - 1, + litRemain: len(s.literals), + out: s.out, + outPosition: len(s.out), + literals: s.literals, + windowSize: s.windowSize, + history: hist, + } + + s.seqSize = 0 + startSize := len(s.out) + + var errCode int + if cpuinfo.HasBMI2() { + if useSafe { + errCode = sequenceDecs_decodeSync_safe_bmi2(s, br, &ctx) + } else { + errCode = sequenceDecs_decodeSync_bmi2(s, br, &ctx) + } + } else { + if useSafe { + errCode = sequenceDecs_decodeSync_safe_amd64(s, br, &ctx) + } else { + errCode = sequenceDecs_decodeSync_amd64(s, br, &ctx) + } + } + switch errCode { + case noError: + break + + case errorMatchLenOfsMismatch: + return true, fmt.Errorf("zero matchoff and matchlen (%d) > 0", ctx.ml) + + case errorMatchLenTooBig: + return true, fmt.Errorf("match len (%d) bigger than max allowed length", ctx.ml) + + case errorMatchOffTooBig: + return true, fmt.Errorf("match offset (%d) bigger than current history (%d)", + ctx.mo, ctx.outPosition+len(hist)-startSize) + + case errorNotEnoughLiterals: + 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 { + println("msl:", s.maxSyncLen, "cap", cap(s.out), "bef:", startSize, "sz:", size-startSize, "mbs:", maxBlockSize, "outsz:", cap(s.out)-startSize) + } + return true, fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) + + default: + return true, fmt.Errorf("sequenceDecs_decode returned erronous code %d", errCode) + } + + 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 { + printf("Closing sequences: %v, %+v\n", err, *br) + return true, err + } + + s.literals = s.literals[ctx.litPosition:] + t := ctx.outPosition + s.out = s.out[:t] + + // Add final literals + s.out = append(s.out, s.literals...) + if debugDecoder { + t += len(s.literals) + if t != len(s.out) { + panic(fmt.Errorf("length mismatch, want %d, got %d", len(s.out), t)) + } + } + + return true, nil +} + +// -------------------------------------------------------------------------------- + +type decodeAsmContext struct { + llTable []decSymbol + mlTable []decSymbol + ofTable []decSymbol + llState uint64 + mlState uint64 + ofState uint64 + iteration int + seqs []seqVals + litRemain int +} + +const noError = 0 + +// error reported when mo == 0 && ml > 0 +const errorMatchLenOfsMismatch = 1 + +// error reported when ml > maxMatchLen +const errorMatchLenTooBig = 2 + +// error reported when mo > available history or mo > s.windowSize +const errorMatchOffTooBig = 3 + +// error reported when the sum of literal lengths exeeceds the literal buffer size +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. +// +//go:noescape +func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int + +// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm. +// +// Please refer to seqdec_generic.go for the reference implementation. +// +//go:noescape +func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int + +// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions. +// +//go:noescape +func sequenceDecs_decode_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int + +// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions. +// +//go:noescape +func sequenceDecs_decode_56_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int + +// decode sequences from the stream without the provided history. +func (s *sequenceDecs) decode(seqs []seqVals) error { + br := s.br + + maxBlockSize := maxCompressedBlockSize + if s.windowSize < maxBlockSize { + maxBlockSize = s.windowSize + } + + ctx := decodeAsmContext{ + llTable: s.litLengths.fse.dt[:maxTablesize], + mlTable: s.matchLengths.fse.dt[:maxTablesize], + ofTable: s.offsets.fse.dt[:maxTablesize], + llState: uint64(s.litLengths.state.state), + mlState: uint64(s.matchLengths.state.state), + ofState: uint64(s.offsets.state.state), + seqs: seqs, + iteration: len(seqs) - 1, + 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 + if cpuinfo.HasBMI2() { + if lte56bits { + errCode = sequenceDecs_decode_56_bmi2(s, br, &ctx) + } else { + errCode = sequenceDecs_decode_bmi2(s, br, &ctx) + } + } else { + if lte56bits { + errCode = sequenceDecs_decode_56_amd64(s, br, &ctx) + } else { + errCode = sequenceDecs_decode_amd64(s, br, &ctx) + } + } + if errCode != 0 { + i := len(seqs) - ctx.iteration - 1 + switch errCode { + case errorMatchLenOfsMismatch: + ml := ctx.seqs[i].ml + return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) + + case errorMatchLenTooBig: + ml := ctx.seqs[i].ml + return fmt.Errorf("match len (%d) bigger than max allowed length", ml) + + 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) + } + + if ctx.litRemain < 0 { + return fmt.Errorf("literal count is too big: total available %d, total requested %d", + len(s.literals), len(s.literals)-ctx.litRemain) + } + + s.seqSize += ctx.litRemain + 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) + } + return err +} + +// -------------------------------------------------------------------------------- + +type executeAsmContext struct { + seqs []seqVals + seqIndex int + out []byte + history []byte + literals []byte + outPosition int + litPosition int + windowSize int +} + +// sequenceDecs_executeSimple_amd64 implements the main loop of sequenceDecs.executeSimple in x86 asm. +// +// Returns false if a match offset is too big. +// +// Please refer to seqdec_generic.go for the reference implementation. +// +//go:noescape +func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool + +// Same as above, but with safe memcopies +// +//go:noescape +func sequenceDecs_executeSimple_safe_amd64(ctx *executeAsmContext) bool + +// executeSimple handles cases when dictionary is not used. +func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error { + // Ensure we have enough output size... + if len(s.out)+s.seqSize+compressedBlockOverAlloc > cap(s.out) { + addBytes := s.seqSize + len(s.out) + compressedBlockOverAlloc + s.out = append(s.out, make([]byte, addBytes)...) + s.out = s.out[:len(s.out)-addBytes] + } + + if debugDecoder { + printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize) + } + + var t = len(s.out) + out := s.out[:t+s.seqSize] + + ctx := executeAsmContext{ + seqs: seqs, + seqIndex: 0, + out: out, + history: hist, + outPosition: t, + litPosition: 0, + literals: s.literals, + windowSize: s.windowSize, + } + var ok bool + if cap(s.literals) < len(s.literals)+compressedBlockOverAlloc { + ok = sequenceDecs_executeSimple_safe_amd64(&ctx) + } else { + ok = sequenceDecs_executeSimple_amd64(&ctx) + } + if !ok { + return fmt.Errorf("match offset (%d) bigger than current history (%d)", + seqs[ctx.seqIndex].mo, ctx.outPosition+len(hist)) + } + s.literals = s.literals[ctx.litPosition:] + t = ctx.outPosition + + // Add final literals + copy(out[t:], s.literals) + if debugDecoder { + t += len(s.literals) + if t != len(out) { + panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) + } + } + s.out = out + + return nil +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s new file mode 100644 index 000000000..b6f4ba6fc --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s @@ -0,0 +1,4175 @@ +// Code generated by command: go run gen.go -out ../seqdec_amd64.s -pkg=zstd. DO NOT EDIT. + +//go:build !appengine && !noasm && gc && !noasm + +// func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int +// Requires: CMOV +TEXT ·sequenceDecs_decode_amd64(SB), $8-32 + MOVQ br+8(FP), AX + MOVQ 32(AX), DX + MOVBQZX 40(AX), BX + MOVQ 24(AX), SI + MOVQ (AX), AX + ADDQ SI, AX + MOVQ AX, (SP) + MOVQ ctx+16(FP), AX + MOVQ 72(AX), DI + MOVQ 80(AX), R8 + MOVQ 88(AX), R9 + MOVQ 104(AX), R10 + MOVQ s+0(FP), AX + MOVQ 144(AX), R11 + MOVQ 152(AX), R12 + MOVQ 160(AX), R13 + +sequenceDecs_decode_amd64_main_loop: + MOVQ (SP), R14 + + // Fill bitreader to have enough for the offset and match length. + CMPQ SI, $0x08 + JL sequenceDecs_decode_amd64_fill_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R14 + MOVQ (R14), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decode_amd64_fill_end + +sequenceDecs_decode_amd64_fill_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decode_amd64_fill_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decode_amd64_fill_end + SHLQ $0x08, DX + SUBQ $0x01, R14 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R14), AX + 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 + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_amd64_of_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_amd64_of_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_amd64_of_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_amd64_of_update_zero: + MOVQ AX, 16(R10) + + // Update match length + MOVQ R8, AX + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_amd64_ml_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_amd64_ml_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_amd64_ml_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_amd64_ml_update_zero: + MOVQ AX, 8(R10) + + // Fill bitreader to have enough for the remaining + CMPQ SI, $0x08 + JL sequenceDecs_decode_amd64_fill_2_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R14 + MOVQ (R14), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decode_amd64_fill_2_end + +sequenceDecs_decode_amd64_fill_2_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decode_amd64_fill_2_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decode_amd64_fill_2_end + SHLQ $0x08, DX + SUBQ $0x01, R14 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R14), AX + 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 + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_amd64_ll_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_amd64_ll_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_amd64_ll_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_amd64_ll_update_zero: + MOVQ AX, (R10) + + // Fill bitreader for state updates + MOVQ R14, (SP) + MOVQ R9, AX + SHRQ $0x08, AX + MOVBQZX AL, AX + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decode_amd64_skip_update + + // Update Literal Length State + MOVBQZX DI, R14 + SHRQ $0x10, DI + MOVWQZX DI, DI + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, DI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(DI*8), DI + + // Update Match Length State + MOVBQZX R8, R14 + SHRQ $0x10, R8 + MOVWQZX R8, R8 + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, R8 + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Offset State + MOVBQZX R9, R14 + SHRQ $0x10, R9 + MOVWQZX R9, R9 + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, R9 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R9*8), R9 + +sequenceDecs_decode_amd64_skip_update: + // Adjust offset + MOVQ 16(R10), CX + CMPQ AX, $0x01 + JBE sequenceDecs_decode_amd64_adjust_offsetB_1_or_0 + MOVQ R12, R13 + MOVQ R11, R12 + MOVQ CX, R11 + JMP sequenceDecs_decode_amd64_after_adjust + +sequenceDecs_decode_amd64_adjust_offsetB_1_or_0: + CMPQ (R10), $0x00000000 + JNE sequenceDecs_decode_amd64_adjust_offset_maybezero + INCQ CX + JMP sequenceDecs_decode_amd64_adjust_offset_nonzero + +sequenceDecs_decode_amd64_adjust_offset_maybezero: + TESTQ CX, CX + JNZ sequenceDecs_decode_amd64_adjust_offset_nonzero + MOVQ R11, CX + JMP sequenceDecs_decode_amd64_after_adjust + +sequenceDecs_decode_amd64_adjust_offset_nonzero: + CMPQ CX, $0x01 + JB sequenceDecs_decode_amd64_adjust_zero + JEQ sequenceDecs_decode_amd64_adjust_one + CMPQ CX, $0x02 + JA sequenceDecs_decode_amd64_adjust_three + JMP sequenceDecs_decode_amd64_adjust_two + +sequenceDecs_decode_amd64_adjust_zero: + MOVQ R11, AX + JMP sequenceDecs_decode_amd64_adjust_test_temp_valid + +sequenceDecs_decode_amd64_adjust_one: + MOVQ R12, AX + JMP sequenceDecs_decode_amd64_adjust_test_temp_valid + +sequenceDecs_decode_amd64_adjust_two: + MOVQ R13, AX + JMP sequenceDecs_decode_amd64_adjust_test_temp_valid + +sequenceDecs_decode_amd64_adjust_three: + LEAQ -1(R11), AX + +sequenceDecs_decode_amd64_adjust_test_temp_valid: + TESTQ AX, AX + JNZ sequenceDecs_decode_amd64_adjust_temp_valid + MOVQ $0x00000001, AX + +sequenceDecs_decode_amd64_adjust_temp_valid: + CMPQ CX, $0x01 + CMOVQNE R12, R13 + MOVQ R11, R12 + MOVQ AX, R11 + MOVQ AX, CX + +sequenceDecs_decode_amd64_after_adjust: + MOVQ CX, 16(R10) + + // Check values + MOVQ 8(R10), AX + MOVQ (R10), R14 + LEAQ (AX)(R14*1), R15 + MOVQ s+0(FP), BP + ADDQ R15, 256(BP) + MOVQ ctx+16(FP), R15 + SUBQ R14, 128(R15) + JS error_not_enough_literals + CMPQ AX, $0x00020002 + JA sequenceDecs_decode_amd64_error_match_len_too_big + TESTQ CX, CX + JNZ sequenceDecs_decode_amd64_match_len_ofs_ok + TESTQ AX, AX + JNZ sequenceDecs_decode_amd64_error_match_len_ofs_mismatch + +sequenceDecs_decode_amd64_match_len_ofs_ok: + ADDQ $0x18, R10 + MOVQ ctx+16(FP), AX + DECQ 96(AX) + JNS sequenceDecs_decode_amd64_main_loop + MOVQ s+0(FP), AX + MOVQ R11, 144(AX) + MOVQ R12, 152(AX) + MOVQ R13, 160(AX) + MOVQ br+8(FP), AX + MOVQ DX, 32(AX) + MOVB BL, 40(AX) + MOVQ SI, 24(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decode_amd64_error_match_len_ofs_mismatch: + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decode_amd64_error_match_len_too_big: + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +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 + MOVQ br+8(FP), AX + MOVQ 32(AX), DX + MOVBQZX 40(AX), BX + MOVQ 24(AX), SI + MOVQ (AX), AX + ADDQ SI, AX + MOVQ AX, (SP) + MOVQ ctx+16(FP), AX + MOVQ 72(AX), DI + MOVQ 80(AX), R8 + MOVQ 88(AX), R9 + MOVQ 104(AX), R10 + MOVQ s+0(FP), AX + MOVQ 144(AX), R11 + MOVQ 152(AX), R12 + MOVQ 160(AX), R13 + +sequenceDecs_decode_56_amd64_main_loop: + MOVQ (SP), R14 + + // Fill bitreader to have enough for the offset and match length. + CMPQ SI, $0x08 + JL sequenceDecs_decode_56_amd64_fill_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R14 + MOVQ (R14), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decode_56_amd64_fill_end + +sequenceDecs_decode_56_amd64_fill_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decode_56_amd64_fill_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decode_56_amd64_fill_end + SHLQ $0x08, DX + SUBQ $0x01, R14 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R14), AX + 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 + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_56_amd64_of_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_56_amd64_of_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_56_amd64_of_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_56_amd64_of_update_zero: + MOVQ AX, 16(R10) + + // Update match length + MOVQ R8, AX + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_56_amd64_ml_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_56_amd64_ml_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_56_amd64_ml_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_56_amd64_ml_update_zero: + MOVQ AX, 8(R10) + + // Update literal length + MOVQ DI, AX + MOVQ BX, CX + MOVQ DX, R15 + SHLQ CL, R15 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decode_56_amd64_ll_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decode_56_amd64_ll_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decode_56_amd64_ll_update_zero + NEGQ CX + SHRQ CL, R15 + ADDQ R15, AX + +sequenceDecs_decode_56_amd64_ll_update_zero: + MOVQ AX, (R10) + + // Fill bitreader for state updates + MOVQ R14, (SP) + MOVQ R9, AX + SHRQ $0x08, AX + MOVBQZX AL, AX + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decode_56_amd64_skip_update + + // Update Literal Length State + MOVBQZX DI, R14 + SHRQ $0x10, DI + MOVWQZX DI, DI + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, DI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(DI*8), DI + + // Update Match Length State + MOVBQZX R8, R14 + SHRQ $0x10, R8 + MOVWQZX R8, R8 + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, R8 + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Offset State + MOVBQZX R9, R14 + SHRQ $0x10, R9 + MOVWQZX R9, R9 + LEAQ (BX)(R14*1), CX + MOVQ DX, R15 + MOVQ CX, BX + ROLQ CL, R15 + MOVL $0x00000001, BP + MOVB R14, CL + SHLL CL, BP + DECL BP + ANDQ BP, R15 + ADDQ R15, R9 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R9*8), R9 + +sequenceDecs_decode_56_amd64_skip_update: + // Adjust offset + MOVQ 16(R10), CX + CMPQ AX, $0x01 + JBE sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0 + MOVQ R12, R13 + MOVQ R11, R12 + MOVQ CX, R11 + JMP sequenceDecs_decode_56_amd64_after_adjust + +sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0: + CMPQ (R10), $0x00000000 + JNE sequenceDecs_decode_56_amd64_adjust_offset_maybezero + INCQ CX + JMP sequenceDecs_decode_56_amd64_adjust_offset_nonzero + +sequenceDecs_decode_56_amd64_adjust_offset_maybezero: + TESTQ CX, CX + JNZ sequenceDecs_decode_56_amd64_adjust_offset_nonzero + MOVQ R11, CX + JMP sequenceDecs_decode_56_amd64_after_adjust + +sequenceDecs_decode_56_amd64_adjust_offset_nonzero: + CMPQ CX, $0x01 + JB sequenceDecs_decode_56_amd64_adjust_zero + JEQ sequenceDecs_decode_56_amd64_adjust_one + CMPQ CX, $0x02 + JA sequenceDecs_decode_56_amd64_adjust_three + JMP sequenceDecs_decode_56_amd64_adjust_two + +sequenceDecs_decode_56_amd64_adjust_zero: + MOVQ R11, AX + JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid + +sequenceDecs_decode_56_amd64_adjust_one: + MOVQ R12, AX + JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid + +sequenceDecs_decode_56_amd64_adjust_two: + MOVQ R13, AX + JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid + +sequenceDecs_decode_56_amd64_adjust_three: + LEAQ -1(R11), AX + +sequenceDecs_decode_56_amd64_adjust_test_temp_valid: + TESTQ AX, AX + JNZ sequenceDecs_decode_56_amd64_adjust_temp_valid + MOVQ $0x00000001, AX + +sequenceDecs_decode_56_amd64_adjust_temp_valid: + CMPQ CX, $0x01 + CMOVQNE R12, R13 + MOVQ R11, R12 + MOVQ AX, R11 + MOVQ AX, CX + +sequenceDecs_decode_56_amd64_after_adjust: + MOVQ CX, 16(R10) + + // Check values + MOVQ 8(R10), AX + MOVQ (R10), R14 + LEAQ (AX)(R14*1), R15 + MOVQ s+0(FP), BP + ADDQ R15, 256(BP) + MOVQ ctx+16(FP), R15 + SUBQ R14, 128(R15) + JS error_not_enough_literals + CMPQ AX, $0x00020002 + JA sequenceDecs_decode_56_amd64_error_match_len_too_big + TESTQ CX, CX + JNZ sequenceDecs_decode_56_amd64_match_len_ofs_ok + TESTQ AX, AX + JNZ sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch + +sequenceDecs_decode_56_amd64_match_len_ofs_ok: + ADDQ $0x18, R10 + MOVQ ctx+16(FP), AX + DECQ 96(AX) + JNS sequenceDecs_decode_56_amd64_main_loop + MOVQ s+0(FP), AX + MOVQ R11, 144(AX) + MOVQ R12, 152(AX) + MOVQ R13, 160(AX) + MOVQ br+8(FP), AX + MOVQ DX, 32(AX) + MOVB BL, 40(AX) + MOVQ SI, 24(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch: + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decode_56_amd64_error_match_len_too_big: + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +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 + MOVQ br+8(FP), CX + MOVQ 32(CX), AX + MOVBQZX 40(CX), DX + MOVQ 24(CX), BX + MOVQ (CX), CX + ADDQ BX, CX + MOVQ CX, (SP) + MOVQ ctx+16(FP), CX + MOVQ 72(CX), SI + MOVQ 80(CX), DI + MOVQ 88(CX), R8 + MOVQ 104(CX), R9 + MOVQ s+0(FP), CX + MOVQ 144(CX), R10 + MOVQ 152(CX), R11 + MOVQ 160(CX), R12 + +sequenceDecs_decode_bmi2_main_loop: + MOVQ (SP), R13 + + // Fill bitreader to have enough for the offset and match length. + CMPQ BX, $0x08 + JL sequenceDecs_decode_bmi2_fill_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R13 + MOVQ (R13), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decode_bmi2_fill_end + +sequenceDecs_decode_bmi2_fill_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decode_bmi2_fill_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decode_bmi2_fill_end + SHLQ $0x08, AX + SUBQ $0x01, R13 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R13), CX + 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 + BEXTRQ CX, R8, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ R8, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, 16(R9) + + // Update match length + MOVQ $0x00000808, CX + BEXTRQ CX, DI, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ DI, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, 8(R9) + + // Fill bitreader to have enough for the remaining + CMPQ BX, $0x08 + JL sequenceDecs_decode_bmi2_fill_2_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R13 + MOVQ (R13), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decode_bmi2_fill_2_end + +sequenceDecs_decode_bmi2_fill_2_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decode_bmi2_fill_2_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decode_bmi2_fill_2_end + SHLQ $0x08, AX + SUBQ $0x01, R13 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R13), CX + 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 + BEXTRQ CX, SI, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ SI, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, (R9) + + // Fill bitreader for state updates + MOVQ R13, (SP) + MOVQ $0x00000808, CX + BEXTRQ CX, R8, R13 + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decode_bmi2_skip_update + LEAQ (SI)(DI*1), R14 + ADDQ R8, R14 + MOVBQZX R14, R14 + LEAQ (DX)(R14*1), CX + MOVQ AX, R15 + MOVQ CX, DX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + + // Update Offset State + BZHIQ R8, R15, CX + SHRXQ R8, R15, R15 + MOVQ $0x00001010, R14 + BEXTRQ R14, R8, R8 + ADDQ CX, R8 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Match Length State + BZHIQ DI, R15, CX + SHRXQ DI, R15, R15 + MOVQ $0x00001010, R14 + BEXTRQ R14, DI, DI + ADDQ CX, DI + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(DI*8), DI + + // Update Literal Length State + BZHIQ SI, R15, CX + MOVQ $0x00001010, R14 + BEXTRQ R14, SI, SI + ADDQ CX, SI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(SI*8), SI + +sequenceDecs_decode_bmi2_skip_update: + // Adjust offset + MOVQ 16(R9), CX + CMPQ R13, $0x01 + JBE sequenceDecs_decode_bmi2_adjust_offsetB_1_or_0 + MOVQ R11, R12 + MOVQ R10, R11 + MOVQ CX, R10 + JMP sequenceDecs_decode_bmi2_after_adjust + +sequenceDecs_decode_bmi2_adjust_offsetB_1_or_0: + CMPQ (R9), $0x00000000 + JNE sequenceDecs_decode_bmi2_adjust_offset_maybezero + INCQ CX + JMP sequenceDecs_decode_bmi2_adjust_offset_nonzero + +sequenceDecs_decode_bmi2_adjust_offset_maybezero: + TESTQ CX, CX + JNZ sequenceDecs_decode_bmi2_adjust_offset_nonzero + MOVQ R10, CX + JMP sequenceDecs_decode_bmi2_after_adjust + +sequenceDecs_decode_bmi2_adjust_offset_nonzero: + CMPQ CX, $0x01 + JB sequenceDecs_decode_bmi2_adjust_zero + JEQ sequenceDecs_decode_bmi2_adjust_one + CMPQ CX, $0x02 + JA sequenceDecs_decode_bmi2_adjust_three + JMP sequenceDecs_decode_bmi2_adjust_two + +sequenceDecs_decode_bmi2_adjust_zero: + MOVQ R10, R13 + JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_bmi2_adjust_one: + MOVQ R11, R13 + JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_bmi2_adjust_two: + MOVQ R12, R13 + JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_bmi2_adjust_three: + LEAQ -1(R10), R13 + +sequenceDecs_decode_bmi2_adjust_test_temp_valid: + TESTQ R13, R13 + JNZ sequenceDecs_decode_bmi2_adjust_temp_valid + MOVQ $0x00000001, R13 + +sequenceDecs_decode_bmi2_adjust_temp_valid: + CMPQ CX, $0x01 + CMOVQNE R11, R12 + MOVQ R10, R11 + MOVQ R13, R10 + MOVQ R13, CX + +sequenceDecs_decode_bmi2_after_adjust: + MOVQ CX, 16(R9) + + // Check values + MOVQ 8(R9), R13 + MOVQ (R9), R14 + LEAQ (R13)(R14*1), R15 + MOVQ s+0(FP), BP + ADDQ R15, 256(BP) + MOVQ ctx+16(FP), R15 + SUBQ R14, 128(R15) + JS error_not_enough_literals + CMPQ R13, $0x00020002 + JA sequenceDecs_decode_bmi2_error_match_len_too_big + TESTQ CX, CX + JNZ sequenceDecs_decode_bmi2_match_len_ofs_ok + TESTQ R13, R13 + JNZ sequenceDecs_decode_bmi2_error_match_len_ofs_mismatch + +sequenceDecs_decode_bmi2_match_len_ofs_ok: + ADDQ $0x18, R9 + MOVQ ctx+16(FP), CX + DECQ 96(CX) + JNS sequenceDecs_decode_bmi2_main_loop + MOVQ s+0(FP), CX + MOVQ R10, 144(CX) + MOVQ R11, 152(CX) + MOVQ R12, 160(CX) + MOVQ br+8(FP), CX + MOVQ AX, 32(CX) + MOVB DL, 40(CX) + MOVQ BX, 24(CX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decode_bmi2_error_match_len_ofs_mismatch: + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decode_bmi2_error_match_len_too_big: + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +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 + MOVQ br+8(FP), CX + MOVQ 32(CX), AX + MOVBQZX 40(CX), DX + MOVQ 24(CX), BX + MOVQ (CX), CX + ADDQ BX, CX + MOVQ CX, (SP) + MOVQ ctx+16(FP), CX + MOVQ 72(CX), SI + MOVQ 80(CX), DI + MOVQ 88(CX), R8 + MOVQ 104(CX), R9 + MOVQ s+0(FP), CX + MOVQ 144(CX), R10 + MOVQ 152(CX), R11 + MOVQ 160(CX), R12 + +sequenceDecs_decode_56_bmi2_main_loop: + MOVQ (SP), R13 + + // Fill bitreader to have enough for the offset and match length. + CMPQ BX, $0x08 + JL sequenceDecs_decode_56_bmi2_fill_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R13 + MOVQ (R13), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decode_56_bmi2_fill_end + +sequenceDecs_decode_56_bmi2_fill_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decode_56_bmi2_fill_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decode_56_bmi2_fill_end + SHLQ $0x08, AX + SUBQ $0x01, R13 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R13), CX + 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 + BEXTRQ CX, R8, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ R8, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, 16(R9) + + // Update match length + MOVQ $0x00000808, CX + BEXTRQ CX, DI, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ DI, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, 8(R9) + + // Update literal length + MOVQ $0x00000808, CX + BEXTRQ CX, SI, R14 + MOVQ AX, R15 + LEAQ (DX)(R14*1), CX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + MOVQ CX, DX + MOVQ SI, CX + SHRQ $0x20, CX + ADDQ R15, CX + MOVQ CX, (R9) + + // Fill bitreader for state updates + MOVQ R13, (SP) + MOVQ $0x00000808, CX + BEXTRQ CX, R8, R13 + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decode_56_bmi2_skip_update + LEAQ (SI)(DI*1), R14 + ADDQ R8, R14 + MOVBQZX R14, R14 + LEAQ (DX)(R14*1), CX + MOVQ AX, R15 + MOVQ CX, DX + ROLQ CL, R15 + BZHIQ R14, R15, R15 + + // Update Offset State + BZHIQ R8, R15, CX + SHRXQ R8, R15, R15 + MOVQ $0x00001010, R14 + BEXTRQ R14, R8, R8 + ADDQ CX, R8 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Match Length State + BZHIQ DI, R15, CX + SHRXQ DI, R15, R15 + MOVQ $0x00001010, R14 + BEXTRQ R14, DI, DI + ADDQ CX, DI + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(DI*8), DI + + // Update Literal Length State + BZHIQ SI, R15, CX + MOVQ $0x00001010, R14 + BEXTRQ R14, SI, SI + ADDQ CX, SI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(SI*8), SI + +sequenceDecs_decode_56_bmi2_skip_update: + // Adjust offset + MOVQ 16(R9), CX + CMPQ R13, $0x01 + JBE sequenceDecs_decode_56_bmi2_adjust_offsetB_1_or_0 + MOVQ R11, R12 + MOVQ R10, R11 + MOVQ CX, R10 + JMP sequenceDecs_decode_56_bmi2_after_adjust + +sequenceDecs_decode_56_bmi2_adjust_offsetB_1_or_0: + CMPQ (R9), $0x00000000 + JNE sequenceDecs_decode_56_bmi2_adjust_offset_maybezero + INCQ CX + JMP sequenceDecs_decode_56_bmi2_adjust_offset_nonzero + +sequenceDecs_decode_56_bmi2_adjust_offset_maybezero: + TESTQ CX, CX + JNZ sequenceDecs_decode_56_bmi2_adjust_offset_nonzero + MOVQ R10, CX + JMP sequenceDecs_decode_56_bmi2_after_adjust + +sequenceDecs_decode_56_bmi2_adjust_offset_nonzero: + CMPQ CX, $0x01 + JB sequenceDecs_decode_56_bmi2_adjust_zero + JEQ sequenceDecs_decode_56_bmi2_adjust_one + CMPQ CX, $0x02 + JA sequenceDecs_decode_56_bmi2_adjust_three + JMP sequenceDecs_decode_56_bmi2_adjust_two + +sequenceDecs_decode_56_bmi2_adjust_zero: + MOVQ R10, R13 + JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_56_bmi2_adjust_one: + MOVQ R11, R13 + JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_56_bmi2_adjust_two: + MOVQ R12, R13 + JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid + +sequenceDecs_decode_56_bmi2_adjust_three: + LEAQ -1(R10), R13 + +sequenceDecs_decode_56_bmi2_adjust_test_temp_valid: + TESTQ R13, R13 + JNZ sequenceDecs_decode_56_bmi2_adjust_temp_valid + MOVQ $0x00000001, R13 + +sequenceDecs_decode_56_bmi2_adjust_temp_valid: + CMPQ CX, $0x01 + CMOVQNE R11, R12 + MOVQ R10, R11 + MOVQ R13, R10 + MOVQ R13, CX + +sequenceDecs_decode_56_bmi2_after_adjust: + MOVQ CX, 16(R9) + + // Check values + MOVQ 8(R9), R13 + MOVQ (R9), R14 + LEAQ (R13)(R14*1), R15 + MOVQ s+0(FP), BP + ADDQ R15, 256(BP) + MOVQ ctx+16(FP), R15 + SUBQ R14, 128(R15) + JS error_not_enough_literals + CMPQ R13, $0x00020002 + JA sequenceDecs_decode_56_bmi2_error_match_len_too_big + TESTQ CX, CX + JNZ sequenceDecs_decode_56_bmi2_match_len_ofs_ok + TESTQ R13, R13 + JNZ sequenceDecs_decode_56_bmi2_error_match_len_ofs_mismatch + +sequenceDecs_decode_56_bmi2_match_len_ofs_ok: + ADDQ $0x18, R9 + MOVQ ctx+16(FP), CX + DECQ 96(CX) + JNS sequenceDecs_decode_56_bmi2_main_loop + MOVQ s+0(FP), CX + MOVQ R10, 144(CX) + MOVQ R11, 152(CX) + MOVQ R12, 160(CX) + MOVQ br+8(FP), CX + MOVQ AX, 32(CX) + MOVB DL, 40(CX) + MOVQ BX, 24(CX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decode_56_bmi2_error_match_len_ofs_mismatch: + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decode_56_bmi2_error_match_len_too_big: + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +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 + MOVQ ctx+0(FP), R10 + MOVQ 8(R10), CX + TESTQ CX, CX + JZ empty_seqs + MOVQ (R10), AX + MOVQ 24(R10), DX + MOVQ 32(R10), BX + MOVQ 80(R10), SI + MOVQ 104(R10), DI + MOVQ 120(R10), R8 + MOVQ 56(R10), R9 + MOVQ 64(R10), R10 + ADDQ R10, R9 + + // seqsBase += 24 * seqIndex + LEAQ (DX)(DX*2), R11 + SHLQ $0x03, R11 + ADDQ R11, AX + + // outBase += outPosition + ADDQ DI, BX + +main_loop: + MOVQ (AX), R11 + MOVQ 16(AX), R12 + MOVQ 8(AX), R13 + + // Copy literals + TESTQ R11, R11 + JZ check_offset + XORQ R14, R14 + +copy_1: + MOVUPS (SI)(R14*1), X0 + MOVUPS X0, (BX)(R14*1) + ADDQ $0x10, R14 + CMPQ R14, R11 + JB copy_1 + ADDQ R11, SI + ADDQ R11, BX + ADDQ R11, DI + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + LEAQ (DI)(R10*1), R11 + CMPQ R12, R11 + JG error_match_off_too_big + CMPQ R12, R8 + JG error_match_off_too_big + + // Copy match from history + MOVQ R12, R11 + SUBQ DI, R11 + JLS copy_match + MOVQ R9, R14 + SUBQ R11, R14 + CMPQ R13, R11 + JG copy_all_from_history + MOVQ R13, R11 + SUBQ $0x10, R11 + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (BX) + ADDQ $0x10, R14 + ADDQ $0x10, BX + SUBQ $0x10, R11 + JAE copy_4_loop + LEAQ 16(R14)(R11*1), R14 + LEAQ 16(BX)(R11*1), BX + MOVUPS -16(R14), X0 + MOVUPS X0, -16(BX) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), R11 + MOVB 2(R14), R12 + MOVW R11, (BX) + MOVB R12, 2(BX) + ADDQ R13, R14 + ADDQ R13, BX + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), R11 + MOVL -4(R14)(R13*1), R12 + MOVL R11, (BX) + MOVL R12, -4(BX)(R13*1) + ADDQ R13, R14 + ADDQ R13, BX + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), R11 + MOVQ -8(R14)(R13*1), R12 + MOVQ R11, (BX) + MOVQ R12, -8(BX)(R13*1) + ADDQ R13, R14 + ADDQ R13, BX + +copy_4_end: + ADDQ R13, DI + ADDQ $0x18, AX + INCQ DX + CMPQ DX, CX + JB main_loop + JMP loop_finished + +copy_all_from_history: + MOVQ R11, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (BX) + ADDQ $0x10, R14 + ADDQ $0x10, BX + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(BX)(R15*1), BX + MOVUPS -16(R14), X0 + MOVUPS X0, -16(BX) + JMP copy_5_end + +copy_5_small: + CMPQ R11, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ R11, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(R11*1), BP + MOVB R15, (BX) + MOVB BP, -1(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (BX) + MOVB BP, 2(BX) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(R11*1), BP + MOVL R15, (BX) + MOVL BP, -4(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(R11*1), BP + MOVQ R15, (BX) + MOVQ BP, -8(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + +copy_5_end: + ADDQ R11, DI + SUBQ R11, R13 + + // Copy match from the current buffer +copy_match: + MOVQ BX, R11 + SUBQ R12, R11 + + // ml <= mo + CMPQ R13, R12 + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, DI + MOVQ BX, R12 + ADDQ R13, BX + +copy_2: + MOVUPS (R11), X0 + MOVUPS X0, (R12) + ADDQ $0x10, R11 + ADDQ $0x10, R12 + SUBQ $0x10, R13 + JHI copy_2 + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, DI + +copy_slow_3: + MOVB (R11), R12 + MOVB R12, (BX) + INCQ R11 + INCQ BX + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + ADDQ $0x18, AX + INCQ DX + CMPQ DX, CX + JB main_loop + +loop_finished: + // Return value + MOVB $0x01, ret+8(FP) + + // Update the context + MOVQ ctx+0(FP), AX + MOVQ DX, 24(AX) + MOVQ DI, 104(AX) + SUBQ 80(AX), SI + MOVQ SI, 112(AX) + RET + +error_match_off_too_big: + // Return value + MOVB $0x00, ret+8(FP) + + // Update the context + MOVQ ctx+0(FP), AX + MOVQ DX, 24(AX) + MOVQ DI, 104(AX) + SUBQ 80(AX), SI + MOVQ SI, 112(AX) + RET + +empty_seqs: + // Return value + MOVB $0x01, ret+8(FP) + RET + +// func sequenceDecs_executeSimple_safe_amd64(ctx *executeAsmContext) bool +// Requires: SSE +TEXT ·sequenceDecs_executeSimple_safe_amd64(SB), $8-9 + MOVQ ctx+0(FP), R10 + MOVQ 8(R10), CX + TESTQ CX, CX + JZ empty_seqs + MOVQ (R10), AX + MOVQ 24(R10), DX + MOVQ 32(R10), BX + MOVQ 80(R10), SI + MOVQ 104(R10), DI + MOVQ 120(R10), R8 + MOVQ 56(R10), R9 + MOVQ 64(R10), R10 + ADDQ R10, R9 + + // seqsBase += 24 * seqIndex + LEAQ (DX)(DX*2), R11 + SHLQ $0x03, R11 + ADDQ R11, AX + + // outBase += outPosition + ADDQ DI, BX + +main_loop: + MOVQ (AX), R11 + MOVQ 16(AX), R12 + MOVQ 8(AX), R13 + + // Copy literals + TESTQ R11, R11 + JZ check_offset + MOVQ R11, R14 + SUBQ $0x10, R14 + JB copy_1_small + +copy_1_loop: + MOVUPS (SI), X0 + MOVUPS X0, (BX) + ADDQ $0x10, SI + ADDQ $0x10, BX + SUBQ $0x10, R14 + JAE copy_1_loop + LEAQ 16(SI)(R14*1), SI + LEAQ 16(BX)(R14*1), BX + MOVUPS -16(SI), X0 + MOVUPS X0, -16(BX) + JMP copy_1_end + +copy_1_small: + CMPQ R11, $0x03 + JE copy_1_move_3 + JB copy_1_move_1or2 + CMPQ R11, $0x08 + JB copy_1_move_4through7 + JMP copy_1_move_8through16 + +copy_1_move_1or2: + MOVB (SI), R14 + MOVB -1(SI)(R11*1), R15 + MOVB R14, (BX) + MOVB R15, -1(BX)(R11*1) + ADDQ R11, SI + ADDQ R11, BX + JMP copy_1_end + +copy_1_move_3: + MOVW (SI), R14 + MOVB 2(SI), R15 + MOVW R14, (BX) + MOVB R15, 2(BX) + ADDQ R11, SI + ADDQ R11, BX + JMP copy_1_end + +copy_1_move_4through7: + MOVL (SI), R14 + MOVL -4(SI)(R11*1), R15 + MOVL R14, (BX) + MOVL R15, -4(BX)(R11*1) + ADDQ R11, SI + ADDQ R11, BX + JMP copy_1_end + +copy_1_move_8through16: + MOVQ (SI), R14 + MOVQ -8(SI)(R11*1), R15 + MOVQ R14, (BX) + MOVQ R15, -8(BX)(R11*1) + ADDQ R11, SI + ADDQ R11, BX + +copy_1_end: + ADDQ R11, DI + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + LEAQ (DI)(R10*1), R11 + CMPQ R12, R11 + JG error_match_off_too_big + CMPQ R12, R8 + JG error_match_off_too_big + + // Copy match from history + MOVQ R12, R11 + SUBQ DI, R11 + JLS copy_match + MOVQ R9, R14 + SUBQ R11, R14 + CMPQ R13, R11 + JG copy_all_from_history + MOVQ R13, R11 + SUBQ $0x10, R11 + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (BX) + ADDQ $0x10, R14 + ADDQ $0x10, BX + SUBQ $0x10, R11 + JAE copy_4_loop + LEAQ 16(R14)(R11*1), R14 + LEAQ 16(BX)(R11*1), BX + MOVUPS -16(R14), X0 + MOVUPS X0, -16(BX) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), R11 + MOVB 2(R14), R12 + MOVW R11, (BX) + MOVB R12, 2(BX) + ADDQ R13, R14 + ADDQ R13, BX + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), R11 + MOVL -4(R14)(R13*1), R12 + MOVL R11, (BX) + MOVL R12, -4(BX)(R13*1) + ADDQ R13, R14 + ADDQ R13, BX + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), R11 + MOVQ -8(R14)(R13*1), R12 + MOVQ R11, (BX) + MOVQ R12, -8(BX)(R13*1) + ADDQ R13, R14 + ADDQ R13, BX + +copy_4_end: + ADDQ R13, DI + ADDQ $0x18, AX + INCQ DX + CMPQ DX, CX + JB main_loop + JMP loop_finished + +copy_all_from_history: + MOVQ R11, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (BX) + ADDQ $0x10, R14 + ADDQ $0x10, BX + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(BX)(R15*1), BX + MOVUPS -16(R14), X0 + MOVUPS X0, -16(BX) + JMP copy_5_end + +copy_5_small: + CMPQ R11, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ R11, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(R11*1), BP + MOVB R15, (BX) + MOVB BP, -1(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (BX) + MOVB BP, 2(BX) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(R11*1), BP + MOVL R15, (BX) + MOVL BP, -4(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(R11*1), BP + MOVQ R15, (BX) + MOVQ BP, -8(BX)(R11*1) + ADDQ R11, R14 + ADDQ R11, BX + +copy_5_end: + ADDQ R11, DI + SUBQ R11, R13 + + // Copy match from the current buffer +copy_match: + MOVQ BX, R11 + SUBQ R12, R11 + + // ml <= mo + CMPQ R13, R12 + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, DI + MOVQ R13, R12 + SUBQ $0x10, R12 + JB copy_2_small + +copy_2_loop: + MOVUPS (R11), X0 + MOVUPS X0, (BX) + ADDQ $0x10, R11 + ADDQ $0x10, BX + SUBQ $0x10, R12 + JAE copy_2_loop + LEAQ 16(R11)(R12*1), R11 + LEAQ 16(BX)(R12*1), BX + MOVUPS -16(R11), X0 + MOVUPS X0, -16(BX) + JMP copy_2_end + +copy_2_small: + CMPQ R13, $0x03 + JE copy_2_move_3 + JB copy_2_move_1or2 + CMPQ R13, $0x08 + JB copy_2_move_4through7 + JMP copy_2_move_8through16 + +copy_2_move_1or2: + MOVB (R11), R12 + MOVB -1(R11)(R13*1), R14 + MOVB R12, (BX) + MOVB R14, -1(BX)(R13*1) + ADDQ R13, R11 + ADDQ R13, BX + JMP copy_2_end + +copy_2_move_3: + MOVW (R11), R12 + MOVB 2(R11), R14 + MOVW R12, (BX) + MOVB R14, 2(BX) + ADDQ R13, R11 + ADDQ R13, BX + JMP copy_2_end + +copy_2_move_4through7: + MOVL (R11), R12 + MOVL -4(R11)(R13*1), R14 + MOVL R12, (BX) + MOVL R14, -4(BX)(R13*1) + ADDQ R13, R11 + ADDQ R13, BX + JMP copy_2_end + +copy_2_move_8through16: + MOVQ (R11), R12 + MOVQ -8(R11)(R13*1), R14 + MOVQ R12, (BX) + MOVQ R14, -8(BX)(R13*1) + ADDQ R13, R11 + ADDQ R13, BX + +copy_2_end: + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, DI + +copy_slow_3: + MOVB (R11), R12 + MOVB R12, (BX) + INCQ R11 + INCQ BX + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + ADDQ $0x18, AX + INCQ DX + CMPQ DX, CX + JB main_loop + +loop_finished: + // Return value + MOVB $0x01, ret+8(FP) + + // Update the context + MOVQ ctx+0(FP), AX + MOVQ DX, 24(AX) + MOVQ DI, 104(AX) + SUBQ 80(AX), SI + MOVQ SI, 112(AX) + RET + +error_match_off_too_big: + // Return value + MOVB $0x00, ret+8(FP) + + // Update the context + MOVQ ctx+0(FP), AX + MOVQ DX, 24(AX) + MOVQ DI, 104(AX) + SUBQ 80(AX), SI + MOVQ SI, 112(AX) + RET + +empty_seqs: + // Return value + MOVB $0x01, ret+8(FP) + RET + +// func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int +// Requires: CMOV, SSE +TEXT ·sequenceDecs_decodeSync_amd64(SB), $64-32 + MOVQ br+8(FP), AX + MOVQ 32(AX), DX + MOVBQZX 40(AX), BX + MOVQ 24(AX), SI + MOVQ (AX), AX + ADDQ SI, AX + MOVQ AX, (SP) + MOVQ ctx+16(FP), AX + MOVQ 72(AX), DI + MOVQ 80(AX), R8 + MOVQ 88(AX), R9 + XORQ CX, CX + MOVQ CX, 8(SP) + MOVQ CX, 16(SP) + MOVQ CX, 24(SP) + MOVQ 112(AX), R10 + MOVQ 128(AX), CX + MOVQ CX, 32(SP) + MOVQ 144(AX), R11 + MOVQ 136(AX), R12 + MOVQ 200(AX), CX + MOVQ CX, 56(SP) + MOVQ 176(AX), CX + MOVQ CX, 48(SP) + MOVQ 184(AX), AX + MOVQ AX, 40(SP) + MOVQ 40(SP), AX + ADDQ AX, 48(SP) + + // Calculate poiter to s.out[cap(s.out)] (a past-end pointer) + ADDQ R10, 32(SP) + + // outBase += outPosition + ADDQ R12, R10 + +sequenceDecs_decodeSync_amd64_main_loop: + MOVQ (SP), R13 + + // Fill bitreader to have enough for the offset and match length. + CMPQ SI, $0x08 + JL sequenceDecs_decodeSync_amd64_fill_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R13 + MOVQ (R13), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decodeSync_amd64_fill_end + +sequenceDecs_decodeSync_amd64_fill_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decodeSync_amd64_fill_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decodeSync_amd64_fill_end + SHLQ $0x08, DX + SUBQ $0x01, R13 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R13), AX + 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 + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_amd64_of_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_amd64_of_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_amd64_of_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_amd64_of_update_zero: + MOVQ AX, 8(SP) + + // Update match length + MOVQ R8, AX + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_amd64_ml_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_amd64_ml_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_amd64_ml_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_amd64_ml_update_zero: + MOVQ AX, 16(SP) + + // Fill bitreader to have enough for the remaining + CMPQ SI, $0x08 + JL sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R13 + MOVQ (R13), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decodeSync_amd64_fill_2_end + +sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decodeSync_amd64_fill_2_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decodeSync_amd64_fill_2_end + SHLQ $0x08, DX + SUBQ $0x01, R13 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R13), AX + 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 + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_amd64_ll_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_amd64_ll_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_amd64_ll_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_amd64_ll_update_zero: + MOVQ AX, 24(SP) + + // Fill bitreader for state updates + MOVQ R13, (SP) + MOVQ R9, AX + SHRQ $0x08, AX + MOVBQZX AL, AX + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decodeSync_amd64_skip_update + + // Update Literal Length State + MOVBQZX DI, R13 + SHRQ $0x10, DI + MOVWQZX DI, DI + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, DI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(DI*8), DI + + // Update Match Length State + MOVBQZX R8, R13 + SHRQ $0x10, R8 + MOVWQZX R8, R8 + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, R8 + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Offset State + MOVBQZX R9, R13 + SHRQ $0x10, R9 + MOVWQZX R9, R9 + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, R9 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R9*8), R9 + +sequenceDecs_decodeSync_amd64_skip_update: + // Adjust offset + MOVQ s+0(FP), CX + MOVQ 8(SP), R13 + CMPQ AX, $0x01 + JBE sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0 + MOVUPS 144(CX), X0 + MOVQ R13, 144(CX) + MOVUPS X0, 152(CX) + JMP sequenceDecs_decodeSync_amd64_after_adjust + +sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0: + CMPQ 24(SP), $0x00000000 + JNE sequenceDecs_decodeSync_amd64_adjust_offset_maybezero + INCQ R13 + JMP sequenceDecs_decodeSync_amd64_adjust_offset_nonzero + +sequenceDecs_decodeSync_amd64_adjust_offset_maybezero: + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_amd64_adjust_offset_nonzero + MOVQ 144(CX), R13 + JMP sequenceDecs_decodeSync_amd64_after_adjust + +sequenceDecs_decodeSync_amd64_adjust_offset_nonzero: + MOVQ R13, AX + XORQ R14, R14 + MOVQ $-1, R15 + CMPQ R13, $0x03 + CMOVQEQ R14, AX + CMOVQEQ R15, R14 + ADDQ 144(CX)(AX*8), R14 + JNZ sequenceDecs_decodeSync_amd64_adjust_temp_valid + MOVQ $0x00000001, R14 + +sequenceDecs_decodeSync_amd64_adjust_temp_valid: + CMPQ R13, $0x01 + JZ sequenceDecs_decodeSync_amd64_adjust_skip + MOVQ 152(CX), AX + MOVQ AX, 160(CX) + +sequenceDecs_decodeSync_amd64_adjust_skip: + MOVQ 144(CX), AX + MOVQ AX, 152(CX) + MOVQ R14, 144(CX) + MOVQ R14, R13 + +sequenceDecs_decodeSync_amd64_after_adjust: + MOVQ R13, 8(SP) + + // Check values + MOVQ 16(SP), AX + MOVQ 24(SP), CX + LEAQ (AX)(CX*1), R14 + MOVQ s+0(FP), R15 + ADDQ R14, 256(R15) + MOVQ ctx+16(FP), R14 + SUBQ CX, 104(R14) + JS error_not_enough_literals + CMPQ AX, $0x00020002 + JA sequenceDecs_decodeSync_amd64_error_match_len_too_big + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_amd64_match_len_ofs_ok + TESTQ AX, AX + JNZ sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch + +sequenceDecs_decodeSync_amd64_match_len_ofs_ok: + MOVQ 24(SP), AX + MOVQ 8(SP), CX + MOVQ 16(SP), R13 + + // Check if we have enough space in s.out + LEAQ (AX)(R13*1), R14 + ADDQ R10, R14 + CMPQ R14, 32(SP) + JA error_not_enough_space + + // Copy literals + TESTQ AX, AX + JZ check_offset + XORQ R14, R14 + +copy_1: + MOVUPS (R11)(R14*1), X0 + MOVUPS X0, (R10)(R14*1) + ADDQ $0x10, R14 + CMPQ R14, AX + JB copy_1 + ADDQ AX, R11 + ADDQ AX, R10 + ADDQ AX, R12 + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + MOVQ R12, AX + ADDQ 40(SP), AX + CMPQ CX, AX + JG error_match_off_too_big + CMPQ CX, 56(SP) + JG error_match_off_too_big + + // Copy match from history + MOVQ CX, AX + SUBQ R12, AX + JLS copy_match + MOVQ 48(SP), R14 + SUBQ AX, R14 + CMPQ R13, AX + JG copy_all_from_history + MOVQ R13, AX + SUBQ $0x10, AX + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R10) + ADDQ $0x10, R14 + ADDQ $0x10, R10 + SUBQ $0x10, AX + JAE copy_4_loop + LEAQ 16(R14)(AX*1), R14 + LEAQ 16(R10)(AX*1), R10 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R10) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), AX + MOVB 2(R14), CL + MOVW AX, (R10) + MOVB CL, 2(R10) + ADDQ R13, R14 + ADDQ R13, R10 + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), AX + MOVL -4(R14)(R13*1), CX + MOVL AX, (R10) + MOVL CX, -4(R10)(R13*1) + ADDQ R13, R14 + ADDQ R13, R10 + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), AX + MOVQ -8(R14)(R13*1), CX + MOVQ AX, (R10) + MOVQ CX, -8(R10)(R13*1) + ADDQ R13, R14 + ADDQ R13, R10 + +copy_4_end: + ADDQ R13, R12 + JMP handle_loop + JMP loop_finished + +copy_all_from_history: + MOVQ AX, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R10) + ADDQ $0x10, R14 + ADDQ $0x10, R10 + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(R10)(R15*1), R10 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R10) + JMP copy_5_end + +copy_5_small: + CMPQ AX, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ AX, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(AX*1), BP + MOVB R15, (R10) + MOVB BP, -1(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (R10) + MOVB BP, 2(R10) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(AX*1), BP + MOVL R15, (R10) + MOVL BP, -4(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(AX*1), BP + MOVQ R15, (R10) + MOVQ BP, -8(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + +copy_5_end: + ADDQ AX, R12 + SUBQ AX, R13 + + // Copy match from the current buffer +copy_match: + MOVQ R10, AX + SUBQ CX, AX + + // ml <= mo + CMPQ R13, CX + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, R12 + MOVQ R10, CX + ADDQ R13, R10 + +copy_2: + MOVUPS (AX), X0 + MOVUPS X0, (CX) + ADDQ $0x10, AX + ADDQ $0x10, CX + SUBQ $0x10, R13 + JHI copy_2 + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, R12 + +copy_slow_3: + MOVB (AX), CL + MOVB CL, (R10) + INCQ AX + INCQ R10 + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + MOVQ ctx+16(FP), AX + DECQ 96(AX) + JNS sequenceDecs_decodeSync_amd64_main_loop + +loop_finished: + MOVQ br+8(FP), AX + MOVQ DX, 32(AX) + MOVB BL, 40(AX) + MOVQ SI, 24(AX) + + // Update the context + MOVQ ctx+16(FP), AX + MOVQ R12, 136(AX) + MOVQ 144(AX), CX + SUBQ CX, R11 + MOVQ R11, 168(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch: + MOVQ 16(SP), AX + MOVQ ctx+16(FP), CX + MOVQ AX, 216(CX) + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decodeSync_amd64_error_match_len_too_big: + MOVQ ctx+16(FP), AX + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error +error_match_off_too_big: + MOVQ ctx+16(FP), AX + MOVQ 8(SP), CX + MOVQ CX, 224(AX) + MOVQ R12, 136(AX) + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +error_not_enough_literals: + MOVQ ctx+16(FP), AX + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + 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 + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ R12, 136(AX) + MOVQ $0x00000005, ret+24(FP) + RET + +// func sequenceDecs_decodeSync_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int +// Requires: BMI, BMI2, CMOV, SSE +TEXT ·sequenceDecs_decodeSync_bmi2(SB), $64-32 + MOVQ br+8(FP), CX + MOVQ 32(CX), AX + MOVBQZX 40(CX), DX + MOVQ 24(CX), BX + MOVQ (CX), CX + ADDQ BX, CX + MOVQ CX, (SP) + MOVQ ctx+16(FP), CX + MOVQ 72(CX), SI + MOVQ 80(CX), DI + MOVQ 88(CX), R8 + XORQ R9, R9 + MOVQ R9, 8(SP) + MOVQ R9, 16(SP) + MOVQ R9, 24(SP) + MOVQ 112(CX), R9 + MOVQ 128(CX), R10 + MOVQ R10, 32(SP) + MOVQ 144(CX), R10 + MOVQ 136(CX), R11 + MOVQ 200(CX), R12 + MOVQ R12, 56(SP) + MOVQ 176(CX), R12 + MOVQ R12, 48(SP) + MOVQ 184(CX), CX + MOVQ CX, 40(SP) + MOVQ 40(SP), CX + ADDQ CX, 48(SP) + + // Calculate poiter to s.out[cap(s.out)] (a past-end pointer) + ADDQ R9, 32(SP) + + // outBase += outPosition + ADDQ R11, R9 + +sequenceDecs_decodeSync_bmi2_main_loop: + MOVQ (SP), R12 + + // Fill bitreader to have enough for the offset and match length. + CMPQ BX, $0x08 + JL sequenceDecs_decodeSync_bmi2_fill_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R12 + MOVQ (R12), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decodeSync_bmi2_fill_end + +sequenceDecs_decodeSync_bmi2_fill_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decodeSync_bmi2_fill_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decodeSync_bmi2_fill_end + SHLQ $0x08, AX + SUBQ $0x01, R12 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R12), CX + 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 + BEXTRQ CX, R8, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ R8, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 8(SP) + + // Update match length + MOVQ $0x00000808, CX + BEXTRQ CX, DI, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ DI, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 16(SP) + + // Fill bitreader to have enough for the remaining + CMPQ BX, $0x08 + JL sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R12 + MOVQ (R12), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decodeSync_bmi2_fill_2_end + +sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decodeSync_bmi2_fill_2_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decodeSync_bmi2_fill_2_end + SHLQ $0x08, AX + SUBQ $0x01, R12 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R12), CX + 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 + BEXTRQ CX, SI, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ SI, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 24(SP) + + // Fill bitreader for state updates + MOVQ R12, (SP) + MOVQ $0x00000808, CX + BEXTRQ CX, R8, R12 + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decodeSync_bmi2_skip_update + LEAQ (SI)(DI*1), R13 + ADDQ R8, R13 + MOVBQZX R13, R13 + LEAQ (DX)(R13*1), CX + MOVQ AX, R14 + MOVQ CX, DX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + + // Update Offset State + BZHIQ R8, R14, CX + SHRXQ R8, R14, R14 + MOVQ $0x00001010, R13 + BEXTRQ R13, R8, R8 + ADDQ CX, R8 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Match Length State + BZHIQ DI, R14, CX + SHRXQ DI, R14, R14 + MOVQ $0x00001010, R13 + BEXTRQ R13, DI, DI + ADDQ CX, DI + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(DI*8), DI + + // Update Literal Length State + BZHIQ SI, R14, CX + MOVQ $0x00001010, R13 + BEXTRQ R13, SI, SI + ADDQ CX, SI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(SI*8), SI + +sequenceDecs_decodeSync_bmi2_skip_update: + // Adjust offset + MOVQ s+0(FP), CX + MOVQ 8(SP), R13 + CMPQ R12, $0x01 + JBE sequenceDecs_decodeSync_bmi2_adjust_offsetB_1_or_0 + MOVUPS 144(CX), X0 + MOVQ R13, 144(CX) + MOVUPS X0, 152(CX) + JMP sequenceDecs_decodeSync_bmi2_after_adjust + +sequenceDecs_decodeSync_bmi2_adjust_offsetB_1_or_0: + CMPQ 24(SP), $0x00000000 + JNE sequenceDecs_decodeSync_bmi2_adjust_offset_maybezero + INCQ R13 + JMP sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero + +sequenceDecs_decodeSync_bmi2_adjust_offset_maybezero: + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero + MOVQ 144(CX), R13 + JMP sequenceDecs_decodeSync_bmi2_after_adjust + +sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero: + MOVQ R13, R12 + XORQ R14, R14 + MOVQ $-1, R15 + CMPQ R13, $0x03 + CMOVQEQ R14, R12 + CMOVQEQ R15, R14 + ADDQ 144(CX)(R12*8), R14 + JNZ sequenceDecs_decodeSync_bmi2_adjust_temp_valid + MOVQ $0x00000001, R14 + +sequenceDecs_decodeSync_bmi2_adjust_temp_valid: + CMPQ R13, $0x01 + JZ sequenceDecs_decodeSync_bmi2_adjust_skip + MOVQ 152(CX), R12 + MOVQ R12, 160(CX) + +sequenceDecs_decodeSync_bmi2_adjust_skip: + MOVQ 144(CX), R12 + MOVQ R12, 152(CX) + MOVQ R14, 144(CX) + MOVQ R14, R13 + +sequenceDecs_decodeSync_bmi2_after_adjust: + MOVQ R13, 8(SP) + + // Check values + MOVQ 16(SP), CX + MOVQ 24(SP), R12 + LEAQ (CX)(R12*1), R14 + MOVQ s+0(FP), R15 + ADDQ R14, 256(R15) + MOVQ ctx+16(FP), R14 + SUBQ R12, 104(R14) + JS error_not_enough_literals + CMPQ CX, $0x00020002 + JA sequenceDecs_decodeSync_bmi2_error_match_len_too_big + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_bmi2_match_len_ofs_ok + TESTQ CX, CX + JNZ sequenceDecs_decodeSync_bmi2_error_match_len_ofs_mismatch + +sequenceDecs_decodeSync_bmi2_match_len_ofs_ok: + MOVQ 24(SP), CX + MOVQ 8(SP), R12 + MOVQ 16(SP), R13 + + // Check if we have enough space in s.out + LEAQ (CX)(R13*1), R14 + ADDQ R9, R14 + CMPQ R14, 32(SP) + JA error_not_enough_space + + // Copy literals + TESTQ CX, CX + JZ check_offset + XORQ R14, R14 + +copy_1: + MOVUPS (R10)(R14*1), X0 + MOVUPS X0, (R9)(R14*1) + ADDQ $0x10, R14 + CMPQ R14, CX + JB copy_1 + ADDQ CX, R10 + ADDQ CX, R9 + ADDQ CX, R11 + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + MOVQ R11, CX + ADDQ 40(SP), CX + CMPQ R12, CX + JG error_match_off_too_big + CMPQ R12, 56(SP) + JG error_match_off_too_big + + // Copy match from history + MOVQ R12, CX + SUBQ R11, CX + JLS copy_match + MOVQ 48(SP), R14 + SUBQ CX, R14 + CMPQ R13, CX + JG copy_all_from_history + MOVQ R13, CX + SUBQ $0x10, CX + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R9) + ADDQ $0x10, R14 + ADDQ $0x10, R9 + SUBQ $0x10, CX + JAE copy_4_loop + LEAQ 16(R14)(CX*1), R14 + LEAQ 16(R9)(CX*1), R9 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R9) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), CX + MOVB 2(R14), R12 + MOVW CX, (R9) + MOVB R12, 2(R9) + ADDQ R13, R14 + ADDQ R13, R9 + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), CX + MOVL -4(R14)(R13*1), R12 + MOVL CX, (R9) + MOVL R12, -4(R9)(R13*1) + ADDQ R13, R14 + ADDQ R13, R9 + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), CX + MOVQ -8(R14)(R13*1), R12 + MOVQ CX, (R9) + MOVQ R12, -8(R9)(R13*1) + ADDQ R13, R14 + ADDQ R13, R9 + +copy_4_end: + ADDQ R13, R11 + JMP handle_loop + JMP loop_finished + +copy_all_from_history: + MOVQ CX, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R9) + ADDQ $0x10, R14 + ADDQ $0x10, R9 + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(R9)(R15*1), R9 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R9) + JMP copy_5_end + +copy_5_small: + CMPQ CX, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ CX, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(CX*1), BP + MOVB R15, (R9) + MOVB BP, -1(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (R9) + MOVB BP, 2(R9) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(CX*1), BP + MOVL R15, (R9) + MOVL BP, -4(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(CX*1), BP + MOVQ R15, (R9) + MOVQ BP, -8(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + +copy_5_end: + ADDQ CX, R11 + SUBQ CX, R13 + + // Copy match from the current buffer +copy_match: + MOVQ R9, CX + SUBQ R12, CX + + // ml <= mo + CMPQ R13, R12 + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, R11 + MOVQ R9, R12 + ADDQ R13, R9 + +copy_2: + MOVUPS (CX), X0 + MOVUPS X0, (R12) + ADDQ $0x10, CX + ADDQ $0x10, R12 + SUBQ $0x10, R13 + JHI copy_2 + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, R11 + +copy_slow_3: + MOVB (CX), R12 + MOVB R12, (R9) + INCQ CX + INCQ R9 + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + MOVQ ctx+16(FP), CX + DECQ 96(CX) + JNS sequenceDecs_decodeSync_bmi2_main_loop + +loop_finished: + MOVQ br+8(FP), CX + MOVQ AX, 32(CX) + MOVB DL, 40(CX) + MOVQ BX, 24(CX) + + // Update the context + MOVQ ctx+16(FP), AX + MOVQ R11, 136(AX) + MOVQ 144(AX), CX + SUBQ CX, R10 + MOVQ R10, 168(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decodeSync_bmi2_error_match_len_ofs_mismatch: + MOVQ 16(SP), AX + MOVQ ctx+16(FP), CX + MOVQ AX, 216(CX) + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decodeSync_bmi2_error_match_len_too_big: + MOVQ ctx+16(FP), AX + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error +error_match_off_too_big: + MOVQ ctx+16(FP), AX + MOVQ 8(SP), CX + MOVQ CX, 224(AX) + MOVQ R11, 136(AX) + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +error_not_enough_literals: + MOVQ ctx+16(FP), AX + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + 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 + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ R11, 136(AX) + MOVQ $0x00000005, ret+24(FP) + RET + +// func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int +// Requires: CMOV, SSE +TEXT ·sequenceDecs_decodeSync_safe_amd64(SB), $64-32 + MOVQ br+8(FP), AX + MOVQ 32(AX), DX + MOVBQZX 40(AX), BX + MOVQ 24(AX), SI + MOVQ (AX), AX + ADDQ SI, AX + MOVQ AX, (SP) + MOVQ ctx+16(FP), AX + MOVQ 72(AX), DI + MOVQ 80(AX), R8 + MOVQ 88(AX), R9 + XORQ CX, CX + MOVQ CX, 8(SP) + MOVQ CX, 16(SP) + MOVQ CX, 24(SP) + MOVQ 112(AX), R10 + MOVQ 128(AX), CX + MOVQ CX, 32(SP) + MOVQ 144(AX), R11 + MOVQ 136(AX), R12 + MOVQ 200(AX), CX + MOVQ CX, 56(SP) + MOVQ 176(AX), CX + MOVQ CX, 48(SP) + MOVQ 184(AX), AX + MOVQ AX, 40(SP) + MOVQ 40(SP), AX + ADDQ AX, 48(SP) + + // Calculate poiter to s.out[cap(s.out)] (a past-end pointer) + ADDQ R10, 32(SP) + + // outBase += outPosition + ADDQ R12, R10 + +sequenceDecs_decodeSync_safe_amd64_main_loop: + MOVQ (SP), R13 + + // Fill bitreader to have enough for the offset and match length. + CMPQ SI, $0x08 + JL sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R13 + MOVQ (R13), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decodeSync_safe_amd64_fill_end + +sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decodeSync_safe_amd64_fill_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decodeSync_safe_amd64_fill_end + SHLQ $0x08, DX + SUBQ $0x01, R13 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R13), AX + 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 + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_safe_amd64_of_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_safe_amd64_of_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_safe_amd64_of_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_safe_amd64_of_update_zero: + MOVQ AX, 8(SP) + + // Update match length + MOVQ R8, AX + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_safe_amd64_ml_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_safe_amd64_ml_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_safe_amd64_ml_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_safe_amd64_ml_update_zero: + MOVQ AX, 16(SP) + + // Fill bitreader to have enough for the remaining + CMPQ SI, $0x08 + JL sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte + MOVQ BX, AX + SHRQ $0x03, AX + SUBQ AX, R13 + MOVQ (R13), DX + SUBQ AX, SI + ANDQ $0x07, BX + JMP sequenceDecs_decodeSync_safe_amd64_fill_2_end + +sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte: + CMPQ SI, $0x00 + JLE sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread + CMPQ BX, $0x07 + JLE sequenceDecs_decodeSync_safe_amd64_fill_2_end + SHLQ $0x08, DX + SUBQ $0x01, R13 + SUBQ $0x01, SI + SUBQ $0x08, BX + MOVBQZX (R13), AX + 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 + MOVQ BX, CX + MOVQ DX, R14 + SHLQ CL, R14 + MOVB AH, CL + SHRQ $0x20, AX + TESTQ CX, CX + JZ sequenceDecs_decodeSync_safe_amd64_ll_update_zero + ADDQ CX, BX + CMPQ BX, $0x40 + JA sequenceDecs_decodeSync_safe_amd64_ll_update_zero + CMPQ CX, $0x40 + JAE sequenceDecs_decodeSync_safe_amd64_ll_update_zero + NEGQ CX + SHRQ CL, R14 + ADDQ R14, AX + +sequenceDecs_decodeSync_safe_amd64_ll_update_zero: + MOVQ AX, 24(SP) + + // Fill bitreader for state updates + MOVQ R13, (SP) + MOVQ R9, AX + SHRQ $0x08, AX + MOVBQZX AL, AX + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decodeSync_safe_amd64_skip_update + + // Update Literal Length State + MOVBQZX DI, R13 + SHRQ $0x10, DI + MOVWQZX DI, DI + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, DI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(DI*8), DI + + // Update Match Length State + MOVBQZX R8, R13 + SHRQ $0x10, R8 + MOVWQZX R8, R8 + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, R8 + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Offset State + MOVBQZX R9, R13 + SHRQ $0x10, R9 + MOVWQZX R9, R9 + LEAQ (BX)(R13*1), CX + MOVQ DX, R14 + MOVQ CX, BX + ROLQ CL, R14 + MOVL $0x00000001, R15 + MOVB R13, CL + SHLL CL, R15 + DECL R15 + ANDQ R15, R14 + ADDQ R14, R9 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R9*8), R9 + +sequenceDecs_decodeSync_safe_amd64_skip_update: + // Adjust offset + MOVQ s+0(FP), CX + MOVQ 8(SP), R13 + CMPQ AX, $0x01 + JBE sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0 + MOVUPS 144(CX), X0 + MOVQ R13, 144(CX) + MOVUPS X0, 152(CX) + JMP sequenceDecs_decodeSync_safe_amd64_after_adjust + +sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0: + CMPQ 24(SP), $0x00000000 + JNE sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero + INCQ R13 + JMP sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero + +sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero: + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero + MOVQ 144(CX), R13 + JMP sequenceDecs_decodeSync_safe_amd64_after_adjust + +sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero: + MOVQ R13, AX + XORQ R14, R14 + MOVQ $-1, R15 + CMPQ R13, $0x03 + CMOVQEQ R14, AX + CMOVQEQ R15, R14 + ADDQ 144(CX)(AX*8), R14 + JNZ sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid + MOVQ $0x00000001, R14 + +sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid: + CMPQ R13, $0x01 + JZ sequenceDecs_decodeSync_safe_amd64_adjust_skip + MOVQ 152(CX), AX + MOVQ AX, 160(CX) + +sequenceDecs_decodeSync_safe_amd64_adjust_skip: + MOVQ 144(CX), AX + MOVQ AX, 152(CX) + MOVQ R14, 144(CX) + MOVQ R14, R13 + +sequenceDecs_decodeSync_safe_amd64_after_adjust: + MOVQ R13, 8(SP) + + // Check values + MOVQ 16(SP), AX + MOVQ 24(SP), CX + LEAQ (AX)(CX*1), R14 + MOVQ s+0(FP), R15 + ADDQ R14, 256(R15) + MOVQ ctx+16(FP), R14 + SUBQ CX, 104(R14) + JS error_not_enough_literals + CMPQ AX, $0x00020002 + JA sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok + TESTQ AX, AX + JNZ sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch + +sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok: + MOVQ 24(SP), AX + MOVQ 8(SP), CX + MOVQ 16(SP), R13 + + // Check if we have enough space in s.out + LEAQ (AX)(R13*1), R14 + ADDQ R10, R14 + CMPQ R14, 32(SP) + JA error_not_enough_space + + // Copy literals + TESTQ AX, AX + JZ check_offset + MOVQ AX, R14 + SUBQ $0x10, R14 + JB copy_1_small + +copy_1_loop: + MOVUPS (R11), X0 + MOVUPS X0, (R10) + ADDQ $0x10, R11 + ADDQ $0x10, R10 + SUBQ $0x10, R14 + JAE copy_1_loop + LEAQ 16(R11)(R14*1), R11 + LEAQ 16(R10)(R14*1), R10 + MOVUPS -16(R11), X0 + MOVUPS X0, -16(R10) + JMP copy_1_end + +copy_1_small: + CMPQ AX, $0x03 + JE copy_1_move_3 + JB copy_1_move_1or2 + CMPQ AX, $0x08 + JB copy_1_move_4through7 + JMP copy_1_move_8through16 + +copy_1_move_1or2: + MOVB (R11), R14 + MOVB -1(R11)(AX*1), R15 + MOVB R14, (R10) + MOVB R15, -1(R10)(AX*1) + ADDQ AX, R11 + ADDQ AX, R10 + JMP copy_1_end + +copy_1_move_3: + MOVW (R11), R14 + MOVB 2(R11), R15 + MOVW R14, (R10) + MOVB R15, 2(R10) + ADDQ AX, R11 + ADDQ AX, R10 + JMP copy_1_end + +copy_1_move_4through7: + MOVL (R11), R14 + MOVL -4(R11)(AX*1), R15 + MOVL R14, (R10) + MOVL R15, -4(R10)(AX*1) + ADDQ AX, R11 + ADDQ AX, R10 + JMP copy_1_end + +copy_1_move_8through16: + MOVQ (R11), R14 + MOVQ -8(R11)(AX*1), R15 + MOVQ R14, (R10) + MOVQ R15, -8(R10)(AX*1) + ADDQ AX, R11 + ADDQ AX, R10 + +copy_1_end: + ADDQ AX, R12 + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + MOVQ R12, AX + ADDQ 40(SP), AX + CMPQ CX, AX + JG error_match_off_too_big + CMPQ CX, 56(SP) + JG error_match_off_too_big + + // Copy match from history + MOVQ CX, AX + SUBQ R12, AX + JLS copy_match + MOVQ 48(SP), R14 + SUBQ AX, R14 + CMPQ R13, AX + JG copy_all_from_history + MOVQ R13, AX + SUBQ $0x10, AX + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R10) + ADDQ $0x10, R14 + ADDQ $0x10, R10 + SUBQ $0x10, AX + JAE copy_4_loop + LEAQ 16(R14)(AX*1), R14 + LEAQ 16(R10)(AX*1), R10 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R10) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), AX + MOVB 2(R14), CL + MOVW AX, (R10) + MOVB CL, 2(R10) + ADDQ R13, R14 + ADDQ R13, R10 + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), AX + MOVL -4(R14)(R13*1), CX + MOVL AX, (R10) + MOVL CX, -4(R10)(R13*1) + ADDQ R13, R14 + ADDQ R13, R10 + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), AX + MOVQ -8(R14)(R13*1), CX + MOVQ AX, (R10) + MOVQ CX, -8(R10)(R13*1) + ADDQ R13, R14 + ADDQ R13, R10 + +copy_4_end: + ADDQ R13, R12 + JMP handle_loop + JMP loop_finished + +copy_all_from_history: + MOVQ AX, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R10) + ADDQ $0x10, R14 + ADDQ $0x10, R10 + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(R10)(R15*1), R10 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R10) + JMP copy_5_end + +copy_5_small: + CMPQ AX, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ AX, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(AX*1), BP + MOVB R15, (R10) + MOVB BP, -1(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (R10) + MOVB BP, 2(R10) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(AX*1), BP + MOVL R15, (R10) + MOVL BP, -4(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(AX*1), BP + MOVQ R15, (R10) + MOVQ BP, -8(R10)(AX*1) + ADDQ AX, R14 + ADDQ AX, R10 + +copy_5_end: + ADDQ AX, R12 + SUBQ AX, R13 + + // Copy match from the current buffer +copy_match: + MOVQ R10, AX + SUBQ CX, AX + + // ml <= mo + CMPQ R13, CX + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, R12 + MOVQ R13, CX + SUBQ $0x10, CX + JB copy_2_small + +copy_2_loop: + MOVUPS (AX), X0 + MOVUPS X0, (R10) + ADDQ $0x10, AX + ADDQ $0x10, R10 + SUBQ $0x10, CX + JAE copy_2_loop + LEAQ 16(AX)(CX*1), AX + LEAQ 16(R10)(CX*1), R10 + MOVUPS -16(AX), X0 + MOVUPS X0, -16(R10) + JMP copy_2_end + +copy_2_small: + CMPQ R13, $0x03 + JE copy_2_move_3 + JB copy_2_move_1or2 + CMPQ R13, $0x08 + JB copy_2_move_4through7 + JMP copy_2_move_8through16 + +copy_2_move_1or2: + MOVB (AX), CL + MOVB -1(AX)(R13*1), R14 + MOVB CL, (R10) + MOVB R14, -1(R10)(R13*1) + ADDQ R13, AX + ADDQ R13, R10 + JMP copy_2_end + +copy_2_move_3: + MOVW (AX), CX + MOVB 2(AX), R14 + MOVW CX, (R10) + MOVB R14, 2(R10) + ADDQ R13, AX + ADDQ R13, R10 + JMP copy_2_end + +copy_2_move_4through7: + MOVL (AX), CX + MOVL -4(AX)(R13*1), R14 + MOVL CX, (R10) + MOVL R14, -4(R10)(R13*1) + ADDQ R13, AX + ADDQ R13, R10 + JMP copy_2_end + +copy_2_move_8through16: + MOVQ (AX), CX + MOVQ -8(AX)(R13*1), R14 + MOVQ CX, (R10) + MOVQ R14, -8(R10)(R13*1) + ADDQ R13, AX + ADDQ R13, R10 + +copy_2_end: + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, R12 + +copy_slow_3: + MOVB (AX), CL + MOVB CL, (R10) + INCQ AX + INCQ R10 + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + MOVQ ctx+16(FP), AX + DECQ 96(AX) + JNS sequenceDecs_decodeSync_safe_amd64_main_loop + +loop_finished: + MOVQ br+8(FP), AX + MOVQ DX, 32(AX) + MOVB BL, 40(AX) + MOVQ SI, 24(AX) + + // Update the context + MOVQ ctx+16(FP), AX + MOVQ R12, 136(AX) + MOVQ 144(AX), CX + SUBQ CX, R11 + MOVQ R11, 168(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch: + MOVQ 16(SP), AX + MOVQ ctx+16(FP), CX + MOVQ AX, 216(CX) + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big: + MOVQ ctx+16(FP), AX + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error +error_match_off_too_big: + MOVQ ctx+16(FP), AX + MOVQ 8(SP), CX + MOVQ CX, 224(AX) + MOVQ R12, 136(AX) + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +error_not_enough_literals: + MOVQ ctx+16(FP), AX + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + 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 + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ R12, 136(AX) + MOVQ $0x00000005, ret+24(FP) + RET + +// func sequenceDecs_decodeSync_safe_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int +// Requires: BMI, BMI2, CMOV, SSE +TEXT ·sequenceDecs_decodeSync_safe_bmi2(SB), $64-32 + MOVQ br+8(FP), CX + MOVQ 32(CX), AX + MOVBQZX 40(CX), DX + MOVQ 24(CX), BX + MOVQ (CX), CX + ADDQ BX, CX + MOVQ CX, (SP) + MOVQ ctx+16(FP), CX + MOVQ 72(CX), SI + MOVQ 80(CX), DI + MOVQ 88(CX), R8 + XORQ R9, R9 + MOVQ R9, 8(SP) + MOVQ R9, 16(SP) + MOVQ R9, 24(SP) + MOVQ 112(CX), R9 + MOVQ 128(CX), R10 + MOVQ R10, 32(SP) + MOVQ 144(CX), R10 + MOVQ 136(CX), R11 + MOVQ 200(CX), R12 + MOVQ R12, 56(SP) + MOVQ 176(CX), R12 + MOVQ R12, 48(SP) + MOVQ 184(CX), CX + MOVQ CX, 40(SP) + MOVQ 40(SP), CX + ADDQ CX, 48(SP) + + // Calculate poiter to s.out[cap(s.out)] (a past-end pointer) + ADDQ R9, 32(SP) + + // outBase += outPosition + ADDQ R11, R9 + +sequenceDecs_decodeSync_safe_bmi2_main_loop: + MOVQ (SP), R12 + + // Fill bitreader to have enough for the offset and match length. + CMPQ BX, $0x08 + JL sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R12 + MOVQ (R12), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decodeSync_safe_bmi2_fill_end + +sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decodeSync_safe_bmi2_fill_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decodeSync_safe_bmi2_fill_end + SHLQ $0x08, AX + SUBQ $0x01, R12 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R12), CX + 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 + BEXTRQ CX, R8, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ R8, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 8(SP) + + // Update match length + MOVQ $0x00000808, CX + BEXTRQ CX, DI, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ DI, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 16(SP) + + // Fill bitreader to have enough for the remaining + CMPQ BX, $0x08 + JL sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte + MOVQ DX, CX + SHRQ $0x03, CX + SUBQ CX, R12 + MOVQ (R12), AX + SUBQ CX, BX + ANDQ $0x07, DX + JMP sequenceDecs_decodeSync_safe_bmi2_fill_2_end + +sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte: + CMPQ BX, $0x00 + JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_check_overread + CMPQ DX, $0x07 + JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_end + SHLQ $0x08, AX + SUBQ $0x01, R12 + SUBQ $0x01, BX + SUBQ $0x08, DX + MOVBQZX (R12), CX + 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 + BEXTRQ CX, SI, R13 + MOVQ AX, R14 + LEAQ (DX)(R13*1), CX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + MOVQ CX, DX + MOVQ SI, CX + SHRQ $0x20, CX + ADDQ R14, CX + MOVQ CX, 24(SP) + + // Fill bitreader for state updates + MOVQ R12, (SP) + MOVQ $0x00000808, CX + BEXTRQ CX, R8, R12 + MOVQ ctx+16(FP), CX + CMPQ 96(CX), $0x00 + JZ sequenceDecs_decodeSync_safe_bmi2_skip_update + LEAQ (SI)(DI*1), R13 + ADDQ R8, R13 + MOVBQZX R13, R13 + LEAQ (DX)(R13*1), CX + MOVQ AX, R14 + MOVQ CX, DX + ROLQ CL, R14 + BZHIQ R13, R14, R14 + + // Update Offset State + BZHIQ R8, R14, CX + SHRXQ R8, R14, R14 + MOVQ $0x00001010, R13 + BEXTRQ R13, R8, R8 + ADDQ CX, R8 + + // Load ctx.ofTable + MOVQ ctx+16(FP), CX + MOVQ 48(CX), CX + MOVQ (CX)(R8*8), R8 + + // Update Match Length State + BZHIQ DI, R14, CX + SHRXQ DI, R14, R14 + MOVQ $0x00001010, R13 + BEXTRQ R13, DI, DI + ADDQ CX, DI + + // Load ctx.mlTable + MOVQ ctx+16(FP), CX + MOVQ 24(CX), CX + MOVQ (CX)(DI*8), DI + + // Update Literal Length State + BZHIQ SI, R14, CX + MOVQ $0x00001010, R13 + BEXTRQ R13, SI, SI + ADDQ CX, SI + + // Load ctx.llTable + MOVQ ctx+16(FP), CX + MOVQ (CX), CX + MOVQ (CX)(SI*8), SI + +sequenceDecs_decodeSync_safe_bmi2_skip_update: + // Adjust offset + MOVQ s+0(FP), CX + MOVQ 8(SP), R13 + CMPQ R12, $0x01 + JBE sequenceDecs_decodeSync_safe_bmi2_adjust_offsetB_1_or_0 + MOVUPS 144(CX), X0 + MOVQ R13, 144(CX) + MOVUPS X0, 152(CX) + JMP sequenceDecs_decodeSync_safe_bmi2_after_adjust + +sequenceDecs_decodeSync_safe_bmi2_adjust_offsetB_1_or_0: + CMPQ 24(SP), $0x00000000 + JNE sequenceDecs_decodeSync_safe_bmi2_adjust_offset_maybezero + INCQ R13 + JMP sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero + +sequenceDecs_decodeSync_safe_bmi2_adjust_offset_maybezero: + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero + MOVQ 144(CX), R13 + JMP sequenceDecs_decodeSync_safe_bmi2_after_adjust + +sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero: + MOVQ R13, R12 + XORQ R14, R14 + MOVQ $-1, R15 + CMPQ R13, $0x03 + CMOVQEQ R14, R12 + CMOVQEQ R15, R14 + ADDQ 144(CX)(R12*8), R14 + JNZ sequenceDecs_decodeSync_safe_bmi2_adjust_temp_valid + MOVQ $0x00000001, R14 + +sequenceDecs_decodeSync_safe_bmi2_adjust_temp_valid: + CMPQ R13, $0x01 + JZ sequenceDecs_decodeSync_safe_bmi2_adjust_skip + MOVQ 152(CX), R12 + MOVQ R12, 160(CX) + +sequenceDecs_decodeSync_safe_bmi2_adjust_skip: + MOVQ 144(CX), R12 + MOVQ R12, 152(CX) + MOVQ R14, 144(CX) + MOVQ R14, R13 + +sequenceDecs_decodeSync_safe_bmi2_after_adjust: + MOVQ R13, 8(SP) + + // Check values + MOVQ 16(SP), CX + MOVQ 24(SP), R12 + LEAQ (CX)(R12*1), R14 + MOVQ s+0(FP), R15 + ADDQ R14, 256(R15) + MOVQ ctx+16(FP), R14 + SUBQ R12, 104(R14) + JS error_not_enough_literals + CMPQ CX, $0x00020002 + JA sequenceDecs_decodeSync_safe_bmi2_error_match_len_too_big + TESTQ R13, R13 + JNZ sequenceDecs_decodeSync_safe_bmi2_match_len_ofs_ok + TESTQ CX, CX + JNZ sequenceDecs_decodeSync_safe_bmi2_error_match_len_ofs_mismatch + +sequenceDecs_decodeSync_safe_bmi2_match_len_ofs_ok: + MOVQ 24(SP), CX + MOVQ 8(SP), R12 + MOVQ 16(SP), R13 + + // Check if we have enough space in s.out + LEAQ (CX)(R13*1), R14 + ADDQ R9, R14 + CMPQ R14, 32(SP) + JA error_not_enough_space + + // Copy literals + TESTQ CX, CX + JZ check_offset + MOVQ CX, R14 + SUBQ $0x10, R14 + JB copy_1_small + +copy_1_loop: + MOVUPS (R10), X0 + MOVUPS X0, (R9) + ADDQ $0x10, R10 + ADDQ $0x10, R9 + SUBQ $0x10, R14 + JAE copy_1_loop + LEAQ 16(R10)(R14*1), R10 + LEAQ 16(R9)(R14*1), R9 + MOVUPS -16(R10), X0 + MOVUPS X0, -16(R9) + JMP copy_1_end + +copy_1_small: + CMPQ CX, $0x03 + JE copy_1_move_3 + JB copy_1_move_1or2 + CMPQ CX, $0x08 + JB copy_1_move_4through7 + JMP copy_1_move_8through16 + +copy_1_move_1or2: + MOVB (R10), R14 + MOVB -1(R10)(CX*1), R15 + MOVB R14, (R9) + MOVB R15, -1(R9)(CX*1) + ADDQ CX, R10 + ADDQ CX, R9 + JMP copy_1_end + +copy_1_move_3: + MOVW (R10), R14 + MOVB 2(R10), R15 + MOVW R14, (R9) + MOVB R15, 2(R9) + ADDQ CX, R10 + ADDQ CX, R9 + JMP copy_1_end + +copy_1_move_4through7: + MOVL (R10), R14 + MOVL -4(R10)(CX*1), R15 + MOVL R14, (R9) + MOVL R15, -4(R9)(CX*1) + ADDQ CX, R10 + ADDQ CX, R9 + JMP copy_1_end + +copy_1_move_8through16: + MOVQ (R10), R14 + MOVQ -8(R10)(CX*1), R15 + MOVQ R14, (R9) + MOVQ R15, -8(R9)(CX*1) + ADDQ CX, R10 + ADDQ CX, R9 + +copy_1_end: + ADDQ CX, R11 + + // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) +check_offset: + MOVQ R11, CX + ADDQ 40(SP), CX + CMPQ R12, CX + JG error_match_off_too_big + CMPQ R12, 56(SP) + JG error_match_off_too_big + + // Copy match from history + MOVQ R12, CX + SUBQ R11, CX + JLS copy_match + MOVQ 48(SP), R14 + SUBQ CX, R14 + CMPQ R13, CX + JG copy_all_from_history + MOVQ R13, CX + SUBQ $0x10, CX + JB copy_4_small + +copy_4_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R9) + ADDQ $0x10, R14 + ADDQ $0x10, R9 + SUBQ $0x10, CX + JAE copy_4_loop + LEAQ 16(R14)(CX*1), R14 + LEAQ 16(R9)(CX*1), R9 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R9) + JMP copy_4_end + +copy_4_small: + CMPQ R13, $0x03 + JE copy_4_move_3 + CMPQ R13, $0x08 + JB copy_4_move_4through7 + JMP copy_4_move_8through16 + +copy_4_move_3: + MOVW (R14), CX + MOVB 2(R14), R12 + MOVW CX, (R9) + MOVB R12, 2(R9) + ADDQ R13, R14 + ADDQ R13, R9 + JMP copy_4_end + +copy_4_move_4through7: + MOVL (R14), CX + MOVL -4(R14)(R13*1), R12 + MOVL CX, (R9) + MOVL R12, -4(R9)(R13*1) + ADDQ R13, R14 + ADDQ R13, R9 + JMP copy_4_end + +copy_4_move_8through16: + MOVQ (R14), CX + MOVQ -8(R14)(R13*1), R12 + MOVQ CX, (R9) + MOVQ R12, -8(R9)(R13*1) + ADDQ R13, R14 + ADDQ R13, R9 + +copy_4_end: + ADDQ R13, R11 + JMP handle_loop + JMP loop_finished + +copy_all_from_history: + MOVQ CX, R15 + SUBQ $0x10, R15 + JB copy_5_small + +copy_5_loop: + MOVUPS (R14), X0 + MOVUPS X0, (R9) + ADDQ $0x10, R14 + ADDQ $0x10, R9 + SUBQ $0x10, R15 + JAE copy_5_loop + LEAQ 16(R14)(R15*1), R14 + LEAQ 16(R9)(R15*1), R9 + MOVUPS -16(R14), X0 + MOVUPS X0, -16(R9) + JMP copy_5_end + +copy_5_small: + CMPQ CX, $0x03 + JE copy_5_move_3 + JB copy_5_move_1or2 + CMPQ CX, $0x08 + JB copy_5_move_4through7 + JMP copy_5_move_8through16 + +copy_5_move_1or2: + MOVB (R14), R15 + MOVB -1(R14)(CX*1), BP + MOVB R15, (R9) + MOVB BP, -1(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_3: + MOVW (R14), R15 + MOVB 2(R14), BP + MOVW R15, (R9) + MOVB BP, 2(R9) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_4through7: + MOVL (R14), R15 + MOVL -4(R14)(CX*1), BP + MOVL R15, (R9) + MOVL BP, -4(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + JMP copy_5_end + +copy_5_move_8through16: + MOVQ (R14), R15 + MOVQ -8(R14)(CX*1), BP + MOVQ R15, (R9) + MOVQ BP, -8(R9)(CX*1) + ADDQ CX, R14 + ADDQ CX, R9 + +copy_5_end: + ADDQ CX, R11 + SUBQ CX, R13 + + // Copy match from the current buffer +copy_match: + MOVQ R9, CX + SUBQ R12, CX + + // ml <= mo + CMPQ R13, R12 + JA copy_overlapping_match + + // Copy non-overlapping match + ADDQ R13, R11 + MOVQ R13, R12 + SUBQ $0x10, R12 + JB copy_2_small + +copy_2_loop: + MOVUPS (CX), X0 + MOVUPS X0, (R9) + ADDQ $0x10, CX + ADDQ $0x10, R9 + SUBQ $0x10, R12 + JAE copy_2_loop + LEAQ 16(CX)(R12*1), CX + LEAQ 16(R9)(R12*1), R9 + MOVUPS -16(CX), X0 + MOVUPS X0, -16(R9) + JMP copy_2_end + +copy_2_small: + CMPQ R13, $0x03 + JE copy_2_move_3 + JB copy_2_move_1or2 + CMPQ R13, $0x08 + JB copy_2_move_4through7 + JMP copy_2_move_8through16 + +copy_2_move_1or2: + MOVB (CX), R12 + MOVB -1(CX)(R13*1), R14 + MOVB R12, (R9) + MOVB R14, -1(R9)(R13*1) + ADDQ R13, CX + ADDQ R13, R9 + JMP copy_2_end + +copy_2_move_3: + MOVW (CX), R12 + MOVB 2(CX), R14 + MOVW R12, (R9) + MOVB R14, 2(R9) + ADDQ R13, CX + ADDQ R13, R9 + JMP copy_2_end + +copy_2_move_4through7: + MOVL (CX), R12 + MOVL -4(CX)(R13*1), R14 + MOVL R12, (R9) + MOVL R14, -4(R9)(R13*1) + ADDQ R13, CX + ADDQ R13, R9 + JMP copy_2_end + +copy_2_move_8through16: + MOVQ (CX), R12 + MOVQ -8(CX)(R13*1), R14 + MOVQ R12, (R9) + MOVQ R14, -8(R9)(R13*1) + ADDQ R13, CX + ADDQ R13, R9 + +copy_2_end: + JMP handle_loop + + // Copy overlapping match +copy_overlapping_match: + ADDQ R13, R11 + +copy_slow_3: + MOVB (CX), R12 + MOVB R12, (R9) + INCQ CX + INCQ R9 + DECQ R13 + JNZ copy_slow_3 + +handle_loop: + MOVQ ctx+16(FP), CX + DECQ 96(CX) + JNS sequenceDecs_decodeSync_safe_bmi2_main_loop + +loop_finished: + MOVQ br+8(FP), CX + MOVQ AX, 32(CX) + MOVB DL, 40(CX) + MOVQ BX, 24(CX) + + // Update the context + MOVQ ctx+16(FP), AX + MOVQ R11, 136(AX) + MOVQ 144(AX), CX + SUBQ CX, R10 + MOVQ R10, 168(AX) + + // Return success + MOVQ $0x00000000, ret+24(FP) + RET + + // Return with match length error +sequenceDecs_decodeSync_safe_bmi2_error_match_len_ofs_mismatch: + MOVQ 16(SP), AX + MOVQ ctx+16(FP), CX + MOVQ AX, 216(CX) + MOVQ $0x00000001, ret+24(FP) + RET + + // Return with match too long error +sequenceDecs_decodeSync_safe_bmi2_error_match_len_too_big: + MOVQ ctx+16(FP), AX + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ $0x00000002, ret+24(FP) + RET + + // Return with match offset too long error +error_match_off_too_big: + MOVQ ctx+16(FP), AX + MOVQ 8(SP), CX + MOVQ CX, 224(AX) + MOVQ R11, 136(AX) + MOVQ $0x00000003, ret+24(FP) + RET + + // Return with not enough literals error +error_not_enough_literals: + MOVQ ctx+16(FP), AX + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + 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 + MOVQ 24(SP), CX + MOVQ CX, 208(AX) + MOVQ 16(SP), CX + MOVQ CX, 216(AX) + MOVQ R11, 136(AX) + MOVQ $0x00000005, ret+24(FP) + RET diff --git a/tools/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go new file mode 100644 index 000000000..ac2a80d29 --- /dev/null +++ b/tools/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go @@ -0,0 +1,237 @@ +//go:build !amd64 || appengine || !gc || noasm +// +build !amd64 appengine !gc noasm + +package zstd + +import ( + "fmt" + "io" +) + +// decode sequences from the stream with the provided history but without dictionary. +func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { + return false, nil +} + +// decode sequences from the stream without the provided history. +func (s *sequenceDecs) decode(seqs []seqVals) error { + br := s.br + + // Grab full sizes tables, to avoid bounds checks. + llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize] + llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state + s.seqSize = 0 + litRemain := len(s.literals) + + maxBlockSize := maxCompressedBlockSize + if s.windowSize < maxBlockSize { + maxBlockSize = s.windowSize + } + for i := range seqs { + var ll, mo, ml int + if br.off > 4+((maxOffsetBits+16+16)>>3) { + // inlined function: + // ll, mo, ml = s.nextFast(br, llState, mlState, ofState) + + // Final will not read from stream. + var llB, mlB, moB uint8 + ll, llB = llState.final() + ml, mlB = mlState.final() + mo, moB = ofState.final() + + // extra bits are stored in reverse order. + br.fillFast() + mo += br.getBits(moB) + if s.maxBits > 32 { + br.fillFast() + } + ml += br.getBits(mlB) + ll += br.getBits(llB) + + if moB > 1 { + s.prevOffset[2] = s.prevOffset[1] + s.prevOffset[1] = s.prevOffset[0] + s.prevOffset[0] = mo + } else { + // mo = s.adjustOffset(mo, ll, moB) + // Inlined for rather big speedup + if ll == 0 { + // There is an exception though, when current sequence's literals_length = 0. + // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, + // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. + mo++ + } + + if mo == 0 { + mo = s.prevOffset[0] + } else { + var temp int + if mo == 3 { + temp = s.prevOffset[0] - 1 + } else { + temp = s.prevOffset[mo] + } + + if temp == 0 { + // 0 is not valid; input is corrupted; force offset to 1 + println("WARNING: temp was 0") + temp = 1 + } + + if mo != 1 { + s.prevOffset[2] = s.prevOffset[1] + } + s.prevOffset[1] = s.prevOffset[0] + s.prevOffset[0] = temp + mo = temp + } + } + br.fillFast() + } else { + if br.overread() { + if debugDecoder { + printf("reading sequence %d, exceeded available data\n", i) + } + return io.ErrUnexpectedEOF + } + ll, mo, ml = s.next(br, llState, mlState, ofState) + br.fill() + } + + if debugSequences { + println("Seq", i, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml) + } + // Evaluate. + // We might be doing this async, so do it early. + if mo == 0 && ml > 0 { + return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) + } + if ml > maxMatchLen { + return fmt.Errorf("match len (%d) bigger than max allowed length", ml) + } + s.seqSize += ll + ml + if s.seqSize > maxBlockSize { + return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) + } + litRemain -= ll + if litRemain < 0 { + return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, litRemain+ll) + } + seqs[i] = seqVals{ + ll: ll, + ml: ml, + mo: mo, + } + if i == len(seqs)-1 { + // This is the last sequence, so we shouldn't update state. + break + } + + // Manually inlined, ~ 5-20% faster + // Update all 3 states at once. Approx 20% faster. + nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits() + if nBits == 0 { + llState = llTable[llState.newState()&maxTableMask] + mlState = mlTable[mlState.newState()&maxTableMask] + ofState = ofTable[ofState.newState()&maxTableMask] + } else { + bits := br.get32BitsFast(nBits) + lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31)) + llState = llTable[(llState.newState()+lowBits)&maxTableMask] + + lowBits = uint16(bits >> (ofState.nbBits() & 31)) + lowBits &= bitMask[mlState.nbBits()&15] + mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask] + + lowBits = uint16(bits) & bitMask[ofState.nbBits()&15] + ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask] + } + } + s.seqSize += litRemain + if s.seqSize > maxBlockSize { + return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) + } + err := br.close() + if err != nil { + printf("Closing sequences: %v, %+v\n", err, *br) + } + return err +} + +// executeSimple handles cases when a dictionary is not used. +func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error { + // Ensure we have enough output size... + if len(s.out)+s.seqSize > cap(s.out) { + addBytes := s.seqSize + len(s.out) + s.out = append(s.out, make([]byte, addBytes)...) + s.out = s.out[:len(s.out)-addBytes] + } + + if debugDecoder { + printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize) + } + + var t = len(s.out) + out := s.out[:t+s.seqSize] + + for _, seq := range seqs { + // Add literals + copy(out[t:], s.literals[:seq.ll]) + t += seq.ll + s.literals = s.literals[seq.ll:] + + // Malformed input + if seq.mo > t+len(hist) || seq.mo > s.windowSize { + return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist)) + } + + // Copy from history. + if v := seq.mo - t; v > 0 { + // v is the start position in history from end. + start := len(hist) - v + if seq.ml > v { + // Some goes into the current block. + // Copy remainder of history + copy(out[t:], hist[start:]) + t += v + seq.ml -= v + } else { + copy(out[t:], hist[start:start+seq.ml]) + t += seq.ml + continue + } + } + + // We must be in the current buffer now + if seq.ml > 0 { + start := t - seq.mo + if seq.ml <= t-start { + // No overlap + copy(out[t:], out[start:start+seq.ml]) + t += seq.ml + } else { + // Overlapping copy + // Extend destination slice and copy one byte at the time. + src := out[start : start+seq.ml] + dst := out[t:] + dst = dst[:len(src)] + t += len(src) + // Destination is the space we just added. + for i := range src { + dst[i] = src[i] + } + } + } + } + // Add final literals + copy(out[t:], s.literals) + if debugDecoder { + t += len(s.literals) + if t != len(out) { + panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) + } + } + s.out = out + + return nil +} diff --git a/tools/vendor/github.com/klauspost/compress/zstd/zip.go b/tools/vendor/github.com/klauspost/compress/zstd/zip.go index 967f29b31..29c15c8c4 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/zip.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/zip.go @@ -18,36 +18,58 @@ const ZipMethodWinZip = 93 // See https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.9.TXT const ZipMethodPKWare = 20 -var zipReaderPool sync.Pool +// zipReaderPool is the default reader pool. +var zipReaderPool = sync.Pool{New: func() interface{} { + z, err := NewReader(nil, WithDecoderLowmem(true), WithDecoderMaxWindow(128<<20), WithDecoderConcurrency(1)) + if err != nil { + panic(err) + } + return z +}} -// newZipReader cannot be used since we would leak goroutines... -func newZipReader(r io.Reader) io.ReadCloser { - dec, ok := zipReaderPool.Get().(*Decoder) - if ok { - dec.Reset(r) - } else { - d, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true)) - if err != nil { - panic(err) +// newZipReader creates a pooled zip decompressor. +func newZipReader(opts ...DOption) func(r io.Reader) io.ReadCloser { + pool := &zipReaderPool + if len(opts) > 0 { + opts = append([]DOption{WithDecoderLowmem(true), WithDecoderMaxWindow(128 << 20)}, opts...) + // Force concurrency 1 + opts = append(opts, WithDecoderConcurrency(1)) + // Create our own pool + pool = &sync.Pool{} + } + return func(r io.Reader) io.ReadCloser { + dec, ok := pool.Get().(*Decoder) + if ok { + dec.Reset(r) + } else { + d, err := NewReader(r, opts...) + if err != nil { + panic(err) + } + dec = d } - dec = d + return &pooledZipReader{dec: dec, pool: pool} } - return &pooledZipReader{dec: dec} } type pooledZipReader struct { - mu sync.Mutex // guards Close and Read - dec *Decoder + mu sync.Mutex // guards Close and Read + pool *sync.Pool + dec *Decoder } func (r *pooledZipReader) Read(p []byte) (n int, err error) { r.mu.Lock() defer r.mu.Unlock() if r.dec == nil { - return 0, errors.New("Read after Close") + return 0, errors.New("read after close or EOF") } dec, err := r.dec.Read(p) - + if err == io.EOF { + r.dec.Reset(nil) + r.pool.Put(r.dec) + r.dec = nil + } return dec, err } @@ -57,7 +79,7 @@ func (r *pooledZipReader) Close() error { var err error if r.dec != nil { err = r.dec.Reset(nil) - zipReaderPool.Put(r.dec) + r.pool.Put(r.dec) r.dec = nil } return err @@ -111,12 +133,9 @@ func ZipCompressor(opts ...EOption) func(w io.Writer) (io.WriteCloser, error) { // ZipDecompressor returns a decompressor that can be registered with zip libraries. // See ZipCompressor for example. -func ZipDecompressor() func(r io.Reader) io.ReadCloser { - return func(r io.Reader) io.ReadCloser { - d, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true)) - if err != nil { - panic(err) - } - return d.IOReadCloser() - } +// Options can be specified. WithDecoderConcurrency(1) is forced, +// and by default a 128MB maximum decompression window is specified. +// The window size can be overridden if required. +func ZipDecompressor(opts ...DOption) func(r io.Reader) io.ReadCloser { + return newZipReader(opts...) } diff --git a/tools/vendor/github.com/klauspost/compress/zstd/zstd.go b/tools/vendor/github.com/klauspost/compress/zstd/zstd.go index ef1d49a00..89396673d 100644 --- a/tools/vendor/github.com/klauspost/compress/zstd/zstd.go +++ b/tools/vendor/github.com/klauspost/compress/zstd/zstd.go @@ -36,8 +36,8 @@ const forcePreDef = false // zstdMinMatch is the minimum zstd match length. const zstdMinMatch = 3 -// Reset the buffer offset when reaching this. -const bufferReset = math.MaxInt32 - MaxWindowSize +// fcsUnknown is used for unknown frame content size. +const fcsUnknown = math.MaxUint64 var ( // ErrReservedBlockType is returned when a reserved block type is found. @@ -52,6 +52,10 @@ var ( // Typically returned on invalid input. ErrBlockTooSmall = errors.New("block too small") + // ErrUnexpectedBlockSize is returned when a block has unexpected size. + // Typically returned on invalid input. + ErrUnexpectedBlockSize = errors.New("unexpected block size") + // ErrMagicMismatch is returned when a "magic" number isn't what is expected. // Typically this indicates wrong or corrupted input. ErrMagicMismatch = errors.New("invalid input: magic number mismatch") @@ -68,13 +72,16 @@ var ( ErrDecoderSizeExceeded = errors.New("decompressed size exceeds configured limit") // ErrUnknownDictionary is returned if the dictionary ID is unknown. - // For the time being dictionaries are not supported. ErrUnknownDictionary = errors.New("unknown dictionary") // ErrFrameSizeExceeded is returned if the stated frame size is exceeded. // This is only returned if SingleSegment is specified on the frame. ErrFrameSizeExceeded = errors.New("frame size exceeded") + // ErrFrameSizeMismatch is returned if the stated frame size does not match the expected size. + // This is only returned if SingleSegment is specified on the frame. + ErrFrameSizeMismatch = errors.New("frame size does not match size on stream") + // ErrCRCMismatch is returned if CRC mismatches. ErrCRCMismatch = errors.New("CRC check failed") @@ -99,49 +106,33 @@ func printf(format string, a ...interface{}) { } } -// matchLenFast does matching, but will not match the last up to 7 bytes. -func matchLenFast(a, b []byte) int { - endI := len(a) & (math.MaxInt32 - 7) - for i := 0; i < endI; i += 8 { - if diff := load64(a, i) ^ load64(b, i); diff != 0 { - return i + bits.TrailingZeros64(diff)>>3 - } - } - return endI -} - -// matchLen returns the maximum length. +// matchLen returns the maximum common prefix length of a and b. // a must be the shortest of the two. -// The function also returns whether all bytes matched. -func matchLen(a, b []byte) int { - b = b[:len(a)] - for i := 0; i < len(a)-7; i += 8 { - if diff := load64(a, i) ^ load64(b, i); diff != 0 { - return i + (bits.TrailingZeros64(diff) >> 3) +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 } - checked := (len(a) >> 3) << 3 - a = a[checked:] - b = b[checked:] for i := range a { if a[i] != b[i] { - return i + checked + break } + n++ } - return len(a) + checked + 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:]) -} - -func load64(b []byte, i int) uint64 { - return binary.LittleEndian.Uint64(b[i:]) + return binary.LittleEndian.Uint64(b[:len(b):len(b)][i:]) } type byter interface { diff --git a/tools/vendor/github.com/mattn/go-sqlite3/README.md b/tools/vendor/github.com/mattn/go-sqlite3/README.md index e455133fc..931b02e3e 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/README.md +++ b/tools/vendor/github.com/mattn/go-sqlite3/README.md @@ -1,7 +1,7 @@ go-sqlite3 ========== -[![GoDoc Reference](https://godoc.org/github.com/mattn/go-sqlite3?status.svg)](http://godoc.org/github.com/mattn/go-sqlite3) +[![Go Reference](https://pkg.go.dev/badge/github.com/mattn/go-sqlite3.svg)](https://pkg.go.dev/github.com/mattn/go-sqlite3) [![GitHub Actions](https://github.com/mattn/go-sqlite3/workflows/Go/badge.svg)](https://github.com/mattn/go-sqlite3/actions?query=workflow%3AGo) [![Financial Contributors on Open Collective](https://opencollective.com/mattn-go-sqlite3/all/badge.svg?label=financial+contributors)](https://opencollective.com/mattn-go-sqlite3) [![codecov](https://codecov.io/gh/mattn/go-sqlite3/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-sqlite3) @@ -172,15 +172,18 @@ go build --tags "icu json1 fts5 secure_delete" | International Components for Unicode | sqlite_icu | This option causes the International Components for Unicode or "ICU" extension to SQLite to be added to the build | | Introspect PRAGMAS | sqlite_introspect | This option adds some extra PRAGMA statements.
    • PRAGMA function_list
    • PRAGMA module_list
    • PRAGMA pragma_list
    | | JSON SQL Functions | sqlite_json | When this option is defined in the amalgamation, the JSON SQL functions are added to the build automatically | +| Math Functions | sqlite_math_functions | This compile-time option enables built-in scalar math functions. For more information see [Built-In Mathematical SQL Functions](https://www.sqlite.org/lang_mathfunc.html) | +| OS Trace | sqlite_os_trace | This option enables OSTRACE() debug logging. This can be verbose and should not be used in production. | | Pre Update Hook | sqlite_preupdate_hook | Registers a callback function that is invoked prior to each INSERT, UPDATE, and DELETE operation on a database table. | | Secure Delete | sqlite_secure_delete | This compile-time option changes the default setting of the secure_delete pragma.

    When this option is not used, secure_delete defaults to off. When this option is present, secure_delete defaults to on.

    The secure_delete setting causes deleted content to be overwritten with zeros. There is a small performance penalty since additional I/O must occur.

    On the other hand, secure_delete can prevent fragments of sensitive information from lingering in unused parts of the database file after it has been deleted. See the documentation on the secure_delete pragma for additional information | | Secure Delete (FAST) | sqlite_secure_delete_fast | For more information see [PRAGMA secure_delete](https://www.sqlite.org/pragma.html#pragma_secure_delete) | | Tracing / Debug | sqlite_trace | Activate trace functions | | User Authentication | sqlite_userauth | SQLite User Authentication see [User Authentication](#user-authentication) for more information. | +| Virtual Tables | sqlite_vtable | SQLite Virtual Tables see [SQLite Official VTABLE Documentation](https://www.sqlite.org/vtab.html) for more information, and a [full example here](https://github.com/mattn/go-sqlite3/tree/master/_example/vtable) | # Compilation -This package requires the `CGO_ENABLED=1` ennvironment variable if not set by default, and the presence of the `gcc` compiler. +This package requires the `CGO_ENABLED=1` environment variable if not set by default, and the presence of the `gcc` compiler. If you need to add additional CFLAGS or LDFLAGS to the build command, and do not want to modify this package, then this can be achieved by using the `CGO_CFLAGS` and `CGO_LDFLAGS` environment variables. @@ -216,14 +219,13 @@ This library can be cross-compiled. In some cases you are required to the `CC` environment variable with the cross compiler. ## Cross Compiling from MAC OSX -The simplest way to cross compile from OSX is to use [xgo](https://github.com/karalabe/xgo). +The simplest way to cross compile from OSX is to use [musl-cross](https://github.com/FiloSottile/homebrew-musl-cross). Steps: -- Install [xgo](https://github.com/karalabe/xgo) (`go get github.com/karalabe/xgo`). -- Ensure that your project is within your `GOPATH`. -- Run `xgo local/path/to/project`. +- Install [musl-cross](https://github.com/FiloSottile/homebrew-musl-cross) (`brew install FiloSottile/musl-cross/musl-cross`). +- Run `CC=x86_64-linux-musl-gcc CXX=x86_64-linux-musl-g++ GOARCH=amd64 GOOS=linux CGO_ENABLED=1 go build -ldflags "-linkmode external -extldflags -static"`. -Please refer to the project's [README](https://github.com/karalabe/xgo/blob/master/README.md) for further information. +Please refer to the project's [README](https://github.com/FiloSottile/homebrew-musl-cross#readme) for further information. # Google Cloud Platform diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c index 102821bbe..dd05f5751 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c @@ -1,7 +1,7 @@ #ifndef USE_LIBSQLITE3 /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.38.5. By combining all the individual C code files into this +** version 3.39.4. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -453,9 +453,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.38.5" -#define SQLITE_VERSION_NUMBER 3038005 -#define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe" +#define SQLITE_VERSION "3.39.4" +#define SQLITE_VERSION_NUMBER 3039004 +#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -5900,7 +5900,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** object D and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a -** memory allocation fails. +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. ** ** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object ** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer @@ -6582,6 +6583,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); +/* +** CAPI3REF: Return The Schema Name For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name +** for the N-th database on database connection D, or a NULL pointer of N is +** out of range. An N value of 0 means the main database file. An N of 1 is +** the "temp" schema. Larger values of N correspond to various ATTACH-ed +** databases. +** +** Space to hold the string that is returned by sqlite3_db_name() is managed +** by SQLite itself. The string might be deallocated by any operation that +** changes the schema, including [ATTACH] or [DETACH] or calls to +** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that +** occur on a different thread. Applications that need to +** remember the string long-term should make their own copy. Applications that +** are accessing the same database connection simultaneously on multiple +** threads should mutex-protect calls to this API and should make their own +** private copy of the result prior to releasing the mutex. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); + /* ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 @@ -9861,8 +9884,8 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** of a [virtual table] implementation. The result of calling this ** interface from outside of xBestIndex() is undefined and probably harmful. ** -** ^The sqlite3_vtab_distinct() interface returns an integer that is -** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and +** 3. The integer returned by sqlite3_vtab_distinct() ** gives the virtual table additional information about how the query ** planner wants the output to be ordered. As long as the virtual table ** can meet the ordering requirements of the query planner, it may set @@ -9894,6 +9917,13 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** that have the same value for all columns identified by "aOrderBy". ** ^However omitting the extra rows is optional. ** This mode is used for a DISTINCT query. +**
  • +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means +** that the query planner needs only distinct rows but it does need the +** rows to be sorted.)^ ^The virtual table implementation is free to omit +** rows that are identical in all aOrderBy columns, if it wants to, but +** it is not required to omit any rows. This mode is used for queries +** that have both DISTINCT and ORDER BY clauses. ** ** ** ^For the purposes of comparing virtual table output values to see if the @@ -13115,6 +13145,11 @@ struct fts5_api { /************** End of sqlite3.h *********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ +/* +** Reuse the STATIC_LRU for mutex access to sqlite3_temp_directory. +*/ +#define SQLITE_MUTEX_STATIC_TEMPDIR SQLITE_MUTEX_STATIC_VFS1 + /* ** Include the configuration header output by 'configure' if we're using the ** autoconf-based build @@ -14358,8 +14393,19 @@ typedef INT16_TYPE LogEst; /* ** Round up a number to the next larger multiple of 8. This is used ** to force 8-byte alignment on 64-bit architectures. +** +** ROUND8() always does the rounding, for any argument. +** +** ROUND8P() assumes that the argument is already an integer number of +** pointers in size, and so it is a no-op on systems where the pointer +** size is 8. */ #define ROUND8(x) (((x)+7)&~7) +#if SQLITE_PTRSIZE==8 +# define ROUND8P(x) (x) +#else +# define ROUND8P(x) (((x)+7)&~7) +#endif /* ** Round down to the nearest multiple of 8 @@ -14422,22 +14468,23 @@ typedef INT16_TYPE LogEst; #endif /* -** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not -** the Select query generator tracing logic is turned on. +** TREETRACE_ENABLED will be either 1 or 0 depending on whether or not +** the Abstract Syntax Tree tracing logic is turned on. */ #if !defined(SQLITE_AMALGAMATION) -SQLITE_PRIVATE u32 sqlite3SelectTrace; +SQLITE_PRIVATE u32 sqlite3TreeTrace; #endif #if defined(SQLITE_DEBUG) \ - && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE)) -# define SELECTTRACE_ENABLED 1 + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE) \ + || defined(SQLITE_ENABLE_TREETRACE)) +# define TREETRACE_ENABLED 1 # define SELECTTRACE(K,P,S,X) \ - if(sqlite3SelectTrace&(K)) \ + if(sqlite3TreeTrace&(K)) \ sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ sqlite3DebugPrintf X #else # define SELECTTRACE(K,P,S,X) -# define SELECTTRACE_ENABLED 0 +# define TREETRACE_ENABLED 0 #endif /* @@ -14522,7 +14569,7 @@ struct BusyHandler { ** pointer will work here as long as it is distinct from SQLITE_STATIC ** and SQLITE_TRANSIENT. */ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomFault) +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) /* ** When SQLITE_OMIT_WSD is defined, it means that the target platform does @@ -14598,6 +14645,7 @@ typedef struct Lookaside Lookaside; typedef struct LookasideSlot LookasideSlot; typedef struct Module Module; typedef struct NameContext NameContext; +typedef struct OnOrUsing OnOrUsing; typedef struct Parse Parse; typedef struct ParseCleanup ParseCleanup; typedef struct PreUpdate PreUpdate; @@ -14716,14 +14764,15 @@ typedef struct Pager Pager; typedef struct PgHdr DbPage; /* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is ** reserved for working around a windows/posix incompatibility). It is ** used in the journal to signify that the remainder of the journal file ** is devoted to storing a super-journal name - there are no more pages to ** roll back. See comments for function writeSuperJournal() in pager.c ** for details. */ -#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) +#define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) +#define PAGER_SJ_PGNO(x) ((x)->lckPgno) /* ** Allowed values for the flags parameter to sqlite3PagerOpen(). @@ -15400,7 +15449,6 @@ struct VdbeOp { #ifdef SQLITE_ENABLE_CURSOR_HINTS Expr *pExpr; /* Used when p4type is P4_EXPR */ #endif - int (*xAdvance)(BtCursor *, int); } p4; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS char *zComment; /* Comment to improve readability */ @@ -15451,21 +15499,19 @@ typedef struct VdbeOpList VdbeOpList; #define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */ #define P4_INT32 (-3) /* P4 is a 32-bit signed integer */ #define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */ -#define P4_ADVANCE (-5) /* P4 is a pointer to BtreeNext() or BtreePrev() */ -#define P4_TABLE (-6) /* P4 is a pointer to a Table structure */ +#define P4_TABLE (-5) /* P4 is a pointer to a Table structure */ /* Above do not own any resources. Must free those below */ -#define P4_FREE_IF_LE (-7) -#define P4_DYNAMIC (-7) /* Pointer to memory from sqliteMalloc() */ -#define P4_FUNCDEF (-8) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-9) /* P4 is a pointer to a KeyInfo structure */ -#define P4_EXPR (-10) /* P4 is a pointer to an Expr tree */ -#define P4_MEM (-11) /* P4 is a pointer to a Mem* structure */ -#define P4_VTAB (-12) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_REAL (-13) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */ -#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */ +#define P4_FREE_IF_LE (-6) +#define P4_DYNAMIC (-6) /* Pointer to memory from sqliteMalloc() */ +#define P4_FUNCDEF (-7) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-8) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-9) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-10) /* P4 is a pointer to a Mem* structure */ +#define P4_VTAB (-11) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INTARRAY (-14) /* P4 is a vector of 32-bit integers */ +#define P4_FUNCCTX (-15) /* P4 is a pointer to an sqlite3_context object */ /* Error message codes for OP_Halt */ #define P5_ConstraintNotNull 1 @@ -15510,42 +15556,42 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Savepoint 0 #define OP_AutoCommit 1 #define OP_Transaction 2 -#define OP_SorterNext 3 /* jump */ -#define OP_Prev 4 /* jump */ -#define OP_Next 5 /* jump */ -#define OP_Checkpoint 6 -#define OP_JournalMode 7 -#define OP_Vacuum 8 -#define OP_VFilter 9 /* jump, synopsis: iplan=r[P3] zplan='P4' */ -#define OP_VUpdate 10 /* synopsis: data=r[P3@P2] */ -#define OP_Goto 11 /* jump */ -#define OP_Gosub 12 /* jump */ -#define OP_InitCoroutine 13 /* jump */ -#define OP_Yield 14 /* jump */ -#define OP_MustBeInt 15 /* jump */ -#define OP_Jump 16 /* jump */ -#define OP_Once 17 /* jump */ -#define OP_If 18 /* jump */ +#define OP_Checkpoint 3 +#define OP_JournalMode 4 +#define OP_Vacuum 5 +#define OP_VFilter 6 /* jump, synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 7 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 8 /* jump */ +#define OP_Gosub 9 /* jump */ +#define OP_InitCoroutine 10 /* jump */ +#define OP_Yield 11 /* jump */ +#define OP_MustBeInt 12 /* jump */ +#define OP_Jump 13 /* jump */ +#define OP_Once 14 /* jump */ +#define OP_If 15 /* jump */ +#define OP_IfNot 16 /* jump */ +#define OP_IsNullOrType 17 /* jump, synopsis: if typeof(r[P1]) IN (P3,5) goto P2 */ +#define OP_IfNullRow 18 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ #define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ -#define OP_IfNot 20 /* jump */ -#define OP_IsNullOrType 21 /* jump, synopsis: if typeof(r[P1]) IN (P3,5) goto P2 */ -#define OP_IfNullRow 22 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ -#define OP_SeekLT 23 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekLE 24 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGE 25 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGT 26 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IfNotOpen 27 /* jump, synopsis: if( !csr[P1] ) goto P2 */ -#define OP_IfNoHope 28 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NoConflict 29 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NotFound 30 /* jump, synopsis: key=r[P3@P4] */ -#define OP_Found 31 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekRowid 32 /* jump, synopsis: intkey=r[P3] */ -#define OP_NotExists 33 /* jump, synopsis: intkey=r[P3] */ -#define OP_Last 34 /* jump */ -#define OP_IfSmaller 35 /* jump */ -#define OP_SorterSort 36 /* jump */ -#define OP_Sort 37 /* jump */ -#define OP_Rewind 38 /* jump */ +#define OP_SeekLT 20 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 21 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 22 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 23 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IfNotOpen 24 /* jump, synopsis: if( !csr[P1] ) goto P2 */ +#define OP_IfNoHope 25 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 26 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 29 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 30 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 31 /* jump */ +#define OP_IfSmaller 32 /* jump */ +#define OP_SorterSort 33 /* jump */ +#define OP_Sort 34 /* jump */ +#define OP_Rewind 35 /* jump */ +#define OP_SorterNext 36 /* jump */ +#define OP_Prev 37 /* jump */ +#define OP_Next 38 /* jump */ #define OP_IdxLE 39 /* jump, synopsis: key=r[P3@P4] */ #define OP_IdxGT 40 /* jump, synopsis: key=r[P3@P4] */ #define OP_IdxLT 41 /* jump, synopsis: key=r[P3@P4] */ @@ -15581,34 +15627,34 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Integer 71 /* synopsis: r[P2]=P1 */ #define OP_Int64 72 /* synopsis: r[P2]=P4 */ #define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 74 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 75 /* synopsis: r[P1]=NULL */ -#define OP_Blob 76 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 77 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 78 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 79 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 80 /* synopsis: r[P2]=r[P1] */ -#define OP_IntCopy 81 /* synopsis: r[P2]=r[P1] */ -#define OP_FkCheck 82 -#define OP_ResultRow 83 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 84 -#define OP_AddImm 85 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_RealAffinity 86 -#define OP_Cast 87 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 88 -#define OP_Compare 89 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_IsTrue 90 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ -#define OP_ZeroOrNull 91 /* synopsis: r[P2] = 0 OR NULL */ -#define OP_Offset 92 /* synopsis: r[P3] = sqlite_offset(P1) */ -#define OP_Column 93 /* synopsis: r[P3]=PX */ -#define OP_TypeCheck 94 /* synopsis: typecheck(r[P1@P2]) */ -#define OP_Affinity 95 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 96 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 97 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 98 -#define OP_SetCookie 99 -#define OP_ReopenIdx 100 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 101 /* synopsis: root=P2 iDb=P3 */ +#define OP_BeginSubrtn 74 /* synopsis: r[P2]=NULL */ +#define OP_Null 75 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 76 /* synopsis: r[P1]=NULL */ +#define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 82 /* synopsis: r[P2]=r[P1] */ +#define OP_FkCheck 83 +#define OP_ResultRow 84 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 85 +#define OP_AddImm 86 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 87 +#define OP_Cast 88 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 89 +#define OP_Compare 90 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 91 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_ZeroOrNull 92 /* synopsis: r[P2] = 0 OR NULL */ +#define OP_Offset 93 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 94 /* synopsis: r[P3]=PX cursor P1 column P2 */ +#define OP_TypeCheck 95 /* synopsis: typecheck(r[P1@P2]) */ +#define OP_Affinity 96 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 97 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 98 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 99 +#define OP_SetCookie 100 +#define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */ #define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 160 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 161 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 163 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 164 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 165 -#define OP_CursorLock 166 -#define OP_CursorUnlock 167 -#define OP_TableLock 168 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 169 -#define OP_VCreate 170 -#define OP_VDestroy 171 -#define OP_VOpen 172 -#define OP_VInitIn 173 /* synopsis: r[P2]=ValueList(P1,P3) */ -#define OP_VColumn 174 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 175 -#define OP_Pagecount 176 -#define OP_MaxPgcnt 177 -#define OP_FilterAdd 178 /* synopsis: filter(P1) += key(P3@P4) */ -#define OP_Trace 179 -#define OP_CursorHint 180 -#define OP_ReleaseReg 181 /* synopsis: release r[P1@P2] mask P3 */ -#define OP_Noop 182 -#define OP_Explain 183 -#define OP_Abortable 184 +#define OP_DropTrigger 154 +#define OP_IntegrityCk 155 +#define OP_RowSetAdd 156 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 157 +#define OP_FkCounter 158 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 159 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 160 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 161 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 164 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 165 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 166 +#define OP_CursorLock 167 +#define OP_CursorUnlock 168 +#define OP_TableLock 169 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 170 +#define OP_VCreate 171 +#define OP_VDestroy 172 +#define OP_VOpen 173 +#define OP_VInitIn 174 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 175 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 176 +#define OP_Pagecount 177 +#define OP_MaxPgcnt 178 +#define OP_ClrSubtype 179 /* synopsis: r[P1].subtype = 0 */ +#define OP_FilterAdd 180 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 181 +#define OP_CursorHint 182 +#define OP_ReleaseReg 183 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 184 +#define OP_Explain 185 +#define OP_Abortable 186 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -15704,30 +15752,30 @@ typedef struct VdbeOpList VdbeOpList; #define OPFLG_OUT2 0x10 /* out2: P2 is an output */ #define OPFLG_OUT3 0x20 /* out3: P3 is an output */ #define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\ -/* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\ -/* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x03, 0x01, 0x09,\ -/* 24 */ 0x09, 0x09, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09,\ -/* 32 */ 0x09, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,\ +/* 8 */ 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x03,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x09, 0x09, 0x09, 0x09,\ +/* 24 */ 0x01, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x01,\ +/* 32 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ /* 40 */ 0x01, 0x01, 0x01, 0x26, 0x26, 0x23, 0x0b, 0x01,\ /* 48 */ 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ /* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01,\ /* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ -/* 72 */ 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,\ -/* 80 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02,\ -/* 88 */ 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00, 0x00,\ -/* 96 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x26, 0x26,\ +/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\ +/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\ +/* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00,\ +/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x26, 0x26,\ /* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ /* 112 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00,\ -/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ -/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ -/* 136 */ 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, 0x10,\ -/* 144 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 152 */ 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a,\ -/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\ -/* 176 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 184 */ 0x00,} +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ +/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ +/* 136 */ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00,\ +/* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ +/* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ +/* 176 */ 0x00, 0x10, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00,\ +/* 184 */ 0x00, 0x00, 0x00,} /* The resolve3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -15773,8 +15821,10 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p); #endif #if defined(SQLITE_DEBUG) SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int); +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn(Vdbe*,int,int,int); #else # define sqlite3VdbeVerifyAbortable(A,B) +# define sqlite3VdbeNoJumpsOutsideSubrtn(A,B,C,D) #endif SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); #ifndef SQLITE_OMIT_EXPLAIN @@ -15819,7 +15869,6 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); @@ -16268,6 +16317,13 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); # define SQLITE_MAX_PATHLEN FILENAME_MAX #endif +/* Maximum number of symlinks that will be resolved while trying to +** expand a filename in xFullPathname() in the VFS. +*/ +#ifndef SQLITE_MAX_SYMLINK +# define SQLITE_MAX_SYMLINK 200 +#endif + /* ** The default size of a disk sector */ @@ -17034,6 +17090,9 @@ struct sqlite3 { #define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */ #define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ #define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ +#define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */ +#define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */ + /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -17136,7 +17195,7 @@ struct FuncDestructor { #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ #define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ -#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ +/* 0x8000 -- available for reuse */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ @@ -17153,6 +17212,7 @@ struct FuncDestructor { #define INLINEFUNC_expr_compare 3 #define INLINEFUNC_affinity 4 #define INLINEFUNC_iif 5 +#define INLINEFUNC_sqlite_offset 6 #define INLINEFUNC_unlikely 99 /* Default case */ /* @@ -17379,6 +17439,7 @@ struct Column { #define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ #define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ #define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */ +#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ @@ -17785,6 +17846,11 @@ struct KeyInfo { struct UnpackedRecord { KeyInfo *pKeyInfo; /* Collation and sort-order information */ Mem *aMem; /* Values */ + union { + char *z; /* Cache of aMem[0].z for vdbeRecordCompareString() */ + i64 i; /* Cache of aMem[0].u.i for vdbeRecordCompareInt() */ + } u; + int n; /* Cache of aMem[0].n used by vdbeRecordCompareString() */ u16 nField; /* Number of entries in apMem[] */ i8 default_rc; /* Comparison result if keys are equal */ u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ @@ -18093,7 +18159,7 @@ struct Expr { ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ union { - int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + int iJoin; /* If EP_OuterON or EP_InnerON, the right table */ int iOfst; /* else: start of token from start of statement */ } w; AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ @@ -18114,29 +18180,29 @@ struct Expr { ** EP_Agg == NC_HasAgg == SF_HasAgg ** EP_Win == NC_HasWin */ -#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ -#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ -#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ -#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ +#define EP_OuterON 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_InnerON 0x000002 /* Originates in ON/USING of an inner join */ +#define EP_Distinct 0x000004 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000008 /* Contains one or more functions of any kind */ #define EP_Agg 0x000010 /* Contains one or more aggregate functions */ -#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ -#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ -#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ -#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ -#define EP_Commuted 0x000200 /* Comparison operator has been commuted */ -#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ -#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ -#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ -#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_FixedCol 0x000020 /* TK_Column with a known fixed value */ +#define EP_VarSelect 0x000040 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000080 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000100 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000200 /* Tree contains a TK_COLLATE operator */ +#define EP_Commuted 0x000400 /* Comparison operator has been commuted */ +#define EP_IntValue 0x000800 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x001000 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x002000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ -#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ -#define EP_IfNullRow 0x020000 /* The TK_IF_NULL_ROW opcode */ -#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ -#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ -#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ -#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ - /* 0x400000 // Available */ +#define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_MemToken 0x020000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */ +#define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x200000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x400000 /* Tree contains a TK_SELECT operator */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ #define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ @@ -18159,8 +18225,8 @@ struct Expr { #define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) #define ExprSetProperty(E,P) (E)->flags|=(P) #define ExprClearProperty(E,P) (E)->flags&=~(P) -#define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) -#define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) +#define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue) +#define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse) /* Macros used to ensure that the correct members of unions are accessed ** in Expr. @@ -18247,12 +18313,18 @@ struct ExprList { struct ExprList_item { /* For each expression in the list */ Expr *pExpr; /* The parse tree for this expression */ char *zEName; /* Token associated with this expression */ - u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ - unsigned eEName :2; /* Meaning of zEName */ - unsigned done :1; /* A flag to indicate when processing is finished */ - unsigned reusable :1; /* Constant expression is reusable */ - unsigned bSorterRef :1; /* Defer evaluation until after sorting */ - unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ + struct { + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ + unsigned done :1; /* Indicates when processing is finished */ + unsigned reusable :1; /* Constant expression is reusable */ + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */ + unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */ + unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */ + unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should + ** not be expanded by "*" in parent queries */ + } fg; union { struct { /* Used by any ExprList other than Parse.pConsExpr */ u16 iOrderByCol; /* For ORDER BY, column number in result set */ @@ -18287,13 +18359,25 @@ struct ExprList { ** If "a" is the k-th column of table "t", then IdList.a[0].idx==k. */ struct IdList { + int nId; /* Number of identifiers on the list */ + u8 eU4; /* Which element of a.u4 is valid */ struct IdList_item { char *zName; /* Name of the identifier */ - int idx; /* Index in some Table.aCol[] of a column named zName */ - } *a; - int nId; /* Number of identifiers on the list */ + union { + int idx; /* Index in some Table.aCol[] of a column named zName */ + Expr *pExpr; /* Expr to implement a USING variable -- NOT USED */ + } u4; + } a[1]; }; +/* +** Allowed values for IdList.eType, which determines which value of the a.u4 +** is valid. +*/ +#define EU4_NONE 0 /* Does not use IdList.a.u4 */ +#define EU4_IDX 1 /* Uses IdList.a.u4.idx */ +#define EU4_EXPR 2 /* Uses IdList.a.u4.pExpr -- NOT CURRENTLY USED */ + /* ** The SrcItem object represents a single term in the FROM clause of a query. ** The SrcList object is mostly an array of SrcItems. @@ -18321,15 +18405,22 @@ struct SrcItem { unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ unsigned isTabFunc :1; /* True if table-valued-function syntax */ unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned isMaterialized:1; /* This is a materialized view */ unsigned viaCoroutine :1; /* Implemented as a co-routine */ unsigned isRecursive :1; /* True for recursive reference in WITH */ unsigned fromDDL :1; /* Comes from sqlite_schema */ unsigned isCte :1; /* This is a CTE */ unsigned notCte :1; /* This item may not match a CTE */ + unsigned isUsing :1; /* u3.pUsing is valid */ + unsigned isOn :1; /* u3.pOn was once valid and non-NULL */ + unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */ + unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ - Expr *pOn; /* The ON clause of a join */ - IdList *pUsing; /* The USING clause of a join */ + union { + Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */ + IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */ + } u3; Bitmask colUsed; /* Bit N (1<" clause */ @@ -18341,6 +18432,15 @@ struct SrcItem { } u2; }; +/* +** The OnOrUsing object represents either an ON clause or a USING clause. +** It can never be both at the same time, but it can be neither. +*/ +struct OnOrUsing { + Expr *pOn; /* The ON clause of a join */ + IdList *pUsing; /* The USING clause of a join */ +}; + /* ** The following structure describes the FROM clause of a SELECT statement. ** Each table or subquery in the FROM clause is a separate element of @@ -18369,14 +18469,15 @@ struct SrcList { /* ** Permitted values of the SrcList.a.jointype field */ -#define JT_INNER 0x0001 /* Any kind of inner or cross join */ -#define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */ -#define JT_NATURAL 0x0004 /* True for a "natural" join */ -#define JT_LEFT 0x0008 /* Left outer join */ -#define JT_RIGHT 0x0010 /* Right outer join */ -#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */ -#define JT_ERROR 0x0040 /* unknown or unsupported join type */ - +#define JT_INNER 0x01 /* Any kind of inner or cross join */ +#define JT_CROSS 0x02 /* Explicit use of the CROSS keyword */ +#define JT_NATURAL 0x04 /* True for a "natural" join */ +#define JT_LEFT 0x08 /* Left outer join */ +#define JT_RIGHT 0x10 /* Right outer join */ +#define JT_OUTER 0x20 /* The "OUTER" keyword is present */ +#define JT_LTORJ 0x40 /* One of the LEFT operands of a RIGHT JOIN + ** Mnemonic: Left Table Of Right Join */ +#define JT_ERROR 0x80 /* unknown or unsupported join type */ /* ** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() @@ -18399,7 +18500,7 @@ struct SrcList { #define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ #define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */ #define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ - /* 0x1000 not currently used */ +#define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */ /* 0x2000 not currently used */ #define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ /* 0x8000 not currently used */ @@ -18595,6 +18696,9 @@ struct Select { #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ #define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ +/* True if S exists and has SF_NestedFrom */ +#define IsNestedFrom(S) ((S)!=0 && ((S)->selFlags&SF_NestedFrom)!=0) + /* ** The results of a SELECT can be distributed in several ways, as defined ** by one of the following macros. The "SRT" prefix means "SELECT Result @@ -18806,6 +18910,7 @@ struct Parse { u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 disableVtab; /* Disable all virtual tables for this parse */ + u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ #endif @@ -18978,20 +19083,20 @@ struct AuthContext { #define OPFLAG_PREFORMAT 0x80 /* OP_Insert uses preformatted cell */ /* - * Each trigger present in the database schema is stored as an instance of - * struct Trigger. - * - * Pointers to instances of struct Trigger are stored in two ways. - * 1. In the "trigHash" hash table (part of the sqlite3* that represents the - * database). This allows Trigger structures to be retrieved by name. - * 2. All triggers associated with a single table form a linked list, using the - * pNext member of struct Trigger. A pointer to the first element of the - * linked list is stored as the "pTrigger" member of the associated - * struct Table. - * - * The "step_list" member points to the first element of a linked list - * containing the SQL statements specified as the trigger program. - */ +** Each trigger present in the database schema is stored as an instance of +** struct Trigger. +** +** Pointers to instances of struct Trigger are stored in two ways. +** 1. In the "trigHash" hash table (part of the sqlite3* that represents the +** database). This allows Trigger structures to be retrieved by name. +** 2. All triggers associated with a single table form a linked list, using the +** pNext member of struct Trigger. A pointer to the first element of the +** linked list is stored as the "pTrigger" member of the associated +** struct Table. +** +** The "step_list" member points to the first element of a linked list +** containing the SQL statements specified as the trigger program. +*/ struct Trigger { char *zName; /* The name of the trigger */ char *table; /* The table or view to which the trigger applies */ @@ -19018,43 +19123,48 @@ struct Trigger { #define TRIGGER_AFTER 2 /* - * An instance of struct TriggerStep is used to store a single SQL statement - * that is a part of a trigger-program. - * - * Instances of struct TriggerStep are stored in a singly linked list (linked - * using the "pNext" member) referenced by the "step_list" member of the - * associated struct Trigger instance. The first element of the linked list is - * the first step of the trigger-program. - * - * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or - * "SELECT" statement. The meanings of the other members is determined by the - * value of "op" as follows: - * - * (op == TK_INSERT) - * orconf -> stores the ON CONFLICT algorithm - * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then - * this stores a pointer to the SELECT statement. Otherwise NULL. - * zTarget -> Dequoted name of the table to insert into. - * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then - * this stores values to be inserted. Otherwise NULL. - * pIdList -> If this is an INSERT INTO ... () VALUES ... - * statement, then this stores the column-names to be - * inserted into. - * - * (op == TK_DELETE) - * zTarget -> Dequoted name of the table to delete from. - * pWhere -> The WHERE clause of the DELETE statement if one is specified. - * Otherwise NULL. - * - * (op == TK_UPDATE) - * zTarget -> Dequoted name of the table to update. - * pWhere -> The WHERE clause of the UPDATE statement if one is specified. - * Otherwise NULL. - * pExprList -> A list of the columns to update and the expressions to update - * them to. See sqlite3Update() documentation of "pChanges" - * argument. - * - */ +** An instance of struct TriggerStep is used to store a single SQL statement +** that is a part of a trigger-program. +** +** Instances of struct TriggerStep are stored in a singly linked list (linked +** using the "pNext" member) referenced by the "step_list" member of the +** associated struct Trigger instance. The first element of the linked list is +** the first step of the trigger-program. +** +** The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or +** "SELECT" statement. The meanings of the other members is determined by the +** value of "op" as follows: +** +** (op == TK_INSERT) +** orconf -> stores the ON CONFLICT algorithm +** pSelect -> The content to be inserted - either a SELECT statement or +** a VALUES clause. +** zTarget -> Dequoted name of the table to insert into. +** pIdList -> If this is an INSERT INTO ... () VALUES ... +** statement, then this stores the column-names to be +** inserted into. +** pUpsert -> The ON CONFLICT clauses for an Upsert +** +** (op == TK_DELETE) +** zTarget -> Dequoted name of the table to delete from. +** pWhere -> The WHERE clause of the DELETE statement if one is specified. +** Otherwise NULL. +** +** (op == TK_UPDATE) +** zTarget -> Dequoted name of the table to update. +** pWhere -> The WHERE clause of the UPDATE statement if one is specified. +** Otherwise NULL. +** pExprList -> A list of the columns to update and the expressions to update +** them to. See sqlite3Update() documentation of "pChanges" +** argument. +** +** (op == TK_SELECT) +** pSelect -> The SELECT statement +** +** (op == TK_RETURNING) +** pExprList -> The list of expressions that follow the RETURNING keyword. +** +*/ struct TriggerStep { u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT, ** or TK_RETURNING */ @@ -19409,7 +19519,7 @@ struct Window { Window **ppThis; /* Pointer to this object in Select.pWin list */ Window *pNextWin; /* Next window function belonging to this SELECT */ Expr *pFilter; /* The FILTER expression */ - FuncDef *pFunc; /* The function */ + FuncDef *pWFunc; /* The function */ int iEphCsr; /* Partition buffer or Peer buffer */ int regAccum; /* Accumulator */ int regResult; /* Interim result */ @@ -19664,18 +19774,53 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); #endif #if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView*, const char *zFormat, ...); SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8); SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); +SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView*, const Upsert*, u8); +#if TREETRACE_ENABLED +SQLITE_PRIVATE void sqlite3TreeViewDelete(const With*, const SrcList*, const Expr*, + const ExprList*,const Expr*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewInsert(const With*, const SrcList*, + const IdList*, const Select*, const ExprList*, + int, const Upsert*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewUpdate(const With*, const SrcList*, const ExprList*, + const Expr*, int, const ExprList*, const Expr*, + const Upsert*, const Trigger*); +#endif +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep(TreeView*, const TriggerStep*, u8, u8); +SQLITE_PRIVATE void sqlite3TreeViewTrigger(TreeView*, const Trigger*, u8, u8); +#endif #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8); SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); #endif +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr*); +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList*); +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList*); +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList*); +SQLITE_PRIVATE void sqlite3ShowSelect(const Select*); +SQLITE_PRIVATE void sqlite3ShowWith(const With*); +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert*); +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger*); +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger*); +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window*); +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window*); +#endif #endif - SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); @@ -19824,13 +19969,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2); SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, - Token*, Select*, Expr*, IdList*); + Token*, Select*, OnOrUsing*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, SrcItem *); -SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*); +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse*,SrcList*); SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3*, OnOrUsing*); SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, @@ -20028,7 +20174,8 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc(Parse*, TriggerStep*); SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol); -SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int); +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem*,int); +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int,u32); SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); #ifndef SQLITE_OMIT_AUTHORIZATION @@ -20374,7 +20521,7 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); #if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ && !defined(SQLITE_OMIT_VIRTUALTABLE) -SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info*); +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info*); #endif SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); @@ -21122,9 +21269,6 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_RTREE "ENABLE_RTREE", #endif -#ifdef SQLITE_ENABLE_SELECTTRACE - "ENABLE_SELECTTRACE", -#endif #ifdef SQLITE_ENABLE_SESSION "ENABLE_SESSION", #endif @@ -21146,6 +21290,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_STMT_SCANSTATUS "ENABLE_STMT_SCANSTATUS", #endif +#ifdef SQLITE_ENABLE_TREETRACE + "ENABLE_TREETRACE", +#endif #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION "ENABLE_UNKNOWN_SQL_FUNCTION", #endif @@ -21895,6 +22042,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ +#ifdef SQLITE_DEBUG + {0,0,0,0,0,0} /* aTune */ +#endif }; /* @@ -21949,7 +22099,7 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; /* ** Tracing flags set by SQLITE_TESTCTRL_TRACEFLAGS. */ -SQLITE_PRIVATE u32 sqlite3SelectTrace = 0; +SQLITE_PRIVATE u32 sqlite3TreeTrace = 0; SQLITE_PRIVATE u32 sqlite3WhereTrace = 0; /* #include "opcodes.h" */ @@ -22116,7 +22266,7 @@ struct VdbeCursor { Bool isEphemeral:1; /* True for an ephemeral table */ Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ - Bool hasBeenDuped:1; /* This cursor was source or target of OP_OpenDup */ + Bool noReuse:1; /* OpenEphemeral may not reuse this cursor */ u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */ union { /* pBtx for isEphermeral. pAltMap otherwise */ Btree *pBtx; /* Separate file holding temporary table */ @@ -22164,6 +22314,11 @@ struct VdbeCursor { u32 aType[1]; /* Type values record decode. MUST BE LAST */ }; +/* Return true if P is a null-only cursor +*/ +#define IsNullCursor(P) \ + ((P)->eCurType==CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult==0) + /* ** A value for VdbeCursor.cacheStatus that means the cache is always invalid. @@ -22238,16 +22393,16 @@ struct sqlite3_value { const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */ FuncDef *pDef; /* Used only when flags==MEM_Agg */ } u; + char *z; /* String or BLOB value */ + int n; /* Number of characters in string value, excluding '\0' */ u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ u8 eSubtype; /* Subtype for this value */ - int n; /* Number of characters in string value, excluding '\0' */ - char *z; /* String or BLOB value */ /* ShallowCopy only needs to copy the information above */ - char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ + sqlite3 *db; /* The associated database connection */ int szMalloc; /* Size of the zMalloc allocation */ u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */ - sqlite3 *db; /* The associated database connection */ + char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */ #ifdef SQLITE_DEBUG Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ @@ -22259,11 +22414,43 @@ struct sqlite3_value { ** Size of struct Mem not including the Mem.zMalloc member or anything that ** follows. */ -#define MEMCELLSIZE offsetof(Mem,zMalloc) +#define MEMCELLSIZE offsetof(Mem,db) -/* One or more of the following flags are set to indicate the validOK +/* One or more of the following flags are set to indicate the ** representations of the value stored in the Mem struct. ** +** * MEM_Null An SQL NULL value +** +** * MEM_Null|MEM_Zero An SQL NULL with the virtual table +** UPDATE no-change flag set +** +** * MEM_Null|MEM_Term| An SQL NULL, but also contains a +** MEM_Subtype pointer accessible using +** sqlite3_value_pointer(). +** +** * MEM_Null|MEM_Cleared Special SQL NULL that compares non-equal +** to other NULLs even using the IS operator. +** +** * MEM_Str A string, stored in Mem.z with +** length Mem.n. Zero-terminated if +** MEM_Term is set. This flag is +** incompatible with MEM_Blob and +** MEM_Null, but can appear with MEM_Int, +** MEM_Real, and MEM_IntReal. +** +** * MEM_Blob A blob, stored in Mem.z length Mem.n. +** Incompatible with MEM_Str, MEM_Null, +** MEM_Int, MEM_Real, and MEM_IntReal. +** +** * MEM_Blob|MEM_Zero A blob in Mem.z of length Mem.n plus +** MEM.u.i extra 0x00 bytes at the end. +** +** * MEM_Int Integer stored in Mem.u.i. +** +** * MEM_Real Real stored in Mem.u.r. +** +** * MEM_IntReal Real stored as an integer in Mem.u.i. +** ** If the MEM_Null flag is set, then the value is an SQL NULL value. ** For a pointer type created using sqlite3_bind_pointer() or ** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set. @@ -22274,6 +22461,7 @@ struct sqlite3_value { ** set, then the string is nul terminated. The MEM_Int and MEM_Real ** flags may coexist with the MEM_Str flag. */ +#define MEM_Undefined 0x0000 /* Value is undefined */ #define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ #define MEM_Str 0x0002 /* Value is a string */ #define MEM_Int 0x0004 /* Value is an integer */ @@ -22281,28 +22469,24 @@ struct sqlite3_value { #define MEM_Blob 0x0010 /* Value is a BLOB */ #define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */ #define MEM_AffMask 0x003f /* Mask of affinity bits */ + +/* Extra bits that modify the meanings of the core datatypes above +*/ #define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ -#define MEM_Undefined 0x0080 /* Value is undefined */ + /* 0x0080 // Available */ #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ -#define MEM_TypeMask 0xc1bf /* Mask of type bits */ - +#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ +#define MEM_Zero 0x0400 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x0800 /* Mem.eSubtype is valid */ +#define MEM_TypeMask 0x0dbf /* Mask of type bits */ -/* Whenever Mem contains a valid string or blob representation, one of -** the following flags must be set to determine the memory management -** policy for Mem.z. The MEM_Term flag tells us whether or not the -** string is \000 or \u0000 terminated +/* Bits that determine the storage for Mem.z for a string or blob or +** aggregate accumulator. */ -#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ -#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ -#define MEM_Static 0x0800 /* Mem.z points to a static string */ -#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ -#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ -#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */ -#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */ -#ifdef SQLITE_OMIT_INCRBLOB - #undef MEM_Zero - #define MEM_Zero 0x0000 -#endif +#define MEM_Dyn 0x1000 /* Need to call Mem.xDel() on Mem.z */ +#define MEM_Static 0x2000 /* Mem.z points to a static string */ +#define MEM_Ephem 0x4000 /* Mem.z points to an ephemeral string */ +#define MEM_Agg 0x8000 /* Mem.z points to an agg function context */ /* Return TRUE if Mem X contains dynamically allocated content - anything ** that needs to be deallocated to avoid a leak. @@ -22324,11 +22508,15 @@ struct sqlite3_value { && (X)->n==0 && (X)->u.nZero==0) /* -** Return true if a memory cell is not marked as invalid. This macro +** Return true if a memory cell has been initialized and is valid. ** is for use inside assert() statements only. +** +** A Memory cell is initialized if at least one of the +** MEM_Null, MEM_Str, MEM_Int, MEM_Real, MEM_Blob, or MEM_IntReal bits +** is set. It is "undefined" if all those bits are zero. */ #ifdef SQLITE_DEBUG -#define memIsValid(M) ((M)->flags & MEM_Undefined)==0 +#define memIsValid(M) ((M)->flags & MEM_AffMask)!=0 #endif /* @@ -22366,6 +22554,7 @@ struct sqlite3_context { Vdbe *pVdbe; /* The VM that owns this context */ int iOp; /* Instruction number of OP_Function */ int isError; /* Error code returned by the function. */ + u8 enc; /* Encoding to use for results */ u8 skipFlag; /* Skip accumulator loading if true */ u8 argc; /* Number of arguments */ sqlite3_value *argv[1]; /* Argument set */ @@ -22414,7 +22603,6 @@ struct Vdbe { Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ Parse *pParse; /* Parsing context used to create this Vdbe */ ynVar nVar; /* Number of entries in aVar[] */ - u32 iVdbeMagic; /* Magic number defining state of the SQL statement */ int nMem; /* Number of memory locations currently allocated */ int nCursor; /* Number of slots in apCsr[] */ u32 cacheCtr; /* VdbeCursor row cache generation counter */ @@ -22452,11 +22640,10 @@ struct Vdbe { u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ - u8 doingRerun; /* True if rerunning after an auto-reprepare */ + u8 eVdbeState; /* On of the VDBE_*_STATE values */ bft expired:2; /* 1: recompile VM immediately 2: when convenient */ bft explain:2; /* True if EXPLAIN present on SQL command */ bft changeCntOn:1; /* True to update the change-counter */ - bft runOnlyOnce:1; /* Automatically expire on reset */ bft usesStmtJournal:1; /* True if uses a statement journal */ bft readOnly:1; /* True for statements that do not write */ bft bIsReader:1; /* True for statements that read */ @@ -22483,13 +22670,12 @@ struct Vdbe { }; /* -** The following are allowed values for Vdbe.magic +** The following are allowed values for Vdbe.eVdbeState */ -#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */ -#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */ -#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */ -#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */ -#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ +#define VDBE_INIT_STATE 0 /* Prepared statement under construction */ +#define VDBE_READY_STATE 1 /* Ready to run but not yet started */ +#define VDBE_RUN_STATE 2 /* Run in progress */ +#define VDBE_HALT_STATE 3 /* Finished. Need reset() or finalize() */ /* ** Structure used to store the context required by the @@ -22530,18 +22716,31 @@ struct ValueList { sqlite3_value *pOut; /* Register to hold each decoded output value */ }; +/* Size of content associated with serial types that fit into a +** single-byte varint. +*/ +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[]; +#endif + /* ** Function prototypes */ SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe*,VdbeCursor*); void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p); SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, u32*); SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); -SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in); +# define swapMixedEndianFloat(X) X = sqlite3FloatSwap(X) +#else +# define swapMixedEndianFloat(X) +#endif SQLITE_PRIVATE void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); @@ -22599,6 +22798,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem*p); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); @@ -23001,8 +23201,7 @@ SQLITE_API int sqlite3_db_status( db->pnBytesFreed = &nByte; for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ - sqlite3VdbeClearObject(db, pVdbe); - sqlite3DbFree(db, pVdbe); + sqlite3VdbeDelete(pVdbe); } db->pnBytesFreed = 0; @@ -26957,8 +27156,13 @@ static void *memsys5Realloc(void *pPrior, int nBytes){ */ static int memsys5Roundup(int n){ int iFullSz; - if( n > 0x40000000 ) return 0; - for(iFullSz=mem5.szAtom; iFullSz0x40000000 ) return 0; + for(iFullSz=mem5.szAtom*8; iFullSz=n ) return iFullSz/2; return iFullSz; } @@ -29365,8 +29569,13 @@ SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){ } DisableLookaside; if( db->pParse ){ + Parse *pParse; sqlite3ErrorMsg(db->pParse, "out of memory"); db->pParse->rc = SQLITE_NOMEM_BKPT; + for(pParse=db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse){ + pParse->nErr++; + pParse->rc = SQLITE_NOMEM; + } } } return 0; @@ -30232,8 +30441,8 @@ SQLITE_API void sqlite3_str_vappendf( case etSQLESCAPE: /* %q: Escape ' characters */ case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */ case etSQLESCAPE3: { /* %w: Escape " characters */ - int i, j, k, n, isnull; - int needQuote; + i64 i, j, k, n; + int needQuote, isnull; char ch; char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ char *escarg; @@ -30313,8 +30522,14 @@ SQLITE_API void sqlite3_str_vappendf( sqlite3_str_appendall(pAccum, pItem->zName); }else if( pItem->zAlias ){ sqlite3_str_appendall(pAccum, pItem->zAlias); - }else if( ALWAYS(pItem->pSelect) ){ - sqlite3_str_appendf(pAccum, "SUBQUERY %u", pItem->pSelect->selId); + }else{ + Select *pSel = pItem->pSelect; + assert( pSel!=0 ); + if( pSel->selFlags & SF_NestedFrom ){ + sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId); + }else{ + sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId); + } } length = width = 0; break; @@ -30377,7 +30592,9 @@ SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ ** as the error offset. */ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ - while( pExpr && (ExprHasProperty(pExpr,EP_FromJoin) || pExpr->w.iOfst<=0) ){ + while( pExpr + && (ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) || pExpr->w.iOfst<=0) + ){ pExpr = pExpr->pLeft; } if( pExpr==0 ) return; @@ -30837,40 +31054,44 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ ** Add a new subitem to the tree. The moreToFollow flag indicates that this ** is not the last item in the tree. */ -static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ +static void sqlite3TreeViewPush(TreeView **pp, u8 moreToFollow){ + TreeView *p = *pp; if( p==0 ){ - p = sqlite3_malloc64( sizeof(*p) ); - if( p==0 ) return 0; + *pp = p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return; memset(p, 0, sizeof(*p)); }else{ p->iLevel++; } assert( moreToFollow==0 || moreToFollow==1 ); - if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; - return p; + if( p->iLevel<(int)sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow; } /* ** Finished with one layer of the tree */ -static void sqlite3TreeViewPop(TreeView *p){ +static void sqlite3TreeViewPop(TreeView **pp){ + TreeView *p = *pp; if( p==0 ) return; p->iLevel--; - if( p->iLevel<0 ) sqlite3_free(p); + if( p->iLevel<0 ){ + sqlite3_free(p); + *pp = 0; + } } /* ** Generate a single line of output for the tree, with a prefix that contains ** all the appropriate tree lines */ -static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_list ap; int i; StrAccum acc; - char zBuf[500]; + char zBuf[1000]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); if( p ){ - for(i=0; iiLevel && ibLine)-1; i++){ + for(i=0; iiLevel && i<(int)sizeof(p->bLine)-1; i++){ sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4); } sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); @@ -30891,10 +31112,57 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ ** Shorthand for starting a new tree item that consists of a single label */ static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ - p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewPush(&p, moreFollows); sqlite3TreeViewLine(p, "%s", zLabel); } +/* +** Show a list of Column objects in tree format. +*/ +SQLITE_PRIVATE void sqlite3TreeViewColumnList( + TreeView *pView, + const Column *aCol, + int nCol, + u8 moreToFollow +){ + int i; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, "COLUMNS"); + for(i=0; inCte>0 ){ - pView = sqlite3TreeViewPush(pView, 1); + sqlite3TreeViewPush(&pView, moreToFollow); for(i=0; inCte; i++){ StrAccum x; char zLine[1000]; @@ -30924,6 +31192,10 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m } sqlite3_str_appendf(&x, ")"); } + if( pCte->eM10d!=M10d_Any ){ + sqlite3_str_appendf(&x, " %sMATERIALIZED", + pCte->eM10d==M10d_No ? "NOT " : ""); + } if( pCte->pUse ){ sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse, pCte->pUse->nUse); @@ -30931,9 +31203,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inCte-1); sqlite3TreeViewSelect(pView, pCte->pSelect, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } @@ -30942,10 +31214,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m */ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ int i; + if( pSrc==0 ) return; for(i=0; inSrc; i++){ const SrcItem *pItem = &pSrc->a[i]; StrAccum x; - char zLine[100]; + int n = 0; + char zLine[1000]; sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); x.printfFlags |= SQLITE_PRINTF_INTERNAL; sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); @@ -30953,26 +31227,48 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); } - if( pItem->fg.jointype & JT_LEFT ){ + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==(JT_LEFT|JT_RIGHT) ){ + sqlite3_str_appendf(&x, " FULL-OUTER-JOIN"); + }else if( pItem->fg.jointype & JT_LEFT ){ sqlite3_str_appendf(&x, " LEFT-JOIN"); + }else if( pItem->fg.jointype & JT_RIGHT ){ + sqlite3_str_appendf(&x, " RIGHT-JOIN"); }else if( pItem->fg.jointype & JT_CROSS ){ sqlite3_str_appendf(&x, " CROSS-JOIN"); } + if( pItem->fg.jointype & JT_LTORJ ){ + sqlite3_str_appendf(&x, " LTORJ"); + } if( pItem->fg.fromDDL ){ sqlite3_str_appendf(&x, " DDL"); } if( pItem->fg.isCte ){ sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); } + if( pItem->fg.isOn || (pItem->fg.isUsing==0 && pItem->u3.pOn!=0) ){ + sqlite3_str_appendf(&x, " ON"); + } sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inSrc-1); + n = 0; + if( pItem->pSelect ) n++; + if( pItem->fg.isTabFunc ) n++; + if( pItem->fg.isUsing ) n++; + if( pItem->fg.isUsing ){ + sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); + } if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + if( pItem->pTab ){ + Table *pTab = pItem->pTab; + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); + } + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); } if( pItem->fg.isTabFunc ){ sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } @@ -30986,11 +31282,11 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m sqlite3TreeViewLine(pView, "nil-SELECT"); return; } - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); if( p->pWith ){ sqlite3TreeViewWith(pView, p->pWith, 1); cnt = 1; - sqlite3TreeViewPush(pView, 1); + sqlite3TreeViewPush(&pView, 1); } do{ if( p->selFlags & SF_WhereBegin ){ @@ -31004,7 +31300,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m (int)p->nSelectRow ); } - if( cnt++ ) sqlite3TreeViewPop(pView); + if( cnt++ ) sqlite3TreeViewPop(&pView); if( p->pPrior ){ n = 1000; }else{ @@ -31027,24 +31323,24 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWin ){ Window *pX; - pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewPush(&pView, (n--)>0); sqlite3TreeViewLine(pView, "window-functions"); for(pX=p->pWin; pX; pX=pX->pNextWin){ sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif if( p->pSrc && p->pSrc->nSrc ){ - pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewPush(&pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); sqlite3TreeViewSrcList(pView, p->pSrc); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pWhere ){ sqlite3TreeViewItem(pView, "WHERE", (n--)>0); sqlite3TreeViewExpr(pView, p->pWhere, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pGroupBy ){ sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); @@ -31052,7 +31348,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p->pHaving ){ sqlite3TreeViewItem(pView, "HAVING", (n--)>0); sqlite3TreeViewExpr(pView, p->pHaving, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWinDefn ){ @@ -31061,7 +31357,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m for(pX=p->pWinDefn; pX; pX=pX->pNextWin){ sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif if( p->pOrderBy ){ @@ -31073,9 +31369,9 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p->pLimit->pRight ){ sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pPrior ){ const char *zOp = "UNION"; @@ -31088,7 +31384,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m } p = p->pPrior; }while( p!=0 ); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #ifndef SQLITE_OMIT_WINDOWFUNC @@ -31104,24 +31400,24 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( switch( eBound ){ case TK_UNBOUNDED: { sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_CURRENT: { sqlite3TreeViewItem(pView, "CURRENT", moreToFollow); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_PRECEDING: { sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow); sqlite3TreeViewExpr(pView, pExpr, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_FOLLOWING: { sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow); sqlite3TreeViewExpr(pView, pExpr, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } } @@ -31134,12 +31430,13 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( */ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ int nElement = 0; + if( pWin==0 ) return; if( pWin->pFilter ){ sqlite3TreeViewItem(pView, "FILTER", 1); sqlite3TreeViewExpr(pView, pWin->pFilter, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - pView = sqlite3TreeViewPush(pView, more); + sqlite3TreeViewPush(&pView, more); if( pWin->zName ){ sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); }else{ @@ -31150,9 +31447,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u if( pWin->eFrmType ) nElement++; if( pWin->eExclude ) nElement++; if( pWin->zBase ){ - sqlite3TreeViewPush(pView, (--nElement)>0); + sqlite3TreeViewPush(&pView, (--nElement)>0); sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( pWin->pPartition ){ sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); @@ -31170,7 +31467,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( pWin->eExclude ){ char zBuf[30]; @@ -31185,11 +31482,11 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u zExclude = zBuf; break; } - sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewPush(&pView, 0); sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -31198,11 +31495,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u ** Generate a human-readable explanation for a Window Function object */ SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){ - pView = sqlite3TreeViewPush(pView, more); + if( pWin==0 ) return; + sqlite3TreeViewPush(&pView, more); sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", - pWin->pFunc->zName, pWin->pFunc->nArg); + pWin->pWFunc->zName, pWin->pWFunc->nArg); sqlite3TreeViewWindow(pView, pWin, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -31213,10 +31511,10 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m const char *zBinOp = 0; /* Binary operator */ const char *zUniOp = 0; /* Unary operator */ char zFlgs[200]; - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); if( pExpr==0 ){ sqlite3TreeViewLine(pView, "nil"); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); return; } if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ @@ -31224,8 +31522,11 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); sqlite3_str_appendf(&x, " fg.af=%x.%c", pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_str_appendf(&x, " iRJT=%d", pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + sqlite3_str_appendf(&x, " outer.iJoin=%d", pExpr->w.iJoin); + } + if( ExprHasProperty(pExpr, EP_InnerON) ){ + sqlite3_str_appendf(&x, " inner.iJoin=%d", pExpr->w.iJoin); } if( ExprHasProperty(pExpr, EP_FromDDL) ){ sqlite3_str_appendf(&x, " DDL"); @@ -31449,7 +31750,17 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m break; } case TK_IN: { - sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); + sqlite3_str *pStr = sqlite3_str_new(0); + char *z; + sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags); + if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable); + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3_str_appendf(pStr, " subrtn(%d,%d)", + pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + } + z = sqlite3_str_finish(pStr); + sqlite3TreeViewLine(pView, z); + sqlite3_free(z); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); if( ExprUseXSelect(pExpr) ){ sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); @@ -31573,7 +31884,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } @@ -31595,13 +31906,25 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( int j = pList->a[i].u.x.iOrderByCol; char *zName = pList->a[i].zEName; int moreToFollow = inExpr - 1; - if( pList->a[i].eEName!=ENAME_NAME ) zName = 0; if( j || zName ){ - sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); moreToFollow = 0; sqlite3TreeViewLine(pView, 0); if( zName ){ - fprintf(stdout, "AS %s ", zName); + switch( pList->a[i].fg.eEName ){ + default: + fprintf(stdout, "AS %s ", zName); + break; + case ENAME_TAB: + fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName); + if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) "); + if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) "); + if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) "); + break; + case ENAME_SPAN: + fprintf(stdout, "SPAN(\"%s\") ", zName); + break; + } } if( j ){ fprintf(stdout, "iOrderByCol=%d", j); @@ -31611,7 +31934,7 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( } sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); if( j || zName ){ - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } } @@ -31622,10 +31945,377 @@ SQLITE_PRIVATE void sqlite3TreeViewExprList( u8 moreToFollow, const char *zLabel ){ - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewBareExprList(pView, pList, zLabel); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); +} + +/* +** Generate a human-readable explanation of an id-list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareIdList( + TreeView *pView, + const IdList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inId; i++){ + char *zName = pList->a[i].zName; + int moreToFollow = inId - 1; + if( zName==0 ) zName = "(null)"; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, 0); + if( pList->eU4==EU4_NONE ){ + fprintf(stdout, "%s\n", zName); + }else if( pList->eU4==EU4_IDX ){ + fprintf(stdout, "%s (%d)\n", zName, pList->a[i].u4.idx); + }else{ + assert( pList->eU4==EU4_EXPR ); + if( pList->a[i].u4.pExpr==0 ){ + fprintf(stdout, "%s (pExpr=NULL)\n", zName); + }else{ + fprintf(stdout, "%s\n", zName); + sqlite3TreeViewPush(&pView, inId-1); + sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0); + sqlite3TreeViewPop(&pView); + } + } + sqlite3TreeViewPop(&pView); + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewIdList( + TreeView *pView, + const IdList *pList, + u8 moreToFollow, + const char *zLabel +){ + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewBareIdList(pView, pList, zLabel); + sqlite3TreeViewPop(&pView); +} + +/* +** Generate a human-readable explanation of a list of Upsert objects +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpsert( + TreeView *pView, + const Upsert *pUpsert, + u8 moreToFollow +){ + if( pUpsert==0 ) return; + sqlite3TreeViewPush(&pView, moreToFollow); + while( pUpsert ){ + int n; + sqlite3TreeViewPush(&pView, pUpsert->pNextUpsert!=0 || moreToFollow); + sqlite3TreeViewLine(pView, "ON CONFLICT DO %s", + pUpsert->isDoUpdate ? "UPDATE" : "NOTHING"); + n = (pUpsert->pUpsertSet!=0) + (pUpsert->pUpsertWhere!=0); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertTarget, (n--)>0, "TARGET"); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertSet, (n--)>0, "SET"); + if( pUpsert->pUpsertWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, pUpsert->pUpsertWhere, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); + pUpsert = pUpsert->pNextUpsert; + } + sqlite3TreeViewPop(&pView); +} + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an DELETE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewDelete( + const With *pWith, + const SrcList *pTabList, + const Expr *pWhere, + const ExprList *pOrderBy, + const Expr *pLimit, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, "DELETE"); + if( pWith ) n++; + if( pTabList ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an INSERT statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewInsert( + const With *pWith, + const SrcList *pTabList, + const IdList *pColumnList, + const Select *pSelect, + const ExprList *pExprList, + int onError, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + TreeView *pView = 0; + int n = 0; + const char *zLabel = "INSERT"; + switch( onError ){ + case OE_Replace: zLabel = "REPLACE"; break; + case OE_Ignore: zLabel = "INSERT OR IGNORE"; break; + case OE_Rollback: zLabel = "INSERT OR ROLLBACK"; break; + case OE_Abort: zLabel = "INSERT OR ABORT"; break; + case OE_Fail: zLabel = "INSERT OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pColumnList ) n++; + if( pSelect ) n++; + if( pExprList ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "INTO"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pColumnList ){ + sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS"); + } + if( pSelect ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "DATA-SOURCE"); + sqlite3TreeViewSelect(pView, pSelect, 0); + sqlite3TreeViewPop(&pView); + } + if( pExprList ){ + sqlite3TreeViewExprList(pView, pExprList, (--n)>0, "VALUES"); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an UPDATE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpdate( + const With *pWith, + const SrcList *pTabList, + const ExprList *pChanges, + const Expr *pWhere, + int onError, + const ExprList *pOrderBy, + const Expr *pLimit, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + const char *zLabel = "UPDATE"; + switch( onError ){ + case OE_Replace: zLabel = "UPDATE OR REPLACE"; break; + case OE_Ignore: zLabel = "UPDATE OR IGNORE"; break; + case OE_Rollback: zLabel = "UPDATE OR ROLLBACK"; break; + case OE_Abort: zLabel = "UPDATE OR ABORT"; break; + case OE_Fail: zLabel = "UPDATE OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pChanges ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pChanges ){ + sqlite3TreeViewExprList(pView, pChanges, (--n)>0, "SET"); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#ifndef SQLITE_OMIT_TRIGGER +/* +** Show a human-readable graph of a TriggerStep +*/ +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep( + TreeView *pView, + const TriggerStep *pStep, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pStep==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pStep->pNext!=0)); + do{ + if( cnt++ && pStep->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "%s", pStep->zSpan ? pStep->zSpan : "RETURNING"); + }while( showFullList && (pStep = pStep->pNext)!=0 ); + sqlite3TreeViewPop(&pView); +} + +/* +** Show a human-readable graph of a Trigger +*/ +SQLITE_PRIVATE void sqlite3TreeViewTrigger( + TreeView *pView, + const Trigger *pTrigger, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pTrigger==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pTrigger->pNext!=0)); + do{ + if( cnt++ && pTrigger->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "TRIGGER %s", pTrigger->zName); + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewTriggerStep(pView, pTrigger->step_list, 0, 1); + sqlite3TreeViewPop(&pView); + }while( showFullList && (pTrigger = pTrigger->pNext)!=0 ); + sqlite3TreeViewPop(&pView); } +#endif /* SQLITE_OMIT_TRIGGER */ + + +/* +** These simplified versions of the tree-view routines omit unnecessary +** parameters. These variants are intended to be used from a symbolic +** debugger, such as "gdb", during interactive debugging sessions. +** +** This routines are given external linkage so that they will always be +** accessible to the debugging, and to avoid warnings about unused +** functions. But these routines only exist in debugging builds, so they +** do not contaminate the interface. +*/ +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr *p){ sqlite3TreeViewExpr(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList *p){ sqlite3TreeViewExprList(0,p,0,0);} +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList *p){ sqlite3TreeViewIdList(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList *p){ sqlite3TreeViewSrcList(0,p); } +SQLITE_PRIVATE void sqlite3ShowSelect(const Select *p){ sqlite3TreeViewSelect(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWith(const With *p){ sqlite3TreeViewWith(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert *p){ sqlite3TreeViewUpsert(0,p,0); } +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,0); +} +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,1); +} +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,1);} +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window *p){ sqlite3TreeViewWindow(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window *p){ sqlite3TreeViewWinFunc(0,p,0); } +#endif #endif /* SQLITE_DEBUG */ @@ -32780,7 +33470,7 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ va_list ap; sqlite3 *db = pParse->db; assert( db!=0 ); - assert( db->pParse==pParse ); + assert( db->pParse==pParse || db->pParse->pToplevel==pParse ); db->errByteOffset = -2; va_start(ap, zFormat); zMsg = sqlite3VMPrintf(db, zFormat, ap); @@ -34593,42 +35283,42 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 0 */ "Savepoint" OpHelp(""), /* 1 */ "AutoCommit" OpHelp(""), /* 2 */ "Transaction" OpHelp(""), - /* 3 */ "SorterNext" OpHelp(""), - /* 4 */ "Prev" OpHelp(""), - /* 5 */ "Next" OpHelp(""), - /* 6 */ "Checkpoint" OpHelp(""), - /* 7 */ "JournalMode" OpHelp(""), - /* 8 */ "Vacuum" OpHelp(""), - /* 9 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), - /* 10 */ "VUpdate" OpHelp("data=r[P3@P2]"), - /* 11 */ "Goto" OpHelp(""), - /* 12 */ "Gosub" OpHelp(""), - /* 13 */ "InitCoroutine" OpHelp(""), - /* 14 */ "Yield" OpHelp(""), - /* 15 */ "MustBeInt" OpHelp(""), - /* 16 */ "Jump" OpHelp(""), - /* 17 */ "Once" OpHelp(""), - /* 18 */ "If" OpHelp(""), + /* 3 */ "Checkpoint" OpHelp(""), + /* 4 */ "JournalMode" OpHelp(""), + /* 5 */ "Vacuum" OpHelp(""), + /* 6 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 7 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 8 */ "Goto" OpHelp(""), + /* 9 */ "Gosub" OpHelp(""), + /* 10 */ "InitCoroutine" OpHelp(""), + /* 11 */ "Yield" OpHelp(""), + /* 12 */ "MustBeInt" OpHelp(""), + /* 13 */ "Jump" OpHelp(""), + /* 14 */ "Once" OpHelp(""), + /* 15 */ "If" OpHelp(""), + /* 16 */ "IfNot" OpHelp(""), + /* 17 */ "IsNullOrType" OpHelp("if typeof(r[P1]) IN (P3,5) goto P2"), + /* 18 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), - /* 20 */ "IfNot" OpHelp(""), - /* 21 */ "IsNullOrType" OpHelp("if typeof(r[P1]) IN (P3,5) goto P2"), - /* 22 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), - /* 23 */ "SeekLT" OpHelp("key=r[P3@P4]"), - /* 24 */ "SeekLE" OpHelp("key=r[P3@P4]"), - /* 25 */ "SeekGE" OpHelp("key=r[P3@P4]"), - /* 26 */ "SeekGT" OpHelp("key=r[P3@P4]"), - /* 27 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), - /* 28 */ "IfNoHope" OpHelp("key=r[P3@P4]"), - /* 29 */ "NoConflict" OpHelp("key=r[P3@P4]"), - /* 30 */ "NotFound" OpHelp("key=r[P3@P4]"), - /* 31 */ "Found" OpHelp("key=r[P3@P4]"), - /* 32 */ "SeekRowid" OpHelp("intkey=r[P3]"), - /* 33 */ "NotExists" OpHelp("intkey=r[P3]"), - /* 34 */ "Last" OpHelp(""), - /* 35 */ "IfSmaller" OpHelp(""), - /* 36 */ "SorterSort" OpHelp(""), - /* 37 */ "Sort" OpHelp(""), - /* 38 */ "Rewind" OpHelp(""), + /* 20 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 21 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 22 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 23 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 24 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), + /* 25 */ "IfNoHope" OpHelp("key=r[P3@P4]"), + /* 26 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 27 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 28 */ "Found" OpHelp("key=r[P3@P4]"), + /* 29 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 30 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 31 */ "Last" OpHelp(""), + /* 32 */ "IfSmaller" OpHelp(""), + /* 33 */ "SorterSort" OpHelp(""), + /* 34 */ "Sort" OpHelp(""), + /* 35 */ "Rewind" OpHelp(""), + /* 36 */ "SorterNext" OpHelp(""), + /* 37 */ "Prev" OpHelp(""), + /* 38 */ "Next" OpHelp(""), /* 39 */ "IdxLE" OpHelp("key=r[P3@P4]"), /* 40 */ "IdxGT" OpHelp("key=r[P3@P4]"), /* 41 */ "IdxLT" OpHelp("key=r[P3@P4]"), @@ -34664,34 +35354,34 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 71 */ "Integer" OpHelp("r[P2]=P1"), /* 72 */ "Int64" OpHelp("r[P2]=P4"), /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 74 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 75 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 76 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 77 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 78 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 79 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 80 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 81 */ "IntCopy" OpHelp("r[P2]=r[P1]"), - /* 82 */ "FkCheck" OpHelp(""), - /* 83 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 84 */ "CollSeq" OpHelp(""), - /* 85 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 86 */ "RealAffinity" OpHelp(""), - /* 87 */ "Cast" OpHelp("affinity(r[P1])"), - /* 88 */ "Permutation" OpHelp(""), - /* 89 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 90 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), - /* 91 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), - /* 92 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), - /* 93 */ "Column" OpHelp("r[P3]=PX"), - /* 94 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), - /* 95 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 96 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 97 */ "Count" OpHelp("r[P2]=count()"), - /* 98 */ "ReadCookie" OpHelp(""), - /* 99 */ "SetCookie" OpHelp(""), - /* 100 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 101 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 74 */ "BeginSubrtn" OpHelp("r[P2]=NULL"), + /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 82 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 83 */ "FkCheck" OpHelp(""), + /* 84 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 85 */ "CollSeq" OpHelp(""), + /* 86 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 87 */ "RealAffinity" OpHelp(""), + /* 88 */ "Cast" OpHelp("affinity(r[P1])"), + /* 89 */ "Permutation" OpHelp(""), + /* 90 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 91 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 92 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), + /* 93 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 94 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"), + /* 95 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), + /* 96 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 97 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 98 */ "Count" OpHelp("r[P2]=count()"), + /* 99 */ "ReadCookie" OpHelp(""), + /* 100 */ "SetCookie" OpHelp(""), + /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), /* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), /* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), /* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 160 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 161 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 162 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 163 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 164 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 165 */ "Expire" OpHelp(""), - /* 166 */ "CursorLock" OpHelp(""), - /* 167 */ "CursorUnlock" OpHelp(""), - /* 168 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 169 */ "VBegin" OpHelp(""), - /* 170 */ "VCreate" OpHelp(""), - /* 171 */ "VDestroy" OpHelp(""), - /* 172 */ "VOpen" OpHelp(""), - /* 173 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), - /* 174 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 175 */ "VRename" OpHelp(""), - /* 176 */ "Pagecount" OpHelp(""), - /* 177 */ "MaxPgcnt" OpHelp(""), - /* 178 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), - /* 179 */ "Trace" OpHelp(""), - /* 180 */ "CursorHint" OpHelp(""), - /* 181 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), - /* 182 */ "Noop" OpHelp(""), - /* 183 */ "Explain" OpHelp(""), - /* 184 */ "Abortable" OpHelp(""), + /* 154 */ "DropTrigger" OpHelp(""), + /* 155 */ "IntegrityCk" OpHelp(""), + /* 156 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 157 */ "Param" OpHelp(""), + /* 158 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 159 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 160 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 161 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 162 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 163 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 164 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 165 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 166 */ "Expire" OpHelp(""), + /* 167 */ "CursorLock" OpHelp(""), + /* 168 */ "CursorUnlock" OpHelp(""), + /* 169 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 170 */ "VBegin" OpHelp(""), + /* 171 */ "VCreate" OpHelp(""), + /* 172 */ "VDestroy" OpHelp(""), + /* 173 */ "VOpen" OpHelp(""), + /* 174 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 175 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 176 */ "VRename" OpHelp(""), + /* 177 */ "Pagecount" OpHelp(""), + /* 178 */ "MaxPgcnt" OpHelp(""), + /* 179 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), + /* 180 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 181 */ "Trace" OpHelp(""), + /* 182 */ "CursorHint" OpHelp(""), + /* 183 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 184 */ "Noop" OpHelp(""), + /* 185 */ "Explain" OpHelp(""), + /* 186 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -40639,6 +41331,7 @@ static const char *unixTempFileDir(void){ static int unixGetTempname(int nBuf, char *zBuf){ const char *zDir; int iLimit = 0; + int rc = SQLITE_OK; /* It's odd to simulate an io-error here, but really this is just ** using the io-error infrastructure to test that SQLite handles this @@ -40647,18 +41340,26 @@ static int unixGetTempname(int nBuf, char *zBuf){ zBuf[0] = 0; SimulateIOError( return SQLITE_IOERR ); + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); zDir = unixTempFileDir(); - if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; - do{ - u64 r; - sqlite3_randomness(sizeof(r), &r); - assert( nBuf>2 ); - zBuf[nBuf-2] = 0; - sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", - zDir, r, 0); - if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; - }while( osAccess(zBuf,0)==0 ); - return SQLITE_OK; + if( zDir==0 ){ + rc = SQLITE_IOERR_GETTEMPPATH; + }else{ + do{ + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ){ + rc = SQLITE_ERROR; + break; + } + }while( osAccess(zBuf,0)==0 ); + } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return rc; } #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) @@ -40801,20 +41502,23 @@ static int findCreateFileMode( ** ** where NN is a decimal number. The NN naming schemes are ** used by the test_multiplex.c module. + ** + ** In normal operation, the journal file name will always contain + ** a '-' character. However in 8+3 filename mode, or if a corrupt + ** rollback journal specifies a super-journal with a goofy name, then + ** the '-' might be missing or the '-' might be the first character in + ** the filename. In that case, just return SQLITE_OK with *pMode==0. */ nDb = sqlite3Strlen30(zPath) - 1; - while( zPath[nDb]!='-' ){ - /* In normal operation, the journal file name will always contain - ** a '-' character. However in 8+3 filename mode, or if a corrupt - ** rollback journal specifies a super-journal with a goofy name, then - ** the '-' might be missing. */ - if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; + while( nDb>0 && zPath[nDb]!='.' ){ + if( zPath[nDb]=='-' ){ + memcpy(zDb, zPath, nDb); + zDb[nDb] = '\0'; + rc = getFileMode(zDb, pMode, pUid, pGid); + break; + } nDb--; } - memcpy(zDb, zPath, nDb); - zDb[nDb] = '\0'; - - rc = getFileMode(zDb, pMode, pUid, pGid); }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ *pMode = 0600; }else if( flags & SQLITE_OPEN_URI ){ @@ -41204,86 +41908,99 @@ static int unixAccess( } /* -** If the last component of the pathname in z[0]..z[j-1] is something -** other than ".." then back it out and return true. If the last -** component is empty or if it is ".." then return false. +** A pathname under construction */ -static int unixBackupDir(const char *z, int *pJ){ - int j = *pJ; - int i; - if( j<=0 ) return 0; - for(i=j-1; i>0 && z[i-1]!='/'; i--){} - if( i==0 ) return 0; - if( z[i]=='.' && i==j-2 && z[i+1]=='.' ) return 0; - *pJ = i-1; - return 1; -} +typedef struct DbPath DbPath; +struct DbPath { + int rc; /* Non-zero following any error */ + int nSymlink; /* Number of symlinks resolved */ + char *zOut; /* Write the pathname here */ + int nOut; /* Bytes of space available to zOut[] */ + int nUsed; /* Bytes of zOut[] currently being used */ +}; + +/* Forward reference */ +static void appendAllPathElements(DbPath*,const char*); /* -** Convert a relative pathname into a full pathname. Also -** simplify the pathname as follows: -** -** Remove all instances of /./ -** Remove all isntances of /X/../ for any X +** Append a single path element to the DbPath under construction */ -static int mkFullPathname( - const char *zPath, /* Input path */ - char *zOut, /* Output buffer */ - int nOut /* Allocated size of buffer zOut */ +static void appendOnePathElement( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zName, /* Name to append to pPath. Not zero-terminated */ + int nName /* Number of significant bytes in zName */ ){ - int nPath = sqlite3Strlen30(zPath); - int iOff = 0; - int i, j; - if( zPath[0]!='/' ){ - if( osGetcwd(zOut, nOut-2)==0 ){ - return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + assert( nName>0 ); + assert( zName!=0 ); + if( zName[0]=='.' ){ + if( nName==1 ) return; + if( zName[1]=='.' && nName==2 ){ + if( pPath->nUsed<=1 ){ + pPath->rc = SQLITE_ERROR; + return; + } + assert( pPath->zOut[0]=='/' ); + while( pPath->zOut[--pPath->nUsed]!='/' ){} + return; } - iOff = sqlite3Strlen30(zOut); - zOut[iOff++] = '/'; } - if( (iOff+nPath+1)>nOut ){ - /* SQLite assumes that xFullPathname() nul-terminates the output buffer - ** even if it returns an error. */ - zOut[iOff] = '\0'; - return SQLITE_CANTOPEN_BKPT; - } - sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); - - /* Remove duplicate '/' characters. Except, two // at the beginning - ** of a pathname is allowed since this is important on windows. */ - for(i=j=1; zOut[i]; i++){ - zOut[j++] = zOut[i]; - while( zOut[i]=='/' && zOut[i+1]=='/' ) i++; + if( pPath->nUsed + nName + 2 >= pPath->nOut ){ + pPath->rc = SQLITE_ERROR; + return; } - zOut[j] = 0; - - assert( zOut[0]=='/' ); - for(i=j=0; zOut[i]; i++){ - if( zOut[i]=='/' ){ - /* Skip over internal "/." directory components */ - if( zOut[i+1]=='.' && zOut[i+2]=='/' ){ - i += 1; - continue; + pPath->zOut[pPath->nUsed++] = '/'; + memcpy(&pPath->zOut[pPath->nUsed], zName, nName); + pPath->nUsed += nName; +#if defined(HAVE_READLINK) && defined(HAVE_LSTAT) + if( pPath->rc==SQLITE_OK ){ + const char *zIn; + struct stat buf; + pPath->zOut[pPath->nUsed] = 0; + zIn = pPath->zOut; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); } - - /* If this is a "/.." directory component then back out the - ** previous term of the directory if it is something other than "..". - */ - if( zOut[i+1]=='.' - && zOut[i+2]=='.' - && zOut[i+3]=='/' - && unixBackupDir(zOut, &j) - ){ - i += 2; - continue; + }else if( S_ISLNK(buf.st_mode) ){ + ssize_t got; + char zLnk[SQLITE_MAX_PATHLEN+2]; + if( pPath->nSymlink++ > SQLITE_MAX_SYMLINK ){ + pPath->rc = SQLITE_CANTOPEN_BKPT; + return; + } + got = osReadlink(zIn, zLnk, sizeof(zLnk)-2); + if( got<=0 || got>=(ssize_t)sizeof(zLnk)-2 ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + return; + } + zLnk[got] = 0; + if( zLnk[0]=='/' ){ + pPath->nUsed = 0; + }else{ + pPath->nUsed -= nName + 1; } + appendAllPathElements(pPath, zLnk); } - if( ALWAYS(j>=0) ) zOut[j] = zOut[i]; - j++; } - if( NEVER(j==0) ) zOut[j++] = '/'; - zOut[j] = 0; - return SQLITE_OK; +#endif +} + +/* +** Append all path elements in zPath to the DbPath under construction. +*/ +static void appendAllPathElements( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zPath /* Path to append to pPath. Is zero-terminated */ +){ + int i = 0; + int j = 0; + do{ + while( zPath[i] && zPath[i]!='/' ){ i++; } + if( i>j ){ + appendOnePathElement(pPath, &zPath[j], i-j); + } + j = i+1; + }while( zPath[i++] ); } /* @@ -41301,86 +42018,27 @@ static int unixFullPathname( int nOut, /* Size of output buffer in bytes */ char *zOut /* Output buffer */ ){ -#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) - return mkFullPathname(zPath, zOut, nOut); -#else - int rc = SQLITE_OK; - int nByte; - int nLink = 0; /* Number of symbolic links followed so far */ - const char *zIn = zPath; /* Input path for each iteration of loop */ - char *zDel = 0; - - assert( pVfs->mxPathname==MAX_PATHNAME ); + DbPath path; UNUSED_PARAMETER(pVfs); - - /* It's odd to simulate an io-error here, but really this is just - ** using the io-error infrastructure to test that SQLite handles this - ** function failing. This function could fail if, for example, the - ** current working directory has been unlinked. - */ - SimulateIOError( return SQLITE_ERROR ); - - do { - - /* Call stat() on path zIn. Set bLink to true if the path is a symbolic - ** link, or false otherwise. */ - int bLink = 0; - struct stat buf; - if( osLstat(zIn, &buf)!=0 ){ - if( errno!=ENOENT ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); - } - }else{ - bLink = S_ISLNK(buf.st_mode); - } - - if( bLink ){ - nLink++; - if( zDel==0 ){ - zDel = sqlite3_malloc(nOut); - if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; - }else if( nLink>=SQLITE_MAX_SYMLINKS ){ - rc = SQLITE_CANTOPEN_BKPT; - } - - if( rc==SQLITE_OK ){ - nByte = osReadlink(zIn, zDel, nOut-1); - if( nByte<0 ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); - }else{ - if( zDel[0]!='/' ){ - int n; - for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); - if( nByte+n+1>nOut ){ - rc = SQLITE_CANTOPEN_BKPT; - }else{ - memmove(&zDel[n], zDel, nByte+1); - memcpy(zDel, zIn, n); - nByte += n; - } - } - zDel[nByte] = '\0'; - } - } - - zIn = zDel; - } - - assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); - if( rc==SQLITE_OK && zIn!=zOut ){ - rc = mkFullPathname(zIn, zOut, nOut); + path.rc = 0; + path.nUsed = 0; + path.nSymlink = 0; + path.nOut = nOut; + path.zOut = zOut; + if( zPath[0]!='/' ){ + char zPwd[SQLITE_MAX_PATHLEN+2]; + if( osGetcwd(zPwd, sizeof(zPwd)-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); } - if( bLink==0 ) break; - zIn = zOut; - }while( rc==SQLITE_OK ); - - sqlite3_free(zDel); - if( rc==SQLITE_OK && nLink ) rc = SQLITE_OK_SYMLINK; - return rc; -#endif /* HAVE_READLINK && HAVE_LSTAT */ + appendAllPathElements(&path, zPwd); + } + appendAllPathElements(&path, zPath); + zOut[path.nUsed] = 0; + if( path.rc || path.nUsed<2 ) return SQLITE_CANTOPEN_BKPT; + if( path.nSymlink ) return SQLITE_OK_SYMLINK; + return SQLITE_OK; } - #ifndef SQLITE_OMIT_LOAD_EXTENSION /* ** Interfaces for opening a shared library, finding entry points @@ -44840,10 +45498,12 @@ SQLITE_API int sqlite3_win32_set_directory8( const char *zValue /* New value for directory being set or reset */ ){ char **ppDirectory = 0; + int rc; #ifndef SQLITE_OMIT_AUTOINIT - int rc = sqlite3_initialize(); + rc = sqlite3_initialize(); if( rc ) return rc; #endif + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ ppDirectory = &sqlite3_data_directory; }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ @@ -44858,14 +45518,19 @@ SQLITE_API int sqlite3_win32_set_directory8( if( zValue && zValue[0] ){ zCopy = sqlite3_mprintf("%s", zValue); if ( zCopy==0 ){ - return SQLITE_NOMEM_BKPT; + rc = SQLITE_NOMEM_BKPT; + goto set_directory8_done; } } sqlite3_free(*ppDirectory); *ppDirectory = zCopy; - return SQLITE_OK; + rc = SQLITE_OK; + }else{ + rc = SQLITE_ERROR; } - return SQLITE_ERROR; +set_directory8_done: + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return rc; } /* @@ -47639,6 +48304,18 @@ static int winMakeEndInDirSep(int nBuf, char *zBuf){ return 0; } +/* +** If sqlite3_temp_directory is not, take the mutex and return true. +** +** If sqlite3_temp_directory is NULL, omit the mutex and return false. +*/ +static int winTempDirDefined(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + if( sqlite3_temp_directory!=0 ) return 1; + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return 0; +} + /* ** Create a temporary file name and store the resulting pointer into pzBuf. ** The pointer returned in pzBuf must be freed via sqlite3_free(). @@ -47675,20 +48352,23 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ */ nDir = nMax - (nPre + 15); assert( nDir>0 ); - if( sqlite3_temp_directory ){ + if( winTempDirDefined() ){ int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); if( nDirLen>0 ){ if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ nDirLen++; } if( nDirLen>nDir ){ + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0); } sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory); } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); } + #if defined(__CYGWIN__) else{ static const char *azDirs[] = { @@ -48477,7 +49157,7 @@ static BOOL winIsVerbatimPathname( ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname ** bytes in size. */ -static int winFullPathname( +static int winFullPathnameNoMutex( sqlite3_vfs *pVfs, /* Pointer to vfs object */ const char *zRelative, /* Possibly relative input path */ int nFull, /* Size of output buffer in bytes */ @@ -48656,6 +49336,19 @@ static int winFullPathname( } #endif } +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ + int rc; + sqlite3_mutex *pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR); + sqlite3_mutex_enter(pMutex); + rc = winFullPathnameNoMutex(pVfs, zRelative, nFull, zFull); + sqlite3_mutex_leave(pMutex); + return rc; +} #ifndef SQLITE_OMIT_LOAD_EXTENSION /* @@ -50929,8 +51622,7 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ ** make it so. */ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ - assert( p->nRef>0 || p->pCache->bPurgeable==0 ); - testcase( p->nRef==0 ); + assert( p->nRef>0 ); assert( sqlite3PcachePageSanity(p) ); if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ p->flags &= ~PGHDR_DONT_WRITE; @@ -51001,14 +51693,24 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ */ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ PCache *pCache = p->pCache; + sqlite3_pcache_page *pOther; assert( p->nRef>0 ); assert( newPgno>0 ); assert( sqlite3PcachePageSanity(p) ); pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); + pOther = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, newPgno, 0); + if( pOther ){ + PgHdr *pXPage = (PgHdr*)pOther->pExtra; + assert( pXPage->nRef==0 ); + pXPage->nRef++; + pCache->nRefSum++; + sqlite3PcacheDrop(pXPage); + } sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); p->pgno = newPgno; if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + assert( sqlite3PcachePageSanity(p) ); } } @@ -52390,23 +53092,26 @@ static void pcache1Rekey( PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = (PgHdr1 *)pPg; PgHdr1 **pp; - unsigned int h; + unsigned int hOld, hNew; assert( pPage->iKey==iOld ); assert( pPage->pCache==pCache ); + assert( iOld!=iNew ); /* The page number really is changing */ pcache1EnterMutex(pCache->pGroup); - h = iOld%pCache->nHash; - pp = &pCache->apHash[h]; + assert( pcache1FetchNoMutex(p, iOld, 0)==pPage ); /* pPg really is iOld */ + hOld = iOld%pCache->nHash; + pp = &pCache->apHash[hOld]; while( (*pp)!=pPage ){ pp = &(*pp)->pNext; } *pp = pPage->pNext; - h = iNew%pCache->nHash; + assert( pcache1FetchNoMutex(p, iNew, 0)==0 ); /* iNew not in cache */ + hNew = iNew%pCache->nHash; pPage->iKey = iNew; - pPage->pNext = pCache->apHash[h]; - pCache->apHash[h] = pPage; + pPage->pNext = pCache->apHash[hNew]; + pCache->apHash[hNew] = pPage; if( iNew>pCache->iMaxKey ){ pCache->iMaxKey = iNew; } @@ -53899,6 +54604,7 @@ struct Pager { u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ u32 sectorSize; /* Assumed sector size during rollback */ Pgno mxPgno; /* Maximum allowed size of the database */ + Pgno lckPgno; /* Page number for the locking page */ i64 pageSize; /* Number of bytes in a page */ i64 journalSizeLimit; /* Size limit for persistent journal files */ char *zFilename; /* Name of the database file */ @@ -54885,7 +55591,7 @@ static int readJournalHdr( ** journal file descriptor is advanced to the next sector boundary before ** anything is written. The format is: ** -** + 4 bytes: PAGER_MJ_PGNO. +** + 4 bytes: PAGER_SJ_PGNO. ** + N bytes: super-journal filename in utf-8. ** + 4 bytes: N (length of super-journal name in bytes, no nul-terminator). ** + 4 bytes: super-journal name checksum. @@ -54933,7 +55639,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ /* Write the super-journal data to the end of the journal file. If ** an error occurs, return the error code to the caller. */ - if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager)))) + if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_SJ_PGNO(pPager)))) || (0 != (rc = sqlite3OsWrite(pPager->jfd, zSuper, nSuper, iHdrOff+4))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper, nSuper))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper+4, cksum))) @@ -55443,7 +56149,7 @@ static u32 pager_cksum(Pager *pPager, const u8 *aData){ ** corrupted, SQLITE_DONE is returned. Data is considered corrupted in ** two circumstances: ** -** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or +** * If the record page-number is illegal (0 or PAGER_SJ_PGNO), or ** * If the record is being rolled back from the main journal file ** and the checksum field does not match the record content. ** @@ -55503,7 +56209,7 @@ static int pager_playback_one_page( ** it could cause invalid data to be written into the journal. We need to ** detect this invalid data (with high probability) and ignore it. */ - if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + if( pgno==0 || pgno==PAGER_SJ_PGNO(pPager) ){ assert( !isSavepnt ); return SQLITE_DONE; } @@ -55840,6 +56546,7 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ memset(pTmp, 0, szPage); testcase( (newSize-szPage) == currentSize ); testcase( (newSize-szPage) > currentSize ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize); rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); } if( rc==SQLITE_OK ){ @@ -56961,6 +57668,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR pPager->pTmpSpace = pNew; pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); pPager->pageSize = pageSize; + pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1; }else{ sqlite3PageFree(pNew); } @@ -58730,7 +59438,7 @@ static int getPageNormal( if( pPg->pPager && !noContent ){ /* In this case the pcache already contains an initialized copy of ** the page. Return without further ado. */ - assert( pgno!=PAGER_MJ_PGNO(pPager) ); + assert( pgno!=PAGER_SJ_PGNO(pPager) ); pPager->aStat[PAGER_STAT_HIT]++; return SQLITE_OK; @@ -58741,7 +59449,7 @@ static int getPageNormal( ** (*) obsolete. Was: maximum page number is 2^31 ** (2) Never try to fetch the locking page */ - if( pgno==PAGER_MJ_PGNO(pPager) ){ + if( pgno==PAGER_SJ_PGNO(pPager) ){ rc = SQLITE_CORRUPT_BKPT; goto pager_acquire_err; } @@ -59036,6 +59744,7 @@ static int pager_open_journal(Pager *pPager){ if( rc!=SQLITE_OK ){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; + pPager->journalOff = 0; }else{ assert( pPager->eState==PAGER_WRITER_LOCKED ); pPager->eState = PAGER_WRITER_CACHEMOD; @@ -59140,7 +59849,7 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ /* We should never write to the journal file the page that ** contains the database locks. The following assert verifies ** that we do not. */ - assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + assert( pPg->pgno!=PAGER_SJ_PGNO(pPager) ); assert( pPager->journalHdr<=pPager->journalOff ); pData2 = pPg->pData; @@ -59319,7 +60028,7 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ Pgno pg = pg1+ii; PgHdr *pPage; if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ - if( pg!=PAGER_MJ_PGNO(pPager) ){ + if( pg!=PAGER_SJ_PGNO(pPager) ){ rc = sqlite3PagerGet(pPager, pg, &pPage, 0); if( rc==SQLITE_OK ){ rc = pager_write(pPage); @@ -59797,7 +60506,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** last page is never written out to disk, leaving the database file ** undersized. Fix this now if it is the case. */ if( pPager->dbSize>pPager->dbFileSize ){ - Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); + Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_SJ_PGNO(pPager)); assert( pPager->eState==PAGER_WRITER_DBMOD ); rc = pager_truncate(pPager, nNew); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; @@ -60591,7 +61300,7 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ assert( assert_pager_state(pPager) ); if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; - if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ) return 0; return 1; } @@ -65426,7 +66135,7 @@ struct MemPage { u8 *aData; /* Pointer to disk image of the page data */ u8 *aDataEnd; /* One byte past the end of the entire page - not just ** the usable space, the entire page. Used to prevent - ** corruption-induced of buffer overflow. */ + ** corruption-induced buffer overflow. */ u8 *aCellIdx; /* The cell index area */ u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ DbPage *pDbPage; /* Pager page handle */ @@ -65731,7 +66440,7 @@ struct BtCursor { /* ** The database page the PENDING_BYTE occupies. This page is never used. */ -# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt) +#define PENDING_BYTE_PAGE(pBt) ((Pgno)((PENDING_BYTE/((pBt)->pageSize))+1)) /* ** These macros define the location of the pointer-map entry for a @@ -66372,7 +67081,7 @@ static int hasSharedCacheTableLock( int bSeen = 0; for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ Index *pIdx = (Index *)sqliteHashData(p); - if( pIdx->tnum==(int)iRoot ){ + if( pIdx->tnum==iRoot ){ if( bSeen ){ /* Two or more indexes share the same root page. There must ** be imposter tables. So just return true. The assert is not @@ -66965,7 +67674,7 @@ SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ /* ** In this version of BtreeMoveto, pKey is a packed index record ** such as is generated by the OP_MakeRecord opcode. Unpack the -** record and then call BtreeMovetoUnpacked() to do the work. +** record and then call sqlite3BtreeIndexMoveto() to do the work. */ static int btreeMoveto( BtCursor *pCur, /* Cursor open on the btree to be searched */ @@ -67485,6 +68194,7 @@ static void btreeParseCell( ** the space used by the cell pointer. ** ** cellSizePtrNoPayload() => table internal nodes +** cellSizePtrTableLeaf() => table leaf nodes ** cellSizePtr() => all index nodes & table leaf nodes */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ @@ -67510,13 +68220,6 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ }while( *(pIter)>=0x80 && pIterintKey ){ - /* pIter now points at the 64-bit integer key value, a variable length - ** integer. The following block moves pIter to point at the first byte - ** past the end of the key value. */ - pEnd = &pIter[9]; - while( (*pIter++)&0x80 && pItermaxLocal ); testcase( nSize==(u32)pPage->maxLocal+1 ); if( nSize<=pPage->maxLocal ){ @@ -67556,6 +68259,58 @@ static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ assert( debuginfo.nSize==(u16)(pIter - pCell) || CORRUPT_DB ); return (u16)(pIter - pCell); } +static u16 cellSizePtrTableLeaf(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pItermaxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} #ifdef SQLITE_DEBUG @@ -67569,7 +68324,7 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* ** The cell pCell is currently part of page pSrc but will ultimately be part -** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** of pPage. (pSrc and pPage are often the same.) If pCell contains a ** pointer to an overflow page, insert an entry into the pointer-map for ** the overflow page that will be valid after pCell has been moved to pPage. */ @@ -67660,7 +68415,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; - }else if( NEVER(iFree+sz>usableSize) ){ + }else if( iFree+sz>usableSize ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -67744,7 +68499,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ const int hdr = pPg->hdrOffset; /* Offset to page header */ u8 * const aData = pPg->aData; /* Page data */ int iAddr = hdr + 1; /* Address of ptr to pc */ - int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + u8 *pTmp = &aData[iAddr]; /* Temporary ptr into aData[] */ + int pc = get2byte(pTmp); /* Address of a free slot */ int x; /* Excess size of the slot */ int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ int size; /* Size of the free slot */ @@ -67754,7 +68510,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ - size = get2byte(&aData[pc+2]); + pTmp = &aData[pc+2]; + size = get2byte(pTmp); if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); @@ -67781,7 +68538,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ return &aData[pc + x]; } iAddr = pc; - pc = get2byte(&aData[pc]); + pTmp = &aData[pc]; + pc = get2byte(pTmp); if( pc<=iAddr+size ){ if( pc ){ /* The next slot in the chain is not past the end of the current slot */ @@ -67815,6 +68573,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ u8 * const data = pPage->aData; /* Local cache of pPage->aData */ int top; /* First byte of cell content area */ int rc = SQLITE_OK; /* Integer return code */ + u8 *pTmp; /* Temp ptr into data[] */ int gap; /* First byte of gap between cell pointers and cell content */ assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -67833,7 +68592,8 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** then the cell content offset of an empty page wants to be 65536. ** However, that integer is too large to be stored in a 2-byte unsigned ** integer, so a value of 0 is used in its place. */ - top = get2byte(&data[hdr+5]); + pTmp = &data[hdr+5]; + top = get2byte(pTmp); assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ if( gap>top ){ if( top==0 && pPage->pBt->usableSize==65536 ){ @@ -67915,6 +68675,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ u16 x; /* Offset to cell content area */ u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ unsigned char *data = pPage->aData; /* Page content */ + u8 *pTmp; /* Temporary ptr into data[] */ assert( pPage->pBt!=0 ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -67977,7 +68738,8 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); data[hdr+7] -= nFrag; } - x = get2byte(&data[hdr+5]); + pTmp = &data[hdr+5]; + x = get2byte(pTmp); if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another @@ -68021,7 +68783,6 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); flagByte &= ~PTF_LEAF; pPage->childPtrSize = 4-4*pPage->leaf; - pPage->xCellSize = cellSizePtr; pBt = pPage->pBt; if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an @@ -68033,6 +68794,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->intKey = 1; if( pPage->leaf ){ pPage->intKeyLeaf = 1; + pPage->xCellSize = cellSizePtrTableLeaf; pPage->xParseCell = btreeParseCellPtr; }else{ pPage->intKeyLeaf = 0; @@ -68050,12 +68812,17 @@ static int decodeFlags(MemPage *pPage, int flagByte){ assert( (PTF_ZERODATA|PTF_LEAF)==10 ); pPage->intKey = 0; pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; pPage->xParseCell = btreeParseCellPtrIndex; pPage->maxLocal = pBt->maxLocal; pPage->minLocal = pBt->minLocal; }else{ /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is ** an error. */ + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; + pPage->xParseCell = btreeParseCellPtrIndex; return SQLITE_CORRUPT_PAGE(pPage); } pPage->max1bytePayload = pBt->max1bytePayload; @@ -68409,7 +69176,9 @@ static int getAndInitPage( pCur->pPage = pCur->apPage[pCur->iPage]; } testcase( pgno==0 ); - assert( pgno!=0 || rc==SQLITE_CORRUPT ); + assert( pgno!=0 || rc==SQLITE_CORRUPT + || rc==SQLITE_IOERR_NOMEM + || rc==SQLITE_NOMEM ); return rc; } @@ -70031,12 +70800,17 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ } do { MemPage *pFreePg; + Pgno dbSize = btreePagecount(pBt); rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); if( rc!=SQLITE_OK ){ releasePage(pLastPg); return rc; } releasePage(pFreePg); + if( iFreePg>dbSize ){ + releasePage(pLastPg); + return SQLITE_CORRUPT_BKPT; + } }while( bCommit && iFreePg>nFin ); assert( iFreePgpPage; + int c; + int nCell; /* Size of the pCell cell in bytes */ + u8 *pCell = findCellPastPtr(pPage, idx); + + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* If the record extends into overflow pages, do not attempt + ** the optimization. */ + c = 99; + } + return c; +} + +/* +** Return true (non-zero) if pCur is current pointing to the last +** page of a table. +*/ +static int cursorOnLastPage(BtCursor *pCur){ + int i; + assert( pCur->eState==CURSOR_VALID ); + for(i=0; iiPage; i++){ + MemPage *pPage = pCur->apPage[i]; + if( pCur->aiIdx[i]nCell ) return 0; + } + return 1; +} + /* Move the cursor so that it points to an entry in an index table ** near the key pIdxKey. Return a success code. ** @@ -71848,6 +72685,43 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( || pIdxKey->default_rc==-1 ); + + /* Check to see if we can skip a lot of work. Two cases: + ** + ** (1) If the cursor is already pointing to the very last cell + ** in the table and the pIdxKey search key is greater than or + ** equal to that last cell, then no movement is required. + ** + ** (2) If the cursor is on the last page of the table and the first + ** cell on that last page is less than or equal to the pIdxKey + ** search key, then we can start the search on the current page + ** without needing to go back to root. + */ + if( pCur->eState==CURSOR_VALID + && pCur->pPage->leaf + && cursorOnLastPage(pCur) + ){ + int c; + if( pCur->ix==pCur->pPage->nCell-1 + && (c = indexCellCompare(pCur, pCur->ix, pIdxKey, xRecordCompare))<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + *pRes = c; + return SQLITE_OK; /* Cursor already pointing at the correct spot */ + } + if( pCur->iPage>0 + && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( !pCur->pPage->isInit ){ + return SQLITE_CORRUPT_BKPT; + } + goto bypass_moveto_root; /* Start search on the current page */ + } + pIdxKey->errCode = SQLITE_OK; + } + rc = moveToRoot(pCur); if( rc ){ if( rc==SQLITE_EMPTY ){ @@ -71857,12 +72731,14 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( } return rc; } + +bypass_moveto_root: assert( pCur->pPage ); assert( pCur->pPage->isInit ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->pPage->nCell > 0 ); - assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); - assert( pCur->curIntKey || pIdxKey ); + assert( pCur->curIntKey==0 ); + assert( pIdxKey!=0 ); for(;;){ int lwr, upr, idx, c; Pgno chldPg; @@ -71876,7 +72752,7 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** be the right kind (index or table) of b-tree page. Otherwise ** a moveToChild() or moveToRoot() call would have detected corruption. */ assert( pPage->nCell>0 ); - assert( pPage->intKey==(pIdxKey==0) ); + assert( pPage->intKey==0 ); lwr = 0; upr = pPage->nCell-1; idx = upr>>1; /* idx = (lwr+upr)/2; */ @@ -73895,8 +74771,6 @@ static int balance_nonroot( Pgno pgno; /* Temp var to store a page number in */ u8 abDone[NB+2]; /* True after i'th new page is populated */ Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ - Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ - u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ CellArray b; /* Parsed information on cells being balanced */ memset(abDone, 0, sizeof(abDone)); @@ -74320,42 +75194,39 @@ static int balance_nonroot( ** of the table is closer to a linear scan through the file. That in turn ** helps the operating system to deliver pages from the disk more rapidly. ** - ** An O(n^2) insertion sort algorithm is used, but since n is never more - ** than (NB+2) (a small constant), that should not be a problem. + ** An O(N*N) sort algorithm is used, but since N is never more than NB+2 + ** (5), that is not a performance concern. ** ** When NB==3, this one optimization makes the database about 25% faster ** for large insertions and deletions. */ for(i=0; ipgno; - aPgFlags[i] = apNew[i]->pDbPage->flags; - for(j=0; jpgno; + assert( apNew[i]->pDbPage->flags & PGHDR_WRITEABLE ); + assert( apNew[i]->pDbPage->flags & PGHDR_DIRTY ); } - for(i=0; ipgno < apNew[iB]->pgno ) iB = j; } - pgno = aPgOrder[iBest]; - aPgOrder[iBest] = 0xffffffff; - if( iBest!=i ){ - if( iBest>i ){ - sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); - } - sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); - apNew[i]->pgno = pgno; + + /* If apNew[i] has a page number that is bigger than any of the + ** subsequence apNew[i] entries, then swap apNew[i] with the subsequent + ** entry that has the smallest page number (which we know to be + ** entry apNew[iB]). + */ + if( iB!=i ){ + Pgno pgnoA = apNew[i]->pgno; + Pgno pgnoB = apNew[iB]->pgno; + Pgno pgnoTemp = (PENDING_BYTE/pBt->pageSize)+1; + u16 fgA = apNew[i]->pDbPage->flags; + u16 fgB = apNew[iB]->pDbPage->flags; + sqlite3PagerRekey(apNew[i]->pDbPage, pgnoTemp, fgB); + sqlite3PagerRekey(apNew[iB]->pDbPage, pgnoA, fgA); + sqlite3PagerRekey(apNew[i]->pDbPage, pgnoB, fgB); + apNew[i]->pgno = pgnoB; + apNew[iB]->pgno = pgnoA; } } @@ -74743,7 +75614,6 @@ static int anotherValidCursor(BtCursor *pCur){ */ static int balance(BtCursor *pCur){ int rc = SQLITE_OK; - const int nMin = pCur->pBt->usableSize * 2 / 3; u8 aBalanceQuickSpace[13]; u8 *pFree = 0; @@ -74755,7 +75625,11 @@ static int balance(BtCursor *pCur){ MemPage *pPage = pCur->pPage; if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; - if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* No rebalance required as long as: + ** (1) There are no overflow cells + ** (2) The amount of free space on the page is less than 2/3rds of + ** the total usable space on the page. */ break; }else if( (iPage = pCur->iPage)==0 ){ if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ @@ -74975,7 +75849,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ ** pX.pData,nData,nZero fields must be zero. ** ** If the seekResult parameter is non-zero, then a successful call to -** MovetoUnpacked() to seek cursor pCur to (pKey,nKey) has already +** sqlite3BtreeIndexMoveto() to seek cursor pCur to (pKey,nKey) has already ** been performed. In other words, if seekResult!=0 then the cursor ** is currently pointing to a cell that will be adjacent to the cell ** to be inserted. If seekResult<0 then pCur points to a cell that is @@ -74993,7 +75867,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( BtCursor *pCur, /* Insert data into the table of this cursor */ const BtreePayload *pX, /* Content of the row to be inserted */ int flags, /* True if this is likely an append */ - int seekResult /* Result of prior MovetoUnpacked() call */ + int seekResult /* Result of prior IndexMoveto() call */ ){ int rc; int loc = seekResult; /* -1: before desired location +1: after */ @@ -75032,7 +75906,12 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } + /* Ensure that the cursor is not in the CURSOR_FAULT state and that it + ** points to a valid cell. + */ if( pCur->eState>=CURSOR_REQUIRESEEK ){ + testcase( pCur->eState==CURSOR_REQUIRESEEK ); + testcase( pCur->eState==CURSOR_FAULT ); rc = moveToRoot(pCur); if( rc && rc!=SQLITE_EMPTY ) return rc; } @@ -75144,7 +76023,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); assert( pPage->leaf || !pPage->intKey ); if( pPage->nFree<0 ){ - if( pCur->eState>CURSOR_INVALID ){ + if( NEVER(pCur->eState>CURSOR_INVALID) ){ + /* ^^^^^--- due to the moveToRoot() call above */ rc = SQLITE_CORRUPT_BKPT; }else{ rc = btreeComputeFreeSpace(pPage); @@ -75155,7 +76035,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, loc==0 ? "overwrite" : "new entry")); - assert( pPage->isInit ); + assert( pPage->isInit || CORRUPT_DB ); newCell = pBt->pTmpSpace; assert( newCell!=0 ); if( flags & BTREE_PREFORMAT ){ @@ -75306,7 +76186,11 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 u32 nRem; /* Bytes of data still to copy */ getCellInfo(pSrc); - aOut += putVarint32(aOut, pSrc->info.nPayload); + if( pSrc->info.nPayload<0x80 ){ + *(aOut++) = pSrc->info.nPayload; + }else{ + aOut += sqlite3PutVarint(aOut, pSrc->info.nPayload); + } if( pDest->pKeyInfo==0 ) aOut += putVarint(aOut, iKey); nIn = pSrc->info.nLocal; aIn = pSrc->info.pPayload; @@ -75466,7 +76350,8 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ bPreserve = (flags & BTREE_SAVEPOSITION)!=0; if( bPreserve ){ if( !pPage->leaf - || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || (pPage->nFree+pPage->xCellSize(pPage,pCell)+2) > + (int)(pBt->usableSize*2/3) || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. @@ -75562,7 +76447,15 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** been corrected, so be it. Otherwise, after balancing the leaf node, ** walk the cursor up the tree to the internal node and balance it as ** well. */ - rc = balance(pCur); + assert( pCur->pPage->nOverflow==0 ); + assert( pCur->pPage->nFree>=0 ); + if( pCur->pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* Optimization: If the free space is less than 2/3rds of the page, + ** then balance() will always be a no-op. No need to invoke it. */ + rc = SQLITE_OK; + }else{ + rc = balance(pCur); + } if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ releasePageNotNull(pCur->pPage); pCur->iPage--; @@ -78310,9 +79203,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ Mem t; assert( pFunc!=0 ); assert( pMem!=0 ); + assert( pMem->db!=0 ); assert( pFunc->xFinalize!=0 ); assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( sqlite3_mutex_held(pMem->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); memset(&t, 0, sizeof(t)); t.flags = MEM_Null; @@ -78320,6 +79214,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ ctx.pOut = &t; ctx.pMem = pMem; ctx.pFunc = pFunc; + ctx.enc = ENC(t.db); pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ assert( (pMem->flags & MEM_Dyn)==0 ); if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); @@ -78341,12 +79236,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc assert( pFunc!=0 ); assert( pFunc->xValue!=0 ); assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); - assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) ); + assert( pAccum->db!=0 ); + assert( sqlite3_mutex_held(pAccum->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); sqlite3VdbeMemSetNull(pOut); ctx.pOut = pOut; ctx.pMem = pAccum; ctx.pFunc = pFunc; + ctx.enc = ENC(pAccum->db); pFunc->xValue(&ctx); return ctx.isError; } @@ -78412,6 +79309,14 @@ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ } } +/* Like sqlite3VdbeMemRelease() but faster for cases where we +** know in advance that the Mem is not MEM_Dyn or MEM_Agg. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){ + assert( !VdbeMemDynamic(p) ); + if( p->szMalloc ) vdbeMemClear(p); +} + /* ** Convert a 64-bit IEEE double into a 64-bit signed integer. ** If the double is out of range of a 64-bit signed integer then @@ -78956,6 +79861,13 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ ** stored without allocating memory, then it is. If a memory allocation ** is required to store the string, then value of pMem is unchanged. In ** either case, SQLITE_TOOBIG is returned. +** +** The "enc" parameter is the text encoding for the string, or zero +** to store a blob. +** +** If n is negative, then the string consists of all bytes up to but +** excluding the first zero character. The n parameter must be +** non-negative for blobs. */ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( Mem *pMem, /* Memory cell to set to string value */ @@ -78966,11 +79878,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ){ i64 nByte = n; /* New value for pMem->n */ int iLimit; /* Maximum allowed string or blob size */ - u16 flags = 0; /* New value for pMem->flags */ + u16 flags; /* New value for pMem->flags */ assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( enc!=0 || n>=0 ); /* If z is a NULL pointer, set pMem to contain an SQL NULL. */ if( !z ){ @@ -78983,7 +79896,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( }else{ iLimit = SQLITE_MAX_LENGTH; } - flags = (enc==0?MEM_Blob:MEM_Str); if( nByte<0 ){ assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ @@ -78991,7 +79903,23 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } - flags |= MEM_Term; + flags= MEM_Str|MEM_Term; + }else if( enc==0 ){ + flags = MEM_Blob; + enc = SQLITE_UTF8; + }else{ + flags = MEM_Str; + } + if( nByte>iLimit ){ + if( xDel && xDel!=SQLITE_TRANSIENT ){ + if( xDel==SQLITE_DYNAMIC ){ + sqlite3DbFree(pMem->db, (void*)z); + }else{ + xDel((void*)z); + } + } + sqlite3VdbeMemSetNull(pMem); + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); } /* The following block sets the new values of Mem.z and Mem.xDel. It @@ -79003,9 +79931,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } - if( nByte>iLimit ){ - return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); - } testcase( nAlloc==0 ); testcase( nAlloc==31 ); testcase( nAlloc==32 ); @@ -79027,16 +79952,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( pMem->n = (int)(nByte & 0x7fffffff); pMem->flags = flags; - if( enc ){ - pMem->enc = enc; -#ifdef SQLITE_ENABLE_SESSION - }else if( pMem->db==0 ){ - pMem->enc = SQLITE_UTF8; -#endif - }else{ - assert( pMem->db!=0 ); - pMem->enc = ENC(pMem->db); - } + pMem->enc = enc; #ifndef SQLITE_OMIT_UTF16 if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ @@ -79044,9 +79960,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( } #endif - if( nByte>iLimit ){ - return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); - } return SQLITE_OK; } @@ -79324,10 +80237,12 @@ static int valueFromFunction( goto value_from_function_out; } - assert( pCtx->pParse->rc==SQLITE_OK ); + testcase( pCtx->pParse->rc==SQLITE_ERROR ); + testcase( pCtx->pParse->rc==SQLITE_OK ); memset(&ctx, 0, sizeof(ctx)); ctx.pOut = pVal; ctx.pFunc = pFunc; + ctx.enc = ENC(db); pFunc->xSFunc(&ctx, nVal, apVal); if( ctx.isError ){ rc = ctx.isError; @@ -79403,8 +80318,8 @@ static int valueFromExpr( rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); testcase( rc!=SQLITE_OK ); if( *ppVal ){ - sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); - sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); + sqlite3VdbeMemCast(*ppVal, aff, enc); + sqlite3ValueApplyAffinity(*ppVal, affinity, enc); } return rc; } @@ -79838,7 +80753,7 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ p->pNext = db->pVdbe; p->pPrev = 0; db->pVdbe = p; - p->iVdbeMagic = VDBE_MAGIC_INIT; + assert( p->eVdbeState==VDBE_INIT_STATE ); p->pParse = pParse; pParse->pVdbe = p; assert( pParse->aLabel==0 ); @@ -79983,7 +80898,7 @@ static int growOpArray(Vdbe *v, int nOp){ return SQLITE_NOMEM; } - assert( nOp<=(1024/sizeof(Op)) ); + assert( nOp<=(int)(1024/sizeof(Op)) ); assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ @@ -80039,7 +80954,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ VdbeOp *pOp; i = p->nOp; - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( op>=0 && op<0xff ); if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); @@ -80184,6 +81099,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, p1, p2, p3, (char*)pCtx, P4_FUNCCTX); sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); + sqlite3MayAbort(pParse); return addr; } @@ -80371,7 +81287,7 @@ static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); - assert( v->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( v->eVdbeState==VDBE_INIT_STATE ); assert( j<-p->nLabel ); assert( j>=0 ); #ifdef SQLITE_DEBUG @@ -80391,14 +81307,20 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ ** Mark the VDBE as one that can only be run one time. */ SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ - p->runOnlyOnce = 1; + sqlite3VdbeAddOp2(p, OP_Expire, 1, 1); } /* -** Mark the VDBE as one that can only be run multiple times. +** Mark the VDBE as one that can be run multiple times. */ SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ - p->runOnlyOnce = 0; + int i; + for(i=1; ALWAYS(inOp); i++){ + if( ALWAYS(p->aOp[i].opcode==OP_Expire) ){ + p->aOp[1].opcode = OP_Noop; + break; + } + } } #ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ @@ -80502,6 +81424,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; + + if( v==0 ) return 0; memset(&sIter, 0, sizeof(sIter)); sIter.v = v; @@ -80511,6 +81435,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ || opcode==OP_VDestroy || opcode==OP_VCreate || opcode==OP_ParseSchema + || opcode==OP_Function || opcode==OP_PureFunc || ((opcode==OP_Halt || opcode==OP_HaltIfNull) && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ @@ -80585,7 +81510,7 @@ SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ ** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately ** indicate what the prepared statement actually does. ** -** (4) Initialize the p4.xAdvance pointer on opcodes that use it. +** (4) (discontinued) ** ** (5) Reclaim the memory allocated for storing labels. ** @@ -80631,25 +81556,6 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ p->bIsReader = 1; break; } - case OP_Next: - case OP_SorterNext: { - pOp->p4.xAdvance = sqlite3BtreeNext; - pOp->p4type = P4_ADVANCE; - /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a - ** known address */ - assert( pOp->p2>=0 ); - break; - } - case OP_Prev: { - pOp->p4.xAdvance = sqlite3BtreePrevious; - pOp->p4type = P4_ADVANCE; - /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a - ** known address */ - assert( pOp->p2>=0 ); - break; - } #ifndef SQLITE_OMIT_VIRTUALTABLE case OP_VUpdate: { if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; @@ -80685,18 +81591,104 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ if( pOp==p->aOp ) break; pOp--; } - sqlite3DbFree(p->db, pParse->aLabel); - pParse->aLabel = 0; + if( aLabel ){ + sqlite3DbFreeNN(p->db, pParse->aLabel); + pParse->aLabel = 0; + } pParse->nLabel = 0; *pMaxFuncArgs = nMaxArgs; assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); } +#ifdef SQLITE_DEBUG +/* +** Check to see if a subroutine contains a jump to a location outside of +** the subroutine. If a jump outside the subroutine is detected, add code +** that will cause the program to halt with an error message. +** +** The subroutine consists of opcodes between iFirst and iLast. Jumps to +** locations within the subroutine are acceptable. iRetReg is a register +** that contains the return address. Jumps to outside the range of iFirst +** through iLast are also acceptable as long as the jump destination is +** an OP_Return to iReturnAddr. +** +** A jump to an unresolved label means that the jump destination will be +** beyond the current address. That is normally a jump to an early +** termination and is consider acceptable. +** +** This routine only runs during debug builds. The purpose is (of course) +** to detect invalid escapes out of a subroutine. The OP_Halt opcode +** is generated rather than an assert() or other error, so that ".eqp full" +** will still work to show the original bytecode, to aid in debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn( + Vdbe *v, /* The byte-code program under construction */ + int iFirst, /* First opcode of the subroutine */ + int iLast, /* Last opcode of the subroutine */ + int iRetReg /* Subroutine return address register */ +){ + VdbeOp *pOp; + Parse *pParse; + int i; + sqlite3_str *pErr = 0; + assert( v!=0 ); + pParse = v->pParse; + assert( pParse!=0 ); + if( pParse->nErr ) return; + assert( iLast>=iFirst ); + assert( iLastnOp ); + pOp = &v->aOp[iFirst]; + for(i=iFirst; i<=iLast; i++, pOp++){ + if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ){ + int iDest = pOp->p2; /* Jump destination */ + if( iDest==0 ) continue; + if( pOp->opcode==OP_Gosub ) continue; + if( iDest<0 ){ + int j = ADDR(iDest); + assert( j>=0 ); + if( j>=-pParse->nLabel || pParse->aLabel[j]<0 ){ + continue; + } + iDest = pParse->aLabel[j]; + } + if( iDestiLast ){ + int j = iDest; + for(; jnOp; j++){ + VdbeOp *pX = &v->aOp[j]; + if( pX->opcode==OP_Return ){ + if( pX->p1==iRetReg ) break; + continue; + } + if( pX->opcode==OP_Noop ) continue; + if( pX->opcode==OP_Explain ) continue; + if( pErr==0 ){ + pErr = sqlite3_str_new(0); + }else{ + sqlite3_str_appendchar(pErr, 1, '\n'); + } + sqlite3_str_appendf(pErr, + "Opcode at %d jumps to %d which is outside the " + "subroutine at %d..%d", + i, iDest, iFirst, iLast); + break; + } + } + } + } + if( pErr ){ + char *zErr = sqlite3_str_finish(pErr); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_INTERNAL, OE_Abort, 0, zErr, 0); + sqlite3_free(zErr); + sqlite3MayAbort(pParse); + } +} +#endif /* SQLITE_DEBUG */ + /* ** Return the address of the next instruction to be inserted. */ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); return p->nOp; } @@ -80781,7 +81773,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( int i; VdbeOp *pOut, *pFirst; assert( nOp>0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } @@ -80933,7 +81925,6 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ case P4_REAL: case P4_INT64: case P4_DYNAMIC: - case P4_DYNBLOB: case P4_INTARRAY: { sqlite3DbFree(db, p4); break; @@ -80973,13 +81964,16 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ ** nOp entries. */ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ + assert( nOp>=0 ); if( aOp ){ - Op *pOp; - for(pOp=&aOp[nOp-1]; pOp>=aOp; pOp--){ + Op *pOp = &aOp[nOp-1]; + while(1){ /* Exit via break */ if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS sqlite3DbFree(db, pOp->zComment); #endif + if( pOp==aOp ) break; + pOp--; } sqlite3DbFreeNN(db, aOp); } @@ -81041,7 +82035,7 @@ SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( u32 mask, /* Mask of registers to NOT release */ int bUndefine /* If true, mark registers as undefined */ ){ - if( N==0 ) return; + if( N==0 || OptimizationDisabled(pParse->db, SQLITE_ReleaseReg) ) return; assert( pParse->pVdbe ); assert( iFirst>=1 ); assert( iFirst+N-1<=pParse->nMem ); @@ -81105,7 +82099,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int sqlite3 *db; assert( p!=0 ); db = p->db; - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( p->aOp!=0 || db->mallocFailed ); if( db->mallocFailed ){ if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); @@ -81233,7 +82227,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ /* C89 specifies that the constant "dummy" will be initialized to all ** zeros, which is correct. MSVC generates a warning, nevertheless. */ static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); if( addr<0 ){ addr = p->nOp - 1; } @@ -81300,8 +82294,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( if( c=='4' ){ sqlite3_str_appendall(&x, zP4); }else if( c=='X' ){ - sqlite3_str_appendall(&x, pOp->zComment); - seenCom = 1; + if( pOp->zComment && pOp->zComment[0] ){ + sqlite3_str_appendall(&x, pOp->zComment); + seenCom = 1; + break; + } }else{ int v1 = translateP(c, pOp); int v2; @@ -81530,10 +82527,6 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ zP4 = "program"; break; } - case P4_DYNBLOB: - case P4_ADVANCE: { - break; - } case P4_TABLE: { zP4 = pOp->p4.pTab->zName; break; @@ -81665,21 +82658,40 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ /* ** Initialize an array of N Mem element. +** +** This is a high-runner, so only those fields that really do need to +** be initialized are set. The Mem structure is organized so that +** the fields that get initialized are nearby and hopefully on the same +** cache line. +** +** Mem.flags = flags +** Mem.db = db +** Mem.szMalloc = 0 +** +** All other fields of Mem can safely remain uninitialized for now. They +** will be initialized before use. */ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ - while( (N--)>0 ){ - p->db = db; - p->flags = flags; - p->szMalloc = 0; + if( N>0 ){ + do{ + p->flags = flags; + p->db = db; + p->szMalloc = 0; #ifdef SQLITE_DEBUG - p->pScopyFrom = 0; + p->pScopyFrom = 0; #endif - p++; + p++; + }while( (--N)>0 ); } } /* -** Release an array of N Mem elements +** Release auxiliary memory held in an array of N Mem elements. +** +** After this routine returns, all Mem elements in the array will still +** be valid. Those Mem elements that were not holding auxiliary resources +** will be unchanged. Mem elements which had something freed will be +** set to MEM_Undefined. */ static void releaseMemArray(Mem *p, int N){ if( p && N ){ @@ -81712,12 +82724,17 @@ static void releaseMemArray(Mem *p, int N){ if( p->flags&(MEM_Agg|MEM_Dyn) ){ testcase( (p->flags & MEM_Dyn)!=0 && p->xDel==sqlite3VdbeFrameMemDel ); sqlite3VdbeMemRelease(p); + p->flags = MEM_Undefined; }else if( p->szMalloc ){ sqlite3DbFreeNN(db, p->zMalloc); p->szMalloc = 0; + p->flags = MEM_Undefined; } - - p->flags = MEM_Undefined; +#ifdef SQLITE_DEBUG + else{ + p->flags = MEM_Undefined; + } +#endif }while( (++p)nChildMem]; assert( sqlite3VdbeFrameIsValid(p) ); for(i=0; inChildCsr; i++){ - sqlite3VdbeFreeCursor(p->v, apCsr[i]); + if( apCsr[i] ) sqlite3VdbeFreeCursorNN(p->v, apCsr[i]); } releaseMemArray(aMem, p->nChildMem); sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); @@ -81915,7 +82932,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( Op *pOp; /* Current opcode */ assert( p->explain ); - assert( p->iVdbeMagic==VDBE_MAGIC_RUN ); + assert( p->eVdbeState==VDBE_RUN_STATE ); assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); /* Even though this opcode does not use dynamic strings for @@ -82070,11 +83087,11 @@ struct ReusableSpace { static void *allocSpace( struct ReusableSpace *p, /* Bulk memory available for allocation */ void *pBuf, /* Pointer to a prior allocation */ - sqlite3_int64 nByte /* Bytes of memory needed */ + sqlite3_int64 nByte /* Bytes of memory needed. */ ){ assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); if( pBuf==0 ){ - nByte = ROUND8(nByte); + nByte = ROUND8P(nByte); if( nByte <= p->nFree ){ p->nFree -= nByte; pBuf = &p->pSpace[p->nFree]; @@ -82095,14 +83112,15 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ int i; #endif assert( p!=0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT || p->iVdbeMagic==VDBE_MAGIC_RESET ); + assert( p->eVdbeState==VDBE_INIT_STATE + || p->eVdbeState==VDBE_READY_STATE + || p->eVdbeState==VDBE_HALT_STATE ); /* There should be at least one opcode. */ assert( p->nOp>0 ); - /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */ - p->iVdbeMagic = VDBE_MAGIC_RUN; + p->eVdbeState = VDBE_READY_STATE; #ifdef SQLITE_DEBUG for(i=0; inMem; i++){ @@ -82158,7 +83176,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( assert( p!=0 ); assert( p->nOp>0 ); assert( pParse!=0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( pParse==p->pParse ); p->pVList = pParse->pVList; pParse->pVList = 0; @@ -82181,7 +83199,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** opcode array. This extra memory will be reallocated for other elements ** of the prepared statement. */ - n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + n = ROUND8P(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ @@ -82269,9 +83287,9 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** happens to hold. */ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ - if( pCx==0 ){ - return; - } + if( pCx ) sqlite3VdbeFreeCursorNN(p,pCx); +} +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ switch( pCx->eCurType ){ case CURTYPE_SORTER: { sqlite3VdbeSorterClose(p->db, pCx); @@ -82299,14 +83317,12 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ ** Close all cursors in the current frame. */ static void closeCursorsInFrame(Vdbe *p){ - if( p->apCsr ){ - int i; - for(i=0; inCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ - sqlite3VdbeFreeCursor(p, pC); - p->apCsr[i] = 0; - } + int i; + for(i=0; inCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursorNN(p, pC); + p->apCsr[i] = 0; } } } @@ -82355,9 +83371,7 @@ static void closeAllCursors(Vdbe *p){ } assert( p->nFrame==0 ); closeCursorsInFrame(p); - if( p->aMem ){ - releaseMemArray(p->aMem, p->nMem); - } + releaseMemArray(p->aMem, p->nMem); while( p->pDelFrame ){ VdbeFrame *pDel = p->pDelFrame; p->pDelFrame = pDel->pParent; @@ -82797,7 +83811,8 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; p->errorAction = OE_Abort; sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); - return SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR; + return SQLITE_CONSTRAINT_FOREIGNKEY; } return SQLITE_OK; } @@ -82836,9 +83851,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** one, or the complete transaction if there is no statement transaction. */ - if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){ - return SQLITE_OK; - } + assert( p->eVdbeState==VDBE_RUN_STATE ); if( db->mallocFailed ){ p->rc = SQLITE_NOMEM_BKPT; } @@ -82847,7 +83860,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* No commit or rollback needed if the program never started or if the ** SQL statement does not read or write a database file. */ - if( p->pc>=0 && p->bIsReader ){ + if( p->bIsReader ){ int mrc; /* Primary error code from p->rc */ int eStatementOp = 0; int isSpecialError; /* Set to true if a 'special' error */ @@ -82995,15 +84008,13 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } /* We have successfully halted and closed the VM. Record this fact. */ - if( p->pc>=0 ){ - db->nVdbeActive--; - if( !p->readOnly ) db->nVdbeWrite--; - if( p->bIsReader ) db->nVdbeRead--; - assert( db->nVdbeActive>=db->nVdbeRead ); - assert( db->nVdbeRead>=db->nVdbeWrite ); - assert( db->nVdbeWrite>=0 ); - } - p->iVdbeMagic = VDBE_MAGIC_HALT; + db->nVdbeActive--; + if( !p->readOnly ) db->nVdbeWrite--; + if( p->bIsReader ) db->nVdbeRead--; + assert( db->nVdbeActive>=db->nVdbeRead ); + assert( db->nVdbeRead>=db->nVdbeWrite ); + assert( db->nVdbeWrite>=0 ); + p->eVdbeState = VDBE_HALT_STATE; checkActiveVdbeCnt(db); if( db->mallocFailed ){ p->rc = SQLITE_NOMEM_BKPT; @@ -83085,8 +84096,8 @@ static void vdbeInvokeSqllog(Vdbe *v){ ** again. ** ** To look at it another way, this routine resets the state of the -** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to -** VDBE_MAGIC_INIT. +** virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to +** VDBE_READY_STATE. */ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) @@ -83100,7 +84111,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ ** error, then it might not have been halted properly. So halt ** it now. */ - sqlite3VdbeHalt(p); + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); /* If the VDBE has been run even partially, then transfer the error code ** and error message from the VDBE into the main database structure. But @@ -83114,13 +84125,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ }else{ db->errCode = p->rc; } - if( p->runOnlyOnce ) p->expired = 1; - }else if( p->rc && p->expired ){ - /* The expired flag was set on the VDBE before the first call - ** to sqlite3_step(). For consistency (since sqlite3_step() was - ** called), set the database error in this case as well. - */ - sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); } /* Reset register contents and reclaim error message memory. @@ -83177,7 +84181,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ } } #endif - p->iVdbeMagic = VDBE_MAGIC_RESET; return p->rc & db->errMask; } @@ -83187,7 +84190,10 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ */ SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ int rc = SQLITE_OK; - if( p->iVdbeMagic==VDBE_MAGIC_RUN || p->iVdbeMagic==VDBE_MAGIC_HALT ){ + assert( VDBE_RUN_STATE>VDBE_READY_STATE ); + assert( VDBE_HALT_STATE>VDBE_READY_STATE ); + assert( VDBE_INIT_STATEeVdbeState>=VDBE_READY_STATE ){ rc = sqlite3VdbeReset(p); assert( (rc & p->db->errMask)==rc ); } @@ -83239,22 +84245,24 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, ** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with ** the database connection and frees the object itself. */ -SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ +static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SubProgram *pSub, *pNext; assert( p->db==0 || p->db==db ); - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + if( p->aColName ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFreeNN(db, p->aColName); + } for(pSub=p->pProgram; pSub; pSub=pNext){ pNext = pSub->pNext; vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); sqlite3DbFree(db, pSub); } - if( p->iVdbeMagic!=VDBE_MAGIC_INIT ){ + if( p->eVdbeState!=VDBE_INIT_STATE ){ releaseMemArray(p->aVar, p->nVar); - sqlite3DbFree(db, p->pVList); - sqlite3DbFree(db, p->pFree); + if( p->pVList ) sqlite3DbFreeNN(db, p->pVList); + if( p->pFree ) sqlite3DbFreeNN(db, p->pFree); } vdbeFreeOpArray(db, p->aOp, p->nOp); - sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); @@ -83287,17 +84295,17 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ db = p->db; assert( sqlite3_mutex_held(db->mutex) ); sqlite3VdbeClearObject(db, p); - if( p->pPrev ){ - p->pPrev->pNext = p->pNext; - }else{ - assert( db->pVdbe==p ); - db->pVdbe = p->pNext; - } - if( p->pNext ){ - p->pNext->pPrev = p->pPrev; + if( db->pnBytesFreed==0 ){ + if( p->pPrev ){ + p->pPrev->pNext = p->pNext; + }else{ + assert( db->pVdbe==p ); + db->pVdbe = p->pNext; + } + if( p->pNext ){ + p->pNext->pPrev = p->pPrev; + } } - p->iVdbeMagic = VDBE_MAGIC_DEAD; - p->db = 0; sqlite3DbFreeNN(db, p); } @@ -83332,7 +84340,7 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ ** is supposed to be pointing. If the row was deleted out from under the ** cursor, set the cursor to point to a NULL row. */ -static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p){ int isDifferentRow, rc; assert( p->eCurType==CURTYPE_BTREE ); assert( p->uc.pCursor!=0 ); @@ -83348,41 +84356,9 @@ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ ** if need be. Return any I/O error from the restore operation. */ SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ - assert( p->eCurType==CURTYPE_BTREE ); - if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ - return handleMovedCursor(p); - } - return SQLITE_OK; -} - -/* -** Make sure the cursor p is ready to read or write the row to which it -** was last positioned. Return an error code if an OOM fault or I/O error -** prevents us from positioning the cursor to its correct position. -** -** If a MoveTo operation is pending on the given cursor, then do that -** MoveTo now. If no move is pending, check to see if the row has been -** deleted out from under the cursor and if it has, mark the row as -** a NULL row. -** -** If the cursor is already pointing to the correct row and that row has -** not been deleted out from under the cursor, then this routine is a no-op. -*/ -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){ - VdbeCursor *p = *pp; - assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); - if( p->deferredMoveto ){ - u32 iMap; - assert( !p->isEphemeral ); - if( p->ub.aAltMap && (iMap = p->ub.aAltMap[1+*piCol])>0 && !p->nullRow ){ - *pp = p->pAltCursor; - *piCol = iMap - 1; - return SQLITE_OK; - } - return sqlite3VdbeFinishMoveto(p); - } + assert( p->eCurType==CURTYPE_BTREE || IsNullCursor(p) ); if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ - return handleMovedCursor(p); + return sqlite3VdbeHandleMovedCursor(p); } return SQLITE_OK; } @@ -83393,7 +84369,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){ ** sqlite3VdbeSerialType() ** sqlite3VdbeSerialTypeLen() ** sqlite3VdbeSerialLen() -** sqlite3VdbeSerialPut() +** sqlite3VdbeSerialPut() <--- in-lined into OP_MakeRecord as of 2022-04-02 ** sqlite3VdbeSerialGet() ** ** encapsulate the code that serializes values for storage in SQLite @@ -83505,7 +84481,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ /* ** The sizes for serial types less than 128 */ -static const u8 sqlite3SmallTypeSizes[] = { +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[128] = { /* 0 1 2 3 4 5 6 7 8 9 */ /* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, /* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, @@ -83574,7 +84550,7 @@ SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ ** so we trust him. */ #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -static u64 floatSwap(u64 in){ +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ union { u64 r; u32 i[2]; @@ -83587,59 +84563,8 @@ static u64 floatSwap(u64 in){ u.i[1] = t; return u.r; } -# define swapMixedEndianFloat(X) X = floatSwap(X) -#else -# define swapMixedEndianFloat(X) -#endif +#endif /* SQLITE_MIXED_ENDIAN_64BIT_FLOAT */ -/* -** Write the serialized data blob for the value stored in pMem into -** buf. It is assumed that the caller has allocated sufficient space. -** Return the number of bytes written. -** -** nBuf is the amount of space left in buf[]. The caller is responsible -** for allocating enough space to buf[] to hold the entire field, exclusive -** of the pMem->u.nZero bytes for a MEM_Zero value. -** -** Return the number of bytes actually written into buf[]. The number -** of bytes in the zero-filled tail is included in the return value only -** if those bytes were zeroed in buf[]. -*/ -SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ - u32 len; - - /* Integer and Real */ - if( serial_type<=7 && serial_type>0 ){ - u64 v; - u32 i; - if( serial_type==7 ){ - assert( sizeof(v)==sizeof(pMem->u.r) ); - memcpy(&v, &pMem->u.r, sizeof(v)); - swapMixedEndianFloat(v); - }else{ - v = pMem->u.i; - } - len = i = sqlite3SmallTypeSizes[serial_type]; - assert( i>0 ); - do{ - buf[--i] = (u8)(v&0xFF); - v >>= 8; - }while( i ); - return len; - } - - /* String or blob */ - if( serial_type>=12 ){ - assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) - == (int)sqlite3VdbeSerialTypeLen(serial_type) ); - len = pMem->n; - if( len>0 ) memcpy(buf, pMem->z, len); - return len; - } - - /* NULL or constants 0 or 1 */ - return 0; -} /* Input "x" is a sequence of unsigned characters that represent a ** big-endian integer. Return the equivalent native integer @@ -83805,10 +84730,10 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( ){ UnpackedRecord *p; /* Unpacked record to return */ int nByte; /* Number of bytes required for *p */ - nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); + nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( !p ) return 0; - p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; + p->aMem = (Mem*)&((char*)p)[ROUND8P(sizeof(UnpackedRecord))]; assert( pKeyInfo->aSortFlags!=0 ); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; @@ -84044,8 +84969,8 @@ static int vdbeCompareMemString( }else{ rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); } - sqlite3VdbeMemRelease(&c1); - sqlite3VdbeMemRelease(&c2); + sqlite3VdbeMemReleaseMalloc(&c1); + sqlite3VdbeMemReleaseMalloc(&c2); return rc; } } @@ -84306,14 +85231,22 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( ** two elements in the keys are equal. Fix the various stack variables so ** that this routine begins comparing at the second field. */ if( bSkip ){ - u32 s1; - idx1 = 1 + getVarint32(&aKey1[1], s1); + u32 s1 = aKey1[1]; + if( s1<0x80 ){ + idx1 = 2; + }else{ + idx1 = 1 + sqlite3GetVarint32(&aKey1[1], &s1); + } szHdr1 = aKey1[0]; d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); i = 1; pRhs++; }else{ - idx1 = getVarint32(aKey1, szHdr1); + if( (szHdr1 = aKey1[0])<0x80 ){ + idx1 = 1; + }else{ + idx1 = sqlite3GetVarint32(aKey1, &szHdr1); + } d1 = szHdr1; i = 0; } @@ -84569,7 +85502,8 @@ static int vdbeRecordCompareInt( return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); } - v = pPKey2->aMem[0].u.i; + assert( pPKey2->u.i == pPKey2->aMem[0].u.i ); + v = pPKey2->u.i; if( v>lhs ){ res = pPKey2->r1; }else if( vaMem[0].flags & MEM_Str ); + assert( pPKey2->aMem[0].n == pPKey2->n ); + assert( pPKey2->aMem[0].z == pPKey2->u.z ); vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); - serial_type = (u8)(aKey1[1]); - if( serial_type >= 0x80 ){ - sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); - } + serial_type = (signed char)(aKey1[1]); + +vrcs_restart: if( serial_type<12 ){ + if( serial_type<0 ){ + sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); + if( serial_type>=12 ) goto vrcs_restart; + assert( CORRUPT_DB ); + } res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ }else if( !(serial_type & 0x01) ){ res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ @@ -84623,15 +85563,15 @@ static int vdbeRecordCompareString( pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ } - nCmp = MIN( pPKey2->aMem[0].n, nStr ); - res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); + nCmp = MIN( pPKey2->n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->u.z, nCmp); if( res>0 ){ res = pPKey2->r2; }else if( res<0 ){ res = pPKey2->r1; }else{ - res = nStr - pPKey2->aMem[0].n; + res = nStr - pPKey2->n; if( res==0 ){ if( pPKey2->nField>1 ){ res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); @@ -84686,6 +85626,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ p->r2 = 1; } if( (flags & MEM_Int) ){ + p->u.i = p->aMem[0].u.i; return vdbeRecordCompareInt; } testcase( flags & MEM_Real ); @@ -84695,6 +85636,8 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ && p->pKeyInfo->aColl[0]==0 ){ assert( flags & MEM_Str ); + p->u.z = p->aMem[0].z; + p->n = p->aMem[0].n; return vdbeRecordCompareString; } } @@ -84767,14 +85710,14 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ /* Fetch the integer off the end of the index record */ sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v); *rowid = v.u.i; - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_OK; /* Jump here if database corruption is detected after m has been ** allocated. Free the m object and return SQLITE_CORRUPT. */ idx_rowid_corruption: testcase( m.szMalloc!=0 ); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_CORRUPT_BKPT; } @@ -84816,7 +85759,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( return rc; } *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_OK; } @@ -84983,7 +85926,7 @@ static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ int i; for(i=0; iaMem[i]; - if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem); + if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem); } sqlite3DbFreeNN(db, p); } @@ -85410,6 +86353,9 @@ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ sqlite3ValueFree(pNew); pNew = 0; } + }else if( pNew->flags & MEM_Null ){ + /* Do not duplicate pointer values */ + pNew->flags &= ~(MEM_Term|MEM_Subtype); } return pNew; } @@ -85440,7 +86386,8 @@ static void setResultStrOrError( u8 enc, /* Encoding of z. 0 for BLOBs */ void (*xDel)(void*) /* Destructor function */ ){ - int rc = sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel); + Mem *pOut = pCtx->pOut; + int rc = sqlite3VdbeMemSetStr(pOut, z, n, enc, xDel); if( rc ){ if( rc==SQLITE_TOOBIG ){ sqlite3_result_error_toobig(pCtx); @@ -85450,6 +86397,11 @@ static void setResultStrOrError( assert( rc==SQLITE_NOMEM ); sqlite3_result_error_nomem(pCtx); } + return; + } + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); } } static int invokeValueDestructor( @@ -85593,17 +86545,22 @@ SQLITE_API void sqlite3_result_text16le( } #endif /* SQLITE_OMIT_UTF16 */ SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ + Mem *pOut = pCtx->pOut; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - sqlite3VdbeMemCopy(pCtx->pOut, pValue); + sqlite3VdbeMemCopy(pOut, pValue); + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); + } } SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ - assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n); + sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0); } SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ Mem *pOut = pCtx->pOut; assert( sqlite3_mutex_held(pOut->db->mutex) ); if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(pCtx); return SQLITE_TOOBIG; } #ifndef SQLITE_OMIT_INCRBLOB @@ -85619,8 +86576,8 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; #endif if( pCtx->pOut->flags & MEM_Null ){ - sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, - SQLITE_UTF8, SQLITE_STATIC); + setResultStrOrError(pCtx, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, + SQLITE_STATIC); } } @@ -85694,80 +86651,83 @@ static int sqlite3Step(Vdbe *p){ int rc; assert(p); - if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){ - /* We used to require that sqlite3_reset() be called before retrying - ** sqlite3_step() after any error or after SQLITE_DONE. But beginning - ** with version 3.7.0, we changed this so that sqlite3_reset() would - ** be called automatically instead of throwing the SQLITE_MISUSE error. - ** This "automatic-reset" change is not technically an incompatibility, - ** since any application that receives an SQLITE_MISUSE is broken by - ** definition. - ** - ** Nevertheless, some published applications that were originally written - ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE - ** returns, and those were broken by the automatic-reset change. As a - ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the - ** legacy behavior of returning SQLITE_MISUSE for cases where the - ** previous sqlite3_step() returned something other than a SQLITE_LOCKED - ** or SQLITE_BUSY error. - */ -#ifdef SQLITE_OMIT_AUTORESET - if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ - sqlite3_reset((sqlite3_stmt*)p); - }else{ - return SQLITE_MISUSE_BKPT; - } -#else - sqlite3_reset((sqlite3_stmt*)p); -#endif - } - - /* Check that malloc() has not failed. If it has, return early. */ db = p->db; - if( db->mallocFailed ){ - p->rc = SQLITE_NOMEM; - return SQLITE_NOMEM_BKPT; - } + if( p->eVdbeState!=VDBE_RUN_STATE ){ + restart_step: + if( p->eVdbeState==VDBE_READY_STATE ){ + if( p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same + ** value. + */ + rc = sqlite3VdbeTransferError(p); + } + goto end_of_step; + } - if( p->pc<0 && p->expired ){ - p->rc = SQLITE_SCHEMA; - rc = SQLITE_ERROR; - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ - /* If this statement was prepared using saved SQL and an - ** error has occurred, then return the error code in p->rc to the - ** caller. Set the error code in the database handle to the same value. + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. */ - rc = sqlite3VdbeTransferError(p); - } - goto end_of_step; - } - if( p->pc<0 ){ - /* If there are no other statements currently running, then - ** reset the interrupt flag. This prevents a call to sqlite3_interrupt - ** from interrupting a statement that has not yet started. - */ - if( db->nVdbeActive==0 ){ - AtomicStore(&db->u1.isInterrupted, 0); - } + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } - assert( db->nVdbeWrite>0 || db->autoCommit==0 - || (db->nDeferredCons==0 && db->nDeferredImmCons==0) - ); + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); #ifndef SQLITE_OMIT_TRACE - if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 - && !db->init.busy && p->zSql ){ - sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); - }else{ - assert( p->startTime==0 ); - } + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } #endif - db->nVdbeActive++; - if( p->readOnly==0 ) db->nVdbeWrite++; - if( p->bIsReader ) db->nVdbeRead++; - p->pc = 0; + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + p->eVdbeState = VDBE_RUN_STATE; + }else + + if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** returns, and those were broken by the automatic-reset change. As a + ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the + ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** previous sqlite3_step() returned something other than a SQLITE_LOCKED + ** or SQLITE_BUSY error. + */ +#ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } +#else + sqlite3_reset((sqlite3_stmt*)p); +#endif + assert( p->eVdbeState==VDBE_READY_STATE ); + goto restart_step; + } } + #ifdef SQLITE_DEBUG p->rcApp = SQLITE_OK; #endif @@ -85782,7 +86742,12 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } - if( rc!=SQLITE_ROW ){ + if( rc==SQLITE_ROW ){ + assert( p->rc==SQLITE_OK ); + assert( db->mallocFailed==0 ); + db->errCode = SQLITE_ROW; + return SQLITE_ROW; + }else{ #ifndef SQLITE_OMIT_TRACE /* If the statement completed successfully, invoke the profile callback */ checkProfileCallback(db, p); @@ -85834,7 +86799,6 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ } db = v->db; sqlite3_mutex_enter(db->mutex); - v->doingRerun = 0; while( (rc = sqlite3Step(v))==SQLITE_SCHEMA && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ int savedPc = v->pc; @@ -85860,7 +86824,13 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ break; } sqlite3_reset(pStmt); - if( savedPc>=0 ) v->doingRerun = 1; + if( savedPc>=0 ){ + /* Setting minWriteFileFormat to 254 is a signal to the OP_Init and + ** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because it has + ** already been done once on a prior invocation that failed due to + ** SQLITE_SCHEMA. tag-20220401a */ + v->minWriteFileFormat = 254; + } assert( v->expired==0 ); } sqlite3_mutex_leave(db->mutex); @@ -86169,15 +87139,15 @@ static const Mem *columnNullValue(void){ #endif = { /* .u = */ {0}, + /* .z = */ (char*)0, + /* .n = */ (int)0, /* .flags = */ (u16)MEM_Null, /* .enc = */ (u8)0, /* .eSubtype = */ (u8)0, - /* .n = */ (int)0, - /* .z = */ (char*)0, - /* .zMalloc = */ (char*)0, + /* .db = */ (sqlite3*)0, /* .szMalloc = */ (int)0, /* .uTemp = */ (u32)0, - /* .db = */ (sqlite3*)0, + /* .zMalloc = */ (char*)0, /* .xDel = */ (void(*)(void*))0, #ifdef SQLITE_DEBUG /* .pScopyFrom = */ (Mem*)0, @@ -86474,7 +87444,7 @@ static int vdbeUnbind(Vdbe *p, int i){ return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(p->db->mutex); - if( p->iVdbeMagic!=VDBE_MAGIC_RUN || p->pc>=0 ){ + if( p->eVdbeState!=VDBE_READY_STATE ){ sqlite3Error(p->db, SQLITE_MISUSE); sqlite3_mutex_leave(p->db->mutex); sqlite3_log(SQLITE_MISUSE, @@ -86827,7 +87797,7 @@ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ */ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ Vdbe *v = (Vdbe*)pStmt; - return v!=0 && v->iVdbeMagic==VDBE_MAGIC_RUN && v->pc>=0; + return v!=0 && v->eVdbeState==VDBE_RUN_STATE; } /* @@ -86873,8 +87843,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ sqlite3_mutex_enter(db->mutex); v = 0; db->pnBytesFreed = (int*)&v; - sqlite3VdbeClearObject(db, pVdbe); - sqlite3DbFree(db, pVdbe); + sqlite3VdbeDelete(pVdbe); db->pnBytesFreed = 0; sqlite3_mutex_leave(db->mutex); }else{ @@ -87667,12 +88636,12 @@ static VdbeCursor *allocateCursor( int nByte; VdbeCursor *pCx = 0; nByte = - ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ - sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); + sqlite3VdbeFreeCursorNN(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -87702,7 +88671,7 @@ static VdbeCursor *allocateCursor( pCx->aOffset = &pCx->aType[nField]; if( eCurType==CURTYPE_BTREE ){ pCx->uc.pCursor = (BtCursor*) - &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; + &pMem->z[ROUND8P(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; sqlite3BtreeCursorZero(pCx->uc.pCursor); } return pCx; @@ -88141,7 +89110,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( #endif /*** INSERT STACK UNION HERE ***/ - assert( p->iVdbeMagic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ + assert( p->eVdbeState==VDBE_RUN_STATE ); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( db->xProgress ){ @@ -88384,26 +89353,39 @@ case OP_Gosub: { /* jump */ pIn1->flags = MEM_Int; pIn1->u.i = (int)(pOp-aOp); REGISTER_TRACE(pOp->p1, pIn1); - - /* Most jump operations do a goto to this spot in order to update - ** the pOp pointer. */ -jump_to_p2: - assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ - assert( pOp->p2nOp ); /* Jumps must be in range */ - pOp = &aOp[pOp->p2 - 1]; - break; + goto jump_to_p2_and_check_for_interrupt; } -/* Opcode: Return P1 * * * * +/* Opcode: Return P1 P2 P3 * * +** +** Jump to the address stored in register P1. If P1 is a return address +** register, then this accomplishes a return from a subroutine. +** +** If P3 is 1, then the jump is only taken if register P1 holds an integer +** values, otherwise execution falls through to the next opcode, and the +** OP_Return becomes a no-op. If P3 is 0, then register P1 must hold an +** integer or else an assert() is raised. P3 should be set to 1 when +** this opcode is used in combination with OP_BeginSubrtn, and set to 0 +** otherwise. ** -** Jump to the next instruction after the address in register P1. After -** the jump, register P1 becomes undefined. +** The value in register P1 is unchanged by this opcode. +** +** P2 is not used by the byte-code engine. However, if P2 is positive +** and also less than the current address, then the "EXPLAIN" output +** formatter in the CLI will indent all opcodes from the P2 opcode up +** to be not including the current Return. P2 should be the first opcode +** in the subroutine from which this opcode is returning. Thus the P2 +** value is a byte-code indentation hint. See tag-20220407a in +** wherecode.c and shell.c. */ case OP_Return: { /* in1 */ pIn1 = &aMem[pOp->p1]; - assert( pIn1->flags==MEM_Int ); - pOp = &aOp[pIn1->u.i]; - pIn1->flags = MEM_Undefined; + if( pIn1->flags & MEM_Int ){ + if( pOp->p3 ){ VdbeBranchTaken(1, 2); } + pOp = &aOp[pIn1->u.i]; + }else if( ALWAYS(pOp->p3) ){ + VdbeBranchTaken(0, 2); + } break; } @@ -88426,7 +89408,14 @@ case OP_InitCoroutine: { /* jump */ assert( !VdbeMemDynamic(pOut) ); pOut->u.i = pOp->p3 - 1; pOut->flags = MEM_Int; - if( pOp->p2 ) goto jump_to_p2; + if( pOp->p2==0 ) break; + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ + assert( pOp->p2nOp ); /* Jumps must be in range */ + pOp = &aOp[pOp->p2 - 1]; break; } @@ -88528,11 +89517,10 @@ case OP_Halt: { VdbeFrame *pFrame; int pcx; - pcx = (int)(pOp - aOp); #ifdef SQLITE_DEBUG if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } #endif - if( pOp->p1==SQLITE_OK && p->pFrame ){ + if( p->pFrame && pOp->p1==SQLITE_OK ){ /* Halt the sub-program. Return control to the parent frame. */ pFrame = p->pFrame; p->pFrame = pFrame->pParent; @@ -88554,7 +89542,6 @@ case OP_Halt: { } p->rc = pOp->p1; p->errorAction = (u8)pOp->p2; - p->pc = pcx; assert( pOp->p5<=4 ); if( p->rc ){ if( pOp->p5 ){ @@ -88571,6 +89558,7 @@ case OP_Halt: { }else{ sqlite3VdbeError(p, "%s", pOp->p4.z); } + pcx = (int)(pOp - aOp); sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); } rc = sqlite3VdbeHalt(p); @@ -88696,6 +89684,28 @@ case OP_String: { /* out2 */ break; } +/* Opcode: BeginSubrtn * P2 * * * +** Synopsis: r[P2]=NULL +** +** Mark the beginning of a subroutine that can be entered in-line +** or that can be called using OP_Gosub. The subroutine should +** be terminated by an OP_Return instruction that has a P1 operand that +** is the same as the P2 operand to this opcode and that has P3 set to 1. +** If the subroutine is entered in-line, then the OP_Return will simply +** fall through. But if the subroutine is entered using OP_Gosub, then +** the OP_Return will jump back to the first instruction after the OP_Gosub. +** +** This routine works by loading a NULL into the P2 register. When the +** return address register contains a NULL, the OP_Return instruction is +** a no-op that simply falls through to the next instruction (assuming that +** the OP_Return opcode has a P3 value of 1). Thus if the subroutine is +** entered in-line, then the OP_Return will cause in-line execution to +** continue. But if the subroutine is entered via OP_Gosub, then the +** OP_Return will cause a return to the address following the OP_Gosub. +** +** This opcode is identical to OP_Null. It has a different name +** only to make the byte code easier to read and verify. +*/ /* Opcode: Null P1 P2 P3 * * ** Synopsis: r[P2..P3]=NULL ** @@ -88708,6 +89718,7 @@ case OP_String: { /* out2 */ ** NULL values will not compare equal even if SQLITE_NULLEQ is set on ** OP_Ne or OP_Eq. */ +case OP_BeginSubrtn: case OP_Null: { /* out2 */ int cnt; u16 nullFlag; @@ -88838,11 +89849,16 @@ case OP_Move: { break; } -/* Opcode: Copy P1 P2 P3 * * +/* Opcode: Copy P1 P2 P3 * P5 ** Synopsis: r[P2@P3+1]=r[P1@P3+1] ** ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. ** +** If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the +** destination. The 0x0001 bit of P5 indicates that this Copy opcode cannot +** be merged. The 0x0001 bit is used by the query planner and does not +** come into play during query execution. +** ** This instruction makes a deep copy of the value. A duplicate ** is made of any string or blob constant. See also OP_SCopy. */ @@ -88857,6 +89873,9 @@ case OP_Copy: { memAboutToChange(p, pOut); sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); Deephemeralize(pOut); + if( (pOut->flags & MEM_Subtype)!=0 && (pOp->p5 & 0x0002)!=0 ){ + pOut->flags &= ~MEM_Subtype; + } #ifdef SQLITE_DEBUG pOut->pScopyFrom = 0; #endif @@ -88937,45 +89956,32 @@ case OP_FkCheck: { ** the result row. */ case OP_ResultRow: { - Mem *pMem; - int i; assert( p->nResColumn==pOp->p2 ); assert( pOp->p1>0 || CORRUPT_DB ); assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); - /* Invalidate all ephemeral cursor row caches */ p->cacheCtr = (p->cacheCtr + 2)|1; - - /* Make sure the results of the current row are \000 terminated - ** and have an assigned type. The results are de-ephemeralized as - ** a side effect. - */ - pMem = p->pResultSet = &aMem[pOp->p1]; - for(i=0; ip2; i++){ - assert( memIsValid(&pMem[i]) ); - Deephemeralize(&pMem[i]); - assert( (pMem[i].flags & MEM_Ephem)==0 - || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); - sqlite3VdbeMemNulTerminate(&pMem[i]); - REGISTER_TRACE(pOp->p1+i, &pMem[i]); + p->pResultSet = &aMem[pOp->p1]; #ifdef SQLITE_DEBUG - /* The registers in the result will not be used again when the - ** prepared statement restarts. This is because sqlite3_column() - ** APIs might have caused type conversions of made other changes to - ** the register values. Therefore, we can go ahead and break any - ** OP_SCopy dependencies. */ - pMem[i].pScopyFrom = 0; -#endif + { + Mem *pMem = p->pResultSet; + int i; + for(i=0; ip2; i++){ + assert( memIsValid(&pMem[i]) ); + REGISTER_TRACE(pOp->p1+i, &pMem[i]); + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; + } } +#endif if( db->mallocFailed ) goto no_mem; - if( db->mTrace & SQLITE_TRACE_ROW ){ db->trace.xV2(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); } - - - /* Return SQLITE_ROW - */ p->pc = (int)(pOp - aOp) + 1; rc = SQLITE_ROW; goto vdbe_return; @@ -89030,7 +90036,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ + if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ goto no_mem; } MemSetTypeFlag(pOut, MEM_Str); @@ -89042,9 +90048,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); pIn1->flags = flags1; + if( encoding>SQLITE_UTF8 ) nByte &= ~1; pOut->z[nByte]=0; pOut->z[nByte+1] = 0; - pOut->z[nByte+2] = 0; pOut->flags |= MEM_Term; pOut->n = (int)nByte; pOut->enc = encoding; @@ -89489,23 +90495,23 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ assert( (pOp->p5 & SQLITE_AFF_MASK)!=SQLITE_AFF_TEXT || CORRUPT_DB ); /* Common case of comparison of two integers */ if( pIn3->u.i > pIn1->u.i ){ - iCompare = +1; if( sqlite3aGTb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = +1; }else if( pIn3->u.i < pIn1->u.i ){ - iCompare = -1; if( sqlite3aLTb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = -1; }else{ - iCompare = 0; if( sqlite3aEQb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = 0; } VdbeBranchTaken(0, (pOp->p5 & SQLITE_NULLEQ)?2:3); break; @@ -89532,11 +90538,11 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** then the result is always NULL. ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. */ - iCompare = 1; /* Operands are not equal */ VdbeBranchTaken(2,3); if( pOp->p5 & SQLITE_JUMPIFNULL ){ goto jump_to_p2; } + iCompare = 1; /* Operands are not equal */ break; } }else{ @@ -89642,9 +90648,8 @@ case OP_ElseEq: { /* same as TK_ESCAPE, jump */ ** Set the permutation used by the OP_Compare operator in the next ** instruction. The permutation is stored in the P4 operand. ** -** The permutation is only valid until the next OP_Compare that has -** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should -** occur immediately prior to the OP_Compare. +** The permutation is only valid for the next opcode which must be +** an OP_Compare that has the OPFLAG_PERMUTE bit set in P5. ** ** The first integer in the P4 integer array is the length of the array ** and does not become part of the permutation. @@ -89676,6 +90681,8 @@ case OP_Permutation: { ** The comparison is a sort comparison, so NULLs compare equal, ** NULLs are less than numbers, numbers are less than strings, ** and strings are less than blobs. +** +** This opcode must be immediately followed by an OP_Jump opcode. */ case OP_Compare: { int n; @@ -89734,6 +90741,7 @@ case OP_Compare: { break; } } + assert( pOp[1].opcode==OP_Jump ); break; } @@ -89742,8 +90750,11 @@ case OP_Compare: { ** Jump to the instruction at address P1, P2, or P3 depending on whether ** in the most recent OP_Compare instruction the P1 vector was less than ** equal to, or greater than the P2 vector, respectively. +** +** This opcode must immediately follow an OP_Compare opcode. */ case OP_Jump: { /* jump */ + assert( pOp>aOp && pOp[-1].opcode==OP_Compare ); if( iCompare<0 ){ VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1]; }else if( iCompare==0 ){ @@ -90048,7 +91059,7 @@ case OP_Offset: { /* out3 */ #endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ /* Opcode: Column P1 P2 P3 P4 P5 -** Synopsis: r[P3]=PX +** Synopsis: r[P3]=PX cursor P1 column P2 ** ** Interpret the data that cursor P1 points to as a structure built using ** the MakeRecord instruction. (See the MakeRecord opcode for additional @@ -90070,7 +91081,7 @@ case OP_Offset: { /* out3 */ case OP_Column: { u32 p2; /* column number to retrieve */ VdbeCursor *pC; /* The VDBE cursor */ - BtCursor *pCrsr; /* The BTree cursor */ + BtCursor *pCrsr; /* The B-Tree cursor corresponding to pC */ u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ int len; /* The length of the serialized data for the column */ int i; /* Loop counter */ @@ -90084,21 +91095,14 @@ case OP_Column: { Mem *pReg; /* PseudoTable input register */ assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pC = p->apCsr[pOp->p1]; - assert( pC!=0 ); p2 = (u32)pOp->p2; - /* If the cursor cache is stale (meaning it is not currently point at - ** the correct row) then bring it up-to-date by doing the necessary - ** B-Tree seek. */ - rc = sqlite3VdbeCursorMoveto(&pC, &p2); - if( rc ) goto abort_due_to_error; - - assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - pDest = &aMem[pOp->p3]; - memAboutToChange(p, pDest); +op_column_restart: assert( pC!=0 ); - assert( p2<(u32)pC->nField ); + assert( p2<(u32)pC->nField + || (pC->eCurType==CURTYPE_PSEUDO && pC->seekResult==0) ); aOffset = pC->aOffset; assert( aOffset==pC->aType+pC->nField ); assert( pC->eCurType!=CURTYPE_VTAB ); @@ -90107,21 +91111,37 @@ case OP_Column: { if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ if( pC->nullRow ){ - if( pC->eCurType==CURTYPE_PSEUDO ){ + if( pC->eCurType==CURTYPE_PSEUDO && pC->seekResult>0 ){ /* For the special case of as pseudo-cursor, the seekResult field ** identifies the register that holds the record */ - assert( pC->seekResult>0 ); pReg = &aMem[pC->seekResult]; assert( pReg->flags & MEM_Blob ); assert( memIsValid(pReg) ); pC->payloadSize = pC->szRow = pReg->n; pC->aRow = (u8*)pReg->z; }else{ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); sqlite3VdbeMemSetNull(pDest); goto op_column_out; } }else{ pCrsr = pC->uc.pCursor; + if( pC->deferredMoveto ){ + u32 iMap; + assert( !pC->isEphemeral ); + if( pC->ub.aAltMap && (iMap = pC->ub.aAltMap[1+p2])>0 ){ + pC = pC->pAltCursor; + p2 = iMap - 1; + goto op_column_restart; + } + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + }else if( sqlite3BtreeCursorHasMoved(pCrsr) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; + } assert( pC->eCurType==CURTYPE_BTREE ); assert( pCrsr ); assert( sqlite3BtreeCursorIsValid(pCrsr) ); @@ -90129,15 +91149,15 @@ case OP_Column: { pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow); assert( pC->szRow<=pC->payloadSize ); assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */ - if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } } pC->cacheStatus = p->cacheCtr; - pC->iHdrOffset = getVarint32(pC->aRow, aOffset[0]); + if( (aOffset[0] = pC->aRow[0])<0x80 ){ + pC->iHdrOffset = 1; + }else{ + pC->iHdrOffset = sqlite3GetVarint32(pC->aRow, aOffset); + } pC->nHdrParsed = 0; - if( pC->szRowaRow does not have to hold the entire row, but it does at least ** need to cover the header of the record. If pC->aRow does not contain @@ -90177,6 +91197,10 @@ case OP_Column: { testcase( aOffset[0]==0 ); goto op_column_read_header; } + }else if( sqlite3BtreeCursorHasMoved(pC->uc.pCursor) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; } /* Make sure at least the first p2+1 entries of the header have been @@ -90245,6 +91269,8 @@ case OP_Column: { ** columns. So the result will be either the default value or a NULL. */ if( pC->nHdrParsed<=p2 ){ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); if( pOp->p4type==P4_MEM ){ sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); }else{ @@ -90262,6 +91288,8 @@ case OP_Column: { */ assert( p2nHdrParsed ); assert( rc==SQLITE_OK ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); assert( sqlite3VdbeCheckMemInvariants(pDest) ); if( VdbeMemDynamic(pDest) ){ sqlite3VdbeMemSetNull(pDest); @@ -90282,6 +91310,7 @@ case OP_Column: { pDest->n = len = (t-12)/2; pDest->enc = encoding; if( pDest->szMalloc < len+2 ){ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; pDest->flags = MEM_Null; if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; }else{ @@ -90314,6 +91343,7 @@ case OP_Column: { */ sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); }else{ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); if( rc!=SQLITE_OK ) goto abort_due_to_error; sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); @@ -90526,7 +91556,6 @@ case OP_MakeRecord: { Mem *pLast; /* Last field of the record */ int nField; /* Number of fields in the record */ char *zAffinity; /* The affinity string for the record */ - int file_format; /* File format to use for encoding */ u32 len; /* Length of a field */ u8 *zHdr; /* Where to write next byte of the header */ u8 *zPayload; /* Where to write next byte of the payload */ @@ -90555,7 +91584,6 @@ case OP_MakeRecord: { pData0 = &aMem[nField]; nField = pOp->p2; pLast = &pData0[nField-1]; - file_format = p->minWriteFileFormat; /* Identify the output register */ assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); @@ -90657,7 +91685,7 @@ case OP_MakeRecord: { testcase( uu==2147483647 ); testcase( uu==2147483648LL ); testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); if( uu<=127 ){ - if( (i&1)==i && file_format>=4 ){ + if( (i&1)==i && p->minWriteFileFormat>=4 ){ pRec->uTemp = 8+(u32)uu; }else{ nData++; @@ -90762,18 +91790,60 @@ case OP_MakeRecord: { zPayload = zHdr + nHdr; /* Write the record */ - zHdr += putVarint32(zHdr, nHdr); + if( nHdr<0x80 ){ + *(zHdr++) = nHdr; + }else{ + zHdr += sqlite3PutVarint(zHdr,nHdr); + } assert( pData0<=pLast ); pRec = pData0; - do{ + while( 1 /*exit-by-break*/ ){ serial_type = pRec->uTemp; /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more - ** additional varints, one per column. */ - zHdr += putVarint32(zHdr, serial_type); /* serial type */ - /* EVIDENCE-OF: R-64536-51728 The values for each column in the record + ** additional varints, one per column. + ** EVIDENCE-OF: R-64536-51728 The values for each column in the record ** immediately follow the header. */ - zPayload += sqlite3VdbeSerialPut(zPayload, pRec, serial_type); /* content */ - }while( (++pRec)<=pLast ); + if( serial_type<=7 ){ + *(zHdr++) = serial_type; + if( serial_type==0 ){ + /* NULL value. No change in zPayload */ + }else{ + u64 v; + u32 i; + if( serial_type==7 ){ + assert( sizeof(v)==sizeof(pRec->u.r) ); + memcpy(&v, &pRec->u.r, sizeof(v)); + swapMixedEndianFloat(v); + }else{ + v = pRec->u.i; + } + len = i = sqlite3SmallTypeSizes[serial_type]; + assert( i>0 ); + while( 1 /*exit-by-break*/ ){ + zPayload[--i] = (u8)(v&0xFF); + if( i==0 ) break; + v >>= 8; + } + zPayload += len; + } + }else if( serial_type<0x80 ){ + *(zHdr++) = serial_type; + if( serial_type>=14 && pRec->n>0 ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + }else{ + zHdr += sqlite3PutVarint(zHdr, serial_type); + if( pRec->n ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + } + if( pRec==pLast ) break; + pRec++; + } assert( nHdr==(int)(zHdr - (u8*)pOut->z) ); assert( nByte==(int)(zPayload - (u8*)pOut->z) ); @@ -90992,7 +92062,10 @@ case OP_Savepoint: { } } if( rc ) goto abort_due_to_error; - + if( p->eVdbeState==VDBE_HALT_STATE ){ + rc = SQLITE_DONE; + goto vdbe_return; + } break; } @@ -91096,6 +92169,7 @@ case OP_AutoCommit: { */ case OP_Transaction: { Btree *pBt; + Db *pDb; int iMeta = 0; assert( p->bIsReader ); @@ -91115,7 +92189,8 @@ case OP_Transaction: { } goto abort_due_to_error; } - pBt = db->aDb[pOp->p1].pBt; + pDb = &db->aDb[pOp->p1]; + pBt = pDb->pBt; if( pBt ){ rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta); @@ -91156,8 +92231,7 @@ case OP_Transaction: { assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); if( rc==SQLITE_OK && pOp->p5 - && (iMeta!=pOp->p3 - || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) + && (iMeta!=pOp->p3 || pDb->pSchema->iGeneration!=pOp->p4.i) ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema @@ -91184,6 +92258,11 @@ case OP_Transaction: { } p->expired = 1; rc = SQLITE_SCHEMA; + + /* Set changeCntOn to 0 to prevent the value returned by sqlite3_changes() + ** from being modified in sqlite3VdbeHalt(). If this statement is + ** reprepared, changeCntOn will be set again. */ + p->changeCntOn = 0; } if( rc ) goto abort_due_to_error; break; @@ -91250,7 +92329,7 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = pOp->p3 - pOp->p5; + *(u32*)&pDb->pSchema->schema_cookie = *(u32*)&pOp->p3 - pOp->p5; db->mDbFlags |= DBFLAG_SchemaChange; sqlite3FkClearTriggerCache(db, pOp->p1); }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -91483,8 +92562,8 @@ case OP_OpenDup: { pCx->pgnoRoot = pOrig->pgnoRoot; pCx->isOrdered = pOrig->isOrdered; pCx->ub.pBtx = pOrig->ub.pBtx; - pCx->hasBeenDuped = 1; - pOrig->hasBeenDuped = 1; + pCx->noReuse = 1; + pOrig->noReuse = 1; rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor @@ -91551,7 +92630,7 @@ case OP_OpenEphemeral: { aMem[pOp->p3].z = ""; } pCx = p->apCsr[pOp->p1]; - if( pCx && !pCx->hasBeenDuped && ALWAYS(pOp->p2<=pCx->nField) ){ + if( pCx && !pCx->noReuse && ALWAYS(pOp->p2<=pCx->nField) ){ /* If the ephermeral table is already open and has no duplicates from ** OP_OpenDup, then erase all existing content so that the table is ** empty again, rather than creating a new table. */ @@ -92300,11 +93379,8 @@ case OP_NoConflict: /* jump, in3 */ case OP_NotFound: /* jump, in3 */ case OP_Found: { /* jump, in3 */ int alreadyExists; - int takeJump; int ii; VdbeCursor *pC; - int res; - UnpackedRecord *pFree; UnpackedRecord *pIdxKey; UnpackedRecord r; @@ -92319,14 +93395,15 @@ case OP_Found: { /* jump, in3 */ #ifdef SQLITE_DEBUG pC->seekOp = pOp->opcode; #endif - pIn3 = &aMem[pOp->p3]; + r.aMem = &aMem[pOp->p3]; assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->uc.pCursor!=0 ); assert( pC->isTable==0 ); - if( pOp->p4.i>0 ){ + r.nField = (u16)pOp->p4.i; + if( r.nField>0 ){ + /* Key values in an array of registers */ r.pKeyInfo = pC->pKeyInfo; - r.nField = (u16)pOp->p4.i; - r.aMem = pIn3; + r.default_rc = 0; #ifdef SQLITE_DEBUG for(ii=0; iip3+ii, &r.aMem[ii]); } #endif - pIdxKey = &r; - pFree = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &pC->seekResult); }else{ - assert( pIn3->flags & MEM_Blob ); - rc = ExpandBlob(pIn3); + /* Composite key generated by OP_MakeRecord */ + assert( r.aMem->flags & MEM_Blob ); + assert( pOp->opcode!=OP_NoConflict ); + rc = ExpandBlob(r.aMem); assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); if( rc ) goto no_mem; - pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); if( pIdxKey==0 ) goto no_mem; - sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); + sqlite3VdbeRecordUnpack(pC->pKeyInfo, r.aMem->n, r.aMem->z, pIdxKey); + pIdxKey->default_rc = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &pC->seekResult); + sqlite3DbFreeNN(db, pIdxKey); } - pIdxKey->default_rc = 0; - takeJump = 0; - if( pOp->opcode==OP_NoConflict ){ - /* For the OP_NoConflict opcode, take the jump if any of the - ** input fields are NULL, since any key with a NULL will not - ** conflict */ - for(ii=0; iinField; ii++){ - if( pIdxKey->aMem[ii].flags & MEM_Null ){ - takeJump = 1; - break; - } - } - } - rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &res); - if( pFree ) sqlite3DbFreeNN(db, pFree); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } - pC->seekResult = res; - alreadyExists = (res==0); + alreadyExists = (pC->seekResult==0); pC->nullRow = 1-alreadyExists; pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; @@ -92372,9 +93437,25 @@ case OP_Found: { /* jump, in3 */ VdbeBranchTaken(alreadyExists!=0,2); if( alreadyExists ) goto jump_to_p2; }else{ - VdbeBranchTaken(takeJump||alreadyExists==0,2); - if( takeJump || !alreadyExists ) goto jump_to_p2; - if( pOp->opcode==OP_IfNoHope ) pC->seekHit = pOp->p4.i; + if( !alreadyExists ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + } + if( pOp->opcode==OP_NoConflict ){ + /* For the OP_NoConflict opcode, take the jump if any of the + ** input fields are NULL, since any key with a NULL will not + ** conflict */ + for(ii=0; iiopcode==OP_IfNoHope ){ + pC->seekHit = pOp->p4.i; + } } break; } @@ -93065,7 +94146,7 @@ case OP_RowData: { } /* Opcode: Rowid P1 P2 * * * -** Synopsis: r[P2]=rowid +** Synopsis: r[P2]=PX rowid of P1 ** ** Store in register P2 an integer which is the key of the table entry that ** P1 is currently point to. @@ -93121,16 +94202,24 @@ case OP_Rowid: { /* out2 */ ** that occur while the cursor is on the null row will always ** write a NULL. ** -** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo) -** just reset the cache for that cursor. This causes the row of -** content held by the pseudo-cursor to be reparsed. +** If cursor P1 is not previously opened, open it now to a special +** pseudo-cursor that always returns NULL for every column. */ case OP_NullRow: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; - assert( pC!=0 ); + if( pC==0 ){ + /* If the cursor is not already open, create a special kind of + ** pseudo-cursor that always gives null rows. */ + pC = allocateCursor(p, pOp->p1, 1, CURTYPE_PSEUDO); + if( pC==0 ) goto no_mem; + pC->seekResult = 0; + pC->isTable = 1; + pC->noReuse = 1; + pC->uc.pCursor = sqlite3BtreeFakeValidCursor(); + } pC->nullRow = 1; pC->cacheStatus = CACHE_STALE; if( pC->eCurType==CURTYPE_BTREE ){ @@ -93303,7 +94392,7 @@ case OP_Rewind: { /* jump */ break; } -/* Opcode: Next P1 P2 P3 P4 P5 +/* Opcode: Next P1 P2 P3 * P5 ** ** Advance cursor P1 so that it points to the next key/data pair in its ** table or index. If there are no more key/value pairs then fall through @@ -93322,15 +94411,12 @@ case OP_Rewind: { /* jump */ ** omitted if that index had been unique. P3 is usually 0. P3 is ** always either 0 or 1. ** -** P4 is always of type P4_ADVANCE. The function pointer points to -** sqlite3BtreeNext(). -** ** If P5 is positive and the jump is taken, then event counter ** number P5-1 in the prepared statement is incremented. ** ** See also: Prev */ -/* Opcode: Prev P1 P2 P3 P4 P5 +/* Opcode: Prev P1 P2 P3 * P5 ** ** Back up cursor P1 so that it points to the previous key/data pair in its ** table or index. If there is no previous key/value pairs then fall through @@ -93350,9 +94436,6 @@ case OP_Rewind: { /* jump */ ** omitted if that index had been unique. P3 is usually 0. P3 is ** always either 0 or 1. ** -** P4 is always of type P4_ADVANCE. The function pointer points to -** sqlite3BtreePrevious(). -** ** If P5 is positive and the jump is taken, then event counter ** number P5-1 in the prepared statement is incremented. */ @@ -93370,30 +94453,33 @@ case OP_SorterNext: { /* jump */ assert( isSorter(pC) ); rc = sqlite3VdbeSorterNext(db, pC); goto next_tail; + case OP_Prev: /* jump */ -case OP_Next: /* jump */ assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pOp->p5aCounter) ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->deferredMoveto==0 ); assert( pC->eCurType==CURTYPE_BTREE ); - assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); - assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); + assert( pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope + || pC->seekOp==OP_NullRow); + rc = sqlite3BtreePrevious(pC->uc.pCursor, pOp->p3); + goto next_tail; - /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found. - ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ - assert( pOp->opcode!=OP_Next - || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE +case OP_Next: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid || pC->seekOp==OP_IfNoHope); - assert( pOp->opcode!=OP_Prev - || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE - || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope - || pC->seekOp==OP_NullRow); + rc = sqlite3BtreeNext(pC->uc.pCursor, pOp->p3); - rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); next_tail: pC->cacheStatus = CACHE_STALE; VdbeBranchTaken(rc==SQLITE_OK,2); @@ -93580,9 +94666,9 @@ case OP_IdxRowid: { /* out2 */ assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->eCurType==CURTYPE_BTREE || IsNullCursor(pC) ); assert( pC->uc.pCursor!=0 ); - assert( pC->isTable==0 ); + assert( pC->isTable==0 || IsNullCursor(pC) ); assert( pC->deferredMoveto==0 ); assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); @@ -93611,6 +94697,7 @@ case OP_IdxRowid: { /* out2 */ pTabCur->nullRow = 0; pTabCur->movetoTarget = rowid; pTabCur->deferredMoveto = 1; + pTabCur->cacheStatus = CACHE_STALE; assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); assert( !pTabCur->isEphemeral ); pTabCur->ub.aAltMap = pOp->p4.ai; @@ -93745,7 +94832,7 @@ case OP_IdxGE: { /* jump */ rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); if( rc ) goto abort_due_to_error; res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, &r, 0); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); } /* End of inlined sqlite3VdbeIdxKeyCompare() */ @@ -94626,6 +95713,7 @@ case OP_AggStep: { pCtx->pVdbe = p; pCtx->skipFlag = 0; pCtx->isError = 0; + pCtx->enc = encoding; pCtx->argc = n; pOp->p4type = P4_FUNCCTX; pOp->p4.pCtx = pCtx; @@ -94755,9 +95843,6 @@ case OP_AggFinal: { } sqlite3VdbeChangeEncoding(pMem, encoding); UPDATE_MAX_BLOBSIZE(pMem); - if( sqlite3VdbeMemTooBig(pMem) ){ - goto too_big; - } break; } @@ -95265,7 +96350,6 @@ case OP_VColumn: { VdbeCursor *pCur = p->apCsr[pOp->p1]; assert( pCur!=0 ); - assert( pCur->eCurType==CURTYPE_VTAB ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); @@ -95273,11 +96357,13 @@ case OP_VColumn: { sqlite3VdbeMemSetNull(pDest); break; } + assert( pCur->eCurType==CURTYPE_VTAB ); pVtab = pCur->uc.pVCur->pVtab; pModule = pVtab->pModule; assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; + sContext.enc = encoding; assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); @@ -95296,9 +96382,6 @@ case OP_VColumn: { REGISTER_TRACE(pOp->p3, pDest); UPDATE_MAX_BLOBSIZE(pDest); - if( sqlite3VdbeMemTooBig(pDest) ){ - goto too_big; - } if( rc ) goto abort_due_to_error; break; } @@ -95565,6 +96648,7 @@ case OP_Function: { /* group */ if( pCtx->pOut != pOut ){ pCtx->pVdbe = p; pCtx->pOut = pOut; + pCtx->enc = encoding; for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; } assert( pCtx->pVdbe==p ); @@ -95591,17 +96675,27 @@ case OP_Function: { /* group */ if( rc ) goto abort_due_to_error; } - /* Copy the result of the function into register P3 */ - if( pOut->flags & (MEM_Str|MEM_Blob) ){ - sqlite3VdbeChangeEncoding(pOut, encoding); - if( sqlite3VdbeMemTooBig(pOut) ) goto too_big; - } + assert( (pOut->flags&MEM_Str)==0 + || pOut->enc==encoding + || db->mallocFailed ); + assert( !sqlite3VdbeMemTooBig(pOut) ); REGISTER_TRACE(pOp->p3, pOut); UPDATE_MAX_BLOBSIZE(pOut); break; } +/* Opcode: ClrSubtype P1 * * * * +** Synopsis: r[P1].subtype = 0 +** +** Clear the subtype from register P1. +*/ +case OP_ClrSubtype: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + pIn1->flags &= ~MEM_Subtype; + break; +} + /* Opcode: FilterAdd P1 * P3 P4 * ** Synopsis: filter(P1) += key(P3@P4) ** @@ -95721,7 +96815,7 @@ case OP_Init: { /* jump */ #ifndef SQLITE_OMIT_TRACE if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 - && !p->doingRerun + && p->minWriteFileFormat!=254 /* tag-20220401a */ && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ #ifndef SQLITE_OMIT_DEPRECATED @@ -95950,7 +97044,7 @@ default: { /* This is really OP_Noop, OP_Explain */ testcase( sqlite3GlobalConfig.xLog!=0 ); sqlite3_log(rc, "statement aborts at %d: [%s] %s", (int)(pOp - aOp), p->zSql, p->zErrMsg); - sqlite3VdbeHalt(p); + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){ db->flags |= SQLITE_CorruptRdOnly; @@ -100512,51 +101606,24 @@ static void resolveAlias( sqlite3ExprDelete(db, pDup); pDup = 0; }else{ + Expr temp; incrAggFunctionDepth(pDup, nSubquery); if( pExpr->op==TK_COLLATE ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - - /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This - ** prevents ExprDelete() from deleting the Expr structure itself, - ** allowing it to be repopulated by the memcpy() on the following line. - ** The pExpr->u.zToken might point into memory that will be freed by the - ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to - ** make a copy of the token before doing the sqlite3DbFree(). - */ - ExprSetProperty(pExpr, EP_Static); - sqlite3ExprDelete(db, pExpr); - memcpy(pExpr, pDup, sizeof(*pExpr)); - if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ - assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); - pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); - pExpr->flags |= EP_MemToken; - } + memcpy(&temp, pDup, sizeof(Expr)); + memcpy(pDup, pExpr, sizeof(Expr)); + memcpy(pExpr, &temp, sizeof(Expr)); if( ExprHasProperty(pExpr, EP_WinFunc) ){ if( ALWAYS(pExpr->y.pWin!=0) ){ pExpr->y.pWin->pOwner = pExpr; } } - sqlite3DbFree(db, pDup); - } -} - - -/* -** Return TRUE if the name zCol occurs anywhere in the USING clause. -** -** Return FALSE if the USING clause is NULL or if it does not contain -** zCol. -*/ -static int nameInUsingClause(IdList *pUsing, const char *zCol){ - if( pUsing ){ - int k; - for(k=0; knId; k++){ - if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1; - } + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprDelete, + pDup); } - return 0; } /* @@ -100574,7 +101641,7 @@ SQLITE_PRIVATE int sqlite3MatchEName( ){ int n; const char *zSpan; - if( pItem->eEName!=ENAME_TAB ) return 0; + if( pItem->fg.eEName!=ENAME_TAB ) return 0; zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ @@ -100635,6 +101702,29 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ } } +/* +** Create a new expression term for the column specified by pMatch and +** iColumn. Append this new expression term to the FULL JOIN Match set +** in *ppList. Create a new *ppList if this is the first term in the +** set. +*/ +static void extendFJMatch( + Parse *pParse, /* Parsing context */ + ExprList **ppList, /* ExprList to extend */ + SrcItem *pMatch, /* Source table containing the column */ + i16 iColumn /* The column number */ +){ + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pNew ){ + pNew->iTable = pMatch->iCursor; + pNew->iColumn = iColumn; + pNew->y.pTab = pMatch->pTab; + assert( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ); + ExprSetProperty(pNew, EP_CanBeNull); + *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew); + } +} + /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr @@ -100680,11 +101770,13 @@ static int lookupName( NameContext *pTopNC = pNC; /* First namecontext in the list */ Schema *pSchema = 0; /* Schema of the expression */ int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ - Table *pTab = 0; /* Table hold the row */ + Table *pTab = 0; /* Table holding the row */ Column *pCol; /* A column of pTab */ + ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */ assert( pNC ); /* the name context cannot be NULL. */ assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ + assert( zDb==0 || zTab!=0 ); assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); /* Initialize the node to no-match */ @@ -100733,26 +101825,65 @@ static int lookupName( pTab = pItem->pTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 || pParse->nErr ); - if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + /* In this case, pItem is a subquery that has been formed from a + ** parenthesized subset of the FROM clause terms. Example: + ** .... FROM t1 LEFT JOIN (t2 RIGHT JOIN t3 USING(x)) USING(y) ... + ** \_________________________/ + ** This pItem -------------^ + */ int hit = 0; + assert( pItem->pSelect!=0 ); pEList = pItem->pSelect->pEList; + assert( pEList!=0 ); + assert( pEList->nExpr==pTab->nCol ); for(j=0; jnExpr; j++){ - if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ - cnt++; - cntTab = 2; - pMatch = pItem; - pExpr->iColumn = j; - hit = 1; + if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ + continue; } + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } + } + cnt++; + cntTab = 2; + pMatch = pItem; + pExpr->iColumn = j; + pEList->a[j].fg.bUsed = 1; + hit = 1; + if( pEList->a[j].fg.bUsingTerm ) break; } if( hit || zTab==0 ) continue; } - if( zDb ){ - if( pTab->pSchema!=pSchema ) continue; - if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; - } + assert( zDb==0 || zTab!=0 ); if( zTab ){ - const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; + const char *zTabName; + if( zDb ){ + if( pTab->pSchema!=pSchema ) continue; + if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; + } + zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; assert( zTabName!=0 ); if( sqlite3StrICmp(zTabName, zTab)!=0 ){ continue; @@ -100767,18 +101898,37 @@ static int lookupName( if( pCol->hName==hCol && sqlite3StrICmp(pCol->zCnName, zCol)==0 ){ - /* If there has been exactly one prior match and this match - ** is for the right-hand table of a NATURAL JOIN or is in a - ** USING clause, then skip this match. - */ - if( cnt==1 ){ - if( pItem->fg.jointype & JT_NATURAL ) continue; - if( nameInUsingClause(pItem->pUsing, zCol) ) continue; + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } } cnt++; pMatch = pItem; /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + if( pItem->fg.isNestedFrom ){ + sqlite3SrcItemColumnUsed(pItem, j); + } break; } } @@ -100791,9 +101941,7 @@ static int lookupName( pExpr->iTable = pMatch->iCursor; assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pMatch->pTab; - /* RIGHT JOIN not (yet) supported */ - assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); - if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ + if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } pSchema = pExpr->y.pTab->pSchema; @@ -100947,7 +102095,7 @@ static int lookupName( assert( pEList!=0 ); for(j=0; jnExpr; j++){ char *zAs = pEList->a[j].zEName; - if( pEList->a[j].eEName==ENAME_NAME + if( pEList->a[j].fg.eEName==ENAME_NAME && sqlite3_stricmp(zAs, zCol)==0 ){ Expr *pOrig; @@ -101034,11 +102182,37 @@ static int lookupName( } /* - ** cnt==0 means there was not match. cnt>1 means there were two or - ** more matches. Either way, we have an error. + ** cnt==0 means there was not match. + ** cnt>1 means there were two or more matches. + ** + ** cnt==0 is always an error. cnt>1 is often an error, but might + ** be multiple matches for a NATURAL LEFT JOIN or a LEFT JOIN USING. */ + assert( pFJMatch==0 || cnt>0 ); + assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); if( cnt!=1 ){ const char *zErr; + if( pFJMatch ){ + if( pFJMatch->nExpr==cnt-1 ){ + if( ExprHasProperty(pExpr,EP_Leaf) ){ + ExprClearProperty(pExpr,EP_Leaf); + }else{ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + } + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + pExpr->op = TK_FUNCTION; + pExpr->u.zToken = "coalesce"; + pExpr->x.pList = pFJMatch; + cnt = 1; + goto lookupname_end; + }else{ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + } + } zErr = cnt==0 ? "no such column" : "ambiguous column name"; if( zDb ){ sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); @@ -101051,6 +102225,16 @@ static int lookupName( pParse->checkSchema = 1; pTopNC->nNcErr++; } + assert( pFJMatch==0 ); + + /* Remove all substructure from pExpr */ + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + ExprSetProperty(pExpr, EP_Leaf); + } /* If a column from a table in pSrcList is referenced, then record ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes @@ -101070,16 +102254,7 @@ static int lookupName( pMatch->colUsed |= sqlite3ExprColUsed(pExpr); } - /* Clean up and return - */ - if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ - sqlite3ExprDelete(db, pExpr->pLeft); - pExpr->pLeft = 0; - sqlite3ExprDelete(db, pExpr->pRight); - pExpr->pRight = 0; - } pExpr->op = eNewExprOp; - ExprSetProperty(pExpr, EP_Leaf); lookupname_end: if( cnt==1 ){ assert( pNC!=0 ); @@ -101264,7 +102439,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } sqlite3WalkExpr(pWalker, pExpr->pLeft); if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ - testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + testcase( ExprHasProperty(pExpr, EP_OuterON) ); assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->op==TK_NOTNULL ){ pExpr->u.zToken = "true"; @@ -101673,7 +102848,7 @@ static int resolveAsName( assert( !ExprHasProperty(pE, EP_IntValue) ); zCol = pE->u.zToken; for(i=0; inExpr; i++){ - if( pEList->a[i].eEName==ENAME_NAME + if( pEList->a[i].fg.eEName==ENAME_NAME && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 ){ return i+1; @@ -101794,7 +102969,7 @@ static int resolveCompoundOrderBy( return 1; } for(i=0; inExpr; i++){ - pOrderBy->a[i].done = 0; + pOrderBy->a[i].fg.done = 0; } pSelect->pNext = 0; while( pSelect->pPrior ){ @@ -101809,7 +102984,7 @@ static int resolveCompoundOrderBy( for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ int iCol = -1; Expr *pE, *pDup; - if( pItem->done ) continue; + if( pItem->fg.done ) continue; pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); if( NEVER(pE==0) ) continue; if( sqlite3ExprIsInteger(pE, &iCol) ){ @@ -101862,7 +103037,7 @@ static int resolveCompoundOrderBy( sqlite3ExprDelete(db, pE); pItem->u.x.iOrderByCol = (u16)iCol; } - pItem->done = 1; + pItem->fg.done = 1; }else{ moreToDo = 1; } @@ -101870,7 +103045,7 @@ static int resolveCompoundOrderBy( pSelect = pSelect->pNext; } for(i=0; inExpr; i++){ - if( pOrderBy->a[i].done==0 ){ + if( pOrderBy->a[i].fg.done==0 ){ sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " "column in the result set", i+1); return 1; @@ -102160,8 +103335,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ sNC.uNC.pEList = p->pEList; sNC.ncFlags |= NC_UEList; if( p->pHaving ){ - if( !pGroupBy ){ - sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + if( (p->selFlags & SF_Aggregate)==0 ){ + sqlite3ErrorMsg(pParse, "HAVING clause on a non-aggregate query"); return WRC_Abort; } if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; @@ -103555,6 +104730,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } + assert( !ExprHasProperty(pNew, EP_InnerON|EP_OuterON) ); pNew->w.iOfst = (int)(pToken->z - pParse->zTail); if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] @@ -103735,6 +104911,18 @@ SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ if( p ) sqlite3ExprDeleteNN(db, p); } +/* +** Clear both elements of an OnOrUsing object +*/ +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ + if( p==0 ){ + /* Nothing to clear */ + }else if( p->pOn ){ + sqlite3ExprDeleteNN(db, p->pOn); + }else if( p->pUsing ){ + sqlite3IdListDelete(db, p->pUsing); + } +} /* ** Arrange to cause pExpr to be deleted when the pParse is deleted. @@ -103821,7 +105009,7 @@ static int dupedExprStructSize(const Expr *p, int flags){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); - assert( !ExprHasProperty(p, EP_FromJoin) ); + assert( !ExprHasProperty(p, EP_OuterON) ); assert( !ExprHasProperty(p, EP_MemToken) ); assert( !ExprHasVVAProperty(p, EP_NoReduce) ); if( p->pLeft || p->x.pList ){ @@ -104001,6 +105189,7 @@ SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){ pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); + pRet->a[i].eM10d = p->a[i].eM10d; } } } @@ -104101,11 +105290,8 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int } } pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); - pItem->sortFlags = pOldItem->sortFlags; - pItem->eEName = pOldItem->eEName; - pItem->done = 0; - pItem->bNulls = pOldItem->bNulls; - pItem->bSorterRef = pOldItem->bSorterRef; + pItem->fg = pOldItem->fg; + pItem->fg.done = 0; pItem->u = pOldItem->u; } return pNew; @@ -104157,8 +105343,12 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int fla pTab->nTabRef++; } pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); - pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); - pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); + if( pOldItem->fg.isUsing ){ + assert( pNewItem->fg.isUsing ); + pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing); + }else{ + pNewItem->u3.pOn = sqlite3ExprDup(db, pOldItem->u3.pOn, flags); + } pNewItem->colUsed = pOldItem->colUsed; } return pNew; @@ -104168,22 +105358,16 @@ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){ int i; assert( db!=0 ); if( p==0 ) return 0; - pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + assert( p->eU4!=EU4_EXPR ); + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) ); if( pNew==0 ) return 0; pNew->nId = p->nId; - pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) ); - if( pNew->a==0 ){ - sqlite3DbFreeNN(db, pNew); - return 0; - } - /* Note that because the size of the allocation for p->a[] is not - ** necessarily a power of two, sqlite3IdListAppend() may not be called - ** on the duplicate created by this function. */ + pNew->eU4 = p->eU4; for(i=0; inId; i++){ struct IdList_item *pNewItem = &pNew->a[i]; - struct IdList_item *pOldItem = &p->a[i]; + const struct IdList_item *pOldItem = &p->a[i]; pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pNewItem->idx = pOldItem->idx; + pNewItem->u4 = pOldItem->u4; } return pNew; } @@ -104407,16 +105591,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int ); pItem = &p->a[p->nExpr-1]; - assert( pItem->bNulls==0 ); + assert( pItem->fg.bNulls==0 ); if( iSortOrder==SQLITE_SO_UNDEFINED ){ iSortOrder = SQLITE_SO_ASC; } - pItem->sortFlags = (u8)iSortOrder; + pItem->fg.sortFlags = (u8)iSortOrder; if( eNulls!=SQLITE_SO_UNDEFINED ){ - pItem->bNulls = 1; + pItem->fg.bNulls = 1; if( iSortOrder!=eNulls ){ - pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; + pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL; } } } @@ -104442,7 +105626,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; assert( pItem->zEName==0 ); - assert( pItem->eEName==ENAME_NAME ); + assert( pItem->fg.eEName==ENAME_NAME ); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); if( dequote ){ /* If dequote==0, then pName->z does not point to part of a DDL @@ -104477,7 +105661,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetSpan( assert( pList->nExpr>0 ); if( pItem->zEName==0 ){ pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); - pItem->eEName = ENAME_SPAN; + pItem->fg.eEName = ENAME_SPAN; } } } @@ -104649,9 +105833,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ /* If pWalker->eCode is 2 then any term of the expression that comes from - ** the ON or USING clauses of a left join disqualifies the expression + ** the ON or USING clauses of an outer join disqualifies the expression ** from being considered constant. */ - if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ + if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_OuterON) ){ pWalker->eCode = 0; return WRC_Abort; } @@ -104774,7 +105958,7 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** Check pExpr to see if it is an invariant constraint on data source pSrc. ** This is an optimization. False negatives will perhaps cause slower ** queries, but false positives will yield incorrect answers. So when in -** double, return 0. +** doubt, return 0. ** ** To be an invariant constraint, the following must be true: ** @@ -104782,24 +105966,28 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** ** (2) pExpr cannot use subqueries or non-deterministic functions. ** -** (*) ** Not applicable to this branch ** +** (3) pSrc cannot be part of the left operand for a RIGHT JOIN. +** (Is there some way to relax this constraint?) ** ** (4) If pSrc is the right operand of a LEFT JOIN, then... ** (4a) pExpr must come from an ON clause.. -** (4b) and specifically the ON clause associated with the LEFT JOIN. + (4b) and specifically the ON clause associated with the LEFT JOIN. ** ** (5) If pSrc is not the right operand of a LEFT JOIN or the left ** operand of a RIGHT JOIN, then pExpr must be from the WHERE ** clause, not an ON clause. */ SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){ + if( pSrc->fg.jointype & JT_LTORJ ){ + return 0; /* rule (3) */ + } if( pSrc->fg.jointype & JT_LEFT ){ - if( !ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (4a) */ - if( pExpr->w.iRightJoinTable!=pSrc->iCursor ) return 0; /* rule (4b) */ + if( !ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (4a) */ + if( pExpr->w.iJoin!=pSrc->iCursor ) return 0; /* rule (4b) */ }else{ - if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (5) */ + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (5) */ } - return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ + return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ } @@ -105129,7 +106317,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** all members of the RHS set, skipping duplicates. ** ** A cursor is opened on the b-tree object that is the RHS of the IN operator -** and pX->iTable is set to the index of that cursor. +** and the *piTab parameter is set to the index of that cursor. ** ** The returned value of this function indicates the b-tree type, as follows: ** @@ -105149,7 +106337,10 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** If the RHS of the IN operator is a list or a more complex subquery, then ** an ephemeral table might need to be generated from the RHS and then ** pX->iTable made to point to the ephemeral table instead of an -** existing table. +** existing table. In this case, the creation and initialization of the +** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag +** will be set on pX and the pX->y.sub fields will be set to show where +** the subroutine is coded. ** ** The inFlags parameter must contain, at a minimum, one of the bits ** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains @@ -105210,12 +106401,13 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ - int iTab = pParse->nTab++; /* Cursor of the RHS table */ + int iTab; /* Cursor of the RHS table */ int mustBeUnique; /* True if RHS must be unique */ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ assert( pX->op==TK_IN ); mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + iTab = pParse->nTab++; /* If the RHS of this IN(...) operator is a SELECT, and if it matters ** whether or not the SELECT result contains NULL values, check whether @@ -105381,6 +106573,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex( && ExprUseXList(pX) && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) ){ + pParse->nTab--; /* Back out the allocation of the unused cursor */ + iTab = -1; /* Cursor is not allocated */ eType = IN_INDEX_NOOP; } @@ -105547,6 +106741,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + assert( iTab!=pExpr->iTable ); sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); sqlite3VdbeJumpHere(v, addrOnce); return; @@ -105558,8 +106753,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = - sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; - VdbeComment((v, "return address")); + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } @@ -105661,6 +106855,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** expression we need to rerun this code each time. */ if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce-1); sqlite3VdbeChangeToNoop(v, addrOnce); ExprClearProperty(pExpr, EP_Subrtn); addrOnce = 0; @@ -105681,8 +106876,11 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( sqlite3VdbeJumpHere(v, addrOnce); /* Subroutine return */ assert( ExprUseYSub(pExpr) ); - sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); - sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); sqlite3ClearTempRegCache(pParse); } } @@ -105736,9 +106934,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ExprSetProperty(pExpr, EP_Subrtn); pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = - sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; - VdbeComment((v, "return address")); - + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; /* The evaluation of the EXISTS/SELECT must be repeated every time it ** is encountered if any of the following is true: @@ -105811,8 +107007,11 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ /* Subroutine return */ assert( ExprUseYSub(pExpr) ); - sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); - sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); sqlite3ClearTempRegCache(pParse); return rReg; } @@ -106246,6 +107445,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( } if( iCol<0 || iCol==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); + VdbeComment((v, "%s.rowid", pTab->zName)); }else{ int op; int x; @@ -106416,7 +107616,17 @@ static int exprCodeInlineFunction( caseExpr.x.pList = pFarg; return sqlite3ExprCodeTarget(pParse, &caseExpr, target); } - +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + case INLINEFUNC_sqlite_offset: { + Expr *pArg = pFarg->a[0].pExpr; + if( pArg->op==TK_COLUMN && pArg->iTable>=0 ){ + sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } +#endif default: { /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. @@ -106955,20 +108165,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( !pColl ) pColl = db->pDfltColl; sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } -#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - if( (pDef->funcFlags & SQLITE_FUNC_OFFSET)!=0 && ALWAYS(pFarg!=0) ){ - Expr *pArg = pFarg->a[0].pExpr; - if( pArg->op==TK_COLUMN ){ - sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); - }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, target); - } - }else -#endif - { - sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, - pDef, pExpr->op2); - } + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pExpr->op2); if( nFarg ){ if( constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); @@ -106998,16 +108196,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } case TK_SELECT_COLUMN: { int n; - if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); + Expr *pLeft = pExpr->pLeft; + if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){ + pLeft->iTable = sqlite3CodeSubselect(pParse, pLeft); + pLeft->op2 = pParse->withinRJSubrtn; } - assert( pExpr->pLeft->op==TK_SELECT || pExpr->pLeft->op==TK_ERROR ); - n = sqlite3ExprVectorSize(pExpr->pLeft); + assert( pLeft->op==TK_SELECT || pLeft->op==TK_ERROR ); + n = sqlite3ExprVectorSize(pLeft); if( pExpr->iTable!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); } - return pExpr->pLeft->iTable + pExpr->iColumn; + return pLeft->iTable + pExpr->iColumn; } case TK_IN: { int destIfFalse = sqlite3VdbeMakeLabel(pParse); @@ -107038,8 +108238,24 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) exprCodeBetween(pParse, pExpr, target, 0, 0); return target; } + case TK_COLLATE: { + if( !ExprHasProperty(pExpr, EP_Collate) + && ALWAYS(pExpr->pLeft) + && pExpr->pLeft->op==TK_FUNCTION + ){ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg); + return inReg; + }else{ + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */ + } + } case TK_SPAN: - case TK_COLLATE: case TK_UPLUS: { pExpr = pExpr->pLeft; goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ @@ -107280,7 +108496,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( struct ExprList_item *pItem; int i; for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ - if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ + if( pItem->fg.reusable + && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 + ){ return pItem->u.iConstExprReg; } } @@ -107303,7 +108521,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( p = sqlite3ExprListAppend(pParse, p, pExpr); if( p ){ struct ExprList_item *pItem = &p->a[p->nExpr-1]; - pItem->reusable = regDest<0; + pItem->fg.reusable = regDest<0; if( regDest<0 ) regDest = ++pParse->nMem; pItem->u.iConstExprReg = regDest; } @@ -107437,7 +108655,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( for(pItem=pList->a, i=0; ipExpr; #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( pItem->bSorterRef ){ + if( pItem->fg.bSorterRef ){ i--; n--; }else @@ -107531,8 +108749,8 @@ static void exprCodeBetween( ** so that the sqlite3ExprCodeTarget() routine will not attempt to move ** it into the Parse.pConstExpr list. We should use a new bit for this, ** for clarity, but we are out of bits in the Expr.flags field so we - ** have to reuse the EP_FromJoin bit. Bummer. */ - pDel->flags |= EP_FromJoin; + ** have to reuse the EP_OuterON bit. Bummer. */ + pDel->flags |= EP_OuterON; sqlite3ExprCodeTarget(pParse, &exprAnd, dest); } sqlite3ReleaseTempReg(pParse, regFree1); @@ -108062,7 +109280,7 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB int res; Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; - if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; + if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1; if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; } return 0; @@ -108217,7 +109435,7 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr( static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_AGG_COLUMN ); testcase( pExpr->op==TK_AGG_FUNCTION ); - if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; + if( ExprHasProperty(pExpr, EP_OuterON) ) return WRC_Prune; switch( pExpr->op ){ case TK_ISNOT: case TK_ISNULL: @@ -108314,8 +109532,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ** False positives are not allowed, however. A false positive may result ** in an incorrect answer. ** -** Terms of p that are marked with EP_FromJoin (and hence that come from -** the ON or USING clauses of LEFT JOINS) are excluded from the analysis. +** Terms of p that are marked with EP_OuterON (and hence that come from +** the ON or USING clauses of OUTER JOINS) are excluded from the analysis. ** ** This routine is used to check if a LEFT JOIN can be converted into ** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE @@ -109729,11 +110947,10 @@ static void unmapColumnIdlistNames( Parse *pParse, const IdList *pIdList ){ - if( pIdList ){ - int ii; - for(ii=0; iinId; ii++){ - sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); - } + int ii; + assert( pIdList!=0 ); + for(ii=0; iinId; ii++){ + sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); } } @@ -109752,7 +110969,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ if( ALWAYS(p->pEList) ){ ExprList *pList = p->pEList; for(i=0; inExpr; i++){ - if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ + if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); } } @@ -109761,8 +110978,11 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ SrcList *pSrc = p->pSrc; for(i=0; inSrc; i++){ sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); - sqlite3WalkExpr(pWalker, pSrc->a[i].pOn); - unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); + if( pSrc->a[i].fg.isUsing==0 ){ + sqlite3WalkExpr(pWalker, pSrc->a[i].u3.pOn); + }else{ + unmapColumnIdlistNames(pParse, pSrc->a[i].u3.pUsing); + } } } @@ -109798,7 +111018,7 @@ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); } } @@ -109956,7 +111176,7 @@ static void renameColumnElistNames( int i; for(i=0; inExpr; i++){ const char *zName = pEList->a[i].zEName; - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) && ALWAYS(zName!=0) && 0==sqlite3_stricmp(zName, zOld) ){ @@ -110186,27 +111406,33 @@ static int renameResolveTrigger(Parse *pParse){ if( rc==SQLITE_OK && pStep->zTarget ){ SrcList *pSrc = sqlite3TriggerStepSrc(pParse, pStep); if( pSrc ){ - int i; - for(i=0; inSrc && rc==SQLITE_OK; i++){ - SrcItem *p = &pSrc->a[i]; - p->iCursor = pParse->nTab++; - if( p->pSelect ){ - sqlite3SelectPrep(pParse, p->pSelect, 0); - sqlite3ExpandSubquery(pParse, p); - assert( i>0 ); - assert( pStep->pFrom->a[i-1].pSelect ); - sqlite3SelectPrep(pParse, pStep->pFrom->a[i-1].pSelect, 0); - }else{ - p->pTab = sqlite3LocateTableItem(pParse, 0, p); - if( p->pTab==0 ){ - rc = SQLITE_ERROR; - }else{ - p->pTab->nTabRef++; - rc = sqlite3ViewGetColumnNames(pParse, p->pTab); + Select *pSel = sqlite3SelectNew( + pParse, pStep->pExprList, pSrc, 0, 0, 0, 0, 0, 0 + ); + if( pSel==0 ){ + pStep->pExprList = 0; + pSrc = 0; + rc = SQLITE_NOMEM; + }else{ + sqlite3SelectPrep(pParse, pSel, 0); + rc = pParse->nErr ? SQLITE_ERROR : SQLITE_OK; + assert( pStep->pExprList==0 || pStep->pExprList==pSel->pEList ); + assert( pSrc==pSel->pSrc ); + if( pStep->pExprList ) pSel->pEList = 0; + pSel->pSrc = 0; + sqlite3SelectDelete(db, pSel); + } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc && rc==SQLITE_OK; i++){ + SrcItem *p = &pStep->pFrom->a[i]; + if( p->pSelect ){ + sqlite3SelectPrep(pParse, p->pSelect, 0); } } } - if( rc==SQLITE_OK && db->mallocFailed ){ + + if( db->mallocFailed ){ rc = SQLITE_NOMEM; } sNC.pSrcList = pSrc; @@ -110658,6 +111884,15 @@ static void renameTableFunc( if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){ renameTokenFind(&sParse, &sCtx, pStep->zTarget); } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc; i++){ + SrcItem *pItem = &pStep->pFrom->a[i]; + if( 0==sqlite3_stricmp(pItem->zName, zOld) ){ + renameTokenFind(&sParse, &sCtx, pItem->zName); + } + } + } } } } @@ -111981,9 +113216,14 @@ static void statGet( ** * "WHERE a=? AND b=?" matches 2 rows. ** ** If D is the count of distinct values and K is the total number of - ** rows, then each estimate is computed as: + ** rows, then each estimate is usually computed as: ** ** I = (K+D-1)/D + ** + ** In other words, I is K/D rounded up to the next whole integer. + ** However, if I is between 1.0 and 1.1 (in other words if I is + ** close to 1.0 but just a little larger) then do not round up but + ** instead keep the I value at 1.0. */ sqlite3_str sStat; /* Text of the constructed "stat" line */ int i; /* Loop counter */ @@ -111994,6 +113234,7 @@ static void statGet( for(i=0; inKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; sqlite3_str_appendf(&sStat, " %llu", iVal); assert( p->current.anEq[i] ); } @@ -112157,7 +113398,7 @@ static void analyzeOneTable( memcpy(pStat1->zName, "sqlite_stat1", 13); pStat1->nCol = 3; pStat1->iPKey = -1; - sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB); + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNAMIC); } #endif @@ -113547,7 +114788,11 @@ static int fixSelectCb(Walker *p, Select *pSelect){ pItem->fg.fromDDL = 1; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) - if( sqlite3WalkExpr(&pFix->w, pList->a[i].pOn) ) return WRC_Abort; + if( pList->a[i].fg.isUsing==0 + && sqlite3WalkExpr(&pFix->w, pList->a[i].u3.pOn) + ){ + return WRC_Abort; + } #endif } if( pSelect->pWith ){ @@ -114111,9 +115356,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ int i; int reg; - if( NEVER(pReturning->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pReturning->nRetCol ){ sqlite3VdbeAddOp0(v, OP_FkCheck); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); @@ -114153,7 +115396,9 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ int iDb, i; assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); sqlite3VdbeJumpHere(v, 0); - for(iDb=0; iDbnDb; iDb++){ + assert( db->nDb>0 ); + iDb = 0; + do{ Schema *pSchema; if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; sqlite3VdbeUsesBtree(v, iDb); @@ -114168,7 +115413,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); VdbeComment((v, "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); - } + }while( ++iDbnDb ); #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=0; inVtabLock; i++){ char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); @@ -114207,9 +115452,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pRet = pParse->u1.pReturning; - if( NEVER(pRet->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pRet->nRetCol ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); } } @@ -114272,8 +115515,6 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3RunParser(pParse, zSql); - sqlite3DbFree(db, pParse->zErrMsg); - pParse->zErrMsg = 0; db->mDbFlags = savedDbFlags; sqlite3DbFree(db, zSql); memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); @@ -115831,7 +117072,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( pTab->keyConf = (u8)onError; assert( autoInc==0 || autoInc==1 ); pTab->tabFlags |= autoInc*TF_Autoincrement; - if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; + if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags; (void)sqlite3HasExplicitNulls(pParse, pList); }else if( autoInc ){ #ifndef SQLITE_OMIT_AUTOINCREMENT @@ -116325,7 +117566,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); } - pList->a[0].sortFlags = pParse->iPkSortOrder; + pList->a[0].fg.sortFlags = pParse->iPkSortOrder; assert( pParse->pNewTable==pTab ); pTab->iPKey = -1; sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, @@ -116996,7 +118237,6 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ Table *pSelTab; /* A fake table from which we get the result set */ Select *pSel; /* Copy of the SELECT that implements the view */ int nErr = 0; /* Number of errors encountered */ - int n; /* Temporarily holds the number of cursors assigned */ sqlite3 *db = pParse->db; /* Database connection for malloc errors */ #ifndef SQLITE_OMIT_VIRTUALTABLE int rc; @@ -117054,8 +118294,9 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); if( pSel ){ u8 eParseMode = pParse->eParseMode; + int nTab = pParse->nTab; + int nSelect = pParse->nSelect; pParse->eParseMode = PARSE_MODE_NORMAL; - n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; DisableLookaside; @@ -117067,7 +118308,8 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #else pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif - pParse->nTab = n; + pParse->nTab = nTab; + pParse->nSelect = nSelect; if( pSelTab==0 ){ pTable->nCol = 0; nErr++; @@ -117812,8 +119054,8 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ if( pList ){ int i; for(i=0; inExpr; i++){ - if( pList->a[i].bNulls ){ - u8 sf = pList->a[i].sortFlags; + if( pList->a[i].fg.bNulls ){ + u8 sf = pList->a[i].fg.sortFlags; sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", (sf==0 || sf==3) ? "FIRST" : "LAST" ); @@ -118166,7 +119408,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } pIndex->azColl[i] = zColl; - requestedSortOrder = pListItem->sortFlags & sortOrderMask; + requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; } @@ -118609,18 +119851,17 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * if( pList==0 ){ pList = sqlite3DbMallocZero(db, sizeof(IdList) ); if( pList==0 ) return 0; + }else{ + IdList *pNew; + pNew = sqlite3DbRealloc(db, pList, + sizeof(IdList) + pList->nId*sizeof(pList->a)); + if( pNew==0 ){ + sqlite3IdListDelete(db, pList); + return 0; + } + pList = pNew; } - pList->a = sqlite3ArrayAllocate( - db, - pList->a, - sizeof(pList->a[0]), - &pList->nId, - &i - ); - if( i<0 ){ - sqlite3IdListDelete(db, pList); - return 0; - } + i = pList->nId++; pList->a[i].zName = sqlite3NameFromToken(db, pToken); if( IN_RENAME_OBJECT && pList->a[i].zName ){ sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken); @@ -118634,10 +119875,10 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ int i; if( pList==0 ) return; + assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */ for(i=0; inId; i++){ sqlite3DbFree(db, pList->a[i].zName); } - sqlite3DbFree(db, pList->a); sqlite3DbFreeNN(db, pList); } @@ -118647,7 +119888,7 @@ SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ */ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ int i; - if( pList==0 ) return -1; + assert( pList!=0 ); for(i=0; inId; i++){ if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; } @@ -118850,8 +120091,11 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); sqlite3DeleteTable(db, pItem->pTab); if( pItem->pSelect ) sqlite3SelectDelete(db, pItem->pSelect); - if( pItem->pOn ) sqlite3ExprDelete(db, pItem->pOn); - if( pItem->pUsing ) sqlite3IdListDelete(db, pItem->pUsing); + if( pItem->fg.isUsing ){ + sqlite3IdListDelete(db, pItem->u3.pUsing); + }else if( pItem->u3.pOn ){ + sqlite3ExprDelete(db, pItem->u3.pOn); + } } sqlite3DbFreeNN(db, pList); } @@ -118879,14 +120123,13 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( Token *pDatabase, /* Name of the database containing pTable */ Token *pAlias, /* The right-hand side of the AS subexpression */ Select *pSubquery, /* A subquery used in place of a table name */ - Expr *pOn, /* The ON clause of a join */ - IdList *pUsing /* The USING clause of a join */ + OnOrUsing *pOnUsing /* Either the ON clause or the USING clause */ ){ SrcItem *pItem; sqlite3 *db = pParse->db; - if( !p && (pOn || pUsing) ){ + if( !p && pOnUsing!=0 && (pOnUsing->pOn || pOnUsing->pUsing) ){ sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", - (pOn ? "ON" : "USING") + (pOnUsing->pOn ? "ON" : "USING") ); goto append_from_error; } @@ -118906,15 +120149,27 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( if( pAlias->n ){ pItem->zAlias = sqlite3NameFromToken(db, pAlias); } - pItem->pSelect = pSubquery; - pItem->pOn = pOn; - pItem->pUsing = pUsing; + if( pSubquery ){ + pItem->pSelect = pSubquery; + if( pSubquery->selFlags & SF_NestedFrom ){ + pItem->fg.isNestedFrom = 1; + } + } + assert( pOnUsing==0 || pOnUsing->pOn==0 || pOnUsing->pUsing==0 ); + assert( pItem->fg.isUsing==0 ); + if( pOnUsing==0 ){ + pItem->u3.pOn = 0; + }else if( pOnUsing->pUsing ){ + pItem->fg.isUsing = 1; + pItem->u3.pUsing = pOnUsing->pUsing; + }else{ + pItem->u3.pOn = pOnUsing->pOn; + } return p; append_from_error: assert( p==0 ); - sqlite3ExprDelete(db, pOn); - sqlite3IdListDelete(db, pUsing); + sqlite3ClearOnOrUsing(db, pOnUsing); sqlite3SelectDelete(db, pSubquery); return 0; } @@ -118959,6 +120214,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, Src p1 = pNew; memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem)); sqlite3DbFree(pParse->db, p2); + p1->a[0].fg.jointype |= (JT_LTORJ & p1->a[1].fg.jointype); } } return p1; @@ -118995,14 +120251,34 @@ SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList * ** The operator is "natural cross join". The A and B operands are stored ** in p->a[0] and p->a[1], respectively. The parser initially stores the ** operator with A. This routine shifts that operator over to B. +** +** Additional changes: +** +** * All tables to the left of the right-most RIGHT JOIN are tagged with +** JT_LTORJ (mnemonic: Left Table Of Right Join) so that the +** code generator can easily tell that the table is part of +** the left operand of at least one RIGHT JOIN. */ -SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){ - if( p ){ - int i; - for(i=p->nSrc-1; i>0; i--){ - p->a[i].fg.jointype = p->a[i-1].fg.jointype; - } +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){ + (void)pParse; + if( p && p->nSrc>1 ){ + int i = p->nSrc-1; + u8 allFlags = 0; + do{ + allFlags |= p->a[i].fg.jointype = p->a[i-1].fg.jointype; + }while( (--i)>0 ); p->a[0].fg.jointype = 0; + + /* All terms to the left of a RIGHT JOIN should be tagged with the + ** JT_LTORJ flags */ + if( allFlags & JT_RIGHT ){ + for(i=p->nSrc-1; ALWAYS(i>0) && (p->a[i].fg.jointype&JT_RIGHT)==0; i--){} + i--; + assert( i>=0 ); + do{ + p->a[i].fg.jointype |= JT_LTORJ; + }while( (--i)>=0 ); + } } } @@ -120251,8 +121527,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView( assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); - assert( pFrom->a[0].pOn==0 ); - assert( pFrom->a[0].pUsing==0 ); + assert( pFrom->a[0].fg.isUsing==0 ); + assert( pFrom->a[0].u3.pOn==0 ); } pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, SF_IncludeHidden, pLimit); @@ -120423,7 +121699,6 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( assert( db->mallocFailed==0 ); assert( pTabList->nSrc==1 ); - /* Locate the table which we want to delete. This table has to be ** put in an SrcList structure because some of the subroutines we ** will be calling are designed to work with multiple tables and expect @@ -120448,6 +121723,14 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( # define isView 0 #endif +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Delete() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewDelete(pParse->pWith, pTabList, pWhere, + pOrderBy, pLimit, pTrigger); + } +#endif + #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT if( !isView ){ pWhere = sqlite3LimitWhere( @@ -123206,11 +124489,11 @@ static void logFunc( switch( SQLITE_PTR_TO_INT(sqlite3_user_data(context)) ){ case 1: /* Convert from natural logarithm to log base 10 */ - ans *= 1.0/M_LN10; + ans /= M_LN10; break; case 2: /* Convert from natural logarithm to log base 2 */ - ans *= 1.0/M_LN2; + ans /= M_LN2; break; default: break; @@ -123349,8 +124632,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF, - 0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} }, + INLINE_FUNC(sqlite_offset, 1, INLINEFUNC_sqlite_offset, 0 ), #endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), @@ -123885,7 +125167,6 @@ static void fkLookupParent( }else{ int nCol = pFKey->nCol; int regTemp = sqlite3GetTempRange(pParse, nCol); - int regRec = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); @@ -123925,11 +125206,10 @@ static void fkLookupParent( sqlite3VdbeGoto(v, iOk); } - sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, + sqlite3VdbeAddOp4(v, OP_Affinity, regTemp, nCol, 0, sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); - sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); - - sqlite3ReleaseTempReg(pParse, regRec); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regTemp, nCol); + VdbeCoverage(v); sqlite3ReleaseTempRange(pParse, regTemp, nCol); } } @@ -124031,14 +125311,10 @@ static Expr *exprTableColumn( ** Operation | FK type | Action taken ** -------------------------------------------------------------------------- ** DELETE immediate Increment the "immediate constraint counter". -** Or, if the ON (UPDATE|DELETE) action is RESTRICT, -** throw a "FOREIGN KEY constraint failed" exception. ** ** INSERT immediate Decrement the "immediate constraint counter". ** ** DELETE deferred Increment the "deferred constraint counter". -** Or, if the ON (UPDATE|DELETE) action is RESTRICT, -** throw a "FOREIGN KEY constraint failed" exception. ** ** INSERT deferred Decrement the "deferred constraint counter". ** @@ -124686,9 +125962,9 @@ SQLITE_PRIVATE int sqlite3FkRequired( ** ** It returns a pointer to a Trigger structure containing a trigger ** equivalent to the ON UPDATE or ON DELETE action specified by pFKey. -** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is -** returned (these actions require no special handling by the triggers -** sub-system, code for them is created by fkScanChildren()). +** If the action is "NO ACTION" then a NULL pointer is returned (these actions +** require no special handling by the triggers sub-system, code for them is +** created by fkScanChildren()). ** ** For example, if pFKey is the foreign key and pTab is table "p" in ** the following schema: @@ -124817,18 +126093,23 @@ static Trigger *fkActionTrigger( nFrom = sqlite3Strlen30(zFrom); if( action==OE_Restrict ){ + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); Token tFrom; + Token tDb; Expr *pRaise; tFrom.z = zFrom; tFrom.n = nFrom; + tDb.z = db->aDb[iDb].zDbSName; + tDb.n = sqlite3Strlen30(tDb.z); + pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); if( pRaise ){ pRaise->affExpr = OE_Abort; } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(pParse, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tDb, &tFrom), pWhere, 0, 0, 0, 0, 0 ); @@ -125738,6 +127019,14 @@ SQLITE_PRIVATE void sqlite3Insert( #endif assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Insert() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewInsert(pParse->pWith, pTabList, pColumn, pSelect, pList, + onError, pUpsert, pTrigger); + } +#endif + /* If pTab is really a view, make sure it has been initialized. ** ViewGetColumnNames() is a no-op if pTab is not a view. */ @@ -125816,13 +127105,15 @@ SQLITE_PRIVATE void sqlite3Insert( */ bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ + assert( pColumn->eU4!=EU4_EXPR ); + pColumn->eU4 = EU4_IDX; for(i=0; inId; i++){ - pColumn->a[i].idx = -1; + pColumn->a[i].u4.idx = -1; } for(i=0; inId; i++){ for(j=0; jnCol; j++){ if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){ - pColumn->a[i].idx = j; + pColumn->a[i].u4.idx = j; if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); @@ -126124,7 +127415,8 @@ SQLITE_PRIVATE void sqlite3Insert( } } if( pColumn ){ - for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + assert( pColumn->eU4==EU4_IDX ); + for(j=0; jnId && pColumn->a[j].u4.idx!=i; j++){} if( j>=pColumn->nId ){ /* A column not named in the insert column list gets its ** default value */ @@ -127255,7 +128547,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( if( isUpdate ){ /* If currently processing the PRIMARY KEY of a WITHOUT ROWID ** table, only conflict if the new PRIMARY KEY values are actually - ** different from the old. + ** different from the old. See TH3 withoutrowid04.test. ** ** For a UNIQUE index, only conflict if the PRIMARY KEY values ** of the matched index row are different from the original PRIMARY @@ -128619,6 +129911,12 @@ struct sqlite3_api_routines { int (*vtab_in)(sqlite3_index_info*,int,int); int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); + /* Version 3.39.0 and later */ + int (*deserialize)(sqlite3*,const char*,unsigned char*, + sqlite3_int64,sqlite3_int64,unsigned); + unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*, + unsigned int); + const char *(*db_name)(sqlite3*,int); }; /* @@ -128937,6 +130235,12 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_vtab_in sqlite3_api->vtab_in #define sqlite3_vtab_in_first sqlite3_api->vtab_in_first #define sqlite3_vtab_in_next sqlite3_api->vtab_in_next +/* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize +#endif +#define sqlite3_db_name sqlite3_api->db_name #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -129428,11 +130732,28 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_autovacuum_pages, /* Version 3.38.0 and later */ sqlite3_error_offset, +#ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3_vtab_rhs_value, sqlite3_vtab_distinct, sqlite3_vtab_in, sqlite3_vtab_in_first, - sqlite3_vtab_in_next + sqlite3_vtab_in_next, +#else + 0, + 0, + 0, + 0, + 0, +#endif + /* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE + sqlite3_deserialize, + sqlite3_serialize, +#else + 0, + 0, +#endif + sqlite3_db_name }; /* True if x is the directory separator character @@ -130103,7 +131424,7 @@ static const PragmaName aPragmaName[] = { #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 47, 3, /* iArg: */ 0 }, #endif @@ -130791,15 +132112,16 @@ static void pragmaFunclistLine( int isBuiltin, /* True if this is a built-in function */ int showInternFuncs /* True if showing internal functions */ ){ + u32 mask = + SQLITE_DETERMINISTIC | + SQLITE_DIRECTONLY | + SQLITE_SUBTYPE | + SQLITE_INNOCUOUS | + SQLITE_FUNC_INTERNAL + ; + if( showInternFuncs ) mask = 0xffffffff; for(; p; p=p->pNext){ const char *zType; - static const u32 mask = - SQLITE_DETERMINISTIC | - SQLITE_DIRECTONLY | - SQLITE_SUBTYPE | - SQLITE_INNOCUOUS | - SQLITE_FUNC_INTERNAL - ; static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; assert( SQLITE_FUNC_ENCMASK==0x3 ); @@ -131291,7 +132613,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ #ifndef SQLITE_OMIT_AUTOVACUUM case PragTyp_INCREMENTAL_VACUUM: { - int iLimit, addr; + int iLimit = 0, addr; if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ iLimit = 0x7fffffff; } @@ -131448,6 +132770,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** */ case PragTyp_TEMP_STORE_DIRECTORY: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( !zRight ){ returnSingleText(v, sqlite3_temp_directory); }else{ @@ -131457,6 +132780,7 @@ SQLITE_PRIVATE void sqlite3Pragma( rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); if( rc!=SQLITE_OK || res==0 ){ sqlite3ErrorMsg(pParse, "not a writable directory"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); goto pragma_out; } } @@ -131474,6 +132798,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } #endif /* SQLITE_OMIT_WSD */ } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); break; } @@ -131492,6 +132817,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** */ case PragTyp_DATA_STORE_DIRECTORY: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( !zRight ){ returnSingleText(v, sqlite3_data_directory); }else{ @@ -131501,6 +132827,7 @@ SQLITE_PRIVATE void sqlite3Pragma( rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); if( rc!=SQLITE_OK || res==0 ){ sqlite3ErrorMsg(pParse, "not a writable directory"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); goto pragma_out; } } @@ -131512,6 +132839,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } #endif /* SQLITE_OMIT_WSD */ } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); break; } #endif @@ -131979,7 +133307,6 @@ SQLITE_PRIVATE void sqlite3Pragma( HashElem *k; /* Loop counter: Next table in schema */ int x; /* result variable */ int regResult; /* 3 registers to hold a result row */ - int regKey; /* Register to hold key for checking the FK */ int regRow; /* Registers to hold a row from pTab */ int addrTop; /* Top of a loop checking foreign keys */ int addrOk; /* Jump here if the key is OK */ @@ -131987,7 +133314,6 @@ SQLITE_PRIVATE void sqlite3Pragma( regResult = pParse->nMem+1; pParse->nMem += 4; - regKey = ++pParse->nMem; regRow = ++pParse->nMem; k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ @@ -132054,9 +133380,9 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Generate code to query the parent index for a matching parent ** key. If a match is found, jump to addrOk. */ if( pIdx ){ - sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3VdbeAddOp4(v, OP_Affinity, regRow, pFK->nCol, 0, sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); - sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regRow, pFK->nCol); VdbeCoverage(v); }else if( pParent ){ int jmp = sqlite3VdbeCurrentAddr(v)+2; @@ -134292,7 +135618,7 @@ SQLITE_API int sqlite3_prepare16_v3( */ typedef struct DistinctCtx DistinctCtx; struct DistinctCtx { - u8 isTnct; /* True if the DISTINCT keyword is present */ + u8 isTnct; /* 0: Not distinct. 1: DISTICT 2: DISTINCT and ORDER BY */ u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */ int tabTnct; /* Ephemeral table used for DISTINCT processing */ int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */ @@ -134475,6 +135801,52 @@ static Select *findRightmost(Select *p){ ** ** If an illegal or unsupported join type is seen, then still return ** a join type, but put an error in the pParse structure. +** +** These are the valid join types: +** +** +** pA pB pC Return Value +** ------- ----- ----- ------------ +** CROSS - - JT_CROSS +** INNER - - JT_INNER +** LEFT - - JT_LEFT|JT_OUTER +** LEFT OUTER - JT_LEFT|JT_OUTER +** RIGHT - - JT_RIGHT|JT_OUTER +** RIGHT OUTER - JT_RIGHT|JT_OUTER +** FULL - - JT_LEFT|JT_RIGHT|JT_OUTER +** FULL OUTER - JT_LEFT|JT_RIGHT|JT_OUTER +** NATURAL INNER - JT_NATURAL|JT_INNER +** NATURAL LEFT - JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL LEFT OUTER JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL RIGHT - JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL RIGHT OUTER JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL FULL - JT_NATURAL|JT_LEFT|JT_RIGHT +** NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT +** +** To preserve historical compatibly, SQLite also accepts a variety +** of other non-standard and in many cases non-sensical join types. +** This routine makes as much sense at it can from the nonsense join +** type and returns a result. Examples of accepted nonsense join types +** include but are not limited to: +** +** INNER CROSS JOIN -> same as JOIN +** NATURAL CROSS JOIN -> same as NATURAL JOIN +** OUTER LEFT JOIN -> same as LEFT JOIN +** LEFT NATURAL JOIN -> same as NATURAL LEFT JOIN +** LEFT RIGHT JOIN -> same as FULL JOIN +** RIGHT OUTER FULL JOIN -> same as FULL JOIN +** CROSS CROSS CROSS JOIN -> same as JOIN +** +** The only restrictions on the join type name are: +** +** * "INNER" cannot appear together with "OUTER", "LEFT", "RIGHT", +** or "FULL". +** +** * "CROSS" cannot appear together with "OUTER", "LEFT", "RIGHT, +** or "FULL". +** +** * If "OUTER" is present then there must also be one of +** "LEFT", "RIGHT", or "FULL" */ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ int jointype = 0; @@ -134487,13 +135859,13 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p u8 nChar; /* Length of the keyword in characters */ u8 code; /* Join type mask */ } aKeyword[] = { - /* natural */ { 0, 7, JT_NATURAL }, - /* left */ { 6, 4, JT_LEFT|JT_OUTER }, - /* outer */ { 10, 5, JT_OUTER }, - /* right */ { 14, 5, JT_RIGHT|JT_OUTER }, - /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, - /* inner */ { 23, 5, JT_INNER }, - /* cross */ { 28, 5, JT_INNER|JT_CROSS }, + /* (0) natural */ { 0, 7, JT_NATURAL }, + /* (1) left */ { 6, 4, JT_LEFT|JT_OUTER }, + /* (2) outer */ { 10, 5, JT_OUTER }, + /* (3) right */ { 14, 5, JT_RIGHT|JT_OUTER }, + /* (4) full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + /* (5) inner */ { 23, 5, JT_INNER }, + /* (6) cross */ { 28, 5, JT_INNER|JT_CROSS }, }; int i, j; apAll[0] = pA; @@ -134516,18 +135888,15 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p } if( (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || - (jointype & JT_ERROR)!=0 + (jointype & JT_ERROR)!=0 || + (jointype & (JT_OUTER|JT_LEFT|JT_RIGHT))==JT_OUTER ){ - const char *zSp = " "; - assert( pB!=0 ); - if( pC==0 ){ zSp++; } - sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " - "%T %T%s%T", pA, pB, zSp, pC); - jointype = JT_INNER; - }else if( (jointype & JT_OUTER)!=0 - && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ - sqlite3ErrorMsg(pParse, - "RIGHT and FULL OUTER JOINs are not currently supported"); + const char *zSp1 = " "; + const char *zSp2 = " "; + if( pB==0 ){ zSp1++; } + if( pC==0 ){ zSp2++; } + sqlite3ErrorMsg(pParse, "unknown join type: " + "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC); jointype = JT_INNER; } return jointype; @@ -134548,8 +135917,25 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ } /* -** Search the first N tables in pSrc, from left to right, looking for a -** table that has a column named zCol. +** Mark a subquery result column as having been used. +*/ +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){ + assert( pItem!=0 ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + ExprList *pResults; + assert( pItem->pSelect!=0 ); + pResults = pItem->pSelect->pEList; + assert( pResults!=0 ); + assert( iCol>=0 && iColnExpr ); + pResults->a[iCol].fg.bUsed = 1; + } +} + +/* +** Search the tables iStart..iEnd (inclusive) in pSrc, looking for a +** table that has a column named zCol. The search is left-to-right. +** The first match found is returned. ** ** When found, set *piTab and *piCol to the table index and column index ** of the matching column and return TRUE. @@ -134558,22 +135944,27 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ */ static int tableAndColumnIndex( SrcList *pSrc, /* Array of tables to search */ - int N, /* Number of tables in pSrc->a[] to search */ + int iStart, /* First member of pSrc->a[] to check */ + int iEnd, /* Last member of pSrc->a[] to check */ const char *zCol, /* Name of the column we are looking for */ int *piTab, /* Write index of pSrc->a[] here */ int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ - int bIgnoreHidden /* True to ignore hidden columns */ + int bIgnoreHidden /* Ignore hidden columns */ ){ int i; /* For looping over tables in pSrc */ int iCol; /* Index of column matching zCol */ + assert( iEndnSrc ); + assert( iStart>=0 ); assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ - for(i=0; ia[i].pTab, zCol); if( iCol>=0 && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) ){ if( piTab ){ + sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol); *piTab = i; *piCol = iCol; } @@ -134584,66 +135975,19 @@ static int tableAndColumnIndex( } /* -** This function is used to add terms implied by JOIN syntax to the -** WHERE clause expression of a SELECT statement. The new term, which -** is ANDed with the existing WHERE clause, is of the form: -** -** (tab1.col1 = tab2.col2) -** -** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the -** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is -** column iColRight of tab2. -*/ -static void addWhereTerm( - Parse *pParse, /* Parsing context */ - SrcList *pSrc, /* List of tables in FROM clause */ - int iLeft, /* Index of first table to join in pSrc */ - int iColLeft, /* Index of column in first table */ - int iRight, /* Index of second table in pSrc */ - int iColRight, /* Index of column in second table */ - int isOuterJoin, /* True if this is an OUTER join */ - Expr **ppWhere /* IN/OUT: The WHERE clause to add to */ -){ - sqlite3 *db = pParse->db; - Expr *pE1; - Expr *pE2; - Expr *pEq; - - assert( iLeftnSrc>iRight ); - assert( pSrc->a[iLeft].pTab ); - assert( pSrc->a[iRight].pTab ); - - pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); - pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); - - pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); - assert( pE2!=0 || pEq==0 ); /* Due to db->mallocFailed test - ** in sqlite3DbMallocRawNN() called from - ** sqlite3PExpr(). */ - if( pEq && isOuterJoin ){ - ExprSetProperty(pEq, EP_FromJoin); - assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); - ExprSetVVAProperty(pEq, EP_NoReduce); - pEq->w.iRightJoinTable = pE2->iTable; - } - *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); -} - -/* -** Set the EP_FromJoin property on all terms of the given expression. -** And set the Expr.w.iRightJoinTable to iTable for every term in the +** Set the EP_OuterON property on all terms of the given expression. +** And set the Expr.w.iJoin to iTable for every term in the ** expression. ** -** The EP_FromJoin property is used on terms of an expression to tell -** the LEFT OUTER JOIN processing logic that this term is part of the +** The EP_OuterON property is used on terms of an expression to tell +** the OUTER JOIN processing logic that this term is part of the ** join restriction specified in the ON or USING clause and not a part ** of the more general WHERE clause. These terms are moved over to the ** WHERE clause during join processing but we need to remember that they ** originated in the ON or USING clause. ** -** The Expr.w.iRightJoinTable tells the WHERE clause processing that the -** expression depends on table w.iRightJoinTable even if that table is not +** The Expr.w.iJoin tells the WHERE clause processing that the +** expression depends on table w.iJoin even if that table is not ** explicitly mentioned in the expression. That information is needed ** for cases like this: ** @@ -134656,39 +136000,48 @@ static void addWhereTerm( ** after the t1 loop and rows with t1.x!=5 will never appear in ** the output, which is incorrect. */ -SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ + assert( joinFlag==EP_OuterON || joinFlag==EP_InnerON ); while( p ){ - ExprSetProperty(p, EP_FromJoin); + ExprSetProperty(p, joinFlag); assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); - p->w.iRightJoinTable = iTable; + p->w.iJoin = iTable; if( p->op==TK_FUNCTION ){ assert( ExprUseXList(p) ); if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ - sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable, joinFlag); } } } - sqlite3SetJoinExpr(p->pLeft, iTable); + sqlite3SetJoinExpr(p->pLeft, iTable, joinFlag); p = p->pRight; } } -/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every -** term that is marked with EP_FromJoin and w.iRightJoinTable==iTable into -** an ordinary term that omits the EP_FromJoin mark. +/* Undo the work of sqlite3SetJoinExpr(). This is used when a LEFT JOIN +** is simplified into an ordinary JOIN, and when an ON expression is +** "pushed down" into the WHERE clause of a subquery. +** +** Convert every term that is marked with EP_OuterON and w.iJoin==iTable into +** an ordinary term that omits the EP_OuterON mark. Or if iTable<0, then +** just clear every EP_OuterON and EP_InnerON mark from the expression tree. ** -** This happens when a LEFT JOIN is simplified into an ordinary JOIN. +** If nullable is true, that means that Expr p might evaluate to NULL even +** if it is a reference to a NOT NULL column. This can happen, for example, +** if the table that p references is on the left side of a RIGHT JOIN. +** If nullable is true, then take care to not remove the EP_CanBeNull bit. +** See forum thread https://sqlite.org/forum/forumpost/b40696f50145d21c */ -static void unsetJoinExpr(Expr *p, int iTable){ +static void unsetJoinExpr(Expr *p, int iTable, int nullable){ while( p ){ - if( ExprHasProperty(p, EP_FromJoin) - && (iTable<0 || p->w.iRightJoinTable==iTable) ){ - ExprClearProperty(p, EP_FromJoin); + if( iTable<0 || (ExprHasProperty(p, EP_OuterON) && p->w.iJoin==iTable) ){ + ExprClearProperty(p, EP_OuterON|EP_InnerON); + if( iTable>=0 ) ExprSetProperty(p, EP_InnerON); } - if( p->op==TK_COLUMN && p->iTable==iTable ){ + if( p->op==TK_COLUMN && p->iTable==iTable && !nullable ){ ExprClearProperty(p, EP_CanBeNull); } if( p->op==TK_FUNCTION ){ @@ -134696,30 +136049,37 @@ static void unsetJoinExpr(Expr *p, int iTable){ if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ - unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable, nullable); } } } - unsetJoinExpr(p->pLeft, iTable); + unsetJoinExpr(p->pLeft, iTable, nullable); p = p->pRight; } } /* ** This routine processes the join information for a SELECT statement. -** ON and USING clauses are converted into extra terms of the WHERE clause. -** NATURAL joins also create extra WHERE clause terms. +** +** * A NATURAL join is converted into a USING join. After that, we +** do not need to be concerned with NATURAL joins and we only have +** think about USING joins. +** +** * ON and USING clauses result in extra terms being added to the +** WHERE clause to enforce the specified constraints. The extra +** WHERE clause terms will be tagged with EP_OuterON or +** EP_InnerON so that we know that they originated in ON/USING. ** ** The terms of a FROM clause are contained in the Select.pSrc structure. ** The left most table is the first entry in Select.pSrc. The right-most ** table is the last entry. The join operator is held in the entry to -** the left. Thus entry 0 contains the join operator for the join between +** the right. Thus entry 1 contains the join operator for the join between ** entries 0 and 1. Any ON or USING clauses associated with the join are -** also attached to the left entry. +** also attached to the right entry. ** ** This routine returns the number of errors encountered. */ -static int sqliteProcessJoin(Parse *pParse, Select *p){ +static int sqlite3ProcessJoin(Parse *pParse, Select *p){ SrcList *pSrc; /* All tables in the FROM clause */ int i, j; /* Loop counters */ SrcItem *pLeft; /* Left table being joined */ @@ -134730,49 +136090,41 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ pRight = &pLeft[1]; for(i=0; inSrc-1; i++, pRight++, pLeft++){ Table *pRightTab = pRight->pTab; - int isOuter; + u32 joinType; if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; - isOuter = (pRight->fg.jointype & JT_OUTER)!=0; + joinType = (pRight->fg.jointype & JT_OUTER)!=0 ? EP_OuterON : EP_InnerON; - /* When the NATURAL keyword is present, add WHERE clause terms for - ** every column that the two tables have in common. + /* If this is a NATURAL join, synthesize an approprate USING clause + ** to specify which columns should be joined. */ if( pRight->fg.jointype & JT_NATURAL ){ - if( pRight->pOn || pRight->pUsing ){ + IdList *pUsing = 0; + if( pRight->fg.isUsing || pRight->u3.pOn ){ sqlite3ErrorMsg(pParse, "a NATURAL join may not have " "an ON or USING clause", 0); return 1; } for(j=0; jnCol; j++){ char *zName; /* Name of column in the right table */ - int iLeft; /* Matching left table */ - int iLeftCol; /* Matching column in the left table */ if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; zName = pRightTab->aCol[j].zCnName; - if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ - addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, - isOuter, &p->pWhere); + if( tableAndColumnIndex(pSrc, 0, i, zName, 0, 0, 1) ){ + pUsing = sqlite3IdListAppend(pParse, pUsing, 0); + if( pUsing ){ + assert( pUsing->nId>0 ); + assert( pUsing->a[pUsing->nId-1].zName==0 ); + pUsing->a[pUsing->nId-1].zName = sqlite3DbStrDup(pParse->db, zName); + } } } - } - - /* Disallow both ON and USING clauses in the same join - */ - if( pRight->pOn && pRight->pUsing ){ - sqlite3ErrorMsg(pParse, "cannot have both ON and USING " - "clauses in the same join"); - return 1; - } - - /* Add the ON clause to the end of the WHERE clause, connected by - ** an AND operator. - */ - if( pRight->pOn ){ - if( isOuter ) sqlite3SetJoinExpr(pRight->pOn, pRight->iCursor); - p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->pOn); - pRight->pOn = 0; + if( pUsing ){ + pRight->fg.isUsing = 1; + pRight->fg.isSynthUsing = 1; + pRight->u3.pUsing = pUsing; + } + if( pParse->nErr ) return 1; } /* Create extra terms on the WHERE clause for each column named @@ -134782,27 +136134,88 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ ** Report an error if any column mentioned in the USING clause is ** not contained in both tables to be joined. */ - if( pRight->pUsing ){ - IdList *pList = pRight->pUsing; + if( pRight->fg.isUsing ){ + IdList *pList = pRight->u3.pUsing; + sqlite3 *db = pParse->db; + assert( pList!=0 ); for(j=0; jnId; j++){ char *zName; /* Name of the term in the USING clause */ int iLeft; /* Table on the left with matching column name */ int iLeftCol; /* Column number of matching column on the left */ int iRightCol; /* Column number of matching column on the right */ + Expr *pE1; /* Reference to the column on the LEFT of the join */ + Expr *pE2; /* Reference to the column on the RIGHT of the join */ + Expr *pEq; /* Equality constraint. pE1 == pE2 */ zName = pList->a[j].zName; iRightCol = sqlite3ColumnIndex(pRightTab, zName); if( iRightCol<0 - || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0) + || tableAndColumnIndex(pSrc, 0, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)==0 ){ sqlite3ErrorMsg(pParse, "cannot join using column %s - column " "not present in both tables", zName); return 1; } - addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol, - isOuter, &p->pWhere); + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + if( (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* This branch runs if the query contains one or more RIGHT or FULL + ** JOINs. If only a single table on the left side of this join + ** contains the zName column, then this branch is a no-op. + ** But if there are two or more tables on the left side + ** of the join, construct a coalesce() function that gathers all + ** such tables. Raise an error if more than one of those references + ** to zName is not also within a prior USING clause. + ** + ** We really ought to raise an error if there are two or more + ** non-USING references to zName on the left of an INNER or LEFT + ** JOIN. But older versions of SQLite do not do that, so we avoid + ** adding a new error so as to not break legacy applications. + */ + ExprList *pFuncArgs = 0; /* Arguments to the coalesce() */ + static const Token tkCoalesce = { "coalesce", 8 }; + while( tableAndColumnIndex(pSrc, iLeft+1, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)!=0 ){ + if( pSrc->a[iLeft].fg.isUsing==0 + || sqlite3IdListIndex(pSrc->a[iLeft].u3.pUsing, zName)<0 + ){ + sqlite3ErrorMsg(pParse, "ambiguous reference to %s in USING()", + zName); + break; + } + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + } + if( pFuncArgs ){ + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3ExprFunction(pParse, pFuncArgs, &tkCoalesce, 0); + } + } + pE2 = sqlite3CreateColumnExpr(db, pSrc, i+1, iRightCol); + sqlite3SrcItemColumnUsed(pRight, iRightCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); + assert( pE2!=0 || pEq==0 ); + if( pEq ){ + ExprSetProperty(pEq, joinType); + assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pEq, EP_NoReduce); + pEq->w.iJoin = pE2->iTable; + } + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pEq); } } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + else if( pRight->u3.pOn ){ + sqlite3SetJoinExpr(pRight->u3.pOn, pRight->iCursor, joinType); + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn); + pRight->u3.pOn = 0; + pRight->fg.isOn = 1; + } } return 0; } @@ -135191,7 +136604,7 @@ static void fixDistinctOpenEph( ** retrieved directly from table t1. If the values are very large, this ** can be more efficient than storing them directly in the sorter records. ** -** The ExprList_item.bSorterRef flag is set for each expression in pEList +** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList ** for which the sorter-reference optimization should be enabled. ** Additionally, the pSort->aDefer[] array is populated with entries ** for all cursors required to evaluate all selected expressions. Finally. @@ -135251,7 +136664,7 @@ static void selectExprDefer( nDefer++; } } - pItem->bSorterRef = 1; + pItem->fg.bSorterRef = 1; } } } @@ -135382,7 +136795,7 @@ static void selectInnerLoop( for(i=0; inExpr; i++){ if( pEList->a[i].u.x.iOrderByCol>0 #ifdef SQLITE_ENABLE_SORTER_REFERENCES - || pEList->a[i].bSorterRef + || pEList->a[i].fg.bSorterRef #endif ){ nResultCol--; @@ -135744,7 +137157,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( assert( sqlite3KeyInfoIsWriteable(pInfo) ); for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); - pInfo->aSortFlags[i-iStart] = pItem->sortFlags; + pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags; } } return pInfo; @@ -135872,7 +137285,7 @@ static void generateSortTail( if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); VdbeCoverage(v); - codeOffset(v, p->iOffset, addrContinue); + assert( p->iLimit==0 && p->iOffset==0 ); sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); bSeq = 0; }else{ @@ -135880,10 +137293,13 @@ static void generateSortTail( codeOffset(v, p->iOffset, addrContinue); iSortTab = iTab; bSeq = 1; + if( p->iOffset>0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); + } } for(i=0, iCol=nKey+bSeq-1; i=0; i--){ #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( aOutEx[i].bSorterRef ){ + if( aOutEx[i].fg.bSorterRef ){ sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); }else #endif @@ -136286,7 +137702,7 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames( assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ assert( p->op!=TK_COLUMN || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ - if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ + if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){ /* An AS clause always takes first priority */ char *zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); @@ -136371,22 +137787,25 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( *paCol = aCol; for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ + struct ExprList_item *pX = &pEList->a[i]; + struct ExprList_item *pCollide; /* Get an appropriate name for the column */ - if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){ + if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){ /* If the column contains an "AS " phrase, use as the name */ }else{ - Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){ pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } if( pColExpr->op==TK_COLUMN && ALWAYS( ExprUseYTab(pColExpr) ) - && (pTab = pColExpr->y.pTab)!=0 + && ALWAYS( pColExpr->y.pTab!=0 ) ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; + pTab = pColExpr->y.pTab; if( iCol<0 ) iCol = pTab->iPKey; zName = iCol>=0 ? pTab->aCol[iCol].zCnName : "rowid"; }else if( pColExpr->op==TK_ID ){ @@ -136394,7 +137813,7 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( zName = pColExpr->u.zToken; }else{ /* Use the original text of the column expression as its name */ - zName = pEList->a[i].zEName; + assert( zName==pX->zEName ); /* pointer comparison intended */ } } if( zName && !sqlite3IsTrueOrFalse(zName) ){ @@ -136407,7 +137826,10 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( ** append an integer to the name so that it becomes unique. */ cnt = 0; - while( zName && sqlite3HashFind(&ht, zName)!=0 ){ + while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){ + if( pCollide->fg.bUsingTerm ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } nName = sqlite3Strlen30(zName); if( nName>0 ){ for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} @@ -136418,8 +137840,11 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( } pCol->zCnName = zName; pCol->hName = sqlite3StrIHash(zName); + if( pX->fg.bNoExpand ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } sqlite3ColumnPropertiesFromName(0, pCol); - if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ + if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){ sqlite3OomFault(db); } } @@ -136676,7 +138101,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ } assert( sqlite3KeyInfoIsWriteable(pRet) ); pRet->aColl[i] = pColl; - pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; + pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags; } } @@ -136894,7 +138319,7 @@ static int multiSelectOrderBy( ** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES ** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))"). ** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case. -** Since the limit is exactly 1, we only need to evalutes the left-most VALUES. +** Since the limit is exactly 1, we only need to evaluate the left-most VALUES. */ static int multiSelectValues( Parse *pParse, /* Parsing context */ @@ -137863,10 +139288,11 @@ static int multiSelectOrderBy( */ sqlite3VdbeResolveLabel(v, labelEnd); - /* Reassembly the compound query so that it will be freed correctly + /* Reassemble the compound query so that it will be freed correctly ** by the calling function */ if( pSplit->pPrior ){ - sqlite3SelectDelete(db, pSplit->pPrior); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior); } pSplit->pPrior = pPrior; pPrior->pNext = pSplit; @@ -137887,12 +139313,40 @@ static int multiSelectOrderBy( ** ** All references to columns in table iTable are to be replaced by corresponding ** expressions in pEList. +** +** ## About "isOuterJoin": +** +** The isOuterJoin column indicates that the replacement will occur into a +** position in the parent that NULL-able due to an OUTER JOIN. Either the +** target slot in the parent is the right operand of a LEFT JOIN, or one of +** the left operands of a RIGHT JOIN. In either case, we need to potentially +** bypass the substituted expression with OP_IfNullRow. +** +** Suppose the original expression integer constant. Even though the table +** has the nullRow flag set, because the expression is an integer constant, +** it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode +** that checks to see if the nullRow flag is set on the table. If the nullRow +** flag is set, then the value in the register is set to NULL and the original +** expression is bypassed. If the nullRow flag is not set, then the original +** expression runs to populate the register. +** +** Example where this is needed: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); +** CREATE TABLE t2(x INT UNIQUE); +** +** SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x; +** +** When the subquery on the right side of the LEFT JOIN is flattened, we +** have to add OP_IfNullRow in front of the OP_Integer that implements the +** "m" value of the subquery so that a NULL will be loaded instead of 59 +** when processing a non-matched row of the left. */ typedef struct SubstContext { Parse *pParse; /* The parsing context */ int iTable; /* Replace references to this table */ int iNewTable; /* New table number */ - int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + int isOuterJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ ExprList *pEList; /* Replacement expressions */ } SubstContext; @@ -137918,10 +139372,11 @@ static Expr *substExpr( Expr *pExpr /* Expr in which substitution occurs */ ){ if( pExpr==0 ) return 0; - if( ExprHasProperty(pExpr, EP_FromJoin) - && pExpr->w.iRightJoinTable==pSubst->iTable + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) + && pExpr->w.iJoin==pSubst->iTable ){ - pExpr->w.iRightJoinTable = pSubst->iNewTable; + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + pExpr->w.iJoin = pSubst->iNewTable; } if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable @@ -137942,7 +139397,7 @@ static Expr *substExpr( sqlite3VectorErrorMsg(pSubst->pParse, pCopy); }else{ sqlite3 *db = pSubst->pParse->db; - if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ + if( pSubst->isOuterJoin && pCopy->op!=TK_COLUMN ){ memset(&ifNullRow, 0, sizeof(ifNullRow)); ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; @@ -137956,14 +139411,20 @@ static Expr *substExpr( sqlite3ExprDelete(db, pNew); return pExpr; } - if( pSubst->isLeftJoin ){ + if( pSubst->isOuterJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } - if( ExprHasProperty(pExpr,EP_FromJoin) ){ - sqlite3SetJoinExpr(pNew, pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ + sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, + pExpr->flags & (EP_OuterON|EP_InnerON)); } sqlite3ExprDelete(db, pExpr); pExpr = pNew; + if( pExpr->op==TK_TRUEFALSE ){ + pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); + pExpr->op = TK_INTEGER; + ExprSetProperty(pExpr, EP_IntValue); + } /* Ensure that the expression now has an implicit collation sequence, ** just as it did when it was a column of a view or sub-query. */ @@ -138124,8 +139585,8 @@ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){ renumberCursorDoMapping(pWalker, &pExpr->iTable); } - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - renumberCursorDoMapping(pWalker, &pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + renumberCursorDoMapping(pWalker, &pExpr->w.iJoin); } return WRC_Continue; } @@ -138210,6 +139671,7 @@ static void renumberCursors( ** table and ** (3c) the outer query may not be an aggregate. ** (3d) the outer query may not be DISTINCT. +** See also (26) for restrictions on RIGHT JOIN. ** ** (4) The subquery can not be DISTINCT. ** @@ -138261,6 +139723,9 @@ static void renumberCursors( ** (17d2) DISTINCT ** (17e) the subquery may not contain window functions, and ** (17f) the subquery must not be the RHS of a LEFT JOIN. +** (17g) either the subquery is the first element of the outer +** query or there are no RIGHT or FULL JOINs in any arm +** of the subquery. (This is a duplicate of condition (27b).) ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -138308,6 +139773,23 @@ static void renumberCursors( ** function in the select list or ORDER BY clause, flattening ** is not attempted. ** +** (26) The subquery may not be the right operand of a RIGHT JOIN. +** See also (3) for restrictions on LEFT JOIN. +** +** (27) The subquery may not contain a FULL or RIGHT JOIN unless it +** is the first element of the parent query. This must be the +** the case if: +** (27a) the subquery is not compound query, and +** (27b) the subquery is a compound query and the RIGHT JOIN occurs +** in any arm of the compound query. (See also (17g).) +** +** (28) The subquery is not a MATERIALIZED CTE. +** +** (29) Either the subquery is not the right-hand operand of a join with an +** ON or USING clause nor the right-hand operand of a NATURAL JOIN, or +** the right-most table within the FROM clause of the subquery +** is not part of an outer join. +** ** ** In this routine, the "p" parameter is a pointer to the outer query. ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query @@ -138333,7 +139815,7 @@ static int flattenSubquery( SrcList *pSubSrc; /* The FROM clause of the subquery */ int iParent; /* VDBE cursor number of the pSub result set temp table */ int iNewParent = -1;/* Replacement table for iParent */ - int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ + int isOuterJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ int i; /* Loop counter */ Expr *pWhere; /* The WHERE clause */ SrcItem *pSubitem; /* The subquery */ @@ -138406,26 +139888,64 @@ static int flattenSubquery( ** ** See also tickets #306, #350, and #3300. */ - if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ - isLeftJoin = 1; - if( pSubSrc->nSrc>1 /* (3a) */ - || isAgg /* (3b) */ - || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ - || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){ + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3c) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ ){ return 0; } + isOuterJoin = 1; } #ifdef SQLITE_EXTRA_IFNULLROW else if( iFrom>0 && !isAgg ){ - /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for + /* Setting isOuterJoin to -1 causes OP_IfNullRow opcodes to be generated for ** every reference to any result column from subquery in a join, even ** though they are not necessary. This will stress-test the OP_IfNullRow ** opcode. */ - isLeftJoin = -1; + isOuterJoin = -1; } #endif + assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */ + if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + return 0; /* Restriction (27a) */ + } + if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){ + return 0; /* (28) */ + } + + /* Restriction (29): + ** + ** We do not want two constraints on the same term of the flattened + ** query where one constraint has EP_InnerON and the other is EP_OuterON. + ** To prevent this, one or the other of the following conditions must be + ** false: + ** + ** (29a) The right-most entry in the FROM clause of the subquery + ** must not be part of an outer join. + ** + ** (29b) The subquery itself must not be the right operand of a + ** NATURAL join or a join that as an ON or USING clause. + ** + ** These conditions are sufficient to keep an EP_OuterON from being + ** flattened into an EP_InnerON. Restrictions (3a) and (27a) prevent + ** an EP_InnerON from being flattened into an EP_OuterON. + */ + if( pSubSrc->nSrc>=2 + && (pSubSrc->a[pSubSrc->nSrc-1].fg.jointype & JT_OUTER)!=0 + ){ + if( (pSubitem->fg.jointype & JT_NATURAL)!=0 + || pSubitem->fg.isUsing + || NEVER(pSubitem->u3.pOn!=0) /* ON clause already shifted into WHERE */ + || pSubitem->fg.isOn + ){ + return 0; + } + } + /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries ** that make up the compound SELECT are allowed to be aggregate or distinct @@ -138435,7 +139955,7 @@ static int flattenSubquery( if( pSub->pOrderBy ){ return 0; /* Restriction (20) */ } - if( isAgg || (p->selFlags & SF_Distinct)!=0 || isLeftJoin>0 ){ + if( isAgg || (p->selFlags & SF_Distinct)!=0 || isOuterJoin>0 ){ return 0; /* (17d1), (17d2), or (17f) */ } for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ @@ -138453,6 +139973,12 @@ static int flattenSubquery( ){ return 0; } + if( iFrom>0 && (pSub1->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* Without this restriction, the JT_LTORJ flag would end up being + ** omitted on left-hand tables of the right join that is being + ** flattened. */ + return 0; /* Restrictions (17g), (27b) */ + } testcase( pSub1->pSrc->nSrc>1 ); } @@ -138469,6 +139995,7 @@ static int flattenSubquery( if( pSrc->nSrc>1 ){ if( pParse->nSelect>500 ) return 0; + if( OptimizationDisabled(db, SQLITE_FlttnUnionAll) ) return 0; aCsrMap = sqlite3DbMallocZero(db, ((i64)pParse->nTab+1)*sizeof(int)); if( aCsrMap ) aCsrMap[0] = pParse->nTab; } @@ -138493,7 +140020,7 @@ static int flattenSubquery( pSubitem->zName = 0; pSubitem->zAlias = 0; pSubitem->pSelect = 0; - assert( pSubitem->pOn==0 ); + assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==0 ); /* If the sub-query is a compound SELECT statement, then (by restrictions ** 17 and 18 above) it must be a UNION ALL and the parent query must @@ -138603,6 +140130,7 @@ static int flattenSubquery( for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ int nSubSrc; u8 jointype = 0; + u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ; assert( pSub!=0 ); pSubSrc = pSub->pSrc; /* FROM clause of subquery */ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ @@ -138637,13 +140165,16 @@ static int flattenSubquery( ** outer query. */ for(i=0; ia[i+iFrom].pUsing); - assert( pSrc->a[i+iFrom].fg.isTabFunc==0 ); - pSrc->a[i+iFrom] = pSubSrc->a[i]; + SrcItem *pItem = &pSrc->a[i+iFrom]; + if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); + assert( pItem->fg.isTabFunc==0 ); + *pItem = pSubSrc->a[i]; + pItem->fg.jointype |= ltorj; iNewParent = pSubSrc->a[i].iCursor; memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); } - pSrc->a[iFrom].fg.jointype = jointype; + pSrc->a[iFrom].fg.jointype &= JT_LTORJ; + pSrc->a[iFrom].fg.jointype |= jointype | ltorj; /* Now begin substituting subquery result set expressions for ** references to the iParent in the outer query. @@ -138678,8 +140209,8 @@ static int flattenSubquery( } pWhere = pSub->pWhere; pSub->pWhere = 0; - if( isLeftJoin>0 ){ - sqlite3SetJoinExpr(pWhere, iNewParent); + if( isOuterJoin>0 ){ + sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON); } if( pWhere ){ if( pParent->pWhere ){ @@ -138693,7 +140224,7 @@ static int flattenSubquery( x.pParse = pParse; x.iTable = iParent; x.iNewTable = iNewParent; - x.isLeftJoin = isLeftJoin; + x.isOuterJoin = isOuterJoin; x.pEList = pSub->pEList; substSelect(&x, pParent, 0); } @@ -138728,8 +140259,8 @@ static int flattenSubquery( sqlite3WalkSelect(&w,pSub1); sqlite3SelectDelete(db, pSub1); -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p,("After flattening:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -138750,6 +140281,8 @@ struct WhereConst { int nConst; /* Number for COLUMN=CONSTANT terms */ int nChng; /* Number of times a constant is propagated */ int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ + u32 mExcludeOn; /* Which ON expressions to exclude from considertion. + ** Either EP_OuterON or EP_InnerON|EP_OuterON */ Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ }; @@ -138812,7 +140345,11 @@ static void constInsert( static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ Expr *pRight, *pLeft; if( NEVER(pExpr==0) ) return; - if( ExprHasProperty(pExpr, EP_FromJoin) ) return; + if( ExprHasProperty(pExpr, pConst->mExcludeOn) ){ + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + return; + } if( pExpr->op==TK_AND ){ findConstInWhere(pConst, pExpr->pRight); findConstInWhere(pConst, pExpr->pLeft); @@ -138848,9 +140385,10 @@ static int propagateConstantExprRewriteOne( int i; if( pConst->pOomFault[0] ) return WRC_Prune; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; - if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ + if( ExprHasProperty(pExpr, EP_FixedCol|pConst->mExcludeOn) ){ testcase( ExprHasProperty(pExpr, EP_FixedCol) ); - testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); return WRC_Continue; } for(i=0; inConst; i++){ @@ -138974,6 +140512,17 @@ static int propagateConstants( x.nChng = 0; x.apExpr = 0; x.bHasAffBlob = 0; + if( ALWAYS(p->pSrc!=0) + && p->pSrc->nSrc>0 + && (p->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 + ){ + /* Do not propagate constants on any ON clause if there is a + ** RIGHT JOIN anywhere in the query */ + x.mExcludeOn = EP_InnerON | EP_OuterON; + }else{ + /* Do not propagate constants through the ON clause of a LEFT JOIN */ + x.mExcludeOn = EP_OuterON; + } findConstInWhere(&x, p->pWhere); if( x.nConst ){ memset(&w, 0, sizeof(w)); @@ -139099,6 +140648,7 @@ static int pushDownWhereTerms( int nChng = 0; if( pWhere==0 ) return 0; if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0; + if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ) return 0; #ifndef SQLITE_OMIT_WINDOWFUNC if( pSubq->pPrior ){ @@ -139134,13 +140684,13 @@ static int pushDownWhereTerms( #if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ if( isLeftJoin - && (ExprHasProperty(pWhere,EP_FromJoin)==0 - || pWhere->w.iRightJoinTable!=iCursor) + && (ExprHasProperty(pWhere,EP_OuterON)==0 + || pWhere->w.iJoin!=iCursor) ){ return 0; /* restriction (4) */ } - if( ExprHasProperty(pWhere,EP_FromJoin) - && pWhere->w.iRightJoinTable!=iCursor + if( ExprHasProperty(pWhere,EP_OuterON) + && pWhere->w.iJoin!=iCursor ){ return 0; /* restriction (5) */ } @@ -139152,11 +140702,11 @@ static int pushDownWhereTerms( while( pSubq ){ SubstContext x; pNew = sqlite3ExprDup(pParse->db, pWhere, 0); - unsetJoinExpr(pNew, -1); + unsetJoinExpr(pNew, -1, 1); x.pParse = pParse; x.iTable = pSrc->iCursor; x.iNewTable = pSrc->iCursor; - x.isLeftJoin = 0; + x.isOuterJoin = 0; x.pEList = pSubq->pEList; pNew = substExpr(&x, pNew); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -139229,7 +140779,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); assert( pOrderBy!=0 || db->mallocFailed ); - if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; + if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags; return eRet; } @@ -139261,6 +140811,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect || pAggInfo->nFunc!=1 + || p->pHaving ){ return 0; } @@ -139365,7 +140916,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); if( pNew==0 ) return WRC_Abort; memset(&dummy, 0, sizeof(dummy)); - pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0); + pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0); if( pNewSrc==0 ) return WRC_Abort; *pNew = *p; p->pSrc = pNewSrc; @@ -139698,7 +141249,7 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ if( pFrom->zAlias ){ pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias); }else{ - pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId); + pTab->zName = sqlite3MPrintf(pParse->db, "%!S", pFrom); } while( pSel->pPrior ){ pSel = pSel->pPrior; } sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); @@ -139710,11 +141261,35 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ #else pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */ #endif + return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; +} - return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; +/* +** Check the N SrcItem objects to the right of pBase. (N might be zero!) +** If any of those SrcItem objects have a USING clause containing zName +** then return true. +** +** If N is zero, or none of the N SrcItem objects to the right of pBase +** contains a USING clause, or if none of the USING clauses contain zName, +** then return false. +*/ +static int inAnyUsingClause( + const char *zName, /* Name we are looking for */ + SrcItem *pBase, /* The base SrcItem. Looking at pBase[1] and following */ + int N /* How many SrcItems to check */ +){ + while( N>0 ){ + N--; + pBase++; + if( pBase->fg.isUsing==0 ) continue; + if( NEVER(pBase->u3.pUsing==0) ) continue; + if( sqlite3IdListIndex(pBase->u3.pUsing, zName)>=0 ) return 1; + } + return 0; } + /* ** This routine is a Walker callback for "expanding" a SELECT statement. ** "Expanding" means to do the following: @@ -139864,7 +141439,7 @@ static int selectExpander(Walker *pWalker, Select *p){ /* Process NATURAL keywords, and ON and USING clauses of joins. */ assert( db->mallocFailed==0 || pParse->nErr!=0 ); - if( pParse->nErr || sqliteProcessJoin(pParse, p) ){ + if( pParse->nErr || sqlite3ProcessJoin(pParse, p) ){ return WRC_Abort; } @@ -139912,7 +141487,7 @@ static int selectExpander(Walker *pWalker, Select *p){ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); if( pNew ){ pNew->a[pNew->nExpr-1].zEName = a[k].zEName; - pNew->a[pNew->nExpr-1].eEName = a[k].eEName; + pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName; a[k].zEName = 0; } a[k].pExpr = 0; @@ -139927,32 +141502,60 @@ static int selectExpander(Walker *pWalker, Select *p){ zTName = pE->pLeft->u.zToken; } for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - Select *pSub = pFrom->pSelect; - char *zTabName = pFrom->zAlias; - const char *zSchemaName = 0; - int iDb; - if( zTabName==0 ){ + Table *pTab = pFrom->pTab; /* Table for this data source */ + ExprList *pNestedFrom; /* Result-set of a nested FROM clause */ + char *zTabName; /* AS name for this data source */ + const char *zSchemaName = 0; /* Schema name for this data source */ + int iDb; /* Schema index for this data src */ + IdList *pUsing; /* USING clause for pFrom[1] */ + + if( (zTabName = pFrom->zAlias)==0 ){ zTabName = pTab->zName; } if( db->mallocFailed ) break; - if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){ - pSub = 0; + assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom->pSelect) ); + if( pFrom->fg.isNestedFrom ){ + assert( pFrom->pSelect!=0 ); + pNestedFrom = pFrom->pSelect->pEList; + assert( pNestedFrom!=0 ); + assert( pNestedFrom->nExpr==pTab->nCol ); + }else{ if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ continue; } + pNestedFrom = 0; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; } + if( i+1nSrc + && pFrom[1].fg.isUsing + && (selFlags & SF_NestedFrom)!=0 + ){ + int ii; + pUsing = pFrom[1].u3.pUsing; + for(ii=0; iinId; ii++){ + const char *zUName = pUsing->a[ii].zName; + pRight = sqlite3Expr(db, TK_ID, zUName); + pNew = sqlite3ExprListAppend(pParse, pNew, pRight); + if( pNew ){ + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + pX->zEName = sqlite3MPrintf(db,"..%s", zUName); + pX->fg.eEName = ENAME_TAB; + pX->fg.bUsingTerm = 1; + } + } + }else{ + pUsing = 0; + } for(j=0; jnCol; j++){ char *zName = pTab->aCol[j].zCnName; - char *zColname; /* The computed column name */ - char *zToFree; /* Malloced string that needs to be freed */ - Token sColname; /* Computed column name as a token */ + struct ExprList_item *pX; /* Newly added ExprList term */ assert( zName ); - if( zTName && pSub - && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0 + if( zTName + && pNestedFrom + && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0)==0 ){ continue; } @@ -139966,57 +141569,75 @@ static int selectExpander(Walker *pWalker, Select *p){ ){ continue; } + if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + && zTName==0 + && (selFlags & (SF_NestedFrom))==0 + ){ + continue; + } tableSeen = 1; - if( i>0 && zTName==0 ){ - if( (pFrom->fg.jointype & JT_NATURAL)!=0 - && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1) + if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){ + if( pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0 ){ - /* In a NATURAL join, omit the join columns from the - ** table to the right of the join */ - continue; - } - if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){ /* In a join with a USING clause, omit columns in the ** using clause from the table on the right. */ continue; } } pRight = sqlite3Expr(db, TK_ID, zName); - zColname = zName; - zToFree = 0; - if( longNames || pTabList->nSrc>1 ){ + if( (pTabList->nSrc>1 + && ( (pFrom->fg.jointype & JT_LTORJ)==0 + || (selFlags & SF_NestedFrom)!=0 + || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) + ) + ) + || IN_RENAME_OBJECT + ){ Expr *pLeft; pLeft = sqlite3Expr(db, TK_ID, zTabName); pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + if( IN_RENAME_OBJECT && pE->pLeft ){ + sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); + } if( zSchemaName ){ pLeft = sqlite3Expr(db, TK_ID, zSchemaName); pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); } - if( longNames ){ - zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); - zToFree = zColname; - } }else{ pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); - sqlite3TokenInit(&sColname, zColname); - sqlite3ExprListSetName(pParse, pNew, &sColname, 0); - if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ - struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; - sqlite3DbFree(db, pX->zEName); - if( pSub ){ - pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); + if( pNew==0 ){ + break; /* OOM */ + } + pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ + if( pNestedFrom ){ + pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName); testcase( pX->zEName==0 ); }else{ pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", - zSchemaName, zTabName, zColname); + zSchemaName, zTabName, zName); testcase( pX->zEName==0 ); } - pX->eEName = ENAME_TAB; + pX->fg.eEName = ENAME_TAB; + if( (pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0) + || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0) + || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + ){ + pX->fg.bNoExpand = 1; + } + }else if( longNames ){ + pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); + pX->fg.eEName = ENAME_NAME; + }else{ + pX->zEName = sqlite3DbStrDup(db, zName); + pX->fg.eEName = ENAME_NAME; } - sqlite3DbFree(db, zToFree); } } if( !tableSeen ){ @@ -140040,6 +141661,12 @@ static int selectExpander(Walker *pWalker, Select *p){ p->selFlags |= SF_ComplexResult; } } +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After result-set wildcard expansion:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif return WRC_Continue; } @@ -140430,8 +142057,8 @@ static void havingToWhere(Parse *pParse, Select *p){ sWalker.xExprCallback = havingToWhereExprCb; sWalker.u.pSelect = p; sqlite3WalkExpr(&sWalker, p->pHaving); -#if SELECTTRACE_ENABLED - if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){ +#if TREETRACE_ENABLED + if( sWalker.eCode && (sqlite3TreeTrace & 0x100)!=0 ){ SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140563,8 +142190,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ p->pEList->a[0].pExpr = pExpr; p->selFlags &= ~SF_Aggregate; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140573,6 +142200,29 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ } #endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ +/* +** If any term of pSrc, or any SF_NestedFrom sub-query, is not the same +** as pSrcItem but has the same alias as p0, then return true. +** Otherwise return false. +*/ +static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + SrcItem *p1 = &pSrc->a[i]; + if( p1==p0 ) continue; + if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ + return 1; + } + if( p1->pSelect + && (p1->pSelect->selFlags & SF_NestedFrom)!=0 + && sameSrcAlias(p0, p1->pSelect->pSrc) + ){ + return 1; + } + } + return 0; +} + /* ** Generate code for the SELECT statement given in the p argument. ** @@ -140617,10 +142267,14 @@ SQLITE_PRIVATE int sqlite3Select( } assert( db->mallocFailed==0 ); if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); - if( sqlite3SelectTrace & 0x100 ){ - sqlite3TreeViewSelect(0, p, 0); + if( sqlite3TreeTrace & 0x10100 ){ + if( (sqlite3TreeTrace & 0x10001)==0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Select() at %s:%d", + __FILE__, __LINE__); + } + sqlite3ShowSelect(p); } #endif @@ -140634,9 +142288,9 @@ SQLITE_PRIVATE int sqlite3Select( pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo ); /* All of these destinations are also able to ignore the ORDER BY clause */ if( p->pOrderBy ){ -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(1,pParse,p, ("dropping superfluous ORDER BY:\n")); - if( sqlite3SelectTrace & 0x100 ){ + if( sqlite3TreeTrace & 0x100 ){ sqlite3TreeViewExprList(0, p->pOrderBy, 0, "ORDERBY"); } #endif @@ -140655,8 +142309,8 @@ SQLITE_PRIVATE int sqlite3Select( } assert( db->mallocFailed==0 ); assert( p->pEList!=0 ); -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x104 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x104 ){ SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140673,15 +142327,12 @@ SQLITE_PRIVATE int sqlite3Select( ** disallow it altogether. */ if( p->selFlags & SF_UFSrcCheck ){ SrcItem *p0 = &p->pSrc->a[0]; - for(i=1; ipSrc->nSrc; i++){ - SrcItem *p1 = &p->pSrc->a[i]; - if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ - sqlite3ErrorMsg(pParse, - "target object/alias may not appear in FROM clause: %s", - p0->zAlias ? p0->zAlias : p0->pTab->zName - ); - goto select_end; - } + if( sameSrcAlias(p0, p->pSrc) ){ + sqlite3ErrorMsg(pParse, + "target object/alias may not appear in FROM clause: %s", + p0->zAlias ? p0->zAlias : p0->pTab->zName + ); + goto select_end; } /* Clear the SF_UFSrcCheck flag. The check has already been performed, @@ -140700,8 +142351,8 @@ SQLITE_PRIVATE int sqlite3Select( assert( pParse->nErr ); goto select_end; } -#if SELECTTRACE_ENABLED - if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){ +#if TREETRACE_ENABLED + if( p->pWin && (sqlite3TreeTrace & 0x108)!=0 ){ SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140729,14 +142380,16 @@ SQLITE_PRIVATE int sqlite3Select( /* Convert LEFT JOIN into JOIN if there are terms of the right table ** of the LEFT JOIN used in the WHERE clause. */ - if( (pItem->fg.jointype & JT_LEFT)!=0 + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==JT_LEFT && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) && OptimizationEnabled(db, SQLITE_SimplifyJoin) ){ SELECTTRACE(0x100,pParse,p, ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); - unsetJoinExpr(p->pWhere, pItem->iCursor); + assert( pItem->iCursor>=0 ); + unsetJoinExpr(p->pWhere, pItem->iCursor, + pTabList->a[0].fg.jointype & JT_LTORJ); } /* No futher action if this term of the FROM clause is no a subquery */ @@ -140789,7 +142442,9 @@ SQLITE_PRIVATE int sqlite3Select( ){ SELECTTRACE(0x100,pParse,p, ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); - sqlite3ExprListDelete(db, pSub->pOrderBy); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprListDelete, + pSub->pOrderBy); pSub->pOrderBy = 0; } @@ -140815,7 +142470,7 @@ SQLITE_PRIVATE int sqlite3Select( && i==0 && (p->selFlags & SF_ComplexResult)!=0 && (pTabList->nSrc==1 - || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) ){ continue; } @@ -140839,9 +142494,9 @@ SQLITE_PRIVATE int sqlite3Select( */ if( p->pPrior ){ rc = multiSelect(pParse, p, pDest); -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end compound-select processing\n")); - if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ sqlite3TreeViewSelect(0, p, 0); } #endif @@ -140860,8 +142515,8 @@ SQLITE_PRIVATE int sqlite3Select( && OptimizationEnabled(db, SQLITE_PropagateConst) && propagateConstants(pParse, p) ){ -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p,("After constant propagation:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140939,8 +142594,8 @@ SQLITE_PRIVATE int sqlite3Select( || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem) ){ -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p, ("After WHERE-clause push-down into subquery %d:\n", pSub->selId)); sqlite3TreeViewSelect(0, p, 0); @@ -140956,18 +142611,19 @@ SQLITE_PRIVATE int sqlite3Select( /* Generate code to implement the subquery ** - ** The subquery is implemented as a co-routine if: + ** The subquery is implemented as a co-routine if all of the following are + ** true: + ** ** (1) the subquery is guaranteed to be the outer loop (so that ** it does not need to be computed more than once), and ** (2) the subquery is not a CTE that should be materialized - ** - ** TODO: Are there other reasons beside (1) and (2) to use a co-routine - ** implementation? + ** (3) the subquery is not part of a left operand for a RIGHT JOIN */ if( i==0 && (pTabList->nSrc==1 - || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */ - && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */ + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) /* (1) */ + && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */ + && (pTabList->a[0].fg.jointype & JT_LTORJ)==0 /* (3) */ ){ /* Implement a co-routine that will return a single row of the result ** set on each invocation. @@ -141013,11 +142669,11 @@ SQLITE_PRIVATE int sqlite3Select( ** the same view can reuse the materialization. */ int topAddr; int onceAddr = 0; - int retAddr; pItem->regReturn = ++pParse->nMem; - topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + topAddr = sqlite3VdbeAddOp0(v, OP_Goto); pItem->addrFillSub = topAddr+1; + pItem->fg.isMaterialized = 1; if( pItem->fg.isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of ** a trigger, then we only need to compute the value of the subquery @@ -141032,9 +142688,9 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3Select(pParse, pSub, &dest); pItem->pTab->nRowLogEst = pSub->nSelectRow; if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + sqlite3VdbeAddOp2(v, OP_Return, pItem->regReturn, topAddr+1); VdbeComment((v, "end %!S", pItem)); - sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3VdbeJumpHere(v, topAddr); sqlite3ClearTempRegCache(pParse); if( pItem->fg.isCte && pItem->fg.isCorrelated==0 ){ CteUse *pCteUse = pItem->u2.pCteUse; @@ -141058,8 +142714,8 @@ SQLITE_PRIVATE int sqlite3Select( pHaving = p->pHaving; sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -141093,9 +142749,10 @@ SQLITE_PRIVATE int sqlite3Select( ** the sDistinct.isTnct is still set. Hence, isTnct represents the ** original setting of the SF_Distinct flag, not the current setting */ assert( sDistinct.isTnct ); + sDistinct.isTnct = 2; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -141128,6 +142785,18 @@ SQLITE_PRIVATE int sqlite3Select( */ if( pDest->eDest==SRT_EphemTab ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); + if( p->selFlags & SF_NestedFrom ){ + /* Delete or NULL-out result columns that will never be used */ + int ii; + for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){ + sqlite3ExprDelete(db, pEList->a[ii].pExpr); + sqlite3DbFree(db, pEList->a[ii].zEName); + pEList->nExpr--; + } + for(ii=0; iinExpr; ii++){ + if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; + } + } } /* Set the limiter. @@ -141277,8 +142946,9 @@ SQLITE_PRIVATE int sqlite3Select( ** ORDER BY to maximize the chances of rows being delivered in an ** order that makes the ORDER BY redundant. */ for(ii=0; iinExpr; ii++){ - u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; - pGroupBy->a[ii].sortFlags = sortFlags; + u8 sortFlags; + sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC; + pGroupBy->a[ii].fg.sortFlags = sortFlags; } if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ orderByGrp = 1; @@ -141347,8 +143017,8 @@ SQLITE_PRIVATE int sqlite3Select( } pAggInfo->mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ int ii; SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); sqlite3TreeViewSelect(0, p, 0); @@ -141436,7 +143106,8 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, pDistinct, - 0, (WHERE_GROUPBY|(orderByGrp ? WHERE_SORTBYGROUP : 0)|distFlag), 0 + 0, (sDistinct.isTnct==2 ? WHERE_DISTINCTBY : WHERE_GROUPBY) + | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0 ); if( pWInfo==0 ){ sqlite3ExprListDelete(db, pDistinct); @@ -141618,7 +143289,7 @@ SQLITE_PRIVATE int sqlite3Select( VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); - if( eDist!=WHERE_DISTINCT_NOOP ){ + if( distFlag!=0 && eDist!=WHERE_DISTINCT_NOOP ){ struct AggInfo_func *pF = &pAggInfo->aFunc[0]; fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); } @@ -141742,8 +143413,10 @@ SQLITE_PRIVATE int sqlite3Select( eDist = sqlite3WhereIsDistinct(pWInfo); updateAccumulator(pParse, regAcc, pAggInfo, eDist); if( eDist!=WHERE_DISTINCT_NOOP ){ - struct AggInfo_func *pF = &pAggInfo->aFunc[0]; - fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + struct AggInfo_func *pF = pAggInfo->aFunc; + if( pF ){ + fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + } } if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); @@ -141810,9 +143483,9 @@ SQLITE_PRIVATE int sqlite3Select( } #endif -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end processing\n")); - if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142077,9 +143750,7 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ Trigger *pList; /* List of triggers to return */ HashElem *p; /* Loop variable for TEMP triggers */ - if( pParse->disableTriggers ){ - return 0; - } + assert( pParse->disableTriggers==0 ); pTmpSchema = pParse->db->aDb[1].pSchema; p = sqliteHashFirst(&pTmpSchema->trigHash); pList = pTab->pTrigger; @@ -142092,11 +143763,10 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ ){ pTrig->pNext = pList; pList = pTrig; - }else if( pTrig->op==TK_RETURNING + }else if( pTrig->op==TK_RETURNING ){ #ifndef SQLITE_OMIT_VIRTUALTABLE - && pParse->db->pVtabCtx==0 + assert( pParse->db->pVtabCtx==0 ); #endif - ){ assert( pParse->bReturning ); assert( &(pParse->u1.pReturning->retTrig) == pTrig ); pTrig->table = pTab->zName; @@ -142379,6 +144049,23 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( Vdbe *v; char *z; + /* If this is a new CREATE TABLE statement, and if shadow tables + ** are read-only, and the trigger makes a change to a shadow table, + ** then raise an error - do not allow the trigger to be created. */ + if( sqlite3ReadOnlyShadowTables(db) ){ + TriggerStep *pStep; + for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget!=0 + && sqlite3ShadowTableName(db, pStep->zTarget) + ){ + sqlite3ErrorMsg(pParse, + "trigger \"%s\" may not write to shadow table \"%s\"", + pTrig->zName, pStep->zTarget); + goto triggerfinish_cleanup; + } + } + } + /* Make an entry in the sqlite_schema table */ v = sqlite3GetVdbe(pParse); if( v==0 ) goto triggerfinish_cleanup; @@ -142542,7 +144229,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( Parse *pParse, /* Parser */ Token *pTableName, /* Name of the table to be updated */ - SrcList *pFrom, + SrcList *pFrom, /* FROM clause for an UPDATE-FROM, or NULL */ ExprList *pEList, /* The SET clause: list of column and new values */ Expr *pWhere, /* The WHERE clause */ u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ @@ -142755,13 +144442,22 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ return 0; } +/* +** Return true if any TEMP triggers exist +*/ +static int tempTriggersExist(sqlite3 *db){ + if( NEVER(db->aDb[1].pSchema==0) ) return 0; + if( sqliteHashFirst(&db->aDb[1].pSchema->trigHash)==0 ) return 0; + return 1; +} + /* ** Return a list of all triggers on table pTab if there exists at least ** one trigger that must be fired when an operation of type 'op' is ** performed on the table, and, if that operation is an UPDATE, if at ** least one of the columns in pChanges is being modified. */ -SQLITE_PRIVATE Trigger *sqlite3TriggersExist( +static SQLITE_NOINLINE Trigger *triggersReallyExist( Parse *pParse, /* Parse context */ Table *pTab, /* The table the contains the triggers */ int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ @@ -142824,6 +144520,22 @@ SQLITE_PRIVATE Trigger *sqlite3TriggersExist( } return (mask ? pList : 0); } +SQLITE_PRIVATE Trigger *sqlite3TriggersExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + assert( pTab!=0 ); + if( (pTab->pTrigger==0 && !tempTriggersExist(pParse->db)) + || pParse->disableTriggers + ){ + if( pMask ) *pMask = 0; + return 0; + } + return triggersReallyExist(pParse,pTab,op,pChanges,pMask); +} /* ** Convert the pStep->zTarget string into a SrcList and return a pointer @@ -142853,6 +144565,14 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc( } if( pStep->pFrom ){ SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0); + if( pDup && pDup->nSrc>1 && !IN_RENAME_OBJECT ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pDup,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pDup = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup); } }else{ @@ -142908,7 +144628,7 @@ static ExprList *sqlite3ExpandReturning( if( !db->mallocFailed ){ struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); - pItem->eEName = ENAME_NAME; + pItem->fg.eEName = ENAME_NAME; } } }else{ @@ -142917,7 +144637,7 @@ static ExprList *sqlite3ExpandReturning( if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){ struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName); - pItem->eEName = pList->a[i].eEName; + pItem->fg.eEName = pList->a[i].fg.eEName; } } } @@ -143832,6 +145552,14 @@ SQLITE_PRIVATE void sqlite3Update( # define isView 0 #endif +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere, + onError, pOrderBy, pLimit, pUpsert, pTrigger); + } +#endif + /* If there was a FROM clause, set nChangeFrom to the number of expressions ** in the change-list. Otherwise, set it to 0. There cannot be a FROM ** clause if this function is being called to generate code for part of @@ -144476,7 +146204,7 @@ SQLITE_PRIVATE void sqlite3Update( }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); } - VdbeCoverageNeverTaken(v); + VdbeCoverage(v); } /* Do FK constraint checks. */ @@ -145482,6 +147210,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( assert( rc==SQLITE_OK ); if( pOut==0 ){ + nRes = sqlite3BtreeGetRequestedReserve(pTemp); rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1); } @@ -146924,6 +148653,28 @@ typedef struct WhereLoopBuilder WhereLoopBuilder; typedef struct WhereScan WhereScan; typedef struct WhereOrCost WhereOrCost; typedef struct WhereOrSet WhereOrSet; +typedef struct WhereMemBlock WhereMemBlock; +typedef struct WhereRightJoin WhereRightJoin; + +/* +** This object is a header on a block of allocated memory that will be +** automatically freed when its WInfo oject is destructed. +*/ +struct WhereMemBlock { + WhereMemBlock *pNext; /* Next block in the chain */ + u64 sz; /* Bytes of space */ +}; + +/* +** Extra information attached to a WhereLevel that is a RIGHT JOIN. +*/ +struct WhereRightJoin { + int iMatch; /* Cursor used to determine prior matched rows */ + int regBloom; /* Bloom filter for iRJMatch */ + int regReturn; /* Return register for the interior subroutine */ + int addrSubrtn; /* Starting address for the interior subroutine */ + int endSubrtn; /* The last opcode in the interior subroutine */ +}; /* ** This object contains information needed to implement a single nested @@ -146957,6 +148708,7 @@ struct WhereLevel { int addrLikeRep; /* LIKE range processing address */ #endif int regFilter; /* Bloom filter */ + WhereRightJoin *pRJ; /* Extra information for RIGHT JOIN */ u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ int p1, p2; /* Operands of the opcode used to end the loop */ @@ -147370,6 +149122,7 @@ struct WhereInfo { int iEndWhere; /* End of the WHERE clause itself */ WhereLoop *pLoops; /* List of all WhereLoop objects */ WhereExprMod *pExprMods; /* Expression modifications */ + WhereMemBlock *pMemToFree;/* Memory to free when this object destroyed */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ WhereClause sWC; /* Decomposition of the WHERE clause */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ @@ -147395,6 +149148,8 @@ SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( u32 op, /* Mask of WO_xx values describing operator */ Index *pIdx /* Must be compatible with this index, if not NULL */ ); +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte); +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte); /* wherecode.c: */ #ifndef SQLITE_OMIT_EXPLAIN @@ -147431,6 +149186,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +); /* whereexpr.c: */ SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); @@ -147473,8 +149233,9 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); #define WO_AND 0x0400 /* Two or more AND-connected terms */ #define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ #define WO_NOOP 0x1000 /* This term does not restrict search space */ +#define WO_ROWVAL 0x2000 /* A row-value term */ -#define WO_ALL 0x1fff /* Mask of all possible WO_* values */ +#define WO_ALL 0x3fff /* Mask of all possible WO_* values */ #define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ /* @@ -147698,6 +149459,9 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); } #endif + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&str, " LEFT-JOIN"); + } #ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS if( pLoop->nOut>=10 ){ sqlite3_str_appendf(&str, " (~%llu rows)", @@ -147841,7 +149605,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ int nLoop = 0; assert( pTerm!=0 ); while( (pTerm->wtFlags & TERM_CODED)==0 - && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_OuterON)) && (pLevel->notReady & pTerm->prereqAll)==0 ){ if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ @@ -148102,16 +149866,22 @@ static int codeEqualityTerm( if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ - sqlite3 *db = pParse->db; - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); - - if( !db->mallocFailed ){ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + }else{ + int n = sqlite3ExprVectorSize(pX->pLeft); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); - pTerm->pExpr->iTable = iTab; } - sqlite3ExprDelete(db, pX); - pX = pTerm->pExpr; + pX = pExpr; } if( eType==IN_INDEX_INDEX_DESC ){ @@ -148134,8 +149904,9 @@ static int codeEqualityTerm( i = pLevel->u.in.nIn; pLevel->u.in.nIn += nEq; pLevel->u.in.aInLoop = - sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, - sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + sqlite3WhereRealloc(pTerm->pWC->pWInfo, + pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); pIn = pLevel->u.in.aInLoop; if( pIn ){ int iMap = 0; /* Index in aiMap[] */ @@ -148556,8 +150327,8 @@ static void codeCursorHint( */ if( pTabItem->fg.jointype & JT_LEFT ){ Expr *pExpr = pTerm->pExpr; - if( !ExprHasProperty(pExpr, EP_FromJoin) - || pExpr->w.iRightJoinTable!=pTabItem->iCursor + if( !ExprHasProperty(pExpr, EP_OuterON) + || pExpr->w.iJoin!=pTabItem->iCursor ){ sWalker.eCode = 0; sWalker.xExprCallback = codeCursorHintIsOrFunction; @@ -148565,7 +150336,7 @@ static void codeCursorHint( if( sWalker.eCode ) continue; } }else{ - if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) continue; } /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize @@ -148613,13 +150384,21 @@ static void codeCursorHint( ** ** OP_DeferredSeek $iCur $iRowid ** +** Which causes a seek on $iCur to the row with rowid $iRowid. +** ** However, if the scan currently being coded is a branch of an OR-loop and -** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek -** is set to iIdxCur and P4 is set to point to an array of integers -** containing one entry for each column of the table cursor iCur is open -** on. For each table column, if the column is the i'th column of the -** index, then the corresponding array entry is set to (i+1). If the column -** does not appear in the index at all, the array entry is set to 0. +** the statement currently being coded is a SELECT, then additional information +** is added that might allow OP_Column to omit the seek and instead do its +** lookup on the index, thus avoiding an expensive seek operation. To +** enable this optimization, the P3 of OP_DeferredSeek is set to iIdxCur +** and P4 is set to an array of integers containing one entry for each column +** in the table. For each table column, if the column is the i'th +** column of the index, then the corresponding array entry is set to (i+1). +** If the column does not appear in the index at all, the array entry is set +** to 0. The OP_Column opcode can check this array to see if the column it +** wants is in the index and if it is, it will substitute the index cursor +** and column number and continue with those new values, rather than seeking +** the table cursor. */ static void codeDeferredSeek( WhereInfo *pWInfo, /* Where clause context */ @@ -148635,7 +150414,7 @@ static void codeDeferredSeek( pWInfo->bDeferredSeek = 1; sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); - if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) ){ int i; @@ -148735,7 +150514,6 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; - testcase( ExprHasProperty(pExpr, EP_Skip) ); testcase( ExprHasProperty(pExpr, EP_Unlikely) ); ExprClearProperty(pExpr, EP_Skip|EP_Unlikely|EP_WinFunc|EP_Subrtn); pExpr->y.pTab = 0; @@ -148991,7 +150769,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** initialize a memory cell that records if this table matches any ** row of the left table of the join. */ - assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0 ); if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ @@ -149002,7 +150780,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Compute a safe address to jump to if we discover that the table for ** this loop is empty and can never contribute content. */ - for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){} + for(j=iLevel; j>0; j--){ + if( pWInfo->a[j].iLeftJoin ) break; + if( pWInfo->a[j].pRJ ) break; + } addrHalt = pWInfo->a[j].addrBrk; /* Special case of a FROM clause subquery implemented as a co-routine */ @@ -149629,7 +151410,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Seek the table cursor, if required */ omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; + && (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ @@ -149663,7 +151444,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** move forward to the next index. ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } @@ -149682,7 +151463,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* The following assert() is not a requirement, merely an observation: ** The OR-optimization doesn't work for the right hand table of ** a LEFT JOIN: */ - assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ); } /* Record the instruction used to terminate the loop. */ @@ -149886,7 +151667,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( Expr *pDelete; /* Local copy of OR clause term */ int jmp1 = 0; /* Address of jump operation */ testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pOrExpr, EP_FromJoin) + && !ExprHasProperty(pOrExpr, EP_OuterON) ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ pDelete = pOrExpr = sqlite3ExprDup(db, pOrExpr, 0); if( db->mallocFailed ){ @@ -150024,6 +151805,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeGoto(v, pLevel->addrBrk); sqlite3VdbeResolveLabel(v, iLoopBody); + /* Set the P2 operand of the OP_Return opcode that will end the current + ** loop to point to this spot, which is the top of the next containing + ** loop. The byte-code formatter will use that P2 value as a hint to + ** indent everything in between the this point and the final OP_Return. + ** See tag-20220407a in vdbe.c and shell.c */ + assert( pLevel->op==OP_Return ); + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } if( !untestedTerms ) disableTerm(pLevel, pTerm); }else @@ -150086,10 +151875,22 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } pE = pTerm->pExpr; assert( pE!=0 ); - if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){ - continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ){ + if( !ExprHasProperty(pE,EP_OuterON|EP_InnerON) ){ + /* Defer processing WHERE clause constraints until after outer + ** join processing. tag-20220513a */ + continue; + }else if( (pTabItem->fg.jointype & JT_LEFT)==JT_LEFT + && !ExprHasProperty(pE,EP_OuterON) ){ + continue; + }else{ + Bitmask m = sqlite3WhereGetMask(&pWInfo->sMaskSet, pE->w.iJoin); + if( m & pLevel->notReady ){ + /* An ON clause that is not ripe */ + continue; + } + } } - if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ iNext = 2; continue; @@ -150148,7 +151949,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; if( pTerm->leftCursor!=iCur ) continue; - if( pTabItem->fg.jointype & JT_LEFT ) continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue; pE = pTerm->pExpr; #ifdef WHERETRACE_ENABLED /* 0x800 */ if( sqlite3WhereTrace & 0x800 ){ @@ -150156,7 +151957,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); } #endif - assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( !ExprHasProperty(pE, EP_OuterON) ); assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.x.leftColumn, notReady, @@ -150179,6 +151980,47 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pAlt->wtFlags |= TERM_CODED; } + /* For a RIGHT OUTER JOIN, record the fact that the current row has + ** been matched at least once. + */ + if( pLevel->pRJ ){ + Table *pTab; + int nPk; + int r; + int jmp1 = 0; + WhereRightJoin *pRJ = pLevel->pRJ; + + /* pTab is the right-hand table of the RIGHT JOIN. Generate code that + ** will record that the current row of that table has been matched at + ** least once. This is accomplished by storing the PK for the row in + ** both the iMatch index and the regBloom Bloom filter. + */ + pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab; + if( HasRowid(pTab) ){ + r = sqlite3GetTempRange(pParse, 2); + sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + r = sqlite3GetTempRange(pParse, nPk+1); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+1+iPk); + } + } + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, 0, r+1, nPk); + VdbeCoverage(v); + VdbeComment((v, "match against %s", pTab->zName)); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r+1, nPk, r); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pRJ->iMatch, r, r+1, nPk); + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pRJ->regBloom, 0, r+1, nPk); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3VdbeJumpHere(v, jmp1); + sqlite3ReleaseTempRange(pParse, r, nPk+1); + } + /* For a LEFT OUTER JOIN, generate code that will record the fact that ** at least one row of the right table has matched the left table. */ @@ -150186,6 +152028,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); VdbeComment((v, "record LEFT JOIN hit")); + if( pLevel->pRJ==0 ){ + goto code_outer_join_constraints; /* WHERE clause constraints */ + } + } + + if( pLevel->pRJ ){ + /* Create a subroutine used to process all interior loops and code + ** of the RIGHT JOIN. During normal operation, the subroutine will + ** be in-line with the rest of the code. But at the end, a separate + ** loop will run that invokes this subroutine for unmatched rows + ** of pTab, with all tables to left begin set to NULL. + */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn); + pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v); + assert( pParse->withinRJSubrtn < 255 ); + pParse->withinRJSubrtn++; + + /* WHERE clause constraints must be deferred until after outer join + ** row elimination has completed, since WHERE clause constraints apply + ** to the results of the OUTER JOIN. The following loop generates the + ** appropriate WHERE clause constraint checks. tag-20220513a. + */ + code_outer_join_constraints: for(pTerm=pWC->a, j=0; jnBase; j++, pTerm++){ testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_CODED ); @@ -150194,6 +152060,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( assert( pWInfo->untestedTerms ); continue; } + if( pTabItem->fg.jointype & JT_LTORJ ) continue; assert( pTerm->pExpr ); sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); pTerm->wtFlags |= TERM_CODED; @@ -150214,6 +152081,96 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( return pLevel->notReady; } +/* +** Generate the code for the loop that finds all non-matched terms +** for a RIGHT JOIN. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + WhereRightJoin *pRJ = pLevel->pRJ; + Expr *pSubWhere = 0; + WhereClause *pWC = &pWInfo->sWC; + WhereInfo *pSubWInfo; + WhereLoop *pLoop = pLevel->pWLoop; + SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + SrcList sFrom; + Bitmask mAll = 0; + int k; + + ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pTab->zName)); + sqlite3VdbeNoJumpsOutsideSubrtn(v, pRJ->addrSubrtn, pRJ->endSubrtn, + pRJ->regReturn); + for(k=0; ka[k].pWLoop->maskSelf; + sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur); + iIdxCur = pWInfo->a[k].iIdxCur; + if( iIdxCur ){ + sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur); + } + } + if( (pTabItem->fg.jointype & JT_LTORJ)==0 ){ + mAll |= pLoop->maskSelf; + for(k=0; knTerm; k++){ + WhereTerm *pTerm = &pWC->a[k]; + if( (pTerm->wtFlags & (TERM_VIRTUAL|TERM_SLICE))!=0 + && pTerm->eOperator!=WO_ROWVAL + ){ + break; + } + if( pTerm->prereqAll & ~mAll ) continue; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) ) continue; + pSubWhere = sqlite3ExprAnd(pParse, pSubWhere, + sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); + } + } + sFrom.nSrc = 1; + sFrom.nAlloc = 1; + memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem)); + sFrom.a[0].fg.jointype = 0; + assert( pParse->withinRJSubrtn < 100 ); + pParse->withinRJSubrtn++; + pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0, + WHERE_RIGHT_JOIN, 0); + if( pSubWInfo ){ + int iCur = pLevel->iTabCur; + int r = ++pParse->nMem; + int nPk; + int jmp; + int addrCont = sqlite3WhereContinueLabel(pSubWInfo); + Table *pTab = pTabItem->pTab; + if( HasRowid(pTab) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + pParse->nMem += nPk - 1; + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + } + } + jmp = sqlite3VdbeAddOp4Int(v, OP_Filter, pRJ->regBloom, 0, r, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, addrCont, r, nPk); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, jmp); + sqlite3VdbeAddOp2(v, OP_Gosub, pRJ->regReturn, pRJ->addrSubrtn); + sqlite3WhereEnd(pSubWInfo); + } + sqlite3ExprDelete(pParse->db, pSubWhere); + ExplainQueryPlanPop(pParse); + assert( pParse->withinRJSubrtn>0 ); + pParse->withinRJSubrtn--; +} + /************** End of wherecode.c *******************************************/ /************** Begin file whereexpr.c ***************************************/ /* @@ -150282,7 +152239,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ if( pWC->nTerm>=pWC->nSlot ){ WhereTerm *pOld = pWC->a; sqlite3 *db = pWC->pWInfo->pParse->db; - pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + pWC->a = sqlite3WhereMalloc(pWC->pWInfo, sizeof(pWC->a[0])*pWC->nSlot*2 ); if( pWC->a==0 ){ if( wtFlags & TERM_DYNAMIC ){ sqlite3ExprDelete(db, p); @@ -150291,10 +152248,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ return 0; } memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); - if( pOld!=pWC->aStatic ){ - sqlite3DbFree(db, pOld); - } - pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + pWC->nSlot = pWC->nSlot*2; } pTerm = &pWC->a[idx = pWC->nTerm++]; if( (wtFlags & TERM_VIRTUAL)==0 ) pWC->nBase = pWC->nTerm; @@ -150682,9 +152636,9 @@ static int isAuxiliaryVtabOperator( ** a join, then transfer the appropriate markings over to derived. */ static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ - if( pDerived ){ - pDerived->flags |= pBase->flags & EP_FromJoin; - pDerived->w.iRightJoinTable = pBase->w.iRightJoinTable; + if( pDerived && ExprHasProperty(pBase, EP_OuterON|EP_InnerON) ){ + pDerived->flags |= pBase->flags & (EP_OuterON|EP_InnerON); + pDerived->w.iJoin = pBase->w.iJoin; } } @@ -151138,7 +153092,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){ CollSeq *pColl; if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; - if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; aff1 = sqlite3ExprAffinity(pExpr->pLeft); aff2 = sqlite3ExprAffinity(pExpr->pRight); if( aff1!=aff2 @@ -151169,7 +153123,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ int i; for(i=0; inSrc; i++){ mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); - mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + if( pSrc->a[i].fg.isUsing==0 ){ + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn); + } if( pSrc->a[i].fg.isTabFunc ){ mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); } @@ -151324,18 +153280,32 @@ static void exprAnalyze( if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ printf("\n*** Incorrect prereqAll computed for:\n"); sqlite3TreeViewExpr(0,pExpr,0); - abort(); + assert( 0 ); } #endif - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iRightJoinTable); - prereqAll |= x; - extraRight = x-1; /* ON clause terms may not be used with an index - ** on left table of a LEFT JOIN. Ticket #3015 */ - if( (prereqAll>>1)>=x ){ - sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); - return; + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iJoin); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + if( (prereqAll>>1)>=x ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + }else if( (prereqAll>>1)>=x ){ + /* The ON clause of an INNER JOIN references a table to its right. + ** Most other SQL database engines raise an error. But SQLite versions + ** 3.0 through 3.38 just put the ON clause constraint into the WHERE + ** clause and carried on. Beginning with 3.39, raise an error only + ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite + ** more like other systems, and also preserves legacy. */ + if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + ExprClearProperty(pExpr, EP_InnerON); } } pTerm->prereqAll = prereqAll; @@ -151403,7 +153373,7 @@ static void exprAnalyze( pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; }else if( op==TK_ISNULL - && !ExprHasProperty(pExpr,EP_FromJoin) + && !ExprHasProperty(pExpr,EP_OuterON) && 0==sqlite3ExprCanBeNull(pLeft) ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); @@ -151474,7 +153444,7 @@ static void exprAnalyze( else if( pExpr->op==TK_NOTNULL ){ if( pExpr->pLeft->op==TK_COLUMN && pExpr->pLeft->iColumn>=0 - && !ExprHasProperty(pExpr, EP_FromJoin) + && !ExprHasProperty(pExpr, EP_OuterON) ){ Expr *pNewExpr; Expr *pLeft = pExpr->pLeft; @@ -151622,7 +153592,7 @@ static void exprAnalyze( } pTerm = &pWC->a[idxTerm]; pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */ - pTerm->eOperator = 0; + pTerm->eOperator = WO_ROWVAL; } /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create @@ -151678,9 +153648,9 @@ static void exprAnalyze( Expr *pNewExpr; pNewExpr = sqlite3PExpr(pParse, TK_MATCH, 0, sqlite3ExprDup(db, pRight, 0)); - if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ - ExprSetProperty(pNewExpr, EP_FromJoin); - pNewExpr->w.iRightJoinTable = pExpr->w.iRightJoinTable; + if( ExprHasProperty(pExpr, EP_OuterON) && pNewExpr ){ + ExprSetProperty(pNewExpr, EP_OuterON); + pNewExpr->w.iJoin = pExpr->w.iJoin; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -151823,7 +153793,7 @@ SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ /* This term is a vector operation that has been decomposed into ** other, subsequent terms. It can be ignored. See tag-20220128a */ assert( pWC->a[ii].wtFlags & TERM_VIRTUAL ); - assert( pWC->a[ii].eOperator==0 ); + assert( pWC->a[ii].eOperator==WO_ROWVAL ); continue; } if( pWC->a[ii].leftCursor!=iCsr ) return; @@ -151835,7 +153805,7 @@ SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ Expr *pExpr = pOrderBy->a[ii].pExpr; if( pExpr->op!=TK_COLUMN ) return; if( pExpr->iTable!=iCsr ) return; - if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return; + if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return; } } @@ -151902,9 +153872,6 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ a++; } } - if( pWC->a!=pWC->aStatic ){ - sqlite3DbFree(db, pWC->a); - } } @@ -152031,6 +153998,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( if( pArgs==0 ) return; for(j=k=0; jnExpr; j++){ Expr *pRhs; + u32 joinType; while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} if( k>=pTab->nCol ){ sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", @@ -152047,9 +154015,12 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); - if( pItem->fg.jointype & JT_LEFT ){ - sqlite3SetJoinExpr(pTerm, pItem->iCursor); + if( pItem->fg.jointype & (JT_LEFT|JT_LTORJ) ){ + joinType = EP_OuterON; + }else{ + joinType = EP_InnerON; } + sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType); whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); } } @@ -152160,7 +154131,7 @@ SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ } pInner = &pWInfo->a[pWInfo->nLevel-1]; assert( pInner->addrNxt!=0 ); - return pInner->addrNxt; + return pInner->pRJ ? pWInfo->iContinue : pInner->addrNxt; } /* @@ -152311,6 +154282,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ return 0; } +/* Allocate memory that is automatically freed when pWInfo is freed. +*/ +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte){ + WhereMemBlock *pBlock; + pBlock = sqlite3DbMallocRawNN(pWInfo->pParse->db, nByte+sizeof(*pBlock)); + if( pBlock ){ + pBlock->pNext = pWInfo->pMemToFree; + pBlock->sz = nByte; + pWInfo->pMemToFree = pBlock; + pBlock++; + } + return (void*)pBlock; +} +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte){ + void *pNew = sqlite3WhereMalloc(pWInfo, nByte); + if( pNew && pOld ){ + WhereMemBlock *pOldBlk = (WhereMemBlock*)pOld; + pOldBlk--; + assert( pOldBlk->szsz); + } + return pNew; +} + /* ** Create a new mask for cursor iCursor. ** @@ -152364,7 +154359,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ && (iColumn!=XN_EXPR || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, pScan->pIdxExpr,iCur)==0) - && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_OuterON)) ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaiCur) @@ -152716,6 +154711,7 @@ static void translateColumnToCopy( pOp->p1 = pOp->p2 + iRegister; pOp->p2 = pOp->p3; pOp->p3 = 0; + pOp->p5 = 2; /* Cause the MEM_Subtype flag to be cleared */ }else if( pOp->opcode==OP_Rowid ){ pOp->opcode = OP_Sequence; pOp->p1 = iAutoidxCur; @@ -152790,14 +154786,17 @@ static int termCanDriveIndex( char aff; if( pTerm->leftCursor!=pSrc->iCursor ) return 0; if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; - if( (pSrc->fg.jointype & JT_LEFT) - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - && (pTerm->eOperator & WO_IS) - ){ - /* Cannot use an IS term from the WHERE clause as an index driver for - ** the RHS of a LEFT JOIN. Such a term can only be used if it is from - ** the ON clause. */ - return 0; + assert( (pSrc->fg.jointype & JT_RIGHT)==0 ); + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + return 0; /* See tag-20191211-001 */ + } } if( (pTerm->prereqRight & notReady)!=0 ) return 0; assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); @@ -153138,7 +155137,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( const SrcItem *pTabItem; pLevel = &pWInfo->a[iLevel]; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; - if( pTabItem->fg.jointype & JT_LEFT ) continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ) ) continue; pLoop = pLevel->pWLoop; if( NEVER(pLoop==0) ) continue; if( pLoop->prereq & notReady ) continue; @@ -153211,12 +155210,20 @@ static sqlite3_index_info *allocateIndexInfo( assert( pTerm->u.x.leftColumnnCol ); /* tag-20191211-002: WHERE-clause constraints are not useful to the - ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the + ** right-hand table of a LEFT JOIN nor to the either table of a + ** RIGHT JOIN. See tag-20191211-001 for the ** equivalent restriction for ordinary tables. */ - if( (pSrc->fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - continue; + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } } nTerm++; pTerm->wtFlags |= TERM_OK; @@ -153239,7 +155246,7 @@ static sqlite3_index_info *allocateIndexInfo( } /* Virtual tables are unable to deal with NULLS FIRST */ - if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; + if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break; /* First case - a direct column references without a COLLATE operator */ if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ @@ -153269,8 +155276,10 @@ static sqlite3_index_info *allocateIndexInfo( } if( i==n ){ nOrderBy = n; - if( (pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY)) ){ - eDistinct = 1 + ((pWInfo->wctrlFlags & WHERE_DISTINCTBY)!=0); + if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){ + eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0); + }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){ + eDistinct = 1; } } } @@ -153349,7 +155358,7 @@ static sqlite3_index_info *allocateIndexInfo( || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN && pExpr->iColumn==pExpr->pLeft->iColumn) ); pIdxOrderBy[j].iColumn = pExpr->iColumn; - pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; + pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC; j++; } pIdxInfo->nOrderBy = j; @@ -153453,7 +155462,7 @@ static int whereKeyStats( #endif assert( pRec!=0 ); assert( pIdx->nSample>0 ); - assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol ); + assert( pRec->nField>0 ); /* Do a binary search to find the first sample greater than or equal ** to pRec. If pRec contains a single field, the set of samples to search @@ -153499,7 +155508,7 @@ static int whereKeyStats( ** it is extended to two fields. The duplicates that this creates do not ** cause any problems. */ - nField = pRec->nField; + nField = MIN(pRec->nField, pIdx->nSample); iCol = 0; iSample = pIdx->nSample * nField; do{ @@ -154090,7 +156099,7 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ memcpy(zType, "....", 5); if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; - if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) zType[2] = 'L'; if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; if( pTerm->eOperator & WO_SINGLE ){ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); @@ -154271,15 +156280,7 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ ** Free a WhereInfo structure */ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ - int i; assert( pWInfo!=0 ); - for(i=0; inLevel; i++){ - WhereLevel *pLevel = &pWInfo->a[i]; - if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE)!=0 ){ - assert( (pLevel->pWLoop->wsFlags & WHERE_MULTI_OR)==0 ); - sqlite3DbFree(db, pLevel->u.in.aInLoop); - } - } sqlite3WhereClauseClear(&pWInfo->sWC); while( pWInfo->pLoops ){ WhereLoop *p = pWInfo->pLoops; @@ -154287,6 +156288,11 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ whereLoopDelete(db, p); } assert( pWInfo->pExprMods==0 ); + while( pWInfo->pMemToFree ){ + WhereMemBlock *pNext = pWInfo->pMemToFree->pNext; + sqlite3DbFreeNN(db, pWInfo->pMemToFree); + pWInfo->pMemToFree = pNext; + } sqlite3DbFreeNN(db, pWInfo); } @@ -154655,10 +156661,11 @@ static void whereLoopOutputAdjust( ** ** 2022-03-24: Self-culling only applies if either the extra terms ** are straight comparison operators that are non-true with NULL - ** operand, or if the loop is not a LEFT JOIN. + ** operand, or if the loop is not an OUTER JOIN. */ if( (pTerm->eOperator & 0x3f)!=0 - || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 + || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype + & (JT_LEFT|JT_LTORJ))==0 ){ pLoop->wsFlags |= WHERE_SELFCULL; } @@ -154865,12 +156872,29 @@ static int whereLoopAddBtreeIndex( if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; /* tag-20191211-001: Do not allow constraints from the WHERE clause to - ** be used by the right table of a LEFT JOIN. Only constraints in the - ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */ - if( (pSrc->fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - continue; + ** be used by the right table of a LEFT JOIN nor by the left table of a + ** RIGHT JOIN. Only constraints in the ON clause are allowed. + ** See tag-20191211-002 for the vtab equivalent. + ** + ** 2022-06-06: See https://sqlite.org/forum/forumpost/206d99a16dd9212f + ** for an example of a WHERE clause constraints that may not be used on + ** the right table of a RIGHT JOIN because the constraint implies a + ** not-NULL condition on the left table of the RIGHT JOIN. + ** + ** 2022-06-10: The same condition applies to termCanDriveIndex() above. + ** https://sqlite.org/forum/forumpost/51e6959f61 + */ + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } } if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ @@ -155222,23 +157246,26 @@ static int indexMightHelpWithOrderBy( */ static int whereUsablePartialIndex( int iTab, /* The table for which we want an index */ - int isLeft, /* True if iTab is the right table of a LEFT JOIN */ + u8 jointype, /* The JT_* flags on the join */ WhereClause *pWC, /* The WHERE clause of the query */ Expr *pWhere /* The WHERE clause from the partial index */ ){ int i; WhereTerm *pTerm; - Parse *pParse = pWC->pWInfo->pParse; + Parse *pParse; + + if( jointype & JT_LTORJ ) return 0; + pParse = pWC->pWInfo->pParse; while( pWhere->op==TK_AND ){ - if( !whereUsablePartialIndex(iTab,isLeft,pWC,pWhere->pLeft) ) return 0; + if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0; pWhere = pWhere->pRight; } if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; pExpr = pTerm->pExpr; - if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->w.iRightJoinTable==iTab) - && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) + if( (!ExprHasProperty(pExpr, EP_OuterON) || pExpr->w.iJoin==iTab) + && ((jointype & JT_OUTER)==0 || ExprHasProperty(pExpr, EP_OuterON)) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) && (pTerm->wtFlags & TERM_VNULL)==0 ){ @@ -155347,13 +157374,14 @@ static int whereLoopAddBtree( #ifndef SQLITE_OMIT_AUTOMATIC_INDEX /* Automatic indexes */ if( !pBuilder->pOrSet /* Not part of an OR optimization */ - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + && (pWInfo->wctrlFlags & (WHERE_RIGHT_JOIN|WHERE_OR_SUBCLAUSE))==0 && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 && !pSrc->fg.isIndexedBy /* Has no INDEXED BY clause */ && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ && !pSrc->fg.isCorrelated /* Not a correlated subquery */ && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ + && (pSrc->fg.jointype & JT_RIGHT)==0 /* Not the right tab of a RIGHT JOIN */ ){ /* Generate auto-index WhereLoops */ LogEst rLogSize; /* Logarithm of the number of rows in the table */ @@ -155403,9 +157431,8 @@ static int whereLoopAddBtree( for(; rc==SQLITE_OK && pProbe; pProbe=(pSrc->fg.isIndexedBy ? 0 : pProbe->pNext), iSortIdx++ ){ - int isLeft = (pSrc->fg.jointype & JT_OUTER)!=0; if( pProbe->pPartIdxWhere!=0 - && !whereUsablePartialIndex(pSrc->iCursor, isLeft, pWC, + && !whereUsablePartialIndex(pSrc->iCursor, pSrc->fg.jointype, pWC, pProbe->pPartIdxWhere) ){ testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ @@ -155513,7 +157540,14 @@ static int whereLoopAddBtree( } ApplyCostMultiplier(pNew->rRun, pTab->costMult); whereLoopOutputAdjust(pWC, pNew, rSize); - rc = whereLoopInsert(pBuilder, pNew); + if( (pSrc->fg.jointype & JT_RIGHT)!=0 && pProbe->aColExpr ){ + /* Do not do an SCAN of a index-on-expression in a RIGHT JOIN + ** because the cursor used to access the index might not be + ** positioned to the correct row during the right-join no-match + ** loop. */ + }else{ + rc = whereLoopInsert(pBuilder, pNew); + } pNew->nOut = rSize; if( rc ) break; } @@ -155688,6 +157722,7 @@ static int whereLoopAddVirtualOne( *pbIn = 1; assert( (mExclude & WO_IN)==0 ); } + assert( pbRetryLimit || !isLimitTerm(pTerm) ); if( isLimitTerm(pTerm) && *pbIn ){ /* If there is an IN(...) term handled as an == (separate call to ** xFilter for each value on the RHS of the IN) and a LIMIT or @@ -155835,9 +157870,7 @@ SQLITE_API int sqlite3_vtab_rhs_value( */ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; - assert( pHidden->eDistinct==0 - || pHidden->eDistinct==1 - || pHidden->eDistinct==2 ); + assert( pHidden->eDistinct>=0 && pHidden->eDistinct<=3 ); return pHidden->eDistinct; } @@ -155845,15 +157878,26 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ && !defined(SQLITE_OMIT_VIRTUALTABLE) /* ** Cause the prepared statement that is associated with a call to -** xBestIndex to open write transactions on all attached schemas. +** xBestIndex to potentiall use all schemas. If the statement being +** prepared is read-only, then just start read transactions on all +** schemas. But if this is a write operation, start writes on all +** schemas. +** ** This is used by the (built-in) sqlite_dbpage virtual table. */ -SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){ +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info *pIdxInfo){ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; Parse *pParse = pHidden->pParse; int nDb = pParse->db->nDb; int i; - for(i=0; iwriteMask ){ + for(i=0; ipTabList->a + pNew->iTab; iCur = pItem->iCursor; + /* The multi-index OR optimization does not work for RIGHT and FULL JOIN */ + if( pItem->fg.jointype & JT_RIGHT ) return SQLITE_OK; + for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 @@ -156149,8 +158196,11 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ SrcItem *pEnd = &pTabList->a[pWInfo->nLevel]; sqlite3 *db = pWInfo->pParse->db; int rc = SQLITE_OK; + int bFirstPastRJ = 0; + int hasRightJoin = 0; WhereLoop *pNew; + /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); @@ -156160,18 +158210,30 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ pNew->iTab = iTab; pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); - if( (pItem->fg.jointype & (JT_LEFT|JT_CROSS))!=0 ){ - /* This condition is true when pItem is the FROM clause term on the - ** right-hand-side of a LEFT or CROSS JOIN. */ - mPrereq = mPrior; - }else{ + if( bFirstPastRJ + || (pItem->fg.jointype & (JT_OUTER|JT_CROSS|JT_LTORJ))!=0 + ){ + /* Add prerequisites to prevent reordering of FROM clause terms + ** across CROSS joins and outer joins. The bFirstPastRJ boolean + ** prevents the right operand of a RIGHT JOIN from being swapped with + ** other elements even further to the right. + ** + ** The JT_LTORJ case and the hasRightJoin flag work together to + ** prevent FROM-clause terms from moving from the right side of + ** a LEFT JOIN over to the left side of that join if the LEFT JOIN + ** is itself on the left side of a RIGHT JOIN. + */ + if( pItem->fg.jointype & JT_LTORJ ) hasRightJoin = 1; + mPrereq |= mPrior; + bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0; + }else if( !hasRightJoin ){ mPrereq = 0; } #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pItem->pTab) ){ SrcItem *p; for(p=&pItem[1]; pfg.jointype & (JT_LEFT|JT_CROSS)) ){ + if( mUnusable || (p->fg.jointype & (JT_OUTER|JT_CROSS)) ){ mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); } } @@ -156296,7 +158358,9 @@ static i8 wherePathSatisfiesOrderBy( pLoop = pLast; } if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ - if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){ + if( pLoop->u.vtab.isOrdered + && ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY) + ){ obSat = obDone; } break; @@ -156474,16 +158538,18 @@ static i8 wherePathSatisfiesOrderBy( /* Make sure the sort order is compatible in an ORDER BY clause. ** Sort order is irrelevant for a GROUP BY clause. */ if( revSet ){ - if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ + if( (rev ^ revIdx) + != (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC) + ){ isMatch = 0; } }else{ - rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); + rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC); if( rev ) *pRevMask |= MASKBIT(iLoop); revSet = 1; } } - if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){ if( j==pLoop->u.btree.nEq ){ pLoop->wsFlags |= WHERE_BIGNULL_SORT; }else{ @@ -156563,7 +158629,7 @@ static i8 wherePathSatisfiesOrderBy( ** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0 */ SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){ - assert( pWInfo->wctrlFlags & WHERE_GROUPBY ); + assert( pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) ); assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); return pWInfo->sorted; } @@ -156964,12 +159030,12 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } pWInfo->bOrderedInnerLoop = 0; if( pWInfo->pOrderBy ){ + pWInfo->nOBSat = pFrom->isOrdered; if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; } }else{ - pWInfo->nOBSat = pFrom->isOrdered; pWInfo->revMask = pFrom->revLoop; if( pWInfo->nOBSat<=0 ){ pWInfo->nOBSat = 0; @@ -157048,7 +159114,11 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pItem = pWInfo->pTabList->a; pTab = pItem->pTab; if( IsVirtual(pTab) ) return 0; - if( pItem->fg.isIndexedBy ) return 0; + if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){ + testcase( pItem->fg.isIndexedBy ); + testcase( pItem->fg.notIndexed ); + return 0; + } iCur = pItem->iCursor; pWC = &pWInfo->sWC; pLoop = pBuilder->pNew; @@ -157221,7 +159291,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( WhereLoop *pLoop; pLoop = pWInfo->a[i].pWLoop; pItem = &pWInfo->pTabList->a[pLoop->iTab]; - if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue; if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0 && (pLoop->wsFlags & WHERE_ONEROW)==0 ){ @@ -157231,8 +159301,8 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( pEnd = pWInfo->sWC.a + pWInfo->sWC.nTerm; for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ - if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - || pTerm->pExpr->w.iRightJoinTable!=pItem->iCursor + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON) + || pTerm->pExpr->w.iJoin!=pItem->iCursor ){ break; } @@ -157463,7 +159533,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** field (type Bitmask) it must be aligned on an 8-byte boundary on ** some architectures. Hence the ROUND8() below. */ - nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + nByteWInfo = ROUND8P(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); if( db->mallocFailed ){ sqlite3DbFree(db, pWInfo); @@ -157553,7 +159623,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); - if( db->mallocFailed ) goto whereBeginError; + if( pParse->nErr ) goto whereBeginError; /* Special case: WHERE terms that do not refer to any tables in the join ** (constant expressions). Evaluate each such term, and jump over all the @@ -157785,8 +159855,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* noop */ }else #endif - if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + if( ((pLoop->wsFlags & WHERE_IDX_ONLY)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0) + || (pTabItem->fg.jointype & (JT_LTORJ|JT_RIGHT))!=0 + ){ int op = OP_OpenRead; if( pWInfo->eOnePass!=ONEPASS_OFF ){ op = OP_OpenWrite; @@ -157855,6 +159927,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( iIndexCur = pParse->nTab++; } pLevel->iIdxCur = iIndexCur; + assert( pIx!=0 ); assert( pIx->pSchema==pTab->pSchema ); assert( iIndexCur>=0 ); if( op ){ @@ -157888,6 +159961,37 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); + if( (pTabItem->fg.jointype & JT_RIGHT)!=0 + && (pLevel->pRJ = sqlite3WhereMalloc(pWInfo, sizeof(WhereRightJoin)))!=0 + ){ + WhereRightJoin *pRJ = pLevel->pRJ; + pRJ->iMatch = pParse->nTab++; + pRJ->regBloom = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Blob, 65536, pRJ->regBloom); + pRJ->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, pRJ->regReturn); + assert( pTab==pTabItem->pTab ); + if( HasRowid(pTab) ){ + KeyInfo *pInfo; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1); + pInfo = sqlite3KeyInfoAlloc(pParse->db, 1, 0); + if( pInfo ){ + pInfo->aColl[0] = 0; + pInfo->aSortFlags[0] = 0; + sqlite3VdbeAppendP4(v, pInfo, P4_KEYINFO); + } + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + pLoop->wsFlags &= ~WHERE_IDX_ONLY; + /* The nature of RIGHT JOIN processing is such that it messes up + ** the output order. So omit any ORDER BY/GROUP BY elimination + ** optimizations. We need to do an actual sort for RIGHT JOIN. */ + pWInfo->nOBSat = 0; + pWInfo->eDistinct = WHERE_DISTINCT_UNORDERED; + } } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); if( db->mallocFailed ) goto whereBeginError; @@ -157899,9 +160003,20 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( for(ii=0; iinErr ) goto whereBeginError; pLevel = &pWInfo->a[ii]; wsFlags = pLevel->pWLoop->wsFlags; + pSrc = &pTabList->a[pLevel->iFrom]; + if( pSrc->fg.isMaterialized ){ + if( pSrc->fg.isCorrelated ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + }else{ + int iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + sqlite3VdbeJumpHere(v, iOnce); + } + } if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){ if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){ #ifndef SQLITE_OMIT_AUTOMATIC_INDEX @@ -157993,6 +160108,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ SrcList *pTabList = pWInfo->pTabList; sqlite3 *db = pParse->db; int iEnd = sqlite3VdbeCurrentAddr(v); + int nRJ = 0; /* Generate loop termination code. */ @@ -158000,6 +160116,17 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ for(i=pWInfo->nLevel-1; i>=0; i--){ int addr; pLevel = &pWInfo->a[i]; + if( pLevel->pRJ ){ + /* Terminate the subroutine that forms the interior of the loop of + ** the RIGHT JOIN table */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + pLevel->addrCont = 0; + pRJ->endSubrtn = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Return, pRJ->regReturn, pRJ->addrSubrtn, 1); + VdbeCoverage(v); + nRJ++; + } pLoop = pLevel->pWLoop; if( pLevel->op!=OP_Noop ){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT @@ -158027,7 +160154,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ /* The common case: Advance to the next row */ - sqlite3VdbeResolveLabel(v, pLevel->addrCont); + if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont); sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); sqlite3VdbeChangeP5(v, pLevel->p5); VdbeCoverage(v); @@ -158042,7 +160169,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); #endif - }else{ + }else if( pLevel->addrCont ){ sqlite3VdbeResolveLabel(v, pLevel->addrCont); } if( (pLoop->wsFlags & WHERE_IN_ABLE)!=0 && pLevel->u.in.nIn>0 ){ @@ -158092,6 +160219,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } } sqlite3VdbeResolveLabel(v, pLevel->addrBrk); + if( pLevel->pRJ ){ + sqlite3VdbeAddOp3(v, OP_Return, pLevel->pRJ->regReturn, 0, 1); + VdbeCoverage(v); + } if( pLevel->addrSkip ){ sqlite3VdbeGoto(v, pLevel->addrSkip); VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); @@ -158135,12 +160266,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); } - /* The "break" point is here, just past the end of the outer loop. - ** Set it. - */ - sqlite3VdbeResolveLabel(v, pWInfo->iBreak); - assert( pWInfo->nLevel<=pTabList->nSrc ); + if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo); for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ int k, last; VdbeOp *pOp, *pLastOp; @@ -158150,6 +160277,15 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ assert( pTab!=0 ); pLoop = pLevel->pWLoop; + /* Do RIGHT JOIN processing. Generate code that will output the + ** unmatched rows of the right operand of the RIGHT JOIN with + ** all of the columns of the left operand set to NULL. + */ + if( pLevel->pRJ ){ + sqlite3WhereRightJoinLoop(pWInfo, i, pLevel); + continue; + } + /* For a co-routine, change all OP_Column references to the table of ** the co-routine into OP_Copy of result contained in a register. ** OP_Rowid becomes OP_Null. @@ -158161,29 +160297,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } -#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE - /* Close all of the cursors that were opened by sqlite3WhereBegin. - ** Except, do not close cursors that will be reused by the OR optimization - ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors - ** created for the ONEPASS optimization. - */ - if( (pTab->tabFlags & TF_Ephemeral)==0 - && !IsView(pTab) - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 - ){ - int ws = pLoop->wsFlags; - if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ - sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); - } - if( (ws & WHERE_INDEXED)!=0 - && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 - && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] - ){ - sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); - } - } -#endif - /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can @@ -158284,11 +160397,16 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } } + /* The "break" point is here, just past the end of the outer loop. + ** Set it. + */ + sqlite3VdbeResolveLabel(v, pWInfo->iBreak); + /* Final cleanup */ - if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo); pParse->nQueryLoop = pWInfo->savedNQueryLoop; whereInfoFree(db, pWInfo); + pParse->withinRJSubrtn -= nRJ; return; } @@ -159020,7 +161138,7 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( } } } - pWin->pFunc = pFunc; + pWin->pWFunc = pFunc; } /* @@ -159212,7 +161330,7 @@ static ExprList *exprListAppendList( } } pList = sqlite3ExprListAppend(pParse, pList, pDup); - if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; + if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags; } } return pList; @@ -159332,9 +161450,9 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ ExprList *pArgs; assert( ExprUseXList(pWin->pOwner) ); - assert( pWin->pFunc!=0 ); + assert( pWin->pWFunc!=0 ); pArgs = pWin->pOwner->x.pList; - if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pWin->bExprArgs = 1; @@ -159716,7 +161834,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ } for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *p = pWin->pFunc; + FuncDef *p = pWin->pWFunc; if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ /* The inline versions of min() and max() require a single ephemeral ** table and 3 registers. The registers are used as follows: @@ -159733,7 +161851,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ pWin->csrApp = pParse->nTab++; pWin->regApp = pParse->nMem+1; pParse->nMem += 3; - if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ + if( pKeyInfo && pWin->pWFunc->zName[1]=='i' ){ assert( pKeyInfo->aSortFlags[0]==0 ); pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; } @@ -159956,7 +162074,7 @@ static void windowAggStep( Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; int regArg; int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); int i; @@ -160070,7 +162188,7 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ if( pMWin->regStartRowid==0 - && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->pWFunc->funcFlags & SQLITE_FUNC_MINMAX) && (pWin->eStart!=TK_UNBOUNDED) ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); @@ -160084,12 +162202,12 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ int nArg = windowArgCount(pWin); if( bFin ){ sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); }else{ sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); } } } @@ -160218,7 +162336,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; assert( ExprUseXList(pWin->pOwner) ); if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName @@ -160290,7 +162408,7 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ int nArg = 0; Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; assert( pWin->regAccum ); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); @@ -160320,7 +162438,7 @@ static int windowCacheFrame(Window *pMWin){ Window *pWin; if( pMWin->regStartRowid ) return 1; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; if( (pFunc->zName==nth_valueName) || (pFunc->zName==first_valueName) || (pFunc->zName==leadName) @@ -160413,7 +162531,7 @@ static void windowCodeRangeTest( assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); assert( pOrderBy && pOrderBy->nExpr==1 ); - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){ switch( op ){ case OP_Ge: op = OP_Le; break; case OP_Gt: op = OP_Lt; break; @@ -160446,7 +162564,7 @@ static void windowCodeRangeTest( ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is ** not taken, control jumps over the comparison operator coded below this ** block. */ - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){ /* This block runs if reg1 contains a NULL. */ int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); switch( op ){ @@ -160678,7 +162796,7 @@ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->zBase = sqlite3DbStrDup(db, p->zBase); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); - pNew->pFunc = p->pFunc; + pNew->pWFunc = p->pWFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eFrmType = p->eFrmType; @@ -161564,7 +163682,7 @@ static void updateDeleteLimitError( p->affExpr = 0; p->flags = EP_Leaf; ExprClearVVAProperties(p); - p->iAgg = -1; + /* p->iAgg = -1; // Not required */ p->pLeft = p->pRight = 0; p->pAggInfo = 0; memset(&p->x, 0, sizeof(p->x)); @@ -161897,6 +164015,7 @@ typedef union { With* yy521; const char* yy522; Expr* yy528; + OnOrUsing yy561; struct FrameBound yy595; } YYMINORTYPE; #ifndef YYSTACKDEPTH @@ -161913,18 +164032,18 @@ typedef union { #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 574 -#define YYNRULE 402 -#define YYNRULE_WITH_ACTION 340 +#define YYNSTATE 576 +#define YYNRULE 405 +#define YYNRULE_WITH_ACTION 342 #define YYNTOKEN 185 -#define YY_MAX_SHIFT 573 -#define YY_MIN_SHIFTREDUCE 831 -#define YY_MAX_SHIFTREDUCE 1232 -#define YY_ERROR_ACTION 1233 -#define YY_ACCEPT_ACTION 1234 -#define YY_NO_ACTION 1235 -#define YY_MIN_REDUCE 1236 -#define YY_MAX_REDUCE 1637 +#define YY_MAX_SHIFT 575 +#define YY_MIN_SHIFTREDUCE 835 +#define YY_MAX_SHIFTREDUCE 1239 +#define YY_ERROR_ACTION 1240 +#define YY_ACCEPT_ACTION 1241 +#define YY_NO_ACTION 1242 +#define YY_MIN_REDUCE 1243 +#define YY_MAX_REDUCE 1647 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -161991,427 +164110,430 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2070) +#define YY_ACTTAB_COUNT (2098) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 566, 1307, 566, 1286, 201, 201, 566, 116, 112, 222, - /* 10 */ 566, 1307, 377, 566, 116, 112, 222, 397, 408, 409, - /* 20 */ 1260, 378, 1269, 41, 41, 41, 41, 1412, 1517, 71, - /* 30 */ 71, 967, 1258, 41, 41, 491, 71, 71, 272, 968, - /* 40 */ 298, 476, 298, 123, 124, 114, 1210, 1210, 1044, 1047, - /* 50 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 543, 409, - /* 60 */ 1234, 1, 1, 573, 2, 1238, 548, 116, 112, 222, - /* 70 */ 309, 480, 142, 548, 1272, 524, 116, 112, 222, 1320, - /* 80 */ 417, 523, 547, 123, 124, 114, 1210, 1210, 1044, 1047, - /* 90 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 424, 116, - /* 100 */ 112, 222, 120, 120, 120, 120, 119, 119, 118, 118, - /* 110 */ 118, 117, 113, 444, 277, 277, 277, 277, 560, 560, - /* 120 */ 560, 1558, 376, 1560, 1186, 375, 1157, 563, 1157, 563, - /* 130 */ 409, 1558, 537, 252, 219, 1553, 99, 141, 449, 6, - /* 140 */ 365, 233, 120, 120, 120, 120, 119, 119, 118, 118, - /* 150 */ 118, 117, 113, 444, 123, 124, 114, 1210, 1210, 1044, - /* 160 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 138, - /* 170 */ 289, 1186, 1546, 448, 118, 118, 118, 117, 113, 444, - /* 180 */ 125, 1186, 1187, 1188, 144, 465, 334, 566, 150, 127, - /* 190 */ 444, 122, 122, 122, 122, 115, 120, 120, 120, 120, - /* 200 */ 119, 119, 118, 118, 118, 117, 113, 444, 454, 419, - /* 210 */ 13, 13, 215, 120, 120, 120, 120, 119, 119, 118, - /* 220 */ 118, 118, 117, 113, 444, 422, 308, 557, 1186, 1187, - /* 230 */ 1188, 441, 440, 409, 1271, 122, 122, 122, 122, 120, - /* 240 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, - /* 250 */ 444, 1543, 98, 1033, 1033, 1045, 1048, 123, 124, 114, - /* 260 */ 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, - /* 270 */ 122, 122, 566, 406, 405, 1186, 566, 409, 1217, 319, - /* 280 */ 1217, 80, 81, 120, 120, 120, 120, 119, 119, 118, - /* 290 */ 118, 118, 117, 113, 444, 70, 70, 1186, 1604, 71, - /* 300 */ 71, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, - /* 310 */ 121, 121, 122, 122, 122, 122, 120, 120, 120, 120, - /* 320 */ 119, 119, 118, 118, 118, 117, 113, 444, 1037, 210, - /* 330 */ 1186, 365, 1186, 1187, 1188, 245, 548, 399, 504, 501, - /* 340 */ 500, 108, 558, 138, 4, 516, 933, 433, 499, 217, - /* 350 */ 514, 522, 352, 879, 1186, 1187, 1188, 383, 561, 566, - /* 360 */ 120, 120, 120, 120, 119, 119, 118, 118, 118, 117, - /* 370 */ 113, 444, 277, 277, 16, 16, 1598, 441, 440, 153, - /* 380 */ 409, 445, 13, 13, 1279, 563, 1214, 1186, 1187, 1188, - /* 390 */ 1003, 1216, 264, 555, 1574, 186, 566, 427, 138, 1215, - /* 400 */ 308, 557, 472, 138, 123, 124, 114, 1210, 1210, 1044, - /* 410 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 55, - /* 420 */ 55, 413, 1023, 507, 1217, 1186, 1217, 474, 106, 106, - /* 430 */ 1312, 1312, 1186, 171, 566, 384, 107, 380, 445, 568, - /* 440 */ 567, 430, 1543, 1013, 332, 549, 565, 263, 280, 360, - /* 450 */ 510, 355, 509, 250, 491, 308, 557, 71, 71, 351, - /* 460 */ 308, 557, 374, 120, 120, 120, 120, 119, 119, 118, - /* 470 */ 118, 118, 117, 113, 444, 1013, 1013, 1015, 1016, 27, - /* 480 */ 277, 277, 1186, 1187, 1188, 1152, 566, 528, 409, 1186, - /* 490 */ 1187, 1188, 348, 563, 548, 1260, 533, 517, 1152, 1516, - /* 500 */ 317, 1152, 285, 550, 485, 569, 566, 569, 482, 51, - /* 510 */ 51, 207, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, - /* 520 */ 1036, 121, 121, 122, 122, 122, 122, 171, 1412, 13, - /* 530 */ 13, 409, 277, 277, 1186, 505, 119, 119, 118, 118, - /* 540 */ 118, 117, 113, 444, 429, 563, 518, 220, 515, 1552, - /* 550 */ 365, 546, 1186, 6, 532, 123, 124, 114, 1210, 1210, - /* 560 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 570 */ 145, 120, 120, 120, 120, 119, 119, 118, 118, 118, - /* 580 */ 117, 113, 444, 245, 566, 474, 504, 501, 500, 566, - /* 590 */ 1481, 1186, 1187, 1188, 1310, 1310, 499, 1186, 149, 425, - /* 600 */ 1186, 480, 409, 274, 365, 952, 872, 56, 56, 1186, - /* 610 */ 1187, 1188, 71, 71, 120, 120, 120, 120, 119, 119, - /* 620 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 630 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 640 */ 122, 409, 541, 1552, 83, 865, 98, 6, 928, 529, - /* 650 */ 848, 543, 151, 927, 1186, 1187, 1188, 1186, 1187, 1188, - /* 660 */ 290, 1543, 187, 1633, 395, 123, 124, 114, 1210, 1210, - /* 670 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 680 */ 566, 954, 566, 453, 953, 120, 120, 120, 120, 119, - /* 690 */ 119, 118, 118, 118, 117, 113, 444, 1152, 221, 1186, - /* 700 */ 331, 453, 452, 13, 13, 13, 13, 1003, 365, 463, - /* 710 */ 1152, 193, 409, 1152, 382, 1543, 1170, 32, 297, 474, - /* 720 */ 195, 1527, 5, 952, 120, 120, 120, 120, 119, 119, - /* 730 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 740 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 750 */ 122, 409, 1067, 419, 1186, 1024, 1186, 1187, 1188, 1186, - /* 760 */ 419, 332, 460, 320, 544, 1545, 442, 442, 442, 566, - /* 770 */ 3, 117, 113, 444, 453, 123, 124, 114, 1210, 1210, - /* 780 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 790 */ 1473, 566, 15, 15, 293, 120, 120, 120, 120, 119, - /* 800 */ 119, 118, 118, 118, 117, 113, 444, 1186, 566, 1486, - /* 810 */ 1412, 1186, 1187, 1188, 13, 13, 1186, 1187, 1188, 1544, - /* 820 */ 271, 271, 409, 286, 308, 557, 1008, 1486, 1488, 196, - /* 830 */ 288, 71, 71, 563, 120, 120, 120, 120, 119, 119, - /* 840 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 850 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 860 */ 122, 409, 201, 1087, 1186, 1187, 1188, 1324, 304, 1529, - /* 870 */ 388, 278, 278, 450, 564, 402, 922, 922, 566, 563, - /* 880 */ 566, 426, 491, 480, 563, 123, 124, 114, 1210, 1210, - /* 890 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 900 */ 1486, 71, 71, 13, 13, 120, 120, 120, 120, 119, - /* 910 */ 119, 118, 118, 118, 117, 113, 444, 566, 545, 566, - /* 920 */ 1577, 573, 2, 1238, 1092, 1092, 488, 1480, 309, 1525, - /* 930 */ 142, 324, 409, 836, 837, 838, 312, 1320, 305, 363, - /* 940 */ 43, 43, 57, 57, 120, 120, 120, 120, 119, 119, - /* 950 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 960 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 970 */ 122, 12, 277, 277, 566, 1152, 409, 572, 428, 1238, - /* 980 */ 465, 334, 296, 474, 309, 563, 142, 249, 1152, 308, - /* 990 */ 557, 1152, 321, 1320, 323, 491, 455, 71, 71, 233, - /* 1000 */ 283, 101, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, - /* 1010 */ 121, 122, 122, 122, 122, 120, 120, 120, 120, 119, - /* 1020 */ 119, 118, 118, 118, 117, 113, 444, 1108, 277, 277, - /* 1030 */ 1412, 448, 394, 1230, 439, 277, 277, 248, 247, 246, - /* 1040 */ 1319, 563, 1109, 313, 198, 294, 491, 1318, 563, 464, - /* 1050 */ 566, 1427, 394, 1130, 1023, 233, 414, 1110, 295, 120, - /* 1060 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, - /* 1070 */ 444, 1014, 104, 71, 71, 1013, 322, 496, 908, 566, - /* 1080 */ 277, 277, 277, 277, 1108, 1261, 415, 448, 909, 361, - /* 1090 */ 1571, 1315, 409, 563, 952, 563, 9, 202, 255, 1109, - /* 1100 */ 316, 487, 44, 44, 249, 559, 415, 1013, 1013, 1015, - /* 1110 */ 443, 1231, 409, 1603, 1110, 897, 123, 124, 114, 1210, - /* 1120 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1130 */ 122, 1231, 409, 1207, 215, 554, 123, 124, 114, 1210, - /* 1140 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1150 */ 122, 1131, 1631, 470, 1631, 255, 123, 111, 114, 1210, - /* 1160 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1170 */ 122, 1131, 1632, 414, 1632, 120, 120, 120, 120, 119, - /* 1180 */ 119, 118, 118, 118, 117, 113, 444, 221, 209, 351, - /* 1190 */ 1207, 1207, 147, 1426, 491, 120, 120, 120, 120, 119, - /* 1200 */ 119, 118, 118, 118, 117, 113, 444, 1256, 539, 519, - /* 1210 */ 888, 551, 952, 12, 566, 120, 120, 120, 120, 119, - /* 1220 */ 119, 118, 118, 118, 117, 113, 444, 538, 566, 860, - /* 1230 */ 1129, 361, 1571, 346, 1356, 409, 1163, 58, 58, 339, - /* 1240 */ 1355, 508, 277, 277, 277, 277, 277, 277, 1207, 889, - /* 1250 */ 1129, 59, 59, 459, 363, 563, 566, 563, 96, 563, - /* 1260 */ 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, - /* 1270 */ 122, 122, 122, 122, 566, 1412, 566, 281, 1186, 60, - /* 1280 */ 60, 110, 392, 392, 391, 266, 389, 860, 1163, 845, - /* 1290 */ 566, 481, 566, 436, 341, 1152, 344, 61, 61, 62, - /* 1300 */ 62, 967, 227, 1550, 315, 431, 540, 6, 1152, 968, - /* 1310 */ 566, 1152, 314, 45, 45, 46, 46, 512, 120, 120, - /* 1320 */ 120, 120, 119, 119, 118, 118, 118, 117, 113, 444, - /* 1330 */ 416, 173, 1532, 47, 47, 1186, 1187, 1188, 108, 558, - /* 1340 */ 325, 4, 229, 1551, 928, 566, 437, 6, 566, 927, - /* 1350 */ 164, 566, 1290, 137, 1190, 561, 566, 1549, 566, 1089, - /* 1360 */ 566, 6, 566, 1089, 531, 566, 868, 8, 49, 49, - /* 1370 */ 228, 50, 50, 566, 63, 63, 566, 457, 445, 64, - /* 1380 */ 64, 65, 65, 14, 14, 66, 66, 407, 129, 129, - /* 1390 */ 555, 566, 458, 566, 1505, 486, 67, 67, 566, 52, - /* 1400 */ 52, 546, 407, 467, 535, 410, 226, 1023, 566, 534, - /* 1410 */ 308, 557, 1190, 407, 68, 68, 69, 69, 566, 1023, - /* 1420 */ 566, 53, 53, 868, 1014, 106, 106, 525, 1013, 566, - /* 1430 */ 1504, 159, 159, 107, 451, 445, 568, 567, 471, 307, - /* 1440 */ 1013, 160, 160, 76, 76, 566, 1548, 466, 407, 407, - /* 1450 */ 6, 1225, 54, 54, 478, 276, 219, 566, 887, 886, - /* 1460 */ 1013, 1013, 1015, 84, 206, 1206, 230, 282, 72, 72, - /* 1470 */ 329, 483, 1013, 1013, 1015, 1016, 27, 1576, 1174, 447, - /* 1480 */ 130, 130, 281, 148, 105, 38, 103, 392, 392, 391, - /* 1490 */ 266, 389, 566, 1126, 845, 396, 566, 108, 558, 566, - /* 1500 */ 4, 311, 566, 30, 17, 566, 279, 227, 566, 315, - /* 1510 */ 108, 558, 468, 4, 561, 73, 73, 314, 566, 157, - /* 1520 */ 157, 566, 131, 131, 526, 132, 132, 561, 128, 128, - /* 1530 */ 566, 158, 158, 566, 31, 291, 566, 445, 330, 521, - /* 1540 */ 98, 152, 152, 420, 136, 136, 1005, 229, 254, 555, - /* 1550 */ 445, 479, 336, 135, 135, 164, 133, 133, 137, 134, - /* 1560 */ 134, 875, 555, 535, 566, 473, 566, 254, 536, 475, - /* 1570 */ 335, 254, 98, 894, 895, 228, 535, 566, 1023, 566, - /* 1580 */ 1074, 534, 210, 232, 106, 106, 1352, 75, 75, 77, - /* 1590 */ 77, 1023, 107, 340, 445, 568, 567, 106, 106, 1013, - /* 1600 */ 74, 74, 42, 42, 566, 107, 343, 445, 568, 567, - /* 1610 */ 410, 497, 1013, 251, 359, 308, 557, 1135, 349, 875, - /* 1620 */ 98, 1070, 345, 251, 358, 1591, 347, 48, 48, 1017, - /* 1630 */ 1303, 1013, 1013, 1015, 1016, 27, 1289, 1287, 1074, 451, - /* 1640 */ 961, 925, 254, 110, 1013, 1013, 1015, 1016, 27, 1174, - /* 1650 */ 447, 970, 971, 281, 108, 558, 1288, 4, 392, 392, - /* 1660 */ 391, 266, 389, 1343, 1086, 845, 1086, 1085, 858, 1085, - /* 1670 */ 146, 561, 926, 354, 110, 303, 364, 553, 227, 1364, - /* 1680 */ 315, 108, 558, 1411, 4, 1339, 492, 1017, 314, 1350, - /* 1690 */ 1565, 552, 1417, 1268, 445, 204, 1259, 1247, 561, 1246, - /* 1700 */ 1248, 1584, 269, 1336, 367, 369, 555, 371, 11, 212, - /* 1710 */ 393, 225, 1393, 284, 1398, 456, 287, 327, 229, 328, - /* 1720 */ 292, 445, 1386, 216, 333, 1403, 164, 477, 373, 137, - /* 1730 */ 1402, 400, 502, 555, 1286, 1023, 357, 1477, 199, 1587, - /* 1740 */ 211, 106, 106, 932, 1476, 1225, 228, 556, 175, 107, - /* 1750 */ 200, 445, 568, 567, 258, 387, 1013, 1524, 1522, 223, - /* 1760 */ 1222, 418, 1023, 83, 208, 79, 82, 184, 106, 106, - /* 1770 */ 1482, 169, 177, 461, 179, 462, 107, 1399, 445, 568, - /* 1780 */ 567, 410, 180, 1013, 495, 181, 308, 557, 1013, 1013, - /* 1790 */ 1015, 1016, 27, 182, 35, 235, 100, 558, 398, 4, - /* 1800 */ 96, 1405, 1404, 36, 484, 469, 1407, 188, 401, 1471, - /* 1810 */ 451, 89, 1493, 561, 239, 1013, 1013, 1015, 1016, 27, - /* 1820 */ 490, 338, 270, 241, 192, 342, 493, 242, 403, 1249, - /* 1830 */ 243, 511, 432, 1297, 1306, 91, 445, 1305, 1304, 879, - /* 1840 */ 217, 434, 435, 1570, 1276, 1602, 520, 1601, 555, 301, - /* 1850 */ 527, 404, 1275, 302, 356, 1274, 1600, 95, 1347, 366, - /* 1860 */ 1296, 362, 1348, 368, 256, 257, 1556, 1555, 438, 1346, - /* 1870 */ 370, 126, 1345, 10, 1371, 546, 381, 1023, 102, 1457, - /* 1880 */ 97, 530, 34, 106, 106, 570, 1180, 372, 265, 1329, - /* 1890 */ 379, 107, 203, 445, 568, 567, 1328, 385, 1013, 1370, - /* 1900 */ 386, 267, 268, 571, 1244, 161, 1239, 162, 1509, 1510, - /* 1910 */ 1508, 143, 1507, 299, 832, 213, 214, 78, 446, 205, - /* 1920 */ 310, 306, 163, 224, 1084, 140, 1082, 318, 165, 176, - /* 1930 */ 1013, 1013, 1015, 1016, 27, 178, 1206, 231, 911, 234, - /* 1940 */ 326, 1098, 183, 421, 166, 167, 411, 185, 85, 423, - /* 1950 */ 412, 86, 174, 87, 168, 88, 1101, 236, 1097, 237, - /* 1960 */ 154, 18, 238, 254, 337, 1219, 489, 1090, 240, 190, - /* 1970 */ 37, 847, 189, 494, 358, 244, 350, 506, 191, 877, - /* 1980 */ 90, 498, 19, 20, 503, 92, 353, 890, 300, 170, - /* 1990 */ 155, 93, 513, 94, 1168, 156, 1050, 1137, 39, 218, - /* 2000 */ 273, 275, 1136, 960, 194, 955, 110, 1154, 1158, 253, - /* 2010 */ 7, 1162, 1156, 21, 22, 1161, 1142, 23, 24, 25, - /* 2020 */ 33, 542, 26, 260, 197, 98, 1065, 1051, 1049, 1053, - /* 2030 */ 1107, 1054, 1106, 259, 28, 40, 562, 1018, 859, 109, - /* 2040 */ 29, 921, 390, 1176, 172, 139, 1175, 1235, 261, 1235, - /* 2050 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 262, 1235, 1235, - /* 2060 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1593, 1592, + /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229, + /* 10 */ 568, 1314, 377, 1293, 408, 562, 562, 562, 568, 409, + /* 20 */ 378, 1314, 1276, 41, 41, 41, 41, 208, 1526, 71, + /* 30 */ 71, 971, 419, 41, 41, 491, 303, 279, 303, 972, + /* 40 */ 397, 71, 71, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 50 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 476, 409, + /* 60 */ 1241, 1, 1, 575, 2, 1245, 550, 118, 115, 229, + /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1327, + /* 80 */ 417, 523, 142, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 90 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 118, 115, + /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, + /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442, + /* 120 */ 442, 1567, 376, 1569, 1192, 375, 1163, 565, 1163, 565, + /* 130 */ 409, 1567, 537, 259, 226, 444, 101, 145, 449, 316, + /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120, + /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1217, 1217, 1050, + /* 160 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 142, + /* 170 */ 294, 1192, 339, 448, 120, 120, 120, 119, 116, 444, + /* 180 */ 127, 1192, 1193, 1194, 148, 441, 440, 568, 119, 116, + /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122, + /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113, + /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120, + /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1192, 1193, + /* 230 */ 1194, 149, 1224, 409, 1224, 124, 124, 124, 124, 122, + /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 250 */ 444, 465, 342, 1037, 1037, 1051, 1054, 125, 126, 80, + /* 260 */ 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, + /* 270 */ 124, 124, 1279, 522, 222, 1192, 568, 409, 224, 514, + /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, + /* 290 */ 120, 120, 119, 116, 444, 1007, 16, 16, 1192, 133, + /* 300 */ 133, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, + /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, + /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1041, 546, + /* 330 */ 1192, 373, 1192, 1193, 1194, 252, 1434, 399, 504, 501, + /* 340 */ 500, 111, 560, 566, 4, 926, 926, 433, 499, 340, + /* 350 */ 460, 328, 360, 394, 1237, 1192, 1193, 1194, 563, 568, + /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, + /* 370 */ 116, 444, 284, 284, 369, 1580, 1607, 441, 440, 154, + /* 380 */ 409, 445, 71, 71, 1286, 565, 1221, 1192, 1193, 1194, + /* 390 */ 85, 1223, 271, 557, 543, 515, 1561, 568, 98, 1222, + /* 400 */ 6, 1278, 472, 142, 125, 126, 80, 1217, 1217, 1050, + /* 410 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 550, + /* 420 */ 13, 13, 1027, 507, 1224, 1192, 1224, 549, 109, 109, + /* 430 */ 222, 568, 1238, 175, 568, 427, 110, 197, 445, 570, + /* 440 */ 569, 430, 1552, 1017, 325, 551, 1192, 270, 287, 368, + /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359, + /* 460 */ 316, 559, 1613, 122, 122, 122, 122, 121, 121, 120, + /* 470 */ 120, 120, 119, 116, 444, 1017, 1017, 1019, 1020, 27, + /* 480 */ 284, 284, 1192, 1193, 1194, 1158, 568, 1612, 409, 901, + /* 490 */ 190, 550, 356, 565, 550, 937, 533, 517, 1158, 516, + /* 500 */ 413, 1158, 552, 1192, 1193, 1194, 568, 544, 1554, 51, + /* 510 */ 51, 214, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, + /* 520 */ 1040, 123, 123, 124, 124, 124, 124, 1192, 474, 135, + /* 530 */ 135, 409, 284, 284, 1490, 505, 121, 121, 120, 120, + /* 540 */ 120, 119, 116, 444, 1007, 565, 518, 217, 541, 1561, + /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1217, 1217, + /* 560 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 570 */ 1555, 122, 122, 122, 122, 121, 121, 120, 120, 120, + /* 580 */ 119, 116, 444, 485, 1192, 1193, 1194, 482, 281, 1267, + /* 590 */ 957, 252, 1192, 373, 504, 501, 500, 1192, 340, 571, + /* 600 */ 1192, 571, 409, 292, 499, 957, 876, 191, 480, 316, + /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121, + /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 630 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 640 */ 124, 409, 394, 1136, 1192, 869, 100, 284, 284, 1192, + /* 650 */ 1193, 1194, 373, 1093, 1192, 1193, 1194, 1192, 1193, 1194, + /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1217, 1217, + /* 670 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 680 */ 1433, 959, 568, 228, 958, 122, 122, 122, 122, 121, + /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1158, 228, 1192, + /* 700 */ 157, 1192, 1193, 1194, 1553, 13, 13, 301, 957, 1232, + /* 710 */ 1158, 153, 409, 1158, 373, 1583, 1176, 5, 369, 1580, + /* 720 */ 429, 1238, 3, 957, 122, 122, 122, 122, 121, 121, + /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 740 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 750 */ 124, 409, 208, 567, 1192, 1028, 1192, 1193, 1194, 1192, + /* 760 */ 388, 852, 155, 1552, 286, 402, 1098, 1098, 488, 568, + /* 770 */ 465, 342, 1319, 1319, 1552, 125, 126, 80, 1217, 1217, + /* 780 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121, + /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453, + /* 810 */ 528, 1192, 1193, 1194, 13, 13, 1192, 1193, 1194, 1297, + /* 820 */ 463, 1267, 409, 1317, 1317, 1552, 1012, 453, 452, 200, + /* 830 */ 299, 71, 71, 1265, 122, 122, 122, 122, 121, 121, + /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 850 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 860 */ 124, 409, 227, 1073, 1158, 284, 284, 419, 312, 278, + /* 870 */ 278, 285, 285, 1419, 406, 405, 382, 1158, 565, 568, + /* 880 */ 1158, 1196, 565, 1600, 565, 125, 126, 80, 1217, 1217, + /* 890 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 900 */ 453, 1482, 13, 13, 1536, 122, 122, 122, 122, 121, + /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354, + /* 920 */ 1586, 575, 2, 1245, 840, 841, 842, 1562, 317, 1212, + /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1327, 9, 1196, + /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121, + /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 960 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 970 */ 124, 568, 284, 284, 568, 1213, 409, 574, 313, 1245, + /* 980 */ 349, 1296, 352, 419, 317, 565, 146, 491, 525, 1643, + /* 990 */ 395, 371, 491, 1327, 70, 70, 1295, 71, 71, 240, + /* 1000 */ 1325, 104, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, + /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, + /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1114, 284, 284, + /* 1030 */ 428, 448, 1525, 1213, 439, 284, 284, 1489, 1352, 311, + /* 1040 */ 474, 565, 1115, 971, 491, 491, 217, 1263, 565, 1538, + /* 1050 */ 568, 972, 207, 568, 1027, 240, 383, 1116, 519, 122, + /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 1070 */ 444, 1018, 107, 71, 71, 1017, 13, 13, 912, 568, + /* 1080 */ 1495, 568, 284, 284, 97, 526, 491, 448, 913, 1326, + /* 1090 */ 1322, 545, 409, 284, 284, 565, 151, 209, 1495, 1497, + /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1017, 1017, 1019, + /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1217, + /* 1120 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1130 */ 124, 347, 409, 864, 1534, 1213, 125, 126, 80, 1217, + /* 1140 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1150 */ 124, 1137, 1641, 474, 1641, 371, 125, 114, 80, 1217, + /* 1160 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1170 */ 124, 1495, 329, 474, 331, 122, 122, 122, 122, 121, + /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1419, 568, + /* 1190 */ 1294, 864, 464, 1213, 436, 122, 122, 122, 122, 121, + /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1137, 1642, + /* 1210 */ 539, 1642, 15, 15, 892, 122, 122, 122, 122, 121, + /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538, + /* 1230 */ 1135, 1419, 1559, 1560, 1331, 409, 6, 6, 1169, 1268, + /* 1240 */ 415, 320, 284, 284, 1419, 508, 565, 525, 300, 457, + /* 1250 */ 43, 43, 568, 893, 12, 565, 330, 478, 425, 407, + /* 1260 */ 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, + /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1192, 1419, + /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1135, 1558, 849, + /* 1290 */ 1169, 407, 6, 568, 321, 1158, 470, 44, 44, 1557, + /* 1300 */ 1114, 426, 234, 6, 323, 256, 540, 256, 1158, 431, + /* 1310 */ 568, 1158, 322, 17, 487, 1115, 58, 58, 122, 122, + /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444, + /* 1330 */ 1116, 216, 481, 59, 59, 1192, 1193, 1194, 111, 560, + /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437, + /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1095, + /* 1360 */ 568, 293, 568, 1095, 531, 568, 872, 8, 60, 60, + /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62, + /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, + /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63, + /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1027, 568, 534, + /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1027, + /* 1420 */ 568, 512, 932, 872, 1018, 109, 109, 931, 1017, 66, + /* 1430 */ 66, 131, 131, 110, 451, 445, 570, 569, 416, 177, + /* 1440 */ 1017, 132, 132, 67, 67, 568, 467, 568, 932, 471, + /* 1450 */ 1364, 283, 226, 931, 315, 1363, 407, 568, 459, 407, + /* 1460 */ 1017, 1017, 1019, 239, 407, 86, 213, 1350, 52, 52, + /* 1470 */ 68, 68, 1017, 1017, 1019, 1020, 27, 1585, 1180, 447, + /* 1480 */ 69, 69, 288, 97, 108, 1541, 106, 392, 392, 391, + /* 1490 */ 273, 389, 568, 879, 849, 883, 568, 111, 560, 466, + /* 1500 */ 4, 568, 152, 30, 38, 568, 1132, 234, 396, 323, + /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163, + /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76, + /* 1530 */ 568, 289, 1514, 568, 31, 1513, 568, 445, 338, 483, + /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1080, 557, + /* 1550 */ 445, 879, 1360, 134, 134, 168, 73, 73, 141, 161, + /* 1560 */ 161, 1574, 557, 535, 568, 319, 568, 348, 536, 1009, + /* 1570 */ 473, 261, 261, 891, 890, 235, 535, 568, 1027, 568, + /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130, + /* 1590 */ 130, 1027, 110, 366, 445, 570, 569, 109, 109, 1017, + /* 1600 */ 162, 162, 156, 156, 568, 110, 1080, 445, 570, 569, + /* 1610 */ 410, 351, 1017, 568, 353, 316, 559, 568, 343, 568, + /* 1620 */ 100, 497, 357, 258, 100, 898, 899, 140, 140, 355, + /* 1630 */ 1310, 1017, 1017, 1019, 1020, 27, 139, 139, 362, 451, + /* 1640 */ 137, 137, 138, 138, 1017, 1017, 1019, 1020, 27, 1180, + /* 1650 */ 447, 568, 372, 288, 111, 560, 1021, 4, 392, 392, + /* 1660 */ 391, 273, 389, 568, 1141, 849, 568, 1076, 568, 258, + /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 962, 234, 261, + /* 1680 */ 323, 111, 560, 929, 4, 113, 77, 77, 322, 74, + /* 1690 */ 74, 42, 42, 1373, 445, 48, 48, 1418, 563, 974, + /* 1700 */ 975, 1092, 1091, 1092, 1091, 862, 557, 150, 930, 1346, + /* 1710 */ 113, 1358, 554, 1424, 1021, 1275, 1266, 1254, 236, 1253, + /* 1720 */ 1255, 445, 1593, 1343, 308, 276, 168, 309, 11, 141, + /* 1730 */ 393, 310, 232, 557, 1405, 1027, 335, 291, 1400, 219, + /* 1740 */ 336, 109, 109, 936, 297, 1410, 235, 341, 477, 110, + /* 1750 */ 502, 445, 570, 569, 1393, 1409, 1017, 400, 1293, 365, + /* 1760 */ 223, 1486, 1027, 1485, 1355, 1356, 1354, 1353, 109, 109, + /* 1770 */ 204, 1596, 1232, 558, 265, 218, 110, 205, 445, 570, + /* 1780 */ 569, 410, 387, 1017, 1533, 179, 316, 559, 1017, 1017, + /* 1790 */ 1019, 1020, 27, 230, 1531, 1229, 79, 560, 85, 4, + /* 1800 */ 418, 215, 548, 81, 84, 188, 1406, 173, 181, 461, + /* 1810 */ 451, 35, 462, 563, 183, 1017, 1017, 1019, 1020, 27, + /* 1820 */ 184, 1491, 185, 186, 495, 242, 98, 398, 1412, 36, + /* 1830 */ 1411, 484, 91, 469, 401, 1414, 445, 192, 1480, 246, + /* 1840 */ 1502, 490, 346, 277, 248, 196, 493, 511, 557, 350, + /* 1850 */ 1256, 249, 250, 403, 1313, 1312, 111, 560, 432, 4, + /* 1860 */ 1311, 1304, 93, 1611, 883, 1610, 224, 404, 434, 520, + /* 1870 */ 263, 435, 1579, 563, 1283, 1282, 364, 1027, 306, 1281, + /* 1880 */ 264, 1609, 1565, 109, 109, 370, 1303, 307, 1564, 438, + /* 1890 */ 128, 110, 1378, 445, 570, 569, 445, 546, 1017, 10, + /* 1900 */ 1466, 105, 381, 1377, 34, 572, 99, 1336, 557, 314, + /* 1910 */ 1186, 530, 272, 274, 379, 210, 1335, 547, 385, 386, + /* 1920 */ 275, 573, 1251, 1246, 411, 412, 1518, 165, 178, 1519, + /* 1930 */ 1017, 1017, 1019, 1020, 27, 1517, 1516, 1027, 78, 147, + /* 1940 */ 166, 220, 221, 109, 109, 836, 304, 167, 446, 212, + /* 1950 */ 318, 110, 231, 445, 570, 569, 144, 1090, 1017, 1088, + /* 1960 */ 326, 180, 169, 1212, 182, 334, 238, 915, 241, 1104, + /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90, + /* 1980 */ 172, 1107, 243, 1103, 244, 158, 18, 245, 345, 247, + /* 1990 */ 1017, 1017, 1019, 1020, 27, 261, 1096, 193, 1226, 489, + /* 2000 */ 194, 37, 366, 851, 494, 251, 195, 506, 92, 19, + /* 2010 */ 498, 358, 20, 503, 881, 361, 94, 894, 305, 159, + /* 2020 */ 513, 39, 95, 1174, 160, 1056, 966, 1143, 96, 174, + /* 2030 */ 1142, 225, 280, 282, 198, 960, 113, 1164, 1160, 260, + /* 2040 */ 21, 22, 23, 1162, 1168, 1167, 1148, 24, 33, 25, + /* 2050 */ 202, 542, 26, 100, 1071, 102, 1057, 103, 7, 1055, + /* 2060 */ 1059, 1113, 1060, 1112, 266, 267, 28, 40, 390, 1022, + /* 2070 */ 863, 112, 29, 564, 1182, 1181, 268, 176, 143, 925, + /* 2080 */ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, + /* 2090 */ 1242, 1242, 1242, 1242, 269, 1602, 1242, 1601, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 193, 223, 193, 225, 193, 193, 193, 274, 275, 276, - /* 10 */ 193, 233, 219, 193, 274, 275, 276, 206, 206, 19, - /* 20 */ 193, 219, 216, 216, 217, 216, 217, 193, 295, 216, - /* 30 */ 217, 31, 205, 216, 217, 193, 216, 217, 213, 39, - /* 40 */ 228, 193, 230, 43, 44, 45, 46, 47, 48, 49, + /* 0 */ 193, 193, 193, 274, 275, 276, 193, 274, 275, 276, + /* 10 */ 193, 223, 219, 225, 206, 210, 211, 212, 193, 19, + /* 20 */ 219, 233, 216, 216, 217, 216, 217, 193, 295, 216, + /* 30 */ 217, 31, 193, 216, 217, 193, 228, 213, 230, 39, + /* 40 */ 206, 216, 217, 43, 44, 45, 46, 47, 48, 49, /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19, /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276, - /* 70 */ 195, 193, 197, 253, 216, 262, 274, 275, 276, 204, - /* 80 */ 238, 204, 262, 43, 44, 45, 46, 47, 48, 49, - /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 264, 274, - /* 100 */ 275, 276, 102, 103, 104, 105, 106, 107, 108, 109, + /* 70 */ 195, 193, 197, 193, 261, 274, 275, 276, 253, 204, + /* 80 */ 238, 204, 81, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 274, 275, + /* 100 */ 276, 262, 102, 103, 104, 105, 106, 107, 108, 109, /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211, /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252, - /* 130 */ 19, 314, 315, 256, 257, 309, 25, 72, 296, 313, - /* 140 */ 193, 266, 102, 103, 104, 105, 106, 107, 108, 109, + /* 130 */ 19, 314, 315, 256, 257, 113, 25, 72, 296, 138, + /* 140 */ 139, 266, 102, 103, 104, 105, 106, 107, 108, 109, /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48, /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81, - /* 170 */ 292, 59, 307, 298, 108, 109, 110, 111, 112, 113, - /* 180 */ 69, 116, 117, 118, 72, 128, 129, 193, 241, 22, + /* 170 */ 292, 59, 292, 298, 108, 109, 110, 111, 112, 113, + /* 180 */ 69, 116, 117, 118, 72, 106, 107, 193, 111, 112, /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105, - /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 193, - /* 210 */ 216, 217, 25, 102, 103, 104, 105, 106, 107, 108, + /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 25, + /* 210 */ 216, 217, 145, 102, 103, 104, 105, 106, 107, 108, /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117, - /* 230 */ 118, 106, 107, 19, 216, 54, 55, 56, 57, 102, + /* 230 */ 118, 164, 153, 19, 155, 54, 55, 56, 57, 102, /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 250 */ 113, 304, 25, 46, 47, 48, 49, 43, 44, 45, + /* 250 */ 113, 128, 129, 46, 47, 48, 49, 43, 44, 45, /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 270 */ 56, 57, 193, 106, 107, 59, 193, 19, 153, 263, - /* 280 */ 155, 67, 24, 102, 103, 104, 105, 106, 107, 108, - /* 290 */ 109, 110, 111, 112, 113, 216, 217, 59, 230, 216, + /* 270 */ 56, 57, 216, 193, 25, 59, 193, 19, 165, 166, + /* 280 */ 193, 67, 24, 102, 103, 104, 105, 106, 107, 108, + /* 290 */ 109, 110, 111, 112, 113, 73, 216, 217, 59, 216, /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51, /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105, - /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 142, - /* 330 */ 59, 193, 116, 117, 118, 119, 253, 204, 122, 123, - /* 340 */ 124, 19, 20, 81, 22, 262, 108, 19, 132, 165, - /* 350 */ 166, 193, 24, 126, 116, 117, 118, 278, 36, 193, + /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 145, + /* 330 */ 59, 193, 116, 117, 118, 119, 273, 204, 122, 123, + /* 340 */ 124, 19, 20, 134, 22, 136, 137, 19, 132, 127, + /* 350 */ 128, 129, 24, 22, 23, 116, 117, 118, 36, 193, /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 370 */ 112, 113, 239, 240, 216, 217, 215, 106, 107, 241, + /* 370 */ 112, 113, 239, 240, 311, 312, 215, 106, 107, 241, /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118, - /* 390 */ 73, 120, 26, 71, 193, 22, 193, 231, 81, 128, - /* 400 */ 138, 139, 269, 81, 43, 44, 45, 46, 47, 48, - /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 216, - /* 420 */ 217, 198, 100, 95, 153, 59, 155, 193, 106, 107, - /* 430 */ 235, 236, 59, 193, 193, 249, 114, 251, 116, 117, - /* 440 */ 118, 113, 304, 121, 127, 204, 193, 119, 120, 121, - /* 450 */ 122, 123, 124, 125, 193, 138, 139, 216, 217, 131, - /* 460 */ 138, 139, 193, 102, 103, 104, 105, 106, 107, 108, + /* 390 */ 151, 120, 26, 71, 193, 308, 309, 193, 149, 128, + /* 400 */ 313, 216, 269, 81, 43, 44, 45, 46, 47, 48, + /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 253, + /* 420 */ 216, 217, 100, 95, 153, 59, 155, 261, 106, 107, + /* 430 */ 25, 193, 101, 193, 193, 231, 114, 25, 116, 117, + /* 440 */ 118, 113, 304, 121, 193, 204, 59, 119, 120, 121, + /* 450 */ 122, 123, 124, 125, 216, 217, 193, 216, 217, 131, + /* 460 */ 138, 139, 230, 102, 103, 104, 105, 106, 107, 108, /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157, - /* 480 */ 239, 240, 116, 117, 118, 76, 193, 193, 19, 116, - /* 490 */ 117, 118, 23, 252, 253, 193, 87, 204, 89, 238, - /* 500 */ 193, 92, 268, 262, 281, 203, 193, 205, 285, 216, + /* 480 */ 239, 240, 116, 117, 118, 76, 193, 23, 19, 25, + /* 490 */ 22, 253, 23, 252, 253, 108, 87, 204, 89, 261, + /* 500 */ 198, 92, 261, 116, 117, 118, 193, 306, 307, 216, /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50, - /* 520 */ 51, 52, 53, 54, 55, 56, 57, 193, 193, 216, - /* 530 */ 217, 19, 239, 240, 59, 23, 106, 107, 108, 109, - /* 540 */ 110, 111, 112, 113, 231, 252, 253, 193, 308, 309, - /* 550 */ 193, 145, 59, 313, 145, 43, 44, 45, 46, 47, + /* 520 */ 51, 52, 53, 54, 55, 56, 57, 59, 193, 216, + /* 530 */ 217, 19, 239, 240, 283, 23, 106, 107, 108, 109, + /* 540 */ 110, 111, 112, 113, 73, 252, 253, 142, 308, 309, + /* 550 */ 138, 139, 81, 313, 145, 43, 44, 45, 46, 47, /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 570 */ 164, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 580 */ 111, 112, 113, 119, 193, 193, 122, 123, 124, 193, - /* 590 */ 283, 116, 117, 118, 235, 236, 132, 59, 241, 264, - /* 600 */ 59, 193, 19, 23, 193, 25, 23, 216, 217, 116, - /* 610 */ 117, 118, 216, 217, 102, 103, 104, 105, 106, 107, + /* 570 */ 307, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 580 */ 111, 112, 113, 281, 116, 117, 118, 285, 23, 193, + /* 590 */ 25, 119, 59, 193, 122, 123, 124, 59, 127, 203, + /* 600 */ 59, 205, 19, 268, 132, 25, 23, 22, 193, 138, + /* 610 */ 139, 249, 204, 251, 102, 103, 104, 105, 106, 107, /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 640 */ 57, 19, 308, 309, 151, 23, 25, 313, 135, 253, - /* 650 */ 21, 193, 241, 140, 116, 117, 118, 116, 117, 118, - /* 660 */ 268, 304, 22, 301, 302, 43, 44, 45, 46, 47, + /* 640 */ 57, 19, 22, 23, 59, 23, 25, 239, 240, 116, + /* 650 */ 117, 118, 193, 11, 116, 117, 118, 116, 117, 118, + /* 660 */ 252, 269, 22, 193, 15, 43, 44, 45, 46, 47, /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 680 */ 193, 143, 193, 193, 143, 102, 103, 104, 105, 106, + /* 680 */ 273, 143, 193, 118, 143, 102, 103, 104, 105, 106, /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59, - /* 700 */ 292, 211, 212, 216, 217, 216, 217, 73, 193, 80, - /* 710 */ 89, 25, 19, 92, 193, 304, 23, 22, 231, 193, - /* 720 */ 231, 193, 22, 143, 102, 103, 104, 105, 106, 107, + /* 700 */ 241, 116, 117, 118, 304, 216, 217, 292, 143, 60, + /* 710 */ 89, 241, 19, 92, 193, 193, 23, 22, 311, 312, + /* 720 */ 231, 101, 22, 143, 102, 103, 104, 105, 106, 107, /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 750 */ 57, 19, 123, 193, 59, 23, 116, 117, 118, 59, - /* 760 */ 193, 127, 128, 129, 306, 307, 210, 211, 212, 193, - /* 770 */ 22, 111, 112, 113, 284, 43, 44, 45, 46, 47, + /* 750 */ 57, 19, 193, 193, 59, 23, 116, 117, 118, 59, + /* 760 */ 201, 21, 241, 304, 22, 206, 127, 128, 129, 193, + /* 770 */ 128, 129, 235, 236, 304, 43, 44, 45, 46, 47, /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 790 */ 161, 193, 216, 217, 268, 102, 103, 104, 105, 106, - /* 800 */ 107, 108, 109, 110, 111, 112, 113, 59, 193, 193, - /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 304, - /* 820 */ 239, 240, 19, 263, 138, 139, 23, 211, 212, 231, - /* 830 */ 263, 216, 217, 252, 102, 103, 104, 105, 106, 107, + /* 790 */ 22, 193, 216, 217, 193, 102, 103, 104, 105, 106, + /* 800 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 193, + /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 226, + /* 820 */ 80, 193, 19, 235, 236, 304, 23, 211, 212, 231, + /* 830 */ 204, 216, 217, 205, 102, 103, 104, 105, 106, 107, /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 860 */ 57, 19, 193, 11, 116, 117, 118, 240, 253, 193, - /* 870 */ 201, 239, 240, 193, 134, 206, 136, 137, 193, 252, - /* 880 */ 193, 264, 193, 193, 252, 43, 44, 45, 46, 47, + /* 860 */ 57, 19, 193, 123, 76, 239, 240, 193, 253, 239, + /* 870 */ 240, 239, 240, 193, 106, 107, 193, 89, 252, 193, + /* 880 */ 92, 59, 252, 141, 252, 43, 44, 45, 46, 47, /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 900 */ 284, 216, 217, 216, 217, 102, 103, 104, 105, 106, - /* 910 */ 107, 108, 109, 110, 111, 112, 113, 193, 231, 193, - /* 920 */ 187, 188, 189, 190, 127, 128, 129, 238, 195, 193, - /* 930 */ 197, 16, 19, 7, 8, 9, 193, 204, 253, 193, - /* 940 */ 216, 217, 216, 217, 102, 103, 104, 105, 106, 107, + /* 900 */ 284, 161, 216, 217, 193, 102, 103, 104, 105, 106, + /* 910 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 16, + /* 920 */ 187, 188, 189, 190, 7, 8, 9, 309, 195, 25, + /* 930 */ 197, 313, 19, 127, 128, 129, 262, 204, 22, 117, + /* 940 */ 24, 216, 217, 263, 102, 103, 104, 105, 106, 107, /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 970 */ 57, 213, 239, 240, 193, 76, 19, 188, 232, 190, - /* 980 */ 128, 129, 292, 193, 195, 252, 197, 46, 89, 138, - /* 990 */ 139, 92, 77, 204, 79, 193, 269, 216, 217, 266, + /* 970 */ 57, 193, 239, 240, 193, 59, 19, 188, 253, 190, + /* 980 */ 77, 226, 79, 193, 195, 252, 197, 193, 19, 301, + /* 990 */ 302, 193, 193, 204, 216, 217, 226, 216, 217, 266, /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52, /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106, /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240, - /* 1030 */ 193, 298, 22, 23, 253, 239, 240, 127, 128, 129, - /* 1040 */ 238, 252, 27, 193, 286, 204, 193, 204, 252, 291, - /* 1050 */ 193, 273, 22, 23, 100, 266, 115, 42, 268, 102, + /* 1030 */ 232, 298, 238, 117, 253, 239, 240, 238, 259, 260, + /* 1040 */ 193, 252, 27, 31, 193, 193, 142, 204, 252, 193, + /* 1050 */ 193, 39, 262, 193, 100, 266, 278, 42, 204, 102, /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 1070 */ 113, 117, 159, 216, 217, 121, 161, 19, 63, 193, - /* 1080 */ 239, 240, 239, 240, 12, 208, 209, 298, 73, 311, - /* 1090 */ 312, 238, 19, 252, 25, 252, 22, 24, 24, 27, - /* 1100 */ 193, 264, 216, 217, 46, 208, 209, 153, 154, 155, - /* 1110 */ 253, 101, 19, 23, 42, 25, 43, 44, 45, 46, + /* 1070 */ 113, 117, 159, 216, 217, 121, 216, 217, 63, 193, + /* 1080 */ 193, 193, 239, 240, 115, 116, 193, 298, 73, 238, + /* 1090 */ 238, 231, 19, 239, 240, 252, 22, 24, 211, 212, + /* 1100 */ 24, 193, 216, 217, 216, 217, 252, 153, 154, 155, + /* 1110 */ 253, 16, 19, 144, 213, 268, 43, 44, 45, 46, /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1130 */ 57, 101, 19, 59, 25, 63, 43, 44, 45, 46, + /* 1130 */ 57, 238, 19, 59, 193, 59, 43, 44, 45, 46, /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1150 */ 57, 22, 23, 115, 25, 24, 43, 44, 45, 46, + /* 1150 */ 57, 22, 23, 193, 25, 193, 43, 44, 45, 46, /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1170 */ 57, 22, 23, 115, 25, 102, 103, 104, 105, 106, - /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 118, 150, 131, - /* 1190 */ 59, 117, 22, 273, 193, 102, 103, 104, 105, 106, - /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 66, 204, - /* 1210 */ 35, 204, 143, 213, 193, 102, 103, 104, 105, 106, - /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 85, 193, 59, - /* 1230 */ 101, 311, 312, 16, 193, 19, 94, 216, 217, 238, - /* 1240 */ 193, 66, 239, 240, 239, 240, 239, 240, 117, 74, - /* 1250 */ 101, 216, 217, 193, 193, 252, 193, 252, 149, 252, + /* 1170 */ 57, 284, 77, 193, 79, 102, 103, 104, 105, 106, + /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 286, 193, 193, + /* 1190 */ 193, 117, 291, 117, 232, 102, 103, 104, 105, 106, + /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 22, 23, + /* 1210 */ 66, 25, 216, 217, 35, 102, 103, 104, 105, 106, + /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 193, 268, 85, + /* 1230 */ 101, 193, 309, 309, 240, 19, 313, 313, 94, 208, + /* 1240 */ 209, 193, 239, 240, 193, 66, 252, 19, 268, 244, + /* 1250 */ 216, 217, 193, 74, 213, 252, 161, 19, 263, 254, /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1270 */ 54, 55, 56, 57, 193, 193, 193, 5, 59, 216, - /* 1280 */ 217, 25, 10, 11, 12, 13, 14, 117, 146, 17, - /* 1290 */ 193, 291, 193, 232, 77, 76, 79, 216, 217, 216, - /* 1300 */ 217, 31, 30, 309, 32, 130, 87, 313, 89, 39, - /* 1310 */ 193, 92, 40, 216, 217, 216, 217, 108, 102, 103, + /* 1270 */ 54, 55, 56, 57, 193, 216, 217, 5, 59, 193, + /* 1280 */ 19, 244, 10, 11, 12, 13, 14, 101, 309, 17, + /* 1290 */ 146, 254, 313, 193, 193, 76, 115, 216, 217, 309, + /* 1300 */ 12, 263, 30, 313, 32, 46, 87, 46, 89, 130, + /* 1310 */ 193, 92, 40, 22, 263, 27, 216, 217, 102, 103, /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - /* 1330 */ 299, 300, 193, 216, 217, 116, 117, 118, 19, 20, - /* 1340 */ 193, 22, 70, 309, 135, 193, 264, 313, 193, 140, - /* 1350 */ 78, 193, 226, 81, 59, 36, 193, 309, 193, 29, - /* 1360 */ 193, 313, 193, 33, 145, 193, 59, 48, 216, 217, - /* 1370 */ 98, 216, 217, 193, 216, 217, 193, 244, 59, 216, - /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 254, 216, 217, - /* 1390 */ 71, 193, 244, 193, 193, 65, 216, 217, 193, 216, - /* 1400 */ 217, 145, 254, 244, 85, 133, 15, 100, 193, 90, - /* 1410 */ 138, 139, 117, 254, 216, 217, 216, 217, 193, 100, - /* 1420 */ 193, 216, 217, 116, 117, 106, 107, 19, 121, 193, - /* 1430 */ 193, 216, 217, 114, 162, 116, 117, 118, 244, 244, - /* 1440 */ 121, 216, 217, 216, 217, 193, 309, 129, 254, 254, - /* 1450 */ 313, 60, 216, 217, 19, 256, 257, 193, 120, 121, - /* 1460 */ 153, 154, 155, 149, 150, 25, 24, 99, 216, 217, - /* 1470 */ 152, 193, 153, 154, 155, 156, 157, 0, 1, 2, - /* 1480 */ 216, 217, 5, 22, 158, 24, 160, 10, 11, 12, - /* 1490 */ 13, 14, 193, 23, 17, 25, 193, 19, 20, 193, - /* 1500 */ 22, 133, 193, 22, 22, 193, 22, 30, 193, 32, - /* 1510 */ 19, 20, 129, 22, 36, 216, 217, 40, 193, 216, - /* 1520 */ 217, 193, 216, 217, 116, 216, 217, 36, 216, 217, - /* 1530 */ 193, 216, 217, 193, 53, 152, 193, 59, 23, 19, - /* 1540 */ 25, 216, 217, 61, 216, 217, 23, 70, 25, 71, - /* 1550 */ 59, 116, 193, 216, 217, 78, 216, 217, 81, 216, - /* 1560 */ 217, 59, 71, 85, 193, 23, 193, 25, 90, 23, - /* 1570 */ 23, 25, 25, 7, 8, 98, 85, 193, 100, 193, - /* 1580 */ 59, 90, 142, 141, 106, 107, 193, 216, 217, 216, - /* 1590 */ 217, 100, 114, 193, 116, 117, 118, 106, 107, 121, - /* 1600 */ 216, 217, 216, 217, 193, 114, 193, 116, 117, 118, - /* 1610 */ 133, 23, 121, 25, 121, 138, 139, 97, 23, 117, - /* 1620 */ 25, 23, 193, 25, 131, 141, 193, 216, 217, 59, - /* 1630 */ 193, 153, 154, 155, 156, 157, 226, 193, 117, 162, - /* 1640 */ 23, 23, 25, 25, 153, 154, 155, 156, 157, 1, - /* 1650 */ 2, 83, 84, 5, 19, 20, 226, 22, 10, 11, - /* 1660 */ 12, 13, 14, 258, 153, 17, 155, 153, 23, 155, - /* 1670 */ 25, 36, 23, 193, 25, 255, 193, 236, 30, 193, - /* 1680 */ 32, 19, 20, 193, 22, 193, 288, 117, 40, 193, - /* 1690 */ 318, 193, 193, 193, 59, 242, 193, 193, 36, 193, - /* 1700 */ 193, 193, 287, 255, 255, 255, 71, 255, 243, 214, - /* 1710 */ 191, 297, 267, 245, 271, 259, 259, 293, 70, 246, - /* 1720 */ 246, 59, 267, 229, 245, 271, 78, 293, 259, 81, - /* 1730 */ 271, 271, 220, 71, 225, 100, 219, 219, 249, 196, - /* 1740 */ 243, 106, 107, 108, 219, 60, 98, 280, 297, 114, - /* 1750 */ 249, 116, 117, 118, 141, 245, 121, 200, 200, 297, - /* 1760 */ 38, 200, 100, 151, 150, 294, 294, 22, 106, 107, - /* 1770 */ 283, 43, 234, 18, 237, 200, 114, 272, 116, 117, - /* 1780 */ 118, 133, 237, 121, 18, 237, 138, 139, 153, 154, - /* 1790 */ 155, 156, 157, 237, 270, 199, 19, 20, 246, 22, - /* 1800 */ 149, 272, 272, 270, 200, 246, 234, 234, 246, 246, - /* 1810 */ 162, 158, 290, 36, 199, 153, 154, 155, 156, 157, - /* 1820 */ 62, 289, 200, 199, 22, 200, 221, 199, 221, 200, - /* 1830 */ 199, 115, 64, 227, 218, 22, 59, 218, 218, 126, - /* 1840 */ 165, 24, 113, 312, 218, 224, 305, 224, 71, 282, - /* 1850 */ 144, 221, 220, 282, 218, 218, 218, 115, 261, 260, - /* 1860 */ 227, 221, 261, 260, 200, 91, 317, 317, 82, 261, - /* 1870 */ 260, 148, 261, 22, 265, 145, 200, 100, 158, 277, - /* 1880 */ 147, 146, 25, 106, 107, 202, 13, 260, 194, 250, - /* 1890 */ 249, 114, 248, 116, 117, 118, 250, 247, 121, 265, - /* 1900 */ 246, 194, 6, 192, 192, 207, 192, 207, 213, 213, - /* 1910 */ 213, 222, 213, 222, 4, 214, 214, 213, 3, 22, - /* 1920 */ 163, 279, 207, 15, 23, 16, 23, 139, 130, 151, - /* 1930 */ 153, 154, 155, 156, 157, 142, 25, 24, 20, 144, - /* 1940 */ 16, 1, 142, 61, 130, 130, 303, 151, 53, 37, - /* 1950 */ 303, 53, 300, 53, 130, 53, 116, 34, 1, 141, - /* 1960 */ 5, 22, 115, 25, 161, 75, 41, 68, 141, 115, - /* 1970 */ 24, 20, 68, 19, 131, 125, 23, 96, 22, 59, - /* 1980 */ 22, 67, 22, 22, 67, 22, 24, 28, 67, 37, - /* 1990 */ 23, 149, 22, 25, 23, 23, 23, 23, 22, 141, - /* 2000 */ 23, 23, 97, 116, 22, 143, 25, 88, 75, 34, - /* 2010 */ 44, 75, 86, 34, 34, 93, 23, 34, 34, 34, - /* 2020 */ 22, 24, 34, 22, 25, 25, 23, 23, 23, 23, - /* 2030 */ 23, 11, 23, 25, 22, 22, 25, 23, 23, 22, - /* 2040 */ 22, 135, 15, 1, 25, 23, 1, 319, 141, 319, - /* 2050 */ 319, 319, 319, 319, 319, 319, 319, 141, 319, 319, - /* 2060 */ 319, 319, 319, 319, 319, 319, 319, 319, 141, 141, - /* 2070 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 1330 */ 42, 150, 291, 216, 217, 116, 117, 118, 19, 20, + /* 1340 */ 193, 22, 70, 260, 116, 193, 24, 264, 193, 263, + /* 1350 */ 78, 63, 61, 81, 116, 36, 193, 260, 193, 29, + /* 1360 */ 193, 264, 193, 33, 145, 193, 59, 48, 216, 217, + /* 1370 */ 98, 216, 217, 193, 115, 193, 115, 193, 59, 216, + /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 255, 216, 217, + /* 1390 */ 71, 193, 131, 193, 25, 65, 216, 217, 216, 217, + /* 1400 */ 216, 217, 208, 209, 85, 133, 193, 100, 193, 90, + /* 1410 */ 138, 139, 138, 139, 216, 217, 216, 217, 193, 100, + /* 1420 */ 193, 108, 135, 116, 117, 106, 107, 140, 121, 216, + /* 1430 */ 217, 216, 217, 114, 162, 116, 117, 118, 299, 300, + /* 1440 */ 121, 216, 217, 216, 217, 193, 244, 193, 135, 244, + /* 1450 */ 193, 256, 257, 140, 244, 193, 254, 193, 193, 254, + /* 1460 */ 153, 154, 155, 141, 254, 149, 150, 258, 216, 217, + /* 1470 */ 216, 217, 153, 154, 155, 156, 157, 0, 1, 2, + /* 1480 */ 216, 217, 5, 115, 158, 193, 160, 10, 11, 12, + /* 1490 */ 13, 14, 193, 59, 17, 126, 193, 19, 20, 129, + /* 1500 */ 22, 193, 22, 22, 24, 193, 23, 30, 25, 32, + /* 1510 */ 19, 20, 144, 22, 36, 216, 217, 40, 193, 216, + /* 1520 */ 217, 193, 152, 129, 216, 217, 193, 36, 216, 217, + /* 1530 */ 193, 99, 193, 193, 53, 193, 193, 59, 23, 193, + /* 1540 */ 25, 216, 217, 193, 216, 217, 152, 70, 59, 71, + /* 1550 */ 59, 117, 193, 216, 217, 78, 216, 217, 81, 216, + /* 1560 */ 217, 318, 71, 85, 193, 133, 193, 193, 90, 23, + /* 1570 */ 23, 25, 25, 120, 121, 98, 85, 193, 100, 193, + /* 1580 */ 23, 90, 25, 121, 106, 107, 19, 216, 217, 216, + /* 1590 */ 217, 100, 114, 131, 116, 117, 118, 106, 107, 121, + /* 1600 */ 216, 217, 216, 217, 193, 114, 117, 116, 117, 118, + /* 1610 */ 133, 193, 121, 193, 193, 138, 139, 193, 23, 193, + /* 1620 */ 25, 23, 23, 25, 25, 7, 8, 216, 217, 193, + /* 1630 */ 193, 153, 154, 155, 156, 157, 216, 217, 193, 162, + /* 1640 */ 216, 217, 216, 217, 153, 154, 155, 156, 157, 1, + /* 1650 */ 2, 193, 193, 5, 19, 20, 59, 22, 10, 11, + /* 1660 */ 12, 13, 14, 193, 97, 17, 193, 23, 193, 25, + /* 1670 */ 288, 36, 193, 242, 216, 217, 236, 23, 30, 25, + /* 1680 */ 32, 19, 20, 23, 22, 25, 216, 217, 40, 216, + /* 1690 */ 217, 216, 217, 193, 59, 216, 217, 193, 36, 83, + /* 1700 */ 84, 153, 153, 155, 155, 23, 71, 25, 23, 193, + /* 1710 */ 25, 193, 193, 193, 117, 193, 193, 193, 70, 193, + /* 1720 */ 193, 59, 193, 255, 255, 287, 78, 255, 243, 81, + /* 1730 */ 191, 255, 297, 71, 271, 100, 293, 245, 267, 214, + /* 1740 */ 246, 106, 107, 108, 246, 271, 98, 245, 293, 114, + /* 1750 */ 220, 116, 117, 118, 267, 271, 121, 271, 225, 219, + /* 1760 */ 229, 219, 100, 219, 259, 259, 259, 259, 106, 107, + /* 1770 */ 249, 196, 60, 280, 141, 243, 114, 249, 116, 117, + /* 1780 */ 118, 133, 245, 121, 200, 297, 138, 139, 153, 154, + /* 1790 */ 155, 156, 157, 297, 200, 38, 19, 20, 151, 22, + /* 1800 */ 200, 150, 140, 294, 294, 22, 272, 43, 234, 18, + /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157, + /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270, + /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199, + /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200, + /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22, + /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305, + /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218, + /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82, + /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22, + /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279, + /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246, + /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213, + /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222, + /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22, + /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23, + /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1, + /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53, + /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141, + /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41, + /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22, + /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23, + /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37, + /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34, + /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34, + /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23, + /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23, + /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135, /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2090 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 141, 319, 319, /* 2100 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, @@ -162427,176 +164549,179 @@ static const YYCODETYPE yy_lookahead[] = { /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2250 */ 319, 319, 319, 319, 319, + /* 2250 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2260 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2270 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2280 */ 319, 319, 319, }; -#define YY_SHIFT_COUNT (573) +#define YY_SHIFT_COUNT (575) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2045) +#define YY_SHIFT_MAX (2074) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1648, 1477, 1272, 322, 322, 262, 1319, 1478, 1491, 1662, - /* 10 */ 1662, 1662, 317, 0, 0, 214, 1093, 1662, 1662, 1662, - /* 20 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 30 */ 271, 271, 1219, 1219, 216, 88, 262, 262, 262, 262, - /* 40 */ 262, 40, 111, 258, 361, 469, 512, 583, 622, 693, + /* 0 */ 1648, 1477, 1272, 322, 322, 1, 1319, 1478, 1491, 1837, + /* 10 */ 1837, 1837, 471, 0, 0, 214, 1093, 1837, 1837, 1837, + /* 20 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 30 */ 271, 271, 1219, 1219, 216, 88, 1, 1, 1, 1, + /* 40 */ 1, 40, 111, 258, 361, 469, 512, 583, 622, 693, /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093, /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662, - /* 80 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 90 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 100 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 110 */ 1662, 1662, 1662, 1662, 1777, 1662, 1662, 1662, 1662, 1662, - /* 120 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 137, 181, - /* 130 */ 181, 181, 181, 181, 94, 430, 66, 65, 112, 366, - /* 140 */ 475, 475, 629, 1058, 475, 475, 125, 125, 475, 686, - /* 150 */ 686, 686, 660, 686, 57, 184, 184, 77, 77, 2070, - /* 160 */ 2070, 328, 328, 328, 493, 373, 373, 373, 373, 1015, - /* 170 */ 1015, 409, 366, 1129, 1149, 475, 475, 475, 475, 475, - /* 180 */ 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, - /* 190 */ 475, 475, 475, 475, 475, 621, 621, 475, 852, 899, - /* 200 */ 899, 1295, 1295, 406, 851, 2070, 2070, 2070, 2070, 2070, - /* 210 */ 2070, 2070, 1307, 954, 954, 640, 464, 695, 238, 700, - /* 220 */ 538, 541, 748, 475, 475, 475, 475, 475, 475, 475, - /* 230 */ 475, 475, 475, 634, 475, 475, 475, 475, 475, 475, - /* 240 */ 475, 475, 475, 475, 475, 475, 1175, 1175, 1175, 475, - /* 250 */ 475, 475, 580, 475, 475, 475, 1074, 1142, 475, 475, - /* 260 */ 1072, 475, 475, 475, 475, 475, 475, 475, 475, 797, - /* 270 */ 1330, 740, 1131, 1131, 1131, 1131, 1069, 740, 740, 1209, - /* 280 */ 167, 926, 1391, 1038, 1314, 187, 1408, 1314, 1408, 1435, - /* 290 */ 1109, 1038, 1038, 1109, 1038, 187, 1435, 227, 1090, 941, - /* 300 */ 1270, 1270, 1270, 1408, 1256, 1256, 1326, 1440, 513, 1461, - /* 310 */ 1685, 1685, 1613, 1613, 1722, 1722, 1613, 1612, 1614, 1745, - /* 320 */ 1728, 1755, 1755, 1755, 1755, 1613, 1766, 1651, 1614, 1614, - /* 330 */ 1651, 1745, 1728, 1651, 1728, 1651, 1613, 1766, 1653, 1758, - /* 340 */ 1613, 1766, 1802, 1613, 1766, 1613, 1766, 1802, 1716, 1716, - /* 350 */ 1716, 1768, 1813, 1813, 1802, 1716, 1713, 1716, 1768, 1716, - /* 360 */ 1716, 1675, 1817, 1729, 1729, 1802, 1706, 1742, 1706, 1742, - /* 370 */ 1706, 1742, 1706, 1742, 1613, 1774, 1774, 1786, 1786, 1723, - /* 380 */ 1730, 1851, 1613, 1720, 1723, 1733, 1735, 1651, 1857, 1873, - /* 390 */ 1873, 1896, 1896, 1896, 2070, 2070, 2070, 2070, 2070, 2070, - /* 400 */ 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 207, - /* 410 */ 915, 1010, 1030, 1217, 910, 1170, 1470, 1368, 1481, 1442, - /* 420 */ 1318, 1383, 1515, 1482, 1523, 1542, 1546, 1547, 1588, 1595, - /* 430 */ 1502, 1338, 1566, 1493, 1520, 1521, 1598, 1617, 1568, 1618, - /* 440 */ 1511, 1514, 1645, 1649, 1570, 1484, 1910, 1915, 1897, 1757, - /* 450 */ 1908, 1909, 1901, 1903, 1788, 1778, 1798, 1911, 1911, 1913, - /* 460 */ 1793, 1918, 1795, 1924, 1940, 1800, 1814, 1911, 1815, 1882, - /* 470 */ 1912, 1911, 1796, 1895, 1898, 1900, 1902, 1824, 1840, 1923, - /* 480 */ 1818, 1957, 1955, 1939, 1847, 1803, 1899, 1938, 1904, 1890, - /* 490 */ 1925, 1827, 1854, 1946, 1951, 1954, 1843, 1850, 1956, 1914, - /* 500 */ 1958, 1960, 1953, 1961, 1917, 1920, 1962, 1881, 1959, 1963, - /* 510 */ 1921, 1952, 1967, 1842, 1970, 1971, 1972, 1973, 1968, 1974, - /* 520 */ 1976, 1905, 1858, 1977, 1978, 1887, 1975, 1982, 1862, 1981, - /* 530 */ 1979, 1980, 1983, 1984, 1919, 1933, 1926, 1966, 1936, 1922, - /* 540 */ 1985, 1993, 1998, 1997, 1999, 2000, 1988, 2003, 1981, 2004, - /* 550 */ 2005, 2006, 2007, 2008, 2009, 2001, 2020, 2012, 2013, 2014, - /* 560 */ 2015, 2017, 2018, 2011, 1906, 1907, 1916, 1927, 1928, 2019, - /* 570 */ 2022, 2027, 2042, 2045, + /* 80 */ 1777, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 90 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 100 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 110 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 120 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 130 */ 137, 181, 181, 181, 181, 181, 181, 181, 94, 430, + /* 140 */ 66, 65, 112, 366, 533, 533, 740, 1261, 533, 533, + /* 150 */ 79, 79, 533, 412, 412, 412, 77, 412, 123, 113, + /* 160 */ 113, 22, 22, 2098, 2098, 328, 328, 328, 239, 468, + /* 170 */ 468, 468, 468, 1015, 1015, 409, 366, 1129, 1186, 533, + /* 180 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 190 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 969, + /* 200 */ 621, 621, 533, 642, 788, 788, 1228, 1228, 822, 822, + /* 210 */ 67, 1274, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 1307, + /* 220 */ 954, 954, 585, 472, 640, 387, 695, 538, 541, 700, + /* 230 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 240 */ 222, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 250 */ 533, 533, 533, 1179, 1179, 1179, 533, 533, 533, 565, + /* 260 */ 533, 533, 533, 916, 1144, 533, 533, 1288, 533, 533, + /* 270 */ 533, 533, 533, 533, 533, 533, 639, 1330, 209, 1076, + /* 280 */ 1076, 1076, 1076, 580, 209, 209, 1313, 768, 917, 649, + /* 290 */ 1181, 1316, 405, 1316, 1238, 249, 1181, 1181, 249, 1181, + /* 300 */ 405, 1238, 1369, 464, 1259, 1012, 1012, 1012, 1368, 1368, + /* 310 */ 1368, 1368, 184, 184, 1326, 904, 1287, 1480, 1712, 1712, + /* 320 */ 1633, 1633, 1757, 1757, 1633, 1647, 1651, 1783, 1764, 1791, + /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783, + /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806, + /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794, + /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701, + /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742, + /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897, + /* 390 */ 1897, 1914, 1914, 1914, 2098, 2098, 2098, 2098, 2098, 2098, + /* 400 */ 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 207, + /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322, + /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599, + /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660, + /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787, + /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942, + /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912, + /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948, + /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923, + /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943, + /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994, + /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004, + /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011, + /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952, + /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031, + /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044, + /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954, + /* 570 */ 1956, 2052, 2055, 2053, 2073, 2074, }; #define YY_REDUCE_COUNT (408) -#define YY_REDUCE_MIN (-267) -#define YY_REDUCE_MAX (1715) +#define YY_REDUCE_MIN (-271) +#define YY_REDUCE_MAX (1740) static const short yy_reduce_ofst[] = { /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187, - /* 10 */ -180, 83, 133, -207, -198, -267, -175, -6, 166, 313, - /* 20 */ 487, 396, 489, 598, 615, 685, 687, 79, 781, 857, - /* 30 */ 490, 616, 240, 334, -188, 796, 841, 843, 1003, 1005, - /* 40 */ 1007, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 50 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 60 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 70 */ -260, -260, -260, -260, -260, -260, -260, -260, 158, 203, - /* 80 */ 391, 576, 724, 726, 886, 1021, 1035, 1063, 1081, 1083, - /* 90 */ 1097, 1099, 1117, 1152, 1155, 1158, 1163, 1165, 1167, 1169, - /* 100 */ 1172, 1180, 1183, 1198, 1200, 1205, 1215, 1225, 1227, 1236, - /* 110 */ 1252, 1264, 1299, 1303, 1306, 1309, 1312, 1315, 1325, 1328, - /* 120 */ 1337, 1340, 1343, 1371, 1373, 1384, 1386, 1411, -260, -260, - /* 130 */ -260, -260, -260, -260, -260, -260, -260, -53, 138, 302, - /* 140 */ -158, 357, 223, -222, 411, 458, -92, 556, 669, 581, - /* 150 */ 632, 581, -260, 632, 758, 778, 920, -260, -260, -260, - /* 160 */ -260, 161, 161, 161, 307, 234, 392, 526, 790, 195, - /* 170 */ 359, -174, -173, 362, 362, -189, 16, 560, 567, 261, - /* 180 */ 689, 802, 853, -122, -166, 408, 335, 617, 690, 837, - /* 190 */ 1001, 746, 1061, 515, 1082, 994, 1034, -135, 1000, 1048, - /* 200 */ 1137, 877, 897, 186, 627, 1031, 1133, 1148, 1159, 1194, - /* 210 */ 1199, 1195, -194, -142, 18, -152, 68, 201, 253, 269, - /* 220 */ 294, 354, 521, 528, 676, 680, 736, 743, 850, 907, - /* 230 */ 1041, 1047, 1060, 727, 1139, 1147, 1201, 1237, 1278, 1359, - /* 240 */ 1393, 1400, 1413, 1429, 1433, 1437, 1126, 1410, 1430, 1444, - /* 250 */ 1480, 1483, 1405, 1486, 1490, 1492, 1420, 1372, 1496, 1498, - /* 260 */ 1441, 1499, 253, 1500, 1503, 1504, 1506, 1507, 1508, 1398, - /* 270 */ 1415, 1453, 1448, 1449, 1450, 1452, 1405, 1453, 1453, 1465, - /* 280 */ 1495, 1519, 1414, 1443, 1445, 1468, 1456, 1455, 1457, 1424, - /* 290 */ 1473, 1454, 1459, 1474, 1460, 1479, 1434, 1512, 1494, 1509, - /* 300 */ 1517, 1518, 1525, 1469, 1489, 1501, 1467, 1510, 1497, 1543, - /* 310 */ 1451, 1462, 1557, 1558, 1471, 1472, 1561, 1487, 1505, 1524, - /* 320 */ 1538, 1537, 1545, 1548, 1556, 1575, 1596, 1552, 1529, 1530, - /* 330 */ 1559, 1533, 1572, 1562, 1573, 1563, 1604, 1615, 1522, 1532, - /* 340 */ 1622, 1624, 1605, 1625, 1628, 1629, 1631, 1607, 1616, 1619, - /* 350 */ 1620, 1606, 1621, 1623, 1630, 1626, 1632, 1636, 1633, 1637, - /* 360 */ 1638, 1531, 1541, 1567, 1571, 1640, 1597, 1599, 1601, 1603, - /* 370 */ 1608, 1610, 1611, 1627, 1664, 1549, 1550, 1609, 1634, 1639, - /* 380 */ 1641, 1602, 1676, 1642, 1646, 1644, 1650, 1654, 1683, 1694, - /* 390 */ 1707, 1711, 1712, 1714, 1643, 1647, 1652, 1698, 1695, 1696, - /* 400 */ 1697, 1699, 1700, 1689, 1691, 1701, 1702, 1704, 1715, + /* 10 */ 166, 238, 133, -207, -199, -267, -176, -6, 204, 489, + /* 20 */ 576, -175, 598, 686, 615, 725, 860, 778, 781, 857, + /* 30 */ 616, 887, 87, 240, -192, 408, 626, 796, 843, 854, + /* 40 */ 1003, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 50 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 60 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 70 */ -271, -271, -271, -271, -271, -271, -271, -271, 80, 83, + /* 80 */ 313, 886, 888, 996, 1034, 1059, 1081, 1100, 1117, 1152, + /* 90 */ 1155, 1163, 1165, 1167, 1169, 1172, 1180, 1182, 1184, 1198, + /* 100 */ 1200, 1213, 1215, 1225, 1227, 1252, 1254, 1264, 1299, 1303, + /* 110 */ 1308, 1312, 1325, 1328, 1337, 1340, 1343, 1371, 1373, 1384, + /* 120 */ 1386, 1411, 1420, 1424, 1426, 1458, 1470, 1473, 1475, 1479, + /* 130 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 140 */ -271, 138, 459, 396, -158, 470, 302, -212, 521, 201, + /* 150 */ -195, -92, 559, 630, 632, 630, -271, 632, 901, 63, + /* 160 */ 407, -271, -271, -271, -271, 161, 161, 161, 251, 335, + /* 170 */ 847, 960, 980, 537, 588, 618, 628, 688, 688, -166, + /* 180 */ -161, 674, 790, 794, 799, 851, 852, -122, 680, -120, + /* 190 */ 995, 1038, 415, 1051, 893, 798, 962, 400, 1086, 779, + /* 200 */ 923, 924, 263, 1041, 979, 990, 1083, 1097, 1031, 1194, + /* 210 */ 362, 994, 1139, 1005, 1037, 1202, 1205, 1195, 1210, -194, + /* 220 */ 56, 185, -135, 232, 522, 560, 601, 617, 669, 683, + /* 230 */ 711, 856, 908, 941, 1048, 1101, 1147, 1257, 1262, 1265, + /* 240 */ 392, 1292, 1333, 1339, 1342, 1346, 1350, 1359, 1374, 1418, + /* 250 */ 1421, 1436, 1437, 593, 755, 770, 997, 1445, 1459, 1209, + /* 260 */ 1500, 1504, 1516, 1132, 1243, 1518, 1519, 1440, 1520, 560, + /* 270 */ 1522, 1523, 1524, 1526, 1527, 1529, 1382, 1438, 1431, 1468, + /* 280 */ 1469, 1472, 1476, 1209, 1431, 1431, 1485, 1525, 1539, 1435, + /* 290 */ 1463, 1471, 1492, 1487, 1443, 1494, 1474, 1484, 1498, 1486, + /* 300 */ 1502, 1455, 1530, 1531, 1533, 1540, 1542, 1544, 1505, 1506, + /* 310 */ 1507, 1508, 1521, 1528, 1493, 1537, 1532, 1575, 1488, 1496, + /* 320 */ 1584, 1594, 1509, 1510, 1600, 1538, 1534, 1541, 1574, 1577, + /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559, + /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645, + /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634, + /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560, + /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657, + /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718, + /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716, + /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1637, 1637, 1637, 1466, 1233, 1344, 1233, 1233, 1233, 1466, - /* 10 */ 1466, 1466, 1233, 1374, 1374, 1519, 1266, 1233, 1233, 1233, - /* 20 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1465, 1233, 1233, - /* 30 */ 1233, 1233, 1554, 1554, 1233, 1233, 1233, 1233, 1233, 1233, - /* 40 */ 1233, 1233, 1383, 1233, 1390, 1233, 1233, 1233, 1233, 1233, - /* 50 */ 1467, 1468, 1233, 1233, 1233, 1518, 1520, 1483, 1397, 1396, - /* 60 */ 1395, 1394, 1501, 1361, 1388, 1381, 1385, 1461, 1462, 1460, - /* 70 */ 1464, 1468, 1467, 1233, 1384, 1431, 1445, 1430, 1233, 1233, - /* 80 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 90 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 100 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 110 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 120 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1439, 1444, - /* 130 */ 1451, 1443, 1440, 1433, 1432, 1434, 1435, 1233, 1233, 1257, - /* 140 */ 1233, 1233, 1254, 1308, 1233, 1233, 1233, 1233, 1233, 1538, - /* 150 */ 1537, 1233, 1436, 1233, 1266, 1425, 1424, 1448, 1437, 1447, - /* 160 */ 1446, 1526, 1590, 1589, 1484, 1233, 1233, 1233, 1233, 1233, - /* 170 */ 1233, 1554, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 180 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 190 */ 1233, 1233, 1233, 1233, 1233, 1554, 1554, 1233, 1266, 1554, - /* 200 */ 1554, 1262, 1262, 1368, 1233, 1533, 1335, 1335, 1335, 1335, - /* 210 */ 1344, 1335, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 220 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1523, 1521, 1233, - /* 230 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 240 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 250 */ 1233, 1233, 1233, 1233, 1233, 1233, 1340, 1233, 1233, 1233, - /* 260 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1583, 1233, - /* 270 */ 1496, 1322, 1340, 1340, 1340, 1340, 1342, 1323, 1321, 1334, - /* 280 */ 1267, 1240, 1629, 1400, 1389, 1341, 1363, 1389, 1363, 1626, - /* 290 */ 1387, 1400, 1400, 1387, 1400, 1341, 1626, 1283, 1606, 1278, - /* 300 */ 1374, 1374, 1374, 1363, 1368, 1368, 1463, 1341, 1334, 1233, - /* 310 */ 1629, 1629, 1349, 1349, 1628, 1628, 1349, 1484, 1613, 1409, - /* 320 */ 1311, 1317, 1317, 1317, 1317, 1349, 1251, 1387, 1613, 1613, - /* 330 */ 1387, 1409, 1311, 1387, 1311, 1387, 1349, 1251, 1500, 1623, - /* 340 */ 1349, 1251, 1474, 1349, 1251, 1349, 1251, 1474, 1309, 1309, - /* 350 */ 1309, 1298, 1233, 1233, 1474, 1309, 1283, 1309, 1298, 1309, - /* 360 */ 1309, 1572, 1233, 1478, 1478, 1474, 1367, 1362, 1367, 1362, - /* 370 */ 1367, 1362, 1367, 1362, 1349, 1564, 1564, 1377, 1377, 1382, - /* 380 */ 1368, 1469, 1349, 1233, 1382, 1380, 1378, 1387, 1301, 1586, - /* 390 */ 1586, 1582, 1582, 1582, 1634, 1634, 1533, 1599, 1266, 1266, - /* 400 */ 1266, 1266, 1599, 1285, 1285, 1267, 1267, 1266, 1599, 1233, - /* 410 */ 1233, 1233, 1233, 1233, 1233, 1594, 1233, 1528, 1485, 1353, - /* 420 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 430 */ 1233, 1233, 1233, 1233, 1539, 1233, 1233, 1233, 1233, 1233, - /* 440 */ 1233, 1233, 1233, 1233, 1233, 1414, 1233, 1236, 1530, 1233, - /* 450 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1391, 1392, 1354, - /* 460 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1406, 1233, 1233, - /* 470 */ 1233, 1401, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 480 */ 1625, 1233, 1233, 1233, 1233, 1233, 1233, 1499, 1498, 1233, - /* 490 */ 1233, 1351, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 500 */ 1233, 1233, 1233, 1233, 1233, 1281, 1233, 1233, 1233, 1233, - /* 510 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 520 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1379, - /* 530 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 540 */ 1233, 1233, 1233, 1233, 1569, 1369, 1233, 1233, 1616, 1233, - /* 550 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 560 */ 1233, 1233, 1233, 1610, 1325, 1416, 1233, 1415, 1419, 1255, - /* 570 */ 1233, 1245, 1233, 1233, + /* 0 */ 1647, 1647, 1647, 1475, 1240, 1351, 1240, 1240, 1240, 1475, + /* 10 */ 1475, 1475, 1240, 1381, 1381, 1528, 1273, 1240, 1240, 1240, + /* 20 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1474, 1240, 1240, + /* 30 */ 1240, 1240, 1563, 1563, 1240, 1240, 1240, 1240, 1240, 1240, + /* 40 */ 1240, 1240, 1390, 1240, 1397, 1240, 1240, 1240, 1240, 1240, + /* 50 */ 1476, 1477, 1240, 1240, 1240, 1527, 1529, 1492, 1404, 1403, + /* 60 */ 1402, 1401, 1510, 1369, 1395, 1388, 1392, 1470, 1471, 1469, + /* 70 */ 1473, 1477, 1476, 1240, 1391, 1438, 1454, 1437, 1240, 1240, + /* 80 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 90 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 100 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 110 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 120 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 130 */ 1446, 1453, 1452, 1451, 1460, 1450, 1447, 1440, 1439, 1441, + /* 140 */ 1442, 1240, 1240, 1264, 1240, 1240, 1261, 1315, 1240, 1240, + /* 150 */ 1240, 1240, 1240, 1547, 1546, 1240, 1443, 1240, 1273, 1432, + /* 160 */ 1431, 1457, 1444, 1456, 1455, 1535, 1599, 1598, 1493, 1240, + /* 170 */ 1240, 1240, 1240, 1240, 1240, 1563, 1240, 1240, 1240, 1240, + /* 180 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 190 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1371, + /* 200 */ 1563, 1563, 1240, 1273, 1563, 1563, 1372, 1372, 1269, 1269, + /* 210 */ 1375, 1240, 1542, 1342, 1342, 1342, 1342, 1351, 1342, 1240, + /* 220 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 230 */ 1240, 1240, 1240, 1240, 1532, 1530, 1240, 1240, 1240, 1240, + /* 240 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 250 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 260 */ 1240, 1240, 1240, 1347, 1240, 1240, 1240, 1240, 1240, 1240, + /* 270 */ 1240, 1240, 1240, 1240, 1240, 1592, 1240, 1505, 1329, 1347, + /* 280 */ 1347, 1347, 1347, 1349, 1330, 1328, 1341, 1274, 1247, 1639, + /* 290 */ 1407, 1396, 1348, 1396, 1636, 1394, 1407, 1407, 1394, 1407, + /* 300 */ 1348, 1636, 1290, 1615, 1285, 1381, 1381, 1381, 1371, 1371, + /* 310 */ 1371, 1371, 1375, 1375, 1472, 1348, 1341, 1240, 1639, 1639, + /* 320 */ 1357, 1357, 1638, 1638, 1357, 1493, 1623, 1416, 1318, 1324, + /* 330 */ 1324, 1324, 1324, 1357, 1258, 1394, 1623, 1623, 1394, 1416, + /* 340 */ 1318, 1394, 1318, 1394, 1357, 1258, 1509, 1633, 1357, 1258, + /* 350 */ 1483, 1357, 1258, 1357, 1258, 1483, 1316, 1316, 1316, 1305, + /* 360 */ 1240, 1240, 1483, 1316, 1290, 1316, 1305, 1316, 1316, 1581, + /* 370 */ 1240, 1487, 1487, 1483, 1357, 1573, 1573, 1384, 1384, 1389, + /* 380 */ 1375, 1478, 1357, 1240, 1389, 1387, 1385, 1394, 1308, 1595, + /* 390 */ 1595, 1591, 1591, 1591, 1644, 1644, 1542, 1608, 1273, 1273, + /* 400 */ 1273, 1273, 1608, 1292, 1292, 1274, 1274, 1273, 1608, 1240, + /* 410 */ 1240, 1240, 1240, 1240, 1240, 1603, 1240, 1537, 1494, 1361, + /* 420 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 430 */ 1240, 1240, 1240, 1240, 1548, 1240, 1240, 1240, 1240, 1240, + /* 440 */ 1240, 1240, 1240, 1240, 1240, 1421, 1240, 1243, 1539, 1240, + /* 450 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1398, 1399, 1362, + /* 460 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1413, 1240, 1240, + /* 470 */ 1240, 1408, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 480 */ 1635, 1240, 1240, 1240, 1240, 1240, 1240, 1508, 1507, 1240, + /* 490 */ 1240, 1359, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 500 */ 1240, 1240, 1240, 1240, 1240, 1288, 1240, 1240, 1240, 1240, + /* 510 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 520 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1386, + /* 530 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 540 */ 1240, 1240, 1240, 1240, 1578, 1376, 1240, 1240, 1240, 1240, + /* 550 */ 1626, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 560 */ 1240, 1240, 1240, 1240, 1240, 1619, 1332, 1423, 1240, 1422, + /* 570 */ 1426, 1262, 1240, 1252, 1240, 1240, }; /********** End of lemon-generated parsing tables *****************************/ @@ -163148,12 +165273,12 @@ static const char *const yyTokenName[] = { /* 256 */ "seltablist", /* 257 */ "stl_prefix", /* 258 */ "joinop", - /* 259 */ "indexed_opt", - /* 260 */ "on_opt", - /* 261 */ "using_opt", - /* 262 */ "exprlist", - /* 263 */ "xfullname", - /* 264 */ "idlist", + /* 259 */ "on_using", + /* 260 */ "indexed_by", + /* 261 */ "exprlist", + /* 262 */ "xfullname", + /* 263 */ "idlist", + /* 264 */ "indexed_opt", /* 265 */ "nulls", /* 266 */ "with", /* 267 */ "where_opt_ret", @@ -163324,29 +165449,29 @@ static const char *const yyRuleName[] = { /* 106 */ "from ::= FROM seltablist", /* 107 */ "stl_prefix ::= seltablist joinop", /* 108 */ "stl_prefix ::=", - /* 109 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", - /* 110 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", - /* 111 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 112 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", - /* 113 */ "dbnm ::=", - /* 114 */ "dbnm ::= DOT nm", - /* 115 */ "fullname ::= nm", - /* 116 */ "fullname ::= nm DOT nm", - /* 117 */ "xfullname ::= nm", - /* 118 */ "xfullname ::= nm DOT nm", - /* 119 */ "xfullname ::= nm DOT nm AS nm", - /* 120 */ "xfullname ::= nm AS nm", - /* 121 */ "joinop ::= COMMA|JOIN", - /* 122 */ "joinop ::= JOIN_KW JOIN", - /* 123 */ "joinop ::= JOIN_KW nm JOIN", - /* 124 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 125 */ "on_opt ::= ON expr", - /* 126 */ "on_opt ::=", - /* 127 */ "indexed_opt ::=", - /* 128 */ "indexed_opt ::= INDEXED BY nm", - /* 129 */ "indexed_opt ::= NOT INDEXED", - /* 130 */ "using_opt ::= USING LP idlist RP", - /* 131 */ "using_opt ::=", + /* 109 */ "seltablist ::= stl_prefix nm dbnm as on_using", + /* 110 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using", + /* 111 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using", + /* 112 */ "seltablist ::= stl_prefix LP select RP as on_using", + /* 113 */ "seltablist ::= stl_prefix LP seltablist RP as on_using", + /* 114 */ "dbnm ::=", + /* 115 */ "dbnm ::= DOT nm", + /* 116 */ "fullname ::= nm", + /* 117 */ "fullname ::= nm DOT nm", + /* 118 */ "xfullname ::= nm", + /* 119 */ "xfullname ::= nm DOT nm", + /* 120 */ "xfullname ::= nm DOT nm AS nm", + /* 121 */ "xfullname ::= nm AS nm", + /* 122 */ "joinop ::= COMMA|JOIN", + /* 123 */ "joinop ::= JOIN_KW JOIN", + /* 124 */ "joinop ::= JOIN_KW nm JOIN", + /* 125 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 126 */ "on_using ::= ON expr", + /* 127 */ "on_using ::= USING LP idlist RP", + /* 128 */ "on_using ::=", + /* 129 */ "indexed_opt ::=", + /* 130 */ "indexed_by ::= INDEXED BY nm", + /* 131 */ "indexed_by ::= NOT INDEXED", /* 132 */ "orderby_opt ::=", /* 133 */ "orderby_opt ::= ORDER BY sortlist", /* 134 */ "sortlist ::= sortlist COMMA expr sortorder nulls", @@ -163424,199 +165549,202 @@ static const char *const yyRuleName[] = { /* 206 */ "expr ::= expr NOT NULL", /* 207 */ "expr ::= expr IS expr", /* 208 */ "expr ::= expr IS NOT expr", - /* 209 */ "expr ::= NOT expr", - /* 210 */ "expr ::= BITNOT expr", - /* 211 */ "expr ::= PLUS|MINUS expr", - /* 212 */ "expr ::= expr PTR expr", - /* 213 */ "between_op ::= BETWEEN", - /* 214 */ "between_op ::= NOT BETWEEN", - /* 215 */ "expr ::= expr between_op expr AND expr", - /* 216 */ "in_op ::= IN", - /* 217 */ "in_op ::= NOT IN", - /* 218 */ "expr ::= expr in_op LP exprlist RP", - /* 219 */ "expr ::= LP select RP", - /* 220 */ "expr ::= expr in_op LP select RP", - /* 221 */ "expr ::= expr in_op nm dbnm paren_exprlist", - /* 222 */ "expr ::= EXISTS LP select RP", - /* 223 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 224 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 225 */ "case_exprlist ::= WHEN expr THEN expr", - /* 226 */ "case_else ::= ELSE expr", - /* 227 */ "case_else ::=", - /* 228 */ "case_operand ::= expr", - /* 229 */ "case_operand ::=", - /* 230 */ "exprlist ::=", - /* 231 */ "nexprlist ::= nexprlist COMMA expr", - /* 232 */ "nexprlist ::= expr", - /* 233 */ "paren_exprlist ::=", - /* 234 */ "paren_exprlist ::= LP exprlist RP", - /* 235 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", - /* 236 */ "uniqueflag ::= UNIQUE", - /* 237 */ "uniqueflag ::=", - /* 238 */ "eidlist_opt ::=", - /* 239 */ "eidlist_opt ::= LP eidlist RP", - /* 240 */ "eidlist ::= eidlist COMMA nm collate sortorder", - /* 241 */ "eidlist ::= nm collate sortorder", - /* 242 */ "collate ::=", - /* 243 */ "collate ::= COLLATE ID|STRING", - /* 244 */ "cmd ::= DROP INDEX ifexists fullname", - /* 245 */ "cmd ::= VACUUM vinto", - /* 246 */ "cmd ::= VACUUM nm vinto", - /* 247 */ "vinto ::= INTO expr", - /* 248 */ "vinto ::=", - /* 249 */ "cmd ::= PRAGMA nm dbnm", - /* 250 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 251 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 252 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 253 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 254 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 255 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 256 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 257 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 258 */ "trigger_time ::= BEFORE|AFTER", - /* 259 */ "trigger_time ::= INSTEAD OF", - /* 260 */ "trigger_time ::=", - /* 261 */ "trigger_event ::= DELETE|INSERT", - /* 262 */ "trigger_event ::= UPDATE", - /* 263 */ "trigger_event ::= UPDATE OF idlist", - /* 264 */ "when_clause ::=", - /* 265 */ "when_clause ::= WHEN expr", - /* 266 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 267 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 268 */ "trnm ::= nm DOT nm", - /* 269 */ "tridxby ::= INDEXED BY nm", - /* 270 */ "tridxby ::= NOT INDEXED", - /* 271 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", - /* 272 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 273 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 274 */ "trigger_cmd ::= scanpt select scanpt", - /* 275 */ "expr ::= RAISE LP IGNORE RP", - /* 276 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 277 */ "raisetype ::= ROLLBACK", - /* 278 */ "raisetype ::= ABORT", - /* 279 */ "raisetype ::= FAIL", - /* 280 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 281 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 282 */ "cmd ::= DETACH database_kw_opt expr", - /* 283 */ "key_opt ::=", - /* 284 */ "key_opt ::= KEY expr", - /* 285 */ "cmd ::= REINDEX", - /* 286 */ "cmd ::= REINDEX nm dbnm", - /* 287 */ "cmd ::= ANALYZE", - /* 288 */ "cmd ::= ANALYZE nm dbnm", - /* 289 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 290 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 291 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", - /* 292 */ "add_column_fullname ::= fullname", - /* 293 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 294 */ "cmd ::= create_vtab", - /* 295 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 296 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 297 */ "vtabarg ::=", - /* 298 */ "vtabargtoken ::= ANY", - /* 299 */ "vtabargtoken ::= lp anylist RP", - /* 300 */ "lp ::= LP", - /* 301 */ "with ::= WITH wqlist", - /* 302 */ "with ::= WITH RECURSIVE wqlist", - /* 303 */ "wqas ::= AS", - /* 304 */ "wqas ::= AS MATERIALIZED", - /* 305 */ "wqas ::= AS NOT MATERIALIZED", - /* 306 */ "wqitem ::= nm eidlist_opt wqas LP select RP", - /* 307 */ "wqlist ::= wqitem", - /* 308 */ "wqlist ::= wqlist COMMA wqitem", - /* 309 */ "windowdefn_list ::= windowdefn", - /* 310 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 311 */ "windowdefn ::= nm AS LP window RP", - /* 312 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", - /* 313 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", - /* 314 */ "window ::= ORDER BY sortlist frame_opt", - /* 315 */ "window ::= nm ORDER BY sortlist frame_opt", - /* 316 */ "window ::= frame_opt", - /* 317 */ "window ::= nm frame_opt", - /* 318 */ "frame_opt ::=", - /* 319 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", - /* 320 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", - /* 321 */ "range_or_rows ::= RANGE|ROWS|GROUPS", - /* 322 */ "frame_bound_s ::= frame_bound", - /* 323 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 324 */ "frame_bound_e ::= frame_bound", - /* 325 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 326 */ "frame_bound ::= expr PRECEDING|FOLLOWING", - /* 327 */ "frame_bound ::= CURRENT ROW", - /* 328 */ "frame_exclude_opt ::=", - /* 329 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", - /* 330 */ "frame_exclude ::= NO OTHERS", - /* 331 */ "frame_exclude ::= CURRENT ROW", - /* 332 */ "frame_exclude ::= GROUP|TIES", - /* 333 */ "window_clause ::= WINDOW windowdefn_list", - /* 334 */ "filter_over ::= filter_clause over_clause", - /* 335 */ "filter_over ::= over_clause", - /* 336 */ "filter_over ::= filter_clause", - /* 337 */ "over_clause ::= OVER LP window RP", - /* 338 */ "over_clause ::= OVER nm", - /* 339 */ "filter_clause ::= FILTER LP WHERE expr RP", - /* 340 */ "input ::= cmdlist", - /* 341 */ "cmdlist ::= cmdlist ecmd", - /* 342 */ "cmdlist ::= ecmd", - /* 343 */ "ecmd ::= SEMI", - /* 344 */ "ecmd ::= cmdx SEMI", - /* 345 */ "ecmd ::= explain cmdx SEMI", - /* 346 */ "trans_opt ::=", - /* 347 */ "trans_opt ::= TRANSACTION", - /* 348 */ "trans_opt ::= TRANSACTION nm", - /* 349 */ "savepoint_opt ::= SAVEPOINT", - /* 350 */ "savepoint_opt ::=", - /* 351 */ "cmd ::= create_table create_table_args", - /* 352 */ "table_option_set ::= table_option", - /* 353 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 354 */ "columnlist ::= columnname carglist", - /* 355 */ "nm ::= ID|INDEXED", - /* 356 */ "nm ::= STRING", - /* 357 */ "nm ::= JOIN_KW", - /* 358 */ "typetoken ::= typename", - /* 359 */ "typename ::= ID|STRING", - /* 360 */ "signed ::= plus_num", - /* 361 */ "signed ::= minus_num", - /* 362 */ "carglist ::= carglist ccons", - /* 363 */ "carglist ::=", - /* 364 */ "ccons ::= NULL onconf", - /* 365 */ "ccons ::= GENERATED ALWAYS AS generated", - /* 366 */ "ccons ::= AS generated", - /* 367 */ "conslist_opt ::= COMMA conslist", - /* 368 */ "conslist ::= conslist tconscomma tcons", - /* 369 */ "conslist ::= tcons", - /* 370 */ "tconscomma ::=", - /* 371 */ "defer_subclause_opt ::= defer_subclause", - /* 372 */ "resolvetype ::= raisetype", - /* 373 */ "selectnowith ::= oneselect", - /* 374 */ "oneselect ::= values", - /* 375 */ "sclp ::= selcollist COMMA", - /* 376 */ "as ::= ID|STRING", - /* 377 */ "returning ::=", - /* 378 */ "expr ::= term", - /* 379 */ "likeop ::= LIKE_KW|MATCH", - /* 380 */ "exprlist ::= nexprlist", - /* 381 */ "nmnum ::= plus_num", - /* 382 */ "nmnum ::= nm", - /* 383 */ "nmnum ::= ON", - /* 384 */ "nmnum ::= DELETE", - /* 385 */ "nmnum ::= DEFAULT", - /* 386 */ "plus_num ::= INTEGER|FLOAT", - /* 387 */ "foreach_clause ::=", - /* 388 */ "foreach_clause ::= FOR EACH ROW", - /* 389 */ "trnm ::= nm", - /* 390 */ "tridxby ::=", - /* 391 */ "database_kw_opt ::= DATABASE", - /* 392 */ "database_kw_opt ::=", - /* 393 */ "kwcolumn_opt ::=", - /* 394 */ "kwcolumn_opt ::= COLUMNKW", - /* 395 */ "vtabarglist ::= vtabarg", - /* 396 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 397 */ "vtabarg ::= vtabarg vtabargtoken", - /* 398 */ "anylist ::=", - /* 399 */ "anylist ::= anylist LP anylist RP", - /* 400 */ "anylist ::= anylist ANY", - /* 401 */ "with ::=", + /* 209 */ "expr ::= expr IS NOT DISTINCT FROM expr", + /* 210 */ "expr ::= expr IS DISTINCT FROM expr", + /* 211 */ "expr ::= NOT expr", + /* 212 */ "expr ::= BITNOT expr", + /* 213 */ "expr ::= PLUS|MINUS expr", + /* 214 */ "expr ::= expr PTR expr", + /* 215 */ "between_op ::= BETWEEN", + /* 216 */ "between_op ::= NOT BETWEEN", + /* 217 */ "expr ::= expr between_op expr AND expr", + /* 218 */ "in_op ::= IN", + /* 219 */ "in_op ::= NOT IN", + /* 220 */ "expr ::= expr in_op LP exprlist RP", + /* 221 */ "expr ::= LP select RP", + /* 222 */ "expr ::= expr in_op LP select RP", + /* 223 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 224 */ "expr ::= EXISTS LP select RP", + /* 225 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 226 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 227 */ "case_exprlist ::= WHEN expr THEN expr", + /* 228 */ "case_else ::= ELSE expr", + /* 229 */ "case_else ::=", + /* 230 */ "case_operand ::= expr", + /* 231 */ "case_operand ::=", + /* 232 */ "exprlist ::=", + /* 233 */ "nexprlist ::= nexprlist COMMA expr", + /* 234 */ "nexprlist ::= expr", + /* 235 */ "paren_exprlist ::=", + /* 236 */ "paren_exprlist ::= LP exprlist RP", + /* 237 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 238 */ "uniqueflag ::= UNIQUE", + /* 239 */ "uniqueflag ::=", + /* 240 */ "eidlist_opt ::=", + /* 241 */ "eidlist_opt ::= LP eidlist RP", + /* 242 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 243 */ "eidlist ::= nm collate sortorder", + /* 244 */ "collate ::=", + /* 245 */ "collate ::= COLLATE ID|STRING", + /* 246 */ "cmd ::= DROP INDEX ifexists fullname", + /* 247 */ "cmd ::= VACUUM vinto", + /* 248 */ "cmd ::= VACUUM nm vinto", + /* 249 */ "vinto ::= INTO expr", + /* 250 */ "vinto ::=", + /* 251 */ "cmd ::= PRAGMA nm dbnm", + /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 256 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 257 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 258 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 259 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 260 */ "trigger_time ::= BEFORE|AFTER", + /* 261 */ "trigger_time ::= INSTEAD OF", + /* 262 */ "trigger_time ::=", + /* 263 */ "trigger_event ::= DELETE|INSERT", + /* 264 */ "trigger_event ::= UPDATE", + /* 265 */ "trigger_event ::= UPDATE OF idlist", + /* 266 */ "when_clause ::=", + /* 267 */ "when_clause ::= WHEN expr", + /* 268 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 269 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 270 */ "trnm ::= nm DOT nm", + /* 271 */ "tridxby ::= INDEXED BY nm", + /* 272 */ "tridxby ::= NOT INDEXED", + /* 273 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", + /* 274 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 275 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 276 */ "trigger_cmd ::= scanpt select scanpt", + /* 277 */ "expr ::= RAISE LP IGNORE RP", + /* 278 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 279 */ "raisetype ::= ROLLBACK", + /* 280 */ "raisetype ::= ABORT", + /* 281 */ "raisetype ::= FAIL", + /* 282 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 283 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 284 */ "cmd ::= DETACH database_kw_opt expr", + /* 285 */ "key_opt ::=", + /* 286 */ "key_opt ::= KEY expr", + /* 287 */ "cmd ::= REINDEX", + /* 288 */ "cmd ::= REINDEX nm dbnm", + /* 289 */ "cmd ::= ANALYZE", + /* 290 */ "cmd ::= ANALYZE nm dbnm", + /* 291 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 292 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 293 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", + /* 294 */ "add_column_fullname ::= fullname", + /* 295 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 296 */ "cmd ::= create_vtab", + /* 297 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 298 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 299 */ "vtabarg ::=", + /* 300 */ "vtabargtoken ::= ANY", + /* 301 */ "vtabargtoken ::= lp anylist RP", + /* 302 */ "lp ::= LP", + /* 303 */ "with ::= WITH wqlist", + /* 304 */ "with ::= WITH RECURSIVE wqlist", + /* 305 */ "wqas ::= AS", + /* 306 */ "wqas ::= AS MATERIALIZED", + /* 307 */ "wqas ::= AS NOT MATERIALIZED", + /* 308 */ "wqitem ::= nm eidlist_opt wqas LP select RP", + /* 309 */ "wqlist ::= wqitem", + /* 310 */ "wqlist ::= wqlist COMMA wqitem", + /* 311 */ "windowdefn_list ::= windowdefn", + /* 312 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 313 */ "windowdefn ::= nm AS LP window RP", + /* 314 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 315 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 316 */ "window ::= ORDER BY sortlist frame_opt", + /* 317 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 318 */ "window ::= frame_opt", + /* 319 */ "window ::= nm frame_opt", + /* 320 */ "frame_opt ::=", + /* 321 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 322 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 323 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 324 */ "frame_bound_s ::= frame_bound", + /* 325 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 326 */ "frame_bound_e ::= frame_bound", + /* 327 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 328 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 329 */ "frame_bound ::= CURRENT ROW", + /* 330 */ "frame_exclude_opt ::=", + /* 331 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 332 */ "frame_exclude ::= NO OTHERS", + /* 333 */ "frame_exclude ::= CURRENT ROW", + /* 334 */ "frame_exclude ::= GROUP|TIES", + /* 335 */ "window_clause ::= WINDOW windowdefn_list", + /* 336 */ "filter_over ::= filter_clause over_clause", + /* 337 */ "filter_over ::= over_clause", + /* 338 */ "filter_over ::= filter_clause", + /* 339 */ "over_clause ::= OVER LP window RP", + /* 340 */ "over_clause ::= OVER nm", + /* 341 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 342 */ "input ::= cmdlist", + /* 343 */ "cmdlist ::= cmdlist ecmd", + /* 344 */ "cmdlist ::= ecmd", + /* 345 */ "ecmd ::= SEMI", + /* 346 */ "ecmd ::= cmdx SEMI", + /* 347 */ "ecmd ::= explain cmdx SEMI", + /* 348 */ "trans_opt ::=", + /* 349 */ "trans_opt ::= TRANSACTION", + /* 350 */ "trans_opt ::= TRANSACTION nm", + /* 351 */ "savepoint_opt ::= SAVEPOINT", + /* 352 */ "savepoint_opt ::=", + /* 353 */ "cmd ::= create_table create_table_args", + /* 354 */ "table_option_set ::= table_option", + /* 355 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 356 */ "columnlist ::= columnname carglist", + /* 357 */ "nm ::= ID|INDEXED", + /* 358 */ "nm ::= STRING", + /* 359 */ "nm ::= JOIN_KW", + /* 360 */ "typetoken ::= typename", + /* 361 */ "typename ::= ID|STRING", + /* 362 */ "signed ::= plus_num", + /* 363 */ "signed ::= minus_num", + /* 364 */ "carglist ::= carglist ccons", + /* 365 */ "carglist ::=", + /* 366 */ "ccons ::= NULL onconf", + /* 367 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 368 */ "ccons ::= AS generated", + /* 369 */ "conslist_opt ::= COMMA conslist", + /* 370 */ "conslist ::= conslist tconscomma tcons", + /* 371 */ "conslist ::= tcons", + /* 372 */ "tconscomma ::=", + /* 373 */ "defer_subclause_opt ::= defer_subclause", + /* 374 */ "resolvetype ::= raisetype", + /* 375 */ "selectnowith ::= oneselect", + /* 376 */ "oneselect ::= values", + /* 377 */ "sclp ::= selcollist COMMA", + /* 378 */ "as ::= ID|STRING", + /* 379 */ "indexed_opt ::= indexed_by", + /* 380 */ "returning ::=", + /* 381 */ "expr ::= term", + /* 382 */ "likeop ::= LIKE_KW|MATCH", + /* 383 */ "exprlist ::= nexprlist", + /* 384 */ "nmnum ::= plus_num", + /* 385 */ "nmnum ::= nm", + /* 386 */ "nmnum ::= ON", + /* 387 */ "nmnum ::= DELETE", + /* 388 */ "nmnum ::= DEFAULT", + /* 389 */ "plus_num ::= INTEGER|FLOAT", + /* 390 */ "foreach_clause ::=", + /* 391 */ "foreach_clause ::= FOR EACH ROW", + /* 392 */ "trnm ::= nm", + /* 393 */ "tridxby ::=", + /* 394 */ "database_kw_opt ::= DATABASE", + /* 395 */ "database_kw_opt ::=", + /* 396 */ "kwcolumn_opt ::=", + /* 397 */ "kwcolumn_opt ::= COLUMNKW", + /* 398 */ "vtabarglist ::= vtabarg", + /* 399 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 400 */ "vtabarg ::= vtabarg vtabargtoken", + /* 401 */ "anylist ::=", + /* 402 */ "anylist ::= anylist LP anylist RP", + /* 403 */ "anylist ::= anylist ANY", + /* 404 */ "with ::=", }; #endif /* NDEBUG */ @@ -163754,7 +165882,6 @@ sqlite3SelectDelete(pParse->db, (yypminor->yy47)); case 217: /* expr */ case 246: /* where_opt */ case 248: /* having_opt */ - case 260: /* on_opt */ case 267: /* where_opt_ret */ case 278: /* case_operand */ case 280: /* case_else */ @@ -163774,7 +165901,7 @@ sqlite3ExprDelete(pParse->db, (yypminor->yy528)); case 249: /* orderby_opt */ case 253: /* nexprlist */ case 254: /* sclp */ - case 262: /* exprlist */ + case 261: /* exprlist */ case 268: /* setlist */ case 277: /* paren_exprlist */ case 279: /* case_exprlist */ @@ -163787,7 +165914,7 @@ sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); case 245: /* from */ case 256: /* seltablist */ case 257: /* stl_prefix */ - case 263: /* xfullname */ + case 262: /* xfullname */ { sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); } @@ -163803,8 +165930,7 @@ sqlite3WithDelete(pParse->db, (yypminor->yy521)); sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); } break; - case 261: /* using_opt */ - case 264: /* idlist */ + case 263: /* idlist */ case 270: /* idlist_opt */ { sqlite3IdListDelete(pParse->db, (yypminor->yy254)); @@ -164234,29 +166360,29 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 245, /* (106) from ::= FROM seltablist */ 257, /* (107) stl_prefix ::= seltablist joinop */ 257, /* (108) stl_prefix ::= */ - 256, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - 256, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - 256, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - 256, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - 200, /* (113) dbnm ::= */ - 200, /* (114) dbnm ::= DOT nm */ - 238, /* (115) fullname ::= nm */ - 238, /* (116) fullname ::= nm DOT nm */ - 263, /* (117) xfullname ::= nm */ - 263, /* (118) xfullname ::= nm DOT nm */ - 263, /* (119) xfullname ::= nm DOT nm AS nm */ - 263, /* (120) xfullname ::= nm AS nm */ - 258, /* (121) joinop ::= COMMA|JOIN */ - 258, /* (122) joinop ::= JOIN_KW JOIN */ - 258, /* (123) joinop ::= JOIN_KW nm JOIN */ - 258, /* (124) joinop ::= JOIN_KW nm nm JOIN */ - 260, /* (125) on_opt ::= ON expr */ - 260, /* (126) on_opt ::= */ - 259, /* (127) indexed_opt ::= */ - 259, /* (128) indexed_opt ::= INDEXED BY nm */ - 259, /* (129) indexed_opt ::= NOT INDEXED */ - 261, /* (130) using_opt ::= USING LP idlist RP */ - 261, /* (131) using_opt ::= */ + 256, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + 256, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + 256, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + 256, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + 256, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 200, /* (114) dbnm ::= */ + 200, /* (115) dbnm ::= DOT nm */ + 238, /* (116) fullname ::= nm */ + 238, /* (117) fullname ::= nm DOT nm */ + 262, /* (118) xfullname ::= nm */ + 262, /* (119) xfullname ::= nm DOT nm */ + 262, /* (120) xfullname ::= nm DOT nm AS nm */ + 262, /* (121) xfullname ::= nm AS nm */ + 258, /* (122) joinop ::= COMMA|JOIN */ + 258, /* (123) joinop ::= JOIN_KW JOIN */ + 258, /* (124) joinop ::= JOIN_KW nm JOIN */ + 258, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + 259, /* (126) on_using ::= ON expr */ + 259, /* (127) on_using ::= USING LP idlist RP */ + 259, /* (128) on_using ::= */ + 264, /* (129) indexed_opt ::= */ + 260, /* (130) indexed_by ::= INDEXED BY nm */ + 260, /* (131) indexed_by ::= NOT INDEXED */ 249, /* (132) orderby_opt ::= */ 249, /* (133) orderby_opt ::= ORDER BY sortlist */ 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ @@ -164300,8 +166426,8 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 269, /* (172) insert_cmd ::= REPLACE */ 270, /* (173) idlist_opt ::= */ 270, /* (174) idlist_opt ::= LP idlist RP */ - 264, /* (175) idlist ::= idlist COMMA nm */ - 264, /* (176) idlist ::= nm */ + 263, /* (175) idlist ::= idlist COMMA nm */ + 263, /* (176) idlist ::= nm */ 217, /* (177) expr ::= LP expr RP */ 217, /* (178) expr ::= ID|INDEXED */ 217, /* (179) expr ::= JOIN_KW */ @@ -164334,199 +166460,202 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 217, /* (206) expr ::= expr NOT NULL */ 217, /* (207) expr ::= expr IS expr */ 217, /* (208) expr ::= expr IS NOT expr */ - 217, /* (209) expr ::= NOT expr */ - 217, /* (210) expr ::= BITNOT expr */ - 217, /* (211) expr ::= PLUS|MINUS expr */ - 217, /* (212) expr ::= expr PTR expr */ - 275, /* (213) between_op ::= BETWEEN */ - 275, /* (214) between_op ::= NOT BETWEEN */ - 217, /* (215) expr ::= expr between_op expr AND expr */ - 276, /* (216) in_op ::= IN */ - 276, /* (217) in_op ::= NOT IN */ - 217, /* (218) expr ::= expr in_op LP exprlist RP */ - 217, /* (219) expr ::= LP select RP */ - 217, /* (220) expr ::= expr in_op LP select RP */ - 217, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ - 217, /* (222) expr ::= EXISTS LP select RP */ - 217, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ - 279, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - 279, /* (225) case_exprlist ::= WHEN expr THEN expr */ - 280, /* (226) case_else ::= ELSE expr */ - 280, /* (227) case_else ::= */ - 278, /* (228) case_operand ::= expr */ - 278, /* (229) case_operand ::= */ - 262, /* (230) exprlist ::= */ - 253, /* (231) nexprlist ::= nexprlist COMMA expr */ - 253, /* (232) nexprlist ::= expr */ - 277, /* (233) paren_exprlist ::= */ - 277, /* (234) paren_exprlist ::= LP exprlist RP */ - 190, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - 281, /* (236) uniqueflag ::= UNIQUE */ - 281, /* (237) uniqueflag ::= */ - 221, /* (238) eidlist_opt ::= */ - 221, /* (239) eidlist_opt ::= LP eidlist RP */ - 232, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ - 232, /* (241) eidlist ::= nm collate sortorder */ - 282, /* (242) collate ::= */ - 282, /* (243) collate ::= COLLATE ID|STRING */ - 190, /* (244) cmd ::= DROP INDEX ifexists fullname */ - 190, /* (245) cmd ::= VACUUM vinto */ - 190, /* (246) cmd ::= VACUUM nm vinto */ - 283, /* (247) vinto ::= INTO expr */ - 283, /* (248) vinto ::= */ - 190, /* (249) cmd ::= PRAGMA nm dbnm */ - 190, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ - 190, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - 190, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ - 190, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - 211, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ - 212, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ - 190, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - 285, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - 287, /* (258) trigger_time ::= BEFORE|AFTER */ - 287, /* (259) trigger_time ::= INSTEAD OF */ - 287, /* (260) trigger_time ::= */ - 288, /* (261) trigger_event ::= DELETE|INSERT */ - 288, /* (262) trigger_event ::= UPDATE */ - 288, /* (263) trigger_event ::= UPDATE OF idlist */ - 290, /* (264) when_clause ::= */ - 290, /* (265) when_clause ::= WHEN expr */ - 286, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - 286, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ - 292, /* (268) trnm ::= nm DOT nm */ - 293, /* (269) tridxby ::= INDEXED BY nm */ - 293, /* (270) tridxby ::= NOT INDEXED */ - 291, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - 291, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - 291, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - 291, /* (274) trigger_cmd ::= scanpt select scanpt */ - 217, /* (275) expr ::= RAISE LP IGNORE RP */ - 217, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ - 236, /* (277) raisetype ::= ROLLBACK */ - 236, /* (278) raisetype ::= ABORT */ - 236, /* (279) raisetype ::= FAIL */ - 190, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ - 190, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - 190, /* (282) cmd ::= DETACH database_kw_opt expr */ - 295, /* (283) key_opt ::= */ - 295, /* (284) key_opt ::= KEY expr */ - 190, /* (285) cmd ::= REINDEX */ - 190, /* (286) cmd ::= REINDEX nm dbnm */ - 190, /* (287) cmd ::= ANALYZE */ - 190, /* (288) cmd ::= ANALYZE nm dbnm */ - 190, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ - 190, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - 190, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - 296, /* (292) add_column_fullname ::= fullname */ - 190, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - 190, /* (294) cmd ::= create_vtab */ - 190, /* (295) cmd ::= create_vtab LP vtabarglist RP */ - 298, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 300, /* (297) vtabarg ::= */ - 301, /* (298) vtabargtoken ::= ANY */ - 301, /* (299) vtabargtoken ::= lp anylist RP */ - 302, /* (300) lp ::= LP */ - 266, /* (301) with ::= WITH wqlist */ - 266, /* (302) with ::= WITH RECURSIVE wqlist */ - 305, /* (303) wqas ::= AS */ - 305, /* (304) wqas ::= AS MATERIALIZED */ - 305, /* (305) wqas ::= AS NOT MATERIALIZED */ - 304, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ - 241, /* (307) wqlist ::= wqitem */ - 241, /* (308) wqlist ::= wqlist COMMA wqitem */ - 306, /* (309) windowdefn_list ::= windowdefn */ - 306, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - 307, /* (311) windowdefn ::= nm AS LP window RP */ - 308, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (314) window ::= ORDER BY sortlist frame_opt */ - 308, /* (315) window ::= nm ORDER BY sortlist frame_opt */ - 308, /* (316) window ::= frame_opt */ - 308, /* (317) window ::= nm frame_opt */ - 309, /* (318) frame_opt ::= */ - 309, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - 309, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - 313, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ - 315, /* (322) frame_bound_s ::= frame_bound */ - 315, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ - 316, /* (324) frame_bound_e ::= frame_bound */ - 316, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ - 314, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ - 314, /* (327) frame_bound ::= CURRENT ROW */ - 317, /* (328) frame_exclude_opt ::= */ - 317, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ - 318, /* (330) frame_exclude ::= NO OTHERS */ - 318, /* (331) frame_exclude ::= CURRENT ROW */ - 318, /* (332) frame_exclude ::= GROUP|TIES */ - 251, /* (333) window_clause ::= WINDOW windowdefn_list */ - 273, /* (334) filter_over ::= filter_clause over_clause */ - 273, /* (335) filter_over ::= over_clause */ - 273, /* (336) filter_over ::= filter_clause */ - 312, /* (337) over_clause ::= OVER LP window RP */ - 312, /* (338) over_clause ::= OVER nm */ - 311, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ - 185, /* (340) input ::= cmdlist */ - 186, /* (341) cmdlist ::= cmdlist ecmd */ - 186, /* (342) cmdlist ::= ecmd */ - 187, /* (343) ecmd ::= SEMI */ - 187, /* (344) ecmd ::= cmdx SEMI */ - 187, /* (345) ecmd ::= explain cmdx SEMI */ - 192, /* (346) trans_opt ::= */ - 192, /* (347) trans_opt ::= TRANSACTION */ - 192, /* (348) trans_opt ::= TRANSACTION nm */ - 194, /* (349) savepoint_opt ::= SAVEPOINT */ - 194, /* (350) savepoint_opt ::= */ - 190, /* (351) cmd ::= create_table create_table_args */ - 203, /* (352) table_option_set ::= table_option */ - 201, /* (353) columnlist ::= columnlist COMMA columnname carglist */ - 201, /* (354) columnlist ::= columnname carglist */ - 193, /* (355) nm ::= ID|INDEXED */ - 193, /* (356) nm ::= STRING */ - 193, /* (357) nm ::= JOIN_KW */ - 208, /* (358) typetoken ::= typename */ - 209, /* (359) typename ::= ID|STRING */ - 210, /* (360) signed ::= plus_num */ - 210, /* (361) signed ::= minus_num */ - 207, /* (362) carglist ::= carglist ccons */ - 207, /* (363) carglist ::= */ - 215, /* (364) ccons ::= NULL onconf */ - 215, /* (365) ccons ::= GENERATED ALWAYS AS generated */ - 215, /* (366) ccons ::= AS generated */ - 202, /* (367) conslist_opt ::= COMMA conslist */ - 228, /* (368) conslist ::= conslist tconscomma tcons */ - 228, /* (369) conslist ::= tcons */ - 229, /* (370) tconscomma ::= */ - 233, /* (371) defer_subclause_opt ::= defer_subclause */ - 235, /* (372) resolvetype ::= raisetype */ - 239, /* (373) selectnowith ::= oneselect */ - 240, /* (374) oneselect ::= values */ - 254, /* (375) sclp ::= selcollist COMMA */ - 255, /* (376) as ::= ID|STRING */ - 272, /* (377) returning ::= */ - 217, /* (378) expr ::= term */ - 274, /* (379) likeop ::= LIKE_KW|MATCH */ - 262, /* (380) exprlist ::= nexprlist */ - 284, /* (381) nmnum ::= plus_num */ - 284, /* (382) nmnum ::= nm */ - 284, /* (383) nmnum ::= ON */ - 284, /* (384) nmnum ::= DELETE */ - 284, /* (385) nmnum ::= DEFAULT */ - 211, /* (386) plus_num ::= INTEGER|FLOAT */ - 289, /* (387) foreach_clause ::= */ - 289, /* (388) foreach_clause ::= FOR EACH ROW */ - 292, /* (389) trnm ::= nm */ - 293, /* (390) tridxby ::= */ - 294, /* (391) database_kw_opt ::= DATABASE */ - 294, /* (392) database_kw_opt ::= */ - 297, /* (393) kwcolumn_opt ::= */ - 297, /* (394) kwcolumn_opt ::= COLUMNKW */ - 299, /* (395) vtabarglist ::= vtabarg */ - 299, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ - 300, /* (397) vtabarg ::= vtabarg vtabargtoken */ - 303, /* (398) anylist ::= */ - 303, /* (399) anylist ::= anylist LP anylist RP */ - 303, /* (400) anylist ::= anylist ANY */ - 266, /* (401) with ::= */ + 217, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + 217, /* (210) expr ::= expr IS DISTINCT FROM expr */ + 217, /* (211) expr ::= NOT expr */ + 217, /* (212) expr ::= BITNOT expr */ + 217, /* (213) expr ::= PLUS|MINUS expr */ + 217, /* (214) expr ::= expr PTR expr */ + 275, /* (215) between_op ::= BETWEEN */ + 275, /* (216) between_op ::= NOT BETWEEN */ + 217, /* (217) expr ::= expr between_op expr AND expr */ + 276, /* (218) in_op ::= IN */ + 276, /* (219) in_op ::= NOT IN */ + 217, /* (220) expr ::= expr in_op LP exprlist RP */ + 217, /* (221) expr ::= LP select RP */ + 217, /* (222) expr ::= expr in_op LP select RP */ + 217, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + 217, /* (224) expr ::= EXISTS LP select RP */ + 217, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + 279, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 279, /* (227) case_exprlist ::= WHEN expr THEN expr */ + 280, /* (228) case_else ::= ELSE expr */ + 280, /* (229) case_else ::= */ + 278, /* (230) case_operand ::= expr */ + 278, /* (231) case_operand ::= */ + 261, /* (232) exprlist ::= */ + 253, /* (233) nexprlist ::= nexprlist COMMA expr */ + 253, /* (234) nexprlist ::= expr */ + 277, /* (235) paren_exprlist ::= */ + 277, /* (236) paren_exprlist ::= LP exprlist RP */ + 190, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 281, /* (238) uniqueflag ::= UNIQUE */ + 281, /* (239) uniqueflag ::= */ + 221, /* (240) eidlist_opt ::= */ + 221, /* (241) eidlist_opt ::= LP eidlist RP */ + 232, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + 232, /* (243) eidlist ::= nm collate sortorder */ + 282, /* (244) collate ::= */ + 282, /* (245) collate ::= COLLATE ID|STRING */ + 190, /* (246) cmd ::= DROP INDEX ifexists fullname */ + 190, /* (247) cmd ::= VACUUM vinto */ + 190, /* (248) cmd ::= VACUUM nm vinto */ + 283, /* (249) vinto ::= INTO expr */ + 283, /* (250) vinto ::= */ + 190, /* (251) cmd ::= PRAGMA nm dbnm */ + 190, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 190, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 190, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 190, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 211, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + 212, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + 190, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 285, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 287, /* (260) trigger_time ::= BEFORE|AFTER */ + 287, /* (261) trigger_time ::= INSTEAD OF */ + 287, /* (262) trigger_time ::= */ + 288, /* (263) trigger_event ::= DELETE|INSERT */ + 288, /* (264) trigger_event ::= UPDATE */ + 288, /* (265) trigger_event ::= UPDATE OF idlist */ + 290, /* (266) when_clause ::= */ + 290, /* (267) when_clause ::= WHEN expr */ + 286, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 286, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + 292, /* (270) trnm ::= nm DOT nm */ + 293, /* (271) tridxby ::= INDEXED BY nm */ + 293, /* (272) tridxby ::= NOT INDEXED */ + 291, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + 291, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 291, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 291, /* (276) trigger_cmd ::= scanpt select scanpt */ + 217, /* (277) expr ::= RAISE LP IGNORE RP */ + 217, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + 236, /* (279) raisetype ::= ROLLBACK */ + 236, /* (280) raisetype ::= ABORT */ + 236, /* (281) raisetype ::= FAIL */ + 190, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + 190, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 190, /* (284) cmd ::= DETACH database_kw_opt expr */ + 295, /* (285) key_opt ::= */ + 295, /* (286) key_opt ::= KEY expr */ + 190, /* (287) cmd ::= REINDEX */ + 190, /* (288) cmd ::= REINDEX nm dbnm */ + 190, /* (289) cmd ::= ANALYZE */ + 190, /* (290) cmd ::= ANALYZE nm dbnm */ + 190, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 190, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 190, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + 296, /* (294) add_column_fullname ::= fullname */ + 190, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 190, /* (296) cmd ::= create_vtab */ + 190, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + 298, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 300, /* (299) vtabarg ::= */ + 301, /* (300) vtabargtoken ::= ANY */ + 301, /* (301) vtabargtoken ::= lp anylist RP */ + 302, /* (302) lp ::= LP */ + 266, /* (303) with ::= WITH wqlist */ + 266, /* (304) with ::= WITH RECURSIVE wqlist */ + 305, /* (305) wqas ::= AS */ + 305, /* (306) wqas ::= AS MATERIALIZED */ + 305, /* (307) wqas ::= AS NOT MATERIALIZED */ + 304, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + 241, /* (309) wqlist ::= wqitem */ + 241, /* (310) wqlist ::= wqlist COMMA wqitem */ + 306, /* (311) windowdefn_list ::= windowdefn */ + 306, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 307, /* (313) windowdefn ::= nm AS LP window RP */ + 308, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (316) window ::= ORDER BY sortlist frame_opt */ + 308, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + 308, /* (318) window ::= frame_opt */ + 308, /* (319) window ::= nm frame_opt */ + 309, /* (320) frame_opt ::= */ + 309, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 309, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 313, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + 315, /* (324) frame_bound_s ::= frame_bound */ + 315, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + 316, /* (326) frame_bound_e ::= frame_bound */ + 316, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 314, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + 314, /* (329) frame_bound ::= CURRENT ROW */ + 317, /* (330) frame_exclude_opt ::= */ + 317, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 318, /* (332) frame_exclude ::= NO OTHERS */ + 318, /* (333) frame_exclude ::= CURRENT ROW */ + 318, /* (334) frame_exclude ::= GROUP|TIES */ + 251, /* (335) window_clause ::= WINDOW windowdefn_list */ + 273, /* (336) filter_over ::= filter_clause over_clause */ + 273, /* (337) filter_over ::= over_clause */ + 273, /* (338) filter_over ::= filter_clause */ + 312, /* (339) over_clause ::= OVER LP window RP */ + 312, /* (340) over_clause ::= OVER nm */ + 311, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + 185, /* (342) input ::= cmdlist */ + 186, /* (343) cmdlist ::= cmdlist ecmd */ + 186, /* (344) cmdlist ::= ecmd */ + 187, /* (345) ecmd ::= SEMI */ + 187, /* (346) ecmd ::= cmdx SEMI */ + 187, /* (347) ecmd ::= explain cmdx SEMI */ + 192, /* (348) trans_opt ::= */ + 192, /* (349) trans_opt ::= TRANSACTION */ + 192, /* (350) trans_opt ::= TRANSACTION nm */ + 194, /* (351) savepoint_opt ::= SAVEPOINT */ + 194, /* (352) savepoint_opt ::= */ + 190, /* (353) cmd ::= create_table create_table_args */ + 203, /* (354) table_option_set ::= table_option */ + 201, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + 201, /* (356) columnlist ::= columnname carglist */ + 193, /* (357) nm ::= ID|INDEXED */ + 193, /* (358) nm ::= STRING */ + 193, /* (359) nm ::= JOIN_KW */ + 208, /* (360) typetoken ::= typename */ + 209, /* (361) typename ::= ID|STRING */ + 210, /* (362) signed ::= plus_num */ + 210, /* (363) signed ::= minus_num */ + 207, /* (364) carglist ::= carglist ccons */ + 207, /* (365) carglist ::= */ + 215, /* (366) ccons ::= NULL onconf */ + 215, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + 215, /* (368) ccons ::= AS generated */ + 202, /* (369) conslist_opt ::= COMMA conslist */ + 228, /* (370) conslist ::= conslist tconscomma tcons */ + 228, /* (371) conslist ::= tcons */ + 229, /* (372) tconscomma ::= */ + 233, /* (373) defer_subclause_opt ::= defer_subclause */ + 235, /* (374) resolvetype ::= raisetype */ + 239, /* (375) selectnowith ::= oneselect */ + 240, /* (376) oneselect ::= values */ + 254, /* (377) sclp ::= selcollist COMMA */ + 255, /* (378) as ::= ID|STRING */ + 264, /* (379) indexed_opt ::= indexed_by */ + 272, /* (380) returning ::= */ + 217, /* (381) expr ::= term */ + 274, /* (382) likeop ::= LIKE_KW|MATCH */ + 261, /* (383) exprlist ::= nexprlist */ + 284, /* (384) nmnum ::= plus_num */ + 284, /* (385) nmnum ::= nm */ + 284, /* (386) nmnum ::= ON */ + 284, /* (387) nmnum ::= DELETE */ + 284, /* (388) nmnum ::= DEFAULT */ + 211, /* (389) plus_num ::= INTEGER|FLOAT */ + 289, /* (390) foreach_clause ::= */ + 289, /* (391) foreach_clause ::= FOR EACH ROW */ + 292, /* (392) trnm ::= nm */ + 293, /* (393) tridxby ::= */ + 294, /* (394) database_kw_opt ::= DATABASE */ + 294, /* (395) database_kw_opt ::= */ + 297, /* (396) kwcolumn_opt ::= */ + 297, /* (397) kwcolumn_opt ::= COLUMNKW */ + 299, /* (398) vtabarglist ::= vtabarg */ + 299, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + 300, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 303, /* (401) anylist ::= */ + 303, /* (402) anylist ::= anylist LP anylist RP */ + 303, /* (403) anylist ::= anylist ANY */ + 266, /* (404) with ::= */ }; /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number @@ -164641,29 +166770,29 @@ static const signed char yyRuleInfoNRhs[] = { -2, /* (106) from ::= FROM seltablist */ -2, /* (107) stl_prefix ::= seltablist joinop */ 0, /* (108) stl_prefix ::= */ - -7, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - -9, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - -7, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - -7, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - 0, /* (113) dbnm ::= */ - -2, /* (114) dbnm ::= DOT nm */ - -1, /* (115) fullname ::= nm */ - -3, /* (116) fullname ::= nm DOT nm */ - -1, /* (117) xfullname ::= nm */ - -3, /* (118) xfullname ::= nm DOT nm */ - -5, /* (119) xfullname ::= nm DOT nm AS nm */ - -3, /* (120) xfullname ::= nm AS nm */ - -1, /* (121) joinop ::= COMMA|JOIN */ - -2, /* (122) joinop ::= JOIN_KW JOIN */ - -3, /* (123) joinop ::= JOIN_KW nm JOIN */ - -4, /* (124) joinop ::= JOIN_KW nm nm JOIN */ - -2, /* (125) on_opt ::= ON expr */ - 0, /* (126) on_opt ::= */ - 0, /* (127) indexed_opt ::= */ - -3, /* (128) indexed_opt ::= INDEXED BY nm */ - -2, /* (129) indexed_opt ::= NOT INDEXED */ - -4, /* (130) using_opt ::= USING LP idlist RP */ - 0, /* (131) using_opt ::= */ + -5, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + -6, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + -8, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + -6, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + -6, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 0, /* (114) dbnm ::= */ + -2, /* (115) dbnm ::= DOT nm */ + -1, /* (116) fullname ::= nm */ + -3, /* (117) fullname ::= nm DOT nm */ + -1, /* (118) xfullname ::= nm */ + -3, /* (119) xfullname ::= nm DOT nm */ + -5, /* (120) xfullname ::= nm DOT nm AS nm */ + -3, /* (121) xfullname ::= nm AS nm */ + -1, /* (122) joinop ::= COMMA|JOIN */ + -2, /* (123) joinop ::= JOIN_KW JOIN */ + -3, /* (124) joinop ::= JOIN_KW nm JOIN */ + -4, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (126) on_using ::= ON expr */ + -4, /* (127) on_using ::= USING LP idlist RP */ + 0, /* (128) on_using ::= */ + 0, /* (129) indexed_opt ::= */ + -3, /* (130) indexed_by ::= INDEXED BY nm */ + -2, /* (131) indexed_by ::= NOT INDEXED */ 0, /* (132) orderby_opt ::= */ -3, /* (133) orderby_opt ::= ORDER BY sortlist */ -5, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ @@ -164741,199 +166870,202 @@ static const signed char yyRuleInfoNRhs[] = { -3, /* (206) expr ::= expr NOT NULL */ -3, /* (207) expr ::= expr IS expr */ -4, /* (208) expr ::= expr IS NOT expr */ - -2, /* (209) expr ::= NOT expr */ - -2, /* (210) expr ::= BITNOT expr */ - -2, /* (211) expr ::= PLUS|MINUS expr */ - -3, /* (212) expr ::= expr PTR expr */ - -1, /* (213) between_op ::= BETWEEN */ - -2, /* (214) between_op ::= NOT BETWEEN */ - -5, /* (215) expr ::= expr between_op expr AND expr */ - -1, /* (216) in_op ::= IN */ - -2, /* (217) in_op ::= NOT IN */ - -5, /* (218) expr ::= expr in_op LP exprlist RP */ - -3, /* (219) expr ::= LP select RP */ - -5, /* (220) expr ::= expr in_op LP select RP */ - -5, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ - -4, /* (222) expr ::= EXISTS LP select RP */ - -5, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ - -5, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - -4, /* (225) case_exprlist ::= WHEN expr THEN expr */ - -2, /* (226) case_else ::= ELSE expr */ - 0, /* (227) case_else ::= */ - -1, /* (228) case_operand ::= expr */ - 0, /* (229) case_operand ::= */ - 0, /* (230) exprlist ::= */ - -3, /* (231) nexprlist ::= nexprlist COMMA expr */ - -1, /* (232) nexprlist ::= expr */ - 0, /* (233) paren_exprlist ::= */ - -3, /* (234) paren_exprlist ::= LP exprlist RP */ - -12, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - -1, /* (236) uniqueflag ::= UNIQUE */ - 0, /* (237) uniqueflag ::= */ - 0, /* (238) eidlist_opt ::= */ - -3, /* (239) eidlist_opt ::= LP eidlist RP */ - -5, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ - -3, /* (241) eidlist ::= nm collate sortorder */ - 0, /* (242) collate ::= */ - -2, /* (243) collate ::= COLLATE ID|STRING */ - -4, /* (244) cmd ::= DROP INDEX ifexists fullname */ - -2, /* (245) cmd ::= VACUUM vinto */ - -3, /* (246) cmd ::= VACUUM nm vinto */ - -2, /* (247) vinto ::= INTO expr */ - 0, /* (248) vinto ::= */ - -3, /* (249) cmd ::= PRAGMA nm dbnm */ - -5, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ - -6, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - -5, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ - -6, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - -2, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ - -2, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ - -5, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - -11, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - -1, /* (258) trigger_time ::= BEFORE|AFTER */ - -2, /* (259) trigger_time ::= INSTEAD OF */ - 0, /* (260) trigger_time ::= */ - -1, /* (261) trigger_event ::= DELETE|INSERT */ - -1, /* (262) trigger_event ::= UPDATE */ - -3, /* (263) trigger_event ::= UPDATE OF idlist */ - 0, /* (264) when_clause ::= */ - -2, /* (265) when_clause ::= WHEN expr */ - -3, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - -2, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ - -3, /* (268) trnm ::= nm DOT nm */ - -3, /* (269) tridxby ::= INDEXED BY nm */ - -2, /* (270) tridxby ::= NOT INDEXED */ - -9, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - -8, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - -6, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - -3, /* (274) trigger_cmd ::= scanpt select scanpt */ - -4, /* (275) expr ::= RAISE LP IGNORE RP */ - -6, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ - -1, /* (277) raisetype ::= ROLLBACK */ - -1, /* (278) raisetype ::= ABORT */ - -1, /* (279) raisetype ::= FAIL */ - -4, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ - -6, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - -3, /* (282) cmd ::= DETACH database_kw_opt expr */ - 0, /* (283) key_opt ::= */ - -2, /* (284) key_opt ::= KEY expr */ - -1, /* (285) cmd ::= REINDEX */ - -3, /* (286) cmd ::= REINDEX nm dbnm */ - -1, /* (287) cmd ::= ANALYZE */ - -3, /* (288) cmd ::= ANALYZE nm dbnm */ - -6, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ - -7, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - -6, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - -1, /* (292) add_column_fullname ::= fullname */ - -8, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - -1, /* (294) cmd ::= create_vtab */ - -4, /* (295) cmd ::= create_vtab LP vtabarglist RP */ - -8, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 0, /* (297) vtabarg ::= */ - -1, /* (298) vtabargtoken ::= ANY */ - -3, /* (299) vtabargtoken ::= lp anylist RP */ - -1, /* (300) lp ::= LP */ - -2, /* (301) with ::= WITH wqlist */ - -3, /* (302) with ::= WITH RECURSIVE wqlist */ - -1, /* (303) wqas ::= AS */ - -2, /* (304) wqas ::= AS MATERIALIZED */ - -3, /* (305) wqas ::= AS NOT MATERIALIZED */ - -6, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ - -1, /* (307) wqlist ::= wqitem */ - -3, /* (308) wqlist ::= wqlist COMMA wqitem */ - -1, /* (309) windowdefn_list ::= windowdefn */ - -3, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - -5, /* (311) windowdefn ::= nm AS LP window RP */ - -5, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - -6, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - -4, /* (314) window ::= ORDER BY sortlist frame_opt */ - -5, /* (315) window ::= nm ORDER BY sortlist frame_opt */ - -1, /* (316) window ::= frame_opt */ - -2, /* (317) window ::= nm frame_opt */ - 0, /* (318) frame_opt ::= */ - -3, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - -6, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - -1, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ - -1, /* (322) frame_bound_s ::= frame_bound */ - -2, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ - -1, /* (324) frame_bound_e ::= frame_bound */ - -2, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ - -2, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ - -2, /* (327) frame_bound ::= CURRENT ROW */ - 0, /* (328) frame_exclude_opt ::= */ - -2, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ - -2, /* (330) frame_exclude ::= NO OTHERS */ - -2, /* (331) frame_exclude ::= CURRENT ROW */ - -1, /* (332) frame_exclude ::= GROUP|TIES */ - -2, /* (333) window_clause ::= WINDOW windowdefn_list */ - -2, /* (334) filter_over ::= filter_clause over_clause */ - -1, /* (335) filter_over ::= over_clause */ - -1, /* (336) filter_over ::= filter_clause */ - -4, /* (337) over_clause ::= OVER LP window RP */ - -2, /* (338) over_clause ::= OVER nm */ - -5, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ - -1, /* (340) input ::= cmdlist */ - -2, /* (341) cmdlist ::= cmdlist ecmd */ - -1, /* (342) cmdlist ::= ecmd */ - -1, /* (343) ecmd ::= SEMI */ - -2, /* (344) ecmd ::= cmdx SEMI */ - -3, /* (345) ecmd ::= explain cmdx SEMI */ - 0, /* (346) trans_opt ::= */ - -1, /* (347) trans_opt ::= TRANSACTION */ - -2, /* (348) trans_opt ::= TRANSACTION nm */ - -1, /* (349) savepoint_opt ::= SAVEPOINT */ - 0, /* (350) savepoint_opt ::= */ - -2, /* (351) cmd ::= create_table create_table_args */ - -1, /* (352) table_option_set ::= table_option */ - -4, /* (353) columnlist ::= columnlist COMMA columnname carglist */ - -2, /* (354) columnlist ::= columnname carglist */ - -1, /* (355) nm ::= ID|INDEXED */ - -1, /* (356) nm ::= STRING */ - -1, /* (357) nm ::= JOIN_KW */ - -1, /* (358) typetoken ::= typename */ - -1, /* (359) typename ::= ID|STRING */ - -1, /* (360) signed ::= plus_num */ - -1, /* (361) signed ::= minus_num */ - -2, /* (362) carglist ::= carglist ccons */ - 0, /* (363) carglist ::= */ - -2, /* (364) ccons ::= NULL onconf */ - -4, /* (365) ccons ::= GENERATED ALWAYS AS generated */ - -2, /* (366) ccons ::= AS generated */ - -2, /* (367) conslist_opt ::= COMMA conslist */ - -3, /* (368) conslist ::= conslist tconscomma tcons */ - -1, /* (369) conslist ::= tcons */ - 0, /* (370) tconscomma ::= */ - -1, /* (371) defer_subclause_opt ::= defer_subclause */ - -1, /* (372) resolvetype ::= raisetype */ - -1, /* (373) selectnowith ::= oneselect */ - -1, /* (374) oneselect ::= values */ - -2, /* (375) sclp ::= selcollist COMMA */ - -1, /* (376) as ::= ID|STRING */ - 0, /* (377) returning ::= */ - -1, /* (378) expr ::= term */ - -1, /* (379) likeop ::= LIKE_KW|MATCH */ - -1, /* (380) exprlist ::= nexprlist */ - -1, /* (381) nmnum ::= plus_num */ - -1, /* (382) nmnum ::= nm */ - -1, /* (383) nmnum ::= ON */ - -1, /* (384) nmnum ::= DELETE */ - -1, /* (385) nmnum ::= DEFAULT */ - -1, /* (386) plus_num ::= INTEGER|FLOAT */ - 0, /* (387) foreach_clause ::= */ - -3, /* (388) foreach_clause ::= FOR EACH ROW */ - -1, /* (389) trnm ::= nm */ - 0, /* (390) tridxby ::= */ - -1, /* (391) database_kw_opt ::= DATABASE */ - 0, /* (392) database_kw_opt ::= */ - 0, /* (393) kwcolumn_opt ::= */ - -1, /* (394) kwcolumn_opt ::= COLUMNKW */ - -1, /* (395) vtabarglist ::= vtabarg */ - -3, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ - -2, /* (397) vtabarg ::= vtabarg vtabargtoken */ - 0, /* (398) anylist ::= */ - -4, /* (399) anylist ::= anylist LP anylist RP */ - -2, /* (400) anylist ::= anylist ANY */ - 0, /* (401) with ::= */ + -6, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + -5, /* (210) expr ::= expr IS DISTINCT FROM expr */ + -2, /* (211) expr ::= NOT expr */ + -2, /* (212) expr ::= BITNOT expr */ + -2, /* (213) expr ::= PLUS|MINUS expr */ + -3, /* (214) expr ::= expr PTR expr */ + -1, /* (215) between_op ::= BETWEEN */ + -2, /* (216) between_op ::= NOT BETWEEN */ + -5, /* (217) expr ::= expr between_op expr AND expr */ + -1, /* (218) in_op ::= IN */ + -2, /* (219) in_op ::= NOT IN */ + -5, /* (220) expr ::= expr in_op LP exprlist RP */ + -3, /* (221) expr ::= LP select RP */ + -5, /* (222) expr ::= expr in_op LP select RP */ + -5, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (224) expr ::= EXISTS LP select RP */ + -5, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (227) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (228) case_else ::= ELSE expr */ + 0, /* (229) case_else ::= */ + -1, /* (230) case_operand ::= expr */ + 0, /* (231) case_operand ::= */ + 0, /* (232) exprlist ::= */ + -3, /* (233) nexprlist ::= nexprlist COMMA expr */ + -1, /* (234) nexprlist ::= expr */ + 0, /* (235) paren_exprlist ::= */ + -3, /* (236) paren_exprlist ::= LP exprlist RP */ + -12, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (238) uniqueflag ::= UNIQUE */ + 0, /* (239) uniqueflag ::= */ + 0, /* (240) eidlist_opt ::= */ + -3, /* (241) eidlist_opt ::= LP eidlist RP */ + -5, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (243) eidlist ::= nm collate sortorder */ + 0, /* (244) collate ::= */ + -2, /* (245) collate ::= COLLATE ID|STRING */ + -4, /* (246) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (247) cmd ::= VACUUM vinto */ + -3, /* (248) cmd ::= VACUUM nm vinto */ + -2, /* (249) vinto ::= INTO expr */ + 0, /* (250) vinto ::= */ + -3, /* (251) cmd ::= PRAGMA nm dbnm */ + -5, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (260) trigger_time ::= BEFORE|AFTER */ + -2, /* (261) trigger_time ::= INSTEAD OF */ + 0, /* (262) trigger_time ::= */ + -1, /* (263) trigger_event ::= DELETE|INSERT */ + -1, /* (264) trigger_event ::= UPDATE */ + -3, /* (265) trigger_event ::= UPDATE OF idlist */ + 0, /* (266) when_clause ::= */ + -2, /* (267) when_clause ::= WHEN expr */ + -3, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (270) trnm ::= nm DOT nm */ + -3, /* (271) tridxby ::= INDEXED BY nm */ + -2, /* (272) tridxby ::= NOT INDEXED */ + -9, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + -8, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (276) trigger_cmd ::= scanpt select scanpt */ + -4, /* (277) expr ::= RAISE LP IGNORE RP */ + -6, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (279) raisetype ::= ROLLBACK */ + -1, /* (280) raisetype ::= ABORT */ + -1, /* (281) raisetype ::= FAIL */ + -4, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (284) cmd ::= DETACH database_kw_opt expr */ + 0, /* (285) key_opt ::= */ + -2, /* (286) key_opt ::= KEY expr */ + -1, /* (287) cmd ::= REINDEX */ + -3, /* (288) cmd ::= REINDEX nm dbnm */ + -1, /* (289) cmd ::= ANALYZE */ + -3, /* (290) cmd ::= ANALYZE nm dbnm */ + -6, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -6, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + -1, /* (294) add_column_fullname ::= fullname */ + -8, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (296) cmd ::= create_vtab */ + -4, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (299) vtabarg ::= */ + -1, /* (300) vtabargtoken ::= ANY */ + -3, /* (301) vtabargtoken ::= lp anylist RP */ + -1, /* (302) lp ::= LP */ + -2, /* (303) with ::= WITH wqlist */ + -3, /* (304) with ::= WITH RECURSIVE wqlist */ + -1, /* (305) wqas ::= AS */ + -2, /* (306) wqas ::= AS MATERIALIZED */ + -3, /* (307) wqas ::= AS NOT MATERIALIZED */ + -6, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + -1, /* (309) wqlist ::= wqitem */ + -3, /* (310) wqlist ::= wqlist COMMA wqitem */ + -1, /* (311) windowdefn_list ::= windowdefn */ + -3, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (313) windowdefn ::= nm AS LP window RP */ + -5, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (316) window ::= ORDER BY sortlist frame_opt */ + -5, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (318) window ::= frame_opt */ + -2, /* (319) window ::= nm frame_opt */ + 0, /* (320) frame_opt ::= */ + -3, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (324) frame_bound_s ::= frame_bound */ + -2, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (326) frame_bound_e ::= frame_bound */ + -2, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (329) frame_bound ::= CURRENT ROW */ + 0, /* (330) frame_exclude_opt ::= */ + -2, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (332) frame_exclude ::= NO OTHERS */ + -2, /* (333) frame_exclude ::= CURRENT ROW */ + -1, /* (334) frame_exclude ::= GROUP|TIES */ + -2, /* (335) window_clause ::= WINDOW windowdefn_list */ + -2, /* (336) filter_over ::= filter_clause over_clause */ + -1, /* (337) filter_over ::= over_clause */ + -1, /* (338) filter_over ::= filter_clause */ + -4, /* (339) over_clause ::= OVER LP window RP */ + -2, /* (340) over_clause ::= OVER nm */ + -5, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (342) input ::= cmdlist */ + -2, /* (343) cmdlist ::= cmdlist ecmd */ + -1, /* (344) cmdlist ::= ecmd */ + -1, /* (345) ecmd ::= SEMI */ + -2, /* (346) ecmd ::= cmdx SEMI */ + -3, /* (347) ecmd ::= explain cmdx SEMI */ + 0, /* (348) trans_opt ::= */ + -1, /* (349) trans_opt ::= TRANSACTION */ + -2, /* (350) trans_opt ::= TRANSACTION nm */ + -1, /* (351) savepoint_opt ::= SAVEPOINT */ + 0, /* (352) savepoint_opt ::= */ + -2, /* (353) cmd ::= create_table create_table_args */ + -1, /* (354) table_option_set ::= table_option */ + -4, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (356) columnlist ::= columnname carglist */ + -1, /* (357) nm ::= ID|INDEXED */ + -1, /* (358) nm ::= STRING */ + -1, /* (359) nm ::= JOIN_KW */ + -1, /* (360) typetoken ::= typename */ + -1, /* (361) typename ::= ID|STRING */ + -1, /* (362) signed ::= plus_num */ + -1, /* (363) signed ::= minus_num */ + -2, /* (364) carglist ::= carglist ccons */ + 0, /* (365) carglist ::= */ + -2, /* (366) ccons ::= NULL onconf */ + -4, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (368) ccons ::= AS generated */ + -2, /* (369) conslist_opt ::= COMMA conslist */ + -3, /* (370) conslist ::= conslist tconscomma tcons */ + -1, /* (371) conslist ::= tcons */ + 0, /* (372) tconscomma ::= */ + -1, /* (373) defer_subclause_opt ::= defer_subclause */ + -1, /* (374) resolvetype ::= raisetype */ + -1, /* (375) selectnowith ::= oneselect */ + -1, /* (376) oneselect ::= values */ + -2, /* (377) sclp ::= selcollist COMMA */ + -1, /* (378) as ::= ID|STRING */ + -1, /* (379) indexed_opt ::= indexed_by */ + 0, /* (380) returning ::= */ + -1, /* (381) expr ::= term */ + -1, /* (382) likeop ::= LIKE_KW|MATCH */ + -1, /* (383) exprlist ::= nexprlist */ + -1, /* (384) nmnum ::= plus_num */ + -1, /* (385) nmnum ::= nm */ + -1, /* (386) nmnum ::= ON */ + -1, /* (387) nmnum ::= DELETE */ + -1, /* (388) nmnum ::= DEFAULT */ + -1, /* (389) plus_num ::= INTEGER|FLOAT */ + 0, /* (390) foreach_clause ::= */ + -3, /* (391) foreach_clause ::= FOR EACH ROW */ + -1, /* (392) trnm ::= nm */ + 0, /* (393) tridxby ::= */ + -1, /* (394) database_kw_opt ::= DATABASE */ + 0, /* (395) database_kw_opt ::= */ + 0, /* (396) kwcolumn_opt ::= */ + -1, /* (397) kwcolumn_opt ::= COLUMNKW */ + -1, /* (398) vtabarglist ::= vtabarg */ + -3, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (401) anylist ::= */ + -4, /* (402) anylist ::= anylist LP anylist RP */ + -2, /* (403) anylist ::= anylist ANY */ + 0, /* (404) with ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -164993,7 +167125,7 @@ static YYACTIONTYPE yy_reduce( case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); - case 321: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==321); + case 323: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==323); {yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ @@ -165030,7 +167162,7 @@ static YYACTIONTYPE yy_reduce( case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72); case 81: /* ifexists ::= */ yytestcase(yyruleno==81); case 98: /* distinct ::= */ yytestcase(yyruleno==98); - case 242: /* collate ::= */ yytestcase(yyruleno==242); + case 244: /* collate ::= */ yytestcase(yyruleno==244); {yymsp[1].minor.yy394 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ @@ -165214,9 +167346,9 @@ static YYACTIONTYPE yy_reduce( break; case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80); - case 214: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==214); - case 217: /* in_op ::= NOT IN */ yytestcase(yyruleno==217); - case 243: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==243); + case 216: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==216); + case 219: /* in_op ::= NOT IN */ yytestcase(yyruleno==219); + case 245: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==245); {yymsp[-1].minor.yy394 = 1;} break; case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ @@ -165301,7 +167433,7 @@ static YYACTIONTYPE yy_reduce( Token x; x.n = 0; parserDoubleLinkSelect(pParse, pRhs); - pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0); pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ @@ -165366,9 +167498,9 @@ static YYACTIONTYPE yy_reduce( case 99: /* sclp ::= */ case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132); case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142); - case 230: /* exprlist ::= */ yytestcase(yyruleno==230); - case 233: /* paren_exprlist ::= */ yytestcase(yyruleno==233); - case 238: /* eidlist_opt ::= */ yytestcase(yyruleno==238); + case 232: /* exprlist ::= */ yytestcase(yyruleno==232); + case 235: /* paren_exprlist ::= */ yytestcase(yyruleno==235); + case 240: /* eidlist_opt ::= */ yytestcase(yyruleno==240); {yymsp[1].minor.yy322 = 0;} break; case 100: /* selcollist ::= sclp scanpt expr scanpt as */ @@ -165393,9 +167525,9 @@ static YYACTIONTYPE yy_reduce( } break; case 103: /* as ::= AS nm */ - case 114: /* dbnm ::= DOT nm */ yytestcase(yyruleno==114); - case 254: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==254); - case 255: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==255); + case 115: /* dbnm ::= DOT nm */ yytestcase(yyruleno==115); + case 256: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==256); + case 257: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==257); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; case 105: /* from ::= */ @@ -165405,7 +167537,7 @@ static YYACTIONTYPE yy_reduce( case 106: /* from ::= FROM seltablist */ { yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy131); + sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy131); } break; case 107: /* stl_prefix ::= seltablist joinop */ @@ -165413,35 +167545,43 @@ static YYACTIONTYPE yy_reduce( if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394; } break; - case 109: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + case 109: /* seltablist ::= stl_prefix nm dbnm as on_using */ { - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy131, &yymsp[-2].minor.yy0); + yymsp[-4].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy131,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); } break; - case 110: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + case 110: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ { - yymsp[-8].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy131,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy131, yymsp[-4].minor.yy322); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-1].minor.yy0); } break; - case 111: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + case 111: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ { - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy47,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + yymsp[-7].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy131,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy131, yymsp[-3].minor.yy322); +} + break; + case 112: /* seltablist ::= stl_prefix LP select RP as on_using */ +{ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy47,&yymsp[0].minor.yy561); } break; - case 112: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + case 113: /* seltablist ::= stl_prefix LP seltablist RP as on_using */ { - if( yymsp[-6].minor.yy131==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy528==0 && yymsp[0].minor.yy254==0 ){ - yymsp[-6].minor.yy131 = yymsp[-4].minor.yy131; - }else if( yymsp[-4].minor.yy131->nSrc==1 ){ - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - if( yymsp[-6].minor.yy131 ){ - SrcItem *pNew = &yymsp[-6].minor.yy131->a[yymsp[-6].minor.yy131->nSrc-1]; - SrcItem *pOld = yymsp[-4].minor.yy131->a; + if( yymsp[-5].minor.yy131==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy561.pOn==0 && yymsp[0].minor.yy561.pUsing==0 ){ + yymsp[-5].minor.yy131 = yymsp[-3].minor.yy131; + }else if( yymsp[-3].minor.yy131->nSrc==1 ){ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + if( yymsp[-5].minor.yy131 ){ + SrcItem *pNew = &yymsp[-5].minor.yy131->a[yymsp[-5].minor.yy131->nSrc-1]; + SrcItem *pOld = yymsp[-3].minor.yy131->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){ + pNew->fg.isNestedFrom = 1; + } if( pOld->fg.isTabFunc ){ pNew->u1.pFuncArg = pOld->u1.pFuncArg; pOld->u1.pFuncArg = 0; @@ -165451,94 +167591,78 @@ static YYACTIONTYPE yy_reduce( pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy131); + sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy131); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy131); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy131,0,0,0,0,SF_NestedFrom,0); - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy131); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy131,0,0,0,0,SF_NestedFrom,0); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy561); } } break; - case 113: /* dbnm ::= */ - case 127: /* indexed_opt ::= */ yytestcase(yyruleno==127); + case 114: /* dbnm ::= */ + case 129: /* indexed_opt ::= */ yytestcase(yyruleno==129); {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} break; - case 115: /* fullname ::= nm */ + case 116: /* fullname ::= nm */ { yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } yymsp[0].minor.yy131 = yylhsminor.yy131; break; - case 116: /* fullname ::= nm DOT nm */ + case 117: /* fullname ::= nm DOT nm */ { yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy131 = yylhsminor.yy131; break; - case 117: /* xfullname ::= nm */ + case 118: /* xfullname ::= nm */ {yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; - case 118: /* xfullname ::= nm DOT nm */ + case 119: /* xfullname ::= nm DOT nm */ {yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 119: /* xfullname ::= nm DOT nm AS nm */ + case 120: /* xfullname ::= nm DOT nm AS nm */ { yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 120: /* xfullname ::= nm AS nm */ + case 121: /* xfullname ::= nm AS nm */ { yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 121: /* joinop ::= COMMA|JOIN */ + case 122: /* joinop ::= COMMA|JOIN */ { yymsp[0].minor.yy394 = JT_INNER; } break; - case 122: /* joinop ::= JOIN_KW JOIN */ + case 123: /* joinop ::= JOIN_KW JOIN */ {yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; - case 123: /* joinop ::= JOIN_KW nm JOIN */ + case 124: /* joinop ::= JOIN_KW nm JOIN */ {yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; - case 124: /* joinop ::= JOIN_KW nm nm JOIN */ + case 125: /* joinop ::= JOIN_KW nm nm JOIN */ {yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; - case 125: /* on_opt ::= ON expr */ - case 145: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==145); - case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); - case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); - case 226: /* case_else ::= ELSE expr */ yytestcase(yyruleno==226); - case 247: /* vinto ::= INTO expr */ yytestcase(yyruleno==247); -{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + case 126: /* on_using ::= ON expr */ +{yymsp[-1].minor.yy561.pOn = yymsp[0].minor.yy528; yymsp[-1].minor.yy561.pUsing = 0;} break; - case 126: /* on_opt ::= */ - case 144: /* having_opt ::= */ yytestcase(yyruleno==144); - case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); - case 151: /* where_opt ::= */ yytestcase(yyruleno==151); - case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); - case 227: /* case_else ::= */ yytestcase(yyruleno==227); - case 229: /* case_operand ::= */ yytestcase(yyruleno==229); - case 248: /* vinto ::= */ yytestcase(yyruleno==248); -{yymsp[1].minor.yy528 = 0;} + case 127: /* on_using ::= USING LP idlist RP */ +{yymsp[-3].minor.yy561.pOn = 0; yymsp[-3].minor.yy561.pUsing = yymsp[-1].minor.yy254;} break; - case 128: /* indexed_opt ::= INDEXED BY nm */ + case 128: /* on_using ::= */ +{yymsp[1].minor.yy561.pOn = 0; yymsp[1].minor.yy561.pUsing = 0;} + break; + case 130: /* indexed_by ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} break; - case 129: /* indexed_opt ::= NOT INDEXED */ + case 131: /* indexed_by ::= NOT INDEXED */ {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; - case 130: /* using_opt ::= USING LP idlist RP */ -{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;} - break; - case 131: /* using_opt ::= */ - case 173: /* idlist_opt ::= */ yytestcase(yyruleno==173); -{yymsp[1].minor.yy254 = 0;} - break; case 133: /* orderby_opt ::= ORDER BY sortlist */ case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143); {yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;} @@ -165571,6 +167695,22 @@ static YYACTIONTYPE yy_reduce( case 140: /* nulls ::= NULLS LAST */ {yymsp[-1].minor.yy394 = SQLITE_SO_DESC;} break; + case 144: /* having_opt ::= */ + case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); + case 151: /* where_opt ::= */ yytestcase(yyruleno==151); + case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); + case 229: /* case_else ::= */ yytestcase(yyruleno==229); + case 231: /* case_operand ::= */ yytestcase(yyruleno==231); + case 250: /* vinto ::= */ yytestcase(yyruleno==250); +{yymsp[1].minor.yy528 = 0;} + break; + case 145: /* having_opt ::= HAVING expr */ + case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); + case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); + case 228: /* case_else ::= ELSE expr */ yytestcase(yyruleno==228); + case 249: /* vinto ::= INTO expr */ yytestcase(yyruleno==249); +{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + break; case 147: /* limit_opt ::= LIMIT expr */ {yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);} break; @@ -165596,7 +167736,18 @@ static YYACTIONTYPE yy_reduce( { sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list"); - yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, yymsp[-1].minor.yy131); + if( yymsp[-1].minor.yy131 ){ + SrcList *pFromClause = yymsp[-1].minor.yy131; + if( pFromClause->nSrc>1 ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } + yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause); + } sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,0); } break; @@ -165654,6 +167805,9 @@ static YYACTIONTYPE yy_reduce( case 170: /* returning ::= RETURNING selcollist */ {sqlite3AddReturning(pParse,yymsp[0].minor.yy322);} break; + case 173: /* idlist_opt ::= */ +{yymsp[1].minor.yy254 = 0;} + break; case 174: /* idlist_opt ::= LP idlist RP */ {yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} break; @@ -165839,17 +167993,29 @@ static YYACTIONTYPE yy_reduce( binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL); } break; - case 209: /* expr ::= NOT expr */ - case 210: /* expr ::= BITNOT expr */ yytestcase(yyruleno==210); + case 209: /* expr ::= expr IS NOT DISTINCT FROM expr */ +{ + yymsp[-5].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-5].minor.yy528, TK_ISNULL); +} + break; + case 210: /* expr ::= expr IS DISTINCT FROM expr */ +{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-4].minor.yy528, TK_NOTNULL); +} + break; + case 211: /* expr ::= NOT expr */ + case 212: /* expr ::= BITNOT expr */ yytestcase(yyruleno==212); {yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/} break; - case 211: /* expr ::= PLUS|MINUS expr */ + case 213: /* expr ::= PLUS|MINUS expr */ { yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0); /*A-overwrites-B*/ } break; - case 212: /* expr ::= expr PTR expr */ + case 214: /* expr ::= expr PTR expr */ { ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528); pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528); @@ -165857,11 +168023,11 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy528 = yylhsminor.yy528; break; - case 213: /* between_op ::= BETWEEN */ - case 216: /* in_op ::= IN */ yytestcase(yyruleno==216); + case 215: /* between_op ::= BETWEEN */ + case 218: /* in_op ::= IN */ yytestcase(yyruleno==218); {yymsp[0].minor.yy394 = 0;} break; - case 215: /* expr ::= expr between_op expr AND expr */ + case 217: /* expr ::= expr between_op expr AND expr */ { ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); @@ -165874,7 +168040,7 @@ static YYACTIONTYPE yy_reduce( if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 218: /* expr ::= expr in_op LP exprlist RP */ + case 220: /* expr ::= expr in_op LP exprlist RP */ { if( yymsp[-1].minor.yy322==0 ){ /* Expressions of the form @@ -165886,7 +168052,8 @@ static YYACTIONTYPE yy_reduce( ** regardless of the value of expr1. */ sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy394 ? "1" : "0"); + yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy394 ? "true" : "false"); + if( yymsp[-4].minor.yy528 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy528); }else{ Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr; if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){ @@ -165914,20 +168081,20 @@ static YYACTIONTYPE yy_reduce( } } break; - case 219: /* expr ::= LP select RP */ + case 221: /* expr ::= LP select RP */ { yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47); } break; - case 220: /* expr ::= expr in_op LP select RP */ + case 222: /* expr ::= expr in_op LP select RP */ { yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47); if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 221: /* expr ::= expr in_op nm dbnm paren_exprlist */ + case 223: /* expr ::= expr in_op nm dbnm paren_exprlist */ { SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); @@ -165937,14 +168104,14 @@ static YYACTIONTYPE yy_reduce( if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 222: /* expr ::= EXISTS LP select RP */ + case 224: /* expr ::= EXISTS LP select RP */ { Expr *p; p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47); } break; - case 223: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 225: /* expr ::= CASE case_operand case_exprlist case_else END */ { yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0); if( yymsp[-4].minor.yy528 ){ @@ -165956,32 +168123,32 @@ static YYACTIONTYPE yy_reduce( } } break; - case 224: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 226: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528); } break; - case 225: /* case_exprlist ::= WHEN expr THEN expr */ + case 227: /* case_exprlist ::= WHEN expr THEN expr */ { yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528); } break; - case 228: /* case_operand ::= expr */ + case 230: /* case_operand ::= expr */ {yymsp[0].minor.yy528 = yymsp[0].minor.yy528; /*A-overwrites-X*/} break; - case 231: /* nexprlist ::= nexprlist COMMA expr */ + case 233: /* nexprlist ::= nexprlist COMMA expr */ {yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);} break; - case 232: /* nexprlist ::= expr */ + case 234: /* nexprlist ::= expr */ {yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/} break; - case 234: /* paren_exprlist ::= LP exprlist RP */ - case 239: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==239); + case 236: /* paren_exprlist ::= LP exprlist RP */ + case 241: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==241); {yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;} break; - case 235: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + case 237: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394, @@ -165991,48 +168158,48 @@ static YYACTIONTYPE yy_reduce( } } break; - case 236: /* uniqueflag ::= UNIQUE */ - case 278: /* raisetype ::= ABORT */ yytestcase(yyruleno==278); + case 238: /* uniqueflag ::= UNIQUE */ + case 280: /* raisetype ::= ABORT */ yytestcase(yyruleno==280); {yymsp[0].minor.yy394 = OE_Abort;} break; - case 237: /* uniqueflag ::= */ + case 239: /* uniqueflag ::= */ {yymsp[1].minor.yy394 = OE_None;} break; - case 240: /* eidlist ::= eidlist COMMA nm collate sortorder */ + case 242: /* eidlist ::= eidlist COMMA nm collate sortorder */ { yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); } break; - case 241: /* eidlist ::= nm collate sortorder */ + case 243: /* eidlist ::= nm collate sortorder */ { yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/ } break; - case 244: /* cmd ::= DROP INDEX ifexists fullname */ + case 246: /* cmd ::= DROP INDEX ifexists fullname */ {sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);} break; - case 245: /* cmd ::= VACUUM vinto */ + case 247: /* cmd ::= VACUUM vinto */ {sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);} break; - case 246: /* cmd ::= VACUUM nm vinto */ + case 248: /* cmd ::= VACUUM nm vinto */ {sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);} break; - case 249: /* cmd ::= PRAGMA nm dbnm */ + case 251: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 250: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 251: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 252: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 253: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 256: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 258: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; @@ -166040,50 +168207,50 @@ static YYACTIONTYPE yy_reduce( sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all); } break; - case 257: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 259: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 258: /* trigger_time ::= BEFORE|AFTER */ + case 260: /* trigger_time ::= BEFORE|AFTER */ { yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 259: /* trigger_time ::= INSTEAD OF */ + case 261: /* trigger_time ::= INSTEAD OF */ { yymsp[-1].minor.yy394 = TK_INSTEAD;} break; - case 260: /* trigger_time ::= */ + case 262: /* trigger_time ::= */ { yymsp[1].minor.yy394 = TK_BEFORE; } break; - case 261: /* trigger_event ::= DELETE|INSERT */ - case 262: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==262); + case 263: /* trigger_event ::= DELETE|INSERT */ + case 264: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==264); {yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;} break; - case 263: /* trigger_event ::= UPDATE OF idlist */ + case 265: /* trigger_event ::= UPDATE OF idlist */ {yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;} break; - case 264: /* when_clause ::= */ - case 283: /* key_opt ::= */ yytestcase(yyruleno==283); + case 266: /* when_clause ::= */ + case 285: /* key_opt ::= */ yytestcase(yyruleno==285); { yymsp[1].minor.yy528 = 0; } break; - case 265: /* when_clause ::= WHEN expr */ - case 284: /* key_opt ::= KEY expr */ yytestcase(yyruleno==284); + case 267: /* when_clause ::= WHEN expr */ + case 286: /* key_opt ::= KEY expr */ yytestcase(yyruleno==286); { yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; } break; - case 266: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 268: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { assert( yymsp[-2].minor.yy33!=0 ); yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33; yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 267: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 269: /* trigger_cmd_list ::= trigger_cmd SEMI */ { assert( yymsp[-1].minor.yy33!=0 ); yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 268: /* trnm ::= nm DOT nm */ + case 270: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -166091,39 +168258,39 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 269: /* tridxby ::= INDEXED BY nm */ + case 271: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 270: /* tridxby ::= NOT INDEXED */ + case 272: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 271: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + case 273: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ {yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);} yymsp[-8].minor.yy33 = yylhsminor.yy33; break; - case 272: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 274: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/ } yymsp[-7].minor.yy33 = yylhsminor.yy33; break; - case 273: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + case 275: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ {yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);} yymsp[-5].minor.yy33 = yylhsminor.yy33; break; - case 274: /* trigger_cmd ::= scanpt select scanpt */ + case 276: /* trigger_cmd ::= scanpt select scanpt */ {yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/} yymsp[-2].minor.yy33 = yylhsminor.yy33; break; - case 275: /* expr ::= RAISE LP IGNORE RP */ + case 277: /* expr ::= RAISE LP IGNORE RP */ { yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); if( yymsp[-3].minor.yy528 ){ @@ -166131,7 +168298,7 @@ static YYACTIONTYPE yy_reduce( } } break; - case 276: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 278: /* expr ::= RAISE LP raisetype COMMA nm RP */ { yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); if( yymsp[-5].minor.yy528 ) { @@ -166139,118 +168306,118 @@ static YYACTIONTYPE yy_reduce( } } break; - case 277: /* raisetype ::= ROLLBACK */ + case 279: /* raisetype ::= ROLLBACK */ {yymsp[0].minor.yy394 = OE_Rollback;} break; - case 279: /* raisetype ::= FAIL */ + case 281: /* raisetype ::= FAIL */ {yymsp[0].minor.yy394 = OE_Fail;} break; - case 280: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 282: /* cmd ::= DROP TRIGGER ifexists fullname */ { sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394); } break; - case 281: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 283: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528); } break; - case 282: /* cmd ::= DETACH database_kw_opt expr */ + case 284: /* cmd ::= DETACH database_kw_opt expr */ { sqlite3Detach(pParse, yymsp[0].minor.yy528); } break; - case 285: /* cmd ::= REINDEX */ + case 287: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 286: /* cmd ::= REINDEX nm dbnm */ + case 288: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 287: /* cmd ::= ANALYZE */ + case 289: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 288: /* cmd ::= ANALYZE nm dbnm */ + case 290: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 289: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 291: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0); } break; - case 290: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 292: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 291: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + case 293: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ { sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0); } break; - case 292: /* add_column_fullname ::= fullname */ + case 294: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131); } break; - case 293: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 295: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 294: /* cmd ::= create_vtab */ + case 296: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 295: /* cmd ::= create_vtab LP vtabarglist RP */ + case 297: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 296: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 298: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394); } break; - case 297: /* vtabarg ::= */ + case 299: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 298: /* vtabargtoken ::= ANY */ - case 299: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==299); - case 300: /* lp ::= LP */ yytestcase(yyruleno==300); + case 300: /* vtabargtoken ::= ANY */ + case 301: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==301); + case 302: /* lp ::= LP */ yytestcase(yyruleno==302); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 301: /* with ::= WITH wqlist */ - case 302: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==302); + case 303: /* with ::= WITH wqlist */ + case 304: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==304); { sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); } break; - case 303: /* wqas ::= AS */ + case 305: /* wqas ::= AS */ {yymsp[0].minor.yy516 = M10d_Any;} break; - case 304: /* wqas ::= AS MATERIALIZED */ + case 306: /* wqas ::= AS MATERIALIZED */ {yymsp[-1].minor.yy516 = M10d_Yes;} break; - case 305: /* wqas ::= AS NOT MATERIALIZED */ + case 307: /* wqas ::= AS NOT MATERIALIZED */ {yymsp[-2].minor.yy516 = M10d_No;} break; - case 306: /* wqitem ::= nm eidlist_opt wqas LP select RP */ + case 308: /* wqitem ::= nm eidlist_opt wqas LP select RP */ { yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/ } break; - case 307: /* wqlist ::= wqitem */ + case 309: /* wqlist ::= wqitem */ { yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/ } break; - case 308: /* wqlist ::= wqlist COMMA wqitem */ + case 310: /* wqlist ::= wqlist COMMA wqitem */ { yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385); } break; - case 309: /* windowdefn_list ::= windowdefn */ + case 311: /* windowdefn_list ::= windowdefn */ { yylhsminor.yy41 = yymsp[0].minor.yy41; } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 310: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 312: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { assert( yymsp[0].minor.yy41!=0 ); sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41); @@ -166259,7 +168426,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 311: /* windowdefn ::= nm AS LP window RP */ + case 313: /* windowdefn ::= nm AS LP window RP */ { if( ALWAYS(yymsp[-1].minor.yy41) ){ yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); @@ -166268,90 +168435,90 @@ static YYACTIONTYPE yy_reduce( } yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 312: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + case 314: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0); } break; - case 313: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + case 315: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0); } yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 314: /* window ::= ORDER BY sortlist frame_opt */ + case 316: /* window ::= ORDER BY sortlist frame_opt */ { yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0); } break; - case 315: /* window ::= nm ORDER BY sortlist frame_opt */ + case 317: /* window ::= nm ORDER BY sortlist frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); } yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 316: /* window ::= frame_opt */ - case 335: /* filter_over ::= over_clause */ yytestcase(yyruleno==335); + case 318: /* window ::= frame_opt */ + case 337: /* filter_over ::= over_clause */ yytestcase(yyruleno==337); { yylhsminor.yy41 = yymsp[0].minor.yy41; } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 317: /* window ::= nm frame_opt */ + case 319: /* window ::= nm frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0); } yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 318: /* frame_opt ::= */ + case 320: /* frame_opt ::= */ { yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; - case 319: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + case 321: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ { yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516); } yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 320: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + case 322: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ { yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516); } yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 322: /* frame_bound_s ::= frame_bound */ - case 324: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==324); + case 324: /* frame_bound_s ::= frame_bound */ + case 326: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==326); {yylhsminor.yy595 = yymsp[0].minor.yy595;} yymsp[0].minor.yy595 = yylhsminor.yy595; break; - case 323: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 325: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==325); - case 327: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==327); + case 325: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 327: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==327); + case 329: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==329); {yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;} yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 326: /* frame_bound ::= expr PRECEDING|FOLLOWING */ + case 328: /* frame_bound ::= expr PRECEDING|FOLLOWING */ {yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;} yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 328: /* frame_exclude_opt ::= */ + case 330: /* frame_exclude_opt ::= */ {yymsp[1].minor.yy516 = 0;} break; - case 329: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ + case 331: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ {yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;} break; - case 330: /* frame_exclude ::= NO OTHERS */ - case 331: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==331); + case 332: /* frame_exclude ::= NO OTHERS */ + case 333: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==333); {yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/} break; - case 332: /* frame_exclude ::= GROUP|TIES */ + case 334: /* frame_exclude ::= GROUP|TIES */ {yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/} break; - case 333: /* window_clause ::= WINDOW windowdefn_list */ + case 335: /* window_clause ::= WINDOW windowdefn_list */ { yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; } break; - case 334: /* filter_over ::= filter_clause over_clause */ + case 336: /* filter_over ::= filter_clause over_clause */ { if( yymsp[0].minor.yy41 ){ yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528; @@ -166362,7 +168529,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 336: /* filter_over ::= filter_clause */ + case 338: /* filter_over ::= filter_clause */ { yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( yylhsminor.yy41 ){ @@ -166374,13 +168541,13 @@ static YYACTIONTYPE yy_reduce( } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 337: /* over_clause ::= OVER LP window RP */ + case 339: /* over_clause ::= OVER LP window RP */ { yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41; assert( yymsp[-3].minor.yy41!=0 ); } break; - case 338: /* over_clause ::= OVER nm */ + case 340: /* over_clause ::= OVER nm */ { yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( yymsp[-1].minor.yy41 ){ @@ -166388,72 +168555,73 @@ static YYACTIONTYPE yy_reduce( } } break; - case 339: /* filter_clause ::= FILTER LP WHERE expr RP */ + case 341: /* filter_clause ::= FILTER LP WHERE expr RP */ { yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; } break; default: - /* (340) input ::= cmdlist */ yytestcase(yyruleno==340); - /* (341) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==341); - /* (342) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=342); - /* (343) ecmd ::= SEMI */ yytestcase(yyruleno==343); - /* (344) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==344); - /* (345) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=345); - /* (346) trans_opt ::= */ yytestcase(yyruleno==346); - /* (347) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==347); - /* (348) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==348); - /* (349) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==349); - /* (350) savepoint_opt ::= */ yytestcase(yyruleno==350); - /* (351) cmd ::= create_table create_table_args */ yytestcase(yyruleno==351); - /* (352) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=352); - /* (353) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==353); - /* (354) columnlist ::= columnname carglist */ yytestcase(yyruleno==354); - /* (355) nm ::= ID|INDEXED */ yytestcase(yyruleno==355); - /* (356) nm ::= STRING */ yytestcase(yyruleno==356); - /* (357) nm ::= JOIN_KW */ yytestcase(yyruleno==357); - /* (358) typetoken ::= typename */ yytestcase(yyruleno==358); - /* (359) typename ::= ID|STRING */ yytestcase(yyruleno==359); - /* (360) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=360); - /* (361) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=361); - /* (362) carglist ::= carglist ccons */ yytestcase(yyruleno==362); - /* (363) carglist ::= */ yytestcase(yyruleno==363); - /* (364) ccons ::= NULL onconf */ yytestcase(yyruleno==364); - /* (365) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==365); - /* (366) ccons ::= AS generated */ yytestcase(yyruleno==366); - /* (367) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==367); - /* (368) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==368); - /* (369) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=369); - /* (370) tconscomma ::= */ yytestcase(yyruleno==370); - /* (371) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=371); - /* (372) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=372); - /* (373) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=373); - /* (374) oneselect ::= values */ yytestcase(yyruleno==374); - /* (375) sclp ::= selcollist COMMA */ yytestcase(yyruleno==375); - /* (376) as ::= ID|STRING */ yytestcase(yyruleno==376); - /* (377) returning ::= */ yytestcase(yyruleno==377); - /* (378) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=378); - /* (379) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==379); - /* (380) exprlist ::= nexprlist */ yytestcase(yyruleno==380); - /* (381) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=381); - /* (382) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=382); - /* (383) nmnum ::= ON */ yytestcase(yyruleno==383); - /* (384) nmnum ::= DELETE */ yytestcase(yyruleno==384); - /* (385) nmnum ::= DEFAULT */ yytestcase(yyruleno==385); - /* (386) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==386); - /* (387) foreach_clause ::= */ yytestcase(yyruleno==387); - /* (388) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==388); - /* (389) trnm ::= nm */ yytestcase(yyruleno==389); - /* (390) tridxby ::= */ yytestcase(yyruleno==390); - /* (391) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==391); - /* (392) database_kw_opt ::= */ yytestcase(yyruleno==392); - /* (393) kwcolumn_opt ::= */ yytestcase(yyruleno==393); - /* (394) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==394); - /* (395) vtabarglist ::= vtabarg */ yytestcase(yyruleno==395); - /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==396); - /* (397) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==397); - /* (398) anylist ::= */ yytestcase(yyruleno==398); - /* (399) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==399); - /* (400) anylist ::= anylist ANY */ yytestcase(yyruleno==400); - /* (401) with ::= */ yytestcase(yyruleno==401); + /* (342) input ::= cmdlist */ yytestcase(yyruleno==342); + /* (343) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==343); + /* (344) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=344); + /* (345) ecmd ::= SEMI */ yytestcase(yyruleno==345); + /* (346) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==346); + /* (347) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=347); + /* (348) trans_opt ::= */ yytestcase(yyruleno==348); + /* (349) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==349); + /* (350) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==350); + /* (351) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==351); + /* (352) savepoint_opt ::= */ yytestcase(yyruleno==352); + /* (353) cmd ::= create_table create_table_args */ yytestcase(yyruleno==353); + /* (354) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=354); + /* (355) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==355); + /* (356) columnlist ::= columnname carglist */ yytestcase(yyruleno==356); + /* (357) nm ::= ID|INDEXED */ yytestcase(yyruleno==357); + /* (358) nm ::= STRING */ yytestcase(yyruleno==358); + /* (359) nm ::= JOIN_KW */ yytestcase(yyruleno==359); + /* (360) typetoken ::= typename */ yytestcase(yyruleno==360); + /* (361) typename ::= ID|STRING */ yytestcase(yyruleno==361); + /* (362) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=362); + /* (363) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=363); + /* (364) carglist ::= carglist ccons */ yytestcase(yyruleno==364); + /* (365) carglist ::= */ yytestcase(yyruleno==365); + /* (366) ccons ::= NULL onconf */ yytestcase(yyruleno==366); + /* (367) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==367); + /* (368) ccons ::= AS generated */ yytestcase(yyruleno==368); + /* (369) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==369); + /* (370) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==370); + /* (371) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=371); + /* (372) tconscomma ::= */ yytestcase(yyruleno==372); + /* (373) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=373); + /* (374) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=374); + /* (375) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=375); + /* (376) oneselect ::= values */ yytestcase(yyruleno==376); + /* (377) sclp ::= selcollist COMMA */ yytestcase(yyruleno==377); + /* (378) as ::= ID|STRING */ yytestcase(yyruleno==378); + /* (379) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=379); + /* (380) returning ::= */ yytestcase(yyruleno==380); + /* (381) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=381); + /* (382) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==382); + /* (383) exprlist ::= nexprlist */ yytestcase(yyruleno==383); + /* (384) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=384); + /* (385) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=385); + /* (386) nmnum ::= ON */ yytestcase(yyruleno==386); + /* (387) nmnum ::= DELETE */ yytestcase(yyruleno==387); + /* (388) nmnum ::= DEFAULT */ yytestcase(yyruleno==388); + /* (389) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==389); + /* (390) foreach_clause ::= */ yytestcase(yyruleno==390); + /* (391) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==391); + /* (392) trnm ::= nm */ yytestcase(yyruleno==392); + /* (393) tridxby ::= */ yytestcase(yyruleno==393); + /* (394) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==394); + /* (395) database_kw_opt ::= */ yytestcase(yyruleno==395); + /* (396) kwcolumn_opt ::= */ yytestcase(yyruleno==396); + /* (397) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==397); + /* (398) vtabarglist ::= vtabarg */ yytestcase(yyruleno==398); + /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==399); + /* (400) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==400); + /* (401) anylist ::= */ yytestcase(yyruleno==401); + /* (402) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==402); + /* (403) anylist ::= anylist ANY */ yytestcase(yyruleno==403); + /* (404) with ::= */ yytestcase(yyruleno==404); break; /********** End reduce actions ************************************************/ }; @@ -167900,6 +170068,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ mxSqlLen -= n; if( mxSqlLen<0 ){ pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; break; } #ifndef SQLITE_OMIT_WINDOWFUNC @@ -167996,7 +170165,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){ sqlite3DeleteTrigger(db, pParse->pNewTrigger); } - sqlite3DbFree(db, pParse->pVList); + if( pParse->pVList ) sqlite3DbFreeNN(db, pParse->pVList); db->pParse = pParentParse; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; @@ -172625,6 +174794,28 @@ SQLITE_API int sqlite3_test_control(int op, ...){ volatile int x = 0; assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); rc = x; +#if defined(SQLITE_DEBUG) + /* Invoke these debugging routines so that the compiler does not + ** issue "defined but not used" warnings. */ + if( x==9999 ){ + sqlite3ShowExpr(0); + sqlite3ShowExpr(0); + sqlite3ShowExprList(0); + sqlite3ShowIdList(0); + sqlite3ShowSrcList(0); + sqlite3ShowWith(0); + sqlite3ShowUpsert(0); + sqlite3ShowTriggerStep(0); + sqlite3ShowTriggerStepList(0); + sqlite3ShowTrigger(0); + sqlite3ShowTriggerList(0); +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3ShowWindow(0); + sqlite3ShowWinFunc(0); +#endif + sqlite3ShowSelect(0); + } +#endif break; } @@ -172886,8 +175077,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** ** "ptr" is a pointer to a u32. ** - ** op==0 Store the current sqlite3SelectTrace in *ptr - ** op==1 Set sqlite3SelectTrace to the value *ptr + ** op==0 Store the current sqlite3TreeTrace in *ptr + ** op==1 Set sqlite3TreeTrace to the value *ptr ** op==3 Store the current sqlite3WhereTrace in *ptr ** op==3 Set sqlite3WhereTrace to the value *ptr */ @@ -172895,10 +175086,10 @@ SQLITE_API int sqlite3_test_control(int op, ...){ int opTrace = va_arg(ap, int); u32 *ptr = va_arg(ap, u32*); switch( opTrace ){ - case 0: *ptr = sqlite3SelectTrace; break; - case 1: sqlite3SelectTrace = *ptr; break; - case 2: *ptr = sqlite3WhereTrace; break; - case 3: sqlite3WhereTrace = *ptr; break; + case 0: *ptr = sqlite3TreeTrace; break; + case 1: sqlite3TreeTrace = *ptr; break; + case 2: *ptr = sqlite3WhereTrace; break; + case 3: sqlite3WhereTrace = *ptr; break; } break; } @@ -172915,10 +175106,12 @@ SQLITE_API int sqlite3_test_control(int op, ...){ case SQLITE_TESTCTRL_LOGEST: { double rIn = va_arg(ap, double); LogEst rLogEst = sqlite3LogEstFromDouble(rIn); - u64 iInt = sqlite3LogEstToInt(rLogEst); - va_arg(ap, int*)[0] = rLogEst; - va_arg(ap, u64*)[0] = iInt; - va_arg(ap, int*)[0] = sqlite3LogEst(iInt); + int *pI1 = va_arg(ap,int*); + u64 *pU64 = va_arg(ap,u64*); + int *pI2 = va_arg(ap,int*); + *pI1 = rLogEst; + *pU64 = sqlite3LogEstToInt(rLogEst); + *pI2 = sqlite3LogEst(*pU64); break; } @@ -173133,6 +175326,24 @@ SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ return iDb<0 ? 0 : db->aDb[iDb].pBt; } +/* +** Return the name of the N-th database schema. Return NULL if N is out +** of range. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( N<0 || N>=db->nDb ){ + return 0; + }else{ + return db->aDb[N].zDbSName; + } +} + /* ** Return the filename of the database associated with a database ** connection. @@ -174820,7 +177031,7 @@ struct Fts3MultiSegReader { int nAdvance; /* How many seg-readers to advance */ Fts3SegFilter *pFilter; /* Pointer to filter object */ char *aBuffer; /* Buffer to merge doclists in */ - int nBuffer; /* Allocated size of aBuffer[] in bytes */ + i64 nBuffer; /* Allocated size of aBuffer[] in bytes */ int iColFilter; /* If >=0, filter for this column */ int bRestart; @@ -177516,7 +179727,7 @@ static int fts3TermSelectMerge( ** ** Similar padding is added in the fts3DoclistOrMerge() function. */ - pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1); pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); @@ -178936,8 +181147,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ char *aPoslist = 0; /* Position list for deferred tokens */ int nPoslist = 0; /* Number of bytes in aPoslist */ int iPrev = -1; /* Token number of previous deferred token */ - - assert( pPhrase->doclist.bFreeList==0 ); + char *aFree = (pPhrase->doclist.bFreeList ? pPhrase->doclist.pList : 0); for(iToken=0; iTokennToken; iToken++){ Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; @@ -178951,6 +181161,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ if( pList==0 ){ sqlite3_free(aPoslist); + sqlite3_free(aFree); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; return SQLITE_OK; @@ -178971,6 +181182,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ nPoslist = (int)(aOut - aPoslist); if( nPoslist==0 ){ sqlite3_free(aPoslist); + sqlite3_free(aFree); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; return SQLITE_OK; @@ -179003,13 +181215,14 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ nDistance = iPrev - nMaxUndeferred; } - aOut = (char *)sqlite3_malloc(nPoslist+8); + aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING); if( !aOut ){ sqlite3_free(aPoslist); return SQLITE_NOMEM; } pPhrase->doclist.pList = aOut; + assert( p1 && p2 ); if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ pPhrase->doclist.bFreeList = 1; pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); @@ -179022,6 +181235,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ } } + if( pPhrase->doclist.pList!=aFree ) sqlite3_free(aFree); return SQLITE_OK; } #endif /* SQLITE_DISABLE_FTS4_DEFERRED */ @@ -179370,7 +181584,7 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); + char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); @@ -180196,11 +182410,10 @@ static int fts3EvalTestExpr( default: { #ifndef SQLITE_DISABLE_FTS4_DEFERRED - if( pCsr->pDeferred - && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred) - ){ + if( pCsr->pDeferred && (pExpr->bDeferred || ( + pExpr->iDocid==pCsr->iPrevId && pExpr->pPhrase->doclist.pList + ))){ Fts3Phrase *pPhrase = pExpr->pPhrase; - assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 ); if( pExpr->bDeferred ){ fts3EvalInvalidatePoslist(pPhrase); } @@ -183607,7 +185820,7 @@ static int porterNext( if( n>c->nAllocated ){ char *pNew; c->nAllocated = n+20; - pNew = sqlite3_realloc(c->zToken, c->nAllocated); + pNew = sqlite3_realloc64(c->zToken, c->nAllocated); if( !pNew ) return SQLITE_NOMEM; c->zToken = pNew; } @@ -184359,7 +186572,7 @@ static int simpleNext( if( n>c->nTokenAllocated ){ char *pNew; c->nTokenAllocated = n+20; - pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated); if( !pNew ) return SQLITE_NOMEM; c->pToken = pNew; } @@ -185521,7 +187734,7 @@ static int fts3PendingListAppendVarint( /* Allocate or grow the PendingList as required. */ if( !p ){ - p = sqlite3_malloc(sizeof(*p) + 100); + p = sqlite3_malloc64(sizeof(*p) + 100); if( !p ){ return SQLITE_NOMEM; } @@ -185530,14 +187743,14 @@ static int fts3PendingListAppendVarint( p->nData = 0; } else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ - int nNew = p->nSpace * 2; - p = sqlite3_realloc(p, sizeof(*p) + nNew); + i64 nNew = p->nSpace * 2; + p = sqlite3_realloc64(p, sizeof(*p) + nNew); if( !p ){ sqlite3_free(*pp); *pp = 0; return SQLITE_NOMEM; } - p->nSpace = nNew; + p->nSpace = (int)nNew; p->aData = (char *)&p[1]; } @@ -186094,7 +188307,7 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock( int nByte = sqlite3_blob_bytes(p->pSegments); *pnBlob = nByte; if( paBlob ){ - char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); if( !aByte ){ rc = SQLITE_NOMEM; }else{ @@ -186211,7 +188424,7 @@ static int fts3SegReaderNext( int nTerm = fts3HashKeysize(pElem); if( (nTerm+1)>pReader->nTermAlloc ){ sqlite3_free(pReader->zTerm); - pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); + pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2); if( !pReader->zTerm ) return SQLITE_NOMEM; pReader->nTermAlloc = (nTerm+1)*2; } @@ -186219,7 +188432,7 @@ static int fts3SegReaderNext( pReader->zTerm[nTerm] = '\0'; pReader->nTerm = nTerm; - aCopy = (char*)sqlite3_malloc(nCopy); + aCopy = (char*)sqlite3_malloc64(nCopy); if( !aCopy ) return SQLITE_NOMEM; memcpy(aCopy, pList->aData, nCopy); pReader->nNode = pReader->nDoclist = nCopy; @@ -186506,7 +188719,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( nExtra = nRoot + FTS3_NODE_PADDING; } - pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); if( !pReader ){ return SQLITE_NOMEM; } @@ -186598,7 +188811,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( if( nElem==nAlloc ){ Fts3HashElem **aElem2; nAlloc += 16; - aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem2 = (Fts3HashElem **)sqlite3_realloc64( aElem, nAlloc*sizeof(Fts3HashElem *) ); if( !aElem2 ){ @@ -186932,7 +189145,7 @@ static int fts3NodeAddTerm( ** this is not expected to be a serious problem. */ assert( pTree->aData==(char *)&pTree[1] ); - pTree->aData = (char *)sqlite3_malloc(nReq); + pTree->aData = (char *)sqlite3_malloc64(nReq); if( !pTree->aData ){ return SQLITE_NOMEM; } @@ -186950,7 +189163,7 @@ static int fts3NodeAddTerm( if( isCopyTerm ){ if( pTree->nMalloczMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -186976,7 +189189,7 @@ static int fts3NodeAddTerm( ** now. Instead, the term is inserted into the parent of pTree. If pTree ** has no parent, one is created here. */ - pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize); if( !pNew ){ return SQLITE_NOMEM; } @@ -187114,7 +189327,7 @@ static int fts3SegWriterAdd( ){ int nPrefix; /* Size of term prefix in bytes */ int nSuffix; /* Size of term suffix in bytes */ - int nReq; /* Number of bytes required on leaf page */ + i64 nReq; /* Number of bytes required on leaf page */ int nData; SegmentWriter *pWriter = *ppWriter; @@ -187123,13 +189336,13 @@ static int fts3SegWriterAdd( sqlite3_stmt *pStmt; /* Allocate the SegmentWriter structure */ - pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter)); if( !pWriter ) return SQLITE_NOMEM; memset(pWriter, 0, sizeof(SegmentWriter)); *ppWriter = pWriter; /* Allocate a buffer in which to accumulate data */ - pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + pWriter->aData = (char *)sqlite3_malloc64(p->nNodeSize); if( !pWriter->aData ) return SQLITE_NOMEM; pWriter->nSize = p->nNodeSize; @@ -187204,7 +189417,7 @@ static int fts3SegWriterAdd( ** the buffer to make it large enough. */ if( nReq>pWriter->nSize ){ - char *aNew = sqlite3_realloc(pWriter->aData, nReq); + char *aNew = sqlite3_realloc64(pWriter->aData, nReq); if( !aNew ) return SQLITE_NOMEM; pWriter->aData = aNew; pWriter->nSize = nReq; @@ -187229,7 +189442,7 @@ static int fts3SegWriterAdd( */ if( isCopyTerm ){ if( nTerm>pWriter->nMalloc ){ - char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -187537,12 +189750,12 @@ static void fts3ColumnFilter( static int fts3MsrBufferData( Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ char *pList, - int nList + i64 nList ){ if( nList>pMsr->nBuffer ){ char *pNew; pMsr->nBuffer = nList*2; - pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); if( !pNew ) return SQLITE_NOMEM; pMsr->aBuffer = pNew; } @@ -187598,7 +189811,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pMsr, pList, nList+1); + rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1); if( rc!=SQLITE_OK ) return rc; assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); pList = pMsr->aBuffer; @@ -187735,11 +189948,11 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ return SQLITE_OK; } -static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){ +static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ if( nReq>pCsr->nBuffer ){ char *aNew; pCsr->nBuffer = nReq*2; - aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer); if( !aNew ){ return SQLITE_NOMEM; } @@ -187830,7 +190043,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( ){ pCsr->nDoclist = apSegment[0]->nDoclist; if( fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, + (i64)pCsr->nDoclist); pCsr->aDoclist = pCsr->aBuffer; }else{ pCsr->aDoclist = apSegment[0]->aDoclist; @@ -187883,7 +190097,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); - rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, + (i64)nByte+nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; if( isFirst ){ @@ -187909,7 +190124,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( fts3SegReaderSort(apSegment, nMerge, j, xCmp); } if( nDoclist>0 ){ - rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); pCsr->aDoclist = pCsr->aBuffer; @@ -188622,7 +190837,7 @@ struct NodeReader { static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ int nAlloc = nMin; - char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc); if( a ){ pBlob->nAlloc = nAlloc; pBlob->a = a; @@ -188771,6 +190986,8 @@ static int fts3IncrmergePush( pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix); } pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix); + assert( nPrefix+nSuffix<=nTerm ); + assert( nPrefix>=0 ); memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix); pBlk->n += nSuffix; @@ -188893,6 +191110,7 @@ static int fts3IncrmergeAppend( pLeaf = &pWriter->aNodeWriter[0]; nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; nSpace = sqlite3Fts3VarintLen(nPrefix); nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; @@ -189416,7 +191634,7 @@ static int fts3RepackSegdirLevel( if( nIdx>=nAlloc ){ int *aNew; nAlloc += 16; - aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int)); if( !aNew ){ rc = SQLITE_NOMEM; break; @@ -189790,7 +192008,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* Allocate space for the cursor, filter and writer objects */ const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); - pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + pWriter = (IncrmergeWriter *)sqlite3_malloc64(nAlloc); if( !pWriter ) return SQLITE_NOMEM; pFilter = (Fts3SegFilter *)&pWriter[1]; pCsr = (Fts3MultiSegReader *)&pFilter[1]; @@ -190426,7 +192644,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( return SQLITE_OK; } - pRet = (char *)sqlite3_malloc(p->pList->nData); + pRet = (char *)sqlite3_malloc64(p->pList->nData); if( !pRet ) return SQLITE_NOMEM; nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); @@ -190446,7 +192664,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( int iCol /* Column that token must appear in (or -1) */ ){ Fts3DeferredToken *pDeferred; - pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + pDeferred = sqlite3_malloc64(sizeof(*pDeferred)); if( !pDeferred ){ return SQLITE_NOMEM; } @@ -194850,7 +197068,7 @@ static JsonNode *jsonMergePatch( if( pPatch->eType!=JSON_OBJECT ){ return pPatch; } - assert( iTarget>=0 && iTargetnNode ); + assert( iTargetnNode ); pTarget = &pParse->aNode[iTarget]; assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); if( pTarget->eType!=JSON_OBJECT ){ @@ -202025,7 +204243,7 @@ static int geopolyUpdate( sqlite3_free(p); nChange = 1; } - for(jj=1; jjnAux; jj++){ + for(jj=1; jjorderByConsumed = 1; } - sqlite3VtabWriteAll(pIdxInfo); + sqlite3VtabUsesAllSchemas(pIdxInfo); return SQLITE_OK; } @@ -210346,7 +212565,7 @@ static int dbpageUpdate( goto update_fail; } pBt = pTab->db->aDb[iDb].pBt; - if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){ + if( pgno<1 || pBt==0 || pgno>sqlite3BtreeLastPage(pBt) ){ zErr = "bad page number"; goto update_fail; } @@ -222896,6 +225115,9 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( }else{ if( pRet->nPhrase>0 ){ Fts5ExprPhrase *pLast = pRet->apPhrase[pRet->nPhrase-1]; + assert( pParse!=0 ); + assert( pParse->apPhrase!=0 ); + assert( pParse->nPhrase>=2 ); assert( pLast==pParse->apPhrase[pParse->nPhrase-2] ); if( pPhrase->nTerm==0 ){ fts5ExprPhraseFree(pPhrase); @@ -225195,7 +227417,7 @@ struct Fts5Index { sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */ sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */ sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ - sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ + sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */ sqlite3_stmt *pIdxSelect; int nRead; /* Total number of blocks read */ @@ -234512,7 +236734,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309", -1, SQLITE_TRANSIENT); } /* @@ -239183,6 +241405,16 @@ SQLITE_EXTENSION_INIT1 #ifndef SQLITE_OMIT_VIRTUALTABLE + +#define STMT_NUM_INTEGER_COLUMN 10 +typedef struct StmtRow StmtRow; +struct StmtRow { + sqlite3_int64 iRowid; /* Rowid value */ + char *zSql; /* column "sql" */ + int aCol[STMT_NUM_INTEGER_COLUMN+1]; /* all other column values */ + StmtRow *pNext; /* Next row to return */ +}; + /* stmt_vtab is a subclass of sqlite3_vtab which will ** serve as the underlying representation of a stmt virtual table */ @@ -239200,8 +241432,7 @@ typedef struct stmt_cursor stmt_cursor; struct stmt_cursor { sqlite3_vtab_cursor base; /* Base class - must be first */ sqlite3 *db; /* Database connection for this cursor */ - sqlite3_stmt *pStmt; /* Statement cursor is currently pointing at */ - sqlite3_int64 iRowid; /* The rowid */ + StmtRow *pRow; /* Current row */ }; /* @@ -239245,7 +241476,7 @@ static int stmtConnect( "CREATE TABLE x(sql,ncol,ro,busy,nscan,nsort,naidx,nstep," "reprep,run,mem)"); if( rc==SQLITE_OK ){ - pNew = sqlite3_malloc( sizeof(*pNew) ); + pNew = sqlite3_malloc64( sizeof(*pNew) ); *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); @@ -239267,7 +241498,7 @@ static int stmtDisconnect(sqlite3_vtab *pVtab){ */ static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ stmt_cursor *pCur; - pCur = sqlite3_malloc( sizeof(*pCur) ); + pCur = sqlite3_malloc64( sizeof(*pCur) ); if( pCur==0 ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); pCur->db = ((stmt_vtab*)p)->db; @@ -239275,10 +241506,21 @@ static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ return SQLITE_OK; } +static void stmtCsrReset(stmt_cursor *pCur){ + StmtRow *pRow = 0; + StmtRow *pNext = 0; + for(pRow=pCur->pRow; pRow; pRow=pNext){ + pNext = pRow->pNext; + sqlite3_free(pRow); + } + pCur->pRow = 0; +} + /* ** Destructor for a stmt_cursor. */ static int stmtClose(sqlite3_vtab_cursor *cur){ + stmtCsrReset((stmt_cursor*)cur); sqlite3_free(cur); return SQLITE_OK; } @@ -239289,8 +241531,9 @@ static int stmtClose(sqlite3_vtab_cursor *cur){ */ static int stmtNext(sqlite3_vtab_cursor *cur){ stmt_cursor *pCur = (stmt_cursor*)cur; - pCur->iRowid++; - pCur->pStmt = sqlite3_next_stmt(pCur->db, pCur->pStmt); + StmtRow *pNext = pCur->pRow->pNext; + sqlite3_free(pCur->pRow); + pCur->pRow = pNext; return SQLITE_OK; } @@ -239304,39 +241547,11 @@ static int stmtColumn( int i /* Which column to return */ ){ stmt_cursor *pCur = (stmt_cursor*)cur; - switch( i ){ - case STMT_COLUMN_SQL: { - sqlite3_result_text(ctx, sqlite3_sql(pCur->pStmt), -1, SQLITE_TRANSIENT); - break; - } - case STMT_COLUMN_NCOL: { - sqlite3_result_int(ctx, sqlite3_column_count(pCur->pStmt)); - break; - } - case STMT_COLUMN_RO: { - sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt)); - break; - } - case STMT_COLUMN_BUSY: { - sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); - break; - } - default: { - assert( i==STMT_COLUMN_MEM ); - i = SQLITE_STMTSTATUS_MEMUSED + - STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; - /* Fall thru */ - } - case STMT_COLUMN_NSCAN: - case STMT_COLUMN_NSORT: - case STMT_COLUMN_NAIDX: - case STMT_COLUMN_NSTEP: - case STMT_COLUMN_REPREP: - case STMT_COLUMN_RUN: { - sqlite3_result_int(ctx, sqlite3_stmt_status(pCur->pStmt, - i-STMT_COLUMN_NSCAN+SQLITE_STMTSTATUS_FULLSCAN_STEP, 0)); - break; - } + StmtRow *pRow = pCur->pRow; + if( i==STMT_COLUMN_SQL ){ + sqlite3_result_text(ctx, pRow->zSql, -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_int(ctx, pRow->aCol[i]); } return SQLITE_OK; } @@ -239347,7 +241562,7 @@ static int stmtColumn( */ static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ stmt_cursor *pCur = (stmt_cursor*)cur; - *pRowid = pCur->iRowid; + *pRowid = pCur->pRow->iRowid; return SQLITE_OK; } @@ -239357,7 +241572,7 @@ static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ */ static int stmtEof(sqlite3_vtab_cursor *cur){ stmt_cursor *pCur = (stmt_cursor*)cur; - return pCur->pStmt==0; + return pCur->pRow==0; } /* @@ -239372,9 +241587,53 @@ static int stmtFilter( int argc, sqlite3_value **argv ){ stmt_cursor *pCur = (stmt_cursor *)pVtabCursor; - pCur->pStmt = 0; - pCur->iRowid = 0; - return stmtNext(pVtabCursor); + sqlite3_stmt *p = 0; + sqlite3_int64 iRowid = 1; + StmtRow **ppRow = 0; + + stmtCsrReset(pCur); + ppRow = &pCur->pRow; + for(p=sqlite3_next_stmt(pCur->db, 0); p; p=sqlite3_next_stmt(pCur->db, p)){ + const char *zSql = sqlite3_sql(p); + sqlite3_int64 nSql = zSql ? strlen(zSql)+1 : 0; + StmtRow *pNew = (StmtRow*)sqlite3_malloc64(sizeof(StmtRow) + nSql); + + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(StmtRow)); + if( zSql ){ + pNew->zSql = (char*)&pNew[1]; + memcpy(pNew->zSql, zSql, nSql); + } + pNew->aCol[STMT_COLUMN_NCOL] = sqlite3_column_count(p); + pNew->aCol[STMT_COLUMN_RO] = sqlite3_stmt_readonly(p); + pNew->aCol[STMT_COLUMN_BUSY] = sqlite3_stmt_busy(p); + pNew->aCol[STMT_COLUMN_NSCAN] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_FULLSCAN_STEP, 0 + ); + pNew->aCol[STMT_COLUMN_NSORT] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_SORT, 0 + ); + pNew->aCol[STMT_COLUMN_NAIDX] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_AUTOINDEX, 0 + ); + pNew->aCol[STMT_COLUMN_NSTEP] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_VM_STEP, 0 + ); + pNew->aCol[STMT_COLUMN_REPREP] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_REPREPARE, 0 + ); + pNew->aCol[STMT_COLUMN_RUN] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_RUN, 0 + ); + pNew->aCol[STMT_COLUMN_MEM] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_MEMUSED, 0 + ); + pNew->iRowid = iRowid++; + *ppRow = pNew; + ppRow = &pNew->pNext; + } + + return SQLITE_OK; } /* diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h index 1c267a40a..ab00ef50c 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h @@ -147,9 +147,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.38.5" -#define SQLITE_VERSION_NUMBER 3038005 -#define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe" +#define SQLITE_VERSION "3.39.4" +#define SQLITE_VERSION_NUMBER 3039004 +#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -5594,7 +5594,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** object D and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a -** memory allocation fails. +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. ** ** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object ** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer @@ -6276,6 +6277,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); +/* +** CAPI3REF: Return The Schema Name For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name +** for the N-th database on database connection D, or a NULL pointer of N is +** out of range. An N value of 0 means the main database file. An N of 1 is +** the "temp" schema. Larger values of N correspond to various ATTACH-ed +** databases. +** +** Space to hold the string that is returned by sqlite3_db_name() is managed +** by SQLite itself. The string might be deallocated by any operation that +** changes the schema, including [ATTACH] or [DETACH] or calls to +** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that +** occur on a different thread. Applications that need to +** remember the string long-term should make their own copy. Applications that +** are accessing the same database connection simultaneously on multiple +** threads should mutex-protect calls to this API and should make their own +** private copy of the result prior to releasing the mutex. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); + /* ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 @@ -9555,8 +9578,8 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** of a [virtual table] implementation. The result of calling this ** interface from outside of xBestIndex() is undefined and probably harmful. ** -** ^The sqlite3_vtab_distinct() interface returns an integer that is -** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and +** 3. The integer returned by sqlite3_vtab_distinct() ** gives the virtual table additional information about how the query ** planner wants the output to be ordered. As long as the virtual table ** can meet the ordering requirements of the query planner, it may set @@ -9588,6 +9611,13 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** that have the same value for all columns identified by "aOrderBy". ** ^However omitting the extra rows is optional. ** This mode is used for a DISTINCT query. +**

  • +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means +** that the query planner needs only distinct rows but it does need the +** rows to be sorted.)^ ^The virtual table implementation is free to omit +** rows that are identical in all aOrderBy columns, if it wants to, but +** it is not required to omit any rows. This mode is used for queries +** that have both DISTINCT and ORDER BY clauses. ** ** ** ^For the purposes of comparing virtual table output values to see if the diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3.go b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3.go index e037857db..9c0f4d891 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3.go +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3.go @@ -494,10 +494,12 @@ func (ai *aggInfo) Done(ctx *C.sqlite3_context) { // Commit transaction. func (tx *SQLiteTx) Commit() error { _, err := tx.c.exec(context.Background(), "COMMIT", nil) - if err != nil && err.(Error).Code == C.SQLITE_BUSY { - // sqlite3 will leave the transaction open in this scenario. + if err != nil { + // sqlite3 may leave the transaction open in this scenario. // However, database/sql considers the transaction complete once we // return from Commit() - we must clean up to honour its semantics. + // We don't know if the ROLLBACK is strictly necessary, but according + // to sqlite's docs, there is no harm in calling ROLLBACK unnecessarily. tx.c.exec(context.Background(), "ROLLBACK", nil) } return err diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_math_functions.go b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_math_functions.go new file mode 100644 index 000000000..7cd68d3f5 --- /dev/null +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_math_functions.go @@ -0,0 +1,14 @@ +// Copyright (C) 2022 Yasuhiro Matsumoto . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build sqlite_math_functions + +package sqlite3 + +/* +#cgo CFLAGS: -DSQLITE_ENABLE_MATH_FUNCTIONS +#cgo LDFLAGS: -lm +*/ +import "C" diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_os_trace.go b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_os_trace.go new file mode 100644 index 000000000..9a30566b3 --- /dev/null +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_os_trace.go @@ -0,0 +1,15 @@ +// Copyright (C) 2022 Yasuhiro Matsumoto . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +//go:build sqlite_os_trace +// +build sqlite_os_trace + +package sqlite3 + +/* +#cgo CFLAGS: -DSQLITE_FORCE_OS_TRACE=1 +#cgo CFLAGS: -DSQLITE_DEBUG_OS_TRACE=1 +*/ +import "C" diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go index 9df196145..81aa2abde 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go @@ -12,7 +12,6 @@ package sqlite3 #cgo CFLAGS: -fno-stack-check #cgo CFLAGS: -fno-stack-protector #cgo CFLAGS: -mno-stack-arg-probe -#cgo LDFLAGS: -lmingwex -lmingw32 #cgo windows,386 CFLAGS: -D_USE_32BIT_TIME_T */ import "C" diff --git a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h index 301cba6cc..940f162de 100644 --- a/tools/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h +++ b/tools/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h @@ -356,6 +356,12 @@ struct sqlite3_api_routines { int (*vtab_in)(sqlite3_index_info*,int,int); int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); + /* Version 3.39.0 and later */ + int (*deserialize)(sqlite3*,const char*,unsigned char*, + sqlite3_int64,sqlite3_int64,unsigned); + unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*, + unsigned int); + const char *(*db_name)(sqlite3*,int); }; /* @@ -674,6 +680,12 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_vtab_in sqlite3_api->vtab_in #define sqlite3_vtab_in_first sqlite3_api->vtab_in_first #define sqlite3_vtab_in_next sqlite3_api->vtab_in_next +/* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize +#endif +#define sqlite3_db_name sqlite3_api->db_name #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mounted_linux.go b/tools/vendor/github.com/moby/sys/mountinfo/mounted_linux.go index 5c9e3e30e..e78e72619 100644 --- a/tools/vendor/github.com/moby/sys/mountinfo/mounted_linux.go +++ b/tools/vendor/github.com/moby/sys/mountinfo/mounted_linux.go @@ -7,6 +7,34 @@ import ( "golang.org/x/sys/unix" ) +// MountedFast is a method of detecting a mount point without reading +// mountinfo from procfs. A caller can only trust the result if no error +// and sure == true are returned. Otherwise, other methods (e.g. parsing +// /proc/mounts) have to be used. If unsure, use Mounted instead (which +// uses MountedFast, but falls back to parsing mountinfo if needed). +// +// If a non-existent path is specified, an appropriate error is returned. +// In case the caller is not interested in this particular error, it should +// be handled separately using e.g. errors.Is(err, fs.ErrNotExist). +// +// This function is only available on Linux. When available (since kernel +// v5.6), openat2(2) syscall is used to reliably detect all mounts. Otherwise, +// the implementation falls back to using stat(2), which can reliably detect +// normal (but not bind) mounts. +func MountedFast(path string) (mounted, sure bool, err error) { + // Root is always mounted. + if path == string(os.PathSeparator) { + return true, true, nil + } + + path, err = normalizePath(path) + if err != nil { + return false, false, err + } + mounted, sure, err = mountedFast(path) + return +} + // mountedByOpenat2 is a method of detecting a mount that works for all kinds // of mounts (incl. bind mounts), but requires a recent (v5.6+) linux kernel. func mountedByOpenat2(path string) (bool, error) { @@ -34,24 +62,40 @@ func mountedByOpenat2(path string) (bool, error) { return false, &os.PathError{Op: "openat2", Path: path, Err: err} } -func mounted(path string) (bool, error) { - path, err := normalizePath(path) - if err != nil { - return false, err +// mountedFast is similar to MountedFast, except it expects a normalized path. +func mountedFast(path string) (mounted, sure bool, err error) { + // Root is always mounted. + if path == string(os.PathSeparator) { + return true, true, nil } + // Try a fast path, using openat2() with RESOLVE_NO_XDEV. - mounted, err := mountedByOpenat2(path) + mounted, err = mountedByOpenat2(path) if err == nil { - return mounted, nil + return mounted, true, nil } + // Another fast path: compare st.st_dev fields. mounted, err = mountedByStat(path) // This does not work for bind mounts, so false negative // is possible, therefore only trust if return is true. if mounted && err == nil { + return true, true, nil + } + + return +} + +func mounted(path string) (bool, error) { + path, err := normalizePath(path) + if err != nil { + return false, err + } + mounted, sure, err := mountedFast(path) + if sure && err == nil { return mounted, nil } - // Fallback to parsing mountinfo + // Fallback to parsing mountinfo. return mountedByMountinfo(path) } diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mounted_unix.go b/tools/vendor/github.com/moby/sys/mountinfo/mounted_unix.go index 45ddad236..c7b7678f9 100644 --- a/tools/vendor/github.com/moby/sys/mountinfo/mounted_unix.go +++ b/tools/vendor/github.com/moby/sys/mountinfo/mounted_unix.go @@ -1,10 +1,9 @@ -//go:build linux || (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo) -// +build linux freebsd,cgo openbsd,cgo darwin,cgo +//go:build linux || freebsd || openbsd || darwin +// +build linux freebsd openbsd darwin package mountinfo import ( - "fmt" "os" "path/filepath" @@ -33,13 +32,13 @@ func mountedByStat(path string) (bool, error) { func normalizePath(path string) (realPath string, err error) { if realPath, err = filepath.Abs(path); err != nil { - return "", fmt.Errorf("unable to get absolute path for %q: %w", path, err) + return "", err } if realPath, err = filepath.EvalSymlinks(realPath); err != nil { - return "", fmt.Errorf("failed to canonicalise path for %q: %w", path, err) + return "", err } if _, err := os.Stat(realPath); err != nil { - return "", fmt.Errorf("failed to stat target of %q: %w", path, err) + return "", err } return realPath, nil } diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo.go b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo.go index 9867a66dd..574aeb876 100644 --- a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo.go +++ b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo.go @@ -13,9 +13,9 @@ func GetMounts(f FilterFunc) ([]*Info, error) { // Mounted determines if a specified path is a mount point. In case of any // error, false (and an error) is returned. // -// The non-existent path returns an error. If a caller is not interested -// in this particular error, it should handle it separately using e.g. -// errors.Is(err, os.ErrNotExist). +// If a non-existent path is specified, an appropriate error is returned. +// In case the caller is not interested in this particular error, it should +// be handled separately using e.g. errors.Is(err, fs.ErrNotExist). func Mounted(path string) (bool, error) { // root is always mounted if path == string(os.PathSeparator) { diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go index d5513a26d..8420f58c7 100644 --- a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go +++ b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go @@ -1,53 +1,37 @@ -//go:build (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo) -// +build freebsd,cgo openbsd,cgo darwin,cgo +//go:build freebsd || openbsd || darwin +// +build freebsd openbsd darwin package mountinfo -/* -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "reflect" - "unsafe" -) +import "golang.org/x/sys/unix" // parseMountTable returns information about mounted filesystems func parseMountTable(filter FilterFunc) ([]*Info, error) { - var rawEntries *C.struct_statfs - - count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) - if count == 0 { - return nil, fmt.Errorf("failed to call getmntinfo") + count, err := unix.Getfsstat(nil, unix.MNT_WAIT) + if err != nil { + return nil, err } - var entries []C.struct_statfs - header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) - header.Cap = count - header.Len = count - header.Data = uintptr(unsafe.Pointer(rawEntries)) + entries := make([]unix.Statfs_t, count) + _, err = unix.Getfsstat(entries, unix.MNT_WAIT) + if err != nil { + return nil, err + } var out []*Info for _, entry := range entries { - var mountinfo Info var skip, stop bool - mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) - mountinfo.FSType = C.GoString(&entry.f_fstypename[0]) - mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) + mountinfo := getMountinfo(&entry) if filter != nil { // filter out entries we're not interested in - skip, stop = filter(&mountinfo) + skip, stop = filter(mountinfo) if skip { continue } } - out = append(out, &mountinfo) + out = append(out, mountinfo) if stop { break } diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsdlike.go b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsdlike.go new file mode 100644 index 000000000..ecaaa7a9c --- /dev/null +++ b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsdlike.go @@ -0,0 +1,14 @@ +//go:build freebsd || darwin +// +build freebsd darwin + +package mountinfo + +import "golang.org/x/sys/unix" + +func getMountinfo(entry *unix.Statfs_t) *Info { + return &Info{ + Mountpoint: unix.ByteSliceToString(entry.Mntonname[:]), + FSType: unix.ByteSliceToString(entry.Fstypename[:]), + Source: unix.ByteSliceToString(entry.Mntfromname[:]), + } +} diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_openbsd.go b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_openbsd.go new file mode 100644 index 000000000..f682c2d3b --- /dev/null +++ b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_openbsd.go @@ -0,0 +1,11 @@ +package mountinfo + +import "golang.org/x/sys/unix" + +func getMountinfo(entry *unix.Statfs_t) *Info { + return &Info{ + Mountpoint: unix.ByteSliceToString(entry.F_mntonname[:]), + FSType: unix.ByteSliceToString(entry.F_fstypename[:]), + Source: unix.ByteSliceToString(entry.F_mntfromname[:]), + } +} diff --git a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go index 95769a76d..c2e64bc81 100644 --- a/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go +++ b/tools/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go @@ -1,5 +1,5 @@ -//go:build (!windows && !linux && !freebsd && !openbsd && !darwin) || (freebsd && !cgo) || (openbsd && !cgo) || (darwin && !cgo) -// +build !windows,!linux,!freebsd,!openbsd,!darwin freebsd,!cgo openbsd,!cgo darwin,!cgo +//go:build !windows && !linux && !freebsd && !openbsd && !darwin +// +build !windows,!linux,!freebsd,!openbsd,!darwin package mountinfo diff --git a/tools/vendor/go.etcd.io/etcd/api/v3/LICENSE b/tools/vendor/github.com/moby/sys/sequential/LICENSE similarity index 100% rename from tools/vendor/go.etcd.io/etcd/api/v3/LICENSE rename to tools/vendor/github.com/moby/sys/sequential/LICENSE diff --git a/tools/vendor/github.com/moby/sys/sequential/doc.go b/tools/vendor/github.com/moby/sys/sequential/doc.go new file mode 100644 index 000000000..af2817504 --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/sys/sequential/sequential_unix.go b/tools/vendor/github.com/moby/sys/sequential/sequential_unix.go new file mode 100644 index 000000000..a3c7340e3 --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/sys/sequential/sequential_windows.go b/tools/vendor/github.com/moby/sys/sequential/sequential_windows.go new file mode 100644 index 000000000..3f7f0d83e --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/term/doc.go b/tools/vendor/github.com/moby/term/doc.go new file mode 100644 index 000000000..c9bc03244 --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/term/tc.go b/tools/vendor/github.com/moby/term/tc.go deleted file mode 100644 index 8a5e09f58..000000000 --- a/tools/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/tools/vendor/github.com/moby/term/term.go b/tools/vendor/github.com/moby/term/term.go index 2dd3d090d..f9d8988ef 100644 --- a/tools/vendor/github.com/moby/term/term.go +++ b/tools/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/tools/vendor/github.com/moby/term/term_unix.go b/tools/vendor/github.com/moby/term/term_unix.go new file mode 100644 index 000000000..2ec7706a1 --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/term/term_windows.go b/tools/vendor/github.com/moby/term/term_windows.go index 3cdc8edbd..81ccff042 100644 --- a/tools/vendor/github.com/moby/term/term_windows.go +++ b/tools/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/tools/vendor/github.com/moby/term/termios.go b/tools/vendor/github.com/moby/term/termios_unix.go similarity index 50% rename from tools/vendor/github.com/moby/term/termios.go rename to tools/vendor/github.com/moby/term/termios_unix.go index 99c0f7de6..60c823783 100644 --- a/tools/vendor/github.com/moby/term/termios.go +++ b/tools/vendor/github.com/moby/term/termios_unix.go @@ -8,12 +8,11 @@ import ( ) // Termios is the Unix API for terminal I/O. +// +// Deprecated: use [unix.Termios]. 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) { +func makeRaw(fd uintptr) (*State, error) { termios, err := tcget(fd) if err != nil { return nil, err @@ -21,10 +20,10 @@ func MakeRaw(fd uintptr) (*State, error) { oldState := State{termios: *termios} - termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) + 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.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 diff --git a/tools/vendor/github.com/moby/term/termios_windows.go b/tools/vendor/github.com/moby/term/termios_windows.go new file mode 100644 index 000000000..5be4e7601 --- /dev/null +++ b/tools/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/tools/vendor/github.com/moby/term/windows/ansi_reader.go b/tools/vendor/github.com/moby/term/windows/ansi_reader.go index f32aa537e..fb34c547a 100644 --- a/tools/vendor/github.com/moby/term/windows/ansi_reader.go +++ b/tools/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/tools/vendor/github.com/moby/term/windows/console.go b/tools/vendor/github.com/moby/term/windows/console.go index 116b74e8f..21e57bd52 100644 --- a/tools/vendor/github.com/moby/term/windows/console.go +++ b/tools/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/tools/vendor/github.com/moby/term/winsize.go b/tools/vendor/github.com/moby/term/winsize.go deleted file mode 100644 index bea8d4595..000000000 --- a/tools/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/tools/vendor/github.com/olekukonko/tablewriter/.gitignore b/tools/vendor/github.com/olekukonko/tablewriter/.gitignore deleted file mode 100644 index b66cec635..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Go template -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - diff --git a/tools/vendor/github.com/olekukonko/tablewriter/.travis.yml b/tools/vendor/github.com/olekukonko/tablewriter/.travis.yml deleted file mode 100644 index 366d48a35..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: go -arch: - - ppc64le - - amd64 -go: - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - 1.9 - - "1.10" - - tip -jobs: - exclude : - - arch : ppc64le - go : - - 1.3 - - arch : ppc64le - go : - - 1.4 diff --git a/tools/vendor/github.com/olekukonko/tablewriter/LICENSE.md b/tools/vendor/github.com/olekukonko/tablewriter/LICENSE.md deleted file mode 100644 index a0769b5c1..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2014 by Oleku Konko - -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/tools/vendor/github.com/olekukonko/tablewriter/README.md b/tools/vendor/github.com/olekukonko/tablewriter/README.md deleted file mode 100644 index f06530d75..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/README.md +++ /dev/null @@ -1,431 +0,0 @@ -ASCII Table Writer -========= - -[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) -[![Total views](https://img.shields.io/sourcegraph/rrc/github.com/olekukonko/tablewriter.svg)](https://sourcegraph.com/github.com/olekukonko/tablewriter) -[![Godoc](https://godoc.org/github.com/olekukonko/tablewriter?status.svg)](https://godoc.org/github.com/olekukonko/tablewriter) - -Generate ASCII table on the fly ... Installation is simple as - - go get github.com/olekukonko/tablewriter - - -#### Features -- Automatic Padding -- Support Multiple Lines -- Supports Alignment -- Support Custom Separators -- Automatic Alignment of numbers & percentage -- Write directly to http , file etc via `io.Writer` -- Read directly from CSV file -- Optional row line via `SetRowLine` -- Normalise table header -- Make CSV Headers optional -- Enable or disable table border -- Set custom footer support -- Optional identical cells merging -- Set custom caption -- Optional reflowing of paragraphs in multi-line cells. - -#### Example 1 - Basic -```go -data := [][]string{ - []string{"A", "The Good", "500"}, - []string{"B", "The Very very Bad Man", "288"}, - []string{"C", "The Ugly", "120"}, - []string{"D", "The Gopher", "800"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Name", "Sign", "Rating"}) - -for _, v := range data { - table.Append(v) -} -table.Render() // Send output -``` - -##### Output 1 -``` -+------+-----------------------+--------+ -| NAME | SIGN | RATING | -+------+-----------------------+--------+ -| A | The Good | 500 | -| B | The Very very Bad Man | 288 | -| C | The Ugly | 120 | -| D | The Gopher | 800 | -+------+-----------------------+--------+ -``` - -#### Example 2 - Without Border / Footer / Bulk Append -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "2233", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, - []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer -table.SetBorder(false) // Set Border to false -table.AppendBulk(data) // Add Bulk Data -table.Render() -``` - -##### Output 2 -``` - - DATE | DESCRIPTION | CV2 | AMOUNT ------------+--------------------------+-------+---------- - 1/1/2014 | Domain name | 2233 | $10.98 - 1/1/2014 | January Hosting | 2233 | $54.95 - 1/4/2014 | February Hosting | 2233 | $51.00 - 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 ------------+--------------------------+-------+---------- - TOTAL | $146 93 - --------+---------- - -``` - - -#### Example 3 - CSV -```go -table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test_info.csv", true) -table.SetAlignment(tablewriter.ALIGN_LEFT) // Set Alignment -table.Render() -``` - -##### Output 3 -``` -+----------+--------------+------+-----+---------+----------------+ -| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | -+----------+--------------+------+-----+---------+----------------+ -| user_id | smallint(5) | NO | PRI | NULL | auto_increment | -| username | varchar(10) | NO | | NULL | | -| password | varchar(100) | NO | | NULL | | -+----------+--------------+------+-----+---------+----------------+ -``` - -#### Example 4 - Custom Separator -```go -table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test.csv", true) -table.SetRowLine(true) // Enable row line - -// Change table lines -table.SetCenterSeparator("*") -table.SetColumnSeparator("╪") -table.SetRowSeparator("-") - -table.SetAlignment(tablewriter.ALIGN_LEFT) -table.Render() -``` - -##### Output 4 -``` -*------------*-----------*---------* -╪ FIRST NAME ╪ LAST NAME ╪ SSN ╪ -*------------*-----------*---------* -╪ John ╪ Barry ╪ 123456 ╪ -*------------*-----------*---------* -╪ Kathy ╪ Smith ╪ 687987 ╪ -*------------*-----------*---------* -╪ Bob ╪ McCornick ╪ 3979870 ╪ -*------------*-----------*---------* -``` - -#### Example 5 - Markdown Format -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "2233", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, - []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false}) -table.SetCenterSeparator("|") -table.AppendBulk(data) // Add Bulk Data -table.Render() -``` - -##### Output 5 -``` -| DATE | DESCRIPTION | CV2 | AMOUNT | -|----------|--------------------------|------|--------| -| 1/1/2014 | Domain name | 2233 | $10.98 | -| 1/1/2014 | January Hosting | 2233 | $54.95 | -| 1/4/2014 | February Hosting | 2233 | $51.00 | -| 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 | -``` - -#### Example 6 - Identical cells merging -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "1234", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2345", "$54.95"}, - []string{"1/4/2014", "February Hosting", "3456", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "4567", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) -table.SetAutoMergeCells(true) -table.SetRowLine(true) -table.AppendBulk(data) -table.Render() -``` - -##### Output 6 -``` -+----------+--------------------------+-------+---------+ -| DATE | DESCRIPTION | CV2 | AMOUNT | -+----------+--------------------------+-------+---------+ -| 1/1/2014 | Domain name | 1234 | $10.98 | -+ +--------------------------+-------+---------+ -| | January Hosting | 2345 | $54.95 | -+----------+--------------------------+-------+---------+ -| 1/4/2014 | February Hosting | 3456 | $51.00 | -+ +--------------------------+-------+---------+ -| | February Extra Bandwidth | 4567 | $30.00 | -+----------+--------------------------+-------+---------+ -| TOTAL | $146 93 | -+----------+--------------------------+-------+---------+ -``` - -#### Example 7 - Identical cells merging (specify the column index to merge) -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "1234", "$10.98"}, - []string{"1/1/2014", "January Hosting", "1234", "$10.98"}, - []string{"1/4/2014", "February Hosting", "3456", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "4567", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) -table.SetAutoMergeCellsByColumnIndex([]int{2, 3}) -table.SetRowLine(true) -table.AppendBulk(data) -table.Render() -``` - -##### Output 7 -``` -+----------+--------------------------+-------+---------+ -| DATE | DESCRIPTION | CV2 | AMOUNT | -+----------+--------------------------+-------+---------+ -| 1/1/2014 | Domain name | 1234 | $10.98 | -+----------+--------------------------+ + + -| 1/1/2014 | January Hosting | | | -+----------+--------------------------+-------+---------+ -| 1/4/2014 | February Hosting | 3456 | $51.00 | -+----------+--------------------------+-------+---------+ -| 1/4/2014 | February Extra Bandwidth | 4567 | $30.00 | -+----------+--------------------------+-------+---------+ -| TOTAL | $146.93 | -+----------+--------------------------+-------+---------+ -``` - - -#### Table with color -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "2233", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, - []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer -table.SetBorder(false) // Set Border to false - -table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor}, - tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor}, - tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor}, - tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor}) - -table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor}) - -table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{}, - tablewriter.Colors{tablewriter.Bold}, - tablewriter.Colors{tablewriter.FgHiRedColor}) - -table.AppendBulk(data) -table.Render() -``` - -#### Table with color Output -![Table with Color](https://cloud.githubusercontent.com/assets/6460392/21101956/bbc7b356-c0a1-11e6-9f36-dba694746efc.png) - -#### Example - 8 Table Cells with Color - -Individual Cell Colors from `func Rich` take precedence over Column Colors - -```go -data := [][]string{ - []string{"Test1Merge", "HelloCol2 - 1", "HelloCol3 - 1", "HelloCol4 - 1"}, - []string{"Test1Merge", "HelloCol2 - 2", "HelloCol3 - 2", "HelloCol4 - 2"}, - []string{"Test1Merge", "HelloCol2 - 3", "HelloCol3 - 3", "HelloCol4 - 3"}, - []string{"Test2Merge", "HelloCol2 - 4", "HelloCol3 - 4", "HelloCol4 - 4"}, - []string{"Test2Merge", "HelloCol2 - 5", "HelloCol3 - 5", "HelloCol4 - 5"}, - []string{"Test2Merge", "HelloCol2 - 6", "HelloCol3 - 6", "HelloCol4 - 6"}, - []string{"Test2Merge", "HelloCol2 - 7", "HelloCol3 - 7", "HelloCol4 - 7"}, - []string{"Test3Merge", "HelloCol2 - 8", "HelloCol3 - 8", "HelloCol4 - 8"}, - []string{"Test3Merge", "HelloCol2 - 9", "HelloCol3 - 9", "HelloCol4 - 9"}, - []string{"Test3Merge", "HelloCol2 - 10", "HelloCol3 -10", "HelloCol4 - 10"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Col1", "Col2", "Col3", "Col4"}) -table.SetFooter([]string{"", "", "Footer3", "Footer4"}) -table.SetBorder(false) - -table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor}, - tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor}, - tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor}, - tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor}) - -table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, - tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor}) - -table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{}, - tablewriter.Colors{tablewriter.Bold}, - tablewriter.Colors{tablewriter.FgHiRedColor}) - -colorData1 := []string{"TestCOLOR1Merge", "HelloCol2 - COLOR1", "HelloCol3 - COLOR1", "HelloCol4 - COLOR1"} -colorData2 := []string{"TestCOLOR2Merge", "HelloCol2 - COLOR2", "HelloCol3 - COLOR2", "HelloCol4 - COLOR2"} - -for i, row := range data { - if i == 4 { - table.Rich(colorData1, []tablewriter.Colors{tablewriter.Colors{}, tablewriter.Colors{tablewriter.Normal, tablewriter.FgCyanColor}, tablewriter.Colors{tablewriter.Bold, tablewriter.FgWhiteColor}, tablewriter.Colors{}}) - table.Rich(colorData2, []tablewriter.Colors{tablewriter.Colors{tablewriter.Normal, tablewriter.FgMagentaColor}, tablewriter.Colors{}, tablewriter.Colors{tablewriter.Bold, tablewriter.BgRedColor}, tablewriter.Colors{tablewriter.FgHiGreenColor, tablewriter.Italic, tablewriter.BgHiCyanColor}}) - } - table.Append(row) -} - -table.SetAutoMergeCells(true) -table.Render() - -``` - -##### Table cells with color Output -![Table cells with Color](https://user-images.githubusercontent.com/9064687/63969376-bcd88d80-ca6f-11e9-9466-c3d954700b25.png) - -#### Example 9 - Set table caption -```go -data := [][]string{ - []string{"A", "The Good", "500"}, - []string{"B", "The Very very Bad Man", "288"}, - []string{"C", "The Ugly", "120"}, - []string{"D", "The Gopher", "800"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Name", "Sign", "Rating"}) -table.SetCaption(true, "Movie ratings.") - -for _, v := range data { - table.Append(v) -} -table.Render() // Send output -``` - -Note: Caption text will wrap with total width of rendered table. - -##### Output 9 -``` -+------+-----------------------+--------+ -| NAME | SIGN | RATING | -+------+-----------------------+--------+ -| A | The Good | 500 | -| B | The Very very Bad Man | 288 | -| C | The Ugly | 120 | -| D | The Gopher | 800 | -+------+-----------------------+--------+ -Movie ratings. -``` - -#### Example 10 - Set NoWhiteSpace and TablePadding option -```go -data := [][]string{ - {"node1.example.com", "Ready", "compute", "1.11"}, - {"node2.example.com", "Ready", "compute", "1.11"}, - {"node3.example.com", "Ready", "compute", "1.11"}, - {"node4.example.com", "NotReady", "compute", "1.11"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Name", "Status", "Role", "Version"}) -table.SetAutoWrapText(false) -table.SetAutoFormatHeaders(true) -table.SetHeaderAlignment(ALIGN_LEFT) -table.SetAlignment(ALIGN_LEFT) -table.SetCenterSeparator("") -table.SetColumnSeparator("") -table.SetRowSeparator("") -table.SetHeaderLine(false) -table.SetBorder(false) -table.SetTablePadding("\t") // pad with tabs -table.SetNoWhiteSpace(true) -table.AppendBulk(data) // Add Bulk Data -table.Render() -``` - -##### Output 10 -``` -NAME STATUS ROLE VERSION -node1.example.com Ready compute 1.11 -node2.example.com Ready compute 1.11 -node3.example.com Ready compute 1.11 -node4.example.com NotReady compute 1.11 -``` - -#### Render table into a string - -Instead of rendering the table to `io.Stdout` you can also render it into a string. Go 1.10 introduced the `strings.Builder` type which implements the `io.Writer` interface and can therefore be used for this task. Example: - -```go -package main - -import ( - "strings" - "fmt" - - "github.com/olekukonko/tablewriter" -) - -func main() { - tableString := &strings.Builder{} - table := tablewriter.NewWriter(tableString) - - /* - * Code to fill the table - */ - - table.Render() - - fmt.Println(tableString.String()) -} -``` - -#### TODO -- ~~Import Directly from CSV~~ - `done` -- ~~Support for `SetFooter`~~ - `done` -- ~~Support for `SetBorder`~~ - `done` -- ~~Support table with uneven rows~~ - `done` -- ~~Support custom alignment~~ -- General Improvement & Optimisation -- `NewHTML` Parse table from HTML diff --git a/tools/vendor/github.com/olekukonko/tablewriter/csv.go b/tools/vendor/github.com/olekukonko/tablewriter/csv.go deleted file mode 100644 index 98878303b..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/csv.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "encoding/csv" - "io" - "os" -) - -// Start A new table by importing from a CSV file -// Takes io.Writer and csv File name -func NewCSV(writer io.Writer, fileName string, hasHeader bool) (*Table, error) { - file, err := os.Open(fileName) - if err != nil { - return &Table{}, err - } - defer file.Close() - csvReader := csv.NewReader(file) - t, err := NewCSVReader(writer, csvReader, hasHeader) - return t, err -} - -// Start a New Table Writer with csv.Reader -// This enables customisation such as reader.Comma = ';' -// See http://golang.org/src/pkg/encoding/csv/reader.go?s=3213:3671#L94 -func NewCSVReader(writer io.Writer, csvReader *csv.Reader, hasHeader bool) (*Table, error) { - t := NewWriter(writer) - if hasHeader { - // Read the first row - headers, err := csvReader.Read() - if err != nil { - return &Table{}, err - } - t.SetHeader(headers) - } - for { - record, err := csvReader.Read() - if err == io.EOF { - break - } else if err != nil { - return &Table{}, err - } - t.Append(record) - } - return t, nil -} diff --git a/tools/vendor/github.com/olekukonko/tablewriter/table.go b/tools/vendor/github.com/olekukonko/tablewriter/table.go deleted file mode 100644 index f913149c6..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/table.go +++ /dev/null @@ -1,967 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -// Create & Generate text based table -package tablewriter - -import ( - "bytes" - "fmt" - "io" - "regexp" - "strings" -) - -const ( - MAX_ROW_WIDTH = 30 -) - -const ( - CENTER = "+" - ROW = "-" - COLUMN = "|" - SPACE = " " - NEWLINE = "\n" -) - -const ( - ALIGN_DEFAULT = iota - ALIGN_CENTER - ALIGN_RIGHT - ALIGN_LEFT -) - -var ( - decimal = regexp.MustCompile(`^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$`) - percent = regexp.MustCompile(`^-?\d+\.?\d*$%$`) -) - -type Border struct { - Left bool - Right bool - Top bool - Bottom bool -} - -type Table struct { - out io.Writer - rows [][]string - lines [][][]string - cs map[int]int - rs map[int]int - headers [][]string - footers [][]string - caption bool - captionText string - autoFmt bool - autoWrap bool - reflowText bool - mW int - pCenter string - pRow string - pColumn string - tColumn int - tRow int - hAlign int - fAlign int - align int - newLine string - rowLine bool - autoMergeCells bool - columnsToAutoMergeCells map[int]bool - noWhiteSpace bool - tablePadding string - hdrLine bool - borders Border - colSize int - headerParams []string - columnsParams []string - footerParams []string - columnsAlign []int -} - -// Start New Table -// Take io.Writer Directly -func NewWriter(writer io.Writer) *Table { - t := &Table{ - out: writer, - rows: [][]string{}, - lines: [][][]string{}, - cs: make(map[int]int), - rs: make(map[int]int), - headers: [][]string{}, - footers: [][]string{}, - caption: false, - captionText: "Table caption.", - autoFmt: true, - autoWrap: true, - reflowText: true, - mW: MAX_ROW_WIDTH, - pCenter: CENTER, - pRow: ROW, - pColumn: COLUMN, - tColumn: -1, - tRow: -1, - hAlign: ALIGN_DEFAULT, - fAlign: ALIGN_DEFAULT, - align: ALIGN_DEFAULT, - newLine: NEWLINE, - rowLine: false, - hdrLine: true, - borders: Border{Left: true, Right: true, Bottom: true, Top: true}, - colSize: -1, - headerParams: []string{}, - columnsParams: []string{}, - footerParams: []string{}, - columnsAlign: []int{}} - return t -} - -// Render table output -func (t *Table) Render() { - if t.borders.Top { - t.printLine(true) - } - t.printHeading() - if t.autoMergeCells { - t.printRowsMergeCells() - } else { - t.printRows() - } - if !t.rowLine && t.borders.Bottom { - t.printLine(true) - } - t.printFooter() - - if t.caption { - t.printCaption() - } -} - -const ( - headerRowIdx = -1 - footerRowIdx = -2 -) - -// Set table header -func (t *Table) SetHeader(keys []string) { - t.colSize = len(keys) - for i, v := range keys { - lines := t.parseDimension(v, i, headerRowIdx) - t.headers = append(t.headers, lines) - } -} - -// Set table Footer -func (t *Table) SetFooter(keys []string) { - //t.colSize = len(keys) - for i, v := range keys { - lines := t.parseDimension(v, i, footerRowIdx) - t.footers = append(t.footers, lines) - } -} - -// Set table Caption -func (t *Table) SetCaption(caption bool, captionText ...string) { - t.caption = caption - if len(captionText) == 1 { - t.captionText = captionText[0] - } -} - -// Turn header autoformatting on/off. Default is on (true). -func (t *Table) SetAutoFormatHeaders(auto bool) { - t.autoFmt = auto -} - -// Turn automatic multiline text adjustment on/off. Default is on (true). -func (t *Table) SetAutoWrapText(auto bool) { - t.autoWrap = auto -} - -// Turn automatic reflowing of multiline text when rewrapping. Default is on (true). -func (t *Table) SetReflowDuringAutoWrap(auto bool) { - t.reflowText = auto -} - -// Set the Default column width -func (t *Table) SetColWidth(width int) { - t.mW = width -} - -// Set the minimal width for a column -func (t *Table) SetColMinWidth(column int, width int) { - t.cs[column] = width -} - -// Set the Column Separator -func (t *Table) SetColumnSeparator(sep string) { - t.pColumn = sep -} - -// Set the Row Separator -func (t *Table) SetRowSeparator(sep string) { - t.pRow = sep -} - -// Set the center Separator -func (t *Table) SetCenterSeparator(sep string) { - t.pCenter = sep -} - -// Set Header Alignment -func (t *Table) SetHeaderAlignment(hAlign int) { - t.hAlign = hAlign -} - -// Set Footer Alignment -func (t *Table) SetFooterAlignment(fAlign int) { - t.fAlign = fAlign -} - -// Set Table Alignment -func (t *Table) SetAlignment(align int) { - t.align = align -} - -// Set No White Space -func (t *Table) SetNoWhiteSpace(allow bool) { - t.noWhiteSpace = allow -} - -// Set Table Padding -func (t *Table) SetTablePadding(padding string) { - t.tablePadding = padding -} - -func (t *Table) SetColumnAlignment(keys []int) { - for _, v := range keys { - switch v { - case ALIGN_CENTER: - break - case ALIGN_LEFT: - break - case ALIGN_RIGHT: - break - default: - v = ALIGN_DEFAULT - } - t.columnsAlign = append(t.columnsAlign, v) - } -} - -// Set New Line -func (t *Table) SetNewLine(nl string) { - t.newLine = nl -} - -// Set Header Line -// This would enable / disable a line after the header -func (t *Table) SetHeaderLine(line bool) { - t.hdrLine = line -} - -// Set Row Line -// This would enable / disable a line on each row of the table -func (t *Table) SetRowLine(line bool) { - t.rowLine = line -} - -// Set Auto Merge Cells -// This would enable / disable the merge of cells with identical values -func (t *Table) SetAutoMergeCells(auto bool) { - t.autoMergeCells = auto -} - -// Set Auto Merge Cells By Column Index -// This would enable / disable the merge of cells with identical values for specific columns -// If cols is empty, it is the same as `SetAutoMergeCells(true)`. -func (t *Table) SetAutoMergeCellsByColumnIndex(cols []int) { - t.autoMergeCells = true - - if len(cols) > 0 { - m := make(map[int]bool) - for _, col := range cols { - m[col] = true - } - t.columnsToAutoMergeCells = m - } -} - -// Set Table Border -// This would enable / disable line around the table -func (t *Table) SetBorder(border bool) { - t.SetBorders(Border{border, border, border, border}) -} - -func (t *Table) SetBorders(border Border) { - t.borders = border -} - -// Append row to table -func (t *Table) Append(row []string) { - rowSize := len(t.headers) - if rowSize > t.colSize { - t.colSize = rowSize - } - - n := len(t.lines) - line := [][]string{} - for i, v := range row { - - // Detect string width - // Detect String height - // Break strings into words - out := t.parseDimension(v, i, n) - - // Append broken words - line = append(line, out) - } - t.lines = append(t.lines, line) -} - -// Append row to table with color attributes -func (t *Table) Rich(row []string, colors []Colors) { - rowSize := len(t.headers) - if rowSize > t.colSize { - t.colSize = rowSize - } - - n := len(t.lines) - line := [][]string{} - for i, v := range row { - - // Detect string width - // Detect String height - // Break strings into words - out := t.parseDimension(v, i, n) - - if len(colors) > i { - color := colors[i] - out[0] = format(out[0], color) - } - - // Append broken words - line = append(line, out) - } - t.lines = append(t.lines, line) -} - -// Allow Support for Bulk Append -// Eliminates repeated for loops -func (t *Table) AppendBulk(rows [][]string) { - for _, row := range rows { - t.Append(row) - } -} - -// NumLines to get the number of lines -func (t *Table) NumLines() int { - return len(t.lines) -} - -// Clear rows -func (t *Table) ClearRows() { - t.lines = [][][]string{} -} - -// Clear footer -func (t *Table) ClearFooter() { - t.footers = [][]string{} -} - -// Center based on position and border. -func (t *Table) center(i int) string { - if i == -1 && !t.borders.Left { - return t.pRow - } - - if i == len(t.cs)-1 && !t.borders.Right { - return t.pRow - } - - return t.pCenter -} - -// Print line based on row width -func (t *Table) printLine(nl bool) { - fmt.Fprint(t.out, t.center(-1)) - for i := 0; i < len(t.cs); i++ { - v := t.cs[i] - fmt.Fprintf(t.out, "%s%s%s%s", - t.pRow, - strings.Repeat(string(t.pRow), v), - t.pRow, - t.center(i)) - } - if nl { - fmt.Fprint(t.out, t.newLine) - } -} - -// Print line based on row width with our without cell separator -func (t *Table) printLineOptionalCellSeparators(nl bool, displayCellSeparator []bool) { - fmt.Fprint(t.out, t.pCenter) - for i := 0; i < len(t.cs); i++ { - v := t.cs[i] - if i > len(displayCellSeparator) || displayCellSeparator[i] { - // Display the cell separator - fmt.Fprintf(t.out, "%s%s%s%s", - t.pRow, - strings.Repeat(string(t.pRow), v), - t.pRow, - t.pCenter) - } else { - // Don't display the cell separator for this cell - fmt.Fprintf(t.out, "%s%s", - strings.Repeat(" ", v+2), - t.pCenter) - } - } - if nl { - fmt.Fprint(t.out, t.newLine) - } -} - -// Return the PadRight function if align is left, PadLeft if align is right, -// and Pad by default -func pad(align int) func(string, string, int) string { - padFunc := Pad - switch align { - case ALIGN_LEFT: - padFunc = PadRight - case ALIGN_RIGHT: - padFunc = PadLeft - } - return padFunc -} - -// Print heading information -func (t *Table) printHeading() { - // Check if headers is available - if len(t.headers) < 1 { - return - } - - // Identify last column - end := len(t.cs) - 1 - - // Get pad function - padFunc := pad(t.hAlign) - - // Checking for ANSI escape sequences for header - is_esc_seq := false - if len(t.headerParams) > 0 { - is_esc_seq = true - } - - // Maximum height. - max := t.rs[headerRowIdx] - - // Print Heading - for x := 0; x < max; x++ { - // Check if border is set - // Replace with space if not set - if !t.noWhiteSpace { - fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) - } - - for y := 0; y <= end; y++ { - v := t.cs[y] - h := "" - - if y < len(t.headers) && x < len(t.headers[y]) { - h = t.headers[y][x] - } - if t.autoFmt { - h = Title(h) - } - pad := ConditionString((y == end && !t.borders.Left), SPACE, t.pColumn) - if t.noWhiteSpace { - pad = ConditionString((y == end && !t.borders.Left), SPACE, t.tablePadding) - } - if is_esc_seq { - if !t.noWhiteSpace { - fmt.Fprintf(t.out, " %s %s", - format(padFunc(h, SPACE, v), - t.headerParams[y]), pad) - } else { - fmt.Fprintf(t.out, "%s %s", - format(padFunc(h, SPACE, v), - t.headerParams[y]), pad) - } - } else { - if !t.noWhiteSpace { - fmt.Fprintf(t.out, " %s %s", - padFunc(h, SPACE, v), - pad) - } else { - // the spaces between breaks the kube formatting - fmt.Fprintf(t.out, "%s%s", - padFunc(h, SPACE, v), - pad) - } - } - } - // Next line - fmt.Fprint(t.out, t.newLine) - } - if t.hdrLine { - t.printLine(true) - } -} - -// Print heading information -func (t *Table) printFooter() { - // Check if headers is available - if len(t.footers) < 1 { - return - } - - // Only print line if border is not set - if !t.borders.Bottom { - t.printLine(true) - } - - // Identify last column - end := len(t.cs) - 1 - - // Get pad function - padFunc := pad(t.fAlign) - - // Checking for ANSI escape sequences for header - is_esc_seq := false - if len(t.footerParams) > 0 { - is_esc_seq = true - } - - // Maximum height. - max := t.rs[footerRowIdx] - - // Print Footer - erasePad := make([]bool, len(t.footers)) - for x := 0; x < max; x++ { - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE)) - - for y := 0; y <= end; y++ { - v := t.cs[y] - f := "" - if y < len(t.footers) && x < len(t.footers[y]) { - f = t.footers[y][x] - } - if t.autoFmt { - f = Title(f) - } - pad := ConditionString((y == end && !t.borders.Top), SPACE, t.pColumn) - - if erasePad[y] || (x == 0 && len(f) == 0) { - pad = SPACE - erasePad[y] = true - } - - if is_esc_seq { - fmt.Fprintf(t.out, " %s %s", - format(padFunc(f, SPACE, v), - t.footerParams[y]), pad) - } else { - fmt.Fprintf(t.out, " %s %s", - padFunc(f, SPACE, v), - pad) - } - - //fmt.Fprintf(t.out, " %s %s", - // padFunc(f, SPACE, v), - // pad) - } - // Next line - fmt.Fprint(t.out, t.newLine) - //t.printLine(true) - } - - hasPrinted := false - - for i := 0; i <= end; i++ { - v := t.cs[i] - pad := t.pRow - center := t.pCenter - length := len(t.footers[i][0]) - - if length > 0 { - hasPrinted = true - } - - // Set center to be space if length is 0 - if length == 0 && !t.borders.Right { - center = SPACE - } - - // Print first junction - if i == 0 { - if length > 0 && !t.borders.Left { - center = t.pRow - } - fmt.Fprint(t.out, center) - } - - // Pad With space of length is 0 - if length == 0 { - pad = SPACE - } - // Ignore left space as it has printed before - if hasPrinted || t.borders.Left { - pad = t.pRow - center = t.pCenter - } - - // Change Center end position - if center != SPACE { - if i == end && !t.borders.Right { - center = t.pRow - } - } - - // Change Center start position - if center == SPACE { - if i < end && len(t.footers[i+1][0]) != 0 { - if !t.borders.Left { - center = t.pRow - } else { - center = t.pCenter - } - } - } - - // Print the footer - fmt.Fprintf(t.out, "%s%s%s%s", - pad, - strings.Repeat(string(pad), v), - pad, - center) - - } - - fmt.Fprint(t.out, t.newLine) -} - -// Print caption text -func (t Table) printCaption() { - width := t.getTableWidth() - paragraph, _ := WrapString(t.captionText, width) - for linecount := 0; linecount < len(paragraph); linecount++ { - fmt.Fprintln(t.out, paragraph[linecount]) - } -} - -// Calculate the total number of characters in a row -func (t Table) getTableWidth() int { - var chars int - for _, v := range t.cs { - chars += v - } - - // Add chars, spaces, seperators to calculate the total width of the table. - // ncols := t.colSize - // spaces := ncols * 2 - // seps := ncols + 1 - - return (chars + (3 * t.colSize) + 2) -} - -func (t Table) printRows() { - for i, lines := range t.lines { - t.printRow(lines, i) - } -} - -func (t *Table) fillAlignment(num int) { - if len(t.columnsAlign) < num { - t.columnsAlign = make([]int, num) - for i := range t.columnsAlign { - t.columnsAlign[i] = t.align - } - } -} - -// Print Row Information -// Adjust column alignment based on type - -func (t *Table) printRow(columns [][]string, rowIdx int) { - // Get Maximum Height - max := t.rs[rowIdx] - total := len(columns) - - // TODO Fix uneven col size - // if total < t.colSize { - // for n := t.colSize - total; n < t.colSize ; n++ { - // columns = append(columns, []string{SPACE}) - // t.cs[n] = t.mW - // } - //} - - // Pad Each Height - pads := []int{} - - // Checking for ANSI escape sequences for columns - is_esc_seq := false - if len(t.columnsParams) > 0 { - is_esc_seq = true - } - t.fillAlignment(total) - - for i, line := range columns { - length := len(line) - pad := max - length - pads = append(pads, pad) - for n := 0; n < pad; n++ { - columns[i] = append(columns[i], " ") - } - } - //fmt.Println(max, "\n") - for x := 0; x < max; x++ { - for y := 0; y < total; y++ { - - // Check if border is set - if !t.noWhiteSpace { - fmt.Fprint(t.out, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn)) - fmt.Fprintf(t.out, SPACE) - } - - str := columns[y][x] - - // Embedding escape sequence with column value - if is_esc_seq { - str = format(str, t.columnsParams[y]) - } - - // This would print alignment - // Default alignment would use multiple configuration - switch t.columnsAlign[y] { - case ALIGN_CENTER: // - fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y])) - case ALIGN_RIGHT: - fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y])) - case ALIGN_LEFT: - fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - default: - if decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) { - fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y])) - } else { - fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - - // TODO Custom alignment per column - //if max == 1 || pads[y] > 0 { - // fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y])) - //} else { - // fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - //} - - } - } - if !t.noWhiteSpace { - fmt.Fprintf(t.out, SPACE) - } else { - fmt.Fprintf(t.out, t.tablePadding) - } - } - // Check if border is set - // Replace with space if not set - if !t.noWhiteSpace { - fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) - } - fmt.Fprint(t.out, t.newLine) - } - - if t.rowLine { - t.printLine(true) - } -} - -// Print the rows of the table and merge the cells that are identical -func (t *Table) printRowsMergeCells() { - var previousLine []string - var displayCellBorder []bool - var tmpWriter bytes.Buffer - for i, lines := range t.lines { - // We store the display of the current line in a tmp writer, as we need to know which border needs to be print above - previousLine, displayCellBorder = t.printRowMergeCells(&tmpWriter, lines, i, previousLine) - if i > 0 { //We don't need to print borders above first line - if t.rowLine { - t.printLineOptionalCellSeparators(true, displayCellBorder) - } - } - tmpWriter.WriteTo(t.out) - } - //Print the end of the table - if t.rowLine { - t.printLine(true) - } -} - -// Print Row Information to a writer and merge identical cells. -// Adjust column alignment based on type - -func (t *Table) printRowMergeCells(writer io.Writer, columns [][]string, rowIdx int, previousLine []string) ([]string, []bool) { - // Get Maximum Height - max := t.rs[rowIdx] - total := len(columns) - - // Pad Each Height - pads := []int{} - - // Checking for ANSI escape sequences for columns - is_esc_seq := false - if len(t.columnsParams) > 0 { - is_esc_seq = true - } - for i, line := range columns { - length := len(line) - pad := max - length - pads = append(pads, pad) - for n := 0; n < pad; n++ { - columns[i] = append(columns[i], " ") - } - } - - var displayCellBorder []bool - t.fillAlignment(total) - for x := 0; x < max; x++ { - for y := 0; y < total; y++ { - - // Check if border is set - fmt.Fprint(writer, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn)) - - fmt.Fprintf(writer, SPACE) - - str := columns[y][x] - - // Embedding escape sequence with column value - if is_esc_seq { - str = format(str, t.columnsParams[y]) - } - - if t.autoMergeCells { - var mergeCell bool - if t.columnsToAutoMergeCells != nil { - // Check to see if the column index is in columnsToAutoMergeCells. - if t.columnsToAutoMergeCells[y] { - mergeCell = true - } - } else { - // columnsToAutoMergeCells was not set. - mergeCell = true - } - //Store the full line to merge mutli-lines cells - fullLine := strings.TrimRight(strings.Join(columns[y], " "), " ") - if len(previousLine) > y && fullLine == previousLine[y] && fullLine != "" && mergeCell { - // If this cell is identical to the one above but not empty, we don't display the border and keep the cell empty. - displayCellBorder = append(displayCellBorder, false) - str = "" - } else { - // First line or different content, keep the content and print the cell border - displayCellBorder = append(displayCellBorder, true) - } - } - - // This would print alignment - // Default alignment would use multiple configuration - switch t.columnsAlign[y] { - case ALIGN_CENTER: // - fmt.Fprintf(writer, "%s", Pad(str, SPACE, t.cs[y])) - case ALIGN_RIGHT: - fmt.Fprintf(writer, "%s", PadLeft(str, SPACE, t.cs[y])) - case ALIGN_LEFT: - fmt.Fprintf(writer, "%s", PadRight(str, SPACE, t.cs[y])) - default: - if decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) { - fmt.Fprintf(writer, "%s", PadLeft(str, SPACE, t.cs[y])) - } else { - fmt.Fprintf(writer, "%s", PadRight(str, SPACE, t.cs[y])) - } - } - fmt.Fprintf(writer, SPACE) - } - // Check if border is set - // Replace with space if not set - fmt.Fprint(writer, ConditionString(t.borders.Left, t.pColumn, SPACE)) - fmt.Fprint(writer, t.newLine) - } - - //The new previous line is the current one - previousLine = make([]string, total) - for y := 0; y < total; y++ { - previousLine[y] = strings.TrimRight(strings.Join(columns[y], " "), " ") //Store the full line for multi-lines cells - } - //Returns the newly added line and wether or not a border should be displayed above. - return previousLine, displayCellBorder -} - -func (t *Table) parseDimension(str string, colKey, rowKey int) []string { - var ( - raw []string - maxWidth int - ) - - raw = getLines(str) - maxWidth = 0 - for _, line := range raw { - if w := DisplayWidth(line); w > maxWidth { - maxWidth = w - } - } - - // If wrapping, ensure that all paragraphs in the cell fit in the - // specified width. - if t.autoWrap { - // If there's a maximum allowed width for wrapping, use that. - if maxWidth > t.mW { - maxWidth = t.mW - } - - // In the process of doing so, we need to recompute maxWidth. This - // is because perhaps a word in the cell is longer than the - // allowed maximum width in t.mW. - newMaxWidth := maxWidth - newRaw := make([]string, 0, len(raw)) - - if t.reflowText { - // Make a single paragraph of everything. - raw = []string{strings.Join(raw, " ")} - } - for i, para := range raw { - paraLines, _ := WrapString(para, maxWidth) - for _, line := range paraLines { - if w := DisplayWidth(line); w > newMaxWidth { - newMaxWidth = w - } - } - if i > 0 { - newRaw = append(newRaw, " ") - } - newRaw = append(newRaw, paraLines...) - } - raw = newRaw - maxWidth = newMaxWidth - } - - // Store the new known maximum width. - v, ok := t.cs[colKey] - if !ok || v < maxWidth || v == 0 { - t.cs[colKey] = maxWidth - } - - // Remember the number of lines for the row printer. - h := len(raw) - v, ok = t.rs[rowKey] - - if !ok || v < h || v == 0 { - t.rs[rowKey] = h - } - //fmt.Printf("Raw %+v %d\n", raw, len(raw)) - return raw -} diff --git a/tools/vendor/github.com/olekukonko/tablewriter/table_with_color.go b/tools/vendor/github.com/olekukonko/tablewriter/table_with_color.go deleted file mode 100644 index ae7a364ae..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/table_with_color.go +++ /dev/null @@ -1,136 +0,0 @@ -package tablewriter - -import ( - "fmt" - "strconv" - "strings" -) - -const ESC = "\033" -const SEP = ";" - -const ( - BgBlackColor int = iota + 40 - BgRedColor - BgGreenColor - BgYellowColor - BgBlueColor - BgMagentaColor - BgCyanColor - BgWhiteColor -) - -const ( - FgBlackColor int = iota + 30 - FgRedColor - FgGreenColor - FgYellowColor - FgBlueColor - FgMagentaColor - FgCyanColor - FgWhiteColor -) - -const ( - BgHiBlackColor int = iota + 100 - BgHiRedColor - BgHiGreenColor - BgHiYellowColor - BgHiBlueColor - BgHiMagentaColor - BgHiCyanColor - BgHiWhiteColor -) - -const ( - FgHiBlackColor int = iota + 90 - FgHiRedColor - FgHiGreenColor - FgHiYellowColor - FgHiBlueColor - FgHiMagentaColor - FgHiCyanColor - FgHiWhiteColor -) - -const ( - Normal = 0 - Bold = 1 - UnderlineSingle = 4 - Italic -) - -type Colors []int - -func startFormat(seq string) string { - return fmt.Sprintf("%s[%sm", ESC, seq) -} - -func stopFormat() string { - return fmt.Sprintf("%s[%dm", ESC, Normal) -} - -// Making the SGR (Select Graphic Rendition) sequence. -func makeSequence(codes []int) string { - codesInString := []string{} - for _, code := range codes { - codesInString = append(codesInString, strconv.Itoa(code)) - } - return strings.Join(codesInString, SEP) -} - -// Adding ANSI escape sequences before and after string -func format(s string, codes interface{}) string { - var seq string - - switch v := codes.(type) { - - case string: - seq = v - case []int: - seq = makeSequence(v) - case Colors: - seq = makeSequence(v) - default: - return s - } - - if len(seq) == 0 { - return s - } - return startFormat(seq) + s + stopFormat() -} - -// Adding header colors (ANSI codes) -func (t *Table) SetHeaderColor(colors ...Colors) { - if t.colSize != len(colors) { - panic("Number of header colors must be equal to number of headers.") - } - for i := 0; i < len(colors); i++ { - t.headerParams = append(t.headerParams, makeSequence(colors[i])) - } -} - -// Adding column colors (ANSI codes) -func (t *Table) SetColumnColor(colors ...Colors) { - if t.colSize != len(colors) { - panic("Number of column colors must be equal to number of headers.") - } - for i := 0; i < len(colors); i++ { - t.columnsParams = append(t.columnsParams, makeSequence(colors[i])) - } -} - -// Adding column colors (ANSI codes) -func (t *Table) SetFooterColor(colors ...Colors) { - if len(t.footers) != len(colors) { - panic("Number of footer colors must be equal to number of footer.") - } - for i := 0; i < len(colors); i++ { - t.footerParams = append(t.footerParams, makeSequence(colors[i])) - } -} - -func Color(colors ...int) []int { - return colors -} diff --git a/tools/vendor/github.com/olekukonko/tablewriter/util.go b/tools/vendor/github.com/olekukonko/tablewriter/util.go deleted file mode 100644 index 380e7ab35..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/util.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "math" - "regexp" - "strings" - - "github.com/mattn/go-runewidth" -) - -var ansi = regexp.MustCompile("\033\\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]") - -func DisplayWidth(str string) int { - return runewidth.StringWidth(ansi.ReplaceAllLiteralString(str, "")) -} - -// Simple Condition for string -// Returns value based on condition -func ConditionString(cond bool, valid, inValid string) string { - if cond { - return valid - } - return inValid -} - -func isNumOrSpace(r rune) bool { - return ('0' <= r && r <= '9') || r == ' ' -} - -// Format Table Header -// Replace _ , . and spaces -func Title(name string) string { - origLen := len(name) - rs := []rune(name) - for i, r := range rs { - switch r { - case '_': - rs[i] = ' ' - case '.': - // ignore floating number 0.0 - if (i != 0 && !isNumOrSpace(rs[i-1])) || (i != len(rs)-1 && !isNumOrSpace(rs[i+1])) { - rs[i] = ' ' - } - } - } - name = string(rs) - name = strings.TrimSpace(name) - if len(name) == 0 && origLen > 0 { - // Keep at least one character. This is important to preserve - // empty lines in multi-line headers/footers. - name = " " - } - return strings.ToUpper(name) -} - -// Pad String -// Attempts to place string in the center -func Pad(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - gapLeft := int(math.Ceil(float64(gap / 2))) - gapRight := gap - gapLeft - return strings.Repeat(string(pad), gapLeft) + s + strings.Repeat(string(pad), gapRight) - } - return s -} - -// Pad String Right position -// This would place string at the left side of the screen -func PadRight(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - return s + strings.Repeat(string(pad), gap) - } - return s -} - -// Pad String Left position -// This would place string at the right side of the screen -func PadLeft(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - return strings.Repeat(string(pad), gap) + s - } - return s -} diff --git a/tools/vendor/github.com/olekukonko/tablewriter/wrap.go b/tools/vendor/github.com/olekukonko/tablewriter/wrap.go deleted file mode 100644 index a092ee1f7..000000000 --- a/tools/vendor/github.com/olekukonko/tablewriter/wrap.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "math" - "strings" - - "github.com/mattn/go-runewidth" -) - -var ( - nl = "\n" - sp = " " -) - -const defaultPenalty = 1e5 - -// Wrap wraps s into a paragraph of lines of length lim, with minimal -// raggedness. -func WrapString(s string, lim int) ([]string, int) { - words := strings.Split(strings.Replace(s, nl, sp, -1), sp) - var lines []string - max := 0 - for _, v := range words { - max = runewidth.StringWidth(v) - if max > lim { - lim = max - } - } - for _, line := range WrapWords(words, 1, lim, defaultPenalty) { - lines = append(lines, strings.Join(line, sp)) - } - return lines, lim -} - -// WrapWords is the low-level line-breaking algorithm, useful if you need more -// control over the details of the text wrapping process. For most uses, -// WrapString will be sufficient and more convenient. -// -// WrapWords splits a list of words into lines with minimal "raggedness", -// treating each rune as one unit, accounting for spc units between adjacent -// words on each line, and attempting to limit lines to lim units. Raggedness -// is the total error over all lines, where error is the square of the -// difference of the length of the line and lim. Too-long lines (which only -// happen when a single word is longer than lim units) have pen penalty units -// added to the error. -func WrapWords(words []string, spc, lim, pen int) [][]string { - n := len(words) - - length := make([][]int, n) - for i := 0; i < n; i++ { - length[i] = make([]int, n) - length[i][i] = runewidth.StringWidth(words[i]) - for j := i + 1; j < n; j++ { - length[i][j] = length[i][j-1] + spc + runewidth.StringWidth(words[j]) - } - } - nbrk := make([]int, n) - cost := make([]int, n) - for i := range cost { - cost[i] = math.MaxInt32 - } - for i := n - 1; i >= 0; i-- { - if length[i][n-1] <= lim { - cost[i] = 0 - nbrk[i] = n - } else { - for j := i + 1; j < n; j++ { - d := lim - length[i][j-1] - c := d*d + cost[j] - if length[i][j-1] > lim { - c += pen // too-long lines get a worse penalty - } - if c < cost[i] { - cost[i] = c - nbrk[i] = j - } - } - } - } - var lines [][]string - i := 0 - for i < n { - lines = append(lines, words[i:nbrk[i]]) - i = nbrk[i] - } - return lines -} - -// getLines decomposes a multiline string into a slice of strings. -func getLines(s string) []string { - return strings.Split(s, nl) -} diff --git a/tools/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go b/tools/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go index ffff4b6d1..e6aa113f0 100644 --- a/tools/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go +++ b/tools/vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go @@ -48,6 +48,15 @@ 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. + ArgsEscaped bool `json:"ArgsEscaped,omitempty"` } // RootFS describes a layer content addresses diff --git a/tools/vendor/github.com/opencontainers/image-spec/specs-go/version.go b/tools/vendor/github.com/opencontainers/image-spec/specs-go/version.go index d27903579..1afd590fe 100644 --- a/tools/vendor/github.com/opencontainers/image-spec/specs-go/version.go +++ b/tools/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 = "-dev" ) // Version is the specification version that the package types support. diff --git a/tools/vendor/github.com/operator-framework/ansible-operator-plugins/LICENSE b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/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/tools/vendor/github.com/operator-framework/ansible-operator-plugins/internal/version/version.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/internal/version/version.go new file mode 100644 index 000000000..0110a678a --- /dev/null +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/internal/version/version.go @@ -0,0 +1,32 @@ +// Copyright 2018 The Operator-SDK 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 version + +// var needs to be used instead of const for ldflags +var ( + Version = "unknown" + GitVersion = "unknown" + GitCommit = "unknown" + KubernetesVersion = "unknown" + + // ImageVersion represents the ansible-operator, helm-operator, and scorecard subproject versions, + // which is used in each plugin to specify binary and/or image versions. This is set to the + // most recent operator-sdk release tag such that samples are generated with the correct versions + // in a release commit. Once each element that uses this version is moved to a separate repo + // and release process, this variable will be removed. + + // TODO: find a way to make this automated. For now manually update this before releases. + ImageVersion = "v1.32.0" +) diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/api.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/api.go similarity index 96% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/api.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/api.go index 47c35b858..37a550014 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/api.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/api.go @@ -26,8 +26,8 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/plugin" pluginutil "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds" - "github.com/operator-framework/operator-sdk/internal/plugins/util" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util" ) const ( diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants/constants.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants/constants.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants/constants.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants/constants.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/init.go similarity index 96% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/init.go index 2cea84be8..235e63e44 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/init.go @@ -25,8 +25,8 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/plugin" "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds" - sdkpluginutil "github.com/operator-framework/operator-sdk/internal/plugins/util" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds" + sdkpluginutil "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util" ) const ( @@ -225,7 +225,7 @@ func addInitCustomizations(projectName string, componentConfig bool) error { // replace the default ports because ansible has been using another one // todo: remove it when we be able to change the port for the default one - // issue: https://github.com/operator-framework/operator-sdk/issues/4331 + // issue: https://github.com/operator-framework/ansible-operator-plugins/issues/4331 err = util.ReplaceInFile(managerFile, "port: 8081", "port: 6789") if err != nil { return err diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/plugin.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/plugin.go similarity index 95% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/plugin.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/plugin.go index 7ae087cee..43de6cbf5 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/plugin.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/plugin.go @@ -19,7 +19,7 @@ import ( cfgv3 "sigs.k8s.io/kubebuilder/v3/pkg/config/v3" "sigs.k8s.io/kubebuilder/v3/pkg/plugin" - "github.com/operator-framework/operator-sdk/internal/plugins" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins" ) const pluginName = "base.ansible" + plugins.DefaultNameQualifier diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/api.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/api.go similarity index 76% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/api.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/api.go index f6902bf23..207b1c5f7 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/api.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/api.go @@ -23,13 +23,13 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" "sigs.k8s.io/kubebuilder/v3/pkg/plugins" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks" - ansibleroles "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/rbac" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks" + ansibleroles "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles" ) var _ plugins.Scaffolder = &apiScaffolder{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/init.go similarity index 72% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/init.go index b3ab4f1c7..f29ce53a0 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/init.go @@ -23,15 +23,15 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/plugins" kustomizev2Alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles" - "github.com/operator-framework/operator-sdk/internal/version" + "github.com/operator-framework/ansible-operator-plugins/internal/version" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/rbac" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles" ) const imageName = "controller:latest" diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd/crd.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd/crd.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd/crd.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd/crd.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd/kustomization.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd/kustomization.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd/kustomization.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd/kustomization.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac/role.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/rbac/role.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac/role.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/rbac/role.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/debug_logs_patch.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/debug_logs_patch.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/debug_logs_patch.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/debug_logs_patch.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/kustomization.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/kustomization.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/kustomization.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/kustomization.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/manager_image.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/manager_image.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/manager_image.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/manager_image.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/always_pull_patch.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/always_pull_patch.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/always_pull_patch.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/always_pull_patch.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/ifnotpresent_pull_patch.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/ifnotpresent_pull_patch.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/ifnotpresent_pull_patch.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/ifnotpresent_pull_patch.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/never_pull_patch.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/never_pull_patch.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/never_pull_patch.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy/never_pull_patch.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go similarity index 95% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go index 35db77ea0..a575bbc93 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/dockerfile.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &Dockerfile{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/gitignore.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/gitignore.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/gitignore.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/gitignore.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/makefile.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/makefile.go similarity index 98% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/makefile.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/makefile.go index 7d027cddf..07ffb2a27 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/makefile.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/makefile.go @@ -166,7 +166,7 @@ ifeq (,$(shell which ansible-operator 2>/dev/null)) @{ \ set -e ;\ mkdir -p $(dir $(ANSIBLE_OPERATOR)) ;\ - curl -sSLo $(ANSIBLE_OPERATOR) https://github.com/operator-framework/operator-sdk/releases/download/{{ .AnsibleOperatorVersion }}/ansible-operator_$(OS)_$(ARCH) ;\ + curl -sSLo $(ANSIBLE_OPERATOR) https://github.com/operator-framework/ansible-operator-plugins/releases/download/{{ .AnsibleOperatorVersion }}/ansible-operator_$(OS)_$(ARCH) ;\ chmod +x $(ANSIBLE_OPERATOR) ;\ } else diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/converge.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/converge.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/converge.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/converge.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/create.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/create.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/create.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/create.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/destroy.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/destroy.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/destroy.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/destroy.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go similarity index 91% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go index c75016594..e35353d9f 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/molecule.go @@ -41,18 +41,12 @@ dependency: name: galaxy driver: name: delegated -lint: | - set -e - yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . platforms: - name: cluster groups: - k8s provisioner: name: ansible - lint: | - set -e - ansible-lint inventory: group_vars: all: @@ -69,7 +63,4 @@ provisioner: K8S_AUTH_KUBECONFIG: ${KUBECONFIG:-"~/.kube/config"} verifier: name: ansible - lint: | - set -e - ansible-lint ` diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/prepare.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/prepare.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/prepare.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/prepare.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/tasks_test_resource.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/tasks_test_resource.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/tasks_test_resource.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/tasks_test_resource.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/verify.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/verify.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/verify.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/verify.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/converge.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/converge.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/converge.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/converge.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/create.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/create.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/create.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/create.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/destroy.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/destroy.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/destroy.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/destroy.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go similarity index 92% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go index 5494d13b8..d0e6c9df9 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind/molecule.go @@ -41,9 +41,6 @@ dependency: name: galaxy driver: name: delegated -lint: | - set -e - yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . platforms: - name: cluster groups: @@ -53,9 +50,6 @@ provisioner: playbooks: prepare: ../default/prepare.yml verify: ../default/verify.yml - lint: | - set -e - ansible-lint inventory: group_vars: all: @@ -75,7 +69,4 @@ provisioner: KUBECONFIG: ${MOLECULE_EPHEMERAL_DIRECTORY}/kubeconfig verifier: name: ansible - lint: | - set -e - ansible-lint ` diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks/placeholder.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks/placeholder.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks/placeholder.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks/placeholder.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks/playbook.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks/playbook.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks/playbook.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks/playbook.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/requirements.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/requirements.go similarity index 94% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/requirements.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/requirements.go index 16fe3cb20..56798546d 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/requirements.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/requirements.go @@ -35,10 +35,8 @@ func (f *RequirementsYml) SetTemplateDefaults() error { const requirementsYmlTmpl = `--- collections: - - name: community.kubernetes - version: "2.0.1" - name: operator_sdk.util - version: "0.4.0" + version: "0.5.0" - name: kubernetes.core version: "2.4.0" - name: cloud.common diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go similarity index 93% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go index 3ce78f10b..dd25256e3 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/defaults_main.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &DefaultsMain{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go similarity index 92% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go index 736c867aa..f77124beb 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/files_dir.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &RoleFiles{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go similarity index 93% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go index 52575065f..17f7484ee 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/handlers_main.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &HandlersMain{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go similarity index 97% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go index bfc4a79f1..0a90ea5ea 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/meta_main.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &MetaMain{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/placeholder.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/placeholder.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/placeholder.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/placeholder.go diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go similarity index 96% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go index 2253824d3..1d6d90375 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/readme.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) const ReadmePath = "README.md" diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go similarity index 92% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go index b7466683b..244a872e2 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/tasks_main.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &TasksMain{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go similarity index 92% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go index db92f3a78..4ca72186f 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/templates_dir.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &RoleTemplates{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go similarity index 92% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go index ce728b0d9..2d2902f45 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles/vars_main.go @@ -19,7 +19,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/machinery" - "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants" + "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants" ) var _ machinery.Template = &VarsMain{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/watches.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/watches.go similarity index 100% rename from tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/watches.go rename to tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/watches.go diff --git a/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/plugins.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/plugins.go new file mode 100644 index 000000000..722ee1446 --- /dev/null +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/plugins.go @@ -0,0 +1,19 @@ +// Copyright 2020 The Operator-SDK 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 plugins + +// DefaultNameQualifier is the Operator SDK plugin name suffix. Appending +// this suffix to a short name, ex. "go", makes it fully qualified. +const DefaultNameQualifier = ".sdk.operatorframework.io" diff --git a/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/cleanup.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/cleanup.go new file mode 100644 index 000000000..b704ff4e5 --- /dev/null +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/cleanup.go @@ -0,0 +1,208 @@ +// Copyright 2021 The Operator-SDK Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "bytes" + "errors" + "fmt" + "os" + "path/filepath" + + kbutil "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" + + log "github.com/sirupsen/logrus" +) + +// RemoveKustomizeCRDManifests removes items in config/crd relating to CRD conversion webhooks. +func RemoveKustomizeCRDManifests() error { + + pathsToRemove := []string{ + filepath.Join("config", "crd", "kustomizeconfig.yaml"), + } + configPatchesDir := filepath.Join("config", "crd", "patches") + webhookPatchMatches, err := filepath.Glob(filepath.Join(configPatchesDir, "webhook_in_*.yaml")) + if err != nil { + return err + } + pathsToRemove = append(pathsToRemove, webhookPatchMatches...) + cainjectionPatchMatches, err := filepath.Glob(filepath.Join(configPatchesDir, "cainjection_in_*.yaml")) + if err != nil { + return err + } + pathsToRemove = append(pathsToRemove, cainjectionPatchMatches...) + for _, p := range pathsToRemove { + if err := os.RemoveAll(p); err != nil { + return err + } + } + children, err := os.ReadDir(configPatchesDir) + if err == nil && len(children) == 0 { + if err := os.RemoveAll(configPatchesDir); err != nil { + return err + } + } + return nil +} + +// UpdateKustomizationsInit updates certain parts of or removes entire kustomization.yaml files +// that are either not used by certain Init plugins or are created by preceding Init plugins. +func UpdateKustomizationsInit() error { + + defaultKFile := filepath.Join("config", "default", "kustomization.yaml") + if err := kbutil.ReplaceInFile(defaultKFile, + ` +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- ../webhook +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. +#- ../certmanager`, ""); err != nil { + return fmt.Errorf("remove %s resources: %v", defaultKFile, err) + } + + if err := kbutil.ReplaceInFile(defaultKFile, + ` +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- manager_webhook_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. +# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. +# 'CERTMANAGER' needs to be enabled to use ca injection +#- webhookcainjection_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. +# Uncomment the following replacements to add the cert-manager CA injection annotations +#replacements: +# - source: # Add cert-manager annotation to ValidatingWebhookConfiguration, MutatingWebhookConfiguration and CRDs +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.namespace # namespace of the certificate CR +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - source: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.name +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - source: # Add cert-manager annotation to the webhook Service +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.name # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 0 +# create: true +# - source: +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.namespace # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 1 +# create: true +`, ""); err != nil { + return fmt.Errorf("remove %s patch and vars blocks: %v", defaultKFile, err) + } + + return nil +} + +// UpdateKustomizationsCreateAPI updates certain parts of or removes entire kustomization.yaml files +// that are either not used by certain CreateAPI plugins or are created by preceding CreateAPI plugins. +func UpdateKustomizationsCreateAPI() error { + + crdKFile := filepath.Join("config", "crd", "kustomization.yaml") + if crdKBytes, err := os.ReadFile(crdKFile); err != nil && !errors.Is(err, os.ErrNotExist) { + log.Debugf("Error reading kustomization for substitution: %v", err) + } else if err == nil { + if bytes.Contains(crdKBytes, []byte("[WEBHOOK]")) || bytes.Contains(crdKBytes, []byte("[CERTMANAGER]")) { + if err := os.RemoveAll(crdKFile); err != nil { + log.Debugf("Error removing file prior to scaffold: %v", err) + } + } + } + + return nil +} diff --git a/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/message.go b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/message.go new file mode 100644 index 000000000..bf151c23b --- /dev/null +++ b/tools/vendor/github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util/message.go @@ -0,0 +1,20 @@ +// Copyright 2021 The Operator-SDK Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +const WarnMessageRemovalV1beta1 = "The v1beta1 API version for CRDs and Webhooks is deprecated and is no longer offered since " + + "Kubernetes 1.22. This flag will be removed in a future release. We " + + "recommend that you no longer use the v1beta1 API version" + + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22" diff --git a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion_types.go b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion_types.go index eb4d1635e..3e6d32480 100644 --- a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion_types.go +++ b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion_types.go @@ -145,11 +145,14 @@ type APIServiceDescription struct { ActionDescriptor []ActionDescriptor `json:"actionDescriptors,omitempty"` } -// APIResourceReference is a Kubernetes resource type used by a custom resource +// APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes. // +k8s:openapi-gen=true type APIResourceReference struct { - Name string `json:"name"` - Kind string `json:"kind"` + // Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource. + Name string `json:"name"` + // Kind of the referenced resource type. + Kind string `json:"kind"` + // API Version of the referenced resource type. Version string `json:"version"` } @@ -279,13 +282,34 @@ type ClusterServiceVersionSpec struct { WebhookDefinitions []WebhookDescription `json:"webhookdefinitions,omitempty"` NativeAPIs []metav1.GroupVersionKind `json:"nativeAPIs,omitempty"` MinKubeVersion string `json:"minKubeVersion,omitempty"` - DisplayName string `json:"displayName"` - Description string `json:"description,omitempty"` - Keywords []string `json:"keywords,omitempty"` - Maintainers []Maintainer `json:"maintainers,omitempty"` - Provider AppLink `json:"provider,omitempty"` - Links []AppLink `json:"links,omitempty"` - Icon []Icon `json:"icon,omitempty"` + + // The name of the operator in display format. + DisplayName string `json:"displayName"` + + // Description of the operator. Can include the features, limitations or use-cases of the + // operator. + // +optional + Description string `json:"description,omitempty"` + + // A list of keywords describing the operator. + // +optional + Keywords []string `json:"keywords,omitempty"` + + // A list of organizational entities maintaining the operator. + // +optional + Maintainers []Maintainer `json:"maintainers,omitempty"` + + // The publishing entity behind the operator. + // +optional + Provider AppLink `json:"provider,omitempty"` + + // A list of links related to the operator. + // +optional + Links []AppLink `json:"links,omitempty"` + + // The icon for this operator. + // +optional + Icon []Icon `json:"icon,omitempty"` // InstallModes specify supported installation types // +optional diff --git a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/installplan_types.go b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/installplan_types.go index 5210436d9..09deba525 100644 --- a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/installplan_types.go +++ b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/installplan_types.go @@ -239,6 +239,9 @@ const ( // BundleLookupPending describes BundleLookups that are not complete. BundleLookupPending BundleLookupConditionType = "BundleLookupPending" + // BundleLookupFailed describes conditions types for when BundleLookups fail + BundleLookupFailed BundleLookupConditionType = "BundleLookupFailed" + crdKind = "CustomResourceDefinition" ) diff --git a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/subscription_types.go b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/subscription_types.go index 900cc4657..2452f9a1c 100644 --- a/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/subscription_types.go +++ b/tools/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/subscription_types.go @@ -111,6 +111,12 @@ const ( // SubscriptionResolutionFailed indicates that the dependency resolution in the namespace in which the subscription is created has failed SubscriptionResolutionFailed SubscriptionConditionType = "ResolutionFailed" + + // SubscriptionBundleUnpacking indicates that the unpack job is currently running + SubscriptionBundleUnpacking SubscriptionConditionType = "BundleUnpacking" + + // SubscriptionBundleUnpackFailed indicates that the unpack job failed + SubscriptionBundleUnpackFailed SubscriptionConditionType = "BundleUnpackFailed" ) const ( diff --git a/tools/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go b/tools/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go index 4321a73bd..a533ffe98 100644 --- a/tools/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go +++ b/tools/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go @@ -10,6 +10,9 @@ import ( "github.com/operator-framework/api/pkg/manifests" "github.com/operator-framework/api/pkg/validation/errors" interfaces "github.com/operator-framework/api/pkg/validation/interfaces" + corev1 "k8s.io/api/core/v1" + + log "github.com/sirupsen/logrus" ) // MultipleArchitecturesValidator validates the bundle against criteria to support Multiple Architectures. For further @@ -26,11 +29,13 @@ import ( // // ### What is checked? // -// On this check, we aggregate the archetype(s) and OS(s) provided via the labels and those which are found by checking the images so that, we can check: +// On this check, we aggregate the platform architecture(s) and OS(s) provided via the labels and those which are found by checking the images so that, we can check: // // - If your CSV is missing labels // -// - If your Operator bundle specifies images which do not support all archetypes found for your Operator image(s) (probably supported by your project) +// - If your Operator bundle specifies images which do not support all architectures found for your Operator image(s) (probably supported by your project) +// +// - If your deployment spec follows the best practice of setting nodeAffinity to ensure image(s) are only scheduled on compatible platform nodes. // // Note: To better guess the case scenarios where authors might have missed the labels, the following check will verify all architectures supported by the Operator image(s). However, by looking at the CSV we are not able to ensure what is the Operator image because this info is not provided. Therefore, we know by SDK the Operator image container will be called manager. // @@ -62,8 +67,10 @@ type multiArchValidator struct { // InfraCVSOSLabels store the OS labels from // operatorframework.io/os.: supported infraCSVOSLabels []string - // allOtherImages stores the allOtherImages defined in the bundle with the platform.arch supported - allOtherImages map[string][]platform + // otherCSVDeploymentImages stores the non-manager images in the CSV deployment + otherCSVDeploymentImages map[string][]platform + // related stores the images listed in the related images section of the CSV + relatedImages map[string][]platform // managerImages stores the images that we could consider as from the manager managerImages map[string][]platform // managerImagesString stores the images only @@ -72,9 +79,11 @@ type multiArchValidator struct { managerArchs map[string]string // managerOs contains a map of the OSes found managerOs map[string]string + // imageNodeAffinity maps the image to its nodeAffinity boundaries + imageNodeAffinity map[string][]platform // Store the bundle load bundle *manifests.Bundle - // containerTool defines the container tool which will be used to inspect the allOtherImages + // containerTool defines the container tool which will be used to inspect the images containerTool string // warns stores the errors faced by the validator to return the warnings warns []error @@ -94,8 +103,13 @@ type manifestData struct { // platform store the Architecture and OS supported by the image type platform struct { - Architecture string `json:"architecture"` OS string `json:"os"` + Architecture string `json:"architecture"` +} + +// formatting for logs +func (p platform) String() string { + return fmt.Sprintf("%s/%s", p.OS, p.Architecture) } func multipleArchitecturesValidate(objs ...interface{}) (results []errors.ManifestResult) { @@ -108,6 +122,7 @@ func multipleArchitecturesValidate(objs ...interface{}) (results []errors.Manife containerTool = obj.(map[string]string)[ContainerToolsKey] if len(containerTool) > 0 { // Make lower for we compare and use it + log.Infof("Container tool set to %q", containerTool) containerTool = strings.ToLower(containerTool) break } @@ -120,6 +135,10 @@ func multipleArchitecturesValidate(objs ...interface{}) (results []errors.Manife results = append(results, validateMultiArchWith(v, containerTool)) } } + + if len(results) == 0 { + log.Error("No bundles found.") + } return results } @@ -146,7 +165,6 @@ func validateMultiArchWith(bundle *manifests.Bundle, containerTool string) error } // Performs the checks - multiArchValidator := multiArchValidator{bundle: bundle, containerTool: containerTool} multiArchValidator.validate() @@ -176,15 +194,16 @@ func validateContainerTool(containerTool string) (string, error) { // validate performs all required checks to validate the bundle against the Multiple Architecture // configuration to guess the missing labels and/or highlight what are the missing Architectures -// for the allOtherImages (for what is configured to be supported AND for what we guess that is supported +// for the images (for what is configured to be supported AND for what we guess that is supported // and just is missing a label). func (data *multiArchValidator) validate() { data.loadInfraLabelsFromCSV() data.loadImagesFromCSV() data.managerImages = data.inspectImages(data.managerImages) - data.allOtherImages = data.inspectImages(data.allOtherImages) + data.otherCSVDeploymentImages = data.inspectImages(data.otherCSVDeploymentImages) + data.relatedImages = data.inspectImages(data.relatedImages) data.loadAllPossibleArchSupported() - data.loadAllPossibleSoSupported() + data.loadAllPossibleOsSupported() data.doChecks() } @@ -205,58 +224,123 @@ func (data *multiArchValidator) loadInfraLabelsFromCSV() { } } -// loadImagesFromCSV will add all allOtherImages found in the CSV -// it will be looking for all containers allOtherImages and what is defined -// via the spec.relatedImages (required for disconnect support) +// loadImagesFromCSV will add all images found in the CSV to one of three lists +// managerImages will search for a manager container, or the default deployment images +// otherCSVDeploymentImages is for the other images in the deployment that aren't the manager +// relatedImages collects the images referenced by spec.relatedImages (required for disconnect support) func (data *multiArchValidator) loadImagesFromCSV() { // We need to try looking for the manager image so that we can // be more assertive in the guess to warning the Operator // authors that when forgotten to use add the labels // because we found images that provides more support data.managerImages = make(map[string][]platform) + + // We will store the nodeAffinity information in the CSV as we encounter it + data.imageNodeAffinity = make(map[string][]platform) + for _, v := range data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs { foundManager := false // For the default scaffold we have a container called manager for _, c := range v.Spec.Template.Spec.Containers { - if c.Name == "manager" && len(data.managerImages[c.Image]) == 0 { - data.managerImages[c.Image] = append(data.managerImages[c.Image], platform{}) + // Skip duplicate images + _, exists := data.managerImages[c.Image] + if exists { + continue + } + + // Store the manager container information for later validation + if c.Name == "manager" { + data.managerImages[c.Image] = make([]platform, 0) data.managerImagesString = append(data.managerImagesString, c.Image) foundManager = true - break } + + // Collect nodeAffinity boundaries for all images + data.imageNodeAffinity[c.Image] = append(extractNodeAffinityPlatforms(v.Spec.Template.Spec)) } + // If we do not find a container called manager then we // will add all from the Deployment Specs which is not the // kube-rbac-proxy image scaffold by default if !foundManager { for _, c := range v.Spec.Template.Spec.Containers { - if c.Name != default_container_scaffold_by_sdk && len(data.managerImages[c.Image]) == 0 { - data.managerImages[c.Image] = append(data.managerImages[c.Image], platform{}) - data.managerImagesString = append(data.managerImagesString, c.Image) + // Skip kube-rbac-proxy or already added images + _, exists := data.managerImages[c.Image] + if c.Name == default_container_scaffold_by_sdk || exists { + continue } + + data.managerImages[c.Image] = make([]platform, 0) + data.managerImagesString = append(data.managerImagesString, c.Image) } } } - data.allOtherImages = make(map[string][]platform) + data.otherCSVDeploymentImages = make(map[string][]platform) if data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs != nil { for _, v := range data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs { for _, c := range v.Spec.Template.Spec.Containers { - // If not be from manager the add - if len(data.managerImages[c.Image]) == 0 { - data.allOtherImages[c.Image] = append(data.allOtherImages[c.Image], platform{}) + // Skip images in the manager image list + _, exists := data.managerImages[c.Image] + if exists { + continue } + + data.otherCSVDeploymentImages[c.Image] = make([]platform, 0) } } } + data.relatedImages = make(map[string][]platform) for _, v := range data.bundle.CSV.Spec.RelatedImages { - data.allOtherImages[v.Image] = append(data.allOtherImages[v.Image], platform{}) + data.relatedImages[v.Image] = make([]platform, 0) + } +} + +// extractNodeAffinityPlatforms scans the deployment spec for +// affinity.nodeAffinity.requiredDuringSchedulingIngoredDringExecution.nodeSelectorTerms +// that set platform requirements for kubernetes.io/arch and kubernetes.io/os labels +func extractNodeAffinityPlatforms(spec corev1.PodSpec) []platform { + var platforms = make([]platform, 0) + if spec.Affinity == nil || + spec.Affinity.NodeAffinity == nil || + spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil || + spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms == nil { + // No platforms set + return platforms + } + + var terms = spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms + for _, t := range terms { + var arches = make([]string, 0) + var os = make([]string, 0) + + for _, e := range t.MatchExpressions { + if e.Operator != "In" { + continue + } + + if e.Key == "kubernetes.io/arch" { + arches = e.Values + continue + } else if e.Key == "kubernetes.io/os" { + os = e.Values + continue + } + } + + for _, o := range os { + for _, a := range arches { + platforms = append(platforms, platform{Architecture: a, OS: o}) + } + } } + + return platforms } // runManifestInspect executes the command for we are able to check what -// are the Architecture(s) and SO(s) supported per each image found +// are the Architecture(s) and OS(s) supported per each image found func runManifestInspect(image, tool string) (manifestInspect, error) { cmd := exec.Command(tool, "pull", image) _, err := runCommand(cmd) @@ -287,7 +371,7 @@ func runCommand(cmd *exec.Cmd) ([]byte, error) { return output, nil } -// inspectAllOtherImages will perform the required steps to inspect all allOtherImages found +// inspectImages will lookup a list of images via a container tool to get a list of supported platforms func (data *multiArchValidator) inspectImages(images map[string][]platform) map[string][]platform { for k := range images { manifest, err := runManifestInspect(k, data.containerTool) @@ -297,12 +381,12 @@ func (data *multiArchValidator) inspectImages(images map[string][]platform) map[ if err != nil { data.warns = append(data.warns, fmt.Errorf("unable to inspect the image (%s) : %s", k, err)) - // We set the Arch and SO as error for we are able to deal witth these cases further - // Se that make no sense we raise a warning to notify the user that the image - // does not provide some kind of support only because we were unable to inspect it. + // We set the Arch and OS as error so we can identify that the container inspection failed later + // We raise a warning to notify the user that the image does not provide some kind of support + // only because we were unable to inspect it. // Be aware that the validator raise warnings for all cases scenarios to let // the author knows that those were not checked at all and why. - images[k][0] = platform{"error", "error"} + images[k] = []platform{platform{"error", "error"}} continue } } @@ -325,21 +409,28 @@ func (data *multiArchValidator) doChecks() { // on the check above. The following check raise a warning when it is possible to check that the Operator // manager image(s) supports architecture(s) not defined via labels. Therefore, it shows like the labels are missing data.checkMissingLabelsForArchs() - data.checkMissingLabelsForSO() - // the following check will raise warnings when is possible to verify that the images defined in the CSV + data.checkMissingLabelsForOS() + // the following checks will raise warnings when is possible to verify that the images defined in the CSV // does not provide the same architecture(s) supported by the Operator manager or defined via the labels - data.checkMissingSupportForOtherImages() + data.checkMissingSupportForOtherImages(data.otherCSVDeploymentImages) + data.checkMissingSupportForOtherImages(data.relatedImages) + + // the following check will raise warnings when nodeAffinity isn't set to ensure that the pod spec will only + // target nodes matching the platforms (os/arch) specified in the manifest. + data.checkNodeAffinity(data.managerImages) + data.checkNodeAffinity(data.otherCSVDeploymentImages) } -// checkMissingSupportForOtherImages checks if any image is missing some arch or so found -// (probably the image should support the arch or SO ) -func (data *multiArchValidator) checkMissingSupportForOtherImages() { - for image, plaformFromImage := range data.allOtherImages { +// checkMissingSupportForOtherImages checks if any image is missing some arch or os found +// among the manager platforms. Ideally, all images should support the same platforms. +// This is called for both the non-manager CSV images and the related images +func (data *multiArchValidator) checkMissingSupportForOtherImages(images map[string][]platform) { + for image, platformFromImage := range images { listArchNotFound := []string{} for archFromList := range data.managerArchs { found := false - for _, imageData := range plaformFromImage { - // Ignore the case when the Plataform.Architecture == "error" since that means + for _, imageData := range platformFromImage { + // Ignore the case when the Platform.Architecture == "error" since that means // that was not possible to inspect the image if imageData.Architecture == "error" { found = true @@ -367,11 +458,11 @@ func (data *multiArchValidator) checkMissingSupportForOtherImages() { data.managerImagesString)) } - listAllSoNotFound := []string{} + listAllOsNotFound := []string{} for archOSList := range data.managerOs { found := false - for _, imageData := range plaformFromImage { - // Ignore the case when the Plataform.Architecture == "error" since that means + for _, imageData := range platformFromImage { + // Ignore the case when the Platform.Architecture == "error" since that means // that was not possible to inspect the image if imageData.OS == "error" { found = true @@ -384,27 +475,128 @@ func (data *multiArchValidator) checkMissingSupportForOtherImages() { } } if !found && archOSList != "error" { - listAllSoNotFound = append(listAllSoNotFound, archOSList) + listAllOsNotFound = append(listAllOsNotFound, archOSList) } } - if len(listAllSoNotFound) > 0 { - sort.Strings(listAllSoNotFound) + if len(listAllOsNotFound) > 0 { + sort.Strings(listAllOsNotFound) data.warns = append(data.warns, fmt.Errorf("check if the image %s should not support %q. "+ - "Note that this CSV has labels for this SO(s) "+ + "Note that this CSV has labels for this OS(s) "+ "Your manager image %q are providing this support OR the CSV is configured via labels "+ "to support it. Then, please verify if this image should not support it", image, - listAllSoNotFound, + listAllOsNotFound, data.managerImagesString)) } } } -// verify if 1 or more allOtherImages has support for a SO not defined via the labels -// (probably the label for this SO is missing ) -func (data *multiArchValidator) checkMissingLabelsForSO() { - notFoundSoLabel := []string{} +// checkNodeAffinity checks if any image is missing nodeAffinity configuration corresponding to +// the supports os/arch platforms in the manifest. +func (data *multiArchValidator) checkNodeAffinity(images map[string][]platform) { + for image, platformFromImage := range images { + + // Verify we were able to gather valid platform data for the image + imagePlatformDataValid := true + for _, imageData := range platformFromImage { + // Ignore the case when the Platform.Architecture == "error" since that means + // that was not possible to inspect the image + if imageData.Architecture == "error" { + imagePlatformDataValid = false + break + } + } + + // Ensure we have a node affinity configuration for the image + if len(data.imageNodeAffinity[image]) == 0 { + if !imagePlatformDataValid { + // Node affinity info is missing from CSV (or invalid) + data.warns = append(data.warns, + fmt.Errorf("check if the CSV is missing a node affinity configuration for the image: %q. "+ + image, + )) + } + + // We have valid platform data for the image but a missing or invalid affinity configuration + data.warns = append(data.warns, fmt.Errorf("check if the CSV has a missing or invalid node affinity configuration for the image: %q. "+ + "The image data suggests the following platforms are supported: %q", + image, + platformFromImage)) + + continue + } + + // We have a valid node affinity config + // Scan for extra and missing platforms + extra, missing := compareAffinityToPlatforms(data.imageNodeAffinity[image], platformFromImage) + if len(extra) == 0 && len(missing) == 0 { + // Node affinity matches exactly + continue + } + + // Warn author about extra affinities + if len(extra) != 0 { + data.warns = append(data.warns, fmt.Errorf("the CSV includes %q in the node affinity configuration for the image: %q, but "+ + "the image data suggests the following platforms are supported: %q", + extra, + image, + platformFromImage)) + } + + // Warn author about missing affinities + if len(missing) != 0 { + data.warns = append(data.warns, fmt.Errorf("the image data indicates %q is supported for the image: %q, but "+ + "the node affinity configuration for the image only specifies %q", + missing, + image, + data.imageNodeAffinity[image])) + } + } +} + +func compareAffinityToPlatforms(affinities []platform, platforms []platform) ([]platform, []platform) { + var extra = []platform{} + var missing = []platform{} + + // Find extras + for _, affinity := range affinities { + found := false + for _, platform := range platforms { + if affinity.Architecture == platform.Architecture && affinity.OS == platform.OS { + found = true + break + } + } + + if !found { + extra = append(extra, affinity) + } + } + + // Find missing + for _, platform := range platforms { + found := false + for _, affinity := range affinities { + if platform.Architecture == affinity.Architecture && platform.OS == affinity.OS { + found = true + break + } + } + + if !found { + missing = append(missing, platform) + } + } + + return extra, missing + +} + +// verify if 1 or more images have support for an OS not defined via the labels +// (probably the label for this OS is missing ) +func (data *multiArchValidator) checkMissingLabelsForOS() { + notFoundOsLabel := []string{} for supported := range data.managerOs { found := false for _, infra := range data.infraCSVOSLabels { @@ -417,29 +609,29 @@ func (data *multiArchValidator) checkMissingLabelsForSO() { if !found && supported != "error" { // if the only arch supported is linux then, we should not ask for the label if !(supported == "linux" && len(data.managerOs) == 1 && len(data.managerOs["linux"]) > 0) { - notFoundSoLabel = append(notFoundSoLabel, supported) + notFoundOsLabel = append(notFoundOsLabel, supported) } } } - if len(notFoundSoLabel) > 0 { + if len(notFoundOsLabel) > 0 { // We need to sort, otherwise it is possible verify in the tests that we have // this message as result - sort.Strings(notFoundSoLabel) + sort.Strings(notFoundOsLabel) data.warns = append(data.warns, - fmt.Errorf("check if the CSV is missing the label (%s) for the SO(s): %q. "+ + fmt.Errorf("check if the CSV is missing the label (%s) for the OS(s): %q. "+ "Be aware that your Operator manager image %q provides this support. "+ - "Thus, it is very likely that you want to provide it and if you support more than linux SO you MUST,"+ + "Thus, it is very likely that you want to provide it and if you support more than linux OS you MUST,"+ "use the required labels for all which are supported."+ "Otherwise, your solution cannot be listed on the cluster for these architectures", operatorFrameworkOSLabel, - notFoundSoLabel, + notFoundOsLabel, data.managerImagesString)) } } -// checkMissingLabelsForArchs verify if 1 or ore allOtherImages has support for a Arch not defined via the labels +// checkMissingLabelsForArchs verify if 1 or more images have support for a Arch not defined via the labels // (probably the label for this Arch is missing ) func (data *multiArchValidator) checkMissingLabelsForArchs() { notFoundArchLabel := []string{} @@ -489,26 +681,26 @@ func (data *multiArchValidator) loadAllPossibleArchSupported() { data.managerArchs["amd64"] = "amd64" } - // Get all ARCH from the provided allOtherImages + // Get all ARCH from the provided manager image(s) for _, imageData := range data.managerImages { - for _, plataform := range imageData { - if len(plataform.Architecture) > 0 { - data.managerArchs[plataform.Architecture] = plataform.Architecture + for _, platform := range imageData { + if len(platform.Architecture) > 0 { + data.managerArchs[platform.Architecture] = platform.Architecture } } } } -// loadAllPossibleSoSupported will verify all SO that this bundle can support -// for then, we aare able to check if it is missing labels. +// loadAllPossibleOsSupported will verify all OS that this bundle can support +// for then, we are able to check if it is missing labels. // Note: -// - we check what are the SO of all allOtherImages informed -// - we ensure that the linux SO will be added when none so labels were informed -// - we check all labels to know what are the SO(s) to obtain the list of them which the bundle is defining -func (data *multiArchValidator) loadAllPossibleSoSupported() { +// - we check which OS where found for manager images +// - we ensure that the linux OS will be added when none were found +// - we check all labels to know which OS(s) to obtain the bundle could define +func (data *multiArchValidator) loadAllPossibleOsSupported() { // Add the values provided via label for _, v := range data.infraCSVOSLabels { - label := extractValueFromSoLabel(v) + label := extractValueFromOsLabel(v) data.managerOs[label] = label } @@ -517,25 +709,25 @@ func (data *multiArchValidator) loadAllPossibleSoSupported() { data.managerOs["linux"] = "linux" } - // Get all SO from the provided allOtherImages + // Get all OS from the provided managerImages for _, imageData := range data.managerImages { - for _, plataform := range imageData { - if len(plataform.OS) > 0 { - data.managerOs[plataform.OS] = plataform.OS + for _, platform := range imageData { + if len(platform.OS) > 0 { + data.managerOs[platform.OS] = platform.OS } } } } -// checkSupportDefined checks if all allOtherImages supports the ARCHs and SOs defined +// checkSupportDefined checks if all images supports the ARCHs and OSs defined func (data *multiArchValidator) checkSupportDefined() { - configuredS0 := []string{} + configuredOS := []string{} if len(data.infraCSVOSLabels) == 0 { - configuredS0 = []string{"linux"} + configuredOS = []string{"linux"} } for _, label := range data.infraCSVOSLabels { - configuredS0 = append(configuredS0, extractValueFromSoLabel(label)) + configuredOS = append(configuredOS, extractValueFromOsLabel(label)) } configuredArch := []string{} @@ -548,37 +740,35 @@ func (data *multiArchValidator) checkSupportDefined() { } allSupportedConfiguration := []string{} - for _, so := range configuredS0 { + for _, os := range configuredOS { for _, arch := range configuredArch { - allSupportedConfiguration = append(allSupportedConfiguration, fmt.Sprintf("%s.%s", so, arch)) + allSupportedConfiguration = append(allSupportedConfiguration, fmt.Sprintf("%s.%s", os, arch)) } } - notFoundImgPlat := map[string][]string{} - for _, config := range allSupportedConfiguration { - for image, allPlataformFromImage := range data.managerImages { - found := false - for _, imgPlat := range allPlataformFromImage { - // Ignore the errors since they mean that was not possible to inspect - // the image - if imgPlat.OS == "error" { - found = true - break - } + var unsupported = make(map[string][]string) + appendUnsupportedConfigurations(unsupported, allSupportedConfiguration, data.managerImages) + appendUnsupportedConfigurations(unsupported, allSupportedConfiguration, data.otherCSVDeploymentImages) + appendUnsupportedConfigurations(unsupported, allSupportedConfiguration, data.relatedImages) - if config == fmt.Sprintf("%s.%s", imgPlat.OS, imgPlat.Architecture) { - found = true - break - } - } - - if !found { - notFoundImgPlat[config] = append(notFoundImgPlat[config], image) - } + if len(unsupported) > 0 { + for platform, images := range unsupported { + // Sort the images so we can check results in the tests + sort.Strings(images) + data.errors = append(data.errors, + fmt.Errorf("not all images specified are providing the support described via the CSV labels. "+ + "Note that (OS.architecture): (%s) was not found for the image(s) %s", + platform, images)) } - for image, allPlataformFromImage := range data.allOtherImages { + } +} + +// appendUnsupportedConfigurations takes a map by reference and appends any supportedConfiguration mismatches for each image provided in the images map +func appendUnsupportedConfigurations(unsupported map[string][]string, supportedConfigurations []string, images map[string][]platform) { + for _, config := range supportedConfigurations { + for image, allPlatformFromImage := range images { found := false - for _, imgPlat := range allPlataformFromImage { + for _, imgPlat := range allPlatformFromImage { // Ignore the errors since they mean that was not possible to inspect // the image if imgPlat.OS == "error" { @@ -593,25 +783,14 @@ func (data *multiArchValidator) checkSupportDefined() { } if !found { - notFoundImgPlat[config] = append(notFoundImgPlat[config], image) + unsupported[config] = append(unsupported[config], image) } } } - - if len(notFoundImgPlat) > 0 { - for platform, images := range notFoundImgPlat { - // If we not sort the allOtherImages we cannot check its result in the tests - sort.Strings(images) - data.errors = append(data.errors, - fmt.Errorf("not all images specified are providing the support described via the CSV labels. "+ - "Note that (SO.architecture): (%s) was not found for the image(s) %s", - platform, images)) - } - } } -// extractValueFromSoLabel returns only the value of the SO label (i.e. linux) -func extractValueFromSoLabel(v string) string { +// extractValueFromOsLabel returns only the value of the OS label (i.e. linux) +func extractValueFromOsLabel(v string) string { label := strings.ReplaceAll(v, operatorFrameworkOSLabel, "") return label } diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/migrate.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/migrate.go index 8cca8b897..c5880f000 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/migrate.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/migrate.go @@ -1,13 +1,10 @@ package action import ( - "bytes" "context" "fmt" - "io" "io/ioutil" "os" - "path/filepath" "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/image" @@ -17,13 +14,11 @@ type Migrate struct { CatalogRef string OutputDir string - WriteFunc WriteFunc + WriteFunc declcfg.WriteFunc FileExt string Registry image.Registry } -type WriteFunc func(config declcfg.DeclarativeConfig, w io.Writer) error - func (m Migrate) Run(ctx context.Context) error { entries, err := ioutil.ReadDir(m.OutputDir) if err != nil && !os.IsNotExist(err) { @@ -52,48 +47,5 @@ func (m Migrate) Run(ctx context.Context) error { return fmt.Errorf("render catalog image: %w", err) } - return writeToFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt) -} - -func writeToFS(cfg declcfg.DeclarativeConfig, rootDir string, writeFunc WriteFunc, fileExt string) error { - channelsByPackage := map[string][]declcfg.Channel{} - for _, c := range cfg.Channels { - channelsByPackage[c.Package] = append(channelsByPackage[c.Package], c) - } - bundlesByPackage := map[string][]declcfg.Bundle{} - for _, b := range cfg.Bundles { - bundlesByPackage[b.Package] = append(bundlesByPackage[b.Package], b) - } - - if err := os.MkdirAll(rootDir, 0777); err != nil { - return err - } - - for _, p := range cfg.Packages { - fcfg := declcfg.DeclarativeConfig{ - Packages: []declcfg.Package{p}, - Channels: channelsByPackage[p.Name], - Bundles: bundlesByPackage[p.Name], - } - pkgDir := filepath.Join(rootDir, p.Name) - if err := os.MkdirAll(pkgDir, 0777); err != nil { - return err - } - filename := filepath.Join(pkgDir, fmt.Sprintf("catalog%s", fileExt)) - if err := writeFile(fcfg, filename, writeFunc); err != nil { - return err - } - } - return nil -} - -func writeFile(cfg declcfg.DeclarativeConfig, filename string, writeFunc WriteFunc) error { - buf := &bytes.Buffer{} - if err := writeFunc(cfg, buf); err != nil { - return fmt.Errorf("write to buffer for %q: %v", filename, err) - } - if err := ioutil.WriteFile(filename, buf.Bytes(), 0666); err != nil { - return fmt.Errorf("write file %q: %v", filename, err) - } - return nil + return declcfg.WriteFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt) } diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go index 3f38390a0..b1e5bd754 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go @@ -82,7 +82,7 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { if err != nil { return nil, fmt.Errorf("render reference %q: %w", ref, err) } - renderBundleObjects(cfg) + moveBundleObjectsToEndOfPropertySlices(cfg) for _, b := range cfg.Bundles { sort.Slice(b.RelatedImages, func(i, j int) bool { @@ -122,7 +122,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla if !r.AllowedRefMask.Allowed(RefDCDir) { return nil, fmt.Errorf("cannot render declarative config directory: %w", ErrNotAllowed) } - return declcfg.LoadFS(os.DirFS(ref)) + return declcfg.LoadFS(ctx, os.DirFS(ref)) } else { // The only supported file type is an sqlite DB file, // since declarative configs will be in a directory. @@ -169,7 +169,7 @@ func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.D if !r.AllowedRefMask.Allowed(RefDCImage) { return nil, fmt.Errorf("cannot render declarative config image: %w", ErrNotAllowed) } - cfg, err = declcfg.LoadFS(os.DirFS(filepath.Join(tmpDir, configsDir))) + cfg, err = declcfg.LoadFS(ctx, os.DirFS(filepath.Join(tmpDir, configsDir))) if err != nil { return nil, err } @@ -304,6 +304,7 @@ func bundleToDeclcfg(bundle *registry.Bundle) (*declcfg.DeclarativeConfig, error if err != nil { return nil, fmt.Errorf("get related images for bundle %q: %v", bundle.Name, err) } + var csvJson []byte for _, obj := range bundle.Objects { if obj.GetKind() == "ClusterServiceVersion" { @@ -376,19 +377,21 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) { return relatedImages, nil } -func renderBundleObjects(cfg *declcfg.DeclarativeConfig) { +func moveBundleObjectsToEndOfPropertySlices(cfg *declcfg.DeclarativeConfig) { for bi, b := range cfg.Bundles { - props := b.Properties[:0] + var ( + others []property.Property + objs []property.Property + ) for _, p := range b.Properties { - if p.Type != property.TypeBundleObject { - props = append(props, p) + switch p.Type { + case property.TypeBundleObject, property.TypeCSVMetadata: + objs = append(objs, p) + default: + others = append(others, p) } } - - for _, obj := range b.Objects { - props = append(props, property.MustBuildBundleObjectData([]byte(obj))) - } - cfg.Bundles[bi].Properties = props + cfg.Bundles[bi].Properties = append(others, objs...) } } diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go index d575987b1..994d47a0b 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go @@ -1,7 +1,14 @@ package declcfg import ( + "bytes" "encoding/json" + "errors" + "fmt" + + "golang.org/x/text/cases" + utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/sets" "github.com/operator-framework/operator-registry/alpha/property" ) @@ -84,6 +91,7 @@ type RelatedImage struct { type Meta struct { Schema string Package string + Name string Blob json.RawMessage } @@ -93,17 +101,81 @@ func (m Meta) MarshalJSON() ([]byte, error) { } func (m *Meta) UnmarshalJSON(blob []byte) error { - type tmp struct { - Schema string `json:"schema"` - Package string `json:"package,omitempty"` - Properties []property.Property `json:"properties,omitempty"` + blobMap := map[string]interface{}{} + if err := json.Unmarshal(blob, &blobMap); err != nil { + // TODO: unfortunately, there are libraries between here and the original caller + // that eat our error type and return a generic error, such that we lose the + // ability to errors.As to get this error on the other side. For now, just return + // a string error that includes the pretty printed message. + return errors.New(newJSONUnmarshalError(blob, err).Pretty()) } - var t tmp - if err := json.Unmarshal(blob, &t); err != nil { + + // TODO: this function ensures we do not break backwards compatibility with + // the documented examples of FBC templates, which use upper camel case + // for JSON field names. We need to decide if we want to continue supporting + // case insensitive JSON field names, or if we want to enforce a specific + // case-sensitive key value for each field. + if err := extractUniqueMetaKeys(blobMap, m); err != nil { + return err + } + + buf := bytes.Buffer{} + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(blobMap); err != nil { return err } - m.Schema = t.Schema - m.Package = t.Package - m.Blob = blob + m.Blob = buf.Bytes() + return nil +} + +// extractUniqueMetaKeys enables a case-insensitive key lookup for the schema, package, and name +// fields of the Meta struct. If the blobMap contains duplicate keys (that is, keys have the same folded value), +// an error is returned. +func extractUniqueMetaKeys(blobMap map[string]any, m *Meta) error { + keySets := map[string]sets.Set[string]{} + folder := cases.Fold() + for key := range blobMap { + foldKey := folder.String(key) + if _, ok := keySets[foldKey]; !ok { + keySets[foldKey] = sets.New[string]() + } + keySets[foldKey].Insert(key) + } + + dupErrs := []error{} + for foldedKey, keys := range keySets { + if len(keys) != 1 { + dupErrs = append(dupErrs, fmt.Errorf("duplicate keys for key %q: %v", foldedKey, sets.List(keys))) + } + } + if len(dupErrs) > 0 { + return utilerrors.NewAggregate(dupErrs) + } + + metaMap := map[string]*string{ + folder.String("schema"): &m.Schema, + folder.String("package"): &m.Package, + folder.String("name"): &m.Name, + } + + for foldedKey, ptr := range metaMap { + // if the folded key doesn't exist in the key set derived from the blobMap, that means + // the key doesn't exist in the blobMap, so we can skip it + if _, ok := keySets[foldedKey]; !ok { + continue + } + + // reset key to the unfolded key, which we know is the one that appears in the blobMap + key := keySets[foldedKey].UnsortedList()[0] + if _, ok := blobMap[key]; !ok { + continue + } + v, ok := blobMap[key].(string) + if !ok { + return fmt.Errorf("expected value for key %q to be a string, got %t: %v", key, blobMap[key], blobMap[key]) + } + *ptr = v + } return nil } diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/errors.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/errors.go new file mode 100644 index 000000000..f5ef11523 --- /dev/null +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/errors.go @@ -0,0 +1,93 @@ +package declcfg + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "strings" +) + +type jsonUnmarshalError struct { + data []byte + offset int64 + err error +} + +func newJSONUnmarshalError(data []byte, err error) *jsonUnmarshalError { + var te *json.UnmarshalTypeError + if errors.As(err, &te) { + return &jsonUnmarshalError{data: data, offset: te.Offset, err: te} + } + var se *json.SyntaxError + if errors.As(err, &se) { + return &jsonUnmarshalError{data: data, offset: se.Offset, err: se} + } + return &jsonUnmarshalError{data: data, offset: -1, err: err} +} + +func (e *jsonUnmarshalError) Error() string { + return e.err.Error() +} + +func (e *jsonUnmarshalError) Pretty() string { + if len(e.data) == 0 || e.offset < 0 || e.offset > int64(len(e.data)) { + return e.err.Error() + } + + const marker = " <==" + + var sb strings.Builder + _, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by%s)\n", e.err.Error(), e.offset, marker)) + + prettyBuf := bytes.NewBuffer(make([]byte, 0, len(e.data))) + err := json.Indent(prettyBuf, e.data, "", " ") + + // If there was an error indenting the JSON, just treat the original data as the pretty data. + if err != nil { + prettyBuf = bytes.NewBuffer(e.data) + } + + // If the offset is at the end of the data, just print the pretty data and the marker at the end. + if int(e.offset) == len(e.data) { + _, _ = sb.WriteString(prettyBuf.String()) + _, _ = sb.WriteString(marker) + return sb.String() + } + + // If the offset is within the data, find the corresponding offset in the pretty data. + var ( + pIndex int + pOffset int + ) + pretty := prettyBuf.Bytes() + for dIndex, b := range e.data { + // If we've reached the offset, record it and break out of the loop + if dIndex == int(e.offset) { + pOffset = pIndex + break + } + + // Fast-forward the pretty index until we find the byte in the pretty data + // that matches the byte in the original data. + for pretty[pIndex] != b { + pIndex++ + if pIndex >= len(pretty) { + // Something went wrong. For example, if the pretty data somehow reordered + // the bytes or is missing a byte + return e.err.Error() + } + } + + // We found the byte in the pretty data that matches the byte in the original data, + // so increment the pretty index. + pIndex++ + + } + + _, _ = sb.Write(pretty[:pOffset]) + _, _ = sb.WriteString(fmt.Sprintf("%s ", marker)) + _, _ = sb.Write(pretty[pOffset:]) + + return sb.String() +} diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go index 98b25da02..43864f792 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go @@ -1,17 +1,19 @@ package declcfg import ( - "bytes" + "context" "encoding/json" "errors" "fmt" "io" "io/fs" "path/filepath" - "strings" + "runtime" + "sync" "github.com/joelanford/ignore" "github.com/operator-framework/api/pkg/operators" + "golang.org/x/sync/errgroup" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/yaml" @@ -22,6 +24,46 @@ const ( indexIgnoreFilename = ".indexignore" ) +type WalkMetasFSFunc func(path string, meta *Meta, err error) error + +func WalkMetasFS(root fs.FS, walkFn WalkMetasFSFunc) error { + return walkFiles(root, func(root fs.FS, path string, err error) error { + if err != nil { + return walkFn(path, nil, err) + } + + f, err := root.Open(path) + if err != nil { + return walkFn(path, nil, err) + } + defer f.Close() + + return WalkMetasReader(f, func(meta *Meta, err error) error { + return walkFn(path, meta, err) + }) + }) +} + +type WalkMetasReaderFunc func(meta *Meta, err error) error + +func WalkMetasReader(r io.Reader, walkFn WalkMetasReaderFunc) error { + dec := yaml.NewYAMLOrJSONDecoder(r, 4096) + for { + var in Meta + if err := dec.Decode(&in); err != nil { + if errors.Is(err, io.EOF) { + break + } + return walkFn(nil, err) + } + + if err := walkFn(&in, nil); err != nil { + return err + } + } + return nil +} + type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error // WalkFS walks root using a gitignore-style filename matcher to skip files @@ -29,6 +71,21 @@ type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error // It calls walkFn for each declarative config file it finds. If WalkFS encounters // an error loading or parsing any file, the error will be immediately returned. func WalkFS(root fs.FS, walkFn WalkFunc) error { + return walkFiles(root, func(root fs.FS, path string, err error) error { + if err != nil { + return walkFn(path, nil, err) + } + + cfg, err := LoadFile(root, path) + if err != nil { + return walkFn(path, cfg, err) + } + + return walkFn(path, cfg, nil) + }) +} + +func walkFiles(root fs.FS, fn func(root fs.FS, path string, err error) error) error { if root == nil { return fmt.Errorf("no declarative config filesystem provided") } @@ -40,7 +97,7 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { return fs.WalkDir(root, ".", func(path string, info fs.DirEntry, err error) error { if err != nil { - return walkFn(path, nil, err) + return fn(root, path, err) } // avoid validating a directory, an .indexignore file, or any file that matches // an ignore pattern outlined in a .indexignore file. @@ -48,35 +105,136 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { return nil } - cfg, err := LoadFile(root, path) - if err != nil { - return walkFn(path, cfg, err) - } - - return walkFn(path, cfg, err) + return fn(root, path, nil) }) } +type LoadOptions struct { + concurrency int +} + +type LoadOption func(*LoadOptions) + +func WithConcurrency(concurrency int) LoadOption { + return func(opts *LoadOptions) { + opts.concurrency = concurrency + } +} + // LoadFS loads a declarative config from the provided root FS. LoadFS walks the // filesystem from root and uses a gitignore-style filename matcher to skip files // that match patterns found in .indexignore files found throughout the filesystem. // If LoadFS encounters an error loading or parsing any file, the error will be // immediately returned. -func LoadFS(root fs.FS) (*DeclarativeConfig, error) { - cfg := &DeclarativeConfig{} - if err := WalkFS(root, func(path string, fcfg *DeclarativeConfig, err error) error { +func LoadFS(ctx context.Context, root fs.FS, opts ...LoadOption) (*DeclarativeConfig, error) { + if root == nil { + return nil, fmt.Errorf("no declarative config filesystem provided") + } + + options := LoadOptions{ + concurrency: runtime.NumCPU(), + } + for _, opt := range opts { + opt(&options) + } + + var ( + fcfg = &DeclarativeConfig{} + pathChan = make(chan string, options.concurrency) + cfgChan = make(chan *DeclarativeConfig, options.concurrency) + ) + + // Create an errgroup to manage goroutines. The context is closed when any + // goroutine returns an error. Goroutines should check the context + // to see if they should return early (in the case of another goroutine + // returning an error). + eg, ctx := errgroup.WithContext(ctx) + + // Walk the FS and send paths to a channel for parsing. + eg.Go(func() error { + return sendPaths(ctx, root, pathChan) + }) + + // Parse paths concurrently. The waitgroup ensures that all paths are parsed + // before the cfgChan is closed. + var wg sync.WaitGroup + for i := 0; i < options.concurrency; i++ { + wg.Add(1) + eg.Go(func() error { + defer wg.Done() + return parsePaths(ctx, root, pathChan, cfgChan) + }) + } + + // Merge parsed configs into a single config. + eg.Go(func() error { + return mergeCfgs(ctx, cfgChan, fcfg) + }) + + // Wait for all path parsing goroutines to finish before closing cfgChan. + wg.Wait() + close(cfgChan) + + // Wait for all goroutines to finish. + if err := eg.Wait(); err != nil { + return nil, err + } + return fcfg, nil +} + +func sendPaths(ctx context.Context, root fs.FS, pathChan chan<- string) error { + defer close(pathChan) + return walkFiles(root, func(_ fs.FS, path string, err error) error { if err != nil { return err } - cfg.Packages = append(cfg.Packages, fcfg.Packages...) - cfg.Channels = append(cfg.Channels, fcfg.Channels...) - cfg.Bundles = append(cfg.Bundles, fcfg.Bundles...) - cfg.Others = append(cfg.Others, fcfg.Others...) + select { + case pathChan <- path: + case <-ctx.Done(): // don't block on sending to pathChan + return ctx.Err() + } return nil - }); err != nil { - return nil, err + }) +} + +func parsePaths(ctx context.Context, root fs.FS, pathChan <-chan string, cfgChan chan<- *DeclarativeConfig) error { + for { + select { + case <-ctx.Done(): // don't block on receiving from pathChan + return ctx.Err() + case path, ok := <-pathChan: + if !ok { + return nil + } + cfg, err := LoadFile(root, path) + if err != nil { + return err + } + select { + case cfgChan <- cfg: + case <-ctx.Done(): // don't block on sending to cfgChan + return ctx.Err() + } + } + } +} + +func mergeCfgs(ctx context.Context, cfgChan <-chan *DeclarativeConfig, fcfg *DeclarativeConfig) error { + for { + select { + case <-ctx.Done(): // don't block on receiving from cfgChan + return ctx.Err() + case cfg, ok := <-cfgChan: + if !ok { + return nil + } + fcfg.Packages = append(fcfg.Packages, cfg.Packages...) + fcfg.Channels = append(fcfg.Channels, cfg.Channels...) + fcfg.Bundles = append(fcfg.Bundles, cfg.Bundles...) + fcfg.Others = append(fcfg.Others, cfg.Others...) + } + } - return cfg, nil } func readBundleObjects(bundles []Bundle, root fs.FS, path string) error { @@ -123,46 +281,38 @@ func extractCSV(objs []string) string { // Path references will not be de-referenced so callers are responsible for de-referencing if necessary. func LoadReader(r io.Reader) (*DeclarativeConfig, error) { cfg := &DeclarativeConfig{} - dec := yaml.NewYAMLOrJSONDecoder(r, 4096) - for { - doc := json.RawMessage{} - if err := dec.Decode(&doc); err != nil { - if errors.Is(err, io.EOF) { - break - } - return nil, err - } - doc = []byte(strings.NewReplacer(`\u003c`, "<", `\u003e`, ">", `\u0026`, "&").Replace(string(doc))) - var in Meta - if err := json.Unmarshal(doc, &in); err != nil { - return nil, fmt.Errorf("unmarshal error: %s", resolveUnmarshalErr(doc, err)) + if err := WalkMetasReader(r, func(in *Meta, err error) error { + if err != nil { + return err } - switch in.Schema { case SchemaPackage: var p Package - if err := json.Unmarshal(doc, &p); err != nil { - return nil, fmt.Errorf("parse package: %v", err) + if err := json.Unmarshal(in.Blob, &p); err != nil { + return fmt.Errorf("parse package: %v", err) } cfg.Packages = append(cfg.Packages, p) case SchemaChannel: var c Channel - if err := json.Unmarshal(doc, &c); err != nil { - return nil, fmt.Errorf("parse channel: %v", err) + if err := json.Unmarshal(in.Blob, &c); err != nil { + return fmt.Errorf("parse channel: %v", err) } cfg.Channels = append(cfg.Channels, c) case SchemaBundle: var b Bundle - if err := json.Unmarshal(doc, &b); err != nil { - return nil, fmt.Errorf("parse bundle: %v", err) + if err := json.Unmarshal(in.Blob, &b); err != nil { + return fmt.Errorf("parse bundle: %v", err) } cfg.Bundles = append(cfg.Bundles, b) case "": - return nil, fmt.Errorf("object '%s' is missing root schema field", string(doc)) + return fmt.Errorf("object '%s' is missing root schema field", string(in.Blob)) default: - cfg.Others = append(cfg.Others, in) + cfg.Others = append(cfg.Others, *in) } + return nil + }); err != nil { + return nil, err } return cfg, nil } @@ -187,47 +337,3 @@ func LoadFile(root fs.FS, path string) (*DeclarativeConfig, error) { return cfg, nil } - -func resolveUnmarshalErr(data []byte, err error) string { - var te *json.UnmarshalTypeError - if errors.As(err, &te) { - return formatUnmarshallErrorString(data, te.Error(), te.Offset) - } - var se *json.SyntaxError - if errors.As(err, &se) { - return formatUnmarshallErrorString(data, se.Error(), se.Offset) - } - return err.Error() -} - -func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) string { - sb := new(strings.Builder) - _, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by <==)\n ", errmsg, offset)) - // attempt to present the erroneous JSON in indented, human-readable format - // errors result in presenting the original, unformatted output - var pretty bytes.Buffer - err := json.Indent(&pretty, data, "", " ") - if err == nil { - pString := pretty.String() - // calc the prettified string offset which correlates to the original string offset - var pOffset, origOffset int64 - origOffset = 0 - for origOffset = 0; origOffset < offset; { - pOffset++ - if pString[pOffset] != '\n' && pString[pOffset] != ' ' { - origOffset++ - } - } - _, _ = sb.WriteString(pString[:pOffset]) - _, _ = sb.WriteString(" <== ") - _, _ = sb.WriteString(pString[pOffset:]) - } else { - for i := int64(0); i < offset; i++ { - _ = sb.WriteByte(data[i]) - } - _, _ = sb.WriteString(" <== ") - _, _ = sb.Write(data[offset:]) - } - - return sb.String() -} diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go index c2d869905..2f149e5af 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go @@ -6,13 +6,15 @@ import ( "fmt" "io" "os" + "path/filepath" "sort" "strings" "github.com/blang/semver/v4" - "github.com/operator-framework/operator-registry/alpha/property" "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/yaml" + + "github.com/operator-framework/operator-registry/alpha/property" ) type MermaidWriter struct { @@ -425,3 +427,48 @@ func writeToEncoder(cfg DeclarativeConfig, enc encoder) error { } return nil } + +type WriteFunc func(config DeclarativeConfig, w io.Writer) error + +func WriteFS(cfg DeclarativeConfig, rootDir string, writeFunc WriteFunc, fileExt string) error { + channelsByPackage := map[string][]Channel{} + for _, c := range cfg.Channels { + channelsByPackage[c.Package] = append(channelsByPackage[c.Package], c) + } + bundlesByPackage := map[string][]Bundle{} + for _, b := range cfg.Bundles { + bundlesByPackage[b.Package] = append(bundlesByPackage[b.Package], b) + } + + if err := os.MkdirAll(rootDir, 0777); err != nil { + return err + } + + for _, p := range cfg.Packages { + fcfg := DeclarativeConfig{ + Packages: []Package{p}, + Channels: channelsByPackage[p.Name], + Bundles: bundlesByPackage[p.Name], + } + pkgDir := filepath.Join(rootDir, p.Name) + if err := os.MkdirAll(pkgDir, 0777); err != nil { + return err + } + filename := filepath.Join(pkgDir, fmt.Sprintf("catalog%s", fileExt)) + if err := writeFile(fcfg, filename, writeFunc); err != nil { + return err + } + } + return nil +} + +func writeFile(cfg DeclarativeConfig, filename string, writeFunc WriteFunc) error { + buf := &bytes.Buffer{} + if err := writeFunc(cfg, buf); err != nil { + return fmt.Errorf("write to buffer for %q: %v", filename, err) + } + if err := os.WriteFile(filename, buf.Bytes(), 0666); err != nil { + return fmt.Errorf("write file %q: %v", filename, err) + } + return nil +} diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/property.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/property.go index 9ccd0f14b..5cb876846 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/property.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/property.go @@ -9,6 +9,9 @@ import ( "io/ioutil" "path/filepath" "reflect" + + "github.com/operator-framework/api/pkg/operators/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Property struct { @@ -70,6 +73,23 @@ type BundleObject struct { File `json:",inline"` } +type CSVMetadata struct { + Annotations map[string]string `json:"annotations,omitempty"` + APIServiceDefinitions v1alpha1.APIServiceDefinitions `json:"apiServiceDefinitions,omitempty"` + CustomResourceDefinitions v1alpha1.CustomResourceDefinitions `json:"crdDescriptions,omitempty"` + Description string `json:"description,omitempty"` + DisplayName string `json:"displayName,omitempty"` + InstallModes []v1alpha1.InstallMode `json:"installModes,omitempty"` + Keywords []string `json:"keywords,omitempty"` + Labels map[string]string `json:"labels,omitempty"` + Links []v1alpha1.AppLink `json:"links,omitempty"` + Maintainers []v1alpha1.Maintainer `json:"maintainers,omitempty"` + Maturity string `json:"maturity,omitempty"` + MinKubeVersion string `json:"minKubeVersion,omitempty"` + NativeAPIs []metav1.GroupVersionKind `json:"nativeAPIs,omitempty"` + Provider v1alpha1.AppLink `json:"provider,omitempty"` +} + type File struct { ref string data []byte @@ -129,6 +149,7 @@ type Properties struct { GVKsRequired []GVKRequired `hash:"set"` BundleObjects []BundleObject `hash:"set"` Channels []Channel `hash:"set"` + CSVMetadatas []CSVMetadata `hash:"set"` Others []Property `hash:"set"` } @@ -139,6 +160,7 @@ const ( TypeGVK = "olm.gvk" TypeGVKRequired = "olm.gvk.required" TypeBundleObject = "olm.bundle.object" + TypeCSVMetadata = "olm.csv.metadata" TypeChannel = "olm.channel" ) @@ -176,6 +198,12 @@ func Parse(in []Property) (*Properties, error) { return nil, ParseError{Idx: i, Typ: prop.Type, Err: err} } out.BundleObjects = append(out.BundleObjects, p) + case TypeCSVMetadata: + var p CSVMetadata + if err := json.Unmarshal(prop.Value, &p); err != nil { + return nil, ParseError{Idx: i, Typ: prop.Type, Err: err} + } + out.CSVMetadatas = append(out.CSVMetadatas, p) // NOTICE: The Channel properties are for internal use only. // DO NOT use it for any public-facing functionalities. // This API is in alpha stage and it is subject to change. @@ -287,6 +315,25 @@ func MustBuildBundleObjectData(data []byte) Property { return MustBuild(&BundleObject{File: File{data: data}}) } +func MustBuildCSVMetadata(csv v1alpha1.ClusterServiceVersion) Property { + return MustBuild(&CSVMetadata{ + Annotations: csv.GetAnnotations(), + APIServiceDefinitions: csv.Spec.APIServiceDefinitions, + CustomResourceDefinitions: csv.Spec.CustomResourceDefinitions, + Description: csv.Spec.Description, + DisplayName: csv.Spec.DisplayName, + InstallModes: csv.Spec.InstallModes, + Keywords: csv.Spec.Keywords, + Labels: csv.GetLabels(), + Links: csv.Spec.Links, + Maintainers: csv.Spec.Maintainers, + Maturity: csv.Spec.Maturity, + MinKubeVersion: csv.Spec.MinKubeVersion, + NativeAPIs: csv.Spec.NativeAPIs, + Provider: csv.Spec.Provider, + }) +} + // NOTICE: The Channel properties are for internal use only. // // DO NOT use it for any public-facing functionalities. diff --git a/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go b/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go index 28d8a5d14..ab176856f 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go @@ -12,6 +12,7 @@ func init() { reflect.TypeOf(&GVK{}): TypeGVK, reflect.TypeOf(&GVKRequired{}): TypeGVKRequired, reflect.TypeOf(&BundleObject{}): TypeBundleObject, + reflect.TypeOf(&CSVMetadata{}): TypeCSVMetadata, // NOTICE: The Channel properties are for internal use only. // DO NOT use it for any public-facing functionalities. // This API is in alpha stage and it is subject to change. diff --git a/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go b/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go index d203f40b4..06645f7c6 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go @@ -5,6 +5,8 @@ import ( "fmt" "sort" + "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/alpha/property" ) @@ -106,8 +108,17 @@ func convertAPIBundleToModelProperties(b *Bundle) ([]property.Property, error) { out = append(out, property.MustBuildGVKRequired(p.Group, p.Version, p.Kind)) } - for _, obj := range b.Object { - out = append(out, property.MustBuildBundleObjectData([]byte(obj))) + // If there is a bundle image reference and a valid CSV, create an + // olm.csv.metadata property. Otherwise, create a bundle object property for + // each object in the bundle. + var csv v1alpha1.ClusterServiceVersion + csvErr := json.Unmarshal([]byte(b.CsvJson), &csv) + if csvErr == nil && b.BundlePath != "" { + out = append(out, property.MustBuildCSVMetadata(csv)) + } else { + for _, obj := range b.Object { + out = append(out, property.MustBuildBundleObjectData([]byte(obj))) + } } sort.Slice(out, func(i, j int) bool { diff --git a/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go b/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go index 26f8b745c..1abe1cf6b 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go @@ -1,9 +1,15 @@ package api import ( + "encoding/base64" "encoding/json" "fmt" + "github.com/operator-framework/api/pkg/lib/version" + "github.com/operator-framework/api/pkg/operators" + "github.com/operator-framework/api/pkg/operators/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/alpha/property" ) @@ -14,6 +20,38 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) { return nil, fmt.Errorf("parse properties: %v", err) } + csvJson := b.CsvJSON + if csvJson == "" && len(props.CSVMetadatas) == 1 { + var icons []v1alpha1.Icon + if b.Package.Icon != nil { + icons = []v1alpha1.Icon{{ + Data: base64.StdEncoding.EncodeToString(b.Package.Icon.Data), + MediaType: b.Package.Icon.MediaType, + }} + } + csv := csvMetadataToCsv(props.CSVMetadatas[0]) + csv.Name = b.Name + csv.Spec.Icon = icons + csv.Spec.InstallStrategy = v1alpha1.NamedInstallStrategy{ + // This stub is required to avoid a panic in OLM's package server that results in + // attemptint to write to a nil map. + StrategyName: "deployment", + } + csv.Spec.Version = version.OperatorVersion{b.Version} + csv.Spec.RelatedImages = convertModelRelatedImagesToCSVRelatedImages(b.RelatedImages) + if csv.Spec.Description == "" { + csv.Spec.Description = b.Package.Description + } + csvData, err := json.Marshal(csv) + if err != nil { + return nil, err + } + csvJson = string(csvData) + if len(b.Objects) == 0 { + b.Objects = []string{csvJson} + } + } + apiDeps, err := convertModelPropertiesToAPIDependencies(b.Properties) if err != nil { return nil, fmt.Errorf("convert model properties to api dependencies: %v", err) @@ -31,7 +69,7 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) { Properties: convertModelPropertiesToAPIProperties(b.Properties), Replaces: b.Replaces, Skips: b.Skips, - CsvJson: b.CsvJSON, + CsvJson: csvJson, Object: b.Objects, }, nil } @@ -46,9 +84,40 @@ func parseProperties(in []property.Property) (*property.Properties, error) { return nil, fmt.Errorf("expected exactly 1 property of type %q, found %d", property.TypePackage, len(props.Packages)) } + if len(props.CSVMetadatas) > 1 { + return nil, fmt.Errorf("expected at most 1 property of type %q, found %d", property.TypeCSVMetadata, len(props.CSVMetadatas)) + } + return props, nil } +func csvMetadataToCsv(m property.CSVMetadata) v1alpha1.ClusterServiceVersion { + return v1alpha1.ClusterServiceVersion{ + TypeMeta: metav1.TypeMeta{ + Kind: operators.ClusterServiceVersionKind, + APIVersion: v1alpha1.ClusterServiceVersionAPIVersion, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: m.Annotations, + Labels: m.Labels, + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + APIServiceDefinitions: m.APIServiceDefinitions, + CustomResourceDefinitions: m.CustomResourceDefinitions, + Description: m.Description, + DisplayName: m.DisplayName, + InstallModes: m.InstallModes, + Keywords: m.Keywords, + Links: m.Links, + Maintainers: m.Maintainers, + Maturity: m.Maturity, + MinKubeVersion: m.MinKubeVersion, + NativeAPIs: m.NativeAPIs, + Provider: m.Provider, + }, + } +} + func gvksProvidedtoAPIGVKs(in []property.GVK) []*GroupVersionKind { var out []*GroupVersionKind for _, gvk := range in { @@ -82,7 +151,7 @@ func convertModelPropertiesToAPIProperties(props []property.Property) []*Propert // in its `Data` field, this CSV annotation projection would cause the size of the on-cluster // CSV to at least double, which is untenable since CSVs already have known issues running up // against etcd size constraints. - if prop.Type == property.TypeBundleObject { + if prop.Type == property.TypeBundleObject || prop.Type == property.TypeCSVMetadata { continue } @@ -117,3 +186,14 @@ func convertModelPropertiesToAPIDependencies(props []property.Property) ([]*Depe } return out, nil } + +func convertModelRelatedImagesToCSVRelatedImages(in []model.RelatedImage) []v1alpha1.RelatedImage { + var out []v1alpha1.RelatedImage + for _, ri := range in { + out = append(out, v1alpha1.RelatedImage{ + Name: ri.Name, + Image: ri.Image, + }) + } + return out +} diff --git a/tools/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go b/tools/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go index 14b6e7b00..869b8a5c7 100644 --- a/tools/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go +++ b/tools/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go @@ -5,6 +5,9 @@ import ( "fmt" "sort" + "github.com/operator-framework/api/pkg/operators" + "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-registry/alpha/property" ) @@ -99,8 +102,21 @@ func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, e if err != nil { return nil, nil, fmt.Errorf("marshal object %s/%s (%s) to json: %v", obj.GetName(), obj.GetNamespace(), obj.GroupVersionKind(), err) } - props = append(props, property.MustBuildBundleObjectData(objData)) objects = append(objects, string(objData)) + + // Make an olm.bundle.object property if there is no bundle image set. + // Otherwise, make a olm.csv.metadata property if the object is a CSV + // (and fallback to olm.bundle.object if parsing the CSV fails). + if b.BundleImage == "" { + props = append(props, property.MustBuildBundleObjectData(objData)) + } else if obj.GetKind() == operators.ClusterServiceVersionKind { + var csv v1alpha1.ClusterServiceVersion + if err := json.Unmarshal(objData, &csv); err != nil { + props = append(props, property.MustBuildBundleObjectData(objData)) + } else { + props = append(props, property.MustBuildCSVMetadata(csv)) + } + } } if packageProvidedProperty == nil { diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/annotations/metrics/metrics.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/annotations/metrics/metrics.go index fa3645902..6307e5fae 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/annotations/metrics/metrics.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/annotations/metrics/metrics.go @@ -49,7 +49,7 @@ func MakeBundleMetadataLabels(layout string) map[string]string { } } -// MakeObjectAnnotations returns the SDK metric annotations which will be added +// MakeBundleObjectAnnotations returns the SDK metric annotations which will be added // to CustomResourceDefinitions and ClusterServiceVersions. func MakeBundleObjectAnnotations(layout string) map[string]string { return map[string]string{ diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go index 7b44d1b52..3654e0f38 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go @@ -1,11 +1,11 @@ // Code generated for package olm by go-bindata DO NOT EDIT. (@generated) // sources: -// olm-manifests/0.22.0-crds.yaml -// olm-manifests/0.22.0-olm.yaml // olm-manifests/0.23.1-crds.yaml // olm-manifests/0.23.1-olm.yaml // olm-manifests/0.24.0-crds.yaml // olm-manifests/0.24.0-olm.yaml +// olm-manifests/0.25.0-crds.yaml +// olm-manifests/0.25.0-olm.yaml package olm import ( @@ -82,122 +82,122 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _olmManifests0220CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\xdb\xfa\xb6\xcd\x72\x6d\x27\xf1\x2f\x33\x1e\x2d\xdb\x49\x6f\xef\xcc\x9c\x14\x22\xb7\x24\xd4\x24\xc0\x02\xa0\x6c\xf5\xe4\x7c\xf7\xbb\xb0\xf1\x20\xa9\x97\x25\x91\x1e\xcb\x1e\xa2\x6b\x35\x63\x91\x04\xc1\x8d\x8d\xfd\x7e\x74\xbb\xdd\xdf\xd0\x8c\xfd\x0c\x52\x31\xc1\x8f\x09\xcd\x18\xdc\x6b\xe0\xe6\x2f\xd5\xbb\xfd\x83\xea\x31\x71\x34\x79\xfd\x9b\x5b\xc6\xe3\x63\x72\x9a\x2b\x2d\xd2\x2b\x50\x22\x97\x11\x9c\xc1\x90\x71\xa6\x99\xe0\xbf\x49\x41\xd3\x98\x6a\x7a\xfc\x1b\x42\x28\xe7\x42\x53\xf3\xb3\x32\x7f\x12\x12\x09\xae\xa5\x48\x12\x90\xdd\x11\xf0\xde\x6d\x3e\x80\x41\xce\x92\x18\x24\x4e\xee\x5f\x3d\x79\xd5\xfb\x43\xef\xd5\x6f\x08\x89\x24\xe0\xe3\x37\x2c\x05\xa5\x69\x9a\x1d\x13\x9e\x27\xc9\x6f\x08\xe1\x34\x85\x63\x12\x51\x4d\x13\x31\xb2\x8b\x50\x3d\x91\x81\xa4\x5a\x48\xd5\x8b\x84\x04\x61\xfe\x93\xfe\x46\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\xd7\xf8\x5a\xfc\x3d\x61\x4a\xff\x38\x7f\xed\x0d\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xdf\x10\xa2\x22\x91\xc1\x31\xc1\x47\x33\x1a\x41\xfc\x1b\x42\x1c\x08\xdd\x54\x5d\x42\xe3\x18\xb7\x85\x26\x7d\xc9\xb8\x06\x79\x2a\x92\x3c\xe5\xe1\x55\xe6\x9e\x18\x54\x24\x59\xa6\x11\xf4\x37\x63\x20\x99\x04\xad\xa7\x08\x12\x22\x86\x44\x8f\xc1\xbf\x3b\x3c\x45\xc8\x3f\x95\xe0\x7d\xaa\xc7\xc7\xa4\x67\x20\xdc\x8b\x99\xca\x12\x3a\x35\xab\x29\xdd\x65\xb7\xe9\xcc\x5e\x2b\xfd\xae\xa7\x66\xe9\x4a\x4b\xc6\x47\xab\x96\x62\xee\x5b\x7f\x0d\x16\x34\x37\xd3\x6c\x7e\x09\x33\x3f\xae\xfb\xfe\x2c\x1f\x24\x4c\x8d\x41\xae\xbf\x88\xf0\xc8\xdc\x1a\xfa\x0b\xae\x2c\x59\x48\x69\x52\x7f\xa0\x7a\x73\x87\x61\xee\x05\x27\xa3\xf9\x6f\x8c\xa9\xf6\x3f\xda\x9b\x26\xaf\x69\x92\x8d\xe9\x6b\xf7\xa3\x8a\xc6\x90\xd2\x02\x1f\x44\x06\xfc\xa4\x7f\xf1\xf3\xd7\xd7\x33\x17\x48\x15\x3a\x15\x3c\x27\x4c\x11\x4a\x24\x64\x42\x31\x2d\xe4\xd4\x40\xeb\xf4\xfa\x67\xd5\x21\xa7\x57\x67\xaa\x43\x28\x8f\xc3\xc1\x23\x19\x8d\x6e\xe9\x08\x54\x6f\x6e\xad\x62\xf0\x4f\x88\x74\xe9\x67\x09\xff\xca\x99\x84\xb8\xbc\x0a\x03\x1e\x0f\x93\x99\x9f\x0d\xfc\x4b\x3f\x65\xd2\xbc\x53\x97\x0e\xb2\x1d\x25\x2a\x57\xf9\x7d\xe6\x0b\xf7\x0d\x18\xec\x7d\x24\x36\x04\x0e\x14\xa2\x80\x3b\x63\x10\x3b\xd8\x59\xd4\x60\xca\x7c\xbf\x04\x05\xdc\x92\x3c\xf3\x33\xe5\xee\x9b\x7a\xe4\x1a\xa4\x79\xd0\x1c\xf7\x3c\x89\x0d\x25\x9c\x80\xd4\x44\x42\x24\x46\x9c\xfd\x3b\xcc\xa6\x88\x16\xf8\x9a\x84\x6a\x50\x9a\xe0\xa9\xe5\x34\x21\x13\x9a\xe4\x60\x41\x99\xd2\x29\x91\x60\xe6\x25\x39\x2f\xcd\x80\xb7\xa8\x1e\x79\x2b\x24\x10\xc6\x87\xe2\x98\x8c\xb5\xce\xd4\xf1\xd1\xd1\x88\x69\x4f\xc3\x23\x91\xa6\x39\x67\x7a\x7a\x84\xe4\x98\x0d\x72\x43\x0e\x8f\x62\x98\x40\x72\xa4\xd8\xa8\x4b\x65\x34\x66\x1a\x22\x9d\x4b\x38\xa2\x19\xeb\xe2\x62\x39\xd2\xf1\x5e\x1a\xff\x56\x3a\xaa\xaf\xf6\x67\xc0\xb7\x10\x99\x89\x27\x9b\x2b\x61\x6d\x88\xa7\xc5\x22\xfb\xb8\xfd\x96\x02\xa4\xe6\x27\x03\x95\xab\xf3\xeb\x1b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\xa3\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\xef\xde\xbc\x25\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x9e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\x77\x42\xa6\x54\x1f\x93\x3f\xf9\x9f\xba\x38\x9d\x90\x84\x65\x7f\x39\xfe\x53\x26\xa4\xfe\x0b\x79\xc7\x93\xa9\x99\x34\x26\x77\x63\xe0\xe4\x3a\x7c\x1b\xf9\x73\xe9\x8f\xef\x65\x16\xf5\xc8\xc5\x88\x0b\xe9\xef\x34\x58\x75\x91\xd2\x11\x90\x21\x83\x04\xf1\x5a\x81\xee\xcd\xee\xe0\xca\x5d\x24\x56\x5c\x1a\xb2\xd1\x5b\x9a\x3d\x08\x9a\x53\x7f\xa7\x79\x97\x79\x7d\x99\x79\x17\x17\xb5\x40\x54\x36\x9f\x64\xfe\x49\xa3\x5b\x42\xdd\x5b\x52\x9a\x75\x15\x1e\x9b\x12\x98\xd6\x83\xc0\xa9\x9f\xc0\xc0\xaf\xf8\xf9\xc2\x51\xae\xde\xa6\x9f\x5d\xfe\xb2\x8d\x9f\x2d\xc4\x90\x07\x81\xf6\x76\x11\x17\x59\xe3\x1d\x23\x99\x45\x7d\x11\xdb\xcf\x7e\xf0\x2d\xdf\x97\xef\x26\x70\x9f\x09\x05\x8a\xc4\x6c\x38\x04\x69\xe8\x8e\x98\x80\x94\x2c\x06\x45\x86\x42\xe2\x7e\x65\x22\xc6\x33\x19\xf6\xaf\xc2\x6a\xfb\x22\x5e\x77\x63\xcc\xab\x91\x61\x58\x64\x74\x68\xb8\xf4\x73\x17\x9e\x76\xf2\xc0\xe1\x35\x83\x8b\x18\xae\x21\x81\x48\x0b\xb9\xf8\x8e\x19\x98\x5c\x96\x1e\x70\x54\xdf\xff\x75\x37\x66\xd1\x98\xa4\xb9\x42\xaa\xab\x65\x0e\x15\xb8\x68\x41\x86\x4c\x13\xc1\x09\xc5\xd7\x1a\x5a\x3f\xff\x64\x4a\x75\x34\x76\x77\xec\x2b\x92\xd0\x01\x24\x6a\x76\x9e\x01\x20\xcb\x8d\xf3\x04\x62\x33\x21\xd2\x12\x9c\x73\xc9\x27\x3c\x00\x25\x62\x49\x59\x90\xb7\x57\xc3\x8c\x3c\x84\x65\x16\xf0\x4c\x48\xa6\xa7\xa7\x09\x55\x6a\x19\x4e\xcf\x41\xf7\x62\x88\xe8\xc3\x86\x0c\xe2\x0e\x61\x3c\x66\x46\xa5\x51\xfe\xdb\xf7\x55\x98\xb7\x67\xee\x35\x0c\xae\x74\xbf\x87\x90\xbf\x87\xdc\xb1\x24\x31\xc0\x8a\x61\x48\xf3\x04\x89\xe4\xbf\x41\x0a\xc2\x10\x3b\x25\xe2\x15\x17\xfe\xf2\x6a\xe0\xad\xf8\x56\x2d\x12\x23\x20\x16\xda\xcb\x03\x5f\x79\x53\xdc\x4f\xa8\x84\xb2\x74\xee\xd8\x90\xf9\x50\xfc\xdc\xd2\xd4\xab\x97\x47\xa5\xac\xa8\x29\xe5\xc1\x34\xa4\x2b\xf6\x72\x5e\x75\x30\x58\x66\xa4\x8e\x62\xa1\x88\xea\x5a\x53\x83\x75\x28\xe6\xd9\x2b\xa0\x08\xe5\x53\xa2\xa9\x95\x48\xa8\xc3\x5f\xb7\x63\x5a\xb2\x2c\x01\xf2\xa7\x5b\x98\x76\xac\x0c\x08\xc3\x21\x44\xfa\x2f\x24\x57\x5e\x2a\xc2\xfb\xcd\x1f\x41\xc8\xfe\x93\xff\xd7\x5f\x96\x7d\xf1\x5a\xf8\xfc\xf0\xd9\xb7\xc3\x2e\x69\xd5\x1d\x33\x10\x3a\xc7\x07\x66\x90\xd3\x42\xc0\xce\x65\xe0\x83\x9f\xd5\x23\xe7\x69\xa6\xa7\x24\x05\xca\x95\x3f\xd9\x49\x52\xb9\x59\xf5\xc8\xdf\x0c\x1d\x2c\xa1\x31\x4d\x12\x71\x17\x64\x62\xc4\x90\x4b\x71\xed\xce\x7b\x87\xf4\x25\x0c\x41\x16\xbf\x20\x99\xbc\x14\xe7\xf7\x10\xe5\x7a\x29\x05\x28\xc3\x6d\x05\x2a\xdb\x71\x0b\xd3\x0d\x00\xf2\x23\x4c\x3d\xef\xb6\x5f\x76\x0b\x53\x8b\x0c\xf8\x53\x81\x43\x34\xcb\x12\x06\x56\x3c\x5d\x05\x99\x5b\x98\x2a\x3c\xdf\xe6\xf9\x5b\x3b\x3b\x98\xfb\x3b\x05\x96\x78\x32\x7b\x6e\x24\x24\xf5\xbf\x2d\xbe\x46\x22\x1d\x30\x6e\x5f\x66\xa7\xf6\x5b\x81\xb3\x7b\x80\xf2\x18\xff\xc4\xd7\x34\x01\x2e\xbf\xa8\x0d\x60\xf6\xce\x7f\x47\x21\xfb\x13\x6a\x56\xb4\x6f\xc4\xf8\xc4\x9e\xf8\x31\xcb\xbc\x4a\x85\x4b\xef\x91\x9f\x69\xc2\x0a\x7d\xd4\xe2\x86\x85\x00\x7e\xd5\xf9\xbf\x72\x9a\xf4\xc8\x99\xa5\x67\xf8\xf5\xee\x27\x77\x93\x01\xe4\xbf\x72\x36\xa1\x89\xe1\xdf\x5a\x18\x0a\x19\x47\x54\xc6\xc8\x61\x9c\x9e\xa6\x84\xdd\x3d\x8a\x84\xc0\x88\xa7\xfe\xb4\x17\x7b\xa4\x50\x47\x24\x19\x95\x9a\x45\x79\x42\xa5\xb7\x3d\x4d\x1b\x81\x68\x81\x34\xd7\x10\x09\x1e\xaf\x3c\xc1\x4b\xa9\xab\x7b\xb6\x0c\x63\x64\x11\x20\x99\x88\x51\x44\x61\x29\xcc\x22\xe9\x41\x95\x8d\x8b\xa1\x3f\xd5\xe1\x88\x75\x88\x30\xdc\xe3\x8e\x29\xa7\xc6\x05\x51\x99\x59\x51\xfa\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4e\x3d\xa7\xe9\x10\xa6\x2d\xef\xd1\x46\xae\xe9\x78\x01\xc0\xa1\xac\x03\x76\x71\xa0\x86\x42\x82\x11\x6f\x0f\x62\x81\xcf\xc0\x84\x45\xfa\xb0\x47\xfe\xaf\x61\x66\x66\xe3\x39\x8c\xa8\x66\x13\xf0\x28\xee\x19\x9f\x96\x60\x54\x3f\x42\x15\x79\x45\x0e\xf0\x31\xc2\xd2\x14\x62\x46\x35\x24\xd3\x43\x32\x98\xe2\x6b\xd4\x54\x69\x48\xd7\xd9\x3a\xa3\xd4\x8f\x2a\x76\xa0\xf9\x31\x74\x2a\x0a\xe3\xfa\x9b\xdf\xaf\xb8\x13\x17\xbb\xc1\xce\xfe\x8c\x8a\x75\x85\xd4\x58\x5d\x7b\x66\x0b\x03\x0f\x12\x81\x8a\x04\xba\xc1\x94\x3b\x0b\x9d\xe2\x5c\x79\xcb\xc6\x00\x02\x99\x09\x1b\xfc\x4f\x83\x07\xd4\x28\x16\x88\xe5\x16\x73\x6b\xe0\x38\x8b\x56\xa9\x06\x4b\x39\xda\x72\xcd\x95\xa0\xf6\x3a\xa0\x0a\xbe\xf9\xfd\x12\x95\xc0\xda\x9d\xcc\x9e\xcf\x6b\xb7\x64\x0d\x46\x59\x4c\xbe\x6c\xb3\x1e\x3c\xd6\xe1\xf5\x5b\xcd\xc0\x8c\x12\xf0\xa0\xba\x12\x54\x05\xca\xc3\x7e\x77\xbd\x46\x88\x06\x7c\xca\x38\x48\x3b\x9b\x21\x7e\x8c\x2b\x4d\xb9\x66\x48\xd9\x82\xee\xe8\x75\xc9\x3b\xa6\xc7\x9b\xa8\x2b\x88\x6b\x8e\xd0\x58\xe4\x72\xd6\x81\x39\xfa\xb0\xb1\x5a\xe9\x05\xda\x87\xed\x0c\x7d\x2f\xfa\xda\x77\x52\xa5\xd8\xc8\x48\x99\xe4\x0e\xd8\x68\xac\x3d\x3b\xa9\x4a\x9b\xe6\x57\xf7\x0a\xf6\x6f\x3c\x4d\x69\x60\x02\x4c\x23\x07\x18\x80\x01\xa0\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xd5\x4a\x26\x20\x7b\xe4\x27\x65\x76\x8a\xfc\xc0\x46\x63\x03\x42\xfb\xd2\xb2\xa8\x84\x52\x81\x61\xd5\xd5\x15\x30\x23\xd9\x1b\xb9\x46\x1a\x8d\xc6\x80\xdf\xc8\x40\x7e\x06\x88\x67\xee\x57\x24\xce\xd1\xd6\x36\xbb\x88\xdc\xc0\xa1\x87\x52\xac\xa4\x7c\x14\x0c\x09\x41\x25\xb0\x07\xde\x7c\xd2\x48\x58\xab\x1a\x5a\x7e\x0d\xed\xd4\xa2\xa0\xa3\xcc\x9a\x42\xc2\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x7a\x65\xc2\x91\x1e\x41\xe8\xec\xc7\x18\xcc\x21\x39\xb7\xc0\x87\xb2\x3e\xe2\xc9\xcc\x2b\x3b\xd5\xa2\xe7\x90\x1c\xd3\x74\x76\xc9\x05\x4d\x97\x94\xdf\x42\x4c\x12\xb8\x67\x91\x18\x49\x9a\x8d\x59\x44\x93\x64\x8a\xc7\x14\xd5\x41\xa6\x15\x5a\x51\x56\x98\x6d\x96\x91\xf1\xe0\x02\xd8\xd8\x7c\xa1\x20\x92\xa0\x1f\x36\x85\x5d\xdb\xfb\x0a\xa6\x6c\x38\xa0\x01\xb1\x9b\xc0\xe2\x88\xc3\x39\x6f\xef\xa1\x51\x64\x0e\x12\xa2\xae\xe0\x1a\x9c\x00\x52\x42\xe5\x1e\xb9\x40\x96\x3a\x00\x85\x58\x7e\x0b\x90\x59\x4c\x4b\x98\xd2\x44\xa5\x34\x49\x3a\x44\x31\x1e\x01\x01\x1a\x8d\x2d\x38\x39\x80\x57\xa8\xb5\x64\x60\xc5\x20\xc3\x6a\xa7\x61\x6f\x80\xeb\xc5\x42\xcd\x6a\xbd\x6b\x85\xce\xb5\x1a\x8c\x81\xa6\x3c\x0c\xc9\x82\x16\x79\x9e\xe8\x7c\x4e\xaa\x70\xef\x6d\xf0\x6a\x6b\x27\xbe\xd6\x46\xf8\x18\x3d\x4c\x6b\x7e\xaa\xdc\x1e\xfc\x0c\x63\x71\xe7\x2d\xce\x73\x87\xdc\x10\x5e\xe5\xf7\x36\x66\x2a\x32\x27\x1d\x62\x72\x2a\xb8\x42\xf9\xd4\x3a\x1e\xd0\x71\x30\xa1\x89\x45\x05\x3f\x71\x26\x92\x04\x8f\x7c\xee\xd5\x09\x23\xc7\x73\x02\xe9\x00\xe2\x18\x62\xf3\x59\x76\x29\x4b\xd8\x5c\x4d\x53\x91\xe7\x0f\x7d\x91\x24\xab\xb9\xd8\x4a\xbd\x74\x1d\xad\xd4\x03\x60\x95\x6c\x54\x65\x7d\x1e\x62\x4c\x85\x33\x13\x83\x06\x99\x32\xee\xc4\x23\x23\xea\x06\xc0\x0e\x40\xdf\x01\x70\x12\x8d\x21\xba\x0d\x47\xc9\xf9\x6d\x66\x76\xcd\x39\x8d\xaa\x14\xab\x70\x89\x89\x24\x41\x45\x43\x01\x10\x66\x74\x02\x0e\x77\xfe\x99\x99\x33\x5a\x22\xf6\x74\x42\x59\x42\x07\x09\x20\xd7\x0c\x7f\x75\x2a\xfe\x23\xcf\xcf\xb3\x3c\x49\x8c\x10\xcb\x63\x32\xba\xea\x9f\x12\x2d\xe9\x70\xc8\x22\x73\x29\x66\x12\x22\xed\x6c\x12\xcb\x3e\x61\x95\xb8\xb6\xf4\x44\x28\x4d\x75\x3e\xb7\x47\x2b\x36\x78\xd5\xc6\x1a\x3d\x84\x2d\x35\x10\x55\xb6\xf2\xaa\xaa\xac\x98\x65\x80\x55\xb6\x2a\xc6\xd4\x1e\xb9\x14\xa8\x23\x50\x4d\xde\x82\x32\x6c\x17\x01\x74\x05\x54\x09\x5e\xa2\xae\x28\xfd\x4a\x36\x62\x9c\x26\xee\xa3\xd0\xeb\x63\x44\x74\x26\x78\xd0\x3d\xe8\xd4\x1c\xca\x94\x8d\x24\xd5\x81\x28\x16\xeb\x76\xdc\xc5\xf1\xc5\x61\xae\x73\x09\x3d\x72\xc2\xa7\xb8\xdf\x43\xa0\xe6\x07\x33\xb3\x96\x22\xce\x23\x23\x2f\x19\x02\x9b\xab\xf2\x24\x8d\x92\xd1\x0a\xd4\xf6\x4e\xfd\x4b\xbc\xa0\xa7\xcc\x01\xa0\xcc\x19\x4f\x05\x07\x42\x55\x66\xf4\x38\x8f\x93\xb9\x44\x23\x76\x00\x30\x32\x8b\x93\xfe\x05\xf1\xa1\x21\x3d\xd2\xed\x76\xc9\x8d\xf9\x59\x69\x99\x47\xc8\x5f\xcc\x11\xe2\xb1\xe3\x14\x16\xfb\xf0\x23\x29\x8a\x9d\xf8\x19\xc4\x59\x3e\xac\x08\x96\x51\x3d\x26\x3d\x0b\xf8\x5e\x09\x14\x84\x7c\x67\x78\xcd\x3d\x4d\x33\xc4\x7b\x43\xba\xbf\x13\xe2\xda\xee\x90\x7d\xe1\x7f\x93\xa3\xa3\x59\x84\x10\x03\x23\x9f\x3a\xeb\x21\xe2\xc5\x50\x88\x7d\x55\xfd\x9e\x9e\x79\xf0\x47\x2e\xee\xf8\xa2\x57\xe3\xbb\xa8\x84\x63\xf2\x61\xef\xc4\x1f\xbd\x0f\x7b\x1d\xf2\x61\xaf\x2f\xc5\xc8\xc8\xac\x8c\x8f\xcc\x0f\x06\xa3\x3e\xec\x9d\xc1\x48\xd2\x18\xe2\x0f\x7b\x66\xda\x2f\x33\xa3\x5e\xbd\x05\x39\x82\x1f\x61\xfa\x67\x9c\x2c\xfc\xec\xd9\xc1\x9f\x53\x73\x1d\x7f\x37\xfc\xd7\x30\xa9\x3f\xa7\x34\x0b\x3f\xbc\xa5\x59\x78\xf8\xb4\x40\xb2\xf7\x1f\x53\xd0\x74\xf2\xba\x57\x6c\xe7\x3f\xfe\xa9\x04\x3f\xfe\xb0\x57\xac\xbf\x23\x52\x83\x16\x99\x9e\x7e\xd8\x23\x95\xb7\x1e\x7f\xd8\xc3\xf7\xfa\xdf\xfd\x22\x8f\x3f\xec\x99\x37\x99\x9f\xa5\xd0\x62\x90\x0f\x8f\x3f\xec\x0d\xa6\x1a\x54\xe7\x75\x47\x42\xd6\x31\xd2\xd2\x9f\x8b\x37\x7c\xd8\xfb\x07\xf9\xc0\xcd\x62\x51\x11\xb4\x3b\xa9\xc8\xff\xec\xad\xe0\xe7\x2b\x88\xfe\x6a\xe5\xcd\x68\x67\x09\x55\xfa\x46\x52\xae\x98\x0f\x93\x58\x7a\x6b\x6a\x0f\xfb\xd2\xeb\x12\x09\xc0\xd2\xcb\x16\x1b\x96\x5e\x5e\xc2\x3a\xd7\x61\x5b\xf3\xdf\xb0\xa6\xc9\x79\xfe\x41\x2f\xcf\x98\x2b\x85\x91\x26\xec\x8f\x61\x00\xee\x6e\x73\x10\x8d\x10\x6f\xce\xb7\x23\x6e\x46\x5c\xe4\xb8\x6f\x3d\x77\x78\x83\x76\x1f\x5c\x9c\x39\x8f\x41\x26\x53\x23\x4e\x14\xb3\x46\x63\x23\xed\xc7\x3d\x62\x8d\x06\x34\x98\x68\x6e\xcd\x41\x42\xd6\xc4\x4b\x96\x6b\x5c\x57\x98\xd1\x10\x0e\x7b\xe0\xdd\x34\xc8\xe5\xa2\x08\x32\x8d\x6c\x6e\x7b\x4f\x0a\x29\x59\x54\x8c\x58\xd5\xd5\xcb\xd1\xc3\x21\xc7\x9a\x80\x77\x77\x3b\xa7\x74\x9e\x52\xc3\x37\x68\x6c\xd6\x5b\x5c\xb3\xba\x9b\xd5\xb5\x2c\x3d\xa5\x03\x91\x3b\xdb\x6e\xd8\x07\x07\x6a\xc7\x45\x50\x2a\xcb\xf4\xf4\x41\x73\xc9\x5a\x1f\x9f\xd2\xfb\x37\xc0\x47\x7a\x7c\x4c\xbe\xfe\xea\x7f\x7d\xf3\x87\x25\x37\x5a\xc2\x08\xf1\xf7\xc0\x9d\x21\x68\x4d\x30\xcc\x3f\x38\x6b\x31\x2c\x22\x99\x46\xc5\x3d\xc1\xc2\x5d\x60\xd0\x1d\x45\x3f\xa5\xe3\x95\x79\x66\xe0\x62\xa8\xbc\x35\x34\x44\xd0\x31\x12\xd2\xc2\xc9\x58\x20\xe0\xc9\x94\xbc\xfe\xaa\x43\x06\x0e\xc4\xf3\xe4\xfb\xfd\xfd\xc7\xde\x82\x25\x33\x45\xfe\xd8\x99\x59\x0f\x53\xc4\x6c\x95\x18\x22\xe2\x58\xfd\x52\x82\x65\x83\xde\x12\x30\xcf\x06\x21\xac\xf7\xa1\x8d\x7b\xc8\x18\xb8\x9e\x21\x30\x65\x9c\xa5\x79\x7a\x4c\x5e\x2d\xb9\xc5\x92\xb4\x35\x77\xd3\xde\x5c\x48\x01\xd4\x90\xae\x91\xa4\xa9\x91\x77\x22\xc2\x62\xe0\x9a\x0d\x19\xc8\x32\x6a\xa3\xae\x6f\x1f\xf4\xae\xd6\x00\x45\xf4\xc2\x1a\x3a\x54\x42\xf6\xbe\x15\x72\x24\x72\x60\xe7\xba\x89\xca\x04\x6a\x9a\x81\x3d\x0d\x56\x7b\x21\x70\x9f\x59\x39\xb5\xe4\x83\x48\x81\x72\xc6\x47\xde\xbb\xeb\x0d\xc9\x96\xeb\xde\x8d\x01\x59\x4f\x30\x52\x5a\x63\x7f\x64\x34\xa5\x18\x95\x26\x4a\x46\x39\x95\x94\x6b\xa3\xc3\x9e\xf4\x2f\xac\x80\x3e\x6b\xd0\xa4\x45\xc8\x8f\x3f\x8d\xf6\xa8\x5a\x62\x65\x96\xe8\xc2\x84\xf0\xc4\x36\x77\x54\x5f\xbf\xfa\x6a\xe5\x96\x87\xfb\x96\xfb\xef\xa8\xd6\x20\xf9\x31\xf9\xaf\xf7\x27\xdd\xff\x4b\xbb\xff\xfe\x78\xe0\xfe\xf1\xaa\xfb\xc7\x5f\x3a\xc7\x1f\x7f\x57\xfa\xf3\xe3\xe1\xb7\x5f\x2c\x99\x69\xb1\x24\xbf\x04\x7d\x1c\x13\xf1\x42\xa2\xdf\xd1\x0e\x72\x18\x31\x24\x37\x32\x87\x0e\xf9\x8e\x26\x0a\x3a\xe4\x27\x8e\xac\xa1\x26\xd0\x80\xe7\xe9\x2a\x4d\xaf\x4b\xf6\xcc\x5b\x17\x0b\x1f\xe1\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xe9\xae\xeb\x01\xc9\xdb\x19\x4a\x94\xa6\x14\x5a\x86\xb1\x48\xe6\x20\x89\x9e\x13\x6f\x7b\x91\x48\x8f\x4a\xa1\x67\x46\xae\x7e\x4b\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x3b\xa7\x48\xc2\x6e\x81\x9c\x14\x4a\xa3\x21\x96\x03\x88\x28\x0a\xe2\x72\xc0\xb4\xa4\xd6\xe2\xeb\xe5\xca\xc2\x9c\x34\xcc\x13\x72\x60\x74\xd5\x1e\xc6\x4b\xcc\x51\xd7\x43\x67\xba\x1d\xb0\x84\xe9\xa9\xd5\xa3\x23\xc1\x87\x09\x73\xf2\x7f\x9a\x09\xa9\x29\xd7\xce\xc8\x08\x23\xb8\x27\xac\xf0\x7b\x33\x45\x0e\x62\xae\x5e\xbf\xfe\xea\xeb\xeb\x7c\x10\x8b\x94\x32\xfe\x5d\xaa\x8f\x0e\xbf\x3d\xf8\x57\x4e\x13\x74\xf1\x5e\xd2\x14\xbe\x4b\xf5\x61\x73\x6c\xf1\xf5\x37\x6b\x9c\xa2\x83\xf7\xf6\xac\x7c\x3c\x78\xdf\x75\xff\xfa\x9d\xff\xe9\xf0\xdb\x83\x0f\xbd\x95\xd7\x0f\x7f\x67\xbe\xa1\x74\x02\x3f\xbe\xef\x16\xc7\xaf\xf7\xf1\x77\x87\xdf\x96\xae\x1d\x2e\x3a\x8c\xf7\xdd\xdb\x7c\x00\x92\x83\x06\xd5\x35\x5a\x40\x37\xa5\x59\xf7\x16\xa6\x4b\x0e\xe7\x52\x71\x74\x7e\x22\x0b\xb1\x94\x66\x8b\x54\x6f\x1b\x42\x76\x05\x18\xb6\x14\x2d\x44\xf2\x9a\xee\x17\x4e\x97\x88\x64\xf6\x12\x06\xb9\x6f\x61\x72\x32\x7c\xc7\x9a\xd9\x56\x89\xd3\x6b\x60\xcb\x7a\xf2\x23\x5f\x11\xa6\xf3\xe0\x4b\xc2\x77\x6e\x3d\x83\x3f\xdf\x4b\x22\x9c\xd7\x9e\x27\x67\x4b\x35\xad\xaa\x01\xf3\xe2\xcc\x8a\xbe\x48\x7a\x50\x9c\x1b\x0b\xa3\xe7\xe5\x9c\xfd\x2b\x07\x72\x71\xe6\xe8\x51\x87\x30\x1e\x25\x79\x6c\x24\x85\x9f\x7e\xba\x38\x33\xca\xfb\x5f\x1d\xb9\xb9\x03\x12\x0b\xbe\xaf\xc9\xbb\xcb\x37\x7f\x47\x4b\x00\xde\xd1\xb1\x0c\xdd\x3a\xa3\x68\xc2\x6c\x70\xb4\x67\xc0\xe4\xaf\x60\xe6\x72\x6f\x8e\x68\x16\x8c\x27\x48\xee\x78\x4c\xc6\x90\x64\x46\x80\xb8\x05\xa2\x72\xe9\x56\x67\x26\xb6\xee\x5e\x03\x6b\xe2\x9c\xc1\x23\xd0\x88\xe4\x09\x06\xf9\x6e\x03\x34\x17\x76\xca\x04\xbf\x36\x52\xe0\x23\x9c\x0f\x83\xc8\xef\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x88\xb5\x7d\xf0\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfd\x24\xcd\x7d\xef\x56\x6f\xb4\xc6\x4c\x74\x6b\x5e\x3d\x60\x7c\x9e\x8b\xe1\xaa\xaa\xce\x33\x29\x0f\x68\x58\x0d\x9e\xd1\x31\x55\x64\x00\xc0\xd1\x96\x6b\x4d\x7f\xc0\x1d\xd6\x41\x61\x85\xcd\xb3\xae\x16\xdd\x78\xf1\xe6\x3d\x00\xb9\x87\xa1\xb6\x42\x73\xad\x7c\xdb\xc9\xc6\x8a\xea\xdd\x78\xba\x08\x06\xca\xda\x32\x31\x6a\xc8\xcb\x20\x9b\x7e\xd8\x72\xc5\x64\xc6\xa4\x8b\x9a\x85\x33\x6a\x38\x3d\x63\x7e\x49\x46\x7b\xac\x58\x36\xb4\x40\x57\x5e\xd5\xb2\xb7\xf9\x1a\xed\x36\x5f\x83\x9c\xb0\xad\x98\xdf\x43\x07\x33\xb2\x41\x26\x27\x8f\x7f\xac\x8c\xe8\xb5\xf5\x4b\xd0\xf4\x17\x89\x07\x7c\x37\x2b\x26\x50\x16\x82\xab\x82\x59\x37\x99\x63\x53\x66\x69\xa9\xc9\x31\x06\x16\xfb\x9f\xb4\x90\xe8\x6f\x2f\xff\x96\x0f\x82\xa0\x5c\xcc\xee\x74\x20\xf2\xdf\xff\xf3\x9b\xdf\x3c\xcb\x74\xc9\x24\x57\x1a\xa4\x03\x9f\xcf\x15\xfc\x74\x69\x93\xf6\xf5\xee\x0c\x39\xc8\xe1\xf5\x52\xfa\xe4\xa2\x7b\xe6\xd3\x28\x17\x7e\x08\xde\xb2\x30\x9d\x52\x4d\xca\xff\x76\x37\x16\x89\x95\x8b\x66\x7b\xcc\x04\xcb\x4a\x72\xc6\xf5\xcf\x25\xec\xfd\x34\x59\x95\x33\x8e\xc5\xd5\x4b\x98\x94\xf6\xa9\xfc\xfa\x9f\xe7\x7e\x5f\xf7\xf5\xfe\xf3\xa9\x79\x73\x29\x9a\x45\x70\x4c\xf8\x4a\xa8\x4f\x8d\x5d\xbc\xa0\x05\xb7\xd8\x15\x5d\xcd\x5f\x78\x38\xbd\xd2\xe9\xae\xd9\x98\xaa\x79\x10\xf7\x67\x7e\x5d\x30\x5d\xb3\x49\x95\x8b\xb0\xdf\x8a\xd7\x96\x82\x04\xb7\x1a\xee\x9d\x91\x7b\xff\xb1\xf0\x99\xeb\x0c\xa2\x7f\xb4\x09\x96\x6d\x82\x65\x9b\x60\xb9\xa3\x09\x96\x0f\x9f\x7b\x73\x86\x49\x0c\x51\x42\x7d\x9a\x8b\x86\x24\xc1\x6c\xc7\xb1\xb8\x0b\xa1\x97\x49\x52\x0e\xd5\x2c\x02\xbf\x52\xca\x31\x9c\x21\xcb\xac\x6d\x9c\x92\x11\x9b\x00\x0f\x91\x28\xeb\x2e\x7e\x75\xc2\xe7\x62\x06\xe5\xaf\xba\x05\xce\x5c\x59\x99\x0b\x3a\x2b\x03\xad\x80\xda\x49\x71\xaf\xb3\x11\xe4\xdc\xba\xfc\x73\x09\x31\xe6\x3c\x58\x24\x4f\x69\x86\x52\x1e\xc6\x53\xe8\x31\x86\xa9\x06\x04\xc7\x74\x1b\x74\xb8\xa1\xd3\x69\x4a\x8c\x18\x87\x04\x41\x0b\xe1\xa2\x72\xcc\xb3\x48\x18\x24\x68\xc9\x60\x52\x36\x90\x06\x47\xd4\xe6\x3a\xc1\xfa\xd9\x62\x2b\x45\x62\x9a\x31\x27\xbb\xc4\x41\xb0\x5c\x03\x7a\xfd\x0b\x87\x6f\x85\x38\xaa\x1c\xbe\x81\xc2\x24\x05\x27\x1f\x04\xb9\x16\xdf\xe4\x10\x2b\x26\x98\x77\x61\x31\xc3\x80\xad\x8c\x84\x03\xb4\xcc\x48\xca\xcd\x85\x85\xc8\xfd\x08\x59\x88\xe2\x8e\x2f\x8f\x0e\x68\x36\xbf\xab\x0c\xbb\xf0\xb3\x59\xe0\x04\x13\x39\xbd\xea\xac\x05\x9e\x56\xab\x41\x23\xec\xdc\x2d\x31\x99\x30\x4a\xe8\x68\x24\x31\x54\x76\x69\xa4\xc1\x9a\x39\x5a\x0f\x85\x46\x10\x3c\x8c\x28\xc9\xaf\xbc\xc3\x90\xc1\x95\x37\x2c\xb5\xd0\xfa\x1b\xe6\x85\xc5\xea\x58\x2f\x9b\x8c\xa2\x19\xcd\x83\x56\xc8\x07\x12\x57\x1e\xde\x5b\x3b\x1e\xd8\x61\x3b\xaa\xfb\x3c\xb3\x10\x77\x75\x60\xce\x47\x41\x9a\x0d\x39\x88\x0a\x6f\xb6\x73\x93\x64\x20\x8d\x3e\x6e\x83\x89\x29\x89\xac\xfc\x16\x08\x8f\xf7\x0e\x3f\xb0\x9c\xb5\xf6\xdf\x8e\x75\xb0\xc0\x8e\x2e\xc6\x53\x3d\x70\xdb\x7a\x5b\x65\xc7\x03\x19\xdb\xb3\x63\xcd\xfc\x25\x37\xf7\xea\x8c\xee\x5a\x73\x1b\x30\x34\x3e\xe9\x1a\x09\x39\x76\x54\xcd\x5b\xf4\xee\x6d\x39\x92\x44\xd2\x3b\x02\x3c\x12\x86\x58\xfc\xff\xd7\xef\x2e\x7d\xf2\xda\x85\x26\x2c\xcd\x12\x48\x31\xae\xe2\x2d\x95\x6a\x4c\x13\x90\xc8\x9d\x7e\xe2\x69\xe5\xef\x99\xf8\xef\x18\x12\x3a\xb5\x93\xc5\x10\x09\xb4\xc4\x0b\x49\x32\x23\xe0\xa6\x59\x8e\xf9\x1b\x78\x15\xdf\xfb\x60\x86\xce\x16\xa0\x29\x4c\x54\x83\xe9\x42\x0b\x68\x75\xdc\x77\xe3\x75\x69\x40\x79\x31\x0f\x53\x02\x3b\xd6\xa2\x07\xe5\x89\x1f\xfc\xca\x90\x1e\xd3\x5f\x61\x63\x2b\xcf\xb8\x61\x22\xd8\xd7\x5f\xad\xb8\x33\x86\x2c\x11\x53\x83\x17\x0f\x9f\x95\x35\xbf\x67\xed\x73\xbd\xee\x7c\xeb\x9e\xe5\x35\xe7\xb3\xc6\xa9\x26\x66\x5a\xa4\x40\x6d\x35\xd1\x2a\xf7\xdf\x46\x13\x2d\xb0\x3f\x2e\x9f\xed\x51\x98\x5f\xff\xc2\x5b\x1b\x82\xd7\xd7\xd2\xa6\x1f\x83\xdf\xb8\x24\x48\x4f\x33\x47\x69\x8c\x2c\x38\xcb\xee\x9e\x86\xcb\x3d\x20\xcf\xf8\xdb\x1e\x90\x6a\xfc\x6d\x0f\xc9\x36\x76\x6c\xc2\x36\x1f\x46\x3a\x3b\x36\xa2\xb1\x0f\x23\xe0\x16\x93\x4e\x56\x7b\x93\xb7\x98\xd7\xe8\xc4\x3b\x20\xe1\x5d\x57\x96\x51\x91\xef\x5c\xc2\xa1\x11\xde\xb0\x1a\xcb\x20\x11\xd1\xad\xb3\x5b\x5e\x9d\x85\xdc\x3e\x5f\x7d\xc8\x65\xf6\x11\xf6\x10\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x73\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\xf5\xc0\x78\x76\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x43\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x65\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\xa8\x5f\xef\x8a\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfe\x99\x8c\x40\x2b\x83\x05\xa0\x61\x91\x60\x5e\x33\xd9\x18\x38\x1d\x24\x0b\x27\x7e\x88\x94\xb8\x27\x57\x1b\x8f\x07\x42\x98\xaf\x9b\x87\x18\xaa\x3a\x5e\xd3\xd9\x24\x9e\x79\x6f\x59\x8e\xdd\xe2\xa0\xe6\xd3\xab\xb3\xa6\x42\x99\xc9\x07\xee\x2b\x64\x1b\xee\x60\xab\xf0\x62\xd9\x40\x57\xe8\xef\xdd\x1d\x87\x18\x93\xdc\x7c\xcd\x72\x73\xe8\x59\xc4\x74\x32\x0d\x2f\xee\x2d\x2a\x3b\xf2\x7c\x42\xa2\x4f\xaf\xce\xd6\x37\xdf\xfb\x0d\xf8\x14\x96\xfa\xd6\x0e\xdf\xda\xe1\xc3\x68\xc5\xa0\x2d\x27\x6d\xc5\xa0\x15\xe3\x65\x8b\x41\xbb\x6e\xb7\x6e\xad\xcd\xa4\xb5\x36\xaf\xbe\xad\xb5\x36\xb7\xd6\xe6\xd6\x7e\xb3\x64\xb4\x82\x0b\x8e\x56\x70\x79\x60\x3c\x3b\xc1\xa5\xb5\x36\xb7\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1e\xd4\xea\x39\x86\xee\xb6\x46\xbf\xd6\xe8\xd7\x1a\xfd\x5a\x6e\xd4\x72\xa3\x07\xc6\xb3\xe3\x46\xad\xd1\x6f\xd3\x89\x5a\xa3\xdf\xc2\xd1\x1a\xfd\x1e\x18\xad\xd1\xaf\x35\xfa\x2d\x19\xad\xe0\xb2\xe5\xa4\xad\xe0\xb2\x62\xbc\x6c\xc1\xa5\x35\xfa\xb5\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1e\xd4\xaa\xbe\xd1\xef\x81\x93\xb4\xfa\xd9\xd5\x27\x65\xe5\xb3\x2c\x5a\xf5\xc2\xad\x1b\xba\xd7\x6a\x00\x3b\xa0\x0a\xbe\xf9\xfd\x5c\xdd\xf2\xf2\x2d\x29\xc4\x8c\xea\xed\xfb\xb3\x16\xaf\x58\xbe\x67\x6b\xec\x7d\x58\xc6\x96\xb3\xb8\xc2\xca\x0f\x06\xc5\x9a\xad\x8d\x2f\xec\xcd\xa1\xc9\xfc\x4c\x5f\xce\x82\xf3\xf0\x25\x05\xe8\x83\xd2\x78\x37\x06\xdf\xd0\xc6\x95\x9e\x0e\xed\xe2\x99\x0a\xd1\xcb\x0b\xfb\x27\xd5\x0c\x47\xf6\xef\x59\x70\xf9\xa1\x4d\x5b\x54\x7d\x7b\x21\xb0\x3c\x80\xce\xac\xf5\xfa\x2c\xa4\x00\xcf\x42\x2c\xa3\xd2\x50\x48\x6f\xe5\x46\xa6\x5d\xba\x7b\x06\xde\xab\xbb\x49\xad\xe4\xd4\x0f\x73\xe8\x6e\x29\x53\x79\x99\x65\x7d\x1d\xc6\xec\x7a\x60\xf4\x41\xa6\x4c\xa9\x65\x01\xd7\xd5\xa5\x3f\x44\x36\xd7\x20\x97\x4b\xe0\xef\xbf\xa8\xb4\x9c\x20\x3e\xd9\xf6\x3f\x03\x1a\x11\x99\x27\xae\x09\xa8\x2b\x7f\x4d\x68\x14\x89\x9c\x6b\xc2\x01\x62\x6b\xd9\x58\x84\xab\x6b\x10\xdb\x35\xe4\xa7\x75\xa5\xa7\xae\x5d\xe7\x83\x77\xb9\x6f\x38\xb1\x9f\xb0\xb0\xa0\x7a\x79\xac\x2f\x6d\xe1\xeb\x1f\xe6\x5a\x9b\xb0\xc2\xb5\x19\x61\x65\x7f\xfb\x22\x61\xd1\xf4\x2a\x4f\xc0\xb5\x88\x2b\x75\xd0\xb7\xd2\x6e\x59\x44\xce\xf0\x6e\x5c\xbd\xed\x4d\x19\x0b\xb0\x9d\xa4\x5d\x61\x80\xca\xe3\xbe\x4b\x95\x6d\xed\x60\x1e\x22\x34\xcb\x12\x4c\xa5\x10\x46\x68\xb1\x0d\xfa\x43\x7f\xbd\x45\xb7\xad\x2f\xbd\xac\x25\x5e\x93\x8d\x44\x6c\xe2\x6d\x56\x83\x87\x50\x85\x6c\x28\x6b\x13\x5b\x22\xfe\x7b\x29\xf2\x6c\xcd\xdb\xe7\x2d\x8b\xf6\x69\xdf\x7d\xab\xdc\xc0\xc6\x5f\x74\x2e\x23\xdf\x31\xd8\x36\xe9\x72\x26\x51\xdb\x0d\x3c\xcd\x13\xcd\xb2\xc4\xb6\xf9\x1e\xd9\x09\xa9\x84\x82\x6f\x74\x08\xe5\x53\xef\x81\x72\x6d\x22\x20\x26\x74\x64\x66\xd4\xbe\x79\xac\xed\x2f\x91\xa7\x60\x4e\x73\x5c\x6a\x68\x6a\xd4\x29\x3e\x2d\x66\x27\x77\x2c\x49\xb0\x7d\x6f\x92\x88\xbb\xe5\x6d\xfd\x66\xc7\x66\x42\x21\xd9\x4c\x30\x24\x9b\x8b\xc0\x84\x70\xc1\xbd\x69\xf7\xa7\xab\x37\xdb\x6d\xe2\x65\x75\x0e\xd7\x0b\x04\xb0\xb1\x75\x46\xa5\x66\x34\x21\xb9\x4c\x94\xdd\x47\x6a\x94\x00\xe9\x9b\xa9\x8c\x29\x7a\x06\x23\x50\xb6\x6b\x07\xf9\x9d\xdd\x39\x07\x58\x7b\x3e\x05\x4f\xa6\x84\xda\x9d\x1f\xe6\x49\xd2\x21\x43\xc6\xa9\x21\xbb\x90\xf9\x4c\x18\xa3\x3f\x91\x6b\xc6\x23\x30\xdf\xd4\x0d\x82\x05\xae\xc8\xcc\x68\xce\x77\x38\xa4\x71\xa7\xd4\xd1\x19\xfb\x70\xe3\x2b\xcc\x81\x8d\xb0\x6d\xdd\x50\x48\x2f\xb2\x5c\x89\x04\xcd\xdb\xce\xf0\xed\x3a\xda\xd3\xf2\xe5\xbf\x32\x8e\x4a\x0a\xb9\x42\xc6\x61\x94\x1d\x60\xd8\x1f\xda\x4c\x89\x6d\x6a\x0d\xee\x14\x08\x75\xa0\xf2\x68\x6c\x3e\x69\x2f\x13\xb1\xda\x33\x64\x64\x4f\x41\x24\x41\xab\xbd\x43\xf3\xd7\xec\x37\xe0\xf7\x95\x9f\x3b\xa2\x19\xdb\x3b\xec\x10\x04\x10\x36\x3a\x11\x7a\xfc\x7c\xf1\xd0\x7f\x6b\xa5\xbf\xd6\x43\x63\xa6\x8b\x5f\x69\x06\xd7\xb5\x43\x64\xb6\x09\x86\xa1\xd1\x1a\x30\x4f\xca\x20\xa5\xed\xcf\x19\x1a\xc4\xcf\x12\x6b\x42\x4e\x42\x83\x7c\xd0\xd8\x07\xdc\xdd\x0d\x13\x90\x53\x3d\x36\xda\x2a\x53\xcf\xff\xf0\xaf\xe9\x58\x2a\xc6\x42\x80\xbb\x03\xef\x81\x5b\x20\xb9\xed\xac\x34\x0b\xdc\xfd\xdf\xed\x97\xa5\x5e\x23\x3e\x15\xd4\xfc\xd9\x82\x12\xd9\xeb\x56\x60\xfc\xd9\x3c\x59\x05\xa1\xfd\xc9\x52\xcb\x40\x3f\xde\xbc\xb1\x5d\x94\x1c\xac\x7e\x64\x3c\x56\xa1\x92\x51\x1c\xba\x65\x1a\x78\x2f\x04\x32\xae\xf0\x39\x02\x78\x5e\x7c\x5d\x57\xe4\x7c\x60\xfa\x92\x7e\xb3\x0b\x2a\x09\x76\x65\xaa\x48\x39\x86\x4e\x75\xac\xcb\xc9\xe8\x22\x09\x1d\x40\x62\x5b\x2e\x99\xab\xc5\xf2\xc9\xc9\x9b\xb7\xa1\x3b\x19\x76\xfb\xfc\xd4\x8a\xc8\x1a\x8e\xd3\xb9\x1e\x6f\xf3\x63\x7d\xd9\x13\x41\xb1\x99\x31\x98\x5c\x83\xb6\xc7\x2c\xa5\x99\x39\x65\x76\x8e\x85\xb6\xcc\x37\x08\xe9\x87\x0f\xcb\x46\x32\xfb\xfa\x3d\x99\x16\xbd\x64\xad\xa3\xb2\x9e\xc7\x77\x93\xb3\xb7\xc2\xc2\x51\x8c\x0a\x98\x67\x10\xda\xc9\xf5\x4e\x12\x8f\x42\x7f\x3d\x8b\xc1\xca\x26\x46\xdb\x34\x74\xe9\x7f\x2f\xa6\x68\x78\x0b\x36\x51\x9a\x8c\xde\x9c\x40\xa4\xc5\xea\xb2\x6f\xfe\x66\x0d\x69\x96\x3c\x74\xf2\xc8\xc6\x0a\x56\xca\xf8\x15\xd0\x78\x7a\x0d\x91\xe0\xf1\x9a\x04\xb6\xb2\x1f\x6f\x19\x67\x69\x9e\x12\x9e\xa7\x03\x40\x10\x2b\x3b\x17\x12\x12\xab\xbc\x52\xc2\xe1\x2e\x99\xfa\x56\xc1\x24\x13\xb1\xa7\x27\x03\xec\x88\x1c\x4f\xb1\xbf\x19\x16\x48\xe5\x53\x33\x09\x76\x3e\xf6\x75\xf4\x48\x24\xa9\x32\x62\x51\x07\x27\x65\xda\x70\xac\x01\xa0\x6f\x89\xc5\x60\xf6\x98\x4e\x28\x4b\x8c\x68\xdd\x23\x67\x30\xa4\x79\x82\x6d\xfa\xc8\x2b\x72\x60\x5e\xe6\xf5\xa9\x45\x0f\x18\x71\x57\x09\xa3\x89\x2b\x97\xe3\x8e\x0b\x3a\xdc\xc0\x5a\xbe\x4e\xfd\x3e\x3f\xd6\xad\xe3\xe7\x47\x46\x73\xb5\xae\x1a\x5e\xd9\x98\x0b\xdb\x11\xbb\x2c\x89\x96\x48\x3a\x53\x6e\xe6\xf5\x58\xf6\xea\xda\x07\x0b\x56\x2d\xc5\x48\x82\x52\x67\x40\xe3\x84\x71\xd8\x1e\xbf\x6e\xc6\x40\x52\x7a\x8f\x38\x86\x0d\xcd\x19\xaf\x60\x18\x2d\x7f\x95\x16\xb6\x69\xbe\x7f\x3d\x19\xc0\x10\xdb\x30\xe2\x07\x97\x76\xdf\xe2\xcf\x90\xb2\x04\xe2\x1e\xbe\xa3\x34\x4b\xd1\xbd\xd8\x22\x8e\xf9\x9b\xf1\x1c\xcc\x53\x99\x14\xa8\x4c\xda\x47\xcb\x3c\x1e\x79\x28\x2d\xda\x89\xfb\x8e\x7d\xfd\x19\x50\x9c\xdf\x47\xd6\xc8\xe7\x3a\x81\x7b\xdc\x54\xb9\x1c\x1a\xd5\xd1\x6b\x9c\xa5\x05\xb9\x56\xaf\xe4\x52\x68\xd7\xf8\x2f\x7c\x20\x3e\xed\x1a\x51\x82\xd2\x2c\xc5\x03\x16\xe7\xd2\xb7\xc5\x44\x98\xd1\xc5\x5b\x5f\x39\x2a\xdf\xbc\x7a\xb5\xa6\xfc\xf6\xf8\x48\x2f\x01\x35\xe5\x6d\xf0\xe5\x32\xd0\x21\x4f\xfe\x8d\x0a\x6c\xf6\x98\x39\x31\x18\xfb\x7b\x82\x44\x3f\x21\x53\x9a\xf1\x51\xce\xd4\x98\x0c\x40\xdf\x01\x70\x02\xf7\xb6\xc2\x05\xf9\x37\x48\x81\x9b\x6a\xc0\x5b\xb8\x08\x2a\x40\x7b\xbd\x3b\x10\x9b\x30\xc5\x04\xff\x81\x29\x2d\xe4\xf4\x0d\x4b\xd9\x03\xa5\x47\xfd\x98\xef\x72\x1c\x20\x28\x92\x18\x7b\x13\xb3\x88\x5e\x83\xfd\x60\x09\x68\xc1\xd4\xc2\xaa\xa7\xc4\x9c\x93\x01\x8d\x6e\x1f\x0d\xc0\xaf\x76\x05\xc2\x9e\x5d\x6f\x01\x55\x94\xf7\xc2\x04\x48\xb6\x2c\x52\x9e\xdf\x5b\xf8\x54\xa0\x7c\x37\x16\x0a\xf0\x06\x6b\x64\xc4\xc7\xbc\x53\x80\xa9\x40\x30\xcc\xe9\x16\x1c\x14\xa1\xc3\x61\xf5\x8e\xe2\xb0\xa3\xe4\x99\xe6\x4a\x93\x94\xea\x68\x6c\x4d\x59\x22\x0e\xe2\xc4\xbe\x72\x62\xff\x26\x50\x5e\xdb\x88\xbc\xb9\xb9\x97\xd8\x75\x9e\xdf\x1b\xdd\xf2\x41\x6f\x4e\x75\x54\x40\x3e\x3b\x4d\x55\x03\x4e\xaa\x1b\xe2\xe4\xb6\xd4\xb6\x08\xbe\x41\x03\x70\xf1\x0b\xee\xc2\xc9\xe5\xd9\xfa\xa6\x98\x6d\x14\xdc\x8d\x55\xdc\x59\x53\xf7\x8a\x8f\xf2\x26\x53\x77\xa5\x6a\xef\xb6\xad\xa1\x3b\x84\x92\x5b\x98\xda\x2e\xd2\x73\x6d\x79\x25\x24\x4e\x92\x00\xec\x4e\x6b\x6e\x72\x2d\xa5\x37\x58\xef\xc6\xd8\x63\xc7\x66\xae\x08\x3f\xba\x66\xa1\x1b\x3e\xe1\x3f\x7a\x83\xc7\x36\x47\x70\x3b\x6e\x61\xba\xd9\x03\x33\xdb\x6d\x76\xc1\xe9\x3e\x76\xdf\xcd\x0f\x41\xd0\x0b\x5b\xbd\x99\x8f\xa8\x3c\x36\x36\x51\xf9\xe1\x81\x58\xeb\xf3\x02\xfa\x95\xad\x4c\xe6\x1b\xf7\x95\x45\x46\x73\xa6\xc7\x2c\x43\x46\xe4\x9d\x01\xbe\xc9\xf9\xcf\x34\x61\x71\x98\xc2\x9e\xdf\x0b\xde\x31\xe2\x93\xf9\x0f\x12\x5d\x2b\xae\x9d\x09\x50\x97\x42\xe3\x2f\x9f\x0c\x40\x76\x99\xb5\xc0\x63\xa7\x70\x56\x68\xa4\x32\xa8\x78\x95\xfa\xa3\xab\x9e\xaf\xec\x15\x40\xc9\x14\xb9\xe0\x44\x48\x0f\x07\xec\x58\x6f\x27\xb2\x53\x20\x9f\x18\x58\x07\x07\xda\xa7\x17\xce\xe1\xc0\x27\x64\x05\x7a\x2b\xa6\x73\x53\xa1\x7c\x60\xaf\xd8\x8e\xf8\x09\x4a\xbb\x4e\x54\xa5\xde\xc9\xcd\x22\x92\x82\x1c\xa1\xc7\x25\x5a\xdb\xe3\x50\xdd\x94\xcd\xe8\xae\x1d\x1b\x53\xdf\xf2\x0b\x37\xc2\x02\x64\x4d\xd6\x04\x54\x87\xb9\xd9\x19\x2a\x26\xa7\xff\x36\x14\x1c\xf7\xe0\x7f\x48\x46\x99\x54\x3d\x72\x42\x14\xe3\xa3\x04\x2a\xd7\x9c\x86\x51\x9e\xc6\xcc\xc0\x14\x31\xa4\x76\x42\x13\xa7\x4b\x51\x4e\xc0\xda\xac\xcc\xec\xb3\x2c\xb5\xe3\x24\x15\x43\x79\x82\xa3\x6b\xef\x16\xa6\x7b\x9d\x39\xa4\xd9\xbb\xe0\x7b\x96\xb7\xcc\xa1\x49\x60\x44\xe8\x23\xdb\xc3\x6b\x7b\x4d\x72\xe1\x0d\x19\xce\xb6\x76\xb4\xea\x4b\xd7\xc6\x08\x1f\xdb\xb1\xa5\xb0\x5e\xd1\x12\x5d\x44\x93\x16\x24\x57\x60\xa5\x75\x3c\x65\x04\xbc\x9c\x89\x52\x25\x2a\xa6\x1c\xee\x50\x7a\xdc\x19\xc1\xcf\x68\x12\x8c\x8f\x7e\xca\x62\xaa\xd7\x0a\x2a\xb5\xa3\x02\x91\xfd\x2b\x3b\x09\xc9\x71\x16\x83\x5b\x43\x36\x22\x19\x95\x34\x55\x3d\xd2\x77\xd5\x0d\x11\xd3\xd8\xb0\x6c\x4b\x74\xb0\xbb\x99\x66\x40\xfe\x4c\xae\xca\x6b\xe9\x91\x6e\xb7\x4b\x6e\xde\x9d\xbd\x3b\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x1b\x9a\x13\x42\x35\x4c\x40\x92\x3b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x8f\x8b\xc7\xdb\x49\x26\x29\xbd\xbf\xce\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\x3b\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x7f\x4c\xfe\x13\x5d\xdb\x94\x64\x20\x23\xe0\x9a\x8e\x60\xd6\x0c\x60\xef\x7b\xfd\xea\x3f\x0e\x1d\x3f\x32\x33\x3a\xeb\xc9\x2b\x83\x11\x6f\xe9\xfd\x4f\xbc\x30\x0d\x32\x45\x5e\xf5\xc8\xc9\xcc\xcb\xf0\xb9\x24\xca\x13\xb4\xb5\xa0\xbb\xbe\xf4\xca\xc1\x94\x48\x91\xa3\xc3\x9e\xe4\x59\x55\x9b\xfd\xea\x3f\xff\xc3\x28\x7d\x34\xcd\x12\x38\xf6\x45\x51\xad\xda\x6c\x64\x18\x2d\xc8\xd7\xaf\xfe\xc3\x52\x4f\x73\x3e\x0b\xad\xb0\x80\x19\x35\x00\xcb\x33\xc2\x52\x1b\x8a\x09\xc9\xb4\xa8\xae\x2a\xab\xe8\xaf\x34\x95\x5a\x75\x08\x7a\xf5\x83\x70\xa8\x85\xa6\xc9\x8c\x96\x8f\x5a\x38\xdc\x59\x20\xc5\x02\x61\x02\x68\xa8\x22\xaf\xbf\x7e\xf5\x1f\xf3\xe6\x94\x77\x3c\x02\x7c\x12\x9f\xc0\x30\x8b\x81\x51\xee\x6f\x59\x92\x40\xdc\x79\x70\xf9\xc3\x5c\xea\x31\xc8\x0e\x01\xae\xbc\xb1\xca\xac\x6f\x66\x6d\x38\xbb\xcc\x39\x47\x19\xc1\x5a\x87\xd1\xa2\x55\xb2\x70\xb9\x8f\x35\x8c\x50\x93\x54\x28\xbd\x78\xc9\xeb\x1f\x37\x33\x28\x9f\xbe\x1b\x6e\x2a\x0e\x74\xb7\x30\x43\xcc\x3f\xbd\x85\x48\x79\xdf\xbd\x0d\x99\x92\x5d\xc6\x75\x57\xc8\xae\x9d\xe6\x98\x68\x99\x3f\xec\x35\x28\x46\x5a\x39\x01\x9f\x80\x0c\xe4\xa5\xf3\x36\xb7\xab\x8f\x72\xf2\xb7\x3f\xcf\xb1\xb8\xe3\xcb\x29\x07\x12\x4e\x47\x33\xb6\x3c\xf5\x55\x8b\xdb\xcc\xb1\x31\x6f\x37\x77\xff\xaf\x79\xec\xde\x80\x1c\xb8\xb3\x1b\x4e\xbb\x91\xab\xd0\xe3\xd1\x59\xe3\xed\xe1\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x05\x94\x6b\xee\x84\x2f\xa0\x40\x76\x1d\x85\x43\x46\x63\x44\x81\x39\xe7\x6a\xe9\x41\x4f\x80\x2a\xbd\x08\x14\xed\x41\x7f\x78\xac\x0e\xe0\x9f\x1d\x55\xa1\xd3\x48\x48\x08\xf2\xc2\xc6\x78\x6a\x11\x65\xef\x0a\xac\x87\xcf\x06\x9c\x55\x84\xa8\xbd\x70\x24\xcc\xfe\x55\xe5\xab\xc7\x0a\x9b\xf1\x46\xce\x6d\x44\x6b\xf7\x68\x29\xb0\xd7\x99\x4e\x1d\xf1\x0a\x1e\x45\xeb\xd2\xdc\x19\x29\x3a\x05\x4d\x57\x27\x79\xcc\x8e\x2a\xd1\xbe\xd6\x94\xc7\x54\xc6\x6e\x95\xfb\xfb\x2a\x4c\xd9\x23\x6f\xd1\x97\xc6\x87\xe2\x98\x8c\xb5\xce\xd4\xf1\xd1\xd1\x88\xe9\xde\xed\x1f\x54\x8f\x89\xa3\x48\xa4\x69\xce\x99\x9e\x1e\xa1\x03\x8d\x0d\x72\x2d\xa4\x3a\x8a\x61\x02\xc9\x91\x62\xa3\x2e\x95\xd1\x98\x69\x88\x74\x2e\xe1\x88\x66\xac\x5b\xc8\xcc\xaa\x97\xc6\xbf\xf5\x2f\x7a\x64\xc1\xb8\x72\x86\xd0\xba\x24\x27\xd0\xcd\xf9\x2d\x17\x77\xbc\x8b\x9a\xac\xda\xe8\x34\xad\x17\xc5\xe0\xc7\x0c\xbc\x37\x09\x5c\xc8\x44\xfc\xe8\x9b\x60\x3e\xa6\x4b\x79\xdc\xb5\x4e\xc7\x47\xde\x8b\x6d\x6c\xbb\xdd\x22\x30\x60\x9d\x88\x73\x3b\xb6\xd3\x86\x68\xa4\xd9\x04\xb6\x72\x62\xfb\x51\xd9\xee\x77\x3e\x60\x34\xce\xa5\xdd\xf1\x92\x37\xdb\xfb\x66\x52\x3a\x45\x59\x07\xdf\x4d\x84\x65\xe5\x5c\xc4\xe0\x2c\x9f\x13\x54\xed\xaf\x0d\x33\xbf\x31\xa2\xb0\xf3\x71\xa3\xdd\x77\xaa\x34\xa4\x96\x38\xd9\xe7\x93\x29\xd1\x72\x6a\x1d\xe3\xf2\xd6\x28\x9f\xce\x73\x6d\x24\xfe\x5b\xbc\x4f\x29\x11\x31\x14\x7d\x0a\xb8\x7a\xb9\xcb\xdb\xf0\x28\xc9\x84\x62\xf8\x6e\xc7\xf3\x36\xb3\xcc\x6d\xcf\x2e\x4b\x6e\xba\x6f\x7e\xbf\xc9\xd6\x0d\xb1\x8d\xc2\x86\x56\xf6\x6a\x04\xc5\xb0\x1c\xe1\xef\xb6\x67\x5f\x79\xc5\xd5\x88\x25\x91\xe0\x4a\x4b\xca\x96\xe7\x30\x2d\x1e\x5b\xba\x42\xb6\xf7\x37\x10\xc4\xa0\x93\xad\x80\x42\xe6\x63\xb0\x3c\x53\x44\xb4\xf4\xa0\x2e\x03\xc6\xa6\x38\xf9\x58\x42\x43\xb8\xb6\x34\xad\x6e\x01\x23\x52\x0b\x4e\xf6\x69\x18\x82\x94\x10\x9f\xa1\xf4\x79\x1d\xbe\xeb\x62\xc4\x45\xf8\xf9\xfc\x1e\xa2\x7c\xdd\x4c\xf0\xf9\x31\x67\xcb\xf3\x06\x11\x17\x76\x62\x17\x61\x8e\xae\xbf\xe0\xe4\x0f\x81\x60\x77\x82\x88\xa2\x9a\xa9\xa1\xcd\x17\x0b\x1b\x01\x25\xc7\x67\x40\xe1\xe0\x1e\x46\x16\x67\x53\x1f\x98\x46\x72\x13\x8d\x85\x50\xe6\x94\xe3\x7e\xe2\xbc\x13\x26\xac\xcf\x0f\x93\x57\x24\x49\x0d\x8d\xf1\x49\x2c\xc5\xf4\xd6\x50\x5b\x3c\xc6\x94\x55\xc1\x03\x04\xbd\x97\xca\x4c\x83\x86\x47\xf3\xc7\x08\xa5\x26\xa5\x89\xca\x53\x33\xe9\x1d\xb0\xd1\x58\xab\x0e\x61\x3d\xe8\x21\xd6\x00\x8d\xc6\xa5\x69\x53\x00\x5d\xe9\x82\x52\x46\xb5\xb2\x95\xf8\x20\x64\x35\xb8\x34\x9c\x4e\xe0\x31\xb3\x7b\xb9\x10\x5c\x1d\x02\x3a\xea\x1d\x76\x48\x91\x28\x6e\xd6\x38\x98\x12\xa6\xc1\xd0\x6c\xd4\x45\xa4\xc8\x47\xf6\x4b\xc0\xc7\x74\xe2\xba\x42\xca\x07\x7a\x51\x63\xd4\x19\xf7\xec\xc7\xed\x99\x7d\xc3\x95\xe7\xa9\xd1\x17\x03\x51\x47\xb3\xba\x6f\x9c\x23\xa4\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x77\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xc3\x1a\x87\x63\xe4\x15\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xc3\x65\x11\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x71\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x23\x05\x29\x75\xaa\x11\x4a\xe4\x7b\x6d\xcf\xf1\x9b\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x26\x51\x4e\x0b\xa6\xfa\x5e\x9b\x69\xde\x2c\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\xcb\x0a\x60\xd8\x97\xb7\xc3\x7c\x9a\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xac\x5d\xf8\x09\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\xdf\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x76\x24\xf6\x06\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xba\xfb\xfa\xd5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x9a\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xee\x6a\x5b\xf7\x18\x69\x88\x27\xd4\xe6\x03\xb3\x0a\x54\x9e\x24\x06\xbd\xad\xc7\x6c\x1e\x04\x0b\x3c\x59\x0b\xb2\x6d\xac\x9b\x35\x2d\x65\xdd\xe0\x3d\x37\x22\x13\x89\x18\x4d\xcb\x3b\x68\x3b\xb2\x94\xca\xdb\x50\xa2\xf2\x81\x13\x01\xcd\x21\xba\x9c\xd9\xf2\xd6\x17\xb2\x74\xb4\xbe\x90\xb9\xd1\xda\x07\x66\x47\x6b\x1f\xd8\x60\xb4\xf6\x81\x05\xa3\xb5\x0f\xcc\x8f\xd6\x3e\xd0\xda\x07\xea\x8c\x97\x6f\x1f\x20\xad\x2f\x64\xd9\x68\x65\x9d\x62\xb4\xb2\xce\xfa\xa3\x95\x75\xe6\x47\x2b\xeb\xb4\xb2\x4e\x2b\xeb\xb4\xb2\xce\xb6\xa3\x06\x72\x67\x22\x6e\x3c\x45\x26\x13\xf1\x8a\x0c\x19\x6b\xaf\x8e\x44\x37\x11\x51\xa8\x2c\x62\x1e\x71\x9e\x0f\x45\x53\x6b\x42\xef\x90\x7f\x0b\x0e\x36\x3d\xc1\x96\xac\x4d\x81\x08\x6c\x02\x91\x89\xf8\x40\x1d\x6e\x11\x78\xde\x66\xd8\xb4\x19\x36\x9f\x41\x86\xcd\x98\x2a\x57\xf8\x08\x49\xeb\xf2\x84\x9b\xd2\xf1\xbf\x01\x99\x7e\xb6\xf9\x36\x06\xe1\x1c\xc2\x60\x8f\xb8\x02\x29\x2c\xec\x62\xe7\xdb\x85\xb8\x5f\x85\x98\xd3\xcb\x6c\x8b\x9d\x38\x86\x98\x64\x20\xbb\x16\xc9\x04\x19\x32\x57\xff\x6b\x06\x7f\x1d\x84\x9f\x79\xde\x4c\x15\x12\xcf\x3a\x79\xa6\xfa\x29\x8d\xf9\xa6\xca\x2e\xba\x0a\x57\x7c\x76\xa9\x34\xcd\x68\xa5\x5d\xa2\x9d\x3b\xed\xc7\x5a\x7a\x69\x53\x4a\x24\x2a\x79\xd7\x1b\x95\x39\x5e\x3e\x16\x16\xa7\xfd\x57\x0e\x72\x4a\xc4\x04\x64\xa1\x18\x85\xee\x3c\x9d\xd0\x64\x26\xa2\xae\x00\x72\x33\x06\x9e\x46\x4c\x11\x4d\x6a\xea\x4d\x7b\x0d\xc9\x8e\x55\x3f\x5e\x3e\x9a\x55\x1c\x1a\x54\x1b\x9e\x5b\x2d\xe5\xe5\xa3\x51\xf3\x1b\x69\xd8\x04\x47\x1a\x34\xc3\x91\x66\x4d\x71\xa4\x71\x73\x1c\x69\xd2\x24\x47\x3e\x79\x05\xe8\xe5\xa3\x61\xf3\x11\x69\xdc\x4a\x47\x9e\x61\x3d\xe9\xe5\xe3\x11\xc0\xdd\xa4\xc5\x8e\xb4\xd5\xa9\x6b\x8f\xa6\x0d\x6a\xa4\x69\xa3\x1a\x69\x1a\x0f\xb7\xaa\x82\xbd\x7c\xb4\xf5\xb1\x1f\x41\x4e\x6b\x4c\x88\xa8\x5b\x53\xfb\xa1\x85\x36\x80\x93\xa1\x77\xef\xa7\x52\x80\x2c\x97\x2e\x1a\xc6\x9a\x77\x97\x7a\x75\x61\xa8\x66\xb9\xb1\xa9\x8f\x5b\x45\x8c\xc6\xdf\x63\x6f\xf0\xca\x79\xa9\x78\x5c\x69\xb2\xb9\xd6\x31\x85\xe9\x2c\x34\x8f\x31\x4a\x41\xd1\x74\xaa\xf4\x30\xde\xdb\xb3\xe1\xa4\x85\x34\xc1\xe3\xd9\x00\xd3\xe2\x09\xd4\x2f\x6c\x3b\xdb\x3d\x6f\xc7\xde\x57\xc5\x1d\x7b\xbd\x72\xe7\x5b\x37\xe3\xc1\x7f\xff\xcf\x61\xa5\x7a\x4b\x31\x61\xab\xfd\xad\x3d\x5a\xed\xaf\xd6\x68\xb5\xbf\xa5\xa3\xd5\xfe\x6a\x8c\x56\xfb\x5b\x6f\xb4\xda\xdf\xf2\xd1\x6a\x7f\xad\xf6\xb7\xc5\x68\xb5\xbf\x56\xfb\xdb\x76\x7c\xc6\xda\x5f\xb3\x51\xcd\x65\x5d\xcc\x05\x89\xa0\xfc\xa8\xa9\x66\x51\x11\xf1\xec\xef\xb2\xff\x6a\x56\x07\x2c\xeb\x77\x8b\x35\xc0\xb2\x96\x38\xa7\x05\xf7\x1e\x50\xf7\x82\x42\x38\xf7\xe4\x6a\x4d\xf0\xa5\x45\x6e\x37\x86\x89\x25\x97\x70\xa3\xa8\x78\xe3\x03\xcb\x8a\xc6\xeb\x21\xea\x2c\x26\x07\xde\x17\x8f\x8d\x54\xb8\xd0\xd5\x8b\x5c\xb3\x6e\x71\x47\xf0\xce\x63\x50\x4d\x25\x9f\xbf\xe2\x42\x0e\x31\x6c\x21\x3e\xaa\xc0\x1e\x43\x1e\x41\x56\xd6\x80\x8d\x6b\x87\x8c\xdb\x48\x47\xdf\xf4\x47\x70\x1f\x34\x65\xe9\x29\x52\x40\x8f\xe7\x56\xf4\xc5\xf5\xa0\xfc\x5b\xc0\xae\x14\xe5\x43\xf1\x90\x51\xee\x92\x61\x05\xf7\x5d\xe9\x6d\xa7\xf9\x42\x5e\x0e\xbd\x54\xc2\xdb\x7b\xe4\x1c\xb1\xbe\x3c\x31\x53\x08\x1f\x6a\xfb\x9f\x34\x83\xc8\xbb\x55\xb8\xe1\x6e\xe3\xc2\x0d\x33\x11\x23\x6d\xdd\x86\xb6\x6e\x43\xad\xba\x0d\x78\xd1\x1e\xee\xc6\x0b\x38\x90\xbf\xb9\xf6\x48\x12\x10\x54\x69\x9e\x68\x96\x15\x11\xd8\xca\xbe\x2a\xb1\x9a\xc4\xd0\x45\x82\x56\xf1\xdd\xbc\x8d\x46\xe3\x59\xbc\xc7\xf9\x30\x62\x5b\x21\x39\x71\xd1\x96\xd8\xcc\x08\x2b\x0e\x78\xb5\xc3\x86\x94\xb2\xe7\x1f\x29\x78\x86\x04\x5b\x15\x5a\xb3\xed\xb5\x65\xe8\x7c\x62\x50\xc2\x50\xec\x15\x0c\xa2\xdc\xd0\x02\xa3\x56\xd9\x04\x78\xc1\x25\x0e\xd4\xe1\xa1\x97\x86\x1a\xe5\x5e\x8f\xc2\x7d\xfe\x54\xe2\x12\x7f\x59\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\xcf\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x9e\x3c\xa2\xed\x73\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x5e\x86\xdf\xa2\x4d\x18\x5d\x7f\x3c\x87\x84\xd1\x27\xf2\x4d\x3c\x9f\xbc\xd1\x67\xeb\x8f\x78\x2e\x79\xa3\xad\x0f\x62\xa3\xf1\x52\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8e\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xca\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x99\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x11\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4e\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\x8b\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x67\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\x0f\x8f\xcf\xbe\x1a\x5d\x25\x96\xee\xe9\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x65\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\x8b\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x99\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\xd7\x20\x27\x2c\x82\x93\x28\x32\x7f\xdd\x88\x5b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xbb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\x6f\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x47\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7b\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\xcf\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x5f\x1c\xfc\x7c\x72\xf5\xcb\xe5\xc9\xdb\xf3\x43\x94\x40\xe1\x3e\xa3\xdc\x9c\x8a\x5c\x15\x81\xa2\xee\x75\xe6\x45\xc0\x27\x4c\x0a\x6e\xd6\x87\xba\x1a\x25\x13\x3f\x6b\x14\x0e\x83\x04\x25\x92\x09\xc4\x56\x4e\x0e\x6f\xf3\x5c\x87\xf1\x2c\xd7\x5e\x77\xc4\xf0\x45\x73\x80\x78\x34\xa6\x7c\x64\xd6\x79\x26\x72\x33\xdf\x17\x5f\xe0\x8a\x24\xc4\x79\x64\x25\x27\xea\xb1\xf6\x8b\x8e\xe7\x14\x86\xd6\x2b\x5b\x12\x51\x45\x34\xf3\x6b\x2e\x7f\x96\x9a\x72\x4d\xef\x8f\x6d\xfc\xde\xde\x17\xa5\x4b\x7b\xbe\x9c\xa4\x30\xaf\xb0\xfc\xc6\xae\x2a\xc1\x4a\x86\x09\xd9\x2b\xdf\xdd\x23\xe7\xe6\x1d\x10\x97\x01\x68\xc3\x2f\x61\x02\x12\x35\x4f\x07\xbe\x0e\x91\x30\xa2\x32\x4e\x40\x61\xe0\xa1\xa7\xcd\x56\x3b\x70\x00\x83\xa0\xd7\x72\xa1\x17\x11\x13\xf2\x56\x60\x10\xe2\x50\x1c\x93\xb1\xd6\x99\x3a\x3e\x3a\xba\xcd\x07\x20\x39\x68\x50\x3d\x26\x8e\x62\x11\xa9\x23\x4d\xd5\xad\x3a\x62\xdc\x1c\xae\x6e\x4c\x35\xed\x96\x4e\xf5\x91\xe5\xdc\xdd\x48\xa4\x29\xe5\x71\x97\x3a\xec\xea\x86\x6d\x3d\xfa\xad\xe3\xa9\x5d\x1a\xee\x62\xbc\x4b\xbb\x6a\x0c\x49\xb2\xbf\x05\x3e\xd7\x93\xf9\x6a\xc8\x7a\xb5\x64\x3c\xf7\xed\xf5\x0f\xf0\x79\x38\xaf\x16\x06\x3d\x72\x29\xb4\x8b\x8f\x75\xa1\xd8\x48\x47\x11\xbe\x4b\x8f\xf4\xf9\xe5\xcd\xd5\xdf\xfb\xef\x2e\x2e\x6f\xda\x93\xdd\x9e\xec\xf6\x64\xd7\x38\xd9\xc0\x27\xb5\x4f\xb5\x97\x39\x4b\xc7\x24\xec\x37\x72\x6a\x05\xda\x1f\x83\xb0\x01\xb5\x25\x44\x3b\x9e\x0c\xea\x15\x08\x9c\xf3\xc9\xcf\xb4\x6a\x61\xe7\x0b\xc1\x41\xdc\x0d\x56\x50\x0e\x32\x78\x9d\xf8\xf8\x1a\xd6\xac\xba\xee\xab\xad\xa4\x48\x3b\xea\xbb\x96\xcc\xab\xb7\x37\x34\x54\xb6\xef\x92\xa6\x45\x85\xea\x05\xbb\xd6\x23\x6f\xbd\xda\x43\x4e\x7f\xb9\x38\x3b\xbf\xbc\xb9\xf8\xee\xe2\xfc\x6a\x7b\x3d\xba\x01\x8b\x0b\xda\x14\x1a\x02\xc0\xfe\x96\x5c\x32\x93\x30\x61\x22\x57\xc9\x34\x58\x41\x16\x13\x81\xd9\xd3\xef\xfc\xbe\xd3\xa0\x8f\x2f\x7c\xac\x65\xb6\xcd\x32\xdb\x33\x18\xd2\x3c\xb1\xda\xd3\xde\x5e\x6f\x1b\x2e\x67\x47\x53\xe8\xfb\x9d\x14\x35\x2a\x30\x57\x50\xf8\xda\xd6\x6e\x1f\x0a\xb9\xf4\x18\xef\xbb\xe8\x83\x0a\xeb\x71\xc2\xa3\xb5\xd0\x39\xe9\xd1\x3a\xc9\x6a\x42\xa7\xa6\x97\xa1\x19\xdf\x7b\x24\xf8\x90\x8d\xde\xd2\xec\x47\x98\x5e\xc1\xb0\x9e\x99\xb8\x0a\x6f\xb4\x3e\x3a\x57\x32\xda\x2a\x0d\x3b\xb3\x2f\xab\xe7\xa6\x69\xcc\x49\xd3\x54\x74\x46\xfd\xc8\x8c\xe6\x02\x29\x1a\x09\xa2\x98\xab\x87\x6f\xed\xd0\xce\xa2\xdc\x54\x8c\x4d\x23\x9e\xfb\x7a\x5c\xde\x8f\x2a\xb3\x2b\xb3\x7b\x47\x67\xf5\xba\x6a\x47\x24\x78\x04\x99\x56\x47\x62\x62\x38\x17\xdc\x1d\xdd\x09\x79\x6b\xf4\x08\xa3\xbb\x76\x2d\xd6\xaa\x23\xf4\x19\x1c\xfd\xd6\xba\xc1\x6e\xde\x9d\xbd\x3b\x26\x27\x71\xec\x9a\x9b\xe4\x0a\x86\x79\xe2\xda\x09\xf4\x08\xcd\xd8\xcf\x20\x15\x13\xbc\x43\x6e\x19\x8f\x3b\x24\x67\xf1\xb7\xdb\x13\x67\x3f\x1a\xdc\x05\x91\x59\x57\x67\xc3\x3b\x71\x8d\x3e\x96\x69\x85\x77\x05\x22\x62\xb8\x16\xd3\x0a\x71\xd3\x5b\x9d\x9d\x90\xd1\x10\x68\x36\x37\xd1\xcf\x0e\xdc\xc2\x66\xe9\xea\x7e\x41\x58\xad\x8b\xd3\x21\x6a\x26\xe2\x63\xa2\xf2\x2c\x13\x52\x2b\x92\x82\xa6\x46\xe9\xed\x19\x0c\xeb\x54\xff\x44\x5f\x55\x87\xfc\x23\xfc\x88\x0e\x27\xf5\x7e\x7f\xff\x4f\x3f\x9e\xff\xfd\x2f\xfb\xfb\x1f\xff\x51\xbe\x8a\xac\xd0\x46\x01\x55\x6f\x51\x19\x44\x3d\x2e\x62\xb8\xc4\x77\xe0\x9f\xaa\xe2\x66\x71\x17\x34\xd5\xb9\xea\x8d\x85\xd2\x17\xfd\xf0\x67\x26\xe2\xd9\xbf\x54\x0d\x89\x83\xec\x26\x63\xc0\x2d\xea\x53\x3d\xde\x11\xf6\x50\xd0\x92\x86\x8f\xaa\x9b\xb5\xdc\x44\x27\xa5\xf8\xcf\xef\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x7a\x73\xa9\xe0\x62\xd8\x31\xa7\xb6\x10\x3b\x27\xaf\x6b\xd7\x47\x69\x94\xb4\x85\x1d\x6c\x18\x60\x08\x11\x07\x2d\x7b\x90\x03\x83\x9d\x77\x31\x9f\xf4\x2f\xc8\xc4\x42\x78\x67\x80\xe3\xd3\x7b\xbf\x7b\x54\x1a\x17\x9a\x2e\x39\x50\x05\x0d\xf1\xd8\x06\x05\x85\x24\x63\x92\xb0\x94\xb9\x58\x43\xd7\xa0\x49\x91\x03\xfb\x63\x2f\xca\xf2\x8e\xbb\xa1\x97\x42\x2a\xe4\x34\xfc\x09\xd9\x18\x52\xa3\x69\x75\x95\x16\x92\x8e\xa0\x13\x1e\xb7\x8f\x85\xbf\xec\x83\x95\x17\xcc\x3f\x6d\x55\xe1\xc2\x55\xea\x28\x32\xc4\x2f\x8f\xb6\x79\xd0\xef\x08\x69\x0b\x98\x71\xf9\x08\x22\x61\xb0\xc4\x59\x81\x33\x40\x11\xf5\xc9\x89\x48\xf2\x14\x54\x27\x88\x41\xd6\x1a\xc0\x27\x46\xb3\x54\x3b\x25\xa8\xc5\x6c\xc2\x54\x13\x61\xc4\x0b\xe4\x34\xe6\x22\xf2\x45\xae\xb3\x5c\xbb\x7a\x33\xa5\xc6\x6e\x42\xa1\xdd\x22\x14\x05\xa8\x90\xfd\xd7\x7b\xf5\xa3\xd1\xa9\xd6\x20\xf9\x31\xf9\xaf\x83\x0f\x5f\xfe\xda\x3d\xfc\xf6\xe0\xe0\xfd\xab\xee\x1f\x3f\x7e\x79\xf0\xa1\x87\xff\xf8\xdd\xe1\xb7\x87\xbf\xfa\x3f\xbe\x3c\x3c\x3c\x38\x78\xff\xe3\xdb\xef\x6f\xfa\xe7\x1f\xd9\xe1\xaf\xef\x79\x9e\xde\xda\xbf\x7e\x3d\x78\x0f\xe7\x1f\xd7\x9c\xe4\xf0\xf0\xdb\x2f\x6a\x2f\x9d\xf2\xe9\xbb\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xbe\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x14\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\xbe\x34\x3e\xf7\x39\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x16\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\x78\xd0\x18\x74\x6d\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xce\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x16\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x65\x05\x20\x18\x44\xbc\xf6\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x4f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x09\xce\xc0\xfa\xec\xf3\xb3\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x37\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xf5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x4f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x81\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd6\x54\x1b\xac\xbe\x06\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\xef\x38\x12\x8d\x93\xe4\x8e\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\xee\x98\x5a\xa8\xac\xd4\x46\x9c\xdf\xe2\x4c\x86\x56\xd9\xbf\x3f\xf9\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\xb5\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x2a\x92\x73\xcd\x12\xbb\x18\x21\x6e\x49\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\xb7\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\xf7\x10\x35\x96\xe7\x7f\x7e\x0f\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x16\x5e\x50\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xaf\xfb\x1d\x02\x3a\x3a\x24\x77\x82\xef\x6b\x5c\x7e\x8f\xdc\x08\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcf\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x67\xda\xc5\xab\x19\x92\xf1\x0a\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x37\x48\x81\x39\x88\xdc\x5d\x79\x71\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x1e\x9a\x6b\xe2\xf3\xc3\xcd\x4d\xff\x7b\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\xbf\x8b\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x00\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x5e\x1c\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xe3\x94\xbe\xfc\x14\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\xff\xf9\x9f\x5f\xff\x67\xcf\x4e\x1f\xa2\x14\x38\xb9\x38\xb9\x3c\xf9\xe5\xfa\xe7\x53\x4c\x8e\xad\x0b\xd5\x86\x42\x30\x9b\x0e\xc0\x6c\x34\xfc\xf2\x51\x83\x2f\x31\xe5\xa3\x36\x15\xa9\xda\xfe\x71\x4a\x83\x01\x46\x6f\x33\x1a\xa7\x93\xfd\x4a\xc5\xca\x8c\xac\x59\x35\xa4\x9a\xa3\xb6\x13\x67\x4c\x47\xd9\xb5\x88\x6e\x1b\xd4\x6b\xce\x20\x93\x10\x59\x3b\xd9\xcd\x69\xdf\xce\x6e\xf4\xcb\xcb\x77\x37\x45\xaa\x01\xc6\xe3\x90\x37\xde\xbe\xf4\x83\xb3\xa4\x19\x9d\xf4\x16\x32\x1d\x54\xf7\x01\x8d\x6e\xef\xa8\x8c\xd1\xb2\x45\x35\x1b\xb0\x84\xd9\xe2\xbf\xbe\x29\x24\x17\x36\xe0\xcf\x16\x39\x13\xc3\xd9\xd2\x9a\x85\x39\x14\x4d\x56\x36\x8e\x66\x48\x59\x82\x16\xd4\x9c\x6b\x96\x82\x8b\x08\x8a\xb2\x60\xd2\x2b\xdb\xb4\x5b\xe5\xcb\x8f\x9d\x55\xbe\xf6\xdf\x79\xaf\xde\xc6\x7a\x58\xdd\xb8\xc4\x1d\x66\x75\x8e\xc5\xd9\x84\x90\x96\xd5\x7d\x16\xac\x2e\x93\x70\xad\x45\xd6\x90\x97\xc4\x4e\xb6\xc4\x47\x32\x80\xa1\x30\x44\x78\xa9\xd3\xc3\xf7\x08\xe6\x98\x1c\xe8\xad\x5a\xa2\xe2\xd8\xb0\x11\x99\x2a\x8f\xc6\xde\x40\xc9\x41\xa9\x23\x74\x87\xe4\x99\xd5\x5a\x91\x5c\xe7\x12\x3a\xe6\xeb\x20\xc5\xd5\x75\x8a\x2c\x07\xf3\x7a\xe0\xf6\x47\xd0\x91\xb5\xdc\x96\x08\x39\x16\x06\x75\xcb\x9f\x75\xa3\x44\x92\xaa\x31\x60\x79\x11\xb8\x67\xbe\x1b\x4a\x5f\xc4\xfb\xfb\xc5\xa7\x18\xc6\x32\x92\x34\x02\x92\x81\x64\xc2\x30\xa3\x9c\xeb\x58\xdc\x71\x32\x80\x11\xe3\xca\x83\xc2\xcc\xed\x61\x86\xfe\x18\xa6\x42\x61\xb8\x1e\xb9\xaa\x14\x3b\x71\x69\x48\x91\x28\x8e\xa6\x5b\xf3\xac\x27\x09\x39\x56\xa9\x65\x72\x80\xb0\x0f\x8f\xd5\x6b\x2c\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\xd1\xa6\x43\xc6\x69\xc2\xfe\x0d\x52\x1d\x36\xe0\x71\x32\x20\x2c\xae\x2d\x5d\x07\x96\xea\xa7\xd1\xb8\x9e\xf3\xb7\x75\x51\xad\x39\x5a\x17\x55\x9d\x49\x5a\x17\x55\xeb\xa2\x7a\x60\xb4\x2e\xaa\xd6\x45\x35\x33\x76\x56\x4b\x6a\x5d\x54\x5b\x8f\xd6\x45\xb5\x7a\xb4\x2e\xaa\x35\x46\xeb\xa2\x5a\x73\xb4\x2e\xaa\xd6\x45\xd5\xba\xa8\x5a\x17\xd5\x67\x64\xb7\xf3\xa3\x75\x51\xcd\x4d\xd2\xba\xa8\x5a\x17\xd5\xda\x63\x67\x95\xaf\xd6\x45\x65\x47\xeb\xa2\xaa\x8e\xcf\x8b\xd5\x79\x07\x4f\xdf\xa8\x7a\xf5\x73\xda\xfa\xe8\x54\x60\x91\xf3\x13\x95\x9b\xc6\x85\x57\x95\xfa\xc4\x95\xca\x82\xf8\x54\x1c\xe7\x11\x2a\xfc\x4c\x0b\xf3\xa5\x36\x75\x55\xf8\x24\x43\x75\x94\x09\xfb\x7f\x85\xa3\xa2\xe4\xa1\xb0\x0a\xef\xf6\x39\x6b\x4f\x96\x8d\x55\xc7\x2d\xf1\x69\x5c\x12\x3b\xe2\xbf\x69\xc0\x0d\xd1\xba\x20\x5e\x9c\x0b\xe2\xe5\x74\xcd\x75\x9e\xf9\x9b\xb1\x04\x35\x16\xc9\xd6\x88\x5e\x41\xf2\xb7\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x12\x42\x00\x54\x40\x57\x4b\xb1\xad\x15\xd1\xdc\xc8\x62\xc0\x62\xa7\x94\x25\x66\x1b\x31\x7f\x73\x4c\x27\x06\xd7\x55\x1e\x45\x00\xd8\x4a\xad\xac\xe1\x7c\xdd\x0b\x6f\x0a\xad\x33\x5e\xd7\xa3\x37\xf5\x98\xb8\x2d\x47\x8a\xb3\x7c\xfd\xd5\x56\x73\x8c\x64\xd6\x0c\x5d\xfe\xfe\xaa\x7f\x5a\x6e\x93\xcd\x3d\x59\x66\x7c\x22\x92\x89\xed\xb0\x8f\x37\x19\x61\xcd\x35\xe3\xc7\x66\xee\x03\xd0\xb4\xa4\xdb\x38\xb5\x40\x11\xe0\x74\x90\x98\xe7\xcc\x53\x81\x23\xf7\x2d\xdf\x05\xaa\x73\x09\x64\x44\xf5\x53\x12\xfc\xfa\x2a\x4c\x2d\xf5\xa5\x09\x7e\x53\x57\x42\xaf\xda\xe0\x8c\x1c\x5e\xb5\x42\x8d\x10\x2f\x6c\x05\xfd\xb5\xe5\xf0\xda\x94\xb2\xbe\x6c\x5c\xff\x68\x11\x2c\x71\x83\x1f\xde\x18\x80\xf7\x5c\xcb\x67\xcf\xce\xcb\x4a\x90\xef\x2a\xa5\x05\xc9\x12\x5a\xf4\x85\xc2\x1d\xf8\x01\x79\xd0\xe9\x18\xa2\xdb\x2b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\xf9\xc0\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xa7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6e\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x42\x51\xe6\xc7\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x29\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xa7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\xcf\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x47\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x86\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x88\x3b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\xd7\xaf\xfc\xcd\x2f\xcf\xec\x88\x06\x56\xa5\x1e\xdf\x0a\xec\x5e\xf4\xb0\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x75\x51\x4e\xf9\x35\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\x2f\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\xf3\x90\xd5\xf8\xe6\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x4f\x14\x9b\xb2\x83\x82\xee\x33\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x7b\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xcb\x92\xc4\x4d\xd3\x23\xd7\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf9\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x8e\x1f\x6e\xe4\x75\x45\x47\xeb\xcd\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x3b\x1a\xc1\x52\x10\xb9\xfe\x24\xda\xdf\xdd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x6b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xff\xf2\xe6\xe4\xaf\xe7\x6f\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x72\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x8a\x4f\xe7\xe6\x92\x55\x0e\x50\xd4\xc2\xc0\xf9\x11\x9b\x38\x32\xec\x8a\xdf\xd3\x38\x44\x8a\x19\x3c\x37\x68\x61\x58\x15\x1d\x60\x84\xd7\x18\x08\x07\x6d\xd0\x3a\xd8\x98\x04\x57\x95\xe2\x24\xb9\x02\xd5\x21\x83\x1c\x63\xd2\x32\xc9\x52\x2a\x59\x32\x2d\x4f\x66\x78\xd5\x65\x70\x79\x4f\x67\x97\x74\xf6\xee\xfc\x1a\x73\x04\x32\x69\xcb\x96\x60\x50\x19\x5e\xc7\xcf\x1a\x80\x79\xc2\xb5\x11\xee\x91\x13\x3e\xb5\x17\xed\x01\x67\x8a\x24\x4c\x69\x40\x16\xec\x64\x48\xef\x4c\xdf\x7b\xd5\xc3\xff\xed\x99\xaf\x94\x46\xc8\x0c\xb1\x72\xd1\x5c\xf0\xaa\x15\x43\xd9\x20\x29\x41\xd3\x7d\xfb\x8b\x6a\x08\x57\x04\x09\x19\x20\x96\x1a\xc2\xd1\xb0\xd5\x08\x5e\xdb\x20\x90\xf1\x51\x52\xc6\xaa\xed\xc8\x7e\x5d\xdd\xb2\xae\x66\xd9\x2d\xbe\xa0\xbf\xad\x82\xd9\x48\x63\xba\x62\x0d\x0d\xb5\x73\x2a\xb8\x9f\x57\xa7\x1c\x45\x10\xe5\x0e\xbd\x17\x7d\x7f\x02\x9c\x74\x93\xce\xb4\x75\xcd\x8a\x98\xa4\x0e\x79\x45\xfe\x44\xee\xc9\x9f\x50\xbd\xfa\xa6\x6e\xf3\xab\xba\x8a\x4f\x13\x21\x46\x46\xab\xbf\xe8\x37\x04\xf1\xbf\x19\xea\x64\x66\x34\x50\xd5\x82\x0c\x98\x13\xe7\xe1\x5e\x83\x34\x74\xd4\xed\xc4\x93\xb6\x0d\x33\x0b\xfc\x84\x68\x66\xdd\x0d\x17\xc3\x6a\x58\xd3\x66\x88\x66\x1e\xff\x41\x28\x7d\xe9\xa8\x50\xb5\x01\x4e\x31\x5b\x4a\x75\x34\xae\x92\x31\x23\xa8\x29\x5d\x1c\x30\x45\x62\x81\x51\x56\x36\x7c\x79\xcc\x6a\x04\x4f\xec\x0e\x1a\xd7\xf3\xa7\x57\xf6\x73\xd5\x4e\xcd\x18\x50\x50\xf3\x71\x82\x55\xa9\x32\x56\x26\x62\x27\x93\x99\x65\xc5\x25\x9e\xb1\x42\x28\x73\xb6\x9a\x60\x65\x46\x5c\x32\xe7\x29\xa2\xdc\x26\x90\x0c\x41\x4a\x1b\x71\x3e\x98\xfa\x60\xbd\xda\x9b\x57\xeb\x24\x65\x52\x68\x11\x89\x1a\x9d\xcd\xaa\x3e\x6e\x37\x1d\x02\xc1\x46\xf9\x7a\x33\xf9\x4f\x67\xfd\x0e\xb9\x39\xed\x63\xb7\xa7\xeb\xd3\x9b\x7e\x55\x53\xd9\xbb\x39\xed\xef\x3d\x29\x28\x88\x97\xac\xd0\x30\xbd\xc5\x24\x15\xc3\x93\x11\xdb\xba\x29\xcd\xba\xb7\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xec\x13\x65\x71\xf9\x30\xd8\xf0\xce\xc5\xe9\x5c\xa9\x98\x40\x6c\xc5\x61\xff\x04\xf0\x38\x13\xcc\xc8\x8b\x6d\x8e\xd7\xe6\x4f\xb7\x39\x5e\x6b\x8f\x36\xc7\xab\xcd\xf1\x9a\x1f\x3b\x13\xc8\xda\xe6\x78\xbd\x2c\xbf\x7d\x9b\xe3\xf5\x99\xbb\xfe\xdb\x1c\xaf\xc5\xa3\xcd\xf1\x6a\x73\xbc\xd6\x1b\x6d\x8e\xd7\xe6\x63\xe7\x82\x96\xda\x1c\xaf\x8d\x46\x9b\xe3\x35\x3f\xda\x1c\xaf\x25\xa3\xcd\xf1\x5a\x32\xda\x1c\xaf\x36\xc7\xab\xcd\xf1\x6a\x43\x5f\x1f\x9c\x6b\x37\x43\x5f\x49\x9b\xe3\xe5\x46\x9b\xe3\xf5\x22\x02\xfc\x48\x9b\xe3\xb5\xd6\x68\x73\xbc\xda\x1c\xaf\x6d\x46\x9b\xe3\xf5\x52\xcc\x25\x6d\x8e\x57\x9b\xe3\xf5\xf9\x08\xba\x6d\x8e\x57\x9b\xe3\xd5\xe6\x78\xb5\x39\x5e\x2b\x57\xd1\xe6\x78\xbd\x04\x15\xd0\xf7\x01\xae\x9f\xb3\xb4\x7f\x2a\xd2\x2c\xd7\x40\xae\xfc\x94\x41\x8a\xb4\x84\x81\xa9\xb2\x44\x50\x3f\x84\x30\x12\x7c\xc8\x46\x8e\xb2\x1f\xd9\xe6\xbb\xdd\xf0\x3d\xdd\x52\xc3\xdb\x67\x18\x3f\x98\xb0\x94\x6d\x97\x48\x46\xe6\x36\xe6\x0d\xce\x55\xf2\xcb\x98\x93\x94\xd2\x7b\x3c\x22\x34\x15\xb9\x6d\x58\x1c\xb9\xfd\x0b\x20\xb4\xde\xab\x9d\xdb\x19\xd2\x8c\x8a\x53\x64\xc4\xf5\x9b\x08\x2b\xa1\x5a\x83\xe4\xc7\xe4\xbf\x0e\x3e\x7c\xf9\x6b\xf7\xf0\xdb\x83\x83\xf7\xaf\xba\x7f\xfc\xf8\xe5\xc1\x87\x1e\xfe\xe3\x77\x87\xdf\x1e\xfe\xea\xff\xf8\xf2\xf0\xf0\xe0\xe0\xfd\x8f\x6f\xbf\xbf\xe9\x9f\x7f\x64\x87\xbf\xbe\xe7\x79\x7a\x6b\xff\xfa\xf5\xe0\x3d\x9c\x7f\x5c\x73\x92\xc3\xc3\x6f\xbf\xd8\x7a\xc9\xb5\x45\xe2\xe6\x04\xe2\x86\xc4\xe1\x47\x11\x86\x9d\x43\xb7\xa1\xb3\xe8\x82\x51\xe6\x4e\xa3\x63\x58\xab\x4e\xa3\xa7\xa6\x28\xe6\x85\x79\x98\x22\x22\x65\xda\x08\x87\x46\x1e\xa4\xe5\x70\x56\xa6\x2b\x4a\xa9\xa3\x03\x18\xd0\x4d\xb5\x6d\xaf\x1e\x42\x41\x4b\x41\x2c\xc2\x4b\x7e\xae\xff\x3c\x4b\xb3\x04\xdb\x9a\xe3\x79\xee\xfa\x58\x16\x64\xae\x2d\x6d\x78\x78\xb4\xb4\xe1\x25\xd2\x06\x05\x51\x2e\x99\x9e\x9e\x0a\xae\xe1\x7e\x2b\x0b\x4b\x95\x34\x5c\x57\x27\x74\x31\x63\x2e\x8b\xdb\x5d\x23\x22\xb3\x71\xdf\x33\xe9\xf4\x63\x91\x27\x31\x26\x73\xe4\x1c\x15\x4c\x9b\xa5\x07\xda\x6a\x7f\xa8\xf7\x60\x28\xf7\xec\x4b\xbc\x3e\x67\xd5\xcc\x7f\xe5\x6c\x42\x13\xa3\xed\x16\x4f\xf4\x51\x83\x29\x3f\xb4\xee\x99\xd7\x54\xdd\x16\x07\x1e\xba\x46\x86\x0e\x6b\x3e\xf2\x9f\x84\x3f\xc1\xbd\x7e\x8e\x52\x1a\x0a\x48\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\xd7\x9a\xe1\x15\x27\x4b\x66\xc7\x8d\x97\x22\x51\xe4\x6e\x0c\x86\x56\x13\xea\x4d\x00\x98\x61\x37\xa2\x8c\x93\xd4\x6c\x51\xe6\x1f\x56\xd6\x96\x60\xc8\x7f\x46\xa5\xd9\xe0\x60\x33\x40\x15\x79\x20\x44\xe2\x32\x1e\x92\x69\x31\xbf\xcb\xfd\xe1\xe2\x17\x0e\x77\xbf\x98\xd9\x14\x19\x26\x74\x14\x4c\x05\x0a\xf4\x9c\xb5\xaf\x98\x7a\xe9\x07\x60\x3a\x41\x0e\x84\x26\x77\x74\xaa\x0a\xc3\x49\xa9\xee\x83\x3a\x26\xaf\x0f\x11\x9d\xa9\x22\x61\x8e\x98\x7c\x75\x88\xee\xbf\xd3\x93\xfe\x2f\xd7\x7f\xbf\xfe\xe5\xe4\xec\xed\xc5\x25\xb9\x14\x1a\x2c\x53\x2b\x35\x07\x8c\x82\x86\x61\x56\x89\xef\x40\x2d\x5d\xa8\x1e\xda\x2e\x99\x22\x77\x8c\xc7\xe2\x4e\x6d\x6d\xa3\xb5\xe8\x67\x80\x07\x94\x6f\x35\x47\x44\x33\x8a\x3d\x0f\x6b\x70\x98\xb9\x08\x93\xf2\xa4\xc8\xc3\xe3\xf8\x28\x96\x22\xb3\x40\xf0\x46\xae\x82\xd5\x56\xd5\xe8\x72\x0c\x2b\xee\xef\xb0\x3a\xe1\x48\x52\xae\x0b\x6b\x4f\xb1\x67\xae\xd9\x62\xaf\xf6\x76\x3c\xef\x8c\x26\x1a\x37\x97\xcd\x74\x12\xc7\x10\x57\xc0\xff\xe2\x22\x07\x4f\xfd\xc7\x4d\x8b\x2a\x15\xa4\xff\xee\xfa\xe2\xff\xcc\xe0\xf1\x34\xab\x17\x28\xd5\x4c\x66\xac\x14\x59\x63\xbb\x7b\xe5\x32\x2f\xdb\xfd\xdd\x89\xfd\x0d\xdc\xb2\x19\xf7\xfc\x55\xce\xab\x85\x8c\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x35\x35\xae\xc3\x1b\x8d\x1c\xf1\xd6\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x3e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x2d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xc6\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x89\x77\xbd\xc6\x21\x34\x40\x79\xc7\x93\xe9\x95\x10\xfa\xbb\x90\x46\xdb\x08\x06\xfc\xcd\x49\xcb\x55\x53\x34\x8a\x93\x14\xdf\xdb\xc5\xdd\xc0\x43\x55\xce\xe0\x3d\x2b\x76\xfc\xb9\x1f\x29\x99\xf3\x13\xf5\xbd\x14\xf9\xd6\x4c\x6c\x4e\xd8\xfc\xfe\xe2\x0c\x49\x51\xee\x5c\x95\x5c\xcb\x29\x96\x0e\x98\xaf\xfa\x16\x14\x83\x9f\x9c\xb3\xb5\x7c\x26\x0a\xbf\x18\x79\x4b\xa7\x84\x26\x4a\x78\x58\x32\xbe\x50\x0b\x75\x2a\xae\xb9\x3c\x10\x7a\x3c\xa7\xdb\x9a\x03\x35\xff\x5c\xa7\xe4\xb9\x2c\xca\xd0\x31\x3e\xf7\xb8\xa6\xb7\xa0\x48\x26\x21\x82\x18\x78\xf4\xd4\xdb\xfe\xd4\x0e\x3f\x44\x9d\x4b\xc1\xcd\xc1\x6c\x04\x79\x2e\x82\xa7\xd7\x81\xb4\x8c\x2a\xe8\x33\x76\xda\x1f\x45\xcf\x31\x1e\xcb\x5c\x81\xb4\x6e\x6e\x99\x83\xdd\xc9\x1f\xf3\x01\x24\x06\xf2\x46\x25\x75\x9d\xe2\xad\x39\x83\xa5\x74\x04\x84\xea\x80\x69\x5a\x10\xe0\xca\x50\x4c\x6b\x00\xd5\x24\x16\x50\x64\xdf\x53\x45\x7e\xba\x38\x23\xaf\xc8\x81\x79\xd7\x21\xe2\x0f\x36\x92\xd7\xc2\x06\xb9\xcd\xea\xa8\x43\x3f\x05\x2e\x09\x91\x97\x08\x69\x89\x44\x87\x70\x41\x54\x1e\x8d\xcb\xdd\xeb\xbd\xda\xec\x02\x21\xd1\xb5\xb2\x9b\xb8\xfe\xb4\x14\xea\x27\x05\xb2\x31\x02\xf5\xd3\x16\x04\xaa\x2c\x46\x19\x9c\xab\x42\xcf\x22\x56\x0a\x9a\xc6\x54\x53\x47\xb8\xfc\x0d\x3b\xbb\xa5\x9f\x37\xf9\x52\xf0\x86\xf1\xfc\xde\x06\x1e\x35\x67\x6a\xb9\x3e\xc7\x69\x49\xe4\xa1\x8e\xbb\x4e\xb3\x2c\x61\xb6\xda\xc6\x4c\x20\xdc\x45\x05\x57\x3a\x4b\xc4\x44\xa4\x13\x34\x49\x84\xa1\x8f\x46\x38\xa1\x3c\x16\xe9\xdc\xcb\x8c\x10\x09\x95\x7a\xa9\x3d\xd2\x62\x5f\x75\xec\x88\x51\x28\x81\x09\xd4\xa8\x2d\x36\x5b\x1f\xd6\xcc\x66\x80\xe3\x31\x02\xa7\x27\x09\x1d\x40\x62\x61\x6c\x31\x50\xcd\x63\xe0\x53\x47\xa3\x4a\x91\x34\x97\x3e\x73\x25\x12\xb0\xe1\x5d\x1e\x10\x66\xfa\x67\x01\x07\x9c\xa4\x29\x38\xa0\x36\x58\x81\x03\xea\xb5\xcf\x01\x0e\x79\x0d\x56\x4f\x66\xe1\x60\xe4\x86\x2a\x1c\x90\x79\xef\x3a\x1c\x14\x44\x91\x48\xb3\xbe\x14\x46\xed\x6c\x8c\x37\xb9\x69\x0b\x9f\xa1\x35\x6c\x2c\x08\xc6\x42\x5e\x50\xbd\x99\xca\x52\x60\x27\xd5\x96\x49\xf8\xe8\xce\xff\xaf\xc4\xb3\x90\xf4\xcc\x32\x32\x3f\x4b\xc5\xbd\x68\x9e\x74\x17\x9e\x33\x3b\x68\x22\x37\xa2\x86\xb1\xb3\x11\x6e\x24\x22\x9a\x60\xed\xd8\x7a\x28\x47\x66\xd1\x6e\x76\xe2\x52\x38\x2f\xfa\x28\xf1\x37\x1f\x40\x82\x65\x44\xf1\x17\x67\xc2\xe4\x22\x86\x92\x2f\xdb\xc6\x21\xdf\xd8\xb0\x4f\xbc\xcf\x47\x12\x1b\xb9\xc2\xbb\x95\xe3\xca\xd3\x5a\xb8\x0a\x68\x6f\x43\x45\x5a\xb3\x40\xe0\x31\xe3\x23\xb4\xab\x75\x88\x84\xc4\xc6\x20\x3b\x22\x70\x6b\x35\xc8\x7d\x3c\x12\x7e\x52\x7f\x1e\xfc\xab\x51\x16\x63\x82\xbb\x99\xd1\x52\xe4\x25\xac\xa1\x25\xb7\x4c\x91\xbd\x37\x1e\x00\x35\x4a\x78\xee\x22\x87\xd9\xb3\x5f\x18\x76\xd3\x5a\x3a\x6f\x19\x8f\x5d\xb8\x6e\x05\x58\xa1\xd8\xba\x95\x83\x31\x10\x9c\xc5\x65\xda\x72\x4c\x3e\x70\x12\x80\x45\xba\x5b\xa3\xc7\x95\x15\x99\xbd\x8d\xae\xbb\xda\xf0\x1a\x5e\x32\x3b\xcd\x4f\x1c\xf7\xde\xbc\xb7\x6b\x34\xf7\xf9\xfb\xfc\xb7\x3c\x69\xe9\x1e\x47\xfd\x9a\xd6\x62\xfe\x66\xa7\xf5\x22\x7d\x64\xd0\x5a\x33\x3e\x52\x65\x4d\x86\x26\x49\xc5\x18\xbe\x48\x95\xf1\x3b\x1c\x4a\xeb\xcf\xab\x10\x33\x69\x06\xcf\x45\x0d\x49\x8c\x38\xf1\xcc\x95\x90\x51\xaa\xe8\xa9\x34\x90\xd0\x8c\x26\xd7\xd9\xf6\x25\x4a\xc9\x5c\x39\xbc\xb7\xd7\x27\xd5\xa9\x91\x59\x63\xe7\x07\xb3\x57\xe6\x3a\xa1\x71\xca\x94\x42\x43\x18\x0c\xc6\x42\xdc\x92\x83\x05\xf5\xb8\x4a\x71\x5a\x8a\x8d\xd4\x91\xc3\xf9\xae\x59\xfd\x21\x61\x3c\x09\x51\x51\xa8\x07\x73\xad\xbc\x21\x07\x5f\x12\x85\x55\xe0\x1e\xba\xba\xd5\x2e\x58\x61\x7e\x99\xb6\x52\xb5\xc1\x82\x27\x27\xd8\xf3\xdb\x73\x59\xb3\xec\xca\x03\x5b\x74\xe9\x70\x7b\xb6\xb2\xda\x42\x38\x5a\xe9\xf1\xc9\x81\xe4\x84\x8b\x08\x54\x73\x05\x9d\x7e\x28\xe6\x24\x31\xd8\x2c\x1e\xc0\xe8\x27\xba\x34\xc8\x0e\xed\xd2\xfb\x98\x0c\xea\x1e\xdd\x2f\x4b\xd4\x37\x05\x71\x31\xfa\x48\x92\x8d\x69\xd7\x2a\xe9\x86\xa2\x21\x09\xf4\x22\xc4\x58\x70\xe1\x92\x24\x0c\x13\x15\x1c\x51\x1a\x49\x94\xf5\xe6\xe1\x9e\x38\x12\x5d\x5a\xea\x69\xe1\x25\x2e\x3b\x02\x31\x99\xcc\xd6\x8f\x28\xd6\x70\xc7\xf4\xd8\x77\x7a\xa9\x78\x0d\x71\x25\x12\x14\x3a\x60\x38\x01\x29\x85\x74\x01\x59\xde\x6e\x8d\x33\x21\x25\xc7\x88\x2e\x83\x24\xd4\xfc\xb5\xaf\xca\x8e\xea\xa2\x14\x3c\xc6\x2b\x1a\x6c\x82\xe1\x10\x22\x14\xb4\xca\x00\xb6\x54\xfb\xa0\x28\x7c\xeb\xb2\x0c\x0c\x82\xb9\x52\xf2\x29\xbb\x37\x6f\x29\x3f\x55\x76\x89\xbb\x82\xb3\x8b\x2f\x1f\xf6\x08\xb9\xe0\x21\x82\xb7\x63\x76\xb1\x7c\xa7\x0f\x3d\xd3\xe6\x13\xcb\x7d\x08\xf0\x03\xca\x86\x33\x23\x1d\xca\xbc\x01\x8c\xaf\x63\x0e\x27\x65\x93\x78\xa3\xe4\x00\x4d\xe3\x6e\x52\xb3\xf5\x5e\x06\xa8\x63\x2a\x37\xb7\x3c\x96\xb9\xfc\x79\x38\x40\x48\x5d\x3a\xe7\xaa\x29\x34\x54\x1c\xfe\xba\x34\x5b\x49\x7a\x0f\x0e\xb7\xbe\x88\x6d\x35\x95\x50\x0d\x02\x7b\x3a\x61\x75\x17\xf6\x6f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x4f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\x41\xdc\x16\x92\xdc\x51\x99\x1a\xbe\x41\xa3\x31\x7a\x28\x29\x27\x71\x2e\xb1\xca\xb2\x06\x1a\x4f\xbb\x4a\x53\x6d\x24\x65\x90\x4e\xa1\xf4\xeb\x6f\x4b\xea\xaf\x1c\x6d\x49\xfd\x35\x47\x5b\x52\xbf\x2d\xa9\x3f\x3f\x76\x26\x3a\xb4\x2d\xa9\xff\xb2\xca\x24\xb5\x25\xf5\x9f\xda\x9b\xd0\x96\xd4\x6f\x4b\xea\xaf\x1a\x6d\x49\xfd\x07\x46\x5b\x52\x7f\x8b\xf1\x02\x28\x57\x5b\x52\x7f\x8b\xd1\x96\xd4\x5f\x3c\xda\x92\xfa\xf3\xa3\x2d\xa9\xbf\x74\xb4\x25\xf5\xb7\x1e\x6d\x49\xfd\xb6\xa4\x7e\x5b\x69\x74\xb3\xb9\x76\xb3\xd2\x28\x69\x4b\xea\xbb\xd1\x96\xd4\x7f\x11\xf5\x14\x49\x5b\x52\x7f\xad\xd1\x96\xd4\x6f\x4b\xea\x6f\x33\xda\x92\xfa\x2f\xc5\x5c\xd2\x96\xd4\x6f\x4b\xea\x7f\x3e\x82\x6e\x5b\x52\xbf\x2d\xa9\xdf\x96\xd4\x6f\x4b\xea\xaf\x5c\x45\x5b\x52\xff\x25\xa8\x80\x4a\xc7\x6c\xab\x0a\xa0\xeb\x14\x2b\x72\x41\xe8\xa5\xda\x00\x83\x7c\x38\x04\x89\x94\x0b\xdf\x3c\x17\x3c\x55\xd4\x65\x9c\x75\xb2\x82\xee\x60\xdd\x23\x97\xaf\xb3\xe4\x71\x57\x8c\x00\x2b\x75\x16\x91\xe2\xe7\xef\xbe\x5b\x50\x19\x69\xeb\xa8\xc2\x6d\x63\xa4\x71\xcd\xef\xf8\x76\xfe\xf1\x25\x00\x5f\x94\x3f\xe6\xe0\x1e\x25\x42\xb9\x08\x77\x04\x56\x34\xa6\x9c\x83\xd7\xf7\x98\x46\x3b\xca\x00\x80\x13\x91\x81\xf3\x4e\x53\xa2\x18\x1f\x25\x40\xa8\xd6\x34\x1a\xf7\xcc\x9b\xb8\x07\x76\x11\x8d\xee\x7e\x51\x5a\x02\x4d\x7d\x5c\x7e\x4a\x99\x9d\x8a\xd0\x48\x0a\xa5\x48\x9a\x27\x9a\x65\x61\x32\xa2\x00\x13\x6a\x2c\xa3\x0a\xc0\xc0\xa8\xb8\x22\x84\xbd\x53\xbc\xcd\x2d\x4b\x94\x4b\xd3\xa1\xb6\xd9\xc1\x7a\xe0\x69\xa6\xa7\x21\x8e\x17\xc8\x90\x49\xa5\x49\x94\x30\xe4\xd6\xf8\x46\x9b\x3b\x8d\xf3\x75\x3c\xaf\xe6\x6e\xa5\xca\x2d\x95\xc7\x28\xb6\x66\x5a\xd9\xa8\xd8\x62\x42\x37\x55\xcc\x94\x13\xf3\x55\x87\x50\x5f\x37\xcd\x02\xda\xaf\x14\x41\xed\x39\x8b\x9d\xdd\xfd\x54\x9a\xae\x54\x2f\xb6\x08\x1b\x2e\x10\x1d\x53\x1c\x3c\x72\x76\x2a\xd9\x1c\x85\x40\x81\x51\x7a\x73\xc7\x00\x37\x80\xc3\xc4\xe0\x00\x44\x60\xf8\x2b\x5d\x82\xf5\x9f\x1c\xe9\x4b\x4c\xf1\x2d\x28\x45\x47\xd0\xdf\xd2\xd1\xb0\x4c\x23\x43\x5f\x43\xb1\x31\x88\x0a\x89\xcd\xae\x0d\xbf\x14\xd1\x99\x55\x31\x88\xa4\x76\x4d\x41\xf8\xb9\x93\x4c\x6b\xc0\x4d\xc5\x0a\x7b\xe8\xab\x9c\x4d\xc0\xdf\x9f\x89\xf1\x7c\xeb\x27\x29\x1e\x36\x44\x9d\xc7\x36\xe2\x72\x00\x64\x20\x19\x0c\xc9\x90\x61\x18\x27\x06\x56\x76\x6c\xc1\x25\x6a\xad\x00\x4a\x19\x7d\x57\x70\x2f\xcb\xfa\x75\xf5\xc8\xdf\xdc\xc2\xb4\xcc\x79\x44\x4b\xb5\x6c\x31\xc3\x94\x0d\xc9\x08\x03\x33\x9d\xb4\xf8\xfb\x57\x7f\xfc\x86\x0c\xa6\x86\xa5\xa1\x64\xa5\x85\xa6\x49\xf8\xc8\x04\xf8\xc8\xc0\xca\x1e\xcf\x6a\x8e\x64\x80\x00\x76\xf3\xb0\x0b\x7f\xfd\xd5\xed\xa0\xca\x63\x8f\x62\x98\x1c\x95\xe0\xd7\x4d\xc4\x68\x51\x7f\x94\xed\x43\xb6\xb7\x54\x89\x16\xa0\x99\x48\x58\x34\xad\x8d\x68\xbe\xf2\x17\x19\x8b\x3b\x2b\xeb\x2f\xc0\x9e\x22\xdd\x2a\x13\x59\x9e\x58\xa3\xf3\x77\x21\xbb\x38\x57\x30\x9f\x03\xb8\xf0\x5c\xa0\x99\xd4\x4d\x31\x5b\x37\xdd\xc6\xe3\xfa\x57\x0a\x97\x5b\xe2\x0c\x79\xa1\x00\x18\x2a\x42\xdf\xd1\x24\x19\xd0\xe8\xf6\x46\xbc\x11\x23\xf5\x8e\x9f\x4b\x29\x64\x75\x2d\x09\x35\xd4\x72\x9c\xf3\x5b\xdb\xc1\x21\x94\x48\x10\x23\x23\x5a\x65\xb9\xf6\x89\x0c\x8b\x3e\xd8\xe6\xcb\x7b\x22\xec\xd5\xa0\x62\x16\xb8\x67\x85\xae\xe3\x52\xb5\x2c\x46\x96\xe7\x57\x65\x64\xfb\xea\xd5\xef\xff\x60\x51\x97\x08\x49\xfe\xf0\x0a\x63\xb6\x55\xc7\x1e\x62\xa4\x6d\x86\x51\xa4\x34\x49\x8c\xda\x50\x46\x4a\x03\xe8\x45\x48\xf8\xc9\x71\x50\xd7\x47\xb7\xb5\x45\xa9\x9b\x9b\xbf\xa3\x1c\xc5\xb4\x82\x64\xd8\xb1\x59\x49\x41\xad\xd9\x47\xc6\xb0\xef\xa8\x0f\xa6\x86\xed\x80\x00\x34\x11\x49\x9e\xc2\x19\x4c\x58\x13\x4d\x9c\x2a\xb3\x79\x55\x3f\x61\x0a\x13\xc0\x06\x89\x88\x6e\x49\xec\x2e\x96\x22\x4f\x66\x2b\x81\x6f\x0f\x85\x6d\x63\x70\x6a\xc4\xde\x2c\xfd\xfe\x4a\xd4\x4d\x4a\xb3\x2c\xe4\x08\x49\x7a\x57\x01\x06\x9e\x49\x2c\x57\x50\xb3\x9e\x4c\x6d\x33\x73\x5d\x23\x73\xd7\x7d\x91\xa1\x9b\x5b\x4f\xb1\x75\xd4\x49\x7d\x1b\x75\xb1\xfa\xed\x0d\x93\x15\x84\x28\x26\xf4\xa7\x21\xc3\x7f\xdb\xac\x92\xb9\xac\xc8\x90\x58\x17\x10\xc3\x0a\x00\x06\x7d\x90\x24\x6f\x6f\x70\x6d\xc0\xba\x59\x2f\xe4\xa8\x02\x17\x1e\xac\xca\x29\xd5\x4e\x20\xf4\xe6\x6b\x4a\x32\x90\x8a\x29\xc3\x97\x7f\xc6\x03\x75\x9a\x50\x96\x96\x4c\x80\x4f\x03\x04\x7b\xb8\xb1\x7c\x72\x7d\x4a\xd9\x17\xb1\x9b\x10\x49\xa1\x2d\x1d\xbd\x40\xac\xad\x4a\xb5\x0d\x32\xd4\xa7\x26\x95\x3f\x17\xd0\xac\x52\x4a\xf3\x4b\x20\x95\xf6\xae\x97\x44\x20\xf1\xfb\x9e\x2b\x7d\x0c\x8b\x6f\x88\x0c\x20\x61\x74\x9b\x5b\xa5\x84\x15\xe5\xd1\x1e\x94\x92\x48\xef\xf4\xc0\x1e\xb1\x5e\x70\x73\x26\xdc\xa3\x64\xff\x78\xff\x49\x89\xa4\x05\x91\x14\x19\x1d\xd5\xea\xe5\x33\x03\xa9\xd9\x69\xcb\x85\x26\x8c\x1a\x84\xd7\x43\xd9\x35\xbc\x0b\xe2\xa2\x8e\x0e\x56\x49\xb2\xde\x51\x0f\x60\xa7\x20\xd8\x7c\xec\x3b\x3a\x25\x54\x8a\x9c\xc7\xce\xbe\x14\x0c\x7c\x6f\x67\x5e\x7c\x29\x38\x78\xc3\xf9\x6c\x9d\x0a\xb4\xe8\x33\x4e\x5e\xf7\x5e\xbf\x7a\x29\x9c\x0a\xbf\x70\x86\x53\x5d\x06\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x78\xdf\xd0\xf7\xbe\x75\x26\x96\xa2\xa0\x3d\xf3\xe5\xb2\xf1\xa7\x3b\xc9\x34\x94\x7a\xfc\x1d\xa0\xe2\x62\xf4\xc3\x52\x55\x86\xc3\x45\x9d\x24\x6a\x02\xa9\x5e\x19\x0c\x95\x0f\x1e\x91\x6e\x39\x02\x85\xc7\x6d\x91\x85\x4b\xad\x20\x61\x65\x40\xed\xed\x91\x03\x7b\xe7\xbe\x4d\x68\x3e\x7c\x52\xd4\x72\x40\x3b\xbf\xcf\x6a\xd4\xd8\x9c\xc9\x9d\xcf\x28\xda\xe0\xb2\x06\x21\xf8\x57\x18\xd3\x09\x60\x22\x37\x4b\xa8\x4c\xd0\xe7\x78\x6d\xd7\x4e\x06\xb9\x26\xc0\x27\x4c\x0a\x9e\x02\xd7\x64\x42\x25\xc3\xaa\x38\x12\xb0\xb2\x83\xd1\x45\xbf\x38\xf8\xf9\xe4\x0a\x03\x1a\x0e\x5d\x49\x0a\xb7\xca\x5c\xf9\xf2\x35\xe5\x95\x94\xa6\x7b\x70\xfb\xfc\x3a\x0c\x0c\x91\xe6\xfa\x75\x99\xf7\xa4\xb9\xce\x6d\x5b\x96\xfb\x28\xc9\x15\x9b\x3c\x15\x25\x71\x19\xf6\x67\x6c\xab\x7d\x9e\xc9\xf6\x2f\x00\x35\x97\xb8\x8f\xa6\xf5\x05\x09\x7a\x73\x0e\x93\x7d\x15\x92\xf6\xca\x3e\x70\x67\x7a\x72\xb5\x34\x6c\xf8\x9c\xaf\xb8\x38\x27\x42\x60\xdd\x98\xa7\x35\x42\xc5\x5c\x9d\xe2\x0a\x37\x03\x6b\x35\x20\xb9\x92\xc7\x77\x76\x79\x5d\x2e\x42\x62\xd5\x25\x11\xf7\x48\xbf\xf8\xb1\xa8\x54\x83\xf5\xd3\x82\x12\x09\x72\x54\x14\x15\x1f\x01\x07\x89\x42\x82\x99\xb2\xd2\x56\x95\x0c\xa8\xb2\x4e\x9e\xb3\xcb\x6b\x6b\xb3\xdd\x0c\x66\x5b\x8b\xd9\xdb\x4b\xa8\x86\xe3\xdb\x34\x86\x2d\x84\xdb\x6a\xcf\xb4\x60\xb0\x32\x80\x41\xa5\xd4\x4e\x4c\x2e\xfa\x84\xc6\xb1\x44\xb7\x8f\x13\x7d\x4a\x95\x2a\x83\x6f\x01\xab\xc2\x50\x05\xe5\x35\x95\xc0\x8d\x24\xae\x00\x2c\x39\xcb\xb3\x84\x59\x37\x42\xf9\x81\xa2\x9a\x0d\x36\xf9\xda\x1c\x69\xeb\xa8\x79\x5b\x2b\x79\x35\xa8\x90\xd8\xb6\x28\xe5\x8a\xdd\x93\xa0\x44\x32\x29\x0a\x0a\xcf\xec\x9a\x3b\x11\x68\x12\x0f\xbb\xe6\x6b\x50\xae\xb5\x63\xc0\xb5\x34\x47\x73\x76\xb7\xb0\x8b\x7d\x92\xe3\x69\x0a\x13\xb2\x09\xa0\x7f\xdc\x95\xdf\x74\x65\xdc\x8a\x12\xc7\xd6\x37\x6c\xab\x4c\x03\x95\x9e\xa2\xe1\xaa\xb6\x3c\x89\xe4\xa9\x10\x61\xd6\xd8\x71\x76\x79\x6d\x29\xa1\xfd\xf8\xd0\x9d\x76\xd1\x2e\x15\x54\x6d\x6b\x0c\x7c\xb2\x2a\x43\x75\x34\x8f\x99\xe6\x7e\xae\x5d\x77\xad\x40\x96\x1a\xe2\x5f\xad\x64\xbb\x1a\x6f\x57\x40\x65\x34\xde\x06\xfe\x2b\x08\x81\x9d\x94\xc4\xc2\x46\x02\x0c\x85\x44\x95\xb8\x8b\xe4\x3d\x11\xe2\x36\xcf\xd6\xa1\xe8\x6e\x1a\xdb\x70\x6d\x2d\x02\x51\x79\xe2\xb3\xa2\xe9\x31\x57\xdb\xf8\x7b\xab\xb2\x0f\x68\x2b\xf1\xe0\x44\x45\x02\x85\x98\xd5\x9b\x4e\x93\x5c\x69\x90\xdf\x31\xa9\xf4\x9e\xaf\x17\x8d\x18\x6c\x6d\x22\xfb\xe5\x1b\xfe\xc6\xf4\xd8\x95\x6e\xdc\xef\x54\x2f\x99\xbf\xdd\xc4\xfb\x46\xa7\xdd\xbf\x14\x1c\xf6\x7b\xb3\x62\x57\x20\xe5\x81\xac\x2d\xe5\x29\x6e\xe9\x0a\x12\x1b\x2f\x8a\x17\x4a\xb8\x72\xe3\xca\x56\x9a\x37\x78\xfa\xa7\x40\x13\x8a\x25\xe2\xf0\xee\x71\x51\x66\xd2\xd6\x8d\xb2\x75\x32\x85\x13\xf4\xa6\x65\x10\x95\x4a\x49\x69\xb1\xfc\xb3\xb7\x91\xe7\x36\xc6\x00\x5b\x7e\xd4\xd5\x0b\x79\xc3\xf8\xed\x86\xe8\x57\x8d\x2e\x39\x9f\x9b\xad\x52\x4f\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\x81\xc8\xb5\xaf\x49\xa2\x4a\x8a\x23\xe3\xff\xb4\x7b\x81\xf6\xf6\xcc\x56\xec\x5b\xa4\x23\xaa\x8e\x35\xfa\x78\x25\x50\x4d\xb9\xa6\x58\x5b\xf4\x4c\x44\xb7\x20\x49\x62\x96\xd1\x23\x45\xe0\x4b\xa5\x9a\xa5\xcc\x61\xc3\xa8\x8b\x6d\x2d\x1d\x90\x8d\x21\x05\x49\x93\xa2\xa8\x6b\x0d\x50\xbf\x71\x84\x33\xcc\x5a\x8e\x49\xb1\x45\xd1\x5c\x19\x46\x73\x0e\xcf\x17\xdd\x95\xd2\xa9\xaf\x74\xcb\x38\x86\x1b\xdc\x33\x85\x66\xfd\x4c\xc4\xe5\xc4\xb3\x5c\x81\xec\x86\xb4\x40\x97\x7b\xa3\x42\x20\x4e\x0c\x83\x7c\x34\x62\x7c\xe4\xa8\x33\xd2\xf4\x52\xb9\xed\xa0\xe9\x60\xa4\x77\x24\xc1\x16\x9c\x45\xe9\xc1\xc6\x97\xb1\xf2\xfd\xa9\x88\xed\xed\x83\xa9\xd5\x06\xfd\xce\x16\x01\xd2\x17\x9c\x08\xe9\x4a\x23\xd0\x38\xc6\xb5\xcf\x7f\x21\x5e\xad\x7e\x55\x27\xc4\x71\xd8\xc8\xee\xf0\x54\x09\x2c\x2a\x1f\x18\x61\x27\x97\x11\x2c\xb2\x9d\x96\x4a\xfc\xd2\x09\x65\x09\xda\x29\x04\x27\x91\x3d\xc5\x2e\xd6\xcc\x9c\x7e\xbe\x8f\x51\x70\xd8\xac\x13\xdf\x79\x3e\x8f\x01\x35\x4a\x54\x6d\xcb\x67\xb6\xe2\x31\xd5\xf2\x42\x27\x7c\xc1\xb7\xd8\x80\x71\x0d\x69\x26\x24\x95\xd3\x59\x8f\xa9\xa1\x89\x06\xe3\xcc\x7e\xcd\x6c\x4c\x5f\xc4\xc8\x36\x16\xe0\xd9\xc4\x36\x0e\x5e\x80\x6a\x0b\x51\x1a\x89\x2e\x17\xc4\x6f\xa0\x61\x0f\x2a\x1a\x43\x9c\x63\xb0\xfa\x28\xa7\xd8\xd8\xdc\x10\x0d\x67\x5b\x9f\xba\x28\x40\x8b\x7b\x21\xbe\x30\x64\x25\x4c\x31\x26\x07\x8b\x7e\x9a\x5f\xb0\x78\xa8\x8d\x44\xb4\x7d\x9d\xb1\xc7\x6b\x08\x4a\xbc\x29\x5a\x4d\xe0\xc7\xc2\x84\x45\xda\x3f\x34\x5c\x86\xa7\x11\x0d\xed\x64\xfb\xc2\x15\x1b\x8c\xc0\xd0\x3e\xad\x8a\x4f\x71\x41\x2c\x58\x4e\xf4\x03\x37\x3c\x69\x39\xea\x17\x78\xfe\x00\x86\xa3\x18\x5f\xdd\x8a\x15\xd4\x22\x40\x69\xd1\xb7\x9b\x35\xcd\xe4\x0d\x38\xdc\x6e\xfc\x9c\x6c\x5a\x07\xaa\x86\xbe\xb1\xbd\x33\x71\x2b\x27\x60\x1d\xd5\x86\xca\x51\x7d\x35\x70\xff\x44\x8e\xf2\xd4\x96\x27\x17\x33\x15\xa2\x2d\x7e\xa3\xc9\xce\x70\xe3\xd3\xb7\x67\xe5\xec\x8c\x72\xd8\xb9\xcf\x6d\x31\x52\x5e\x4d\x53\xee\xac\x2d\xf7\xc2\xe8\x9d\xc1\x40\x5c\xb0\x0d\xa7\xa0\x3a\x63\x65\x78\x9b\x57\xd0\x19\xcf\x8c\xa0\x81\xe2\x51\x61\xae\xe4\xd1\x98\xf2\x11\x5a\xf8\x45\x6e\xe6\xfb\xe2\x0b\x5c\x91\x84\x38\x8f\x5c\x4b\x0c\x1f\xda\xfd\x85\x37\x6c\xba\xea\x44\xd8\x99\x4f\x45\x34\xf3\x6b\x2e\x7f\x96\x95\x42\x8e\x09\xeb\x41\x8f\xec\x7d\x51\xba\xb4\x67\xdf\x9e\x49\x61\x5e\xe1\xa2\xc2\x71\x55\x09\xd3\x78\xe8\xf6\xca\x77\xf7\xc8\xb9\x79\x07\x3a\x7b\x02\x00\x4b\x81\xcb\x83\x02\x7c\x1d\x22\x61\x44\x65\x9c\x60\x32\xe1\x30\xc8\x5b\x36\xe5\xc8\x01\x0c\x4f\x3a\x86\x0a\x72\xa1\x17\x19\x5e\xd7\xcc\xf8\xd0\x54\xdd\xaa\x23\x2b\xa5\x75\x63\xaa\x69\x17\xdb\x88\x58\x02\x75\x64\x2d\x07\x5d\x57\xc0\xb5\x4b\x1d\x4e\x75\xc3\xb6\x1e\xfd\xd6\x25\x8d\x75\x69\xb8\x8b\xf1\x2e\xed\x62\x29\xd5\xed\xc3\x60\x9f\x20\x62\xa2\x96\x12\x5f\xa3\x8e\xef\xac\xe4\x1d\xea\xb8\x23\x0c\xb0\x0b\x4a\x51\xb7\x3b\x04\x67\xb8\x52\xb5\x95\x83\x7c\x7e\x79\x73\xf5\xf7\xfe\xbb\x8b\xcb\x9b\xf6\x3c\xb7\xe7\xb9\x3d\xcf\x35\xce\x33\xf0\x49\xed\xb3\x1c\x54\xbb\x45\xda\xee\x4c\xdd\xbc\x52\xb2\xf8\x0b\x8a\x3b\x3b\xe7\x93\x9f\xa9\x11\x2e\x33\x09\x0a\x65\x11\x23\xa3\x2e\x72\x10\xbb\x1b\x6c\x23\xb1\xd3\x67\x1f\x78\xf6\x84\x61\x63\x0d\x86\xe3\x5c\x96\x6a\x1c\x2c\xda\xb5\x72\xe7\xbe\xd3\x5f\x2e\xce\xce\x2f\x6f\x2e\xbe\xbb\x38\xbf\x7a\xd2\x38\x8a\x9a\x75\xeb\xaa\xdc\x78\x4b\x2e\x99\x49\x98\x30\x91\xab\x64\x1a\x4a\xdf\x2e\x26\x02\xf3\xa1\x78\xdc\xa8\x82\xd3\x50\xdd\x77\xe1\x63\x2d\xb3\x6d\x96\xd9\x56\xc3\x4a\x6a\x94\x2c\x69\x0a\x7d\xbf\x93\x22\x6d\x08\x85\xaf\xad\x79\xc0\x5b\xf3\x17\xe1\xd3\xbe\xab\x6e\x50\x61\x3d\x4e\x78\x2c\x4a\x29\x18\x29\x34\xcd\x74\x8d\xbe\x06\x8d\x54\x2a\x6d\xa6\xa8\xa7\x0d\xc1\x78\x4b\xb3\x1f\x61\x7a\x05\x35\x2b\xa3\xcc\x78\x51\x12\x88\x0c\xa3\x23\xb7\x30\xb5\xce\xd5\x53\xff\xb2\x3a\x15\x5c\x76\xb2\xd0\xeb\x2d\xd4\x29\xc2\xdb\x64\x85\xd6\x5b\xa8\x11\x93\xe9\xc7\x5c\xad\x52\xb3\x85\x28\xa7\x99\x3d\xad\xb7\x7b\xa4\xd9\xea\xac\x8f\x50\x91\x76\xbf\xcc\xee\x1d\x9d\xd5\x1b\x17\x8e\x10\x13\xc3\xb9\xe0\xee\xc8\xc5\xa3\x75\x8d\xc6\xda\xb5\x58\xab\x8e\x30\xe8\xe6\xe8\xb7\xf8\x1f\x72\xf3\xee\xec\xdd\x31\x39\x89\x63\x17\x17\x9d\x2b\x18\xe6\x89\xb5\xd2\xab\x1e\xa1\x19\xfb\x19\xa4\xc2\xc6\x70\xb7\x8c\xc7\x1d\x92\xb3\xf8\xdb\x3a\xf5\xa4\xec\x68\x70\x17\x84\xf7\x45\x35\xbb\x13\xd7\xce\xd5\x58\xe6\x5d\x81\x88\x10\x9b\xf4\x88\xb8\xe9\x4b\xcb\x38\x21\xa3\x21\xd0\xd4\xed\x81\x47\xec\x16\x36\x4b\x57\xf7\x0b\xc2\x6a\xdd\x38\xa1\xf6\x56\x7c\x4c\x54\x8e\x35\x70\x54\x68\x5c\x87\xad\x60\x3b\xd5\x3f\x55\x46\x23\xe8\x90\x7f\x84\x1f\xb1\xd5\xbc\x7a\xbf\xbf\xff\xa7\x1f\xcf\xff\xfe\x97\xfd\xfd\x8f\xff\x28\x5f\x45\x56\x88\x5a\xf3\xcc\x2d\xe8\xba\xe2\x22\x86\x4b\x7c\x07\xfe\xe9\xc4\xb5\x93\x28\x12\x39\xd7\xee\x02\x26\x2c\xf7\xc6\x42\xe9\x8b\x7e\xf8\x33\x13\xf1\xec\x5f\xaa\x56\x91\xb4\x9d\x64\x0c\xb8\x45\x35\x12\x6f\xec\x68\x8e\x3d\x14\xb4\xa4\xe1\xa3\xea\x66\x0d\x4d\x39\xa2\x31\xa4\xb6\x4c\xd3\x77\x1e\x04\xd8\x5c\xd7\x57\x46\xe0\x98\x4e\x6e\x24\xd3\x6a\xc5\xbc\xbd\xc9\xeb\x5a\x5d\xc8\xed\x68\x90\xb4\x85\x1d\x6c\x18\x60\x08\x11\x07\x2d\x7b\x90\x03\x83\xf5\x5a\x4a\xe1\x68\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\x7b\xdc\xbe\x7b\x54\x1a\x57\xf6\xeb\x55\x34\xc4\x63\xdb\x8b\xd6\x5f\x77\x25\x04\x54\xa8\xea\x05\x46\xb1\x39\xb0\x3f\xf6\xa2\x2c\xef\xb8\x1b\x7a\x29\xa4\x42\x4e\xc3\x9f\xc1\x9f\xd8\x55\x5a\x48\x3a\xc2\x94\x13\xfb\xb8\x7d\x2c\xfc\x65\x1f\xac\xbc\x60\xfe\x69\xab\x0a\x47\xb9\x34\x42\x43\x32\xf5\x14\x79\xcb\x52\x18\xc5\xd8\x41\xda\xe6\x41\xbf\x23\xa4\x2d\x60\x46\xdd\x8e\xb3\x76\x54\x11\xb2\x08\x0a\x40\x81\x33\x40\x11\xf5\x49\x97\x52\xdb\x09\x62\x90\xb5\x06\xf0\x89\xd1\x2c\xb7\x2e\x0a\x56\x8c\x06\xa9\x59\xcc\x26\x4c\x89\x1a\x89\x35\x61\xa2\xe5\xd9\x02\xae\xaa\x87\x8d\x89\x0a\x66\xb3\xfb\x0c\xeb\x20\x85\xf3\x3a\x43\xf6\x5f\xd7\x69\x85\x64\x47\x46\xb5\x06\xc9\x8f\xc9\x7f\x1d\x7c\xf8\xf2\xd7\xee\xe1\xb7\x07\x07\xef\x5f\x75\xff\xf8\xf1\xcb\x83\x0f\x3d\xfc\xc7\xef\x0e\xbf\x3d\xfc\xd5\xff\xf1\xe5\xe1\xe1\xc1\xc1\xfb\x1f\xdf\x7e\x7f\xd3\x3f\xff\xc8\x0e\x7f\x7d\xcf\xf3\xf4\xd6\xfe\xf5\xeb\xc1\x7b\x38\xff\xb8\xe6\x24\x87\x87\xdf\x7e\x51\x7b\xe9\x0d\x94\x25\xb5\xa3\xc9\xe2\xa4\xd5\x19\x1b\x41\xbf\x47\xac\xc8\x6f\x87\x47\xaf\xa6\xcf\xbf\x0f\x8c\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xa7\xb0\xe4\xd8\x37\x95\x8a\x23\xec\x2b\x12\x54\x8b\x97\xc6\xe7\x3e\x07\xe3\x4e\xe8\xa5\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\xf0\x8e\xee\x0d\x6c\xb0\xef\xef\xbb\x85\x5a\xdd\x5d\xed\x68\x8d\x41\xad\x31\x68\xc9\x78\xd0\x18\x74\x6d\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\xae\x0e\xb7\x9e\x43\xad\xe7\x8f\x7a\xd1\x84\xb2\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x6c\xda\x1e\x7c\x9c\xa0\xc8\x28\xb1\xaa\x8d\x2b\x5e\x08\x13\xb3\x84\x50\xfd\xba\x52\xe7\x12\x83\x2a\x31\xcc\xf5\x6f\x36\xea\xf4\xd6\x06\xa2\x1a\x25\x8d\xf1\xa2\x42\x68\x10\x0e\x8b\xb2\xd2\x54\x29\x11\xd9\x00\xda\x90\xdf\x80\x45\xeb\xdc\xb2\x71\x35\xd8\xe1\x3e\x93\x10\x41\x0c\x3c\x02\x57\x72\xba\xd2\x70\x93\x72\x72\xce\x27\xbe\xec\x76\xec\xb3\x65\x70\x25\x8b\xe7\x78\x59\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x9c\xc5\x50\x0c\x31\x2c\xac\xac\xdb\xf5\xe4\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\x2f\xc1\x19\x58\x9f\x7d\x7e\x76\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xfb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\xec\x99\x4c\x42\x06\xdc\x66\x24\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2f\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x44\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\x2d\x23\x83\x88\xbc\x31\xa2\x15\x29\x4e\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\xe9\xed\xfd\x0b\x84\x46\x96\x27\x89\xcb\x38\xee\x91\x77\x1c\x8f\xe4\x09\xb6\x78\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\x96\xd9\x2f\x15\x05\x12\xb2\x32\x41\x51\x6f\xac\x46\x18\xfa\xf2\x6d\xf9\xad\xcf\x05\xed\x3e\xd1\x36\x85\x3e\x26\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xa1\xf7\x19\xd6\xd8\xc8\x84\xd2\xd7\x46\x8b\x6d\xa6\xc7\x4d\xdf\x4f\x87\x6d\x23\x68\x92\x40\x5c\x69\x72\x64\x9b\x73\xd0\xaa\x16\x8d\xa9\xc6\xa1\x57\x04\x90\x31\xe5\x71\x02\x12\xeb\xbd\xab\xd9\xa2\x56\xac\x68\x70\x10\x5a\x52\xf8\x64\x50\x1a\x45\x42\xc6\xae\xb9\xac\x4b\xca\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\x55\x83\xb1\x96\xb4\x2a\xf5\xb5\x18\x0b\x71\x4b\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\x68\xab\x13\x50\xb4\x6b\x66\x57\x47\xa5\x8e\x3b\xf8\x43\xbd\x86\x3b\xb5\x84\x95\x26\x44\x15\xb8\x87\xa8\xb1\x96\x7c\xe7\xf7\x10\x95\x7a\x4a\x9a\x2d\x71\x4d\x25\xb5\x40\xdb\x46\xfd\x56\xc1\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\x0d\x39\x9c\xd3\x97\xcc\x76\xaf\xc0\xee\x03\x36\x83\x19\x33\xcf\x7c\x15\xed\xca\x61\xb0\x47\x6f\xae\xf0\x5c\x08\x36\xf6\x73\x61\x9e\xb5\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\xea\x2e\xdf\x94\x9e\x64\x58\x68\x30\xc3\xaa\x7d\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\xde\x01\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\xec\xe0\x60\xff\xd7\xfd\x0e\x01\x1d\x1d\x92\x3b\xc1\xf7\x35\x2e\x1f\x2b\x83\xe4\xaa\x34\xd1\x54\xe4\xd8\x80\xcf\x82\x20\x94\xf9\x30\x14\x8b\x88\xdc\x76\xeb\x19\x53\xed\xd3\xf0\xce\xef\x99\xf6\x1d\x2a\xc4\x90\xbc\xb2\xcd\x82\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\xbf\x37\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\xef\xb7\x6f\x42\x4b\xe6\xfa\x33\xdf\xdc\xf4\xbf\xaf\xb4\xa1\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x25\x33\x76\x80\x76\x34\xe3\xd0\xab\xd5\x8f\x96\x34\x48\xc2\xea\xf6\xa5\x25\xf3\xfd\xb6\x37\x6b\x48\x4b\xfe\x2e\x72\x6c\xa4\x47\x07\xc9\x94\xdc\x51\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x00\x8d\x41\x2a\xa4\x1e\x40\xb7\x2e\x0d\xe6\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\x8b\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x42\x3f\x2a\x83\xad\xdc\x68\x85\x71\x0b\x2c\xdb\x22\xb1\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\x8d\xc2\x91\x4c\xd8\x52\xb4\x3b\xc3\x65\xea\x76\x4d\x27\x8b\x73\x89\x25\xe1\xa1\xc9\xad\x7e\x16\x9d\xd3\x49\x73\x61\x8a\x4d\x07\x29\x36\x1a\xa2\xf8\xa8\x01\x8a\x98\x16\x51\x9b\x8a\x54\xed\xe3\x38\xa5\xc1\x00\xa3\xb7\x19\x8d\xd3\xc9\x7e\xce\xba\xe3\x1b\x71\x54\xcd\xa1\xe6\xa8\xed\xc4\x19\xd3\x51\x76\x2d\xa2\xdb\x06\xf5\x9a\x33\xc8\x24\x44\xd6\x4e\x76\x73\xda\xb7\xb3\x1b\xfd\xf2\xf2\xdd\x4d\x11\x8e\x8f\x31\x2b\x85\xe1\xf2\x07\x67\x49\x33\x3a\xe9\x2d\x64\x3a\xa8\xee\x03\x1a\xdd\xde\x51\x19\xa3\x65\x8b\x6a\x36\x60\x09\xd3\x53\x54\xce\x25\x60\xac\x3f\x17\x36\x28\xce\xd6\x7f\x14\xbe\x8b\x6b\x68\x31\x1e\x6c\x58\x68\x21\x73\xd1\x33\x43\xca\x8c\x3e\x1e\x5a\xf5\xda\xa8\x99\x28\x0b\x26\xbd\xb2\x65\xba\x55\xbe\xfc\xd8\x59\xe5\xab\xd4\x86\x76\x53\x3d\xac\x6e\xec\xde\x0e\xb3\x3a\xc7\xe2\x64\xe8\xb2\xd6\xb2\xba\x86\xe6\xdb\x5d\x56\x97\x49\xb8\xd6\x22\x6b\xc8\x4b\x62\x27\x5b\xe2\x23\x19\xc0\x50\x18\x22\xbc\xd4\xe9\x11\xe7\xe0\x4a\x73\x9e\xf4\x2f\x82\x55\x4b\x54\x1c\x1b\x36\x6a\xd1\xd7\xe3\x4c\xd8\x04\x38\x28\x75\x84\xee\x90\x3c\xb3\x5a\xab\x6f\xa8\xdb\x31\x5f\x07\x29\xae\xae\x53\x64\x02\xb8\x76\xbe\xf8\x23\xe8\xc8\x5a\x6e\x4b\x84\x1c\x3b\x85\xb9\xe5\xcf\xba\x51\x22\x49\xd5\xd8\xb6\xba\x85\x7b\xa6\x5d\xbb\xe6\xbe\x2d\x0f\x5c\xee\xb8\x3b\x92\x34\x02\x92\x81\x64\xc2\x30\xa3\x9c\xeb\x58\xdc\x71\x32\x80\x11\xe3\xca\x83\x02\x2b\x6e\x3a\x98\xa1\x3f\x86\xa9\x50\x32\xad\x47\xae\x2a\x05\x41\x5c\xaa\x4e\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x85\x70\xb2\x8d\x63\x02\x84\xcb\xbd\x74\x1e\x5a\xf2\x41\xce\xf1\xcd\x31\x24\x74\x6a\x23\x32\xb1\x0d\x36\xfb\x37\x48\x75\xd8\x80\xc7\xc9\x76\x83\xf2\xd7\x96\xae\x03\x4b\x9d\xd2\x68\x5c\xcf\x85\xdb\xba\xa8\xd6\x1c\xad\x8b\xaa\xce\x24\xad\x8b\xaa\x75\x51\x3d\x30\x5a\x17\x55\xeb\xa2\x9a\x19\x3b\xab\x25\xb5\x2e\xaa\xad\x47\xeb\xa2\x5a\x3d\x5a\x17\xd5\x1a\xa3\x75\x51\xad\x39\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\xad\x8b\xea\x33\xb2\xdb\xf9\xd1\xba\xa8\xe6\x26\x69\x5d\x54\xad\x8b\x6a\xed\xb1\xb3\xca\x57\xeb\xa2\xb2\xa3\x75\x51\x55\xc7\xe7\xc5\xea\xbc\x83\xa7\x6f\x54\xbd\xfa\x3d\x86\x51\x61\x74\x34\xf6\x45\xa6\x3d\xd5\xb1\xff\x7f\x1a\xdb\xff\x8e\x38\x4a\x1a\xb0\xf7\xb7\xb6\xfe\x17\x67\xeb\x6f\xc6\x4e\xd6\x80\x8d\xac\x36\x4d\x76\x2e\xf0\x9b\xb1\x04\x35\x16\xc9\xd6\x88\x5e\x41\xf2\xb7\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x12\x7c\xed\xaa\x68\xbc\x8c\x2e\x78\x6b\xae\x33\x37\xb2\x18\xb0\xf2\x26\x65\x89\xd9\x46\x4c\x94\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xf6\xf5\x2a\xab\x12\x5f\xf7\xc2\x9b\x42\x1f\x87\xd7\xf5\xe8\x4d\x3d\x6e\x69\x6b\x63\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\xbf\xbf\xea\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x36\xb6\xc5\x9b\x8c\x54\xd4\x9b\x6b\x89\x19\x94\x08\x27\x7f\x2b\xdb\x81\xd9\x3c\x67\x9e\x0a\x29\xed\x7d\x1b\x48\xb1\x75\x77\xd8\x62\x34\x40\xf0\xeb\xeb\x0a\xb5\xf4\x84\x26\xf8\x4d\x5d\x51\xb8\x2a\xc7\x18\x81\xb7\x6a\xee\x19\x21\x5e\xd8\x72\xee\x6b\x0b\xbc\xb5\x29\x65\x7d\x21\xb4\xfe\xd1\x22\x58\x6f\x05\x3f\xbc\x31\x00\xef\xb9\x16\xe2\x9e\x9d\x97\xb5\x0d\xdf\xe2\x48\x0b\x92\x25\xb4\x68\x52\x84\x3b\xf0\x03\xf2\xa0\xd3\x31\x44\xb7\x57\xce\xe5\x79\xa0\x00\x42\xbc\xca\x88\xe9\x71\x3e\xe8\x45\x22\x3d\x32\x24\xc1\xfe\xdf\x20\x11\x83\xa3\x94\x2a\x0d\xf2\x28\x16\x91\x63\x71\xdd\xc8\xcc\xc2\xf8\xa8\x97\xc6\x87\xd8\xde\xf6\xa2\xda\x14\xb1\x54\x0a\xc1\xbc\xdf\x29\x83\x64\x00\x86\xba\x0a\x54\xf8\x4b\xf5\xd4\xcc\xf2\x36\x6e\x5c\x5b\x1e\xb5\x59\x52\x4d\x77\xf3\xa7\x77\x35\xb7\x94\x8b\x34\x60\xd9\x78\x6e\x2e\xe5\xc6\x42\x2b\x1a\x70\x25\xef\x90\x1b\x79\x67\x44\xe3\x5d\x71\x1d\xef\x60\xe9\xe3\x06\x3c\x9d\x4d\xb8\x8a\x9b\x73\x13\x3f\x42\x85\xe0\xc7\x71\x0f\x37\x68\x43\x6b\xc8\x2d\xfc\x29\x5c\xc2\x8d\x7c\x75\x5d\x57\xf0\xa7\x73\x03\x37\xf3\xb9\x4d\x2a\x02\xcf\xd5\xf5\xdb\x80\x2d\xbc\x49\x3b\x78\x63\x36\xf0\x47\x73\xf5\xd6\x77\xf3\xee\x80\x8b\xb7\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x86\x48\xf0\x78\x6b\x0e\x33\x53\x32\x32\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\x46\xc3\x98\xba\xca\xd8\x46\xa3\xb2\x19\x1c\xde\x3f\xe1\x04\x0a\x74\x2d\xd8\x55\x6e\x53\x74\xee\x4e\xc8\xdb\x44\xd0\x58\x1d\x65\xc2\xfe\x5f\x91\xaf\x50\x4a\x54\xb0\xef\xaa\x97\xa9\xf0\xd4\x06\x31\x9b\xde\xd1\xe4\x26\xfe\x20\xee\x88\x18\x6a\xe0\xe4\x80\x71\xbf\x8f\x87\x25\x35\xb0\xb0\x4e\x06\xb4\x36\x57\x5f\xbf\xf2\x37\xbf\x3c\xb3\x23\x1a\x58\x95\x7a\x7c\x2b\xb0\x7b\xd1\xc3\x66\x60\x77\xe3\x30\x4f\xaa\xa6\x60\x6b\x1e\xae\xd2\x9b\xd7\x45\x6d\xdf\xd7\x38\x6f\x38\x6d\x94\xc7\xc4\xa5\x7c\xbd\xbc\x4d\xab\x1d\xc0\x52\x15\xfd\x42\xc0\xca\x43\x56\xe3\x9b\xd3\xbe\x35\x1a\xb7\xe6\x92\x5d\x31\x97\x3c\x51\x10\xc8\x0e\x0a\xba\xcf\x34\xf0\xa3\x15\x74\x37\x18\xa5\x24\xd0\xef\x25\x8d\xa0\xdf\xb8\x8c\xe0\x8f\x13\x89\x73\x49\x1d\x01\x0c\x22\x9f\x3f\x3c\x1c\x20\xb6\xa7\x29\x24\xce\x62\x4a\xea\x30\x4f\x92\x29\xc9\x33\xc1\xab\x69\xc6\xd6\xd7\x3e\x9b\xb5\x8a\x26\xf9\x05\x6f\x29\x04\xcb\x4c\x0a\xc7\x33\x65\xce\xb9\xa1\xc1\x45\x83\x2e\x14\x24\xb1\xaa\x31\xad\xe4\xc6\x2a\x36\x32\xcb\x37\xfc\x0f\xd3\x66\x8b\x48\xbf\xca\x84\xe6\xe9\xa1\x90\x11\x1b\x24\x53\x32\xa6\x49\xe8\xc6\x42\xc9\x2d\x4b\x12\x37\x4d\x8f\x5c\x83\xb6\x2e\x05\xcb\x3b\x13\xc1\x47\xb8\x38\xca\x7d\x17\x40\x88\xcc\xb3\x51\x02\x94\xe7\x99\x7d\x9f\xe1\xc4\x53\x91\x4b\xff\xbe\x5e\x70\x4c\x14\x5d\xf7\x59\xd2\x29\xf5\x1a\x5b\xb9\xb1\xa1\x3f\x4d\xae\x8c\x00\xf0\xce\x57\x71\xee\x94\xe7\x14\x13\x90\x92\xc5\xce\xce\x6f\x7f\xcb\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\xab\xb1\xed\x26\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\xfb\xcb\x18\x09\x5f\x64\x95\xbc\xf5\x09\xb3\x9d\x71\x4b\x90\x23\x07\x5c\x10\x81\x81\x9f\x39\x67\xda\x76\x5b\x1f\xe7\x9a\xc4\xe2\x8e\x1f\x6e\xe4\x75\x45\x47\xeb\xcd\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x3b\x1a\xc1\x52\x10\xb9\xfe\x24\xda\xdf\xdd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x6b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\x97\x6b\x58\x3a\x1f\xbf\x57\x6a\xc8\x8c\xa1\xd9\x67\x97\xd7\xbf\xbc\x39\xf9\xeb\xf9\x1b\x77\x3e\x79\x99\xe9\xe7\x9c\xfd\x2b\x07\x42\x53\x61\x64\xe1\xa4\x1c\x06\xd8\x41\x8d\xbe\xf4\x03\x9e\xe4\x66\x03\x06\xb7\x64\xc8\xd8\x3d\xbe\x7e\x58\x24\xf6\xa0\x7f\xfc\xa8\xc8\xa7\xee\xaa\x55\x04\xb7\x18\xb9\xb1\xd4\x55\x8b\x12\x0e\xda\x9c\x3c\x2b\x51\xda\x2e\x6b\x8c\x8f\x92\xb2\x30\xb9\x1d\xb9\xaa\xab\x13\xd5\xd5\x88\xba\xc5\x17\xf4\xb7\x55\x8c\x1a\xe9\xee\x55\xac\xa1\xa1\x9e\x38\x05\xd5\xf6\x6a\x80\x6d\x5a\xec\xd5\x00\x2b\x7a\x5c\xf4\x09\x8d\x63\x89\x62\x0a\x9e\xfa\x74\xa6\x37\x66\x56\xc4\xd2\x74\xc8\x2b\xf2\x27\x72\x4f\xfe\x84\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x6d\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\xbd\x06\x69\xc4\x22\xb7\x13\x4f\xda\x7b\xc9\x2c\xf0\x13\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xe9\xac\xdf\x21\x37\xa7\x7d\x6c\xea\x73\x7d\x7a\xd3\xaf\x4a\xd8\x7b\x37\xa7\xfd\xbd\x27\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\xb7\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\xbc\x2c\xd7\x6d\x9b\xe6\xf3\x99\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\x1f\x9c\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x22\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x52\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xf9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\xbc\x04\x15\xd0\xf7\x5c\xad\x9f\xa3\x72\xe5\x67\x5a\x3f\xac\x8f\x9c\x2f\xf8\x15\x2d\x21\x2a\x33\x93\xc8\x62\xca\x44\x02\x8d\xa7\x38\x25\xf6\x79\x28\x09\x59\xcf\x30\x3a\x30\x61\x29\xdb\x2e\x2d\x88\xcc\x1d\x9a\x37\x38\x57\xc9\xeb\x62\xc0\x92\xd2\x7b\x3c\x00\x34\x15\xb9\x6d\xfd\x1a\x89\x34\xcb\x75\x15\xa6\xb8\x3d\xdb\x74\x6d\x1d\xb2\x91\xe3\xa8\x47\xb6\xc1\x6c\x37\x4c\xdb\x2d\x35\x75\x7d\xc2\x56\xad\x34\xf6\x51\x73\xfd\x26\x82\x46\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x0f\x5f\xfe\xda\x3d\xfc\xf6\xe0\xe0\xfd\xab\xee\x1f\x3f\x7e\x79\xf0\xa1\x87\xff\xf8\xdd\xe1\xb7\x87\xbf\xfa\x3f\xbe\x3c\x3c\x3c\x38\x78\xff\xe3\xdb\xef\x6f\xfa\xe7\x1f\xd9\xe1\xaf\xef\x79\x9e\xde\xda\xbf\x7e\x3d\x78\x0f\xe7\x1f\xd7\x9c\xe4\xf0\xf0\xdb\x2f\xb6\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x51\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\xf0\xf0\x68\x69\xc3\x4b\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xfd\x56\xf6\x93\x65\x06\xa4\xeb\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x72\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc4\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x6e\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\x85\x3e\x8f\xea\xeb\x40\x88\xc4\x65\x23\x24\xd3\x62\x7e\x66\x4d\x6f\x5c\xfc\xc2\xe1\xee\x17\x33\x9b\x22\xc3\x84\x8e\x82\x1a\xaf\x40\xcf\x59\xe2\x8a\xa9\x97\x7e\x00\x86\xfa\xe7\x40\x68\x72\x47\xa7\xaa\x30\x6a\x14\x73\x30\x75\x4c\x5e\x1f\x22\xe2\x51\x45\xc2\x1c\x31\xf9\xea\x10\x5d\x73\xa7\x27\xfd\x5f\xae\xff\x7e\xfd\xcb\xc9\xd9\xdb\x8b\x4b\x72\x29\x34\x58\x96\x54\x6a\x92\x16\x51\x6e\x34\x04\xb7\x4a\x7c\x07\x6a\xd0\x42\xf5\xd0\xae\xc8\x14\xb9\x63\x3c\x16\x77\x6a\x6b\xfb\xa9\x45\x3f\x03\x3c\xa0\x7c\xab\x39\x22\x9a\x51\xec\xfd\x56\x83\x3f\xcc\x45\x7f\x94\x27\x45\x0e\x1c\xc7\x47\xb1\x14\x99\x05\x82\x37\x40\x95\x95\xa4\xb3\x19\xbb\xb2\x8f\x2f\xc5\xfd\x1d\x56\x27\x1c\x49\xca\x75\x61\x89\x29\xf6\xcc\x35\x9d\xeb\xd5\xde\x8e\xe7\x9d\x6d\x44\xe3\xe6\x32\x8d\x4e\xe2\x18\xe2\x0a\xf8\x5f\x5c\x54\xdf\xa9\xff\xb8\x69\x51\x8c\x81\xf4\xdf\x5d\x5f\xfc\x9f\x19\x3c\x9e\x66\xf5\x82\x98\x9a\x49\x00\x95\x22\x6b\x6c\x77\xaf\x20\x15\x93\x76\x7f\x77\x65\x7f\x03\xb7\x6c\xc6\x75\x7e\x95\xf3\x32\x43\xe3\xa5\xf9\x49\x2a\x62\xe8\x91\x7e\xb0\xe1\x57\xaf\x96\x8b\xcc\x48\x20\xe6\x16\xae\x19\x4d\x92\x69\x59\x98\xd2\xc2\x66\x08\x56\x4a\x10\x94\x09\xf9\x90\x26\xea\xa9\xa9\x71\x1d\xde\x68\xe4\x88\xb7\x46\x9b\x6d\x64\x3b\xc2\x6c\x24\x06\x2e\xb4\x13\x86\xcd\x2a\xb1\xac\x83\x14\x11\xb1\xaa\x73\x29\x50\xaa\xc2\xdf\x94\xf5\x23\x78\xd6\xc8\x94\x07\x76\x3f\xcc\x6c\x8d\xc8\xb9\x02\xb5\x98\x35\x16\xca\xb4\x99\x5d\x02\x8d\x05\x4f\xa6\x18\x15\x69\xe3\x1c\x52\xaa\x6e\x21\xb6\x3f\x38\xd1\x2c\x78\x11\xcc\x8c\xe1\x55\x37\x66\xdd\xde\x65\x80\x22\x99\x8d\xbe\x40\x57\x83\xd1\xf0\x9f\x74\xd7\x6b\x1c\x42\x03\x94\x77\x3c\x99\x5e\x09\xa1\xbf\x0b\x29\xae\x8d\x60\xc0\xdf\x9c\xb4\x8c\x00\xa9\x46\x7a\x51\x7c\x6f\x17\x77\x03\x0f\x55\x39\xbb\xf6\xac\xd8\xf1\xff\xc7\xde\xfb\x70\xb7\x6d\x23\xfd\xc2\x5f\x05\xc7\xbb\xe7\xda\xde\x4a\x4a\xd2\xee\xee\xd3\x27\xb7\xef\xf6\x78\x6d\xa7\xf5\x6d\xe2\xf8\xc6\x4e\xfb\xee\xdb\xf4\xd9\x85\x48\x48\xc2\x63\x12\x60\x09\xd0\x8e\xf6\xf6\x7e\xf7\xf7\x60\x66\x00\x82\x94\x9c\xd8\x24\x13\xd9\xae\xb8\xe7\x6c\x63\x89\x02\xc1\xc1\x60\x30\x7f\x7f\xf3\xd0\xb7\x54\x59\xa9\x03\xf3\x5d\xa9\xab\xce\x87\xd8\x8a\xb2\xf9\xdd\xc9\x11\x88\xa2\x8a\xc2\x88\xca\x96\xcb\x42\x4b\xf4\x41\xdd\x60\x18\xbc\xa5\x40\x68\xbc\x27\xea\x98\x15\x7b\xc5\x97\x8c\x67\x46\x7b\x5a\x4a\xb5\xce\x5e\x64\x64\x8c\xba\xaf\xa7\xda\x2e\x56\xac\x50\xb7\xa1\x56\x7f\x37\x8a\xa2\x8a\x35\x36\x98\x54\x2b\x3f\xb7\xfc\x52\x18\x56\x94\x22\x11\xa9\x50\xc9\xa6\x97\x7d\xd3\xc1\x38\x60\x9d\x53\xad\xdc\xc6\x1c\x84\x79\x4e\x42\x14\x96\x48\x1a\xb3\x0a\xc4\x73\xc9\xfa\xe3\x10\xd5\x85\x6d\x59\x19\x51\x62\x08\xba\xac\x04\xae\xe4\x0f\xd5\x54\x64\x8e\xf2\xce\x24\xa5\x8e\xd9\xe8\x78\x90\x39\x9f\x0b\xc6\x6d\xe0\x34\xab\x99\x50\xc6\x49\x4c\x74\x5f\x5a\x96\x6a\x51\x57\xc6\x73\xc3\xde\x9e\x1c\xb1\xa7\x6c\xcf\x3d\x6b\x1f\xf8\x07\x1a\x6a\x5b\x8d\x09\x68\x6d\x1b\x75\xe6\x87\x80\x29\x01\xf3\x32\x5d\xa2\x90\x18\x31\xa5\x99\xa9\x92\x45\xdc\xc5\xdb\x9b\xcd\x94\xa4\x08\x81\x91\xfb\xc9\xeb\x9b\x95\x50\x6f\x8d\x28\x07\x13\x50\x6f\x3b\x08\xa8\x58\x8d\x72\x3c\xd7\xa4\x1e\x32\x56\x2e\x2c\x4f\xb9\xe5\x24\xb8\x42\x57\xf5\xfb\xba\xa4\xbf\x6f\xf1\x65\xc4\x4b\xa9\xaa\xf7\xe8\x22\x1d\xce\xd5\x72\x7e\x0c\xc3\x02\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\x27\x0d\x5e\x19\xdd\xa0\x26\x82\x9c\xf0\x71\x68\xa7\x9c\x70\x95\xea\x7c\xe5\x61\x10\xf4\xe6\xc9\x22\x7e\xc0\x96\xfb\x9a\xd7\x3d\x71\x0a\x65\xe2\x4a\xf4\x80\xd0\x6a\x71\xde\x4b\x37\x9a\x23\x8e\xe7\x08\x18\x9e\x65\x7c\x2a\x32\xa4\x31\x72\xa0\x59\xe5\xc0\x4d\x67\x8a\x96\x3a\x1b\xae\xb4\xe5\x8d\xce\x04\xa6\x5e\x79\x42\xb8\xe1\x1f\x04\x1d\x60\x90\xa1\xe8\x00\xd6\x60\x83\x0e\x60\xd7\x3e\x04\x3a\x54\x3d\x8e\x7a\xd6\xa6\x83\xd3\x1b\x9a\x74\x80\xc3\xfb\xbe\xd3\xc1\x88\x24\xd1\x79\x71\x56\x6a\x67\x76\x0e\x76\x36\xd1\xb0\x75\x9c\x0f\x1d\x1b\xe0\xb7\x8f\x2d\x60\x8a\xea\x35\x6f\xe6\x65\x94\x74\xc9\x2d\x1e\x12\x3e\xf3\xf2\x7f\x44\x67\x16\x88\x9e\xf6\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\x87\x7c\x1c\x0c\x51\xb7\xd0\xc3\xd9\x39\xc8\x69\xa4\x13\x9e\x01\x44\x6a\x3f\x96\x63\x6d\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc0\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x2a\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x12\x02\x97\x68\x41\xee\xc2\x96\xf0\x83\xfa\xfd\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\x28\x6e\xa5\x61\x3b\x2f\x3d\x01\x7a\x20\x55\xde\xc7\x13\x66\x07\xdf\x30\xac\x26\x7a\x3a\x2f\xa5\x4a\x29\x95\xb6\x41\x2c\x6f\xe7\x92\x1e\x0c\x49\xda\x32\x8d\x65\xcb\x73\xf6\x4e\xb1\x40\x2c\x36\xee\xcc\x1e\x6f\x50\x65\xf6\x3e\xba\xf1\x87\x1d\xaf\xe1\x21\xed\x61\xde\x2a\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\x92\x7e\x43\x5b\x31\x3f\xe1\xb0\x5e\xa5\x4f\x1c\x5b\x5b\xa9\xe6\x26\xb6\x64\x9a\x78\xf8\xeb\x4d\x19\xbf\xc2\xb3\x52\x63\x09\xe6\xaa\x09\xd1\x2a\x01\x78\x28\x66\x48\xe6\xd4\x89\x07\x6e\x84\xcc\x73\xc3\x0f\x4b\x47\x09\x2b\x79\x76\x5e\x74\x87\x0f\x65\x2b\x50\x75\xaf\xce\x0f\x9a\x43\xc3\x61\xbd\x10\x25\x9e\xfd\xee\x7b\xc6\xd3\x5c\x1a\x03\x8e\x30\x31\x5d\x68\x7d\xc9\xf6\xd6\x60\x65\x45\x59\x56\x46\xce\xcd\x13\xe2\xf9\xb1\x9b\xfd\x3e\x93\x2a\x0b\x99\x4c\x60\x07\x2b\x6b\xbc\x23\x07\x1e\x92\x84\x59\xc0\x1a\x12\x3c\x33\x25\x2b\xac\x4e\x13\x01\x99\x1d\x17\x6c\x5c\x60\xaf\x2e\xcf\x69\x4f\x48\x94\x8f\x2c\xd1\x29\xf1\x76\x1b\xf5\x6c\x2d\x1d\x51\x7b\xdc\x38\x91\x48\xb9\x48\x84\x19\x0e\x6c\xe9\xfb\x7a\x4c\x96\x0a\xac\xb0\x11\x90\xfd\xc4\x6f\x4c\x87\x03\xbf\xf4\x2e\x14\x6a\xd2\x4f\x77\x63\x8d\xfa\xa2\x16\x2e\xce\x1e\xc9\x8a\x05\x1f\xa3\x91\xee\x24\x1a\x88\x40\xaf\x42\x2c\xb4\xd2\x25\xb2\xa8\x3b\x44\xb5\x02\x96\x06\x11\x85\xd1\x3c\x58\x13\x12\xd1\xd1\x54\x0f\xeb\x28\x71\x1c\x08\x84\x42\x2f\xc4\x76\xa8\xe7\x70\x2d\xed\x02\x30\x58\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x92\x1c\x32\xba\x1c\x93\x70\xf7\xd7\xae\x89\x03\xd5\x35\xe2\x39\xe4\x18\x3a\x6e\x12\xb3\x99\x48\x40\xd1\x8a\x09\x8c\x52\x7b\xaf\x06\xa5\xf5\x25\x1c\x56\x7b\xc4\xf4\x5c\xbe\x77\x4f\x89\x7f\xd5\xea\xbb\xa2\xb4\x1a\xaf\xff\x7a\x7f\xc2\xd8\x89\x0a\xf9\xb7\x23\xb7\x8a\xf1\x9d\x3e\xf5\xcc\xba\x57\x8c\xe1\xf6\xe1\x05\x62\xc7\x99\xd3\x0e\xcb\x6a\x00\x8e\xef\xe3\x0e\x67\xb1\x4b\x7c\x50\x71\x00\xae\x71\x1a\xd4\x2d\xbd\xd7\x01\xfa\xb8\xca\xdd\x2d\x9f\xca\x5d\xfe\x30\x02\x20\xac\xaf\x9c\x23\xa4\x83\x2d\x06\xfa\xed\xae\x2d\x06\xfa\x2d\xaf\x2d\x06\xfa\x16\x03\x7d\xf5\xba\x37\x29\x83\x5b\x0c\xf4\xc7\x85\x6b\xb3\xc5\x40\xdf\xb4\x8b\x79\x8b\x81\xbe\xc5\x40\xff\xd0\xb5\xc5\x40\xff\xc8\xb5\xc5\x40\xef\x70\x3d\x02\xc9\xb5\xc5\x40\xef\x70\x6d\x31\xd0\xd7\x5f\x5b\x0c\xf4\xd5\x6b\x8b\x81\x7e\xe3\xb5\xc5\x40\xef\x7c\x6d\x31\xd0\xb7\x18\xe8\x5b\x68\xc8\xbb\x8d\x75\x3f\xa1\x21\xd9\x16\x03\x9d\xae\x2d\x06\xfa\xa3\x00\xc0\x63\x5b\x0c\xf4\x5b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\x58\xdc\x25\x5b\x0c\xf4\x2d\x06\xfa\xef\x47\xd1\xdd\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\x5b\x0c\xf4\x0f\xce\x62\x8b\x81\xfe\x18\x4c\x40\x63\x53\xd9\x09\x16\xf2\x36\x08\x36\x94\x99\x1c\x15\x8c\x4f\xab\xd9\x4c\x94\x20\xb9\xe0\xc9\x2b\xc9\x53\x35\x58\x5f\x3b\xc8\x2a\xec\x08\xc0\x70\xa8\x88\xe3\x86\x9f\x53\x85\x3a\xc0\x37\xd6\xe9\xc3\xc7\xaf\x5f\xac\x81\xcb\xe9\x9c\x55\xd8\x35\x71\x16\xe6\xfc\x5a\x75\x8b\x8f\xdf\x40\xf0\x75\x45\x45\x44\xf7\x24\xd3\x86\xd2\x9e\x81\x58\xc9\x82\x2b\x25\xbc\xbd\x27\x2d\xf8\x51\xa6\x42\x28\xa6\x0b\x41\xd1\x69\xce\x8c\x54\xf3\x4c\x30\x6e\x2d\x4f\x16\x13\xf7\x24\xe5\x89\x5d\xa7\x28\xd3\x27\xc6\x96\x82\xe7\x3e\x59\x3b\xe7\x12\x87\x62\x3c\x29\xb5\x31\x2c\xaf\x32\x2b\x8b\x30\x18\x33\x02\xaa\x2c\xf0\xa0\x0a\xc4\x80\xac\xb8\x3a\xaf\x79\x54\x3f\x8d\xa6\xa5\x63\xbc\x32\xb0\x36\x47\x00\xf1\x9c\x17\x76\xc9\xdc\x2b\x67\x04\xfb\x5a\x1a\xcb\x92\x4c\xc2\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\xcf\x6a\x45\x33\x35\x34\x55\x95\x82\xda\x5a\x58\xc3\x20\x0d\xb8\x1e\x90\x86\x4a\xa5\x21\x35\xdf\x8c\x18\xf7\x60\x5a\x48\x68\x3f\x53\x20\xb5\x3f\x59\x70\x74\xfa\x28\x1a\x2e\x02\x11\x75\xbc\x89\x0e\xac\x9a\xd1\x21\xef\xdd\x33\xe7\xa8\x91\xe2\x5f\x2b\x14\x90\xa5\xb7\xb2\x0d\x60\x01\x94\xb8\x72\x3c\x20\x12\xe1\xce\x57\x7e\x03\xd7\x7f\x76\xa6\xb7\xbc\x9c\x0b\x1b\xf2\x99\xba\xe6\x8a\x37\xd3\x42\x62\xb8\xdf\xd8\x10\xa9\x49\x06\xd4\x39\xd3\x29\x94\xfc\xd4\x75\x55\xeb\xf0\x84\x71\x86\x04\xa3\xb6\xee\x06\xaf\x18\x61\x8a\x66\x78\xa8\x29\x78\x22\x0c\xdb\x3b\x39\x3b\x1c\xb1\xb3\x93\x23\xca\xc3\xd4\xb3\x75\x75\xcc\x24\xc3\x90\x03\x6f\x42\x36\x0e\x08\x6d\xd1\xf0\x51\xed\x27\x3d\xfb\x2c\xe8\x57\xef\x14\xa5\x97\xb6\x25\x00\xa8\x5c\x01\xdd\x9c\x99\x0a\x54\x24\xf2\x09\xc9\x50\x98\x41\xcc\x27\xea\x72\x44\x8f\x3b\xe4\x7f\x11\x26\x42\x54\xa2\xaa\x0b\x1f\xeb\x06\x01\x0b\xe7\xf5\x4a\x69\x07\xa4\x82\x52\xde\x4b\xa7\x7c\x97\x5e\x16\x52\xa4\x8a\xbd\x12\xc6\xf0\xb9\x38\xeb\x18\xde\xba\xc9\x0f\x00\x11\xae\x5a\x1c\x80\x00\xca\xb0\xd0\x37\x7c\x52\xe7\x04\x37\x95\x6f\x96\xe3\x9c\x02\x67\x5d\x97\xd2\x5a\x01\xa2\x04\xc0\xfe\x60\xb1\xdb\x58\x00\xbb\xad\xcc\xe2\x57\x7e\x90\xfa\xc7\x4e\x95\x50\x29\xe6\xf9\x4e\x05\x9b\x96\x52\xcc\xd8\x4c\x42\xf2\x30\xa4\xf3\x8e\x10\xfb\x89\xa3\xef\xc9\x18\x51\xc2\x7c\xc8\x82\xf2\xf3\x9a\xb0\x9f\x68\x62\xb6\xac\x14\x36\x1d\x21\xe5\x1e\x8a\x5d\xe5\x8c\xcd\x21\x1d\x98\x6c\x94\x3f\x3f\xfd\xcf\xbf\xb2\xe9\xd2\x29\x52\xc0\x90\x56\x5b\x9e\x85\x97\xcc\x84\x9a\x3b\x5a\xe1\xa1\xd0\x2c\xd7\x0c\x14\x80\xb6\x20\x38\xf1\x67\x5f\x5e\x4e\x9b\x9a\xdd\x93\x54\x5c\x3d\x89\xe8\x37\xce\xf4\x7c\xc2\x0e\x43\x75\x64\x55\xa4\xe0\xe7\xef\x0e\xd5\x3d\x1c\x9b\xe9\x4c\x26\xcb\xde\x8c\xe6\x41\xc8\xd8\x42\x5f\xa3\x85\xb9\x86\x7b\xea\xca\xaf\x42\x17\x55\x86\xa1\x8e\x17\xa1\xd0\xb9\x32\x62\xb5\x1c\x71\xed\xbe\x00\xe7\x3c\x0d\xd1\x92\xa3\x94\x05\xee\x1f\xa9\xa9\xcc\x85\xdc\xc7\x01\x8b\x0c\x84\xc9\x0b\x9e\x65\x53\x9e\x5c\x5e\xe8\x97\x7a\x6e\x5e\xab\xe3\xb2\xd4\x65\x73\x2e\x19\x77\x67\xf4\xa2\x52\x97\xd8\x0a\x22\xa0\x35\xe8\xb9\x53\xe8\x8b\xca\x7a\x70\xef\x75\x2f\x8c\xa5\xfb\xfe\xe8\xf7\xc6\x77\x3d\x8a\x78\x2f\x6b\x0b\x9b\xaa\xc6\x90\x23\xe3\xf1\x4d\xcc\x6c\x5f\x3e\xfd\xf3\xd7\xc8\xba\x4c\x97\xec\xeb\xa7\x50\x29\x60\x46\xb8\x89\xe1\x44\x75\xea\x49\xce\xb3\xcc\x09\xf2\x98\x29\x1d\xa1\xd7\x31\xe1\x67\xe7\x41\xdb\x9f\xdd\x6e\xad\xc0\x5f\x5c\xfc\x03\x4e\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\x24\x7d\xa0\x4a\xed\x1e\xa8\xdd\x57\x3a\xab\x72\x71\x24\xae\xe4\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\x9c\x83\xd3\x4c\x27\x97\x2c\xa5\x2f\xa3\x7c\xa7\x36\x28\x79\x77\x2a\x74\xcd\xfc\xea\x91\xf1\x75\xe3\xfb\x37\x72\xbd\x72\x5e\x14\x4e\x07\x80\x3a\xcc\x92\x5f\x37\x88\x01\x7b\x12\x90\x13\x7a\x42\xdb\xf4\x0e\x6e\xf4\x0d\x6d\x8c\xe9\x8d\x9c\xdc\xec\x3c\x44\xe7\x5c\xa7\xfe\x91\x91\x7a\xf6\xdd\xdd\xe1\x0d\x86\xa8\x07\xf4\xbb\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\x03\x63\xa0\x02\xe0\xd8\x07\x44\x72\x77\x37\xff\x00\x3e\xf5\x7e\x89\x6e\x0d\xba\xa8\x10\xcb\xc8\xb9\x25\x85\xd0\xdb\x2a\x9c\x15\xa2\x34\xd2\xb8\x73\xf9\x47\xd8\x50\x87\x19\x97\x79\xe4\x78\xde\x0c\x11\x70\x73\x03\x92\x73\x7f\x49\xe9\xec\x14\x1c\x10\x44\x21\xa2\x58\xaf\x51\x6b\x9b\x5a\xed\x79\x35\x05\xfe\x81\xdb\xef\xd2\x50\x6f\xc0\x93\x78\xd3\x32\xf6\xc7\x7a\x19\x9a\x22\xd6\x7d\x12\x64\x2c\xde\xf5\x98\x24\x2b\xbc\xdf\x43\x15\xac\x61\xf2\x03\xc9\x0f\x90\xa8\xb4\xb8\x4d\x11\xda\xb0\x3a\x71\x87\x45\xb6\x00\x19\x90\x13\x86\x49\x1b\x6e\x4f\xd0\x4f\xd9\xee\xf3\xdd\x8d\x4a\x57\x24\x51\xa9\x0b\x3e\xef\xd5\x8f\xa8\x45\xa9\xf6\xb0\x31\x58\x86\xb3\x9f\x22\x51\x52\xd0\x5d\x4e\x92\x78\x2c\x20\x40\x7a\xc2\x60\xbe\x27\x30\x59\x16\xd0\x2f\x8e\x5d\xf3\x25\xe3\xa5\xae\x54\x4a\xee\xd0\xe0\x8f\x7e\xd5\x7a\xf0\xa9\x56\xc2\xc7\x79\xda\x58\x1b\x10\x80\x92\x8a\x3d\x9b\x3c\x7b\xfa\x58\x8e\x38\x78\xc3\xd6\x11\x77\x1a\x8e\x38\x94\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x22\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x5d\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x09\xe5\x16\x09\x28\xd8\x6e\xeb\x5c\x63\xe6\x03\x22\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\xac\x45\x44\x3b\x7e\x5f\xf4\xc0\x09\x6d\x41\x3d\x14\x1c\x9c\x77\xc5\x80\x14\xfc\xbb\x58\xf0\x2b\x01\xb8\x03\x32\xe3\x65\x06\x21\xf2\x73\x9c\x3b\x9b\x56\x96\x09\x75\x25\x4b\xad\xc0\x4f\x7c\xc5\x4b\x09\xc8\x3e\xa5\x98\x89\x52\x28\x67\xc4\xfe\x71\xef\xc7\x83\x37\x90\x7f\xb3\x8f\x5d\x5f\xfc\x2c\x2b\xe3\x21\x78\xe2\x99\x44\xc3\x7d\x74\xf9\xfc\x3c\x1c\x0d\x41\xe6\xfa\x79\xb9\xe7\xe4\x95\xad\xb0\xb5\xcc\xfb\x24\xab\x8c\xbc\xda\x94\x24\x21\x40\x88\x23\xd9\x69\x9d\x5b\xe0\x14\x35\xa1\x56\x70\x26\xea\x30\xc1\x47\x60\xb8\x77\x4d\xa8\x31\x8d\x53\x36\xc8\x67\xc5\x72\x39\x5f\x58\xca\xf6\x6c\x45\x0e\xa2\x10\x54\x0e\x6e\xde\x4d\x7a\xaf\xdc\xb1\x7b\x90\x49\x6e\xee\xaa\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\x93\x33\x8a\xa0\x79\xba\x49\xf5\xdf\x98\x58\x13\xcc\x12\x4c\x94\xc1\x9f\xa0\xbb\x71\xc6\x22\x50\x20\x9f\x50\x02\xc2\x1f\x90\xa8\xc0\x22\x51\x5a\x8d\x17\x11\x68\x53\xa1\xd3\x3b\x16\xf9\x75\x35\x3c\x3a\x99\x1c\xeb\x29\xc8\x16\x3a\x4b\x7d\x0f\x6d\xf4\xe5\x4c\x85\xbd\x16\x42\xb1\x93\x33\xa0\x9f\x7b\x45\x88\x08\xdd\x40\x45\x0c\x2b\x00\x3c\x53\x64\xca\x36\xe8\x79\x57\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\xde\xf3\xdf\x07\x9a\xf9\x8c\x6c\x3e\xd5\x57\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x12\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xad\x0a\x8c\xf7\x99\x25\xd8\xc9\xd9\x61\x0f\xe9\xb5\xfb\x96\xe2\x22\x6e\xa8\xdd\x5d\xc3\x64\x91\xd4\x31\xd7\x09\xab\xc3\x8d\x51\xa1\x04\x6a\x8c\x77\x8b\x75\x75\x55\x13\x23\xa1\xd6\x53\x48\x33\x85\xc3\x38\xb1\x42\x45\xd2\xe4\xce\x81\xa0\x43\xa1\x53\xe8\xbf\x54\x53\xc3\xf8\x5f\xc4\x04\xf1\xc9\x12\x28\xe4\x29\x75\x64\x14\x92\x90\x5b\x82\x09\x5c\xef\x3e\xfd\x30\x92\xe2\x2b\xc4\xfc\x6c\xb4\x3c\x3b\x39\x1a\x92\x5d\x0a\x99\xde\x3b\x76\xb9\xbb\x7d\xd9\x2c\x89\x6b\x22\x49\xd0\x80\x7e\xb3\x9f\xe9\xf4\x06\x35\xa9\x3e\x68\xe0\xfe\xb8\x13\xb0\xd5\x8c\x33\xf4\x2f\xb6\x7a\xbc\x77\x20\xca\x9d\xa5\x04\xa8\x5a\x67\x55\x96\x9d\x8b\xa4\x14\x77\xf5\xab\x36\xd7\xff\xa4\x35\xd6\x4d\x2a\x4f\xa4\xbf\x03\x3c\x01\xdd\xac\x6a\x10\xcc\x28\xb1\xa3\x2e\x3e\x2c\xaa\x0c\x72\x61\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xc4\x92\xc6\xa7\xd5\x60\x1a\x57\x63\x15\x8c\x08\x0f\x0b\x3d\xa5\xb8\x31\x18\x6a\x95\x2a\x95\x57\x32\xad\x78\x06\x0f\x02\x2d\x34\xee\xbf\x1f\x4e\xc8\xdc\x83\xba\x76\x68\xc1\xef\x7b\xec\xe3\xbc\xff\x80\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\x6c\xf3\x40\x14\x35\x80\x25\x7f\x0d\x9a\xd0\x1b\xbf\xbe\x5e\xa5\x77\x86\x97\xae\xe6\x0b\x20\x56\x99\x73\x8f\x10\x98\x09\x0b\xe0\x6f\x14\xc0\xc5\xac\x1d\xfa\x6d\x4a\x6a\x55\x0c\x86\xd7\xe4\x8d\x07\xa2\xac\x75\xf5\x68\xb5\xb2\x8f\x23\x31\x43\x34\xb2\x77\xe6\x40\x7d\x25\xca\x2b\x29\xae\x9f\xd0\x51\x37\x76\x66\xfc\x18\x29\x62\x9e\x00\x61\x9f\xfc\x01\xd5\xc1\x8b\xd7\x47\xaf\xa1\x93\x32\xb9\x19\x2b\x23\x66\x55\x46\xbd\xe8\x27\x8c\x17\xf2\x47\x51\x1a\xc0\x8a\xbd\x94\x2a\x1d\xb1\x4a\xa6\xdf\x7e\xc6\x0c\x17\xa9\x64\x9d\xb6\xd7\x4b\x6a\xbd\x24\xa9\x44\x65\xc3\xf2\xdf\x75\xbb\x78\xca\x02\x9a\x8a\x4c\xab\x79\x54\xf4\x0c\xea\xc0\x89\x92\x76\xa5\xe9\x2c\x02\x38\x82\x49\xab\xcb\x14\x92\x23\xa5\x2e\x1b\xfe\x5b\x37\x1e\xc0\xda\x45\x29\x96\x4e\xa4\xc9\xc6\x78\x90\xb7\x62\xc2\xe1\xc1\x30\xf3\xc1\xd7\x47\x7a\xd4\x5f\x0f\x97\x87\xe8\x8d\x0b\xae\x52\xf8\x33\x49\x74\x99\xd2\x7c\xa5\x0d\xf9\x9c\x98\xfd\x83\x29\x27\x70\x0c\x39\x89\xc6\x55\xfb\xc9\x60\x31\x96\x79\x23\xf7\xcf\xab\x29\x95\x92\xbf\x56\x82\xf1\x5c\x3b\x41\xdc\xc6\xb6\x6f\x51\x24\xe7\x4b\x38\x0b\x61\xaa\x2f\x7d\x7e\x3a\x15\x15\x9a\x11\x7b\x23\x78\x2a\xa3\xba\xe8\x11\x7b\xd9\x2c\x94\x1e\xb9\xb9\x9c\x63\x05\x27\x7d\x84\xb3\x2f\x85\xd1\x55\x99\x88\x37\x18\xd4\xc9\x7d\x02\xd1\xea\xcb\xb8\x55\xb1\xfc\x52\x28\x34\xa2\x1d\x69\x20\x6e\x55\x95\xb0\x06\xc9\x42\xa4\x15\x9c\x2a\xd3\x25\x9b\x49\x6c\x78\x01\x47\xbb\x9c\x2f\x84\xb1\x5e\x19\x7c\x02\x49\x39\x75\xef\x30\x3f\x01\x60\xdf\x28\x7b\xb7\x76\x3b\xe5\x1c\xe0\x98\x61\xcb\x72\xeb\x0b\x54\xd0\xc6\x32\x55\xee\xf7\x72\x9b\xd2\x66\xc2\x5e\xba\x47\x21\x3f\x45\x8d\x04\x64\x8b\xb8\x10\x54\x23\xbf\x19\x9b\x71\xb3\x80\x36\x1b\xed\x25\x20\x8c\xfe\xa4\x2a\x9d\xc0\x40\xe8\x6c\x0e\xed\xd1\xa1\x95\x2e\x74\xd2\x5e\xe7\x68\xe9\x59\x90\xe0\x26\x3b\x8e\xce\xbb\x87\x72\x88\x1d\x84\x04\x73\x47\xf8\xa4\x25\x09\x70\x25\xdd\x81\xe5\x21\xa6\xca\x4a\xd5\x11\x4e\x27\x15\x3e\xdf\x91\xd4\x3d\x9e\xd9\x29\x0e\xd9\xe7\x04\xe4\xe5\xbc\xbf\xa7\x62\xf7\xa0\x9c\x57\xb8\xd1\x49\x0a\xd7\x40\xdb\x93\x56\xa2\x31\x28\x53\xce\x02\x39\x7c\x75\x14\x57\x36\xc5\x25\x1b\xbe\x2e\x6c\xc2\x7e\xec\xeb\x57\x6e\x3b\x96\x9d\x40\xaf\xbd\xd5\x75\x9b\x0c\x27\x34\xb2\x2b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x74\x12\xd6\x46\xa2\x4a\x16\x5c\xcd\xc1\x2e\xd4\x95\x1b\xef\x8f\x7f\x84\x19\x95\x22\xad\x12\xea\x31\xe2\xb9\xf6\x8f\xde\xcb\x4a\xc8\x5e\x20\xae\x4c\xc2\x0b\x3f\xe7\xf8\xb5\xcc\x52\x59\xfe\xfe\x39\x93\x13\x31\x61\x3b\x7f\x8c\xbe\xda\xc1\xa7\x17\xa5\x76\x8f\xa0\x8a\x0a\x98\x55\x26\x2d\x64\x36\xec\xc4\x77\x4f\xd8\xb1\x7b\x06\x44\x9e\x02\x01\xa3\xa4\xff\x69\x4d\xbe\x11\x2b\xc5\x9c\x97\x69\x46\x1e\x92\xeb\xa8\x52\x24\x10\x4c\xbc\x97\xc6\x1a\x3c\x86\x6c\x0f\xe1\x64\xb9\xb9\x74\xa2\xc8\x6d\xae\x71\xca\x2d\x1f\x47\xbb\xfa\x09\x9a\x5a\x63\x02\x3f\x1e\x73\xe2\xae\x5a\x6a\x3d\xf9\x03\x15\x5c\x8e\x79\xb8\x4b\x3a\xa5\x1c\x60\x88\xbb\xab\x3a\x0f\xcd\x2d\xd6\x03\x03\xbb\xb9\x81\x8f\x6b\x60\x7c\xa0\x01\xb4\x95\xa9\x55\xa6\x20\x47\x09\xe6\xf9\x86\x2d\x7d\x7c\x7a\xf1\xe6\x1f\x67\xaf\x4f\x4e\x2f\xb6\x3b\x7b\xbb\xb3\xb7\x3b\xbb\xc7\xce\x16\xea\xaa\xf7\xae\xf6\xd6\xd3\xba\x40\x6d\x1b\x7d\x32\xaa\x39\x7a\x44\xe9\x70\xc7\xea\xea\x47\xee\x94\xe9\xa2\x14\x06\xf4\x13\x88\x32\xad\x89\x5b\xd3\x0d\xa8\xba\x1f\x3e\xf8\x7c\xb8\x0d\x66\xb3\x0d\x98\x25\x14\x3b\x56\xd6\xad\x5a\xdc\x14\xf1\xf0\x9f\x27\x47\xc7\xa7\x17\x27\x2f\x4e\x8e\xdf\x6c\x34\xbd\xa3\x27\xfa\x63\xf3\x5c\xee\x78\x4a\x16\xa5\xb8\x92\xba\x32\xd9\x32\x00\x48\xaf\x17\x02\xab\x19\x82\x2a\x05\x8f\x87\xc7\xc8\x5e\xfb\xb3\xed\x61\x3b\xec\x61\xdb\xcc\x76\xe9\x01\xfc\x33\x14\xfb\xbe\x28\x75\x3e\x10\x0b\x9f\xa3\x2f\xc6\x87\xb0\xd7\xf1\xd3\x2e\x61\x84\x34\x8e\x1e\x52\x1e\x6b\x40\x12\xa7\x8f\xe6\x85\xed\xd1\x1d\x64\x10\xbc\xdf\x61\xa0\x71\x31\xc3\xe6\x15\x2f\x7e\x10\xcb\x37\xa2\x27\xbe\x50\x93\xde\x22\x13\x89\x3b\xe8\xd8\xa5\x58\x62\x3a\xe5\xa1\x7f\x58\x1f\x1c\xa4\x7b\x09\x97\x7c\x29\xfa\x40\x59\x0f\x89\x73\x7c\x29\x7a\xa4\x8a\xfa\x6b\x05\xf1\xd7\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xe3\xf8\x13\xe0\x3a\x3f\xde\x38\x4a\xf3\x1a\x70\x15\x7c\xf8\x76\xe0\x95\xc0\x48\xfa\xb2\x71\x76\x05\x21\xc2\xb0\x88\x13\x78\xd3\x87\x1e\x48\xc9\x18\x88\x34\x7d\xdb\x0b\x32\x5c\xc2\x61\xe5\xea\x6e\x2d\x58\x31\x33\x3f\x20\xd8\xa5\xcf\x3d\xe8\x81\x09\x3d\x01\xa1\xcb\xee\xa8\xf9\x27\x04\x46\x47\xec\x5f\xe1\x43\xe8\xe2\x6f\x7e\xde\xdd\xfd\xe6\x87\xe3\x7f\xfc\x6d\x77\xf7\x97\x7f\xc5\xdf\xc2\x51\x88\xe1\xed\xe6\x2d\x80\xe0\xa0\x74\x2a\x4e\xe1\x19\xf0\x27\xa9\x6b\x07\x18\x42\xa1\x2f\xa0\x00\x7b\x82\xb9\x46\xe1\xcf\x42\xa7\xed\xbf\x4c\x2f\xa8\xc1\x7b\x79\x30\xc0\x12\xf5\xa8\x07\xc2\x6b\xb8\xe3\xa1\x96\x25\x03\x6f\x55\x1a\x35\xb4\xb6\x49\x16\x22\x47\xb0\xb3\x17\x9e\x04\xd0\xb7\xd8\x23\x3d\x28\x28\x8f\x77\x9a\x69\x13\x77\x72\xe7\xea\x59\xaf\x06\xef\x78\x0d\x28\xda\xc2\x0a\x0e\x4c\x30\xa0\x08\x51\x0b\x37\x72\x38\x60\x43\x9a\x4b\xe8\xab\x79\x70\x76\xc2\xae\x90\xc2\xf7\x86\x38\x3e\xbc\xf9\xe2\x93\xca\xb8\x10\x44\x6d\x97\xe1\x3e\xc7\x0c\x66\xff\x3d\x41\x22\x98\x80\x8d\x27\x9c\x61\xb3\x87\x1f\x4e\x92\xa2\x1a\xd1\x0d\x93\x5c\xe4\xba\x5c\x86\x3f\x43\x29\xe6\xd8\x58\x5d\xf2\x39\x54\xc2\xe0\xcf\xf1\x67\xe1\x2f\xfc\x61\xe3\x01\xab\xbf\x46\x53\xb8\x8e\xa5\x92\x44\xee\x08\xed\x51\x5f\xf7\x50\xb6\x79\xd2\xdf\x13\xd1\x96\xf4\x05\x68\x6a\x5e\x4d\x86\x0c\x9e\x38\x54\x38\x03\x15\xc1\x9e\xa4\x12\xe1\x51\x9d\xc5\x06\xde\x00\x75\xe5\x2c\xcb\xce\xd0\x7a\xf5\x35\xa0\x34\x4b\xe5\x95\x34\xba\x47\xbd\x4f\x18\xe8\xe6\x8c\x47\x42\x29\xc1\x2c\xae\xe0\x36\x7b\x5f\x00\x9a\x58\xd8\xaf\x2d\xb1\xff\xac\x4f\x43\x31\xbc\x0a\x6e\xad\x28\xd5\x73\xf6\x5f\x7b\xef\xbe\xf8\x6d\xbc\xff\xed\xde\xde\xcf\x4f\xc7\xff\xf9\xcb\x17\x7b\xef\x26\xf0\x8f\x3f\xed\x7f\xbb\xff\x9b\xff\xe3\x8b\xfd\xfd\xbd\xbd\x9f\x7f\x78\xf5\xdd\xc5\xd9\xf1\x2f\x72\xff\xb7\x9f\x55\x95\x5f\xe2\x5f\xbf\xed\xfd\x2c\x8e\x7f\xb9\xe5\x20\xfb\xfb\xdf\xfe\xb1\xf7\xd4\x07\x00\xf7\xc5\x6b\x48\x88\xdf\xe6\x88\x83\xb0\xdf\x27\xec\x6b\x81\x97\x67\xaf\xa1\xf7\xff\x1b\x2f\x35\xa3\xac\x1e\x7f\x5c\xdf\x9b\x0d\x8e\x69\xa1\x9f\xc3\x93\x83\x4f\x6a\x56\xc8\x04\xd3\xe2\xb1\x9d\x73\xbf\x07\xe7\x4e\xe8\x48\x09\xeb\x5a\x6b\xa2\xb3\x52\xe7\xbe\x0e\x1f\xc2\x1b\x58\x31\x46\xf7\x5d\x8a\x5e\x3d\x92\xf1\xda\x3a\x83\xb6\xce\xa0\x1b\xae\x8f\x3a\x83\xb0\x88\xe0\xfe\x7a\x82\x84\xba\xea\x1a\xc2\x58\x1b\x41\xf7\xb6\x4e\x8c\x76\x77\xbb\x80\xda\xc4\x6f\xf5\xba\x95\x6b\x9d\x4c\x83\x07\x5a\xbe\x3e\x86\xc9\x0e\xa0\x65\x3b\x6e\x7c\x18\x20\xa0\x89\x0a\x34\x6d\x7c\xd5\xe4\x95\x9b\x42\xc0\x90\x6f\xa0\xc5\x42\x6e\xb1\x54\x73\xc2\x9f\xc0\xa3\x84\xa2\x4f\x52\xd5\x38\xbb\x41\x39\xac\xc1\xd9\xb9\x31\x3a\x81\x2e\x48\x08\x8b\x17\x40\xf8\x68\xda\x30\x1b\xcb\x2f\x21\xda\x98\x88\x54\xa8\x44\x10\x70\x7b\xa3\x6d\x2d\x57\xec\x58\x5d\x79\xf0\xfa\xb4\xc2\x64\x10\x14\x7f\xeb\xc7\x78\x5c\x09\x08\x8e\x11\x29\x08\x16\xe5\x21\x80\xd4\x0f\x16\x36\x87\x54\x0c\x3d\xab\xbd\xac\xdd\x3a\x5b\xf6\x3e\xc5\xfb\x9f\x99\x21\xb2\xd5\x4b\x19\x5a\x39\x2c\x6b\xf7\x73\xf3\x90\x7c\x0c\xc1\xc0\xfe\xc7\xe7\xef\xee\xe8\x1c\xe8\xd8\x1c\xe6\xc8\xbc\x43\xec\x64\xc8\x63\x72\x88\x60\x49\x51\x8a\x99\x7c\x3f\xd0\x3e\x3d\x88\xea\x09\x65\x2a\x94\x95\x33\x89\xcd\x7b\x8b\x52\x14\x42\x81\xab\x15\x4a\x34\x9c\xec\xa7\x93\xb2\x0e\x4e\xdf\xc7\x64\x1e\x54\xb8\x87\x15\x65\xe7\xeb\x94\xfd\xad\x1c\x63\x5b\x39\xd6\xf9\xfa\x4c\x72\x8c\x38\xf7\xfe\x08\x31\xc8\x3c\xef\x9f\xfd\x7e\xd8\x4c\x65\x07\x46\xee\x5f\x42\xdc\x82\x71\x0b\xa2\xd1\x6a\x4c\x5e\xc3\x3a\xb6\x92\x65\xe2\x4a\x64\xa4\x37\xb1\x9c\x2b\x3e\x47\xec\x7d\xab\x03\x5a\x8f\x2e\x43\xff\xa4\x76\xde\x3d\xe8\xf1\xbe\xc4\x0b\xbe\x2c\x75\x96\x89\xd2\xb0\x4c\x5e\x0a\x76\x24\x8a\x4c\x2f\x73\xca\x7d\x4d\xd9\xb9\xe5\xd6\x71\xf5\xb9\xb0\xdd\xc2\xbe\xfd\x60\x3c\x7c\x15\xfa\x40\x60\xe7\x58\xd6\x0e\x45\xe1\xac\xa0\x0a\xca\xd7\x0a\x84\xc6\x01\xb4\x72\x19\xb1\x53\x71\x25\xca\x11\x3b\x99\x9d\x6a\x7b\x86\xda\x77\x33\xe1\x0e\x6f\x64\x72\xc6\x9e\x3b\xbb\xce\x58\x66\xb1\x9d\x46\x54\xa0\xae\xcb\xc6\x00\x35\x50\xdb\x10\xf5\x79\xab\xb5\xe7\x30\x52\xa8\x3c\xef\x14\xc9\xe8\xb5\x4c\xa1\x5f\x51\xef\x05\x3a\xc0\x7a\xd2\x1a\xbb\x37\xe2\x6f\xc4\x55\xf0\xd0\x63\x60\x05\x4a\xc5\x4a\x61\x0a\xad\x8c\x68\xe2\x2a\x86\x19\xa1\xb5\x3b\x2c\x68\x6b\xe7\xc3\xb3\xef\xb1\x59\x68\x63\xa1\x84\x76\x98\x2e\x58\x67\x7e\x38\xa8\x48\xe6\x59\x26\xd2\x46\x1b\x34\x6c\xdf\xc3\x9b\x1e\x82\x04\xda\x31\xa4\xa1\xa1\x07\x16\x2a\x37\x6a\x9c\x1b\xf7\x87\x96\x7a\xbe\x69\x8d\xef\xa7\x7c\x53\x65\x73\xbd\x31\xe1\x1c\x89\x18\x60\x05\xe1\x19\x70\xbf\x4d\xd4\xf9\x66\xa1\xf5\x25\x4b\x74\x5e\x64\xb0\x75\x7a\xec\xac\xba\xf1\x56\x60\xa5\xb1\x1b\xdd\x3c\x89\x7a\x72\xc1\x07\xfd\x5a\x72\xf5\x52\xc4\x86\x50\xc3\xc4\x7b\x91\x0c\xd6\xb4\xf3\xf8\xbd\x48\xa2\xae\xb3\x80\x41\x95\x78\x84\x08\xb7\x63\xfb\x37\x13\xef\x1d\x72\x18\xca\xcd\xdf\xa3\x96\x2e\xbe\x5a\xb0\x7d\x30\xa6\x87\x37\xa7\x47\x40\xa7\x08\xb0\x85\xb0\xbe\x2e\x86\xd1\x08\xcc\x88\x5b\x6f\x05\xeb\x2f\x24\x52\xfb\xb1\xa0\x27\x94\xd6\x96\xed\xed\x3e\xd9\xdd\x5f\xf1\x3f\xb6\x30\xb2\x2f\xa2\x5f\x4a\xc0\x76\x2c\x00\x28\x51\x24\xbb\xe9\x88\x49\xeb\x33\xad\xb1\x61\x11\xcc\x8a\x8a\xfe\x46\xcc\x68\x66\x4b\x9e\x4a\x52\x63\xe0\x53\x77\x93\x2d\x2b\x92\xf2\x7b\xbb\xbf\xed\x52\x2f\xa3\x6b\xad\x76\x2d\x4c\x7f\xc2\x2e\x10\x27\x26\x0c\xb4\xd4\x15\xb4\xe8\x44\x12\x14\x99\x4c\xa4\xcd\x96\x20\xb1\x98\xae\xb0\x9f\x97\x3b\x2f\xa8\xd8\xf0\xf8\xbd\xb4\xbe\x9b\x88\x9e\xb1\xa7\xd8\x4e\x4c\x70\xf2\x80\x66\xf2\x4a\x3c\x59\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x11\xd2\x89\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x42\xf4\xbb\xee\x6d\xaa\xd9\x0a\x5c\xd7\xc5\xc5\xd9\x77\x8d\x46\xd5\x20\xc5\xad\x2d\x7c\xea\x4e\xd4\xcd\xfd\x1e\xc8\x8e\x61\x82\x95\xbd\x3a\x56\xb3\x01\x45\x58\xdf\xce\xd5\x6c\x3d\xfc\xda\xed\x5b\x56\xb3\x7f\xe8\x0a\xc0\x40\xf8\x34\x5b\x06\x24\x06\x23\x2c\xdb\x71\x43\xed\x38\xf1\xe4\xb8\xe1\x7b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xec\x39\x50\x19\xab\x73\xb6\xa0\xd7\x6e\x96\x5e\xd2\xce\x98\xc0\xee\xf1\x75\x4d\xa5\x28\x50\xc2\xd1\x6f\x1e\x9d\xfc\x5a\x91\x1b\x48\xf7\x46\xd7\x82\x24\x26\x5b\xdc\x14\x47\x2a\x24\x16\xe2\xce\x0c\x24\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\x25\x9e\x41\xef\xcb\x40\x44\x1c\x34\x5a\xcf\xfa\x97\x8a\xc6\xd7\x87\x09\x30\xcc\xe2\xb3\x21\x29\x50\x0c\x90\xda\xbd\x9a\xd8\x8d\x30\x52\x50\x7a\x89\xc2\x15\xc4\x84\x11\xe5\x55\xd7\x62\xee\xfa\x1a\xee\xd5\x75\x77\x8b\xdf\x5f\x6b\xea\xa4\x4b\xa6\x42\x1b\x6c\x0f\x6b\xba\x4a\x90\x28\x33\x81\xba\x66\x7b\x77\xae\x3f\x8e\xb8\x9a\x0b\xf6\xcc\xfd\xf2\xaf\x7f\xf9\xcb\x57\x7f\x99\xe0\xf0\x21\x4b\x41\xb1\x93\x83\xd3\x83\x7f\x9e\xff\x78\x08\xc5\xb1\x7d\xa9\x3a\x50\x0a\xe6\xd0\x09\x98\x83\xa6\x5f\x7e\xd2\xe4\x4b\x28\xf9\xe8\x2d\x45\x9a\xbe\x7f\x18\x32\xc6\xf7\x24\xdd\x2f\xc2\xd9\x73\xba\x66\xd3\x91\xea\xb6\xda\xbd\xd8\x63\x36\x29\xce\x75\x72\x39\xa0\x5d\x73\x24\x8a\x52\x24\xe8\x27\xbb\x38\x3c\xc3\xd1\x9d\x7d\x79\xfa\xfa\xa2\x2e\x35\x80\x7c\x9c\x1a\x4c\xef\x7b\xf2\xa4\x39\x9b\xf4\x52\x14\x36\x98\xee\x53\x9e\x5c\x5e\xf3\x32\x05\xcf\x16\xb7\x72\x2a\x33\x69\x11\xfb\xaf\x14\xd4\xb7\x0a\x13\xfe\x10\xe4\xcc\xf7\x05\x46\x59\x8e\x0e\x04\xef\x0e\x05\x97\x15\xe6\xd1\xcc\xb8\xcc\xc0\x83\x4a\x2d\x79\x31\x23\x28\x29\x82\x4b\x2f\xf6\x69\x6f\x8d\x2f\x7f\xdd\x5b\xe3\x2b\x6a\x19\x7c\x57\x3b\xac\x6f\x5e\xe2\x3d\x3e\xea\xe8\x88\x2b\x1b\xdd\xbb\xb7\x47\xdd\x00\xe3\xdd\xdf\xa3\xae\x28\xc5\xb9\xd5\x9d\x5a\x00\xb0\xd5\x28\x09\x0e\x76\x43\x8c\x64\x2a\x66\xda\x09\xe1\x1b\x83\x1e\x69\x05\x9b\x90\x2b\x28\x0e\xf4\x5e\x2d\xdd\x08\x6c\x60\x46\xa6\xef\x97\x9d\x11\x70\xea\x13\x13\xa3\xa5\xfa\xe6\xc7\x23\xf7\x76\x22\x87\xd9\x8d\xea\x2a\x07\x6a\xbd\x0c\x1f\x0a\x9b\xa0\xe7\x36\x12\xe4\x80\x1c\x4a\xd3\x6f\x87\x51\x92\x92\x9b\x05\xb6\x25\x16\xef\xa5\xef\x4f\x7f\xa6\xd3\x76\x33\xf1\x79\xc9\x13\xc1\x0a\x51\x4a\xed\x0e\xa3\x4a\xd9\x54\x5f\x2b\x36\x15\x73\xa9\x8c\x27\x05\x80\xa7\x13\xcd\x20\x1e\x23\x4d\x00\x86\x9b\xb0\x37\x0d\xb0\x13\x2a\x43\x4a\x74\xbd\x35\x69\xce\xed\x48\x12\x9c\x58\x40\x27\xec\xd5\x13\x28\x1c\xb7\x2f\xfa\xd8\x94\xf7\x2a\x05\x4f\x4e\x45\xc6\x97\x98\x6d\x0a\x2d\xcb\xe5\xbf\x45\x69\xf6\x07\x88\x38\x61\x03\x2e\xff\xdd\x8d\xf3\x90\x86\x95\x82\x27\x8b\x7e\xc1\xdf\x6d\x88\xea\x96\xd7\x36\x44\xd5\x67\x90\x6d\x88\x6a\x1b\xa2\xfa\xc8\xb5\x0d\x51\x6d\x43\x54\xad\xeb\xde\x5a\x49\xdb\x10\x55\xe7\x6b\x1b\xa2\xfa\xf0\xb5\x0d\x51\xdd\xe2\xda\x86\xa8\x6e\x79\x6d\x43\x54\xdb\x10\xd5\x36\x44\xb5\x0d\x51\xfd\x8e\xfc\x76\xfe\xda\x86\xa8\x56\x06\xd9\x86\xa8\xb6\x21\xaa\x5b\x5f\xf7\xd6\xf8\xda\x86\xa8\xf0\xda\x86\xa8\x9a\xd7\xef\xeb\xa8\xf3\x01\x9e\x33\x67\xea\xf5\xaf\x69\x3b\x83\xa0\x82\x4c\x28\x4e\xa4\x67\x8d\x3a\x28\x7c\xd4\xa4\xee\x51\x11\xc1\x82\xf8\x52\x1c\x8a\x08\xd5\x71\xa6\xb5\xf5\x52\x3d\xfb\xc8\x15\x3a\xad\x03\x15\x51\x84\x02\x0d\xde\xee\x35\x6b\x1b\xab\xc6\xea\x13\x96\xf8\x3c\x21\x89\x7b\x12\xbf\x19\x20\x0c\xb1\x0d\x41\x3c\xba\x10\xc4\x30\xee\xbb\x01\x5c\x77\xbd\x8f\x0a\x8a\xcc\x5f\x2c\x4a\x61\x16\x3a\xeb\xcc\xe8\x0d\x26\x7f\x25\x95\xcc\xab\x1c\x3a\xc5\x3a\x7e\x96\x57\x21\x05\x20\xb4\xaf\x26\x89\x8d\x5e\xc4\xa8\xa5\xac\x6f\x25\x0b\xf5\x9b\x0b\x7e\x05\xed\x51\xab\x24\x11\x22\x8d\x9a\xd2\x83\x86\xf5\xd5\x24\x3c\x29\xb4\xce\x78\xd6\x4f\xde\xf4\x3b\xc4\x11\x8e\x14\x46\xf9\xea\xcb\x4e\x63\xcc\xcb\x62\x18\xb9\xfc\xdd\x9b\xb3\xc3\x48\x2e\x73\xe5\xc5\xb2\x54\x57\x3a\x03\xaa\x72\xbc\xc9\x29\x6b\x13\xac\xdf\x97\xce\x60\x9a\x0a\xcb\x23\xdb\x86\xcc\x02\xc3\x84\xe2\x53\xe8\x50\xeb\x7e\x15\x4e\xe4\x33\x3c\x77\x05\xb7\x55\x29\xd8\x9c\xdb\x4d\x0a\xfc\xfe\x26\x4c\x2f\xf3\x65\x88\xf3\xa6\xaf\x86\xde\xf4\xc1\x39\x3d\xbc\xe9\x85\x9a\x03\x5f\x20\x82\xfe\xad\xf5\xf0\xde\x92\xb2\xbf\x6e\xdc\x7f\x6b\x31\x80\xb8\x81\x17\x1f\x8c\xc0\x3b\xe7\xd4\x3a\x8a\x8e\xf3\xd8\x08\xf2\x5d\xa5\xac\x66\x45\xc6\xeb\xbe\x50\xb0\x02\xdf\xc3\x19\x74\xb8\x10\xc9\xe5\x1b\x8a\xc4\xee\x19\x21\x82\x6e\x3a\x97\x76\x51\x4d\x27\x89\xce\x9f\x38\x91\x80\xff\x37\xcd\xf4\xf4\x49\xce\x8d\x15\xa5\x53\x57\xe9\x88\x1b\x27\x6e\x14\xa9\xe6\x93\x3c\xdd\x9f\xb0\x77\x0a\xab\xdb\xeb\x3e\x94\x11\xb6\x83\x7b\xbe\xc7\xd9\x98\x0a\x27\x5d\x35\xf8\x21\x22\x08\x3b\x37\xbd\x49\x1f\xa0\xe4\xde\x47\x52\xcf\x28\xf8\xe7\x8f\x80\x6f\x25\x17\x1b\xc0\xe1\xf2\xd0\x22\xdd\x83\x65\x7c\x0c\x10\xe1\xbe\x47\xd1\xed\x7b\xa3\x1a\xdf\x97\x88\xf6\x3d\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x27\x00\x65\xfe\x34\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x47\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x7c\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xa1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xc9\x22\xd0\xfd\xa3\xcf\xf7\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x24\x32\xbe\x3c\x17\x89\x56\x69\xe7\x13\xa6\x85\xd2\x19\xf6\x8f\xc1\x61\xc9\x4f\xd5\x2c\xb4\x58\x70\x02\x23\x77\x16\x15\x16\x96\xf8\x58\x06\x29\x14\x10\x55\xc6\x59\xde\xcb\xe8\x04\xbb\x37\x0e\x31\xac\x3a\x19\x72\x11\xbf\xd7\xd7\x4c\xcf\xac\x50\x6c\x4f\x2a\xbf\x8e\xfb\x91\x19\x58\x7b\x27\x03\x5b\xbb\x6f\x9f\x3d\xf5\x37\x3f\x3e\xb7\x23\x38\x58\x8d\xf9\xf4\x5e\x60\x7a\xd0\xc7\xdd\xc0\x74\xe3\xac\xca\x9a\xae\x60\x74\x0f\x37\xe5\xcd\xb3\x1a\x4e\xf9\x19\x8c\x1b\x76\x1b\x57\x29\xa3\x4a\xb4\xc7\xb7\x68\xbd\xf3\x6a\x9a\xaa\x5f\xc8\xa3\xf9\x98\xd7\xf8\xe2\xf0\x0c\x9d\xc6\x5b\x77\xc9\x7d\x71\x97\x6c\x28\x37\xe5\x1e\x2a\xba\x0f\x34\x1f\x65\xab\xe8\xde\xe1\x8a\x6a\x53\xbf\x2b\x79\x22\xce\x06\xd7\x11\xfc\x76\x62\x69\x55\x72\x12\x80\x41\xe5\xf3\x9b\x47\x09\x91\xe2\x6e\x0a\xf5\xbc\x50\x29\x3b\xab\xb2\x6c\xc9\xaa\x42\xab\x66\xf5\x33\xc6\xda\xdb\xc5\xb4\xe0\x92\x5f\xf3\x94\x5a\xb1\x2c\x4a\x4d\x67\x66\x59\x29\xe5\x64\x70\xdd\x13\x0d\x14\x49\x80\x69\xe6\x8d\x92\x5d\x23\xe7\x6e\xfa\xee\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\xa5\xcc\x32\x1a\x66\xc2\xce\x85\xc5\x90\x02\x9e\x9d\x99\x56\x73\x98\x1c\x57\xbe\xf1\xa2\x48\xdc\x6f\x93\x4c\x70\x55\x15\xf8\x3c\x77\x12\x2f\x75\x55\xfa\xe7\x4d\x42\x60\x22\x9c\xc0\x4a\x66\xa3\xa8\xbd\xdb\x07\x17\x36\xe4\xfe\x54\xc6\x29\x00\xaf\x3d\x2c\xf5\x28\x1e\xd3\x23\x87\x9b\xa8\xb9\x4f\x51\xea\x2b\x99\x62\x74\xc3\x93\x0d\x1a\x49\x63\x03\x9f\xb0\x9f\x95\x56\x63\x25\xe6\x1c\x14\x15\xda\x45\xb8\x66\x38\x0e\x66\x10\xa8\x14\x5a\xfa\x38\x0d\x5f\x17\x8d\x72\xfa\x2b\x89\xcd\x88\x23\xca\xb1\x3d\xa5\x99\x86\x7c\xd4\x4a\x49\x8b\x0d\xee\x17\x95\x65\xa9\xbe\x56\xfb\x77\x8a\xba\x42\xa0\xf5\x62\x2d\x81\x9a\xe1\xd7\x75\x7a\x0e\xbe\xef\x87\xc9\x2b\x0d\xb9\x3e\x67\xac\x52\x46\xf4\x3c\xde\x07\x53\x8e\xfe\xfa\xe7\x6e\x32\x42\xe6\x42\x57\xf6\xb3\x58\x7f\xd7\x0b\x99\x2c\x62\x65\x56\xe6\xc2\x30\x5d\xb5\xcc\xe2\x67\xf4\xb3\xf5\x2b\xb4\x35\x01\xd7\x5d\x5d\x1d\xbb\x6b\xbc\x5f\x6d\x38\x84\xba\xf3\x35\xe4\x89\x1f\x9d\x9e\xff\xf3\xe5\xc1\xdf\x8f\x5f\x4e\xd8\x31\x4f\x16\x31\x26\x86\x62\x1c\x84\x06\x08\x8a\x05\xbf\x12\x8c\xb3\x4a\xc9\x5f\x2b\x0a\xf8\xee\x85\xdf\xee\x0f\x8a\xd5\xde\xf1\xf4\x85\xee\xfc\x83\xb5\x83\xc3\x5e\xff\x98\x97\xa5\x8d\x80\x06\x2e\x6d\xf5\xe9\xd8\x7d\x85\xc6\x01\xa8\x5a\x90\x38\x3f\x97\x57\x24\x86\x09\xfc\x9e\xa7\x21\x53\xcc\xf1\xb9\x63\x0b\x77\x54\xf1\x29\x64\x78\x2d\x04\x53\xc2\x3a\xb6\x0e\x3e\x26\xad\x4c\x03\x9c\xa4\x32\xc2\x8c\xd8\xb4\x82\x9c\xb4\xa2\x94\x39\x2f\x65\xb6\x8c\x07\x73\x67\xd5\x69\x08\x79\x2f\xdb\x53\x3a\x7a\x7d\x7c\x0e\x35\x02\x45\x89\xb0\x25\x90\x54\x06\xdf\xc3\x6b\x4d\x85\xfb\x05\xb5\x11\x9e\xb0\x03\xb5\xc4\x2f\x71\x83\x4b\xc3\x32\x69\xac\x80\x23\x98\x74\x48\x1f\x4c\xdf\x79\x3a\x81\xff\xed\xb8\xb7\x2c\x9d\x92\x19\x72\xe5\x92\x95\xe4\x55\x54\x43\xe5\x34\x8b\xa8\x49\xef\xfe\xa8\x1a\xc2\xd5\x49\x42\x8e\x88\x51\x43\x38\x1e\x96\x1a\xc8\x8b\x0d\x02\xa5\x9a\x67\x31\x57\x75\x13\xfb\x7d\x6d\xcb\xbe\x96\xe5\xb8\x7e\x83\xb3\xae\x06\xe6\x20\x8d\xe9\xea\x39\x0c\xd4\xce\xa9\x3e\xfd\xbc\x39\x45\x12\x41\xc7\x1d\x7a\x4f\xce\xfc\x0e\x20\xed\x26\x6f\xb5\x75\x2d\xea\x9c\xa4\x11\x7b\xca\xbe\x61\xef\xd9\x37\x60\x5e\xfd\xb5\x6f\xf3\xab\xbe\x86\xcf\x10\x29\x46\xce\xaa\x3f\x39\x1b\x88\xe2\x3f\x39\xe9\xe4\x46\x74\x54\xb5\x9a\x4d\x25\xa9\xf3\xe2\xbd\x15\xa5\x93\xa3\xb4\x12\x1b\x6d\x1b\xe6\x26\xf8\x19\xd9\x0c\xc3\x0d\x27\xb3\x66\x5a\xd3\xdd\x18\xcd\xfd\xfc\x7b\x6d\xec\x29\x49\xa1\x66\x03\x9c\x7a\xb4\x9c\xdb\x64\xd1\x14\x63\x4e\x51\x33\xb6\xde\x60\x86\xa5\x1a\xb2\xac\x30\x7d\x79\x21\x7b\x24\x4f\xdc\x1f\x36\xee\x17\x4f\x6f\xac\xe7\x87\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x19\xab\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\x7c\x40\x29\x23\x5f\x4d\xf0\x32\x03\x2f\xb9\xfd\x94\x70\x85\x05\x24\x33\x51\x96\x98\x71\x3e\x5d\xfa\x64\xbd\xde\x8b\xd7\x6b\x27\x15\xa5\xb6\x3a\xd1\x3d\x3a\x9b\x35\x63\xdc\x34\x1c\x10\x01\xb3\x7c\xbd\x9b\xfc\xed\xd1\xd9\x88\x5d\x1c\x9e\x41\xb7\xa7\xf3\xc3\x8b\xb3\xa6\xa5\xb2\x73\x71\x78\xb6\xb3\x51\x52\x30\xaf\x59\x81\x63\xba\xc3\x20\x0d\xc7\x93\x53\xdb\xc6\x39\x2f\xc6\x97\x62\xd9\xf1\x4c\x1d\xe2\x5c\x1f\x87\x15\x1e\xe4\x85\x90\xcc\x39\x2f\xee\x3c\x5a\x29\x78\x2a\x3f\x53\x15\x97\x4f\x83\x0d\xcf\x5c\x5f\xce\x95\xeb\x2b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x6d\x8d\xd7\xdd\x7f\xbd\xad\xf1\xba\xf5\xb5\xad\xf1\xda\xd6\x78\xad\x5e\xf7\x26\x91\x75\x5b\xe3\xf5\xb8\xe2\xf6\xdb\x1a\xaf\xdf\x79\xe8\x7f\x5b\xe3\xb5\xfe\xda\xd6\x78\x6d\x6b\xbc\x6e\x77\x6d\x6b\xbc\xee\x7e\xdd\xbb\xa4\xa5\x6d\x8d\xd7\x9d\xae\x6d\x8d\xd7\xea\xb5\xad\xf1\xba\xe1\xda\xd6\x78\xdd\x70\x6d\x6b\xbc\xb6\x35\x5e\xdb\x1a\xaf\x6d\xea\xeb\x47\xc7\xba\x9f\xa9\xaf\x6c\x5b\xe3\x45\xd7\xb6\xc6\xeb\x51\x24\xf8\xb1\x6d\x8d\xd7\xad\xae\x6d\x8d\xd7\xb6\xc6\xab\xcb\xb5\xad\xf1\x7a\x2c\xee\x92\x6d\x8d\xd7\xb6\xc6\xeb\xf7\xa3\xe8\x6e\x6b\xbc\xb6\x35\x5e\xdb\x1a\xaf\x6d\x8d\xd7\x07\x67\xb1\xad\xf1\x7a\x0c\x26\xa0\xef\x03\xdc\xbf\x66\x69\xf7\x50\xe7\x45\x65\x05\x7b\xe3\x87\x0c\x5a\x24\x0a\x06\x69\x62\x8d\xa0\x7f\x0a\x61\xa2\xd5\x4c\xce\x49\xb2\x3f\xc1\xe6\xbb\xe3\xf0\x3e\xe3\xa8\xe1\xed\x03\xcc\x1f\xcc\x64\x2e\xbb\x15\x92\xb1\x95\x85\x79\x09\x63\x45\x71\x19\xb7\x93\x72\xfe\x1e\xb6\x08\xcf\x75\x85\x0d\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\xdd\xbb\x95\x61\xc3\x98\x38\x75\x45\xdc\xd9\x10\x69\x25\xdc\x5a\x51\xaa\xe7\xec\xbf\xf6\xde\x7d\xf1\xdb\x78\xff\xdb\xbd\xbd\x9f\x9f\x8e\xff\xf3\x97\x2f\xf6\xde\x4d\xe0\x1f\x7f\xda\xff\x76\xff\x37\xff\xc7\x17\xfb\xfb\x7b\x7b\x3f\xff\xf0\xea\xbb\x8b\xb3\xe3\x5f\xe4\xfe\x6f\x3f\xab\x2a\xbf\xc4\xbf\x7e\xdb\xfb\x59\x1c\xff\x72\xcb\x41\xf6\xf7\xbf\xfd\x63\xe7\x29\xf7\x56\x89\x87\x53\x88\x07\x52\x87\x3f\x89\x32\x4c\x01\xdd\x81\xf6\x22\x25\xa3\xac\xec\x46\x3a\xb0\x3e\xb4\x1b\xbd\x34\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\x24\x07\x20\xa1\x9b\x5b\x6c\xaf\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x3f\x2f\xf3\x22\x83\xb6\xe6\xb0\x9f\xc7\x3e\x97\x05\x0e\xd7\xad\x6c\xf8\xf8\xb5\x95\x0d\x8f\x51\x36\x18\x91\x54\xa5\xb4\xcb\x43\xad\xac\x78\xdf\xc9\xc3\xd2\x14\x0d\xe7\xcd\x01\x29\x67\x8c\xaa\xb8\xe9\x3b\xa6\x0b\xcc\xfb\x6e\x95\xd3\x2f\x74\x95\xa5\x50\xcc\x51\x29\x30\x30\xb1\x4a\x4f\x58\xb4\xfe\xc0\xee\x81\x54\xee\xf6\x43\xbc\x3d\x87\x66\xe6\xaf\x95\xbc\xe2\x99\xb3\x76\xeb\x5f\x9c\x81\x05\x13\xff\xe8\xb6\x7b\xde\x72\x73\x59\x6f\x78\x31\x76\x3a\x74\x98\xf3\x13\xff\x4a\xf0\x91\x78\x6f\x1f\xa2\x96\x06\x0a\xd2\x59\x29\xaf\x64\x26\xe6\xe2\xd8\x24\x3c\x03\xb9\x36\xcc\x59\x71\x70\xc3\xe8\xb0\xf0\xa5\xce\x0c\xbb\x5e\x08\x27\xab\x19\xf7\x2e\x00\xa8\xb0\x9b\x73\xa9\x58\xee\x96\xa8\xf0\x3f\x36\xe8\x4b\x70\xe2\xbf\xe0\xa5\x5b\xe0\xe0\x33\x00\x13\x79\xaa\x75\x46\x15\x0f\xd9\xb2\x1e\x9f\x6a\x7f\x94\xfe\xa7\x12\xd7\xff\x74\xa3\x19\x36\xcb\xf8\x3c\xb8\x0a\x8c\xb0\x2b\xde\xbe\x7a\xe8\x1b\x5f\x00\xca\x09\x2a\xc1\x78\x76\xcd\x97\xa6\x76\x9c\x44\xb8\x0f\xe6\x39\x7b\xb6\x0f\xec\xcc\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xff\x1d\x1e\x9c\xfd\xf3\xfc\x1f\xe7\xff\x3c\x38\x7a\x75\x72\xca\x4e\xb5\x15\x78\xa8\x45\xcd\x01\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\xb5\x54\xa9\xbe\x36\x9d\x7d\xb4\xc8\x7e\x8e\x78\x82\xab\x4e\x63\x24\xbc\xe0\xd0\xf3\xb0\xc7\x09\xb3\x92\x61\x12\x0f\x0a\x67\x78\x9a\x3e\x49\x4b\x5d\x20\x11\xbc\x93\xab\x3e\x6a\x9b\x66\x74\x9c\xc3\x0a\xeb\x3b\x6b\x0e\x38\x2f\xb9\xb2\xb5\xb7\xa7\x5e\x33\x6a\xb6\x38\xe9\xbd\x1c\x0f\xbb\xa2\x89\xa7\xc3\x55\x33\x1d\xa4\xa9\x48\x1b\xe4\x7f\x74\x99\x83\x87\xfe\xe5\x96\x35\x4a\x05\x3b\x7b\x7d\x7e\xf2\xff\xb6\xf8\x78\x59\xf4\x4b\x94\x1a\xa6\x32\xb6\xd4\xc5\x60\xab\xfb\x86\x2a\x2f\xb7\xeb\x7b\x2f\xd6\x37\x9c\x96\xc3\x84\xe7\xdf\x54\xaa\x09\x64\x54\x8f\xcf\x72\x9d\x8a\x09\x3b\x0b\x71\x82\xe6\xb7\x11\xc0\x01\x2f\x05\x73\xb7\x28\x2b\x79\x96\x2d\x63\x15\xcd\x6a\xac\x42\x6c\x60\x33\xc4\x82\x7c\xc6\x33\xb3\x69\x69\xdc\xe7\x6c\x74\x7a\xc4\x2b\x67\x0f\x0f\xb2\x1c\x61\x34\x96\x0a\xa5\x2d\x29\xd6\x6e\x96\x80\x77\x51\xea\x84\xa1\xf1\x1d\x25\x63\x35\xce\x37\x83\xb1\x0a\x7f\x34\x4a\xe3\x89\x7d\x16\x46\x46\x47\x75\x65\x44\x5b\x41\xf7\x7d\x88\x83\x39\xee\x46\x2f\x05\x4f\xb5\xca\x96\x90\x79\x89\xb9\x14\x39\x37\x97\x22\xc5\x0f\x48\x35\x0b\x91\x0a\x37\x62\x78\xd4\x85\x9b\xb7\x0f\x4b\x80\x4a\x86\x19\x1e\x10\xce\x10\xe9\x86\x57\xbd\xc7\x26\x74\x44\x79\xad\xb2\xe5\x1b\xad\xed\x8b\x50\x46\x3b\x08\x07\xfc\x44\xda\x72\xd3\x15\x0d\xea\x24\x87\xe7\x8e\x61\x35\x60\x53\xc5\x15\xbc\x47\xf5\x8a\x3f\xf4\x2d\x55\x56\xea\xc0\x7c\x57\xea\xaa\xf3\x21\xb6\xa2\x6c\x7e\x77\x72\x04\xa2\xa8\xa2\x50\xa5\xb2\xe5\x12\xa0\x03\x56\x51\xdf\x82\x61\xf0\x96\x82\xad\xf1\x9e\xa8\xe3\x62\xec\x15\x5f\x32\x9e\x19\xed\x69\x29\xd5\x5a\x2b\x94\x4c\x5c\xf7\xf5\x54\xdb\xc5\x8a\x6d\xeb\x36\xd4\xea\xef\x46\x51\xe4\xb2\x86\xa1\x93\x6a\xe5\xe7\x96\x5f\x0a\xc3\x8a\x52\x24\x22\x15\x2a\xd9\xf4\xb2\x6f\x3a\xe0\x07\xac\x73\xaa\x95\xdb\x98\x83\x30\xcf\x49\x88\xf4\x12\x49\x63\x56\x81\x98\x31\x59\x7f\x1c\x22\xc7\xb0\x2d\x2b\x23\x4a\x0c\x73\x97\x95\xc0\x95\xfc\xa1\x9a\x8a\xcc\x51\xde\x99\xa4\xd4\x29\x1e\xdd\x19\x32\xe7\x73\xc1\xb8\x0d\x9c\x66\x35\x13\xca\x38\x89\x89\x0e\x50\xcb\x52\x2d\xea\xea\x7b\x6e\xd8\xdb\x93\x23\xf6\x94\xed\xb9\x67\xed\x03\xff\x40\x23\x79\xab\x31\xc9\xad\x6d\xa3\xce\xfc\x10\x30\x25\x60\x5e\xa6\x4b\x14\x12\x23\xa6\x34\x33\x55\xb2\x88\xbb\xd7\x7b\xb3\x99\x12\x21\x21\xb4\x72\x3f\x79\x7d\xb3\x12\xea\xad\x11\xe5\x60\x02\xea\x6d\x07\x01\x15\xab\x51\x8e\xe7\x9a\xd4\x43\xc6\xca\x85\xe5\x29\xb7\x9c\x04\x97\xbf\xe1\xde\x2e\xe9\xef\x5b\x7c\x19\xf1\x52\xaa\xea\x3d\x26\x1e\x0d\xe7\x6a\x39\x3f\x86\x61\x59\xe2\xa9\x0e\xab\xce\x8b\x22\x93\x88\xb6\xd1\x4a\x84\x3b\x69\xf0\xca\xe8\x06\x35\x11\xe4\x04\xcf\x32\xed\xe4\xa3\x53\x4e\xb8\x4a\x75\xbe\xf2\x30\xa7\x44\x8a\x06\x5e\xea\x84\x6d\xb9\xaf\x79\xdd\x13\xa7\x50\x26\xae\x44\x0f\x6c\xb1\x36\x3e\xac\x1b\xcd\x11\xc7\x73\x04\x0c\xcf\x32\x3e\x15\x19\xd2\x18\x39\xd0\xac\x72\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x46\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x0f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x02\x1d\xaa\x1e\x47\x3d\x6b\xd3\xc1\xe9\x0d\x4d\x3a\xc0\xe1\x7d\xdf\xe9\x60\x44\x92\xe8\xbc\x38\x2b\xb5\x33\x3b\x07\x3b\x9b\x68\xd8\x3a\x66\x88\x8e\x8d\x35\xc9\x58\x70\x16\x34\x6f\xe6\x65\x94\xd8\xc9\x2d\x1e\x12\x3e\xbb\xf3\x7f\x44\x67\x16\x88\x9e\xf6\x41\xe6\x47\x69\x84\x17\xdd\x2f\xe9\x8b\x87\x7c\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\xc8\x69\xa4\x13\x9e\x01\x76\x6c\x3f\x96\x63\x6d\xb6\x6b\x0f\x1c\xa5\xf3\x42\x8c\x12\x3e\xf3\x09\x24\x00\x23\x0a\x9f\x90\x0b\x53\xe9\x54\x44\xb1\x6c\xcc\x43\xbe\xc0\xb4\x4f\xb8\xcf\x67\x12\x3b\xbd\xc2\x87\x95\xd3\xc6\xaf\xad\x26\x04\xb4\x57\x01\x91\xd6\x4d\x50\xa8\x54\xaa\x39\xf8\xd5\x46\xac\x14\x19\xe6\x20\x93\x10\xb8\x44\x0b\x72\x17\xb6\x84\x1f\xd4\xef\x07\xff\x68\xd0\xc5\xa4\x56\x34\x32\x78\x8a\xbc\x86\x35\x43\x71\x2b\x0d\xdb\x79\xe9\x09\xd0\x03\xc2\xf3\x3e\x9e\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x29\x55\x4a\xe9\xba\x0d\x62\x05\xb0\x75\xd4\x83\x21\x11\x5c\xa6\xb1\x6c\x79\xce\xde\x29\x16\x88\xc5\xc6\x9d\xd9\xe3\x0d\xaa\xcc\xde\x47\x37\xfe\xb0\xe3\x35\x3c\xa4\x3d\xcc\x5b\x05\x6b\xef\x9e\x3b\x76\x96\xfb\xea\x7d\xfe\x5d\x36\x0a\xdd\x43\xd2\x6f\x68\x2b\xe6\x27\x1c\xd6\xab\xf4\x89\x63\x6b\x2b\xd5\xdc\xc4\x96\x0c\xcf\xb2\x86\x33\x7c\x9d\x29\xe3\x57\x38\x40\xeb\xaf\x9a\x10\xad\x32\x83\x87\x62\x86\x64\x4e\x9d\x78\xe0\x46\xc8\x3c\x37\xfc\xb0\x74\x94\xb0\x92\x67\xe7\x45\x77\x88\x52\xb6\x02\x87\xf7\xea\xfc\xa0\x39\x34\x1c\xd6\xd0\xf9\xc1\xad\x95\xfb\x9e\xf1\x34\x97\xc6\x80\x23\x4c\x4c\x17\x5a\x5f\xb2\xbd\x35\x78\x5c\x51\x9e\x96\x91\x73\xf3\x84\x78\x7e\xec\x66\xbf\xcf\xa4\xca\x42\x56\x14\xd8\xc1\xca\x1a\xef\xc8\x81\x87\x24\x61\x16\xb0\x86\x84\x5b\x4d\xc9\x0a\xab\xd3\x44\xa4\x6a\xc7\x05\x1b\x17\xd8\xab\xcb\x73\xda\x13\x76\xe5\x23\x4b\x74\x4a\xbc\xdd\x46\x56\x5b\x4b\x47\xd4\x1e\x37\x4e\x24\x52\x2e\x12\x61\x86\x03\x74\xfa\xbe\x1e\x93\xa5\x02\xab\x78\x04\x64\x3f\xf1\x1b\x93\xec\xc0\x2f\xbd\x0b\xc5\xa0\xf4\xd3\xdd\x58\xa3\xbe\xa8\x85\x8b\xb3\x47\xb2\x62\xc1\xc7\x68\xa4\x3b\x89\x06\x22\xd0\xab\x10\x0b\xad\x34\x15\x49\xb8\x43\x54\x2b\x60\x69\x10\x51\x18\xcd\x83\x35\x21\x11\x1d\x4d\xf5\xb0\x8e\x12\xc7\x81\x40\x28\x26\x43\xfc\x88\x7a\x0e\xd7\xd2\x2e\x7c\xa7\x97\x46\xd4\x10\x66\x52\x0a\x03\x01\x18\xc5\x44\x59\xea\x92\x12\xb2\xbc\xdf\x1a\x46\x02\x49\x0e\x19\x5d\x8e\x49\xb8\xfb\x6b\xd7\xc4\x81\xea\x1a\x0a\x1e\xf2\x15\x1d\x37\x89\xd9\x4c\x24\xa0\x68\xc5\x04\x46\xa9\xbd\x57\x03\xdf\x52\x95\x81\x63\x30\x82\x92\xcf\xe5\x7b\xf7\x94\xf8\x57\x71\x48\x9c\x00\x67\xd7\x7f\xbd\x3f\x61\xec\x44\x85\x0c\xde\x91\x5b\xc5\xf8\x4e\x9f\x7a\x66\xdd\x2b\xc6\x7d\x08\xe0\x05\x62\xc7\x99\xd3\x0e\xcb\x6a\x00\x8e\xef\xe3\x0e\x67\xb1\x4b\x7c\x50\x71\x00\xae\x71\x1a\xd4\x2d\xbd\xd7\x01\xfa\xb8\xca\xdd\x2d\x9f\xca\x5d\xfe\x30\x02\x20\xac\xaf\x9c\x23\x34\x85\x81\xc0\xe1\xcf\xa3\xd1\x22\xed\x3d\x04\xdc\xce\x74\x8a\x68\x2a\x01\x0d\x02\x7a\x3a\x01\xba\x8b\xfc\xb7\xd7\xcf\x6a\x1d\x4f\x69\xac\x0e\x88\x61\x56\x08\x52\x3b\x65\x4e\xd5\xce\xbc\x6f\x21\x2f\x32\x01\x55\x9c\xd1\xc8\x75\x81\x6a\x84\x26\x3f\x0a\x13\xa9\x01\xe9\x09\xdc\x65\xc4\xfe\x1b\x36\x65\x48\x44\xf5\xb8\x13\x67\xe1\xe7\x68\x21\x4a\xe3\x5b\x4b\x40\x85\xa5\xd5\xde\x75\xc1\x52\x39\x9b\x09\x9f\xf0\xea\x2c\x47\x5e\xf2\xdc\x89\x78\xc3\x88\x04\x53\x31\x97\x98\x10\x19\x04\xdb\xae\x53\xf7\xa8\xd6\x6f\x84\xc2\x50\x5a\x96\xcb\xf9\x02\x19\x85\x71\xa8\xd0\x65\x3e\xa8\x98\x69\x9e\x32\xe0\x6d\x5d\xb2\x6b\x5e\xe6\xee\xdc\xe0\xc9\x02\x22\x94\x5c\xb1\xb4\x2a\x01\x65\xd9\x0a\x9e\x2e\xc7\xc6\x72\xeb\x34\x65\x51\x92\x41\xe9\xe7\xbf\x85\xd4\xff\xe0\xb5\x85\xd4\xbf\xe5\xb5\x85\xd4\xdf\x42\xea\xaf\x5e\xf7\x26\x3b\x74\x0b\xa9\xff\xb8\x60\x92\xb6\x90\xfa\x9b\x8e\x26\x6c\x21\xf5\xb7\x90\xfa\x1f\xba\xb6\x90\xfa\x1f\xb9\xb6\x90\xfa\x1d\xae\x47\x20\xb9\xb6\x90\xfa\x1d\xae\x2d\xa4\xfe\xfa\x6b\x0b\xa9\xbf\x7a\x6d\x21\xf5\x6f\xbc\xb6\x90\xfa\x9d\xaf\x2d\xa4\xfe\x16\x52\x7f\x8b\x34\x7a\xb7\xb1\xee\x27\xd2\x28\xdb\x42\xea\xd3\xb5\x85\xd4\x7f\x14\x78\x8a\x6c\x0b\xa9\x7f\xab\x6b\x0b\xa9\xbf\x85\xd4\xef\x72\x6d\x21\xf5\x1f\x8b\xbb\x64\x0b\xa9\xbf\x85\xd4\xff\xfd\x28\xba\x5b\x48\xfd\x2d\xa4\xfe\x16\x52\x7f\x0b\xa9\xff\xc1\x59\x6c\x21\xf5\x1f\x83\x09\x68\x6c\x2a\x3b\x21\x80\xde\x06\xac\x88\x92\xd0\x23\x6c\x80\x69\x35\x9b\x89\x12\x24\x17\x3c\x79\x25\x79\xaa\xc6\x65\x6c\x07\x59\x85\x1d\x01\xee\x11\xd5\xeb\xdc\xf0\x73\x02\x23\x00\xa4\xce\x3a\x53\xfc\xf8\xf5\x8b\x35\xc8\x48\x9d\xb3\x0a\xbb\xe6\x48\xc3\x9c\x5f\xab\x6e\xf1\xf1\x1b\x08\xbe\xae\x7e\x8c\xe8\x9e\x64\xda\x50\x86\x3b\x10\x2b\x59\x70\xa5\x84\xb7\xf7\xa4\x05\x3f\xca\x54\x08\xc5\x74\x21\x28\x3a\xcd\x99\x91\x6a\x9e\x09\xc6\xad\xe5\xc9\x62\xe2\x9e\xa4\x3c\xb1\xeb\x6c\x74\xfa\xc4\xd8\x52\xf0\xdc\xe7\xe5\xe7\x5c\xe2\x50\x8c\x27\xa5\x36\x86\xe5\x55\x66\x65\x11\x06\x63\x46\x40\x41\x0d\x1e\x54\x81\x18\x90\x15\x57\xa7\xb0\x8f\xea\xa7\xd1\xb4\x74\x0c\x4d\x07\xd6\xe6\x08\xf0\xc0\xf3\xc2\x2e\x43\x1e\xaf\x60\x33\x59\x1a\xcb\x92\x4c\xc2\x69\x0d\x4f\xc4\xda\x69\x18\x6f\xe4\xcf\x6a\x45\x33\x35\x34\x55\x95\x82\xda\x5a\x58\x83\x59\xb1\xf5\x80\x34\x54\x2a\x0d\xa9\xf9\x66\xc4\xb8\xc7\x4d\x43\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xd3\x47\xd1\x70\x11\x5e\x6c\x9d\x36\x5c\x33\x3a\x94\x38\x78\xe6\x1c\x35\xaa\x39\x6a\x85\x02\xb2\xf4\x56\xb6\x01\x2c\x80\x12\x57\x8e\x07\x44\x22\xdc\xf9\xca\x6f\xe0\xfa\xcf\xce\xf4\xd1\xa1\xf8\x4a\x18\xc3\xe7\xe2\xac\x63\xa0\xe1\x26\x8b\x0c\x62\x0d\xf5\xc2\x00\x2b\x64\x58\x5d\x1b\x3e\xa9\xb3\x33\x9b\x6a\x10\xcb\x71\x4e\x41\xf9\xb9\x2e\xa5\xb5\x02\x16\x15\x10\xf6\x20\x56\xd9\x2e\xc0\xdf\x6d\xe5\x78\xbe\xf2\x83\xd4\x3f\x76\x42\x5d\xa5\x98\x71\x39\x15\x6c\x5a\x4a\x31\x63\x33\x09\x69\x9c\x90\x58\x39\x42\xc0\x25\x8e\x5e\x00\x63\x9c\xbd\xab\x95\xd7\x65\xfd\xbc\x26\xec\x27\x9a\x98\x2d\x2b\x95\xf0\x08\xcb\x16\x2a\x4c\xe5\x8c\xcd\x21\x31\x93\xb4\xc5\x3f\x3f\xfd\xcf\xbf\xb2\xe9\xd2\x1d\x69\xa0\x59\x59\x6d\x79\x16\x5e\x32\x13\x6a\xee\x68\x85\xdb\xb3\x59\x23\x19\x28\x00\xdd\x3c\x70\xe2\xcf\xbe\xbc\x9c\x36\xcf\xd8\x27\xa9\xb8\x7a\x12\xd1\x6f\x9c\xe9\xf9\xba\xfe\x28\xdd\x53\xb6\x3b\x9a\x44\x6b\xd8\x4c\x67\x32\x59\xf6\x66\x34\x8f\xfc\xc5\x16\xfa\x1a\x75\xfd\x35\xdc\x53\x97\x5b\x15\xba\xa8\x32\x74\x3a\xbf\x08\xd5\xc5\x95\x11\xab\x35\x80\x6b\xf7\x05\xb8\x49\x69\x88\x36\x6e\x3a\xe6\xe3\xfa\x47\x6a\xaa\x2d\x21\x47\x5e\x00\x00\x03\x43\xe8\x05\xcf\xb2\x29\x4f\x2e\x2f\xf4\x4b\x3d\x37\xaf\xd5\x71\x59\xea\xb2\x39\x97\x8c\x3b\x69\xb9\xa8\xd4\x25\x76\x70\x08\x10\x09\x7a\xee\x54\xab\xa2\xb2\xbe\x90\x61\xdd\x0b\x63\xbd\xbc\x17\xc2\xde\x0c\xaa\x47\x11\xef\x65\x6d\xeb\x50\xa9\x16\x72\x64\x3c\xbe\x89\x99\xed\xcb\xa7\x7f\xfe\x1a\x59\x97\xe9\x92\x7d\xfd\x14\x72\xb6\xcd\x08\x37\x31\xc8\x36\x77\x50\xe4\x3c\xcb\x9c\xd9\x10\x33\xa5\x23\xf4\x3a\x26\xfc\xec\x3c\x68\xfb\xb3\xdb\xad\x55\xa9\x8b\x8b\x7f\x80\x1e\x25\xad\x11\xd9\x6c\x84\x55\x49\xc1\xac\xd9\x85\x83\x61\x97\xa4\x0f\x94\x86\xdd\x03\x05\xe8\x4a\x67\x55\x2e\x8e\xc4\x95\x1c\xa2\x89\x53\x63\x34\x6f\xea\x67\xd2\x40\x01\xd8\x34\xd3\xc9\x25\x4b\xe9\xcb\x28\xf3\xa4\x8d\x04\xde\x9d\x0a\x5d\x73\x70\x7a\xe4\xde\xdc\xf8\xfe\x8d\xac\x9b\x9c\x17\x45\xa8\x11\x2a\xf9\x75\x83\x18\xb0\x27\x01\xae\xa0\x27\x9e\x4c\x6f\x37\x73\x5f\x27\xf3\x98\xde\xc8\xc9\xcd\xce\x43\x74\xce\x3a\xe9\xef\xa3\xae\x67\xdf\xdd\x31\xd9\x60\x88\x7a\x40\xbf\x1b\x0a\xf8\x37\x56\x95\xac\x54\x45\x86\xc2\xba\xc0\x18\xa8\x00\x38\xf6\x01\x91\xdc\xdd\xe1\x3a\x80\x77\xb3\x5f\xca\x51\x83\x2e\x2a\x78\x95\x73\x6e\x49\x21\xf4\xee\x6b\xce\x0a\x51\x1a\x69\xdc\xb9\xfc\x23\x6c\xa8\xc3\x8c\xcb\x3c\x72\x01\x6e\x86\x08\xb8\xb9\x01\x3e\xb9\xbf\xa4\x3c\xd3\x29\x0d\x08\xa2\x10\xa1\xa3\xd7\xa8\xb5\x4d\xad\x76\xc0\x03\x75\xd3\xa2\xf2\xc7\x9a\x9a\x4d\x49\xe9\x3e\x09\xa2\x12\xef\x7a\x4c\x02\x12\xde\xef\xa1\xca\xc7\x30\xf9\x81\xc4\x00\x08\x46\x5a\xdc\xa6\x24\x6c\x18\x8f\xb8\x51\x22\x95\x9e\xec\xc0\x09\xc3\x28\xb8\xdb\x13\xf4\x53\xb6\xfb\x7c\x77\xa3\x42\x12\x49\x54\xea\x82\xcf\x7b\xf5\xf2\x69\x51\xaa\x3d\x6c\x0c\x34\xe1\xcc\x20\xf8\x3e\xc0\xae\xc1\x5d\x22\xad\x71\x74\x00\x25\x09\xa3\xa3\x9e\xc0\x64\x20\x60\x3d\xf6\x35\x5f\x32\x5e\xea\x4a\xa5\xe4\x5f\x0a\x0e\xbe\x57\xad\x07\x9f\x6a\x25\xbc\xe3\xbc\x8d\x53\x01\x1e\x7d\xa9\xd8\xb3\xc9\xb3\xa7\x8f\xe5\xa4\x82\x37\x6c\x9d\x54\xa7\xe1\xa4\x42\xf9\xb4\xd1\x77\xf5\x88\xf7\x03\xbd\xef\x2b\x72\xb1\xd4\x80\xf6\xd2\xc3\x65\xc3\x47\xd7\xa5\xb4\x22\xea\xf1\xb7\x07\x86\x8b\xb3\x0f\x23\x54\x86\xfd\x75\x9d\x24\x7a\x12\xa9\x1f\x0c\x86\xa9\xa6\x9f\x50\x6e\x91\x80\x82\xed\xb6\xce\xc3\x65\x3e\x20\xc2\x62\x42\xed\xec\xb0\x3d\xbc\x73\x17\x0b\x9a\xf7\x37\xca\x5a\x44\xb4\xe3\xf7\x45\x0f\x8c\xcd\x56\xed\x7c\xc1\xc1\x07\x57\x0c\x48\xc1\xbf\x8b\x05\xbf\x12\x50\xc8\x2d\x33\x5e\x66\x10\x73\x3c\xc7\xb9\xb3\x69\x65\x99\x50\x57\xb2\xd4\x2a\x17\xca\xb2\x2b\x5e\x4a\x40\xc5\x29\x05\x20\x3b\x38\x5b\xf4\x8f\x7b\x3f\x1e\xbc\x81\x84\x86\x7d\x82\xa4\xa0\x59\x56\xc6\xc3\xd7\xc4\x33\x89\x86\xfb\xe8\xf2\xf9\x79\x38\x1a\x82\xcc\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x5b\x96\xf7\x49\x56\x19\x79\xb5\x29\x49\x42\x15\xf6\x47\xb2\xd3\x3a\xb7\xaa\xfd\x6b\x42\xad\x14\xee\x83\x6b\x7d\x4d\x81\xde\x4a\xc0\x64\xd7\x84\xa2\xbd\x38\x06\x4e\xae\x27\xc2\xd2\xc0\xf4\x39\x8f\xb8\xb8\xa2\x42\x00\x6e\xcc\x66\x9d\x50\x4a\xa7\xe2\xee\xa8\x3b\xcd\xf4\x1e\x1a\x02\x63\xe6\x51\x05\x9f\x49\x16\x22\xad\x00\xde\x49\x1a\x04\x47\x75\xe6\x03\xaf\x51\xf8\x14\x74\x09\x3a\x99\x05\x48\x03\x35\x06\xe7\x20\xd2\xdc\xff\xbe\xf4\x00\x08\xfe\x03\xd3\x1a\x11\x8c\x52\x37\xd6\x88\x71\x63\xaa\x1c\xb7\x04\x36\x40\x98\x49\x6b\x42\x8f\x59\xaf\x1d\xbb\x8d\x71\xc7\x82\xaa\x1e\xf4\x3d\x17\x19\x30\x57\x0f\x1a\xef\x9e\x46\xe3\x20\xa1\x8d\xff\x8b\x18\x8e\x12\x26\x20\xda\x16\xf2\x38\x35\x78\x49\x67\x12\x9a\x28\x71\xa2\xf7\xf9\x9a\x5f\xa2\xea\x80\x77\x00\x3c\x0c\x9f\x8a\xcc\xb4\x07\x9a\xd6\x8b\x42\xa8\xa4\x44\xf8\x9e\x5d\x72\xb9\x31\x72\xae\xa0\x7f\xa6\x1b\xed\x8e\x9d\x32\x3b\xdb\x4c\x43\x74\xc1\xed\x2c\xd5\x1a\x59\x58\x39\x2f\xc6\x64\xf5\x5a\x9d\xcb\xe4\x0e\x23\xe9\x3b\x4e\xb9\x55\x2b\xdd\xa8\xc1\x7d\x7d\xbe\xe2\xf1\x31\x91\x57\x63\xc2\xce\x75\x4e\x29\x4e\x2a\xea\xe2\xe5\x9b\xa9\xba\x13\xa3\x14\x8e\x16\x90\x78\x24\xeb\x68\x3c\x74\xbd\xf1\x55\xd0\xf0\x9c\xa0\x92\x53\x18\x17\xe0\x27\xa9\x99\xab\xce\x32\x7d\x0d\x89\xc5\x38\xae\xe7\x6d\x48\x81\x79\xce\xc6\xad\xce\xb4\x93\x26\x68\xe8\x87\x9f\x43\xf7\x8e\x3e\xfe\x14\xcc\xcf\x01\x38\xbe\x93\xa3\xf8\xcf\x93\xb3\x43\xff\x67\x7b\x26\xcd\x26\x0c\x37\xdf\x15\xc3\x61\xdf\x74\xd7\x0c\xfb\x18\x7d\xe4\xeb\xc3\x05\x57\x3e\x6e\x75\xe3\xf3\x96\x26\xb1\x59\x3d\x9d\x05\x2f\x05\xc1\xc5\x39\xc1\x6d\x0a\x9e\xdc\x38\x8b\x80\xcd\xf6\xc1\x1b\x3e\x38\x53\x53\x15\xbe\xbf\x76\x06\x37\x86\x99\xd4\x5c\xf6\xf3\x9f\x7e\xb9\x25\x31\x3f\xf6\x9b\x75\xa4\xfd\xf0\x6f\x1a\x5d\xfa\x6e\xf5\x8b\xf5\x3d\xbc\x6e\xf7\xdb\xa8\x0d\xde\xad\xee\xbf\xa9\x05\xef\x6d\x9f\xe6\x5b\xb7\xdd\xee\xc5\xda\xab\x7d\x8b\xdb\x71\xed\x3f\x9e\x35\xe7\x36\xe4\x09\x20\x6e\xce\x96\x67\x3a\x75\x7b\x13\x53\xe4\xee\x06\x6c\xd0\x59\xda\x77\xf5\x8c\x75\xf0\x67\x75\xf7\x63\x75\xf3\x0b\xb4\x74\x85\x1b\x50\x4f\x09\x91\x4d\xcd\x59\x03\x67\xaa\x2a\x4b\xa1\xa0\x43\x7e\x05\x49\x91\xbe\xf3\x3d\xca\x73\x90\xcb\x84\xe9\x89\xc0\xf4\xec\x20\x1c\x9b\x94\x2c\x97\x73\xc0\xf9\x8c\x70\xad\x67\x15\xe4\x3e\xc2\x29\x81\xb8\x75\x5a\xb9\x79\x3c\x5f\x07\xa6\xa1\x0b\xa1\xa2\xb6\xf8\xa4\x60\x8f\x1d\xff\x35\xe0\x35\x50\x67\x98\xe4\xe9\x1f\x8a\x8c\xdb\x99\x2e\xf3\xb1\xd7\x24\xc7\x0d\x7d\x82\x1d\x42\x16\x8e\xf1\xa6\x18\xa6\xc2\x22\xfe\xa6\x4a\x33\x11\x1d\xfc\xe1\x55\x55\x8a\x68\x55\xac\x52\xa5\x48\xf4\x5c\xc9\x7f\xd7\x84\x80\x23\x30\xf8\x91\xb8\x71\x87\x2e\x53\x55\x96\xdd\x3d\x65\xa1\xa3\xbe\xa0\xaf\x44\xb9\x10\xfc\x8e\xcc\xdb\xca\x7e\xa1\x31\xea\x36\xa5\x86\xe0\x07\x48\x3b\xf6\x0f\x71\x5a\xb4\x4e\xa0\x0c\x0e\xa3\xf1\x3e\xc7\x99\xc3\xd9\xef\x94\x42\xce\xe6\xf2\x4a\x28\x8f\x4e\x7e\x98\xf1\xd0\x6a\xdb\x03\xb2\x12\x42\x7a\x65\x75\xc8\x6f\x60\xdc\x46\x18\xc9\x90\x0e\x45\xa1\xd5\x78\x9c\xe8\x16\x6a\xd4\x9d\xf9\xa6\x68\xb7\xb9\x13\x52\x0c\xb0\x4b\xe4\xa8\x7e\xa5\xdc\xbb\x61\x1b\x20\x9c\x2c\x81\x44\x18\x6f\xb5\x50\x02\xcc\xc7\x1f\x41\xd9\x6b\x4e\x06\xad\x1b\x86\x34\xeb\x80\x16\x5b\x13\x36\x73\x47\xc7\x12\xf5\xa1\x93\x59\xf3\x49\xb2\x81\xcf\x0f\x65\x52\xa0\xa9\xd7\xa6\xe3\x99\x4e\x9d\xc2\x36\x62\x61\x29\xe3\x3e\xe5\x14\x9a\xc1\x3d\x19\x6d\x46\xd4\xe7\xca\x52\x98\x42\x63\x9b\x80\xf8\xb1\xa3\xc8\x55\x26\x6d\x23\x2f\x0f\x1b\xbe\x85\xad\x81\x40\x6e\xff\x16\xa5\x5e\xab\xee\xcf\xa5\x9d\x5c\x7e\x0d\xba\xbe\x50\x0b\xae\x12\x34\xb3\x9e\x5c\x8a\xc2\x3c\x31\x72\x8e\xaa\xfd\x5f\xbf\xfe\x1a\xf4\x7c\x4f\x92\x27\x6f\x8e\x0f\x8e\x5e\x1d\x4f\xf2\xf4\x01\x29\xfd\x05\xb7\x56\x94\xea\x39\xfb\xaf\xbd\x77\x5f\xfc\x36\xde\xff\x76\x6f\xef\xe7\xa7\xe3\xff\xfc\xe5\x8b\xbd\x77\x13\xf8\xc7\x9f\xf6\xbf\xdd\xff\xcd\xff\xf1\xc5\xfe\xfe\xde\xde\xcf\x3f\xbc\xfa\xee\xe2\xec\xf8\x17\xb9\xff\xdb\xcf\xaa\xca\x2f\xf1\xaf\xdf\xf6\x7e\x16\xc7\xbf\xdc\x72\x90\xfd\xfd\x6f\xff\x78\xc7\x89\x76\x2c\x61\xe9\x5b\xb6\xd2\xab\x54\x65\xc0\xf2\x94\xa2\x14\x22\x07\xf1\xd7\x25\xb1\xab\xe9\x50\x6d\x0d\xe5\x0f\x58\xfa\xcb\xc9\x44\xff\x34\x35\x77\x62\xd2\xa0\xe8\xcc\xf4\x35\x24\x63\x4a\xed\x14\xa7\x09\x7b\x0d\xe7\x20\x3b\x15\x57\xa2\x1c\xf9\x51\x5f\xba\x9b\xce\xc2\x3d\xb1\xc7\x6e\xdd\x1d\x1d\xcb\x01\x3a\xae\x89\x9f\x7b\x0f\xe2\x61\x8b\x13\x9a\x3c\xc8\xa7\x09\xfb\x91\x97\x52\x57\x86\x74\x91\x18\x19\x1c\xb3\xcd\xc2\x49\x02\x0e\x0c\x8a\x05\x85\x41\x42\x11\x99\x0f\x07\x05\xda\x1c\x04\x79\x7d\xb8\xfe\x48\x90\xd6\xad\xd4\x95\x7f\x54\xe9\xb3\x62\x57\x40\xc5\xf1\x30\x58\x2b\xff\xfd\x89\x66\xe2\x89\xc2\x30\x7e\x1e\x20\x5b\x9d\x26\x86\xa3\x2c\xe4\xdc\xe7\x5e\xc3\xfb\xa3\xa5\x1b\x7d\x1a\x38\xa4\xc3\x92\x76\xd9\xa6\x5d\x4b\x00\x8a\xf6\xfb\xf5\x60\x8b\x26\xf4\x72\x8c\xde\xec\x8b\x8f\xea\x7d\xb3\x83\x7c\x02\x87\xc8\x38\x29\xa5\x95\x09\xcf\x76\xe0\x70\xf2\x5f\x25\x59\xe5\xf4\xc4\xf8\xdb\x52\x30\x7b\xad\xf1\x29\x3c\x63\x97\x62\x79\xad\xcb\xd4\x9f\xcf\xfe\x89\xf5\x5a\x18\xeb\x1f\xe9\x6c\x41\xd8\xc0\xe8\x91\x28\x73\x51\xb2\xa9\xf0\xce\xf6\xd6\xcd\xcb\x09\x3b\x50\x4b\x8a\x54\xaa\xb8\x1e\x31\x02\x71\x03\x1d\x01\xb5\xa8\x06\x93\xd0\x21\xe6\x9f\xc6\xb1\x52\xf4\x26\x47\xb4\x53\xc0\xc2\x2e\xf0\xa7\xbf\xf7\x44\xeb\x92\x0a\xa2\x60\x77\x94\x58\xce\xa5\xfd\xd7\x9f\x45\x5a\x38\xfd\x46\x2a\x61\xcc\x77\x6e\x29\xfb\xa8\xab\x4d\xee\xe0\xa0\x96\xd0\xd8\x50\x54\x55\x67\x1f\x0b\xb7\xa5\x30\x9c\xec\xc4\xb0\x4e\xeb\x3b\x27\xec\x00\x3e\x80\xf4\x79\xa7\x79\x41\xc1\x9d\x1b\x4c\x5a\xd3\xee\x43\x8f\x77\x1c\x9c\x1e\xf9\x34\x67\xd4\x14\x4c\x13\x59\x1d\x55\xe6\xe6\x4c\x40\xd3\xa3\x64\x5b\xf1\x6b\xc5\xa1\xa5\xee\xce\x45\x59\x89\x9d\x6e\xaa\x12\x62\xf6\x3f\xf9\xcb\xd7\x4f\x41\x5b\x0a\xcf\x1b\xc3\xf3\xba\xa8\x4a\x77\x4f\xa7\xe9\x94\x48\xd3\xce\x21\x7a\x13\xf3\x83\x27\xb8\xb7\x3b\x28\xbe\x05\x65\xc0\xb0\x4c\x81\xe6\x9d\xbc\xb0\x9d\xd2\x66\xba\x27\xcc\x8c\xeb\xe9\x5e\xdc\xbd\xdd\x59\x9f\x5c\x97\xc6\x73\x87\x08\x88\xd5\xa3\xe1\xaa\x18\x5c\x92\xf0\x9c\xc8\x09\x8c\x5d\x31\xe8\x63\xc8\x9c\x05\xc1\x05\x01\x04\x10\x8f\xcb\xa2\x47\x96\x70\x07\x79\x03\x45\x31\xbd\xf5\xbb\xdd\x37\x38\x10\x2b\x6a\x85\x6e\xa5\xd8\x21\x04\x83\x41\xef\x20\x55\xee\x00\x2a\xc7\x46\xec\xb5\x7a\x81\xa9\xf4\x23\xd4\xee\x1a\x40\x25\x78\xd3\xa0\x15\x85\x4f\xfe\x40\xef\x3e\xc6\x29\x77\x11\x0a\x77\x27\x77\x64\x39\xf6\x3c\xfd\x77\xdf\xb4\xc6\x6a\xb0\x5e\xc3\x32\xa6\x13\x52\xd6\x6d\xd2\x48\x7c\xb2\x79\xa9\xab\xc2\x07\x5d\x9b\x3d\xcf\xea\x46\x1f\x18\x2b\xc4\x96\xc0\x4a\x37\x87\x0e\xce\x0f\x60\x60\x51\x7b\xcd\x52\x96\xa0\x79\xec\x4f\x5d\x2c\x98\x42\x0f\x42\x59\xa9\x66\x4b\xf4\x28\x6c\xb9\x93\x89\x39\x4f\x96\x3b\xcd\xe7\xac\x0b\x12\x4b\xa8\xe3\x91\x39\x62\xab\xe3\xf3\xea\xf2\x07\xa8\x92\x00\xfd\x01\xf7\x1a\xa8\x06\x95\xa1\x29\xfa\x23\xdf\xd7\xef\xa1\x67\xab\xec\x61\x99\xff\xe5\xeb\xbf\x8c\xbd\xef\x0d\xa6\xf2\x59\x18\x2a\x04\x79\x07\xd5\x25\x1b\x6b\xe6\x14\x24\x69\x0a\x58\x5f\xd0\xc4\xea\xe3\x3c\x3c\xfd\x43\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x16\x72\x35\x3d\xf0\x7d\xb6\x5f\xbb\x43\xcc\x42\x67\x29\x6c\x14\xea\xe3\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\x79\x25\xf5\xd2\x9b\xb0\xba\xbe\x2e\x36\x61\x81\x93\x27\x8c\x9d\x0b\x81\x7d\x24\xa3\x79\x80\x9c\xf5\xa4\x24\x6f\xab\x9e\x61\xd3\x6f\x34\xc2\x3e\x93\x5b\xa8\xfb\x71\x4c\x81\xb8\x9e\x5e\xfb\x9d\x83\x60\xa5\xc4\xf1\x32\x14\x70\x2b\xad\x7d\x5b\x27\x13\x64\x1e\xd7\x01\x5a\x4a\x44\x72\xb4\x30\x08\x27\x0b\xbc\xfc\x03\xb6\x01\x85\x2c\x4b\x88\x1a\xa2\x6f\xf2\xda\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\xbc\xdf\x7d\x1d\xa3\x34\x40\x5f\xcb\x67\x68\xd4\xea\x6b\xf0\x0a\x7f\x77\x72\x14\xf6\x88\xbb\xeb\xc5\x39\x86\x84\xbe\x9c\x50\x97\x5e\x3b\x97\x29\x9b\x62\x8e\x87\x93\x97\x7b\x4a\x5c\x63\xd6\x38\x39\x4e\x83\x5e\x7d\xe5\xb3\xa9\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\xfd\x52\x45\xe9\xad\xf2\xa9\xa4\xac\xd2\xd7\x6f\x76\xbd\xbb\xfa\x7a\x5c\x5e\x8f\xc7\xe3\x31\x85\x82\x41\x4a\x8f\x1a\x34\x08\xc2\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\x6c\x5e\x3f\x02\x38\x92\xab\x25\xcd\xae\x7f\x6b\xdf\xbb\x23\x79\xf7\x73\xc7\xf5\x41\x6e\x58\x13\x66\xee\x1b\x9f\x5a\x17\xb9\x46\x3b\xd9\xd4\x00\xe8\x7a\x86\x4c\x0a\x89\xf6\x37\x2c\x8c\xf7\x02\x11\xd7\x10\xac\x1f\x5a\xe9\xe2\x7d\xa1\x11\x34\x18\x0a\x59\xa0\xb9\x5b\x3b\x3c\x01\xc9\xa3\x6e\x57\x41\x3e\x5e\x63\xd7\x90\x42\x81\x11\x31\x4f\x04\x36\xe5\x6e\xc8\x30\x9d\xbd\x16\x9f\xec\x4f\xd8\x09\xb1\x16\x18\x84\x4a\x53\x8b\x38\xa6\x15\x13\xc5\x42\xe4\xa2\xe4\x59\xf3\x41\x54\xd0\xfb\xdc\x89\xdb\xd2\x71\x29\x86\x00\x72\x5e\xa0\xb4\x05\xe1\x99\xca\xd2\xb7\x98\x8d\x42\x73\x3b\xaf\xd5\x1b\xad\xed\x2b\x69\x40\x77\x21\x67\x08\x6a\x9a\x3b\xeb\x0e\x34\xff\x5d\x9d\x1d\xdd\x97\x93\x3f\x5b\xfc\x8b\xf9\x36\x71\x43\xc8\x5a\x27\x41\x9c\xd0\xba\x6b\x27\xb8\xb7\x84\xf7\xd3\x68\xb8\x1b\x7c\xb1\xeb\xfa\xbc\xad\x34\x79\xfb\xcc\x5d\xde\x28\x81\x8b\xdb\x06\xb0\xd6\xe7\xee\x4c\xbe\x39\xe9\x05\x2c\x73\xaa\x61\x9f\xf4\x64\x9a\x93\xd5\xe6\x72\x35\x8b\x80\xbb\x2f\x74\xcd\x54\x5a\x8d\xa1\xd9\x53\x65\x7c\xe0\xb2\xf4\x2e\xdf\xc6\x01\x44\x1d\x28\xf1\xd8\xc4\x2e\x82\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xcc\x98\x6a\x51\x37\x7e\xe2\x86\xbd\x3d\x39\x62\x4f\xd9\x1e\x24\xf2\x86\x62\x6e\x84\xaf\x70\xa6\x6c\x2b\xdb\x74\xe6\x87\x68\x9a\x2e\x84\x1d\xa1\x34\xca\x22\xdf\x15\x53\xab\x70\x0c\x13\x06\xe7\x0d\xbd\x0c\x37\xcd\xe3\x5d\xf9\xb1\x5b\xba\x7e\xc8\x90\x19\x40\x06\xbd\xed\x20\x83\x62\xc5\x7a\x88\x4e\x94\x9b\x5e\xbd\xdf\xbb\x84\x6a\x26\xb9\x0d\xc0\x54\xe7\xc7\x30\x20\xe2\x46\xbc\xb7\xa4\xc6\xdf\xb1\xcd\xf9\x2a\x3e\x10\x81\x24\x05\x28\x81\x92\xab\x54\xe7\x2b\x4f\x73\xab\x09\xc6\x5b\xb4\x9a\x5b\xb6\xbb\xe9\xea\x55\xed\xd9\xaf\x58\x12\x6c\xfc\x01\xaa\x64\x5f\x82\xaf\x40\x9a\xc0\x09\xe8\x3c\x80\xfc\xf1\x15\xb3\xb5\x37\x88\x42\xef\xa2\xa1\x52\x67\x1d\xeb\xee\x1a\x6f\xfd\x46\x67\x54\xef\xe0\x5f\xdb\x0d\x7c\x6f\xdf\xda\x76\x0c\x13\xb4\xc5\xcb\xb2\x68\xbd\x35\xb8\x73\xee\xeb\x5b\x57\x9d\x4e\x69\xd6\x7e\x6b\x48\x87\x6d\xbc\x35\x9c\xbb\xf7\xf1\xad\x9b\xd9\xcf\x03\x1c\x26\x34\x20\xd3\x94\x83\x4d\x4d\x07\xda\x78\x28\x75\x86\x24\x38\xa1\x1e\x96\x1c\xed\x53\x31\x8f\x89\x4e\x9f\x5b\x74\xeb\x84\x67\x0b\x6c\xf9\xde\x6d\x9d\x59\x7b\xad\xdb\x43\x46\xc9\x18\xdc\xcd\x16\x3e\x8b\x52\x0a\x39\x82\x39\xe9\x3a\x20\xd3\x0a\xbe\x90\x9b\x8e\x7e\xe9\xb3\x21\xdc\xf9\x5b\x67\x38\xc6\xbf\xb6\x9a\xba\xd0\x7a\xd0\x78\x0e\x13\x14\x98\xaf\x58\x70\xbb\x18\xb1\x52\x64\x88\x03\x4b\xfb\xec\x12\x4d\xa9\xdd\x46\xda\xa4\xe7\x58\xff\x68\x50\x58\xa0\x0b\x35\x8c\x0c\x2e\x1f\xaf\x86\xcc\x50\x7e\x49\xc3\x76\x5e\x7a\x02\xec\x3c\x64\x01\xbd\x83\xef\x13\xd6\x0e\xbd\x58\x97\x52\xa5\x04\x90\xda\x20\x4d\x48\xd1\x45\xdd\xd0\x7b\x98\xfc\x5e\xe7\xa5\x00\x67\x6f\x20\x0d\x1b\x77\x66\x06\x0a\x85\xf9\x80\xe8\xf8\x06\x25\xd3\xfb\x54\xfc\x43\xda\xc3\xbc\x55\xb0\xd2\x0a\x6a\x27\x94\x5e\x73\x9f\x7f\x97\x6e\xcd\x12\xfb\x88\xde\x95\x22\x97\x9e\xe2\xf7\x20\xc0\x52\xcd\xb1\x66\x26\x52\xe1\x6b\xe8\x4a\xb2\x0b\xa9\x13\x74\x4b\xf5\x1e\xc1\xea\x50\xbe\xeb\xca\xe9\x84\xe9\x55\x39\x2f\x97\xec\xbb\x93\x23\xd4\xc0\x1b\x86\x80\xd2\xfe\xd1\x81\x53\x52\x42\x27\xe4\x6a\x79\x0f\x14\xe7\x6e\x08\x31\x9d\xf1\x61\xfa\x22\xef\xf6\x32\x13\xb1\x84\xab\x27\x4f\x9d\x53\x21\xd8\x42\x67\x29\xe3\x81\xc1\x94\x2f\x02\x4b\xfd\x73\x30\x80\x1e\x55\x7f\x4e\x9c\xf1\x45\xc1\xe9\x4a\xd5\x95\x22\xfe\xfe\xbd\xb6\x4a\xe0\xf7\xf4\x3e\x95\x42\x7b\xcf\x54\xc6\x2b\x95\x2c\x7e\x2f\x2c\xb3\x86\xfa\x21\xd4\xc1\xd9\xa5\x28\x95\xc8\x58\xc1\x4b\x9e\x0b\x1b\x9a\x1d\x1a\xd1\x05\xfa\xa7\x27\x72\x50\x3f\xdc\xa0\x1e\x98\x3f\xdd\x9b\x16\xf6\x45\x0b\xea\x83\xc1\xb2\xa6\x93\xdb\x0c\x4f\x47\x37\xa5\x25\x35\xf8\xec\x38\x78\x6f\x60\x8c\x5e\x6d\x08\x9b\x20\x58\x88\xe0\x7f\x2f\xde\xad\x59\xe6\x3b\x80\x75\xf3\x13\x0e\x58\xe3\x11\xf8\x4c\x86\xbb\xba\xcb\xbc\xca\xb4\x8a\x02\xb6\x6b\x56\x5c\x51\xcd\x96\x09\x9f\xd9\x57\xde\x59\xee\x42\x1d\xe0\x83\xf2\x70\xcd\x73\xc3\x0f\x4b\x01\x15\xa7\x3c\x3b\x2f\x44\xc7\x26\xfe\xcd\x16\xfe\xaf\xce\x0f\x9a\x83\xc2\xa1\x04\xc9\xd6\x6e\x4d\xdc\xf7\x51\xc9\xc0\xb5\x98\x2e\xb4\xbe\x64\x7b\x6b\xca\x1e\xa3\x2a\x17\x23\xe7\xe6\x09\xb1\xf7\xd8\xcd\x7b\x9f\x49\x05\x50\xb6\xab\x10\xc0\xfe\x21\x49\x98\x05\xac\x15\xe5\xac\xd1\x31\xbc\x3a\x4d\x90\x51\x98\x51\xb3\x09\x03\x67\x75\x31\xee\x9e\xef\xe5\xaf\x8f\x2c\xc8\x4d\xe5\xaf\x6b\xa9\x86\x0e\x8d\x8d\x90\x84\xcc\x6d\xa7\xbe\x0f\x40\x87\xef\xeb\xd1\x62\xe4\x35\x39\x6b\x80\xc2\xd7\x86\x52\x08\x56\xee\x42\x73\x2a\xfa\xe9\x6e\xac\xd5\x37\xa1\xd3\x78\x56\x2c\x38\xa5\x86\x61\x39\xb0\xcf\xa0\x98\x0a\xb6\xd0\x4a\x97\x54\xe6\x50\x17\xf2\x80\x98\xc1\xba\x1b\x58\x01\x92\xb7\xd1\x54\x0f\x6b\x0f\x92\xef\x97\x32\xcb\xf8\x1c\x9a\xdb\xb4\xaa\x71\x40\xb8\xea\x0a\xa3\x9a\xf1\xcd\xbe\x64\xd1\x37\x6e\x00\xdc\x68\x83\x52\xcc\x07\x33\xa9\x6c\x03\xb2\x40\x0e\xdc\xbc\x1d\x59\xce\x7c\x32\xb3\x9f\x02\xb8\x29\x42\xd1\xa6\x71\xbc\x83\xf9\x1b\xf2\x4a\x34\x08\x8c\x92\x77\xcf\xa3\xd6\x58\x4c\xb2\xc2\xf3\x02\x7e\xcf\x59\x2e\xdf\xbb\xa7\xc4\xbf\x8a\xab\x0d\x54\x0a\x51\xe2\xf5\x5f\xef\x3b\x63\xac\xb6\xdc\x46\x6e\x15\xe3\x3b\xa3\xa6\x0a\x0a\xbe\x38\xc5\x72\x01\x7c\x81\x38\xd2\x42\xfd\x11\xfa\xf0\x77\x77\x54\xb3\x10\x2a\x1d\x68\xab\x43\xc8\x94\x86\x73\x0b\xed\x8f\xef\x3e\x21\x54\x77\xcb\x10\x61\xd4\xd5\x33\xfa\xb3\x1f\xed\x9f\x53\x86\x19\x51\x5e\xc9\x44\x1c\x24\x89\xae\x54\xaf\x2c\xd4\x23\xe1\x5e\x81\x5b\x91\x9e\x37\xc6\x44\x8f\x7b\x0a\xdf\x62\x25\x3a\xcf\x24\x47\x44\xa2\xe6\x9d\x58\x64\x57\x8f\x03\x1e\xfb\xd6\x0c\x89\x65\x8c\x15\xbc\x5b\x46\x69\x4f\x0a\xf5\x4d\x95\x5f\x7d\xe3\x75\x27\x5c\x8b\x82\xe4\xac\x5f\x49\x83\xbf\x5d\x0d\x82\xe5\xe6\xb2\xc6\x69\x12\x50\x86\x14\x36\x53\xf4\x39\xbd\xe8\x98\xe3\x53\x3b\x61\x37\x75\xa0\xae\x75\x72\xcf\xbd\xfc\x81\x79\xf1\xbf\x8f\x4e\xfb\x65\x8e\x87\x16\x35\x58\xdf\xb2\xa0\xa1\x83\xaa\x1e\x97\xe5\xc7\xe5\x89\xee\xc9\x23\x56\x72\x42\xdf\xa7\xce\x6b\x99\xe0\xe8\x53\x61\x7b\x51\xa6\xfe\xfe\xc4\xc9\xf4\x3a\x5a\x8e\xa2\x9e\x1a\xa5\xe5\x82\x2b\x13\x95\xa0\x0a\x18\xda\x67\xc5\x86\xf9\xe0\x41\x48\xab\x4d\xde\x83\x3d\xef\x74\x6d\xde\x61\x6c\x59\x25\x96\x55\xd6\xb8\xcf\xf1\xe1\x5e\x60\xde\xe2\xf1\xa5\x98\x4b\x63\xcb\xa5\x6f\xe1\x36\x8b\x26\x41\x5e\xa1\x70\xcb\xa5\x58\xb2\xef\x7f\x38\xfe\xc7\x3f\x5f\xbe\x3e\x3c\x78\xf9\xcf\x57\x07\x87\xdf\x9f\x9c\x1e\xbf\x7b\x77\xfe\x8f\xf3\x8b\xe3\x57\xef\xde\x1d\x22\xc2\x08\x95\xe3\x9e\x0b\xfb\xee\x1d\x71\xaa\x79\xf7\xee\x22\x29\x64\xf1\xee\xdd\x99\xf7\x81\x60\x73\x86\xff\x7d\x74\x0a\xf2\x13\xab\xc2\x42\xda\x13\x9c\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xd0\xb3\xeb\x71\xb7\x16\x4e\xa9\xd7\x66\x77\x03\xd6\x5d\x95\xbc\x8b\x37\x78\xe9\xd8\x54\xd8\x6b\x41\x65\x8c\x6b\xf1\xba\x78\x54\x18\x1d\x41\x70\xad\xeb\xdc\x82\xca\x99\x66\x57\x52\x5c\x23\xe6\x04\x36\xc9\xab\xdb\x07\x41\x59\x33\x96\xb6\xae\xa2\x82\x81\x92\x54\xe8\x34\xb4\x4a\x6a\xf9\xa5\x57\x7c\xd2\x8d\x32\x1a\xc4\x7d\x13\x29\x3b\x3b\x39\x62\xcf\x26\xa8\xe4\x9c\x1c\x21\x0c\xe5\x5a\x94\x2a\x6f\xa9\xba\x03\x15\x4f\xdf\x35\x55\x07\x35\x03\x74\x11\x46\x1d\x38\xa0\x9a\xa6\x3a\xe7\x77\x6d\x8a\xf6\x91\xfa\x15\x6c\x59\xf9\x6b\xc5\x33\xd4\x01\xce\x74\xba\x2a\x99\x76\xbe\xf1\x1f\xfd\x6d\xf2\x4d\x98\xc7\xdf\x26\xdf\x40\x33\x4c\x4f\xb6\xbf\x4d\xcc\x55\x32\xf9\x86\x0a\xa4\x19\xdd\xb4\x36\x47\x78\xa5\xda\x89\xf4\x59\xfc\x0d\x3c\x9b\x83\xbe\xfb\x59\xca\x5d\x06\xec\x2a\x3a\x70\x2f\x51\xd4\x02\xa1\xf6\x3a\x29\x05\xc7\x54\x73\x96\x8a\x4c\xd4\x38\x30\xf7\xa0\x99\xe5\xcd\xdd\x3d\x7d\xac\xad\xd1\xfb\x34\xf6\x4d\x05\x7d\xe9\x77\xdf\x22\x35\x36\x18\xbe\xaa\x3b\xce\x77\xd8\x00\x3d\x91\x1a\xee\x14\x36\xb2\x3a\x13\xb8\x3e\x7d\x76\xca\xda\xba\xba\x5d\x13\x8f\xde\x85\x10\x9b\xa8\x46\xbf\xf0\x40\xa6\x8e\x23\x2e\xc2\xfc\xc1\xd2\xc0\xd6\x7f\x18\x5c\xc5\x6f\xa0\xda\x6d\xc9\xdc\xa9\x65\xd1\x93\x11\x57\x88\xda\x12\x9a\x14\x7e\x73\x29\x96\x23\x04\xf4\x40\x25\xe4\x6f\x11\x22\x73\x28\x89\x46\xe0\x35\x5d\xb2\x6f\xfc\xbf\xfe\x76\x57\x6b\xad\x87\x1f\xb5\x8f\x17\x15\x5f\xaa\x77\xe4\xeb\x18\xab\x60\x9a\x08\x1f\x48\x59\x2a\x90\xb1\x1a\xc9\x35\x61\xc7\x50\xf7\x8a\x1a\x29\xa1\xd2\x66\x59\xe3\x66\xe3\x3b\x4c\x36\xd0\x21\xc0\xff\x12\x55\xc7\x9c\xea\x73\xaa\xcc\x04\x98\x9d\x99\x28\xeb\x4f\x40\xc0\x9c\xea\xe3\xf7\x22\xa9\xec\xe7\xac\x56\xc7\xeb\x52\xf4\xef\xf9\xf5\x83\x08\x10\x44\x48\x1b\xa7\x85\x87\xca\x84\x7a\x77\x46\xc9\x69\x1f\xa6\xed\xa5\x58\x9a\x00\xb2\x76\x89\xa3\x53\x55\x73\xe0\x5f\x7f\x90\x1d\xbf\x97\xc6\x9a\xff\xe9\x1b\x8e\xe5\xd3\xba\xd5\x1b\xc7\x2c\xb1\x7a\xf4\x08\x60\xcf\xfd\x09\x8f\xf9\xdc\x04\xf7\x2f\xd0\x9b\xea\xaf\x3d\x25\x22\x08\x3d\xee\xde\x69\xd7\x50\x7a\x92\x56\x50\xa8\x16\x63\xb1\xd5\x89\x35\xf8\x63\xe4\x4f\xa4\x21\xd0\xe5\xd8\x29\x79\xcd\x63\x86\x3e\xa2\x9b\x24\xa0\x8a\xc8\x2b\x9e\x09\x45\x28\xb6\x59\x9a\xf0\x12\x43\xf4\x04\x28\x64\x08\x08\x9b\x90\x34\xdc\x19\x47\x92\xac\x5e\x65\x43\xa1\x3c\x5e\x5a\x99\x54\x19\x2f\x99\xdb\x8f\x73\x5d\xde\x11\x77\x08\xaf\x7e\x8d\xef\x02\x8b\xf6\xe8\x07\xdd\x94\xef\xed\x11\xdb\x40\x87\xa4\xbd\x38\x93\x09\xea\x6b\x9a\x1b\x65\xaf\x09\xa4\xad\x67\x5e\x36\x05\x41\x11\x43\xe5\xd9\x86\x73\x5c\xce\xc1\xff\xbd\x1f\x1d\x1e\x61\x67\x4e\xd8\xdf\x43\xb5\xf8\x88\xd5\x3e\x63\xa8\x49\xa5\x67\xd2\xb6\xa1\xe5\xaa\x37\xf5\x4c\x97\xd0\xc5\x70\x2f\xd5\xf0\x1b\x71\x25\x13\xbb\x3f\x61\xff\x9f\xd3\x14\xc1\x89\xec\xd5\x49\xda\x66\xa1\x0e\xb7\x06\xec\x7b\xca\xf6\xe0\x67\xb1\x2a\xb9\xef\x03\x45\x84\x04\xfa\xc0\xb2\x61\x7a\x44\xb8\xd7\x44\xb7\x1b\x62\x14\x35\xc5\x16\x6b\x84\x93\x5f\x07\x09\x19\x64\xa2\x34\xb4\x4b\x1b\x9e\xdb\x10\x67\xf1\x22\x34\x30\xce\x7f\x83\x8f\x9e\x95\x62\x0e\xfb\x0f\x77\xcf\x67\xdc\x7d\x56\x17\x3a\xd3\xf3\xe5\x79\x51\x0a\x9e\x1e\x6a\x65\x6c\x09\xa2\xa1\x0f\xbe\xdb\x4d\x63\x46\x8d\xb3\x16\xfa\x9a\x71\x2a\x67\xd7\x33\x44\xc8\xd3\xd5\x7c\x81\xad\x02\xe0\x87\xbe\xc9\xac\x9f\x22\x19\x9d\x66\xc2\xce\x43\x2b\x00\x60\xf0\xd0\x59\x00\x46\x01\x87\xc7\x35\x5f\xd2\x66\xe2\x53\x99\x0a\x13\xe5\x28\xfb\xc9\x60\xe8\xe7\xc6\xf7\x07\xa9\x7c\x70\x7a\x74\xd7\xfe\x0b\x1b\x54\x68\x6f\x78\x95\xa0\x19\x21\xd5\x6b\xfa\x06\x8d\x14\xe8\xc6\x73\x4d\x9a\x2a\x62\xb9\x7a\xca\x7c\x46\xdd\xb4\x0f\xf8\x52\xce\xdf\x9f\x5f\x8a\xeb\x0e\xbf\xf4\x2f\xfa\x83\xb8\x7b\x2a\xd8\x18\xec\xd1\xb7\xca\x70\x2b\xcd\x0c\x1a\xb5\x7c\x46\x7d\x1c\x8a\x0e\xba\xf5\x93\xc0\xab\x59\xbb\x13\x8f\xe6\x8b\xc2\x03\xde\x62\x83\x59\x28\xff\xaf\xb6\x83\xf0\x00\xc4\x22\x88\xd0\x8a\xc2\xed\xa0\x84\xda\x33\x59\x5d\xc7\xa1\x31\x52\x51\xe5\x53\x51\x86\xbd\x8f\xce\x00\x59\xb6\xa0\x69\x5b\x7b\xbf\xbb\x60\xec\x9c\x09\xd7\x37\xad\x0c\xc8\x73\xfc\xde\x69\x1e\xa6\x5b\xa2\x12\x5e\xcd\xee\x6a\xad\x41\x31\x3c\xe6\x13\x38\x5b\xcb\xd0\xe8\x72\x02\x66\x6f\xfc\x49\x57\x39\x57\x5f\xfd\xfa\x33\xb2\x7e\x3d\x1a\xd9\x9a\x44\xe9\x1b\x5f\xbf\xd5\x2a\x25\x2e\xf8\x23\xa7\x90\x19\xa1\x02\x8f\x0e\x6c\xae\xea\x83\x9d\xda\xe6\x67\x41\x9b\x73\x46\x91\xbb\x09\x7f\xd7\xb7\x11\x52\x8f\x1e\x8f\x6c\x80\x3e\x8f\x0c\x64\xd9\x65\x07\x09\x18\xff\xde\x13\xab\xf3\x20\xfd\x3b\x3e\xb2\xee\x06\x75\x7d\x35\x18\xea\xb2\x36\xad\x91\xb3\x1a\xa6\x75\x2d\xec\x6a\xc3\xba\xd7\xb3\x07\x68\x83\xc6\x7a\xda\xb8\xf5\xd5\x20\x84\xbe\x83\xb5\xcb\x21\xc0\xa4\x67\x7e\x77\xac\xb5\x79\x4f\xd4\x88\x9d\x6a\xeb\xfe\x13\x99\xbf\x47\x5a\x98\x53\x6d\xe1\x93\x7b\x41\x4a\x7c\x85\x01\x09\xe9\xdb\x08\x00\xde\x1b\xc8\x4d\x0a\xd1\xba\x13\xcf\x13\x6c\x8d\x61\x71\xa2\x98\x2e\x3d\xc5\x82\x75\x61\x68\x88\x38\xac\x40\x18\x5b\x37\x1a\x27\x6e\x9c\x98\xce\x1f\x18\x8e\x86\x82\xec\x2f\xfc\x06\xc0\x53\x8b\x0c\x0a\x04\xd2\xaa\x44\x0c\x5b\xa7\x6b\x5a\x31\x97\x09\xcb\x45\x39\x87\xb6\xd1\xc9\x62\x88\xe5\xeb\x73\xae\xe0\xd5\xf3\x74\x89\x27\xd3\x83\x97\xe0\xc8\x06\x15\x6b\x40\x15\x00\xc7\xc3\x63\x2d\xe7\x60\x49\xfd\x9f\xe0\x83\xfe\xbf\xac\xe0\xb2\x04\xcc\x5b\x8a\x1d\xc7\xdf\x51\xf4\x25\x1e\xc6\x8d\xb0\xe2\x5b\xe2\x8a\x09\xac\x64\x72\xa3\xb7\x15\x8f\x11\xbb\x5e\x68\x83\x87\x61\x70\x7f\xec\x5c\x8a\xe5\xce\x68\x85\xf5\x76\x4e\xd4\x4e\x1d\x18\x6e\x30\x5b\x38\x84\x21\x83\x70\x07\xbe\xdb\xf9\x74\xba\x4a\xaf\xc3\x76\x88\x8e\x01\xed\x09\x75\xe4\x2b\xb2\x79\x7a\x6b\xfe\xbb\xaf\x70\xa0\xc8\x3e\xc7\x98\xe0\xbc\x14\x58\x8c\x09\xa6\x34\x28\xea\xd4\xdd\xa5\x52\xe2\x4a\xb8\xc5\x4a\xa5\x21\x3c\x40\x9f\x62\xf0\xaf\x15\x93\xe8\xff\x39\xd2\xa7\xda\x7a\xab\xfd\x5f\xde\xed\x85\xfc\xf7\x5e\xe6\x55\x8e\xb8\x59\xd6\x59\x0a\xa9\x9c\x79\x20\x60\x9f\xd9\xd0\xb4\x17\x9a\x66\x2b\xf1\xb1\xe5\xe5\x1c\x32\x1c\xc9\x5e\xf0\x6c\x36\xcf\xf4\x94\x67\x2c\x97\xca\x3d\x86\x82\x97\x8d\xcf\xc2\x4c\xe8\xcf\x0f\x3c\x08\xf6\x82\x9c\xcb\x69\x26\xc8\x20\x69\x61\x6c\x47\x3f\x6e\xdd\x08\x9b\x34\x13\xc6\x60\xbc\xf1\x95\x54\x47\xde\x9b\xf1\x42\x97\x4c\xbc\xe7\x79\x91\x09\x2c\xd1\x63\x5f\x8d\xff\xad\x95\x60\x14\xa0\x1f\x31\xbf\x3c\x75\xdf\xb2\x67\xb8\x91\xea\xc6\x02\x21\xfb\xa2\x61\x13\x06\x4f\x8a\x61\x5f\x3e\xf9\xf2\xc9\xb3\xe7\xee\x0c\x41\x37\x3d\x37\x04\x41\xb4\x4a\x8d\x67\x13\xf6\x1b\x73\x33\x78\x46\xff\xfd\x92\xfe\xfb\x15\xfb\x8d\xfd\xc6\xd8\x19\x3b\x63\xf1\x7f\xdd\x7f\xd8\x6f\x6c\xec\x88\x10\x4d\xf5\x99\x7b\x9b\x44\xe7\x44\x41\xf0\x41\x87\x82\xdb\xd0\x37\xd0\x6a\x1a\x1a\xaa\x9d\x12\x9d\x0b\x98\xea\x97\xff\xd3\xdf\x03\xa1\x62\x8b\xad\x1d\x61\x52\x7b\x30\xa5\x7d\x76\x0d\x4e\xb5\x9c\x5f\xa2\x41\x79\x90\xd8\x8a\x67\xee\xe1\x7b\x5f\x8d\x9f\xed\x33\xad\x9a\xb7\x5f\x49\xed\x94\x77\x3f\xc3\xbd\x67\xfb\x93\x95\x29\x7f\xb9\x66\xca\xad\x2e\x87\x54\xee\xe8\x06\xbd\x99\xdf\x3d\xab\x1f\xa8\xe5\x35\x5f\x06\x86\xf7\x06\xf5\x5c\x5e\x05\xb4\xff\x08\x84\x04\xa2\x8d\xc0\xbf\xd2\xe3\x4a\xe1\xa0\x4b\x26\xed\x84\x9d\xd8\xdd\x5d\xdf\x53\xd3\xe9\xfa\xbe\x2d\xc1\x51\x8c\x97\x09\x84\x07\xde\x78\xda\xca\x46\xee\x80\xce\x36\xa8\x5b\xf7\x4e\x7d\x05\xf0\xca\xc3\x2e\xe9\x2d\xe2\x76\xea\x1d\xd7\xa8\x66\x5f\xdd\xf5\xed\x8d\x1b\x12\xa7\x3e\xb8\xbb\x5b\xa8\xd7\x5e\x0c\x5d\x8a\x65\x6b\xe7\xd7\xef\x34\x82\x1c\x1e\xef\xb5\x63\xe8\xb6\x43\x57\xbd\x61\xef\x76\x9a\xfb\xf2\xdd\x0e\x38\xef\xc3\xf9\x49\x7d\x7c\x78\x96\x54\xd4\x00\x4e\xcf\x98\x67\xe3\x08\xa1\xeb\x40\xa5\x75\xca\x44\xc7\xf9\x03\x84\x3d\xe8\x8c\x73\x88\x23\x94\xab\x6f\x12\xa5\x55\x34\xb2\xf0\xdc\x2e\xac\xf7\xf1\x84\x1d\x20\x03\x1b\x08\x7e\xdc\x66\x5e\x37\xd2\xae\x6e\x07\x7b\xad\xd5\x6e\x0d\xbc\xcb\x72\x8d\x10\x69\xca\x1f\x8f\xe4\xab\xd2\xcc\x82\xaa\x12\x96\xf5\x64\xb6\x26\x0f\xa6\x76\x10\x23\xf8\xa4\x63\x12\xa8\x9b\x88\xf9\x27\x42\xf5\x7f\xb6\x06\x89\x91\xb6\x8b\x69\x92\xeb\x29\x31\x52\xfd\x4c\x6d\xf1\xb9\x3f\xb5\xe5\x47\x50\xbe\x1b\xe7\x26\xb4\xcc\xec\x72\x58\x7c\x39\x6a\xcd\x9e\x3e\xff\x4b\x97\x33\xe4\xcb\xe7\x77\x3b\x1c\xe8\xbf\x17\x8d\x65\x5e\xbb\xba\x7f\xd9\xab\x67\xb9\x0f\x01\xcc\x35\x9b\x00\x8a\x1d\xea\x60\xd6\x24\x1c\x68\x46\xda\x8a\x63\x7d\x84\x12\xd7\x94\xb4\x76\xf3\x4b\x45\x35\x6e\x5e\xb8\x8f\xdc\xf9\xc3\x2b\x23\xa0\x68\xa5\x82\x7a\x66\x47\x48\x1f\x44\xfb\x6a\xef\x2b\x36\x66\x4f\xf7\x1d\x37\x28\x64\x2b\x20\x66\x7c\x94\xb9\xa3\x81\x72\x30\xed\xc2\x29\x4f\x8e\x32\x66\x14\x5a\x69\xb5\x0e\x21\x58\xd2\xd0\x2b\x51\x61\x55\xcd\xba\x6e\x89\x50\x36\xe3\x76\x66\x4d\xa2\x13\x75\xa6\xd3\xa6\xcf\x3f\x14\xc2\xcc\xb9\x15\x9d\x40\x0f\x36\x2b\xef\x23\x4f\xfc\x00\xe1\xdf\x30\x96\xd7\xf0\x9c\x91\xa2\x67\x08\x49\x81\x1d\x8d\x27\xd0\xae\x9a\xce\x5a\x4a\x6d\x44\x27\x0f\xf1\x8e\x34\xc1\xcf\x27\xa1\x52\x2c\x89\x9a\x04\x96\x28\x2e\x64\x2a\x4a\xe1\x1b\x22\xc7\x89\xb0\x21\x82\xc2\x7e\xaa\xef\xc4\x04\x58\xc8\x14\xc2\x81\xfe\x86\x85\x57\x3b\xd3\x2a\xb9\x14\xd6\x5b\x48\x25\xe4\xee\x15\x95\x65\x53\x9e\x71\xe5\x6c\xed\x15\x8f\xb9\xd5\x38\x18\xfe\x12\x9e\x82\xd5\xe4\x21\x41\x13\x87\x8e\xe2\xfb\x52\x19\xeb\x46\xc3\xc0\x7f\x3d\xc1\x83\xcc\xe8\x11\xbb\xae\x07\x58\xd5\x74\x61\x28\xfa\x37\x1a\x7d\x0a\x68\xe7\xfd\xff\x1e\xeb\x83\x76\xd8\x84\x89\xc9\x1c\x84\x6c\x6b\x25\x76\x9a\xd5\x05\x3e\x61\x75\x67\x84\x2f\xe3\x16\x84\xaa\x3d\x48\xc3\x26\x1c\xea\x68\xb2\x2a\x85\x22\xa8\xf6\xc0\xe1\x8e\xe6\x13\xdc\x16\xf4\xa3\x83\xa8\xfc\xf0\xe8\x27\x76\x9d\x96\xf5\xb9\xf3\x21\x56\x74\xca\xfe\x46\xde\xea\x31\x53\x2b\x42\x14\x18\x4c\x05\xcf\x7c\xea\x24\xf4\xc9\x09\x20\xa1\x6a\x77\xb7\xd6\x46\x81\xc3\x51\xe2\xd4\xe7\xa5\xd3\xa6\x1b\xe7\x15\xdb\xf3\xb5\x0e\xcc\x8a\x2c\xc3\x3d\x58\x1f\xdb\x4e\xfc\xc6\x6d\xe1\x25\x8c\xd0\xd4\x9c\xd7\xfe\xb0\xd9\x4b\x1e\x93\xf8\xc0\x38\x5b\x06\x78\x9f\x11\x9b\x56\xd6\xa9\xd9\x4e\x64\xde\x4a\xd1\x46\x63\x62\x21\xb2\x82\x95\x22\xad\x12\x2a\xfa\x03\x19\x7d\x10\x6b\x05\xd8\x96\xd1\x6f\xfa\x9d\x06\x41\x77\xb0\x4f\x88\x6a\x1a\x11\x72\x06\x5b\x1a\x4c\x1f\x39\x63\xe2\x4a\x94\x4b\x56\x68\x63\x60\x77\xc1\xa6\xc1\xcc\x77\x70\xb2\x04\x24\x42\x38\xc1\x60\x56\xfe\xd0\xd8\xa1\x53\x63\x07\xb4\x2a\xdd\x90\x30\x9f\xc7\x88\xfc\xea\xc9\x33\x67\x44\x7e\x48\x01\x38\x83\xff\xd5\x56\xa1\xff\xef\xc9\x6c\x8d\x9e\x53\xcf\xa5\xc1\x39\x77\x31\x1c\xbf\x04\xfb\xee\xab\xfd\xc8\x7e\xfc\xca\x99\xba\x7b\x6e\xae\x5f\xee\xbb\x59\x47\x96\xe1\x97\x91\x65\x18\x7e\x49\x33\x12\xa6\x61\x1b\x9e\x28\x2a\x73\x80\x1e\x61\xa4\x1d\x52\xca\xbc\x9b\x91\xb1\xa4\x17\xc8\xdc\x8b\x68\x64\xbb\xa6\x66\xba\x6b\xd1\x44\x95\x96\xfd\xc9\xa9\xa6\x7f\x8a\xee\xbf\xd1\xa6\xeb\x6e\xaa\xf5\x6d\x3d\x9f\x49\x63\xa1\xff\xbc\xd3\xfc\xef\xde\x1b\xb9\x7b\x2c\xbd\x6f\x24\x7d\xf5\x2d\x90\x20\x39\x2f\xee\x30\x0e\x82\xb1\xf7\x6a\x54\xf6\x92\xa2\xb0\x34\x14\x45\x19\xd1\x91\x90\x53\x34\x7c\xba\x8c\x8b\x67\xa6\x22\xd3\x08\x6d\x4f\x79\x82\x77\xa8\xcb\x0b\xbd\x81\x8c\xd5\x25\x9f\x8b\x27\xf4\xd8\x87\xd2\x13\xec\x47\x44\xbf\x6f\x84\x94\x10\xbb\x80\x70\xf1\x7d\xfd\x92\x4f\x36\x00\x29\xc0\x13\x48\xfd\x07\x42\x36\xc0\xa7\xa2\xa2\x82\x07\x92\xb7\xd2\x01\x29\xa7\x4f\x94\x94\x5f\x9b\xe3\x8c\x1b\x2b\x93\xbf\x67\x3a\xb9\x3c\xb7\xba\x1c\x40\xb5\x58\x37\x6a\x63\x4d\x15\x3b\xf8\xe9\x9c\x1d\x49\x73\x59\xb7\x58\x42\x18\xf3\x66\xb6\x3d\x0f\x30\x7e\x54\x78\xc9\x72\x9e\x2c\x50\x23\x25\xbf\x87\x6f\xe5\x30\xdc\x5e\xf9\x03\xbf\x36\x02\xa7\x3f\x75\xd3\x77\x5f\x8b\xee\x22\x78\x63\xa0\x4b\xf8\x3a\x27\x47\x1b\xc8\x72\x99\x99\xae\xbd\xe7\xd8\x9a\x86\x20\x1e\x59\x16\x0b\x08\x33\x41\x4d\x61\x01\xce\xb0\xd9\xe4\x03\x78\x68\xa9\x2b\x76\xcd\x31\x5c\x05\x12\x76\xc2\x2e\x64\xf1\x9c\x1d\x47\x70\xf9\xeb\x86\x72\xda\x47\x80\x2e\xa3\x04\x41\xe0\xb9\xd5\xd6\xf8\xc7\xa8\x5a\x99\xe7\x6c\x47\xbc\xb7\x7f\xde\x19\xb1\x9d\xf7\x33\xe3\xfe\xa3\xec\x0c\xda\x6b\x50\xdb\x2e\xa7\xe3\xa9\x99\x28\x6b\x8b\x10\x7f\xb0\x8a\x1a\x30\x3c\xcb\xb2\x8b\xd7\x47\xaf\x9f\x83\x2e\x9f\x6a\x67\xcc\x51\x63\x5b\x8f\x81\x41\xb2\x31\x22\x03\x14\x73\x26\x3a\x2f\x4a\x9d\xcb\xa8\x52\x05\xb6\x5c\x97\x1d\xc0\x86\x08\x95\x82\xbd\x0a\xcc\x30\x08\x3f\x85\xe1\x3c\x4b\x45\x1f\xa8\xdb\x30\xd3\xc9\x8c\x69\x0c\x4e\x35\x6b\xe5\xa4\x09\x37\x39\xf6\xa1\x51\xb0\x5d\x6b\xcd\x30\x4e\x33\xa7\xaf\x9e\xa4\xe2\xea\x89\x49\xf9\xb3\x11\x3c\x06\xb9\x61\xd9\x9a\x13\x37\x6c\xe7\xd9\xce\x84\x9d\xcb\x5c\x66\xbc\xcc\xa8\x8f\x1c\x0d\x51\xdf\xe7\x0c\x05\x3f\x20\x98\xbf\x4f\x77\xd8\x1e\x16\xab\x81\xba\x91\x09\x0f\x5d\x12\xa0\xba\x20\x96\xbf\xdf\x49\xbb\x64\x03\x38\x87\x58\x6f\x07\x11\xa3\x96\xb2\xaf\x55\xd6\x39\xc5\xa7\xc9\x1c\x7e\x34\x9f\xe9\x5d\x56\x54\x4d\x3b\xd3\x25\x19\x81\xe1\x16\x5f\x11\x2f\x15\xa9\x2d\xaf\xdc\xd2\xdf\xbd\x8d\xe3\xa7\x3a\x7e\xd8\x00\x28\x2d\x2c\x9c\x22\xc3\xd0\xd7\x8f\x06\xe1\x2f\x25\x7f\xad\x04\x3b\x39\x0a\xfd\xba\x45\x69\xa4\xb1\x4e\x44\xa5\x0d\xd5\x40\xa2\xbe\xb0\x77\x90\xf3\x7f\x6b\xc5\x8e\xff\x7e\x4e\xd3\xda\xbf\x87\xc4\xee\x28\xe9\xf8\xbf\xab\x52\x38\x8d\xa8\xb7\xfa\x15\x46\x6a\xab\x5c\xee\x73\x76\xc4\x2d\x47\xcd\x0b\x25\x95\xae\x51\x24\x40\xa9\x9a\x42\x76\xaf\x87\x08\xe9\xa8\x3c\xb3\xcd\x6b\x3f\x8e\x83\x4e\xbb\xc3\x4e\xba\x9f\xbf\x7d\x73\xb2\x01\xdd\x29\x81\xe3\x76\xfe\x4a\xa7\x03\x29\x50\xd1\x80\xfe\xc8\x03\x54\xaf\x43\xfc\x9c\xe5\xee\x49\xec\x54\x2b\x31\x62\x6f\x04\x4f\x99\x93\x6e\xf4\xcf\x9f\x4a\x69\xef\x0a\x94\x50\x5f\xbd\x8f\x7e\xbf\x88\x83\x10\xc2\x0f\xe6\x89\x70\x1a\x81\xe3\x00\x92\x13\x08\x1d\xd2\x01\xa6\x99\x9e\x32\x12\x16\x9b\x7c\xfb\xb7\x6f\x4e\x06\x7b\xf9\xb7\x6f\x4e\xfc\xbb\xbb\x7f\xea\xd9\xfd\x7c\xed\x01\x8d\x87\xda\x76\x78\xd1\x52\xf6\x6b\x75\xae\xc6\x94\x6f\x1b\x04\xb7\xb7\x06\x26\x43\xd9\x01\x9b\xa2\xf9\xa5\x54\x9d\x93\xc5\x9b\xd2\x06\xf0\xe4\x03\x76\x42\x14\x1b\x03\xc8\x96\xf4\x39\xcb\xab\xcc\x42\x79\x3c\xf0\x9a\x63\x3e\xc8\x50\xf0\x5c\xc7\x08\x2a\x8a\xb1\x23\x81\xe1\x88\xf4\xb9\x4f\x58\x0c\xbf\x58\xff\x83\x57\x5c\xf1\xb9\xbb\x1d\x4e\x40\x96\xe3\x9f\x11\x93\xef\xa1\xd3\x5d\x85\xaf\xf8\x15\x97\x19\x9f\xca\x4c\x5a\xd0\xe7\xf6\x27\x5e\x9b\x37\x88\x95\xe1\xa6\xbc\x31\xe9\x37\xa8\x6a\x1b\xd4\xd6\xb8\x90\x18\x70\x70\xd8\x9e\xfb\xee\xc9\xb5\x13\xf5\xfb\x13\x90\xfb\x70\x23\xc0\x96\xb6\x94\xdf\x37\x1f\x53\x7e\x37\xa2\xa7\xc2\x7a\xbf\xe8\xd8\xec\x62\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x42\xa7\x7a\xe4\xea\x13\x36\x1c\xed\xa1\x40\xc1\xde\xe9\xf8\xfb\xbe\x2a\xd4\xa7\xd9\x38\xe9\xe3\xdb\x38\x0c\xdb\x02\xd1\x4a\x0f\x42\xae\x7a\x38\xaf\x6b\x04\x14\x42\xfc\xaa\x55\x67\x85\x3b\xeb\x9c\x64\xb9\x47\x27\x84\xdf\xbb\xfd\xd4\xa5\x0a\x13\xaf\xde\xe2\x37\x70\xf0\x30\x74\xf1\xa3\x79\xb2\xe0\x21\x05\x1f\xb3\xce\xfb\xac\xe7\x6b\x26\xa2\x58\xcc\xfa\x67\x53\xba\x61\x5e\x9c\x37\xa3\x36\x87\xa2\x58\xb0\x17\xe7\x6b\xc4\x24\x66\xb2\xba\xf7\x36\x18\xcb\xd9\x35\x2c\x93\x33\x61\x65\x27\x22\x6c\x58\x50\xe6\x5a\x49\xab\x4b\xb3\x89\x5a\x52\x7a\xf4\x30\x8a\x9b\x1f\xcd\xf1\xe7\x1b\x4f\x14\xf6\x2a\xfa\x94\xb3\x44\x67\x99\x48\x7c\x7e\x29\x2c\x71\xf8\xd9\x1a\x47\x0c\x65\x20\x98\xc9\xe5\xd7\xe0\x8a\x21\xa7\xcb\x13\x64\xbb\x27\x6f\x8e\x0f\x8e\x5e\x1d\x4f\xf2\xf4\x0f\x0b\x7d\x3d\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\xc1\xc2\xd3\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\xe8\x87\x6f\x4d\x8d\x4f\xea\xe3\xce\xa5\xd6\x76\x15\xa1\x74\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x3b\xe2\xb7\xd6\xd7\xfd\xd2\x85\x6b\x37\x6f\x83\x44\x9f\x56\x33\xbe\x2f\x1b\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\xf3\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x97\x62\xc9\xa0\xc6\x70\xa6\x4b\xc0\xfb\x6e\xf2\xa7\xb0\x09\x10\xef\x09\x34\xd7\x26\x85\xe3\x9e\x10\xbe\x8f\x2a\x02\x2f\xf2\x46\xcc\x86\x24\xfb\x1b\x31\x5b\x47\x75\xfa\x18\x40\xd1\x42\x7a\x9c\xd3\x57\x2a\xbb\xc0\x94\x57\x04\x63\x44\xda\xae\x5d\x06\x2a\x12\xbd\x27\x74\xef\x55\xde\x37\x44\x09\x7a\x9f\x56\x42\x6c\x65\xf1\x62\xb7\x25\x2d\x92\xbd\x73\x18\x44\x5f\x39\x2b\x56\x5c\x3f\xb9\xd6\xe5\xa5\x54\xf3\xf1\xb5\xb4\x8b\x31\x52\xca\x3c\x01\x68\xd8\x27\x7f\x80\xff\x50\x14\xf9\x20\x4d\x29\xff\xad\x32\x62\x56\x65\x98\x99\x66\x26\x8c\x17\xf2\x47\x51\x1a\xc8\xb2\xbc\x94\x2a\x1d\xb1\x4a\xa6\xdf\x76\x5d\x31\x36\xc4\x6e\xe9\xde\xda\xb5\x4d\xeb\x8a\xba\xbb\xea\xf8\x18\x2d\xbd\x4c\x2a\x79\xaa\x0d\x36\x08\x70\xa4\x6a\x6c\x01\x9e\xe6\x52\xdd\x97\x1d\xd0\xd5\x3a\x90\x2a\xed\x46\xc9\x56\x00\x02\xc6\x69\x9a\x07\xf4\x19\x85\xb1\x43\xce\x0f\xf7\xde\x13\xec\x00\x4a\xd9\x3f\xcd\xdc\x9f\x5b\x09\x96\x7c\x69\x7e\xcd\xc6\xf8\x94\x71\x91\xd6\x74\xdd\x26\xf2\xdc\xe5\xfa\x7c\x89\x3c\xc3\x3a\xe4\x3f\x43\x7a\xce\x27\xe5\x38\x76\x8f\x75\xe6\x4f\xeb\x07\xdb\x20\xa9\xfb\x6b\xc6\x9f\x46\x43\xab\x4f\x1f\x68\x5e\x63\x3c\xa2\x0a\x28\x60\x28\x95\xbc\x3f\x0d\xfb\x21\x87\x6e\x09\xbe\xc2\x38\xd1\x4a\x11\x90\xee\xeb\x42\xa8\x73\xcb\x93\xcb\x9e\x51\xdd\xad\x56\xf5\x3b\xd3\xaa\x3e\x51\x22\x90\x67\x51\xac\xa7\xa3\xf4\xb7\x3a\xd9\x1b\x37\xf9\x03\x14\xc0\xd8\x15\xe6\x15\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x51\x65\x08\x13\x2b\x0d\xd1\xf1\xf3\x6b\x3c\x7d\xf7\x37\x1d\x31\xc3\xe5\xc0\x44\x03\x36\x25\x6a\xee\x3e\x99\x4a\x5b\xcb\x4a\x23\x2c\xc2\x8f\x10\x96\x9e\x56\x2c\xa1\x12\x63\xd0\x47\x9c\xee\x41\xc3\x45\xba\x8a\x62\x3a\xb1\xbe\x18\x34\x20\x95\x3c\x7d\xfa\xf4\x29\xa2\x2f\xfc\xc7\x7f\xfc\x07\xd3\x25\x34\xad\x4a\x64\xbe\x7a\x23\xdc\xf5\x97\x67\xcf\x26\xec\x1f\x07\xaf\x5e\x42\x45\x43\x61\x0d\xb6\x32\xc1\x91\xdd\x0d\x8d\x1f\x9b\x11\xfb\x5f\xe7\xaf\x4f\xeb\xaa\xe0\xe6\xb7\x60\x9a\x87\xd7\x6b\x02\x48\x3f\xfd\xeb\x9f\xff\x3c\x61\x47\xb2\x84\x8a\x2e\x29\x42\x73\xd2\xe0\x6a\xe1\xa5\x40\xb4\x08\xa8\xdb\xf7\x1a\x97\x0c\x7d\x80\x08\x02\x0a\xdb\x37\x63\xa1\xab\x63\xc8\x4c\x26\x16\x8b\xc7\x50\xac\xf9\xde\xa7\x88\x3d\x4d\x68\xee\xa4\xfd\xc1\xe4\x46\x2c\x93\x97\x82\xcd\x0c\xb4\x45\xaf\xf1\x80\xa8\x63\x1f\x15\xca\xe0\x60\xf5\x5a\x19\x61\x1f\x78\xda\x6a\x2f\x57\x73\x83\xb7\x61\xa4\x96\xc2\x4a\xe5\xad\x97\x62\x39\x46\x3e\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\x68\x16\x15\x7c\x3d\x29\x3b\x0c\x52\xc5\xd7\xb9\x17\xa5\xfe\x6f\x64\x01\x28\x31\x8e\xc4\x33\x94\x00\xc3\x4a\x52\x01\x70\x14\xdd\xf2\x65\xd2\xd4\x9d\xd4\x7f\x4c\x90\xe7\xab\x7d\x23\x32\x69\xdc\x23\x00\x60\xe2\x03\x4f\xae\x9b\xde\x39\x2e\x35\xc8\x2f\x95\x5a\xf9\x35\x15\xf3\x93\xb8\xa4\x6e\x51\x04\xdd\x57\x8f\x81\x38\x46\x84\xbd\x40\xf7\x7a\x2a\x05\x42\x34\xf2\xad\x8d\xb0\x15\x91\x06\xb2\xe8\xdd\xb3\xa1\x93\x11\xbc\x61\xce\xcb\x4b\x67\xb8\x92\x74\x99\xb0\x33\x37\xc9\x00\xdf\x80\xa8\x78\x57\x18\xd8\xcc\xf9\x12\x1e\x4b\x8a\x1b\x3c\x64\x77\x32\xd9\xc5\xed\xa7\x4b\x66\x2c\x2f\x69\x2f\xb9\xcf\x1f\x07\x1c\xe7\x2b\x5e\x18\x84\x87\x73\x9a\x2a\x40\x27\x6a\x28\x49\xb7\x8b\xba\x3f\x32\xd2\x7a\x0b\xa1\xc9\xc6\x40\x98\xce\x03\xdc\x73\xf8\x4c\x5a\x7d\xda\xe5\xf7\x02\xdb\x31\xef\xa1\x70\xe0\xd5\x8e\xa9\xa6\xad\xc8\xc6\xad\xf4\x0d\x6a\x1f\x90\x89\x07\xa5\x60\xac\x6f\x17\x46\x82\x33\x56\xc0\x9a\x3d\xce\x1f\xaa\x1e\x81\xd7\x10\xda\x04\x5e\xfd\x75\x0a\xbc\xfa\x04\x91\xf1\x6a\xf0\xb0\x8f\x24\x23\x31\xe9\x00\xc3\x33\x6a\x56\x2f\x01\x34\x75\x29\xa2\x6d\x8d\x1d\xd0\x7c\x27\x3f\xc5\xf8\xd4\xe8\xac\xb2\xf8\xd3\xfa\xcb\xf8\xf4\x83\x41\x3d\xb8\x24\x1c\x79\xe1\xb6\xe8\x2c\x04\x2d\x00\x8f\x8f\x3e\xc7\x22\x5e\xbd\xc5\x46\x1f\x27\xc4\xef\xc8\x01\xd1\x9b\xce\xc1\x60\x1b\x82\xd6\x7e\xb0\x50\x71\x77\xbd\x10\x94\x02\x11\xe9\x7d\x4e\x9a\x3a\x19\x01\x4a\xa5\x57\xe1\x10\x0f\x27\xdd\x88\x9b\x31\x31\xb2\xbf\x2f\xc1\x48\xb6\x17\xfa\xaa\x87\xb4\xbb\x13\x65\x45\x39\xe3\x89\xd8\x8f\x7d\x0c\xa2\x58\x88\x5c\x94\x8e\x50\x74\x9f\xaf\xd1\x5e\x70\x95\x66\x04\x5c\x20\x4a\xd8\xc1\xe2\xbd\x15\xa5\x23\xea\xe1\xf9\x09\x4b\x4b\x79\x25\x4a\xc3\xf6\xfe\x2e\x9c\xad\x81\x30\x54\xfb\x0f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\xd4\xba\x96\xd0\xf5\x52\x79\xc8\x2b\xb7\xac\x26\xf6\x1d\x4d\xdc\x86\x80\x23\x14\xa4\x2f\xb4\x3e\xc4\xd8\xa6\xef\xf4\x0b\x1d\x1a\x12\x8b\x03\x73\x43\x9d\x7f\x01\x0e\x87\x04\x3b\xc1\xa4\x6c\xac\xb8\x61\xf8\x82\x92\x3a\x58\xf5\xa1\xda\x8f\x19\xd9\x95\xfa\x4a\xa6\x5e\x1d\x82\xd4\x88\x1a\xf4\xaf\xe0\x26\x02\x2f\xe0\xc6\x68\xea\x67\x1e\x2d\x0d\x5a\xa9\xa0\x34\x35\x7b\x66\xf8\x70\x73\x1c\x26\xd3\x80\x3c\xdf\xa9\x61\x17\x1b\xe4\x40\xd4\xa9\x38\xab\xa6\x99\x34\x8b\xf3\x41\x43\x22\xeb\x06\xc6\xa4\xc4\x95\x4c\x95\x1b\x23\x23\x46\x28\x23\xa9\xbf\x2a\xaa\x5b\xd2\x69\xdb\x1a\x96\xc1\xff\x3a\xde\x14\x1a\xaa\xe1\xa1\x6b\xab\xff\xea\xb4\x9e\x07\x81\x95\x60\xbb\xc0\x54\xbc\x55\x45\xe3\xf3\x84\x67\x99\x21\xfd\x36\x80\x61\xfb\xb3\x07\x35\x54\x0f\x60\x82\x5c\x21\x1d\xc3\xf8\xd9\x43\x0a\x0e\x0a\xaf\x80\xdc\xbe\xf6\xc5\x4c\x04\x71\xa9\x95\xbf\x09\xba\x1e\xfa\x1f\x04\x0a\x61\x25\x0e\x32\xdd\x06\x31\xb3\xb7\xe1\x9f\x87\x17\xfe\xf9\x34\x35\x15\x75\x2f\x2a\x0e\x1f\x8e\xa1\x42\xcb\x77\xd4\xe7\x01\xd9\xa0\xb6\x24\x27\x1f\x4b\xd3\xdc\x58\x08\x18\xe7\x77\x60\x09\xff\x7c\x18\xef\x6e\x7b\x50\x50\xc5\x9c\x29\x0e\x12\x6a\x4c\xf4\x4b\xa2\x2d\x45\x36\x72\xd8\xe7\xab\x72\xad\x3e\xd3\xe1\x38\xc7\x0f\x77\x0d\x4b\x75\x52\x39\xe3\xab\x26\x7b\x9d\x70\xd1\xaf\xad\xcd\xe3\xc2\xd9\x4f\xf5\xb5\xba\xe6\x65\x7a\x70\xd6\xa9\x36\xb7\xa9\x9c\xd5\x63\xc5\xaa\xb7\xff\x98\xb9\xcf\xf9\x54\x57\x36\x60\x1b\x6e\xa3\x7d\x6b\x87\x88\xa5\xf9\x3a\x77\x9b\xd5\x4e\xc8\xde\x32\x9a\x77\x57\x87\xdd\x36\x40\xb8\x0d\x10\x36\xae\xfb\x14\x20\x3c\xc1\x00\x61\xdc\x12\xae\x21\x5e\xc8\x43\xeb\x28\xfe\x28\x62\x4c\x47\xb5\x48\x45\x4d\xbc\x5d\xcf\xdb\x52\xfe\x71\xf3\xd6\x5c\x17\x19\x0c\x5e\xe6\x82\x5e\xf6\x18\xe2\x51\xf7\x20\x9e\x04\xb4\xec\x61\x15\xe2\xd5\x14\xf8\x75\xbd\x1a\xa2\xd4\x62\x60\x3a\x8a\x70\x17\x3a\x7d\x8e\xa0\xb1\x00\xf4\x8e\xcd\xc9\x46\x04\xfb\x3d\x22\xdf\x85\x4a\xe1\x1f\xa6\xe0\x89\x00\xf9\x16\xd4\x9f\x41\x82\x04\x3d\x19\x80\x0d\xc4\x04\x0c\x18\x01\xa8\x73\xd6\x87\x1b\xd8\x60\x1c\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x8c\x60\x92\x85\xc8\x39\xfc\xf3\x85\x27\x81\x93\x8d\xce\x78\xb0\x02\x21\xe0\x44\x99\x1b\xa6\x67\xa3\x46\xa6\xeb\xce\xd5\xb3\x9d\x7e\xc1\x06\x36\x5c\x9c\x92\xf9\x7d\x74\xd6\x3b\xd8\xc3\xda\x04\x3b\x6b\xc4\x76\xdc\x1e\x02\x9d\xc7\x6d\xab\x00\x67\x1f\x32\x28\xe0\xfc\x40\x0a\xdf\x1b\xe2\x0c\x1d\xc4\xed\x1a\xbc\x1d\x85\xa8\xc1\x03\x50\xfe\xb6\xc1\xdb\xc7\x18\xbc\x8d\x0e\x46\x2f\xe8\xd6\x04\x72\xe3\x90\x80\x8f\xe6\x4e\x85\x37\x6a\xc8\x86\xf1\xa1\x5c\x1f\xc7\xd5\x65\x33\x75\x69\x77\x32\xd9\xdd\xf5\xd1\x5d\xe2\xfb\xca\xce\xc6\x5f\x33\xa1\x12\x9d\x22\xb3\xb8\xf1\x4b\x63\x41\xdd\xab\xdd\x6d\xf1\x5c\x72\xff\xac\x38\xfd\x09\xc6\x1e\x62\xa9\x7b\xcb\x16\x0f\x49\xf8\xe2\x13\x28\x31\xb5\xea\x12\x80\x0f\x89\x44\x01\xcf\x9a\x74\x18\xff\xbd\x61\x99\xcc\x25\x35\x4a\x75\x1b\x5d\x18\x6b\xd8\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x39\x0a\x37\xb9\x2f\x1b\xbf\xa2\x3b\xf6\xb1\x8d\x49\x55\x96\x42\xd9\x6c\xf9\x98\x35\x20\x4f\xc4\x7b\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\x4d\xd6\xaa\x23\xbe\xe0\x36\x8f\xfa\x0b\x04\x34\x5a\x33\xaa\xe3\xe2\xee\x53\xa1\xae\xd8\x15\x2f\xef\x88\x1c\xbf\xee\x1a\x50\xe7\x49\xe5\x95\x34\x7d\xbb\x18\xb3\x36\x79\xce\x83\x13\xda\x6d\x36\x5d\xd9\xa2\xb2\x24\xd1\xfd\x0e\xf4\x28\xe3\x61\xe7\xb5\x94\xc3\x67\x5d\xba\x2b\x35\xaf\x82\x5b\x2b\x4a\xf5\x9c\xfd\xd7\xde\xbb\x2f\x7e\x1b\xef\x7f\xbb\xb7\xf7\xf3\xd3\xf1\x7f\xfe\xf2\xc5\xde\xbb\x09\xfc\xe3\x4f\xfb\xdf\xee\xff\xe6\xff\xf8\x62\x7f\x7f\x6f\xef\xe7\x1f\x5e\x7d\x77\x71\x76\xfc\x8b\xdc\xff\xed\x67\x55\xe5\x97\xf8\xd7\x6f\x7b\x3f\x8b\xe3\x5f\x6e\x39\xc8\xfe\xfe\xb7\x7f\xec\x3d\x75\xae\x96\xaf\x7b\x8a\x42\xbc\xc6\x03\x1e\xc9\xcd\x11\x07\x61\xbf\x56\x5b\x09\xa9\xec\x58\x97\x63\x1c\xfa\x39\x80\x05\xf7\x7c\x80\x67\xaf\xa1\xf7\x7f\xad\x06\xd4\x70\xfb\x5e\xa9\xdf\xf0\x06\x87\xd0\xe7\x91\x1c\xa0\xcc\xd8\x8f\xd4\x2c\x93\xb1\x22\x2f\x74\xc9\xcb\x25\x4b\xc9\x9b\xb9\x5c\x83\x40\x14\x41\x10\xf5\x86\x14\x86\x79\xa4\xb2\xdc\x40\xa5\x71\x6f\x44\x21\x91\xca\x2a\x1f\x08\x4f\x08\xc6\x8a\x17\xe3\x1a\x90\xf7\x09\xb5\xdf\xa7\x14\xd1\x6d\x14\xd0\x98\xf2\xe4\x12\x2d\xa8\xb0\x5a\xa8\x37\x46\xa5\xf5\x3b\x3b\x94\x12\x91\x0b\xae\x82\x63\xdf\x77\x1c\x73\x4b\xe9\x6f\xc6\xb1\x1b\x4e\x78\x8c\xb4\x53\x02\x61\xdd\x91\x4a\x97\xec\x15\x28\x40\x1b\x5d\x7d\x36\x08\x56\x88\xfc\xb7\x78\xe9\xb4\xbe\x81\x2a\x51\xfd\x70\x3e\x81\xc8\x6a\xb0\x37\x09\xd7\x6b\x06\x4d\xb6\xea\x0c\xb1\x86\x66\x01\x0b\x79\xec\xb7\xa5\x8f\xdf\xba\xe5\x74\xa3\xa2\x6e\x0a\x8e\xe9\xcc\x60\xde\x8a\x4c\xa0\x0f\x14\xd8\xa6\xb0\x1c\x61\x09\x2f\xa2\xe6\xd0\x95\x71\x4f\xd2\xaa\x79\x4f\xfd\x20\x6c\x93\x35\x45\x9e\xf0\x1d\x5d\x9b\x16\xb5\xfb\xe6\x3c\xbc\x59\xed\xcf\x80\x92\x65\x6f\x7e\x9a\x0a\x8c\x14\x7a\x0a\xa9\xda\x7a\x06\x99\x15\x51\xbf\x1e\xdf\x92\x66\x85\x51\x95\xcc\x9a\x9c\xea\x3b\x4f\x84\x17\xaf\x14\x25\x14\xae\xb0\xdd\x7a\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xf1\xdb\x83\x53\x3b\x7a\x2a\x1b\x43\xa9\x18\x83\x28\x16\x83\xab\x13\x21\x65\xb3\x7f\x87\xe4\x3a\xfb\xb3\x71\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xc2\xc0\xa7\x1b\x5c\x04\x57\x12\x9d\xb3\xc9\x32\x21\x68\x27\xd9\x68\xdd\x83\xc3\xe2\x9e\x80\xa2\xaa\x71\x68\x95\x5a\x3b\x24\xd8\x54\xcc\x30\xe3\x09\x7f\x03\x9e\x02\x2a\x05\x4b\x45\x26\xac\x88\x7a\x1c\x17\xd8\x95\xb5\x14\xb9\xbe\x72\xdb\xec\x9d\x62\x6f\x0d\xc5\xcb\xe5\xec\x39\xe3\xfb\x8d\x82\x63\x83\x06\xb6\x12\x22\xc5\xfa\xb0\xa8\xa9\x60\x59\x29\x33\x62\xd3\x7d\x9f\xcf\x6a\xb0\x7b\x68\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe9\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\x57\xd2\x48\x4d\x91\x2e\x3f\xee\x59\xe8\xc2\x80\xd1\xb3\xc3\x8c\xcb\x9c\xed\x19\x21\xd8\xb1\x67\x09\xfc\xe6\x1c\x35\x49\xf4\x24\x96\xcd\xa4\x3a\x02\x7c\x24\xe0\x01\xf7\x49\x2d\x7a\x43\xaa\x02\x2a\x03\x6e\xe6\x6b\x1f\xba\x1f\x96\x6b\xfd\x9c\x74\x09\x09\x6f\xbe\x05\x90\x50\xa9\x8e\x32\x62\x0e\xce\x4e\x4c\x6c\xdf\x52\x1b\x45\x1c\x09\xbe\xc8\xb4\x9a\xc7\xc0\x77\x35\x67\x3a\x21\xaf\xa0\x1f\xe6\x95\x4c\x2b\x9e\xa1\x78\xa7\xc9\x1c\x9e\x9f\xe0\xcf\xe5\x7c\x61\xc7\xd7\x02\xbc\x9f\x78\x0a\xd6\x7b\xc6\x3f\x54\xae\x64\xda\x4a\x03\xc7\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\x83\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x06\x4e\x5d\x9d\x1b\x74\x7b\xac\x7b\x6e\x84\x8f\x6d\xdd\xf9\x11\x14\xe2\xee\x9d\x83\x37\xa6\xc8\x5e\xd5\x6c\x72\x21\xf2\x22\xe3\x76\x98\xd4\x92\x9d\x9f\x22\xf7\x77\x14\x3c\x76\xdb\x91\xab\x74\xcc\x33\xc7\x91\x67\x3f\x1e\x52\x65\x1b\x6e\xb0\x46\xfa\xda\x45\xdd\xa3\x14\x95\x03\xd4\x92\xd6\x6e\x2d\xc0\x52\x9b\x8a\x14\x84\x11\x3d\x19\x7c\x14\xd7\x0a\x5b\xff\xba\x3f\xce\x7e\x3c\x1c\x31\x39\x11\x13\xff\x57\xb8\xd5\x4b\x43\xab\xe7\x58\xe0\x10\x2a\x68\x80\x9f\xb1\x0b\x77\xe4\xfc\x8d\x7f\xfb\xaf\x6f\xdc\x24\xdd\xb7\x7f\x1b\x7f\x13\xf5\x32\xfa\xdb\xbf\x9c\x70\x2d\xdd\x0d\xcd\x4f\xe3\xfc\x72\x90\x7b\xee\xaf\x7f\x9d\xe9\xf4\xbc\x10\xc9\x04\x5f\xcb\xfc\x0b\xb3\x04\x98\x50\xd6\xe9\xda\x67\x1a\x32\xcb\x64\x8a\x5c\x0e\xcf\x2e\xc5\x7f\xfb\x00\x01\xb5\x4b\x25\x41\x92\x70\x2b\x14\x1c\x00\xbe\xd0\x58\x69\x8b\x3f\xc7\x46\xab\x30\xff\xbd\x59\xdc\xfa\xd4\x6a\x0d\xdb\x1c\x45\xc9\x81\x62\xe2\xbd\x34\x80\x3b\x83\xef\x0a\xe4\xe0\x94\xbc\xee\xcf\x34\x37\xac\xa3\x70\x80\x19\xc2\xee\xe1\x59\xc6\xfe\xa4\xb4\xfd\x53\x58\x7e\x9f\x98\x08\x07\x97\x66\xfc\x4a\xcb\x94\x55\xd0\x37\xcb\xed\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x14\x13\x76\xee\xce\xac\x38\xc3\x00\xa9\xa7\x18\x74\xa1\x11\x29\xab\x94\x95\x19\x7c\x5b\x8f\xe3\xa6\x1c\x9f\x65\x27\x33\x66\xaa\x04\x9a\xf3\x96\x62\xec\x4f\x47\xba\x6b\x45\xc6\xd4\xef\x32\x0a\x8b\xbd\xe0\x68\x3f\x15\x29\xfc\x14\x5b\xfd\x2a\x62\xaf\x95\xbc\x6a\x37\x4f\xad\x92\xfa\x44\x04\x62\x42\xd7\x6c\x77\x08\x66\x3e\x01\x08\x4d\x39\x0a\x18\x28\x91\x08\x63\x78\xb9\xc4\x6e\xa8\x32\x34\x6d\xa4\x94\x57\x38\xa9\x73\xae\x2a\x18\xa0\x14\xd8\x5b\xb7\x4a\x80\x3a\x9c\x4d\x4b\x7d\x29\x54\x28\x21\x08\x0d\xd2\x43\x42\x75\x9d\x35\x0a\xf1\x7b\xcd\x92\x05\x57\x73\x51\x57\x91\xe7\x3c\x05\xda\xff\x10\x34\x2d\xff\x3e\x8e\x02\x7c\xe6\x14\x16\x69\x81\x14\x53\x77\x3e\x85\xb0\xc7\x3b\x15\x70\x70\x47\x75\x5c\xc2\xbd\x92\xcc\x3a\xc9\x44\x36\x8c\x23\xbc\xbf\x0b\x7c\x0c\x0a\xc5\x06\x93\xb7\x73\x61\x79\xca\x2d\x1f\x2c\x81\xfb\x15\x0f\x5d\x3f\x29\xa9\x03\xd8\x21\x4a\xf6\xa0\x33\xd6\xab\x92\xba\x90\x31\xae\x00\x48\x83\x85\x5f\x7d\xc0\xa5\xb2\x8e\xaf\x29\xe8\x88\x79\xd9\xa0\xab\xf1\x2c\xd3\xd7\x84\x54\xe7\x47\x43\x91\x25\x52\x96\x56\xa0\xf6\xd5\x22\xad\x4f\x50\x7c\x90\x98\x89\x5b\xe8\xc1\xa8\x7c\x51\xc7\xfe\x93\x66\x6e\xf6\x5a\x05\x0d\xcf\x3a\xa1\xac\xc4\xd6\xf8\x1e\x08\x82\x88\x5f\x29\xdc\xaa\xad\x65\x80\x75\x9a\x0b\x6b\xea\xac\x4a\x3c\x4d\x9c\x88\xa4\xb3\x9c\x9c\x08\x70\xd4\xd0\xd2\x90\x1d\xbe\x5e\x53\xc4\x85\x33\x9a\x4e\x0b\x77\x7e\x6d\x7c\x65\x86\x0b\x1e\x61\xfb\xdb\x57\x3a\xed\x1f\x85\x6a\xf5\x71\xad\x07\xae\xab\x4d\xb0\xf2\xc8\x80\x93\x07\x6f\x80\x98\xbc\x69\xc0\x64\xe0\x11\xb0\xe0\x57\xdd\xdd\xa9\xb5\x66\x3a\x0e\xcd\xda\xe0\x71\x63\x78\xdc\xf8\x59\x5f\xc7\x75\xff\xac\x45\x7f\xf5\xcc\x5e\x6c\x4e\x68\x80\x48\x85\x13\xad\xe7\x83\x04\x12\x5a\x28\x4a\x61\x5c\x3a\x7f\x29\x33\x23\x64\xc3\x50\x3d\xad\x90\x4e\x6a\x3e\x67\x7f\x6a\x68\x5c\xa4\xd9\x06\x6b\x18\xab\x98\xf6\xbc\x79\x3c\xa1\x85\xf7\x70\x5e\xcd\xdb\xf7\x5b\x83\x81\xaa\xb7\xde\x6a\xf4\xd5\x52\x41\xfd\x76\xaa\x32\xf4\xe1\x0f\x35\xaa\x8e\x99\x4b\x9d\x65\xbe\x77\x3b\x5a\xc8\xad\xdc\x26\xe8\x1b\x84\xd1\x92\x51\x70\x43\x04\x7d\x5f\x89\xeb\xa0\xd8\x71\x83\x70\xa5\x3e\x56\x0f\xae\x12\x9f\x70\xb6\x6e\xbc\x50\xd1\x75\xa0\x96\x38\xf5\xa3\x88\xb4\xe8\x5e\x60\x73\xf7\x20\x67\x01\x28\x3e\xcd\x30\x23\x27\x28\x3e\x30\x17\x9e\x5d\xf3\xa5\x81\x5d\x56\x5b\x6c\xe1\xf9\x84\xf5\x5e\x0f\xfc\x46\xcc\x7a\xf4\x93\x8f\xaf\xc1\xa2\xf9\xc3\xc5\xf3\x01\x6c\x45\xaa\xee\x49\xba\xf5\x30\x1d\x5a\x70\xb7\xaf\xe1\xd2\x02\x20\x33\x12\xd2\xa2\x86\x88\xaf\x36\xb6\xf3\xc1\xd9\x09\x0c\xec\x2d\xb7\x39\xfc\xe1\x4f\xf4\x10\x28\x9c\x0a\xb7\xdf\x6a\x88\x28\xe0\xdd\xf8\xb7\x6b\xf2\xc6\x6a\xa6\xff\x01\xfa\x21\x51\xfc\xc5\xd7\x03\xbb\x03\xe1\xe0\xec\x04\x9f\x38\x81\x96\xb8\x5c\x2d\x49\xd7\xb2\x0b\x59\xa6\xe3\x82\x97\x76\x89\xce\x8b\x51\xe3\x69\xa1\x28\x72\x00\x72\x0c\x1a\x1a\xee\xd3\x42\x2d\xbe\x1a\x6b\x04\xe4\xf3\x81\x17\x8a\x9c\xdd\xb8\x32\xf7\x8d\x22\x7d\x4b\x34\xfd\xd5\xa0\x48\xdc\x42\xc7\xfb\x2e\x1e\x04\x45\xd2\x58\x10\x7f\xaa\x73\xd9\xc9\x78\xd3\x4c\x67\xc1\x63\x16\x74\x68\xf2\x37\xe9\xb8\x6e\x2c\xe8\x6c\x60\xfc\xbb\x91\x46\x4c\xce\xdc\x01\xa7\xd5\x98\xaa\xd5\x83\x73\x9c\xf4\x3e\x9f\xf7\x89\x86\xbc\xdb\xba\xe8\xfe\x8c\x9f\x15\x0f\x10\xf6\x3a\xdb\x53\x5a\xe1\xfe\xc7\x7b\xf7\x31\xed\xf5\x06\xff\x2e\xdc\x32\x61\x3f\x2d\x84\x8a\x0f\xbf\xd8\x21\x3e\x0a\x87\xb0\x54\xa9\x5b\x7c\x38\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\xb5\x7c\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xa8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x10\xb0\x4b\x14\xa9\xcd\x93\x9f\xb0\xf5\x9c\x34\x9d\xf2\xe4\xf2\x9a\x97\xa9\x81\xfa\x75\x6e\x25\xb6\x38\x1c\x35\x86\xdd\x8b\xe6\xe0\x9e\xde\xd0\x14\xf6\x83\x71\x6b\x44\x68\x65\x57\x3f\x86\xf1\xca\xea\x9c\x5b\x99\x80\xdb\x46\xce\x22\x4f\x7c\x1e\x5a\x40\x84\x48\x2a\x4a\x76\x38\x2b\xe8\x35\xc0\x82\x2b\xb1\xcc\xc2\x5e\x6b\x26\x73\xa7\x81\x71\x68\xfd\x3c\x0b\xd5\xea\x3e\x66\xf0\xa1\x99\x3a\x35\xf3\x27\x08\xd4\x44\x77\xa1\x43\xc8\x99\xea\x06\x86\x0f\x51\x81\xe0\x0e\xa7\xb2\xec\x51\x4b\x41\xa2\xdf\x38\x9e\x76\x73\x8d\x58\x75\xe4\x96\xe7\x5a\x38\xbd\xcb\x7c\x90\x61\xcd\x64\xdd\x8c\xe4\x5c\x61\xe1\xae\x34\xde\x85\x40\x99\xd8\x7b\x69\xa9\x8b\x82\x9c\x81\xf9\x7e\x7b\x46\x10\x7b\x2b\xaf\x84\x81\xb8\xb3\xcf\xed\x76\x64\x98\x0b\x25\x4a\x6e\xc1\x93\x4f\x70\x84\xb0\x73\xdb\x8f\x68\x6c\x98\x09\x82\xb2\xec\xb3\xb7\xd4\xe0\x3f\x30\x6e\xc8\x14\xbf\x95\x62\x8a\x9e\x45\xd2\x4d\xb7\x1a\xe5\x07\x87\xd9\x6a\x94\x5b\x8d\xb2\xc3\xb5\xd5\x28\xdb\xd7\x56\xa3\x8c\xaf\x90\x8c\x3c\xac\x36\x59\x57\x17\x44\x89\x1f\x71\x2a\x55\x7d\xc3\x4d\x2e\xbf\x93\x19\x7b\x23\x12\x7d\x25\x4a\x3c\x44\x8e\xdf\x17\x5c\x39\x5d\xe9\x05\x97\x99\x3b\x42\xfc\x51\x52\xbb\x37\xa0\x8f\x4e\xd3\xc5\x1e\x79\x94\xc2\x7a\xd0\x66\xcd\x69\x52\x84\x74\xe1\xee\xa7\x40\x7e\x51\x8a\x2b\xa9\x2b\xe3\x13\xbe\x2a\x8b\xc2\xc2\x58\xd2\x67\x16\x72\x1e\xda\xdd\x85\x74\x8c\x52\x24\xba\x4c\x6b\xc8\x2a\x63\xb9\xad\x4c\xb3\x86\x34\x41\x9f\xf6\x70\xee\xcc\x40\xc7\x7b\x74\x7a\x0e\x79\xce\x60\xc6\xdc\xe0\xfb\x75\xf7\x25\x66\xe2\xe1\x87\x53\x62\x43\x9f\x1c\x58\x27\x26\x3a\xd5\xb7\xb2\x22\x62\x57\x62\xac\x3b\xaf\x61\x03\x8f\xe6\x09\x36\x0f\x1f\x87\x61\xc7\x75\x2e\x60\xe7\xfe\x88\xf1\x35\xe0\x6a\xb2\xc1\x81\x53\xe2\xeb\xc1\xa5\x0e\x36\xaf\xc1\xaa\x16\xd8\x27\xa9\x5c\x60\xc3\x57\x2f\xb0\x4f\x5f\xc1\xc0\x42\x45\xd9\xf0\xfb\xfe\x8d\xaf\x70\x6b\xed\x7c\x3a\x96\x3e\xb4\xf3\x1b\x50\x6a\x61\x1c\x69\x98\xce\xa5\xb5\xc2\x27\x90\x84\x9d\x0c\x0e\xff\xb8\xc2\x87\x64\x0e\xf8\x12\x30\x4b\x44\xbc\x0f\x3d\xa4\x22\x5d\x15\x34\xce\x6b\x69\xc0\x40\xe2\xca\xd9\xb5\x88\x68\x0b\xb2\x63\x4c\xe9\xbe\xde\x56\xdf\xca\xa1\xfe\xe3\x6e\xe5\x50\x7c\x6d\xe5\x10\x83\x6e\x5c\x19\x14\x8f\x0c\xaa\x18\xfb\x41\x09\x4a\x87\x4f\x45\xc6\x7e\xad\x44\xb9\x64\x4e\xd1\xad\xd3\x4c\xa1\xdd\x96\x91\x29\x25\x6a\x92\x63\xb2\xaf\x75\x79\x4f\x75\x3c\x70\x9c\x1e\xbf\x77\x76\x02\x20\x20\x0c\x2e\xf5\xdb\x0f\x68\x02\x19\xe1\x2a\x84\x95\x89\xad\x03\xcc\x11\x69\xd8\x0b\xce\x54\x38\x38\x3d\x1a\xd2\xd4\x1f\x22\x7d\x80\x0d\x97\x42\xc0\x56\x5c\x32\x1f\x20\x11\x92\x32\x7c\x03\x07\x5b\x48\xf3\x08\x8e\x46\x76\x29\x96\x23\xca\xa6\xa2\x5e\x8b\xfe\x66\x4c\x4c\x6c\x36\x7c\xe9\x07\x14\xd8\xbc\x06\x3e\x81\x86\xf4\x0d\xe2\xd5\xb7\xc1\x47\x73\x2c\x4f\xdc\x61\x0e\xc5\x81\x0f\xd9\x01\x1a\x81\xc4\xd7\x4d\x4d\x41\x90\x5b\xa1\x87\x80\xaf\x96\x0a\x0c\x0a\x15\x62\x20\x61\x87\x61\x2f\x36\xb4\x7b\x0a\x2f\xbf\x8c\x9f\x88\x58\x61\x0b\x36\xca\x72\x2e\xc5\x72\xd7\x10\x96\x86\x56\x66\x21\x0b\xdf\x25\x12\xe4\x24\xed\x4a\xf6\x23\xe4\xbf\xf9\x21\x50\x22\x9e\xa8\x11\x3b\xd5\xd6\xfd\xe7\x18\x12\x7a\x31\xc6\xa2\x85\x39\xd5\x16\x3e\xb9\xd7\xe4\xc6\x57\xfb\x44\xc4\xa6\x10\x8d\x84\x10\x0b\xa6\xae\x43\xed\xaa\x4f\xf3\x04\xa2\x52\x2e\x4f\x58\x18\x69\xd8\x89\x62\xba\xf4\x54\xb5\xbe\xf1\x95\xa1\x21\xbc\xf7\x3a\x8a\x86\xad\x19\x83\x16\x43\x97\x8d\xb5\xf8\xc0\x70\x21\xb0\x26\xfd\x37\xe0\xdd\x86\x48\x64\xc8\x4d\x85\xe6\x4b\xdc\x8a\xb9\x4c\x58\x2e\xca\x39\xe0\xae\x24\x8b\xa1\x97\x78\xa8\x73\x11\xaf\x01\x4f\x47\xbc\x06\xe5\x43\x50\x51\x5e\x42\xd6\xf1\xa7\x51\x7f\x70\x6c\x3c\xae\x73\x5e\x38\x16\xfc\x3f\xee\x54\x06\x2e\xf8\xbf\xd0\xdc\xcd\x4c\xd8\x01\x33\x52\xcd\x33\xd1\xf8\x8e\xfc\x99\xf1\x30\x6e\x04\x67\xbf\xfe\x5a\xc9\x2b\x9e\x09\xac\x12\xe0\x2a\xb4\x5e\xd1\xb3\x15\xa5\x6b\x44\x1d\xde\x9c\x5c\x0e\x31\xf8\x9d\x4b\xb1\xdc\x19\xad\xb0\xed\xce\x89\xda\xa9\x21\x9c\x1a\x8c\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x47\x4f\x7b\x00\x66\xec\x60\x3c\x49\x2e\xe7\xc3\x8c\x1b\x33\x04\x9a\x4c\xab\x20\xbc\x35\xfa\xba\xc6\x12\xe7\xd1\x3d\x75\x49\x38\x55\xa0\x0c\xee\x47\x87\x0a\xc8\xa1\xf2\x81\x07\xa0\xff\x15\xf5\xb3\xee\x0b\x43\xb7\x16\x0a\x1c\x40\xd8\x7c\x85\x6c\x03\x51\xa1\x4e\xd3\xb9\x81\xe2\x3f\x42\x44\x44\xcf\xd8\x8b\xba\x61\x84\x34\xe0\xa2\x92\xbe\x66\x56\x69\xcb\xa4\x4a\xb2\x8a\x82\x21\xf0\x53\x70\x70\x0d\x63\xc0\x0e\x46\xde\xc1\x19\xbb\x1e\xd6\x73\xb4\x4f\x29\x5a\x29\x84\x6a\x67\x7f\x40\xbe\x4d\xc8\xa6\x40\x6a\x6f\x92\x5a\xb3\x4e\x25\x1f\xcd\x46\x27\x49\x53\xbf\x7c\x21\xa7\xa5\x60\x87\x0b\xae\x94\xc8\x22\x14\x19\x72\x86\x72\x6b\x79\xb2\xc0\x98\x1d\x67\x6e\x1f\x67\xc2\xee\x1a\x6c\xd0\x9f\xf3\x64\x21\x55\xc0\x55\x50\x01\x4d\xa9\xae\x2b\xdb\x40\x6b\xa0\xbe\x06\xd2\x80\x5d\x65\x76\xa9\xad\x0c\xf1\x5d\xdc\xcf\xa5\xd9\x6d\xa6\x06\x28\x6f\xdf\x53\x23\xf5\xd3\x9e\x07\xca\xe3\xb9\x0c\xad\x4f\xe0\xde\x0f\xf7\xab\xc9\x83\x43\x5b\xaa\x99\x28\x4b\x5c\xa1\xa9\xa0\x1f\xb4\x7a\xcc\x4e\xa8\x89\xc5\x42\x5f\xb3\x54\xb3\x6b\xe8\xb6\x7a\xe5\x14\x08\x48\x45\x32\x5e\xf5\x88\x66\x0a\x89\x81\x89\xce\x8b\x52\xe7\xd2\xf8\xf2\x47\x62\x8f\x8d\x01\xa6\x64\x55\x67\xcc\xd9\xe6\x2a\x66\x95\x6a\x36\x7b\x7c\x71\xc8\x2c\x2f\xe7\xc2\xba\x67\x30\x55\xe5\x53\xd1\x13\x17\x66\xd3\xa8\xe4\x83\x76\x01\xd9\x0d\x6d\x40\x1a\x54\xfb\x48\x7f\x0f\xf6\xc6\xff\x0a\x12\x08\x21\x4d\x71\xa6\x4b\x4a\xb6\x0c\x5f\x12\x0c\xbd\xe3\xc2\x1f\xe9\xe0\xac\x94\x35\x3d\x51\xe1\xfb\xf4\x07\x41\x56\xf8\xe9\xa7\xd3\x61\x60\xdd\x77\xeb\xf1\x6e\xe2\xba\x6b\x5d\x66\xe9\xb5\x4c\x51\x39\x33\x6c\xcf\xdd\xbc\xdf\x8f\x02\x1b\x44\x79\xef\xbd\xd3\xaf\xaf\x65\x3a\x10\xf1\x61\xa8\x26\xd1\x7d\x1e\xb5\x23\x3a\x03\xaa\xcb\x54\x28\xeb\x84\x65\x69\xd8\x1e\xfc\x62\x9f\x1d\x4b\xac\xc4\x87\xdf\x03\x88\x6a\x3e\x95\xaa\x46\x79\xa8\x17\xd5\x1d\x97\x4e\x6e\x78\xf3\xde\x08\x8b\x35\xd4\x50\x86\xac\xed\x82\x19\x99\x57\x99\xe5\x4a\xe8\xca\x64\xcb\x9e\xac\xfd\x50\x17\x76\x96\x89\xf7\xb8\xc3\xfb\x2b\x3d\x61\xa8\xa6\xf2\x03\x89\xb6\x35\x70\xca\x8a\xf6\x53\xa7\x82\xa7\x4f\x82\x26\x14\x80\x00\xc4\x7b\x91\x50\x8d\x58\x91\x55\x73\xd9\xa9\x28\x78\xdb\x07\xb1\xd3\xaf\x6f\xd7\x07\xb1\x6e\xf7\x56\x19\x51\x23\x97\xf5\xeb\x43\x7e\x0f\xdb\x16\x6e\x56\xbf\xbc\x58\xdf\xb2\x30\x15\x85\x50\x29\x40\xa7\xbf\xa8\xf7\x1f\x4e\x7e\x63\xb4\x27\xc8\xf2\x61\xce\x0a\x8f\x7f\xde\x38\xa5\xa3\xc4\xfb\x85\xce\x52\xc3\xc4\x7b\x5b\x72\x77\x1c\xe4\x4e\xf0\x87\xdf\xcc\x18\x57\x7d\x45\xfb\x63\x69\xbc\xc5\x3e\x93\x06\x9a\x3e\x52\x0d\xd4\x0c\xda\x91\x73\xd7\xc4\x7d\x38\x6b\xea\x35\x3e\x1e\xb8\x39\x27\x1e\xa0\x24\x1d\x4c\xb3\x0e\x6d\x4d\x13\x4d\x7a\x4a\xb3\xfe\xa5\x5f\x33\x4d\xb3\xa6\xb5\x5e\x6b\x56\x1b\xdc\xac\xdb\xce\x9a\x0f\xab\xb3\xe6\x0c\xe0\x9e\xfa\x83\x1f\xd3\x38\x2d\x9f\x1d\x7d\x48\x6a\xeb\x6d\x7c\x74\xb4\xa3\xa2\x33\x19\x3a\xe5\xd0\x40\x04\x9b\xc0\x8c\x5b\x8d\xba\x38\xa2\x52\xaa\x9b\x34\xdf\x74\xdf\x41\x6e\xb9\x11\xb6\x8f\x27\xb9\xa9\x60\xd6\xe3\x39\x91\x13\x73\x3e\x7d\x85\xdd\x3b\xa1\xd0\xd3\x43\x20\xb1\xf1\xdf\x48\x17\x55\x8d\x3b\x9d\x16\xea\xe9\xee\xc1\x91\x45\xc8\x2c\xc3\x31\x52\xb7\xda\x09\xb7\x3d\x1b\xd2\xf7\x38\x8d\x69\xb6\x6f\xdf\x9e\x1c\x0d\x49\x42\x37\x9e\xd7\x56\xe1\xdf\x4d\x32\x12\x97\x02\x80\xae\xfc\xb5\x8a\x0d\x6d\x80\x6e\x0c\x84\xa3\xfb\x37\x41\x9d\x79\x22\xea\x30\xc1\x91\x34\x97\xfd\x01\xce\x57\x86\x6c\x6e\xf7\xef\x0e\x8f\x19\x7d\x7a\x2b\xef\xfc\x5d\xdc\xf3\x7d\x51\xb1\xe7\x89\xa8\x03\x77\xa9\x34\x97\x1b\x00\x47\xef\x6b\x03\x17\xe9\x69\xb7\x3a\xce\xfb\x19\x69\x68\x5b\x78\x1e\x46\x35\xc2\xf7\x5d\xea\x8a\x5d\x13\x8c\x20\x59\x88\x17\xb2\x78\xce\x8e\x95\xa9\x4a\x51\x67\x68\xb5\x87\x72\xfa\xd6\xad\xed\x45\x40\x6a\x34\xcf\x07\x8b\x4a\x0c\xcd\xa9\x8f\x25\xcc\x51\xf0\xd2\x82\x21\x37\x0c\x23\x85\xe1\xbc\x9c\x8e\x3e\x50\xb7\xe1\xa4\x93\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\x39\xde\x89\x40\x46\x63\x6e\x79\x11\x80\x7d\xd9\x93\x54\x5c\x3d\x31\x29\x7f\x36\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\xcf\x76\x26\xec\x5c\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\xc7\xae\x1f\x10\xb2\x59\x9e\xee\xb0\x3d\x5d\xc2\xc8\x09\x57\x2c\x13\x1e\x73\x81\x76\xf5\x12\xed\x8e\xfd\xfb\x21\x22\xd9\xbd\x89\x14\xa1\xb4\x1c\x88\xd7\x52\xaf\x53\xd1\x79\xdf\x00\xad\x3d\xaa\x0f\x3c\xa9\xdc\x29\x38\x61\x6f\xe9\xf8\x22\xbd\x00\x99\x01\x36\xb3\xbf\xe3\x7e\x2d\xd6\xfd\xf3\x87\x74\xf2\x6c\xac\x86\xee\xee\x1b\xa1\xbb\x7a\x4f\xe6\xd2\xbe\x11\x85\x1e\x40\x87\xc3\x81\x5a\xf1\x05\x69\xdd\x07\xda\x48\x68\x4f\xc3\x2d\xe3\x28\x92\x92\x2a\xe3\xce\xa8\xc3\xe8\xc2\x84\x1d\x1d\x9f\xbd\x39\x3e\x3c\xb8\x38\x3e\x7a\xce\xbe\xa3\x91\x64\x6c\x07\x4c\xd8\x45\x8c\x3b\x1d\x55\xb4\x11\xb8\x6f\x78\xd6\x88\x44\x2c\x57\x75\xe3\x0c\xc0\xe1\xe4\x8a\x9d\x28\x69\xeb\x96\x61\x58\x17\x90\x69\x45\x99\xfe\xee\xd7\x14\xdd\x98\x4b\xcc\x47\x55\x34\x98\xfb\xba\x39\x1a\xec\x50\x6c\xb0\x13\xa6\xd2\xc9\x41\xb2\x61\xe5\xaf\x5e\x9e\x4d\x18\xaa\xbe\x17\xce\x30\x36\x56\xe8\x83\xe4\x61\x20\x30\x5a\x5c\x7f\x8e\x87\x6d\x68\xfb\xe8\x81\x75\x75\xd9\xe8\xca\x38\x99\xec\x4e\x98\x3b\xc6\x77\x27\xbb\x5e\xe5\xcb\x56\x5a\x87\x86\x41\x63\xfc\xf2\x26\xc3\x4f\x18\x7b\xed\xcb\x26\x01\x7c\x6a\x7d\x17\x52\xc4\x5f\x8c\x7a\x4e\xb6\xb6\x8d\x2f\xdd\xaf\xa6\xf1\x43\x09\xf0\x7c\x2e\xaf\x84\xc2\x17\xdb\x9c\xa4\xf6\x53\x1d\x64\x19\xe3\x37\x27\x4b\xf9\xcd\xcb\xcd\xbd\x1b\x4a\x9c\x81\xde\x8c\xc4\x17\xbd\x57\xa2\xf3\x1c\x11\xba\x17\x01\x4c\xa6\xc6\x83\x09\xd2\x71\x23\x56\x3e\xe2\x92\xcf\x3a\x6d\xec\xd6\xc9\xe0\x87\x6a\x59\xf5\xe1\x63\x2a\x6f\x56\xb5\x39\x75\xf7\x3e\x66\x04\x8c\x6f\x3c\xc8\x2a\x1d\xb3\x4f\xc2\xc3\x9f\xbc\x39\x3e\x38\x7a\x75\x3c\xc9\xd3\x07\x28\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\x8a\xf7\x30\xed\x61\x74\xb8\x30\x9c\xdf\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\xb8\xcb\xea\x42\x67\x7a\xbe\xbe\x01\xda\x1d\xd8\xe6\x0f\x88\x90\x3b\xe6\x63\xc7\x8f\x9b\x33\x76\xbb\xf7\x51\x6e\xdb\xb9\xd8\x37\xd9\x11\xb2\xa6\x56\xb0\x1b\xa1\xdd\xf1\x23\x20\xd8\x67\x34\x23\x56\xa8\x88\xee\x1c\x10\x6f\xbe\x09\x45\xdd\xd5\x21\xea\xae\x7e\x5b\xfb\x62\x33\xc4\xef\x6a\x5a\x38\x49\xde\xb5\x8d\x7f\x93\xea\x7e\xa4\xe6\x01\x52\x94\x62\x1c\x60\xb3\xa1\xbd\xb7\x2e\x23\xb5\x2c\x3e\x4f\xbc\x27\xd8\xfb\x8d\xf1\xae\x6c\xd9\xf6\x08\xd7\x9a\x7c\x70\xc4\x23\x16\x61\x96\x2d\xeb\xd6\x28\xe4\x0d\xe3\x73\x84\xc3\x2e\x29\x20\x57\x94\xf2\x4a\x66\x62\x0e\x6d\x8f\xa4\x9a\x47\x30\x4e\x31\xf0\x13\xb5\x41\x6a\x06\xa7\x5e\xb9\xbf\xa2\xd6\x7b\xc0\x59\xa7\xaf\x2f\xa0\x83\x16\xa4\x54\xf4\x36\x38\xdd\x03\x61\xcf\x8f\xc7\x63\x70\xfd\xed\xfd\xb7\xb3\x7c\xd2\x6c\x9f\xfd\x24\xe8\x39\x1a\x5a\x7c\x95\xd0\xe6\x7e\xa1\x43\xbf\x25\x98\x6b\x4d\x59\x60\x68\x4c\xe3\xa3\xbb\x9e\xb8\x3b\x9d\x46\x8d\x47\x79\xe3\x7e\x29\x00\xb2\xbb\xce\x33\x78\x88\x56\xd2\x86\x0e\xd0\x81\xa5\xbd\x0f\x36\xad\xdb\x23\x21\x7d\xc0\x9f\x0b\x9c\x99\x65\x9e\x49\x75\x59\x63\xc4\xcf\xb4\xe3\x63\x2c\x67\x96\xea\xd2\xef\x9a\x52\xf0\xec\xe6\x13\xa3\x0b\x8f\x6e\xec\xb4\xb0\x83\xc5\x23\x20\x5e\xe0\xa4\xc5\xf7\x5e\x78\x51\x02\x58\x2c\xea\x77\x76\x1e\x34\xc5\xa4\x49\x8c\xec\x2f\xde\x61\x98\x86\x6c\x57\xec\xe4\xfc\xf0\xfc\xe4\xb3\x46\xfd\x6e\x3a\x5c\x61\x76\x0f\xda\x7a\x90\xbf\x76\xcb\xaa\x1a\xb3\xac\xea\xfa\x4b\x74\xbd\x9c\xe9\xd2\xf2\x6c\x03\x82\x33\x59\xf0\xe2\xa0\xb2\x8b\x23\x69\x00\xad\x71\x18\xf5\x6f\x65\xd4\xa8\x5e\x11\xfb\xd0\xf9\x86\x1b\xd2\xb3\x2f\xdd\x77\xf8\xfd\xc1\x19\xe3\x95\xe3\x47\x4b\x2d\x86\x36\x96\x2c\xe7\xdf\xe2\x1c\x6b\xa0\x07\xa5\x0c\x8d\xf9\x11\xba\xf8\xbb\xee\x13\x55\x3e\x5f\xd5\xdb\x36\x1e\x0d\x27\x17\x4a\xfd\x47\x12\x83\x96\x4a\x5a\xc9\xad\x2e\x07\x8b\x0d\x36\x46\x0c\x0e\xc3\xca\x58\x9d\xd3\x2e\x3a\xf1\x77\x40\x42\x16\xe8\x6f\x2b\x3f\xaa\xbd\x89\x60\x7d\x02\xcd\x4f\x94\xb3\x15\x79\x22\x5a\x65\x36\x23\x68\xfd\x83\x63\xcb\x70\xcf\x37\xe4\x44\x07\x14\xfb\xec\x6f\xcf\x1b\xcd\x31\x57\x3a\x18\x7b\x2f\x66\xdd\x1e\x77\x63\x5e\x69\xf9\xeb\x30\xa2\x4d\xfe\xaa\x5a\xf1\x04\x24\xd1\xff\xae\x78\x86\xa4\x3d\xdd\xa4\xf3\xbd\xb9\xa4\xc3\xbc\x71\x93\x4b\xe8\xe5\x6b\x96\x38\x0d\xde\xb6\xca\x20\x46\x3f\x52\xc4\x96\x5c\x19\xc7\x27\x4d\x7f\xc6\x2e\x25\x40\xec\xb2\x3d\x9b\x14\xfb\x1b\xa3\xd4\x50\xe5\xb0\x59\xa5\x62\x65\x15\xdf\xfd\x02\x59\xe3\x65\x28\x87\xed\xf7\x9a\x1b\x4f\x72\x80\xdd\x3e\x8c\xdf\x96\xc6\x0a\x7c\x14\xd3\x0b\x15\x44\xf6\x52\x1a\xeb\x1b\x08\xc3\x07\xd2\x50\xaf\x35\xb0\x05\xce\x98\x2e\x99\x2c\xfe\xc9\xd3\xb4\x7c\x8e\x7a\x04\xd9\xaa\xf0\x6f\x13\xe0\xf0\xb9\x0a\xd9\x36\x7b\x76\x59\x50\x13\x8f\x8b\xc3\x33\x86\x8d\xc2\xbf\xfe\xeb\x53\xb0\x0b\xbe\xfa\xf2\xaf\x4f\x7b\x32\xe2\x43\xad\x2a\x64\x43\xfb\x44\x07\xcf\xac\x78\x24\x55\x24\x8d\x6a\x11\x47\x0b\xd0\x76\xcf\xb1\x38\xc3\x9d\x93\x24\x34\x71\x23\x38\xae\x0c\xa7\xf7\x90\x3a\xf1\xb6\xea\xe2\x77\x54\x75\xc1\x42\x35\x3e\x0a\xd6\x41\x18\x39\x1e\x10\x60\x75\x56\x05\x38\xca\xee\xb3\x87\x22\xbb\x3b\x52\xb7\x2b\x27\x37\x39\x38\x4e\xf1\xf3\xad\xf3\xeb\xf2\xd4\xa3\xd3\xf3\x7f\xbe\x3c\xf8\xfb\xf1\x4b\x78\x57\xca\x0a\x74\xec\x49\x96\x50\x97\x9c\xf5\xdb\xb3\x7b\x77\xe7\x56\x57\x92\x0e\x91\x60\xa0\x5a\xa9\x05\x8a\x9d\xbe\x38\xbf\x6b\x56\x41\x5f\x73\x56\xcd\x7a\x50\xef\xa1\xc5\x35\xa0\xd3\xba\x28\x37\x53\x39\x3f\x70\x50\x24\x82\xbd\x6f\xf8\x51\x1c\x0f\xe1\x3b\xf6\x76\x75\x74\xe4\x0d\x76\xef\x74\xbd\x0f\xc7\xbf\x1d\xc5\x90\x8a\x83\x47\xbe\x3f\x2b\xb5\xfb\xe9\x90\xe5\x50\xb0\x0e\xbb\x38\x96\x57\x1f\x9d\x08\xc3\xb3\xa3\x74\xa7\xaa\x3b\x4f\x85\x09\xdd\x98\x1f\x01\xb7\x16\xeb\x5a\x0f\xf6\x3f\x1d\xd6\x0e\x4b\x3d\xb8\x7d\xeb\xa5\x28\xab\xa0\x51\xd7\x7d\x53\x03\x4f\x9f\x91\xc9\xc9\x11\x66\x0a\x9e\x0c\xda\x10\xbe\xfe\x08\x3f\x01\xe8\xbd\x87\x78\xc0\xc0\xc4\x37\x54\x5e\x16\x9e\x3d\xcc\x76\x0c\xc3\xb5\x91\x56\xee\xc4\x25\xbe\x7d\x79\xa1\x3d\x92\x4e\x0c\xc9\x72\x2f\x59\x88\xdd\xbb\x73\x28\x1c\x43\x3f\x75\x74\x37\x6c\xd2\xd5\x50\x2c\xb4\xd5\x6a\xe0\x1a\xda\x75\x83\x36\x05\xdb\x19\xdc\x71\x88\x95\xee\x99\x28\x23\x79\x8b\x15\x44\x21\xac\xee\x2c\x0f\x7f\x74\x6b\xe5\x03\xec\xcd\xf0\xfa\xc3\x93\x44\x45\x7a\x72\xb4\x01\x21\xf4\xd8\xc0\x8e\xee\x1a\x26\xdc\x58\xa2\x6c\x3a\x50\xe5\xbe\x1b\xc8\xd3\xfc\xe4\x88\xcc\x05\x5f\x96\x6f\x68\x5b\xb1\x9b\xf7\xd5\x46\x54\x29\x5d\xda\x6b\x5d\x0e\x05\x1f\xd7\x1c\xae\x95\x85\x49\xdf\xad\x80\x71\x3c\x4e\x29\x82\x6f\xf9\xe0\x25\xc9\x39\x48\x92\x56\x1b\xd4\x9b\x24\xca\xa7\x10\x28\x0f\x47\x90\x7c\x1a\xc5\xe5\xd3\x22\x71\x6d\xcc\xfc\xf5\xdb\x63\x10\x62\xf9\xc1\xc8\x0d\xea\x18\xa5\x96\xbb\x1c\xdc\xcd\x91\xe4\xd9\x88\x9c\x2d\xb5\x93\x43\xdd\xc4\x49\x53\xc4\xfa\x91\x30\x38\x88\x6d\x1b\xb3\xcc\xad\xac\x56\x71\xc3\x47\x02\xeb\x1a\x31\xec\x99\x98\xf3\x82\x9a\xe6\xa7\xfa\x5a\x5d\xf3\x32\x65\x07\x67\x27\x9f\x5f\xae\xf6\xae\x04\xc5\xfd\xd0\xa7\xb7\x40\xb3\x16\xb4\x1e\x0f\x32\xf0\x21\x49\xc8\xfd\x31\x95\xd6\x60\x2a\x3f\x24\xe3\xdb\xd8\x1b\xe5\xce\xa9\x90\xc9\xe2\x24\x9d\x93\x6a\x34\x52\xa4\x56\x29\xa6\x13\xcb\x33\xdf\x88\x59\xd8\x6b\x21\x14\x7b\xfa\xf4\x29\x06\x28\x9e\xfe\xc7\x7f\xfc\x07\x83\xae\x9b\xa9\x48\x64\xbe\x7a\x23\xdc\xf5\x97\x67\xcf\x26\xec\x1f\x07\xaf\x5e\x32\x9e\x80\x2d\x87\xc8\xb7\x38\x32\xac\x67\xfc\x63\x33\x62\xff\xeb\xfc\xf5\xa9\x3f\xbe\x4c\xeb\x5b\x60\x97\xf0\x7a\x13\x76\x14\xe5\xde\xc7\xc1\x03\x6e\x17\x40\x0d\xa5\x2d\xe3\xb3\x19\x32\x1c\x48\x6e\x69\xbc\x30\xf1\xd8\x73\x72\xbe\xf0\x9d\xe8\x1d\xab\x65\x50\x14\x20\xdd\x14\x21\x60\xe3\x71\x1c\xb1\xc6\x01\xc6\x0a\x87\x08\x4c\x65\xc4\x32\x79\x29\xd8\xcc\x40\x3f\xfa\xba\x71\x4a\x29\x8c\x33\xc0\x12\xae\xdc\xe8\x38\x58\xbd\x32\x46\xf4\xc4\xc6\xdc\x74\xe6\x44\xcf\xce\xe5\xcd\x10\x32\xed\x79\xdf\x42\x8c\x7a\x03\xfa\x1a\x2d\x14\x19\x6e\x15\x1e\x6a\x26\x43\xe3\x6d\xcf\xc2\xfb\x20\x53\x11\xfa\x61\x2d\x19\x79\xa6\xd5\x3c\xe6\xc1\x5a\xfb\xf0\xc9\x94\xcb\x42\x74\x25\xc6\x40\x0d\x75\x86\x69\x4f\x87\xc2\xfd\x15\x2f\xfa\x75\x02\x69\xe6\xe8\xfa\x31\x1b\x38\x94\x7c\xaa\x2b\xeb\x73\xf6\xe8\x7b\x80\x6f\xb3\xda\x93\xbe\xd7\x14\x06\xeb\x52\x34\x5c\xdf\xbf\x81\x9a\x6e\x35\x73\xe6\xe0\xd4\x6e\xaa\xac\x23\x26\x78\xb2\x60\x97\x62\x39\xc6\x13\xa0\xe0\x80\x1e\x01\xd4\x3e\x72\x34\x6e\xb4\xe1\x0f\x9e\xe7\xd4\x59\x93\xb4\x14\x3e\xc1\x32\xd2\x0f\x3c\xfa\x84\x37\xb8\x0c\xe9\xe5\xd4\xca\x4a\x45\x1e\x4a\xdf\xbb\x32\xd1\xca\x52\x5f\xcc\xd0\xbb\x0a\x12\x46\x5b\x80\x04\x4e\xc2\x88\xd4\xfd\xcc\x7c\xe8\xc9\x75\x56\xa9\x3b\x51\x48\xff\xa8\xd4\xca\xaf\x01\xcf\x1d\x72\x7a\x8d\x20\x64\x24\xee\x7b\x22\x46\x99\xa9\x0b\x99\x40\xc5\x91\xbb\x9d\xee\xf5\x54\x0a\x84\x68\x00\x26\x18\x61\x2b\x22\x0d\xe4\x09\xbb\x67\x0b\x63\x98\x84\x37\xcc\x79\x79\xf9\xff\xb3\xf7\xee\xdd\x8d\xdb\xd6\xe2\xe8\xff\xfd\x14\x58\x6e\xd7\xb2\x9d\x4a\xf2\x4c\xda\xd3\xf6\xcc\xed\x69\x97\x33\x9e\xc9\xf1\xc9\x3c\x7c\xed\x49\xb2\x7e\x37\x93\xdf\x29\x44\x42\x12\x6a\x12\x60\x08\x50\x1e\xf5\xf1\xdd\xef\xc2\xde\x00\x08\x52\x94\x44\x4a\xf4\x63\x12\xf2\x8f\x64\x4c\x91\x20\xb0\xb1\xb1\xdf\x0f\xe6\x0a\x0d\xd3\x64\x42\xae\xcc\x24\x7d\xb5\x79\x6c\x25\xb8\xc4\x04\x11\x43\x63\xc2\x4a\x10\xe6\x23\xc7\x93\xc9\x31\xb2\xca\x86\xba\x10\x07\x63\x4d\x9f\x5d\xe4\x7a\xeb\x1e\x57\x41\xe5\xb7\x34\x53\xd8\x4d\xcf\xa8\x16\xd0\xb1\x52\x42\xdd\x16\xbd\x70\xc2\x04\x3d\xb0\x84\x78\x78\xf5\xdc\xc6\xac\xdf\x4e\xa8\xfd\xf5\x41\x3d\xc0\xd7\x5e\xbd\xfa\xee\x7f\xda\x63\xf7\xd3\x4d\xbd\x4f\x2d\x0e\x59\x4a\xd2\x57\x47\xc6\xde\x5b\x6e\xa6\x3d\x34\x36\x73\x57\xd5\x75\x04\xf2\x6d\xa5\x96\x74\x2b\x5d\xc4\x96\x52\x4f\xd8\x67\xa5\x7c\x5c\xce\x80\xa4\x36\xd7\xba\x09\xf5\x32\xc7\x61\x0c\x04\x1e\x5f\xeb\x38\xb4\xcb\x9e\xbb\xee\xa3\x4d\xfd\xe1\x6a\x49\xfd\x3a\x24\x88\xa6\x7e\x55\x0d\x19\x41\x59\x09\xcf\x6a\xc3\xec\x63\xd8\x2a\x2d\xa1\x5b\x67\x49\x1c\x26\xe4\xad\x65\xc5\x88\xe4\x74\xaa\x64\x52\x68\x5f\x89\xa2\x81\x4f\xc3\xa0\xae\xb7\x27\x16\x6d\x72\x8f\x05\x5c\x1b\xe4\x15\x64\x65\xfd\x30\x70\xbc\x7a\x24\x3e\x87\x06\xc8\xe2\xf5\x0b\x0b\x93\xc5\xab\xc7\x5d\x70\xe2\x62\xcf\x3b\xe1\x86\xf5\xd5\x3b\x5d\x46\x64\x45\xba\x85\x18\x59\xad\x50\x74\x76\x82\x2a\xe6\x50\xee\x5b\x01\xbb\xbc\x0e\xb7\xea\xda\x75\x59\x03\xe3\xf9\xd5\x65\x8f\x5a\x69\x30\xea\x06\xbd\x34\x7c\x62\xd0\x4c\xdb\x5c\x15\x00\x5f\xa2\x66\x6a\x44\x7a\x67\x40\xba\x28\x21\x6a\x5d\x7a\x86\x28\xff\x02\x54\x9b\xb5\x85\xbf\x36\xcc\x28\x4c\xe6\xaa\x76\xe8\x40\x63\x70\xc9\xb6\x82\xae\x1e\x2e\x86\x07\x48\xdc\xcf\x5f\x0d\x7a\xa2\xca\x0b\x40\xff\x80\x8c\x9d\xfa\x55\xe5\xa2\xd7\x0e\x88\xe4\x86\x25\x86\xe9\x91\x9a\xc9\x26\x93\xf1\x0b\xec\xf9\x4d\x85\x90\x1a\xf0\x46\x8d\x48\x02\xfd\xc8\x47\x68\x8a\x31\x12\x68\x10\xfd\x95\x07\x4e\xd3\x9e\x65\xce\xde\x90\x87\xf4\x8e\x40\x04\x90\x08\x60\x77\xd5\x0f\x26\x91\x7b\xc0\x26\x73\x95\xa2\x4a\x9f\x6d\xf9\x2b\x78\x65\xc7\x77\x48\xa4\xa2\x05\x4b\x29\xf6\x23\x71\x00\x32\xf4\xfa\x2e\xe7\x5a\x33\xac\x3a\xce\xf2\x54\x11\x39\x1b\x55\xfc\xc6\x47\xcb\xe7\x47\x7d\xc9\xb3\xe4\x3e\x14\x6a\xe2\x4e\xe8\xbe\x65\xc0\x36\x5d\x55\xbf\x41\x45\xb9\x30\xa7\x13\xb4\xe9\x04\x1a\x24\x89\x9a\xc1\xd2\x08\x11\x4b\x84\xff\x93\x06\xdd\xfd\xd9\x22\xf6\xb5\x41\x8c\xbc\x60\x3a\xd8\x20\x06\x1b\x44\x1f\x23\xde\x9b\x0d\x22\x60\xdc\x8e\x98\x36\xd8\x23\xc2\x44\x3c\x67\x94\x28\x4b\x59\x04\x65\xa2\x0d\xca\x3b\x73\x84\xcc\xab\xbe\x82\xe3\xc9\xe4\xf8\xd8\x19\x29\xec\xf9\x28\xf4\x6c\xfc\x27\xc2\x44\x24\x63\x44\x2a\x33\x7e\xae\x34\x08\xb5\xa5\x56\x1e\xce\x25\x75\xdf\x0a\xfd\x0d\x30\x76\xbf\x28\xd1\x23\x85\x72\x21\x29\xaf\xef\x55\x04\x2b\x05\x2f\x5f\x06\xcc\x02\xd0\x57\x4b\xb4\x12\x58\x19\x22\x93\xf0\x94\xdb\xfa\x84\x86\x5c\x30\xa5\x15\x39\xc1\x9b\x93\x28\x2b\x46\xf6\x81\x49\xca\x52\x99\xaf\x46\xfe\x21\xf3\x63\xe5\x2d\xfb\xc4\x29\x48\x6d\x51\x91\xe7\x4c\xe8\x64\xf5\xcb\x95\xdf\x1c\x88\x9f\xb0\xf8\xe6\xb1\xe2\x90\xbc\x8f\xa6\xab\x8a\x96\x65\x13\x01\xb0\xde\x79\x68\x03\x1f\xb2\x19\x18\xa3\xd2\xf8\x63\xee\x32\xb1\x24\x4b\x9a\xef\x9d\x81\xd1\x74\xdd\x8b\xc4\x16\xf3\x25\x57\x72\xef\x1c\xb6\xc6\x21\x43\xe0\xdd\x58\xa6\x8c\x36\x62\x59\xe8\xac\xd0\x96\xbb\xb8\xb3\xed\x4a\xf6\xf9\x33\x5d\x13\x7c\x9f\x1f\xf5\x38\xb9\x8c\x6a\xcd\x72\xf1\x82\xfc\xdf\x93\x8f\xbf\xfd\xd7\xf8\xf4\xaf\x27\x27\x3f\x3c\x1b\xff\xe7\x8f\xbf\x3d\xf9\x38\x81\x7f\x7c\x71\xfa\xd7\xd3\x7f\xb9\x3f\x7e\x7b\x7a\x7a\x72\xf2\xc3\x37\x6f\xbf\xfe\x70\xf5\xea\x47\x7e\xfa\xaf\x1f\x44\x91\xde\xe2\x5f\xff\x3a\xf9\x81\xbd\xfa\xb1\xe5\x20\xa7\xa7\x7f\xfd\x4d\x8f\x8b\xa0\x62\xf5\xbe\x37\x12\x8c\xd7\xf8\x5e\xc4\x88\xea\xd8\x3d\xa3\x2e\x21\x9f\xc6\xa5\x45\x7b\xcc\x85\x1e\xcb\x7c\x8c\x1f\x79\x41\x74\x5e\xf4\x45\xba\x4a\xf6\x77\x7f\x34\xa6\x14\x62\xca\x0a\x98\x4e\xb1\x79\x82\x44\x04\x03\x53\x7b\xb4\x0c\xdb\x3e\xb6\xcd\x46\x61\xfb\xe3\x60\x0f\x6e\x73\xdd\x63\xa4\x92\xad\x67\xf3\x0b\x0f\x53\xba\xb1\xdd\x94\x87\x18\xa5\xb5\x6b\x88\x51\x5a\xbf\x86\x18\xa5\x8e\xd7\x10\xa3\xe4\xae\x21\x46\x69\xb0\x0f\x1e\x7e\xfd\xc2\xed\x83\x43\x8c\x52\xd7\x6b\x88\x51\xda\xfb\xfa\x8c\x62\x94\x50\xc8\x6f\x8a\x54\xb2\x62\x7e\x19\xa6\xf4\x64\xa3\x94\x94\xc1\x87\x88\x9d\x47\x91\x2c\x84\xfe\x20\x6f\xd9\x81\x8e\xdc\x9a\x4e\xba\x36\x3a\x94\x44\xdc\xa0\xa3\xae\x3f\xfc\x24\x15\xd6\xbe\xe4\xd1\x1e\xe4\xc7\xfe\x24\x47\x5a\xc4\xdc\xe8\xa8\x3d\x1f\x16\x37\x6c\x58\x16\x5b\xc4\x2c\x2e\x7f\xb0\x24\x4d\x9b\xfd\x9e\x90\x73\x92\xb3\x88\x67\xdc\x30\x00\xa8\x15\x04\xf7\xf1\xf8\xf8\x2e\xce\x5c\x2b\x96\xcc\x6c\x27\x5b\x51\xa6\x39\xe7\x81\xfe\x69\x39\x4a\xe3\x67\x50\x86\x90\xae\xd7\x28\x51\x0b\x59\x24\x31\xc9\xd9\xdf\x9d\xf0\x61\x67\xf3\x21\x1c\x21\x34\xa9\xc2\x52\xca\xcf\xda\xc1\x69\xc6\x6d\x51\xb1\xa7\x44\x06\xd9\xa7\x8c\xe7\x70\xd8\x6e\x58\x24\x45\xdc\xb7\x85\x64\x6d\xfc\x52\x56\x00\xbf\x10\x8b\x49\x5c\xe0\x03\x90\x8e\x49\x13\x1e\x73\xbd\xf2\xf1\x1c\x78\xec\x8d\xd8\x8a\xbd\x83\x2d\x22\xa8\x72\x23\x08\xcd\xb2\x5c\xd2\x68\xc1\x54\xf0\x35\x14\x42\x6d\xa1\x0c\x9f\xe5\x99\x14\x73\x2e\x50\x0e\x85\x77\x8c\xb0\x92\xac\x48\x2e\xb5\x0b\x4d\xdb\xf0\xc1\x0f\xc1\x60\xf0\x3a\x4a\x1c\x3a\x5f\x41\xfc\x9a\x0c\x87\xc0\x59\xf1\x59\xf8\x87\x22\x32\x89\x5d\x69\xd6\x3f\x3d\x33\x82\x7f\x64\xb1\xd8\x30\x01\x28\x9a\xa9\x25\x49\x8c\xf0\x64\x18\xc3\xe6\x97\xbf\xfc\x3d\x59\xc8\x22\x57\x93\xb0\xd8\xdf\x73\xb8\x87\x16\x0e\xa7\x38\x68\x92\x30\xaa\x34\x79\xfe\x8c\xa4\x5c\x14\x86\xe3\xf7\x84\x78\x7d\xc9\xba\x81\x94\xfb\x87\xdf\x1f\x38\x5a\x3f\xf2\xed\x46\xc9\x36\xc3\x8e\x79\x56\xbc\xb5\x67\x1c\x0b\x7a\x60\xd7\xcc\x9a\xb0\x6b\x59\x52\xb8\x8b\x42\xcb\x47\x3e\xf9\x3f\x15\x72\xba\xd2\x87\x97\xb0\xb1\xe3\x54\x6b\xd7\xfc\xbf\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x3d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\xbd\x3a\x7c\x97\x35\x6f\xf6\x78\xf9\x50\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf3\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\x3d\x08\x58\x87\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xed\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x89\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xa7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x6f\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x65\x22\x26\xdf\x2a\x07\xb8\x78\x25\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x17\xbd\x53\x68\xd2\xcd\xf9\x32\x62\x4e\x76\x34\xef\x3d\xd6\xe2\x97\x7b\x57\xab\x23\xcd\xa5\xa3\x6c\x1b\x53\x3c\x85\xc0\xd2\xbd\xe7\x12\xca\xc4\xd3\xc4\x90\xb8\x95\xaf\xf9\x53\x43\xb0\xe9\x0a\xec\x5e\x8f\x52\x79\x2c\x9f\x1e\x5e\x53\xea\x38\x9f\xc6\x55\x62\x76\x4d\x63\xa9\xc8\x57\x89\x8c\x6e\xc9\x05\x03\xa5\xe1\x3e\x9b\xef\xe7\xd3\xf8\xf3\x6e\x9c\x99\xd2\xf9\x7e\x11\x23\x63\x92\x4a\xc1\xb5\xcc\xf7\xa1\xc7\x4f\xa8\x50\xe0\xd0\xca\xb0\x4d\xc5\x74\x73\xce\x7e\x2e\x8d\x0c\x0d\xca\xf7\x83\x3a\x30\x94\x37\x9d\x00\xe5\xc1\x5b\x40\x54\xf7\xa6\x23\xbf\x5e\xc8\xbb\xb1\x96\xe3\x42\xb1\x31\xdf\x3b\x10\xea\x60\x40\xdd\xb2\x15\x44\x95\xf5\x02\x2a\x3b\x58\x45\x73\xd7\x12\xec\xec\x70\xdf\xc8\x77\xd7\x5f\x5d\x7c\xab\x58\x3e\x09\xb5\x95\x33\xa6\xa3\xb3\x88\x65\x8b\x33\x3b\xc2\x67\x0f\x56\x47\x36\xfb\x81\xab\x1b\x0d\x05\x81\x48\x26\x89\x2d\x30\x26\x67\xe4\x25\xcb\x16\xfe\x73\x4f\x03\x6e\x9f\x73\x4f\xb9\x4c\xca\x7e\xda\x4d\x1d\x9b\x91\xaa\x64\x03\xee\x20\xd5\x08\x90\x3f\x9f\x76\x6b\xe4\xfd\x14\xd1\xfd\x01\xbb\xb3\xec\xd3\x8a\xef\x49\x80\xf7\xe9\xb4\xf4\x3b\xae\xf4\xf4\x0b\xf3\x87\xaa\x0d\xfb\x5c\x74\x6a\x85\x6c\x5f\xce\x50\x19\x8d\x59\x4c\xe4\x92\xe5\x39\x8f\x99\x22\x9e\x6e\x87\x36\x28\x9e\x3c\x0d\xc8\x0f\xbd\x03\x3f\xaf\x80\x83\xa7\x63\x7e\x38\x06\xfb\x43\x85\x88\xc3\x9d\x35\x22\x4e\xe3\x94\x8b\xa7\x81\xed\x7b\xc2\x4d\x45\x34\x61\x97\xef\x0f\xd6\xd6\xed\x38\x55\x85\xfd\xc6\xde\x0c\x7a\x0a\xec\xa8\xb3\xff\x8d\xc7\x5d\x22\x64\xbc\x9f\x03\xed\x91\xd5\xee\x39\xd5\xec\x6e\x4f\x41\x68\x5c\x92\xfc\x7d\xdf\x07\xf5\xec\xf3\x56\xdb\x9f\x44\xa7\x90\xe0\x94\x63\xc9\xff\xc7\x12\xb2\x2c\x3e\xf5\xe3\x48\xc2\xb1\xc2\xa6\x6c\xf5\x56\x6c\xee\xcc\x9e\x5f\x5d\x92\xaf\xf1\xf1\xc7\xeb\x82\x92\x4b\x8d\x2a\xcf\x85\x4c\x29\xef\xa7\x01\x7a\x7d\xd0\x7a\x3f\xac\x10\x08\x57\xfe\x59\x62\x1f\x36\x42\x51\x59\x6e\xb8\xc8\x59\x4c\xac\x3d\xe5\x67\xd6\xe2\x61\x4d\x9c\xfe\x79\xb4\x78\xb8\xaf\x2e\xd9\x81\x69\xde\xe5\xef\x94\x52\xb4\x43\x27\x10\x22\x7c\xac\x13\x51\x4c\x28\x0e\xe1\x0d\x41\x04\x1e\x88\xda\x10\x96\xee\x93\x75\x50\xec\x1e\x91\x37\x72\xce\x85\xa3\x62\xd2\x46\xd5\xcc\x28\x4f\x0e\x03\xe7\x20\x27\xff\xc2\xe4\x64\xa5\x92\x57\x82\x4e\x93\xfd\x43\x26\xab\x87\xc0\x0f\x47\x5e\x27\x74\x4e\x18\xfc\x71\x16\x73\x65\xfe\x4f\x6e\x6e\xde\x80\x33\xb8\x10\x4e\xbf\x04\x37\xa7\xe5\x2d\x3e\x35\x1a\x89\xcc\xe3\xd1\x05\x24\xe2\xbd\x75\xf0\x08\xc6\x23\x5c\xc4\x66\xe9\x4c\x55\x82\x92\xed\x13\xd8\x2b\xc5\xe7\xdd\x61\xe8\xe3\x94\x91\x0f\x0b\x1e\xdd\x5e\x05\xfe\x5f\x99\x9b\x7b\x22\xb8\x55\x11\x52\xea\xbf\x3d\x16\x37\xb2\xcb\xba\xea\xcb\xa0\x16\x8c\xe7\x38\xb5\x23\xa7\x37\x16\x82\xf0\x1b\x55\x4a\x46\xbc\x8c\x3f\x00\x4b\x74\xc9\xbe\x63\x60\xdf\x8f\x07\x15\x10\x38\xfb\x01\x08\xca\xb9\x0d\x52\x8b\xc3\x28\xfb\x04\x55\xa1\x94\xc2\x85\x83\xdb\xa3\x01\x01\x71\xbc\xb7\x96\xa6\xe5\x70\xeb\x2d\x4d\x9d\x9a\x59\x73\x91\xbb\x84\x57\x8b\x40\x4e\x65\xb0\x3d\xb4\xd7\x51\xc8\xb7\x36\xb5\xcd\x4c\x1e\x05\x74\xfb\xa7\xa6\x37\x99\xff\x6a\xf1\x41\x78\xcf\x3a\xcd\x81\xf6\x64\x32\x2b\x12\x8c\xac\x3d\xbc\xb3\xab\xf3\x31\xe2\x77\x1e\xc1\x89\xfe\xd4\x3a\x3b\x1d\x87\xe9\x79\xdd\xf3\x15\x7f\x1e\xfd\x9d\x02\xd5\xe2\xd9\x1f\x7e\xff\xfb\xcf\xbd\xe3\xd3\x61\x86\xbb\xc7\x6e\xf9\x74\x90\xeb\xad\xa1\x36\xc3\xe5\x50\x9b\x61\xa8\xcd\x50\xbd\x1e\xdd\x3f\xfc\xf0\xd5\x17\x7a\xc9\x6e\xeb\x23\xb3\xed\xd0\xfa\x0a\x07\x66\xc5\xf5\x93\x11\x77\x70\x05\x85\x87\xa8\x9b\xd0\x53\x8e\xd8\xe1\x35\x12\x86\xca\x08\xbf\xac\xca\x08\xfd\xe5\x88\xf5\x55\x05\xe1\xf0\xdc\xb0\x5f\x4e\xc5\x83\x83\xc9\xc6\xa1\x79\xf5\x07\x67\xd3\xf7\xd5\xf4\xa3\x2f\xeb\x7e\x6f\x16\x86\xe3\x72\xbc\x46\x7b\x8b\x2b\xf1\xe6\xaa\xe9\x1f\x1f\xab\xa0\x58\xbe\x96\x86\xba\x3c\xa2\xea\x4c\x0e\xb6\x3c\xe0\x54\xe4\x5e\xbc\xbb\xc9\x8a\xf7\xfe\xa6\x16\x20\xe0\x6f\x3f\xfd\xb8\x80\xc1\x41\x7e\x58\x98\xfa\xcf\xcb\x3d\xfa\x33\xed\x80\x7f\x5f\xee\x51\x55\xa9\x9a\xeb\xac\x8e\x40\x20\x41\x84\x93\xd3\xb0\x33\x4d\x49\x16\xce\xaf\x2e\x49\x94\x33\x28\xed\x40\x13\x35\x21\x0d\x12\x9e\x73\x20\x59\x89\xd0\x49\x76\x54\x6b\x96\x66\xfa\x50\xcc\x1b\xbc\xa3\xbf\x30\xef\xe8\xbd\x7b\x29\x16\x45\x4a\xc5\xd8\x50\x0b\xf0\x8f\x56\xe2\x4e\x6a\xfc\x70\x42\x2c\x5d\x40\xb1\x02\x6c\xa1\x90\xd2\x5c\x08\xfe\x53\xc1\x4a\x73\x85\x97\x3a\x9e\x80\x73\x07\xe6\xd1\x33\xec\x50\xa2\xaa\x51\x91\x48\xae\x25\x71\x59\x80\x78\x38\x3a\x82\x11\x88\x65\x15\xd3\x9b\x5e\x30\x94\xde\xae\xa0\x48\x42\xf9\x54\x55\x3f\x44\x05\x91\x26\x89\xbc\xc3\x6f\x87\xf2\x88\xd9\x3f\x33\x17\x5b\x97\x64\xca\x48\xca\xf3\x5c\xe6\xd6\x8d\x14\x4e\x07\xc3\x87\x8c\x9e\xc9\x72\x54\xd8\x72\x1b\xf4\x71\xc3\xb4\xdd\x6a\x40\x15\x2d\x09\x15\x98\xc0\x69\xfe\xed\x22\xae\xe1\xdb\x8e\xde\x4d\xd9\x82\x2e\xb9\x2c\x72\x7c\x5b\x4b\x72\x64\x7f\x02\xde\xbb\x92\x85\xb7\x9d\x17\x90\xa1\xe5\x57\xa7\x1a\xe0\xf4\xae\xfc\x11\x14\xdc\x58\x3a\x73\xe4\x98\x7d\xe2\x4a\xaf\xaf\xc5\x81\xc8\xb5\x9c\x78\x0c\xcc\x5b\xaa\xcc\x30\xd8\xef\xf6\xce\xbd\xad\xe2\x5b\x38\x5a\x55\x52\x5d\xde\xc0\x4f\xbb\xe4\x54\x5b\xb1\x06\x53\xe6\x5d\x3a\xdc\xe7\x17\xc3\x8a\xab\xdc\xb3\xd7\xd5\x93\x14\x94\x07\x21\x79\xeb\xe5\xa3\x2c\x12\x1e\xad\x2e\x2f\xfa\x8d\xdc\xc0\x31\x1d\xfb\x53\x3e\x6a\xc3\xdc\x27\x5f\x51\xc5\x62\xf2\x96\x0a\x3a\x47\xab\xcb\xc9\xcd\xd5\x57\x6f\x4f\x0d\x16\x81\x55\xe7\xf2\xa2\x31\xb4\xe3\x26\x1c\xfc\xdd\x63\xe5\xb9\x93\x3a\xe8\x7a\x13\x1b\xd6\x46\xdd\x13\x7c\x8f\x56\x02\x80\x78\x99\xe0\x90\xf6\x69\x0d\xe2\xc0\x55\xbd\x48\x14\x86\x6f\xb8\xea\x6f\xaa\x4e\xaa\x97\x69\x7c\x7b\x9f\x00\x08\xec\xe6\xdb\x56\xd9\xce\x07\xd6\xc2\xcf\x55\xed\x46\xa2\x73\xaa\xd9\x7c\x75\xc1\xb2\x44\xae\x0c\x02\x5c\x05\x66\x7c\x7c\x74\x8a\x62\x43\x3e\xa5\x11\xc9\x8b\x84\x61\x6f\xa1\x7a\xd9\x35\xc1\x58\x5c\x52\x3a\x2e\x94\xa6\x50\x74\x0d\xc7\xdf\x3a\xa3\xd6\xcc\xaa\x2d\x5b\x1a\xe3\x3c\x77\x3e\x55\x2d\x51\x69\x4e\xc9\xd6\x57\xda\x33\x26\xf8\xfc\x6e\x9c\xed\xe2\xd7\x6c\xed\xc1\xac\x76\x07\x84\x53\x7e\x5d\x24\x86\xf9\x24\x71\xad\xc5\x2b\xc8\x69\x76\x8f\xb1\xda\x05\xd0\x04\x33\xfb\x11\x99\x16\x46\x88\x63\xaa\x62\xe3\x5e\x2f\xf5\x79\xb7\x40\x97\xb6\x79\x89\xd0\x2c\x4b\x38\x86\x30\xcb\xdc\xfa\xa5\x03\x83\xe6\xfa\x63\x6d\x48\x4b\x47\x59\xa6\x9b\xec\x32\x26\x4b\x96\x4f\xdb\xd4\xa9\xe8\x2a\x96\xd0\x8c\x83\x1f\xa7\xb5\x14\x53\xd9\xb8\xf3\xab\x4b\x7c\xbb\xc9\x70\xec\x7e\xc4\x1d\xb4\x7b\xe3\xdc\x1b\xb6\x67\x10\x6a\x2e\xbe\xd2\xd2\xf9\xd5\x25\x96\xf6\xb2\xc5\x96\x4a\xf3\x87\xd1\x13\x28\x06\x39\x96\x15\x1e\xe9\xdc\x8c\xa8\x89\x14\xfe\xa3\x4c\x14\x29\xc3\x02\x4d\x65\xb3\x31\xa3\x3c\x8a\x55\x39\x7a\x69\x3d\x31\xba\x4e\x7b\x81\xa4\xbb\x87\xbf\xa3\x47\xbf\x33\x2f\x12\x52\x5c\xdb\x65\x7e\x7b\xfd\x66\xbf\x4d\x7c\x57\x1d\xc3\x16\xe4\x61\x50\x7b\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\x97\x20\xc6\xf7\xdb\x30\xba\x05\x5d\x06\x45\x8b\x26\x84\x7c\x81\x3b\x67\x01\x8b\xe7\x13\x9b\xef\x5a\x33\x6e\x91\x24\x23\x32\xe3\xd0\x6e\x5d\xb3\x8c\x84\x2e\xa9\x1b\x2e\x22\xa3\xca\x89\xb1\xef\xa6\x03\x33\x72\x0a\x9e\x3f\xa4\xe0\xf1\x04\x79\x97\x25\x31\x14\xb2\x84\x4f\x98\x03\x1b\x81\xb9\xc1\x68\xa0\x2f\x93\x42\x69\x96\x5f\x4b\xc3\x0c\x82\x90\x1b\x28\xea\x41\xc3\x9f\xbf\xe2\x22\x86\x18\xab\x6b\x60\x1c\x11\x15\x84\x71\x30\xe4\x98\x21\xc1\x77\x6e\x70\xa7\x44\xa8\x13\x55\x44\x0b\xb3\xa4\xa3\x4c\xc6\xea\xc8\x90\x91\x23\x34\xf7\xa9\xa3\x53\xf3\x57\x7d\x0d\x18\x41\x13\xbc\x77\x46\x33\x7e\x74\x3a\x22\x00\x20\x70\xde\x49\xbd\xf8\x7c\xf1\xd0\xad\x15\xf4\xeb\xbd\xb0\xf0\x3a\x1c\x01\x70\x50\x94\x6e\xba\xbb\x05\xd7\xcc\xb7\x46\x47\x2b\x91\xaf\x52\x53\x27\xd6\x84\x9c\x0b\xc2\xd2\x4c\x83\xe5\x99\xa4\x8c\x3a\x77\x36\x5b\xb2\x7c\x65\xf4\x7b\xa8\xe2\xf1\xd9\x1f\x7e\x8f\x8f\x07\x01\xbc\xd6\x77\xbe\x44\x72\x38\x61\x6b\xc0\x3d\xfe\xe2\xb8\x62\x33\x48\x92\x80\x9a\x7f\xb6\xa0\x04\xf6\xba\x17\x18\xbf\x33\x6f\x56\x41\x88\xb7\x90\x5a\x7a\xfa\xf1\xe6\x8d\x75\x8a\x20\xac\xbe\xe1\x22\x56\xbe\x13\xa2\x8d\xd9\xb6\xf0\x6e\x04\x32\xcc\xf0\x73\x04\xf0\xba\xf8\xda\x56\xe4\xdc\x32\xbc\x93\xd8\x37\x0d\xb5\x75\x00\x2b\xf6\xbf\x95\x71\xf3\xd1\xa9\xec\xef\x65\xf0\xb0\x0f\x14\x28\x6d\x26\x76\x2c\x2b\xaa\xae\xb2\x46\x79\x7e\xfb\x76\x6c\x01\xfd\xa6\x99\x94\xc6\x02\xa0\x93\xc1\x2f\x60\x09\xc2\x1a\xe5\x64\x96\xd0\x79\x89\x46\x40\xf5\x50\x48\x7a\x79\xf3\x9d\x5b\x82\x22\xbc\x59\x5c\xdd\x29\xcf\xee\x92\x60\xc7\x25\x94\x36\x3e\x61\x3e\xd2\xf8\xe3\x6e\x31\xd6\x0f\xbe\x19\x9b\xda\x38\x0a\xf5\x56\x23\xdc\x26\xf8\x3b\x7b\x1b\x0d\x30\xc1\x15\x5b\x73\x4a\x25\xc4\x3e\x81\x1c\x72\xf3\x5d\x05\x4d\x76\xcc\x77\x03\xd2\xde\xb2\xd5\x9d\xcc\x9b\xeb\xa8\xef\x8d\x5f\x5b\xbf\x98\xd0\x29\x4b\x76\x1f\x90\xb7\x34\x33\xcb\x2e\x03\x4d\x51\xf3\xb6\x7e\x4a\x94\xfd\x31\x26\xcc\xc5\xe1\xc9\x7c\x4e\x05\xff\x07\x46\xe7\x46\xe6\x1c\xcb\xdc\xfc\x79\x82\xbe\x0e\xd4\xdb\x13\x16\xe9\x53\x8b\x7f\x8d\x74\x6f\x07\x82\xd2\x38\xe6\x28\x3d\x5c\xed\xc0\xa5\xed\x40\xe0\xe2\xf6\x3e\x60\xbe\xe5\x60\xed\xc6\xfd\xed\xce\xd2\x16\xb4\xb9\xc8\xb7\xc4\x51\x6d\x7d\x3f\xa5\xdc\x76\xd5\x7d\x72\x50\x61\x29\xe5\xfb\x2e\x0b\xaf\x03\xe0\x9a\x52\x5d\xe4\x5c\x37\x32\xa4\xed\x2f\x72\xf1\x4d\x31\x65\xd6\x3f\xdc\xf9\x75\x01\x61\x82\xe7\x57\x97\xfd\x6e\x47\xe5\x84\x83\x16\x6f\x27\x68\xe4\x16\x52\x08\x9a\x4e\xf9\xbc\x90\x85\x4a\x56\xa1\x51\x92\x82\x7b\xdb\x28\xf5\x68\x95\x11\xc7\x9a\x50\x21\xc5\x2a\xb5\x8f\x8a\x28\x29\x62\x56\x19\x11\xbc\x80\x4b\xc9\x63\x42\x0b\x2d\x53\xaa\x79\x44\x22\xc9\xf2\x08\x3c\x86\xe1\x48\x85\x62\x84\x6e\x78\x37\x2a\x94\x96\x29\x49\x69\xae\x16\x34\x49\x36\xed\x71\x0f\x5c\x6d\x5b\xe9\xf1\x31\xac\x7f\xe3\x8f\x4b\x9c\xf5\x9e\xf8\xbd\xa3\xd2\x7a\x0b\xfc\x36\x93\x3b\x68\x80\xe5\x66\x2c\x6d\x31\x86\xcd\xf1\x6f\xac\x5e\xb4\x63\x63\x76\x41\x67\xdb\xc9\xdd\xb9\xae\x2d\xd4\x70\xeb\xbb\x10\xa4\xcb\xe2\xcb\x94\xce\x5b\x08\x92\x6f\x8c\x76\x40\xc5\xca\xbd\x86\x85\x36\xd5\x88\xc8\xdc\x46\x8d\xf8\xbe\xe8\xf6\x27\x5f\xac\x35\x27\xef\xc1\x1d\x27\x73\x1b\xbe\x6d\xb1\x14\x82\xfa\x59\x3e\x93\x79\x6a\xe4\x3a\x9e\x93\x59\x21\xc0\x48\xa6\x6c\xb4\x37\xa8\x24\xd6\x56\x43\x13\x25\xfd\x09\x04\xff\x9e\x70\x93\x20\x54\x91\x3b\x96\x24\x13\x72\x9e\x24\xb6\x02\x68\x50\xeb\xa1\xcc\xd7\x2e\x63\x0a\xa6\x2b\x12\xf3\x39\x53\x9a\x9c\xdc\xfc\xf7\xf9\x29\x70\x6d\xb0\x63\xac\x88\xa6\x2e\x5d\xad\x6a\x9f\x01\xfe\x1f\x17\x20\x27\x44\x54\xd3\x44\xce\xd1\xad\x0e\x76\x5a\x11\x93\x2c\xa1\x2b\x28\xef\x9f\xd1\x1c\x22\x4e\x23\xb4\xd1\x90\xbc\x10\x50\xd8\xf8\x41\x39\xce\x6e\x52\xb0\xad\xf6\xf0\x18\x70\x72\xcf\xa3\xbe\xa3\xc2\xeb\xfd\xb2\xb2\x9c\x65\x09\xdd\x60\x55\xa8\x60\xf4\x87\x4a\x32\xb2\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x06\x71\x27\xa5\x3a\x42\x9f\xe6\xdf\x52\xa6\x69\x4c\x35\x9d\x18\x5d\xf0\x6f\xd5\xcc\x38\x99\xc4\x66\xa0\xcd\x1b\xbd\x61\xce\x28\x2f\x36\x37\xc4\xaf\x9e\x42\x23\xd4\xfa\xc7\x41\x3e\x77\xe7\x71\xab\x19\xe3\x40\xfa\x04\xcb\x7f\xf5\xc9\xa8\x62\x5b\x7d\x68\x95\xb9\xd6\x5f\xaa\x5a\x19\x92\xea\x4a\x2c\xb6\xa6\x0c\xca\x44\x7e\xb0\x9d\x90\xdc\x1d\x30\xa1\x9e\xbf\xbb\xd8\x6c\xee\xda\x6d\x32\xd8\x61\x22\xa8\x3a\x06\xb6\x4c\xcf\x19\x98\xed\x2f\x55\xef\x80\x4b\x87\x81\x04\x42\x4c\x2e\xa1\xae\x1a\x8c\x7b\x18\x37\xac\x9a\xfa\x88\xef\x6d\xb6\x8f\xb4\x72\xcf\xb4\x71\xca\xec\xca\x34\x1b\xfb\xc9\x6e\x7c\xa8\x9d\x8f\x66\x67\x36\xd8\xa6\x6c\x2f\x84\x3c\x24\x87\x38\x13\xa9\x07\x76\x5b\x9f\x56\x4b\xfb\x8e\x5b\x6a\x87\x89\xfa\xad\xac\x04\x1e\xdd\xb2\xd5\xb1\xb2\x59\x2f\x52\xa8\x05\xcf\x30\x5d\xd1\xba\x21\xec\xee\x92\xef\x68\xc2\x63\x3f\x04\x62\xf5\xa5\x18\x91\x77\x52\x9b\xff\xbd\xfa\xc4\x95\x46\xf5\xf3\x42\x32\xf5\x4e\x6a\xb8\xd3\xcb\x52\x71\x0a\x1d\x16\x6a\x15\x60\xb4\x64\xc3\xb9\x0a\xd4\x64\xb7\xa0\x4b\x4b\xf6\x1c\x50\xb8\x22\x97\xc2\x48\x04\x76\x45\x3e\x8d\x57\xd9\x21\x5c\x0e\x8a\x90\x62\x0c\x36\xee\xc6\x31\x2c\x20\x64\x5e\x81\xc3\x96\xe1\xec\x50\x18\x00\x08\xbf\x70\xe5\x88\xb8\xe7\xd9\xd4\x99\xdd\x78\x44\x52\x96\xcf\xc1\x6b\x13\xed\xf0\x5a\xb4\x35\x45\xb6\x32\x40\xee\xdc\x2b\x20\x99\x6f\x36\x1a\x2e\xd6\x36\x29\x78\x1e\xc9\x52\x8a\xd6\x8c\x7f\x1a\xea\x03\x90\xfa\x37\xe4\x72\xab\x09\x39\x77\x6d\x66\xc2\xdf\xac\xf7\x2a\x1c\xc6\x8c\xc0\x15\x31\xa4\x64\x49\x13\x86\x55\xf6\xa9\xf0\xf9\x56\x72\xb6\x46\xd8\x47\x36\xa7\xdb\x9c\x59\x2f\x32\x1d\xdd\xb2\xd5\xd1\x68\x6d\x6b\x8f\x2e\xc5\x51\x99\x74\x57\xd9\x4c\x4f\x44\x41\xda\x3a\x82\xdf\x8e\xf6\xe7\x05\x5b\x89\x65\x7b\xf3\xca\xce\x7d\x53\xb7\xbc\xd9\xfd\xdc\x28\x6c\x9c\xa8\x53\x03\x42\x70\xf9\xe6\x24\x95\x39\x98\x33\xcd\xdd\xb0\xbc\x87\x11\x55\x6f\x79\x96\x95\xd5\x50\x8a\x6c\x9e\xd3\x98\x91\x79\x4e\xb3\x45\x57\xb1\x04\x65\x9b\xa6\xe1\x3f\x1b\x41\x77\x03\xf0\xb7\x68\x74\x5b\xdf\xbb\x63\xd3\x85\x94\xb7\x90\x0a\x07\x88\x70\x8f\xf6\x87\xef\xf1\x5b\x17\xe5\x3d\xa7\x4a\x2a\x12\x33\x4d\x79\x02\xb1\x1c\xef\xdf\xbc\xb5\xd1\x1e\x8e\x8f\xbb\x59\x36\x07\x4e\xf4\xa0\x00\xd0\xd8\x46\x21\x5d\xb3\x25\x67\x77\xd6\x2a\xb1\x29\x4e\x63\x4c\xe6\x4c\x40\x70\xc2\x96\x20\x9e\x31\x51\x3c\x66\xaf\x20\xf1\x76\xf3\x40\x07\x18\xce\x37\xcc\x79\xd7\xe1\xdd\x4e\xc1\x77\x52\xef\x16\x5c\xd6\xab\xbf\x57\x32\xdf\x52\x08\xa8\x5d\x1e\x70\xbb\x1c\x5f\x1b\x49\xfe\x82\xfc\xfe\xf7\xbf\xdb\xf8\x50\x4a\x3f\xf1\xb4\x48\x5f\x90\x3f\xfc\xc7\x7f\xfc\xee\x3f\x36\x3f\xc6\x05\x3e\xf6\x7c\xf3\xfa\xec\x69\x7b\x79\x7d\xf1\x04\xe0\x1d\xfb\x68\xba\xed\x4e\xb9\x16\x43\xcd\x28\x4f\x8a\xdc\xc6\x71\xb6\x54\x11\x5e\x87\xef\x80\x43\xa5\x4c\x7c\xa0\x6e\x44\x17\xec\x65\x83\xc0\x66\x5c\x30\x05\x0d\x5c\x0a\x91\xb3\x48\xce\x05\xff\x07\x8b\x5d\xff\x16\x08\xec\x80\x4a\xef\x0e\xc5\x09\x13\x31\xf6\xd1\x34\x3c\x6f\x41\x45\x9c\x6c\x73\xf8\xb7\x58\x69\x78\x82\x0f\x02\x19\x70\x9e\x4e\x00\x7b\x5b\xbe\x51\x03\x17\x74\x03\xb5\xee\x27\xe4\x68\x08\xb6\x83\x56\x8a\x84\xf1\x66\x8b\x62\xdd\x30\xc7\x35\xbd\x0f\x55\x56\xb8\xf7\x53\xc1\xf2\x15\x24\x79\x94\x82\x7d\x10\x08\xf6\xa1\xac\x21\xe0\x96\x61\x25\x2a\x2c\xe2\x52\xd3\x85\x4b\x21\xa6\x0c\xf7\xa8\x7d\x1b\xde\x61\xe8\x3e\x77\x8e\x24\x72\x4e\x44\x91\x24\x9b\x1e\x15\x72\x9b\xcb\x29\x84\xdd\x0e\x55\xb2\x9d\x8e\xd7\xd6\x2c\xd0\x00\xe9\x07\x35\x0e\x84\x0b\xef\x49\x94\x7f\xda\xe6\x82\x70\xc1\xad\x62\x3a\xdb\xc7\x73\xb6\x2b\x55\xd3\xc2\x8c\x80\x57\x97\x80\xcf\x96\x05\x66\xee\xd3\xb0\x80\x57\xa7\xf8\x9c\x76\x46\x86\x86\xa9\x3f\x39\x53\xc3\x1e\x8b\x6f\x63\x76\x68\x58\xfa\x60\x7c\x58\x03\x78\xdb\x68\xa8\x0e\x91\x50\x2d\x77\xb2\x85\x51\x02\xaf\xc1\x34\xd1\x89\x13\xb5\x20\xcc\xdd\xcc\x14\xad\x77\x35\x67\x5c\x2c\x25\x16\x7a\xee\x24\xc3\x5d\xaf\xbd\x58\x13\xe5\xee\x80\xb2\x5a\x59\xce\x0b\xbf\xa1\x48\x6b\x14\x5a\x52\xa8\xdd\xc6\xee\xed\x2b\xd8\x9e\xfb\xd1\x8b\x0e\x52\x5d\x79\x91\xb0\xef\xb9\x5e\xbc\x77\x85\xdd\x2d\x56\xeb\x22\x4b\x60\xb1\xc1\x0f\x06\x85\xae\x4b\xc9\xf0\x12\x5b\x89\xb1\x48\xa6\x29\x13\x31\x06\x11\xa5\xf4\x96\x91\xb2\x5d\xa5\x91\xf1\x40\x0c\x86\xe1\xd8\xa7\x8c\x8a\x52\x4e\x5c\x1a\x5a\xbe\x0d\xa3\x5a\xe2\x53\x5b\x5e\xdb\x3a\xa9\x62\x7b\x32\x45\x90\x0d\x51\x49\x9a\x20\x53\x96\x48\x48\xc3\xc6\x48\x51\x8c\x65\xb6\x8f\x02\x49\xb6\x77\x2d\xd7\xb3\x45\x1f\x99\x98\x97\xb5\xa4\x54\x02\x8d\x65\x2d\x05\x96\x82\x4d\xc8\xb5\x15\x61\xda\x49\x45\x6d\xc8\x69\x4b\x52\xda\x9a\x21\x96\x75\x14\x3a\x43\xd6\xbd\x17\xc2\x76\xe9\xee\xb5\x81\xae\x7b\xf8\xe7\x0c\x5f\xdf\x74\xa1\x1b\x78\xab\x47\xba\xe4\x0a\x1e\xb6\x35\xe2\x15\x61\xdb\x62\x30\xd5\x8d\xc9\xcb\xeb\x57\xe7\x1f\x5e\x8d\xc8\xb7\x57\x17\xf0\xff\x8b\x57\x6f\x5e\x99\xff\xbf\x7c\xff\xee\xdd\xab\x97\x1f\x8c\x1c\xf1\x05\x96\x8f\x37\x6a\x9c\x81\xae\xe1\x47\xb2\x4a\x2d\xa8\x58\x91\x59\xa1\x0d\x39\x28\x3f\x56\x99\x05\x45\x1b\x00\x8d\x63\xa3\x32\x7e\x76\x7b\xd8\x0c\xf0\xba\xd9\x24\xec\x9b\x81\x15\xf7\x6d\xb2\xd4\x6e\x31\xa9\x35\x92\xb4\xce\x3a\xa8\x4c\xf9\x68\xcf\x74\x83\x8f\x82\xbc\x96\x39\xb1\x8d\xc6\xa0\xf3\x64\xac\x8e\x6d\x52\x87\xf9\xf7\x04\x6f\x9d\x25\x72\x7e\xec\x73\x3d\x18\x49\xe4\x9c\xa8\x62\xea\x73\x70\x80\x9b\xc2\xd3\x5f\xb8\xc7\x2a\xa9\x0b\x23\x9f\x88\x13\xbc\xe5\x07\xaf\xbc\x13\x3e\x10\x8e\x7b\x06\xdd\xc1\x2a\x4f\x9a\x1b\xf5\x01\xbf\x38\x6b\x9e\x81\x13\x9c\x78\x5e\x7b\xe3\xa3\x30\xe8\x7a\xc7\x93\x38\xa2\x79\xbc\x86\xb3\xc0\xdc\x70\xcb\x01\x7a\x58\x32\x17\x3b\x39\x97\x83\xdb\x42\x17\x72\xc9\xf2\x84\x66\x18\x21\x0e\x35\x8b\x21\xf4\x08\x3e\x72\xc1\x32\x06\x79\x50\xae\xd3\x38\x13\x51\x22\xa1\xa6\x06\x72\xc6\x51\x75\xe9\x18\x8a\xe4\x0a\x0f\xda\x64\x9a\xf2\x84\x1c\x3d\x59\x32\x07\x61\xc6\x9d\xb0\x17\x03\x93\x37\x16\x66\xf1\x79\x1b\xa8\x34\x7a\xc9\x97\x91\x23\x9b\x65\x76\x34\x22\x47\xbe\xf6\x48\x6c\xa5\xe4\xa3\x2f\x8e\xca\x07\xc2\x3c\x25\x10\x92\xad\x4b\x68\x0c\xdf\x09\xb3\x19\x61\x83\x9d\xe3\xca\x7f\xba\xac\x1f\x63\x58\x9b\x35\x62\xc1\x1c\xaa\x03\x4d\x2a\x13\x59\xfb\x6a\x99\x62\xb7\xf3\x8b\x66\xfa\xc1\xeb\x1a\xd2\xd1\x31\x55\xcf\x02\x27\x67\x66\x37\x5c\x40\xda\x4d\x05\x79\xbc\xe3\x2d\x2c\x70\xc3\x73\x92\xd1\xdc\xa8\x22\xee\xc9\x6a\x8b\xb2\x2f\x76\x36\x28\x6b\x81\x04\x81\x7f\xa5\xa5\xd4\x7e\xe3\xdf\x78\x99\x50\xa5\x1a\x2c\xaf\x40\x08\xcc\xc0\x84\xe1\xc8\x84\x3a\xe7\x13\xd4\x9f\x5e\xd0\xe5\x96\x02\x05\x2d\x26\xad\x69\x3e\x67\x7a\xbb\x67\x84\x8a\xd5\xfb\xad\x25\xcd\xc6\xad\x8b\xa8\x8e\xdb\x9d\xa6\x4f\xe3\xb2\x80\xd6\x98\x0b\x3d\x96\xf9\x18\x5f\x79\x41\x74\x5e\x6c\xf2\x71\x69\x9e\x32\x59\xe8\x1b\x16\x49\xd1\x9c\xd1\x60\x9f\xeb\xcd\xd5\xd3\x21\xcd\xc3\x7a\x1b\xcf\x9d\x18\x11\x16\x21\x74\x8a\x59\x29\x63\x38\x0f\x63\xb5\x8c\xca\xfb\x37\x6f\x0f\xd9\x6c\x02\x69\xcc\xdb\x77\xf2\x3b\x4b\xf6\xc5\xdc\xcf\xd4\xce\x7c\xeb\x6b\x6f\x0b\xdd\xfd\xa5\x97\xde\x73\xb5\xfd\x69\x0b\x8c\xed\xa5\x30\x36\xae\x5f\x69\xaa\x8b\x35\x6c\xa8\xec\x8d\x25\x96\x37\x98\x52\x66\x65\xfa\x1b\x78\x2f\x34\xf2\xad\xe7\xff\x63\x4d\x11\x78\xce\x05\x2b\x4e\x88\x7d\xd1\x9c\x4f\x9d\x53\x8e\x0a\x24\x8d\x74\x01\xb9\xc9\x54\xdb\xc0\x46\x5b\x00\xe7\x57\x4d\xcb\x68\x54\x19\xb7\xa9\x89\x11\xcb\xb5\x7a\x43\x95\xfe\x36\x8b\xe9\x86\xec\xa5\x5a\xc0\xa2\xd2\x70\x60\x50\xb0\xbe\x13\x2c\x36\x14\xde\x82\x00\xc7\x23\x77\x86\xf4\x16\x38\x62\x57\x4f\x7e\x79\x80\xcc\xeb\x63\xf3\xa9\xe6\x59\x5f\x4b\x03\x93\xf3\x46\x02\x54\x0d\xd5\xd8\x35\x5b\xc3\x4e\x72\x18\x8d\x08\xf6\xa9\x49\xe3\x3e\x7c\xc6\x09\xa3\xa2\x39\x5c\xbe\x86\x51\xf0\x5c\x77\x1c\xb2\x1f\x20\x77\x0b\x6e\x44\x56\xcc\xf2\x52\xc4\x89\x50\x31\x4b\xd8\x86\x64\xaf\x03\x43\x49\xed\x17\x2e\xec\x07\x5a\x85\x39\x5d\x55\xdf\xf1\x06\x7d\x2b\x84\xdb\xe4\x89\x52\x58\xb6\xd2\x83\xd7\x9a\xea\xab\x02\xf1\x65\x9a\xc8\xe8\x16\x0b\x82\x41\x3e\x3f\xff\x07\xcb\x5d\xdc\x79\xd9\x0c\xcc\x76\xa8\x9a\xbb\xee\x9b\x0e\x6e\xae\x1d\x11\x8c\x62\xc6\x36\x00\xf4\xe3\xcb\xbc\xb4\x2c\x16\xc2\x66\xcf\x3d\x4c\xe8\xaa\x53\x54\x20\x5e\xbf\xe2\x39\x58\xd7\x59\xb0\x76\x08\xd4\x2b\xb4\x2a\x23\x4d\x6d\x76\xcb\xd9\x37\x9b\x33\x41\x7a\x0d\x47\xdd\x96\x8f\x82\x4f\x00\xf8\x44\xb4\xb5\xd4\xcc\xd6\xcc\x95\xb6\x96\xaf\x1d\x19\x2a\xa4\xbd\x90\xee\xa7\xdc\x66\xb4\x5e\x83\x0b\x7b\xf7\xf6\x6d\x4c\x03\x28\xaf\x2e\x3e\xbc\xb6\x85\x52\x3b\x79\x99\x44\x97\x82\x96\xd5\xe2\x21\x5e\xed\xb0\x49\x9e\xe8\x89\x9f\xc9\x7c\xa3\x02\xd3\xdf\xe4\xb7\xe7\x33\xed\x1c\xc8\x48\x9f\x9b\x63\xd7\xd6\x93\x77\x0c\xf5\xf2\xaf\x8c\x08\x25\x0b\xae\xb4\xcc\xad\x6b\x0d\x9a\x89\xe5\x14\x9a\x9d\x36\xc7\x80\xf5\x13\x0d\xf7\xd2\x4f\x81\xd0\x2c\x63\xd4\xf7\x19\xb2\xbc\x09\x1a\x05\xe5\x2c\x92\x79\xdc\x38\x31\xa7\xdd\x37\xca\x52\x8d\x9f\xef\x21\x37\x33\xa1\x4a\x7f\xf0\x73\x30\x02\x42\x4b\x6a\x5c\x15\x7f\xec\x12\xcb\xd5\xb8\x72\x2e\x52\x94\x3f\x4a\x42\x05\x5a\x35\x0e\x93\xc1\x77\x0b\x19\xe5\xda\x50\x9a\xdb\x6b\x5d\x77\x5e\x72\x0b\x96\xf8\x30\x33\x4f\x99\x52\x5b\x13\x8d\x6a\x41\x1a\x50\xd3\x97\xf8\x9a\xbe\xf6\x75\xc7\xec\x51\x40\xc0\x70\x4c\x57\x75\x6b\xb5\x19\xd5\x08\x88\x09\x68\x50\xf0\xc7\xea\xa0\x2d\xcb\x16\x54\xb5\x5d\x8c\x3f\x45\x3e\xc4\xb7\xf5\x71\x68\x39\x9b\x9c\x51\xb5\x2d\x55\xb2\x06\xdb\x69\xce\xd9\x8c\xbc\xa4\x29\x4b\x5e\x52\xd5\x27\x70\x81\x02\x4c\x08\x9b\xcc\x27\xe4\xf8\x3a\xf0\xb6\xbe\x93\xfa\xed\xb6\x9e\x0b\x3b\xaa\x03\xb4\x39\xd1\xf7\x7a\x96\x0f\x56\x12\x76\x9f\xdc\x03\xcf\xec\xc1\x33\xdc\x72\x42\x9f\xc4\xd9\xdc\x9e\xef\xbb\xe9\x3c\x56\x4f\x62\x91\x83\xc5\x2f\xda\xf7\x44\xee\x48\x66\xdc\x74\x0a\x9f\xf2\xf9\xdb\xb1\x24\x3f\xc4\x4d\xa3\xc9\x64\x6d\x75\x1f\x2a\x9a\x2b\x98\xfd\xc3\x00\x3b\x28\xd7\x6d\x66\xfa\xf2\xe6\xbb\x3e\xc5\x96\xc7\x4d\xb6\xb7\x1b\xb8\xf1\xf7\x2d\x72\xf9\x78\x3b\x17\x3e\x34\x91\x3f\x06\x47\x8b\xc1\x80\x87\x0c\xc0\xb8\x70\x5f\xb5\xb6\x0e\x5f\x69\x17\xfe\x9a\xd9\x8e\x66\xf6\x99\x0a\x7e\x9c\x40\xef\x38\xb6\xc4\x86\x8d\x90\xf0\xc1\x88\x60\xca\x1c\x8a\xd3\x2d\x9f\x6f\xa9\x50\xb5\x53\xa6\x76\x2b\xba\x3b\x95\x58\xb2\x7b\x6b\xdd\x43\xdb\x36\x18\xaf\xb6\x3a\x5b\x0b\x9d\xb8\x83\xb2\xb6\x5b\xe3\xe9\x30\xd8\x4e\xf1\xaf\xe3\x78\xcd\x06\xdc\xfa\x55\xab\xec\x6b\x5e\xb9\x06\x22\x8d\x8e\xe1\xc8\x50\xe0\x08\xea\x3d\x23\xed\xb6\xe4\xa9\x6a\xbf\xbd\xae\xd3\x40\x08\x37\xac\x62\x78\x5f\xcb\x2a\x0a\xde\x1f\xcc\x77\x56\xd0\x68\x3d\xde\x13\x28\x07\xb2\x13\x81\xee\xb7\x50\x01\x5e\xbb\xb0\xee\xf1\xf1\xad\x4d\x41\xa6\xad\x38\x76\x4f\x95\x59\x14\xcb\x97\x2c\xae\x78\xea\x6c\xdd\xf5\xea\xbd\xc0\x6f\x5b\x8e\x6f\xc1\x4e\xfe\xf9\xef\x5f\xfd\x6a\x3c\x1e\xff\xaa\x8c\xcd\x7a\x41\x68\xc6\xd9\x27\xcd\x30\x02\x6f\x72\xfb\x27\x68\xae\xb3\x7c\xfe\x2b\x40\x38\xf2\x12\xac\xcd\xce\xcc\x7a\xe1\x33\x08\x7f\xe5\x32\x30\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x97\x49\xc2\xf2\xf1\x9c\x89\xc9\x6d\x31\x65\xd3\x82\x27\x31\xcb\x61\x70\xf7\xe9\xe5\xb3\xc9\x9f\x26\xcf\x7e\x45\x7c\xbe\xa5\x91\xec\x95\xa6\x69\xf6\x02\x12\x3f\x7e\x65\x31\xce\x55\x64\xcb\x12\x2a\xd4\xc4\x87\x79\x4f\x22\x99\x33\x69\xfe\x97\xfe\x4a\x65\x2c\x32\xdf\xc6\x83\x46\x1a\x9f\xb1\xa6\x33\x3b\x45\x5b\xca\xac\x04\xd3\x98\xc8\x24\x85\x7f\xe3\xd2\x6d\x09\xb9\xab\xc4\xd6\xa3\x4b\xb8\xd2\xdf\xd4\x7f\x79\xc3\x15\xb2\xcb\x2c\x29\x72\x9a\x54\xa7\x0a\x3f\xa8\x85\xcc\x75\xa5\xd4\xea\x98\x70\x64\x8d\x8a\x8b\x79\x91\xd0\xbc\xf2\xd6\xaf\x5c\xcc\x43\x69\xae\x33\x5c\x72\x59\x89\xa5\x1b\x57\x82\x65\xb9\xd0\x2c\x7f\x29\x93\x22\x0d\xad\x63\xe3\x75\xb9\x72\xc6\x73\xa5\x6d\x8d\xbb\xaa\x53\xa1\x49\x2e\x86\xef\x07\x38\xfa\x77\x25\x05\xb8\x0b\xc9\xc4\x80\x7b\xb2\xf9\xa5\x1f\x9e\xfd\x18\xbc\x87\x7b\x58\x95\x57\x1b\x4f\x49\xc3\x8c\x69\x96\xe5\x72\x49\xb1\x42\xdf\x96\xb9\xb8\xe7\xd6\x3e\x7b\xbe\xfe\xc3\x86\x6f\x37\x0f\x59\xf1\xd1\x85\x43\x56\x7e\xd0\x0d\xd5\x0b\xf1\xe1\xe5\x73\x9a\x64\x0b\xea\xf2\x0c\x55\xb4\x60\x29\x2d\x37\x49\x66\x4c\x9c\x5f\x5d\x7e\xf7\xbb\x9b\xda\x0f\xcd\xf5\x0c\x0d\xca\xf9\xd4\xba\xa0\x2a\x3e\x75\xba\x98\x4f\x8d\x28\x4f\xc0\xda\x34\xd7\x84\xbc\x66\xa1\xce\x48\xe5\x78\xc6\x6b\xb7\x0d\x74\x82\x5b\x9b\x84\xab\x80\xc8\xd4\x08\x5d\xb5\xff\x57\x19\xf0\x59\x59\x99\x45\x78\x16\x5b\x98\x95\xd1\x3b\xce\xcd\x53\x2e\x5a\xd8\x35\x4d\x88\x41\x46\x96\xfb\x2a\x48\x98\xc6\xa9\x49\x90\x7f\x88\xa3\x81\xb9\x02\xf3\x64\x34\x53\x1a\xe2\x16\x72\xe1\x9a\xf8\x8e\x7c\x2f\xf2\x9c\x99\x71\xab\x19\x8c\x2e\x25\xa3\xa1\x45\xd9\x9c\x6b\x47\x42\x23\x99\xa6\x85\xe0\x7a\x75\x06\xd4\x90\x4f\x0b\xb3\x1b\x67\x31\x5b\xb2\xe4\x4c\xf1\xf9\x98\xe6\xd1\x82\x6b\x16\xe9\x22\x67\x67\x34\xe3\x63\x98\xac\xc0\x00\x9c\x34\xfe\xb5\xa7\xe3\x75\xa5\x73\x23\x87\x69\x92\x11\xaa\xb0\x86\x8a\x70\x3c\xe8\x35\x8e\xed\x90\x2b\x75\x47\xa1\xf2\xed\xab\x9b\x0f\xa5\x8b\x11\x2b\x05\x01\x84\x03\x27\x5b\x09\x6c\x03\x28\xe8\x25\x63\x0b\x7d\xbb\xd4\x4e\x9f\xd0\x69\xfe\x88\x12\x6e\x74\x12\x55\x4c\x53\xae\x95\x8b\x75\xc4\xc0\xc1\x97\xc0\x41\xa0\xec\x24\x5a\x6a\x26\xe4\x52\x94\xfa\xfd\xbd\x83\x1a\xa2\x82\xc6\x06\x7c\xed\x81\x1d\x32\xc0\xf5\x17\x1a\x14\x29\xc7\xa2\x36\xee\x4e\x70\xc6\x6f\x32\x16\xf9\xd3\xe0\xcf\xf4\x39\xd6\x4c\xb7\x85\xf5\x7d\x2c\xa6\xc4\x0e\xd1\xf0\xf2\x5a\x48\xc1\x16\xbd\x6e\xb3\x2e\x37\x26\x0d\xf4\xb4\xfa\x53\x43\xec\xc2\xb8\x1d\x1b\x21\x3b\x14\x32\xf7\xe9\xdd\x76\x20\xc7\x1b\xac\x76\x0c\xb5\xee\x3d\xc3\xb0\xf9\x18\xa0\x2b\x8b\x10\xb6\x90\xa3\x10\x04\x0a\x1b\xc8\x1e\x9d\xbb\x72\x86\x58\x1f\xfe\x2d\x15\x05\x4d\x1a\x03\xd8\xb6\xca\x77\x0e\x36\x9b\xeb\x2b\x6c\xaa\x70\xbb\x19\x74\xbd\xd6\x6a\xd8\x3a\x7b\x9b\x2f\xbd\xb5\xc4\xc4\xa6\x00\x2f\xc4\xc6\xce\xa5\x29\x82\x3a\xf2\x9b\x5c\x9a\x87\xc4\x20\x1d\x85\x67\x6a\x2d\x6c\x04\x19\xe8\xf6\xd0\x11\xa5\x59\xa6\xca\x22\x15\x5a\x92\x48\xa6\x59\xc2\x74\x95\xf7\x42\x50\x6e\xb7\x18\xa5\x7a\xcc\xed\x9e\x27\xd5\xd6\x2c\xb9\xd9\xe0\xaf\x1d\xa3\x65\xb7\xcb\xf9\xd3\x9a\x89\xc2\x50\xe1\x9b\x4a\x35\xf0\x0d\x2d\x58\xab\x47\x72\xf3\xbb\x61\x8d\x42\xcc\x46\xad\x76\xfb\x71\x31\x26\xae\xf0\x70\x6c\x03\x53\xe3\x20\x6d\x6d\x73\x68\xc9\x81\x71\x3a\x9b\x65\x95\xe6\x65\x96\x09\x29\x6b\x9d\x4b\x37\xbc\xbf\x53\x2d\x84\x84\xbd\x6d\xd1\x78\x55\x4e\x7e\x69\x01\x9a\xdb\x1e\x8f\x94\x64\x9c\x61\xec\xbc\x17\x87\x00\x60\x8c\xc6\xf6\xa6\x61\x78\x39\xf3\xf1\xe1\xd6\xde\x0d\x03\x94\xe2\x12\xf4\xe4\xa1\x18\xa8\x4e\xfe\xe7\xe6\xfd\xbb\xb3\xaf\xa5\x4d\x26\xb4\xad\x43\x00\x93\x53\x08\x69\x77\x1d\x32\x62\xa6\x0c\x7a\xde\x80\xf1\x3c\xa5\x82\xcf\x98\xd2\x13\x5f\x23\x44\xfd\xf0\xe5\x8f\x93\x30\x35\x60\xe4\x8a\x9b\x7b\xa1\xc2\xa2\x06\x90\x72\xb3\x98\xb2\xbc\xa6\x6f\x28\x9a\x49\xd7\x49\xe4\x0e\x26\xab\xe9\xad\xa1\xdf\x38\xd9\xc2\xe8\x32\xb7\xec\x05\x39\x42\xd5\xc4\x7f\xfa\x9f\x46\x0c\xff\xf7\x11\x39\xb9\x83\x90\xe7\x23\xf3\xe7\x11\x7e\xd0\xcb\x80\x61\x23\x9c\xf2\xc3\x18\x28\x9d\xf3\xf9\x9c\xe5\xd6\x77\x04\x66\x55\xe8\x19\xc2\xa1\x85\x67\xf9\xb0\xb0\xfd\xd0\xca\x9a\x9b\xf5\x89\xfc\xf0\xe5\x8f\x47\xe4\xa4\xba\x2e\xc2\x45\xcc\x3e\x91\x2f\xbd\xfb\x21\x93\xf1\xa9\x8d\xca\x52\x2b\xa1\xe9\x27\x33\x66\xb4\x90\x8a\x09\x0c\xf9\xd6\x12\xdb\xb8\x28\x09\x9e\xad\x24\x19\xdb\x06\xf7\xe4\x0e\xd3\x86\x1d\x28\x31\x0d\x17\x4a\x16\x55\x25\x64\x6c\x7f\x0b\x5f\x33\xdb\x36\x07\xd3\x8a\x91\xbe\xb0\xcf\x0b\x26\x36\x84\x55\x92\x54\x81\x9b\x64\x48\xdf\x82\x0a\x70\xb3\xd8\xf6\x30\x46\x9e\x9a\x6c\xf2\x49\xee\xc4\xf8\x6d\x26\xad\x06\xb1\xb5\x4d\x8b\xe0\x07\x12\x0a\x5b\x2f\x71\x9b\xc1\xec\x51\xbb\x20\x1f\xb4\xa2\xad\xd1\x47\xeb\xcb\xc2\x90\xa3\x07\x58\x1b\xf4\x8a\x3d\xdb\x7b\x69\x4e\xa4\xee\xc2\x09\x8e\x6f\xf0\xc0\x47\xf5\xb7\xcd\x71\xc1\x88\x43\xab\xb4\x06\x14\x2e\xa5\x31\x92\x40\x2a\x56\xf7\x8e\xc6\x06\x80\xe0\xb5\x8d\x56\x63\x6b\x97\x1b\x53\x11\x9b\x7f\x2b\xae\xb4\xb9\xbf\x37\xc4\xb6\x18\x42\xab\x50\xfa\xf6\xf2\xe2\x61\x90\xbb\xe0\x7b\x9e\xd6\x69\x21\xe2\x84\xbd\x91\xf2\x76\x43\x2a\x70\x65\x41\x5f\x85\x4f\x7b\xef\x1c\x6a\x69\x5c\x8c\x7d\x0c\x6d\xa0\xe5\x92\xac\x48\x90\xbc\x16\x22\xa3\xd1\x2d\x9d\x33\xfb\x51\x60\x23\x36\xc1\x1f\x35\x65\x50\x05\x7a\xad\x2b\xb7\x71\xf6\x68\x0d\xb0\xf3\xdc\x30\x4d\xc7\x17\x6d\xd9\x01\xea\xe6\xbd\x7b\xbe\xbd\xf8\x95\x2b\x12\xee\x35\x9b\x6d\x7c\xd0\x17\xb7\xdf\x94\x7f\x32\x86\xd6\x5e\x1b\x7f\x74\x85\x90\x1b\x1f\xd8\xed\x43\xac\xcf\xb3\x6d\x74\x53\xed\x35\xb7\x23\x8e\x60\x58\x28\x57\x1e\x83\x3b\x76\x17\xa0\x1b\xdb\x1d\x55\x40\x81\x92\xa5\x8d\xcc\x79\x90\x92\x48\xbb\xc5\xe6\x86\xf5\xee\x21\x3c\x87\x13\xdf\xe9\xb7\xdb\x29\x48\x37\xcc\x69\x10\xa7\x07\x71\xfa\x89\x8b\xd3\x9d\xce\xc0\xee\xd0\x83\xcf\x43\xc0\xee\xb4\xe8\xdd\xd1\xf6\x4f\x52\xe4\xee\xbc\xc6\x16\xc1\xff\x4f\x56\x08\xef\xb4\xd8\x96\x02\x79\xd3\x92\x7f\xce\x62\x79\x27\x18\xee\x8c\x87\x79\x82\x82\x7a\xeb\x05\x6e\x4f\x0a\x69\x58\x5f\x90\x8f\x51\xb3\x03\x9b\x49\x63\x7b\x71\x6f\xa7\x0d\xc5\xe4\x5d\xe2\x54\x2f\x15\x60\x7b\x8b\xbe\x6b\x15\x36\xb7\xb1\x2c\x31\x5e\x6d\x63\xe6\xba\x64\x8b\xe0\xb5\x25\xce\xbc\x8c\x2b\x3e\x38\x6d\x04\xaf\x0e\x99\x55\x6d\x13\x31\xca\x65\xb7\x49\x24\xe9\xb0\x64\x23\xc3\x67\xb9\x9c\xb6\xad\x58\x73\x0f\xab\x6a\x19\x65\x78\x60\x38\x3b\x64\xe7\xfb\xfd\xed\x6d\xb1\xbb\x92\x38\x1a\xe6\x8e\x35\xed\x2a\x91\x64\x7e\x3f\x8e\x15\x6c\xf2\x7d\xcc\x74\xef\xe0\xcb\x40\xac\xc6\x49\x8e\x9c\x07\xf3\x43\x5e\xb0\x11\x79\x4d\x13\xc5\x46\xe4\x5b\x71\x2b\xe4\x5d\x7f\xf3\xdd\x5e\x91\xa1\x61\xb6\x1f\x6c\xed\x85\x16\xb9\x42\xad\xa7\x52\x6a\xf7\x2d\x89\xfd\xa5\x7f\xc1\x59\x68\xac\x86\x3e\x2e\x04\xff\xa9\xa8\x2a\x2a\xde\xc9\x74\x52\x57\x61\x5e\xde\x7c\x07\xc8\x81\xea\xb6\xaa\x14\xb5\x35\x3f\xaa\xcd\x61\xd5\x6d\xf2\xa0\xb6\x2a\xaa\xd5\xc4\x70\xa3\xe8\x57\x55\xad\xc4\x96\x27\xac\x9b\x65\xb2\x22\x49\x26\xe4\x52\x1f\x2b\x33\x07\x1e\xd1\x24\x59\x19\xad\xa5\xd6\x2d\xec\xb0\x0c\xae\x16\x0c\x62\xed\xb0\x61\xc5\x15\xbe\x64\xc1\xeb\x0e\xd0\x68\x70\x62\xb1\x5d\xc7\x61\x25\x13\xb7\xf4\xc5\x6a\x98\xda\xb5\x7d\xdc\x21\x4a\xb8\xff\x25\x54\xed\xa0\xa8\x6b\x02\xd2\x08\x46\x66\xb2\x10\x31\xa1\x1a\xb6\x67\xcf\x39\x57\x7d\xb8\x0f\xe7\xf0\xdf\x2e\x3f\xf5\x63\x6c\x0c\x3c\xf0\x65\x1e\xdf\x16\xe1\xab\x24\x72\xec\x13\x8b\x8a\x20\xc6\x2b\x8c\xe1\xd8\xcf\xd6\xd8\x6f\xee\xeb\xa3\x24\xa6\x3e\x6c\x4e\x69\xdf\xa9\x93\x1e\x03\xda\x47\x75\xb7\x13\x15\x7a\x88\x3d\x6f\x53\xd8\xa9\x7d\x65\xa2\x26\xb4\x07\xae\x88\x4f\x4d\x99\x0a\x56\xb8\x86\xdf\x86\x9e\x50\xa8\xc0\x62\x98\x8c\xed\x8a\x00\x75\xaa\x16\x72\x6f\xca\xd8\x36\x3f\xf1\xad\x93\xdf\xcc\x07\x41\xb6\x1b\xaf\xc9\x76\x96\xff\x95\xb2\x1d\x34\xef\x29\x43\x69\x80\x49\xa6\x74\x05\xa1\x69\x69\x26\x73\x4d\xd1\xc1\x51\x88\x98\xe5\x4a\x53\xac\x51\xe2\xf2\xf2\x32\xb3\xe6\x05\x55\x84\x6b\x45\x22\x9b\x64\x88\x1b\x76\x4f\x99\x8c\x01\xb0\xaf\xcc\x0b\x5e\x44\xa8\x7c\x1c\xf9\x6a\x65\x63\xb6\xee\xc2\xf6\x89\x25\x74\x4b\x60\xd5\xa1\x74\xf6\x46\xb3\xac\x4e\x57\x83\x45\x08\x10\xc7\x97\x3c\xc6\x60\x24\x96\x11\x2e\xfa\x21\xaa\xbb\x1d\x38\xe8\x98\xd8\x7c\xac\xc6\xde\x4a\xb3\xf1\x81\x2d\x1a\xed\x6e\xa2\x2e\x33\x8c\x94\xdf\x75\xf6\xb7\x77\x9f\xf7\xab\x38\x90\x5c\x6e\x8e\x94\xc3\x6b\x6d\x57\x5d\xf6\xc5\x96\xdd\x0d\x62\x75\x21\x1a\x54\xe7\x56\x92\x5a\xb5\xda\x63\xf2\xd0\x55\x6e\x76\xa4\xfe\xed\x2c\xc4\x32\x0e\x02\x07\x5b\x3e\x06\x86\xc9\xad\xcf\xee\xca\x23\x7c\xe8\xba\x3a\x07\x56\x4c\x29\x2f\xe7\x42\xea\x65\xb0\xdd\x56\xf6\x96\x03\x95\x5b\xd3\xf3\x70\x2d\xec\xe3\x2d\xc7\x6c\x95\x00\xd8\x7f\xda\x1b\xcb\xaa\x69\xbf\x4d\x3c\x29\xa3\xb9\xe6\x51\x91\xd0\xbc\x3c\xfb\x40\xe4\xd7\xf2\x96\x3a\xcf\x59\x69\x9a\xeb\x56\x45\x16\x6e\xdc\x93\xbe\xe6\x22\x14\x5c\x58\x30\xe1\x9d\x7f\x98\x06\x46\xa6\x6c\x6e\x98\x67\x96\x25\x2b\x97\x63\x50\x46\xb0\x27\x5c\xe9\xb2\xf9\x1f\xc8\x02\x6d\x43\x21\x3a\x97\x6b\xf8\x45\xe7\xd1\xc9\x24\x8d\xa4\x98\xf1\xf9\xc3\x65\xd1\xbd\x7f\xf3\xf6\x25\x7c\x12\xee\x95\x39\x74\xfe\xfe\x5a\x06\x5d\x39\x49\xb8\x5d\x26\xc9\xf9\x1f\xca\x14\x39\x5b\xcf\xa1\x21\x3f\xce\x65\x5f\xb9\xfd\xdc\x33\xef\xca\x4f\xd3\x45\x65\x78\x56\xac\x32\x29\x14\x37\x32\x31\xd4\xcf\x82\x87\xb0\xfb\xc9\xfb\x37\x6f\xfb\x4d\xba\x1a\x32\xac\x86\x0c\xab\x21\xc3\x6a\xd7\x81\x6a\x91\x61\xe5\x4f\x33\xe4\x57\xb9\xb0\x3d\xf3\x6f\x9b\x26\x54\x1e\x77\x5f\xd3\xba\xed\xc7\xb7\xcb\x87\x33\x46\x0d\x68\x76\x47\x16\xbe\xb6\x0f\x96\x5d\x78\x2a\x79\xba\x96\xcc\x80\x2e\xfe\xfe\xcd\x5b\x3f\xee\x3d\xe4\x44\xc4\x5c\x99\xcf\xbc\x94\x19\x67\xf1\xcb\x9b\xef\xda\x35\x69\xbe\xa8\xbf\x55\xc9\xe9\xc0\x1f\xcd\xcc\x8f\x15\x39\xc2\x87\xc8\xcb\x9b\xef\x8e\xdc\x42\x60\x23\xca\x46\x5e\x3e\xab\x8d\x50\x1d\x0a\x04\x48\xff\x47\x04\xa3\x90\x68\xf5\x76\x5c\x69\x74\x24\x85\xed\x3a\xb3\xa0\x8a\x4c\x19\x13\xc1\xa0\xa8\x02\xbf\xb7\x4f\x43\x29\x50\x1b\xa7\x04\x15\xbc\xb1\xe8\x7f\x19\xd5\x30\x21\xdf\x1b\xd1\x26\x67\x4c\x98\x65\xc4\x23\xd8\x02\xac\x90\xcb\x80\xf7\xa2\x4b\x2f\x58\x98\x3a\x82\x15\x41\x19\x9f\x0d\x93\xdc\x9e\x31\xd2\xa4\x93\xb6\x48\x7c\x2a\x31\x7d\x63\x01\x99\x7b\xc4\xf6\x87\xb0\x2b\x1f\x95\xd6\x64\x7f\x54\x9c\x9b\x11\x90\x48\x30\x42\xcd\xd9\xd6\xde\x69\x16\x88\xd1\x65\x33\x80\xf3\xab\x4b\x5f\x46\x76\x42\xc6\xe3\xb1\x8d\x17\xd3\x79\x11\x69\x2c\x0d\xa5\xb1\x91\x91\x19\x35\xe6\x39\x70\x2b\xc5\xc0\x12\xe4\xfa\xb5\x59\xec\xc4\x20\x2f\x08\xc8\x9c\x58\xeb\x55\x09\x8a\x09\xa9\xc6\xec\x19\x30\x90\xd7\x52\xda\x1d\xc2\x0f\xfe\x93\x9c\x9d\x91\xeb\x9a\x75\x7c\x6a\x84\x56\xdb\x1c\x05\x84\xff\x99\x94\xc7\x55\x3b\x19\x9b\x98\x17\xbf\x11\xf2\x4e\x34\x7d\x1a\xbe\x45\x73\xf6\x82\x7c\x3c\x3a\x5f\x52\x9e\x18\xfc\xfd\x78\x34\x22\x1f\x8f\xae\x6c\xac\x32\x17\xf3\x8f\xb6\xd7\xc1\xc7\xa3\x0b\x06\x0d\xb8\xe3\x8f\x47\x66\xd8\xdf\x42\xf7\xb6\xb7\x2c\x9f\xb3\x6f\xd8\xea\xbf\x60\x30\x7f\xfb\x06\x3b\xbd\xad\xfe\x0b\x1b\xbd\x99\xfb\x86\x5a\x7d\x58\x65\xec\xbf\x52\x9a\xf9\x1b\x6f\x69\xe6\x5f\x0e\xc2\x30\x7e\xf8\xd1\x90\xf9\xe5\xf3\x49\xb9\x9d\x7f\xfb\xbb\x92\xe2\xc5\xc7\xa3\xa0\x7e\xa7\x4c\x0d\x5a\x64\x7a\xf5\xf1\x88\x54\xbe\xfa\xe2\xe3\x11\x7c\xd7\xdd\x77\x93\x7c\xf1\xf1\xc8\x7c\xc9\xdc\xce\xa5\x96\xd3\x62\xf6\xe2\xe3\xd1\x74\xa5\x99\x1a\x3d\x1f\xe5\x2c\x1b\x99\x53\xfd\x5f\xe5\x17\x3e\x1e\xfd\x8d\x7c\x14\x66\xb2\x10\x56\x80\x3b\xa9\xc8\xbf\x9b\x1b\x63\xf4\x60\x13\x5b\x77\x34\x6c\x7c\x74\x57\x71\x2c\x34\x9a\xef\x63\x3a\x3b\xb0\x3b\xf5\xde\x85\x42\xd7\x5f\x2c\xdb\x56\x1e\x16\x0e\x62\x0f\xaf\xef\xfc\xee\x75\x51\xb0\x3b\xa3\xf2\x59\x8e\x8a\x01\x98\xf1\x84\x60\x6b\x44\x4c\x40\x34\x72\x12\xb8\xcf\xa1\x65\x8b\x20\x85\x72\x32\x5b\x55\xbb\x35\x84\x03\x0f\xbc\x1d\x06\xc4\xbe\x28\x62\x99\x36\xa7\xeb\x81\x0a\x9a\x76\x2b\x0b\x9a\xae\x99\xf6\xf7\x0f\xdb\x40\x50\x5b\x1b\x3f\x75\x6d\x7d\x71\x59\x07\x2e\x3e\xa5\x9f\xde\x40\x77\xa7\x17\xe4\x77\x5f\xfe\xf1\x0f\x7f\xda\x64\xd7\x9d\xa2\x36\xff\xf5\xd6\xbc\xe5\x06\x30\xac\xbf\x58\xb7\xad\x4e\x9c\xf0\x39\x29\x93\xa2\xcb\x4e\xaa\xd5\x98\x1d\xc5\x34\x99\x82\xfb\xaa\xc8\x0c\x5c\x5e\xbb\x54\x55\x11\x61\x3c\x61\xe3\x60\xdc\x13\xf0\x64\x45\x9e\x7f\x89\x3d\x8d\xe0\xd3\x6b\xe4\xfb\x87\x4f\x3f\x4e\x1a\xa6\xcc\x15\xf9\xcf\x51\x6d\x3e\x46\xe0\x29\x80\xe3\x19\xc4\x41\x4f\xb5\xd1\x55\x6d\xc4\xf1\x06\x36\xc8\xfc\x7c\x77\x6d\x5c\x87\xfe\x1e\x7f\xf8\xfd\xe6\xfd\x75\xed\xd7\x9f\xf5\xe1\x54\xb4\x4e\x43\x2f\x05\x50\xac\x61\x4f\x53\x48\xe8\x0f\xe2\x46\x42\xd4\xd6\xdd\x22\x7f\xc8\x55\x2e\xe3\x22\x32\xba\x98\x9c\xb9\xb0\xf4\x28\x24\x50\xd0\x58\xc6\x9c\x06\x54\xb1\x09\xfb\x64\x80\xce\xca\x0e\x43\x46\xdf\x65\x54\x70\x31\x57\x65\x15\x47\x20\x20\xc8\x75\xef\x16\x0c\x58\x8f\x0e\xfb\x71\xc2\xac\x14\x8f\x21\x66\x9e\x92\x79\x41\x73\x2a\x34\xc3\x4e\x0d\xd8\x93\x13\x15\xcc\x92\xe4\xd1\xa0\x30\xa6\x3d\x8d\x78\x54\x91\x58\x99\x29\x5a\x55\x10\x7b\xb9\xf6\x76\x54\x9f\x3f\xfb\x72\xeb\x96\xfb\xe7\x36\x5b\xd8\xa9\xd6\x2c\x17\x2f\xc8\xff\xfd\xe1\x7c\xfc\xff\xd1\xf1\x3f\x7e\x3c\xb1\xff\x78\x36\xfe\xcf\xff\x1d\xbd\xf8\xf1\x8b\xe0\xcf\x1f\x4f\xff\xfa\x9b\x3e\xec\xad\xaa\xd7\xc8\xaa\x56\x40\xdb\xdd\x31\xe6\xc8\x7c\x75\x5b\x57\xae\x31\x39\x82\x29\x6d\x7f\xc6\x4e\x77\x9b\x86\xd1\x0e\x48\xba\x1e\xd0\x65\x74\xa7\x12\xcf\x80\xe2\x19\xb1\x74\x62\xc5\xdb\x49\x24\xd3\xb3\xc0\xbc\x60\xe4\xea\xb7\x54\xac\x48\x49\xd6\x50\x28\xad\x63\xba\x82\x2c\x33\x1a\xe5\x52\xa9\x8a\x89\xf8\x96\x11\x2f\xb9\x22\xb1\x9c\xb2\x88\x82\x20\x9e\x4f\xb9\xce\x69\xbe\x0a\xf4\x0e\x57\xe1\xbe\x50\x6c\x56\x24\xe4\x44\x31\x46\x26\x42\xc6\x6c\x9d\xba\x9e\x22\x0d\xa5\x53\x9e\x70\x0d\x29\x21\x31\x33\x7a\x76\xc2\xad\xfc\xef\xdc\xd7\xae\x05\xee\x9c\x7d\x22\x5c\xfb\x36\xf4\x5c\x91\x93\x58\xa8\xe7\xcf\xbf\xfc\xdd\x4d\x31\x8d\x65\x4a\xb9\x78\x9d\xea\xb3\xd3\xbf\x9e\xfc\x54\xd0\x04\xd2\x57\xde\xd1\x94\xbd\x4e\xf5\x41\x91\x62\x55\xb6\xf8\xfc\x0f\x2d\x4e\xd1\xc9\x0f\x78\x56\x7e\x3c\xf9\x61\x6c\xff\xf5\x85\xbb\x75\xfa\xd7\x93\x8f\x93\xad\xbf\x9f\x7e\x61\xd6\x10\x9c\xc0\x1f\x7f\x18\x97\xc7\x6f\xf2\xe3\x17\xa7\x7f\x0d\x7e\x3b\xfd\xcd\x60\x61\x2f\x4d\xe6\x81\xee\xf5\x60\x96\x76\x3b\x86\x57\xa4\xea\x16\xf7\xfa\xef\xeb\x96\xf7\xb5\xc9\xa3\x05\xbe\xa1\x82\x5d\x54\xf9\x48\x60\xa3\xaf\x0f\xd1\xb2\x9c\x5d\x5f\xe6\xfa\xfa\x1a\x51\xd2\x45\xdc\xf0\x6a\x3e\xd0\x7a\x43\x7c\xfe\xb6\xf6\xfc\xdf\x6c\x76\x48\x60\xb4\x02\x4b\xe6\xaa\x1a\xdd\x22\xc1\xf2\x53\xad\x17\xe3\x93\x05\x1b\xec\x3a\x83\x0f\x60\xf0\x01\x0c\x3e\x80\xa7\xe1\x03\xa8\x1f\x79\xf0\x05\x40\x4b\x54\x15\x58\x92\x69\x9c\x72\xb1\xe1\xf8\x6f\x3f\xf7\x96\x3a\x8c\x48\x26\x8d\x2c\xc3\x21\xf6\x5a\x2e\x59\x9e\x73\x88\x79\xc3\x77\x72\x56\x76\x20\x0c\xe3\xcf\x7b\xb2\xc0\xc6\x2c\x4b\xe4\x2a\xdd\x54\xb7\xfc\x7e\xc2\x89\xed\x22\x7b\x8e\x60\x1e\xac\xbe\x83\xd5\xf7\xe7\x62\xf5\x1d\x4c\xb9\x83\x29\x77\x30\xe5\x36\x5c\x83\x29\x77\x30\xe5\x0e\xa6\xdc\xc1\x94\xbb\x76\x0d\xa6\x5c\xfb\xcc\x60\xca\x1d\x4c\xb9\x0f\x6d\xca\x2d\x2f\x55\x29\xe7\xfb\x40\x3a\x65\x9b\x38\xa7\x35\x6d\xde\x36\x56\xb5\xfa\x7c\x55\x2d\x6f\xd0\xe5\xb9\x56\x2e\xcd\x10\xd4\xf6\x49\xd8\x80\xed\x61\xbb\xcd\x0f\x41\x53\x83\xfa\x3c\xa8\xcf\x43\xd0\x54\x79\x0d\x9a\xb6\xbf\x06\x4d\x7b\xd0\xb4\x07\x4d\x7b\xd0\xb4\x07\x4d\xbb\x7e\x0d\x9a\x36\x5e\x83\xa6\x3d\x68\xda\x0d\xd7\xe7\xa1\x69\x6f\x0b\x9a\x9a\x19\x94\x75\x37\x77\x45\x4d\x91\x30\x9c\xe6\xcb\x21\x9c\x66\x08\xa7\x19\xc2\x69\x86\x70\x1a\x77\x3d\x74\x38\x4d\xd5\xfc\x86\x31\x2f\x15\x73\x1b\xe0\x6c\x96\xcb\x25\x8f\x99\xaa\x05\xdf\xf8\x32\x7b\x01\x97\x49\xa1\x31\x5f\x19\x50\xc3\x1e\x26\x9c\x66\xb0\xcd\x0d\xb6\xb9\xc1\x36\x37\xd8\xe6\x82\x6b\xb0\xcd\xf9\x6b\xb0\xcd\x0d\xb6\xb9\xc1\x36\x37\xd8\xe6\x06\xdb\x5c\xfd\x1a\x6c\x73\x78\x0d\xb6\xb9\xc1\x36\xd7\x70\x7d\x1e\xb6\xb9\x10\x83\x86\xac\x8a\x41\xf5\x1c\x54\xcf\x27\xa6\x7a\x0e\xfa\xe4\xa0\x4f\x0e\xfa\x64\xc3\x35\xe8\x93\x83\x3e\x39\xe8\x93\x83\x3e\xb9\x76\x0d\xfa\xa4\x7d\x66\xd0\x27\x07\x7d\x72\xc8\xaa\xe8\x98\x55\xf1\xfe\xcd\xdb\x20\x92\x03\x23\x3c\x02\xcc\x82\x8e\xda\x50\x69\xd7\xf1\xe4\xc1\x0b\x3b\xa8\xc2\x83\x2a\x3c\x78\x61\xc9\xa0\x35\x0f\x5a\xf3\xa0\x35\x0f\x5a\x73\x7d\xe3\x06\xad\x79\xd0\x9a\xab\x5b\x39\x68\xcd\xdd\x81\x36\x68\xcd\x83\xd6\xdc\xb0\x15\x3f\x0f\xad\x79\x28\x2b\xab\x65\x0e\xe5\x62\x1f\xbe\xa4\xec\xd7\xbe\xa1\xe7\x7a\x39\x59\xf8\x6d\x63\x29\x59\x9c\x30\xfc\xd4\x54\x46\x56\x22\x56\xae\xd7\x8f\x75\x2d\x44\x1f\xa1\x76\x2c\xb6\x01\xb2\x8a\x43\x21\x38\x88\x3d\x69\x91\x68\xae\x99\xa0\x22\x5a\x01\x9b\x7d\xff\xe6\x2d\x49\xa9\xa0\xf3\xa0\x93\x8f\x9a\x90\x4b\x0d\xf4\x46\xe7\xbe\x75\x93\xed\x36\xe4\xf3\x3e\xc2\xe6\x46\x50\x7d\xc2\xf7\x17\x02\x85\xc3\x09\x01\x2c\x06\x01\xd0\xb0\x0f\xe8\x45\x14\xb6\x21\xfa\x55\xfd\x80\x0f\x99\x30\x43\x26\xcc\x90\x09\xf3\x44\x32\x61\x80\x7e\x6c\x6c\x30\x57\x21\x32\x7b\xb4\xdd\x8a\xd9\x8c\x16\x49\x43\x2b\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x0b\x7c\xb2\x83\x7d\x55\xb1\x84\x45\x5a\xe6\x3b\x9b\xd4\xdd\xd8\x07\xed\x1b\xb8\xcc\xca\xd2\x8e\xd5\x76\xba\xd5\x62\xa5\xbb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xa7\x0c\x2c\x8d\x1b\xec\xc2\x6b\xb3\xaf\xbf\x84\x27\xca\xb5\xd8\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfe\xee\x62\xdd\xc4\x5d\x5d\xe0\x26\xab\x34\xd9\x6e\x99\x5e\x9b\xfa\xf9\x96\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\xb7\x6c\x85\xf4\xb1\x92\x9c\x65\x1e\xce\x19\x50\x53\xd8\xcc\x5b\xb6\x82\x87\x2c\xb1\xdc\x21\x60\xf6\xd2\x35\xfc\x96\x6d\x82\x10\xfe\xee\x26\xbb\x59\x40\x6d\xd5\x9f\xfb\x96\xad\xb6\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xd6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x63\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x29\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x71\x43\xea\x0d\x3e\x5c\x48\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x37\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x2c\x40\xf3\xf4\xa5\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xcb\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\xf6\x0b\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\xdb\xe8\x0a\x5e\x3b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x1c\xa4\xff\x84\x55\x7e\xb3\xad\xc0\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x96\x34\x31\xf4\x0e\xec\xf3\x84\x25\x48\xfd\x8c\x90\x5e\x23\xec\x23\x72\xb7\x90\x0a\x89\x19\x5a\xa9\xb8\x22\x47\xb7\x6c\x75\x34\x5a\xdb\xda\xa3\x4b\x61\xdd\x54\x6b\x9b\xe9\x89\xa8\x14\xc9\x8a\x1c\xc1\x6f\x47\xfb\xf3\x82\xad\xc4\x92\xc6\x68\x3e\xa0\xc9\x55\x0b\x6a\xb6\x75\xdf\xaa\xce\xe5\x4d\x7d\xf6\x6b\x7c\xbd\xfe\x8a\x23\x7e\x98\x91\x1b\xea\x26\xf0\x24\xa1\xf8\xa8\x75\x02\x43\x2b\x54\x34\x8f\x60\xbf\x57\x88\x97\xf6\x70\x3e\x51\xa7\xb8\xb3\x46\x1e\x75\xb0\x07\x4d\xaf\x73\x83\x77\xa3\xd0\xf3\xe8\x0a\x13\x87\xe3\xf3\xab\xcb\xdd\x9d\x75\x6f\xe0\x15\xa2\x59\x92\xa0\x0b\xdb\xc8\xac\x5a\x5a\x99\xb5\x51\x84\xc9\x82\xf1\x03\x25\x7f\xe3\x64\x9b\x9a\xb5\xc2\xaf\x20\x0a\x79\x25\x76\xf7\x5c\x3f\xd4\x5e\xb0\xe4\x8e\x7d\xca\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\xd8\x75\x42\x3e\x8d\x6f\x8b\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xf5\x23\x50\x17\x61\x77\x41\xe9\xe8\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x6a\xad\xb3\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x5b\x5e\x1b\xd2\x1c\x4d\xf2\x51\x38\x41\xfb\x45\xd9\x0d\x18\x08\x05\x04\x4b\xb8\x94\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x25\x73\x6a\x2c\xb2\x04\xc3\x0c\xb2\x05\x55\xac\xd4\xc1\x54\x11\x45\x8c\xc5\x2c\xc6\x1f\x2c\x2b\x61\xb3\x19\x8b\x34\x5f\xb2\x64\x05\xc6\x7f\x85\x22\x89\xff\xbe\xc1\x6c\xfc\x7c\xb9\xe0\xda\x17\x05\xfb\xa4\x9d\x92\x4e\x38\x28\xe1\x55\x4b\x45\xee\x97\xbb\xa0\x8a\xcc\x28\x4f\x8c\x5e\xf7\x51\x90\x0f\x2c\x5a\x5c\xe5\x6c\xc9\xd9\xdd\xb7\x42\xd1\x19\x7b\x4d\x79\xf2\x5a\xe6\x77\x34\x8f\x03\x18\xdc\xc7\xf2\xcd\xac\xfc\x6f\x38\x25\x07\x97\x73\x4f\x38\x93\x55\xd0\x97\xd9\x7a\xc6\xcc\x7a\xef\xdc\x02\xaf\x12\x03\x31\x70\xb8\x52\xa3\xd0\x7a\x8c\x22\x39\x9b\xb1\x9c\x09\x73\x9e\xa8\x1b\x3f\x78\xc9\xb3\x87\x88\x6a\x9a\xc8\x79\xd9\x52\xda\xea\xbd\xe8\x18\xa3\xf0\x31\x07\x3d\xe7\x06\x62\x46\x54\x80\xfe\x1f\x78\x76\x03\xa3\xd1\x47\x41\xbe\x3f\xbf\x7e\x77\xf9\xee\xeb\x17\xc0\x55\xb6\x41\x78\x1d\xaf\xb9\x22\x05\x3c\x15\x58\x3d\x54\x91\x68\x83\xe2\x85\xf0\xfe\xa2\x29\x5b\xd0\x25\x37\x67\x20\xb7\xf6\x90\x25\xc3\x3e\xe2\x46\x0d\x26\x89\x54\x66\x9c\x84\x29\x45\x56\xb2\xc0\x20\x9e\x98\xb1\x0c\x5d\xdc\x4a\x53\x01\xdd\x4b\xac\x3f\xa3\xbe\x08\x32\x65\xe6\x57\x67\x11\x5b\x3b\x5d\x4d\xfe\x84\x1d\x94\xc3\x69\xba\x1b\x14\x59\xb2\xd5\xe1\x31\xde\xf2\x96\xf9\x75\x1b\x88\xab\x6a\x7f\xfb\x68\x29\x54\xfc\xb7\xf5\xdb\x0e\x1f\xbc\xee\xae\xfb\x6f\xd6\xa3\x30\xf0\xe3\x5b\xc4\xc2\x0e\x1a\xff\xf6\x88\xaa\xca\x2a\x83\xe0\x9a\x9a\xec\xdd\xc4\x39\x83\x20\xa1\x3e\x99\xcd\x10\xaa\x35\x84\x6a\x0d\xa1\x5a\x6b\xbf\x0f\xa1\x5a\x43\xa8\xd6\x10\xaa\x35\x84\x6a\x0d\xa1\x5a\x43\xa8\xd6\x10\xaa\x45\x86\x50\xad\xf2\x99\x21\x54\x6b\x08\xd5\x7a\xbc\x04\xa7\x40\x2b\xdd\xa9\x60\xbe\x29\x9f\x45\xe9\x44\xbb\x60\x28\x77\x32\xab\xa2\x61\x5d\xe5\xb4\xa7\xd8\xf0\x63\x3b\x4c\x67\xab\x72\x1b\xa1\x4b\xb4\xb7\xe2\x56\xed\xb7\x81\xd9\x64\xcd\x35\xee\x39\x50\x65\x51\x4f\xd5\x4e\x5b\xf5\x2c\x5c\xb3\x59\x47\xc7\xc2\x35\x9b\x85\xa6\x36\x04\x4c\xd5\x9f\x60\xc3\x55\xbc\xc3\xe1\x1e\x62\x07\x36\x07\x38\x35\x2e\xc1\x08\xfb\xce\x5e\x6a\xf1\xd1\xae\x61\xa3\x23\x74\xe7\x91\x06\x7e\x7c\x45\xf5\xa2\xd5\x0c\x8e\x2f\x2d\xd8\xc0\x6b\x08\x7e\xdc\x8c\xb3\x88\x55\x62\xa8\x40\x8e\x63\x34\xb6\x37\x8d\xe0\x93\x33\xfb\xdb\x08\x25\x0e\xeb\x2b\x2d\x63\xac\x8c\xd0\x44\xa8\x21\xc4\x3c\x26\xff\x73\xf3\xfe\xdd\xd9\xd7\xd2\xca\x0a\x46\x9b\x51\xb6\x43\x52\xca\x84\x1e\x11\x55\x44\x0b\x42\x95\x99\x9a\xd1\x6f\x6f\xc0\xf4\x90\x52\xc1\x67\x4c\xe9\x89\x1d\x8d\xe5\xea\x87\x2f\x7f\x9c\x54\xcd\x1d\xdc\x3a\x54\x5d\x24\x92\x45\x00\x38\x1b\x66\x31\xfe\x5d\x10\x5a\x61\x4a\x99\x8c\xed\xa4\xef\x60\xb2\x9a\xde\x32\x22\xed\x64\x0b\x06\x4c\xe1\x05\x39\x32\x68\x12\x7c\xfa\x9f\xe6\x60\xfd\xfb\x88\x9c\xdc\x81\x49\xff\xc8\xfc\x79\x84\x1f\xf4\x81\x63\xe6\x5e\xc0\xf1\xed\x87\x51\xbe\xcf\xf9\x7c\x0e\xe2\x16\xd8\x6d\x97\x4c\xe8\x53\xe0\x6f\x33\x22\x64\xf0\xb0\xb0\xfe\xb1\xd2\x2b\x56\x9f\xc8\x0f\x5f\xfe\x78\x44\x4e\xaa\xeb\x32\x22\x28\xfb\x44\xbe\xf4\x9e\xb0\x4c\xc6\xa7\x4e\x6b\x5d\x09\x4d\x3f\x81\x62\xb0\x90\x8a\x09\x74\x24\x68\x89\xd6\x58\x25\x8d\xf2\xc9\x92\x64\x8c\x02\x66\x4c\xee\xd0\x00\xe7\x40\x89\xce\xe4\x8c\xe6\xba\x16\x56\xf7\xe1\xfd\xc5\xfb\x17\xf8\x35\xb3\x6d\x73\xe1\xb4\xdc\x19\x17\x34\xb1\x66\x6d\x2f\x1f\x9a\x89\x14\xb8\x49\x5a\x5a\xd5\xd6\x59\x74\x67\x85\x2e\x72\x36\xa9\x87\x59\xb5\xc6\xf8\xa6\x18\xb7\x66\x64\x87\x58\xb7\xfa\x41\x7b\xc4\x48\xb2\xd6\x4b\x14\x1b\x3c\xad\xeb\x4b\x7c\x17\xe0\xe0\xd6\x25\x96\xa4\xd9\xac\x32\x96\x91\x32\x0b\x8c\x58\xa6\xd5\x99\x5c\x1a\xd2\xc9\xee\xce\xee\x64\x7e\xcb\xc5\x7c\x6c\x90\x6c\x8c\x3b\xaf\xce\x80\xc5\x9c\xfd\x1a\xfe\x77\xd0\x8a\x80\x4f\xb5\x5f\x16\x06\xb4\x3e\xc0\xda\x80\x7d\x9e\xed\xbd\x34\x27\x5f\x76\xe1\x04\xc7\x37\x4e\xf9\xab\xbd\x6d\x8e\x0b\x3a\xc2\x6d\xa4\x6b\x40\xe1\x52\x1a\x23\x09\xa4\x62\x75\xef\x68\x6c\x00\x08\x3a\x7e\xb4\x1a\xdb\x50\xf4\x31\x15\xf1\xd8\xcb\xd7\xd1\x6a\x6f\x88\x15\xbc\xe5\x01\xfe\xf6\xf2\xe2\x61\x90\xbb\xe0\x9d\x4e\x6b\x5f\x89\x04\xa4\x12\x7c\x4e\x93\x6c\x41\xfb\xea\xb7\x30\x84\xa0\xc3\x35\x84\xa0\x0f\x21\xe8\x43\x08\x7a\x79\x3d\x91\x10\xf4\x21\x84\x7c\x08\x21\x1f\x42\xc8\x37\xff\x3c\x84\x90\x0f\x21\xe4\x43\x08\x79\xfd\x1a\x42\xc8\x87\x10\xf2\x21\x84\x7c\x08\x21\x6f\xb8\xfa\x28\x55\xf7\x19\x06\x5f\x0e\xce\xb1\xcf\xc3\x39\x36\xb8\xbb\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x7b\x60\xfc\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x70\x77\x3d\x51\x77\x57\xa7\xce\xe2\x9f\x75\xe1\xac\x87\xaf\x99\x05\xb7\xd6\xcb\x65\x6d\xac\x94\x65\x8b\x64\xad\x55\xc2\x2a\x8b\x60\xbd\xc4\x5c\xca\xfb\xaf\x80\x55\x35\x00\xba\xa6\xcc\x1d\x1a\xb1\x0f\x0e\xbd\xc1\xa1\x37\x38\xf4\x76\x9d\x92\x0e\x0e\x3d\xf0\xe5\x85\x47\xc1\xaa\x23\x65\x0a\xc7\xfb\x66\xd7\xc6\xe6\x4f\xb7\x37\xad\x58\xab\x4a\xf8\x79\x97\x8b\x52\x7e\x3f\xb0\xb0\xc0\x49\x31\x1b\x1a\xc9\x34\x93\xc2\x20\x46\x3f\xce\xc5\x72\xbc\x16\xd9\xaa\xee\x51\x7b\x7f\xca\xc2\x60\x72\xeb\xd9\x4a\x33\xa9\x58\xc5\x8e\xbb\x87\xe2\xbd\xdd\x35\x35\x46\xa7\x8f\x33\xa1\xed\xa1\xb8\x57\xde\x6f\x25\x8b\xbc\x09\xdf\xb0\xae\x49\xf0\x3c\xfd\x54\xb0\x1c\x5b\xe7\x97\x0e\x9c\x12\x28\xce\xe4\x8a\x2e\xa9\x0a\x58\x8e\xb7\x6c\x66\x4b\x30\xb5\x59\x2a\xe9\xe0\x8f\x5d\x5b\xf5\x83\xfa\x64\x49\x6b\xff\x49\x0b\xef\xc9\xd3\xf6\xcf\x92\xb6\x3e\x5a\xd2\xd2\x4f\x4b\x5a\xf8\x6a\x49\x3b\x7f\x2d\x69\xed\xb3\x25\x6d\xfc\xb6\xe4\x9e\x7d\xb7\xa4\xbd\x53\x93\xb4\xf6\xe1\xae\x4d\xfa\xc9\xf9\x71\x3b\x2e\xbb\x8d\x3f\x77\x6d\xd1\x83\x4f\xb7\x06\xea\xdd\x7e\x5d\xd2\xd6\xb7\x4b\xda\xa7\x27\xed\xf4\xf1\x92\xc1\xcf\xdb\x8d\xbf\xec\x24\xba\xdd\xfc\xbd\xad\xf6\x32\x67\xb3\x76\x4e\xfa\x6b\x36\xc3\xc5\x04\xe2\x44\xe9\xe8\x90\x1b\x65\x88\x52\xea\x18\x59\x2a\xea\x8a\xe7\x54\x64\x97\x87\x89\x88\xba\xe6\xd1\xe2\x3a\x34\x5e\xd1\xc0\x96\x05\x34\xd2\xcd\x76\x44\x98\xc8\x79\xb4\x70\x93\x35\x42\xae\xf5\xac\x6d\x2f\x78\x12\x4e\x7b\xc7\x86\xb6\x63\x67\xbb\xbd\x39\x0d\x0b\xdd\xc3\xa7\x13\x4e\x7c\x27\xf1\xde\x5e\x4d\x66\xc3\xa4\x82\x4a\x20\xb5\x0c\x7c\xab\x87\x57\xb2\xd4\x3d\x06\x3d\x60\x68\x4b\xf3\x74\xcb\xd9\x86\x93\xa5\x2e\x41\x75\xbd\x66\x8b\x28\x27\x6f\x1d\xb2\x5b\x72\xed\xc3\x65\xb4\x10\xbb\xda\x0b\x5e\x3b\xeb\x81\x84\x0f\x6e\xac\x0c\x52\x5e\xed\xa5\xaf\x6e\xd5\x42\xca\x6b\xcd\x0f\x7e\x48\x75\x90\xbe\x38\x5d\x79\xb5\x2d\xd3\x51\x05\x03\x3a\xe1\x7b\x05\xc1\x1d\x85\x68\x93\xe9\x5a\x0c\xc2\xa3\x2c\x72\x67\x55\x92\x0d\xab\x3b\x3f\xb4\x28\x49\xdf\x8b\xdf\x55\x88\x62\xc3\x3a\x3e\x74\xab\x2e\xd1\xf7\xac\x77\xd5\x3f\xd8\x30\xeb\x9b\x5e\x2b\x21\xec\x39\xf7\xed\x45\x09\x36\xcc\xfc\x43\xbd\x3c\x41\x8f\xd3\xda\x19\xb7\xd0\x30\x9f\x21\x7a\x61\x88\x5e\x78\xe2\xd1\x0b\x9d\xce\xc0\xb6\x48\x86\x26\xf4\x7f\xaa\xf1\x0c\x9d\x16\xbd\x2d\xb6\xa1\x69\xd1\x4f\x24\xc2\xa1\xf3\x1a\xb7\x46\x3b\x6c\x5a\xe8\x13\x89\x79\xe8\xb4\xd8\x96\xf1\x0f\x4d\x4b\xfe\x39\x47\x41\x74\x82\xe1\x96\x88\x88\x26\xb8\x3d\x89\xb8\x88\x8d\x0b\xfc\x45\x77\x15\x0b\x6b\x1f\x3f\x5c\x80\xc4\x4d\xf0\xd5\x5a\x90\x44\xf8\xd3\x5a\xa0\x44\x65\xb6\x18\x2c\xd1\xd0\x51\x4c\x15\xd3\xf0\xdf\xf5\xa8\x0a\x55\xfd\x78\x9b\xf6\x62\xa1\x7d\x0d\x62\x02\x5e\xca\xa4\x48\x43\x1b\xc7\x78\x5d\xf4\xcf\x68\x74\x6b\xb4\x16\xfb\xbd\x29\x78\xd6\x02\xe4\xfc\xbb\x92\x02\x24\x4a\x32\x01\x31\xc4\x40\x30\xf8\x19\xf7\xe7\x0a\x07\xf9\xd5\x56\x0c\x6e\xfc\xbc\x2b\x50\x6d\xbd\xf5\x4e\x03\x29\x85\x9f\x6c\x6d\xe8\xfa\x8c\xf0\xd5\xb5\x39\xdd\xd4\x6f\xb7\x9e\xd2\x82\x0a\xc1\x12\x43\x0b\xd0\xa3\x0f\xd2\x9d\x87\xcf\x76\xf0\xd8\x97\xd7\x66\xf3\x72\xed\x7e\xc3\x74\x2a\x29\xfa\x87\xc6\xc8\x84\x28\x4a\x6e\x19\xcb\x54\xe0\x2c\x29\xc0\xa7\x02\xb9\x20\xd3\x95\x51\xef\xa2\x5b\x28\x37\x0a\x52\x19\xac\xf7\x25\x6e\x4c\xcf\x09\xf4\x80\xec\x19\x8b\x82\x5b\x43\x08\xce\x10\x82\x33\x84\xe0\xec\x3a\x63\x2d\x42\x70\xc2\x03\x5f\x09\xc3\xa1\x82\x9c\x67\x59\x02\x46\x29\x57\x1a\xd6\xd6\x1c\xb4\x05\x37\xd6\x2c\x71\x7b\xa6\x17\xd5\x98\x83\xbb\xbd\x46\xa1\xab\x3f\x78\xa6\x56\x7b\x62\x6b\x84\x0d\xd2\xd3\x26\xf9\x6e\xab\x74\x18\x49\x31\xe3\xf3\xdd\x79\x31\x01\x2c\x5f\xc2\x2b\xa5\xc7\x0c\x87\x28\x6c\x65\xdb\x92\x53\x41\xfa\x56\x85\x6f\xdf\x47\x72\xcc\x0c\x24\xb0\x8d\xe1\x01\x95\x55\x5c\xce\xca\xe9\x8d\x20\x9a\x26\xe7\xb1\xa5\x8f\x99\x8c\x8f\x15\x50\xb3\xb8\x48\x6c\xa9\x69\x2c\xc5\x62\x8e\xa6\xe0\x89\x59\xc9\x98\x6a\x3c\x0f\x4c\x61\xbe\xe3\x17\x42\xea\x2f\xfc\x48\x68\x78\xc9\xf9\x9c\x7b\xd2\xe7\xfb\x95\x64\x32\x9e\xf8\x62\x0e\x1a\x5c\x96\xd5\x01\x27\xe4\x5b\x65\x1d\xcc\x8e\x38\x9c\xfc\xf3\xdf\xa7\x86\xb0\xb2\x1c\x0b\x75\xda\x81\x2b\xef\xed\x88\x02\xe9\x29\xb6\x47\xc8\x98\x9d\xef\x00\xf5\x1a\xb8\x2f\x7c\xfc\x96\x79\xdd\x6f\x55\x08\xe4\xbc\x48\x82\x34\x31\x03\xa3\xc3\xdd\xaa\x6d\x1d\x1b\x19\x5a\xf9\x58\x7c\x01\x6e\xfb\x1b\x3f\xab\x4b\xcc\x94\xc4\xdb\xaf\x3e\xb1\xa8\xd0\x3b\x55\xce\x06\x23\xb2\x5d\x26\x18\xa4\x92\xc4\x7e\x0e\x44\x27\xfb\x83\x59\x2f\x30\x4e\x03\x1e\x1b\xda\xa6\xa8\xe6\x6a\xb6\xc2\xbc\x5b\x07\x30\x16\xc4\x46\x95\xe7\xcb\x08\x2a\x41\x1d\xe2\x69\xa1\xb1\xb4\xe9\x8a\x44\x0b\x69\xf0\x8b\x22\xdc\x61\xdc\x25\x97\x18\x40\x04\xf6\xe0\x9c\xa4\x86\x03\x58\xed\x2e\x18\x1e\x3d\xde\xe5\x6b\x46\x15\x96\x4a\x97\xb0\x72\x41\x35\x66\x18\xb0\xb3\x99\x3f\xe6\x46\x5d\x01\x8f\x5f\x91\x9a\x41\xef\x18\x9f\x2f\xb4\x1a\x11\x3e\x61\x13\xd8\x5d\x46\xa3\x45\x30\x6c\xca\x98\x56\x84\x26\x89\xef\x4a\x12\xa0\x44\xe8\x6e\x3f\xf1\x4c\xd3\x32\xb8\x91\xa7\xb7\xf5\x5d\x6b\x04\xd7\x88\x30\x1d\x4d\x4e\x47\xe0\xc1\x33\xa7\x85\xc2\x1c\xa7\x2b\xc2\x35\xd4\xe2\x06\x06\x9d\xcb\x62\x8e\x2b\xb1\x81\x06\xca\x4b\x47\xd6\x3e\x2b\x62\xd0\x26\xc4\x9c\x1c\xe1\xe2\x8e\x9c\xc0\x63\x86\xb3\x26\x57\x58\x9f\x2b\x2d\x8b\x16\xcf\x3c\x67\x2a\x93\xd8\x80\xa5\x1e\xb9\xf0\xff\xf8\x97\x4e\xd4\x69\x09\xcc\x05\x9f\x2f\x1c\x2c\x69\x8e\x34\xa5\xba\x07\xed\x9c\x8f\x6d\xc2\x48\x5a\x06\x91\x54\xfd\x3c\xae\x5c\x7c\x89\x13\xc1\xee\x69\x96\xa7\x1e\x06\xb0\xc1\xa8\xeb\x5b\xa3\x6c\x6a\x73\x98\x11\x88\xe4\x19\x39\x01\x14\xe1\xfa\x58\x01\xba\x8e\x65\x76\x3a\x21\xe7\xa0\xed\xb6\xf8\x80\x90\x7e\x7c\x3b\x90\xf9\xa8\x92\xe5\x58\xed\x7c\x16\xed\x3c\xb5\x5d\x7c\xb5\x86\x9b\x67\xde\xa4\xd4\xea\x71\x84\xc9\xce\x47\xbb\xf8\x6d\x49\x30\x87\x36\x4f\xaf\xb9\xf4\x00\xa5\xcb\xb0\x45\x96\xa7\x23\x42\x95\x92\x11\x2f\xbb\x26\xad\x63\x3a\xae\xa4\x8d\x1f\xa7\x23\xfc\x49\xe7\xf5\x93\x8e\x81\xa9\xd5\xab\x1e\xdf\x69\x43\x52\xab\x50\xa9\x10\xac\xe9\x0a\x7e\x05\x47\xe1\x94\x25\x3b\xa2\x33\xc3\xab\x4b\xf0\x97\xbb\x5a\x07\x81\x6d\x58\xd0\xc6\x85\x3c\x5a\xbc\x6a\x13\x4c\x3a\x20\x07\x5e\x5d\x8e\x69\x79\xb5\x89\x6c\xad\xbf\xd1\x2a\xce\xb5\x7a\x75\xc7\x5f\xbc\x5a\xc5\xc0\x56\xaf\x35\x91\xa4\xaf\x50\xd8\xea\xd5\x31\x24\xa1\xbc\xda\x87\xc9\x6e\x59\xd7\xf5\x7d\xc5\xca\x8e\xaa\x81\xb2\xe4\x6b\x8d\xb8\xfe\xa6\x25\x65\xeb\x01\x40\x6d\x03\x6a\xb7\x80\xe7\xfc\xb3\x09\xaa\x6d\x18\xea\x6b\x6d\x86\x79\xb3\xf1\x65\x70\xd8\x52\x17\x5c\x6a\x85\xb7\x51\xad\x20\x0d\xd8\xa2\xb2\x9c\x19\x86\x85\x8d\xbf\x6c\x27\x94\x7b\x8b\xe3\x6d\xda\xfd\x6e\x84\x1d\xaf\xce\xe4\x3d\xfc\x60\x27\x74\x03\x16\xf9\x1a\x1a\x67\x3d\x0c\x77\xc4\x26\x5d\x03\x77\x1c\xb8\x63\xf5\x1a\xb8\xa3\xbf\x06\xee\xb8\xe3\x1a\xb8\xe3\xc0\x1d\xef\x9d\x3b\xa2\x2e\xbb\x87\xf2\xfc\x3d\x9a\x38\xea\xda\x32\x70\x5a\xe7\x17\xaa\xaa\xcd\x86\xdf\xb8\x04\x8a\x0f\xa0\x6a\x5b\xdb\x71\x0e\xb1\x61\xcf\xc7\xcf\x9f\x3d\xeb\xa2\x54\xef\x6a\xf8\x16\x5e\x41\xf3\xb7\xdf\x7d\xb9\xf5\x8d\x4d\xf6\xb7\x1e\xac\xa6\x16\xc7\xbd\x21\xaf\x22\x3b\x6c\x30\x7c\x02\x75\x12\x52\x93\x94\x69\x42\x75\xc5\x54\xc4\x53\x36\x72\x86\xe5\xb2\xbf\xf6\xb4\x34\xcd\xc6\x44\x0a\x17\xa9\x28\x63\x36\xd9\x6f\x06\x11\xa3\x0a\xf2\x4d\xa6\xcc\xcf\x42\xa6\xe6\xab\x5c\x68\x77\x5c\xcc\x14\x98\x83\x0a\x39\x61\x93\xf9\x84\xc4\x05\xb3\x09\x4e\xe8\xa7\xb3\xed\xac\xd4\x4a\x69\x96\x82\x25\x57\xe6\xbe\xe9\x9b\xce\x21\x46\x11\x02\x25\x0b\x9a\x24\x2b\xc2\x96\xdc\x66\xfb\x9a\xc1\xc1\x4d\x08\x35\xe1\xcd\x4a\x5a\x99\x08\x7b\xcf\x4f\xa8\x63\xf0\xae\x54\x85\x2e\xdc\x7e\x6d\xec\xce\x91\xc6\xd7\x76\x25\x93\x8d\xc2\xaa\x36\xe3\xa2\x0d\x1c\xfe\x09\xc8\xf5\xfe\x7a\xb7\xc9\x95\x74\xa6\x64\x1d\xa8\x57\x5d\x2c\x2d\x92\xc4\x20\x06\x5a\x61\xd7\x17\xd0\x60\x1d\x6d\x48\x64\x43\xc3\x7b\x1a\x24\xb4\x61\x07\x73\x99\xc9\x44\xce\x57\x21\xa4\xb1\x83\x1c\x4f\x33\x67\x1c\x47\xaf\x1e\xf3\xdd\x99\xdf\xd5\xb6\x66\xb0\xfc\x0d\x96\xbf\x41\xb7\x59\xbb\x06\xdd\xc6\x5f\x83\x6e\xb3\xe3\x1a\x74\x9b\x41\xb7\x19\x2c\x7f\x64\xe0\x8e\x5b\x60\x32\x70\x47\x32\x70\xc7\x8d\xeb\x1a\xb8\xe3\x56\xf0\x0c\xdc\x71\xe0\x8e\x4d\x57\x26\xe3\x03\x02\x1d\x33\x19\x6f\x89\x73\x44\xab\x4f\x24\xc7\x89\x8c\xb0\xed\x04\x26\xa6\x3a\x3b\x9f\xa2\x29\x1a\xa2\x46\xe4\x1f\x52\x30\x0c\x5e\x33\x7b\x03\xe6\x24\xa8\x83\x60\x1e\x3f\x51\xa7\x5b\x03\x9b\x86\x38\xc9\x21\x4e\xf2\xc9\xc7\x49\x2e\xa8\xc2\x7d\x45\xa2\xb4\x39\x6c\x32\x38\x90\x1f\x58\x9e\x7e\xa6\x51\x93\x06\x5d\xec\x76\x43\x8a\x4d\xb9\xa5\xb8\xf2\xd8\xfa\x0b\x58\x7c\x55\x5d\xaf\x95\x97\xb1\x56\x53\x1c\xb3\x98\x64\x2c\x1f\x23\x8a\x48\x32\xe3\xb6\x98\x55\x0d\xfb\x2c\x7c\x1e\x35\xfa\xb1\xba\x8e\x47\x0c\x81\xac\x4e\x64\x0f\x9b\x6b\x68\x38\xae\x50\xf8\x27\x11\x10\xd9\x55\xaa\x1f\x13\x6d\x8d\xbc\xdf\xb4\x94\xeb\xbb\x8b\xe6\xad\x4a\x9f\xae\x5f\x8d\xf5\x34\xb7\xd6\x3e\x1d\xf9\x02\x0f\x11\x55\xc8\x29\xba\xaa\x96\x1d\xd5\xa8\xfd\xf4\x94\xfd\x2d\xd1\xe4\xd1\xcb\xa5\xae\x5f\xfb\x8a\x6e\x7b\x09\x6e\x4f\xbf\xc8\xea\x26\x00\x75\x56\xd0\xc9\xde\x4a\x3a\xd9\x4b\x51\x27\xfb\x2a\xeb\xe4\x00\x85\x9d\xec\xa7\xb4\x93\x07\x28\xf1\xba\x7e\xed\xad\xa2\x92\x03\xf4\x78\xf2\x59\x14\x86\x5d\xbf\x0e\x02\xd6\x7e\x3a\x3d\x19\xca\xc9\x76\xb8\xf6\x57\xb9\xc9\xfe\x6a\x37\xd9\x1f\x33\x5a\x96\xa5\x5d\xbf\x86\x42\xb5\x07\x71\xf6\x3d\x18\x57\xf7\x62\xb6\x9b\x3e\xde\x09\x4b\x7c\x9d\xa1\xfe\x85\x4d\x5d\x76\x36\x0c\x7b\x6d\x3a\x06\x03\xa1\x16\x01\x73\xf1\x51\x23\x80\x63\x70\x3f\x76\xca\x6f\x21\x82\xca\xad\xc1\x60\xbe\x82\x6e\x2d\xa4\xc9\x6e\xbc\x14\x4c\x81\x60\xc7\xbc\x89\x28\x6c\xae\x68\x9e\x9d\x60\x38\x48\xc9\xed\x44\x5c\x0f\x10\x29\xdf\x00\x19\x31\x65\x54\x28\x72\xe4\x6c\x4f\xc7\xaa\x7c\xe2\x68\x52\x66\xf7\xf9\x11\x21\x09\x39\xcc\xe8\xdb\xde\xd4\x7d\xdb\xce\x0e\x92\xf6\x20\x69\x0f\x92\xf6\x20\x69\x37\x5e\x83\xa4\xdd\xe1\x1a\x24\xed\x41\xd2\xde\xf6\xe1\x41\xd2\x1e\x24\xed\xdd\x1f\xdf\x4f\xd2\xde\x37\x4e\x28\x94\x7b\xad\x73\x0e\x2b\x67\x41\x6b\x7e\x1f\x43\xe4\x0b\x94\xc2\xbf\xfa\x95\xb7\x43\x59\xba\x59\xda\x0e\x25\xf2\x35\xdd\x62\xb2\x43\xb4\xf6\xc2\xf7\xda\x9b\xdb\xa5\xee\xa7\x15\x0b\xb5\x07\x6e\x04\x0e\x85\x3d\x91\xe3\x83\x73\x85\xdb\x4a\x73\x53\x56\xfa\xc9\x63\x72\xe2\x3c\x2e\x50\x21\x5a\x48\x5d\xfd\x51\x68\x3e\x2e\x9f\xf0\x3e\x18\x70\x2f\x56\xf2\x6d\x92\x6a\x7f\x35\x51\xab\xad\x58\xee\xa7\x21\x21\x2c\xaf\xcc\x81\xbb\x46\x7a\x10\x2d\x91\x17\x42\x98\x51\xa1\x4a\x36\x78\xe3\x90\xe6\x60\x01\x38\xdf\xd9\xdf\x08\x4b\x30\x1f\x90\x98\x4a\x28\x05\xfe\x4e\x6a\xcb\x48\xdb\x50\x7e\x29\xac\x47\xd4\xdc\x71\x5e\x5f\x87\x94\xb0\x22\xee\xbf\x3e\x21\xaf\x00\x0f\xc3\x81\x6d\xc9\x69\x9a\x24\xf2\xae\x0b\x49\x7a\xa8\xb4\xa8\xbb\xce\x69\x51\x35\xff\xdd\x90\x15\xf5\x0b\xc9\x8a\x82\x1f\xf1\x08\xf5\x9e\x1e\x45\xbe\x5f\x30\xc0\xa2\x9c\x01\xa8\xd2\x22\xd1\x3c\x2b\x63\xa5\x14\x7e\x2a\x41\x29\x73\x66\x23\x4f\xaa\x78\x69\xbe\x46\xa3\x45\x1d\x3f\x61\x3c\x88\xad\x52\x70\x68\x6d\x74\x07\x4d\x12\x9b\x53\xe4\x44\x52\x0c\x61\xe1\x8f\x1d\x99\x70\xe1\xaa\x22\x3a\x6d\x06\x88\xcc\x89\xa1\x85\xc9\xca\x56\xaa\xdb\x42\x44\x51\x29\x5a\x32\xc7\x7a\xe7\x7c\xc9\x44\x49\x49\x4f\xd4\xe9\xa9\xe3\xe1\xbd\x52\xf8\x7b\xa1\xd0\x7f\x0e\x28\xe9\x5f\xda\xd0\x68\x58\x90\xa7\xd2\x25\xf8\x4a\x1a\xfd\x98\x21\x18\x5d\xfc\xfc\xdd\x6c\x0c\x7b\xf8\xf7\x1f\xd0\xb7\xff\xf9\x64\x96\x3d\xb2\x85\xf1\x31\x62\xeb\x9f\xbc\x55\x71\x08\xae\x2f\xaf\x43\x83\xeb\xef\xdd\x72\xf8\xb8\x31\xf6\x9f\x81\xb5\xf0\x31\x63\xec\x07\x0b\xe1\xd6\x4d\x79\x6a\xa1\xef\xd5\x6b\x2f\x8b\xe0\x60\x0d\xdc\x9b\x0b\x77\x64\x38\x87\x5a\x01\x3b\x62\xc4\x9e\x7e\xf6\xc1\xc7\xfe\x30\x3e\xf6\x41\xe2\x6d\x79\x0d\x12\xef\x46\xa0\x0c\x12\x2f\x19\x24\xde\x5d\xcb\x1b\x24\xde\xad\xe0\x19\x24\xde\xad\x9b\x32\x48\xbc\x83\xc4\x4b\x3e\x37\x89\x77\x9f\x2a\x5d\x83\xaf\xfb\x20\x5f\x77\x57\x6a\xd1\x89\x46\x74\xc4\x83\xce\xbe\xed\xc1\xaf\xfd\x54\xfc\xda\xad\x13\xfe\x85\xe6\x87\x26\xfd\x87\x7b\xb5\x29\xf3\x9f\x2e\x25\x8f\x49\x56\x68\x9b\x4f\x3d\x64\xff\xf7\x91\xfd\x5f\x81\xfc\x50\x02\xa0\x55\x09\x80\x4d\x30\x1b\xea\x00\x0c\x75\x00\x7a\x76\x42\x0f\x75\x00\x86\x3a\x00\x43\x1d\x00\x77\x0d\xd9\x49\x64\xc8\x4e\x6a\x75\x0d\xd9\x49\x9b\xaf\x21\x3b\xe9\xc9\x5a\x5f\xc9\x90\x9d\xf4\xb4\x2d\xb1\x64\xc8\x4e\x1a\xac\xb3\x2d\x37\xea\x33\xcc\x4e\x1a\xea\x00\x3c\xd5\x18\x05\x32\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xbd\xfd\x1a\x24\xed\x0e\xd7\x20\x69\x0f\x92\xf6\xb6\x0f\x0f\x92\xf6\x20\x69\xef\xfe\xf8\x50\x07\xe0\x33\x8a\x8d\x20\x43\x1d\x80\x21\x5e\x62\xa8\x03\xf0\xcb\xad\x03\x50\xf1\xdd\x3f\x5e\x31\x80\xee\xd3\x18\x2a\x02\x0c\x15\x01\x86\x8a\x00\x43\x45\x00\x77\x0d\x15\x01\xf0\x7a\x4a\xb6\xc6\x21\x3f\x6a\x23\x50\x86\xfc\x28\x32\xe4\x47\xed\x5a\xde\x67\x60\x37\x1c\xf2\xa3\x9e\xa0\xad\x70\xc8\x8f\x1a\xec\x82\xf5\xcd\xf9\x4c\xf2\xa3\x86\x8a\x00\x4f\xd1\xdb\x3e\x48\xbc\x2d\xaf\x41\xe2\xdd\x08\x94\x41\xe2\x25\x83\xc4\xbb\x6b\x79\x83\xc4\xbb\x15\x3c\x83\xc4\xbb\x75\x53\x06\x89\x77\x90\x78\xc9\xe7\x26\xf1\x0e\x15\x01\x86\x8a\x00\x43\x45\x80\xcf\xd1\xc3\xbd\x73\xa7\x99\x58\x6e\xda\xd3\xca\x2e\xbe\x12\xcb\xaa\x9e\xc2\xc4\x92\xe7\x52\x00\x05\x5e\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\x6e\x9c\xff\x6e\xc4\xdf\x81\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xe3\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xe3\x03\xed\xa4\x78\x33\xc4\xf6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xff\x5e\x5e\xbc\x7a\xf7\xe1\xf2\xf5\xe5\xab\xeb\xed\x48\xd7\x92\xac\xc0\x41\xea\x30\xd9\xe3\xef\xdc\x1e\x41\x9a\x37\x13\x86\x02\xff\xe6\xe4\xbb\xf3\xeb\xff\x7d\x77\xfe\xf6\xd5\x29\xb0\x5f\xf6\x29\xa3\x22\x66\x31\x29\x94\x23\x09\x59\xce\x96\x5c\x16\x2a\x59\xf9\xe3\xdd\x8c\xb4\x75\x6c\xb5\x8a\xe6\x8a\x28\x96\x2f\x79\xd4\x0c\x22\x94\x62\x69\x89\x40\x91\xc7\xf0\x9c\x29\x99\x2c\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x21\x0b\x33\xde\x6f\x7e\x03\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x33\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x25\x34\xfd\xf4\x02\x7d\xf0\x47\xbf\x09\x7e\x3a\x72\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x14\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x25\xcb\x41\x9e\xb6\xbb\x30\x22\x39\x9b\xd3\x3c\x4e\x98\x82\xe0\x81\xbb\x05\x83\x72\x1e\x28\x61\x59\x80\x31\x2f\xad\x0b\xa9\x27\xe4\x82\xcd\x68\x91\x68\xa0\x21\x47\x47\x93\xe3\xde\x50\xed\x75\x2e\x77\x24\xbf\x57\xd0\xed\x06\x8b\x4a\xcc\x64\xbe\xf1\x78\x1c\x5b\xd3\x44\x85\xac\x29\xc3\x49\xac\xa6\xe7\x68\x35\xea\x17\x2d\x56\xd2\x42\x10\x6c\xaf\xce\x47\x52\xcc\xf8\xfc\x2d\xcd\xbe\x61\xab\x6b\x36\xeb\x18\x0d\x81\x4c\xd4\xea\xb4\xc0\xc0\x0c\x39\xc4\x01\x77\x33\x9d\x7b\xf4\xe5\xb7\x31\x9a\x74\xb3\x79\xb4\xb6\x74\xac\x95\xb4\x40\xa6\x6f\xd9\x77\x8f\xc5\x79\xca\x6b\x37\x45\x6f\x9c\xdc\x71\x48\xda\xed\x39\xd5\x13\xf2\x56\x42\x48\xce\x4c\xbe\x20\x0b\xad\x33\xf5\xe2\xec\xec\xb6\x98\xb2\x5c\x30\xcd\xd4\x84\xcb\xb3\x58\x46\xea\x2c\x92\x22\x62\x99\x56\x67\x72\x69\x28\x1f\xbb\x3b\xbb\x93\xf9\x2d\x17\xf3\xb1\x91\x74\xc6\xb8\xab\xea\x0c\x84\xa9\xb3\x5f\xa3\xc4\xfe\xe1\xfd\xc5\xfb\x17\xe4\x3c\x8e\x6d\xc5\x9e\x42\xb1\x59\x91\xd8\xea\x1d\x13\x42\x33\xfe\x1d\xcb\x8d\x52\x36\x22\xb7\x5c\xc4\x23\x52\xf0\xf8\xaf\xdb\x0f\xf7\x9e\x10\x93\x19\xea\x46\x7b\x40\xed\x06\x04\xc5\x55\x85\x4e\x79\xa4\x37\x14\x8a\x6b\x05\x7b\xee\x0c\x07\x96\xa1\x74\x58\xc6\x54\xca\x84\x51\xb1\xe3\x0d\x00\x5b\xf7\x33\x7b\x5c\x1e\x5a\xd4\x72\x2c\x02\x64\x32\x7e\x41\x54\x91\x65\x32\xd7\x8a\xa4\x4c\xd3\x98\x6a\x3a\x31\x3b\x37\xaa\xfe\x09\xc2\xf1\x88\xfc\xcd\xdf\x04\x09\x57\xfd\x70\x7c\xfc\xe7\x6f\x5e\xfd\x9f\xbf\x1c\x1f\xff\xf8\xb7\xf0\x57\x20\x7b\x68\xea\xaa\x3e\x62\x44\xee\x89\x11\x77\xdf\xc1\x37\xe0\x4f\xcb\x46\xcf\xa3\x48\x16\x42\xdb\x1f\x34\xd5\x85\x9a\x2c\xa4\xd2\x97\x57\xfe\xcf\x4c\xc6\xf5\xbf\xd4\x0e\x4e\x40\xee\x97\xe8\x00\x38\xaf\xa8\x5e\xf4\x4c\x7a\xca\x73\xb1\x07\xba\xda\x37\xc3\x0a\x49\x29\x85\x7f\xbe\x76\xd3\x35\x1c\xe8\x2e\xe7\x5a\x33\x01\x72\x07\xc4\xdd\xc9\xd9\xc8\x60\x6e\xc9\x66\x97\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x1e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xae\xd7\x9d\x5f\x5d\x92\x25\x42\xa3\xf7\x85\xb8\x28\xac\xd7\x07\x9f\x49\x5f\xa9\xca\x2e\xcb\x4b\x9a\x2f\xd0\xb2\xe4\xe3\xbd\x48\xc2\x53\x6e\x0d\xc0\xb6\xaa\x95\x22\x27\x78\x73\x12\x65\xc5\xc8\x3e\x30\x49\x59\x2a\xf3\x95\xff\x93\x65\x0b\x96\x1a\x89\x6d\xac\xb4\xcc\xe9\x9c\x8d\xfc\xeb\xf8\x9a\xff\x0b\x5f\xac\x7c\x60\xfd\x6d\x14\xa9\xa3\x22\x37\xcc\x23\x59\x39\x0a\xc2\xe2\xc7\x3d\x8b\x0e\x4c\x3d\x1f\x45\xbf\x1b\xef\xf6\x64\xb9\x5e\x5b\x44\xa6\xed\x57\x05\x32\xe4\x52\x26\x45\xca\xd4\xc8\xb3\x27\x94\xd6\xc5\xd2\x48\x93\xea\x5e\x18\x61\xcc\x97\x5c\xed\xe5\x9f\xbe\xf1\x96\x3a\x30\x91\x15\xda\x68\x2a\x18\x0c\x1e\x54\x84\x93\x0a\x74\x00\x1f\xa3\x58\x21\x29\xcf\x8f\xda\x79\x5f\xa9\xd6\x2c\x17\x2f\xc8\xff\x3d\xf9\xf8\xdb\x7f\x8d\x4f\xff\x7a\x72\xf2\xc3\xb3\xf1\x7f\xfe\xf8\xdb\x93\x8f\x13\xf8\xc7\x17\xa7\x7f\x3d\xfd\x97\xfb\xe3\xb7\xa7\xa7\x27\x27\x3f\x7c\xf3\xf6\xeb\x0f\x57\xaf\x7e\xe4\xa7\xff\xfa\x41\x14\xe9\x2d\xfe\xf5\xaf\x93\x1f\xd8\xab\x1f\x5b\x0e\x72\x7a\xfa\xd7\xdf\xb4\x9a\x1e\x15\xab\xf7\x2d\x0e\x3c\x5e\xe3\x3d\x22\xec\xcb\xb7\x3a\x18\xe8\x3f\x8d\x4b\xa1\x6d\xcc\x85\x1e\xcb\x7c\x8c\xaf\xbf\x20\x3a\x2f\x76\x1f\x8c\x92\xa8\xed\x83\xe7\xae\x1c\xd8\x8b\x92\xa0\x79\xd2\xdc\x3b\x22\x2b\x16\xe5\x4c\xf7\xa5\xc1\xe0\x68\x8e\x7f\xd4\x4c\xb2\x83\x52\x53\x2a\x35\xde\x2e\x09\xf0\x2a\x39\xef\x2c\x97\xe9\x84\x04\x66\xa1\x25\x78\x32\xed\x73\xb7\x6c\x87\x96\xeb\xae\x41\x09\xfa\xbc\x94\xa0\x1b\xdc\xdf\x7b\xd7\x80\x98\x58\x6e\x33\xd3\xd4\x6d\xba\xaf\x21\x95\x25\x34\x47\x3b\x01\x4a\x4b\x92\xc9\xac\x48\xa8\xde\x60\xb6\x6b\xb0\x4d\x5b\xdc\x2f\xbd\x00\x66\xa3\xc1\x0e\x6c\xa9\x5c\xda\x6c\x0c\x25\xe7\x49\x42\xb8\xc0\x93\x00\x03\x38\x6b\x5e\xce\x50\x5e\x22\x14\x0d\xce\x4b\x33\x85\x3b\x9b\x70\x13\x18\x1a\xb9\x32\xba\x4e\xae\xc1\xe2\x0f\x09\x39\x48\xb3\xac\x69\x8c\x8b\x32\x2d\xc7\x73\x5b\xef\xa5\x6c\xac\xbf\x98\x50\xa5\xdd\xb4\x61\x36\x9a\xde\x82\x29\x34\x62\x31\x13\x11\x83\x10\x84\x82\x95\x6b\x9d\x1a\x61\x10\xcc\xfb\x30\x06\x25\x71\x91\x25\x3c\x32\xf0\x33\x33\x69\x1e\xe3\x32\x4d\x0b\x0d\x86\xe2\x87\xb2\xe2\x9b\x1d\xbf\x71\xe5\x5e\xbd\x31\x1f\x48\x95\x17\xad\x7d\xb4\x85\x57\xdd\xd5\x61\xe6\xfb\x76\x84\xd7\x9b\xdb\x76\x72\xaa\x35\x8a\x5b\xda\x18\xaa\x94\xf6\xa1\x2d\x86\xed\xe8\xec\xcf\x92\xc6\x76\xa0\xaf\xed\x69\x6b\x07\xe3\x52\x57\x7a\xda\xd6\x9a\x94\xe5\x6c\xc6\x3f\x75\xc0\xc7\x73\x51\xaa\x28\x3c\x66\x42\x1b\x45\x00\x2a\x53\x67\x39\xcb\x98\x88\x7d\xba\x1f\x04\x78\x89\xea\x3a\xee\xd5\x63\x84\x52\x46\xf7\xe3\x75\xd3\x24\xc5\x0c\x67\xeb\x67\x7e\xb6\xec\xae\xf7\x7f\xb0\x84\x8c\x77\x06\x7f\xd7\xf6\x31\x78\xa3\x16\xe9\x6a\xcb\x7f\xdb\x49\x1a\xed\xcd\xbb\x9c\x32\x19\x63\x8d\x6b\x5d\x06\x21\x4c\xc8\x4d\xc3\x9b\x10\x6b\x60\x9f\x38\x3e\x56\x18\x96\xa0\xea\x03\xd5\xb2\x9b\x31\x32\x01\x07\xed\x88\x52\xc8\xea\x8a\x1c\x2c\xbf\x67\x54\x29\x3e\x17\xe3\x4c\xc6\x50\x97\xfb\x6c\x13\x42\xb4\x38\x54\xdd\x22\x9b\x76\xe2\x95\x37\x4e\xb4\xdb\xa6\x6b\x6f\x7f\x0b\x64\x0b\x57\x11\x3e\x0f\x7e\xb4\x76\x1d\x17\x47\x1f\xc8\x90\xa5\x44\x74\x18\x4c\x53\x2a\xe8\x9c\x8d\xed\xc7\xc7\xfe\xe3\x63\xff\xad\x43\xc0\xdc\x86\x6a\xa1\x49\xb1\x75\x5b\x88\xe3\x37\x68\xb2\x8c\x7d\x7b\x08\x8c\xdf\xfb\xc4\xd3\x22\x25\x34\x95\x05\x86\xe8\xad\x83\xd3\x05\xb2\xf4\x02\xb0\x06\x40\xa9\x8d\x90\x6a\x09\x2d\xb2\x57\xc8\xdd\x13\xb5\x6c\xb5\xb2\x68\x75\xb3\x64\x75\xb0\x60\xed\x6d\xb9\x72\x46\xea\xf6\xf8\x78\xed\xec\xe6\x35\x8c\xe4\x62\x27\x46\xe6\xbe\xde\xfd\xe5\x8c\xf8\x71\xb8\x22\x32\xe5\x5a\x5b\x83\x2e\x2d\x8f\xfd\x88\x70\x5d\xb1\x7e\xda\xb3\x00\xfd\x1e\xb0\x45\x06\xfb\x64\xb4\x29\x0e\x56\x74\xe7\xb5\x18\x21\x97\xbd\xe3\x58\x1d\x82\x0a\xc2\xd3\x0c\x83\x59\x01\xa7\xc7\x4e\x37\xb3\x41\x06\xc3\xf9\x18\xce\x47\xd3\x4b\xaa\x8b\x2c\x12\x8a\x21\x65\x04\xa3\x17\x47\x0c\x66\xbb\xc6\x33\x10\xa1\x89\x38\x64\xce\x02\x04\xd1\x73\x31\x27\xd7\x0c\x2c\x03\x37\x4c\x2b\x1b\x13\x09\x6f\xd0\x9c\xad\xa7\x98\x39\x4b\x88\x0f\xb5\xa5\xb3\x59\xf5\x89\x98\x65\x89\x5c\xa5\x20\xd9\x5e\xea\x50\x9e\xf1\xa2\x0b\x4b\xb3\x84\x6a\xe6\x05\x9b\xed\xd6\x86\x83\x39\x5f\x97\xfc\xae\xc7\xcd\xe8\x6a\x17\x1d\xdc\x22\x26\xf8\xe9\xe7\x69\xb5\xd6\xc8\xda\xda\xdd\xdb\xd8\xdc\x5b\xe6\x5b\xb5\x57\x02\x5b\x19\xe5\xef\x3b\x8b\xaa\x93\x3a\xd6\x36\x53\xea\xe9\xe7\x46\x75\x58\x76\xdb\xfc\xa7\x21\xe3\x69\x1b\xa8\xdb\x65\x2d\xb4\xce\x58\x68\xb5\x7f\x2d\x33\x97\x86\x5c\xa5\x0e\xfc\xe5\x1e\x84\xbf\x9d\x7b\xa9\x65\xc2\x50\x72\x6d\xa7\xbb\x7f\x28\x9f\xf7\xfd\xcf\xd0\xbd\x1b\x8c\xf4\x30\x5e\x8a\x0f\x4e\x6c\x31\x67\xab\x9c\x17\xa0\x96\xd6\x14\x9a\x9d\x69\xe9\xe6\x65\x36\x4e\xac\x88\xd9\x33\x6d\x3b\xdf\x05\xad\xe0\x74\x0e\x4e\x9f\x3f\x7b\x6c\x1b\x31\x90\x9f\xfe\x12\xc4\xb7\xfb\xfc\x17\x8f\x21\x7f\x76\xff\xfa\xcb\x81\x79\x0b\xed\x18\x1b\x4e\xa9\x83\x80\xf1\x0a\x5e\x20\x5c\xc4\xe0\x60\xb2\x4b\x05\x08\xe0\x58\x06\x3e\xb0\x2c\x97\xff\x82\x89\x54\xd6\xcc\x05\x9e\xa8\xf2\x61\x65\x5d\x66\x81\x5e\x65\x4d\x0a\xe5\xc9\x60\xe4\x9d\xb4\x45\x09\xd9\x88\x5c\x81\x2d\xb5\xbc\x03\x27\xe9\x9d\xc4\xf2\x84\x1b\x7d\x59\x21\xdc\x76\x72\x91\x9d\x8c\xbe\x02\x90\x6f\x4a\x26\x8f\x2b\xab\x30\xf9\x12\x83\x2b\x99\x70\xdb\x20\x73\xcb\x56\x25\xb3\xb1\x22\x04\x90\xfc\x51\x89\x25\x8e\x15\x20\xef\xf8\x7f\x9c\x29\x2b\x9d\x72\x81\x1f\xc3\xa1\xdd\x56\xc0\xe8\x0e\xa0\x46\xb2\x4b\x12\xfc\x4c\x1f\xe0\x6a\x27\x67\x54\x60\xf6\xbe\x83\x8c\xe1\xa9\x64\xb3\x74\x11\x88\x14\xaf\x7e\x2a\x68\x52\x4d\x42\xb0\xb7\xec\x43\x6b\x54\xfd\x8e\x27\x71\x44\x73\x1b\xe5\x05\x67\x94\x28\x89\xbb\x87\x55\xf1\x22\x2a\xfc\x69\x2f\xf7\x08\xfb\x20\x92\x8c\xe6\x9a\x47\x45\x42\x73\x62\xce\xc2\x5c\xe6\xad\x12\x05\x76\x42\xb4\x44\x9a\x1b\x16\x49\x11\x77\x51\x00\x3e\xd4\xdf\xad\xfb\x5a\x33\x96\x73\x5b\xee\x8f\xa7\xac\x8e\xa4\x27\x55\x9b\xb6\x9c\xb9\x53\xed\x8f\x58\xc5\xf2\x51\xe6\x64\x72\x45\x38\xd6\x0b\x3d\x0d\xc8\xa3\x3f\x15\x13\xf2\xd5\xca\x99\x59\xc0\xe4\x62\xb3\x2b\x14\xd3\x2e\x11\xc6\xa1\xac\x05\x76\x79\xa0\x66\x32\x87\xe4\x94\x93\x58\x62\x46\xc6\x92\x47\xfa\x74\x42\xfe\x3f\x96\x4b\xcc\xe0\x64\x73\xac\xde\x68\x51\xdc\x2b\xae\xd0\xb8\x14\x3c\xf8\xcf\xc8\x09\x56\xd2\xe4\x69\xca\x62\x4e\x35\x4b\x56\xa7\xa8\xc7\xba\x5a\x9c\x6d\xb6\xae\x8d\xd1\x20\x28\xbc\xfa\x87\xdf\x6f\x79\xb2\x6b\x0e\xd5\x77\x2e\x2b\xa5\x84\x0c\xc6\x10\xd4\xb6\xd0\xf3\x20\xb9\x45\xdc\x0c\x63\x10\xca\xa4\x4e\x47\x66\xfc\x06\xff\xdd\xe0\x01\x25\x39\x9b\x03\x96\x23\xe6\x1e\x88\xe3\x18\x4d\xf9\x56\x16\x62\xb3\x49\xb0\xb2\xf0\x37\x56\x09\xff\x2e\x78\x71\x63\x96\xe2\x83\x88\x09\xc1\x4c\x02\x13\x25\x25\x60\x97\x04\x76\x6e\xc8\x03\x3e\x55\x46\xa2\xec\x9c\x64\xaf\x19\x89\x30\x97\x1d\x51\xef\xbd\xe4\x2d\xfa\x0f\x75\xc0\x65\x08\x10\xb7\x80\xa9\xe5\xed\x69\x4b\x0e\x00\x3f\x11\x82\x25\x82\xc2\xb7\x58\xec\xa2\xd8\x30\xd7\x18\x5e\x25\xc7\x2f\x8e\x7b\x21\xbe\xb8\x9c\x5c\x66\x74\x4e\x77\xd7\x3b\xae\x2a\x23\xb5\x57\x49\xcc\x34\xcb\x53\x28\x4c\xbb\x90\x77\xf8\x3b\xb2\xad\xcc\x3e\xc5\x6c\x4d\x5f\xb3\xda\x85\x54\xc0\x95\xaa\x49\x8c\x70\x7e\xc1\x31\x7a\x47\x57\x84\xe6\xb2\x10\xb1\x95\x9a\x3c\x01\x7d\x5b\xfb\xf0\x3b\x29\x80\x52\x14\xca\xc0\xea\x43\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x51\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xc9\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xa7\x55\x11\x04\x1e\x69\xb3\xa0\xdd\xf1\x20\xaa\x98\x1e\x78\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x63\xb5\xe5\xc8\x55\x93\x3b\xc9\x09\x3e\x69\x24\x36\x29\xf5\xd6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\x74\xc9\x14\x51\x3c\xe5\x09\xcd\x13\xc8\x15\xbc\xc1\xf9\x41\x33\xf6\xc6\x0c\xf4\x6e\xd9\xcd\xe1\x4c\x82\xe1\x76\x82\xda\xcd\xc3\xc0\x09\x68\x84\x9b\x17\x16\x01\x77\x95\xc3\x3f\x45\x49\xa1\xf8\xf2\xd0\xd3\x64\xb3\x1f\xf6\x60\xd5\x75\x2e\x9d\xc9\xf8\x26\x63\xd1\x43\xf2\xe8\xaa\x86\x61\x48\x55\xec\x36\x1d\x78\x32\x2a\xfb\x14\x1b\xeb\x4f\x19\xa1\x51\xc4\x94\x72\x31\x95\xab\x30\xce\xd3\xaf\xe1\x73\x29\x28\x40\xef\xd4\xab\x84\x2a\xcd\xa3\xaf\x12\x19\xdd\xde\x68\x99\x77\xca\xd9\x6f\x7a\xbf\x56\x86\xe1\xfc\xfb\x1b\x72\xc1\xd5\x6d\x90\x4d\x60\x9d\xa6\xa1\xb9\x84\x92\xdb\x62\xca\x12\xa6\x8f\x8f\x15\x72\xb9\x94\x46\x0b\x2e\x98\x63\x70\xc2\xa7\xa4\x58\x85\xcf\x40\xb9\xab\xcf\xd4\x26\x3e\x9d\x59\x7c\xfd\x35\xbd\x53\x0c\xa7\x3f\x35\xd3\x37\x3f\xb3\x36\x19\xe9\xbd\xfa\x29\x70\x32\x97\x17\x3d\xf9\x20\x66\xea\x83\x99\x63\x37\xe3\xf6\x31\xbe\xe5\x54\x87\x19\x4f\x98\xed\x3e\x60\x16\xec\x62\xd4\xec\xa9\x80\xfd\x5b\xc9\x82\xdc\x51\xd4\x91\x81\x22\x4e\xc8\x07\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa2\x69\x96\x30\xf5\x82\x1c\xb1\x4f\xfa\xf7\x47\x23\x72\xf4\x69\xa6\xcc\xff\x84\x9e\xa9\xa3\x09\xb9\x4c\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\xb8\x9c\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x67\x31\x5b\x9e\xa9\x98\x3e\x1f\xc1\x67\x94\x0d\x04\xac\xce\x89\x2a\x72\xf4\xfc\x68\x42\x6e\x1c\x23\x1e\x85\x73\x2c\x9f\x9b\xc9\xdc\x0f\x08\x76\xf6\x67\x47\xe4\x44\xe6\x30\x72\x44\x05\x49\x18\x5d\x5a\xdb\x32\x1e\xb7\x15\xaa\xbb\xa7\xad\x13\x22\xdb\xe6\x86\xb5\xef\xbc\xd2\x56\x48\x5d\xdf\x44\xf7\x9e\x33\x01\xe4\x85\xcd\x15\x98\xc9\xdc\xd6\x01\xf1\x8f\x28\xa6\xe1\xe8\x71\x51\x51\xa1\x1f\x81\xc0\x92\x8e\xa9\xf4\x8e\x7a\x76\x85\x8e\x7b\x0f\x74\x20\xc1\x7f\x2a\x18\xb9\xbc\xf0\x09\xf5\x2c\x57\x5c\x69\x73\x8c\xe3\x0a\xeb\xe2\xc8\xcf\x4e\xce\x53\xfa\x0f\x29\xc8\xab\xaf\x6e\xec\x04\x4e\x1f\x15\x54\x3b\xa9\x01\xfd\x47\x91\x33\xc3\x85\x3b\x30\x77\xff\x4e\x9d\xa1\x9b\xfb\xe4\x82\x6a\x8a\x7c\xdd\x46\x5a\x89\x92\x94\x1b\x96\x3d\xe5\x22\xb6\x3f\x05\x0c\xfb\xa1\x79\xab\xd9\xbd\x77\xdb\xc4\xa4\xf0\xc1\x6f\xaf\x2f\x7b\xe2\xc1\x11\x10\xf3\xf9\x5b\x19\x77\x66\xc4\xc1\xab\x8e\xf8\xfe\xb7\x81\xe9\x4b\xbc\x4f\x52\x33\x26\x31\xda\xfb\x88\x5c\x33\x1a\x13\x73\x7e\xed\x3f\xbf\x37\xba\x67\x6b\x5a\xd5\x8a\x85\x38\x00\x76\x5c\x86\x7b\xcd\x2d\x21\x8c\x74\x8f\x0d\xe6\xc0\xb1\xb2\xbc\x64\x9a\xc8\x29\xb1\xc7\xa1\xef\xb9\x7f\x7b\x7d\xb9\xc7\xd4\xbf\xbd\xbe\x74\x33\x37\xff\x94\xb3\x87\x9b\xf4\x5e\xe2\x5b\x29\xbd\xbd\xae\x89\x5b\x25\x4b\x2e\x13\x37\xea\x22\x59\x7b\x79\x6c\xd2\x97\x24\xd6\x27\xc4\x6e\xb9\x68\x91\x85\x5b\x3d\x65\xe6\x1d\xa3\x50\x60\xac\x5a\xe0\x47\xbc\x59\x50\x48\x7d\xf6\x09\x79\xb0\xcf\x66\xe3\x95\xe1\x0a\x6e\xc7\x8d\x12\x08\xb4\x8d\x5c\x30\xf4\x72\xc6\x2f\x5c\xec\x80\x7f\xa3\xf9\x85\xb7\x10\xa9\x19\x5b\xfa\x4a\x30\x70\x33\x0e\x10\xec\x04\xad\x4a\xc2\xff\x44\x97\x94\x27\x74\xca\x13\x0e\xa5\xd4\x8d\x76\x1f\x46\xa3\x2a\x98\x72\xaf\xa7\x7e\x4f\x91\xc3\x8b\x13\x6b\xc6\x2d\x72\x62\x7e\x3b\x03\xe3\xd8\xe9\x04\xa8\x15\x3c\x08\x35\x1a\x6b\x42\xc9\xf5\x2e\xa1\xa4\x37\xf9\x01\x76\xc0\x9c\x98\xae\x5c\xd1\xbc\xd3\xc8\x15\xe1\x87\x1b\x5b\x4f\xee\x29\x33\x46\xcc\xb5\x6a\xc5\x1a\x01\xbf\x76\x3e\xd9\x9e\x39\x1e\x8a\x5c\xf1\xe7\x81\x5c\xc4\x67\xb4\xed\xc1\x3f\xcb\x17\x1d\x1f\x02\x25\x09\x22\xce\x6c\xb6\x5b\x25\x34\x13\xb1\xef\xc6\xd2\x1a\x5b\x82\x09\xb9\xae\xc1\xb9\x36\x7d\xd1\xba\x14\x6d\x70\x18\xd1\x75\x55\xee\x3d\xb7\x28\x24\x81\x70\x9b\xb4\xc0\xc5\xd6\x93\x8c\x58\xb6\x98\x75\x71\x89\x9b\x17\x5e\xdf\x54\x2d\x81\x2f\x59\xb6\x20\xaf\x6f\x1a\x8e\x31\xc0\x1e\x66\xad\xd0\x3e\x78\xac\x48\xc2\x67\x4c\xf3\x1d\x4b\xb8\x87\x83\x9c\x4a\xc1\xb5\xcc\x37\xa7\x40\x93\x4e\x87\xd3\x0d\xd7\x95\xa1\xba\xf7\xcc\xce\x96\x05\x44\xde\x06\x77\x29\x89\x64\x92\xb0\x48\xdb\x92\x56\x00\x5e\xff\x5a\x83\xf2\xc4\xac\x3d\x60\x72\xfb\x27\x50\x9f\xac\xa2\x74\x86\x9b\x7b\x76\xfd\xea\xfc\xe2\xed\xab\x49\x1a\xff\x7a\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\xbc\x45\x85\x92\xc7\x8b\x5e\xc4\x2b\x6b\x55\x30\xab\x6e\x90\xc1\x5a\x5f\xef\x5d\xfe\x24\xf9\x56\x61\xd4\x02\xd8\x8e\x9c\x4f\x4a\x4a\x3d\x22\x39\xb5\x39\x92\xd4\x9a\x9e\x8a\x24\x41\x68\xeb\x9c\xb1\x51\x68\x8b\xd9\x9a\x1a\xd2\x79\x61\x07\x1b\x2a\x2a\x0b\xbc\x5f\x19\xe2\xe1\x11\xae\x0b\xc7\xd8\x2d\x93\xac\x43\xb1\x7c\xb3\x0a\xc7\x9b\xca\x7d\x34\x9c\xe9\x85\x81\xea\x2d\x5b\x11\x08\x04\x9e\xc9\xdc\xe0\x53\x5e\xc5\x0d\xa6\x23\x58\xfa\x59\xa1\x58\x3e\xb1\x6c\xe7\xc1\xc1\xd6\xa1\x8a\xd0\x1e\xc5\xdb\xfc\x8b\x4d\x30\xb3\xb7\xcb\xca\xbe\x56\x5e\xa3\x85\x5e\x30\xa1\x8d\xd8\x6f\x68\x99\x85\x4c\x23\x10\x6d\x1c\xf6\x83\x43\xad\x65\x11\xa3\x6e\x25\x87\x86\x32\x3d\x5d\x70\xd2\x9c\x9a\xae\xe8\x68\xde\x81\x44\xc4\x90\xcc\xfb\x5c\xae\x9c\xc6\x12\x02\x36\xb0\x02\x5d\x05\xd1\x68\x9c\x72\xf1\x04\x4f\x67\xc4\x45\xbc\x0b\x0e\x35\x03\x18\xbc\x51\x15\xc5\xec\x3d\x6b\xd0\xf7\x7e\x43\xea\x34\x29\x4c\x78\xb7\x1e\xc4\xaa\xff\xb0\xd5\xe1\x4b\x57\xea\xa7\x64\x8c\x5f\x19\x67\x71\x09\x95\xc1\x19\xb8\xee\xc1\xeb\xd7\xa4\xf4\x00\x2e\xbe\x9e\x76\x9b\x3c\xb0\x34\x74\xbf\x7a\xee\x83\x00\xaa\x8b\xcc\x73\x28\xf7\x2e\x69\x26\x34\xde\x57\x2e\xf9\x0c\x2b\x9b\xc1\x19\x75\xfa\x32\x34\xe4\xa7\x39\x4d\x99\x66\x39\x86\xc0\xd9\xa0\x3a\x61\xb3\x13\xde\x67\x4c\xdc\x68\x1a\xdd\xf6\x5d\x0a\x75\xe0\xb8\xf7\xc7\x71\x0f\x76\x05\x3a\x44\xb0\x75\x91\x56\xa1\x17\x99\x0b\xcb\x85\x9e\x08\x89\xf1\xe5\xc8\xba\x58\x39\x7c\x39\xaa\x2a\x77\x2d\xcb\x93\xa1\x61\x03\x22\xdd\x7c\x7d\x3d\x88\xe0\x47\x28\xf4\xc3\x0d\xdb\x9f\x01\x4b\x02\xf7\xf1\xa3\x05\xaf\x56\xa9\x43\x6a\xee\x4c\xb9\x2e\xcf\xbd\x62\x9a\x64\x2c\x4f\xb9\x4d\xeb\x96\x82\x44\x36\x2d\x00\xf8\x9a\xe1\x61\x76\xb8\x80\xe7\x09\x22\x23\x4d\x6d\xce\x0c\x99\x32\x7d\xc7\x98\x20\xcf\x9e\x3d\x7b\x06\x72\xc9\xb3\x3f\xfe\xf1\x8f\x04\xea\x48\xc4\x2c\xe2\xe9\xfa\x83\xf0\xd4\x7f\x3c\x7f\x3e\x21\xff\xe7\xfc\xed\x1b\x88\x2a\xcb\xb4\x22\x53\xa9\x17\x76\x64\xf3\x40\xe5\x65\x35\x22\xff\x73\xf3\xfe\x9d\x13\x27\x54\xed\x57\x50\x41\xfc\xf2\xaa\x21\x82\xcf\xfe\xf0\xfb\xdf\x4f\xc8\x05\xcf\x21\x9f\x98\x43\x06\x84\x0f\x82\xcc\x5c\x60\x20\x34\x1e\xaa\x67\xf0\x5b\x0e\x62\x83\x84\x53\x3e\x5f\x00\x00\xcc\x81\x90\x62\x96\xf0\x48\x63\x4d\x41\x3c\xfa\x08\x68\xdb\x17\x89\xda\x74\x2f\x2b\x45\xc0\xe4\x46\x24\xe1\xb7\x8c\xcc\xd4\xd7\xb9\x2c\xb2\x32\xcd\x31\x67\xca\xc8\xb2\x11\x15\x90\x55\x02\x83\x95\x7b\xa5\x98\x7e\xd4\x20\x8c\x96\x86\xa0\x0a\x0e\xc2\x3b\x35\x01\x65\xe4\x6b\xab\x8d\x11\x1f\x32\xca\x7d\xe0\x20\xf8\xd4\x2b\x95\xfd\xbd\xee\x19\x07\xb5\xe4\x5c\xee\x4a\x96\xcb\xbf\xe3\x56\x71\xe1\xb2\xa0\xac\x84\xac\xac\x4c\x66\x93\x4e\x45\x60\x73\x75\x59\xf9\x86\x17\xda\x8c\xff\x20\x7f\xea\x72\x16\x26\xda\x41\x5a\x3a\xb6\x57\xab\x14\xbe\x6c\xf8\x72\x59\xac\xdd\x60\x93\xc2\x7d\x2d\xc4\xda\xdb\xb6\x8f\x8a\x25\x3f\xb6\xbb\x8e\x4d\x61\x2b\xc7\xc0\x50\x5c\x9b\x00\x14\xf4\x6c\xaa\x14\xa3\xab\x44\xf9\x28\xa6\x0b\x0b\x1a\x88\xbc\x32\xdf\x66\x4a\xd9\x3c\xa2\x94\xe6\xb7\x46\x49\xb0\x54\x60\x02\x51\xcf\xca\xe7\x30\x61\x42\xd9\x12\x8d\xe5\x29\x5d\x55\xb2\x06\xcc\x47\x8e\x27\x93\x63\x3c\x26\x32\xc7\x5a\x9e\x88\xf3\xe6\xfe\x23\xe5\x4b\x57\xa3\xd2\x69\x86\x6d\xf7\xc0\x9e\x63\xdb\x96\xd0\x4a\xb4\x33\xb5\x90\x6a\x53\xc1\xb7\x63\xdb\xc2\x6e\xfd\x71\xdb\xf7\xc5\x1d\xc3\x02\x5a\x3c\xda\xb5\x07\x6e\x87\xde\xb7\x9b\xaa\x35\x58\x18\xdb\x93\xd0\xb6\x23\x64\xe7\x5a\xe0\x69\x2b\xd6\xd7\x30\xd5\xe3\xd4\x72\xbe\xf7\xdd\x38\x9f\xcd\xd7\xab\x34\x07\x7b\xfa\xac\xee\x72\x86\x99\x2e\x55\xd2\x65\x49\x43\x28\x0a\xf8\x46\x5c\x65\xda\xcb\x93\xe6\x68\x21\xda\x74\x2b\x3c\xdf\x85\xbb\xe1\xd5\xce\x31\x81\x57\x05\xd7\x9c\x77\x02\x17\x6d\x49\x69\x56\x69\xf0\x91\xa0\xdd\x00\x64\x4c\x77\x78\x26\xe4\xad\x25\xb5\x88\x64\x74\xaa\x64\x52\x68\x7c\xb5\xfc\x31\xa4\xc3\x30\xa8\xab\xb2\x00\xc4\xd7\x3f\x16\x50\x65\x5d\xb6\x38\x6b\x47\xa0\xf1\xea\x70\x38\x87\x6a\x9f\xf7\x58\xed\xd3\xd7\xa7\x55\x2d\xfb\x35\xa9\x7b\x2b\xaf\x1b\x29\xde\x45\xbf\x52\x9c\x9c\x94\x6d\x42\x9c\x3b\xfe\x52\x68\x96\xcf\x68\xc4\x4e\x43\xbd\xcb\xb7\x63\xf1\x21\x42\x2e\x2f\x62\x41\x45\x9c\xa0\x00\x1e\xb1\x1c\x70\x9f\x7d\xd2\x2c\x37\x20\x79\x79\x73\x49\xe2\x9c\x2f\x59\xae\xc8\xc9\x57\xcc\xc8\x8b\x8c\xea\x22\x67\xad\xb2\xab\xfa\x8d\xad\x84\x69\xf4\xa5\xe9\xc1\x60\x5d\x43\xf5\xe0\x25\x47\x79\x44\x70\xbe\x4a\x30\x21\x54\x11\xa4\x2a\xd4\x65\x27\x06\x95\x80\x40\x03\xcd\x58\xc9\x22\xb7\x56\x74\x57\x57\x35\x92\xb9\x51\x97\x70\x60\xaa\x48\xce\xe6\x46\x9a\xcd\x5d\xb3\x61\x46\xa2\xa4\x30\x37\x7a\x0d\x67\x3b\x24\x00\xb0\x34\xcd\x6e\x8b\xd5\x9b\x59\xa9\x5a\x2e\x79\xec\x58\x25\xf6\x3e\xf6\x5d\x0d\x33\xaa\x82\x54\x9b\xa0\x02\x7d\x00\x58\x94\xd1\x81\xa1\xfa\x24\xd6\x4a\xb0\x7f\x68\x14\x96\x50\xdb\xa2\x45\xfb\x88\x2e\x44\x58\xc6\xec\xaa\x98\x26\x5c\x2d\x6e\xf6\x34\x21\x36\x0d\x81\xc1\x0a\x6b\x5e\xbf\x8d\x96\x44\xc5\x84\xe2\xc0\xf2\x0c\x19\x37\x4c\x97\x1b\x39\x4a\x02\x10\xdd\xdb\x21\x42\x4a\xc8\xfe\x48\x98\xad\x60\x60\x7e\x7a\x57\xce\xc3\x26\xa5\x61\xcd\x92\x98\x7d\x2b\xb2\xca\xfd\x88\x26\x89\xaa\x27\xec\x3a\x8a\x89\xb2\x87\x4b\x54\xc3\x3d\xe5\x66\xbb\x7d\x67\x94\x5a\xf5\xcb\x8d\x0b\x53\x24\x95\x98\xc6\x23\x88\x14\xee\x21\x28\xbd\xe2\x5e\x08\x12\x19\x21\x5d\x19\x50\xa6\xe7\xd6\x91\x83\xb9\xf4\xfe\xcc\xa5\x87\xc6\xe1\x85\xfd\xde\xcb\x6c\xe8\x4a\x59\x52\x4f\x4a\x1d\xc9\xdd\x11\xd4\xd1\xab\x5b\x01\xbf\x79\xae\x75\xce\xa7\x85\xee\x5e\xef\xad\xf6\x3a\xb0\x69\xa3\x88\xc0\x29\x1e\xdb\xd5\x47\x01\x8a\x5a\x0d\xc1\x9f\x85\xf5\xb3\x5f\xf2\x1c\x60\x37\x78\xf3\x58\x91\x58\x46\x85\xaf\x0b\x0b\x40\x2b\x1d\x68\x6d\xaa\x27\x92\xae\xe7\xaa\x7b\x49\xaf\xf0\x23\x3b\xd1\x2b\x96\x77\xe2\x8e\xe6\xf1\xf9\xd5\x8e\xe8\xfb\x2a\x3b\x2f\xdf\x0a\x05\x25\x77\x1b\xba\x00\xd2\xa9\x2c\x74\x59\x3a\xf4\xe7\x63\xaf\x6e\x52\xd3\xb5\x34\xa4\xa1\xa5\x3d\xba\xab\xa2\x3f\x98\xb8\x07\x13\x77\xe5\xda\xc7\xc4\x7d\x89\x26\xee\xb0\x0e\x6e\xe5\xb8\xba\xf2\x0a\x3c\x69\x1b\xdb\x7b\x9f\x56\xd2\x8b\x92\xc0\xa0\x34\x55\x8f\xe3\xaf\x09\x70\x78\x44\xca\xbd\x0d\x84\x3e\x47\x81\x80\x67\x3f\xbe\x45\xf5\x9e\xec\xa4\xed\xfb\x14\xe3\xb5\xa9\x91\xe0\xb6\xbe\xc5\x20\x35\x04\x8d\x86\x47\xb6\x0a\xf4\xc8\xea\x5d\x22\x2e\x5b\xf8\x61\x11\xea\x0e\x6d\x4a\xf1\xea\x08\x7c\xd2\x79\x03\x48\xc7\x26\xc2\x78\x75\xdd\x0d\xb2\x47\x43\x61\xbc\x1e\xb9\xad\x30\x5e\x9d\x6d\xdf\xa4\x7b\x8b\xe1\x86\xe5\xde\x6f\xa3\xe1\x3d\x97\xb6\xbf\x59\x7f\x5f\x73\xfe\xa8\x6c\x6f\xf7\xf4\xd9\xfa\x60\xce\x5f\xbb\x1e\xd0\x9c\x1f\x10\x6e\x47\x0c\x1a\x4c\xfb\xa1\xb9\xcd\xd9\xf7\xa7\xcc\x89\x95\x93\xb2\xfa\x9a\x41\x39\x67\xd9\x97\x79\xd5\xad\x7a\x3c\x99\x1c\x1f\x3b\x7b\xbf\xc5\xcf\x42\xcf\xc6\x7f\x22\x4c\x44\x32\xc6\x4d\x35\xe3\xe7\x4a\x03\xd3\x2f\xd5\xf4\x70\x2e\xa9\xfb\x56\xe8\x9a\x85\xb1\xbb\x6d\x49\x87\x13\xdc\xbd\x6d\x78\x13\xa4\x1f\xa2\x79\x78\xd8\x22\xbc\xda\x11\x1c\x9f\x38\xa4\x0d\x78\x08\xbc\x7b\xe7\xaf\xad\x1b\x83\xe3\xb5\x0f\x7b\xdd\xa3\x49\x38\x5e\x0f\xdc\x2a\x1c\xaf\xbd\x38\x6a\xa7\xb6\xe1\x0d\x8b\x7b\xb8\xe6\xe1\x78\x3d\xd1\x46\x32\xd5\xab\x53\x23\x71\xbc\xf6\x6b\x27\x5e\x7d\xb7\xe3\xd6\xf7\xd2\x5a\x1c\xaf\x6e\x0d\xc6\xf1\xea\xbb\xcd\x38\x5e\x2d\x21\x01\xc6\xf0\x0b\xde\x29\x15\xc1\xbd\x53\x0d\x97\xd4\x2c\xcd\x64\x4e\xf3\x15\x89\xad\xad\x61\xd5\x90\x11\x1a\xa4\x84\x1e\x5c\x1a\x06\xe6\x11\xf3\xbc\xa7\x6c\x84\x0e\xd9\xa0\x2c\xe6\xc5\xc6\x76\xcd\x9b\xc0\x86\x6f\x85\x40\xbb\x83\x6a\x60\xb6\x92\x98\x73\x77\xda\xc7\x5c\x61\x45\x1a\xdd\xda\x8e\x41\x0e\xaa\xc8\xfb\x83\x24\x97\xa3\xa3\x5a\x1d\x68\x30\x8f\x81\xef\xcf\x76\x46\x74\x0f\xe3\xd8\x15\x53\x16\x7a\x43\x6c\x58\xc0\x89\x7d\xf0\xd4\x48\x24\x6f\x81\x0d\x3e\xd0\x2e\x91\x8e\x99\x6d\xfc\x1f\x0c\xda\x8d\x75\x8e\x8d\x77\x2f\xfa\x72\xd0\x12\x24\x73\xdf\x17\x2d\x91\x51\xe0\x7b\xae\x70\x28\xd8\x86\x57\x0e\xf9\x9d\xed\xde\x6c\x86\x19\x15\xe5\x0b\x30\xfa\x24\x0a\xfd\x7a\x3c\x82\xd2\x96\x20\xc5\x03\x30\xfd\x06\x7c\x08\xba\x04\x16\xca\x7c\x09\x2a\xcf\x07\xcf\x94\x1f\xba\x73\x15\x36\x75\xd0\xc8\xad\xaa\x7b\x98\x5f\x6e\xfc\xca\x4a\xbd\x0d\x52\x20\x9c\xa0\xae\x0a\x10\x13\xed\x57\xac\xb8\x24\x67\xe0\xbb\x2a\xdb\xa2\xf9\xe2\x8e\x6b\x68\x26\x78\x52\xc5\x33\x57\xcb\xce\x2f\xbc\x10\x36\xd0\x60\x0d\x69\x9a\x71\xa6\x50\x2c\x1f\xcf\x0b\x1e\xef\x83\x2d\x4f\x98\x01\xb6\x66\x7b\xdd\x99\x5d\x47\x16\x77\x00\x63\xf3\x81\x18\x1d\x58\xc3\x51\x19\xbd\x51\xe1\x0d\x61\x59\xbc\x6a\x24\x07\x75\xc1\x02\xfe\xc8\x39\x97\xd0\x07\xaf\xda\x5a\x9e\x11\xad\x22\x9b\xac\xcb\x2b\xe5\x2e\x71\x58\xc4\x3c\x08\x6c\x1d\x9b\xff\x38\x15\xd8\xd9\xf3\xa7\x6c\x26\xcb\x0e\x29\xa8\x11\xd9\x70\xdc\x98\x25\x0c\xda\xc8\xbb\x16\xf5\xe6\x01\x70\x09\xa7\x72\x69\x90\xf9\xa3\x20\xdf\xba\x9a\xfd\x7c\xf6\x82\xd0\xd3\x4a\x0a\x84\xed\x3a\x23\x18\x8b\x31\x46\x37\x29\xbf\x93\x17\x42\x8d\xc8\xf4\xd4\xc5\xa3\xc0\x89\x13\x46\x2c\x4c\x9c\xc4\x8b\x7a\x75\xce\x0c\x00\x20\xed\x38\x97\x29\x51\x82\x66\x6a\x21\x35\xa8\x86\x34\xa3\x11\xd7\x2b\xa2\x73\x1a\xdd\x42\x8b\xa2\x9c\xd9\xcf\x8d\x48\x74\x6a\x03\xbb\x42\xf0\x55\xc3\x86\xf5\x22\x97\xc5\x7c\x01\x91\xb0\xf8\x54\x94\x50\xe5\x56\xdf\xf8\xbe\xd5\x76\x14\x89\x57\x82\xa6\x3c\xf2\x55\x03\x73\xb9\xe4\x8a\x4b\x6b\xed\x75\xe3\x5e\xf9\xca\x70\x68\x41\x7e\x99\x50\x9e\x92\x13\xc5\x18\x79\xe5\x50\x02\x7f\xb1\x6d\xec\xd1\xb2\x91\x57\x83\x03\xa4\x2f\x69\x2e\x6c\x41\x84\x92\xc0\x79\xe7\x15\x32\x4c\x33\xf3\xc6\x8f\x9e\xfa\xed\x6a\x9e\x93\xcc\xc1\x71\xef\x4a\x77\x32\x11\xcb\xc0\x6b\x79\x7e\x75\xa9\x42\x6d\x04\x71\xcb\xd6\xbd\x83\x1f\x12\x29\xe6\x61\x19\x81\x12\x33\x0d\x29\x15\xd0\xde\x65\xc9\xe3\x82\x26\x48\x44\xed\x64\x5e\xde\x5c\xe2\xeb\x7c\xbe\xd0\xe3\x3b\x06\xd6\x18\xe4\x35\xe5\x99\x71\x1f\xe5\x6b\xd1\x3a\x5c\x01\xd1\xd5\xd6\x9a\x80\x96\x2d\x33\xb5\x3b\xba\x82\xb2\x35\x36\xc4\xa4\xe2\x30\x75\x85\xc5\x70\x88\x26\x88\xc3\xf4\xce\x7d\xbb\x0e\x23\x36\x80\xb9\xca\x80\x18\x30\x75\x7d\x6e\x06\xf0\x41\x1d\x40\x7f\xdb\x76\x66\xa3\x66\x83\x8c\x70\xb7\x5d\x97\xb9\x07\xa1\x6c\x59\x6e\xf2\x07\xdb\x3a\xb1\xa3\x70\x70\xf4\x7d\x60\x36\x0b\x1c\x1d\xe6\xd8\x50\x11\x8f\x69\x62\x30\xe7\xea\xbb\x97\x36\xc2\x19\x0f\x42\xc5\x91\xef\xba\x20\x71\xe1\xcb\x66\x1b\x99\xa1\xf1\x08\x40\x1e\xfc\x94\xc5\x40\x34\xc2\x86\x91\x77\x46\x43\xb6\x9b\x77\xf5\xdd\xcb\x11\xe1\x13\x36\x71\x7f\xf9\x47\x1d\xd5\xd2\x72\x8e\x61\x80\x3e\xc6\x13\xf0\x0e\xa6\x12\x1a\xa3\xc2\x77\xff\xf6\x67\x33\x49\xf3\xeb\x5f\xc6\x7f\x0e\xaa\x8d\xfe\xe5\x6f\x86\x08\xe6\xe6\x81\xea\xdd\x30\x96\xcc\x57\xdd\xff\xdb\x95\xad\x4a\x6d\x6b\x56\xff\xcd\x36\xe3\x62\x42\x1b\xb9\xf1\x4a\x82\x97\x9e\xc7\x88\x8d\xf0\xed\x9c\xfd\xdd\x19\x16\x01\x4c\xde\xa8\x13\x51\xcd\x04\x10\x6a\x97\x94\x21\xa4\xc6\xd7\x6d\xdf\x59\x33\xff\x13\x30\x09\x60\x52\xd9\x88\x68\x29\xe1\x38\xe2\x91\x3f\x17\x84\xb9\x5e\x9d\xb8\x56\x00\x07\xb5\x81\x6a\x8e\xf7\x98\x61\x0d\x84\x7d\x0a\xae\x99\x07\xcc\xed\x0b\x21\xf5\x17\x7e\xfb\x6b\x5d\xc4\xe9\x52\x72\x57\x80\xdc\x9c\x14\x81\x1d\x1d\x7d\x49\xec\xe9\x8a\xa4\x5c\x69\x7a\xcb\x26\xe4\xc6\xf0\x96\xd0\x1b\x86\xd0\x13\x04\x2a\x58\xb2\x98\x14\x42\xf3\x04\x7e\x2d\xc7\x31\x53\x0e\x79\xce\xe5\x8c\xa8\x02\xda\x9b\x67\x39\x1b\x3b\x2e\x66\x9f\x5a\xa3\x05\xe5\x5a\x46\x7e\xb3\x17\x14\x75\x81\x2c\x86\x57\x01\x1e\x54\x58\xf4\x5a\x8b\xe3\x32\xf3\x94\x22\x2a\x39\x17\x00\x53\x4d\xc8\x3b\x60\x56\x89\x73\x09\xa3\x5a\x62\x0d\x98\x82\x45\x4c\x29\x9a\xaf\x46\x50\xd8\x9d\xfb\x62\xe0\x36\x74\x07\x38\x6a\x4a\x05\x96\x55\xcf\x59\x24\x85\xd2\x79\x11\x69\xec\xb3\x37\xcd\xe5\x2d\x13\x3e\x5c\xd0\xec\x62\x35\x80\xab\x8c\x9f\x01\x7f\x97\x24\xd1\x82\x8a\x79\xd0\xa7\x26\xa5\x31\xc0\xfe\x1b\x2f\xe5\xb8\xf5\x18\x08\xd0\x99\x11\x2c\xb8\x06\x50\x4c\x0d\x1f\xf1\x66\xd8\x8f\xc2\xd7\xe3\x19\x95\x76\x52\xb3\x24\x9e\xec\xa0\x5d\x9d\xe8\x17\xe9\x68\xd4\x1b\x03\xdb\xee\x39\x00\x2c\x65\x9a\xc6\x54\xd3\x3d\x82\xc0\xde\x96\xcd\xf5\x5c\x7f\x7d\x6c\x70\xea\x1d\x93\x96\x0f\x39\x71\x4b\x66\x3c\xcc\x7f\x82\x93\xb8\x70\x90\x87\x8c\x6b\x6d\x70\xca\x3a\x0a\x30\xb6\x0b\xe4\x19\xd7\xbd\xcc\x0c\xef\x46\x43\x72\x51\xb6\x66\x2c\xc9\x49\x3b\x37\x54\x47\x0b\xac\x01\xfd\x1e\x30\xfa\x50\xfa\xca\xa2\x6a\x7c\x57\xa3\x08\x82\x5c\x82\x09\xcd\x73\x16\xa6\x9b\x59\xd0\x15\x02\x91\xbc\x06\x44\x80\xf2\x9c\x69\x55\x46\xa8\x20\x1d\x36\xc4\xc5\xf2\x3b\xab\x8c\x02\x91\xb6\x80\xb5\xfa\x5c\xb3\x2c\x84\x60\x57\xd2\xd2\x59\x43\xf9\xef\x05\xae\xfb\x18\x9d\xb1\x9d\xc0\x5b\x19\x77\xb1\x53\xd7\xaa\xf0\x97\x43\x94\xf1\x9b\x18\x89\xab\x40\xa9\xc7\x07\xc0\x5b\xa5\x2a\x49\x73\x48\xe4\x16\x74\xb9\xbf\x91\xaa\x94\x91\xc6\xbe\x94\x31\x7c\x6e\x0c\x9f\x1b\x3f\x6f\x6f\xcc\xeb\x12\x01\xe2\xae\xd6\x91\x20\xd5\x8f\x74\xb2\x9c\x1a\x92\x72\xd3\xd1\xdc\x59\xcb\x46\xf6\x23\x58\x9a\x6f\xbd\x88\xde\x73\x6b\x33\x1d\x18\x37\xd4\xe2\x05\xf9\xa2\xc2\xe5\xad\x34\xe5\x35\x25\x8c\xd4\x3d\x71\xaa\xd3\xc4\x6e\x85\x4b\x3e\xaf\x3e\x7e\x5a\x1b\x0c\xc4\x8b\x66\x8d\xc2\x45\x04\x7b\x91\xcf\x88\x67\x39\x18\xcf\x5c\xfe\x81\x41\xaf\x5c\x26\x09\xcb\x61\x09\x56\x7b\xaa\x79\xd1\xa1\x96\x29\xda\x74\x47\x5e\x45\xf5\x32\xa6\x60\x77\x5e\x98\xa0\x0a\x4b\xb7\x38\x8f\x17\xb3\x8d\xf3\x36\x8e\xe7\xa3\x96\xcf\xc5\x0a\xa7\x7e\x11\x80\x16\x55\x4f\x32\x37\x1f\x32\x52\xa7\xa0\xd3\x04\xbd\xc7\x9e\xd9\xc2\x5c\x68\x72\x47\x57\x0a\xf0\xbe\x94\xe6\xfd\xf7\x6d\x55\xb5\x72\xe0\x6b\x36\xc3\xb7\x5b\x7b\xc4\xf6\xf2\x89\xed\xe3\x15\x83\x74\x4a\x2e\xda\x84\x20\x95\x2f\x6c\x6d\x1c\x52\xbf\xf6\x71\xa3\x41\x9c\x0a\xb8\xcf\xbb\xf9\x44\xaa\x7d\xca\xaf\x2e\x61\x08\x27\x93\xcf\xe1\x0f\xc7\x71\xbc\xd3\x60\xca\x0c\x56\x97\x89\xd2\x80\x21\xe1\xbb\x0d\x91\x04\x25\x6a\x7d\x03\xd5\x58\xad\x95\xd8\x77\x1a\xcb\x19\x44\x82\xc0\x17\x27\xd0\x8e\x80\x8a\x95\xe5\xe4\x7a\xc1\xf3\x78\x9c\xd1\x5c\xaf\x50\x7d\x1c\x55\xbe\xe6\xc3\xeb\x3b\x2d\x7c\x4f\x77\x4e\xbb\xd2\xc7\x1b\x21\x0c\x8b\x77\xe6\x61\x6b\x9d\xdf\x08\xd7\x87\x58\x4f\xfb\x00\xfe\xc6\xf5\x84\xa5\x45\x9d\x46\xf8\x68\xeb\x89\x43\xf2\x71\x38\xdf\x30\x34\x48\x55\x5d\xaf\xc8\x06\xc2\xd6\x55\x32\x8c\x82\xf6\x5c\x1e\x14\x22\x33\xd2\xc8\xe8\xa1\xb4\xec\x35\x1e\x18\xf6\xac\xa4\xe0\x62\x68\x6c\xa7\x23\xb1\xb2\xa6\x9b\xf0\x5b\xe1\x00\xfe\x94\x90\x13\x21\x05\x9e\x1c\x7c\xf6\x14\x43\x88\x36\xd8\xa6\xe0\x11\xdb\xa2\xae\xda\x21\x34\x38\xa9\x8e\x49\x70\x11\x9b\xad\x03\xca\x0d\x3a\x92\x2a\xa2\x88\x31\xaf\x55\x87\x2d\x6a\xca\x93\x6d\xa7\xec\x5a\x5d\x2a\x09\x45\x5c\x94\xa6\x49\x52\x6a\xb3\x16\x5c\x12\xf8\x9c\xb3\x00\x06\xec\xaf\x92\x68\x63\x15\x7b\x68\xa2\x8e\x61\x2f\x85\x88\xd0\x85\xcf\xf5\xca\xcd\xe0\xa2\xce\xea\x41\x8d\x50\xa8\xe4\xf2\x19\xda\x9d\x02\x75\xc0\x03\x13\x48\x93\x6d\xe1\x5e\xe5\x4c\xb6\x36\x83\xa1\x43\x53\x1a\xdd\xde\xd1\x3c\x86\x56\xbe\x19\xd5\x1c\xcb\x82\x8f\x2a\xc3\x9e\x04\x73\x80\x46\xfa\x21\x16\x9d\x7a\xa5\x43\x31\x5f\x82\xba\xfc\x0c\xa1\x85\x96\x29\xd5\x3c\x02\x55\x96\xcf\x02\x2b\x62\xea\x4b\x1a\xd6\xda\x0e\x02\x95\xf5\x0d\xec\x3f\xa0\x37\x26\x67\x44\xdf\x49\xc2\x53\x23\x21\x50\x68\xa5\x31\xf3\x19\x43\xce\xde\xb9\x6d\xa6\x46\x0c\xfa\x1e\x8c\xcc\xc1\x53\xa8\x24\x1b\x15\x4a\xc1\xf0\xde\xa2\xe9\x4d\x79\x36\xe5\x66\x54\x63\xe0\xf6\x1d\x83\xd3\x66\xae\x01\xaa\x8e\xcc\xf6\xdc\x31\x23\x17\xa8\xad\x08\xab\x26\x4d\x33\xc2\x9e\xb6\x8a\xc4\x5c\xd5\x1a\x53\x9f\xc4\xb9\xcc\x32\x6b\x20\x49\x4f\xeb\x33\x02\xbf\x41\xbe\x64\x2a\xe8\xbd\x8c\xa6\xea\x39\x13\xbe\x79\xb8\x2d\x67\x01\x27\xb7\xfe\x89\xca\x81\x99\x60\x42\xe8\x29\xf9\xd6\x36\x15\xf2\x88\xeb\xa3\xee\x5a\x09\x4e\x68\x6d\xb1\xb2\xd3\x20\xf1\xb4\xbd\x06\x89\x67\x90\x78\x7e\xd9\x12\x8f\x0f\xf7\xda\x57\xda\x29\x63\x1c\x6b\x0d\xc9\x5d\x30\x40\xf9\xc0\x26\x23\xc6\xe5\x8c\x5c\xb3\x48\x2e\x59\x8e\x44\x0e\x1a\x7f\x1a\x5e\xfe\x9a\xf2\xc4\x90\x38\x47\xea\x4a\xf5\x10\x2a\xaa\x56\x4d\x73\x81\x46\xee\xa1\x69\xd1\x3c\xb5\x93\xb2\x99\x7e\xe6\x79\xeb\x24\xcb\x72\xb6\xe4\xb2\x50\x2e\x64\xa1\xd0\x78\xcc\x94\xb6\xfc\x76\xc1\xe7\xbe\x30\xb7\x77\x75\xe6\x2c\x92\x79\x5c\xa6\x94\x2b\x4d\x75\xa1\xaa\x79\x12\x11\x5a\xd3\xfa\x33\xd0\x78\x38\xde\x33\x75\xdf\x8f\x92\x62\xc4\xc6\x01\xa7\xe2\xf8\x0d\xc6\x7c\x94\x7d\xb7\x75\x10\x86\x52\x86\xc0\x18\x11\xaa\xd0\x2c\x40\x2b\x8b\x00\x9d\x61\x5d\xc9\x7a\x3d\xc3\xc6\x2d\x63\x3f\xec\xb8\x8c\x3a\x69\x51\x71\x3d\xbc\xf6\x82\x3a\x39\x20\xc1\x33\xbc\x9e\x70\xe0\x49\x6d\xb1\xdd\xa3\x2f\xc9\x81\x11\x98\xe4\x90\x28\x4c\xd2\x67\x24\x26\xf1\xf1\xdc\x87\x9c\x98\x6b\x17\x49\x5e\x3b\x33\x96\xf0\x6e\x3b\x33\x95\x82\x02\x7e\x1c\xae\x5c\x07\x48\xeb\xd6\xf4\x67\x00\x4c\x82\x61\x3c\xb0\x3d\xad\xa0\xcd\xa1\xef\x92\x7d\xf2\x55\x7f\x03\x39\xa6\x6c\xaa\xad\x25\x44\x20\xa4\x19\x56\x02\x82\x53\x37\xb6\x21\x59\x4e\x5b\x1a\x4e\xf0\x70\x82\xdb\xbe\xff\x98\x27\x18\x23\x9e\xbb\x04\xe4\xd7\x3a\x05\xe1\xeb\x36\x09\x97\x4e\x59\x42\x7e\x2a\x58\xbe\x22\x46\x08\x2a\xc3\x7b\xa0\xbc\xb1\xe2\xb1\x0d\x90\xb1\x46\x95\xf6\x32\xfb\x03\xf2\x7f\x30\xd9\xbc\xfa\x64\x24\x40\xc8\x63\x3b\x80\xae\xd5\x87\xaa\xa6\x2a\x23\xb4\x3c\x04\x43\x09\x0f\x3d\x8c\x15\x99\xcf\x88\x7b\xe7\xef\x2e\xf6\x53\x74\xba\x39\xb5\xc8\x3e\x8e\xad\xb5\xc5\x9f\x6f\x59\x20\x02\xc2\xff\x52\xed\x26\xe5\x4d\x11\xe4\x96\xad\x46\xd6\x0f\x6e\xab\xb7\xbb\x87\x31\x9c\xa3\x5a\x52\xb4\x6d\xa9\x8a\x26\x00\xed\x41\x21\xf7\xb3\x1e\xe0\xd5\xbe\x08\x65\xf5\x2d\x07\x84\xae\x84\x78\x6f\x12\xde\xa9\x58\x65\x78\x6d\x2a\x5c\x89\x38\x01\x15\xf8\x5c\x5c\xb3\x47\x03\x88\xe5\x06\x6a\xd1\x75\x13\xc9\xfe\x2a\x30\x5e\x0e\xb0\x07\x2f\xd5\xa3\x69\x25\x30\xf7\x96\xad\x8e\x95\xcd\x1a\x94\x42\x2d\x78\xe6\xea\xc3\x03\x25\xb0\x98\x4b\xbe\x83\xf8\x00\x37\x04\x9e\xf9\x4b\x31\x22\xef\xa4\x36\xff\x7b\x05\xa1\x42\x68\xa9\x94\x4c\xbd\x93\x1a\xee\x3c\x38\xb0\x70\xba\x07\x83\xca\x9a\x29\x39\x98\x19\x31\xa4\x0d\xf2\x33\x5c\x08\x0a\x80\xc4\xfa\x5b\x3d\x58\xb9\x22\x97\x82\xc8\xdc\xc1\x44\xbb\xe2\xc1\xca\x0e\xe1\x6c\x4b\x81\x45\xb8\x61\x0c\x0b\x4a\x99\x57\x20\xb9\x65\x38\x6f\x5c\xe6\xee\x17\xb0\x3d\x81\x35\xde\xc7\xcd\x40\x09\x5c\xaa\xd9\x9c\x47\x24\x65\xf9\x1c\xf2\x43\xa3\xc5\xfe\x1b\xd4\x9d\x6e\xe3\xb5\x17\xf5\x0e\x3f\xdc\x19\x33\x80\xd5\xbd\x81\xc8\xa5\x43\x19\x26\x8e\x82\x2c\x22\xa5\x99\x41\x8a\x7f\x1a\x4e\x00\xfb\xf2\x6f\x28\x59\xad\x26\xe4\xdc\x35\x3c\x0d\x7f\xb3\x56\x8c\x70\x18\x33\x82\x91\xe9\x7f\x2a\xf8\x92\x26\x0c\xe3\xf9\xa8\xf0\x65\x3c\xe5\x6c\x8d\x4d\x8f\x6c\xdd\x6a\x43\xa5\xbc\x67\xe8\xe8\x96\xad\x8e\x46\x6b\x88\x74\x74\x29\x8e\xca\x24\xed\x0a\xea\x78\x86\x06\x4e\x83\x23\xf8\xed\xa8\x6f\xce\xfe\x48\xa2\xfd\x1e\x58\x62\x0d\x42\x2f\x13\xaa\x54\xb7\xfc\xd6\x5a\x6a\x51\x6d\x9c\xa6\x02\x8c\x37\xc1\x33\x65\x72\x91\x8d\xde\xec\xdd\x9e\x05\x51\xfe\xdd\x23\x8d\x3a\x41\x6f\x69\xbb\xa7\xb4\x2f\xdc\xd0\x58\x50\x0c\xca\x16\xb8\x1c\x8e\x4a\x5e\x5c\xe9\x8c\xdd\x00\xaf\xef\xc0\xae\x28\x67\x61\x93\x67\xae\x40\x0d\xe6\x2e\xab\x43\x48\x4d\xb8\x88\x92\xc2\x9a\x14\xe1\x55\x50\xa2\xbb\x8a\xfa\x7b\x00\xe7\x00\xa4\x2a\x07\x70\xd8\xe4\xdc\xbe\x6b\x01\xbc\x75\x0f\x1d\xf8\x44\xbd\xc7\x0b\x61\xd5\xf7\x5a\x67\x3b\xc2\x25\xab\xc5\x38\xa3\xaa\xec\xf1\x9a\x4f\x73\x46\x5e\x2e\xa8\x10\x2c\x09\xb2\x5d\xad\xb1\xc3\xb7\xb3\x02\x81\xc4\x36\xb1\x3a\xae\x76\xb1\x72\xf4\x4d\xf8\xdc\xea\xde\x7b\x07\xff\x9c\x9a\x4a\xf5\xd6\xa7\xdc\x96\x6a\x5c\xc8\x3b\x12\x4b\x72\x07\x7d\x0b\x96\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x39\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xd3\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x13\xf3\xf0\xe9\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x9c\x92\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6a\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x21\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x8d\xdb\x95\xc1\x55\xf1\x99\xe7\x7c\x3e\xdd\x88\x7d\x62\x91\x8d\x0a\xce\x92\x62\xce\x77\xa4\x3f\xfc\xc2\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\x0f\xcd\x05\xc8\x63\x96\x31\x11\x43\x49\xb4\xd7\x25\xe6\xe2\xe4\x7b\x85\x9c\x2d\x2f\xd6\x95\x6a\xb9\xaa\x64\x15\x0a\x1e\x84\x70\x2d\x64\x12\x2b\xc2\x3e\xe9\x9c\x1a\xc2\x94\x1a\x12\xe4\xdf\x99\x11\x2a\xda\x13\x99\xa7\x51\x22\x98\xf4\xce\xed\xef\xb7\x5f\xe6\x53\x6c\x79\x59\xae\x5d\x6d\x6d\x58\x7d\x58\xe9\x7a\x24\xc4\xf6\xac\xa8\x6a\x84\x70\x43\x89\x79\xfb\x95\x6a\x64\xe2\x61\xa5\xe6\x55\x43\x51\xed\xda\xac\x86\x36\x9d\x9f\x45\xdd\xf9\x19\x24\x06\x77\x29\xc2\x64\xdf\xa8\x69\xd4\xf6\x66\xbd\x21\xf4\x16\x0d\xda\xe2\x6d\xc0\x07\xa0\xe2\xa9\x1d\xc8\xa6\x35\x11\x65\x60\x59\x86\xce\x15\x42\xec\xa2\x62\xf7\x51\x45\x9c\x6a\xaa\x98\x6e\x67\x4d\xa9\x8a\x0e\xe5\x9b\xe6\x00\x86\xf8\x65\x7f\xc2\x2a\xf6\x10\x90\xee\x92\x65\xc9\xf8\x2f\x56\xca\x10\x95\x27\x8d\x7c\xe1\xe0\xe3\x8a\x34\x31\xef\x45\xc6\x31\x62\xb3\x2b\x11\xd5\xad\x5b\xee\xb4\xe2\x0b\x76\x06\xdf\x7e\xdb\xb9\x97\x6b\xf0\xa6\x93\x43\xe0\xdf\x55\x20\x58\x5c\x80\x42\x3e\xfc\xa7\x22\x54\x07\xa0\xb8\x85\x5f\xb6\x7d\xbe\xaf\xb5\xcd\x23\x56\x1a\xaf\x2e\xb8\xba\xed\x52\x8c\x6c\xed\xe5\xea\x91\xf8\xfa\xe5\x2b\x62\xef\xb6\xb2\x2f\x75\x31\x30\x1d\x5a\x19\x6b\x1e\xb1\xd2\x68\x1b\x73\x75\xfb\xe0\x6d\xd5\xb3\xf8\xdd\xae\x08\xf0\x87\xb3\x7f\xd5\xa5\x5e\x57\xa2\x25\xa8\x1d\xb4\x92\x05\xb9\xb3\xa5\x0f\xac\xd4\xfc\x81\x67\x2f\xc8\x2b\xa1\x8a\x9c\x95\x9e\xdb\xfa\x50\x86\xeb\x3e\xa5\xd6\xeb\x07\x61\xc9\x53\x36\xbe\x65\x34\xd7\x20\x1e\x77\x45\x03\xff\xa2\xa3\x4f\xc1\x0d\xd1\x06\x0f\x2e\x67\x2e\xb0\x6e\x64\x73\xbc\x7d\xe1\x32\xf7\x90\xd9\xf9\xa0\xac\x49\xb8\xd7\xaf\x7d\xc9\x1f\x72\x16\xb3\xe5\x99\x8a\xe9\xf3\x11\x7c\xc6\x05\x3c\x57\xe7\x44\x15\x39\x7a\x7e\x34\x21\x37\x3c\xe5\x09\xcd\x93\x55\xa5\x14\x73\xf9\x9c\x61\x16\x6e\x40\xf0\xca\x3d\x3b\x22\x27\x32\x87\x91\x23\x2a\x48\xc2\x5c\x46\x93\x3d\x67\x2b\x94\x1d\x4f\x1f\x9a\xb8\x90\x7b\xb5\x5f\x22\x9d\xe9\x8c\x13\xb1\xe3\xd8\x96\x1f\x55\xca\xd9\x5c\x94\x24\x9d\x0b\x43\xe7\x27\xe4\xdb\xa6\x46\xe5\x70\x64\xdc\x13\x8f\x05\xd4\x87\xd1\xfb\xf6\xd2\xe0\xd6\xcd\xc1\x8f\x07\xa6\xdd\x5a\xe2\x9c\xeb\x6b\x96\xc9\x4e\x12\x02\xbe\x52\xb3\xc7\x71\x6d\x6e\x48\xc5\xa1\x50\x29\xd5\xd0\x16\x38\xd7\x3c\x2a\x12\x6a\xc4\x6a\xb4\xc6\x4d\xc8\xc5\xab\xab\xeb\x57\x2f\xcf\x3f\xbc\xba\x78\x41\xbe\xb6\x23\xf1\x50\xc2\x9b\x90\x0f\x61\x35\xa8\x20\xa2\xd7\x96\xdc\xf1\xdf\x1a\x59\x32\x44\x45\x59\xdc\x11\x6a\x7c\x50\x41\x2e\x05\xd7\x65\x79\x64\x8c\x3b\x4b\xa4\x60\xae\x7b\x68\x26\xad\x35\x70\xce\x31\x1a\x44\xd8\xc1\xcc\xcf\xd5\xd1\xe0\x74\x60\xa9\x55\x3f\x95\x1d\x8a\xe0\x3d\x88\x16\x25\x70\xfb\x12\xff\x5d\xfd\xd3\xae\xb2\xaf\xaf\x46\xeb\x12\x9c\xd0\xfa\x5f\xde\x47\x66\xe0\x0b\xb3\xbb\x72\x37\x0d\x2d\xad\x89\x61\x33\xc7\x93\x63\x27\x50\x24\x6b\x45\xf8\xfd\xa0\x61\x45\xaf\x2a\xb2\x4d\x08\x79\xef\x42\xb6\x21\xf5\xb8\xb9\x9e\x3f\x56\x87\x08\xaa\xc2\xd7\x50\xd6\x25\xc6\x14\xd3\xf0\xa3\xb6\x04\xd8\x9c\x2f\x99\xc0\x85\xf5\x4b\xa1\xdc\xe7\x3b\x77\x47\x2b\xe7\x6d\xf5\x8f\xeb\x37\xfd\xce\x0c\xcf\x5f\xe7\x79\xd9\x63\x6b\x67\x15\xc9\x34\xc5\x7a\x51\x0b\x9f\x60\x58\xe6\x08\x7a\xaa\xd0\x9b\xe6\x83\x95\xaf\x66\x3b\x90\xbf\x46\xcf\xdc\x4b\x35\x4d\xc7\xdf\xb6\x49\x09\xa2\x14\x73\xbb\xd7\x61\xb6\x45\xd6\x94\x2b\x9e\x62\x49\xfb\x99\xff\xf8\xd9\xf5\xab\xf3\x8b\xb7\xaf\x26\x69\xfc\xe0\xa4\x85\x89\x38\x93\x5c\x68\xb5\x5b\xbf\xd9\xd5\x75\xa6\x3d\xf9\xf1\x1f\xed\xca\x9d\xfd\x8b\x0e\xc7\xdc\x8d\xa0\x2e\x5d\xcc\x34\xe5\x89\x0a\xf6\x50\xcb\x4c\x26\x72\xde\x5c\x7e\xb9\xc3\xe6\xfc\x1a\xeb\xcb\x8c\xe9\xd8\xec\x7a\xbf\xa2\x7e\x9b\x3e\x1a\x75\x29\xbf\xec\x88\x5d\xae\xd5\x4b\xcd\xd0\xee\xe2\x89\x2e\xf7\x5e\x84\xb3\x35\x18\xa0\x22\x09\x07\xd8\x95\xec\x2b\x6b\xe0\x05\x3d\x6c\xda\x4a\x6d\xf7\x0d\xba\xdd\x02\x9b\xa1\x3f\xbb\x1b\x15\x55\x61\xe6\xde\xa9\x12\xb8\x2c\x67\x63\x5f\xae\x09\x5a\xab\xc8\x3c\x60\xb8\x21\xbd\x73\xd6\x1b\x67\xeb\xc1\xa7\x92\x55\xdd\x8a\x53\xca\x47\xde\xf4\x85\x35\x06\x92\x64\x55\x96\x81\xb4\x5a\x34\x9d\x63\x19\xa6\xdc\x9a\x89\xb3\x9c\x2f\x79\xc2\xe6\x50\x8a\x95\x8b\x79\x90\xfe\x1a\x26\xcc\xda\xd2\xac\x55\xa3\xeb\x5b\xf3\x57\x50\x74\x1b\xf0\xe2\xdd\xfb\x0f\x50\xd5\x17\x1c\x5c\x07\x0b\xe1\xe6\x83\x70\xde\xc6\xe3\x31\x98\x0c\x4e\xfe\x6e\xe4\xc9\x38\x39\x25\xdf\x33\xfb\x1d\x09\x65\x87\x73\x68\x05\xb4\x90\xbe\x06\x2c\xcc\xb5\x84\x2c\xa0\x23\xba\xf7\xed\x53\x67\xe6\x49\x23\x2b\x21\xab\xa9\x3c\x0f\x9d\x4f\xb1\x74\x23\xfa\x98\x1e\x5e\xf6\xec\x91\xec\xef\x4d\xe5\x9c\x69\xb5\x09\x3f\xbd\xe3\xc7\xd1\x43\x4a\xd4\x2a\x4d\xb8\xb8\x2d\xeb\x82\xcd\xa4\xc1\x21\x4c\x4d\xe0\xe2\xd6\x61\x6c\xce\x68\xb2\x99\x52\xee\x83\x1f\xbd\x52\x49\xbd\x87\x05\x10\x2c\x74\xe6\x9c\xfd\xb7\x3b\xf6\xd6\x0d\x1d\x92\xb8\xa3\xa3\x27\xb7\x5e\xae\xba\xb5\xc1\x3f\x86\x17\x2a\x34\x4d\x90\xcb\x9b\x97\x37\x97\x0f\x6a\xa1\xde\xc4\x12\x60\x76\x8f\x28\xd5\xf1\x9f\x76\x79\x87\xc7\x24\x29\x76\x3f\x83\xea\xdd\x95\xcc\x35\x4d\x7a\x22\x02\xd1\x82\x66\xe7\x85\x5e\x5c\x70\x05\x35\x14\xba\x0a\x01\x6b\xef\x07\x91\xce\x58\xbb\xd9\x15\x0c\xe4\x0e\x1d\xec\x73\x2f\xff\xfb\xfc\x8a\xd0\xc2\xec\xaf\xb6\xc5\x45\x7b\x75\xb8\xbb\x99\xdd\x60\x86\xc1\x9e\xeb\xb2\x6f\xef\x58\x95\x7b\xea\xbe\xd7\x74\x1f\x71\xb8\x83\x2f\x02\x68\x28\x52\xb0\x27\xec\x7f\xe0\x82\x6b\x4e\xb5\x6c\xd9\xa8\xac\x82\x02\x95\x77\xbd\x41\xa0\x50\x5a\xa6\x16\x83\x2f\xdd\x13\xe0\x42\x06\x2e\xbe\xf6\x52\x69\x2d\x00\xe9\x1d\x20\x76\x29\x8c\xac\x4d\x23\x56\x0b\x80\x1c\x41\xd1\x4f\x1c\x9b\xfb\x67\xfe\x6c\x0d\x54\x50\x1f\x2c\xf9\xcb\x8b\x4a\x29\xf6\xb5\xbe\x16\xce\x4a\x51\x36\x4d\xe8\xd5\xe2\xc3\x7f\xea\x4a\x14\xf8\x4f\xa2\x66\x69\xc3\x05\xfe\xbf\x05\x4d\x10\x30\xef\xfa\x36\x4b\x55\x81\xdc\x75\xbe\xd5\x1d\xb2\x53\x2f\xb7\xe3\x9d\xd7\xd2\x0b\x85\x95\xc7\x70\x3d\x3a\xa7\x42\x99\x3d\xaa\xea\x62\xc7\xd6\xf1\x74\x4c\x4e\x74\x94\xb5\xee\xdd\x7f\x4f\xa1\xed\x49\x21\x2a\x8d\x9c\x61\xe6\x1f\x70\x5b\xde\xf8\xd0\xf6\xb6\x93\xbc\x17\xd7\x10\x60\x79\x57\xab\x8a\x7d\xcb\xef\x56\xb8\x2e\x64\xfd\xe4\x0d\x57\xda\x35\x64\x80\x1b\x5c\xd9\x3a\xc2\x20\x77\x5d\x19\x45\x8e\x67\xff\x4b\xe3\x38\x7f\x81\x5c\xca\x75\x5f\xce\x41\xfa\x72\x45\xbe\xa8\xf0\xbe\xc4\x13\xbd\xca\x6c\x01\xc0\x0f\x2f\xaf\x08\x36\x48\xf9\xd3\x1f\xb0\xf3\xeb\xef\xbe\xfc\xc3\xb3\xd6\xdb\xfd\x78\xc1\xe3\x7b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x37\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\x66\x97\x3d\xbd\xdf\x4f\x82\x19\xe2\xec\x1e\x35\xce\x8e\xf8\x8c\x12\x24\x12\x1d\xd1\x25\x7c\x15\x52\x0c\xd7\xc9\x0e\x52\x9c\xab\xa7\x47\x71\x76\xc2\x66\x37\x16\x55\xb1\x27\x74\xc6\xbb\xf6\x37\x65\x08\xfb\xc5\xbb\x9b\xff\x7d\x73\xfe\xd5\xab\x37\x30\x53\xeb\xbf\x37\xa8\xc1\xc5\xde\xf1\x53\xed\x51\xad\x8d\xf2\xba\x1b\x20\xdd\xdc\x32\xa2\xe6\x90\x11\xe4\xdd\xeb\x9b\xae\xbe\x98\x43\x05\x74\x31\x6b\xb5\xf6\x87\xb5\xb6\x41\x57\x13\x96\xf7\x97\x3f\xb2\xb7\x51\x2e\x28\xa4\x55\xd1\xbf\xcc\x4e\xe1\x0c\x0f\x56\x91\x76\xee\x00\x79\x02\x7e\x07\xb3\x5e\x84\x41\xef\x1e\x87\x7b\x82\x55\x5b\x39\x20\xef\x9e\x58\x74\x8c\x6f\x39\x11\xc0\x1c\x52\xa4\x6d\xb9\xa1\xd9\x86\x5a\x33\xe5\xbb\x2f\x3c\x51\x4c\xc9\x9a\xca\x33\x77\xa1\x5e\x8d\x03\x54\xda\x95\x55\x7c\x31\x95\x5c\x8a\x4d\xe5\xcc\x5d\x84\x02\xb5\xca\xab\xca\x68\xd4\x6b\x43\x95\xf2\x16\xde\x81\x24\xf7\x87\x27\x80\xf0\xd9\x1e\x03\x69\xfd\x78\x5d\x11\xd9\xbf\x58\xcf\x92\xeb\xb4\x43\xae\xd1\x47\x26\x5d\x06\x62\x98\x4e\xf7\xc8\xdb\x47\x1e\x56\xdb\xf9\x7e\x4f\x45\xa7\x6f\x25\x27\x5b\x48\x2d\xc5\xde\x51\xf2\x4d\xaf\x57\x0f\xf4\x15\x3c\xf1\xb2\x6c\x63\x13\xf4\x78\x84\x08\x4a\xef\x8c\x30\xf2\x9c\x63\x17\x52\x38\xb7\x44\xd5\x29\xf1\xe0\x22\x48\x7c\x79\xd1\xd3\xe1\xfb\x7c\x53\x3c\xbb\x1a\x83\x7b\x0d\x06\x89\x3b\xe7\xa4\x98\x57\x1c\xc4\x2e\x2f\xac\x68\xe6\x12\x4e\x94\x45\x48\xb2\x19\x23\x7b\x63\x9d\x32\xd7\x77\x32\xef\x9e\xea\x5d\x7d\xb1\x16\xab\x60\x7f\x5b\x4b\xc5\x7a\x8a\xa7\x07\xe7\xf8\xc8\x27\xe8\x06\x4e\x50\xad\xc0\xf9\xa6\x93\x74\x1f\x07\xe9\x71\x0f\xd0\xa1\x8c\xea\x7e\xb3\x7c\x7b\x15\xd2\x1d\xba\x75\x5c\xaa\x7b\xcd\x1a\x13\xcc\x26\x95\xd4\x82\x82\xc9\x25\x38\x71\xbd\x51\x87\x5c\x62\x0b\xca\x2e\x84\xc1\xbd\x83\x06\x5c\x2c\xf4\x9c\x24\x06\xaa\x52\x84\x25\xa2\x6d\x1a\xef\x88\x60\x95\xe5\x94\x66\xae\x27\xb7\xbc\x13\x77\x34\x8f\xc9\xf9\xd5\x65\x3f\xd4\xa0\x43\x9c\x35\x62\x52\xbb\x8a\x5e\xd5\x48\xeb\xf2\x4d\x6c\x73\xb3\x60\xd0\x5b\x91\x4c\xb9\x56\x65\x4f\x3f\xa6\x43\xbd\xd2\x50\x41\xef\xcb\x32\x67\xd9\x9c\x5b\x3b\x52\xc0\x30\x05\x91\x91\xa6\x89\x6b\x22\x60\xdb\xe4\x3c\x7b\xf6\x0c\x4d\x61\xcf\xfe\xf8\xc7\x3f\x62\x67\xa5\x98\x45\x3c\x5d\x7f\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9c\xbf\x7d\x03\x9d\x1f\x33\xad\xb0\x2a\x09\x8e\x8c\x9d\xe0\x83\x97\xd5\x88\xfc\xcf\xcd\xfb\x77\x65\x9b\x98\xea\xaf\xb6\xa1\xb6\x5d\xde\x84\x5c\x04\xf1\x4f\xa1\xa1\x8b\xea\x85\x6d\x68\xa4\x09\x9d\xcd\x10\x31\xa6\xae\x9d\x2e\x1e\x38\x97\x3d\x0e\x5d\xc1\xb1\xff\x88\x41\x89\x04\x02\xb3\x8c\x4a\x8e\xa6\x41\x57\xd9\x00\xe3\xcc\x60\x2c\x4f\x26\x61\x2a\x23\xec\x25\x3f\x53\xd0\x85\xa4\x2c\xff\x97\x33\x65\x84\x52\xdb\x5d\x11\x07\x2b\x77\x46\xb1\xd6\xb5\x1e\xee\xc3\x03\xd4\xba\x3b\x46\xd5\x74\x6f\xcf\x90\x2b\xdf\x6a\x6b\x17\x97\x6d\xea\xff\x8e\xde\xd0\x5d\x41\xc2\xf7\xe4\x91\xa9\xcc\xf5\xca\xcf\x06\xb7\xce\x56\x09\x28\xe9\x04\x4d\x24\x74\xf2\xf2\x3b\x5d\x72\xb1\xa0\xe9\xfd\xee\xa5\x74\x2e\xbe\xd8\xb5\x00\x2f\x12\xaa\xb7\xb4\x75\x3b\x9f\x6a\xbc\x88\x7b\xbb\x52\x57\x81\x4e\x65\xa1\x9d\x0f\xdb\xfe\x0e\x09\xd8\xd8\x65\xbd\x43\x19\xc9\x3d\x2a\x4f\xee\x53\x81\xb8\x73\x11\xd3\xaa\xbf\x19\x78\x42\x55\x94\x18\x11\x46\xa3\x05\xb9\x65\xab\x31\xd2\xad\x8c\x42\x36\x0f\x40\xe5\xc2\xc0\xa2\xd2\xf8\xa4\xec\x5d\x63\xe4\x63\x0b\x32\x17\x18\x10\x70\x1f\x97\x0d\xe4\x84\x50\x65\xe5\x25\x5b\x46\x54\x04\x96\x02\x57\xab\x3a\xe8\x47\xec\xeb\x86\x62\x33\xf2\x6a\x92\x8a\x39\x6f\x2c\x36\xaf\xa9\x6d\x5f\x2e\xa3\x21\x0c\x1d\xb4\xdc\xad\x10\x6b\x6f\xdb\xe6\xdb\x56\xf8\x83\x0f\x52\x57\x9d\x39\x88\xa8\x80\x76\x7e\xb6\x93\x93\x7d\xd6\x41\xc9\x03\xa2\x92\x44\xa3\x98\x2e\x2c\x68\xb0\x5f\x58\x21\x12\xa6\x14\xe1\xb0\xc2\x94\xe6\xb7\xcc\x15\x8c\xa1\xc9\x84\x5c\x99\x49\xfa\xfa\x55\x58\x16\x79\x89\x21\x76\xe6\xcc\x86\xd9\x41\xe6\x23\xc7\x93\xc9\x31\x12\xf8\x86\x5c\xa1\x0e\xf8\xb1\x5f\x4d\xdd\x3d\x6a\xe9\xd6\x5a\x7b\x67\x0a\x2b\x03\x1b\x91\x0f\x2a\x5f\x4b\xc8\x82\xd3\x0b\xc7\xc0\x68\xeb\x22\x4a\xeb\xcb\xd9\xa3\x00\xec\xbe\x75\xcb\xf7\xa9\x5a\xde\xca\x6f\x51\xbd\xf6\xaf\x56\xbe\x57\xad\xf2\x4d\x95\xca\xed\x4e\xd9\xd3\xd6\xbd\x86\xf3\x01\x25\xb6\xd3\x4e\x65\x5e\xdd\x55\x35\x52\x82\xdc\x51\xa9\xd2\xd3\x4a\x46\xb4\x45\x9f\x12\xf6\x59\x09\x85\x97\xb3\xa6\xae\x73\x2e\x59\x30\x90\x97\x1d\x0d\x35\x10\x78\x7c\x69\xb0\x5b\x2f\x17\xd2\x59\x3c\xac\x5f\x5d\xc4\xc5\xfa\xd5\xce\x19\x58\xbf\xaa\x0a\x5b\x90\x96\xe4\x89\x7e\x18\xc5\x0f\x20\xd5\x12\x6a\x76\x97\x47\x70\x42\xde\x5a\xa6\x80\xc8\x48\xa7\x4a\x26\x85\xf6\x99\x4c\x0d\x1c\x03\x06\x75\x15\xbe\x31\xa5\xd4\x3d\x16\xf0\x0f\xe0\x9c\x48\x96\xbb\xb2\x12\xbc\xf6\x3a\xe2\x5d\x7b\xee\xfd\x6c\x83\x49\x0e\x80\xa1\x13\x25\xf6\x86\xa3\x1b\xc0\xd7\x9d\x70\xb1\xd4\x15\x19\x07\x22\x49\xb4\x42\x01\xca\x89\x2b\xb6\xd1\x53\xe7\x25\xb6\xb3\xda\xd8\xb9\x5a\xc3\xc4\xf9\xd5\xe5\x5e\x1a\x40\xf0\xfe\x06\x1d\x20\x7c\xe2\x67\xac\x05\x5c\xa2\x16\x10\xb6\xdd\xb9\x28\x57\x6e\x4d\xca\x86\xec\x3c\x79\x31\x72\x6d\xda\xaf\x0d\xb1\x0c\x83\x4e\xab\x35\xf4\xd0\xd8\x53\x92\xd5\xa0\xee\x9e\xf3\x3a\xc2\x21\x7e\xea\x22\xe7\x03\x8a\x8f\x00\x8f\x4e\xed\xd2\xdd\xb5\xde\xcd\x0e\x16\x4b\x6e\xa0\xb5\x0d\xea\x83\x81\x62\x99\xc9\xf8\x85\x6d\x25\x2d\x84\xc4\x06\x72\x6a\x84\xbd\x71\xd4\x08\x15\x46\x23\x45\x04\xbe\xe2\x3c\x30\xb9\xef\x2d\x37\xec\xd5\xe5\xe8\x90\x3e\x47\x66\x03\x61\xe5\x57\x5d\x77\x91\x1c\xd8\xb6\x88\x04\xac\x69\xbf\x46\x28\x95\x3d\xb5\x23\xf9\x3e\xef\xd1\x82\xa5\xf4\xff\x67\xef\xea\x7a\xdb\xb6\xd5\xff\xfd\x3e\x05\x91\x5d\xb8\x05\xec\x64\x2d\x8a\x61\xf8\xff\xaf\xf2\xd2\x6e\xc6\xba\x35\xa7\x4e\x06\x1c\x0c\xbb\xa0\x25\xc6\xe6\x89\x4c\xea\x88\x94\x53\x63\xd8\x77\x3f\x20\x1f\x92\x22\x65\xbd\xda\x8a\x93\xb4\xf6\x4d\x1b\x89\xa4\xf8\xfe\xbc\xff\x1e\xc0\xf0\xb3\xc3\x53\xb7\xcc\x43\x46\xa5\x24\x80\xa5\x44\xb2\x95\x40\xfc\x6e\x1c\xd8\x0c\x4e\xd6\x6f\x4e\x76\x49\x07\xb3\x67\xc6\x1e\x54\xac\xc2\x00\x93\x71\x1d\xb0\x6c\x6a\x5f\x6b\x59\x22\xd1\xc0\x9b\xac\xa4\x90\x50\x04\x66\x0d\xb3\x77\xf0\x81\x0f\x21\x47\xed\x2a\x3f\x8d\x1d\xc3\x70\x94\x9f\x8e\xf2\xd3\x20\xf2\x93\x47\x58\xec\x85\x53\x21\x4b\xf9\x0e\xc3\x56\xa0\x2a\x02\x99\x3c\x00\x1e\xb5\x35\xad\x28\xc5\xb3\x50\xe3\xa6\xe4\xa1\x91\x15\xb0\xcc\x3e\xce\xe5\xdd\xe4\x27\x44\x58\xc4\x63\x58\x7c\xd5\x7e\x26\xa4\x66\x6d\x0a\x99\xc4\xef\xcb\xca\x7e\xcb\xd7\xda\xe9\xb6\x77\x5d\xba\x9d\xee\x01\x6b\x0a\xfc\x30\x10\x81\x2f\xc8\xba\x0b\x26\xb6\xb9\xb2\x2d\xd6\x80\xa1\xef\x85\x11\x12\xd2\x4a\xeb\xcd\x6d\x33\xe6\xa2\x57\xf0\xf0\x34\x4a\xf3\xb1\x29\x70\xba\x22\x2b\x9e\x6d\xc6\xae\x90\x7a\x19\xd4\x32\x25\x5e\x6b\x9e\x20\xca\x33\x25\x01\x26\x9b\x97\xca\x1d\xd8\x09\x3a\x30\x73\xe0\xd6\xa9\x5f\xd2\x20\xff\x17\x6e\x89\x02\x54\x4c\xcb\xf7\x45\x12\xa5\x3b\x07\x79\x28\xc6\x85\xd8\xa9\x9e\x12\xb6\x46\x6b\x9c\xf5\xc8\x82\xee\xff\xf6\xe4\x07\x62\xba\xa6\x62\xb7\x7c\x87\xa5\xa1\xcf\x0c\xd1\x00\xbd\x0e\xcf\x65\x9a\x4b\x73\x53\xda\x53\x61\x43\xe6\xdd\x69\x28\x31\x45\x6f\x4e\x76\xea\xc6\x8b\xc9\x2f\x0c\xbf\x1d\xb3\x0c\xc3\x6f\xdf\x5c\xc3\x61\x2b\x3b\x6f\x9b\x41\x33\x87\xdb\x9f\xdd\x16\x43\x9c\xc3\x82\x44\x16\x38\x0f\x96\x39\x3d\xd0\x41\x03\x77\x93\x9d\xf4\x36\x06\xa1\xbe\x5a\x65\x63\x5e\x7e\xc5\xda\x9a\x61\x6d\xb6\x26\xbe\xf0\x1b\x37\xd8\xce\x4c\x3e\x83\xa3\xb5\xb6\xd3\x16\x3c\x5a\x6b\x8f\xd6\xda\xa3\xb5\xf6\xa8\x6d\x38\x6a\x1b\x8e\xd6\x5a\x74\xb4\xd6\x0e\x32\x87\xc3\x59\x6b\x81\xd5\xab\xb2\xd9\x1a\x66\xaf\x30\xd8\x1e\xd4\x5e\x6b\x12\xf7\x9c\x47\x11\xcf\x99\xbc\xe1\xf7\xa4\xb3\xd1\xa1\xc4\xff\x6f\xb5\xa3\x01\x10\x6a\xe4\x81\xed\xc2\x07\x13\x0e\xfa\x73\x25\xbd\x78\x8b\x5d\xb8\x0a\x9c\xc7\x54\x71\xfe\x3b\x6f\x33\xdb\x80\x0f\x4e\xc4\x62\x12\x17\x2f\xcc\x51\x96\x6a\xae\x4f\xd1\x39\xca\x48\x44\x53\x6a\xd2\xc8\x63\x78\x0e\x1b\xcf\xe5\x46\xa0\x52\x90\xe4\xce\x60\xd4\x33\x3f\xd7\x4f\xc1\xbf\x9b\x7b\xb0\xf2\x33\x40\xa1\xb8\x45\x32\xb7\xb9\x90\x32\xf2\x1f\x4b\xda\x4c\x6f\x6e\xfc\x16\x7c\xf5\x8a\x1e\x4a\x90\x62\x48\x7f\x2c\xa5\x26\xc0\xfa\xb1\x8f\x3f\xf9\x92\xd2\x4c\x6f\xde\x19\x89\x38\xeb\x92\x53\xb5\x66\x81\xb6\x5a\x2a\xe8\x93\xd6\x8d\x92\x18\xc5\x79\xe6\x72\xa6\xae\x71\x42\x63\x2a\x37\xce\x6a\x67\xd2\x6b\x61\x38\x31\x6e\x19\x45\x31\x8d\x08\xa7\x69\xc6\x71\xb4\x24\xc2\xfb\x1a\x30\x28\x26\x88\xcc\xf9\xbe\x43\x0a\x38\xcd\xa3\xe8\x3a\x8a\x40\x26\x1b\x94\x71\x69\x0d\xef\x35\x1f\xbc\xf1\x1a\xd3\xd5\x81\xca\xc9\x6c\xa3\xad\xf3\xdc\x6f\x02\x7a\x45\xef\xfc\x3f\x04\xe2\x49\x6c\x21\x4c\x7e\xfa\x41\x31\x85\x91\xd9\x83\xea\xf2\xd3\x00\x17\x92\xa3\x44\x11\x6c\x75\x21\xd6\x57\x7e\xfb\x0e\x2d\x79\x9e\x89\x53\x1f\x74\xe0\x8d\x7e\x06\xf2\x9d\x65\x2a\x25\x4a\x08\x16\x12\xbd\xf9\x01\xad\x28\xcb\x15\x9d\xea\xbd\x6d\xfa\xf3\x41\x1e\x07\xf4\xe3\xbb\xce\xf5\xfa\xf2\x3e\xb5\x5c\x4f\x0a\xd8\xc8\x86\xf5\x31\x27\x09\x02\xe3\x00\x59\xbc\xc4\x08\x99\x4b\xd7\x9f\x6d\x26\xf9\x23\x9c\xaf\xff\xe6\x7c\xbe\x91\x7d\x82\x28\x4d\x8d\x30\x7a\xf2\x5f\xe6\x61\x17\xf0\x94\x02\x3b\xa5\xf1\xa3\x8f\x92\xe1\x62\x41\x85\x6c\xc9\x6f\x51\xc4\x57\x36\x16\xeb\x4e\x56\x16\x4a\x3a\xe8\x19\x2b\xa3\xeb\x58\x8e\xd8\xea\x96\xa2\x88\x40\x32\xcb\xab\x22\x53\x12\xe3\x50\xb6\xb5\xf9\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\xc6\x74\xd9\x2d\xd1\x7b\xac\x50\x2d\x3c\x05\x82\xb2\x05\x80\x9c\xaf\xf2\x44\xd2\x34\x29\xc6\xfd\xd9\x56\x30\x17\xb9\xaf\x73\xc3\x9e\x9a\x08\x43\x60\x31\xa0\x4d\x69\xfd\xe4\x2b\xd7\x16\x61\x12\xb0\xba\x33\x45\x0f\x52\x9c\x61\x37\x79\x3a\x93\xae\x78\x6d\xd4\x77\x58\x5b\x14\x0d\x1c\xa6\xaa\x85\x93\xa2\xc7\x9e\x15\x69\xc8\x4d\x23\x09\xc3\xac\x83\xaa\x3a\x84\xe7\xd2\x95\x10\x7f\x70\xce\x64\x90\x06\xa5\xb4\x5b\x0c\x53\x73\x81\xa3\x7b\xc2\x62\x48\x1a\xa5\x87\x1d\x6f\x18\x5e\x19\xb4\x2d\x2f\x1f\x77\xa9\xbe\x18\x1b\xc5\x04\x84\xef\xd9\x30\x63\xa0\xba\x43\xce\x41\x2e\x7a\x43\xd9\xa8\x2a\x6d\xe7\x5c\x80\xca\x26\xa3\xeb\x88\x58\xfa\xaf\xea\x0d\xd9\xf5\x75\x87\x58\xfa\xad\xce\xdb\xe5\xf1\xf6\xaf\xbe\xee\x9d\xe6\x5c\x83\x6a\xe1\x44\x1d\xed\x8d\x8b\x19\x2d\x2d\xee\x7c\x33\x6c\xd6\x9b\x6c\xde\x27\xf2\x77\x94\xcd\xe3\xf0\x10\x7f\xc6\x31\x17\xe8\x22\xe1\xd1\x3d\xba\x22\x9a\xe9\x7a\xcc\xf4\x2c\xd9\x3c\x7e\x4a\x08\xef\x15\x5e\xb4\xd9\xd9\x26\x68\xc5\x19\x95\x3c\x6b\xbe\x2f\x0e\x97\x76\xf2\x08\xf7\x5c\x8b\x50\xa5\x76\xf3\x73\x06\x7b\x56\xdb\xad\xef\xc2\xeb\x4a\x4e\x3c\xd3\xa7\x13\x1e\x99\x2c\x60\x3b\x9e\xb5\xef\x97\xfc\x61\x22\xf9\x24\x17\x64\x42\x3b\x18\x74\x7b\x0c\xf3\x9e\x6c\xb4\x15\xbb\xe7\x40\x4d\xb5\x40\x66\x90\x5c\x6b\xa0\xf4\x73\x45\xb9\x3f\x5f\x5c\xdd\x0a\x92\x9d\xfa\x3c\xe0\x19\x91\xd1\x59\x44\xd2\xe5\x99\x69\xe1\x59\x4e\x8a\xbd\x44\xfa\xce\x8a\xad\x07\x64\x26\xe2\x49\x62\x02\xb3\xf9\x1d\xba\x24\xe9\xd2\x35\x7c\xe8\x51\x3f\x1d\x22\x70\xca\x79\x5f\x20\xd4\x91\xaa\x13\x1e\x22\xfd\x04\xce\x90\xb7\x99\xb2\x79\xbf\x24\x14\x87\xda\x3e\xcf\x3a\xd5\xe6\x23\x4e\xce\xe3\xc2\x29\x8f\x02\x3c\x65\xdf\xdf\x33\x04\x4b\xb6\x1e\x23\xc1\x15\x34\xbd\x03\xa6\x3b\x26\x31\xe2\x6b\x92\x65\x34\x26\x02\xb9\x3b\xc8\x97\x52\x69\x72\xe8\x79\x3b\xe2\x36\x3f\x39\x6e\xf3\x0e\xe2\xd0\x48\xcb\x43\xc1\x35\xa5\x9f\x6c\x5d\x53\x38\x5e\x51\xf6\xec\x2e\x2a\x11\xe1\x84\x4c\x3f\xf5\x90\x3f\x4c\x8d\x50\x04\x99\x99\x87\x1e\x7e\x5a\x0b\x2a\xd9\xaf\x6e\xdf\x20\xc6\xe3\x36\x95\xea\x23\x08\x12\x0b\x2c\xc9\x43\x2b\x39\x9c\x14\x17\x55\x7b\x49\xcd\x9c\x3e\xa5\xc8\xf1\x2c\x30\x02\xbd\x3d\x0f\xa0\x67\x43\x12\x55\xb3\x6a\x7d\x95\x93\x50\xcb\x87\xdf\x2d\x83\xee\xda\x1d\x7c\x7e\x3d\x45\x3f\x43\xf1\x61\xd1\x0b\x33\x2e\x81\x0d\xbc\xe2\x2b\x4c\xfb\x26\xd9\x28\x57\x2f\xa3\xaf\xfa\x43\xb8\x76\x65\x91\x29\xec\x25\x70\xb9\xa3\x8b\x5c\xc9\x74\x46\x0e\x7b\x56\x00\x73\x5b\xac\xcb\xf3\x05\x98\xdb\x3f\x1b\x84\xa7\x72\xb2\x7e\x91\x05\xc7\x62\x97\x52\x93\x12\x67\x03\x45\x82\x30\x41\xb5\x41\xc6\xb3\x8a\x9b\x4c\x7f\x90\x5a\x12\x9c\x20\x81\xc5\x19\xa3\x8f\x7c\x41\x99\x3d\xbd\xdc\xd8\xeb\xee\x30\x4d\xba\x4e\xc6\x91\x27\x79\x72\x9e\x44\x88\xe4\x3d\xc3\xf3\xa4\x8b\xbb\x41\xb8\xd5\x5c\x45\xf4\x21\xc1\x0b\x44\xf4\x1f\x67\x31\x15\xea\x5f\x34\x9b\x7d\xd4\x4a\xf8\x9c\x59\x8e\x59\x2b\xa8\xcd\xdd\xe7\x82\x14\xe0\x20\x0e\x7b\x76\xe0\xea\xd9\x01\xfd\xcf\xab\x89\x28\x8b\x55\xc7\xbd\x54\x70\xe0\x24\xa5\x4b\x00\x1e\xa2\xf3\xf9\x05\xb7\x81\x39\x41\x37\x4b\x1a\xdd\x5f\x7b\x7a\x77\x9e\xa9\x67\xcc\x7b\x14\x10\xb0\xf2\xbb\x21\x6f\x4b\xd3\xd5\xeb\xfe\xa2\xb1\x57\xd3\xd2\x01\x7b\x61\xcc\xcc\xf8\xf5\x3b\x2c\x04\x8f\x68\x61\x73\xd1\x3a\x9a\x82\x38\xc4\x9a\x38\x0c\x3b\x26\xcd\x1e\xf4\x1d\x0e\xf0\x1f\x15\x14\xcd\xae\xa6\xcd\x8e\x2b\x7c\x0a\x46\x99\x1d\xf5\xa0\x43\x80\x3d\xb3\x03\x34\x7a\x51\x71\x1b\x1a\xdd\x32\xc3\x25\xc3\x82\x75\x53\x37\x8b\x67\x19\x31\x9b\x9b\x73\x6b\xf9\x1c\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xc2\x36\xaa\xc4\xf0\x92\x35\x11\x9e\x19\x53\x83\x3e\x73\x29\x4f\xf3\x04\xfc\x39\xf6\xc7\x77\xb7\x3a\x63\xf8\xce\x40\xa6\x87\x43\xa0\x96\x8e\x7c\xc7\xde\xfe\x9e\xce\x5f\x07\x76\xa9\xc7\xdc\xfd\xf0\xe3\xbb\x77\x2f\x1d\xcd\xb4\xab\x08\xfe\x18\x70\xa6\x1d\x55\xb4\x15\xf1\x45\xd3\x63\x7c\xd1\xb7\x1b\x5f\xf4\xf8\x28\xb4\x03\x47\x10\xf5\xf4\xcd\xed\xe7\x97\xdb\x3d\x46\xa8\xb3\xf7\x6e\x5f\xcf\xdd\x1e\x51\x40\xc3\xc6\xfe\xf4\xf6\x65\xed\x13\xe7\x73\x8c\xee\xf9\x5a\xa3\x7b\x76\xf1\x65\xed\x1f\xc9\xd3\xc7\x87\xf5\x6b\x8c\xda\xe9\x71\x38\xbb\x47\x97\xec\x1d\x53\xd2\x1f\x04\xb0\xbf\x3e\x6d\x97\x84\x54\x45\xcd\x4a\x09\xd2\x06\x95\x5b\xec\xb1\xd1\x48\x78\xd0\x62\x92\xab\x13\x78\x10\x81\x04\xf5\x90\xc6\xa0\x79\xde\x27\x37\xa4\xa9\xf3\x69\x56\x32\xcc\xb8\xc7\x4f\x63\x8f\xf9\x16\x0c\x1e\xc7\x9c\x2e\x2f\x44\xe5\x2e\x02\xb4\x16\xab\xad\xd0\x57\x80\x26\xe4\x7c\xee\xa3\x44\x16\x47\xe7\xfc\x7a\xaa\x64\x70\x1d\x46\x84\x13\x71\x8a\x2a\xe8\xbc\x55\x97\x1a\xbe\xc0\xd2\x77\x2c\x25\x59\xa5\xb2\xfb\xaa\x1f\x35\xee\x4f\xae\x71\x1f\x50\x03\xb8\xcc\x57\x98\x4d\xd4\x89\xd2\x3a\xf7\xc0\x5a\x57\xba\x99\x4f\x91\x39\x3b\x40\x9e\xb4\x06\x44\x07\x17\x84\x89\x8d\xb1\x97\xe6\xf2\x71\xd4\x9e\xba\xed\x9d\x47\x0e\x74\xb5\x74\xd2\x22\xbe\xe5\xf0\x6a\x86\xe3\x66\xc1\x1e\x2a\x8f\x38\x07\x62\xb8\x5c\x12\xa0\xe1\xd7\x3a\x20\xa7\x28\x15\x72\xd2\xc0\x4a\xe3\x24\xe1\x0f\xf0\x6d\x9f\xae\xa9\xd9\x57\x7d\x31\x91\x66\x73\x82\x56\x54\xc9\xe8\x46\xc1\xea\x77\x07\x4c\xa6\x8a\x23\x27\x19\x30\xbc\x99\x31\xb6\xcd\x88\x34\x0b\xa5\x17\x5a\xc9\xb7\x0c\x1c\xc2\xd5\xff\xad\x57\x91\xfe\xb6\xbd\x13\xe6\x64\x89\xd7\x94\xe7\x19\xd4\x96\x1c\x9d\x98\x57\x9a\x36\x6c\x78\xee\xf4\x5d\x90\x0c\xd3\x8d\x4e\x54\xcc\xd3\xef\xc5\x4b\x2d\x0a\xc4\xdc\xaa\x26\x26\xe4\x0b\x15\x72\x7b\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x2d\x52\x45\x16\x7a\x67\xb5\x0b\xea\x85\xfc\xca\x7a\xa6\x5f\xbd\xa0\x9c\x76\xad\xe8\xae\x07\x63\x81\xbe\x41\xf6\xc7\x59\xc2\x12\x1a\x6d\x7a\xa7\x7b\x2b\xd5\xb6\x97\xb6\x70\x36\x34\xf5\x1c\x5d\x60\x41\x62\xf4\x1b\x66\x78\x01\xf2\xde\xab\xd9\xf5\xc5\x6f\xaf\xd5\xba\x6a\x79\x72\x7a\x55\x69\x68\x9b\xf9\x8d\xff\x3e\x64\xbc\xc8\xd6\xc0\x77\x20\x55\x5b\xf5\x77\x1c\xfc\xa0\x81\x30\xc8\xd1\xa1\x6e\x60\xbd\x15\x24\xe8\xba\x1c\xc2\x5a\xce\xf9\x59\xba\x60\xd6\xab\x78\xcf\x2c\x9f\x94\x09\x89\x93\xe4\x3a\xc1\xec\x3c\x4d\x33\xbe\xae\x96\xc6\x83\xbe\xda\x82\xb6\xa7\xe0\xe6\x61\x1f\xa6\x30\xf5\xda\x84\xcd\xd0\xb4\x68\xff\x14\x4d\xa5\x93\xc2\x39\xd3\x24\xf5\xe4\x3c\x97\x7c\x85\x25\x8d\x4e\x94\xb0\x7e\xf2\x1b\x66\x39\x4e\x2a\x9d\xae\x1a\x87\x51\xc7\x22\x36\x56\xaa\x87\xae\xeb\x50\xad\x91\xd7\x68\xae\x2f\x71\xa6\x6e\xa7\xcb\xd9\x1f\xbd\xea\x0a\x89\x65\xbe\x75\x0b\x37\x50\x86\x7a\x5a\x30\x41\x09\x16\xf2\x36\x8d\xd5\xa1\x2f\xbd\x6d\xba\xf0\x23\x2c\x71\xc2\x17\xbf\x10\x9c\x54\xef\xf0\x60\x9f\x5c\xfa\xa5\xad\x02\xca\x18\xfc\xf3\xb9\x2b\x38\x12\x48\x31\xd8\x36\x06\x3e\x23\x09\x59\x63\x26\x6d\x75\x48\xae\x2e\x46\x66\xfc\x7a\x17\xd1\x42\xf9\x1a\x13\x49\xb2\x15\x65\x61\x9b\x33\x5d\xf6\x92\xb3\x98\x82\xda\x51\x2b\xd4\xa0\x46\xd8\x6e\xfd\x56\xab\xb3\x34\x34\xd8\x16\x42\x74\x4d\xaf\x3f\xe1\x54\x40\xb1\xb9\xe1\x2f\x97\xf0\x50\x5b\xda\x83\xbe\x6d\xcd\x14\xba\x67\x8a\x31\xd4\x38\x22\xd5\xd7\x56\x2b\x9f\xd0\xc6\x1f\x4c\xec\x1a\x43\x17\xea\x1d\x47\x27\xa6\xdf\x75\x36\x88\xa6\x2d\x06\xbf\x76\xce\xa2\xdc\x95\xfa\x3b\xb5\x6a\xdf\xb9\x6a\x10\xc9\x52\x4a\xc8\x1f\x14\xaa\xa7\x01\x9d\x18\xaf\x6e\x3c\x52\x57\x54\xfb\xf0\xae\x2d\x30\xd8\xb7\x44\xd9\x0e\x1c\x63\x2b\xd1\xea\x08\x2e\x1f\x0a\xd6\x53\xe3\xff\x97\x19\x51\x04\xa3\x94\x12\x00\x3f\xc1\xcc\x4c\x96\xa6\x2c\x04\xc7\xe6\xa1\xa2\x60\x4a\x24\xd4\xef\xc6\xc6\x18\x0e\xca\x65\xe3\x6b\x61\x15\xd4\x18\xc0\x3f\xb4\xe1\xe2\xec\x67\x6e\x94\xbc\x26\x48\x57\xdd\x01\x9a\x92\x8f\x91\xc8\xa3\x25\xc2\x42\x75\x4d\x6d\x68\x75\xe2\xc9\xe9\x0a\x33\x7a\x47\x84\x3c\x75\x28\xc1\xe2\xcf\xb7\x7f\x9d\xa2\x0f\x3c\x43\xc6\x51\x7d\x6c\x51\x35\x4c\x3f\x8b\x7d\x41\x05\x0c\xc6\xd5\x2d\xa4\xd6\x94\xc7\xa6\xd3\x0f\xba\xb3\x12\xdf\x2b\x1a\x06\x9d\xcd\x89\x36\x5d\xfc\x1f\x3a\x51\x6c\xa2\xf7\xe9\xbf\x15\x59\xfa\xe7\x04\xbd\x7a\xd0\x44\xfb\x44\xfd\x79\x02\x1f\x74\x6e\x93\xbe\x50\x5d\x7c\x18\x82\x25\x33\xba\x58\x90\x0c\xc4\x47\xa4\x83\x0a\x5f\x1b\x54\x10\xc6\xbd\xc2\xd6\x28\x5d\x88\x9b\xe5\x8e\xfc\xf9\xf6\xaf\x13\xf4\x2a\x1c\x17\xa2\x2c\x26\x5f\xd0\x5b\xd0\x2e\x53\xa1\xc6\xf8\xda\x18\x73\xc4\x86\x49\xfc\x45\xb5\x19\x2d\xb9\x20\x0c\x44\x79\xc9\xd1\x12\xaf\x09\x12\x5c\x49\xc0\x24\x49\x26\x46\x97\x8e\x1e\xb0\x46\x6a\xb1\x53\xa9\x03\xeb\x51\x8a\x33\x19\x6c\x89\x53\xa3\x21\xd1\x5f\x53\xcb\xb6\x60\xd6\x32\x7d\x47\x99\xb1\x5f\x19\xcb\x99\x5a\x73\x1d\x18\x0a\x8b\x24\x39\x8a\x96\x98\x2d\x5c\x6c\xfa\x5d\x2e\xf3\x8c\xb4\x98\x7e\x3a\x9e\x81\x7b\xca\x7a\x85\x30\xff\x4a\x59\xd9\xa9\xa0\x5a\xaf\xb4\xa0\xd2\x46\x45\x18\x5f\x45\xb9\x39\x53\xab\x90\xd1\x79\x2e\x79\x26\xce\x62\xb2\x26\xc9\x99\xa0\x8b\x09\xce\xa2\x25\x95\x24\x52\xc3\x3a\xc3\x29\x9d\x44\x9c\xa9\x15\xd7\xa8\x0c\xab\xf8\x7b\x9d\xde\x74\xa2\xba\xda\x82\x3a\xdd\x71\xd0\xed\x4a\xb5\x27\x55\xa6\x0d\x36\xc6\x0e\xfa\xa0\xed\x81\x82\x6e\xe6\x00\xa3\xd5\x8a\x90\xb3\x41\x06\x6b\x41\x93\xfb\xd3\x98\x91\xc1\x01\x8f\xca\x6d\xa8\x63\x07\x0e\x24\xfa\x54\x06\x37\xe5\x0a\xc7\x70\x95\x62\xb6\x79\xf4\xcd\xaf\xa6\x54\xc3\xe5\x47\x9b\x89\x6e\x82\x27\x13\xcc\x62\xf5\x7f\x08\xd8\x89\x36\x83\xcc\x61\x4e\x7b\x5d\x04\xb7\xd3\xab\xc3\x1c\x89\x9c\x0e\x70\xea\x0d\xbf\xd6\x91\x89\x02\x56\x15\x1c\x35\xb2\x9c\x58\xa2\x19\x32\xa8\x54\xd8\x56\xff\xdf\xd8\x5f\x1c\xda\x59\x1b\x4b\xd5\x6c\x35\xf1\x78\xc7\x8e\xfd\xfd\x58\xd4\xf0\x75\x72\xda\xf1\x0a\x0b\x69\xa0\xb5\x2c\x06\x41\x30\x0c\x2b\xa0\x68\x02\x53\x6f\x18\xee\xb4\x87\xac\xbf\x80\xea\xc8\xa4\x12\x73\x29\x72\x42\x49\xbb\x00\x55\xc8\x2f\x41\x1e\x34\x18\x94\x24\x42\x22\xbc\xc6\x34\xd1\xda\x79\x3e\x17\x24\x5b\x43\x42\x2a\x03\x35\x88\xcb\x72\x96\xc9\x39\x01\x6c\xd4\x81\x24\x1f\x3b\x86\xed\x55\x69\x1a\x80\x96\x86\x4a\xbd\xaf\xed\xf5\x20\x72\x0f\x88\x97\xb5\xaf\xd5\x17\x76\x14\x63\xd4\xfe\xfb\x85\xe0\x4c\xce\x09\x96\x37\xb4\x89\xee\x6e\x6d\xe9\xa0\x9e\x4b\xe5\xee\x36\xf4\x03\x41\x0b\x2e\x15\x8b\x95\xeb\xbd\x0f\x3c\x29\x80\xfa\xb8\x8d\xf6\xd8\x3b\xba\x18\xe5\x4d\x86\x75\x88\x0f\x67\x3d\x87\x19\x56\xdc\x1e\xa7\xe1\x8e\xcd\x4e\x92\x50\x1a\x80\x34\x38\x23\x66\xed\xc0\x9a\xa1\x6f\xa0\xc3\x0c\x79\x45\x84\x68\x04\xd8\x08\xbd\x0b\xa1\x34\x1c\xe5\x92\x69\x6d\x65\xdf\x41\x58\x88\x62\xa0\x63\x22\x31\x4d\xec\x51\x86\xa9\x70\xb3\xd4\x76\xbb\x36\x0e\x30\x23\x58\x34\x31\x08\x41\xaf\x3f\xeb\xc2\xd0\x69\xce\xc8\xe4\x81\x67\x31\xba\xc4\x2b\x92\x5c\x62\x41\x4c\x5b\x7e\x88\x1e\xac\xd1\x48\x0c\xda\xe5\x6a\xdd\x57\x4d\x97\x41\xf9\x53\xa8\x84\xf5\x5f\x85\x88\x05\x1d\x1c\x5b\x15\xe4\x4d\x96\x93\x31\xfa\xa0\xa8\xd7\x18\xdd\xb2\x7b\xc6\x1f\xf6\xeb\xab\x6c\xb4\x82\x04\x3d\xf5\xdd\x3f\x2c\xac\x4e\xa0\xf0\x71\xdd\xdd\xb1\x47\xe6\xc2\xaf\x51\x35\x86\xc4\xc6\x15\xb5\x3d\x52\xff\xdd\x52\x41\x29\x41\x31\xe3\x8b\x8c\x08\x40\xae\xa9\x04\x49\xec\xaa\x72\xfe\x99\x30\x13\xdc\xd7\xda\xbd\x69\x55\x2d\xdb\x53\x4b\xd7\x16\xc5\x1b\xb3\xde\xe6\x63\x69\x52\xc9\x6a\x34\x7b\x04\x7a\x1d\xad\x51\x3e\xd5\xf5\xb0\x5a\xe9\xe4\x51\x3d\xaf\x2c\x30\x25\x4d\xda\x51\x3b\xba\xcb\xd9\x1f\xf5\x93\x5d\x4b\xfb\xda\xe8\x53\xbb\x5a\x6a\x5f\x85\x54\xeb\x99\x69\x55\x42\x1d\xd5\x4f\x47\xf5\xd3\x4b\x52\x3f\xb5\xee\xf8\x26\x95\xd3\xcb\x50\x36\xb5\x0e\xb1\x49\xc1\xf4\x2c\x55\x4b\x9d\x46\xd4\xa8\x4e\x7a\xb6\x8a\xa4\xd6\xa1\x75\x54\x1e\x7d\x3b\x6a\xa3\xd6\x19\x6b\x50\x15\x3d\x43\x25\x51\x17\x86\x8c\xc4\x5d\xd8\xc4\xa9\x57\xd8\x67\x14\x8b\x74\x96\xae\x39\xeb\x94\xe3\xb3\x33\xbb\x72\x8b\x8a\x81\x6b\xed\xdb\xc8\x74\xae\x3b\xef\x65\x18\x46\x93\xec\x71\xab\xb3\xe8\xea\xfd\xf5\xe7\xf7\x97\xe7\x37\xef\xaf\xca\xfc\x5d\xd5\x4c\xb7\x70\x62\xcd\x3a\x88\x89\xc7\x89\xd5\x14\x50\x17\x72\xcd\x2b\xb5\x07\x6a\x5e\xe5\x39\xad\xaa\xb5\x3f\x5f\xb8\x17\x95\xdb\x8b\x7e\xb4\x9f\xce\xae\xc7\xf3\x16\x1c\xa7\xb0\xf1\x39\x53\x7c\xcf\x92\x27\xb1\xb0\x7e\xab\xd3\x2b\x17\x49\x45\x59\x94\xe4\xb1\x62\x2e\x6e\x6f\xa7\x57\xe2\x14\xa1\x0b\x12\xe1\x5c\x68\x2d\x4c\xcc\xd9\x48\xa2\x4f\xbf\x7f\xfc\xb7\xf6\xc7\xd6\x25\xc6\x0e\xd7\x44\xa3\xf2\x52\x0c\xc0\xc2\x12\xe0\xda\xd0\x05\x01\x46\x45\x7f\x39\xc2\xa9\xba\xc5\x04\x64\xae\x90\x9a\x17\x59\x92\x24\x55\x37\xe6\x3d\x41\x05\x82\xaa\x6a\xb8\xc8\x30\x6f\xdd\x27\x17\x44\x42\xd4\x55\x93\x87\x64\xe3\xac\xb5\x68\x5c\xf7\xd0\xb5\x06\xe2\xa3\x91\xc6\x1f\xb0\x30\x1a\xab\xca\xde\xb6\xac\x6f\xbb\x7e\xa6\x5e\xc5\x51\xa3\xdc\x80\xeb\x59\xff\xb5\xd5\x67\xd5\xd9\x42\x8f\x01\x4e\x24\x54\x76\xd6\xa6\xd6\xbb\x01\x55\xe7\x01\xd8\xd2\x65\x90\xf2\x24\x07\x1f\x76\x1e\xd9\x5e\x97\xbb\xf5\x45\x27\x11\x89\x83\xdc\x9f\xc6\x7f\x2e\x7c\x96\xcf\x5d\xf6\xd7\xa2\xbf\x46\x23\x83\xfe\xfe\xe7\xbb\xef\xfe\x17\x00\x00\xff\xff\xbb\x9b\x0c\x85\x9e\x75\x0b\x00") +var _olmManifests0231CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\x9e\xbf\x02\xcb\xcd\xb9\xb6\x13\x49\x9e\x49\xda\x7c\xad\xbf\xb4\x59\xae\xed\x24\xbe\x99\xf1\x68\x8d\x9d\xf4\xf6\x9b\x99\x93\x40\xe4\x96\x84\x9a\x04\x58\x00\x94\xad\x9e\x9c\xff\xfd\x2e\x6c\x3c\x48\xea\x65\x49\xa4\xc7\xb2\x87\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xbf\x1f\xdd\x6e\xf7\x33\x9a\xb1\x5f\x40\x2a\x26\xf8\x31\xa1\x19\x83\x3b\x0d\xdc\xfc\xa5\x7a\x37\x7f\x56\x3d\x26\x8e\x26\x2f\x3f\xbb\x61\x3c\x3e\x26\xa7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x33\x18\x32\xce\x34\x13\xfc\xb3\x14\x34\x8d\xa9\xa6\xc7\x9f\x11\x42\x39\x17\x9a\x9a\x9f\x95\xf9\x93\x90\x48\x70\x2d\x45\x92\x80\xec\x8e\x80\xf7\x6e\xf2\x01\x0c\x72\x96\xc4\x20\x71\x72\xff\xea\xc9\x8b\xde\x5f\x7a\x2f\x3e\x23\x24\x92\x80\x8f\x5f\xb3\x14\x94\xa6\x69\x76\x4c\x78\x9e\x24\x9f\x11\xc2\x69\x0a\xc7\x24\xa2\x9a\x26\x62\x64\x17\xa1\x7a\x22\x03\x49\xb5\x90\xaa\x17\x09\x09\xc2\xfc\x27\xfd\x4c\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\x57\xf8\x5a\xfc\x3d\x61\x4a\xff\x34\x7f\xed\x15\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xcf\x08\x51\x91\xc8\xe0\x98\xe0\xa3\x19\x8d\x20\xfe\x8c\x10\x07\x42\x37\x55\x97\xd0\x38\xc6\x6d\xa1\x49\x5f\x32\xae\x41\x9e\x8a\x24\x4f\x79\x78\x95\xb9\x27\x06\x15\x49\x96\x69\x04\xfd\xf5\x18\x48\x26\x41\xeb\x29\x82\x84\x88\x21\xd1\x63\xf0\xef\x0e\x4f\x11\xf2\x2f\x25\x78\x9f\xea\xf1\x31\xe9\x19\x08\xf7\x62\xa6\xb2\x84\x4e\xcd\x6a\x4a\x77\xd9\x6d\x3a\xb3\xd7\x4a\xbf\xeb\xa9\x59\xba\xd2\x92\xf1\xd1\xaa\xa5\x98\xfb\xd6\x5f\x83\x05\xcd\xf5\x34\x9b\x5f\xc2\xcc\x8f\xeb\xbe\x3f\xcb\x07\x09\x53\x63\x90\xeb\x2f\x22\x3c\x32\xb7\x86\xfe\x82\x2b\x4b\x16\x52\x9a\xd4\x1f\xa8\xde\xdc\x61\x98\x7b\xc1\xc9\x68\xfe\x1b\x63\xaa\xfd\x8f\xf6\xa6\xc9\x4b\x9a\x64\x63\xfa\xd2\xfd\xa8\xa2\x31\xa4\xb4\xc0\x07\x91\x01\x3f\xe9\x5f\xfc\xf2\xf5\xd5\xcc\x05\x52\x85\x4e\x05\xcf\x09\x53\x84\x12\x09\x99\x50\x4c\x0b\x39\x35\xd0\x3a\xbd\xfa\x45\x75\xc8\xe9\xdb\x33\xd5\x21\x94\xc7\xe1\xe0\x91\x8c\x46\x37\x74\x04\xaa\x37\xb7\x56\x31\xf8\x17\x44\xba\xf4\xb3\x84\x7f\xe7\x4c\x42\x5c\x5e\x85\x01\x8f\x87\xc9\xcc\xcf\x06\xfe\xa5\x9f\x32\x69\xde\xa9\x4b\x07\xd9\x8e\x12\x95\xab\xfc\x3e\xf3\x85\xfb\x06\x0c\xf6\x3e\x12\x1b\x02\x07\x0a\x51\xc0\x9d\x31\x88\x1d\xec\x2c\x6a\x30\x65\xbe\x5f\x82\x02\x6e\x49\x9e\xf9\x99\x72\xf7\x4d\x3d\x72\x05\xd2\x3c\x68\x8e\x7b\x9e\xc4\x86\x12\x4e\x40\x6a\x22\x21\x12\x23\xce\xfe\x13\x66\x53\x44\x0b\x7c\x4d\x42\x35\x28\x4d\xf0\xd4\x72\x9a\x90\x09\x4d\x72\xb0\xa0\x4c\xe9\x94\x48\x30\xf3\x92\x9c\x97\x66\xc0\x5b\x54\x8f\xbc\x16\x12\x08\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\xb4\xa7\xe1\x91\x48\xd3\x9c\x33\x3d\x3d\x42\x72\xcc\x06\xb9\x21\x87\x47\x31\x4c\x20\x39\x52\x6c\xd4\xa5\x32\x1a\x33\x0d\x91\xce\x25\x1c\xd1\x8c\x75\x71\xb1\x1c\xe9\x78\x2f\x8d\xff\x20\x1d\xd5\x57\xfb\x33\xe0\x5b\x88\xcc\xc4\x93\xcd\x95\xb0\x36\xc4\xd3\x62\x91\x7d\xdc\x7e\x4b\x01\x52\xf3\x93\x81\xca\xdb\xf3\xab\x6b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\x83\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\x6f\x5e\xbd\x26\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x8e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\xf7\x42\xa6\x54\x1f\x93\x6f\xfd\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x1d\x7f\x9b\x09\xa9\xff\x46\xde\xf0\x64\x6a\x26\x8d\xc9\xed\x18\x38\xb9\x0a\xdf\x46\xfe\x5a\xfa\xe3\x07\x99\x45\x3d\x72\x31\xe2\x42\xfa\x3b\x0d\x56\x5d\xa4\x74\x04\x64\xc8\x20\x41\xbc\x56\xa0\x7b\xb3\x3b\xb8\x72\x17\x89\x15\x97\x86\x6c\xf4\x9a\x66\xf7\x82\xe6\xd4\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x86\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xf5\x20\x70\xea\x27\x30\xf0\x2b\x7e\xbe\x70\x94\xab\xb7\xe9\x67\x97\xbf\x6c\xe3\x67\x0b\x31\xe4\x5e\xa0\xbd\x5e\xc4\x45\xd6\x78\xc7\x48\x66\x51\x5f\xc4\xf6\xb3\xef\x7d\xcb\x0f\xe5\xbb\x09\xdc\x65\x42\x81\x22\x31\x1b\x0e\x41\x1a\xba\x23\x26\x20\x25\x8b\x41\x91\xa1\x90\xb8\x5f\x99\x88\xf1\x4c\x86\xfd\xab\xb0\xda\xbe\x88\xd7\xdd\x18\xf3\x6a\x64\x18\x16\x19\x1d\x1a\x2e\xfd\xdc\x85\xa7\x9d\xdc\x73\x78\xcd\xe0\x22\x86\x2b\x48\x20\xd2\x42\x2e\xbe\x63\x06\x26\x97\xa5\x07\x1c\xd5\xf7\x7f\xdd\x8e\x59\x34\x26\x69\xae\x90\xea\x6a\x99\x43\x05\x2e\x5a\x90\x21\xd3\x44\x70\x42\xf1\xb5\x86\xd6\xcf\x3f\x99\x52\x1d\x8d\xdd\x1d\xfb\x8a\x24\x74\x00\x89\x9a\x9d\x67\x00\xc8\x72\xe3\x3c\x81\xd8\x4c\x88\xb4\x04\xe7\x5c\xf2\x09\xf7\x40\x89\x58\x52\x16\xe4\xed\xd5\x30\x23\xf7\x61\x99\x05\x3c\x13\x92\xe9\xe9\x69\x42\x95\x5a\x86\xd3\x73\xd0\xbd\x18\x22\xfa\xb0\x21\x83\xb8\x43\x18\x8f\x99\x51\x69\x94\xff\xf6\x7d\x15\xe6\xed\x99\x7b\x0d\x83\x2b\xdd\xef\x21\xe4\xef\x21\xb7\x2c\x49\x0c\xb0\x62\x18\xd2\x3c\x41\x22\xf9\x1f\x90\x82\x30\xc4\x4e\x89\x78\xc5\x85\xbf\xbc\x1a\x78\x2b\xbe\x55\x41\x94\xe3\xb7\x0a\xae\xe1\x4e\x2f\x3f\x5d\x73\xdf\xbb\x77\xb5\xe8\x51\x64\x09\x03\x20\x82\x23\x21\xfc\x2d\x81\x11\x8d\xa6\xbf\x99\xe5\xff\x26\xc1\x2c\x24\xd2\x10\xff\xd6\x43\x39\xbf\x72\xc4\x0c\x80\x04\x52\x6d\x60\xe6\x0b\x09\xe3\x66\xcb\xcd\x61\x63\x7a\x8c\x00\x92\x6c\x34\xd6\xe6\x2e\xa7\x78\x54\x17\x80\x67\x2e\x5c\x34\xac\x9f\x32\x0e\xf2\xdd\x17\x1f\xe6\xee\xb4\x22\x1b\xf2\xaa\x24\x11\xb7\x65\xfc\x94\x39\x27\x8c\x9b\xf3\x4e\xfc\x07\x92\x93\x38\x65\x0a\x25\xd2\x83\xfe\xd5\xc9\x61\xe5\x4b\x48\x2a\x62\xe8\x98\xef\x8b\x05\x28\xbe\xaf\xcd\x69\x37\x13\x2a\xf0\xaf\xa1\xda\xbc\xc6\xe0\x84\x3b\x2d\x11\x35\x3c\xd3\xbd\xd3\x00\x4c\x18\xc2\x32\x80\xf0\xf2\xab\x13\xf2\xdb\x80\x2a\x48\x18\x07\x0b\xbb\x4c\xb2\x09\x4b\x60\x64\xde\xc8\xbd\xee\xa9\x7a\xe4\x34\x97\x86\x9e\x25\x53\x87\x18\x64\xf1\xae\x30\x45\x72\x3e\x83\x6e\x1e\xb3\xac\xcc\x57\xde\x2c\x73\xb7\x32\x52\xd7\x15\x3e\x31\x35\x5c\x9c\xfa\xfb\x70\x6f\xf4\x98\xf2\xa5\x9b\x6b\x24\x45\x33\x31\xe3\xf6\x29\x16\x5b\xd1\x1c\xa4\x14\xb2\x47\xfe\x61\x68\x67\x6e\x34\x6c\x22\x92\x18\xa4\xd7\xee\x08\x33\xf4\x52\x75\x3c\x90\x50\x62\x77\x72\xa0\x03\xcc\x02\xc0\x2f\xff\x66\x27\xf3\x1b\x82\x03\x28\x97\xf8\xf5\xf6\xc8\x7b\x6e\x04\x4a\x4a\x86\xb9\x11\x01\xbd\x6e\x61\xcf\x5c\x19\x34\xfe\x10\xfa\x09\x4a\xaf\xef\x84\x65\xa7\x94\x39\x54\x0b\x7a\x86\xb4\x06\x16\x33\x17\x0b\xdf\xa7\x2c\x22\xd3\xf0\x3a\x31\x24\x22\x4b\x2d\x05\x54\x79\x66\xc4\x1f\x65\xbe\x94\x1b\xd0\x44\x15\xf6\x93\x89\x58\x2d\x04\x80\x59\x56\x26\x21\xa3\x32\x50\x6c\x05\x24\x1a\x53\x6e\x74\x3d\xf3\xa1\x41\x56\x36\xb2\x97\x79\x2d\x1d\x88\x5c\x23\x8e\xb9\xb3\x3a\x14\x39\x8f\x89\x21\x2a\x85\x38\x7d\x93\x0f\x40\x72\xd0\x80\x12\x75\x2c\x22\x65\x84\xe9\x08\x32\xad\x8e\xfc\x69\x3a\xca\x44\xdc\xf5\x7f\x74\xa9\x3f\x24\x47\xfb\x7b\xdb\x52\x23\xe2\x21\x7f\x4c\xec\x5e\x2d\xb9\x0b\x78\x9e\x2e\x27\xf0\xdd\xd5\x0f\x9b\x1b\x0a\x30\x2e\xbc\x49\x8b\xc4\xa8\xcd\x85\x4d\x67\xd1\x42\xcb\x46\x8b\xe2\x7e\x62\x76\xa2\x64\xb3\x70\xc2\xb9\xa5\x6e\xfb\xaa\x3c\xf5\x6a\xa2\x4d\xa5\xa4\xcb\x3e\x81\x69\x48\x57\x70\xb8\x79\x83\x8a\xa1\x6d\x46\x17\x2b\x16\x8a\x02\x80\xd6\xd4\xf0\x62\x54\x7e\xed\x15\x43\xae\xf8\x94\x18\x7c\x76\x72\x3e\x72\x75\xc7\xc7\xb4\x64\x59\x02\xe4\xdb\x1b\x98\x76\xac\x66\x0c\xc3\x21\x44\xfa\x6f\xee\x3c\x9b\x7b\xf0\x7e\x3c\xdc\xde\xf4\xf0\xad\xff\xd7\xdf\x96\x7d\xf1\x5a\x5c\xfe\x7e\x89\xc8\x0e\xbb\xa4\x55\x77\xcc\x40\xe8\x1c\x1f\x98\x61\xd9\x16\x02\x76\x2e\x03\x1f\xfc\xac\x1e\x39\x4f\x33\x3d\x25\x29\x50\xae\xbc\xbc\x63\x68\x46\xe9\x66\xe5\x28\x5c\x89\xda\x22\x93\x09\x96\x02\xc4\x90\x4b\x71\xe5\xa4\xa0\x0e\xe9\x4b\x18\x82\x2c\x7e\x41\x46\x76\x29\xce\xef\x20\xca\xf5\x52\xb9\xa8\x0c\xb7\x95\x47\xca\x8c\x1b\x98\x6e\x00\x90\x9f\x60\xea\x35\x1a\xfb\x65\x37\x30\xb5\xc8\x80\x3f\x15\x38\x44\xb3\x2c\x61\x60\x95\xf6\x55\x90\xb9\x81\xa9\x42\xa9\xc7\x3c\x7f\x63\x67\x07\x73\x7f\xa7\xc0\x12\x2f\x7c\x9e\x1b\xbd\x51\xfd\x5f\x8b\xaf\x91\x48\x07\x8c\xdb\x97\xd9\xa9\xfd\x56\xe0\xec\x1e\xa0\x3c\xc6\x3f\xf1\x35\x4d\x80\xcb\x2f\x6a\x03\x98\xbd\xf1\xdf\x51\x58\x44\x08\x35\x2b\xda\x57\x44\x42\x62\x4f\xfc\x98\x65\xde\xd0\x84\x4b\xef\x91\x5f\x0c\x7b\x2c\xcc\xe3\x88\x1b\x16\x02\xf8\x55\xe7\xff\xce\x69\xd2\x23\x67\x96\x2a\xe2\xd7\xbb\x9f\xdc\x4d\x06\x90\xff\xce\xd9\x84\x26\x46\xab\xd1\xc2\xb0\xac\x38\xa2\x32\x46\x6e\xe0\xac\x57\x4a\xd8\xdd\xa3\x41\xe0\xf0\xa7\xbd\xd8\x23\x85\x96\x33\x92\x51\xa9\x59\x94\x27\x54\x7a\x8b\xfc\xb4\x11\x88\x16\x48\x73\x05\x91\xe0\xf1\xca\x13\xbc\x94\xba\xba\x67\xcb\x30\x46\x31\x0a\x24\x13\x31\x2a\x6e\x2c\x85\x59\x24\x3d\xa8\x2a\x37\x62\xe8\x4f\x75\x38\x62\x1d\x2b\xd5\xdc\x32\xe5\x8c\x5b\xc1\x80\xc0\xac\x81\xe1\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4f\x3d\xbf\xea\x10\xa6\xad\x44\x8e\xf2\x9f\x97\x61\x3c\xca\x3a\x60\x17\x07\x6a\x28\x24\x18\xa5\xff\x20\x16\xf8\x0c\x4c\x58\xa4\x0f\x7b\xe4\xff\x19\x11\xdf\x6c\x3c\x87\x11\xd5\x6c\x12\x64\x48\x2f\x89\x68\x09\xd4\xc8\xc4\x54\x91\x17\xe4\x00\x1f\x23\x2c\x4d\x21\x66\x54\x43\x32\x3d\x24\x83\x29\xbe\x46\x4d\x95\x86\x74\x9d\xad\x63\x5c\xc3\xa8\x62\x1d\x9f\x1f\x43\x67\xb8\x61\x5c\x7f\xf3\xc7\x15\x77\xe2\x62\x37\xd8\xd9\x5f\x50\xa4\xac\x90\x1a\x2b\x65\xce\x6c\x61\xe0\x41\x22\x50\x91\x40\x37\x98\x72\x67\xa1\x53\x9c\xab\x92\xec\xe7\xc9\x4c\xd8\xe0\x7f\x19\x3c\xa0\x44\x02\x3a\x78\x1c\xe6\xd6\xc0\x71\x16\xad\x32\x98\x2c\xe5\x68\xcb\xed\x79\x04\x25\x14\x23\xfe\x7f\xf3\xc7\x25\x86\x12\x6b\x8d\x37\x7b\x3e\x6f\xf3\x23\x6b\x30\xca\x62\xf2\x65\x9b\x75\xef\xb1\x0e\xaf\xdf\x6a\x06\x14\xf5\xef\x35\xe2\x04\x03\x8a\x51\x91\xdc\x7e\x77\xbd\x9d\x8c\x04\x0d\xcf\xce\x66\x88\x1f\xe3\x4a\x53\xae\x19\x52\xb6\x60\x51\xf3\x16\x36\x23\x7e\x6f\x62\xc4\x41\x5c\x73\x84\xc6\x22\x97\xb3\x99\xce\xd1\x87\x8d\x8d\x6d\x5e\xcd\xbf\xdf\xfa\xda\xf7\x06\x01\xfb\x4e\xaa\x14\x1b\x19\x29\x93\xdc\x02\x6a\xc3\x8e\x9d\x54\xa5\x4d\xab\x15\xe0\x83\xec\x3f\x78\x9a\xd2\xc0\x04\x98\xf6\x72\x7f\x24\xb8\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xeb\x4f\x26\x20\x7b\xe4\x67\x65\x76\x8a\xfc\xc8\x46\x46\xef\x73\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x53\x06\x74\x43\x90\x12\x62\xb4\xb6\x11\x23\x03\xf9\x19\x20\x9e\xb9\x5f\x91\x38\x47\x0f\xc4\xec\x22\x72\x03\x07\x6b\x2e\x90\x46\xa9\xf1\xe6\xb9\x60\x28\xb1\x07\xde\x7c\xd2\x48\x58\x5f\x03\xfa\xc3\x0c\xed\xd4\xa2\xa0\xa3\xcc\x1a\x88\xc3\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x56\x15\x61\x34\x60\xcf\x7c\x0c\x2a\x6e\x39\xb7\xc0\x87\xb2\x95\xc6\x93\x99\x17\x76\xaa\x45\xcf\x21\x39\xa6\xe9\xec\x92\x0b\x9a\x2e\x29\xbf\x81\x98\x24\x70\xc7\x22\x31\x92\x34\x1b\xb3\x88\x26\xc9\x14\x8f\x29\x1a\xc9\x98\x56\xa8\xf5\xaf\x30\x66\x2f\x23\xe3\xc1\x31\xba\xb1\x51\x57\x41\x24\x41\xdf\xef\x20\xb8\xb2\xf7\x15\x4c\x19\xd5\x65\x31\xf4\x13\x58\x1c\x71\x38\xe7\xad\xe0\x34\x8a\xcc\x41\x42\xd4\x35\x5a\xbb\x13\x40\x4a\xa8\xdc\x23\x17\xc8\x52\x07\xa0\x10\xcb\x6f\x00\x32\x8b\x69\x09\x53\x9a\xa8\x14\x6d\x2a\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x99\x51\x4b\x06\x56\x0c\x32\xac\x76\x1a\xf6\x06\xb8\x5e\x2c\xd4\xac\xd6\xbb\x56\xe8\x5c\xab\xc1\x18\x68\xca\xfd\x90\x2c\x68\x91\xe7\x89\xce\x13\xaf\x8a\xa0\x87\x0d\x5e\x6d\xbd\x67\x57\xda\x08\x1f\xa3\xfb\x69\xcd\xcf\x95\xdb\x83\xf7\x75\x2c\x6e\xbd\x1f\x6e\xee\x90\xa3\xc5\xc6\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x54\x70\x85\xf2\xa9\x75\xc7\xa2\x3b\x75\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\x06\x74\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x3a\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x9c\x2d\xce\xe0\x74\x0c\x1a\x64\xca\xb8\x13\x8f\x8c\xa8\x1b\x00\x3b\x00\x7d\x0b\xc0\x49\x34\x86\xe8\x26\x1c\x25\xe7\xcd\x9e\xd9\x35\x67\x7f\xaa\x52\xac\x22\x50\x40\x24\x09\x2a\x1a\x0a\x80\x30\xa3\x13\x70\xb8\x2d\xdb\xac\x16\xb0\x1b\xc3\xa2\x27\x94\x25\x74\x90\x00\x72\xcd\xf0\x57\xa7\xe2\x55\xf7\xfc\x3c\xcb\x93\xc4\x08\xb1\x3c\x26\xa3\xb7\xfd\x53\xa2\x25\x1d\x0e\x59\x64\x2e\xc5\x4c\x5a\xab\x6f\xd5\x21\x5f\x7d\xe1\x2a\x71\x6d\xe9\x89\x50\x9a\xea\x7c\x6e\x8f\x56\x6c\xf0\xaa\x8d\x35\x7a\x08\x5b\x6a\x20\xaa\x6c\xe5\xdb\xaa\xb2\x62\x96\x01\x56\xd9\xaa\xd8\xbf\x7b\xe4\x52\xa0\x8e\x40\x35\x79\x0d\xca\xb0\x5d\x04\xd0\x5b\xa0\x4a\xf0\x12\x75\x45\xe9\x57\xb2\x11\xe3\x34\x71\x1f\x55\xb6\xef\x05\xdd\x83\xa2\x49\x39\x65\x23\x49\x75\x20\x8a\xc5\xba\x1d\x77\x71\x7c\xd1\x5a\x42\x7b\xe4\x84\x4f\x71\xbf\x87\x40\xcd\x0f\x66\x66\x2d\x45\x9c\x47\x68\x87\x4f\x12\x74\xf7\x16\x93\x34\x4a\x46\xab\xee\x85\x53\xff\x12\x2f\xe8\x29\x73\x00\x28\x73\x2e\x25\xc1\x81\x50\x95\x19\x3d\xce\xe3\xa4\x35\x85\x17\x00\x46\x66\x71\xd2\xbf\x20\x3e\x60\xae\x47\xba\xdd\x2e\xb9\x36\x3f\x2b\x2d\xf3\x08\xf9\x8b\x39\x42\x3c\x76\x9c\xc2\x62\x1f\x7e\x24\x45\xb1\x13\x3f\x83\x38\xcb\x87\x15\xc1\x32\xaa\xc7\xa4\x67\x01\xdf\x2b\x81\x82\x90\xef\x0d\xaf\xb9\xa3\x69\x66\xf0\xfe\x3d\xb7\xd4\xfb\x7b\x21\xae\xec\x26\xd9\x77\xfe\x0f\x39\x3a\x9a\xc5\x09\x31\x30\x22\xaa\x33\x20\x22\x6a\x0c\x85\xd8\x57\xd5\x4f\xea\x99\x07\x7f\xe2\xe2\x96\x2f\x7a\x3b\xbe\x8b\x4a\x38\x26\xef\xf7\x4e\xfc\xe9\x7b\xbf\xd7\x21\xef\xf7\xfa\x52\x8c\x8c\xd8\xca\xf8\xc8\xfc\x60\x90\xea\xfd\xde\x19\x8c\x24\x8d\x21\x7e\xbf\x67\xa6\xfd\x32\x33\x1a\xd6\x6b\x90\x23\xf8\x09\xa6\x7f\xc5\xc9\xc2\xcf\x9e\x23\xfc\x35\x35\xd7\xf1\x77\xc3\x82\x0d\x9f\xfa\x6b\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\x4f\x0b\x3c\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x8e\xfe\xf6\x2f\x25\xf8\xf1\xfb\xbd\x62\xfd\x1d\x91\x1a\xcc\xc8\xf4\xf4\xfd\x1e\xa9\xbc\xf5\xf8\xfd\x1e\xbe\xd7\xff\xee\x17\x79\xfc\x7e\xcf\xbc\xc9\xfc\x2c\x85\x16\x83\x7c\x78\xfc\x7e\x6f\x30\xd5\xa0\x3a\x2f\x3b\x12\xb2\x8e\x11\x98\xfe\x5a\xbc\xe1\xfd\xde\x6f\x66\x4f\x8e\x8e\x9c\x0b\x03\x37\x53\x91\xff\x5d\x6c\xac\xbe\x97\xee\xaf\xd6\xdf\xd0\x08\x4d\x95\xbe\x96\x94\x2b\xe6\xe3\xc7\x96\xde\x9a\xda\xf3\xbe\xf4\xba\x44\x1a\xb0\xf4\xb2\xc5\x86\xa5\x97\x97\x70\xcf\x75\x38\xd7\xfc\x37\xac\x69\x75\x9e\x7f\xd0\x8b\x34\xe6\x4a\x61\xa7\x09\xfb\x63\x78\x80\xbb\xdb\x9c\x45\x23\xc7\x9b\x23\xee\xe8\x9b\x91\x18\x39\xee\x5b\xcf\x9d\xdf\xa0\xe0\x87\xd8\x8f\x9c\xc7\x20\x13\x74\x56\x15\xb3\x5a\x4f\x48\xdc\x23\xd6\x6e\x40\x83\x95\xe6\xc6\x1c\x24\xe4\x4e\xbc\x64\xbc\xc6\x75\x85\x19\x0d\xed\xb0\x67\xde\x4d\x83\x8c\x2e\x8a\x20\xd3\xc8\xe9\xb6\x77\x31\x93\x92\x51\xc5\x48\x56\x5d\xbd\x1c\x3d\x1c\x72\xac\x09\x78\x77\xb7\x8b\xd6\xc9\x53\x6a\x58\x07\x8d\xcd\x7a\x8b\x6b\x56\x7d\xb3\xea\x96\x25\xa9\xd6\x29\x64\x6d\xfc\x7e\x1f\x1c\xa8\x1d\x23\x41\xc1\x2c\xd3\xd3\x7b\x2d\x26\x6b\x7d\x7c\x4a\xef\x5e\x01\x1f\xe9\xf1\x31\xf9\xfa\xab\xff\xf3\xcd\x9f\x97\xdc\x68\x09\x23\xc4\x3f\x00\x77\xb6\xa0\x35\xc1\x30\xff\xe0\xac\xd1\xb0\x08\xf1\x1c\x15\xf7\x04\x23\x77\x81\x41\xb7\x14\x03\x38\x1c\xbb\xcc\x33\x03\x17\x43\xe8\xad\xad\x21\x82\x8e\x11\x92\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\xee\x3e\xf4\x16\x2c\x99\x29\xf2\x97\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xaa\x98\x12\x2c\x27\xf4\xc6\x80\x79\x4e\x08\x61\xbd\xf7\x6d\xdc\x7d\xf6\xc0\xf5\x6c\x81\x29\xe3\x2c\xcd\xd3\x63\xf2\x62\xc9\x2d\x96\xa4\xad\xb9\x9b\xf6\xe6\x42\x10\xa0\x86\x74\x8d\x24\x4d\x8d\xc8\x13\x11\x16\x03\xd7\x6c\xc8\x30\x68\x20\xa0\x36\xaa\xfb\xf6\x41\x1f\x83\x12\xa0\x88\xe1\x29\x86\x0e\x95\x90\xbd\x6f\xe5\x1c\x89\x1c\xd8\x79\x6f\xa2\x32\x81\x9a\x66\x60\x4f\x83\x55\x60\x08\xdc\x65\x56\x54\x2d\xb9\x21\x52\xa0\x9c\xf1\x91\x0f\x7b\xf1\xb6\x64\xcb\x75\x6f\xc7\xe0\xbc\xe7\x50\xf6\x05\x45\x46\x59\x8a\x51\x6f\xa2\x64\x94\x53\x49\xb9\x36\x6a\xec\x49\xff\xc2\xca\xe8\xb3\x36\x4d\x5a\xc4\x42\xfa\xd3\x68\x8f\xaa\x25\x56\x66\x89\xce\x6f\x8e\x27\xb6\xb9\xa3\xfa\xf2\xc5\x57\x2b\xb7\x3c\xdc\xb7\xdc\x85\x47\xb5\x06\xc9\x8f\xc9\x7f\xbf\x3b\xe9\xfe\x3f\xda\xfd\xcf\x87\x03\xf7\x8f\x17\xdd\xbf\xfc\xda\x39\xfe\xf0\x45\xe9\xcf\x0f\x87\xdf\x7d\xbe\x64\xa6\xc5\xc2\xfc\x12\xf4\x71\x4c\xc4\xcb\x89\x7e\x47\x3b\x3e\x4a\xe5\x5a\xe6\xd0\x21\xdf\xd3\x44\x41\x87\xfc\xcc\x91\x35\xd4\x04\xda\x6a\x0f\xb5\xe1\xca\x7b\xe6\xad\xcb\x3c\xe5\xee\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xa9\xaf\xeb\x01\xc9\x9b\x1a\x4a\x94\xa6\x14\x73\x8b\x41\x9a\xe6\x20\x89\x9e\x93\x70\x7b\x91\x48\x8f\x4a\x31\xb9\x46\xb4\x7e\x4d\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x54\xac\x48\xc2\x6e\x80\x9c\x14\x7a\xa3\x21\x96\x03\x88\x28\xca\xe2\x72\xc0\xb4\xa4\xd6\xe8\xeb\xe5\xca\xc2\xa2\x34\xcc\x13\x72\x60\xd4\xd5\x1e\x06\x92\xcd\x51\xd7\x43\x67\xbd\x1d\xb0\x84\xe9\xa9\x55\xa5\x23\xc1\x87\x09\x73\x2a\x40\x9a\x09\xa9\x29\xd7\xce\xce\x08\x23\xb8\x23\xac\x70\x7d\x33\x45\x0e\x62\xae\x5e\xbe\xfc\xea\xeb\xab\x7c\x10\x8b\x94\x32\xfe\x7d\xaa\x8f\x0e\xbf\x3b\xf8\x77\x4e\x13\xf4\xf2\x5e\xd2\x14\xbe\x4f\xf5\x61\x73\x6c\xf1\xe5\x37\x6b\x9c\xa2\x83\x77\xf6\xac\x7c\x38\x78\xd7\x75\xff\xfa\xc2\xff\x74\xf8\xdd\xc1\xfb\xde\xca\xeb\x87\x5f\x98\x6f\x28\x9d\xc0\x0f\xef\xba\xc5\xf1\xeb\x7d\xf8\xe2\xf0\xbb\xd2\xb5\xc3\x45\x87\xf1\xae\x5b\x84\x8a\x74\x8d\x16\xd0\x4d\x69\xd6\xbd\x81\xe9\x92\xc3\xb9\x54\x1c\x9d\x9f\xc8\x42\x2c\xa5\xd9\x22\xed\xdb\xc6\xd6\xbe\x05\x8c\xe7\x8c\x16\x22\x79\x4d\x0f\x0c\xa7\x4b\x44\xb2\x6e\x11\x81\xb5\x85\xd5\xc9\xf0\x1d\x6b\x69\x5b\x25\x4e\xaf\x81\x2d\xeb\xc9\x8f\x7c\x45\xfc\xe2\xbd\x2f\x09\xdf\xb9\xf5\x0c\xfe\x7c\x2f\x49\xfd\x58\x7b\x9e\x9c\x2d\xd5\xb4\xaa\x36\xcc\x8b\x33\x2b\xfa\x22\xe9\x41\x71\x6e\x2c\x8c\x9e\x97\x73\xf6\xef\x1c\xc8\xc5\x99\xa3\x47\x1d\xc2\x78\x94\xe4\xb1\x91\x14\x7e\xfe\xf9\xe2\xcc\xe8\xef\x7f\x77\xe4\xe6\x16\x48\x2c\xf8\xbe\x26\x6f\x2e\x5f\xfd\x13\x8d\x01\x78\x47\xc7\x32\x74\xeb\x8f\xa2\x09\xb3\x59\x23\x9e\x01\x93\xbf\x83\x8d\x93\xc3\x37\x47\x34\x0b\xf6\x13\x24\x77\x18\x61\x95\x64\x46\x80\xb8\x01\xa2\x72\xe9\x56\x67\x26\xb6\x1e\x5f\x03\x6b\xe2\xfc\xc1\x23\xd0\x88\xe4\x09\x66\x3f\x6c\x03\x34\x17\x8f\xcf\x04\xbf\x32\x52\xe0\x03\x9c\x0f\x83\xc8\x6f\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x48\x42\xb8\xf7\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfc\x24\xcd\x7d\xef\x56\x6f\xb4\xf6\x4c\xf4\x6c\xbe\xbd\xc7\xfe\x3c\x17\xc6\x55\x55\x9d\x67\x72\xc1\xd0\xb6\x1a\x9c\xa3\x63\xaa\xc8\x00\x80\xa3\x39\xd7\x5a\xff\x80\x3b\xac\x83\xc2\x10\x9b\x67\x5d\x2d\xba\xf1\xe2\xcd\xbb\x07\x72\xf7\x43\x6d\x85\xe6\x5a\xf9\xb6\x93\x8d\x15\xd5\xdb\xf1\x74\x11\x0c\x94\x35\x67\x62\xe0\x90\x97\x41\x36\xfd\xb0\xe5\x8a\xc9\x8c\x55\x17\x35\x0b\x67\xd4\x70\x7a\xc6\xfc\x92\x8c\xf6\x58\xb1\x6c\x68\x81\xde\xbc\xaa\x65\x6f\xf3\x35\xda\x6d\xbe\x02\x39\x61\x5b\x31\xbf\xfb\x0e\x66\x64\xe3\x4c\x4e\x1e\xfe\x58\x19\xd1\x6b\xeb\x97\xa0\xe9\x2f\x12\xf7\xb8\x6f\x56\xc6\xbf\x23\x04\x57\x45\xf9\x6f\x32\xc7\xa6\xcc\xd2\x52\x93\x63\xcc\xb8\xf0\x3f\x69\x21\xd1\xe5\x5e\xfe\x2d\x1f\x04\x41\xb9\x98\xdd\xe9\x40\xe4\x7f\xfe\xf7\xb3\xcf\x9e\x64\x1e\x79\x92\x2b\x0d\xd2\x81\xcf\x27\x51\x7f\xbc\x7c\x72\xfb\x7a\x77\x86\x1c\xe4\xf0\x7a\x29\xaf\x7c\xd1\x3d\xf3\xf9\xe5\x0b\x3f\x04\x6f\x59\x98\x67\xae\x26\xe5\x7f\xbb\x1b\x8b\x8c\xf3\x45\xb3\x3d\x64\xe6\x79\x25\x6b\xed\xea\x97\x12\xf6\x7e\x9c\x74\xf3\x19\xdf\xe2\xea\x25\x4c\x4a\xfb\x54\x7e\xfd\x2f\x73\xbf\xaf\xfb\x7a\xff\xf9\xd4\xbc\xb9\x14\xd0\x22\x38\x66\xc2\x26\xd4\xd7\x0c\x58\xbc\xa0\x05\xb7\xd8\x15\xbd\x9d\xbf\x70\x7f\xde\xb9\xd3\x5d\xb3\x31\x55\xf3\x20\xee\xcf\xfc\xba\x60\xba\x66\xb3\xcd\x17\x61\xbf\x15\xaf\x2d\x05\x09\x9e\x35\xdc\x3b\x23\xf7\xfe\xb6\xf0\x99\xab\x0c\xa2\xdf\xda\xcc\xf3\x36\xf3\xbc\xcd\x3c\xdf\xd1\xcc\xf3\xfb\xcf\xbd\x39\xc3\x24\x86\x28\xa1\x3e\xd3\x45\x43\x92\x60\x1a\xf8\x58\xdc\x86\xe8\xcb\x24\x29\x47\x6b\x16\xb1\x5f\x29\xe5\x18\xd1\x90\x65\xd6\x36\x4e\xc9\x88\x4d\x80\x87\x60\x94\x75\x17\xbf\x3a\x13\x7e\x31\x83\xf2\x57\xdd\x02\x67\xae\xac\x4c\x92\x9f\x95\x81\x56\x40\xed\xa4\xb8\xd7\xd9\x08\x72\x6e\x5d\xfe\xb9\x84\x18\xd3\x1e\x2c\x92\xa7\x34\x43\x29\xcf\xa7\x36\xd2\x32\x82\x63\xc6\xcd\xd4\x27\x9d\x0d\xa6\xc4\x88\x71\x48\x10\xb4\x10\x2e\x30\xc7\x3c\x8b\x84\x41\x82\x96\x0c\x26\x65\x03\x69\x70\x44\x6d\xae\x13\xac\x9f\x46\xbb\x52\x24\xa6\x19\x73\xb2\x4b\x1c\x04\xcb\x35\xa0\xd7\xbf\x70\xf8\x56\x88\xa3\xca\xe1\x1b\x28\xcc\x53\x70\xf2\x41\x90\x6b\xf1\x4d\x0e\xb1\x62\x82\xa9\x17\x16\x33\x0c\xd8\xca\x48\x38\x40\xcb\x8c\xa4\xdc\x5c\x58\x88\xdc\x0f\x90\x9e\x2d\x6e\xf9\xf2\xe8\x80\x66\x53\xbc\xca\xb0\x0b\x3f\x9b\x05\x4e\x30\xc3\xdd\xab\xce\x5a\xe0\x69\xb5\x1a\x34\xc2\xce\xdd\x12\x93\x09\xa3\x84\x8e\x46\x12\xa3\x65\x97\x46\x1a\xac\x99\xa6\x75\x5f\x68\x04\xc1\xc3\x88\x92\xfc\xca\x3b\x0c\x19\x5c\x79\xc3\x52\x0b\xad\xbf\x61\x5e\x58\xac\x8e\xf5\x12\xca\x28\x9a\xd1\x3c\x68\x85\xbc\x27\x77\xe5\xfe\xbd\xb5\xe3\x9e\x1d\xb6\xa3\xba\xcf\x33\x0b\x71\x57\x07\xe6\x7c\x14\xa4\xd9\x90\x83\xa8\xf0\x66\x3b\x37\x49\x06\xd2\xe8\xe3\x36\x9e\x98\x92\xc8\xca\x6f\x81\xf0\x78\xef\xf0\x3d\xcb\x59\x6b\xff\xed\x58\x07\x0b\xec\xe8\x62\x48\xd5\x3d\xb7\xad\xb7\x55\x76\xdc\x53\xca\x62\x76\xac\x99\xc2\xe4\xe6\x5e\x5d\xea\xa2\xd6\xdc\x06\x0c\x8d\x4f\xba\x46\x4e\x8e\x1d\x55\xf3\x16\xbd\x7d\x5d\x8e\x24\x91\xf4\x96\x00\x8f\x84\x21\x16\xff\xdf\xab\x37\x97\x3e\x7f\xed\x42\x13\x96\x66\x09\xa4\x18\x57\xf1\x9a\x4a\x35\xa6\x09\x48\xe4\x4e\x3f\xf3\xb4\xf2\xf7\x4c\x08\x78\x0c\x09\x9d\xda\xc9\x62\x88\x04\x5a\xe2\x85\x24\x99\x11\x70\xd3\x2c\xc7\x14\x0e\xbc\x8a\xef\xbd\x37\x49\x67\x0b\xd0\x14\x26\xaa\xc1\x74\xa1\x05\xb4\x3a\xee\xba\xf1\xba\x34\xa0\xbc\x98\xfb\x29\x81\x1d\x6b\xd1\x83\xf2\xc4\xf7\x7e\x65\xc8\x90\xe9\xaf\xb0\xb1\x95\x67\xdc\x30\x17\xec\xeb\xaf\x56\xdc\x19\x43\x96\x88\xa9\xc1\x8b\xfb\xcf\xca\x9a\xdf\xb3\xf6\xb9\x5e\x77\xbe\x75\xcf\xf2\x9a\xf3\x59\xe3\x54\x13\x33\x2d\x52\xa0\xb6\x9a\x68\x95\xfb\x6f\xa3\x89\x16\xd8\x1f\x97\xcf\xf6\x20\xcc\xaf\x7f\xe1\xad\x0d\xc1\xeb\x6b\x69\xd3\x4f\xc1\x6f\x5c\x12\xa4\xa7\x99\xa3\x34\x46\x16\x9c\x65\x77\x8f\xc3\xe5\xee\x91\x67\xfc\x6d\xf7\x48\x35\xfe\xb6\xfb\x64\x1b\x3b\x36\x61\x9b\xf7\x23\x9d\x1d\x1b\xd1\xd8\xfb\x11\x70\x8b\x49\x27\xab\xbd\xc9\x5b\xcc\x6b\x74\xe2\x1d\x90\xf0\xae\x2a\xcb\xa8\xc8\x77\x2e\xe7\xd0\x08\x6f\x58\xa6\x6a\x90\x88\xe8\xc6\xd9\x2d\xdf\x9e\x85\xf4\x3e\x5f\x96\xcd\x25\xf7\x11\x76\x1f\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x53\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\x75\xcf\x78\x72\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x7d\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x79\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\x28\x61\xef\xea\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfa\x85\x8c\x40\x2b\x83\x05\xb0\xb8\xa9\x42\xcd\x64\x63\xe0\x74\x90\x2c\x9c\xf8\x3e\x52\xe2\x9e\x5c\x6d\x3c\x1e\x08\x61\xbe\x6e\x1e\x62\xa8\xea\x78\x4d\x67\x93\x78\xe6\xbd\x65\x39\x76\x8b\x83\x9a\x4f\xdf\x9e\x35\x15\xca\x8c\xdd\x4d\xc2\xac\xae\x10\x2f\x56\x0e\x74\xb5\xfe\xde\xdc\x72\x88\x31\xc9\xcd\x97\x2d\x37\x87\x9e\x45\x4c\x27\xd3\xf0\xe2\xde\xa2\xb2\x23\x4f\x27\x24\xfa\xf4\xed\xd9\xfa\xe6\x7b\xbf\x01\x1f\xc3\x52\xdf\xda\xe1\x5b\x3b\x7c\x18\xad\x18\xb4\xe5\xa4\xad\x18\xb4\x62\x3c\x6f\x31\x68\xd7\xed\xd6\xad\xb5\x99\xb4\xd6\xe6\xd5\xb7\xb5\xd6\xe6\xd6\xda\xdc\xda\x6f\x96\x8c\x56\x70\xc1\xd1\x0a\x2e\xf7\x8c\x27\x27\xb8\xb4\xd6\xe6\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\x3d\xc5\xd0\xdd\xd6\xe8\xd7\x1a\xfd\x5a\xa3\x5f\xcb\x8d\x5a\x6e\x74\xcf\x78\x72\xdc\xa8\x35\xfa\x6d\x3a\x51\x6b\xf4\x5b\x38\x5a\xa3\xdf\x3d\xa3\x35\xfa\xb5\x46\xbf\x25\xa3\x15\x5c\xb6\x9c\xb4\x15\x5c\x56\x8c\xe7\x2d\xb8\xb4\x46\xbf\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\xd5\x37\xfa\xdd\x73\x92\x56\x3f\xbb\xfa\xa4\xac\x7c\x96\x45\xab\x5e\xb8\x75\x4f\xf7\x5a\x0d\x60\x07\x54\xc1\x37\x7f\x9c\xab\x5b\x5e\xbe\x25\x85\x98\x51\xbd\x7d\x7f\xd6\xe2\x15\xcb\xf7\x6c\x8d\xbd\x0f\xcb\xd8\x72\x16\x57\x58\xf9\xde\xa0\x58\xb3\xb5\xf1\x85\xbd\x39\xf4\x99\x9f\xe9\xcb\x59\x70\x1e\xbe\xa4\x00\x7d\x50\x1a\x6f\xc7\xe0\x1b\xda\xb8\xd2\xd3\xa1\x63\x3c\x53\x21\x7a\x79\x61\xff\xa4\x9a\xe1\xc8\xfe\x3d\x0b\x2e\xdf\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x99\xb5\x5e\x9f\x85\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\xfa\x7e\x0e\xdd\x2d\x65\x2a\x2f\xb3\xac\xaf\xc3\x98\x5d\x0f\x8c\x3e\xc8\x94\x29\xb5\x2c\xe0\xba\xba\xf4\xfb\xc8\xe6\x1a\xe4\x72\x09\xfc\xfd\x17\x95\x96\x13\xc4\x27\xdb\xfe\x67\x40\x23\x22\xf3\xc4\x35\x01\x75\xe5\xaf\x09\x8d\x22\x91\x73\x4d\x38\x40\x6c\x2d\x1b\x8b\x70\x75\x0d\x62\xbb\x86\xfc\xb4\xae\xf4\xd4\xb5\xeb\xbc\xf7\x2e\xf7\x0d\x27\xf6\x13\x16\x16\x54\x2f\x8f\xf5\xa5\x2d\x7c\xfd\xfd\x5c\x6b\x13\x56\xb8\x36\x23\xac\xec\x6f\x5f\x24\x2c\x9a\xbe\xcd\x13\x70\x2d\xe2\x4a\x4d\xf4\xad\xb4\x5b\x16\x91\x33\xbc\x1b\x57\x6f\x7b\x53\xc6\x02\x6c\x27\x69\x57\x18\xa0\xf2\xb8\xef\x52\x65\x5b\x3b\x98\x87\x08\xcd\xb2\x04\x53\x29\x84\x11\x5a\x6c\x8f\xfe\xd0\x5f\x6f\xd1\x6d\xeb\x4b\x2f\x6b\x89\xd7\x64\x23\x11\x9b\x78\x9b\xd5\xe0\x3e\x54\x21\x1b\xca\xda\xc4\x96\x88\xff\x41\x8a\x3c\x5b\xf3\xf6\x79\xcb\xa2\x7d\xda\x77\xdf\x2a\x37\xb0\xf1\x17\x9d\xcb\xc8\x77\x0c\xb6\x4d\xba\x9c\x49\xd4\x76\x03\x4f\xf3\x44\xb3\x2c\xb1\x6d\xbe\x47\x76\x42\x2a\xa1\xe0\x1b\x1d\x42\xf9\xd4\x7b\xa0\x5c\x9b\x08\x88\x09\x1d\x99\x19\xb5\x6f\x1e\x6b\xfb\x4b\xe4\x29\x98\xd3\x1c\x97\x1a\x9a\x1a\x75\x8a\x4f\x8b\xd9\xc9\x2d\x4b\x12\x6c\xdf\x9b\x24\xe2\x16\xe2\x1e\xd9\xdb\x9b\x25\xe5\x91\x90\xa5\xf5\x20\x31\xd9\xfb\xa2\x72\x97\xa1\x1c\xc5\x82\xd7\xc1\x11\xb2\xb1\x60\x49\x36\x13\x2e\xc9\xe6\x62\x34\x21\x5c\x70\x6f\x1e\xfe\xf9\xed\xab\xed\x10\xe1\xb2\x3a\x87\xeb\x27\x02\xd8\x1c\x3b\xa3\x52\x33\x9a\x90\x5c\x26\xca\xe2\x02\x35\x8a\x84\xf4\x0d\x59\xc6\x14\xbd\x8b\x11\x28\xdb\xf9\x83\x7c\x61\x77\xdf\x6d\x8e\x3d\xe3\x82\x27\x53\x42\xed\xd6\x0c\xf3\x24\xe9\x90\x21\xe3\xd4\x90\x6e\xc8\x7c\x36\x8d\xd1\xc1\xc8\x15\xe3\x11\x98\x6f\xea\x06\xe1\x04\x57\x64\x66\x34\x34\x22\x1c\xf4\xb8\x53\xea\x0a\x8d\xbd\xbc\xf1\x15\xe6\xd0\x47\xd8\xfa\x6e\x28\xa4\x17\x7b\xde\x8a\x04\x4d\xe4\xce\x78\xee\xba\xe2\xd3\xf2\xe5\xbf\x33\x8e\x8a\x0e\x79\x8b\xcc\xc7\x28\x4c\xc0\xb0\xc7\xb4\x99\x12\x5b\xdd\x1a\x64\x29\x90\xf2\x40\xe5\xd1\xd8\x7c\xd2\x5e\x26\x62\xb5\x67\x48\xd1\x9e\x82\x48\x82\x56\x7b\x87\xe6\xaf\xd9\x6f\xc0\xef\x2b\x3f\x77\x44\x33\xb6\x77\xd8\x21\x08\x20\x6c\x96\x22\xf4\xf8\xe9\xe2\xa1\xff\xd6\x4a\x8f\xae\xfb\xc6\x4c\x27\xc0\xd2\x0c\xae\xf3\x87\xc8\x6c\x23\x0d\x43\xe7\x35\x60\xae\x95\x41\x4a\xdb\xe3\x33\x34\x99\x9f\x25\xf8\x84\x9c\x84\x26\xfb\xa0\xb1\x97\xb8\xbb\x1b\x26\x20\xa7\x7a\x6c\x34\x5e\xa6\x02\x01\x79\xf2\x40\xaf\x07\x70\x77\xe0\x3d\x70\x0b\x24\xb7\xdd\x99\x66\x81\xbb\xff\xc5\xfe\x2c\x21\x2d\x38\xc2\x93\x05\x25\xb2\xe8\xad\xc0\xf8\x8b\x79\xb2\x0a\x42\xfb\x93\xa5\x96\x81\x7e\xbc\x7a\x65\x3b\x31\x39\x58\xfd\xc4\x78\xac\x42\x35\xa4\x38\x74\xdc\x34\xf0\x5e\x08\x64\x5c\xe1\x53\x04\xf0\xbc\x08\xbc\xae\xd8\x7a\xcf\xf4\x25\x1d\x69\x17\xd4\x1a\xec\xec\x54\x91\x94\x0c\x9d\xea\x58\xb7\x95\x11\x41\x12\x3a\x80\xc4\xb6\x6d\x32\x57\x8b\xe5\x93\x93\x57\xaf\x43\x87\x33\xec\x18\xfa\xb1\x95\x99\x35\x9c\xaf\x73\x7d\xe2\xe6\xc7\xfa\xf2\x2b\x82\x62\x33\x83\x32\xb9\x02\x6d\x8f\x59\x4a\x33\x73\xca\xec\x1c\x0b\xed\xa1\xaf\x10\xd2\xf7\x1f\x96\x8d\xe4\xfe\xf5\xfb\x3a\x2d\x7a\xc9\x5a\x47\x65\x3d\xaf\xf1\x26\x67\x6f\x85\x95\xa4\x18\x15\x30\xcf\x20\xb4\xd3\x0d\x9c\x34\x1f\x85\x1e\x7d\x16\x83\x95\x4d\xae\xb6\xa9\xec\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa2\x78\x19\xdd\x3b\x81\x48\x8b\xd5\xa5\xe3\xfc\xcd\x1a\xd2\x2c\xb9\xef\xe4\x91\x8d\x95\xb4\x94\xf1\xb7\x40\xe3\xe9\x15\x44\x82\xc7\x6b\x12\xd8\xca\x7e\xbc\x66\x9c\xa5\x79\x4a\x78\x9e\x0e\x00\x41\xac\xec\x5c\x48\x48\xac\x02\x4c\x09\x87\xdb\x64\xea\xdb\x0d\x93\x4c\xc4\x9e\x9e\x0c\xb0\xab\x72\x3c\xc5\x1e\x69\x58\x64\x95\x4f\xcd\x24\xd8\x3d\xd9\xd7\xe2\x23\x91\xa4\xca\x88\x45\x1d\x9c\x94\x69\xc3\xb1\x06\x80\xfe\x29\x16\x83\xd9\x63\x3a\xa1\x2c\x31\xa2\x75\x8f\x9c\xc1\x90\xe6\x09\xb6\xfa\x23\x2f\xc8\x81\x79\x99\xd7\xc9\x16\x3d\x60\xc4\x5d\x25\x8c\x36\xaf\x5c\x9e\x3c\x2e\xe8\x70\x03\x8b\xfb\x3a\x35\x00\xfd\x58\xb7\x16\xa0\x1f\x19\xcd\xd5\xba\xaa\x7c\x65\x63\x2e\x6c\x57\xed\xb2\x24\x5a\x22\xe9\x4c\xb9\x99\xd7\x63\xd9\xab\xeb\x27\x2c\x58\xb5\x14\x23\x09\x4a\x9d\x01\x8d\x13\xc6\x61\x7b\xfc\xba\x1e\x03\x49\xe9\x1d\xe2\x18\x36\x45\x67\xbc\x82\x61\xb4\xfc\x55\x5a\xd8\xc6\xfb\xfe\xf5\x64\x00\x43\x6c\xe5\x88\x1f\x5c\xda\x7d\x8b\x3f\x43\xca\x12\xa3\xa1\x5f\x57\x61\x53\x74\x40\xb6\x88\x63\xfe\x66\x3c\x07\xf3\x54\x26\x05\x2a\x93\xf6\xd1\x32\x8f\x47\x1e\x4a\x8b\x96\xe4\xbe\xeb\x5f\x7f\x06\x14\xe7\x77\x91\x35\x14\xba\x6e\xe2\x1e\x37\x55\x2e\x87\x46\x75\xf4\x1a\x67\x69\x41\xae\x5d\x2c\xb9\x14\xda\x35\x0f\x0c\x1f\x88\x4f\xbb\x66\x96\xa0\x34\x4b\xf1\x80\xc5\xb9\xf4\xad\x35\x11\x66\x74\xf1\xd6\x57\x8e\xca\x37\x2f\x5e\xac\x29\xbf\x3d\x3c\xd2\x4b\x40\x4d\x79\x1b\x7c\xb9\x0c\x74\xc8\x93\x7f\xa3\x02\x9b\x3d\x66\x4e\x0c\xc6\x1e\xa1\x20\xd1\xd7\xc8\x94\x66\x7c\x94\x33\x35\x26\x03\xd0\xb7\x00\x9c\xc0\x9d\xad\x92\x41\xfe\x03\x52\xe0\xa6\x1a\xf0\x16\x6e\x86\x0a\xd0\x5e\xee\x0e\xc4\x26\x4c\x31\xc1\x7f\x64\x4a\x0b\x39\x7d\xc5\x52\x76\x4f\xf9\x52\x3f\xe6\x3b\x25\x07\x08\x8a\x24\xc6\xfe\xc6\x2c\xa2\x57\x60\x3f\x58\x02\x5a\x41\xb5\xb0\xea\x29\x31\xe7\x64\x40\xa3\x9b\x07\x03\xf0\x8b\x5d\x81\xb0\x67\xd7\x5b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\x77\x16\x3e\x15\x28\xdf\x8e\x85\x02\xbc\xc1\x1a\x2a\xf1\x31\xef\x58\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x70\x58\xbd\xa3\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x1a\x5b\x53\x96\x88\x83\x38\xb1\xaf\x9c\xd8\xbf\x09\x94\xd7\x36\x44\x6f\x6e\x32\x26\x76\x9d\xe7\x77\x46\xb7\xbc\xd7\x23\x54\x1d\x15\x90\xcf\x4e\x53\xd5\x80\x93\xea\x86\x38\xb9\x2d\xb5\x6d\x86\xaf\xd1\x88\x5c\xfc\x82\xbb\x70\x72\x79\xb6\xbe\x29\x66\x1b\x05\x77\x63\x15\x77\xd6\x5c\xbe\xe2\xa3\xbc\xc9\xd4\x5d\xa9\xda\xcc\x6d\x7b\xe9\x0e\xa1\xe4\x06\xa6\xb6\x13\xf5\x5c\x6b\x5f\x09\x89\x93\x24\x00\x3b\xdc\x9a\x9b\x5c\x5b\xea\x0d\xd6\xbb\x31\xf6\xd8\xb1\x99\x3b\xc3\x8f\xae\x59\xe8\x86\x4f\xf8\x8f\xde\xe0\xb1\xcd\x11\xdc\x8e\x1b\x98\x6e\xf6\xc0\xcc\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x43\x10\xf4\xc2\x56\x6f\xe6\x67\x2a\x8f\x8d\x4d\x54\x7e\x78\x20\xd6\xfa\xbc\x80\x7e\x65\x2b\x93\xf9\xc6\x7d\x65\x91\xd1\x9c\xe9\x31\xcb\x90\x11\x79\x67\x80\x6f\x94\xfe\x0b\x4d\x58\x1c\xa6\xb0\xe7\xf7\x82\x77\x8c\xf8\x64\xfe\x83\x44\xd7\x8a\x6b\x67\x02\xd4\xa5\xd0\xf8\xcb\x47\x03\x90\x5d\x66\x2d\xf0\xd8\x29\x9c\x15\x1a\xa9\x0c\x2a\x5e\xa5\x1e\xeb\xaa\xe7\xab\x83\x05\x50\x32\x45\x2e\x38\x11\xd2\xc3\x01\xbb\xde\xdb\x89\xec\x14\xc8\x27\x06\xd6\xc1\x81\xf6\xe9\x85\x73\x38\xf0\x09\x59\x81\xde\x8a\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\xab\x7e\x82\xd2\xae\x13\x55\xa9\x77\x94\xb3\x88\xa4\x20\x47\xe8\x71\x89\xd6\xf6\x38\x54\x37\x65\x33\xba\x6b\xc7\xc6\xd4\xb7\xfc\xc2\x8d\xb0\x00\x59\x93\x35\x01\xd5\x61\x6e\x76\x86\x8a\xc9\xe9\x7f\x0c\x05\xc7\x3d\xf8\x5f\x92\x51\x26\x55\x8f\x9c\x10\xc5\xf8\x28\x81\xca\x35\xa7\x61\x94\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd0\xc4\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x2c\x4b\xed\x38\x49\xc5\x50\x9e\xe0\xe8\xda\xbb\x81\xe9\x5e\x67\x0e\x69\xf6\x2e\xf8\x9e\xe5\x2d\x73\x68\x12\x18\x11\xfa\xc8\xf6\xf0\xda\x5e\x93\x5c\x78\x43\x86\xb3\xad\x1d\xad\xfa\xd2\xb5\x31\xc2\xc7\x87\x6c\x29\xac\x57\xb4\x44\x17\x15\xa5\x05\xc9\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x5b\x94\x1e\x77\x46\xf0\x33\x9a\x04\xe3\xa3\x9f\xb3\x98\xea\xb5\x02\x53\xed\xa8\x40\x64\xff\xad\x9d\x84\xe4\x38\x8b\xc1\xad\x21\x1b\x91\x8c\x4a\x9a\xaa\x1e\xe9\xbb\x0a\x89\x88\x69\x6c\x58\xb6\x25\x3a\xd8\x5d\x4f\x33\x20\x7f\x25\x6f\xcb\x6b\xe9\x91\x6e\xb7\x4b\xae\xdf\x9c\xbd\x39\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x19\x9a\x13\x42\x35\x4c\x40\x92\x5b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x0f\x8b\xc7\xdb\x49\x26\x29\xbd\xbb\xca\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\xc3\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x77\x4c\xfe\x84\xae\x6d\x4a\x32\x90\x11\x70\x4d\x47\x30\x6b\x06\xb0\xf7\xbd\x7c\xf1\x5f\x87\x8e\x1f\x99\x19\x9d\xf5\xe4\x85\xc1\x88\xd7\xf4\xee\x67\x5e\x98\x06\x99\x22\x2f\x7a\xe4\x64\xe6\x65\xf8\x5c\x12\xe5\x09\xda\x5a\xd0\x5d\x5f\x7a\xe5\x60\x4a\xa4\xc8\xd1\x61\x4f\xf2\xac\xaa\xcd\x7e\xf5\xa7\xff\x32\x4a\x1f\x4d\xb3\x04\x8e\x7d\x61\x55\xab\x36\x1b\x19\x46\x0b\xf2\xf5\x8b\xff\xb2\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x73\x42\x32\x2d\x2a\xb4\xca\x2a\xfa\x2b\x4d\xa5\x56\x1d\x82\x5e\xfd\x20\x1c\x6a\xa1\x69\x32\xa3\xe5\xa3\x16\x0e\xb7\x16\x48\xb1\x40\x98\x00\x1a\xaa\xc8\xcb\xaf\x5f\xfc\xd7\xbc\x39\xe5\x0d\x8f\x00\x9f\xc4\x27\x30\xcc\x62\x60\x94\xfb\x1b\x96\x24\x10\x77\xee\x5d\xfe\x30\x97\x7a\x0c\xb2\x43\x80\x2b\x6f\xac\x32\xeb\x9b\x59\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\x2f\x5e\xf2\xfa\xc7\xcd\x0c\xca\xa7\x6f\x86\x9b\x8a\x03\xdd\x2d\xcc\x10\xf3\x4f\x6f\x21\x52\xde\x75\x6f\x42\xb6\x65\x97\x71\xdd\x15\xb2\x6b\xa7\x39\x26\x5a\xe6\xf7\x7b\x0d\x8a\x91\x56\x4e\xc0\x47\x20\x03\x79\xe9\xbc\xcd\xed\xea\x83\x9c\xfc\xed\xcf\x73\x2c\x6e\xf9\x72\xca\x81\x84\xd3\xd1\x8c\x2d\x4f\x7d\xd5\xe2\x36\x73\x6c\xcc\xdb\xcd\xdd\xff\x67\x1e\xbb\x37\x20\x07\xee\xec\x86\xd3\x6e\xe4\x2a\xf4\x78\x74\xd6\x78\x7b\x38\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x01\xe5\x9a\x3b\xe1\x0b\x28\x90\x5d\x47\xe1\x90\xd1\x18\x51\x60\xce\xb9\x5a\x7a\xd0\x13\xa0\x4a\x2f\x02\x45\x7b\xd0\xef\x1f\xab\x93\x00\x66\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5a\x44\xd9\x7b\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x5e\x38\x12\x66\xff\xaa\xf2\xd5\x43\x85\xcd\x78\x23\xe7\x36\xa2\xb5\x7b\xb4\x14\x1c\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8c\x14\x9d\x82\xa6\xab\x13\x45\x66\x47\x95\x68\x5f\x69\xca\x63\x2a\x63\xb7\xca\xfd\x7d\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\x74\xef\xe6\xcf\xaa\xc7\xc4\x51\x24\xd2\x34\xe7\x4c\x4f\x8f\xd0\x81\xc6\x06\xb9\x16\x52\x1d\xc5\x30\x81\xe4\x48\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x44\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\x3f\xf8\x17\x3d\xb0\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x86\x8b\x5b\xde\x45\x4d\x56\x6d\x74\x9a\xd6\x8b\x62\xf0\x63\x06\xde\x9b\x04\x2e\x64\x22\x7e\xf0\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x03\xef\xc5\x36\xb6\xdd\x6e\x11\x18\xb0\x4e\xd4\xba\x1d\xdb\x69\x43\x34\xd2\x6c\x02\x5b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x57\x86\x99\x5f\x1b\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x63\x94\x4f\xe7\xb9\x36\x12\xff\x0d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\x9b\x59\xe6\xb6\x67\x97\x25\x37\xdd\x37\x7f\xdc\x64\xeb\x86\xd8\x8a\x61\x43\x2b\x7b\x35\x82\x62\x58\xce\x12\x70\xdb\xb3\xaf\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\xf3\xa0\x16\x8f\x2d\x5d\x21\xdb\xfb\x1b\x08\x62\xd0\xc9\x56\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\xd3\xa4\x7c\x2c\xa1\x21\x5c\x5b\x9a\x56\xb7\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\xcf\x50\xfa\xbc\x0a\xdf\x75\x31\xe2\x22\xfc\x7c\x7e\x07\x51\xbe\x6e\x36\xf9\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x9c\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\x09\x30\x92\xa4\x86\xc6\xf8\x44\x98\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x16\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x52\x29\xa3\x5a\xd9\x4a\x7c\x10\xb2\x1a\x5c\x2a\x4f\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x0e\x3b\xa4\x48\x36\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x7b\xf6\xe3\xf6\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\x1d\x42\x62\x90\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x6f\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xd3\x1b\x87\x63\xe4\x05\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xfd\xa5\x15\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x61\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x03\x05\x29\x75\xaa\x11\x4a\xe4\x07\x6d\xcf\xf1\xab\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x22\x51\x4e\x0b\xa6\xfa\x41\x9b\x69\x5e\x2d\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\x4b\x13\x60\xd8\x97\xb7\xc3\x7c\x9c\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xad\x5d\xf8\x11\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\x3f\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x72\x24\xf6\x1a\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xb2\xfb\xf2\xc5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x98\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xe6\xed\xb6\xee\x31\xd2\x10\x4f\xa8\xcd\x07\x66\x15\xa8\x3c\x49\x0c\x7a\x5b\x8f\xd9\x3c\x08\x16\x78\xb2\x16\x64\xdb\x58\x37\x6b\x5a\xca\xba\xc1\x7b\xae\x45\x26\x12\x31\x9a\x96\x77\xd0\x76\x75\x29\x95\xb7\xa1\x44\xe5\x03\x27\x02\x9a\x43\x74\x39\xb3\xe5\xad\x2f\x64\xe9\x68\x7d\x21\x73\xa3\xb5\x0f\xcc\x8e\xd6\x3e\xb0\xc1\x68\xed\x03\x0b\x46\x6b\x1f\x98\x1f\xad\x7d\xa0\xb5\x0f\xd4\x19\xcf\xdf\x3e\x40\x5a\x5f\xc8\xb2\xd1\xca\x3a\xc5\x68\x65\x9d\xf5\x47\x2b\xeb\xcc\x8f\x56\xd6\x69\x65\x9d\x56\xd6\x69\x65\x9d\x6d\x47\x0d\xe4\xce\x44\xdc\x78\x8a\x4c\x26\xe2\x15\x19\x32\xd6\x5e\x1d\x89\x6e\x22\xa2\x50\x59\xc4\x3c\xe2\x3c\x1f\x8a\xa6\xd6\x84\xde\x21\xff\x11\x1c\x6c\x7a\x82\x2d\x59\x9b\x02\x11\xd8\x04\x22\x13\xf1\x81\x3a\xdc\x22\xf0\xbc\xcd\xb0\x69\x33\x6c\x3e\x81\x0c\x9b\x31\x55\xae\xf0\x11\x92\xd6\xe5\x09\x37\xa5\xe3\x7f\x0d\x32\xfd\x64\xf3\x6d\x0c\xc2\x39\x84\xc1\x3e\x73\x05\x52\x58\xd8\xc5\xce\xb7\x0b\x71\xbf\x0a\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x76\x2d\x92\x09\x32\x64\xae\xfe\xd7\x0c\xfe\x3a\x08\x3f\xf1\xbc\x99\x2a\x24\x9e\x74\xf2\x4c\xf5\x53\x1a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xe4\x52\x69\x9a\xd1\x4a\xbb\x44\x3b\x77\xda\x4f\xb5\xf4\xd2\xa6\x94\x48\x54\xf2\xae\x36\x2a\x73\xbc\x7c\x2c\x2c\x4e\xfb\xef\x1c\xe4\x94\x88\x09\xc8\x42\x31\x0a\xdd\x79\x3a\xa1\xc9\x4c\x44\x5d\x01\xe4\x66\x0c\x3c\x8d\x98\x22\x9a\xd4\xd4\x9b\xf6\x1a\x92\x1d\xab\x7e\xbc\x7c\x34\xab\x38\x34\xa8\x36\x3c\xb5\x5a\xca\xcb\x47\xa3\xe6\x37\xd2\xb0\x09\x8e\x34\x68\x86\x23\xcd\x9a\xe2\x48\xe3\xe6\x38\xd2\xa4\x49\x8e\x7c\xf4\x0a\xd0\xcb\x47\xc3\xe6\x23\xd2\xb8\x95\x8e\x3c\xc1\x7a\xd2\xcb\xc7\x03\x80\xbb\x49\x8b\x1d\x69\xab\x53\xd7\x1e\x4d\x1b\xd4\x48\xd3\x46\x35\xd2\x34\x1e\x6e\x55\x05\x7b\xf9\x68\xeb\x63\x3f\x80\x9c\xd6\x98\x10\x51\xb7\xa6\xf6\x7d\x0b\x6d\x00\x27\x43\xef\xde\x8f\xa5\x00\x59\x2e\x5d\x34\x8c\x35\xef\x2e\xf5\xea\xc2\x50\xcd\x72\x63\x53\x1f\xb7\x8a\x18\x8d\xbf\xc7\xde\xe0\x95\xf3\x52\xf1\xb8\xd2\x64\x73\xad\x63\x0a\xd3\x59\x68\x1e\x63\x94\x82\xa2\xe9\x54\xe9\x61\xbc\xb7\x67\xc3\x49\x0b\x69\x82\xc7\xb3\x01\xa6\xc5\x13\xa8\x5f\xd8\x76\xb6\x7b\xde\x8e\xbd\xaf\x8a\x3b\xf6\x7a\xe5\xce\xb7\x6e\xc6\x83\xff\xf9\xdf\xc3\x4a\xf5\x96\x62\xc2\x56\xfb\x5b\x7b\xb4\xda\x5f\xad\xd1\x6a\x7f\x4b\x47\xab\xfd\xd5\x18\xad\xf6\xb7\xde\x68\xb5\xbf\xe5\xa3\xd5\xfe\x5a\xed\x6f\x8b\xd1\x6a\x7f\xad\xf6\xb7\xed\xf8\x84\xb5\xbf\x66\xa3\x9a\xcb\xba\x98\x0b\x12\x41\xf9\x51\x53\xcd\xa2\x22\xe2\xd9\xdf\x65\xff\xd5\xac\x0e\x58\xd6\xef\x16\x6b\x80\x65\x2d\x71\x4e\x0b\xee\xdd\xa3\xee\x05\x85\x70\xee\xc9\xd5\x9a\xe0\x73\x8b\xdc\x6e\x0c\x13\x4b\x2e\xe1\x46\x51\xf1\xda\x07\x96\x15\x8d\xd7\x43\xd4\x59\x4c\x0e\xbc\x2f\x1e\x1b\xa9\x70\xa1\xab\x17\xb9\x66\xdd\xe2\x8e\xe0\x9d\xc7\xa0\x9a\x4a\x3e\x7f\xc5\x85\x1c\x62\xd8\x42\x7c\x54\x81\x3d\x86\x3c\x82\xac\xac\x01\x1b\xd7\x0e\x19\xb7\x91\x8e\xbe\xe9\x8f\xe0\x3e\x68\xca\xd2\x53\xa4\x80\x1e\xcf\xad\xe8\x8b\xeb\x41\xf9\xb7\x80\x5d\x29\xca\x87\xe2\x21\xa3\xdc\x25\xc3\x0a\xee\xbb\xd2\xdb\x4e\xf3\x85\xbc\x1c\x7a\xa9\x84\xb7\xf7\xc8\x39\x62\x7d\x79\x62\xa6\x10\x3e\xd4\xf6\x3f\x69\x06\x91\x77\xab\x70\xc3\xed\xc6\x85\x1b\x66\x22\x46\xda\xba\x0d\x6d\xdd\x86\x5a\x75\x1b\xf0\xa2\x3d\xdc\x8d\x17\x70\x20\xff\x70\xed\x91\x24\x20\xa8\xd2\x3c\xd1\x2c\x2b\x22\xb0\x95\x7d\x55\x62\x35\x89\xa1\x8b\x04\xad\xe2\xbb\x79\x1b\x8d\xc6\xb3\x78\x8f\xf3\x61\xc4\xb6\x42\x72\xe2\xa2\x2d\xb1\x99\x11\x56\x1c\xf0\x6a\x87\x0d\x29\x65\x4f\x3f\x52\xf0\x0c\x09\xb6\x2a\xb4\x66\xdb\x6b\xcb\xd0\xf9\xc4\xa0\x84\xa1\xd8\x2b\x18\x44\xb9\xa1\x05\x46\xad\xb2\x09\xf0\x82\x4b\x1c\xa8\xc3\x43\x2f\x0d\x35\xca\xbd\x1e\x84\xfb\x7c\x5b\xe2\x12\x7f\x5b\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\x4f\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x1e\x3d\xa2\xed\x53\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x9e\x87\xdf\xa2\x4d\x18\x5d\x7f\x3c\x85\x84\xd1\x47\xf2\x4d\x3c\x9d\xbc\xd1\x27\xeb\x8f\x78\x2a\x79\xa3\xad\x0f\x62\xa3\xf1\x5c\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8c\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xcc\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x98\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x01\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4c\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\xb3\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x27\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\xf7\x8f\x4f\xbe\x1a\x5d\x25\x96\xee\xf1\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x79\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\xb3\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x89\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\x57\x20\x27\x2c\x82\x93\x28\x32\x7f\x5d\x8b\x1b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xdb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\xaf\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x4b\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7d\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\x2f\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x9f\x1f\xfc\x72\xf2\xf6\xd7\xcb\x93\xd7\xe7\x87\x28\x81\xc2\x5d\x46\xb9\x39\x15\xb9\x2a\x02\x45\xdd\xeb\xcc\x8b\x80\x4f\x98\x14\xdc\xac\x0f\x75\x35\x4a\x26\x7e\xd6\x28\x1c\x06\x09\x4a\x24\x13\x88\xad\x9c\x1c\xde\xe6\xb9\x0e\xe3\x59\xae\xbd\xee\x88\xe1\x8b\xe6\x00\xf1\x68\x4c\xf9\xc8\xac\xf3\x4c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\x4a\x4e\xd4\x63\xed\xe7\x1d\xcf\x29\x0c\xad\x57\xb6\x24\xa2\x8a\x68\xe6\xd7\x5c\xfe\x2c\x35\xe5\x9a\xde\x1d\xdb\xf8\xbd\xbd\xcf\x4b\x97\xf6\x7c\x39\x49\x61\x5e\x61\xf9\x8d\x5d\x55\x82\x95\x0c\x13\xb2\x57\xbe\xbb\x47\xce\xcd\x3b\x20\x2e\x03\xd0\x86\x5f\xc2\x04\x24\x6a\x9e\x0e\x7c\x1d\x22\x61\x44\x65\x9c\x80\xc2\xc0\x43\x4f\x9b\xad\x76\xe0\x00\x06\x41\xaf\xe5\x42\x2f\x22\x26\xe4\xb5\xc0\x20\xc4\xa1\x38\x26\x63\xad\x33\x75\x7c\x74\x74\x93\x0f\x40\x72\xd0\xa0\x7a\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x1b\x75\xc4\xb8\x39\x5c\xdd\x98\x6a\xda\x2d\x9d\xea\x23\xcb\xb9\xbb\x91\x48\x53\xca\xe3\x2e\x75\xd8\xd5\x0d\xdb\x7a\xf4\x07\xc7\x53\xbb\x34\xdc\xc5\x78\x97\x76\xd5\x18\x92\x64\x7f\x0b\x7c\xae\x27\xf3\xd5\x90\xf5\x6a\xc9\x78\xee\xdb\xeb\x1f\xe0\xf3\x70\x5e\x2d\x0c\x7a\xe4\x52\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\x97\x1e\xe9\xf3\xcb\xeb\xb7\xff\xec\xbf\xb9\xb8\xbc\x6e\x4f\x76\x7b\xb2\xdb\x93\x5d\xe3\x64\x03\x9f\xd4\x3e\xd5\x5e\xe6\x2c\x1d\x93\xb0\xdf\xc8\xa9\x15\x68\x7f\x0c\xc2\x06\xd4\x96\x10\xed\x78\x34\xa8\x57\x20\x70\xce\x27\xbf\xd0\xaa\x85\x9d\x2f\x04\x07\x71\x37\x58\x41\x39\xc8\xe0\x75\xe2\xe3\x6b\x58\xb3\xea\xba\xaf\xb6\x92\x22\xed\xa8\xef\x5a\x32\xaf\xde\xde\xd0\x50\xd9\xbe\x4b\x9a\x16\x15\xaa\x17\xec\x5a\x8f\xbc\xf6\x6a\x0f\x39\xfd\xf5\xe2\xec\xfc\xf2\xfa\xe2\xfb\x8b\xf3\xb7\xdb\xeb\xd1\x0d\x58\x5c\xd0\xa6\xd0\x10\x00\xf6\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xc1\x0a\xb2\x98\x08\xcc\x9e\x7e\xe7\xf7\x9d\x06\x7d\x7c\xe1\x63\x2d\xb3\x6d\x96\xd9\x9e\xc1\x90\xe6\x89\xd5\x9e\xf6\xf6\x7a\xdb\x70\x39\x3b\x9a\x42\xdf\xef\xa5\xa8\x51\x81\xb9\x82\xc2\x57\xb6\x76\xfb\x50\xc8\xa5\xc7\x78\xdf\x45\x1f\x54\x58\x8f\x13\x1e\xad\x85\xce\x49\x8f\xd6\x49\x56\x13\x3a\x35\xbd\x0c\xcd\xf8\xde\x23\xc1\x87\x6c\xf4\x9a\x66\x3f\xc1\xf4\x2d\x0c\xeb\x99\x89\xab\xf0\x46\xeb\xa3\x73\x25\xa3\xad\xd2\xb0\x33\xfb\xb2\x7a\x6e\x9a\xc6\x9c\x34\x4d\x45\x67\xd4\x8f\xcc\x68\x2e\x90\xa2\x91\x20\x8a\xb9\x7a\xf8\xd6\x0e\xed\x2c\xca\x4d\xc5\xd8\x34\xe2\xb9\xaf\xc7\xe5\xfd\xa8\x32\xbb\x32\xbb\x77\x74\x56\xaf\xab\x76\x44\x82\x47\x90\x69\x75\x24\x26\x86\x73\xc1\xed\xd1\xad\x90\x37\x46\x8f\x30\xba\x6b\xd7\x62\xad\x3a\x42\x9f\xc1\xd1\x1f\xac\x1b\xec\xfa\xcd\xd9\x9b\x63\x72\x12\xc7\xae\xb9\x49\xae\x60\x98\x27\xae\x9d\x40\x8f\xd0\x8c\xfd\x02\x52\x31\xc1\x3b\xe4\x86\xf1\xb8\x43\x72\x16\x7f\xb7\x3d\x71\xf6\xa3\xc1\x5d\x10\x99\x75\x75\x36\xbc\x13\x57\xe8\x63\x99\x56\x78\x57\x20\x22\x86\x6b\x31\xad\x10\x37\xbd\xd5\xd9\x09\x19\x0d\x81\x66\x73\x13\xfd\xec\xc0\x2d\x6c\x96\xae\xee\x17\x84\xd5\xba\x38\x1d\xa2\x66\x22\x3e\x26\x2a\xcf\x32\x21\xb5\x22\x29\x68\x6a\x94\xde\x9e\xc1\xb0\x4e\xf5\x4f\xf4\x55\x75\xc8\x6f\xe1\x47\x74\x38\xa9\x77\xfb\xfb\xdf\xfe\x74\xfe\xcf\xbf\xed\xef\x7f\xf8\xad\x7c\x15\x59\xa1\x8d\x02\xaa\xde\xa2\x32\x88\x7a\x5c\xc4\x70\x89\xef\xc0\x3f\x55\xc5\xcd\xe2\x2e\x68\xaa\x73\xd5\x1b\x0b\xa5\x2f\xfa\xe1\xcf\x4c\xc4\xb3\x7f\xa9\x1a\x12\x07\xd9\x4d\xc6\x80\x5b\xd4\xa7\x7a\xbc\x23\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xb9\x89\x4e\x4a\xf1\x9f\xdf\x7b\x10\x18\xe9\xe9\x56\x32\xad\xd1\xf5\xe6\x52\xc1\xc5\xb0\x63\x4e\x6d\x21\x76\x4e\x5e\xd6\xae\x8f\xd2\x28\x69\x0b\x3b\xd8\x30\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\x3b\xef\x62\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\xa7\xf7\x7e\xff\xa0\x34\x2e\x34\x5d\x72\xa0\x0a\x1a\xe2\xb1\x0d\x0a\x0a\x49\xc6\x24\x61\x29\x73\xb1\x86\xae\x41\x93\x22\x07\xf6\xc7\x5e\x94\xe5\x1d\x77\x43\x2f\x85\x54\xc8\x69\xf8\x13\xb2\x31\xa4\x46\xd3\xea\x2a\x2d\x24\x1d\x41\x27\x3c\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x85\xab\xd4\x51\x64\x88\x9f\x1f\x6d\xf3\xa0\xdf\x11\xd2\x16\x30\xe3\xf2\x01\x44\xc2\x60\x89\xb3\x02\x67\x80\x22\xea\x93\x13\x91\xe4\x29\xa8\x4e\x10\x83\xac\x35\x80\x4f\x8c\x66\xa9\x76\x4a\x50\x8b\xd9\x84\xa9\x26\xc2\x88\x17\xc8\x69\xcc\x45\xe4\x8b\x5c\x67\xb9\x76\xf5\x66\x4a\x8d\xdd\x84\x42\xbb\x45\x28\x0a\x50\x21\xfb\x2f\xf7\xea\x47\xa3\x53\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\x6b\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xae\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\x3e\x37\x3e\xf7\x29\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x06\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xd6\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x06\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x79\x05\x20\x18\x44\xbc\xf2\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x8f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\x93\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x35\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xd5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x80\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd2\x54\x1b\xac\xbe\x02\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\x6f\x38\x12\x8d\x93\xe4\x96\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\x6e\x99\x5a\xa8\xac\xd4\x46\x9c\x3f\xe0\x4c\x86\x56\xd9\xbf\x3f\xfa\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\x95\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x28\x92\x73\xcd\x12\xbb\x18\x21\x6e\x48\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\x0f\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\x77\x10\x35\x96\xe7\x7f\x7e\x07\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x06\x9e\x51\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xef\xfb\x1d\x02\x3a\x3a\x24\xb7\x82\xef\x6b\x5c\x7e\x8f\x5c\x0b\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcb\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x63\xda\xc5\xab\x19\x92\xf1\x02\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x0f\x48\x81\x39\x88\xdc\x5d\x79\x76\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x01\x9a\x6b\xe2\xf3\xe3\xf5\x75\xff\x07\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\x7f\x8a\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x04\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x9e\x1d\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xc3\x94\xbe\xfc\x18\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\x7f\xfa\xd3\xd7\x7f\xea\xd9\xe9\x43\x94\x02\x27\x17\x27\x97\x27\xbf\x5e\xfd\x72\x8a\xc9\xb1\x75\xa1\xda\x50\x08\x66\xd3\x01\x98\x8d\x86\x5f\x3e\x68\xf0\x25\xa6\x7c\xd4\xa6\x22\x55\xdb\x3f\x4e\x69\x30\xc0\xe8\x6d\x46\xe3\x74\xb2\x5f\xa9\x58\x99\x91\x35\xab\x86\x54\x73\xd4\x76\xe2\x8c\xe9\x28\xbb\x12\xd1\x4d\x83\x7a\xcd\x19\x64\x12\x22\x6b\x27\xbb\x3e\xed\xdb\xd9\x8d\x7e\x79\xf9\xe6\xba\x48\x35\xc0\x78\x1c\xf2\xca\xdb\x97\x7e\x74\x96\x34\xa3\x93\xde\x40\xa6\x83\xea\x3e\xa0\xd1\xcd\x2d\x95\x31\x5a\xb6\xa8\x66\x03\x96\x30\x5b\xfc\xd7\x37\x85\xe4\xc2\x06\xfc\xd9\x22\x67\x62\x38\x5b\x5a\xb3\x30\x87\xa2\xc9\xca\xc6\xd1\x0c\x29\x4b\xd0\x82\x9a\x73\xcd\x52\x70\x11\x41\x51\x16\x4c\x7a\x65\x9b\x76\xab\x7c\xf9\xb1\xb3\xca\xd7\xfe\x1b\xef\xd5\xdb\x58\x0f\xab\x1b\x97\xb8\xc3\xac\xce\xb1\x38\x9b\x10\xd2\xb2\xba\x4f\x82\xd5\x65\x12\xae\xb4\xc8\x1a\xf2\x92\xd8\xc9\x96\xf8\x48\x06\x30\x14\x86\x08\x2f\x75\x7a\xf8\x1e\xc1\x1c\x93\x03\xbd\x55\x4b\x54\x1c\x1b\x36\x22\x53\xe5\xd1\xd8\x1b\x28\x39\x28\x75\x84\xee\x90\x3c\xb3\x5a\x2b\x92\xeb\x5c\x42\xc7\x7c\x1d\xa4\xb8\xba\x4e\x91\xe5\x60\x5e\x0f\xdc\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\xc2\xa0\x6e\xf9\xb3\x6e\x94\x48\x52\x35\x06\x2c\x2f\x02\x77\xcc\x77\x43\xe9\x8b\x78\x7f\xbf\xf8\x14\xc3\x58\x46\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x5b\x4e\x06\x30\x62\x5c\x79\x50\x98\xb9\x3d\xcc\xd0\x1f\xc3\x54\x28\x0c\xd7\x23\x6f\x2b\xc5\x4e\x5c\x1a\x52\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x55\x6a\x99\x1c\x20\xec\xc3\x63\xf5\x1a\x4b\x3e\xc8\x39\xbe\x39\x86\x84\x4e\x6d\xb4\xe9\x90\x71\x9a\xb0\xff\x80\x54\x87\x0d\x78\x9c\x0c\x08\x8b\x6b\x4b\xd7\x81\xa5\xfa\x69\x34\xae\xe7\xfc\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x9c\xb6\x3e\x3a\x15\x58\xe4\xfc\x44\xe5\xa6\x71\xe1\x55\xa5\x3e\x71\xa5\xb2\x20\x3e\x15\xc7\x79\x84\x0a\x3f\xd3\xc2\x7c\xa9\x4d\x5d\x15\x3e\xc9\x50\x1d\x65\xc2\xfe\x5f\xe1\xa8\x28\x79\x28\xac\xc2\xbb\x7d\xce\xda\xa3\x65\x63\xd5\x71\x4b\x7c\x1c\x97\xc4\x8e\xf8\x6f\x1a\x70\x43\xb4\x2e\x88\x67\xe7\x82\x78\x3e\x5d\x73\x9d\x67\xfe\x7a\x2c\x41\x8d\x45\xb2\x35\xa2\x57\x90\xfc\x35\xe3\x2c\xcd\x53\x83\x73\xca\xe0\x33\x9b\x84\x10\x00\x15\xd0\xd5\x52\x6c\x6b\x45\x34\x37\xb2\x18\xb0\xd8\x29\x65\x89\xd9\x46\xcc\xdf\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xb6\x52\x2b\x6b\x38\x5f\xf7\xc2\x9b\x42\xeb\x8c\x97\xf5\xe8\x4d\x3d\x26\x6e\xcb\x91\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\x7f\x78\xdb\x3f\x2d\xb7\xc9\xe6\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\xd8\xc7\x9b\x8c\xb0\xe6\x9a\xf1\x63\x33\xf7\x01\x68\x5a\xd2\x6d\x9c\x5a\xa0\x08\x70\x3a\x48\xcc\x73\xe6\xa9\xc0\x91\xfb\x96\xef\x02\xd5\xb9\x04\x32\xa2\xfa\x31\x09\x7e\x7d\x15\xa6\x96\xfa\xd2\x04\xbf\xa9\x2b\xa1\x57\x6d\x70\x46\x0e\xaf\x5a\xa1\x46\x88\x17\xb6\x82\xfe\xda\x72\x78\x6d\x4a\x59\x5f\x36\xae\x7f\xb4\x08\x96\xb8\xc1\x0f\x6f\x0c\xc0\x7b\xae\xe5\xb3\x67\xe7\x65\x25\xc8\x77\x95\xd2\x82\x64\x09\x2d\xfa\x42\xe1\x0e\xfc\x88\x3c\xe8\x74\x0c\xd1\xcd\x5b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\x79\xcf\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xc7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6a\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x40\x51\xe6\x87\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x31\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xc7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x07\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x82\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x8a\x5b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xec\x88\x06\x56\xa5\x1e\xde\x0a\xec\x5e\x74\xbf\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x65\x51\x4e\xf9\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\xcf\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\x73\x9f\xd5\xf8\xfa\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x8f\x14\x9b\xb2\x83\x82\xee\x13\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x07\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xc3\x92\xc4\x4d\xd3\x23\x57\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf8\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x96\x1f\x6e\xe4\x75\x45\x47\xeb\xf5\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x71\x3b\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xed\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x73\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x89\x4f\xc1\xcb\x3c\xb5\x2a\x02\x0a\x5c\x18\x3e\x7f\xf6\xe6\xfc\x0a\xc3\xf2\x33\x69\x2b\x85\x60\x1c\x17\x5e\xc7\x99\x06\x60\x9e\x70\x9d\x7b\x7b\xe4\x84\x4f\xed\x45\x7b\xa6\x98\x22\x09\x53\x1a\x90\xeb\x39\xb1\xcd\xfb\xaf\xf7\x5e\xf4\xf0\x7f\x7b\x84\xc6\xb1\x34\x72\x5d\x08\x4f\x8b\xe6\xe2\x45\xad\xe4\xc7\x06\x49\xe9\x03\x38\x68\x1b\x8d\xf6\x5a\xc4\x6e\xe5\xc8\x49\xd0\x77\x65\xd9\xa0\xd2\x92\x6a\x18\xb1\x88\xa4\x20\x47\x40\x32\xaa\xa3\x31\x49\xe9\x94\x44\x42\xca\x3c\xb3\x75\xfe\x63\xaa\x69\x8f\x7c\x2f\x24\x49\xfd\x21\x36\x38\x6f\xf8\xf0\xd5\x62\x9f\x7e\x71\xb2\xcb\xff\x64\x4a\xe5\xa0\x8e\x5e\xbe\xf8\xf3\x57\x7f\xfa\xd3\xb3\x6a\x0d\x57\x84\x0b\x99\xbd\x2d\xb5\x86\xa3\x7e\x17\xec\xae\xdb\x56\x81\x8c\x8f\x92\x32\x7e\x6d\xc7\x00\xea\x6a\x99\x75\x75\xcc\x6e\xf1\x05\xfd\x6d\x55\xcd\x46\x5a\xd4\x15\x6b\x68\xa8\xb1\x53\xc1\x07\xbd\x62\xe5\x68\x83\x28\xf7\xea\xbd\xe8\xfb\x83\xe9\xe4\x9c\x74\xa6\xc1\x6b\x56\x44\x27\x75\xc8\x0b\xf2\x2d\xb9\x23\xdf\xa2\xa2\xf5\x4d\xdd\x36\x58\x75\x55\xa0\x26\x82\x8d\x8c\x7e\x7f\xd1\x6f\x08\xe2\xff\x30\x44\xd3\xcc\x68\xa0\xaa\x05\x19\x30\x27\xd8\xc3\x9d\x06\x69\x04\x4d\xb7\x13\x8f\xda\x40\xcc\x2c\xf0\x23\xa2\x99\x75\x3c\x5c\x0c\xab\x01\x4e\x9b\x21\x9a\x79\xfc\x47\xa1\xf4\xa5\xa3\x42\xd5\x56\x38\xc5\x6c\x29\x12\xfe\x0a\x19\x33\x7c\x43\xe9\xe2\x80\x29\x12\x0b\x8c\xb7\xb2\x81\xcc\x63\x56\x23\x8c\x62\x77\xd0\xb8\x9e\x67\xbd\xb2\x9f\xab\x76\x6a\xc6\x94\x82\x3a\x90\x13\xb1\x4a\x35\xb2\x32\x11\x3b\xe9\xcc\x2c\x2b\x2e\xf1\x8c\x15\xe2\x99\xb3\xda\x04\x7b\x33\xe2\x92\x39\x4f\x11\xe5\x36\x95\x64\x08\x52\xda\xd8\xf3\xc1\xd4\x87\xed\xd5\xde\xbc\x5a\x27\x29\x93\x42\x8b\x48\xd4\xe8\x71\x56\xf5\x76\xbb\xe9\x10\x08\x36\xde\xd7\x1b\xcc\x7f\x3e\xeb\x77\xc8\xf5\x69\x1f\xfb\x3e\x5d\x9d\x5e\xf7\xab\x3a\xcb\xde\xf5\x69\x7f\xef\x51\x41\x41\xbc\xc0\x87\x26\xea\x2d\x26\xa9\x98\xa0\x8c\x34\xd9\x4d\x69\xd6\xbd\x81\xe9\x96\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x78\x36\x09\x34\x66\x1f\x29\x9f\xcb\x07\xc4\x86\x77\x2e\x4e\xec\x4a\xc5\x04\x62\x2b\xa5\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbd\x36\x7f\xba\xcd\xf6\x5a\x7b\xb4\xd9\x5e\x6d\xb6\xd7\xfc\xd8\x99\x90\xd6\x36\xdb\xeb\x79\x79\xf0\xdb\x6c\xaf\x4f\x3c\x08\xa0\xcd\xf6\x5a\x3c\xda\x6c\xaf\x36\xdb\x6b\xbd\xd1\x66\x7b\x6d\x3e\x76\x2e\x7c\xa9\xcd\xf6\xda\x68\xb4\xd9\x5e\xf3\xa3\xcd\xf6\x5a\x32\xda\x6c\xaf\x25\xa3\xcd\xf6\x6a\xb3\xbd\xda\x6c\xaf\x36\x08\xf6\xde\xb9\x76\x33\x08\x96\xb4\xd9\x5e\x6e\xb4\xd9\x5e\xcf\x22\xd4\x8f\xb4\xd9\x5e\x6b\x8d\x36\xdb\xab\xcd\xf6\xda\x66\xb4\xd9\x5e\xcf\xc5\x5c\xd2\x66\x7b\xb5\xd9\x5e\x9f\x8e\xa0\xdb\x66\x7b\xb5\xd9\x5e\x6d\xb6\x57\x9b\xed\xb5\x72\x15\x6d\xb6\xd7\x73\x50\x01\x7d\x47\xe0\xfa\xd9\x4b\xfb\xa7\x22\xcd\x72\x0d\xe4\xad\x9f\x32\x48\x91\x96\x30\x30\x55\x96\x08\xea\x87\x10\x46\x82\x0f\xd9\xc8\x51\xf6\x23\xdb\x86\xb7\x1b\xbe\xa7\x5b\x6a\x7d\xfb\x04\xe3\x07\x13\x96\xb2\xed\x52\xca\xc8\xdc\xc6\xbc\xc2\xb9\x4a\x7e\x19\x73\x92\x52\x7a\x87\x47\x84\xa6\x22\xb7\xad\x8b\x23\xb7\x7f\x01\x84\xd6\x7b\xb5\x73\x3b\x43\x9a\x51\x71\x68\xec\xe3\xea\xfa\x4d\x84\x95\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x91\xb8\x39\x81\xb8\x21\x71\xf8\x41\x84\x61\xe7\xd0\x6d\xe8\x2c\xba\x60\x94\xb9\xd3\xe8\x18\xd6\xaa\xd3\xe8\xa9\x29\x8a\x79\x61\x1e\xa6\x88\x48\x99\x36\xc2\xa1\x91\x07\x69\x39\x9c\x95\xe9\x8a\x52\xea\xe8\x00\x06\x74\x53\x6d\x1b\xad\x87\x50\xd0\x52\x10\x8b\xf0\x92\x9f\xeb\x44\xcf\xd2\x2c\xc1\x06\xe7\x78\x9e\xbb\x3e\x96\x05\x99\x6b\x4b\x1b\xee\x1f\x2d\x6d\x78\x8e\xb4\x41\x41\x94\x4b\xa6\xa7\xa7\x82\x6b\xb8\xdb\xca\xc2\x52\x25\x0d\x57\xd5\x09\x5d\xcc\x98\x72\xb1\x6e\xf6\x1a\x11\x99\x8d\xfb\x9e\x49\xac\x1f\x8b\x3c\x89\x31\x99\x23\xe7\xa8\x60\xda\x2c\x3d\xd0\x56\xfb\x43\xbd\x07\x43\xb9\x67\x5f\xe2\xf5\x39\xab\x66\xfe\x3b\x67\x13\x9a\x18\x6d\xb7\x78\xa2\x8f\x1a\x4c\xf9\xa1\x75\xcf\xbc\xa6\xea\xa6\x38\xf0\xd0\x35\x32\x74\x58\xf3\x91\xff\x24\xfc\x09\xee\xf4\x53\x94\xd2\x50\x40\xea\x4b\x36\x61\x09\x8c\xe0\x5c\x45\x34\x41\xba\xd6\x0c\xaf\x38\x59\x32\x3b\x6e\xbc\x14\x89\x22\xb7\x63\x30\xb4\x9a\x50\x6f\x02\xc0\x0c\xbb\x11\x65\xdc\xe6\xc5\x67\xfe\x61\x65\x6d\x09\x86\xfc\x67\x54\x9a\x0d\x0e\x36\x03\x54\x91\x07\x42\x24\x2e\xe3\x21\x99\x16\xf3\xbb\xdc\x1f\x2e\x7e\xe5\x70\xfb\xab\x99\x4d\x91\x61\x42\x47\xc1\x54\xa0\x40\xcf\x59\xfb\x8a\xa9\x97\x7e\x00\xa6\x13\xe4\x40\x68\x72\x4b\xa7\xaa\x30\x9c\x94\x2a\x40\xa8\x63\xf2\xf2\x10\xd1\x99\x2a\x12\xe6\x88\xc9\x57\x87\xe8\xfe\x3b\x3d\xe9\xff\x7a\xf5\xcf\xab\x5f\x4f\xce\x5e\x5f\x5c\x92\x4b\xa1\xc1\x32\xb5\x52\x9b\xc0\x28\x68\x18\x66\x95\xf8\x0e\xd4\xd2\x85\xea\xa1\xed\x92\x29\x72\xcb\x78\x2c\x6e\xd5\xd6\x36\x5a\x8b\x7e\x06\x78\x40\xf9\x56\x73\x44\x34\xa3\xd8\xfd\xb0\x06\x87\x99\x8b\x30\x29\x4f\x8a\x3c\x3c\x8e\x8f\x62\x29\x32\x0b\x04\x6f\xe4\x2a\x58\x6d\x55\x8d\x2e\xc7\xb0\xe2\xfe\x0e\xab\x13\x8e\x24\xe5\xba\xb0\xf6\x14\x7b\xe6\xda\x2e\xf6\x6a\x6f\xc7\xd3\xce\x68\xa2\x71\x73\xd9\x4c\x27\x71\x0c\x71\x05\xfc\xcf\x2e\x72\xf0\xd4\x7f\xdc\xb4\xa8\x52\x41\xfa\x6f\xae\x2e\xfe\x7f\x33\x78\x3c\xcd\xea\x05\x4a\x35\x93\x19\x2b\x45\xd6\xd8\xee\xbe\x75\x99\x97\xed\xfe\xee\xc4\xfe\x06\x6e\xd9\x8c\x7b\xfe\x6d\xce\xab\x25\x8d\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x36\x35\xae\xc3\x1b\x8d\x1c\xf1\xda\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x8e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x0d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xda\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x91\x77\xbd\xc6\x21\x34\x40\x79\xc3\x93\xe9\x5b\x21\xf4\xf7\x21\x8d\xb6\x11\x0c\xf8\x87\x93\x96\xab\xa6\x68\x14\x27\x29\xbe\xb7\x8b\xbb\x81\x87\xaa\x9c\xc1\x7b\x56\xec\xf8\x53\x3f\x52\x32\xe7\x27\xea\x07\x29\xf2\xad\x99\xd8\x9c\xb0\xf9\xc3\xc5\x19\x92\xa2\xdc\xb9\x2a\xb9\x96\x53\x2c\x1d\x30\x5f\xff\x2d\x28\x06\x3f\x3b\x67\x6b\xf9\x4c\x14\x7e\x31\xf2\x9a\x4e\x09\x4d\x94\xf0\xb0\x64\x7c\xa1\x16\xea\x54\x5c\x73\x79\x20\xf4\x78\x4e\xb7\x35\x07\x6a\xfe\xb9\x4e\xc9\x73\x59\x14\xa4\x63\x7c\xee\x71\x4d\x6f\x40\x91\x4c\x42\x04\x31\xf0\xe8\xb1\xb7\xfd\xb1\x1d\x7e\x88\x3a\x97\x82\x9b\x83\xd9\x08\xf2\x5c\x04\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe5\x03\x48\x0c\xe4\x8d\x4a\xea\x7a\xc6\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbe\xa7\x8a\xfc\x7c\x71\x46\x5e\x90\x03\xf3\xae\x43\xc4\x1f\x6c\x29\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\xfb\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x37\x71\xfd\x71\x29\xd4\xcf\x0a\x64\x63\x04\xea\xe7\x2d\x08\x54\x59\x8c\x32\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\x70\xf9\x1b\x76\x76\x4b\x3f\x6d\xf2\xa5\xe0\x15\xe3\xf9\x9d\x0d\x3c\x6a\xce\xd4\x72\x75\x8e\xd3\x92\xc8\x43\x1d\x77\x9d\x66\x59\xc2\x6c\xb5\x8d\x99\x40\xb8\x8b\x0a\xae\x74\x96\x88\x89\x48\x27\x68\x92\x08\x43\x1f\x8d\x70\x42\x79\x2c\xd2\xb9\x97\x19\x21\x12\x2a\x95\x53\x7b\xa4\xc5\xbe\xea\xd8\x11\xa3\x50\x02\x13\xa8\x51\x5b\x6c\xb6\x52\xac\x99\xcd\x00\xc7\x63\x04\x4e\x4f\x12\x3a\x80\xc4\xc2\xd8\x62\xa0\x9a\xc7\xc0\xc7\x8e\x46\x95\x22\x69\x2e\x7d\xe6\xad\x48\xc0\x86\x77\x79\x40\x98\xe9\x9f\x04\x1c\x70\x92\xa6\xe0\x80\xda\x60\x05\x0e\xa8\xd7\x3e\x05\x38\xe4\x35\x58\x3d\x99\x85\x83\x91\x1b\xaa\x70\x40\xe6\xbd\xeb\x70\x50\x10\x45\x22\xcd\xfa\x52\x18\xb5\xb3\x31\xde\xe4\xa6\x2d\x7c\x86\xd6\xb0\xb1\x20\x18\x0b\x79\x41\xf5\x66\x2a\x4b\x81\x9d\x54\x5b\x26\xe1\xa3\x3b\xff\x3f\x25\x9e\x85\xa4\x67\x96\x91\xf9\x59\x2a\xee\x45\xf3\xa4\xbb\xf0\x94\xd9\x41\x13\xb9\x11\x35\x8c\x9d\x8d\x70\x23\x11\xd1\x04\x6b\xc7\xd6\x43\x39\x32\x8b\x76\xb3\x13\x97\xc2\x79\xd1\x47\x89\xbf\xf9\x00\x12\x2c\x23\x8a\xbf\x38\x13\x26\x17\x31\x94\x7c\xd9\x36\x0e\xf9\xda\x86\x7d\xe2\x7d\x3e\x92\xd8\xc8\x15\xde\xad\x1c\x57\x9e\xd6\xc2\x55\x40\x7b\x1d\x2a\xd2\x9a\x05\x02\x8f\x19\x1f\xa1\x5d\xad\x43\x24\x24\x36\x06\xd9\x11\x81\x1b\xab\x41\xee\xe3\x91\xf0\x93\xfa\xf3\xe0\x5f\x8d\xb2\x18\x13\xdc\xcd\x8c\x96\x22\x2f\x61\x0d\x2d\xb9\x65\x8a\xec\xbd\xf2\x00\xa8\x51\xc2\x73\x17\x39\xcc\x9e\xfd\xc2\xb0\x9b\xd6\xd2\x79\xc3\x78\xec\xc2\x75\x2b\xc0\x0a\x35\xe0\xad\x1c\x8c\x81\xe0\x2c\x2e\xd3\x96\x63\xf2\x9e\x93\x00\x2c\xd2\xdd\x1a\x3d\xde\x5a\x91\xd9\xdb\xe8\xba\xab\x0d\xaf\xe1\x25\xb3\xd3\xfc\xcc\x71\xef\xcd\x7b\xbb\x46\x73\x9f\xbf\xcf\x7f\xcb\xa3\x96\xee\x71\xd4\xaf\x69\x2d\xe6\x1f\x76\x5a\x2f\xd2\x47\x06\xad\x35\xe3\x23\x55\xd6\x64\x68\x92\x54\x8c\xe1\x8b\x54\x19\xbf\xc3\xa1\xe2\xff\xbc\x0a\x31\x93\x66\xf0\x54\xd4\x90\xc4\x88\x13\x4f\x5c\x09\x19\xa5\x8a\x9e\x4a\x03\x09\xcd\x68\x72\x95\x6d\x5f\xa2\x94\xcc\x95\xc3\x7b\x7d\x75\x52\x9d\x1a\x99\x35\x36\xa4\x30\x7b\x65\xae\x13\x1a\xa7\x4c\x29\x34\x84\xc1\x60\x2c\xc4\x0d\x39\x58\xd9\xa9\xa1\xab\xd8\x48\x1d\x39\x9c\xef\x9a\xd5\x1f\x12\xc6\x93\x10\x15\x85\x7a\x30\xd7\xca\x1b\x72\xf0\x25\x51\x58\x05\xee\xa1\xab\x5b\xed\x82\x15\xe6\x97\x69\x2b\x55\x1b\x2c\x78\x74\x82\x3d\xbf\x3d\x97\x35\xcb\xae\xdc\xb3\x45\x97\x0e\xb7\x67\x2b\xab\x2d\x84\xa3\x95\x1e\x1f\x1d\x48\x4e\xb8\x88\x40\x35\x57\xd0\xe9\xc7\x62\x4e\x12\x83\xcd\xe2\x01\x8c\x7e\xa2\x4b\x83\xec\xd0\x2e\xbd\x8f\xc9\xa0\xee\xd1\xfd\xb2\x44\x7d\x5d\x10\x17\xa3\x8f\x24\xd9\x98\x76\xad\x92\x6e\x28\x1a\x92\x40\x2f\x42\x8c\x05\x17\x2e\x49\xc2\x30\x51\xc1\x11\xa5\x91\x44\x59\x6f\x1e\xee\x89\x23\xd1\xa5\xa5\x9e\x16\x5e\xe2\xb2\x23\x10\x93\xc9\x74\x68\xad\x62\xd7\x70\xcb\xf4\x18\xeb\xbc\x8e\x67\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\xda\x57\x65\x47\x75\x51\x0a\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x50\x14\xbe\x75\x59\x06\x06\xc1\x5c\x29\xf9\x94\xdd\x99\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc1\xd9\xc5\x97\x0f\x7b\x84\x5c\xf0\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x3e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xca\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0e\x7f\x55\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x91\x4c\x7d\x75\x17\xf6\x1f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x2f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\xb6\xa4\x22\x42\x92\x5b\x2a\x53\xc3\x37\x68\x34\x46\x0f\x25\xe5\x24\xce\x25\x56\x59\xd6\x40\xe3\x69\x57\x69\xaa\x8d\xa4\x0c\xd2\x29\x94\x7e\xfd\x6d\x49\xfd\x95\xa3\x2d\xa9\xbf\xe6\x68\x4b\xea\xb7\x25\xf5\xe7\xc7\xce\x44\x87\xb6\x25\xf5\x9f\x57\x99\xa4\xb6\xa4\xfe\x63\x7b\x13\xda\x92\xfa\x6d\x49\xfd\x55\xa3\x2d\xa9\x7f\xcf\x68\x4b\xea\x6f\x31\x9e\x01\xe5\x6a\x4b\xea\x6f\x31\xda\x92\xfa\x8b\x47\x5b\x52\x7f\x7e\xb4\x25\xf5\x97\x8e\xb6\xa4\xfe\xd6\xa3\x2d\xa9\xdf\x96\xd4\x6f\x2b\x8d\x6e\x36\xd7\x6e\x56\x1a\x25\x6d\x49\x7d\x37\xda\x92\xfa\xcf\xa2\x9e\x22\x69\x4b\xea\xaf\x35\xda\x92\xfa\x6d\x49\xfd\x6d\x46\x5b\x52\xff\xb9\x98\x4b\xda\x92\xfa\x6d\x49\xfd\x4f\x47\xd0\x6d\x4b\xea\xb7\x25\xf5\xdb\x92\xfa\x6d\x49\xfd\x95\xab\x68\x4b\xea\x3f\x07\x15\x50\xe9\x98\x6d\x55\x01\x74\x9d\x62\x45\x2e\x08\xbd\x54\x1b\x60\x90\x0f\x87\x20\x91\x72\xe1\x9b\xe7\x82\xa7\x8a\xba\x8c\xb3\x4e\x56\xd0\x1d\xac\x7b\xe4\xf2\x75\x96\x3c\xee\x8a\x11\x60\xa5\xce\x22\x52\xfc\xfc\xcd\xf7\x0b\x2a\x23\x6d\x1d\x55\xb8\x6d\x8c\x34\xae\xf9\x0d\xdf\xce\x3f\xbe\x04\xe0\x8b\xf2\xc7\x1c\xdc\xa3\x44\x28\x17\xe1\x8e\xc0\x8a\xc6\x94\x73\xf0\xfa\x1e\xd3\x68\x47\x19\x00\x70\x22\x32\x70\xde\x69\x4a\x14\xe3\xa3\x04\x08\xd5\x9a\x46\xe3\x9e\x79\x13\xf7\xc0\x2e\xa2\xd1\xdd\x2f\x4a\x4b\xa0\xa9\x8f\xcb\x4f\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x42\x8d\x65\x54\x01\x18\x18\x15\x57\x84\xb0\x77\x8a\xb7\xb9\x65\x89\x72\x69\x3a\xd4\x36\x3b\x58\x0f\x3c\xcd\xf4\x34\xc4\xf1\x02\x19\x32\xa9\x34\x89\x12\x86\xdc\x1a\xdf\x68\x73\xa7\x71\xbe\x8e\xe7\xd5\xdc\xad\x54\xb9\xa5\xf2\x18\xc5\xd6\x4c\x2b\x1b\x15\x5b\x4c\xe8\xa6\x8a\x99\x72\x62\xbe\xea\x10\xea\xeb\xa6\x59\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x4a\xd3\x95\xea\xc5\x16\x61\xc3\x05\xa2\x63\x8a\x83\x47\xce\x4e\x25\x9b\xa3\x10\x28\x30\x4a\x6f\xee\x18\xe0\x06\x70\x98\x18\x1c\x80\x08\x0c\x7f\xa5\x4b\xb0\xfe\xa3\x23\x7d\x89\x29\xbe\x06\xa5\xe8\x08\xfa\x5b\x3a\x1a\x96\x69\x64\xe8\x6b\x28\x36\x06\x51\x21\xb1\xd9\xb5\xe1\x97\x22\x3a\xb3\x2a\x06\x91\xd4\xae\x29\x08\x3f\xb7\x92\x69\x0d\xb8\xa9\x58\x61\x0f\x7d\x95\xb3\x09\xf8\xfb\x33\x31\x9e\xaf\xfd\x24\xc5\xc3\x86\xa8\xf3\xd8\x46\x5c\x0e\x80\x0c\x24\x83\x21\x19\x32\x0c\xe3\xc4\xc0\xca\x8e\x2d\xb8\x44\xad\x15\x40\x29\xa3\xef\x0a\xee\x65\x59\xbf\xae\x1e\xf9\x87\x5b\x98\x96\x39\x8f\x68\xa9\x96\x2d\x66\x98\xb2\x21\x19\x61\x60\xa6\x93\x16\xff\xf8\xe2\x2f\xdf\x90\xc1\xd4\xb0\x34\x94\xac\xb4\xd0\x34\x09\x1f\x99\x00\x1f\x19\x58\xd9\xe3\x59\xcd\x91\x0c\x10\xc0\x6e\x1e\x76\xe1\x2f\xbf\xba\x19\x54\x79\xec\x51\x0c\x93\xa3\x12\xfc\xba\x89\x18\x2d\xea\x8f\xb2\x7d\xc8\xf6\x96\x2a\xd1\x02\x34\x13\x09\x8b\xa6\xb5\x11\xcd\x57\xfe\x22\x63\x71\x6b\x65\xfd\x05\xd8\x53\xa4\x5b\x65\x22\xcb\x13\x6b\x74\xfe\x3e\x64\x17\xe7\x0a\xe6\x73\x00\x17\x9e\x0b\x34\x93\xba\x29\x66\xeb\xa6\xdb\x78\x5c\xff\x4a\xe1\x72\x4b\x9c\x21\x2f\x14\x00\x43\x45\xe8\x7b\x9a\x24\x03\x1a\xdd\x5c\x8b\x57\x62\xa4\xde\xf0\x73\x29\x85\xac\xae\x25\xa1\x86\x5a\x8e\x73\x7e\x63\x3b\x38\x84\x12\x09\x62\x64\x44\xab\x2c\xd7\x3e\x91\x61\xd1\x07\xdb\x7c\x79\x4f\x84\xbd\x1a\x54\xcc\x02\x77\xac\xd0\x75\x5c\xaa\x96\xc5\xc8\xf2\xfc\xaa\x8c\x6c\x5f\xbd\xf8\xe3\x9f\x2d\xea\x12\x21\xc9\x9f\x5f\x60\xcc\xb6\xea\xd8\x43\x8c\xb4\xcd\x30\x8a\x94\x26\x89\x51\x1b\xca\x48\x69\x00\xbd\x08\x09\x3f\x3a\x0e\xea\xfa\xe8\xb6\xb6\x28\x75\x7d\xfd\x4f\x94\xa3\x98\x56\x90\x0c\x3b\x36\x2b\x29\xa8\x35\xfb\xc8\x18\xf6\x1d\xf5\xc1\xd4\xb0\x1d\x10\x80\x26\x22\xc9\x53\x38\x83\x09\x6b\xa2\x89\x53\x65\x36\xaf\xea\x27\x4c\x61\x02\xd8\x20\x11\xd1\x0d\x89\xdd\xc5\x52\xe4\xc9\x6c\x25\xf0\xed\xa1\xb0\x6d\x0c\x4e\x8d\xd8\x9b\xa5\xdf\x5f\x89\xba\x49\x69\x96\x85\x1c\x21\x49\x6f\x2b\xc0\xc0\x33\x89\xe5\x0a\x6a\xd6\x93\xa9\x6d\x66\xae\x6b\x64\xee\xba\x2f\x32\x74\x73\xeb\x29\xb6\x8e\x3a\xa9\x6f\xa3\x2e\x56\xbf\xbd\x61\xb2\x82\x10\xc5\x84\xfe\x34\x64\xf8\x6f\x9b\x55\x32\x97\x15\x19\x12\xeb\x02\x62\x58\x01\xc0\xa0\x0f\x92\xe4\xed\x0d\xae\x0d\x58\x37\xeb\x85\x1c\x55\xe0\xc2\x83\x55\x39\xa5\xda\x09\x84\xde\x7c\x4d\x49\x06\x52\x31\x65\xf8\xf2\x2f\x78\xa0\x4e\x13\xca\xd2\x92\x09\xf0\x71\x80\x60\x0f\x37\x96\x4f\xae\x4f\x29\xfb\x22\x76\x13\x22\x29\xb4\xa5\xa3\x17\x88\xb5\x55\xa9\xb6\x41\x86\xfa\xd8\xa4\xf2\x97\x02\x9a\x55\x4a\x69\x7e\x09\xa4\xd2\xde\xf5\x9c\x08\x24\x7e\xdf\x53\xa5\x8f\x61\xf1\x0d\x91\x01\x24\x8c\x6e\x73\xab\x94\xb0\xa2\x3c\xda\x83\x52\x12\xe9\x9d\x1e\xd8\x23\xd6\x0b\x6e\xce\x84\x7b\x94\xec\x1f\xef\x3f\x2a\x91\xb4\x20\x92\x22\xa3\xa3\x5a\xbd\x7c\x66\x20\x35\x3b\x6d\xb9\xd0\x84\x51\x83\xf0\x7a\x28\xbb\x86\x77\x41\x5c\xd4\xd1\xc1\x2a\x49\xd6\x3b\xea\x01\xec\x14\x04\x9b\x8f\x7d\x4b\xa7\x84\x4a\x91\xf3\xd8\xd9\x97\x82\x81\xef\xf5\xcc\x8b\x2f\x05\x07\x6f\x38\x9f\xad\x53\x81\x16\x7d\xc6\xc9\xcb\xde\xcb\x17\xcf\x85\x53\xe1\x17\xce\x70\xaa\xcb\xc0\xa9\x2c\x7d\x7a\xd4\x6f\xf5\x15\xef\x1b\xfa\xde\xd7\xce\xc4\x52\x14\xb4\x67\xbe\x5c\x36\xfe\x74\x2b\x99\x86\x52\x8f\xbf\x03\x54\x5c\x8c\x7e\x58\xaa\xca\x70\xb8\xa8\x93\x44\x4d\x20\xd5\x2b\x83\xa1\xf2\xc1\x03\xd2\x2d\x47\xa0\xf0\xb8\x2d\xb2\x70\xa9\x15\x24\xac\x0c\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x09\xcd\x87\x8f\x8a\x5a\x0e\x68\xe7\x77\x59\x8d\x1a\x9b\x33\xb9\xf3\x19\x45\x1b\x5c\xd6\x20\x04\xff\x0e\x63\x3a\x01\x4c\xe4\x66\x09\x95\x09\xfa\x1c\xaf\xec\xda\xc9\x20\xd7\x04\xf8\x84\x49\xc1\x53\xe0\x9a\x4c\xa8\x64\x58\x15\x47\x02\x56\x76\x30\xba\xe8\xe7\x07\xbf\x9c\xbc\xc5\x80\x86\x43\x57\x92\xc2\xad\x32\x57\xbe\x7c\x4d\x79\x25\xa5\xe9\xee\xdd\x3e\xbf\x0e\x03\x43\xa4\xb9\x7e\x5d\xe6\x3d\x69\xae\x73\xdb\x96\xe5\x2e\x4a\x72\xc5\x26\x8f\x45\x49\x5c\x86\xfd\x19\xdb\x6a\x9f\x67\xb2\xfd\x0b\x40\xcd\x25\xee\xa3\x69\x7d\x41\x82\xde\x9c\xc3\x64\x5f\x85\xa4\xbd\xb2\x0f\xdc\x99\x9e\x5c\x2d\x0d\x1b\x3e\xe7\x2b\x2e\xce\x89\x10\x58\x37\xe6\x71\x8d\x50\x31\x57\xa7\xb8\xc2\xcd\xc0\x5a\x0d\x48\xae\xe4\xf1\x9d\x5d\x5e\x95\x8b\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x2a\xd5\x60\xfd\xb4\xa0\x44\x82\x1c\x15\x45\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\xb4\x55\x25\x03\xaa\xac\x93\xe7\xec\xf2\xca\xda\x6c\x37\x83\xd9\xd6\x62\xf6\xf6\x12\xaa\xe1\xf8\x36\x8d\x61\x0b\xe1\xb6\xda\x33\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\x8b\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xa5\xca\xe0\x5b\xc0\xaa\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\xce\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x66\x83\x4d\xbe\x36\x47\xda\x3a\x6a\xde\xd6\x4a\x5e\x0d\x2a\x24\xb6\x2d\x4a\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x82\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x1a\x94\x6b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x62\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\xe5\x37\x5d\x19\xb7\xa2\xc4\xb1\xf5\x0d\xdb\x2a\xd3\x40\xa5\xa7\x68\xb8\xaa\x2d\x4f\x22\x79\x2c\x44\x98\x35\x76\x9c\x5d\x5e\x59\x4a\x68\x3f\x3e\x74\xa7\x5d\xb4\x4b\x05\x55\xdb\x1a\x03\x1f\xad\xca\x50\x1d\xcd\x63\xa6\xb9\x9f\x6b\xd7\x5d\x2b\x90\xa5\x86\xf8\x57\x2b\xd9\xae\xc6\xdb\x15\x50\x19\x8d\xb7\x81\xff\x0a\x42\x60\x27\x25\xb1\xb0\x91\x00\x43\x21\x51\x25\xee\x22\x79\x4f\x84\xb8\xc9\xb3\x75\x28\xba\x9b\xc6\x36\x5c\x5b\x8b\x40\x54\x9e\xf8\xa4\x68\x7a\xcc\xd5\x36\xfe\xde\xaa\xec\x03\xda\x4a\x3c\x38\x51\x91\x40\x21\x66\xf5\xa6\xd3\x24\x57\x1a\xe4\xf7\x4c\x2a\xbd\xe7\xeb\x45\x23\x06\x5b\x9b\xc8\x7e\xf9\x86\x7f\x30\x3d\x76\xa5\x1b\xf7\x3b\xd5\x4b\xe6\x6f\x37\xf1\xbe\xd1\x69\xf7\x2f\x05\x87\xfd\xde\xac\xd8\x15\x48\x79\x20\x6b\x4b\x79\x8a\x5b\xba\x82\xc4\xc6\x8b\xe2\x85\x12\xae\x5c\xbb\xb2\x95\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x38\xbc\x7b\x5c\x94\x99\xb4\x75\xa3\x6c\x9d\x4c\xe1\x04\xbd\x69\x19\x44\xa5\x52\x52\x5a\x2c\xff\xec\x6d\xe4\xb9\x8d\x31\xc0\x96\x1f\x75\xf5\x42\x5e\x31\x7e\xb3\x21\xfa\x55\xa3\x4b\xce\xe7\x66\xab\xd4\x13\xb7\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x20\x72\xed\x6b\x92\xa8\x92\xe2\xc8\xf8\xbf\xec\x5e\xa0\xbd\x3d\xb3\x15\xfb\x16\xe9\x88\xaa\x63\x8d\x3e\x5e\x09\x54\x53\xae\x29\xd6\x16\x3d\x13\xd1\x0d\x48\x92\x98\x65\xf4\x48\x11\xf8\x52\xa9\x66\x29\x73\xd8\x30\xea\x62\x5b\x4b\x07\x64\x63\x48\x41\xd2\xa4\x28\xea\x5a\x03\xd4\xaf\x1c\xe1\x0c\xb3\x96\x63\x52\x6c\x51\x34\x57\x86\xd1\x9c\xc3\xf3\x45\x77\xa5\x74\xea\x2b\xdd\x32\x8e\xe1\x06\x77\x4c\xa1\x59\x3f\x13\x71\x39\xf1\x2c\x57\x20\xbb\x21\x2d\xd0\xe5\xde\xa8\x10\x88\x13\xc3\x20\x1f\x8d\x18\x1f\x39\xea\x8c\x34\xbd\x54\x6e\x3b\x68\x3a\x18\xe9\x1d\x49\xb0\x05\x67\x51\x7a\xb0\xf1\x65\xac\x7c\x7f\x2a\x62\x7b\xfb\x60\x6a\xb5\x41\xbf\xb3\x45\x80\xf4\x05\x27\x42\xba\xd2\x08\x34\x8e\x71\xed\xf3\x5f\x88\x57\xab\x5f\xd5\x09\x71\x1c\x36\xb2\x3b\x3c\x55\x02\x8b\xca\x07\x46\xd8\xc9\xe5\xa6\x15\x42\xb7\x25\xfc\x5b\x11\xfd\x6a\xbd\x9f\x13\x5e\x6c\xf1\x69\x39\x60\x8e\x12\x0d\x69\x26\x24\x95\xd3\x59\x17\xa6\x21\x52\x06\x05\x0c\x00\x67\x20\xd5\x17\x31\xd2\xf1\x05\x1b\x3f\xb1\x9d\x7c\x17\xec\xfd\x42\x1c\x43\x2a\xc8\x05\xf1\x10\x35\xf4\x5a\x45\x63\x88\x73\x8c\x1e\x1f\xe5\x14\x3b\x8d\x9b\x53\xec\x8c\xdd\x53\x17\x96\x67\x91\x21\x04\xfc\x85\x34\x81\x29\x06\xc9\x60\x15\x4e\xf3\x0b\x56\xf3\xb4\xa1\x81\xb6\xd1\x32\x36\x5d\x0d\x51\x82\xd7\x45\xef\x07\xfc\x58\x98\xb0\x48\xfb\x87\x86\xcb\x10\x27\xa2\xa1\xbf\x6b\x5f\xb8\xea\x7f\x11\x18\x62\xa4\x55\xf1\x29\x2e\xaa\x04\xeb\x7b\xbe\xe7\x86\x49\x2c\xc7\xc5\x02\xf1\xee\x41\x39\x94\xab\xab\x5b\xb1\xe2\xf8\x06\x28\x2d\xf8\xf6\x4d\x8b\x25\xd5\x10\xca\xb7\xf7\xb8\x6d\xe5\x29\xab\x23\xff\x53\x39\xaa\xaf\x2b\xed\x9f\xc8\x51\x9e\xda\x1a\xde\x62\xa6\x8c\xb2\xc5\x39\xb4\x6b\x19\x96\x75\xfa\xfa\xac\x9c\xc2\x50\x8e\xcd\xf6\x09\x20\x46\x14\xaa\x69\xef\x9c\x35\x78\x5e\x18\xe5\x2c\x58\x51\x0b\xda\xea\xb4\x38\x67\xd1\x0b\x6f\xf3\x5a\x2c\xe3\x99\xe1\xc6\x28\x43\x14\x36\x3d\x1e\x8d\x29\x1f\xa1\x19\x5c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\xf5\x8d\xf0\xf1\xcf\x9f\x7b\xeb\x9f\x2b\xe1\x83\xed\xeb\x54\x44\x33\xbf\xe6\xf2\x67\x59\x56\x7d\x4c\x58\x0f\x7a\x64\xef\xf3\xd2\xa5\x3d\xfb\xf6\x4c\x0a\xf3\x0a\x17\x3a\x8d\xab\x4a\x98\xc6\x83\xb0\x57\xbe\xbb\x47\xce\xcd\x3b\xd0\x23\x12\x00\x58\x8a\xee\x1d\x14\xe0\xeb\x10\x09\x23\x2a\xe3\x04\x33\xee\x86\x41\x28\xb1\x79\x39\x0e\x60\x78\xfa\x30\x9e\x8e\x0b\xbd\xc8\x3a\xb9\x66\x5a\x84\xa6\xea\x46\x1d\x59\x51\xa6\x1b\x53\x4d\xbb\xd8\x6b\xc3\x12\x8d\x23\xab\x5e\x77\x5d\x95\xd3\x2e\x75\x38\xd5\x0d\xdb\x7a\xf4\x07\x97\x59\xd5\xa5\xe1\x2e\xc6\xbb\xb4\x8b\xf5\x46\xb7\x8f\x15\x7d\x84\xb0\x82\x5a\x9a\x6e\x8d\x62\xb7\xb3\xe2\x69\x28\x76\x8e\x30\xc0\x56\x21\x45\x71\xeb\x10\xc1\xe0\xea\xb9\x56\x0e\xf2\xf9\xe5\xf5\xdb\x7f\xf6\xdf\x5c\x5c\x5e\xb7\xe7\xb9\x3d\xcf\xed\x79\xae\x71\x9e\x81\x4f\x6a\x9f\xe5\xa0\xff\x2c\x52\x09\x67\x8a\xcb\x95\x32\xaa\x9f\x51\x70\xd6\x39\x9f\xfc\x42\x8d\xc0\x97\x49\x50\x28\x8b\x18\xb9\x71\x91\x17\xd5\xdd\x60\xbb\x6d\x9d\x3e\xf9\xe8\xac\x47\x8c\xad\x6a\x30\x66\xe5\xb2\x54\x08\x60\xd1\xae\x95\xdb\xdb\x9d\xfe\x7a\x71\x76\x7e\x79\x7d\xf1\xfd\xc5\xf9\xdb\x47\x0d\x36\xa8\x59\xdc\xad\xca\x8d\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xa1\x3e\xec\x62\x22\x30\x1f\xaf\xc6\x8d\x7a\x36\x0d\x25\x70\x17\x3e\xd6\x32\xdb\x66\x99\x6d\x35\xf6\xa2\x46\x5d\x8f\xa6\xd0\xf7\x7b\x29\xd2\x86\x50\xf8\xca\xaa\xec\xde\xe4\xbd\x08\x9f\xf6\x5d\x09\x80\x0a\xeb\x71\xc2\x63\x51\x6f\xc0\x48\xa1\x69\xa6\x6b\x14\xff\x6f\xa4\x9c\x67\x33\x95\x2f\x6d\x9c\xc2\x6b\x9a\xfd\x04\xd3\xb7\x50\xb3\x7c\xc8\x8c\xab\x21\x81\xc8\x30\x3a\x72\x03\x53\xeb\x81\x3c\xf5\x2f\xab\x53\xe6\x64\x27\xab\xa1\xde\x40\x9d\x4a\xb5\x4d\x96\x31\xbd\x81\x1a\x81\x8b\x7e\xcc\x15\xf4\x34\x5b\x88\x72\x9a\xd9\xd3\x7a\xbb\x47\x9a\x2d\x61\xfa\x00\x65\x5b\xf7\xcb\xec\xde\xd1\x59\xbd\x71\x75\x05\x31\x31\x9c\x0b\x6e\x8f\x5c\xd0\x56\xd7\x68\xac\x5d\x8b\xb5\xea\x08\x23\x53\x8e\xfe\x80\xff\x21\xd7\x6f\xce\xde\x1c\x93\x93\x38\x76\xc1\xc3\xb9\x82\x61\x9e\xd8\x30\x60\xd5\x23\x34\x63\xbf\x80\x54\xd8\x3d\xed\x86\xf1\xb8\x43\x72\x16\x7f\x57\xa7\xe8\x92\x1d\x0d\xee\x82\xf0\x0e\x9b\x66\x77\xe2\xca\xf9\xe3\xca\xbc\x2b\x10\x11\x62\x33\x03\x11\x37\x7d\xfd\x15\x27\x64\x34\x04\x9a\xba\x8d\xe2\x88\xdd\xc2\x66\xe9\xea\x7e\x41\x58\x6d\x9c\x78\x28\x50\x15\x1f\x13\x95\x63\xa1\x18\x15\xba\xbb\x61\xbf\xd4\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\xb7\xf0\x23\xf6\x63\x57\xef\xf6\xf7\xbf\xfd\xe9\xfc\x9f\x7f\xdb\xdf\xff\xf0\x5b\xf9\x2a\xb2\x42\xd4\x9a\x67\x6e\x41\xff\x0e\x17\x31\x5c\xe2\x3b\xf0\x4f\x27\xae\x9d\x44\x91\xc8\xb9\x76\x17\x30\xab\xb7\x37\x16\x4a\x5f\xf4\xc3\x9f\x99\x88\x67\xff\x52\xb5\x2a\x89\xed\x24\x63\xc0\x2d\xaa\x91\x9d\x62\x47\x73\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xe8\x5c\x11\x8d\x21\xb5\xb5\x8c\xbe\xf7\x20\xc0\x0e\xb4\xbe\x7c\x00\xc7\x9c\x6b\x23\x99\x56\xcb\xca\xed\x4d\x5e\xd6\x6a\xd5\x6d\x47\x83\xa4\x2d\xec\x60\xc3\x00\x43\x88\x38\x68\xd9\x83\x1c\x18\xac\xd7\x52\x0a\x6f\xec\x49\xff\x82\x4c\x2c\x84\x77\x06\x38\xde\x0b\xf6\xfd\x83\xd2\xb8\xb2\xaf\xad\xa2\x21\x1e\xdb\x86\xad\xfe\xba\xcb\xb3\x57\xa1\xf4\x15\x18\xc5\xe6\xc0\xfe\xd8\x8b\xb2\xbc\xe3\x6e\xe8\xa5\x90\x0a\x39\x0d\x7f\x06\x1f\x5f\x57\x69\x21\xe9\x08\xf3\x32\xec\xe3\xf6\xb1\xf0\x97\x7d\xb0\xf2\x82\xf9\xa7\xad\x2a\x1c\xe5\xd2\x08\x0d\xc9\xd4\x53\xe4\x2d\xeb\x45\x14\x63\x07\x69\x9b\x07\xfd\x8e\x90\xb6\x80\x19\x75\xdb\xb2\xda\x51\x45\xc8\xc2\x51\x8f\x02\x67\x80\x22\xea\x93\x2e\xef\xb4\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\x6e\x5d\x39\xab\x18\x0d\x52\xb3\x98\x4d\x98\x12\x35\xb2\x4f\xc2\x44\xcb\x43\xea\x5d\xe9\x0b\x1b\x38\x14\xcc\x66\x77\x19\x16\x0b\x0a\xe7\x75\x86\xec\xbf\xac\xd3\x2f\xc8\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3e\x78\xff\xe5\xef\xdd\xc3\xef\x0e\x0e\xde\xbd\xe8\xfe\xe5\xc3\x97\x07\xef\x7b\xf8\x8f\x2f\x0e\xbf\x3b\xfc\xdd\xff\xf1\xe5\xe1\xe1\xc1\xc1\xbb\x9f\x5e\xff\x70\xdd\x3f\xff\xc0\x0e\x7f\x7f\xc7\xf3\xf4\xc6\xfe\xf5\xfb\xc1\x3b\x38\xff\xb0\xe6\x24\x87\x87\xdf\x7d\x5e\x7b\xe9\x0d\xd4\xee\xb4\xa3\xc9\x0a\x9e\xd5\x19\x1b\x41\xbf\x07\x2c\x5b\x6f\x87\x47\xaf\xa6\xcf\xbf\x8f\x1e\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xc7\xb0\xe4\xd8\x37\x95\x2a\x08\xec\x2b\x12\x54\x8b\xe7\xc6\xe7\x3e\x05\xe3\x4e\x68\x38\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\x15\x8e\xee\x0d\xec\x42\xef\xef\xbb\x81\x5a\x2d\x50\xed\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\x2e\xa1\xb6\x9e\x43\xad\xe7\x8f\x7a\xd1\xa9\xb1\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x91\xd9\x1e\x7c\x9c\xa0\x48\xbb\xb0\xaa\x8d\xab\xf0\x07\x13\xb3\x84\x50\x22\xba\x52\x0c\x12\x03\x1d\x31\xf4\xf4\x1f\x36\x12\xf4\xc6\x06\x87\x1a\x25\x8d\xf1\xa2\x8c\x66\x10\x0e\x8b\xda\xcb\x54\x29\x11\xd9\xa0\xd6\x90\x04\x80\x95\xdd\xdc\xb2\x71\x35\xd8\x06\x3e\x93\x10\x41\x0c\x3c\x02\x57\x97\xb9\xd2\x95\x92\x72\x72\xce\x27\xbe\x36\x75\xec\x53\x4a\x70\x25\x8b\xe7\x78\x5e\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x66\xc5\x50\x0c\x31\x2c\xac\xac\xdb\x35\xae\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\xcf\xc1\x19\x58\x9f\x7d\x7e\x72\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xbb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\x14\x93\x4c\x42\x06\xdc\x66\x09\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2d\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x48\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\xad\xb5\x82\x88\xbc\x31\xa2\x15\x69\x47\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\x7d\xea\xfd\x0b\x84\x46\x96\x27\x89\x4b\xcb\xed\x91\x37\x1c\x8f\xe4\x09\xf6\x41\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\xd6\xa2\x2f\x55\xce\x11\xb2\x32\x41\x51\x94\xab\x46\x18\xfa\xf2\x6d\xf9\x83\x4f\x98\xec\x3e\xd2\x36\x85\x66\x1f\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xeb\xf5\x09\x16\xa2\xc8\x84\xd2\x57\x46\x8b\x6d\xa6\x11\x4c\xdf\x4f\x87\xbd\x15\x68\x92\x40\x5c\xe9\x04\x64\x3b\x58\xd0\xaa\x16\x8d\xf9\xb8\xa1\xa1\x02\x90\x31\xe5\x71\x02\x12\x8b\xa2\xab\xd9\xca\x4f\xac\xe8\x02\x10\xfa\x36\xf8\x04\x4d\x1a\x45\x42\xc6\xae\x03\xab\x4b\x94\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\xa5\x75\xb1\xe0\xb2\x2a\x35\x7f\x18\x0b\x71\x43\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\xe8\x3d\x13\x50\xb4\x6b\x66\x57\x47\xa5\xb6\x34\xf8\x43\xbd\xae\x34\xb5\x84\x95\x26\x44\x15\xb8\x83\xa8\xb1\xbe\x75\xe7\x77\x10\x95\x1a\x2f\x9a\x2d\x71\x9d\x17\xb5\x40\xdb\x46\xfd\x7e\xba\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\xa1\x35\x9c\xd3\xd7\x95\x76\xaf\xc0\x12\xfd\x36\xab\x18\x33\xcf\x7c\xa9\xe9\xca\x61\xb0\x47\x6f\xae\x3a\x5b\x08\x36\xf6\x73\x61\xee\xb3\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\x8a\x13\x5f\x97\x9e\x64\x58\x8d\x2f\xc3\xd2\x76\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\x28\x00\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\x11\xe0\x60\xff\xf7\xfd\x0e\x01\x1d\x1d\x92\x5b\xc1\xf7\x35\x2e\x1f\xcb\x67\xe4\xaa\x34\xd1\x54\xe4\xd8\xa5\xce\x82\x20\xd4\xc2\x30\x14\x8b\x88\xdc\xb6\xb4\x19\x53\xed\xd3\xf0\xce\xef\x98\xf6\x6d\x1c\xc4\x90\xbc\xb0\x1d\x75\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\x53\x34\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\x1f\xb6\xef\xd4\x4a\xe6\x9a\x18\x5f\x5f\xf7\x7f\xa8\xf4\x6a\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x75\x25\x76\x80\x76\x34\xe3\xd0\xab\xd5\xb4\x95\x34\x48\xc2\xea\x36\x6f\x25\xf3\x4d\xa9\x37\xeb\xda\x4a\xfe\x29\x72\xec\x36\x47\x07\xc9\x94\xdc\x52\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x02\x8d\x41\x2a\xa4\x1e\x40\xb7\xae\x9f\xe5\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\xb3\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x67\x3e\x2a\x83\xad\xdc\x8d\x84\x71\x0b\x2c\xdb\x47\xb0\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\xdd\xb4\x91\x4c\xd8\x7a\xad\x3b\xc3\x65\xea\xb6\x16\x27\x8b\x73\x89\x25\xe1\xa1\x13\xec\xd3\x68\x2f\x4e\x9a\x0b\x53\x6c\x3a\x48\xb1\xd1\x10\xc5\x07\x0d\x50\xc4\xb4\x88\xda\x54\xa4\x6a\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\xad\xa2\x6a\x0e\x35\x47\x6d\x27\xce\x98\x8e\xb2\x2b\x11\xdd\x34\xa8\xd7\x9c\x41\x26\x21\xb2\x76\xb2\xeb\xd3\xbe\x9d\xdd\xe8\x97\x97\x6f\xae\x8b\x70\x7c\x8c\x59\x29\x0c\x97\x3f\x3a\x4b\x9a\xd1\x49\x6f\x20\xd3\x41\x75\x1f\xd0\xe8\xe6\x96\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x9e\xa2\x72\x2e\x01\x63\xfd\xb9\xb0\x41\x71\xb6\x48\xa2\xf0\xad\x4e\x43\x1f\xee\x60\xc3\x42\x0b\x99\x8b\x9e\x19\x52\x66\xf4\xf1\xd0\xcf\xd6\x46\xcd\x44\x59\x30\xe9\x95\x2d\xd3\xad\xf2\xe5\xc7\xce\x2a\x5f\xa5\x5e\xad\x9b\xea\x61\x75\x63\xf7\x76\x98\xd5\x39\x16\x27\x43\x2b\xb2\x96\xd5\x35\x34\xdf\xee\xb2\xba\x4c\xc2\x95\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x8f\x38\x07\x57\x2e\xf3\xa4\x7f\x11\xac\x5a\xa2\xe2\xd8\xb0\x51\x8b\xbe\x46\x66\xc2\x26\xc0\x41\xa9\x23\x74\x87\xe4\x99\x6b\xc7\xef\xba\xce\x76\xcc\xd7\x41\x8a\xab\xeb\x14\x99\x00\xae\xe7\x2d\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\x76\x5a\x6e\xf9\xb3\x6e\x94\x48\x52\x35\xb6\xfd\x60\xe1\x8e\x69\xd7\xd3\xb8\x6f\x6b\xe8\x96\xdb\xd2\x8e\x24\x8d\x80\x64\x20\x99\x30\xcc\x28\xe7\x3a\x16\xb7\x9c\x0c\x60\xc4\xb8\xf2\xa0\xc0\x2a\x98\x0e\x66\xe8\x8f\x61\x2a\x94\x4c\xeb\x91\xb7\x95\x82\x20\x2e\x55\x27\x12\xc5\xd1\x74\x6b\x9e\xf5\x24\x21\xc7\x42\x38\xd9\xee\x2a\x01\xc2\xe5\x86\x33\xf7\x2d\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\x11\x99\xd8\x2b\x9a\xfd\x07\xa4\x3a\x6c\xc0\xe3\x64\x5b\x26\xf9\x6b\x4b\xd7\x81\xe5\x47\x69\x34\xae\xe7\xc2\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x46\xbc\xa8\x30\x3a\x1a\xfb\x2c\xd3\x9e\xea\xd8\xff\x3f\x8e\xed\x7f\x47\x1c\x25\x0d\xd8\xfb\x5b\x5b\xff\xb3\xb3\xf5\x37\x63\x27\x6b\xc0\x46\x56\x9b\x26\x3b\x17\xf8\xf5\x58\x82\x1a\x8b\x64\x6b\x44\xaf\x20\xf9\x6b\xc6\x59\x9a\xa7\x06\xe7\x94\xc1\x67\x36\x09\xbe\x76\x55\x74\x27\x46\x17\xbc\x35\xd7\x99\x1b\x59\x0c\x58\x79\x93\xb2\xc4\x6c\x23\x26\x4a\x8e\xe9\xc4\xe0\xba\xca\xa3\x08\x00\xfb\x7a\x95\x55\x89\xaf\x7b\xe1\x4d\xa1\x8f\xc3\xcb\x7a\xf4\xa6\x1e\xb7\xb4\xb5\x31\x71\x96\xaf\xbf\xda\x6a\x8e\x91\xcc\x9a\xa1\xcb\x3f\xbc\xed\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\x7f\xc5\x9b\x8c\x54\xe4\xda\xc6\x62\xb7\xd2\x01\x68\x5a\x52\x22\x9c\xfc\xad\x6c\x9b\x62\xf3\x9c\x79\x2a\xa4\xb4\xf7\x6d\x20\x05\x50\x9d\x4b\x20\x23\xaa\x1f\x93\xe0\xd7\xd7\x15\x6a\xe9\x09\x4d\xf0\x9b\xba\xa2\x70\x55\x8e\x31\x02\x6f\xd5\xdc\x33\x42\xbc\xb0\xe5\xdc\xd7\x16\x78\x6b\x53\xca\xfa\x42\x68\xfd\xa3\x45\xb0\xde\x0a\x7e\x78\x63\x00\xde\x73\x7d\xb6\x3d\x3b\x2f\x6b\x1b\xbe\xc5\x91\x16\x24\x4b\x68\xd1\xa4\x08\x77\xe0\x47\xe4\x41\xa7\x63\x88\x6e\xde\x3a\x97\xe7\x81\x02\x08\xf1\x2a\x23\xa6\xc7\xf9\xa0\x17\x89\xf4\xc8\x90\x04\xfb\x7f\x83\x44\x0c\x8e\x52\xaa\x34\xc8\xa3\x58\x44\x8e\xc5\x75\x23\x33\x0b\xe3\xa3\x5e\x1a\x1f\x62\x1b\xdc\x8b\x6a\x53\xc4\x52\x29\x04\xf3\x7e\xa7\x0c\x92\x01\x18\xea\x2a\x50\xe1\x2f\xd5\x53\x33\xcb\xdb\xb8\x71\x6d\x79\xd4\x66\x49\x35\xdd\xcd\x1f\xdf\xd5\xdc\x52\x2e\xd2\x80\x65\xe3\xa9\xb9\x94\x1b\x0b\xad\x68\xc0\x95\xbc\x43\x6e\xe4\x9d\x11\x8d\x77\xc5\x75\xbc\x83\xa5\x8f\x1b\xf0\x74\x36\xe1\x2a\x6e\xce\x4d\xfc\x00\x15\x82\x1f\xc6\x3d\xdc\xa0\x0d\xad\x21\xb7\xf0\xc7\x70\x09\x37\xf2\xd5\x75\x5d\xc1\x1f\xcf\x0d\xdc\xcc\xe7\x36\xa9\x08\x3c\x55\xd7\x6f\x03\xb6\xf0\x26\xed\xe0\x8d\xd9\xc0\x1f\xcc\xd5\x5b\xdf\xcd\xbb\x03\x2e\xde\xda\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xf4\x0a\x22\xc1\xe3\xad\x39\xcc\x4c\xc9\xc8\x70\x7e\x94\x9d\xd6\xd9\xa9\xaa\x19\x0d\x63\xea\x2a\x63\x1b\x8d\xca\x66\x70\x78\xff\x84\x13\x28\xd0\xb5\x60\x57\xb9\x4d\xd1\xb9\x5b\x21\x6f\x12\x41\x63\x75\x94\x09\xfb\x7f\x45\xbe\x42\x29\x51\xc1\xbe\xab\x5e\xa6\xc2\x63\x1b\xc4\x6c\x7a\x47\x93\x9b\xf8\xa3\xb8\x25\x62\xa8\x81\x93\x03\xc6\xfd\x3e\x1e\x96\xd4\xc0\xc2\x3a\x19\xd0\xda\x5c\x7d\xf9\xc2\xdf\xfc\xfc\xcc\x8e\x68\x60\x55\xea\xe1\xad\xc0\xee\x45\xf7\x9b\x81\xdd\x8d\xc3\x3c\xa9\x9a\x82\xad\x79\xb8\x4a\x6f\x5e\x16\xb5\x7d\x5f\xe2\xbc\xe1\xb4\x51\x1e\x13\x97\xf2\xf5\xfc\x36\xad\x76\x00\x4b\x55\xf4\x0b\x01\x2b\xf7\x59\x8d\xaf\x4f\xfb\xd6\x68\xdc\x9a\x4b\x76\xc5\x5c\xf2\x48\x41\x20\x3b\x28\xe8\x3e\xd1\xc0\x8f\x56\xd0\xdd\x60\x94\x92\x40\x7f\x90\x34\x82\x7e\xe3\x32\x82\x3f\x4e\x24\xce\x25\x75\x04\x30\x88\x7c\xfe\xf0\x70\x80\xd8\x9e\xa6\x90\x38\x8b\x29\xa9\xc3\x3c\x49\xa6\x24\xcf\x04\xaf\xa6\x19\x5b\x5f\xfb\x6c\xd6\x2a\x9a\xe4\x17\xbc\xa5\x10\x2c\x33\x29\x1c\xcf\x94\x39\xe7\x86\x06\x17\x0d\xba\x50\x90\xc4\xaa\xc6\xb4\x92\x1b\xab\xd8\xc8\x2c\xdf\xf0\x3f\x4c\x9b\x2d\x22\xfd\x2a\x13\x9a\xa7\x87\x42\x46\x6c\x90\x4c\xc9\x98\x26\xa1\x1b\x0b\x25\x37\x2c\x49\xdc\x34\x3d\x72\x05\xda\xba\x14\x2c\xef\x4c\x04\x1f\xe1\xe2\x28\xf7\x5d\x00\x21\x32\xcf\x46\x09\x50\x9e\x67\xf6\x7d\x86\x13\x4f\x45\x2e\xfd\xfb\x7a\xc1\x31\x51\x74\xdd\x67\x49\xa7\xd4\x6b\x6c\xe5\xc6\x86\xfe\x34\xb9\x32\x02\xc0\x1b\x5f\xc5\xb9\x53\x9e\x53\x4c\x40\x4a\x16\x3b\x3b\xbf\xfd\x2d\x93\x62\xc2\x62\xeb\xdd\xf0\x60\xc3\xae\xc6\xb6\x9b\x4c\x38\xcf\x5c\xf0\x2e\x87\x11\x45\x41\xc5\x9d\x22\xbb\x67\x76\x1e\x1b\x41\xc0\x63\xec\x2f\x63\x24\x7c\x91\x55\xf2\xd6\x27\xcc\x76\xc6\x2d\x41\x8e\x1c\x70\x41\x04\x06\x7e\xe6\x9c\x69\xdb\x6d\x7d\x9c\x6b\x12\x8b\x5b\x7e\xb8\x91\xd7\x15\x1d\xad\xd7\x0b\x01\x54\x75\xbf\x2e\x92\x73\xec\xf7\xae\x06\x2f\x53\xce\xf4\x39\x24\x39\x57\x50\x93\xbd\x37\x26\x1c\x7d\xf3\xc7\xed\x68\x04\x4b\x41\xe4\xfa\xa3\x68\x7f\xb7\x63\x16\x8d\xcb\xc2\x2c\x4b\x41\x11\x91\xcf\xa8\xc5\x2f\xdd\x63\x8b\x77\xa8\x55\x01\x17\x8d\x6d\x0d\xbb\x0b\xac\x5f\xae\x61\xe9\x7c\xfc\x5e\xa9\x21\x33\x86\x66\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\xdc\xf9\xe4\x65\xa6\x9f\x73\xf6\xef\x1c\x08\x4d\x85\x91\x85\x93\x72\x18\x60\x07\x35\xfa\xd2\x0f\x78\x92\x9b\x0d\x18\xdc\x92\x21\x63\xf7\xf8\xfa\x61\x91\xd8\x83\xfe\xe1\xa3\x22\x1f\xbb\xab\x56\x11\xdc\x62\xe4\xc6\x52\x57\x2d\x4a\x38\x68\x73\xf2\xac\x44\x69\xbb\xac\x31\x3e\x4a\xca\xc2\xe4\x76\xe4\xaa\xae\x4e\x54\x57\x23\xea\x16\x5f\xd0\xdf\x56\x31\x6a\xa4\xbb\x57\xb1\x86\x86\x7a\xe2\x14\x54\xdb\xab\x01\xb6\x69\xb1\x57\x03\xac\xe8\x71\xd1\x27\x34\x8e\x25\x8a\x29\x78\xea\xd3\x99\xde\x98\x59\x11\x4b\xd3\x21\x2f\xc8\xb7\xe4\x8e\x7c\x8b\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x63\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\x9d\x06\x69\xc4\x22\xb7\x13\x8f\xda\x7b\xc9\x2c\xf0\x23\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xf9\xac\xdf\x21\xd7\xa7\x7d\x6c\xea\x73\x75\x7a\xdd\xaf\x4a\xd8\x7b\xd7\xa7\xfd\xbd\x47\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\x37\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\x3c\x2f\xd7\x6d\x9b\xe6\xf3\x89\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\xef\x9d\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x2c\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x5c\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xe9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\x3c\x07\x15\xd0\xf7\x5c\xad\x9f\xa3\xf2\xd6\xcf\xb4\x7e\x58\x1f\x39\x5f\xf0\x2b\x5a\x42\x54\x66\x26\x91\xc5\x94\x89\x04\x1a\x4f\x71\x4a\xec\xf3\x50\x12\xb2\x9e\x60\x74\x60\xc2\x52\xb6\x5d\x5a\x10\x99\x3b\x34\xaf\x70\xae\x92\xd7\xc5\x80\x25\xa5\x77\x78\x00\x68\x2a\x72\xdb\xfa\x35\x12\x69\x96\xeb\x2a\x4c\x71\x7b\xb6\xe9\xda\x3a\x64\x23\xc7\x51\x8f\x6c\x83\xd9\x6e\x98\xb6\x5b\x6a\xea\xfa\x88\xad\x5a\x69\xec\xa3\xe6\xfa\x4d\x04\x8d\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x41\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\x70\xff\x68\x69\xc3\x73\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xdd\x56\xf6\x93\x65\x06\xa4\xab\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x73\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc8\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x76\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\xff\x7f\xf6\xde\xc7\x3b\x6e\xdb\xf8\x17\xfd\x57\x70\xd4\x9e\x2b\xa9\xd9\x5d\xd9\x49\xdb\x6f\xea\xdb\xd7\x1c\x55\x92\x13\xbd\xd8\xb2\xae\x25\x27\xb7\x2f\xce\x37\xc5\x92\xd8\x5d\x54\x24\xc0\x12\xa0\xe4\xed\xcd\xfd\xdf\xdf\xc1\xcc\x00\x04\xb9\x2b\x5b\x22\x69\xaf\xe4\x2c\x7b\x4e\x63\xed\x72\x41\x70\x00\xcc\xef\xf9\x4c\x6d\xcf\x83\xf9\x3a\xd5\x3a\xa3\x6a\x84\x6c\x59\x8f\x2f\xd1\xf5\xa6\xf4\x2f\x4a\xdc\xfc\xe2\x46\x33\x6c\x96\xf1\x79\x30\xe3\x8d\xb0\x2b\x9e\xb8\x7a\xe8\x5b\x5f\x00\x52\xfd\x2b\xc1\x78\x76\xc3\x97\xa6\x76\x6a\xd4\x63\x48\xf3\x8c\x3d\xdd\x87\x8d\xc7\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xcd\x1d\x1d\x9e\xff\x72\xf1\x8f\x8b\x5f\x0e\x8f\x5f\x9e\x9e\xb1\x33\x6d\x05\x8a\xa4\xa8\x49\x5a\xc2\x95\xb3\x10\x68\x96\xf0\x0c\xb0\xa0\xb5\x99\x80\x5f\x51\x1a\x76\x23\x55\xaa\x6f\x4c\x67\xff\x29\x6e\x3f\x47\x3c\xc1\x55\xa7\x31\x12\x5e\x70\xe8\xfd\xd6\x43\x3e\xac\x64\x7f\xc4\x83\x82\x04\x4e\xd3\x83\xb4\xd4\x05\x12\xc1\x3b\xa0\x62\x23\xe9\xb8\xe5\x57\xf6\xf9\xa5\xb0\xbe\xb3\xe6\x80\xf3\x92\x2b\x5b\x7b\x62\xea\x35\xa3\xa6\x73\x93\xde\xcb\xf1\xb8\xab\x8d\x78\x3a\x5c\xa5\xd1\x61\x9a\x8a\xb4\x41\xfe\xcf\x2e\xab\xef\xc8\xbf\xdc\xb2\x06\x63\x60\xe7\xaf\x2e\x4e\xff\x77\x6b\x1f\x2f\x8b\x7e\x49\x4c\xc3\x14\x80\x96\xba\x18\x6c\x75\x5f\x8b\x5c\x5f\x6f\xd7\xf7\xa1\xac\x6f\x90\x96\xc3\x84\xce\x5f\x57\x2a\x16\x68\x2a\x1a\x9f\xe5\x3a\x15\x13\x76\x1e\x7c\xf8\xcd\x6f\x63\x90\x99\x52\x30\x77\x8b\xb2\x92\x67\xd9\x32\x56\xa6\xac\xc6\x0a\xc1\x06\x04\x41\xcc\xc8\x67\x3c\x33\x9b\xe6\xc6\x7d\x64\xa3\xd3\x23\x5e\x3a\x6b\x76\x90\xe5\x08\xa3\xb1\x54\x28\x6d\x49\x19\x76\xb3\x04\x58\x87\x52\x27\x0c\x4d\xe7\x28\x51\xaa\x21\xdf\x0c\xc6\x11\xbc\x68\x94\xc6\x13\xfb\x3c\x8c\x8c\x4e\xe4\xca\x08\xb3\x5e\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x89\xeb\x20\x3b\xe0\x47\xd2\x96\x81\x20\xcd\x4c\x2f\x0e\xcf\x1d\xc3\x6a\xc0\xa1\x8a\xab\x6b\x8f\xeb\x15\x7f\xec\x47\xaa\xac\xd4\xa1\xf9\xb6\xd4\x55\x67\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xac\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\x9f\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x1d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0d\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\xb6\xce\x99\x56\xee\x60\x0e\xb2\x79\x4e\x43\x14\x96\x48\x1a\x6f\x15\x88\xe7\x92\xf5\xc7\x21\xaa\x0b\xc7\xb2\x32\xa2\xc4\x10\x74\x59\x09\x5c\xc9\xef\xab\xa9\xc8\x1c\xe5\x9d\x49\x4a\x1d\xb3\xd1\xf1\x20\x73\x3e\x17\x8c\xdb\xb0\xd3\xac\x66\x42\x19\xc7\x31\xd1\x7d\x69\x59\xaa\x45\x5d\x19\xcf\x0d\x7b\x73\x7a\xcc\x9e\xb0\x3d\xf7\xac\x7d\xd8\x3f\xd0\x50\xdb\x6a\x4c\x40\x6b\xdb\xa8\x33\x3f\x04\x4c\x09\x36\x2f\xd3\x25\x32\x89\x11\x53\x9a\x99\x2a\x59\xc4\x5d\xbc\xbd\xd9\x4c\x49\x8a\x10\x18\x79\x98\x7b\x7d\xb3\x1c\xea\x8d\x11\xe5\x60\x0c\xea\x4d\x07\x06\x15\xab\x51\x6e\xcf\x35\xa9\x87\x1b\x2b\x17\x96\xa7\xdc\x72\x62\x5c\xa1\xab\xfa\x43\x5d\xd2\xdf\x36\xfb\x32\xe2\x85\x54\xd5\x3b\x74\x91\x0e\xe7\x6a\xb9\x38\x81\x61\x61\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\xa7\x8d\xbd\x32\xba\x45\x4d\x04\x3e\xe1\xe3\xd0\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x20\xe8\xcd\x93\x45\xfc\x80\xed\xee\x6b\x5e\x0f\xc4\x29\x94\x89\x6b\xd1\x03\x42\xab\xb5\xf3\x5e\xb8\xd1\x1c\x71\xfc\x8e\x80\xe1\x59\xc6\xa7\x22\x43\x1a\xe3\x0e\x34\xab\x3b\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x0f\x51\xcf\xda\x74\x70\x7a\x43\x93\x0e\x20\xbc\x1f\x3a\x1d\x8c\x48\x12\x9d\x17\xe7\xa5\x76\x66\xe7\x60\xb2\x89\x86\xad\xe3\x7c\xe8\xd8\x00\xbf\x7d\x6c\x01\x53\x54\xaf\x79\x33\x2f\xa3\xa4\x4b\x6e\x51\x48\xf8\xcc\xcb\xff\x11\xc9\x2c\x60\x3d\x6d\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\xc7\x2c\x0e\x86\xa8\x5b\xe8\xe1\xec\x1c\x44\x1a\xe9\x84\x67\x00\x91\xda\x6f\xcb\xb1\xf6\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc4\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x32\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x62\x02\x57\x68\x41\xee\xc2\x91\xf0\x83\xfa\xf3\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\xc8\x6e\xa5\x61\x3b\x2f\x3c\x01\x7a\x20\x55\x3e\x44\x09\xb3\x83\x6f\x18\x56\x13\x3d\x9d\x57\x52\xa5\x94\x4a\xdb\x20\x96\xb7\x73\x49\x0f\x86\x24\x6d\x99\xc6\xbc\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\xde\x1e\xaf\x51\x65\xf6\x3e\xba\xf1\xfb\x1d\xaf\xe1\x21\xed\x61\xde\x28\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\xe2\x7e\x43\x5b\x31\x3f\xe2\xb0\x5e\xa5\x4f\xdc\xb6\xb6\x52\xcd\x4d\x6c\xc9\x34\xf1\xf0\xd7\x9b\x32\x7e\x85\x67\xa5\xc6\x12\xcc\x55\x13\xa2\x55\x02\xf0\x58\xcc\x90\xcc\xa9\x13\x8f\xdc\x08\x99\xe7\x86\x1f\x95\x8e\x12\x56\xf2\xec\xa2\xe8\x0e\x1f\xca\x56\xa0\xea\x5e\x5e\x1c\x36\x87\x06\x61\xbd\x10\x25\xca\x7e\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\x6b\xb0\xb2\xa2\x2c\x2b\x23\xe7\xe6\x80\xf6\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\x4c\x26\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\x9e\x99\x92\x15\x56\xa7\x89\x80\xcc\x6e\x17\x6c\x9c\x61\xaf\x2e\xcf\x59\x4f\x48\x94\x0f\x2c\xd1\x19\xed\xed\x36\xea\xd9\x5a\x3a\xa2\xf6\xb8\x71\x22\x91\x72\x91\x08\x33\x1c\xd8\xd2\x77\xf5\x98\x2c\x15\x58\x61\x23\x20\xfb\x89\xdf\x9a\x0e\x07\x7e\xe9\x5d\x28\xd4\xa4\x9f\xee\xc6\x1a\xf5\x65\xcd\x5c\x9c\x3d\x92\x15\x0b\x3e\x46\x23\xdd\x71\x34\x60\x81\x5e\x85\x58\x68\xa5\x4b\xdc\xa2\x4e\x88\x6a\x05\x5b\x1a\x58\x14\x46\xf3\x60\x4d\x88\x45\x47\x53\x3d\xaa\xa3\xc4\x71\x20\x10\x0a\xbd\x10\xdb\xa1\x9e\xc3\x8d\xb4\x0b\xc0\x60\x5d\xb4\xa2\x86\x30\x93\x52\x18\x08\xc0\x28\x26\xca\x52\x97\x94\x90\xe5\xfd\xd6\x30\x12\x70\x72\xc8\xe8\x72\x9b\x84\xbb\xbf\x76\x4d\x1c\xa8\xae\x11\xcf\x21\xc7\xd0\xed\x26\x31\x9b\x89\x04\x14\xad\x98\xc0\xc8\xb5\xf7\x6a\x50\x5a\x5f\xc2\x61\xb5\x47\x4c\xcf\xe5\x3b\xf7\x94\xf8\x57\xad\xbe\x2b\x4a\xab\xf1\xfa\xaf\xf7\x27\x8c\x9d\xaa\x90\x7f\x3b\x72\xab\x18\xdf\xe9\x53\xcf\xac\x7b\xc5\x18\x6e\x1f\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\x74\xb0\xc5\x40\xbf\xdb\xb5\xc5\x40\xbf\xe3\xb5\xc5\x40\xdf\x62\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x81\xfe\x79\xe1\xda\x6c\x31\xd0\x37\xed\x62\xde\x62\xa0\x6f\x31\xd0\xdf\x77\x6d\x31\xd0\x3f\x70\x6d\x31\xd0\x3b\x5c\x9f\x01\xe7\xda\x62\xa0\x77\xb8\xb6\x18\xe8\xeb\xaf\x2d\x06\xfa\xea\xb5\xc5\x40\xbf\xf5\xda\x62\xa0\x77\xbe\xb6\x18\xe8\x5b\x0c\xf4\x2d\x34\xe4\xfd\xc6\x7a\x98\xd0\x90\x6c\x8b\x81\x4e\xd7\x16\x03\xfd\xb3\x00\xc0\x63\x5b\x0c\xf4\x3b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\xb9\xb8\x4b\xb6\x18\xe8\x5b\x0c\xf4\xdf\x8e\xa2\xbb\xc5\x40\xdf\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\xef\x9d\xc5\x16\x03\xfd\x73\x30\x01\x8d\x4d\x65\x27\x58\xc8\xbb\x20\xd8\x50\x66\x72\x54\x30\x3e\xad\x66\x33\x51\x02\xe7\x82\x27\xaf\x24\x4f\xd5\x60\x7d\xed\x20\xab\xb0\x23\x00\xc3\xa1\x22\x8e\x5b\x7e\x4e\x15\xea\x00\xdf\x58\xa7\x0f\x9f\xbc\x7a\xbe\x06\x2e\xa7\x73\x56\x61\xd7\xc4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x15\x15\x11\xdd\x93\x4c\x1b\x4a\x7b\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa2\x4c\x9f\x18\x5b\x0a\x9e\xfb\x64\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb2\x40\x41\x15\x88\x01\x59\x71\x75\x5e\xf3\xa8\x7e\x1a\x4d\x4b\xc7\x78\x65\x60\x6d\x8e\x00\xe2\x39\x2f\xec\x92\xb9\x57\xce\x08\xf6\xb5\x34\x96\x25\x99\x04\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\x65\xb5\xa2\x99\x1a\x9a\xaa\x4a\x41\x6d\x2d\xac\x61\x90\x06\x5c\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\x30\x2d\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\x40\x44\xdd\xde\x44\x07\x56\xbd\xd1\x21\xef\xdd\x6f\xce\x51\x23\xc5\xbf\x56\x28\x20\x4b\x6f\xe5\x18\xc0\x02\x28\x71\xed\xf6\x80\x48\x84\x93\xaf\xfc\x96\x5d\xff\xc9\x37\xbd\xe5\xe5\x5c\xd8\x90\xcf\xd4\x35\x57\xbc\x99\x16\x12\xc3\xfd\xc6\x86\x48\x4d\x32\xa0\xce\xb9\x4e\xa1\xe4\xa7\xae\xab\x5a\x87\x27\x8c\x33\x24\x18\xb5\x75\x37\x78\xc5\x08\x53\x34\xc3\x43\x4d\xc1\x13\x61\xd8\xde\xe9\xf9\xd1\x88\x9d\x9f\x1e\x53\x1e\xa6\x9e\xad\xab\x63\x26\x1e\x86\x3b\xf0\x36\x64\xe3\x80\xd0\x16\x0d\x1f\xd5\x7e\xd2\xb3\xcf\x83\x7e\xf5\x56\x51\x7a\x69\x9b\x03\x80\xca\x15\xd0\xcd\x99\xa9\x40\x45\x22\x9f\x90\x0c\x85\x19\xb4\xf9\x44\x5d\x8e\xe8\x71\x87\xfc\x2f\xc2\x44\x88\x4a\x54\x75\xe1\x63\xdd\xc0\x60\x41\x5e\xaf\x94\x76\x40\x2a\x28\xe5\xbd\x74\xca\x77\xe9\x65\x21\x45\xaa\xd8\x4b\x61\x0c\x9f\x8b\xf3\x8e\xe1\xad\xdb\xfc\x00\x10\xe1\xaa\xd9\x01\x30\xa0\x0c\x0b\x7d\xc3\x27\x75\x4e\x70\x53\xf9\x66\x39\xce\x29\xec\xac\x9b\x52\x5a\x2b\x80\x95\x00\xd8\x1f\x2c\x76\x1b\x0b\x60\xb7\x95\x59\xfc\xd2\x0f\x52\xff\xd8\xa9\x12\x2a\xc5\x3c\xdf\xa9\x60\xd3\x52\x8a\x19\x9b\x49\x48\x1e\x86\x74\xde\x11\x62\x3f\x71\xf4\x3d\x19\x23\x4a\x98\x0f\x59\x50\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\xc2\xa6\x23\xa4\xdc\x43\xb1\xab\x9c\xb1\x39\xa4\x03\x93\x8d\xf2\xc7\x27\x7f\xf9\x33\x9b\x2e\x9d\x22\x05\x1b\xd2\x6a\xcb\xb3\xf0\x92\x99\x50\x73\x47\x2b\x14\x0a\xcd\x72\xcd\x40\x01\x68\x0b\x82\x13\x7f\xfa\xe5\xd5\xb4\xa9\xd9\x1d\xa4\xe2\xfa\x20\xa2\xdf\x38\xd3\xf3\x09\x3b\x0a\xd5\x91\x55\x91\x82\x9f\xbf\x3b\x54\xf7\x70\xdb\x4c\x67\x32\x59\xf6\xde\x68\x1e\x84\x8c\x2d\xf4\x0d\x5a\x98\x6b\x76\x4f\x5d\xf9\x55\xe8\xa2\xca\x30\xd4\xf1\x3c\x14\x3a\x57\x46\xac\x96\x23\xae\x3d\x17\xe0\x9c\xa7\x21\x5a\x7c\x94\xb2\xc0\xfd\x23\x35\x95\xb9\x90\xfb\x38\x60\x91\x01\x33\x79\xce\xb3\x6c\xca\x93\xab\x4b\xfd\x42\xcf\xcd\x2b\x75\x52\x96\xba\x6c\xce\x25\xe3\x4e\x46\x2f\x2a\x75\x85\xad\x20\x02\x5a\x83\x9e\x3b\x85\xbe\xa8\xac\x07\xf7\x5e\xf7\xc2\x58\xba\xef\x45\xbf\x37\xbe\xeb\x51\xc4\x3b\x59\x5b\xd8\x54\x35\x86\x3b\x32\x1e\xdf\xc4\x9b\xed\xcb\x27\x7f\xfc\x1a\xb7\x2e\xd3\x25\xfb\xfa\x09\x54\x0a\x98\x11\x1e\x62\x90\xa8\x4e\x3d\xc9\x79\x96\x39\x46\x1e\x6f\x4a\x47\xe8\x75\x9b\xf0\x93\xef\x41\xdb\x7f\xbb\xdd\x59\x81\xbf\xbc\xfc\x07\x48\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\xc4\x7d\xa0\x4a\xed\x01\xa8\xdd\xd7\x3a\xab\x72\x71\x2c\xae\xe5\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\xc8\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x94\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x1d\x66\xc9\x6f\x1a\xc4\x80\x33\x09\xc8\x09\x3d\xa1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x8e\x6f\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\xc6\x86\xa8\x07\xf4\xa7\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\xc3\xc6\x40\x05\xc0\x6d\x1f\x60\xc9\xdd\xdd\xfc\x03\xf8\xd4\xfb\x25\xba\x35\xe8\xa2\x42\x2c\x23\xe7\x96\x14\x42\x6f\xab\x70\x56\x88\xd2\x48\xe3\xe4\xf2\x0f\x70\xa0\x8e\x32\x2e\xf3\xc8\xf1\xbc\x19\x22\xe0\xe1\x06\x24\xe7\xfe\x9c\xd2\xd9\x29\x38\x20\xb0\x42\x44\xb1\x5e\xa3\xd6\x36\xb5\xda\x8b\x6a\x0a\xfb\x07\x6e\xbf\x4f\x43\xbd\x01\x25\xf1\xa6\x79\xec\x0f\xf5\x32\x34\x59\xac\xfb\x24\xf0\x58\xbc\xeb\x73\xe2\xac\xf0\x7e\x8f\x95\xb1\x86\xc9\x0f\xc4\x3f\x80\xa3\xd2\xe2\x36\x59\x68\xc3\xea\xc4\x13\x16\xd9\x02\x64\x40\x4e\x18\x26\x6d\xb8\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x5d\x91\x44\xa5\x2e\xf8\xbc\x57\x3f\xa2\x16\xa5\xda\xc3\xc6\x60\x19\xce\x7e\x8a\x58\x49\x41\x77\x39\x4e\xe2\xb1\x80\x00\xe9\x09\x83\xf9\x9e\xc0\x64\x59\x40\xbf\x38\x76\xc3\x97\x8c\x97\xba\x52\x29\xb9\x43\x83\x3f\xfa\x65\xeb\xc1\x67\x5a\x09\x1f\xe7\x69\x63\x6d\x40\x00\x4a\x2a\xf6\x74\xf2\xf4\xc9\xe7\x22\xe2\xe0\x0d\x5b\x22\xee\x2c\x88\x38\xe4\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x24\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x53\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x11\xf9\x16\x31\x28\x38\x6e\xeb\x5c\x63\xe6\x3d\x2c\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\x5b\x8b\x88\x76\xf2\xae\xe8\x81\x13\xda\x82\x7a\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x70\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\x90\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xbb\xbe\xf8\x59\x56\xc6\x43\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x02\xcf\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x6b\x99\x77\x49\x56\x19\x79\xbd\x29\x4e\x42\x80\x10\xc7\xb2\xd3\x3a\xb7\xc0\x29\x6a\x42\xad\xe0\x4c\xd4\x61\x82\x0f\xc0\x70\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\x39\xb1\x7b\x98\x49\x6e\xee\xab\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\xd3\x73\x8a\xa0\x79\xba\x49\xf5\x2f\x4c\xac\x09\x66\x09\x26\xca\xe0\x4f\xd0\xdd\x38\x63\x11\x28\x90\x4f\x28\x01\xe6\x0f\x48\x54\x60\x91\x28\xad\xc6\x8b\x08\xb4\xa9\xd0\xe9\x3d\x8b\xfc\xba\x1a\x1e\x9d\x4c\x8e\xf5\x14\x64\x0b\x9d\xa5\xbe\x87\x36\xfa\x72\xa6\xc2\xde\x08\xa1\xd8\xe9\x39\xd0\xcf\xbd\x22\x44\x84\x6e\xa1\x22\x86\x15\x00\x9e\x29\x32\x65\x1b\xf4\xbc\xef\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\x3e\xf3\xdf\x05\x9a\xf9\x8c\x6c\x3e\xd5\xd7\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x62\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xa3\x0a\x1b\xef\x13\x73\xb0\xd3\xf3\xa3\x1e\xdc\x6b\xf7\x0d\xc5\x45\xdc\x50\xbb\xbb\x86\xc9\x22\xa9\x63\xae\x13\x56\x87\x1b\xa3\x42\x09\xd4\x18\xef\x17\xeb\xea\xaa\x26\x46\x4c\xad\x27\x93\x66\x0a\x87\x71\x6c\x85\x8a\xa4\xc9\x9d\x03\x41\x87\x42\xa7\xd0\x7f\xa9\xa6\x86\xf1\xbf\x88\x09\xe2\x93\x25\x90\xc9\x53\xea\xc8\x28\x24\x21\xb7\x18\x13\xb8\xde\x7d\xfa\x61\xc4\xc5\x57\x88\xf9\xc9\x68\x79\x7e\x7a\x3c\xe4\x76\x29\x64\xfa\xe0\xb6\xcb\x1b\x73\xef\x62\xfb\xf7\xbf\x24\x20\xf7\x7d\xe8\x2d\x31\xd8\x44\x60\x7c\xf4\x37\xa4\xa9\x6b\xcb\xa8\xbb\x63\xc8\x84\x5d\x97\xd0\x01\x5c\xa4\xf9\xa4\x91\xfb\x7b\x56\x65\xb0\x49\xeb\xe4\xde\x90\x99\xcc\x43\x5e\x28\x68\x03\xfc\x9a\xcb\x0c\x71\x31\xf5\xed\x43\xfa\xf0\x7b\xa6\x79\x8a\xe5\x1e\x57\xa2\x54\x22\x63\xb9\x4e\xab\x0c\xbd\x79\xa1\x8b\xf0\xcb\x57\xc7\x6f\x5e\x9c\xf8\x24\x2c\x51\x2f\xe7\x88\x71\xa6\xc4\x0d\x8c\xae\x40\x21\x49\x08\x9e\x2b\x94\xfd\xb8\xf3\xe4\x11\x37\xd1\x0c\x45\xc7\x84\x7f\xa1\x5c\x5a\x39\x47\x18\xcd\x5a\x2d\x9c\x96\x82\x5f\xe9\xca\xb2\xeb\x2a\x53\xa2\xac\xbb\x60\x8a\x6b\xa1\xd0\x07\xeb\x7e\xe0\x1e\x1b\x23\x32\xca\xb2\x01\x84\x49\xf0\x68\x1e\xdc\x93\x27\xa4\xc9\x53\x89\x11\x7c\x19\xb5\x80\x6e\x34\x8a\x7c\x3f\x40\xa9\xd7\xbc\x22\x6c\x52\x2c\x27\x5e\x05\x26\xf5\x18\x92\x98\x46\x73\xe1\x33\x60\x28\xf1\xe5\xd3\x1d\x87\xfb\xbb\x5b\x9a\x15\xa2\x4d\x60\x15\x1a\xd0\xcb\xbe\x73\x9d\xde\x62\x35\xd4\x7a\x17\xdc\x1f\x37\xc6\xb6\x9a\x71\x86\xee\xf6\xb1\x07\xa6\x81\x4c\xd9\x2e\x6c\xf0\xde\x42\x13\x2c\x8f\xf3\x2a\xcb\x2e\x44\x52\x8a\xfb\x86\x19\x9a\x9c\xe2\xb4\x35\xd6\x6d\x16\x40\x64\xce\x02\x5a\x07\xdd\xac\x6a\x4c\xd8\x28\xcf\xa9\xae\xc5\x2d\xaa\x0c\x52\xc3\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xd3\x95\xc6\x67\x99\x21\xf7\x69\xac\x82\x11\xe1\x61\xa1\xc5\x1a\x37\x06\x33\x0f\xa4\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\xc0\x28\xa3\x84\x2d\x4e\x68\xe5\x78\x96\x73\x8f\x71\x7c\xdf\x1c\xe6\xfa\x4c\x1e\xe0\xbc\x7f\x87\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\xdb\xe6\x91\xd8\x2d\x80\xd2\xff\x0a\x0c\x83\xd7\x7e\x7d\x3d\x1b\x32\x4c\x28\x5d\xcd\x17\x40\xac\x32\xe7\x1e\x30\x33\x13\x16\xb0\x10\x29\x9f\x01\x93\xd8\xe8\xb7\x29\x59\x19\x31\x36\x64\x73\x6f\x3c\x12\xdb\xa5\xab\x83\xb7\x95\x8c\x1f\xb1\x19\xa2\x91\xbd\xf7\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x34\xbf\xb1\x93\x09\x63\xa4\x88\x39\x00\xc2\x1e\xfc\x0e\xad\xa3\xcb\x57\xc7\xaf\xa0\xb1\x38\x79\xdd\xbd\xa8\x72\xa2\xc0\x4c\x18\x2f\xe4\x0f\xa2\x34\x00\x9d\x7c\x25\x55\x3a\x62\x95\x4c\xbf\xf9\x84\x09\x5f\x52\xc9\x3a\x8b\xb5\x17\xd7\x7a\x41\x5c\x89\xaa\xe8\xe5\x7f\x70\x7b\x46\x12\x74\x2a\x32\xad\xe6\x11\x06\x00\x48\xf3\x53\x25\xed\x4a\x0f\x66\xc4\x33\x05\x0f\x8f\x2e\x53\xc8\x15\x96\xba\x6c\x84\x33\xdc\x78\x80\xf2\x18\x65\x1c\x3b\x96\x26\x1b\xe3\x41\x1a\x97\xa9\x75\x24\x4c\x04\xf2\xe5\xc2\x1e\x04\xdb\xa3\x47\xa2\x2c\x5e\x70\x95\xc2\x9f\x49\xa2\xcb\x94\xe6\x2b\x6d\x48\x6f\xc6\x64\x38\xcc\xc0\x02\x31\xe4\x38\x1a\x57\xed\x27\x83\x9a\x56\xe6\x8d\x54\x58\xaf\xb5\x57\x4a\xfe\xbb\x12\x8c\xe7\xda\x31\xe2\x76\xab\x87\x16\x45\x72\xbe\x04\x59\x08\x53\x7d\xe1\xcb\x35\xa8\xc6\xd6\x8c\xd8\x6b\xe1\x94\xae\x1a\x26\x60\xc4\x5e\x34\x71\x03\x46\x6e\x2e\x17\x58\xd0\x4c\x1f\xe1\xec\x4b\x61\x74\x55\x26\xe2\x35\xc6\x38\x73\x9f\x4f\xb7\xfa\x32\x6e\x55\x2c\xbf\x12\x0a\x7d\x4a\x8e\x34\x10\xc6\xad\x4a\x58\x83\x64\x21\xd2\x0a\xa4\xca\x74\xc9\x66\x12\xfb\xbf\x80\x68\x97\xf3\x85\x30\xd6\xdb\x46\x07\x90\xa3\x56\xb7\xd2\xf3\x13\x80\xed\x1b\x25\xb3\xd7\x5e\xd8\x9c\x03\x3a\x39\x1c\x59\x6e\x7d\xbd\x16\x6a\x83\xa6\xca\xfd\x59\x6e\x53\xda\x4c\xd8\x0b\xf7\x28\xdc\x4f\x51\x5f\x0d\xd9\x22\x2e\xc4\x98\xc9\x8d\xcc\x66\xdc\x2c\xa0\xeb\x4c\x7b\x09\xa8\x65\x45\x52\x95\x8e\x61\x20\x92\x3c\x4f\x53\xc7\x5d\x4b\x56\x62\x63\xf9\x75\x7e\xc7\x9e\xf5\x39\x6e\xb2\xe3\x48\xde\x3d\x16\x21\x76\x18\xea\x2d\x1c\xe1\x93\x16\x27\xc0\x95\x74\x02\xcb\x23\xae\x39\x85\x3b\x04\xfc\x1d\x57\xf8\x74\x22\xa9\x7b\x78\xbf\x53\x58\xbe\x8f\x04\xe4\xe5\xbc\xbf\xe3\x6e\xf7\xb0\x9c\x57\x78\xd0\x89\x0b\xd7\xb8\xf3\x93\x56\xde\x3d\x28\x53\xce\x56\x3d\x7a\x79\x1c\x17\xfa\xc5\x15\x4c\xbe\x4c\x72\xc2\x7e\xe8\x1b\x66\x69\xc7\x59\x1c\x43\xaf\x83\x37\x75\xd7\x18\xc7\x34\xb2\x6b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x24\x09\x6b\x9f\x89\x4a\x16\x5c\xcd\xc1\x4d\xa2\x2b\x37\xde\xef\x7f\x0f\x33\x2a\x45\x5a\x25\xd4\x72\xc7\xef\xda\xdf\xfb\xa0\x03\x01\xdd\x01\xbb\x32\x09\x2f\xfc\x9c\xe3\xd7\x32\x4b\x65\xf9\xbb\x67\x4c\x4e\xc4\x84\xed\xfc\x3e\xfa\x6a\x07\x9f\x5e\x94\xda\x3d\x82\x0a\x8c\x60\x56\x99\xb4\x90\xe8\xb3\x13\xdf\x3d\x61\x27\xee\x19\x10\x88\x0d\x04\x8c\x6a\x60\xa6\x35\xf9\x46\xac\x14\x73\x5e\xa6\x19\x39\x0c\x6f\xa2\xc2\xa9\x40\x30\xf1\x4e\x1a\x6b\xc8\x5b\xd0\x83\x39\x59\x6e\xae\x1c\x2b\x72\x87\x6b\x9c\x72\xcb\xc7\xd1\xa9\x3e\x40\x53\x6b\x4c\x58\xe0\x63\x4e\xbb\xab\xe6\x5a\x07\xbf\xa3\xfa\xe3\x31\x0f\x77\x49\xa7\x94\x03\x2a\x77\x77\x55\xe7\xb1\x79\x89\x7b\x40\xc2\x37\x0f\xf0\x49\xdd\x27\x02\x68\x00\x5d\x96\x6a\x95\x29\xf0\x51\x42\x3d\xbf\xe5\x48\x9f\x9c\x5d\xbe\xfe\xc7\xf9\xab\xd3\xb3\xcb\xed\xc9\xde\x9e\xec\xed\xc9\xee\x71\xb2\x85\xba\xee\x7d\xaa\xbd\xf5\xb4\x2e\x6f\xa1\x0d\xc6\x1a\x95\xe0\x7d\x46\xd9\xa1\x27\xea\xfa\x07\xee\x94\x69\xf2\x6b\x53\xd0\x75\x4d\x1a\x07\xdd\x80\xaa\xfb\xd1\xa3\x4f\x0f\xdd\x60\x72\xe7\x80\x49\x73\xb1\x63\x65\xdd\xaa\xc5\x3d\x42\x8f\x7e\x39\x3d\x3e\x39\xbb\x3c\x7d\x7e\x7a\xf2\x7a\xa3\xd9\x4e\x3d\xc1\x50\x9b\x72\xb9\xa3\x94\x2c\x4a\x71\x2d\x75\x65\xb2\x65\xc0\x53\x5f\xcf\x04\x56\x13\x66\x55\x0a\x1e\x0f\x0f\x19\xbf\xf6\x67\x5b\x61\x3b\xac\xb0\x6d\x26\x7f\xf5\xc0\xc1\x1a\x6a\xfb\x3e\x2f\x75\x3e\xd0\x16\xbe\x40\x5f\x8c\x0f\xb6\xad\xdb\x4f\xbb\x04\x99\xd3\x10\x3d\xa4\x3c\xd6\xf8\x3c\x4e\x1f\xcd\x0b\xdb\xa3\x59\xce\x20\xf0\xd7\xc3\x20\x45\x63\xc2\xd9\x4b\x5e\x7c\x2f\x96\xaf\x45\x4f\xb8\xad\x26\xbd\x45\x26\x12\x27\xe8\xd8\x95\x58\x62\x76\xf1\x91\x7f\x58\x1f\x58\xb0\x07\x89\x1e\x7e\x25\xfa\x20\xbb\x0f\x09\xfb\x7d\x25\x7a\x64\x4e\xfb\x6b\x05\x00\xdb\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xf2\xfb\x23\xc0\x9c\x7f\xbe\x71\x94\xe6\x35\xe0\x2a\xf8\xf0\xed\xc0\x2b\x81\x91\xf4\x65\x43\x76\x05\x26\xc2\xb0\xa6\x19\xf6\xa6\x0f\x3d\x90\x92\x31\x10\x69\xfa\x76\xdb\x64\xb8\x84\xc3\xf2\xd5\xdd\x9a\xb1\x62\xce\x45\x00\x74\x4c\x9f\x79\x0c\x10\x13\x5a\x64\x42\xd3\xe9\x51\xf3\x4f\x4a\x6b\xf9\x67\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xff\xfa\xfd\xc9\x3f\xfe\xb6\xbb\xfb\xf3\x3f\xe3\x6f\x41\x14\x62\x78\xbb\x79\x0b\x00\x9a\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x86\x50\xe8\x0b\xc0\x23\x98\x60\xea\x5d\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\x79\xf3\x41\x0a\x06\x58\xa2\x1e\xe5\x71\x78\x0d\x27\x1e\x6a\x5e\x32\xf0\x51\xa5\x51\x43\xa7\xa7\x64\x21\x72\xc4\xfe\x7b\xee\x49\x00\x6d\xbc\x3d\xf0\x89\x02\xb4\x08\xa7\x99\x36\x61\x58\x77\xae\x9f\xee\x3c\x28\x01\x13\x56\x70\x60\x82\x01\x45\x88\x5a\x78\x90\x83\x80\x0d\x69\x2e\xa1\xcd\xec\xe1\xf9\x29\xbb\x46\x0a\x3f\x18\xe2\xf8\xf0\xe6\xf3\x8f\xca\xe3\x42\x10\xb5\x5d\x95\xfe\x0c\xd3\xca\xfc\xf7\x84\x10\x62\x02\x54\xa4\x70\x86\xcd\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x19\xfe\x0c\x95\xc9\x63\x63\x75\xc9\xe7\x50\x18\x86\x3f\xc7\x9f\x85\xbf\xf0\x87\x8d\x07\xac\xfe\x1a\x4d\xe1\x3a\x96\x4a\x1c\xb9\x23\xd2\x4d\x7d\x3d\x40\xde\xe6\x49\xff\x40\x58\x5b\xd2\x17\xaf\xac\x79\x35\x37\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\x24\x55\xcc\x8f\xea\x2c\x36\xf0\x06\xa8\x6b\x67\x59\x76\x46\x9a\xac\xaf\x01\xb9\x59\x2a\xaf\xa5\xd1\x3d\xca\xdf\xc2\x40\xb7\x67\x3c\x12\x68\x0f\x66\x71\x05\xb7\xd9\xbb\x02\xc0\xf5\xc2\x79\x6d\xb1\xfd\xa7\x7d\xfa\xeb\xe1\x55\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xde\x53\x1f\x00\xeb\x1a\xaf\x21\x11\xaf\x9b\x23\x0e\xb2\xfd\x3e\x62\x9b\x17\xbc\xfc\xf6\x1a\xfa\xfc\xbf\xf6\x5c\x33\xca\xea\xf1\xe2\xfa\xc1\x1c\x70\x4c\x0b\xfd\x14\x9e\x1c\x7c\x52\xb3\x60\x2c\x98\x16\x9f\x9b\x9c\xfb\x2d\x38\x77\x42\x83\x56\x58\xd7\x5a\x13\x9d\x95\x3a\xf7\xb0\x14\x10\xde\xc0\x02\x4a\xba\xef\x4a\xf4\x6a\x19\x8e\xd7\xd6\x19\xb4\x75\x06\xdd\x72\x7d\xd0\x19\x84\x45\x04\x0f\xd7\x13\x24\xd4\x75\xd7\x10\xc6\xda\x08\xba\xb7\x75\x62\xf0\xc7\xbb\x05\xd4\x26\xfe\xa8\xd7\x9d\x8d\xeb\x64\x1a\x14\x68\xf9\xfa\x18\x26\x3b\xcc\x32\x26\x15\x1e\x7c\x18\x20\xd4\x62\x09\x34\x6d\x7c\x11\xf1\xb5\x9b\x42\xa8\xba\x6a\x80\x27\x43\x6e\xb1\x54\x73\x2a\x8c\x42\x51\x42\xd1\x27\xa9\x6a\xd8\xe9\xa0\x1c\xd6\xbd\x0a\xb8\x31\x3a\x81\xa6\x60\x58\x69\x15\x30\x29\x69\xda\x30\x1b\xcb\xaf\x20\xda\x98\x88\x54\xa8\x44\x50\x1f\x83\x46\x17\x67\xae\xd8\x89\xba\xf6\xbd\x1c\xd2\x0a\x93\x41\x90\xfd\xad\x1f\xe3\xf3\x4a\x40\x70\x1b\x91\x82\x60\x51\x1e\x02\x70\xfd\x60\x61\x73\x48\xc5\xd0\xb3\xda\xcb\xda\xad\xd1\x6b\x6f\x29\xde\x5f\x66\x86\xc8\x56\x2f\x65\x68\x45\x58\xd6\xee\xe7\xa6\x90\xfc\x1c\x82\x81\xfd\xc5\xe7\x6f\x4e\x74\x0e\x24\x36\x87\x11\x99\xf7\x88\x9d\x0c\x29\x26\x87\x08\x96\x14\xa5\x98\xc9\x77\x03\x9d\xd3\xc3\xa8\x9e\x50\xa6\x42\x59\x39\x93\xd8\xcb\xba\x28\x45\x21\x14\xb8\x5a\xa1\x44\xc3\xf1\x7e\x92\x94\x75\x70\xfa\x21\x26\xf3\xa0\xc2\x3d\x2c\x2b\xbb\x58\xa7\xec\x6f\xf9\x18\xdb\xf2\xb1\xce\xd7\x27\xe2\x63\xb4\x73\x1f\x0e\x13\x83\xcc\xf3\xfe\xd9\xef\x47\xcd\x54\x76\xd8\xc8\xfd\x4b\x88\x5b\x05\xfa\x81\x35\x5a\x8d\xc9\x6b\x58\xc7\x56\x32\xac\xd9\x47\xbd\x89\xe5\x5c\xf1\x39\xb6\xa2\xb0\x3a\x80\x57\xe9\x32\xb4\x13\x6b\xe7\xdd\x83\x1e\xef\x4b\xbc\xe0\xcb\x52\x67\x99\x28\x0d\xcb\xe4\x95\x60\xc7\xa2\xc8\xf4\x32\xa7\xdc\xd7\x94\x5d\x58\x6e\xdd\xae\xbe\x10\xb6\x5b\xd8\xb7\x1f\xaa\x8d\xaf\x42\x1f\x08\xfb\x1f\xcb\xda\xa1\x28\x9c\x15\x54\x41\xf9\x4a\x01\xd3\x38\x84\xce\x46\x23\x76\x26\xae\x45\x39\x62\xa7\xb3\x33\x6d\xcf\x51\xfb\x6e\x26\xdc\xe1\x8d\x4c\xce\xd8\x33\x67\xd7\x19\xcb\x2c\x76\x97\x89\x0a\xd4\x75\xd9\x18\xa0\xc6\x2d\x1c\xa2\x3e\x6f\xb5\xf6\x1c\x46\x0a\x95\xe7\x9d\x22\x19\xbd\x96\x29\xb4\xef\xea\xbd\x40\x87\x58\x4f\x5a\x43\x59\x47\xfb\x1b\x71\x15\x3c\x12\x1f\x58\x81\x52\xb1\x52\x98\x42\x2b\x23\x9a\x30\xa3\x61\x46\x68\xed\x0e\x8b\x61\xdc\x59\x78\xf6\x15\x9b\x85\x36\x16\x4a\x68\x87\x69\x0a\x77\xee\x87\x83\x8a\x64\x9e\x65\x22\x6d\x74\x05\xc4\x6e\x56\xbc\xe9\x21\x20\x34\x94\xd0\xdf\x06\x0b\x95\x1b\x35\xce\x8d\xfb\x43\x87\x49\xdf\xc3\xc9\xb7\x17\xbf\xad\xb2\xb9\x3e\x98\x20\x47\xa2\x0d\xb0\x02\x78\x0e\x30\xf8\x26\x6a\x04\xb5\xd0\xfa\x8a\x25\x3a\x2f\x32\x38\x3a\x3d\x4e\x56\xdd\x87\x2e\x6c\xa5\xb1\x1b\xdd\x1c\x44\x2d\xea\xe0\x83\x7e\x1d\xea\x7a\x29\x62\x43\xa8\x61\xe2\x9d\x48\x06\xeb\x61\x7b\xf2\x4e\x24\x51\x13\x66\x80\x64\x4b\x3c\x42\x84\x3b\xb1\xfd\x7b\xeb\xf7\x0e\x39\x0c\xe5\xe6\xef\x51\x4b\x17\x5f\x2d\x14\x4b\x18\xd3\xa3\xfd\xd3\x23\xa0\x71\x0a\xd8\x42\x58\x5f\x17\xc3\x68\x84\xcd\x88\x47\x6f\x05\xfa\x32\x24\x52\xfb\xb1\xa0\x45\x9a\xd6\x96\xed\xed\x1e\xec\xee\xaf\xf8\x1f\x5b\x90\xf1\x97\xd1\x2f\x25\x40\x9d\x16\x80\x1b\x2a\x92\xdd\x74\xc4\xa4\xf5\x99\xd6\x08\xf7\x04\xb3\xa2\xa2\xbf\x11\x33\x9a\xd9\x92\xa7\x92\xd4\x18\xf8\xd4\xdd\x64\xcb\x8a\xb8\xfc\xde\xee\xaf\xbb\xd4\xda\xeb\x46\xab\x5d\x0b\xd3\x9f\xb0\x4b\xc4\x89\x09\x03\x2d\x75\x05\xb8\x50\x48\x82\x22\x93\x89\xb4\xd9\x12\x38\x16\xd3\x15\x62\x52\x39\x79\x41\xc5\x86\x27\xef\xa4\xf5\xcd\x75\xf4\x8c\x3d\xc1\xee\x7a\x88\xe1\xc4\x0d\x74\x58\x3f\x58\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x20\xd5\xb1\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x4c\xf4\xdb\xee\x5d\xdb\xd9\x0a\x7a\xdd\xe5\xe5\xf9\xb7\x8d\xbe\xed\xc0\xc5\xad\x2d\x7c\xea\x0e\x78\x03\x44\x39\xd3\x65\xfe\x00\x78\xc7\x30\xc1\xca\x5e\x0d\xdc\xd9\x80\x2c\xac\x6f\x23\x77\xb6\x1e\x8d\xf0\xee\x1d\xdc\xd9\x3f\x74\x05\x60\x20\x7c\x9a\x2d\x03\x12\x83\x11\x96\xed\xb8\xa1\x76\x1c\x7b\x72\xbb\xe1\x3b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xac\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\x4b\x2f\xe9\x64\x4c\xe0\xf4\xf8\xba\xa6\x52\x14\xc8\xe1\xe8\x37\x9f\x1d\xff\x5a\xe1\x1b\x48\xf7\x46\x13\x8f\x24\x26\x5b\xdc\x23\x4a\x2a\x24\x16\xe2\xce\x0c\xc4\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\xa5\x3d\x83\xde\x97\x81\x88\x38\x68\xb4\x9e\xf5\x2f\x15\x8d\xaf\xf7\x13\x60\x98\xc5\x67\x43\x52\xa0\x18\x20\xb5\x7b\x35\xb1\x1b\x61\xa4\xa0\xf4\x12\x99\x2b\xb0\x09\x04\xbe\x7c\x30\x52\xc6\x69\x0b\x83\xbe\x3a\x3a\xca\x4b\xa6\x42\x57\x78\x8f\xf2\xbb\x4a\x90\x28\x33\x81\x9a\xc8\x7b\x77\xae\x17\x47\x5c\xcd\x05\x7b\xea\x7e\xf9\xe7\x3f\xfd\xe9\xab\x3f\x4d\x70\xf8\x90\xa5\xa0\xd8\xe9\xe1\xd9\xe1\x2f\x17\x3f\x1c\x41\x71\x6c\x5f\xaa\x0e\x94\x82\x39\x74\x02\xe6\xa0\xe9\x97\x1f\x35\xf9\x12\x4a\x3e\x7a\x73\x91\xa6\xef\x1f\x86\x8c\xf1\x3d\x49\xf7\x8b\x70\xf6\x10\x83\x36\x76\xa4\xba\xa3\xf6\x20\xce\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\x4b\x0d\x20\x1f\xa7\x06\xd3\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x04\xe8\x60\xc4\xfe\x2b\x05\xb5\x71\xc3\x84\x3f\x04\x39\xf3\x6d\xb2\x91\x97\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x79\x34\x33\x2e\x33\xf0\xa0\x52\x87\x6a\xcc\x08\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x68\xdf\xd7\x0e\xeb\x9b\x97\xf8\x80\x45\x1d\x89\xb8\xb2\xd1\xcc\x7e\x2b\xea\x06\x18\xef\xe1\x8a\xba\xa2\x14\x17\x56\x77\xea\x88\xc1\x56\xa3\x24\x38\xd8\x2d\x31\x92\xa9\x98\x69\xc7\x84\x6f\x0d\x7a\xa4\x15\x1c\x42\xae\xa0\x38\xd0\x7b\xb5\x74\x23\xb0\x81\x19\x99\x01\xbf\x9e\x80\x53\x0f\x4c\x8c\x96\xea\x7b\x81\x8f\xdc\xdb\x89\x1c\x66\x37\xaa\xab\x1c\xa8\x13\x39\x7c\x28\x6c\x82\x9e\xdb\x88\x91\x03\x72\x28\x4d\xbf\x1d\x46\x49\x4a\x6e\x16\xd8\xa5\x5b\xbc\x93\x96\x70\x59\xcf\x75\xda\xee\xad\x3f\x2f\x79\x22\x58\x21\x4a\xa9\x9d\x30\xaa\x94\x4d\xf5\x8d\x62\x53\x31\x97\xca\x78\x52\x00\x78\x3a\xd1\x0c\xe2\x31\xd2\x04\x60\xb8\x09\x7b\xdd\x00\x3b\xa1\x32\xa4\x44\xd7\x47\x93\xe6\xdc\x8e\x24\x81\xc4\x02\x3a\x21\xe0\x7d\xa0\x70\xdc\xcd\xeb\x43\x53\xde\xab\x14\x3c\x39\x15\x19\x5f\x62\xb6\x29\x74\xf0\x97\xff\x11\xa5\xd9\x1f\x20\xe2\x84\xfd\xe8\xfc\x77\xb7\xce\x43\x1a\x56\x0a\x9e\x2c\xfa\x05\x7f\xb7\x21\xaa\x3b\x5e\xdb\x10\x55\x9f\x41\xb6\x21\xaa\x6d\x88\xea\x03\xd7\x36\x44\xb5\x0d\x51\xb5\xae\x07\x6b\x25\x6d\x43\x54\x9d\xaf\x6d\x88\xea\xfd\xd7\x36\x44\x75\x87\x6b\x1b\xa2\xba\xe3\xb5\x0d\x51\x6d\x43\x54\xdb\x10\xd5\x36\x44\xf5\x1b\xf2\xdb\xf9\x6b\x1b\xa2\x5a\x19\x64\x1b\xa2\xda\x86\xa8\xee\x7c\x3d\x58\xe3\x6b\x1b\xa2\xc2\x6b\x1b\xa2\x6a\x5e\xbf\x2d\x51\xe7\x03\x3c\xe7\xce\xd4\xeb\x5f\xd3\x76\x0e\x41\x05\x99\x50\x9c\x48\xcf\x1a\x75\x50\xf8\xa8\x49\xdd\xa3\x22\x82\x05\xf1\xa5\x38\x14\x11\xaa\xe3\x4c\x6b\xeb\xa5\x7a\xf6\x91\x2b\x74\x5a\x07\x2a\xa2\x08\x05\x1a\xbc\xdd\x6b\xd6\x36\x56\x8d\xd5\x27\x2c\xf1\x69\x42\x12\x0f\x24\x7e\x33\x40\x18\x62\x1b\x82\xf8\xec\x42\x10\xc3\xb8\xef\x06\x70\xdd\xf5\x16\x15\x14\x99\xbf\x5c\x94\xc2\x2c\x74\xd6\x79\xa3\x37\x36\xf9\x4b\xa9\x64\x5e\xe5\xd0\x29\xd6\xed\x67\x79\x1d\x52\x00\x4c\xdd\x8a\x1e\x38\x36\x7a\x11\xa3\x96\xb2\xbe\x95\x2c\xd4\x6f\x52\x6b\x78\x53\x25\x89\x10\xd0\x4a\x2d\xb6\x70\xbe\x9a\x84\x27\x85\xd6\x19\x4f\xfb\xf1\x9b\x7e\x42\x1c\xe1\x48\x61\x94\xaf\xbe\xec\x34\xc6\xbc\x2c\x86\xe1\xcb\xdf\xbe\x3e\x3f\x8a\xf8\x32\x57\x9e\x2d\x4b\x75\xad\x33\xa0\x2a\xc7\x9b\x9c\xb2\x46\x0d\xf6\xa5\x33\x98\xa6\xc2\xf2\xc8\xb6\x21\xb3\xc0\x60\x13\x7d\xf7\x3b\xf7\xab\x20\x91\xcf\x51\xee\x62\xff\x7c\x36\xe7\x76\x93\x0c\xbf\xbf\x09\xd3\xcb\x7c\x19\x42\xde\xf4\xd5\xd0\x9b\x3e\x38\xa7\x87\x37\xbd\x50\x73\xd8\x17\x88\xa0\x7f\x67\x3d\xbc\x37\xa7\xec\xaf\x1b\xf7\x3f\x5a\x0c\x20\x6e\xe0\xc5\x07\x23\xf0\xce\x05\xb5\x8e\x22\x71\x1e\x1b\x41\xbe\xab\x94\xd5\xac\xc8\x78\xdd\x17\x0a\x56\xe0\x3b\x90\x41\x47\x0b\x91\x5c\xbd\xa6\x48\xec\x9e\x11\x22\xe8\xa6\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\xb1\x04\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x5d\x25\x11\x37\x4e\xdc\x28\x52\xcd\x27\x79\xba\x3f\x61\x6f\x15\x56\xb7\xd7\x7d\x28\x23\x6c\x07\xf7\x7c\x8f\xb3\x31\x15\x8e\xbb\x6a\xf0\x43\x44\x10\x76\x6e\x7a\x93\x3e\x40\xc9\xbd\x45\x52\xcf\x28\xf8\xa7\x8f\x80\x6f\x39\x17\x1b\xc0\xe1\xf2\xd8\x22\xdd\x83\x65\x7c\x0c\x10\xe1\x7e\x40\xd1\xed\x07\xa3\x1a\x3f\x94\x88\xf6\x03\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x47\x00\x65\xfe\x38\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x45\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x74\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xb1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xd1\x22\xd0\xfd\xa3\xcf\x0f\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x2c\x32\xbe\xbc\x10\x89\x56\x69\x67\x09\xd3\x42\xe9\x0c\xe7\xc7\xe0\xb0\xe4\xa7\x6a\x16\x5a\x2c\x38\x81\x91\x3b\x8b\x0a\x0b\x4b\x7c\x2c\x83\x14\x0a\x88\x2a\xe3\x2c\x1f\x64\x74\x82\x3d\x18\x87\x18\x56\x9d\x0c\xb9\x88\xdf\xe9\x1b\xa6\x67\x56\x28\xb6\x27\x95\x5f\xc7\xfd\xc8\x0c\xac\xbd\x93\x61\x5b\xbb\x6f\x9f\x3e\xf1\x37\x7f\x7e\x6e\x47\x70\xb0\x1a\xf3\xf1\xbd\xc0\xf4\xa0\x0f\xbb\x81\xe9\xc6\x59\x95\x35\x5d\xc1\xe8\x1e\x6e\xf2\x9b\xa7\x35\x9c\xf2\x53\x18\x37\x9c\x36\xae\x52\x46\x95\x68\x9f\xdf\xa2\xf5\xce\xab\x69\xaa\x7e\x21\x8f\xe6\x43\x5e\xe3\xcb\xa3\x73\x74\x1a\x6f\xdd\x25\x0f\xc5\x5d\xb2\xa1\xdc\x94\x07\xa8\xe8\x3e\xd2\x7c\x94\xad\xa2\x7b\x8f\x2b\xaa\x4d\xfd\xb6\xe4\x89\x38\x1f\x5c\x47\xf0\xc7\x89\xa5\x55\xc9\x89\x01\x06\x95\xcf\x1f\x1e\x25\x44\x8a\xa7\x29\xd4\xf3\x42\xa5\xec\xac\xca\xb2\x25\xab\x0a\xad\x9a\xd5\xcf\x18\x6b\x6f\x17\xd3\x82\x4b\x7e\xcd\x53\x6a\xc5\xb2\x28\x35\xc9\xcc\xb2\x52\xca\xf1\xe0\xba\x27\x1a\x28\x92\x00\xd3\xcc\x1b\x25\xbb\x46\xce\xdd\xf4\x9d\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\x95\xcc\x32\x1a\x66\xc2\x2e\x84\xc5\x90\x02\xca\xce\x4c\xab\x39\x4c\x8e\x2b\xdf\x78\x51\x24\xee\xb7\x49\x26\xb8\xaa\x0a\x7c\x9e\x93\xc4\x4b\x5d\x95\xfe\x79\x93\x10\x98\x08\x12\x58\xc9\x6c\x14\xb5\x77\x7b\xef\xc2\x86\xdc\x9f\xca\x38\x05\xe0\x95\x87\xa5\x1e\xc5\x63\x7a\xe4\x70\x13\x35\xf7\x29\x4a\x7d\x2d\x53\x8c\x6e\x78\xb2\x41\x23\x69\x6c\xe0\x13\xce\xb3\xd2\x6a\xac\xc4\x9c\x83\xa2\x42\xa7\x08\xd7\x0c\xc7\xc1\x0c\x02\x95\x42\x4b\x1f\xa7\xe1\xeb\xa2\x51\x4e\x7f\x2d\xb1\x19\x71\x44\x39\xb6\xa7\x34\xd3\x90\x8f\x5a\x29\x69\xb1\xc1\xfd\xa2\xb2\x2c\xd5\x37\x6a\xff\x5e\x51\x57\x08\xb4\x5e\xae\x25\x50\x33\xfc\xba\x4e\xcf\xc1\xf7\x7d\x3f\x79\xa5\x21\xd7\xe7\x8c\x55\xca\x88\x9e\xe2\x7d\x30\xe5\xe8\xcf\x7f\xec\xc6\x23\x64\x2e\x74\x65\x3f\x89\xf5\x77\xb3\x90\xc9\x22\x56\x66\x65\x2e\x0c\xd3\x55\xcb\x2c\x7e\x4a\x3f\x5b\xbf\x42\x5b\x13\x70\xdd\xd5\xd5\xb1\xbb\xc6\xfb\xd5\x86\x43\xa8\x3b\x5f\x43\x9e\xf8\xf1\xd9\xc5\x2f\x2f\x0e\xff\x7e\xf2\x62\xc2\x4e\x78\xb2\x88\x31\x31\x14\xe3\xc0\x34\x80\x51\x2c\xf8\xb5\x60\x9c\x55\x4a\xfe\xbb\xa2\x80\xef\x5e\xf8\xed\xfe\xa0\x58\xed\x1d\xa5\x2f\x74\xe7\x1f\xac\x1d\x1c\xf6\xfa\xc7\xbc\x2c\x6d\x04\x34\x70\x59\x51\x9f\x42\x94\x79\x89\x26\x02\x28\x5c\x90\x3e\x7f\xfc\xea\xe4\x02\xd2\xf2\x8b\x12\x91\x42\x20\x8f\x0b\xbe\x87\x91\xa6\xc2\xfd\x82\x3a\xf7\x4e\xd8\xa1\x5a\xe2\x97\x78\xa6\xa4\x61\x99\x34\x56\x80\xd4\x23\xb5\xcd\xc7\xaf\x77\x9e\x4c\xe0\x7f\x3b\x8c\xa7\x69\xe9\xf4\xba\x90\x9e\x96\xac\xe4\x8b\xa2\xe6\x27\xa7\x59\xf4\x02\x4a\x58\xcc\x46\x7b\xa9\x53\x9a\x39\x48\x12\x88\x5d\xa1\x18\x34\xb6\xe4\x56\xcc\x65\xc2\x72\x51\xce\x05\x2b\xb8\x4d\x16\x2c\xe7\x4b\x96\xe8\xb2\xac\x0a\xc4\xf9\x4f\xb9\xe5\x13\xf6\x5c\x97\x2c\xf7\x87\xd8\xed\x79\x27\x87\x2f\xd6\xc7\xf4\xeb\x93\x1d\xff\x53\x1a\x53\x09\x73\xf0\xf4\xc9\xd7\x5f\xfe\xe9\x4f\x9f\x55\x6b\xb8\x3a\x5d\xc8\xad\x6d\xd4\x1a\x8e\xfb\x55\xc0\x55\xc7\x56\x81\x52\xcd\xb3\x78\x7f\x75\x13\x00\x7d\xad\xcc\xbe\x36\xe6\xb8\x7e\x83\xf3\xae\xa6\xe6\x20\x2d\xea\xea\x39\x0c\xd4\xd8\xa9\x96\x83\xde\xb0\x22\xde\xa0\xe3\x5e\xbd\xa7\xe7\xfe\x60\x92\x9e\x93\xb7\x1a\xbc\x16\x75\x76\xd2\x88\x3d\x61\x7f\x65\xef\xd8\x5f\xc1\xd0\xfa\x73\xdf\x36\x58\x7d\x4d\xa0\x21\x92\x8d\x9c\x7d\x7f\x7a\x3e\x10\xc5\x7f\x74\x4c\xd3\x8d\xe8\xa8\x6a\x35\x9b\x4a\x52\xec\xc5\x3b\x2b\x4a\xa7\x68\xd2\x4a\x6c\xb4\x81\x98\x9b\xe0\x27\xdc\x66\x18\x78\x38\x9d\x35\x13\x9c\xee\xb7\xd1\xdc\xcf\xbf\xd3\xc6\x9e\x11\x17\x6a\xb6\xc2\xa9\x47\xcb\x81\xf1\x37\xd8\x98\x93\x1b\xc6\xd6\x07\xcc\xb0\x54\x43\xbe\x15\x26\x32\x2f\x64\x8f\x34\x8a\x87\xb3\x8d\xfb\x45\xd6\x1b\xeb\xf9\xbe\x95\x6a\xb9\x52\xc0\x06\x22\x15\x2b\xc2\xc8\x2a\x74\x4a\xda\x99\x9b\x56\x1a\xc9\x8c\xf7\xa8\x67\xe4\xb5\x09\xfe\x66\xd8\x4b\xee\x3c\x25\x5c\x61\x29\xc9\x4c\x94\x25\xe6\x9e\x4f\x97\x3e\x6d\xaf\xf7\xe2\xf5\x3a\x49\x45\xa9\xad\x4e\x74\x8f\x1e\x67\xcd\x68\x37\x0d\x07\x44\xc0\x7c\x5f\xef\x30\x7f\x73\x7c\x3e\x62\x97\x47\xe7\xd0\xf7\xe9\xe2\xe8\xf2\xbc\x69\xb3\xec\x5c\x1e\x9d\xef\x6c\x94\x14\xcc\x2b\x7c\xe0\xa2\xee\x30\x48\xc3\x05\xe5\xb4\xc9\x71\xce\x8b\xf1\x95\x58\x76\x94\xa9\x43\xc8\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\xd5\x73\xf9\x84\xd8\xf0\xcc\xf5\x85\x5d\xb9\xbe\x16\x29\x6a\xe9\xfe\x17\x42\xa5\x85\x96\x4e\x5f\xdc\x56\x7b\xdd\xff\xd7\xdb\x6a\xaf\x3b\x5f\xdb\x6a\xaf\x6d\xb5\xd7\xea\xf5\x60\x52\x5a\xb7\xd5\x5e\x9f\x57\x04\x7f\x5b\xed\xf5\x1b\x4f\x02\xd8\x56\x7b\xad\xbf\xb6\xd5\x5e\xdb\x6a\xaf\xbb\x5d\xdb\x6a\xaf\xfb\x5f\x0f\x2e\x7d\x69\x5b\xed\x75\xaf\x6b\x5b\xed\xb5\x7a\x6d\xab\xbd\x6e\xb9\xb6\xd5\x5e\xb7\x5c\xdb\x6a\xaf\x6d\xb5\xd7\xb6\xda\x6b\x9b\x04\xfb\xc1\xb1\x1e\x66\x12\x2c\xdb\x56\x7b\xd1\xb5\xad\xf6\xfa\x2c\x52\xfd\xd8\xb6\xda\xeb\x4e\xd7\xb6\xda\x6b\x5b\xed\xd5\xe5\xda\x56\x7b\x7d\x2e\xee\x92\x6d\xb5\xd7\xb6\xda\xeb\xb7\xa3\xe8\x6e\xab\xbd\xb6\xd5\x5e\xdb\x6a\xaf\x6d\xb5\xd7\x7b\x67\xb1\xad\xf6\xfa\x1c\x4c\x40\xdf\x11\xb8\x7f\xf5\xd2\xee\x91\xce\x8b\xca\x0a\xf6\xda\x0f\x19\xb4\x48\x64\x0c\xd2\xc4\x1a\x41\xff\x14\xc2\x44\xab\x99\x9c\x13\x67\x3f\xc0\x36\xbc\xe3\xf0\x3e\xe3\xa8\xf5\xed\x23\xcc\x1f\xcc\x64\x2e\xbb\x95\x94\xb1\x95\x85\x79\x01\x63\x45\x71\x19\x77\x92\x72\xfe\x0e\x8e\x08\xcf\x75\x85\xad\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\x3d\xb8\x95\x61\xc3\x98\x38\x3c\xf5\x79\x75\xe7\x43\xa4\x95\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xce\x53\xee\xad\x12\x0f\xa7\x10\x0f\xa4\x0e\x7f\x14\x65\x98\x02\xba\x03\x9d\x45\x4a\x46\x59\x39\x8d\x24\xb0\xde\x77\x1a\x3d\x37\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\xc4\x07\x20\xa1\x9b\x5b\x6c\xb4\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x44\x2f\xf3\x22\x83\x06\xe7\x70\x9e\xc7\x3e\x97\x05\x84\xeb\x96\x37\x7c\xf8\xda\xf2\x86\xcf\x91\x37\x18\x91\x54\xa5\xb4\xcb\x23\xad\xac\x78\xd7\xc9\xc3\xd2\x64\x0d\x17\xcd\x01\x29\x67\xcc\x50\xae\x1b\x7e\xc7\x74\x81\x79\xdf\xad\xc2\xfa\x85\xae\xb2\x14\x8a\x39\x2a\x05\x06\x26\x56\xe9\x09\x8b\xd6\x1f\xd8\x3d\x90\xca\xdd\x7e\x88\xb7\xe7\xd0\xcc\xfc\x77\x25\xaf\x79\xe6\xac\xdd\xfa\x17\xe7\x60\xc1\xc4\x3f\xba\xeb\x99\xb7\xdc\x5c\xd5\x07\x5e\x8c\x9d\x0e\x1d\xe6\x7c\xe0\x5f\x09\x3e\x12\xef\xec\x63\xd4\xd2\x40\x41\x3a\x2f\xe5\xb5\xcc\xc4\x5c\x9c\x98\x84\x67\xc0\xd7\x86\x91\x15\x87\xb7\x8c\x0e\x0b\x5f\xea\xcc\xb0\x9b\x85\x70\xbc\x9a\x71\xef\x02\x80\x0a\xbb\x39\x97\x0a\xeb\xe2\x0b\xff\x63\x83\xbe\x04\xc7\xfe\x0b\x5e\xba\x05\x0e\x3e\x03\x30\x91\xa7\x5a\x67\x54\xf1\x90\x2d\xeb\xf1\xa9\xf6\x47\xe9\x5f\x94\xb8\xf9\xc5\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x27\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x40\x98\x67\xec\xe9\x3e\x6c\x67\x6e\x58\x18\x23\x65\x5f\xee\x43\xf8\xef\xe8\xf0\xfc\x97\x8b\x7f\x5c\xfc\x72\x78\xfc\xf2\xf4\x8c\x9d\x69\x2b\x50\xa8\x45\x6d\x02\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\x8d\x54\xa9\xbe\x31\x9d\x7d\xb4\xb8\xfd\x1c\xf1\x04\x57\x9d\xc6\x48\x78\xc1\xa1\xfb\x61\x0f\x09\xb3\x92\x61\x12\x0f\x0a\x32\x3c\x4d\x0f\xd2\x52\x17\x48\x04\xef\xe4\xaa\x45\x6d\xd3\x8c\x8e\x73\x58\x61\x7d\x67\xcd\x01\xe7\x25\x57\xb6\xf6\xf6\xd4\x6b\x46\x6d\x17\x27\xbd\x97\xe3\x71\x57\x34\xf1\x74\xb8\x6a\xa6\xc3\x34\x15\x69\x83\xfc\x9f\x5d\xe6\xe0\x91\x7f\xb9\x65\x8d\x52\xc1\xce\x5f\x5d\x9c\xfe\xef\xd6\x3e\x5e\x16\xfd\x12\xa5\x86\xa9\x8c\x2d\x75\x31\xd8\xea\xbe\xa6\xca\xcb\xed\xfa\x3e\x88\xf5\x0d\xd2\x72\x98\xf0\xfc\xeb\x4a\x35\x21\x8d\xea\xf1\x59\xae\x53\x31\x61\xe7\x21\x4e\xd0\xfc\x36\x02\x38\xe0\xa5\x60\xee\x16\x65\x25\xcf\xb2\x65\xac\xa2\x59\x8d\x55\x88\x0d\x6c\x86\x98\x91\xcf\x78\x66\x36\xcd\x8d\xfb\xc8\x46\xa7\x47\xbc\x74\xf6\xf0\x20\xcb\x11\x46\x63\xa9\x50\xda\x92\x62\xed\x66\x09\x78\x17\xa5\x4e\x18\x1a\xdf\x51\x32\x56\x43\xbe\x19\x8c\x55\x78\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\x77\x24\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x19\xed\x20\x3b\xe0\x47\xd2\x96\x9b\xae\x68\x50\x27\x39\x3c\x77\x0c\xab\x01\x87\x2a\xae\xe0\x3d\xae\x57\xfc\xb1\x1f\xa9\xb2\x52\x87\xe6\xdb\x52\x57\x9d\x85\xd8\x8a\xb2\xf9\xed\xe9\x31\xb0\xa2\x8a\x42\x95\xca\x96\x4b\x80\x0e\x58\xc5\x7f\x0b\x86\xc1\x1b\x0a\xb6\xc6\x67\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\x3b\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x90\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\x6c\x9d\x33\xad\xdc\xc1\x1c\x64\xf3\x9c\x86\x48\x2f\x91\x34\xde\x2a\x10\x33\x26\xeb\x8f\x43\xe4\x18\x8e\x65\x65\x44\x89\x61\xee\xb2\x12\xb8\x92\xdf\x57\x53\x91\x39\xca\x3b\x93\x94\x7a\xc6\xa3\x3b\x43\xe6\x7c\x2e\x18\xb7\x61\xa7\x59\xcd\x84\x32\x8e\x63\xa2\x03\xd4\xb2\x54\x8b\xba\xfa\x9e\x1b\xf6\xe6\xf4\x98\x3d\x61\x7b\xee\x59\xfb\xb0\x7f\xa0\xa5\xbc\xd5\x98\xe4\xd6\xb6\x51\x67\x7e\x08\x98\x12\x6c\x5e\xa6\x4b\x64\x12\x23\xa6\x34\x33\x55\xb2\x88\xfb\xd8\x7b\xb3\x99\x12\x21\x21\xb4\xf2\x30\xf7\xfa\x66\x39\xd4\x1b\x23\xca\xc1\x18\xd4\x9b\x0e\x0c\x2a\x56\xa3\xdc\x9e\x6b\x52\x0f\x37\x56\x2e\x2c\x4f\xb9\xe5\xc4\xb8\xfc\x0d\x0f\x76\x49\x7f\xdb\xec\xcb\x88\x17\x52\x55\xef\x30\xf1\x68\x38\x57\xcb\xc5\x09\x0c\xcb\x12\x4f\x75\x58\x75\x5e\x14\x99\x44\xb4\x8d\x56\x22\xdc\x69\x63\xaf\x8c\x6e\x51\x13\x81\x4f\xf0\x2c\xd3\x8e\x3f\x3a\xe5\x84\xab\x54\xe7\x2b\x0f\x73\x4a\xa4\x68\x20\xa7\x4e\xd8\x76\xf7\x35\xaf\x07\xe2\x14\xca\xc4\xb5\xe8\x81\x2d\xd6\x46\x8a\x75\xa3\x39\xe2\xf8\x1d\x01\xc3\xb3\x8c\x4f\x45\x86\x34\xc6\x1d\x68\x56\x77\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x5a\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x8f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x03\x1d\xaa\x1e\xa2\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\x40\x78\x3f\x74\x3a\x18\x91\x24\x3a\x2f\xce\x4b\xed\xcc\xce\xc1\x64\x13\x0d\x5b\xc7\x0c\xd1\xb1\xb1\x26\x19\x0b\x64\x41\xf3\x66\x5e\x46\x89\x9d\xdc\xa2\x90\xf0\xd9\x9d\xff\x23\x92\x59\xc0\x7a\xda\x82\xcc\x8f\xd2\x08\x2f\xba\x5f\xd2\x17\x8f\x59\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\x88\x34\xd2\x09\xcf\x00\x3b\xb6\xdf\x96\x63\xed\x6d\xd7\x1e\x38\x4a\xe7\x85\x18\x25\x7c\xe6\x13\x48\x00\x46\x14\x3e\x21\x17\xa6\xd2\xa9\x88\x62\xd9\x98\x87\x7c\x89\x69\x9f\x70\x9f\xcf\x24\x76\x7a\x85\x0f\x2b\xa7\x8d\x5f\x5b\x4d\x08\x68\x2f\x03\x22\xad\x9b\xa0\x50\xa9\x54\x73\xf0\xab\x8d\x58\x29\x32\xcc\x41\x26\x26\x70\x85\x16\xe4\x2e\x1c\x09\x3f\xa8\x3f\x0f\xfe\xd1\xa0\x8b\x49\xad\x68\x64\xf0\x14\x79\x0d\x6b\x86\xec\x56\x1a\xb6\xf3\xc2\x13\xa0\x07\x84\xe7\x43\x94\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x25\x55\x4a\xe9\xba\x0d\x62\x05\x0c\x78\xd4\x83\x21\x11\x5c\xa6\x31\x6f\x79\xc6\xde\x2a\x16\x88\xc5\xc6\x9d\xb7\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\xba\x87\xb8\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xb7\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x80\xf8\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x21\x4a\xd9\x0a\x1c\xde\xcb\x8b\xc3\xe6\xd0\x20\xac\xa1\x21\x85\x5b\x2b\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\xef\xed\xd4\x30\x36\x72\x6e\x0e\x68\xcf\x8f\xdd\xec\xf7\x99\x54\x59\xc8\x8a\x02\x3b\x58\x59\xe3\x1d\x39\xf0\x90\x24\xcc\x02\xd6\x90\x70\xab\x29\x59\x61\x75\x9a\x88\x54\xed\x76\xc1\xc6\x19\xf6\xea\xf2\x9c\xf5\x84\x5d\xf9\xc0\x12\x9d\xd1\xde\x6e\x23\xab\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x01\x3a\x7d\x57\x8f\xc9\x52\x81\x55\x3c\x02\xb2\x9f\xf8\xad\x49\x76\xe0\x97\xde\x85\x62\x50\xfa\xe9\x6e\xac\x51\x5f\xd6\xcc\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x1d\x47\x03\x16\xe8\x55\x88\x85\x56\x9a\x8a\x24\x9c\x10\xd5\x0a\xb6\x34\xb0\x28\x8c\xe6\xc1\x9a\x10\x8b\x8e\xa6\x7a\x54\x47\x89\xe3\x40\x20\x14\x93\xd9\xd0\x5a\x05\xe7\x70\x23\xed\x02\x70\x5e\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x9c\x1c\x32\xba\xdc\x26\xe1\xee\xaf\x5d\x13\x07\xaa\x6b\x28\x78\xc8\x57\x74\xbb\x49\xcc\x66\x22\x01\x45\x2b\x26\x30\x72\xed\xbd\x1a\xf8\x96\xaa\x0c\xdc\x06\x23\x28\xf9\x5c\xbe\x73\x4f\x89\x7f\x15\x87\xc4\x09\x70\x76\xfd\xd7\xfb\x13\xc6\x4e\x55\xc8\xe0\x1d\xb9\x55\x8c\xef\xf4\xa9\x67\xd6\xbd\x62\xdc\x87\x00\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\xa6\x30\x10\x38\xfc\x45\x34\x5a\xa4\xbd\x87\x80\xdb\xb9\x4e\x11\x4d\x25\xa0\x41\x64\x4b\x8f\xee\x22\xff\xe3\xf5\xb3\x5a\xc7\x53\x1a\xab\x03\x62\x98\x15\x82\xd4\x4e\x99\x53\xb5\x33\xef\x5b\xc8\x8b\x4c\x40\x15\x67\x34\x72\x5d\xa0\x1a\xa1\xc9\x8f\xc2\x44\x6a\x40\x7a\x02\x77\x19\xb1\x7f\xc1\xa1\x0c\x89\xa8\x1e\x77\xe2\x3c\xfc\x1c\x2d\x44\x69\x7c\x6b\x09\xa8\xb0\xb4\xda\xbb\x2e\x58\x2a\x67\x33\xe1\x13\x5e\x9d\xe5\xc8\x4b\x9e\x3b\x16\x6f\x18\x91\x60\x2a\xe6\x12\x13\x22\x03\x63\xdb\x75\xea\x1e\xd5\xfa\x8d\x90\x19\x4a\xcb\x72\x39\x5f\xe0\x46\x61\x1c\x2a\x74\x99\x0f\x2a\x66\x9a\xa7\xd0\x92\x8a\xe9\x92\xdd\xf0\x32\x77\x72\x83\x27\x0b\x88\x50\x72\xc5\xd2\xaa\x04\x94\x65\x2b\x78\xba\x1c\x1b\xcb\xad\xd3\x94\x45\x49\x06\xa5\x9f\xff\x16\x52\xff\xbd\xd7\x16\x52\xff\x8e\xd7\x16\x52\x7f\x0b\xa9\xbf\x7a\x3d\x98\xec\xd0\x2d\xa4\xfe\xe7\x05\x93\xb4\x85\xd4\xdf\x74\x34\x61\x0b\xa9\xbf\x85\xd4\x7f\xdf\xb5\x85\xd4\xff\xc0\xb5\x85\xd4\xef\x70\x7d\x06\x9c\x6b\x0b\xa9\xdf\xe1\xda\x42\xea\xaf\xbf\xb6\x90\xfa\xab\xd7\x16\x52\xff\xd6\x6b\x0b\xa9\xdf\xf9\xda\x42\xea\x6f\x21\xf5\xb7\x48\xa3\xf7\x1b\xeb\x61\x22\x8d\xb2\x2d\xa4\x3e\x5d\x5b\x48\xfd\xcf\x02\x4f\x91\x6d\x21\xf5\xef\x74\x6d\x21\xf5\xb7\x90\xfa\x5d\xae\x2d\xa4\xfe\xe7\xe2\x2e\xd9\x42\xea\x6f\x21\xf5\x7f\x3b\x8a\xee\x16\x52\x7f\x0b\xa9\xbf\x85\xd4\xdf\x42\xea\xbf\x77\x16\x5b\x48\xfd\xcf\xc1\x04\x34\x36\x95\x9d\x10\x40\xef\x02\x56\x44\x49\xe8\x11\x36\xc0\xb4\x9a\xcd\x44\x09\x9c\x0b\x9e\xbc\x92\x3c\x55\xe3\x32\xb6\x83\xac\xc2\x8e\x00\xf7\x88\xea\x75\x6e\xf9\x39\x81\x11\x00\x52\x67\x9d\x29\x7e\xf2\xea\xf9\x1a\x64\xa4\xce\x59\x85\x5d\x73\xa4\x61\xce\xaf\x54\xb7\xf8\xf8\x2d\x04\x5f\x57\x3f\x46\x74\x4f\x32\x6d\x28\xc3\x1d\x88\x95\x2c\xb8\x52\xc2\xdb\x7b\xd2\x82\x1f\x65\x2a\x84\x62\xba\x10\x14\x9d\xe6\xcc\x48\x35\xcf\x04\xe3\xd6\xf2\x64\x31\x71\x4f\x52\x9e\xd8\x75\x36\x3a\x7d\x62\x6c\x29\x78\xee\xf3\xf2\x73\x2e\x71\x28\xc6\x93\x52\x1b\xc3\xf2\x2a\xb3\xb2\x08\x83\x31\x23\xa0\xa0\x06\x05\x55\x20\x06\x64\xc5\xd5\x29\xec\xa3\xfa\x69\x34\x2d\x1d\x43\xd3\x81\xb5\x39\x02\x3c\xf0\xbc\xb0\xcb\x90\xc7\x2b\xd8\x4c\x96\xc6\xb2\x24\x93\x20\xad\xe1\x89\x58\x3b\x0d\xe3\x8d\xbc\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x15\x5b\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xdc\x34\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\xf0\x62\xeb\xb4\xe1\x7a\xa3\x43\x89\x83\xdf\x9c\xa3\x46\x35\x47\xad\x50\x40\x96\xde\xca\x31\x80\x05\x50\xe2\xda\xed\x01\x91\x08\x27\x5f\xf9\x2d\xbb\xfe\x93\x6f\xfa\x48\x28\xbe\x14\xc6\xf0\xb9\x38\xef\x18\x68\xb8\xcd\x22\x83\x58\x43\xbd\x30\xb0\x15\x32\xac\xae\x0d\x9f\xd4\xd9\x99\x4d\x35\x88\xe5\x38\xa7\xa0\xfc\xdc\x94\xd2\x5a\x01\x8b\x0a\x08\x7b\x10\xab\x6c\x17\xe0\xef\xb6\x72\x3c\x5f\xfa\x41\xea\x1f\x3b\xa6\xae\x52\xcc\xb8\x9c\x0a\x36\x2d\xa5\x98\xb1\x99\x84\x34\x4e\x48\xac\x1c\x21\xe0\x12\x47\x2f\x80\x31\xce\xde\xd5\xca\xeb\xb2\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\x4a\x78\x84\x65\x0b\x15\xa6\x72\xc6\xe6\x90\x98\x49\xda\xe2\x1f\x9f\xfc\xe5\xcf\x6c\xba\x74\x22\x0d\x34\x2b\xab\x2d\xcf\xc2\x4b\x66\x42\xcd\x1d\xad\xf0\x78\x36\x6b\x24\x03\x05\xa0\x9b\x07\x4e\xfc\xe9\x97\x57\xd3\xa6\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\xfa\xa3\x74\x4f\xd9\xee\x68\x12\xad\xd9\x66\x3a\x93\xc9\xb2\xf7\x46\xf3\xc8\x5f\x6c\xa1\x6f\x50\xd7\x5f\xb3\x7b\xea\x72\xab\x42\x17\x55\x86\x4e\xe7\xe7\xa1\xba\xb8\x32\x62\xb5\x06\x70\xed\xb9\x00\x37\x29\x0d\xd1\xc6\x4d\xc7\x7c\x5c\xff\x48\x4d\xb5\x25\xe4\xc8\x0b\x00\x60\x60\x08\x3d\xe7\x59\x36\xe5\xc9\xd5\xa5\x7e\xa1\xe7\xe6\x95\x3a\x29\x4b\x5d\x36\xe7\x92\x71\xc7\x2d\x17\x95\xba\xc2\x0e\x0e\x01\x22\x41\xcf\x9d\x6a\x55\x54\xd6\x17\x32\xac\x7b\x61\xac\x97\xf7\x4c\xd8\x9b\x41\xf5\x28\xe2\x9d\xac\x6d\x1d\x2a\xd5\xc2\x1d\x19\x8f\x6f\xe2\xcd\xf6\xe5\x93\x3f\x7e\x8d\x5b\x97\xe9\x92\x7d\xfd\x04\x72\xb6\xcd\x08\x0f\x31\xf0\x36\x27\x28\x72\x9e\x65\xce\x6c\x88\x37\xa5\x23\xf4\xba\x4d\xf8\xc9\xf7\xa0\xed\xbf\xdd\xee\xac\x4a\x5d\x5e\xfe\x03\xf4\x28\x69\x8d\xc8\x66\x23\xac\x4a\x0a\x66\xcd\x2e\x08\x86\x5d\xe2\x3e\x50\x1a\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x26\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x05\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x12\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x46\xa8\xe4\x37\x0d\x62\xc0\x99\x04\xb8\x82\x9e\x78\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\xc7\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x63\x43\xd4\x03\xfa\xd3\x50\xc0\xbf\xb1\xaa\x64\xa5\x2a\x32\x14\xd6\x85\x8d\x81\x0a\x80\xdb\x3e\xc0\x92\xbb\x3b\x5c\x07\xf0\x6e\xf6\x4b\x39\x6a\xd0\x45\x05\xaf\x72\xce\x2d\x29\x84\xde\x7d\xcd\x59\x21\x4a\x23\x8d\x93\xcb\x3f\xc0\x81\x3a\xca\xb8\xcc\x23\x17\xe0\x66\x88\x80\x87\x1b\xe0\x93\xfb\x73\xca\x73\x9d\xd2\x80\xc0\x0a\x11\x3a\x7a\x8d\x5a\xdb\xd4\x6a\x07\x14\xa8\x9b\x66\x95\x3f\xd4\xd4\x6c\x72\x4a\xf7\x49\x60\x95\x78\xd7\xe7\xc4\x20\xe1\xfd\x1e\x2b\x7f\x0c\x93\x1f\x88\x0d\x00\x63\xa4\xc5\x6d\x72\xc2\x86\xf1\x88\x07\x25\x52\xe9\xc9\x0e\x9c\x30\x8c\x82\xbb\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x2f\x9f\x16\xa5\xda\xc3\xc6\x40\x13\xce\x0c\x82\xef\x03\xec\x1a\xdc\x25\xd2\x1a\x47\x07\x50\x92\x30\x3a\xea\x09\x4c\x06\x02\xd6\x63\xdf\xf0\x25\xe3\xa5\xae\x54\x4a\xfe\xa5\xe0\xe0\x7b\xd9\x7a\xf0\x99\x56\xc2\x3b\xce\xdb\x38\x15\xe0\xd1\x97\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x48\x2a\x78\xc3\x96\xa4\x3a\x0b\x92\x0a\xf9\xd3\x46\xdf\xd5\x23\xde\x0f\xf4\xbe\x2f\xc9\xc5\x52\x03\xda\x4b\x0f\x97\x0d\x1f\xdd\x94\xd2\x8a\xa8\xc7\xdf\x1e\x18\x2e\xce\x3e\x8c\x50\x19\xf6\xd7\x75\x92\xe8\x49\xa4\x7e\x30\x18\xa6\x9a\x7e\x44\xbe\x45\x0c\x0a\x8e\xdb\x3a\x0f\x97\x79\x0f\x0b\x8b\x09\xb5\xb3\xc3\xf6\xf0\xce\x5d\x2c\x68\xde\xdf\xe8\xd6\x22\xa2\x9d\xbc\x2b\x7a\x60\x6c\xb6\x6a\xe7\x0b\x0e\x3e\xb8\x62\x40\x0a\xfe\x5d\x2c\xf8\xb5\x80\x42\x6e\x99\xf1\x32\x83\x98\xe3\x05\xce\x9d\x4d\x2b\xcb\x84\xba\x96\xa5\x56\xb9\x50\x96\x5d\xf3\x52\x02\x2a\x4e\x29\x00\xd9\xc1\xd9\xa2\xbf\xdf\xfb\xe1\xf0\x35\x24\x34\xec\x13\x24\x05\xcd\xb2\x32\x1e\xbe\x26\x9e\x49\x34\xdc\x07\x97\xcf\xcf\xc3\xd1\x10\x78\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\xdb\xb2\xbc\x4b\xb2\xca\xc8\xeb\x4d\x71\x12\xaa\xb0\x3f\x96\x9d\xd6\xb9\x55\xed\x5f\x13\x6a\xa5\x70\x1f\x5c\xeb\x6b\x0a\xf4\x56\x02\x26\xbb\x26\x14\xed\xc5\x31\x70\x72\x3d\x11\x96\x06\xa6\xcf\x79\xc4\xc5\x15\x15\x02\x70\x63\x36\xeb\x84\x52\x3a\x15\xf7\x47\xdd\x69\xa6\xf7\xd0\x10\x18\x33\x8f\x2a\xf8\x4c\xb2\x10\x69\x05\xf0\x4e\xd2\x20\x38\xaa\x33\x1f\x78\x8d\xc2\xa7\xa0\x4b\xd0\xe9\x2c\x40\x1a\xa8\x31\x38\x07\x91\xe6\xfe\xf7\xa5\x07\x40\xf0\x1f\x98\xd6\x88\x60\x94\xba\xb1\x46\x8c\x1b\x53\xe5\x78\x24\xb0\x01\xc2\x4c\x5a\x13\x7a\xcc\x7a\xed\xd8\x1d\x8c\x7b\x16\x54\xf5\xa0\xef\x85\xc8\x60\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x68\xc3\x51\xc2\x04\x44\xdb\x42\x1e\xa7\x06\x2f\xe9\x4c\x42\x13\x25\x4e\xf4\xbe\x58\xf3\x4b\x54\x1d\xf0\x0e\x80\x87\xe1\x53\x91\x99\xf6\x40\xd3\x7a\x51\x08\x95\x94\x08\xdf\xb3\x4b\x2e\x37\x46\xce\x15\xf4\xcf\x74\xa3\xdd\xb3\x53\x66\x67\x9b\x69\x88\x2e\xb8\x9d\xb9\x5a\x23\x0b\x2b\xe7\xc5\x98\xac\x5e\xab\x73\x99\xdc\x63\x24\x7d\xcf\x29\xb7\x6a\xa5\x1b\x35\xb8\xaf\x2e\x56\x3c\x3e\x26\xf2\x6a\x4c\xd8\x85\xce\x29\xc5\x49\x45\x5d\xbc\x7c\x33\x55\x27\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xd7\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x7e\x92\x9a\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\xfa\xbd\x0d\x29\x30\xcf\xd8\xb8\xd5\x99\x76\xd2\x04\x0d\x7d\xff\x73\xe8\xde\xd1\x87\x9f\x82\xf9\x39\x00\xc7\x77\x7a\x1c\xff\x79\x7a\x7e\x14\xff\xf9\xc6\x38\x2a\xd1\x07\xed\xa9\x35\xbb\x32\xdc\x7e\x57\x8c\x8f\x7d\xdb\x5d\x33\x6c\x6c\xf4\x81\xaf\x8f\x16\x5c\xf9\x40\xd6\xad\xcf\x5b\x9a\xc4\x66\xf5\x74\x16\xbc\x14\x84\x1f\xe7\x38\xb9\x29\x78\x72\xeb\x2c\x02\x58\xdb\x7b\x6f\x78\xef\x4c\x4d\x55\xf8\x86\xdb\x19\xdc\x18\x66\x52\x6f\xbb\x9f\xfe\xf0\xf3\x1d\x89\xf9\xa1\xdf\xac\x23\xed\xfb\x7f\xd3\x68\xdb\x77\xa7\x5f\xac\x6f\xea\x75\xb7\xdf\x46\x7d\xf1\xee\x74\xff\x6d\x3d\x79\xef\xfa\x34\xdf\xcb\xed\x6e\x2f\xd6\x5e\xed\x3b\xdc\x0e\x4b\x7a\x3f\xb4\x82\xce\x2c\xbc\xab\xbb\xab\x83\x93\xaa\xbb\x73\xaa\x9b\xb1\xdf\x52\x00\x6e\x81\x32\x25\x98\x35\x35\x67\x0d\xf0\xa8\xaa\x2c\x85\x82\xb6\xf7\x15\x64\x3a\xfa\x76\xf6\xc8\xa4\x81\xd9\x12\x50\x27\xa2\xcd\xb3\xc3\x20\x0b\x29\x03\x2e\xe7\x00\xde\x19\x81\x55\xcf\x2a\x48\x68\x04\xd6\x8f\x60\x74\x5a\xb9\x79\x3c\x5b\x87\x90\xa1\x0b\xa1\xa2\x5e\xf7\xa4\x35\x8f\xdd\x1e\x6a\x60\x66\xa0\x22\x30\xc9\xd3\xdf\x15\x19\xb7\x33\x5d\xe6\x63\xaf\x1e\x8e\x1b\x4a\x02\x3b\x82\xd4\x1a\xe3\xed\x2b\xcc\x6f\x45\x50\x4d\x95\x66\x22\x92\xe6\xe1\x55\x55\x8a\x10\x54\xac\x52\xa5\x48\xf4\x5c\xc9\xff\xd4\x84\x00\xb9\x16\x9c\x43\xdc\x38\x49\xca\x54\x95\x65\xf7\xcf\x43\xe8\xa8\x04\xe8\x6b\x51\x2e\x04\xbf\xe7\xe6\x6d\xa5\xb4\xd0\x18\x75\xef\x51\x43\x98\x02\xa4\xf2\xfa\x87\x38\xd5\x58\x27\x50\xdb\x86\x21\x76\x9f\xb8\xcc\x41\xa0\x3b\x4d\x8f\xb3\xb9\xbc\x16\xca\x43\x8e\x1f\x65\x3c\xf4\xcf\xf6\x28\xab\x04\x7b\x5e\x59\x1d\x92\x16\x18\xb7\x11\xf0\x31\xe4\x38\x51\xbc\x34\x1e\x27\xba\x85\xba\x6f\x67\xbe\xd3\xd9\x5d\xee\x84\xbc\x01\x6c\xfd\x38\xaa\x5f\x29\xf7\xbe\xd5\x06\xb2\x26\x4b\x20\xbb\xc5\x9b\x22\x94\xd5\xf2\xe1\x47\x50\x4a\x9a\xe3\x41\xeb\x86\x21\x75\x39\x40\xc0\xd6\x84\xcd\x1c\xfb\x5f\xa2\x92\x73\x3a\x6b\x3e\x49\x36\x40\xf7\xa1\xf6\x09\xd4\xef\xda\x1e\x3c\xd7\xa9\xd3\xc2\x46\x2c\x2c\x65\xdc\x7c\x9c\xe2\x2d\x78\x26\xa3\xc3\x88\x4a\x5a\x59\x0a\x53\x68\xc4\xfe\x8f\x1f\x3b\x8a\xfc\x5f\xd2\x36\x92\xed\xb0\x8b\x5b\x38\x1a\x88\xce\xf6\x1f\x51\xea\xb5\x3a\xfc\x5c\xda\xc9\xd5\xd7\xa0\xc0\x0b\xb5\xe0\x2a\x41\xdb\xe9\xe0\x4a\x14\xe6\xc0\xc8\x39\xea\xeb\x7f\xfe\xfa\x6b\x50\xde\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x23\xd2\xe4\x0b\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xf9\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x4b\xe9\x5b\x8b\xd2\xab\xfe\x64\xc0\x9a\x93\xa2\x14\x22\x07\xf6\xd7\x25\x5b\xab\xe9\x25\x6d\x0d\xe5\x05\x2c\xfd\xe5\x78\xa2\x7f\x9a\x9a\x3b\x36\x69\x90\x75\x66\xfa\x06\x32\x2c\xa5\x76\xca\xcf\x84\xbd\x02\x39\xc8\xce\xc4\xb5\x28\x47\x7e\xd4\x17\xee\xa6\xf3\x70\x4f\xec\x86\x5b\x77\x47\xc7\x1c\xff\x8e\x6b\xe2\xe7\xde\x83\x78\xd8\xb7\x84\x26\x0f\xfc\x69\xc2\x7e\xe0\xa5\xd4\x95\x21\x5d\x24\x86\xfb\xc6\x14\xb2\x20\x49\xc0\x2b\x41\x01\x9e\x30\x48\xa8\x0c\xf3\x31\x9e\x40\x9b\xc3\xc0\xaf\x8f\xd6\x8b\x04\x69\xdd\x4a\x5d\xfb\x47\x95\x3e\xd5\x75\x05\x29\x1c\x85\xc1\x5a\xfe\xef\x25\x9a\x89\x27\x0a\xc3\xf8\x79\x00\x6f\x75\x9a\x18\x8e\xb2\x90\x73\x9f\x50\x0d\xef\x8f\xe6\x6b\xf4\x69\xd8\x21\x1d\x96\xb4\xcb\x31\xed\x9a\xd7\x5f\xb4\xdf\xaf\xc7\xb6\x68\xe2\x29\xc7\x90\xcc\xbe\xa2\xa8\x3e\x37\x3b\xb8\x4f\x40\x88\x8c\x93\x52\x5a\x99\xf0\x6c\x07\x84\x93\xff\x2a\xc9\x2a\xa7\x27\xc6\xdf\x96\x82\xd9\x1b\x8d\x4f\xe1\x19\xbb\x12\xcb\x1b\x5d\xa6\x5e\x3e\xfb\x27\xd6\x6b\x61\xac\x7f\xa4\xb3\xe7\xe0\x00\xa3\x9b\xa1\xcc\x45\xc9\xa6\xc2\x7b\xd0\x5b\x37\x2f\x27\xec\x50\x2d\x29\xfc\xa8\xe2\x22\xc3\x08\x99\x0d\x74\x04\xd4\xa2\x1a\x9b\x84\x84\x98\x7f\x1a\xc7\xf2\xcf\xdb\xbc\xcb\x4e\x01\x0b\xa7\xc0\x4b\x7f\xef\x5e\xd6\x25\x55\x39\xc1\xe9\x28\xb1\x46\x4b\xfb\xaf\x3f\x09\xb7\x70\xfa\x8d\x54\xc2\x98\x6f\xdd\x52\xf6\x51\x57\x9b\xbb\x83\x83\x5a\x42\x63\x43\xa5\x54\x9d\x52\x2c\xdc\x91\xc2\x18\xb1\x63\xc3\x3a\xad\xef\x9c\xb0\x43\xf8\x00\x72\xe2\x9d\xe6\x05\x55\x74\x6e\x30\x69\x4d\xbb\xb9\x3c\xde\x71\x78\x76\xec\x73\x97\x51\x53\x30\x4d\xb8\x74\x54\x99\x9b\x33\x01\x4d\x8f\x32\x68\xc5\xbf\x2b\x0e\x7d\x72\x77\x2e\xcb\x4a\xec\x74\x53\x95\x10\x88\xff\xe0\x4f\x5f\x3f\x01\x6d\x29\x3c\x6f\x0c\xcf\xeb\xa2\x2a\xdd\x3f\x47\xa6\x53\x76\x4c\x3b\x31\xe8\x75\xbc\x1f\x3c\xc1\xbd\xdd\x41\x41\x2b\xa8\xed\x85\x65\x0a\x34\xef\xe4\x5a\xed\x94\x0b\xd3\x3d\x0b\x66\x5c\x4f\xf7\xf2\xfe\x3d\xcc\xfa\x24\xb0\x34\x9e\x3b\x44\x94\xab\x1e\x0d\x57\xc5\xe0\x92\x84\xe7\x44\x9e\x5d\x6c\x75\x41\x1f\x43\x3a\x2c\x30\x2e\x88\x0a\x00\x7b\x5c\x16\x3d\x52\x7f\x3b\xf0\x1b\xa8\x74\xe9\xad\xdf\xed\xbe\xc6\x81\x58\x51\x2b\x74\x2b\x15\x0c\x21\xc2\x0b\x7a\x07\xa9\x72\x87\x50\x0e\x36\x62\xaf\xd4\x73\xcc\x8f\x1f\xa1\x76\xd7\x40\x1f\xc1\x9b\x06\x2d\x13\x3c\xf8\x1d\xbd\xfb\x18\xa7\xdc\x85\x29\xdc\x9f\xdc\x91\xe5\xd8\x53\xfa\xef\xbe\x6e\x8d\xd5\xd8\x7a\x0d\xcb\x98\x24\xa4\xac\x7b\x9f\x11\xfb\x64\xf3\x52\x57\x85\x8f\xa4\x36\x1b\x99\xd5\xdd\x3b\x30\x00\x88\x7d\x7e\x95\x6e\x0e\x1d\x9c\x1f\xb0\x81\x45\xed\x35\x4b\x59\x82\xe6\xb1\x97\xba\x58\x05\x85\x1e\x84\xb2\x52\xcd\x3e\xe7\x51\x2c\x72\x27\x13\x73\x9e\x2c\x77\x9a\xcf\x59\x17\xf9\x95\x50\x9c\x23\x73\x04\x4c\xc7\xe7\xd5\x35\x0d\x50\xfa\x00\xfa\x03\x9e\x35\x50\x0d\x2a\x43\x53\xf4\x22\xdf\x17\xe5\xa1\x67\xab\xec\x61\x99\xff\xe9\xeb\x3f\x8d\xbd\xef\x0d\xa6\xf2\x49\x36\x54\x88\xdc\x0e\xaa\x4b\x36\xd6\xcc\x29\x48\xd2\x14\xb0\xbe\xa0\x89\xd5\xe2\x3c\x3c\xfd\x7d\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x12\x72\x35\xbd\xe8\x7d\x8e\x5f\xbb\xed\xcb\x42\x67\x29\x1c\x14\x6a\xce\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\xcd\x24\x35\xc8\x9b\xb0\xba\x68\x2e\x36\x61\x61\x27\x4f\x18\xbb\x10\x02\x9b\x43\x46\xf3\x00\x3e\xeb\x49\x49\xde\x56\x3d\xc3\x4e\xde\x68\x84\x7d\x22\xb7\x50\x77\x71\x4c\xc1\xb4\x9e\x5e\xfb\x9d\xc3\x60\xa5\xc4\x31\x2f\x64\x70\x2b\xfd\x7a\x5b\x92\x09\xd2\x89\xeb\xa8\x2b\x65\x17\x39\x5a\x18\xc4\x88\x85\xbd\xfc\x3d\xf6\xf6\x84\xd4\x49\x88\xfc\xa1\x6f\xf2\xc6\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\x10\xdf\x7d\x1d\x43\x2f\x40\xb3\xca\xa7\x68\xd4\xea\x1b\xf0\x0a\x7f\x7b\x7a\x1c\xce\x88\xbb\xeb\xf9\x05\x86\xf4\xbe\x9c\x50\xeb\x5d\x3b\x97\x29\x9b\x62\xe2\x86\xe3\x97\x7b\x4a\xdc\x60\x2a\x38\x39\x4e\x83\x5e\x7d\xed\x53\xa4\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\x4d\x50\x45\xe9\xad\xf2\xa9\xa4\x54\xd1\x57\xaf\x77\xbd\xbb\xfa\x66\x5c\xde\x8c\xc7\xe3\x31\xc5\x77\x81\x4b\x8f\x1a\x34\x08\xcc\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\xdb\xbc\x7e\x04\xec\x48\xae\x96\x34\xbb\xfe\xfd\x7a\xef\x0f\xcf\xdd\xcf\x1d\xd7\x07\x8e\x61\x4d\xa8\xb8\x6f\x7c\x6a\x5d\xf4\x19\xed\x64\x53\xa3\x9a\xeb\x19\x6e\x52\xc8\x9e\xbf\x65\x61\xbc\x17\x88\x76\x0d\x61\xf5\xa1\x95\x2e\xde\x15\x1a\x91\x80\xa1\x3a\x05\x3a\xb6\xb5\xc3\x13\x90\x11\xea\x4e\x15\x24\xd9\x35\x4e\x0d\x29\x14\x18\x11\xf3\x44\x60\x53\xee\x86\x0c\xd3\xd9\x6b\xed\x93\xfd\x09\x3b\xa5\xad\x05\x06\xa1\xd2\xd4\xf7\x8d\x69\xc5\x44\xb1\x10\xb9\x28\x79\xd6\x7c\x10\x55\xe9\x3e\x73\xec\xb6\x74\xbb\x14\x43\x00\x39\x2f\x90\xdb\x02\xf3\x4c\x65\xe9\xfb\xc6\x46\xa1\xb9\x9d\x57\xea\xb5\xd6\xf6\xa5\x34\xa0\xbb\x90\x33\x04\x35\xcd\x9d\x75\x02\xcd\x7f\x57\xa7\x3c\xf7\xdd\xc9\x9f\x2c\xfe\xc5\x7c\xef\xb7\x21\x78\xad\xe3\x20\x8e\x69\xdd\xb7\xbd\xdb\x1b\x02\xf1\x69\x74\xd1\x0d\xbe\xd8\x75\xcd\xdb\x56\x3a\xb7\x7d\xe2\xd6\x6d\x94\x95\xc5\x6d\x03\x2d\xeb\x53\xb7\x1b\xdf\x1c\xf7\x82\x2d\x73\xa6\xe1\x9c\xf4\xdc\x34\xa7\xab\x1d\xe3\xea\x2d\x02\xee\xbe\xd0\x0a\x53\x69\x35\x86\x0e\x4e\x95\xf1\x81\xcb\xd2\xbb\x7c\x1b\x02\x88\xda\x4a\xa2\xd8\xc4\xd6\x80\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xa1\x98\x6a\x51\x77\x73\xe2\x86\xbd\x39\x3d\x66\x4f\xd8\x1e\x64\xe7\x86\x0a\x6d\xc4\xa4\x70\xa6\x6c\x2b\x85\x74\xe6\x87\x68\x9a\x2e\x04\x08\xa1\x34\xf2\x22\xdf\xea\x52\xab\x20\x86\x09\x58\xf3\x96\x06\x85\x9b\xde\xe3\x5d\xf7\x63\xb7\x1c\xfc\x90\xe5\x32\x00\x0f\x7a\xd3\x81\x07\xc5\x8a\xf5\x10\xed\x25\x37\xbd\x7a\xbf\x75\x0e\xd5\x4c\x54\x1b\x60\x53\x5d\x9c\xc0\x80\x08\x06\xf1\xce\x92\x1a\x7f\xcf\xde\xe5\xab\xa0\x3f\x84\x7c\x14\xf0\x01\x4a\xae\x52\x9d\xaf\x3c\xcd\xad\x26\x18\x6f\xd1\x6a\x6e\xb7\xdd\x6d\x57\xaf\x12\xce\x7e\x15\x90\x60\xe3\x0f\x50\xfa\xfa\x02\x7c\x05\xd2\x84\x9d\x80\xce\x03\x48\x0a\x5f\x31\x5b\x7b\x23\x23\xf4\xae\x04\x2a\x75\xd6\xb1\x98\xae\xf1\xd6\xaf\x75\x46\x45\x0c\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\x30\x41\x9b\xbd\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\x49\x4a\xb3\xf6\x5b\x43\x4a\x6b\xe3\xad\x41\xee\x3e\xc4\xb7\x6e\x66\x30\x0f\x20\x4c\x68\x40\xa6\x29\x8f\x9a\x3a\x09\xb4\x41\x4e\xea\x0c\x49\x70\x42\x3d\x2e\x3e\xda\xa7\x0c\x1e\x13\x9d\x3e\x35\xeb\xd6\x09\xcf\xa8\xf7\x7f\xb7\x75\x66\xed\xb5\x6e\x0f\x19\x25\x63\x70\x37\x5b\xf8\x2c\x4a\x29\xe4\x88\xd0\xa4\xeb\x80\x4c\x2b\xf8\x42\x6e\x3a\xfa\xa5\xcf\x86\x70\xf2\xb7\xce\x70\x8c\x7f\x6d\x35\xb5\x96\xf5\x48\xf0\x1c\x26\x28\x30\x5f\xb1\xe0\x76\x31\x62\xa5\xc8\x10\xdc\x95\xce\xd9\x15\x9a\x52\xbb\x8d\xb4\x49\xbf\x63\xfd\xa3\x41\x61\x81\xd6\xd2\x30\x32\xb8\x7c\xbc\x1a\x32\x43\xfe\x25\x0d\xdb\x79\xe1\x09\xb0\xf3\x98\x19\xf4\x0e\xbe\x4f\x58\x3b\xf4\x62\x5d\x49\x95\x12\xea\x69\x83\x34\x21\x45\x17\x75\x43\xef\x61\xf2\x67\x9d\x97\x02\x9c\xbd\x81\x34\x6c\xdc\x79\x33\x50\x28\xcc\x07\x44\xc7\xb7\x28\x99\xde\xa7\xe2\x1f\xd2\x1e\xe6\x8d\x82\x95\x56\x50\xff\xa0\xf4\x9a\xfb\xfc\xbb\x74\xeb\x80\xd8\x87\xf5\xae\x14\xaa\xf4\x64\xbf\x87\x01\x6b\x6a\x8e\x75\x2f\x91\x0a\x5f\xe3\x51\x92\x5d\x48\xed\x9d\x5b\xaa\xf7\x08\x56\x87\xf2\x5d\x57\xa4\x13\xa6\x57\xe5\xbc\x5c\xb2\x6f\x4f\x8f\x51\x03\x6f\x18\x02\x4a\xfb\x47\x87\x9d\x92\x12\xe4\x20\x57\xcb\x07\xa0\x38\x77\x83\x7d\xe9\x0c\xfa\xd2\x17\x4e\xb7\x97\x99\x88\x65\x58\x3d\xf7\xd4\x05\x15\x73\x2d\x74\x96\x32\x1e\x36\x98\xf2\x85\x5c\xa9\x7f\x0e\x06\xd0\xa3\x92\xce\x89\x33\xbe\x28\x38\x5d\xa9\xba\x52\xc4\xdf\xbf\xd7\x56\x09\xfc\x99\xde\xa7\xfa\x66\xef\x99\xca\x78\xa5\x92\xc5\x6f\x65\xcb\xac\xa1\x7e\x08\x75\x70\x76\x25\x4a\x25\x32\x56\xf0\x92\xe7\xc2\x86\x0e\x86\x46\x74\xc1\xf3\xe9\x09\x07\xd4\x0f\x0c\xa8\x07\x90\x4f\xf7\x4e\x84\x7d\x21\x80\xfa\x00\xab\xac\x69\xcf\x36\x43\xe9\xe8\xa6\xb4\xa4\xae\x9d\x1d\x07\xef\x8d\x76\xd1\xab\xb7\x60\x13\xd9\x0a\x61\xf9\x1f\xc4\xbb\x35\x6b\x77\x07\xb0\x6e\x7e\xc4\x01\x6b\x90\x01\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\xa1\xbd\x76\xcd\x8a\x2b\xaa\xd9\x07\xe1\x13\xfb\xca\x3b\xf3\x5d\xa8\x03\x7c\x54\x1e\xae\x79\x6e\xf8\x51\xe9\xde\xdb\x4a\x9e\x5d\x14\xa2\x63\x67\xfe\x66\x5f\xfe\x97\x17\x87\xcd\x41\x41\x28\x41\xb2\xb5\x5b\x13\xf7\x7d\x54\x32\x70\x23\xa6\x0b\xad\xaf\xd8\xde\x9a\xb2\xc7\xa8\xca\xc5\xc8\xb9\x39\xa0\xed\x3d\x76\xf3\xde\x67\x52\x01\x3e\xed\x2a\xae\xaf\x7f\x48\x12\x66\x01\x6b\x45\x39\x6b\x24\x86\x57\xa7\x09\x3c\x0a\x33\x6a\x36\x61\xe0\xac\x2e\xc6\xfd\xf3\xbd\xfc\xf5\x81\x05\xb9\xad\xfc\x75\x2d\xd5\xd0\xa1\xb1\x11\x92\x90\xb9\xed\xd4\xf7\x01\xe8\xf0\x5d\x3d\x5a\x0c\xa7\x26\x67\x0d\xa4\xf7\xda\x50\x0a\xc1\xca\x5d\xe8\x38\x45\x3f\xdd\x8d\xb5\xfa\x26\x1e\x1a\xcf\x8a\x05\xa7\xd4\x30\x2c\x07\xf6\x19\x14\x53\xc1\x16\x5a\xe9\x92\xca\x1c\xea\x42\x1e\x60\x33\x58\x77\x03\x2b\x40\xfc\x36\x9a\xea\x51\xed\x41\xf2\x4d\x50\x66\x19\x9f\x43\xc7\x9a\x56\x35\x0e\x30\x57\x5d\x61\x54\x33\xbe\xd9\x97\x2c\xfa\x6e\x0c\x00\x06\x6d\x90\x8b\xf9\x60\x26\x95\x6d\x40\x16\xc8\xa1\x9b\xb7\x23\xcb\xb9\x4f\x66\xf6\x53\x00\x37\x45\x28\xda\x34\x6e\xef\x60\xfe\x86\xbc\x16\x0d\x02\x23\xe7\xdd\xf3\x50\x34\x16\x93\xac\x50\x5e\xc0\xef\x39\xcb\xe5\x3b\xf7\x94\xf8\x57\x71\xb5\x81\x4a\x21\x4a\xbc\xfe\xeb\x7d\x67\x8c\xd5\x96\xdb\xc8\xad\x62\x7c\x67\xd4\x29\x41\xc1\x17\x67\x58\x2e\x80\x2f\x10\x47\x5a\xa8\xe9\x41\x9f\xfd\xdd\x1d\xaa\x2c\x84\x4a\x07\x3a\xea\x10\x32\xa5\xe1\xdc\x42\x7b\xf1\xdd\x27\x84\xea\x6e\x19\x22\x8c\xba\x2a\xa3\x3f\xb9\x68\xff\x94\x3c\xcc\x88\xf2\x5a\x26\xe2\x30\x49\x74\xa5\x7a\x65\xa1\x1e\x0b\xf7\x0a\xdc\x8a\xf4\xa2\x31\x26\x7a\xdc\x53\xf8\x16\x2b\xd1\x79\x26\x39\xc2\x0c\x35\xef\xc4\x22\xbb\x7a\x1c\xf0\xd8\xb7\x66\x48\x5b\xc6\x58\xc1\xbb\x65\x94\xf6\xa4\x50\xdf\x54\xf9\xd5\x37\x5e\x27\xe1\x5a\x14\x24\x67\xfd\x4a\x1a\xfc\xdd\x6a\x10\x2c\x37\x57\x35\xf8\x92\x80\x32\xa4\x70\x98\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x90\xa9\x03\x75\xad\xe3\x7b\xee\xe5\x0f\xcd\xf3\xff\x75\x7c\xd6\x2f\x73\x3c\xf4\x9d\xc1\xfa\x96\x05\x0d\x1d\x54\xf5\xb8\x2c\x3f\x2e\x4f\x74\x4f\x1e\xb1\x92\x13\xa4\x3e\xb5\x53\xcb\x04\x47\x9f\x0a\xdb\x8b\x32\xf5\xf7\x27\x8e\xa7\xd7\xd1\x72\x64\xf5\xd4\xfd\x2c\x17\x5c\x99\xa8\x04\x55\xc0\xd0\x3e\x2b\x36\xcc\x07\x05\x21\xad\x36\x79\x0f\xf6\xbc\xd3\xb5\x79\x87\xb1\x65\x95\x58\x56\x59\xe3\x3e\xc7\x87\x7b\x86\x79\x87\xc7\x97\x62\x2e\x8d\x2d\x97\xbe\x2f\xdb\x2c\x9a\x04\x79\x85\xc2\x2d\x57\x62\xc9\xbe\xfb\xfe\xe4\x1f\xbf\xbc\x78\x75\x74\xf8\xe2\x97\x97\x87\x47\xdf\x9d\x9e\x9d\xbc\x7d\x7b\xf1\x8f\x8b\xcb\x93\x97\x6f\xdf\x1e\x21\xc2\x08\x95\xe3\x5e\x08\xfb\xf6\x2d\xed\x54\xf3\xf6\xed\x65\x52\xc8\xe2\xed\xdb\x73\xef\x03\xc1\x8e\x0b\xff\xeb\xf8\x0c\xf8\x27\x56\x85\x85\xb4\x27\x90\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xa5\xb3\xab\xb8\x5b\x0b\x89\xd4\xeb\xb0\xbb\x01\xeb\x56\x49\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\x32\xc6\xb5\x20\x5c\x3c\x2a\x8c\x8e\x70\xb5\xd6\xb5\x63\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x73\x02\x3b\xdf\xd5\x3d\x81\xa0\xac\x19\x4b\x5b\x57\xa1\xbe\x40\x49\x2a\x74\x1a\xfa\x1f\xb5\xfc\xd2\x2b\x3e\xe9\x46\x19\x0d\x82\xb9\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x5b\x72\x2d\xd2\x94\xb7\x54\x9d\x40\x45\xe9\xbb\xa6\xea\xa0\xde\x00\x5d\x98\x51\x87\x1d\x50\x4d\x53\x9d\xf3\xfb\x76\x3a\xfb\x40\xfd\x0a\xf6\xa1\xfc\x77\xc5\x33\xd4\x01\xce\x75\xba\xca\x99\x76\xfe\xea\x3f\xfa\xdb\xe4\xaf\x61\x1e\x7f\x9b\xfc\x15\x3a\x5c\x7a\xb2\xfd\x6d\x62\xae\x93\xc9\x5f\xa9\x40\x9a\xd1\x4d\x6b\x73\x84\x57\xaa\x9d\x48\x9f\xc5\xdf\xc0\xb3\x39\xe8\xbb\x9f\xa4\xdc\x65\xc0\x56\xa1\x03\x37\x08\x45\x2d\x10\x6a\xaf\x93\x52\x70\x4c\x35\x67\xa9\xc8\x44\x8d\x03\xf3\x00\x3a\x54\xde\xde\xb2\xd3\xc7\xda\x1a\x0d\x4d\x63\xdf\x54\xd0\x97\x7e\xf3\x7d\x4f\x63\x83\xe1\xab\xba\x8d\x7c\x87\x03\xd0\x13\xa9\xe1\x5e\x61\x23\xab\x33\x81\xeb\xd3\xe7\xa4\xac\xad\xab\xdb\x35\xf1\xe8\x5d\x08\xb1\x89\x6a\xf4\x4b\x8f\x4e\xea\x76\xc4\x65\x98\x3f\x58\x1a\xd8\xcf\x0f\x83\xab\xf8\x0d\x54\xbb\x2d\x99\x93\x5a\x16\x3d\x19\x71\x85\xa8\x2d\xa1\xf3\xe0\x5f\xaf\xc4\x72\x84\x80\x1e\xa8\x84\xfc\x2d\x82\x59\x0e\x25\xd1\x08\xbc\xa6\x4b\xf6\x57\xff\xaf\xbf\xdd\xd7\x5a\xeb\xe1\x47\xed\xe3\x45\xc5\x97\xea\x1d\xf9\x3a\xc1\x2a\x98\x26\xc2\x07\x52\x96\x0a\x64\xac\x46\x72\x4d\xd8\x09\xd4\xbd\xa2\x46\x4a\x50\xb3\x59\xd6\xb8\xd9\xf8\xb6\x91\x0d\x74\x08\xf0\xbf\x44\xd5\x31\x67\xfa\x82\x2a\x33\x01\x66\x67\x26\xca\xfa\x13\x60\x30\x67\xfa\xe4\x9d\x48\x2a\xfb\x29\xab\xd5\xf1\xba\x12\xfd\x1b\x79\x7d\x2f\x02\x04\x11\xd2\xc6\x69\xe1\xa1\x32\xa1\x3e\x9d\x51\x72\xda\xfb\x69\x7b\x25\x96\x26\x80\xac\x5d\xe1\xe8\x54\xd5\x1c\xf6\xaf\x17\x64\x27\xef\xa4\xb1\xe6\x7f\xfa\x2e\x62\xf9\xb4\xee\xdf\xc6\x31\x4b\xac\x1e\x3d\x02\xd8\x73\x7f\xc2\x63\x3e\x35\xc1\xfd\x0b\xf4\xa6\xfa\x2b\x4f\x89\x08\x42\x8f\xbb\x77\xda\x35\x94\x9e\xa4\x15\x14\xaa\xc5\x58\x6c\x75\x62\x0d\xfe\x18\xf7\x27\xd2\x10\xe8\x72\xe2\x94\xbc\xa6\x98\xa1\x8f\xe8\x26\x09\xa8\x22\xf2\x9a\x67\x42\x11\x34\x6d\x96\x26\xbc\xc4\x10\x3d\x01\x0a\x19\x42\xb7\x26\x24\x0d\x27\xe3\x88\x93\xd5\xab\x6c\x28\x94\xc7\x4b\x2b\x93\x2a\xe3\x25\x73\xe7\x71\xae\xcb\x7b\xe2\x0e\xe1\xd5\xaf\x9b\x5d\xd8\xa2\x3d\x9a\x3c\x37\xf9\x7b\x7b\xc4\x36\xd0\x21\x69\x2f\xce\x64\x82\xfa\x9a\xe6\x41\xd9\x6b\xa2\x63\xeb\x99\xe7\x4d\x81\x51\xc4\x50\x79\xb6\xe1\x1c\x97\x73\xf0\x7f\xef\x47\xc2\x23\x9c\xcc\x09\xfb\x7b\xa8\x16\x1f\xb1\xda\x67\x0c\x35\xa9\xf4\x4c\x3a\x36\xb4\x5c\xf5\xa1\x9e\xe9\x12\x5a\x13\xee\xa5\x1a\x7e\x23\xae\x65\x62\xf7\x27\xec\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xc7\x2c\xd4\xe1\xd6\x80\x7d\x4f\xd8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\x88\x90\x40\x1f\x59\x36\x4c\x8f\x08\xf7\x9a\xe8\x76\x83\x8d\xa2\xa6\xd8\xda\x1a\x41\xf2\xeb\xc0\x21\x03\x4f\x94\x86\x4e\x69\xc3\x73\x1b\xe2\x2c\x9e\x85\x86\x8d\xf3\x2f\xf0\xd1\xb3\x52\xcc\xe1\xfc\xe1\xe9\xf9\x84\xa7\xcf\xea\x42\x67\x7a\xbe\xbc\x28\x4a\xc1\xd3\x23\xad\x8c\x2d\x81\x35\xf4\xc1\x77\xbb\x6d\xcc\xa8\x1b\xd6\x42\xdf\x30\x4e\xe5\xec\x7a\x86\x08\x79\xba\x9a\x2f\x10\xff\x1f\x7e\xe8\x3b\xc7\xfa\x29\x92\xd1\x69\x26\xec\x22\xe0\xfb\xc3\x06\x0f\xed\x02\x60\x14\x70\x78\xdc\xf0\x25\x1d\x26\x3e\x95\xa9\x30\x51\x8e\xb2\x9f\x0c\x86\x7e\x6e\x7d\x7f\xe0\xca\x87\x67\xc7\xf7\x6d\xaa\xb0\x41\x85\xf6\x96\x57\x09\x9a\x11\x52\xbd\xa6\x6f\xd0\x48\x81\x6e\x3c\xd7\xa4\xa9\x22\x96\xab\xa7\xcc\x27\xd4\x4d\xfb\x80\x2f\xe5\xfc\xdd\xc5\x95\xb8\xe9\xf0\x4b\xff\xa2\xdf\x8b\xfb\xa7\x82\x8d\xc1\x1e\x7d\xa3\x0c\xb7\xd2\xcc\xa0\xfb\xca\x27\xd4\xc7\xa1\xe8\xa0\x5b\x93\x08\xbc\x9a\xb5\x3b\xf1\x68\xbe\x28\x3c\xe0\x2d\x36\x36\x0b\xe5\xff\xd5\x76\x10\x0a\x40\x2c\x82\x08\xfd\x25\xdc\x09\x4a\xa8\xe7\x92\xd5\x75\x1c\x1a\x23\x15\x55\x3e\x15\x65\x38\xfb\xe8\x0c\x90\x65\x0b\x9a\xb6\x75\xf6\xbb\x33\xc6\xce\x99\x70\x7d\xd3\xca\x80\x3c\x27\xef\x9c\xe6\x61\xba\x25\x2a\xe1\xd5\x6c\x99\xd6\x1a\x14\xc3\x63\x3e\x81\xb3\xb5\x0c\x8d\xd6\x25\x60\xf6\xc6\x9f\x74\xe5\x73\xf5\xd5\xaf\xe9\x22\xeb\xd7\x78\x91\xad\x49\x94\xbe\xf5\xf5\x5b\xfd\x4f\xe2\x82\x3f\x72\x0a\x99\x11\x2a\xf0\xe8\xc0\xe6\xaa\x16\xec\xd4\x0b\x3f\x0b\xda\x9c\x33\x8a\xdc\x4d\xf8\xbb\xbe\xdd\x8d\x7a\x34\x6e\x64\x03\x34\x6f\x64\xc0\xcb\xae\x3a\x70\xc0\xf8\xf7\x9e\x58\x9d\x07\xe9\xdf\xc6\x91\x75\x37\xa8\xeb\xab\xb1\xa1\xae\x6a\xd3\x1a\x77\x56\xc3\xb4\xae\x99\x5d\x6d\x58\xf7\x7a\xf6\x00\xbd\xcd\x58\x4f\x1b\xb7\xbe\x1a\x84\xd0\xf7\xb0\x76\x39\x04\x98\xf4\xcc\x9f\x8e\xb5\x36\xef\xa9\x1a\xb1\x33\x6d\xdd\x7f\x22\xf3\xf7\x58\x0b\x73\xa6\x2d\x7c\xf2\x20\x48\x89\xaf\x30\x20\x21\x7d\x1b\x01\xc0\x7b\x03\xbe\x49\x21\x5a\x27\xf1\x3c\xc1\xd6\x18\x16\xa7\x8a\xe9\xd2\x53\x2c\x58\x17\x86\x86\x88\xc3\x0a\x84\xb1\x75\xab\x71\xe2\xc6\x89\xe9\xfc\x9e\xe1\x68\x28\xc8\xfe\xc2\x6f\x00\x3c\xb5\xc8\xa0\x40\x20\xad\x4a\xc4\xb0\x75\xba\xa6\x15\x73\x99\xb0\x5c\x94\x73\xe8\x05\x9d\x2c\x86\x58\xbe\x3e\x72\x05\xaf\x9e\xd2\x25\x9e\x4c\x8f\xbd\x04\x22\x1b\x54\xac\x01\x55\x00\x1c\x0f\xc5\x5a\xce\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x59\xc1\x65\x09\x98\xb7\x14\x3b\x8e\xbf\xa3\xe8\x4b\x3c\x8c\x1b\x61\xc5\xb7\xc4\x15\x13\x58\xc9\xe4\x46\x6f\x2b\x1e\x23\x76\xb3\xd0\x06\x85\x61\x70\x7f\xec\x5c\x89\xe5\xce\x68\x65\xeb\xed\x9c\xaa\x9d\x3a\x30\xdc\xd8\x6c\x41\x08\x43\x06\xe1\x0e\x7c\xb7\xf3\xf1\x74\x95\x5e\xc2\x76\x88\x8e\x01\xed\x09\x75\xdc\x57\xf5\xe2\x7d\x2f\x96\xfd\x3d\x66\x2f\x1b\xc3\x79\x65\xc9\x92\x8e\x5e\x4b\x3f\x83\x39\xff\x19\x78\xea\x17\x64\x76\xeb\x6b\xe1\xfb\xc2\xa1\x79\xe9\xf8\x42\xc8\x98\xe1\x59\x82\x3d\x3f\x70\x51\x61\x10\xb7\x98\xde\xc4\xc8\xb4\xbe\xaa\x0a\xbf\x29\x42\x6f\x5f\xa9\x12\x9d\x93\xd1\x41\x9d\xe5\xdc\xbe\xa2\x1d\x37\xa6\x38\x1e\xee\xde\xb0\x37\x08\x69\xbf\x61\xcd\x34\x27\x1c\xdc\x0e\xc2\x31\xbf\x60\x01\xdf\xf1\x15\x42\xca\x4b\x3c\xbb\x09\x03\x9a\x81\x5e\x90\x6a\xb5\x6b\x71\x6c\x7f\xcc\xd6\xbc\x48\x18\x99\xbc\x85\xee\x9c\xaa\x2a\xcb\x02\x7e\x28\xea\xf3\xe8\x0c\x84\x73\x41\x5e\xf4\xb9\x3b\x29\xb6\xf9\x82\x8f\xaa\x59\x7a\x4f\x5e\xda\xe8\x08\xe1\x68\xd4\xb5\x01\x1e\x5e\xe4\x38\xe8\x7d\x7a\x76\x5f\xe2\x40\x91\x93\x0b\x03\xeb\xf3\x52\x60\x45\x33\xec\x2c\xd8\x69\xd4\x22\xa9\x52\xe2\x5a\xb8\x95\x4d\xa5\x21\x50\x4d\x9f\xa7\xf3\xcf\x15\xbf\xc2\xff\x73\xac\xcf\xb4\xf5\xae\xaf\x7f\x7a\xdf\x31\x32\xf1\x77\x32\xaf\x72\x04\x9f\xb3\x6e\x8b\xa6\x72\xe6\xd1\xb4\x7d\x7a\x50\xd3\xe8\x6e\xfa\x7e\x68\x97\x5a\x5e\xce\x21\x4d\x98\x8c\x6e\xcf\xab\xe7\x99\x9e\xf2\x8c\xe5\x52\xb9\xc7\x50\x06\x40\xe3\xb3\x30\x13\xfa\xf3\x3d\x0f\x02\x81\x22\xe7\x72\x9a\x09\xb2\xea\x5b\x40\xf5\xd1\x8f\x5b\x37\x02\x4f\xca\x84\x31\x18\xb4\x7f\x29\xd5\xb1\x77\x09\x3e\x77\xa7\xe6\x1d\xcf\x8b\x4c\x60\x9d\x2b\xfb\x6a\xfc\x1f\xad\x04\xa3\x2c\x97\x11\xf3\xcb\x53\x77\xf4\x7b\x8a\xd2\xa8\xee\xce\x11\x52\x98\x9a\xcc\xc3\xbb\x23\x0d\xfb\xf2\xe0\xcb\x83\xa7\xcf\x9c\x22\x86\xb1\x2e\x6e\x08\xc7\x6b\x95\x1a\x4f\x27\xec\x57\xe6\x66\xf0\x94\xfe\xfb\x25\xfd\xf7\x2b\xf6\x2b\xfb\x95\xb1\x73\x76\xce\xe2\xff\xba\xff\xb0\x5f\xd9\xd8\x11\x21\x9a\xea\xd3\x51\x93\x77\x24\xce\x26\xf5\x55\xeb\xa1\xa3\xa6\xd5\x34\x34\x94\x0c\x26\x3a\x17\x30\xd5\x2f\xff\xa7\xbf\x07\xf2\x2d\x2c\x36\x3d\x85\x49\xed\xc1\x94\xf6\xd9\x0d\x78\xa6\x73\x7e\x85\x5e\x99\xc3\xc4\x56\x3c\x73\x0f\xdf\xfb\x6a\xfc\x74\x9f\x69\xd5\xbc\xfd\x5a\x6a\xc7\x03\xfd\x0c\xf7\x9e\xee\x4f\x56\xa6\xfc\xe5\x9a\x29\xb7\xfa\x7f\x52\xcd\xb0\x1b\xf4\xf6\xfd\xee\xb7\xfa\xa1\x5a\xde\xf0\x65\xd8\xf0\x5e\x64\xcc\xe5\x75\x68\x99\x11\x21\xf9\x40\xc8\x1e\xf6\xaf\xf4\xe0\x6c\x38\xe8\x92\x49\x3b\x61\xa7\x76\x77\xd7\x77\x9b\x75\x06\xb3\xef\xed\x71\x1c\x83\xce\x02\xe1\x61\x6f\x3c\x69\xa5\xf4\x77\x80\x38\x1c\x34\x36\x72\xaf\xe6\x1c\x78\xe5\xe1\x94\xf4\x66\x71\x3b\xf5\x89\x6b\x40\x42\xac\x9e\xfa\xf6\xc1\x0d\xd9\x87\xef\x3d\xdd\x2d\xe8\x78\xcf\x86\xae\x48\x1b\xa9\x4f\x7e\xfd\x4e\x23\x48\x84\xf3\xae\x6f\x86\xbe\x6f\x8c\x77\x19\xf6\x76\xa7\x79\x2e\xdf\xee\x40\x04\x2c\x28\xa1\xd4\x0c\x8b\x24\x3b\x41\x88\xfa\x6d\x1c\xc1\xdc\x1d\xaa\xb4\xce\x3b\xea\x38\x7f\xe8\x03\x01\x86\xd7\x1c\x82\x71\xe5\xea\x9b\x44\xb9\x49\x8d\x54\x56\x77\x0a\xeb\x73\x3c\x61\x87\xb8\x81\x0d\x44\x10\xef\x32\xaf\x5b\x69\x57\x37\x4a\xbe\x01\x9d\x25\x44\x52\x72\x8d\x38\x83\xca\x8b\x47\x72\xf8\x6a\xd2\xbe\xc2\xb2\x9e\xce\xd6\x24\x93\xd5\x51\x16\x44\x70\x75\x9b\x04\x8a\x8f\xe2\xfd\x13\xb5\xc6\x78\xba\x06\xce\x94\x8e\x8b\x69\x92\xeb\x09\x6d\xa4\xfa\x99\xda\xe2\x73\x7f\x6c\xf3\x8f\x60\xc1\x36\xe4\x26\x34\x93\xed\x22\x2c\xbe\x1c\xb5\x66\x4f\x9f\xff\xa9\x8b\x0c\xf9\xf2\xd9\xfd\x84\x03\xfd\xf7\xb2\xb1\xcc\x6b\x57\xf7\x4f\x7b\xf5\x2c\xf7\x21\x0b\x60\xcd\x21\x80\x8a\xa1\x3a\x22\x3c\x09\x02\xcd\x48\x5b\x71\x2c\x32\x52\xe2\x86\x32\x3f\x6f\x7f\xa9\xa8\x50\xd4\x33\xf7\x91\x93\x3f\xbc\x32\x02\x2a\xbf\x2a\x00\x05\x70\x84\xf4\xca\xee\x57\x7b\x5f\xb1\x31\x7b\xb2\xef\x76\x83\xc2\x6d\x05\xc4\x8c\x45\x99\x13\x0d\x94\xc8\x6c\x17\x4e\x79\x72\x94\x31\xa3\xd0\x8f\xae\x25\x84\x60\x49\x2f\x29\xaf\x99\x3b\x7d\x87\xfb\xd6\x8c\x2a\xf5\x8c\x1e\xd5\x93\x9a\x36\xa7\xea\x5c\xa7\xcd\x88\x59\x28\x23\x9b\x43\xd4\x1d\xea\x79\xa8\x4d\x14\xdb\xf3\xff\xa8\xa1\xde\xf7\x3b\xa1\x8a\x6c\x56\x16\x28\x9d\x8a\xc3\x19\xf4\x10\x58\x76\x45\x6f\x6e\xcb\x84\xb3\x95\x31\x23\xd9\xb0\xd0\x37\xec\x86\xf2\x93\xb1\xa1\x26\x96\xd9\xc5\x13\x39\x88\x5b\x9d\x23\x3f\x0b\x2c\x99\x54\x88\xc0\x4a\xe9\x18\x19\x58\xf6\x57\x31\x34\xcd\x98\x7d\xa7\x95\x2e\x9f\xa1\x76\xe4\x86\x34\x35\x2b\xbe\xfd\x71\xc8\x6a\x92\xac\x4a\xa3\xee\x88\xb5\x40\x30\x4e\xbd\x39\x05\x03\xed\xd9\x87\x46\x09\x66\x1c\xa4\x4a\xa7\x81\x8f\xbd\x6f\x70\xdf\x71\x7a\x6d\x4e\x6e\x40\xbf\x5e\x71\xca\xb8\x6f\xe1\x75\xa9\x3f\xc9\x24\xda\xff\x71\x65\xa6\xdf\xd1\xd1\xee\x75\x3f\x75\x4b\x76\xea\xe6\x65\x42\x03\xbb\xf7\x9d\x07\xa8\xc1\xec\xbe\xd9\x3b\x1a\x7a\x8e\x84\x97\x10\x8a\x1f\x72\xa7\xc6\x23\xbe\x77\x9f\x22\x0e\x15\xa6\x02\xf4\xde\x93\xb8\x1d\x42\xc9\x2a\x8c\x3a\x62\x3c\xd3\xe0\x60\x70\x0c\xd6\x7d\x24\x52\xba\x71\x16\x5a\xec\xaf\xf8\x0e\x16\x50\xa5\x5b\x27\xa3\x8c\x1a\x9b\xac\xbd\x5b\xfd\x0b\xdc\x61\x7f\xf6\xda\x8b\xf8\xcc\xcf\x78\x33\x46\x39\x02\x03\x24\xa6\x85\xb1\xbc\xd9\x7c\x25\x40\xe2\xc1\x92\xa1\x77\x68\x02\x74\x21\x03\x86\x8a\x2e\xd0\x01\x47\x02\x59\x9a\x10\x81\x94\x50\xc3\x9e\x44\xed\x8b\x4b\xd4\xc1\x64\x2a\x4a\x14\xa9\x53\xd1\x28\xd1\x09\xb9\x1d\xec\xc7\xfa\x4e\x2c\xcd\x81\x1c\x66\x1c\xe8\x6f\x58\x12\xbe\x33\xad\x92\x2b\x61\xbd\xef\xb6\x84\xaa\x82\xa2\xb2\x6c\xca\x33\xae\x12\xb7\x6b\xdb\xb1\x7c\xab\x71\x30\xfc\x25\x3c\x05\x71\x6e\x42\xe9\x08\x0e\x1d\x65\x1e\x4a\x65\xac\x1b\x0d\x53\x12\xeb\x09\x1e\x66\x46\x8f\xdc\xd9\xf4\x03\xac\xba\x0f\x60\x28\xfa\x37\xba\xa3\x89\xfd\x0b\x61\xa9\x36\x2d\xf2\x21\x13\x9d\x5b\x22\x0b\x4b\xb0\x9b\xfc\x61\xc2\xc4\x64\x0e\x2a\x6e\x6b\xc9\x76\x9a\x05\x92\xbe\xe6\x66\x67\x84\x6f\xed\x56\x8e\x0a\x56\xc9\xbf\x41\xad\x34\xa2\xb7\x52\x29\xd4\x71\xb7\x07\x0e\x77\x34\x9f\xe0\x14\x20\x3f\x3a\x28\xaa\xef\x1f\xfd\xd4\xae\xb3\x71\x3f\xf5\x99\x59\xb1\xe8\xfb\xbb\xd8\x56\x95\xfc\x26\x0b\x87\x2c\x13\x9e\xf9\xea\x0f\x68\xf5\x17\x70\xce\xd5\xee\x6e\xed\x0b\x80\xa3\x80\x9c\xa5\xb6\x56\x1c\xfb\x6c\x58\x0b\x6c\xcf\x2b\x7b\xcc\x8a\x2c\xc3\xc3\x5a\x1b\x4d\x4e\xf9\xb5\xba\xb6\x9a\x24\x8c\xd0\xf4\x5b\xac\xfd\x61\xfc\x23\x5f\x03\x03\xae\xb1\x65\x40\x28\x1c\xb1\x69\x65\xd9\x5c\x5e\x3b\xce\x7f\x27\x37\x07\xba\x72\x16\x22\x2b\x58\x29\xd2\x2a\x21\xdc\x02\x10\x4b\x87\xb1\x4d\x86\x9d\xa5\x3d\x77\xd8\x69\x10\x74\x07\x5b\x9d\xa9\xa6\xd4\x91\x33\x38\x20\xa0\x5a\xc9\x19\x13\xd7\xa2\x5c\xb2\x42\x1b\x03\xc7\x10\xd8\x16\x16\xef\x41\x9c\x28\x80\x29\x83\xfd\x00\xb3\xf2\x2a\xfb\x0e\xe9\xec\x3b\x60\xd3\xea\x06\x2b\xfa\x34\x2e\xbc\xaf\x0e\x9e\x1e\x3c\x7d\xbf\xf9\x75\x0e\xff\xab\x7d\x72\xfe\xbf\xa7\xb3\x35\x56\x66\x3d\x97\xc6\xce\xb9\x8f\xdb\xee\x4b\xf0\xae\x7d\xb5\x1f\x79\xef\xbe\x3a\xf8\xf2\xe0\xe9\x9e\x9b\xeb\x97\xfb\x6e\xd6\x91\x5f\xee\xcb\xc8\x2f\x17\x7e\x49\x33\x12\xa6\xe1\x99\x3b\x55\x54\xa9\x09\x6d\x4e\xc9\x36\xa7\xaa\x3f\x37\x23\x63\x7d\x08\x22\xf7\xbc\x1c\xb7\x5d\xd3\x2f\xb0\x6b\xd1\x41\x28\x2d\xfb\x43\xae\x4b\xf1\x87\xe8\xfe\x5b\x3d\x6a\xdd\x1d\x65\x1d\xd8\xcd\x6a\x48\x20\xe7\xc5\xf8\xaa\x43\x50\xac\x4f\x3a\x60\xdf\x64\xc0\xdb\x02\x1b\x39\x2f\xee\x31\x0e\xf6\x93\xe9\xd5\x6b\xf5\x05\x25\x92\xd1\x50\x94\x28\x85\x6e\xdc\x9c\x12\xfa\xa6\xcb\xb8\xfe\x77\x2a\x9c\x2e\x8b\x5e\xaf\x1a\x24\xf0\x9e\xed\x0d\x8d\xd5\x25\x9f\x8b\x03\x7a\xec\x63\x69\x6b\xfa\x03\x36\xf0\x69\x64\xc5\x20\xfc\x12\xb5\xf6\xf1\x25\xd8\x3e\x5f\x12\xb8\x00\x4f\xa0\x7a\x11\x08\xd9\xc0\xcf\x8c\xea\x22\x1f\x49\xea\x6d\x07\xb0\xbf\x3e\x89\x5e\xfc\xc6\x9c\x64\xdc\x58\x99\xfc\x3d\xd3\xc9\xd5\x85\x75\xe6\x4e\x6f\xd5\x62\xdd\xa8\x8d\x35\x55\xec\xf0\xc7\x0b\x76\x2c\xcd\x55\xdd\x25\x12\x3b\xb1\x34\x0b\x06\x79\x40\x22\x26\xec\x08\x96\xf3\x64\x81\xaa\x2b\x79\x9d\x7d\x37\xaa\xe1\xce\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x67\xc1\x1b\xc3\x8d\xc4\xd7\x39\x3d\xde\x40\xa2\xee\xcc\x74\x6d\x9f\xcb\xd6\xf4\x34\xf3\xe0\xf8\x88\x81\x90\x09\xea\x6b\x0f\x88\xcc\xcd\x3e\x65\xb0\x87\x96\xba\x62\x37\x1c\x0d\x6a\xe0\xb0\x13\x76\x29\x8b\x67\xec\x24\xea\xf8\xb3\x6e\x28\xa7\x7d\x04\xf4\x55\x32\xa8\x61\xcf\x61\xe2\x8d\x63\xc8\x54\xd3\xc3\x4e\x50\xb5\x32\xcf\xd8\x8e\x78\x67\xff\xb8\x33\x62\x3b\xef\x66\xc6\xfd\x47\xd9\x19\x74\x08\xa3\xce\xa3\x4e\xc7\x53\x33\x51\xd6\xa6\x23\xfe\x60\x15\xf8\x68\xf8\x2d\xcb\x2e\x5f\x1d\xbf\x7a\x06\xba\x7c\xaa\x9d\xd5\x47\xbd\xf9\x3d\x8c\x17\xf1\xc6\x88\x0c\x90\x2b\x92\xe8\xbc\x28\x75\x2e\xa3\x62\x5b\x38\x72\x5d\x4e\x00\x1b\x22\xdb\x0b\x0c\x5b\xd8\x0c\x83\xec\xa7\x30\x9c\xdf\x52\xd1\x07\xea\x2e\x9b\xe9\x74\xc6\x34\xa6\x06\x34\xcb\xfd\xa5\x09\x37\xb9\xed\x43\xa3\x60\xc7\xf9\x7a\xc3\x38\xcd\x9c\xbe\x3a\x48\xc5\xf5\x81\x49\xf9\xd3\x11\x3c\x06\x77\xc3\xb2\x35\x27\x6e\xd8\xce\xd3\x9d\x09\xbb\x90\xb9\xcc\x78\x99\x51\x2b\x5c\x1a\xa2\xbe\xcf\x19\x0a\x7e\x40\x30\x7f\x9f\xec\xb0\x3d\xac\xb7\x07\x75\x23\x13\x1e\x7d\x2d\xa0\x8d\x42\x66\xcc\x7e\x27\xed\x92\x0d\xe0\x7e\x67\xbd\x5d\xf0\x8c\xba\xe2\xbf\x52\x59\xe7\x2c\xe5\xe6\xe6\xf0\xa3\xf9\x62\xb5\xb2\x22\x47\xe6\x4c\x97\x64\x04\x86\x5b\x3c\xa8\x8f\x54\xa4\xb6\xbc\x74\x4b\x7f\xff\x4e\xd4\x1f\x4b\xfc\xb0\x01\x80\xe6\x58\x90\x22\xc3\xd0\xd7\x8f\x06\xc9\x07\x4a\xfe\xbb\x12\xec\xf4\xd8\x33\xf1\x42\x94\x46\x1a\xeb\x58\x54\xda\x50\x0d\x24\xea\x0b\x7b\x87\x39\xff\x8f\x56\xec\xe4\xef\x17\x34\xad\xfd\x07\x48\xec\x8e\x9c\x8e\xff\xa7\x2a\x85\xd3\x88\x7a\xab\x5f\x61\xa4\xb6\xca\xe5\x3e\x67\xc7\xdc\x72\xd4\xbc\x90\x53\xe9\x1a\x08\x0b\x94\xaa\x29\x14\x28\x79\x94\xb3\x8e\xca\x33\xdb\xbc\xf6\xe3\x76\xd0\x59\x77\xe4\x6c\xf7\xf3\x37\xaf\x4f\x37\xa0\x3b\x25\x20\x6e\xe7\x2f\x75\x3a\x90\x02\x15\x0d\xe8\x45\x1e\x00\x93\x1e\xe1\xe7\x2c\x77\x4f\x62\x67\x5a\x89\x11\x7b\x2d\x78\xca\x1c\x77\xa3\x7f\xfe\x58\x4a\x7b\x5f\xac\xa7\xfa\xea\x2d\xfa\xfd\x22\x0e\x42\x08\x3f\x98\x27\xc2\x59\x84\xef\x07\x60\x94\xc0\x74\x48\x07\x98\x66\x7a\xca\x88\x59\x6c\xf2\xed\xdf\xbc\x3e\x1d\xec\xe5\xdf\xbc\x3e\xf5\xef\xee\xfe\xa9\x67\x0f\xf3\xb5\x07\x34\x1e\x6a\xdb\xe1\x79\x4b\xd9\xaf\xd5\xb9\xba\x2d\x4e\xdb\x20\xb8\xbb\x35\x30\x19\xca\x0e\xd8\x14\xcd\xaf\xa4\xea\x5c\xef\xd6\xe4\x36\xd0\x12\x27\xc0\x3f\x45\x41\x34\x40\x9d\x4b\x9f\xb1\xbc\xca\x2c\x20\xfc\xc0\x5e\x73\x9b\x0f\xf2\xc3\xfc\xae\x63\x84\x76\xc9\xd8\xb1\xc0\x70\x44\xfa\xcc\xd7\x5c\x84\x5f\xac\xff\xc1\x4b\xae\xf8\xdc\xdd\x0e\x12\x90\xe5\xf8\x67\xb4\xc9\xf7\xd0\xe9\xae\xc2\x57\xfc\x9a\xcb\x8c\x4f\x65\x26\x2d\xe8\x73\xfb\x13\xaf\xcd\x63\x5e\x3e\x4c\x79\x63\xdc\x6f\x50\xd5\x36\xa8\xad\x31\x16\x0a\x40\xf9\xb1\x3d\xf7\xdd\xc1\x8d\x63\xf5\xfb\x13\xe0\xfb\x70\x23\x20\xaf\xb7\x94\xdf\xd7\x1f\x52\x7e\x37\xa2\xa7\xc2\x7a\x3f\xef\xd8\xaf\x6b\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x02\xd8\xfc\xcc\xd5\x27\xec\x99\xde\x43\x81\x82\xb3\xd3\xf1\xf7\x7d\x55\xa8\x8f\x73\x70\xd2\xcf\xef\xe0\x30\xec\x6c\x48\x2b\x3d\x08\xb9\xea\xe1\xbc\xae\x11\x80\x94\xf1\xab\x56\xa9\x38\x9e\xac\x0b\xe2\xe5\x1e\x60\x19\x7e\xef\xce\x53\x17\x20\x09\xbc\x7a\xb3\xdf\xb0\x83\x87\xa1\x8b\x1f\xcd\x93\x05\x85\x14\x7c\xcc\x3a\x9f\xb3\x9e\xaf\x99\x88\x62\x31\xeb\x9f\xcb\xee\x86\x79\x7e\xd1\x8c\xda\x1c\x89\x62\xc1\x9e\x5f\xac\x61\x93\x58\x47\xe0\xde\xdb\x60\x2c\x67\xd7\xb0\x4c\xce\x84\x95\x9d\x88\xb0\x61\x46\x99\x6b\x25\xad\x2e\xcd\x06\xd8\x9c\x7f\xf4\x30\x8a\x9b\x1f\xcd\xed\xcf\xd7\x9e\x28\xec\x65\xf4\x29\x67\x89\xce\x32\x91\xf8\xec\x7e\x58\xe2\xf0\xb3\x35\x8e\x18\xca\x40\x30\x93\xab\xaf\xc1\x15\x43\x4e\x97\x03\xdc\x76\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x77\x0b\x7d\x33\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\x41\xec\x8c\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\x00\xce\x6f\x4c\x0d\xb1\xee\xe3\xce\xa5\xd6\x76\x15\x64\x7d\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x7b\x42\xd0\xd7\xd7\xc3\xd2\x85\x6b\x37\x6f\x83\x44\x1f\x57\x33\x7e\x28\x07\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\x8b\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x57\x62\xc9\x00\x26\x61\xa6\x4b\x68\x59\xd2\xdc\x9f\xc2\x26\x40\xbc\x83\xca\x88\x72\x42\x0a\xc7\x03\x21\x7c\x1f\x55\x04\x5e\xe4\xb5\x98\x0d\x49\xf6\xd7\x62\xb6\x8e\xea\xf4\x31\xe0\xba\x86\xf4\x38\xa7\xaf\x54\x76\x81\xb9\xb1\x88\x27\x8d\xb4\x5d\xbb\x0c\x84\x73\xf1\x40\xe8\xde\x0b\xa1\x60\x08\x14\x9d\x3e\xdd\x10\xd9\xca\xe2\xc5\x6e\x4b\x5a\x24\x7b\xef\x30\x88\xbe\x76\x56\xac\xb8\x39\xb8\xd1\xe5\x95\x54\xf3\xf1\x8d\xb4\x8b\x31\x52\xca\x1c\x00\xba\xfd\xc1\xef\xe0\x3f\x14\x45\x3e\x4c\x53\xca\x7f\xab\x8c\x98\x55\x19\x66\xa6\x99\x09\xe3\x85\xfc\x41\x94\x06\xb2\x2c\xaf\xa4\x4a\x47\xac\x92\xe9\x37\x5d\x57\x8c\x0d\x71\x5a\xba\x77\xa7\x6f\xd3\xba\xa2\x06\xf5\x3a\x16\xa3\xa5\xe7\x49\x25\x4f\xb5\xc1\x1e\x47\x8e\x54\x8d\x23\xc0\xd3\x5c\xaa\x87\x72\x02\xba\x5a\x07\x52\xa5\xdd\x28\xd9\x0a\x40\xc0\x38\x4d\xf3\x80\x3e\xa3\x30\x76\xc8\xf9\xe1\xde\x7b\x82\x4d\xcc\x29\xfb\xa7\x99\xfb\x73\x27\xc6\x92\x2f\xcd\xbf\xb3\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\x89\x3c\xf7\xb9\x3e\x5d\x22\xcf\xb0\x0e\xf9\x4f\x90\x9e\xf3\x51\x77\x1c\x7b\xc0\x3a\xf3\xc7\xf5\x83\x6d\x90\xd4\xfd\x35\xe3\x8f\xa3\xa1\xd5\xd2\x07\xfa\xef\x19\x0f\x0a\x07\x0a\x18\x72\x25\xef\x4f\x83\x1c\xf9\xba\xe1\x93\xc7\x77\x48\xb4\x52\xd4\x0b\xe0\x55\x21\xd4\x85\xe5\xc9\x55\xcf\xa8\xee\x56\xab\xfa\x8d\x69\x55\x1f\x29\x11\xc8\x6f\x51\x2c\xbc\xa3\xf4\xb7\x3a\xd9\x1b\x0f\xf9\x23\x64\xc0\xd8\xd8\xee\x25\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x01\xc8\x5a\x54\x7b\x0a\x74\xfc\xf4\x1a\x4f\xdf\xf3\x4d\x22\x66\xb8\x1c\x98\x68\xc0\x26\x47\xcd\xdd\x27\x53\x69\x6b\x5e\x69\x84\x45\xf0\x27\x82\x03\xd6\x8a\x25\x04\xf0\x00\xfa\x48\x04\x5b\x10\xe9\x2a\x8a\xe9\xc4\xfa\xaa\xd1\x80\x13\xf5\xe4\xc9\x93\x27\x88\x7d\xf3\x5f\xff\xf5\x5f\x4c\x97\xd0\x77\x33\x91\xf9\xea\x8d\x70\xd7\x9f\x9e\x3e\x9d\xb0\x7f\x1c\xbe\x7c\x01\x15\x0d\x85\x35\xd8\x8d\x0d\x47\x76\x37\x34\x7e\x6c\x46\xec\xff\xbd\x78\x75\x56\xa3\x32\x34\xbf\x05\xd3\x3c\xbc\x5e\xb3\x07\xc6\x93\x3f\xff\xf1\x8f\x13\x76\x2c\x4b\xa8\xe8\x92\x22\xf4\x57\x0f\xae\x16\x5e\x0a\xc4\xea\x01\xd4\x14\xaf\x71\xc9\xd0\xca\x90\x0a\x93\x73\x39\x5f\x58\xaa\x88\x75\x1b\x32\x93\x89\xc5\xe2\x31\x64\x6b\xbe\x7d\x3b\xb6\xcf\xa0\x86\x34\xa4\xfd\xc1\xe4\x46\x2c\x93\x57\x82\xcd\xcc\xb7\xa5\xae\x8a\x1a\xd2\x90\x9a\x0e\x53\xa1\x0c\x0e\x56\xaf\x95\x11\xf6\x91\xa7\xad\xf6\x72\x35\x37\xf6\x36\x8c\xd4\x52\x58\xa9\xbc\xb5\xc6\xf5\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\xe8\x77\x19\x7c\x3d\x29\x3b\x0a\x5c\xc5\xa3\x8c\x14\xa5\xfe\x17\x6e\x01\xa8\x45\x8e\xd8\x33\xd4\x0a\xc3\x4a\x52\xa5\x70\x14\xdd\xf2\xf5\xd4\xd4\x60\xdd\x7f\x4c\x5d\x5b\x56\x5b\x5f\x65\xd2\xb8\x47\x00\xbc\xcf\x7b\x9e\x5c\xf7\xed\x75\xbb\xd4\xe0\x7e\xa9\xd4\xca\xaf\x09\x4a\x85\xd8\x25\x35\xbc\x24\xf4\xe1\x7a\x0c\xc4\x05\x20\xe4\x1b\xba\xd7\x53\x29\x10\xa2\x91\x6f\x6d\x84\xad\x88\x34\x90\x45\xef\x9e\x0d\xcd\x18\xe1\x0d\x73\x5e\x5e\x39\xc3\x95\xb8\xcb\x84\x9d\xbb\x49\x06\xf0\x1c\x04\xf6\xbd\xc6\xc0\x66\xce\x97\xf0\x58\x52\xdc\xe0\x21\xbb\x93\xc9\x2e\x1e\x3f\x5d\x32\x63\x79\x49\x67\xc9\x7d\xfe\x79\x20\x8a\xbf\xe4\x85\x41\x84\x5b\xa7\xa9\x02\xfa\xb3\x86\xda\x75\xbb\xf0\x2c\x88\x13\xad\xb7\x28\xe0\x6c\x0c\x84\xe9\x3c\xc0\x03\x47\x00\xa7\xd5\xa7\x53\xfe\x20\xe0\xa9\xf3\x1e\x0a\x07\x5e\xed\x98\x6a\xda\x8a\x6c\xdc\x49\xdf\xa0\x0e\x48\x99\x78\x54\x0a\xc6\xfa\x8e\xa7\xc4\x38\x63\x05\x2c\x6e\x85\xf9\x78\xf5\x08\xbc\x86\xd0\x26\xf0\xea\xaf\x53\xe0\xd5\x27\x88\x8c\x57\x63\x0f\xfb\x48\x32\x12\x93\x04\x18\xca\xa8\x59\xbd\x04\xd0\x97\xae\x88\x8e\x35\x36\x71\xf5\xcd\x88\x15\xe3\x53\xa3\xb3\xca\xe2\x4f\xeb\x2f\x63\xe9\x07\x83\x7a\x7c\x6c\x10\x79\xe1\xb6\x48\x16\x82\x16\x80\xe2\xa3\x8f\x58\xc4\xab\x37\xdb\xe8\xe3\x84\xf8\x0d\x39\x20\x7a\xd3\x39\x18\x6c\x43\xd0\xda\x0f\x16\x2a\xee\x6e\x16\x82\x52\x20\x22\xbd\xcf\x71\x53\xc7\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xa4\x1b\x71\x33\x26\x46\xf6\xf7\x25\x18\xc9\xf6\x8e\x42\x79\xbc\x4f\xbb\x3b\x55\x56\x94\x33\x9e\x88\xfd\xd8\xc7\x20\x8a\x85\xc8\x45\xe9\x08\x45\xf7\xf9\x1a\xed\x05\x57\x29\xc1\x4e\x25\xa2\x84\x13\x2c\xde\x59\x51\x3a\xa2\x1e\x5d\x9c\xb2\xb4\x94\xd7\xa2\x34\x6c\xef\xef\x00\x20\x88\x70\x53\xfb\x8f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\x94\xe7\xe1\x2a\xe2\x33\xf5\x52\x79\x6c\x2c\xb7\xac\x26\xf6\x1d\x4d\xdc\x81\x00\x11\x0a\xdc\x17\xba\x37\x63\x6c\xd3\x23\xb7\x43\x93\xa9\xc4\xe2\xc0\xdc\xb0\x52\xcc\x9d\x35\x56\x46\x30\x7d\x08\x93\xb2\xb1\xe2\x86\xe1\x0b\x4a\xea\x60\xd5\xfb\x6a\x3f\x66\x64\x57\xea\x6b\x99\x7a\x75\x08\xd1\xe8\x03\x26\x5c\xc1\x4d\x04\x5e\xc0\x8d\xd1\x89\x04\x57\x53\xb4\x34\x68\xa5\x82\xd2\xd4\x6c\xfb\xe5\xc3\xcd\x71\x98\x4c\x43\xf3\x9c\x4e\x3d\x47\xd9\x20\x02\x51\xa7\xe2\xbc\x9a\x66\xd2\x2c\x2e\x06\x0d\x89\xac\x1b\x18\x93\x12\x57\x32\x55\x6e\x8d\x8c\x18\xa1\x8c\xa4\x16\xf1\xa8\x6e\x49\xa7\x6d\x6b\x58\x06\xff\xeb\xf8\x50\x68\xa8\x86\x87\xc6\xf3\xfe\xab\xb3\x7a\x1e\x04\x56\x82\x1d\x8f\x53\xf1\x46\x15\x8d\xcf\x13\x9e\x65\x86\xf4\xdb\xd0\xcf\xc3\xcb\x1e\xd4\x50\x3d\x80\x09\xee\x0a\xe9\x36\x8c\x9f\x3d\xa4\xe0\x20\xf3\x0a\xcd\x67\xd6\xbe\x98\x89\x00\x86\xb5\xf2\x37\x41\xe3\x66\xff\x83\x40\x21\xac\xc4\xc1\x4d\xb7\xc1\xb6\x1f\xdb\xf0\xcf\xe3\x0b\xff\x7c\x9c\x9a\x8a\xba\x9d\x26\x87\x0f\xc7\x50\xa1\x85\xa1\x8d\x8a\x5a\xc4\x7a\x41\xe3\x05\xd2\x07\xd2\x34\x37\x16\x02\xc6\xf9\x1d\x5a\xea\x3e\x31\x8c\x77\xb7\x3d\x28\xa8\x62\xce\x14\x07\x0e\x35\x26\xfa\x25\xd1\x91\x22\x1b\x39\x9c\xf3\x55\xbe\x56\xcb\x74\x10\xe7\xf8\xe1\xae\x61\xa9\x4e\x2a\x67\x7c\xd5\x64\xaf\x13\x2e\xfa\x75\xe6\xfb\xbc\x5a\x05\xa5\xfa\x46\xdd\xf0\x32\x3d\x3c\xef\x54\x9b\xdb\x54\xce\xea\xb1\x62\xd5\xdb\x7f\xcc\xdc\xe7\x7c\x0a\x48\xb7\x84\x6d\xb8\x8d\xf6\xad\x1d\x22\xe6\xe6\xeb\xdc\x6d\x56\x3b\x26\x7b\xc7\x68\xde\x7d\x1d\x76\xdb\x00\xe1\x36\x40\xd8\xb8\x1e\x52\x80\xf0\x14\x03\x84\x71\x57\xdb\x06\x7b\x21\x0f\xad\xa3\xf8\x67\x11\x63\x3a\xae\x59\x2a\x6a\xe2\xed\x7a\xde\x96\xf2\x8f\x87\xb7\xde\x75\x91\xc1\xe0\x79\x2e\xe8\x65\x9f\x43\x3c\xea\x01\xc4\x93\x80\x96\x3d\xac\x42\xbc\x9a\x0c\xbf\xae\x57\x43\x94\x5a\x0c\x4c\x47\x11\xee\x42\xa7\xd4\xcd\x00\xda\x6c\x60\xcb\x80\x51\x68\x83\xa7\x7c\xb9\x29\x68\xe7\x05\x4f\x04\xf0\xb7\xa0\xfe\x0c\x12\x24\xe8\xb9\x01\xd8\x40\x9b\x80\xc1\x46\x00\xea\x9c\xf7\xd9\x0d\x6c\xb0\x1d\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x1b\xc1\x24\x0b\x91\x73\xf8\xe7\x73\x4f\x02\xc7\x1b\x9d\xf1\x60\x05\x42\xc0\x89\x32\x37\x4c\xcf\x46\x8d\x4c\xd7\x9d\xeb\xa7\x3b\xfd\x82\x0d\x6c\xb8\x38\x25\xf3\xe7\xe8\xbc\x77\xb0\x87\xb5\x09\x76\xde\x88\xed\xb8\x33\x54\x37\x7c\xf4\xb8\xf7\x21\x83\x02\xe4\x07\x52\xf8\xc1\x10\x67\xe8\x20\x6e\xd7\xe0\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x0d\xde\x7e\x8e\xc1\xdb\x48\x30\x7a\x46\xb7\x26\x90\x1b\x87\x04\x7c\x34\x77\x2a\xbc\x51\x43\x36\x8c\x0f\xe5\xfa\x38\xae\x2e\x9b\xa9\x4b\xbb\x93\xc9\xee\xae\x8f\xee\xd2\xbe\xaf\xec\x6c\xfc\x35\x13\x2a\xd1\xa9\xef\x56\x3b\x93\xa5\xb1\xa0\xee\xd5\xee\xb6\x78\x2e\xb9\x7f\x56\x9c\xfe\x04\x63\x0f\xb1\xd4\xbd\x79\x8b\x87\x24\x7c\xfe\x11\x94\x98\x5a\x75\x09\xc0\x87\x44\xa2\x80\x67\x4d\x3a\x8c\xff\xde\xb0\x4c\xe6\x92\x7a\xbd\xbb\x83\x2e\x8c\x35\x6c\x0f\x3f\x9c\x24\x45\x35\xa2\x1b\x26\xb9\xc8\x75\xb9\x1c\x85\x9b\xdc\x97\x8d\x5f\xd1\x1d\xfb\xd8\xef\xa4\x2a\x4b\xa1\x6c\xb6\xfc\x9c\x35\x20\x4f\xc4\x07\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\xcd\xad\x55\x47\x7c\xc1\x6d\x1e\xf5\x17\x08\x68\xb4\x66\x54\xc7\xc5\xdd\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x39\x7e\xdd\x35\xa0\xce\x93\xca\x6b\x69\x74\xe7\xb0\x68\x34\x50\x4c\x9e\x8b\xe0\x84\x76\x87\x4d\x57\xb6\xa8\x2c\x71\x74\x7f\x02\x3d\xca\x78\x38\x79\x2d\xe5\xf0\x69\x97\x2e\x4a\xcd\xab\xe0\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\x97\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\xbd\xa7\xce\xd5\xf2\x55\x4f\x56\x88\xd7\x78\x40\x91\xdc\x1c\x71\x90\xed\xd7\x6a\x2b\x21\x95\x1d\xeb\x72\x8c\x43\x3f\x03\xb0\xe0\x9e\x0f\xf0\xdb\x6b\xe8\xf3\x5f\xab\x01\x35\xdc\xbe\x57\xea\x37\x7c\xc0\x21\xf4\x79\x2c\x07\x28\x33\xf6\x23\x35\xcb\x64\xac\xc8\x0b\x5d\xf2\x72\xc9\x52\xf2\x66\x2e\xd7\x20\x10\x45\x10\x44\xbd\x21\x85\x61\x1e\xa9\x2c\x37\x50\x69\xdc\x1b\x51\x48\xa4\xb2\xca\x07\xc2\x13\x82\xb1\xe2\xc5\xb8\x01\xe4\x7d\x42\xed\xf7\x29\x45\x74\x1b\x05\x34\xa6\x3c\xb9\x42\x0b\x2a\xac\x16\xea\x8d\x51\x69\xfd\xce\x0e\xa5\x44\x60\x3b\x7f\x72\xec\x43\x6e\x8b\x4e\x85\x5b\x4a\x7f\x33\x8e\xdd\x70\xc2\x63\xa4\x9d\x12\x08\xeb\x8e\x54\xba\x64\x2f\x41\x01\xda\xe8\xea\xb3\x41\xb0\x42\xe4\x7f\xc4\x0b\xa7\xf5\x0d\x54\x89\xea\x87\xf3\x09\x44\x56\x83\xbd\x49\xb8\x5e\x33\x68\xb2\x55\x67\x88\x35\x34\x0b\x58\xc8\x13\x7f\x2c\x7d\xfc\xd6\x2d\xa7\x1b\x15\x75\x53\x70\x4c\x67\x06\xf3\x56\x64\x02\x7d\xa0\xc0\x36\x85\xe5\x08\x4b\x78\x19\xb5\xe6\xaf\x8c\x7b\x92\x56\xcd\x7b\xea\x07\x61\x9b\xac\x29\xee\x09\xdf\x4f\xbb\x69\x51\xbb\x6f\x2e\xc2\x9b\xd5\xfe\x0c\x28\x59\xf6\xe6\xa7\xa9\xc0\x48\xa1\xa7\x90\xaa\xad\x67\x90\x59\x11\xf5\xeb\xf1\x2d\x69\x56\x36\xaa\x92\x59\x73\xa7\xfa\xce\x13\xe1\xc5\x2b\x45\x09\x85\x2b\xdb\x6e\xfd\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xed\xb7\x47\xa7\x76\xf4\x54\x36\x86\x52\x31\x06\x51\x2c\x06\x57\x27\x42\xca\x66\xff\x0e\xaf\x75\xf6\x67\x43\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xcc\xc0\xa7\x1b\x5c\x06\x57\x12\xc9\xd9\x64\x99\x10\xb4\x93\x6c\xb4\xee\xc1\x61\xf1\x4c\x40\x51\xd5\x38\x34\xaa\xae\x1d\x12\x6c\x2a\x66\x98\xf1\x84\xbf\x01\x4f\x01\x95\x82\xa5\x22\x13\x56\x44\x1d\xe6\x0b\xec\x89\x5d\x8a\x5c\x5f\x53\x63\xd6\x37\x86\xe2\xe5\x72\xf6\x8c\xf1\xfd\x46\xc1\xb1\xa1\x96\xc7\x42\xa4\x58\x1f\x16\x35\x15\x2c\x2b\x65\x46\x6c\xba\xef\xf3\x59\xa9\xfd\x65\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe5\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\xd7\xd2\x48\x4d\x91\x2e\x3f\xee\x79\xe8\xc2\x80\xd1\xb3\xa3\x8c\xcb\x9c\xed\x19\x21\xd8\x89\xdf\x12\xf8\xcd\x05\x6a\x92\xe8\x49\x2c\x9b\x49\x75\x04\xf8\x48\xc0\x03\xee\x93\x9a\xf5\x86\x54\x05\x54\x06\xdc\xcc\xd7\x3e\x74\x3f\x2c\xd7\xfa\x39\xe9\x12\x12\xde\x7c\x0b\x20\xa1\x52\x1d\x65\xc4\x1c\x9e\x9f\x9a\xd8\xbe\xa5\x36\x8a\x38\x12\x7c\x91\x69\x35\x8f\x81\xef\xea\x9d\xe9\x98\xbc\x82\x7e\x98\xd7\x32\xad\x78\x86\xec\x9d\x26\x73\x74\x71\x8a\x3f\x97\xf3\x85\x1d\xdf\x08\xf0\x7e\xa2\x14\xac\xcf\x8c\x7f\xa8\x5c\xc9\xb4\x95\x06\xc4\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\xc3\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x86\x9d\xba\x3a\x37\xe8\xf6\x58\xf7\xdc\x08\x1f\xdb\xba\xf3\x23\x28\xc4\xdd\x3b\x04\x6f\x4c\x91\xbd\xae\xb7\xc9\xa5\xc8\x8b\x8c\xdb\x61\x52\x4b\x76\x7e\x8c\xdc\xdf\x51\xf0\xd8\x1d\x47\xae\xd2\x31\xcf\xdc\x8e\x3c\xff\xe1\x88\x2a\xdb\xf0\x80\x35\xd2\xd7\x2e\xeb\x1e\xa5\xbe\x2f\xb5\xd3\x92\xd6\x1e\x2d\xc0\x52\x9b\x8a\x14\x98\x11\x3d\x19\x7c\x14\x37\x0a\x7b\x04\xbb\x3f\xce\x7f\x38\x1a\x31\x39\x11\x13\xff\x57\xb8\xd5\x73\x43\xab\xe7\x58\xe0\x10\x2a\x68\x60\x3f\xc3\x54\x62\xe7\x6f\xfc\xdb\x7f\xfe\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\x5e\x46\x7f\xfb\xa7\x63\xae\xa5\xbb\xa1\xf9\x69\x9c\x5f\x0e\x7c\xcf\xfd\xf5\xcf\x73\x9d\x5e\x14\x22\x99\xe0\x6b\x99\x7f\x62\x96\x00\x13\xca\x3a\x5d\xfb\x5c\x43\x66\x99\x4c\x71\x97\xc3\xb3\x4b\xf1\x2f\x1f\x20\xa0\x76\xa9\xc4\x48\x12\x6e\x85\x02\x01\xe0\x0b\x8d\x95\xb6\xf8\x73\x6c\xb4\x0a\xf3\xdf\x9b\xc5\xad\x4f\xad\xd6\x70\xcc\x91\x95\x1c\x2a\x26\xde\x49\x03\xb8\x33\xf8\xae\x40\x0e\x4e\xc9\xeb\x5e\xa6\xb9\x61\x1d\x85\x03\xcc\x10\xf4\x5e\x75\x73\xfb\x83\xd2\xf6\x0f\x61\xf9\x7d\x62\x22\x76\x30\x67\xfc\x5a\xcb\x94\x55\xd0\x37\xcb\x9d\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x12\x13\x76\xe1\x64\x56\x9c\x61\x80\xd4\x53\x0c\xba\xd0\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x65\xd9\xe9\x8c\x99\x2a\x81\xe6\xbc\xa5\x18\x7b\xe9\x48\x77\xad\xf0\x98\xfa\x5d\x46\x61\xb1\x17\x1c\xed\xa7\x22\x85\x9f\x62\xab\x5f\x45\xdb\x6b\x25\xaf\xda\xcd\x53\xab\xa4\x96\x88\x40\x4c\x68\xaf\xed\x84\x60\xe6\x13\x80\xd0\x94\xa3\x80\x81\x12\x89\x30\x86\x97\x4b\xec\x86\x2a\x43\xd3\x46\x4a\x79\x05\x49\x9d\x73\x55\xc1\x00\xa5\xc0\xde\xba\x55\x02\xd4\xe1\x6c\x5a\xea\x2b\xa1\x42\x09\x81\x5b\xc5\x66\x42\x75\x9d\x35\x8a\x6d\xa7\x59\xb2\xe0\x6a\x2e\xea\x2a\xf2\x9c\xa7\x40\xfb\xef\x83\xa6\xe5\xdf\xc7\x51\x80\xcf\x9c\xc2\x22\x2d\x90\x62\xea\xe4\x53\x08\x7b\xbc\x55\x01\x07\x77\x54\xc7\x25\xdc\x2b\xc9\xac\x13\x4f\x64\xc3\x38\xc2\xfb\xbb\xc0\xc7\xa0\x50\x6c\x30\x79\x3b\x17\x96\xa7\xdc\xf2\xc1\x12\xb8\x5f\xf2\xd0\xf5\x93\x92\x3a\x60\x3b\x44\xc9\x1e\x24\x63\xbd\x2a\xa9\x0b\x19\xe3\x0a\x00\x37\x58\xf8\xd5\x07\x5c\x2a\xeb\xf6\x35\x05\x1d\x31\x2f\x1b\x74\x35\x9e\x65\xfa\x86\x90\xea\xfc\x68\xc8\xb2\x44\xca\xd2\x0a\xd4\xbe\x9a\xa5\xf5\x09\x8a\x0f\x12\x33\x71\x0b\x3d\x18\x95\x2f\xeb\xd8\x7f\xd2\xcc\xcd\x5e\xab\xa0\xa1\xac\x13\xca\x4a\xec\xa1\xef\x81\x20\x88\xf8\x95\xc2\xa3\xda\x5a\x06\x58\xa7\xb9\xb0\xa6\xce\xaa\x44\x69\xe2\x58\x24\xc9\x72\x72\x22\x80\xa8\xa1\xa5\x21\x3b\x7c\xbd\xa6\x88\x0b\x67\x34\x49\x0b\x27\xbf\x36\xbe\x32\xc3\x05\x8f\xb0\xfd\xed\x4b\x9d\xf6\x8f\x42\xb5\xfa\xb8\xd6\x03\xd7\xd5\x26\x58\x79\x64\xc0\xc9\x83\x37\x40\x4c\xde\x34\x60\x32\x50\x04\x2c\xf8\x75\x77\x77\x6a\xad\x99\x8e\x43\xb3\x36\x78\xdc\x18\x1e\x37\x7e\xda\xd7\x71\xdd\x3f\x6b\xd1\x5f\x3d\xb3\x17\x9b\x13\x1a\x20\x52\xe1\x58\xeb\xc5\x20\x81\x84\x16\x8a\x52\x18\x97\xe4\x2f\x65\x66\x84\x6c\x18\xaa\xa7\x15\xd2\x71\xcd\x67\xec\x0f\x0d\x8d\x8b\x34\xdb\x60\x0d\x63\x15\xd3\x9e\x37\x8f\x27\xb4\xf0\x1e\xce\xab\x79\xfb\x7e\x6b\x30\x50\xf5\xd6\x5b\x8d\xbe\x5a\x2a\xa8\xdf\x4e\x55\x86\x3e\xfc\xa1\x46\xd5\x6d\xe6\x52\x67\x99\xef\xdd\x8e\x16\x72\x2b\xb7\x09\xfa\x06\x61\xb4\x64\x14\xdc\x10\x41\xdf\x57\xe2\x26\x28\x76\xdc\x20\x5c\xa9\x8f\xd5\x83\xab\xc4\x27\x9c\xad\x1b\x2f\x54\x74\x1d\xaa\x25\x4e\xfd\x38\x22\x2d\xba\x17\xd8\xdc\x3d\xc8\x59\x00\x8a\x4f\x33\xcc\xc8\x09\x8a\x0f\xcc\x85\x67\x37\x7c\x69\xe0\x94\xd5\x16\x5b\x78\x3e\x61\xbd\xd7\x03\xbf\x16\xb3\x1e\xfd\xe4\xe3\x6b\xb0\x68\xfe\x70\xf1\x7c\x00\x5b\x91\xaa\x7b\x92\x6e\x3d\x4c\x87\x16\xdc\xed\x6b\xb8\xb4\x00\xc8\x8c\x84\xb4\xa8\x21\xe2\xab\x8d\xe3\x7c\x78\x7e\x0a\x03\x7b\xcb\x6d\x0e\x7f\x78\x89\x1e\x02\x85\x53\xe1\xce\x5b\x0d\x11\x05\x7b\x37\xfe\xed\x9a\xbc\xb1\x7a\xd3\x7f\x0f\xfd\x90\x28\xfe\xe2\xeb\x81\x9d\x40\x38\x3c\x3f\xc5\x27\x4e\xa0\x25\x2e\x57\x4b\xd2\xb5\xec\x42\x96\xe9\xb8\xe0\xa5\x5d\xa2\xf3\x62\xd4\x78\x5a\x28\x8a\x1c\x80\x1c\x83\x86\x86\xfb\xb4\x50\x8b\xaf\xc6\x1a\x01\xf9\x7c\xe0\x85\x22\x67\xb7\xae\xcc\x43\xa3\x48\xdf\x12\x4d\x7f\x35\x28\x12\xb7\xd0\xf1\xbe\x8b\x47\x41\x91\x34\x66\xc4\x1f\x4b\x2e\x3b\x1e\x6f\x9a\xe9\x2c\x28\x66\x41\x87\x26\x7f\x93\x8e\xeb\xc6\x82\xce\x06\xc6\xbf\x1b\x69\xc4\xe4\xcc\x09\x38\xad\xc6\x54\xad\x1e\x9c\xe3\xa4\xf7\xf9\xbc\x4f\x34\xe4\xdd\xd1\x45\xf7\x67\xfc\xac\x78\x80\x70\xd6\xd9\x9e\xd2\x0a\xcf\x3f\xde\xbb\x8f\x69\xaf\xb7\xf8\x77\xe1\x96\x09\xfb\x71\x21\x54\x2c\xfc\x62\x87\xf8\x28\x08\x61\xa9\x52\xb7\xf8\x20\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\x35\x7f\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xb8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x60\xb0\x4b\x64\xa9\x4d\xc9\x4f\xd8\x7a\x8e\x9b\x4e\x79\x72\x75\xc3\xcb\xd4\x40\xfd\x3a\xb7\x12\x5b\x1c\x8e\x1a\xc3\xee\x45\x73\x70\x4f\x6f\x68\x0a\xfb\xc1\xb8\x35\x22\xb4\xb2\xab\x1f\xc3\x78\x65\x75\xce\xad\x4c\xc0\x6d\x23\x67\x91\x27\x3e\x0f\x2d\x20\x42\x24\x15\x39\x3b\xc8\x0a\x7a\x0d\xb0\xe0\x4a\x2c\xb3\xb0\x37\x9a\xc9\xdc\x69\x60\x1c\x5a\x3f\xcf\x42\xb5\xba\x8f\x19\xbc\x6f\xa6\x4e\xcd\xfc\x11\x02\x35\xd1\x5d\xe8\x10\x72\xa6\xba\x81\xe1\x43\x54\x20\xb8\xc3\xa9\x2c\x7b\xd4\x52\x90\xe8\x37\x6e\x4f\xbb\xb9\x46\x5b\x75\xe4\x96\xe7\x46\x38\xbd\xcb\xbc\x77\xc3\x9a\xc9\xba\x19\xc9\xb9\xc2\xc2\x5d\x69\xbc\x0b\x81\x32\xb1\xf7\xd2\x52\x17\x05\x39\x03\xf3\xfd\xf6\x8c\x20\xf6\x56\x5e\x0b\x03\x71\x67\x9f\xdb\xed\xc8\x30\x17\x4a\x94\xdc\x82\x27\x9f\xe0\x08\xe1\xe4\xb6\x1f\xd1\x38\x30\x13\x04\x65\xd9\x67\x6f\xa8\xc1\x7f\xd8\xb8\x21\x53\xfc\x4e\x8a\x29\x7a\x16\x49\x37\xdd\x6a\x94\xef\x1d\x66\xab\x51\x6e\x35\xca\x0e\xd7\x56\xa3\x6c\x5f\x5b\x8d\x32\xbe\x42\x32\xf2\xb0\xda\x64\x5d\x5d\x10\x25\x7e\xc4\xa9\x54\xf5\x0d\xb7\xb9\xfc\x4e\x67\xec\xb5\x48\xf4\xb5\x28\x51\x88\x9c\xbc\x2b\xb8\x72\xba\xd2\x73\x2e\x33\x27\x42\xbc\x28\xa9\xdd\x1b\xd0\x47\xa7\xe9\x62\x8f\x3c\x4a\x61\x3d\xe8\xb0\xe6\x34\x29\x42\xba\x70\xf7\x53\x20\xbf\x28\xc5\xb5\xd4\x95\xf1\x09\x5f\x95\x45\x66\x61\x2c\xe9\x33\x0b\x39\x0f\xed\xee\x42\x3a\x46\x29\x12\x5d\xa6\x35\x64\x95\xb1\xdc\x56\xa6\x59\x43\x9a\xa0\x4f\x7b\x38\x77\x66\xa0\xe3\x03\x92\x9e\x43\xca\x19\xcc\x98\x1b\xfc\xbc\xee\xbe\xc0\x4c\x3c\xfc\x70\x4a\xdb\xd0\x27\x07\xd6\x89\x89\x4e\xf5\xad\xac\x88\xb6\x2b\x6d\xac\x7b\xaf\x61\x03\x8f\xe6\x00\x9b\x87\x8f\xc3\xb0\xe3\x3a\x17\xb0\x73\x7f\xc4\xf8\x1a\x70\x35\xd9\xe0\xc0\x29\xf1\xf5\xe8\x52\x07\x9b\xd7\x60\x55\x0b\xec\xa3\x54\x2e\xb0\xe1\xab\x17\xd8\xc7\xaf\x60\x60\xa1\xa2\x6c\xf8\x73\xff\xda\x57\xb8\xb5\x4e\x3e\x89\xa5\xf7\x9d\xfc\x06\x94\x5a\x18\x47\x1a\xa6\x73\x69\xad\xf0\x09\x24\xe1\x24\x83\xc3\x3f\xae\xf0\x21\x9e\x03\xbe\x04\xcc\x12\x11\xef\x42\x0f\xa9\x48\x57\x05\x8d\xf3\x46\x1a\x30\x90\xb8\x72\x76\x2d\x22\xda\x02\xef\x18\x53\xba\xaf\xb7\xd5\xb7\x7c\xa8\xff\xb8\x5b\x3e\x14\x5f\x5b\x3e\xc4\xa0\x1b\x57\x06\xc5\x23\x83\x2a\xc6\x7e\x50\x82\xd2\xe1\x53\x91\xb1\x7f\x57\xa2\x5c\x32\xa7\xe8\xd6\x69\xa6\xd0\x6e\xcb\xc8\x94\x12\x35\xc9\x31\xd9\xd7\xba\x7c\xa0\x3a\x1e\x38\x4e\x4f\xde\x39\x3b\x01\x10\x10\x06\xe7\xfa\xed\x07\x34\x81\x8c\x70\x15\xc2\xca\xc4\xd6\x01\xe6\x88\x34\xec\x05\x67\x2a\x1c\x9e\x1d\x0f\x69\xea\x0f\x91\x3e\xc0\x86\x4b\x21\x60\x2b\x2e\x99\xf7\x90\x08\x49\x19\xbe\x01\xc1\x16\xd2\x3c\x82\xa3\x91\x5d\x89\xe5\x88\xb2\xa9\xa8\xd7\xa2\xbf\x19\x13\x13\x9b\x0d\x5f\xfa\x01\x05\x36\xaf\x81\x25\xd0\x90\xbe\x41\xbc\xfa\x36\xf8\x68\x8e\xe5\x89\x3b\x8c\x50\x1c\x58\xc8\x0e\xd0\x08\x24\xbe\x6e\x6b\x0a\x82\xbb\x15\x7a\x08\xf8\x6a\xa9\xb0\x41\xa1\x42\x0c\x38\xec\x30\xdb\x8b\x0d\xed\x9e\xc2\xcb\x2f\xe3\x47\x22\x56\x38\x82\x8d\xb2\x9c\x2b\xb1\xdc\x35\x84\xa5\xa1\x95\x59\xc8\xc2\x77\x89\x04\x3e\x49\xa7\x92\xfd\x00\xf9\x6f\x7e\x08\xe4\x88\xa7\x6a\xc4\xce\xb4\x75\xff\x39\x81\x84\x5e\x8c\xb1\x68\x61\xce\xb4\x85\x4f\x1e\x34\xb9\xf1\xd5\x3e\x12\xb1\x29\x44\x23\x21\xc4\x82\xa9\xeb\x50\xbb\xea\xd3\x3c\x81\xa8\x94\xcb\x13\x16\x46\x1a\x76\xaa\x98\x2e\x3d\x55\xad\x6f\x7c\x65\x68\x08\xef\xbd\x8e\xa2\x61\x6b\xc6\xa0\xc5\xd0\x65\x63\x2d\xde\x33\x5c\x08\xac\x49\xff\x0d\x78\xb7\x21\x12\x19\x72\x53\xa1\xf9\x12\xb7\x62\x2e\x13\x96\x8b\x72\x0e\xb8\x2b\xc9\x62\xe8\x25\x1e\x4a\x2e\xe2\x35\xa0\x74\xc4\x6b\xd0\x7d\x08\x2a\xca\x0b\xc8\x3a\xfe\x38\xea\x0f\x8e\x8d\xe2\x3a\xe7\x85\xdb\x82\xff\xc7\x49\x65\xd8\x05\xff\x17\x9a\xbb\x99\x09\x3b\x64\x46\xaa\x79\x26\x1a\xdf\x91\x3f\x33\x1e\xc6\x8d\xe0\xec\xd7\x7f\x57\xf2\x9a\x67\x02\xab\x04\xb8\x0a\xad\x57\xf4\x6c\x45\xe9\x1a\x51\x87\x37\xc7\x97\x43\x0c\x7e\xe7\x4a\x2c\x77\x46\x2b\xdb\x76\xe7\x54\xed\xd4\x10\x4e\x8d\x8d\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\x66\xec\x60\x7b\x92\x5c\xce\x47\x19\x37\x66\x08\x34\x99\x56\x41\x78\x6b\xf4\x75\x8d\x25\x2e\xa2\x7b\xea\x92\x70\xaa\x40\x19\xdc\x8f\x0e\x15\x90\x43\xe5\x03\x0f\x40\xff\x6b\xea\x67\xdd\x17\x86\x6e\x2d\x14\x38\x80\xb0\xf9\x0a\xd9\x06\xa2\x42\x9d\xa6\x73\x0b\xc5\x7f\x80\x88\x88\x9e\xb1\xe7\x75\xc3\x08\x69\xc0\x45\x25\x7d\xcd\xac\xd2\x96\x49\x95\x64\x15\x05\x43\xe0\xa7\xe0\xe0\x1a\xc6\x80\x1d\x8c\xbc\x83\x6f\xec\x7a\x58\xbf\xa3\x7d\x4a\xd1\x4a\x21\x54\x3b\xfb\x03\xf2\x6d\x42\x36\x05\x52\x7b\x93\xd4\x9a\x75\x2a\xf9\x68\x36\x3a\x49\x9a\xfa\xe5\x73\x39\x2d\x05\x3b\x5a\x70\xa5\x44\x16\xa1\xc8\x90\x33\x94\x5b\xcb\x93\x05\xc6\xec\x38\x73\xe7\x38\x13\x76\xd7\x60\x83\xfe\x9c\x27\x0b\xa9\x02\xae\x82\x0a\x68\x4a\x75\x5d\xd9\x06\x5a\x03\xf5\x35\x90\x06\xec\x2a\xb3\x4b\x6d\x65\x68\xdf\xc5\xfd\x5c\x9a\xdd\x66\x6a\x80\xf2\xf6\x3d\x35\x52\x3f\x9d\x79\xa0\x3c\xca\x65\x68\x7d\x02\xf7\xbe\xbf\x5f\x4d\x1e\x1c\xda\x52\xcd\x44\x59\xe2\x0a\x4d\x05\xfd\xa0\xd5\x63\x76\x42\x4d\x2c\x16\xfa\x86\xa5\x9a\xdd\x40\xb7\xd5\x6b\xa7\x40\x40\x2a\x92\xf1\xaa\x47\x34\x53\x48\x0c\x4c\x74\x5e\x94\x3a\x97\xc6\x97\x3f\xd2\xf6\xd8\x18\x60\x4a\x56\x75\xc6\x9c\x6d\xae\x62\x56\xa9\x66\xb3\xc7\xe7\x47\xcc\xf2\x72\x2e\xac\x7b\x06\x53\x55\x3e\x15\x3d\x71\x61\x36\x8d\x4a\x3e\x68\x17\x90\xdd\xd0\x06\xa4\x41\xb5\x0f\xf4\xf7\x60\xaf\xfd\xaf\x20\x81\x10\xd2\x14\x67\xba\xa4\x64\xcb\xf0\x25\xc1\xd0\xbb\x5d\xf8\x03\x09\xce\x4a\x59\xd3\x13\x15\xbe\x4f\x7f\x10\xdc\x0a\x3f\xfe\x78\x36\x0c\xac\xfb\x6e\x3d\xde\x6d\xbb\xee\x46\x97\x59\x7a\x23\x53\x54\xce\x0c\xdb\x73\x37\xef\xf7\xa3\xc0\x06\x51\xde\x7b\x9f\xf4\x9b\x1b\x99\x0e\x44\x7c\x18\xaa\x49\x74\x9f\x47\xed\x88\xce\x80\xea\x32\x15\xca\x3a\x66\x59\x1a\xb6\x07\xbf\xd8\x67\x27\x12\x2b\xf1\xe1\xf7\x00\xa2\x9a\x4f\xa5\xaa\x51\x1e\xea\x45\x75\xe2\xd2\xf1\x0d\x6f\xde\x1b\x61\xb1\x86\x1a\xca\x90\xb5\x5d\x30\x23\xf3\x2a\xb3\x5c\x09\x5d\x99\x6c\xd9\x73\x6b\x3f\xd6\x85\x9d\x65\xe2\x1d\x9e\xf0\xfe\x4a\x4f\x18\xaa\xa9\xfc\x40\xa2\x6d\x0d\x9c\xb2\xa2\xfd\xd4\xa9\xe0\xe9\x41\xd0\x84\x02\x10\x80\x78\x27\x12\xaa\x11\x2b\xb2\x6a\x2e\x3b\x15\x05\x6f\xfb\x20\x76\xfa\xf5\xdd\xfa\x20\xd6\xed\xde\x2a\x23\x6a\xe4\xb2\x7e\x7d\xc8\x1f\x60\xdb\xc2\xcd\xea\x97\x97\xeb\x5b\x16\xa6\xa2\x10\x2a\x05\xe8\xf4\xe7\xf5\xf9\xc3\xc9\x6f\x8c\xf6\x04\x59\x3e\x8c\xac\xf0\xf8\xe7\x0d\x29\x1d\x25\xde\x2f\x74\x96\x1a\x26\xde\xd9\x92\x3b\x71\x90\x3b\xc6\x1f\x7e\x33\x63\x5c\xf5\x65\xed\x9f\x4b\xe3\x2d\xf6\x89\x34\xd0\xf4\x33\xd5\x40\xcd\xa0\x1d\x39\x77\x4d\xdc\x87\xb3\xa6\x5e\xe3\xe3\x81\x9b\x73\xa2\x00\x25\xee\x60\x9a\x75\x68\x6b\x9a\x68\xd2\x53\x9a\xf5\x2f\xfd\x9a\x69\x9a\x35\xad\xf5\x5a\xb3\xda\xe0\x61\xdd\x76\xd6\x7c\x5c\x9d\x35\x67\x00\xf7\xd4\x1f\xfc\x98\xc6\x69\xf9\xec\xe8\x43\x52\x5b\xef\xe2\xa3\xa3\x13\x15\xc9\x64\xe8\x94\x43\x03\x11\x6c\x02\x33\x6e\x35\xea\xe2\x88\x4a\xa9\x6e\xdc\x7c\xd3\x7d\x07\xb9\xe5\x46\xd8\x3e\x9e\xe4\xa6\x82\x59\x8f\xe7\x58\x4e\xbc\xf3\xe9\x2b\xec\xde\x09\x85\x9e\x1e\x02\x89\x8d\xff\x46\xba\xa8\x6a\xdc\xe9\xb4\x50\x4f\x77\x0f\x8e\x2c\x42\x66\x19\x8e\x91\xba\xd5\x4e\xb8\xed\xd9\x90\xbe\x87\x34\xa6\xd9\xbe\x79\x73\x7a\x3c\x24\x09\xdd\x78\x5e\x5b\x85\x7f\x37\xc9\x48\xbb\x14\x00\x74\xe5\xbf\xab\xd8\xd0\x06\xe8\xc6\x40\x38\xba\x7f\x13\xd4\x99\x27\xa2\x0e\x13\x1c\x4b\x73\xd5\x1f\xe0\x7c\x65\xc8\xe6\x71\xff\xf6\xe8\x84\xd1\xa7\x77\xf2\xce\xdf\xc7\x3d\xdf\x17\x15\x7b\x9e\x88\x3a\x70\x97\x4a\x73\xb5\x01\x70\xf4\xbe\x36\x70\x91\x9e\x75\xab\xe3\x7c\x98\x91\x86\xb6\x85\xe7\x61\x54\x23\x7c\xdf\xa5\xae\xd8\x0d\xc1\x08\x92\x85\x78\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x86\x56\x7b\x28\xa7\x6f\xdd\xd9\x5e\x04\xa4\x46\xf3\x6c\xb0\xa8\xc4\xd0\x3b\xf5\x73\x09\x73\x14\xbc\xb4\x60\xc8\x0d\xb3\x91\xc2\x70\x9e\x4f\x47\x1f\xa8\xbb\xec\xa4\xd3\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\xb9\xbd\x13\x81\x8c\xc6\xbb\xe5\x79\x00\xf6\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\x4f\x77\x26\xec\x42\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\x62\xd7\x0f\x08\xd9\x2c\x4f\x76\xd8\x9e\x2e\x61\xe4\x84\x2b\x96\x09\x8f\xb9\x40\xa7\x7a\x89\x76\xc7\xfe\xc3\x60\x91\xec\xc1\x44\x8a\x90\x5b\x0e\xb4\xd7\x52\xaf\x53\x91\xbc\x6f\x80\xd6\x1e\xd7\x02\x4f\x2a\x27\x05\x27\xec\x0d\x89\x2f\xd2\x0b\x70\x33\xc0\x61\xf6\x77\x3c\xac\xc5\x7a\x78\xfe\x90\x4e\x9e\x8d\xd5\xd0\xdd\x43\x23\x74\x57\xef\xc9\x5c\xda\xd7\xa2\xd0\x03\xe8\x70\x38\x50\x2b\xbe\x20\xad\xfb\x40\x1b\x09\xed\x69\xb8\x65\x1c\x59\x52\x52\x65\xdc\x19\x75\x18\x5d\x98\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\xd8\xb7\x34\x92\x8c\xed\x80\x09\xbb\x8c\x71\xa7\xa3\x8a\x36\x02\xf7\x0d\xcf\x1a\x11\x8b\xe5\xaa\x6e\x9c\x01\x38\x9c\x5c\xb1\x53\x25\x6d\xdd\x32\x0c\xeb\x02\x32\xad\x28\xd3\xdf\xfd\x9a\xa2\x1b\x73\x89\xf9\xa8\x8a\x06\x73\x5f\x37\x47\x83\x13\x8a\x0d\x76\xc2\x54\x3a\x39\x48\x36\xac\xfc\xd5\xcb\xb3\x09\x43\xd5\xf7\xc2\x19\xc6\xc6\x0a\x7d\x90\x3c\x0c\x04\x46\x8b\xeb\xcf\x51\xd8\x86\xb6\x8f\x1e\x58\x57\x97\x8d\xae\x8c\x93\xc9\xee\x84\x39\x31\xbe\x3b\xd9\xf5\x2a\x5f\xb6\xd2\x3a\x34\x0c\x1a\xe3\x97\x37\x37\xfc\x84\xb1\x57\xbe\x6c\x12\xc0\xa7\xd6\x77\x21\x45\xfc\xc5\xa8\xe7\x64\xeb\xd8\xf8\xd2\xfd\x6a\x1a\x3f\x94\x00\xcf\xe7\xf2\x5a\x28\x7c\xb1\xcd\x71\x6a\x3f\xd5\x41\x96\x31\x7e\x73\xb2\x94\x5f\xbf\xd8\xdc\xbb\x21\xc7\x19\xe8\xcd\x88\x7d\xd1\x7b\x25\x3a\xcf\x11\xa1\x7b\x11\xc0\x64\x6a\x3c\x98\xc0\x1d\x37\x62\xe5\x23\x2e\xf9\xac\xd3\xc1\x6e\x49\x06\x3f\x54\xcb\xaa\x0f\x1f\x53\x79\xb3\xaa\xcd\xa9\xfb\xf7\x31\x23\x60\x7c\xe3\x41\x56\x49\xcc\x1e\x84\x87\x1f\xbc\x3e\x39\x3c\x7e\x79\x32\xc9\xd3\x47\xc8\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\xb2\xf7\x30\xed\x61\x74\xb8\x30\x9c\x3f\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\x76\x97\xd5\x85\xce\xf4\x7c\x7d\x03\xb4\x7b\x6c\x9b\xdf\x21\x42\xee\x98\x8f\xdd\x7e\xdc\x9c\xb1\xdb\xbd\x8f\x72\xdb\xce\xc5\xbe\xc9\x8e\x90\x35\xb5\x82\xdd\x08\xed\x8e\x3f\x03\x82\x7d\x42\x33\x62\x85\x8a\xe8\xce\x01\xf6\xe6\x9b\x50\xd4\x5d\x1d\xa2\xee\xea\x77\xb5\x2f\x36\x43\xfc\xae\xa6\x85\xe3\xe4\x5d\xdb\xf8\x37\xa9\xee\x47\x6a\x0a\x90\xa2\x14\xe3\x00\x9b\x0d\xed\xbd\x75\x19\xa9\x65\xb1\x3c\xf1\x9e\x60\xef\x37\xc6\xbb\xb2\x65\xdb\x23\x5c\x6b\xf2\xc1\x11\x8f\x58\x84\x59\xb6\xac\x5b\xa3\x90\x37\x8c\xcf\x11\x0e\xbb\xa4\x80\x5c\x51\xca\x6b\x99\x89\x39\xb4\x3d\x92\x6a\x1e\xc1\x38\xc5\xc0\x4f\xd4\x06\xa9\x19\x9c\x7a\xe9\xfe\x8a\x5a\xef\xc1\xce\x3a\x7b\x75\x09\x1d\xb4\x20\xa5\xa2\xb7\xc1\xe9\x1e\x08\x67\x7e\x3c\x1e\x83\xeb\x6f\xef\x5f\xce\xf2\x49\xb3\x7d\xf6\xa3\xa0\xe7\x68\x68\xf1\x55\x42\x9b\xfb\x85\x0e\xfd\x96\x60\xae\x35\x65\x61\x43\x63\x1a\x1f\xdd\x75\xe0\xee\x74\x1a\x35\x8a\xf2\xc6\xfd\x52\x00\x64\x77\x9d\x67\xf0\x18\xad\xa4\x0d\x09\xd0\x81\xb9\xbd\x0f\x36\xad\x3b\x23\x21\x7d\xc0\xcb\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xe2\x67\xda\xed\x63\x2c\x67\x96\xea\xca\x9f\x9a\x52\xf0\xec\x76\x89\xd1\x65\x8f\x6e\x4c\x5a\xd8\xc1\xe2\x11\x10\x2f\x70\xdc\xe2\x3b\xcf\xbc\x28\x01\x2c\x66\xf5\x3b\x3b\x8f\x9a\x62\xd2\x24\x46\xf6\x67\xef\x30\x4c\x83\xb7\x2b\x76\x7a\x71\x74\x71\xfa\x49\xa3\x7e\xb7\x09\x57\x98\xdd\xa3\xb6\x1e\xe4\xbf\xbb\x65\x55\x8d\x59\x56\x75\xfd\x25\xba\x5e\xce\x75\x69\x79\xb6\x01\xc6\x99\x2c\x78\x71\x58\xd9\xc5\xb1\x34\x80\xd6\x38\x8c\xfa\xb7\x32\x6a\x54\xaf\x88\x7d\xe8\x7c\xc3\x0d\xe9\xb7\x2f\xdd\x77\xf4\xdd\xe1\x39\xe3\x95\xdb\x8f\x96\x5a\x0c\x6d\x2c\x59\xce\xbf\xc5\x05\xd6\x40\x0f\x4a\x19\x1a\xf3\x03\x74\xf1\x77\x3d\x24\xaa\x7c\xba\xaa\xb7\x6d\x3c\x1a\x24\x17\x72\xfd\xcf\x24\x06\x2d\x95\xb4\x92\x5b\x5d\x0e\x16\x1b\x6c\x8c\x18\x1c\x86\x95\xb1\x3a\xa7\x53\x74\xea\xef\x80\x84\x2c\xd0\xdf\x56\x7e\x54\x7b\x13\xc1\xfa\xfc\xff\xd9\x7b\xd7\xee\xc6\x6d\x6b\x61\xf8\x7b\x7e\x05\x96\xdb\xb5\x6c\xa7\x92\x3c\x93\xf6\xa4\x3d\xf3\xf6\xb4\xcb\x19\xcf\xe4\xf8\x64\x2e\x7e\x6c\x27\x59\xcf\x93\xc9\x69\x20\x12\x92\x50\x93\x00\x43\x80\xf6\xa8\x97\xff\xfe\x2e\xec\x0d\x80\x20\x45\x49\xa4\x44\x5f\x26\x21\x3f\x24\x63\x8a\x04\x81\x8d\x8d\x7d\xbf\x00\xcc\xcf\x85\xd1\x15\x69\xc4\x6a\x69\x36\x23\x68\xfd\x83\x63\x73\xff\xcc\x9f\xad\x11\x1d\xaa\xd8\x27\x7f\x79\x51\x69\x8e\xb9\xd2\xc1\xd8\x59\x31\xcb\xf6\xb8\x8f\x66\x95\xe6\x3f\xf7\x43\xda\xf8\xcf\xa2\xe6\x4f\x40\x10\xfd\x9f\x82\x26\x08\xda\x77\x8f\x69\x7c\xaf\x6e\x69\x3f\x2b\xae\x62\x89\x5d\x7c\x89\x12\xef\xbc\xb5\xad\x50\x58\xa3\x1f\x21\xa2\x73\x2a\x94\xc1\x93\xaa\x3d\xe3\xd0\x06\x40\x1c\x92\x23\x1d\x65\xc7\x8f\x06\xa9\xbe\xd2\x61\x93\x42\x84\xc2\x2a\xae\xfd\x1a\x51\xe3\x8d\x4f\x87\xdd\x6f\x99\x8f\x1e\xe4\x00\xa7\xbd\x1f\xbb\xad\x1d\xcb\xe3\x51\x08\x2f\x14\x10\xc9\x1b\xae\xb4\x6b\x20\x0c\x37\xb8\xb2\xbd\xd6\x40\x17\xb8\x20\x32\x27\x3c\xfb\x1b\x8d\xe3\xfc\x05\xca\x11\x56\x57\x85\x7f\x2b\x5f\x0e\x9f\x0a\x1f\x6d\x73\xa4\x97\x99\x6d\xe2\x71\xfd\xf2\x82\x60\xa3\xf0\x3f\x7d\xf9\x0c\xf4\x82\xdf\x7f\xf1\xe5\xb3\x3d\x11\xf1\x53\xcd\x2a\x24\x7d\xdb\x44\x7b\x8f\xac\xf8\x85\x64\x91\x54\xb2\x45\x0c\x2c\x40\xda\xbd\xc2\xe4\x0c\xc3\x27\x2d\xd1\xc4\x83\x60\xb0\xd2\x73\xef\x3e\x65\xe2\x21\xeb\xe2\x57\x94\x75\x41\x7c\x36\x3e\x12\xd6\x5e\x10\x39\x1c\x10\xca\xea\xac\x12\x70\xa4\xdd\x17\x9f\x0a\xed\xde\x11\xba\xbb\x62\x72\x15\x83\xc3\x10\x3f\xd7\x3a\xbf\x4c\x4f\x3d\x7b\x77\xf5\xb7\x37\xa7\x5f\xbd\x7a\x03\x6b\xb5\x51\x81\x06\x3d\xad\x26\xb4\x4b\xcc\x7a\x7b\x74\xdf\xdd\xb8\xb5\x2b\x48\xfb\x08\x30\x10\xb5\xd0\x02\x41\xde\xbd\xbe\xea\x1a\x55\xb0\xaf\x3a\x2b\x66\x7b\x40\xef\x53\xf3\x6b\x40\xa7\x75\x96\x3f\x4e\xe6\x7c\xcf\x4e\x91\xa0\xec\x7d\xc5\x8e\x62\x70\x08\xd7\xb8\xb7\xa9\x63\x47\xdc\x20\x4f\x4e\xd6\xdb\xec\xff\x36\x10\x43\x28\xf6\xee\xf9\x7e\x50\x68\xef\x27\x43\xe6\x7d\x95\x75\x38\xc4\xb1\x9c\xf8\x68\x48\x18\xf2\x8e\xdc\x70\x55\xc3\x4f\x99\xf2\xdd\x98\x7f\x01\xd8\x9a\x35\xb5\x1e\xdc\x9f\x3b\x34\x0e\x6b\x7b\x70\xbb\xd6\x4b\x41\x54\x41\x25\xaf\x7b\x5d\x03\x4f\x17\x91\x49\xad\x21\x4c\x65\x34\xea\xb5\x21\x7c\x79\x0b\xef\x40\xe9\xbd\x4f\x91\xc1\xc0\xc4\x1f\x29\xbd\xcc\x7f\xbb\x9f\xe3\xe8\x87\xab\x57\x5a\xe9\x84\x25\xae\x7d\x79\x26\x5d\x25\x9d\xb0\x24\xcb\x93\x44\x21\xf2\xe4\xf8\x90\x67\x43\xdf\xef\x68\x6e\x78\x4c\x53\x43\xb6\x90\x5a\x8a\x9e\x73\x68\x9b\x06\xad\x12\xb6\x0b\x78\xe2\x25\x66\xba\x27\x2c\x0f\xe8\x2d\x66\x10\x79\xb7\xba\xd1\x3c\x1c\xeb\x96\xc2\x39\xd8\xab\xee\xf5\x4f\x8f\x12\x65\xf1\xf9\xd9\x23\x10\xa1\x5f\x5a\xb1\xa3\xae\x6e\xc2\x47\x0b\x94\x8d\x7b\xca\xdc\x37\x03\x39\x98\x9f\x9f\x59\x75\xc1\xa5\xe5\x2b\x7b\xac\xc8\xfa\x73\xf5\x28\xa2\x94\xcc\xf5\x9d\xcc\xfb\x2a\x1f\x57\x1d\xae\x16\x85\x69\x7f\x5b\x29\xc6\xf1\xcb\xa4\x22\xb8\xca\x4f\x9e\x92\x5c\x01\x25\xa9\xb5\x41\x5d\x47\x51\xee\x83\xa0\x7c\x3a\x84\xe4\x7e\x04\x97\xfb\xad\xc4\xf5\x68\xea\xaf\x3b\x1e\xbd\x00\xcb\x0d\x66\xcd\xa0\x06\x51\x4a\xba\x4b\xc1\xdc\x1c\x50\x9e\x47\xa1\xb3\xb9\x34\x74\x68\x37\x72\x52\x25\xb1\x6e\x24\x74\x0e\x62\xdb\xc6\x24\x31\x3b\x2b\x45\xd8\xf0\xd1\x16\xeb\x1a\x11\xec\x99\x98\xd2\xcc\x36\xcd\x8f\xe5\x9d\xb8\xa3\x79\x4c\x4e\x2f\xce\x1f\x9e\xae\xee\x9d\x09\x8a\xe7\x61\x9f\xde\x02\xd5\x5c\xd0\x72\x3c\x88\xc0\x87\x20\x21\xf3\xc7\x94\x6b\x85\xa1\xfc\x10\x8c\xaf\x43\x6b\x94\xe1\x53\x3e\x92\xc5\x50\x3a\x43\xd5\xec\x48\x81\x58\x25\x88\x8c\x34\x4d\x5c\x23\x66\xa6\xef\x18\x13\xe4\xd9\xb3\x67\xe8\xa0\x78\xf6\xc7\x3f\xfe\x91\x40\xd7\xcd\x98\x45\x3c\x5d\x7d\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9e\xbe\x7d\x43\x68\x04\xba\x1c\x56\xbe\xc5\x91\x61\x3f\xc3\x97\xd5\x88\xfc\xcf\xd5\xfb\x77\x8e\x7d\xa9\xda\xaf\x80\x2e\x7e\x79\x13\x72\x16\xc4\xde\x87\xce\x03\xaa\x17\x00\x0d\x21\x35\xa1\xb3\x19\x22\x1c\x50\x6e\xae\x1c\x31\x71\xb5\xe7\xf8\x7c\xe1\x3a\xd1\x1b\x54\x4b\x20\x29\x80\x9b\x29\x82\xc3\xc6\xd5\x71\xc4\x1c\x07\x18\xcb\x33\x11\x98\xca\x88\x24\xfc\x86\x91\x99\x82\x7e\xf4\x65\xe3\x94\x9c\x29\xa3\x80\x45\x54\x98\xd1\x71\xb0\x72\x67\x14\xdb\xb3\x36\xe6\x63\x47\x4e\xec\xd9\xb9\xbc\xea\x42\xb6\x67\xde\xb5\x10\xb3\xbd\x01\x5d\x8e\x16\x92\x0c\xb3\x0b\x9f\x6a\x24\x43\x65\xb5\x17\x7e\x3d\x88\x54\xb6\xfa\x61\x49\x19\x69\x22\xc5\x3c\xc4\xc1\x52\xfa\x70\xc1\x94\xcb\x8c\xed\x0a\x8c\x9e\x1a\xea\xf4\xd3\x9e\x0e\x89\xfb\x5b\x9a\xed\xd7\x09\xa4\x1a\xa3\xeb\xc6\xac\xd4\xa1\xa4\x53\x59\x68\x17\xb3\x67\x7f\x87\xf2\x6d\x5a\x3a\xd0\xef\x35\x85\xde\xba\x14\xf5\xd7\xf7\xaf\xa7\xa6\x5b\xd5\x98\x39\xe0\xda\x55\x91\x75\x44\x18\x8d\x16\xe4\x86\x2d\xc7\xc8\x01\x32\x0a\xd5\x23\x00\xda\x67\x06\xc6\x95\x36\xfc\xde\xf2\x1c\x1b\x6d\xd2\x6e\x85\x0b\xb0\x0c\xe4\x03\x57\x7d\xc2\x29\x5c\xca\xca\xe5\xb6\x95\x95\x08\x2c\x94\xae\x77\x65\x24\x85\xb6\x7d\x31\x7d\xef\x2a\x08\x18\xad\x15\x24\x30\x14\x86\xc5\xe6\x35\xb5\xe9\xcb\x65\x54\xa9\xe1\x28\x56\xfe\x28\xc4\xca\xdb\x50\xcf\x1d\x62\x7a\x15\xb3\x95\x91\xa8\xeb\x89\x18\x44\xa6\x2e\x78\x04\x19\x47\xe6\x71\xfb\xac\x83\x92\x07\x44\xa5\x60\x82\x62\xba\xb0\xa0\x81\x38\x61\xf3\x6d\xa6\x14\xe1\xb0\xc2\x94\xe6\x37\xcc\x15\x1a\xa6\xc9\x84\x5c\x98\x49\xfa\x6a\xf3\xd8\x4a\xf0\x16\x13\x44\x0c\x8d\x09\x2b\x41\x98\x8f\x1c\x4e\x26\x87\xc8\x2a\x1b\xea\x42\xec\x8d\x35\x7d\x76\x91\xeb\xad\x7b\x5c\x05\x95\xdf\xd2\x4c\x61\x37\x3d\xa3\x5a\x40\xc7\x4a\x09\x75\x5b\xf4\xc2\x09\x13\x74\xcf\x12\xe2\xe1\xd5\x73\x1b\xb3\x7e\x3b\xa1\xf6\xd7\x07\x75\x0f\x5f\x7b\xf5\xea\xbb\xff\x69\x8f\xdd\x4f\xd7\xf5\x3e\xb5\x38\x64\x29\x49\x5f\x1d\x19\x7b\x6f\xb9\x99\xf6\xd0\xd8\xcc\x5d\x55\xd7\x11\xc8\xb7\x95\x5a\xd2\xad\x74\x11\x5b\x4a\x3d\x61\x9f\x94\xf2\x71\x3e\x03\x92\xda\x5c\xeb\x26\xd4\xcb\x1c\x87\x31\x10\x78\x7c\xad\x63\xdf\x2e\x7b\xee\xba\x8f\x36\xf5\xfb\xab\x25\xf5\x6b\x9f\x20\x9a\xfa\x55\x35\x64\x04\x65\x25\x3c\xab\x0d\xb3\x8f\x61\xab\xb4\x84\x6e\x9d\x25\x71\x98\x90\xb7\x96\x15\x23\x92\xd3\xa9\x92\x49\xa1\x7d\x25\x8a\x06\x3e\x0d\x83\xba\xde\x9e\x58\xb4\xc9\x3d\x16\x70\x6d\x90\x57\x90\x95\xf5\xc3\xc0\xf1\xea\x91\xf8\xec\x1b\x20\x8b\xd7\xaf\x2c\x4c\x16\xaf\x1e\x77\xc1\x89\x8b\x3d\xef\x84\x1b\xd6\x57\xef\x74\x19\x91\x15\xe9\x16\x62\x64\xb5\x42\xd1\xd9\x09\xaa\x98\x43\xb9\x6b\x05\xec\xf2\xda\xdf\xaa\x6b\xd7\x65\x0d\x8c\xa7\x17\xe7\x3d\x6a\xa5\xc1\xa8\x6b\xf4\xd2\xf0\x89\x41\x33\x6d\x73\x55\x00\x7c\x8e\x9a\xa9\x11\xe9\x9d\x01\xe9\xac\x84\xa8\x75\xe9\x19\xa2\xfc\x2b\x50\x6d\x56\x16\xfe\xda\x30\xa3\x30\x99\xab\xda\xa1\x03\x8d\xc1\x25\xdb\x0a\xba\x7a\xb8\x18\x1e\x20\x71\xbf\x7c\x35\xe8\x89\x2a\x2f\x00\xfd\x3d\x32\x76\xea\x57\x95\x8b\x5e\x3a\x20\x92\x2b\x96\x18\xa6\x47\x6a\x26\x9b\x4c\xc6\x2f\xb0\xe7\x37\x15\x42\x6a\xc0\x1b\x35\x22\x09\xf4\x23\x1f\xa1\x29\xc6\x48\xa0\x41\xf4\x57\x1e\x38\x4d\x7b\x96\x39\x7b\x43\x1e\xd2\x3b\x02\x11\x40\x22\x80\xdd\x45\x3f\x98\x44\xee\x01\x9b\xcc\x55\x8a\x2a\x7d\xb6\xe5\xaf\xe0\x95\x1d\xdf\x21\x91\x8a\x16\x2c\xa5\xd8\x8f\xc4\x01\xc8\xd0\xeb\xbb\x9c\x6b\xcd\xb0\xea\x38\xcb\x53\x45\xe4\x6c\x54\xf1\x1b\x1f\xdc\x3e\x3f\xe8\x4b\x9e\x25\xf7\xa1\x50\x13\x77\x42\x77\x2d\x03\xb6\xee\xaa\xfa\x0d\x2a\xca\x85\x39\x9d\xa0\x4d\x27\xd0\x20\x49\xd4\x0c\x96\x46\x88\xb8\x45\xf8\x3f\x69\xd0\xdd\x9f\x2d\x62\x57\x1b\xc4\xc8\x0b\xa6\x83\x0d\x62\xb0\x41\xf4\x31\xe2\xbd\xd9\x20\x02\xc6\xed\x88\x69\x83\x3d\x22\x4c\xc4\x73\x46\x89\xb2\x94\x45\x50\x26\xda\xa0\xbc\x33\x47\xc8\xbc\xea\x2b\x38\x9c\x4c\x0e\x0f\x9d\x91\xc2\x9e\x8f\x42\xcf\xc6\x7f\x22\x4c\x44\x32\x46\xa4\x32\xe3\xe7\x4a\x83\x50\x5b\x6a\xe5\xe1\x5c\x52\xf7\xad\xd0\xdf\x00\x63\xf7\x8b\x12\x3d\x52\x28\x17\x92\xf2\xfa\x5e\x45\xb0\x52\xf0\xf2\x65\xc0\x2c\x00\x7d\xb5\x44\x2b\x81\x95\x21\x32\x09\x4f\xb9\xad\x4f\x68\xc8\x05\x53\x5a\x91\x23\xbc\x39\x89\xb2\x62\x64\x1f\x98\xa4\x2c\x95\xf9\x72\xe4\x1f\x32\x3f\x56\xde\xb2\x4f\x1c\x83\xd4\x16\x15\x79\xce\x84\x4e\x96\xbf\x5e\xf9\xcd\x81\xf8\x09\x8b\x6f\x1e\x2b\xf6\xc9\xfb\x68\xba\xaa\x68\x59\x36\x11\x00\xeb\x9d\x87\x36\xf0\x21\x9b\x81\x31\x2a\x8d\x3f\xe6\x2e\x13\xb7\xe4\x96\xe6\x3b\x67\x60\x34\x5d\xf7\x22\xb1\xc5\xfc\x96\x2b\xb9\x73\x0e\x5b\xe3\x90\x21\xf0\xae\x2c\x53\x46\x1b\xb1\x2c\x74\x56\x68\xcb\x5d\xdc\xd9\x76\x25\xfb\xfc\x99\xae\x09\xbe\xcf\x0f\x7a\x9c\x5c\x46\xb5\x66\xb9\x78\x41\xfe\xf7\xe8\xc3\xef\xfe\x35\x3e\xfe\xeb\xd1\xd1\x0f\xcf\xc6\xff\xf9\xe3\xef\x8e\x3e\x4c\xe0\x1f\x9f\x1f\xff\xf5\xf8\x5f\xee\x8f\xdf\x1d\x1f\x1f\x1d\xfd\xf0\xcd\xdb\xaf\xaf\x2f\x5e\xfd\xc8\x8f\xff\xf5\x83\x28\xd2\x1b\xfc\xeb\x5f\x47\x3f\xb0\x57\x3f\xb6\x1c\xe4\xf8\xf8\xaf\xbf\xed\x71\x11\x54\x2c\xdf\xf7\x46\x82\xf1\x1a\xdf\x8b\x18\x51\x1d\xbb\x67\xd4\x25\xe4\xe3\xb8\xb4\x68\x8f\xb9\xd0\x63\x99\x8f\xf1\x23\x2f\x88\xce\x8b\xbe\x48\x57\xc9\xfe\xee\x8f\xc6\x94\x42\x4c\x59\x01\xd3\x29\x36\x4f\x90\x88\x60\x60\x6a\x8f\x96\x61\xdb\xc7\xb6\xd9\x28\x6c\x7f\x1c\xec\xc1\x6d\xae\x7b\x8c\x54\xb2\xf5\x6c\x7e\xe5\x61\x4a\x57\xb6\x9b\xf2\x10\xa3\xb4\x72\x0d\x31\x4a\xab\xd7\x10\xa3\xd4\xf1\x1a\x62\x94\xdc\x35\xc4\x28\x0d\xf6\xc1\xfd\xaf\x5f\xb9\x7d\x70\x88\x51\xea\x7a\x0d\x31\x4a\x3b\x5f\x9f\x50\x8c\x12\x0a\xf9\x4d\x91\x4a\x56\xcc\x2f\xc3\x94\x9e\x6c\x94\x92\x32\xf8\x10\xb1\xd3\x28\x92\x85\xd0\xd7\xf2\x86\xed\xe9\xc8\xad\xe9\xa4\x2b\xa3\x43\x49\xc4\x35\x3a\xea\xea\xc3\x4f\x52\x61\xed\x4b\x1e\xed\x41\x7e\xec\x4f\x72\xa4\x45\xcc\x8d\x8e\xda\xf3\x61\x71\xc3\x86\x65\xb1\x45\xcc\xe2\xf2\x07\x4b\xd2\xb4\xd9\xef\x09\x39\x25\x39\x8b\x78\xc6\x0d\x03\x80\x5a\x41\x70\x1f\x8f\x8f\xef\xe2\xcc\xb5\x62\xc9\xcc\x76\xb2\x15\x65\x9a\x73\x1e\xe8\x9f\x96\xa3\x34\x7e\x06\x65\x08\xe9\x7a\x8d\x12\xb5\x90\x45\x12\x93\x9c\xfd\xdd\x09\x1f\x76\x36\xd7\xe1\x08\xa1\x49\x15\x96\x52\x7e\xd6\x0e\x4e\x33\x6e\x8b\x8a\x3d\x25\x32\xc8\x3e\x66\x3c\x87\xc3\x76\xc5\x22\x29\xe2\xbe\x2d\x24\x2b\xe3\x97\xb2\x02\xf8\x85\x58\x4c\xe2\x02\x1f\x80\x74\x4c\x9a\xf0\x98\xeb\xa5\x8f\xe7\xc0\x63\x6f\xc4\x56\xec\x1d\x6c\x11\x41\x95\x1b\x41\x68\x96\xe5\x92\x46\x0b\xa6\x82\xaf\xa1\x10\x6a\x0b\x65\xf8\x2c\xcf\xa4\x98\x73\x81\x72\x28\xbc\x63\x84\x95\x64\x49\x72\xa9\x5d\x68\xda\x9a\x0f\x5e\x07\x83\xc1\xeb\x28\x71\xe8\x7c\x09\xf1\x6b\x32\x1c\x02\x67\xc5\x67\xe1\x1f\x8a\xc8\x24\x76\xa5\x59\xff\xf4\xcc\x08\xfe\x91\xc5\x62\xc3\x04\xa0\x68\xa6\x96\x24\x31\xc2\x93\x61\x0c\xeb\x5f\xfe\xe2\x0f\x64\x21\x8b\x5c\x4d\xc2\x62\x7f\xcf\xe1\x1e\x5a\x38\x9c\xe2\xa0\x49\xc2\xa8\xd2\xe4\xf9\x33\x92\x72\x51\x18\x8e\xdf\x13\xe2\xf5\x25\xeb\x06\x52\xee\x97\x7f\xd8\x73\xb4\x7e\xe4\xdb\xb5\x92\x6d\x86\x1d\xf3\xac\x78\x6b\xcf\x38\x16\xf4\xc0\xae\x99\x35\x61\xd7\xb2\xa4\x70\x17\x85\x96\x8f\x7c\xf2\x7f\x2e\xe4\x74\xa9\xf7\x2f\x61\x63\xc7\xa9\xd6\xae\xf9\x3f\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x1d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\x9d\x3a\x7c\x97\x35\x6f\x76\x78\x79\x5f\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf1\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\xdd\x0b\x58\xfb\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xe9\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x91\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xc7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x67\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x61\x22\x26\xdf\x2a\x07\xb8\x78\x29\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x1b\xbd\x53\x68\xd2\xcd\xf9\x6d\xc4\x9c\xec\x68\xde\x7b\xac\xc5\xdf\xee\x5c\xad\x8e\x34\x97\x8e\xb2\x6d\x4c\xf1\x14\x02\x4b\xf7\x9e\x4b\x28\x13\x4f\x13\x43\xe2\x96\xbe\xe6\x4f\x0d\xc1\xa6\x4b\xb0\x7b\x3d\x4a\xe5\xb1\x7c\xba\x7f\x4d\xa9\xc3\x7c\x1a\x57\x89\xd9\x25\x8d\xa5\x22\x5f\x25\x32\xba\x21\x67\x0c\x94\x86\xfb\x6c\xbe\x9f\x4f\xe3\x4f\xbb\x71\x66\x4a\xe7\xbb\x45\x8c\x8c\x49\x2a\x05\xd7\x32\xdf\x85\x1e\x3f\xa1\x42\x81\x43\x2b\xc3\x36\x15\xd3\xcd\x39\xfb\xa5\x34\x32\x34\x28\xdf\x0f\xea\xc0\x50\xde\x74\x02\x94\x07\x6f\x01\x51\xdd\x99\x8e\xfc\x66\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\x7c\xe7\x40\xa8\xbd\x01\x75\xc3\x96\x10\x55\xd6\x0b\xa8\xec\x60\x15\xcd\x5d\x4b\xb0\xb3\xc3\x7d\x23\xdf\x5d\x7e\x75\xf6\xad\x62\xf9\x24\xd4\x56\x4e\x98\x8e\x4e\x22\x96\x2d\x4e\xec\x08\x9f\x3c\x58\x1d\xd9\xec\x07\xae\x6e\x34\x14\x04\x22\x99\x24\xb6\xc0\x98\x9c\x91\x97\x2c\x5b\xf8\xcf\x3d\x0d\xb8\x7d\xca\x3d\xe5\x32\x29\xfb\x69\x37\x75\x68\x46\xaa\x92\x0d\xb8\x83\x54\x23\x40\xfe\x7c\xda\xad\x91\xf7\x53\x44\xf7\x07\xec\xce\xb2\x4b\x2b\xbe\x27\x01\xde\xa7\xd3\xd2\xef\xb0\xd2\xd3\x2f\xcc\x1f\xaa\x36\xec\x73\xd1\xa9\x15\xb2\x7d\x3e\x43\x65\x34\x66\x31\x91\xb7\x2c\xcf\x79\xcc\x14\xf1\x74\x3b\xb4\x41\xf1\xe4\x69\x40\x7e\xe8\x1d\xf8\x69\x05\x1c\x3c\x1d\xf3\xc3\x21\xd8\x1f\x2a\x44\x1c\xee\xac\x10\x71\x1a\xa7\x5c\x3c\x0d\x6c\xdf\x11\x6e\x2a\xa2\x09\x3b\x7f\xbf\xb7\xb6\x6e\xc7\xa9\x2a\xec\x57\xf6\x66\xd0\x53\x60\x4b\x9d\xfd\x6f\x3c\xee\x12\x21\xe3\xdd\x1c\x68\x8f\xac\x76\xcf\xa9\x66\x77\x3b\x0a\x42\xe3\x92\xe4\xef\xfa\x3e\xa8\x67\x9f\xb6\xda\xfe\x24\x3a\x85\x04\xa7\x1c\x4b\xfe\x3f\x96\x90\x65\xf1\xa9\x1f\x47\x12\x8e\x15\x36\x65\xab\xb7\x62\x73\x67\xf6\xf4\xe2\x9c\x7c\x8d\x8f\x3f\x5e\x17\x94\x5c\x6a\x54\x79\xce\x64\x4a\x79\x3f\x0d\xd0\xeb\x83\xd6\xfb\x61\x85\x40\xb8\xf0\xcf\x12\xfb\xb0\x11\x8a\xca\x72\xc3\x45\xce\x62\x62\xed\x29\xbf\xb0\x16\x0f\x2b\xe2\xf4\x2f\xa3\xc5\xc3\x7d\x75\xc9\x0e\x4c\xf3\x2e\x7f\xa7\x94\xa2\x1d\x3a\x81\x10\xe1\x63\x9d\x88\x62\x42\x71\x08\x6f\x08\x22\xf0\x40\xd4\x86\xb0\x74\x9f\xac\x83\x62\xf7\x88\xbc\x91\x73\x2e\x1c\x15\x93\x36\xaa\x66\x46\x79\xb2\x1f\x38\x07\x39\xf9\x57\x26\x27\x2b\x95\xbc\x12\x74\x9a\xec\x1e\x32\x59\x3d\x04\x7e\x38\xf2\x3a\xa1\x73\xc2\xe0\x8f\x93\x98\x2b\xf3\x7f\x72\x75\xf5\x06\x9c\xc1\x85\x70\xfa\x25\xb8\x39\x2d\x6f\xf1\xa9\xd1\x48\x64\x1e\x8f\x2e\x20\x11\xef\xad\x83\x47\x30\x1e\xe1\x22\x36\x4b\x67\xaa\x12\x94\x6c\x9f\xc0\x5e\x29\x3e\xef\x0e\x43\x1f\xa7\x8c\x5c\x2f\x78\x74\x73\x11\xf8\x7f\x65\x6e\xee\x89\xe0\x56\x45\x48\xa9\xff\xf6\x58\xdc\xc8\x2e\xeb\xa2\x2f\x83\x5a\x30\x9e\xe3\xd4\x8e\x9c\x5e\x59\x08\xc2\x6f\x54\x29\x19\xf1\x32\xfe\x00\x2c\xd1\x25\xfb\x8e\x81\x7d\x3f\x1e\x54\x40\xe0\xec\x07\x20\x28\xe7\x36\x48\x2d\x0e\xa3\xec\x13\x54\x85\x52\x0a\x17\x0e\x6e\x8f\x06\x04\xc4\xf1\xde\x5a\x9a\x96\xc3\xad\xb6\x34\x75\x6a\x66\xcd\x45\xee\x12\x5e\x2d\x02\x39\x95\xc1\xf6\xd0\x5e\x45\x21\xdf\xda\xd4\x36\x33\x79\x14\xd0\xed\x9e\x9a\xde\x64\xfe\xab\xc5\x07\xe1\x3d\xeb\x34\x07\xda\x93\xc9\xac\x48\x30\xb2\x76\xff\xce\xae\xce\xc7\x88\xdf\x79\x04\x27\xfa\x53\xeb\xec\x74\x18\xa6\xe7\x75\xcf\x57\xfc\x65\xf4\x77\x0a\x54\x8b\x67\x5f\xfe\xe1\x0f\x9f\x7a\xc7\xa7\xfd\x0c\x77\x8f\xdd\xf2\x69\x2f\xd7\x5b\x43\x6d\x86\xf3\xa1\x36\xc3\x50\x9b\xa1\x7a\x3d\xba\x7f\xf8\xe1\xab\x2f\xf4\x92\xdd\xd6\x47\x66\xdb\xbe\xf5\x15\xf6\xcc\x8a\xeb\x27\x23\x6e\xef\x0a\x0a\x0f\x51\x37\xa1\xa7\x1c\xb1\xfd\x6b\x24\x0c\x95\x11\x7e\x5d\x95\x11\xfa\xcb\x11\xeb\xab\x0a\xc2\xfe\xb9\x61\xbf\x9e\x8a\x07\x7b\x93\x8d\x7d\xf3\xea\xf7\xce\xa6\xef\xab\xe9\x47\x5f\xd6\xfd\xde\x2c\x0c\x87\xe5\x78\x8d\xf6\x16\x57\xe2\xcd\x55\xd3\x3f\x3c\x54\x41\xb1\x7c\x2d\x0d\x75\x79\x44\xd5\x99\xec\x6d\x79\xc0\xa9\xc8\x9d\x78\x77\x93\x15\xef\xfd\x55\x2d\x40\xc0\xdf\x7e\xfa\x71\x01\x83\x83\x7c\xbf\x30\xf5\x5f\x96\x7b\xf4\x17\xda\x01\xff\xbe\xdc\xa3\xaa\x52\x35\xd7\x59\x1d\x81\x40\x82\x08\x27\xa7\x61\x67\x9a\x92\x2c\x9c\x5e\x9c\x93\x28\x67\x50\xda\x81\x26\x6a\x42\x1a\x24\x3c\xe7\x40\xb2\x12\xa1\x93\xec\xa8\xd6\x2c\xcd\xf4\xbe\x98\x37\x78\x47\x7f\x65\xde\xd1\x7b\xf7\x52\x2c\x8a\x94\x8a\xb1\xa1\x16\xe0\x1f\xad\xc4\x9d\xd4\xf8\xe1\x84\x58\xba\x80\x62\x05\xd8\x42\x21\xa5\xb9\x10\xfc\xe7\x82\x95\xe6\x0a\x2f\x75\x3c\x01\xe7\x0e\xcc\xa3\x67\xd8\xa1\x44\x55\xa3\x22\x91\x5c\x49\xe2\xb2\x00\xf1\x70\x74\x04\x23\x10\xcb\x2a\xa6\x37\xbd\x60\x28\xbd\x5d\x40\x91\x84\xf2\xa9\xaa\x7e\x88\x0a\x22\x4d\x12\x79\x87\xdf\x0e\xe5\x11\xb3\x7f\x66\x2e\xb6\x2e\xc9\x94\x91\x94\xe7\xb9\xcc\xad\x1b\x29\x9c\x0e\x86\x0f\x19\x3d\x93\xe5\xa8\xb0\xe5\x36\xe8\xe3\x8a\x69\xbb\xd5\x80\x2a\x5a\x12\x2a\x30\x81\xd3\xfc\xdb\x45\x5c\xc3\xb7\x1d\xbd\x9b\xb2\x05\xbd\xe5\xb2\xc8\xf1\x6d\x2d\xc9\x81\xfd\x09\x78\xef\x52\x16\xde\x76\x5e\x40\x86\x96\x5f\x9d\x6a\x80\xd3\xbb\xf2\x47\x50\x70\x63\xe9\xcc\x91\x63\xf6\x91\x2b\xbd\xba\x16\x07\x22\xd7\x72\xe2\x31\x30\xef\x56\x65\x86\xc1\x7e\xb7\x73\xee\x6d\x15\xdf\xc2\xd1\xaa\x92\xea\xed\x15\xfc\xb4\x4d\x4e\xb5\x15\x6b\x30\x65\xde\xa5\xc3\x7d\x7a\x31\xac\xb8\xca\x1d\x7b\x5d\x3d\x49\x41\x79\x10\x92\x37\x5e\x3e\xca\x22\xe1\xd1\xf2\xfc\xac\xdf\xc8\x0d\x1c\xd3\xb1\x3f\xe5\xa3\x36\xcc\x7d\xf2\x15\x55\x2c\x26\x6f\xa9\xa0\x73\xb4\xba\x1c\x5d\x5d\x7c\xf5\xf6\xd8\x60\x11\x58\x75\xce\xcf\x1a\x43\x3b\xae\xc2\xc1\xdf\x3d\x56\x9e\x3b\xa9\x83\xae\x37\xb1\x61\x65\xd4\x1d\xc1\xf7\x68\x25\x00\x88\x97\x09\xf6\x69\x9f\xd6\x20\x0e\x5c\xd4\x8b\x44\x61\xf8\x86\xab\xfe\xa6\xea\xa4\xfa\x36\x8d\x6f\xee\x13\x00\x81\xdd\x7c\xd3\x2a\xdb\xf9\xc0\x5a\xf8\xb9\xaa\xdd\x48\x74\x4e\x35\x9b\x2f\xcf\x58\x96\xc8\xa5\x41\x80\x8b\xc0\x8c\x8f\x8f\x4e\x51\x6c\xc8\xa7\x34\x22\x79\x91\x30\xec\x2d\x54\x2f\xbb\x26\x18\x8b\x4b\x4a\xc7\x85\xd2\x14\x8a\xae\xe1\xf8\x1b\x67\xd4\x9a\x59\xb5\x65\x4b\x63\x9c\xe7\xd6\xa7\xaa\x25\x2a\xcd\x29\xd9\xf8\x4a\x7b\xc6\x04\x9f\xdf\x8e\xb3\x5d\xfc\x9a\xad\x3d\x98\xd5\xee\x80\x70\xca\x2f\x8b\xc4\x30\x9f\x24\xae\xb5\x78\x05\x39\xcd\xee\x31\x56\xbb\x00\x9a\x60\x66\x3f\x22\xd3\xc2\x08\x71\x4c\x55\x6c\xdc\xab\xa5\x3e\xef\x16\xe8\xd2\x36\x2f\x11\x9a\x65\x09\xc7\x10\x66\x99\x5b\xbf\x74\x60\xd0\x5c\x7d\xac\x0d\x69\xe9\x28\xcb\x74\x93\x5d\xc6\xe4\x96\xe5\xd3\x36\x75\x2a\xba\x8a\x25\x34\xe3\xe0\xc7\x69\x2d\xc5\x54\x36\xee\xf4\xe2\x1c\xdf\x6e\x32\x1c\xbb\x1f\x71\x07\xed\xde\x38\xf7\x86\xed\x19\x84\x9a\x8b\xaf\xb4\x74\x7a\x71\x8e\xa5\xbd\x6c\xb1\xa5\xd2\xfc\x61\xf4\x04\x8a\x41\x8e\x65\x85\x47\x3a\x37\x23\x6a\x22\x85\xff\x28\x13\x45\xca\xb0\x40\x53\xd9\x6c\xcc\x28\x8f\x62\x59\x8e\x5e\x5a\x4f\x8c\xae\x63\x54\x9f\x83\x83\x50\x10\xc6\xd4\x87\x3c\x98\x0f\x10\x93\x83\xcf\x2b\x4f\x19\xca\x51\x4e\xb8\x2d\xfb\xe9\x1e\x25\xd0\x31\x2a\xa0\x33\x3f\x13\x52\x5c\x5a\x50\x7d\x7b\xf9\x66\x37\x44\x78\x57\x1d\xc3\x16\xf5\x61\x50\xbf\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\xb7\x22\xe6\x08\xd8\x50\xbc\x05\xbd\x0d\x0a\x1f\x4d\x08\xf9\x1c\x77\xdf\x6e\x0e\x9e\x71\x6c\xe0\x6b\x4d\xc1\x45\x92\x8c\xc8\x8c\x43\xcb\x76\xcd\x32\x12\xba\xb5\xae\xb8\x88\x8c\x3a\x28\xc6\xbe\x23\x0f\xcc\xc8\x29\x89\xfe\xa0\x83\xd7\x14\x64\x66\x96\xc4\x50\x0c\x13\x3e\x61\x0e\x7d\x04\x26\x0b\xa3\xc5\xbe\x4c\x0a\xa5\x59\x7e\x29\x0d\x43\x09\xc2\x76\xa0\x30\x08\x0d\x7f\xfe\x8a\x8b\x18\xe2\xb4\x2e\x81\xf9\x44\x54\x10\xc6\xc1\x18\x64\x86\x04\xff\xbb\x41\x96\x12\x29\x8f\x54\x11\x2d\xcc\x92\x0e\x32\x19\xab\x03\x43\x8a\x0e\xd0\x64\xa8\x0e\x8e\xcd\x5f\xf5\x35\x60\x14\x4e\xf0\xde\x09\xcd\xf8\xc1\xf1\x88\x00\x80\xc0\x01\x28\xf5\xe2\xd3\xc5\x43\xb7\x56\xd0\xd1\x77\xc2\xc2\xcb\x70\x04\xc0\x41\x51\xba\xfa\xee\x16\x5c\x33\xdf\x5e\x1d\x2d\x4d\xbe\xd2\x4d\x9d\xe0\x13\x72\x2a\x08\x4b\x33\x0d\xd6\x6b\x92\x32\xea\x5c\xe2\xec\x96\xe5\x4b\xbd\xb0\x95\x40\x1c\x01\xf9\xe4\x81\xbe\x1f\xc0\x6b\xbd\xeb\x4b\x24\x87\x13\xb6\x02\xdc\xc3\xcf\x0f\xeb\x84\xb4\xe4\x08\x9f\x2c\x28\x81\x45\xef\x04\xc6\xef\xcc\x9b\x55\x10\xe2\x2d\xa4\x96\x9e\x7e\xbc\x79\x63\x1d\x2b\x08\xab\x6f\xb8\x88\x95\xef\xa6\x68\xe3\xbe\x2d\xbc\x1b\x81\x0c\x33\xfc\x14\x01\xbc\x2a\x02\xb7\x15\x5b\x37\x0c\xef\xa4\xfe\x75\x43\x6d\x1c\xc0\xaa\x0e\x6f\x65\xdc\x7c\x74\x2a\xfb\x7b\x1e\x3c\xec\x83\x0d\x4a\xbb\x8b\x1d\xcb\x8a\xbb\xcb\xac\x51\x27\xd8\xbc\x1d\x1b\x40\xbf\x6e\x26\xa5\xc1\x01\xe8\x64\xf0\x0b\x58\x93\xb0\xce\x39\x99\x25\x74\x5e\xa2\x11\x50\x3d\x14\xb4\x5e\x5e\x7d\xe7\x96\xa0\x08\x6f\x16\x79\xb7\xca\xc4\xdb\xa4\xe0\x71\x09\xa5\xb5\x4f\x98\x8f\x34\xfe\xb8\x5d\x14\xf6\x83\xaf\xc7\xa6\x36\xce\x46\xbd\xd1\x90\xb7\x0e\xfe\xce\x66\x47\x03\x4c\x70\x05\xdb\x9c\x62\x0a\xf1\x53\x20\x87\x5c\x7d\x57\x41\x93\x2d\xf3\x5d\x83\xb4\x37\x6c\x79\x27\xf3\xe6\x5a\xec\x3b\xe3\xd7\xc6\x2f\x26\x74\xca\x92\xed\x07\xe4\x2d\xcd\xcc\xb2\xcb\x60\x55\xd4\xde\xad\xaf\x13\xf5\x07\x8c\x2b\x73\xb1\x7c\x32\x9f\x53\xc1\xff\x81\x11\xbe\x91\x39\xc7\x32\x37\x7f\x1e\xa1\xbf\x04\x75\xff\x84\x45\xfa\xd8\xe2\x5f\x23\xdd\xdb\x82\xa0\x34\x8e\x39\x4a\x0f\x17\x5b\x70\x69\x33\x10\xb8\xb8\xb9\x0f\x98\x6f\x38\x58\xdb\x71\x7f\xb3\xc3\xb5\x05\x6d\x2e\xf2\x0d\xb1\x58\x1b\xdf\x4f\x29\xb7\x9d\x79\x9f\x1c\x54\x58\x4a\xf9\xae\xcb\xc2\x6b\x0f\xb8\xa6\x54\x17\x39\xd7\x8d\x0c\x69\xf3\x8b\x5c\x7c\x53\x4c\x99\xf5\x31\x77\x7e\x5d\x40\xa8\xe1\xe9\xc5\x79\xbf\xdb\x51\x39\xe1\x60\x09\xb0\x13\x34\x72\x0b\x29\x04\x4d\xa7\x7c\x5e\xc8\x42\x25\xcb\xd0\xb0\x49\xc1\x45\x3e\x21\xe4\x1c\x2d\x3b\xe2\x50\x13\x2a\xa4\x58\xa6\xf6\x51\x11\x25\x45\xcc\x2a\x23\x82\x27\xf1\x56\xf2\x98\xd0\x42\xcb\x94\x6a\x1e\x91\x48\xb2\x3c\x02\xaf\x63\x38\x52\xa1\x18\xa1\x6b\xde\x8d\x0a\xa5\x65\x4a\x52\x9a\xab\x05\x4d\x92\x75\x7b\xdc\x03\x57\xdb\x54\xbe\x7c\x0c\xeb\x5f\xfb\xe3\x2d\xce\x7a\x47\xfc\xde\x52\xad\xbd\x05\x7e\x9b\xc9\xed\x35\xc0\xed\x7a\x2c\x6d\x31\x86\xad\x13\xd0\x58\x01\x69\xcb\xc6\x6c\x83\xce\xa6\x93\xbb\x75\x5d\x1b\xa8\xe1\xc6\x77\x21\xd0\x97\xc5\xe7\x29\x9d\xb7\x10\x24\xdf\x18\xed\x80\x8a\xa5\x7b\x0d\x8b\x75\xaa\x11\x91\xb9\x8d\x3c\xf1\xbd\xd5\xed\x4f\xbe\xe0\x6b\x4e\xde\x83\x4b\x4f\xe6\x36\x04\xdc\x62\x29\x24\x06\xb0\x7c\x26\xf3\xd4\xc8\x75\x3c\x27\xb3\x42\x80\xa1\x4d\xd9\x88\x71\x50\x49\xac\xad\x86\x26\x4a\xfa\x13\x08\x3e\x42\xe1\x26\x41\xa8\x22\x77\x2c\x49\x26\xe4\x34\x49\x6c\x15\xd1\xa0\x5e\x44\x99\xf3\x5d\xc6\x25\x4c\x97\x24\xe6\x73\xa6\x34\x39\xba\xfa\xef\xd3\x63\xe0\xda\x60\xc7\x58\x12\x4d\x5d\xca\x5b\xd5\x3e\x03\xfc\x3f\x2e\x40\x4e\x88\xa8\xa6\x89\x9c\xa3\x6b\x1e\x6c\xbd\x22\x26\x59\x42\x97\xd0\x22\x20\xa3\x39\x44\xad\x46\x68\xa3\x21\x79\x21\xa0\x38\xf2\x83\x72\x9c\xed\xa4\x60\x53\xfd\xe2\x31\xe0\xe4\x8e\x47\x7d\x4b\x95\xd8\xfb\x65\x65\x39\xcb\x12\xba\xc6\xaa\x50\xc1\xe8\xeb\x4a\x42\xb3\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x0a\x71\x27\xa5\x3a\x42\xbf\xe8\x4f\x29\xd3\x34\xa6\x9a\x4e\x8c\x2e\xf8\x53\x35\xbb\x4e\x26\xb1\x19\x68\xfd\x46\xaf\x99\x33\xca\x8b\xcd\x4d\xf5\xab\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x68\xc6\xd8\x93\x3e\xc1\xf2\x5f\x7d\x34\xaa\xd8\x46\x3f\x5c\x65\xae\xf5\x97\xaa\x56\x86\xa4\xba\x12\x8b\xad\x29\x83\x52\x93\xd7\xb6\x9b\x92\xbb\x03\x26\xd4\xd3\x77\x67\xeb\xcd\x5d\xdb\x4d\x06\x5b\x4c\x04\x55\xe7\xc2\x86\xe9\x39\x03\xb3\xfd\xa5\xea\x61\x70\x29\x35\x90\x84\x88\x09\x2a\xd4\x55\x94\x71\x0f\xe3\x86\x55\xd3\x27\xf1\xbd\xf5\xf6\x91\x56\x2e\x9e\x36\x8e\x9d\x6d\xd9\x6a\x63\x3f\xd9\xb5\x0f\xb5\xf3\xf3\x6c\xcd\x28\x5b\x97\x31\x86\x90\x87\x04\x13\x67\x22\xf5\xc0\x6e\xeb\x17\x6b\x69\xdf\x71\x4b\xed\x30\x51\xbf\x95\x95\xe0\xa5\x1b\xb6\x3c\x54\x36\x73\x46\x0a\xb5\xe0\x19\xa6\x3c\x5a\x37\x84\xdd\x5d\xf2\x1d\x4d\x78\xec\x87\x40\xac\x3e\x17\x23\xf2\x4e\x6a\xf3\xbf\x57\x1f\xb9\xd2\xa8\x7e\x9e\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x02\x8c\x96\x6c\x38\x57\x81\x9a\xec\x16\x74\x6e\xc9\x9e\x03\x0a\x57\xe4\x5c\x18\x89\xc0\xae\xc8\xa7\x02\x2b\x3b\x84\xcb\x63\x11\x52\x8c\xc1\xc6\xdd\x38\x86\x05\x84\xcc\x2b\x70\xd8\x30\x9c\x1d\x0a\x83\x08\xe1\x17\xae\x1c\x11\xf7\x3c\x9b\x3a\xb3\x1b\x8f\x48\xca\xf2\x39\x78\x6d\xa2\x2d\x5e\x8b\xb6\xa6\xc8\x56\x06\xc8\xad\x7b\x05\x24\xf3\xcd\x5a\xc3\xc5\xca\x26\x05\xcf\x23\x59\x4a\xd1\x9a\xf1\x4f\x43\x7d\x00\x52\xff\x86\x7c\x70\x35\x21\xa7\xae\x55\x4d\xf8\x9b\xf5\x5e\x85\xc3\x98\x11\xb8\x22\x86\x94\xdc\xd2\x84\x61\xa5\x7e\x2a\x7c\xce\x96\x9c\xad\x10\xf6\x91\xcd\x0b\x37\x67\xd6\x8b\x4c\x07\x37\x6c\x79\x30\x5a\xd9\xda\x83\x73\x71\x50\x26\xee\x55\x36\xd3\x13\x51\x90\xb6\x0e\xe0\xb7\x83\xdd\x79\xc1\x46\x62\xd9\xde\xbc\xb2\x75\xdf\xd4\x0d\x6f\x76\x61\x37\x0a\x1b\x47\xea\xd8\x80\x10\xdc\xc6\x39\x49\x65\x0e\xe6\x4c\x73\x37\x2c\x11\x62\x44\xd5\x1b\x9e\x65\x65\x45\x95\x22\x9b\xe7\x34\x66\x64\x9e\xd3\x6c\xd1\x55\x2c\x41\xd9\xa6\x69\xf8\x4f\x46\xd0\x5d\x03\xfc\x0d\x1a\xdd\xc6\xf7\xee\xd8\x74\x21\xe5\x0d\xa4\xd3\x01\x22\xdc\xa3\xfd\xe1\x7b\xfc\xd6\x59\x79\xcf\xa9\x92\x8a\xc4\x4c\x53\x9e\x40\x3c\xc8\xfb\x37\x6f\x6d\xc4\x88\xe3\xe3\x6e\x96\xcd\xc1\x17\x3d\x28\x00\x34\xb6\x91\x4c\x97\xec\x96\xb3\x3b\x6b\x95\x58\x17\xeb\x31\x26\x73\x26\x20\xc0\x61\x43\x20\xd0\x98\x28\x1e\xb3\x57\x90\xbc\xbb\x7e\xa0\x3d\x0c\xe7\x6b\xe6\xbc\xed\xf0\x6e\xa6\xe0\x5b\xa9\x77\x0b\x2e\xeb\xd5\xdf\x0b\x99\x6f\x28\x26\xd4\x2e\x97\xb8\x5d\x9e\xb0\x8d\x46\x7f\x41\xfe\xf0\x87\xdf\xaf\x7d\x28\xa5\x1f\x79\x5a\xa4\x2f\xc8\x97\xff\xf1\x1f\xbf\xff\x8f\xf5\x8f\x71\x81\x8f\x3d\x5f\xbf\x3e\x7b\xda\x5e\x5e\x9e\x3d\x01\x78\xc7\x3e\x22\x6f\xb3\x53\xae\xc5\x50\x33\xca\x93\x22\xb7\xb1\xa0\x2d\x55\x84\xd7\xe1\x3b\xe0\x50\x29\x93\x27\xa8\x1b\xd1\x05\x8c\xd9\x40\xb2\x19\x17\x4c\x41\x13\x98\x42\xe4\x2c\x92\x73\xc1\xff\xc1\x62\xd7\x03\x06\x02\x3b\xa0\x5a\xbc\x43\x71\xc2\x44\x8c\xbd\x38\x0d\xcf\x5b\x50\x11\x27\x9b\x1c\xfe\x2d\x56\x1a\x9e\xe0\xbd\x40\x06\x9c\xa7\x13\xc0\xde\x96\x6f\xd4\xc0\x05\x1d\x45\xad\xfb\x09\x39\x1a\x82\x6d\xaf\x95\x22\x61\xbc\xda\xa0\x58\x37\xcc\x71\x45\xef\x43\x95\x15\xee\xfd\x5c\xb0\x7c\x09\x89\x22\xa5\x60\x1f\x04\x93\x5d\x97\x75\x08\xdc\x32\xac\x44\x85\x85\x60\x6a\xba\x70\x29\xc4\x94\xe1\x1e\xb5\x6f\xc3\x3b\x0c\xdd\xe7\xce\x91\x44\x4e\x89\x28\x92\x64\xdd\xa3\x42\x6e\x72\x39\x85\xb0\xdb\xa2\x4a\xb6\xd3\xf1\xda\x9a\x05\x1a\x20\xfd\xa0\xc6\x81\x70\xe1\x3d\x89\xf2\x4f\xdb\x5c\x10\x2e\xb8\x55\x5c\x68\xfb\x98\xd0\x76\xe5\x6e\x5a\x98\x11\xf0\xea\x12\x34\xda\xb2\x48\xcd\x7d\x1a\x16\xf0\xea\x14\x9f\xd3\xce\xc8\xd0\x30\xf5\x27\x67\x6a\xd8\x61\xf1\x6d\xcc\x0e\x0d\x4b\x1f\x8c\x0f\x2b\x00\x6f\x1b\x0d\xd5\x21\x12\xaa\xe5\x4e\xb6\x30\x4a\xe0\x35\x98\x26\x3a\x71\xa2\x16\x84\xb9\x9b\x99\xa2\xf5\xae\xe6\x8c\x8b\x5b\x89\xc5\xa2\x3b\xc9\x70\x97\x2b\x2f\xd6\x44\xb9\x3b\xa0\xac\x56\x96\xf3\xc2\x6f\x28\xd2\x1a\x85\x96\x14\x6a\xbb\xb1\x7b\xf3\x0a\x36\xe7\x8f\xf4\xa2\x83\x54\x57\x5e\x24\xec\x7b\xae\x17\xef\x5d\x71\x78\x8b\xd5\xba\xc8\x12\x58\x6c\xf0\x83\x41\xa1\xcb\x52\x32\x3c\xc7\x76\x64\x2c\x92\x69\xca\x44\x8c\x41\x44\x29\xbd\x61\xa4\x6c\x79\x69\x64\x3c\x10\x83\x61\x38\xf6\x31\xa3\xa2\x94\x13\x6f\x0d\x2d\xdf\x84\x51\x2d\xf1\xa9\x2d\xaf\x6d\x9d\x98\xb1\x39\x21\x23\xc8\xa8\xa8\x24\x5e\x90\x29\x4b\x24\xa4\x72\x63\xa4\x28\xc6\x32\xbb\x5c\x06\x43\x92\xed\x5d\xcb\xf5\x6c\xe1\x48\x26\xe6\x65\x3d\x2a\x95\x40\x73\x5a\x4b\x81\xa5\x60\x13\x72\x69\x45\x98\x76\x52\x51\x1b\x72\xda\x92\x94\xb6\x66\x88\x65\x2d\x86\xce\x90\x75\xef\x85\xb0\xbd\x75\xf7\xda\x40\xd7\x3d\xfc\x4b\x86\xaf\x6f\xdc\xd0\x0d\xbc\xd5\x23\x5d\x72\x05\x0f\xdb\x1a\xf1\x8a\xb0\xf5\x31\x98\xea\xc6\xe4\xe5\xe5\xab\xd3\xeb\x57\x23\xf2\xed\xc5\x19\xfc\xff\xec\xd5\x9b\x57\xe6\xff\x2f\xdf\xbf\x7b\xf7\xea\xe5\xb5\x91\x23\x3e\xc7\x12\xf4\x46\x8d\x33\xd0\x35\xfc\x48\x56\xa9\x05\x15\x4b\x32\x2b\xb4\x21\x07\xe5\xc7\x2a\xb3\xa0\x68\x03\xa0\x71\x6c\x54\xc6\x4f\x6e\x0f\x9b\x01\x5e\x37\x9b\x84\xbd\x37\xb0\x6a\xbf\x4d\xb8\xda\x2e\x26\xb5\x46\x92\xd6\x59\x07\x95\x29\x1f\xec\x98\x6e\xf0\x41\x90\xd7\x32\x27\xb6\x59\x19\x74\xaf\x8c\xd5\xa1\x4d\xea\x30\xff\x9e\xe0\xad\x93\x44\xce\x0f\x7d\xae\x07\x23\x89\x9c\x13\x55\x4c\x7d\x0e\x0e\x70\x53\x78\xfa\x73\xf7\x58\x25\x75\x61\xe4\x13\x71\x82\xb7\xfc\xe0\x95\x77\xc2\x07\xc2\x71\x4f\xa0\xc3\x58\xe5\x49\x73\xa3\x3e\xe0\xe7\x27\xcd\x33\x70\x82\x13\xcf\x6b\x6f\x7c\x10\x06\x5d\xef\x78\x12\x47\x34\x8f\x57\x70\x16\x98\x1b\x6e\x39\x40\x0f\xcb\xee\x62\x37\xe8\x72\x70\x5b\x2c\x43\xde\xb2\x3c\xa1\x19\x46\x88\x43\xdd\x63\x08\x3d\x82\x8f\x9c\xb1\x8c\x41\x1e\x94\xeb\x56\xce\x44\x94\x48\xa8\xcb\x81\x9c\x71\x54\x5d\x3a\x86\x22\xb9\xe2\x85\x2e\x1b\xcf\x9f\x90\x83\x27\x4b\xe6\x20\xcc\xb8\x13\xf6\x62\x60\xf2\xda\xe2\x2e\x3e\x6f\x03\x95\x46\x2f\xf9\x32\x72\x60\xb3\xcc\x0e\x46\xe4\xc0\xd7\x2f\x89\xad\x94\x7c\xf0\xf9\x41\xf9\x40\x98\xa7\x04\x42\xb2\x75\x09\x8d\xe1\x3b\x61\x46\x24\x6c\xb0\x73\x5c\xf9\x4f\x97\x35\x68\x0c\x6b\xb3\x46\x2c\x98\x43\x75\xa0\x49\x65\x22\x2b\x5f\x2d\x53\xec\xb6\x7e\xd1\x4c\x3f\x78\x5d\x43\x4a\x3b\xa6\xea\x59\xe0\xe4\xcc\xec\x86\x0b\x48\xbb\xaa\x20\x8f\x77\xbc\x85\x45\x72\x78\x4e\x32\x9a\x1b\x55\xc4\x3d\x59\x6d\x73\xf6\xf9\xd6\x26\x67\x2d\x90\x20\xf0\xaf\xb4\x94\xda\xaf\xfc\x1b\x2f\x13\xaa\x54\x83\xe5\x15\x08\x81\x19\x98\x30\x1c\x99\x50\xe7\x7c\x82\x1a\xd6\x0b\x7a\xbb\xa1\xc8\x41\x8b\x49\x6b\x9a\xcf\x99\xde\xec\x19\xa1\x62\xf9\x7e\x63\x59\xb4\x71\xeb\x42\xac\xe3\x76\xa7\xe9\xe3\xb8\x2c\xc2\x35\xe6\x42\x8f\x65\x3e\xc6\x57\x5e\x10\x9d\x17\xeb\x7c\x5c\x9a\xa7\x4c\x16\xfa\x8a\x45\x52\x34\x67\x34\xd8\xe7\x7a\x73\xf5\x74\x48\xf3\xb0\xde\xc6\x53\x27\x46\x84\x85\x0c\x9d\x62\x56\xca\x18\xce\xc3\x58\x2d\xc5\xf2\xfe\xcd\xdb\x7d\x36\x9b\x40\x2a\xf4\xe6\x9d\xfc\xce\x92\x7d\x31\xf7\x33\xb5\x33\xdf\xf8\xda\xdb\x42\x77\x7f\xe9\xa5\xf7\x5c\x6d\x7e\xda\x02\x63\x73\x39\x8d\xb5\xeb\x57\x9a\xea\x62\x05\x1b\x2a\x7b\x63\x89\xe5\x15\xa6\x94\x59\x99\xfe\x0a\xde\x0b\x8d\x7c\xab\x35\x04\xb0\x2e\x09\x3c\xe7\x82\x15\x27\xc4\xbe\x68\xce\xa7\xce\x29\x47\x05\x92\x46\xba\x80\xdc\x64\xaa\x6d\x60\xa3\x2d\xa2\xf3\x59\xd3\x32\x1a\x55\xc6\x4d\x6a\x62\xc4\x72\xad\xde\x50\xa5\xbf\xcd\x62\xba\x26\x7b\xa9\x16\xb0\xa8\x34\x1c\x18\x14\xac\xef\x04\x8b\x0d\x85\xb7\x20\xc0\xf1\xc8\x9d\x21\xbd\x05\x8e\xd8\xd5\x93\x5f\x1e\x20\xf3\xfa\xd8\x7c\xaa\x79\xd6\x97\xd2\xc0\xe4\xb4\x91\x00\x55\x43\x35\xb6\xcd\xd6\xb0\x93\x1c\x46\x23\x82\x7d\x6c\xd2\xb8\xf7\x9f\x71\xc2\xa8\x68\x0e\x97\xaf\x61\x14\x3c\xd7\x1d\x87\xec\x07\xc8\xdd\x82\x1b\x91\x15\xb3\xbc\x14\x71\x22\x54\xcc\x12\xb6\x26\xd9\x6b\xcf\x50\x52\xfb\x85\x33\xfb\x81\x56\x61\x4e\x17\xd5\x77\xbc\x41\xdf\x0a\xe1\x36\x79\xa2\x14\x96\xad\xf4\xe0\xb5\xa6\xfa\xaa\x40\x7c\x99\x26\x32\xba\xc1\xa2\x62\x90\xcf\xcf\xff\xc1\x72\x17\x77\x5e\x36\x14\xb3\x5d\xae\xe6\xae\x83\xa7\x83\x9b\x6b\x69\x04\xa3\x98\xb1\x0d\x00\xfd\xf8\x32\x2f\x2d\x8b\x85\xb0\xd9\x73\x0f\x13\xba\xea\x14\x15\x88\xd7\xaf\x78\x0e\x56\x75\x16\xac\x3f\x02\x35\x0f\xad\xca\x48\x53\x9b\xdd\x72\xf2\xcd\xfa\x4c\x90\x5e\xc3\x51\x37\xe5\xa3\xe0\x13\x00\x3e\x11\x6d\x2c\x57\xb3\x31\x73\xa5\xad\xe5\x6b\x4b\x86\x0a\x69\x2f\xa4\xfb\x29\xb7\x19\xad\xd7\xe0\xc2\xde\xbd\x7d\x6b\xd3\x00\xca\xab\x8b\x0f\xaf\x6d\xb1\xd5\x4e\x5e\x26\xd1\xa5\x28\x66\xb5\x78\x88\x57\x3b\x6c\x92\x27\x7a\xe2\x67\x32\x5f\xab\xc0\xf4\x37\xf9\xcd\xf9\x4c\x5b\x07\x32\xd2\xe7\xfa\xd8\xb5\xd5\xe4\x1d\x43\xbd\xfc\x2b\x23\x42\xc9\x82\x2b\x2d\x73\xeb\x5a\x83\x86\x64\x39\x85\x86\xa9\xcd\x31\x60\xfd\x44\xc3\xbd\xf4\x53\x20\x34\xcb\x18\xf5\xbd\x8a\x2c\x6f\x82\x66\x43\x39\x8b\x64\x1e\x37\x4e\xcc\x69\xf7\x8d\xb2\x54\xe3\xe7\x7b\xc8\xcd\x4c\xa8\xd2\xd7\x7e\x0e\x46\x40\x68\x49\x8d\xab\xe2\x8f\x5d\x62\xb9\x1a\x57\xce\x45\x8a\xf2\x47\x49\xa8\x40\xab\xc6\x7e\x32\xf8\x76\x21\xa3\x5c\x1b\x4a\x73\x3b\xad\xeb\xce\x4b\x6e\xc1\x12\x1f\x66\xe6\x29\x53\x6a\x63\xa2\x51\x2d\x48\x03\xea\x02\x13\x5f\x17\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x2a\x77\x2d\xd7\xa3\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x65\xd9\x82\xaa\xb6\x8b\xf1\xa7\xc8\x87\xf8\xb6\x3e\x0e\x2d\x67\x93\x33\xaa\x36\xa5\x4a\xd6\x60\x3b\xcd\x39\x9b\x91\x97\x34\x65\xc9\x4b\xaa\xfa\x04\x2e\x50\x80\x09\x61\x93\xf9\x84\x1c\x5e\x06\xde\xd6\x77\x52\xbf\xdd\xd4\xb7\x61\x4b\x75\x80\x36\x27\xfa\x5e\xcf\xf2\xde\x4a\xc2\xf6\x93\xbb\xe7\x99\xdd\x7b\x86\x1b\x4e\xe8\x93\x38\x9b\x9b\xf3\x7d\xd7\x9d\xc7\xea\x49\x2c\x72\xb0\xf8\x45\xbb\x9e\xc8\x2d\xc9\x8c\xeb\x4e\xe1\x53\x3e\x7f\x5b\x96\xe4\x87\xb8\x6a\x34\x99\xac\xac\xee\xba\xa2\xb9\x82\xd9\x3f\x0c\xb0\x83\x92\xdf\x66\xa6\x2f\xaf\xbe\xeb\x53\x6c\x79\xdc\x64\x7b\xbb\x81\x6b\x7f\xdf\x20\x97\x8f\x37\x73\xe1\x7d\x13\xf9\x63\x70\xb4\x18\x0c\x78\xc8\x00\x8c\x33\xf7\x55\x6b\xeb\xf0\xd5\x7a\xe1\xaf\x99\xed\x8a\x66\x9f\xa9\xe0\xc7\x11\xf4\x9f\x63\xb7\xd8\xf4\x11\x12\x3e\x18\x11\x4c\x99\x43\x71\xbc\xe1\xf3\x2d\x15\xaa\x76\xca\xd4\x76\x45\x77\xab\x12\x4b\xb6\x6f\xad\x7b\x68\xd3\x06\xe3\xd5\x56\x67\x6b\xa1\x13\x77\x50\xd6\xb6\x6b\x3c\x1d\x06\xdb\x2a\xfe\x75\x1c\xaf\xd9\x80\x5b\xbf\x6a\xd5\x81\xcd\x2b\x97\x40\xa4\xd1\x31\x1c\x19\x0a\x1c\x41\xcd\x68\xa4\xdd\x96\x3c\x55\xed\xb7\x97\x75\x1a\x08\xe1\x86\x55\x0c\xef\x6b\x59\x45\xc1\xfb\x83\xf9\xd6\x0a\x1a\xad\xc7\x7b\x02\xe5\x40\xb6\x22\xd0\xfd\x16\x2a\xc0\x6b\x1b\xd6\x3d\x3e\xbe\xb5\x29\xc8\xb4\x11\xc7\xee\xa9\x32\x8b\x62\xf9\x2d\x8b\x2b\x9e\x3a\x5b\xbb\xbd\x7a\x2f\xf0\xdb\x96\xe3\x5b\xb0\x93\x7f\xfe\xfb\xb3\xcf\xc6\xe3\xf1\x67\x65\x6c\xd6\x0b\x42\x33\xce\x3e\x6a\x86\x11\x78\x93\x9b\x3f\x41\x83\x9e\xdb\xe7\x9f\x01\xc2\x91\x97\x60\x6d\x76\x66\xd6\x33\x9f\x41\xf8\x99\xcb\xc0\x34\x1f\xa1\x42\x48\x1d\xc6\x22\x45\x52\xe8\x5c\x26\x09\xcb\xc7\x73\x26\x26\x37\xc5\x94\x4d\x0b\x9e\xc4\x2c\x87\xc1\xdd\xa7\x6f\x9f\x4d\xfe\x73\xf2\xec\x33\xe2\xf3\x2d\x8d\x64\xaf\x34\x4d\xb3\x17\x90\xf8\xf1\x99\xc5\x38\x57\x91\x2d\x4b\xa8\x50\x13\x1f\xe6\x3d\x89\x64\xce\xa4\xf9\x5f\xfa\x99\xca\x58\x64\xbe\x8d\x07\x8d\x34\x3e\x63\x4d\x67\x76\x8a\xb6\x94\x59\x09\xa6\x31\x91\x49\x0a\xff\xc6\xa5\xdb\x12\x72\x17\x89\xad\x47\x97\x70\xa5\xbf\xa9\xff\xf2\x86\x2b\x64\x97\x59\x52\xe4\x34\xa9\x4e\x15\x7e\x50\x0b\x99\xeb\x4a\xa9\xd5\x31\xe1\xc8\x1a\x15\x17\xf3\x22\xa1\x79\xe5\xad\xcf\x5c\xcc\x43\x69\xae\x33\x5c\xf2\xb6\x12\x4b\x37\xae\x04\xcb\x72\xa1\x59\xfe\x52\x26\x45\x1a\x5a\xc7\xc6\xab\x72\xe5\x8c\xe7\x4a\xdb\x1a\x77\x55\xa7\x42\x93\x5c\x0c\xdf\x0f\x70\xf4\xef\x4a\x0a\x70\x17\x92\x89\x01\xf7\x64\xfd\x4b\x3f\x3c\xfb\x31\x78\x0f\xf7\xb0\x2a\xaf\x36\x9e\x92\x86\x19\xd3\x2c\xcb\xe5\x2d\xc5\x0a\x7d\x1b\xe6\xe2\x9e\x5b\xf9\xec\xe9\xea\x0f\x6b\xbe\xdd\x3c\x64\xc5\x47\x17\x0e\x59\xf9\x41\x37\x54\x2f\xc4\x87\x6f\x9f\xd3\x24\x5b\x50\x97\x67\xa8\xa2\x05\x4b\x69\xb9\x49\x32\x63\xe2\xf4\xe2\xfc\xbb\xdf\x5f\xd5\x7e\x68\xae\x67\x68\x50\xce\xa7\xd6\x05\x95\xf5\xa9\xd3\xc5\x7c\x6a\x44\x79\x02\x56\xa6\xb9\x22\xe4\x35\x0b\x75\x46\x2a\xc7\x33\x5e\xbb\x6d\xa0\x13\xdc\x5a\x27\x5c\x05\x44\xa6\x46\xe8\xaa\x3d\xc4\xca\x80\xcf\xca\xca\x2c\xc2\xb3\xd8\xc2\xac\x8c\xde\x71\x6e\x9e\x72\xd1\xc2\xae\x69\x42\x0c\x32\xb2\xdc\x57\x41\xc2\x34\x4e\x4d\x82\xfc\x43\x1c\x0d\xcc\x15\x98\x27\xa3\x99\xd2\x10\xb7\x90\x0b\xd7\x08\x78\xe4\xfb\x99\xe7\xcc\x8c\x5b\xcd\x60\x74\x29\x19\x0d\x6d\xce\xe6\x5c\x3b\x12\x1a\xc9\x34\x2d\x04\xd7\xcb\x13\xa0\x86\x7c\x5a\x98\xdd\x38\x89\xd9\x2d\x4b\x4e\x14\x9f\x8f\x69\x1e\x2d\xb8\x66\x91\x2e\x72\x76\x42\x33\x3e\x86\xc9\x0a\x0c\xc0\x49\xe3\xdf\x78\x3a\x5e\x57\x3a\xd7\x72\x98\x26\x19\xa1\x0a\x6b\xa8\x08\xc7\x83\x7e\xe5\xd8\x52\xb9\x52\x77\x14\x2a\xdf\xbe\xba\xba\x2e\x5d\x8c\x58\x29\x08\x20\x1c\x38\xd9\x4a\x60\x1b\x40\x41\x3f\x1a\x5b\xe8\xdb\xa5\x76\xfa\x84\x4e\xa8\xf3\x9e\x70\xa3\x93\xa8\x62\x9a\x72\xad\x5c\xac\x23\x06\x0e\xbe\x04\x0e\x02\x65\x27\xd1\x52\x33\x21\xe7\xa2\xd4\xef\xef\x1d\xd4\x10\x15\x34\x36\xe0\x6b\x0f\xec\x90\x01\xae\xbe\xd0\xa0\x48\x39\x16\xb5\x76\x77\x82\x33\x7e\x95\xb1\xc8\x9f\x06\x7f\xa6\x4f\xb1\x66\xba\x2d\xce\xef\x63\x31\x25\x76\x99\x86\x97\x57\x42\x0a\x36\xe8\x75\xeb\x75\xb9\x31\x69\xa0\xa7\xd5\x9f\x1a\x62\x17\xc6\xed\xd8\x08\xd9\xa2\x90\xb9\x4f\x6f\xb7\x03\x39\xde\x60\xb5\x63\xa8\x75\xef\x19\x86\xcd\xc7\x00\x5d\x59\x84\xb0\x85\x1c\x85\x20\x50\xd8\x40\xf6\xe0\xd4\x95\x33\xc4\xfa\xf0\x6f\xa9\x28\x68\xd2\x18\xc0\xb6\x51\xbe\x73\xb0\x59\x5f\x5f\x61\x5d\x85\xdb\xf5\xa0\xeb\xb5\x56\xc3\xc6\xd9\xdb\x7c\xe9\x8d\x25\x26\xd6\x05\x78\x21\x36\x76\x2e\x4d\x11\xd4\x91\x5f\xe7\xd2\xdc\x27\x06\xe9\x20\x3c\x53\x2b\x61\x23\xc8\x40\x37\x87\x8e\x28\xcd\x32\x55\x16\xa9\xd0\x92\x44\x32\xcd\x12\xa6\xab\xbc\x17\x82\x72\xbb\xc5\x28\xd5\x63\x6e\x77\x3c\xa9\xb6\x66\xc9\xd5\x1a\x7f\xed\x18\x2d\xbb\x5d\xce\x9f\xd6\x4c\x14\x86\x0a\x5f\x55\xaa\x81\xaf\x69\xe3\x5a\x3d\x92\xeb\xdf\x0d\x6b\x14\x62\x36\x6a\xb5\x63\x90\x8b\x31\x71\x85\x87\x63\x1b\x98\x1a\x07\x69\x6b\xeb\x43\x4b\xf6\x8c\xd3\x59\x2f\xab\x34\x2f\xb3\x4c\x48\x59\xe9\x7e\xba\xe6\xfd\xad\x6a\x21\x24\xec\x6d\x8a\xc6\xab\x72\xf2\x73\x0b\xd0\xdc\xf6\x89\xa4\x24\xe3\x0c\x63\xe7\xbd\x38\x04\x00\x63\x34\xb6\x37\x0d\xc3\xcb\x99\x8f\x0f\xb7\xf6\x6e\x18\xa0\x14\x97\xa0\xaf\x0f\xc5\x40\x75\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\x6d\x32\xa1\x6d\x1d\x02\x98\x9c\x42\x48\xbb\xeb\x90\x11\x33\x65\xd0\xf3\x0a\x8c\xe7\x29\x15\x7c\xc6\x94\x9e\xf8\x1a\x21\xea\x87\x2f\x7e\x9c\x84\xa9\x01\x23\x57\xdc\xdc\x0b\x15\x16\x35\x80\x94\x9b\xc5\x94\xe5\x35\x7d\x53\xd2\x4c\xba\x4e\x22\x77\x30\x59\x4d\x6f\x0c\xfd\xc6\xc9\x16\x46\x97\xb9\x61\x2f\xc8\x01\xaa\x26\xfe\xd3\xff\x34\x62\xf8\xbf\x0f\xc8\xd1\x1d\x84\x3c\x1f\x98\x3f\x0f\xf0\x83\x5e\x06\x0c\x9b\xe9\x94\x1f\xc6\x40\xe9\x9c\xcf\xe7\x2c\xb7\xbe\x23\x30\xab\x42\xcf\x10\x0e\x6d\x40\xcb\x87\x85\xed\xa9\x56\xd6\xdc\xac\x4f\xe4\x87\x2f\x7e\x3c\x20\x47\xd5\x75\x11\x2e\x62\xf6\x91\x7c\xe1\xdd\x0f\x99\x8c\x8f\x6d\x54\x96\x5a\x0a\x4d\x3f\x9a\x31\xa3\x85\x54\x4c\x60\xc8\xb7\x96\xd8\xc6\x45\x49\xf0\x6c\x25\xc9\xd8\x36\xc9\x27\x77\x98\x36\xec\x40\x89\x69\xb8\x50\xb2\xa8\x2a\x21\x63\x0b\x5d\xf8\x9a\xd9\xb6\x39\x98\x56\x8c\xf4\x85\x7d\x5e\x30\xb1\x21\xac\x92\xa4\x0a\xdc\x24\x43\xfa\x16\x54\x80\x9b\xc5\xb6\x87\x31\xf2\xd4\x64\x9d\x4f\x72\x2b\xc6\x6f\x32\x69\x35\x88\xad\x6d\xda\x0c\x3f\x90\x50\xd8\x7a\x89\x9b\x0c\x66\x8f\xda\x49\x79\xaf\x15\x6d\x8c\x3e\x5a\x5d\x16\x86\x1c\x3d\xc0\xda\xa0\xdf\xec\xc9\xce\x4b\x73\x22\x75\x17\x4e\x70\x78\x85\x07\x3e\xaa\xbf\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x29\x8d\x91\x04\x52\xb1\xbc\x77\x34\x36\x00\x04\xaf\x6d\xb4\x1c\x5b\xbb\xdc\x98\x8a\xd8\xfc\x5b\x71\xa5\xcd\xfd\x9d\x21\xb6\xc1\x10\x5a\x85\xd2\xb7\xe7\x67\x0f\x83\xdc\x05\xdf\xf1\xb4\x4e\x0b\x11\x27\xec\x8d\x94\x37\x6b\x52\x81\x2b\x0b\xfa\x2a\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xec\x63\x68\x03\x2d\x97\x64\x45\x82\xe4\xb5\x10\x19\x8d\x6e\xe8\x9c\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x6b\x5d\xb9\xb5\xb3\x47\x6b\x80\x9d\xe7\x9a\x69\x3a\xbe\x68\xcb\x0e\x50\x37\xef\xed\xf3\xed\xc5\xaf\x5c\x91\x70\x2f\xd9\x6c\xed\x83\xbe\xb8\xfd\xba\xfc\x93\x31\xb4\xf6\x5a\xfb\xa3\x2b\x84\xdc\xf8\xc0\x76\x1f\x62\x7d\x9e\x6d\xa3\x9b\x6a\xaf\xb9\x1d\x71\x04\xc3\x42\xb9\xf2\x18\xdc\xb1\xbb\x00\xdd\xd8\xee\xa8\x02\x0a\x94\xdc\xda\xc8\x9c\x07\x29\x89\xb4\x5d\x6c\x6e\x58\xef\x0e\xc2\x73\x38\xf1\xad\x7e\xbb\xad\x82\x74\xc3\x9c\x06\x71\x7a\x10\xa7\x9f\xb8\x38\xdd\xe9\x0c\x6c\x0f\x3d\xf8\x34\x04\xec\x4e\x8b\xde\x1e\x6d\xff\x24\x45\xee\xce\x6b\x6c\x11\xfc\xff\x64\x85\xf0\x4e\x8b\x6d\x29\x90\x37\x2d\xf9\x97\x2c\x96\x77\x82\xe1\xd6\x78\x98\x27\x28\xa8\xb7\x5e\xe0\xe6\xa4\x90\x86\xf5\x05\xf9\x18\x35\x3b\xb0\x99\x34\xb6\x28\xf7\x76\xda\x50\x4c\xde\x26\x4e\xf5\x52\x01\xb6\xb7\xe8\xbb\x56\x61\x73\x6b\xcb\x12\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x1b\xe2\xcc\xcb\xb8\xe2\xbd\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x5c\x76\x9b\x44\x92\x0e\x4b\x36\x32\x7c\x96\xcb\x69\xdb\x8a\x35\xf7\xb0\xaa\x96\x51\x86\x7b\x86\xb3\x43\x76\xbe\xdf\xdf\xde\x16\xbb\x2d\x89\xa3\x61\xee\x58\xd3\xae\x12\x49\xe6\xf7\xe3\x50\xc1\x26\xdf\xc7\x4c\x77\x0e\xbe\x0c\xc4\x6a\x9c\xe4\xc8\x79\x30\xaf\xf3\x82\x8d\xc8\x6b\x9a\x28\x36\x22\xdf\x8a\x1b\x21\xef\xfa\x9b\xef\xe6\x8a\x0c\x0d\xb3\xbd\xb6\xb5\x17\x5a\xe4\x0a\xb5\x9e\x4a\xa9\xdd\xb7\x24\xf6\xe7\xfe\x05\x67\xa1\xb1\x1a\xfa\xb8\x10\xfc\xe7\xa2\xaa\xa8\x78\x27\xd3\x51\x5d\x85\x79\x79\xf5\x1d\x20\x07\xaa\xdb\xaa\x52\xd4\xd6\xfc\xa8\xd6\x87\x55\xb7\xc9\x83\xda\xa8\xa8\x56\x13\xc3\x8d\xa2\x5f\x55\xb5\x12\x5b\x9e\xb0\x6e\x96\xc9\x8a\x24\x99\x90\x73\x7d\xa8\xcc\x1c\x78\x44\x93\x64\x69\xb4\x96\x5a\xb7\xb0\xfd\x32\xb8\x5a\x30\x88\x95\xc3\x86\x15\x57\xf8\x2d\x0b\x5e\x77\x80\x46\x83\x13\x8b\xed\x3a\xf6\x2b\x99\xb8\xa1\x2f\x56\xc3\xd4\x2e\xed\xe3\x0e\x51\xc2\xfd\x2f\xa1\x6a\x07\x45\x5d\x13\x90\x46\x30\x32\x93\x85\x88\x09\xd5\xb0\x3d\x3b\xce\xb9\xea\xc3\x7d\x38\x87\xff\x66\xf9\xa9\x1f\x63\x63\xe0\x81\x2f\xf3\xf8\x36\x08\x5f\x25\x91\x63\x1f\x59\x54\x04\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\x7e\x73\x5f\x1f\x25\x31\xf5\x61\x73\x4a\xfb\x4e\x9d\xf4\x18\xd0\x3e\xaa\xbb\x9d\xa8\xd0\x43\xec\x79\x9b\xc2\x4e\xed\x2b\x13\x35\xa1\x3d\x70\x45\x7c\x6a\xca\x54\xb0\xc2\x15\xfc\x36\xf4\x84\x42\x05\x16\xc3\x64\x6c\x57\x04\xa8\x53\xb5\x90\x3b\x53\xc6\xb6\xf9\x89\x6f\x9d\xfc\x66\x3e\x08\xb2\xdd\x78\x45\xb6\xb3\xfc\xaf\x94\xed\xa0\x79\x4f\x19\x4a\x03\x4c\x32\xa5\x4b\x08\x4d\x4b\x33\x99\x6b\x8a\x0e\x8e\x42\xc4\x2c\x57\x9a\x62\x8d\x12\x97\x97\x97\x99\x35\x2f\xa8\x22\x5c\x2b\x12\xd9\x24\x43\xdc\xb0\x7b\xca\x64\x0c\x80\x7d\x61\x5e\xf0\x22\x42\xe5\xe3\xc8\x57\x2b\x1b\xb3\x71\x17\x36\x4f\x2c\xa1\x1b\x02\xab\xf6\xa5\xb3\x57\x9a\x65\x75\xba\x1a\x2c\x42\x80\x38\x7e\xcb\x63\x0c\x46\x62\x19\xe1\xa2\x1f\xa2\xba\xdd\x81\x83\x8e\x89\xf5\xc7\x6a\xec\xad\x34\x6b\x1f\xd8\xa0\xd1\x6e\x27\xea\x32\xc3\x48\xf9\x6d\x67\x7f\x73\xf7\x79\xbf\x8a\x3d\xc9\xe5\xfa\x48\x39\xbc\x56\x76\xd5\x65\x5f\x6c\xd8\xdd\x20\x56\x17\xa2\x41\x75\x6e\x25\xa9\x65\xab\x3d\x26\x0f\x5d\xe5\x66\x4b\xea\xdf\xd6\x42\x2c\xe3\x20\x70\xb0\xe5\x63\x60\x98\xdc\xf8\xec\xb6\x3c\xc2\x87\xae\xab\xb3\x67\xc5\x94\xf2\x72\x2e\xa4\x5e\x06\xdb\x6e\x65\x6f\x39\x50\xb9\x35\x3d\x0f\xd7\xc2\x3e\xde\x72\xcc\x56\x09\x80\xfd\xa7\xbd\xb1\xac\x9a\xf6\xdb\xc4\x93\x32\x9a\x6b\x1e\x15\x09\xcd\xcb\xb3\x0f\x44\x7e\x25\x6f\xa9\xf3\x9c\x95\xa6\xb9\x6e\x55\x64\xe1\xca\x3d\xe9\x6b\x2e\x42\xc1\x85\x05\x13\xde\xf9\x87\x69\x60\x64\xca\xe6\x86\x79\x66\x59\xb2\x74\x39\x06\x65\x04\x7b\xc2\x95\x2e\x9b\xff\x81\x2c\xd0\x36\x14\xa2\x73\xb9\x86\x5f\x75\x1e\x9d\x4c\xd2\x48\x8a\x19\x9f\x3f\x5c\x16\xdd\xfb\x37\x6f\x5f\xc2\x27\xe1\x5e\x99\x43\xe7\xef\xaf\x64\xd0\x95\x93\x84\xdb\x65\x92\x9c\xff\xa1\x4c\x91\xb3\xf5\x1c\x1a\xf2\xe3\x5c\xf6\x95\xdb\xcf\x1d\xf3\xae\xfc\x34\x5d\x54\x86\x67\xc5\x2a\x93\x42\x71\x23\x13\x43\xfd\x2c\x78\x08\xbb\x9f\xbc\x7f\xf3\xb6\xdf\xa4\xab\x21\xc3\x6a\xc8\xb0\x1a\x32\xac\xb6\x1d\xa8\x16\x19\x56\xfe\x34\x43\x7e\x95\x0b\xdb\x33\xff\xb6\x69\x42\xe5\x71\xf7\x35\xad\xdb\x7e\x7c\xb3\x7c\x38\x63\xd4\x80\x66\x7b\x64\xe1\x6b\xfb\x60\xd9\x85\xa7\x92\xa7\x6b\xc9\x0c\xe8\xe2\xef\xdf\xbc\xf5\xe3\xde\x43\x4e\x44\xcc\x95\xf9\xcc\x4b\x99\x71\x16\xbf\xbc\xfa\xae\x5d\x93\xe6\xb3\xfa\x5b\x95\x9c\x0e\xfc\xd1\xcc\xfc\x50\x91\x03\x7c\x88\xbc\xbc\xfa\xee\xc0\x2d\x04\x36\xa2\x6c\xe4\xe5\xb3\xda\x08\xd5\xa1\x40\x80\xf4\x7f\x44\x30\x0a\x89\x56\x6f\xc7\x95\x46\x47\x52\xd8\xae\x33\x0b\xaa\xc8\x94\x31\x11\x0c\x8a\x2a\xf0\x7b\xfb\x34\x94\x02\xb5\x71\x4a\x50\xc1\x1b\x8b\xfe\x97\x51\x0d\x13\xf2\xbd\x11\x6d\x72\xc6\x84\x59\x46\x3c\x82\x2d\xc0\x0a\xb9\x0c\x78\x2f\xba\xf4\x82\x85\xa9\x03\x58\x11\x94\xf1\x59\x33\xc9\xcd\x19\x23\x4d\x3a\x69\x8b\xc4\xa7\x12\xd3\xd7\x16\x90\xb9\x47\x6c\x7f\x08\xbb\xf2\x41\x69\x4d\xf6\x47\xc5\xb9\x19\x01\x89\x04\x23\xd4\x9c\x6d\xed\x9d\x66\x81\x18\x5d\x36\x03\x38\xbd\x38\xf7\x65\x64\x27\x64\x3c\x1e\xdb\x78\x31\x9d\x17\x91\xc6\xd2\x50\x1a\x1b\x19\x99\x51\x63\x9e\x03\xb7\x52\x0c\x2c\x41\xae\x5f\x9b\xc5\x4e\x0c\xf2\x82\x80\xcc\x89\xb5\x5e\x95\xa0\x98\x90\x6a\xcc\xde\x07\x01\x90\x20\xaf\xa5\xb4\x9b\x84\xdf\xfc\x27\x39\x39\x21\x97\x35\x03\xf9\xd4\xc8\xad\xb6\x3f\x0a\xc8\xff\x33\x29\x0f\xab\xa6\x32\x36\x31\x2f\x7e\x23\xe4\x9d\x68\xfa\x3a\x7c\x8b\xe6\xec\x05\xf9\x70\x70\x7a\x4b\x79\x62\x50\xf8\xc3\xc1\x88\x7c\x38\xb8\xb0\xe1\xca\x5c\xcc\x3f\xd8\x76\x07\x1f\x0e\xce\x18\xf4\xe0\x8e\x3f\x1c\x98\x61\x7f\x07\x0d\xdc\xde\xb2\x7c\xce\xbe\x61\xcb\xff\x82\xc1\xfc\xed\x2b\x6c\xf6\xb6\xfc\x2f\xec\xf5\x66\xee\x1b\x82\x75\xbd\xcc\xd8\x7f\xa5\x34\xf3\x37\xde\xd2\xcc\xbf\x1c\x44\x62\xfc\xf0\xa3\xa1\xf4\xb7\xcf\x27\xe5\x8e\xfe\xf4\x77\x25\xc5\x8b\x0f\x07\x41\x09\x4f\x99\x1a\xcc\xc8\xf4\xf2\xc3\x01\xa9\x7c\xf5\xc5\x87\x03\xf8\xae\xbb\xef\x26\xf9\xe2\xc3\x81\xf9\x92\xb9\x9d\x4b\x2d\xa7\xc5\xec\xc5\x87\x83\xe9\x52\x33\x35\x7a\x3e\xca\x59\x36\x32\x07\xfb\xbf\xca\x2f\x7c\x38\xf8\xc9\xec\xc9\xc9\x09\xb6\xd9\xc0\xcd\x54\xe4\xdf\xcd\xbd\x31\x7a\x30\x8b\xad\xfa\x1a\xd6\x3e\xba\xad\x3e\x16\xda\xcd\x77\xb1\x9e\xed\xd9\xa0\x7a\xe7\x5a\xa1\xab\x2f\x96\x9d\x2b\xf7\x8b\x08\xb1\xe7\xd7\x37\x7f\xf7\xea\x28\x98\x9e\x51\xff\x2c\x47\xc5\x18\xcc\x78\x42\xb0\x3b\x22\xe6\x20\x1a\x51\x09\x3c\xe8\xd0\xb5\x45\x90\x42\x39\xb1\xad\xaa\xe0\x1a\xda\x81\x67\xde\x0e\x03\x92\x5f\x14\xb1\x4c\x9b\xd3\xf5\x40\x35\x4d\xbb\x55\x06\x4d\x57\xac\xfb\xbb\x47\x6e\x20\xa8\xad\x99\x9f\xba\xce\xbe\xb8\xac\x3d\x17\x9f\xd2\x8f\x6f\xa0\xc1\xd3\x0b\xf2\xfb\x2f\xfe\xf8\xe5\x9f\xd6\x99\x76\xa7\xa8\xd0\x7f\xbd\x31\x75\xb9\x01\x0c\xab\x2f\xd6\xcd\xab\x13\x27\x7f\x4e\xca\xbc\xe8\xb2\x99\x6a\x35\x6c\x47\x31\x4d\xa6\xe0\xc1\x2a\x32\x03\x97\xd7\x2e\x5b\x55\x44\x18\x52\xd8\x38\x18\xf7\x04\x3c\x59\x92\xe7\x5f\x60\x5b\x23\xf8\xf4\x0a\xf9\xfe\xe1\xe3\x8f\x93\x86\x29\x73\x45\xfe\x73\x54\x9b\x8f\x91\x79\x0a\x60\x7a\x06\x71\xd0\x59\x6d\xd4\x55\x1b\x74\xbc\x86\x13\x32\x3f\xdf\x6d\x1b\xd7\xa1\xc5\xc7\x97\x7f\x58\xbf\xbf\xae\x03\xfb\xb3\x3e\xfc\x8a\xd6\x6f\xe8\x05\x01\x8a\x65\xec\x69\x0a\x39\xfd\x41\xe8\x48\x88\xda\xba\x5b\xf0\x0f\xb9\xc8\x65\x5c\x44\x46\x1d\x93\x33\x17\x99\x1e\x85\x04\x0a\x7a\xcb\x98\xd3\x80\x5a\x36\x61\x1f\x0d\xd0\x59\xd9\x64\xc8\xa8\xbc\x8c\x0a\x2e\xe6\xaa\x2c\xe4\x08\x04\x04\xb9\xee\xdd\x82\x01\xeb\xd1\x61\x4b\x4e\x98\x95\xe2\x31\x84\xcd\x53\x32\x2f\x68\x4e\x85\x66\xd8\xac\x01\xdb\x72\xa2\x8e\x59\x92\x3c\x1a\xd4\xc6\xb4\xa7\x11\x8f\x2a\x12\x2b\x33\x45\xab\x0d\x62\x3b\xd7\xde\x8e\xea\xf3\x67\x5f\x6c\xdc\x72\xff\xdc\x7a\x23\x3b\xd5\x9a\xe5\xe2\x05\xf9\xdf\x1f\x4e\xc7\xff\x8f\x8e\xff\xf1\xe3\x91\xfd\xc7\xb3\xf1\x7f\xfe\x6d\xf4\xe2\xc7\xcf\x83\x3f\x7f\x3c\xfe\xeb\x6f\xfb\x30\xb9\xaa\x5e\x83\xab\x5a\x01\x6d\x7b\xd3\x98\x03\xf3\xd5\x4d\x8d\xb9\xc6\xe4\x00\xa6\xb4\xf9\x19\x3b\xdd\x4d\x4a\x46\x3b\x20\xe9\x7a\x4c\x97\x51\x9f\x4a\x3c\x03\x8a\x67\xc4\xd2\x89\x95\x70\x27\x91\x4c\x4f\x02\x0b\x83\x11\xad\xdf\x52\xb1\x24\x25\x59\x43\xa1\xb4\x8e\xe9\x0a\x12\xcd\x68\x94\x4b\xa5\x2a\x56\xe2\x1b\x46\xbc\xe4\x8a\xc4\x72\xca\x22\x0a\xb2\x78\x3e\xe5\x3a\xa7\xf9\x32\x50\x3d\x5c\x91\xfb\x42\xb1\x59\x91\x90\x23\xc5\x18\x99\x08\x19\xb3\x55\xea\x7a\x8c\x34\x94\x4e\x79\xc2\x35\x64\x85\xc4\xcc\xa8\xda\x09\xb7\x2a\x80\xf3\x60\xbb\x2e\xb8\x73\xf6\x91\x70\xed\x3b\xd1\x73\x45\x8e\x62\xa1\x9e\x3f\xff\xe2\xf7\x57\xc5\x34\x96\x29\xe5\xe2\x75\xaa\x4f\x8e\xff\x7a\xf4\x73\x41\x13\xc8\x60\x79\x47\x53\xf6\x3a\xd5\x7b\x05\x8b\x55\xd9\xe2\xf3\x2f\x5b\x9c\xa2\xa3\x1f\xf0\xac\xfc\x78\xf4\xc3\xd8\xfe\xeb\x73\x77\xeb\xf8\xaf\x47\x1f\x26\x1b\x7f\x3f\xfe\xdc\xac\x21\x38\x81\x3f\xfe\x30\x2e\x8f\xdf\xe4\xc7\xcf\x8f\xff\x1a\xfc\x76\xfc\xdb\xc1\xc8\x5e\x5a\xcd\x03\xdd\xeb\xc1\x8c\xed\x76\x0c\xaf\x48\xd5\x8d\xee\xf5\xdf\x57\x8d\xef\x2b\x93\x47\x23\x7c\x43\x11\xbb\xa8\xf2\x91\xc0\x4c\x5f\x1f\xa2\x65\x45\xbb\xbe\x2c\xf6\xf5\x35\xa2\xa4\x8b\xb8\xe1\x35\x7d\xa0\xf5\x86\xf8\xfc\xb4\xf2\xfc\x4f\x36\x41\x24\xb0\x5b\x81\x31\x73\x59\x0d\x70\x91\x60\xfc\xa9\x96\x8c\xf1\xf9\x82\x0d\xa6\x9d\xc1\x0d\x30\xb8\x01\x06\x37\xc0\xd3\x70\x03\xd4\x8f\x3c\xb8\x03\xa0\x2b\xaa\x0a\x8c\xc9\x34\x4e\xb9\x58\x73\xfc\x37\x9f\x7b\x4b\x1d\x46\x24\x93\x46\x96\xe1\x10\x7e\x2d\x6f\x59\x9e\x73\x08\x7b\xc3\x77\x72\x56\x36\x21\x0c\x43\xd0\x7b\x32\xc2\xc6\x2c\x4b\xe4\x32\x5d\x57\xba\xfc\x7e\x22\x8a\xed\x22\x7b\x0e\x62\x1e\x0c\xbf\x83\xe1\xf7\x17\x64\xf8\x1d\xac\xb9\x83\x35\x77\xb0\xe6\x36\x5c\x83\x35\x77\xb0\xe6\x0e\xd6\xdc\xc1\x9a\xbb\x72\x0d\xd6\x5c\xfb\xcc\x60\xcd\x1d\xac\xb9\x0f\x6d\xcd\x2d\x2f\x55\x29\xea\xfb\x40\x6a\x65\x9b\x68\xa7\x15\x85\xde\xb6\x57\xb5\x2a\x7d\x55\x33\x6f\x50\xe7\xb9\x56\x2e\xd9\x10\x34\xf7\x49\xd8\x86\xed\x61\x7b\xce\x0f\xa1\x53\x83\x06\x3d\x68\xd0\x43\xe8\x54\xe5\x1a\x94\x6d\x7f\x0d\xca\xf6\xa0\x6c\x0f\xca\xf6\xa0\x6c\x0f\xca\x76\xfd\x1a\x94\x6d\xbc\x06\x65\x7b\x50\xb6\x1b\xae\x4f\x43\xd9\xde\x14\x3a\x35\x33\x28\xeb\x6e\x6e\x8b\x9d\x22\x61\x50\xcd\x17\x43\x50\xcd\x10\x54\x33\x04\xd5\x0c\x41\x35\xee\x7a\xe8\xa0\x9a\xaa\x05\x0e\x23\x5f\x2a\x16\x37\xc0\xd9\x2c\x97\xb7\x3c\x66\xaa\x16\x82\xe3\xeb\xed\x05\x5c\x26\x85\x0e\x7d\x65\x58\x0d\x7b\x98\xa0\x9a\xc1\x3c\x37\x98\xe7\x06\xf3\xdc\x60\x9e\xab\x5e\x83\x79\xce\x5f\x83\x79\x6e\x30\xcf\x0d\xe6\xb9\xc1\x3c\x37\x98\xe7\xea\xd7\x60\x9e\xc3\x6b\x30\xcf\x0d\xe6\xb9\x86\xeb\xd3\x30\xcf\x85\x18\x34\xa4\x57\x0c\xda\xe7\xa0\x7d\x3e\x3d\xed\x73\x50\x29\x07\x95\x72\x50\x29\x1b\xae\x41\xa5\x1c\x54\xca\x41\xa5\x1c\x54\xca\x95\x6b\x50\x29\xed\x33\x83\x4a\x39\xa8\x94\x43\x7a\x45\xc7\xf4\x8a\xf7\x6f\xde\x06\xf1\x1c\x18\xe7\x11\x60\x16\x34\xd8\x86\xc2\xbb\x8e\x27\x0f\xbe\xd8\x41\x1b\x1e\xb4\xe1\xc1\x17\x6b\xaf\x41\x71\x1e\x14\xe7\x41\x71\x1e\x14\xe7\xca\xc6\x0d\x8a\xf3\xa0\x38\x57\xb7\x72\x50\x9c\xbb\x03\x6d\x50\x9c\x07\xc5\xb9\x61\x2b\x7e\x19\x8a\xf3\x50\x65\x56\xcb\x1c\xaa\xc7\x3e\x7c\x85\xd9\xaf\x7d\x8b\xcf\xd5\xea\xb2\xf0\xdb\xda\xca\xb2\x38\x61\xf8\xa9\xa9\xaa\xac\x44\xac\x5c\x2d\x27\xeb\x9a\x8a\x3e\x42\x29\x59\x6c\x0c\x64\x15\x87\x42\x70\x10\x7b\xd2\x22\xd1\x5c\x33\x41\x45\xb4\x04\x36\xfb\xfe\xcd\x5b\x92\x52\x41\xe7\x41\x6f\x1f\x35\x21\xe7\x1a\xe8\x8d\xce\x7d\x33\x27\xdb\x7f\xc8\x27\x80\x84\xed\x8e\xa0\x12\x85\xef\x38\x04\x0a\x87\x13\x02\x58\x0c\x02\xa0\x61\x1f\xd0\x9d\x28\x6c\x4c\xf4\x59\xfd\x80\x0f\x29\x31\x43\x4a\xcc\x90\x12\xf3\x44\x52\x62\x80\x7e\xac\x6d\x39\x57\x21\x32\x3b\x34\xe2\x8a\xd9\x8c\x16\x49\x43\x73\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x33\x7c\xb2\x83\x89\x55\xb1\x84\x45\x5a\xe6\x5b\xdb\xd6\x5d\xd9\x07\xed\x1b\xb8\xcc\xca\xd2\x0e\xd5\x66\xba\xd5\x62\xa5\xdb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xc7\x0c\x2c\x8d\x6b\x4c\xc3\x2b\xb3\xaf\xbf\x84\x27\xca\x35\xdd\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfa\xee\x6c\xd5\xca\x5d\x5d\xe0\x3a\xc3\x34\xd9\x6c\x9c\x5e\x99\xfa\xe9\x86\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\x37\x6c\x89\xf4\xb1\x92\xa5\x65\x1e\xce\x19\x50\x53\xd8\xcc\x1b\xb6\x84\x87\x2c\xb1\xdc\x22\x60\xf6\xd2\x47\xfc\x86\xad\x83\x10\xfe\xee\x26\xbb\x5e\x40\x6d\xd5\xb1\xfb\x86\x2d\x37\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xc6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x43\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x72\x43\xea\x0d\x3e\x9c\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x4f\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x74\x40\xf3\xf4\xb9\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xc3\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\x76\x10\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\x9b\xe8\x0a\x5e\x5b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x14\xa4\xff\x84\x55\x7e\xb3\xcd\xc1\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x6e\x69\x62\xe8\x1d\xd8\xe7\x09\x4b\x90\xfa\x19\x21\xbd\x46\xd8\x47\xe4\x6e\x21\x15\x12\x33\xb4\x52\x71\x45\x0e\x6e\xd8\xf2\x60\xb4\xb2\xb5\x07\xe7\xc2\xba\xa9\x56\x36\xd3\x13\x51\x29\x92\x25\x39\x80\xdf\x0e\x76\xe7\x05\x1b\x89\x25\x8d\xd1\x7c\x40\x93\x8b\x16\xd4\x6c\xe3\xbe\x55\xfd\xcb\xeb\x3a\xef\xd7\xf8\x7a\xfd\x15\x47\xfc\x30\x35\x37\xd4\x4d\xe0\x49\x42\xf1\x51\xeb\x07\x86\xe6\xa8\x68\x1e\xc1\x0e\xb0\x10\x35\xed\xe1\x7c\xa4\x8e\x71\x67\x8d\x3c\xea\x60\x0f\x9a\x5e\xe7\x96\xef\x46\xa1\xe7\xd1\x05\x66\x10\xc7\xa7\x17\xe7\xdb\x7b\xed\x5e\xc1\x2b\x44\xb3\x24\x41\x2f\xb6\x91\x59\xb5\xb4\x32\x6b\xa3\x08\x93\x05\xe3\x07\x4a\xfe\xda\xc9\x36\xb5\x6f\x85\x5f\x41\x14\xf2\x4a\xec\xf6\xb9\x5e\xd7\x5e\xb0\xe4\x8e\x7d\xcc\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\x08\x76\x42\x3e\x8e\x6f\x8a\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xd5\x23\x50\x17\x61\xb7\x41\xe9\xe0\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x72\xa5\xd7\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x64\x5e\x1b\xd2\x1c\x4d\xf2\x41\x38\x41\xfb\x45\xd9\x1f\x18\x08\x05\xc4\x4b\xb8\xdc\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x5b\xe6\xd4\x58\x64\x09\x86\x19\x64\x0b\xaa\x58\xa9\x83\xa9\x22\x8a\x18\x8b\x59\x8c\x3f\x58\x56\xc2\x66\x33\x16\x69\x7e\xcb\x92\x25\x18\xff\x15\x8a\x24\xfe\xfb\x06\xb3\xf1\xf3\xe5\x82\x6b\x5f\x14\xec\xa3\x76\x4a\x3a\xe1\xa0\x84\x57\x2d\x15\xb9\x5f\xee\x82\x2a\x32\xa3\x3c\x31\x7a\xdd\x07\x41\xae\x59\xb4\xb8\xc8\xd9\x2d\x67\x77\xdf\x0a\x45\x67\xec\x35\xe5\xc9\x6b\x99\xdf\xd1\x3c\x0e\x60\x70\x1f\xcb\x37\xb3\xf2\xbf\xe1\x94\x1c\x5c\x4e\x3d\xe1\x4c\x96\x41\xa7\x66\xeb\x19\x33\xeb\xbd\x73\x0b\xbc\x48\x0c\xc4\xc0\xe1\x4a\x8d\x42\xeb\x31\x8a\xe4\x6c\xc6\x72\x26\xcc\x79\xa2\x6e\xfc\xe0\x25\xcf\x1e\x22\xaa\x69\x22\xe7\x65\x93\x69\xab\xf7\xa2\x63\x8c\xc2\xc7\x1c\xf4\x9c\x1b\x88\x19\x51\x01\xda\x81\xe0\xd9\x0d\x8c\x46\x1f\x04\xf9\xfe\xf4\xf2\xdd\xf9\xbb\xaf\x5f\x00\x57\xd9\x04\xe1\x55\xbc\xe6\x8a\x14\xf0\x54\x60\xf5\x50\x45\xa2\x0d\x8a\x17\xc2\xfb\x8b\xa6\x6c\x41\x6f\xb9\x39\x03\xb9\xb5\x87\xdc\x32\xec\x2c\x6e\xd4\x60\x92\x48\x65\xc6\x49\x98\x52\x64\x29\x0b\x8c\xe3\x89\x19\xcb\xd0\xc5\xad\x34\x15\xd0\xcc\xc4\xfa\x33\xea\x8b\x20\x53\x66\x7e\x75\x16\xb1\x95\xd3\xd5\xe4\x4f\xd8\x42\x39\x9c\xa6\xbb\x46\x91\x25\x1b\x1d\x1e\xe3\x0d\x6f\x99\x5f\x37\x81\xb8\xaa\xf6\xb7\x0f\x98\x42\xc5\x7f\x53\x07\xee\xf0\xc1\xcb\xee\xba\xff\x7a\x3d\x0a\x03\x3f\xbe\x45\x2c\xec\xa0\xf1\x6f\x0e\xaa\xaa\xac\x32\x08\xae\xa9\xc9\xde\x4d\x9c\x33\x08\x12\xea\x93\xd9\x0c\xd1\x5a\x43\xb4\xd6\x10\xad\xd5\xf4\xfb\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x43\xb4\xd6\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x64\x88\xd6\x2a\x9f\x19\xa2\xb5\x86\x68\xad\xc7\x4b\x73\x0a\x14\xd3\xad\x3a\xe6\x9b\xf2\x59\x94\x4e\xb4\x8b\x87\x72\x27\xb3\x2a\x1a\xd6\xb5\x4e\x7b\x8a\x0d\x3f\xb6\xc3\x74\x36\x2c\xb7\x11\xba\x44\x7b\x43\x6e\xd5\x84\x1b\x58\x4e\x56\xbc\xe3\x9e\x03\x55\x16\xf5\x54\x4d\xb5\x55\xe7\xc2\x25\x9b\x75\xf4\x2d\x5c\xb2\x59\x68\x6d\x43\xc0\x54\x5d\x0a\x36\x62\xc5\xfb\x1c\xee\x21\x7c\x60\x7d\x8c\x53\xe3\x12\x8c\xb0\xef\x4c\xa6\x16\x1f\xed\x1a\xd6\xfa\x42\xb7\x1e\x69\xe0\xc7\x17\x54\x2f\x5a\xcd\xe0\xf0\xdc\x82\x0d\x1c\x87\xe0\xca\xcd\x38\x8b\x58\x25\x8c\x0a\xe4\x38\x46\x63\x7b\xd3\x08\x3e\x39\xb3\xbf\x8d\x50\xe2\xb0\xee\xd2\x32\xcc\xca\x08\x4d\x84\x1a\x42\xcc\x63\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\xad\xac\x60\xb4\x19\x65\x1b\x26\xa5\x4c\xe8\x11\x51\x45\xb4\x20\x54\x99\xa9\x19\xfd\xf6\x0a\x4c\x0f\x29\x15\x7c\xc6\x94\x9e\xd8\xd1\x58\xae\x7e\xf8\xe2\xc7\x49\xd5\xe2\xc1\xad\x4f\xd5\x05\x23\x59\x04\x80\xb3\x61\x16\xe3\xdf\x05\xa1\x15\xa6\x94\xc9\xd8\x4e\xfa\x0e\x26\xab\xe9\x0d\x23\xd2\x4e\xb6\x60\xc0\x14\x5e\x90\x03\x83\x26\xc1\xa7\xff\x69\x0e\xd6\xbf\x0f\xc8\xd1\x1d\x58\xf5\x0f\xcc\x9f\x07\xf8\x41\x1f\x3b\x66\xee\x05\x1c\xdf\x7e\x18\xe5\xfb\x9c\xcf\xe7\x20\x6e\x81\xe9\xf6\x96\x09\x7d\x0c\xfc\x6d\x46\x84\x0c\x1e\x16\xd6\x45\x56\x3a\xc6\xea\x13\xf9\xe1\x8b\x1f\x0f\xc8\x51\x75\x5d\x46\x04\x65\x1f\xc9\x17\xde\x19\x96\xc9\xf8\xd8\x69\xad\x4b\xa1\xe9\x47\x50\x0c\x16\x52\x31\x81\xbe\x04\x2d\xd1\x20\xab\xa4\x51\x3e\x59\x92\x8c\x51\xc0\x8c\xc9\x1d\xda\xe0\x1c\x28\xd1\x9f\x9c\xd1\x5c\xd7\x22\xeb\xae\xdf\x9f\xbd\x7f\x81\x5f\x33\xdb\x36\x17\x4e\xcb\x9d\x71\x41\x13\x6b\xd9\xf6\xf2\xa1\x99\x48\x81\x9b\xa4\xa5\x55\x6d\x9d\x51\x77\x56\xe8\x22\x67\x93\x7a\xa4\x55\x6b\x8c\x6f\x0a\x73\x6b\x46\x76\x08\x77\xab\x1f\xb4\x47\x0c\x26\x6b\xbd\x44\xb1\xc6\xd9\xba\xba\xc4\x77\x01\x0e\x6e\x5c\x62\x49\x9a\xcd\x2a\x63\x19\x29\xb3\xc0\x88\x65\x5a\x9d\xc8\x5b\x43\x3a\xd9\xdd\xc9\x9d\xcc\x6f\xb8\x98\x8f\x0d\x92\x8d\x71\xe7\xd5\x09\xb0\x98\x93\xdf\xc0\xff\xf6\x5a\x11\xf0\xa9\xf6\xcb\xc2\x98\xd6\x07\x58\x1b\xb0\xcf\x93\x9d\x97\xe6\xe4\xcb\x2e\x9c\xe0\xf0\xca\x29\x7f\xb5\xb7\xcd\x71\x41\x5f\xb8\x0d\x76\x0d\x28\x5c\x4a\x63\x24\x81\x54\x2c\xef\x1d\x8d\x0d\x00\x41\xc7\x8f\x96\x63\x1b\x8d\x3e\xa6\x22\x1e\x7b\xf9\x3a\x5a\xee\x0c\xb1\x82\xb7\x3c\xc0\xdf\x9e\x9f\x3d\x0c\x72\x17\xbc\xd3\x69\xed\x2b\x97\x80\x54\xe2\xcf\x69\x92\x2d\x68\x5f\xbd\x17\x86\x28\x74\xb8\x86\x28\xf4\x21\x0a\x7d\x88\x42\x2f\xaf\x27\x12\x85\x3e\x44\x91\x0f\x51\xe4\x43\x14\xf9\xfa\x9f\x87\x28\xf2\x21\x8a\x7c\x88\x22\xaf\x5f\x43\x14\xf9\x10\x45\x3e\x44\x91\x0f\x51\xe4\x0d\x57\x1f\x05\xeb\x3e\xc1\xf8\xcb\xc1\x39\xf6\x69\x38\xc7\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x07\x8c\x1f\xdc\x5d\x83\xbb\x6b\x70\x77\x0d\xee\xae\x27\xea\xee\xea\xd4\x65\xfc\x93\xae\x9d\xf5\xf0\x65\xb3\xe0\xd6\x6a\xc5\xac\xb5\xc5\xb2\x6c\x9d\xac\x95\x62\x58\x65\x1d\xac\x97\x98\x4e\x79\xff\x45\xb0\xaa\x06\x40\xd7\xa0\xb9\x43\x53\xf6\xc1\xa1\x37\x38\xf4\x06\x87\xde\xb6\x53\xd2\xc1\xa1\x07\xbe\xbc\xf0\x28\x58\x75\xa4\x4c\xe1\x78\xdf\xec\xda\x58\xff\xe9\xf6\xa6\x15\x6b\x55\x09\x3f\xef\x72\x51\xca\xef\x07\x16\x16\x38\x29\x66\x43\x23\x99\x66\x52\x18\xc4\xe8\xc7\xb9\x58\x8e\xd7\x22\x61\xd5\x3d\x6a\xef\x4f\x59\x18\x4c\x6e\x3d\x5b\x69\x26\x15\xab\xd8\x71\x77\x50\xbc\x37\xbb\xa6\xc6\xe8\xf4\x71\x26\xb4\x1d\x14\xf7\xca\xfb\xad\x64\x91\x37\xe1\x1b\xd6\x35\x09\x9e\xa7\x9f\x0b\x96\x63\x1b\xfd\xd2\x81\x53\x02\xc5\x99\x5c\xd1\x25\x55\x01\xcb\xe1\x86\xcd\x6c\x09\xa6\x36\x4b\x25\x1d\xfc\xb1\x2b\xab\x7e\x50\x9f\x2c\x69\xed\x3f\x69\xe1\x3d\x79\xda\xfe\x59\xd2\xd6\x47\x4b\x5a\xfa\x69\x49\x0b\x5f\x2d\x69\xe7\xaf\x25\xad\x7d\xb6\xa4\x8d\xdf\x96\xdc\xb3\xef\x96\xb4\x77\x6a\x92\xd6\x3e\xdc\x95\x49\x3f\x39\x3f\x6e\xc7\x65\xb7\xf1\xe7\xae\x2c\x7a\xf0\xe9\xd6\x40\xbd\xdd\xaf\x4b\xda\xfa\x76\x49\xfb\xf4\xa4\xad\x3e\x5e\x32\xf8\x79\xbb\xf1\x97\xad\x44\xb7\x9b\xbf\xb7\xd5\x5e\xe6\x6c\xd6\xce\x49\x7f\xc9\x66\xb8\x98\x40\x9c\x28\x1d\x1d\x72\xad\x0c\x51\x4a\x1d\x23\x4b\x45\x5d\xfd\x9c\x8a\xec\xf2\x30\x11\x51\x97\x3c\x5a\x5c\x86\xc6\x2b\x1a\xd8\xb2\x80\x46\xba\xd9\x8e\x08\x13\x39\x8f\x16\x6e\xb2\x46\xc8\xb5\x9e\xb5\xcd\x35\x4f\xc2\x69\x6f\xd9\xd0\x76\xec\x6c\xbb\x37\xa7\x61\xa1\x3b\xf8\x74\xc2\x89\x6f\x25\xde\x9b\x0b\xca\xac\x99\x54\x50\x09\xa4\x96\x81\x6f\xf5\xf0\x4a\x96\xba\xc7\xa0\x07\x0c\x6d\x69\x9e\x6e\x39\xdb\x70\xb2\xd4\x25\xa8\xae\xd6\x6c\x11\xe5\xe4\xad\x43\x76\x43\xae\x7d\xb8\x8c\x16\x62\x57\x7b\xc1\x6b\x6b\x3d\x90\xf0\xc1\xb5\x95\x41\xca\xab\xbd\xf4\xd5\xad\x5a\x48\x79\xad\xf8\xc1\xf7\xa9\x0e\xd2\x17\xa7\x2b\xaf\xb6\x65\x3a\xaa\x60\x40\x27\x7c\xaf\x20\xb8\xa3\x10\x6d\x32\x5d\x89\x41\x78\x94\x45\x6e\xad\x4a\xb2\x66\x75\xa7\xfb\x16\x25\xe9\x7b\xf1\xdb\x0a\x51\xac\x59\xc7\x75\xb7\xea\x12\x7d\xcf\x7a\x5b\xfd\x83\x35\xb3\xbe\xea\xb5\x12\xc2\x8e\x73\xdf\x5c\x94\x60\xcd\xcc\xaf\xeb\xe5\x09\x7a\x9c\xd6\xd6\xb8\x85\x86\xf9\x0c\xd1\x0b\x43\xf4\xc2\x13\x8f\x5e\xe8\x74\x06\x36\x45\x32\x34\xa1\xff\x53\x8d\x67\xe8\xb4\xe8\x4d\xb1\x0d\x4d\x8b\x7e\x22\x11\x0e\x9d\xd7\xb8\x31\xda\x61\xdd\x42\x9f\x48\xcc\x43\xa7\xc5\xb6\x8c\x7f\x68\x5a\xf2\x2f\x39\x0a\xa2\x13\x0c\x37\x44\x44\x34\xc1\xed\x49\xc4\x45\xac\x5d\xe0\xaf\xba\xb1\x58\x58\xfe\xf8\xe1\x02\x24\xae\x82\xaf\xd6\x82\x24\xc2\x9f\x56\x02\x25\x2a\xb3\xc5\x60\x89\x86\xa6\x62\xaa\x98\x86\xff\xae\x47\x55\xa8\xea\xc7\xdb\x74\x18\x0b\xed\x6b\x10\x13\xf0\x52\x26\x45\x1a\xda\x38\xc6\xab\xa2\x7f\x46\xa3\x1b\xa3\xb5\xd8\xef\x4d\xc1\xb3\x16\x20\xe7\xdf\x95\x14\x20\x51\x92\x09\x88\x21\x06\x82\xc1\xcf\xb8\x3f\x17\x38\xc8\x67\x1b\x31\xb8\xf1\xf3\xae\x46\xb5\xf5\xd6\x3b\x0d\xa4\x14\x7e\xb2\x95\xa1\xeb\x33\xc2\x57\x57\xe6\x74\x55\xbf\xdd\x7a\x4a\x0b\x2a\x04\x4b\x0c\x2d\x40\x8f\x3e\x48\x77\x1e\x3e\x9b\xc1\x63\x5f\x5e\x99\xcd\xcb\x95\xfb\x0d\xd3\xa9\xa4\xe8\xef\x1b\x23\x13\xa2\x28\xb9\x61\x2c\x53\x81\xb3\xa4\x00\x9f\x0a\xe4\x82\x4c\x97\x46\xbd\x8b\x6e\xa0\xdc\x28\x48\x65\xb0\xde\x97\xb8\x31\x3d\x27\xd0\x03\xb2\x67\x2c\x0a\x6e\x0d\x21\x38\x43\x08\xce\x10\x82\xb3\xed\x8c\xb5\x08\xc1\x09\x0f\x7c\x25\x0c\x87\x0a\x72\x9a\x65\x09\x18\xa5\x5c\x69\x58\x5b\x73\xd0\x16\xdc\x58\xb1\xc4\xed\x98\x5e\x54\x63\x0e\xee\xf6\x0a\x85\xae\xfe\xe0\x99\x5a\xed\x89\x8d\x11\x36\x48\x4f\x9b\xe4\xbb\x8d\xd2\x61\x24\xc5\x8c\xcf\xb7\xe7\xc5\x04\xb0\x7c\x09\xaf\x94\x1e\x33\x1c\xa2\xb0\x95\x6d\x4b\x4e\x05\xe9\x5b\x15\xbe\x7d\x1f\xc9\x31\x33\x90\xc0\xd6\x86\x07\x54\x56\x71\x3e\x2b\xa7\x37\x82\x68\x9a\x9c\xc7\x96\x3e\x66\x32\x3e\x54\x40\xcd\xe2\x22\xb1\xa5\xa6\xb1\x14\x8b\x39\x9a\x82\x27\x66\x25\x63\xaa\xf1\x3c\x30\x85\xf9\x8e\x9f\x0b\xa9\x3f\xf7\x23\xa1\xe1\x25\xe7\x73\xee\x49\x9f\x6f\x59\x92\xc9\x78\xe2\x8b\x39\x68\x70\x59\x56\x07\x9c\x90\x6f\x95\x75\x30\x3b\xe2\x70\xf4\xcf\x7f\x1f\x1b\xc2\xca\x72\x2c\xd4\x69\x07\xae\xbc\xb7\x25\x0a\xa4\xa7\xd8\x1e\x21\x63\x76\xba\x05\xd4\x2b\xe0\x3e\xf3\xf1\x5b\xe6\x75\xbf\x55\x21\x90\xf3\x22\x09\xd2\xc4\x0c\x8c\xf6\x77\xab\xb6\x75\x6c\x64\x68\xe5\x63\xf1\x19\xb8\xed\xaf\xfc\xac\xce\x31\x53\x12\x6f\xbf\xfa\xc8\xa2\x42\x6f\x55\x39\x1b\x8c\xc8\x76\x99\x60\x90\x4a\x12\xfb\x39\x10\x9d\xec\x0f\x66\xbd\xc0\x38\x0d\x78\x6c\x68\x9b\xa2\x9a\xab\xd9\x12\xf3\x6e\x1d\xc0\x58\x10\x1b\x55\x9e\x2f\x23\xa8\x04\x75\x88\xa7\x85\xc6\xd2\xa6\x4b\x12\x2d\xa4\xc1\x2f\x8a\x70\x87\x71\x6f\xb9\xc4\x00\x22\xb0\x07\xe7\x24\x35\x1c\xc0\x6a\x77\xc1\xf0\xe8\xf1\x2e\x5f\x33\xaa\xb0\x54\xba\x84\x95\x0b\xaa\x31\xc3\x80\x9d\xcd\xfc\x31\x37\xea\x0a\x78\xfc\x8a\xd4\x0c\x7a\xc7\xf8\x7c\xa1\xd5\x88\xf0\x09\x9b\xc0\xee\x32\x1a\x2d\x82\x61\x53\xc6\xb4\x22\x34\x49\x7c\x63\x92\x00\x25\x42\x77\xfb\x91\x67\x9a\x96\xc1\x8d\x3c\xbd\xad\xef\x5a\x23\xb8\x46\x84\xe9\x68\x72\x3c\x02\x0f\x9e\x39\x2d\x14\xe6\x38\x5d\x12\xae\xa1\x16\x37\x30\xe8\x5c\x16\x73\x5c\x89\x0d\x34\x50\x5e\x3a\xb2\xf6\x59\x11\x83\x36\x21\xe6\xe4\x00\x17\x77\xe0\x04\x1e\x33\x9c\x35\xb9\xc2\xfa\x5c\x69\x59\xb4\x78\xe6\x39\x53\x99\xc4\x1e\x2c\xf5\xc8\x85\xff\xcf\xbf\x74\xa4\x8e\x4b\x60\x2e\xf8\x7c\xe1\x60\x49\x73\xa4\x29\xd5\x3d\x68\xe7\x7c\x6c\x13\x46\xd2\x32\x88\xa4\xea\xe7\x71\xe5\xe2\x4b\x9c\x08\x76\x4f\xb3\x3c\xf5\x30\x80\x0d\x46\x5d\xdf\x1a\x65\x53\x9b\xc3\x8c\x40\x24\xcf\xc8\x11\xa0\x08\xd7\x87\x0a\xd0\x75\x2c\xb3\xe3\x09\x39\x05\x6d\xb7\xc5\x07\x84\xf4\xe3\xdb\x81\xcc\x47\x95\x2c\xc7\x6a\xe7\xb3\x68\xe7\xa9\xed\xe2\xab\x35\xdc\x3c\xf3\x26\xa5\x56\x8f\x23\x4c\xb6\x3e\xda\xc5\x6f\x4b\x82\x39\xb4\x79\x7a\xc5\xa5\x07\x28\x5d\x86\x2d\xb2\x3c\x1d\x11\xaa\x94\x8c\x78\xd9\x38\x69\x15\xd3\x71\x25\x6d\xfc\x38\x1d\xe1\x4f\x3a\xaf\x9f\x74\x0c\x4c\xad\x5e\xf5\xf8\x4e\x1b\x92\x5a\x85\x4a\x85\x60\x4d\x97\xf0\x2b\x38\x0a\xa7\x2c\xd9\x12\x9d\x19\x5e\x5d\x82\xbf\xdc\xd5\x3a\x08\x6c\xcd\x82\xd6\x2e\xe4\xd1\xe2\x55\x9b\x60\xd2\x01\x39\xf0\xea\x72\x4c\xcb\xab\x4d\x64\x6b\xfd\x8d\x56\x71\xae\xd5\xab\x3b\xfe\xe2\xd5\x2a\x06\xb6\x7a\xad\x88\x24\x7d\x85\xc2\x56\xaf\x8e\x21\x09\xe5\xd5\x3e\x4c\x76\xc3\xba\x2e\xef\x2b\x56\x76\x54\x0d\x94\x25\x5f\x6b\xc4\xf5\x37\x2d\x29\x5b\x0f\x00\x6a\x1b\x50\xbb\x01\x3c\xa7\x9f\x4c\x50\x6d\xc3\x50\x5f\x6b\x33\xcc\x9b\xb5\x2f\x83\xc3\x96\xba\xe0\x52\x2b\xbc\x8d\x6a\x05\x69\xc0\x16\x95\xe5\xcc\x30\x2c\xec\xfd\x65\x3b\xa1\xdc\x5b\x1c\x6f\xd3\xee\x77\x23\xec\x78\x75\x26\xef\xe1\x07\x3b\xa1\x1b\xb0\xc8\xd7\xd0\x38\xeb\x61\xb8\x23\x36\xe9\x1a\xb8\xe3\xc0\x1d\xab\xd7\xc0\x1d\xfd\x35\x70\xc7\x2d\xd7\xc0\x1d\x07\xee\x78\xef\xdc\x11\x75\xd9\x1d\x94\xe7\xef\xd1\xc4\x51\xd7\x96\x81\xd3\x3a\xbf\x50\x55\x6d\x36\xfc\xc6\x25\x50\x5c\x83\xaa\x6d\x6d\xc7\x39\xc4\x86\x3d\x1f\x3f\x7f\xf6\xac\x8b\x52\xbd\xad\xe1\x5b\x78\x05\xcd\xdf\x7e\xff\xc5\xc6\x37\xd6\xd9\xdf\x7a\xb0\x9a\x5a\x1c\xf7\x86\xbc\x8a\xec\xb0\xc6\xf0\x09\xd4\x49\x48\x4d\x52\xa6\x09\xd5\x15\x53\x11\x4f\xd9\xc8\x19\x96\xcb\x16\xdb\xd3\xd2\x34\x1b\x13\x29\x5c\xa4\xa2\x8c\xd9\x64\xb7\x19\x44\x8c\x2a\xc8\x37\x99\x32\x3f\x0b\x99\x9a\xaf\x72\xa1\xdd\x71\x31\x53\x60\x0e\x2a\xe4\x88\x4d\xe6\x13\x12\x17\xcc\x26\x38\xa1\x9f\xce\xb6\xb3\x52\x4b\xa5\x59\x0a\x96\x5c\x99\xfb\xa6\x6f\x3a\x87\x18\x45\x08\x94\x2c\x68\x92\x2c\x09\xbb\xe5\x36\xdb\xd7\x0c\x0e\x6e\x42\xa8\x09\x6f\x56\xd2\xca\x44\xd8\x7b\x7e\x42\x1d\x83\xb7\xa5\x2a\x74\xe1\xf6\x2b\x63\x77\x8e\x34\xbe\xb4\x2b\x99\xac\x15\x56\xb5\x19\x17\x6d\xe0\xf0\x4f\x40\xae\xf7\x97\xdb\x4d\xae\xa4\x33\x25\xeb\x40\xbd\xea\x62\x69\x91\x24\x06\x31\xd0\x0a\xbb\xba\x80\x06\xeb\x68\x43\x22\x1b\x1a\xde\xd3\x20\xa1\x0d\x9b\x98\xcb\x4c\x26\x72\xbe\x0c\x21\x8d\x1d\xe4\x78\x9a\x39\xe3\x38\x7a\xf5\x98\x6f\xd0\xfc\xae\xb6\x35\x83\xe5\x6f\xb0\xfc\x0d\xba\xcd\xca\x35\xe8\x36\xfe\x1a\x74\x9b\x2d\xd7\xa0\xdb\x0c\xba\xcd\x60\xf9\x23\x03\x77\xdc\x00\x93\x81\x3b\x92\x81\x3b\xae\x5d\xd7\xc0\x1d\x37\x82\x67\xe0\x8e\x03\x77\x6c\xba\x32\x19\xef\x11\xe8\x98\xc9\x78\x43\x9c\x23\x5a\x7d\x22\x39\x4e\x64\x84\x6d\x27\x30\x31\xd5\xd9\xf9\x14\x4d\xd1\x10\x35\x22\xff\x90\x82\x61\xf0\x9a\xd9\x1b\x30\x27\x41\x1d\x04\xf3\xf8\x91\x3a\xde\x18\xd8\x34\xc4\x49\x0e\x71\x92\x4f\x3e\x4e\x72\x41\x15\xee\x2b\x12\xa5\xf5\x61\x93\xc1\x81\xbc\x66\x79\xfa\x89\x46\x4d\x1a\x74\xb1\xdb\x0d\x29\x36\xe5\x96\xe2\xca\x63\xeb\x2f\x60\xf1\x45\x75\xbd\x56\x5e\xc6\x5a\x4d\x71\xcc\x62\x92\xb1\x7c\x8c\x28\x22\xc9\x8c\xdb\x62\x56\x35\xec\xb3\xf0\x79\xd4\xe8\xc7\xea\x3a\x1e\x31\x04\xb2\x3a\x91\x1d\x6c\xae\xa1\xe1\xb8\x42\xe1\x9f\x44\x40\x64\x57\xa9\x7e\x4c\xb4\x35\xf2\x7e\xd3\x52\xae\xef\x2e\x9a\xb7\x2a\x7d\xba\x7a\x35\xd6\xd3\xdc\x58\xfb\x74\xe4\x0b\x3c\x44\x54\x21\xa7\xe8\xaa\x5a\x76\x54\xa3\x76\xd3\x53\x76\xb7\x44\x93\x47\x2f\x97\xba\x7a\xed\x2a\xba\xed\x24\xb8\x3d\xfd\x22\xab\xeb\x00\xd4\x59\x41\x27\x3b\x2b\xe9\x64\x27\x45\x9d\xec\xaa\xac\x93\x3d\x14\x76\xb2\x9b\xd2\x4e\x1e\xa0\xc4\xeb\xea\xb5\xb3\x8a\x4a\xf6\xd0\xe3\xc9\x27\x51\x18\x76\xf5\xda\x0b\x58\xbb\xe9\xf4\x64\x28\x27\xdb\xe1\xda\x5d\xe5\x26\xbb\xab\xdd\x64\x77\xcc\x68\x59\x96\x76\xf5\x1a\x0a\xd5\xee\xc5\xd9\x77\x60\x5c\xdd\x8b\xd9\xae\xfb\x78\x27\x2c\xf1\x75\x86\xfa\x17\x36\x75\xd9\xd9\x30\xec\xb5\xe9\x18\x0c\x84\x5a\x04\xcc\xc5\x47\x8d\x00\x8e\xc1\xfd\xd8\x29\xbf\x85\x08\x2a\xb7\x06\x83\xf9\x0a\xba\xb5\x90\x26\xbb\xf1\x52\x30\x05\x82\x1d\xf3\x26\xa2\xb0\xb9\xa2\x79\x76\x82\xe1\x20\x25\xb7\x13\x71\x3d\x40\xa4\x7c\x03\x64\xc4\x94\x51\xa1\xc8\x81\xb3\x3d\x1d\xaa\xf2\x89\x83\x49\x99\xdd\xe7\x47\x84\x24\xe4\x30\xa3\x6f\x73\x53\xf7\x4d\x3b\x3b\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xdd\x78\x0d\x92\x76\x87\x6b\x90\xb4\x07\x49\x7b\xd3\x87\x07\x49\x7b\x90\xb4\xb7\x7f\x7c\x37\x49\x7b\xd7\x38\xa1\x50\xee\xb5\xce\x39\xac\x9c\x05\xad\xf9\x7d\x0c\x91\x2f\x50\x0a\xff\xea\x57\xde\x0e\x65\xe9\x66\x69\x3b\x94\xc8\x57\x74\x8b\xc9\x16\xd1\xda\x0b\xdf\x2b\x6f\x6e\x96\xba\x9f\x56\x2c\xd4\x0e\xb8\x11\x38\x14\x76\x44\x8e\x6b\xe7\x0a\xb7\x95\xe6\xa6\xac\xf4\x93\xc7\xe4\xc8\x79\x5c\xa0\x42\xb4\x90\xba\xfa\xa3\xd0\x7c\x5c\x3e\xe1\x7d\x30\xe0\x5e\xac\xe4\xdb\x24\xd5\xfe\x6a\xa2\x56\x5b\xb1\xdc\x4f\x43\x42\x58\x5e\x99\x03\x77\x8d\xf4\x20\x5a\x22\x2f\x84\x30\xa3\x42\x95\x6c\xf0\xc6\x21\xcd\xc1\x02\x70\xbe\xb3\xbf\x11\x96\x60\x3e\x20\x31\x95\x50\x0a\xfc\x9d\xd4\x96\x91\xb6\xa1\xfc\x52\x58\x8f\xa8\xb9\xe3\xbc\xbe\x0e\x29\x61\x45\xdc\x7f\x7d\x42\x5e\x01\x1e\x86\x03\xdb\x92\xd3\x34\x49\xe4\x5d\x17\x92\xf4\x50\x69\x51\x77\x9d\xd3\xa2\x6a\xfe\xbb\x21\x2b\xea\x57\x92\x15\x05\x3f\xe2\x11\xea\x3d\x3d\x8a\x7c\xbf\x60\x80\x45\x39\x03\x50\xa5\x45\xa2\x79\x56\xc6\x4a\x29\xfc\x54\x82\x52\xe6\xcc\x46\x9e\x54\xf1\xd2\x7c\x8d\x46\x8b\x3a\x7e\xc2\x78\x10\x5b\xa5\xe0\xd0\xda\xe8\x0e\x9a\x24\x36\xa7\xc8\x89\xa4\x18\xc2\xc2\x1f\x3b\x32\xe1\xcc\x55\x45\x74\xda\x0c\x10\x99\x23\x43\x0b\x93\xa5\xad\x54\xb7\x81\x88\xa2\x52\x74\xcb\x1c\xeb\x9d\xf3\x5b\x26\x4a\x4a\x7a\xa4\x8e\x8f\x1d\x0f\xef\x95\xc2\xdf\x0b\x85\xfe\x73\x40\x49\xff\xd2\x86\x46\xc3\x82\x3c\x95\x2e\xc1\x57\xd2\xe8\xc7\x0c\xc1\xe8\xe2\xe7\xef\x66\x63\xd8\xc1\xbf\xff\x80\xbe\xfd\x4f\x27\xb3\xec\x91\x2d\x8c\x8f\x11\x5b\xff\xe4\xad\x8a\x43\x70\x7d\x79\xed\x1b\x5c\x7f\xef\x96\xc3\xc7\x8d\xb1\xff\x04\xac\x85\x8f\x19\x63\x3f\x58\x08\x37\x6e\xca\x53\x0b\x7d\xaf\x5e\x3b\x59\x04\x07\x6b\xe0\xce\x5c\xb8\x23\xc3\xd9\xd7\x0a\xd8\x11\x23\x76\xf4\xb3\x0f\x3e\xf6\x87\xf1\xb1\x0f\x12\x6f\xcb\x6b\x90\x78\xd7\x02\x65\x90\x78\xc9\x20\xf1\x6e\x5b\xde\x20\xf1\x6e\x04\xcf\x20\xf1\x6e\xdc\x94\x41\xe2\x1d\x24\x5e\xf2\xa9\x49\xbc\xbb\x54\xe9\x1a\x7c\xdd\x7b\xf9\xba\xbb\x52\x8b\x4e\x34\xa2\x23\x1e\x74\xf6\x6d\x0f\x7e\xed\xa7\xe2\xd7\x6e\x9d\xf0\x2f\x34\xdf\x37\xe9\x3f\xdc\xab\x75\x99\xff\xf4\x56\xf2\x98\x64\x85\xb6\xf9\xd4\x43\xf6\x7f\x1f\xd9\xff\x15\xc8\x0f\x25\x00\x5a\x95\x00\x58\x07\xb3\xa1\x0e\xc0\x50\x07\xa0\x67\x27\xf4\x50\x07\x60\xa8\x03\x30\xd4\x01\x70\xd7\x90\x9d\x44\x86\xec\xa4\x56\xd7\x90\x9d\xb4\xfe\x1a\xb2\x93\x9e\xac\xf5\x95\x0c\xd9\x49\x4f\xdb\x12\x4b\x86\xec\xa4\xc1\x3a\xdb\x72\xa3\x3e\xc1\xec\xa4\xa1\x0e\xc0\x53\x8d\x51\x20\x83\xa4\x3d\x48\xda\x83\xa4\x3d\x48\xda\x9b\xaf\x41\xd2\xee\x70\x0d\x92\xf6\x20\x69\x6f\xfa\xf0\x20\x69\x0f\x92\xf6\xf6\x8f\x0f\x75\x00\x3e\xa1\xd8\x08\x32\xd4\x01\x18\xe2\x25\x86\x3a\x00\xbf\xde\x3a\x00\x15\xdf\xfd\xe3\x15\x03\xe8\x3e\x8d\xa1\x22\xc0\x50\x11\x60\xa8\x08\x30\x54\x04\x70\xd7\x50\x11\x00\xaf\xa7\x64\x6b\x1c\xf2\xa3\xd6\x02\x65\xc8\x8f\x22\x43\x7e\xd4\xb6\xe5\x7d\x02\x76\xc3\x21\x3f\xea\x09\xda\x0a\x87\xfc\xa8\xc1\x2e\x58\xdf\x9c\x4f\x24\x3f\x6a\xa8\x08\xf0\x14\xbd\xed\x83\xc4\xdb\xf2\x1a\x24\xde\xb5\x40\x19\x24\x5e\x32\x48\xbc\xdb\x96\x37\x48\xbc\x1b\xc1\x33\x48\xbc\x1b\x37\x65\x90\x78\x07\x89\x97\x7c\x6a\x12\xef\x50\x11\x60\xa8\x08\x30\x54\x04\xf8\x14\x3d\xdc\x5b\x77\x9a\x89\xdb\x75\x7b\x5a\xd9\xc5\x57\xe2\xb6\xaa\xa7\x30\x71\xcb\x73\x29\x80\x02\xdf\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\xae\x9d\xff\x76\xc4\xdf\x82\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xed\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xed\x03\xed\xa4\x78\x33\xc4\xe6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xdf\xce\xcf\x5e\xbd\xbb\x3e\x7f\x7d\xfe\xea\x72\x33\xd2\xb5\x24\x2b\x70\x90\x3a\x4c\xf6\xf0\x3b\xb7\x47\x90\xe6\xcd\x84\xa1\xc0\xbf\x3d\xfa\xee\xf4\xf2\x6f\xef\x4e\xdf\xbe\x3a\x06\xf6\xcb\x3e\x66\x54\xc4\x2c\x26\x85\x72\x24\x21\xcb\xd9\x2d\x97\x85\x4a\x96\xfe\x78\x37\x23\x6d\x1d\x5b\xad\xa2\xb9\x24\x8a\xe5\xb7\x3c\x6a\x06\x11\x4a\xb1\xb4\x44\xa0\xc8\x63\x78\xce\x94\x4c\x6e\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x26\x0b\x33\xde\x6f\x7f\x0b\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x3b\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x29\x34\xfd\xf8\x02\x7d\xf0\x07\xbf\x0d\x7e\x3a\x70\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x10\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x5b\x96\x83\x3c\x6d\x77\x61\x44\x72\x36\xa7\x79\x9c\x30\x05\xc1\x03\x77\x0b\x06\xe5\x3c\x50\xc2\xb2\x00\x63\x5e\x5a\x17\x52\x4f\xc8\x19\x9b\xd1\x22\xd1\x40\x43\x0e\x0e\x26\x87\xbd\xa1\xda\xeb\x5c\x6e\x49\x7e\xaf\xa0\xdb\x15\x16\x95\x98\xc9\x7c\xed\xf1\x38\xb4\xa6\x89\x0a\x59\x53\x86\x93\x58\x4d\xcf\xd1\x6a\xd4\x2f\x5a\xac\xa4\x85\x20\xd8\x5e\x9d\x8f\xa4\x98\xf1\xf9\x5b\x9a\x7d\xc3\x96\x97\x6c\xd6\x31\x1a\x02\x99\xa8\xd5\x69\x81\x81\x19\x72\x88\x03\x6e\x67\x3a\xf7\xe8\xcb\x6f\x63\x34\xe9\x66\xf3\x68\x6d\xe9\x58\x29\x69\x81\x4c\xdf\xb2\xef\x1e\x8b\xf3\x94\xd7\x76\x8a\xde\x38\xb9\xc3\x90\xb4\xdb\x73\xaa\x27\xe4\xad\x84\x90\x9c\x99\x7c\x41\x16\x5a\x67\xea\xc5\xc9\xc9\x4d\x31\x65\xb9\x60\x9a\xa9\x09\x97\x27\xb1\x8c\xd4\x49\x24\x45\xc4\x32\xad\x4e\xe4\xad\xa1\x7c\xec\xee\xe4\x4e\xe6\x37\x5c\xcc\xc7\x46\xd2\x19\xe3\xae\xaa\x13\x10\xa6\x4e\x7e\x83\x12\xfb\xf5\xfb\xb3\xf7\x2f\xc8\x69\x1c\xdb\x8a\x3d\x85\x62\xb3\x22\xb1\xd5\x3b\x26\x84\x66\xfc\x3b\x96\x1b\xa5\x6c\x44\x6e\xb8\x88\x47\xa4\xe0\xf1\x5f\x37\x1f\xee\x1d\x21\x26\x33\xd4\x8d\x76\x80\xda\x15\x08\x8a\xcb\x0a\x9d\xf2\x48\x6f\x28\x14\xd7\x0a\xf6\xdc\x19\x0e\x2c\x43\xe9\xb0\x8c\xa9\x94\x09\xa3\x62\xcb\x1b\x00\xb6\xee\x67\xf6\xb0\x3c\xb4\xa8\xe5\x58\x04\xc8\x64\xfc\x82\xa8\x22\xcb\x64\xae\x15\x49\x99\xa6\x31\xd5\x74\x62\x76\x6e\x54\xfd\x13\x84\xe3\x11\xf9\xc9\xdf\x04\x09\x57\xfd\x70\x78\xf8\xe7\x6f\x5e\xfd\xdf\xbf\x1c\x1e\xfe\xf8\x53\xf8\x2b\x90\x3d\x34\x75\x55\x1f\x31\x22\xf7\xc4\x88\xbb\xef\xe0\x1b\xf0\xa7\x65\xa3\xa7\x51\x24\x0b\xa1\xed\x0f\x9a\xea\x42\x4d\x16\x52\xe9\xf3\x0b\xff\x67\x26\xe3\xfa\x5f\x6a\x0b\x27\x20\xf7\x4b\x74\x00\x9c\x17\x54\x2f\x7a\x26\x3d\xe5\xb9\xd8\x01\x5d\xed\x9b\x61\x85\xa4\x94\xc2\x3f\x5f\xbb\xe9\x1a\x0e\x74\x97\x73\xad\x99\x00\xb9\x03\xe2\xee\xe4\x6c\x64\x30\xb7\x64\xb3\xb7\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x0e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xaa\xd7\x9d\x5e\x9c\x93\x5b\x84\x46\xef\x0b\x71\x51\x58\xaf\xf7\x3e\x93\xbe\x52\x95\x5d\x96\x97\x34\x5f\xa0\x65\xc9\xc7\x7b\x91\x84\xa7\xdc\x1a\x80\x6d\x55\x2b\x45\x8e\xf0\xe6\x24\xca\x8a\x91\x7d\x60\x92\xb2\x54\xe6\x4b\xff\x27\xcb\x16\x2c\x35\x12\xdb\x58\x69\x99\xd3\x39\x1b\xf9\xd7\xf1\x35\xff\x17\xbe\x58\xf9\xc0\xea\xdb\x28\x52\x47\x45\x6e\x98\x47\xb2\x74\x14\x84\xc5\x8f\x7b\x16\x1d\x98\x7a\x3e\x8a\x7e\x37\xde\xed\xc8\x72\xbd\xb6\x88\x4c\xdb\xaf\x0a\x64\xc8\x5b\x99\x14\x29\x53\x23\xcf\x9e\x50\x5a\x17\xb7\x46\x9a\x54\xf7\xc2\x08\x63\x7e\xcb\xd5\x4e\xfe\xe9\x2b\x6f\xa9\x03\x13\x59\xa1\x8d\xa6\x82\xc1\xe0\x41\x45\x38\xa9\x40\x07\xf0\x31\x8a\x15\x92\xf2\xfc\xa0\x9d\xf7\x95\x6a\xcd\x72\xf1\x82\xfc\xef\xd1\x87\xdf\xfd\x6b\x7c\xfc\xd7\xa3\xa3\x1f\x9e\x8d\xff\xf3\xc7\xdf\x1d\x7d\x98\xc0\x3f\x3e\x3f\xfe\xeb\xf1\xbf\xdc\x1f\xbf\x3b\x3e\x3e\x3a\xfa\xe1\x9b\xb7\x5f\x5f\x5f\xbc\xfa\x91\x1f\xff\xeb\x07\x51\xa4\x37\xf8\xd7\xbf\x8e\x7e\x60\xaf\x7e\x6c\x39\xc8\xf1\xf1\x5f\x7f\xdb\x6a\x7a\x54\x2c\xdf\xb7\x38\xf0\x78\x8d\x77\x88\xb0\x2f\xdf\xea\x60\xa0\xff\x38\x2e\x85\xb6\x31\x17\x7a\x2c\xf3\x31\xbe\xfe\x82\xe8\xbc\xd8\x7e\x30\x4a\xa2\xb6\x0b\x9e\xbb\x72\x60\x2f\x4a\x82\xe6\x49\x73\xef\x88\xac\x58\x94\x33\xdd\x97\x06\x83\xa3\x39\xfe\x51\x33\xc9\x0e\x4a\x4d\xa9\xd4\x78\xbb\x24\xc0\xab\xe4\xbc\xb3\x5c\xa6\x13\x12\x98\x85\x6e\xc1\x93\x69\x9f\xbb\x61\x5b\xb4\x5c\x77\x0d\x4a\xd0\xa7\xa5\x04\x5d\xe1\xfe\xde\xbb\x06\xc4\xc4\xed\x26\x33\x4d\xdd\xa6\xfb\x1a\x52\x59\x42\x73\xb4\x13\xa0\xb4\x24\x99\xcc\x8a\x84\xea\x35\x66\xbb\x06\xdb\xb4\xc5\xfd\xd2\x0b\x60\x36\x1a\xec\xc0\x96\xca\xa5\xcd\xc6\x50\x72\x9a\x24\x84\x0b\x3c\x09\x30\x80\xb3\xe6\xe5\x0c\xe5\x25\x42\xd1\xe0\x7c\x6b\xa6\x70\x67\x13\x6e\x02\x43\x23\x57\x46\xd7\xc9\x35\x58\xfc\x21\x21\x07\x69\x96\x35\x8d\x71\x51\xa6\xe5\x78\x6e\xeb\xbd\x94\x8d\xf5\x17\x13\xaa\xb4\x9b\x36\xcc\x46\xd3\x1b\x30\x85\x46\x2c\x66\x22\x62\x10\x82\x50\xb0\x72\xad\x53\x23\x0c\x82\x79\x1f\xc6\xa0\x24\x2e\xb2\x84\x47\x06\x7e\x66\x26\xcd\x63\x9c\xa7\x69\xa1\xc1\x50\xfc\x50\x56\x7c\xb3\xe3\x57\xae\xdc\xab\x37\xe6\x03\xa9\xf2\xa2\xb5\x8f\xb6\xf0\xaa\xbb\xda\xcf\x7c\xdf\x8e\xf0\x7a\x73\xdb\x56\x4e\xb5\x42\x71\x4b\x1b\x43\x95\xd2\x3e\xb4\xc5\xb0\x1d\x9d\xfd\x45\xd2\xd8\x0e\xf4\xb5\x3d\x6d\xed\x60\x5c\xea\x4a\x4f\xdb\x5a\x93\xb2\x9c\xcd\xf8\xc7\x0e\xf8\x78\x2a\x4a\x15\x85\xc7\x4c\x68\xa3\x08\x40\x65\xea\x2c\x67\x19\x13\xb1\x4f\xf7\x83\x00\x2f\x51\x5d\xc7\xbd\x7a\x8c\x50\xca\xe8\x7e\xbc\xae\x9a\xa4\x98\xe1\x6c\xfd\xc2\xcf\x96\xdd\xf5\xfe\x0f\x96\x90\xf1\xd6\xe0\xef\xda\x3e\x06\x6f\xd4\x22\x5d\x6d\xf9\x6f\x3b\x49\xa3\xbd\x79\x97\x53\x26\x63\xac\x71\xad\xcb\x20\x84\x09\xb9\x6a\x78\x13\x62\x0d\xec\x13\x87\x87\x0a\xc3\x12\x54\x7d\xa0\x5a\x76\x33\x46\x26\xe0\xa0\x1d\x51\x0a\x59\x5d\x91\x83\xe5\xf7\x84\x2a\xc5\xe7\x62\x9c\xc9\x18\xea\x72\x9f\xac\x43\x88\x16\x87\xaa\x5b\x64\xd3\x56\xbc\xf2\xc6\x89\x76\xdb\x74\xe9\xed\x6f\x81\x6c\xe1\x2a\xc2\xe7\xc1\x8f\xd6\xae\xe3\xe2\xe8\x03\x19\xb2\x94\x88\xf6\x83\x69\x4a\x05\x9d\xb3\xb1\xfd\xf8\xd8\x7f\x7c\xec\xbf\xb5\x0f\x98\xdb\x50\x2d\x34\x29\xb6\x6e\x0b\x71\xf8\x06\x4d\x96\xb1\x6f\x0f\x81\xf1\x7b\x1f\x79\x5a\xa4\x84\xa6\xb2\xc0\x10\xbd\x55\x70\xba\x40\x96\x5e\x00\xd6\x00\x28\xb5\x16\x52\x2d\xa1\x45\x76\x0a\xb9\x7b\xa2\x96\xad\x56\x16\xad\x6e\x96\xac\x0e\x16\xac\x9d\x2d\x57\xce\x48\xdd\x1e\x1f\x2f\x9d\xdd\xbc\x86\x91\x5c\x6c\xc5\xc8\xdc\xd7\xbb\x3f\x9f\x11\x3f\x0e\x57\x44\xa6\x5c\x6b\x6b\xd0\xa5\xe5\xb1\x1f\x11\xae\x2b\xd6\x4f\x7b\x16\xa0\xdf\x03\xb6\xc8\x60\x1f\x8d\x36\xc5\xc1\x8a\xee\xbc\x16\x23\xe4\xb2\x77\x1c\xab\x43\x50\x41\x78\x9a\x61\x30\x2b\xe0\xf4\xd8\xe9\x66\x36\xc8\x60\x38\x1f\xc3\xf9\x68\x7a\x49\x75\x91\x45\x42\x31\xa4\x8c\x60\xf4\xe2\x88\xc1\x6c\xd7\x78\x06\x22\x34\x11\x87\xcc\x59\x80\x20\x7a\x2e\xe6\xe4\x92\x81\x65\xe0\x8a\x69\x65\x63\x22\xe1\x0d\x9a\xb3\xd5\x14\x33\x67\x09\xf1\xa1\xb6\x74\x36\xab\x3e\x11\xb3\x2c\x91\xcb\x14\x24\xdb\x73\x1d\xca\x33\x5e\x74\x61\x69\x96\x50\xcd\xbc\x60\xb3\xd9\xda\xb0\x37\xe7\xeb\x92\xdf\xf5\xb8\x19\x5d\xed\xa2\x83\x5b\xc4\x04\x3f\xfd\x3c\xad\xd6\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\xcb\x7c\xab\xf6\x4a\x60\x2b\xa3\xfc\x7d\x67\x51\x75\x52\xc7\xda\x66\x4a\x3d\xfd\xdc\xa8\x0e\xcb\x6e\x9b\xff\x34\x64\x3c\x6d\x02\x75\xbb\xac\x85\xd6\x19\x0b\xad\xf6\xaf\x65\xe6\xd2\x90\xab\xd4\x81\xbf\xdc\x83\xf0\xb7\x75\x2f\xb5\x4c\x18\x4a\xae\xed\x74\xf7\xeb\xf2\x79\xdf\xff\x0c\xdd\xbb\xc1\x48\x0f\xe3\xa5\xb8\x76\x62\x8b\x39\x5b\xe5\xbc\x00\xb5\xb4\xa6\xd0\xec\x4c\x4b\x37\x2f\xb3\x71\x62\x49\xcc\x9e\x69\xdb\xf9\x2e\x68\x05\xa7\x73\x70\xfa\xfc\xd9\x63\xdb\x88\x81\xfc\xf4\x97\x20\xbe\xdd\xe7\xbf\x78\x0c\xf9\xb3\xfb\xd7\x5f\xf6\xcc\x5b\x68\xc7\xd8\x70\x4a\x1d\x04\x8c\x57\xf0\x02\xe1\x22\x06\x07\x93\x5d\x2a\x40\x00\xc7\x32\xf0\x81\x65\xb9\xfc\x17\x4c\xa4\xb2\x66\x2e\xf0\x44\x95\x0f\x2b\xeb\x32\x0b\xf4\x2a\x6b\x52\x28\x4f\x06\x23\xef\xa4\x2d\x4a\xc8\x46\xe4\x02\x6c\xa9\xe5\x1d\x38\x49\xef\x24\x96\x27\x5c\xeb\xcb\x0a\xe1\xb6\x95\x8b\x6c\x65\xf4\x15\x80\x7c\x53\x32\x79\x5c\x59\x85\xc9\x97\x18\x5c\xc9\x84\xdb\x04\x99\x1b\xb6\x2c\x99\x8d\x15\x21\x80\xe4\x8f\x4a\x2c\x71\xac\x00\x79\xc7\xff\xe7\x4c\x59\xe9\x94\x0b\xfc\x18\x0e\xed\xb6\x02\x46\x77\x00\x35\x92\x5d\x92\xe0\x67\xfa\x00\x57\x3b\x39\xa3\x02\xb3\xf7\x1d\x64\x0c\x4f\x25\x9b\xa5\x8b\x40\xa4\x78\xf5\x73\x41\x93\x6a\x12\x82\xbd\x65\x1f\x5a\xa1\xea\x77\x3c\x89\x23\x9a\xdb\x28\x2f\x38\xa3\x44\x49\xdc\x3d\xac\x8a\x17\x51\xe1\x4f\x7b\xb9\x47\xd8\x07\x91\x64\x34\xd7\x3c\x2a\x12\x9a\x13\x73\x16\xe6\x32\x6f\x95\x28\xb0\x15\xa2\x25\xd2\x5c\xb1\x48\x8a\xb8\x8b\x02\x70\x5d\x7f\xb7\xee\x6b\xcd\x58\xce\x6d\xb9\x3f\x9e\xb2\x3a\x92\x1e\x55\x6d\xda\x72\xe6\x4e\xb5\x3f\x62\x15\xcb\x47\x99\x93\xc9\x15\xe1\x58\x2f\xf4\x38\x20\x8f\xfe\x54\x4c\xc8\x57\x4b\x67\x66\x01\x93\x8b\xcd\xae\x50\x4c\xbb\x44\x18\x87\xb2\x16\xd8\xe5\x81\x9a\xc9\x1c\x92\x53\x8e\x62\x89\x19\x19\xb7\x3c\xd2\xc7\x13\xf2\xff\x58\x2e\x31\x83\x93\xcd\xb1\x7a\xa3\x45\x71\xaf\xb8\x42\xe3\x52\xf0\xe0\x3f\x23\x47\x58\x49\x93\xa7\x29\x8b\x39\xd5\x2c\x59\x1e\xa3\x1e\xeb\x6a\x71\xb6\xd9\xba\x36\x46\x83\xa0\xf0\xea\x97\x7f\xd8\xf0\x64\xd7\x1c\xaa\xef\x5c\x56\x4a\x09\x19\x8c\x21\xa8\x6d\xa1\xe7\x41\x72\x83\xb8\x19\xc6\x20\x94\x49\x9d\x8e\xcc\xf8\x0d\xfe\xbb\xc1\x03\x4a\x72\x36\x07\x2c\x47\xcc\xdd\x13\xc7\x31\x9a\xf2\xad\x2c\xc4\x7a\x93\x60\x65\xe1\x6f\xac\x12\xfe\x5d\xf0\xe2\xda\x2c\xc5\x07\x11\x13\x82\x99\x04\x26\x4a\x4a\xc0\x2e\x09\xec\xdc\x90\x07\x7c\xaa\x8c\x44\xd9\x3a\xc9\x5e\x33\x12\x61\x2e\x5b\xa2\xde\x7b\xc9\x5b\xf4\x1f\xea\x80\xcb\x10\x20\x6e\x01\x53\xcb\xdb\xd3\x96\x1c\x00\x7e\x22\x04\x4b\x04\x85\x6f\xb1\xd8\x45\xb1\x61\xae\x31\xbc\x4a\x0e\x5f\x1c\xf6\x42\x7c\x71\x39\xb9\xcc\xe8\x9c\x6e\xaf\x77\x5c\x55\x46\x6a\xaf\x92\x98\x69\x96\xa7\x50\x98\x76\x21\xef\xf0\x77\x64\x5b\x99\x7d\x8a\xd9\x9a\xbe\x66\xb5\x0b\xa9\x80\x2b\x55\x93\x18\xe1\xfc\x82\x63\xf4\x8e\x2e\x09\xcd\x65\x21\x62\x2b\x35\x79\x02\xfa\xb6\xf6\xe1\x77\x52\x00\xa5\x28\x94\x81\xd5\x75\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x52\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xd1\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xc7\x55\x11\x04\x1e\x69\xb3\xa0\xed\xf1\x20\xaa\x98\xee\x79\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x43\xb5\xe1\xc8\x55\x93\x3b\xc9\x11\x3e\x69\x24\x36\x29\xf5\xc6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\xf4\x96\x29\xa2\x78\xca\x13\x9a\x27\x90\x2b\x78\x85\xf3\x83\x66\xec\x8d\x19\xe8\xdd\xb2\x9b\xc3\x99\x04\xc3\x6d\x05\xb5\x9b\x87\x81\x13\xd0\x08\x37\x2f\x2c\x02\xee\x2a\x87\x7f\x8c\x92\x42\xf1\xdb\x7d\x4f\x93\xcd\x7e\xd8\x81\x55\xd7\xb9\x74\x26\xe3\xab\x8c\x45\x0f\xc9\xa3\xab\x1a\x86\x21\x55\xb1\xdb\x74\xe0\xc9\xa8\xec\x53\x6c\xac\x3f\x65\x84\x46\x11\x53\xca\xc5\x54\x2e\xc3\x38\x4f\xbf\x86\x4f\xa5\xa0\x00\xbd\x53\xaf\x12\xaa\x34\x8f\xbe\x4a\x64\x74\x73\xa5\x65\xde\x29\x67\xbf\xe9\xfd\x5a\x19\x86\xd3\xef\xaf\xc8\x19\x57\x37\x41\x36\x81\x75\x9a\x86\xe6\x12\x4a\x6e\x8a\x29\x4b\x98\x3e\x3c\x54\xc8\xe5\x52\x1a\x2d\xb8\x60\x8e\xc1\x09\x9f\x92\x62\x15\x3e\x03\xe5\xae\x3e\x53\x9b\xf8\x74\x62\xf1\xf5\x37\xf4\x4e\x31\x9c\xfe\xd4\x4c\xdf\xfc\xcc\xda\x64\xa4\xf7\xea\xa7\xc0\xc9\x9c\x9f\xf5\xe4\x83\x98\xa9\x6b\x33\xc7\x6e\xc6\xed\x43\x7c\xcb\xa9\x0e\x33\x9e\x30\xdb\x7d\xc0\x2c\xd8\xc5\xa8\xd9\x53\x01\xfb\xb7\x94\x05\xb9\xa3\xa8\x23\x03\x45\x9c\x90\x6b\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa4\x69\x96\x30\xf5\x82\x1c\xb0\x8f\xfa\x0f\x07\x23\x72\xf0\x71\xa6\xcc\xff\x84\x9e\xa9\x83\x09\x39\x4f\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\x38\x9f\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x27\x31\xbb\x3d\x51\x31\x7d\x3e\x82\xcf\x28\x1b\x08\x58\x9d\x13\x55\xe4\xe0\xf9\xc1\x84\x5c\x39\x46\x3c\x0a\xe7\x58\x3e\x37\x93\xb9\x1f\x10\xec\xec\xcf\x0e\xc8\x91\xcc\x61\xe4\x88\x0a\x92\x30\x7a\x6b\x6d\xcb\x78\xdc\x96\xa8\xee\x1e\xb7\x4e\x88\x6c\x9b\x1b\xd6\xbe\xf3\x4a\x5b\x21\x75\x75\x13\xdd\x7b\xce\x04\x90\x17\x36\x57\x60\x26\x73\x5b\x07\xc4\x3f\xa2\x98\x86\xa3\xc7\x45\x45\x85\x7e\x04\x02\x4b\x3a\xa6\xd2\x3b\xea\xd9\x15\x3a\xee\x3d\xd0\x81\x04\xff\xb9\x60\xe4\xfc\xcc\x27\xd4\xb3\x5c\x71\xa5\xcd\x31\x8e\x2b\xac\x8b\x23\x3f\x3b\x3a\x4d\xe9\x3f\xa4\x20\xaf\xbe\xba\xb2\x13\x38\x7e\x54\x50\x6d\xa5\x06\xf4\x1f\x45\xce\x0c\x17\xee\xc0\xdc\xfd\x3b\x75\x86\x6e\xee\x93\x33\xaa\x29\xf2\x75\x1b\x69\x25\x4a\x52\x6e\x58\xf6\x94\x8b\xd8\xfe\x14\x30\xec\x87\xe6\xad\x66\xf7\xde\x6d\x12\x93\xc2\x07\xbf\xbd\x3c\xef\x89\x07\x47\x40\xcc\xe7\x6f\x65\xdc\x99\x11\x07\xaf\x3a\xe2\xfb\xdf\x06\xa6\x2f\xf1\x3e\x49\xcd\x98\xc4\x68\xef\x23\x72\xc9\x68\x4c\xcc\xf9\xb5\xff\xfc\xde\xe8\x9e\xad\x69\x55\x2b\x16\xe2\x00\xd8\x71\x19\xee\x35\xb7\x84\x30\xd2\x3d\x36\x98\x03\xc7\xca\xf2\x92\x69\x22\xa7\xc4\x1e\x87\xbe\xe7\xfe\xed\xe5\xf9\x0e\x53\xff\xf6\xf2\xdc\xcd\xdc\xfc\x53\xce\x1e\x6e\xd2\x3b\x89\x6f\xa5\xf4\xf6\xba\x26\x6e\x95\x2c\xb9\x4c\xdc\xa8\x8b\x64\xed\xe5\xb1\x49\x5f\x92\x58\x9f\x10\xbb\xe1\xa2\x45\x16\x6e\xf5\x94\x99\x77\x8c\x42\x81\xb1\x6a\x81\x1f\xf1\x6a\x41\x21\xf5\xd9\x27\xe4\xc1\x3e\x9b\x8d\x57\x86\x2b\xb8\x1d\x37\x4a\x20\xd0\x36\x72\xc6\xd0\xcb\x19\xbf\x70\xb1\x03\xfe\x8d\xe6\x17\xde\x42\xa4\x66\x6c\xe9\x2b\xc1\xc0\xcd\x38\x40\xb0\x23\xb4\x2a\x09\xff\x13\xbd\xa5\x3c\xa1\x53\x9e\x70\x28\xa5\x6e\xb4\xfb\x30\x1a\x55\xc1\x94\x7b\x3d\xf5\x3b\x8a\x1c\x5e\x9c\x58\x31\x6e\x91\x23\xf3\xdb\x09\x18\xc7\x8e\x27\x40\xad\xe0\x41\xa8\xd1\x58\x13\x4a\x2e\xb7\x09\x25\xbd\xc9\x0f\xb0\x03\xe6\xc4\x74\xe5\x8a\xe6\x9d\x46\xae\x08\x3f\x5c\xd9\x7a\x72\x4f\x99\x31\x62\xae\x55\x2b\xd6\x08\xf8\xb5\xf5\xc9\xf6\xcc\x71\x5f\xe4\x8a\x3f\x0d\xe4\x22\x3e\xa3\x6d\x07\xfe\x59\xbe\xe8\xf8\x10\x28\x49\x10\x71\x66\xb3\xdd\x2a\xa1\x99\x88\x7d\x57\x96\xd6\xd8\x12\x4c\xc8\x75\x0d\xce\xb5\xe9\x8b\xd6\xa5\x68\x83\xc3\x88\xae\xab\x72\xef\xb9\x45\x21\x09\x84\xdb\xa4\x05\x2e\xb6\x9e\x64\xc4\xb2\xc5\xac\x8b\x4b\xdc\xbc\xf0\xfa\xaa\x6a\x09\x7c\xc9\xb2\x05\x79\x7d\xd5\x70\x8c\x01\xf6\x30\x6b\x85\xf6\xc1\x43\x45\x12\x3e\x63\x9a\x6f\x59\xc2\x3d\x1c\xe4\x54\x0a\xae\x65\xbe\x3e\x05\x9a\x74\x3a\x9c\x6e\xb8\xae\x0c\xd5\xbd\x67\x76\xb6\x2c\x20\xf2\x36\xb8\x4b\x49\x24\x93\x84\x45\xda\x96\xb4\x02\xf0\xfa\xd7\x1a\x94\x27\x66\xed\x01\x93\x9b\x3f\x81\xfa\x64\x15\xa5\x13\xdc\xdc\x93\xcb\x57\xa7\x67\x6f\x5f\x4d\xd2\xf8\x37\x0b\x79\x37\xd6\x72\x5c\x28\x36\xe6\x2d\x2a\x94\x3c\x5e\xf4\x22\x5e\x59\xab\x82\x59\x75\x83\x0c\xd6\xfa\x7a\xef\xf2\x27\xc9\xb7\x0a\xa3\x16\xc0\x76\xe4\x7c\x52\x52\xea\x11\xc9\xa9\xcd\x91\xa4\xd6\xf4\x54\x24\x09\x42\x5b\xe7\x8c\x8d\x42\x5b\xcc\xc6\xd4\x90\xce\x0b\xdb\xdb\x50\x51\x59\xe0\xfd\xca\x10\x0f\x8f\x70\x5d\x38\xc6\x76\x99\x64\x15\x8a\xe5\x9b\x55\x38\x5e\x55\xee\xa3\xe1\x4c\x2f\x0c\x54\x6f\xd8\x92\x40\x20\xf0\x4c\xe6\x06\x9f\xf2\x2a\x6e\x30\x1d\xc1\xd2\x4f\x0a\xc5\xf2\x89\x65\x3b\x0f\x0e\xb6\x0e\x55\x84\x76\x28\xde\xe6\x5f\x6c\x82\x99\xbd\x5d\x56\xf6\xb5\xf2\x1a\x2d\xf4\x82\x09\x6d\xc4\x7e\x43\xcb\x2c\x64\x1a\x81\x68\xe3\xb0\x1f\x1c\x6a\x2d\x8b\x18\x75\x2b\x39\x34\x94\xe9\xe9\x82\x93\xe6\xd4\x74\x45\x47\xf3\x0e\x24\x22\x86\x64\xde\xe7\x72\xe5\x34\x96\x10\xb0\x81\x15\xe8\x2a\x88\x46\xe3\x94\x8b\x27\x78\x3a\x23\x2e\xe2\x6d\x70\xa8\x19\xc0\xe0\x8d\xaa\x28\x66\xef\x59\x83\xbe\xf7\x1b\x52\xa7\x49\x61\xc2\xbb\xf5\x20\x56\xfd\x87\xad\x0e\x5f\xba\x54\x3f\x27\x63\xfc\xca\x38\x8b\x4b\xa8\x0c\xce\xc0\x55\x0f\x5e\xbf\x26\xa5\x07\x70\xf1\xf5\xb4\xdb\xe4\x81\xa5\xa1\xfb\xd5\x73\x1f\x04\x50\x5d\x64\x9e\x7d\xb9\x77\x49\x33\xa1\xf1\xbe\x72\xc9\x67\x58\xd9\x0c\xce\xa8\xd3\x97\xa1\x21\x3f\xcd\x69\xca\x34\xcb\x31\x04\xce\x06\xd5\x09\x9b\x9d\xf0\x3e\x63\xe2\x4a\xd3\xe8\xa6\xef\x52\xa8\x03\xc7\xbd\x3f\x8e\xbb\xb7\x2b\xd0\x21\x82\xad\x8b\xb4\x0c\xbd\xc8\x5c\x58\x2e\xf4\x44\x48\x8c\x2f\x47\xd6\xc5\xca\xe1\xcb\x51\x55\xb9\x6b\x59\x9e\x0c\x0d\x1b\x10\xe9\xe6\xeb\xeb\x41\x04\x3f\x42\xa1\x1f\x6e\xd8\xfe\x0c\x58\x12\xb8\x8b\x1f\x2d\x78\xb5\x4a\x1d\x52\x73\x67\xca\x75\x79\xee\x15\xd3\x24\x63\x79\xca\x6d\x5a\xb7\x14\x24\xb2\x69\x01\xc0\xd7\x0c\x0f\xb3\xc3\x05\x3c\x4f\x10\x19\x69\x6a\x73\x66\xc8\x94\xe9\x3b\xc6\x04\x79\xf6\xec\xd9\x33\x90\x4b\x9e\xfd\xf1\x8f\x7f\x24\x50\x47\x22\x66\x11\x4f\x57\x1f\x84\xa7\xfe\xe3\xf9\xf3\x09\xf9\xbf\xa7\x6f\xdf\x40\x54\x59\xa6\x15\x99\x4a\xbd\xb0\x23\x9b\x07\x2a\x2f\xab\x11\xf9\x9f\xab\xf7\xef\x9c\x38\xa1\x6a\xbf\x82\x0a\xe2\x97\x57\x0d\x11\x7c\xf6\xe5\x1f\xfe\x30\x21\x67\x3c\x87\x7c\x62\x0e\x19\x10\x3e\x08\x32\x73\x81\x81\xd0\x78\xa8\x9e\xc1\x6f\x39\x88\x0d\x12\x4e\xf9\x7c\x01\x00\x30\x07\x42\x8a\x59\xc2\x23\x8d\x35\x05\xf1\xe8\x23\xa0\x6d\x5f\x24\x6a\xd3\xbd\xac\x14\x01\x93\x1b\x91\x84\xdf\x30\x32\x53\x5f\xe7\xb2\xc8\xca\x34\xc7\x9c\x29\x23\xcb\x46\x54\x40\x56\x09\x0c\x56\xee\x95\x62\xfa\x51\x83\x30\x5a\x1a\x82\x2a\x38\x08\xef\xd4\x04\x94\x91\xaf\xad\x36\x46\x7c\xc8\x28\xf7\x81\x83\xe0\x53\xaf\x54\xf6\xf7\xba\x67\x1c\xd4\x92\x73\xb9\x2b\x59\x2e\xff\x8e\x5b\xc5\x85\xcb\x82\xb2\x12\xb2\xb2\x32\x99\x4d\x3a\x15\x81\xcd\xd5\x65\xe5\x1b\x5e\x68\x33\xfe\x83\xfc\xa9\xf3\x59\x98\x68\x07\x69\xe9\xd8\x5e\xad\x52\xf8\xb2\xe1\xcb\x65\xb1\x76\x83\x4d\x0a\xf7\xb5\x10\x2b\x6f\xdb\x3e\x2a\x96\xfc\xd8\xee\x3a\x36\x85\xad\x1c\x03\x43\x71\x6d\x02\x50\xd0\xb3\xa9\x52\x8c\xae\x12\xe5\xa3\x98\x2e\x2c\x68\x20\xf2\xca\x7c\x9b\x29\x65\xf3\x88\x52\x9a\xdf\x18\x25\xc1\x52\x81\x09\x44\x3d\x2b\x9f\xc3\x84\x09\x65\xb7\x68\x2c\x4f\xe9\xb2\x92\x35\x60\x3e\x72\x38\x99\x1c\xe2\x31\x91\x39\xd6\xf2\x44\x9c\x37\xf7\x1f\x29\x5f\xba\x1a\x95\x4e\x33\x6c\xbb\x07\xf6\x1c\xdb\xb6\x84\x56\xa2\x9d\xa9\x85\x54\x9b\x0a\xbe\x1d\xdb\x16\x76\xeb\x8f\xdb\xbe\x2f\xee\x18\x16\xd0\xe2\xd1\xae\x3d\x70\x3b\xf4\xbe\x5d\x57\xad\xc1\xc2\xd8\x9e\x84\xb6\x1d\x21\x3b\xd7\x02\x4f\x5b\xb1\xbe\x86\xa9\x1e\xa6\x96\xf3\xbd\xef\xc6\xf9\x6c\xbe\x5e\xa5\x39\xd8\xd3\x67\x75\xe7\x33\xcc\x74\xa9\x92\x2e\x4b\x1a\x42\x51\xc0\x37\xe2\x2a\xd3\x5e\x9e\x34\x47\x0b\xd1\xa6\x5b\xe1\xf9\x2e\xdc\x0d\xaf\x76\x8e\x09\xbc\x2a\xb8\xe6\xbc\x13\xb8\x68\x4b\x4a\xb3\x4a\x83\x8f\x04\xed\x06\x20\x63\xba\xc3\x33\x21\x6f\x2d\xa9\x45\x24\xa3\x53\x25\x93\x42\xe3\xab\xe5\x8f\x21\x1d\x86\x41\x5d\x95\x05\x20\xbe\xfe\xb1\x80\x2a\xeb\xb2\xc5\x59\x3b\x02\x8d\x57\x87\xc3\x39\x54\xfb\xbc\xc7\x6a\x9f\xbe\x3e\xad\x6a\xd9\xaf\x49\xdd\x5b\x79\xdd\x48\xf1\x2e\xfa\x95\xe2\xe4\xa8\x6c\x13\xe2\xdc\xf1\xe7\x42\xb3\x7c\x46\x23\x76\x1c\xea\x5d\xbe\x1d\x8b\x0f\x11\x72\x79\x11\x0b\x2a\xe2\x04\x05\xf0\x88\xe5\x80\xfb\xec\xa3\x66\xb9\x01\xc9\xcb\xab\x73\x12\xe7\xfc\x96\xe5\x8a\x1c\x7d\xc5\x8c\xbc\xc8\xa8\x2e\x72\xd6\x2a\xbb\xaa\xdf\xd8\x4a\x98\x46\x5f\x9a\x1e\x0c\xd6\x35\x54\x0f\x5e\x72\x94\x47\x04\xe7\xab\x04\x13\x42\x15\x41\xaa\x42\x5d\x76\x62\x50\x09\x08\x34\xd0\x8c\xa5\x2c\x72\x6b\x45\x77\x75\x55\x23\x99\x1b\x75\x09\x07\xa6\x8a\xe4\x6c\x6e\xa4\xd9\xdc\x35\x1b\x66\x24\x4a\x0a\x73\xa3\xd7\x70\xb6\x7d\x02\x00\x4b\xd3\xec\xa6\x58\xbd\x99\x95\xaa\xe5\x2d\x8f\x1d\xab\xc4\xde\xc7\xbe\xab\x61\x46\x55\x90\x6a\x13\x54\xa0\x0f\x00\x8b\x32\x3a\x30\x54\x9f\xc4\x5a\x09\xf6\x0f\x8d\xc2\x12\x6a\x5b\xb4\x68\x1f\xd1\x85\x08\xcb\x98\x5d\x14\xd3\x84\xab\xc5\xd5\x8e\x26\xc4\xa6\x21\x30\x58\x61\xc5\xeb\xb7\xd6\x92\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xe9\x72\x23\x47\x49\x00\xa2\x7b\x3b\x44\x48\x09\xd9\x1f\x09\xb3\x15\x0c\xcc\x4f\xef\xca\x79\xd8\xa4\x34\xac\x59\x12\xb3\x6f\x45\x56\xb9\x1f\xd1\x24\x51\xf5\x84\x5d\x47\x31\x51\xf6\x70\x89\x6a\xb8\xa7\xdc\x6c\xb7\xef\x8c\x52\xab\x7e\xb9\x76\x61\x8a\xa4\x12\xd3\x78\x04\x91\xc2\x3d\x04\xa5\x57\xdc\x0b\x41\x22\x23\xa4\x2b\x03\xca\xf4\xdc\x3a\x72\x30\x97\xde\x9f\xb9\x74\xdf\x38\xbc\xb0\xdf\x7b\x99\x0d\x5d\x29\x4b\xea\x49\xa9\x23\xb9\x5b\x82\x3a\x7a\x75\x2b\xe0\x37\x4f\xb5\xce\xf9\xb4\xd0\xdd\xeb\xbd\xd5\x5e\x07\x36\x6d\x14\x11\x38\xc5\x63\xbb\xfa\x28\x40\x51\xab\x21\xf8\xb3\xb0\x7a\xf6\x4b\x9e\x03\xec\x06\x6f\x1e\x2a\x12\xcb\xa8\xf0\x75\x61\x01\x68\xa5\x03\xad\x4d\xf5\x44\xd2\xf5\x5c\x75\x2f\xe9\x15\x7e\x64\x2b\x7a\xc5\xf2\x4e\xdc\xd1\x3c\x3e\xbd\xd8\x12\x7d\x5f\x65\xe7\xe5\x5b\xa1\xa0\xe4\x6e\x43\x17\x40\x3a\x95\x85\x2e\x4b\x87\xfe\x72\xec\xd5\x4d\x6a\xba\x96\x86\x34\xb4\xb4\x47\x77\x55\xf4\x07\x13\xf7\x60\xe2\xae\x5c\xbb\x98\xb8\xcf\xd1\xc4\x1d\xd6\xc1\xad\x1c\x57\x57\x5e\x81\x27\x6d\x63\x7b\xef\xd3\x4a\x7a\x56\x12\x18\x94\xa6\xea\x71\xfc\x35\x01\x0e\x8f\x48\xb9\xb7\x81\xd0\xe7\x28\x10\xf0\xec\xc7\xb7\xa8\xde\x93\x9d\xb4\x7d\x9f\x62\xbc\xd6\x35\x12\xdc\xd4\xb7\x18\xa4\x86\xa0\xd1\xf0\xc8\x56\x81\x1e\x59\xbd\x4b\xc4\x65\x0b\x3f\x2c\x42\xdd\xa1\x4d\x29\x5e\x1d\x81\x4f\x3a\x6f\x00\xe9\xd8\x44\x18\xaf\xae\xbb\x41\x76\x68\x28\x8c\xd7\x23\xb7\x15\xc6\xab\xb3\xed\x9b\x74\x6f\x31\xdc\xb0\xdc\xfb\x6d\x34\xbc\xe3\xd2\x76\x37\xeb\xef\x6a\xce\x1f\x95\xed\xed\x9e\x3e\x5b\x1f\xcc\xf9\x2b\xd7\x03\x9a\xf3\x03\xc2\xed\x88\x41\x83\x69\x3f\x34\xb7\x39\xfb\xfe\x94\x39\xb1\x72\x52\x56\x5f\x33\x28\xe7\x2c\xfb\x32\xaf\xba\x55\x0f\x27\x93\xc3\x43\x67\xef\xb7\xf8\x59\xe8\xd9\xf8\x4f\x84\x89\x48\xc6\xb8\xa9\x66\xfc\x5c\x69\x60\xfa\xa5\x9a\x1e\xce\x25\x75\xdf\x0a\x5d\xb3\x30\x76\xb7\x2d\xe9\x70\x82\xbb\xb7\x0d\x6f\x82\xf4\x43\x34\x0f\x0f\x5b\x84\x57\x3b\x82\xe3\x13\xfb\xb4\x01\x0f\x81\x77\xef\xfc\xb5\x75\x63\x70\xbc\x76\x61\xaf\x3b\x34\x09\xc7\xeb\x81\x5b\x85\xe3\xb5\x13\x47\xed\xd4\x36\xbc\x61\x71\x0f\xd7\x3c\x1c\xaf\x27\xda\x48\xa6\x7a\x75\x6a\x24\x8e\xd7\x6e\xed\xc4\xab\xef\x76\xdc\xfa\x5e\x5a\x8b\xe3\xd5\xad\xc1\x38\x5e\x7d\xb7\x19\xc7\xab\x25\x24\xc0\x18\x7e\xc6\x3b\xa5\x22\xb8\x77\xaa\xe1\x92\x9a\xa5\x99\xcc\x69\xbe\x24\xb1\xb5\x35\x2c\x1b\x32\x42\x83\x94\xd0\xbd\x4b\xc3\xc0\x3c\x62\x9e\xf7\x94\x8d\xd0\x21\x1b\x94\xc5\xbc\x58\xdb\xae\x79\x1d\xd8\xf0\xad\x10\x68\x77\x50\x0d\xcc\x56\x12\x73\xee\x4e\xfb\x98\x2b\xac\x48\xa3\x1b\xdb\x31\xc8\x41\x15\x79\x7f\x90\xe4\x72\x70\x50\xab\x03\x0d\xe6\x31\xf0\xfd\xd9\xce\x88\xee\x61\x1c\xbb\x62\xca\x42\x6f\x88\x0d\x0b\x38\xb2\x0f\x1e\x1b\x89\xe4\x2d\xb0\xc1\x07\xda\x25\xd2\x31\xb3\x8d\xff\x83\x41\xbb\xb1\xce\xb1\xf1\xee\x45\x5f\x0e\x5a\x82\x64\xee\xfb\xa2\x25\x32\x0a\x7c\xcf\x15\x0e\x05\xdb\xf0\xca\x21\xbf\xb3\xdd\x9b\xcd\x30\xa3\xa2\x7c\x01\x46\x9f\x44\xa1\x5f\x8f\x47\x50\xda\x12\xa4\x78\x00\xa6\xdf\x80\xeb\xa0\x4b\x60\xa1\xcc\x97\xa0\xf2\x7c\xf0\x4c\xf9\xa1\x3b\x57\x61\x53\x07\x8d\xdc\xaa\xba\x87\xf9\xe5\xca\xaf\xac\xd4\xdb\x20\x05\xc2\x09\xea\xaa\x00\x31\xd1\x7e\xc5\x8a\x4b\x72\x06\xbe\xab\xb2\x2d\x9a\x2f\xee\xb8\x82\x66\x82\x27\x55\x3c\x73\xb5\xec\xfc\xc2\x0b\x61\x03\x0d\x56\x90\xa6\x19\x67\x0a\xc5\xf2\xf1\xbc\xe0\xf1\x2e\xd8\xf2\x84\x19\x60\x6b\xb6\xd7\x9d\xd9\x75\x64\x71\x7b\x30\x36\x1f\x88\xd1\x81\x35\x1c\x94\xd1\x1b\x15\xde\x10\x96\xc5\xab\x46\x72\x50\x17\x2c\xe0\x8f\x9c\x73\x09\x5d\x7b\xd5\xd6\xf2\x8c\x68\x19\xd9\x64\x5d\x5e\x29\x77\x89\xc3\x22\xe6\x41\x60\xeb\xd8\xfc\xc7\xa9\xc0\xce\x9e\x3f\x65\x33\x59\x76\x48\x41\x8d\xc8\x86\xe3\xc6\x2c\x61\xd0\x46\xde\xb5\xa8\x37\x0f\x80\x4b\x38\x95\xb7\x06\x99\x3f\x08\xf2\xad\xab\xd9\xcf\x67\x2f\x08\x3d\xae\xa4\x40\xd8\xae\x33\x82\xb1\x18\x63\x74\x93\xf2\x3b\x79\x21\xd4\x88\x4c\x8f\x5d\x3c\x0a\x9c\x38\x61\xc4\xc2\xc4\x49\xbc\xa8\x57\xe7\xcc\x00\x00\xd2\x8e\x73\x99\x12\x25\x68\xa6\x16\x52\x83\x6a\x48\x33\x1a\x71\xbd\x24\x3a\xa7\xd1\x0d\xb4\x28\xca\x99\xfd\xdc\x88\x44\xc7\x36\xb0\x2b\x04\x5f\x35\x6c\x58\x2f\x72\x59\xcc\x17\x10\x09\x8b\x4f\x45\x09\x55\x6e\xf5\x8d\xef\x5b\x6d\x47\x91\x78\x29\x68\xca\x23\x5f\x35\x30\x97\xb7\x5c\x71\x69\xad\xbd\x6e\xdc\x0b\x5f\x19\x0e\x2d\xc8\x2f\x13\xca\x53\x72\xa4\x18\x23\xaf\x1c\x4a\xe0\x2f\xb6\x8d\x3d\x5a\x36\xf2\x6a\x70\x80\xf4\x25\xcd\x85\x2d\x88\x50\x12\x38\xef\xbc\x42\x86\x69\x66\xde\xf8\xd1\x63\xbf\x5d\xcd\x73\x92\x39\x38\xee\x5d\xe9\x4e\x26\x62\x19\x78\x2d\x4f\x2f\xce\x55\xa8\x8d\x20\x6e\xd9\xba\x77\xf0\x43\x22\xc5\x3c\x2c\x23\x50\x62\xa6\x21\xa5\x02\xda\xbb\xdc\xf2\xb8\xa0\x09\x12\x51\x3b\x99\x97\x57\xe7\xf8\x3a\x9f\x2f\xf4\xf8\x8e\x81\x35\x06\x79\x4d\x79\x66\xdc\x47\xf9\x4a\xb4\x0e\x57\x40\x74\xb5\xb5\x26\xa0\x65\xcb\x4c\xed\x8e\x2e\xa1\x6c\x8d\x0d\x31\xa9\x38\x4c\x5d\x61\x31\x1c\xa2\x09\xe2\x30\xbd\x53\xdf\xae\xc3\x88\x0d\x60\xae\x32\x20\x06\x4c\x5d\x9d\x9b\x01\x7c\x50\x07\xd0\xdf\xb6\x9d\xd9\xa8\xd9\x20\x23\xdc\x6d\xd6\x65\xee\x41\x28\xbb\x2d\x37\xf9\xda\xb6\x4e\xec\x28\x1c\x1c\x7c\x1f\x98\xcd\x02\x47\x87\x39\x36\x54\xc4\x63\x9a\x18\xcc\xb9\xf8\xee\xa5\x8d\x70\xc6\x83\x50\x71\xe4\xbb\x2e\x48\x5c\xf8\xb2\xd9\x46\x66\x68\x3c\x02\x90\x07\x3f\x65\x31\x10\x8d\xb0\x61\xe4\x9d\xd1\x90\xed\xe6\x5d\x7c\xf7\x72\x44\xf8\x84\x4d\xdc\x5f\xfe\x51\x47\xb5\xb4\x9c\x63\x18\xa0\x8f\xf1\x04\xbc\x83\xa9\x84\xc6\xa8\xf0\xdd\x9f\xfe\x6c\x26\x69\x7e\xfd\xcb\xf8\xcf\x41\xb5\xd1\xbf\xfc\x64\x88\x60\x6e\x1e\xa8\xde\x0d\x63\xc9\x7c\xd5\xfd\x9f\x2e\x6c\x55\x6a\x5b\xb3\xfa\x27\xdb\x8c\x8b\x09\x6d\xe4\xc6\x0b\x09\x5e\x7a\x1e\x23\x36\xc2\xb7\x73\xf6\x77\x67\x58\x04\x30\x79\xa3\x4e\x44\x35\x13\x40\xa8\x5d\x52\x86\x90\x1a\x5f\xb7\x7d\x67\xcd\xfc\x8f\xc0\x24\x80\x49\x65\x23\xa2\xa5\x84\xe3\x88\x47\xfe\x54\x10\xe6\x7a\x75\xe2\x5a\x01\x1c\xd4\x06\xaa\x39\xde\x63\x86\x35\x10\xf6\x29\xb8\x66\x1e\x30\xb7\xcf\x85\xd4\x9f\xfb\xed\xaf\x75\x11\xa7\xb7\x92\xbb\x02\xe4\xe6\xa4\x08\xec\xe8\xe8\x4b\x62\x4f\x97\x24\xe5\x4a\xd3\x1b\x36\x21\x57\x86\xb7\x84\xde\x30\x84\x9e\x20\x50\xc1\x92\xc5\xa4\x10\x9a\x27\xf0\x6b\x39\x8e\x99\x72\xc8\x73\xce\x67\x44\x15\xd0\xde\x3c\xcb\xd9\xd8\x71\x31\xfb\xd4\x0a\x2d\x28\xd7\x32\xf2\x9b\xbd\xa0\xa8\x0b\x64\x31\xbc\x0a\xf0\xa0\xc2\xa2\xd7\x4a\x1c\x97\x99\xa7\x14\x51\xc9\xb9\x00\x98\x6a\x42\xde\x01\xb3\x4a\x9c\x4b\x18\xd5\x12\x6b\xc0\x14\x2c\x62\x4a\xd1\x7c\x39\x82\xc2\xee\xdc\x17\x03\xb7\xa1\x3b\xc0\x51\x53\x2a\xb0\xac\x7a\xce\x22\x29\x94\xce\x8b\x48\x63\x9f\xbd\x69\x2e\x6f\x98\xf0\xe1\x82\x66\x17\xab\x01\x5c\x65\xfc\x0c\xf8\xbb\x24\x89\x16\x54\xcc\x83\x3e\x35\x29\x8d\x01\xf6\xdf\x78\x29\xc7\xad\xc7\x40\x80\xce\x8c\x60\xc1\x35\x80\x62\x6a\xf8\x88\x37\xc3\x7e\x10\xbe\x1e\xcf\xa8\xb4\x93\x9a\x25\xf1\x64\x0b\xed\xea\x44\xbf\x48\x47\xa3\xde\x18\xd8\x76\xcf\x01\x60\x29\xd3\x34\xa6\x9a\xee\x10\x04\xf6\xb6\x6c\xae\xe7\xfa\xeb\x63\x83\x53\xef\x98\xb4\x7c\xc8\x89\x5b\x32\xe3\x61\xfe\x13\x9c\xc4\x85\x83\x3c\x64\x5c\x6b\x83\x53\xd6\x51\x80\xb1\x5d\x20\xcf\xb8\xee\x65\x66\x78\x37\x1a\x92\x8b\xb2\x35\x63\x49\x4e\xda\xb9\xa1\x3a\x5a\x60\x0d\xe8\x77\x80\xd1\x75\xe9\x2b\x8b\xaa\xf1\x5d\x8d\x22\x08\x72\x09\x26\x34\xcf\x59\x98\x6e\x66\x41\x57\x08\x44\xf2\x1a\x10\x01\xca\x73\xa6\x55\x19\xa1\x82\x74\xd8\x10\x17\xcb\xef\xac\x32\x0a\x44\xda\x02\xd6\xea\x73\xcd\xb2\x10\x82\x5d\x49\x4b\x67\x0d\xe5\xbf\x17\xb8\xee\x62\x74\xc6\x76\x02\x6f\x65\xdc\xc5\x4e\x5d\xab\xc2\x5f\x0e\x51\xc6\x6f\x62\x24\xae\x02\xa5\x1e\x1f\x00\x6f\x95\xaa\x24\xcd\x21\x91\x5b\xd0\xdb\xdd\x8d\x54\xa5\x8c\x34\xf6\xa5\x8c\xe1\x73\x63\xf8\xdc\xf8\x79\x7b\x63\x5e\x97\x08\x10\x77\xb5\x8e\x04\xa9\x7e\xa4\x93\xe5\xd4\x90\x94\xab\x8e\xe6\xce\x5a\x36\xb2\x1f\xc1\xd2\x7c\xeb\x45\xf4\x9e\x5b\x9b\xe9\xc0\xb8\xa1\x16\x2f\xc8\xe7\x15\x2e\x6f\xa5\x29\xaf\x29\x61\xa4\xee\x91\x53\x9d\x26\x76\x2b\x5c\xf2\x79\xf5\xf1\xe3\xda\x60\x20\x5e\x34\x6b\x14\x2e\x22\xd8\x8b\x7c\x46\x3c\xcb\xc1\x78\xe6\xf2\x0f\x0c\x7a\xe5\x32\x49\x58\x0e\x4b\xb0\xda\x53\xcd\x8b\x0e\xb5\x4c\xd1\xa6\x3b\xf2\x2a\xaa\x97\x31\x05\xbb\xf3\xc2\x04\x55\x58\xba\xc5\x79\xbc\x98\x6d\x9c\xb7\x76\x3c\x1f\xb5\x7c\x2a\x96\x38\xf5\xb3\x00\xb4\xa8\x7a\x92\xb9\xf9\x90\x91\x3a\x05\x9d\x26\xe8\x3d\xf6\xcc\x16\xe6\x42\x93\x3b\xba\x54\x80\xf7\xa5\x34\xef\xbf\x6f\xab\xaa\x95\x03\x5f\xb2\x19\xbe\xdd\xda\x23\xb6\x93\x4f\x6c\x17\xaf\x18\xa4\x53\x72\xd1\x26\x04\xa9\x7c\x61\x63\xe3\x90\xfa\xb5\x8b\x1b\x0d\xe2\x54\xc0\x7d\xde\xcd\x27\x52\xed\x53\x7e\x71\x0e\x43\x38\x99\x7c\x0e\x7f\x38\x8e\xe3\x9d\x06\x53\x66\xb0\xba\x4c\x94\x06\x0c\x09\xdf\x6d\x88\x24\x28\x51\xeb\x1b\xa8\xc6\x6a\xad\xc4\xbe\xd3\x58\xce\x20\x12\x04\xbe\x38\x81\x76\x04\x54\x2c\x2d\x27\xd7\x0b\x9e\xc7\xe3\x8c\xe6\x7a\x89\xea\xe3\xa8\xf2\x35\x1f\x5e\xdf\x69\xe1\x3b\xba\x73\xda\x95\x3e\x5e\x0b\x61\x58\xbc\x33\x0f\x5b\xeb\xfc\x5a\xb8\x3e\xc4\x7a\xda\x07\xf0\x37\xae\x27\x2c\x2d\xea\x34\xc2\x47\x5b\x4f\x1c\x92\x8f\xfd\xf9\x86\xa1\x41\xaa\xea\x7a\x45\x36\x10\xb6\xae\x92\x61\x14\xb4\xe7\xf2\xa0\x10\x99\x91\x46\x46\x0f\xa5\x65\xaf\xf1\xc0\xb0\x67\x25\x05\x17\x43\x63\x3b\x1d\x89\xa5\x35\xdd\x84\xdf\x0a\x07\xf0\xa7\x84\x1c\x09\x29\xf0\xe4\xe0\xb3\xc7\x18\x42\xb4\xc6\x36\x05\x8f\xd8\x16\x75\xd5\x0e\xa1\xc1\x49\x75\x4c\x82\x8b\xd8\x6c\x1d\x50\x6e\xd0\x91\x54\x11\x45\x8c\x79\xad\x3a\x6c\x51\x53\x9e\x6c\x3b\x65\xd7\xea\x52\x49\x28\xe2\xa2\x34\x4d\x92\x52\x9b\xb5\xe0\x92\xc0\xe7\x9c\x05\x30\x60\x7f\x95\x44\x1b\xab\xd8\x43\x13\x75\x0c\x7b\x29\x44\x84\x2e\x7c\xae\x97\x6e\x06\x67\x75\x56\x0f\x6a\x84\x42\x25\x97\xcf\xd0\xee\x14\xa8\x03\x1e\x98\x40\x9a\x6c\x0b\xf7\x2a\x67\xb2\xb5\x19\x0c\x1d\x9a\xd2\xe8\xe6\x8e\xe6\x31\xb4\xf2\xcd\xa8\xe6\x58\x16\x7c\x54\x19\xf6\x28\x98\x03\x34\xd2\x0f\xb1\xe8\xd8\x2b\x1d\x8a\xf9\x12\xd4\xe5\x67\x08\x2d\xb4\x4c\xa9\xe6\x11\xa8\xb2\x7c\x16\x58\x11\x53\x5f\xd2\xb0\xd6\x76\x10\xa8\xac\x6f\x60\x7f\x8d\xde\x98\x9c\x11\x7d\x27\x09\x4f\x8d\x84\x40\xa1\x95\xc6\xcc\x67\x0c\x39\x7b\xe7\xa6\x99\x1a\x31\xe8\x7b\x30\x32\x07\x4f\xa1\x92\x6c\x54\x28\x05\xc3\x7b\x8b\xa6\x37\xe5\xd9\x94\x9b\x51\x8d\x81\xdb\x77\x0c\x4e\x9b\xb9\x06\xa8\x3a\x32\xdb\x73\xc7\x8c\x5c\xa0\x36\x22\xac\x9a\x34\xcd\x08\x7b\xda\x2a\x12\x73\x55\x6b\x4c\x7d\x14\xe7\x32\xcb\xac\x81\x24\x3d\xae\xcf\x08\xfc\x06\xf9\x2d\x53\x41\xef\x65\x34\x55\xcf\x99\xf0\xcd\xc3\x6d\x39\x0b\x38\xb9\xf5\x4f\x54\x0e\xcc\x04\x13\x42\x8f\xc9\xb7\xb6\xa9\x90\x47\x5c\x1f\x75\xd7\x4a\x70\x42\x6b\x8b\x95\x9d\x06\x89\xa7\xed\x35\x48\x3c\x83\xc4\xf3\xeb\x96\x78\x7c\xb8\xd7\xae\xd2\x4e\x19\xe3\x58\x6b\x48\xee\x82\x01\xca\x07\xd6\x19\x31\xce\x67\xe4\x92\x45\xf2\x96\xe5\x48\xe4\xa0\xf1\xa7\xe1\xe5\xaf\x29\x4f\x0c\x89\x73\xa4\xae\x54\x0f\xa1\xa2\x6a\xd5\x34\x17\x68\xe4\x1e\x9a\x16\xcd\x53\x3b\x29\x9b\xe9\x67\x9e\xb7\x4e\xb2\x2c\x67\xb7\x5c\x16\xca\x85\x2c\x14\x1a\x8f\x99\xd2\x96\xdf\x2e\xf8\xdc\x17\xe6\xf6\xae\xce\x9c\x45\x32\x8f\xcb\x94\x72\xa5\xa9\x2e\x54\x35\x4f\x22\x42\x6b\x5a\x7f\x06\x1a\x0f\xc7\x7b\xa6\xee\xbb\x51\x52\x8c\xd8\xd8\xe3\x54\x1c\xbe\xc1\x98\x8f\xb2\xef\xb6\x0e\xc2\x50\xca\x10\x18\x23\x42\x15\x9a\x05\x68\x65\x11\xa0\x33\xac\x2b\x59\xaf\x27\xd8\xb8\x65\xec\x87\x1d\x97\x51\x27\x2d\x2a\xae\x87\xd7\x4e\x50\x27\x7b\x24\x78\x86\xd7\x13\x0e\x3c\xa9\x2d\xb6\x7b\xf4\x25\xd9\x33\x02\x93\xec\x13\x85\x49\xfa\x8c\xc4\x24\x3e\x9e\x7b\x9f\x13\x73\xe9\x22\xc9\x6b\x67\xc6\x12\xde\x4d\x67\xa6\x52\x50\xc0\x8f\xc3\x95\xeb\x00\x69\xdd\x9a\xfe\x0c\x80\x49\x30\x8c\x07\xb6\xa7\x15\xb4\x39\xf4\x5d\xb2\x8f\xbe\xea\x6f\x20\xc7\x94\x4d\xb5\xb5\x84\x08\x84\x34\xc3\x4a\x40\x70\xea\xc6\x36\x24\xcb\x69\x4b\xc3\x09\x1e\x4e\x70\xdb\xf7\x1f\xf3\x04\x63\xc4\x73\x97\x80\xfc\x5a\xa7\x20\x7c\xdd\x26\xe1\xd2\x29\x4b\xc8\xcf\x05\xcb\x97\xc4\x08\x41\x65\x78\x0f\x94\x37\x56\x3c\xb6\x01\x32\xd6\xa8\xd2\x5e\x66\x7f\x40\xfe\x0f\x26\x9b\x57\x1f\x8d\x04\x08\x79\x6c\x7b\xd0\xb5\xfa\x50\xd5\x54\x65\x84\x96\x87\x60\x28\xe1\xa1\x87\xb1\x22\xf3\x19\x71\xef\xf4\xdd\xd9\x6e\x8a\x4e\x37\xa7\x16\xd9\xc5\xb1\xb5\xb2\xf8\xd3\x0d\x0b\x44\x40\xf8\x5f\xaa\xdd\xa4\xbc\x29\x82\xdc\xb0\xe5\xc8\xfa\xc1\x6d\xf5\x76\xf7\x30\x86\x73\x54\x4b\x8a\xb6\x2d\x55\xd1\x04\xa0\x1d\x28\xe4\x6e\xd6\x03\xbc\xda\x17\xa1\xac\xbe\xe5\x80\xd0\x95\x10\xef\x4c\xc2\x3b\x15\xab\x0c\xaf\x75\x85\x2b\x11\x27\xa0\x02\x9f\x8b\x6b\xf6\x68\x00\xb1\xdc\x40\x2d\xba\x6e\x22\xd9\x5d\x05\xc6\xcb\x01\x76\xef\xa5\x7a\x34\xad\x04\xe6\xde\xb0\xe5\xa1\xb2\x59\x83\x52\xa8\x05\xcf\x5c\x7d\x78\xa0\x04\x16\x73\xc9\x77\x10\x1f\xe0\x86\xc0\x33\x7f\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x20\x54\x08\x2d\x95\x92\xa9\x77\x52\xc3\x9d\x07\x07\x16\x4e\x77\x6f\x50\x59\x33\x25\x07\x33\x23\x86\xb4\x41\x7e\x86\x0b\x41\x01\x90\x58\x7f\xab\x07\x2b\x57\xe4\x5c\x10\x99\x3b\x98\x68\x57\x3c\x58\xd9\x21\x9c\x6d\x29\xb0\x08\x37\x8c\x61\x41\x29\xf3\x0a\x24\x37\x0c\xe7\x8d\xcb\xdc\xfd\x02\xb6\x27\xb0\xc6\xfb\xb8\x19\x28\x81\x4b\x35\x9b\xf3\x88\xa4\x2c\x9f\x43\x7e\x68\xb4\xd8\x7d\x83\xba\xd3\x6d\xbc\x76\xa2\xde\xe1\x87\x3b\x63\x06\xb0\xba\x37\x10\xb9\xb4\x2f\xc3\xc4\x51\x90\x45\xa4\x34\x33\x48\xf1\x4f\xc3\x09\x60\x5f\xfe\x0d\x25\xab\xd5\x84\x9c\xba\x86\xa7\xe1\x6f\xd6\x8a\x11\x0e\x63\x46\x30\x32\xfd\xcf\x05\xbf\xa5\x09\xc3\x78\x3e\x2a\x7c\x19\x4f\x39\x5b\x61\xd3\x23\x5b\xb7\xda\x50\x29\xef\x19\x3a\xb8\x61\xcb\x83\xd1\x0a\x22\x1d\x9c\x8b\x83\x32\x49\xbb\x82\x3a\x9e\xa1\x81\xd3\xe0\x00\x7e\x3b\xe8\x9b\xb3\x3f\x92\x68\xbf\x03\x96\x58\x83\xd0\xcb\x84\x2a\xd5\x2d\xbf\xb5\x96\x5a\x54\x1b\xa7\xa9\x00\xe3\x55\xf0\x4c\x99\x5c\x64\xa3\x37\x7b\xb7\x67\x41\x94\x7f\xf7\x48\xa3\x4e\xd0\xbb\xb5\xdd\x53\xda\x17\x6e\x68\x2c\x28\x06\x65\x0b\x5c\x0e\x47\x25\x2f\xae\x74\xc6\xae\x81\xd7\x77\x60\x57\x94\xb3\xb0\xc9\x33\x57\xa0\x06\x73\x97\xd5\x21\xa4\x26\x5c\x44\x49\x61\x4d\x8a\xf0\x2a\x28\xd1\x5d\x45\xfd\x1d\x80\xb3\x07\x52\x95\x03\x38\x6c\x72\x6e\xdf\x95\x00\xde\xba\x87\x0e\x7c\xa2\xde\xe3\x85\xb0\xea\x7b\xad\xb3\x2d\xe1\x92\xd5\x62\x9c\x51\x55\xf6\x78\xcd\xa7\x39\x23\x2f\x17\x54\x08\x96\x04\xd9\xae\xd6\xd8\xe1\xdb\x59\x81\x40\x62\x9b\x58\x1d\x56\xbb\x58\x39\xfa\x26\x7c\x6e\x75\xef\xbd\x83\x7f\x49\x4d\xa5\x7a\xeb\x53\x6e\x4b\x35\x2e\xe4\x1d\x89\x25\xb9\x83\xbe\x05\xb7\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x29\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xdd\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x23\xf3\xf0\xf1\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x1c\x93\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6c\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x22\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x85\xdb\x95\xc1\x55\xf1\x89\xe7\x7c\x3e\xdd\x88\x7d\x64\x91\x8d\x0a\xce\x92\x62\xce\xb7\xa4\x3f\xfc\xca\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\xeb\xe6\x02\xe4\x31\xcb\x98\x88\xa1\x24\xda\xeb\x12\x73\x71\xf2\xbd\x42\xce\x96\x17\xeb\x4a\xb5\x5c\x55\xb2\x0a\x05\x0f\x42\xb8\x16\x32\x89\x15\x61\x1f\x75\x4e\x0d\x61\x4a\x0d\x09\xf2\xef\xcc\x08\x15\xed\x89\xcc\xd3\x28\x11\x4c\x7a\xe7\xf6\xf7\xdb\x2f\xf3\x29\xb6\xbc\x2c\xd7\xae\x36\x36\xac\xde\xaf\x74\x3d\x12\x62\x7b\x56\x54\x35\x42\xb8\xa1\xc4\xbc\xfd\x4a\x35\x32\x71\xbf\x52\xf3\xaa\xa1\xa8\x76\x6d\x56\x43\x9b\xce\x4f\xa2\xee\xfc\x0c\x12\x83\xbb\x14\x61\xb2\x6f\xd4\x34\x6a\x7b\xb3\xde\x10\x7a\x83\x06\x6d\xf1\x36\xe0\x03\x50\xf1\xd4\x0e\x64\xd3\x9a\x88\x32\xb0\x2c\x43\xe7\x0a\x21\xb6\x51\xb1\xfb\xa8\x22\x4e\x35\x55\x4c\xb7\xb3\xa6\x54\x45\x87\xf2\x4d\x73\x00\x43\xfc\xb2\x3f\x61\x15\x7b\x08\x48\x77\xc9\xb2\x64\xfc\x17\x2b\x65\x88\xca\x93\x46\xbe\x70\xf0\x71\x45\x9a\x98\xf7\x22\xe3\x18\xb1\xd9\x95\x88\xea\xd6\x2d\x77\x5a\xf1\x05\x3b\x83\x6f\xbf\xed\xdc\xcb\x35\x78\xd3\xc9\x21\xf0\xef\x2a\x10\x2c\x2e\x40\x21\x1f\xfe\x73\x11\xaa\x03\x50\xdc\xc2\x2f\xdb\x3e\xdf\xd7\xda\xe6\x11\x2b\x8d\x57\x67\x5c\xdd\x74\x29\x46\xb6\xf2\x72\xf5\x48\x7c\xfd\xf2\x15\xb1\x77\x5b\xd9\x97\xba\x18\x98\xf6\xad\x8c\x35\x8f\x58\x69\xb4\x8d\xb9\xba\x79\xf0\xb6\xea\x59\xfc\x6e\x5b\x04\xf8\xc3\xd9\xbf\xea\x52\xaf\x2b\xd1\x12\xd4\x0e\x5a\xca\x82\xdc\xd9\xd2\x07\x56\x6a\xbe\xe6\xd9\x0b\xf2\x4a\xa8\x22\x67\xa5\xe7\xb6\x3e\x94\xe1\xba\x4f\xa9\xf5\xfa\x5e\x58\xf2\x94\x8d\x6f\x19\xcd\x35\x88\xc7\x5d\xd1\xc0\xbf\xe8\xe8\x53\x70\x43\xb4\xc1\x83\xf3\x99\x0b\xac\x1b\xd9\x1c\x6f\x5f\xb8\xcc\x3d\x64\x76\x3e\x28\x6b\x12\xee\xf5\x6b\x5f\xf2\x87\x9c\xc4\xec\xf6\x44\xc5\xf4\xf9\x08\x3e\xe3\x02\x9e\xab\x73\xa2\x8a\x1c\x3c\x3f\x98\x90\x2b\x9e\xf2\x84\xe6\xc9\xb2\x52\x8a\xb9\x7c\xce\x30\x0b\x37\x20\x78\xe5\x9e\x1d\x90\x23\x99\xc3\xc8\x11\x15\x24\x61\x2e\xa3\xc9\x9e\xb3\x25\xca\x8e\xc7\x0f\x4d\x5c\xc8\xbd\xda\x2f\x91\xce\x74\xc6\x89\xd8\x71\x6c\xcb\x8f\x2a\xe5\x6c\xce\x4a\x92\xce\x85\xa1\xf3\x13\xf2\x6d\x53\xa3\x72\x38\x32\xee\x89\xc7\x02\xea\xc3\xe8\x7d\x3b\x69\x70\xab\xe6\xe0\xc7\x03\xd3\x76\x2d\x71\xce\xf5\x25\xcb\x64\x27\x09\x01\x5f\xa9\xd9\xe3\xb8\x36\x37\xa4\xe2\x50\xa8\x94\x6a\x68\x0b\x9c\x6b\x1e\x15\x09\x35\x62\x35\x5a\xe3\x26\xe4\xec\xd5\xc5\xe5\xab\x97\xa7\xd7\xaf\xce\x5e\x90\xaf\xed\x48\x3c\x94\xf0\x26\xe4\x3a\xac\x06\x15\x44\xf4\xda\x92\x3b\xfe\x5b\x23\x4b\x86\xa8\x28\x8b\x3b\x42\x8d\x0f\x2a\xc8\xb9\xe0\xba\x2c\x8f\x8c\x71\x67\x89\x14\xcc\x75\x0f\xcd\xa4\xb5\x06\xce\x39\x46\x83\x08\x3b\x98\xf9\xb9\x3a\x1a\x9c\x0e\x2c\xb5\xea\xa7\xb2\x45\x11\xbc\x07\xd1\xa2\x04\x6e\x5f\xe2\xbf\xab\x7f\xda\x55\xf6\xf5\xd5\x68\x5d\x82\x13\x5a\xff\xcb\xfb\xc8\x0c\x7c\x61\x76\x57\xee\xa6\xa1\xa5\x35\x31\x6c\xe6\x70\x72\xe8\x04\x8a\x64\xa5\x08\xbf\x1f\x34\xac\xe8\x55\x45\xb6\x09\x21\xef\x5d\xc8\x36\xa4\x1e\x37\xd7\xf3\xc7\xea\x10\x41\x55\xf8\x1a\xca\xba\xc4\x98\x62\x1a\x7e\xd4\x96\x00\x9b\xf3\x5b\x26\x70\x61\xfd\x52\x28\xf7\xf9\xce\xdd\xd1\xca\x79\x5b\xfd\xe3\xf2\x4d\xbf\x33\xc3\xf3\xd7\x79\x5e\xf6\xd8\xda\x59\x45\x32\x4d\xb1\x5e\xd4\xc2\x27\x18\x96\x39\x82\x9e\x2a\xf4\xa6\xf9\x60\xe5\xab\xd9\x16\xe4\xaf\xd1\x33\xf7\x52\x4d\xd3\xf1\xb7\x6d\x52\x82\x28\xc5\xdc\xee\x75\x98\x6d\x91\x35\xe5\x8a\xa7\x58\xd2\x7e\xe2\x3f\x7e\x72\xf9\xea\xf4\xec\xed\xab\x49\x1a\x3f\x38\x69\x61\x22\xce\x24\x17\x5a\x6d\xd7\x6f\xb6\x75\x9d\x69\x4f\x7e\xfc\x47\xbb\x72\x67\xff\xa2\xc3\x31\x77\x23\xa8\x4b\x17\x33\x4d\x79\xa2\x82\x3d\xd4\x32\x93\x89\x9c\x37\x97\x5f\xee\xb0\x39\xbf\xc1\xfa\x32\x63\x3a\x36\xbb\xde\xaf\xa8\xdf\xa6\x8f\x46\x5d\xca\x2f\x3b\x62\x97\x6b\xf5\x52\x33\xb4\xbb\x78\xa2\xcb\xbd\x17\xe1\x6c\x05\x06\xa8\x48\xc2\x01\x76\x25\xfb\xca\x1a\x78\x41\x0f\x9b\xb6\x52\xdb\x7d\x83\x6e\xbb\xc0\x66\xe8\xcf\xf6\x46\x45\x55\x98\xb9\x77\xaa\x04\x2e\xcb\xd9\xd8\x97\x6b\x82\xd6\x2a\x32\x0f\x18\x6e\x48\xef\x9c\xf5\xc6\xd9\x7a\xf0\xa9\x64\x59\xb7\xe2\x94\xf2\x91\x37\x7d\x61\x8d\x81\x24\x59\x96\x65\x20\xad\x16\x4d\xe7\x58\x86\x29\xb7\x66\xe2\x2c\xe7\xb7\x3c\x61\x73\x28\xc5\xca\xc5\x3c\x48\x7f\x0d\x13\x66\x6d\x69\xd6\xaa\xd1\xf5\xad\xf9\x2b\x28\xba\x0d\x78\xf1\xee\xfd\x35\x54\xf5\x05\x07\xd7\xde\x42\xb8\xf9\x20\x9c\xb7\xf1\x78\x0c\x26\x83\xa3\xbf\x1b\x79\x32\x4e\x8e\xc9\xf7\xcc\x7e\x47\x42\xd9\xe1\x1c\x5a\x01\x2d\xa4\xaf\x01\x0b\x73\x2d\x21\x0b\xe8\x88\xee\x7d\xfb\xd4\x89\x79\xd2\xc8\x4a\xc8\x6a\x2a\xcf\x43\xe7\x53\x2c\xdd\x88\x3e\xa6\x87\x97\x3d\x7b\x24\xfb\x3b\x53\x39\x67\x5a\x6d\xc2\x4f\xef\xf8\x71\xf4\x90\x12\xb5\x4c\x13\x2e\x6e\xca\xba\x60\x33\x69\x70\x08\x53\x13\xb8\xb8\x71\x18\x9b\x33\x9a\xac\xa7\x94\xbb\xe0\x47\xaf\x54\x52\xef\x60\x01\x04\x0b\x9d\x39\x67\xff\xed\x8e\xbd\x75\x43\x87\x24\xee\xe0\xe0\xc9\xad\x97\xab\x6e\x6d\xf0\x0f\xe1\x85\x0a\x4d\x13\xe4\xfc\xea\xe5\xd5\xf9\x83\x5a\xa8\xd7\xb1\x04\x98\xdd\x23\x4a\x75\xfc\xe7\x6d\xde\xe1\x31\x49\x8a\xed\xcf\xa0\x7a\x77\x21\x73\x4d\x93\x9e\x88\x40\xb4\xa0\xd9\x69\xa1\x17\x67\x5c\x41\x0d\x85\xae\x42\xc0\xca\xfb\x41\xa4\x33\xd6\x6e\x76\x05\x03\xb9\x43\x07\xfb\xdc\xcb\xff\x3e\xbd\x20\xb4\x30\xfb\xab\x6d\x71\xd1\x5e\x1d\xee\x6e\x66\x57\x98\x61\xb0\xe3\xba\xec\xdb\x5b\x56\xe5\x9e\xba\xef\x35\xdd\x47\x1c\xee\xe0\x8b\x00\x1a\x8a\x14\xec\x09\xfb\x1f\xb8\xe0\x9a\x53\x2d\x5b\x36\x2a\xab\xa0\x40\xe5\x5d\x6f\x10\x28\x94\x96\xa9\xc5\xe0\x73\xf7\x04\xb8\x90\x81\x8b\xaf\xbc\x54\x5a\x0b\x40\x7a\x07\x88\x9d\x0b\x23\x6b\xd3\x88\xd5\x02\x20\x47\x50\xf4\x13\xc7\xe6\xfe\x99\x3f\x5b\x03\x15\xd4\x07\x4b\xfe\xf2\xa2\x52\x8a\x7d\xa5\xaf\x85\xb3\x52\x94\x4d\x13\x7a\xb5\xf8\xf0\x9f\xbb\x12\x05\xfe\xb3\xa8\x59\xda\x70\x81\xff\xa7\xa0\x09\x02\xe6\x5d\xdf\x66\xa9\x2a\x90\xbb\xce\xb7\xba\x43\x76\xea\xe5\x76\xbc\xf3\x5a\x7a\xa1\xb0\xf2\x18\xae\x47\xe7\x54\x28\xb3\x47\x55\x5d\xec\xd0\x3a\x9e\x0e\xc9\x91\x8e\xb2\xd6\xbd\xfb\xef\x29\xb4\x3d\x29\x44\xa5\x91\x33\xcc\xfc\x1a\xb7\xe5\x8d\x0f\x6d\x6f\x3b\xc9\x7b\x71\x0d\x01\x96\x77\xb5\xaa\xd8\xb7\xfc\x6e\x85\xeb\x42\xd6\x4f\xde\x70\xa5\x5d\x43\x06\xb8\xc1\x95\xad\x23\x0c\x72\xd7\x85\x51\xe4\x78\xf6\x37\x1a\xc7\xf9\x0b\xe4\x52\xae\xfb\x72\x0e\xd2\x97\x2b\xf2\x45\x85\xf7\x25\x1e\xe9\x65\x66\x0b\x00\x5e\xbf\xbc\x20\xd8\x20\xe5\x4f\x5f\x62\xe7\xd7\xdf\x7f\xf1\xe5\xb3\xd6\xdb\xfd\x78\xc1\xe3\x3b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x57\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\xff\x3f\x7b\xd7\xd7\xdc\xb6\x6e\xe5\xdf\xfb\x29\x30\xee\x83\x6f\x66\x24\x39\xb9\x73\xb7\xb7\xd3\x7d\x72\xec\xe4\x56\xdb\x24\x57\x1b\x25\xdd\xe9\x74\x3a\x3b\x10\x09\x4b\xac\x29\x80\x4b\x80\xf2\xd5\x74\xfa\xdd\x77\x70\x0e\x40\x02\x94\x28\x12\x14\x2d\xdb\x89\xf4\x92\x98\x24\x48\xfc\x3d\xff\xcf\xef\xe8\x55\x2e\xe9\x7d\x3f\x09\xe6\x1c\x67\xf7\xa4\x71\x76\xa4\xcc\x28\x41\x22\x11\xb8\x5d\xdc\xa6\x90\x62\xb8\x4b\x76\x90\xe2\xcc\x9e\x1f\xc5\x69\x9d\x9b\xf6\x5d\xe4\xef\x1e\xd7\x19\x6f\xcb\xdf\x54\x21\xec\xb7\x9f\xe6\xff\xfb\xe1\xfa\xed\xbb\x0f\xd0\x53\xe3\xbf\xd7\x5b\x23\xe1\xbd\xe3\xa7\xba\x6f\xb5\x2e\xca\x6b\xfb\x84\x84\xb9\x65\x78\xcd\x21\xc3\xc9\xa7\xf7\xf3\x50\x5f\xcc\xb1\x02\x3a\xbf\xeb\x34\xf6\xd3\x5a\xdb\xa0\xaa\x09\xcb\x87\xcb\x1f\xe9\x6d\x94\x73\x80\xb4\x3c\xfd\x4b\xaf\x14\xf6\xf0\x68\x15\xa9\x75\x05\xc8\x33\xf0\x3b\xe8\xf1\xe2\x1c\x0c\xee\x71\x78\xa4\xb9\xea\x2a\x07\xe4\xe1\x89\x45\x97\xd8\xca\x8a\x00\xfa\x90\x22\x6d\xcb\x35\xcd\xd6\xd4\x9a\xc9\xb2\xfa\xc2\x33\xdd\x29\xd9\x3e\x78\xe6\x10\xea\xb5\xf7\x05\x5e\xb9\x32\xcf\x17\xe3\xe5\x52\x34\xc1\x99\xdb\x08\x05\x6a\x94\x57\x99\xd1\x68\xd0\x82\x2a\xd5\x25\xbc\x02\x49\xee\xa7\x27\x80\xf0\xd9\x01\x03\x69\xcb\xf7\x85\x6e\xe4\xb2\x61\x3d\x4b\x2e\x68\x85\x6c\xa1\x8f\x4c\xd8\x0c\x44\x37\x9d\xee\x89\x97\x8f\x9c\x56\xdb\xf9\x9f\x9e\x8a\xce\xd0\x4a\x4e\xb6\x12\x4a\xf0\xde\x51\xf2\xfb\x9a\xfb\x07\x7a\x06\x4f\xdc\x54\x65\x6c\x9c\x1a\x8f\x10\x41\x59\x3a\x23\xb4\x3c\x67\xd9\x85\xe0\xd6\x2d\xe1\x3b\x25\x4e\x2e\x82\xc4\xd3\xdb\x81\x0e\xdf\xcb\x4d\xf1\x0c\x35\x06\x0f\x1a\x0c\x12\x07\xe7\xa4\xe8\x26\x76\xc6\xa6\xb7\x46\x34\xb3\x09\x27\xd2\x6c\x48\xd2\xbc\x23\x07\x63\x9d\x22\x57\x0f\x22\x0f\x4f\xf5\xf6\x1b\xd6\x62\x15\xcc\xbd\x9d\x54\xac\xe7\x78\x7a\xb0\x8f\x4f\x7c\x82\xe6\x70\x82\x6a\x00\xe7\x4d\x27\xe9\x31\x0e\xd2\xd3\x1e\xa0\x63\x19\xd5\xe3\x66\xf9\x0e\x2a\xa4\xdb\xed\x16\x38\x54\xdb\xcc\x18\x13\xf4\x22\x55\xd4\x82\x82\xc9\xc5\x39\x71\x83\x51\x87\x5c\x60\x09\xca\x10\xc2\x60\xdb\xa0\x01\x17\x81\x9e\xd3\x54\xcf\xaa\xe0\x2e\x44\xb4\x49\xe3\x1d\x11\x44\x59\x5e\xd3\xcc\xd6\xe4\x16\x0f\xfc\x81\xe6\x31\xb9\x9e\x4d\x87\xa1\x06\x01\x71\xd6\xb8\x93\xba\x21\x7a\xf9\x91\xd6\x55\x4b\x2c\x73\xb3\x62\x50\x5b\x91\x2c\x12\x25\xab\x9a\x7e\x4c\xb9\x7a\xa5\xa6\x82\xa5\x2f\x4b\x9f\x65\x7d\x6e\xcd\x9b\x1c\x86\xc9\x89\x88\x14\x4d\x6d\x11\x01\x53\x26\xe7\xf5\xeb\xd7\x68\x0a\x7b\xfd\xf3\xcf\x3f\x63\x65\xa5\x98\x45\xc9\x7a\xf7\x41\x78\xea\x3f\xde\xbc\x99\x90\xbf\x5d\x7f\xfc\x00\x95\x1f\x33\x25\x11\x95\x04\xdf\x8c\x95\xe0\x9d\xc6\x72\x44\xfe\x6b\xfe\xeb\xa7\xaa\x4c\x8c\x7f\xd7\x14\xd4\x36\xc3\x9b\x90\x5b\x27\xfe\xc9\x35\x74\x51\xb5\x32\x05\x8d\x14\xa1\x77\x77\xb8\x31\x16\xb6\x9c\x2e\x1e\x38\x9b\x3d\x0e\x55\xc1\xb1\xfe\x88\xde\x12\x29\x04\x66\x69\x95\x1c\x4d\x83\x16\xd9\x00\xe3\xcc\xe0\x5d\x25\x99\x84\xae\x8c\xb0\x96\xfc\x9d\x84\x2a\x24\x15\xfc\x5f\xce\xa4\x16\x4a\x4d\x75\x45\x7c\x59\xb5\x32\x92\x75\xc6\x7a\x78\x0c\x0f\x50\xe7\xea\x18\xbe\xe9\xde\x9c\x21\x0b\xdf\x6a\xb0\x8b\xab\x32\xf5\xff\x44\x6f\x68\x5b\x90\xf0\x23\x79\x64\xbc\xbe\xce\xca\xde\xe0\xd2\x19\x94\x80\x8a\x4e\xd0\x54\x40\x25\xaf\x72\xa5\x2b\x2e\xe6\x14\xbd\x6f\x1f\x4a\x30\xf8\x62\x28\x00\x2f\x12\xaa\x8f\xb4\x73\x39\x1f\x3f\x5e\xc4\xb6\xf6\x70\x15\xe8\x42\x14\xca\xfa\xb0\xcd\x7d\x48\xc0\xc6\x2a\xeb\x01\x30\x92\x3d\x90\x27\xfb\x20\x10\x07\x83\x98\xfa\xfe\x66\xe0\x09\xbe\x28\x31\x22\x8c\x46\x2b\x72\xcf\xb6\x63\xa4\x5b\x19\x85\x6c\x1e\x98\x95\x5b\x3d\x17\x5e\xe1\x93\xaa\x76\x8d\x96\x8f\xcd\x94\xd9\xc0\x00\x87\xfb\xd8\x6c\x20\x2b\x84\x4a\x23\x2f\x19\x18\x51\xee\x58\x0a\x2c\x56\xb5\x53\x8f\xb8\xc4\x0d\xc5\x62\xe4\x7e\x92\x8a\x3e\x6f\x2c\xd6\xcd\xe4\xa1\x2f\x57\xd1\x10\x9a\x0e\x1a\xee\x56\xf0\x9d\xd6\xa6\xf8\xb6\x11\xfe\xe0\x83\xd4\xa2\x33\x3b\x11\x15\x50\xce\xcf\x54\x72\x32\xcf\xda\x59\x2a\x27\xc2\x4b\xa2\x91\x4c\x15\x66\x6a\xb0\x5e\x58\xc1\x53\x26\x25\x49\x60\x84\x6b\x9a\xdf\x33\x0b\x18\x43\xd3\x09\x99\xe9\x4e\x96\xf8\x55\x08\x8b\xbc\xc1\x10\x3b\x7d\x66\xdd\xec\x20\xfd\x91\xcb\xc9\xe4\x12\x09\xfc\x9e\x5c\xa1\x80\xfd\xd1\x0f\x53\xb7\x07\x96\x6e\xad\xb4\x77\x26\x11\x19\x58\x8b\x7c\x80\x7c\x2d\x20\x0b\x4e\xad\x2c\x03\xa3\x9d\x41\x94\x76\x87\xd3\x03\x00\xb6\x2f\x6e\x79\x1f\xd4\xf2\x4e\x7e\x0b\xff\xd7\x1f\xad\xbc\x17\x56\x79\x13\x52\xb9\x59\x29\x73\xda\xc2\x31\x9c\x8f\x80\xd8\x5e\x07\xc1\xbc\xda\x9f\x6f\xa4\x04\xb9\xc3\x43\xe9\xe9\x24\x23\x1a\xd0\xa7\x94\xbd\x28\xa1\x70\x7a\xb7\xaf\xea\x9c\x4d\x16\x74\xe4\x65\x4b\x43\xf5\x0c\x3c\xbd\x34\x18\x56\xcb\x85\x04\x8b\x87\xf5\x5f\x88\xb8\x58\xff\x75\x73\x06\xd6\x7f\xbe\xc2\xe6\xa4\x25\x95\x44\xdf\x8d\xe2\x87\x29\x55\x02\x30\xbb\xab\x23\x38\x21\x1f\x0d\x53\xc0\xcd\x48\x17\x52\xa4\x85\x2a\x33\x99\xf6\x70\x0c\x78\xa9\x45\xf8\xc6\x94\x52\xfb\x98\xc3\x3f\x80\x73\x22\x59\x0e\x65\x25\xf8\xeb\x75\xc4\x43\x6b\xee\x7d\xb3\xc1\x24\x47\xcc\xa1\x15\x25\x7a\xcf\xa3\x7d\x41\x89\x3b\x61\x63\xa9\x3d\x19\x07\x22\x49\x94\x44\x01\xca\x8a\x2b\xa6\xd0\x53\xf0\x10\xbb\x59\x6d\x4c\x5f\x8d\x61\xe2\x7a\x36\xed\xa5\x01\x38\xed\x1b\x74\x00\xf7\x89\x6f\x58\x0b\x98\xa2\x16\xe0\x96\xdd\xb9\xad\x46\x6e\x4c\xca\x9a\xec\x3c\x7b\x31\x72\xa7\xdb\xef\x35\xb1\x74\x83\x4e\x7d\x0c\x3d\x34\xf6\x54\x64\xd5\xc1\xdd\xb3\x5e\x47\x38\xc4\xcf\x5d\xe4\x3c\xa1\xf8\x08\xf3\x11\x54\x2e\xdd\xfe\x76\xab\xd9\xc1\x60\xc9\x1c\x4a\xdb\xa0\x3e\xe8\x28\x96\x99\x88\xff\x64\x4a\x49\x73\x2e\xb0\x80\x9c\x1c\x61\x6d\x1c\x39\x42\x85\x51\x4b\x11\x8e\xaf\x38\x77\x4c\xee\xbd\xe5\x86\x5e\x55\x8e\x8e\xa9\x73\xa4\x17\x10\x46\x3e\x0b\x5d\x45\x72\x64\xd9\x22\xe2\xb0\xa6\x7e\x85\x50\xbc\x35\x35\x6f\x2a\xeb\xbc\x47\x2b\xb6\xa6\x88\xe1\x67\x87\xa7\xa9\xcc\x43\x9e\x28\xc5\x10\x4b\x89\xe5\x6b\x49\xc4\xdd\xc8\xf3\x19\x5c\x6c\xde\x5c\xf4\x29\x07\x73\x64\xc5\x1e\x52\xad\xc2\x00\x93\x31\xf3\x44\x36\xbd\xaf\x41\x97\x48\x01\x78\x93\xd7\x0c\x12\x9a\xc1\x6c\x70\xf6\x4e\x3e\xf0\x21\xf4\xa8\xbe\xfa\xd3\xa8\x14\x18\xce\xfa\xd3\x59\x7f\x1a\x44\x7f\x72\x18\x8b\x25\x38\x7b\x74\x29\x37\x60\xd8\x2a\x54\x55\x22\x93\x03\xc0\xa3\xb7\xa6\x55\xa5\x44\xee\x5b\xdc\xb4\x3e\x74\x69\x15\x2c\xb3\x8f\x0b\x75\x37\xfe\x23\x61\x3c\x12\x31\x2e\xbe\x7e\x7f\x2e\x15\x88\x36\x95\x4e\xe2\xf6\x65\x6d\xbf\xe5\x5a\xed\xe0\xdd\x7d\x97\xae\x17\x1d\xb0\xae\xc0\xf7\x03\x31\xf8\x8a\xad\x97\xc9\xc4\xb6\x56\xb6\xc5\x1a\x30\xfc\xbd\x72\x42\x62\x59\x69\xd8\xdc\xb6\x62\x2e\xf9\x01\x2f\x4e\xa2\xac\x18\x99\x07\x26\x6b\xb6\x16\xf9\x76\x54\x3e\xa4\x6f\x7a\xad\xcc\x13\xaf\x40\x26\x88\x8a\x5c\x6b\x80\xe9\xf6\xa5\x4a\x07\x76\x82\x4e\x2c\x1c\x94\xeb\x14\x56\x34\xc8\xfd\xf9\x5b\xa2\x02\x15\x03\xfd\xbe\x2a\xa2\x74\x57\x42\x1e\xca\x51\xa5\x76\xea\xab\x8c\x6f\xc8\x86\xe6\x01\x55\xd0\xdd\xdf\x91\xf2\x40\x9c\x6c\x12\xd9\xaf\xde\x61\x6d\xe8\x73\xc3\x34\xd0\xae\x23\x0a\x95\x15\xca\x50\x4a\x7b\x2a\x6c\xca\x7c\x79\x1a\x6a\x42\xd1\x9b\x8b\x5e\xdd\x78\x31\xf5\x85\xf1\xd7\xb3\xca\x30\xfe\x8e\xad\x35\xec\xbf\xa5\xf7\xb6\x19\xb4\x72\xb8\xfd\xd9\x6d\x31\xc4\x39\xac\x58\x64\x85\xf3\x60\x85\xd3\x13\x1d\x34\x0c\x37\xe9\x65\xb7\x31\x08\xf5\xfb\x4d\x36\xe6\xe6\x37\x6c\xad\x19\xd6\x67\x6b\xf2\x0b\xbf\x73\x87\xed\xdc\xd4\x33\x38\x7b\x6b\x3b\x6d\xc1\xb3\xb7\xf6\xec\xad\x3d\x7b\x6b\xcf\xd6\x86\xb3\xb5\xe1\xec\xad\x25\x67\x6f\xed\x20\x73\x38\x9c\xb7\x16\x45\xbd\x7d\x3e\x5b\x23\xec\x55\x0e\xdb\x93\xfa\x6b\x4d\xe1\x9e\xeb\x28\x12\x05\x57\x5f\xc4\x3d\xeb\xec\x74\xa8\xc9\xff\x3b\xef\x01\x00\x84\x06\x7d\x60\xf7\xe1\x93\x29\x07\xe1\x52\x49\x90\x6c\xd1\x47\xaa\xa0\x45\x9c\x68\xc9\xbf\xf7\x36\xb3\x2f\x70\xc1\x89\x78\xcc\xe2\xea\x86\x39\xca\x4a\xcf\xf5\x84\x5c\x93\x9c\x45\x49\x96\x98\x32\xf2\x14\xaf\xe3\xc6\x2b\x6b\x23\x24\x4a\xb2\xf4\xce\x60\xd4\x73\xb7\xd6\x4f\x25\xbf\x1b\x3a\xb8\xf7\x33\xc8\xa1\x84\x45\x32\xb7\xb5\x90\x72\xf6\x4f\xcb\xda\x4c\x6f\xbe\xb8\x6f\x70\xcd\x2b\x30\x14\xaf\xc4\x10\x7c\x2c\x4b\x4c\x82\xf5\x63\x1f\x7f\xf6\x5b\x96\xe4\xb0\x79\xe7\x2c\x12\xbc\x4b\x4d\xd5\x86\x05\xda\x79\x53\xc5\x9f\xc0\x36\xca\x62\x12\x17\x79\x59\x33\x75\x43\xd3\x24\x4e\xd4\xb6\xf4\xda\x99\xf2\x5a\x14\x4f\x4c\xb9\x8c\xb2\x9a\x46\x42\xb3\x2c\x17\x34\x5a\x31\xe9\x7c\x0d\x05\x14\x93\x44\x56\xc6\xbe\x63\x09\x38\x90\x51\xa0\x8d\x66\x90\xe9\x96\xe4\x42\x59\xc7\x7b\xc3\x07\xbf\x38\x2f\x83\xe6\xc8\xe5\x54\xbe\x05\xef\xbc\x70\x5f\x81\xbd\x4a\xee\xdc\x3f\x24\x11\x69\x6c\x21\x4c\xfe\xf8\x5a\x0b\x85\x91\xd9\x83\x9a\xf8\x01\xc0\x85\x12\x24\xd5\x0c\x5b\x13\xc4\xe6\xc6\x3f\xfe\x44\x56\xa2\xc8\xe5\xc4\x05\x1d\x78\x03\xd7\x50\xbf\xb3\x42\xa5\x22\x29\xa3\x52\x91\x37\xaf\xc9\x3a\xe1\x85\xe6\x53\xc1\xdb\x26\x5c\x0e\x72\x24\xa0\x3f\xfc\xd4\xb9\x5d\xa8\xec\xd3\x28\xf5\x64\x88\x8d\x6c\x44\x1f\x73\x92\x30\x31\x0e\x91\xc5\x6b\x82\x90\x21\xba\xee\x6c\x73\x25\x1e\xe1\x7c\xfd\x5f\x21\x16\x5b\x15\x92\x44\x69\x5a\xf8\xd9\x93\xff\x6d\x2e\x76\x01\x4f\xa9\xb0\x53\x0e\x7e\xf4\x51\x2a\x5c\x2c\x13\xa9\x5a\xea\x5b\x54\xf9\x95\x07\x1f\xeb\xce\x56\x96\x5a\x3b\x08\xcc\x95\x81\x36\x56\x22\xb6\xb6\xa5\x28\x62\x58\xcc\xf2\xb6\xaa\x94\xc4\x05\x3e\xdb\xfa\xfa\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\x26\x74\xd9\x2d\x11\x3c\x56\x6c\xe6\x9f\x02\x99\xf0\x25\x82\x9c\xaf\x8b\x54\x25\x59\x5a\x8d\xfb\xb3\x6d\x60\x08\xb9\x6b\x73\xa3\x8e\x99\x88\x62\x62\x31\xa2\x4d\x81\x7d\xf2\x87\xf2\x5d\x8c\x2b\xc4\xea\xce\x35\x3f\xc8\x68\x4e\xcb\xc9\x83\x4a\xba\xf2\x95\x31\xdf\x51\xf0\x28\x1a\x38\x4c\xdd\x8a\xa6\x55\x8f\x1d\x2f\xd2\x90\x9b\x46\x31\x4e\x79\x07\x53\xb5\x0f\xcf\x05\x8d\x88\x78\x28\x83\xc9\xb0\x0c\x4a\x6d\xb7\x18\xa1\xe6\x2d\x8d\xee\x19\x8f\xb1\x68\x14\x0c\x3b\xde\x72\xba\x36\x68\x5b\x4e\x3d\xee\x5a\x7b\x39\x32\x86\x09\x4c\xdf\xb3\x69\xc6\xc8\x75\x87\x9c\x83\x42\x06\x43\xd9\xe8\x26\x6d\xe7\x5c\xa2\xc9\x26\x4f\x36\x11\xb3\xfc\x5f\xb7\x1b\xb2\xeb\x9b\x0e\xb9\xf4\x3b\x9d\xb7\xcb\xe3\xec\x5f\x20\xf7\xa5\xe5\x1c\x40\xb5\x68\xaa\x8f\xf6\xb6\xcc\x19\xad\x2d\xee\x62\x3b\x6c\xd5\x9b\x7c\x11\x92\xf9\x7b\x99\x2f\x62\xff\x10\x7f\xa6\xb1\x90\xe4\x6d\x2a\xa2\x7b\x72\xcb\x40\xe8\x7a\xcc\xf2\x2c\xf9\x22\x7e\x4a\x08\xef\x35\x5d\xb6\xf9\xd9\xc6\x64\x2d\x78\xa2\x44\x7e\x98\x5e\x9c\xae\xec\xe4\x19\xee\xb9\x11\xa1\x4a\xef\xe6\xe7\x0c\xf6\xac\xb7\x5b\xe8\xc2\x43\xa3\x52\x3d\x83\xd3\x89\x97\x4c\x15\xb0\x9e\x67\xed\xf7\x2b\xf1\x30\x56\x62\x5c\x48\x36\x4e\x3a\x38\x74\x03\x86\x79\xcf\xb6\xe0\xc5\x0e\x1c\xa8\x69\xe6\xe9\x0c\x4a\x80\x05\x0a\xae\x6b\xce\xfd\xf9\xed\xed\x57\xc9\xf2\x89\x2b\x03\x5e\x31\x15\x5d\x45\x2c\x5b\x5d\x99\x37\x3c\xcb\x49\xb1\x44\x24\x74\x56\x6c\x3b\x64\x33\x91\x48\x53\x93\x98\x2d\xee\xc8\x0d\xcb\x56\xe5\x8b\x4f\x3d\xea\xa7\x43\x04\xce\x84\x08\x05\x42\xbd\xd4\x6d\xfc\x43\x04\x57\xf0\x0c\x39\x9b\x29\x5f\x84\x15\xa1\x38\xd5\xf6\x79\xd6\xa5\x36\x1f\x71\x72\x1e\x17\x4e\xf9\xd2\xc3\x53\x76\xe3\x3d\x7d\xb0\x64\x1b\x31\xe2\x91\xa0\xe9\x1d\x0a\xdd\x31\x8b\x89\xd8\xb0\x3c\x4f\x62\x26\x49\x49\x83\x5c\x2d\x35\x49\x4f\x3d\x6f\x67\xdc\xe6\x27\xc7\x6d\xee\xa1\x0e\x5d\x82\x3e\xe4\x91\x29\xb8\xb2\x43\xa6\x68\xbc\x4e\xf8\xb3\x23\x54\x32\xa2\x29\x9b\xfe\x1a\xa0\x7f\x98\x16\xbe\x0a\x32\x37\x17\x1d\xfc\xb4\x16\x54\xb2\xbf\x94\xfb\x86\x70\x11\xb7\x99\x54\x1f\x41\x91\x58\x52\xc5\x1e\x5a\xd9\xe1\xb8\x22\x54\xed\x4f\x82\x70\xfa\x94\x2a\xc7\xb3\xc0\x08\x74\xf6\x3c\x82\x9e\x0d\xc9\x54\xcd\xaa\x85\x1a\x27\xb1\x95\x0b\xbf\x5b\x07\xdd\xb5\x3b\xf8\x7a\x36\x25\xbf\xe0\xe3\xc3\xa2\x17\xe6\x42\xa1\x18\x78\x2b\xd6\x34\x09\x2d\xb2\x51\x6f\x5e\x47\x5f\x75\x87\x30\x2b\x9f\x25\xe6\x61\xa7\x80\xcb\x5d\xb2\x2c\xb4\x4e\x67\xf4\xb0\x67\x05\x30\xb7\x23\xba\x3c\x5f\x80\xb9\xe3\xab\x41\x38\x26\x27\x1b\x17\x59\x49\x2c\x76\x29\x81\x95\x94\x3e\x50\x22\x19\x97\x09\x38\x64\x1c\xaf\xb8\xa9\xf4\x87\xa5\x25\x31\x08\x12\x45\x9c\x11\xf9\x20\x96\x09\xb7\xa7\x57\x18\x7f\xdd\x1d\x4d\xd2\xae\x93\x71\x96\x49\x9e\x5c\x26\x91\x32\x7d\xc7\xe9\x22\xed\x12\x6e\xe0\x6f\xb5\xb2\x21\x79\x9f\xd2\x25\x61\xf0\xc7\x55\x9c\x48\xfd\x2f\x99\xcf\x3f\x80\x11\xbe\xe0\x56\x62\x06\x03\xb5\xa1\x7d\x65\x92\x02\x1e\xc4\x61\xcf\x0e\x92\x9e\x1e\xe8\x7f\x4e\x4b\x92\xf0\x58\x77\xdc\x29\x05\x87\x41\x52\xf0\x04\xe2\x21\x96\x31\xbf\x18\x36\xb0\x60\xe4\xcb\x2a\x89\xee\x67\x8e\xdd\x5d\xe4\xfa\x1a\x77\x2e\x79\x0c\xac\x7e\x6f\x48\x6a\x69\xba\x3a\x0b\x57\x8d\x9d\x96\x96\x0f\x58\x82\x31\x37\xe3\x87\x7b\x54\x4a\x11\x25\x95\xcf\x05\x6c\x34\x15\x73\x88\x81\x39\x0c\x3b\x26\x10\x0f\x42\x87\x83\xf2\xc7\x1e\x8e\x66\x57\xd3\x56\xc7\x95\x2e\x07\x4b\xb8\x1d\xf5\xa0\x43\xc0\x3d\xd3\x03\x1a\xbd\x6a\xb8\x0b\x8d\x6e\x85\xe1\x9a\x63\xc1\x86\xa9\x9b\xc5\xb3\x82\x98\xad\xcd\xb9\xb3\x7c\x25\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xd2\x36\xf6\xa9\xe1\x35\x6f\x22\x5e\x33\xae\x06\x38\x73\x99\xc8\x8a\x14\xe3\x39\x8e\xc7\x77\xb7\x36\x63\xfc\xce\x40\xae\x87\x53\xa0\x96\x5e\xba\x81\xbd\xe1\x91\xce\xdf\x06\x76\xa9\x23\xdc\xbd\xfe\xc3\x4f\x3f\xbd\x74\x34\xd3\xae\x2a\xf8\x63\xc0\x99\x76\x34\xd1\xee\xc9\x2f\x9a\x9e\xf3\x8b\xbe\xdf\xfc\xa2\xc7\x47\xa1\x1d\x38\x83\x28\x30\x36\x37\x2c\x2e\xb7\x7b\x8e\x50\xe7\xe8\xdd\xd0\xc8\xdd\x80\x2c\xa0\x61\x73\x7f\x82\x63\x59\x43\xf2\x7c\xce\xd9\x3d\xdf\x6a\x76\x4f\x9f\x58\xd6\xf0\x4c\x9e\x90\x18\xd6\x6f\x31\x6b\x27\xe0\x70\x76\xcf\x2e\x39\x3a\xa7\x24\x1c\x04\x30\xdc\x9e\xd6\xa7\x20\x55\xd5\x72\xaf\x06\x69\x93\xca\x2d\xf6\xd8\xe5\xa5\x74\xa0\xc5\x94\xd0\x27\xf0\x24\x0a\x09\x09\xd0\xc6\xf0\xf5\x22\xa4\x36\xa4\x69\xf3\xeb\xbc\xe6\x98\x29\x2f\x3f\x8d\x3f\xe6\x7b\x70\x78\x9c\x6b\xba\xbc\x10\x93\xbb\xf4\xd0\x5a\xac\xb5\x02\x48\x00\x30\x72\xb1\x70\x51\x22\xab\xa3\x73\x3d\x9b\x6a\x1d\x1c\xd2\x88\x68\x2a\x27\x64\x0f\x9f\xb7\xe6\x52\x23\x17\x58\xfe\x4e\x95\x62\xeb\x4c\x75\x5f\xf5\xb3\xc5\xfd\xc9\x2d\xee\x03\x5a\x00\x57\xc5\x9a\xf2\xb1\x3e\x51\x60\x73\xf7\xbc\x75\x35\xca\x3c\x21\xe6\xec\x20\x7b\x02\x0b\x08\x24\x17\xf8\x85\x8d\xa9\x53\xe6\xf2\x71\xcc\x9e\xf0\xee\xde\x23\x47\xbe\x5a\x3b\x69\x91\xd8\x09\x78\x35\xc3\x29\x67\xc1\x1e\x2a\x87\x39\x7b\x6a\xb8\x5a\x31\xe4\xe1\x33\x48\xc8\xa9\x9e\xf2\x25\x69\x14\xa5\x69\x9a\x8a\x07\xfc\xb6\xcb\xd7\xf4\xec\xeb\xbe\x98\x4c\xb3\x05\x23\xeb\x44\xeb\xe8\xc6\xc0\xea\x76\x07\x5d\xa6\x5a\x22\x67\x39\x0a\xbc\xb9\x71\xb6\xcd\x99\x32\x0b\x05\x0b\xad\xf5\x5b\x8e\x01\xe1\xfa\xff\x36\xaa\x08\xbe\x6d\x69\xc2\x82\xad\xe8\x26\x11\x45\x8e\xad\x95\x20\x17\xe6\x16\xf0\x86\xad\x28\x4a\x7b\x17\x16\xc3\x2c\x47\x27\xf7\xcc\xd3\xa7\xea\x26\xa8\x02\xb1\xb0\xa6\x89\x31\xfb\x2d\x91\x6a\x77\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x23\x33\xcd\x16\x82\xab\xda\x79\xed\x7c\x79\x65\x33\x87\x5b\x2f\xa8\xa6\x5d\x2b\xba\xeb\xc9\x44\xa0\xef\x50\xfc\x29\x3d\x61\x69\x12\x6d\x83\xcb\xbd\xd5\x5a\x5b\xa2\x2d\x4b\x1f\x9a\xbe\x4e\xde\x52\xc9\x62\xf2\x91\x72\xba\x44\x7d\xef\x87\xf9\xec\xed\xc7\x57\x7a\x5d\x41\x9f\x9c\xde\xee\x75\xb4\xcd\xdd\x97\x7f\x1a\x32\x5f\x64\x67\xe0\x3d\x58\xd5\x4e\xfb\x9e\x83\x1f\x34\x11\x86\x94\x7c\xa8\x1b\x58\xef\x1e\x16\x34\xab\xa7\xb0\xd6\x6b\x7e\xd6\x08\xcc\x66\x1d\x1f\x59\xe5\x33\xe1\x52\xd1\x34\x9d\xa5\x94\x5f\x67\x59\x2e\x36\xfb\xb5\x71\xaf\xaf\xf6\x41\xdb\x53\x0c\xf3\xb0\x17\x33\x9c\x7a\x70\x61\x73\x32\xad\xde\x3f\x21\x53\x55\x6a\xe1\x82\x03\x4b\xbd\xb8\x2e\x94\x58\x53\x95\x44\x17\x5a\x59\xbf\xf8\x48\x79\x41\xd3\xbd\x41\x57\x07\x87\xd1\x24\x22\x1e\x6c\xd4\x0c\x5d\xd7\xa1\xd9\x41\x59\xe3\x70\x7b\x45\x73\x4d\x9d\x6e\xe6\x7f\x0d\x6a\x2b\x15\x55\xc5\x0e\x15\x3e\xc0\x19\x9a\x79\xc1\x98\xa4\x54\xaa\xaf\x59\xac\x0f\x7d\xed\xee\x21\x82\x1f\x51\x45\x53\xb1\xfc\x33\xa3\xe9\xfe\x1d\xee\xed\x93\x1b\xf7\x69\x6b\x80\x32\x0e\xff\x62\x51\x3e\x78\x29\x89\x16\xb0\x6d\x0e\x7c\xce\x52\xb6\xa1\x5c\xd9\xe6\x58\x5c\x5d\x5e\x9a\xf1\xc3\x2e\x4a\x2a\xe3\x6b\xcc\x14\xcb\xd7\x09\xf7\xdf\x39\x87\x67\x6f\x04\x8f\x13\x34\x3b\x82\x41\x0d\x5b\xf8\xef\x6d\xde\x6a\x4d\x9e\x86\x03\xbe\x05\x1f\x5d\xd3\xe9\x8f\x3f\x15\xf8\xd8\xc2\xc8\x97\x2b\xbc\x08\x9e\x76\xaf\x6f\x3b\x33\x45\xee\xb9\x16\x0c\x01\x47\x64\x3f\xd9\x6a\x95\x13\xda\xe4\x83\xb1\x5d\x63\xec\x42\x73\xe0\xe8\xd8\xf4\xbb\xc9\x07\x71\x68\x8b\xe1\xaf\x5d\xb2\xa8\x77\xa5\x99\xa6\xee\xdb\x77\x65\x33\xcc\x64\xa9\x15\xe4\xf7\x1e\x6a\xe6\x01\x9d\x04\xaf\x6e\x32\x52\x57\x54\x7b\x9f\xd6\x56\x18\xec\x3b\xaa\x6c\x07\x89\xb1\x95\x69\x75\x04\x97\xf7\x15\xeb\xa9\x89\xff\xcb\x8d\x2a\x42\x49\x96\x30\x04\x3f\xa1\xdc\x4c\x16\x70\x16\x46\x63\x73\x51\x73\x30\xad\x12\xc2\xbd\x91\x71\x86\xa3\x71\xd9\xc4\x5a\x58\x03\x35\x45\xf0\x0f\x70\x5c\x5c\xfd\x22\x8c\x91\xd7\x24\xe9\x6a\x1a\x00\x9c\x7c\x44\x64\x11\xad\x08\x95\xba\x6b\x7a\x43\xeb\x13\xcf\x26\x6b\xca\x93\x3b\x26\xd5\xa4\x44\x09\x96\x7f\xff\xf1\x1f\x13\xf2\x5e\xe4\xc4\x04\xaa\x8f\x2c\xaa\x86\xe9\x67\xb5\x2f\x12\x89\x83\x29\xdb\x56\x5a\x6b\x26\x62\xd3\xe9\x07\xe8\xac\xa2\xf7\x9a\x87\x61\x67\x0b\x06\xae\x8b\x3f\x91\x0b\x2d\x26\x3a\x9f\xfe\x97\x66\x4b\xff\xbe\x20\x3f\x3c\x00\xd3\xbe\xd0\x7f\x5e\xe0\x07\xcb\xb0\x49\x57\xa9\xae\x3e\x8c\xc9\x92\x79\xb2\x5c\xb2\x1c\xd5\x47\x02\x49\x85\xaf\x0c\x2a\x08\x17\xce\xc3\xd6\x29\x5d\xa9\x9b\xf5\x8e\xfc\xfd\xc7\x7f\x5c\x90\x1f\xfc\x71\x91\x84\xc7\xec\x37\xf2\x23\x5a\x97\x13\xa9\xc7\xf8\xca\x38\x73\xe4\x96\x2b\xfa\x9b\x7e\x67\xb4\x12\x92\x71\x54\xe5\x95\x20\x2b\xba\x61\x44\x0a\xad\x01\xb3\x34\x1d\x1b\x5b\x3a\x79\xa0\x80\xd4\x62\xa7\x12\x12\xeb\x49\x46\x73\xe5\x6d\x89\x89\xb1\x90\xc0\xd7\xf4\xb2\x2d\xb9\xf5\x4c\xdf\x25\xdc\xf8\xaf\x8c\xe7\x4c\xaf\x39\x24\x86\xe2\x22\x29\x41\xa2\x15\xe5\xcb\x32\x37\xfd\xae\x50\x45\xce\x5a\x5c\x3f\x1d\xcf\xc0\x7d\xc2\x83\x52\x98\xff\x92\xf0\x7a\x50\xc1\x7e\xbb\xd2\x32\x51\x36\x2b\xc2\xc4\x2a\xaa\xed\x95\x5e\x85\x3c\x59\x14\x4a\xe4\xf2\x2a\x66\x1b\x96\x5e\xc9\x64\x39\xa6\x79\xb4\x4a\x14\x8b\xf4\xb0\xae\x68\x96\x8c\x23\xc1\xf5\x8a\x03\x2a\xc3\x3a\xfe\x3d\x94\x37\x1d\xeb\xae\xb6\xa0\x4e\x77\x1c\x74\xbb\x51\xed\x49\x8d\x69\x83\x8d\xb1\x83\x3d\x68\x77\xa0\x68\x9b\x39\xc1\x68\xc1\x10\x72\x35\xc8\x60\x2d\x68\x72\x38\x8f\xb9\x34\x38\xe0\x51\xfd\x1d\xfa\xd8\x61\x00\x09\x9c\x4a\x8f\x52\xae\x69\x8c\xa4\x94\xf2\xed\xa3\x6f\x7e\x3d\xa5\x00\x97\x1f\x6d\xc7\xf0\x0a\x91\x8e\x29\x8f\xf5\xff\x31\x61\x27\xda\x0e\x32\x87\x45\x12\x44\x08\xbe\x4e\x6f\x4f\x73\x24\x8a\x64\x80\x53\x6f\xe4\xb5\x8e\x42\x14\x8a\xaa\x18\xa8\x91\x17\xcc\x32\x4d\x5f\x40\x4d\xa4\x7d\xeb\x7f\x1a\xff\x4b\x89\x76\xd6\x26\x52\x1d\xf6\x9a\x38\xb2\x63\xc7\xfe\x7e\xa8\x5a\xb8\x36\x39\x08\xbc\xa2\x52\x19\x68\x2d\x8b\x41\xe0\x0d\xc3\x2a\x28\xc0\x60\x9a\x1d\xc3\x9d\xf6\x90\x8d\x17\xd0\x1d\x19\xef\xc5\x5c\x8a\x4a\xa5\xa4\x5d\x81\xaa\xf4\x17\xaf\x0e\x1a\x0e\x4a\x31\xa9\x08\xdd\xd0\x24\x05\xeb\xbc\x58\x48\x96\x6f\xb0\x20\x95\x81\x1a\xa4\x75\x3d\xcb\xd4\x9c\x40\x31\xea\x44\x9a\x8f\x1d\xc3\xee\xaa\x1c\x1a\x00\x68\x43\xb5\xde\x37\xf6\x7a\x10\xbd\x07\xd5\xcb\xc6\xdb\xfa\x0b\x3d\xd5\x18\xbd\xff\xfe\xcc\x68\xae\x16\x8c\xaa\x2f\xc9\x21\xbe\xbb\xb3\xa5\xbd\x76\x65\x29\xf7\x72\x43\x3f\x30\xb2\x14\x4a\x8b\x58\x05\xec\x7d\x94\x49\x11\xd4\xa7\xdc\x68\x8f\xbd\xa3\xab\x51\x7e\xc9\x29\xa4\xf8\x08\x1e\x38\x4c\xbf\xe1\xee\x38\x8d\x74\x6c\x76\x92\xc2\xa7\x11\x48\x43\x70\x66\xd6\x0e\xbd\x19\x40\x81\x4e\x33\xe4\x35\x93\xf2\x20\xc0\x86\x1f\x5d\x88\x4f\xe3\x51\xae\xb9\xd6\xd6\xf6\x1e\xa6\x85\x68\x01\x3a\x66\x8a\x26\xa9\x3d\xca\x38\x15\xe5\x2c\xb5\x51\xd7\x83\x03\xcc\x19\x95\x87\x04\x04\xaf\xd7\x9f\xe1\x61\xec\xb4\xe0\x6c\xfc\x20\xf2\x98\xdc\xd0\x35\x4b\x6f\xa8\x64\xe6\x5d\x6e\x8a\x1e\xae\xd1\xa5\x1c\xb4\xcb\xfb\x6d\x5f\x0d\x5d\x46\xe3\x4f\x65\x12\x86\xbf\x2a\x15\x0b\x3b\x38\xb2\x26\xc8\x2f\x79\xc1\x46\xe4\xbd\xe6\x5e\x23\xf2\x95\xdf\x73\xf1\x70\x5c\x5f\xd5\x41\x2f\x88\xd7\x53\x37\xfc\xc3\xc2\xea\x78\x06\x9f\xb2\xbb\x3d\x7b\x64\x08\x7e\x83\xa9\xd1\x67\x36\xe5\xa3\xb6\x47\xfa\xbf\x3b\x26\x28\xad\x28\xe6\x62\x99\x33\x89\xc8\x35\x7b\x41\x12\xbb\x9a\x9c\x7f\x61\xdc\x24\xf7\xb5\x76\x6f\xba\xaf\x95\xed\xa9\xe5\x6b\xcb\xea\x8e\x59\x6f\xf3\xb1\x2c\xdd\x2b\x6a\x1c\x8e\x08\x74\x3a\xda\x60\x7c\x6a\xea\xe1\x7e\xa3\x93\xc3\xf5\x9c\x67\x51\x28\x39\x64\x1d\xb5\xa3\xbb\x99\xff\xb5\x79\xb2\x1b\x79\x5f\x1b\x7f\x6a\x37\x4b\x1d\x6b\x90\x6a\x3d\x33\xad\x46\xa8\xb3\xf9\xe9\x6c\x7e\x7a\x49\xe6\xa7\xd6\x1d\x7f\xc8\xe4\xf4\x32\x8c\x4d\xad\x43\x3c\x64\x60\x7a\x96\xa6\xa5\x4e\x23\x3a\x68\x4e\x7a\xb6\x86\xa4\xd6\xa1\x75\x34\x1e\x7d\x3f\x66\xa3\xd6\x19\x3b\x60\x2a\x7a\x86\x46\xa2\x2e\x02\x19\x8b\xbb\x88\x89\x53\xe7\x61\x57\x50\xac\xca\x59\x96\xaf\xb3\x41\x39\xae\x38\xd3\x57\x5a\xd4\x02\x5c\x6b\xdf\x2e\x4d\xe7\xba\xcb\x5e\x46\x60\x34\xc5\x1e\x77\x3a\x4b\x6e\xdf\xcd\x3e\xbf\xbb\xb9\xfe\xf2\xee\xb6\x2e\xdf\xed\x9b\xe9\x16\x49\xec\xb0\x0d\x62\xec\x48\x62\x0d\x0f\x68\x82\xdc\x70\x4b\xef\x81\x86\x5b\x45\x91\xec\x6b\x75\xbc\x5c\x78\x14\x97\x3b\x8a\x7f\xb4\x9f\xce\xae\xc7\xf3\x2b\x06\x4e\x51\x13\x73\xa6\xe5\x9e\x95\x48\x63\x69\xe3\x56\xa7\xb7\x65\x26\x55\xc2\xa3\xb4\x88\xb5\x70\xf1\xf5\xeb\xf4\x56\x4e\x08\x79\xcb\x22\x5a\x48\xb0\xc2\xc4\x82\x5f\x2a\xf2\xeb\xa7\x0f\x7f\x83\x78\x6c\x78\x62\x54\xe2\x9a\x00\x2a\x6f\x42\x11\x58\x58\x21\x5c\x1b\x79\xcb\x50\x50\x81\x2f\x47\x34\xd3\x54\x4c\x62\xe5\x0a\x05\xb2\xc8\x8a\xa5\x99\xa6\x98\xf7\x8c\x54\x08\xaa\xfa\xc5\x55\x85\x79\x1b\x3e\xb9\x64\x0a\xb3\xae\x0e\x45\x48\x1e\x9c\xb5\x16\x8b\xeb\x11\xb6\x56\x4f\x7d\x34\xda\xf8\x03\x95\xc6\x62\xb5\xb7\xb7\x2d\xeb\xdb\x6e\x9f\x69\x36\x71\x34\x18\x37\x90\x3c\xc3\x5f\x3b\x7d\xd6\x9d\xad\xec\x18\x18\x44\x92\xa8\xce\xd6\xd4\xe6\x30\xa0\xfd\x75\x00\x76\x6c\x19\xac\x3e\xc9\xde\x87\xcb\x88\x6c\xa7\xcb\xdd\xfa\x02\x45\x44\x62\xaf\xf6\xa7\x89\x9f\xf3\xaf\x15\x8b\xb2\xfa\x6b\xd5\x5f\x63\x91\x21\xff\xfa\xf7\xef\x7e\xf7\xff\x01\x00\x00\xff\xff\x6c\xfc\xad\x6c\x34\x86\x0b\x00") -func olmManifests0220CrdsYamlBytes() ([]byte, error) { +func olmManifests0231CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0220CrdsYaml, - "olm-manifests/0.22.0-crds.yaml", + _olmManifests0231CrdsYaml, + "olm-manifests/0.23.1-crds.yaml", ) } -func olmManifests0220CrdsYaml() (*asset, error) { - bytes, err := olmManifests0220CrdsYamlBytes() +func olmManifests0231CrdsYaml() (*asset, error) { + bytes, err := olmManifests0231CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.22.0-crds.yaml", size: 751006, mode: os.FileMode(420), modTime: time.Unix(1678830329, 0)} + info := bindataFileInfo{name: "olm-manifests/0.23.1-crds.yaml", size: 755252, mode: os.FileMode(420), modTime: time.Unix(1687806531, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0220OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x6d\x6f\x23\xb7\x11\xfe\xae\x5f\x31\x10\x0a\xb8\x2d\xb2\x92\xec\xb3\xcf\xf6\x02\x01\xe2\xfa\x2e\xb9\xa0\xb6\x4f\xb0\xef\xfa\x25\x08\x0a\x2e\x77\xb4\x62\xcd\x97\x0d\xc9\x95\x4e\x29\xfa\xdf\x0b\x2e\xf7\x5d\x94\x2c\xfb\x2e\xb9\xa2\x08\xbf\x48\x5a\x0e\xc9\x87\xc3\xe1\xbc\x3c\xda\x28\x8a\x46\x24\x67\xff\x40\x6d\x98\x92\x31\xac\x8e\x47\x8f\x4c\xa6\x31\xdc\x11\x81\x26\x27\x14\x47\x02\x2d\x49\x89\x25\xf1\x08\x40\x12\x81\x31\x28\x2e\x46\x00\x9c\x24\xc8\x8d\x7b\x0a\x90\xab\x34\x32\x48\x0b\xcd\xec\x66\xf2\x58\x24\xa8\x25\x5a\x34\x13\xa6\xa6\x28\x17\x4a\x53\x8c\x41\xa3\xb1\x9a\x51\x8b\xe9\x81\x43\xa2\x55\x8d\x8a\x13\x8b\xc6\x8e\x5e\x06\x36\x47\x4d\xac\xd2\xe6\x05\x90\x13\x62\x90\x33\x89\x9f\x03\xd8\x23\x7c\x40\xbd\x62\x14\xaf\x28\x55\x85\xb4\xc3\x5d\x04\x55\x1c\xd5\xc8\x23\xe3\x07\x93\x6a\xb0\x97\x29\xf7\xeb\xcf\x62\xa8\x17\x9d\x10\x3a\x21\x85\x5d\x2a\xcd\x7e\x25\x96\x29\x39\x79\xbc\x28\x81\x36\x1a\xbb\xe6\x85\xb1\xa8\xef\x15\x0f\xe9\xcc\x6c\x8c\x45\x11\x53\x25\xad\x56\x9c\xa3\x8e\x1b\x2c\x9c\x2d\x90\x6e\x28\xc7\x48\x10\x49\x32\xd4\x23\x5d\x70\x34\xf1\x28\x02\x92\xb3\x1f\xb4\x2a\x72\x13\xc3\x4f\xe3\xbf\x8e\x7f\x1e\x81\x3b\x73\x55\x68\x8a\x9d\x47\x2b\xd4\x49\xf3\x33\x02\xa9\xe4\x7d\x25\xf4\xf1\xfe\x66\xa7\xdc\x67\xed\xf0\x6f\x4c\xa6\x4c\x66\x4f\xa9\x39\xf1\x62\x91\x53\xa9\x56\x1c\xef\x71\xe1\x24\xeb\x6d\xed\x59\x75\x04\xb0\xad\xd6\x17\x29\xd3\x14\xc9\xbf\x90\xda\x52\x9f\x41\xcb\xf9\x22\x06\xd2\xdc\x89\x09\x55\x1a\x95\xfb\x10\xad\xe6\xde\xdf\xdc\x5e\x2b\xb9\x60\x21\x85\x51\xbf\xc1\xad\x19\x49\x9e\x9b\x76\x86\x37\x98\x73\xb5\x11\x28\xed\x13\x3a\xdf\x86\xda\xbf\xa4\x24\xcf\x07\x03\x4c\x8e\xd4\xf5\x19\xab\x89\xc5\x6c\xe3\xe5\xec\x26\xc7\x18\xee\x15\xe7\x4c\x66\x1f\xf3\x94\x58\x2c\xad\x2f\xe7\x8c\x12\x13\xc3\xb1\x1b\x81\x1c\xa9\x55\xda\x8f\x10\xc4\xd2\xe5\x4d\x67\xa9\xd0\x62\x00\x16\x45\xee\x2e\x73\x35\xa8\xb3\x19\xd7\x78\x6f\x7c\x78\x06\x80\x1a\x72\xf9\xbd\x72\x20\xd7\x4a\x5a\xfc\x64\xdb\xa1\xba\x90\x57\xe6\x4e\xc9\x7b\xa5\x6c\x0c\x56\x17\xd8\x74\x19\xa4\x54\x89\x7c\xae\xd5\x82\x71\x6c\x87\x34\xdb\x2e\xa4\x65\x02\xdf\xe0\x82\x14\xdc\x36\x0b\x75\xcd\xe6\xee\x00\x9b\x71\xcd\x19\x29\x61\x12\x75\x67\x53\x51\xf8\xdc\x3a\xe8\xc2\x3b\x2a\x15\xc2\xb9\x5a\xcf\x35\x5b\x31\x8e\x19\xbe\x35\x94\xf0\xf2\xde\xc4\xb0\x20\xdc\x60\x4f\x96\x92\x9c\x24\x8c\x33\xcb\xd0\xf4\x67\x01\x48\xb5\xca\x63\xf8\x09\xc6\x57\x37\x37\x63\xf8\xb9\xd3\x4b\x95\x10\x44\xa6\xdd\x01\x11\x4c\x13\x26\xa7\xde\x9a\x1a\x24\x3a\x33\x7d\xa1\x28\x6a\x4c\xaf\xf7\xfc\x4f\x7f\x7e\x3f\x7f\x7b\x7f\xf5\xe1\xfd\xfd\x3f\xef\xae\x6e\xdf\x3e\xcc\xaf\xae\xdf\xfe\x65\x30\x72\xad\x99\xc5\x07\x4b\x6c\x61\x9c\x6a\x7b\xbd\xe3\x71\xe7\x27\x13\x24\xc3\x18\x7e\x29\xc8\xc6\x79\xa7\x46\xfb\x0b\x4d\x04\xae\x95\x7e\x74\x30\xbf\x33\x4b\x72\x72\xf6\x3a\x3e\x49\x4e\x17\x88\xe7\xaf\xe8\xec\x6c\xf6\xfa\x32\xbd\x4c\x4f\xe8\xd9\xab\x73\x7a\x9e\xbe\x9a\x9d\x9f\x9c\x9c\x1e\xcf\x2e\xcf\x2f\x8f\x4f\xcf\x4f\x2f\x48\xb2\x48\x2e\x5f\x5d\x24\x67\xc9\xec\x82\x5e\xbe\xbe\x4c\x4e\x16\x67\xa7\xa7\xc9\x70\xdd\x79\xc1\xf9\x5c\x71\x46\x37\x31\xfc\xb8\xb8\x53\x76\xae\xd1\x60\x73\xd8\x50\x06\x35\x6d\x07\xda\x8e\x5a\x2b\x98\x2b\x6d\x63\xb8\x98\x5d\xcc\x06\xe7\xe1\x2d\x42\xa0\x0b\xe8\xa6\xd3\xc7\xd9\x0a\x25\x1a\x33\xd7\x2a\xc1\xfe\xb4\x4b\x6b\xf3\x1f\xd0\x0e\x4f\x36\x27\x76\x19\xc3\x74\x89\x84\xdb\xe5\xaf\xc3\xce\x5d\xeb\x1b\xba\x44\x87\xe0\xdd\x87\x0f\xf3\x4e\x97\x46\x92\xb2\xaf\xb8\xbe\x45\x2d\x98\x2c\x2d\xfc\x16\x8d\x71\x47\x50\xa9\xff\x7b\xc2\x79\x42\xe8\xe3\x07\x75\xa3\x32\xf3\x5e\xbe\xd5\xba\x77\x8b\x50\xae\xfa\xd6\xe9\x35\xbc\x6d\x89\x3d\x20\x2b\xc2\x0b\xfc\x5e\x2b\x31\xdc\xd5\x82\x21\x4f\xab\xf8\x15\xe8\x99\x97\x9b\xae\xbd\xd9\x24\x7c\x0f\x02\x08\xb6\x17\xdf\xe9\x16\xda\xc8\xdf\x1b\xa4\xf1\x97\x02\xcd\xd0\xe4\x00\x68\x5e\xc4\x70\x3c\x13\x83\xc7\x02\x85\xd2\x9b\x18\x8e\x5f\xcf\x6e\x59\xd5\x27\x55\x8a\x0f\x3d\x5f\xee\x5a\x3f\x21\x53\x26\x06\xce\x64\xf1\xe9\x73\x02\x15\x25\x96\x70\x95\x3d\x2f\x58\x6d\x0d\xfa\xad\x03\x56\x00\xe5\x0b\x82\x56\x60\x96\xff\x9b\xc0\x15\xdc\xdb\x13\xbb\x82\xaf\x1c\xbc\x2a\xcc\x7b\x03\xd8\x51\x27\x82\x1d\xf5\x7a\xfa\xa1\xcf\x05\x2c\x5a\x26\x74\x82\xe4\x2e\x9d\x44\xfd\xa3\x0b\x0f\xdf\xee\x89\x4a\x8d\x7c\xab\x77\x8d\x19\x33\x56\x6f\xe2\xaa\xb8\xe9\x2f\x50\x58\xc6\xa3\x32\xea\xf4\x3a\x7e\xff\xc8\xe7\xc0\x18\xb4\x91\x5b\x82\x2b\x92\x46\x85\x41\x1d\xb1\xf4\xdb\x9e\x69\xfe\x11\x99\xdb\xf6\x47\x64\xde\x17\x99\xbf\x6c\x20\xbb\xf8\x9c\x38\xb6\x5d\x63\x1e\x5c\x13\x6f\x47\x37\x92\x65\x1a\x33\x62\xd1\xd5\xbb\x11\xa6\xcc\x0e\xc2\xd9\xee\xf9\xda\xa1\x56\x45\x24\x15\x4c\xc6\x30\x76\xd7\x6b\xfc\x9c\x81\x6e\xc9\x66\x5c\x98\x44\x08\xd5\xa9\xdb\xbc\x82\x29\x12\x43\x35\xcb\xdd\x4a\xa6\xcf\x1d\x50\x8d\xc4\xe2\xf8\x1b\x18\x17\x65\x8c\x75\xdf\x72\x17\x48\xdd\x97\x14\x39\x5a\x2c\x59\x88\x17\xac\x5a\x55\xc2\x55\x34\xaa\x98\x1f\xe3\xe6\xad\x7c\x77\x25\xeb\x9e\x30\x69\x2c\xe1\x3c\xe7\xc4\x4b\xec\x41\xdc\x82\xfa\x6d\x0f\x7c\xc5\x70\xfd\x35\x0f\xfc\x19\xe3\x1c\xd4\x2f\x62\x28\x5f\xee\xc8\xbe\x81\x66\xc9\xac\x04\xd1\x3f\xc4\x0c\xad\x13\xe1\xcc\x94\x9f\xeb\xd2\xe2\xb6\xec\x2c\x27\xf4\x91\x64\x68\x26\x87\xa1\xaf\xc4\x05\x91\x6c\xe1\x3c\x8f\xb7\xe5\xfe\xb3\x29\xa3\x4a\x1e\x86\xe5\x79\x94\x50\xd5\x5b\x82\x0f\xd8\x56\xc6\x55\x42\x78\xd4\xe5\x5a\xbb\xa9\x72\xf3\xf8\xcb\xae\xda\x4d\x0b\x87\x4b\x72\xd1\x64\xde\x96\xe8\x0c\x6d\xc3\x11\x57\xd6\x1e\x3d\x87\x19\x23\x3c\x5f\x92\x01\xb3\x58\x11\x73\xd5\xd0\x00\xbc\xfa\x7c\xcb\x8c\xeb\xa9\xe2\x41\x71\x31\x69\xe8\xe3\xd5\x6c\x72\x72\x32\x99\x35\x3b\x48\x99\xc9\x39\xd9\xf8\x64\x78\xee\xa7\x85\x87\x7a\xde\x14\x1b\xcb\x8c\xe1\x1e\x73\x9f\x4a\x18\x20\xb2\xd1\x60\x8d\x05\xec\x92\x58\x60\x06\xc8\x8a\x30\x4e\x12\x8e\xb0\xd0\x4a\x00\x81\xcc\xe5\x07\x70\xed\xef\xc1\x43\x69\x75\xb0\x5e\x32\xba\x84\x35\xe3\xbc\xb4\x44\xbe\x42\xb0\x0a\x48\x58\x01\x93\x11\x80\x60\xf2\xef\x45\x82\x8d\x36\x8f\x27\xc7\xc7\x13\x17\xa1\x1f\x71\xb3\x56\x3a\x75\x06\x79\x34\xb4\xd9\xa3\x6f\xe0\x48\x71\xe1\x3e\x6a\x8d\x1d\x39\x0b\x16\x84\x75\x73\xfa\x3a\x9b\xbf\xc7\x14\xde\x11\x9f\x29\xa1\x20\x8c\x97\x87\x26\xcd\x92\x2d\x6c\x6b\x0d\xdf\x69\x4c\x97\xc4\xba\xe3\x1b\x01\xe4\x5a\xad\x58\x8a\x55\x98\x1d\xce\xc3\x99\x7c\xec\x2d\xb1\xa5\x61\x80\x42\xf3\xb8\x4c\x54\x4c\x3c\x9d\x66\xcc\x2e\x8b\xa4\x34\x8d\x50\xda\xb8\x93\xdd\x9d\x5a\x8d\x38\x15\xc4\x29\x6f\x9a\x3f\x66\xd3\x6a\xbf\x51\x63\x22\x95\xd7\xb9\x55\x29\x56\x88\x7c\xa5\xf4\x7e\x2d\xef\x7a\x45\xba\x29\x72\x97\x02\x61\xda\x94\x5c\xb5\xe8\x03\x93\x19\xc7\x43\xa5\x6f\x0b\x6e\xd9\xa1\xc2\x57\x9c\xb7\xb7\x68\x87\x6c\xb5\x03\xaf\xe9\xa6\xe6\x85\xb4\x2d\xb4\x61\x50\x59\x56\x5e\x79\xee\x32\x34\x53\x7a\xe4\xba\x27\x7a\x61\x31\xe8\x8a\x52\x8e\xbd\x4a\xb0\x75\xbc\x83\x8c\x7a\x07\x9d\xff\x44\xf6\x17\x41\x45\xd4\x13\x4a\xd1\x18\x8d\x2e\x46\x75\xd3\x6d\xef\x7e\x87\xd9\x7b\x99\x8d\x0c\x1e\x66\x68\x9f\xc2\x39\xe0\x14\x83\x98\xca\xda\xc0\x97\x6c\x7b\x71\xf4\x17\x74\xbf\x5d\x64\xe8\x3d\x28\x43\xc4\x01\x98\x82\x61\xeb\x00\x9c\xbd\x58\xfb\x3b\x61\xdd\x1f\x6b\x9f\x06\x3d\x74\x5a\x2f\x86\xdd\x5e\x84\x8e\x99\x87\xe3\x85\x6f\xdd\xab\x02\x30\xe4\x91\xea\x16\xe6\x93\x3a\xdb\xea\xf6\x0c\x6b\x16\x41\x3e\x7d\x94\x4d\x44\xf0\xe4\xd3\xa0\xff\xa1\xd0\xd9\xa0\xa7\x25\xab\x4e\x7a\x8c\xca\xb0\xa2\x81\x30\x79\x55\xb7\x92\x7e\x0a\x6f\x7d\xc8\x64\x35\xb3\x0d\x18\xad\xba\x0d\x99\xad\x83\x96\xd8\xd6\x30\x3c\x45\x0c\xc1\x7e\xda\xab\x33\xc7\x0e\xfa\xab\xd9\xde\x6e\x1a\xac\x9d\xe4\x65\x1e\xd0\xb7\x70\x8d\x59\xb7\x5d\xb5\x66\x5f\x2a\x44\xad\xf9\xb6\xdf\x70\x0f\x56\xe5\xf3\x98\xb6\x0a\xd4\x1e\xbe\xcd\xb7\xdd\xac\x5b\xbd\xad\x2d\xee\xad\xde\x55\xc9\xc0\x6d\xc5\xe6\xa1\x54\xb4\xfa\xf6\x34\xf4\xd8\xbf\x24\x80\x91\x0b\x8c\x81\xfe\xf1\xd9\xe9\xe9\xab\x71\x70\x60\x95\x45\x87\xe8\xf8\x5a\xa8\xcf\xec\xf9\xf6\xb5\x98\xac\xce\xea\x5d\x3e\xeb\x8a\xaf\xc9\xc6\x6c\xc9\x05\xf8\x2c\x08\x71\x5a\x4e\x3d\x5b\x52\x7b\xd8\x2b\xdf\x76\x70\x48\xbe\x75\x39\xa1\x87\xa0\xc4\x5e\xae\xa9\xc5\xbf\x03\xdd\x3e\x72\xeb\x7f\x00\xde\xcb\xb9\xaf\x7a\x7b\xc1\x1c\xa8\xee\x0c\xf3\x60\xbe\xed\x60\xc3\x7c\xab\x39\xb1\xb3\x96\x13\x6b\xdb\x4a\xf1\x42\xe0\xad\xf3\x69\x41\xab\xf1\x9e\xc7\x8a\x7c\xb1\x6d\x6a\x00\xc2\x8d\xf3\xff\x72\x4d\xad\xc8\x47\xa1\xb9\x77\xba\xb3\xf0\xa4\x28\x72\xbb\x79\xc3\x74\x0c\xff\xfe\x4f\x59\x9d\xd8\xd2\xab\xc5\x50\xd6\x86\xbe\xe2\xee\x57\x6f\xe5\xab\x23\x95\x7b\x4e\x71\xc1\x24\xb3\x6d\x76\xab\xd6\x12\xd3\xba\x12\xcd\xfc\xfb\x25\x7b\x93\x94\x0a\xd0\xaa\xf3\xda\x90\x7f\xe2\x8b\xd2\xaa\x66\xb9\xad\x12\x94\x9a\x63\xec\xfa\xe7\x61\xf2\x12\xaa\x2a\x07\xe3\x7b\xa5\xe5\xd5\x50\xa8\x2c\x24\x1b\xf3\x80\x0c\xa5\x83\x8d\xa9\xaf\x29\xf1\x13\x33\x96\xc9\xac\x5f\x54\xba\xb2\x34\x05\xbb\x44\xa6\xc1\xbf\x65\x72\xdb\x66\xac\x6d\x72\x74\xb7\x33\xb0\x84\xdc\xc5\x8b\xaa\xf8\x2e\xaa\x3d\xef\x8d\x2d\x8b\x84\xa9\xa8\xfd\x3f\x66\x07\xc9\xe0\x75\xf0\xa1\x0c\xe8\x99\xce\xe9\x68\xa7\x5f\x2e\x27\xac\xff\xe0\x69\xff\x4c\xe9\x9d\xc6\xb5\x12\xa2\x90\xcc\x6e\x9a\x0a\xde\xa9\x28\x2f\x12\xce\xcc\x12\x75\x4b\x8d\xbc\x2b\x12\x5f\xb0\x78\x7e\xf3\xa1\x97\x1c\xd6\xff\xd8\xcc\x55\x5d\x90\xb9\xfa\xcc\xa2\x5e\x11\x1e\xc3\xeb\x99\x18\xfd\x37\x00\x00\xff\xff\xfd\x1b\x85\x88\xff\x27\x00\x00") +var _olmManifests0231OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\x1b\xb9\x11\x7f\xd7\x5f\x31\x10\x0a\xb8\x2d\xb2\x92\x95\xc8\x89\x6f\x81\x00\xe7\x3a\xb9\xcb\xa1\xb6\x23\xd8\x49\x5f\x0e\x87\x82\xcb\x1d\xad\x58\xf3\x63\x8f\xe4\x4a\xd1\x15\xfd\xdf\x0b\x2e\xf7\x5b\x94\x2c\x3b\xb9\x4b\x51\x84\x2f\x92\x96\x33\x9c\xe1\x70\x38\x1f\x3f\x6d\x14\x45\x23\x92\xb3\x7f\xa0\x36\x4c\xc9\x18\xd6\xb3\xd1\x3d\x93\x69\x0c\x37\x44\xa0\xc9\x09\xc5\x91\x40\x4b\x52\x62\x49\x3c\x02\x90\x44\x60\x0c\x8a\x8b\x11\x00\x27\x09\x72\xe3\x9e\x02\xe4\x2a\x8d\x0c\xd2\x42\x33\xbb\x9d\xdc\x17\x09\x6a\x89\x16\xcd\x84\xa9\x29\xca\xa5\xd2\x14\x63\xd0\x68\xac\x66\xd4\x62\x7a\x24\x4b\xb4\xae\xb5\xe2\xc4\xa2\xb1\x0f\xb1\x91\x22\x65\xf6\x31\x72\x4a\x86\xc7\x4a\xd9\x10\x2d\x1f\x23\xc4\xd1\xef\xc8\x78\x9a\xd9\x73\xd4\xc4\x2a\x6d\x9e\x60\xfc\x84\x18\xe4\x4c\xe2\x37\xd3\x3b\xd3\x7b\x5b\xdf\xa1\x5e\x33\x8a\x17\x94\xaa\x42\xda\xe1\x79\x04\xdd\x3e\xaa\xcf\x20\x32\x9e\x99\x54\xcc\x9e\xa6\x3c\x39\x7f\x3f\x86\x27\xac\x13\x42\x27\xa4\xb0\x2b\xa5\xd9\x6f\xc4\x32\x25\x27\xf7\xe7\xa5\x96\xcd\xd9\x5f\xf2\xc2\x58\xd4\xb7\x8a\x87\x4e\xdf\x6c\x8d\x45\x11\x53\x25\xad\x56\x9c\xa3\x8e\x1b\x5d\x38\x5b\x22\xdd\x52\x8e\x91\x20\x92\x64\xa8\x47\xba\xe0\x68\xe2\x51\x04\x24\x67\x3f\x6a\x55\xe4\x26\x86\x9f\xc7\x7f\x1d\xff\x32\x02\x67\x3f\x55\x68\x8a\x9d\x47\x6b\xd4\x49\xf3\x33\x02\xa9\xe4\x6d\x45\xf4\xf1\xf6\x6a\x2f\xdd\x67\xed\xf0\x6f\x4c\xa6\x4c\x66\x0f\x99\x39\xf1\x64\x91\x33\xa9\x56\x1c\x6f\x71\xe9\x28\xeb\x6d\x1d\x90\x3a\x02\xd8\x35\xeb\x93\x8c\x69\x8a\xe4\x5f\x48\x6d\x69\xcf\xa0\xe7\x7c\x11\x07\x69\x6e\xf7\x84\x2a\x8d\xca\x7d\x88\xd6\x72\xef\xaf\xae\x2f\x95\x5c\xb2\x90\xc1\xa8\xdf\xe0\xce\x8a\x24\xcf\x4d\xbb\xc2\x1b\xcc\xb9\xda\x0a\x94\xf6\x01\x9b\xef\xaa\xda\x0f\x37\x24\xcf\x07\x0c\x26\x47\xea\xe6\x8c\xd5\xc4\x62\xb6\xf5\x74\x76\x9b\x63\x0c\xb7\x8a\x73\x26\xb3\x8f\x79\x4a\x2c\x96\xde\x97\x73\x46\x89\x89\x61\xe6\x38\x90\x23\xb5\x4a\x7b\x0e\x41\x2c\x5d\x5d\x75\x44\x85\x84\x01\x58\x14\xb9\xbb\xcc\x15\x53\x67\x33\x6e\xf0\x1e\x7f\x78\x05\x80\x5a\xe5\xf2\x7b\x15\x3d\x2e\x95\xb4\xf8\xc9\xb6\xac\xba\x90\x17\xe6\x46\xc9\x5b\xa5\x6c\x0c\x56\x17\xd8\x4c\x19\xa4\x54\x89\x7c\xa1\xd5\x92\x71\x6c\x59\x9a\x6d\x17\xd2\x32\x81\x6f\x70\x49\x0a\x6e\x1b\x41\x5d\xb7\xb9\x39\xc2\x67\xdc\x70\x4e\x4a\x98\x44\xdd\xd9\x54\x14\x3e\xb7\x8e\x76\xe1\x1d\x95\x06\xe1\x5c\x6d\x16\x9a\xad\x19\xc7\x0c\xdf\x1a\x4a\x78\x79\x6f\x62\x58\x12\x6e\xb0\x47\x4b\x49\x4e\x12\xc6\x99\x65\x68\xfa\xab\x00\xa4\x5a\xe5\x31\xfc\x0c\xe3\x8b\xab\xab\x31\xfc\xd2\x99\xa5\x4a\x08\x22\xd3\x2e\x43\x04\xd3\x84\xc9\xa9\xf7\xa6\x46\x13\x9d\x99\x3e\x51\x14\x35\xae\xd7\x7b\xfe\xa7\x3f\xbf\x5f\xbc\xbd\xbd\xf8\xf0\xfe\xf6\x9f\x37\x17\xd7\x6f\xef\x16\x17\x97\x6f\xff\x32\xe0\xdc\x68\x66\xf1\xce\x12\x5b\x18\x67\xda\xde\xec\x78\xdc\xf9\xc9\x04\xc9\x30\x86\x5f\x0b\xb2\x75\xd1\xa9\xb1\xfe\x52\x13\x81\x1b\xa5\xef\x9d\x9a\xdf\x9b\x15\x79\x7e\xf6\x32\x7e\x41\x97\x74\x7e\xba\x24\xf3\xe4\xd5\xab\xef\x96\x38\x4b\xbf\x3b\x9f\xbd\x4a\xe9\xfc\x6c\x4e\x5e\xa6\xaf\x4e\x67\x2f\xce\xf0\x7c\xbe\xc4\x84\xcc\x96\x4b\x3a\x7f\x79\x4e\xe7\x38\x7f\x31\x4f\xf1\xd5\x59\x92\x3c\x27\xf4\x6c\x28\x77\x51\x70\xbe\x50\x9c\xd1\x6d\x0c\x3f\x2d\x6f\x94\x5d\x68\x34\xd8\x1c\x36\x94\x19\x4d\xdb\x81\xb5\xa3\xd6\x0b\x16\x4a\xdb\x18\xce\x4f\xcf\x4f\x07\xe7\xe1\x3d\x42\xa0\x4b\x8e\xa6\x33\xc7\xd9\x1a\x25\x1a\xb3\xd0\x2a\xc1\xfe\xb2\x2b\x6b\xf3\x1f\xd1\x0e\x4f\x36\x27\x76\x15\xc3\x74\x85\x84\xdb\xd5\x6f\xc3\xc9\x7d\xf2\x0d\x5d\xa1\xd3\xe0\xdd\x87\x0f\x8b\xce\x94\x46\x92\xb2\xaf\x28\xdf\xa2\x16\x4c\x96\x1e\x7e\x8d\xc6\xb8\x23\xa8\xcc\xff\x03\xe1\x3c\x21\xf4\xfe\x83\xba\x52\x99\x79\x2f\xdf\x6a\xdd\xbb\x45\x28\xd7\x7d\xef\xf4\x16\xde\xf5\xc4\x9e\x22\x6b\xc2\x0b\xfc\x41\x2b\x31\xdc\xd5\x92\x21\x4f\xab\xfc\x15\x98\x59\x94\x9b\xae\xa3\xd9\x24\x7c\x0f\x02\x1a\xec\x0a\xdf\x1b\x16\xda\xcc\xdf\x63\xd2\xf8\x6b\x81\x66\xe8\x72\x00\x34\x2f\x62\x98\x9d\x8a\xc1\x63\x81\x42\xe9\x6d\x0c\xb3\x97\xa7\xd7\xac\x9a\x93\x2a\xc5\xbb\x5e\x2c\x77\xa3\x5f\x8d\x29\x13\x03\x67\xb2\xf8\xf4\x39\x89\x8a\x12\x4b\xb8\xca\x1e\x97\xac\x76\x98\x7e\xef\x84\x15\xd0\xf2\x09\x49\x2b\xb0\xca\xff\x4d\xe2\x0a\xee\xed\x81\x5d\xc1\x57\x4e\x5e\x95\xce\x07\x13\xd8\x49\x27\x83\x9d\xf4\x66\xfa\xa9\xcf\x25\x2c\x5a\x16\x74\x82\xe4\xae\x9c\x44\xfd\x93\x4b\x0f\xaf\x0f\x64\xa5\x86\xbe\xb5\xbb\xc6\x8c\x19\xab\xb7\x71\xa7\x81\x6a\x05\x14\x96\xf1\xa8\xcc\x3a\xbd\x89\x3f\x3e\xf3\x39\x65\x0c\xda\xc8\x89\xe0\x8a\xa4\x51\x61\x50\x47\x2c\x7d\xdd\x73\xcd\x6f\x99\xb9\x1d\xdf\x32\xf3\xa1\xcc\xfc\x65\x13\xd9\xf9\xe7\xe4\xb1\xdd\x1e\xf3\xe8\x9e\x78\x37\xbb\x91\x2c\xd3\x98\x11\x8b\xae\xdf\x8d\x30\x65\x76\x90\xce\xf6\xaf\xd7\xb2\x5a\x15\x91\x54\x30\x19\xc3\xd8\x5d\xaf\xf1\x63\x18\xb1\x84\x71\x2a\xbe\x30\x88\x10\xea\x53\x77\x71\x05\x53\x24\x86\x6a\x96\x3b\x49\xa6\x8f\x1d\x50\x8d\xc4\xe2\xf8\x19\x8c\x8b\x32\xc7\xba\x6f\xb9\x4b\xa4\xee\x4b\x8a\x1c\x2d\x96\x28\xc4\x13\xa4\x56\x9d\x70\x95\x8d\x2a\xe4\xc7\xb8\x75\xab\xd8\x5d\xd1\xba\x27\x4c\x1a\x4b\x38\xcf\x39\xf1\x14\x07\x34\x6e\x95\xfa\x7d\x0f\x7c\xcd\x70\xf3\x35\x0f\xfc\x11\x7c\x4e\xd5\x2f\xe2\x28\x5f\xee\xc8\x9e\x41\x23\x32\x2b\x95\xe8\x1f\x62\x86\xd6\x91\x70\x66\xca\xcf\x4d\xe9\x71\x3b\x7e\x96\x13\x7a\x4f\x32\x34\x93\xe3\xb4\xaf\xc8\x05\x91\x6c\xe9\x22\x8f\xf7\xe5\xfe\xb3\x29\xa3\x4a\x1e\xa7\xcb\xe3\x20\xa1\x6a\xb6\x54\x3e\xe0\x5b\x19\x57\x09\xe1\x51\x17\x35\xee\x96\xca\xcd\xe3\x2f\x2b\xb5\x5b\x16\x0e\x45\x72\xd1\x54\xde\x96\xe8\x0c\x6d\x83\x76\x57\xde\x1e\x3d\x06\x19\x23\x3c\x5f\x91\x01\xb2\x58\x01\x73\x15\x6b\x40\xbd\xfa\x7c\xcb\x8a\xeb\xa1\xe6\x41\x71\x31\x69\xe0\xe3\xf5\xe9\xe4\xf9\x8b\xc9\xac\xd9\x41\xca\x4c\xce\xc9\xd6\x17\xc3\x0b\xbf\x2c\xdc\xd5\xeb\xa6\xd8\x78\x66\x0c\xb7\x98\xfb\x52\xc2\x00\x91\x8d\x05\x6b\x5d\xc0\xae\x88\x05\x66\x80\xac\x09\xe3\x24\xe1\x08\x4b\xad\x04\x10\xc8\x5c\x7d\x00\x97\xfe\x1e\xdc\x95\x5e\x07\x9b\x15\xa3\x2b\xd8\x30\xce\x4b\x4f\xe4\x6b\x04\xab\x80\x84\x0d\x30\x19\x01\x08\x26\xff\x5e\x24\xd8\x58\x73\x36\x99\xcd\x26\x2e\x43\xdf\xe3\x76\xa3\x74\xea\x1c\xf2\x64\xe8\xb3\x27\xcf\xe0\x44\x71\xe1\x3e\x6a\x8b\x9d\x38\x0f\x16\x84\x75\x6b\xfa\xba\x9a\xbf\xc5\x14\xde\x11\x5f\x29\xa1\x20\x8c\x97\x87\x26\xcd\x8a\x2d\x6d\xeb\x0d\xdf\x6b\x4c\x57\xc4\xba\xe3\x1b\x01\xe4\x5a\xad\x59\x8a\x55\x9a\x1d\xae\xc3\x99\xbc\xef\x89\xd8\xb1\x30\x40\xa1\x79\x5c\x16\x2a\x26\x9e\x4e\x33\x66\x57\x45\x52\xba\x46\xa8\x6c\xdc\x8b\xee\x4e\xad\x46\x9c\x0a\xe2\x8c\x37\xcd\xef\xb3\x69\xb5\xdf\xa8\x71\x91\x2a\xea\x5c\xab\x14\x2b\x8d\x7c\xa7\xf4\x7e\x23\x6f\x7a\x4d\xba\x29\x72\x57\x02\x61\xda\xb4\x5c\x35\xe9\x1d\x93\x19\xc7\x63\xa9\xaf\x0b\x6e\xd9\xb1\xc4\x17\x9c\xb7\xb7\x68\x0f\x6d\xb5\x03\x6f\xe9\xa6\xe7\x85\xb4\x6d\xb4\x61\xd0\x59\x56\x51\x79\xe1\x2a\x34\x53\x46\xe4\x7a\x26\x7a\x62\x33\xe8\x9a\x52\x8e\xbd\x4e\xb0\x0d\xbc\x83\x8a\x7a\x0f\x9c\xff\x40\xf5\x17\x41\x05\xd4\x13\x4a\xd1\x18\x8d\x2e\x47\x75\xcb\x6d\x1f\x7e\x87\xd5\x7b\x59\x8d\x0c\x1e\x66\x68\x1f\xd2\x73\x80\x29\x06\x75\x2a\x7b\x03\xdf\xb2\x1d\xd4\xa3\x2f\xd0\xfd\x76\x99\xa1\xf7\xa0\x4c\x11\x47\xe8\x14\x4c\x5b\x47\xe8\xd9\xcb\xb5\x7f\x90\xae\x87\x73\xed\xc3\x4a\x0f\x83\xd6\x93\xd5\x6e\x2f\x42\xc7\xcd\xc3\xf9\xc2\x8f\xee\x55\x01\x18\xe2\x48\xf5\x08\xe3\x49\x9d\x6d\x75\x67\x86\x3d\x8b\x20\x9f\x3e\xca\x26\x23\x78\xf0\x69\x30\x7f\x57\xe8\x6c\x30\xd3\x82\x55\xcf\x7b\x88\xca\xb0\xa3\x81\x30\x78\x55\x8f\x12\x7e\x0a\x6f\x7d\x88\x64\x35\xab\x0d\x10\xad\x7a\x0c\x91\xad\xa3\x44\xec\x5a\x18\x1e\x02\x86\xe0\x30\xec\xd5\x59\x63\x0f\xfc\xd5\x6c\x6f\x3f\x0c\xd6\x2e\xf2\xb4\x08\xe8\x47\xb8\xc7\xac\xc7\xbe\x5e\xb3\x4f\x15\x82\xd6\xfc\x38\xec\xb8\x47\x9b\xf2\x71\x48\x5b\xa5\xd4\x01\xbc\xcd\x8f\xfd\xa8\x5b\xbd\xad\x1d\xec\xad\xde\x55\x89\xc0\xed\xe4\xe6\x21\x55\xb4\x7e\x3d\x0f\x3d\xf6\x6f\x08\x60\xe4\x12\x63\x60\x7e\x7c\x36\x9f\xbf\x18\x07\x19\xab\x2a\x3a\x04\xc7\xd7\x44\x7d\x64\xcf\x8f\xaf\x85\x64\x75\xa4\x77\xf1\xac\x0b\xbe\x21\x5b\xb3\x43\x17\xc0\xb3\x20\x84\x69\x39\xf3\xec\x50\x1d\x40\xaf\xfc\xd8\x83\x21\xf9\xd1\xc5\x84\xee\x82\x14\x07\xb1\xa6\x56\xff\x3d\xda\x1d\x02\xb7\xfe\x07\xd4\x7b\x3a\xf6\x55\x6f\x2f\x58\x03\xd5\x93\x61\x1c\xcc\x8f\x3d\x68\x98\x1f\x35\x26\x76\xd6\x62\x62\xed\x58\x2b\x5e\x08\xbc\x76\x31\x2d\xe8\x35\x3e\xf2\x58\x91\x2f\x77\x5d\x0d\x40\x38\x3e\xff\x2f\xd7\xd4\x8a\x7c\x14\x5a\x7b\x6f\x38\x0b\x2f\x8a\x22\xb7\xdb\x37\x4c\xc7\xf0\xef\xff\x94\xdd\x89\x2d\xa3\x5a\x0c\x65\x6f\xe8\x3b\xee\x7e\xf7\x56\xbe\x3a\x52\x85\xe7\x14\x97\x4c\x32\xdb\x56\xb7\x6a\x23\x31\xad\x3b\xd1\xcc\xbf\x5f\x72\xb0\x48\xa9\x14\x5a\x77\x5e\x1b\xf2\x4f\x7c\x53\x5a\xf5\x2c\xd7\x55\x81\x52\x63\x8c\xdd\xf8\x3c\x2c\x5e\x42\x5d\xe5\x80\xbf\xd7\x5a\x5e\x0c\x89\xca\x46\xb2\x71\x0f\xc8\x50\x3a\xb5\x31\xf5\x3d\x25\x7e\x62\xc6\x32\x99\xf5\x9b\x4a\xd7\x96\xa6\x60\x57\xc8\x34\xf8\xb7\x4c\xae\xdb\x8a\xb5\x2d\x8e\x6e\xf6\x26\x96\x50\xb8\x78\x52\x17\xdf\xd5\xea\xc0\x1b\x70\xab\x22\x61\x2a\x6a\xff\x8f\xd9\x03\x32\x78\x1b\x7c\x28\x13\x7a\xa6\x73\x3a\xda\x1b\x97\xcb\x05\xeb\x3f\x78\xda\x3f\x53\x7a\xa7\x71\xa9\x84\x28\x24\xb3\xdb\xa6\x83\x77\x26\xca\x8b\x84\x33\xb3\x42\xdd\x42\x23\xef\x8a\xc4\x37\x2c\x4e\xe6\x42\xa5\xde\xa4\x55\xf7\xd5\x4f\xbc\xd5\x54\xff\x9d\x36\x0f\x8b\xde\xf5\x6a\xca\xfa\x8f\x9e\x85\xaa\xfb\x38\xd7\xd6\x59\xd4\x6b\xc2\x63\x78\x79\x2a\x46\xff\x0d\x00\x00\xff\xff\x5e\xc0\x76\x6d\xca\x29\x00\x00") -func olmManifests0220OlmYamlBytes() ([]byte, error) { +func olmManifests0231OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0220OlmYaml, - "olm-manifests/0.22.0-olm.yaml", + _olmManifests0231OlmYaml, + "olm-manifests/0.23.1-olm.yaml", ) } -func olmManifests0220OlmYaml() (*asset, error) { - bytes, err := olmManifests0220OlmYamlBytes() +func olmManifests0231OlmYaml() (*asset, error) { + bytes, err := olmManifests0231OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.22.0-olm.yaml", size: 10239, mode: os.FileMode(420), modTime: time.Unix(1678830329, 0)} + info := bindataFileInfo{name: "olm-manifests/0.23.1-olm.yaml", size: 10698, mode: os.FileMode(420), modTime: time.Unix(1687806531, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0231CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\x9e\xbf\x02\xcb\xcd\xb9\xb6\x13\x49\x9e\x49\xda\x7c\xad\xbf\xb4\x59\xae\xed\x24\xbe\x99\xf1\x68\x8d\x9d\xf4\xf6\x9b\x99\x93\x40\xe4\x96\x84\x9a\x04\x58\x00\x94\xad\x9e\x9c\xff\xfd\x2e\x6c\x3c\x48\xea\x65\x49\xa4\xc7\xb2\x87\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xbf\x1f\xdd\x6e\xf7\x33\x9a\xb1\x5f\x40\x2a\x26\xf8\x31\xa1\x19\x83\x3b\x0d\xdc\xfc\xa5\x7a\x37\x7f\x56\x3d\x26\x8e\x26\x2f\x3f\xbb\x61\x3c\x3e\x26\xa7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x33\x18\x32\xce\x34\x13\xfc\xb3\x14\x34\x8d\xa9\xa6\xc7\x9f\x11\x42\x39\x17\x9a\x9a\x9f\x95\xf9\x93\x90\x48\x70\x2d\x45\x92\x80\xec\x8e\x80\xf7\x6e\xf2\x01\x0c\x72\x96\xc4\x20\x71\x72\xff\xea\xc9\x8b\xde\x5f\x7a\x2f\x3e\x23\x24\x92\x80\x8f\x5f\xb3\x14\x94\xa6\x69\x76\x4c\x78\x9e\x24\x9f\x11\xc2\x69\x0a\xc7\x24\xa2\x9a\x26\x62\x64\x17\xa1\x7a\x22\x03\x49\xb5\x90\xaa\x17\x09\x09\xc2\xfc\x27\xfd\x4c\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\x57\xf8\x5a\xfc\x3d\x61\x4a\xff\x34\x7f\xed\x15\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xcf\x08\x51\x91\xc8\xe0\x98\xe0\xa3\x19\x8d\x20\xfe\x8c\x10\x07\x42\x37\x55\x97\xd0\x38\xc6\x6d\xa1\x49\x5f\x32\xae\x41\x9e\x8a\x24\x4f\x79\x78\x95\xb9\x27\x06\x15\x49\x96\x69\x04\xfd\xf5\x18\x48\x26\x41\xeb\x29\x82\x84\x88\x21\xd1\x63\xf0\xef\x0e\x4f\x11\xf2\x2f\x25\x78\x9f\xea\xf1\x31\xe9\x19\x08\xf7\x62\xa6\xb2\x84\x4e\xcd\x6a\x4a\x77\xd9\x6d\x3a\xb3\xd7\x4a\xbf\xeb\xa9\x59\xba\xd2\x92\xf1\xd1\xaa\xa5\x98\xfb\xd6\x5f\x83\x05\xcd\xf5\x34\x9b\x5f\xc2\xcc\x8f\xeb\xbe\x3f\xcb\x07\x09\x53\x63\x90\xeb\x2f\x22\x3c\x32\xb7\x86\xfe\x82\x2b\x4b\x16\x52\x9a\xd4\x1f\xa8\xde\xdc\x61\x98\x7b\xc1\xc9\x68\xfe\x1b\x63\xaa\xfd\x8f\xf6\xa6\xc9\x4b\x9a\x64\x63\xfa\xd2\xfd\xa8\xa2\x31\xa4\xb4\xc0\x07\x91\x01\x3f\xe9\x5f\xfc\xf2\xf5\xd5\xcc\x05\x52\x85\x4e\x05\xcf\x09\x53\x84\x12\x09\x99\x50\x4c\x0b\x39\x35\xd0\x3a\xbd\xfa\x45\x75\xc8\xe9\xdb\x33\xd5\x21\x94\xc7\xe1\xe0\x91\x8c\x46\x37\x74\x04\xaa\x37\xb7\x56\x31\xf8\x17\x44\xba\xf4\xb3\x84\x7f\xe7\x4c\x42\x5c\x5e\x85\x01\x8f\x87\xc9\xcc\xcf\x06\xfe\xa5\x9f\x32\x69\xde\xa9\x4b\x07\xd9\x8e\x12\x95\xab\xfc\x3e\xf3\x85\xfb\x06\x0c\xf6\x3e\x12\x1b\x02\x07\x0a\x51\xc0\x9d\x31\x88\x1d\xec\x2c\x6a\x30\x65\xbe\x5f\x82\x02\x6e\x49\x9e\xf9\x99\x72\xf7\x4d\x3d\x72\x05\xd2\x3c\x68\x8e\x7b\x9e\xc4\x86\x12\x4e\x40\x6a\x22\x21\x12\x23\xce\xfe\x13\x66\x53\x44\x0b\x7c\x4d\x42\x35\x28\x4d\xf0\xd4\x72\x9a\x90\x09\x4d\x72\xb0\xa0\x4c\xe9\x94\x48\x30\xf3\x92\x9c\x97\x66\xc0\x5b\x54\x8f\xbc\x16\x12\x08\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\xb4\xa7\xe1\x91\x48\xd3\x9c\x33\x3d\x3d\x42\x72\xcc\x06\xb9\x21\x87\x47\x31\x4c\x20\x39\x52\x6c\xd4\xa5\x32\x1a\x33\x0d\x91\xce\x25\x1c\xd1\x8c\x75\x71\xb1\x1c\xe9\x78\x2f\x8d\xff\x20\x1d\xd5\x57\xfb\x33\xe0\x5b\x88\xcc\xc4\x93\xcd\x95\xb0\x36\xc4\xd3\x62\x91\x7d\xdc\x7e\x4b\x01\x52\xf3\x93\x81\xca\xdb\xf3\xab\x6b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\x83\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\x6f\x5e\xbd\x26\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x8e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\xf7\x42\xa6\x54\x1f\x93\x6f\xfd\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x1d\x7f\x9b\x09\xa9\xff\x46\xde\xf0\x64\x6a\x26\x8d\xc9\xed\x18\x38\xb9\x0a\xdf\x46\xfe\x5a\xfa\xe3\x07\x99\x45\x3d\x72\x31\xe2\x42\xfa\x3b\x0d\x56\x5d\xa4\x74\x04\x64\xc8\x20\x41\xbc\x56\xa0\x7b\xb3\x3b\xb8\x72\x17\x89\x15\x97\x86\x6c\xf4\x9a\x66\xf7\x82\xe6\xd4\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x86\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xf5\x20\x70\xea\x27\x30\xf0\x2b\x7e\xbe\x70\x94\xab\xb7\xe9\x67\x97\xbf\x6c\xe3\x67\x0b\x31\xe4\x5e\xa0\xbd\x5e\xc4\x45\xd6\x78\xc7\x48\x66\x51\x5f\xc4\xf6\xb3\xef\x7d\xcb\x0f\xe5\xbb\x09\xdc\x65\x42\x81\x22\x31\x1b\x0e\x41\x1a\xba\x23\x26\x20\x25\x8b\x41\x91\xa1\x90\xb8\x5f\x99\x88\xf1\x4c\x86\xfd\xab\xb0\xda\xbe\x88\xd7\xdd\x18\xf3\x6a\x64\x18\x16\x19\x1d\x1a\x2e\xfd\xdc\x85\xa7\x9d\xdc\x73\x78\xcd\xe0\x22\x86\x2b\x48\x20\xd2\x42\x2e\xbe\x63\x06\x26\x97\xa5\x07\x1c\xd5\xf7\x7f\xdd\x8e\x59\x34\x26\x69\xae\x90\xea\x6a\x99\x43\x05\x2e\x5a\x90\x21\xd3\x44\x70\x42\xf1\xb5\x86\xd6\xcf\x3f\x99\x52\x1d\x8d\xdd\x1d\xfb\x8a\x24\x74\x00\x89\x9a\x9d\x67\x00\xc8\x72\xe3\x3c\x81\xd8\x4c\x88\xb4\x04\xe7\x5c\xf2\x09\xf7\x40\x89\x58\x52\x16\xe4\xed\xd5\x30\x23\xf7\x61\x99\x05\x3c\x13\x92\xe9\xe9\x69\x42\x95\x5a\x86\xd3\x73\xd0\xbd\x18\x22\xfa\xb0\x21\x83\xb8\x43\x18\x8f\x99\x51\x69\x94\xff\xf6\x7d\x15\xe6\xed\x99\x7b\x0d\x83\x2b\xdd\xef\x21\xe4\xef\x21\xb7\x2c\x49\x0c\xb0\x62\x18\xd2\x3c\x41\x22\xf9\x1f\x90\x82\x30\xc4\x4e\x89\x78\xc5\x85\xbf\xbc\x1a\x78\x2b\xbe\x55\x41\x94\xe3\xb7\x0a\xae\xe1\x4e\x2f\x3f\x5d\x73\xdf\xbb\x77\xb5\xe8\x51\x64\x09\x03\x20\x82\x23\x21\xfc\x2d\x81\x11\x8d\xa6\xbf\x99\xe5\xff\x26\xc1\x2c\x24\xd2\x10\xff\xd6\x43\x39\xbf\x72\xc4\x0c\x80\x04\x52\x6d\x60\xe6\x0b\x09\xe3\x66\xcb\xcd\x61\x63\x7a\x8c\x00\x92\x6c\x34\xd6\xe6\x2e\xa7\x78\x54\x17\x80\x67\x2e\x5c\x34\xac\x9f\x32\x0e\xf2\xdd\x17\x1f\xe6\xee\xb4\x22\x1b\xf2\xaa\x24\x11\xb7\x65\xfc\x94\x39\x27\x8c\x9b\xf3\x4e\xfc\x07\x92\x93\x38\x65\x0a\x25\xd2\x83\xfe\xd5\xc9\x61\xe5\x4b\x48\x2a\x62\xe8\x98\xef\x8b\x05\x28\xbe\xaf\xcd\x69\x37\x13\x2a\xf0\xaf\xa1\xda\xbc\xc6\xe0\x84\x3b\x2d\x11\x35\x3c\xd3\xbd\xd3\x00\x4c\x18\xc2\x32\x80\xf0\xf2\xab\x13\xf2\xdb\x80\x2a\x48\x18\x07\x0b\xbb\x4c\xb2\x09\x4b\x60\x64\xde\xc8\xbd\xee\xa9\x7a\xe4\x34\x97\x86\x9e\x25\x53\x87\x18\x64\xf1\xae\x30\x45\x72\x3e\x83\x6e\x1e\xb3\xac\xcc\x57\xde\x2c\x73\xb7\x32\x52\xd7\x15\x3e\x31\x35\x5c\x9c\xfa\xfb\x70\x6f\xf4\x98\xf2\xa5\x9b\x6b\x24\x45\x33\x31\xe3\xf6\x29\x16\x5b\xd1\x1c\xa4\x14\xb2\x47\xfe\x61\x68\x67\x6e\x34\x6c\x22\x92\x18\xa4\xd7\xee\x08\x33\xf4\x52\x75\x3c\x90\x50\x62\x77\x72\xa0\x03\xcc\x02\xc0\x2f\xff\x66\x27\xf3\x1b\x82\x03\x28\x97\xf8\xf5\xf6\xc8\x7b\x6e\x04\x4a\x4a\x86\xb9\x11\x01\xbd\x6e\x61\xcf\x5c\x19\x34\xfe\x10\xfa\x09\x4a\xaf\xef\x84\x65\xa7\x94\x39\x54\x0b\x7a\x86\xb4\x06\x16\x33\x17\x0b\xdf\xa7\x2c\x22\xd3\xf0\x3a\x31\x24\x22\x4b\x2d\x05\x54\x79\x66\xc4\x1f\x65\xbe\x94\x1b\xd0\x44\x15\xf6\x93\x89\x58\x2d\x04\x80\x59\x56\x26\x21\xa3\x32\x50\x6c\x05\x24\x1a\x53\x6e\x74\x3d\xf3\xa1\x41\x56\x36\xb2\x97\x79\x2d\x1d\x88\x5c\x23\x8e\xb9\xb3\x3a\x14\x39\x8f\x89\x21\x2a\x85\x38\x7d\x93\x0f\x40\x72\xd0\x80\x12\x75\x2c\x22\x65\x84\xe9\x08\x32\xad\x8e\xfc\x69\x3a\xca\x44\xdc\xf5\x7f\x74\xa9\x3f\x24\x47\xfb\x7b\xdb\x52\x23\xe2\x21\x7f\x4c\xec\x5e\x2d\xb9\x0b\x78\x9e\x2e\x27\xf0\xdd\xd5\x0f\x9b\x1b\x0a\x30\x2e\xbc\x49\x8b\xc4\xa8\xcd\x85\x4d\x67\xd1\x42\xcb\x46\x8b\xe2\x7e\x62\x76\xa2\x64\xb3\x70\xc2\xb9\xa5\x6e\xfb\xaa\x3c\xf5\x6a\xa2\x4d\xa5\xa4\xcb\x3e\x81\x69\x48\x57\x70\xb8\x79\x83\x8a\xa1\x6d\x46\x17\x2b\x16\x8a\x02\x80\xd6\xd4\xf0\x62\x54\x7e\xed\x15\x43\xae\xf8\x94\x18\x7c\x76\x72\x3e\x72\x75\xc7\xc7\xb4\x64\x59\x02\xe4\xdb\x1b\x98\x76\xac\x66\x0c\xc3\x21\x44\xfa\x6f\xee\x3c\x9b\x7b\xf0\x7e\x3c\xdc\xde\xf4\xf0\xad\xff\xd7\xdf\x96\x7d\xf1\x5a\x5c\xfe\x7e\x89\xc8\x0e\xbb\xa4\x55\x77\xcc\x40\xe8\x1c\x1f\x98\x61\xd9\x16\x02\x76\x2e\x03\x1f\xfc\xac\x1e\x39\x4f\x33\x3d\x25\x29\x50\xae\xbc\xbc\x63\x68\x46\xe9\x66\xe5\x28\x5c\x89\xda\x22\x93\x09\x96\x02\xc4\x90\x4b\x71\xe5\xa4\xa0\x0e\xe9\x4b\x18\x82\x2c\x7e\x41\x46\x76\x29\xce\xef\x20\xca\xf5\x52\xb9\xa8\x0c\xb7\x95\x47\xca\x8c\x1b\x98\x6e\x00\x90\x9f\x60\xea\x35\x1a\xfb\x65\x37\x30\xb5\xc8\x80\x3f\x15\x38\x44\xb3\x2c\x61\x60\x95\xf6\x55\x90\xb9\x81\xa9\x42\xa9\xc7\x3c\x7f\x63\x67\x07\x73\x7f\xa7\xc0\x12\x2f\x7c\x9e\x1b\xbd\x51\xfd\x5f\x8b\xaf\x91\x48\x07\x8c\xdb\x97\xd9\xa9\xfd\x56\xe0\xec\x1e\xa0\x3c\xc6\x3f\xf1\x35\x4d\x80\xcb\x2f\x6a\x03\x98\xbd\xf1\xdf\x51\x58\x44\x08\x35\x2b\xda\x57\x44\x42\x62\x4f\xfc\x98\x65\xde\xd0\x84\x4b\xef\x91\x5f\x0c\x7b\x2c\xcc\xe3\x88\x1b\x16\x02\xf8\x55\xe7\xff\xce\x69\xd2\x23\x67\x96\x2a\xe2\xd7\xbb\x9f\xdc\x4d\x06\x90\xff\xce\xd9\x84\x26\x46\xab\xd1\xc2\xb0\xac\x38\xa2\x32\x46\x6e\xe0\xac\x57\x4a\xd8\xdd\xa3\x41\xe0\xf0\xa7\xbd\xd8\x23\x85\x96\x33\x92\x51\xa9\x59\x94\x27\x54\x7a\x8b\xfc\xb4\x11\x88\x16\x48\x73\x05\x91\xe0\xf1\xca\x13\xbc\x94\xba\xba\x67\xcb\x30\x46\x31\x0a\x24\x13\x31\x2a\x6e\x2c\x85\x59\x24\x3d\xa8\x2a\x37\x62\xe8\x4f\x75\x38\x62\x1d\x2b\xd5\xdc\x32\xe5\x8c\x5b\xc1\x80\xc0\xac\x81\xe1\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4f\x3d\xbf\xea\x10\xa6\xad\x44\x8e\xf2\x9f\x97\x61\x3c\xca\x3a\x60\x17\x07\x6a\x28\x24\x18\xa5\xff\x20\x16\xf8\x0c\x4c\x58\xa4\x0f\x7b\xe4\xff\x19\x11\xdf\x6c\x3c\x87\x11\xd5\x6c\x12\x64\x48\x2f\x89\x68\x09\xd4\xc8\xc4\x54\x91\x17\xe4\x00\x1f\x23\x2c\x4d\x21\x66\x54\x43\x32\x3d\x24\x83\x29\xbe\x46\x4d\x95\x86\x74\x9d\xad\x63\x5c\xc3\xa8\x62\x1d\x9f\x1f\x43\x67\xb8\x61\x5c\x7f\xf3\xc7\x15\x77\xe2\x62\x37\xd8\xd9\x5f\x50\xa4\xac\x90\x1a\x2b\x65\xce\x6c\x61\xe0\x41\x22\x50\x91\x40\x37\x98\x72\x67\xa1\x53\x9c\xab\x92\xec\xe7\xc9\x4c\xd8\xe0\x7f\x19\x3c\xa0\x44\x02\x3a\x78\x1c\xe6\xd6\xc0\x71\x16\xad\x32\x98\x2c\xe5\x68\xcb\xed\x79\x04\x25\x14\x23\xfe\x7f\xf3\xc7\x25\x86\x12\x6b\x8d\x37\x7b\x3e\x6f\xf3\x23\x6b\x30\xca\x62\xf2\x65\x9b\x75\xef\xb1\x0e\xaf\xdf\x6a\x06\x14\xf5\xef\x35\xe2\x04\x03\x8a\x51\x91\xdc\x7e\x77\xbd\x9d\x8c\x04\x0d\xcf\xce\x66\x88\x1f\xe3\x4a\x53\xae\x19\x52\xb6\x60\x51\xf3\x16\x36\x23\x7e\x6f\x62\xc4\x41\x5c\x73\x84\xc6\x22\x97\xb3\x99\xce\xd1\x87\x8d\x8d\x6d\x5e\xcd\xbf\xdf\xfa\xda\xf7\x06\x01\xfb\x4e\xaa\x14\x1b\x19\x29\x93\xdc\x02\x6a\xc3\x8e\x9d\x54\xa5\x4d\xab\x15\xe0\x83\xec\x3f\x78\x9a\xd2\xc0\x04\x98\xf6\x72\x7f\x24\xb8\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xeb\x4f\x26\x20\x7b\xe4\x67\x65\x76\x8a\xfc\xc8\x46\x46\xef\x73\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x53\x06\x74\x43\x90\x12\x62\xb4\xb6\x11\x23\x03\xf9\x19\x20\x9e\xb9\x5f\x91\x38\x47\x0f\xc4\xec\x22\x72\x03\x07\x6b\x2e\x90\x46\xa9\xf1\xe6\xb9\x60\x28\xb1\x07\xde\x7c\xd2\x48\x58\x5f\x03\xfa\xc3\x0c\xed\xd4\xa2\xa0\xa3\xcc\x1a\x88\xc3\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x56\x15\x61\x34\x60\xcf\x7c\x0c\x2a\x6e\x39\xb7\xc0\x87\xb2\x95\xc6\x93\x99\x17\x76\xaa\x45\xcf\x21\x39\xa6\xe9\xec\x92\x0b\x9a\x2e\x29\xbf\x81\x98\x24\x70\xc7\x22\x31\x92\x34\x1b\xb3\x88\x26\xc9\x14\x8f\x29\x1a\xc9\x98\x56\xa8\xf5\xaf\x30\x66\x2f\x23\xe3\xc1\x31\xba\xb1\x51\x57\x41\x24\x41\xdf\xef\x20\xb8\xb2\xf7\x15\x4c\x19\xd5\x65\x31\xf4\x13\x58\x1c\x71\x38\xe7\xad\xe0\x34\x8a\xcc\x41\x42\xd4\x35\x5a\xbb\x13\x40\x4a\xa8\xdc\x23\x17\xc8\x52\x07\xa0\x10\xcb\x6f\x00\x32\x8b\x69\x09\x53\x9a\xa8\x14\x6d\x2a\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x99\x51\x4b\x06\x56\x0c\x32\xac\x76\x1a\xf6\x06\xb8\x5e\x2c\xd4\xac\xd6\xbb\x56\xe8\x5c\xab\xc1\x18\x68\xca\xfd\x90\x2c\x68\x91\xe7\x89\xce\x13\xaf\x8a\xa0\x87\x0d\x5e\x6d\xbd\x67\x57\xda\x08\x1f\xa3\xfb\x69\xcd\xcf\x95\xdb\x83\xf7\x75\x2c\x6e\xbd\x1f\x6e\xee\x90\xa3\xc5\xc6\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x54\x70\x85\xf2\xa9\x75\xc7\xa2\x3b\x75\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\x06\x74\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x3a\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x9c\x2d\xce\xe0\x74\x0c\x1a\x64\xca\xb8\x13\x8f\x8c\xa8\x1b\x00\x3b\x00\x7d\x0b\xc0\x49\x34\x86\xe8\x26\x1c\x25\xe7\xcd\x9e\xd9\x35\x67\x7f\xaa\x52\xac\x22\x50\x40\x24\x09\x2a\x1a\x0a\x80\x30\xa3\x13\x70\xb8\x2d\xdb\xac\x16\xb0\x1b\xc3\xa2\x27\x94\x25\x74\x90\x00\x72\xcd\xf0\x57\xa7\xe2\x55\xf7\xfc\x3c\xcb\x93\xc4\x08\xb1\x3c\x26\xa3\xb7\xfd\x53\xa2\x25\x1d\x0e\x59\x64\x2e\xc5\x4c\x5a\xab\x6f\xd5\x21\x5f\x7d\xe1\x2a\x71\x6d\xe9\x89\x50\x9a\xea\x7c\x6e\x8f\x56\x6c\xf0\xaa\x8d\x35\x7a\x08\x5b\x6a\x20\xaa\x6c\xe5\xdb\xaa\xb2\x62\x96\x01\x56\xd9\xaa\xd8\xbf\x7b\xe4\x52\xa0\x8e\x40\x35\x79\x0d\xca\xb0\x5d\x04\xd0\x5b\xa0\x4a\xf0\x12\x75\x45\xe9\x57\xb2\x11\xe3\x34\x71\x1f\x55\xb6\xef\x05\xdd\x83\xa2\x49\x39\x65\x23\x49\x75\x20\x8a\xc5\xba\x1d\x77\x71\x7c\xd1\x5a\x42\x7b\xe4\x84\x4f\x71\xbf\x87\x40\xcd\x0f\x66\x66\x2d\x45\x9c\x47\x68\x87\x4f\x12\x74\xf7\x16\x93\x34\x4a\x46\xab\xee\x85\x53\xff\x12\x2f\xe8\x29\x73\x00\x28\x73\x2e\x25\xc1\x81\x50\x95\x19\x3d\xce\xe3\xa4\x35\x85\x17\x00\x46\x66\x71\xd2\xbf\x20\x3e\x60\xae\x47\xba\xdd\x2e\xb9\x36\x3f\x2b\x2d\xf3\x08\xf9\x8b\x39\x42\x3c\x76\x9c\xc2\x62\x1f\x7e\x24\x45\xb1\x13\x3f\x83\x38\xcb\x87\x15\xc1\x32\xaa\xc7\xa4\x67\x01\xdf\x2b\x81\x82\x90\xef\x0d\xaf\xb9\xa3\x69\x66\xf0\xfe\x3d\xb7\xd4\xfb\x7b\x21\xae\xec\x26\xd9\x77\xfe\x0f\x39\x3a\x9a\xc5\x09\x31\x30\x22\xaa\x33\x20\x22\x6a\x0c\x85\xd8\x57\xd5\x4f\xea\x99\x07\x7f\xe2\xe2\x96\x2f\x7a\x3b\xbe\x8b\x4a\x38\x26\xef\xf7\x4e\xfc\xe9\x7b\xbf\xd7\x21\xef\xf7\xfa\x52\x8c\x8c\xd8\xca\xf8\xc8\xfc\x60\x90\xea\xfd\xde\x19\x8c\x24\x8d\x21\x7e\xbf\x67\xa6\xfd\x32\x33\x1a\xd6\x6b\x90\x23\xf8\x09\xa6\x7f\xc5\xc9\xc2\xcf\x9e\x23\xfc\x35\x35\xd7\xf1\x77\xc3\x82\x0d\x9f\xfa\x6b\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\x4f\x0b\x3c\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x8e\xfe\xf6\x2f\x25\xf8\xf1\xfb\xbd\x62\xfd\x1d\x91\x1a\xcc\xc8\xf4\xf4\xfd\x1e\xa9\xbc\xf5\xf8\xfd\x1e\xbe\xd7\xff\xee\x17\x79\xfc\x7e\xcf\xbc\xc9\xfc\x2c\x85\x16\x83\x7c\x78\xfc\x7e\x6f\x30\xd5\xa0\x3a\x2f\x3b\x12\xb2\x8e\x11\x98\xfe\x5a\xbc\xe1\xfd\xde\x6f\x66\x4f\x8e\x8e\x9c\x0b\x03\x37\x53\x91\xff\x5d\x6c\xac\xbe\x97\xee\xaf\xd6\xdf\xd0\x08\x4d\x95\xbe\x96\x94\x2b\xe6\xe3\xc7\x96\xde\x9a\xda\xf3\xbe\xf4\xba\x44\x1a\xb0\xf4\xb2\xc5\x86\xa5\x97\x97\x70\xcf\x75\x38\xd7\xfc\x37\xac\x69\x75\x9e\x7f\xd0\x8b\x34\xe6\x4a\x61\xa7\x09\xfb\x63\x78\x80\xbb\xdb\x9c\x45\x23\xc7\x9b\x23\xee\xe8\x9b\x91\x18\x39\xee\x5b\xcf\x9d\xdf\xa0\xe0\x87\xd8\x8f\x9c\xc7\x20\x13\x74\x56\x15\xb3\x5a\x4f\x48\xdc\x23\xd6\x6e\x40\x83\x95\xe6\xc6\x1c\x24\xe4\x4e\xbc\x64\xbc\xc6\x75\x85\x19\x0d\xed\xb0\x67\xde\x4d\x83\x8c\x2e\x8a\x20\xd3\xc8\xe9\xb6\x77\x31\x93\x92\x51\xc5\x48\x56\x5d\xbd\x1c\x3d\x1c\x72\xac\x09\x78\x77\xb7\x8b\xd6\xc9\x53\x6a\x58\x07\x8d\xcd\x7a\x8b\x6b\x56\x7d\xb3\xea\x96\x25\xa9\xd6\x29\x64\x6d\xfc\x7e\x1f\x1c\xa8\x1d\x23\x41\xc1\x2c\xd3\xd3\x7b\x2d\x26\x6b\x7d\x7c\x4a\xef\x5e\x01\x1f\xe9\xf1\x31\xf9\xfa\xab\xff\xf3\xcd\x9f\x97\xdc\x68\x09\x23\xc4\x3f\x00\x77\xb6\xa0\x35\xc1\x30\xff\xe0\xac\xd1\xb0\x08\xf1\x1c\x15\xf7\x04\x23\x77\x81\x41\xb7\x14\x03\x38\x1c\xbb\xcc\x33\x03\x17\x43\xe8\xad\xad\x21\x82\x8e\x11\x92\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\xee\x3e\xf4\x16\x2c\x99\x29\xf2\x97\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xaa\x98\x12\x2c\x27\xf4\xc6\x80\x79\x4e\x08\x61\xbd\xf7\x6d\xdc\x7d\xf6\xc0\xf5\x6c\x81\x29\xe3\x2c\xcd\xd3\x63\xf2\x62\xc9\x2d\x96\xa4\xad\xb9\x9b\xf6\xe6\x42\x10\xa0\x86\x74\x8d\x24\x4d\x8d\xc8\x13\x11\x16\x03\xd7\x6c\xc8\x30\x68\x20\xa0\x36\xaa\xfb\xf6\x41\x1f\x83\x12\xa0\x88\xe1\x29\x86\x0e\x95\x90\xbd\x6f\xe5\x1c\x89\x1c\xd8\x79\x6f\xa2\x32\x81\x9a\x66\x60\x4f\x83\x55\x60\x08\xdc\x65\x56\x54\x2d\xb9\x21\x52\xa0\x9c\xf1\x91\x0f\x7b\xf1\xb6\x64\xcb\x75\x6f\xc7\xe0\xbc\xe7\x50\xf6\x05\x45\x46\x59\x8a\x51\x6f\xa2\x64\x94\x53\x49\xb9\x36\x6a\xec\x49\xff\xc2\xca\xe8\xb3\x36\x4d\x5a\xc4\x42\xfa\xd3\x68\x8f\xaa\x25\x56\x66\x89\xce\x6f\x8e\x27\xb6\xb9\xa3\xfa\xf2\xc5\x57\x2b\xb7\x3c\xdc\xb7\xdc\x85\x47\xb5\x06\xc9\x8f\xc9\x7f\xbf\x3b\xe9\xfe\x3f\xda\xfd\xcf\x87\x03\xf7\x8f\x17\xdd\xbf\xfc\xda\x39\xfe\xf0\x45\xe9\xcf\x0f\x87\xdf\x7d\xbe\x64\xa6\xc5\xc2\xfc\x12\xf4\x71\x4c\xc4\xcb\x89\x7e\x47\x3b\x3e\x4a\xe5\x5a\xe6\xd0\x21\xdf\xd3\x44\x41\x87\xfc\xcc\x91\x35\xd4\x04\xda\x6a\x0f\xb5\xe1\xca\x7b\xe6\xad\xcb\x3c\xe5\xee\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xa9\xaf\xeb\x01\xc9\x9b\x1a\x4a\x94\xa6\x14\x73\x8b\x41\x9a\xe6\x20\x89\x9e\x93\x70\x7b\x91\x48\x8f\x4a\x31\xb9\x46\xb4\x7e\x4d\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x54\xac\x48\xc2\x6e\x80\x9c\x14\x7a\xa3\x21\x96\x03\x88\x28\xca\xe2\x72\xc0\xb4\xa4\xd6\xe8\xeb\xe5\xca\xc2\xa2\x34\xcc\x13\x72\x60\xd4\xd5\x1e\x06\x92\xcd\x51\xd7\x43\x67\xbd\x1d\xb0\x84\xe9\xa9\x55\xa5\x23\xc1\x87\x09\x73\x2a\x40\x9a\x09\xa9\x29\xd7\xce\xce\x08\x23\xb8\x23\xac\x70\x7d\x33\x45\x0e\x62\xae\x5e\xbe\xfc\xea\xeb\xab\x7c\x10\x8b\x94\x32\xfe\x7d\xaa\x8f\x0e\xbf\x3b\xf8\x77\x4e\x13\xf4\xf2\x5e\xd2\x14\xbe\x4f\xf5\x61\x73\x6c\xf1\xe5\x37\x6b\x9c\xa2\x83\x77\xf6\xac\x7c\x38\x78\xd7\x75\xff\xfa\xc2\xff\x74\xf8\xdd\xc1\xfb\xde\xca\xeb\x87\x5f\x98\x6f\x28\x9d\xc0\x0f\xef\xba\xc5\xf1\xeb\x7d\xf8\xe2\xf0\xbb\xd2\xb5\xc3\x45\x87\xf1\xae\x5b\x84\x8a\x74\x8d\x16\xd0\x4d\x69\xd6\xbd\x81\xe9\x92\xc3\xb9\x54\x1c\x9d\x9f\xc8\x42\x2c\xa5\xd9\x22\xed\xdb\xc6\xd6\xbe\x05\x8c\xe7\x8c\x16\x22\x79\x4d\x0f\x0c\xa7\x4b\x44\xb2\x6e\x11\x81\xb5\x85\xd5\xc9\xf0\x1d\x6b\x69\x5b\x25\x4e\xaf\x81\x2d\xeb\xc9\x8f\x7c\x45\xfc\xe2\xbd\x2f\x09\xdf\xb9\xf5\x0c\xfe\x7c\x2f\x49\xfd\x58\x7b\x9e\x9c\x2d\xd5\xb4\xaa\x36\xcc\x8b\x33\x2b\xfa\x22\xe9\x41\x71\x6e\x2c\x8c\x9e\x97\x73\xf6\xef\x1c\xc8\xc5\x99\xa3\x47\x1d\xc2\x78\x94\xe4\xb1\x91\x14\x7e\xfe\xf9\xe2\xcc\xe8\xef\x7f\x77\xe4\xe6\x16\x48\x2c\xf8\xbe\x26\x6f\x2e\x5f\xfd\x13\x8d\x01\x78\x47\xc7\x32\x74\xeb\x8f\xa2\x09\xb3\x59\x23\x9e\x01\x93\xbf\x83\x8d\x93\xc3\x37\x47\x34\x0b\xf6\x13\x24\x77\x18\x61\x95\x64\x46\x80\xb8\x01\xa2\x72\xe9\x56\x67\x26\xb6\x1e\x5f\x03\x6b\xe2\xfc\xc1\x23\xd0\x88\xe4\x09\x66\x3f\x6c\x03\x34\x17\x8f\xcf\x04\xbf\x32\x52\xe0\x03\x9c\x0f\x83\xc8\x6f\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x48\x42\xb8\xf7\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfc\x24\xcd\x7d\xef\x56\x6f\xb4\xf6\x4c\xf4\x6c\xbe\xbd\xc7\xfe\x3c\x17\xc6\x55\x55\x9d\x67\x72\xc1\xd0\xb6\x1a\x9c\xa3\x63\xaa\xc8\x00\x80\xa3\x39\xd7\x5a\xff\x80\x3b\xac\x83\xc2\x10\x9b\x67\x5d\x2d\xba\xf1\xe2\xcd\xbb\x07\x72\xf7\x43\x6d\x85\xe6\x5a\xf9\xb6\x93\x8d\x15\xd5\xdb\xf1\x74\x11\x0c\x94\x35\x67\x62\xe0\x90\x97\x41\x36\xfd\xb0\xe5\x8a\xc9\x8c\x55\x17\x35\x0b\x67\xd4\x70\x7a\xc6\xfc\x92\x8c\xf6\x58\xb1\x6c\x68\x81\xde\xbc\xaa\x65\x6f\xf3\x35\xda\x6d\xbe\x02\x39\x61\x5b\x31\xbf\xfb\x0e\x66\x64\xe3\x4c\x4e\x1e\xfe\x58\x19\xd1\x6b\xeb\x97\xa0\xe9\x2f\x12\xf7\xb8\x6f\x56\xc6\xbf\x23\x04\x57\x45\xf9\x6f\x32\xc7\xa6\xcc\xd2\x52\x93\x63\xcc\xb8\xf0\x3f\x69\x21\xd1\xe5\x5e\xfe\x2d\x1f\x04\x41\xb9\x98\xdd\xe9\x40\xe4\x7f\xfe\xf7\xb3\xcf\x9e\x64\x1e\x79\x92\x2b\x0d\xd2\x81\xcf\x27\x51\x7f\xbc\x7c\x72\xfb\x7a\x77\x86\x1c\xe4\xf0\x7a\x29\xaf\x7c\xd1\x3d\xf3\xf9\xe5\x0b\x3f\x04\x6f\x59\x98\x67\xae\x26\xe5\x7f\xbb\x1b\x8b\x8c\xf3\x45\xb3\x3d\x64\xe6\x79\x25\x6b\xed\xea\x97\x12\xf6\x7e\x9c\x74\xf3\x19\xdf\xe2\xea\x25\x4c\x4a\xfb\x54\x7e\xfd\x2f\x73\xbf\xaf\xfb\x7a\xff\xf9\xd4\xbc\xb9\x14\xd0\x22\x38\x66\xc2\x26\xd4\xd7\x0c\x58\xbc\xa0\x05\xb7\xd8\x15\xbd\x9d\xbf\x70\x7f\xde\xb9\xd3\x5d\xb3\x31\x55\xf3\x20\xee\xcf\xfc\xba\x60\xba\x66\xb3\xcd\x17\x61\xbf\x15\xaf\x2d\x05\x09\x9e\x35\xdc\x3b\x23\xf7\xfe\xb6\xf0\x99\xab\x0c\xa2\xdf\xda\xcc\xf3\x36\xf3\xbc\xcd\x3c\xdf\xd1\xcc\xf3\xfb\xcf\xbd\x39\xc3\x24\x86\x28\xa1\x3e\xd3\x45\x43\x92\x60\x1a\xf8\x58\xdc\x86\xe8\xcb\x24\x29\x47\x6b\x16\xb1\x5f\x29\xe5\x18\xd1\x90\x65\xd6\x36\x4e\xc9\x88\x4d\x80\x87\x60\x94\x75\x17\xbf\x3a\x13\x7e\x31\x83\xf2\x57\xdd\x02\x67\xae\xac\x4c\x92\x9f\x95\x81\x56\x40\xed\xa4\xb8\xd7\xd9\x08\x72\x6e\x5d\xfe\xb9\x84\x18\xd3\x1e\x2c\x92\xa7\x34\x43\x29\xcf\xa7\x36\xd2\x32\x82\x63\xc6\xcd\xd4\x27\x9d\x0d\xa6\xc4\x88\x71\x48\x10\xb4\x10\x2e\x30\xc7\x3c\x8b\x84\x41\x82\x96\x0c\x26\x65\x03\x69\x70\x44\x6d\xae\x13\xac\x9f\x46\xbb\x52\x24\xa6\x19\x73\xb2\x4b\x1c\x04\xcb\x35\xa0\xd7\xbf\x70\xf8\x56\x88\xa3\xca\xe1\x1b\x28\xcc\x53\x70\xf2\x41\x90\x6b\xf1\x4d\x0e\xb1\x62\x82\xa9\x17\x16\x33\x0c\xd8\xca\x48\x38\x40\xcb\x8c\xa4\xdc\x5c\x58\x88\xdc\x0f\x90\x9e\x2d\x6e\xf9\xf2\xe8\x80\x66\x53\xbc\xca\xb0\x0b\x3f\x9b\x05\x4e\x30\xc3\xdd\xab\xce\x5a\xe0\x69\xb5\x1a\x34\xc2\xce\xdd\x12\x93\x09\xa3\x84\x8e\x46\x12\xa3\x65\x97\x46\x1a\xac\x99\xa6\x75\x5f\x68\x04\xc1\xc3\x88\x92\xfc\xca\x3b\x0c\x19\x5c\x79\xc3\x52\x0b\xad\xbf\x61\x5e\x58\xac\x8e\xf5\x12\xca\x28\x9a\xd1\x3c\x68\x85\xbc\x27\x77\xe5\xfe\xbd\xb5\xe3\x9e\x1d\xb6\xa3\xba\xcf\x33\x0b\x71\x57\x07\xe6\x7c\x14\xa4\xd9\x90\x83\xa8\xf0\x66\x3b\x37\x49\x06\xd2\xe8\xe3\x36\x9e\x98\x92\xc8\xca\x6f\x81\xf0\x78\xef\xf0\x3d\xcb\x59\x6b\xff\xed\x58\x07\x0b\xec\xe8\x62\x48\xd5\x3d\xb7\xad\xb7\x55\x76\xdc\x53\xca\x62\x76\xac\x99\xc2\xe4\xe6\x5e\x5d\xea\xa2\xd6\xdc\x06\x0c\x8d\x4f\xba\x46\x4e\x8e\x1d\x55\xf3\x16\xbd\x7d\x5d\x8e\x24\x91\xf4\x96\x00\x8f\x84\x21\x16\xff\xdf\xab\x37\x97\x3e\x7f\xed\x42\x13\x96\x66\x09\xa4\x18\x57\xf1\x9a\x4a\x35\xa6\x09\x48\xe4\x4e\x3f\xf3\xb4\xf2\xf7\x4c\x08\x78\x0c\x09\x9d\xda\xc9\x62\x88\x04\x5a\xe2\x85\x24\x99\x11\x70\xd3\x2c\xc7\x14\x0e\xbc\x8a\xef\xbd\x37\x49\x67\x0b\xd0\x14\x26\xaa\xc1\x74\xa1\x05\xb4\x3a\xee\xba\xf1\xba\x34\xa0\xbc\x98\xfb\x29\x81\x1d\x6b\xd1\x83\xf2\xc4\xf7\x7e\x65\xc8\x90\xe9\xaf\xb0\xb1\x95\x67\xdc\x30\x17\xec\xeb\xaf\x56\xdc\x19\x43\x96\x88\xa9\xc1\x8b\xfb\xcf\xca\x9a\xdf\xb3\xf6\xb9\x5e\x77\xbe\x75\xcf\xf2\x9a\xf3\x59\xe3\x54\x13\x33\x2d\x52\xa0\xb6\x9a\x68\x95\xfb\x6f\xa3\x89\x16\xd8\x1f\x97\xcf\xf6\x20\xcc\xaf\x7f\xe1\xad\x0d\xc1\xeb\x6b\x69\xd3\x4f\xc1\x6f\x5c\x12\xa4\xa7\x99\xa3\x34\x46\x16\x9c\x65\x77\x8f\xc3\xe5\xee\x91\x67\xfc\x6d\xf7\x48\x35\xfe\xb6\xfb\x64\x1b\x3b\x36\x61\x9b\xf7\x23\x9d\x1d\x1b\xd1\xd8\xfb\x11\x70\x8b\x49\x27\xab\xbd\xc9\x5b\xcc\x6b\x74\xe2\x1d\x90\xf0\xae\x2a\xcb\xa8\xc8\x77\x2e\xe7\xd0\x08\x6f\x58\xa6\x6a\x90\x88\xe8\xc6\xd9\x2d\xdf\x9e\x85\xf4\x3e\x5f\x96\xcd\x25\xf7\x11\x76\x1f\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x53\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\x75\xcf\x78\x72\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x7d\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x79\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\x28\x61\xef\xea\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfa\x85\x8c\x40\x2b\x83\x05\xb0\xb8\xa9\x42\xcd\x64\x63\xe0\x74\x90\x2c\x9c\xf8\x3e\x52\xe2\x9e\x5c\x6d\x3c\x1e\x08\x61\xbe\x6e\x1e\x62\xa8\xea\x78\x4d\x67\x93\x78\xe6\xbd\x65\x39\x76\x8b\x83\x9a\x4f\xdf\x9e\x35\x15\xca\x8c\xdd\x4d\xc2\xac\xae\x10\x2f\x56\x0e\x74\xb5\xfe\xde\xdc\x72\x88\x31\xc9\xcd\x97\x2d\x37\x87\x9e\x45\x4c\x27\xd3\xf0\xe2\xde\xa2\xb2\x23\x4f\x27\x24\xfa\xf4\xed\xd9\xfa\xe6\x7b\xbf\x01\x1f\xc3\x52\xdf\xda\xe1\x5b\x3b\x7c\x18\xad\x18\xb4\xe5\xa4\xad\x18\xb4\x62\x3c\x6f\x31\x68\xd7\xed\xd6\xad\xb5\x99\xb4\xd6\xe6\xd5\xb7\xb5\xd6\xe6\xd6\xda\xdc\xda\x6f\x96\x8c\x56\x70\xc1\xd1\x0a\x2e\xf7\x8c\x27\x27\xb8\xb4\xd6\xe6\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\x3d\xc5\xd0\xdd\xd6\xe8\xd7\x1a\xfd\x5a\xa3\x5f\xcb\x8d\x5a\x6e\x74\xcf\x78\x72\xdc\xa8\x35\xfa\x6d\x3a\x51\x6b\xf4\x5b\x38\x5a\xa3\xdf\x3d\xa3\x35\xfa\xb5\x46\xbf\x25\xa3\x15\x5c\xb6\x9c\xb4\x15\x5c\x56\x8c\xe7\x2d\xb8\xb4\x46\xbf\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\xd5\x37\xfa\xdd\x73\x92\x56\x3f\xbb\xfa\xa4\xac\x7c\x96\x45\xab\x5e\xb8\x75\x4f\xf7\x5a\x0d\x60\x07\x54\xc1\x37\x7f\x9c\xab\x5b\x5e\xbe\x25\x85\x98\x51\xbd\x7d\x7f\xd6\xe2\x15\xcb\xf7\x6c\x8d\xbd\x0f\xcb\xd8\x72\x16\x57\x58\xf9\xde\xa0\x58\xb3\xb5\xf1\x85\xbd\x39\xf4\x99\x9f\xe9\xcb\x59\x70\x1e\xbe\xa4\x00\x7d\x50\x1a\x6f\xc7\xe0\x1b\xda\xb8\xd2\xd3\xa1\x63\x3c\x53\x21\x7a\x79\x61\xff\xa4\x9a\xe1\xc8\xfe\x3d\x0b\x2e\xdf\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x99\xb5\x5e\x9f\x85\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\xfa\x7e\x0e\xdd\x2d\x65\x2a\x2f\xb3\xac\xaf\xc3\x98\x5d\x0f\x8c\x3e\xc8\x94\x29\xb5\x2c\xe0\xba\xba\xf4\xfb\xc8\xe6\x1a\xe4\x72\x09\xfc\xfd\x17\x95\x96\x13\xc4\x27\xdb\xfe\x67\x40\x23\x22\xf3\xc4\x35\x01\x75\xe5\xaf\x09\x8d\x22\x91\x73\x4d\x38\x40\x6c\x2d\x1b\x8b\x70\x75\x0d\x62\xbb\x86\xfc\xb4\xae\xf4\xd4\xb5\xeb\xbc\xf7\x2e\xf7\x0d\x27\xf6\x13\x16\x16\x54\x2f\x8f\xf5\xa5\x2d\x7c\xfd\xfd\x5c\x6b\x13\x56\xb8\x36\x23\xac\xec\x6f\x5f\x24\x2c\x9a\xbe\xcd\x13\x70\x2d\xe2\x4a\x4d\xf4\xad\xb4\x5b\x16\x91\x33\xbc\x1b\x57\x6f\x7b\x53\xc6\x02\x6c\x27\x69\x57\x18\xa0\xf2\xb8\xef\x52\x65\x5b\x3b\x98\x87\x08\xcd\xb2\x04\x53\x29\x84\x11\x5a\x6c\x8f\xfe\xd0\x5f\x6f\xd1\x6d\xeb\x4b\x2f\x6b\x89\xd7\x64\x23\x11\x9b\x78\x9b\xd5\xe0\x3e\x54\x21\x1b\xca\xda\xc4\x96\x88\xff\x41\x8a\x3c\x5b\xf3\xf6\x79\xcb\xa2\x7d\xda\x77\xdf\x2a\x37\xb0\xf1\x17\x9d\xcb\xc8\x77\x0c\xb6\x4d\xba\x9c\x49\xd4\x76\x03\x4f\xf3\x44\xb3\x2c\xb1\x6d\xbe\x47\x76\x42\x2a\xa1\xe0\x1b\x1d\x42\xf9\xd4\x7b\xa0\x5c\x9b\x08\x88\x09\x1d\x99\x19\xb5\x6f\x1e\x6b\xfb\x4b\xe4\x29\x98\xd3\x1c\x97\x1a\x9a\x1a\x75\x8a\x4f\x8b\xd9\xc9\x2d\x4b\x12\x6c\xdf\x9b\x24\xe2\x16\xe2\x1e\xd9\xdb\x9b\x25\xe5\x91\x90\xa5\xf5\x20\x31\xd9\xfb\xa2\x72\x97\xa1\x1c\xc5\x82\xd7\xc1\x11\xb2\xb1\x60\x49\x36\x13\x2e\xc9\xe6\x62\x34\x21\x5c\x70\x6f\x1e\xfe\xf9\xed\xab\xed\x10\xe1\xb2\x3a\x87\xeb\x27\x02\xd8\x1c\x3b\xa3\x52\x33\x9a\x90\x5c\x26\xca\xe2\x02\x35\x8a\x84\xf4\x0d\x59\xc6\x14\xbd\x8b\x11\x28\xdb\xf9\x83\x7c\x61\x77\xdf\x6d\x8e\x3d\xe3\x82\x27\x53\x42\xed\xd6\x0c\xf3\x24\xe9\x90\x21\xe3\xd4\x90\x6e\xc8\x7c\x36\x8d\xd1\xc1\xc8\x15\xe3\x11\x98\x6f\xea\x06\xe1\x04\x57\x64\x66\x34\x34\x22\x1c\xf4\xb8\x53\xea\x0a\x8d\xbd\xbc\xf1\x15\xe6\xd0\x47\xd8\xfa\x6e\x28\xa4\x17\x7b\xde\x8a\x04\x4d\xe4\xce\x78\xee\xba\xe2\xd3\xf2\xe5\xbf\x33\x8e\x8a\x0e\x79\x8b\xcc\xc7\x28\x4c\xc0\xb0\xc7\xb4\x99\x12\x5b\xdd\x1a\x64\x29\x90\xf2\x40\xe5\xd1\xd8\x7c\xd2\x5e\x26\x62\xb5\x67\x48\xd1\x9e\x82\x48\x82\x56\x7b\x87\xe6\xaf\xd9\x6f\xc0\xef\x2b\x3f\x77\x44\x33\xb6\x77\xd8\x21\x08\x20\x6c\x96\x22\xf4\xf8\xe9\xe2\xa1\xff\xd6\x4a\x8f\xae\xfb\xc6\x4c\x27\xc0\xd2\x0c\xae\xf3\x87\xc8\x6c\x23\x0d\x43\xe7\x35\x60\xae\x95\x41\x4a\xdb\xe3\x33\x34\x99\x9f\x25\xf8\x84\x9c\x84\x26\xfb\xa0\xb1\x97\xb8\xbb\x1b\x26\x20\xa7\x7a\x6c\x34\x5e\xa6\x02\x01\x79\xf2\x40\xaf\x07\x70\x77\xe0\x3d\x70\x0b\x24\xb7\xdd\x99\x66\x81\xbb\xff\xc5\xfe\x2c\x21\x2d\x38\xc2\x93\x05\x25\xb2\xe8\xad\xc0\xf8\x8b\x79\xb2\x0a\x42\xfb\x93\xa5\x96\x81\x7e\xbc\x7a\x65\x3b\x31\x39\x58\xfd\xc4\x78\xac\x42\x35\xa4\x38\x74\xdc\x34\xf0\x5e\x08\x64\x5c\xe1\x53\x04\xf0\xbc\x08\xbc\xae\xd8\x7a\xcf\xf4\x25\x1d\x69\x17\xd4\x1a\xec\xec\x54\x91\x94\x0c\x9d\xea\x58\xb7\x95\x11\x41\x12\x3a\x80\xc4\xb6\x6d\x32\x57\x8b\xe5\x93\x93\x57\xaf\x43\x87\x33\xec\x18\xfa\xb1\x95\x99\x35\x9c\xaf\x73\x7d\xe2\xe6\xc7\xfa\xf2\x2b\x82\x62\x33\x83\x32\xb9\x02\x6d\x8f\x59\x4a\x33\x73\xca\xec\x1c\x0b\xed\xa1\xaf\x10\xd2\xf7\x1f\x96\x8d\xe4\xfe\xf5\xfb\x3a\x2d\x7a\xc9\x5a\x47\x65\x3d\xaf\xf1\x26\x67\x6f\x85\x95\xa4\x18\x15\x30\xcf\x20\xb4\xd3\x0d\x9c\x34\x1f\x85\x1e\x7d\x16\x83\x95\x4d\xae\xb6\xa9\xec\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa2\x78\x19\xdd\x3b\x81\x48\x8b\xd5\xa5\xe3\xfc\xcd\x1a\xd2\x2c\xb9\xef\xe4\x91\x8d\x95\xb4\x94\xf1\xb7\x40\xe3\xe9\x15\x44\x82\xc7\x6b\x12\xd8\xca\x7e\xbc\x66\x9c\xa5\x79\x4a\x78\x9e\x0e\x00\x41\xac\xec\x5c\x48\x48\xac\x02\x4c\x09\x87\xdb\x64\xea\xdb\x0d\x93\x4c\xc4\x9e\x9e\x0c\xb0\xab\x72\x3c\xc5\x1e\x69\x58\x64\x95\x4f\xcd\x24\xd8\x3d\xd9\xd7\xe2\x23\x91\xa4\xca\x88\x45\x1d\x9c\x94\x69\xc3\xb1\x06\x80\xfe\x29\x16\x83\xd9\x63\x3a\xa1\x2c\x31\xa2\x75\x8f\x9c\xc1\x90\xe6\x09\xb6\xfa\x23\x2f\xc8\x81\x79\x99\xd7\xc9\x16\x3d\x60\xc4\x5d\x25\x8c\x36\xaf\x5c\x9e\x3c\x2e\xe8\x70\x03\x8b\xfb\x3a\x35\x00\xfd\x58\xb7\x16\xa0\x1f\x19\xcd\xd5\xba\xaa\x7c\x65\x63\x2e\x6c\x57\xed\xb2\x24\x5a\x22\xe9\x4c\xb9\x99\xd7\x63\xd9\xab\xeb\x27\x2c\x58\xb5\x14\x23\x09\x4a\x9d\x01\x8d\x13\xc6\x61\x7b\xfc\xba\x1e\x03\x49\xe9\x1d\xe2\x18\x36\x45\x67\xbc\x82\x61\xb4\xfc\x55\x5a\xd8\xc6\xfb\xfe\xf5\x64\x00\x43\x6c\xe5\x88\x1f\x5c\xda\x7d\x8b\x3f\x43\xca\x12\xa3\xa1\x5f\x57\x61\x53\x74\x40\xb6\x88\x63\xfe\x66\x3c\x07\xf3\x54\x26\x05\x2a\x93\xf6\xd1\x32\x8f\x47\x1e\x4a\x8b\x96\xe4\xbe\xeb\x5f\x7f\x06\x14\xe7\x77\x91\x35\x14\xba\x6e\xe2\x1e\x37\x55\x2e\x87\x46\x75\xf4\x1a\x67\x69\x41\xae\x5d\x2c\xb9\x14\xda\x35\x0f\x0c\x1f\x88\x4f\xbb\x66\x96\xa0\x34\x4b\xf1\x80\xc5\xb9\xf4\xad\x35\x11\x66\x74\xf1\xd6\x57\x8e\xca\x37\x2f\x5e\xac\x29\xbf\x3d\x3c\xd2\x4b\x40\x4d\x79\x1b\x7c\xb9\x0c\x74\xc8\x93\x7f\xa3\x02\x9b\x3d\x66\x4e\x0c\xc6\x1e\xa1\x20\xd1\xd7\xc8\x94\x66\x7c\x94\x33\x35\x26\x03\xd0\xb7\x00\x9c\xc0\x9d\xad\x92\x41\xfe\x03\x52\xe0\xa6\x1a\xf0\x16\x6e\x86\x0a\xd0\x5e\xee\x0e\xc4\x26\x4c\x31\xc1\x7f\x64\x4a\x0b\x39\x7d\xc5\x52\x76\x4f\xf9\x52\x3f\xe6\x3b\x25\x07\x08\x8a\x24\xc6\xfe\xc6\x2c\xa2\x57\x60\x3f\x58\x02\x5a\x41\xb5\xb0\xea\x29\x31\xe7\x64\x40\xa3\x9b\x07\x03\xf0\x8b\x5d\x81\xb0\x67\xd7\x5b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\x77\x16\x3e\x15\x28\xdf\x8e\x85\x02\xbc\xc1\x1a\x2a\xf1\x31\xef\x58\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x70\x58\xbd\xa3\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x1a\x5b\x53\x96\x88\x83\x38\xb1\xaf\x9c\xd8\xbf\x09\x94\xd7\x36\x44\x6f\x6e\x32\x26\x76\x9d\xe7\x77\x46\xb7\xbc\xd7\x23\x54\x1d\x15\x90\xcf\x4e\x53\xd5\x80\x93\xea\x86\x38\xb9\x2d\xb5\x6d\x86\xaf\xd1\x88\x5c\xfc\x82\xbb\x70\x72\x79\xb6\xbe\x29\x66\x1b\x05\x77\x63\x15\x77\xd6\x5c\xbe\xe2\xa3\xbc\xc9\xd4\x5d\xa9\xda\xcc\x6d\x7b\xe9\x0e\xa1\xe4\x06\xa6\xb6\x13\xf5\x5c\x6b\x5f\x09\x89\x93\x24\x00\x3b\xdc\x9a\x9b\x5c\x5b\xea\x0d\xd6\xbb\x31\xf6\xd8\xb1\x99\x3b\xc3\x8f\xae\x59\xe8\x86\x4f\xf8\x8f\xde\xe0\xb1\xcd\x11\xdc\x8e\x1b\x98\x6e\xf6\xc0\xcc\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x43\x10\xf4\xc2\x56\x6f\xe6\x67\x2a\x8f\x8d\x4d\x54\x7e\x78\x20\xd6\xfa\xbc\x80\x7e\x65\x2b\x93\xf9\xc6\x7d\x65\x91\xd1\x9c\xe9\x31\xcb\x90\x11\x79\x67\x80\x6f\x94\xfe\x0b\x4d\x58\x1c\xa6\xb0\xe7\xf7\x82\x77\x8c\xf8\x64\xfe\x83\x44\xd7\x8a\x6b\x67\x02\xd4\xa5\xd0\xf8\xcb\x47\x03\x90\x5d\x66\x2d\xf0\xd8\x29\x9c\x15\x1a\xa9\x0c\x2a\x5e\xa5\x1e\xeb\xaa\xe7\xab\x83\x05\x50\x32\x45\x2e\x38\x11\xd2\xc3\x01\xbb\xde\xdb\x89\xec\x14\xc8\x27\x06\xd6\xc1\x81\xf6\xe9\x85\x73\x38\xf0\x09\x59\x81\xde\x8a\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\xab\x7e\x82\xd2\xae\x13\x55\xa9\x77\x94\xb3\x88\xa4\x20\x47\xe8\x71\x89\xd6\xf6\x38\x54\x37\x65\x33\xba\x6b\xc7\xc6\xd4\xb7\xfc\xc2\x8d\xb0\x00\x59\x93\x35\x01\xd5\x61\x6e\x76\x86\x8a\xc9\xe9\x7f\x0c\x05\xc7\x3d\xf8\x5f\x92\x51\x26\x55\x8f\x9c\x10\xc5\xf8\x28\x81\xca\x35\xa7\x61\x94\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd0\xc4\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x2c\x4b\xed\x38\x49\xc5\x50\x9e\xe0\xe8\xda\xbb\x81\xe9\x5e\x67\x0e\x69\xf6\x2e\xf8\x9e\xe5\x2d\x73\x68\x12\x18\x11\xfa\xc8\xf6\xf0\xda\x5e\x93\x5c\x78\x43\x86\xb3\xad\x1d\xad\xfa\xd2\xb5\x31\xc2\xc7\x87\x6c\x29\xac\x57\xb4\x44\x17\x15\xa5\x05\xc9\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x5b\x94\x1e\x77\x46\xf0\x33\x9a\x04\xe3\xa3\x9f\xb3\x98\xea\xb5\x02\x53\xed\xa8\x40\x64\xff\xad\x9d\x84\xe4\x38\x8b\xc1\xad\x21\x1b\x91\x8c\x4a\x9a\xaa\x1e\xe9\xbb\x0a\x89\x88\x69\x6c\x58\xb6\x25\x3a\xd8\x5d\x4f\x33\x20\x7f\x25\x6f\xcb\x6b\xe9\x91\x6e\xb7\x4b\xae\xdf\x9c\xbd\x39\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x19\x9a\x13\x42\x35\x4c\x40\x92\x5b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x0f\x8b\xc7\xdb\x49\x26\x29\xbd\xbb\xca\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\xc3\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x77\x4c\xfe\x84\xae\x6d\x4a\x32\x90\x11\x70\x4d\x47\x30\x6b\x06\xb0\xf7\xbd\x7c\xf1\x5f\x87\x8e\x1f\x99\x19\x9d\xf5\xe4\x85\xc1\x88\xd7\xf4\xee\x67\x5e\x98\x06\x99\x22\x2f\x7a\xe4\x64\xe6\x65\xf8\x5c\x12\xe5\x09\xda\x5a\xd0\x5d\x5f\x7a\xe5\x60\x4a\xa4\xc8\xd1\x61\x4f\xf2\xac\xaa\xcd\x7e\xf5\xa7\xff\x32\x4a\x1f\x4d\xb3\x04\x8e\x7d\x61\x55\xab\x36\x1b\x19\x46\x0b\xf2\xf5\x8b\xff\xb2\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x73\x42\x32\x2d\x2a\xb4\xca\x2a\xfa\x2b\x4d\xa5\x56\x1d\x82\x5e\xfd\x20\x1c\x6a\xa1\x69\x32\xa3\xe5\xa3\x16\x0e\xb7\x16\x48\xb1\x40\x98\x00\x1a\xaa\xc8\xcb\xaf\x5f\xfc\xd7\xbc\x39\xe5\x0d\x8f\x00\x9f\xc4\x27\x30\xcc\x62\x60\x94\xfb\x1b\x96\x24\x10\x77\xee\x5d\xfe\x30\x97\x7a\x0c\xb2\x43\x80\x2b\x6f\xac\x32\xeb\x9b\x59\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\x2f\x5e\xf2\xfa\xc7\xcd\x0c\xca\xa7\x6f\x86\x9b\x8a\x03\xdd\x2d\xcc\x10\xf3\x4f\x6f\x21\x52\xde\x75\x6f\x42\xb6\x65\x97\x71\xdd\x15\xb2\x6b\xa7\x39\x26\x5a\xe6\xf7\x7b\x0d\x8a\x91\x56\x4e\xc0\x47\x20\x03\x79\xe9\xbc\xcd\xed\xea\x83\x9c\xfc\xed\xcf\x73\x2c\x6e\xf9\x72\xca\x81\x84\xd3\xd1\x8c\x2d\x4f\x7d\xd5\xe2\x36\x73\x6c\xcc\xdb\xcd\xdd\xff\x67\x1e\xbb\x37\x20\x07\xee\xec\x86\xd3\x6e\xe4\x2a\xf4\x78\x74\xd6\x78\x7b\x38\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x01\xe5\x9a\x3b\xe1\x0b\x28\x90\x5d\x47\xe1\x90\xd1\x18\x51\x60\xce\xb9\x5a\x7a\xd0\x13\xa0\x4a\x2f\x02\x45\x7b\xd0\xef\x1f\xab\x93\x00\x66\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5a\x44\xd9\x7b\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x5e\x38\x12\x66\xff\xaa\xf2\xd5\x43\x85\xcd\x78\x23\xe7\x36\xa2\xb5\x7b\xb4\x14\x1c\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8c\x14\x9d\x82\xa6\xab\x13\x45\x66\x47\x95\x68\x5f\x69\xca\x63\x2a\x63\xb7\xca\xfd\x7d\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\x74\xef\xe6\xcf\xaa\xc7\xc4\x51\x24\xd2\x34\xe7\x4c\x4f\x8f\xd0\x81\xc6\x06\xb9\x16\x52\x1d\xc5\x30\x81\xe4\x48\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x44\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\x3f\xf8\x17\x3d\xb0\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x86\x8b\x5b\xde\x45\x4d\x56\x6d\x74\x9a\xd6\x8b\x62\xf0\x63\x06\xde\x9b\x04\x2e\x64\x22\x7e\xf0\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x03\xef\xc5\x36\xb6\xdd\x6e\x11\x18\xb0\x4e\xd4\xba\x1d\xdb\x69\x43\x34\xd2\x6c\x02\x5b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x57\x86\x99\x5f\x1b\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x63\x94\x4f\xe7\xb9\x36\x12\xff\x0d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\x9b\x59\xe6\xb6\x67\x97\x25\x37\xdd\x37\x7f\xdc\x64\xeb\x86\xd8\x8a\x61\x43\x2b\x7b\x35\x82\x62\x58\xce\x12\x70\xdb\xb3\xaf\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\xf3\xa0\x16\x8f\x2d\x5d\x21\xdb\xfb\x1b\x08\x62\xd0\xc9\x56\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\xd3\xa4\x7c\x2c\xa1\x21\x5c\x5b\x9a\x56\xb7\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\xcf\x50\xfa\xbc\x0a\xdf\x75\x31\xe2\x22\xfc\x7c\x7e\x07\x51\xbe\x6e\x36\xf9\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x9c\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\x09\x30\x92\xa4\x86\xc6\xf8\x44\x98\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x16\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x52\x29\xa3\x5a\xd9\x4a\x7c\x10\xb2\x1a\x5c\x2a\x4f\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x0e\x3b\xa4\x48\x36\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x7b\xf6\xe3\xf6\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\x1d\x42\x62\x90\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x6f\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xd3\x1b\x87\x63\xe4\x05\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xfd\xa5\x15\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x61\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x03\x05\x29\x75\xaa\x11\x4a\xe4\x07\x6d\xcf\xf1\xab\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x22\x51\x4e\x0b\xa6\xfa\x41\x9b\x69\x5e\x2d\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\x4b\x13\x60\xd8\x97\xb7\xc3\x7c\x9c\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xad\x5d\xf8\x11\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\x3f\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x72\x24\xf6\x1a\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xb2\xfb\xf2\xc5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x98\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xe6\xed\xb6\xee\x31\xd2\x10\x4f\xa8\xcd\x07\x66\x15\xa8\x3c\x49\x0c\x7a\x5b\x8f\xd9\x3c\x08\x16\x78\xb2\x16\x64\xdb\x58\x37\x6b\x5a\xca\xba\xc1\x7b\xae\x45\x26\x12\x31\x9a\x96\x77\xd0\x76\x75\x29\x95\xb7\xa1\x44\xe5\x03\x27\x02\x9a\x43\x74\x39\xb3\xe5\xad\x2f\x64\xe9\x68\x7d\x21\x73\xa3\xb5\x0f\xcc\x8e\xd6\x3e\xb0\xc1\x68\xed\x03\x0b\x46\x6b\x1f\x98\x1f\xad\x7d\xa0\xb5\x0f\xd4\x19\xcf\xdf\x3e\x40\x5a\x5f\xc8\xb2\xd1\xca\x3a\xc5\x68\x65\x9d\xf5\x47\x2b\xeb\xcc\x8f\x56\xd6\x69\x65\x9d\x56\xd6\x69\x65\x9d\x6d\x47\x0d\xe4\xce\x44\xdc\x78\x8a\x4c\x26\xe2\x15\x19\x32\xd6\x5e\x1d\x89\x6e\x22\xa2\x50\x59\xc4\x3c\xe2\x3c\x1f\x8a\xa6\xd6\x84\xde\x21\xff\x11\x1c\x6c\x7a\x82\x2d\x59\x9b\x02\x11\xd8\x04\x22\x13\xf1\x81\x3a\xdc\x22\xf0\xbc\xcd\xb0\x69\x33\x6c\x3e\x81\x0c\x9b\x31\x55\xae\xf0\x11\x92\xd6\xe5\x09\x37\xa5\xe3\x7f\x0d\x32\xfd\x64\xf3\x6d\x0c\xc2\x39\x84\xc1\x3e\x73\x05\x52\x58\xd8\xc5\xce\xb7\x0b\x71\xbf\x0a\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x76\x2d\x92\x09\x32\x64\xae\xfe\xd7\x0c\xfe\x3a\x08\x3f\xf1\xbc\x99\x2a\x24\x9e\x74\xf2\x4c\xf5\x53\x1a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xe4\x52\x69\x9a\xd1\x4a\xbb\x44\x3b\x77\xda\x4f\xb5\xf4\xd2\xa6\x94\x48\x54\xf2\xae\x36\x2a\x73\xbc\x7c\x2c\x2c\x4e\xfb\xef\x1c\xe4\x94\x88\x09\xc8\x42\x31\x0a\xdd\x79\x3a\xa1\xc9\x4c\x44\x5d\x01\xe4\x66\x0c\x3c\x8d\x98\x22\x9a\xd4\xd4\x9b\xf6\x1a\x92\x1d\xab\x7e\xbc\x7c\x34\xab\x38\x34\xa8\x36\x3c\xb5\x5a\xca\xcb\x47\xa3\xe6\x37\xd2\xb0\x09\x8e\x34\x68\x86\x23\xcd\x9a\xe2\x48\xe3\xe6\x38\xd2\xa4\x49\x8e\x7c\xf4\x0a\xd0\xcb\x47\xc3\xe6\x23\xd2\xb8\x95\x8e\x3c\xc1\x7a\xd2\xcb\xc7\x03\x80\xbb\x49\x8b\x1d\x69\xab\x53\xd7\x1e\x4d\x1b\xd4\x48\xd3\x46\x35\xd2\x34\x1e\x6e\x55\x05\x7b\xf9\x68\xeb\x63\x3f\x80\x9c\xd6\x98\x10\x51\xb7\xa6\xf6\x7d\x0b\x6d\x00\x27\x43\xef\xde\x8f\xa5\x00\x59\x2e\x5d\x34\x8c\x35\xef\x2e\xf5\xea\xc2\x50\xcd\x72\x63\x53\x1f\xb7\x8a\x18\x8d\xbf\xc7\xde\xe0\x95\xf3\x52\xf1\xb8\xd2\x64\x73\xad\x63\x0a\xd3\x59\x68\x1e\x63\x94\x82\xa2\xe9\x54\xe9\x61\xbc\xb7\x67\xc3\x49\x0b\x69\x82\xc7\xb3\x01\xa6\xc5\x13\xa8\x5f\xd8\x76\xb6\x7b\xde\x8e\xbd\xaf\x8a\x3b\xf6\x7a\xe5\xce\xb7\x6e\xc6\x83\xff\xf9\xdf\xc3\x4a\xf5\x96\x62\xc2\x56\xfb\x5b\x7b\xb4\xda\x5f\xad\xd1\x6a\x7f\x4b\x47\xab\xfd\xd5\x18\xad\xf6\xb7\xde\x68\xb5\xbf\xe5\xa3\xd5\xfe\x5a\xed\x6f\x8b\xd1\x6a\x7f\xad\xf6\xb7\xed\xf8\x84\xb5\xbf\x66\xa3\x9a\xcb\xba\x98\x0b\x12\x41\xf9\x51\x53\xcd\xa2\x22\xe2\xd9\xdf\x65\xff\xd5\xac\x0e\x58\xd6\xef\x16\x6b\x80\x65\x2d\x71\x4e\x0b\xee\xdd\xa3\xee\x05\x85\x70\xee\xc9\xd5\x9a\xe0\x73\x8b\xdc\x6e\x0c\x13\x4b\x2e\xe1\x46\x51\xf1\xda\x07\x96\x15\x8d\xd7\x43\xd4\x59\x4c\x0e\xbc\x2f\x1e\x1b\xa9\x70\xa1\xab\x17\xb9\x66\xdd\xe2\x8e\xe0\x9d\xc7\xa0\x9a\x4a\x3e\x7f\xc5\x85\x1c\x62\xd8\x42\x7c\x54\x81\x3d\x86\x3c\x82\xac\xac\x01\x1b\xd7\x0e\x19\xb7\x91\x8e\xbe\xe9\x8f\xe0\x3e\x68\xca\xd2\x53\xa4\x80\x1e\xcf\xad\xe8\x8b\xeb\x41\xf9\xb7\x80\x5d\x29\xca\x87\xe2\x21\xa3\xdc\x25\xc3\x0a\xee\xbb\xd2\xdb\x4e\xf3\x85\xbc\x1c\x7a\xa9\x84\xb7\xf7\xc8\x39\x62\x7d\x79\x62\xa6\x10\x3e\xd4\xf6\x3f\x69\x06\x91\x77\xab\x70\xc3\xed\xc6\x85\x1b\x66\x22\x46\xda\xba\x0d\x6d\xdd\x86\x5a\x75\x1b\xf0\xa2\x3d\xdc\x8d\x17\x70\x20\xff\x70\xed\x91\x24\x20\xa8\xd2\x3c\xd1\x2c\x2b\x22\xb0\x95\x7d\x55\x62\x35\x89\xa1\x8b\x04\xad\xe2\xbb\x79\x1b\x8d\xc6\xb3\x78\x8f\xf3\x61\xc4\xb6\x42\x72\xe2\xa2\x2d\xb1\x99\x11\x56\x1c\xf0\x6a\x87\x0d\x29\x65\x4f\x3f\x52\xf0\x0c\x09\xb6\x2a\xb4\x66\xdb\x6b\xcb\xd0\xf9\xc4\xa0\x84\xa1\xd8\x2b\x18\x44\xb9\xa1\x05\x46\xad\xb2\x09\xf0\x82\x4b\x1c\xa8\xc3\x43\x2f\x0d\x35\xca\xbd\x1e\x84\xfb\x7c\x5b\xe2\x12\x7f\x5b\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\x4f\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x1e\x3d\xa2\xed\x53\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x9e\x87\xdf\xa2\x4d\x18\x5d\x7f\x3c\x85\x84\xd1\x47\xf2\x4d\x3c\x9d\xbc\xd1\x27\xeb\x8f\x78\x2a\x79\xa3\xad\x0f\x62\xa3\xf1\x5c\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8c\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xcc\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x98\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x01\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4c\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\xb3\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x27\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\xf7\x8f\x4f\xbe\x1a\x5d\x25\x96\xee\xf1\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x79\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\xb3\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x89\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\x57\x20\x27\x2c\x82\x93\x28\x32\x7f\x5d\x8b\x1b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xdb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\xaf\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x4b\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7d\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\x2f\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x9f\x1f\xfc\x72\xf2\xf6\xd7\xcb\x93\xd7\xe7\x87\x28\x81\xc2\x5d\x46\xb9\x39\x15\xb9\x2a\x02\x45\xdd\xeb\xcc\x8b\x80\x4f\x98\x14\xdc\xac\x0f\x75\x35\x4a\x26\x7e\xd6\x28\x1c\x06\x09\x4a\x24\x13\x88\xad\x9c\x1c\xde\xe6\xb9\x0e\xe3\x59\xae\xbd\xee\x88\xe1\x8b\xe6\x00\xf1\x68\x4c\xf9\xc8\xac\xf3\x4c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\x4a\x4e\xd4\x63\xed\xe7\x1d\xcf\x29\x0c\xad\x57\xb6\x24\xa2\x8a\x68\xe6\xd7\x5c\xfe\x2c\x35\xe5\x9a\xde\x1d\xdb\xf8\xbd\xbd\xcf\x4b\x97\xf6\x7c\x39\x49\x61\x5e\x61\xf9\x8d\x5d\x55\x82\x95\x0c\x13\xb2\x57\xbe\xbb\x47\xce\xcd\x3b\x20\x2e\x03\xd0\x86\x5f\xc2\x04\x24\x6a\x9e\x0e\x7c\x1d\x22\x61\x44\x65\x9c\x80\xc2\xc0\x43\x4f\x9b\xad\x76\xe0\x00\x06\x41\xaf\xe5\x42\x2f\x22\x26\xe4\xb5\xc0\x20\xc4\xa1\x38\x26\x63\xad\x33\x75\x7c\x74\x74\x93\x0f\x40\x72\xd0\xa0\x7a\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x1b\x75\xc4\xb8\x39\x5c\xdd\x98\x6a\xda\x2d\x9d\xea\x23\xcb\xb9\xbb\x91\x48\x53\xca\xe3\x2e\x75\xd8\xd5\x0d\xdb\x7a\xf4\x07\xc7\x53\xbb\x34\xdc\xc5\x78\x97\x76\xd5\x18\x92\x64\x7f\x0b\x7c\xae\x27\xf3\xd5\x90\xf5\x6a\xc9\x78\xee\xdb\xeb\x1f\xe0\xf3\x70\x5e\x2d\x0c\x7a\xe4\x52\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\x97\x1e\xe9\xf3\xcb\xeb\xb7\xff\xec\xbf\xb9\xb8\xbc\x6e\x4f\x76\x7b\xb2\xdb\x93\x5d\xe3\x64\x03\x9f\xd4\x3e\xd5\x5e\xe6\x2c\x1d\x93\xb0\xdf\xc8\xa9\x15\x68\x7f\x0c\xc2\x06\xd4\x96\x10\xed\x78\x34\xa8\x57\x20\x70\xce\x27\xbf\xd0\xaa\x85\x9d\x2f\x04\x07\x71\x37\x58\x41\x39\xc8\xe0\x75\xe2\xe3\x6b\x58\xb3\xea\xba\xaf\xb6\x92\x22\xed\xa8\xef\x5a\x32\xaf\xde\xde\xd0\x50\xd9\xbe\x4b\x9a\x16\x15\xaa\x17\xec\x5a\x8f\xbc\xf6\x6a\x0f\x39\xfd\xf5\xe2\xec\xfc\xf2\xfa\xe2\xfb\x8b\xf3\xb7\xdb\xeb\xd1\x0d\x58\x5c\xd0\xa6\xd0\x10\x00\xf6\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xc1\x0a\xb2\x98\x08\xcc\x9e\x7e\xe7\xf7\x9d\x06\x7d\x7c\xe1\x63\x2d\xb3\x6d\x96\xd9\x9e\xc1\x90\xe6\x89\xd5\x9e\xf6\xf6\x7a\xdb\x70\x39\x3b\x9a\x42\xdf\xef\xa5\xa8\x51\x81\xb9\x82\xc2\x57\xb6\x76\xfb\x50\xc8\xa5\xc7\x78\xdf\x45\x1f\x54\x58\x8f\x13\x1e\xad\x85\xce\x49\x8f\xd6\x49\x56\x13\x3a\x35\xbd\x0c\xcd\xf8\xde\x23\xc1\x87\x6c\xf4\x9a\x66\x3f\xc1\xf4\x2d\x0c\xeb\x99\x89\xab\xf0\x46\xeb\xa3\x73\x25\xa3\xad\xd2\xb0\x33\xfb\xb2\x7a\x6e\x9a\xc6\x9c\x34\x4d\x45\x67\xd4\x8f\xcc\x68\x2e\x90\xa2\x91\x20\x8a\xb9\x7a\xf8\xd6\x0e\xed\x2c\xca\x4d\xc5\xd8\x34\xe2\xb9\xaf\xc7\xe5\xfd\xa8\x32\xbb\x32\xbb\x77\x74\x56\xaf\xab\x76\x44\x82\x47\x90\x69\x75\x24\x26\x86\x73\xc1\xed\xd1\xad\x90\x37\x46\x8f\x30\xba\x6b\xd7\x62\xad\x3a\x42\x9f\xc1\xd1\x1f\xac\x1b\xec\xfa\xcd\xd9\x9b\x63\x72\x12\xc7\xae\xb9\x49\xae\x60\x98\x27\xae\x9d\x40\x8f\xd0\x8c\xfd\x02\x52\x31\xc1\x3b\xe4\x86\xf1\xb8\x43\x72\x16\x7f\xb7\x3d\x71\xf6\xa3\xc1\x5d\x10\x99\x75\x75\x36\xbc\x13\x57\xe8\x63\x99\x56\x78\x57\x20\x22\x86\x6b\x31\xad\x10\x37\xbd\xd5\xd9\x09\x19\x0d\x81\x66\x73\x13\xfd\xec\xc0\x2d\x6c\x96\xae\xee\x17\x84\xd5\xba\x38\x1d\xa2\x66\x22\x3e\x26\x2a\xcf\x32\x21\xb5\x22\x29\x68\x6a\x94\xde\x9e\xc1\xb0\x4e\xf5\x4f\xf4\x55\x75\xc8\x6f\xe1\x47\x74\x38\xa9\x77\xfb\xfb\xdf\xfe\x74\xfe\xcf\xbf\xed\xef\x7f\xf8\xad\x7c\x15\x59\xa1\x8d\x02\xaa\xde\xa2\x32\x88\x7a\x5c\xc4\x70\x89\xef\xc0\x3f\x55\xc5\xcd\xe2\x2e\x68\xaa\x73\xd5\x1b\x0b\xa5\x2f\xfa\xe1\xcf\x4c\xc4\xb3\x7f\xa9\x1a\x12\x07\xd9\x4d\xc6\x80\x5b\xd4\xa7\x7a\xbc\x23\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xb9\x89\x4e\x4a\xf1\x9f\xdf\x7b\x10\x18\xe9\xe9\x56\x32\xad\xd1\xf5\xe6\x52\xc1\xc5\xb0\x63\x4e\x6d\x21\x76\x4e\x5e\xd6\xae\x8f\xd2\x28\x69\x0b\x3b\xd8\x30\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\x3b\xef\x62\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\xa7\xf7\x7e\xff\xa0\x34\x2e\x34\x5d\x72\xa0\x0a\x1a\xe2\xb1\x0d\x0a\x0a\x49\xc6\x24\x61\x29\x73\xb1\x86\xae\x41\x93\x22\x07\xf6\xc7\x5e\x94\xe5\x1d\x77\x43\x2f\x85\x54\xc8\x69\xf8\x13\xb2\x31\xa4\x46\xd3\xea\x2a\x2d\x24\x1d\x41\x27\x3c\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x85\xab\xd4\x51\x64\x88\x9f\x1f\x6d\xf3\xa0\xdf\x11\xd2\x16\x30\xe3\xf2\x01\x44\xc2\x60\x89\xb3\x02\x67\x80\x22\xea\x93\x13\x91\xe4\x29\xa8\x4e\x10\x83\xac\x35\x80\x4f\x8c\x66\xa9\x76\x4a\x50\x8b\xd9\x84\xa9\x26\xc2\x88\x17\xc8\x69\xcc\x45\xe4\x8b\x5c\x67\xb9\x76\xf5\x66\x4a\x8d\xdd\x84\x42\xbb\x45\x28\x0a\x50\x21\xfb\x2f\xf7\xea\x47\xa3\x53\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\x6b\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xae\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\x3e\x37\x3e\xf7\x29\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x06\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xd6\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x06\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x79\x05\x20\x18\x44\xbc\xf2\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x8f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\x93\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x35\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xd5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x80\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd2\x54\x1b\xac\xbe\x02\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\x6f\x38\x12\x8d\x93\xe4\x96\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\x6e\x99\x5a\xa8\xac\xd4\x46\x9c\x3f\xe0\x4c\x86\x56\xd9\xbf\x3f\xfa\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\x95\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x28\x92\x73\xcd\x12\xbb\x18\x21\x6e\x48\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\x0f\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\x77\x10\x35\x96\xe7\x7f\x7e\x07\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x06\x9e\x51\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xef\xfb\x1d\x02\x3a\x3a\x24\xb7\x82\xef\x6b\x5c\x7e\x8f\x5c\x0b\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcb\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x63\xda\xc5\xab\x19\x92\xf1\x02\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x0f\x48\x81\x39\x88\xdc\x5d\x79\x76\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x01\x9a\x6b\xe2\xf3\xe3\xf5\x75\xff\x07\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\x7f\x8a\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x04\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x9e\x1d\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xc3\x94\xbe\xfc\x18\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\x7f\xfa\xd3\xd7\x7f\xea\xd9\xe9\x43\x94\x02\x27\x17\x27\x97\x27\xbf\x5e\xfd\x72\x8a\xc9\xb1\x75\xa1\xda\x50\x08\x66\xd3\x01\x98\x8d\x86\x5f\x3e\x68\xf0\x25\xa6\x7c\xd4\xa6\x22\x55\xdb\x3f\x4e\x69\x30\xc0\xe8\x6d\x46\xe3\x74\xb2\x5f\xa9\x58\x99\x91\x35\xab\x86\x54\x73\xd4\x76\xe2\x8c\xe9\x28\xbb\x12\xd1\x4d\x83\x7a\xcd\x19\x64\x12\x22\x6b\x27\xbb\x3e\xed\xdb\xd9\x8d\x7e\x79\xf9\xe6\xba\x48\x35\xc0\x78\x1c\xf2\xca\xdb\x97\x7e\x74\x96\x34\xa3\x93\xde\x40\xa6\x83\xea\x3e\xa0\xd1\xcd\x2d\x95\x31\x5a\xb6\xa8\x66\x03\x96\x30\x5b\xfc\xd7\x37\x85\xe4\xc2\x06\xfc\xd9\x22\x67\x62\x38\x5b\x5a\xb3\x30\x87\xa2\xc9\xca\xc6\xd1\x0c\x29\x4b\xd0\x82\x9a\x73\xcd\x52\x70\x11\x41\x51\x16\x4c\x7a\x65\x9b\x76\xab\x7c\xf9\xb1\xb3\xca\xd7\xfe\x1b\xef\xd5\xdb\x58\x0f\xab\x1b\x97\xb8\xc3\xac\xce\xb1\x38\x9b\x10\xd2\xb2\xba\x4f\x82\xd5\x65\x12\xae\xb4\xc8\x1a\xf2\x92\xd8\xc9\x96\xf8\x48\x06\x30\x14\x86\x08\x2f\x75\x7a\xf8\x1e\xc1\x1c\x93\x03\xbd\x55\x4b\x54\x1c\x1b\x36\x22\x53\xe5\xd1\xd8\x1b\x28\x39\x28\x75\x84\xee\x90\x3c\xb3\x5a\x2b\x92\xeb\x5c\x42\xc7\x7c\x1d\xa4\xb8\xba\x4e\x91\xe5\x60\x5e\x0f\xdc\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\xc2\xa0\x6e\xf9\xb3\x6e\x94\x48\x52\x35\x06\x2c\x2f\x02\x77\xcc\x77\x43\xe9\x8b\x78\x7f\xbf\xf8\x14\xc3\x58\x46\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x5b\x4e\x06\x30\x62\x5c\x79\x50\x98\xb9\x3d\xcc\xd0\x1f\xc3\x54\x28\x0c\xd7\x23\x6f\x2b\xc5\x4e\x5c\x1a\x52\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x55\x6a\x99\x1c\x20\xec\xc3\x63\xf5\x1a\x4b\x3e\xc8\x39\xbe\x39\x86\x84\x4e\x6d\xb4\xe9\x90\x71\x9a\xb0\xff\x80\x54\x87\x0d\x78\x9c\x0c\x08\x8b\x6b\x4b\xd7\x81\xa5\xfa\x69\x34\xae\xe7\xfc\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x9c\xb6\x3e\x3a\x15\x58\xe4\xfc\x44\xe5\xa6\x71\xe1\x55\xa5\x3e\x71\xa5\xb2\x20\x3e\x15\xc7\x79\x84\x0a\x3f\xd3\xc2\x7c\xa9\x4d\x5d\x15\x3e\xc9\x50\x1d\x65\xc2\xfe\x5f\xe1\xa8\x28\x79\x28\xac\xc2\xbb\x7d\xce\xda\xa3\x65\x63\xd5\x71\x4b\x7c\x1c\x97\xc4\x8e\xf8\x6f\x1a\x70\x43\xb4\x2e\x88\x67\xe7\x82\x78\x3e\x5d\x73\x9d\x67\xfe\x7a\x2c\x41\x8d\x45\xb2\x35\xa2\x57\x90\xfc\x35\xe3\x2c\xcd\x53\x83\x73\xca\xe0\x33\x9b\x84\x10\x00\x15\xd0\xd5\x52\x6c\x6b\x45\x34\x37\xb2\x18\xb0\xd8\x29\x65\x89\xd9\x46\xcc\xdf\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xb6\x52\x2b\x6b\x38\x5f\xf7\xc2\x9b\x42\xeb\x8c\x97\xf5\xe8\x4d\x3d\x26\x6e\xcb\x91\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\x7f\x78\xdb\x3f\x2d\xb7\xc9\xe6\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\xd8\xc7\x9b\x8c\xb0\xe6\x9a\xf1\x63\x33\xf7\x01\x68\x5a\xd2\x6d\x9c\x5a\xa0\x08\x70\x3a\x48\xcc\x73\xe6\xa9\xc0\x91\xfb\x96\xef\x02\xd5\xb9\x04\x32\xa2\xfa\x31\x09\x7e\x7d\x15\xa6\x96\xfa\xd2\x04\xbf\xa9\x2b\xa1\x57\x6d\x70\x46\x0e\xaf\x5a\xa1\x46\x88\x17\xb6\x82\xfe\xda\x72\x78\x6d\x4a\x59\x5f\x36\xae\x7f\xb4\x08\x96\xb8\xc1\x0f\x6f\x0c\xc0\x7b\xae\xe5\xb3\x67\xe7\x65\x25\xc8\x77\x95\xd2\x82\x64\x09\x2d\xfa\x42\xe1\x0e\xfc\x88\x3c\xe8\x74\x0c\xd1\xcd\x5b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\x79\xcf\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xc7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6a\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x40\x51\xe6\x87\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x31\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xc7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x07\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x82\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x8a\x5b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xec\x88\x06\x56\xa5\x1e\xde\x0a\xec\x5e\x74\xbf\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x65\x51\x4e\xf9\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\xcf\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\x73\x9f\xd5\xf8\xfa\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x8f\x14\x9b\xb2\x83\x82\xee\x13\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x07\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xc3\x92\xc4\x4d\xd3\x23\x57\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf8\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x96\x1f\x6e\xe4\x75\x45\x47\xeb\xf5\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x71\x3b\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xed\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x73\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x89\x4f\xc1\xcb\x3c\xb5\x2a\x02\x0a\x5c\x18\x3e\x7f\xf6\xe6\xfc\x0a\xc3\xf2\x33\x69\x2b\x85\x60\x1c\x17\x5e\xc7\x99\x06\x60\x9e\x70\x9d\x7b\x7b\xe4\x84\x4f\xed\x45\x7b\xa6\x98\x22\x09\x53\x1a\x90\xeb\x39\xb1\xcd\xfb\xaf\xf7\x5e\xf4\xf0\x7f\x7b\x84\xc6\xb1\x34\x72\x5d\x08\x4f\x8b\xe6\xe2\x45\xad\xe4\xc7\x06\x49\xe9\x03\x38\x68\x1b\x8d\xf6\x5a\xc4\x6e\xe5\xc8\x49\xd0\x77\x65\xd9\xa0\xd2\x92\x6a\x18\xb1\x88\xa4\x20\x47\x40\x32\xaa\xa3\x31\x49\xe9\x94\x44\x42\xca\x3c\xb3\x75\xfe\x63\xaa\x69\x8f\x7c\x2f\x24\x49\xfd\x21\x36\x38\x6f\xf8\xf0\xd5\x62\x9f\x7e\x71\xb2\xcb\xff\x64\x4a\xe5\xa0\x8e\x5e\xbe\xf8\xf3\x57\x7f\xfa\xd3\xb3\x6a\x0d\x57\x84\x0b\x99\xbd\x2d\xb5\x86\xa3\x7e\x17\xec\xae\xdb\x56\x81\x8c\x8f\x92\x32\x7e\x6d\xc7\x00\xea\x6a\x99\x75\x75\xcc\x6e\xf1\x05\xfd\x6d\x55\xcd\x46\x5a\xd4\x15\x6b\x68\xa8\xb1\x53\xc1\x07\xbd\x62\xe5\x68\x83\x28\xf7\xea\xbd\xe8\xfb\x83\xe9\xe4\x9c\x74\xa6\xc1\x6b\x56\x44\x27\x75\xc8\x0b\xf2\x2d\xb9\x23\xdf\xa2\xa2\xf5\x4d\xdd\x36\x58\x75\x55\xa0\x26\x82\x8d\x8c\x7e\x7f\xd1\x6f\x08\xe2\xff\x30\x44\xd3\xcc\x68\xa0\xaa\x05\x19\x30\x27\xd8\xc3\x9d\x06\x69\x04\x4d\xb7\x13\x8f\xda\x40\xcc\x2c\xf0\x23\xa2\x99\x75\x3c\x5c\x0c\xab\x01\x4e\x9b\x21\x9a\x79\xfc\x47\xa1\xf4\xa5\xa3\x42\xd5\x56\x38\xc5\x6c\x29\x12\xfe\x0a\x19\x33\x7c\x43\xe9\xe2\x80\x29\x12\x0b\x8c\xb7\xb2\x81\xcc\x63\x56\x23\x8c\x62\x77\xd0\xb8\x9e\x67\xbd\xb2\x9f\xab\x76\x6a\xc6\x94\x82\x3a\x90\x13\xb1\x4a\x35\xb2\x32\x11\x3b\xe9\xcc\x2c\x2b\x2e\xf1\x8c\x15\xe2\x99\xb3\xda\x04\x7b\x33\xe2\x92\x39\x4f\x11\xe5\x36\x95\x64\x08\x52\xda\xd8\xf3\xc1\xd4\x87\xed\xd5\xde\xbc\x5a\x27\x29\x93\x42\x8b\x48\xd4\xe8\x71\x56\xf5\x76\xbb\xe9\x10\x08\x36\xde\xd7\x1b\xcc\x7f\x3e\xeb\x77\xc8\xf5\x69\x1f\xfb\x3e\x5d\x9d\x5e\xf7\xab\x3a\xcb\xde\xf5\x69\x7f\xef\x51\x41\x41\xbc\xc0\x87\x26\xea\x2d\x26\xa9\x98\xa0\x8c\x34\xd9\x4d\x69\xd6\xbd\x81\xe9\x96\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x78\x36\x09\x34\x66\x1f\x29\x9f\xcb\x07\xc4\x86\x77\x2e\x4e\xec\x4a\xc5\x04\x62\x2b\xa5\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbd\x36\x7f\xba\xcd\xf6\x5a\x7b\xb4\xd9\x5e\x6d\xb6\xd7\xfc\xd8\x99\x90\xd6\x36\xdb\xeb\x79\x79\xf0\xdb\x6c\xaf\x4f\x3c\x08\xa0\xcd\xf6\x5a\x3c\xda\x6c\xaf\x36\xdb\x6b\xbd\xd1\x66\x7b\x6d\x3e\x76\x2e\x7c\xa9\xcd\xf6\xda\x68\xb4\xd9\x5e\xf3\xa3\xcd\xf6\x5a\x32\xda\x6c\xaf\x25\xa3\xcd\xf6\x6a\xb3\xbd\xda\x6c\xaf\x36\x08\xf6\xde\xb9\x76\x33\x08\x96\xb4\xd9\x5e\x6e\xb4\xd9\x5e\xcf\x22\xd4\x8f\xb4\xd9\x5e\x6b\x8d\x36\xdb\xab\xcd\xf6\xda\x66\xb4\xd9\x5e\xcf\xc5\x5c\xd2\x66\x7b\xb5\xd9\x5e\x9f\x8e\xa0\xdb\x66\x7b\xb5\xd9\x5e\x6d\xb6\x57\x9b\xed\xb5\x72\x15\x6d\xb6\xd7\x73\x50\x01\x7d\x47\xe0\xfa\xd9\x4b\xfb\xa7\x22\xcd\x72\x0d\xe4\xad\x9f\x32\x48\x91\x96\x30\x30\x55\x96\x08\xea\x87\x10\x46\x82\x0f\xd9\xc8\x51\xf6\x23\xdb\x86\xb7\x1b\xbe\xa7\x5b\x6a\x7d\xfb\x04\xe3\x07\x13\x96\xb2\xed\x52\xca\xc8\xdc\xc6\xbc\xc2\xb9\x4a\x7e\x19\x73\x92\x52\x7a\x87\x47\x84\xa6\x22\xb7\xad\x8b\x23\xb7\x7f\x01\x84\xd6\x7b\xb5\x73\x3b\x43\x9a\x51\x71\x68\xec\xe3\xea\xfa\x4d\x84\x95\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x91\xb8\x39\x81\xb8\x21\x71\xf8\x41\x84\x61\xe7\xd0\x6d\xe8\x2c\xba\x60\x94\xb9\xd3\xe8\x18\xd6\xaa\xd3\xe8\xa9\x29\x8a\x79\x61\x1e\xa6\x88\x48\x99\x36\xc2\xa1\x91\x07\x69\x39\x9c\x95\xe9\x8a\x52\xea\xe8\x00\x06\x74\x53\x6d\x1b\xad\x87\x50\xd0\x52\x10\x8b\xf0\x92\x9f\xeb\x44\xcf\xd2\x2c\xc1\x06\xe7\x78\x9e\xbb\x3e\x96\x05\x99\x6b\x4b\x1b\xee\x1f\x2d\x6d\x78\x8e\xb4\x41\x41\x94\x4b\xa6\xa7\xa7\x82\x6b\xb8\xdb\xca\xc2\x52\x25\x0d\x57\xd5\x09\x5d\xcc\x98\x72\xb1\x6e\xf6\x1a\x11\x99\x8d\xfb\x9e\x49\xac\x1f\x8b\x3c\x89\x31\x99\x23\xe7\xa8\x60\xda\x2c\x3d\xd0\x56\xfb\x43\xbd\x07\x43\xb9\x67\x5f\xe2\xf5\x39\xab\x66\xfe\x3b\x67\x13\x9a\x18\x6d\xb7\x78\xa2\x8f\x1a\x4c\xf9\xa1\x75\xcf\xbc\xa6\xea\xa6\x38\xf0\xd0\x35\x32\x74\x58\xf3\x91\xff\x24\xfc\x09\xee\xf4\x53\x94\xd2\x50\x40\xea\x4b\x36\x61\x09\x8c\xe0\x5c\x45\x34\x41\xba\xd6\x0c\xaf\x38\x59\x32\x3b\x6e\xbc\x14\x89\x22\xb7\x63\x30\xb4\x9a\x50\x6f\x02\xc0\x0c\xbb\x11\x65\xdc\xe6\xc5\x67\xfe\x61\x65\x6d\x09\x86\xfc\x67\x54\x9a\x0d\x0e\x36\x03\x54\x91\x07\x42\x24\x2e\xe3\x21\x99\x16\xf3\xbb\xdc\x1f\x2e\x7e\xe5\x70\xfb\xab\x99\x4d\x91\x61\x42\x47\xc1\x54\xa0\x40\xcf\x59\xfb\x8a\xa9\x97\x7e\x00\xa6\x13\xe4\x40\x68\x72\x4b\xa7\xaa\x30\x9c\x94\x2a\x40\xa8\x63\xf2\xf2\x10\xd1\x99\x2a\x12\xe6\x88\xc9\x57\x87\xe8\xfe\x3b\x3d\xe9\xff\x7a\xf5\xcf\xab\x5f\x4f\xce\x5e\x5f\x5c\x92\x4b\xa1\xc1\x32\xb5\x52\x9b\xc0\x28\x68\x18\x66\x95\xf8\x0e\xd4\xd2\x85\xea\xa1\xed\x92\x29\x72\xcb\x78\x2c\x6e\xd5\xd6\x36\x5a\x8b\x7e\x06\x78\x40\xf9\x56\x73\x44\x34\xa3\xd8\xfd\xb0\x06\x87\x99\x8b\x30\x29\x4f\x8a\x3c\x3c\x8e\x8f\x62\x29\x32\x0b\x04\x6f\xe4\x2a\x58\x6d\x55\x8d\x2e\xc7\xb0\xe2\xfe\x0e\xab\x13\x8e\x24\xe5\xba\xb0\xf6\x14\x7b\xe6\xda\x2e\xf6\x6a\x6f\xc7\xd3\xce\x68\xa2\x71\x73\xd9\x4c\x27\x71\x0c\x71\x05\xfc\xcf\x2e\x72\xf0\xd4\x7f\xdc\xb4\xa8\x52\x41\xfa\x6f\xae\x2e\xfe\x7f\x33\x78\x3c\xcd\xea\x05\x4a\x35\x93\x19\x2b\x45\xd6\xd8\xee\xbe\x75\x99\x97\xed\xfe\xee\xc4\xfe\x06\x6e\xd9\x8c\x7b\xfe\x6d\xce\xab\x25\x8d\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x36\x35\xae\xc3\x1b\x8d\x1c\xf1\xda\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x8e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x0d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xda\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x91\x77\xbd\xc6\x21\x34\x40\x79\xc3\x93\xe9\x5b\x21\xf4\xf7\x21\x8d\xb6\x11\x0c\xf8\x87\x93\x96\xab\xa6\x68\x14\x27\x29\xbe\xb7\x8b\xbb\x81\x87\xaa\x9c\xc1\x7b\x56\xec\xf8\x53\x3f\x52\x32\xe7\x27\xea\x07\x29\xf2\xad\x99\xd8\x9c\xb0\xf9\xc3\xc5\x19\x92\xa2\xdc\xb9\x2a\xb9\x96\x53\x2c\x1d\x30\x5f\xff\x2d\x28\x06\x3f\x3b\x67\x6b\xf9\x4c\x14\x7e\x31\xf2\x9a\x4e\x09\x4d\x94\xf0\xb0\x64\x7c\xa1\x16\xea\x54\x5c\x73\x79\x20\xf4\x78\x4e\xb7\x35\x07\x6a\xfe\xb9\x4e\xc9\x73\x59\x14\xa4\x63\x7c\xee\x71\x4d\x6f\x40\x91\x4c\x42\x04\x31\xf0\xe8\xb1\xb7\xfd\xb1\x1d\x7e\x88\x3a\x97\x82\x9b\x83\xd9\x08\xf2\x5c\x04\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe5\x03\x48\x0c\xe4\x8d\x4a\xea\x7a\xc6\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbe\xa7\x8a\xfc\x7c\x71\x46\x5e\x90\x03\xf3\xae\x43\xc4\x1f\x6c\x29\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\xfb\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x37\x71\xfd\x71\x29\xd4\xcf\x0a\x64\x63\x04\xea\xe7\x2d\x08\x54\x59\x8c\x32\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\x70\xf9\x1b\x76\x76\x4b\x3f\x6d\xf2\xa5\xe0\x15\xe3\xf9\x9d\x0d\x3c\x6a\xce\xd4\x72\x75\x8e\xd3\x92\xc8\x43\x1d\x77\x9d\x66\x59\xc2\x6c\xb5\x8d\x99\x40\xb8\x8b\x0a\xae\x74\x96\x88\x89\x48\x27\x68\x92\x08\x43\x1f\x8d\x70\x42\x79\x2c\xd2\xb9\x97\x19\x21\x12\x2a\x95\x53\x7b\xa4\xc5\xbe\xea\xd8\x11\xa3\x50\x02\x13\xa8\x51\x5b\x6c\xb6\x52\xac\x99\xcd\x00\xc7\x63\x04\x4e\x4f\x12\x3a\x80\xc4\xc2\xd8\x62\xa0\x9a\xc7\xc0\xc7\x8e\x46\x95\x22\x69\x2e\x7d\xe6\xad\x48\xc0\x86\x77\x79\x40\x98\xe9\x9f\x04\x1c\x70\x92\xa6\xe0\x80\xda\x60\x05\x0e\xa8\xd7\x3e\x05\x38\xe4\x35\x58\x3d\x99\x85\x83\x91\x1b\xaa\x70\x40\xe6\xbd\xeb\x70\x50\x10\x45\x22\xcd\xfa\x52\x18\xb5\xb3\x31\xde\xe4\xa6\x2d\x7c\x86\xd6\xb0\xb1\x20\x18\x0b\x79\x41\xf5\x66\x2a\x4b\x81\x9d\x54\x5b\x26\xe1\xa3\x3b\xff\x3f\x25\x9e\x85\xa4\x67\x96\x91\xf9\x59\x2a\xee\x45\xf3\xa4\xbb\xf0\x94\xd9\x41\x13\xb9\x11\x35\x8c\x9d\x8d\x70\x23\x11\xd1\x04\x6b\xc7\xd6\x43\x39\x32\x8b\x76\xb3\x13\x97\xc2\x79\xd1\x47\x89\xbf\xf9\x00\x12\x2c\x23\x8a\xbf\x38\x13\x26\x17\x31\x94\x7c\xd9\x36\x0e\xf9\xda\x86\x7d\xe2\x7d\x3e\x92\xd8\xc8\x15\xde\xad\x1c\x57\x9e\xd6\xc2\x55\x40\x7b\x1d\x2a\xd2\x9a\x05\x02\x8f\x19\x1f\xa1\x5d\xad\x43\x24\x24\x36\x06\xd9\x11\x81\x1b\xab\x41\xee\xe3\x91\xf0\x93\xfa\xf3\xe0\x5f\x8d\xb2\x18\x13\xdc\xcd\x8c\x96\x22\x2f\x61\x0d\x2d\xb9\x65\x8a\xec\xbd\xf2\x00\xa8\x51\xc2\x73\x17\x39\xcc\x9e\xfd\xc2\xb0\x9b\xd6\xd2\x79\xc3\x78\xec\xc2\x75\x2b\xc0\x0a\x35\xe0\xad\x1c\x8c\x81\xe0\x2c\x2e\xd3\x96\x63\xf2\x9e\x93\x00\x2c\xd2\xdd\x1a\x3d\xde\x5a\x91\xd9\xdb\xe8\xba\xab\x0d\xaf\xe1\x25\xb3\xd3\xfc\xcc\x71\xef\xcd\x7b\xbb\x46\x73\x9f\xbf\xcf\x7f\xcb\xa3\x96\xee\x71\xd4\xaf\x69\x2d\xe6\x1f\x76\x5a\x2f\xd2\x47\x06\xad\x35\xe3\x23\x55\xd6\x64\x68\x92\x54\x8c\xe1\x8b\x54\x19\xbf\xc3\xa1\xe2\xff\xbc\x0a\x31\x93\x66\xf0\x54\xd4\x90\xc4\x88\x13\x4f\x5c\x09\x19\xa5\x8a\x9e\x4a\x03\x09\xcd\x68\x72\x95\x6d\x5f\xa2\x94\xcc\x95\xc3\x7b\x7d\x75\x52\x9d\x1a\x99\x35\x36\xa4\x30\x7b\x65\xae\x13\x1a\xa7\x4c\x29\x34\x84\xc1\x60\x2c\xc4\x0d\x39\x58\xd9\xa9\xa1\xab\xd8\x48\x1d\x39\x9c\xef\x9a\xd5\x1f\x12\xc6\x93\x10\x15\x85\x7a\x30\xd7\xca\x1b\x72\xf0\x25\x51\x58\x05\xee\xa1\xab\x5b\xed\x82\x15\xe6\x97\x69\x2b\x55\x1b\x2c\x78\x74\x82\x3d\xbf\x3d\x97\x35\xcb\xae\xdc\xb3\x45\x97\x0e\xb7\x67\x2b\xab\x2d\x84\xa3\x95\x1e\x1f\x1d\x48\x4e\xb8\x88\x40\x35\x57\xd0\xe9\xc7\x62\x4e\x12\x83\xcd\xe2\x01\x8c\x7e\xa2\x4b\x83\xec\xd0\x2e\xbd\x8f\xc9\xa0\xee\xd1\xfd\xb2\x44\x7d\x5d\x10\x17\xa3\x8f\x24\xd9\x98\x76\xad\x92\x6e\x28\x1a\x92\x40\x2f\x42\x8c\x05\x17\x2e\x49\xc2\x30\x51\xc1\x11\xa5\x91\x44\x59\x6f\x1e\xee\x89\x23\xd1\xa5\xa5\x9e\x16\x5e\xe2\xb2\x23\x10\x93\xc9\x74\x68\xad\x62\xd7\x70\xcb\xf4\x18\xeb\xbc\x8e\x67\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\xda\x57\x65\x47\x75\x51\x0a\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x50\x14\xbe\x75\x59\x06\x06\xc1\x5c\x29\xf9\x94\xdd\x99\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc1\xd9\xc5\x97\x0f\x7b\x84\x5c\xf0\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x3e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xca\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0e\x7f\x55\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x91\x4c\x7d\x75\x17\xf6\x1f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x2f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\xb6\xa4\x22\x42\x92\x5b\x2a\x53\xc3\x37\x68\x34\x46\x0f\x25\xe5\x24\xce\x25\x56\x59\xd6\x40\xe3\x69\x57\x69\xaa\x8d\xa4\x0c\xd2\x29\x94\x7e\xfd\x6d\x49\xfd\x95\xa3\x2d\xa9\xbf\xe6\x68\x4b\xea\xb7\x25\xf5\xe7\xc7\xce\x44\x87\xb6\x25\xf5\x9f\x57\x99\xa4\xb6\xa4\xfe\x63\x7b\x13\xda\x92\xfa\x6d\x49\xfd\x55\xa3\x2d\xa9\x7f\xcf\x68\x4b\xea\x6f\x31\x9e\x01\xe5\x6a\x4b\xea\x6f\x31\xda\x92\xfa\x8b\x47\x5b\x52\x7f\x7e\xb4\x25\xf5\x97\x8e\xb6\xa4\xfe\xd6\xa3\x2d\xa9\xdf\x96\xd4\x6f\x2b\x8d\x6e\x36\xd7\x6e\x56\x1a\x25\x6d\x49\x7d\x37\xda\x92\xfa\xcf\xa2\x9e\x22\x69\x4b\xea\xaf\x35\xda\x92\xfa\x6d\x49\xfd\x6d\x46\x5b\x52\xff\xb9\x98\x4b\xda\x92\xfa\x6d\x49\xfd\x4f\x47\xd0\x6d\x4b\xea\xb7\x25\xf5\xdb\x92\xfa\x6d\x49\xfd\x95\xab\x68\x4b\xea\x3f\x07\x15\x50\xe9\x98\x6d\x55\x01\x74\x9d\x62\x45\x2e\x08\xbd\x54\x1b\x60\x90\x0f\x87\x20\x91\x72\xe1\x9b\xe7\x82\xa7\x8a\xba\x8c\xb3\x4e\x56\xd0\x1d\xac\x7b\xe4\xf2\x75\x96\x3c\xee\x8a\x11\x60\xa5\xce\x22\x52\xfc\xfc\xcd\xf7\x0b\x2a\x23\x6d\x1d\x55\xb8\x6d\x8c\x34\xae\xf9\x0d\xdf\xce\x3f\xbe\x04\xe0\x8b\xf2\xc7\x1c\xdc\xa3\x44\x28\x17\xe1\x8e\xc0\x8a\xc6\x94\x73\xf0\xfa\x1e\xd3\x68\x47\x19\x00\x70\x22\x32\x70\xde\x69\x4a\x14\xe3\xa3\x04\x08\xd5\x9a\x46\xe3\x9e\x79\x13\xf7\xc0\x2e\xa2\xd1\xdd\x2f\x4a\x4b\xa0\xa9\x8f\xcb\x4f\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x42\x8d\x65\x54\x01\x18\x18\x15\x57\x84\xb0\x77\x8a\xb7\xb9\x65\x89\x72\x69\x3a\xd4\x36\x3b\x58\x0f\x3c\xcd\xf4\x34\xc4\xf1\x02\x19\x32\xa9\x34\x89\x12\x86\xdc\x1a\xdf\x68\x73\xa7\x71\xbe\x8e\xe7\xd5\xdc\xad\x54\xb9\xa5\xf2\x18\xc5\xd6\x4c\x2b\x1b\x15\x5b\x4c\xe8\xa6\x8a\x99\x72\x62\xbe\xea\x10\xea\xeb\xa6\x59\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x4a\xd3\x95\xea\xc5\x16\x61\xc3\x05\xa2\x63\x8a\x83\x47\xce\x4e\x25\x9b\xa3\x10\x28\x30\x4a\x6f\xee\x18\xe0\x06\x70\x98\x18\x1c\x80\x08\x0c\x7f\xa5\x4b\xb0\xfe\xa3\x23\x7d\x89\x29\xbe\x06\xa5\xe8\x08\xfa\x5b\x3a\x1a\x96\x69\x64\xe8\x6b\x28\x36\x06\x51\x21\xb1\xd9\xb5\xe1\x97\x22\x3a\xb3\x2a\x06\x91\xd4\xae\x29\x08\x3f\xb7\x92\x69\x0d\xb8\xa9\x58\x61\x0f\x7d\x95\xb3\x09\xf8\xfb\x33\x31\x9e\xaf\xfd\x24\xc5\xc3\x86\xa8\xf3\xd8\x46\x5c\x0e\x80\x0c\x24\x83\x21\x19\x32\x0c\xe3\xc4\xc0\xca\x8e\x2d\xb8\x44\xad\x15\x40\x29\xa3\xef\x0a\xee\x65\x59\xbf\xae\x1e\xf9\x87\x5b\x98\x96\x39\x8f\x68\xa9\x96\x2d\x66\x98\xb2\x21\x19\x61\x60\xa6\x93\x16\xff\xf8\xe2\x2f\xdf\x90\xc1\xd4\xb0\x34\x94\xac\xb4\xd0\x34\x09\x1f\x99\x00\x1f\x19\x58\xd9\xe3\x59\xcd\x91\x0c\x10\xc0\x6e\x1e\x76\xe1\x2f\xbf\xba\x19\x54\x79\xec\x51\x0c\x93\xa3\x12\xfc\xba\x89\x18\x2d\xea\x8f\xb2\x7d\xc8\xf6\x96\x2a\xd1\x02\x34\x13\x09\x8b\xa6\xb5\x11\xcd\x57\xfe\x22\x63\x71\x6b\x65\xfd\x05\xd8\x53\xa4\x5b\x65\x22\xcb\x13\x6b\x74\xfe\x3e\x64\x17\xe7\x0a\xe6\x73\x00\x17\x9e\x0b\x34\x93\xba\x29\x66\xeb\xa6\xdb\x78\x5c\xff\x4a\xe1\x72\x4b\x9c\x21\x2f\x14\x00\x43\x45\xe8\x7b\x9a\x24\x03\x1a\xdd\x5c\x8b\x57\x62\xa4\xde\xf0\x73\x29\x85\xac\xae\x25\xa1\x86\x5a\x8e\x73\x7e\x63\x3b\x38\x84\x12\x09\x62\x64\x44\xab\x2c\xd7\x3e\x91\x61\xd1\x07\xdb\x7c\x79\x4f\x84\xbd\x1a\x54\xcc\x02\x77\xac\xd0\x75\x5c\xaa\x96\xc5\xc8\xf2\xfc\xaa\x8c\x6c\x5f\xbd\xf8\xe3\x9f\x2d\xea\x12\x21\xc9\x9f\x5f\x60\xcc\xb6\xea\xd8\x43\x8c\xb4\xcd\x30\x8a\x94\x26\x89\x51\x1b\xca\x48\x69\x00\xbd\x08\x09\x3f\x3a\x0e\xea\xfa\xe8\xb6\xb6\x28\x75\x7d\xfd\x4f\x94\xa3\x98\x56\x90\x0c\x3b\x36\x2b\x29\xa8\x35\xfb\xc8\x18\xf6\x1d\xf5\xc1\xd4\xb0\x1d\x10\x80\x26\x22\xc9\x53\x38\x83\x09\x6b\xa2\x89\x53\x65\x36\xaf\xea\x27\x4c\x61\x02\xd8\x20\x11\xd1\x0d\x89\xdd\xc5\x52\xe4\xc9\x6c\x25\xf0\xed\xa1\xb0\x6d\x0c\x4e\x8d\xd8\x9b\xa5\xdf\x5f\x89\xba\x49\x69\x96\x85\x1c\x21\x49\x6f\x2b\xc0\xc0\x33\x89\xe5\x0a\x6a\xd6\x93\xa9\x6d\x66\xae\x6b\x64\xee\xba\x2f\x32\x74\x73\xeb\x29\xb6\x8e\x3a\xa9\x6f\xa3\x2e\x56\xbf\xbd\x61\xb2\x82\x10\xc5\x84\xfe\x34\x64\xf8\x6f\x9b\x55\x32\x97\x15\x19\x12\xeb\x02\x62\x58\x01\xc0\xa0\x0f\x92\xe4\xed\x0d\xae\x0d\x58\x37\xeb\x85\x1c\x55\xe0\xc2\x83\x55\x39\xa5\xda\x09\x84\xde\x7c\x4d\x49\x06\x52\x31\x65\xf8\xf2\x2f\x78\xa0\x4e\x13\xca\xd2\x92\x09\xf0\x71\x80\x60\x0f\x37\x96\x4f\xae\x4f\x29\xfb\x22\x76\x13\x22\x29\xb4\xa5\xa3\x17\x88\xb5\x55\xa9\xb6\x41\x86\xfa\xd8\xa4\xf2\x97\x02\x9a\x55\x4a\x69\x7e\x09\xa4\xd2\xde\xf5\x9c\x08\x24\x7e\xdf\x53\xa5\x8f\x61\xf1\x0d\x91\x01\x24\x8c\x6e\x73\xab\x94\xb0\xa2\x3c\xda\x83\x52\x12\xe9\x9d\x1e\xd8\x23\xd6\x0b\x6e\xce\x84\x7b\x94\xec\x1f\xef\x3f\x2a\x91\xb4\x20\x92\x22\xa3\xa3\x5a\xbd\x7c\x66\x20\x35\x3b\x6d\xb9\xd0\x84\x51\x83\xf0\x7a\x28\xbb\x86\x77\x41\x5c\xd4\xd1\xc1\x2a\x49\xd6\x3b\xea\x01\xec\x14\x04\x9b\x8f\x7d\x4b\xa7\x84\x4a\x91\xf3\xd8\xd9\x97\x82\x81\xef\xf5\xcc\x8b\x2f\x05\x07\x6f\x38\x9f\xad\x53\x81\x16\x7d\xc6\xc9\xcb\xde\xcb\x17\xcf\x85\x53\xe1\x17\xce\x70\xaa\xcb\xc0\xa9\x2c\x7d\x7a\xd4\x6f\xf5\x15\xef\x1b\xfa\xde\xd7\xce\xc4\x52\x14\xb4\x67\xbe\x5c\x36\xfe\x74\x2b\x99\x86\x52\x8f\xbf\x03\x54\x5c\x8c\x7e\x58\xaa\xca\x70\xb8\xa8\x93\x44\x4d\x20\xd5\x2b\x83\xa1\xf2\xc1\x03\xd2\x2d\x47\xa0\xf0\xb8\x2d\xb2\x70\xa9\x15\x24\xac\x0c\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x09\xcd\x87\x8f\x8a\x5a\x0e\x68\xe7\x77\x59\x8d\x1a\x9b\x33\xb9\xf3\x19\x45\x1b\x5c\xd6\x20\x04\xff\x0e\x63\x3a\x01\x4c\xe4\x66\x09\x95\x09\xfa\x1c\xaf\xec\xda\xc9\x20\xd7\x04\xf8\x84\x49\xc1\x53\xe0\x9a\x4c\xa8\x64\x58\x15\x47\x02\x56\x76\x30\xba\xe8\xe7\x07\xbf\x9c\xbc\xc5\x80\x86\x43\x57\x92\xc2\xad\x32\x57\xbe\x7c\x4d\x79\x25\xa5\xe9\xee\xdd\x3e\xbf\x0e\x03\x43\xa4\xb9\x7e\x5d\xe6\x3d\x69\xae\x73\xdb\x96\xe5\x2e\x4a\x72\xc5\x26\x8f\x45\x49\x5c\x86\xfd\x19\xdb\x6a\x9f\x67\xb2\xfd\x0b\x40\xcd\x25\xee\xa3\x69\x7d\x41\x82\xde\x9c\xc3\x64\x5f\x85\xa4\xbd\xb2\x0f\xdc\x99\x9e\x5c\x2d\x0d\x1b\x3e\xe7\x2b\x2e\xce\x89\x10\x58\x37\xe6\x71\x8d\x50\x31\x57\xa7\xb8\xc2\xcd\xc0\x5a\x0d\x48\xae\xe4\xf1\x9d\x5d\x5e\x95\x8b\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x2a\xd5\x60\xfd\xb4\xa0\x44\x82\x1c\x15\x45\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\xb4\x55\x25\x03\xaa\xac\x93\xe7\xec\xf2\xca\xda\x6c\x37\x83\xd9\xd6\x62\xf6\xf6\x12\xaa\xe1\xf8\x36\x8d\x61\x0b\xe1\xb6\xda\x33\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\x8b\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xa5\xca\xe0\x5b\xc0\xaa\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\xce\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x66\x83\x4d\xbe\x36\x47\xda\x3a\x6a\xde\xd6\x4a\x5e\x0d\x2a\x24\xb6\x2d\x4a\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x82\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x1a\x94\x6b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x62\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\xe5\x37\x5d\x19\xb7\xa2\xc4\xb1\xf5\x0d\xdb\x2a\xd3\x40\xa5\xa7\x68\xb8\xaa\x2d\x4f\x22\x79\x2c\x44\x98\x35\x76\x9c\x5d\x5e\x59\x4a\x68\x3f\x3e\x74\xa7\x5d\xb4\x4b\x05\x55\xdb\x1a\x03\x1f\xad\xca\x50\x1d\xcd\x63\xa6\xb9\x9f\x6b\xd7\x5d\x2b\x90\xa5\x86\xf8\x57\x2b\xd9\xae\xc6\xdb\x15\x50\x19\x8d\xb7\x81\xff\x0a\x42\x60\x27\x25\xb1\xb0\x91\x00\x43\x21\x51\x25\xee\x22\x79\x4f\x84\xb8\xc9\xb3\x75\x28\xba\x9b\xc6\x36\x5c\x5b\x8b\x40\x54\x9e\xf8\xa4\x68\x7a\xcc\xd5\x36\xfe\xde\xaa\xec\x03\xda\x4a\x3c\x38\x51\x91\x40\x21\x66\xf5\xa6\xd3\x24\x57\x1a\xe4\xf7\x4c\x2a\xbd\xe7\xeb\x45\x23\x06\x5b\x9b\xc8\x7e\xf9\x86\x7f\x30\x3d\x76\xa5\x1b\xf7\x3b\xd5\x4b\xe6\x6f\x37\xf1\xbe\xd1\x69\xf7\x2f\x05\x87\xfd\xde\xac\xd8\x15\x48\x79\x20\x6b\x4b\x79\x8a\x5b\xba\x82\xc4\xc6\x8b\xe2\x85\x12\xae\x5c\xbb\xb2\x95\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x38\xbc\x7b\x5c\x94\x99\xb4\x75\xa3\x6c\x9d\x4c\xe1\x04\xbd\x69\x19\x44\xa5\x52\x52\x5a\x2c\xff\xec\x6d\xe4\xb9\x8d\x31\xc0\x96\x1f\x75\xf5\x42\x5e\x31\x7e\xb3\x21\xfa\x55\xa3\x4b\xce\xe7\x66\xab\xd4\x13\xb7\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x20\x72\xed\x6b\x92\xa8\x92\xe2\xc8\xf8\xbf\xec\x5e\xa0\xbd\x3d\xb3\x15\xfb\x16\xe9\x88\xaa\x63\x8d\x3e\x5e\x09\x54\x53\xae\x29\xd6\x16\x3d\x13\xd1\x0d\x48\x92\x98\x65\xf4\x48\x11\xf8\x52\xa9\x66\x29\x73\xd8\x30\xea\x62\x5b\x4b\x07\x64\x63\x48\x41\xd2\xa4\x28\xea\x5a\x03\xd4\xaf\x1c\xe1\x0c\xb3\x96\x63\x52\x6c\x51\x34\x57\x86\xd1\x9c\xc3\xf3\x45\x77\xa5\x74\xea\x2b\xdd\x32\x8e\xe1\x06\x77\x4c\xa1\x59\x3f\x13\x71\x39\xf1\x2c\x57\x20\xbb\x21\x2d\xd0\xe5\xde\xa8\x10\x88\x13\xc3\x20\x1f\x8d\x18\x1f\x39\xea\x8c\x34\xbd\x54\x6e\x3b\x68\x3a\x18\xe9\x1d\x49\xb0\x05\x67\x51\x7a\xb0\xf1\x65\xac\x7c\x7f\x2a\x62\x7b\xfb\x60\x6a\xb5\x41\xbf\xb3\x45\x80\xf4\x05\x27\x42\xba\xd2\x08\x34\x8e\x71\xed\xf3\x5f\x88\x57\xab\x5f\xd5\x09\x71\x1c\x36\xb2\x3b\x3c\x55\x02\x8b\xca\x07\x46\xd8\xc9\xe5\xa6\x15\x42\xb7\x25\xfc\x5b\x11\xfd\x6a\xbd\x9f\x13\x5e\x6c\xf1\x69\x39\x60\x8e\x12\x0d\x69\x26\x24\x95\xd3\x59\x17\xa6\x21\x52\x06\x05\x0c\x00\x67\x20\xd5\x17\x31\xd2\xf1\x05\x1b\x3f\xb1\x9d\x7c\x17\xec\xfd\x42\x1c\x43\x2a\xc8\x05\xf1\x10\x35\xf4\x5a\x45\x63\x88\x73\x8c\x1e\x1f\xe5\x14\x3b\x8d\x9b\x53\xec\x8c\xdd\x53\x17\x96\x67\x91\x21\x04\xfc\x85\x34\x81\x29\x06\xc9\x60\x15\x4e\xf3\x0b\x56\xf3\xb4\xa1\x81\xb6\xd1\x32\x36\x5d\x0d\x51\x82\xd7\x45\xef\x07\xfc\x58\x98\xb0\x48\xfb\x87\x86\xcb\x10\x27\xa2\xa1\xbf\x6b\x5f\xb8\xea\x7f\x11\x18\x62\xa4\x55\xf1\x29\x2e\xaa\x04\xeb\x7b\xbe\xe7\x86\x49\x2c\xc7\xc5\x02\xf1\xee\x41\x39\x94\xab\xab\x5b\xb1\xe2\xf8\x06\x28\x2d\xf8\xf6\x4d\x8b\x25\xd5\x10\xca\xb7\xf7\xb8\x6d\xe5\x29\xab\x23\xff\x53\x39\xaa\xaf\x2b\xed\x9f\xc8\x51\x9e\xda\x1a\xde\x62\xa6\x8c\xb2\xc5\x39\xb4\x6b\x19\x96\x75\xfa\xfa\xac\x9c\xc2\x50\x8e\xcd\xf6\x09\x20\x46\x14\xaa\x69\xef\x9c\x35\x78\x5e\x18\xe5\x2c\x58\x51\x0b\xda\xea\xb4\x38\x67\xd1\x0b\x6f\xf3\x5a\x2c\xe3\x99\xe1\xc6\x28\x43\x14\x36\x3d\x1e\x8d\x29\x1f\xa1\x19\x5c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\xf5\x8d\xf0\xf1\xcf\x9f\x7b\xeb\x9f\x2b\xe1\x83\xed\xeb\x54\x44\x33\xbf\xe6\xf2\x67\x59\x56\x7d\x4c\x58\x0f\x7a\x64\xef\xf3\xd2\xa5\x3d\xfb\xf6\x4c\x0a\xf3\x0a\x17\x3a\x8d\xab\x4a\x98\xc6\x83\xb0\x57\xbe\xbb\x47\xce\xcd\x3b\xd0\x23\x12\x00\x58\x8a\xee\x1d\x14\xe0\xeb\x10\x09\x23\x2a\xe3\x04\x33\xee\x86\x41\x28\xb1\x79\x39\x0e\x60\x78\xfa\x30\x9e\x8e\x0b\xbd\xc8\x3a\xb9\x66\x5a\x84\xa6\xea\x46\x1d\x59\x51\xa6\x1b\x53\x4d\xbb\xd8\x6b\xc3\x12\x8d\x23\xab\x5e\x77\x5d\x95\xd3\x2e\x75\x38\xd5\x0d\xdb\x7a\xf4\x07\x97\x59\xd5\xa5\xe1\x2e\xc6\xbb\xb4\x8b\xf5\x46\xb7\x8f\x15\x7d\x84\xb0\x82\x5a\x9a\x6e\x8d\x62\xb7\xb3\xe2\x69\x28\x76\x8e\x30\xc0\x56\x21\x45\x71\xeb\x10\xc1\xe0\xea\xb9\x56\x0e\xf2\xf9\xe5\xf5\xdb\x7f\xf6\xdf\x5c\x5c\x5e\xb7\xe7\xb9\x3d\xcf\xed\x79\xae\x71\x9e\x81\x4f\x6a\x9f\xe5\xa0\xff\x2c\x52\x09\x67\x8a\xcb\x95\x32\xaa\x9f\x51\x70\xd6\x39\x9f\xfc\x42\x8d\xc0\x97\x49\x50\x28\x8b\x18\xb9\x71\x91\x17\xd5\xdd\x60\xbb\x6d\x9d\x3e\xf9\xe8\xac\x47\x8c\xad\x6a\x30\x66\xe5\xb2\x54\x08\x60\xd1\xae\x95\xdb\xdb\x9d\xfe\x7a\x71\x76\x7e\x79\x7d\xf1\xfd\xc5\xf9\xdb\x47\x0d\x36\xa8\x59\xdc\xad\xca\x8d\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xa1\x3e\xec\x62\x22\x30\x1f\xaf\xc6\x8d\x7a\x36\x0d\x25\x70\x17\x3e\xd6\x32\xdb\x66\x99\x6d\x35\xf6\xa2\x46\x5d\x8f\xa6\xd0\xf7\x7b\x29\xd2\x86\x50\xf8\xca\xaa\xec\xde\xe4\xbd\x08\x9f\xf6\x5d\x09\x80\x0a\xeb\x71\xc2\x63\x51\x6f\xc0\x48\xa1\x69\xa6\x6b\x14\xff\x6f\xa4\x9c\x67\x33\x95\x2f\x6d\x9c\xc2\x6b\x9a\xfd\x04\xd3\xb7\x50\xb3\x7c\xc8\x8c\xab\x21\x81\xc8\x30\x3a\x72\x03\x53\xeb\x81\x3c\xf5\x2f\xab\x53\xe6\x64\x27\xab\xa1\xde\x40\x9d\x4a\xb5\x4d\x96\x31\xbd\x81\x1a\x81\x8b\x7e\xcc\x15\xf4\x34\x5b\x88\x72\x9a\xd9\xd3\x7a\xbb\x47\x9a\x2d\x61\xfa\x00\x65\x5b\xf7\xcb\xec\xde\xd1\x59\xbd\x71\x75\x05\x31\x31\x9c\x0b\x6e\x8f\x5c\xd0\x56\xd7\x68\xac\x5d\x8b\xb5\xea\x08\x23\x53\x8e\xfe\x80\xff\x21\xd7\x6f\xce\xde\x1c\x93\x93\x38\x76\xc1\xc3\xb9\x82\x61\x9e\xd8\x30\x60\xd5\x23\x34\x63\xbf\x80\x54\xd8\x3d\xed\x86\xf1\xb8\x43\x72\x16\x7f\x57\xa7\xe8\x92\x1d\x0d\xee\x82\xf0\x0e\x9b\x66\x77\xe2\xca\xf9\xe3\xca\xbc\x2b\x10\x11\x62\x33\x03\x11\x37\x7d\xfd\x15\x27\x64\x34\x04\x9a\xba\x8d\xe2\x88\xdd\xc2\x66\xe9\xea\x7e\x41\x58\x6d\x9c\x78\x28\x50\x15\x1f\x13\x95\x63\xa1\x18\x15\xba\xbb\x61\xbf\xd4\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\xb7\xf0\x23\xf6\x63\x57\xef\xf6\xf7\xbf\xfd\xe9\xfc\x9f\x7f\xdb\xdf\xff\xf0\x5b\xf9\x2a\xb2\x42\xd4\x9a\x67\x6e\x41\xff\x0e\x17\x31\x5c\xe2\x3b\xf0\x4f\x27\xae\x9d\x44\x91\xc8\xb9\x76\x17\x30\xab\xb7\x37\x16\x4a\x5f\xf4\xc3\x9f\x99\x88\x67\xff\x52\xb5\x2a\x89\xed\x24\x63\xc0\x2d\xaa\x91\x9d\x62\x47\x73\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xe8\x5c\x11\x8d\x21\xb5\xb5\x8c\xbe\xf7\x20\xc0\x0e\xb4\xbe\x7c\x00\xc7\x9c\x6b\x23\x99\x56\xcb\xca\xed\x4d\x5e\xd6\x6a\xd5\x6d\x47\x83\xa4\x2d\xec\x60\xc3\x00\x43\x88\x38\x68\xd9\x83\x1c\x18\xac\xd7\x52\x0a\x6f\xec\x49\xff\x82\x4c\x2c\x84\x77\x06\x38\xde\x0b\xf6\xfd\x83\xd2\xb8\xb2\xaf\xad\xa2\x21\x1e\xdb\x86\xad\xfe\xba\xcb\xb3\x57\xa1\xf4\x15\x18\xc5\xe6\xc0\xfe\xd8\x8b\xb2\xbc\xe3\x6e\xe8\xa5\x90\x0a\x39\x0d\x7f\x06\x1f\x5f\x57\x69\x21\xe9\x08\xf3\x32\xec\xe3\xf6\xb1\xf0\x97\x7d\xb0\xf2\x82\xf9\xa7\xad\x2a\x1c\xe5\xd2\x08\x0d\xc9\xd4\x53\xe4\x2d\xeb\x45\x14\x63\x07\x69\x9b\x07\xfd\x8e\x90\xb6\x80\x19\x75\xdb\xb2\xda\x51\x45\xc8\xc2\x51\x8f\x02\x67\x80\x22\xea\x93\x2e\xef\xb4\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\x6e\x5d\x39\xab\x18\x0d\x52\xb3\x98\x4d\x98\x12\x35\xb2\x4f\xc2\x44\xcb\x43\xea\x5d\xe9\x0b\x1b\x38\x14\xcc\x66\x77\x19\x16\x0b\x0a\xe7\x75\x86\xec\xbf\xac\xd3\x2f\xc8\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3e\x78\xff\xe5\xef\xdd\xc3\xef\x0e\x0e\xde\xbd\xe8\xfe\xe5\xc3\x97\x07\xef\x7b\xf8\x8f\x2f\x0e\xbf\x3b\xfc\xdd\xff\xf1\xe5\xe1\xe1\xc1\xc1\xbb\x9f\x5e\xff\x70\xdd\x3f\xff\xc0\x0e\x7f\x7f\xc7\xf3\xf4\xc6\xfe\xf5\xfb\xc1\x3b\x38\xff\xb0\xe6\x24\x87\x87\xdf\x7d\x5e\x7b\xe9\x0d\xd4\xee\xb4\xa3\xc9\x0a\x9e\xd5\x19\x1b\x41\xbf\x07\x2c\x5b\x6f\x87\x47\xaf\xa6\xcf\xbf\x8f\x1e\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xc7\xb0\xe4\xd8\x37\x95\x2a\x08\xec\x2b\x12\x54\x8b\xe7\xc6\xe7\x3e\x05\xe3\x4e\x68\x38\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\x15\x8e\xee\x0d\xec\x42\xef\xef\xbb\x81\x5a\x2d\x50\xed\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\x2e\xa1\xb6\x9e\x43\xad\xe7\x8f\x7a\xd1\xa9\xb1\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x91\xd9\x1e\x7c\x9c\xa0\x48\xbb\xb0\xaa\x8d\xab\xf0\x07\x13\xb3\x84\x50\x22\xba\x52\x0c\x12\x03\x1d\x31\xf4\xf4\x1f\x36\x12\xf4\xc6\x06\x87\x1a\x25\x8d\xf1\xa2\x8c\x66\x10\x0e\x8b\xda\xcb\x54\x29\x11\xd9\xa0\xd6\x90\x04\x80\x95\xdd\xdc\xb2\x71\x35\xd8\x06\x3e\x93\x10\x41\x0c\x3c\x02\x57\x97\xb9\xd2\x95\x92\x72\x72\xce\x27\xbe\x36\x75\xec\x53\x4a\x70\x25\x8b\xe7\x78\x5e\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x66\xc5\x50\x0c\x31\x2c\xac\xac\xdb\x35\xae\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\xcf\xc1\x19\x58\x9f\x7d\x7e\x72\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xbb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\x14\x93\x4c\x42\x06\xdc\x66\x09\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2d\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x48\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\xad\xb5\x82\x88\xbc\x31\xa2\x15\x69\x47\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\x7d\xea\xfd\x0b\x84\x46\x96\x27\x89\x4b\xcb\xed\x91\x37\x1c\x8f\xe4\x09\xf6\x41\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\xd6\xa2\x2f\x55\xce\x11\xb2\x32\x41\x51\x94\xab\x46\x18\xfa\xf2\x6d\xf9\x83\x4f\x98\xec\x3e\xd2\x36\x85\x66\x1f\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xeb\xf5\x09\x16\xa2\xc8\x84\xd2\x57\x46\x8b\x6d\xa6\x11\x4c\xdf\x4f\x87\xbd\x15\x68\x92\x40\x5c\xe9\x04\x64\x3b\x58\xd0\xaa\x16\x8d\xf9\xb8\xa1\xa1\x02\x90\x31\xe5\x71\x02\x12\x8b\xa2\xab\xd9\xca\x4f\xac\xe8\x02\x10\xfa\x36\xf8\x04\x4d\x1a\x45\x42\xc6\xae\x03\xab\x4b\x94\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\xa5\x75\xb1\xe0\xb2\x2a\x35\x7f\x18\x0b\x71\x43\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\xe8\x3d\x13\x50\xb4\x6b\x66\x57\x47\xa5\xb6\x34\xf8\x43\xbd\xae\x34\xb5\x84\x95\x26\x44\x15\xb8\x83\xa8\xb1\xbe\x75\xe7\x77\x10\x95\x1a\x2f\x9a\x2d\x71\x9d\x17\xb5\x40\xdb\x46\xfd\x7e\xba\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\xa1\x35\x9c\xd3\xd7\x95\x76\xaf\xc0\x12\xfd\x36\xab\x18\x33\xcf\x7c\xa9\xe9\xca\x61\xb0\x47\x6f\xae\x3a\x5b\x08\x36\xf6\x73\x61\xee\xb3\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\x8a\x13\x5f\x97\x9e\x64\x58\x8d\x2f\xc3\xd2\x76\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\x28\x00\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\x11\xe0\x60\xff\xf7\xfd\x0e\x01\x1d\x1d\x92\x5b\xc1\xf7\x35\x2e\x1f\xcb\x67\xe4\xaa\x34\xd1\x54\xe4\xd8\xa5\xce\x82\x20\xd4\xc2\x30\x14\x8b\x88\xdc\xb6\xb4\x19\x53\xed\xd3\xf0\xce\xef\x98\xf6\x6d\x1c\xc4\x90\xbc\xb0\x1d\x75\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\x53\x34\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\x1f\xb6\xef\xd4\x4a\xe6\x9a\x18\x5f\x5f\xf7\x7f\xa8\xf4\x6a\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x75\x25\x76\x80\x76\x34\xe3\xd0\xab\xd5\xb4\x95\x34\x48\xc2\xea\x36\x6f\x25\xf3\x4d\xa9\x37\xeb\xda\x4a\xfe\x29\x72\xec\x36\x47\x07\xc9\x94\xdc\x52\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x02\x8d\x41\x2a\xa4\x1e\x40\xb7\xae\x9f\xe5\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\xb3\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x67\x3e\x2a\x83\xad\xdc\x8d\x84\x71\x0b\x2c\xdb\x47\xb0\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\xdd\xb4\x91\x4c\xd8\x7a\xad\x3b\xc3\x65\xea\xb6\x16\x27\x8b\x73\x89\x25\xe1\xa1\x13\xec\xd3\x68\x2f\x4e\x9a\x0b\x53\x6c\x3a\x48\xb1\xd1\x10\xc5\x07\x0d\x50\xc4\xb4\x88\xda\x54\xa4\x6a\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\xad\xa2\x6a\x0e\x35\x47\x6d\x27\xce\x98\x8e\xb2\x2b\x11\xdd\x34\xa8\xd7\x9c\x41\x26\x21\xb2\x76\xb2\xeb\xd3\xbe\x9d\xdd\xe8\x97\x97\x6f\xae\x8b\x70\x7c\x8c\x59\x29\x0c\x97\x3f\x3a\x4b\x9a\xd1\x49\x6f\x20\xd3\x41\x75\x1f\xd0\xe8\xe6\x96\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x9e\xa2\x72\x2e\x01\x63\xfd\xb9\xb0\x41\x71\xb6\x48\xa2\xf0\xad\x4e\x43\x1f\xee\x60\xc3\x42\x0b\x99\x8b\x9e\x19\x52\x66\xf4\xf1\xd0\xcf\xd6\x46\xcd\x44\x59\x30\xe9\x95\x2d\xd3\xad\xf2\xe5\xc7\xce\x2a\x5f\xa5\x5e\xad\x9b\xea\x61\x75\x63\xf7\x76\x98\xd5\x39\x16\x27\x43\x2b\xb2\x96\xd5\x35\x34\xdf\xee\xb2\xba\x4c\xc2\x95\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x8f\x38\x07\x57\x2e\xf3\xa4\x7f\x11\xac\x5a\xa2\xe2\xd8\xb0\x51\x8b\xbe\x46\x66\xc2\x26\xc0\x41\xa9\x23\x74\x87\xe4\x99\x6b\xc7\xef\xba\xce\x76\xcc\xd7\x41\x8a\xab\xeb\x14\x99\x00\xae\xe7\x2d\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\x76\x5a\x6e\xf9\xb3\x6e\x94\x48\x52\x35\xb6\xfd\x60\xe1\x8e\x69\xd7\xd3\xb8\x6f\x6b\xe8\x96\xdb\xd2\x8e\x24\x8d\x80\x64\x20\x99\x30\xcc\x28\xe7\x3a\x16\xb7\x9c\x0c\x60\xc4\xb8\xf2\xa0\xc0\x2a\x98\x0e\x66\xe8\x8f\x61\x2a\x94\x4c\xeb\x91\xb7\x95\x82\x20\x2e\x55\x27\x12\xc5\xd1\x74\x6b\x9e\xf5\x24\x21\xc7\x42\x38\xd9\xee\x2a\x01\xc2\xe5\x86\x33\xf7\x2d\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\x11\x99\xd8\x2b\x9a\xfd\x07\xa4\x3a\x6c\xc0\xe3\x64\x5b\x26\xf9\x6b\x4b\xd7\x81\xe5\x47\x69\x34\xae\xe7\xc2\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x46\xbc\xa8\x30\x3a\x1a\xfb\x2c\xd3\x9e\xea\xd8\xff\x3f\x8e\xed\x7f\x47\x1c\x25\x0d\xd8\xfb\x5b\x5b\xff\xb3\xb3\xf5\x37\x63\x27\x6b\xc0\x46\x56\x9b\x26\x3b\x17\xf8\xf5\x58\x82\x1a\x8b\x64\x6b\x44\xaf\x20\xf9\x6b\xc6\x59\x9a\xa7\x06\xe7\x94\xc1\x67\x36\x09\xbe\x76\x55\x74\x27\x46\x17\xbc\x35\xd7\x99\x1b\x59\x0c\x58\x79\x93\xb2\xc4\x6c\x23\x26\x4a\x8e\xe9\xc4\xe0\xba\xca\xa3\x08\x00\xfb\x7a\x95\x55\x89\xaf\x7b\xe1\x4d\xa1\x8f\xc3\xcb\x7a\xf4\xa6\x1e\xb7\xb4\xb5\x31\x71\x96\xaf\xbf\xda\x6a\x8e\x91\xcc\x9a\xa1\xcb\x3f\xbc\xed\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\x7f\xc5\x9b\x8c\x54\xe4\xda\xc6\x62\xb7\xd2\x01\x68\x5a\x52\x22\x9c\xfc\xad\x6c\x9b\x62\xf3\x9c\x79\x2a\xa4\xb4\xf7\x6d\x20\x05\x50\x9d\x4b\x20\x23\xaa\x1f\x93\xe0\xd7\xd7\x15\x6a\xe9\x09\x4d\xf0\x9b\xba\xa2\x70\x55\x8e\x31\x02\x6f\xd5\xdc\x33\x42\xbc\xb0\xe5\xdc\xd7\x16\x78\x6b\x53\xca\xfa\x42\x68\xfd\xa3\x45\xb0\xde\x0a\x7e\x78\x63\x00\xde\x73\x7d\xb6\x3d\x3b\x2f\x6b\x1b\xbe\xc5\x91\x16\x24\x4b\x68\xd1\xa4\x08\x77\xe0\x47\xe4\x41\xa7\x63\x88\x6e\xde\x3a\x97\xe7\x81\x02\x08\xf1\x2a\x23\xa6\xc7\xf9\xa0\x17\x89\xf4\xc8\x90\x04\xfb\x7f\x83\x44\x0c\x8e\x52\xaa\x34\xc8\xa3\x58\x44\x8e\xc5\x75\x23\x33\x0b\xe3\xa3\x5e\x1a\x1f\x62\x1b\xdc\x8b\x6a\x53\xc4\x52\x29\x04\xf3\x7e\xa7\x0c\x92\x01\x18\xea\x2a\x50\xe1\x2f\xd5\x53\x33\xcb\xdb\xb8\x71\x6d\x79\xd4\x66\x49\x35\xdd\xcd\x1f\xdf\xd5\xdc\x52\x2e\xd2\x80\x65\xe3\xa9\xb9\x94\x1b\x0b\xad\x68\xc0\x95\xbc\x43\x6e\xe4\x9d\x11\x8d\x77\xc5\x75\xbc\x83\xa5\x8f\x1b\xf0\x74\x36\xe1\x2a\x6e\xce\x4d\xfc\x00\x15\x82\x1f\xc6\x3d\xdc\xa0\x0d\xad\x21\xb7\xf0\xc7\x70\x09\x37\xf2\xd5\x75\x5d\xc1\x1f\xcf\x0d\xdc\xcc\xe7\x36\xa9\x08\x3c\x55\xd7\x6f\x03\xb6\xf0\x26\xed\xe0\x8d\xd9\xc0\x1f\xcc\xd5\x5b\xdf\xcd\xbb\x03\x2e\xde\xda\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xf4\x0a\x22\xc1\xe3\xad\x39\xcc\x4c\xc9\xc8\x70\x7e\x94\x9d\xd6\xd9\xa9\xaa\x19\x0d\x63\xea\x2a\x63\x1b\x8d\xca\x66\x70\x78\xff\x84\x13\x28\xd0\xb5\x60\x57\xb9\x4d\xd1\xb9\x5b\x21\x6f\x12\x41\x63\x75\x94\x09\xfb\x7f\x45\xbe\x42\x29\x51\xc1\xbe\xab\x5e\xa6\xc2\x63\x1b\xc4\x6c\x7a\x47\x93\x9b\xf8\xa3\xb8\x25\x62\xa8\x81\x93\x03\xc6\xfd\x3e\x1e\x96\xd4\xc0\xc2\x3a\x19\xd0\xda\x5c\x7d\xf9\xc2\xdf\xfc\xfc\xcc\x8e\x68\x60\x55\xea\xe1\xad\xc0\xee\x45\xf7\x9b\x81\xdd\x8d\xc3\x3c\xa9\x9a\x82\xad\x79\xb8\x4a\x6f\x5e\x16\xb5\x7d\x5f\xe2\xbc\xe1\xb4\x51\x1e\x13\x97\xf2\xf5\xfc\x36\xad\x76\x00\x4b\x55\xf4\x0b\x01\x2b\xf7\x59\x8d\xaf\x4f\xfb\xd6\x68\xdc\x9a\x4b\x76\xc5\x5c\xf2\x48\x41\x20\x3b\x28\xe8\x3e\xd1\xc0\x8f\x56\xd0\xdd\x60\x94\x92\x40\x7f\x90\x34\x82\x7e\xe3\x32\x82\x3f\x4e\x24\xce\x25\x75\x04\x30\x88\x7c\xfe\xf0\x70\x80\xd8\x9e\xa6\x90\x38\x8b\x29\xa9\xc3\x3c\x49\xa6\x24\xcf\x04\xaf\xa6\x19\x5b\x5f\xfb\x6c\xd6\x2a\x9a\xe4\x17\xbc\xa5\x10\x2c\x33\x29\x1c\xcf\x94\x39\xe7\x86\x06\x17\x0d\xba\x50\x90\xc4\xaa\xc6\xb4\x92\x1b\xab\xd8\xc8\x2c\xdf\xf0\x3f\x4c\x9b\x2d\x22\xfd\x2a\x13\x9a\xa7\x87\x42\x46\x6c\x90\x4c\xc9\x98\x26\xa1\x1b\x0b\x25\x37\x2c\x49\xdc\x34\x3d\x72\x05\xda\xba\x14\x2c\xef\x4c\x04\x1f\xe1\xe2\x28\xf7\x5d\x00\x21\x32\xcf\x46\x09\x50\x9e\x67\xf6\x7d\x86\x13\x4f\x45\x2e\xfd\xfb\x7a\xc1\x31\x51\x74\xdd\x67\x49\xa7\xd4\x6b\x6c\xe5\xc6\x86\xfe\x34\xb9\x32\x02\xc0\x1b\x5f\xc5\xb9\x53\x9e\x53\x4c\x40\x4a\x16\x3b\x3b\xbf\xfd\x2d\x93\x62\xc2\x62\xeb\xdd\xf0\x60\xc3\xae\xc6\xb6\x9b\x4c\x38\xcf\x5c\xf0\x2e\x87\x11\x45\x41\xc5\x9d\x22\xbb\x67\x76\x1e\x1b\x41\xc0\x63\xec\x2f\x63\x24\x7c\x91\x55\xf2\xd6\x27\xcc\x76\xc6\x2d\x41\x8e\x1c\x70\x41\x04\x06\x7e\xe6\x9c\x69\xdb\x6d\x7d\x9c\x6b\x12\x8b\x5b\x7e\xb8\x91\xd7\x15\x1d\xad\xd7\x0b\x01\x54\x75\xbf\x2e\x92\x73\xec\xf7\xae\x06\x2f\x53\xce\xf4\x39\x24\x39\x57\x50\x93\xbd\x37\x26\x1c\x7d\xf3\xc7\xed\x68\x04\x4b\x41\xe4\xfa\xa3\x68\x7f\xb7\x63\x16\x8d\xcb\xc2\x2c\x4b\x41\x11\x91\xcf\xa8\xc5\x2f\xdd\x63\x8b\x77\xa8\x55\x01\x17\x8d\x6d\x0d\xbb\x0b\xac\x5f\xae\x61\xe9\x7c\xfc\x5e\xa9\x21\x33\x86\x66\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\xdc\xf9\xe4\x65\xa6\x9f\x73\xf6\xef\x1c\x08\x4d\x85\x91\x85\x93\x72\x18\x60\x07\x35\xfa\xd2\x0f\x78\x92\x9b\x0d\x18\xdc\x92\x21\x63\xf7\xf8\xfa\x61\x91\xd8\x83\xfe\xe1\xa3\x22\x1f\xbb\xab\x56\x11\xdc\x62\xe4\xc6\x52\x57\x2d\x4a\x38\x68\x73\xf2\xac\x44\x69\xbb\xac\x31\x3e\x4a\xca\xc2\xe4\x76\xe4\xaa\xae\x4e\x54\x57\x23\xea\x16\x5f\xd0\xdf\x56\x31\x6a\xa4\xbb\x57\xb1\x86\x86\x7a\xe2\x14\x54\xdb\xab\x01\xb6\x69\xb1\x57\x03\xac\xe8\x71\xd1\x27\x34\x8e\x25\x8a\x29\x78\xea\xd3\x99\xde\x98\x59\x11\x4b\xd3\x21\x2f\xc8\xb7\xe4\x8e\x7c\x8b\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x63\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\x9d\x06\x69\xc4\x22\xb7\x13\x8f\xda\x7b\xc9\x2c\xf0\x23\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xf9\xac\xdf\x21\xd7\xa7\x7d\x6c\xea\x73\x75\x7a\xdd\xaf\x4a\xd8\x7b\xd7\xa7\xfd\xbd\x47\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\x37\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\x3c\x2f\xd7\x6d\x9b\xe6\xf3\x89\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\xef\x9d\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x2c\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x5c\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xe9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\x3c\x07\x15\xd0\xf7\x5c\xad\x9f\xa3\xf2\xd6\xcf\xb4\x7e\x58\x1f\x39\x5f\xf0\x2b\x5a\x42\x54\x66\x26\x91\xc5\x94\x89\x04\x1a\x4f\x71\x4a\xec\xf3\x50\x12\xb2\x9e\x60\x74\x60\xc2\x52\xb6\x5d\x5a\x10\x99\x3b\x34\xaf\x70\xae\x92\xd7\xc5\x80\x25\xa5\x77\x78\x00\x68\x2a\x72\xdb\xfa\x35\x12\x69\x96\xeb\x2a\x4c\x71\x7b\xb6\xe9\xda\x3a\x64\x23\xc7\x51\x8f\x6c\x83\xd9\x6e\x98\xb6\x5b\x6a\xea\xfa\x88\xad\x5a\x69\xec\xa3\xe6\xfa\x4d\x04\x8d\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x41\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\x70\xff\x68\x69\xc3\x73\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xdd\x56\xf6\x93\x65\x06\xa4\xab\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x73\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc8\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x76\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\xff\x7f\xf6\xde\xc7\x3b\x6e\xdb\xf8\x17\xfd\x57\x70\xd4\x9e\x2b\xa9\xd9\x5d\xd9\x49\xdb\x6f\xea\xdb\xd7\x1c\x55\x92\x13\xbd\xd8\xb2\xae\x25\x27\xb7\x2f\xce\x37\xc5\x92\xd8\x5d\x54\x24\xc0\x12\xa0\xe4\xed\xcd\xfd\xdf\xdf\xc1\xcc\x00\x04\xb9\x2b\x5b\x22\x69\xaf\xe4\x2c\x7b\x4e\x63\xed\x72\x41\x70\x00\xcc\xef\xf9\x4c\x6d\xcf\x83\xf9\x3a\xd5\x3a\xa3\x6a\x84\x6c\x59\x8f\x2f\xd1\xf5\xa6\xf4\x2f\x4a\xdc\xfc\xe2\x46\x33\x6c\x96\xf1\x79\x30\xe3\x8d\xb0\x2b\x9e\xb8\x7a\xe8\x5b\x5f\x00\x52\xfd\x2b\xc1\x78\x76\xc3\x97\xa6\x76\x6a\xd4\x63\x48\xf3\x8c\x3d\xdd\x87\x8d\xc7\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xcd\x1d\x1d\x9e\xff\x72\xf1\x8f\x8b\x5f\x0e\x8f\x5f\x9e\x9e\xb1\x33\x6d\x05\x8a\xa4\xa8\x49\x5a\xc2\x95\xb3\x10\x68\x96\xf0\x0c\xb0\xa0\xb5\x99\x80\x5f\x51\x1a\x76\x23\x55\xaa\x6f\x4c\x67\xff\x29\x6e\x3f\x47\x3c\xc1\x55\xa7\x31\x12\x5e\x70\xe8\xfd\xd6\x43\x3e\xac\x64\x7f\xc4\x83\x82\x04\x4e\xd3\x83\xb4\xd4\x05\x12\xc1\x3b\xa0\x62\x23\xe9\xb8\xe5\x57\xf6\xf9\xa5\xb0\xbe\xb3\xe6\x80\xf3\x92\x2b\x5b\x7b\x62\xea\x35\xa3\xa6\x73\x93\xde\xcb\xf1\xb8\xab\x8d\x78\x3a\x5c\xa5\xd1\x61\x9a\x8a\xb4\x41\xfe\xcf\x2e\xab\xef\xc8\xbf\xdc\xb2\x06\x63\x60\xe7\xaf\x2e\x4e\xff\x77\x6b\x1f\x2f\x8b\x7e\x49\x4c\xc3\x14\x80\x96\xba\x18\x6c\x75\x5f\x8b\x5c\x5f\x6f\xd7\xf7\xa1\xac\x6f\x90\x96\xc3\x84\xce\x5f\x57\x2a\x16\x68\x2a\x1a\x9f\xe5\x3a\x15\x13\x76\x1e\x7c\xf8\xcd\x6f\x63\x90\x99\x52\x30\x77\x8b\xb2\x92\x67\xd9\x32\x56\xa6\xac\xc6\x0a\xc1\x06\x04\x41\xcc\xc8\x67\x3c\x33\x9b\xe6\xc6\x7d\x64\xa3\xd3\x23\x5e\x3a\x6b\x76\x90\xe5\x08\xa3\xb1\x54\x28\x6d\x49\x19\x76\xb3\x04\x58\x87\x52\x27\x0c\x4d\xe7\x28\x51\xaa\x21\xdf\x0c\xc6\x11\xbc\x68\x94\xc6\x13\xfb\x3c\x8c\x8c\x4e\xe4\xca\x08\xb3\x5e\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x89\xeb\x20\x3b\xe0\x47\xd2\x96\x81\x20\xcd\x4c\x2f\x0e\xcf\x1d\xc3\x6a\xc0\xa1\x8a\xab\x6b\x8f\xeb\x15\x7f\xec\x47\xaa\xac\xd4\xa1\xf9\xb6\xd4\x55\x67\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xac\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\x9f\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x1d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0d\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\xb6\xce\x99\x56\xee\x60\x0e\xb2\x79\x4e\x43\x14\x96\x48\x1a\x6f\x15\x88\xe7\x92\xf5\xc7\x21\xaa\x0b\xc7\xb2\x32\xa2\xc4\x10\x74\x59\x09\x5c\xc9\xef\xab\xa9\xc8\x1c\xe5\x9d\x49\x4a\x1d\xb3\xd1\xf1\x20\x73\x3e\x17\x8c\xdb\xb0\xd3\xac\x66\x42\x19\xc7\x31\xd1\x7d\x69\x59\xaa\x45\x5d\x19\xcf\x0d\x7b\x73\x7a\xcc\x9e\xb0\x3d\xf7\xac\x7d\xd8\x3f\xd0\x50\xdb\x6a\x4c\x40\x6b\xdb\xa8\x33\x3f\x04\x4c\x09\x36\x2f\xd3\x25\x32\x89\x11\x53\x9a\x99\x2a\x59\xc4\x5d\xbc\xbd\xd9\x4c\x49\x8a\x10\x18\x79\x98\x7b\x7d\xb3\x1c\xea\x8d\x11\xe5\x60\x0c\xea\x4d\x07\x06\x15\xab\x51\x6e\xcf\x35\xa9\x87\x1b\x2b\x17\x96\xa7\xdc\x72\x62\x5c\xa1\xab\xfa\x43\x5d\xd2\xdf\x36\xfb\x32\xe2\x85\x54\xd5\x3b\x74\x91\x0e\xe7\x6a\xb9\x38\x81\x61\x61\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\xa7\x8d\xbd\x32\xba\x45\x4d\x04\x3e\xe1\xe3\xd0\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x20\xe8\xcd\x93\x45\xfc\x80\xed\xee\x6b\x5e\x0f\xc4\x29\x94\x89\x6b\xd1\x03\x42\xab\xb5\xf3\x5e\xb8\xd1\x1c\x71\xfc\x8e\x80\xe1\x59\xc6\xa7\x22\x43\x1a\xe3\x0e\x34\xab\x3b\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x0f\x51\xcf\xda\x74\x70\x7a\x43\x93\x0e\x20\xbc\x1f\x3a\x1d\x8c\x48\x12\x9d\x17\xe7\xa5\x76\x66\xe7\x60\xb2\x89\x86\xad\xe3\x7c\xe8\xd8\x00\xbf\x7d\x6c\x01\x53\x54\xaf\x79\x33\x2f\xa3\xa4\x4b\x6e\x51\x48\xf8\xcc\xcb\xff\x11\xc9\x2c\x60\x3d\x6d\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\xc7\x2c\x0e\x86\xa8\x5b\xe8\xe1\xec\x1c\x44\x1a\xe9\x84\x67\x00\x91\xda\x6f\xcb\xb1\xf6\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc4\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x32\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x62\x02\x57\x68\x41\xee\xc2\x91\xf0\x83\xfa\xf3\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\xc8\x6e\xa5\x61\x3b\x2f\x3c\x01\x7a\x20\x55\x3e\x44\x09\xb3\x83\x6f\x18\x56\x13\x3d\x9d\x57\x52\xa5\x94\x4a\xdb\x20\x96\xb7\x73\x49\x0f\x86\x24\x6d\x99\xc6\xbc\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\xde\x1e\xaf\x51\x65\xf6\x3e\xba\xf1\xfb\x1d\xaf\xe1\x21\xed\x61\xde\x28\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\xe2\x7e\x43\x5b\x31\x3f\xe2\xb0\x5e\xa5\x4f\xdc\xb6\xb6\x52\xcd\x4d\x6c\xc9\x34\xf1\xf0\xd7\x9b\x32\x7e\x85\x67\xa5\xc6\x12\xcc\x55\x13\xa2\x55\x02\xf0\x58\xcc\x90\xcc\xa9\x13\x8f\xdc\x08\x99\xe7\x86\x1f\x95\x8e\x12\x56\xf2\xec\xa2\xe8\x0e\x1f\xca\x56\xa0\xea\x5e\x5e\x1c\x36\x87\x06\x61\xbd\x10\x25\xca\x7e\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\x6b\xb0\xb2\xa2\x2c\x2b\x23\xe7\xe6\x80\xf6\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\x4c\x26\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\x9e\x99\x92\x15\x56\xa7\x89\x80\xcc\x6e\x17\x6c\x9c\x61\xaf\x2e\xcf\x59\x4f\x48\x94\x0f\x2c\xd1\x19\xed\xed\x36\xea\xd9\x5a\x3a\xa2\xf6\xb8\x71\x22\x91\x72\x91\x08\x33\x1c\xd8\xd2\x77\xf5\x98\x2c\x15\x58\x61\x23\x20\xfb\x89\xdf\x9a\x0e\x07\x7e\xe9\x5d\x28\xd4\xa4\x9f\xee\xc6\x1a\xf5\x65\xcd\x5c\x9c\x3d\x92\x15\x0b\x3e\x46\x23\xdd\x71\x34\x60\x81\x5e\x85\x58\x68\xa5\x4b\xdc\xa2\x4e\x88\x6a\x05\x5b\x1a\x58\x14\x46\xf3\x60\x4d\x88\x45\x47\x53\x3d\xaa\xa3\xc4\x71\x20\x10\x0a\xbd\x10\xdb\xa1\x9e\xc3\x8d\xb4\x0b\xc0\x60\x5d\xb4\xa2\x86\x30\x93\x52\x18\x08\xc0\x28\x26\xca\x52\x97\x94\x90\xe5\xfd\xd6\x30\x12\x70\x72\xc8\xe8\x72\x9b\x84\xbb\xbf\x76\x4d\x1c\xa8\xae\x11\xcf\x21\xc7\xd0\xed\x26\x31\x9b\x89\x04\x14\xad\x98\xc0\xc8\xb5\xf7\x6a\x50\x5a\x5f\xc2\x61\xb5\x47\x4c\xcf\xe5\x3b\xf7\x94\xf8\x57\xad\xbe\x2b\x4a\xab\xf1\xfa\xaf\xf7\x27\x8c\x9d\xaa\x90\x7f\x3b\x72\xab\x18\xdf\xe9\x53\xcf\xac\x7b\xc5\x18\x6e\x1f\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\x74\xb0\xc5\x40\xbf\xdb\xb5\xc5\x40\xbf\xe3\xb5\xc5\x40\xdf\x62\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x81\xfe\x79\xe1\xda\x6c\x31\xd0\x37\xed\x62\xde\x62\xa0\x6f\x31\xd0\xdf\x77\x6d\x31\xd0\x3f\x70\x6d\x31\xd0\x3b\x5c\x9f\x01\xe7\xda\x62\xa0\x77\xb8\xb6\x18\xe8\xeb\xaf\x2d\x06\xfa\xea\xb5\xc5\x40\xbf\xf5\xda\x62\xa0\x77\xbe\xb6\x18\xe8\x5b\x0c\xf4\x2d\x34\xe4\xfd\xc6\x7a\x98\xd0\x90\x6c\x8b\x81\x4e\xd7\x16\x03\xfd\xb3\x00\xc0\x63\x5b\x0c\xf4\x3b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\xb9\xb8\x4b\xb6\x18\xe8\x5b\x0c\xf4\xdf\x8e\xa2\xbb\xc5\x40\xdf\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\xef\x9d\xc5\x16\x03\xfd\x73\x30\x01\x8d\x4d\x65\x27\x58\xc8\xbb\x20\xd8\x50\x66\x72\x54\x30\x3e\xad\x66\x33\x51\x02\xe7\x82\x27\xaf\x24\x4f\xd5\x60\x7d\xed\x20\xab\xb0\x23\x00\xc3\xa1\x22\x8e\x5b\x7e\x4e\x15\xea\x00\xdf\x58\xa7\x0f\x9f\xbc\x7a\xbe\x06\x2e\xa7\x73\x56\x61\xd7\xc4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x15\x15\x11\xdd\x93\x4c\x1b\x4a\x7b\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa2\x4c\x9f\x18\x5b\x0a\x9e\xfb\x64\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb2\x40\x41\x15\x88\x01\x59\x71\x75\x5e\xf3\xa8\x7e\x1a\x4d\x4b\xc7\x78\x65\x60\x6d\x8e\x00\xe2\x39\x2f\xec\x92\xb9\x57\xce\x08\xf6\xb5\x34\x96\x25\x99\x04\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\x65\xb5\xa2\x99\x1a\x9a\xaa\x4a\x41\x6d\x2d\xac\x61\x90\x06\x5c\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\x30\x2d\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\x40\x44\xdd\xde\x44\x07\x56\xbd\xd1\x21\xef\xdd\x6f\xce\x51\x23\xc5\xbf\x56\x28\x20\x4b\x6f\xe5\x18\xc0\x02\x28\x71\xed\xf6\x80\x48\x84\x93\xaf\xfc\x96\x5d\xff\xc9\x37\xbd\xe5\xe5\x5c\xd8\x90\xcf\xd4\x35\x57\xbc\x99\x16\x12\xc3\xfd\xc6\x86\x48\x4d\x32\xa0\xce\xb9\x4e\xa1\xe4\xa7\xae\xab\x5a\x87\x27\x8c\x33\x24\x18\xb5\x75\x37\x78\xc5\x08\x53\x34\xc3\x43\x4d\xc1\x13\x61\xd8\xde\xe9\xf9\xd1\x88\x9d\x9f\x1e\x53\x1e\xa6\x9e\xad\xab\x63\x26\x1e\x86\x3b\xf0\x36\x64\xe3\x80\xd0\x16\x0d\x1f\xd5\x7e\xd2\xb3\xcf\x83\x7e\xf5\x56\x51\x7a\x69\x9b\x03\x80\xca\x15\xd0\xcd\x99\xa9\x40\x45\x22\x9f\x90\x0c\x85\x19\xb4\xf9\x44\x5d\x8e\xe8\x71\x87\xfc\x2f\xc2\x44\x88\x4a\x54\x75\xe1\x63\xdd\xc0\x60\x41\x5e\xaf\x94\x76\x40\x2a\x28\xe5\xbd\x74\xca\x77\xe9\x65\x21\x45\xaa\xd8\x4b\x61\x0c\x9f\x8b\xf3\x8e\xe1\xad\xdb\xfc\x00\x10\xe1\xaa\xd9\x01\x30\xa0\x0c\x0b\x7d\xc3\x27\x75\x4e\x70\x53\xf9\x66\x39\xce\x29\xec\xac\x9b\x52\x5a\x2b\x80\x95\x00\xd8\x1f\x2c\x76\x1b\x0b\x60\xb7\x95\x59\xfc\xd2\x0f\x52\xff\xd8\xa9\x12\x2a\xc5\x3c\xdf\xa9\x60\xd3\x52\x8a\x19\x9b\x49\x48\x1e\x86\x74\xde\x11\x62\x3f\x71\xf4\x3d\x19\x23\x4a\x98\x0f\x59\x50\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\xc2\xa6\x23\xa4\xdc\x43\xb1\xab\x9c\xb1\x39\xa4\x03\x93\x8d\xf2\xc7\x27\x7f\xf9\x33\x9b\x2e\x9d\x22\x05\x1b\xd2\x6a\xcb\xb3\xf0\x92\x99\x50\x73\x47\x2b\x14\x0a\xcd\x72\xcd\x40\x01\x68\x0b\x82\x13\x7f\xfa\xe5\xd5\xb4\xa9\xd9\x1d\xa4\xe2\xfa\x20\xa2\xdf\x38\xd3\xf3\x09\x3b\x0a\xd5\x91\x55\x91\x82\x9f\xbf\x3b\x54\xf7\x70\xdb\x4c\x67\x32\x59\xf6\xde\x68\x1e\x84\x8c\x2d\xf4\x0d\x5a\x98\x6b\x76\x4f\x5d\xf9\x55\xe8\xa2\xca\x30\xd4\xf1\x3c\x14\x3a\x57\x46\xac\x96\x23\xae\x3d\x17\xe0\x9c\xa7\x21\x5a\x7c\x94\xb2\xc0\xfd\x23\x35\x95\xb9\x90\xfb\x38\x60\x91\x01\x33\x79\xce\xb3\x6c\xca\x93\xab\x4b\xfd\x42\xcf\xcd\x2b\x75\x52\x96\xba\x6c\xce\x25\xe3\x4e\x46\x2f\x2a\x75\x85\xad\x20\x02\x5a\x83\x9e\x3b\x85\xbe\xa8\xac\x07\xf7\x5e\xf7\xc2\x58\xba\xef\x45\xbf\x37\xbe\xeb\x51\xc4\x3b\x59\x5b\xd8\x54\x35\x86\x3b\x32\x1e\xdf\xc4\x9b\xed\xcb\x27\x7f\xfc\x1a\xb7\x2e\xd3\x25\xfb\xfa\x09\x54\x0a\x98\x11\x1e\x62\x90\xa8\x4e\x3d\xc9\x79\x96\x39\x46\x1e\x6f\x4a\x47\xe8\x75\x9b\xf0\x93\xef\x41\xdb\x7f\xbb\xdd\x59\x81\xbf\xbc\xfc\x07\x48\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\xc4\x7d\xa0\x4a\xed\x01\xa8\xdd\xd7\x3a\xab\x72\x71\x2c\xae\xe5\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\xc8\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x94\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x1d\x66\xc9\x6f\x1a\xc4\x80\x33\x09\xc8\x09\x3d\xa1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x8e\x6f\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\xc6\x86\xa8\x07\xf4\xa7\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\xc3\xc6\x40\x05\xc0\x6d\x1f\x60\xc9\xdd\xdd\xfc\x03\xf8\xd4\xfb\x25\xba\x35\xe8\xa2\x42\x2c\x23\xe7\x96\x14\x42\x6f\xab\x70\x56\x88\xd2\x48\xe3\xe4\xf2\x0f\x70\xa0\x8e\x32\x2e\xf3\xc8\xf1\xbc\x19\x22\xe0\xe1\x06\x24\xe7\xfe\x9c\xd2\xd9\x29\x38\x20\xb0\x42\x44\xb1\x5e\xa3\xd6\x36\xb5\xda\x8b\x6a\x0a\xfb\x07\x6e\xbf\x4f\x43\xbd\x01\x25\xf1\xa6\x79\xec\x0f\xf5\x32\x34\x59\xac\xfb\x24\xf0\x58\xbc\xeb\x73\xe2\xac\xf0\x7e\x8f\x95\xb1\x86\xc9\x0f\xc4\x3f\x80\xa3\xd2\xe2\x36\x59\x68\xc3\xea\xc4\x13\x16\xd9\x02\x64\x40\x4e\x18\x26\x6d\xb8\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x5d\x91\x44\xa5\x2e\xf8\xbc\x57\x3f\xa2\x16\xa5\xda\xc3\xc6\x60\x19\xce\x7e\x8a\x58\x49\x41\x77\x39\x4e\xe2\xb1\x80\x00\xe9\x09\x83\xf9\x9e\xc0\x64\x59\x40\xbf\x38\x76\xc3\x97\x8c\x97\xba\x52\x29\xb9\x43\x83\x3f\xfa\x65\xeb\xc1\x67\x5a\x09\x1f\xe7\x69\x63\x6d\x40\x00\x4a\x2a\xf6\x74\xf2\xf4\xc9\xe7\x22\xe2\xe0\x0d\x5b\x22\xee\x2c\x88\x38\xe4\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x24\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x53\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x11\xf9\x16\x31\x28\x38\x6e\xeb\x5c\x63\xe6\x3d\x2c\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\x5b\x8b\x88\x76\xf2\xae\xe8\x81\x13\xda\x82\x7a\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x70\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\x90\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xbb\xbe\xf8\x59\x56\xc6\x43\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x02\xcf\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x6b\x99\x77\x49\x56\x19\x79\xbd\x29\x4e\x42\x80\x10\xc7\xb2\xd3\x3a\xb7\xc0\x29\x6a\x42\xad\xe0\x4c\xd4\x61\x82\x0f\xc0\x70\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\x39\xb1\x7b\x98\x49\x6e\xee\xab\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\xd3\x73\x8a\xa0\x79\xba\x49\xf5\x2f\x4c\xac\x09\x66\x09\x26\xca\xe0\x4f\xd0\xdd\x38\x63\x11\x28\x90\x4f\x28\x01\xe6\x0f\x48\x54\x60\x91\x28\xad\xc6\x8b\x08\xb4\xa9\xd0\xe9\x3d\x8b\xfc\xba\x1a\x1e\x9d\x4c\x8e\xf5\x14\x64\x0b\x9d\xa5\xbe\x87\x36\xfa\x72\xa6\xc2\xde\x08\xa1\xd8\xe9\x39\xd0\xcf\xbd\x22\x44\x84\x6e\xa1\x22\x86\x15\x00\x9e\x29\x32\x65\x1b\xf4\xbc\xef\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\x3e\xf3\xdf\x05\x9a\xf9\x8c\x6c\x3e\xd5\xd7\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x62\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xa3\x0a\x1b\xef\x13\x73\xb0\xd3\xf3\xa3\x1e\xdc\x6b\xf7\x0d\xc5\x45\xdc\x50\xbb\xbb\x86\xc9\x22\xa9\x63\xae\x13\x56\x87\x1b\xa3\x42\x09\xd4\x18\xef\x17\xeb\xea\xaa\x26\x46\x4c\xad\x27\x93\x66\x0a\x87\x71\x6c\x85\x8a\xa4\xc9\x9d\x03\x41\x87\x42\xa7\xd0\x7f\xa9\xa6\x86\xf1\xbf\x88\x09\xe2\x93\x25\x90\xc9\x53\xea\xc8\x28\x24\x21\xb7\x18\x13\xb8\xde\x7d\xfa\x61\xc4\xc5\x57\x88\xf9\xc9\x68\x79\x7e\x7a\x3c\xe4\x76\x29\x64\xfa\xe0\xb6\xcb\x1b\x73\xef\x62\xfb\xf7\xbf\x24\x20\xf7\x7d\xe8\x2d\x31\xd8\x44\x60\x7c\xf4\x37\xa4\xa9\x6b\xcb\xa8\xbb\x63\xc8\x84\x5d\x97\xd0\x01\x5c\xa4\xf9\xa4\x91\xfb\x7b\x56\x65\xb0\x49\xeb\xe4\xde\x90\x99\xcc\x43\x5e\x28\x68\x03\xfc\x9a\xcb\x0c\x71\x31\xf5\xed\x43\xfa\xf0\x7b\xa6\x79\x8a\xe5\x1e\x57\xa2\x54\x22\x63\xb9\x4e\xab\x0c\xbd\x79\xa1\x8b\xf0\xcb\x57\xc7\x6f\x5e\x9c\xf8\x24\x2c\x51\x2f\xe7\x88\x71\xa6\xc4\x0d\x8c\xae\x40\x21\x49\x08\x9e\x2b\x94\xfd\xb8\xf3\xe4\x11\x37\xd1\x0c\x45\xc7\x84\x7f\xa1\x5c\x5a\x39\x47\x18\xcd\x5a\x2d\x9c\x96\x82\x5f\xe9\xca\xb2\xeb\x2a\x53\xa2\xac\xbb\x60\x8a\x6b\xa1\xd0\x07\xeb\x7e\xe0\x1e\x1b\x23\x32\xca\xb2\x01\x84\x49\xf0\x68\x1e\xdc\x93\x27\xa4\xc9\x53\x89\x11\x7c\x19\xb5\x80\x6e\x34\x8a\x7c\x3f\x40\xa9\xd7\xbc\x22\x6c\x52\x2c\x27\x5e\x05\x26\xf5\x18\x92\x98\x46\x73\xe1\x33\x60\x28\xf1\xe5\xd3\x1d\x87\xfb\xbb\x5b\x9a\x15\xa2\x4d\x60\x15\x1a\xd0\xcb\xbe\x73\x9d\xde\x62\x35\xd4\x7a\x17\xdc\x1f\x37\xc6\xb6\x9a\x71\x86\xee\xf6\xb1\x07\xa6\x81\x4c\xd9\x2e\x6c\xf0\xde\x42\x13\x2c\x8f\xf3\x2a\xcb\x2e\x44\x52\x8a\xfb\x86\x19\x9a\x9c\xe2\xb4\x35\xd6\x6d\x16\x40\x64\xce\x02\x5a\x07\xdd\xac\x6a\x4c\xd8\x28\xcf\xa9\xae\xc5\x2d\xaa\x0c\x52\xc3\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xd3\x95\xc6\x67\x99\x21\xf7\x69\xac\x82\x11\xe1\x61\xa1\xc5\x1a\x37\x06\x33\x0f\xa4\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\xc0\x28\xa3\x84\x2d\x4e\x68\xe5\x78\x96\x73\x8f\x71\x7c\xdf\x1c\xe6\xfa\x4c\x1e\xe0\xbc\x7f\x87\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\xdb\xe6\x91\xd8\x2d\x80\xd2\xff\x0a\x0c\x83\xd7\x7e\x7d\x3d\x1b\x32\x4c\x28\x5d\xcd\x17\x40\xac\x32\xe7\x1e\x30\x33\x13\x16\xb0\x10\x29\x9f\x01\x93\xd8\xe8\xb7\x29\x59\x19\x31\x36\x64\x73\x6f\x3c\x12\xdb\xa5\xab\x83\xb7\x95\x8c\x1f\xb1\x19\xa2\x91\xbd\xf7\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x34\xbf\xb1\x93\x09\x63\xa4\x88\x39\x00\xc2\x1e\xfc\x0e\xad\xa3\xcb\x57\xc7\xaf\xa0\xb1\x38\x79\xdd\xbd\xa8\x72\xa2\xc0\x4c\x18\x2f\xe4\x0f\xa2\x34\x00\x9d\x7c\x25\x55\x3a\x62\x95\x4c\xbf\xf9\x84\x09\x5f\x52\xc9\x3a\x8b\xb5\x17\xd7\x7a\x41\x5c\x89\xaa\xe8\xe5\x7f\x70\x7b\x46\x12\x74\x2a\x32\xad\xe6\x11\x06\x00\x48\xf3\x53\x25\xed\x4a\x0f\x66\xc4\x33\x05\x0f\x8f\x2e\x53\xc8\x15\x96\xba\x6c\x84\x33\xdc\x78\x80\xf2\x18\x65\x1c\x3b\x96\x26\x1b\xe3\x41\x1a\x97\xa9\x75\x24\x4c\x04\xf2\xe5\xc2\x1e\x04\xdb\xa3\x47\xa2\x2c\x5e\x70\x95\xc2\x9f\x49\xa2\xcb\x94\xe6\x2b\x6d\x48\x6f\xc6\x64\x38\xcc\xc0\x02\x31\xe4\x38\x1a\x57\xed\x27\x83\x9a\x56\xe6\x8d\x54\x58\xaf\xb5\x57\x4a\xfe\xbb\x12\x8c\xe7\xda\x31\xe2\x76\xab\x87\x16\x45\x72\xbe\x04\x59\x08\x53\x7d\xe1\xcb\x35\xa8\xc6\xd6\x8c\xd8\x6b\xe1\x94\xae\x1a\x26\x60\xc4\x5e\x34\x71\x03\x46\x6e\x2e\x17\x58\xd0\x4c\x1f\xe1\xec\x4b\x61\x74\x55\x26\xe2\x35\xc6\x38\x73\x9f\x4f\xb7\xfa\x32\x6e\x55\x2c\xbf\x12\x0a\x7d\x4a\x8e\x34\x10\xc6\xad\x4a\x58\x83\x64\x21\xd2\x0a\xa4\xca\x74\xc9\x66\x12\xfb\xbf\x80\x68\x97\xf3\x85\x30\xd6\xdb\x46\x07\x90\xa3\x56\xb7\xd2\xf3\x13\x80\xed\x1b\x25\xb3\xd7\x5e\xd8\x9c\x03\x3a\x39\x1c\x59\x6e\x7d\xbd\x16\x6a\x83\xa6\xca\xfd\x59\x6e\x53\xda\x4c\xd8\x0b\xf7\x28\xdc\x4f\x51\x5f\x0d\xd9\x22\x2e\xc4\x98\xc9\x8d\xcc\x66\xdc\x2c\xa0\xeb\x4c\x7b\x09\xa8\x65\x45\x52\x95\x8e\x61\x20\x92\x3c\x4f\x53\xc7\x5d\x4b\x56\x62\x63\xf9\x75\x7e\xc7\x9e\xf5\x39\x6e\xb2\xe3\x48\xde\x3d\x16\x21\x76\x18\xea\x2d\x1c\xe1\x93\x16\x27\xc0\x95\x74\x02\xcb\x23\xae\x39\x85\x3b\x04\xfc\x1d\x57\xf8\x74\x22\xa9\x7b\x78\xbf\x53\x58\xbe\x8f\x04\xe4\xe5\xbc\xbf\xe3\x6e\xf7\xb0\x9c\x57\x78\xd0\x89\x0b\xd7\xb8\xf3\x93\x56\xde\x3d\x28\x53\xce\x56\x3d\x7a\x79\x1c\x17\xfa\xc5\x15\x4c\xbe\x4c\x72\xc2\x7e\xe8\x1b\x66\x69\xc7\x59\x1c\x43\xaf\x83\x37\x75\xd7\x18\xc7\x34\xb2\x6b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x24\x09\x6b\x9f\x89\x4a\x16\x5c\xcd\xc1\x4d\xa2\x2b\x37\xde\xef\x7f\x0f\x33\x2a\x45\x5a\x25\xd4\x72\xc7\xef\xda\xdf\xfb\xa0\x03\x01\xdd\x01\xbb\x32\x09\x2f\xfc\x9c\xe3\xd7\x32\x4b\x65\xf9\xbb\x67\x4c\x4e\xc4\x84\xed\xfc\x3e\xfa\x6a\x07\x9f\x5e\x94\xda\x3d\x82\x0a\x8c\x60\x56\x99\xb4\x90\xe8\xb3\x13\xdf\x3d\x61\x27\xee\x19\x10\x88\x0d\x04\x8c\x6a\x60\xa6\x35\xf9\x46\xac\x14\x73\x5e\xa6\x19\x39\x0c\x6f\xa2\xc2\xa9\x40\x30\xf1\x4e\x1a\x6b\xc8\x5b\xd0\x83\x39\x59\x6e\xae\x1c\x2b\x72\x87\x6b\x9c\x72\xcb\xc7\xd1\xa9\x3e\x40\x53\x6b\x4c\x58\xe0\x63\x4e\xbb\xab\xe6\x5a\x07\xbf\xa3\xfa\xe3\x31\x0f\x77\x49\xa7\x94\x03\x2a\x77\x77\x55\xe7\xb1\x79\x89\x7b\x40\xc2\x37\x0f\xf0\x49\xdd\x27\x02\x68\x00\x5d\x96\x6a\x95\x29\xf0\x51\x42\x3d\xbf\xe5\x48\x9f\x9c\x5d\xbe\xfe\xc7\xf9\xab\xd3\xb3\xcb\xed\xc9\xde\x9e\xec\xed\xc9\xee\x71\xb2\x85\xba\xee\x7d\xaa\xbd\xf5\xb4\x2e\x6f\xa1\x0d\xc6\x1a\x95\xe0\x7d\x46\xd9\xa1\x27\xea\xfa\x07\xee\x94\x69\xf2\x6b\x53\xd0\x75\x4d\x1a\x07\xdd\x80\xaa\xfb\xd1\xa3\x4f\x0f\xdd\x60\x72\xe7\x80\x49\x73\xb1\x63\x65\xdd\xaa\xc5\x3d\x42\x8f\x7e\x39\x3d\x3e\x39\xbb\x3c\x7d\x7e\x7a\xf2\x7a\xa3\xd9\x4e\x3d\xc1\x50\x9b\x72\xb9\xa3\x94\x2c\x4a\x71\x2d\x75\x65\xb2\x65\xc0\x53\x5f\xcf\x04\x56\x13\x66\x55\x0a\x1e\x0f\x0f\x19\xbf\xf6\x67\x5b\x61\x3b\xac\xb0\x6d\x26\x7f\xf5\xc0\xc1\x1a\x6a\xfb\x3e\x2f\x75\x3e\xd0\x16\xbe\x40\x5f\x8c\x0f\xb6\xad\xdb\x4f\xbb\x04\x99\xd3\x10\x3d\xa4\x3c\xd6\xf8\x3c\x4e\x1f\xcd\x0b\xdb\xa3\x59\xce\x20\xf0\xd7\xc3\x20\x45\x63\xc2\xd9\x4b\x5e\x7c\x2f\x96\xaf\x45\x4f\xb8\xad\x26\xbd\x45\x26\x12\x27\xe8\xd8\x95\x58\x62\x76\xf1\x91\x7f\x58\x1f\x58\xb0\x07\x89\x1e\x7e\x25\xfa\x20\xbb\x0f\x09\xfb\x7d\x25\x7a\x64\x4e\xfb\x6b\x05\x00\xdb\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xf2\xfb\x23\xc0\x9c\x7f\xbe\x71\x94\xe6\x35\xe0\x2a\xf8\xf0\xed\xc0\x2b\x81\x91\xf4\x65\x43\x76\x05\x26\xc2\xb0\xa6\x19\xf6\xa6\x0f\x3d\x90\x92\x31\x10\x69\xfa\x76\xdb\x64\xb8\x84\xc3\xf2\xd5\xdd\x9a\xb1\x62\xce\x45\x00\x74\x4c\x9f\x79\x0c\x10\x13\x5a\x64\x42\xd3\xe9\x51\xf3\x4f\x4a\x6b\xf9\x67\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xff\xfa\xfd\xc9\x3f\xfe\xb6\xbb\xfb\xf3\x3f\xe3\x6f\x41\x14\x62\x78\xbb\x79\x0b\x00\x9a\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x86\x50\xe8\x0b\xc0\x23\x98\x60\xea\x5d\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\x79\xf3\x41\x0a\x06\x58\xa2\x1e\xe5\x71\x78\x0d\x27\x1e\x6a\x5e\x32\xf0\x51\xa5\x51\x43\xa7\xa7\x64\x21\x72\xc4\xfe\x7b\xee\x49\x00\x6d\xbc\x3d\xf0\x89\x02\xb4\x08\xa7\x99\x36\x61\x58\x77\xae\x9f\xee\x3c\x28\x01\x13\x56\x70\x60\x82\x01\x45\x88\x5a\x78\x90\x83\x80\x0d\x69\x2e\xa1\xcd\xec\xe1\xf9\x29\xbb\x46\x0a\x3f\x18\xe2\xf8\xf0\xe6\xf3\x8f\xca\xe3\x42\x10\xb5\x5d\x95\xfe\x0c\xd3\xca\xfc\xf7\x84\x10\x62\x02\x54\xa4\x70\x86\xcd\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x19\xfe\x0c\x95\xc9\x63\x63\x75\xc9\xe7\x50\x18\x86\x3f\xc7\x9f\x85\xbf\xf0\x87\x8d\x07\xac\xfe\x1a\x4d\xe1\x3a\x96\x4a\x1c\xb9\x23\xd2\x4d\x7d\x3d\x40\xde\xe6\x49\xff\x40\x58\x5b\xd2\x17\xaf\xac\x79\x35\x37\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\x24\x55\xcc\x8f\xea\x2c\x36\xf0\x06\xa8\x6b\x67\x59\x76\x46\x9a\xac\xaf\x01\xb9\x59\x2a\xaf\xa5\xd1\x3d\xca\xdf\xc2\x40\xb7\x67\x3c\x12\x68\x0f\x66\x71\x05\xb7\xd9\xbb\x02\xc0\xf5\xc2\x79\x6d\xb1\xfd\xa7\x7d\xfa\xeb\xe1\x55\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xde\x53\x1f\x00\xeb\x1a\xaf\x21\x11\xaf\x9b\x23\x0e\xb2\xfd\x3e\x62\x9b\x17\xbc\xfc\xf6\x1a\xfa\xfc\xbf\xf6\x5c\x33\xca\xea\xf1\xe2\xfa\xc1\x1c\x70\x4c\x0b\xfd\x14\x9e\x1c\x7c\x52\xb3\x60\x2c\x98\x16\x9f\x9b\x9c\xfb\x2d\x38\x77\x42\x83\x56\x58\xd7\x5a\x13\x9d\x95\x3a\xf7\xb0\x14\x10\xde\xc0\x02\x4a\xba\xef\x4a\xf4\x6a\x19\x8e\xd7\xd6\x19\xb4\x75\x06\xdd\x72\x7d\xd0\x19\x84\x45\x04\x0f\xd7\x13\x24\xd4\x75\xd7\x10\xc6\xda\x08\xba\xb7\x75\x62\xf0\xc7\xbb\x05\xd4\x26\xfe\xa8\xd7\x9d\x8d\xeb\x64\x1a\x14\x68\xf9\xfa\x18\x26\x3b\xcc\x32\x26\x15\x1e\x7c\x18\x20\xd4\x62\x09\x34\x6d\x7c\x11\xf1\xb5\x9b\x42\xa8\xba\x6a\x80\x27\x43\x6e\xb1\x54\x73\x2a\x8c\x42\x51\x42\xd1\x27\xa9\x6a\xd8\xe9\xa0\x1c\xd6\xbd\x0a\xb8\x31\x3a\x81\xa6\x60\x58\x69\x15\x30\x29\x69\xda\x30\x1b\xcb\xaf\x20\xda\x98\x88\x54\xa8\x44\x50\x1f\x83\x46\x17\x67\xae\xd8\x89\xba\xf6\xbd\x1c\xd2\x0a\x93\x41\x90\xfd\xad\x1f\xe3\xf3\x4a\x40\x70\x1b\x91\x82\x60\x51\x1e\x02\x70\xfd\x60\x61\x73\x48\xc5\xd0\xb3\xda\xcb\xda\xad\xd1\x6b\x6f\x29\xde\x5f\x66\x86\xc8\x56\x2f\x65\x68\x45\x58\xd6\xee\xe7\xa6\x90\xfc\x1c\x82\x81\xfd\xc5\xe7\x6f\x4e\x74\x0e\x24\x36\x87\x11\x99\xf7\x88\x9d\x0c\x29\x26\x87\x08\x96\x14\xa5\x98\xc9\x77\x03\x9d\xd3\xc3\xa8\x9e\x50\xa6\x42\x59\x39\x93\xd8\xcb\xba\x28\x45\x21\x14\xb8\x5a\xa1\x44\xc3\xf1\x7e\x92\x94\x75\x70\xfa\x21\x26\xf3\xa0\xc2\x3d\x2c\x2b\xbb\x58\xa7\xec\x6f\xf9\x18\xdb\xf2\xb1\xce\xd7\x27\xe2\x63\xb4\x73\x1f\x0e\x13\x83\xcc\xf3\xfe\xd9\xef\x47\xcd\x54\x76\xd8\xc8\xfd\x4b\x88\x5b\x05\xfa\x81\x35\x5a\x8d\xc9\x6b\x58\xc7\x56\x32\xac\xd9\x47\xbd\x89\xe5\x5c\xf1\x39\xb6\xa2\xb0\x3a\x80\x57\xe9\x32\xb4\x13\x6b\xe7\xdd\x83\x1e\xef\x4b\xbc\xe0\xcb\x52\x67\x99\x28\x0d\xcb\xe4\x95\x60\xc7\xa2\xc8\xf4\x32\xa7\xdc\xd7\x94\x5d\x58\x6e\xdd\xae\xbe\x10\xb6\x5b\xd8\xb7\x1f\xaa\x8d\xaf\x42\x1f\x08\xfb\x1f\xcb\xda\xa1\x28\x9c\x15\x54\x41\xf9\x4a\x01\xd3\x38\x84\xce\x46\x23\x76\x26\xae\x45\x39\x62\xa7\xb3\x33\x6d\xcf\x51\xfb\x6e\x26\xdc\xe1\x8d\x4c\xce\xd8\x33\x67\xd7\x19\xcb\x2c\x76\x97\x89\x0a\xd4\x75\xd9\x18\xa0\xc6\x2d\x1c\xa2\x3e\x6f\xb5\xf6\x1c\x46\x0a\x95\xe7\x9d\x22\x19\xbd\x96\x29\xb4\xef\xea\xbd\x40\x87\x58\x4f\x5a\x43\x59\x47\xfb\x1b\x71\x15\x3c\x12\x1f\x58\x81\x52\xb1\x52\x98\x42\x2b\x23\x9a\x30\xa3\x61\x46\x68\xed\x0e\x8b\x61\xdc\x59\x78\xf6\x15\x9b\x85\x36\x16\x4a\x68\x87\x69\x0a\x77\xee\x87\x83\x8a\x64\x9e\x65\x22\x6d\x74\x05\xc4\x6e\x56\xbc\xe9\x21\x20\x34\x94\xd0\xdf\x06\x0b\x95\x1b\x35\xce\x8d\xfb\x43\x87\x49\xdf\xc3\xc9\xb7\x17\xbf\xad\xb2\xb9\x3e\x98\x20\x47\xa2\x0d\xb0\x02\x78\x0e\x30\xf8\x26\x6a\x04\xb5\xd0\xfa\x8a\x25\x3a\x2f\x32\x38\x3a\x3d\x4e\x56\xdd\x87\x2e\x6c\xa5\xb1\x1b\xdd\x1c\x44\x2d\xea\xe0\x83\x7e\x1d\xea\x7a\x29\x62\x43\xa8\x61\xe2\x9d\x48\x06\xeb\x61\x7b\xf2\x4e\x24\x51\x13\x66\x80\x64\x4b\x3c\x42\x84\x3b\xb1\xfd\x7b\xeb\xf7\x0e\x39\x0c\xe5\xe6\xef\x51\x4b\x17\x5f\x2d\x14\x4b\x18\xd3\xa3\xfd\xd3\x23\xa0\x71\x0a\xd8\x42\x58\x5f\x17\xc3\x68\x84\xcd\x88\x47\x6f\x05\xfa\x32\x24\x52\xfb\xb1\xa0\x45\x9a\xd6\x96\xed\xed\x1e\xec\xee\xaf\xf8\x1f\x5b\x90\xf1\x97\xd1\x2f\x25\x40\x9d\x16\x80\x1b\x2a\x92\xdd\x74\xc4\xa4\xf5\x99\xd6\x08\xf7\x04\xb3\xa2\xa2\xbf\x11\x33\x9a\xd9\x92\xa7\x92\xd4\x18\xf8\xd4\xdd\x64\xcb\x8a\xb8\xfc\xde\xee\xaf\xbb\xd4\xda\xeb\x46\xab\x5d\x0b\xd3\x9f\xb0\x4b\xc4\x89\x09\x03\x2d\x75\x05\xb8\x50\x48\x82\x22\x93\x89\xb4\xd9\x12\x38\x16\xd3\x15\x62\x52\x39\x79\x41\xc5\x86\x27\xef\xa4\xf5\xcd\x75\xf4\x8c\x3d\xc1\xee\x7a\x88\xe1\xc4\x0d\x74\x58\x3f\x58\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x20\xd5\xb1\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x4c\xf4\xdb\xee\x5d\xdb\xd9\x0a\x7a\xdd\xe5\xe5\xf9\xb7\x8d\xbe\xed\xc0\xc5\xad\x2d\x7c\xea\x0e\x78\x03\x44\x39\xd3\x65\xfe\x00\x78\xc7\x30\xc1\xca\x5e\x0d\xdc\xd9\x80\x2c\xac\x6f\x23\x77\xb6\x1e\x8d\xf0\xee\x1d\xdc\xd9\x3f\x74\x05\x60\x20\x7c\x9a\x2d\x03\x12\x83\x11\x96\xed\xb8\xa1\x76\x1c\x7b\x72\xbb\xe1\x3b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xac\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\x4b\x2f\xe9\x64\x4c\xe0\xf4\xf8\xba\xa6\x52\x14\xc8\xe1\xe8\x37\x9f\x1d\xff\x5a\xe1\x1b\x48\xf7\x46\x13\x8f\x24\x26\x5b\xdc\x23\x4a\x2a\x24\x16\xe2\xce\x0c\xc4\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\xa5\x3d\x83\xde\x97\x81\x88\x38\x68\xb4\x9e\xf5\x2f\x15\x8d\xaf\xf7\x13\x60\x98\xc5\x67\x43\x52\xa0\x18\x20\xb5\x7b\x35\xb1\x1b\x61\xa4\xa0\xf4\x12\x99\x2b\xb0\x09\x04\xbe\x7c\x30\x52\xc6\x69\x0b\x83\xbe\x3a\x3a\xca\x4b\xa6\x42\x57\x78\x8f\xf2\xbb\x4a\x90\x28\x33\x81\x9a\xc8\x7b\x77\xae\x17\x47\x5c\xcd\x05\x7b\xea\x7e\xf9\xe7\x3f\xfd\xe9\xab\x3f\x4d\x70\xf8\x90\xa5\xa0\xd8\xe9\xe1\xd9\xe1\x2f\x17\x3f\x1c\x41\x71\x6c\x5f\xaa\x0e\x94\x82\x39\x74\x02\xe6\xa0\xe9\x97\x1f\x35\xf9\x12\x4a\x3e\x7a\x73\x91\xa6\xef\x1f\x86\x8c\xf1\x3d\x49\xf7\x8b\x70\xf6\x10\x83\x36\x76\xa4\xba\xa3\xf6\x20\xce\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\x4b\x0d\x20\x1f\xa7\x06\xd3\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x04\xe8\x60\xc4\xfe\x2b\x05\xb5\x71\xc3\x84\x3f\x04\x39\xf3\x6d\xb2\x91\x97\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x79\x34\x33\x2e\x33\xf0\xa0\x52\x87\x6a\xcc\x08\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x68\xdf\xd7\x0e\xeb\x9b\x97\xf8\x80\x45\x1d\x89\xb8\xb2\xd1\xcc\x7e\x2b\xea\x06\x18\xef\xe1\x8a\xba\xa2\x14\x17\x56\x77\xea\x88\xc1\x56\xa3\x24\x38\xd8\x2d\x31\x92\xa9\x98\x69\xc7\x84\x6f\x0d\x7a\xa4\x15\x1c\x42\xae\xa0\x38\xd0\x7b\xb5\x74\x23\xb0\x81\x19\x99\x01\xbf\x9e\x80\x53\x0f\x4c\x8c\x96\xea\x7b\x81\x8f\xdc\xdb\x89\x1c\x66\x37\xaa\xab\x1c\xa8\x13\x39\x7c\x28\x6c\x82\x9e\xdb\x88\x91\x03\x72\x28\x4d\xbf\x1d\x46\x49\x4a\x6e\x16\xd8\xa5\x5b\xbc\x93\x96\x70\x59\xcf\x75\xda\xee\xad\x3f\x2f\x79\x22\x58\x21\x4a\xa9\x9d\x30\xaa\x94\x4d\xf5\x8d\x62\x53\x31\x97\xca\x78\x52\x00\x78\x3a\xd1\x0c\xe2\x31\xd2\x04\x60\xb8\x09\x7b\xdd\x00\x3b\xa1\x32\xa4\x44\xd7\x47\x93\xe6\xdc\x8e\x24\x81\xc4\x02\x3a\x21\xe0\x7d\xa0\x70\xdc\xcd\xeb\x43\x53\xde\xab\x14\x3c\x39\x15\x19\x5f\x62\xb6\x29\x74\xf0\x97\xff\x11\xa5\xd9\x1f\x20\xe2\x84\xfd\xe8\xfc\x77\xb7\xce\x43\x1a\x56\x0a\x9e\x2c\xfa\x05\x7f\xb7\x21\xaa\x3b\x5e\xdb\x10\x55\x9f\x41\xb6\x21\xaa\x6d\x88\xea\x03\xd7\x36\x44\xb5\x0d\x51\xb5\xae\x07\x6b\x25\x6d\x43\x54\x9d\xaf\x6d\x88\xea\xfd\xd7\x36\x44\x75\x87\x6b\x1b\xa2\xba\xe3\xb5\x0d\x51\x6d\x43\x54\xdb\x10\xd5\x36\x44\xf5\x1b\xf2\xdb\xf9\x6b\x1b\xa2\x5a\x19\x64\x1b\xa2\xda\x86\xa8\xee\x7c\x3d\x58\xe3\x6b\x1b\xa2\xc2\x6b\x1b\xa2\x6a\x5e\xbf\x2d\x51\xe7\x03\x3c\xe7\xce\xd4\xeb\x5f\xd3\x76\x0e\x41\x05\x99\x50\x9c\x48\xcf\x1a\x75\x50\xf8\xa8\x49\xdd\xa3\x22\x82\x05\xf1\xa5\x38\x14\x11\xaa\xe3\x4c\x6b\xeb\xa5\x7a\xf6\x91\x2b\x74\x5a\x07\x2a\xa2\x08\x05\x1a\xbc\xdd\x6b\xd6\x36\x56\x8d\xd5\x27\x2c\xf1\x69\x42\x12\x0f\x24\x7e\x33\x40\x18\x62\x1b\x82\xf8\xec\x42\x10\xc3\xb8\xef\x06\x70\xdd\xf5\x16\x15\x14\x99\xbf\x5c\x94\xc2\x2c\x74\xd6\x79\xa3\x37\x36\xf9\x4b\xa9\x64\x5e\xe5\xd0\x29\xd6\xed\x67\x79\x1d\x52\x00\x4c\xdd\x8a\x1e\x38\x36\x7a\x11\xa3\x96\xb2\xbe\x95\x2c\xd4\x6f\x52\x6b\x78\x53\x25\x89\x10\xd0\x4a\x2d\xb6\x70\xbe\x9a\x84\x27\x85\xd6\x19\x4f\xfb\xf1\x9b\x7e\x42\x1c\xe1\x48\x61\x94\xaf\xbe\xec\x34\xc6\xbc\x2c\x86\xe1\xcb\xdf\xbe\x3e\x3f\x8a\xf8\x32\x57\x9e\x2d\x4b\x75\xad\x33\xa0\x2a\xc7\x9b\x9c\xb2\x46\x0d\xf6\xa5\x33\x98\xa6\xc2\xf2\xc8\xb6\x21\xb3\xc0\x60\x13\x7d\xf7\x3b\xf7\xab\x20\x91\xcf\x51\xee\x62\xff\x7c\x36\xe7\x76\x93\x0c\xbf\xbf\x09\xd3\xcb\x7c\x19\x42\xde\xf4\xd5\xd0\x9b\x3e\x38\xa7\x87\x37\xbd\x50\x73\xd8\x17\x88\xa0\x7f\x67\x3d\xbc\x37\xa7\xec\xaf\x1b\xf7\x3f\x5a\x0c\x20\x6e\xe0\xc5\x07\x23\xf0\xce\x05\xb5\x8e\x22\x71\x1e\x1b\x41\xbe\xab\x94\xd5\xac\xc8\x78\xdd\x17\x0a\x56\xe0\x3b\x90\x41\x47\x0b\x91\x5c\xbd\xa6\x48\xec\x9e\x11\x22\xe8\xa6\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\xb1\x04\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x5d\x25\x11\x37\x4e\xdc\x28\x52\xcd\x27\x79\xba\x3f\x61\x6f\x15\x56\xb7\xd7\x7d\x28\x23\x6c\x07\xf7\x7c\x8f\xb3\x31\x15\x8e\xbb\x6a\xf0\x43\x44\x10\x76\x6e\x7a\x93\x3e\x40\xc9\xbd\x45\x52\xcf\x28\xf8\xa7\x8f\x80\x6f\x39\x17\x1b\xc0\xe1\xf2\xd8\x22\xdd\x83\x65\x7c\x0c\x10\xe1\x7e\x40\xd1\xed\x07\xa3\x1a\x3f\x94\x88\xf6\x03\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x47\x00\x65\xfe\x38\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x45\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x74\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xb1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xd1\x22\xd0\xfd\xa3\xcf\x0f\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x2c\x32\xbe\xbc\x10\x89\x56\x69\x67\x09\xd3\x42\xe9\x0c\xe7\xc7\xe0\xb0\xe4\xa7\x6a\x16\x5a\x2c\x38\x81\x91\x3b\x8b\x0a\x0b\x4b\x7c\x2c\x83\x14\x0a\x88\x2a\xe3\x2c\x1f\x64\x74\x82\x3d\x18\x87\x18\x56\x9d\x0c\xb9\x88\xdf\xe9\x1b\xa6\x67\x56\x28\xb6\x27\x95\x5f\xc7\xfd\xc8\x0c\xac\xbd\x93\x61\x5b\xbb\x6f\x9f\x3e\xf1\x37\x7f\x7e\x6e\x47\x70\xb0\x1a\xf3\xf1\xbd\xc0\xf4\xa0\x0f\xbb\x81\xe9\xc6\x59\x95\x35\x5d\xc1\xe8\x1e\x6e\xf2\x9b\xa7\x35\x9c\xf2\x53\x18\x37\x9c\x36\xae\x52\x46\x95\x68\x9f\xdf\xa2\xf5\xce\xab\x69\xaa\x7e\x21\x8f\xe6\x43\x5e\xe3\xcb\xa3\x73\x74\x1a\x6f\xdd\x25\x0f\xc5\x5d\xb2\xa1\xdc\x94\x07\xa8\xe8\x3e\xd2\x7c\x94\xad\xa2\x7b\x8f\x2b\xaa\x4d\xfd\xb6\xe4\x89\x38\x1f\x5c\x47\xf0\xc7\x89\xa5\x55\xc9\x89\x01\x06\x95\xcf\x1f\x1e\x25\x44\x8a\xa7\x29\xd4\xf3\x42\xa5\xec\xac\xca\xb2\x25\xab\x0a\xad\x9a\xd5\xcf\x18\x6b\x6f\x17\xd3\x82\x4b\x7e\xcd\x53\x6a\xc5\xb2\x28\x35\xc9\xcc\xb2\x52\xca\xf1\xe0\xba\x27\x1a\x28\x92\x00\xd3\xcc\x1b\x25\xbb\x46\xce\xdd\xf4\x9d\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\x95\xcc\x32\x1a\x66\xc2\x2e\x84\xc5\x90\x02\xca\xce\x4c\xab\x39\x4c\x8e\x2b\xdf\x78\x51\x24\xee\xb7\x49\x26\xb8\xaa\x0a\x7c\x9e\x93\xc4\x4b\x5d\x95\xfe\x79\x93\x10\x98\x08\x12\x58\xc9\x6c\x14\xb5\x77\x7b\xef\xc2\x86\xdc\x9f\xca\x38\x05\xe0\x95\x87\xa5\x1e\xc5\x63\x7a\xe4\x70\x13\x35\xf7\x29\x4a\x7d\x2d\x53\x8c\x6e\x78\xb2\x41\x23\x69\x6c\xe0\x13\xce\xb3\xd2\x6a\xac\xc4\x9c\x83\xa2\x42\xa7\x08\xd7\x0c\xc7\xc1\x0c\x02\x95\x42\x4b\x1f\xa7\xe1\xeb\xa2\x51\x4e\x7f\x2d\xb1\x19\x71\x44\x39\xb6\xa7\x34\xd3\x90\x8f\x5a\x29\x69\xb1\xc1\xfd\xa2\xb2\x2c\xd5\x37\x6a\xff\x5e\x51\x57\x08\xb4\x5e\xae\x25\x50\x33\xfc\xba\x4e\xcf\xc1\xf7\x7d\x3f\x79\xa5\x21\xd7\xe7\x8c\x55\xca\x88\x9e\xe2\x7d\x30\xe5\xe8\xcf\x7f\xec\xc6\x23\x64\x2e\x74\x65\x3f\x89\xf5\x77\xb3\x90\xc9\x22\x56\x66\x65\x2e\x0c\xd3\x55\xcb\x2c\x7e\x4a\x3f\x5b\xbf\x42\x5b\x13\x70\xdd\xd5\xd5\xb1\xbb\xc6\xfb\xd5\x86\x43\xa8\x3b\x5f\x43\x9e\xf8\xf1\xd9\xc5\x2f\x2f\x0e\xff\x7e\xf2\x62\xc2\x4e\x78\xb2\x88\x31\x31\x14\xe3\xc0\x34\x80\x51\x2c\xf8\xb5\x60\x9c\x55\x4a\xfe\xbb\xa2\x80\xef\x5e\xf8\xed\xfe\xa0\x58\xed\x1d\xa5\x2f\x74\xe7\x1f\xac\x1d\x1c\xf6\xfa\xc7\xbc\x2c\x6d\x04\x34\x70\x59\x51\x9f\x42\x94\x79\x89\x26\x02\x28\x5c\x90\x3e\x7f\xfc\xea\xe4\x02\xd2\xf2\x8b\x12\x91\x42\x20\x8f\x0b\xbe\x87\x91\xa6\xc2\xfd\x82\x3a\xf7\x4e\xd8\xa1\x5a\xe2\x97\x78\xa6\xa4\x61\x99\x34\x56\x80\xd4\x23\xb5\xcd\xc7\xaf\x77\x9e\x4c\xe0\x7f\x3b\x8c\xa7\x69\xe9\xf4\xba\x90\x9e\x96\xac\xe4\x8b\xa2\xe6\x27\xa7\x59\xf4\x02\x4a\x58\xcc\x46\x7b\xa9\x53\x9a\x39\x48\x12\x88\x5d\xa1\x18\x34\xb6\xe4\x56\xcc\x65\xc2\x72\x51\xce\x05\x2b\xb8\x4d\x16\x2c\xe7\x4b\x96\xe8\xb2\xac\x0a\xc4\xf9\x4f\xb9\xe5\x13\xf6\x5c\x97\x2c\xf7\x87\xd8\xed\x79\x27\x87\x2f\xd6\xc7\xf4\xeb\x93\x1d\xff\x53\x1a\x53\x09\x73\xf0\xf4\xc9\xd7\x5f\xfe\xe9\x4f\x9f\x55\x6b\xb8\x3a\x5d\xc8\xad\x6d\xd4\x1a\x8e\xfb\x55\xc0\x55\xc7\x56\x81\x52\xcd\xb3\x78\x7f\x75\x13\x00\x7d\xad\xcc\xbe\x36\xe6\xb8\x7e\x83\xf3\xae\xa6\xe6\x20\x2d\xea\xea\x39\x0c\xd4\xd8\xa9\x96\x83\xde\xb0\x22\xde\xa0\xe3\x5e\xbd\xa7\xe7\xfe\x60\x92\x9e\x93\xb7\x1a\xbc\x16\x75\x76\xd2\x88\x3d\x61\x7f\x65\xef\xd8\x5f\xc1\xd0\xfa\x73\xdf\x36\x58\x7d\x4d\xa0\x21\x92\x8d\x9c\x7d\x7f\x7a\x3e\x10\xc5\x7f\x74\x4c\xd3\x8d\xe8\xa8\x6a\x35\x9b\x4a\x52\xec\xc5\x3b\x2b\x4a\xa7\x68\xd2\x4a\x6c\xb4\x81\x98\x9b\xe0\x27\xdc\x66\x18\x78\x38\x9d\x35\x13\x9c\xee\xb7\xd1\xdc\xcf\xbf\xd3\xc6\x9e\x11\x17\x6a\xb6\xc2\xa9\x47\xcb\x81\xf1\x37\xd8\x98\x93\x1b\xc6\xd6\x07\xcc\xb0\x54\x43\xbe\x15\x26\x32\x2f\x64\x8f\x34\x8a\x87\xb3\x8d\xfb\x45\xd6\x1b\xeb\xf9\xbe\x95\x6a\xb9\x52\xc0\x06\x22\x15\x2b\xc2\xc8\x2a\x74\x4a\xda\x99\x9b\x56\x1a\xc9\x8c\xf7\xa8\x67\xe4\xb5\x09\xfe\x66\xd8\x4b\xee\x3c\x25\x5c\x61\x29\xc9\x4c\x94\x25\xe6\x9e\x4f\x97\x3e\x6d\xaf\xf7\xe2\xf5\x3a\x49\x45\xa9\xad\x4e\x74\x8f\x1e\x67\xcd\x68\x37\x0d\x07\x44\xc0\x7c\x5f\xef\x30\x7f\x73\x7c\x3e\x62\x97\x47\xe7\xd0\xf7\xe9\xe2\xe8\xf2\xbc\x69\xb3\xec\x5c\x1e\x9d\xef\x6c\x94\x14\xcc\x2b\x7c\xe0\xa2\xee\x30\x48\xc3\x05\xe5\xb4\xc9\x71\xce\x8b\xf1\x95\x58\x76\x94\xa9\x43\xc8\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\xd5\x73\xf9\x84\xd8\xf0\xcc\xf5\x85\x5d\xb9\xbe\x16\x29\x6a\xe9\xfe\x17\x42\xa5\x85\x96\x4e\x5f\xdc\x56\x7b\xdd\xff\xd7\xdb\x6a\xaf\x3b\x5f\xdb\x6a\xaf\x6d\xb5\xd7\xea\xf5\x60\x52\x5a\xb7\xd5\x5e\x9f\x57\x04\x7f\x5b\xed\xf5\x1b\x4f\x02\xd8\x56\x7b\xad\xbf\xb6\xd5\x5e\xdb\x6a\xaf\xbb\x5d\xdb\x6a\xaf\xfb\x5f\x0f\x2e\x7d\x69\x5b\xed\x75\xaf\x6b\x5b\xed\xb5\x7a\x6d\xab\xbd\x6e\xb9\xb6\xd5\x5e\xb7\x5c\xdb\x6a\xaf\x6d\xb5\xd7\xb6\xda\x6b\x9b\x04\xfb\xc1\xb1\x1e\x66\x12\x2c\xdb\x56\x7b\xd1\xb5\xad\xf6\xfa\x2c\x52\xfd\xd8\xb6\xda\xeb\x4e\xd7\xb6\xda\x6b\x5b\xed\xd5\xe5\xda\x56\x7b\x7d\x2e\xee\x92\x6d\xb5\xd7\xb6\xda\xeb\xb7\xa3\xe8\x6e\xab\xbd\xb6\xd5\x5e\xdb\x6a\xaf\x6d\xb5\xd7\x7b\x67\xb1\xad\xf6\xfa\x1c\x4c\x40\xdf\x11\xb8\x7f\xf5\xd2\xee\x91\xce\x8b\xca\x0a\xf6\xda\x0f\x19\xb4\x48\x64\x0c\xd2\xc4\x1a\x41\xff\x14\xc2\x44\xab\x99\x9c\x13\x67\x3f\xc0\x36\xbc\xe3\xf0\x3e\xe3\xa8\xf5\xed\x23\xcc\x1f\xcc\x64\x2e\xbb\x95\x94\xb1\x95\x85\x79\x01\x63\x45\x71\x19\x77\x92\x72\xfe\x0e\x8e\x08\xcf\x75\x85\xad\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\x3d\xb8\x95\x61\xc3\x98\x38\x3c\xf5\x79\x75\xe7\x43\xa4\x95\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xce\x53\xee\xad\x12\x0f\xa7\x10\x0f\xa4\x0e\x7f\x14\x65\x98\x02\xba\x03\x9d\x45\x4a\x46\x59\x39\x8d\x24\xb0\xde\x77\x1a\x3d\x37\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\xc4\x07\x20\xa1\x9b\x5b\x6c\xb4\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x44\x2f\xf3\x22\x83\x06\xe7\x70\x9e\xc7\x3e\x97\x05\x84\xeb\x96\x37\x7c\xf8\xda\xf2\x86\xcf\x91\x37\x18\x91\x54\xa5\xb4\xcb\x23\xad\xac\x78\xd7\xc9\xc3\xd2\x64\x0d\x17\xcd\x01\x29\x67\xcc\x50\xae\x1b\x7e\xc7\x74\x81\x79\xdf\xad\xc2\xfa\x85\xae\xb2\x14\x8a\x39\x2a\x05\x06\x26\x56\xe9\x09\x8b\xd6\x1f\xd8\x3d\x90\xca\xdd\x7e\x88\xb7\xe7\xd0\xcc\xfc\x77\x25\xaf\x79\xe6\xac\xdd\xfa\x17\xe7\x60\xc1\xc4\x3f\xba\xeb\x99\xb7\xdc\x5c\xd5\x07\x5e\x8c\x9d\x0e\x1d\xe6\x7c\xe0\x5f\x09\x3e\x12\xef\xec\x63\xd4\xd2\x40\x41\x3a\x2f\xe5\xb5\xcc\xc4\x5c\x9c\x98\x84\x67\xc0\xd7\x86\x91\x15\x87\xb7\x8c\x0e\x0b\x5f\xea\xcc\xb0\x9b\x85\x70\xbc\x9a\x71\xef\x02\x80\x0a\xbb\x39\x97\x0a\xeb\xe2\x0b\xff\x63\x83\xbe\x04\xc7\xfe\x0b\x5e\xba\x05\x0e\x3e\x03\x30\x91\xa7\x5a\x67\x54\xf1\x90\x2d\xeb\xf1\xa9\xf6\x47\xe9\x5f\x94\xb8\xf9\xc5\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x27\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x40\x98\x67\xec\xe9\x3e\x6c\x67\x6e\x58\x18\x23\x65\x5f\xee\x43\xf8\xef\xe8\xf0\xfc\x97\x8b\x7f\x5c\xfc\x72\x78\xfc\xf2\xf4\x8c\x9d\x69\x2b\x50\xa8\x45\x6d\x02\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\x8d\x54\xa9\xbe\x31\x9d\x7d\xb4\xb8\xfd\x1c\xf1\x04\x57\x9d\xc6\x48\x78\xc1\xa1\xfb\x61\x0f\x09\xb3\x92\x61\x12\x0f\x0a\x32\x3c\x4d\x0f\xd2\x52\x17\x48\x04\xef\xe4\xaa\x45\x6d\xd3\x8c\x8e\x73\x58\x61\x7d\x67\xcd\x01\xe7\x25\x57\xb6\xf6\xf6\xd4\x6b\x46\x6d\x17\x27\xbd\x97\xe3\x71\x57\x34\xf1\x74\xb8\x6a\xa6\xc3\x34\x15\x69\x83\xfc\x9f\x5d\xe6\xe0\x91\x7f\xb9\x65\x8d\x52\xc1\xce\x5f\x5d\x9c\xfe\xef\xd6\x3e\x5e\x16\xfd\x12\xa5\x86\xa9\x8c\x2d\x75\x31\xd8\xea\xbe\xa6\xca\xcb\xed\xfa\x3e\x88\xf5\x0d\xd2\x72\x98\xf0\xfc\xeb\x4a\x35\x21\x8d\xea\xf1\x59\xae\x53\x31\x61\xe7\x21\x4e\xd0\xfc\x36\x02\x38\xe0\xa5\x60\xee\x16\x65\x25\xcf\xb2\x65\xac\xa2\x59\x8d\x55\x88\x0d\x6c\x86\x98\x91\xcf\x78\x66\x36\xcd\x8d\xfb\xc8\x46\xa7\x47\xbc\x74\xf6\xf0\x20\xcb\x11\x46\x63\xa9\x50\xda\x92\x62\xed\x66\x09\x78\x17\xa5\x4e\x18\x1a\xdf\x51\x32\x56\x43\xbe\x19\x8c\x55\x78\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\x77\x24\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x19\xed\x20\x3b\xe0\x47\xd2\x96\x9b\xae\x68\x50\x27\x39\x3c\x77\x0c\xab\x01\x87\x2a\xae\xe0\x3d\xae\x57\xfc\xb1\x1f\xa9\xb2\x52\x87\xe6\xdb\x52\x57\x9d\x85\xd8\x8a\xb2\xf9\xed\xe9\x31\xb0\xa2\x8a\x42\x95\xca\x96\x4b\x80\x0e\x58\xc5\x7f\x0b\x86\xc1\x1b\x0a\xb6\xc6\x67\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\x3b\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x90\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\x6c\x9d\x33\xad\xdc\xc1\x1c\x64\xf3\x9c\x86\x48\x2f\x91\x34\xde\x2a\x10\x33\x26\xeb\x8f\x43\xe4\x18\x8e\x65\x65\x44\x89\x61\xee\xb2\x12\xb8\x92\xdf\x57\x53\x91\x39\xca\x3b\x93\x94\x7a\xc6\xa3\x3b\x43\xe6\x7c\x2e\x18\xb7\x61\xa7\x59\xcd\x84\x32\x8e\x63\xa2\x03\xd4\xb2\x54\x8b\xba\xfa\x9e\x1b\xf6\xe6\xf4\x98\x3d\x61\x7b\xee\x59\xfb\xb0\x7f\xa0\xa5\xbc\xd5\x98\xe4\xd6\xb6\x51\x67\x7e\x08\x98\x12\x6c\x5e\xa6\x4b\x64\x12\x23\xa6\x34\x33\x55\xb2\x88\xfb\xd8\x7b\xb3\x99\x12\x21\x21\xb4\xf2\x30\xf7\xfa\x66\x39\xd4\x1b\x23\xca\xc1\x18\xd4\x9b\x0e\x0c\x2a\x56\xa3\xdc\x9e\x6b\x52\x0f\x37\x56\x2e\x2c\x4f\xb9\xe5\xc4\xb8\xfc\x0d\x0f\x76\x49\x7f\xdb\xec\xcb\x88\x17\x52\x55\xef\x30\xf1\x68\x38\x57\xcb\xc5\x09\x0c\xcb\x12\x4f\x75\x58\x75\x5e\x14\x99\x44\xb4\x8d\x56\x22\xdc\x69\x63\xaf\x8c\x6e\x51\x13\x81\x4f\xf0\x2c\xd3\x8e\x3f\x3a\xe5\x84\xab\x54\xe7\x2b\x0f\x73\x4a\xa4\x68\x20\xa7\x4e\xd8\x76\xf7\x35\xaf\x07\xe2\x14\xca\xc4\xb5\xe8\x81\x2d\xd6\x46\x8a\x75\xa3\x39\xe2\xf8\x1d\x01\xc3\xb3\x8c\x4f\x45\x86\x34\xc6\x1d\x68\x56\x77\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x5a\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x8f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x03\x1d\xaa\x1e\xa2\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\x40\x78\x3f\x74\x3a\x18\x91\x24\x3a\x2f\xce\x4b\xed\xcc\xce\xc1\x64\x13\x0d\x5b\xc7\x0c\xd1\xb1\xb1\x26\x19\x0b\x64\x41\xf3\x66\x5e\x46\x89\x9d\xdc\xa2\x90\xf0\xd9\x9d\xff\x23\x92\x59\xc0\x7a\xda\x82\xcc\x8f\xd2\x08\x2f\xba\x5f\xd2\x17\x8f\x59\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\x88\x34\xd2\x09\xcf\x00\x3b\xb6\xdf\x96\x63\xed\x6d\xd7\x1e\x38\x4a\xe7\x85\x18\x25\x7c\xe6\x13\x48\x00\x46\x14\x3e\x21\x17\xa6\xd2\xa9\x88\x62\xd9\x98\x87\x7c\x89\x69\x9f\x70\x9f\xcf\x24\x76\x7a\x85\x0f\x2b\xa7\x8d\x5f\x5b\x4d\x08\x68\x2f\x03\x22\xad\x9b\xa0\x50\xa9\x54\x73\xf0\xab\x8d\x58\x29\x32\xcc\x41\x26\x26\x70\x85\x16\xe4\x2e\x1c\x09\x3f\xa8\x3f\x0f\xfe\xd1\xa0\x8b\x49\xad\x68\x64\xf0\x14\x79\x0d\x6b\x86\xec\x56\x1a\xb6\xf3\xc2\x13\xa0\x07\x84\xe7\x43\x94\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x25\x55\x4a\xe9\xba\x0d\x62\x05\x0c\x78\xd4\x83\x21\x11\x5c\xa6\x31\x6f\x79\xc6\xde\x2a\x16\x88\xc5\xc6\x9d\xb7\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\xba\x87\xb8\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xb7\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x80\xf8\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x21\x4a\xd9\x0a\x1c\xde\xcb\x8b\xc3\xe6\xd0\x20\xac\xa1\x21\x85\x5b\x2b\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\xef\xed\xd4\x30\x36\x72\x6e\x0e\x68\xcf\x8f\xdd\xec\xf7\x99\x54\x59\xc8\x8a\x02\x3b\x58\x59\xe3\x1d\x39\xf0\x90\x24\xcc\x02\xd6\x90\x70\xab\x29\x59\x61\x75\x9a\x88\x54\xed\x76\xc1\xc6\x19\xf6\xea\xf2\x9c\xf5\x84\x5d\xf9\xc0\x12\x9d\xd1\xde\x6e\x23\xab\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x01\x3a\x7d\x57\x8f\xc9\x52\x81\x55\x3c\x02\xb2\x9f\xf8\xad\x49\x76\xe0\x97\xde\x85\x62\x50\xfa\xe9\x6e\xac\x51\x5f\xd6\xcc\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x1d\x47\x03\x16\xe8\x55\x88\x85\x56\x9a\x8a\x24\x9c\x10\xd5\x0a\xb6\x34\xb0\x28\x8c\xe6\xc1\x9a\x10\x8b\x8e\xa6\x7a\x54\x47\x89\xe3\x40\x20\x14\x93\xd9\xd0\x5a\x05\xe7\x70\x23\xed\x02\x70\x5e\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x9c\x1c\x32\xba\xdc\x26\xe1\xee\xaf\x5d\x13\x07\xaa\x6b\x28\x78\xc8\x57\x74\xbb\x49\xcc\x66\x22\x01\x45\x2b\x26\x30\x72\xed\xbd\x1a\xf8\x96\xaa\x0c\xdc\x06\x23\x28\xf9\x5c\xbe\x73\x4f\x89\x7f\x15\x87\xc4\x09\x70\x76\xfd\xd7\xfb\x13\xc6\x4e\x55\xc8\xe0\x1d\xb9\x55\x8c\xef\xf4\xa9\x67\xd6\xbd\x62\xdc\x87\x00\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\xa6\x30\x10\x38\xfc\x45\x34\x5a\xa4\xbd\x87\x80\xdb\xb9\x4e\x11\x4d\x25\xa0\x41\x64\x4b\x8f\xee\x22\xff\xe3\xf5\xb3\x5a\xc7\x53\x1a\xab\x03\x62\x98\x15\x82\xd4\x4e\x99\x53\xb5\x33\xef\x5b\xc8\x8b\x4c\x40\x15\x67\x34\x72\x5d\xa0\x1a\xa1\xc9\x8f\xc2\x44\x6a\x40\x7a\x02\x77\x19\xb1\x7f\xc1\xa1\x0c\x89\xa8\x1e\x77\xe2\x3c\xfc\x1c\x2d\x44\x69\x7c\x6b\x09\xa8\xb0\xb4\xda\xbb\x2e\x58\x2a\x67\x33\xe1\x13\x5e\x9d\xe5\xc8\x4b\x9e\x3b\x16\x6f\x18\x91\x60\x2a\xe6\x12\x13\x22\x03\x63\xdb\x75\xea\x1e\xd5\xfa\x8d\x90\x19\x4a\xcb\x72\x39\x5f\xe0\x46\x61\x1c\x2a\x74\x99\x0f\x2a\x66\x9a\xa7\xd0\x92\x8a\xe9\x92\xdd\xf0\x32\x77\x72\x83\x27\x0b\x88\x50\x72\xc5\xd2\xaa\x04\x94\x65\x2b\x78\xba\x1c\x1b\xcb\xad\xd3\x94\x45\x49\x06\xa5\x9f\xff\x16\x52\xff\xbd\xd7\x16\x52\xff\x8e\xd7\x16\x52\x7f\x0b\xa9\xbf\x7a\x3d\x98\xec\xd0\x2d\xa4\xfe\xe7\x05\x93\xb4\x85\xd4\xdf\x74\x34\x61\x0b\xa9\xbf\x85\xd4\x7f\xdf\xb5\x85\xd4\xff\xc0\xb5\x85\xd4\xef\x70\x7d\x06\x9c\x6b\x0b\xa9\xdf\xe1\xda\x42\xea\xaf\xbf\xb6\x90\xfa\xab\xd7\x16\x52\xff\xd6\x6b\x0b\xa9\xdf\xf9\xda\x42\xea\x6f\x21\xf5\xb7\x48\xa3\xf7\x1b\xeb\x61\x22\x8d\xb2\x2d\xa4\x3e\x5d\x5b\x48\xfd\xcf\x02\x4f\x91\x6d\x21\xf5\xef\x74\x6d\x21\xf5\xb7\x90\xfa\x5d\xae\x2d\xa4\xfe\xe7\xe2\x2e\xd9\x42\xea\x6f\x21\xf5\x7f\x3b\x8a\xee\x16\x52\x7f\x0b\xa9\xbf\x85\xd4\xdf\x42\xea\xbf\x77\x16\x5b\x48\xfd\xcf\xc1\x04\x34\x36\x95\x9d\x10\x40\xef\x02\x56\x44\x49\xe8\x11\x36\xc0\xb4\x9a\xcd\x44\x09\x9c\x0b\x9e\xbc\x92\x3c\x55\xe3\x32\xb6\x83\xac\xc2\x8e\x00\xf7\x88\xea\x75\x6e\xf9\x39\x81\x11\x00\x52\x67\x9d\x29\x7e\xf2\xea\xf9\x1a\x64\xa4\xce\x59\x85\x5d\x73\xa4\x61\xce\xaf\x54\xb7\xf8\xf8\x2d\x04\x5f\x57\x3f\x46\x74\x4f\x32\x6d\x28\xc3\x1d\x88\x95\x2c\xb8\x52\xc2\xdb\x7b\xd2\x82\x1f\x65\x2a\x84\x62\xba\x10\x14\x9d\xe6\xcc\x48\x35\xcf\x04\xe3\xd6\xf2\x64\x31\x71\x4f\x52\x9e\xd8\x75\x36\x3a\x7d\x62\x6c\x29\x78\xee\xf3\xf2\x73\x2e\x71\x28\xc6\x93\x52\x1b\xc3\xf2\x2a\xb3\xb2\x08\x83\x31\x23\xa0\xa0\x06\x05\x55\x20\x06\x64\xc5\xd5\x29\xec\xa3\xfa\x69\x34\x2d\x1d\x43\xd3\x81\xb5\x39\x02\x3c\xf0\xbc\xb0\xcb\x90\xc7\x2b\xd8\x4c\x96\xc6\xb2\x24\x93\x20\xad\xe1\x89\x58\x3b\x0d\xe3\x8d\xbc\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x15\x5b\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xdc\x34\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\xf0\x62\xeb\xb4\xe1\x7a\xa3\x43\x89\x83\xdf\x9c\xa3\x46\x35\x47\xad\x50\x40\x96\xde\xca\x31\x80\x05\x50\xe2\xda\xed\x01\x91\x08\x27\x5f\xf9\x2d\xbb\xfe\x93\x6f\xfa\x48\x28\xbe\x14\xc6\xf0\xb9\x38\xef\x18\x68\xb8\xcd\x22\x83\x58\x43\xbd\x30\xb0\x15\x32\xac\xae\x0d\x9f\xd4\xd9\x99\x4d\x35\x88\xe5\x38\xa7\xa0\xfc\xdc\x94\xd2\x5a\x01\x8b\x0a\x08\x7b\x10\xab\x6c\x17\xe0\xef\xb6\x72\x3c\x5f\xfa\x41\xea\x1f\x3b\xa6\xae\x52\xcc\xb8\x9c\x0a\x36\x2d\xa5\x98\xb1\x99\x84\x34\x4e\x48\xac\x1c\x21\xe0\x12\x47\x2f\x80\x31\xce\xde\xd5\xca\xeb\xb2\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\x4a\x78\x84\x65\x0b\x15\xa6\x72\xc6\xe6\x90\x98\x49\xda\xe2\x1f\x9f\xfc\xe5\xcf\x6c\xba\x74\x22\x0d\x34\x2b\xab\x2d\xcf\xc2\x4b\x66\x42\xcd\x1d\xad\xf0\x78\x36\x6b\x24\x03\x05\xa0\x9b\x07\x4e\xfc\xe9\x97\x57\xd3\xa6\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\xfa\xa3\x74\x4f\xd9\xee\x68\x12\xad\xd9\x66\x3a\x93\xc9\xb2\xf7\x46\xf3\xc8\x5f\x6c\xa1\x6f\x50\xd7\x5f\xb3\x7b\xea\x72\xab\x42\x17\x55\x86\x4e\xe7\xe7\xa1\xba\xb8\x32\x62\xb5\x06\x70\xed\xb9\x00\x37\x29\x0d\xd1\xc6\x4d\xc7\x7c\x5c\xff\x48\x4d\xb5\x25\xe4\xc8\x0b\x00\x60\x60\x08\x3d\xe7\x59\x36\xe5\xc9\xd5\xa5\x7e\xa1\xe7\xe6\x95\x3a\x29\x4b\x5d\x36\xe7\x92\x71\xc7\x2d\x17\x95\xba\xc2\x0e\x0e\x01\x22\x41\xcf\x9d\x6a\x55\x54\xd6\x17\x32\xac\x7b\x61\xac\x97\xf7\x4c\xd8\x9b\x41\xf5\x28\xe2\x9d\xac\x6d\x1d\x2a\xd5\xc2\x1d\x19\x8f\x6f\xe2\xcd\xf6\xe5\x93\x3f\x7e\x8d\x5b\x97\xe9\x92\x7d\xfd\x04\x72\xb6\xcd\x08\x0f\x31\xf0\x36\x27\x28\x72\x9e\x65\xce\x6c\x88\x37\xa5\x23\xf4\xba\x4d\xf8\xc9\xf7\xa0\xed\xbf\xdd\xee\xac\x4a\x5d\x5e\xfe\x03\xf4\x28\x69\x8d\xc8\x66\x23\xac\x4a\x0a\x66\xcd\x2e\x08\x86\x5d\xe2\x3e\x50\x1a\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x26\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x05\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x12\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x46\xa8\xe4\x37\x0d\x62\xc0\x99\x04\xb8\x82\x9e\x78\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\xc7\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x63\x43\xd4\x03\xfa\xd3\x50\xc0\xbf\xb1\xaa\x64\xa5\x2a\x32\x14\xd6\x85\x8d\x81\x0a\x80\xdb\x3e\xc0\x92\xbb\x3b\x5c\x07\xf0\x6e\xf6\x4b\x39\x6a\xd0\x45\x05\xaf\x72\xce\x2d\x29\x84\xde\x7d\xcd\x59\x21\x4a\x23\x8d\x93\xcb\x3f\xc0\x81\x3a\xca\xb8\xcc\x23\x17\xe0\x66\x88\x80\x87\x1b\xe0\x93\xfb\x73\xca\x73\x9d\xd2\x80\xc0\x0a\x11\x3a\x7a\x8d\x5a\xdb\xd4\x6a\x07\x14\xa8\x9b\x66\x95\x3f\xd4\xd4\x6c\x72\x4a\xf7\x49\x60\x95\x78\xd7\xe7\xc4\x20\xe1\xfd\x1e\x2b\x7f\x0c\x93\x1f\x88\x0d\x00\x63\xa4\xc5\x6d\x72\xc2\x86\xf1\x88\x07\x25\x52\xe9\xc9\x0e\x9c\x30\x8c\x82\xbb\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x2f\x9f\x16\xa5\xda\xc3\xc6\x40\x13\xce\x0c\x82\xef\x03\xec\x1a\xdc\x25\xd2\x1a\x47\x07\x50\x92\x30\x3a\xea\x09\x4c\x06\x02\xd6\x63\xdf\xf0\x25\xe3\xa5\xae\x54\x4a\xfe\xa5\xe0\xe0\x7b\xd9\x7a\xf0\x99\x56\xc2\x3b\xce\xdb\x38\x15\xe0\xd1\x97\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x48\x2a\x78\xc3\x96\xa4\x3a\x0b\x92\x0a\xf9\xd3\x46\xdf\xd5\x23\xde\x0f\xf4\xbe\x2f\xc9\xc5\x52\x03\xda\x4b\x0f\x97\x0d\x1f\xdd\x94\xd2\x8a\xa8\xc7\xdf\x1e\x18\x2e\xce\x3e\x8c\x50\x19\xf6\xd7\x75\x92\xe8\x49\xa4\x7e\x30\x18\xa6\x9a\x7e\x44\xbe\x45\x0c\x0a\x8e\xdb\x3a\x0f\x97\x79\x0f\x0b\x8b\x09\xb5\xb3\xc3\xf6\xf0\xce\x5d\x2c\x68\xde\xdf\xe8\xd6\x22\xa2\x9d\xbc\x2b\x7a\x60\x6c\xb6\x6a\xe7\x0b\x0e\x3e\xb8\x62\x40\x0a\xfe\x5d\x2c\xf8\xb5\x80\x42\x6e\x99\xf1\x32\x83\x98\xe3\x05\xce\x9d\x4d\x2b\xcb\x84\xba\x96\xa5\x56\xb9\x50\x96\x5d\xf3\x52\x02\x2a\x4e\x29\x00\xd9\xc1\xd9\xa2\xbf\xdf\xfb\xe1\xf0\x35\x24\x34\xec\x13\x24\x05\xcd\xb2\x32\x1e\xbe\x26\x9e\x49\x34\xdc\x07\x97\xcf\xcf\xc3\xd1\x10\x78\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\xdb\xb2\xbc\x4b\xb2\xca\xc8\xeb\x4d\x71\x12\xaa\xb0\x3f\x96\x9d\xd6\xb9\x55\xed\x5f\x13\x6a\xa5\x70\x1f\x5c\xeb\x6b\x0a\xf4\x56\x02\x26\xbb\x26\x14\xed\xc5\x31\x70\x72\x3d\x11\x96\x06\xa6\xcf\x79\xc4\xc5\x15\x15\x02\x70\x63\x36\xeb\x84\x52\x3a\x15\xf7\x47\xdd\x69\xa6\xf7\xd0\x10\x18\x33\x8f\x2a\xf8\x4c\xb2\x10\x69\x05\xf0\x4e\xd2\x20\x38\xaa\x33\x1f\x78\x8d\xc2\xa7\xa0\x4b\xd0\xe9\x2c\x40\x1a\xa8\x31\x38\x07\x91\xe6\xfe\xf7\xa5\x07\x40\xf0\x1f\x98\xd6\x88\x60\x94\xba\xb1\x46\x8c\x1b\x53\xe5\x78\x24\xb0\x01\xc2\x4c\x5a\x13\x7a\xcc\x7a\xed\xd8\x1d\x8c\x7b\x16\x54\xf5\xa0\xef\x85\xc8\x60\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x68\xc3\x51\xc2\x04\x44\xdb\x42\x1e\xa7\x06\x2f\xe9\x4c\x42\x13\x25\x4e\xf4\xbe\x58\xf3\x4b\x54\x1d\xf0\x0e\x80\x87\xe1\x53\x91\x99\xf6\x40\xd3\x7a\x51\x08\x95\x94\x08\xdf\xb3\x4b\x2e\x37\x46\xce\x15\xf4\xcf\x74\xa3\xdd\xb3\x53\x66\x67\x9b\x69\x88\x2e\xb8\x9d\xb9\x5a\x23\x0b\x2b\xe7\xc5\x98\xac\x5e\xab\x73\x99\xdc\x63\x24\x7d\xcf\x29\xb7\x6a\xa5\x1b\x35\xb8\xaf\x2e\x56\x3c\x3e\x26\xf2\x6a\x4c\xd8\x85\xce\x29\xc5\x49\x45\x5d\xbc\x7c\x33\x55\x27\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xd7\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x7e\x92\x9a\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\xfa\xbd\x0d\x29\x30\xcf\xd8\xb8\xd5\x99\x76\xd2\x04\x0d\x7d\xff\x73\xe8\xde\xd1\x87\x9f\x82\xf9\x39\x00\xc7\x77\x7a\x1c\xff\x79\x7a\x7e\x14\xff\xf9\xc6\x38\x2a\xd1\x07\xed\xa9\x35\xbb\x32\xdc\x7e\x57\x8c\x8f\x7d\xdb\x5d\x33\x6c\x6c\xf4\x81\xaf\x8f\x16\x5c\xf9\x40\xd6\xad\xcf\x5b\x9a\xc4\x66\xf5\x74\x16\xbc\x14\x84\x1f\xe7\x38\xb9\x29\x78\x72\xeb\x2c\x02\x58\xdb\x7b\x6f\x78\xef\x4c\x4d\x55\xf8\x86\xdb\x19\xdc\x18\x66\x52\x6f\xbb\x9f\xfe\xf0\xf3\x1d\x89\xf9\xa1\xdf\xac\x23\xed\xfb\x7f\xd3\x68\xdb\x77\xa7\x5f\xac\x6f\xea\x75\xb7\xdf\x46\x7d\xf1\xee\x74\xff\x6d\x3d\x79\xef\xfa\x34\xdf\xcb\xed\x6e\x2f\xd6\x5e\xed\x3b\xdc\x0e\x4b\x7a\x3f\xb4\x82\xce\x2c\xbc\xab\xbb\xab\x83\x93\xaa\xbb\x73\xaa\x9b\xb1\xdf\x52\x00\x6e\x81\x32\x25\x98\x35\x35\x67\x0d\xf0\xa8\xaa\x2c\x85\x82\xb6\xf7\x15\x64\x3a\xfa\x76\xf6\xc8\xa4\x81\xd9\x12\x50\x27\xa2\xcd\xb3\xc3\x20\x0b\x29\x03\x2e\xe7\x00\xde\x19\x81\x55\xcf\x2a\x48\x68\x04\xd6\x8f\x60\x74\x5a\xb9\x79\x3c\x5b\x87\x90\xa1\x0b\xa1\xa2\x5e\xf7\xa4\x35\x8f\xdd\x1e\x6a\x60\x66\xa0\x22\x30\xc9\xd3\xdf\x15\x19\xb7\x33\x5d\xe6\x63\xaf\x1e\x8e\x1b\x4a\x02\x3b\x82\xd4\x1a\xe3\xed\x2b\xcc\x6f\x45\x50\x4d\x95\x66\x22\x92\xe6\xe1\x55\x55\x8a\x10\x54\xac\x52\xa5\x48\xf4\x5c\xc9\xff\xd4\x84\x00\xb9\x16\x9c\x43\xdc\x38\x49\xca\x54\x95\x65\xf7\xcf\x43\xe8\xa8\x04\xe8\x6b\x51\x2e\x04\xbf\xe7\xe6\x6d\xa5\xb4\xd0\x18\x75\xef\x51\x43\x98\x02\xa4\xf2\xfa\x87\x38\xd5\x58\x27\x50\xdb\x86\x21\x76\x9f\xb8\xcc\x41\xa0\x3b\x4d\x8f\xb3\xb9\xbc\x16\xca\x43\x8e\x1f\x65\x3c\xf4\xcf\xf6\x28\xab\x04\x7b\x5e\x59\x1d\x92\x16\x18\xb7\x11\xf0\x31\xe4\x38\x51\xbc\x34\x1e\x27\xba\x85\xba\x6f\x67\xbe\xd3\xd9\x5d\xee\x84\xbc\x01\x6c\xfd\x38\xaa\x5f\x29\xf7\xbe\xd5\x06\xb2\x26\x4b\x20\xbb\xc5\x9b\x22\x94\xd5\xf2\xe1\x47\x50\x4a\x9a\xe3\x41\xeb\x86\x21\x75\x39\x40\xc0\xd6\x84\xcd\x1c\xfb\x5f\xa2\x92\x73\x3a\x6b\x3e\x49\x36\x40\xf7\xa1\xf6\x09\xd4\xef\xda\x1e\x3c\xd7\xa9\xd3\xc2\x46\x2c\x2c\x65\xdc\x7c\x9c\xe2\x2d\x78\x26\xa3\xc3\x88\x4a\x5a\x59\x0a\x53\x68\xc4\xfe\x8f\x1f\x3b\x8a\xfc\x5f\xd2\x36\x92\xed\xb0\x8b\x5b\x38\x1a\x88\xce\xf6\x1f\x51\xea\xb5\x3a\xfc\x5c\xda\xc9\xd5\xd7\xa0\xc0\x0b\xb5\xe0\x2a\x41\xdb\xe9\xe0\x4a\x14\xe6\xc0\xc8\x39\xea\xeb\x7f\xfe\xfa\x6b\x50\xde\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x23\xd2\xe4\x0b\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xf9\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x4b\xe9\x5b\x8b\xd2\xab\xfe\x64\xc0\x9a\x93\xa2\x14\x22\x07\xf6\xd7\x25\x5b\xab\xe9\x25\x6d\x0d\xe5\x05\x2c\xfd\xe5\x78\xa2\x7f\x9a\x9a\x3b\x36\x69\x90\x75\x66\xfa\x06\x32\x2c\xa5\x76\xca\xcf\x84\xbd\x02\x39\xc8\xce\xc4\xb5\x28\x47\x7e\xd4\x17\xee\xa6\xf3\x70\x4f\xec\x86\x5b\x77\x47\xc7\x1c\xff\x8e\x6b\xe2\xe7\xde\x83\x78\xd8\xb7\x84\x26\x0f\xfc\x69\xc2\x7e\xe0\xa5\xd4\x95\x21\x5d\x24\x86\xfb\xc6\x14\xb2\x20\x49\xc0\x2b\x41\x01\x9e\x30\x48\xa8\x0c\xf3\x31\x9e\x40\x9b\xc3\xc0\xaf\x8f\xd6\x8b\x04\x69\xdd\x4a\x5d\xfb\x47\x95\x3e\xd5\x75\x05\x29\x1c\x85\xc1\x5a\xfe\xef\x25\x9a\x89\x27\x0a\xc3\xf8\x79\x00\x6f\x75\x9a\x18\x8e\xb2\x90\x73\x9f\x50\x0d\xef\x8f\xe6\x6b\xf4\x69\xd8\x21\x1d\x96\xb4\xcb\x31\xed\x9a\xd7\x5f\xb4\xdf\xaf\xc7\xb6\x68\xe2\x29\xc7\x90\xcc\xbe\xa2\xa8\x3e\x37\x3b\xb8\x4f\x40\x88\x8c\x93\x52\x5a\x99\xf0\x6c\x07\x84\x93\xff\x2a\xc9\x2a\xa7\x27\xc6\xdf\x96\x82\xd9\x1b\x8d\x4f\xe1\x19\xbb\x12\xcb\x1b\x5d\xa6\x5e\x3e\xfb\x27\xd6\x6b\x61\xac\x7f\xa4\xb3\xe7\xe0\x00\xa3\x9b\xa1\xcc\x45\xc9\xa6\xc2\x7b\xd0\x5b\x37\x2f\x27\xec\x50\x2d\x29\xfc\xa8\xe2\x22\xc3\x08\x99\x0d\x74\x04\xd4\xa2\x1a\x9b\x84\x84\x98\x7f\x1a\xc7\xf2\xcf\xdb\xbc\xcb\x4e\x01\x0b\xa7\xc0\x4b\x7f\xef\x5e\xd6\x25\x55\x39\xc1\xe9\x28\xb1\x46\x4b\xfb\xaf\x3f\x09\xb7\x70\xfa\x8d\x54\xc2\x98\x6f\xdd\x52\xf6\x51\x57\x9b\xbb\x83\x83\x5a\x42\x63\x43\xa5\x54\x9d\x52\x2c\xdc\x91\xc2\x18\xb1\x63\xc3\x3a\xad\xef\x9c\xb0\x43\xf8\x00\x72\xe2\x9d\xe6\x05\x55\x74\x6e\x30\x69\x4d\xbb\xb9\x3c\xde\x71\x78\x76\xec\x73\x97\x51\x53\x30\x4d\xb8\x74\x54\x99\x9b\x33\x01\x4d\x8f\x32\x68\xc5\xbf\x2b\x0e\x7d\x72\x77\x2e\xcb\x4a\xec\x74\x53\x95\x10\x88\xff\xe0\x4f\x5f\x3f\x01\x6d\x29\x3c\x6f\x0c\xcf\xeb\xa2\x2a\xdd\x3f\x47\xa6\x53\x76\x4c\x3b\x31\xe8\x75\xbc\x1f\x3c\xc1\xbd\xdd\x41\x41\x2b\xa8\xed\x85\x65\x0a\x34\xef\xe4\x5a\xed\x94\x0b\xd3\x3d\x0b\x66\x5c\x4f\xf7\xf2\xfe\x3d\xcc\xfa\x24\xb0\x34\x9e\x3b\x44\x94\xab\x1e\x0d\x57\xc5\xe0\x92\x84\xe7\x44\x9e\x5d\x6c\x75\x41\x1f\x43\x3a\x2c\x30\x2e\x88\x0a\x00\x7b\x5c\x16\x3d\x52\x7f\x3b\xf0\x1b\xa8\x74\xe9\xad\xdf\xed\xbe\xc6\x81\x58\x51\x2b\x74\x2b\x15\x0c\x21\xc2\x0b\x7a\x07\xa9\x72\x87\x50\x0e\x36\x62\xaf\xd4\x73\xcc\x8f\x1f\xa1\x76\xd7\x40\x1f\xc1\x9b\x06\x2d\x13\x3c\xf8\x1d\xbd\xfb\x18\xa7\xdc\x85\x29\xdc\x9f\xdc\x91\xe5\xd8\x53\xfa\xef\xbe\x6e\x8d\xd5\xd8\x7a\x0d\xcb\x98\x24\xa4\xac\x7b\x9f\x11\xfb\x64\xf3\x52\x57\x85\x8f\xa4\x36\x1b\x99\xd5\xdd\x3b\x30\x00\x88\x7d\x7e\x95\x6e\x0e\x1d\x9c\x1f\xb0\x81\x45\xed\x35\x4b\x59\x82\xe6\xb1\x97\xba\x58\x05\x85\x1e\x84\xb2\x52\xcd\x3e\xe7\x51\x2c\x72\x27\x13\x73\x9e\x2c\x77\x9a\xcf\x59\x17\xf9\x95\x50\x9c\x23\x73\x04\x4c\xc7\xe7\xd5\x35\x0d\x50\xfa\x00\xfa\x03\x9e\x35\x50\x0d\x2a\x43\x53\xf4\x22\xdf\x17\xe5\xa1\x67\xab\xec\x61\x99\xff\xe9\xeb\x3f\x8d\xbd\xef\x0d\xa6\xf2\x49\x36\x54\x88\xdc\x0e\xaa\x4b\x36\xd6\xcc\x29\x48\xd2\x14\xb0\xbe\xa0\x89\xd5\xe2\x3c\x3c\xfd\x7d\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x12\x72\x35\xbd\xe8\x7d\x8e\x5f\xbb\xed\xcb\x42\x67\x29\x1c\x14\x6a\xce\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\xcd\x24\x35\xc8\x9b\xb0\xba\x68\x2e\x36\x61\x61\x27\x4f\x18\xbb\x10\x02\x9b\x43\x46\xf3\x00\x3e\xeb\x49\x49\xde\x56\x3d\xc3\x4e\xde\x68\x84\x7d\x22\xb7\x50\x77\x71\x4c\xc1\xb4\x9e\x5e\xfb\x9d\xc3\x60\xa5\xc4\x31\x2f\x64\x70\x2b\xfd\x7a\x5b\x92\x09\xd2\x89\xeb\xa8\x2b\x65\x17\x39\x5a\x18\xc4\x88\x85\xbd\xfc\x3d\xf6\xf6\x84\xd4\x49\x88\xfc\xa1\x6f\xf2\xc6\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\x10\xdf\x7d\x1d\x43\x2f\x40\xb3\xca\xa7\x68\xd4\xea\x1b\xf0\x0a\x7f\x7b\x7a\x1c\xce\x88\xbb\xeb\xf9\x05\x86\xf4\xbe\x9c\x50\xeb\x5d\x3b\x97\x29\x9b\x62\xe2\x86\xe3\x97\x7b\x4a\xdc\x60\x2a\x38\x39\x4e\x83\x5e\x7d\xed\x53\xa4\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\x4d\x50\x45\xe9\xad\xf2\xa9\xa4\x54\xd1\x57\xaf\x77\xbd\xbb\xfa\x66\x5c\xde\x8c\xc7\xe3\x31\xc5\x77\x81\x4b\x8f\x1a\x34\x08\xcc\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\xdb\xbc\x7e\x04\xec\x48\xae\x96\x34\xbb\xfe\xfd\x7a\xef\x0f\xcf\xdd\xcf\x1d\xd7\x07\x8e\x61\x4d\xa8\xb8\x6f\x7c\x6a\x5d\xf4\x19\xed\x64\x53\xa3\x9a\xeb\x19\x6e\x52\xc8\x9e\xbf\x65\x61\xbc\x17\x88\x76\x0d\x61\xf5\xa1\x95\x2e\xde\x15\x1a\x91\x80\xa1\x3a\x05\x3a\xb6\xb5\xc3\x13\x90\x11\xea\x4e\x15\x24\xd9\x35\x4e\x0d\x29\x14\x18\x11\xf3\x44\x60\x53\xee\x86\x0c\xd3\xd9\x6b\xed\x93\xfd\x09\x3b\xa5\xad\x05\x06\xa1\xd2\xd4\xf7\x8d\x69\xc5\x44\xb1\x10\xb9\x28\x79\xd6\x7c\x10\x55\xe9\x3e\x73\xec\xb6\x74\xbb\x14\x43\x00\x39\x2f\x90\xdb\x02\xf3\x4c\x65\xe9\xfb\xc6\x46\xa1\xb9\x9d\x57\xea\xb5\xd6\xf6\xa5\x34\xa0\xbb\x90\x33\x04\x35\xcd\x9d\x75\x02\xcd\x7f\x57\xa7\x3c\xf7\xdd\xc9\x9f\x2c\xfe\xc5\x7c\xef\xb7\x21\x78\xad\xe3\x20\x8e\x69\xdd\xb7\xbd\xdb\x1b\x02\xf1\x69\x74\xd1\x0d\xbe\xd8\x75\xcd\xdb\x56\x3a\xb7\x7d\xe2\xd6\x6d\x94\x95\xc5\x6d\x03\x2d\xeb\x53\xb7\x1b\xdf\x1c\xf7\x82\x2d\x73\xa6\xe1\x9c\xf4\xdc\x34\xa7\xab\x1d\xe3\xea\x2d\x02\xee\xbe\xd0\x0a\x53\x69\x35\x86\x0e\x4e\x95\xf1\x81\xcb\xd2\xbb\x7c\x1b\x02\x88\xda\x4a\xa2\xd8\xc4\xd6\x80\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xa1\x98\x6a\x51\x77\x73\xe2\x86\xbd\x39\x3d\x66\x4f\xd8\x1e\x64\xe7\x86\x0a\x6d\xc4\xa4\x70\xa6\x6c\x2b\x85\x74\xe6\x87\x68\x9a\x2e\x04\x08\xa1\x34\xf2\x22\xdf\xea\x52\xab\x20\x86\x09\x58\xf3\x96\x06\x85\x9b\xde\xe3\x5d\xf7\x63\xb7\x1c\xfc\x90\xe5\x32\x00\x0f\x7a\xd3\x81\x07\xc5\x8a\xf5\x10\xed\x25\x37\xbd\x7a\xbf\x75\x0e\xd5\x4c\x54\x1b\x60\x53\x5d\x9c\xc0\x80\x08\x06\xf1\xce\x92\x1a\x7f\xcf\xde\xe5\xab\xa0\x3f\x84\x7c\x14\xf0\x01\x4a\xae\x52\x9d\xaf\x3c\xcd\xad\x26\x18\x6f\xd1\x6a\x6e\xb7\xdd\x6d\x57\xaf\x12\xce\x7e\x15\x90\x60\xe3\x0f\x50\xfa\xfa\x02\x7c\x05\xd2\x84\x9d\x80\xce\x03\x48\x0a\x5f\x31\x5b\x7b\x23\x23\xf4\xae\x04\x2a\x75\xd6\xb1\x98\xae\xf1\xd6\xaf\x75\x46\x45\x0c\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\x30\x41\x9b\xbd\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\x49\x4a\xb3\xf6\x5b\x43\x4a\x6b\xe3\xad\x41\xee\x3e\xc4\xb7\x6e\x66\x30\x0f\x20\x4c\x68\x40\xa6\x29\x8f\x9a\x3a\x09\xb4\x41\x4e\xea\x0c\x49\x70\x42\x3d\x2e\x3e\xda\xa7\x0c\x1e\x13\x9d\x3e\x35\xeb\xd6\x09\xcf\xa8\xf7\x7f\xb7\x75\x66\xed\xb5\x6e\x0f\x19\x25\x63\x70\x37\x5b\xf8\x2c\x4a\x29\xe4\x88\xd0\xa4\xeb\x80\x4c\x2b\xf8\x42\x6e\x3a\xfa\xa5\xcf\x86\x70\xf2\xb7\xce\x70\x8c\x7f\x6d\x35\xb5\x96\xf5\x48\xf0\x1c\x26\x28\x30\x5f\xb1\xe0\x76\x31\x62\xa5\xc8\x10\xdc\x95\xce\xd9\x15\x9a\x52\xbb\x8d\xb4\x49\xbf\x63\xfd\xa3\x41\x61\x81\xd6\xd2\x30\x32\xb8\x7c\xbc\x1a\x32\x43\xfe\x25\x0d\xdb\x79\xe1\x09\xb0\xf3\x98\x19\xf4\x0e\xbe\x4f\x58\x3b\xf4\x62\x5d\x49\x95\x12\xea\x69\x83\x34\x21\x45\x17\x75\x43\xef\x61\xf2\x67\x9d\x97\x02\x9c\xbd\x81\x34\x6c\xdc\x79\x33\x50\x28\xcc\x07\x44\xc7\xb7\x28\x99\xde\xa7\xe2\x1f\xd2\x1e\xe6\x8d\x82\x95\x56\x50\xff\xa0\xf4\x9a\xfb\xfc\xbb\x74\xeb\x80\xd8\x87\xf5\xae\x14\xaa\xf4\x64\xbf\x87\x01\x6b\x6a\x8e\x75\x2f\x91\x0a\x5f\xe3\x51\x92\x5d\x48\xed\x9d\x5b\xaa\xf7\x08\x56\x87\xf2\x5d\x57\xa4\x13\xa6\x57\xe5\xbc\x5c\xb2\x6f\x4f\x8f\x51\x03\x6f\x18\x02\x4a\xfb\x47\x87\x9d\x92\x12\xe4\x20\x57\xcb\x07\xa0\x38\x77\x83\x7d\xe9\x0c\xfa\xd2\x17\x4e\xb7\x97\x99\x88\x65\x58\x3d\xf7\xd4\x05\x15\x73\x2d\x74\x96\x32\x1e\x36\x98\xf2\x85\x5c\xa9\x7f\x0e\x06\xd0\xa3\x92\xce\x89\x33\xbe\x28\x38\x5d\xa9\xba\x52\xc4\xdf\xbf\xd7\x56\x09\xfc\x99\xde\xa7\xfa\x66\xef\x99\xca\x78\xa5\x92\xc5\x6f\x65\xcb\xac\xa1\x7e\x08\x75\x70\x76\x25\x4a\x25\x32\x56\xf0\x92\xe7\xc2\x86\x0e\x86\x46\x74\xc1\xf3\xe9\x09\x07\xd4\x0f\x0c\xa8\x07\x90\x4f\xf7\x4e\x84\x7d\x21\x80\xfa\x00\xab\xac\x69\xcf\x36\x43\xe9\xe8\xa6\xb4\xa4\xae\x9d\x1d\x07\xef\x8d\x76\xd1\xab\xb7\x60\x13\xd9\x0a\x61\xf9\x1f\xc4\xbb\x35\x6b\x77\x07\xb0\x6e\x7e\xc4\x01\x6b\x90\x01\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\xa1\xbd\x76\xcd\x8a\x2b\xaa\xd9\x07\xe1\x13\xfb\xca\x3b\xf3\x5d\xa8\x03\x7c\x54\x1e\xae\x79\x6e\xf8\x51\xe9\xde\xdb\x4a\x9e\x5d\x14\xa2\x63\x67\xfe\x66\x5f\xfe\x97\x17\x87\xcd\x41\x41\x28\x41\xb2\xb5\x5b\x13\xf7\x7d\x54\x32\x70\x23\xa6\x0b\xad\xaf\xd8\xde\x9a\xb2\xc7\xa8\xca\xc5\xc8\xb9\x39\xa0\xed\x3d\x76\xf3\xde\x67\x52\x01\x3e\xed\x2a\xae\xaf\x7f\x48\x12\x66\x01\x6b\x45\x39\x6b\x24\x86\x57\xa7\x09\x3c\x0a\x33\x6a\x36\x61\xe0\xac\x2e\xc6\xfd\xf3\xbd\xfc\xf5\x81\x05\xb9\xad\xfc\x75\x2d\xd5\xd0\xa1\xb1\x11\x92\x90\xb9\xed\xd4\xf7\x01\xe8\xf0\x5d\x3d\x5a\x0c\xa7\x26\x67\x0d\xa4\xf7\xda\x50\x0a\xc1\xca\x5d\xe8\x38\x45\x3f\xdd\x8d\xb5\xfa\x26\x1e\x1a\xcf\x8a\x05\xa7\xd4\x30\x2c\x07\xf6\x19\x14\x53\xc1\x16\x5a\xe9\x92\xca\x1c\xea\x42\x1e\x60\x33\x58\x77\x03\x2b\x40\xfc\x36\x9a\xea\x51\xed\x41\xf2\x4d\x50\x66\x19\x9f\x43\xc7\x9a\x56\x35\x0e\x30\x57\x5d\x61\x54\x33\xbe\xd9\x97\x2c\xfa\x6e\x0c\x00\x06\x6d\x90\x8b\xf9\x60\x26\x95\x6d\x40\x16\xc8\xa1\x9b\xb7\x23\xcb\xb9\x4f\x66\xf6\x53\x00\x37\x45\x28\xda\x34\x6e\xef\x60\xfe\x86\xbc\x16\x0d\x02\x23\xe7\xdd\xf3\x50\x34\x16\x93\xac\x50\x5e\xc0\xef\x39\xcb\xe5\x3b\xf7\x94\xf8\x57\x71\xb5\x81\x4a\x21\x4a\xbc\xfe\xeb\x7d\x67\x8c\xd5\x96\xdb\xc8\xad\x62\x7c\x67\xd4\x29\x41\xc1\x17\x67\x58\x2e\x80\x2f\x10\x47\x5a\xa8\xe9\x41\x9f\xfd\xdd\x1d\xaa\x2c\x84\x4a\x07\x3a\xea\x10\x32\xa5\xe1\xdc\x42\x7b\xf1\xdd\x27\x84\xea\x6e\x19\x22\x8c\xba\x2a\xa3\x3f\xb9\x68\xff\x94\x3c\xcc\x88\xf2\x5a\x26\xe2\x30\x49\x74\xa5\x7a\x65\xa1\x1e\x0b\xf7\x0a\xdc\x8a\xf4\xa2\x31\x26\x7a\xdc\x53\xf8\x16\x2b\xd1\x79\x26\x39\xc2\x0c\x35\xef\xc4\x22\xbb\x7a\x1c\xf0\xd8\xb7\x66\x48\x5b\xc6\x58\xc1\xbb\x65\x94\xf6\xa4\x50\xdf\x54\xf9\xd5\x37\x5e\x27\xe1\x5a\x14\x24\x67\xfd\x4a\x1a\xfc\xdd\x6a\x10\x2c\x37\x57\x35\xf8\x92\x80\x32\xa4\x70\x98\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x90\xa9\x03\x75\xad\xe3\x7b\xee\xe5\x0f\xcd\xf3\xff\x75\x7c\xd6\x2f\x73\x3c\xf4\x9d\xc1\xfa\x96\x05\x0d\x1d\x54\xf5\xb8\x2c\x3f\x2e\x4f\x74\x4f\x1e\xb1\x92\x13\xa4\x3e\xb5\x53\xcb\x04\x47\x9f\x0a\xdb\x8b\x32\xf5\xf7\x27\x8e\xa7\xd7\xd1\x72\x64\xf5\xd4\xfd\x2c\x17\x5c\x99\xa8\x04\x55\xc0\xd0\x3e\x2b\x36\xcc\x07\x05\x21\xad\x36\x79\x0f\xf6\xbc\xd3\xb5\x79\x87\xb1\x65\x95\x58\x56\x59\xe3\x3e\xc7\x87\x7b\x86\x79\x87\xc7\x97\x62\x2e\x8d\x2d\x97\xbe\x2f\xdb\x2c\x9a\x04\x79\x85\xc2\x2d\x57\x62\xc9\xbe\xfb\xfe\xe4\x1f\xbf\xbc\x78\x75\x74\xf8\xe2\x97\x97\x87\x47\xdf\x9d\x9e\x9d\xbc\x7d\x7b\xf1\x8f\x8b\xcb\x93\x97\x6f\xdf\x1e\x21\xc2\x08\x95\xe3\x5e\x08\xfb\xf6\x2d\xed\x54\xf3\xf6\xed\x65\x52\xc8\xe2\xed\xdb\x73\xef\x03\xc1\x8e\x0b\xff\xeb\xf8\x0c\xf8\x27\x56\x85\x85\xb4\x27\x90\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xa5\xb3\xab\xb8\x5b\x0b\x89\xd4\xeb\xb0\xbb\x01\xeb\x56\x49\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\x32\xc6\xb5\x20\x5c\x3c\x2a\x8c\x8e\x70\xb5\xd6\xb5\x63\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x73\x02\x3b\xdf\xd5\x3d\x81\xa0\xac\x19\x4b\x5b\x57\xa1\xbe\x40\x49\x2a\x74\x1a\xfa\x1f\xb5\xfc\xd2\x2b\x3e\xe9\x46\x19\x0d\x82\xb9\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x5b\x72\x2d\xd2\x94\xb7\x54\x9d\x40\x45\xe9\xbb\xa6\xea\xa0\xde\x00\x5d\x98\x51\x87\x1d\x50\x4d\x53\x9d\xf3\xfb\x76\x3a\xfb\x40\xfd\x0a\xf6\xa1\xfc\x77\xc5\x33\xd4\x01\xce\x75\xba\xca\x99\x76\xfe\xea\x3f\xfa\xdb\xe4\xaf\x61\x1e\x7f\x9b\xfc\x15\x3a\x5c\x7a\xb2\xfd\x6d\x62\xae\x93\xc9\x5f\xa9\x40\x9a\xd1\x4d\x6b\x73\x84\x57\xaa\x9d\x48\x9f\xc5\xdf\xc0\xb3\x39\xe8\xbb\x9f\xa4\xdc\x65\xc0\x56\xa1\x03\x37\x08\x45\x2d\x10\x6a\xaf\x93\x52\x70\x4c\x35\x67\xa9\xc8\x44\x8d\x03\xf3\x00\x3a\x54\xde\xde\xb2\xd3\xc7\xda\x1a\x0d\x4d\x63\xdf\x54\xd0\x97\x7e\xf3\x7d\x4f\x63\x83\xe1\xab\xba\x8d\x7c\x87\x03\xd0\x13\xa9\xe1\x5e\x61\x23\xab\x33\x81\xeb\xd3\xe7\xa4\xac\xad\xab\xdb\x35\xf1\xe8\x5d\x08\xb1\x89\x6a\xf4\x4b\x8f\x4e\xea\x76\xc4\x65\x98\x3f\x58\x1a\xd8\xcf\x0f\x83\xab\xf8\x0d\x54\xbb\x2d\x99\x93\x5a\x16\x3d\x19\x71\x85\xa8\x2d\xa1\xf3\xe0\x5f\xaf\xc4\x72\x84\x80\x1e\xa8\x84\xfc\x2d\x82\x59\x0e\x25\xd1\x08\xbc\xa6\x4b\xf6\x57\xff\xaf\xbf\xdd\xd7\x5a\xeb\xe1\x47\xed\xe3\x45\xc5\x97\xea\x1d\xf9\x3a\xc1\x2a\x98\x26\xc2\x07\x52\x96\x0a\x64\xac\x46\x72\x4d\xd8\x09\xd4\xbd\xa2\x46\x4a\x50\xb3\x59\xd6\xb8\xd9\xf8\xb6\x91\x0d\x74\x08\xf0\xbf\x44\xd5\x31\x67\xfa\x82\x2a\x33\x01\x66\x67\x26\xca\xfa\x13\x60\x30\x67\xfa\xe4\x9d\x48\x2a\xfb\x29\xab\xd5\xf1\xba\x12\xfd\x1b\x79\x7d\x2f\x02\x04\x11\xd2\xc6\x69\xe1\xa1\x32\xa1\x3e\x9d\x51\x72\xda\xfb\x69\x7b\x25\x96\x26\x80\xac\x5d\xe1\xe8\x54\xd5\x1c\xf6\xaf\x17\x64\x27\xef\xa4\xb1\xe6\x7f\xfa\x2e\x62\xf9\xb4\xee\xdf\xc6\x31\x4b\xac\x1e\x3d\x02\xd8\x73\x7f\xc2\x63\x3e\x35\xc1\xfd\x0b\xf4\xa6\xfa\x2b\x4f\x89\x08\x42\x8f\xbb\x77\xda\x35\x94\x9e\xa4\x15\x14\xaa\xc5\x58\x6c\x75\x62\x0d\xfe\x18\xf7\x27\xd2\x10\xe8\x72\xe2\x94\xbc\xa6\x98\xa1\x8f\xe8\x26\x09\xa8\x22\xf2\x9a\x67\x42\x11\x34\x6d\x96\x26\xbc\xc4\x10\x3d\x01\x0a\x19\x42\xb7\x26\x24\x0d\x27\xe3\x88\x93\xd5\xab\x6c\x28\x94\xc7\x4b\x2b\x93\x2a\xe3\x25\x73\xe7\x71\xae\xcb\x7b\xe2\x0e\xe1\xd5\xaf\x9b\x5d\xd8\xa2\x3d\x9a\x3c\x37\xf9\x7b\x7b\xc4\x36\xd0\x21\x69\x2f\xce\x64\x82\xfa\x9a\xe6\x41\xd9\x6b\xa2\x63\xeb\x99\xe7\x4d\x81\x51\xc4\x50\x79\xb6\xe1\x1c\x97\x73\xf0\x7f\xef\x47\xc2\x23\x9c\xcc\x09\xfb\x7b\xa8\x16\x1f\xb1\xda\x67\x0c\x35\xa9\xf4\x4c\x3a\x36\xb4\x5c\xf5\xa1\x9e\xe9\x12\x5a\x13\xee\xa5\x1a\x7e\x23\xae\x65\x62\xf7\x27\xec\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xc7\x2c\xd4\xe1\xd6\x80\x7d\x4f\xd8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\x88\x90\x40\x1f\x59\x36\x4c\x8f\x08\xf7\x9a\xe8\x76\x83\x8d\xa2\xa6\xd8\xda\x1a\x41\xf2\xeb\xc0\x21\x03\x4f\x94\x86\x4e\x69\xc3\x73\x1b\xe2\x2c\x9e\x85\x86\x8d\xf3\x2f\xf0\xd1\xb3\x52\xcc\xe1\xfc\xe1\xe9\xf9\x84\xa7\xcf\xea\x42\x67\x7a\xbe\xbc\x28\x4a\xc1\xd3\x23\xad\x8c\x2d\x81\x35\xf4\xc1\x77\xbb\x6d\xcc\xa8\x1b\xd6\x42\xdf\x30\x4e\xe5\xec\x7a\x86\x08\x79\xba\x9a\x2f\x10\xff\x1f\x7e\xe8\x3b\xc7\xfa\x29\x92\xd1\x69\x26\xec\x22\xe0\xfb\xc3\x06\x0f\xed\x02\x60\x14\x70\x78\xdc\xf0\x25\x1d\x26\x3e\x95\xa9\x30\x51\x8e\xb2\x9f\x0c\x86\x7e\x6e\x7d\x7f\xe0\xca\x87\x67\xc7\xf7\x6d\xaa\xb0\x41\x85\xf6\x96\x57\x09\x9a\x11\x52\xbd\xa6\x6f\xd0\x48\x81\x6e\x3c\xd7\xa4\xa9\x22\x96\xab\xa7\xcc\x27\xd4\x4d\xfb\x80\x2f\xe5\xfc\xdd\xc5\x95\xb8\xe9\xf0\x4b\xff\xa2\xdf\x8b\xfb\xa7\x82\x8d\xc1\x1e\x7d\xa3\x0c\xb7\xd2\xcc\xa0\xfb\xca\x27\xd4\xc7\xa1\xe8\xa0\x5b\x93\x08\xbc\x9a\xb5\x3b\xf1\x68\xbe\x28\x3c\xe0\x2d\x36\x36\x0b\xe5\xff\xd5\x76\x10\x0a\x40\x2c\x82\x08\xfd\x25\xdc\x09\x4a\xa8\xe7\x92\xd5\x75\x1c\x1a\x23\x15\x55\x3e\x15\x65\x38\xfb\xe8\x0c\x90\x65\x0b\x9a\xb6\x75\xf6\xbb\x33\xc6\xce\x99\x70\x7d\xd3\xca\x80\x3c\x27\xef\x9c\xe6\x61\xba\x25\x2a\xe1\xd5\x6c\x99\xd6\x1a\x14\xc3\x63\x3e\x81\xb3\xb5\x0c\x8d\xd6\x25\x60\xf6\xc6\x9f\x74\xe5\x73\xf5\xd5\xaf\xe9\x22\xeb\xd7\x78\x91\xad\x49\x94\xbe\xf5\xf5\x5b\xfd\x4f\xe2\x82\x3f\x72\x0a\x99\x11\x2a\xf0\xe8\xc0\xe6\xaa\x16\xec\xd4\x0b\x3f\x0b\xda\x9c\x33\x8a\xdc\x4d\xf8\xbb\xbe\xdd\x8d\x7a\x34\x6e\x64\x03\x34\x6f\x64\xc0\xcb\xae\x3a\x70\xc0\xf8\xf7\x9e\x58\x9d\x07\xe9\xdf\xc6\x91\x75\x37\xa8\xeb\xab\xb1\xa1\xae\x6a\xd3\x1a\x77\x56\xc3\xb4\xae\x99\x5d\x6d\x58\xf7\x7a\xf6\x00\xbd\xcd\x58\x4f\x1b\xb7\xbe\x1a\x84\xd0\xf7\xb0\x76\x39\x04\x98\xf4\xcc\x9f\x8e\xb5\x36\xef\xa9\x1a\xb1\x33\x6d\xdd\x7f\x22\xf3\xf7\x58\x0b\x73\xa6\x2d\x7c\xf2\x20\x48\x89\xaf\x30\x20\x21\x7d\x1b\x01\xc0\x7b\x03\xbe\x49\x21\x5a\x27\xf1\x3c\xc1\xd6\x18\x16\xa7\x8a\xe9\xd2\x53\x2c\x58\x17\x86\x86\x88\xc3\x0a\x84\xb1\x75\xab\x71\xe2\xc6\x89\xe9\xfc\x9e\xe1\x68\x28\xc8\xfe\xc2\x6f\x00\x3c\xb5\xc8\xa0\x40\x20\xad\x4a\xc4\xb0\x75\xba\xa6\x15\x73\x99\xb0\x5c\x94\x73\xe8\x05\x9d\x2c\x86\x58\xbe\x3e\x72\x05\xaf\x9e\xd2\x25\x9e\x4c\x8f\xbd\x04\x22\x1b\x54\xac\x01\x55\x00\x1c\x0f\xc5\x5a\xce\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x59\xc1\x65\x09\x98\xb7\x14\x3b\x8e\xbf\xa3\xe8\x4b\x3c\x8c\x1b\x61\xc5\xb7\xc4\x15\x13\x58\xc9\xe4\x46\x6f\x2b\x1e\x23\x76\xb3\xd0\x06\x85\x61\x70\x7f\xec\x5c\x89\xe5\xce\x68\x65\xeb\xed\x9c\xaa\x9d\x3a\x30\xdc\xd8\x6c\x41\x08\x43\x06\xe1\x0e\x7c\xb7\xf3\xf1\x74\x95\x5e\xc2\x76\x88\x8e\x01\xed\x09\x75\xdc\x57\xf5\xe2\x7d\x2f\x96\xfd\x3d\x66\x2f\x1b\xc3\x79\x65\xc9\x92\x8e\x5e\x4b\x3f\x83\x39\xff\x19\x78\xea\x17\x64\x76\xeb\x6b\xe1\xfb\xc2\xa1\x79\xe9\xf8\x42\xc8\x98\xe1\x59\x82\x3d\x3f\x70\x51\x61\x10\xb7\x98\xde\xc4\xc8\xb4\xbe\xaa\x0a\xbf\x29\x42\x6f\x5f\xa9\x12\x9d\x93\xd1\x41\x9d\xe5\xdc\xbe\xa2\x1d\x37\xa6\x38\x1e\xee\xde\xb0\x37\x08\x69\xbf\x61\xcd\x34\x27\x1c\xdc\x0e\xc2\x31\xbf\x60\x01\xdf\xf1\x15\x42\xca\x4b\x3c\xbb\x09\x03\x9a\x81\x5e\x90\x6a\xb5\x6b\x71\x6c\x7f\xcc\xd6\xbc\x48\x18\x99\xbc\x85\xee\x9c\xaa\x2a\xcb\x02\x7e\x28\xea\xf3\xe8\x0c\x84\x73\x41\x5e\xf4\xb9\x3b\x29\xb6\xf9\x82\x8f\xaa\x59\x7a\x4f\x5e\xda\xe8\x08\xe1\x68\xd4\xb5\x01\x1e\x5e\xe4\x38\xe8\x7d\x7a\x76\x5f\xe2\x40\x91\x93\x0b\x03\xeb\xf3\x52\x60\x45\x33\xec\x2c\xd8\x69\xd4\x22\xa9\x52\xe2\x5a\xb8\x95\x4d\xa5\x21\x50\x4d\x9f\xa7\xf3\xcf\x15\xbf\xc2\xff\x73\xac\xcf\xb4\xf5\xae\xaf\x7f\x7a\xdf\x31\x32\xf1\x77\x32\xaf\x72\x04\x9f\xb3\x6e\x8b\xa6\x72\xe6\xd1\xb4\x7d\x7a\x50\xd3\xe8\x6e\xfa\x7e\x68\x97\x5a\x5e\xce\x21\x4d\x98\x8c\x6e\xcf\xab\xe7\x99\x9e\xf2\x8c\xe5\x52\xb9\xc7\x50\x06\x40\xe3\xb3\x30\x13\xfa\xf3\x3d\x0f\x02\x81\x22\xe7\x72\x9a\x09\xb2\xea\x5b\x40\xf5\xd1\x8f\x5b\x37\x02\x4f\xca\x84\x31\x18\xb4\x7f\x29\xd5\xb1\x77\x09\x3e\x77\xa7\xe6\x1d\xcf\x8b\x4c\x60\x9d\x2b\xfb\x6a\xfc\x1f\xad\x04\xa3\x2c\x97\x11\xf3\xcb\x53\x77\xf4\x7b\x8a\xd2\xa8\xee\xce\x11\x52\x98\x9a\xcc\xc3\xbb\x23\x0d\xfb\xf2\xe0\xcb\x83\xa7\xcf\x9c\x22\x86\xb1\x2e\x6e\x08\xc7\x6b\x95\x1a\x4f\x27\xec\x57\xe6\x66\xf0\x94\xfe\xfb\x25\xfd\xf7\x2b\xf6\x2b\xfb\x95\xb1\x73\x76\xce\xe2\xff\xba\xff\xb0\x5f\xd9\xd8\x11\x21\x9a\xea\xd3\x51\x93\x77\x24\xce\x26\xf5\x55\xeb\xa1\xa3\xa6\xd5\x34\x34\x94\x0c\x26\x3a\x17\x30\xd5\x2f\xff\xa7\xbf\x07\xf2\x2d\x2c\x36\x3d\x85\x49\xed\xc1\x94\xf6\xd9\x0d\x78\xa6\x73\x7e\x85\x5e\x99\xc3\xc4\x56\x3c\x73\x0f\xdf\xfb\x6a\xfc\x74\x9f\x69\xd5\xbc\xfd\x5a\x6a\xc7\x03\xfd\x0c\xf7\x9e\xee\x4f\x56\xa6\xfc\xe5\x9a\x29\xb7\xfa\x7f\x52\xcd\xb0\x1b\xf4\xf6\xfd\xee\xb7\xfa\xa1\x5a\xde\xf0\x65\xd8\xf0\x5e\x64\xcc\xe5\x75\x68\x99\x11\x21\xf9\x40\xc8\x1e\xf6\xaf\xf4\xe0\x6c\x38\xe8\x92\x49\x3b\x61\xa7\x76\x77\xd7\x77\x9b\x75\x06\xb3\xef\xed\x71\x1c\x83\xce\x02\xe1\x61\x6f\x3c\x69\xa5\xf4\x77\x80\x38\x1c\x34\x36\x72\xaf\xe6\x1c\x78\xe5\xe1\x94\xf4\x66\x71\x3b\xf5\x89\x6b\x40\x42\xac\x9e\xfa\xf6\xc1\x0d\xd9\x87\xef\x3d\xdd\x2d\xe8\x78\xcf\x86\xae\x48\x1b\xa9\x4f\x7e\xfd\x4e\x23\x48\x84\xf3\xae\x6f\x86\xbe\x6f\x8c\x77\x19\xf6\x76\xa7\x79\x2e\xdf\xee\x40\x04\x2c\x28\xa1\xd4\x0c\x8b\x24\x3b\x41\x88\xfa\x6d\x1c\xc1\xdc\x1d\xaa\xb4\xce\x3b\xea\x38\x7f\xe8\x03\x01\x86\xd7\x1c\x82\x71\xe5\xea\x9b\x44\xb9\x49\x8d\x54\x56\x77\x0a\xeb\x73\x3c\x61\x87\xb8\x81\x0d\x44\x10\xef\x32\xaf\x5b\x69\x57\x37\x4a\xbe\x01\x9d\x25\x44\x52\x72\x8d\x38\x83\xca\x8b\x47\x72\xf8\x6a\xd2\xbe\xc2\xb2\x9e\xce\xd6\x24\x93\xd5\x51\x16\x44\x70\x75\x9b\x04\x8a\x8f\xe2\xfd\x13\xb5\xc6\x78\xba\x06\xce\x94\x8e\x8b\x69\x92\xeb\x09\x6d\xa4\xfa\x99\xda\xe2\x73\x7f\x6c\xf3\x8f\x60\xc1\x36\xe4\x26\x34\x93\xed\x22\x2c\xbe\x1c\xb5\x66\x4f\x9f\xff\xa9\x8b\x0c\xf9\xf2\xd9\xfd\x84\x03\xfd\xf7\xb2\xb1\xcc\x6b\x57\xf7\x4f\x7b\xf5\x2c\xf7\x21\x0b\x60\xcd\x21\x80\x8a\xa1\x3a\x22\x3c\x09\x02\xcd\x48\x5b\x71\x2c\x32\x52\xe2\x86\x32\x3f\x6f\x7f\xa9\xa8\x50\xd4\x33\xf7\x91\x93\x3f\xbc\x32\x02\x2a\xbf\x2a\x00\x05\x70\x84\xf4\xca\xee\x57\x7b\x5f\xb1\x31\x7b\xb2\xef\x76\x83\xc2\x6d\x05\xc4\x8c\x45\x99\x13\x0d\x94\xc8\x6c\x17\x4e\x79\x72\x94\x31\xa3\xd0\x8f\xae\x25\x84\x60\x49\x2f\x29\xaf\x99\x3b\x7d\x87\xfb\xd6\x8c\x2a\xf5\x8c\x1e\xd5\x93\x9a\x36\xa7\xea\x5c\xa7\xcd\x88\x59\x28\x23\x9b\x43\xd4\x1d\xea\x79\xa8\x4d\x14\xdb\xf3\xff\xa8\xa1\xde\xf7\x3b\xa1\x8a\x6c\x56\x16\x28\x9d\x8a\xc3\x19\xf4\x10\x58\x76\x45\x6f\x6e\xcb\x84\xb3\x95\x31\x23\xd9\xb0\xd0\x37\xec\x86\xf2\x93\xb1\xa1\x26\x96\xd9\xc5\x13\x39\x88\x5b\x9d\x23\x3f\x0b\x2c\x99\x54\x88\xc0\x4a\xe9\x18\x19\x58\xf6\x57\x31\x34\xcd\x98\x7d\xa7\x95\x2e\x9f\xa1\x76\xe4\x86\x34\x35\x2b\xbe\xfd\x71\xc8\x6a\x92\xac\x4a\xa3\xee\x88\xb5\x40\x30\x4e\xbd\x39\x05\x03\xed\xd9\x87\x46\x09\x66\x1c\xa4\x4a\xa7\x81\x8f\xbd\x6f\x70\xdf\x71\x7a\x6d\x4e\x6e\x40\xbf\x5e\x71\xca\xb8\x6f\xe1\x75\xa9\x3f\xc9\x24\xda\xff\x71\x65\xa6\xdf\xd1\xd1\xee\x75\x3f\x75\x4b\x76\xea\xe6\x65\x42\x03\xbb\xf7\x9d\x07\xa8\xc1\xec\xbe\xd9\x3b\x1a\x7a\x8e\x84\x97\x10\x8a\x1f\x72\xa7\xc6\x23\xbe\x77\x9f\x22\x0e\x15\xa6\x02\xf4\xde\x93\xb8\x1d\x42\xc9\x2a\x8c\x3a\x62\x3c\xd3\xe0\x60\x70\x0c\xd6\x7d\x24\x52\xba\x71\x16\x5a\xec\xaf\xf8\x0e\x16\x50\xa5\x5b\x27\xa3\x8c\x1a\x9b\xac\xbd\x5b\xfd\x0b\xdc\x61\x7f\xf6\xda\x8b\xf8\xcc\xcf\x78\x33\x46\x39\x02\x03\x24\xa6\x85\xb1\xbc\xd9\x7c\x25\x40\xe2\xc1\x92\xa1\x77\x68\x02\x74\x21\x03\x86\x8a\x2e\xd0\x01\x47\x02\x59\x9a\x10\x81\x94\x50\xc3\x9e\x44\xed\x8b\x4b\xd4\xc1\x64\x2a\x4a\x14\xa9\x53\xd1\x28\xd1\x09\xb9\x1d\xec\xc7\xfa\x4e\x2c\xcd\x81\x1c\x66\x1c\xe8\x6f\x58\x12\xbe\x33\xad\x92\x2b\x61\xbd\xef\xb6\x84\xaa\x82\xa2\xb2\x6c\xca\x33\xae\x12\xb7\x6b\xdb\xb1\x7c\xab\x71\x30\xfc\x25\x3c\x05\x71\x6e\x42\xe9\x08\x0e\x1d\x65\x1e\x4a\x65\xac\x1b\x0d\x53\x12\xeb\x09\x1e\x66\x46\x8f\xdc\xd9\xf4\x03\xac\xba\x0f\x60\x28\xfa\x37\xba\xa3\x89\xfd\x0b\x61\xa9\x36\x2d\xf2\x21\x13\x9d\x5b\x22\x0b\x4b\xb0\x9b\xfc\x61\xc2\xc4\x64\x0e\x2a\x6e\x6b\xc9\x76\x9a\x05\x92\xbe\xe6\x66\x67\x84\x6f\xed\x56\x8e\x0a\x56\xc9\xbf\x41\xad\x34\xa2\xb7\x52\x29\xd4\x71\xb7\x07\x0e\x77\x34\x9f\xe0\x14\x20\x3f\x3a\x28\xaa\xef\x1f\xfd\xd4\xae\xb3\x71\x3f\xf5\x99\x59\xb1\xe8\xfb\xbb\xd8\x56\x95\xfc\x26\x0b\x87\x2c\x13\x9e\xf9\xea\x0f\x68\xf5\x17\x70\xce\xd5\xee\x6e\xed\x0b\x80\xa3\x80\x9c\xa5\xb6\x56\x1c\xfb\x6c\x58\x0b\x6c\xcf\x2b\x7b\xcc\x8a\x2c\xc3\xc3\x5a\x1b\x4d\x4e\xf9\xb5\xba\xb6\x9a\x24\x8c\xd0\xf4\x5b\xac\xfd\x61\xfc\x23\x5f\x03\x03\xae\xb1\x65\x40\x28\x1c\xb1\x69\x65\xd9\x5c\x5e\x3b\xce\x7f\x27\x37\x07\xba\x72\x16\x22\x2b\x58\x29\xd2\x2a\x21\xdc\x02\x10\x4b\x87\xb1\x4d\x86\x9d\xa5\x3d\x77\xd8\x69\x10\x74\x07\x5b\x9d\xa9\xa6\xd4\x91\x33\x38\x20\xa0\x5a\xc9\x19\x13\xd7\xa2\x5c\xb2\x42\x1b\x03\xc7\x10\xd8\x16\x16\xef\x41\x9c\x28\x80\x29\x83\xfd\x00\xb3\xf2\x2a\xfb\x0e\xe9\xec\x3b\x60\xd3\xea\x06\x2b\xfa\x34\x2e\xbc\xaf\x0e\x9e\x1e\x3c\x7d\xbf\xf9\x75\x0e\xff\xab\x7d\x72\xfe\xbf\xa7\xb3\x35\x56\x66\x3d\x97\xc6\xce\xb9\x8f\xdb\xee\x4b\xf0\xae\x7d\xb5\x1f\x79\xef\xbe\x3a\xf8\xf2\xe0\xe9\x9e\x9b\xeb\x97\xfb\x6e\xd6\x91\x5f\xee\xcb\xc8\x2f\x17\x7e\x49\x33\x12\xa6\xe1\x99\x3b\x55\x54\xa9\x09\x6d\x4e\xc9\x36\xa7\xaa\x3f\x37\x23\x63\x7d\x08\x22\xf7\xbc\x1c\xb7\x5d\xd3\x2f\xb0\x6b\xd1\x41\x28\x2d\xfb\x43\xae\x4b\xf1\x87\xe8\xfe\x5b\x3d\x6a\xdd\x1d\x65\x1d\xd8\xcd\x6a\x48\x20\xe7\xc5\xf8\xaa\x43\x50\xac\x4f\x3a\x60\xdf\x64\xc0\xdb\x02\x1b\x39\x2f\xee\x31\x0e\xf6\x93\xe9\xd5\x6b\xf5\x05\x25\x92\xd1\x50\x94\x28\x85\x6e\xdc\x9c\x12\xfa\xa6\xcb\xb8\xfe\x77\x2a\x9c\x2e\x8b\x5e\xaf\x1a\x24\xf0\x9e\xed\x0d\x8d\xd5\x25\x9f\x8b\x03\x7a\xec\x63\x69\x6b\xfa\x03\x36\xf0\x69\x64\xc5\x20\xfc\x12\xb5\xf6\xf1\x25\xd8\x3e\x5f\x12\xb8\x00\x4f\xa0\x7a\x11\x08\xd9\xc0\xcf\x8c\xea\x22\x1f\x49\xea\x6d\x07\xb0\xbf\x3e\x89\x5e\xfc\xc6\x9c\x64\xdc\x58\x99\xfc\x3d\xd3\xc9\xd5\x85\x75\xe6\x4e\x6f\xd5\x62\xdd\xa8\x8d\x35\x55\xec\xf0\xc7\x0b\x76\x2c\xcd\x55\xdd\x25\x12\x3b\xb1\x34\x0b\x06\x79\x40\x22\x26\xec\x08\x96\xf3\x64\x81\xaa\x2b\x79\x9d\x7d\x37\xaa\xe1\xce\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x67\xc1\x1b\xc3\x8d\xc4\xd7\x39\x3d\xde\x40\xa2\xee\xcc\x74\x6d\x9f\xcb\xd6\xf4\x34\xf3\xe0\xf8\x88\x81\x90\x09\xea\x6b\x0f\x88\xcc\xcd\x3e\x65\xb0\x87\x96\xba\x62\x37\x1c\x0d\x6a\xe0\xb0\x13\x76\x29\x8b\x67\xec\x24\xea\xf8\xb3\x6e\x28\xa7\x7d\x04\xf4\x55\x32\xa8\x61\xcf\x61\xe2\x8d\x63\xc8\x54\xd3\xc3\x4e\x50\xb5\x32\xcf\xd8\x8e\x78\x67\xff\xb8\x33\x62\x3b\xef\x66\xc6\xfd\x47\xd9\x19\x74\x08\xa3\xce\xa3\x4e\xc7\x53\x33\x51\xd6\xa6\x23\xfe\x60\x15\xf8\x68\xf8\x2d\xcb\x2e\x5f\x1d\xbf\x7a\x06\xba\x7c\xaa\x9d\xd5\x47\xbd\xf9\x3d\x8c\x17\xf1\xc6\x88\x0c\x90\x2b\x92\xe8\xbc\x28\x75\x2e\xa3\x62\x5b\x38\x72\x5d\x4e\x00\x1b\x22\xdb\x0b\x0c\x5b\xd8\x0c\x83\xec\xa7\x30\x9c\xdf\x52\xd1\x07\xea\x2e\x9b\xe9\x74\xc6\x34\xa6\x06\x34\xcb\xfd\xa5\x09\x37\xb9\xed\x43\xa3\x60\xc7\xf9\x7a\xc3\x38\xcd\x9c\xbe\x3a\x48\xc5\xf5\x81\x49\xf9\xd3\x11\x3c\x06\x77\xc3\xb2\x35\x27\x6e\xd8\xce\xd3\x9d\x09\xbb\x90\xb9\xcc\x78\x99\x51\x2b\x5c\x1a\xa2\xbe\xcf\x19\x0a\x7e\x40\x30\x7f\x9f\xec\xb0\x3d\xac\xb7\x07\x75\x23\x13\x1e\x7d\x2d\xa0\x8d\x42\x66\xcc\x7e\x27\xed\x92\x0d\xe0\x7e\x67\xbd\x5d\xf0\x8c\xba\xe2\xbf\x52\x59\xe7\x2c\xe5\xe6\xe6\xf0\xa3\xf9\x62\xb5\xb2\x22\x47\xe6\x4c\x97\x64\x04\x86\x5b\x3c\xa8\x8f\x54\xa4\xb6\xbc\x74\x4b\x7f\xff\x4e\xd4\x1f\x4b\xfc\xb0\x01\x80\xe6\x58\x90\x22\xc3\xd0\xd7\x8f\x06\xc9\x07\x4a\xfe\xbb\x12\xec\xf4\xd8\x33\xf1\x42\x94\x46\x1a\xeb\x58\x54\xda\x50\x0d\x24\xea\x0b\x7b\x87\x39\xff\x8f\x56\xec\xe4\xef\x17\x34\xad\xfd\x07\x48\xec\x8e\x9c\x8e\xff\xa7\x2a\x85\xd3\x88\x7a\xab\x5f\x61\xa4\xb6\xca\xe5\x3e\x67\xc7\xdc\x72\xd4\xbc\x90\x53\xe9\x1a\x08\x0b\x94\xaa\x29\x14\x28\x79\x94\xb3\x8e\xca\x33\xdb\xbc\xf6\xe3\x76\xd0\x59\x77\xe4\x6c\xf7\xf3\x37\xaf\x4f\x37\xa0\x3b\x25\x20\x6e\xe7\x2f\x75\x3a\x90\x02\x15\x0d\xe8\x45\x1e\x00\x93\x1e\xe1\xe7\x2c\x77\x4f\x62\x67\x5a\x89\x11\x7b\x2d\x78\xca\x1c\x77\xa3\x7f\xfe\x58\x4a\x7b\x5f\xac\xa7\xfa\xea\x2d\xfa\xfd\x22\x0e\x42\x08\x3f\x98\x27\xc2\x59\x84\xef\x07\x60\x94\xc0\x74\x48\x07\x98\x66\x7a\xca\x88\x59\x6c\xf2\xed\xdf\xbc\x3e\x1d\xec\xe5\xdf\xbc\x3e\xf5\xef\xee\xfe\xa9\x67\x0f\xf3\xb5\x07\x34\x1e\x6a\xdb\xe1\x79\x4b\xd9\xaf\xd5\xb9\xba\x2d\x4e\xdb\x20\xb8\xbb\x35\x30\x19\xca\x0e\xd8\x14\xcd\xaf\xa4\xea\x5c\xef\xd6\xe4\x36\xd0\x12\x27\xc0\x3f\x45\x41\x34\x40\x9d\x4b\x9f\xb1\xbc\xca\x2c\x20\xfc\xc0\x5e\x73\x9b\x0f\xf2\xc3\xfc\xae\x63\x84\x76\xc9\xd8\xb1\xc0\x70\x44\xfa\xcc\xd7\x5c\x84\x5f\xac\xff\xc1\x4b\xae\xf8\xdc\xdd\x0e\x12\x90\xe5\xf8\x67\xb4\xc9\xf7\xd0\xe9\xae\xc2\x57\xfc\x9a\xcb\x8c\x4f\x65\x26\x2d\xe8\x73\xfb\x13\xaf\xcd\x63\x5e\x3e\x4c\x79\x63\xdc\x6f\x50\xd5\x36\xa8\xad\x31\x16\x0a\x40\xf9\xb1\x3d\xf7\xdd\xc1\x8d\x63\xf5\xfb\x13\xe0\xfb\x70\x23\x20\xaf\xb7\x94\xdf\xd7\x1f\x52\x7e\x37\xa2\xa7\xc2\x7a\x3f\xef\xd8\xaf\x6b\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x02\xd8\xfc\xcc\xd5\x27\xec\x99\xde\x43\x81\x82\xb3\xd3\xf1\xf7\x7d\x55\xa8\x8f\x73\x70\xd2\xcf\xef\xe0\x30\xec\x6c\x48\x2b\x3d\x08\xb9\xea\xe1\xbc\xae\x11\x80\x94\xf1\xab\x56\xa9\x38\x9e\xac\x0b\xe2\xe5\x1e\x60\x19\x7e\xef\xce\x53\x17\x20\x09\xbc\x7a\xb3\xdf\xb0\x83\x87\xa1\x8b\x1f\xcd\x93\x05\x85\x14\x7c\xcc\x3a\x9f\xb3\x9e\xaf\x99\x88\x62\x31\xeb\x9f\xcb\xee\x86\x79\x7e\xd1\x8c\xda\x1c\x89\x62\xc1\x9e\x5f\xac\x61\x93\x58\x47\xe0\xde\xdb\x60\x2c\x67\xd7\xb0\x4c\xce\x84\x95\x9d\x88\xb0\x61\x46\x99\x6b\x25\xad\x2e\xcd\x06\xd8\x9c\x7f\xf4\x30\x8a\x9b\x1f\xcd\xed\xcf\xd7\x9e\x28\xec\x65\xf4\x29\x67\x89\xce\x32\x91\xf8\xec\x7e\x58\xe2\xf0\xb3\x35\x8e\x18\xca\x40\x30\x93\xab\xaf\xc1\x15\x43\x4e\x97\x03\xdc\x76\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x77\x0b\x7d\x33\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\x41\xec\x8c\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\x00\xce\x6f\x4c\x0d\xb1\xee\xe3\xce\xa5\xd6\x76\x15\x64\x7d\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x7b\x42\xd0\xd7\xd7\xc3\xd2\x85\x6b\x37\x6f\x83\x44\x1f\x57\x33\x7e\x28\x07\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\x8b\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x57\x62\xc9\x00\x26\x61\xa6\x4b\x68\x59\xd2\xdc\x9f\xc2\x26\x40\xbc\x83\xca\x88\x72\x42\x0a\xc7\x03\x21\x7c\x1f\x55\x04\x5e\xe4\xb5\x98\x0d\x49\xf6\xd7\x62\xb6\x8e\xea\xf4\x31\xe0\xba\x86\xf4\x38\xa7\xaf\x54\x76\x81\xb9\xb1\x88\x27\x8d\xb4\x5d\xbb\x0c\x84\x73\xf1\x40\xe8\xde\x0b\xa1\x60\x08\x14\x9d\x3e\xdd\x10\xd9\xca\xe2\xc5\x6e\x4b\x5a\x24\x7b\xef\x30\x88\xbe\x76\x56\xac\xb8\x39\xb8\xd1\xe5\x95\x54\xf3\xf1\x8d\xb4\x8b\x31\x52\xca\x1c\x00\xba\xfd\xc1\xef\xe0\x3f\x14\x45\x3e\x4c\x53\xca\x7f\xab\x8c\x98\x55\x19\x66\xa6\x99\x09\xe3\x85\xfc\x41\x94\x06\xb2\x2c\xaf\xa4\x4a\x47\xac\x92\xe9\x37\x5d\x57\x8c\x0d\x71\x5a\xba\x77\xa7\x6f\xd3\xba\xa2\x06\xf5\x3a\x16\xa3\xa5\xe7\x49\x25\x4f\xb5\xc1\x1e\x47\x8e\x54\x8d\x23\xc0\xd3\x5c\xaa\x87\x72\x02\xba\x5a\x07\x52\xa5\xdd\x28\xd9\x0a\x40\xc0\x38\x4d\xf3\x80\x3e\xa3\x30\x76\xc8\xf9\xe1\xde\x7b\x82\x4d\xcc\x29\xfb\xa7\x99\xfb\x73\x27\xc6\x92\x2f\xcd\xbf\xb3\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\x89\x3c\xf7\xb9\x3e\x5d\x22\xcf\xb0\x0e\xf9\x4f\x90\x9e\xf3\x51\x77\x1c\x7b\xc0\x3a\xf3\xc7\xf5\x83\x6d\x90\xd4\xfd\x35\xe3\x8f\xa3\xa1\xd5\xd2\x07\xfa\xef\x19\x0f\x0a\x07\x0a\x18\x72\x25\xef\x4f\x83\x1c\xf9\xba\xe1\x93\xc7\x77\x48\xb4\x52\xd4\x0b\xe0\x55\x21\xd4\x85\xe5\xc9\x55\xcf\xa8\xee\x56\xab\xfa\x8d\x69\x55\x1f\x29\x11\xc8\x6f\x51\x2c\xbc\xa3\xf4\xb7\x3a\xd9\x1b\x0f\xf9\x23\x64\xc0\xd8\xd8\xee\x25\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x01\xc8\x5a\x54\x7b\x0a\x74\xfc\xf4\x1a\x4f\xdf\xf3\x4d\x22\x66\xb8\x1c\x98\x68\xc0\x26\x47\xcd\xdd\x27\x53\x69\x6b\x5e\x69\x84\x45\xf0\x27\x82\x03\xd6\x8a\x25\x04\xf0\x00\xfa\x48\x04\x5b\x10\xe9\x2a\x8a\xe9\xc4\xfa\xaa\xd1\x80\x13\xf5\xe4\xc9\x93\x27\x88\x7d\xf3\x5f\xff\xf5\x5f\x4c\x97\xd0\x77\x33\x91\xf9\xea\x8d\x70\xd7\x9f\x9e\x3e\x9d\xb0\x7f\x1c\xbe\x7c\x01\x15\x0d\x85\x35\xd8\x8d\x0d\x47\x76\x37\x34\x7e\x6c\x46\xec\xff\xbd\x78\x75\x56\xa3\x32\x34\xbf\x05\xd3\x3c\xbc\x5e\xb3\x07\xc6\x93\x3f\xff\xf1\x8f\x13\x76\x2c\x4b\xa8\xe8\x92\x22\xf4\x57\x0f\xae\x16\x5e\x0a\xc4\xea\x01\xd4\x14\xaf\x71\xc9\xd0\xca\x90\x0a\x93\x73\x39\x5f\x58\xaa\x88\x75\x1b\x32\x93\x89\xc5\xe2\x31\x64\x6b\xbe\x7d\x3b\xb6\xcf\xa0\x86\x34\xa4\xfd\xc1\xe4\x46\x2c\x93\x57\x82\xcd\xcc\xb7\xa5\xae\x8a\x1a\xd2\x90\x9a\x0e\x53\xa1\x0c\x0e\x56\xaf\x95\x11\xf6\x91\xa7\xad\xf6\x72\x35\x37\xf6\x36\x8c\xd4\x52\x58\xa9\xbc\xb5\xc6\xf5\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\xe8\x77\x19\x7c\x3d\x29\x3b\x0a\x5c\xc5\xa3\x8c\x14\xa5\xfe\x17\x6e\x01\xa8\x45\x8e\xd8\x33\xd4\x0a\xc3\x4a\x52\xa5\x70\x14\xdd\xf2\xf5\xd4\xd4\x60\xdd\x7f\x4c\x5d\x5b\x56\x5b\x5f\x65\xd2\xb8\x47\x00\xbc\xcf\x7b\x9e\x5c\xf7\xed\x75\xbb\xd4\xe0\x7e\xa9\xd4\xca\xaf\x09\x4a\x85\xd8\x25\x35\xbc\x24\xf4\xe1\x7a\x0c\xc4\x05\x20\xe4\x1b\xba\xd7\x53\x29\x10\xa2\x91\x6f\x6d\x84\xad\x88\x34\x90\x45\xef\x9e\x0d\xcd\x18\xe1\x0d\x73\x5e\x5e\x39\xc3\x95\xb8\xcb\x84\x9d\xbb\x49\x06\xf0\x1c\x04\xf6\xbd\xc6\xc0\x66\xce\x97\xf0\x58\x52\xdc\xe0\x21\xbb\x93\xc9\x2e\x1e\x3f\x5d\x32\x63\x79\x49\x67\xc9\x7d\xfe\x79\x20\x8a\xbf\xe4\x85\x41\x84\x5b\xa7\xa9\x02\xfa\xb3\x86\xda\x75\xbb\xf0\x2c\x88\x13\xad\xb7\x28\xe0\x6c\x0c\x84\xe9\x3c\xc0\x03\x47\x00\xa7\xd5\xa7\x53\xfe\x20\xe0\xa9\xf3\x1e\x0a\x07\x5e\xed\x98\x6a\xda\x8a\x6c\xdc\x49\xdf\xa0\x0e\x48\x99\x78\x54\x0a\xc6\xfa\x8e\xa7\xc4\x38\x63\x05\x2c\x6e\x85\xf9\x78\xf5\x08\xbc\x86\xd0\x26\xf0\xea\xaf\x53\xe0\xd5\x27\x88\x8c\x57\x63\x0f\xfb\x48\x32\x12\x93\x04\x18\xca\xa8\x59\xbd\x04\xd0\x97\xae\x88\x8e\x35\x36\x71\xf5\xcd\x88\x15\xe3\x53\xa3\xb3\xca\xe2\x4f\xeb\x2f\x63\xe9\x07\x83\x7a\x7c\x6c\x10\x79\xe1\xb6\x48\x16\x82\x16\x80\xe2\xa3\x8f\x58\xc4\xab\x37\xdb\xe8\xe3\x84\xf8\x0d\x39\x20\x7a\xd3\x39\x18\x6c\x43\xd0\xda\x0f\x16\x2a\xee\x6e\x16\x82\x52\x20\x22\xbd\xcf\x71\x53\xc7\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xa4\x1b\x71\x33\x26\x46\xf6\xf7\x25\x18\xc9\xf6\x8e\x42\x79\xbc\x4f\xbb\x3b\x55\x56\x94\x33\x9e\x88\xfd\xd8\xc7\x20\x8a\x85\xc8\x45\xe9\x08\x45\xf7\xf9\x1a\xed\x05\x57\x29\xc1\x4e\x25\xa2\x84\x13\x2c\xde\x59\x51\x3a\xa2\x1e\x5d\x9c\xb2\xb4\x94\xd7\xa2\x34\x6c\xef\xef\x00\x20\x88\x70\x53\xfb\x8f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\x94\xe7\xe1\x2a\xe2\x33\xf5\x52\x79\x6c\x2c\xb7\xac\x26\xf6\x1d\x4d\xdc\x81\x00\x11\x0a\xdc\x17\xba\x37\x63\x6c\xd3\x23\xb7\x43\x93\xa9\xc4\xe2\xc0\xdc\xb0\x52\xcc\x9d\x35\x56\x46\x30\x7d\x08\x93\xb2\xb1\xe2\x86\xe1\x0b\x4a\xea\x60\xd5\xfb\x6a\x3f\x66\x64\x57\xea\x6b\x99\x7a\x75\x08\xd1\xe8\x03\x26\x5c\xc1\x4d\x04\x5e\xc0\x8d\xd1\x89\x04\x57\x53\xb4\x34\x68\xa5\x82\xd2\xd4\x6c\xfb\xe5\xc3\xcd\x71\x98\x4c\x43\xf3\x9c\x4e\x3d\x47\xd9\x20\x02\x51\xa7\xe2\xbc\x9a\x66\xd2\x2c\x2e\x06\x0d\x89\xac\x1b\x18\x93\x12\x57\x32\x55\x6e\x8d\x8c\x18\xa1\x8c\xa4\x16\xf1\xa8\x6e\x49\xa7\x6d\x6b\x58\x06\xff\xeb\xf8\x50\x68\xa8\x86\x87\xc6\xf3\xfe\xab\xb3\x7a\x1e\x04\x56\x82\x1d\x8f\x53\xf1\x46\x15\x8d\xcf\x13\x9e\x65\x86\xf4\xdb\xd0\xcf\xc3\xcb\x1e\xd4\x50\x3d\x80\x09\xee\x0a\xe9\x36\x8c\x9f\x3d\xa4\xe0\x20\xf3\x0a\xcd\x67\xd6\xbe\x98\x89\x00\x86\xb5\xf2\x37\x41\xe3\x66\xff\x83\x40\x21\xac\xc4\xc1\x4d\xb7\xc1\xb6\x1f\xdb\xf0\xcf\xe3\x0b\xff\x7c\x9c\x9a\x8a\xba\x9d\x26\x87\x0f\xc7\x50\xa1\x85\xa1\x8d\x8a\x5a\xc4\x7a\x41\xe3\x05\xd2\x07\xd2\x34\x37\x16\x02\xc6\xf9\x1d\x5a\xea\x3e\x31\x8c\x77\xb7\x3d\x28\xa8\x62\xce\x14\x07\x0e\x35\x26\xfa\x25\xd1\x91\x22\x1b\x39\x9c\xf3\x55\xbe\x56\xcb\x74\x10\xe7\xf8\xe1\xae\x61\xa9\x4e\x2a\x67\x7c\xd5\x64\xaf\x13\x2e\xfa\x75\xe6\xfb\xbc\x5a\x05\xa5\xfa\x46\xdd\xf0\x32\x3d\x3c\xef\x54\x9b\xdb\x54\xce\xea\xb1\x62\xd5\xdb\x7f\xcc\xdc\xe7\x7c\x0a\x48\xb7\x84\x6d\xb8\x8d\xf6\xad\x1d\x22\xe6\xe6\xeb\xdc\x6d\x56\x3b\x26\x7b\xc7\x68\xde\x7d\x1d\x76\xdb\x00\xe1\x36\x40\xd8\xb8\x1e\x52\x80\xf0\x14\x03\x84\x71\x57\xdb\x06\x7b\x21\x0f\xad\xa3\xf8\x67\x11\x63\x3a\xae\x59\x2a\x6a\xe2\xed\x7a\xde\x96\xf2\x8f\x87\xb7\xde\x75\x91\xc1\xe0\x79\x2e\xe8\x65\x9f\x43\x3c\xea\x01\xc4\x93\x80\x96\x3d\xac\x42\xbc\x9a\x0c\xbf\xae\x57\x43\x94\x5a\x0c\x4c\x47\x11\xee\x42\xa7\xd4\xcd\x00\xda\x6c\x60\xcb\x80\x51\x68\x83\xa7\x7c\xb9\x29\x68\xe7\x05\x4f\x04\xf0\xb7\xa0\xfe\x0c\x12\x24\xe8\xb9\x01\xd8\x40\x9b\x80\xc1\x46\x00\xea\x9c\xf7\xd9\x0d\x6c\xb0\x1d\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x1b\xc1\x24\x0b\x91\x73\xf8\xe7\x73\x4f\x02\xc7\x1b\x9d\xf1\x60\x05\x42\xc0\x89\x32\x37\x4c\xcf\x46\x8d\x4c\xd7\x9d\xeb\xa7\x3b\xfd\x82\x0d\x6c\xb8\x38\x25\xf3\xe7\xe8\xbc\x77\xb0\x87\xb5\x09\x76\xde\x88\xed\xb8\x33\x54\x37\x7c\xf4\xb8\xf7\x21\x83\x02\xe4\x07\x52\xf8\xc1\x10\x67\xe8\x20\x6e\xd7\xe0\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x0d\xde\x7e\x8e\xc1\xdb\x48\x30\x7a\x46\xb7\x26\x90\x1b\x87\x04\x7c\x34\x77\x2a\xbc\x51\x43\x36\x8c\x0f\xe5\xfa\x38\xae\x2e\x9b\xa9\x4b\xbb\x93\xc9\xee\xae\x8f\xee\xd2\xbe\xaf\xec\x6c\xfc\x35\x13\x2a\xd1\xa9\xef\x56\x3b\x93\xa5\xb1\xa0\xee\xd5\xee\xb6\x78\x2e\xb9\x7f\x56\x9c\xfe\x04\x63\x0f\xb1\xd4\xbd\x79\x8b\x87\x24\x7c\xfe\x11\x94\x98\x5a\x75\x09\xc0\x87\x44\xa2\x80\x67\x4d\x3a\x8c\xff\xde\xb0\x4c\xe6\x92\x7a\xbd\xbb\x83\x2e\x8c\x35\x6c\x0f\x3f\x9c\x24\x45\x35\xa2\x1b\x26\xb9\xc8\x75\xb9\x1c\x85\x9b\xdc\x97\x8d\x5f\xd1\x1d\xfb\xd8\xef\xa4\x2a\x4b\xa1\x6c\xb6\xfc\x9c\x35\x20\x4f\xc4\x07\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\xcd\xad\x55\x47\x7c\xc1\x6d\x1e\xf5\x17\x08\x68\xb4\x66\x54\xc7\xc5\xdd\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x39\x7e\xdd\x35\xa0\xce\x93\xca\x6b\x69\x74\xe7\xb0\x68\x34\x50\x4c\x9e\x8b\xe0\x84\x76\x87\x4d\x57\xb6\xa8\x2c\x71\x74\x7f\x02\x3d\xca\x78\x38\x79\x2d\xe5\xf0\x69\x97\x2e\x4a\xcd\xab\xe0\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\x97\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\xbd\xa7\xce\xd5\xf2\x55\x4f\x56\x88\xd7\x78\x40\x91\xdc\x1c\x71\x90\xed\xd7\x6a\x2b\x21\x95\x1d\xeb\x72\x8c\x43\x3f\x03\xb0\xe0\x9e\x0f\xf0\xdb\x6b\xe8\xf3\x5f\xab\x01\x35\xdc\xbe\x57\xea\x37\x7c\xc0\x21\xf4\x79\x2c\x07\x28\x33\xf6\x23\x35\xcb\x64\xac\xc8\x0b\x5d\xf2\x72\xc9\x52\xf2\x66\x2e\xd7\x20\x10\x45\x10\x44\xbd\x21\x85\x61\x1e\xa9\x2c\x37\x50\x69\xdc\x1b\x51\x48\xa4\xb2\xca\x07\xc2\x13\x82\xb1\xe2\xc5\xb8\x01\xe4\x7d\x42\xed\xf7\x29\x45\x74\x1b\x05\x34\xa6\x3c\xb9\x42\x0b\x2a\xac\x16\xea\x8d\x51\x69\xfd\xce\x0e\xa5\x44\x60\x3b\x7f\x72\xec\x43\x6e\x8b\x4e\x85\x5b\x4a\x7f\x33\x8e\xdd\x70\xc2\x63\xa4\x9d\x12\x08\xeb\x8e\x54\xba\x64\x2f\x41\x01\xda\xe8\xea\xb3\x41\xb0\x42\xe4\x7f\xc4\x0b\xa7\xf5\x0d\x54\x89\xea\x87\xf3\x09\x44\x56\x83\xbd\x49\xb8\x5e\x33\x68\xb2\x55\x67\x88\x35\x34\x0b\x58\xc8\x13\x7f\x2c\x7d\xfc\xd6\x2d\xa7\x1b\x15\x75\x53\x70\x4c\x67\x06\xf3\x56\x64\x02\x7d\xa0\xc0\x36\x85\xe5\x08\x4b\x78\x19\xb5\xe6\xaf\x8c\x7b\x92\x56\xcd\x7b\xea\x07\x61\x9b\xac\x29\xee\x09\xdf\x4f\xbb\x69\x51\xbb\x6f\x2e\xc2\x9b\xd5\xfe\x0c\x28\x59\xf6\xe6\xa7\xa9\xc0\x48\xa1\xa7\x90\xaa\xad\x67\x90\x59\x11\xf5\xeb\xf1\x2d\x69\x56\x36\xaa\x92\x59\x73\xa7\xfa\xce\x13\xe1\xc5\x2b\x45\x09\x85\x2b\xdb\x6e\xfd\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xed\xb7\x47\xa7\x76\xf4\x54\x36\x86\x52\x31\x06\x51\x2c\x06\x57\x27\x42\xca\x66\xff\x0e\xaf\x75\xf6\x67\x43\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xcc\xc0\xa7\x1b\x5c\x06\x57\x12\xc9\xd9\x64\x99\x10\xb4\x93\x6c\xb4\xee\xc1\x61\xf1\x4c\x40\x51\xd5\x38\x34\xaa\xae\x1d\x12\x6c\x2a\x66\x98\xf1\x84\xbf\x01\x4f\x01\x95\x82\xa5\x22\x13\x56\x44\x1d\xe6\x0b\xec\x89\x5d\x8a\x5c\x5f\x53\x63\xd6\x37\x86\xe2\xe5\x72\xf6\x8c\xf1\xfd\x46\xc1\xb1\xa1\x96\xc7\x42\xa4\x58\x1f\x16\x35\x15\x2c\x2b\x65\x46\x6c\xba\xef\xf3\x59\xa9\xfd\x65\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe5\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\xd7\xd2\x48\x4d\x91\x2e\x3f\xee\x79\xe8\xc2\x80\xd1\xb3\xa3\x8c\xcb\x9c\xed\x19\x21\xd8\x89\xdf\x12\xf8\xcd\x05\x6a\x92\xe8\x49\x2c\x9b\x49\x75\x04\xf8\x48\xc0\x03\xee\x93\x9a\xf5\x86\x54\x05\x54\x06\xdc\xcc\xd7\x3e\x74\x3f\x2c\xd7\xfa\x39\xe9\x12\x12\xde\x7c\x0b\x20\xa1\x52\x1d\x65\xc4\x1c\x9e\x9f\x9a\xd8\xbe\xa5\x36\x8a\x38\x12\x7c\x91\x69\x35\x8f\x81\xef\xea\x9d\xe9\x98\xbc\x82\x7e\x98\xd7\x32\xad\x78\x86\xec\x9d\x26\x73\x74\x71\x8a\x3f\x97\xf3\x85\x1d\xdf\x08\xf0\x7e\xa2\x14\xac\xcf\x8c\x7f\xa8\x5c\xc9\xb4\x95\x06\xc4\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\xc3\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x86\x9d\xba\x3a\x37\xe8\xf6\x58\xf7\xdc\x08\x1f\xdb\xba\xf3\x23\x28\xc4\xdd\x3b\x04\x6f\x4c\x91\xbd\xae\xb7\xc9\xa5\xc8\x8b\x8c\xdb\x61\x52\x4b\x76\x7e\x8c\xdc\xdf\x51\xf0\xd8\x1d\x47\xae\xd2\x31\xcf\xdc\x8e\x3c\xff\xe1\x88\x2a\xdb\xf0\x80\x35\xd2\xd7\x2e\xeb\x1e\xa5\xbe\x2f\xb5\xd3\x92\xd6\x1e\x2d\xc0\x52\x9b\x8a\x14\x98\x11\x3d\x19\x7c\x14\x37\x0a\x7b\x04\xbb\x3f\xce\x7f\x38\x1a\x31\x39\x11\x13\xff\x57\xb8\xd5\x73\x43\xab\xe7\x58\xe0\x10\x2a\x68\x60\x3f\xc3\x54\x62\xe7\x6f\xfc\xdb\x7f\xfe\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\x5e\x46\x7f\xfb\xa7\x63\xae\xa5\xbb\xa1\xf9\x69\x9c\x5f\x0e\x7c\xcf\xfd\xf5\xcf\x73\x9d\x5e\x14\x22\x99\xe0\x6b\x99\x7f\x62\x96\x00\x13\xca\x3a\x5d\xfb\x5c\x43\x66\x99\x4c\x71\x97\xc3\xb3\x4b\xf1\x2f\x1f\x20\xa0\x76\xa9\xc4\x48\x12\x6e\x85\x02\x01\xe0\x0b\x8d\x95\xb6\xf8\x73\x6c\xb4\x0a\xf3\xdf\x9b\xc5\xad\x4f\xad\xd6\x70\xcc\x91\x95\x1c\x2a\x26\xde\x49\x03\xb8\x33\xf8\xae\x40\x0e\x4e\xc9\xeb\x5e\xa6\xb9\x61\x1d\x85\x03\xcc\x10\xf4\x5e\x75\x73\xfb\x83\xd2\xf6\x0f\x61\xf9\x7d\x62\x22\x76\x30\x67\xfc\x5a\xcb\x94\x55\xd0\x37\xcb\x9d\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x12\x13\x76\xe1\x64\x56\x9c\x61\x80\xd4\x53\x0c\xba\xd0\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x65\xd9\xe9\x8c\x99\x2a\x81\xe6\xbc\xa5\x18\x7b\xe9\x48\x77\xad\xf0\x98\xfa\x5d\x46\x61\xb1\x17\x1c\xed\xa7\x22\x85\x9f\x62\xab\x5f\x45\xdb\x6b\x25\xaf\xda\xcd\x53\xab\xa4\x96\x88\x40\x4c\x68\xaf\xed\x84\x60\xe6\x13\x80\xd0\x94\xa3\x80\x81\x12\x89\x30\x86\x97\x4b\xec\x86\x2a\x43\xd3\x46\x4a\x79\x05\x49\x9d\x73\x55\xc1\x00\xa5\xc0\xde\xba\x55\x02\xd4\xe1\x6c\x5a\xea\x2b\xa1\x42\x09\x81\x5b\xc5\x66\x42\x75\x9d\x35\x8a\x6d\xa7\x59\xb2\xe0\x6a\x2e\xea\x2a\xf2\x9c\xa7\x40\xfb\xef\x83\xa6\xe5\xdf\xc7\x51\x80\xcf\x9c\xc2\x22\x2d\x90\x62\xea\xe4\x53\x08\x7b\xbc\x55\x01\x07\x77\x54\xc7\x25\xdc\x2b\xc9\xac\x13\x4f\x64\xc3\x38\xc2\xfb\xbb\xc0\xc7\xa0\x50\x6c\x30\x79\x3b\x17\x96\xa7\xdc\xf2\xc1\x12\xb8\x5f\xf2\xd0\xf5\x93\x92\x3a\x60\x3b\x44\xc9\x1e\x24\x63\xbd\x2a\xa9\x0b\x19\xe3\x0a\x00\x37\x58\xf8\xd5\x07\x5c\x2a\xeb\xf6\x35\x05\x1d\x31\x2f\x1b\x74\x35\x9e\x65\xfa\x86\x90\xea\xfc\x68\xc8\xb2\x44\xca\xd2\x0a\xd4\xbe\x9a\xa5\xf5\x09\x8a\x0f\x12\x33\x71\x0b\x3d\x18\x95\x2f\xeb\xd8\x7f\xd2\xcc\xcd\x5e\xab\xa0\xa1\xac\x13\xca\x4a\xec\xa1\xef\x81\x20\x88\xf8\x95\xc2\xa3\xda\x5a\x06\x58\xa7\xb9\xb0\xa6\xce\xaa\x44\x69\xe2\x58\x24\xc9\x72\x72\x22\x80\xa8\xa1\xa5\x21\x3b\x7c\xbd\xa6\x88\x0b\x67\x34\x49\x0b\x27\xbf\x36\xbe\x32\xc3\x05\x8f\xb0\xfd\xed\x4b\x9d\xf6\x8f\x42\xb5\xfa\xb8\xd6\x03\xd7\xd5\x26\x58\x79\x64\xc0\xc9\x83\x37\x40\x4c\xde\x34\x60\x32\x50\x04\x2c\xf8\x75\x77\x77\x6a\xad\x99\x8e\x43\xb3\x36\x78\xdc\x18\x1e\x37\x7e\xda\xd7\x71\xdd\x3f\x6b\xd1\x5f\x3d\xb3\x17\x9b\x13\x1a\x20\x52\xe1\x58\xeb\xc5\x20\x81\x84\x16\x8a\x52\x18\x97\xe4\x2f\x65\x66\x84\x6c\x18\xaa\xa7\x15\xd2\x71\xcd\x67\xec\x0f\x0d\x8d\x8b\x34\xdb\x60\x0d\x63\x15\xd3\x9e\x37\x8f\x27\xb4\xf0\x1e\xce\xab\x79\xfb\x7e\x6b\x30\x50\xf5\xd6\x5b\x8d\xbe\x5a\x2a\xa8\xdf\x4e\x55\x86\x3e\xfc\xa1\x46\xd5\x6d\xe6\x52\x67\x99\xef\xdd\x8e\x16\x72\x2b\xb7\x09\xfa\x06\x61\xb4\x64\x14\xdc\x10\x41\xdf\x57\xe2\x26\x28\x76\xdc\x20\x5c\xa9\x8f\xd5\x83\xab\xc4\x27\x9c\xad\x1b\x2f\x54\x74\x1d\xaa\x25\x4e\xfd\x38\x22\x2d\xba\x17\xd8\xdc\x3d\xc8\x59\x00\x8a\x4f\x33\xcc\xc8\x09\x8a\x0f\xcc\x85\x67\x37\x7c\x69\xe0\x94\xd5\x16\x5b\x78\x3e\x61\xbd\xd7\x03\xbf\x16\xb3\x1e\xfd\xe4\xe3\x6b\xb0\x68\xfe\x70\xf1\x7c\x00\x5b\x91\xaa\x7b\x92\x6e\x3d\x4c\x87\x16\xdc\xed\x6b\xb8\xb4\x00\xc8\x8c\x84\xb4\xa8\x21\xe2\xab\x8d\xe3\x7c\x78\x7e\x0a\x03\x7b\xcb\x6d\x0e\x7f\x78\x89\x1e\x02\x85\x53\xe1\xce\x5b\x0d\x11\x05\x7b\x37\xfe\xed\x9a\xbc\xb1\x7a\xd3\x7f\x0f\xfd\x90\x28\xfe\xe2\xeb\x81\x9d\x40\x38\x3c\x3f\xc5\x27\x4e\xa0\x25\x2e\x57\x4b\xd2\xb5\xec\x42\x96\xe9\xb8\xe0\xa5\x5d\xa2\xf3\x62\xd4\x78\x5a\x28\x8a\x1c\x80\x1c\x83\x86\x86\xfb\xb4\x50\x8b\xaf\xc6\x1a\x01\xf9\x7c\xe0\x85\x22\x67\xb7\xae\xcc\x43\xa3\x48\xdf\x12\x4d\x7f\x35\x28\x12\xb7\xd0\xf1\xbe\x8b\x47\x41\x91\x34\x66\xc4\x1f\x4b\x2e\x3b\x1e\x6f\x9a\xe9\x2c\x28\x66\x41\x87\x26\x7f\x93\x8e\xeb\xc6\x82\xce\x06\xc6\xbf\x1b\x69\xc4\xe4\xcc\x09\x38\xad\xc6\x54\xad\x1e\x9c\xe3\xa4\xf7\xf9\xbc\x4f\x34\xe4\xdd\xd1\x45\xf7\x67\xfc\xac\x78\x80\x70\xd6\xd9\x9e\xd2\x0a\xcf\x3f\xde\xbb\x8f\x69\xaf\xb7\xf8\x77\xe1\x96\x09\xfb\x71\x21\x54\x2c\xfc\x62\x87\xf8\x28\x08\x61\xa9\x52\xb7\xf8\x20\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\x35\x7f\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xb8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x60\xb0\x4b\x64\xa9\x4d\xc9\x4f\xd8\x7a\x8e\x9b\x4e\x79\x72\x75\xc3\xcb\xd4\x40\xfd\x3a\xb7\x12\x5b\x1c\x8e\x1a\xc3\xee\x45\x73\x70\x4f\x6f\x68\x0a\xfb\xc1\xb8\x35\x22\xb4\xb2\xab\x1f\xc3\x78\x65\x75\xce\xad\x4c\xc0\x6d\x23\x67\x91\x27\x3e\x0f\x2d\x20\x42\x24\x15\x39\x3b\xc8\x0a\x7a\x0d\xb0\xe0\x4a\x2c\xb3\xb0\x37\x9a\xc9\xdc\x69\x60\x1c\x5a\x3f\xcf\x42\xb5\xba\x8f\x19\xbc\x6f\xa6\x4e\xcd\xfc\x11\x02\x35\xd1\x5d\xe8\x10\x72\xa6\xba\x81\xe1\x43\x54\x20\xb8\xc3\xa9\x2c\x7b\xd4\x52\x90\xe8\x37\x6e\x4f\xbb\xb9\x46\x5b\x75\xe4\x96\xe7\x46\x38\xbd\xcb\xbc\x77\xc3\x9a\xc9\xba\x19\xc9\xb9\xc2\xc2\x5d\x69\xbc\x0b\x81\x32\xb1\xf7\xd2\x52\x17\x05\x39\x03\xf3\xfd\xf6\x8c\x20\xf6\x56\x5e\x0b\x03\x71\x67\x9f\xdb\xed\xc8\x30\x17\x4a\x94\xdc\x82\x27\x9f\xe0\x08\xe1\xe4\xb6\x1f\xd1\x38\x30\x13\x04\x65\xd9\x67\x6f\xa8\xc1\x7f\xd8\xb8\x21\x53\xfc\x4e\x8a\x29\x7a\x16\x49\x37\xdd\x6a\x94\xef\x1d\x66\xab\x51\x6e\x35\xca\x0e\xd7\x56\xa3\x6c\x5f\x5b\x8d\x32\xbe\x42\x32\xf2\xb0\xda\x64\x5d\x5d\x10\x25\x7e\xc4\xa9\x54\xf5\x0d\xb7\xb9\xfc\x4e\x67\xec\xb5\x48\xf4\xb5\x28\x51\x88\x9c\xbc\x2b\xb8\x72\xba\xd2\x73\x2e\x33\x27\x42\xbc\x28\xa9\xdd\x1b\xd0\x47\xa7\xe9\x62\x8f\x3c\x4a\x61\x3d\xe8\xb0\xe6\x34\x29\x42\xba\x70\xf7\x53\x20\xbf\x28\xc5\xb5\xd4\x95\xf1\x09\x5f\x95\x45\x66\x61\x2c\xe9\x33\x0b\x39\x0f\xed\xee\x42\x3a\x46\x29\x12\x5d\xa6\x35\x64\x95\xb1\xdc\x56\xa6\x59\x43\x9a\xa0\x4f\x7b\x38\x77\x66\xa0\xe3\x03\x92\x9e\x43\xca\x19\xcc\x98\x1b\xfc\xbc\xee\xbe\xc0\x4c\x3c\xfc\x70\x4a\xdb\xd0\x27\x07\xd6\x89\x89\x4e\xf5\xad\xac\x88\xb6\x2b\x6d\xac\x7b\xaf\x61\x03\x8f\xe6\x00\x9b\x87\x8f\xc3\xb0\xe3\x3a\x17\xb0\x73\x7f\xc4\xf8\x1a\x70\x35\xd9\xe0\xc0\x29\xf1\xf5\xe8\x52\x07\x9b\xd7\x60\x55\x0b\xec\xa3\x54\x2e\xb0\xe1\xab\x17\xd8\xc7\xaf\x60\x60\xa1\xa2\x6c\xf8\x73\xff\xda\x57\xb8\xb5\x4e\x3e\x89\xa5\xf7\x9d\xfc\x06\x94\x5a\x18\x47\x1a\xa6\x73\x69\xad\xf0\x09\x24\xe1\x24\x83\xc3\x3f\xae\xf0\x21\x9e\x03\xbe\x04\xcc\x12\x11\xef\x42\x0f\xa9\x48\x57\x05\x8d\xf3\x46\x1a\x30\x90\xb8\x72\x76\x2d\x22\xda\x02\xef\x18\x53\xba\xaf\xb7\xd5\xb7\x7c\xa8\xff\xb8\x5b\x3e\x14\x5f\x5b\x3e\xc4\xa0\x1b\x57\x06\xc5\x23\x83\x2a\xc6\x7e\x50\x82\xd2\xe1\x53\x91\xb1\x7f\x57\xa2\x5c\x32\xa7\xe8\xd6\x69\xa6\xd0\x6e\xcb\xc8\x94\x12\x35\xc9\x31\xd9\xd7\xba\x7c\xa0\x3a\x1e\x38\x4e\x4f\xde\x39\x3b\x01\x10\x10\x06\xe7\xfa\xed\x07\x34\x81\x8c\x70\x15\xc2\xca\xc4\xd6\x01\xe6\x88\x34\xec\x05\x67\x2a\x1c\x9e\x1d\x0f\x69\xea\x0f\x91\x3e\xc0\x86\x4b\x21\x60\x2b\x2e\x99\xf7\x90\x08\x49\x19\xbe\x01\xc1\x16\xd2\x3c\x82\xa3\x91\x5d\x89\xe5\x88\xb2\xa9\xa8\xd7\xa2\xbf\x19\x13\x13\x9b\x0d\x5f\xfa\x01\x05\x36\xaf\x81\x25\xd0\x90\xbe\x41\xbc\xfa\x36\xf8\x68\x8e\xe5\x89\x3b\x8c\x50\x1c\x58\xc8\x0e\xd0\x08\x24\xbe\x6e\x6b\x0a\x82\xbb\x15\x7a\x08\xf8\x6a\xa9\xb0\x41\xa1\x42\x0c\x38\xec\x30\xdb\x8b\x0d\xed\x9e\xc2\xcb\x2f\xe3\x47\x22\x56\x38\x82\x8d\xb2\x9c\x2b\xb1\xdc\x35\x84\xa5\xa1\x95\x59\xc8\xc2\x77\x89\x04\x3e\x49\xa7\x92\xfd\x00\xf9\x6f\x7e\x08\xe4\x88\xa7\x6a\xc4\xce\xb4\x75\xff\x39\x81\x84\x5e\x8c\xb1\x68\x61\xce\xb4\x85\x4f\x1e\x34\xb9\xf1\xd5\x3e\x12\xb1\x29\x44\x23\x21\xc4\x82\xa9\xeb\x50\xbb\xea\xd3\x3c\x81\xa8\x94\xcb\x13\x16\x46\x1a\x76\xaa\x98\x2e\x3d\x55\xad\x6f\x7c\x65\x68\x08\xef\xbd\x8e\xa2\x61\x6b\xc6\xa0\xc5\xd0\x65\x63\x2d\xde\x33\x5c\x08\xac\x49\xff\x0d\x78\xb7\x21\x12\x19\x72\x53\xa1\xf9\x12\xb7\x62\x2e\x13\x96\x8b\x72\x0e\xb8\x2b\xc9\x62\xe8\x25\x1e\x4a\x2e\xe2\x35\xa0\x74\xc4\x6b\xd0\x7d\x08\x2a\xca\x0b\xc8\x3a\xfe\x38\xea\x0f\x8e\x8d\xe2\x3a\xe7\x85\xdb\x82\xff\xc7\x49\x65\xd8\x05\xff\x17\x9a\xbb\x99\x09\x3b\x64\x46\xaa\x79\x26\x1a\xdf\x91\x3f\x33\x1e\xc6\x8d\xe0\xec\xd7\x7f\x57\xf2\x9a\x67\x02\xab\x04\xb8\x0a\xad\x57\xf4\x6c\x45\xe9\x1a\x51\x87\x37\xc7\x97\x43\x0c\x7e\xe7\x4a\x2c\x77\x46\x2b\xdb\x76\xe7\x54\xed\xd4\x10\x4e\x8d\x8d\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\x66\xec\x60\x7b\x92\x5c\xce\x47\x19\x37\x66\x08\x34\x99\x56\x41\x78\x6b\xf4\x75\x8d\x25\x2e\xa2\x7b\xea\x92\x70\xaa\x40\x19\xdc\x8f\x0e\x15\x90\x43\xe5\x03\x0f\x40\xff\x6b\xea\x67\xdd\x17\x86\x6e\x2d\x14\x38\x80\xb0\xf9\x0a\xd9\x06\xa2\x42\x9d\xa6\x73\x0b\xc5\x7f\x80\x88\x88\x9e\xb1\xe7\x75\xc3\x08\x69\xc0\x45\x25\x7d\xcd\xac\xd2\x96\x49\x95\x64\x15\x05\x43\xe0\xa7\xe0\xe0\x1a\xc6\x80\x1d\x8c\xbc\x83\x6f\xec\x7a\x58\xbf\xa3\x7d\x4a\xd1\x4a\x21\x54\x3b\xfb\x03\xf2\x6d\x42\x36\x05\x52\x7b\x93\xd4\x9a\x75\x2a\xf9\x68\x36\x3a\x49\x9a\xfa\xe5\x73\x39\x2d\x05\x3b\x5a\x70\xa5\x44\x16\xa1\xc8\x90\x33\x94\x5b\xcb\x93\x05\xc6\xec\x38\x73\xe7\x38\x13\x76\xd7\x60\x83\xfe\x9c\x27\x0b\xa9\x02\xae\x82\x0a\x68\x4a\x75\x5d\xd9\x06\x5a\x03\xf5\x35\x90\x06\xec\x2a\xb3\x4b\x6d\x65\x68\xdf\xc5\xfd\x5c\x9a\xdd\x66\x6a\x80\xf2\xf6\x3d\x35\x52\x3f\x9d\x79\xa0\x3c\xca\x65\x68\x7d\x02\xf7\xbe\xbf\x5f\x4d\x1e\x1c\xda\x52\xcd\x44\x59\xe2\x0a\x4d\x05\xfd\xa0\xd5\x63\x76\x42\x4d\x2c\x16\xfa\x86\xa5\x9a\xdd\x40\xb7\xd5\x6b\xa7\x40\x40\x2a\x92\xf1\xaa\x47\x34\x53\x48\x0c\x4c\x74\x5e\x94\x3a\x97\xc6\x97\x3f\xd2\xf6\xd8\x18\x60\x4a\x56\x75\xc6\x9c\x6d\xae\x62\x56\xa9\x66\xb3\xc7\xe7\x47\xcc\xf2\x72\x2e\xac\x7b\x06\x53\x55\x3e\x15\x3d\x71\x61\x36\x8d\x4a\x3e\x68\x17\x90\xdd\xd0\x06\xa4\x41\xb5\x0f\xf4\xf7\x60\xaf\xfd\xaf\x20\x81\x10\xd2\x14\x67\xba\xa4\x64\xcb\xf0\x25\xc1\xd0\xbb\x5d\xf8\x03\x09\xce\x4a\x59\xd3\x13\x15\xbe\x4f\x7f\x10\xdc\x0a\x3f\xfe\x78\x36\x0c\xac\xfb\x6e\x3d\xde\x6d\xbb\xee\x46\x97\x59\x7a\x23\x53\x54\xce\x0c\xdb\x73\x37\xef\xf7\xa3\xc0\x06\x51\xde\x7b\x9f\xf4\x9b\x1b\x99\x0e\x44\x7c\x18\xaa\x49\x74\x9f\x47\xed\x88\xce\x80\xea\x32\x15\xca\x3a\x66\x59\x1a\xb6\x07\xbf\xd8\x67\x27\x12\x2b\xf1\xe1\xf7\x00\xa2\x9a\x4f\xa5\xaa\x51\x1e\xea\x45\x75\xe2\xd2\xf1\x0d\x6f\xde\x1b\x61\xb1\x86\x1a\xca\x90\xb5\x5d\x30\x23\xf3\x2a\xb3\x5c\x09\x5d\x99\x6c\xd9\x73\x6b\x3f\xd6\x85\x9d\x65\xe2\x1d\x9e\xf0\xfe\x4a\x4f\x18\xaa\xa9\xfc\x40\xa2\x6d\x0d\x9c\xb2\xa2\xfd\xd4\xa9\xe0\xe9\x41\xd0\x84\x02\x10\x80\x78\x27\x12\xaa\x11\x2b\xb2\x6a\x2e\x3b\x15\x05\x6f\xfb\x20\x76\xfa\xf5\xdd\xfa\x20\xd6\xed\xde\x2a\x23\x6a\xe4\xb2\x7e\x7d\xc8\x1f\x60\xdb\xc2\xcd\xea\x97\x97\xeb\x5b\x16\xa6\xa2\x10\x2a\x05\xe8\xf4\xe7\xf5\xf9\xc3\xc9\x6f\x8c\xf6\x04\x59\x3e\x8c\xac\xf0\xf8\xe7\x0d\x29\x1d\x25\xde\x2f\x74\x96\x1a\x26\xde\xd9\x92\x3b\x71\x90\x3b\xc6\x1f\x7e\x33\x63\x5c\xf5\x65\xed\x9f\x4b\xe3\x2d\xf6\x89\x34\xd0\xf4\x33\xd5\x40\xcd\xa0\x1d\x39\x77\x4d\xdc\x87\xb3\xa6\x5e\xe3\xe3\x81\x9b\x73\xa2\x00\x25\xee\x60\x9a\x75\x68\x6b\x9a\x68\xd2\x53\x9a\xf5\x2f\xfd\x9a\x69\x9a\x35\xad\xf5\x5a\xb3\xda\xe0\x61\xdd\x76\xd6\x7c\x5c\x9d\x35\x67\x00\xf7\xd4\x1f\xfc\x98\xc6\x69\xf9\xec\xe8\x43\x52\x5b\xef\xe2\xa3\xa3\x13\x15\xc9\x64\xe8\x94\x43\x03\x11\x6c\x02\x33\x6e\x35\xea\xe2\x88\x4a\xa9\x6e\xdc\x7c\xd3\x7d\x07\xb9\xe5\x46\xd8\x3e\x9e\xe4\xa6\x82\x59\x8f\xe7\x58\x4e\xbc\xf3\xe9\x2b\xec\xde\x09\x85\x9e\x1e\x02\x89\x8d\xff\x46\xba\xa8\x6a\xdc\xe9\xb4\x50\x4f\x77\x0f\x8e\x2c\x42\x66\x19\x8e\x91\xba\xd5\x4e\xb8\xed\xd9\x90\xbe\x87\x34\xa6\xd9\xbe\x79\x73\x7a\x3c\x24\x09\xdd\x78\x5e\x5b\x85\x7f\x37\xc9\x48\xbb\x14\x00\x74\xe5\xbf\xab\xd8\xd0\x06\xe8\xc6\x40\x38\xba\x7f\x13\xd4\x99\x27\xa2\x0e\x13\x1c\x4b\x73\xd5\x1f\xe0\x7c\x65\xc8\xe6\x71\xff\xf6\xe8\x84\xd1\xa7\x77\xf2\xce\xdf\xc7\x3d\xdf\x17\x15\x7b\x9e\x88\x3a\x70\x97\x4a\x73\xb5\x01\x70\xf4\xbe\x36\x70\x91\x9e\x75\xab\xe3\x7c\x98\x91\x86\xb6\x85\xe7\x61\x54\x23\x7c\xdf\xa5\xae\xd8\x0d\xc1\x08\x92\x85\x78\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x86\x56\x7b\x28\xa7\x6f\xdd\xd9\x5e\x04\xa4\x46\xf3\x6c\xb0\xa8\xc4\xd0\x3b\xf5\x73\x09\x73\x14\xbc\xb4\x60\xc8\x0d\xb3\x91\xc2\x70\x9e\x4f\x47\x1f\xa8\xbb\xec\xa4\xd3\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\xb9\xbd\x13\x81\x8c\xc6\xbb\xe5\x79\x00\xf6\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\x4f\x77\x26\xec\x42\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\x62\xd7\x0f\x08\xd9\x2c\x4f\x76\xd8\x9e\x2e\x61\xe4\x84\x2b\x96\x09\x8f\xb9\x40\xa7\x7a\x89\x76\xc7\xfe\xc3\x60\x91\xec\xc1\x44\x8a\x90\x5b\x0e\xb4\xd7\x52\xaf\x53\x91\xbc\x6f\x80\xd6\x1e\xd7\x02\x4f\x2a\x27\x05\x27\xec\x0d\x89\x2f\xd2\x0b\x70\x33\xc0\x61\xf6\x77\x3c\xac\xc5\x7a\x78\xfe\x90\x4e\x9e\x8d\xd5\xd0\xdd\x43\x23\x74\x57\xef\xc9\x5c\xda\xd7\xa2\xd0\x03\xe8\x70\x38\x50\x2b\xbe\x20\xad\xfb\x40\x1b\x09\xed\x69\xb8\x65\x1c\x59\x52\x52\x65\xdc\x19\x75\x18\x5d\x98\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\xd8\xb7\x34\x92\x8c\xed\x80\x09\xbb\x8c\x71\xa7\xa3\x8a\x36\x02\xf7\x0d\xcf\x1a\x11\x8b\xe5\xaa\x6e\x9c\x01\x38\x9c\x5c\xb1\x53\x25\x6d\xdd\x32\x0c\xeb\x02\x32\xad\x28\xd3\xdf\xfd\x9a\xa2\x1b\x73\x89\xf9\xa8\x8a\x06\x73\x5f\x37\x47\x83\x13\x8a\x0d\x76\xc2\x54\x3a\x39\x48\x36\xac\xfc\xd5\xcb\xb3\x09\x43\xd5\xf7\xc2\x19\xc6\xc6\x0a\x7d\x90\x3c\x0c\x04\x46\x8b\xeb\xcf\x51\xd8\x86\xb6\x8f\x1e\x58\x57\x97\x8d\xae\x8c\x93\xc9\xee\x84\x39\x31\xbe\x3b\xd9\xf5\x2a\x5f\xb6\xd2\x3a\x34\x0c\x1a\xe3\x97\x37\x37\xfc\x84\xb1\x57\xbe\x6c\x12\xc0\xa7\xd6\x77\x21\x45\xfc\xc5\xa8\xe7\x64\xeb\xd8\xf8\xd2\xfd\x6a\x1a\x3f\x94\x00\xcf\xe7\xf2\x5a\x28\x7c\xb1\xcd\x71\x6a\x3f\xd5\x41\x96\x31\x7e\x73\xb2\x94\x5f\xbf\xd8\xdc\xbb\x21\xc7\x19\xe8\xcd\x88\x7d\xd1\x7b\x25\x3a\xcf\x11\xa1\x7b\x11\xc0\x64\x6a\x3c\x98\xc0\x1d\x37\x62\xe5\x23\x2e\xf9\xac\xd3\xc1\x6e\x49\x06\x3f\x54\xcb\xaa\x0f\x1f\x53\x79\xb3\xaa\xcd\xa9\xfb\xf7\x31\x23\x60\x7c\xe3\x41\x56\x49\xcc\x1e\x84\x87\x1f\xbc\x3e\x39\x3c\x7e\x79\x32\xc9\xd3\x47\xc8\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\xb2\xf7\x30\xed\x61\x74\xb8\x30\x9c\x3f\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\x76\x97\xd5\x85\xce\xf4\x7c\x7d\x03\xb4\x7b\x6c\x9b\xdf\x21\x42\xee\x98\x8f\xdd\x7e\xdc\x9c\xb1\xdb\xbd\x8f\x72\xdb\xce\xc5\xbe\xc9\x8e\x90\x35\xb5\x82\xdd\x08\xed\x8e\x3f\x03\x82\x7d\x42\x33\x62\x85\x8a\xe8\xce\x01\xf6\xe6\x9b\x50\xd4\x5d\x1d\xa2\xee\xea\x77\xb5\x2f\x36\x43\xfc\xae\xa6\x85\xe3\xe4\x5d\xdb\xf8\x37\xa9\xee\x47\x6a\x0a\x90\xa2\x14\xe3\x00\x9b\x0d\xed\xbd\x75\x19\xa9\x65\xb1\x3c\xf1\x9e\x60\xef\x37\xc6\xbb\xb2\x65\xdb\x23\x5c\x6b\xf2\xc1\x11\x8f\x58\x84\x59\xb6\xac\x5b\xa3\x90\x37\x8c\xcf\x11\x0e\xbb\xa4\x80\x5c\x51\xca\x6b\x99\x89\x39\xb4\x3d\x92\x6a\x1e\xc1\x38\xc5\xc0\x4f\xd4\x06\xa9\x19\x9c\x7a\xe9\xfe\x8a\x5a\xef\xc1\xce\x3a\x7b\x75\x09\x1d\xb4\x20\xa5\xa2\xb7\xc1\xe9\x1e\x08\x67\x7e\x3c\x1e\x83\xeb\x6f\xef\x5f\xce\xf2\x49\xb3\x7d\xf6\xa3\xa0\xe7\x68\x68\xf1\x55\x42\x9b\xfb\x85\x0e\xfd\x96\x60\xae\x35\x65\x61\x43\x63\x1a\x1f\xdd\x75\xe0\xee\x74\x1a\x35\x8a\xf2\xc6\xfd\x52\x00\x64\x77\x9d\x67\xf0\x18\xad\xa4\x0d\x09\xd0\x81\xb9\xbd\x0f\x36\xad\x3b\x23\x21\x7d\xc0\xcb\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xe2\x67\xda\xed\x63\x2c\x67\x96\xea\xca\x9f\x9a\x52\xf0\xec\x76\x89\xd1\x65\x8f\x6e\x4c\x5a\xd8\xc1\xe2\x11\x10\x2f\x70\xdc\xe2\x3b\xcf\xbc\x28\x01\x2c\x66\xf5\x3b\x3b\x8f\x9a\x62\xd2\x24\x46\xf6\x67\xef\x30\x4c\x83\xb7\x2b\x76\x7a\x71\x74\x71\xfa\x49\xa3\x7e\xb7\x09\x57\x98\xdd\xa3\xb6\x1e\xe4\xbf\xbb\x65\x55\x8d\x59\x56\x75\xfd\x25\xba\x5e\xce\x75\x69\x79\xb6\x01\xc6\x99\x2c\x78\x71\x58\xd9\xc5\xb1\x34\x80\xd6\x38\x8c\xfa\xb7\x32\x6a\x54\xaf\x88\x7d\xe8\x7c\xc3\x0d\xe9\xb7\x2f\xdd\x77\xf4\xdd\xe1\x39\xe3\x95\xdb\x8f\x96\x5a\x0c\x6d\x2c\x59\xce\xbf\xc5\x05\xd6\x40\x0f\x4a\x19\x1a\xf3\x03\x74\xf1\x77\x3d\x24\xaa\x7c\xba\xaa\xb7\x6d\x3c\x1a\x24\x17\x72\xfd\xcf\x24\x06\x2d\x95\xb4\x92\x5b\x5d\x0e\x16\x1b\x6c\x8c\x18\x1c\x86\x95\xb1\x3a\xa7\x53\x74\xea\xef\x80\x84\x2c\xd0\xdf\x56\x7e\x54\x7b\x13\xc1\xfa\xfc\xff\xd9\x7b\xd7\xee\xc6\x6d\x6b\x61\xf8\x7b\x7e\x05\x96\xdb\xb5\x6c\xa7\x92\x3c\x93\xf6\xa4\x3d\xf3\xf6\xb4\xcb\x19\xcf\xe4\xf8\x64\x2e\x7e\x6c\x27\x59\xcf\x93\xc9\x69\x20\x12\x92\x50\x93\x00\x43\x80\xf6\xa8\x97\xff\xfe\x2e\xec\x0d\x80\x20\x45\x49\xa4\x44\x5f\x26\x21\x3f\x24\x63\x8a\x04\x81\x8d\x8d\x7d\xbf\x00\xcc\xcf\x85\xd1\x15\x69\xc4\x6a\x69\x36\x23\x68\xfd\x83\x63\x73\xff\xcc\x9f\xad\x11\x1d\xaa\xd8\x27\x7f\x79\x51\x69\x8e\xb9\xd2\xc1\xd8\x59\x31\xcb\xf6\xb8\x8f\x66\x95\xe6\x3f\xf7\x43\xda\xf8\xcf\xa2\xe6\x4f\x40\x10\xfd\x9f\x82\x26\x08\xda\x77\x8f\x69\x7c\xaf\x6e\x69\x3f\x2b\xae\x62\x89\x5d\x7c\x89\x12\xef\xbc\xb5\xad\x50\x58\xa3\x1f\x21\xa2\x73\x2a\x94\xc1\x93\xaa\x3d\xe3\xd0\x06\x40\x1c\x92\x23\x1d\x65\xc7\x8f\x06\xa9\xbe\xd2\x61\x93\x42\x84\xc2\x2a\xae\xfd\x1a\x51\xe3\x8d\x4f\x87\xdd\x6f\x99\x8f\x1e\xe4\x00\xa7\xbd\x1f\xbb\xad\x1d\xcb\xe3\x51\x08\x2f\x14\x10\xc9\x1b\xae\xb4\x6b\x20\x0c\x37\xb8\xb2\xbd\xd6\x40\x17\xb8\x20\x32\x27\x3c\xfb\x1b\x8d\xe3\xfc\x05\xca\x11\x56\x57\x85\x7f\x2b\x5f\x0e\x9f\x0a\x1f\x6d\x73\xa4\x97\x99\x6d\xe2\x71\xfd\xf2\x82\x60\xa3\xf0\x3f\x7d\xf9\x0c\xf4\x82\xdf\x7f\xf1\xe5\xb3\x3d\x11\xf1\x53\xcd\x2a\x24\x7d\xdb\x44\x7b\x8f\xac\xf8\x85\x64\x91\x54\xb2\x45\x0c\x2c\x40\xda\xbd\xc2\xe4\x0c\xc3\x27\x2d\xd1\xc4\x83\x60\xb0\xd2\x73\xef\x3e\x65\xe2\x21\xeb\xe2\x57\x94\x75\x41\x7c\x36\x3e\x12\xd6\x5e\x10\x39\x1c\x10\xca\xea\xac\x12\x70\xa4\xdd\x17\x9f\x0a\xed\xde\x11\xba\xbb\x62\x72\x15\x83\xc3\x10\x3f\xd7\x3a\xbf\x4c\x4f\x3d\x7b\x77\xf5\xb7\x37\xa7\x5f\xbd\x7a\x03\x6b\xb5\x51\x81\x06\x3d\xad\x26\xb4\x4b\xcc\x7a\x7b\x74\xdf\xdd\xb8\xb5\x2b\x48\xfb\x08\x30\x10\xb5\xd0\x02\x41\xde\xbd\xbe\xea\x1a\x55\xb0\xaf\x3a\x2b\x66\x7b\x40\xef\x53\xf3\x6b\x40\xa7\x75\x96\x3f\x4e\xe6\x7c\xcf\x4e\x91\xa0\xec\x7d\xc5\x8e\x62\x70\x08\xd7\xb8\xb7\xa9\x63\x47\xdc\x20\x4f\x4e\xd6\xdb\xec\xff\x36\x10\x43\x28\xf6\xee\xf9\x7e\x50\x68\xef\x27\x43\xe6\x7d\x95\x75\x38\xc4\xb1\x9c\xf8\x68\x48\x18\xf2\x8e\xdc\x70\x55\xc3\x4f\x99\xf2\xdd\x98\x7f\x01\xd8\x9a\x35\xb5\x1e\xdc\x9f\x3b\x34\x0e\x6b\x7b\x70\xbb\xd6\x4b\x41\x54\x41\x25\xaf\x7b\x5d\x03\x4f\x17\x91\x49\xad\x21\x4c\x65\x34\xea\xb5\x21\x7c\x79\x0b\xef\x40\xe9\xbd\x4f\x91\xc1\xc0\xc4\x1f\x29\xbd\xcc\x7f\xbb\x9f\xe3\xe8\x87\xab\x57\x5a\xe9\x84\x25\xae\x7d\x79\x26\x5d\x25\x9d\xb0\x24\xcb\x93\x44\x21\xf2\xe4\xf8\x90\x67\x43\xdf\xef\x68\x6e\x78\x4c\x53\x43\xb6\x90\x5a\x8a\x9e\x73\x68\x9b\x06\xad\x12\xb6\x0b\x78\xe2\x25\x66\xba\x27\x2c\x0f\xe8\x2d\x66\x10\x79\xb7\xba\xd1\x3c\x1c\xeb\x96\xc2\x39\xd8\xab\xee\xf5\x4f\x8f\x12\x65\xf1\xf9\xd9\x23\x10\xa1\x5f\x5a\xb1\xa3\xae\x6e\xc2\x47\x0b\x94\x8d\x7b\xca\xdc\x37\x03\x39\x98\x9f\x9f\x59\x75\xc1\xa5\xe5\x2b\x7b\xac\xc8\xfa\x73\xf5\x28\xa2\x94\xcc\xf5\x9d\xcc\xfb\x2a\x1f\x57\x1d\xae\x16\x85\x69\x7f\x5b\x29\xc6\xf1\xcb\xa4\x22\xb8\xca\x4f\x9e\x92\x5c\x01\x25\xa9\xb5\x41\x5d\x47\x51\xee\x83\xa0\x7c\x3a\x84\xe4\x7e\x04\x97\xfb\xad\xc4\xf5\x68\xea\xaf\x3b\x1e\xbd\x00\xcb\x0d\x66\xcd\xa0\x06\x51\x4a\xba\x4b\xc1\xdc\x1c\x50\x9e\x47\xa1\xb3\xb9\x34\x74\x68\x37\x72\x52\x25\xb1\x6e\x24\x74\x0e\x62\xdb\xc6\x24\x31\x3b\x2b\x45\xd8\xf0\xd1\x16\xeb\x1a\x11\xec\x99\x98\xd2\xcc\x36\xcd\x8f\xe5\x9d\xb8\xa3\x79\x4c\x4e\x2f\xce\x1f\x9e\xae\xee\x9d\x09\x8a\xe7\x61\x9f\xde\x02\xd5\x5c\xd0\x72\x3c\x88\xc0\x87\x20\x21\xf3\xc7\x94\x6b\x85\xa1\xfc\x10\x8c\xaf\x43\x6b\x94\xe1\x53\x3e\x92\xc5\x50\x3a\x43\xd5\xec\x48\x81\x58\x25\x88\x8c\x34\x4d\x5c\x23\x66\xa6\xef\x18\x13\xe4\xd9\xb3\x67\xe8\xa0\x78\xf6\xc7\x3f\xfe\x91\x40\xd7\xcd\x98\x45\x3c\x5d\x7d\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9e\xbe\x7d\x43\x68\x04\xba\x1c\x56\xbe\xc5\x91\x61\x3f\xc3\x97\xd5\x88\xfc\xcf\xd5\xfb\x77\x8e\x7d\xa9\xda\xaf\x80\x2e\x7e\x79\x13\x72\x16\xc4\xde\x87\xce\x03\xaa\x17\x00\x0d\x21\x35\xa1\xb3\x19\x22\x1c\x50\x6e\xae\x1c\x31\x71\xb5\xe7\xf8\x7c\xe1\x3a\xd1\x1b\x54\x4b\x20\x29\x80\x9b\x29\x82\xc3\xc6\xd5\x71\xc4\x1c\x07\x18\xcb\x33\x11\x98\xca\x88\x24\xfc\x86\x91\x99\x82\x7e\xf4\x65\xe3\x94\x9c\x29\xa3\x80\x45\x54\x98\xd1\x71\xb0\x72\x67\x14\xdb\xb3\x36\xe6\x63\x47\x4e\xec\xd9\xb9\xbc\xea\x42\xb6\x67\xde\xb5\x10\xb3\xbd\x01\x5d\x8e\x16\x92\x0c\xb3\x0b\x9f\x6a\x24\x43\x65\xb5\x17\x7e\x3d\x88\x54\xb6\xfa\x61\x49\x19\x69\x22\xc5\x3c\xc4\xc1\x52\xfa\x70\xc1\x94\xcb\x8c\xed\x0a\x8c\x9e\x1a\xea\xf4\xd3\x9e\x0e\x89\xfb\x5b\x9a\xed\xd7\x09\xa4\x1a\xa3\xeb\xc6\xac\xd4\xa1\xa4\x53\x59\x68\x17\xb3\x67\x7f\x87\xf2\x6d\x5a\x3a\xd0\xef\x35\x85\xde\xba\x14\xf5\xd7\xf7\xaf\xa7\xa6\x5b\xd5\x98\x39\xe0\xda\x55\x91\x75\x44\x18\x8d\x16\xe4\x86\x2d\xc7\xc8\x01\x32\x0a\xd5\x23\x00\xda\x67\x06\xc6\x95\x36\xfc\xde\xf2\x1c\x1b\x6d\xd2\x6e\x85\x0b\xb0\x0c\xe4\x03\x57\x7d\xc2\x29\x5c\xca\xca\xe5\xb6\x95\x95\x08\x2c\x94\xae\x77\x65\x24\x85\xb6\x7d\x31\x7d\xef\x2a\x08\x18\xad\x15\x24\x30\x14\x86\xc5\xe6\x35\xb5\xe9\xcb\x65\x54\xa9\xe1\x28\x56\xfe\x28\xc4\xca\xdb\x50\xcf\x1d\x62\x7a\x15\xb3\x95\x91\xa8\xeb\x89\x18\x44\xa6\x2e\x78\x04\x19\x47\xe6\x71\xfb\xac\x83\x92\x07\x44\xa5\x60\x82\x62\xba\xb0\xa0\x81\x38\x61\xf3\x6d\xa6\x14\xe1\xb0\xc2\x94\xe6\x37\xcc\x15\x1a\xa6\xc9\x84\x5c\x98\x49\xfa\x6a\xf3\xd8\x4a\xf0\x16\x13\x44\x0c\x8d\x09\x2b\x41\x98\x8f\x1c\x4e\x26\x87\xc8\x2a\x1b\xea\x42\xec\x8d\x35\x7d\x76\x91\xeb\xad\x7b\x5c\x05\x95\xdf\xd2\x4c\x61\x37\x3d\xa3\x5a\x40\xc7\x4a\x09\x75\x5b\xf4\xc2\x09\x13\x74\xcf\x12\xe2\xe1\xd5\x73\x1b\xb3\x7e\x3b\xa1\xf6\xd7\x07\x75\x0f\x5f\x7b\xf5\xea\xbb\xff\x69\x8f\xdd\x4f\xd7\xf5\x3e\xb5\x38\x64\x29\x49\x5f\x1d\x19\x7b\x6f\xb9\x99\xf6\xd0\xd8\xcc\x5d\x55\xd7\x11\xc8\xb7\x95\x5a\xd2\xad\x74\x11\x5b\x4a\x3d\x61\x9f\x94\xf2\x71\x3e\x03\x92\xda\x5c\xeb\x26\xd4\xcb\x1c\x87\x31\x10\x78\x7c\xad\x63\xdf\x2e\x7b\xee\xba\x8f\x36\xf5\xfb\xab\x25\xf5\x6b\x9f\x20\x9a\xfa\x55\x35\x64\x04\x65\x25\x3c\xab\x0d\xb3\x8f\x61\xab\xb4\x84\x6e\x9d\x25\x71\x98\x90\xb7\x96\x15\x23\x92\xd3\xa9\x92\x49\xa1\x7d\x25\x8a\x06\x3e\x0d\x83\xba\xde\x9e\x58\xb4\xc9\x3d\x16\x70\x6d\x90\x57\x90\x95\xf5\xc3\xc0\xf1\xea\x91\xf8\xec\x1b\x20\x8b\xd7\xaf\x2c\x4c\x16\xaf\x1e\x77\xc1\x89\x8b\x3d\xef\x84\x1b\xd6\x57\xef\x74\x19\x91\x15\xe9\x16\x62\x64\xb5\x42\xd1\xd9\x09\xaa\x98\x43\xb9\x6b\x05\xec\xf2\xda\xdf\xaa\x6b\xd7\x65\x0d\x8c\xa7\x17\xe7\x3d\x6a\xa5\xc1\xa8\x6b\xf4\xd2\xf0\x89\x41\x33\x6d\x73\x55\x00\x7c\x8e\x9a\xa9\x11\xe9\x9d\x01\xe9\xac\x84\xa8\x75\xe9\x19\xa2\xfc\x2b\x50\x6d\x56\x16\xfe\xda\x30\xa3\x30\x99\xab\xda\xa1\x03\x8d\xc1\x25\xdb\x0a\xba\x7a\xb8\x18\x1e\x20\x71\xbf\x7c\x35\xe8\x89\x2a\x2f\x00\xfd\x3d\x32\x76\xea\x57\x95\x8b\x5e\x3a\x20\x92\x2b\x96\x18\xa6\x47\x6a\x26\x9b\x4c\xc6\x2f\xb0\xe7\x37\x15\x42\x6a\xc0\x1b\x35\x22\x09\xf4\x23\x1f\xa1\x29\xc6\x48\xa0\x41\xf4\x57\x1e\x38\x4d\x7b\x96\x39\x7b\x43\x1e\xd2\x3b\x02\x11\x40\x22\x80\xdd\x45\x3f\x98\x44\xee\x01\x9b\xcc\x55\x8a\x2a\x7d\xb6\xe5\xaf\xe0\x95\x1d\xdf\x21\x91\x8a\x16\x2c\xa5\xd8\x8f\xc4\x01\xc8\xd0\xeb\xbb\x9c\x6b\xcd\xb0\xea\x38\xcb\x53\x45\xe4\x6c\x54\xf1\x1b\x1f\xdc\x3e\x3f\xe8\x4b\x9e\x25\xf7\xa1\x50\x13\x77\x42\x77\x2d\x03\xb6\xee\xaa\xfa\x0d\x2a\xca\x85\x39\x9d\xa0\x4d\x27\xd0\x20\x49\xd4\x0c\x96\x46\x88\xb8\x45\xf8\x3f\x69\xd0\xdd\x9f\x2d\x62\x57\x1b\xc4\xc8\x0b\xa6\x83\x0d\x62\xb0\x41\xf4\x31\xe2\xbd\xd9\x20\x02\xc6\xed\x88\x69\x83\x3d\x22\x4c\xc4\x73\x46\x89\xb2\x94\x45\x50\x26\xda\xa0\xbc\x33\x47\xc8\xbc\xea\x2b\x38\x9c\x4c\x0e\x0f\x9d\x91\xc2\x9e\x8f\x42\xcf\xc6\x7f\x22\x4c\x44\x32\x46\xa4\x32\xe3\xe7\x4a\x83\x50\x5b\x6a\xe5\xe1\x5c\x52\xf7\xad\xd0\xdf\x00\x63\xf7\x8b\x12\x3d\x52\x28\x17\x92\xf2\xfa\x5e\x45\xb0\x52\xf0\xf2\x65\xc0\x2c\x00\x7d\xb5\x44\x2b\x81\x95\x21\x32\x09\x4f\xb9\xad\x4f\x68\xc8\x05\x53\x5a\x91\x23\xbc\x39\x89\xb2\x62\x64\x1f\x98\xa4\x2c\x95\xf9\x72\xe4\x1f\x32\x3f\x56\xde\xb2\x4f\x1c\x83\xd4\x16\x15\x79\xce\x84\x4e\x96\xbf\x5e\xf9\xcd\x81\xf8\x09\x8b\x6f\x1e\x2b\xf6\xc9\xfb\x68\xba\xaa\x68\x59\x36\x11\x00\xeb\x9d\x87\x36\xf0\x21\x9b\x81\x31\x2a\x8d\x3f\xe6\x2e\x13\xb7\xe4\x96\xe6\x3b\x67\x60\x34\x5d\xf7\x22\xb1\xc5\xfc\x96\x2b\xb9\x73\x0e\x5b\xe3\x90\x21\xf0\xae\x2c\x53\x46\x1b\xb1\x2c\x74\x56\x68\xcb\x5d\xdc\xd9\x76\x25\xfb\xfc\x99\xae\x09\xbe\xcf\x0f\x7a\x9c\x5c\x46\xb5\x66\xb9\x78\x41\xfe\xf7\xe8\xc3\xef\xfe\x35\x3e\xfe\xeb\xd1\xd1\x0f\xcf\xc6\xff\xf9\xe3\xef\x8e\x3e\x4c\xe0\x1f\x9f\x1f\xff\xf5\xf8\x5f\xee\x8f\xdf\x1d\x1f\x1f\x1d\xfd\xf0\xcd\xdb\xaf\xaf\x2f\x5e\xfd\xc8\x8f\xff\xf5\x83\x28\xd2\x1b\xfc\xeb\x5f\x47\x3f\xb0\x57\x3f\xb6\x1c\xe4\xf8\xf8\xaf\xbf\xed\x71\x11\x54\x2c\xdf\xf7\x46\x82\xf1\x1a\xdf\x8b\x18\x51\x1d\xbb\x67\xd4\x25\xe4\xe3\xb8\xb4\x68\x8f\xb9\xd0\x63\x99\x8f\xf1\x23\x2f\x88\xce\x8b\xbe\x48\x57\xc9\xfe\xee\x8f\xc6\x94\x42\x4c\x59\x01\xd3\x29\x36\x4f\x90\x88\x60\x60\x6a\x8f\x96\x61\xdb\xc7\xb6\xd9\x28\x6c\x7f\x1c\xec\xc1\x6d\xae\x7b\x8c\x54\xb2\xf5\x6c\x7e\xe5\x61\x4a\x57\xb6\x9b\xf2\x10\xa3\xb4\x72\x0d\x31\x4a\xab\xd7\x10\xa3\xd4\xf1\x1a\x62\x94\xdc\x35\xc4\x28\x0d\xf6\xc1\xfd\xaf\x5f\xb9\x7d\x70\x88\x51\xea\x7a\x0d\x31\x4a\x3b\x5f\x9f\x50\x8c\x12\x0a\xf9\x4d\x91\x4a\x56\xcc\x2f\xc3\x94\x9e\x6c\x94\x92\x32\xf8\x10\xb1\xd3\x28\x92\x85\xd0\xd7\xf2\x86\xed\xe9\xc8\xad\xe9\xa4\x2b\xa3\x43\x49\xc4\x35\x3a\xea\xea\xc3\x4f\x52\x61\xed\x4b\x1e\xed\x41\x7e\xec\x4f\x72\xa4\x45\xcc\x8d\x8e\xda\xf3\x61\x71\xc3\x86\x65\xb1\x45\xcc\xe2\xf2\x07\x4b\xd2\xb4\xd9\xef\x09\x39\x25\x39\x8b\x78\xc6\x0d\x03\x80\x5a\x41\x70\x1f\x8f\x8f\xef\xe2\xcc\xb5\x62\xc9\xcc\x76\xb2\x15\x65\x9a\x73\x1e\xe8\x9f\x96\xa3\x34\x7e\x06\x65\x08\xe9\x7a\x8d\x12\xb5\x90\x45\x12\x93\x9c\xfd\xdd\x09\x1f\x76\x36\xd7\xe1\x08\xa1\x49\x15\x96\x52\x7e\xd6\x0e\x4e\x33\x6e\x8b\x8a\x3d\x25\x32\xc8\x3e\x66\x3c\x87\xc3\x76\xc5\x22\x29\xe2\xbe\x2d\x24\x2b\xe3\x97\xb2\x02\xf8\x85\x58\x4c\xe2\x02\x1f\x80\x74\x4c\x9a\xf0\x98\xeb\xa5\x8f\xe7\xc0\x63\x6f\xc4\x56\xec\x1d\x6c\x11\x41\x95\x1b\x41\x68\x96\xe5\x92\x46\x0b\xa6\x82\xaf\xa1\x10\x6a\x0b\x65\xf8\x2c\xcf\xa4\x98\x73\x81\x72\x28\xbc\x63\x84\x95\x64\x49\x72\xa9\x5d\x68\xda\x9a\x0f\x5e\x07\x83\xc1\xeb\x28\x71\xe8\x7c\x09\xf1\x6b\x32\x1c\x02\x67\xc5\x67\xe1\x1f\x8a\xc8\x24\x76\xa5\x59\xff\xf4\xcc\x08\xfe\x91\xc5\x62\xc3\x04\xa0\x68\xa6\x96\x24\x31\xc2\x93\x61\x0c\xeb\x5f\xfe\xe2\x0f\x64\x21\x8b\x5c\x4d\xc2\x62\x7f\xcf\xe1\x1e\x5a\x38\x9c\xe2\xa0\x49\xc2\xa8\xd2\xe4\xf9\x33\x92\x72\x51\x18\x8e\xdf\x13\xe2\xf5\x25\xeb\x06\x52\xee\x97\x7f\xd8\x73\xb4\x7e\xe4\xdb\xb5\x92\x6d\x86\x1d\xf3\xac\x78\x6b\xcf\x38\x16\xf4\xc0\xae\x99\x35\x61\xd7\xb2\xa4\x70\x17\x85\x96\x8f\x7c\xf2\x7f\x2e\xe4\x74\xa9\xf7\x2f\x61\x63\xc7\xa9\xd6\xae\xf9\x3f\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x1d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\x9d\x3a\x7c\x97\x35\x6f\x76\x78\x79\x5f\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf1\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\xdd\x0b\x58\xfb\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xe9\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x91\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xc7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x67\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x61\x22\x26\xdf\x2a\x07\xb8\x78\x29\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x1b\xbd\x53\x68\xd2\xcd\xf9\x6d\xc4\x9c\xec\x68\xde\x7b\xac\xc5\xdf\xee\x5c\xad\x8e\x34\x97\x8e\xb2\x6d\x4c\xf1\x14\x02\x4b\xf7\x9e\x4b\x28\x13\x4f\x13\x43\xe2\x96\xbe\xe6\x4f\x0d\xc1\xa6\x4b\xb0\x7b\x3d\x4a\xe5\xb1\x7c\xba\x7f\x4d\xa9\xc3\x7c\x1a\x57\x89\xd9\x25\x8d\xa5\x22\x5f\x25\x32\xba\x21\x67\x0c\x94\x86\xfb\x6c\xbe\x9f\x4f\xe3\x4f\xbb\x71\x66\x4a\xe7\xbb\x45\x8c\x8c\x49\x2a\x05\xd7\x32\xdf\x85\x1e\x3f\xa1\x42\x81\x43\x2b\xc3\x36\x15\xd3\xcd\x39\xfb\xa5\x34\x32\x34\x28\xdf\x0f\xea\xc0\x50\xde\x74\x02\x94\x07\x6f\x01\x51\xdd\x99\x8e\xfc\x66\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\x7c\xe7\x40\xa8\xbd\x01\x75\xc3\x96\x10\x55\xd6\x0b\xa8\xec\x60\x15\xcd\x5d\x4b\xb0\xb3\xc3\x7d\x23\xdf\x5d\x7e\x75\xf6\xad\x62\xf9\x24\xd4\x56\x4e\x98\x8e\x4e\x22\x96\x2d\x4e\xec\x08\x9f\x3c\x58\x1d\xd9\xec\x07\xae\x6e\x34\x14\x04\x22\x99\x24\xb6\xc0\x98\x9c\x91\x97\x2c\x5b\xf8\xcf\x3d\x0d\xb8\x7d\xca\x3d\xe5\x32\x29\xfb\x69\x37\x75\x68\x46\xaa\x92\x0d\xb8\x83\x54\x23\x40\xfe\x7c\xda\xad\x91\xf7\x53\x44\xf7\x07\xec\xce\xb2\x4b\x2b\xbe\x27\x01\xde\xa7\xd3\xd2\xef\xb0\xd2\xd3\x2f\xcc\x1f\xaa\x36\xec\x73\xd1\xa9\x15\xb2\x7d\x3e\x43\x65\x34\x66\x31\x91\xb7\x2c\xcf\x79\xcc\x14\xf1\x74\x3b\xb4\x41\xf1\xe4\x69\x40\x7e\xe8\x1d\xf8\x69\x05\x1c\x3c\x1d\xf3\xc3\x21\xd8\x1f\x2a\x44\x1c\xee\xac\x10\x71\x1a\xa7\x5c\x3c\x0d\x6c\xdf\x11\x6e\x2a\xa2\x09\x3b\x7f\xbf\xb7\xb6\x6e\xc7\xa9\x2a\xec\x57\xf6\x66\xd0\x53\x60\x4b\x9d\xfd\x6f\x3c\xee\x12\x21\xe3\xdd\x1c\x68\x8f\xac\x76\xcf\xa9\x66\x77\x3b\x0a\x42\xe3\x92\xe4\xef\xfa\x3e\xa8\x67\x9f\xb6\xda\xfe\x24\x3a\x85\x04\xa7\x1c\x4b\xfe\x3f\x96\x90\x65\xf1\xa9\x1f\x47\x12\x8e\x15\x36\x65\xab\xb7\x62\x73\x67\xf6\xf4\xe2\x9c\x7c\x8d\x8f\x3f\x5e\x17\x94\x5c\x6a\x54\x79\xce\x64\x4a\x79\x3f\x0d\xd0\xeb\x83\xd6\xfb\x61\x85\x40\xb8\xf0\xcf\x12\xfb\xb0\x11\x8a\xca\x72\xc3\x45\xce\x62\x62\xed\x29\xbf\xb0\x16\x0f\x2b\xe2\xf4\x2f\xa3\xc5\xc3\x7d\x75\xc9\x0e\x4c\xf3\x2e\x7f\xa7\x94\xa2\x1d\x3a\x81\x10\xe1\x63\x9d\x88\x62\x42\x71\x08\x6f\x08\x22\xf0\x40\xd4\x86\xb0\x74\x9f\xac\x83\x62\xf7\x88\xbc\x91\x73\x2e\x1c\x15\x93\x36\xaa\x66\x46\x79\xb2\x1f\x38\x07\x39\xf9\x57\x26\x27\x2b\x95\xbc\x12\x74\x9a\xec\x1e\x32\x59\x3d\x04\x7e\x38\xf2\x3a\xa1\x73\xc2\xe0\x8f\x93\x98\x2b\xf3\x7f\x72\x75\xf5\x06\x9c\xc1\x85\x70\xfa\x25\xb8\x39\x2d\x6f\xf1\xa9\xd1\x48\x64\x1e\x8f\x2e\x20\x11\xef\xad\x83\x47\x30\x1e\xe1\x22\x36\x4b\x67\xaa\x12\x94\x6c\x9f\xc0\x5e\x29\x3e\xef\x0e\x43\x1f\xa7\x8c\x5c\x2f\x78\x74\x73\x11\xf8\x7f\x65\x6e\xee\x89\xe0\x56\x45\x48\xa9\xff\xf6\x58\xdc\xc8\x2e\xeb\xa2\x2f\x83\x5a\x30\x9e\xe3\xd4\x8e\x9c\x5e\x59\x08\xc2\x6f\x54\x29\x19\xf1\x32\xfe\x00\x2c\xd1\x25\xfb\x8e\x81\x7d\x3f\x1e\x54\x40\xe0\xec\x07\x20\x28\xe7\x36\x48\x2d\x0e\xa3\xec\x13\x54\x85\x52\x0a\x17\x0e\x6e\x8f\x06\x04\xc4\xf1\xde\x5a\x9a\x96\xc3\xad\xb6\x34\x75\x6a\x66\xcd\x45\xee\x12\x5e\x2d\x02\x39\x95\xc1\xf6\xd0\x5e\x45\x21\xdf\xda\xd4\x36\x33\x79\x14\xd0\xed\x9e\x9a\xde\x64\xfe\xab\xc5\x07\xe1\x3d\xeb\x34\x07\xda\x93\xc9\xac\x48\x30\xb2\x76\xff\xce\xae\xce\xc7\x88\xdf\x79\x04\x27\xfa\x53\xeb\xec\x74\x18\xa6\xe7\x75\xcf\x57\xfc\x65\xf4\x77\x0a\x54\x8b\x67\x5f\xfe\xe1\x0f\x9f\x7a\xc7\xa7\xfd\x0c\x77\x8f\xdd\xf2\x69\x2f\xd7\x5b\x43\x6d\x86\xf3\xa1\x36\xc3\x50\x9b\xa1\x7a\x3d\xba\x7f\xf8\xe1\xab\x2f\xf4\x92\xdd\xd6\x47\x66\xdb\xbe\xf5\x15\xf6\xcc\x8a\xeb\x27\x23\x6e\xef\x0a\x0a\x0f\x51\x37\xa1\xa7\x1c\xb1\xfd\x6b\x24\x0c\x95\x11\x7e\x5d\x95\x11\xfa\xcb\x11\xeb\xab\x0a\xc2\xfe\xb9\x61\xbf\x9e\x8a\x07\x7b\x93\x8d\x7d\xf3\xea\xf7\xce\xa6\xef\xab\xe9\x47\x5f\xd6\xfd\xde\x2c\x0c\x87\xe5\x78\x8d\xf6\x16\x57\xe2\xcd\x55\xd3\x3f\x3c\x54\x41\xb1\x7c\x2d\x0d\x75\x79\x44\xd5\x99\xec\x6d\x79\xc0\xa9\xc8\x9d\x78\x77\x93\x15\xef\xfd\x55\x2d\x40\xc0\xdf\x7e\xfa\x71\x01\x83\x83\x7c\xbf\x30\xf5\x5f\x96\x7b\xf4\x17\xda\x01\xff\xbe\xdc\xa3\xaa\x52\x35\xd7\x59\x1d\x81\x40\x82\x08\x27\xa7\x61\x67\x9a\x92\x2c\x9c\x5e\x9c\x93\x28\x67\x50\xda\x81\x26\x6a\x42\x1a\x24\x3c\xe7\x40\xb2\x12\xa1\x93\xec\xa8\xd6\x2c\xcd\xf4\xbe\x98\x37\x78\x47\x7f\x65\xde\xd1\x7b\xf7\x52\x2c\x8a\x94\x8a\xb1\xa1\x16\xe0\x1f\xad\xc4\x9d\xd4\xf8\xe1\x84\x58\xba\x80\x62\x05\xd8\x42\x21\xa5\xb9\x10\xfc\xe7\x82\x95\xe6\x0a\x2f\x75\x3c\x01\xe7\x0e\xcc\xa3\x67\xd8\xa1\x44\x55\xa3\x22\x91\x5c\x49\xe2\xb2\x00\xf1\x70\x74\x04\x23\x10\xcb\x2a\xa6\x37\xbd\x60\x28\xbd\x5d\x40\x91\x84\xf2\xa9\xaa\x7e\x88\x0a\x22\x4d\x12\x79\x87\xdf\x0e\xe5\x11\xb3\x7f\x66\x2e\xb6\x2e\xc9\x94\x91\x94\xe7\xb9\xcc\xad\x1b\x29\x9c\x0e\x86\x0f\x19\x3d\x93\xe5\xa8\xb0\xe5\x36\xe8\xe3\x8a\x69\xbb\xd5\x80\x2a\x5a\x12\x2a\x30\x81\xd3\xfc\xdb\x45\x5c\xc3\xb7\x1d\xbd\x9b\xb2\x05\xbd\xe5\xb2\xc8\xf1\x6d\x2d\xc9\x81\xfd\x09\x78\xef\x52\x16\xde\x76\x5e\x40\x86\x96\x5f\x9d\x6a\x80\xd3\xbb\xf2\x47\x50\x70\x63\xe9\xcc\x91\x63\xf6\x91\x2b\xbd\xba\x16\x07\x22\xd7\x72\xe2\x31\x30\xef\x56\x65\x86\xc1\x7e\xb7\x73\xee\x6d\x15\xdf\xc2\xd1\xaa\x92\xea\xed\x15\xfc\xb4\x4d\x4e\xb5\x15\x6b\x30\x65\xde\xa5\xc3\x7d\x7a\x31\xac\xb8\xca\x1d\x7b\x5d\x3d\x49\x41\x79\x10\x92\x37\x5e\x3e\xca\x22\xe1\xd1\xf2\xfc\xac\xdf\xc8\x0d\x1c\xd3\xb1\x3f\xe5\xa3\x36\xcc\x7d\xf2\x15\x55\x2c\x26\x6f\xa9\xa0\x73\xb4\xba\x1c\x5d\x5d\x7c\xf5\xf6\xd8\x60\x11\x58\x75\xce\xcf\x1a\x43\x3b\xae\xc2\xc1\xdf\x3d\x56\x9e\x3b\xa9\x83\xae\x37\xb1\x61\x65\xd4\x1d\xc1\xf7\x68\x25\x00\x88\x97\x09\xf6\x69\x9f\xd6\x20\x0e\x5c\xd4\x8b\x44\x61\xf8\x86\xab\xfe\xa6\xea\xa4\xfa\x36\x8d\x6f\xee\x13\x00\x81\xdd\x7c\xd3\x2a\xdb\xf9\xc0\x5a\xf8\xb9\xaa\xdd\x48\x74\x4e\x35\x9b\x2f\xcf\x58\x96\xc8\xa5\x41\x80\x8b\xc0\x8c\x8f\x8f\x4e\x51\x6c\xc8\xa7\x34\x22\x79\x91\x30\xec\x2d\x54\x2f\xbb\x26\x18\x8b\x4b\x4a\xc7\x85\xd2\x14\x8a\xae\xe1\xf8\x1b\x67\xd4\x9a\x59\xb5\x65\x4b\x63\x9c\xe7\xd6\xa7\xaa\x25\x2a\xcd\x29\xd9\xf8\x4a\x7b\xc6\x04\x9f\xdf\x8e\xb3\x5d\xfc\x9a\xad\x3d\x98\xd5\xee\x80\x70\xca\x2f\x8b\xc4\x30\x9f\x24\xae\xb5\x78\x05\x39\xcd\xee\x31\x56\xbb\x00\x9a\x60\x66\x3f\x22\xd3\xc2\x08\x71\x4c\x55\x6c\xdc\xab\xa5\x3e\xef\x16\xe8\xd2\x36\x2f\x11\x9a\x65\x09\xc7\x10\x66\x99\x5b\xbf\x74\x60\xd0\x5c\x7d\xac\x0d\x69\xe9\x28\xcb\x74\x93\x5d\xc6\xe4\x96\xe5\xd3\x36\x75\x2a\xba\x8a\x25\x34\xe3\xe0\xc7\x69\x2d\xc5\x54\x36\xee\xf4\xe2\x1c\xdf\x6e\x32\x1c\xbb\x1f\x71\x07\xed\xde\x38\xf7\x86\xed\x19\x84\x9a\x8b\xaf\xb4\x74\x7a\x71\x8e\xa5\xbd\x6c\xb1\xa5\xd2\xfc\x61\xf4\x04\x8a\x41\x8e\x65\x85\x47\x3a\x37\x23\x6a\x22\x85\xff\x28\x13\x45\xca\xb0\x40\x53\xd9\x6c\xcc\x28\x8f\x62\x59\x8e\x5e\x5a\x4f\x8c\xae\x63\x54\x9f\x83\x83\x50\x10\xc6\xd4\x87\x3c\x98\x0f\x10\x93\x83\xcf\x2b\x4f\x19\xca\x51\x4e\xb8\x2d\xfb\xe9\x1e\x25\xd0\x31\x2a\xa0\x33\x3f\x13\x52\x5c\x5a\x50\x7d\x7b\xf9\x66\x37\x44\x78\x57\x1d\xc3\x16\xf5\x61\x50\xbf\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\xb7\x22\xe6\x08\xd8\x50\xbc\x05\xbd\x0d\x0a\x1f\x4d\x08\xf9\x1c\x77\xdf\x6e\x0e\x9e\x71\x6c\xe0\x6b\x4d\xc1\x45\x92\x8c\xc8\x8c\x43\xcb\x76\xcd\x32\x12\xba\xb5\xae\xb8\x88\x8c\x3a\x28\xc6\xbe\x23\x0f\xcc\xc8\x29\x89\xfe\xa0\x83\xd7\x14\x64\x66\x96\xc4\x50\x0c\x13\x3e\x61\x0e\x7d\x04\x26\x0b\xa3\xc5\xbe\x4c\x0a\xa5\x59\x7e\x29\x0d\x43\x09\xc2\x76\xa0\x30\x08\x0d\x7f\xfe\x8a\x8b\x18\xe2\xb4\x2e\x81\xf9\x44\x54\x10\xc6\xc1\x18\x64\x86\x04\xff\xbb\x41\x96\x12\x29\x8f\x54\x11\x2d\xcc\x92\x0e\x32\x19\xab\x03\x43\x8a\x0e\xd0\x64\xa8\x0e\x8e\xcd\x5f\xf5\x35\x60\x14\x4e\xf0\xde\x09\xcd\xf8\xc1\xf1\x88\x00\x80\xc0\x01\x28\xf5\xe2\xd3\xc5\x43\xb7\x56\xd0\xd1\x77\xc2\xc2\xcb\x70\x04\xc0\x41\x51\xba\xfa\xee\x16\x5c\x33\xdf\x5e\x1d\x2d\x4d\xbe\xd2\x4d\x9d\xe0\x13\x72\x2a\x08\x4b\x33\x0d\xd6\x6b\x92\x32\xea\x5c\xe2\xec\x96\xe5\x4b\xbd\xb0\x95\x40\x1c\x01\xf9\xe4\x81\xbe\x1f\xc0\x6b\xbd\xeb\x4b\x24\x87\x13\xb6\x02\xdc\xc3\xcf\x0f\xeb\x84\xb4\xe4\x08\x9f\x2c\x28\x81\x45\xef\x04\xc6\xef\xcc\x9b\x55\x10\xe2\x2d\xa4\x96\x9e\x7e\xbc\x79\x63\x1d\x2b\x08\xab\x6f\xb8\x88\x95\xef\xa6\x68\xe3\xbe\x2d\xbc\x1b\x81\x0c\x33\xfc\x14\x01\xbc\x2a\x02\xb7\x15\x5b\x37\x0c\xef\xa4\xfe\x75\x43\x6d\x1c\xc0\xaa\x0e\x6f\x65\xdc\x7c\x74\x2a\xfb\x7b\x1e\x3c\xec\x83\x0d\x4a\xbb\x8b\x1d\xcb\x8a\xbb\xcb\xac\x51\x27\xd8\xbc\x1d\x1b\x40\xbf\x6e\x26\xa5\xc1\x01\xe8\x64\xf0\x0b\x58\x93\xb0\xce\x39\x99\x25\x74\x5e\xa2\x11\x50\x3d\x14\xb4\x5e\x5e\x7d\xe7\x96\xa0\x08\x6f\x16\x79\xb7\xca\xc4\xdb\xa4\xe0\x71\x09\xa5\xb5\x4f\x98\x8f\x34\xfe\xb8\x5d\x14\xf6\x83\xaf\xc7\xa6\x36\xce\x46\xbd\xd1\x90\xb7\x0e\xfe\xce\x66\x47\x03\x4c\x70\x05\xdb\x9c\x62\x0a\xf1\x53\x20\x87\x5c\x7d\x57\x41\x93\x2d\xf3\x5d\x83\xb4\x37\x6c\x79\x27\xf3\xe6\x5a\xec\x3b\xe3\xd7\xc6\x2f\x26\x74\xca\x92\xed\x07\xe4\x2d\xcd\xcc\xb2\xcb\x60\x55\xd4\xde\xad\xaf\x13\xf5\x07\x8c\x2b\x73\xb1\x7c\x32\x9f\x53\xc1\xff\x81\x11\xbe\x91\x39\xc7\x32\x37\x7f\x1e\xa1\xbf\x04\x75\xff\x84\x45\xfa\xd8\xe2\x5f\x23\xdd\xdb\x82\xa0\x34\x8e\x39\x4a\x0f\x17\x5b\x70\x69\x33\x10\xb8\xb8\xb9\x0f\x98\x6f\x38\x58\xdb\x71\x7f\xb3\xc3\xb5\x05\x6d\x2e\xf2\x0d\xb1\x58\x1b\xdf\x4f\x29\xb7\x9d\x79\x9f\x1c\x54\x58\x4a\xf9\xae\xcb\xc2\x6b\x0f\xb8\xa6\x54\x17\x39\xd7\x8d\x0c\x69\xf3\x8b\x5c\x7c\x53\x4c\x99\xf5\x31\x77\x7e\x5d\x40\xa8\xe1\xe9\xc5\x79\xbf\xdb\x51\x39\xe1\x60\x09\xb0\x13\x34\x72\x0b\x29\x04\x4d\xa7\x7c\x5e\xc8\x42\x25\xcb\xd0\xb0\x49\xc1\x45\x3e\x21\xe4\x1c\x2d\x3b\xe2\x50\x13\x2a\xa4\x58\xa6\xf6\x51\x11\x25\x45\xcc\x2a\x23\x82\x27\xf1\x56\xf2\x98\xd0\x42\xcb\x94\x6a\x1e\x91\x48\xb2\x3c\x02\xaf\x63\x38\x52\xa1\x18\xa1\x6b\xde\x8d\x0a\xa5\x65\x4a\x52\x9a\xab\x05\x4d\x92\x75\x7b\xdc\x03\x57\xdb\x54\xbe\x7c\x0c\xeb\x5f\xfb\xe3\x2d\xce\x7a\x47\xfc\xde\x52\xad\xbd\x05\x7e\x9b\xc9\xed\x35\xc0\xed\x7a\x2c\x6d\x31\x86\xad\x13\xd0\x58\x01\x69\xcb\xc6\x6c\x83\xce\xa6\x93\xbb\x75\x5d\x1b\xa8\xe1\xc6\x77\x21\xd0\x97\xc5\xe7\x29\x9d\xb7\x10\x24\xdf\x18\xed\x80\x8a\xa5\x7b\x0d\x8b\x75\xaa\x11\x91\xb9\x8d\x3c\xf1\xbd\xd5\xed\x4f\xbe\xe0\x6b\x4e\xde\x83\x4b\x4f\xe6\x36\x04\xdc\x62\x29\x24\x06\xb0\x7c\x26\xf3\xd4\xc8\x75\x3c\x27\xb3\x42\x80\xa1\x4d\xd9\x88\x71\x50\x49\xac\xad\x86\x26\x4a\xfa\x13\x08\x3e\x42\xe1\x26\x41\xa8\x22\x77\x2c\x49\x26\xe4\x34\x49\x6c\x15\xd1\xa0\x5e\x44\x99\xf3\x5d\xc6\x25\x4c\x97\x24\xe6\x73\xa6\x34\x39\xba\xfa\xef\xd3\x63\xe0\xda\x60\xc7\x58\x12\x4d\x5d\xca\x5b\xd5\x3e\x03\xfc\x3f\x2e\x40\x4e\x88\xa8\xa6\x89\x9c\xa3\x6b\x1e\x6c\xbd\x22\x26\x59\x42\x97\xd0\x22\x20\xa3\x39\x44\xad\x46\x68\xa3\x21\x79\x21\xa0\x38\xf2\x83\x72\x9c\xed\xa4\x60\x53\xfd\xe2\x31\xe0\xe4\x8e\x47\x7d\x4b\x95\xd8\xfb\x65\x65\x39\xcb\x12\xba\xc6\xaa\x50\xc1\xe8\xeb\x4a\x42\xb3\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x0a\x71\x27\xa5\x3a\x42\xbf\xe8\x4f\x29\xd3\x34\xa6\x9a\x4e\x8c\x2e\xf8\x53\x35\xbb\x4e\x26\xb1\x19\x68\xfd\x46\xaf\x99\x33\xca\x8b\xcd\x4d\xf5\xab\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x68\xc6\xd8\x93\x3e\xc1\xf2\x5f\x7d\x34\xaa\xd8\x46\x3f\x5c\x65\xae\xf5\x97\xaa\x56\x86\xa4\xba\x12\x8b\xad\x29\x83\x52\x93\xd7\xb6\x9b\x92\xbb\x03\x26\xd4\xd3\x77\x67\xeb\xcd\x5d\xdb\x4d\x06\x5b\x4c\x04\x55\xe7\xc2\x86\xe9\x39\x03\xb3\xfd\xa5\xea\x61\x70\x29\x35\x90\x84\x88\x09\x2a\xd4\x55\x94\x71\x0f\xe3\x86\x55\xd3\x27\xf1\xbd\xf5\xf6\x91\x56\x2e\x9e\x36\x8e\x9d\x6d\xd9\x6a\x63\x3f\xd9\xb5\x0f\xb5\xf3\xf3\x6c\xcd\x28\x5b\x97\x31\x86\x90\x87\x04\x13\x67\x22\xf5\xc0\x6e\xeb\x17\x6b\x69\xdf\x71\x4b\xed\x30\x51\xbf\x95\x95\xe0\xa5\x1b\xb6\x3c\x54\x36\x73\x46\x0a\xb5\xe0\x19\xa6\x3c\x5a\x37\x84\xdd\x5d\xf2\x1d\x4d\x78\xec\x87\x40\xac\x3e\x17\x23\xf2\x4e\x6a\xf3\xbf\x57\x1f\xb9\xd2\xa8\x7e\x9e\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x02\x8c\x96\x6c\x38\x57\x81\x9a\xec\x16\x74\x6e\xc9\x9e\x03\x0a\x57\xe4\x5c\x18\x89\xc0\xae\xc8\xa7\x02\x2b\x3b\x84\xcb\x63\x11\x52\x8c\xc1\xc6\xdd\x38\x86\x05\x84\xcc\x2b\x70\xd8\x30\x9c\x1d\x0a\x83\x08\xe1\x17\xae\x1c\x11\xf7\x3c\x9b\x3a\xb3\x1b\x8f\x48\xca\xf2\x39\x78\x6d\xa2\x2d\x5e\x8b\xb6\xa6\xc8\x56\x06\xc8\xad\x7b\x05\x24\xf3\xcd\x5a\xc3\xc5\xca\x26\x05\xcf\x23\x59\x4a\xd1\x9a\xf1\x4f\x43\x7d\x00\x52\xff\x86\x7c\x70\x35\x21\xa7\xae\x55\x4d\xf8\x9b\xf5\x5e\x85\xc3\x98\x11\xb8\x22\x86\x94\xdc\xd2\x84\x61\xa5\x7e\x2a\x7c\xce\x96\x9c\xad\x10\xf6\x91\xcd\x0b\x37\x67\xd6\x8b\x4c\x07\x37\x6c\x79\x30\x5a\xd9\xda\x83\x73\x71\x50\x26\xee\x55\x36\xd3\x13\x51\x90\xb6\x0e\xe0\xb7\x83\xdd\x79\xc1\x46\x62\xd9\xde\xbc\xb2\x75\xdf\xd4\x0d\x6f\x76\x61\x37\x0a\x1b\x47\xea\xd8\x80\x10\xdc\xc6\x39\x49\x65\x0e\xe6\x4c\x73\x37\x2c\x11\x62\x44\xd5\x1b\x9e\x65\x65\x45\x95\x22\x9b\xe7\x34\x66\x64\x9e\xd3\x6c\xd1\x55\x2c\x41\xd9\xa6\x69\xf8\x4f\x46\xd0\x5d\x03\xfc\x0d\x1a\xdd\xc6\xf7\xee\xd8\x74\x21\xe5\x0d\xa4\xd3\x01\x22\xdc\xa3\xfd\xe1\x7b\xfc\xd6\x59\x79\xcf\xa9\x92\x8a\xc4\x4c\x53\x9e\x40\x3c\xc8\xfb\x37\x6f\x6d\xc4\x88\xe3\xe3\x6e\x96\xcd\xc1\x17\x3d\x28\x00\x34\xb6\x91\x4c\x97\xec\x96\xb3\x3b\x6b\x95\x58\x17\xeb\x31\x26\x73\x26\x20\xc0\x61\x43\x20\xd0\x98\x28\x1e\xb3\x57\x90\xbc\xbb\x7e\xa0\x3d\x0c\xe7\x6b\xe6\xbc\xed\xf0\x6e\xa6\xe0\x5b\xa9\x77\x0b\x2e\xeb\xd5\xdf\x0b\x99\x6f\x28\x26\xd4\x2e\x97\xb8\x5d\x9e\xb0\x8d\x46\x7f\x41\xfe\xf0\x87\xdf\xaf\x7d\x28\xa5\x1f\x79\x5a\xa4\x2f\xc8\x97\xff\xf1\x1f\xbf\xff\x8f\xf5\x8f\x71\x81\x8f\x3d\x5f\xbf\x3e\x7b\xda\x5e\x5e\x9e\x3d\x01\x78\xc7\x3e\x22\x6f\xb3\x53\xae\xc5\x50\x33\xca\x93\x22\xb7\xb1\xa0\x2d\x55\x84\xd7\xe1\x3b\xe0\x50\x29\x93\x27\xa8\x1b\xd1\x05\x8c\xd9\x40\xb2\x19\x17\x4c\x41\x13\x98\x42\xe4\x2c\x92\x73\xc1\xff\xc1\x62\xd7\x03\x06\x02\x3b\xa0\x5a\xbc\x43\x71\xc2\x44\x8c\xbd\x38\x0d\xcf\x5b\x50\x11\x27\x9b\x1c\xfe\x2d\x56\x1a\x9e\xe0\xbd\x40\x06\x9c\xa7\x13\xc0\xde\x96\x6f\xd4\xc0\x05\x1d\x45\xad\xfb\x09\x39\x1a\x82\x6d\xaf\x95\x22\x61\xbc\xda\xa0\x58\x37\xcc\x71\x45\xef\x43\x95\x15\xee\xfd\x5c\xb0\x7c\x09\x89\x22\xa5\x60\x1f\x04\x93\x5d\x97\x75\x08\xdc\x32\xac\x44\x85\x85\x60\x6a\xba\x70\x29\xc4\x94\xe1\x1e\xb5\x6f\xc3\x3b\x0c\xdd\xe7\xce\x91\x44\x4e\x89\x28\x92\x64\xdd\xa3\x42\x6e\x72\x39\x85\xb0\xdb\xa2\x4a\xb6\xd3\xf1\xda\x9a\x05\x1a\x20\xfd\xa0\xc6\x81\x70\xe1\x3d\x89\xf2\x4f\xdb\x5c\x10\x2e\xb8\x55\x5c\x68\xfb\x98\xd0\x76\xe5\x6e\x5a\x98\x11\xf0\xea\x12\x34\xda\xb2\x48\xcd\x7d\x1a\x16\xf0\xea\x14\x9f\xd3\xce\xc8\xd0\x30\xf5\x27\x67\x6a\xd8\x61\xf1\x6d\xcc\x0e\x0d\x4b\x1f\x8c\x0f\x2b\x00\x6f\x1b\x0d\xd5\x21\x12\xaa\xe5\x4e\xb6\x30\x4a\xe0\x35\x98\x26\x3a\x71\xa2\x16\x84\xb9\x9b\x99\xa2\xf5\xae\xe6\x8c\x8b\x5b\x89\xc5\xa2\x3b\xc9\x70\x97\x2b\x2f\xd6\x44\xb9\x3b\xa0\xac\x56\x96\xf3\xc2\x6f\x28\xd2\x1a\x85\x96\x14\x6a\xbb\xb1\x7b\xf3\x0a\x36\xe7\x8f\xf4\xa2\x83\x54\x57\x5e\x24\xec\x7b\xae\x17\xef\x5d\x71\x78\x8b\xd5\xba\xc8\x12\x58\x6c\xf0\x83\x41\xa1\xcb\x52\x32\x3c\xc7\x76\x64\x2c\x92\x69\xca\x44\x8c\x41\x44\x29\xbd\x61\xa4\x6c\x79\x69\x64\x3c\x10\x83\x61\x38\xf6\x31\xa3\xa2\x94\x13\x6f\x0d\x2d\xdf\x84\x51\x2d\xf1\xa9\x2d\xaf\x6d\x9d\x98\xb1\x39\x21\x23\xc8\xa8\xa8\x24\x5e\x90\x29\x4b\x24\xa4\x72\x63\xa4\x28\xc6\x32\xbb\x5c\x06\x43\x92\xed\x5d\xcb\xf5\x6c\xe1\x48\x26\xe6\x65\x3d\x2a\x95\x40\x73\x5a\x4b\x81\xa5\x60\x13\x72\x69\x45\x98\x76\x52\x51\x1b\x72\xda\x92\x94\xb6\x66\x88\x65\x2d\x86\xce\x90\x75\xef\x85\xb0\xbd\x75\xf7\xda\x40\xd7\x3d\xfc\x4b\x86\xaf\x6f\xdc\xd0\x0d\xbc\xd5\x23\x5d\x72\x05\x0f\xdb\x1a\xf1\x8a\xb0\xf5\x31\x98\xea\xc6\xe4\xe5\xe5\xab\xd3\xeb\x57\x23\xf2\xed\xc5\x19\xfc\xff\xec\xd5\x9b\x57\xe6\xff\x2f\xdf\xbf\x7b\xf7\xea\xe5\xb5\x91\x23\x3e\xc7\x12\xf4\x46\x8d\x33\xd0\x35\xfc\x48\x56\xa9\x05\x15\x4b\x32\x2b\xb4\x21\x07\xe5\xc7\x2a\xb3\xa0\x68\x03\xa0\x71\x6c\x54\xc6\x4f\x6e\x0f\x9b\x01\x5e\x37\x9b\x84\xbd\x37\xb0\x6a\xbf\x4d\xb8\xda\x2e\x26\xb5\x46\x92\xd6\x59\x07\x95\x29\x1f\xec\x98\x6e\xf0\x41\x90\xd7\x32\x27\xb6\x59\x19\x74\xaf\x8c\xd5\xa1\x4d\xea\x30\xff\x9e\xe0\xad\x93\x44\xce\x0f\x7d\xae\x07\x23\x89\x9c\x13\x55\x4c\x7d\x0e\x0e\x70\x53\x78\xfa\x73\xf7\x58\x25\x75\x61\xe4\x13\x71\x82\xb7\xfc\xe0\x95\x77\xc2\x07\xc2\x71\x4f\xa0\xc3\x58\xe5\x49\x73\xa3\x3e\xe0\xe7\x27\xcd\x33\x70\x82\x13\xcf\x6b\x6f\x7c\x10\x06\x5d\xef\x78\x12\x47\x34\x8f\x57\x70\x16\x98\x1b\x6e\x39\x40\x0f\xcb\xee\x62\x37\xe8\x72\x70\x5b\x2c\x43\xde\xb2\x3c\xa1\x19\x46\x88\x43\xdd\x63\x08\x3d\x82\x8f\x9c\xb1\x8c\x41\x1e\x94\xeb\x56\xce\x44\x94\x48\xa8\xcb\x81\x9c\x71\x54\x5d\x3a\x86\x22\xb9\xe2\x85\x2e\x1b\xcf\x9f\x90\x83\x27\x4b\xe6\x20\xcc\xb8\x13\xf6\x62\x60\xf2\xda\xe2\x2e\x3e\x6f\x03\x95\x46\x2f\xf9\x32\x72\x60\xb3\xcc\x0e\x46\xe4\xc0\xd7\x2f\x89\xad\x94\x7c\xf0\xf9\x41\xf9\x40\x98\xa7\x04\x42\xb2\x75\x09\x8d\xe1\x3b\x61\x46\x24\x6c\xb0\x73\x5c\xf9\x4f\x97\x35\x68\x0c\x6b\xb3\x46\x2c\x98\x43\x75\xa0\x49\x65\x22\x2b\x5f\x2d\x53\xec\xb6\x7e\xd1\x4c\x3f\x78\x5d\x43\x4a\x3b\xa6\xea\x59\xe0\xe4\xcc\xec\x86\x0b\x48\xbb\xaa\x20\x8f\x77\xbc\x85\x45\x72\x78\x4e\x32\x9a\x1b\x55\xc4\x3d\x59\x6d\x73\xf6\xf9\xd6\x26\x67\x2d\x90\x20\xf0\xaf\xb4\x94\xda\xaf\xfc\x1b\x2f\x13\xaa\x54\x83\xe5\x15\x08\x81\x19\x98\x30\x1c\x99\x50\xe7\x7c\x82\x1a\xd6\x0b\x7a\xbb\xa1\xc8\x41\x8b\x49\x6b\x9a\xcf\x99\xde\xec\x19\xa1\x62\xf9\x7e\x63\x59\xb4\x71\xeb\x42\xac\xe3\x76\xa7\xe9\xe3\xb8\x2c\xc2\x35\xe6\x42\x8f\x65\x3e\xc6\x57\x5e\x10\x9d\x17\xeb\x7c\x5c\x9a\xa7\x4c\x16\xfa\x8a\x45\x52\x34\x67\x34\xd8\xe7\x7a\x73\xf5\x74\x48\xf3\xb0\xde\xc6\x53\x27\x46\x84\x85\x0c\x9d\x62\x56\xca\x18\xce\xc3\x58\x2d\xc5\xf2\xfe\xcd\xdb\x7d\x36\x9b\x40\x2a\xf4\xe6\x9d\xfc\xce\x92\x7d\x31\xf7\x33\xb5\x33\xdf\xf8\xda\xdb\x42\x77\x7f\xe9\xa5\xf7\x5c\x6d\x7e\xda\x02\x63\x73\x39\x8d\xb5\xeb\x57\x9a\xea\x62\x05\x1b\x2a\x7b\x63\x89\xe5\x15\xa6\x94\x59\x99\xfe\x0a\xde\x0b\x8d\x7c\xab\x35\x04\xb0\x2e\x09\x3c\xe7\x82\x15\x27\xc4\xbe\x68\xce\xa7\xce\x29\x47\x05\x92\x46\xba\x80\xdc\x64\xaa\x6d\x60\xa3\x2d\xa2\xf3\x59\xd3\x32\x1a\x55\xc6\x4d\x6a\x62\xc4\x72\xad\xde\x50\xa5\xbf\xcd\x62\xba\x26\x7b\xa9\x16\xb0\xa8\x34\x1c\x18\x14\xac\xef\x04\x8b\x0d\x85\xb7\x20\xc0\xf1\xc8\x9d\x21\xbd\x05\x8e\xd8\xd5\x93\x5f\x1e\x20\xf3\xfa\xd8\x7c\xaa\x79\xd6\x97\xd2\xc0\xe4\xb4\x91\x00\x55\x43\x35\xb6\xcd\xd6\xb0\x93\x1c\x46\x23\x82\x7d\x6c\xd2\xb8\xf7\x9f\x71\xc2\xa8\x68\x0e\x97\xaf\x61\x14\x3c\xd7\x1d\x87\xec\x07\xc8\xdd\x82\x1b\x91\x15\xb3\xbc\x14\x71\x22\x54\xcc\x12\xb6\x26\xd9\x6b\xcf\x50\x52\xfb\x85\x33\xfb\x81\x56\x61\x4e\x17\xd5\x77\xbc\x41\xdf\x0a\xe1\x36\x79\xa2\x14\x96\xad\xf4\xe0\xb5\xa6\xfa\xaa\x40\x7c\x99\x26\x32\xba\xc1\xa2\x62\x90\xcf\xcf\xff\xc1\x72\x17\x77\x5e\x36\x14\xb3\x5d\xae\xe6\xae\x83\xa7\x83\x9b\x6b\x69\x04\xa3\x98\xb1\x0d\x00\xfd\xf8\x32\x2f\x2d\x8b\x85\xb0\xd9\x73\x0f\x13\xba\xea\x14\x15\x88\xd7\xaf\x78\x0e\x56\x75\x16\xac\x3f\x02\x35\x0f\xad\xca\x48\x53\x9b\xdd\x72\xf2\xcd\xfa\x4c\x90\x5e\xc3\x51\x37\xe5\xa3\xe0\x13\x00\x3e\x11\x6d\x2c\x57\xb3\x31\x73\xa5\xad\xe5\x6b\x4b\x86\x0a\x69\x2f\xa4\xfb\x29\xb7\x19\xad\xd7\xe0\xc2\xde\xbd\x7d\x6b\xd3\x00\xca\xab\x8b\x0f\xaf\x6d\xb1\xd5\x4e\x5e\x26\xd1\xa5\x28\x66\xb5\x78\x88\x57\x3b\x6c\x92\x27\x7a\xe2\x67\x32\x5f\xab\xc0\xf4\x37\xf9\xcd\xf9\x4c\x5b\x07\x32\xd2\xe7\xfa\xd8\xb5\xd5\xe4\x1d\x43\xbd\xfc\x2b\x23\x42\xc9\x82\x2b\x2d\x73\xeb\x5a\x83\x86\x64\x39\x85\x86\xa9\xcd\x31\x60\xfd\x44\xc3\xbd\xf4\x53\x20\x34\xcb\x18\xf5\xbd\x8a\x2c\x6f\x82\x66\x43\x39\x8b\x64\x1e\x37\x4e\xcc\x69\xf7\x8d\xb2\x54\xe3\xe7\x7b\xc8\xcd\x4c\xa8\xd2\xd7\x7e\x0e\x46\x40\x68\x49\x8d\xab\xe2\x8f\x5d\x62\xb9\x1a\x57\xce\x45\x8a\xf2\x47\x49\xa8\x40\xab\xc6\x7e\x32\xf8\x76\x21\xa3\x5c\x1b\x4a\x73\x3b\xad\xeb\xce\x4b\x6e\xc1\x12\x1f\x66\xe6\x29\x53\x6a\x63\xa2\x51\x2d\x48\x03\xea\x02\x13\x5f\x17\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x2a\x77\x2d\xd7\xa3\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x65\xd9\x82\xaa\xb6\x8b\xf1\xa7\xc8\x87\xf8\xb6\x3e\x0e\x2d\x67\x93\x33\xaa\x36\xa5\x4a\xd6\x60\x3b\xcd\x39\x9b\x91\x97\x34\x65\xc9\x4b\xaa\xfa\x04\x2e\x50\x80\x09\x61\x93\xf9\x84\x1c\x5e\x06\xde\xd6\x77\x52\xbf\xdd\xd4\xb7\x61\x4b\x75\x80\x36\x27\xfa\x5e\xcf\xf2\xde\x4a\xc2\xf6\x93\xbb\xe7\x99\xdd\x7b\x86\x1b\x4e\xe8\x93\x38\x9b\x9b\xf3\x7d\xd7\x9d\xc7\xea\x49\x2c\x72\xb0\xf8\x45\xbb\x9e\xc8\x2d\xc9\x8c\xeb\x4e\xe1\x53\x3e\x7f\x5b\x96\xe4\x87\xb8\x6a\x34\x99\xac\xac\xee\xba\xa2\xb9\x82\xd9\x3f\x0c\xb0\x83\x92\xdf\x66\xa6\x2f\xaf\xbe\xeb\x53\x6c\x79\xdc\x64\x7b\xbb\x81\x6b\x7f\xdf\x20\x97\x8f\x37\x73\xe1\x7d\x13\xf9\x63\x70\xb4\x18\x0c\x78\xc8\x00\x8c\x33\xf7\x55\x6b\xeb\xf0\xd5\x7a\xe1\xaf\x99\xed\x8a\x66\x9f\xa9\xe0\xc7\x11\xf4\x9f\x63\xb7\xd8\xf4\x11\x12\x3e\x18\x11\x4c\x99\x43\x71\xbc\xe1\xf3\x2d\x15\xaa\x76\xca\xd4\x76\x45\x77\xab\x12\x4b\xb6\x6f\xad\x7b\x68\xd3\x06\xe3\xd5\x56\x67\x6b\xa1\x13\x77\x50\xd6\xb6\x6b\x3c\x1d\x06\xdb\x2a\xfe\x75\x1c\xaf\xd9\x80\x5b\xbf\x6a\xd5\x81\xcd\x2b\x97\x40\xa4\xd1\x31\x1c\x19\x0a\x1c\x41\xcd\x68\xa4\xdd\x96\x3c\x55\xed\xb7\x97\x75\x1a\x08\xe1\x86\x55\x0c\xef\x6b\x59\x45\xc1\xfb\x83\xf9\xd6\x0a\x1a\xad\xc7\x7b\x02\xe5\x40\xb6\x22\xd0\xfd\x16\x2a\xc0\x6b\x1b\xd6\x3d\x3e\xbe\xb5\x29\xc8\xb4\x11\xc7\xee\xa9\x32\x8b\x62\xf9\x2d\x8b\x2b\x9e\x3a\x5b\xbb\xbd\x7a\x2f\xf0\xdb\x96\xe3\x5b\xb0\x93\x7f\xfe\xfb\xb3\xcf\xc6\xe3\xf1\x67\x65\x6c\xd6\x0b\x42\x33\xce\x3e\x6a\x86\x11\x78\x93\x9b\x3f\x41\x83\x9e\xdb\xe7\x9f\x01\xc2\x91\x97\x60\x6d\x76\x66\xd6\x33\x9f\x41\xf8\x99\xcb\xc0\x34\x1f\xa1\x42\x48\x1d\xc6\x22\x45\x52\xe8\x5c\x26\x09\xcb\xc7\x73\x26\x26\x37\xc5\x94\x4d\x0b\x9e\xc4\x2c\x87\xc1\xdd\xa7\x6f\x9f\x4d\xfe\x73\xf2\xec\x33\xe2\xf3\x2d\x8d\x64\xaf\x34\x4d\xb3\x17\x90\xf8\xf1\x99\xc5\x38\x57\x91\x2d\x4b\xa8\x50\x13\x1f\xe6\x3d\x89\x64\xce\xa4\xf9\x5f\xfa\x99\xca\x58\x64\xbe\x8d\x07\x8d\x34\x3e\x63\x4d\x67\x76\x8a\xb6\x94\x59\x09\xa6\x31\x91\x49\x0a\xff\xc6\xa5\xdb\x12\x72\x17\x89\xad\x47\x97\x70\xa5\xbf\xa9\xff\xf2\x86\x2b\x64\x97\x59\x52\xe4\x34\xa9\x4e\x15\x7e\x50\x0b\x99\xeb\x4a\xa9\xd5\x31\xe1\xc8\x1a\x15\x17\xf3\x22\xa1\x79\xe5\xad\xcf\x5c\xcc\x43\x69\xae\x33\x5c\xf2\xb6\x12\x4b\x37\xae\x04\xcb\x72\xa1\x59\xfe\x52\x26\x45\x1a\x5a\xc7\xc6\xab\x72\xe5\x8c\xe7\x4a\xdb\x1a\x77\x55\xa7\x42\x93\x5c\x0c\xdf\x0f\x70\xf4\xef\x4a\x0a\x70\x17\x92\x89\x01\xf7\x64\xfd\x4b\x3f\x3c\xfb\x31\x78\x0f\xf7\xb0\x2a\xaf\x36\x9e\x92\x86\x19\xd3\x2c\xcb\xe5\x2d\xc5\x0a\x7d\x1b\xe6\xe2\x9e\x5b\xf9\xec\xe9\xea\x0f\x6b\xbe\xdd\x3c\x64\xc5\x47\x17\x0e\x59\xf9\x41\x37\x54\x2f\xc4\x87\x6f\x9f\xd3\x24\x5b\x50\x97\x67\xa8\xa2\x05\x4b\x69\xb9\x49\x32\x63\xe2\xf4\xe2\xfc\xbb\xdf\x5f\xd5\x7e\x68\xae\x67\x68\x50\xce\xa7\xd6\x05\x95\xf5\xa9\xd3\xc5\x7c\x6a\x44\x79\x02\x56\xa6\xb9\x22\xe4\x35\x0b\x75\x46\x2a\xc7\x33\x5e\xbb\x6d\xa0\x13\xdc\x5a\x27\x5c\x05\x44\xa6\x46\xe8\xaa\x3d\xc4\xca\x80\xcf\xca\xca\x2c\xc2\xb3\xd8\xc2\xac\x8c\xde\x71\x6e\x9e\x72\xd1\xc2\xae\x69\x42\x0c\x32\xb2\xdc\x57\x41\xc2\x34\x4e\x4d\x82\xfc\x43\x1c\x0d\xcc\x15\x98\x27\xa3\x99\xd2\x10\xb7\x90\x0b\xd7\x08\x78\xe4\xfb\x99\xe7\xcc\x8c\x5b\xcd\x60\x74\x29\x19\x0d\x6d\xce\xe6\x5c\x3b\x12\x1a\xc9\x34\x2d\x04\xd7\xcb\x13\xa0\x86\x7c\x5a\x98\xdd\x38\x89\xd9\x2d\x4b\x4e\x14\x9f\x8f\x69\x1e\x2d\xb8\x66\x91\x2e\x72\x76\x42\x33\x3e\x86\xc9\x0a\x0c\xc0\x49\xe3\xdf\x78\x3a\x5e\x57\x3a\xd7\x72\x98\x26\x19\xa1\x0a\x6b\xa8\x08\xc7\x83\x7e\xe5\xd8\x52\xb9\x52\x77\x14\x2a\xdf\xbe\xba\xba\x2e\x5d\x8c\x58\x29\x08\x20\x1c\x38\xd9\x4a\x60\x1b\x40\x41\x3f\x1a\x5b\xe8\xdb\xa5\x76\xfa\x84\x4e\xa8\xf3\x9e\x70\xa3\x93\xa8\x62\x9a\x72\xad\x5c\xac\x23\x06\x0e\xbe\x04\x0e\x02\x65\x27\xd1\x52\x33\x21\xe7\xa2\xd4\xef\xef\x1d\xd4\x10\x15\x34\x36\xe0\x6b\x0f\xec\x90\x01\xae\xbe\xd0\xa0\x48\x39\x16\xb5\x76\x77\x82\x33\x7e\x95\xb1\xc8\x9f\x06\x7f\xa6\x4f\xb1\x66\xba\x2d\xce\xef\x63\x31\x25\x76\x99\x86\x97\x57\x42\x0a\x36\xe8\x75\xeb\x75\xb9\x31\x69\xa0\xa7\xd5\x9f\x1a\x62\x17\xc6\xed\xd8\x08\xd9\xa2\x90\xb9\x4f\x6f\xb7\x03\x39\xde\x60\xb5\x63\xa8\x75\xef\x19\x86\xcd\xc7\x00\x5d\x59\x84\xb0\x85\x1c\x85\x20\x50\xd8\x40\xf6\xe0\xd4\x95\x33\xc4\xfa\xf0\x6f\xa9\x28\x68\xd2\x18\xc0\xb6\x51\xbe\x73\xb0\x59\x5f\x5f\x61\x5d\x85\xdb\xf5\xa0\xeb\xb5\x56\xc3\xc6\xd9\xdb\x7c\xe9\x8d\x25\x26\xd6\x05\x78\x21\x36\x76\x2e\x4d\x11\xd4\x91\x5f\xe7\xd2\xdc\x27\x06\xe9\x20\x3c\x53\x2b\x61\x23\xc8\x40\x37\x87\x8e\x28\xcd\x32\x55\x16\xa9\xd0\x92\x44\x32\xcd\x12\xa6\xab\xbc\x17\x82\x72\xbb\xc5\x28\xd5\x63\x6e\x77\x3c\xa9\xb6\x66\xc9\xd5\x1a\x7f\xed\x18\x2d\xbb\x5d\xce\x9f\xd6\x4c\x14\x86\x0a\x5f\x55\xaa\x81\xaf\x69\xe3\x5a\x3d\x92\xeb\xdf\x0d\x6b\x14\x62\x36\x6a\xb5\x63\x90\x8b\x31\x71\x85\x87\x63\x1b\x98\x1a\x07\x69\x6b\xeb\x43\x4b\xf6\x8c\xd3\x59\x2f\xab\x34\x2f\xb3\x4c\x48\x59\xe9\x7e\xba\xe6\xfd\xad\x6a\x21\x24\xec\x6d\x8a\xc6\xab\x72\xf2\x73\x0b\xd0\xdc\xf6\x89\xa4\x24\xe3\x0c\x63\xe7\xbd\x38\x04\x00\x63\x34\xb6\x37\x0d\xc3\xcb\x99\x8f\x0f\xb7\xf6\x6e\x18\xa0\x14\x97\xa0\xaf\x0f\xc5\x40\x75\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\x6d\x32\xa1\x6d\x1d\x02\x98\x9c\x42\x48\xbb\xeb\x90\x11\x33\x65\xd0\xf3\x0a\x8c\xe7\x29\x15\x7c\xc6\x94\x9e\xf8\x1a\x21\xea\x87\x2f\x7e\x9c\x84\xa9\x01\x23\x57\xdc\xdc\x0b\x15\x16\x35\x80\x94\x9b\xc5\x94\xe5\x35\x7d\x53\xd2\x4c\xba\x4e\x22\x77\x30\x59\x4d\x6f\x0c\xfd\xc6\xc9\x16\x46\x97\xb9\x61\x2f\xc8\x01\xaa\x26\xfe\xd3\xff\x34\x62\xf8\xbf\x0f\xc8\xd1\x1d\x84\x3c\x1f\x98\x3f\x0f\xf0\x83\x5e\x06\x0c\x9b\xe9\x94\x1f\xc6\x40\xe9\x9c\xcf\xe7\x2c\xb7\xbe\x23\x30\xab\x42\xcf\x10\x0e\x6d\x40\xcb\x87\x85\xed\xa9\x56\xd6\xdc\xac\x4f\xe4\x87\x2f\x7e\x3c\x20\x47\xd5\x75\x11\x2e\x62\xf6\x91\x7c\xe1\xdd\x0f\x99\x8c\x8f\x6d\x54\x96\x5a\x0a\x4d\x3f\x9a\x31\xa3\x85\x54\x4c\x60\xc8\xb7\x96\xd8\xc6\x45\x49\xf0\x6c\x25\xc9\xd8\x36\xc9\x27\x77\x98\x36\xec\x40\x89\x69\xb8\x50\xb2\xa8\x2a\x21\x63\x0b\x5d\xf8\x9a\xd9\xb6\x39\x98\x56\x8c\xf4\x85\x7d\x5e\x30\xb1\x21\xac\x92\xa4\x0a\xdc\x24\x43\xfa\x16\x54\x80\x9b\xc5\xb6\x87\x31\xf2\xd4\x64\x9d\x4f\x72\x2b\xc6\x6f\x32\x69\x35\x88\xad\x6d\xda\x0c\x3f\x90\x50\xd8\x7a\x89\x9b\x0c\x66\x8f\xda\x49\x79\xaf\x15\x6d\x8c\x3e\x5a\x5d\x16\x86\x1c\x3d\xc0\xda\xa0\xdf\xec\xc9\xce\x4b\x73\x22\x75\x17\x4e\x70\x78\x85\x07\x3e\xaa\xbf\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x29\x8d\x91\x04\x52\xb1\xbc\x77\x34\x36\x00\x04\xaf\x6d\xb4\x1c\x5b\xbb\xdc\x98\x8a\xd8\xfc\x5b\x71\xa5\xcd\xfd\x9d\x21\xb6\xc1\x10\x5a\x85\xd2\xb7\xe7\x67\x0f\x83\xdc\x05\xdf\xf1\xb4\x4e\x0b\x11\x27\xec\x8d\x94\x37\x6b\x52\x81\x2b\x0b\xfa\x2a\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xec\x63\x68\x03\x2d\x97\x64\x45\x82\xe4\xb5\x10\x19\x8d\x6e\xe8\x9c\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x6b\x5d\xb9\xb5\xb3\x47\x6b\x80\x9d\xe7\x9a\x69\x3a\xbe\x68\xcb\x0e\x50\x37\xef\xed\xf3\xed\xc5\xaf\x5c\x91\x70\x2f\xd9\x6c\xed\x83\xbe\xb8\xfd\xba\xfc\x93\x31\xb4\xf6\x5a\xfb\xa3\x2b\x84\xdc\xf8\xc0\x76\x1f\x62\x7d\x9e\x6d\xa3\x9b\x6a\xaf\xb9\x1d\x71\x04\xc3\x42\xb9\xf2\x18\xdc\xb1\xbb\x00\xdd\xd8\xee\xa8\x02\x0a\x94\xdc\xda\xc8\x9c\x07\x29\x89\xb4\x5d\x6c\x6e\x58\xef\x0e\xc2\x73\x38\xf1\xad\x7e\xbb\xad\x82\x74\xc3\x9c\x06\x71\x7a\x10\xa7\x9f\xb8\x38\xdd\xe9\x0c\x6c\x0f\x3d\xf8\x34\x04\xec\x4e\x8b\xde\x1e\x6d\xff\x24\x45\xee\xce\x6b\x6c\x11\xfc\xff\x64\x85\xf0\x4e\x8b\x6d\x29\x90\x37\x2d\xf9\x97\x2c\x96\x77\x82\xe1\xd6\x78\x98\x27\x28\xa8\xb7\x5e\xe0\xe6\xa4\x90\x86\xf5\x05\xf9\x18\x35\x3b\xb0\x99\x34\xb6\x28\xf7\x76\xda\x50\x4c\xde\x26\x4e\xf5\x52\x01\xb6\xb7\xe8\xbb\x56\x61\x73\x6b\xcb\x12\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x1b\xe2\xcc\xcb\xb8\xe2\xbd\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x5c\x76\x9b\x44\x92\x0e\x4b\x36\x32\x7c\x96\xcb\x69\xdb\x8a\x35\xf7\xb0\xaa\x96\x51\x86\x7b\x86\xb3\x43\x76\xbe\xdf\xdf\xde\x16\xbb\x2d\x89\xa3\x61\xee\x58\xd3\xae\x12\x49\xe6\xf7\xe3\x50\xc1\x26\xdf\xc7\x4c\x77\x0e\xbe\x0c\xc4\x6a\x9c\xe4\xc8\x79\x30\xaf\xf3\x82\x8d\xc8\x6b\x9a\x28\x36\x22\xdf\x8a\x1b\x21\xef\xfa\x9b\xef\xe6\x8a\x0c\x0d\xb3\xbd\xb6\xb5\x17\x5a\xe4\x0a\xb5\x9e\x4a\xa9\xdd\xb7\x24\xf6\xe7\xfe\x05\x67\xa1\xb1\x1a\xfa\xb8\x10\xfc\xe7\xa2\xaa\xa8\x78\x27\xd3\x51\x5d\x85\x79\x79\xf5\x1d\x20\x07\xaa\xdb\xaa\x52\xd4\xd6\xfc\xa8\xd6\x87\x55\xb7\xc9\x83\xda\xa8\xa8\x56\x13\xc3\x8d\xa2\x5f\x55\xb5\x12\x5b\x9e\xb0\x6e\x96\xc9\x8a\x24\x99\x90\x73\x7d\xa8\xcc\x1c\x78\x44\x93\x64\x69\xb4\x96\x5a\xb7\xb0\xfd\x32\xb8\x5a\x30\x88\x95\xc3\x86\x15\x57\xf8\x2d\x0b\x5e\x77\x80\x46\x83\x13\x8b\xed\x3a\xf6\x2b\x99\xb8\xa1\x2f\x56\xc3\xd4\x2e\xed\xe3\x0e\x51\xc2\xfd\x2f\xa1\x6a\x07\x45\x5d\x13\x90\x46\x30\x32\x93\x85\x88\x09\xd5\xb0\x3d\x3b\xce\xb9\xea\xc3\x7d\x38\x87\xff\x66\xf9\xa9\x1f\x63\x63\xe0\x81\x2f\xf3\xf8\x36\x08\x5f\x25\x91\x63\x1f\x59\x54\x04\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\x7e\x73\x5f\x1f\x25\x31\xf5\x61\x73\x4a\xfb\x4e\x9d\xf4\x18\xd0\x3e\xaa\xbb\x9d\xa8\xd0\x43\xec\x79\x9b\xc2\x4e\xed\x2b\x13\x35\xa1\x3d\x70\x45\x7c\x6a\xca\x54\xb0\xc2\x15\xfc\x36\xf4\x84\x42\x05\x16\xc3\x64\x6c\x57\x04\xa8\x53\xb5\x90\x3b\x53\xc6\xb6\xf9\x89\x6f\x9d\xfc\x66\x3e\x08\xb2\xdd\x78\x45\xb6\xb3\xfc\xaf\x94\xed\xa0\x79\x4f\x19\x4a\x03\x4c\x32\xa5\x4b\x08\x4d\x4b\x33\x99\x6b\x8a\x0e\x8e\x42\xc4\x2c\x57\x9a\x62\x8d\x12\x97\x97\x97\x99\x35\x2f\xa8\x22\x5c\x2b\x12\xd9\x24\x43\xdc\xb0\x7b\xca\x64\x0c\x80\x7d\x61\x5e\xf0\x22\x42\xe5\xe3\xc8\x57\x2b\x1b\xb3\x71\x17\x36\x4f\x2c\xa1\x1b\x02\xab\xf6\xa5\xb3\x57\x9a\x65\x75\xba\x1a\x2c\x42\x80\x38\x7e\xcb\x63\x0c\x46\x62\x19\xe1\xa2\x1f\xa2\xba\xdd\x81\x83\x8e\x89\xf5\xc7\x6a\xec\xad\x34\x6b\x1f\xd8\xa0\xd1\x6e\x27\xea\x32\xc3\x48\xf9\x6d\x67\x7f\x73\xf7\x79\xbf\x8a\x3d\xc9\xe5\xfa\x48\x39\xbc\x56\x76\xd5\x65\x5f\x6c\xd8\xdd\x20\x56\x17\xa2\x41\x75\x6e\x25\xa9\x65\xab\x3d\x26\x0f\x5d\xe5\x66\x4b\xea\xdf\xd6\x42\x2c\xe3\x20\x70\xb0\xe5\x63\x60\x98\xdc\xf8\xec\xb6\x3c\xc2\x87\xae\xab\xb3\x67\xc5\x94\xf2\x72\x2e\xa4\x5e\x06\xdb\x6e\x65\x6f\x39\x50\xb9\x35\x3d\x0f\xd7\xc2\x3e\xde\x72\xcc\x56\x09\x80\xfd\xa7\xbd\xb1\xac\x9a\xf6\xdb\xc4\x93\x32\x9a\x6b\x1e\x15\x09\xcd\xcb\xb3\x0f\x44\x7e\x25\x6f\xa9\xf3\x9c\x95\xa6\xb9\x6e\x55\x64\xe1\xca\x3d\xe9\x6b\x2e\x42\xc1\x85\x05\x13\xde\xf9\x87\x69\x60\x64\xca\xe6\x86\x79\x66\x59\xb2\x74\x39\x06\x65\x04\x7b\xc2\x95\x2e\x9b\xff\x81\x2c\xd0\x36\x14\xa2\x73\xb9\x86\x5f\x75\x1e\x9d\x4c\xd2\x48\x8a\x19\x9f\x3f\x5c\x16\xdd\xfb\x37\x6f\x5f\xc2\x27\xe1\x5e\x99\x43\xe7\xef\xaf\x64\xd0\x95\x93\x84\xdb\x65\x92\x9c\xff\xa1\x4c\x91\xb3\xf5\x1c\x1a\xf2\xe3\x5c\xf6\x95\xdb\xcf\x1d\xf3\xae\xfc\x34\x5d\x54\x86\x67\xc5\x2a\x93\x42\x71\x23\x13\x43\xfd\x2c\x78\x08\xbb\x9f\xbc\x7f\xf3\xb6\xdf\xa4\xab\x21\xc3\x6a\xc8\xb0\x1a\x32\xac\xb6\x1d\xa8\x16\x19\x56\xfe\x34\x43\x7e\x95\x0b\xdb\x33\xff\xb6\x69\x42\xe5\x71\xf7\x35\xad\xdb\x7e\x7c\xb3\x7c\x38\x63\xd4\x80\x66\x7b\x64\xe1\x6b\xfb\x60\xd9\x85\xa7\x92\xa7\x6b\xc9\x0c\xe8\xe2\xef\xdf\xbc\xf5\xe3\xde\x43\x4e\x44\xcc\x95\xf9\xcc\x4b\x99\x71\x16\xbf\xbc\xfa\xae\x5d\x93\xe6\xb3\xfa\x5b\x95\x9c\x0e\xfc\xd1\xcc\xfc\x50\x91\x03\x7c\x88\xbc\xbc\xfa\xee\xc0\x2d\x04\x36\xa2\x6c\xe4\xe5\xb3\xda\x08\xd5\xa1\x40\x80\xf4\x7f\x44\x30\x0a\x89\x56\x6f\xc7\x95\x46\x47\x52\xd8\xae\x33\x0b\xaa\xc8\x94\x31\x11\x0c\x8a\x2a\xf0\x7b\xfb\x34\x94\x02\xb5\x71\x4a\x50\xc1\x1b\x8b\xfe\x97\x51\x0d\x13\xf2\xbd\x11\x6d\x72\xc6\x84\x59\x46\x3c\x82\x2d\xc0\x0a\xb9\x0c\x78\x2f\xba\xf4\x82\x85\xa9\x03\x58\x11\x94\xf1\x59\x33\xc9\xcd\x19\x23\x4d\x3a\x69\x8b\xc4\xa7\x12\xd3\xd7\x16\x90\xb9\x47\x6c\x7f\x08\xbb\xf2\x41\x69\x4d\xf6\x47\xc5\xb9\x19\x01\x89\x04\x23\xd4\x9c\x6d\xed\x9d\x66\x81\x18\x5d\x36\x03\x38\xbd\x38\xf7\x65\x64\x27\x64\x3c\x1e\xdb\x78\x31\x9d\x17\x91\xc6\xd2\x50\x1a\x1b\x19\x99\x51\x63\x9e\x03\xb7\x52\x0c\x2c\x41\xae\x5f\x9b\xc5\x4e\x0c\xf2\x82\x80\xcc\x89\xb5\x5e\x95\xa0\x98\x90\x6a\xcc\xde\x07\x01\x90\x20\xaf\xa5\xb4\x9b\x84\xdf\xfc\x27\x39\x39\x21\x97\x35\x03\xf9\xd4\xc8\xad\xb6\x3f\x0a\xc8\xff\x33\x29\x0f\xab\xa6\x32\x36\x31\x2f\x7e\x23\xe4\x9d\x68\xfa\x3a\x7c\x8b\xe6\xec\x05\xf9\x70\x70\x7a\x4b\x79\x62\x50\xf8\xc3\xc1\x88\x7c\x38\xb8\xb0\xe1\xca\x5c\xcc\x3f\xd8\x76\x07\x1f\x0e\xce\x18\xf4\xe0\x8e\x3f\x1c\x98\x61\x7f\x07\x0d\xdc\xde\xb2\x7c\xce\xbe\x61\xcb\xff\x82\xc1\xfc\xed\x2b\x6c\xf6\xb6\xfc\x2f\xec\xf5\x66\xee\x1b\x82\x75\xbd\xcc\xd8\x7f\xa5\x34\xf3\x37\xde\xd2\xcc\xbf\x1c\x44\x62\xfc\xf0\xa3\xa1\xf4\xb7\xcf\x27\xe5\x8e\xfe\xf4\x77\x25\xc5\x8b\x0f\x07\x41\x09\x4f\x99\x1a\xcc\xc8\xf4\xf2\xc3\x01\xa9\x7c\xf5\xc5\x87\x03\xf8\xae\xbb\xef\x26\xf9\xe2\xc3\x81\xf9\x92\xb9\x9d\x4b\x2d\xa7\xc5\xec\xc5\x87\x83\xe9\x52\x33\x35\x7a\x3e\xca\x59\x36\x32\x07\xfb\xbf\xca\x2f\x7c\x38\xf8\xc9\xec\xc9\xc9\x09\xb6\xd9\xc0\xcd\x54\xe4\xdf\xcd\xbd\x31\x7a\x30\x8b\xad\xfa\x1a\xd6\x3e\xba\xad\x3e\x16\xda\xcd\x77\xb1\x9e\xed\xd9\xa0\x7a\xe7\x5a\xa1\xab\x2f\x96\x9d\x2b\xf7\x8b\x08\xb1\xe7\xd7\x37\x7f\xf7\xea\x28\x98\x9e\x51\xff\x2c\x47\xc5\x18\xcc\x78\x42\xb0\x3b\x22\xe6\x20\x1a\x51\x09\x3c\xe8\xd0\xb5\x45\x90\x42\x39\xb1\xad\xaa\xe0\x1a\xda\x81\x67\xde\x0e\x03\x92\x5f\x14\xb1\x4c\x9b\xd3\xf5\x40\x35\x4d\xbb\x55\x06\x4d\x57\xac\xfb\xbb\x47\x6e\x20\xa8\xad\x99\x9f\xba\xce\xbe\xb8\xac\x3d\x17\x9f\xd2\x8f\x6f\xa0\xc1\xd3\x0b\xf2\xfb\x2f\xfe\xf8\xe5\x9f\xd6\x99\x76\xa7\xa8\xd0\x7f\xbd\x31\x75\xb9\x01\x0c\xab\x2f\xd6\xcd\xab\x13\x27\x7f\x4e\xca\xbc\xe8\xb2\x99\x6a\x35\x6c\x47\x31\x4d\xa6\xe0\xc1\x2a\x32\x03\x97\xd7\x2e\x5b\x55\x44\x18\x52\xd8\x38\x18\xf7\x04\x3c\x59\x92\xe7\x5f\x60\x5b\x23\xf8\xf4\x0a\xf9\xfe\xe1\xe3\x8f\x93\x86\x29\x73\x45\xfe\x73\x54\x9b\x8f\x91\x79\x0a\x60\x7a\x06\x71\xd0\x59\x6d\xd4\x55\x1b\x74\xbc\x86\x13\x32\x3f\xdf\x6d\x1b\xd7\xa1\xc5\xc7\x97\x7f\x58\xbf\xbf\xae\x03\xfb\xb3\x3e\xfc\x8a\xd6\x6f\xe8\x05\x01\x8a\x65\xec\x69\x0a\x39\xfd\x41\xe8\x48\x88\xda\xba\x5b\xf0\x0f\xb9\xc8\x65\x5c\x44\x46\x1d\x93\x33\x17\x99\x1e\x85\x04\x0a\x7a\xcb\x98\xd3\x80\x5a\x36\x61\x1f\x0d\xd0\x59\xd9\x64\xc8\xa8\xbc\x8c\x0a\x2e\xe6\xaa\x2c\xe4\x08\x04\x04\xb9\xee\xdd\x82\x01\xeb\xd1\x61\x4b\x4e\x98\x95\xe2\x31\x84\xcd\x53\x32\x2f\x68\x4e\x85\x66\xd8\xac\x01\xdb\x72\xa2\x8e\x59\x92\x3c\x1a\xd4\xc6\xb4\xa7\x11\x8f\x2a\x12\x2b\x33\x45\xab\x0d\x62\x3b\xd7\xde\x8e\xea\xf3\x67\x5f\x6c\xdc\x72\xff\xdc\x7a\x23\x3b\xd5\x9a\xe5\xe2\x05\xf9\xdf\x1f\x4e\xc7\xff\x8f\x8e\xff\xf1\xe3\x91\xfd\xc7\xb3\xf1\x7f\xfe\x6d\xf4\xe2\xc7\xcf\x83\x3f\x7f\x3c\xfe\xeb\x6f\xfb\x30\xb9\xaa\x5e\x83\xab\x5a\x01\x6d\x7b\xd3\x98\x03\xf3\xd5\x4d\x8d\xb9\xc6\xe4\x00\xa6\xb4\xf9\x19\x3b\xdd\x4d\x4a\x46\x3b\x20\xe9\x7a\x4c\x97\x51\x9f\x4a\x3c\x03\x8a\x67\xc4\xd2\x89\x95\x70\x27\x91\x4c\x4f\x02\x0b\x83\x11\xad\xdf\x52\xb1\x24\x25\x59\x43\xa1\xb4\x8e\xe9\x0a\x12\xcd\x68\x94\x4b\xa5\x2a\x56\xe2\x1b\x46\xbc\xe4\x8a\xc4\x72\xca\x22\x0a\xb2\x78\x3e\xe5\x3a\xa7\xf9\x32\x50\x3d\x5c\x91\xfb\x42\xb1\x59\x91\x90\x23\xc5\x18\x99\x08\x19\xb3\x55\xea\x7a\x8c\x34\x94\x4e\x79\xc2\x35\x64\x85\xc4\xcc\xa8\xda\x09\xb7\x2a\x80\xf3\x60\xbb\x2e\xb8\x73\xf6\x91\x70\xed\x3b\xd1\x73\x45\x8e\x62\xa1\x9e\x3f\xff\xe2\xf7\x57\xc5\x34\x96\x29\xe5\xe2\x75\xaa\x4f\x8e\xff\x7a\xf4\x73\x41\x13\xc8\x60\x79\x47\x53\xf6\x3a\xd5\x7b\x05\x8b\x55\xd9\xe2\xf3\x2f\x5b\x9c\xa2\xa3\x1f\xf0\xac\xfc\x78\xf4\xc3\xd8\xfe\xeb\x73\x77\xeb\xf8\xaf\x47\x1f\x26\x1b\x7f\x3f\xfe\xdc\xac\x21\x38\x81\x3f\xfe\x30\x2e\x8f\xdf\xe4\xc7\xcf\x8f\xff\x1a\xfc\x76\xfc\xdb\xc1\xc8\x5e\x5a\xcd\x03\xdd\xeb\xc1\x8c\xed\x76\x0c\xaf\x48\xd5\x8d\xee\xf5\xdf\x57\x8d\xef\x2b\x93\x47\x23\x7c\x43\x11\xbb\xa8\xf2\x91\xc0\x4c\x5f\x1f\xa2\x65\x45\xbb\xbe\x2c\xf6\xf5\x35\xa2\xa4\x8b\xb8\xe1\x35\x7d\xa0\xf5\x86\xf8\xfc\xb4\xf2\xfc\x4f\x36\x41\x24\xb0\x5b\x81\x31\x73\x59\x0d\x70\x91\x60\xfc\xa9\x96\x8c\xf1\xf9\x82\x0d\xa6\x9d\xc1\x0d\x30\xb8\x01\x06\x37\xc0\xd3\x70\x03\xd4\x8f\x3c\xb8\x03\xa0\x2b\xaa\x0a\x8c\xc9\x34\x4e\xb9\x58\x73\xfc\x37\x9f\x7b\x4b\x1d\x46\x24\x93\x46\x96\xe1\x10\x7e\x2d\x6f\x59\x9e\x73\x08\x7b\xc3\x77\x72\x56\x36\x21\x0c\x43\xd0\x7b\x32\xc2\xc6\x2c\x4b\xe4\x32\x5d\x57\xba\xfc\x7e\x22\x8a\xed\x22\x7b\x0e\x62\x1e\x0c\xbf\x83\xe1\xf7\x17\x64\xf8\x1d\xac\xb9\x83\x35\x77\xb0\xe6\x36\x5c\x83\x35\x77\xb0\xe6\x0e\xd6\xdc\xc1\x9a\xbb\x72\x0d\xd6\x5c\xfb\xcc\x60\xcd\x1d\xac\xb9\x0f\x6d\xcd\x2d\x2f\x55\x29\xea\xfb\x40\x6a\x65\x9b\x68\xa7\x15\x85\xde\xb6\x57\xb5\x2a\x7d\x55\x33\x6f\x50\xe7\xb9\x56\x2e\xd9\x10\x34\xf7\x49\xd8\x86\xed\x61\x7b\xce\x0f\xa1\x53\x83\x06\x3d\x68\xd0\x43\xe8\x54\xe5\x1a\x94\x6d\x7f\x0d\xca\xf6\xa0\x6c\x0f\xca\xf6\xa0\x6c\x0f\xca\x76\xfd\x1a\x94\x6d\xbc\x06\x65\x7b\x50\xb6\x1b\xae\x4f\x43\xd9\xde\x14\x3a\x35\x33\x28\xeb\x6e\x6e\x8b\x9d\x22\x61\x50\xcd\x17\x43\x50\xcd\x10\x54\x33\x04\xd5\x0c\x41\x35\xee\x7a\xe8\xa0\x9a\xaa\x05\x0e\x23\x5f\x2a\x16\x37\xc0\xd9\x2c\x97\xb7\x3c\x66\xaa\x16\x82\xe3\xeb\xed\x05\x5c\x26\x85\x0e\x7d\x65\x58\x0d\x7b\x98\xa0\x9a\xc1\x3c\x37\x98\xe7\x06\xf3\xdc\x60\x9e\xab\x5e\x83\x79\xce\x5f\x83\x79\x6e\x30\xcf\x0d\xe6\xb9\xc1\x3c\x37\x98\xe7\xea\xd7\x60\x9e\xc3\x6b\x30\xcf\x0d\xe6\xb9\x86\xeb\xd3\x30\xcf\x85\x18\x34\xa4\x57\x0c\xda\xe7\xa0\x7d\x3e\x3d\xed\x73\x50\x29\x07\x95\x72\x50\x29\x1b\xae\x41\xa5\x1c\x54\xca\x41\xa5\x1c\x54\xca\x95\x6b\x50\x29\xed\x33\x83\x4a\x39\xa8\x94\x43\x7a\x45\xc7\xf4\x8a\xf7\x6f\xde\x06\xf1\x1c\x18\xe7\x11\x60\x16\x34\xd8\x86\xc2\xbb\x8e\x27\x0f\xbe\xd8\x41\x1b\x1e\xb4\xe1\xc1\x17\x6b\xaf\x41\x71\x1e\x14\xe7\x41\x71\x1e\x14\xe7\xca\xc6\x0d\x8a\xf3\xa0\x38\x57\xb7\x72\x50\x9c\xbb\x03\x6d\x50\x9c\x07\xc5\xb9\x61\x2b\x7e\x19\x8a\xf3\x50\x65\x56\xcb\x1c\xaa\xc7\x3e\x7c\x85\xd9\xaf\x7d\x8b\xcf\xd5\xea\xb2\xf0\xdb\xda\xca\xb2\x38\x61\xf8\xa9\xa9\xaa\xac\x44\xac\x5c\x2d\x27\xeb\x9a\x8a\x3e\x42\x29\x59\x6c\x0c\x64\x15\x87\x42\x70\x10\x7b\xd2\x22\xd1\x5c\x33\x41\x45\xb4\x04\x36\xfb\xfe\xcd\x5b\x92\x52\x41\xe7\x41\x6f\x1f\x35\x21\xe7\x1a\xe8\x8d\xce\x7d\x33\x27\xdb\x7f\xc8\x27\x80\x84\xed\x8e\xa0\x12\x85\xef\x38\x04\x0a\x87\x13\x02\x58\x0c\x02\xa0\x61\x1f\xd0\x9d\x28\x6c\x4c\xf4\x59\xfd\x80\x0f\x29\x31\x43\x4a\xcc\x90\x12\xf3\x44\x52\x62\x80\x7e\xac\x6d\x39\x57\x21\x32\x3b\x34\xe2\x8a\xd9\x8c\x16\x49\x43\x73\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x33\x7c\xb2\x83\x89\x55\xb1\x84\x45\x5a\xe6\x5b\xdb\xd6\x5d\xd9\x07\xed\x1b\xb8\xcc\xca\xd2\x0e\xd5\x66\xba\xd5\x62\xa5\xdb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xc7\x0c\x2c\x8d\x6b\x4c\xc3\x2b\xb3\xaf\xbf\x84\x27\xca\x35\xdd\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfa\xee\x6c\xd5\xca\x5d\x5d\xe0\x3a\xc3\x34\xd9\x6c\x9c\x5e\x99\xfa\xe9\x86\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\x37\x6c\x89\xf4\xb1\x92\xa5\x65\x1e\xce\x19\x50\x53\xd8\xcc\x1b\xb6\x84\x87\x2c\xb1\xdc\x22\x60\xf6\xd2\x47\xfc\x86\xad\x83\x10\xfe\xee\x26\xbb\x5e\x40\x6d\xd5\xb1\xfb\x86\x2d\x37\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xc6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x43\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x72\x43\xea\x0d\x3e\x9c\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x4f\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x74\x40\xf3\xf4\xb9\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xc3\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\x76\x10\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\x9b\xe8\x0a\x5e\x5b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x14\xa4\xff\x84\x55\x7e\xb3\xcd\xc1\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x6e\x69\x62\xe8\x1d\xd8\xe7\x09\x4b\x90\xfa\x19\x21\xbd\x46\xd8\x47\xe4\x6e\x21\x15\x12\x33\xb4\x52\x71\x45\x0e\x6e\xd8\xf2\x60\xb4\xb2\xb5\x07\xe7\xc2\xba\xa9\x56\x36\xd3\x13\x51\x29\x92\x25\x39\x80\xdf\x0e\x76\xe7\x05\x1b\x89\x25\x8d\xd1\x7c\x40\x93\x8b\x16\xd4\x6c\xe3\xbe\x55\xfd\xcb\xeb\x3a\xef\xd7\xf8\x7a\xfd\x15\x47\xfc\x30\x35\x37\xd4\x4d\xe0\x49\x42\xf1\x51\xeb\x07\x86\xe6\xa8\x68\x1e\xc1\x0e\xb0\x10\x35\xed\xe1\x7c\xa4\x8e\x71\x67\x8d\x3c\xea\x60\x0f\x9a\x5e\xe7\x96\xef\x46\xa1\xe7\xd1\x05\x66\x10\xc7\xa7\x17\xe7\xdb\x7b\xed\x5e\xc1\x2b\x44\xb3\x24\x41\x2f\xb6\x91\x59\xb5\xb4\x32\x6b\xa3\x08\x93\x05\xe3\x07\x4a\xfe\xda\xc9\x36\xb5\x6f\x85\x5f\x41\x14\xf2\x4a\xec\xf6\xb9\x5e\xd7\x5e\xb0\xe4\x8e\x7d\xcc\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\x08\x76\x42\x3e\x8e\x6f\x8a\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xd5\x23\x50\x17\x61\xb7\x41\xe9\xe0\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x72\xa5\xd7\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x64\x5e\x1b\xd2\x1c\x4d\xf2\x41\x38\x41\xfb\x45\xd9\x1f\x18\x08\x05\xc4\x4b\xb8\xdc\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x5b\xe6\xd4\x58\x64\x09\x86\x19\x64\x0b\xaa\x58\xa9\x83\xa9\x22\x8a\x18\x8b\x59\x8c\x3f\x58\x56\xc2\x66\x33\x16\x69\x7e\xcb\x92\x25\x18\xff\x15\x8a\x24\xfe\xfb\x06\xb3\xf1\xf3\xe5\x82\x6b\x5f\x14\xec\xa3\x76\x4a\x3a\xe1\xa0\x84\x57\x2d\x15\xb9\x5f\xee\x82\x2a\x32\xa3\x3c\x31\x7a\xdd\x07\x41\xae\x59\xb4\xb8\xc8\xd9\x2d\x67\x77\xdf\x0a\x45\x67\xec\x35\xe5\xc9\x6b\x99\xdf\xd1\x3c\x0e\x60\x70\x1f\xcb\x37\xb3\xf2\xbf\xe1\x94\x1c\x5c\x4e\x3d\xe1\x4c\x96\x41\xa7\x66\xeb\x19\x33\xeb\xbd\x73\x0b\xbc\x48\x0c\xc4\xc0\xe1\x4a\x8d\x42\xeb\x31\x8a\xe4\x6c\xc6\x72\x26\xcc\x79\xa2\x6e\xfc\xe0\x25\xcf\x1e\x22\xaa\x69\x22\xe7\x65\x93\x69\xab\xf7\xa2\x63\x8c\xc2\xc7\x1c\xf4\x9c\x1b\x88\x19\x51\x01\xda\x81\xe0\xd9\x0d\x8c\x46\x1f\x04\xf9\xfe\xf4\xf2\xdd\xf9\xbb\xaf\x5f\x00\x57\xd9\x04\xe1\x55\xbc\xe6\x8a\x14\xf0\x54\x60\xf5\x50\x45\xa2\x0d\x8a\x17\xc2\xfb\x8b\xa6\x6c\x41\x6f\xb9\x39\x03\xb9\xb5\x87\xdc\x32\xec\x2c\x6e\xd4\x60\x92\x48\x65\xc6\x49\x98\x52\x64\x29\x0b\x8c\xe3\x89\x19\xcb\xd0\xc5\xad\x34\x15\xd0\xcc\xc4\xfa\x33\xea\x8b\x20\x53\x66\x7e\x75\x16\xb1\x95\xd3\xd5\xe4\x4f\xd8\x42\x39\x9c\xa6\xbb\x46\x91\x25\x1b\x1d\x1e\xe3\x0d\x6f\x99\x5f\x37\x81\xb8\xaa\xf6\xb7\x0f\x98\x42\xc5\x7f\x53\x07\xee\xf0\xc1\xcb\xee\xba\xff\x7a\x3d\x0a\x03\x3f\xbe\x45\x2c\xec\xa0\xf1\x6f\x0e\xaa\xaa\xac\x32\x08\xae\xa9\xc9\xde\x4d\x9c\x33\x08\x12\xea\x93\xd9\x0c\xd1\x5a\x43\xb4\xd6\x10\xad\xd5\xf4\xfb\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x43\xb4\xd6\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x64\x88\xd6\x2a\x9f\x19\xa2\xb5\x86\x68\xad\xc7\x4b\x73\x0a\x14\xd3\xad\x3a\xe6\x9b\xf2\x59\x94\x4e\xb4\x8b\x87\x72\x27\xb3\x2a\x1a\xd6\xb5\x4e\x7b\x8a\x0d\x3f\xb6\xc3\x74\x36\x2c\xb7\x11\xba\x44\x7b\x43\x6e\xd5\x84\x1b\x58\x4e\x56\xbc\xe3\x9e\x03\x55\x16\xf5\x54\x4d\xb5\x55\xe7\xc2\x25\x9b\x75\xf4\x2d\x5c\xb2\x59\x68\x6d\x43\xc0\x54\x5d\x0a\x36\x62\xc5\xfb\x1c\xee\x21\x7c\x60\x7d\x8c\x53\xe3\x12\x8c\xb0\xef\x4c\xa6\x16\x1f\xed\x1a\xd6\xfa\x42\xb7\x1e\x69\xe0\xc7\x17\x54\x2f\x5a\xcd\xe0\xf0\xdc\x82\x0d\x1c\x87\xe0\xca\xcd\x38\x8b\x58\x25\x8c\x0a\xe4\x38\x46\x63\x7b\xd3\x08\x3e\x39\xb3\xbf\x8d\x50\xe2\xb0\xee\xd2\x32\xcc\xca\x08\x4d\x84\x1a\x42\xcc\x63\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\xad\xac\x60\xb4\x19\x65\x1b\x26\xa5\x4c\xe8\x11\x51\x45\xb4\x20\x54\x99\xa9\x19\xfd\xf6\x0a\x4c\x0f\x29\x15\x7c\xc6\x94\x9e\xd8\xd1\x58\xae\x7e\xf8\xe2\xc7\x49\xd5\xe2\xc1\xad\x4f\xd5\x05\x23\x59\x04\x80\xb3\x61\x16\xe3\xdf\x05\xa1\x15\xa6\x94\xc9\xd8\x4e\xfa\x0e\x26\xab\xe9\x0d\x23\xd2\x4e\xb6\x60\xc0\x14\x5e\x90\x03\x83\x26\xc1\xa7\xff\x69\x0e\xd6\xbf\x0f\xc8\xd1\x1d\x58\xf5\x0f\xcc\x9f\x07\xf8\x41\x1f\x3b\x66\xee\x05\x1c\xdf\x7e\x18\xe5\xfb\x9c\xcf\xe7\x20\x6e\x81\xe9\xf6\x96\x09\x7d\x0c\xfc\x6d\x46\x84\x0c\x1e\x16\xd6\x45\x56\x3a\xc6\xea\x13\xf9\xe1\x8b\x1f\x0f\xc8\x51\x75\x5d\x46\x04\x65\x1f\xc9\x17\xde\x19\x96\xc9\xf8\xd8\x69\xad\x4b\xa1\xe9\x47\x50\x0c\x16\x52\x31\x81\xbe\x04\x2d\xd1\x20\xab\xa4\x51\x3e\x59\x92\x8c\x51\xc0\x8c\xc9\x1d\xda\xe0\x1c\x28\xd1\x9f\x9c\xd1\x5c\xd7\x22\xeb\xae\xdf\x9f\xbd\x7f\x81\x5f\x33\xdb\x36\x17\x4e\xcb\x9d\x71\x41\x13\x6b\xd9\xf6\xf2\xa1\x99\x48\x81\x9b\xa4\xa5\x55\x6d\x9d\x51\x77\x56\xe8\x22\x67\x93\x7a\xa4\x55\x6b\x8c\x6f\x0a\x73\x6b\x46\x76\x08\x77\xab\x1f\xb4\x47\x0c\x26\x6b\xbd\x44\xb1\xc6\xd9\xba\xba\xc4\x77\x01\x0e\x6e\x5c\x62\x49\x9a\xcd\x2a\x63\x19\x29\xb3\xc0\x88\x65\x5a\x9d\xc8\x5b\x43\x3a\xd9\xdd\xc9\x9d\xcc\x6f\xb8\x98\x8f\x0d\x92\x8d\x71\xe7\xd5\x09\xb0\x98\x93\xdf\xc0\xff\xf6\x5a\x11\xf0\xa9\xf6\xcb\xc2\x98\xd6\x07\x58\x1b\xb0\xcf\x93\x9d\x97\xe6\xe4\xcb\x2e\x9c\xe0\xf0\xca\x29\x7f\xb5\xb7\xcd\x71\x41\x5f\xb8\x0d\x76\x0d\x28\x5c\x4a\x63\x24\x81\x54\x2c\xef\x1d\x8d\x0d\x00\x41\xc7\x8f\x96\x63\x1b\x8d\x3e\xa6\x22\x1e\x7b\xf9\x3a\x5a\xee\x0c\xb1\x82\xb7\x3c\xc0\xdf\x9e\x9f\x3d\x0c\x72\x17\xbc\xd3\x69\xed\x2b\x97\x80\x54\xe2\xcf\x69\x92\x2d\x68\x5f\xbd\x17\x86\x28\x74\xb8\x86\x28\xf4\x21\x0a\x7d\x88\x42\x2f\xaf\x27\x12\x85\x3e\x44\x91\x0f\x51\xe4\x43\x14\xf9\xfa\x9f\x87\x28\xf2\x21\x8a\x7c\x88\x22\xaf\x5f\x43\x14\xf9\x10\x45\x3e\x44\x91\x0f\x51\xe4\x0d\x57\x1f\x05\xeb\x3e\xc1\xf8\xcb\xc1\x39\xf6\x69\x38\xc7\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x07\x8c\x1f\xdc\x5d\x83\xbb\x6b\x70\x77\x0d\xee\xae\x27\xea\xee\xea\xd4\x65\xfc\x93\xae\x9d\xf5\xf0\x65\xb3\xe0\xd6\x6a\xc5\xac\xb5\xc5\xb2\x6c\x9d\xac\x95\x62\x58\x65\x1d\xac\x97\x98\x4e\x79\xff\x45\xb0\xaa\x06\x40\xd7\xa0\xb9\x43\x53\xf6\xc1\xa1\x37\x38\xf4\x06\x87\xde\xb6\x53\xd2\xc1\xa1\x07\xbe\xbc\xf0\x28\x58\x75\xa4\x4c\xe1\x78\xdf\xec\xda\x58\xff\xe9\xf6\xa6\x15\x6b\x55\x09\x3f\xef\x72\x51\xca\xef\x07\x16\x16\x38\x29\x66\x43\x23\x99\x66\x52\x18\xc4\xe8\xc7\xb9\x58\x8e\xd7\x22\x61\xd5\x3d\x6a\xef\x4f\x59\x18\x4c\x6e\x3d\x5b\x69\x26\x15\xab\xd8\x71\x77\x50\xbc\x37\xbb\xa6\xc6\xe8\xf4\x71\x26\xb4\x1d\x14\xf7\xca\xfb\xad\x64\x91\x37\xe1\x1b\xd6\x35\x09\x9e\xa7\x9f\x0b\x96\x63\x1b\xfd\xd2\x81\x53\x02\xc5\x99\x5c\xd1\x25\x55\x01\xcb\xe1\x86\xcd\x6c\x09\xa6\x36\x4b\x25\x1d\xfc\xb1\x2b\xab\x7e\x50\x9f\x2c\x69\xed\x3f\x69\xe1\x3d\x79\xda\xfe\x59\xd2\xd6\x47\x4b\x5a\xfa\x69\x49\x0b\x5f\x2d\x69\xe7\xaf\x25\xad\x7d\xb6\xa4\x8d\xdf\x96\xdc\xb3\xef\x96\xb4\x77\x6a\x92\xd6\x3e\xdc\x95\x49\x3f\x39\x3f\x6e\xc7\x65\xb7\xf1\xe7\xae\x2c\x7a\xf0\xe9\xd6\x40\xbd\xdd\xaf\x4b\xda\xfa\x76\x49\xfb\xf4\xa4\xad\x3e\x5e\x32\xf8\x79\xbb\xf1\x97\xad\x44\xb7\x9b\xbf\xb7\xd5\x5e\xe6\x6c\xd6\xce\x49\x7f\xc9\x66\xb8\x98\x40\x9c\x28\x1d\x1d\x72\xad\x0c\x51\x4a\x1d\x23\x4b\x45\x5d\xfd\x9c\x8a\xec\xf2\x30\x11\x51\x97\x3c\x5a\x5c\x86\xc6\x2b\x1a\xd8\xb2\x80\x46\xba\xd9\x8e\x08\x13\x39\x8f\x16\x6e\xb2\x46\xc8\xb5\x9e\xb5\xcd\x35\x4f\xc2\x69\x6f\xd9\xd0\x76\xec\x6c\xbb\x37\xa7\x61\xa1\x3b\xf8\x74\xc2\x89\x6f\x25\xde\x9b\x0b\xca\xac\x99\x54\x50\x09\xa4\x96\x81\x6f\xf5\xf0\x4a\x96\xba\xc7\xa0\x07\x0c\x6d\x69\x9e\x6e\x39\xdb\x70\xb2\xd4\x25\xa8\xae\xd6\x6c\x11\xe5\xe4\xad\x43\x76\x43\xae\x7d\xb8\x8c\x16\x62\x57\x7b\xc1\x6b\x6b\x3d\x90\xf0\xc1\xb5\x95\x41\xca\xab\xbd\xf4\xd5\xad\x5a\x48\x79\xad\xf8\xc1\xf7\xa9\x0e\xd2\x17\xa7\x2b\xaf\xb6\x65\x3a\xaa\x60\x40\x27\x7c\xaf\x20\xb8\xa3\x10\x6d\x32\x5d\x89\x41\x78\x94\x45\x6e\xad\x4a\xb2\x66\x75\xa7\xfb\x16\x25\xe9\x7b\xf1\xdb\x0a\x51\xac\x59\xc7\x75\xb7\xea\x12\x7d\xcf\x7a\x5b\xfd\x83\x35\xb3\xbe\xea\xb5\x12\xc2\x8e\x73\xdf\x5c\x94\x60\xcd\xcc\xaf\xeb\xe5\x09\x7a\x9c\xd6\xd6\xb8\x85\x86\xf9\x0c\xd1\x0b\x43\xf4\xc2\x13\x8f\x5e\xe8\x74\x06\x36\x45\x32\x34\xa1\xff\x53\x8d\x67\xe8\xb4\xe8\x4d\xb1\x0d\x4d\x8b\x7e\x22\x11\x0e\x9d\xd7\xb8\x31\xda\x61\xdd\x42\x9f\x48\xcc\x43\xa7\xc5\xb6\x8c\x7f\x68\x5a\xf2\x2f\x39\x0a\xa2\x13\x0c\x37\x44\x44\x34\xc1\xed\x49\xc4\x45\xac\x5d\xe0\xaf\xba\xb1\x58\x58\xfe\xf8\xe1\x02\x24\xae\x82\xaf\xd6\x82\x24\xc2\x9f\x56\x02\x25\x2a\xb3\xc5\x60\x89\x86\xa6\x62\xaa\x98\x86\xff\xae\x47\x55\xa8\xea\xc7\xdb\x74\x18\x0b\xed\x6b\x10\x13\xf0\x52\x26\x45\x1a\xda\x38\xc6\xab\xa2\x7f\x46\xa3\x1b\xa3\xb5\xd8\xef\x4d\xc1\xb3\x16\x20\xe7\xdf\x95\x14\x20\x51\x92\x09\x88\x21\x06\x82\xc1\xcf\xb8\x3f\x17\x38\xc8\x67\x1b\x31\xb8\xf1\xf3\xae\x46\xb5\xf5\xd6\x3b\x0d\xa4\x14\x7e\xb2\x95\xa1\xeb\x33\xc2\x57\x57\xe6\x74\x55\xbf\xdd\x7a\x4a\x0b\x2a\x04\x4b\x0c\x2d\x40\x8f\x3e\x48\x77\x1e\x3e\x9b\xc1\x63\x5f\x5e\x99\xcd\xcb\x95\xfb\x0d\xd3\xa9\xa4\xe8\xef\x1b\x23\x13\xa2\x28\xb9\x61\x2c\x53\x81\xb3\xa4\x00\x9f\x0a\xe4\x82\x4c\x97\x46\xbd\x8b\x6e\xa0\xdc\x28\x48\x65\xb0\xde\x97\xb8\x31\x3d\x27\xd0\x03\xb2\x67\x2c\x0a\x6e\x0d\x21\x38\x43\x08\xce\x10\x82\xb3\xed\x8c\xb5\x08\xc1\x09\x0f\x7c\x25\x0c\x87\x0a\x72\x9a\x65\x09\x18\xa5\x5c\x69\x58\x5b\x73\xd0\x16\xdc\x58\xb1\xc4\xed\x98\x5e\x54\x63\x0e\xee\xf6\x0a\x85\xae\xfe\xe0\x99\x5a\xed\x89\x8d\x11\x36\x48\x4f\x9b\xe4\xbb\x8d\xd2\x61\x24\xc5\x8c\xcf\xb7\xe7\xc5\x04\xb0\x7c\x09\xaf\x94\x1e\x33\x1c\xa2\xb0\x95\x6d\x4b\x4e\x05\xe9\x5b\x15\xbe\x7d\x1f\xc9\x31\x33\x90\xc0\xd6\x86\x07\x54\x56\x71\x3e\x2b\xa7\x37\x82\x68\x9a\x9c\xc7\x96\x3e\x66\x32\x3e\x54\x40\xcd\xe2\x22\xb1\xa5\xa6\xb1\x14\x8b\x39\x9a\x82\x27\x66\x25\x63\xaa\xf1\x3c\x30\x85\xf9\x8e\x9f\x0b\xa9\x3f\xf7\x23\xa1\xe1\x25\xe7\x73\xee\x49\x9f\x6f\x59\x92\xc9\x78\xe2\x8b\x39\x68\x70\x59\x56\x07\x9c\x90\x6f\x95\x75\x30\x3b\xe2\x70\xf4\xcf\x7f\x1f\x1b\xc2\xca\x72\x2c\xd4\x69\x07\xae\xbc\xb7\x25\x0a\xa4\xa7\xd8\x1e\x21\x63\x76\xba\x05\xd4\x2b\xe0\x3e\xf3\xf1\x5b\xe6\x75\xbf\x55\x21\x90\xf3\x22\x09\xd2\xc4\x0c\x8c\xf6\x77\xab\xb6\x75\x6c\x64\x68\xe5\x63\xf1\x19\xb8\xed\xaf\xfc\xac\xce\x31\x53\x12\x6f\xbf\xfa\xc8\xa2\x42\x6f\x55\x39\x1b\x8c\xc8\x76\x99\x60\x90\x4a\x12\xfb\x39\x10\x9d\xec\x0f\x66\xbd\xc0\x38\x0d\x78\x6c\x68\x9b\xa2\x9a\xab\xd9\x12\xf3\x6e\x1d\xc0\x58\x10\x1b\x55\x9e\x2f\x23\xa8\x04\x75\x88\xa7\x85\xc6\xd2\xa6\x4b\x12\x2d\xa4\xc1\x2f\x8a\x70\x87\x71\x6f\xb9\xc4\x00\x22\xb0\x07\xe7\x24\x35\x1c\xc0\x6a\x77\xc1\xf0\xe8\xf1\x2e\x5f\x33\xaa\xb0\x54\xba\x84\x95\x0b\xaa\x31\xc3\x80\x9d\xcd\xfc\x31\x37\xea\x0a\x78\xfc\x8a\xd4\x0c\x7a\xc7\xf8\x7c\xa1\xd5\x88\xf0\x09\x9b\xc0\xee\x32\x1a\x2d\x82\x61\x53\xc6\xb4\x22\x34\x49\x7c\x63\x92\x00\x25\x42\x77\xfb\x91\x67\x9a\x96\xc1\x8d\x3c\xbd\xad\xef\x5a\x23\xb8\x46\x84\xe9\x68\x72\x3c\x02\x0f\x9e\x39\x2d\x14\xe6\x38\x5d\x12\xae\xa1\x16\x37\x30\xe8\x5c\x16\x73\x5c\x89\x0d\x34\x50\x5e\x3a\xb2\xf6\x59\x11\x83\x36\x21\xe6\xe4\x00\x17\x77\xe0\x04\x1e\x33\x9c\x35\xb9\xc2\xfa\x5c\x69\x59\xb4\x78\xe6\x39\x53\x99\xc4\x1e\x2c\xf5\xc8\x85\xff\xcf\xbf\x74\xa4\x8e\x4b\x60\x2e\xf8\x7c\xe1\x60\x49\x73\xa4\x29\xd5\x3d\x68\xe7\x7c\x6c\x13\x46\xd2\x32\x88\xa4\xea\xe7\x71\xe5\xe2\x4b\x9c\x08\x76\x4f\xb3\x3c\xf5\x30\x80\x0d\x46\x5d\xdf\x1a\x65\x53\x9b\xc3\x8c\x40\x24\xcf\xc8\x11\xa0\x08\xd7\x87\x0a\xd0\x75\x2c\xb3\xe3\x09\x39\x05\x6d\xb7\xc5\x07\x84\xf4\xe3\xdb\x81\xcc\x47\x95\x2c\xc7\x6a\xe7\xb3\x68\xe7\xa9\xed\xe2\xab\x35\xdc\x3c\xf3\x26\xa5\x56\x8f\x23\x4c\xb6\x3e\xda\xc5\x6f\x4b\x82\x39\xb4\x79\x7a\xc5\xa5\x07\x28\x5d\x86\x2d\xb2\x3c\x1d\x11\xaa\x94\x8c\x78\xd9\x38\x69\x15\xd3\x71\x25\x6d\xfc\x38\x1d\xe1\x4f\x3a\xaf\x9f\x74\x0c\x4c\xad\x5e\xf5\xf8\x4e\x1b\x92\x5a\x85\x4a\x85\x60\x4d\x97\xf0\x2b\x38\x0a\xa7\x2c\xd9\x12\x9d\x19\x5e\x5d\x82\xbf\xdc\xd5\x3a\x08\x6c\xcd\x82\xd6\x2e\xe4\xd1\xe2\x55\x9b\x60\xd2\x01\x39\xf0\xea\x72\x4c\xcb\xab\x4d\x64\x6b\xfd\x8d\x56\x71\xae\xd5\xab\x3b\xfe\xe2\xd5\x2a\x06\xb6\x7a\xad\x88\x24\x7d\x85\xc2\x56\xaf\x8e\x21\x09\xe5\xd5\x3e\x4c\x76\xc3\xba\x2e\xef\x2b\x56\x76\x54\x0d\x94\x25\x5f\x6b\xc4\xf5\x37\x2d\x29\x5b\x0f\x00\x6a\x1b\x50\xbb\x01\x3c\xa7\x9f\x4c\x50\x6d\xc3\x50\x5f\x6b\x33\xcc\x9b\xb5\x2f\x83\xc3\x96\xba\xe0\x52\x2b\xbc\x8d\x6a\x05\x69\xc0\x16\x95\xe5\xcc\x30\x2c\xec\xfd\x65\x3b\xa1\xdc\x5b\x1c\x6f\xd3\xee\x77\x23\xec\x78\x75\x26\xef\xe1\x07\x3b\xa1\x1b\xb0\xc8\xd7\xd0\x38\xeb\x61\xb8\x23\x36\xe9\x1a\xb8\xe3\xc0\x1d\xab\xd7\xc0\x1d\xfd\x35\x70\xc7\x2d\xd7\xc0\x1d\x07\xee\x78\xef\xdc\x11\x75\xd9\x1d\x94\xe7\xef\xd1\xc4\x51\xd7\x96\x81\xd3\x3a\xbf\x50\x55\x6d\x36\xfc\xc6\x25\x50\x5c\x83\xaa\x6d\x6d\xc7\x39\xc4\x86\x3d\x1f\x3f\x7f\xf6\xac\x8b\x52\xbd\xad\xe1\x5b\x78\x05\xcd\xdf\x7e\xff\xc5\xc6\x37\xd6\xd9\xdf\x7a\xb0\x9a\x5a\x1c\xf7\x86\xbc\x8a\xec\xb0\xc6\xf0\x09\xd4\x49\x48\x4d\x52\xa6\x09\xd5\x15\x53\x11\x4f\xd9\xc8\x19\x96\xcb\x16\xdb\xd3\xd2\x34\x1b\x13\x29\x5c\xa4\xa2\x8c\xd9\x64\xb7\x19\x44\x8c\x2a\xc8\x37\x99\x32\x3f\x0b\x99\x9a\xaf\x72\xa1\xdd\x71\x31\x53\x60\x0e\x2a\xe4\x88\x4d\xe6\x13\x12\x17\xcc\x26\x38\xa1\x9f\xce\xb6\xb3\x52\x4b\xa5\x59\x0a\x96\x5c\x99\xfb\xa6\x6f\x3a\x87\x18\x45\x08\x94\x2c\x68\x92\x2c\x09\xbb\xe5\x36\xdb\xd7\x0c\x0e\x6e\x42\xa8\x09\x6f\x56\xd2\xca\x44\xd8\x7b\x7e\x42\x1d\x83\xb7\xa5\x2a\x74\xe1\xf6\x2b\x63\x77\x8e\x34\xbe\xb4\x2b\x99\xac\x15\x56\xb5\x19\x17\x6d\xe0\xf0\x4f\x40\xae\xf7\x97\xdb\x4d\xae\xa4\x33\x25\xeb\x40\xbd\xea\x62\x69\x91\x24\x06\x31\xd0\x0a\xbb\xba\x80\x06\xeb\x68\x43\x22\x1b\x1a\xde\xd3\x20\xa1\x0d\x9b\x98\xcb\x4c\x26\x72\xbe\x0c\x21\x8d\x1d\xe4\x78\x9a\x39\xe3\x38\x7a\xf5\x98\x6f\xd0\xfc\xae\xb6\x35\x83\xe5\x6f\xb0\xfc\x0d\xba\xcd\xca\x35\xe8\x36\xfe\x1a\x74\x9b\x2d\xd7\xa0\xdb\x0c\xba\xcd\x60\xf9\x23\x03\x77\xdc\x00\x93\x81\x3b\x92\x81\x3b\xae\x5d\xd7\xc0\x1d\x37\x82\x67\xe0\x8e\x03\x77\x6c\xba\x32\x19\xef\x11\xe8\x98\xc9\x78\x43\x9c\x23\x5a\x7d\x22\x39\x4e\x64\x84\x6d\x27\x30\x31\xd5\xd9\xf9\x14\x4d\xd1\x10\x35\x22\xff\x90\x82\x61\xf0\x9a\xd9\x1b\x30\x27\x41\x1d\x04\xf3\xf8\x91\x3a\xde\x18\xd8\x34\xc4\x49\x0e\x71\x92\x4f\x3e\x4e\x72\x41\x15\xee\x2b\x12\xa5\xf5\x61\x93\xc1\x81\xbc\x66\x79\xfa\x89\x46\x4d\x1a\x74\xb1\xdb\x0d\x29\x36\xe5\x96\xe2\xca\x63\xeb\x2f\x60\xf1\x45\x75\xbd\x56\x5e\xc6\x5a\x4d\x71\xcc\x62\x92\xb1\x7c\x8c\x28\x22\xc9\x8c\xdb\x62\x56\x35\xec\xb3\xf0\x79\xd4\xe8\xc7\xea\x3a\x1e\x31\x04\xb2\x3a\x91\x1d\x6c\xae\xa1\xe1\xb8\x42\xe1\x9f\x44\x40\x64\x57\xa9\x7e\x4c\xb4\x35\xf2\x7e\xd3\x52\xae\xef\x2e\x9a\xb7\x2a\x7d\xba\x7a\x35\xd6\xd3\xdc\x58\xfb\x74\xe4\x0b\x3c\x44\x54\x21\xa7\xe8\xaa\x5a\x76\x54\xa3\x76\xd3\x53\x76\xb7\x44\x93\x47\x2f\x97\xba\x7a\xed\x2a\xba\xed\x24\xb8\x3d\xfd\x22\xab\xeb\x00\xd4\x59\x41\x27\x3b\x2b\xe9\x64\x27\x45\x9d\xec\xaa\xac\x93\x3d\x14\x76\xb2\x9b\xd2\x4e\x1e\xa0\xc4\xeb\xea\xb5\xb3\x8a\x4a\xf6\xd0\xe3\xc9\x27\x51\x18\x76\xf5\xda\x0b\x58\xbb\xe9\xf4\x64\x28\x27\xdb\xe1\xda\x5d\xe5\x26\xbb\xab\xdd\x64\x77\xcc\x68\x59\x96\x76\xf5\x1a\x0a\xd5\xee\xc5\xd9\x77\x60\x5c\xdd\x8b\xd9\xae\xfb\x78\x27\x2c\xf1\x75\x86\xfa\x17\x36\x75\xd9\xd9\x30\xec\xb5\xe9\x18\x0c\x84\x5a\x04\xcc\xc5\x47\x8d\x00\x8e\xc1\xfd\xd8\x29\xbf\x85\x08\x2a\xb7\x06\x83\xf9\x0a\xba\xb5\x90\x26\xbb\xf1\x52\x30\x05\x82\x1d\xf3\x26\xa2\xb0\xb9\xa2\x79\x76\x82\xe1\x20\x25\xb7\x13\x71\x3d\x40\xa4\x7c\x03\x64\xc4\x94\x51\xa1\xc8\x81\xb3\x3d\x1d\xaa\xf2\x89\x83\x49\x99\xdd\xe7\x47\x84\x24\xe4\x30\xa3\x6f\x73\x53\xf7\x4d\x3b\x3b\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xdd\x78\x0d\x92\x76\x87\x6b\x90\xb4\x07\x49\x7b\xd3\x87\x07\x49\x7b\x90\xb4\xb7\x7f\x7c\x37\x49\x7b\xd7\x38\xa1\x50\xee\xb5\xce\x39\xac\x9c\x05\xad\xf9\x7d\x0c\x91\x2f\x50\x0a\xff\xea\x57\xde\x0e\x65\xe9\x66\x69\x3b\x94\xc8\x57\x74\x8b\xc9\x16\xd1\xda\x0b\xdf\x2b\x6f\x6e\x96\xba\x9f\x56\x2c\xd4\x0e\xb8\x11\x38\x14\x76\x44\x8e\x6b\xe7\x0a\xb7\x95\xe6\xa6\xac\xf4\x93\xc7\xe4\xc8\x79\x5c\xa0\x42\xb4\x90\xba\xfa\xa3\xd0\x7c\x5c\x3e\xe1\x7d\x30\xe0\x5e\xac\xe4\xdb\x24\xd5\xfe\x6a\xa2\x56\x5b\xb1\xdc\x4f\x43\x42\x58\x5e\x99\x03\x77\x8d\xf4\x20\x5a\x22\x2f\x84\x30\xa3\x42\x95\x6c\xf0\xc6\x21\xcd\xc1\x02\x70\xbe\xb3\xbf\x11\x96\x60\x3e\x20\x31\x95\x50\x0a\xfc\x9d\xd4\x96\x91\xb6\xa1\xfc\x52\x58\x8f\xa8\xb9\xe3\xbc\xbe\x0e\x29\x61\x45\xdc\x7f\x7d\x42\x5e\x01\x1e\x86\x03\xdb\x92\xd3\x34\x49\xe4\x5d\x17\x92\xf4\x50\x69\x51\x77\x9d\xd3\xa2\x6a\xfe\xbb\x21\x2b\xea\x57\x92\x15\x05\x3f\xe2\x11\xea\x3d\x3d\x8a\x7c\xbf\x60\x80\x45\x39\x03\x50\xa5\x45\xa2\x79\x56\xc6\x4a\x29\xfc\x54\x82\x52\xe6\xcc\x46\x9e\x54\xf1\xd2\x7c\x8d\x46\x8b\x3a\x7e\xc2\x78\x10\x5b\xa5\xe0\xd0\xda\xe8\x0e\x9a\x24\x36\xa7\xc8\x89\xa4\x18\xc2\xc2\x1f\x3b\x32\xe1\xcc\x55\x45\x74\xda\x0c\x10\x99\x23\x43\x0b\x93\xa5\xad\x54\xb7\x81\x88\xa2\x52\x74\xcb\x1c\xeb\x9d\xf3\x5b\x26\x4a\x4a\x7a\xa4\x8e\x8f\x1d\x0f\xef\x95\xc2\xdf\x0b\x85\xfe\x73\x40\x49\xff\xd2\x86\x46\xc3\x82\x3c\x95\x2e\xc1\x57\xd2\xe8\xc7\x0c\xc1\xe8\xe2\xe7\xef\x66\x63\xd8\xc1\xbf\xff\x80\xbe\xfd\x4f\x27\xb3\xec\x91\x2d\x8c\x8f\x11\x5b\xff\xe4\xad\x8a\x43\x70\x7d\x79\xed\x1b\x5c\x7f\xef\x96\xc3\xc7\x8d\xb1\xff\x04\xac\x85\x8f\x19\x63\x3f\x58\x08\x37\x6e\xca\x53\x0b\x7d\xaf\x5e\x3b\x59\x04\x07\x6b\xe0\xce\x5c\xb8\x23\xc3\xd9\xd7\x0a\xd8\x11\x23\x76\xf4\xb3\x0f\x3e\xf6\x87\xf1\xb1\x0f\x12\x6f\xcb\x6b\x90\x78\xd7\x02\x65\x90\x78\xc9\x20\xf1\x6e\x5b\xde\x20\xf1\x6e\x04\xcf\x20\xf1\x6e\xdc\x94\x41\xe2\x1d\x24\x5e\xf2\xa9\x49\xbc\xbb\x54\xe9\x1a\x7c\xdd\x7b\xf9\xba\xbb\x52\x8b\x4e\x34\xa2\x23\x1e\x74\xf6\x6d\x0f\x7e\xed\xa7\xe2\xd7\x6e\x9d\xf0\x2f\x34\xdf\x37\xe9\x3f\xdc\xab\x75\x99\xff\xf4\x56\xf2\x98\x64\x85\xb6\xf9\xd4\x43\xf6\x7f\x1f\xd9\xff\x15\xc8\x0f\x25\x00\x5a\x95\x00\x58\x07\xb3\xa1\x0e\xc0\x50\x07\xa0\x67\x27\xf4\x50\x07\x60\xa8\x03\x30\xd4\x01\x70\xd7\x90\x9d\x44\x86\xec\xa4\x56\xd7\x90\x9d\xb4\xfe\x1a\xb2\x93\x9e\xac\xf5\x95\x0c\xd9\x49\x4f\xdb\x12\x4b\x86\xec\xa4\xc1\x3a\xdb\x72\xa3\x3e\xc1\xec\xa4\xa1\x0e\xc0\x53\x8d\x51\x20\x83\xa4\x3d\x48\xda\x83\xa4\x3d\x48\xda\x9b\xaf\x41\xd2\xee\x70\x0d\x92\xf6\x20\x69\x6f\xfa\xf0\x20\x69\x0f\x92\xf6\xf6\x8f\x0f\x75\x00\x3e\xa1\xd8\x08\x32\xd4\x01\x18\xe2\x25\x86\x3a\x00\xbf\xde\x3a\x00\x15\xdf\xfd\xe3\x15\x03\xe8\x3e\x8d\xa1\x22\xc0\x50\x11\x60\xa8\x08\x30\x54\x04\x70\xd7\x50\x11\x00\xaf\xa7\x64\x6b\x1c\xf2\xa3\xd6\x02\x65\xc8\x8f\x22\x43\x7e\xd4\xb6\xe5\x7d\x02\x76\xc3\x21\x3f\xea\x09\xda\x0a\x87\xfc\xa8\xc1\x2e\x58\xdf\x9c\x4f\x24\x3f\x6a\xa8\x08\xf0\x14\xbd\xed\x83\xc4\xdb\xf2\x1a\x24\xde\xb5\x40\x19\x24\x5e\x32\x48\xbc\xdb\x96\x37\x48\xbc\x1b\xc1\x33\x48\xbc\x1b\x37\x65\x90\x78\x07\x89\x97\x7c\x6a\x12\xef\x50\x11\x60\xa8\x08\x30\x54\x04\xf8\x14\x3d\xdc\x5b\x77\x9a\x89\xdb\x75\x7b\x5a\xd9\xc5\x57\xe2\xb6\xaa\xa7\x30\x71\xcb\x73\x29\x80\x02\xdf\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\xae\x9d\xff\x76\xc4\xdf\x82\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xed\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xed\x03\xed\xa4\x78\x33\xc4\xe6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xdf\xce\xcf\x5e\xbd\xbb\x3e\x7f\x7d\xfe\xea\x72\x33\xd2\xb5\x24\x2b\x70\x90\x3a\x4c\xf6\xf0\x3b\xb7\x47\x90\xe6\xcd\x84\xa1\xc0\xbf\x3d\xfa\xee\xf4\xf2\x6f\xef\x4e\xdf\xbe\x3a\x06\xf6\xcb\x3e\x66\x54\xc4\x2c\x26\x85\x72\x24\x21\xcb\xd9\x2d\x97\x85\x4a\x96\xfe\x78\x37\x23\x6d\x1d\x5b\xad\xa2\xb9\x24\x8a\xe5\xb7\x3c\x6a\x06\x11\x4a\xb1\xb4\x44\xa0\xc8\x63\x78\xce\x94\x4c\x6e\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x26\x0b\x33\xde\x6f\x7f\x0b\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x3b\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x29\x34\xfd\xf8\x02\x7d\xf0\x07\xbf\x0d\x7e\x3a\x70\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x10\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x5b\x96\x83\x3c\x6d\x77\x61\x44\x72\x36\xa7\x79\x9c\x30\x05\xc1\x03\x77\x0b\x06\xe5\x3c\x50\xc2\xb2\x00\x63\x5e\x5a\x17\x52\x4f\xc8\x19\x9b\xd1\x22\xd1\x40\x43\x0e\x0e\x26\x87\xbd\xa1\xda\xeb\x5c\x6e\x49\x7e\xaf\xa0\xdb\x15\x16\x95\x98\xc9\x7c\xed\xf1\x38\xb4\xa6\x89\x0a\x59\x53\x86\x93\x58\x4d\xcf\xd1\x6a\xd4\x2f\x5a\xac\xa4\x85\x20\xd8\x5e\x9d\x8f\xa4\x98\xf1\xf9\x5b\x9a\x7d\xc3\x96\x97\x6c\xd6\x31\x1a\x02\x99\xa8\xd5\x69\x81\x81\x19\x72\x88\x03\x6e\x67\x3a\xf7\xe8\xcb\x6f\x63\x34\xe9\x66\xf3\x68\x6d\xe9\x58\x29\x69\x81\x4c\xdf\xb2\xef\x1e\x8b\xf3\x94\xd7\x76\x8a\xde\x38\xb9\xc3\x90\xb4\xdb\x73\xaa\x27\xe4\xad\x84\x90\x9c\x99\x7c\x41\x16\x5a\x67\xea\xc5\xc9\xc9\x4d\x31\x65\xb9\x60\x9a\xa9\x09\x97\x27\xb1\x8c\xd4\x49\x24\x45\xc4\x32\xad\x4e\xe4\xad\xa1\x7c\xec\xee\xe4\x4e\xe6\x37\x5c\xcc\xc7\x46\xd2\x19\xe3\xae\xaa\x13\x10\xa6\x4e\x7e\x83\x12\xfb\xf5\xfb\xb3\xf7\x2f\xc8\x69\x1c\xdb\x8a\x3d\x85\x62\xb3\x22\xb1\xd5\x3b\x26\x84\x66\xfc\x3b\x96\x1b\xa5\x6c\x44\x6e\xb8\x88\x47\xa4\xe0\xf1\x5f\x37\x1f\xee\x1d\x21\x26\x33\xd4\x8d\x76\x80\xda\x15\x08\x8a\xcb\x0a\x9d\xf2\x48\x6f\x28\x14\xd7\x0a\xf6\xdc\x19\x0e\x2c\x43\xe9\xb0\x8c\xa9\x94\x09\xa3\x62\xcb\x1b\x00\xb6\xee\x67\xf6\xb0\x3c\xb4\xa8\xe5\x58\x04\xc8\x64\xfc\x82\xa8\x22\xcb\x64\xae\x15\x49\x99\xa6\x31\xd5\x74\x62\x76\x6e\x54\xfd\x13\x84\xe3\x11\xf9\xc9\xdf\x04\x09\x57\xfd\x70\x78\xf8\xe7\x6f\x5e\xfd\xdf\xbf\x1c\x1e\xfe\xf8\x53\xf8\x2b\x90\x3d\x34\x75\x55\x1f\x31\x22\xf7\xc4\x88\xbb\xef\xe0\x1b\xf0\xa7\x65\xa3\xa7\x51\x24\x0b\xa1\xed\x0f\x9a\xea\x42\x4d\x16\x52\xe9\xf3\x0b\xff\x67\x26\xe3\xfa\x5f\x6a\x0b\x27\x20\xf7\x4b\x74\x00\x9c\x17\x54\x2f\x7a\x26\x3d\xe5\xb9\xd8\x01\x5d\xed\x9b\x61\x85\xa4\x94\xc2\x3f\x5f\xbb\xe9\x1a\x0e\x74\x97\x73\xad\x99\x00\xb9\x03\xe2\xee\xe4\x6c\x64\x30\xb7\x64\xb3\xb7\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x0e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xaa\xd7\x9d\x5e\x9c\x93\x5b\x84\x46\xef\x0b\x71\x51\x58\xaf\xf7\x3e\x93\xbe\x52\x95\x5d\x96\x97\x34\x5f\xa0\x65\xc9\xc7\x7b\x91\x84\xa7\xdc\x1a\x80\x6d\x55\x2b\x45\x8e\xf0\xe6\x24\xca\x8a\x91\x7d\x60\x92\xb2\x54\xe6\x4b\xff\x27\xcb\x16\x2c\x35\x12\xdb\x58\x69\x99\xd3\x39\x1b\xf9\xd7\xf1\x35\xff\x17\xbe\x58\xf9\xc0\xea\xdb\x28\x52\x47\x45\x6e\x98\x47\xb2\x74\x14\x84\xc5\x8f\x7b\x16\x1d\x98\x7a\x3e\x8a\x7e\x37\xde\xed\xc8\x72\xbd\xb6\x88\x4c\xdb\xaf\x0a\x64\xc8\x5b\x99\x14\x29\x53\x23\xcf\x9e\x50\x5a\x17\xb7\x46\x9a\x54\xf7\xc2\x08\x63\x7e\xcb\xd5\x4e\xfe\xe9\x2b\x6f\xa9\x03\x13\x59\xa1\x8d\xa6\x82\xc1\xe0\x41\x45\x38\xa9\x40\x07\xf0\x31\x8a\x15\x92\xf2\xfc\xa0\x9d\xf7\x95\x6a\xcd\x72\xf1\x82\xfc\xef\xd1\x87\xdf\xfd\x6b\x7c\xfc\xd7\xa3\xa3\x1f\x9e\x8d\xff\xf3\xc7\xdf\x1d\x7d\x98\xc0\x3f\x3e\x3f\xfe\xeb\xf1\xbf\xdc\x1f\xbf\x3b\x3e\x3e\x3a\xfa\xe1\x9b\xb7\x5f\x5f\x5f\xbc\xfa\x91\x1f\xff\xeb\x07\x51\xa4\x37\xf8\xd7\xbf\x8e\x7e\x60\xaf\x7e\x6c\x39\xc8\xf1\xf1\x5f\x7f\xdb\x6a\x7a\x54\x2c\xdf\xb7\x38\xf0\x78\x8d\x77\x88\xb0\x2f\xdf\xea\x60\xa0\xff\x38\x2e\x85\xb6\x31\x17\x7a\x2c\xf3\x31\xbe\xfe\x82\xe8\xbc\xd8\x7e\x30\x4a\xa2\xb6\x0b\x9e\xbb\x72\x60\x2f\x4a\x82\xe6\x49\x73\xef\x88\xac\x58\x94\x33\xdd\x97\x06\x83\xa3\x39\xfe\x51\x33\xc9\x0e\x4a\x4d\xa9\xd4\x78\xbb\x24\xc0\xab\xe4\xbc\xb3\x5c\xa6\x13\x12\x98\x85\x6e\xc1\x93\x69\x9f\xbb\x61\x5b\xb4\x5c\x77\x0d\x4a\xd0\xa7\xa5\x04\x5d\xe1\xfe\xde\xbb\x06\xc4\xc4\xed\x26\x33\x4d\xdd\xa6\xfb\x1a\x52\x59\x42\x73\xb4\x13\xa0\xb4\x24\x99\xcc\x8a\x84\xea\x35\x66\xbb\x06\xdb\xb4\xc5\xfd\xd2\x0b\x60\x36\x1a\xec\xc0\x96\xca\xa5\xcd\xc6\x50\x72\x9a\x24\x84\x0b\x3c\x09\x30\x80\xb3\xe6\xe5\x0c\xe5\x25\x42\xd1\xe0\x7c\x6b\xa6\x70\x67\x13\x6e\x02\x43\x23\x57\x46\xd7\xc9\x35\x58\xfc\x21\x21\x07\x69\x96\x35\x8d\x71\x51\xa6\xe5\x78\x6e\xeb\xbd\x94\x8d\xf5\x17\x13\xaa\xb4\x9b\x36\xcc\x46\xd3\x1b\x30\x85\x46\x2c\x66\x22\x62\x10\x82\x50\xb0\x72\xad\x53\x23\x0c\x82\x79\x1f\xc6\xa0\x24\x2e\xb2\x84\x47\x06\x7e\x66\x26\xcd\x63\x9c\xa7\x69\xa1\xc1\x50\xfc\x50\x56\x7c\xb3\xe3\x57\xae\xdc\xab\x37\xe6\x03\xa9\xf2\xa2\xb5\x8f\xb6\xf0\xaa\xbb\xda\xcf\x7c\xdf\x8e\xf0\x7a\x73\xdb\x56\x4e\xb5\x42\x71\x4b\x1b\x43\x95\xd2\x3e\xb4\xc5\xb0\x1d\x9d\xfd\x45\xd2\xd8\x0e\xf4\xb5\x3d\x6d\xed\x60\x5c\xea\x4a\x4f\xdb\x5a\x93\xb2\x9c\xcd\xf8\xc7\x0e\xf8\x78\x2a\x4a\x15\x85\xc7\x4c\x68\xa3\x08\x40\x65\xea\x2c\x67\x19\x13\xb1\x4f\xf7\x83\x00\x2f\x51\x5d\xc7\xbd\x7a\x8c\x50\xca\xe8\x7e\xbc\xae\x9a\xa4\x98\xe1\x6c\xfd\xc2\xcf\x96\xdd\xf5\xfe\x0f\x96\x90\xf1\xd6\xe0\xef\xda\x3e\x06\x6f\xd4\x22\x5d\x6d\xf9\x6f\x3b\x49\xa3\xbd\x79\x97\x53\x26\x63\xac\x71\xad\xcb\x20\x84\x09\xb9\x6a\x78\x13\x62\x0d\xec\x13\x87\x87\x0a\xc3\x12\x54\x7d\xa0\x5a\x76\x33\x46\x26\xe0\xa0\x1d\x51\x0a\x59\x5d\x91\x83\xe5\xf7\x84\x2a\xc5\xe7\x62\x9c\xc9\x18\xea\x72\x9f\xac\x43\x88\x16\x87\xaa\x5b\x64\xd3\x56\xbc\xf2\xc6\x89\x76\xdb\x74\xe9\xed\x6f\x81\x6c\xe1\x2a\xc2\xe7\xc1\x8f\xd6\xae\xe3\xe2\xe8\x03\x19\xb2\x94\x88\xf6\x83\x69\x4a\x05\x9d\xb3\xb1\xfd\xf8\xd8\x7f\x7c\xec\xbf\xb5\x0f\x98\xdb\x50\x2d\x34\x29\xb6\x6e\x0b\x71\xf8\x06\x4d\x96\xb1\x6f\x0f\x81\xf1\x7b\x1f\x79\x5a\xa4\x84\xa6\xb2\xc0\x10\xbd\x55\x70\xba\x40\x96\x5e\x00\xd6\x00\x28\xb5\x16\x52\x2d\xa1\x45\x76\x0a\xb9\x7b\xa2\x96\xad\x56\x16\xad\x6e\x96\xac\x0e\x16\xac\x9d\x2d\x57\xce\x48\xdd\x1e\x1f\x2f\x9d\xdd\xbc\x86\x91\x5c\x6c\xc5\xc8\xdc\xd7\xbb\x3f\x9f\x11\x3f\x0e\x57\x44\xa6\x5c\x6b\x6b\xd0\xa5\xe5\xb1\x1f\x11\xae\x2b\xd6\x4f\x7b\x16\xa0\xdf\x03\xb6\xc8\x60\x1f\x8d\x36\xc5\xc1\x8a\xee\xbc\x16\x23\xe4\xb2\x77\x1c\xab\x43\x50\x41\x78\x9a\x61\x30\x2b\xe0\xf4\xd8\xe9\x66\x36\xc8\x60\x38\x1f\xc3\xf9\x68\x7a\x49\x75\x91\x45\x42\x31\xa4\x8c\x60\xf4\xe2\x88\xc1\x6c\xd7\x78\x06\x22\x34\x11\x87\xcc\x59\x80\x20\x7a\x2e\xe6\xe4\x92\x81\x65\xe0\x8a\x69\x65\x63\x22\xe1\x0d\x9a\xb3\xd5\x14\x33\x67\x09\xf1\xa1\xb6\x74\x36\xab\x3e\x11\xb3\x2c\x91\xcb\x14\x24\xdb\x73\x1d\xca\x33\x5e\x74\x61\x69\x96\x50\xcd\xbc\x60\xb3\xd9\xda\xb0\x37\xe7\xeb\x92\xdf\xf5\xb8\x19\x5d\xed\xa2\x83\x5b\xc4\x04\x3f\xfd\x3c\xad\xd6\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\xcb\x7c\xab\xf6\x4a\x60\x2b\xa3\xfc\x7d\x67\x51\x75\x52\xc7\xda\x66\x4a\x3d\xfd\xdc\xa8\x0e\xcb\x6e\x9b\xff\x34\x64\x3c\x6d\x02\x75\xbb\xac\x85\xd6\x19\x0b\xad\xf6\xaf\x65\xe6\xd2\x90\xab\xd4\x81\xbf\xdc\x83\xf0\xb7\x75\x2f\xb5\x4c\x18\x4a\xae\xed\x74\xf7\xeb\xf2\x79\xdf\xff\x0c\xdd\xbb\xc1\x48\x0f\xe3\xa5\xb8\x76\x62\x8b\x39\x5b\xe5\xbc\x00\xb5\xb4\xa6\xd0\xec\x4c\x4b\x37\x2f\xb3\x71\x62\x49\xcc\x9e\x69\xdb\xf9\x2e\x68\x05\xa7\x73\x70\xfa\xfc\xd9\x63\xdb\x88\x81\xfc\xf4\x97\x20\xbe\xdd\xe7\xbf\x78\x0c\xf9\xb3\xfb\xd7\x5f\xf6\xcc\x5b\x68\xc7\xd8\x70\x4a\x1d\x04\x8c\x57\xf0\x02\xe1\x22\x06\x07\x93\x5d\x2a\x40\x00\xc7\x32\xf0\x81\x65\xb9\xfc\x17\x4c\xa4\xb2\x66\x2e\xf0\x44\x95\x0f\x2b\xeb\x32\x0b\xf4\x2a\x6b\x52\x28\x4f\x06\x23\xef\xa4\x2d\x4a\xc8\x46\xe4\x02\x6c\xa9\xe5\x1d\x38\x49\xef\x24\x96\x27\x5c\xeb\xcb\x0a\xe1\xb6\x95\x8b\x6c\x65\xf4\x15\x80\x7c\x53\x32\x79\x5c\x59\x85\xc9\x97\x18\x5c\xc9\x84\xdb\x04\x99\x1b\xb6\x2c\x99\x8d\x15\x21\x80\xe4\x8f\x4a\x2c\x71\xac\x00\x79\xc7\xff\xe7\x4c\x59\xe9\x94\x0b\xfc\x18\x0e\xed\xb6\x02\x46\x77\x00\x35\x92\x5d\x92\xe0\x67\xfa\x00\x57\x3b\x39\xa3\x02\xb3\xf7\x1d\x64\x0c\x4f\x25\x9b\xa5\x8b\x40\xa4\x78\xf5\x73\x41\x93\x6a\x12\x82\xbd\x65\x1f\x5a\xa1\xea\x77\x3c\x89\x23\x9a\xdb\x28\x2f\x38\xa3\x44\x49\xdc\x3d\xac\x8a\x17\x51\xe1\x4f\x7b\xb9\x47\xd8\x07\x91\x64\x34\xd7\x3c\x2a\x12\x9a\x13\x73\x16\xe6\x32\x6f\x95\x28\xb0\x15\xa2\x25\xd2\x5c\xb1\x48\x8a\xb8\x8b\x02\x70\x5d\x7f\xb7\xee\x6b\xcd\x58\xce\x6d\xb9\x3f\x9e\xb2\x3a\x92\x1e\x55\x6d\xda\x72\xe6\x4e\xb5\x3f\x62\x15\xcb\x47\x99\x93\xc9\x15\xe1\x58\x2f\xf4\x38\x20\x8f\xfe\x54\x4c\xc8\x57\x4b\x67\x66\x01\x93\x8b\xcd\xae\x50\x4c\xbb\x44\x18\x87\xb2\x16\xd8\xe5\x81\x9a\xc9\x1c\x92\x53\x8e\x62\x89\x19\x19\xb7\x3c\xd2\xc7\x13\xf2\xff\x58\x2e\x31\x83\x93\xcd\xb1\x7a\xa3\x45\x71\xaf\xb8\x42\xe3\x52\xf0\xe0\x3f\x23\x47\x58\x49\x93\xa7\x29\x8b\x39\xd5\x2c\x59\x1e\xa3\x1e\xeb\x6a\x71\xb6\xd9\xba\x36\x46\x83\xa0\xf0\xea\x97\x7f\xd8\xf0\x64\xd7\x1c\xaa\xef\x5c\x56\x4a\x09\x19\x8c\x21\xa8\x6d\xa1\xe7\x41\x72\x83\xb8\x19\xc6\x20\x94\x49\x9d\x8e\xcc\xf8\x0d\xfe\xbb\xc1\x03\x4a\x72\x36\x07\x2c\x47\xcc\xdd\x13\xc7\x31\x9a\xf2\xad\x2c\xc4\x7a\x93\x60\x65\xe1\x6f\xac\x12\xfe\x5d\xf0\xe2\xda\x2c\xc5\x07\x11\x13\x82\x99\x04\x26\x4a\x4a\xc0\x2e\x09\xec\xdc\x90\x07\x7c\xaa\x8c\x44\xd9\x3a\xc9\x5e\x33\x12\x61\x2e\x5b\xa2\xde\x7b\xc9\x5b\xf4\x1f\xea\x80\xcb\x10\x20\x6e\x01\x53\xcb\xdb\xd3\x96\x1c\x00\x7e\x22\x04\x4b\x04\x85\x6f\xb1\xd8\x45\xb1\x61\xae\x31\xbc\x4a\x0e\x5f\x1c\xf6\x42\x7c\x71\x39\xb9\xcc\xe8\x9c\x6e\xaf\x77\x5c\x55\x46\x6a\xaf\x92\x98\x69\x96\xa7\x50\x98\x76\x21\xef\xf0\x77\x64\x5b\x99\x7d\x8a\xd9\x9a\xbe\x66\xb5\x0b\xa9\x80\x2b\x55\x93\x18\xe1\xfc\x82\x63\xf4\x8e\x2e\x09\xcd\x65\x21\x62\x2b\x35\x79\x02\xfa\xb6\xf6\xe1\x77\x52\x00\xa5\x28\x94\x81\xd5\x75\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x52\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xd1\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xc7\x55\x11\x04\x1e\x69\xb3\xa0\xed\xf1\x20\xaa\x98\xee\x79\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x43\xb5\xe1\xc8\x55\x93\x3b\xc9\x11\x3e\x69\x24\x36\x29\xf5\xc6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\xf4\x96\x29\xa2\x78\xca\x13\x9a\x27\x90\x2b\x78\x85\xf3\x83\x66\xec\x8d\x19\xe8\xdd\xb2\x9b\xc3\x99\x04\xc3\x6d\x05\xb5\x9b\x87\x81\x13\xd0\x08\x37\x2f\x2c\x02\xee\x2a\x87\x7f\x8c\x92\x42\xf1\xdb\x7d\x4f\x93\xcd\x7e\xd8\x81\x55\xd7\xb9\x74\x26\xe3\xab\x8c\x45\x0f\xc9\xa3\xab\x1a\x86\x21\x55\xb1\xdb\x74\xe0\xc9\xa8\xec\x53\x6c\xac\x3f\x65\x84\x46\x11\x53\xca\xc5\x54\x2e\xc3\x38\x4f\xbf\x86\x4f\xa5\xa0\x00\xbd\x53\xaf\x12\xaa\x34\x8f\xbe\x4a\x64\x74\x73\xa5\x65\xde\x29\x67\xbf\xe9\xfd\x5a\x19\x86\xd3\xef\xaf\xc8\x19\x57\x37\x41\x36\x81\x75\x9a\x86\xe6\x12\x4a\x6e\x8a\x29\x4b\x98\x3e\x3c\x54\xc8\xe5\x52\x1a\x2d\xb8\x60\x8e\xc1\x09\x9f\x92\x62\x15\x3e\x03\xe5\xae\x3e\x53\x9b\xf8\x74\x62\xf1\xf5\x37\xf4\x4e\x31\x9c\xfe\xd4\x4c\xdf\xfc\xcc\xda\x64\xa4\xf7\xea\xa7\xc0\xc9\x9c\x9f\xf5\xe4\x83\x98\xa9\x6b\x33\xc7\x6e\xc6\xed\x43\x7c\xcb\xa9\x0e\x33\x9e\x30\xdb\x7d\xc0\x2c\xd8\xc5\xa8\xd9\x53\x01\xfb\xb7\x94\x05\xb9\xa3\xa8\x23\x03\x45\x9c\x90\x6b\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa4\x69\x96\x30\xf5\x82\x1c\xb0\x8f\xfa\x0f\x07\x23\x72\xf0\x71\xa6\xcc\xff\x84\x9e\xa9\x83\x09\x39\x4f\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\x38\x9f\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x27\x31\xbb\x3d\x51\x31\x7d\x3e\x82\xcf\x28\x1b\x08\x58\x9d\x13\x55\xe4\xe0\xf9\xc1\x84\x5c\x39\x46\x3c\x0a\xe7\x58\x3e\x37\x93\xb9\x1f\x10\xec\xec\xcf\x0e\xc8\x91\xcc\x61\xe4\x88\x0a\x92\x30\x7a\x6b\x6d\xcb\x78\xdc\x96\xa8\xee\x1e\xb7\x4e\x88\x6c\x9b\x1b\xd6\xbe\xf3\x4a\x5b\x21\x75\x75\x13\xdd\x7b\xce\x04\x90\x17\x36\x57\x60\x26\x73\x5b\x07\xc4\x3f\xa2\x98\x86\xa3\xc7\x45\x45\x85\x7e\x04\x02\x4b\x3a\xa6\xd2\x3b\xea\xd9\x15\x3a\xee\x3d\xd0\x81\x04\xff\xb9\x60\xe4\xfc\xcc\x27\xd4\xb3\x5c\x71\xa5\xcd\x31\x8e\x2b\xac\x8b\x23\x3f\x3b\x3a\x4d\xe9\x3f\xa4\x20\xaf\xbe\xba\xb2\x13\x38\x7e\x54\x50\x6d\xa5\x06\xf4\x1f\x45\xce\x0c\x17\xee\xc0\xdc\xfd\x3b\x75\x86\x6e\xee\x93\x33\xaa\x29\xf2\x75\x1b\x69\x25\x4a\x52\x6e\x58\xf6\x94\x8b\xd8\xfe\x14\x30\xec\x87\xe6\xad\x66\xf7\xde\x6d\x12\x93\xc2\x07\xbf\xbd\x3c\xef\x89\x07\x47\x40\xcc\xe7\x6f\x65\xdc\x99\x11\x07\xaf\x3a\xe2\xfb\xdf\x06\xa6\x2f\xf1\x3e\x49\xcd\x98\xc4\x68\xef\x23\x72\xc9\x68\x4c\xcc\xf9\xb5\xff\xfc\xde\xe8\x9e\xad\x69\x55\x2b\x16\xe2\x00\xd8\x71\x19\xee\x35\xb7\x84\x30\xd2\x3d\x36\x98\x03\xc7\xca\xf2\x92\x69\x22\xa7\xc4\x1e\x87\xbe\xe7\xfe\xed\xe5\xf9\x0e\x53\xff\xf6\xf2\xdc\xcd\xdc\xfc\x53\xce\x1e\x6e\xd2\x3b\x89\x6f\xa5\xf4\xf6\xba\x26\x6e\x95\x2c\xb9\x4c\xdc\xa8\x8b\x64\xed\xe5\xb1\x49\x5f\x92\x58\x9f\x10\xbb\xe1\xa2\x45\x16\x6e\xf5\x94\x99\x77\x8c\x42\x81\xb1\x6a\x81\x1f\xf1\x6a\x41\x21\xf5\xd9\x27\xe4\xc1\x3e\x9b\x8d\x57\x86\x2b\xb8\x1d\x37\x4a\x20\xd0\x36\x72\xc6\xd0\xcb\x19\xbf\x70\xb1\x03\xfe\x8d\xe6\x17\xde\x42\xa4\x66\x6c\xe9\x2b\xc1\xc0\xcd\x38\x40\xb0\x23\xb4\x2a\x09\xff\x13\xbd\xa5\x3c\xa1\x53\x9e\x70\x28\xa5\x6e\xb4\xfb\x30\x1a\x55\xc1\x94\x7b\x3d\xf5\x3b\x8a\x1c\x5e\x9c\x58\x31\x6e\x91\x23\xf3\xdb\x09\x18\xc7\x8e\x27\x40\xad\xe0\x41\xa8\xd1\x58\x13\x4a\x2e\xb7\x09\x25\xbd\xc9\x0f\xb0\x03\xe6\xc4\x74\xe5\x8a\xe6\x9d\x46\xae\x08\x3f\x5c\xd9\x7a\x72\x4f\x99\x31\x62\xae\x55\x2b\xd6\x08\xf8\xb5\xf5\xc9\xf6\xcc\x71\x5f\xe4\x8a\x3f\x0d\xe4\x22\x3e\xa3\x6d\x07\xfe\x59\xbe\xe8\xf8\x10\x28\x49\x10\x71\x66\xb3\xdd\x2a\xa1\x99\x88\x7d\x57\x96\xd6\xd8\x12\x4c\xc8\x75\x0d\xce\xb5\xe9\x8b\xd6\xa5\x68\x83\xc3\x88\xae\xab\x72\xef\xb9\x45\x21\x09\x84\xdb\xa4\x05\x2e\xb6\x9e\x64\xc4\xb2\xc5\xac\x8b\x4b\xdc\xbc\xf0\xfa\xaa\x6a\x09\x7c\xc9\xb2\x05\x79\x7d\xd5\x70\x8c\x01\xf6\x30\x6b\x85\xf6\xc1\x43\x45\x12\x3e\x63\x9a\x6f\x59\xc2\x3d\x1c\xe4\x54\x0a\xae\x65\xbe\x3e\x05\x9a\x74\x3a\x9c\x6e\xb8\xae\x0c\xd5\xbd\x67\x76\xb6\x2c\x20\xf2\x36\xb8\x4b\x49\x24\x93\x84\x45\xda\x96\xb4\x02\xf0\xfa\xd7\x1a\x94\x27\x66\xed\x01\x93\x9b\x3f\x81\xfa\x64\x15\xa5\x13\xdc\xdc\x93\xcb\x57\xa7\x67\x6f\x5f\x4d\xd2\xf8\x37\x0b\x79\x37\xd6\x72\x5c\x28\x36\xe6\x2d\x2a\x94\x3c\x5e\xf4\x22\x5e\x59\xab\x82\x59\x75\x83\x0c\xd6\xfa\x7a\xef\xf2\x27\xc9\xb7\x0a\xa3\x16\xc0\x76\xe4\x7c\x52\x52\xea\x11\xc9\xa9\xcd\x91\xa4\xd6\xf4\x54\x24\x09\x42\x5b\xe7\x8c\x8d\x42\x5b\xcc\xc6\xd4\x90\xce\x0b\xdb\xdb\x50\x51\x59\xe0\xfd\xca\x10\x0f\x8f\x70\x5d\x38\xc6\x76\x99\x64\x15\x8a\xe5\x9b\x55\x38\x5e\x55\xee\xa3\xe1\x4c\x2f\x0c\x54\x6f\xd8\x92\x40\x20\xf0\x4c\xe6\x06\x9f\xf2\x2a\x6e\x30\x1d\xc1\xd2\x4f\x0a\xc5\xf2\x89\x65\x3b\x0f\x0e\xb6\x0e\x55\x84\x76\x28\xde\xe6\x5f\x6c\x82\x99\xbd\x5d\x56\xf6\xb5\xf2\x1a\x2d\xf4\x82\x09\x6d\xc4\x7e\x43\xcb\x2c\x64\x1a\x81\x68\xe3\xb0\x1f\x1c\x6a\x2d\x8b\x18\x75\x2b\x39\x34\x94\xe9\xe9\x82\x93\xe6\xd4\x74\x45\x47\xf3\x0e\x24\x22\x86\x64\xde\xe7\x72\xe5\x34\x96\x10\xb0\x81\x15\xe8\x2a\x88\x46\xe3\x94\x8b\x27\x78\x3a\x23\x2e\xe2\x6d\x70\xa8\x19\xc0\xe0\x8d\xaa\x28\x66\xef\x59\x83\xbe\xf7\x1b\x52\xa7\x49\x61\xc2\xbb\xf5\x20\x56\xfd\x87\xad\x0e\x5f\xba\x54\x3f\x27\x63\xfc\xca\x38\x8b\x4b\xa8\x0c\xce\xc0\x55\x0f\x5e\xbf\x26\xa5\x07\x70\xf1\xf5\xb4\xdb\xe4\x81\xa5\xa1\xfb\xd5\x73\x1f\x04\x50\x5d\x64\x9e\x7d\xb9\x77\x49\x33\xa1\xf1\xbe\x72\xc9\x67\x58\xd9\x0c\xce\xa8\xd3\x97\xa1\x21\x3f\xcd\x69\xca\x34\xcb\x31\x04\xce\x06\xd5\x09\x9b\x9d\xf0\x3e\x63\xe2\x4a\xd3\xe8\xa6\xef\x52\xa8\x03\xc7\xbd\x3f\x8e\xbb\xb7\x2b\xd0\x21\x82\xad\x8b\xb4\x0c\xbd\xc8\x5c\x58\x2e\xf4\x44\x48\x8c\x2f\x47\xd6\xc5\xca\xe1\xcb\x51\x55\xb9\x6b\x59\x9e\x0c\x0d\x1b\x10\xe9\xe6\xeb\xeb\x41\x04\x3f\x42\xa1\x1f\x6e\xd8\xfe\x0c\x58\x12\xb8\x8b\x1f\x2d\x78\xb5\x4a\x1d\x52\x73\x67\xca\x75\x79\xee\x15\xd3\x24\x63\x79\xca\x6d\x5a\xb7\x14\x24\xb2\x69\x01\xc0\xd7\x0c\x0f\xb3\xc3\x05\x3c\x4f\x10\x19\x69\x6a\x73\x66\xc8\x94\xe9\x3b\xc6\x04\x79\xf6\xec\xd9\x33\x90\x4b\x9e\xfd\xf1\x8f\x7f\x24\x50\x47\x22\x66\x11\x4f\x57\x1f\x84\xa7\xfe\xe3\xf9\xf3\x09\xf9\xbf\xa7\x6f\xdf\x40\x54\x59\xa6\x15\x99\x4a\xbd\xb0\x23\x9b\x07\x2a\x2f\xab\x11\xf9\x9f\xab\xf7\xef\x9c\x38\xa1\x6a\xbf\x82\x0a\xe2\x97\x57\x0d\x11\x7c\xf6\xe5\x1f\xfe\x30\x21\x67\x3c\x87\x7c\x62\x0e\x19\x10\x3e\x08\x32\x73\x81\x81\xd0\x78\xa8\x9e\xc1\x6f\x39\x88\x0d\x12\x4e\xf9\x7c\x01\x00\x30\x07\x42\x8a\x59\xc2\x23\x8d\x35\x05\xf1\xe8\x23\xa0\x6d\x5f\x24\x6a\xd3\xbd\xac\x14\x01\x93\x1b\x91\x84\xdf\x30\x32\x53\x5f\xe7\xb2\xc8\xca\x34\xc7\x9c\x29\x23\xcb\x46\x54\x40\x56\x09\x0c\x56\xee\x95\x62\xfa\x51\x83\x30\x5a\x1a\x82\x2a\x38\x08\xef\xd4\x04\x94\x91\xaf\xad\x36\x46\x7c\xc8\x28\xf7\x81\x83\xe0\x53\xaf\x54\xf6\xf7\xba\x67\x1c\xd4\x92\x73\xb9\x2b\x59\x2e\xff\x8e\x5b\xc5\x85\xcb\x82\xb2\x12\xb2\xb2\x32\x99\x4d\x3a\x15\x81\xcd\xd5\x65\xe5\x1b\x5e\x68\x33\xfe\x83\xfc\xa9\xf3\x59\x98\x68\x07\x69\xe9\xd8\x5e\xad\x52\xf8\xb2\xe1\xcb\x65\xb1\x76\x83\x4d\x0a\xf7\xb5\x10\x2b\x6f\xdb\x3e\x2a\x96\xfc\xd8\xee\x3a\x36\x85\xad\x1c\x03\x43\x71\x6d\x02\x50\xd0\xb3\xa9\x52\x8c\xae\x12\xe5\xa3\x98\x2e\x2c\x68\x20\xf2\xca\x7c\x9b\x29\x65\xf3\x88\x52\x9a\xdf\x18\x25\xc1\x52\x81\x09\x44\x3d\x2b\x9f\xc3\x84\x09\x65\xb7\x68\x2c\x4f\xe9\xb2\x92\x35\x60\x3e\x72\x38\x99\x1c\xe2\x31\x91\x39\xd6\xf2\x44\x9c\x37\xf7\x1f\x29\x5f\xba\x1a\x95\x4e\x33\x6c\xbb\x07\xf6\x1c\xdb\xb6\x84\x56\xa2\x9d\xa9\x85\x54\x9b\x0a\xbe\x1d\xdb\x16\x76\xeb\x8f\xdb\xbe\x2f\xee\x18\x16\xd0\xe2\xd1\xae\x3d\x70\x3b\xf4\xbe\x5d\x57\xad\xc1\xc2\xd8\x9e\x84\xb6\x1d\x21\x3b\xd7\x02\x4f\x5b\xb1\xbe\x86\xa9\x1e\xa6\x96\xf3\xbd\xef\xc6\xf9\x6c\xbe\x5e\xa5\x39\xd8\xd3\x67\x75\xe7\x33\xcc\x74\xa9\x92\x2e\x4b\x1a\x42\x51\xc0\x37\xe2\x2a\xd3\x5e\x9e\x34\x47\x0b\xd1\xa6\x5b\xe1\xf9\x2e\xdc\x0d\xaf\x76\x8e\x09\xbc\x2a\xb8\xe6\xbc\x13\xb8\x68\x4b\x4a\xb3\x4a\x83\x8f\x04\xed\x06\x20\x63\xba\xc3\x33\x21\x6f\x2d\xa9\x45\x24\xa3\x53\x25\x93\x42\xe3\xab\xe5\x8f\x21\x1d\x86\x41\x5d\x95\x05\x20\xbe\xfe\xb1\x80\x2a\xeb\xb2\xc5\x59\x3b\x02\x8d\x57\x87\xc3\x39\x54\xfb\xbc\xc7\x6a\x9f\xbe\x3e\xad\x6a\xd9\xaf\x49\xdd\x5b\x79\xdd\x48\xf1\x2e\xfa\x95\xe2\xe4\xa8\x6c\x13\xe2\xdc\xf1\xe7\x42\xb3\x7c\x46\x23\x76\x1c\xea\x5d\xbe\x1d\x8b\x0f\x11\x72\x79\x11\x0b\x2a\xe2\x04\x05\xf0\x88\xe5\x80\xfb\xec\xa3\x66\xb9\x01\xc9\xcb\xab\x73\x12\xe7\xfc\x96\xe5\x8a\x1c\x7d\xc5\x8c\xbc\xc8\xa8\x2e\x72\xd6\x2a\xbb\xaa\xdf\xd8\x4a\x98\x46\x5f\x9a\x1e\x0c\xd6\x35\x54\x0f\x5e\x72\x94\x47\x04\xe7\xab\x04\x13\x42\x15\x41\xaa\x42\x5d\x76\x62\x50\x09\x08\x34\xd0\x8c\xa5\x2c\x72\x6b\x45\x77\x75\x55\x23\x99\x1b\x75\x09\x07\xa6\x8a\xe4\x6c\x6e\xa4\xd9\xdc\x35\x1b\x66\x24\x4a\x0a\x73\xa3\xd7\x70\xb6\x7d\x02\x00\x4b\xd3\xec\xa6\x58\xbd\x99\x95\xaa\xe5\x2d\x8f\x1d\xab\xc4\xde\xc7\xbe\xab\x61\x46\x55\x90\x6a\x13\x54\xa0\x0f\x00\x8b\x32\x3a\x30\x54\x9f\xc4\x5a\x09\xf6\x0f\x8d\xc2\x12\x6a\x5b\xb4\x68\x1f\xd1\x85\x08\xcb\x98\x5d\x14\xd3\x84\xab\xc5\xd5\x8e\x26\xc4\xa6\x21\x30\x58\x61\xc5\xeb\xb7\xd6\x92\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xe9\x72\x23\x47\x49\x00\xa2\x7b\x3b\x44\x48\x09\xd9\x1f\x09\xb3\x15\x0c\xcc\x4f\xef\xca\x79\xd8\xa4\x34\xac\x59\x12\xb3\x6f\x45\x56\xb9\x1f\xd1\x24\x51\xf5\x84\x5d\x47\x31\x51\xf6\x70\x89\x6a\xb8\xa7\xdc\x6c\xb7\xef\x8c\x52\xab\x7e\xb9\x76\x61\x8a\xa4\x12\xd3\x78\x04\x91\xc2\x3d\x04\xa5\x57\xdc\x0b\x41\x22\x23\xa4\x2b\x03\xca\xf4\xdc\x3a\x72\x30\x97\xde\x9f\xb9\x74\xdf\x38\xbc\xb0\xdf\x7b\x99\x0d\x5d\x29\x4b\xea\x49\xa9\x23\xb9\x5b\x82\x3a\x7a\x75\x2b\xe0\x37\x4f\xb5\xce\xf9\xb4\xd0\xdd\xeb\xbd\xd5\x5e\x07\x36\x6d\x14\x11\x38\xc5\x63\xbb\xfa\x28\x40\x51\xab\x21\xf8\xb3\xb0\x7a\xf6\x4b\x9e\x03\xec\x06\x6f\x1e\x2a\x12\xcb\xa8\xf0\x75\x61\x01\x68\xa5\x03\xad\x4d\xf5\x44\xd2\xf5\x5c\x75\x2f\xe9\x15\x7e\x64\x2b\x7a\xc5\xf2\x4e\xdc\xd1\x3c\x3e\xbd\xd8\x12\x7d\x5f\x65\xe7\xe5\x5b\xa1\xa0\xe4\x6e\x43\x17\x40\x3a\x95\x85\x2e\x4b\x87\xfe\x72\xec\xd5\x4d\x6a\xba\x96\x86\x34\xb4\xb4\x47\x77\x55\xf4\x07\x13\xf7\x60\xe2\xae\x5c\xbb\x98\xb8\xcf\xd1\xc4\x1d\xd6\xc1\xad\x1c\x57\x57\x5e\x81\x27\x6d\x63\x7b\xef\xd3\x4a\x7a\x56\x12\x18\x94\xa6\xea\x71\xfc\x35\x01\x0e\x8f\x48\xb9\xb7\x81\xd0\xe7\x28\x10\xf0\xec\xc7\xb7\xa8\xde\x93\x9d\xb4\x7d\x9f\x62\xbc\xd6\x35\x12\xdc\xd4\xb7\x18\xa4\x86\xa0\xd1\xf0\xc8\x56\x81\x1e\x59\xbd\x4b\xc4\x65\x0b\x3f\x2c\x42\xdd\xa1\x4d\x29\x5e\x1d\x81\x4f\x3a\x6f\x00\xe9\xd8\x44\x18\xaf\xae\xbb\x41\x76\x68\x28\x8c\xd7\x23\xb7\x15\xc6\xab\xb3\xed\x9b\x74\x6f\x31\xdc\xb0\xdc\xfb\x6d\x34\xbc\xe3\xd2\x76\x37\xeb\xef\x6a\xce\x1f\x95\xed\xed\x9e\x3e\x5b\x1f\xcc\xf9\x2b\xd7\x03\x9a\xf3\x03\xc2\xed\x88\x41\x83\x69\x3f\x34\xb7\x39\xfb\xfe\x94\x39\xb1\x72\x52\x56\x5f\x33\x28\xe7\x2c\xfb\x32\xaf\xba\x55\x0f\x27\x93\xc3\x43\x67\xef\xb7\xf8\x59\xe8\xd9\xf8\x4f\x84\x89\x48\xc6\xb8\xa9\x66\xfc\x5c\x69\x60\xfa\xa5\x9a\x1e\xce\x25\x75\xdf\x0a\x5d\xb3\x30\x76\xb7\x2d\xe9\x70\x82\xbb\xb7\x0d\x6f\x82\xf4\x43\x34\x0f\x0f\x5b\x84\x57\x3b\x82\xe3\x13\xfb\xb4\x01\x0f\x81\x77\xef\xfc\xb5\x75\x63\x70\xbc\x76\x61\xaf\x3b\x34\x09\xc7\xeb\x81\x5b\x85\xe3\xb5\x13\x47\xed\xd4\x36\xbc\x61\x71\x0f\xd7\x3c\x1c\xaf\x27\xda\x48\xa6\x7a\x75\x6a\x24\x8e\xd7\x6e\xed\xc4\xab\xef\x76\xdc\xfa\x5e\x5a\x8b\xe3\xd5\xad\xc1\x38\x5e\x7d\xb7\x19\xc7\xab\x25\x24\xc0\x18\x7e\xc6\x3b\xa5\x22\xb8\x77\xaa\xe1\x92\x9a\xa5\x99\xcc\x69\xbe\x24\xb1\xb5\x35\x2c\x1b\x32\x42\x83\x94\xd0\xbd\x4b\xc3\xc0\x3c\x62\x9e\xf7\x94\x8d\xd0\x21\x1b\x94\xc5\xbc\x58\xdb\xae\x79\x1d\xd8\xf0\xad\x10\x68\x77\x50\x0d\xcc\x56\x12\x73\xee\x4e\xfb\x98\x2b\xac\x48\xa3\x1b\xdb\x31\xc8\x41\x15\x79\x7f\x90\xe4\x72\x70\x50\xab\x03\x0d\xe6\x31\xf0\xfd\xd9\xce\x88\xee\x61\x1c\xbb\x62\xca\x42\x6f\x88\x0d\x0b\x38\xb2\x0f\x1e\x1b\x89\xe4\x2d\xb0\xc1\x07\xda\x25\xd2\x31\xb3\x8d\xff\x83\x41\xbb\xb1\xce\xb1\xf1\xee\x45\x5f\x0e\x5a\x82\x64\xee\xfb\xa2\x25\x32\x0a\x7c\xcf\x15\x0e\x05\xdb\xf0\xca\x21\xbf\xb3\xdd\x9b\xcd\x30\xa3\xa2\x7c\x01\x46\x9f\x44\xa1\x5f\x8f\x47\x50\xda\x12\xa4\x78\x00\xa6\xdf\x80\xeb\xa0\x4b\x60\xa1\xcc\x97\xa0\xf2\x7c\xf0\x4c\xf9\xa1\x3b\x57\x61\x53\x07\x8d\xdc\xaa\xba\x87\xf9\xe5\xca\xaf\xac\xd4\xdb\x20\x05\xc2\x09\xea\xaa\x00\x31\xd1\x7e\xc5\x8a\x4b\x72\x06\xbe\xab\xb2\x2d\x9a\x2f\xee\xb8\x82\x66\x82\x27\x55\x3c\x73\xb5\xec\xfc\xc2\x0b\x61\x03\x0d\x56\x90\xa6\x19\x67\x0a\xc5\xf2\xf1\xbc\xe0\xf1\x2e\xd8\xf2\x84\x19\x60\x6b\xb6\xd7\x9d\xd9\x75\x64\x71\x7b\x30\x36\x1f\x88\xd1\x81\x35\x1c\x94\xd1\x1b\x15\xde\x10\x96\xc5\xab\x46\x72\x50\x17\x2c\xe0\x8f\x9c\x73\x09\x5d\x7b\xd5\xd6\xf2\x8c\x68\x19\xd9\x64\x5d\x5e\x29\x77\x89\xc3\x22\xe6\x41\x60\xeb\xd8\xfc\xc7\xa9\xc0\xce\x9e\x3f\x65\x33\x59\x76\x48\x41\x8d\xc8\x86\xe3\xc6\x2c\x61\xd0\x46\xde\xb5\xa8\x37\x0f\x80\x4b\x38\x95\xb7\x06\x99\x3f\x08\xf2\xad\xab\xd9\xcf\x67\x2f\x08\x3d\xae\xa4\x40\xd8\xae\x33\x82\xb1\x18\x63\x74\x93\xf2\x3b\x79\x21\xd4\x88\x4c\x8f\x5d\x3c\x0a\x9c\x38\x61\xc4\xc2\xc4\x49\xbc\xa8\x57\xe7\xcc\x00\x00\xd2\x8e\x73\x99\x12\x25\x68\xa6\x16\x52\x83\x6a\x48\x33\x1a\x71\xbd\x24\x3a\xa7\xd1\x0d\xb4\x28\xca\x99\xfd\xdc\x88\x44\xc7\x36\xb0\x2b\x04\x5f\x35\x6c\x58\x2f\x72\x59\xcc\x17\x10\x09\x8b\x4f\x45\x09\x55\x6e\xf5\x8d\xef\x5b\x6d\x47\x91\x78\x29\x68\xca\x23\x5f\x35\x30\x97\xb7\x5c\x71\x69\xad\xbd\x6e\xdc\x0b\x5f\x19\x0e\x2d\xc8\x2f\x13\xca\x53\x72\xa4\x18\x23\xaf\x1c\x4a\xe0\x2f\xb6\x8d\x3d\x5a\x36\xf2\x6a\x70\x80\xf4\x25\xcd\x85\x2d\x88\x50\x12\x38\xef\xbc\x42\x86\x69\x66\xde\xf8\xd1\x63\xbf\x5d\xcd\x73\x92\x39\x38\xee\x5d\xe9\x4e\x26\x62\x19\x78\x2d\x4f\x2f\xce\x55\xa8\x8d\x20\x6e\xd9\xba\x77\xf0\x43\x22\xc5\x3c\x2c\x23\x50\x62\xa6\x21\xa5\x02\xda\xbb\xdc\xf2\xb8\xa0\x09\x12\x51\x3b\x99\x97\x57\xe7\xf8\x3a\x9f\x2f\xf4\xf8\x8e\x81\x35\x06\x79\x4d\x79\x66\xdc\x47\xf9\x4a\xb4\x0e\x57\x40\x74\xb5\xb5\x26\xa0\x65\xcb\x4c\xed\x8e\x2e\xa1\x6c\x8d\x0d\x31\xa9\x38\x4c\x5d\x61\x31\x1c\xa2\x09\xe2\x30\xbd\x53\xdf\xae\xc3\x88\x0d\x60\xae\x32\x20\x06\x4c\x5d\x9d\x9b\x01\x7c\x50\x07\xd0\xdf\xb6\x9d\xd9\xa8\xd9\x20\x23\xdc\x6d\xd6\x65\xee\x41\x28\xbb\x2d\x37\xf9\xda\xb6\x4e\xec\x28\x1c\x1c\x7c\x1f\x98\xcd\x02\x47\x87\x39\x36\x54\xc4\x63\x9a\x18\xcc\xb9\xf8\xee\xa5\x8d\x70\xc6\x83\x50\x71\xe4\xbb\x2e\x48\x5c\xf8\xb2\xd9\x46\x66\x68\x3c\x02\x90\x07\x3f\x65\x31\x10\x8d\xb0\x61\xe4\x9d\xd1\x90\xed\xe6\x5d\x7c\xf7\x72\x44\xf8\x84\x4d\xdc\x5f\xfe\x51\x47\xb5\xb4\x9c\x63\x18\xa0\x8f\xf1\x04\xbc\x83\xa9\x84\xc6\xa8\xf0\xdd\x9f\xfe\x6c\x26\x69\x7e\xfd\xcb\xf8\xcf\x41\xb5\xd1\xbf\xfc\x64\x88\x60\x6e\x1e\xa8\xde\x0d\x63\xc9\x7c\xd5\xfd\x9f\x2e\x6c\x55\x6a\x5b\xb3\xfa\x27\xdb\x8c\x8b\x09\x6d\xe4\xc6\x0b\x09\x5e\x7a\x1e\x23\x36\xc2\xb7\x73\xf6\x77\x67\x58\x04\x30\x79\xa3\x4e\x44\x35\x13\x40\xa8\x5d\x52\x86\x90\x1a\x5f\xb7\x7d\x67\xcd\xfc\x8f\xc0\x24\x80\x49\x65\x23\xa2\xa5\x84\xe3\x88\x47\xfe\x54\x10\xe6\x7a\x75\xe2\x5a\x01\x1c\xd4\x06\xaa\x39\xde\x63\x86\x35\x10\xf6\x29\xb8\x66\x1e\x30\xb7\xcf\x85\xd4\x9f\xfb\xed\xaf\x75\x11\xa7\xb7\x92\xbb\x02\xe4\xe6\xa4\x08\xec\xe8\xe8\x4b\x62\x4f\x97\x24\xe5\x4a\xd3\x1b\x36\x21\x57\x86\xb7\x84\xde\x30\x84\x9e\x20\x50\xc1\x92\xc5\xa4\x10\x9a\x27\xf0\x6b\x39\x8e\x99\x72\xc8\x73\xce\x67\x44\x15\xd0\xde\x3c\xcb\xd9\xd8\x71\x31\xfb\xd4\x0a\x2d\x28\xd7\x32\xf2\x9b\xbd\xa0\xa8\x0b\x64\x31\xbc\x0a\xf0\xa0\xc2\xa2\xd7\x4a\x1c\x97\x99\xa7\x14\x51\xc9\xb9\x00\x98\x6a\x42\xde\x01\xb3\x4a\x9c\x4b\x18\xd5\x12\x6b\xc0\x14\x2c\x62\x4a\xd1\x7c\x39\x82\xc2\xee\xdc\x17\x03\xb7\xa1\x3b\xc0\x51\x53\x2a\xb0\xac\x7a\xce\x22\x29\x94\xce\x8b\x48\x63\x9f\xbd\x69\x2e\x6f\x98\xf0\xe1\x82\x66\x17\xab\x01\x5c\x65\xfc\x0c\xf8\xbb\x24\x89\x16\x54\xcc\x83\x3e\x35\x29\x8d\x01\xf6\xdf\x78\x29\xc7\xad\xc7\x40\x80\xce\x8c\x60\xc1\x35\x80\x62\x6a\xf8\x88\x37\xc3\x7e\x10\xbe\x1e\xcf\xa8\xb4\x93\x9a\x25\xf1\x64\x0b\xed\xea\x44\xbf\x48\x47\xa3\xde\x18\xd8\x76\xcf\x01\x60\x29\xd3\x34\xa6\x9a\xee\x10\x04\xf6\xb6\x6c\xae\xe7\xfa\xeb\x63\x83\x53\xef\x98\xb4\x7c\xc8\x89\x5b\x32\xe3\x61\xfe\x13\x9c\xc4\x85\x83\x3c\x64\x5c\x6b\x83\x53\xd6\x51\x80\xb1\x5d\x20\xcf\xb8\xee\x65\x66\x78\x37\x1a\x92\x8b\xb2\x35\x63\x49\x4e\xda\xb9\xa1\x3a\x5a\x60\x0d\xe8\x77\x80\xd1\x75\xe9\x2b\x8b\xaa\xf1\x5d\x8d\x22\x08\x72\x09\x26\x34\xcf\x59\x98\x6e\x66\x41\x57\x08\x44\xf2\x1a\x10\x01\xca\x73\xa6\x55\x19\xa1\x82\x74\xd8\x10\x17\xcb\xef\xac\x32\x0a\x44\xda\x02\xd6\xea\x73\xcd\xb2\x10\x82\x5d\x49\x4b\x67\x0d\xe5\xbf\x17\xb8\xee\x62\x74\xc6\x76\x02\x6f\x65\xdc\xc5\x4e\x5d\xab\xc2\x5f\x0e\x51\xc6\x6f\x62\x24\xae\x02\xa5\x1e\x1f\x00\x6f\x95\xaa\x24\xcd\x21\x91\x5b\xd0\xdb\xdd\x8d\x54\xa5\x8c\x34\xf6\xa5\x8c\xe1\x73\x63\xf8\xdc\xf8\x79\x7b\x63\x5e\x97\x08\x10\x77\xb5\x8e\x04\xa9\x7e\xa4\x93\xe5\xd4\x90\x94\xab\x8e\xe6\xce\x5a\x36\xb2\x1f\xc1\xd2\x7c\xeb\x45\xf4\x9e\x5b\x9b\xe9\xc0\xb8\xa1\x16\x2f\xc8\xe7\x15\x2e\x6f\xa5\x29\xaf\x29\x61\xa4\xee\x91\x53\x9d\x26\x76\x2b\x5c\xf2\x79\xf5\xf1\xe3\xda\x60\x20\x5e\x34\x6b\x14\x2e\x22\xd8\x8b\x7c\x46\x3c\xcb\xc1\x78\xe6\xf2\x0f\x0c\x7a\xe5\x32\x49\x58\x0e\x4b\xb0\xda\x53\xcd\x8b\x0e\xb5\x4c\xd1\xa6\x3b\xf2\x2a\xaa\x97\x31\x05\xbb\xf3\xc2\x04\x55\x58\xba\xc5\x79\xbc\x98\x6d\x9c\xb7\x76\x3c\x1f\xb5\x7c\x2a\x96\x38\xf5\xb3\x00\xb4\xa8\x7a\x92\xb9\xf9\x90\x91\x3a\x05\x9d\x26\xe8\x3d\xf6\xcc\x16\xe6\x42\x93\x3b\xba\x54\x80\xf7\xa5\x34\xef\xbf\x6f\xab\xaa\x95\x03\x5f\xb2\x19\xbe\xdd\xda\x23\xb6\x93\x4f\x6c\x17\xaf\x18\xa4\x53\x72\xd1\x26\x04\xa9\x7c\x61\x63\xe3\x90\xfa\xb5\x8b\x1b\x0d\xe2\x54\xc0\x7d\xde\xcd\x27\x52\xed\x53\x7e\x71\x0e\x43\x38\x99\x7c\x0e\x7f\x38\x8e\xe3\x9d\x06\x53\x66\xb0\xba\x4c\x94\x06\x0c\x09\xdf\x6d\x88\x24\x28\x51\xeb\x1b\xa8\xc6\x6a\xad\xc4\xbe\xd3\x58\xce\x20\x12\x04\xbe\x38\x81\x76\x04\x54\x2c\x2d\x27\xd7\x0b\x9e\xc7\xe3\x8c\xe6\x7a\x89\xea\xe3\xa8\xf2\x35\x1f\x5e\xdf\x69\xe1\x3b\xba\x73\xda\x95\x3e\x5e\x0b\x61\x58\xbc\x33\x0f\x5b\xeb\xfc\x5a\xb8\x3e\xc4\x7a\xda\x07\xf0\x37\xae\x27\x2c\x2d\xea\x34\xc2\x47\x5b\x4f\x1c\x92\x8f\xfd\xf9\x86\xa1\x41\xaa\xea\x7a\x45\x36\x10\xb6\xae\x92\x61\x14\xb4\xe7\xf2\xa0\x10\x99\x91\x46\x46\x0f\xa5\x65\xaf\xf1\xc0\xb0\x67\x25\x05\x17\x43\x63\x3b\x1d\x89\xa5\x35\xdd\x84\xdf\x0a\x07\xf0\xa7\x84\x1c\x09\x29\xf0\xe4\xe0\xb3\xc7\x18\x42\xb4\xc6\x36\x05\x8f\xd8\x16\x75\xd5\x0e\xa1\xc1\x49\x75\x4c\x82\x8b\xd8\x6c\x1d\x50\x6e\xd0\x91\x54\x11\x45\x8c\x79\xad\x3a\x6c\x51\x53\x9e\x6c\x3b\x65\xd7\xea\x52\x49\x28\xe2\xa2\x34\x4d\x92\x52\x9b\xb5\xe0\x92\xc0\xe7\x9c\x05\x30\x60\x7f\x95\x44\x1b\xab\xd8\x43\x13\x75\x0c\x7b\x29\x44\x84\x2e\x7c\xae\x97\x6e\x06\x67\x75\x56\x0f\x6a\x84\x42\x25\x97\xcf\xd0\xee\x14\xa8\x03\x1e\x98\x40\x9a\x6c\x0b\xf7\x2a\x67\xb2\xb5\x19\x0c\x1d\x9a\xd2\xe8\xe6\x8e\xe6\x31\xb4\xf2\xcd\xa8\xe6\x58\x16\x7c\x54\x19\xf6\x28\x98\x03\x34\xd2\x0f\xb1\xe8\xd8\x2b\x1d\x8a\xf9\x12\xd4\xe5\x67\x08\x2d\xb4\x4c\xa9\xe6\x11\xa8\xb2\x7c\x16\x58\x11\x53\x5f\xd2\xb0\xd6\x76\x10\xa8\xac\x6f\x60\x7f\x8d\xde\x98\x9c\x11\x7d\x27\x09\x4f\x8d\x84\x40\xa1\x95\xc6\xcc\x67\x0c\x39\x7b\xe7\xa6\x99\x1a\x31\xe8\x7b\x30\x32\x07\x4f\xa1\x92\x6c\x54\x28\x05\xc3\x7b\x8b\xa6\x37\xe5\xd9\x94\x9b\x51\x8d\x81\xdb\x77\x0c\x4e\x9b\xb9\x06\xa8\x3a\x32\xdb\x73\xc7\x8c\x5c\xa0\x36\x22\xac\x9a\x34\xcd\x08\x7b\xda\x2a\x12\x73\x55\x6b\x4c\x7d\x14\xe7\x32\xcb\xac\x81\x24\x3d\xae\xcf\x08\xfc\x06\xf9\x2d\x53\x41\xef\x65\x34\x55\xcf\x99\xf0\xcd\xc3\x6d\x39\x0b\x38\xb9\xf5\x4f\x54\x0e\xcc\x04\x13\x42\x8f\xc9\xb7\xb6\xa9\x90\x47\x5c\x1f\x75\xd7\x4a\x70\x42\x6b\x8b\x95\x9d\x06\x89\xa7\xed\x35\x48\x3c\x83\xc4\xf3\xeb\x96\x78\x7c\xb8\xd7\xae\xd2\x4e\x19\xe3\x58\x6b\x48\xee\x82\x01\xca\x07\xd6\x19\x31\xce\x67\xe4\x92\x45\xf2\x96\xe5\x48\xe4\xa0\xf1\xa7\xe1\xe5\xaf\x29\x4f\x0c\x89\x73\xa4\xae\x54\x0f\xa1\xa2\x6a\xd5\x34\x17\x68\xe4\x1e\x9a\x16\xcd\x53\x3b\x29\x9b\xe9\x67\x9e\xb7\x4e\xb2\x2c\x67\xb7\x5c\x16\xca\x85\x2c\x14\x1a\x8f\x99\xd2\x96\xdf\x2e\xf8\xdc\x17\xe6\xf6\xae\xce\x9c\x45\x32\x8f\xcb\x94\x72\xa5\xa9\x2e\x54\x35\x4f\x22\x42\x6b\x5a\x7f\x06\x1a\x0f\xc7\x7b\xa6\xee\xbb\x51\x52\x8c\xd8\xd8\xe3\x54\x1c\xbe\xc1\x98\x8f\xb2\xef\xb6\x0e\xc2\x50\xca\x10\x18\x23\x42\x15\x9a\x05\x68\x65\x11\xa0\x33\xac\x2b\x59\xaf\x27\xd8\xb8\x65\xec\x87\x1d\x97\x51\x27\x2d\x2a\xae\x87\xd7\x4e\x50\x27\x7b\x24\x78\x86\xd7\x13\x0e\x3c\xa9\x2d\xb6\x7b\xf4\x25\xd9\x33\x02\x93\xec\x13\x85\x49\xfa\x8c\xc4\x24\x3e\x9e\x7b\x9f\x13\x73\xe9\x22\xc9\x6b\x67\xc6\x12\xde\x4d\x67\xa6\x52\x50\xc0\x8f\xc3\x95\xeb\x00\x69\xdd\x9a\xfe\x0c\x80\x49\x30\x8c\x07\xb6\xa7\x15\xb4\x39\xf4\x5d\xb2\x8f\xbe\xea\x6f\x20\xc7\x94\x4d\xb5\xb5\x84\x08\x84\x34\xc3\x4a\x40\x70\xea\xc6\x36\x24\xcb\x69\x4b\xc3\x09\x1e\x4e\x70\xdb\xf7\x1f\xf3\x04\x63\xc4\x73\x97\x80\xfc\x5a\xa7\x20\x7c\xdd\x26\xe1\xd2\x29\x4b\xc8\xcf\x05\xcb\x97\xc4\x08\x41\x65\x78\x0f\x94\x37\x56\x3c\xb6\x01\x32\xd6\xa8\xd2\x5e\x66\x7f\x40\xfe\x0f\x26\x9b\x57\x1f\x8d\x04\x08\x79\x6c\x7b\xd0\xb5\xfa\x50\xd5\x54\x65\x84\x96\x87\x60\x28\xe1\xa1\x87\xb1\x22\xf3\x19\x71\xef\xf4\xdd\xd9\x6e\x8a\x4e\x37\xa7\x16\xd9\xc5\xb1\xb5\xb2\xf8\xd3\x0d\x0b\x44\x40\xf8\x5f\xaa\xdd\xa4\xbc\x29\x82\xdc\xb0\xe5\xc8\xfa\xc1\x6d\xf5\x76\xf7\x30\x86\x73\x54\x4b\x8a\xb6\x2d\x55\xd1\x04\xa0\x1d\x28\xe4\x6e\xd6\x03\xbc\xda\x17\xa1\xac\xbe\xe5\x80\xd0\x95\x10\xef\x4c\xc2\x3b\x15\xab\x0c\xaf\x75\x85\x2b\x11\x27\xa0\x02\x9f\x8b\x6b\xf6\x68\x00\xb1\xdc\x40\x2d\xba\x6e\x22\xd9\x5d\x05\xc6\xcb\x01\x76\xef\xa5\x7a\x34\xad\x04\xe6\xde\xb0\xe5\xa1\xb2\x59\x83\x52\xa8\x05\xcf\x5c\x7d\x78\xa0\x04\x16\x73\xc9\x77\x10\x1f\xe0\x86\xc0\x33\x7f\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x20\x54\x08\x2d\x95\x92\xa9\x77\x52\xc3\x9d\x07\x07\x16\x4e\x77\x6f\x50\x59\x33\x25\x07\x33\x23\x86\xb4\x41\x7e\x86\x0b\x41\x01\x90\x58\x7f\xab\x07\x2b\x57\xe4\x5c\x10\x99\x3b\x98\x68\x57\x3c\x58\xd9\x21\x9c\x6d\x29\xb0\x08\x37\x8c\x61\x41\x29\xf3\x0a\x24\x37\x0c\xe7\x8d\xcb\xdc\xfd\x02\xb6\x27\xb0\xc6\xfb\xb8\x19\x28\x81\x4b\x35\x9b\xf3\x88\xa4\x2c\x9f\x43\x7e\x68\xb4\xd8\x7d\x83\xba\xd3\x6d\xbc\x76\xa2\xde\xe1\x87\x3b\x63\x06\xb0\xba\x37\x10\xb9\xb4\x2f\xc3\xc4\x51\x90\x45\xa4\x34\x33\x48\xf1\x4f\xc3\x09\x60\x5f\xfe\x0d\x25\xab\xd5\x84\x9c\xba\x86\xa7\xe1\x6f\xd6\x8a\x11\x0e\x63\x46\x30\x32\xfd\xcf\x05\xbf\xa5\x09\xc3\x78\x3e\x2a\x7c\x19\x4f\x39\x5b\x61\xd3\x23\x5b\xb7\xda\x50\x29\xef\x19\x3a\xb8\x61\xcb\x83\xd1\x0a\x22\x1d\x9c\x8b\x83\x32\x49\xbb\x82\x3a\x9e\xa1\x81\xd3\xe0\x00\x7e\x3b\xe8\x9b\xb3\x3f\x92\x68\xbf\x03\x96\x58\x83\xd0\xcb\x84\x2a\xd5\x2d\xbf\xb5\x96\x5a\x54\x1b\xa7\xa9\x00\xe3\x55\xf0\x4c\x99\x5c\x64\xa3\x37\x7b\xb7\x67\x41\x94\x7f\xf7\x48\xa3\x4e\xd0\xbb\xb5\xdd\x53\xda\x17\x6e\x68\x2c\x28\x06\x65\x0b\x5c\x0e\x47\x25\x2f\xae\x74\xc6\xae\x81\xd7\x77\x60\x57\x94\xb3\xb0\xc9\x33\x57\xa0\x06\x73\x97\xd5\x21\xa4\x26\x5c\x44\x49\x61\x4d\x8a\xf0\x2a\x28\xd1\x5d\x45\xfd\x1d\x80\xb3\x07\x52\x95\x03\x38\x6c\x72\x6e\xdf\x95\x00\xde\xba\x87\x0e\x7c\xa2\xde\xe3\x85\xb0\xea\x7b\xad\xb3\x2d\xe1\x92\xd5\x62\x9c\x51\x55\xf6\x78\xcd\xa7\x39\x23\x2f\x17\x54\x08\x96\x04\xd9\xae\xd6\xd8\xe1\xdb\x59\x81\x40\x62\x9b\x58\x1d\x56\xbb\x58\x39\xfa\x26\x7c\x6e\x75\xef\xbd\x83\x7f\x49\x4d\xa5\x7a\xeb\x53\x6e\x4b\x35\x2e\xe4\x1d\x89\x25\xb9\x83\xbe\x05\xb7\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x29\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xdd\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x23\xf3\xf0\xf1\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x1c\x93\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6c\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x22\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x85\xdb\x95\xc1\x55\xf1\x89\xe7\x7c\x3e\xdd\x88\x7d\x64\x91\x8d\x0a\xce\x92\x62\xce\xb7\xa4\x3f\xfc\xca\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\xeb\xe6\x02\xe4\x31\xcb\x98\x88\xa1\x24\xda\xeb\x12\x73\x71\xf2\xbd\x42\xce\x96\x17\xeb\x4a\xb5\x5c\x55\xb2\x0a\x05\x0f\x42\xb8\x16\x32\x89\x15\x61\x1f\x75\x4e\x0d\x61\x4a\x0d\x09\xf2\xef\xcc\x08\x15\xed\x89\xcc\xd3\x28\x11\x4c\x7a\xe7\xf6\xf7\xdb\x2f\xf3\x29\xb6\xbc\x2c\xd7\xae\x36\x36\xac\xde\xaf\x74\x3d\x12\x62\x7b\x56\x54\x35\x42\xb8\xa1\xc4\xbc\xfd\x4a\x35\x32\x71\xbf\x52\xf3\xaa\xa1\xa8\x76\x6d\x56\x43\x9b\xce\x4f\xa2\xee\xfc\x0c\x12\x83\xbb\x14\x61\xb2\x6f\xd4\x34\x6a\x7b\xb3\xde\x10\x7a\x83\x06\x6d\xf1\x36\xe0\x03\x50\xf1\xd4\x0e\x64\xd3\x9a\x88\x32\xb0\x2c\x43\xe7\x0a\x21\xb6\x51\xb1\xfb\xa8\x22\x4e\x35\x55\x4c\xb7\xb3\xa6\x54\x45\x87\xf2\x4d\x73\x00\x43\xfc\xb2\x3f\x61\x15\x7b\x08\x48\x77\xc9\xb2\x64\xfc\x17\x2b\x65\x88\xca\x93\x46\xbe\x70\xf0\x71\x45\x9a\x98\xf7\x22\xe3\x18\xb1\xd9\x95\x88\xea\xd6\x2d\x77\x5a\xf1\x05\x3b\x83\x6f\xbf\xed\xdc\xcb\x35\x78\xd3\xc9\x21\xf0\xef\x2a\x10\x2c\x2e\x40\x21\x1f\xfe\x73\x11\xaa\x03\x50\xdc\xc2\x2f\xdb\x3e\xdf\xd7\xda\xe6\x11\x2b\x8d\x57\x67\x5c\xdd\x74\x29\x46\xb6\xf2\x72\xf5\x48\x7c\xfd\xf2\x15\xb1\x77\x5b\xd9\x97\xba\x18\x98\xf6\xad\x8c\x35\x8f\x58\x69\xb4\x8d\xb9\xba\x79\xf0\xb6\xea\x59\xfc\x6e\x5b\x04\xf8\xc3\xd9\xbf\xea\x52\xaf\x2b\xd1\x12\xd4\x0e\x5a\xca\x82\xdc\xd9\xd2\x07\x56\x6a\xbe\xe6\xd9\x0b\xf2\x4a\xa8\x22\x67\xa5\xe7\xb6\x3e\x94\xe1\xba\x4f\xa9\xf5\xfa\x5e\x58\xf2\x94\x8d\x6f\x19\xcd\x35\x88\xc7\x5d\xd1\xc0\xbf\xe8\xe8\x53\x70\x43\xb4\xc1\x83\xf3\x99\x0b\xac\x1b\xd9\x1c\x6f\x5f\xb8\xcc\x3d\x64\x76\x3e\x28\x6b\x12\xee\xf5\x6b\x5f\xf2\x87\x9c\xc4\xec\xf6\x44\xc5\xf4\xf9\x08\x3e\xe3\x02\x9e\xab\x73\xa2\x8a\x1c\x3c\x3f\x98\x90\x2b\x9e\xf2\x84\xe6\xc9\xb2\x52\x8a\xb9\x7c\xce\x30\x0b\x37\x20\x78\xe5\x9e\x1d\x90\x23\x99\xc3\xc8\x11\x15\x24\x61\x2e\xa3\xc9\x9e\xb3\x25\xca\x8e\xc7\x0f\x4d\x5c\xc8\xbd\xda\x2f\x91\xce\x74\xc6\x89\xd8\x71\x6c\xcb\x8f\x2a\xe5\x6c\xce\x4a\x92\xce\x85\xa1\xf3\x13\xf2\x6d\x53\xa3\x72\x38\x32\xee\x89\xc7\x02\xea\xc3\xe8\x7d\x3b\x69\x70\xab\xe6\xe0\xc7\x03\xd3\x76\x2d\x71\xce\xf5\x25\xcb\x64\x27\x09\x01\x5f\xa9\xd9\xe3\xb8\x36\x37\xa4\xe2\x50\xa8\x94\x6a\x68\x0b\x9c\x6b\x1e\x15\x09\x35\x62\x35\x5a\xe3\x26\xe4\xec\xd5\xc5\xe5\xab\x97\xa7\xd7\xaf\xce\x5e\x90\xaf\xed\x48\x3c\x94\xf0\x26\xe4\x3a\xac\x06\x15\x44\xf4\xda\x92\x3b\xfe\x5b\x23\x4b\x86\xa8\x28\x8b\x3b\x42\x8d\x0f\x2a\xc8\xb9\xe0\xba\x2c\x8f\x8c\x71\x67\x89\x14\xcc\x75\x0f\xcd\xa4\xb5\x06\xce\x39\x46\x83\x08\x3b\x98\xf9\xb9\x3a\x1a\x9c\x0e\x2c\xb5\xea\xa7\xb2\x45\x11\xbc\x07\xd1\xa2\x04\x6e\x5f\xe2\xbf\xab\x7f\xda\x55\xf6\xf5\xd5\x68\x5d\x82\x13\x5a\xff\xcb\xfb\xc8\x0c\x7c\x61\x76\x57\xee\xa6\xa1\xa5\x35\x31\x6c\xe6\x70\x72\xe8\x04\x8a\x64\xa5\x08\xbf\x1f\x34\xac\xe8\x55\x45\xb6\x09\x21\xef\x5d\xc8\x36\xa4\x1e\x37\xd7\xf3\xc7\xea\x10\x41\x55\xf8\x1a\xca\xba\xc4\x98\x62\x1a\x7e\xd4\x96\x00\x9b\xf3\x5b\x26\x70\x61\xfd\x52\x28\xf7\xf9\xce\xdd\xd1\xca\x79\x5b\xfd\xe3\xf2\x4d\xbf\x33\xc3\xf3\xd7\x79\x5e\xf6\xd8\xda\x59\x45\x32\x4d\xb1\x5e\xd4\xc2\x27\x18\x96\x39\x82\x9e\x2a\xf4\xa6\xf9\x60\xe5\xab\xd9\x16\xe4\xaf\xd1\x33\xf7\x52\x4d\xd3\xf1\xb7\x6d\x52\x82\x28\xc5\xdc\xee\x75\x98\x6d\x91\x35\xe5\x8a\xa7\x58\xd2\x7e\xe2\x3f\x7e\x72\xf9\xea\xf4\xec\xed\xab\x49\x1a\x3f\x38\x69\x61\x22\xce\x24\x17\x5a\x6d\xd7\x6f\xb6\x75\x9d\x69\x4f\x7e\xfc\x47\xbb\x72\x67\xff\xa2\xc3\x31\x77\x23\xa8\x4b\x17\x33\x4d\x79\xa2\x82\x3d\xd4\x32\x93\x89\x9c\x37\x97\x5f\xee\xb0\x39\xbf\xc1\xfa\x32\x63\x3a\x36\xbb\xde\xaf\xa8\xdf\xa6\x8f\x46\x5d\xca\x2f\x3b\x62\x97\x6b\xf5\x52\x33\xb4\xbb\x78\xa2\xcb\xbd\x17\xe1\x6c\x05\x06\xa8\x48\xc2\x01\x76\x25\xfb\xca\x1a\x78\x41\x0f\x9b\xb6\x52\xdb\x7d\x83\x6e\xbb\xc0\x66\xe8\xcf\xf6\x46\x45\x55\x98\xb9\x77\xaa\x04\x2e\xcb\xd9\xd8\x97\x6b\x82\xd6\x2a\x32\x0f\x18\x6e\x48\xef\x9c\xf5\xc6\xd9\x7a\xf0\xa9\x64\x59\xb7\xe2\x94\xf2\x91\x37\x7d\x61\x8d\x81\x24\x59\x96\x65\x20\xad\x16\x4d\xe7\x58\x86\x29\xb7\x66\xe2\x2c\xe7\xb7\x3c\x61\x73\x28\xc5\xca\xc5\x3c\x48\x7f\x0d\x13\x66\x6d\x69\xd6\xaa\xd1\xf5\xad\xf9\x2b\x28\xba\x0d\x78\xf1\xee\xfd\x35\x54\xf5\x05\x07\xd7\xde\x42\xb8\xf9\x20\x9c\xb7\xf1\x78\x0c\x26\x83\xa3\xbf\x1b\x79\x32\x4e\x8e\xc9\xf7\xcc\x7e\x47\x42\xd9\xe1\x1c\x5a\x01\x2d\xa4\xaf\x01\x0b\x73\x2d\x21\x0b\xe8\x88\xee\x7d\xfb\xd4\x89\x79\xd2\xc8\x4a\xc8\x6a\x2a\xcf\x43\xe7\x53\x2c\xdd\x88\x3e\xa6\x87\x97\x3d\x7b\x24\xfb\x3b\x53\x39\x67\x5a\x6d\xc2\x4f\xef\xf8\x71\xf4\x90\x12\xb5\x4c\x13\x2e\x6e\xca\xba\x60\x33\x69\x70\x08\x53\x13\xb8\xb8\x71\x18\x9b\x33\x9a\xac\xa7\x94\xbb\xe0\x47\xaf\x54\x52\xef\x60\x01\x04\x0b\x9d\x39\x67\xff\xed\x8e\xbd\x75\x43\x87\x24\xee\xe0\xe0\xc9\xad\x97\xab\x6e\x6d\xf0\x0f\xe1\x85\x0a\x4d\x13\xe4\xfc\xea\xe5\xd5\xf9\x83\x5a\xa8\xd7\xb1\x04\x98\xdd\x23\x4a\x75\xfc\xe7\x6d\xde\xe1\x31\x49\x8a\xed\xcf\xa0\x7a\x77\x21\x73\x4d\x93\x9e\x88\x40\xb4\xa0\xd9\x69\xa1\x17\x67\x5c\x41\x0d\x85\xae\x42\xc0\xca\xfb\x41\xa4\x33\xd6\x6e\x76\x05\x03\xb9\x43\x07\xfb\xdc\xcb\xff\x3e\xbd\x20\xb4\x30\xfb\xab\x6d\x71\xd1\x5e\x1d\xee\x6e\x66\x57\x98\x61\xb0\xe3\xba\xec\xdb\x5b\x56\xe5\x9e\xba\xef\x35\xdd\x47\x1c\xee\xe0\x8b\x00\x1a\x8a\x14\xec\x09\xfb\x1f\xb8\xe0\x9a\x53\x2d\x5b\x36\x2a\xab\xa0\x40\xe5\x5d\x6f\x10\x28\x94\x96\xa9\xc5\xe0\x73\xf7\x04\xb8\x90\x81\x8b\xaf\xbc\x54\x5a\x0b\x40\x7a\x07\x88\x9d\x0b\x23\x6b\xd3\x88\xd5\x02\x20\x47\x50\xf4\x13\xc7\xe6\xfe\x99\x3f\x5b\x03\x15\xd4\x07\x4b\xfe\xf2\xa2\x52\x8a\x7d\xa5\xaf\x85\xb3\x52\x94\x4d\x13\x7a\xb5\xf8\xf0\x9f\xbb\x12\x05\xfe\xb3\xa8\x59\xda\x70\x81\xff\xa7\xa0\x09\x02\xe6\x5d\xdf\x66\xa9\x2a\x90\xbb\xce\xb7\xba\x43\x76\xea\xe5\x76\xbc\xf3\x5a\x7a\xa1\xb0\xf2\x18\xae\x47\xe7\x54\x28\xb3\x47\x55\x5d\xec\xd0\x3a\x9e\x0e\xc9\x91\x8e\xb2\xd6\xbd\xfb\xef\x29\xb4\x3d\x29\x44\xa5\x91\x33\xcc\xfc\x1a\xb7\xe5\x8d\x0f\x6d\x6f\x3b\xc9\x7b\x71\x0d\x01\x96\x77\xb5\xaa\xd8\xb7\xfc\x6e\x85\xeb\x42\xd6\x4f\xde\x70\xa5\x5d\x43\x06\xb8\xc1\x95\xad\x23\x0c\x72\xd7\x85\x51\xe4\x78\xf6\x37\x1a\xc7\xf9\x0b\xe4\x52\xae\xfb\x72\x0e\xd2\x97\x2b\xf2\x45\x85\xf7\x25\x1e\xe9\x65\x66\x0b\x00\x5e\xbf\xbc\x20\xd8\x20\xe5\x4f\x5f\x62\xe7\xd7\xdf\x7f\xf1\xe5\xb3\xd6\xdb\xfd\x78\xc1\xe3\x3b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x57\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\xff\x3f\x7b\xd7\xd7\xdc\xb6\x6e\xe5\xdf\xfb\x29\x30\xee\x83\x6f\x66\x24\x39\xb9\x73\xb7\xb7\xd3\x7d\x72\xec\xe4\x56\xdb\x24\x57\x1b\x25\xdd\xe9\x74\x3a\x3b\x10\x09\x4b\xac\x29\x80\x4b\x80\xf2\xd5\x74\xfa\xdd\x77\x70\x0e\x40\x02\x94\x28\x12\x14\x2d\xdb\x89\xf4\x92\x98\x24\x48\xfc\x3d\xff\xcf\xef\xe8\x55\x2e\xe9\x7d\x3f\x09\xe6\x1c\x67\xf7\xa4\x71\x76\xa4\xcc\x28\x41\x22\x11\xb8\x5d\xdc\xa6\x90\x62\xb8\x4b\x76\x90\xe2\xcc\x9e\x1f\xc5\x69\x9d\x9b\xf6\x5d\xe4\xef\x1e\xd7\x19\x6f\xcb\xdf\x54\x21\xec\xb7\x9f\xe6\xff\xfb\xe1\xfa\xed\xbb\x0f\xd0\x53\xe3\xbf\xd7\x5b\x23\xe1\xbd\xe3\xa7\xba\x6f\xb5\x2e\xca\x6b\xfb\x84\x84\xb9\x65\x78\xcd\x21\xc3\xc9\xa7\xf7\xf3\x50\x5f\xcc\xb1\x02\x3a\xbf\xeb\x34\xf6\xd3\x5a\xdb\xa0\xaa\x09\xcb\x87\xcb\x1f\xe9\x6d\x94\x73\x80\xb4\x3c\xfd\x4b\xaf\x14\xf6\xf0\x68\x15\xa9\x75\x05\xc8\x33\xf0\x3b\xe8\xf1\xe2\x1c\x0c\xee\x71\x78\xa4\xb9\xea\x2a\x07\xe4\xe1\x89\x45\x97\xd8\xca\x8a\x00\xfa\x90\x22\x6d\xcb\x35\xcd\xd6\xd4\x9a\xc9\xb2\xfa\xc2\x33\xdd\x29\xd9\x3e\x78\xe6\x10\xea\xb5\xf7\x05\x5e\xb9\x32\xcf\x17\xe3\xe5\x52\x34\xc1\x99\xdb\x08\x05\x6a\x94\x57\x99\xd1\x68\xd0\x82\x2a\xd5\x25\xbc\x02\x49\xee\xa7\x27\x80\xf0\xd9\x01\x03\x69\xcb\xf7\x85\x6e\xe4\xb2\x61\x3d\x4b\x2e\x68\x85\x6c\xa1\x8f\x4c\xd8\x0c\x44\x37\x9d\xee\x89\x97\x8f\x9c\x56\xdb\xf9\x9f\x9e\x8a\xce\xd0\x4a\x4e\xb6\x12\x4a\xf0\xde\x51\xf2\xfb\x9a\xfb\x07\x7a\x06\x4f\xdc\x54\x65\x6c\x9c\x1a\x8f\x10\x41\x59\x3a\x23\xb4\x3c\x67\xd9\x85\xe0\xd6\x2d\xe1\x3b\x25\x4e\x2e\x82\xc4\xd3\xdb\x81\x0e\xdf\xcb\x4d\xf1\x0c\x35\x06\x0f\x1a\x0c\x12\x07\xe7\xa4\xe8\x26\x76\xc6\xa6\xb7\x46\x34\xb3\x09\x27\xd2\x6c\x48\xd2\xbc\x23\x07\x63\x9d\x22\x57\x0f\x22\x0f\x4f\xf5\xf6\x1b\xd6\x62\x15\xcc\xbd\x9d\x54\xac\xe7\x78\x7a\xb0\x8f\x4f\x7c\x82\xe6\x70\x82\x6a\x00\xe7\x4d\x27\xe9\x31\x0e\xd2\xd3\x1e\xa0\x63\x19\xd5\xe3\x66\xf9\x0e\x2a\xa4\xdb\xed\x16\x38\x54\xdb\xcc\x18\x13\xf4\x22\x55\xd4\x82\x82\xc9\xc5\x39\x71\x83\x51\x87\x5c\x60\x09\xca\x10\xc2\x60\xdb\xa0\x01\x17\x81\x9e\xd3\x54\xcf\xaa\xe0\x2e\x44\xb4\x49\xe3\x1d\x11\x44\x59\x5e\xd3\xcc\xd6\xe4\x16\x0f\xfc\x81\xe6\x31\xb9\x9e\x4d\x87\xa1\x06\x01\x71\xd6\xb8\x93\xba\x21\x7a\xf9\x91\xd6\x55\x4b\x2c\x73\xb3\x62\x50\x5b\x91\x2c\x12\x25\xab\x9a\x7e\x4c\xb9\x7a\xa5\xa6\x82\xa5\x2f\x4b\x9f\x65\x7d\x6e\xcd\x9b\x1c\x86\xc9\x89\x88\x14\x4d\x6d\x11\x01\x53\x26\xe7\xf5\xeb\xd7\x68\x0a\x7b\xfd\xf3\xcf\x3f\x63\x65\xa5\x98\x45\xc9\x7a\xf7\x41\x78\xea\x3f\xde\xbc\x99\x90\xbf\x5d\x7f\xfc\x00\x95\x1f\x33\x25\x11\x95\x04\xdf\x8c\x95\xe0\x9d\xc6\x72\x44\xfe\x6b\xfe\xeb\xa7\xaa\x4c\x8c\x7f\xd7\x14\xd4\x36\xc3\x9b\x90\x5b\x27\xfe\xc9\x35\x74\x51\xb5\x32\x05\x8d\x14\xa1\x77\x77\xb8\x31\x16\xb6\x9c\x2e\x1e\x38\x9b\x3d\x0e\x55\xc1\xb1\xfe\x88\xde\x12\x29\x04\x66\x69\x95\x1c\x4d\x83\x16\xd9\x00\xe3\xcc\xe0\x5d\x25\x99\x84\xae\x8c\xb0\x96\xfc\x9d\x84\x2a\x24\x15\xfc\x5f\xce\xa4\x16\x4a\x4d\x75\x45\x7c\x59\xb5\x32\x92\x75\xc6\x7a\x78\x0c\x0f\x50\xe7\xea\x18\xbe\xe9\xde\x9c\x21\x0b\xdf\x6a\xb0\x8b\xab\x32\xf5\xff\x44\x6f\x68\x5b\x90\xf0\x23\x79\x64\xbc\xbe\xce\xca\xde\xe0\xd2\x19\x94\x80\x8a\x4e\xd0\x54\x40\x25\xaf\x72\xa5\x2b\x2e\xe6\x14\xbd\x6f\x1f\x4a\x30\xf8\x62\x28\x00\x2f\x12\xaa\x8f\xb4\x73\x39\x1f\x3f\x5e\xc4\xb6\xf6\x70\x15\xe8\x42\x14\xca\xfa\xb0\xcd\x7d\x48\xc0\xc6\x2a\xeb\x01\x30\x92\x3d\x90\x27\xfb\x20\x10\x07\x83\x98\xfa\xfe\x66\xe0\x09\xbe\x28\x31\x22\x8c\x46\x2b\x72\xcf\xb6\x63\xa4\x5b\x19\x85\x6c\x1e\x98\x95\x5b\x3d\x17\x5e\xe1\x93\xaa\x76\x8d\x96\x8f\xcd\x94\xd9\xc0\x00\x87\xfb\xd8\x6c\x20\x2b\x84\x4a\x23\x2f\x19\x18\x51\xee\x58\x0a\x2c\x56\xb5\x53\x8f\xb8\xc4\x0d\xc5\x62\xe4\x7e\x92\x8a\x3e\x6f\x2c\xd6\xcd\xe4\xa1\x2f\x57\xd1\x10\x9a\x0e\x1a\xee\x56\xf0\x9d\xd6\xa6\xf8\xb6\x11\xfe\xe0\x83\xd4\xa2\x33\x3b\x11\x15\x50\xce\xcf\x54\x72\x32\xcf\xda\x59\x2a\x27\xc2\x4b\xa2\x91\x4c\x15\x66\x6a\xb0\x5e\x58\xc1\x53\x26\x25\x49\x60\x84\x6b\x9a\xdf\x33\x0b\x18\x43\xd3\x09\x99\xe9\x4e\x96\xf8\x55\x08\x8b\xbc\xc1\x10\x3b\x7d\x66\xdd\xec\x20\xfd\x91\xcb\xc9\xe4\x12\x09\xfc\x9e\x5c\xa1\x80\xfd\xd1\x0f\x53\xb7\x07\x96\x6e\xad\xb4\x77\x26\x11\x19\x58\x8b\x7c\x80\x7c\x2d\x20\x0b\x4e\xad\x2c\x03\xa3\x9d\x41\x94\x76\x87\xd3\x03\x00\xb6\x2f\x6e\x79\x1f\xd4\xf2\x4e\x7e\x0b\xff\xd7\x1f\xad\xbc\x17\x56\x79\x13\x52\xb9\x59\x29\x73\xda\xc2\x31\x9c\x8f\x80\xd8\x5e\x07\xc1\xbc\xda\x9f\x6f\xa4\x04\xb9\xc3\x43\xe9\xe9\x24\x23\x1a\xd0\xa7\x94\xbd\x28\xa1\x70\x7a\xb7\xaf\xea\x9c\x4d\x16\x74\xe4\x65\x4b\x43\xf5\x0c\x3c\xbd\x34\x18\x56\xcb\x85\x04\x8b\x87\xf5\x5f\x88\xb8\x58\xff\x75\x73\x06\xd6\x7f\xbe\xc2\xe6\xa4\x25\x95\x44\xdf\x8d\xe2\x87\x29\x55\x02\x30\xbb\xab\x23\x38\x21\x1f\x0d\x53\xc0\xcd\x48\x17\x52\xa4\x85\x2a\x33\x99\xf6\x70\x0c\x78\xa9\x45\xf8\xc6\x94\x52\xfb\x98\xc3\x3f\x80\x73\x22\x59\x0e\x65\x25\xf8\xeb\x75\xc4\x43\x6b\xee\x7d\xb3\xc1\x24\x47\xcc\xa1\x15\x25\x7a\xcf\xa3\x7d\x41\x89\x3b\x61\x63\xa9\x3d\x19\x07\x22\x49\x94\x44\x01\xca\x8a\x2b\xa6\xd0\x53\xf0\x10\xbb\x59\x6d\x4c\x5f\x8d\x61\xe2\x7a\x36\xed\xa5\x01\x38\xed\x1b\x74\x00\xf7\x89\x6f\x58\x0b\x98\xa2\x16\xe0\x96\xdd\xb9\xad\x46\x6e\x4c\xca\x9a\xec\x3c\x7b\x31\x72\xa7\xdb\xef\x35\xb1\x74\x83\x4e\x7d\x0c\x3d\x34\xf6\x54\x64\xd5\xc1\xdd\xb3\x5e\x47\x38\xc4\xcf\x5d\xe4\x3c\xa1\xf8\x08\xf3\x11\x54\x2e\xdd\xfe\x76\xab\xd9\xc1\x60\xc9\x1c\x4a\xdb\xa0\x3e\xe8\x28\x96\x99\x88\xff\x64\x4a\x49\x73\x2e\xb0\x80\x9c\x1c\x61\x6d\x1c\x39\x42\x85\x51\x4b\x11\x8e\xaf\x38\x77\x4c\xee\xbd\xe5\x86\x5e\x55\x8e\x8e\xa9\x73\xa4\x17\x10\x46\x3e\x0b\x5d\x45\x72\x64\xd9\x22\xe2\xb0\xa6\x7e\x85\x50\xbc\x35\x35\x6f\x2a\xeb\xbc\x47\x2b\xb6\xa6\x88\xe1\x67\x87\xa7\xa9\xcc\x43\x9e\x28\xc5\x10\x4b\x89\xe5\x6b\x49\xc4\xdd\xc8\xf3\x19\x5c\x6c\xde\x5c\xf4\x29\x07\x73\x64\xc5\x1e\x52\xad\xc2\x00\x93\x31\xf3\x44\x36\xbd\xaf\x41\x97\x48\x01\x78\x93\xd7\x0c\x12\x9a\xc1\x6c\x70\xf6\x4e\x3e\xf0\x21\xf4\xa8\xbe\xfa\xd3\xa8\x14\x18\xce\xfa\xd3\x59\x7f\x1a\x44\x7f\x72\x18\x8b\x25\x38\x7b\x74\x29\x37\x60\xd8\x2a\x54\x55\x22\x93\x03\xc0\xa3\xb7\xa6\x55\xa5\x44\xee\x5b\xdc\xb4\x3e\x74\x69\x15\x2c\xb3\x8f\x0b\x75\x37\xfe\x23\x61\x3c\x12\x31\x2e\xbe\x7e\x7f\x2e\x15\x88\x36\x95\x4e\xe2\xf6\x65\x6d\xbf\xe5\x5a\xed\xe0\xdd\x7d\x97\xae\x17\x1d\xb0\xae\xc0\xf7\x03\x31\xf8\x8a\xad\x97\xc9\xc4\xb6\x56\xb6\xc5\x1a\x30\xfc\xbd\x72\x42\x62\x59\x69\xd8\xdc\xb6\x62\x2e\xf9\x01\x2f\x4e\xa2\xac\x18\x99\x07\x26\x6b\xb6\x16\xf9\x76\x54\x3e\xa4\x6f\x7a\xad\xcc\x13\xaf\x40\x26\x88\x8a\x5c\x6b\x80\xe9\xf6\xa5\x4a\x07\x76\x82\x4e\x2c\x1c\x94\xeb\x14\x56\x34\xc8\xfd\xf9\x5b\xa2\x02\x15\x03\xfd\xbe\x2a\xa2\x74\x57\x42\x1e\xca\x51\xa5\x76\xea\xab\x8c\x6f\xc8\x86\xe6\x01\x55\xd0\xdd\xdf\x91\xf2\x40\x9c\x6c\x12\xd9\xaf\xde\x61\x6d\xe8\x73\xc3\x34\xd0\xae\x23\x0a\x95\x15\xca\x50\x4a\x7b\x2a\x6c\xca\x7c\x79\x1a\x6a\x42\xd1\x9b\x8b\x5e\xdd\x78\x31\xf5\x85\xf1\xd7\xb3\xca\x30\xfe\x8e\xad\x35\xec\xbf\xa5\xf7\xb6\x19\xb4\x72\xb8\xfd\xd9\x6d\x31\xc4\x39\xac\x58\x64\x85\xf3\x60\x85\xd3\x13\x1d\x34\x0c\x37\xe9\x65\xb7\x31\x08\xf5\xfb\x4d\x36\xe6\xe6\x37\x6c\xad\x19\xd6\x67\x6b\xf2\x0b\xbf\x73\x87\xed\xdc\xd4\x33\x38\x7b\x6b\x3b\x6d\xc1\xb3\xb7\xf6\xec\xad\x3d\x7b\x6b\xcf\xd6\x86\xb3\xb5\xe1\xec\xad\x25\x67\x6f\xed\x20\x73\x38\x9c\xb7\x16\x45\xbd\x7d\x3e\x5b\x23\xec\x55\x0e\xdb\x93\xfa\x6b\x4d\xe1\x9e\xeb\x28\x12\x05\x57\x5f\xc4\x3d\xeb\xec\x74\xa8\xc9\xff\x3b\xef\x01\x00\x84\x06\x7d\x60\xf7\xe1\x93\x29\x07\xe1\x52\x49\x90\x6c\xd1\x47\xaa\xa0\x45\x9c\x68\xc9\xbf\xf7\x36\xb3\x2f\x70\xc1\x89\x78\xcc\xe2\xea\x86\x39\xca\x4a\xcf\xf5\x84\x5c\x93\x9c\x45\x49\x96\x98\x32\xf2\x14\xaf\xe3\xc6\x2b\x6b\x23\x24\x4a\xb2\xf4\xce\x60\xd4\x73\xb7\xd6\x4f\x25\xbf\x1b\x3a\xb8\xf7\x33\xc8\xa1\x84\x45\x32\xb7\xb5\x90\x72\xf6\x4f\xcb\xda\x4c\x6f\xbe\xb8\x6f\x70\xcd\x2b\x30\x14\xaf\xc4\x10\x7c\x2c\x4b\x4c\x82\xf5\x63\x1f\x7f\xf6\x5b\x96\xe4\xb0\x79\xe7\x2c\x12\xbc\x4b\x4d\xd5\x86\x05\xda\x79\x53\xc5\x9f\xc0\x36\xca\x62\x12\x17\x79\x59\x33\x75\x43\xd3\x24\x4e\xd4\xb6\xf4\xda\x99\xf2\x5a\x14\x4f\x4c\xb9\x8c\xb2\x9a\x46\x42\xb3\x2c\x17\x34\x5a\x31\xe9\x7c\x0d\x05\x14\x93\x44\x56\xc6\xbe\x63\x09\x38\x90\x51\xa0\x8d\x66\x90\xe9\x96\xe4\x42\x59\xc7\x7b\xc3\x07\xbf\x38\x2f\x83\xe6\xc8\xe5\x54\xbe\x05\xef\xbc\x70\x5f\x81\xbd\x4a\xee\xdc\x3f\x24\x11\x69\x6c\x21\x4c\xfe\xf8\x5a\x0b\x85\x91\xd9\x83\x9a\xf8\x01\xc0\x85\x12\x24\xd5\x0c\x5b\x13\xc4\xe6\xc6\x3f\xfe\x44\x56\xa2\xc8\xe5\xc4\x05\x1d\x78\x03\xd7\x50\xbf\xb3\x42\xa5\x22\x29\xa3\x52\x91\x37\xaf\xc9\x3a\xe1\x85\xe6\x53\xc1\xdb\x26\x5c\x0e\x72\x24\xa0\x3f\xfc\xd4\xb9\x5d\xa8\xec\xd3\x28\xf5\x64\x88\x8d\x6c\x44\x1f\x73\x92\x30\x31\x0e\x91\xc5\x6b\x82\x90\x21\xba\xee\x6c\x73\x25\x1e\xe1\x7c\xfd\x5f\x21\x16\x5b\x15\x92\x44\x69\x5a\xf8\xd9\x93\xff\x6d\x2e\x76\x01\x4f\xa9\xb0\x53\x0e\x7e\xf4\x51\x2a\x5c\x2c\x13\xa9\x5a\xea\x5b\x54\xf9\x95\x07\x1f\xeb\xce\x56\x96\x5a\x3b\x08\xcc\x95\x81\x36\x56\x22\xb6\xb6\xa5\x28\x62\x58\xcc\xf2\xb6\xaa\x94\xc4\x05\x3e\xdb\xfa\xfa\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\x26\x74\xd9\x2d\x11\x3c\x56\x6c\xe6\x9f\x02\x99\xf0\x25\x82\x9c\xaf\x8b\x54\x25\x59\x5a\x8d\xfb\xb3\x6d\x60\x08\xb9\x6b\x73\xa3\x8e\x99\x88\x62\x62\x31\xa2\x4d\x81\x7d\xf2\x87\xf2\x5d\x8c\x2b\xc4\xea\xce\x35\x3f\xc8\x68\x4e\xcb\xc9\x83\x4a\xba\xf2\x95\x31\xdf\x51\xf0\x28\x1a\x38\x4c\xdd\x8a\xa6\x55\x8f\x1d\x2f\xd2\x90\x9b\x46\x31\x4e\x79\x07\x53\xb5\x0f\xcf\x05\x8d\x88\x78\x28\x83\xc9\xb0\x0c\x4a\x6d\xb7\x18\xa1\xe6\x2d\x8d\xee\x19\x8f\xb1\x68\x14\x0c\x3b\xde\x72\xba\x36\x68\x5b\x4e\x3d\xee\x5a\x7b\x39\x32\x86\x09\x4c\xdf\xb3\x69\xc6\xc8\x75\x87\x9c\x83\x42\x06\x43\xd9\xe8\x26\x6d\xe7\x5c\xa2\xc9\x26\x4f\x36\x11\xb3\xfc\x5f\xb7\x1b\xb2\xeb\x9b\x0e\xb9\xf4\x3b\x9d\xb7\xcb\xe3\xec\x5f\x20\xf7\xa5\xe5\x1c\x40\xb5\x68\xaa\x8f\xf6\xb6\xcc\x19\xad\x2d\xee\x62\x3b\x6c\xd5\x9b\x7c\x11\x92\xf9\x7b\x99\x2f\x62\xff\x10\x7f\xa6\xb1\x90\xe4\x6d\x2a\xa2\x7b\x72\xcb\x40\xe8\x7a\xcc\xf2\x2c\xf9\x22\x7e\x4a\x08\xef\x35\x5d\xb6\xf9\xd9\xc6\x64\x2d\x78\xa2\x44\x7e\x98\x5e\x9c\xae\xec\xe4\x19\xee\xb9\x11\xa1\x4a\xef\xe6\xe7\x0c\xf6\xac\xb7\x5b\xe8\xc2\x43\xa3\x52\x3d\x83\xd3\x89\x97\x4c\x15\xb0\x9e\x67\xed\xf7\x2b\xf1\x30\x56\x62\x5c\x48\x36\x4e\x3a\x38\x74\x03\x86\x79\xcf\xb6\xe0\xc5\x0e\x1c\xa8\x69\xe6\xe9\x0c\x4a\x80\x05\x0a\xae\x6b\xce\xfd\xf9\xed\xed\x57\xc9\xf2\x89\x2b\x03\x5e\x31\x15\x5d\x45\x2c\x5b\x5d\x99\x37\x3c\xcb\x49\xb1\x44\x24\x74\x56\x6c\x3b\x64\x33\x91\x48\x53\x93\x98\x2d\xee\xc8\x0d\xcb\x56\xe5\x8b\x4f\x3d\xea\xa7\x43\x04\xce\x84\x08\x05\x42\xbd\xd4\x6d\xfc\x43\x04\x57\xf0\x0c\x39\x9b\x29\x5f\x84\x15\xa1\x38\xd5\xf6\x79\xd6\xa5\x36\x1f\x71\x72\x1e\x17\x4e\xf9\xd2\xc3\x53\x76\xe3\x3d\x7d\xb0\x64\x1b\x31\xe2\x91\xa0\xe9\x1d\x0a\xdd\x31\x8b\x89\xd8\xb0\x3c\x4f\x62\x26\x49\x49\x83\x5c\x2d\x35\x49\x4f\x3d\x6f\x67\xdc\xe6\x27\xc7\x6d\xee\xa1\x0e\x5d\x82\x3e\xe4\x91\x29\xb8\xb2\x43\xa6\x68\xbc\x4e\xf8\xb3\x23\x54\x32\xa2\x29\x9b\xfe\x1a\xa0\x7f\x98\x16\xbe\x0a\x32\x37\x17\x1d\xfc\xb4\x16\x54\xb2\xbf\x94\xfb\x86\x70\x11\xb7\x99\x54\x1f\x41\x91\x58\x52\xc5\x1e\x5a\xd9\xe1\xb8\x22\x54\xed\x4f\x82\x70\xfa\x94\x2a\xc7\xb3\xc0\x08\x74\xf6\x3c\x82\x9e\x0d\xc9\x54\xcd\xaa\x85\x1a\x27\xb1\x95\x0b\xbf\x5b\x07\xdd\xb5\x3b\xf8\x7a\x36\x25\xbf\xe0\xe3\xc3\xa2\x17\xe6\x42\xa1\x18\x78\x2b\xd6\x34\x09\x2d\xb2\x51\x6f\x5e\x47\x5f\x75\x87\x30\x2b\x9f\x25\xe6\x61\xa7\x80\xcb\x5d\xb2\x2c\xb4\x4e\x67\xf4\xb0\x67\x05\x30\xb7\x23\xba\x3c\x5f\x80\xb9\xe3\xab\x41\x38\x26\x27\x1b\x17\x59\x49\x2c\x76\x29\x81\x95\x94\x3e\x50\x22\x19\x97\x09\x38\x64\x1c\xaf\xb8\xa9\xf4\x87\xa5\x25\x31\x08\x12\x45\x9c\x11\xf9\x20\x96\x09\xb7\xa7\x57\x18\x7f\xdd\x1d\x4d\xd2\xae\x93\x71\x96\x49\x9e\x5c\x26\x91\x32\x7d\xc7\xe9\x22\xed\x12\x6e\xe0\x6f\xb5\xb2\x21\x79\x9f\xd2\x25\x61\xf0\xc7\x55\x9c\x48\xfd\x2f\x99\xcf\x3f\x80\x11\xbe\xe0\x56\x62\x06\x03\xb5\xa1\x7d\x65\x92\x02\x1e\xc4\x61\xcf\x0e\x92\x9e\x1e\xe8\x7f\x4e\x4b\x92\xf0\x58\x77\xdc\x29\x05\x87\x41\x52\xf0\x04\xe2\x21\x96\x31\xbf\x18\x36\xb0\x60\xe4\xcb\x2a\x89\xee\x67\x8e\xdd\x5d\xe4\xfa\x1a\x77\x2e\x79\x0c\xac\x7e\x6f\x48\x6a\x69\xba\x3a\x0b\x57\x8d\x9d\x96\x96\x0f\x58\x82\x31\x37\xe3\x87\x7b\x54\x4a\x11\x25\x95\xcf\x05\x6c\x34\x15\x73\x88\x81\x39\x0c\x3b\x26\x10\x0f\x42\x87\x83\xf2\xc7\x1e\x8e\x66\x57\xd3\x56\xc7\x95\x2e\x07\x4b\xb8\x1d\xf5\xa0\x43\xc0\x3d\xd3\x03\x1a\xbd\x6a\xb8\x0b\x8d\x6e\x85\xe1\x9a\x63\xc1\x86\xa9\x9b\xc5\xb3\x82\x98\xad\xcd\xb9\xb3\x7c\x25\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xd2\x36\xf6\xa9\xe1\x35\x6f\x22\x5e\x33\xae\x06\x38\x73\x99\xc8\x8a\x14\xe3\x39\x8e\xc7\x77\xb7\x36\x63\xfc\xce\x40\xae\x87\x53\xa0\x96\x5e\xba\x81\xbd\xe1\x91\xce\xdf\x06\x76\xa9\x23\xdc\xbd\xfe\xc3\x4f\x3f\xbd\x74\x34\xd3\xae\x2a\xf8\x63\xc0\x99\x76\x34\xd1\xee\xc9\x2f\x9a\x9e\xf3\x8b\xbe\xdf\xfc\xa2\xc7\x47\xa1\x1d\x38\x83\x28\x30\x36\x37\x2c\x2e\xb7\x7b\x8e\x50\xe7\xe8\xdd\xd0\xc8\xdd\x80\x2c\xa0\x61\x73\x7f\x82\x63\x59\x43\xf2\x7c\xce\xd9\x3d\xdf\x6a\x76\x4f\x9f\x58\xd6\xf0\x4c\x9e\x90\x18\xd6\x6f\x31\x6b\x27\xe0\x70\x76\xcf\x2e\x39\x3a\xa7\x24\x1c\x04\x30\xdc\x9e\xd6\xa7\x20\x55\xd5\x72\xaf\x06\x69\x93\xca\x2d\xf6\xd8\xe5\xa5\x74\xa0\xc5\x94\xd0\x27\xf0\x24\x0a\x09\x09\xd0\xc6\xf0\xf5\x22\xa4\x36\xa4\x69\xf3\xeb\xbc\xe6\x98\x29\x2f\x3f\x8d\x3f\xe6\x7b\x70\x78\x9c\x6b\xba\xbc\x10\x93\xbb\xf4\xd0\x5a\xac\xb5\x02\x48\x00\x30\x72\xb1\x70\x51\x22\xab\xa3\x73\x3d\x9b\x6a\x1d\x1c\xd2\x88\x68\x2a\x27\x64\x0f\x9f\xb7\xe6\x52\x23\x17\x58\xfe\x4e\x95\x62\xeb\x4c\x75\x5f\xf5\xb3\xc5\xfd\xc9\x2d\xee\x03\x5a\x00\x57\xc5\x9a\xf2\xb1\x3e\x51\x60\x73\xf7\xbc\x75\x35\xca\x3c\x21\xe6\xec\x20\x7b\x02\x0b\x08\x24\x17\xf8\x85\x8d\xa9\x53\xe6\xf2\x71\xcc\x9e\xf0\xee\xde\x23\x47\xbe\x5a\x3b\x69\x91\xd8\x09\x78\x35\xc3\x29\x67\xc1\x1e\x2a\x87\x39\x7b\x6a\xb8\x5a\x31\xe4\xe1\x33\x48\xc8\xa9\x9e\xf2\x25\x69\x14\xa5\x69\x9a\x8a\x07\xfc\xb6\xcb\xd7\xf4\xec\xeb\xbe\x98\x4c\xb3\x05\x23\xeb\x44\xeb\xe8\xc6\xc0\xea\x76\x07\x5d\xa6\x5a\x22\x67\x39\x0a\xbc\xb9\x71\xb6\xcd\x99\x32\x0b\x05\x0b\xad\xf5\x5b\x8e\x01\xe1\xfa\xff\x36\xaa\x08\xbe\x6d\x69\xc2\x82\xad\xe8\x26\x11\x45\x8e\xad\x95\x20\x17\xe6\x16\xf0\x86\xad\x28\x4a\x7b\x17\x16\xc3\x2c\x47\x27\xf7\xcc\xd3\xa7\xea\x26\xa8\x02\xb1\xb0\xa6\x89\x31\xfb\x2d\x91\x6a\x77\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x23\x33\xcd\x16\x82\xab\xda\x79\xed\x7c\x79\x65\x33\x87\x5b\x2f\xa8\xa6\x5d\x2b\xba\xeb\xc9\x44\xa0\xef\x50\xfc\x29\x3d\x61\x69\x12\x6d\x83\xcb\xbd\xd5\x5a\x5b\xa2\x2d\x4b\x1f\x9a\xbe\x4e\xde\x52\xc9\x62\xf2\x91\x72\xba\x44\x7d\xef\x87\xf9\xec\xed\xc7\x57\x7a\x5d\x41\x9f\x9c\xde\xee\x75\xb4\xcd\xdd\x97\x7f\x1a\x32\x5f\x64\x67\xe0\x3d\x58\xd5\x4e\xfb\x9e\x83\x1f\x34\x11\x86\x94\x7c\xa8\x1b\x58\xef\x1e\x16\x34\xab\xa7\xb0\xd6\x6b\x7e\xd6\x08\xcc\x66\x1d\x1f\x59\xe5\x33\xe1\x52\xd1\x34\x9d\xa5\x94\x5f\x67\x59\x2e\x36\xfb\xb5\x71\xaf\xaf\xf6\x41\xdb\x53\x0c\xf3\xb0\x17\x33\x9c\x7a\x70\x61\x73\x32\xad\xde\x3f\x21\x53\x55\x6a\xe1\x82\x03\x4b\xbd\xb8\x2e\x94\x58\x53\x95\x44\x17\x5a\x59\xbf\xf8\x48\x79\x41\xd3\xbd\x41\x57\x07\x87\xd1\x24\x22\x1e\x6c\xd4\x0c\x5d\xd7\xa1\xd9\x41\x59\xe3\x70\x7b\x45\x73\x4d\x9d\x6e\xe6\x7f\x0d\x6a\x2b\x15\x55\xc5\x0e\x15\x3e\xc0\x19\x9a\x79\xc1\x98\xa4\x54\xaa\xaf\x59\xac\x0f\x7d\xed\xee\x21\x82\x1f\x51\x45\x53\xb1\xfc\x33\xa3\xe9\xfe\x1d\xee\xed\x93\x1b\xf7\x69\x6b\x80\x32\x0e\xff\x62\x51\x3e\x78\x29\x89\x16\xb0\x6d\x0e\x7c\xce\x52\xb6\xa1\x5c\xd9\xe6\x58\x5c\x5d\x5e\x9a\xf1\xc3\x2e\x4a\x2a\xe3\x6b\xcc\x14\xcb\xd7\x09\xf7\xdf\x39\x87\x67\x6f\x04\x8f\x13\x34\x3b\x82\x41\x0d\x5b\xf8\xef\x6d\xde\x6a\x4d\x9e\x86\x03\xbe\x05\x1f\x5d\xd3\xe9\x8f\x3f\x15\xf8\xd8\xc2\xc8\x97\x2b\xbc\x08\x9e\x76\xaf\x6f\x3b\x33\x45\xee\xb9\x16\x0c\x01\x47\x64\x3f\xd9\x6a\x95\x13\xda\xe4\x83\xb1\x5d\x63\xec\x42\x73\xe0\xe8\xd8\xf4\xbb\xc9\x07\x71\x68\x8b\xe1\xaf\x5d\xb2\xa8\x77\xa5\x99\xa6\xee\xdb\x77\x65\x33\xcc\x64\xa9\x15\xe4\xf7\x1e\x6a\xe6\x01\x9d\x04\xaf\x6e\x32\x52\x57\x54\x7b\x9f\xd6\x56\x18\xec\x3b\xaa\x6c\x07\x89\xb1\x95\x69\x75\x04\x97\xf7\x15\xeb\xa9\x89\xff\xcb\x8d\x2a\x42\x49\x96\x30\x04\x3f\xa1\xdc\x4c\x16\x70\x16\x46\x63\x73\x51\x73\x30\xad\x12\xc2\xbd\x91\x71\x86\xa3\x71\xd9\xc4\x5a\x58\x03\x35\x45\xf0\x0f\x70\x5c\x5c\xfd\x22\x8c\x91\xd7\x24\xe9\x6a\x1a\x00\x9c\x7c\x44\x64\x11\xad\x08\x95\xba\x6b\x7a\x43\xeb\x13\xcf\x26\x6b\xca\x93\x3b\x26\xd5\xa4\x44\x09\x96\x7f\xff\xf1\x1f\x13\xf2\x5e\xe4\xc4\x04\xaa\x8f\x2c\xaa\x86\xe9\x67\xb5\x2f\x12\x89\x83\x29\xdb\x56\x5a\x6b\x26\x62\xd3\xe9\x07\xe8\xac\xa2\xf7\x9a\x87\x61\x67\x0b\x06\xae\x8b\x3f\x91\x0b\x2d\x26\x3a\x9f\xfe\x97\x66\x4b\xff\xbe\x20\x3f\x3c\x00\xd3\xbe\xd0\x7f\x5e\xe0\x07\xcb\xb0\x49\x57\xa9\xae\x3e\x8c\xc9\x92\x79\xb2\x5c\xb2\x1c\xd5\x47\x02\x49\x85\xaf\x0c\x2a\x08\x17\xce\xc3\xd6\x29\x5d\xa9\x9b\xf5\x8e\xfc\xfd\xc7\x7f\x5c\x90\x1f\xfc\x71\x91\x84\xc7\xec\x37\xf2\x23\x5a\x97\x13\xa9\xc7\xf8\xca\x38\x73\xe4\x96\x2b\xfa\x9b\x7e\x67\xb4\x12\x92\x71\x54\xe5\x95\x20\x2b\xba\x61\x44\x0a\xad\x01\xb3\x34\x1d\x1b\x5b\x3a\x79\xa0\x80\xd4\x62\xa7\x12\x12\xeb\x49\x46\x73\xe5\x6d\x89\x89\xb1\x90\xc0\xd7\xf4\xb2\x2d\xb9\xf5\x4c\xdf\x25\xdc\xf8\xaf\x8c\xe7\x4c\xaf\x39\x24\x86\xe2\x22\x29\x41\xa2\x15\xe5\xcb\x32\x37\xfd\xae\x50\x45\xce\x5a\x5c\x3f\x1d\xcf\xc0\x7d\xc2\x83\x52\x98\xff\x92\xf0\x7a\x50\xc1\x7e\xbb\xd2\x32\x51\x36\x2b\xc2\xc4\x2a\xaa\xed\x95\x5e\x85\x3c\x59\x14\x4a\xe4\xf2\x2a\x66\x1b\x96\x5e\xc9\x64\x39\xa6\x79\xb4\x4a\x14\x8b\xf4\xb0\xae\x68\x96\x8c\x23\xc1\xf5\x8a\x03\x2a\xc3\x3a\xfe\x3d\x94\x37\x1d\xeb\xae\xb6\xa0\x4e\x77\x1c\x74\xbb\x51\xed\x49\x8d\x69\x83\x8d\xb1\x83\x3d\x68\x77\xa0\x68\x9b\x39\xc1\x68\xc1\x10\x72\x35\xc8\x60\x2d\x68\x72\x38\x8f\xb9\x34\x38\xe0\x51\xfd\x1d\xfa\xd8\x61\x00\x09\x9c\x4a\x8f\x52\xae\x69\x8c\xa4\x94\xf2\xed\xa3\x6f\x7e\x3d\xa5\x00\x97\x1f\x6d\xc7\xf0\x0a\x91\x8e\x29\x8f\xf5\xff\x31\x61\x27\xda\x0e\x32\x87\x45\x12\x44\x08\xbe\x4e\x6f\x4f\x73\x24\x8a\x64\x80\x53\x6f\xe4\xb5\x8e\x42\x14\x8a\xaa\x18\xa8\x91\x17\xcc\x32\x4d\x5f\x40\x4d\xa4\x7d\xeb\x7f\x1a\xff\x4b\x89\x76\xd6\x26\x52\x1d\xf6\x9a\x38\xb2\x63\xc7\xfe\x7e\xa8\x5a\xb8\x36\x39\x08\xbc\xa2\x52\x19\x68\x2d\x8b\x41\xe0\x0d\xc3\x2a\x28\xc0\x60\x9a\x1d\xc3\x9d\xf6\x90\x8d\x17\xd0\x1d\x19\xef\xc5\x5c\x8a\x4a\xa5\xa4\x5d\x81\xaa\xf4\x17\xaf\x0e\x1a\x0e\x4a\x31\xa9\x08\xdd\xd0\x24\x05\xeb\xbc\x58\x48\x96\x6f\xb0\x20\x95\x81\x1a\xa4\x75\x3d\xcb\xd4\x9c\x40\x31\xea\x44\x9a\x8f\x1d\xc3\xee\xaa\x1c\x1a\x00\x68\x43\xb5\xde\x37\xf6\x7a\x10\xbd\x07\xd5\xcb\xc6\xdb\xfa\x0b\x3d\xd5\x18\xbd\xff\xfe\xcc\x68\xae\x16\x8c\xaa\x2f\xc9\x21\xbe\xbb\xb3\xa5\xbd\x76\x65\x29\xf7\x72\x43\x3f\x30\xb2\x14\x4a\x8b\x58\x05\xec\x7d\x94\x49\x11\xd4\xa7\xdc\x68\x8f\xbd\xa3\xab\x51\x7e\xc9\x29\xa4\xf8\x08\x1e\x38\x4c\xbf\xe1\xee\x38\x8d\x74\x6c\x76\x92\xc2\xa7\x11\x48\x43\x70\x66\xd6\x0e\xbd\x19\x40\x81\x4e\x33\xe4\x35\x93\xf2\x20\xc0\x86\x1f\x5d\x88\x4f\xe3\x51\xae\xb9\xd6\xd6\xf6\x1e\xa6\x85\x68\x01\x3a\x66\x8a\x26\xa9\x3d\xca\x38\x15\xe5\x2c\xb5\x51\xd7\x83\x03\xcc\x19\x95\x87\x04\x04\xaf\xd7\x9f\xe1\x61\xec\xb4\xe0\x6c\xfc\x20\xf2\x98\xdc\xd0\x35\x4b\x6f\xa8\x64\xe6\x5d\x6e\x8a\x1e\xae\xd1\xa5\x1c\xb4\xcb\xfb\x6d\x5f\x0d\x5d\x46\xe3\x4f\x65\x12\x86\xbf\x2a\x15\x0b\x3b\x38\xb2\x26\xc8\x2f\x79\xc1\x46\xe4\xbd\xe6\x5e\x23\xf2\x95\xdf\x73\xf1\x70\x5c\x5f\xd5\x41\x2f\x88\xd7\x53\x37\xfc\xc3\xc2\xea\x78\x06\x9f\xb2\xbb\x3d\x7b\x64\x08\x7e\x83\xa9\xd1\x67\x36\xe5\xa3\xb6\x47\xfa\xbf\x3b\x26\x28\xad\x28\xe6\x62\x99\x33\x89\xc8\x35\x7b\x41\x12\xbb\x9a\x9c\x7f\x61\xdc\x24\xf7\xb5\x76\x6f\xba\xaf\x95\xed\xa9\xe5\x6b\xcb\xea\x8e\x59\x6f\xf3\xb1\x2c\xdd\x2b\x6a\x1c\x8e\x08\x74\x3a\xda\x60\x7c\x6a\xea\xe1\x7e\xa3\x93\xc3\xf5\x9c\x67\x51\x28\x39\x64\x1d\xb5\xa3\xbb\x99\xff\xb5\x79\xb2\x1b\x79\x5f\x1b\x7f\x6a\x37\x4b\x1d\x6b\x90\x6a\x3d\x33\xad\x46\xa8\xb3\xf9\xe9\x6c\x7e\x7a\x49\xe6\xa7\xd6\x1d\x7f\xc8\xe4\xf4\x32\x8c\x4d\xad\x43\x3c\x64\x60\x7a\x96\xa6\xa5\x4e\x23\x3a\x68\x4e\x7a\xb6\x86\xa4\xd6\xa1\x75\x34\x1e\x7d\x3f\x66\xa3\xd6\x19\x3b\x60\x2a\x7a\x86\x46\xa2\x2e\x02\x19\x8b\xbb\x88\x89\x53\xe7\x61\x57\x50\xac\xca\x59\x96\xaf\xb3\x41\x39\xae\x38\xd3\x57\x5a\xd4\x02\x5c\x6b\xdf\x2e\x4d\xe7\xba\xcb\x5e\x46\x60\x34\xc5\x1e\x77\x3a\x4b\x6e\xdf\xcd\x3e\xbf\xbb\xb9\xfe\xf2\xee\xb6\x2e\xdf\xed\x9b\xe9\x16\x49\xec\xb0\x0d\x62\xec\x48\x62\x0d\x0f\x68\x82\xdc\x70\x4b\xef\x81\x86\x5b\x45\x91\xec\x6b\x75\xbc\x5c\x78\x14\x97\x3b\x8a\x7f\xb4\x9f\xce\xae\xc7\xf3\x2b\x06\x4e\x51\x13\x73\xa6\xe5\x9e\x95\x48\x63\x69\xe3\x56\xa7\xb7\x65\x26\x55\xc2\xa3\xb4\x88\xb5\x70\xf1\xf5\xeb\xf4\x56\x4e\x08\x79\xcb\x22\x5a\x48\xb0\xc2\xc4\x82\x5f\x2a\xf2\xeb\xa7\x0f\x7f\x83\x78\x6c\x78\x62\x54\xe2\x9a\x00\x2a\x6f\x42\x11\x58\x58\x21\x5c\x1b\x79\xcb\x50\x50\x81\x2f\x47\x34\xd3\x54\x4c\x62\xe5\x0a\x05\xb2\xc8\x8a\xa5\x99\xa6\x98\xf7\x8c\x54\x08\xaa\xfa\xc5\x55\x85\x79\x1b\x3e\xb9\x64\x0a\xb3\xae\x0e\x45\x48\x1e\x9c\xb5\x16\x8b\xeb\x11\xb6\x56\x4f\x7d\x34\xda\xf8\x03\x95\xc6\x62\xb5\xb7\xb7\x2d\xeb\xdb\x6e\x9f\x69\x36\x71\x34\x18\x37\x90\x3c\xc3\x5f\x3b\x7d\xd6\x9d\xad\xec\x18\x18\x44\x92\xa8\xce\xd6\xd4\xe6\x30\xa0\xfd\x75\x00\x76\x6c\x19\xac\x3e\xc9\xde\x87\xcb\x88\x6c\xa7\xcb\xdd\xfa\x02\x45\x44\x62\xaf\xf6\xa7\x89\x9f\xf3\xaf\x15\x8b\xb2\xfa\x6b\xd5\x5f\x63\x91\x21\xff\xfa\xf7\xef\x7e\xf7\xff\x01\x00\x00\xff\xff\x6c\xfc\xad\x6c\x34\x86\x0b\x00") +var _olmManifests0240CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\x9e\xbf\x02\xcb\xcd\xb9\xb6\x13\x49\x9e\x49\xda\x7c\xad\xbf\xb4\x59\xae\xed\x24\xbe\x99\xf1\x68\x8d\x9d\xf4\xf6\x9b\x99\x93\x40\xe4\x96\x84\x9a\x04\x58\x00\x94\xad\x9e\x9c\xff\xfd\x2e\x6c\x3c\x48\xea\x65\x49\xa4\xc7\xb2\x87\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xbf\x1f\xdd\x6e\xf7\x33\x9a\xb1\x5f\x40\x2a\x26\xf8\x31\xa1\x19\x83\x3b\x0d\xdc\xfc\xa5\x7a\x37\x7f\x56\x3d\x26\x8e\x26\x2f\x3f\xbb\x61\x3c\x3e\x26\xa7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x33\x18\x32\xce\x34\x13\xfc\xb3\x14\x34\x8d\xa9\xa6\xc7\x9f\x11\x42\x39\x17\x9a\x9a\x9f\x95\xf9\x93\x90\x48\x70\x2d\x45\x92\x80\xec\x8e\x80\xf7\x6e\xf2\x01\x0c\x72\x96\xc4\x20\x71\x72\xff\xea\xc9\x8b\xde\x5f\x7a\x2f\x3e\x23\x24\x92\x80\x8f\x5f\xb3\x14\x94\xa6\x69\x76\x4c\x78\x9e\x24\x9f\x11\xc2\x69\x0a\xc7\x24\xa2\x9a\x26\x62\x64\x17\xa1\x7a\x22\x03\x49\xb5\x90\xaa\x17\x09\x09\xc2\xfc\x27\xfd\x4c\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\x57\xf8\x5a\xfc\x3d\x61\x4a\xff\x34\x7f\xed\x15\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xcf\x08\x51\x91\xc8\xe0\x98\xe0\xa3\x19\x8d\x20\xfe\x8c\x10\x07\x42\x37\x55\x97\xd0\x38\xc6\x6d\xa1\x49\x5f\x32\xae\x41\x9e\x8a\x24\x4f\x79\x78\x95\xb9\x27\x06\x15\x49\x96\x69\x04\xfd\xf5\x18\x48\x26\x41\xeb\x29\x82\x84\x88\x21\xd1\x63\xf0\xef\x0e\x4f\x11\xf2\x2f\x25\x78\x9f\xea\xf1\x31\xe9\x19\x08\xf7\x62\xa6\xb2\x84\x4e\xcd\x6a\x4a\x77\xd9\x6d\x3a\xb3\xd7\x4a\xbf\xeb\xa9\x59\xba\xd2\x92\xf1\xd1\xaa\xa5\x98\xfb\xd6\x5f\x83\x05\xcd\xf5\x34\x9b\x5f\xc2\xcc\x8f\xeb\xbe\x3f\xcb\x07\x09\x53\x63\x90\xeb\x2f\x22\x3c\x32\xb7\x86\xfe\x82\x2b\x4b\x16\x52\x9a\xd4\x1f\xa8\xde\xdc\x61\x98\x7b\xc1\xc9\x68\xfe\x1b\x63\xaa\xfd\x8f\xf6\xa6\xc9\x4b\x9a\x64\x63\xfa\xd2\xfd\xa8\xa2\x31\xa4\xb4\xc0\x07\x91\x01\x3f\xe9\x5f\xfc\xf2\xf5\xd5\xcc\x05\x52\x85\x4e\x05\xcf\x09\x53\x84\x12\x09\x99\x50\x4c\x0b\x39\x35\xd0\x3a\xbd\xfa\x45\x75\xc8\xe9\xdb\x33\xd5\x21\x94\xc7\xe1\xe0\x91\x8c\x46\x37\x74\x04\xaa\x37\xb7\x56\x31\xf8\x17\x44\xba\xf4\xb3\x84\x7f\xe7\x4c\x42\x5c\x5e\x85\x01\x8f\x87\xc9\xcc\xcf\x06\xfe\xa5\x9f\x32\x69\xde\xa9\x4b\x07\xd9\x8e\x12\x95\xab\xfc\x3e\xf3\x85\xfb\x06\x0c\xf6\x3e\x12\x1b\x02\x07\x0a\x51\xc0\x9d\x31\x88\x1d\xec\x2c\x6a\x30\x65\xbe\x5f\x82\x02\x6e\x49\x9e\xf9\x99\x72\xf7\x4d\x3d\x72\x05\xd2\x3c\x68\x8e\x7b\x9e\xc4\x86\x12\x4e\x40\x6a\x22\x21\x12\x23\xce\xfe\x13\x66\x53\x44\x0b\x7c\x4d\x42\x35\x28\x4d\xf0\xd4\x72\x9a\x90\x09\x4d\x72\xb0\xa0\x4c\xe9\x94\x48\x30\xf3\x92\x9c\x97\x66\xc0\x5b\x54\x8f\xbc\x16\x12\x08\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\xb4\xa7\xe1\x91\x48\xd3\x9c\x33\x3d\x3d\x42\x72\xcc\x06\xb9\x21\x87\x47\x31\x4c\x20\x39\x52\x6c\xd4\xa5\x32\x1a\x33\x0d\x91\xce\x25\x1c\xd1\x8c\x75\x71\xb1\x1c\xe9\x78\x2f\x8d\xff\x20\x1d\xd5\x57\xfb\x33\xe0\x5b\x88\xcc\xc4\x93\xcd\x95\xb0\x36\xc4\xd3\x62\x91\x7d\xdc\x7e\x4b\x01\x52\xf3\x93\x81\xca\xdb\xf3\xab\x6b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\x83\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\x6f\x5e\xbd\x26\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x8e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\xf7\x42\xa6\x54\x1f\x93\x6f\xfd\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x1d\x7f\x9b\x09\xa9\xff\x46\xde\xf0\x64\x6a\x26\x8d\xc9\xed\x18\x38\xb9\x0a\xdf\x46\xfe\x5a\xfa\xe3\x07\x99\x45\x3d\x72\x31\xe2\x42\xfa\x3b\x0d\x56\x5d\xa4\x74\x04\x64\xc8\x20\x41\xbc\x56\xa0\x7b\xb3\x3b\xb8\x72\x17\x89\x15\x97\x86\x6c\xf4\x9a\x66\xf7\x82\xe6\xd4\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x86\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xf5\x20\x70\xea\x27\x30\xf0\x2b\x7e\xbe\x70\x94\xab\xb7\xe9\x67\x97\xbf\x6c\xe3\x67\x0b\x31\xe4\x5e\xa0\xbd\x5e\xc4\x45\xd6\x78\xc7\x48\x66\x51\x5f\xc4\xf6\xb3\xef\x7d\xcb\x0f\xe5\xbb\x09\xdc\x65\x42\x81\x22\x31\x1b\x0e\x41\x1a\xba\x23\x26\x20\x25\x8b\x41\x91\xa1\x90\xb8\x5f\x99\x88\xf1\x4c\x86\xfd\xab\xb0\xda\xbe\x88\xd7\xdd\x18\xf3\x6a\x64\x18\x16\x19\x1d\x1a\x2e\xfd\xdc\x85\xa7\x9d\xdc\x73\x78\xcd\xe0\x22\x86\x2b\x48\x20\xd2\x42\x2e\xbe\x63\x06\x26\x97\xa5\x07\x1c\xd5\xf7\x7f\xdd\x8e\x59\x34\x26\x69\xae\x90\xea\x6a\x99\x43\x05\x2e\x5a\x90\x21\xd3\x44\x70\x42\xf1\xb5\x86\xd6\xcf\x3f\x99\x52\x1d\x8d\xdd\x1d\xfb\x8a\x24\x74\x00\x89\x9a\x9d\x67\x00\xc8\x72\xe3\x3c\x81\xd8\x4c\x88\xb4\x04\xe7\x5c\xf2\x09\xf7\x40\x89\x58\x52\x16\xe4\xed\xd5\x30\x23\xf7\x61\x99\x05\x3c\x13\x92\xe9\xe9\x69\x42\x95\x5a\x86\xd3\x73\xd0\xbd\x18\x22\xfa\xb0\x21\x83\xb8\x43\x18\x8f\x99\x51\x69\x94\xff\xf6\x7d\x15\xe6\xed\x99\x7b\x0d\x83\x2b\xdd\xef\x21\xe4\xef\x21\xb7\x2c\x49\x0c\xb0\x62\x18\xd2\x3c\x41\x22\xf9\x1f\x90\x82\x30\xc4\x4e\x89\x78\xc5\x85\xbf\xbc\x1a\x78\x2b\xbe\x55\x41\x94\xe3\xb7\x0a\xae\xe1\x4e\x2f\x3f\x5d\x73\xdf\xbb\x77\xb5\xe8\x51\x64\x09\x03\x20\x82\x23\x21\xfc\x2d\x81\x11\x8d\xa6\xbf\x99\xe5\xff\x26\xc1\x2c\x24\xd2\x10\xff\xd6\x43\x39\xbf\x72\xc4\x0c\x80\x04\x52\x6d\x60\xe6\x0b\x09\xe3\x66\xcb\xcd\x61\x63\x7a\x8c\x00\x92\x6c\x34\xd6\xe6\x2e\xa7\x78\x54\x17\x80\x67\x2e\x5c\x34\xac\x9f\x32\x0e\xf2\xdd\x17\x1f\xe6\xee\xb4\x22\x1b\xf2\xaa\x24\x11\xb7\x65\xfc\x94\x39\x27\x8c\x9b\xf3\x4e\xfc\x07\x92\x93\x38\x65\x0a\x25\xd2\x83\xfe\xd5\xc9\x61\xe5\x4b\x48\x2a\x62\xe8\x98\xef\x8b\x05\x28\xbe\xaf\xcd\x69\x37\x13\x2a\xf0\xaf\xa1\xda\xbc\xc6\xe0\x84\x3b\x2d\x11\x35\x3c\xd3\xbd\xd3\x00\x4c\x18\xc2\x32\x80\xf0\xf2\xab\x13\xf2\xdb\x80\x2a\x48\x18\x07\x0b\xbb\x4c\xb2\x09\x4b\x60\x64\xde\xc8\xbd\xee\xa9\x7a\xe4\x34\x97\x86\x9e\x25\x53\x87\x18\x64\xf1\xae\x30\x45\x72\x3e\x83\x6e\x1e\xb3\xac\xcc\x57\xde\x2c\x73\xb7\x32\x52\xd7\x15\x3e\x31\x35\x5c\x9c\xfa\xfb\x70\x6f\xf4\x98\xf2\xa5\x9b\x6b\x24\x45\x33\x31\xe3\xf6\x29\x16\x5b\xd1\x1c\xa4\x14\xb2\x47\xfe\x61\x68\x67\x6e\x34\x6c\x22\x92\x18\xa4\xd7\xee\x08\x33\xf4\x52\x75\x3c\x90\x50\x62\x77\x72\xa0\x03\xcc\x02\xc0\x2f\xff\x66\x27\xf3\x1b\x82\x03\x28\x97\xf8\xf5\xf6\xc8\x7b\x6e\x04\x4a\x4a\x86\xb9\x11\x01\xbd\x6e\x61\xcf\x5c\x19\x34\xfe\x10\xfa\x09\x4a\xaf\xef\x84\x65\xa7\x94\x39\x54\x0b\x7a\x86\xb4\x06\x16\x33\x17\x0b\xdf\xa7\x2c\x22\xd3\xf0\x3a\x31\x24\x22\x4b\x2d\x05\x54\x79\x66\xc4\x1f\x65\xbe\x94\x1b\xd0\x44\x15\xf6\x93\x89\x58\x2d\x04\x80\x59\x56\x26\x21\xa3\x32\x50\x6c\x05\x24\x1a\x53\x6e\x74\x3d\xf3\xa1\x41\x56\x36\xb2\x97\x79\x2d\x1d\x88\x5c\x23\x8e\xb9\xb3\x3a\x14\x39\x8f\x89\x21\x2a\x85\x38\x7d\x93\x0f\x40\x72\xd0\x80\x12\x75\x2c\x22\x65\x84\xe9\x08\x32\xad\x8e\xfc\x69\x3a\xca\x44\xdc\xf5\x7f\x74\xa9\x3f\x24\x47\xfb\x7b\xdb\x52\x23\xe2\x21\x7f\x4c\xec\x5e\x2d\xb9\x0b\x78\x9e\x2e\x27\xf0\xdd\xd5\x0f\x9b\x1b\x0a\x30\x2e\xbc\x49\x8b\xc4\xa8\xcd\x85\x4d\x67\xd1\x42\xcb\x46\x8b\xe2\x7e\x62\x76\xa2\x64\xb3\x70\xc2\xb9\xa5\x6e\xfb\xaa\x3c\xf5\x6a\xa2\x4d\xa5\xa4\xcb\x3e\x81\x69\x48\x57\x70\xb8\x79\x83\x8a\xa1\x6d\x46\x17\x2b\x16\x8a\x02\x80\xd6\xd4\xf0\x62\x54\x7e\xed\x15\x43\xae\xf8\x94\x18\x7c\x76\x72\x3e\x72\x75\xc7\xc7\xb4\x64\x59\x02\xe4\xdb\x1b\x98\x76\xac\x66\x0c\xc3\x21\x44\xfa\x6f\xee\x3c\x9b\x7b\xf0\x7e\x3c\xdc\xde\xf4\xf0\xad\xff\xd7\xdf\x96\x7d\xf1\x5a\x5c\xfe\x7e\x89\xc8\x0e\xbb\xa4\x55\x77\xcc\x40\xe8\x1c\x1f\x98\x61\xd9\x16\x02\x76\x2e\x03\x1f\xfc\xac\x1e\x39\x4f\x33\x3d\x25\x29\x50\xae\xbc\xbc\x63\x68\x46\xe9\x66\xe5\x28\x5c\x89\xda\x22\x93\x09\x96\x02\xc4\x90\x4b\x71\xe5\xa4\xa0\x0e\xe9\x4b\x18\x82\x2c\x7e\x41\x46\x76\x29\xce\xef\x20\xca\xf5\x52\xb9\xa8\x0c\xb7\x95\x47\xca\x8c\x1b\x98\x6e\x00\x90\x9f\x60\xea\x35\x1a\xfb\x65\x37\x30\xb5\xc8\x80\x3f\x15\x38\x44\xb3\x2c\x61\x60\x95\xf6\x55\x90\xb9\x81\xa9\x42\xa9\xc7\x3c\x7f\x63\x67\x07\x73\x7f\xa7\xc0\x12\x2f\x7c\x9e\x1b\xbd\x51\xfd\x5f\x8b\xaf\x91\x48\x07\x8c\xdb\x97\xd9\xa9\xfd\x56\xe0\xec\x1e\xa0\x3c\xc6\x3f\xf1\x35\x4d\x80\xcb\x2f\x6a\x03\x98\xbd\xf1\xdf\x51\x58\x44\x08\x35\x2b\xda\x57\x44\x42\x62\x4f\xfc\x98\x65\xde\xd0\x84\x4b\xef\x91\x5f\x0c\x7b\x2c\xcc\xe3\x88\x1b\x16\x02\xf8\x55\xe7\xff\xce\x69\xd2\x23\x67\x96\x2a\xe2\xd7\xbb\x9f\xdc\x4d\x06\x90\xff\xce\xd9\x84\x26\x46\xab\xd1\xc2\xb0\xac\x38\xa2\x32\x46\x6e\xe0\xac\x57\x4a\xd8\xdd\xa3\x41\xe0\xf0\xa7\xbd\xd8\x23\x85\x96\x33\x92\x51\xa9\x59\x94\x27\x54\x7a\x8b\xfc\xb4\x11\x88\x16\x48\x73\x05\x91\xe0\xf1\xca\x13\xbc\x94\xba\xba\x67\xcb\x30\x46\x31\x0a\x24\x13\x31\x2a\x6e\x2c\x85\x59\x24\x3d\xa8\x2a\x37\x62\xe8\x4f\x75\x38\x62\x1d\x2b\xd5\xdc\x32\xe5\x8c\x5b\xc1\x80\xc0\xac\x81\xe1\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4f\x3d\xbf\xea\x10\xa6\xad\x44\x8e\xf2\x9f\x97\x61\x3c\xca\x3a\x60\x17\x07\x6a\x28\x24\x18\xa5\xff\x20\x16\xf8\x0c\x4c\x58\xa4\x0f\x7b\xe4\xff\x19\x11\xdf\x6c\x3c\x87\x11\xd5\x6c\x12\x64\x48\x2f\x89\x68\x09\xd4\xc8\xc4\x54\x91\x17\xe4\x00\x1f\x23\x2c\x4d\x21\x66\x54\x43\x32\x3d\x24\x83\x29\xbe\x46\x4d\x95\x86\x74\x9d\xad\x63\x5c\xc3\xa8\x62\x1d\x9f\x1f\x43\x67\xb8\x61\x5c\x7f\xf3\xc7\x15\x77\xe2\x62\x37\xd8\xd9\x5f\x50\xa4\xac\x90\x1a\x2b\x65\xce\x6c\x61\xe0\x41\x22\x50\x91\x40\x37\x98\x72\x67\xa1\x53\x9c\xab\x92\xec\xe7\xc9\x4c\xd8\xe0\x7f\x19\x3c\xa0\x44\x02\x3a\x78\x1c\xe6\xd6\xc0\x71\x16\xad\x32\x98\x2c\xe5\x68\xcb\xed\x79\x04\x25\x14\x23\xfe\x7f\xf3\xc7\x25\x86\x12\x6b\x8d\x37\x7b\x3e\x6f\xf3\x23\x6b\x30\xca\x62\xf2\x65\x9b\x75\xef\xb1\x0e\xaf\xdf\x6a\x06\x14\xf5\xef\x35\xe2\x04\x03\x8a\x51\x91\xdc\x7e\x77\xbd\x9d\x8c\x04\x0d\xcf\xce\x66\x88\x1f\xe3\x4a\x53\xae\x19\x52\xb6\x60\x51\xf3\x16\x36\x23\x7e\x6f\x62\xc4\x41\x5c\x73\x84\xc6\x22\x97\xb3\x99\xce\xd1\x87\x8d\x8d\x6d\x5e\xcd\xbf\xdf\xfa\xda\xf7\x06\x01\xfb\x4e\xaa\x14\x1b\x19\x29\x93\xdc\x02\x6a\xc3\x8e\x9d\x54\xa5\x4d\xab\x15\xe0\x83\xec\x3f\x78\x9a\xd2\xc0\x04\x98\xf6\x72\x7f\x24\xb8\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xeb\x4f\x26\x20\x7b\xe4\x67\x65\x76\x8a\xfc\xc8\x46\x46\xef\x73\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x53\x06\x74\x43\x90\x12\x62\xb4\xb6\x11\x23\x03\xf9\x19\x20\x9e\xb9\x5f\x91\x38\x47\x0f\xc4\xec\x22\x72\x03\x07\x6b\x2e\x90\x46\xa9\xf1\xe6\xb9\x60\x28\xb1\x07\xde\x7c\xd2\x48\x58\x5f\x03\xfa\xc3\x0c\xed\xd4\xa2\xa0\xa3\xcc\x1a\x88\xc3\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x56\x15\x61\x34\x60\xcf\x7c\x0c\x2a\x6e\x39\xb7\xc0\x87\xb2\x95\xc6\x93\x99\x17\x76\xaa\x45\xcf\x21\x39\xa6\xe9\xec\x92\x0b\x9a\x2e\x29\xbf\x81\x98\x24\x70\xc7\x22\x31\x92\x34\x1b\xb3\x88\x26\xc9\x14\x8f\x29\x1a\xc9\x98\x56\xa8\xf5\xaf\x30\x66\x2f\x23\xe3\xc1\x31\xba\xb1\x51\x57\x41\x24\x41\xdf\xef\x20\xb8\xb2\xf7\x15\x4c\x19\xd5\x65\x31\xf4\x13\x58\x1c\x71\x38\xe7\xad\xe0\x34\x8a\xcc\x41\x42\xd4\x35\x5a\xbb\x13\x40\x4a\xa8\xdc\x23\x17\xc8\x52\x07\xa0\x10\xcb\x6f\x00\x32\x8b\x69\x09\x53\x9a\xa8\x14\x6d\x2a\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x99\x51\x4b\x06\x56\x0c\x32\xac\x76\x1a\xf6\x06\xb8\x5e\x2c\xd4\xac\xd6\xbb\x56\xe8\x5c\xab\xc1\x18\x68\xca\xfd\x90\x2c\x68\x91\xe7\x89\xce\x13\xaf\x8a\xa0\x87\x0d\x5e\x6d\xbd\x67\x57\xda\x08\x1f\xa3\xfb\x69\xcd\xcf\x95\xdb\x83\xf7\x75\x2c\x6e\xbd\x1f\x6e\xee\x90\xa3\xc5\xc6\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x54\x70\x85\xf2\xa9\x75\xc7\xa2\x3b\x75\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\x06\x74\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x3a\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x9c\x2d\xce\xe0\x74\x0c\x1a\x64\xca\xb8\x13\x8f\x8c\xa8\x1b\x00\x3b\x00\x7d\x0b\xc0\x49\x34\x86\xe8\x26\x1c\x25\xe7\xcd\x9e\xd9\x35\x67\x7f\xaa\x52\xac\x22\x50\x40\x24\x09\x2a\x1a\x0a\x80\x30\xa3\x13\x70\xb8\x2d\xdb\xac\x16\xb0\x1b\xc3\xa2\x27\x94\x25\x74\x90\x00\x72\xcd\xf0\x57\xa7\xe2\x55\xf7\xfc\x3c\xcb\x93\xc4\x08\xb1\x3c\x26\xa3\xb7\xfd\x53\xa2\x25\x1d\x0e\x59\x64\x2e\xc5\x4c\x5a\xab\x6f\xd5\x21\x5f\x7d\xe1\x2a\x71\x6d\xe9\x89\x50\x9a\xea\x7c\x6e\x8f\x56\x6c\xf0\xaa\x8d\x35\x7a\x08\x5b\x6a\x20\xaa\x6c\xe5\xdb\xaa\xb2\x62\x96\x01\x56\xd9\xaa\xd8\xbf\x7b\xe4\x52\xa0\x8e\x40\x35\x79\x0d\xca\xb0\x5d\x04\xd0\x5b\xa0\x4a\xf0\x12\x75\x45\xe9\x57\xb2\x11\xe3\x34\x71\x1f\x55\xb6\xef\x05\xdd\x83\xa2\x49\x39\x65\x23\x49\x75\x20\x8a\xc5\xba\x1d\x77\x71\x7c\xd1\x5a\x42\x7b\xe4\x84\x4f\x71\xbf\x87\x40\xcd\x0f\x66\x66\x2d\x45\x9c\x47\x68\x87\x4f\x12\x74\xf7\x16\x93\x34\x4a\x46\xab\xee\x85\x53\xff\x12\x2f\xe8\x29\x73\x00\x28\x73\x2e\x25\xc1\x81\x50\x95\x19\x3d\xce\xe3\xa4\x35\x85\x17\x00\x46\x66\x71\xd2\xbf\x20\x3e\x60\xae\x47\xba\xdd\x2e\xb9\x36\x3f\x2b\x2d\xf3\x08\xf9\x8b\x39\x42\x3c\x76\x9c\xc2\x62\x1f\x7e\x24\x45\xb1\x13\x3f\x83\x38\xcb\x87\x15\xc1\x32\xaa\xc7\xa4\x67\x01\xdf\x2b\x81\x82\x90\xef\x0d\xaf\xb9\xa3\x69\x66\xf0\xfe\x3d\xb7\xd4\xfb\x7b\x21\xae\xec\x26\xd9\x77\xfe\x0f\x39\x3a\x9a\xc5\x09\x31\x30\x22\xaa\x33\x20\x22\x6a\x0c\x85\xd8\x57\xd5\x4f\xea\x99\x07\x7f\xe2\xe2\x96\x2f\x7a\x3b\xbe\x8b\x4a\x38\x26\xef\xf7\x4e\xfc\xe9\x7b\xbf\xd7\x21\xef\xf7\xfa\x52\x8c\x8c\xd8\xca\xf8\xc8\xfc\x60\x90\xea\xfd\xde\x19\x8c\x24\x8d\x21\x7e\xbf\x67\xa6\xfd\x32\x33\x1a\xd6\x6b\x90\x23\xf8\x09\xa6\x7f\xc5\xc9\xc2\xcf\x9e\x23\xfc\x35\x35\xd7\xf1\x77\xc3\x82\x0d\x9f\xfa\x6b\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\x4f\x0b\x3c\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x8e\xfe\xf6\x2f\x25\xf8\xf1\xfb\xbd\x62\xfd\x1d\x91\x1a\xcc\xc8\xf4\xf4\xfd\x1e\xa9\xbc\xf5\xf8\xfd\x1e\xbe\xd7\xff\xee\x17\x79\xfc\x7e\xcf\xbc\xc9\xfc\x2c\x85\x16\x83\x7c\x78\xfc\x7e\x6f\x30\xd5\xa0\x3a\x2f\x3b\x12\xb2\x8e\x11\x98\xfe\x5a\xbc\xe1\xfd\xde\x6f\x66\x4f\x8e\x8e\x9c\x0b\x03\x37\x53\x91\xff\x5d\x6c\xac\xbe\x97\xee\xaf\xd6\xdf\xd0\x08\x4d\x95\xbe\x96\x94\x2b\xe6\xe3\xc7\x96\xde\x9a\xda\xf3\xbe\xf4\xba\x44\x1a\xb0\xf4\xb2\xc5\x86\xa5\x97\x97\x70\xcf\x75\x38\xd7\xfc\x37\xac\x69\x75\x9e\x7f\xd0\x8b\x34\xe6\x4a\x61\xa7\x09\xfb\x63\x78\x80\xbb\xdb\x9c\x45\x23\xc7\x9b\x23\xee\xe8\x9b\x91\x18\x39\xee\x5b\xcf\x9d\xdf\xa0\xe0\x87\xd8\x8f\x9c\xc7\x20\x13\x74\x56\x15\xb3\x5a\x4f\x48\xdc\x23\xd6\x6e\x40\x83\x95\xe6\xc6\x1c\x24\xe4\x4e\xbc\x64\xbc\xc6\x75\x85\x19\x0d\xed\xb0\x67\xde\x4d\x83\x8c\x2e\x8a\x20\xd3\xc8\xe9\xb6\x77\x31\x93\x92\x51\xc5\x48\x56\x5d\xbd\x1c\x3d\x1c\x72\xac\x09\x78\x77\xb7\x8b\xd6\xc9\x53\x6a\x58\x07\x8d\xcd\x7a\x8b\x6b\x56\x7d\xb3\xea\x96\x25\xa9\xd6\x29\x64\x6d\xfc\x7e\x1f\x1c\xa8\x1d\x23\x41\xc1\x2c\xd3\xd3\x7b\x2d\x26\x6b\x7d\x7c\x4a\xef\x5e\x01\x1f\xe9\xf1\x31\xf9\xfa\xab\xff\xf3\xcd\x9f\x97\xdc\x68\x09\x23\xc4\x3f\x00\x77\xb6\xa0\x35\xc1\x30\xff\xe0\xac\xd1\xb0\x08\xf1\x1c\x15\xf7\x04\x23\x77\x81\x41\xb7\x14\x03\x38\x1c\xbb\xcc\x33\x03\x17\x43\xe8\xad\xad\x21\x82\x8e\x11\x92\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\xee\x3e\xf4\x16\x2c\x99\x29\xf2\x97\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xaa\x98\x12\x2c\x27\xf4\xc6\x80\x79\x4e\x08\x61\xbd\xf7\x6d\xdc\x7d\xf6\xc0\xf5\x6c\x81\x29\xe3\x2c\xcd\xd3\x63\xf2\x62\xc9\x2d\x96\xa4\xad\xb9\x9b\xf6\xe6\x42\x10\xa0\x86\x74\x8d\x24\x4d\x8d\xc8\x13\x11\x16\x03\xd7\x6c\xc8\x30\x68\x20\xa0\x36\xaa\xfb\xf6\x41\x1f\x83\x12\xa0\x88\xe1\x29\x86\x0e\x95\x90\xbd\x6f\xe5\x1c\x89\x1c\xd8\x79\x6f\xa2\x32\x81\x9a\x66\x60\x4f\x83\x55\x60\x08\xdc\x65\x56\x54\x2d\xb9\x21\x52\xa0\x9c\xf1\x91\x0f\x7b\xf1\xb6\x64\xcb\x75\x6f\xc7\xe0\xbc\xe7\x50\xf6\x05\x45\x46\x59\x8a\x51\x6f\xa2\x64\x94\x53\x49\xb9\x36\x6a\xec\x49\xff\xc2\xca\xe8\xb3\x36\x4d\x5a\xc4\x42\xfa\xd3\x68\x8f\xaa\x25\x56\x66\x89\xce\x6f\x8e\x27\xb6\xb9\xa3\xfa\xf2\xc5\x57\x2b\xb7\x3c\xdc\xb7\xdc\x85\x47\xb5\x06\xc9\x8f\xc9\x7f\xbf\x3b\xe9\xfe\x3f\xda\xfd\xcf\x87\x03\xf7\x8f\x17\xdd\xbf\xfc\xda\x39\xfe\xf0\x45\xe9\xcf\x0f\x87\xdf\x7d\xbe\x64\xa6\xc5\xc2\xfc\x12\xf4\x71\x4c\xc4\xcb\x89\x7e\x47\x3b\x3e\x4a\xe5\x5a\xe6\xd0\x21\xdf\xd3\x44\x41\x87\xfc\xcc\x91\x35\xd4\x04\xda\x6a\x0f\xb5\xe1\xca\x7b\xe6\xad\xcb\x3c\xe5\xee\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xa9\xaf\xeb\x01\xc9\x9b\x1a\x4a\x94\xa6\x14\x73\x8b\x41\x9a\xe6\x20\x89\x9e\x93\x70\x7b\x91\x48\x8f\x4a\x31\xb9\x46\xb4\x7e\x4d\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x54\xac\x48\xc2\x6e\x80\x9c\x14\x7a\xa3\x21\x96\x03\x88\x28\xca\xe2\x72\xc0\xb4\xa4\xd6\xe8\xeb\xe5\xca\xc2\xa2\x34\xcc\x13\x72\x60\xd4\xd5\x1e\x06\x92\xcd\x51\xd7\x43\x67\xbd\x1d\xb0\x84\xe9\xa9\x55\xa5\x23\xc1\x87\x09\x73\x2a\x40\x9a\x09\xa9\x29\xd7\xce\xce\x08\x23\xb8\x23\xac\x70\x7d\x33\x45\x0e\x62\xae\x5e\xbe\xfc\xea\xeb\xab\x7c\x10\x8b\x94\x32\xfe\x7d\xaa\x8f\x0e\xbf\x3b\xf8\x77\x4e\x13\xf4\xf2\x5e\xd2\x14\xbe\x4f\xf5\x61\x73\x6c\xf1\xe5\x37\x6b\x9c\xa2\x83\x77\xf6\xac\x7c\x38\x78\xd7\x75\xff\xfa\xc2\xff\x74\xf8\xdd\xc1\xfb\xde\xca\xeb\x87\x5f\x98\x6f\x28\x9d\xc0\x0f\xef\xba\xc5\xf1\xeb\x7d\xf8\xe2\xf0\xbb\xd2\xb5\xc3\x45\x87\xf1\xae\x5b\x84\x8a\x74\x8d\x16\xd0\x4d\x69\xd6\xbd\x81\xe9\x92\xc3\xb9\x54\x1c\x9d\x9f\xc8\x42\x2c\xa5\xd9\x22\xed\xdb\xc6\xd6\xbe\x05\x8c\xe7\x8c\x16\x22\x79\x4d\x0f\x0c\xa7\x4b\x44\xb2\x6e\x11\x81\xb5\x85\xd5\xc9\xf0\x1d\x6b\x69\x5b\x25\x4e\xaf\x81\x2d\xeb\xc9\x8f\x7c\x45\xfc\xe2\xbd\x2f\x09\xdf\xb9\xf5\x0c\xfe\x7c\x2f\x49\xfd\x58\x7b\x9e\x9c\x2d\xd5\xb4\xaa\x36\xcc\x8b\x33\x2b\xfa\x22\xe9\x41\x71\x6e\x2c\x8c\x9e\x97\x73\xf6\xef\x1c\xc8\xc5\x99\xa3\x47\x1d\xc2\x78\x94\xe4\xb1\x91\x14\x7e\xfe\xf9\xe2\xcc\xe8\xef\x7f\x77\xe4\xe6\x16\x48\x2c\xf8\xbe\x26\x6f\x2e\x5f\xfd\x13\x8d\x01\x78\x47\xc7\x32\x74\xeb\x8f\xa2\x09\xb3\x59\x23\x9e\x01\x93\xbf\x83\x8d\x93\xc3\x37\x47\x34\x0b\xf6\x13\x24\x77\x18\x61\x95\x64\x46\x80\xb8\x01\xa2\x72\xe9\x56\x67\x26\xb6\x1e\x5f\x03\x6b\xe2\xfc\xc1\x23\xd0\x88\xe4\x09\x66\x3f\x6c\x03\x34\x17\x8f\xcf\x04\xbf\x32\x52\xe0\x03\x9c\x0f\x83\xc8\x6f\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x48\x42\xb8\xf7\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfc\x24\xcd\x7d\xef\x56\x6f\xb4\xf6\x4c\xf4\x6c\xbe\xbd\xc7\xfe\x3c\x17\xc6\x55\x55\x9d\x67\x72\xc1\xd0\xb6\x1a\x9c\xa3\x63\xaa\xc8\x00\x80\xa3\x39\xd7\x5a\xff\x80\x3b\xac\x83\xc2\x10\x9b\x67\x5d\x2d\xba\xf1\xe2\xcd\xbb\x07\x72\xf7\x43\x6d\x85\xe6\x5a\xf9\xb6\x93\x8d\x15\xd5\xdb\xf1\x74\x11\x0c\x94\x35\x67\x62\xe0\x90\x97\x41\x36\xfd\xb0\xe5\x8a\xc9\x8c\x55\x17\x35\x0b\x67\xd4\x70\x7a\xc6\xfc\x92\x8c\xf6\x58\xb1\x6c\x68\x81\xde\xbc\xaa\x65\x6f\xf3\x35\xda\x6d\xbe\x02\x39\x61\x5b\x31\xbf\xfb\x0e\x66\x64\xe3\x4c\x4e\x1e\xfe\x58\x19\xd1\x6b\xeb\x97\xa0\xe9\x2f\x12\xf7\xb8\x6f\x56\xc6\xbf\x23\x04\x57\x45\xf9\x6f\x32\xc7\xa6\xcc\xd2\x52\x93\x63\xcc\xb8\xf0\x3f\x69\x21\xd1\xe5\x5e\xfe\x2d\x1f\x04\x41\xb9\x98\xdd\xe9\x40\xe4\x7f\xfe\xf7\xb3\xcf\x9e\x64\x1e\x79\x92\x2b\x0d\xd2\x81\xcf\x27\x51\x7f\xbc\x7c\x72\xfb\x7a\x77\x86\x1c\xe4\xf0\x7a\x29\xaf\x7c\xd1\x3d\xf3\xf9\xe5\x0b\x3f\x04\x6f\x59\x98\x67\xae\x26\xe5\x7f\xbb\x1b\x8b\x8c\xf3\x45\xb3\x3d\x64\xe6\x79\x25\x6b\xed\xea\x97\x12\xf6\x7e\x9c\x74\xf3\x19\xdf\xe2\xea\x25\x4c\x4a\xfb\x54\x7e\xfd\x2f\x73\xbf\xaf\xfb\x7a\xff\xf9\xd4\xbc\xb9\x14\xd0\x22\x38\x66\xc2\x26\xd4\xd7\x0c\x58\xbc\xa0\x05\xb7\xd8\x15\xbd\x9d\xbf\x70\x7f\xde\xb9\xd3\x5d\xb3\x31\x55\xf3\x20\xee\xcf\xfc\xba\x60\xba\x66\xb3\xcd\x17\x61\xbf\x15\xaf\x2d\x05\x09\x9e\x35\xdc\x3b\x23\xf7\xfe\xb6\xf0\x99\xab\x0c\xa2\xdf\xda\xcc\xf3\x36\xf3\xbc\xcd\x3c\xdf\xd1\xcc\xf3\xfb\xcf\xbd\x39\xc3\x24\x86\x28\xa1\x3e\xd3\x45\x43\x92\x60\x1a\xf8\x58\xdc\x86\xe8\xcb\x24\x29\x47\x6b\x16\xb1\x5f\x29\xe5\x18\xd1\x90\x65\xd6\x36\x4e\xc9\x88\x4d\x80\x87\x60\x94\x75\x17\xbf\x3a\x13\x7e\x31\x83\xf2\x57\xdd\x02\x67\xae\xac\x4c\x92\x9f\x95\x81\x56\x40\xed\xa4\xb8\xd7\xd9\x08\x72\x6e\x5d\xfe\xb9\x84\x18\xd3\x1e\x2c\x92\xa7\x34\x43\x29\xcf\xa7\x36\xd2\x32\x82\x63\xc6\xcd\xd4\x27\x9d\x0d\xa6\xc4\x88\x71\x48\x10\xb4\x10\x2e\x30\xc7\x3c\x8b\x84\x41\x82\x96\x0c\x26\x65\x03\x69\x70\x44\x6d\xae\x13\xac\x9f\x46\xbb\x52\x24\xa6\x19\x73\xb2\x4b\x1c\x04\xcb\x35\xa0\xd7\xbf\x70\xf8\x56\x88\xa3\xca\xe1\x1b\x28\xcc\x53\x70\xf2\x41\x90\x6b\xf1\x4d\x0e\xb1\x62\x82\xa9\x17\x16\x33\x0c\xd8\xca\x48\x38\x40\xcb\x8c\xa4\xdc\x5c\x58\x88\xdc\x0f\x90\x9e\x2d\x6e\xf9\xf2\xe8\x80\x66\x53\xbc\xca\xb0\x0b\x3f\x9b\x05\x4e\x30\xc3\xdd\xab\xce\x5a\xe0\x69\xb5\x1a\x34\xc2\xce\xdd\x12\x93\x09\xa3\x84\x8e\x46\x12\xa3\x65\x97\x46\x1a\xac\x99\xa6\x75\x5f\x68\x04\xc1\xc3\x88\x92\xfc\xca\x3b\x0c\x19\x5c\x79\xc3\x52\x0b\xad\xbf\x61\x5e\x58\xac\x8e\xf5\x12\xca\x28\x9a\xd1\x3c\x68\x85\xbc\x27\x77\xe5\xfe\xbd\xb5\xe3\x9e\x1d\xb6\xa3\xba\xcf\x33\x0b\x71\x57\x07\xe6\x7c\x14\xa4\xd9\x90\x83\xa8\xf0\x66\x3b\x37\x49\x06\xd2\xe8\xe3\x36\x9e\x98\x92\xc8\xca\x6f\x81\xf0\x78\xef\xf0\x3d\xcb\x59\x6b\xff\xed\x58\x07\x0b\xec\xe8\x62\x48\xd5\x3d\xb7\xad\xb7\x55\x76\xdc\x53\xca\x62\x76\xac\x99\xc2\xe4\xe6\x5e\x5d\xea\xa2\xd6\xdc\x06\x0c\x8d\x4f\xba\x46\x4e\x8e\x1d\x55\xf3\x16\xbd\x7d\x5d\x8e\x24\x91\xf4\x96\x00\x8f\x84\x21\x16\xff\xdf\xab\x37\x97\x3e\x7f\xed\x42\x13\x96\x66\x09\xa4\x18\x57\xf1\x9a\x4a\x35\xa6\x09\x48\xe4\x4e\x3f\xf3\xb4\xf2\xf7\x4c\x08\x78\x0c\x09\x9d\xda\xc9\x62\x88\x04\x5a\xe2\x85\x24\x99\x11\x70\xd3\x2c\xc7\x14\x0e\xbc\x8a\xef\xbd\x37\x49\x67\x0b\xd0\x14\x26\xaa\xc1\x74\xa1\x05\xb4\x3a\xee\xba\xf1\xba\x34\xa0\xbc\x98\xfb\x29\x81\x1d\x6b\xd1\x83\xf2\xc4\xf7\x7e\x65\xc8\x90\xe9\xaf\xb0\xb1\x95\x67\xdc\x30\x17\xec\xeb\xaf\x56\xdc\x19\x43\x96\x88\xa9\xc1\x8b\xfb\xcf\xca\x9a\xdf\xb3\xf6\xb9\x5e\x77\xbe\x75\xcf\xf2\x9a\xf3\x59\xe3\x54\x13\x33\x2d\x52\xa0\xb6\x9a\x68\x95\xfb\x6f\xa3\x89\x16\xd8\x1f\x97\xcf\xf6\x20\xcc\xaf\x7f\xe1\xad\x0d\xc1\xeb\x6b\x69\xd3\x4f\xc1\x6f\x5c\x12\xa4\xa7\x99\xa3\x34\x46\x16\x9c\x65\x77\x8f\xc3\xe5\xee\x91\x67\xfc\x6d\xf7\x48\x35\xfe\xb6\xfb\x64\x1b\x3b\x36\x61\x9b\xf7\x23\x9d\x1d\x1b\xd1\xd8\xfb\x11\x70\x8b\x49\x27\xab\xbd\xc9\x5b\xcc\x6b\x74\xe2\x1d\x90\xf0\xae\x2a\xcb\xa8\xc8\x77\x2e\xe7\xd0\x08\x6f\x58\xa6\x6a\x90\x88\xe8\xc6\xd9\x2d\xdf\x9e\x85\xf4\x3e\x5f\x96\xcd\x25\xf7\x11\x76\x1f\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x53\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\x75\xcf\x78\x72\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x7d\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x79\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\x28\x61\xef\xea\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfa\x85\x8c\x40\x2b\x83\x05\xb0\xb8\xa9\x42\xcd\x64\x63\xe0\x74\x90\x2c\x9c\xf8\x3e\x52\xe2\x9e\x5c\x6d\x3c\x1e\x08\x61\xbe\x6e\x1e\x62\xa8\xea\x78\x4d\x67\x93\x78\xe6\xbd\x65\x39\x76\x8b\x83\x9a\x4f\xdf\x9e\x35\x15\xca\x8c\xdd\x4d\xc2\xac\xae\x10\x2f\x56\x0e\x74\xb5\xfe\xde\xdc\x72\x88\x31\xc9\xcd\x97\x2d\x37\x87\x9e\x45\x4c\x27\xd3\xf0\xe2\xde\xa2\xb2\x23\x4f\x27\x24\xfa\xf4\xed\xd9\xfa\xe6\x7b\xbf\x01\x1f\xc3\x52\xdf\xda\xe1\x5b\x3b\x7c\x18\xad\x18\xb4\xe5\xa4\xad\x18\xb4\x62\x3c\x6f\x31\x68\xd7\xed\xd6\xad\xb5\x99\xb4\xd6\xe6\xd5\xb7\xb5\xd6\xe6\xd6\xda\xdc\xda\x6f\x96\x8c\x56\x70\xc1\xd1\x0a\x2e\xf7\x8c\x27\x27\xb8\xb4\xd6\xe6\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\x3d\xc5\xd0\xdd\xd6\xe8\xd7\x1a\xfd\x5a\xa3\x5f\xcb\x8d\x5a\x6e\x74\xcf\x78\x72\xdc\xa8\x35\xfa\x6d\x3a\x51\x6b\xf4\x5b\x38\x5a\xa3\xdf\x3d\xa3\x35\xfa\xb5\x46\xbf\x25\xa3\x15\x5c\xb6\x9c\xb4\x15\x5c\x56\x8c\xe7\x2d\xb8\xb4\x46\xbf\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\xd5\x37\xfa\xdd\x73\x92\x56\x3f\xbb\xfa\xa4\xac\x7c\x96\x45\xab\x5e\xb8\x75\x4f\xf7\x5a\x0d\x60\x07\x54\xc1\x37\x7f\x9c\xab\x5b\x5e\xbe\x25\x85\x98\x51\xbd\x7d\x7f\xd6\xe2\x15\xcb\xf7\x6c\x8d\xbd\x0f\xcb\xd8\x72\x16\x57\x58\xf9\xde\xa0\x58\xb3\xb5\xf1\x85\xbd\x39\xf4\x99\x9f\xe9\xcb\x59\x70\x1e\xbe\xa4\x00\x7d\x50\x1a\x6f\xc7\xe0\x1b\xda\xb8\xd2\xd3\xa1\x63\x3c\x53\x21\x7a\x79\x61\xff\xa4\x9a\xe1\xc8\xfe\x3d\x0b\x2e\xdf\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x99\xb5\x5e\x9f\x85\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\xfa\x7e\x0e\xdd\x2d\x65\x2a\x2f\xb3\xac\xaf\xc3\x98\x5d\x0f\x8c\x3e\xc8\x94\x29\xb5\x2c\xe0\xba\xba\xf4\xfb\xc8\xe6\x1a\xe4\x72\x09\xfc\xfd\x17\x95\x96\x13\xc4\x27\xdb\xfe\x67\x40\x23\x22\xf3\xc4\x35\x01\x75\xe5\xaf\x09\x8d\x22\x91\x73\x4d\x38\x40\x6c\x2d\x1b\x8b\x70\x75\x0d\x62\xbb\x86\xfc\xb4\xae\xf4\xd4\xb5\xeb\xbc\xf7\x2e\xf7\x0d\x27\xf6\x13\x16\x16\x54\x2f\x8f\xf5\xa5\x2d\x7c\xfd\xfd\x5c\x6b\x13\x56\xb8\x36\x23\xac\xec\x6f\x5f\x24\x2c\x9a\xbe\xcd\x13\x70\x2d\xe2\x4a\x4d\xf4\xad\xb4\x5b\x16\x91\x33\xbc\x1b\x57\x6f\x7b\x53\xc6\x02\x6c\x27\x69\x57\x18\xa0\xf2\xb8\xef\x52\x65\x5b\x3b\x98\x87\x08\xcd\xb2\x04\x53\x29\x84\x11\x5a\x6c\x8f\xfe\xd0\x5f\x6f\xd1\x6d\xeb\x4b\x2f\x6b\x89\xd7\x64\x23\x11\x9b\x78\x9b\xd5\xe0\x3e\x54\x21\x1b\xca\xda\xc4\x96\x88\xff\x41\x8a\x3c\x5b\xf3\xf6\x79\xcb\xa2\x7d\xda\x77\xdf\x2a\x37\xb0\xf1\x17\x9d\xcb\xc8\x77\x0c\xb6\x4d\xba\x9c\x49\xd4\x76\x03\x4f\xf3\x44\xb3\x2c\xb1\x6d\xbe\x47\x76\x42\x2a\xa1\xe0\x1b\x1d\x42\xf9\xd4\x7b\xa0\x5c\x9b\x08\x88\x09\x1d\x99\x19\xb5\x6f\x1e\x6b\xfb\x4b\xe4\x29\x98\xd3\x1c\x97\x1a\x9a\x1a\x75\x8a\x4f\x8b\xd9\xc9\x2d\x4b\x12\x6c\xdf\x9b\x24\xe2\x16\xe2\x1e\xd9\xdb\x9b\x25\xe5\x91\x90\xa5\xf5\x20\x31\xd9\xfb\xa2\x72\x97\xa1\x1c\xc5\x82\xd7\xc1\x11\xb2\xb1\x60\x49\x36\x13\x2e\xc9\xe6\x62\x34\x21\x5c\x70\x6f\x1e\xfe\xf9\xed\xab\xed\x10\xe1\xb2\x3a\x87\xeb\x27\x02\xd8\x1c\x3b\xa3\x52\x33\x9a\x90\x5c\x26\xca\xe2\x02\x35\x8a\x84\xf4\x0d\x59\xc6\x14\xbd\x8b\x11\x28\xdb\xf9\x83\x7c\x61\x77\xdf\x6d\x8e\x3d\xe3\x82\x27\x53\x42\xed\xd6\x0c\xf3\x24\xe9\x90\x21\xe3\xd4\x90\x6e\xc8\x7c\x36\x8d\xd1\xc1\xc8\x15\xe3\x11\x98\x6f\xea\x06\xe1\x04\x57\x64\x66\x34\x34\x22\x1c\xf4\xb8\x53\xea\x0a\x8d\xbd\xbc\xf1\x15\xe6\xd0\x47\xd8\xfa\x6e\x28\xa4\x17\x7b\xde\x8a\x04\x4d\xe4\xce\x78\xee\xba\xe2\xd3\xf2\xe5\xbf\x33\x8e\x8a\x0e\x79\x8b\xcc\xc7\x28\x4c\xc0\xb0\xc7\xb4\x99\x12\x5b\xdd\x1a\x64\x29\x90\xf2\x40\xe5\xd1\xd8\x7c\xd2\x5e\x26\x62\xb5\x67\x48\xd1\x9e\x82\x48\x82\x56\x7b\x87\xe6\xaf\xd9\x6f\xc0\xef\x2b\x3f\x77\x44\x33\xb6\x77\xd8\x21\x08\x20\x6c\x96\x22\xf4\xf8\xe9\xe2\xa1\xff\xd6\x4a\x8f\xae\xfb\xc6\x4c\x27\xc0\xd2\x0c\xae\xf3\x87\xc8\x6c\x23\x0d\x43\xe7\x35\x60\xae\x95\x41\x4a\xdb\xe3\x33\x34\x99\x9f\x25\xf8\x84\x9c\x84\x26\xfb\xa0\xb1\x97\xb8\xbb\x1b\x26\x20\xa7\x7a\x6c\x34\x5e\xa6\x02\x01\x79\xf2\x40\xaf\x07\x70\x77\xe0\x3d\x70\x0b\x24\xb7\xdd\x99\x66\x81\xbb\xff\xc5\xfe\x2c\x21\x2d\x38\xc2\x93\x05\x25\xb2\xe8\xad\xc0\xf8\x8b\x79\xb2\x0a\x42\xfb\x93\xa5\x96\x81\x7e\xbc\x7a\x65\x3b\x31\x39\x58\xfd\xc4\x78\xac\x42\x35\xa4\x38\x74\xdc\x34\xf0\x5e\x08\x64\x5c\xe1\x53\x04\xf0\xbc\x08\xbc\xae\xd8\x7a\xcf\xf4\x25\x1d\x69\x17\xd4\x1a\xec\xec\x54\x91\x94\x0c\x9d\xea\x58\xb7\x95\x11\x41\x12\x3a\x80\xc4\xb6\x6d\x32\x57\x8b\xe5\x93\x93\x57\xaf\x43\x87\x33\xec\x18\xfa\xb1\x95\x99\x35\x9c\xaf\x73\x7d\xe2\xe6\xc7\xfa\xf2\x2b\x82\x62\x33\x83\x32\xb9\x02\x6d\x8f\x59\x4a\x33\x73\xca\xec\x1c\x0b\xed\xa1\xaf\x10\xd2\xf7\x1f\x96\x8d\xe4\xfe\xf5\xfb\x3a\x2d\x7a\xc9\x5a\x47\x65\x3d\xaf\xf1\x26\x67\x6f\x85\x95\xa4\x18\x15\x30\xcf\x20\xb4\xd3\x0d\x9c\x34\x1f\x85\x1e\x7d\x16\x83\x95\x4d\xae\xb6\xa9\xec\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa2\x78\x19\xdd\x3b\x81\x48\x8b\xd5\xa5\xe3\xfc\xcd\x1a\xd2\x2c\xb9\xef\xe4\x91\x8d\x95\xb4\x94\xf1\xb7\x40\xe3\xe9\x15\x44\x82\xc7\x6b\x12\xd8\xca\x7e\xbc\x66\x9c\xa5\x79\x4a\x78\x9e\x0e\x00\x41\xac\xec\x5c\x48\x48\xac\x02\x4c\x09\x87\xdb\x64\xea\xdb\x0d\x93\x4c\xc4\x9e\x9e\x0c\xb0\xab\x72\x3c\xc5\x1e\x69\x58\x64\x95\x4f\xcd\x24\xd8\x3d\xd9\xd7\xe2\x23\x91\xa4\xca\x88\x45\x1d\x9c\x94\x69\xc3\xb1\x06\x80\xfe\x29\x16\x83\xd9\x63\x3a\xa1\x2c\x31\xa2\x75\x8f\x9c\xc1\x90\xe6\x09\xb6\xfa\x23\x2f\xc8\x81\x79\x99\xd7\xc9\x16\x3d\x60\xc4\x5d\x25\x8c\x36\xaf\x5c\x9e\x3c\x2e\xe8\x70\x03\x8b\xfb\x3a\x35\x00\xfd\x58\xb7\x16\xa0\x1f\x19\xcd\xd5\xba\xaa\x7c\x65\x63\x2e\x6c\x57\xed\xb2\x24\x5a\x22\xe9\x4c\xb9\x99\xd7\x63\xd9\xab\xeb\x27\x2c\x58\xb5\x14\x23\x09\x4a\x9d\x01\x8d\x13\xc6\x61\x7b\xfc\xba\x1e\x03\x49\xe9\x1d\xe2\x18\x36\x45\x67\xbc\x82\x61\xb4\xfc\x55\x5a\xd8\xc6\xfb\xfe\xf5\x64\x00\x43\x6c\xe5\x88\x1f\x5c\xda\x7d\x8b\x3f\x43\xca\x12\xa3\xa1\x5f\x57\x61\x53\x74\x40\xb6\x88\x63\xfe\x66\x3c\x07\xf3\x54\x26\x05\x2a\x93\xf6\xd1\x32\x8f\x47\x1e\x4a\x8b\x96\xe4\xbe\xeb\x5f\x7f\x06\x14\xe7\x77\x91\x35\x14\xba\x6e\xe2\x1e\x37\x55\x2e\x87\x46\x75\xf4\x1a\x67\x69\x41\xae\x5d\x2c\xb9\x14\xda\x35\x0f\x0c\x1f\x88\x4f\xbb\x66\x96\xa0\x34\x4b\xf1\x80\xc5\xb9\xf4\xad\x35\x11\x66\x74\xf1\xd6\x57\x8e\xca\x37\x2f\x5e\xac\x29\xbf\x3d\x3c\xd2\x4b\x40\x4d\x79\x1b\x7c\xb9\x0c\x74\xc8\x93\x7f\xa3\x02\x9b\x3d\x66\x4e\x0c\xc6\x1e\xa1\x20\xd1\xd7\xc8\x94\x66\x7c\x94\x33\x35\x26\x03\xd0\xb7\x00\x9c\xc0\x9d\xad\x92\x41\xfe\x03\x52\xe0\xa6\x1a\xf0\x16\x6e\x86\x0a\xd0\x5e\xee\x0e\xc4\x26\x4c\x31\xc1\x7f\x64\x4a\x0b\x39\x7d\xc5\x52\x76\x4f\xf9\x52\x3f\xe6\x3b\x25\x07\x08\x8a\x24\xc6\xfe\xc6\x2c\xa2\x57\x60\x3f\x58\x02\x5a\x41\xb5\xb0\xea\x29\x31\xe7\x64\x40\xa3\x9b\x07\x03\xf0\x8b\x5d\x81\xb0\x67\xd7\x5b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\x77\x16\x3e\x15\x28\xdf\x8e\x85\x02\xbc\xc1\x1a\x2a\xf1\x31\xef\x58\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x70\x58\xbd\xa3\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x1a\x5b\x53\x96\x88\x83\x38\xb1\xaf\x9c\xd8\xbf\x09\x94\xd7\x36\x44\x6f\x6e\x32\x26\x76\x9d\xe7\x77\x46\xb7\xbc\xd7\x23\x54\x1d\x15\x90\xcf\x4e\x53\xd5\x80\x93\xea\x86\x38\xb9\x2d\xb5\x6d\x86\xaf\xd1\x88\x5c\xfc\x82\xbb\x70\x72\x79\xb6\xbe\x29\x66\x1b\x05\x77\x63\x15\x77\xd6\x5c\xbe\xe2\xa3\xbc\xc9\xd4\x5d\xa9\xda\xcc\x6d\x7b\xe9\x0e\xa1\xe4\x06\xa6\xb6\x13\xf5\x5c\x6b\x5f\x09\x89\x93\x24\x00\x3b\xdc\x9a\x9b\x5c\x5b\xea\x0d\xd6\xbb\x31\xf6\xd8\xb1\x99\x3b\xc3\x8f\xae\x59\xe8\x86\x4f\xf8\x8f\xde\xe0\xb1\xcd\x11\xdc\x8e\x1b\x98\x6e\xf6\xc0\xcc\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x43\x10\xf4\xc2\x56\x6f\xe6\x67\x2a\x8f\x8d\x4d\x54\x7e\x78\x20\xd6\xfa\xbc\x80\x7e\x65\x2b\x93\xf9\xc6\x7d\x65\x91\xd1\x9c\xe9\x31\xcb\x90\x11\x79\x67\x80\x6f\x94\xfe\x0b\x4d\x58\x1c\xa6\xb0\xe7\xf7\x82\x77\x8c\xf8\x64\xfe\x83\x44\xd7\x8a\x6b\x67\x02\xd4\xa5\xd0\xf8\xcb\x47\x03\x90\x5d\x66\x2d\xf0\xd8\x29\x9c\x15\x1a\xa9\x0c\x2a\x5e\xa5\x1e\xeb\xaa\xe7\xab\x83\x05\x50\x32\x45\x2e\x38\x11\xd2\xc3\x01\xbb\xde\xdb\x89\xec\x14\xc8\x27\x06\xd6\xc1\x81\xf6\xe9\x85\x73\x38\xf0\x09\x59\x81\xde\x8a\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\xab\x7e\x82\xd2\xae\x13\x55\xa9\x77\x94\xb3\x88\xa4\x20\x47\xe8\x71\x89\xd6\xf6\x38\x54\x37\x65\x33\xba\x6b\xc7\xc6\xd4\xb7\xfc\xc2\x8d\xb0\x00\x59\x93\x35\x01\xd5\x61\x6e\x76\x86\x8a\xc9\xe9\x7f\x0c\x05\xc7\x3d\xf8\x5f\x92\x51\x26\x55\x8f\x9c\x10\xc5\xf8\x28\x81\xca\x35\xa7\x61\x94\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd0\xc4\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x2c\x4b\xed\x38\x49\xc5\x50\x9e\xe0\xe8\xda\xbb\x81\xe9\x5e\x67\x0e\x69\xf6\x2e\xf8\x9e\xe5\x2d\x73\x68\x12\x18\x11\xfa\xc8\xf6\xf0\xda\x5e\x93\x5c\x78\x43\x86\xb3\xad\x1d\xad\xfa\xd2\xb5\x31\xc2\xc7\x87\x6c\x29\xac\x57\xb4\x44\x17\x15\xa5\x05\xc9\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x5b\x94\x1e\x77\x46\xf0\x33\x9a\x04\xe3\xa3\x9f\xb3\x98\xea\xb5\x02\x53\xed\xa8\x40\x64\xff\xad\x9d\x84\xe4\x38\x8b\xc1\xad\x21\x1b\x91\x8c\x4a\x9a\xaa\x1e\xe9\xbb\x0a\x89\x88\x69\x6c\x58\xb6\x25\x3a\xd8\x5d\x4f\x33\x20\x7f\x25\x6f\xcb\x6b\xe9\x91\x6e\xb7\x4b\xae\xdf\x9c\xbd\x39\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x19\x9a\x13\x42\x35\x4c\x40\x92\x5b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x0f\x8b\xc7\xdb\x49\x26\x29\xbd\xbb\xca\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\xc3\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x77\x4c\xfe\x84\xae\x6d\x4a\x32\x90\x11\x70\x4d\x47\x30\x6b\x06\xb0\xf7\xbd\x7c\xf1\x5f\x87\x8e\x1f\x99\x19\x9d\xf5\xe4\x85\xc1\x88\xd7\xf4\xee\x67\x5e\x98\x06\x99\x22\x2f\x7a\xe4\x64\xe6\x65\xf8\x5c\x12\xe5\x09\xda\x5a\xd0\x5d\x5f\x7a\xe5\x60\x4a\xa4\xc8\xd1\x61\x4f\xf2\xac\xaa\xcd\x7e\xf5\xa7\xff\x32\x4a\x1f\x4d\xb3\x04\x8e\x7d\x61\x55\xab\x36\x1b\x19\x46\x0b\xf2\xf5\x8b\xff\xb2\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x73\x42\x32\x2d\x2a\xb4\xca\x2a\xfa\x2b\x4d\xa5\x56\x1d\x82\x5e\xfd\x20\x1c\x6a\xa1\x69\x32\xa3\xe5\xa3\x16\x0e\xb7\x16\x48\xb1\x40\x98\x00\x1a\xaa\xc8\xcb\xaf\x5f\xfc\xd7\xbc\x39\xe5\x0d\x8f\x00\x9f\xc4\x27\x30\xcc\x62\x60\x94\xfb\x1b\x96\x24\x10\x77\xee\x5d\xfe\x30\x97\x7a\x0c\xb2\x43\x80\x2b\x6f\xac\x32\xeb\x9b\x59\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\x2f\x5e\xf2\xfa\xc7\xcd\x0c\xca\xa7\x6f\x86\x9b\x8a\x03\xdd\x2d\xcc\x10\xf3\x4f\x6f\x21\x52\xde\x75\x6f\x42\xb6\x65\x97\x71\xdd\x15\xb2\x6b\xa7\x39\x26\x5a\xe6\xf7\x7b\x0d\x8a\x91\x56\x4e\xc0\x47\x20\x03\x79\xe9\xbc\xcd\xed\xea\x83\x9c\xfc\xed\xcf\x73\x2c\x6e\xf9\x72\xca\x81\x84\xd3\xd1\x8c\x2d\x4f\x7d\xd5\xe2\x36\x73\x6c\xcc\xdb\xcd\xdd\xff\x67\x1e\xbb\x37\x20\x07\xee\xec\x86\xd3\x6e\xe4\x2a\xf4\x78\x74\xd6\x78\x7b\x38\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x01\xe5\x9a\x3b\xe1\x0b\x28\x90\x5d\x47\xe1\x90\xd1\x18\x51\x60\xce\xb9\x5a\x7a\xd0\x13\xa0\x4a\x2f\x02\x45\x7b\xd0\xef\x1f\xab\x93\x00\x66\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5a\x44\xd9\x7b\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x5e\x38\x12\x66\xff\xaa\xf2\xd5\x43\x85\xcd\x78\x23\xe7\x36\xa2\xb5\x7b\xb4\x14\x1c\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8c\x14\x9d\x82\xa6\xab\x13\x45\x66\x47\x95\x68\x5f\x69\xca\x63\x2a\x63\xb7\xca\xfd\x7d\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\x74\xef\xe6\xcf\xaa\xc7\xc4\x51\x24\xd2\x34\xe7\x4c\x4f\x8f\xd0\x81\xc6\x06\xb9\x16\x52\x1d\xc5\x30\x81\xe4\x48\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x44\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\x3f\xf8\x17\x3d\xb0\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x86\x8b\x5b\xde\x45\x4d\x56\x6d\x74\x9a\xd6\x8b\x62\xf0\x63\x06\xde\x9b\x04\x2e\x64\x22\x7e\xf0\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x03\xef\xc5\x36\xb6\xdd\x6e\x11\x18\xb0\x4e\xd4\xba\x1d\xdb\x69\x43\x34\xd2\x6c\x02\x5b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x57\x86\x99\x5f\x1b\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x63\x94\x4f\xe7\xb9\x36\x12\xff\x0d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\x9b\x59\xe6\xb6\x67\x97\x25\x37\xdd\x37\x7f\xdc\x64\xeb\x86\xd8\x8a\x61\x43\x2b\x7b\x35\x82\x62\x58\xce\x12\x70\xdb\xb3\xaf\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\xf3\xa0\x16\x8f\x2d\x5d\x21\xdb\xfb\x1b\x08\x62\xd0\xc9\x56\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\xd3\xa4\x7c\x2c\xa1\x21\x5c\x5b\x9a\x56\xb7\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\xcf\x50\xfa\xbc\x0a\xdf\x75\x31\xe2\x22\xfc\x7c\x7e\x07\x51\xbe\x6e\x36\xf9\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x9c\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\x09\x30\x92\xa4\x86\xc6\xf8\x44\x98\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x16\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x52\x29\xa3\x5a\xd9\x4a\x7c\x10\xb2\x1a\x5c\x2a\x4f\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x0e\x3b\xa4\x48\x36\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x7b\xf6\xe3\xf6\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\x1d\x42\x62\x90\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x6f\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xd3\x1b\x87\x63\xe4\x05\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xfd\xa5\x15\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x61\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x03\x05\x29\x75\xaa\x11\x4a\xe4\x07\x6d\xcf\xf1\xab\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x22\x51\x4e\x0b\xa6\xfa\x41\x9b\x69\x5e\x2d\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\x4b\x13\x60\xd8\x97\xb7\xc3\x7c\x9c\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xad\x5d\xf8\x11\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\x3f\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x72\x24\xf6\x1a\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xb2\xfb\xf2\xc5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x98\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xe6\xed\xb6\xee\x31\xd2\x10\x4f\xa8\xcd\x07\x66\x15\xa8\x3c\x49\x0c\x7a\x5b\x8f\xd9\x3c\x08\x16\x78\xb2\x16\x64\xdb\x58\x37\x6b\x5a\xca\xba\xc1\x7b\xae\x45\x26\x12\x31\x9a\x96\x77\xd0\x76\x75\x29\x95\xb7\xa1\x44\xe5\x03\x27\x02\x9a\x43\x74\x39\xb3\xe5\xad\x2f\x64\xe9\x68\x7d\x21\x73\xa3\xb5\x0f\xcc\x8e\xd6\x3e\xb0\xc1\x68\xed\x03\x0b\x46\x6b\x1f\x98\x1f\xad\x7d\xa0\xb5\x0f\xd4\x19\xcf\xdf\x3e\x40\x5a\x5f\xc8\xb2\xd1\xca\x3a\xc5\x68\x65\x9d\xf5\x47\x2b\xeb\xcc\x8f\x56\xd6\x69\x65\x9d\x56\xd6\x69\x65\x9d\x6d\x47\x0d\xe4\xce\x44\xdc\x78\x8a\x4c\x26\xe2\x15\x19\x32\xd6\x5e\x1d\x89\x6e\x22\xa2\x50\x59\xc4\x3c\xe2\x3c\x1f\x8a\xa6\xd6\x84\xde\x21\xff\x11\x1c\x6c\x7a\x82\x2d\x59\x9b\x02\x11\xd8\x04\x22\x13\xf1\x81\x3a\xdc\x22\xf0\xbc\xcd\xb0\x69\x33\x6c\x3e\x81\x0c\x9b\x31\x55\xae\xf0\x11\x92\xd6\xe5\x09\x37\xa5\xe3\x7f\x0d\x32\xfd\x64\xf3\x6d\x0c\xc2\x39\x84\xc1\x3e\x73\x05\x52\x58\xd8\xc5\xce\xb7\x0b\x71\xbf\x0a\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x76\x2d\x92\x09\x32\x64\xae\xfe\xd7\x0c\xfe\x3a\x08\x3f\xf1\xbc\x99\x2a\x24\x9e\x74\xf2\x4c\xf5\x53\x1a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xe4\x52\x69\x9a\xd1\x4a\xbb\x44\x3b\x77\xda\x4f\xb5\xf4\xd2\xa6\x94\x48\x54\xf2\xae\x36\x2a\x73\xbc\x7c\x2c\x2c\x4e\xfb\xef\x1c\xe4\x94\x88\x09\xc8\x42\x31\x0a\xdd\x79\x3a\xa1\xc9\x4c\x44\x5d\x01\xe4\x66\x0c\x3c\x8d\x98\x22\x9a\xd4\xd4\x9b\xf6\x1a\x92\x1d\xab\x7e\xbc\x7c\x34\xab\x38\x34\xa8\x36\x3c\xb5\x5a\xca\xcb\x47\xa3\xe6\x37\xd2\xb0\x09\x8e\x34\x68\x86\x23\xcd\x9a\xe2\x48\xe3\xe6\x38\xd2\xa4\x49\x8e\x7c\xf4\x0a\xd0\xcb\x47\xc3\xe6\x23\xd2\xb8\x95\x8e\x3c\xc1\x7a\xd2\xcb\xc7\x03\x80\xbb\x49\x8b\x1d\x69\xab\x53\xd7\x1e\x4d\x1b\xd4\x48\xd3\x46\x35\xd2\x34\x1e\x6e\x55\x05\x7b\xf9\x68\xeb\x63\x3f\x80\x9c\xd6\x98\x10\x51\xb7\xa6\xf6\x7d\x0b\x6d\x00\x27\x43\xef\xde\x8f\xa5\x00\x59\x2e\x5d\x34\x8c\x35\xef\x2e\xf5\xea\xc2\x50\xcd\x72\x63\x53\x1f\xb7\x8a\x18\x8d\xbf\xc7\xde\xe0\x95\xf3\x52\xf1\xb8\xd2\x64\x73\xad\x63\x0a\xd3\x59\x68\x1e\x63\x94\x82\xa2\xe9\x54\xe9\x61\xbc\xb7\x67\xc3\x49\x0b\x69\x82\xc7\xb3\x01\xa6\xc5\x13\xa8\x5f\xd8\x76\xb6\x7b\xde\x8e\xbd\xaf\x8a\x3b\xf6\x7a\xe5\xce\xb7\x6e\xc6\x83\xff\xf9\xdf\xc3\x4a\xf5\x96\x62\xc2\x56\xfb\x5b\x7b\xb4\xda\x5f\xad\xd1\x6a\x7f\x4b\x47\xab\xfd\xd5\x18\xad\xf6\xb7\xde\x68\xb5\xbf\xe5\xa3\xd5\xfe\x5a\xed\x6f\x8b\xd1\x6a\x7f\xad\xf6\xb7\xed\xf8\x84\xb5\xbf\x66\xa3\x9a\xcb\xba\x98\x0b\x12\x41\xf9\x51\x53\xcd\xa2\x22\xe2\xd9\xdf\x65\xff\xd5\xac\x0e\x58\xd6\xef\x16\x6b\x80\x65\x2d\x71\x4e\x0b\xee\xdd\xa3\xee\x05\x85\x70\xee\xc9\xd5\x9a\xe0\x73\x8b\xdc\x6e\x0c\x13\x4b\x2e\xe1\x46\x51\xf1\xda\x07\x96\x15\x8d\xd7\x43\xd4\x59\x4c\x0e\xbc\x2f\x1e\x1b\xa9\x70\xa1\xab\x17\xb9\x66\xdd\xe2\x8e\xe0\x9d\xc7\xa0\x9a\x4a\x3e\x7f\xc5\x85\x1c\x62\xd8\x42\x7c\x54\x81\x3d\x86\x3c\x82\xac\xac\x01\x1b\xd7\x0e\x19\xb7\x91\x8e\xbe\xe9\x8f\xe0\x3e\x68\xca\xd2\x53\xa4\x80\x1e\xcf\xad\xe8\x8b\xeb\x41\xf9\xb7\x80\x5d\x29\xca\x87\xe2\x21\xa3\xdc\x25\xc3\x0a\xee\xbb\xd2\xdb\x4e\xf3\x85\xbc\x1c\x7a\xa9\x84\xb7\xf7\xc8\x39\x62\x7d\x79\x62\xa6\x10\x3e\xd4\xf6\x3f\x69\x06\x91\x77\xab\x70\xc3\xed\xc6\x85\x1b\x66\x22\x46\xda\xba\x0d\x6d\xdd\x86\x5a\x75\x1b\xf0\xa2\x3d\xdc\x8d\x17\x70\x20\xff\x70\xed\x91\x24\x20\xa8\xd2\x3c\xd1\x2c\x2b\x22\xb0\x95\x7d\x55\x62\x35\x89\xa1\x8b\x04\xad\xe2\xbb\x79\x1b\x8d\xc6\xb3\x78\x8f\xf3\x61\xc4\xb6\x42\x72\xe2\xa2\x2d\xb1\x99\x11\x56\x1c\xf0\x6a\x87\x0d\x29\x65\x4f\x3f\x52\xf0\x0c\x09\xb6\x2a\xb4\x66\xdb\x6b\xcb\xd0\xf9\xc4\xa0\x84\xa1\xd8\x2b\x18\x44\xb9\xa1\x05\x46\xad\xb2\x09\xf0\x82\x4b\x1c\xa8\xc3\x43\x2f\x0d\x35\xca\xbd\x1e\x84\xfb\x7c\x5b\xe2\x12\x7f\x5b\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\x4f\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x1e\x3d\xa2\xed\x53\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x9e\x87\xdf\xa2\x4d\x18\x5d\x7f\x3c\x85\x84\xd1\x47\xf2\x4d\x3c\x9d\xbc\xd1\x27\xeb\x8f\x78\x2a\x79\xa3\xad\x0f\x62\xa3\xf1\x5c\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8c\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xcc\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x98\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x01\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4c\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\xb3\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x27\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\xf7\x8f\x4f\xbe\x1a\x5d\x25\x96\xee\xf1\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x79\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\xb3\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x89\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\x57\x20\x27\x2c\x82\x93\x28\x32\x7f\x5d\x8b\x1b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xdb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\xaf\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x4b\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7d\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\x2f\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x9f\x1f\xfc\x72\xf2\xf6\xd7\xcb\x93\xd7\xe7\x87\x28\x81\xc2\x5d\x46\xb9\x39\x15\xb9\x2a\x02\x45\xdd\xeb\xcc\x8b\x80\x4f\x98\x14\xdc\xac\x0f\x75\x35\x4a\x26\x7e\xd6\x28\x1c\x06\x09\x4a\x24\x13\x88\xad\x9c\x1c\xde\xe6\xb9\x0e\xe3\x59\xae\xbd\xee\x88\xe1\x8b\xe6\x00\xf1\x68\x4c\xf9\xc8\xac\xf3\x4c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\x4a\x4e\xd4\x63\xed\xe7\x1d\xcf\x29\x0c\xad\x57\xb6\x24\xa2\x8a\x68\xe6\xd7\x5c\xfe\x2c\x35\xe5\x9a\xde\x1d\xdb\xf8\xbd\xbd\xcf\x4b\x97\xf6\x7c\x39\x49\x61\x5e\x61\xf9\x8d\x5d\x55\x82\x95\x0c\x13\xb2\x57\xbe\xbb\x47\xce\xcd\x3b\x20\x2e\x03\xd0\x86\x5f\xc2\x04\x24\x6a\x9e\x0e\x7c\x1d\x22\x61\x44\x65\x9c\x80\xc2\xc0\x43\x4f\x9b\xad\x76\xe0\x00\x06\x41\xaf\xe5\x42\x2f\x22\x26\xe4\xb5\xc0\x20\xc4\xa1\x38\x26\x63\xad\x33\x75\x7c\x74\x74\x93\x0f\x40\x72\xd0\xa0\x7a\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x1b\x75\xc4\xb8\x39\x5c\xdd\x98\x6a\xda\x2d\x9d\xea\x23\xcb\xb9\xbb\x91\x48\x53\xca\xe3\x2e\x75\xd8\xd5\x0d\xdb\x7a\xf4\x07\xc7\x53\xbb\x34\xdc\xc5\x78\x97\x76\xd5\x18\x92\x64\x7f\x0b\x7c\xae\x27\xf3\xd5\x90\xf5\x6a\xc9\x78\xee\xdb\xeb\x1f\xe0\xf3\x70\x5e\x2d\x0c\x7a\xe4\x52\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\x97\x1e\xe9\xf3\xcb\xeb\xb7\xff\xec\xbf\xb9\xb8\xbc\x6e\x4f\x76\x7b\xb2\xdb\x93\x5d\xe3\x64\x03\x9f\xd4\x3e\xd5\x5e\xe6\x2c\x1d\x93\xb0\xdf\xc8\xa9\x15\x68\x7f\x0c\xc2\x06\xd4\x96\x10\xed\x78\x34\xa8\x57\x20\x70\xce\x27\xbf\xd0\xaa\x85\x9d\x2f\x04\x07\x71\x37\x58\x41\x39\xc8\xe0\x75\xe2\xe3\x6b\x58\xb3\xea\xba\xaf\xb6\x92\x22\xed\xa8\xef\x5a\x32\xaf\xde\xde\xd0\x50\xd9\xbe\x4b\x9a\x16\x15\xaa\x17\xec\x5a\x8f\xbc\xf6\x6a\x0f\x39\xfd\xf5\xe2\xec\xfc\xf2\xfa\xe2\xfb\x8b\xf3\xb7\xdb\xeb\xd1\x0d\x58\x5c\xd0\xa6\xd0\x10\x00\xf6\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xc1\x0a\xb2\x98\x08\xcc\x9e\x7e\xe7\xf7\x9d\x06\x7d\x7c\xe1\x63\x2d\xb3\x6d\x96\xd9\x9e\xc1\x90\xe6\x89\xd5\x9e\xf6\xf6\x7a\xdb\x70\x39\x3b\x9a\x42\xdf\xef\xa5\xa8\x51\x81\xb9\x82\xc2\x57\xb6\x76\xfb\x50\xc8\xa5\xc7\x78\xdf\x45\x1f\x54\x58\x8f\x13\x1e\xad\x85\xce\x49\x8f\xd6\x49\x56\x13\x3a\x35\xbd\x0c\xcd\xf8\xde\x23\xc1\x87\x6c\xf4\x9a\x66\x3f\xc1\xf4\x2d\x0c\xeb\x99\x89\xab\xf0\x46\xeb\xa3\x73\x25\xa3\xad\xd2\xb0\x33\xfb\xb2\x7a\x6e\x9a\xc6\x9c\x34\x4d\x45\x67\xd4\x8f\xcc\x68\x2e\x90\xa2\x91\x20\x8a\xb9\x7a\xf8\xd6\x0e\xed\x2c\xca\x4d\xc5\xd8\x34\xe2\xb9\xaf\xc7\xe5\xfd\xa8\x32\xbb\x32\xbb\x77\x74\x56\xaf\xab\x76\x44\x82\x47\x90\x69\x75\x24\x26\x86\x73\xc1\xed\xd1\xad\x90\x37\x46\x8f\x30\xba\x6b\xd7\x62\xad\x3a\x42\x9f\xc1\xd1\x1f\xac\x1b\xec\xfa\xcd\xd9\x9b\x63\x72\x12\xc7\xae\xb9\x49\xae\x60\x98\x27\xae\x9d\x40\x8f\xd0\x8c\xfd\x02\x52\x31\xc1\x3b\xe4\x86\xf1\xb8\x43\x72\x16\x7f\xb7\x3d\x71\xf6\xa3\xc1\x5d\x10\x99\x75\x75\x36\xbc\x13\x57\xe8\x63\x99\x56\x78\x57\x20\x22\x86\x6b\x31\xad\x10\x37\xbd\xd5\xd9\x09\x19\x0d\x81\x66\x73\x13\xfd\xec\xc0\x2d\x6c\x96\xae\xee\x17\x84\xd5\xba\x38\x1d\xa2\x66\x22\x3e\x26\x2a\xcf\x32\x21\xb5\x22\x29\x68\x6a\x94\xde\x9e\xc1\xb0\x4e\xf5\x4f\xf4\x55\x75\xc8\x6f\xe1\x47\x74\x38\xa9\x77\xfb\xfb\xdf\xfe\x74\xfe\xcf\xbf\xed\xef\x7f\xf8\xad\x7c\x15\x59\xa1\x8d\x02\xaa\xde\xa2\x32\x88\x7a\x5c\xc4\x70\x89\xef\xc0\x3f\x55\xc5\xcd\xe2\x2e\x68\xaa\x73\xd5\x1b\x0b\xa5\x2f\xfa\xe1\xcf\x4c\xc4\xb3\x7f\xa9\x1a\x12\x07\xd9\x4d\xc6\x80\x5b\xd4\xa7\x7a\xbc\x23\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xb9\x89\x4e\x4a\xf1\x9f\xdf\x7b\x10\x18\xe9\xe9\x56\x32\xad\xd1\xf5\xe6\x52\xc1\xc5\xb0\x63\x4e\x6d\x21\x76\x4e\x5e\xd6\xae\x8f\xd2\x28\x69\x0b\x3b\xd8\x30\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\x3b\xef\x62\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\xa7\xf7\x7e\xff\xa0\x34\x2e\x34\x5d\x72\xa0\x0a\x1a\xe2\xb1\x0d\x0a\x0a\x49\xc6\x24\x61\x29\x73\xb1\x86\xae\x41\x93\x22\x07\xf6\xc7\x5e\x94\xe5\x1d\x77\x43\x2f\x85\x54\xc8\x69\xf8\x13\xb2\x31\xa4\x46\xd3\xea\x2a\x2d\x24\x1d\x41\x27\x3c\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x85\xab\xd4\x51\x64\x88\x9f\x1f\x6d\xf3\xa0\xdf\x11\xd2\x16\x30\xe3\xf2\x01\x44\xc2\x60\x89\xb3\x02\x67\x80\x22\xea\x93\x13\x91\xe4\x29\xa8\x4e\x10\x83\xac\x35\x80\x4f\x8c\x66\xa9\x76\x4a\x50\x8b\xd9\x84\xa9\x26\xc2\x88\x17\xc8\x69\xcc\x45\xe4\x8b\x5c\x67\xb9\x76\xf5\x66\x4a\x8d\xdd\x84\x42\xbb\x45\x28\x0a\x50\x21\xfb\x2f\xf7\xea\x47\xa3\x53\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\x6b\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xae\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\x3e\x37\x3e\xf7\x29\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x06\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xd6\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x06\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x79\x05\x20\x18\x44\xbc\xf2\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x8f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\x93\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x35\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xd5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x80\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd2\x54\x1b\xac\xbe\x02\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\x6f\x38\x12\x8d\x93\xe4\x96\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\x6e\x99\x5a\xa8\xac\xd4\x46\x9c\x3f\xe0\x4c\x86\x56\xd9\xbf\x3f\xfa\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\x95\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x28\x92\x73\xcd\x12\xbb\x18\x21\x6e\x48\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\x0f\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\x77\x10\x35\x96\xe7\x7f\x7e\x07\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x06\x9e\x51\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xef\xfb\x1d\x02\x3a\x3a\x24\xb7\x82\xef\x6b\x5c\x7e\x8f\x5c\x0b\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcb\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x63\xda\xc5\xab\x19\x92\xf1\x02\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x0f\x48\x81\x39\x88\xdc\x5d\x79\x76\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x01\x9a\x6b\xe2\xf3\xe3\xf5\x75\xff\x07\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\x7f\x8a\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x04\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x9e\x1d\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xc3\x94\xbe\xfc\x18\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\x7f\xfa\xd3\xd7\x7f\xea\xd9\xe9\x43\x94\x02\x27\x17\x27\x97\x27\xbf\x5e\xfd\x72\x8a\xc9\xb1\x75\xa1\xda\x50\x08\x66\xd3\x01\x98\x8d\x86\x5f\x3e\x68\xf0\x25\xa6\x7c\xd4\xa6\x22\x55\xdb\x3f\x4e\x69\x30\xc0\xe8\x6d\x46\xe3\x74\xb2\x5f\xa9\x58\x99\x91\x35\xab\x86\x54\x73\xd4\x76\xe2\x8c\xe9\x28\xbb\x12\xd1\x4d\x83\x7a\xcd\x19\x64\x12\x22\x6b\x27\xbb\x3e\xed\xdb\xd9\x8d\x7e\x79\xf9\xe6\xba\x48\x35\xc0\x78\x1c\xf2\xca\xdb\x97\x7e\x74\x96\x34\xa3\x93\xde\x40\xa6\x83\xea\x3e\xa0\xd1\xcd\x2d\x95\x31\x5a\xb6\xa8\x66\x03\x96\x30\x5b\xfc\xd7\x37\x85\xe4\xc2\x06\xfc\xd9\x22\x67\x62\x38\x5b\x5a\xb3\x30\x87\xa2\xc9\xca\xc6\xd1\x0c\x29\x4b\xd0\x82\x9a\x73\xcd\x52\x70\x11\x41\x51\x16\x4c\x7a\x65\x9b\x76\xab\x7c\xf9\xb1\xb3\xca\xd7\xfe\x1b\xef\xd5\xdb\x58\x0f\xab\x1b\x97\xb8\xc3\xac\xce\xb1\x38\x9b\x10\xd2\xb2\xba\x4f\x82\xd5\x65\x12\xae\xb4\xc8\x1a\xf2\x92\xd8\xc9\x96\xf8\x48\x06\x30\x14\x86\x08\x2f\x75\x7a\xf8\x1e\xc1\x1c\x93\x03\xbd\x55\x4b\x54\x1c\x1b\x36\x22\x53\xe5\xd1\xd8\x1b\x28\x39\x28\x75\x84\xee\x90\x3c\xb3\x5a\x2b\x92\xeb\x5c\x42\xc7\x7c\x1d\xa4\xb8\xba\x4e\x91\xe5\x60\x5e\x0f\xdc\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\xc2\xa0\x6e\xf9\xb3\x6e\x94\x48\x52\x35\x06\x2c\x2f\x02\x77\xcc\x77\x43\xe9\x8b\x78\x7f\xbf\xf8\x14\xc3\x58\x46\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x5b\x4e\x06\x30\x62\x5c\x79\x50\x98\xb9\x3d\xcc\xd0\x1f\xc3\x54\x28\x0c\xd7\x23\x6f\x2b\xc5\x4e\x5c\x1a\x52\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x55\x6a\x99\x1c\x20\xec\xc3\x63\xf5\x1a\x4b\x3e\xc8\x39\xbe\x39\x86\x84\x4e\x6d\xb4\xe9\x90\x71\x9a\xb0\xff\x80\x54\x87\x0d\x78\x9c\x0c\x08\x8b\x6b\x4b\xd7\x81\xa5\xfa\x69\x34\xae\xe7\xfc\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x9c\xb6\x3e\x3a\x15\x58\xe4\xfc\x44\xe5\xa6\x71\xe1\x55\xa5\x3e\x71\xa5\xb2\x20\x3e\x15\xc7\x79\x84\x0a\x3f\xd3\xc2\x7c\xa9\x4d\x5d\x15\x3e\xc9\x50\x1d\x65\xc2\xfe\x5f\xe1\xa8\x28\x79\x28\xac\xc2\xbb\x7d\xce\xda\xa3\x65\x63\xd5\x71\x4b\x7c\x1c\x97\xc4\x8e\xf8\x6f\x1a\x70\x43\xb4\x2e\x88\x67\xe7\x82\x78\x3e\x5d\x73\x9d\x67\xfe\x7a\x2c\x41\x8d\x45\xb2\x35\xa2\x57\x90\xfc\x35\xe3\x2c\xcd\x53\x83\x73\xca\xe0\x33\x9b\x84\x10\x00\x15\xd0\xd5\x52\x6c\x6b\x45\x34\x37\xb2\x18\xb0\xd8\x29\x65\x89\xd9\x46\xcc\xdf\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xb6\x52\x2b\x6b\x38\x5f\xf7\xc2\x9b\x42\xeb\x8c\x97\xf5\xe8\x4d\x3d\x26\x6e\xcb\x91\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\x7f\x78\xdb\x3f\x2d\xb7\xc9\xe6\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\xd8\xc7\x9b\x8c\xb0\xe6\x9a\xf1\x63\x33\xf7\x01\x68\x5a\xd2\x6d\x9c\x5a\xa0\x08\x70\x3a\x48\xcc\x73\xe6\xa9\xc0\x91\xfb\x96\xef\x02\xd5\xb9\x04\x32\xa2\xfa\x31\x09\x7e\x7d\x15\xa6\x96\xfa\xd2\x04\xbf\xa9\x2b\xa1\x57\x6d\x70\x46\x0e\xaf\x5a\xa1\x46\x88\x17\xb6\x82\xfe\xda\x72\x78\x6d\x4a\x59\x5f\x36\xae\x7f\xb4\x08\x96\xb8\xc1\x0f\x6f\x0c\xc0\x7b\xae\xe5\xb3\x67\xe7\x65\x25\xc8\x77\x95\xd2\x82\x64\x09\x2d\xfa\x42\xe1\x0e\xfc\x88\x3c\xe8\x74\x0c\xd1\xcd\x5b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\x79\xcf\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xc7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6a\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x40\x51\xe6\x87\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x31\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xc7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x07\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x82\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x8a\x5b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xec\x88\x06\x56\xa5\x1e\xde\x0a\xec\x5e\x74\xbf\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x65\x51\x4e\xf9\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\xcf\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\x73\x9f\xd5\xf8\xfa\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x8f\x14\x9b\xb2\x83\x82\xee\x13\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x07\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xc3\x92\xc4\x4d\xd3\x23\x57\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf8\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x96\x1f\x6e\xe4\x75\x45\x47\xeb\xf5\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x71\x3b\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xed\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x73\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x89\x4f\xc1\xcb\x3c\xb5\x2a\x02\x0a\x5c\x18\x3e\x7f\xf6\xe6\xfc\x0a\xc3\xf2\x33\x69\x2b\x85\x60\x1c\x17\x5e\xc7\x99\x06\x60\x9e\x70\x9d\x7b\x7b\xe4\x84\x4f\xed\x45\x7b\xa6\x98\x22\x09\x53\x1a\x90\xeb\x39\xb1\xcd\xfb\xaf\xf7\x5e\xf4\xf0\x7f\x7b\x84\xc6\xb1\x34\x72\x5d\x08\x4f\x8b\xe6\xe2\x45\xad\xe4\xc7\x06\x49\xe9\x03\x38\x68\x1b\x8d\xf6\x5a\xc4\x6e\xe5\xc8\x49\xd0\x77\x65\xd9\xa0\xd2\x92\x6a\x18\xb1\x88\xa4\x20\x47\x40\x32\xaa\xa3\x31\x49\xe9\x94\x44\x42\xca\x3c\xb3\x75\xfe\x63\xaa\x69\x8f\x7c\x2f\x24\x49\xfd\x21\x36\x38\x6f\xf8\xf0\xd5\x62\x9f\x7e\x71\xb2\xcb\xff\x64\x4a\xe5\xa0\x8e\x5e\xbe\xf8\xf3\x57\x7f\xfa\xd3\xb3\x6a\x0d\x57\x84\x0b\x99\xbd\x2d\xb5\x86\xa3\x7e\x17\xec\xae\xdb\x56\x81\x8c\x8f\x92\x32\x7e\x6d\xc7\x00\xea\x6a\x99\x75\x75\xcc\x6e\xf1\x05\xfd\x6d\x55\xcd\x46\x5a\xd4\x15\x6b\x68\xa8\xb1\x53\xc1\x07\xbd\x62\xe5\x68\x83\x28\xf7\xea\xbd\xe8\xfb\x83\xe9\xe4\x9c\x74\xa6\xc1\x6b\x56\x44\x27\x75\xc8\x0b\xf2\x2d\xb9\x23\xdf\xa2\xa2\xf5\x4d\xdd\x36\x58\x75\x55\xa0\x26\x82\x8d\x8c\x7e\x7f\xd1\x6f\x08\xe2\xff\x30\x44\xd3\xcc\x68\xa0\xaa\x05\x19\x30\x27\xd8\xc3\x9d\x06\x69\x04\x4d\xb7\x13\x8f\xda\x40\xcc\x2c\xf0\x23\xa2\x99\x75\x3c\x5c\x0c\xab\x01\x4e\x9b\x21\x9a\x79\xfc\x47\xa1\xf4\xa5\xa3\x42\xd5\x56\x38\xc5\x6c\x29\x12\xfe\x0a\x19\x33\x7c\x43\xe9\xe2\x80\x29\x12\x0b\x8c\xb7\xb2\x81\xcc\x63\x56\x23\x8c\x62\x77\xd0\xb8\x9e\x67\xbd\xb2\x9f\xab\x76\x6a\xc6\x94\x82\x3a\x90\x13\xb1\x4a\x35\xb2\x32\x11\x3b\xe9\xcc\x2c\x2b\x2e\xf1\x8c\x15\xe2\x99\xb3\xda\x04\x7b\x33\xe2\x92\x39\x4f\x11\xe5\x36\x95\x64\x08\x52\xda\xd8\xf3\xc1\xd4\x87\xed\xd5\xde\xbc\x5a\x27\x29\x93\x42\x8b\x48\xd4\xe8\x71\x56\xf5\x76\xbb\xe9\x10\x08\x36\xde\xd7\x1b\xcc\x7f\x3e\xeb\x77\xc8\xf5\x69\x1f\xfb\x3e\x5d\x9d\x5e\xf7\xab\x3a\xcb\xde\xf5\x69\x7f\xef\x51\x41\x41\xbc\xc0\x87\x26\xea\x2d\x26\xa9\x98\xa0\x8c\x34\xd9\x4d\x69\xd6\xbd\x81\xe9\x96\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x78\x36\x09\x34\x66\x1f\x29\x9f\xcb\x07\xc4\x86\x77\x2e\x4e\xec\x4a\xc5\x04\x62\x2b\xa5\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbd\x36\x7f\xba\xcd\xf6\x5a\x7b\xb4\xd9\x5e\x6d\xb6\xd7\xfc\xd8\x99\x90\xd6\x36\xdb\xeb\x79\x79\xf0\xdb\x6c\xaf\x4f\x3c\x08\xa0\xcd\xf6\x5a\x3c\xda\x6c\xaf\x36\xdb\x6b\xbd\xd1\x66\x7b\x6d\x3e\x76\x2e\x7c\xa9\xcd\xf6\xda\x68\xb4\xd9\x5e\xf3\xa3\xcd\xf6\x5a\x32\xda\x6c\xaf\x25\xa3\xcd\xf6\x6a\xb3\xbd\xda\x6c\xaf\x36\x08\xf6\xde\xb9\x76\x33\x08\x96\xb4\xd9\x5e\x6e\xb4\xd9\x5e\xcf\x22\xd4\x8f\xb4\xd9\x5e\x6b\x8d\x36\xdb\xab\xcd\xf6\xda\x66\xb4\xd9\x5e\xcf\xc5\x5c\xd2\x66\x7b\xb5\xd9\x5e\x9f\x8e\xa0\xdb\x66\x7b\xb5\xd9\x5e\x6d\xb6\x57\x9b\xed\xb5\x72\x15\x6d\xb6\xd7\x73\x50\x01\x7d\x47\xe0\xfa\xd9\x4b\xfb\xa7\x22\xcd\x72\x0d\xe4\xad\x9f\x32\x48\x91\x96\x30\x30\x55\x96\x08\xea\x87\x10\x46\x82\x0f\xd9\xc8\x51\xf6\x23\xdb\x86\xb7\x1b\xbe\xa7\x5b\x6a\x7d\xfb\x04\xe3\x07\x13\x96\xb2\xed\x52\xca\xc8\xdc\xc6\xbc\xc2\xb9\x4a\x7e\x19\x73\x92\x52\x7a\x87\x47\x84\xa6\x22\xb7\xad\x8b\x23\xb7\x7f\x01\x84\xd6\x7b\xb5\x73\x3b\x43\x9a\x51\x71\x68\xec\xe3\xea\xfa\x4d\x84\x95\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x91\xb8\x39\x81\xb8\x21\x71\xf8\x41\x84\x61\xe7\xd0\x6d\xe8\x2c\xba\x60\x94\xb9\xd3\xe8\x18\xd6\xaa\xd3\xe8\xa9\x29\x8a\x79\x61\x1e\xa6\x88\x48\x99\x36\xc2\xa1\x91\x07\x69\x39\x9c\x95\xe9\x8a\x52\xea\xe8\x00\x06\x74\x53\x6d\x1b\xad\x87\x50\xd0\x52\x10\x8b\xf0\x92\x9f\xeb\x44\xcf\xd2\x2c\xc1\x06\xe7\x78\x9e\xbb\x3e\x96\x05\x99\x6b\x4b\x1b\xee\x1f\x2d\x6d\x78\x8e\xb4\x41\x41\x94\x4b\xa6\xa7\xa7\x82\x6b\xb8\xdb\xca\xc2\x52\x25\x0d\x57\xd5\x09\x5d\xcc\x98\x72\xb1\x6e\xf6\x1a\x11\x99\x8d\xfb\x9e\x49\xac\x1f\x8b\x3c\x89\x31\x99\x23\xe7\xa8\x60\xda\x2c\x3d\xd0\x56\xfb\x43\xbd\x07\x43\xb9\x67\x5f\xe2\xf5\x39\xab\x66\xfe\x3b\x67\x13\x9a\x18\x6d\xb7\x78\xa2\x8f\x1a\x4c\xf9\xa1\x75\xcf\xbc\xa6\xea\xa6\x38\xf0\xd0\x35\x32\x74\x58\xf3\x91\xff\x24\xfc\x09\xee\xf4\x53\x94\xd2\x50\x40\xea\x4b\x36\x61\x09\x8c\xe0\x5c\x45\x34\x41\xba\xd6\x0c\xaf\x38\x59\x32\x3b\x6e\xbc\x14\x89\x22\xb7\x63\x30\xb4\x9a\x50\x6f\x02\xc0\x0c\xbb\x11\x65\xdc\xe6\xc5\x67\xfe\x61\x65\x6d\x09\x86\xfc\x67\x54\x9a\x0d\x0e\x36\x03\x54\x91\x07\x42\x24\x2e\xe3\x21\x99\x16\xf3\xbb\xdc\x1f\x2e\x7e\xe5\x70\xfb\xab\x99\x4d\x91\x61\x42\x47\xc1\x54\xa0\x40\xcf\x59\xfb\x8a\xa9\x97\x7e\x00\xa6\x13\xe4\x40\x68\x72\x4b\xa7\xaa\x30\x9c\x94\x2a\x40\xa8\x63\xf2\xf2\x10\xd1\x99\x2a\x12\xe6\x88\xc9\x57\x87\xe8\xfe\x3b\x3d\xe9\xff\x7a\xf5\xcf\xab\x5f\x4f\xce\x5e\x5f\x5c\x92\x4b\xa1\xc1\x32\xb5\x52\x9b\xc0\x28\x68\x18\x66\x95\xf8\x0e\xd4\xd2\x85\xea\xa1\xed\x92\x29\x72\xcb\x78\x2c\x6e\xd5\xd6\x36\x5a\x8b\x7e\x06\x78\x40\xf9\x56\x73\x44\x34\xa3\xd8\xfd\xb0\x06\x87\x99\x8b\x30\x29\x4f\x8a\x3c\x3c\x8e\x8f\x62\x29\x32\x0b\x04\x6f\xe4\x2a\x58\x6d\x55\x8d\x2e\xc7\xb0\xe2\xfe\x0e\xab\x13\x8e\x24\xe5\xba\xb0\xf6\x14\x7b\xe6\xda\x2e\xf6\x6a\x6f\xc7\xd3\xce\x68\xa2\x71\x73\xd9\x4c\x27\x71\x0c\x71\x05\xfc\xcf\x2e\x72\xf0\xd4\x7f\xdc\xb4\xa8\x52\x41\xfa\x6f\xae\x2e\xfe\x7f\x33\x78\x3c\xcd\xea\x05\x4a\x35\x93\x19\x2b\x45\xd6\xd8\xee\xbe\x75\x99\x97\xed\xfe\xee\xc4\xfe\x06\x6e\xd9\x8c\x7b\xfe\x6d\xce\xab\x25\x8d\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x36\x35\xae\xc3\x1b\x8d\x1c\xf1\xda\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x8e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x0d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xda\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x91\x77\xbd\xc6\x21\x34\x40\x79\xc3\x93\xe9\x5b\x21\xf4\xf7\x21\x8d\xb6\x11\x0c\xf8\x87\x93\x96\xab\xa6\x68\x14\x27\x29\xbe\xb7\x8b\xbb\x81\x87\xaa\x9c\xc1\x7b\x56\xec\xf8\x53\x3f\x52\x32\xe7\x27\xea\x07\x29\xf2\xad\x99\xd8\x9c\xb0\xf9\xc3\xc5\x19\x92\xa2\xdc\xb9\x2a\xb9\x96\x53\x2c\x1d\x30\x5f\xff\x2d\x28\x06\x3f\x3b\x67\x6b\xf9\x4c\x14\x7e\x31\xf2\x9a\x4e\x09\x4d\x94\xf0\xb0\x64\x7c\xa1\x16\xea\x54\x5c\x73\x79\x20\xf4\x78\x4e\xb7\x35\x07\x6a\xfe\xb9\x4e\xc9\x73\x59\x14\xa4\x63\x7c\xee\x71\x4d\x6f\x40\x91\x4c\x42\x04\x31\xf0\xe8\xb1\xb7\xfd\xb1\x1d\x7e\x88\x3a\x97\x82\x9b\x83\xd9\x08\xf2\x5c\x04\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe5\x03\x48\x0c\xe4\x8d\x4a\xea\x7a\xc6\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbe\xa7\x8a\xfc\x7c\x71\x46\x5e\x90\x03\xf3\xae\x43\xc4\x1f\x6c\x29\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\xfb\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x37\x71\xfd\x71\x29\xd4\xcf\x0a\x64\x63\x04\xea\xe7\x2d\x08\x54\x59\x8c\x32\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\x70\xf9\x1b\x76\x76\x4b\x3f\x6d\xf2\xa5\xe0\x15\xe3\xf9\x9d\x0d\x3c\x6a\xce\xd4\x72\x75\x8e\xd3\x92\xc8\x43\x1d\x77\x9d\x66\x59\xc2\x6c\xb5\x8d\x99\x40\xb8\x8b\x0a\xae\x74\x96\x88\x89\x48\x27\x68\x92\x08\x43\x1f\x8d\x70\x42\x79\x2c\xd2\xb9\x97\x19\x21\x12\x2a\x95\x53\x7b\xa4\xc5\xbe\xea\xd8\x11\xa3\x50\x02\x13\xa8\x51\x5b\x6c\xb6\x52\xac\x99\xcd\x00\xc7\x63\x04\x4e\x4f\x12\x3a\x80\xc4\xc2\xd8\x62\xa0\x9a\xc7\xc0\xc7\x8e\x46\x95\x22\x69\x2e\x7d\xe6\xad\x48\xc0\x86\x77\x79\x40\x98\xe9\x9f\x04\x1c\x70\x92\xa6\xe0\x80\xda\x60\x05\x0e\xa8\xd7\x3e\x05\x38\xe4\x35\x58\x3d\x99\x85\x83\x91\x1b\xaa\x70\x40\xe6\xbd\xeb\x70\x50\x10\x45\x22\xcd\xfa\x52\x18\xb5\xb3\x31\xde\xe4\xa6\x2d\x7c\x86\xd6\xb0\xb1\x20\x18\x0b\x79\x41\xf5\x66\x2a\x4b\x81\x9d\x54\x5b\x26\xe1\xa3\x3b\xff\x3f\x25\x9e\x85\xa4\x67\x96\x91\xf9\x59\x2a\xee\x45\xf3\xa4\xbb\xf0\x94\xd9\x41\x13\xb9\x11\x35\x8c\x9d\x8d\x70\x23\x11\xd1\x04\x6b\xc7\xd6\x43\x39\x32\x8b\x76\xb3\x13\x97\xc2\x79\xd1\x47\x89\xbf\xf9\x00\x12\x2c\x23\x8a\xbf\x38\x13\x26\x17\x31\x94\x7c\xd9\x36\x0e\xf9\xda\x86\x7d\xe2\x7d\x3e\x92\xd8\xc8\x15\xde\xad\x1c\x57\x9e\xd6\xc2\x55\x40\x7b\x1d\x2a\xd2\x9a\x05\x02\x8f\x19\x1f\xa1\x5d\xad\x43\x24\x24\x36\x06\xd9\x11\x81\x1b\xab\x41\xee\xe3\x91\xf0\x93\xfa\xf3\xe0\x5f\x8d\xb2\x18\x13\xdc\xcd\x8c\x96\x22\x2f\x61\x0d\x2d\xb9\x65\x8a\xec\xbd\xf2\x00\xa8\x51\xc2\x73\x17\x39\xcc\x9e\xfd\xc2\xb0\x9b\xd6\xd2\x79\xc3\x78\xec\xc2\x75\x2b\xc0\x0a\x35\xe0\xad\x1c\x8c\x81\xe0\x2c\x2e\xd3\x96\x63\xf2\x9e\x93\x00\x2c\xd2\xdd\x1a\x3d\xde\x5a\x91\xd9\xdb\xe8\xba\xab\x0d\xaf\xe1\x25\xb3\xd3\xfc\xcc\x71\xef\xcd\x7b\xbb\x46\x73\x9f\xbf\xcf\x7f\xcb\xa3\x96\xee\x71\xd4\xaf\x69\x2d\xe6\x1f\x76\x5a\x2f\xd2\x47\x06\xad\x35\xe3\x23\x55\xd6\x64\x68\x92\x54\x8c\xe1\x8b\x54\x19\xbf\xc3\xa1\xe2\xff\xbc\x0a\x31\x93\x66\xf0\x54\xd4\x90\xc4\x88\x13\x4f\x5c\x09\x19\xa5\x8a\x9e\x4a\x03\x09\xcd\x68\x72\x95\x6d\x5f\xa2\x94\xcc\x95\xc3\x7b\x7d\x75\x52\x9d\x1a\x99\x35\x36\xa4\x30\x7b\x65\xae\x13\x1a\xa7\x4c\x29\x34\x84\xc1\x60\x2c\xc4\x0d\x39\x58\xd9\xa9\xa1\xab\xd8\x48\x1d\x39\x9c\xef\x9a\xd5\x1f\x12\xc6\x93\x10\x15\x85\x7a\x30\xd7\xca\x1b\x72\xf0\x25\x51\x58\x05\xee\xa1\xab\x5b\xed\x82\x15\xe6\x97\x69\x2b\x55\x1b\x2c\x78\x74\x82\x3d\xbf\x3d\x97\x35\xcb\xae\xdc\xb3\x45\x97\x0e\xb7\x67\x2b\xab\x2d\x84\xa3\x95\x1e\x1f\x1d\x48\x4e\xb8\x88\x40\x35\x57\xd0\xe9\xc7\x62\x4e\x12\x83\xcd\xe2\x01\x8c\x7e\xa2\x4b\x83\xec\xd0\x2e\xbd\x8f\xc9\xa0\xee\xd1\xfd\xb2\x44\x7d\x5d\x10\x17\xa3\x8f\x24\xd9\x98\x76\xad\x92\x6e\x28\x1a\x92\x40\x2f\x42\x8c\x05\x17\x2e\x49\xc2\x30\x51\xc1\x11\xa5\x91\x44\x59\x6f\x1e\xee\x89\x23\xd1\xa5\xa5\x9e\x16\x5e\xe2\xb2\x23\x10\x93\xc9\x74\x68\xad\x62\xd7\x70\xcb\xf4\x18\xeb\xbc\x8e\x67\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\xda\x57\x65\x47\x75\x51\x0a\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x50\x14\xbe\x75\x59\x06\x06\xc1\x5c\x29\xf9\x94\xdd\x99\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc1\xd9\xc5\x97\x0f\x7b\x84\x5c\xf0\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x3e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xca\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0e\x7f\x55\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x91\x4c\x7d\x75\x17\xf6\x1f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x2f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\xb6\xa4\x22\x42\x92\x5b\x2a\x53\xc3\x37\x68\x34\x46\x0f\x25\xe5\x24\xce\x25\x56\x59\xd6\x40\xe3\x69\x57\x69\xaa\x8d\xa4\x0c\xd2\x29\x94\x7e\xfd\x6d\x49\xfd\x95\xa3\x2d\xa9\xbf\xe6\x68\x4b\xea\xb7\x25\xf5\xe7\xc7\xce\x44\x87\xb6\x25\xf5\x9f\x57\x99\xa4\xb6\xa4\xfe\x63\x7b\x13\xda\x92\xfa\x6d\x49\xfd\x55\xa3\x2d\xa9\x7f\xcf\x68\x4b\xea\x6f\x31\x9e\x01\xe5\x6a\x4b\xea\x6f\x31\xda\x92\xfa\x8b\x47\x5b\x52\x7f\x7e\xb4\x25\xf5\x97\x8e\xb6\xa4\xfe\xd6\xa3\x2d\xa9\xdf\x96\xd4\x6f\x2b\x8d\x6e\x36\xd7\x6e\x56\x1a\x25\x6d\x49\x7d\x37\xda\x92\xfa\xcf\xa2\x9e\x22\x69\x4b\xea\xaf\x35\xda\x92\xfa\x6d\x49\xfd\x6d\x46\x5b\x52\xff\xb9\x98\x4b\xda\x92\xfa\x6d\x49\xfd\x4f\x47\xd0\x6d\x4b\xea\xb7\x25\xf5\xdb\x92\xfa\x6d\x49\xfd\x95\xab\x68\x4b\xea\x3f\x07\x15\x50\xe9\x98\x6d\x55\x01\x74\x9d\x62\x45\x2e\x08\xbd\x54\x1b\x60\x90\x0f\x87\x20\x91\x72\xe1\x9b\xe7\x82\xa7\x8a\xba\x8c\xb3\x4e\x56\xd0\x1d\xac\x7b\xe4\xf2\x75\x96\x3c\xee\x8a\x11\x60\xa5\xce\x22\x52\xfc\xfc\xcd\xf7\x0b\x2a\x23\x6d\x1d\x55\xb8\x6d\x8c\x34\xae\xf9\x0d\xdf\xce\x3f\xbe\x04\xe0\x8b\xf2\xc7\x1c\xdc\xa3\x44\x28\x17\xe1\x8e\xc0\x8a\xc6\x94\x73\xf0\xfa\x1e\xd3\x68\x47\x19\x00\x70\x22\x32\x70\xde\x69\x4a\x14\xe3\xa3\x04\x08\xd5\x9a\x46\xe3\x9e\x79\x13\xf7\xc0\x2e\xa2\xd1\xdd\x2f\x4a\x4b\xa0\xa9\x8f\xcb\x4f\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x42\x8d\x65\x54\x01\x18\x18\x15\x57\x84\xb0\x77\x8a\xb7\xb9\x65\x89\x72\x69\x3a\xd4\x36\x3b\x58\x0f\x3c\xcd\xf4\x34\xc4\xf1\x02\x19\x32\xa9\x34\x89\x12\x86\xdc\x1a\xdf\x68\x73\xa7\x71\xbe\x8e\xe7\xd5\xdc\xad\x54\xb9\xa5\xf2\x18\xc5\xd6\x4c\x2b\x1b\x15\x5b\x4c\xe8\xa6\x8a\x99\x72\x62\xbe\xea\x10\xea\xeb\xa6\x59\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x4a\xd3\x95\xea\xc5\x16\x61\xc3\x05\xa2\x63\x8a\x83\x47\xce\x4e\x25\x9b\xa3\x10\x28\x30\x4a\x6f\xee\x18\xe0\x06\x70\x98\x18\x1c\x80\x08\x0c\x7f\xa5\x4b\xb0\xfe\xa3\x23\x7d\x89\x29\xbe\x06\xa5\xe8\x08\xfa\x5b\x3a\x1a\x96\x69\x64\xe8\x6b\x28\x36\x06\x51\x21\xb1\xd9\xb5\xe1\x97\x22\x3a\xb3\x2a\x06\x91\xd4\xae\x29\x08\x3f\xb7\x92\x69\x0d\xb8\xa9\x58\x61\x0f\x7d\x95\xb3\x09\xf8\xfb\x33\x31\x9e\xaf\xfd\x24\xc5\xc3\x86\xa8\xf3\xd8\x46\x5c\x0e\x80\x0c\x24\x83\x21\x19\x32\x0c\xe3\xc4\xc0\xca\x8e\x2d\xb8\x44\xad\x15\x40\x29\xa3\xef\x0a\xee\x65\x59\xbf\xae\x1e\xf9\x87\x5b\x98\x96\x39\x8f\x68\xa9\x96\x2d\x66\x98\xb2\x21\x19\x61\x60\xa6\x93\x16\xff\xf8\xe2\x2f\xdf\x90\xc1\xd4\xb0\x34\x94\xac\xb4\xd0\x34\x09\x1f\x99\x00\x1f\x19\x58\xd9\xe3\x59\xcd\x91\x0c\x10\xc0\x6e\x1e\x76\xe1\x2f\xbf\xba\x19\x54\x79\xec\x51\x0c\x93\xa3\x12\xfc\xba\x89\x18\x2d\xea\x8f\xb2\x7d\xc8\xf6\x96\x2a\xd1\x02\x34\x13\x09\x8b\xa6\xb5\x11\xcd\x57\xfe\x22\x63\x71\x6b\x65\xfd\x05\xd8\x53\xa4\x5b\x65\x22\xcb\x13\x6b\x74\xfe\x3e\x64\x17\xe7\x0a\xe6\x73\x00\x17\x9e\x0b\x34\x93\xba\x29\x66\xeb\xa6\xdb\x78\x5c\xff\x4a\xe1\x72\x4b\x9c\x21\x2f\x14\x00\x43\x45\xe8\x7b\x9a\x24\x03\x1a\xdd\x5c\x8b\x57\x62\xa4\xde\xf0\x73\x29\x85\xac\xae\x25\xa1\x86\x5a\x8e\x73\x7e\x63\x3b\x38\x84\x12\x09\x62\x64\x44\xab\x2c\xd7\x3e\x91\x61\xd1\x07\xdb\x7c\x79\x4f\x84\xbd\x1a\x54\xcc\x02\x77\xac\xd0\x75\x5c\xaa\x96\xc5\xc8\xf2\xfc\xaa\x8c\x6c\x5f\xbd\xf8\xe3\x9f\x2d\xea\x12\x21\xc9\x9f\x5f\x60\xcc\xb6\xea\xd8\x43\x8c\xb4\xcd\x30\x8a\x94\x26\x89\x51\x1b\xca\x48\x69\x00\xbd\x08\x09\x3f\x3a\x0e\xea\xfa\xe8\xb6\xb6\x28\x75\x7d\xfd\x4f\x94\xa3\x98\x56\x90\x0c\x3b\x36\x2b\x29\xa8\x35\xfb\xc8\x18\xf6\x1d\xf5\xc1\xd4\xb0\x1d\x10\x80\x26\x22\xc9\x53\x38\x83\x09\x6b\xa2\x89\x53\x65\x36\xaf\xea\x27\x4c\x61\x02\xd8\x20\x11\xd1\x0d\x89\xdd\xc5\x52\xe4\xc9\x6c\x25\xf0\xed\xa1\xb0\x6d\x0c\x4e\x8d\xd8\x9b\xa5\xdf\x5f\x89\xba\x49\x69\x96\x85\x1c\x21\x49\x6f\x2b\xc0\xc0\x33\x89\xe5\x0a\x6a\xd6\x93\xa9\x6d\x66\xae\x6b\x64\xee\xba\x2f\x32\x74\x73\xeb\x29\xb6\x8e\x3a\xa9\x6f\xa3\x2e\x56\xbf\xbd\x61\xb2\x82\x10\xc5\x84\xfe\x34\x64\xf8\x6f\x9b\x55\x32\x97\x15\x19\x12\xeb\x02\x62\x58\x01\xc0\xa0\x0f\x92\xe4\xed\x0d\xae\x0d\x58\x37\xeb\x85\x1c\x55\xe0\xc2\x83\x55\x39\xa5\xda\x09\x84\xde\x7c\x4d\x49\x06\x52\x31\x65\xf8\xf2\x2f\x78\xa0\x4e\x13\xca\xd2\x92\x09\xf0\x71\x80\x60\x0f\x37\x96\x4f\xae\x4f\x29\xfb\x22\x76\x13\x22\x29\xb4\xa5\xa3\x17\x88\xb5\x55\xa9\xb6\x41\x86\xfa\xd8\xa4\xf2\x97\x02\x9a\x55\x4a\x69\x7e\x09\xa4\xd2\xde\xf5\x9c\x08\x24\x7e\xdf\x53\xa5\x8f\x61\xf1\x0d\x91\x01\x24\x8c\x6e\x73\xab\x94\xb0\xa2\x3c\xda\x83\x52\x12\xe9\x9d\x1e\xd8\x23\xd6\x0b\x6e\xce\x84\x7b\x94\xec\x1f\xef\x3f\x2a\x91\xb4\x20\x92\x22\xa3\xa3\x5a\xbd\x7c\x66\x20\x35\x3b\x6d\xb9\xd0\x84\x51\x83\xf0\x7a\x28\xbb\x86\x77\x41\x5c\xd4\xd1\xc1\x2a\x49\xd6\x3b\xea\x01\xec\x14\x04\x9b\x8f\x7d\x4b\xa7\x84\x4a\x91\xf3\xd8\xd9\x97\x82\x81\xef\xf5\xcc\x8b\x2f\x05\x07\x6f\x38\x9f\xad\x53\x81\x16\x7d\xc6\xc9\xcb\xde\xcb\x17\xcf\x85\x53\xe1\x17\xce\x70\xaa\xcb\xc0\xa9\x2c\x7d\x7a\xd4\x6f\xf5\x15\xef\x1b\xfa\xde\xd7\xce\xc4\x52\x14\xb4\x67\xbe\x5c\x36\xfe\x74\x2b\x99\x86\x52\x8f\xbf\x03\x54\x5c\x8c\x7e\x58\xaa\xca\x70\xb8\xa8\x93\x44\x4d\x20\xd5\x2b\x83\xa1\xf2\xc1\x03\xd2\x2d\x47\xa0\xf0\xb8\x2d\xb2\x70\xa9\x15\x24\xac\x0c\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x09\xcd\x87\x8f\x8a\x5a\x0e\x68\xe7\x77\x59\x8d\x1a\x9b\x33\xb9\xf3\x19\x45\x1b\x5c\xd6\x20\x04\xff\x0e\x63\x3a\x01\x4c\xe4\x66\x09\x95\x09\xfa\x1c\xaf\xec\xda\xc9\x20\xd7\x04\xf8\x84\x49\xc1\x53\xe0\x9a\x4c\xa8\x64\x58\x15\x47\x02\x56\x76\x30\xba\xe8\xe7\x07\xbf\x9c\xbc\xc5\x80\x86\x43\x57\x92\xc2\xad\x32\x57\xbe\x7c\x4d\x79\x25\xa5\xe9\xee\xdd\x3e\xbf\x0e\x03\x43\xa4\xb9\x7e\x5d\xe6\x3d\x69\xae\x73\xdb\x96\xe5\x2e\x4a\x72\xc5\x26\x8f\x45\x49\x5c\x86\xfd\x19\xdb\x6a\x9f\x67\xb2\xfd\x0b\x40\xcd\x25\xee\xa3\x69\x7d\x41\x82\xde\x9c\xc3\x64\x5f\x85\xa4\xbd\xb2\x0f\xdc\x99\x9e\x5c\x2d\x0d\x1b\x3e\xe7\x2b\x2e\xce\x89\x10\x58\x37\xe6\x71\x8d\x50\x31\x57\xa7\xb8\xc2\xcd\xc0\x5a\x0d\x48\xae\xe4\xf1\x9d\x5d\x5e\x95\x8b\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x2a\xd5\x60\xfd\xb4\xa0\x44\x82\x1c\x15\x45\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\xb4\x55\x25\x03\xaa\xac\x93\xe7\xec\xf2\xca\xda\x6c\x37\x83\xd9\xd6\x62\xf6\xf6\x12\xaa\xe1\xf8\x36\x8d\x61\x0b\xe1\xb6\xda\x33\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\x8b\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xa5\xca\xe0\x5b\xc0\xaa\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\xce\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x66\x83\x4d\xbe\x36\x47\xda\x3a\x6a\xde\xd6\x4a\x5e\x0d\x2a\x24\xb6\x2d\x4a\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x82\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x1a\x94\x6b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x62\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\xe5\x37\x5d\x19\xb7\xa2\xc4\xb1\xf5\x0d\xdb\x2a\xd3\x40\xa5\xa7\x68\xb8\xaa\x2d\x4f\x22\x79\x2c\x44\x98\x35\x76\x9c\x5d\x5e\x59\x4a\x68\x3f\x3e\x74\xa7\x5d\xb4\x4b\x05\x55\xdb\x1a\x03\x1f\xad\xca\x50\x1d\xcd\x63\xa6\xb9\x9f\x6b\xd7\x5d\x2b\x90\xa5\x86\xf8\x57\x2b\xd9\xae\xc6\xdb\x15\x50\x19\x8d\xb7\x81\xff\x0a\x42\x60\x27\x25\xb1\xb0\x91\x00\x43\x21\x51\x25\xee\x22\x79\x4f\x84\xb8\xc9\xb3\x75\x28\xba\x9b\xc6\x36\x5c\x5b\x8b\x40\x54\x9e\xf8\xa4\x68\x7a\xcc\xd5\x36\xfe\xde\xaa\xec\x03\xda\x4a\x3c\x38\x51\x91\x40\x21\x66\xf5\xa6\xd3\x24\x57\x1a\xe4\xf7\x4c\x2a\xbd\xe7\xeb\x45\x23\x06\x5b\x9b\xc8\x7e\xf9\x86\x7f\x30\x3d\x76\xa5\x1b\xf7\x3b\xd5\x4b\xe6\x6f\x37\xf1\xbe\xd1\x69\xf7\x2f\x05\x87\xfd\xde\xac\xd8\x15\x48\x79\x20\x6b\x4b\x79\x8a\x5b\xba\x82\xc4\xc6\x8b\xe2\x85\x12\xae\x5c\xbb\xb2\x95\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x38\xbc\x7b\x5c\x94\x99\xb4\x75\xa3\x6c\x9d\x4c\xe1\x04\xbd\x69\x19\x44\xa5\x52\x52\x5a\x2c\xff\xec\x6d\xe4\xb9\x8d\x31\xc0\x96\x1f\x75\xf5\x42\x5e\x31\x7e\xb3\x21\xfa\x55\xa3\x4b\xce\xe7\x66\xab\xd4\x13\xb7\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x20\x72\xed\x6b\x92\xa8\x92\xe2\xc8\xf8\xbf\xec\x5e\xa0\xbd\x3d\xb3\x15\xfb\x16\xe9\x88\xaa\x63\x8d\x3e\x5e\x09\x54\x53\xae\x29\xd6\x16\x3d\x13\xd1\x0d\x48\x92\x98\x65\xf4\x48\x11\xf8\x52\xa9\x66\x29\x73\xd8\x30\xea\x62\x5b\x4b\x07\x64\x63\x48\x41\xd2\xa4\x28\xea\x5a\x03\xd4\xaf\x1c\xe1\x0c\xb3\x96\x63\x52\x6c\x51\x34\x57\x86\xd1\x9c\xc3\xf3\x45\x77\xa5\x74\xea\x2b\xdd\x32\x8e\xe1\x06\x77\x4c\xa1\x59\x3f\x13\x71\x39\xf1\x2c\x57\x20\xbb\x21\x2d\xd0\xe5\xde\xa8\x10\x88\x13\xc3\x20\x1f\x8d\x18\x1f\x39\xea\x8c\x34\xbd\x54\x6e\x3b\x68\x3a\x18\xe9\x1d\x49\xb0\x05\x67\x51\x7a\xb0\xf1\x65\xac\x7c\x7f\x2a\x62\x7b\xfb\x60\x6a\xb5\x41\xbf\xb3\x45\x80\xf4\x05\x27\x42\xba\xd2\x08\x34\x8e\x71\xed\xf3\x5f\x88\x57\xab\x5f\xd5\x09\x71\x1c\x36\xb2\x3b\x3c\x55\x02\x8b\xca\x07\x46\xd8\xc9\xe5\xa6\x15\x42\xb7\x25\xfc\x5b\x11\xfd\x6a\xbd\x9f\x13\x5e\x6c\xf1\x69\x39\x60\x8e\x12\x0d\x69\x26\x24\x95\xd3\x59\x17\xa6\x21\x52\x06\x05\x0c\x00\x67\x20\xd5\x17\x31\xd2\xf1\x05\x1b\x3f\xb1\x9d\x7c\x17\xec\xfd\x42\x1c\x43\x2a\xc8\x05\xf1\x10\x35\xf4\x5a\x45\x63\x88\x73\x8c\x1e\x1f\xe5\x14\x3b\x8d\x9b\x53\xec\x8c\xdd\x53\x17\x96\x67\x91\x21\x04\xfc\x85\x34\x81\x29\x06\xc9\x60\x15\x4e\xf3\x0b\x56\xf3\xb4\xa1\x81\xb6\xd1\x32\x36\x5d\x0d\x51\x82\xd7\x45\xef\x07\xfc\x58\x98\xb0\x48\xfb\x87\x86\xcb\x10\x27\xa2\xa1\xbf\x6b\x5f\xb8\xea\x7f\x11\x18\x62\xa4\x55\xf1\x29\x2e\xaa\x04\xeb\x7b\xbe\xe7\x86\x49\x2c\xc7\xc5\x02\xf1\xee\x41\x39\x94\xab\xab\x5b\xb1\xe2\xf8\x06\x28\x2d\xf8\xf6\x4d\x8b\x25\xd5\x10\xca\xb7\xf7\xb8\x6d\xe5\x29\xab\x23\xff\x53\x39\xaa\xaf\x2b\xed\x9f\xc8\x51\x9e\xda\x1a\xde\x62\xa6\x8c\xb2\xc5\x39\xb4\x6b\x19\x96\x75\xfa\xfa\xac\x9c\xc2\x50\x8e\xcd\xf6\x09\x20\x46\x14\xaa\x69\xef\x9c\x35\x78\x5e\x18\xe5\x2c\x58\x51\x0b\xda\xea\xb4\x38\x67\xd1\x0b\x6f\xf3\x5a\x2c\xe3\x99\xe1\xc6\x28\x43\x14\x36\x3d\x1e\x8d\x29\x1f\xa1\x19\x5c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\xf5\x8d\xf0\xf1\xcf\x9f\x7b\xeb\x9f\x2b\xe1\x83\xed\xeb\x54\x44\x33\xbf\xe6\xf2\x67\x59\x56\x7d\x4c\x58\x0f\x7a\x64\xef\xf3\xd2\xa5\x3d\xfb\xf6\x4c\x0a\xf3\x0a\x17\x3a\x8d\xab\x4a\x98\xc6\x83\xb0\x57\xbe\xbb\x47\xce\xcd\x3b\xd0\x23\x12\x00\x58\x8a\xee\x1d\x14\xe0\xeb\x10\x09\x23\x2a\xe3\x04\x33\xee\x86\x41\x28\xb1\x79\x39\x0e\x60\x78\xfa\x30\x9e\x8e\x0b\xbd\xc8\x3a\xb9\x66\x5a\x84\xa6\xea\x46\x1d\x59\x51\xa6\x1b\x53\x4d\xbb\xd8\x6b\xc3\x12\x8d\x23\xab\x5e\x77\x5d\x95\xd3\x2e\x75\x38\xd5\x0d\xdb\x7a\xf4\x07\x97\x59\xd5\xa5\xe1\x2e\xc6\xbb\xb4\x8b\xf5\x46\xb7\x8f\x15\x7d\x84\xb0\x82\x5a\x9a\x6e\x8d\x62\xb7\xb3\xe2\x69\x28\x76\x8e\x30\xc0\x56\x21\x45\x71\xeb\x10\xc1\xe0\xea\xb9\x56\x0e\xf2\xf9\xe5\xf5\xdb\x7f\xf6\xdf\x5c\x5c\x5e\xb7\xe7\xb9\x3d\xcf\xed\x79\xae\x71\x9e\x81\x4f\x6a\x9f\xe5\xa0\xff\x2c\x52\x09\x67\x8a\xcb\x95\x32\xaa\x9f\x51\x70\xd6\x39\x9f\xfc\x42\x8d\xc0\x97\x49\x50\x28\x8b\x18\xb9\x71\x91\x17\xd5\xdd\x60\xbb\x6d\x9d\x3e\xf9\xe8\xac\x47\x8c\xad\x6a\x30\x66\xe5\xb2\x54\x08\x60\xd1\xae\x95\xdb\xdb\x9d\xfe\x7a\x71\x76\x7e\x79\x7d\xf1\xfd\xc5\xf9\xdb\x47\x0d\x36\xa8\x59\xdc\xad\xca\x8d\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xa1\x3e\xec\x62\x22\x30\x1f\xaf\xc6\x8d\x7a\x36\x0d\x25\x70\x17\x3e\xd6\x32\xdb\x66\x99\x6d\x35\xf6\xa2\x46\x5d\x8f\xa6\xd0\xf7\x7b\x29\xd2\x86\x50\xf8\xca\xaa\xec\xde\xe4\xbd\x08\x9f\xf6\x5d\x09\x80\x0a\xeb\x71\xc2\x63\x51\x6f\xc0\x48\xa1\x69\xa6\x6b\x14\xff\x6f\xa4\x9c\x67\x33\x95\x2f\x6d\x9c\xc2\x6b\x9a\xfd\x04\xd3\xb7\x50\xb3\x7c\xc8\x8c\xab\x21\x81\xc8\x30\x3a\x72\x03\x53\xeb\x81\x3c\xf5\x2f\xab\x53\xe6\x64\x27\xab\xa1\xde\x40\x9d\x4a\xb5\x4d\x96\x31\xbd\x81\x1a\x81\x8b\x7e\xcc\x15\xf4\x34\x5b\x88\x72\x9a\xd9\xd3\x7a\xbb\x47\x9a\x2d\x61\xfa\x00\x65\x5b\xf7\xcb\xec\xde\xd1\x59\xbd\x71\x75\x05\x31\x31\x9c\x0b\x6e\x8f\x5c\xd0\x56\xd7\x68\xac\x5d\x8b\xb5\xea\x08\x23\x53\x8e\xfe\x80\xff\x21\xd7\x6f\xce\xde\x1c\x93\x93\x38\x76\xc1\xc3\xb9\x82\x61\x9e\xd8\x30\x60\xd5\x23\x34\x63\xbf\x80\x54\xd8\x3d\xed\x86\xf1\xb8\x43\x72\x16\x7f\x57\xa7\xe8\x92\x1d\x0d\xee\x82\xf0\x0e\x9b\x66\x77\xe2\xca\xf9\xe3\xca\xbc\x2b\x10\x11\x62\x33\x03\x11\x37\x7d\xfd\x15\x27\x64\x34\x04\x9a\xba\x8d\xe2\x88\xdd\xc2\x66\xe9\xea\x7e\x41\x58\x6d\x9c\x78\x28\x50\x15\x1f\x13\x95\x63\xa1\x18\x15\xba\xbb\x61\xbf\xd4\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\xb7\xf0\x23\xf6\x63\x57\xef\xf6\xf7\xbf\xfd\xe9\xfc\x9f\x7f\xdb\xdf\xff\xf0\x5b\xf9\x2a\xb2\x42\xd4\x9a\x67\x6e\x41\xff\x0e\x17\x31\x5c\xe2\x3b\xf0\x4f\x27\xae\x9d\x44\x91\xc8\xb9\x76\x17\x30\xab\xb7\x37\x16\x4a\x5f\xf4\xc3\x9f\x99\x88\x67\xff\x52\xb5\x2a\x89\xed\x24\x63\xc0\x2d\xaa\x91\x9d\x62\x47\x73\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xe8\x5c\x11\x8d\x21\xb5\xb5\x8c\xbe\xf7\x20\xc0\x0e\xb4\xbe\x7c\x00\xc7\x9c\x6b\x23\x99\x56\xcb\xca\xed\x4d\x5e\xd6\x6a\xd5\x6d\x47\x83\xa4\x2d\xec\x60\xc3\x00\x43\x88\x38\x68\xd9\x83\x1c\x18\xac\xd7\x52\x0a\x6f\xec\x49\xff\x82\x4c\x2c\x84\x77\x06\x38\xde\x0b\xf6\xfd\x83\xd2\xb8\xb2\xaf\xad\xa2\x21\x1e\xdb\x86\xad\xfe\xba\xcb\xb3\x57\xa1\xf4\x15\x18\xc5\xe6\xc0\xfe\xd8\x8b\xb2\xbc\xe3\x6e\xe8\xa5\x90\x0a\x39\x0d\x7f\x06\x1f\x5f\x57\x69\x21\xe9\x08\xf3\x32\xec\xe3\xf6\xb1\xf0\x97\x7d\xb0\xf2\x82\xf9\xa7\xad\x2a\x1c\xe5\xd2\x08\x0d\xc9\xd4\x53\xe4\x2d\xeb\x45\x14\x63\x07\x69\x9b\x07\xfd\x8e\x90\xb6\x80\x19\x75\xdb\xb2\xda\x51\x45\xc8\xc2\x51\x8f\x02\x67\x80\x22\xea\x93\x2e\xef\xb4\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\x6e\x5d\x39\xab\x18\x0d\x52\xb3\x98\x4d\x98\x12\x35\xb2\x4f\xc2\x44\xcb\x43\xea\x5d\xe9\x0b\x1b\x38\x14\xcc\x66\x77\x19\x16\x0b\x0a\xe7\x75\x86\xec\xbf\xac\xd3\x2f\xc8\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3e\x78\xff\xe5\xef\xdd\xc3\xef\x0e\x0e\xde\xbd\xe8\xfe\xe5\xc3\x97\x07\xef\x7b\xf8\x8f\x2f\x0e\xbf\x3b\xfc\xdd\xff\xf1\xe5\xe1\xe1\xc1\xc1\xbb\x9f\x5e\xff\x70\xdd\x3f\xff\xc0\x0e\x7f\x7f\xc7\xf3\xf4\xc6\xfe\xf5\xfb\xc1\x3b\x38\xff\xb0\xe6\x24\x87\x87\xdf\x7d\x5e\x7b\xe9\x0d\xd4\xee\xb4\xa3\xc9\x0a\x9e\xd5\x19\x1b\x41\xbf\x07\x2c\x5b\x6f\x87\x47\xaf\xa6\xcf\xbf\x8f\x1e\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xc7\xb0\xe4\xd8\x37\x95\x2a\x08\xec\x2b\x12\x54\x8b\xe7\xc6\xe7\x3e\x05\xe3\x4e\x68\x38\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\x15\x8e\xee\x0d\xec\x42\xef\xef\xbb\x81\x5a\x2d\x50\xed\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\x2e\xa1\xb6\x9e\x43\xad\xe7\x8f\x7a\xd1\xa9\xb1\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x91\xd9\x1e\x7c\x9c\xa0\x48\xbb\xb0\xaa\x8d\xab\xf0\x07\x13\xb3\x84\x50\x22\xba\x52\x0c\x12\x03\x1d\x31\xf4\xf4\x1f\x36\x12\xf4\xc6\x06\x87\x1a\x25\x8d\xf1\xa2\x8c\x66\x10\x0e\x8b\xda\xcb\x54\x29\x11\xd9\xa0\xd6\x90\x04\x80\x95\xdd\xdc\xb2\x71\x35\xd8\x06\x3e\x93\x10\x41\x0c\x3c\x02\x57\x97\xb9\xd2\x95\x92\x72\x72\xce\x27\xbe\x36\x75\xec\x53\x4a\x70\x25\x8b\xe7\x78\x5e\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x66\xc5\x50\x0c\x31\x2c\xac\xac\xdb\x35\xae\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\xcf\xc1\x19\x58\x9f\x7d\x7e\x72\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xbb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\x14\x93\x4c\x42\x06\xdc\x66\x09\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2d\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x48\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\xad\xb5\x82\x88\xbc\x31\xa2\x15\x69\x47\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\x7d\xea\xfd\x0b\x84\x46\x96\x27\x89\x4b\xcb\xed\x91\x37\x1c\x8f\xe4\x09\xf6\x41\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\xd6\xa2\x2f\x55\xce\x11\xb2\x32\x41\x51\x94\xab\x46\x18\xfa\xf2\x6d\xf9\x83\x4f\x98\xec\x3e\xd2\x36\x85\x66\x1f\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xeb\xf5\x09\x16\xa2\xc8\x84\xd2\x57\x46\x8b\x6d\xa6\x11\x4c\xdf\x4f\x87\xbd\x15\x68\x92\x40\x5c\xe9\x04\x64\x3b\x58\xd0\xaa\x16\x8d\xf9\xb8\xa1\xa1\x02\x90\x31\xe5\x71\x02\x12\x8b\xa2\xab\xd9\xca\x4f\xac\xe8\x02\x10\xfa\x36\xf8\x04\x4d\x1a\x45\x42\xc6\xae\x03\xab\x4b\x94\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\xa5\x75\xb1\xe0\xb2\x2a\x35\x7f\x18\x0b\x71\x43\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\xe8\x3d\x13\x50\xb4\x6b\x66\x57\x47\xa5\xb6\x34\xf8\x43\xbd\xae\x34\xb5\x84\x95\x26\x44\x15\xb8\x83\xa8\xb1\xbe\x75\xe7\x77\x10\x95\x1a\x2f\x9a\x2d\x71\x9d\x17\xb5\x40\xdb\x46\xfd\x7e\xba\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\xa1\x35\x9c\xd3\xd7\x95\x76\xaf\xc0\x12\xfd\x36\xab\x18\x33\xcf\x7c\xa9\xe9\xca\x61\xb0\x47\x6f\xae\x3a\x5b\x08\x36\xf6\x73\x61\xee\xb3\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\x8a\x13\x5f\x97\x9e\x64\x58\x8d\x2f\xc3\xd2\x76\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\x28\x00\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\x11\xe0\x60\xff\xf7\xfd\x0e\x01\x1d\x1d\x92\x5b\xc1\xf7\x35\x2e\x1f\xcb\x67\xe4\xaa\x34\xd1\x54\xe4\xd8\xa5\xce\x82\x20\xd4\xc2\x30\x14\x8b\x88\xdc\xb6\xb4\x19\x53\xed\xd3\xf0\xce\xef\x98\xf6\x6d\x1c\xc4\x90\xbc\xb0\x1d\x75\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\x53\x34\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\x1f\xb6\xef\xd4\x4a\xe6\x9a\x18\x5f\x5f\xf7\x7f\xa8\xf4\x6a\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x75\x25\x76\x80\x76\x34\xe3\xd0\xab\xd5\xb4\x95\x34\x48\xc2\xea\x36\x6f\x25\xf3\x4d\xa9\x37\xeb\xda\x4a\xfe\x29\x72\xec\x36\x47\x07\xc9\x94\xdc\x52\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x02\x8d\x41\x2a\xa4\x1e\x40\xb7\xae\x9f\xe5\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\xb3\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x67\x3e\x2a\x83\xad\xdc\x8d\x84\x71\x0b\x2c\xdb\x47\xb0\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\xdd\xb4\x91\x4c\xd8\x7a\xad\x3b\xc3\x65\xea\xb6\x16\x27\x8b\x73\x89\x25\xe1\xa1\x13\xec\xd3\x68\x2f\x4e\x9a\x0b\x53\x6c\x3a\x48\xb1\xd1\x10\xc5\x07\x0d\x50\xc4\xb4\x88\xda\x54\xa4\x6a\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\xad\xa2\x6a\x0e\x35\x47\x6d\x27\xce\x98\x8e\xb2\x2b\x11\xdd\x34\xa8\xd7\x9c\x41\x26\x21\xb2\x76\xb2\xeb\xd3\xbe\x9d\xdd\xe8\x97\x97\x6f\xae\x8b\x70\x7c\x8c\x59\x29\x0c\x97\x3f\x3a\x4b\x9a\xd1\x49\x6f\x20\xd3\x41\x75\x1f\xd0\xe8\xe6\x96\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x9e\xa2\x72\x2e\x01\x63\xfd\xb9\xb0\x41\x71\xb6\x48\xa2\xf0\xad\x4e\x43\x1f\xee\x60\xc3\x42\x0b\x99\x8b\x9e\x19\x52\x66\xf4\xf1\xd0\xcf\xd6\x46\xcd\x44\x59\x30\xe9\x95\x2d\xd3\xad\xf2\xe5\xc7\xce\x2a\x5f\xa5\x5e\xad\x9b\xea\x61\x75\x63\xf7\x76\x98\xd5\x39\x16\x27\x43\x2b\xb2\x96\xd5\x35\x34\xdf\xee\xb2\xba\x4c\xc2\x95\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x8f\x38\x07\x57\x2e\xf3\xa4\x7f\x11\xac\x5a\xa2\xe2\xd8\xb0\x51\x8b\xbe\x46\x66\xc2\x26\xc0\x41\xa9\x23\x74\x87\xe4\x99\x6b\xc7\xef\xba\xce\x76\xcc\xd7\x41\x8a\xab\xeb\x14\x99\x00\xae\xe7\x2d\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\x76\x5a\x6e\xf9\xb3\x6e\x94\x48\x52\x35\xb6\xfd\x60\xe1\x8e\x69\xd7\xd3\xb8\x6f\x6b\xe8\x96\xdb\xd2\x8e\x24\x8d\x80\x64\x20\x99\x30\xcc\x28\xe7\x3a\x16\xb7\x9c\x0c\x60\xc4\xb8\xf2\xa0\xc0\x2a\x98\x0e\x66\xe8\x8f\x61\x2a\x94\x4c\xeb\x91\xb7\x95\x82\x20\x2e\x55\x27\x12\xc5\xd1\x74\x6b\x9e\xf5\x24\x21\xc7\x42\x38\xd9\xee\x2a\x01\xc2\xe5\x86\x33\xf7\x2d\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\x11\x99\xd8\x2b\x9a\xfd\x07\xa4\x3a\x6c\xc0\xe3\x64\x5b\x26\xf9\x6b\x4b\xd7\x81\xe5\x47\x69\x34\xae\xe7\xc2\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x46\xbc\xa8\x30\x3a\x1a\xfb\x2c\xd3\x9e\xea\xd8\xff\x3f\x8e\xed\x7f\x47\x1c\x25\x0d\xd8\xfb\x5b\x5b\xff\xb3\xb3\xf5\x37\x63\x27\x6b\xc0\x46\x56\x9b\x26\x3b\x17\xf8\xf5\x58\x82\x1a\x8b\x64\x6b\x44\xaf\x20\xf9\x6b\xc6\x59\x9a\xa7\x06\xe7\x94\xc1\x67\x36\x09\xbe\x76\x55\x74\x27\x46\x17\xbc\x35\xd7\x99\x1b\x59\x0c\x58\x79\x93\xb2\xc4\x6c\x23\x26\x4a\x8e\xe9\xc4\xe0\xba\xca\xa3\x08\x00\xfb\x7a\x95\x55\x89\xaf\x7b\xe1\x4d\xa1\x8f\xc3\xcb\x7a\xf4\xa6\x1e\xb7\xb4\xb5\x31\x71\x96\xaf\xbf\xda\x6a\x8e\x91\xcc\x9a\xa1\xcb\x3f\xbc\xed\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\x7f\xc5\x9b\x8c\x54\xe4\xda\xc6\x62\xb7\xd2\x01\x68\x5a\x52\x22\x9c\xfc\xad\x6c\x9b\x62\xf3\x9c\x79\x2a\xa4\xb4\xf7\x6d\x20\x05\x50\x9d\x4b\x20\x23\xaa\x1f\x93\xe0\xd7\xd7\x15\x6a\xe9\x09\x4d\xf0\x9b\xba\xa2\x70\x55\x8e\x31\x02\x6f\xd5\xdc\x33\x42\xbc\xb0\xe5\xdc\xd7\x16\x78\x6b\x53\xca\xfa\x42\x68\xfd\xa3\x45\xb0\xde\x0a\x7e\x78\x63\x00\xde\x73\x7d\xb6\x3d\x3b\x2f\x6b\x1b\xbe\xc5\x91\x16\x24\x4b\x68\xd1\xa4\x08\x77\xe0\x47\xe4\x41\xa7\x63\x88\x6e\xde\x3a\x97\xe7\x81\x02\x08\xf1\x2a\x23\xa6\xc7\xf9\xa0\x17\x89\xf4\xc8\x90\x04\xfb\x7f\x83\x44\x0c\x8e\x52\xaa\x34\xc8\xa3\x58\x44\x8e\xc5\x75\x23\x33\x0b\xe3\xa3\x5e\x1a\x1f\x62\x1b\xdc\x8b\x6a\x53\xc4\x52\x29\x04\xf3\x7e\xa7\x0c\x92\x01\x18\xea\x2a\x50\xe1\x2f\xd5\x53\x33\xcb\xdb\xb8\x71\x6d\x79\xd4\x66\x49\x35\xdd\xcd\x1f\xdf\xd5\xdc\x52\x2e\xd2\x80\x65\xe3\xa9\xb9\x94\x1b\x0b\xad\x68\xc0\x95\xbc\x43\x6e\xe4\x9d\x11\x8d\x77\xc5\x75\xbc\x83\xa5\x8f\x1b\xf0\x74\x36\xe1\x2a\x6e\xce\x4d\xfc\x00\x15\x82\x1f\xc6\x3d\xdc\xa0\x0d\xad\x21\xb7\xf0\xc7\x70\x09\x37\xf2\xd5\x75\x5d\xc1\x1f\xcf\x0d\xdc\xcc\xe7\x36\xa9\x08\x3c\x55\xd7\x6f\x03\xb6\xf0\x26\xed\xe0\x8d\xd9\xc0\x1f\xcc\xd5\x5b\xdf\xcd\xbb\x03\x2e\xde\xda\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xf4\x0a\x22\xc1\xe3\xad\x39\xcc\x4c\xc9\xc8\x70\x7e\x94\x9d\xd6\xd9\xa9\xaa\x19\x0d\x63\xea\x2a\x63\x1b\x8d\xca\x66\x70\x78\xff\x84\x13\x28\xd0\xb5\x60\x57\xb9\x4d\xd1\xb9\x5b\x21\x6f\x12\x41\x63\x75\x94\x09\xfb\x7f\x45\xbe\x42\x29\x51\xc1\xbe\xab\x5e\xa6\xc2\x63\x1b\xc4\x6c\x7a\x47\x93\x9b\xf8\xa3\xb8\x25\x62\xa8\x81\x93\x03\xc6\xfd\x3e\x1e\x96\xd4\xc0\xc2\x3a\x19\xd0\xda\x5c\x7d\xf9\xc2\xdf\xfc\xfc\xcc\x8e\x68\x60\x55\xea\xe1\xad\xc0\xee\x45\xf7\x9b\x81\xdd\x8d\xc3\x3c\xa9\x9a\x82\xad\x79\xb8\x4a\x6f\x5e\x16\xb5\x7d\x5f\xe2\xbc\xe1\xb4\x51\x1e\x13\x97\xf2\xf5\xfc\x36\xad\x76\x00\x4b\x55\xf4\x0b\x01\x2b\xf7\x59\x8d\xaf\x4f\xfb\xd6\x68\xdc\x9a\x4b\x76\xc5\x5c\xf2\x48\x41\x20\x3b\x28\xe8\x3e\xd1\xc0\x8f\x56\xd0\xdd\x60\x94\x92\x40\x7f\x90\x34\x82\x7e\xe3\x32\x82\x3f\x4e\x24\xce\x25\x75\x04\x30\x88\x7c\xfe\xf0\x70\x80\xd8\x9e\xa6\x90\x38\x8b\x29\xa9\xc3\x3c\x49\xa6\x24\xcf\x04\xaf\xa6\x19\x5b\x5f\xfb\x6c\xd6\x2a\x9a\xe4\x17\xbc\xa5\x10\x2c\x33\x29\x1c\xcf\x94\x39\xe7\x86\x06\x17\x0d\xba\x50\x90\xc4\xaa\xc6\xb4\x92\x1b\xab\xd8\xc8\x2c\xdf\xf0\x3f\x4c\x9b\x2d\x22\xfd\x2a\x13\x9a\xa7\x87\x42\x46\x6c\x90\x4c\xc9\x98\x26\xa1\x1b\x0b\x25\x37\x2c\x49\xdc\x34\x3d\x72\x05\xda\xba\x14\x2c\xef\x4c\x04\x1f\xe1\xe2\x28\xf7\x5d\x00\x21\x32\xcf\x46\x09\x50\x9e\x67\xf6\x7d\x86\x13\x4f\x45\x2e\xfd\xfb\x7a\xc1\x31\x51\x74\xdd\x67\x49\xa7\xd4\x6b\x6c\xe5\xc6\x86\xfe\x34\xb9\x32\x02\xc0\x1b\x5f\xc5\xb9\x53\x9e\x53\x4c\x40\x4a\x16\x3b\x3b\xbf\xfd\x2d\x93\x62\xc2\x62\xeb\xdd\xf0\x60\xc3\xae\xc6\xb6\x9b\x4c\x38\xcf\x5c\xf0\x2e\x87\x11\x45\x41\xc5\x9d\x22\xbb\x67\x76\x1e\x1b\x41\xc0\x63\xec\x2f\x63\x24\x7c\x91\x55\xf2\xd6\x27\xcc\x76\xc6\x2d\x41\x8e\x1c\x70\x41\x04\x06\x7e\xe6\x9c\x69\xdb\x6d\x7d\x9c\x6b\x12\x8b\x5b\x7e\xb8\x91\xd7\x15\x1d\xad\xd7\x0b\x01\x54\x75\xbf\x2e\x92\x73\xec\xf7\xae\x06\x2f\x53\xce\xf4\x39\x24\x39\x57\x50\x93\xbd\x37\x26\x1c\x7d\xf3\xc7\xed\x68\x04\x4b\x41\xe4\xfa\xa3\x68\x7f\xb7\x63\x16\x8d\xcb\xc2\x2c\x4b\x41\x11\x91\xcf\xa8\xc5\x2f\xdd\x63\x8b\x77\xa8\x55\x01\x17\x8d\x6d\x0d\xbb\x0b\xac\x5f\xae\x61\xe9\x7c\xfc\x5e\xa9\x21\x33\x86\x66\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\xdc\xf9\xe4\x65\xa6\x9f\x73\xf6\xef\x1c\x08\x4d\x85\x91\x85\x93\x72\x18\x60\x07\x35\xfa\xd2\x0f\x78\x92\x9b\x0d\x18\xdc\x92\x21\x63\xf7\xf8\xfa\x61\x91\xd8\x83\xfe\xe1\xa3\x22\x1f\xbb\xab\x56\x11\xdc\x62\xe4\xc6\x52\x57\x2d\x4a\x38\x68\x73\xf2\xac\x44\x69\xbb\xac\x31\x3e\x4a\xca\xc2\xe4\x76\xe4\xaa\xae\x4e\x54\x57\x23\xea\x16\x5f\xd0\xdf\x56\x31\x6a\xa4\xbb\x57\xb1\x86\x86\x7a\xe2\x14\x54\xdb\xab\x01\xb6\x69\xb1\x57\x03\xac\xe8\x71\xd1\x27\x34\x8e\x25\x8a\x29\x78\xea\xd3\x99\xde\x98\x59\x11\x4b\xd3\x21\x2f\xc8\xb7\xe4\x8e\x7c\x8b\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x63\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\x9d\x06\x69\xc4\x22\xb7\x13\x8f\xda\x7b\xc9\x2c\xf0\x23\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xf9\xac\xdf\x21\xd7\xa7\x7d\x6c\xea\x73\x75\x7a\xdd\xaf\x4a\xd8\x7b\xd7\xa7\xfd\xbd\x47\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\x37\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\x3c\x2f\xd7\x6d\x9b\xe6\xf3\x89\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\xef\x9d\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x2c\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x5c\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xe9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\x3c\x07\x15\xd0\xf7\x5c\xad\x9f\xa3\xf2\xd6\xcf\xb4\x7e\x58\x1f\x39\x5f\xf0\x2b\x5a\x42\x54\x66\x26\x91\xc5\x94\x89\x04\x1a\x4f\x71\x4a\xec\xf3\x50\x12\xb2\x9e\x60\x74\x60\xc2\x52\xb6\x5d\x5a\x10\x99\x3b\x34\xaf\x70\xae\x92\xd7\xc5\x80\x25\xa5\x77\x78\x00\x68\x2a\x72\xdb\xfa\x35\x12\x69\x96\xeb\x2a\x4c\x71\x7b\xb6\xe9\xda\x3a\x64\x23\xc7\x51\x8f\x6c\x83\xd9\x6e\x98\xb6\x5b\x6a\xea\xfa\x88\xad\x5a\x69\xec\xa3\xe6\xfa\x4d\x04\x8d\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x41\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\x70\xff\x68\x69\xc3\x73\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xdd\x56\xf6\x93\x65\x06\xa4\xab\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x73\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc8\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x76\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\xff\x7f\xf6\xde\xc7\x3b\x6e\xdb\xf8\x17\xfd\x57\x70\xd4\x9e\x2b\xa9\xd9\x5d\xd9\x49\xdb\x6f\xea\xdb\xd7\x1c\x55\x92\x13\xbd\xd8\xb2\xae\x25\x27\xb7\x2f\xce\x37\xc5\x92\xd8\x5d\x54\x24\xc0\x12\xa0\xe4\xed\xcd\xfd\xdf\xdf\xc1\xcc\x00\x04\xb9\x2b\x5b\x22\x69\xaf\xe4\x2c\x7b\x4e\x63\xed\x72\x41\x70\x00\xcc\xef\xf9\x4c\x6d\xcf\x83\xf9\x3a\xd5\x3a\xa3\x6a\x84\x6c\x59\x8f\x2f\xd1\xf5\xa6\xf4\x2f\x4a\xdc\xfc\xe2\x46\x33\x6c\x96\xf1\x79\x30\xe3\x8d\xb0\x2b\x9e\xb8\x7a\xe8\x5b\x5f\x00\x52\xfd\x2b\xc1\x78\x76\xc3\x97\xa6\x76\x6a\xd4\x63\x48\xf3\x8c\x3d\xdd\x87\x8d\xc7\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xcd\x1d\x1d\x9e\xff\x72\xf1\x8f\x8b\x5f\x0e\x8f\x5f\x9e\x9e\xb1\x33\x6d\x05\x8a\xa4\xa8\x49\x5a\xc2\x95\xb3\x10\x68\x96\xf0\x0c\xb0\xa0\xb5\x99\x80\x5f\x51\x1a\x76\x23\x55\xaa\x6f\x4c\x67\xff\x29\x6e\x3f\x47\x3c\xc1\x55\xa7\x31\x12\x5e\x70\xe8\xfd\xd6\x43\x3e\xac\x64\x7f\xc4\x83\x82\x04\x4e\xd3\x83\xb4\xd4\x05\x12\xc1\x3b\xa0\x62\x23\xe9\xb8\xe5\x57\xf6\xf9\xa5\xb0\xbe\xb3\xe6\x80\xf3\x92\x2b\x5b\x7b\x62\xea\x35\xa3\xa6\x73\x93\xde\xcb\xf1\xb8\xab\x8d\x78\x3a\x5c\xa5\xd1\x61\x9a\x8a\xb4\x41\xfe\xcf\x2e\xab\xef\xc8\xbf\xdc\xb2\x06\x63\x60\xe7\xaf\x2e\x4e\xff\x77\x6b\x1f\x2f\x8b\x7e\x49\x4c\xc3\x14\x80\x96\xba\x18\x6c\x75\x5f\x8b\x5c\x5f\x6f\xd7\xf7\xa1\xac\x6f\x90\x96\xc3\x84\xce\x5f\x57\x2a\x16\x68\x2a\x1a\x9f\xe5\x3a\x15\x13\x76\x1e\x7c\xf8\xcd\x6f\x63\x90\x99\x52\x30\x77\x8b\xb2\x92\x67\xd9\x32\x56\xa6\xac\xc6\x0a\xc1\x06\x04\x41\xcc\xc8\x67\x3c\x33\x9b\xe6\xc6\x7d\x64\xa3\xd3\x23\x5e\x3a\x6b\x76\x90\xe5\x08\xa3\xb1\x54\x28\x6d\x49\x19\x76\xb3\x04\x58\x87\x52\x27\x0c\x4d\xe7\x28\x51\xaa\x21\xdf\x0c\xc6\x11\xbc\x68\x94\xc6\x13\xfb\x3c\x8c\x8c\x4e\xe4\xca\x08\xb3\x5e\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x89\xeb\x20\x3b\xe0\x47\xd2\x96\x81\x20\xcd\x4c\x2f\x0e\xcf\x1d\xc3\x6a\xc0\xa1\x8a\xab\x6b\x8f\xeb\x15\x7f\xec\x47\xaa\xac\xd4\xa1\xf9\xb6\xd4\x55\x67\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xac\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\x9f\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x1d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0d\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\xb6\xce\x99\x56\xee\x60\x0e\xb2\x79\x4e\x43\x14\x96\x48\x1a\x6f\x15\x88\xe7\x92\xf5\xc7\x21\xaa\x0b\xc7\xb2\x32\xa2\xc4\x10\x74\x59\x09\x5c\xc9\xef\xab\xa9\xc8\x1c\xe5\x9d\x49\x4a\x1d\xb3\xd1\xf1\x20\x73\x3e\x17\x8c\xdb\xb0\xd3\xac\x66\x42\x19\xc7\x31\xd1\x7d\x69\x59\xaa\x45\x5d\x19\xcf\x0d\x7b\x73\x7a\xcc\x9e\xb0\x3d\xf7\xac\x7d\xd8\x3f\xd0\x50\xdb\x6a\x4c\x40\x6b\xdb\xa8\x33\x3f\x04\x4c\x09\x36\x2f\xd3\x25\x32\x89\x11\x53\x9a\x99\x2a\x59\xc4\x5d\xbc\xbd\xd9\x4c\x49\x8a\x10\x18\x79\x98\x7b\x7d\xb3\x1c\xea\x8d\x11\xe5\x60\x0c\xea\x4d\x07\x06\x15\xab\x51\x6e\xcf\x35\xa9\x87\x1b\x2b\x17\x96\xa7\xdc\x72\x62\x5c\xa1\xab\xfa\x43\x5d\xd2\xdf\x36\xfb\x32\xe2\x85\x54\xd5\x3b\x74\x91\x0e\xe7\x6a\xb9\x38\x81\x61\x61\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\xa7\x8d\xbd\x32\xba\x45\x4d\x04\x3e\xe1\xe3\xd0\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x20\xe8\xcd\x93\x45\xfc\x80\xed\xee\x6b\x5e\x0f\xc4\x29\x94\x89\x6b\xd1\x03\x42\xab\xb5\xf3\x5e\xb8\xd1\x1c\x71\xfc\x8e\x80\xe1\x59\xc6\xa7\x22\x43\x1a\xe3\x0e\x34\xab\x3b\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x0f\x51\xcf\xda\x74\x70\x7a\x43\x93\x0e\x20\xbc\x1f\x3a\x1d\x8c\x48\x12\x9d\x17\xe7\xa5\x76\x66\xe7\x60\xb2\x89\x86\xad\xe3\x7c\xe8\xd8\x00\xbf\x7d\x6c\x01\x53\x54\xaf\x79\x33\x2f\xa3\xa4\x4b\x6e\x51\x48\xf8\xcc\xcb\xff\x11\xc9\x2c\x60\x3d\x6d\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\xc7\x2c\x0e\x86\xa8\x5b\xe8\xe1\xec\x1c\x44\x1a\xe9\x84\x67\x00\x91\xda\x6f\xcb\xb1\xf6\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc4\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x32\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x62\x02\x57\x68\x41\xee\xc2\x91\xf0\x83\xfa\xf3\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\xc8\x6e\xa5\x61\x3b\x2f\x3c\x01\x7a\x20\x55\x3e\x44\x09\xb3\x83\x6f\x18\x56\x13\x3d\x9d\x57\x52\xa5\x94\x4a\xdb\x20\x96\xb7\x73\x49\x0f\x86\x24\x6d\x99\xc6\xbc\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\xde\x1e\xaf\x51\x65\xf6\x3e\xba\xf1\xfb\x1d\xaf\xe1\x21\xed\x61\xde\x28\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\xe2\x7e\x43\x5b\x31\x3f\xe2\xb0\x5e\xa5\x4f\xdc\xb6\xb6\x52\xcd\x4d\x6c\xc9\x34\xf1\xf0\xd7\x9b\x32\x7e\x85\x67\xa5\xc6\x12\xcc\x55\x13\xa2\x55\x02\xf0\x58\xcc\x90\xcc\xa9\x13\x8f\xdc\x08\x99\xe7\x86\x1f\x95\x8e\x12\x56\xf2\xec\xa2\xe8\x0e\x1f\xca\x56\xa0\xea\x5e\x5e\x1c\x36\x87\x06\x61\xbd\x10\x25\xca\x7e\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\x6b\xb0\xb2\xa2\x2c\x2b\x23\xe7\xe6\x80\xf6\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\x4c\x26\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\x9e\x99\x92\x15\x56\xa7\x89\x80\xcc\x6e\x17\x6c\x9c\x61\xaf\x2e\xcf\x59\x4f\x48\x94\x0f\x2c\xd1\x19\xed\xed\x36\xea\xd9\x5a\x3a\xa2\xf6\xb8\x71\x22\x91\x72\x91\x08\x33\x1c\xd8\xd2\x77\xf5\x98\x2c\x15\x58\x61\x23\x20\xfb\x89\xdf\x9a\x0e\x07\x7e\xe9\x5d\x28\xd4\xa4\x9f\xee\xc6\x1a\xf5\x65\xcd\x5c\x9c\x3d\x92\x15\x0b\x3e\x46\x23\xdd\x71\x34\x60\x81\x5e\x85\x58\x68\xa5\x4b\xdc\xa2\x4e\x88\x6a\x05\x5b\x1a\x58\x14\x46\xf3\x60\x4d\x88\x45\x47\x53\x3d\xaa\xa3\xc4\x71\x20\x10\x0a\xbd\x10\xdb\xa1\x9e\xc3\x8d\xb4\x0b\xc0\x60\x5d\xb4\xa2\x86\x30\x93\x52\x18\x08\xc0\x28\x26\xca\x52\x97\x94\x90\xe5\xfd\xd6\x30\x12\x70\x72\xc8\xe8\x72\x9b\x84\xbb\xbf\x76\x4d\x1c\xa8\xae\x11\xcf\x21\xc7\xd0\xed\x26\x31\x9b\x89\x04\x14\xad\x98\xc0\xc8\xb5\xf7\x6a\x50\x5a\x5f\xc2\x61\xb5\x47\x4c\xcf\xe5\x3b\xf7\x94\xf8\x57\xad\xbe\x2b\x4a\xab\xf1\xfa\xaf\xf7\x27\x8c\x9d\xaa\x90\x7f\x3b\x72\xab\x18\xdf\xe9\x53\xcf\xac\x7b\xc5\x18\x6e\x1f\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\x74\xb0\xc5\x40\xbf\xdb\xb5\xc5\x40\xbf\xe3\xb5\xc5\x40\xdf\x62\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x81\xfe\x79\xe1\xda\x6c\x31\xd0\x37\xed\x62\xde\x62\xa0\x6f\x31\xd0\xdf\x77\x6d\x31\xd0\x3f\x70\x6d\x31\xd0\x3b\x5c\x9f\x01\xe7\xda\x62\xa0\x77\xb8\xb6\x18\xe8\xeb\xaf\x2d\x06\xfa\xea\xb5\xc5\x40\xbf\xf5\xda\x62\xa0\x77\xbe\xb6\x18\xe8\x5b\x0c\xf4\x2d\x34\xe4\xfd\xc6\x7a\x98\xd0\x90\x6c\x8b\x81\x4e\xd7\x16\x03\xfd\xb3\x00\xc0\x63\x5b\x0c\xf4\x3b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\xb9\xb8\x4b\xb6\x18\xe8\x5b\x0c\xf4\xdf\x8e\xa2\xbb\xc5\x40\xdf\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\xef\x9d\xc5\x16\x03\xfd\x73\x30\x01\x8d\x4d\x65\x27\x58\xc8\xbb\x20\xd8\x50\x66\x72\x54\x30\x3e\xad\x66\x33\x51\x02\xe7\x82\x27\xaf\x24\x4f\xd5\x60\x7d\xed\x20\xab\xb0\x23\x00\xc3\xa1\x22\x8e\x5b\x7e\x4e\x15\xea\x00\xdf\x58\xa7\x0f\x9f\xbc\x7a\xbe\x06\x2e\xa7\x73\x56\x61\xd7\xc4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x15\x15\x11\xdd\x93\x4c\x1b\x4a\x7b\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa2\x4c\x9f\x18\x5b\x0a\x9e\xfb\x64\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb2\x40\x41\x15\x88\x01\x59\x71\x75\x5e\xf3\xa8\x7e\x1a\x4d\x4b\xc7\x78\x65\x60\x6d\x8e\x00\xe2\x39\x2f\xec\x92\xb9\x57\xce\x08\xf6\xb5\x34\x96\x25\x99\x04\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\x65\xb5\xa2\x99\x1a\x9a\xaa\x4a\x41\x6d\x2d\xac\x61\x90\x06\x5c\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\x30\x2d\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\x40\x44\xdd\xde\x44\x07\x56\xbd\xd1\x21\xef\xdd\x6f\xce\x51\x23\xc5\xbf\x56\x28\x20\x4b\x6f\xe5\x18\xc0\x02\x28\x71\xed\xf6\x80\x48\x84\x93\xaf\xfc\x96\x5d\xff\xc9\x37\xbd\xe5\xe5\x5c\xd8\x90\xcf\xd4\x35\x57\xbc\x99\x16\x12\xc3\xfd\xc6\x86\x48\x4d\x32\xa0\xce\xb9\x4e\xa1\xe4\xa7\xae\xab\x5a\x87\x27\x8c\x33\x24\x18\xb5\x75\x37\x78\xc5\x08\x53\x34\xc3\x43\x4d\xc1\x13\x61\xd8\xde\xe9\xf9\xd1\x88\x9d\x9f\x1e\x53\x1e\xa6\x9e\xad\xab\x63\x26\x1e\x86\x3b\xf0\x36\x64\xe3\x80\xd0\x16\x0d\x1f\xd5\x7e\xd2\xb3\xcf\x83\x7e\xf5\x56\x51\x7a\x69\x9b\x03\x80\xca\x15\xd0\xcd\x99\xa9\x40\x45\x22\x9f\x90\x0c\x85\x19\xb4\xf9\x44\x5d\x8e\xe8\x71\x87\xfc\x2f\xc2\x44\x88\x4a\x54\x75\xe1\x63\xdd\xc0\x60\x41\x5e\xaf\x94\x76\x40\x2a\x28\xe5\xbd\x74\xca\x77\xe9\x65\x21\x45\xaa\xd8\x4b\x61\x0c\x9f\x8b\xf3\x8e\xe1\xad\xdb\xfc\x00\x10\xe1\xaa\xd9\x01\x30\xa0\x0c\x0b\x7d\xc3\x27\x75\x4e\x70\x53\xf9\x66\x39\xce\x29\xec\xac\x9b\x52\x5a\x2b\x80\x95\x00\xd8\x1f\x2c\x76\x1b\x0b\x60\xb7\x95\x59\xfc\xd2\x0f\x52\xff\xd8\xa9\x12\x2a\xc5\x3c\xdf\xa9\x60\xd3\x52\x8a\x19\x9b\x49\x48\x1e\x86\x74\xde\x11\x62\x3f\x71\xf4\x3d\x19\x23\x4a\x98\x0f\x59\x50\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\xc2\xa6\x23\xa4\xdc\x43\xb1\xab\x9c\xb1\x39\xa4\x03\x93\x8d\xf2\xc7\x27\x7f\xf9\x33\x9b\x2e\x9d\x22\x05\x1b\xd2\x6a\xcb\xb3\xf0\x92\x99\x50\x73\x47\x2b\x14\x0a\xcd\x72\xcd\x40\x01\x68\x0b\x82\x13\x7f\xfa\xe5\xd5\xb4\xa9\xd9\x1d\xa4\xe2\xfa\x20\xa2\xdf\x38\xd3\xf3\x09\x3b\x0a\xd5\x91\x55\x91\x82\x9f\xbf\x3b\x54\xf7\x70\xdb\x4c\x67\x32\x59\xf6\xde\x68\x1e\x84\x8c\x2d\xf4\x0d\x5a\x98\x6b\x76\x4f\x5d\xf9\x55\xe8\xa2\xca\x30\xd4\xf1\x3c\x14\x3a\x57\x46\xac\x96\x23\xae\x3d\x17\xe0\x9c\xa7\x21\x5a\x7c\x94\xb2\xc0\xfd\x23\x35\x95\xb9\x90\xfb\x38\x60\x91\x01\x33\x79\xce\xb3\x6c\xca\x93\xab\x4b\xfd\x42\xcf\xcd\x2b\x75\x52\x96\xba\x6c\xce\x25\xe3\x4e\x46\x2f\x2a\x75\x85\xad\x20\x02\x5a\x83\x9e\x3b\x85\xbe\xa8\xac\x07\xf7\x5e\xf7\xc2\x58\xba\xef\x45\xbf\x37\xbe\xeb\x51\xc4\x3b\x59\x5b\xd8\x54\x35\x86\x3b\x32\x1e\xdf\xc4\x9b\xed\xcb\x27\x7f\xfc\x1a\xb7\x2e\xd3\x25\xfb\xfa\x09\x54\x0a\x98\x11\x1e\x62\x90\xa8\x4e\x3d\xc9\x79\x96\x39\x46\x1e\x6f\x4a\x47\xe8\x75\x9b\xf0\x93\xef\x41\xdb\x7f\xbb\xdd\x59\x81\xbf\xbc\xfc\x07\x48\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\xc4\x7d\xa0\x4a\xed\x01\xa8\xdd\xd7\x3a\xab\x72\x71\x2c\xae\xe5\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\xc8\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x94\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x1d\x66\xc9\x6f\x1a\xc4\x80\x33\x09\xc8\x09\x3d\xa1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x8e\x6f\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\xc6\x86\xa8\x07\xf4\xa7\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\xc3\xc6\x40\x05\xc0\x6d\x1f\x60\xc9\xdd\xdd\xfc\x03\xf8\xd4\xfb\x25\xba\x35\xe8\xa2\x42\x2c\x23\xe7\x96\x14\x42\x6f\xab\x70\x56\x88\xd2\x48\xe3\xe4\xf2\x0f\x70\xa0\x8e\x32\x2e\xf3\xc8\xf1\xbc\x19\x22\xe0\xe1\x06\x24\xe7\xfe\x9c\xd2\xd9\x29\x38\x20\xb0\x42\x44\xb1\x5e\xa3\xd6\x36\xb5\xda\x8b\x6a\x0a\xfb\x07\x6e\xbf\x4f\x43\xbd\x01\x25\xf1\xa6\x79\xec\x0f\xf5\x32\x34\x59\xac\xfb\x24\xf0\x58\xbc\xeb\x73\xe2\xac\xf0\x7e\x8f\x95\xb1\x86\xc9\x0f\xc4\x3f\x80\xa3\xd2\xe2\x36\x59\x68\xc3\xea\xc4\x13\x16\xd9\x02\x64\x40\x4e\x18\x26\x6d\xb8\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x5d\x91\x44\xa5\x2e\xf8\xbc\x57\x3f\xa2\x16\xa5\xda\xc3\xc6\x60\x19\xce\x7e\x8a\x58\x49\x41\x77\x39\x4e\xe2\xb1\x80\x00\xe9\x09\x83\xf9\x9e\xc0\x64\x59\x40\xbf\x38\x76\xc3\x97\x8c\x97\xba\x52\x29\xb9\x43\x83\x3f\xfa\x65\xeb\xc1\x67\x5a\x09\x1f\xe7\x69\x63\x6d\x40\x00\x4a\x2a\xf6\x74\xf2\xf4\xc9\xe7\x22\xe2\xe0\x0d\x5b\x22\xee\x2c\x88\x38\xe4\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x24\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x53\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x11\xf9\x16\x31\x28\x38\x6e\xeb\x5c\x63\xe6\x3d\x2c\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\x5b\x8b\x88\x76\xf2\xae\xe8\x81\x13\xda\x82\x7a\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x70\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\x90\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xbb\xbe\xf8\x59\x56\xc6\x43\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x02\xcf\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x6b\x99\x77\x49\x56\x19\x79\xbd\x29\x4e\x42\x80\x10\xc7\xb2\xd3\x3a\xb7\xc0\x29\x6a\x42\xad\xe0\x4c\xd4\x61\x82\x0f\xc0\x70\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\x39\xb1\x7b\x98\x49\x6e\xee\xab\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\xd3\x73\x8a\xa0\x79\xba\x49\xf5\x2f\x4c\xac\x09\x66\x09\x26\xca\xe0\x4f\xd0\xdd\x38\x63\x11\x28\x90\x4f\x28\x01\xe6\x0f\x48\x54\x60\x91\x28\xad\xc6\x8b\x08\xb4\xa9\xd0\xe9\x3d\x8b\xfc\xba\x1a\x1e\x9d\x4c\x8e\xf5\x14\x64\x0b\x9d\xa5\xbe\x87\x36\xfa\x72\xa6\xc2\xde\x08\xa1\xd8\xe9\x39\xd0\xcf\xbd\x22\x44\x84\x6e\xa1\x22\x86\x15\x00\x9e\x29\x32\x65\x1b\xf4\xbc\xef\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\x3e\xf3\xdf\x05\x9a\xf9\x8c\x6c\x3e\xd5\xd7\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x62\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xa3\x0a\x1b\xef\x13\x73\xb0\xd3\xf3\xa3\x1e\xdc\x6b\xf7\x0d\xc5\x45\xdc\x50\xbb\xbb\x86\xc9\x22\xa9\x63\xae\x13\x56\x87\x1b\xa3\x42\x09\xd4\x18\xef\x17\xeb\xea\xaa\x26\x46\x4c\xad\x27\x93\x66\x0a\x87\x71\x6c\x85\x8a\xa4\xc9\x9d\x03\x41\x87\x42\xa7\xd0\x7f\xa9\xa6\x86\xf1\xbf\x88\x09\xe2\x93\x25\x90\xc9\x53\xea\xc8\x28\x24\x21\xb7\x18\x13\xb8\xde\x7d\xfa\x61\xc4\xc5\x57\x88\xf9\xc9\x68\x79\x7e\x7a\x3c\xe4\x76\x29\x64\xfa\xe0\xb6\xcb\x1b\x73\xef\x62\xfb\xf7\xbf\x24\x20\xf7\x7d\xe8\x2d\x31\xd8\x44\x60\x7c\xf4\x37\xa4\xa9\x6b\xcb\xa8\xbb\x63\xc8\x84\x5d\x97\xd0\x01\x5c\xa4\xf9\xa4\x91\xfb\x7b\x56\x65\xb0\x49\xeb\xe4\xde\x90\x99\xcc\x43\x5e\x28\x68\x03\xfc\x9a\xcb\x0c\x71\x31\xf5\xed\x43\xfa\xf0\x7b\xa6\x79\x8a\xe5\x1e\x57\xa2\x54\x22\x63\xb9\x4e\xab\x0c\xbd\x79\xa1\x8b\xf0\xcb\x57\xc7\x6f\x5e\x9c\xf8\x24\x2c\x51\x2f\xe7\x88\x71\xa6\xc4\x0d\x8c\xae\x40\x21\x49\x08\x9e\x2b\x94\xfd\xb8\xf3\xe4\x11\x37\xd1\x0c\x45\xc7\x84\x7f\xa1\x5c\x5a\x39\x47\x18\xcd\x5a\x2d\x9c\x96\x82\x5f\xe9\xca\xb2\xeb\x2a\x53\xa2\xac\xbb\x60\x8a\x6b\xa1\xd0\x07\xeb\x7e\xe0\x1e\x1b\x23\x32\xca\xb2\x01\x84\x49\xf0\x68\x1e\xdc\x93\x27\xa4\xc9\x53\x89\x11\x7c\x19\xb5\x80\x6e\x34\x8a\x7c\x3f\x40\xa9\xd7\xbc\x22\x6c\x52\x2c\x27\x5e\x05\x26\xf5\x18\x92\x98\x46\x73\xe1\x33\x60\x28\xf1\xe5\xd3\x1d\x87\xfb\xbb\x5b\x9a\x15\xa2\x4d\x60\x15\x1a\xd0\xcb\xbe\x73\x9d\xde\x62\x35\xd4\x7a\x17\xdc\x1f\x37\xc6\xb6\x9a\x71\x86\xee\xf6\xb1\x07\xa6\x81\x4c\xd9\x2e\x6c\xf0\xde\x42\x13\x2c\x8f\xf3\x2a\xcb\x2e\x44\x52\x8a\xfb\x86\x19\x9a\x9c\xe2\xb4\x35\xd6\x6d\x16\x40\x64\xce\x02\x5a\x07\xdd\xac\x6a\x4c\xd8\x28\xcf\xa9\xae\xc5\x2d\xaa\x0c\x52\xc3\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xd3\x95\xc6\x67\x99\x21\xf7\x69\xac\x82\x11\xe1\x61\xa1\xc5\x1a\x37\x06\x33\x0f\xa4\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\xc0\x28\xa3\x84\x2d\x4e\x68\xe5\x78\x96\x73\x8f\x71\x7c\xdf\x1c\xe6\xfa\x4c\x1e\xe0\xbc\x7f\x87\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\xdb\xe6\x91\xd8\x2d\x80\xd2\xff\x0a\x0c\x83\xd7\x7e\x7d\x3d\x1b\x32\x4c\x28\x5d\xcd\x17\x40\xac\x32\xe7\x1e\x30\x33\x13\x16\xb0\x10\x29\x9f\x01\x93\xd8\xe8\xb7\x29\x59\x19\x31\x36\x64\x73\x6f\x3c\x12\xdb\xa5\xab\x83\xb7\x95\x8c\x1f\xb1\x19\xa2\x91\xbd\xf7\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x34\xbf\xb1\x93\x09\x63\xa4\x88\x39\x00\xc2\x1e\xfc\x0e\xad\xa3\xcb\x57\xc7\xaf\xa0\xb1\x38\x79\xdd\xbd\xa8\x72\xa2\xc0\x4c\x18\x2f\xe4\x0f\xa2\x34\x00\x9d\x7c\x25\x55\x3a\x62\x95\x4c\xbf\xf9\x84\x09\x5f\x52\xc9\x3a\x8b\xb5\x17\xd7\x7a\x41\x5c\x89\xaa\xe8\xe5\x7f\x70\x7b\x46\x12\x74\x2a\x32\xad\xe6\x11\x06\x00\x48\xf3\x53\x25\xed\x4a\x0f\x66\xc4\x33\x05\x0f\x8f\x2e\x53\xc8\x15\x96\xba\x6c\x84\x33\xdc\x78\x80\xf2\x18\x65\x1c\x3b\x96\x26\x1b\xe3\x41\x1a\x97\xa9\x75\x24\x4c\x04\xf2\xe5\xc2\x1e\x04\xdb\xa3\x47\xa2\x2c\x5e\x70\x95\xc2\x9f\x49\xa2\xcb\x94\xe6\x2b\x6d\x48\x6f\xc6\x64\x38\xcc\xc0\x02\x31\xe4\x38\x1a\x57\xed\x27\x83\x9a\x56\xe6\x8d\x54\x58\xaf\xb5\x57\x4a\xfe\xbb\x12\x8c\xe7\xda\x31\xe2\x76\xab\x87\x16\x45\x72\xbe\x04\x59\x08\x53\x7d\xe1\xcb\x35\xa8\xc6\xd6\x8c\xd8\x6b\xe1\x94\xae\x1a\x26\x60\xc4\x5e\x34\x71\x03\x46\x6e\x2e\x17\x58\xd0\x4c\x1f\xe1\xec\x4b\x61\x74\x55\x26\xe2\x35\xc6\x38\x73\x9f\x4f\xb7\xfa\x32\x6e\x55\x2c\xbf\x12\x0a\x7d\x4a\x8e\x34\x10\xc6\xad\x4a\x58\x83\x64\x21\xd2\x0a\xa4\xca\x74\xc9\x66\x12\xfb\xbf\x80\x68\x97\xf3\x85\x30\xd6\xdb\x46\x07\x90\xa3\x56\xb7\xd2\xf3\x13\x80\xed\x1b\x25\xb3\xd7\x5e\xd8\x9c\x03\x3a\x39\x1c\x59\x6e\x7d\xbd\x16\x6a\x83\xa6\xca\xfd\x59\x6e\x53\xda\x4c\xd8\x0b\xf7\x28\xdc\x4f\x51\x5f\x0d\xd9\x22\x2e\xc4\x98\xc9\x8d\xcc\x66\xdc\x2c\xa0\xeb\x4c\x7b\x09\xa8\x65\x45\x52\x95\x8e\x61\x20\x92\x3c\x4f\x53\xc7\x5d\x4b\x56\x62\x63\xf9\x75\x7e\xc7\x9e\xf5\x39\x6e\xb2\xe3\x48\xde\x3d\x16\x21\x76\x18\xea\x2d\x1c\xe1\x93\x16\x27\xc0\x95\x74\x02\xcb\x23\xae\x39\x85\x3b\x04\xfc\x1d\x57\xf8\x74\x22\xa9\x7b\x78\xbf\x53\x58\xbe\x8f\x04\xe4\xe5\xbc\xbf\xe3\x6e\xf7\xb0\x9c\x57\x78\xd0\x89\x0b\xd7\xb8\xf3\x93\x56\xde\x3d\x28\x53\xce\x56\x3d\x7a\x79\x1c\x17\xfa\xc5\x15\x4c\xbe\x4c\x72\xc2\x7e\xe8\x1b\x66\x69\xc7\x59\x1c\x43\xaf\x83\x37\x75\xd7\x18\xc7\x34\xb2\x6b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x24\x09\x6b\x9f\x89\x4a\x16\x5c\xcd\xc1\x4d\xa2\x2b\x37\xde\xef\x7f\x0f\x33\x2a\x45\x5a\x25\xd4\x72\xc7\xef\xda\xdf\xfb\xa0\x03\x01\xdd\x01\xbb\x32\x09\x2f\xfc\x9c\xe3\xd7\x32\x4b\x65\xf9\xbb\x67\x4c\x4e\xc4\x84\xed\xfc\x3e\xfa\x6a\x07\x9f\x5e\x94\xda\x3d\x82\x0a\x8c\x60\x56\x99\xb4\x90\xe8\xb3\x13\xdf\x3d\x61\x27\xee\x19\x10\x88\x0d\x04\x8c\x6a\x60\xa6\x35\xf9\x46\xac\x14\x73\x5e\xa6\x19\x39\x0c\x6f\xa2\xc2\xa9\x40\x30\xf1\x4e\x1a\x6b\xc8\x5b\xd0\x83\x39\x59\x6e\xae\x1c\x2b\x72\x87\x6b\x9c\x72\xcb\xc7\xd1\xa9\x3e\x40\x53\x6b\x4c\x58\xe0\x63\x4e\xbb\xab\xe6\x5a\x07\xbf\xa3\xfa\xe3\x31\x0f\x77\x49\xa7\x94\x03\x2a\x77\x77\x55\xe7\xb1\x79\x89\x7b\x40\xc2\x37\x0f\xf0\x49\xdd\x27\x02\x68\x00\x5d\x96\x6a\x95\x29\xf0\x51\x42\x3d\xbf\xe5\x48\x9f\x9c\x5d\xbe\xfe\xc7\xf9\xab\xd3\xb3\xcb\xed\xc9\xde\x9e\xec\xed\xc9\xee\x71\xb2\x85\xba\xee\x7d\xaa\xbd\xf5\xb4\x2e\x6f\xa1\x0d\xc6\x1a\x95\xe0\x7d\x46\xd9\xa1\x27\xea\xfa\x07\xee\x94\x69\xf2\x6b\x53\xd0\x75\x4d\x1a\x07\xdd\x80\xaa\xfb\xd1\xa3\x4f\x0f\xdd\x60\x72\xe7\x80\x49\x73\xb1\x63\x65\xdd\xaa\xc5\x3d\x42\x8f\x7e\x39\x3d\x3e\x39\xbb\x3c\x7d\x7e\x7a\xf2\x7a\xa3\xd9\x4e\x3d\xc1\x50\x9b\x72\xb9\xa3\x94\x2c\x4a\x71\x2d\x75\x65\xb2\x65\xc0\x53\x5f\xcf\x04\x56\x13\x66\x55\x0a\x1e\x0f\x0f\x19\xbf\xf6\x67\x5b\x61\x3b\xac\xb0\x6d\x26\x7f\xf5\xc0\xc1\x1a\x6a\xfb\x3e\x2f\x75\x3e\xd0\x16\xbe\x40\x5f\x8c\x0f\xb6\xad\xdb\x4f\xbb\x04\x99\xd3\x10\x3d\xa4\x3c\xd6\xf8\x3c\x4e\x1f\xcd\x0b\xdb\xa3\x59\xce\x20\xf0\xd7\xc3\x20\x45\x63\xc2\xd9\x4b\x5e\x7c\x2f\x96\xaf\x45\x4f\xb8\xad\x26\xbd\x45\x26\x12\x27\xe8\xd8\x95\x58\x62\x76\xf1\x91\x7f\x58\x1f\x58\xb0\x07\x89\x1e\x7e\x25\xfa\x20\xbb\x0f\x09\xfb\x7d\x25\x7a\x64\x4e\xfb\x6b\x05\x00\xdb\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xf2\xfb\x23\xc0\x9c\x7f\xbe\x71\x94\xe6\x35\xe0\x2a\xf8\xf0\xed\xc0\x2b\x81\x91\xf4\x65\x43\x76\x05\x26\xc2\xb0\xa6\x19\xf6\xa6\x0f\x3d\x90\x92\x31\x10\x69\xfa\x76\xdb\x64\xb8\x84\xc3\xf2\xd5\xdd\x9a\xb1\x62\xce\x45\x00\x74\x4c\x9f\x79\x0c\x10\x13\x5a\x64\x42\xd3\xe9\x51\xf3\x4f\x4a\x6b\xf9\x67\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xff\xfa\xfd\xc9\x3f\xfe\xb6\xbb\xfb\xf3\x3f\xe3\x6f\x41\x14\x62\x78\xbb\x79\x0b\x00\x9a\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x86\x50\xe8\x0b\xc0\x23\x98\x60\xea\x5d\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\x79\xf3\x41\x0a\x06\x58\xa2\x1e\xe5\x71\x78\x0d\x27\x1e\x6a\x5e\x32\xf0\x51\xa5\x51\x43\xa7\xa7\x64\x21\x72\xc4\xfe\x7b\xee\x49\x00\x6d\xbc\x3d\xf0\x89\x02\xb4\x08\xa7\x99\x36\x61\x58\x77\xae\x9f\xee\x3c\x28\x01\x13\x56\x70\x60\x82\x01\x45\x88\x5a\x78\x90\x83\x80\x0d\x69\x2e\xa1\xcd\xec\xe1\xf9\x29\xbb\x46\x0a\x3f\x18\xe2\xf8\xf0\xe6\xf3\x8f\xca\xe3\x42\x10\xb5\x5d\x95\xfe\x0c\xd3\xca\xfc\xf7\x84\x10\x62\x02\x54\xa4\x70\x86\xcd\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x19\xfe\x0c\x95\xc9\x63\x63\x75\xc9\xe7\x50\x18\x86\x3f\xc7\x9f\x85\xbf\xf0\x87\x8d\x07\xac\xfe\x1a\x4d\xe1\x3a\x96\x4a\x1c\xb9\x23\xd2\x4d\x7d\x3d\x40\xde\xe6\x49\xff\x40\x58\x5b\xd2\x17\xaf\xac\x79\x35\x37\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\x24\x55\xcc\x8f\xea\x2c\x36\xf0\x06\xa8\x6b\x67\x59\x76\x46\x9a\xac\xaf\x01\xb9\x59\x2a\xaf\xa5\xd1\x3d\xca\xdf\xc2\x40\xb7\x67\x3c\x12\x68\x0f\x66\x71\x05\xb7\xd9\xbb\x02\xc0\xf5\xc2\x79\x6d\xb1\xfd\xa7\x7d\xfa\xeb\xe1\x55\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xde\x53\x1f\x00\xeb\x1a\xaf\x21\x11\xaf\x9b\x23\x0e\xb2\xfd\x3e\x62\x9b\x17\xbc\xfc\xf6\x1a\xfa\xfc\xbf\xf6\x5c\x33\xca\xea\xf1\xe2\xfa\xc1\x1c\x70\x4c\x0b\xfd\x14\x9e\x1c\x7c\x52\xb3\x60\x2c\x98\x16\x9f\x9b\x9c\xfb\x2d\x38\x77\x42\x83\x56\x58\xd7\x5a\x13\x9d\x95\x3a\xf7\xb0\x14\x10\xde\xc0\x02\x4a\xba\xef\x4a\xf4\x6a\x19\x8e\xd7\xd6\x19\xb4\x75\x06\xdd\x72\x7d\xd0\x19\x84\x45\x04\x0f\xd7\x13\x24\xd4\x75\xd7\x10\xc6\xda\x08\xba\xb7\x75\x62\xf0\xc7\xbb\x05\xd4\x26\xfe\xa8\xd7\x9d\x8d\xeb\x64\x1a\x14\x68\xf9\xfa\x18\x26\x3b\xcc\x32\x26\x15\x1e\x7c\x18\x20\xd4\x62\x09\x34\x6d\x7c\x11\xf1\xb5\x9b\x42\xa8\xba\x6a\x80\x27\x43\x6e\xb1\x54\x73\x2a\x8c\x42\x51\x42\xd1\x27\xa9\x6a\xd8\xe9\xa0\x1c\xd6\xbd\x0a\xb8\x31\x3a\x81\xa6\x60\x58\x69\x15\x30\x29\x69\xda\x30\x1b\xcb\xaf\x20\xda\x98\x88\x54\xa8\x44\x50\x1f\x83\x46\x17\x67\xae\xd8\x89\xba\xf6\xbd\x1c\xd2\x0a\x93\x41\x90\xfd\xad\x1f\xe3\xf3\x4a\x40\x70\x1b\x91\x82\x60\x51\x1e\x02\x70\xfd\x60\x61\x73\x48\xc5\xd0\xb3\xda\xcb\xda\xad\xd1\x6b\x6f\x29\xde\x5f\x66\x86\xc8\x56\x2f\x65\x68\x45\x58\xd6\xee\xe7\xa6\x90\xfc\x1c\x82\x81\xfd\xc5\xe7\x6f\x4e\x74\x0e\x24\x36\x87\x11\x99\xf7\x88\x9d\x0c\x29\x26\x87\x08\x96\x14\xa5\x98\xc9\x77\x03\x9d\xd3\xc3\xa8\x9e\x50\xa6\x42\x59\x39\x93\xd8\xcb\xba\x28\x45\x21\x14\xb8\x5a\xa1\x44\xc3\xf1\x7e\x92\x94\x75\x70\xfa\x21\x26\xf3\xa0\xc2\x3d\x2c\x2b\xbb\x58\xa7\xec\x6f\xf9\x18\xdb\xf2\xb1\xce\xd7\x27\xe2\x63\xb4\x73\x1f\x0e\x13\x83\xcc\xf3\xfe\xd9\xef\x47\xcd\x54\x76\xd8\xc8\xfd\x4b\x88\x5b\x05\xfa\x81\x35\x5a\x8d\xc9\x6b\x58\xc7\x56\x32\xac\xd9\x47\xbd\x89\xe5\x5c\xf1\x39\xb6\xa2\xb0\x3a\x80\x57\xe9\x32\xb4\x13\x6b\xe7\xdd\x83\x1e\xef\x4b\xbc\xe0\xcb\x52\x67\x99\x28\x0d\xcb\xe4\x95\x60\xc7\xa2\xc8\xf4\x32\xa7\xdc\xd7\x94\x5d\x58\x6e\xdd\xae\xbe\x10\xb6\x5b\xd8\xb7\x1f\xaa\x8d\xaf\x42\x1f\x08\xfb\x1f\xcb\xda\xa1\x28\x9c\x15\x54\x41\xf9\x4a\x01\xd3\x38\x84\xce\x46\x23\x76\x26\xae\x45\x39\x62\xa7\xb3\x33\x6d\xcf\x51\xfb\x6e\x26\xdc\xe1\x8d\x4c\xce\xd8\x33\x67\xd7\x19\xcb\x2c\x76\x97\x89\x0a\xd4\x75\xd9\x18\xa0\xc6\x2d\x1c\xa2\x3e\x6f\xb5\xf6\x1c\x46\x0a\x95\xe7\x9d\x22\x19\xbd\x96\x29\xb4\xef\xea\xbd\x40\x87\x58\x4f\x5a\x43\x59\x47\xfb\x1b\x71\x15\x3c\x12\x1f\x58\x81\x52\xb1\x52\x98\x42\x2b\x23\x9a\x30\xa3\x61\x46\x68\xed\x0e\x8b\x61\xdc\x59\x78\xf6\x15\x9b\x85\x36\x16\x4a\x68\x87\x69\x0a\x77\xee\x87\x83\x8a\x64\x9e\x65\x22\x6d\x74\x05\xc4\x6e\x56\xbc\xe9\x21\x20\x34\x94\xd0\xdf\x06\x0b\x95\x1b\x35\xce\x8d\xfb\x43\x87\x49\xdf\xc3\xc9\xb7\x17\xbf\xad\xb2\xb9\x3e\x98\x20\x47\xa2\x0d\xb0\x02\x78\x0e\x30\xf8\x26\x6a\x04\xb5\xd0\xfa\x8a\x25\x3a\x2f\x32\x38\x3a\x3d\x4e\x56\xdd\x87\x2e\x6c\xa5\xb1\x1b\xdd\x1c\x44\x2d\xea\xe0\x83\x7e\x1d\xea\x7a\x29\x62\x43\xa8\x61\xe2\x9d\x48\x06\xeb\x61\x7b\xf2\x4e\x24\x51\x13\x66\x80\x64\x4b\x3c\x42\x84\x3b\xb1\xfd\x7b\xeb\xf7\x0e\x39\x0c\xe5\xe6\xef\x51\x4b\x17\x5f\x2d\x14\x4b\x18\xd3\xa3\xfd\xd3\x23\xa0\x71\x0a\xd8\x42\x58\x5f\x17\xc3\x68\x84\xcd\x88\x47\x6f\x05\xfa\x32\x24\x52\xfb\xb1\xa0\x45\x9a\xd6\x96\xed\xed\x1e\xec\xee\xaf\xf8\x1f\x5b\x90\xf1\x97\xd1\x2f\x25\x40\x9d\x16\x80\x1b\x2a\x92\xdd\x74\xc4\xa4\xf5\x99\xd6\x08\xf7\x04\xb3\xa2\xa2\xbf\x11\x33\x9a\xd9\x92\xa7\x92\xd4\x18\xf8\xd4\xdd\x64\xcb\x8a\xb8\xfc\xde\xee\xaf\xbb\xd4\xda\xeb\x46\xab\x5d\x0b\xd3\x9f\xb0\x4b\xc4\x89\x09\x03\x2d\x75\x05\xb8\x50\x48\x82\x22\x93\x89\xb4\xd9\x12\x38\x16\xd3\x15\x62\x52\x39\x79\x41\xc5\x86\x27\xef\xa4\xf5\xcd\x75\xf4\x8c\x3d\xc1\xee\x7a\x88\xe1\xc4\x0d\x74\x58\x3f\x58\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x20\xd5\xb1\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x4c\xf4\xdb\xee\x5d\xdb\xd9\x0a\x7a\xdd\xe5\xe5\xf9\xb7\x8d\xbe\xed\xc0\xc5\xad\x2d\x7c\xea\x0e\x78\x03\x44\x39\xd3\x65\xfe\x00\x78\xc7\x30\xc1\xca\x5e\x0d\xdc\xd9\x80\x2c\xac\x6f\x23\x77\xb6\x1e\x8d\xf0\xee\x1d\xdc\xd9\x3f\x74\x05\x60\x20\x7c\x9a\x2d\x03\x12\x83\x11\x96\xed\xb8\xa1\x76\x1c\x7b\x72\xbb\xe1\x3b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xac\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\x4b\x2f\xe9\x64\x4c\xe0\xf4\xf8\xba\xa6\x52\x14\xc8\xe1\xe8\x37\x9f\x1d\xff\x5a\xe1\x1b\x48\xf7\x46\x13\x8f\x24\x26\x5b\xdc\x23\x4a\x2a\x24\x16\xe2\xce\x0c\xc4\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\xa5\x3d\x83\xde\x97\x81\x88\x38\x68\xb4\x9e\xf5\x2f\x15\x8d\xaf\xf7\x13\x60\x98\xc5\x67\x43\x52\xa0\x18\x20\xb5\x7b\x35\xb1\x1b\x61\xa4\xa0\xf4\x12\x99\x2b\xb0\x09\x04\xbe\x7c\x30\x52\xc6\x69\x0b\x83\xbe\x3a\x3a\xca\x4b\xa6\x42\x57\x78\x8f\xf2\xbb\x4a\x90\x28\x33\x81\x9a\xc8\x7b\x77\xae\x17\x47\x5c\xcd\x05\x7b\xea\x7e\xf9\xe7\x3f\xfd\xe9\xab\x3f\x4d\x70\xf8\x90\xa5\xa0\xd8\xe9\xe1\xd9\xe1\x2f\x17\x3f\x1c\x41\x71\x6c\x5f\xaa\x0e\x94\x82\x39\x74\x02\xe6\xa0\xe9\x97\x1f\x35\xf9\x12\x4a\x3e\x7a\x73\x91\xa6\xef\x1f\x86\x8c\xf1\x3d\x49\xf7\x8b\x70\xf6\x10\x83\x36\x76\xa4\xba\xa3\xf6\x20\xce\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\x4b\x0d\x20\x1f\xa7\x06\xd3\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x04\xe8\x60\xc4\xfe\x2b\x05\xb5\x71\xc3\x84\x3f\x04\x39\xf3\x6d\xb2\x91\x97\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x79\x34\x33\x2e\x33\xf0\xa0\x52\x87\x6a\xcc\x08\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x68\xdf\xd7\x0e\xeb\x9b\x97\xf8\x80\x45\x1d\x89\xb8\xb2\xd1\xcc\x7e\x2b\xea\x06\x18\xef\xe1\x8a\xba\xa2\x14\x17\x56\x77\xea\x88\xc1\x56\xa3\x24\x38\xd8\x2d\x31\x92\xa9\x98\x69\xc7\x84\x6f\x0d\x7a\xa4\x15\x1c\x42\xae\xa0\x38\xd0\x7b\xb5\x74\x23\xb0\x81\x19\x99\x01\xbf\x9e\x80\x53\x0f\x4c\x8c\x96\xea\x7b\x81\x8f\xdc\xdb\x89\x1c\x66\x37\xaa\xab\x1c\xa8\x13\x39\x7c\x28\x6c\x82\x9e\xdb\x88\x91\x03\x72\x28\x4d\xbf\x1d\x46\x49\x4a\x6e\x16\xd8\xa5\x5b\xbc\x93\x96\x70\x59\xcf\x75\xda\xee\xad\x3f\x2f\x79\x22\x58\x21\x4a\xa9\x9d\x30\xaa\x94\x4d\xf5\x8d\x62\x53\x31\x97\xca\x78\x52\x00\x78\x3a\xd1\x0c\xe2\x31\xd2\x04\x60\xb8\x09\x7b\xdd\x00\x3b\xa1\x32\xa4\x44\xd7\x47\x93\xe6\xdc\x8e\x24\x81\xc4\x02\x3a\x21\xe0\x7d\xa0\x70\xdc\xcd\xeb\x43\x53\xde\xab\x14\x3c\x39\x15\x19\x5f\x62\xb6\x29\x74\xf0\x97\xff\x11\xa5\xd9\x1f\x20\xe2\x84\xfd\xe8\xfc\x77\xb7\xce\x43\x1a\x56\x0a\x9e\x2c\xfa\x05\x7f\xb7\x21\xaa\x3b\x5e\xdb\x10\x55\x9f\x41\xb6\x21\xaa\x6d\x88\xea\x03\xd7\x36\x44\xb5\x0d\x51\xb5\xae\x07\x6b\x25\x6d\x43\x54\x9d\xaf\x6d\x88\xea\xfd\xd7\x36\x44\x75\x87\x6b\x1b\xa2\xba\xe3\xb5\x0d\x51\x6d\x43\x54\xdb\x10\xd5\x36\x44\xf5\x1b\xf2\xdb\xf9\x6b\x1b\xa2\x5a\x19\x64\x1b\xa2\xda\x86\xa8\xee\x7c\x3d\x58\xe3\x6b\x1b\xa2\xc2\x6b\x1b\xa2\x6a\x5e\xbf\x2d\x51\xe7\x03\x3c\xe7\xce\xd4\xeb\x5f\xd3\x76\x0e\x41\x05\x99\x50\x9c\x48\xcf\x1a\x75\x50\xf8\xa8\x49\xdd\xa3\x22\x82\x05\xf1\xa5\x38\x14\x11\xaa\xe3\x4c\x6b\xeb\xa5\x7a\xf6\x91\x2b\x74\x5a\x07\x2a\xa2\x08\x05\x1a\xbc\xdd\x6b\xd6\x36\x56\x8d\xd5\x27\x2c\xf1\x69\x42\x12\x0f\x24\x7e\x33\x40\x18\x62\x1b\x82\xf8\xec\x42\x10\xc3\xb8\xef\x06\x70\xdd\xf5\x16\x15\x14\x99\xbf\x5c\x94\xc2\x2c\x74\xd6\x79\xa3\x37\x36\xf9\x4b\xa9\x64\x5e\xe5\xd0\x29\xd6\xed\x67\x79\x1d\x52\x00\x4c\xdd\x8a\x1e\x38\x36\x7a\x11\xa3\x96\xb2\xbe\x95\x2c\xd4\x6f\x52\x6b\x78\x53\x25\x89\x10\xd0\x4a\x2d\xb6\x70\xbe\x9a\x84\x27\x85\xd6\x19\x4f\xfb\xf1\x9b\x7e\x42\x1c\xe1\x48\x61\x94\xaf\xbe\xec\x34\xc6\xbc\x2c\x86\xe1\xcb\xdf\xbe\x3e\x3f\x8a\xf8\x32\x57\x9e\x2d\x4b\x75\xad\x33\xa0\x2a\xc7\x9b\x9c\xb2\x46\x0d\xf6\xa5\x33\x98\xa6\xc2\xf2\xc8\xb6\x21\xb3\xc0\x60\x13\x7d\xf7\x3b\xf7\xab\x20\x91\xcf\x51\xee\x62\xff\x7c\x36\xe7\x76\x93\x0c\xbf\xbf\x09\xd3\xcb\x7c\x19\x42\xde\xf4\xd5\xd0\x9b\x3e\x38\xa7\x87\x37\xbd\x50\x73\xd8\x17\x88\xa0\x7f\x67\x3d\xbc\x37\xa7\xec\xaf\x1b\xf7\x3f\x5a\x0c\x20\x6e\xe0\xc5\x07\x23\xf0\xce\x05\xb5\x8e\x22\x71\x1e\x1b\x41\xbe\xab\x94\xd5\xac\xc8\x78\xdd\x17\x0a\x56\xe0\x3b\x90\x41\x47\x0b\x91\x5c\xbd\xa6\x48\xec\x9e\x11\x22\xe8\xa6\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\xb1\x04\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x5d\x25\x11\x37\x4e\xdc\x28\x52\xcd\x27\x79\xba\x3f\x61\x6f\x15\x56\xb7\xd7\x7d\x28\x23\x6c\x07\xf7\x7c\x8f\xb3\x31\x15\x8e\xbb\x6a\xf0\x43\x44\x10\x76\x6e\x7a\x93\x3e\x40\xc9\xbd\x45\x52\xcf\x28\xf8\xa7\x8f\x80\x6f\x39\x17\x1b\xc0\xe1\xf2\xd8\x22\xdd\x83\x65\x7c\x0c\x10\xe1\x7e\x40\xd1\xed\x07\xa3\x1a\x3f\x94\x88\xf6\x03\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x47\x00\x65\xfe\x38\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x45\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x74\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xb1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xd1\x22\xd0\xfd\xa3\xcf\x0f\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x2c\x32\xbe\xbc\x10\x89\x56\x69\x67\x09\xd3\x42\xe9\x0c\xe7\xc7\xe0\xb0\xe4\xa7\x6a\x16\x5a\x2c\x38\x81\x91\x3b\x8b\x0a\x0b\x4b\x7c\x2c\x83\x14\x0a\x88\x2a\xe3\x2c\x1f\x64\x74\x82\x3d\x18\x87\x18\x56\x9d\x0c\xb9\x88\xdf\xe9\x1b\xa6\x67\x56\x28\xb6\x27\x95\x5f\xc7\xfd\xc8\x0c\xac\xbd\x93\x61\x5b\xbb\x6f\x9f\x3e\xf1\x37\x7f\x7e\x6e\x47\x70\xb0\x1a\xf3\xf1\xbd\xc0\xf4\xa0\x0f\xbb\x81\xe9\xc6\x59\x95\x35\x5d\xc1\xe8\x1e\x6e\xf2\x9b\xa7\x35\x9c\xf2\x53\x18\x37\x9c\x36\xae\x52\x46\x95\x68\x9f\xdf\xa2\xf5\xce\xab\x69\xaa\x7e\x21\x8f\xe6\x43\x5e\xe3\xcb\xa3\x73\x74\x1a\x6f\xdd\x25\x0f\xc5\x5d\xb2\xa1\xdc\x94\x07\xa8\xe8\x3e\xd2\x7c\x94\xad\xa2\x7b\x8f\x2b\xaa\x4d\xfd\xb6\xe4\x89\x38\x1f\x5c\x47\xf0\xc7\x89\xa5\x55\xc9\x89\x01\x06\x95\xcf\x1f\x1e\x25\x44\x8a\xa7\x29\xd4\xf3\x42\xa5\xec\xac\xca\xb2\x25\xab\x0a\xad\x9a\xd5\xcf\x18\x6b\x6f\x17\xd3\x82\x4b\x7e\xcd\x53\x6a\xc5\xb2\x28\x35\xc9\xcc\xb2\x52\xca\xf1\xe0\xba\x27\x1a\x28\x92\x00\xd3\xcc\x1b\x25\xbb\x46\xce\xdd\xf4\x9d\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\x95\xcc\x32\x1a\x66\xc2\x2e\x84\xc5\x90\x02\xca\xce\x4c\xab\x39\x4c\x8e\x2b\xdf\x78\x51\x24\xee\xb7\x49\x26\xb8\xaa\x0a\x7c\x9e\x93\xc4\x4b\x5d\x95\xfe\x79\x93\x10\x98\x08\x12\x58\xc9\x6c\x14\xb5\x77\x7b\xef\xc2\x86\xdc\x9f\xca\x38\x05\xe0\x95\x87\xa5\x1e\xc5\x63\x7a\xe4\x70\x13\x35\xf7\x29\x4a\x7d\x2d\x53\x8c\x6e\x78\xb2\x41\x23\x69\x6c\xe0\x13\xce\xb3\xd2\x6a\xac\xc4\x9c\x83\xa2\x42\xa7\x08\xd7\x0c\xc7\xc1\x0c\x02\x95\x42\x4b\x1f\xa7\xe1\xeb\xa2\x51\x4e\x7f\x2d\xb1\x19\x71\x44\x39\xb6\xa7\x34\xd3\x90\x8f\x5a\x29\x69\xb1\xc1\xfd\xa2\xb2\x2c\xd5\x37\x6a\xff\x5e\x51\x57\x08\xb4\x5e\xae\x25\x50\x33\xfc\xba\x4e\xcf\xc1\xf7\x7d\x3f\x79\xa5\x21\xd7\xe7\x8c\x55\xca\x88\x9e\xe2\x7d\x30\xe5\xe8\xcf\x7f\xec\xc6\x23\x64\x2e\x74\x65\x3f\x89\xf5\x77\xb3\x90\xc9\x22\x56\x66\x65\x2e\x0c\xd3\x55\xcb\x2c\x7e\x4a\x3f\x5b\xbf\x42\x5b\x13\x70\xdd\xd5\xd5\xb1\xbb\xc6\xfb\xd5\x86\x43\xa8\x3b\x5f\x43\x9e\xf8\xf1\xd9\xc5\x2f\x2f\x0e\xff\x7e\xf2\x62\xc2\x4e\x78\xb2\x88\x31\x31\x14\xe3\xc0\x34\x80\x51\x2c\xf8\xb5\x60\x9c\x55\x4a\xfe\xbb\xa2\x80\xef\x5e\xf8\xed\xfe\xa0\x58\xed\x1d\xa5\x2f\x74\xe7\x1f\xac\x1d\x1c\xf6\xfa\xc7\xbc\x2c\x6d\x04\x34\x70\x59\x51\x9f\x42\x94\x79\x89\x26\x02\x28\x5c\x90\x3e\x7f\xfc\xea\xe4\x02\xd2\xf2\x8b\x12\x91\x42\x20\x8f\x0b\xbe\x87\x91\xa6\xc2\xfd\x82\x3a\xf7\x4e\xd8\xa1\x5a\xe2\x97\x78\xa6\xa4\x61\x99\x34\x56\x80\xd4\x23\xb5\xcd\xc7\xaf\x77\x9e\x4c\xe0\x7f\x3b\x8c\xa7\x69\xe9\xf4\xba\x90\x9e\x96\xac\xe4\x8b\xa2\xe6\x27\xa7\x59\xf4\x02\x4a\x58\xcc\x46\x7b\xa9\x53\x9a\x39\x48\x12\x88\x5d\xa1\x18\x34\xb6\xe4\x56\xcc\x65\xc2\x72\x51\xce\x05\x2b\xb8\x4d\x16\x2c\xe7\x4b\x96\xe8\xb2\xac\x0a\xc4\xf9\x4f\xb9\xe5\x13\xf6\x5c\x97\x2c\xf7\x87\xd8\xed\x79\x27\x87\x2f\xd6\xc7\xf4\xeb\x93\x1d\xff\x53\x1a\x53\x09\x73\xf0\xf4\xc9\xd7\x5f\xfe\xe9\x4f\x9f\x55\x6b\xb8\x3a\x5d\xc8\xad\x6d\xd4\x1a\x8e\xfb\x55\xc0\x55\xc7\x56\x81\x52\xcd\xb3\x78\x7f\x75\x13\x00\x7d\xad\xcc\xbe\x36\xe6\xb8\x7e\x83\xf3\xae\xa6\xe6\x20\x2d\xea\xea\x39\x0c\xd4\xd8\xa9\x96\x83\xde\xb0\x22\xde\xa0\xe3\x5e\xbd\xa7\xe7\xfe\x60\x92\x9e\x93\xb7\x1a\xbc\x16\x75\x76\xd2\x88\x3d\x61\x7f\x65\xef\xd8\x5f\xc1\xd0\xfa\x73\xdf\x36\x58\x7d\x4d\xa0\x21\x92\x8d\x9c\x7d\x7f\x7a\x3e\x10\xc5\x7f\x74\x4c\xd3\x8d\xe8\xa8\x6a\x35\x9b\x4a\x52\xec\xc5\x3b\x2b\x4a\xa7\x68\xd2\x4a\x6c\xb4\x81\x98\x9b\xe0\x27\xdc\x66\x18\x78\x38\x9d\x35\x13\x9c\xee\xb7\xd1\xdc\xcf\xbf\xd3\xc6\x9e\x11\x17\x6a\xb6\xc2\xa9\x47\xcb\x81\xf1\x37\xd8\x98\x93\x1b\xc6\xd6\x07\xcc\xb0\x54\x43\xbe\x15\x26\x32\x2f\x64\x8f\x34\x8a\x87\xb3\x8d\xfb\x45\xd6\x1b\xeb\xf9\xbe\x95\x6a\xb9\x52\xc0\x06\x22\x15\x2b\xc2\xc8\x2a\x74\x4a\xda\x99\x9b\x56\x1a\xc9\x8c\xf7\xa8\x67\xe4\xb5\x09\xfe\x66\xd8\x4b\xee\x3c\x25\x5c\x61\x29\xc9\x4c\x94\x25\xe6\x9e\x4f\x97\x3e\x6d\xaf\xf7\xe2\xf5\x3a\x49\x45\xa9\xad\x4e\x74\x8f\x1e\x67\xcd\x68\x37\x0d\x07\x44\xc0\x7c\x5f\xef\x30\x7f\x73\x7c\x3e\x62\x97\x47\xe7\xd0\xf7\xe9\xe2\xe8\xf2\xbc\x69\xb3\xec\x5c\x1e\x9d\xef\x6c\x94\x14\xcc\x2b\x7c\xe0\xa2\xee\x30\x48\xc3\x05\xe5\xb4\xc9\x71\xce\x8b\xf1\x95\x58\x76\x94\xa9\x43\xc8\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\xd5\x73\xf9\x84\xd8\xf0\xcc\xf5\x85\x5d\xb9\xbe\x16\x29\x6a\xe9\xfe\x17\x42\xa5\x85\x96\x4e\x5f\xdc\x56\x7b\xdd\xff\xd7\xdb\x6a\xaf\x3b\x5f\xdb\x6a\xaf\x6d\xb5\xd7\xea\xf5\x60\x52\x5a\xb7\xd5\x5e\x9f\x57\x04\x7f\x5b\xed\xf5\x1b\x4f\x02\xd8\x56\x7b\xad\xbf\xb6\xd5\x5e\xdb\x6a\xaf\xbb\x5d\xdb\x6a\xaf\xfb\x5f\x0f\x2e\x7d\x69\x5b\xed\x75\xaf\x6b\x5b\xed\xb5\x7a\x6d\xab\xbd\x6e\xb9\xb6\xd5\x5e\xb7\x5c\xdb\x6a\xaf\x6d\xb5\xd7\xb6\xda\x6b\x9b\x04\xfb\xc1\xb1\x1e\x66\x12\x2c\xdb\x56\x7b\xd1\xb5\xad\xf6\xfa\x2c\x52\xfd\xd8\xb6\xda\xeb\x4e\xd7\xb6\xda\x6b\x5b\xed\xd5\xe5\xda\x56\x7b\x7d\x2e\xee\x92\x6d\xb5\xd7\xb6\xda\xeb\xb7\xa3\xe8\x6e\xab\xbd\xb6\xd5\x5e\xdb\x6a\xaf\x6d\xb5\xd7\x7b\x67\xb1\xad\xf6\xfa\x1c\x4c\x40\xdf\x11\xb8\x7f\xf5\xd2\xee\x91\xce\x8b\xca\x0a\xf6\xda\x0f\x19\xb4\x48\x64\x0c\xd2\xc4\x1a\x41\xff\x14\xc2\x44\xab\x99\x9c\x13\x67\x3f\xc0\x36\xbc\xe3\xf0\x3e\xe3\xa8\xf5\xed\x23\xcc\x1f\xcc\x64\x2e\xbb\x95\x94\xb1\x95\x85\x79\x01\x63\x45\x71\x19\x77\x92\x72\xfe\x0e\x8e\x08\xcf\x75\x85\xad\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\x3d\xb8\x95\x61\xc3\x98\x38\x3c\xf5\x79\x75\xe7\x43\xa4\x95\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xce\x53\xee\xad\x12\x0f\xa7\x10\x0f\xa4\x0e\x7f\x14\x65\x98\x02\xba\x03\x9d\x45\x4a\x46\x59\x39\x8d\x24\xb0\xde\x77\x1a\x3d\x37\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\xc4\x07\x20\xa1\x9b\x5b\x6c\xb4\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x44\x2f\xf3\x22\x83\x06\xe7\x70\x9e\xc7\x3e\x97\x05\x84\xeb\x96\x37\x7c\xf8\xda\xf2\x86\xcf\x91\x37\x18\x91\x54\xa5\xb4\xcb\x23\xad\xac\x78\xd7\xc9\xc3\xd2\x64\x0d\x17\xcd\x01\x29\x67\xcc\x50\xae\x1b\x7e\xc7\x74\x81\x79\xdf\xad\xc2\xfa\x85\xae\xb2\x14\x8a\x39\x2a\x05\x06\x26\x56\xe9\x09\x8b\xd6\x1f\xd8\x3d\x90\xca\xdd\x7e\x88\xb7\xe7\xd0\xcc\xfc\x77\x25\xaf\x79\xe6\xac\xdd\xfa\x17\xe7\x60\xc1\xc4\x3f\xba\xeb\x99\xb7\xdc\x5c\xd5\x07\x5e\x8c\x9d\x0e\x1d\xe6\x7c\xe0\x5f\x09\x3e\x12\xef\xec\x63\xd4\xd2\x40\x41\x3a\x2f\xe5\xb5\xcc\xc4\x5c\x9c\x98\x84\x67\xc0\xd7\x86\x91\x15\x87\xb7\x8c\x0e\x0b\x5f\xea\xcc\xb0\x9b\x85\x70\xbc\x9a\x71\xef\x02\x80\x0a\xbb\x39\x97\x0a\xeb\xe2\x0b\xff\x63\x83\xbe\x04\xc7\xfe\x0b\x5e\xba\x05\x0e\x3e\x03\x30\x91\xa7\x5a\x67\x54\xf1\x90\x2d\xeb\xf1\xa9\xf6\x47\xe9\x5f\x94\xb8\xf9\xc5\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x27\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x40\x98\x67\xec\xe9\x3e\x6c\x67\x6e\x58\x18\x23\x65\x5f\xee\x43\xf8\xef\xe8\xf0\xfc\x97\x8b\x7f\x5c\xfc\x72\x78\xfc\xf2\xf4\x8c\x9d\x69\x2b\x50\xa8\x45\x6d\x02\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\x8d\x54\xa9\xbe\x31\x9d\x7d\xb4\xb8\xfd\x1c\xf1\x04\x57\x9d\xc6\x48\x78\xc1\xa1\xfb\x61\x0f\x09\xb3\x92\x61\x12\x0f\x0a\x32\x3c\x4d\x0f\xd2\x52\x17\x48\x04\xef\xe4\xaa\x45\x6d\xd3\x8c\x8e\x73\x58\x61\x7d\x67\xcd\x01\xe7\x25\x57\xb6\xf6\xf6\xd4\x6b\x46\x6d\x17\x27\xbd\x97\xe3\x71\x57\x34\xf1\x74\xb8\x6a\xa6\xc3\x34\x15\x69\x83\xfc\x9f\x5d\xe6\xe0\x91\x7f\xb9\x65\x8d\x52\xc1\xce\x5f\x5d\x9c\xfe\xef\xd6\x3e\x5e\x16\xfd\x12\xa5\x86\xa9\x8c\x2d\x75\x31\xd8\xea\xbe\xa6\xca\xcb\xed\xfa\x3e\x88\xf5\x0d\xd2\x72\x98\xf0\xfc\xeb\x4a\x35\x21\x8d\xea\xf1\x59\xae\x53\x31\x61\xe7\x21\x4e\xd0\xfc\x36\x02\x38\xe0\xa5\x60\xee\x16\x65\x25\xcf\xb2\x65\xac\xa2\x59\x8d\x55\x88\x0d\x6c\x86\x98\x91\xcf\x78\x66\x36\xcd\x8d\xfb\xc8\x46\xa7\x47\xbc\x74\xf6\xf0\x20\xcb\x11\x46\x63\xa9\x50\xda\x92\x62\xed\x66\x09\x78\x17\xa5\x4e\x18\x1a\xdf\x51\x32\x56\x43\xbe\x19\x8c\x55\x78\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\x77\x24\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x19\xed\x20\x3b\xe0\x47\xd2\x96\x9b\xae\x68\x50\x27\x39\x3c\x77\x0c\xab\x01\x87\x2a\xae\xe0\x3d\xae\x57\xfc\xb1\x1f\xa9\xb2\x52\x87\xe6\xdb\x52\x57\x9d\x85\xd8\x8a\xb2\xf9\xed\xe9\x31\xb0\xa2\x8a\x42\x95\xca\x96\x4b\x80\x0e\x58\xc5\x7f\x0b\x86\xc1\x1b\x0a\xb6\xc6\x67\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\x3b\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x90\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\x6c\x9d\x33\xad\xdc\xc1\x1c\x64\xf3\x9c\x86\x48\x2f\x91\x34\xde\x2a\x10\x33\x26\xeb\x8f\x43\xe4\x18\x8e\x65\x65\x44\x89\x61\xee\xb2\x12\xb8\x92\xdf\x57\x53\x91\x39\xca\x3b\x93\x94\x7a\xc6\xa3\x3b\x43\xe6\x7c\x2e\x18\xb7\x61\xa7\x59\xcd\x84\x32\x8e\x63\xa2\x03\xd4\xb2\x54\x8b\xba\xfa\x9e\x1b\xf6\xe6\xf4\x98\x3d\x61\x7b\xee\x59\xfb\xb0\x7f\xa0\xa5\xbc\xd5\x98\xe4\xd6\xb6\x51\x67\x7e\x08\x98\x12\x6c\x5e\xa6\x4b\x64\x12\x23\xa6\x34\x33\x55\xb2\x88\xfb\xd8\x7b\xb3\x99\x12\x21\x21\xb4\xf2\x30\xf7\xfa\x66\x39\xd4\x1b\x23\xca\xc1\x18\xd4\x9b\x0e\x0c\x2a\x56\xa3\xdc\x9e\x6b\x52\x0f\x37\x56\x2e\x2c\x4f\xb9\xe5\xc4\xb8\xfc\x0d\x0f\x76\x49\x7f\xdb\xec\xcb\x88\x17\x52\x55\xef\x30\xf1\x68\x38\x57\xcb\xc5\x09\x0c\xcb\x12\x4f\x75\x58\x75\x5e\x14\x99\x44\xb4\x8d\x56\x22\xdc\x69\x63\xaf\x8c\x6e\x51\x13\x81\x4f\xf0\x2c\xd3\x8e\x3f\x3a\xe5\x84\xab\x54\xe7\x2b\x0f\x73\x4a\xa4\x68\x20\xa7\x4e\xd8\x76\xf7\x35\xaf\x07\xe2\x14\xca\xc4\xb5\xe8\x81\x2d\xd6\x46\x8a\x75\xa3\x39\xe2\xf8\x1d\x01\xc3\xb3\x8c\x4f\x45\x86\x34\xc6\x1d\x68\x56\x77\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x5a\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x8f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x03\x1d\xaa\x1e\xa2\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\x40\x78\x3f\x74\x3a\x18\x91\x24\x3a\x2f\xce\x4b\xed\xcc\xce\xc1\x64\x13\x0d\x5b\xc7\x0c\xd1\xb1\xb1\x26\x19\x0b\x64\x41\xf3\x66\x5e\x46\x89\x9d\xdc\xa2\x90\xf0\xd9\x9d\xff\x23\x92\x59\xc0\x7a\xda\x82\xcc\x8f\xd2\x08\x2f\xba\x5f\xd2\x17\x8f\x59\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\x88\x34\xd2\x09\xcf\x00\x3b\xb6\xdf\x96\x63\xed\x6d\xd7\x1e\x38\x4a\xe7\x85\x18\x25\x7c\xe6\x13\x48\x00\x46\x14\x3e\x21\x17\xa6\xd2\xa9\x88\x62\xd9\x98\x87\x7c\x89\x69\x9f\x70\x9f\xcf\x24\x76\x7a\x85\x0f\x2b\xa7\x8d\x5f\x5b\x4d\x08\x68\x2f\x03\x22\xad\x9b\xa0\x50\xa9\x54\x73\xf0\xab\x8d\x58\x29\x32\xcc\x41\x26\x26\x70\x85\x16\xe4\x2e\x1c\x09\x3f\xa8\x3f\x0f\xfe\xd1\xa0\x8b\x49\xad\x68\x64\xf0\x14\x79\x0d\x6b\x86\xec\x56\x1a\xb6\xf3\xc2\x13\xa0\x07\x84\xe7\x43\x94\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x25\x55\x4a\xe9\xba\x0d\x62\x05\x0c\x78\xd4\x83\x21\x11\x5c\xa6\x31\x6f\x79\xc6\xde\x2a\x16\x88\xc5\xc6\x9d\xb7\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\xba\x87\xb8\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xb7\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x80\xf8\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x21\x4a\xd9\x0a\x1c\xde\xcb\x8b\xc3\xe6\xd0\x20\xac\xa1\x21\x85\x5b\x2b\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\xef\xed\xd4\x30\x36\x72\x6e\x0e\x68\xcf\x8f\xdd\xec\xf7\x99\x54\x59\xc8\x8a\x02\x3b\x58\x59\xe3\x1d\x39\xf0\x90\x24\xcc\x02\xd6\x90\x70\xab\x29\x59\x61\x75\x9a\x88\x54\xed\x76\xc1\xc6\x19\xf6\xea\xf2\x9c\xf5\x84\x5d\xf9\xc0\x12\x9d\xd1\xde\x6e\x23\xab\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x01\x3a\x7d\x57\x8f\xc9\x52\x81\x55\x3c\x02\xb2\x9f\xf8\xad\x49\x76\xe0\x97\xde\x85\x62\x50\xfa\xe9\x6e\xac\x51\x5f\xd6\xcc\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x1d\x47\x03\x16\xe8\x55\x88\x85\x56\x9a\x8a\x24\x9c\x10\xd5\x0a\xb6\x34\xb0\x28\x8c\xe6\xc1\x9a\x10\x8b\x8e\xa6\x7a\x54\x47\x89\xe3\x40\x20\x14\x93\xd9\xd0\x5a\x05\xe7\x70\x23\xed\x02\x70\x5e\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x9c\x1c\x32\xba\xdc\x26\xe1\xee\xaf\x5d\x13\x07\xaa\x6b\x28\x78\xc8\x57\x74\xbb\x49\xcc\x66\x22\x01\x45\x2b\x26\x30\x72\xed\xbd\x1a\xf8\x96\xaa\x0c\xdc\x06\x23\x28\xf9\x5c\xbe\x73\x4f\x89\x7f\x15\x87\xc4\x09\x70\x76\xfd\xd7\xfb\x13\xc6\x4e\x55\xc8\xe0\x1d\xb9\x55\x8c\xef\xf4\xa9\x67\xd6\xbd\x62\xdc\x87\x00\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\xa6\x30\x10\x38\xfc\x45\x34\x5a\xa4\xbd\x87\x80\xdb\xb9\x4e\x11\x4d\x25\xa0\x41\x64\x4b\x8f\xee\x22\xff\xe3\xf5\xb3\x5a\xc7\x53\x1a\xab\x03\x62\x98\x15\x82\xd4\x4e\x99\x53\xb5\x33\xef\x5b\xc8\x8b\x4c\x40\x15\x67\x34\x72\x5d\xa0\x1a\xa1\xc9\x8f\xc2\x44\x6a\x40\x7a\x02\x77\x19\xb1\x7f\xc1\xa1\x0c\x89\xa8\x1e\x77\xe2\x3c\xfc\x1c\x2d\x44\x69\x7c\x6b\x09\xa8\xb0\xb4\xda\xbb\x2e\x58\x2a\x67\x33\xe1\x13\x5e\x9d\xe5\xc8\x4b\x9e\x3b\x16\x6f\x18\x91\x60\x2a\xe6\x12\x13\x22\x03\x63\xdb\x75\xea\x1e\xd5\xfa\x8d\x90\x19\x4a\xcb\x72\x39\x5f\xe0\x46\x61\x1c\x2a\x74\x99\x0f\x2a\x66\x9a\xa7\xd0\x92\x8a\xe9\x92\xdd\xf0\x32\x77\x72\x83\x27\x0b\x88\x50\x72\xc5\xd2\xaa\x04\x94\x65\x2b\x78\xba\x1c\x1b\xcb\xad\xd3\x94\x45\x49\x06\xa5\x9f\xff\x16\x52\xff\xbd\xd7\x16\x52\xff\x8e\xd7\x16\x52\x7f\x0b\xa9\xbf\x7a\x3d\x98\xec\xd0\x2d\xa4\xfe\xe7\x05\x93\xb4\x85\xd4\xdf\x74\x34\x61\x0b\xa9\xbf\x85\xd4\x7f\xdf\xb5\x85\xd4\xff\xc0\xb5\x85\xd4\xef\x70\x7d\x06\x9c\x6b\x0b\xa9\xdf\xe1\xda\x42\xea\xaf\xbf\xb6\x90\xfa\xab\xd7\x16\x52\xff\xd6\x6b\x0b\xa9\xdf\xf9\xda\x42\xea\x6f\x21\xf5\xb7\x48\xa3\xf7\x1b\xeb\x61\x22\x8d\xb2\x2d\xa4\x3e\x5d\x5b\x48\xfd\xcf\x02\x4f\x91\x6d\x21\xf5\xef\x74\x6d\x21\xf5\xb7\x90\xfa\x5d\xae\x2d\xa4\xfe\xe7\xe2\x2e\xd9\x42\xea\x6f\x21\xf5\x7f\x3b\x8a\xee\x16\x52\x7f\x0b\xa9\xbf\x85\xd4\xdf\x42\xea\xbf\x77\x16\x5b\x48\xfd\xcf\xc1\x04\x34\x36\x95\x9d\x10\x40\xef\x02\x56\x44\x49\xe8\x11\x36\xc0\xb4\x9a\xcd\x44\x09\x9c\x0b\x9e\xbc\x92\x3c\x55\xe3\x32\xb6\x83\xac\xc2\x8e\x00\xf7\x88\xea\x75\x6e\xf9\x39\x81\x11\x00\x52\x67\x9d\x29\x7e\xf2\xea\xf9\x1a\x64\xa4\xce\x59\x85\x5d\x73\xa4\x61\xce\xaf\x54\xb7\xf8\xf8\x2d\x04\x5f\x57\x3f\x46\x74\x4f\x32\x6d\x28\xc3\x1d\x88\x95\x2c\xb8\x52\xc2\xdb\x7b\xd2\x82\x1f\x65\x2a\x84\x62\xba\x10\x14\x9d\xe6\xcc\x48\x35\xcf\x04\xe3\xd6\xf2\x64\x31\x71\x4f\x52\x9e\xd8\x75\x36\x3a\x7d\x62\x6c\x29\x78\xee\xf3\xf2\x73\x2e\x71\x28\xc6\x93\x52\x1b\xc3\xf2\x2a\xb3\xb2\x08\x83\x31\x23\xa0\xa0\x06\x05\x55\x20\x06\x64\xc5\xd5\x29\xec\xa3\xfa\x69\x34\x2d\x1d\x43\xd3\x81\xb5\x39\x02\x3c\xf0\xbc\xb0\xcb\x90\xc7\x2b\xd8\x4c\x96\xc6\xb2\x24\x93\x20\xad\xe1\x89\x58\x3b\x0d\xe3\x8d\xbc\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x15\x5b\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xdc\x34\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\xf0\x62\xeb\xb4\xe1\x7a\xa3\x43\x89\x83\xdf\x9c\xa3\x46\x35\x47\xad\x50\x40\x96\xde\xca\x31\x80\x05\x50\xe2\xda\xed\x01\x91\x08\x27\x5f\xf9\x2d\xbb\xfe\x93\x6f\xfa\x48\x28\xbe\x14\xc6\xf0\xb9\x38\xef\x18\x68\xb8\xcd\x22\x83\x58\x43\xbd\x30\xb0\x15\x32\xac\xae\x0d\x9f\xd4\xd9\x99\x4d\x35\x88\xe5\x38\xa7\xa0\xfc\xdc\x94\xd2\x5a\x01\x8b\x0a\x08\x7b\x10\xab\x6c\x17\xe0\xef\xb6\x72\x3c\x5f\xfa\x41\xea\x1f\x3b\xa6\xae\x52\xcc\xb8\x9c\x0a\x36\x2d\xa5\x98\xb1\x99\x84\x34\x4e\x48\xac\x1c\x21\xe0\x12\x47\x2f\x80\x31\xce\xde\xd5\xca\xeb\xb2\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\x4a\x78\x84\x65\x0b\x15\xa6\x72\xc6\xe6\x90\x98\x49\xda\xe2\x1f\x9f\xfc\xe5\xcf\x6c\xba\x74\x22\x0d\x34\x2b\xab\x2d\xcf\xc2\x4b\x66\x42\xcd\x1d\xad\xf0\x78\x36\x6b\x24\x03\x05\xa0\x9b\x07\x4e\xfc\xe9\x97\x57\xd3\xa6\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\xfa\xa3\x74\x4f\xd9\xee\x68\x12\xad\xd9\x66\x3a\x93\xc9\xb2\xf7\x46\xf3\xc8\x5f\x6c\xa1\x6f\x50\xd7\x5f\xb3\x7b\xea\x72\xab\x42\x17\x55\x86\x4e\xe7\xe7\xa1\xba\xb8\x32\x62\xb5\x06\x70\xed\xb9\x00\x37\x29\x0d\xd1\xc6\x4d\xc7\x7c\x5c\xff\x48\x4d\xb5\x25\xe4\xc8\x0b\x00\x60\x60\x08\x3d\xe7\x59\x36\xe5\xc9\xd5\xa5\x7e\xa1\xe7\xe6\x95\x3a\x29\x4b\x5d\x36\xe7\x92\x71\xc7\x2d\x17\x95\xba\xc2\x0e\x0e\x01\x22\x41\xcf\x9d\x6a\x55\x54\xd6\x17\x32\xac\x7b\x61\xac\x97\xf7\x4c\xd8\x9b\x41\xf5\x28\xe2\x9d\xac\x6d\x1d\x2a\xd5\xc2\x1d\x19\x8f\x6f\xe2\xcd\xf6\xe5\x93\x3f\x7e\x8d\x5b\x97\xe9\x92\x7d\xfd\x04\x72\xb6\xcd\x08\x0f\x31\xf0\x36\x27\x28\x72\x9e\x65\xce\x6c\x88\x37\xa5\x23\xf4\xba\x4d\xf8\xc9\xf7\xa0\xed\xbf\xdd\xee\xac\x4a\x5d\x5e\xfe\x03\xf4\x28\x69\x8d\xc8\x66\x23\xac\x4a\x0a\x66\xcd\x2e\x08\x86\x5d\xe2\x3e\x50\x1a\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x26\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x05\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x12\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x46\xa8\xe4\x37\x0d\x62\xc0\x99\x04\xb8\x82\x9e\x78\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\xc7\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x63\x43\xd4\x03\xfa\xd3\x50\xc0\xbf\xb1\xaa\x64\xa5\x2a\x32\x14\xd6\x85\x8d\x81\x0a\x80\xdb\x3e\xc0\x92\xbb\x3b\x5c\x07\xf0\x6e\xf6\x4b\x39\x6a\xd0\x45\x05\xaf\x72\xce\x2d\x29\x84\xde\x7d\xcd\x59\x21\x4a\x23\x8d\x93\xcb\x3f\xc0\x81\x3a\xca\xb8\xcc\x23\x17\xe0\x66\x88\x80\x87\x1b\xe0\x93\xfb\x73\xca\x73\x9d\xd2\x80\xc0\x0a\x11\x3a\x7a\x8d\x5a\xdb\xd4\x6a\x07\x14\xa8\x9b\x66\x95\x3f\xd4\xd4\x6c\x72\x4a\xf7\x49\x60\x95\x78\xd7\xe7\xc4\x20\xe1\xfd\x1e\x2b\x7f\x0c\x93\x1f\x88\x0d\x00\x63\xa4\xc5\x6d\x72\xc2\x86\xf1\x88\x07\x25\x52\xe9\xc9\x0e\x9c\x30\x8c\x82\xbb\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x2f\x9f\x16\xa5\xda\xc3\xc6\x40\x13\xce\x0c\x82\xef\x03\xec\x1a\xdc\x25\xd2\x1a\x47\x07\x50\x92\x30\x3a\xea\x09\x4c\x06\x02\xd6\x63\xdf\xf0\x25\xe3\xa5\xae\x54\x4a\xfe\xa5\xe0\xe0\x7b\xd9\x7a\xf0\x99\x56\xc2\x3b\xce\xdb\x38\x15\xe0\xd1\x97\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x48\x2a\x78\xc3\x96\xa4\x3a\x0b\x92\x0a\xf9\xd3\x46\xdf\xd5\x23\xde\x0f\xf4\xbe\x2f\xc9\xc5\x52\x03\xda\x4b\x0f\x97\x0d\x1f\xdd\x94\xd2\x8a\xa8\xc7\xdf\x1e\x18\x2e\xce\x3e\x8c\x50\x19\xf6\xd7\x75\x92\xe8\x49\xa4\x7e\x30\x18\xa6\x9a\x7e\x44\xbe\x45\x0c\x0a\x8e\xdb\x3a\x0f\x97\x79\x0f\x0b\x8b\x09\xb5\xb3\xc3\xf6\xf0\xce\x5d\x2c\x68\xde\xdf\xe8\xd6\x22\xa2\x9d\xbc\x2b\x7a\x60\x6c\xb6\x6a\xe7\x0b\x0e\x3e\xb8\x62\x40\x0a\xfe\x5d\x2c\xf8\xb5\x80\x42\x6e\x99\xf1\x32\x83\x98\xe3\x05\xce\x9d\x4d\x2b\xcb\x84\xba\x96\xa5\x56\xb9\x50\x96\x5d\xf3\x52\x02\x2a\x4e\x29\x00\xd9\xc1\xd9\xa2\xbf\xdf\xfb\xe1\xf0\x35\x24\x34\xec\x13\x24\x05\xcd\xb2\x32\x1e\xbe\x26\x9e\x49\x34\xdc\x07\x97\xcf\xcf\xc3\xd1\x10\x78\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\xdb\xb2\xbc\x4b\xb2\xca\xc8\xeb\x4d\x71\x12\xaa\xb0\x3f\x96\x9d\xd6\xb9\x55\xed\x5f\x13\x6a\xa5\x70\x1f\x5c\xeb\x6b\x0a\xf4\x56\x02\x26\xbb\x26\x14\xed\xc5\x31\x70\x72\x3d\x11\x96\x06\xa6\xcf\x79\xc4\xc5\x15\x15\x02\x70\x63\x36\xeb\x84\x52\x3a\x15\xf7\x47\xdd\x69\xa6\xf7\xd0\x10\x18\x33\x8f\x2a\xf8\x4c\xb2\x10\x69\x05\xf0\x4e\xd2\x20\x38\xaa\x33\x1f\x78\x8d\xc2\xa7\xa0\x4b\xd0\xe9\x2c\x40\x1a\xa8\x31\x38\x07\x91\xe6\xfe\xf7\xa5\x07\x40\xf0\x1f\x98\xd6\x88\x60\x94\xba\xb1\x46\x8c\x1b\x53\xe5\x78\x24\xb0\x01\xc2\x4c\x5a\x13\x7a\xcc\x7a\xed\xd8\x1d\x8c\x7b\x16\x54\xf5\xa0\xef\x85\xc8\x60\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x68\xc3\x51\xc2\x04\x44\xdb\x42\x1e\xa7\x06\x2f\xe9\x4c\x42\x13\x25\x4e\xf4\xbe\x58\xf3\x4b\x54\x1d\xf0\x0e\x80\x87\xe1\x53\x91\x99\xf6\x40\xd3\x7a\x51\x08\x95\x94\x08\xdf\xb3\x4b\x2e\x37\x46\xce\x15\xf4\xcf\x74\xa3\xdd\xb3\x53\x66\x67\x9b\x69\x88\x2e\xb8\x9d\xb9\x5a\x23\x0b\x2b\xe7\xc5\x98\xac\x5e\xab\x73\x99\xdc\x63\x24\x7d\xcf\x29\xb7\x6a\xa5\x1b\x35\xb8\xaf\x2e\x56\x3c\x3e\x26\xf2\x6a\x4c\xd8\x85\xce\x29\xc5\x49\x45\x5d\xbc\x7c\x33\x55\x27\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xd7\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x7e\x92\x9a\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\xfa\xbd\x0d\x29\x30\xcf\xd8\xb8\xd5\x99\x76\xd2\x04\x0d\x7d\xff\x73\xe8\xde\xd1\x87\x9f\x82\xf9\x39\x00\xc7\x77\x7a\x1c\xff\x79\x7a\x7e\x14\xff\xf9\xc6\x38\x2a\xd1\x07\xed\xa9\x35\xbb\x32\xdc\x7e\x57\x8c\x8f\x7d\xdb\x5d\x33\x6c\x6c\xf4\x81\xaf\x8f\x16\x5c\xf9\x40\xd6\xad\xcf\x5b\x9a\xc4\x66\xf5\x74\x16\xbc\x14\x84\x1f\xe7\x38\xb9\x29\x78\x72\xeb\x2c\x02\x58\xdb\x7b\x6f\x78\xef\x4c\x4d\x55\xf8\x86\xdb\x19\xdc\x18\x66\x52\x6f\xbb\x9f\xfe\xf0\xf3\x1d\x89\xf9\xa1\xdf\xac\x23\xed\xfb\x7f\xd3\x68\xdb\x77\xa7\x5f\xac\x6f\xea\x75\xb7\xdf\x46\x7d\xf1\xee\x74\xff\x6d\x3d\x79\xef\xfa\x34\xdf\xcb\xed\x6e\x2f\xd6\x5e\xed\x3b\xdc\x0e\x4b\x7a\x3f\xb4\x82\xce\x2c\xbc\xab\xbb\xab\x83\x93\xaa\xbb\x73\xaa\x9b\xb1\xdf\x52\x00\x6e\x81\x32\x25\x98\x35\x35\x67\x0d\xf0\xa8\xaa\x2c\x85\x82\xb6\xf7\x15\x64\x3a\xfa\x76\xf6\xc8\xa4\x81\xd9\x12\x50\x27\xa2\xcd\xb3\xc3\x20\x0b\x29\x03\x2e\xe7\x00\xde\x19\x81\x55\xcf\x2a\x48\x68\x04\xd6\x8f\x60\x74\x5a\xb9\x79\x3c\x5b\x87\x90\xa1\x0b\xa1\xa2\x5e\xf7\xa4\x35\x8f\xdd\x1e\x6a\x60\x66\xa0\x22\x30\xc9\xd3\xdf\x15\x19\xb7\x33\x5d\xe6\x63\xaf\x1e\x8e\x1b\x4a\x02\x3b\x82\xd4\x1a\xe3\xed\x2b\xcc\x6f\x45\x50\x4d\x95\x66\x22\x92\xe6\xe1\x55\x55\x8a\x10\x54\xac\x52\xa5\x48\xf4\x5c\xc9\xff\xd4\x84\x00\xb9\x16\x9c\x43\xdc\x38\x49\xca\x54\x95\x65\xf7\xcf\x43\xe8\xa8\x04\xe8\x6b\x51\x2e\x04\xbf\xe7\xe6\x6d\xa5\xb4\xd0\x18\x75\xef\x51\x43\x98\x02\xa4\xf2\xfa\x87\x38\xd5\x58\x27\x50\xdb\x86\x21\x76\x9f\xb8\xcc\x41\xa0\x3b\x4d\x8f\xb3\xb9\xbc\x16\xca\x43\x8e\x1f\x65\x3c\xf4\xcf\xf6\x28\xab\x04\x7b\x5e\x59\x1d\x92\x16\x18\xb7\x11\xf0\x31\xe4\x38\x51\xbc\x34\x1e\x27\xba\x85\xba\x6f\x67\xbe\xd3\xd9\x5d\xee\x84\xbc\x01\x6c\xfd\x38\xaa\x5f\x29\xf7\xbe\xd5\x06\xb2\x26\x4b\x20\xbb\xc5\x9b\x22\x94\xd5\xf2\xe1\x47\x50\x4a\x9a\xe3\x41\xeb\x86\x21\x75\x39\x40\xc0\xd6\x84\xcd\x1c\xfb\x5f\xa2\x92\x73\x3a\x6b\x3e\x49\x36\x40\xf7\xa1\xf6\x09\xd4\xef\xda\x1e\x3c\xd7\xa9\xd3\xc2\x46\x2c\x2c\x65\xdc\x7c\x9c\xe2\x2d\x78\x26\xa3\xc3\x88\x4a\x5a\x59\x0a\x53\x68\xc4\xfe\x8f\x1f\x3b\x8a\xfc\x5f\xd2\x36\x92\xed\xb0\x8b\x5b\x38\x1a\x88\xce\xf6\x1f\x51\xea\xb5\x3a\xfc\x5c\xda\xc9\xd5\xd7\xa0\xc0\x0b\xb5\xe0\x2a\x41\xdb\xe9\xe0\x4a\x14\xe6\xc0\xc8\x39\xea\xeb\x7f\xfe\xfa\x6b\x50\xde\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x23\xd2\xe4\x0b\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xf9\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x4b\xe9\x5b\x8b\xd2\xab\xfe\x64\xc0\x9a\x93\xa2\x14\x22\x07\xf6\xd7\x25\x5b\xab\xe9\x25\x6d\x0d\xe5\x05\x2c\xfd\xe5\x78\xa2\x7f\x9a\x9a\x3b\x36\x69\x90\x75\x66\xfa\x06\x32\x2c\xa5\x76\xca\xcf\x84\xbd\x02\x39\xc8\xce\xc4\xb5\x28\x47\x7e\xd4\x17\xee\xa6\xf3\x70\x4f\xec\x86\x5b\x77\x47\xc7\x1c\xff\x8e\x6b\xe2\xe7\xde\x83\x78\xd8\xb7\x84\x26\x0f\xfc\x69\xc2\x7e\xe0\xa5\xd4\x95\x21\x5d\x24\x86\xfb\xc6\x14\xb2\x20\x49\xc0\x2b\x41\x01\x9e\x30\x48\xa8\x0c\xf3\x31\x9e\x40\x9b\xc3\xc0\xaf\x8f\xd6\x8b\x04\x69\xdd\x4a\x5d\xfb\x47\x95\x3e\xd5\x75\x05\x29\x1c\x85\xc1\x5a\xfe\xef\x25\x9a\x89\x27\x0a\xc3\xf8\x79\x00\x6f\x75\x9a\x18\x8e\xb2\x90\x73\x9f\x50\x0d\xef\x8f\xe6\x6b\xf4\x69\xd8\x21\x1d\x96\xb4\xcb\x31\xed\x9a\xd7\x5f\xb4\xdf\xaf\xc7\xb6\x68\xe2\x29\xc7\x90\xcc\xbe\xa2\xa8\x3e\x37\x3b\xb8\x4f\x40\x88\x8c\x93\x52\x5a\x99\xf0\x6c\x07\x84\x93\xff\x2a\xc9\x2a\xa7\x27\xc6\xdf\x96\x82\xd9\x1b\x8d\x4f\xe1\x19\xbb\x12\xcb\x1b\x5d\xa6\x5e\x3e\xfb\x27\xd6\x6b\x61\xac\x7f\xa4\xb3\xe7\xe0\x00\xa3\x9b\xa1\xcc\x45\xc9\xa6\xc2\x7b\xd0\x5b\x37\x2f\x27\xec\x50\x2d\x29\xfc\xa8\xe2\x22\xc3\x08\x99\x0d\x74\x04\xd4\xa2\x1a\x9b\x84\x84\x98\x7f\x1a\xc7\xf2\xcf\xdb\xbc\xcb\x4e\x01\x0b\xa7\xc0\x4b\x7f\xef\x5e\xd6\x25\x55\x39\xc1\xe9\x28\xb1\x46\x4b\xfb\xaf\x3f\x09\xb7\x70\xfa\x8d\x54\xc2\x98\x6f\xdd\x52\xf6\x51\x57\x9b\xbb\x83\x83\x5a\x42\x63\x43\xa5\x54\x9d\x52\x2c\xdc\x91\xc2\x18\xb1\x63\xc3\x3a\xad\xef\x9c\xb0\x43\xf8\x00\x72\xe2\x9d\xe6\x05\x55\x74\x6e\x30\x69\x4d\xbb\xb9\x3c\xde\x71\x78\x76\xec\x73\x97\x51\x53\x30\x4d\xb8\x74\x54\x99\x9b\x33\x01\x4d\x8f\x32\x68\xc5\xbf\x2b\x0e\x7d\x72\x77\x2e\xcb\x4a\xec\x74\x53\x95\x10\x88\xff\xe0\x4f\x5f\x3f\x01\x6d\x29\x3c\x6f\x0c\xcf\xeb\xa2\x2a\xdd\x3f\x47\xa6\x53\x76\x4c\x3b\x31\xe8\x75\xbc\x1f\x3c\xc1\xbd\xdd\x41\x41\x2b\xa8\xed\x85\x65\x0a\x34\xef\xe4\x5a\xed\x94\x0b\xd3\x3d\x0b\x66\x5c\x4f\xf7\xf2\xfe\x3d\xcc\xfa\x24\xb0\x34\x9e\x3b\x44\x94\xab\x1e\x0d\x57\xc5\xe0\x92\x84\xe7\x44\x9e\x5d\x6c\x75\x41\x1f\x43\x3a\x2c\x30\x2e\x88\x0a\x00\x7b\x5c\x16\x3d\x52\x7f\x3b\xf0\x1b\xa8\x74\xe9\xad\xdf\xed\xbe\xc6\x81\x58\x51\x2b\x74\x2b\x15\x0c\x21\xc2\x0b\x7a\x07\xa9\x72\x87\x50\x0e\x36\x62\xaf\xd4\x73\xcc\x8f\x1f\xa1\x76\xd7\x40\x1f\xc1\x9b\x06\x2d\x13\x3c\xf8\x1d\xbd\xfb\x18\xa7\xdc\x85\x29\xdc\x9f\xdc\x91\xe5\xd8\x53\xfa\xef\xbe\x6e\x8d\xd5\xd8\x7a\x0d\xcb\x98\x24\xa4\xac\x7b\x9f\x11\xfb\x64\xf3\x52\x57\x85\x8f\xa4\x36\x1b\x99\xd5\xdd\x3b\x30\x00\x88\x7d\x7e\x95\x6e\x0e\x1d\x9c\x1f\xb0\x81\x45\xed\x35\x4b\x59\x82\xe6\xb1\x97\xba\x58\x05\x85\x1e\x84\xb2\x52\xcd\x3e\xe7\x51\x2c\x72\x27\x13\x73\x9e\x2c\x77\x9a\xcf\x59\x17\xf9\x95\x50\x9c\x23\x73\x04\x4c\xc7\xe7\xd5\x35\x0d\x50\xfa\x00\xfa\x03\x9e\x35\x50\x0d\x2a\x43\x53\xf4\x22\xdf\x17\xe5\xa1\x67\xab\xec\x61\x99\xff\xe9\xeb\x3f\x8d\xbd\xef\x0d\xa6\xf2\x49\x36\x54\x88\xdc\x0e\xaa\x4b\x36\xd6\xcc\x29\x48\xd2\x14\xb0\xbe\xa0\x89\xd5\xe2\x3c\x3c\xfd\x7d\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x12\x72\x35\xbd\xe8\x7d\x8e\x5f\xbb\xed\xcb\x42\x67\x29\x1c\x14\x6a\xce\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\xcd\x24\x35\xc8\x9b\xb0\xba\x68\x2e\x36\x61\x61\x27\x4f\x18\xbb\x10\x02\x9b\x43\x46\xf3\x00\x3e\xeb\x49\x49\xde\x56\x3d\xc3\x4e\xde\x68\x84\x7d\x22\xb7\x50\x77\x71\x4c\xc1\xb4\x9e\x5e\xfb\x9d\xc3\x60\xa5\xc4\x31\x2f\x64\x70\x2b\xfd\x7a\x5b\x92\x09\xd2\x89\xeb\xa8\x2b\x65\x17\x39\x5a\x18\xc4\x88\x85\xbd\xfc\x3d\xf6\xf6\x84\xd4\x49\x88\xfc\xa1\x6f\xf2\xc6\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\x10\xdf\x7d\x1d\x43\x2f\x40\xb3\xca\xa7\x68\xd4\xea\x1b\xf0\x0a\x7f\x7b\x7a\x1c\xce\x88\xbb\xeb\xf9\x05\x86\xf4\xbe\x9c\x50\xeb\x5d\x3b\x97\x29\x9b\x62\xe2\x86\xe3\x97\x7b\x4a\xdc\x60\x2a\x38\x39\x4e\x83\x5e\x7d\xed\x53\xa4\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\x4d\x50\x45\xe9\xad\xf2\xa9\xa4\x54\xd1\x57\xaf\x77\xbd\xbb\xfa\x66\x5c\xde\x8c\xc7\xe3\x31\xc5\x77\x81\x4b\x8f\x1a\x34\x08\xcc\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\xdb\xbc\x7e\x04\xec\x48\xae\x96\x34\xbb\xfe\xfd\x7a\xef\x0f\xcf\xdd\xcf\x1d\xd7\x07\x8e\x61\x4d\xa8\xb8\x6f\x7c\x6a\x5d\xf4\x19\xed\x64\x53\xa3\x9a\xeb\x19\x6e\x52\xc8\x9e\xbf\x65\x61\xbc\x17\x88\x76\x0d\x61\xf5\xa1\x95\x2e\xde\x15\x1a\x91\x80\xa1\x3a\x05\x3a\xb6\xb5\xc3\x13\x90\x11\xea\x4e\x15\x24\xd9\x35\x4e\x0d\x29\x14\x18\x11\xf3\x44\x60\x53\xee\x86\x0c\xd3\xd9\x6b\xed\x93\xfd\x09\x3b\xa5\xad\x05\x06\xa1\xd2\xd4\xf7\x8d\x69\xc5\x44\xb1\x10\xb9\x28\x79\xd6\x7c\x10\x55\xe9\x3e\x73\xec\xb6\x74\xbb\x14\x43\x00\x39\x2f\x90\xdb\x02\xf3\x4c\x65\xe9\xfb\xc6\x46\xa1\xb9\x9d\x57\xea\xb5\xd6\xf6\xa5\x34\xa0\xbb\x90\x33\x04\x35\xcd\x9d\x75\x02\xcd\x7f\x57\xa7\x3c\xf7\xdd\xc9\x9f\x2c\xfe\xc5\x7c\xef\xb7\x21\x78\xad\xe3\x20\x8e\x69\xdd\xb7\xbd\xdb\x1b\x02\xf1\x69\x74\xd1\x0d\xbe\xd8\x75\xcd\xdb\x56\x3a\xb7\x7d\xe2\xd6\x6d\x94\x95\xc5\x6d\x03\x2d\xeb\x53\xb7\x1b\xdf\x1c\xf7\x82\x2d\x73\xa6\xe1\x9c\xf4\xdc\x34\xa7\xab\x1d\xe3\xea\x2d\x02\xee\xbe\xd0\x0a\x53\x69\x35\x86\x0e\x4e\x95\xf1\x81\xcb\xd2\xbb\x7c\x1b\x02\x88\xda\x4a\xa2\xd8\xc4\xd6\x80\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xa1\x98\x6a\x51\x77\x73\xe2\x86\xbd\x39\x3d\x66\x4f\xd8\x1e\x64\xe7\x86\x0a\x6d\xc4\xa4\x70\xa6\x6c\x2b\x85\x74\xe6\x87\x68\x9a\x2e\x04\x08\xa1\x34\xf2\x22\xdf\xea\x52\xab\x20\x86\x09\x58\xf3\x96\x06\x85\x9b\xde\xe3\x5d\xf7\x63\xb7\x1c\xfc\x90\xe5\x32\x00\x0f\x7a\xd3\x81\x07\xc5\x8a\xf5\x10\xed\x25\x37\xbd\x7a\xbf\x75\x0e\xd5\x4c\x54\x1b\x60\x53\x5d\x9c\xc0\x80\x08\x06\xf1\xce\x92\x1a\x7f\xcf\xde\xe5\xab\xa0\x3f\x84\x7c\x14\xf0\x01\x4a\xae\x52\x9d\xaf\x3c\xcd\xad\x26\x18\x6f\xd1\x6a\x6e\xb7\xdd\x6d\x57\xaf\x12\xce\x7e\x15\x90\x60\xe3\x0f\x50\xfa\xfa\x02\x7c\x05\xd2\x84\x9d\x80\xce\x03\x48\x0a\x5f\x31\x5b\x7b\x23\x23\xf4\xae\x04\x2a\x75\xd6\xb1\x98\xae\xf1\xd6\xaf\x75\x46\x45\x0c\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\x30\x41\x9b\xbd\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\x49\x4a\xb3\xf6\x5b\x43\x4a\x6b\xe3\xad\x41\xee\x3e\xc4\xb7\x6e\x66\x30\x0f\x20\x4c\x68\x40\xa6\x29\x8f\x9a\x3a\x09\xb4\x41\x4e\xea\x0c\x49\x70\x42\x3d\x2e\x3e\xda\xa7\x0c\x1e\x13\x9d\x3e\x35\xeb\xd6\x09\xcf\xa8\xf7\x7f\xb7\x75\x66\xed\xb5\x6e\x0f\x19\x25\x63\x70\x37\x5b\xf8\x2c\x4a\x29\xe4\x88\xd0\xa4\xeb\x80\x4c\x2b\xf8\x42\x6e\x3a\xfa\xa5\xcf\x86\x70\xf2\xb7\xce\x70\x8c\x7f\x6d\x35\xb5\x96\xf5\x48\xf0\x1c\x26\x28\x30\x5f\xb1\xe0\x76\x31\x62\xa5\xc8\x10\xdc\x95\xce\xd9\x15\x9a\x52\xbb\x8d\xb4\x49\xbf\x63\xfd\xa3\x41\x61\x81\xd6\xd2\x30\x32\xb8\x7c\xbc\x1a\x32\x43\xfe\x25\x0d\xdb\x79\xe1\x09\xb0\xf3\x98\x19\xf4\x0e\xbe\x4f\x58\x3b\xf4\x62\x5d\x49\x95\x12\xea\x69\x83\x34\x21\x45\x17\x75\x43\xef\x61\xf2\x67\x9d\x97\x02\x9c\xbd\x81\x34\x6c\xdc\x79\x33\x50\x28\xcc\x07\x44\xc7\xb7\x28\x99\xde\xa7\xe2\x1f\xd2\x1e\xe6\x8d\x82\x95\x56\x50\xff\xa0\xf4\x9a\xfb\xfc\xbb\x74\xeb\x80\xd8\x87\xf5\xae\x14\xaa\xf4\x64\xbf\x87\x01\x6b\x6a\x8e\x75\x2f\x91\x0a\x5f\xe3\x51\x92\x5d\x48\xed\x9d\x5b\xaa\xf7\x08\x56\x87\xf2\x5d\x57\xa4\x13\xa6\x57\xe5\xbc\x5c\xb2\x6f\x4f\x8f\x51\x03\x6f\x18\x02\x4a\xfb\x47\x87\x9d\x92\x12\xe4\x20\x57\xcb\x07\xa0\x38\x77\x83\x7d\xe9\x0c\xfa\xd2\x17\x4e\xb7\x97\x99\x88\x65\x58\x3d\xf7\xd4\x05\x15\x73\x2d\x74\x96\x32\x1e\x36\x98\xf2\x85\x5c\xa9\x7f\x0e\x06\xd0\xa3\x92\xce\x89\x33\xbe\x28\x38\x5d\xa9\xba\x52\xc4\xdf\xbf\xd7\x56\x09\xfc\x99\xde\xa7\xfa\x66\xef\x99\xca\x78\xa5\x92\xc5\x6f\x65\xcb\xac\xa1\x7e\x08\x75\x70\x76\x25\x4a\x25\x32\x56\xf0\x92\xe7\xc2\x86\x0e\x86\x46\x74\xc1\xf3\xe9\x09\x07\xd4\x0f\x0c\xa8\x07\x90\x4f\xf7\x4e\x84\x7d\x21\x80\xfa\x00\xab\xac\x69\xcf\x36\x43\xe9\xe8\xa6\xb4\xa4\xae\x9d\x1d\x07\xef\x8d\x76\xd1\xab\xb7\x60\x13\xd9\x0a\x61\xf9\x1f\xc4\xbb\x35\x6b\x77\x07\xb0\x6e\x7e\xc4\x01\x6b\x90\x01\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\xa1\xbd\x76\xcd\x8a\x2b\xaa\xd9\x07\xe1\x13\xfb\xca\x3b\xf3\x5d\xa8\x03\x7c\x54\x1e\xae\x79\x6e\xf8\x51\xe9\xde\xdb\x4a\x9e\x5d\x14\xa2\x63\x67\xfe\x66\x5f\xfe\x97\x17\x87\xcd\x41\x41\x28\x41\xb2\xb5\x5b\x13\xf7\x7d\x54\x32\x70\x23\xa6\x0b\xad\xaf\xd8\xde\x9a\xb2\xc7\xa8\xca\xc5\xc8\xb9\x39\xa0\xed\x3d\x76\xf3\xde\x67\x52\x01\x3e\xed\x2a\xae\xaf\x7f\x48\x12\x66\x01\x6b\x45\x39\x6b\x24\x86\x57\xa7\x09\x3c\x0a\x33\x6a\x36\x61\xe0\xac\x2e\xc6\xfd\xf3\xbd\xfc\xf5\x81\x05\xb9\xad\xfc\x75\x2d\xd5\xd0\xa1\xb1\x11\x92\x90\xb9\xed\xd4\xf7\x01\xe8\xf0\x5d\x3d\x5a\x0c\xa7\x26\x67\x0d\xa4\xf7\xda\x50\x0a\xc1\xca\x5d\xe8\x38\x45\x3f\xdd\x8d\xb5\xfa\x26\x1e\x1a\xcf\x8a\x05\xa7\xd4\x30\x2c\x07\xf6\x19\x14\x53\xc1\x16\x5a\xe9\x92\xca\x1c\xea\x42\x1e\x60\x33\x58\x77\x03\x2b\x40\xfc\x36\x9a\xea\x51\xed\x41\xf2\x4d\x50\x66\x19\x9f\x43\xc7\x9a\x56\x35\x0e\x30\x57\x5d\x61\x54\x33\xbe\xd9\x97\x2c\xfa\x6e\x0c\x00\x06\x6d\x90\x8b\xf9\x60\x26\x95\x6d\x40\x16\xc8\xa1\x9b\xb7\x23\xcb\xb9\x4f\x66\xf6\x53\x00\x37\x45\x28\xda\x34\x6e\xef\x60\xfe\x86\xbc\x16\x0d\x02\x23\xe7\xdd\xf3\x50\x34\x16\x93\xac\x50\x5e\xc0\xef\x39\xcb\xe5\x3b\xf7\x94\xf8\x57\x71\xb5\x81\x4a\x21\x4a\xbc\xfe\xeb\x7d\x67\x8c\xd5\x96\xdb\xc8\xad\x62\x7c\x67\xd4\x29\x41\xc1\x17\x67\x58\x2e\x80\x2f\x10\x47\x5a\xa8\xe9\x41\x9f\xfd\xdd\x1d\xaa\x2c\x84\x4a\x07\x3a\xea\x10\x32\xa5\xe1\xdc\x42\x7b\xf1\xdd\x27\x84\xea\x6e\x19\x22\x8c\xba\x2a\xa3\x3f\xb9\x68\xff\x94\x3c\xcc\x88\xf2\x5a\x26\xe2\x30\x49\x74\xa5\x7a\x65\xa1\x1e\x0b\xf7\x0a\xdc\x8a\xf4\xa2\x31\x26\x7a\xdc\x53\xf8\x16\x2b\xd1\x79\x26\x39\xc2\x0c\x35\xef\xc4\x22\xbb\x7a\x1c\xf0\xd8\xb7\x66\x48\x5b\xc6\x58\xc1\xbb\x65\x94\xf6\xa4\x50\xdf\x54\xf9\xd5\x37\x5e\x27\xe1\x5a\x14\x24\x67\xfd\x4a\x1a\xfc\xdd\x6a\x10\x2c\x37\x57\x35\xf8\x92\x80\x32\xa4\x70\x98\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x90\xa9\x03\x75\xad\xe3\x7b\xee\xe5\x0f\xcd\xf3\xff\x75\x7c\xd6\x2f\x73\x3c\xf4\x9d\xc1\xfa\x96\x05\x0d\x1d\x54\xf5\xb8\x2c\x3f\x2e\x4f\x74\x4f\x1e\xb1\x92\x13\xa4\x3e\xb5\x53\xcb\x04\x47\x9f\x0a\xdb\x8b\x32\xf5\xf7\x27\x8e\xa7\xd7\xd1\x72\x64\xf5\xd4\xfd\x2c\x17\x5c\x99\xa8\x04\x55\xc0\xd0\x3e\x2b\x36\xcc\x07\x05\x21\xad\x36\x79\x0f\xf6\xbc\xd3\xb5\x79\x87\xb1\x65\x95\x58\x56\x59\xe3\x3e\xc7\x87\x7b\x86\x79\x87\xc7\x97\x62\x2e\x8d\x2d\x97\xbe\x2f\xdb\x2c\x9a\x04\x79\x85\xc2\x2d\x57\x62\xc9\xbe\xfb\xfe\xe4\x1f\xbf\xbc\x78\x75\x74\xf8\xe2\x97\x97\x87\x47\xdf\x9d\x9e\x9d\xbc\x7d\x7b\xf1\x8f\x8b\xcb\x93\x97\x6f\xdf\x1e\x21\xc2\x08\x95\xe3\x5e\x08\xfb\xf6\x2d\xed\x54\xf3\xf6\xed\x65\x52\xc8\xe2\xed\xdb\x73\xef\x03\xc1\x8e\x0b\xff\xeb\xf8\x0c\xf8\x27\x56\x85\x85\xb4\x27\x90\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xa5\xb3\xab\xb8\x5b\x0b\x89\xd4\xeb\xb0\xbb\x01\xeb\x56\x49\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\x32\xc6\xb5\x20\x5c\x3c\x2a\x8c\x8e\x70\xb5\xd6\xb5\x63\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x73\x02\x3b\xdf\xd5\x3d\x81\xa0\xac\x19\x4b\x5b\x57\xa1\xbe\x40\x49\x2a\x74\x1a\xfa\x1f\xb5\xfc\xd2\x2b\x3e\xe9\x46\x19\x0d\x82\xb9\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x5b\x72\x2d\xd2\x94\xb7\x54\x9d\x40\x45\xe9\xbb\xa6\xea\xa0\xde\x00\x5d\x98\x51\x87\x1d\x50\x4d\x53\x9d\xf3\xfb\x76\x3a\xfb\x40\xfd\x0a\xf6\xa1\xfc\x77\xc5\x33\xd4\x01\xce\x75\xba\xca\x99\x76\xfe\xea\x3f\xfa\xdb\xe4\xaf\x61\x1e\x7f\x9b\xfc\x15\x3a\x5c\x7a\xb2\xfd\x6d\x62\xae\x93\xc9\x5f\xa9\x40\x9a\xd1\x4d\x6b\x73\x84\x57\xaa\x9d\x48\x9f\xc5\xdf\xc0\xb3\x39\xe8\xbb\x9f\xa4\xdc\x65\xc0\x56\xa1\x03\x37\x08\x45\x2d\x10\x6a\xaf\x93\x52\x70\x4c\x35\x67\xa9\xc8\x44\x8d\x03\xf3\x00\x3a\x54\xde\xde\xb2\xd3\xc7\xda\x1a\x0d\x4d\x63\xdf\x54\xd0\x97\x7e\xf3\x7d\x4f\x63\x83\xe1\xab\xba\x8d\x7c\x87\x03\xd0\x13\xa9\xe1\x5e\x61\x23\xab\x33\x81\xeb\xd3\xe7\xa4\xac\xad\xab\xdb\x35\xf1\xe8\x5d\x08\xb1\x89\x6a\xf4\x4b\x8f\x4e\xea\x76\xc4\x65\x98\x3f\x58\x1a\xd8\xcf\x0f\x83\xab\xf8\x0d\x54\xbb\x2d\x99\x93\x5a\x16\x3d\x19\x71\x85\xa8\x2d\xa1\xf3\xe0\x5f\xaf\xc4\x72\x84\x80\x1e\xa8\x84\xfc\x2d\x82\x59\x0e\x25\xd1\x08\xbc\xa6\x4b\xf6\x57\xff\xaf\xbf\xdd\xd7\x5a\xeb\xe1\x47\xed\xe3\x45\xc5\x97\xea\x1d\xf9\x3a\xc1\x2a\x98\x26\xc2\x07\x52\x96\x0a\x64\xac\x46\x72\x4d\xd8\x09\xd4\xbd\xa2\x46\x4a\x50\xb3\x59\xd6\xb8\xd9\xf8\xb6\x91\x0d\x74\x08\xf0\xbf\x44\xd5\x31\x67\xfa\x82\x2a\x33\x01\x66\x67\x26\xca\xfa\x13\x60\x30\x67\xfa\xe4\x9d\x48\x2a\xfb\x29\xab\xd5\xf1\xba\x12\xfd\x1b\x79\x7d\x2f\x02\x04\x11\xd2\xc6\x69\xe1\xa1\x32\xa1\x3e\x9d\x51\x72\xda\xfb\x69\x7b\x25\x96\x26\x80\xac\x5d\xe1\xe8\x54\xd5\x1c\xf6\xaf\x17\x64\x27\xef\xa4\xb1\xe6\x7f\xfa\x2e\x62\xf9\xb4\xee\xdf\xc6\x31\x4b\xac\x1e\x3d\x02\xd8\x73\x7f\xc2\x63\x3e\x35\xc1\xfd\x0b\xf4\xa6\xfa\x2b\x4f\x89\x08\x42\x8f\xbb\x77\xda\x35\x94\x9e\xa4\x15\x14\xaa\xc5\x58\x6c\x75\x62\x0d\xfe\x18\xf7\x27\xd2\x10\xe8\x72\xe2\x94\xbc\xa6\x98\xa1\x8f\xe8\x26\x09\xa8\x22\xf2\x9a\x67\x42\x11\x34\x6d\x96\x26\xbc\xc4\x10\x3d\x01\x0a\x19\x42\xb7\x26\x24\x0d\x27\xe3\x88\x93\xd5\xab\x6c\x28\x94\xc7\x4b\x2b\x93\x2a\xe3\x25\x73\xe7\x71\xae\xcb\x7b\xe2\x0e\xe1\xd5\xaf\x9b\x5d\xd8\xa2\x3d\x9a\x3c\x37\xf9\x7b\x7b\xc4\x36\xd0\x21\x69\x2f\xce\x64\x82\xfa\x9a\xe6\x41\xd9\x6b\xa2\x63\xeb\x99\xe7\x4d\x81\x51\xc4\x50\x79\xb6\xe1\x1c\x97\x73\xf0\x7f\xef\x47\xc2\x23\x9c\xcc\x09\xfb\x7b\xa8\x16\x1f\xb1\xda\x67\x0c\x35\xa9\xf4\x4c\x3a\x36\xb4\x5c\xf5\xa1\x9e\xe9\x12\x5a\x13\xee\xa5\x1a\x7e\x23\xae\x65\x62\xf7\x27\xec\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xc7\x2c\xd4\xe1\xd6\x80\x7d\x4f\xd8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\x88\x90\x40\x1f\x59\x36\x4c\x8f\x08\xf7\x9a\xe8\x76\x83\x8d\xa2\xa6\xd8\xda\x1a\x41\xf2\xeb\xc0\x21\x03\x4f\x94\x86\x4e\x69\xc3\x73\x1b\xe2\x2c\x9e\x85\x86\x8d\xf3\x2f\xf0\xd1\xb3\x52\xcc\xe1\xfc\xe1\xe9\xf9\x84\xa7\xcf\xea\x42\x67\x7a\xbe\xbc\x28\x4a\xc1\xd3\x23\xad\x8c\x2d\x81\x35\xf4\xc1\x77\xbb\x6d\xcc\xa8\x1b\xd6\x42\xdf\x30\x4e\xe5\xec\x7a\x86\x08\x79\xba\x9a\x2f\x10\xff\x1f\x7e\xe8\x3b\xc7\xfa\x29\x92\xd1\x69\x26\xec\x22\xe0\xfb\xc3\x06\x0f\xed\x02\x60\x14\x70\x78\xdc\xf0\x25\x1d\x26\x3e\x95\xa9\x30\x51\x8e\xb2\x9f\x0c\x86\x7e\x6e\x7d\x7f\xe0\xca\x87\x67\xc7\xf7\x6d\xaa\xb0\x41\x85\xf6\x96\x57\x09\x9a\x11\x52\xbd\xa6\x6f\xd0\x48\x81\x6e\x3c\xd7\xa4\xa9\x22\x96\xab\xa7\xcc\x27\xd4\x4d\xfb\x80\x2f\xe5\xfc\xdd\xc5\x95\xb8\xe9\xf0\x4b\xff\xa2\xdf\x8b\xfb\xa7\x82\x8d\xc1\x1e\x7d\xa3\x0c\xb7\xd2\xcc\xa0\xfb\xca\x27\xd4\xc7\xa1\xe8\xa0\x5b\x93\x08\xbc\x9a\xb5\x3b\xf1\x68\xbe\x28\x3c\xe0\x2d\x36\x36\x0b\xe5\xff\xd5\x76\x10\x0a\x40\x2c\x82\x08\xfd\x25\xdc\x09\x4a\xa8\xe7\x92\xd5\x75\x1c\x1a\x23\x15\x55\x3e\x15\x65\x38\xfb\xe8\x0c\x90\x65\x0b\x9a\xb6\x75\xf6\xbb\x33\xc6\xce\x99\x70\x7d\xd3\xca\x80\x3c\x27\xef\x9c\xe6\x61\xba\x25\x2a\xe1\xd5\x6c\x99\xd6\x1a\x14\xc3\x63\x3e\x81\xb3\xb5\x0c\x8d\xd6\x25\x60\xf6\xc6\x9f\x74\xe5\x73\xf5\xd5\xaf\xe9\x22\xeb\xd7\x78\x91\xad\x49\x94\xbe\xf5\xf5\x5b\xfd\x4f\xe2\x82\x3f\x72\x0a\x99\x11\x2a\xf0\xe8\xc0\xe6\xaa\x16\xec\xd4\x0b\x3f\x0b\xda\x9c\x33\x8a\xdc\x4d\xf8\xbb\xbe\xdd\x8d\x7a\x34\x6e\x64\x03\x34\x6f\x64\xc0\xcb\xae\x3a\x70\xc0\xf8\xf7\x9e\x58\x9d\x07\xe9\xdf\xc6\x91\x75\x37\xa8\xeb\xab\xb1\xa1\xae\x6a\xd3\x1a\x77\x56\xc3\xb4\xae\x99\x5d\x6d\x58\xf7\x7a\xf6\x00\xbd\xcd\x58\x4f\x1b\xb7\xbe\x1a\x84\xd0\xf7\xb0\x76\x39\x04\x98\xf4\xcc\x9f\x8e\xb5\x36\xef\xa9\x1a\xb1\x33\x6d\xdd\x7f\x22\xf3\xf7\x58\x0b\x73\xa6\x2d\x7c\xf2\x20\x48\x89\xaf\x30\x20\x21\x7d\x1b\x01\xc0\x7b\x03\xbe\x49\x21\x5a\x27\xf1\x3c\xc1\xd6\x18\x16\xa7\x8a\xe9\xd2\x53\x2c\x58\x17\x86\x86\x88\xc3\x0a\x84\xb1\x75\xab\x71\xe2\xc6\x89\xe9\xfc\x9e\xe1\x68\x28\xc8\xfe\xc2\x6f\x00\x3c\xb5\xc8\xa0\x40\x20\xad\x4a\xc4\xb0\x75\xba\xa6\x15\x73\x99\xb0\x5c\x94\x73\xe8\x05\x9d\x2c\x86\x58\xbe\x3e\x72\x05\xaf\x9e\xd2\x25\x9e\x4c\x8f\xbd\x04\x22\x1b\x54\xac\x01\x55\x00\x1c\x0f\xc5\x5a\xce\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x59\xc1\x65\x09\x98\xb7\x14\x3b\x8e\xbf\xa3\xe8\x4b\x3c\x8c\x1b\x61\xc5\xb7\xc4\x15\x13\x58\xc9\xe4\x46\x6f\x2b\x1e\x23\x76\xb3\xd0\x06\x85\x61\x70\x7f\xec\x5c\x89\xe5\xce\x68\x65\xeb\xed\x9c\xaa\x9d\x3a\x30\xdc\xd8\x6c\x41\x08\x43\x06\xe1\x0e\x7c\xb7\xf3\xf1\x74\x95\x5e\xc2\x76\x88\x8e\x01\xed\x09\x75\xdc\x57\xf5\xe2\x7d\x2f\x96\xfd\x3d\x66\x2f\x1b\xc3\x79\x65\xc9\x92\x8e\x5e\x4b\x3f\x83\x39\xff\x19\x78\xea\x17\x64\x76\xeb\x6b\xe1\xfb\xc2\xa1\x79\xe9\xf8\x42\xc8\x98\xe1\x59\x82\x3d\x3f\x70\x51\x61\x10\xb7\x98\xde\xc4\xc8\xb4\xbe\xaa\x0a\xbf\x29\x42\x6f\x5f\xa9\x12\x9d\x93\xd1\x41\x9d\xe5\xdc\xbe\xa2\x1d\x37\xa6\x38\x1e\xee\xde\xb0\x37\x08\x69\xbf\x61\xcd\x34\x27\x1c\xdc\x0e\xc2\x31\xbf\x60\x01\xdf\xf1\x15\x42\xca\x4b\x3c\xbb\x09\x03\x9a\x81\x5e\x90\x6a\xb5\x6b\x71\x6c\x7f\xcc\xd6\xbc\x48\x18\x99\xbc\x85\xee\x9c\xaa\x2a\xcb\x02\x7e\x28\xea\xf3\xe8\x0c\x84\x73\x41\x5e\xf4\xb9\x3b\x29\xb6\xf9\x82\x8f\xaa\x59\x7a\x4f\x5e\xda\xe8\x08\xe1\x68\xd4\xb5\x01\x1e\x5e\xe4\x38\xe8\x7d\x7a\x76\x5f\xe2\x40\x91\x93\x0b\x03\xeb\xf3\x52\x60\x45\x33\xec\x2c\xd8\x69\xd4\x22\xa9\x52\xe2\x5a\xb8\x95\x4d\xa5\x21\x50\x4d\x9f\xa7\xf3\xcf\x15\xbf\xc2\xff\x73\xac\xcf\xb4\xf5\xae\xaf\x7f\x7a\xdf\x31\x32\xf1\x77\x32\xaf\x72\x04\x9f\xb3\x6e\x8b\xa6\x72\xe6\xd1\xb4\x7d\x7a\x50\xd3\xe8\x6e\xfa\x7e\x68\x97\x5a\x5e\xce\x21\x4d\x98\x8c\x6e\xcf\xab\xe7\x99\x9e\xf2\x8c\xe5\x52\xb9\xc7\x50\x06\x40\xe3\xb3\x30\x13\xfa\xf3\x3d\x0f\x02\x81\x22\xe7\x72\x9a\x09\xb2\xea\x5b\x40\xf5\xd1\x8f\x5b\x37\x02\x4f\xca\x84\x31\x18\xb4\x7f\x29\xd5\xb1\x77\x09\x3e\x77\xa7\xe6\x1d\xcf\x8b\x4c\x60\x9d\x2b\xfb\x6a\xfc\x1f\xad\x04\xa3\x2c\x97\x11\xf3\xcb\x53\x77\xf4\x7b\x8a\xd2\xa8\xee\xce\x11\x52\x98\x9a\xcc\xc3\xbb\x23\x0d\xfb\xf2\xe0\xcb\x83\xa7\xcf\x9c\x22\x86\xb1\x2e\x6e\x08\xc7\x6b\x95\x1a\x4f\x27\xec\x57\xe6\x66\xf0\x94\xfe\xfb\x25\xfd\xf7\x2b\xf6\x2b\xfb\x95\xb1\x73\x76\xce\xe2\xff\xba\xff\xb0\x5f\xd9\xd8\x11\x21\x9a\xea\xd3\x51\x93\x77\x24\xce\x26\xf5\x55\xeb\xa1\xa3\xa6\xd5\x34\x34\x94\x0c\x26\x3a\x17\x30\xd5\x2f\xff\xa7\xbf\x07\xf2\x2d\x2c\x36\x3d\x85\x49\xed\xc1\x94\xf6\xd9\x0d\x78\xa6\x73\x7e\x85\x5e\x99\xc3\xc4\x56\x3c\x73\x0f\xdf\xfb\x6a\xfc\x74\x9f\x69\xd5\xbc\xfd\x5a\x6a\xc7\x03\xfd\x0c\xf7\x9e\xee\x4f\x56\xa6\xfc\xe5\x9a\x29\xb7\xfa\x7f\x52\xcd\xb0\x1b\xf4\xf6\xfd\xee\xb7\xfa\xa1\x5a\xde\xf0\x65\xd8\xf0\x5e\x64\xcc\xe5\x75\x68\x99\x11\x21\xf9\x40\xc8\x1e\xf6\xaf\xf4\xe0\x6c\x38\xe8\x92\x49\x3b\x61\xa7\x76\x77\xd7\x77\x9b\x75\x06\xb3\xef\xed\x71\x1c\x83\xce\x02\xe1\x61\x6f\x3c\x69\xa5\xf4\x77\x80\x38\x1c\x34\x36\x72\xaf\xe6\x1c\x78\xe5\xe1\x94\xf4\x66\x71\x3b\xf5\x89\x6b\x40\x42\xac\x9e\xfa\xf6\xc1\x0d\xd9\x87\xef\x3d\xdd\x2d\xe8\x78\xcf\x86\xae\x48\x1b\xa9\x4f\x7e\xfd\x4e\x23\x48\x84\xf3\xae\x6f\x86\xbe\x6f\x8c\x77\x19\xf6\x76\xa7\x79\x2e\xdf\xee\x40\x04\x2c\x28\xa1\xd4\x0c\x8b\x24\x3b\x41\x88\xfa\x6d\x1c\xc1\xdc\x1d\xaa\xb4\xce\x3b\xea\x38\x7f\xe8\x03\x01\x86\xd7\x1c\x82\x71\xe5\xea\x9b\x44\xb9\x49\x8d\x54\x56\x77\x0a\xeb\x73\x3c\x61\x87\xb8\x81\x0d\x44\x10\xef\x32\xaf\x5b\x69\x57\x37\x4a\xbe\x01\x9d\x25\x44\x52\x72\x8d\x38\x83\xca\x8b\x47\x72\xf8\x6a\xd2\xbe\xc2\xb2\x9e\xce\xd6\x24\x93\xd5\x51\x16\x44\x70\x75\x9b\x04\x8a\x8f\xe2\xfd\x13\xb5\xc6\x78\xba\x06\xce\x94\x8e\x8b\x69\x92\xeb\x09\x6d\xa4\xfa\x99\xda\xe2\x73\x7f\x6c\xf3\x8f\x60\xc1\x36\xe4\x26\x34\x93\xed\x22\x2c\xbe\x1c\xb5\x66\x4f\x9f\xff\xa9\x8b\x0c\xf9\xf2\xd9\xfd\x84\x03\xfd\xf7\xb2\xb1\xcc\x6b\x57\xf7\x4f\x7b\xf5\x2c\xf7\x21\x0b\x60\xcd\x21\x80\x8a\xa1\x3a\x22\x3c\x09\x02\xcd\x48\x5b\x71\x2c\x32\x52\xe2\x86\x32\x3f\x6f\x7f\xa9\xa8\x50\xd4\x33\xf7\x91\x93\x3f\xbc\x32\x02\x2a\xbf\x2a\x00\x05\x70\x84\xf4\xca\xee\x57\x7b\x5f\xb1\x31\x7b\xb2\xef\x76\x83\xc2\x6d\x05\xc4\x8c\x45\x99\x13\x0d\x94\xc8\x6c\x17\x4e\x79\x72\x94\x31\xa3\xd0\x8f\xae\x25\x84\x60\x49\x2f\x29\xaf\x99\x3b\x7d\x87\xfb\xd6\x8c\x2a\xf5\x8c\x1e\xd5\x93\x9a\x36\xa7\xea\x5c\xa7\xcd\x88\x59\x28\x23\x9b\x43\xd4\x1d\xea\x79\xa8\x4d\x14\xdb\xf3\xff\xa8\xa1\xde\xf7\x3b\xa1\x8a\x6c\x56\x16\x28\x9d\x8a\xc3\x19\xf4\x10\x58\x76\x45\x6f\x6e\xcb\x84\xb3\x95\x31\x23\xd9\xb0\xd0\x37\xec\x86\xf2\x93\xb1\xa1\x26\x96\xd9\xc5\x13\x39\x88\x5b\x9d\x23\x3f\x0b\x2c\x99\x54\x88\xc0\x4a\xe9\x18\x19\x58\xf6\x57\x31\x34\xcd\x98\x7d\xa7\x95\x2e\x9f\xa1\x76\xe4\x86\x34\x35\x2b\xbe\xfd\x71\xc8\x6a\x92\xac\x4a\xa3\xee\x88\xb5\x40\x30\x4e\xbd\x39\x05\x03\xed\xd9\x87\x46\x09\x66\x1c\xa4\x4a\xa7\x81\x8f\xbd\x6f\x70\xdf\x71\x7a\x6d\x4e\x6e\x40\xbf\x5e\x71\xca\xb8\x6f\xe1\x75\xa9\x3f\xc9\x24\xda\xff\x71\x65\xa6\xdf\xd1\xd1\xee\x75\x3f\x75\x4b\x76\xea\xe6\x65\x42\x03\xbb\xf7\x9d\x07\xa8\xc1\xec\xbe\xd9\x3b\x1a\x7a\x8e\x84\x97\x10\x8a\x1f\x72\xa7\xc6\x23\xbe\x77\x9f\x22\x0e\x15\xa6\x02\xf4\xde\x93\xb8\x1d\x42\xc9\x2a\x8c\x3a\x62\x3c\xd3\xe0\x60\x70\x0c\xd6\x7d\x24\x52\xba\x71\x16\x5a\xec\xaf\xf8\x0e\x16\x50\xa5\x5b\x27\xa3\x8c\x1a\x9b\xac\xbd\x5b\xfd\x0b\xdc\x61\x7f\xf6\xda\x8b\xf8\xcc\xcf\x78\x33\x46\x39\x02\x03\x24\xa6\x85\xb1\xbc\xd9\x7c\x25\x40\xe2\xc1\x92\xa1\x77\x68\x02\x74\x21\x03\x86\x8a\x2e\xd0\x01\x47\x02\x59\x9a\x10\x81\x94\x50\xc3\x9e\x44\xed\x8b\x4b\xd4\xc1\x64\x2a\x4a\x14\xa9\x53\xd1\x28\xd1\x09\xb9\x1d\xec\xc7\xfa\x4e\x2c\xcd\x81\x1c\x66\x1c\xe8\x6f\x58\x12\xbe\x33\xad\x92\x2b\x61\xbd\xef\xb6\x84\xaa\x82\xa2\xb2\x6c\xca\x33\xae\x12\xb7\x6b\xdb\xb1\x7c\xab\x71\x30\xfc\x25\x3c\x05\x71\x6e\x42\xe9\x08\x0e\x1d\x65\x1e\x4a\x65\xac\x1b\x0d\x53\x12\xeb\x09\x1e\x66\x46\x8f\xdc\xd9\xf4\x03\xac\xba\x0f\x60\x28\xfa\x37\xba\xa3\x89\xfd\x0b\x61\xa9\x36\x2d\xf2\x21\x13\x9d\x5b\x22\x0b\x4b\xb0\x9b\xfc\x61\xc2\xc4\x64\x0e\x2a\x6e\x6b\xc9\x76\x9a\x05\x92\xbe\xe6\x66\x67\x84\x6f\xed\x56\x8e\x0a\x56\xc9\xbf\x41\xad\x34\xa2\xb7\x52\x29\xd4\x71\xb7\x07\x0e\x77\x34\x9f\xe0\x14\x20\x3f\x3a\x28\xaa\xef\x1f\xfd\xd4\xae\xb3\x71\x3f\xf5\x99\x59\xb1\xe8\xfb\xbb\xd8\x56\x95\xfc\x26\x0b\x87\x2c\x13\x9e\xf9\xea\x0f\x68\xf5\x17\x70\xce\xd5\xee\x6e\xed\x0b\x80\xa3\x80\x9c\xa5\xb6\x56\x1c\xfb\x6c\x58\x0b\x6c\xcf\x2b\x7b\xcc\x8a\x2c\xc3\xc3\x5a\x1b\x4d\x4e\xf9\xb5\xba\xb6\x9a\x24\x8c\xd0\xf4\x5b\xac\xfd\x61\xfc\x23\x5f\x03\x03\xae\xb1\x65\x40\x28\x1c\xb1\x69\x65\xd9\x5c\x5e\x3b\xce\x7f\x27\x37\x07\xba\x72\x16\x22\x2b\x58\x29\xd2\x2a\x21\xdc\x02\x10\x4b\x87\xb1\x4d\x86\x9d\xa5\x3d\x77\xd8\x69\x10\x74\x07\x5b\x9d\xa9\xa6\xd4\x91\x33\x38\x20\xa0\x5a\xc9\x19\x13\xd7\xa2\x5c\xb2\x42\x1b\x03\xc7\x10\xd8\x16\x16\xef\x41\x9c\x28\x80\x29\x83\xfd\x00\xb3\xf2\x2a\xfb\x0e\xe9\xec\x3b\x60\xd3\xea\x06\x2b\xfa\x34\x2e\xbc\xaf\x0e\x9e\x1e\x3c\x7d\xbf\xf9\x75\x0e\xff\xab\x7d\x72\xfe\xbf\xa7\xb3\x35\x56\x66\x3d\x97\xc6\xce\xb9\x8f\xdb\xee\x4b\xf0\xae\x7d\xb5\x1f\x79\xef\xbe\x3a\xf8\xf2\xe0\xe9\x9e\x9b\xeb\x97\xfb\x6e\xd6\x91\x5f\xee\xcb\xc8\x2f\x17\x7e\x49\x33\x12\xa6\xe1\x99\x3b\x55\x54\xa9\x09\x6d\x4e\xc9\x36\xa7\xaa\x3f\x37\x23\x63\x7d\x08\x22\xf7\xbc\x1c\xb7\x5d\xd3\x2f\xb0\x6b\xd1\x41\x28\x2d\xfb\x43\xae\x4b\xf1\x87\xe8\xfe\x5b\x3d\x6a\xdd\x1d\x65\x1d\xd8\xcd\x6a\x48\x20\xe7\xc5\xf8\xaa\x43\x50\xac\x4f\x3a\x60\xdf\x64\xc0\xdb\x02\x1b\x39\x2f\xee\x31\x0e\xf6\x93\xe9\xd5\x6b\xf5\x05\x25\x92\xd1\x50\x94\x28\x85\x6e\xdc\x9c\x12\xfa\xa6\xcb\xb8\xfe\x77\x2a\x9c\x2e\x8b\x5e\xaf\x1a\x24\xf0\x9e\xed\x0d\x8d\xd5\x25\x9f\x8b\x03\x7a\xec\x63\x69\x6b\xfa\x03\x36\xf0\x69\x64\xc5\x20\xfc\x12\xb5\xf6\xf1\x25\xd8\x3e\x5f\x12\xb8\x00\x4f\xa0\x7a\x11\x08\xd9\xc0\xcf\x8c\xea\x22\x1f\x49\xea\x6d\x07\xb0\xbf\x3e\x89\x5e\xfc\xc6\x9c\x64\xdc\x58\x99\xfc\x3d\xd3\xc9\xd5\x85\x75\xe6\x4e\x6f\xd5\x62\xdd\xa8\x8d\x35\x55\xec\xf0\xc7\x0b\x76\x2c\xcd\x55\xdd\x25\x12\x3b\xb1\x34\x0b\x06\x79\x40\x22\x26\xec\x08\x96\xf3\x64\x81\xaa\x2b\x79\x9d\x7d\x37\xaa\xe1\xce\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x67\xc1\x1b\xc3\x8d\xc4\xd7\x39\x3d\xde\x40\xa2\xee\xcc\x74\x6d\x9f\xcb\xd6\xf4\x34\xf3\xe0\xf8\x88\x81\x90\x09\xea\x6b\x0f\x88\xcc\xcd\x3e\x65\xb0\x87\x96\xba\x62\x37\x1c\x0d\x6a\xe0\xb0\x13\x76\x29\x8b\x67\xec\x24\xea\xf8\xb3\x6e\x28\xa7\x7d\x04\xf4\x55\x32\xa8\x61\xcf\x61\xe2\x8d\x63\xc8\x54\xd3\xc3\x4e\x50\xb5\x32\xcf\xd8\x8e\x78\x67\xff\xb8\x33\x62\x3b\xef\x66\xc6\xfd\x47\xd9\x19\x74\x08\xa3\xce\xa3\x4e\xc7\x53\x33\x51\xd6\xa6\x23\xfe\x60\x15\xf8\x68\xf8\x2d\xcb\x2e\x5f\x1d\xbf\x7a\x06\xba\x7c\xaa\x9d\xd5\x47\xbd\xf9\x3d\x8c\x17\xf1\xc6\x88\x0c\x90\x2b\x92\xe8\xbc\x28\x75\x2e\xa3\x62\x5b\x38\x72\x5d\x4e\x00\x1b\x22\xdb\x0b\x0c\x5b\xd8\x0c\x83\xec\xa7\x30\x9c\xdf\x52\xd1\x07\xea\x2e\x9b\xe9\x74\xc6\x34\xa6\x06\x34\xcb\xfd\xa5\x09\x37\xb9\xed\x43\xa3\x60\xc7\xf9\x7a\xc3\x38\xcd\x9c\xbe\x3a\x48\xc5\xf5\x81\x49\xf9\xd3\x11\x3c\x06\x77\xc3\xb2\x35\x27\x6e\xd8\xce\xd3\x9d\x09\xbb\x90\xb9\xcc\x78\x99\x51\x2b\x5c\x1a\xa2\xbe\xcf\x19\x0a\x7e\x40\x30\x7f\x9f\xec\xb0\x3d\xac\xb7\x07\x75\x23\x13\x1e\x7d\x2d\xa0\x8d\x42\x66\xcc\x7e\x27\xed\x92\x0d\xe0\x7e\x67\xbd\x5d\xf0\x8c\xba\xe2\xbf\x52\x59\xe7\x2c\xe5\xe6\xe6\xf0\xa3\xf9\x62\xb5\xb2\x22\x47\xe6\x4c\x97\x64\x04\x86\x5b\x3c\xa8\x8f\x54\xa4\xb6\xbc\x74\x4b\x7f\xff\x4e\xd4\x1f\x4b\xfc\xb0\x01\x80\xe6\x58\x90\x22\xc3\xd0\xd7\x8f\x06\xc9\x07\x4a\xfe\xbb\x12\xec\xf4\xd8\x33\xf1\x42\x94\x46\x1a\xeb\x58\x54\xda\x50\x0d\x24\xea\x0b\x7b\x87\x39\xff\x8f\x56\xec\xe4\xef\x17\x34\xad\xfd\x07\x48\xec\x8e\x9c\x8e\xff\xa7\x2a\x85\xd3\x88\x7a\xab\x5f\x61\xa4\xb6\xca\xe5\x3e\x67\xc7\xdc\x72\xd4\xbc\x90\x53\xe9\x1a\x08\x0b\x94\xaa\x29\x14\x28\x79\x94\xb3\x8e\xca\x33\xdb\xbc\xf6\xe3\x76\xd0\x59\x77\xe4\x6c\xf7\xf3\x37\xaf\x4f\x37\xa0\x3b\x25\x20\x6e\xe7\x2f\x75\x3a\x90\x02\x15\x0d\xe8\x45\x1e\x00\x93\x1e\xe1\xe7\x2c\x77\x4f\x62\x67\x5a\x89\x11\x7b\x2d\x78\xca\x1c\x77\xa3\x7f\xfe\x58\x4a\x7b\x5f\xac\xa7\xfa\xea\x2d\xfa\xfd\x22\x0e\x42\x08\x3f\x98\x27\xc2\x59\x84\xef\x07\x60\x94\xc0\x74\x48\x07\x98\x66\x7a\xca\x88\x59\x6c\xf2\xed\xdf\xbc\x3e\x1d\xec\xe5\xdf\xbc\x3e\xf5\xef\xee\xfe\xa9\x67\x0f\xf3\xb5\x07\x34\x1e\x6a\xdb\xe1\x79\x4b\xd9\xaf\xd5\xb9\xba\x2d\x4e\xdb\x20\xb8\xbb\x35\x30\x19\xca\x0e\xd8\x14\xcd\xaf\xa4\xea\x5c\xef\xd6\xe4\x36\xd0\x12\x27\xc0\x3f\x45\x41\x34\x40\x9d\x4b\x9f\xb1\xbc\xca\x2c\x20\xfc\xc0\x5e\x73\x9b\x0f\xf2\xc3\xfc\xae\x63\x84\x76\xc9\xd8\xb1\xc0\x70\x44\xfa\xcc\xd7\x5c\x84\x5f\xac\xff\xc1\x4b\xae\xf8\xdc\xdd\x0e\x12\x90\xe5\xf8\x67\xb4\xc9\xf7\xd0\xe9\xae\xc2\x57\xfc\x9a\xcb\x8c\x4f\x65\x26\x2d\xe8\x73\xfb\x13\xaf\xcd\x63\x5e\x3e\x4c\x79\x63\xdc\x6f\x50\xd5\x36\xa8\xad\x31\x16\x0a\x40\xf9\xb1\x3d\xf7\xdd\xc1\x8d\x63\xf5\xfb\x13\xe0\xfb\x70\x23\x20\xaf\xb7\x94\xdf\xd7\x1f\x52\x7e\x37\xa2\xa7\xc2\x7a\x3f\xef\xd8\xaf\x6b\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x02\xd8\xfc\xcc\xd5\x27\xec\x99\xde\x43\x81\x82\xb3\xd3\xf1\xf7\x7d\x55\xa8\x8f\x73\x70\xd2\xcf\xef\xe0\x30\xec\x6c\x48\x2b\x3d\x08\xb9\xea\xe1\xbc\xae\x11\x80\x94\xf1\xab\x56\xa9\x38\x9e\xac\x0b\xe2\xe5\x1e\x60\x19\x7e\xef\xce\x53\x17\x20\x09\xbc\x7a\xb3\xdf\xb0\x83\x87\xa1\x8b\x1f\xcd\x93\x05\x85\x14\x7c\xcc\x3a\x9f\xb3\x9e\xaf\x99\x88\x62\x31\xeb\x9f\xcb\xee\x86\x79\x7e\xd1\x8c\xda\x1c\x89\x62\xc1\x9e\x5f\xac\x61\x93\x58\x47\xe0\xde\xdb\x60\x2c\x67\xd7\xb0\x4c\xce\x84\x95\x9d\x88\xb0\x61\x46\x99\x6b\x25\xad\x2e\xcd\x06\xd8\x9c\x7f\xf4\x30\x8a\x9b\x1f\xcd\xed\xcf\xd7\x9e\x28\xec\x65\xf4\x29\x67\x89\xce\x32\x91\xf8\xec\x7e\x58\xe2\xf0\xb3\x35\x8e\x18\xca\x40\x30\x93\xab\xaf\xc1\x15\x43\x4e\x97\x03\xdc\x76\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x77\x0b\x7d\x33\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\x41\xec\x8c\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\x00\xce\x6f\x4c\x0d\xb1\xee\xe3\xce\xa5\xd6\x76\x15\x64\x7d\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x7b\x42\xd0\xd7\xd7\xc3\xd2\x85\x6b\x37\x6f\x83\x44\x1f\x57\x33\x7e\x28\x07\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\x8b\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x57\x62\xc9\x00\x26\x61\xa6\x4b\x68\x59\xd2\xdc\x9f\xc2\x26\x40\xbc\x83\xca\x88\x72\x42\x0a\xc7\x03\x21\x7c\x1f\x55\x04\x5e\xe4\xb5\x98\x0d\x49\xf6\xd7\x62\xb6\x8e\xea\xf4\x31\xe0\xba\x86\xf4\x38\xa7\xaf\x54\x76\x81\xb9\xb1\x88\x27\x8d\xb4\x5d\xbb\x0c\x84\x73\xf1\x40\xe8\xde\x0b\xa1\x60\x08\x14\x9d\x3e\xdd\x10\xd9\xca\xe2\xc5\x6e\x4b\x5a\x24\x7b\xef\x30\x88\xbe\x76\x56\xac\xb8\x39\xb8\xd1\xe5\x95\x54\xf3\xf1\x8d\xb4\x8b\x31\x52\xca\x1c\x00\xba\xfd\xc1\xef\xe0\x3f\x14\x45\x3e\x4c\x53\xca\x7f\xab\x8c\x98\x55\x19\x66\xa6\x99\x09\xe3\x85\xfc\x41\x94\x06\xb2\x2c\xaf\xa4\x4a\x47\xac\x92\xe9\x37\x5d\x57\x8c\x0d\x71\x5a\xba\x77\xa7\x6f\xd3\xba\xa2\x06\xf5\x3a\x16\xa3\xa5\xe7\x49\x25\x4f\xb5\xc1\x1e\x47\x8e\x54\x8d\x23\xc0\xd3\x5c\xaa\x87\x72\x02\xba\x5a\x07\x52\xa5\xdd\x28\xd9\x0a\x40\xc0\x38\x4d\xf3\x80\x3e\xa3\x30\x76\xc8\xf9\xe1\xde\x7b\x82\x4d\xcc\x29\xfb\xa7\x99\xfb\x73\x27\xc6\x92\x2f\xcd\xbf\xb3\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\x89\x3c\xf7\xb9\x3e\x5d\x22\xcf\xb0\x0e\xf9\x4f\x90\x9e\xf3\x51\x77\x1c\x7b\xc0\x3a\xf3\xc7\xf5\x83\x6d\x90\xd4\xfd\x35\xe3\x8f\xa3\xa1\xd5\xd2\x07\xfa\xef\x19\x0f\x0a\x07\x0a\x18\x72\x25\xef\x4f\x83\x1c\xf9\xba\xe1\x93\xc7\x77\x48\xb4\x52\xd4\x0b\xe0\x55\x21\xd4\x85\xe5\xc9\x55\xcf\xa8\xee\x56\xab\xfa\x8d\x69\x55\x1f\x29\x11\xc8\x6f\x51\x2c\xbc\xa3\xf4\xb7\x3a\xd9\x1b\x0f\xf9\x23\x64\xc0\xd8\xd8\xee\x25\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x01\xc8\x5a\x54\x7b\x0a\x74\xfc\xf4\x1a\x4f\xdf\xf3\x4d\x22\x66\xb8\x1c\x98\x68\xc0\x26\x47\xcd\xdd\x27\x53\x69\x6b\x5e\x69\x84\x45\xf0\x27\x82\x03\xd6\x8a\x25\x04\xf0\x00\xfa\x48\x04\x5b\x10\xe9\x2a\x8a\xe9\xc4\xfa\xaa\xd1\x80\x13\xf5\xe4\xc9\x93\x27\x88\x7d\xf3\x5f\xff\xf5\x5f\x4c\x97\xd0\x77\x33\x91\xf9\xea\x8d\x70\xd7\x9f\x9e\x3e\x9d\xb0\x7f\x1c\xbe\x7c\x01\x15\x0d\x85\x35\xd8\x8d\x0d\x47\x76\x37\x34\x7e\x6c\x46\xec\xff\xbd\x78\x75\x56\xa3\x32\x34\xbf\x05\xd3\x3c\xbc\x5e\xb3\x07\xc6\x93\x3f\xff\xf1\x8f\x13\x76\x2c\x4b\xa8\xe8\x92\x22\xf4\x57\x0f\xae\x16\x5e\x0a\xc4\xea\x01\xd4\x14\xaf\x71\xc9\xd0\xca\x90\x0a\x93\x73\x39\x5f\x58\xaa\x88\x75\x1b\x32\x93\x89\xc5\xe2\x31\x64\x6b\xbe\x7d\x3b\xb6\xcf\xa0\x86\x34\xa4\xfd\xc1\xe4\x46\x2c\x93\x57\x82\xcd\xcc\xb7\xa5\xae\x8a\x1a\xd2\x90\x9a\x0e\x53\xa1\x0c\x0e\x56\xaf\x95\x11\xf6\x91\xa7\xad\xf6\x72\x35\x37\xf6\x36\x8c\xd4\x52\x58\xa9\xbc\xb5\xc6\xf5\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\xe8\x77\x19\x7c\x3d\x29\x3b\x0a\x5c\xc5\xa3\x8c\x14\xa5\xfe\x17\x6e\x01\xa8\x45\x8e\xd8\x33\xd4\x0a\xc3\x4a\x52\xa5\x70\x14\xdd\xf2\xf5\xd4\xd4\x60\xdd\x7f\x4c\x5d\x5b\x56\x5b\x5f\x65\xd2\xb8\x47\x00\xbc\xcf\x7b\x9e\x5c\xf7\xed\x75\xbb\xd4\xe0\x7e\xa9\xd4\xca\xaf\x09\x4a\x85\xd8\x25\x35\xbc\x24\xf4\xe1\x7a\x0c\xc4\x05\x20\xe4\x1b\xba\xd7\x53\x29\x10\xa2\x91\x6f\x6d\x84\xad\x88\x34\x90\x45\xef\x9e\x0d\xcd\x18\xe1\x0d\x73\x5e\x5e\x39\xc3\x95\xb8\xcb\x84\x9d\xbb\x49\x06\xf0\x1c\x04\xf6\xbd\xc6\xc0\x66\xce\x97\xf0\x58\x52\xdc\xe0\x21\xbb\x93\xc9\x2e\x1e\x3f\x5d\x32\x63\x79\x49\x67\xc9\x7d\xfe\x79\x20\x8a\xbf\xe4\x85\x41\x84\x5b\xa7\xa9\x02\xfa\xb3\x86\xda\x75\xbb\xf0\x2c\x88\x13\xad\xb7\x28\xe0\x6c\x0c\x84\xe9\x3c\xc0\x03\x47\x00\xa7\xd5\xa7\x53\xfe\x20\xe0\xa9\xf3\x1e\x0a\x07\x5e\xed\x98\x6a\xda\x8a\x6c\xdc\x49\xdf\xa0\x0e\x48\x99\x78\x54\x0a\xc6\xfa\x8e\xa7\xc4\x38\x63\x05\x2c\x6e\x85\xf9\x78\xf5\x08\xbc\x86\xd0\x26\xf0\xea\xaf\x53\xe0\xd5\x27\x88\x8c\x57\x63\x0f\xfb\x48\x32\x12\x93\x04\x18\xca\xa8\x59\xbd\x04\xd0\x97\xae\x88\x8e\x35\x36\x71\xf5\xcd\x88\x15\xe3\x53\xa3\xb3\xca\xe2\x4f\xeb\x2f\x63\xe9\x07\x83\x7a\x7c\x6c\x10\x79\xe1\xb6\x48\x16\x82\x16\x80\xe2\xa3\x8f\x58\xc4\xab\x37\xdb\xe8\xe3\x84\xf8\x0d\x39\x20\x7a\xd3\x39\x18\x6c\x43\xd0\xda\x0f\x16\x2a\xee\x6e\x16\x82\x52\x20\x22\xbd\xcf\x71\x53\xc7\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xa4\x1b\x71\x33\x26\x46\xf6\xf7\x25\x18\xc9\xf6\x8e\x42\x79\xbc\x4f\xbb\x3b\x55\x56\x94\x33\x9e\x88\xfd\xd8\xc7\x20\x8a\x85\xc8\x45\xe9\x08\x45\xf7\xf9\x1a\xed\x05\x57\x29\xc1\x4e\x25\xa2\x84\x13\x2c\xde\x59\x51\x3a\xa2\x1e\x5d\x9c\xb2\xb4\x94\xd7\xa2\x34\x6c\xef\xef\x00\x20\x88\x70\x53\xfb\x8f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\x94\xe7\xe1\x2a\xe2\x33\xf5\x52\x79\x6c\x2c\xb7\xac\x26\xf6\x1d\x4d\xdc\x81\x00\x11\x0a\xdc\x17\xba\x37\x63\x6c\xd3\x23\xb7\x43\x93\xa9\xc4\xe2\xc0\xdc\xb0\x52\xcc\x9d\x35\x56\x46\x30\x7d\x08\x93\xb2\xb1\xe2\x86\xe1\x0b\x4a\xea\x60\xd5\xfb\x6a\x3f\x66\x64\x57\xea\x6b\x99\x7a\x75\x08\xd1\xe8\x03\x26\x5c\xc1\x4d\x04\x5e\xc0\x8d\xd1\x89\x04\x57\x53\xb4\x34\x68\xa5\x82\xd2\xd4\x6c\xfb\xe5\xc3\xcd\x71\x98\x4c\x43\xf3\x9c\x4e\x3d\x47\xd9\x20\x02\x51\xa7\xe2\xbc\x9a\x66\xd2\x2c\x2e\x06\x0d\x89\xac\x1b\x18\x93\x12\x57\x32\x55\x6e\x8d\x8c\x18\xa1\x8c\xa4\x16\xf1\xa8\x6e\x49\xa7\x6d\x6b\x58\x06\xff\xeb\xf8\x50\x68\xa8\x86\x87\xc6\xf3\xfe\xab\xb3\x7a\x1e\x04\x56\x82\x1d\x8f\x53\xf1\x46\x15\x8d\xcf\x13\x9e\x65\x86\xf4\xdb\xd0\xcf\xc3\xcb\x1e\xd4\x50\x3d\x80\x09\xee\x0a\xe9\x36\x8c\x9f\x3d\xa4\xe0\x20\xf3\x0a\xcd\x67\xd6\xbe\x98\x89\x00\x86\xb5\xf2\x37\x41\xe3\x66\xff\x83\x40\x21\xac\xc4\xc1\x4d\xb7\xc1\xb6\x1f\xdb\xf0\xcf\xe3\x0b\xff\x7c\x9c\x9a\x8a\xba\x9d\x26\x87\x0f\xc7\x50\xa1\x85\xa1\x8d\x8a\x5a\xc4\x7a\x41\xe3\x05\xd2\x07\xd2\x34\x37\x16\x02\xc6\xf9\x1d\x5a\xea\x3e\x31\x8c\x77\xb7\x3d\x28\xa8\x62\xce\x14\x07\x0e\x35\x26\xfa\x25\xd1\x91\x22\x1b\x39\x9c\xf3\x55\xbe\x56\xcb\x74\x10\xe7\xf8\xe1\xae\x61\xa9\x4e\x2a\x67\x7c\xd5\x64\xaf\x13\x2e\xfa\x75\xe6\xfb\xbc\x5a\x05\xa5\xfa\x46\xdd\xf0\x32\x3d\x3c\xef\x54\x9b\xdb\x54\xce\xea\xb1\x62\xd5\xdb\x7f\xcc\xdc\xe7\x7c\x0a\x48\xb7\x84\x6d\xb8\x8d\xf6\xad\x1d\x22\xe6\xe6\xeb\xdc\x6d\x56\x3b\x26\x7b\xc7\x68\xde\x7d\x1d\x76\xdb\x00\xe1\x36\x40\xd8\xb8\x1e\x52\x80\xf0\x14\x03\x84\x71\x57\xdb\x06\x7b\x21\x0f\xad\xa3\xf8\x67\x11\x63\x3a\xae\x59\x2a\x6a\xe2\xed\x7a\xde\x96\xf2\x8f\x87\xb7\xde\x75\x91\xc1\xe0\x79\x2e\xe8\x65\x9f\x43\x3c\xea\x01\xc4\x93\x80\x96\x3d\xac\x42\xbc\x9a\x0c\xbf\xae\x57\x43\x94\x5a\x0c\x4c\x47\x11\xee\x42\xa7\xd4\xcd\x00\xda\x6c\x60\xcb\x80\x51\x68\x83\xa7\x7c\xb9\x29\x68\xe7\x05\x4f\x04\xf0\xb7\xa0\xfe\x0c\x12\x24\xe8\xb9\x01\xd8\x40\x9b\x80\xc1\x46\x00\xea\x9c\xf7\xd9\x0d\x6c\xb0\x1d\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x1b\xc1\x24\x0b\x91\x73\xf8\xe7\x73\x4f\x02\xc7\x1b\x9d\xf1\x60\x05\x42\xc0\x89\x32\x37\x4c\xcf\x46\x8d\x4c\xd7\x9d\xeb\xa7\x3b\xfd\x82\x0d\x6c\xb8\x38\x25\xf3\xe7\xe8\xbc\x77\xb0\x87\xb5\x09\x76\xde\x88\xed\xb8\x33\x54\x37\x7c\xf4\xb8\xf7\x21\x83\x02\xe4\x07\x52\xf8\xc1\x10\x67\xe8\x20\x6e\xd7\xe0\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x0d\xde\x7e\x8e\xc1\xdb\x48\x30\x7a\x46\xb7\x26\x90\x1b\x87\x04\x7c\x34\x77\x2a\xbc\x51\x43\x36\x8c\x0f\xe5\xfa\x38\xae\x2e\x9b\xa9\x4b\xbb\x93\xc9\xee\xae\x8f\xee\xd2\xbe\xaf\xec\x6c\xfc\x35\x13\x2a\xd1\xa9\xef\x56\x3b\x93\xa5\xb1\xa0\xee\xd5\xee\xb6\x78\x2e\xb9\x7f\x56\x9c\xfe\x04\x63\x0f\xb1\xd4\xbd\x79\x8b\x87\x24\x7c\xfe\x11\x94\x98\x5a\x75\x09\xc0\x87\x44\xa2\x80\x67\x4d\x3a\x8c\xff\xde\xb0\x4c\xe6\x92\x7a\xbd\xbb\x83\x2e\x8c\x35\x6c\x0f\x3f\x9c\x24\x45\x35\xa2\x1b\x26\xb9\xc8\x75\xb9\x1c\x85\x9b\xdc\x97\x8d\x5f\xd1\x1d\xfb\xd8\xef\xa4\x2a\x4b\xa1\x6c\xb6\xfc\x9c\x35\x20\x4f\xc4\x07\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\xcd\xad\x55\x47\x7c\xc1\x6d\x1e\xf5\x17\x08\x68\xb4\x66\x54\xc7\xc5\xdd\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x39\x7e\xdd\x35\xa0\xce\x93\xca\x6b\x69\x74\xe7\xb0\x68\x34\x50\x4c\x9e\x8b\xe0\x84\x76\x87\x4d\x57\xb6\xa8\x2c\x71\x74\x7f\x02\x3d\xca\x78\x38\x79\x2d\xe5\xf0\x69\x97\x2e\x4a\xcd\xab\xe0\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\x97\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\xbd\xa7\xce\xd5\xf2\x55\x4f\x56\x88\xd7\x78\x40\x91\xdc\x1c\x71\x90\xed\xd7\x6a\x2b\x21\x95\x1d\xeb\x72\x8c\x43\x3f\x03\xb0\xe0\x9e\x0f\xf0\xdb\x6b\xe8\xf3\x5f\xab\x01\x35\xdc\xbe\x57\xea\x37\x7c\xc0\x21\xf4\x79\x2c\x07\x28\x33\xf6\x23\x35\xcb\x64\xac\xc8\x0b\x5d\xf2\x72\xc9\x52\xf2\x66\x2e\xd7\x20\x10\x45\x10\x44\xbd\x21\x85\x61\x1e\xa9\x2c\x37\x50\x69\xdc\x1b\x51\x48\xa4\xb2\xca\x07\xc2\x13\x82\xb1\xe2\xc5\xb8\x01\xe4\x7d\x42\xed\xf7\x29\x45\x74\x1b\x05\x34\xa6\x3c\xb9\x42\x0b\x2a\xac\x16\xea\x8d\x51\x69\xfd\xce\x0e\xa5\x44\x60\x3b\x7f\x72\xec\x43\x6e\x8b\x4e\x85\x5b\x4a\x7f\x33\x8e\xdd\x70\xc2\x63\xa4\x9d\x12\x08\xeb\x8e\x54\xba\x64\x2f\x41\x01\xda\xe8\xea\xb3\x41\xb0\x42\xe4\x7f\xc4\x0b\xa7\xf5\x0d\x54\x89\xea\x87\xf3\x09\x44\x56\x83\xbd\x49\xb8\x5e\x33\x68\xb2\x55\x67\x88\x35\x34\x0b\x58\xc8\x13\x7f\x2c\x7d\xfc\xd6\x2d\xa7\x1b\x15\x75\x53\x70\x4c\x67\x06\xf3\x56\x64\x02\x7d\xa0\xc0\x36\x85\xe5\x08\x4b\x78\x19\xb5\xe6\xaf\x8c\x7b\x92\x56\xcd\x7b\xea\x07\x61\x9b\xac\x29\xee\x09\xdf\x4f\xbb\x69\x51\xbb\x6f\x2e\xc2\x9b\xd5\xfe\x0c\x28\x59\xf6\xe6\xa7\xa9\xc0\x48\xa1\xa7\x90\xaa\xad\x67\x90\x59\x11\xf5\xeb\xf1\x2d\x69\x56\x36\xaa\x92\x59\x73\xa7\xfa\xce\x13\xe1\xc5\x2b\x45\x09\x85\x2b\xdb\x6e\xfd\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xed\xb7\x47\xa7\x76\xf4\x54\x36\x86\x52\x31\x06\x51\x2c\x06\x57\x27\x42\xca\x66\xff\x0e\xaf\x75\xf6\x67\x43\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xcc\xc0\xa7\x1b\x5c\x06\x57\x12\xc9\xd9\x64\x99\x10\xb4\x93\x6c\xb4\xee\xc1\x61\xf1\x4c\x40\x51\xd5\x38\x34\xaa\xae\x1d\x12\x6c\x2a\x66\x98\xf1\x84\xbf\x01\x4f\x01\x95\x82\xa5\x22\x13\x56\x44\x1d\xe6\x0b\xec\x89\x5d\x8a\x5c\x5f\x53\x63\xd6\x37\x86\xe2\xe5\x72\xf6\x8c\xf1\xfd\x46\xc1\xb1\xa1\x96\xc7\x42\xa4\x58\x1f\x16\x35\x15\x2c\x2b\x65\x46\x6c\xba\xef\xf3\x59\xa9\xfd\x65\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe5\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\xd7\xd2\x48\x4d\x91\x2e\x3f\xee\x79\xe8\xc2\x80\xd1\xb3\xa3\x8c\xcb\x9c\xed\x19\x21\xd8\x89\xdf\x12\xf8\xcd\x05\x6a\x92\xe8\x49\x2c\x9b\x49\x75\x04\xf8\x48\xc0\x03\xee\x93\x9a\xf5\x86\x54\x05\x54\x06\xdc\xcc\xd7\x3e\x74\x3f\x2c\xd7\xfa\x39\xe9\x12\x12\xde\x7c\x0b\x20\xa1\x52\x1d\x65\xc4\x1c\x9e\x9f\x9a\xd8\xbe\xa5\x36\x8a\x38\x12\x7c\x91\x69\x35\x8f\x81\xef\xea\x9d\xe9\x98\xbc\x82\x7e\x98\xd7\x32\xad\x78\x86\xec\x9d\x26\x73\x74\x71\x8a\x3f\x97\xf3\x85\x1d\xdf\x08\xf0\x7e\xa2\x14\xac\xcf\x8c\x7f\xa8\x5c\xc9\xb4\x95\x06\xc4\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\xc3\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x86\x9d\xba\x3a\x37\xe8\xf6\x58\xf7\xdc\x08\x1f\xdb\xba\xf3\x23\x28\xc4\xdd\x3b\x04\x6f\x4c\x91\xbd\xae\xb7\xc9\xa5\xc8\x8b\x8c\xdb\x61\x52\x4b\x76\x7e\x8c\xdc\xdf\x51\xf0\xd8\x1d\x47\xae\xd2\x31\xcf\xdc\x8e\x3c\xff\xe1\x88\x2a\xdb\xf0\x80\x35\xd2\xd7\x2e\xeb\x1e\xa5\xbe\x2f\xb5\xd3\x92\xd6\x1e\x2d\xc0\x52\x9b\x8a\x14\x98\x11\x3d\x19\x7c\x14\x37\x0a\x7b\x04\xbb\x3f\xce\x7f\x38\x1a\x31\x39\x11\x13\xff\x57\xb8\xd5\x73\x43\xab\xe7\x58\xe0\x10\x2a\x68\x60\x3f\xc3\x54\x62\xe7\x6f\xfc\xdb\x7f\xfe\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\x5e\x46\x7f\xfb\xa7\x63\xae\xa5\xbb\xa1\xf9\x69\x9c\x5f\x0e\x7c\xcf\xfd\xf5\xcf\x73\x9d\x5e\x14\x22\x99\xe0\x6b\x99\x7f\x62\x96\x00\x13\xca\x3a\x5d\xfb\x5c\x43\x66\x99\x4c\x71\x97\xc3\xb3\x4b\xf1\x2f\x1f\x20\xa0\x76\xa9\xc4\x48\x12\x6e\x85\x02\x01\xe0\x0b\x8d\x95\xb6\xf8\x73\x6c\xb4\x0a\xf3\xdf\x9b\xc5\xad\x4f\xad\xd6\x70\xcc\x91\x95\x1c\x2a\x26\xde\x49\x03\xb8\x33\xf8\xae\x40\x0e\x4e\xc9\xeb\x5e\xa6\xb9\x61\x1d\x85\x03\xcc\x10\xf4\x5e\x75\x73\xfb\x83\xd2\xf6\x0f\x61\xf9\x7d\x62\x22\x76\x30\x67\xfc\x5a\xcb\x94\x55\xd0\x37\xcb\x9d\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x12\x13\x76\xe1\x64\x56\x9c\x61\x80\xd4\x53\x0c\xba\xd0\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x65\xd9\xe9\x8c\x99\x2a\x81\xe6\xbc\xa5\x18\x7b\xe9\x48\x77\xad\xf0\x98\xfa\x5d\x46\x61\xb1\x17\x1c\xed\xa7\x22\x85\x9f\x62\xab\x5f\x45\xdb\x6b\x25\xaf\xda\xcd\x53\xab\xa4\x96\x88\x40\x4c\x68\xaf\xed\x84\x60\xe6\x13\x80\xd0\x94\xa3\x80\x81\x12\x89\x30\x86\x97\x4b\xec\x86\x2a\x43\xd3\x46\x4a\x79\x05\x49\x9d\x73\x55\xc1\x00\xa5\xc0\xde\xba\x55\x02\xd4\xe1\x6c\x5a\xea\x2b\xa1\x42\x09\x81\x5b\xc5\x66\x42\x75\x9d\x35\x8a\x6d\xa7\x59\xb2\xe0\x6a\x2e\xea\x2a\xf2\x9c\xa7\x40\xfb\xef\x83\xa6\xe5\xdf\xc7\x51\x80\xcf\x9c\xc2\x22\x2d\x90\x62\xea\xe4\x53\x08\x7b\xbc\x55\x01\x07\x77\x54\xc7\x25\xdc\x2b\xc9\xac\x13\x4f\x64\xc3\x38\xc2\xfb\xbb\xc0\xc7\xa0\x50\x6c\x30\x79\x3b\x17\x96\xa7\xdc\xf2\xc1\x12\xb8\x5f\xf2\xd0\xf5\x93\x92\x3a\x60\x3b\x44\xc9\x1e\x24\x63\xbd\x2a\xa9\x0b\x19\xe3\x0a\x00\x37\x58\xf8\xd5\x07\x5c\x2a\xeb\xf6\x35\x05\x1d\x31\x2f\x1b\x74\x35\x9e\x65\xfa\x86\x90\xea\xfc\x68\xc8\xb2\x44\xca\xd2\x0a\xd4\xbe\x9a\xa5\xf5\x09\x8a\x0f\x12\x33\x71\x0b\x3d\x18\x95\x2f\xeb\xd8\x7f\xd2\xcc\xcd\x5e\xab\xa0\xa1\xac\x13\xca\x4a\xec\xa1\xef\x81\x20\x88\xf8\x95\xc2\xa3\xda\x5a\x06\x58\xa7\xb9\xb0\xa6\xce\xaa\x44\x69\xe2\x58\x24\xc9\x72\x72\x22\x80\xa8\xa1\xa5\x21\x3b\x7c\xbd\xa6\x88\x0b\x67\x34\x49\x0b\x27\xbf\x36\xbe\x32\xc3\x05\x8f\xb0\xfd\xed\x4b\x9d\xf6\x8f\x42\xb5\xfa\xb8\xd6\x03\xd7\xd5\x26\x58\x79\x64\xc0\xc9\x83\x37\x40\x4c\xde\x34\x60\x32\x50\x04\x2c\xf8\x75\x77\x77\x6a\xad\x99\x8e\x43\xb3\x36\x78\xdc\x18\x1e\x37\x7e\xda\xd7\x71\xdd\x3f\x6b\xd1\x5f\x3d\xb3\x17\x9b\x13\x1a\x20\x52\xe1\x58\xeb\xc5\x20\x81\x84\x16\x8a\x52\x18\x97\xe4\x2f\x65\x66\x84\x6c\x18\xaa\xa7\x15\xd2\x71\xcd\x67\xec\x0f\x0d\x8d\x8b\x34\xdb\x60\x0d\x63\x15\xd3\x9e\x37\x8f\x27\xb4\xf0\x1e\xce\xab\x79\xfb\x7e\x6b\x30\x50\xf5\xd6\x5b\x8d\xbe\x5a\x2a\xa8\xdf\x4e\x55\x86\x3e\xfc\xa1\x46\xd5\x6d\xe6\x52\x67\x99\xef\xdd\x8e\x16\x72\x2b\xb7\x09\xfa\x06\x61\xb4\x64\x14\xdc\x10\x41\xdf\x57\xe2\x26\x28\x76\xdc\x20\x5c\xa9\x8f\xd5\x83\xab\xc4\x27\x9c\xad\x1b\x2f\x54\x74\x1d\xaa\x25\x4e\xfd\x38\x22\x2d\xba\x17\xd8\xdc\x3d\xc8\x59\x00\x8a\x4f\x33\xcc\xc8\x09\x8a\x0f\xcc\x85\x67\x37\x7c\x69\xe0\x94\xd5\x16\x5b\x78\x3e\x61\xbd\xd7\x03\xbf\x16\xb3\x1e\xfd\xe4\xe3\x6b\xb0\x68\xfe\x70\xf1\x7c\x00\x5b\x91\xaa\x7b\x92\x6e\x3d\x4c\x87\x16\xdc\xed\x6b\xb8\xb4\x00\xc8\x8c\x84\xb4\xa8\x21\xe2\xab\x8d\xe3\x7c\x78\x7e\x0a\x03\x7b\xcb\x6d\x0e\x7f\x78\x89\x1e\x02\x85\x53\xe1\xce\x5b\x0d\x11\x05\x7b\x37\xfe\xed\x9a\xbc\xb1\x7a\xd3\x7f\x0f\xfd\x90\x28\xfe\xe2\xeb\x81\x9d\x40\x38\x3c\x3f\xc5\x27\x4e\xa0\x25\x2e\x57\x4b\xd2\xb5\xec\x42\x96\xe9\xb8\xe0\xa5\x5d\xa2\xf3\x62\xd4\x78\x5a\x28\x8a\x1c\x80\x1c\x83\x86\x86\xfb\xb4\x50\x8b\xaf\xc6\x1a\x01\xf9\x7c\xe0\x85\x22\x67\xb7\xae\xcc\x43\xa3\x48\xdf\x12\x4d\x7f\x35\x28\x12\xb7\xd0\xf1\xbe\x8b\x47\x41\x91\x34\x66\xc4\x1f\x4b\x2e\x3b\x1e\x6f\x9a\xe9\x2c\x28\x66\x41\x87\x26\x7f\x93\x8e\xeb\xc6\x82\xce\x06\xc6\xbf\x1b\x69\xc4\xe4\xcc\x09\x38\xad\xc6\x54\xad\x1e\x9c\xe3\xa4\xf7\xf9\xbc\x4f\x34\xe4\xdd\xd1\x45\xf7\x67\xfc\xac\x78\x80\x70\xd6\xd9\x9e\xd2\x0a\xcf\x3f\xde\xbb\x8f\x69\xaf\xb7\xf8\x77\xe1\x96\x09\xfb\x71\x21\x54\x2c\xfc\x62\x87\xf8\x28\x08\x61\xa9\x52\xb7\xf8\x20\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\x35\x7f\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xb8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x60\xb0\x4b\x64\xa9\x4d\xc9\x4f\xd8\x7a\x8e\x9b\x4e\x79\x72\x75\xc3\xcb\xd4\x40\xfd\x3a\xb7\x12\x5b\x1c\x8e\x1a\xc3\xee\x45\x73\x70\x4f\x6f\x68\x0a\xfb\xc1\xb8\x35\x22\xb4\xb2\xab\x1f\xc3\x78\x65\x75\xce\xad\x4c\xc0\x6d\x23\x67\x91\x27\x3e\x0f\x2d\x20\x42\x24\x15\x39\x3b\xc8\x0a\x7a\x0d\xb0\xe0\x4a\x2c\xb3\xb0\x37\x9a\xc9\xdc\x69\x60\x1c\x5a\x3f\xcf\x42\xb5\xba\x8f\x19\xbc\x6f\xa6\x4e\xcd\xfc\x11\x02\x35\xd1\x5d\xe8\x10\x72\xa6\xba\x81\xe1\x43\x54\x20\xb8\xc3\xa9\x2c\x7b\xd4\x52\x90\xe8\x37\x6e\x4f\xbb\xb9\x46\x5b\x75\xe4\x96\xe7\x46\x38\xbd\xcb\xbc\x77\xc3\x9a\xc9\xba\x19\xc9\xb9\xc2\xc2\x5d\x69\xbc\x0b\x81\x32\xb1\xf7\xd2\x52\x17\x05\x39\x03\xf3\xfd\xf6\x8c\x20\xf6\x56\x5e\x0b\x03\x71\x67\x9f\xdb\xed\xc8\x30\x17\x4a\x94\xdc\x82\x27\x9f\xe0\x08\xe1\xe4\xb6\x1f\xd1\x38\x30\x13\x04\x65\xd9\x67\x6f\xa8\xc1\x7f\xd8\xb8\x21\x53\xfc\x4e\x8a\x29\x7a\x16\x49\x37\xdd\x6a\x94\xef\x1d\x66\xab\x51\x6e\x35\xca\x0e\xd7\x56\xa3\x6c\x5f\x5b\x8d\x32\xbe\x42\x32\xf2\xb0\xda\x64\x5d\x5d\x10\x25\x7e\xc4\xa9\x54\xf5\x0d\xb7\xb9\xfc\x4e\x67\xec\xb5\x48\xf4\xb5\x28\x51\x88\x9c\xbc\x2b\xb8\x72\xba\xd2\x73\x2e\x33\x27\x42\xbc\x28\xa9\xdd\x1b\xd0\x47\xa7\xe9\x62\x8f\x3c\x4a\x61\x3d\xe8\xb0\xe6\x34\x29\x42\xba\x70\xf7\x53\x20\xbf\x28\xc5\xb5\xd4\x95\xf1\x09\x5f\x95\x45\x66\x61\x2c\xe9\x33\x0b\x39\x0f\xed\xee\x42\x3a\x46\x29\x12\x5d\xa6\x35\x64\x95\xb1\xdc\x56\xa6\x59\x43\x9a\xa0\x4f\x7b\x38\x77\x66\xa0\xe3\x03\x92\x9e\x43\xca\x19\xcc\x98\x1b\xfc\xbc\xee\xbe\xc0\x4c\x3c\xfc\x70\x4a\xdb\xd0\x27\x07\xd6\x89\x89\x4e\xf5\xad\xac\x88\xb6\x2b\x6d\xac\x7b\xaf\x61\x03\x8f\xe6\x00\x9b\x87\x8f\xc3\xb0\xe3\x3a\x17\xb0\x73\x7f\xc4\xf8\x1a\x70\x35\xd9\xe0\xc0\x29\xf1\xf5\xe8\x52\x07\x9b\xd7\x60\x55\x0b\xec\xa3\x54\x2e\xb0\xe1\xab\x17\xd8\xc7\xaf\x60\x60\xa1\xa2\x6c\xf8\x73\xff\xda\x57\xb8\xb5\x4e\x3e\x89\xa5\xf7\x9d\xfc\x06\x94\x5a\x18\x47\x1a\xa6\x73\x69\xad\xf0\x09\x24\xe1\x24\x83\xc3\x3f\xae\xf0\x21\x9e\x03\xbe\x04\xcc\x12\x11\xef\x42\x0f\xa9\x48\x57\x05\x8d\xf3\x46\x1a\x30\x90\xb8\x72\x76\x2d\x22\xda\x02\xef\x18\x53\xba\xaf\xb7\xd5\xb7\x7c\xa8\xff\xb8\x5b\x3e\x14\x5f\x5b\x3e\xc4\xa0\x1b\x57\x06\xc5\x23\x83\x2a\xc6\x7e\x50\x82\xd2\xe1\x53\x91\xb1\x7f\x57\xa2\x5c\x32\xa7\xe8\xd6\x69\xa6\xd0\x6e\xcb\xc8\x94\x12\x35\xc9\x31\xd9\xd7\xba\x7c\xa0\x3a\x1e\x38\x4e\x4f\xde\x39\x3b\x01\x10\x10\x06\xe7\xfa\xed\x07\x34\x81\x8c\x70\x15\xc2\xca\xc4\xd6\x01\xe6\x88\x34\xec\x05\x67\x2a\x1c\x9e\x1d\x0f\x69\xea\x0f\x91\x3e\xc0\x86\x4b\x21\x60\x2b\x2e\x99\xf7\x90\x08\x49\x19\xbe\x01\xc1\x16\xd2\x3c\x82\xa3\x91\x5d\x89\xe5\x88\xb2\xa9\xa8\xd7\xa2\xbf\x19\x13\x13\x9b\x0d\x5f\xfa\x01\x05\x36\xaf\x81\x25\xd0\x90\xbe\x41\xbc\xfa\x36\xf8\x68\x8e\xe5\x89\x3b\x8c\x50\x1c\x58\xc8\x0e\xd0\x08\x24\xbe\x6e\x6b\x0a\x82\xbb\x15\x7a\x08\xf8\x6a\xa9\xb0\x41\xa1\x42\x0c\x38\xec\x30\xdb\x8b\x0d\xed\x9e\xc2\xcb\x2f\xe3\x47\x22\x56\x38\x82\x8d\xb2\x9c\x2b\xb1\xdc\x35\x84\xa5\xa1\x95\x59\xc8\xc2\x77\x89\x04\x3e\x49\xa7\x92\xfd\x00\xf9\x6f\x7e\x08\xe4\x88\xa7\x6a\xc4\xce\xb4\x75\xff\x39\x81\x84\x5e\x8c\xb1\x68\x61\xce\xb4\x85\x4f\x1e\x34\xb9\xf1\xd5\x3e\x12\xb1\x29\x44\x23\x21\xc4\x82\xa9\xeb\x50\xbb\xea\xd3\x3c\x81\xa8\x94\xcb\x13\x16\x46\x1a\x76\xaa\x98\x2e\x3d\x55\xad\x6f\x7c\x65\x68\x08\xef\xbd\x8e\xa2\x61\x6b\xc6\xa0\xc5\xd0\x65\x63\x2d\xde\x33\x5c\x08\xac\x49\xff\x0d\x78\xb7\x21\x12\x19\x72\x53\xa1\xf9\x12\xb7\x62\x2e\x13\x96\x8b\x72\x0e\xb8\x2b\xc9\x62\xe8\x25\x1e\x4a\x2e\xe2\x35\xa0\x74\xc4\x6b\xd0\x7d\x08\x2a\xca\x0b\xc8\x3a\xfe\x38\xea\x0f\x8e\x8d\xe2\x3a\xe7\x85\xdb\x82\xff\xc7\x49\x65\xd8\x05\xff\x17\x9a\xbb\x99\x09\x3b\x64\x46\xaa\x79\x26\x1a\xdf\x91\x3f\x33\x1e\xc6\x8d\xe0\xec\xd7\x7f\x57\xf2\x9a\x67\x02\xab\x04\xb8\x0a\xad\x57\xf4\x6c\x45\xe9\x1a\x51\x87\x37\xc7\x97\x43\x0c\x7e\xe7\x4a\x2c\x77\x46\x2b\xdb\x76\xe7\x54\xed\xd4\x10\x4e\x8d\x8d\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\x66\xec\x60\x7b\x92\x5c\xce\x47\x19\x37\x66\x08\x34\x99\x56\x41\x78\x6b\xf4\x75\x8d\x25\x2e\xa2\x7b\xea\x92\x70\xaa\x40\x19\xdc\x8f\x0e\x15\x90\x43\xe5\x03\x0f\x40\xff\x6b\xea\x67\xdd\x17\x86\x6e\x2d\x14\x38\x80\xb0\xf9\x0a\xd9\x06\xa2\x42\x9d\xa6\x73\x0b\xc5\x7f\x80\x88\x88\x9e\xb1\xe7\x75\xc3\x08\x69\xc0\x45\x25\x7d\xcd\xac\xd2\x96\x49\x95\x64\x15\x05\x43\xe0\xa7\xe0\xe0\x1a\xc6\x80\x1d\x8c\xbc\x83\x6f\xec\x7a\x58\xbf\xa3\x7d\x4a\xd1\x4a\x21\x54\x3b\xfb\x03\xf2\x6d\x42\x36\x05\x52\x7b\x93\xd4\x9a\x75\x2a\xf9\x68\x36\x3a\x49\x9a\xfa\xe5\x73\x39\x2d\x05\x3b\x5a\x70\xa5\x44\x16\xa1\xc8\x90\x33\x94\x5b\xcb\x93\x05\xc6\xec\x38\x73\xe7\x38\x13\x76\xd7\x60\x83\xfe\x9c\x27\x0b\xa9\x02\xae\x82\x0a\x68\x4a\x75\x5d\xd9\x06\x5a\x03\xf5\x35\x90\x06\xec\x2a\xb3\x4b\x6d\x65\x68\xdf\xc5\xfd\x5c\x9a\xdd\x66\x6a\x80\xf2\xf6\x3d\x35\x52\x3f\x9d\x79\xa0\x3c\xca\x65\x68\x7d\x02\xf7\xbe\xbf\x5f\x4d\x1e\x1c\xda\x52\xcd\x44\x59\xe2\x0a\x4d\x05\xfd\xa0\xd5\x63\x76\x42\x4d\x2c\x16\xfa\x86\xa5\x9a\xdd\x40\xb7\xd5\x6b\xa7\x40\x40\x2a\x92\xf1\xaa\x47\x34\x53\x48\x0c\x4c\x74\x5e\x94\x3a\x97\xc6\x97\x3f\xd2\xf6\xd8\x18\x60\x4a\x56\x75\xc6\x9c\x6d\xae\x62\x56\xa9\x66\xb3\xc7\xe7\x47\xcc\xf2\x72\x2e\xac\x7b\x06\x53\x55\x3e\x15\x3d\x71\x61\x36\x8d\x4a\x3e\x68\x17\x90\xdd\xd0\x06\xa4\x41\xb5\x0f\xf4\xf7\x60\xaf\xfd\xaf\x20\x81\x10\xd2\x14\x67\xba\xa4\x64\xcb\xf0\x25\xc1\xd0\xbb\x5d\xf8\x03\x09\xce\x4a\x59\xd3\x13\x15\xbe\x4f\x7f\x10\xdc\x0a\x3f\xfe\x78\x36\x0c\xac\xfb\x6e\x3d\xde\x6d\xbb\xee\x46\x97\x59\x7a\x23\x53\x54\xce\x0c\xdb\x73\x37\xef\xf7\xa3\xc0\x06\x51\xde\x7b\x9f\xf4\x9b\x1b\x99\x0e\x44\x7c\x18\xaa\x49\x74\x9f\x47\xed\x88\xce\x80\xea\x32\x15\xca\x3a\x66\x59\x1a\xb6\x07\xbf\xd8\x67\x27\x12\x2b\xf1\xe1\xf7\x00\xa2\x9a\x4f\xa5\xaa\x51\x1e\xea\x45\x75\xe2\xd2\xf1\x0d\x6f\xde\x1b\x61\xb1\x86\x1a\xca\x90\xb5\x5d\x30\x23\xf3\x2a\xb3\x5c\x09\x5d\x99\x6c\xd9\x73\x6b\x3f\xd6\x85\x9d\x65\xe2\x1d\x9e\xf0\xfe\x4a\x4f\x18\xaa\xa9\xfc\x40\xa2\x6d\x0d\x9c\xb2\xa2\xfd\xd4\xa9\xe0\xe9\x41\xd0\x84\x02\x10\x80\x78\x27\x12\xaa\x11\x2b\xb2\x6a\x2e\x3b\x15\x05\x6f\xfb\x20\x76\xfa\xf5\xdd\xfa\x20\xd6\xed\xde\x2a\x23\x6a\xe4\xb2\x7e\x7d\xc8\x1f\x60\xdb\xc2\xcd\xea\x97\x97\xeb\x5b\x16\xa6\xa2\x10\x2a\x05\xe8\xf4\xe7\xf5\xf9\xc3\xc9\x6f\x8c\xf6\x04\x59\x3e\x8c\xac\xf0\xf8\xe7\x0d\x29\x1d\x25\xde\x2f\x74\x96\x1a\x26\xde\xd9\x92\x3b\x71\x90\x3b\xc6\x1f\x7e\x33\x63\x5c\xf5\x65\xed\x9f\x4b\xe3\x2d\xf6\x89\x34\xd0\xf4\x33\xd5\x40\xcd\xa0\x1d\x39\x77\x4d\xdc\x87\xb3\xa6\x5e\xe3\xe3\x81\x9b\x73\xa2\x00\x25\xee\x60\x9a\x75\x68\x6b\x9a\x68\xd2\x53\x9a\xf5\x2f\xfd\x9a\x69\x9a\x35\xad\xf5\x5a\xb3\xda\xe0\x61\xdd\x76\xd6\x7c\x5c\x9d\x35\x67\x00\xf7\xd4\x1f\xfc\x98\xc6\x69\xf9\xec\xe8\x43\x52\x5b\xef\xe2\xa3\xa3\x13\x15\xc9\x64\xe8\x94\x43\x03\x11\x6c\x02\x33\x6e\x35\xea\xe2\x88\x4a\xa9\x6e\xdc\x7c\xd3\x7d\x07\xb9\xe5\x46\xd8\x3e\x9e\xe4\xa6\x82\x59\x8f\xe7\x58\x4e\xbc\xf3\xe9\x2b\xec\xde\x09\x85\x9e\x1e\x02\x89\x8d\xff\x46\xba\xa8\x6a\xdc\xe9\xb4\x50\x4f\x77\x0f\x8e\x2c\x42\x66\x19\x8e\x91\xba\xd5\x4e\xb8\xed\xd9\x90\xbe\x87\x34\xa6\xd9\xbe\x79\x73\x7a\x3c\x24\x09\xdd\x78\x5e\x5b\x85\x7f\x37\xc9\x48\xbb\x14\x00\x74\xe5\xbf\xab\xd8\xd0\x06\xe8\xc6\x40\x38\xba\x7f\x13\xd4\x99\x27\xa2\x0e\x13\x1c\x4b\x73\xd5\x1f\xe0\x7c\x65\xc8\xe6\x71\xff\xf6\xe8\x84\xd1\xa7\x77\xf2\xce\xdf\xc7\x3d\xdf\x17\x15\x7b\x9e\x88\x3a\x70\x97\x4a\x73\xb5\x01\x70\xf4\xbe\x36\x70\x91\x9e\x75\xab\xe3\x7c\x98\x91\x86\xb6\x85\xe7\x61\x54\x23\x7c\xdf\xa5\xae\xd8\x0d\xc1\x08\x92\x85\x78\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x86\x56\x7b\x28\xa7\x6f\xdd\xd9\x5e\x04\xa4\x46\xf3\x6c\xb0\xa8\xc4\xd0\x3b\xf5\x73\x09\x73\x14\xbc\xb4\x60\xc8\x0d\xb3\x91\xc2\x70\x9e\x4f\x47\x1f\xa8\xbb\xec\xa4\xd3\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\xb9\xbd\x13\x81\x8c\xc6\xbb\xe5\x79\x00\xf6\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\x4f\x77\x26\xec\x42\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\x62\xd7\x0f\x08\xd9\x2c\x4f\x76\xd8\x9e\x2e\x61\xe4\x84\x2b\x96\x09\x8f\xb9\x40\xa7\x7a\x89\x76\xc7\xfe\xc3\x60\x91\xec\xc1\x44\x8a\x90\x5b\x0e\xb4\xd7\x52\xaf\x53\x91\xbc\x6f\x80\xd6\x1e\xd7\x02\x4f\x2a\x27\x05\x27\xec\x0d\x89\x2f\xd2\x0b\x70\x33\xc0\x61\xf6\x77\x3c\xac\xc5\x7a\x78\xfe\x90\x4e\x9e\x8d\xd5\xd0\xdd\x43\x23\x74\x57\xef\xc9\x5c\xda\xd7\xa2\xd0\x03\xe8\x70\x38\x50\x2b\xbe\x20\xad\xfb\x40\x1b\x09\xed\x69\xb8\x65\x1c\x59\x52\x52\x65\xdc\x19\x75\x18\x5d\x98\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\xd8\xb7\x34\x92\x8c\xed\x80\x09\xbb\x8c\x71\xa7\xa3\x8a\x36\x02\xf7\x0d\xcf\x1a\x11\x8b\xe5\xaa\x6e\x9c\x01\x38\x9c\x5c\xb1\x53\x25\x6d\xdd\x32\x0c\xeb\x02\x32\xad\x28\xd3\xdf\xfd\x9a\xa2\x1b\x73\x89\xf9\xa8\x8a\x06\x73\x5f\x37\x47\x83\x13\x8a\x0d\x76\xc2\x54\x3a\x39\x48\x36\xac\xfc\xd5\xcb\xb3\x09\x43\xd5\xf7\xc2\x19\xc6\xc6\x0a\x7d\x90\x3c\x0c\x04\x46\x8b\xeb\xcf\x51\xd8\x86\xb6\x8f\x1e\x58\x57\x97\x8d\xae\x8c\x93\xc9\xee\x84\x39\x31\xbe\x3b\xd9\xf5\x2a\x5f\xb6\xd2\x3a\x34\x0c\x1a\xe3\x97\x37\x37\xfc\x84\xb1\x57\xbe\x6c\x12\xc0\xa7\xd6\x77\x21\x45\xfc\xc5\xa8\xe7\x64\xeb\xd8\xf8\xd2\xfd\x6a\x1a\x3f\x94\x00\xcf\xe7\xf2\x5a\x28\x7c\xb1\xcd\x71\x6a\x3f\xd5\x41\x96\x31\x7e\x73\xb2\x94\x5f\xbf\xd8\xdc\xbb\x21\xc7\x19\xe8\xcd\x88\x7d\xd1\x7b\x25\x3a\xcf\x11\xa1\x7b\x11\xc0\x64\x6a\x3c\x98\xc0\x1d\x37\x62\xe5\x23\x2e\xf9\xac\xd3\xc1\x6e\x49\x06\x3f\x54\xcb\xaa\x0f\x1f\x53\x79\xb3\xaa\xcd\xa9\xfb\xf7\x31\x23\x60\x7c\xe3\x41\x56\x49\xcc\x1e\x84\x87\x1f\xbc\x3e\x39\x3c\x7e\x79\x32\xc9\xd3\x47\xc8\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\xb2\xf7\x30\xed\x61\x74\xb8\x30\x9c\x3f\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\x76\x97\xd5\x85\xce\xf4\x7c\x7d\x03\xb4\x7b\x6c\x9b\xdf\x21\x42\xee\x98\x8f\xdd\x7e\xdc\x9c\xb1\xdb\xbd\x8f\x72\xdb\xce\xc5\xbe\xc9\x8e\x90\x35\xb5\x82\xdd\x08\xed\x8e\x3f\x03\x82\x7d\x42\x33\x62\x85\x8a\xe8\xce\x01\xf6\xe6\x9b\x50\xd4\x5d\x1d\xa2\xee\xea\x77\xb5\x2f\x36\x43\xfc\xae\xa6\x85\xe3\xe4\x5d\xdb\xf8\x37\xa9\xee\x47\x6a\x0a\x90\xa2\x14\xe3\x00\x9b\x0d\xed\xbd\x75\x19\xa9\x65\xb1\x3c\xf1\x9e\x60\xef\x37\xc6\xbb\xb2\x65\xdb\x23\x5c\x6b\xf2\xc1\x11\x8f\x58\x84\x59\xb6\xac\x5b\xa3\x90\x37\x8c\xcf\x11\x0e\xbb\xa4\x80\x5c\x51\xca\x6b\x99\x89\x39\xb4\x3d\x92\x6a\x1e\xc1\x38\xc5\xc0\x4f\xd4\x06\xa9\x19\x9c\x7a\xe9\xfe\x8a\x5a\xef\xc1\xce\x3a\x7b\x75\x09\x1d\xb4\x20\xa5\xa2\xb7\xc1\xe9\x1e\x08\x67\x7e\x3c\x1e\x83\xeb\x6f\xef\x5f\xce\xf2\x49\xb3\x7d\xf6\xa3\xa0\xe7\x68\x68\xf1\x55\x42\x9b\xfb\x85\x0e\xfd\x96\x60\xae\x35\x65\x61\x43\x63\x1a\x1f\xdd\x75\xe0\xee\x74\x1a\x35\x8a\xf2\xc6\xfd\x52\x00\x64\x77\x9d\x67\xf0\x18\xad\xa4\x0d\x09\xd0\x81\xb9\xbd\x0f\x36\xad\x3b\x23\x21\x7d\xc0\xcb\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xe2\x67\xda\xed\x63\x2c\x67\x96\xea\xca\x9f\x9a\x52\xf0\xec\x76\x89\xd1\x65\x8f\x6e\x4c\x5a\xd8\xc1\xe2\x11\x10\x2f\x70\xdc\xe2\x3b\xcf\xbc\x28\x01\x2c\x66\xf5\x3b\x3b\x8f\x9a\x62\xd2\x24\x46\xf6\x67\xef\x30\x4c\x83\xb7\x2b\x76\x7a\x71\x74\x71\xfa\x49\xa3\x7e\xb7\x09\x57\x98\xdd\xa3\xb6\x1e\xe4\xbf\xbb\x65\x55\x8d\x59\x56\x75\xfd\x25\xba\x5e\xce\x75\x69\x79\xb6\x01\xc6\x99\x2c\x78\x71\x58\xd9\xc5\xb1\x34\x80\xd6\x38\x8c\xfa\xb7\x32\x6a\x54\xaf\x88\x7d\xe8\x7c\xc3\x0d\xe9\xb7\x2f\xdd\x77\xf4\xdd\xe1\x39\xe3\x95\xdb\x8f\x96\x5a\x0c\x6d\x2c\x59\xce\xbf\xc5\x05\xd6\x40\x0f\x4a\x19\x1a\xf3\x03\x74\xf1\x77\x3d\x24\xaa\x7c\xba\xaa\xb7\x6d\x3c\x1a\x24\x17\x72\xfd\xcf\x24\x06\x2d\x95\xb4\x92\x5b\x5d\x0e\x16\x1b\x6c\x8c\x18\x1c\x86\x95\xb1\x3a\xa7\x53\x74\xea\xef\x80\x84\x2c\xd0\xdf\x56\x7e\x54\x7b\x13\xc1\xfa\xfc\xff\xd9\x7b\xd7\xee\xc6\x6d\x6b\x61\xf8\x7b\x7e\x05\x96\xdb\xb5\x6c\xa7\x92\x3c\x93\xf6\xa4\x3d\xf3\xf6\xb4\xcb\x19\xcf\xe4\xf8\x64\x2e\x7e\x6c\x27\x59\xcf\x93\xc9\x69\x20\x12\x92\x50\x93\x00\x43\x80\xf6\xa8\x97\xff\xfe\x2e\xec\x0d\x80\x20\x45\x49\xa4\x44\x5f\x26\x21\x3f\x24\x63\x8a\x04\x81\x8d\x8d\x7d\xbf\x00\xcc\xcf\x85\xd1\x15\x69\xc4\x6a\x69\x36\x23\x68\xfd\x83\x63\x73\xff\xcc\x9f\xad\x11\x1d\xaa\xd8\x27\x7f\x79\x51\x69\x8e\xb9\xd2\xc1\xd8\x59\x31\xcb\xf6\xb8\x8f\x66\x95\xe6\x3f\xf7\x43\xda\xf8\xcf\xa2\xe6\x4f\x40\x10\xfd\x9f\x82\x26\x08\xda\x77\x8f\x69\x7c\xaf\x6e\x69\x3f\x2b\xae\x62\x89\x5d\x7c\x89\x12\xef\xbc\xb5\xad\x50\x58\xa3\x1f\x21\xa2\x73\x2a\x94\xc1\x93\xaa\x3d\xe3\xd0\x06\x40\x1c\x92\x23\x1d\x65\xc7\x8f\x06\xa9\xbe\xd2\x61\x93\x42\x84\xc2\x2a\xae\xfd\x1a\x51\xe3\x8d\x4f\x87\xdd\x6f\x99\x8f\x1e\xe4\x00\xa7\xbd\x1f\xbb\xad\x1d\xcb\xe3\x51\x08\x2f\x14\x10\xc9\x1b\xae\xb4\x6b\x20\x0c\x37\xb8\xb2\xbd\xd6\x40\x17\xb8\x20\x32\x27\x3c\xfb\x1b\x8d\xe3\xfc\x05\xca\x11\x56\x57\x85\x7f\x2b\x5f\x0e\x9f\x0a\x1f\x6d\x73\xa4\x97\x99\x6d\xe2\x71\xfd\xf2\x82\x60\xa3\xf0\x3f\x7d\xf9\x0c\xf4\x82\xdf\x7f\xf1\xe5\xb3\x3d\x11\xf1\x53\xcd\x2a\x24\x7d\xdb\x44\x7b\x8f\xac\xf8\x85\x64\x91\x54\xb2\x45\x0c\x2c\x40\xda\xbd\xc2\xe4\x0c\xc3\x27\x2d\xd1\xc4\x83\x60\xb0\xd2\x73\xef\x3e\x65\xe2\x21\xeb\xe2\x57\x94\x75\x41\x7c\x36\x3e\x12\xd6\x5e\x10\x39\x1c\x10\xca\xea\xac\x12\x70\xa4\xdd\x17\x9f\x0a\xed\xde\x11\xba\xbb\x62\x72\x15\x83\xc3\x10\x3f\xd7\x3a\xbf\x4c\x4f\x3d\x7b\x77\xf5\xb7\x37\xa7\x5f\xbd\x7a\x03\x6b\xb5\x51\x81\x06\x3d\xad\x26\xb4\x4b\xcc\x7a\x7b\x74\xdf\xdd\xb8\xb5\x2b\x48\xfb\x08\x30\x10\xb5\xd0\x02\x41\xde\xbd\xbe\xea\x1a\x55\xb0\xaf\x3a\x2b\x66\x7b\x40\xef\x53\xf3\x6b\x40\xa7\x75\x96\x3f\x4e\xe6\x7c\xcf\x4e\x91\xa0\xec\x7d\xc5\x8e\x62\x70\x08\xd7\xb8\xb7\xa9\x63\x47\xdc\x20\x4f\x4e\xd6\xdb\xec\xff\x36\x10\x43\x28\xf6\xee\xf9\x7e\x50\x68\xef\x27\x43\xe6\x7d\x95\x75\x38\xc4\xb1\x9c\xf8\x68\x48\x18\xf2\x8e\xdc\x70\x55\xc3\x4f\x99\xf2\xdd\x98\x7f\x01\xd8\x9a\x35\xb5\x1e\xdc\x9f\x3b\x34\x0e\x6b\x7b\x70\xbb\xd6\x4b\x41\x54\x41\x25\xaf\x7b\x5d\x03\x4f\x17\x91\x49\xad\x21\x4c\x65\x34\xea\xb5\x21\x7c\x79\x0b\xef\x40\xe9\xbd\x4f\x91\xc1\xc0\xc4\x1f\x29\xbd\xcc\x7f\xbb\x9f\xe3\xe8\x87\xab\x57\x5a\xe9\x84\x25\xae\x7d\x79\x26\x5d\x25\x9d\xb0\x24\xcb\x93\x44\x21\xf2\xe4\xf8\x90\x67\x43\xdf\xef\x68\x6e\x78\x4c\x53\x43\xb6\x90\x5a\x8a\x9e\x73\x68\x9b\x06\xad\x12\xb6\x0b\x78\xe2\x25\x66\xba\x27\x2c\x0f\xe8\x2d\x66\x10\x79\xb7\xba\xd1\x3c\x1c\xeb\x96\xc2\x39\xd8\xab\xee\xf5\x4f\x8f\x12\x65\xf1\xf9\xd9\x23\x10\xa1\x5f\x5a\xb1\xa3\xae\x6e\xc2\x47\x0b\x94\x8d\x7b\xca\xdc\x37\x03\x39\x98\x9f\x9f\x59\x75\xc1\xa5\xe5\x2b\x7b\xac\xc8\xfa\x73\xf5\x28\xa2\x94\xcc\xf5\x9d\xcc\xfb\x2a\x1f\x57\x1d\xae\x16\x85\x69\x7f\x5b\x29\xc6\xf1\xcb\xa4\x22\xb8\xca\x4f\x9e\x92\x5c\x01\x25\xa9\xb5\x41\x5d\x47\x51\xee\x83\xa0\x7c\x3a\x84\xe4\x7e\x04\x97\xfb\xad\xc4\xf5\x68\xea\xaf\x3b\x1e\xbd\x00\xcb\x0d\x66\xcd\xa0\x06\x51\x4a\xba\x4b\xc1\xdc\x1c\x50\x9e\x47\xa1\xb3\xb9\x34\x74\x68\x37\x72\x52\x25\xb1\x6e\x24\x74\x0e\x62\xdb\xc6\x24\x31\x3b\x2b\x45\xd8\xf0\xd1\x16\xeb\x1a\x11\xec\x99\x98\xd2\xcc\x36\xcd\x8f\xe5\x9d\xb8\xa3\x79\x4c\x4e\x2f\xce\x1f\x9e\xae\xee\x9d\x09\x8a\xe7\x61\x9f\xde\x02\xd5\x5c\xd0\x72\x3c\x88\xc0\x87\x20\x21\xf3\xc7\x94\x6b\x85\xa1\xfc\x10\x8c\xaf\x43\x6b\x94\xe1\x53\x3e\x92\xc5\x50\x3a\x43\xd5\xec\x48\x81\x58\x25\x88\x8c\x34\x4d\x5c\x23\x66\xa6\xef\x18\x13\xe4\xd9\xb3\x67\xe8\xa0\x78\xf6\xc7\x3f\xfe\x91\x40\xd7\xcd\x98\x45\x3c\x5d\x7d\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9e\xbe\x7d\x43\x68\x04\xba\x1c\x56\xbe\xc5\x91\x61\x3f\xc3\x97\xd5\x88\xfc\xcf\xd5\xfb\x77\x8e\x7d\xa9\xda\xaf\x80\x2e\x7e\x79\x13\x72\x16\xc4\xde\x87\xce\x03\xaa\x17\x00\x0d\x21\x35\xa1\xb3\x19\x22\x1c\x50\x6e\xae\x1c\x31\x71\xb5\xe7\xf8\x7c\xe1\x3a\xd1\x1b\x54\x4b\x20\x29\x80\x9b\x29\x82\xc3\xc6\xd5\x71\xc4\x1c\x07\x18\xcb\x33\x11\x98\xca\x88\x24\xfc\x86\x91\x99\x82\x7e\xf4\x65\xe3\x94\x9c\x29\xa3\x80\x45\x54\x98\xd1\x71\xb0\x72\x67\x14\xdb\xb3\x36\xe6\x63\x47\x4e\xec\xd9\xb9\xbc\xea\x42\xb6\x67\xde\xb5\x10\xb3\xbd\x01\x5d\x8e\x16\x92\x0c\xb3\x0b\x9f\x6a\x24\x43\x65\xb5\x17\x7e\x3d\x88\x54\xb6\xfa\x61\x49\x19\x69\x22\xc5\x3c\xc4\xc1\x52\xfa\x70\xc1\x94\xcb\x8c\xed\x0a\x8c\x9e\x1a\xea\xf4\xd3\x9e\x0e\x89\xfb\x5b\x9a\xed\xd7\x09\xa4\x1a\xa3\xeb\xc6\xac\xd4\xa1\xa4\x53\x59\x68\x17\xb3\x67\x7f\x87\xf2\x6d\x5a\x3a\xd0\xef\x35\x85\xde\xba\x14\xf5\xd7\xf7\xaf\xa7\xa6\x5b\xd5\x98\x39\xe0\xda\x55\x91\x75\x44\x18\x8d\x16\xe4\x86\x2d\xc7\xc8\x01\x32\x0a\xd5\x23\x00\xda\x67\x06\xc6\x95\x36\xfc\xde\xf2\x1c\x1b\x6d\xd2\x6e\x85\x0b\xb0\x0c\xe4\x03\x57\x7d\xc2\x29\x5c\xca\xca\xe5\xb6\x95\x95\x08\x2c\x94\xae\x77\x65\x24\x85\xb6\x7d\x31\x7d\xef\x2a\x08\x18\xad\x15\x24\x30\x14\x86\xc5\xe6\x35\xb5\xe9\xcb\x65\x54\xa9\xe1\x28\x56\xfe\x28\xc4\xca\xdb\x50\xcf\x1d\x62\x7a\x15\xb3\x95\x91\xa8\xeb\x89\x18\x44\xa6\x2e\x78\x04\x19\x47\xe6\x71\xfb\xac\x83\x92\x07\x44\xa5\x60\x82\x62\xba\xb0\xa0\x81\x38\x61\xf3\x6d\xa6\x14\xe1\xb0\xc2\x94\xe6\x37\xcc\x15\x1a\xa6\xc9\x84\x5c\x98\x49\xfa\x6a\xf3\xd8\x4a\xf0\x16\x13\x44\x0c\x8d\x09\x2b\x41\x98\x8f\x1c\x4e\x26\x87\xc8\x2a\x1b\xea\x42\xec\x8d\x35\x7d\x76\x91\xeb\xad\x7b\x5c\x05\x95\xdf\xd2\x4c\x61\x37\x3d\xa3\x5a\x40\xc7\x4a\x09\x75\x5b\xf4\xc2\x09\x13\x74\xcf\x12\xe2\xe1\xd5\x73\x1b\xb3\x7e\x3b\xa1\xf6\xd7\x07\x75\x0f\x5f\x7b\xf5\xea\xbb\xff\x69\x8f\xdd\x4f\xd7\xf5\x3e\xb5\x38\x64\x29\x49\x5f\x1d\x19\x7b\x6f\xb9\x99\xf6\xd0\xd8\xcc\x5d\x55\xd7\x11\xc8\xb7\x95\x5a\xd2\xad\x74\x11\x5b\x4a\x3d\x61\x9f\x94\xf2\x71\x3e\x03\x92\xda\x5c\xeb\x26\xd4\xcb\x1c\x87\x31\x10\x78\x7c\xad\x63\xdf\x2e\x7b\xee\xba\x8f\x36\xf5\xfb\xab\x25\xf5\x6b\x9f\x20\x9a\xfa\x55\x35\x64\x04\x65\x25\x3c\xab\x0d\xb3\x8f\x61\xab\xb4\x84\x6e\x9d\x25\x71\x98\x90\xb7\x96\x15\x23\x92\xd3\xa9\x92\x49\xa1\x7d\x25\x8a\x06\x3e\x0d\x83\xba\xde\x9e\x58\xb4\xc9\x3d\x16\x70\x6d\x90\x57\x90\x95\xf5\xc3\xc0\xf1\xea\x91\xf8\xec\x1b\x20\x8b\xd7\xaf\x2c\x4c\x16\xaf\x1e\x77\xc1\x89\x8b\x3d\xef\x84\x1b\xd6\x57\xef\x74\x19\x91\x15\xe9\x16\x62\x64\xb5\x42\xd1\xd9\x09\xaa\x98\x43\xb9\x6b\x05\xec\xf2\xda\xdf\xaa\x6b\xd7\x65\x0d\x8c\xa7\x17\xe7\x3d\x6a\xa5\xc1\xa8\x6b\xf4\xd2\xf0\x89\x41\x33\x6d\x73\x55\x00\x7c\x8e\x9a\xa9\x11\xe9\x9d\x01\xe9\xac\x84\xa8\x75\xe9\x19\xa2\xfc\x2b\x50\x6d\x56\x16\xfe\xda\x30\xa3\x30\x99\xab\xda\xa1\x03\x8d\xc1\x25\xdb\x0a\xba\x7a\xb8\x18\x1e\x20\x71\xbf\x7c\x35\xe8\x89\x2a\x2f\x00\xfd\x3d\x32\x76\xea\x57\x95\x8b\x5e\x3a\x20\x92\x2b\x96\x18\xa6\x47\x6a\x26\x9b\x4c\xc6\x2f\xb0\xe7\x37\x15\x42\x6a\xc0\x1b\x35\x22\x09\xf4\x23\x1f\xa1\x29\xc6\x48\xa0\x41\xf4\x57\x1e\x38\x4d\x7b\x96\x39\x7b\x43\x1e\xd2\x3b\x02\x11\x40\x22\x80\xdd\x45\x3f\x98\x44\xee\x01\x9b\xcc\x55\x8a\x2a\x7d\xb6\xe5\xaf\xe0\x95\x1d\xdf\x21\x91\x8a\x16\x2c\xa5\xd8\x8f\xc4\x01\xc8\xd0\xeb\xbb\x9c\x6b\xcd\xb0\xea\x38\xcb\x53\x45\xe4\x6c\x54\xf1\x1b\x1f\xdc\x3e\x3f\xe8\x4b\x9e\x25\xf7\xa1\x50\x13\x77\x42\x77\x2d\x03\xb6\xee\xaa\xfa\x0d\x2a\xca\x85\x39\x9d\xa0\x4d\x27\xd0\x20\x49\xd4\x0c\x96\x46\x88\xb8\x45\xf8\x3f\x69\xd0\xdd\x9f\x2d\x62\x57\x1b\xc4\xc8\x0b\xa6\x83\x0d\x62\xb0\x41\xf4\x31\xe2\xbd\xd9\x20\x02\xc6\xed\x88\x69\x83\x3d\x22\x4c\xc4\x73\x46\x89\xb2\x94\x45\x50\x26\xda\xa0\xbc\x33\x47\xc8\xbc\xea\x2b\x38\x9c\x4c\x0e\x0f\x9d\x91\xc2\x9e\x8f\x42\xcf\xc6\x7f\x22\x4c\x44\x32\x46\xa4\x32\xe3\xe7\x4a\x83\x50\x5b\x6a\xe5\xe1\x5c\x52\xf7\xad\xd0\xdf\x00\x63\xf7\x8b\x12\x3d\x52\x28\x17\x92\xf2\xfa\x5e\x45\xb0\x52\xf0\xf2\x65\xc0\x2c\x00\x7d\xb5\x44\x2b\x81\x95\x21\x32\x09\x4f\xb9\xad\x4f\x68\xc8\x05\x53\x5a\x91\x23\xbc\x39\x89\xb2\x62\x64\x1f\x98\xa4\x2c\x95\xf9\x72\xe4\x1f\x32\x3f\x56\xde\xb2\x4f\x1c\x83\xd4\x16\x15\x79\xce\x84\x4e\x96\xbf\x5e\xf9\xcd\x81\xf8\x09\x8b\x6f\x1e\x2b\xf6\xc9\xfb\x68\xba\xaa\x68\x59\x36\x11\x00\xeb\x9d\x87\x36\xf0\x21\x9b\x81\x31\x2a\x8d\x3f\xe6\x2e\x13\xb7\xe4\x96\xe6\x3b\x67\x60\x34\x5d\xf7\x22\xb1\xc5\xfc\x96\x2b\xb9\x73\x0e\x5b\xe3\x90\x21\xf0\xae\x2c\x53\x46\x1b\xb1\x2c\x74\x56\x68\xcb\x5d\xdc\xd9\x76\x25\xfb\xfc\x99\xae\x09\xbe\xcf\x0f\x7a\x9c\x5c\x46\xb5\x66\xb9\x78\x41\xfe\xf7\xe8\xc3\xef\xfe\x35\x3e\xfe\xeb\xd1\xd1\x0f\xcf\xc6\xff\xf9\xe3\xef\x8e\x3e\x4c\xe0\x1f\x9f\x1f\xff\xf5\xf8\x5f\xee\x8f\xdf\x1d\x1f\x1f\x1d\xfd\xf0\xcd\xdb\xaf\xaf\x2f\x5e\xfd\xc8\x8f\xff\xf5\x83\x28\xd2\x1b\xfc\xeb\x5f\x47\x3f\xb0\x57\x3f\xb6\x1c\xe4\xf8\xf8\xaf\xbf\xed\x71\x11\x54\x2c\xdf\xf7\x46\x82\xf1\x1a\xdf\x8b\x18\x51\x1d\xbb\x67\xd4\x25\xe4\xe3\xb8\xb4\x68\x8f\xb9\xd0\x63\x99\x8f\xf1\x23\x2f\x88\xce\x8b\xbe\x48\x57\xc9\xfe\xee\x8f\xc6\x94\x42\x4c\x59\x01\xd3\x29\x36\x4f\x90\x88\x60\x60\x6a\x8f\x96\x61\xdb\xc7\xb6\xd9\x28\x6c\x7f\x1c\xec\xc1\x6d\xae\x7b\x8c\x54\xb2\xf5\x6c\x7e\xe5\x61\x4a\x57\xb6\x9b\xf2\x10\xa3\xb4\x72\x0d\x31\x4a\xab\xd7\x10\xa3\xd4\xf1\x1a\x62\x94\xdc\x35\xc4\x28\x0d\xf6\xc1\xfd\xaf\x5f\xb9\x7d\x70\x88\x51\xea\x7a\x0d\x31\x4a\x3b\x5f\x9f\x50\x8c\x12\x0a\xf9\x4d\x91\x4a\x56\xcc\x2f\xc3\x94\x9e\x6c\x94\x92\x32\xf8\x10\xb1\xd3\x28\x92\x85\xd0\xd7\xf2\x86\xed\xe9\xc8\xad\xe9\xa4\x2b\xa3\x43\x49\xc4\x35\x3a\xea\xea\xc3\x4f\x52\x61\xed\x4b\x1e\xed\x41\x7e\xec\x4f\x72\xa4\x45\xcc\x8d\x8e\xda\xf3\x61\x71\xc3\x86\x65\xb1\x45\xcc\xe2\xf2\x07\x4b\xd2\xb4\xd9\xef\x09\x39\x25\x39\x8b\x78\xc6\x0d\x03\x80\x5a\x41\x70\x1f\x8f\x8f\xef\xe2\xcc\xb5\x62\xc9\xcc\x76\xb2\x15\x65\x9a\x73\x1e\xe8\x9f\x96\xa3\x34\x7e\x06\x65\x08\xe9\x7a\x8d\x12\xb5\x90\x45\x12\x93\x9c\xfd\xdd\x09\x1f\x76\x36\xd7\xe1\x08\xa1\x49\x15\x96\x52\x7e\xd6\x0e\x4e\x33\x6e\x8b\x8a\x3d\x25\x32\xc8\x3e\x66\x3c\x87\xc3\x76\xc5\x22\x29\xe2\xbe\x2d\x24\x2b\xe3\x97\xb2\x02\xf8\x85\x58\x4c\xe2\x02\x1f\x80\x74\x4c\x9a\xf0\x98\xeb\xa5\x8f\xe7\xc0\x63\x6f\xc4\x56\xec\x1d\x6c\x11\x41\x95\x1b\x41\x68\x96\xe5\x92\x46\x0b\xa6\x82\xaf\xa1\x10\x6a\x0b\x65\xf8\x2c\xcf\xa4\x98\x73\x81\x72\x28\xbc\x63\x84\x95\x64\x49\x72\xa9\x5d\x68\xda\x9a\x0f\x5e\x07\x83\xc1\xeb\x28\x71\xe8\x7c\x09\xf1\x6b\x32\x1c\x02\x67\xc5\x67\xe1\x1f\x8a\xc8\x24\x76\xa5\x59\xff\xf4\xcc\x08\xfe\x91\xc5\x62\xc3\x04\xa0\x68\xa6\x96\x24\x31\xc2\x93\x61\x0c\xeb\x5f\xfe\xe2\x0f\x64\x21\x8b\x5c\x4d\xc2\x62\x7f\xcf\xe1\x1e\x5a\x38\x9c\xe2\xa0\x49\xc2\xa8\xd2\xe4\xf9\x33\x92\x72\x51\x18\x8e\xdf\x13\xe2\xf5\x25\xeb\x06\x52\xee\x97\x7f\xd8\x73\xb4\x7e\xe4\xdb\xb5\x92\x6d\x86\x1d\xf3\xac\x78\x6b\xcf\x38\x16\xf4\xc0\xae\x99\x35\x61\xd7\xb2\xa4\x70\x17\x85\x96\x8f\x7c\xf2\x7f\x2e\xe4\x74\xa9\xf7\x2f\x61\x63\xc7\xa9\xd6\xae\xf9\x3f\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x1d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\x9d\x3a\x7c\x97\x35\x6f\x76\x78\x79\x5f\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf1\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\xdd\x0b\x58\xfb\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xe9\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x91\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xc7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x67\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x61\x22\x26\xdf\x2a\x07\xb8\x78\x29\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x1b\xbd\x53\x68\xd2\xcd\xf9\x6d\xc4\x9c\xec\x68\xde\x7b\xac\xc5\xdf\xee\x5c\xad\x8e\x34\x97\x8e\xb2\x6d\x4c\xf1\x14\x02\x4b\xf7\x9e\x4b\x28\x13\x4f\x13\x43\xe2\x96\xbe\xe6\x4f\x0d\xc1\xa6\x4b\xb0\x7b\x3d\x4a\xe5\xb1\x7c\xba\x7f\x4d\xa9\xc3\x7c\x1a\x57\x89\xd9\x25\x8d\xa5\x22\x5f\x25\x32\xba\x21\x67\x0c\x94\x86\xfb\x6c\xbe\x9f\x4f\xe3\x4f\xbb\x71\x66\x4a\xe7\xbb\x45\x8c\x8c\x49\x2a\x05\xd7\x32\xdf\x85\x1e\x3f\xa1\x42\x81\x43\x2b\xc3\x36\x15\xd3\xcd\x39\xfb\xa5\x34\x32\x34\x28\xdf\x0f\xea\xc0\x50\xde\x74\x02\x94\x07\x6f\x01\x51\xdd\x99\x8e\xfc\x66\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\x7c\xe7\x40\xa8\xbd\x01\x75\xc3\x96\x10\x55\xd6\x0b\xa8\xec\x60\x15\xcd\x5d\x4b\xb0\xb3\xc3\x7d\x23\xdf\x5d\x7e\x75\xf6\xad\x62\xf9\x24\xd4\x56\x4e\x98\x8e\x4e\x22\x96\x2d\x4e\xec\x08\x9f\x3c\x58\x1d\xd9\xec\x07\xae\x6e\x34\x14\x04\x22\x99\x24\xb6\xc0\x98\x9c\x91\x97\x2c\x5b\xf8\xcf\x3d\x0d\xb8\x7d\xca\x3d\xe5\x32\x29\xfb\x69\x37\x75\x68\x46\xaa\x92\x0d\xb8\x83\x54\x23\x40\xfe\x7c\xda\xad\x91\xf7\x53\x44\xf7\x07\xec\xce\xb2\x4b\x2b\xbe\x27\x01\xde\xa7\xd3\xd2\xef\xb0\xd2\xd3\x2f\xcc\x1f\xaa\x36\xec\x73\xd1\xa9\x15\xb2\x7d\x3e\x43\x65\x34\x66\x31\x91\xb7\x2c\xcf\x79\xcc\x14\xf1\x74\x3b\xb4\x41\xf1\xe4\x69\x40\x7e\xe8\x1d\xf8\x69\x05\x1c\x3c\x1d\xf3\xc3\x21\xd8\x1f\x2a\x44\x1c\xee\xac\x10\x71\x1a\xa7\x5c\x3c\x0d\x6c\xdf\x11\x6e\x2a\xa2\x09\x3b\x7f\xbf\xb7\xb6\x6e\xc7\xa9\x2a\xec\x57\xf6\x66\xd0\x53\x60\x4b\x9d\xfd\x6f\x3c\xee\x12\x21\xe3\xdd\x1c\x68\x8f\xac\x76\xcf\xa9\x66\x77\x3b\x0a\x42\xe3\x92\xe4\xef\xfa\x3e\xa8\x67\x9f\xb6\xda\xfe\x24\x3a\x85\x04\xa7\x1c\x4b\xfe\x3f\x96\x90\x65\xf1\xa9\x1f\x47\x12\x8e\x15\x36\x65\xab\xb7\x62\x73\x67\xf6\xf4\xe2\x9c\x7c\x8d\x8f\x3f\x5e\x17\x94\x5c\x6a\x54\x79\xce\x64\x4a\x79\x3f\x0d\xd0\xeb\x83\xd6\xfb\x61\x85\x40\xb8\xf0\xcf\x12\xfb\xb0\x11\x8a\xca\x72\xc3\x45\xce\x62\x62\xed\x29\xbf\xb0\x16\x0f\x2b\xe2\xf4\x2f\xa3\xc5\xc3\x7d\x75\xc9\x0e\x4c\xf3\x2e\x7f\xa7\x94\xa2\x1d\x3a\x81\x10\xe1\x63\x9d\x88\x62\x42\x71\x08\x6f\x08\x22\xf0\x40\xd4\x86\xb0\x74\x9f\xac\x83\x62\xf7\x88\xbc\x91\x73\x2e\x1c\x15\x93\x36\xaa\x66\x46\x79\xb2\x1f\x38\x07\x39\xf9\x57\x26\x27\x2b\x95\xbc\x12\x74\x9a\xec\x1e\x32\x59\x3d\x04\x7e\x38\xf2\x3a\xa1\x73\xc2\xe0\x8f\x93\x98\x2b\xf3\x7f\x72\x75\xf5\x06\x9c\xc1\x85\x70\xfa\x25\xb8\x39\x2d\x6f\xf1\xa9\xd1\x48\x64\x1e\x8f\x2e\x20\x11\xef\xad\x83\x47\x30\x1e\xe1\x22\x36\x4b\x67\xaa\x12\x94\x6c\x9f\xc0\x5e\x29\x3e\xef\x0e\x43\x1f\xa7\x8c\x5c\x2f\x78\x74\x73\x11\xf8\x7f\x65\x6e\xee\x89\xe0\x56\x45\x48\xa9\xff\xf6\x58\xdc\xc8\x2e\xeb\xa2\x2f\x83\x5a\x30\x9e\xe3\xd4\x8e\x9c\x5e\x59\x08\xc2\x6f\x54\x29\x19\xf1\x32\xfe\x00\x2c\xd1\x25\xfb\x8e\x81\x7d\x3f\x1e\x54\x40\xe0\xec\x07\x20\x28\xe7\x36\x48\x2d\x0e\xa3\xec\x13\x54\x85\x52\x0a\x17\x0e\x6e\x8f\x06\x04\xc4\xf1\xde\x5a\x9a\x96\xc3\xad\xb6\x34\x75\x6a\x66\xcd\x45\xee\x12\x5e\x2d\x02\x39\x95\xc1\xf6\xd0\x5e\x45\x21\xdf\xda\xd4\x36\x33\x79\x14\xd0\xed\x9e\x9a\xde\x64\xfe\xab\xc5\x07\xe1\x3d\xeb\x34\x07\xda\x93\xc9\xac\x48\x30\xb2\x76\xff\xce\xae\xce\xc7\x88\xdf\x79\x04\x27\xfa\x53\xeb\xec\x74\x18\xa6\xe7\x75\xcf\x57\xfc\x65\xf4\x77\x0a\x54\x8b\x67\x5f\xfe\xe1\x0f\x9f\x7a\xc7\xa7\xfd\x0c\x77\x8f\xdd\xf2\x69\x2f\xd7\x5b\x43\x6d\x86\xf3\xa1\x36\xc3\x50\x9b\xa1\x7a\x3d\xba\x7f\xf8\xe1\xab\x2f\xf4\x92\xdd\xd6\x47\x66\xdb\xbe\xf5\x15\xf6\xcc\x8a\xeb\x27\x23\x6e\xef\x0a\x0a\x0f\x51\x37\xa1\xa7\x1c\xb1\xfd\x6b\x24\x0c\x95\x11\x7e\x5d\x95\x11\xfa\xcb\x11\xeb\xab\x0a\xc2\xfe\xb9\x61\xbf\x9e\x8a\x07\x7b\x93\x8d\x7d\xf3\xea\xf7\xce\xa6\xef\xab\xe9\x47\x5f\xd6\xfd\xde\x2c\x0c\x87\xe5\x78\x8d\xf6\x16\x57\xe2\xcd\x55\xd3\x3f\x3c\x54\x41\xb1\x7c\x2d\x0d\x75\x79\x44\xd5\x99\xec\x6d\x79\xc0\xa9\xc8\x9d\x78\x77\x93\x15\xef\xfd\x55\x2d\x40\xc0\xdf\x7e\xfa\x71\x01\x83\x83\x7c\xbf\x30\xf5\x5f\x96\x7b\xf4\x17\xda\x01\xff\xbe\xdc\xa3\xaa\x52\x35\xd7\x59\x1d\x81\x40\x82\x08\x27\xa7\x61\x67\x9a\x92\x2c\x9c\x5e\x9c\x93\x28\x67\x50\xda\x81\x26\x6a\x42\x1a\x24\x3c\xe7\x40\xb2\x12\xa1\x93\xec\xa8\xd6\x2c\xcd\xf4\xbe\x98\x37\x78\x47\x7f\x65\xde\xd1\x7b\xf7\x52\x2c\x8a\x94\x8a\xb1\xa1\x16\xe0\x1f\xad\xc4\x9d\xd4\xf8\xe1\x84\x58\xba\x80\x62\x05\xd8\x42\x21\xa5\xb9\x10\xfc\xe7\x82\x95\xe6\x0a\x2f\x75\x3c\x01\xe7\x0e\xcc\xa3\x67\xd8\xa1\x44\x55\xa3\x22\x91\x5c\x49\xe2\xb2\x00\xf1\x70\x74\x04\x23\x10\xcb\x2a\xa6\x37\xbd\x60\x28\xbd\x5d\x40\x91\x84\xf2\xa9\xaa\x7e\x88\x0a\x22\x4d\x12\x79\x87\xdf\x0e\xe5\x11\xb3\x7f\x66\x2e\xb6\x2e\xc9\x94\x91\x94\xe7\xb9\xcc\xad\x1b\x29\x9c\x0e\x86\x0f\x19\x3d\x93\xe5\xa8\xb0\xe5\x36\xe8\xe3\x8a\x69\xbb\xd5\x80\x2a\x5a\x12\x2a\x30\x81\xd3\xfc\xdb\x45\x5c\xc3\xb7\x1d\xbd\x9b\xb2\x05\xbd\xe5\xb2\xc8\xf1\x6d\x2d\xc9\x81\xfd\x09\x78\xef\x52\x16\xde\x76\x5e\x40\x86\x96\x5f\x9d\x6a\x80\xd3\xbb\xf2\x47\x50\x70\x63\xe9\xcc\x91\x63\xf6\x91\x2b\xbd\xba\x16\x07\x22\xd7\x72\xe2\x31\x30\xef\x56\x65\x86\xc1\x7e\xb7\x73\xee\x6d\x15\xdf\xc2\xd1\xaa\x92\xea\xed\x15\xfc\xb4\x4d\x4e\xb5\x15\x6b\x30\x65\xde\xa5\xc3\x7d\x7a\x31\xac\xb8\xca\x1d\x7b\x5d\x3d\x49\x41\x79\x10\x92\x37\x5e\x3e\xca\x22\xe1\xd1\xf2\xfc\xac\xdf\xc8\x0d\x1c\xd3\xb1\x3f\xe5\xa3\x36\xcc\x7d\xf2\x15\x55\x2c\x26\x6f\xa9\xa0\x73\xb4\xba\x1c\x5d\x5d\x7c\xf5\xf6\xd8\x60\x11\x58\x75\xce\xcf\x1a\x43\x3b\xae\xc2\xc1\xdf\x3d\x56\x9e\x3b\xa9\x83\xae\x37\xb1\x61\x65\xd4\x1d\xc1\xf7\x68\x25\x00\x88\x97\x09\xf6\x69\x9f\xd6\x20\x0e\x5c\xd4\x8b\x44\x61\xf8\x86\xab\xfe\xa6\xea\xa4\xfa\x36\x8d\x6f\xee\x13\x00\x81\xdd\x7c\xd3\x2a\xdb\xf9\xc0\x5a\xf8\xb9\xaa\xdd\x48\x74\x4e\x35\x9b\x2f\xcf\x58\x96\xc8\xa5\x41\x80\x8b\xc0\x8c\x8f\x8f\x4e\x51\x6c\xc8\xa7\x34\x22\x79\x91\x30\xec\x2d\x54\x2f\xbb\x26\x18\x8b\x4b\x4a\xc7\x85\xd2\x14\x8a\xae\xe1\xf8\x1b\x67\xd4\x9a\x59\xb5\x65\x4b\x63\x9c\xe7\xd6\xa7\xaa\x25\x2a\xcd\x29\xd9\xf8\x4a\x7b\xc6\x04\x9f\xdf\x8e\xb3\x5d\xfc\x9a\xad\x3d\x98\xd5\xee\x80\x70\xca\x2f\x8b\xc4\x30\x9f\x24\xae\xb5\x78\x05\x39\xcd\xee\x31\x56\xbb\x00\x9a\x60\x66\x3f\x22\xd3\xc2\x08\x71\x4c\x55\x6c\xdc\xab\xa5\x3e\xef\x16\xe8\xd2\x36\x2f\x11\x9a\x65\x09\xc7\x10\x66\x99\x5b\xbf\x74\x60\xd0\x5c\x7d\xac\x0d\x69\xe9\x28\xcb\x74\x93\x5d\xc6\xe4\x96\xe5\xd3\x36\x75\x2a\xba\x8a\x25\x34\xe3\xe0\xc7\x69\x2d\xc5\x54\x36\xee\xf4\xe2\x1c\xdf\x6e\x32\x1c\xbb\x1f\x71\x07\xed\xde\x38\xf7\x86\xed\x19\x84\x9a\x8b\xaf\xb4\x74\x7a\x71\x8e\xa5\xbd\x6c\xb1\xa5\xd2\xfc\x61\xf4\x04\x8a\x41\x8e\x65\x85\x47\x3a\x37\x23\x6a\x22\x85\xff\x28\x13\x45\xca\xb0\x40\x53\xd9\x6c\xcc\x28\x8f\x62\x59\x8e\x5e\x5a\x4f\x8c\xae\x63\x54\x9f\x83\x83\x50\x10\xc6\xd4\x87\x3c\x98\x0f\x10\x93\x83\xcf\x2b\x4f\x19\xca\x51\x4e\xb8\x2d\xfb\xe9\x1e\x25\xd0\x31\x2a\xa0\x33\x3f\x13\x52\x5c\x5a\x50\x7d\x7b\xf9\x66\x37\x44\x78\x57\x1d\xc3\x16\xf5\x61\x50\xbf\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\xb7\x22\xe6\x08\xd8\x50\xbc\x05\xbd\x0d\x0a\x1f\x4d\x08\xf9\x1c\x77\xdf\x6e\x0e\x9e\x71\x6c\xe0\x6b\x4d\xc1\x45\x92\x8c\xc8\x8c\x43\xcb\x76\xcd\x32\x12\xba\xb5\xae\xb8\x88\x8c\x3a\x28\xc6\xbe\x23\x0f\xcc\xc8\x29\x89\xfe\xa0\x83\xd7\x14\x64\x66\x96\xc4\x50\x0c\x13\x3e\x61\x0e\x7d\x04\x26\x0b\xa3\xc5\xbe\x4c\x0a\xa5\x59\x7e\x29\x0d\x43\x09\xc2\x76\xa0\x30\x08\x0d\x7f\xfe\x8a\x8b\x18\xe2\xb4\x2e\x81\xf9\x44\x54\x10\xc6\xc1\x18\x64\x86\x04\xff\xbb\x41\x96\x12\x29\x8f\x54\x11\x2d\xcc\x92\x0e\x32\x19\xab\x03\x43\x8a\x0e\xd0\x64\xa8\x0e\x8e\xcd\x5f\xf5\x35\x60\x14\x4e\xf0\xde\x09\xcd\xf8\xc1\xf1\x88\x00\x80\xc0\x01\x28\xf5\xe2\xd3\xc5\x43\xb7\x56\xd0\xd1\x77\xc2\xc2\xcb\x70\x04\xc0\x41\x51\xba\xfa\xee\x16\x5c\x33\xdf\x5e\x1d\x2d\x4d\xbe\xd2\x4d\x9d\xe0\x13\x72\x2a\x08\x4b\x33\x0d\xd6\x6b\x92\x32\xea\x5c\xe2\xec\x96\xe5\x4b\xbd\xb0\x95\x40\x1c\x01\xf9\xe4\x81\xbe\x1f\xc0\x6b\xbd\xeb\x4b\x24\x87\x13\xb6\x02\xdc\xc3\xcf\x0f\xeb\x84\xb4\xe4\x08\x9f\x2c\x28\x81\x45\xef\x04\xc6\xef\xcc\x9b\x55\x10\xe2\x2d\xa4\x96\x9e\x7e\xbc\x79\x63\x1d\x2b\x08\xab\x6f\xb8\x88\x95\xef\xa6\x68\xe3\xbe\x2d\xbc\x1b\x81\x0c\x33\xfc\x14\x01\xbc\x2a\x02\xb7\x15\x5b\x37\x0c\xef\xa4\xfe\x75\x43\x6d\x1c\xc0\xaa\x0e\x6f\x65\xdc\x7c\x74\x2a\xfb\x7b\x1e\x3c\xec\x83\x0d\x4a\xbb\x8b\x1d\xcb\x8a\xbb\xcb\xac\x51\x27\xd8\xbc\x1d\x1b\x40\xbf\x6e\x26\xa5\xc1\x01\xe8\x64\xf0\x0b\x58\x93\xb0\xce\x39\x99\x25\x74\x5e\xa2\x11\x50\x3d\x14\xb4\x5e\x5e\x7d\xe7\x96\xa0\x08\x6f\x16\x79\xb7\xca\xc4\xdb\xa4\xe0\x71\x09\xa5\xb5\x4f\x98\x8f\x34\xfe\xb8\x5d\x14\xf6\x83\xaf\xc7\xa6\x36\xce\x46\xbd\xd1\x90\xb7\x0e\xfe\xce\x66\x47\x03\x4c\x70\x05\xdb\x9c\x62\x0a\xf1\x53\x20\x87\x5c\x7d\x57\x41\x93\x2d\xf3\x5d\x83\xb4\x37\x6c\x79\x27\xf3\xe6\x5a\xec\x3b\xe3\xd7\xc6\x2f\x26\x74\xca\x92\xed\x07\xe4\x2d\xcd\xcc\xb2\xcb\x60\x55\xd4\xde\xad\xaf\x13\xf5\x07\x8c\x2b\x73\xb1\x7c\x32\x9f\x53\xc1\xff\x81\x11\xbe\x91\x39\xc7\x32\x37\x7f\x1e\xa1\xbf\x04\x75\xff\x84\x45\xfa\xd8\xe2\x5f\x23\xdd\xdb\x82\xa0\x34\x8e\x39\x4a\x0f\x17\x5b\x70\x69\x33\x10\xb8\xb8\xb9\x0f\x98\x6f\x38\x58\xdb\x71\x7f\xb3\xc3\xb5\x05\x6d\x2e\xf2\x0d\xb1\x58\x1b\xdf\x4f\x29\xb7\x9d\x79\x9f\x1c\x54\x58\x4a\xf9\xae\xcb\xc2\x6b\x0f\xb8\xa6\x54\x17\x39\xd7\x8d\x0c\x69\xf3\x8b\x5c\x7c\x53\x4c\x99\xf5\x31\x77\x7e\x5d\x40\xa8\xe1\xe9\xc5\x79\xbf\xdb\x51\x39\xe1\x60\x09\xb0\x13\x34\x72\x0b\x29\x04\x4d\xa7\x7c\x5e\xc8\x42\x25\xcb\xd0\xb0\x49\xc1\x45\x3e\x21\xe4\x1c\x2d\x3b\xe2\x50\x13\x2a\xa4\x58\xa6\xf6\x51\x11\x25\x45\xcc\x2a\x23\x82\x27\xf1\x56\xf2\x98\xd0\x42\xcb\x94\x6a\x1e\x91\x48\xb2\x3c\x02\xaf\x63\x38\x52\xa1\x18\xa1\x6b\xde\x8d\x0a\xa5\x65\x4a\x52\x9a\xab\x05\x4d\x92\x75\x7b\xdc\x03\x57\xdb\x54\xbe\x7c\x0c\xeb\x5f\xfb\xe3\x2d\xce\x7a\x47\xfc\xde\x52\xad\xbd\x05\x7e\x9b\xc9\xed\x35\xc0\xed\x7a\x2c\x6d\x31\x86\xad\x13\xd0\x58\x01\x69\xcb\xc6\x6c\x83\xce\xa6\x93\xbb\x75\x5d\x1b\xa8\xe1\xc6\x77\x21\xd0\x97\xc5\xe7\x29\x9d\xb7\x10\x24\xdf\x18\xed\x80\x8a\xa5\x7b\x0d\x8b\x75\xaa\x11\x91\xb9\x8d\x3c\xf1\xbd\xd5\xed\x4f\xbe\xe0\x6b\x4e\xde\x83\x4b\x4f\xe6\x36\x04\xdc\x62\x29\x24\x06\xb0\x7c\x26\xf3\xd4\xc8\x75\x3c\x27\xb3\x42\x80\xa1\x4d\xd9\x88\x71\x50\x49\xac\xad\x86\x26\x4a\xfa\x13\x08\x3e\x42\xe1\x26\x41\xa8\x22\x77\x2c\x49\x26\xe4\x34\x49\x6c\x15\xd1\xa0\x5e\x44\x99\xf3\x5d\xc6\x25\x4c\x97\x24\xe6\x73\xa6\x34\x39\xba\xfa\xef\xd3\x63\xe0\xda\x60\xc7\x58\x12\x4d\x5d\xca\x5b\xd5\x3e\x03\xfc\x3f\x2e\x40\x4e\x88\xa8\xa6\x89\x9c\xa3\x6b\x1e\x6c\xbd\x22\x26\x59\x42\x97\xd0\x22\x20\xa3\x39\x44\xad\x46\x68\xa3\x21\x79\x21\xa0\x38\xf2\x83\x72\x9c\xed\xa4\x60\x53\xfd\xe2\x31\xe0\xe4\x8e\x47\x7d\x4b\x95\xd8\xfb\x65\x65\x39\xcb\x12\xba\xc6\xaa\x50\xc1\xe8\xeb\x4a\x42\xb3\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x0a\x71\x27\xa5\x3a\x42\xbf\xe8\x4f\x29\xd3\x34\xa6\x9a\x4e\x8c\x2e\xf8\x53\x35\xbb\x4e\x26\xb1\x19\x68\xfd\x46\xaf\x99\x33\xca\x8b\xcd\x4d\xf5\xab\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x68\xc6\xd8\x93\x3e\xc1\xf2\x5f\x7d\x34\xaa\xd8\x46\x3f\x5c\x65\xae\xf5\x97\xaa\x56\x86\xa4\xba\x12\x8b\xad\x29\x83\x52\x93\xd7\xb6\x9b\x92\xbb\x03\x26\xd4\xd3\x77\x67\xeb\xcd\x5d\xdb\x4d\x06\x5b\x4c\x04\x55\xe7\xc2\x86\xe9\x39\x03\xb3\xfd\xa5\xea\x61\x70\x29\x35\x90\x84\x88\x09\x2a\xd4\x55\x94\x71\x0f\xe3\x86\x55\xd3\x27\xf1\xbd\xf5\xf6\x91\x56\x2e\x9e\x36\x8e\x9d\x6d\xd9\x6a\x63\x3f\xd9\xb5\x0f\xb5\xf3\xf3\x6c\xcd\x28\x5b\x97\x31\x86\x90\x87\x04\x13\x67\x22\xf5\xc0\x6e\xeb\x17\x6b\x69\xdf\x71\x4b\xed\x30\x51\xbf\x95\x95\xe0\xa5\x1b\xb6\x3c\x54\x36\x73\x46\x0a\xb5\xe0\x19\xa6\x3c\x5a\x37\x84\xdd\x5d\xf2\x1d\x4d\x78\xec\x87\x40\xac\x3e\x17\x23\xf2\x4e\x6a\xf3\xbf\x57\x1f\xb9\xd2\xa8\x7e\x9e\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x02\x8c\x96\x6c\x38\x57\x81\x9a\xec\x16\x74\x6e\xc9\x9e\x03\x0a\x57\xe4\x5c\x18\x89\xc0\xae\xc8\xa7\x02\x2b\x3b\x84\xcb\x63\x11\x52\x8c\xc1\xc6\xdd\x38\x86\x05\x84\xcc\x2b\x70\xd8\x30\x9c\x1d\x0a\x83\x08\xe1\x17\xae\x1c\x11\xf7\x3c\x9b\x3a\xb3\x1b\x8f\x48\xca\xf2\x39\x78\x6d\xa2\x2d\x5e\x8b\xb6\xa6\xc8\x56\x06\xc8\xad\x7b\x05\x24\xf3\xcd\x5a\xc3\xc5\xca\x26\x05\xcf\x23\x59\x4a\xd1\x9a\xf1\x4f\x43\x7d\x00\x52\xff\x86\x7c\x70\x35\x21\xa7\xae\x55\x4d\xf8\x9b\xf5\x5e\x85\xc3\x98\x11\xb8\x22\x86\x94\xdc\xd2\x84\x61\xa5\x7e\x2a\x7c\xce\x96\x9c\xad\x10\xf6\x91\xcd\x0b\x37\x67\xd6\x8b\x4c\x07\x37\x6c\x79\x30\x5a\xd9\xda\x83\x73\x71\x50\x26\xee\x55\x36\xd3\x13\x51\x90\xb6\x0e\xe0\xb7\x83\xdd\x79\xc1\x46\x62\xd9\xde\xbc\xb2\x75\xdf\xd4\x0d\x6f\x76\x61\x37\x0a\x1b\x47\xea\xd8\x80\x10\xdc\xc6\x39\x49\x65\x0e\xe6\x4c\x73\x37\x2c\x11\x62\x44\xd5\x1b\x9e\x65\x65\x45\x95\x22\x9b\xe7\x34\x66\x64\x9e\xd3\x6c\xd1\x55\x2c\x41\xd9\xa6\x69\xf8\x4f\x46\xd0\x5d\x03\xfc\x0d\x1a\xdd\xc6\xf7\xee\xd8\x74\x21\xe5\x0d\xa4\xd3\x01\x22\xdc\xa3\xfd\xe1\x7b\xfc\xd6\x59\x79\xcf\xa9\x92\x8a\xc4\x4c\x53\x9e\x40\x3c\xc8\xfb\x37\x6f\x6d\xc4\x88\xe3\xe3\x6e\x96\xcd\xc1\x17\x3d\x28\x00\x34\xb6\x91\x4c\x97\xec\x96\xb3\x3b\x6b\x95\x58\x17\xeb\x31\x26\x73\x26\x20\xc0\x61\x43\x20\xd0\x98\x28\x1e\xb3\x57\x90\xbc\xbb\x7e\xa0\x3d\x0c\xe7\x6b\xe6\xbc\xed\xf0\x6e\xa6\xe0\x5b\xa9\x77\x0b\x2e\xeb\xd5\xdf\x0b\x99\x6f\x28\x26\xd4\x2e\x97\xb8\x5d\x9e\xb0\x8d\x46\x7f\x41\xfe\xf0\x87\xdf\xaf\x7d\x28\xa5\x1f\x79\x5a\xa4\x2f\xc8\x97\xff\xf1\x1f\xbf\xff\x8f\xf5\x8f\x71\x81\x8f\x3d\x5f\xbf\x3e\x7b\xda\x5e\x5e\x9e\x3d\x01\x78\xc7\x3e\x22\x6f\xb3\x53\xae\xc5\x50\x33\xca\x93\x22\xb7\xb1\xa0\x2d\x55\x84\xd7\xe1\x3b\xe0\x50\x29\x93\x27\xa8\x1b\xd1\x05\x8c\xd9\x40\xb2\x19\x17\x4c\x41\x13\x98\x42\xe4\x2c\x92\x73\xc1\xff\xc1\x62\xd7\x03\x06\x02\x3b\xa0\x5a\xbc\x43\x71\xc2\x44\x8c\xbd\x38\x0d\xcf\x5b\x50\x11\x27\x9b\x1c\xfe\x2d\x56\x1a\x9e\xe0\xbd\x40\x06\x9c\xa7\x13\xc0\xde\x96\x6f\xd4\xc0\x05\x1d\x45\xad\xfb\x09\x39\x1a\x82\x6d\xaf\x95\x22\x61\xbc\xda\xa0\x58\x37\xcc\x71\x45\xef\x43\x95\x15\xee\xfd\x5c\xb0\x7c\x09\x89\x22\xa5\x60\x1f\x04\x93\x5d\x97\x75\x08\xdc\x32\xac\x44\x85\x85\x60\x6a\xba\x70\x29\xc4\x94\xe1\x1e\xb5\x6f\xc3\x3b\x0c\xdd\xe7\xce\x91\x44\x4e\x89\x28\x92\x64\xdd\xa3\x42\x6e\x72\x39\x85\xb0\xdb\xa2\x4a\xb6\xd3\xf1\xda\x9a\x05\x1a\x20\xfd\xa0\xc6\x81\x70\xe1\x3d\x89\xf2\x4f\xdb\x5c\x10\x2e\xb8\x55\x5c\x68\xfb\x98\xd0\x76\xe5\x6e\x5a\x98\x11\xf0\xea\x12\x34\xda\xb2\x48\xcd\x7d\x1a\x16\xf0\xea\x14\x9f\xd3\xce\xc8\xd0\x30\xf5\x27\x67\x6a\xd8\x61\xf1\x6d\xcc\x0e\x0d\x4b\x1f\x8c\x0f\x2b\x00\x6f\x1b\x0d\xd5\x21\x12\xaa\xe5\x4e\xb6\x30\x4a\xe0\x35\x98\x26\x3a\x71\xa2\x16\x84\xb9\x9b\x99\xa2\xf5\xae\xe6\x8c\x8b\x5b\x89\xc5\xa2\x3b\xc9\x70\x97\x2b\x2f\xd6\x44\xb9\x3b\xa0\xac\x56\x96\xf3\xc2\x6f\x28\xd2\x1a\x85\x96\x14\x6a\xbb\xb1\x7b\xf3\x0a\x36\xe7\x8f\xf4\xa2\x83\x54\x57\x5e\x24\xec\x7b\xae\x17\xef\x5d\x71\x78\x8b\xd5\xba\xc8\x12\x58\x6c\xf0\x83\x41\xa1\xcb\x52\x32\x3c\xc7\x76\x64\x2c\x92\x69\xca\x44\x8c\x41\x44\x29\xbd\x61\xa4\x6c\x79\x69\x64\x3c\x10\x83\x61\x38\xf6\x31\xa3\xa2\x94\x13\x6f\x0d\x2d\xdf\x84\x51\x2d\xf1\xa9\x2d\xaf\x6d\x9d\x98\xb1\x39\x21\x23\xc8\xa8\xa8\x24\x5e\x90\x29\x4b\x24\xa4\x72\x63\xa4\x28\xc6\x32\xbb\x5c\x06\x43\x92\xed\x5d\xcb\xf5\x6c\xe1\x48\x26\xe6\x65\x3d\x2a\x95\x40\x73\x5a\x4b\x81\xa5\x60\x13\x72\x69\x45\x98\x76\x52\x51\x1b\x72\xda\x92\x94\xb6\x66\x88\x65\x2d\x86\xce\x90\x75\xef\x85\xb0\xbd\x75\xf7\xda\x40\xd7\x3d\xfc\x4b\x86\xaf\x6f\xdc\xd0\x0d\xbc\xd5\x23\x5d\x72\x05\x0f\xdb\x1a\xf1\x8a\xb0\xf5\x31\x98\xea\xc6\xe4\xe5\xe5\xab\xd3\xeb\x57\x23\xf2\xed\xc5\x19\xfc\xff\xec\xd5\x9b\x57\xe6\xff\x2f\xdf\xbf\x7b\xf7\xea\xe5\xb5\x91\x23\x3e\xc7\x12\xf4\x46\x8d\x33\xd0\x35\xfc\x48\x56\xa9\x05\x15\x4b\x32\x2b\xb4\x21\x07\xe5\xc7\x2a\xb3\xa0\x68\x03\xa0\x71\x6c\x54\xc6\x4f\x6e\x0f\x9b\x01\x5e\x37\x9b\x84\xbd\x37\xb0\x6a\xbf\x4d\xb8\xda\x2e\x26\xb5\x46\x92\xd6\x59\x07\x95\x29\x1f\xec\x98\x6e\xf0\x41\x90\xd7\x32\x27\xb6\x59\x19\x74\xaf\x8c\xd5\xa1\x4d\xea\x30\xff\x9e\xe0\xad\x93\x44\xce\x0f\x7d\xae\x07\x23\x89\x9c\x13\x55\x4c\x7d\x0e\x0e\x70\x53\x78\xfa\x73\xf7\x58\x25\x75\x61\xe4\x13\x71\x82\xb7\xfc\xe0\x95\x77\xc2\x07\xc2\x71\x4f\xa0\xc3\x58\xe5\x49\x73\xa3\x3e\xe0\xe7\x27\xcd\x33\x70\x82\x13\xcf\x6b\x6f\x7c\x10\x06\x5d\xef\x78\x12\x47\x34\x8f\x57\x70\x16\x98\x1b\x6e\x39\x40\x0f\xcb\xee\x62\x37\xe8\x72\x70\x5b\x2c\x43\xde\xb2\x3c\xa1\x19\x46\x88\x43\xdd\x63\x08\x3d\x82\x8f\x9c\xb1\x8c\x41\x1e\x94\xeb\x56\xce\x44\x94\x48\xa8\xcb\x81\x9c\x71\x54\x5d\x3a\x86\x22\xb9\xe2\x85\x2e\x1b\xcf\x9f\x90\x83\x27\x4b\xe6\x20\xcc\xb8\x13\xf6\x62\x60\xf2\xda\xe2\x2e\x3e\x6f\x03\x95\x46\x2f\xf9\x32\x72\x60\xb3\xcc\x0e\x46\xe4\xc0\xd7\x2f\x89\xad\x94\x7c\xf0\xf9\x41\xf9\x40\x98\xa7\x04\x42\xb2\x75\x09\x8d\xe1\x3b\x61\x46\x24\x6c\xb0\x73\x5c\xf9\x4f\x97\x35\x68\x0c\x6b\xb3\x46\x2c\x98\x43\x75\xa0\x49\x65\x22\x2b\x5f\x2d\x53\xec\xb6\x7e\xd1\x4c\x3f\x78\x5d\x43\x4a\x3b\xa6\xea\x59\xe0\xe4\xcc\xec\x86\x0b\x48\xbb\xaa\x20\x8f\x77\xbc\x85\x45\x72\x78\x4e\x32\x9a\x1b\x55\xc4\x3d\x59\x6d\x73\xf6\xf9\xd6\x26\x67\x2d\x90\x20\xf0\xaf\xb4\x94\xda\xaf\xfc\x1b\x2f\x13\xaa\x54\x83\xe5\x15\x08\x81\x19\x98\x30\x1c\x99\x50\xe7\x7c\x82\x1a\xd6\x0b\x7a\xbb\xa1\xc8\x41\x8b\x49\x6b\x9a\xcf\x99\xde\xec\x19\xa1\x62\xf9\x7e\x63\x59\xb4\x71\xeb\x42\xac\xe3\x76\xa7\xe9\xe3\xb8\x2c\xc2\x35\xe6\x42\x8f\x65\x3e\xc6\x57\x5e\x10\x9d\x17\xeb\x7c\x5c\x9a\xa7\x4c\x16\xfa\x8a\x45\x52\x34\x67\x34\xd8\xe7\x7a\x73\xf5\x74\x48\xf3\xb0\xde\xc6\x53\x27\x46\x84\x85\x0c\x9d\x62\x56\xca\x18\xce\xc3\x58\x2d\xc5\xf2\xfe\xcd\xdb\x7d\x36\x9b\x40\x2a\xf4\xe6\x9d\xfc\xce\x92\x7d\x31\xf7\x33\xb5\x33\xdf\xf8\xda\xdb\x42\x77\x7f\xe9\xa5\xf7\x5c\x6d\x7e\xda\x02\x63\x73\x39\x8d\xb5\xeb\x57\x9a\xea\x62\x05\x1b\x2a\x7b\x63\x89\xe5\x15\xa6\x94\x59\x99\xfe\x0a\xde\x0b\x8d\x7c\xab\x35\x04\xb0\x2e\x09\x3c\xe7\x82\x15\x27\xc4\xbe\x68\xce\xa7\xce\x29\x47\x05\x92\x46\xba\x80\xdc\x64\xaa\x6d\x60\xa3\x2d\xa2\xf3\x59\xd3\x32\x1a\x55\xc6\x4d\x6a\x62\xc4\x72\xad\xde\x50\xa5\xbf\xcd\x62\xba\x26\x7b\xa9\x16\xb0\xa8\x34\x1c\x18\x14\xac\xef\x04\x8b\x0d\x85\xb7\x20\xc0\xf1\xc8\x9d\x21\xbd\x05\x8e\xd8\xd5\x93\x5f\x1e\x20\xf3\xfa\xd8\x7c\xaa\x79\xd6\x97\xd2\xc0\xe4\xb4\x91\x00\x55\x43\x35\xb6\xcd\xd6\xb0\x93\x1c\x46\x23\x82\x7d\x6c\xd2\xb8\xf7\x9f\x71\xc2\xa8\x68\x0e\x97\xaf\x61\x14\x3c\xd7\x1d\x87\xec\x07\xc8\xdd\x82\x1b\x91\x15\xb3\xbc\x14\x71\x22\x54\xcc\x12\xb6\x26\xd9\x6b\xcf\x50\x52\xfb\x85\x33\xfb\x81\x56\x61\x4e\x17\xd5\x77\xbc\x41\xdf\x0a\xe1\x36\x79\xa2\x14\x96\xad\xf4\xe0\xb5\xa6\xfa\xaa\x40\x7c\x99\x26\x32\xba\xc1\xa2\x62\x90\xcf\xcf\xff\xc1\x72\x17\x77\x5e\x36\x14\xb3\x5d\xae\xe6\xae\x83\xa7\x83\x9b\x6b\x69\x04\xa3\x98\xb1\x0d\x00\xfd\xf8\x32\x2f\x2d\x8b\x85\xb0\xd9\x73\x0f\x13\xba\xea\x14\x15\x88\xd7\xaf\x78\x0e\x56\x75\x16\xac\x3f\x02\x35\x0f\xad\xca\x48\x53\x9b\xdd\x72\xf2\xcd\xfa\x4c\x90\x5e\xc3\x51\x37\xe5\xa3\xe0\x13\x00\x3e\x11\x6d\x2c\x57\xb3\x31\x73\xa5\xad\xe5\x6b\x4b\x86\x0a\x69\x2f\xa4\xfb\x29\xb7\x19\xad\xd7\xe0\xc2\xde\xbd\x7d\x6b\xd3\x00\xca\xab\x8b\x0f\xaf\x6d\xb1\xd5\x4e\x5e\x26\xd1\xa5\x28\x66\xb5\x78\x88\x57\x3b\x6c\x92\x27\x7a\xe2\x67\x32\x5f\xab\xc0\xf4\x37\xf9\xcd\xf9\x4c\x5b\x07\x32\xd2\xe7\xfa\xd8\xb5\xd5\xe4\x1d\x43\xbd\xfc\x2b\x23\x42\xc9\x82\x2b\x2d\x73\xeb\x5a\x83\x86\x64\x39\x85\x86\xa9\xcd\x31\x60\xfd\x44\xc3\xbd\xf4\x53\x20\x34\xcb\x18\xf5\xbd\x8a\x2c\x6f\x82\x66\x43\x39\x8b\x64\x1e\x37\x4e\xcc\x69\xf7\x8d\xb2\x54\xe3\xe7\x7b\xc8\xcd\x4c\xa8\xd2\xd7\x7e\x0e\x46\x40\x68\x49\x8d\xab\xe2\x8f\x5d\x62\xb9\x1a\x57\xce\x45\x8a\xf2\x47\x49\xa8\x40\xab\xc6\x7e\x32\xf8\x76\x21\xa3\x5c\x1b\x4a\x73\x3b\xad\xeb\xce\x4b\x6e\xc1\x12\x1f\x66\xe6\x29\x53\x6a\x63\xa2\x51\x2d\x48\x03\xea\x02\x13\x5f\x17\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x2a\x77\x2d\xd7\xa3\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x65\xd9\x82\xaa\xb6\x8b\xf1\xa7\xc8\x87\xf8\xb6\x3e\x0e\x2d\x67\x93\x33\xaa\x36\xa5\x4a\xd6\x60\x3b\xcd\x39\x9b\x91\x97\x34\x65\xc9\x4b\xaa\xfa\x04\x2e\x50\x80\x09\x61\x93\xf9\x84\x1c\x5e\x06\xde\xd6\x77\x52\xbf\xdd\xd4\xb7\x61\x4b\x75\x80\x36\x27\xfa\x5e\xcf\xf2\xde\x4a\xc2\xf6\x93\xbb\xe7\x99\xdd\x7b\x86\x1b\x4e\xe8\x93\x38\x9b\x9b\xf3\x7d\xd7\x9d\xc7\xea\x49\x2c\x72\xb0\xf8\x45\xbb\x9e\xc8\x2d\xc9\x8c\xeb\x4e\xe1\x53\x3e\x7f\x5b\x96\xe4\x87\xb8\x6a\x34\x99\xac\xac\xee\xba\xa2\xb9\x82\xd9\x3f\x0c\xb0\x83\x92\xdf\x66\xa6\x2f\xaf\xbe\xeb\x53\x6c\x79\xdc\x64\x7b\xbb\x81\x6b\x7f\xdf\x20\x97\x8f\x37\x73\xe1\x7d\x13\xf9\x63\x70\xb4\x18\x0c\x78\xc8\x00\x8c\x33\xf7\x55\x6b\xeb\xf0\xd5\x7a\xe1\xaf\x99\xed\x8a\x66\x9f\xa9\xe0\xc7\x11\xf4\x9f\x63\xb7\xd8\xf4\x11\x12\x3e\x18\x11\x4c\x99\x43\x71\xbc\xe1\xf3\x2d\x15\xaa\x76\xca\xd4\x76\x45\x77\xab\x12\x4b\xb6\x6f\xad\x7b\x68\xd3\x06\xe3\xd5\x56\x67\x6b\xa1\x13\x77\x50\xd6\xb6\x6b\x3c\x1d\x06\xdb\x2a\xfe\x75\x1c\xaf\xd9\x80\x5b\xbf\x6a\xd5\x81\xcd\x2b\x97\x40\xa4\xd1\x31\x1c\x19\x0a\x1c\x41\xcd\x68\xa4\xdd\x96\x3c\x55\xed\xb7\x97\x75\x1a\x08\xe1\x86\x55\x0c\xef\x6b\x59\x45\xc1\xfb\x83\xf9\xd6\x0a\x1a\xad\xc7\x7b\x02\xe5\x40\xb6\x22\xd0\xfd\x16\x2a\xc0\x6b\x1b\xd6\x3d\x3e\xbe\xb5\x29\xc8\xb4\x11\xc7\xee\xa9\x32\x8b\x62\xf9\x2d\x8b\x2b\x9e\x3a\x5b\xbb\xbd\x7a\x2f\xf0\xdb\x96\xe3\x5b\xb0\x93\x7f\xfe\xfb\xb3\xcf\xc6\xe3\xf1\x67\x65\x6c\xd6\x0b\x42\x33\xce\x3e\x6a\x86\x11\x78\x93\x9b\x3f\x41\x83\x9e\xdb\xe7\x9f\x01\xc2\x91\x97\x60\x6d\x76\x66\xd6\x33\x9f\x41\xf8\x99\xcb\xc0\x34\x1f\xa1\x42\x48\x1d\xc6\x22\x45\x52\xe8\x5c\x26\x09\xcb\xc7\x73\x26\x26\x37\xc5\x94\x4d\x0b\x9e\xc4\x2c\x87\xc1\xdd\xa7\x6f\x9f\x4d\xfe\x73\xf2\xec\x33\xe2\xf3\x2d\x8d\x64\xaf\x34\x4d\xb3\x17\x90\xf8\xf1\x99\xc5\x38\x57\x91\x2d\x4b\xa8\x50\x13\x1f\xe6\x3d\x89\x64\xce\xa4\xf9\x5f\xfa\x99\xca\x58\x64\xbe\x8d\x07\x8d\x34\x3e\x63\x4d\x67\x76\x8a\xb6\x94\x59\x09\xa6\x31\x91\x49\x0a\xff\xc6\xa5\xdb\x12\x72\x17\x89\xad\x47\x97\x70\xa5\xbf\xa9\xff\xf2\x86\x2b\x64\x97\x59\x52\xe4\x34\xa9\x4e\x15\x7e\x50\x0b\x99\xeb\x4a\xa9\xd5\x31\xe1\xc8\x1a\x15\x17\xf3\x22\xa1\x79\xe5\xad\xcf\x5c\xcc\x43\x69\xae\x33\x5c\xf2\xb6\x12\x4b\x37\xae\x04\xcb\x72\xa1\x59\xfe\x52\x26\x45\x1a\x5a\xc7\xc6\xab\x72\xe5\x8c\xe7\x4a\xdb\x1a\x77\x55\xa7\x42\x93\x5c\x0c\xdf\x0f\x70\xf4\xef\x4a\x0a\x70\x17\x92\x89\x01\xf7\x64\xfd\x4b\x3f\x3c\xfb\x31\x78\x0f\xf7\xb0\x2a\xaf\x36\x9e\x92\x86\x19\xd3\x2c\xcb\xe5\x2d\xc5\x0a\x7d\x1b\xe6\xe2\x9e\x5b\xf9\xec\xe9\xea\x0f\x6b\xbe\xdd\x3c\x64\xc5\x47\x17\x0e\x59\xf9\x41\x37\x54\x2f\xc4\x87\x6f\x9f\xd3\x24\x5b\x50\x97\x67\xa8\xa2\x05\x4b\x69\xb9\x49\x32\x63\xe2\xf4\xe2\xfc\xbb\xdf\x5f\xd5\x7e\x68\xae\x67\x68\x50\xce\xa7\xd6\x05\x95\xf5\xa9\xd3\xc5\x7c\x6a\x44\x79\x02\x56\xa6\xb9\x22\xe4\x35\x0b\x75\x46\x2a\xc7\x33\x5e\xbb\x6d\xa0\x13\xdc\x5a\x27\x5c\x05\x44\xa6\x46\xe8\xaa\x3d\xc4\xca\x80\xcf\xca\xca\x2c\xc2\xb3\xd8\xc2\xac\x8c\xde\x71\x6e\x9e\x72\xd1\xc2\xae\x69\x42\x0c\x32\xb2\xdc\x57\x41\xc2\x34\x4e\x4d\x82\xfc\x43\x1c\x0d\xcc\x15\x98\x27\xa3\x99\xd2\x10\xb7\x90\x0b\xd7\x08\x78\xe4\xfb\x99\xe7\xcc\x8c\x5b\xcd\x60\x74\x29\x19\x0d\x6d\xce\xe6\x5c\x3b\x12\x1a\xc9\x34\x2d\x04\xd7\xcb\x13\xa0\x86\x7c\x5a\x98\xdd\x38\x89\xd9\x2d\x4b\x4e\x14\x9f\x8f\x69\x1e\x2d\xb8\x66\x91\x2e\x72\x76\x42\x33\x3e\x86\xc9\x0a\x0c\xc0\x49\xe3\xdf\x78\x3a\x5e\x57\x3a\xd7\x72\x98\x26\x19\xa1\x0a\x6b\xa8\x08\xc7\x83\x7e\xe5\xd8\x52\xb9\x52\x77\x14\x2a\xdf\xbe\xba\xba\x2e\x5d\x8c\x58\x29\x08\x20\x1c\x38\xd9\x4a\x60\x1b\x40\x41\x3f\x1a\x5b\xe8\xdb\xa5\x76\xfa\x84\x4e\xa8\xf3\x9e\x70\xa3\x93\xa8\x62\x9a\x72\xad\x5c\xac\x23\x06\x0e\xbe\x04\x0e\x02\x65\x27\xd1\x52\x33\x21\xe7\xa2\xd4\xef\xef\x1d\xd4\x10\x15\x34\x36\xe0\x6b\x0f\xec\x90\x01\xae\xbe\xd0\xa0\x48\x39\x16\xb5\x76\x77\x82\x33\x7e\x95\xb1\xc8\x9f\x06\x7f\xa6\x4f\xb1\x66\xba\x2d\xce\xef\x63\x31\x25\x76\x99\x86\x97\x57\x42\x0a\x36\xe8\x75\xeb\x75\xb9\x31\x69\xa0\xa7\xd5\x9f\x1a\x62\x17\xc6\xed\xd8\x08\xd9\xa2\x90\xb9\x4f\x6f\xb7\x03\x39\xde\x60\xb5\x63\xa8\x75\xef\x19\x86\xcd\xc7\x00\x5d\x59\x84\xb0\x85\x1c\x85\x20\x50\xd8\x40\xf6\xe0\xd4\x95\x33\xc4\xfa\xf0\x6f\xa9\x28\x68\xd2\x18\xc0\xb6\x51\xbe\x73\xb0\x59\x5f\x5f\x61\x5d\x85\xdb\xf5\xa0\xeb\xb5\x56\xc3\xc6\xd9\xdb\x7c\xe9\x8d\x25\x26\xd6\x05\x78\x21\x36\x76\x2e\x4d\x11\xd4\x91\x5f\xe7\xd2\xdc\x27\x06\xe9\x20\x3c\x53\x2b\x61\x23\xc8\x40\x37\x87\x8e\x28\xcd\x32\x55\x16\xa9\xd0\x92\x44\x32\xcd\x12\xa6\xab\xbc\x17\x82\x72\xbb\xc5\x28\xd5\x63\x6e\x77\x3c\xa9\xb6\x66\xc9\xd5\x1a\x7f\xed\x18\x2d\xbb\x5d\xce\x9f\xd6\x4c\x14\x86\x0a\x5f\x55\xaa\x81\xaf\x69\xe3\x5a\x3d\x92\xeb\xdf\x0d\x6b\x14\x62\x36\x6a\xb5\x63\x90\x8b\x31\x71\x85\x87\x63\x1b\x98\x1a\x07\x69\x6b\xeb\x43\x4b\xf6\x8c\xd3\x59\x2f\xab\x34\x2f\xb3\x4c\x48\x59\xe9\x7e\xba\xe6\xfd\xad\x6a\x21\x24\xec\x6d\x8a\xc6\xab\x72\xf2\x73\x0b\xd0\xdc\xf6\x89\xa4\x24\xe3\x0c\x63\xe7\xbd\x38\x04\x00\x63\x34\xb6\x37\x0d\xc3\xcb\x99\x8f\x0f\xb7\xf6\x6e\x18\xa0\x14\x97\xa0\xaf\x0f\xc5\x40\x75\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\x6d\x32\xa1\x6d\x1d\x02\x98\x9c\x42\x48\xbb\xeb\x90\x11\x33\x65\xd0\xf3\x0a\x8c\xe7\x29\x15\x7c\xc6\x94\x9e\xf8\x1a\x21\xea\x87\x2f\x7e\x9c\x84\xa9\x01\x23\x57\xdc\xdc\x0b\x15\x16\x35\x80\x94\x9b\xc5\x94\xe5\x35\x7d\x53\xd2\x4c\xba\x4e\x22\x77\x30\x59\x4d\x6f\x0c\xfd\xc6\xc9\x16\x46\x97\xb9\x61\x2f\xc8\x01\xaa\x26\xfe\xd3\xff\x34\x62\xf8\xbf\x0f\xc8\xd1\x1d\x84\x3c\x1f\x98\x3f\x0f\xf0\x83\x5e\x06\x0c\x9b\xe9\x94\x1f\xc6\x40\xe9\x9c\xcf\xe7\x2c\xb7\xbe\x23\x30\xab\x42\xcf\x10\x0e\x6d\x40\xcb\x87\x85\xed\xa9\x56\xd6\xdc\xac\x4f\xe4\x87\x2f\x7e\x3c\x20\x47\xd5\x75\x11\x2e\x62\xf6\x91\x7c\xe1\xdd\x0f\x99\x8c\x8f\x6d\x54\x96\x5a\x0a\x4d\x3f\x9a\x31\xa3\x85\x54\x4c\x60\xc8\xb7\x96\xd8\xc6\x45\x49\xf0\x6c\x25\xc9\xd8\x36\xc9\x27\x77\x98\x36\xec\x40\x89\x69\xb8\x50\xb2\xa8\x2a\x21\x63\x0b\x5d\xf8\x9a\xd9\xb6\x39\x98\x56\x8c\xf4\x85\x7d\x5e\x30\xb1\x21\xac\x92\xa4\x0a\xdc\x24\x43\xfa\x16\x54\x80\x9b\xc5\xb6\x87\x31\xf2\xd4\x64\x9d\x4f\x72\x2b\xc6\x6f\x32\x69\x35\x88\xad\x6d\xda\x0c\x3f\x90\x50\xd8\x7a\x89\x9b\x0c\x66\x8f\xda\x49\x79\xaf\x15\x6d\x8c\x3e\x5a\x5d\x16\x86\x1c\x3d\xc0\xda\xa0\xdf\xec\xc9\xce\x4b\x73\x22\x75\x17\x4e\x70\x78\x85\x07\x3e\xaa\xbf\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x29\x8d\x91\x04\x52\xb1\xbc\x77\x34\x36\x00\x04\xaf\x6d\xb4\x1c\x5b\xbb\xdc\x98\x8a\xd8\xfc\x5b\x71\xa5\xcd\xfd\x9d\x21\xb6\xc1\x10\x5a\x85\xd2\xb7\xe7\x67\x0f\x83\xdc\x05\xdf\xf1\xb4\x4e\x0b\x11\x27\xec\x8d\x94\x37\x6b\x52\x81\x2b\x0b\xfa\x2a\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xec\x63\x68\x03\x2d\x97\x64\x45\x82\xe4\xb5\x10\x19\x8d\x6e\xe8\x9c\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x6b\x5d\xb9\xb5\xb3\x47\x6b\x80\x9d\xe7\x9a\x69\x3a\xbe\x68\xcb\x0e\x50\x37\xef\xed\xf3\xed\xc5\xaf\x5c\x91\x70\x2f\xd9\x6c\xed\x83\xbe\xb8\xfd\xba\xfc\x93\x31\xb4\xf6\x5a\xfb\xa3\x2b\x84\xdc\xf8\xc0\x76\x1f\x62\x7d\x9e\x6d\xa3\x9b\x6a\xaf\xb9\x1d\x71\x04\xc3\x42\xb9\xf2\x18\xdc\xb1\xbb\x00\xdd\xd8\xee\xa8\x02\x0a\x94\xdc\xda\xc8\x9c\x07\x29\x89\xb4\x5d\x6c\x6e\x58\xef\x0e\xc2\x73\x38\xf1\xad\x7e\xbb\xad\x82\x74\xc3\x9c\x06\x71\x7a\x10\xa7\x9f\xb8\x38\xdd\xe9\x0c\x6c\x0f\x3d\xf8\x34\x04\xec\x4e\x8b\xde\x1e\x6d\xff\x24\x45\xee\xce\x6b\x6c\x11\xfc\xff\x64\x85\xf0\x4e\x8b\x6d\x29\x90\x37\x2d\xf9\x97\x2c\x96\x77\x82\xe1\xd6\x78\x98\x27\x28\xa8\xb7\x5e\xe0\xe6\xa4\x90\x86\xf5\x05\xf9\x18\x35\x3b\xb0\x99\x34\xb6\x28\xf7\x76\xda\x50\x4c\xde\x26\x4e\xf5\x52\x01\xb6\xb7\xe8\xbb\x56\x61\x73\x6b\xcb\x12\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x1b\xe2\xcc\xcb\xb8\xe2\xbd\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x5c\x76\x9b\x44\x92\x0e\x4b\x36\x32\x7c\x96\xcb\x69\xdb\x8a\x35\xf7\xb0\xaa\x96\x51\x86\x7b\x86\xb3\x43\x76\xbe\xdf\xdf\xde\x16\xbb\x2d\x89\xa3\x61\xee\x58\xd3\xae\x12\x49\xe6\xf7\xe3\x50\xc1\x26\xdf\xc7\x4c\x77\x0e\xbe\x0c\xc4\x6a\x9c\xe4\xc8\x79\x30\xaf\xf3\x82\x8d\xc8\x6b\x9a\x28\x36\x22\xdf\x8a\x1b\x21\xef\xfa\x9b\xef\xe6\x8a\x0c\x0d\xb3\xbd\xb6\xb5\x17\x5a\xe4\x0a\xb5\x9e\x4a\xa9\xdd\xb7\x24\xf6\xe7\xfe\x05\x67\xa1\xb1\x1a\xfa\xb8\x10\xfc\xe7\xa2\xaa\xa8\x78\x27\xd3\x51\x5d\x85\x79\x79\xf5\x1d\x20\x07\xaa\xdb\xaa\x52\xd4\xd6\xfc\xa8\xd6\x87\x55\xb7\xc9\x83\xda\xa8\xa8\x56\x13\xc3\x8d\xa2\x5f\x55\xb5\x12\x5b\x9e\xb0\x6e\x96\xc9\x8a\x24\x99\x90\x73\x7d\xa8\xcc\x1c\x78\x44\x93\x64\x69\xb4\x96\x5a\xb7\xb0\xfd\x32\xb8\x5a\x30\x88\x95\xc3\x86\x15\x57\xf8\x2d\x0b\x5e\x77\x80\x46\x83\x13\x8b\xed\x3a\xf6\x2b\x99\xb8\xa1\x2f\x56\xc3\xd4\x2e\xed\xe3\x0e\x51\xc2\xfd\x2f\xa1\x6a\x07\x45\x5d\x13\x90\x46\x30\x32\x93\x85\x88\x09\xd5\xb0\x3d\x3b\xce\xb9\xea\xc3\x7d\x38\x87\xff\x66\xf9\xa9\x1f\x63\x63\xe0\x81\x2f\xf3\xf8\x36\x08\x5f\x25\x91\x63\x1f\x59\x54\x04\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\x7e\x73\x5f\x1f\x25\x31\xf5\x61\x73\x4a\xfb\x4e\x9d\xf4\x18\xd0\x3e\xaa\xbb\x9d\xa8\xd0\x43\xec\x79\x9b\xc2\x4e\xed\x2b\x13\x35\xa1\x3d\x70\x45\x7c\x6a\xca\x54\xb0\xc2\x15\xfc\x36\xf4\x84\x42\x05\x16\xc3\x64\x6c\x57\x04\xa8\x53\xb5\x90\x3b\x53\xc6\xb6\xf9\x89\x6f\x9d\xfc\x66\x3e\x08\xb2\xdd\x78\x45\xb6\xb3\xfc\xaf\x94\xed\xa0\x79\x4f\x19\x4a\x03\x4c\x32\xa5\x4b\x08\x4d\x4b\x33\x99\x6b\x8a\x0e\x8e\x42\xc4\x2c\x57\x9a\x62\x8d\x12\x97\x97\x97\x99\x35\x2f\xa8\x22\x5c\x2b\x12\xd9\x24\x43\xdc\xb0\x7b\xca\x64\x0c\x80\x7d\x61\x5e\xf0\x22\x42\xe5\xe3\xc8\x57\x2b\x1b\xb3\x71\x17\x36\x4f\x2c\xa1\x1b\x02\xab\xf6\xa5\xb3\x57\x9a\x65\x75\xba\x1a\x2c\x42\x80\x38\x7e\xcb\x63\x0c\x46\x62\x19\xe1\xa2\x1f\xa2\xba\xdd\x81\x83\x8e\x89\xf5\xc7\x6a\xec\xad\x34\x6b\x1f\xd8\xa0\xd1\x6e\x27\xea\x32\xc3\x48\xf9\x6d\x67\x7f\x73\xf7\x79\xbf\x8a\x3d\xc9\xe5\xfa\x48\x39\xbc\x56\x76\xd5\x65\x5f\x6c\xd8\xdd\x20\x56\x17\xa2\x41\x75\x6e\x25\xa9\x65\xab\x3d\x26\x0f\x5d\xe5\x66\x4b\xea\xdf\xd6\x42\x2c\xe3\x20\x70\xb0\xe5\x63\x60\x98\xdc\xf8\xec\xb6\x3c\xc2\x87\xae\xab\xb3\x67\xc5\x94\xf2\x72\x2e\xa4\x5e\x06\xdb\x6e\x65\x6f\x39\x50\xb9\x35\x3d\x0f\xd7\xc2\x3e\xde\x72\xcc\x56\x09\x80\xfd\xa7\xbd\xb1\xac\x9a\xf6\xdb\xc4\x93\x32\x9a\x6b\x1e\x15\x09\xcd\xcb\xb3\x0f\x44\x7e\x25\x6f\xa9\xf3\x9c\x95\xa6\xb9\x6e\x55\x64\xe1\xca\x3d\xe9\x6b\x2e\x42\xc1\x85\x05\x13\xde\xf9\x87\x69\x60\x64\xca\xe6\x86\x79\x66\x59\xb2\x74\x39\x06\x65\x04\x7b\xc2\x95\x2e\x9b\xff\x81\x2c\xd0\x36\x14\xa2\x73\xb9\x86\x5f\x75\x1e\x9d\x4c\xd2\x48\x8a\x19\x9f\x3f\x5c\x16\xdd\xfb\x37\x6f\x5f\xc2\x27\xe1\x5e\x99\x43\xe7\xef\xaf\x64\xd0\x95\x93\x84\xdb\x65\x92\x9c\xff\xa1\x4c\x91\xb3\xf5\x1c\x1a\xf2\xe3\x5c\xf6\x95\xdb\xcf\x1d\xf3\xae\xfc\x34\x5d\x54\x86\x67\xc5\x2a\x93\x42\x71\x23\x13\x43\xfd\x2c\x78\x08\xbb\x9f\xbc\x7f\xf3\xb6\xdf\xa4\xab\x21\xc3\x6a\xc8\xb0\x1a\x32\xac\xb6\x1d\xa8\x16\x19\x56\xfe\x34\x43\x7e\x95\x0b\xdb\x33\xff\xb6\x69\x42\xe5\x71\xf7\x35\xad\xdb\x7e\x7c\xb3\x7c\x38\x63\xd4\x80\x66\x7b\x64\xe1\x6b\xfb\x60\xd9\x85\xa7\x92\xa7\x6b\xc9\x0c\xe8\xe2\xef\xdf\xbc\xf5\xe3\xde\x43\x4e\x44\xcc\x95\xf9\xcc\x4b\x99\x71\x16\xbf\xbc\xfa\xae\x5d\x93\xe6\xb3\xfa\x5b\x95\x9c\x0e\xfc\xd1\xcc\xfc\x50\x91\x03\x7c\x88\xbc\xbc\xfa\xee\xc0\x2d\x04\x36\xa2\x6c\xe4\xe5\xb3\xda\x08\xd5\xa1\x40\x80\xf4\x7f\x44\x30\x0a\x89\x56\x6f\xc7\x95\x46\x47\x52\xd8\xae\x33\x0b\xaa\xc8\x94\x31\x11\x0c\x8a\x2a\xf0\x7b\xfb\x34\x94\x02\xb5\x71\x4a\x50\xc1\x1b\x8b\xfe\x97\x51\x0d\x13\xf2\xbd\x11\x6d\x72\xc6\x84\x59\x46\x3c\x82\x2d\xc0\x0a\xb9\x0c\x78\x2f\xba\xf4\x82\x85\xa9\x03\x58\x11\x94\xf1\x59\x33\xc9\xcd\x19\x23\x4d\x3a\x69\x8b\xc4\xa7\x12\xd3\xd7\x16\x90\xb9\x47\x6c\x7f\x08\xbb\xf2\x41\x69\x4d\xf6\x47\xc5\xb9\x19\x01\x89\x04\x23\xd4\x9c\x6d\xed\x9d\x66\x81\x18\x5d\x36\x03\x38\xbd\x38\xf7\x65\x64\x27\x64\x3c\x1e\xdb\x78\x31\x9d\x17\x91\xc6\xd2\x50\x1a\x1b\x19\x99\x51\x63\x9e\x03\xb7\x52\x0c\x2c\x41\xae\x5f\x9b\xc5\x4e\x0c\xf2\x82\x80\xcc\x89\xb5\x5e\x95\xa0\x98\x90\x6a\xcc\xde\x07\x01\x90\x20\xaf\xa5\xb4\x9b\x84\xdf\xfc\x27\x39\x39\x21\x97\x35\x03\xf9\xd4\xc8\xad\xb6\x3f\x0a\xc8\xff\x33\x29\x0f\xab\xa6\x32\x36\x31\x2f\x7e\x23\xe4\x9d\x68\xfa\x3a\x7c\x8b\xe6\xec\x05\xf9\x70\x70\x7a\x4b\x79\x62\x50\xf8\xc3\xc1\x88\x7c\x38\xb8\xb0\xe1\xca\x5c\xcc\x3f\xd8\x76\x07\x1f\x0e\xce\x18\xf4\xe0\x8e\x3f\x1c\x98\x61\x7f\x07\x0d\xdc\xde\xb2\x7c\xce\xbe\x61\xcb\xff\x82\xc1\xfc\xed\x2b\x6c\xf6\xb6\xfc\x2f\xec\xf5\x66\xee\x1b\x82\x75\xbd\xcc\xd8\x7f\xa5\x34\xf3\x37\xde\xd2\xcc\xbf\x1c\x44\x62\xfc\xf0\xa3\xa1\xf4\xb7\xcf\x27\xe5\x8e\xfe\xf4\x77\x25\xc5\x8b\x0f\x07\x41\x09\x4f\x99\x1a\xcc\xc8\xf4\xf2\xc3\x01\xa9\x7c\xf5\xc5\x87\x03\xf8\xae\xbb\xef\x26\xf9\xe2\xc3\x81\xf9\x92\xb9\x9d\x4b\x2d\xa7\xc5\xec\xc5\x87\x83\xe9\x52\x33\x35\x7a\x3e\xca\x59\x36\x32\x07\xfb\xbf\xca\x2f\x7c\x38\xf8\xc9\xec\xc9\xc9\x09\xb6\xd9\xc0\xcd\x54\xe4\xdf\xcd\xbd\x31\x7a\x30\x8b\xad\xfa\x1a\xd6\x3e\xba\xad\x3e\x16\xda\xcd\x77\xb1\x9e\xed\xd9\xa0\x7a\xe7\x5a\xa1\xab\x2f\x96\x9d\x2b\xf7\x8b\x08\xb1\xe7\xd7\x37\x7f\xf7\xea\x28\x98\x9e\x51\xff\x2c\x47\xc5\x18\xcc\x78\x42\xb0\x3b\x22\xe6\x20\x1a\x51\x09\x3c\xe8\xd0\xb5\x45\x90\x42\x39\xb1\xad\xaa\xe0\x1a\xda\x81\x67\xde\x0e\x03\x92\x5f\x14\xb1\x4c\x9b\xd3\xf5\x40\x35\x4d\xbb\x55\x06\x4d\x57\xac\xfb\xbb\x47\x6e\x20\xa8\xad\x99\x9f\xba\xce\xbe\xb8\xac\x3d\x17\x9f\xd2\x8f\x6f\xa0\xc1\xd3\x0b\xf2\xfb\x2f\xfe\xf8\xe5\x9f\xd6\x99\x76\xa7\xa8\xd0\x7f\xbd\x31\x75\xb9\x01\x0c\xab\x2f\xd6\xcd\xab\x13\x27\x7f\x4e\xca\xbc\xe8\xb2\x99\x6a\x35\x6c\x47\x31\x4d\xa6\xe0\xc1\x2a\x32\x03\x97\xd7\x2e\x5b\x55\x44\x18\x52\xd8\x38\x18\xf7\x04\x3c\x59\x92\xe7\x5f\x60\x5b\x23\xf8\xf4\x0a\xf9\xfe\xe1\xe3\x8f\x93\x86\x29\x73\x45\xfe\x73\x54\x9b\x8f\x91\x79\x0a\x60\x7a\x06\x71\xd0\x59\x6d\xd4\x55\x1b\x74\xbc\x86\x13\x32\x3f\xdf\x6d\x1b\xd7\xa1\xc5\xc7\x97\x7f\x58\xbf\xbf\xae\x03\xfb\xb3\x3e\xfc\x8a\xd6\x6f\xe8\x05\x01\x8a\x65\xec\x69\x0a\x39\xfd\x41\xe8\x48\x88\xda\xba\x5b\xf0\x0f\xb9\xc8\x65\x5c\x44\x46\x1d\x93\x33\x17\x99\x1e\x85\x04\x0a\x7a\xcb\x98\xd3\x80\x5a\x36\x61\x1f\x0d\xd0\x59\xd9\x64\xc8\xa8\xbc\x8c\x0a\x2e\xe6\xaa\x2c\xe4\x08\x04\x04\xb9\xee\xdd\x82\x01\xeb\xd1\x61\x4b\x4e\x98\x95\xe2\x31\x84\xcd\x53\x32\x2f\x68\x4e\x85\x66\xd8\xac\x01\xdb\x72\xa2\x8e\x59\x92\x3c\x1a\xd4\xc6\xb4\xa7\x11\x8f\x2a\x12\x2b\x33\x45\xab\x0d\x62\x3b\xd7\xde\x8e\xea\xf3\x67\x5f\x6c\xdc\x72\xff\xdc\x7a\x23\x3b\xd5\x9a\xe5\xe2\x05\xf9\xdf\x1f\x4e\xc7\xff\x8f\x8e\xff\xf1\xe3\x91\xfd\xc7\xb3\xf1\x7f\xfe\x6d\xf4\xe2\xc7\xcf\x83\x3f\x7f\x3c\xfe\xeb\x6f\xfb\x30\xb9\xaa\x5e\x83\xab\x5a\x01\x6d\x7b\xd3\x98\x03\xf3\xd5\x4d\x8d\xb9\xc6\xe4\x00\xa6\xb4\xf9\x19\x3b\xdd\x4d\x4a\x46\x3b\x20\xe9\x7a\x4c\x97\x51\x9f\x4a\x3c\x03\x8a\x67\xc4\xd2\x89\x95\x70\x27\x91\x4c\x4f\x02\x0b\x83\x11\xad\xdf\x52\xb1\x24\x25\x59\x43\xa1\xb4\x8e\xe9\x0a\x12\xcd\x68\x94\x4b\xa5\x2a\x56\xe2\x1b\x46\xbc\xe4\x8a\xc4\x72\xca\x22\x0a\xb2\x78\x3e\xe5\x3a\xa7\xf9\x32\x50\x3d\x5c\x91\xfb\x42\xb1\x59\x91\x90\x23\xc5\x18\x99\x08\x19\xb3\x55\xea\x7a\x8c\x34\x94\x4e\x79\xc2\x35\x64\x85\xc4\xcc\xa8\xda\x09\xb7\x2a\x80\xf3\x60\xbb\x2e\xb8\x73\xf6\x91\x70\xed\x3b\xd1\x73\x45\x8e\x62\xa1\x9e\x3f\xff\xe2\xf7\x57\xc5\x34\x96\x29\xe5\xe2\x75\xaa\x4f\x8e\xff\x7a\xf4\x73\x41\x13\xc8\x60\x79\x47\x53\xf6\x3a\xd5\x7b\x05\x8b\x55\xd9\xe2\xf3\x2f\x5b\x9c\xa2\xa3\x1f\xf0\xac\xfc\x78\xf4\xc3\xd8\xfe\xeb\x73\x77\xeb\xf8\xaf\x47\x1f\x26\x1b\x7f\x3f\xfe\xdc\xac\x21\x38\x81\x3f\xfe\x30\x2e\x8f\xdf\xe4\xc7\xcf\x8f\xff\x1a\xfc\x76\xfc\xdb\xc1\xc8\x5e\x5a\xcd\x03\xdd\xeb\xc1\x8c\xed\x76\x0c\xaf\x48\xd5\x8d\xee\xf5\xdf\x57\x8d\xef\x2b\x93\x47\x23\x7c\x43\x11\xbb\xa8\xf2\x91\xc0\x4c\x5f\x1f\xa2\x65\x45\xbb\xbe\x2c\xf6\xf5\x35\xa2\xa4\x8b\xb8\xe1\x35\x7d\xa0\xf5\x86\xf8\xfc\xb4\xf2\xfc\x4f\x36\x41\x24\xb0\x5b\x81\x31\x73\x59\x0d\x70\x91\x60\xfc\xa9\x96\x8c\xf1\xf9\x82\x0d\xa6\x9d\xc1\x0d\x30\xb8\x01\x06\x37\xc0\xd3\x70\x03\xd4\x8f\x3c\xb8\x03\xa0\x2b\xaa\x0a\x8c\xc9\x34\x4e\xb9\x58\x73\xfc\x37\x9f\x7b\x4b\x1d\x46\x24\x93\x46\x96\xe1\x10\x7e\x2d\x6f\x59\x9e\x73\x08\x7b\xc3\x77\x72\x56\x36\x21\x0c\x43\xd0\x7b\x32\xc2\xc6\x2c\x4b\xe4\x32\x5d\x57\xba\xfc\x7e\x22\x8a\xed\x22\x7b\x0e\x62\x1e\x0c\xbf\x83\xe1\xf7\x17\x64\xf8\x1d\xac\xb9\x83\x35\x77\xb0\xe6\x36\x5c\x83\x35\x77\xb0\xe6\x0e\xd6\xdc\xc1\x9a\xbb\x72\x0d\xd6\x5c\xfb\xcc\x60\xcd\x1d\xac\xb9\x0f\x6d\xcd\x2d\x2f\x55\x29\xea\xfb\x40\x6a\x65\x9b\x68\xa7\x15\x85\xde\xb6\x57\xb5\x2a\x7d\x55\x33\x6f\x50\xe7\xb9\x56\x2e\xd9\x10\x34\xf7\x49\xd8\x86\xed\x61\x7b\xce\x0f\xa1\x53\x83\x06\x3d\x68\xd0\x43\xe8\x54\xe5\x1a\x94\x6d\x7f\x0d\xca\xf6\xa0\x6c\x0f\xca\xf6\xa0\x6c\x0f\xca\x76\xfd\x1a\x94\x6d\xbc\x06\x65\x7b\x50\xb6\x1b\xae\x4f\x43\xd9\xde\x14\x3a\x35\x33\x28\xeb\x6e\x6e\x8b\x9d\x22\x61\x50\xcd\x17\x43\x50\xcd\x10\x54\x33\x04\xd5\x0c\x41\x35\xee\x7a\xe8\xa0\x9a\xaa\x05\x0e\x23\x5f\x2a\x16\x37\xc0\xd9\x2c\x97\xb7\x3c\x66\xaa\x16\x82\xe3\xeb\xed\x05\x5c\x26\x85\x0e\x7d\x65\x58\x0d\x7b\x98\xa0\x9a\xc1\x3c\x37\x98\xe7\x06\xf3\xdc\x60\x9e\xab\x5e\x83\x79\xce\x5f\x83\x79\x6e\x30\xcf\x0d\xe6\xb9\xc1\x3c\x37\x98\xe7\xea\xd7\x60\x9e\xc3\x6b\x30\xcf\x0d\xe6\xb9\x86\xeb\xd3\x30\xcf\x85\x18\x34\xa4\x57\x0c\xda\xe7\xa0\x7d\x3e\x3d\xed\x73\x50\x29\x07\x95\x72\x50\x29\x1b\xae\x41\xa5\x1c\x54\xca\x41\xa5\x1c\x54\xca\x95\x6b\x50\x29\xed\x33\x83\x4a\x39\xa8\x94\x43\x7a\x45\xc7\xf4\x8a\xf7\x6f\xde\x06\xf1\x1c\x18\xe7\x11\x60\x16\x34\xd8\x86\xc2\xbb\x8e\x27\x0f\xbe\xd8\x41\x1b\x1e\xb4\xe1\xc1\x17\x6b\xaf\x41\x71\x1e\x14\xe7\x41\x71\x1e\x14\xe7\xca\xc6\x0d\x8a\xf3\xa0\x38\x57\xb7\x72\x50\x9c\xbb\x03\x6d\x50\x9c\x07\xc5\xb9\x61\x2b\x7e\x19\x8a\xf3\x50\x65\x56\xcb\x1c\xaa\xc7\x3e\x7c\x85\xd9\xaf\x7d\x8b\xcf\xd5\xea\xb2\xf0\xdb\xda\xca\xb2\x38\x61\xf8\xa9\xa9\xaa\xac\x44\xac\x5c\x2d\x27\xeb\x9a\x8a\x3e\x42\x29\x59\x6c\x0c\x64\x15\x87\x42\x70\x10\x7b\xd2\x22\xd1\x5c\x33\x41\x45\xb4\x04\x36\xfb\xfe\xcd\x5b\x92\x52\x41\xe7\x41\x6f\x1f\x35\x21\xe7\x1a\xe8\x8d\xce\x7d\x33\x27\xdb\x7f\xc8\x27\x80\x84\xed\x8e\xa0\x12\x85\xef\x38\x04\x0a\x87\x13\x02\x58\x0c\x02\xa0\x61\x1f\xd0\x9d\x28\x6c\x4c\xf4\x59\xfd\x80\x0f\x29\x31\x43\x4a\xcc\x90\x12\xf3\x44\x52\x62\x80\x7e\xac\x6d\x39\x57\x21\x32\x3b\x34\xe2\x8a\xd9\x8c\x16\x49\x43\x73\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x33\x7c\xb2\x83\x89\x55\xb1\x84\x45\x5a\xe6\x5b\xdb\xd6\x5d\xd9\x07\xed\x1b\xb8\xcc\xca\xd2\x0e\xd5\x66\xba\xd5\x62\xa5\xdb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xc7\x0c\x2c\x8d\x6b\x4c\xc3\x2b\xb3\xaf\xbf\x84\x27\xca\x35\xdd\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfa\xee\x6c\xd5\xca\x5d\x5d\xe0\x3a\xc3\x34\xd9\x6c\x9c\x5e\x99\xfa\xe9\x86\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\x37\x6c\x89\xf4\xb1\x92\xa5\x65\x1e\xce\x19\x50\x53\xd8\xcc\x1b\xb6\x84\x87\x2c\xb1\xdc\x22\x60\xf6\xd2\x47\xfc\x86\xad\x83\x10\xfe\xee\x26\xbb\x5e\x40\x6d\xd5\xb1\xfb\x86\x2d\x37\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xc6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x43\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x72\x43\xea\x0d\x3e\x9c\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x4f\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x74\x40\xf3\xf4\xb9\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xc3\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\x76\x10\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\x9b\xe8\x0a\x5e\x5b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x14\xa4\xff\x84\x55\x7e\xb3\xcd\xc1\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x6e\x69\x62\xe8\x1d\xd8\xe7\x09\x4b\x90\xfa\x19\x21\xbd\x46\xd8\x47\xe4\x6e\x21\x15\x12\x33\xb4\x52\x71\x45\x0e\x6e\xd8\xf2\x60\xb4\xb2\xb5\x07\xe7\xc2\xba\xa9\x56\x36\xd3\x13\x51\x29\x92\x25\x39\x80\xdf\x0e\x76\xe7\x05\x1b\x89\x25\x8d\xd1\x7c\x40\x93\x8b\x16\xd4\x6c\xe3\xbe\x55\xfd\xcb\xeb\x3a\xef\xd7\xf8\x7a\xfd\x15\x47\xfc\x30\x35\x37\xd4\x4d\xe0\x49\x42\xf1\x51\xeb\x07\x86\xe6\xa8\x68\x1e\xc1\x0e\xb0\x10\x35\xed\xe1\x7c\xa4\x8e\x71\x67\x8d\x3c\xea\x60\x0f\x9a\x5e\xe7\x96\xef\x46\xa1\xe7\xd1\x05\x66\x10\xc7\xa7\x17\xe7\xdb\x7b\xed\x5e\xc1\x2b\x44\xb3\x24\x41\x2f\xb6\x91\x59\xb5\xb4\x32\x6b\xa3\x08\x93\x05\xe3\x07\x4a\xfe\xda\xc9\x36\xb5\x6f\x85\x5f\x41\x14\xf2\x4a\xec\xf6\xb9\x5e\xd7\x5e\xb0\xe4\x8e\x7d\xcc\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\x08\x76\x42\x3e\x8e\x6f\x8a\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xd5\x23\x50\x17\x61\xb7\x41\xe9\xe0\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x72\xa5\xd7\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x64\x5e\x1b\xd2\x1c\x4d\xf2\x41\x38\x41\xfb\x45\xd9\x1f\x18\x08\x05\xc4\x4b\xb8\xdc\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x5b\xe6\xd4\x58\x64\x09\x86\x19\x64\x0b\xaa\x58\xa9\x83\xa9\x22\x8a\x18\x8b\x59\x8c\x3f\x58\x56\xc2\x66\x33\x16\x69\x7e\xcb\x92\x25\x18\xff\x15\x8a\x24\xfe\xfb\x06\xb3\xf1\xf3\xe5\x82\x6b\x5f\x14\xec\xa3\x76\x4a\x3a\xe1\xa0\x84\x57\x2d\x15\xb9\x5f\xee\x82\x2a\x32\xa3\x3c\x31\x7a\xdd\x07\x41\xae\x59\xb4\xb8\xc8\xd9\x2d\x67\x77\xdf\x0a\x45\x67\xec\x35\xe5\xc9\x6b\x99\xdf\xd1\x3c\x0e\x60\x70\x1f\xcb\x37\xb3\xf2\xbf\xe1\x94\x1c\x5c\x4e\x3d\xe1\x4c\x96\x41\xa7\x66\xeb\x19\x33\xeb\xbd\x73\x0b\xbc\x48\x0c\xc4\xc0\xe1\x4a\x8d\x42\xeb\x31\x8a\xe4\x6c\xc6\x72\x26\xcc\x79\xa2\x6e\xfc\xe0\x25\xcf\x1e\x22\xaa\x69\x22\xe7\x65\x93\x69\xab\xf7\xa2\x63\x8c\xc2\xc7\x1c\xf4\x9c\x1b\x88\x19\x51\x01\xda\x81\xe0\xd9\x0d\x8c\x46\x1f\x04\xf9\xfe\xf4\xf2\xdd\xf9\xbb\xaf\x5f\x00\x57\xd9\x04\xe1\x55\xbc\xe6\x8a\x14\xf0\x54\x60\xf5\x50\x45\xa2\x0d\x8a\x17\xc2\xfb\x8b\xa6\x6c\x41\x6f\xb9\x39\x03\xb9\xb5\x87\xdc\x32\xec\x2c\x6e\xd4\x60\x92\x48\x65\xc6\x49\x98\x52\x64\x29\x0b\x8c\xe3\x89\x19\xcb\xd0\xc5\xad\x34\x15\xd0\xcc\xc4\xfa\x33\xea\x8b\x20\x53\x66\x7e\x75\x16\xb1\x95\xd3\xd5\xe4\x4f\xd8\x42\x39\x9c\xa6\xbb\x46\x91\x25\x1b\x1d\x1e\xe3\x0d\x6f\x99\x5f\x37\x81\xb8\xaa\xf6\xb7\x0f\x98\x42\xc5\x7f\x53\x07\xee\xf0\xc1\xcb\xee\xba\xff\x7a\x3d\x0a\x03\x3f\xbe\x45\x2c\xec\xa0\xf1\x6f\x0e\xaa\xaa\xac\x32\x08\xae\xa9\xc9\xde\x4d\x9c\x33\x08\x12\xea\x93\xd9\x0c\xd1\x5a\x43\xb4\xd6\x10\xad\xd5\xf4\xfb\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x43\xb4\xd6\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x64\x88\xd6\x2a\x9f\x19\xa2\xb5\x86\x68\xad\xc7\x4b\x73\x0a\x14\xd3\xad\x3a\xe6\x9b\xf2\x59\x94\x4e\xb4\x8b\x87\x72\x27\xb3\x2a\x1a\xd6\xb5\x4e\x7b\x8a\x0d\x3f\xb6\xc3\x74\x36\x2c\xb7\x11\xba\x44\x7b\x43\x6e\xd5\x84\x1b\x58\x4e\x56\xbc\xe3\x9e\x03\x55\x16\xf5\x54\x4d\xb5\x55\xe7\xc2\x25\x9b\x75\xf4\x2d\x5c\xb2\x59\x68\x6d\x43\xc0\x54\x5d\x0a\x36\x62\xc5\xfb\x1c\xee\x21\x7c\x60\x7d\x8c\x53\xe3\x12\x8c\xb0\xef\x4c\xa6\x16\x1f\xed\x1a\xd6\xfa\x42\xb7\x1e\x69\xe0\xc7\x17\x54\x2f\x5a\xcd\xe0\xf0\xdc\x82\x0d\x1c\x87\xe0\xca\xcd\x38\x8b\x58\x25\x8c\x0a\xe4\x38\x46\x63\x7b\xd3\x08\x3e\x39\xb3\xbf\x8d\x50\xe2\xb0\xee\xd2\x32\xcc\xca\x08\x4d\x84\x1a\x42\xcc\x63\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\xad\xac\x60\xb4\x19\x65\x1b\x26\xa5\x4c\xe8\x11\x51\x45\xb4\x20\x54\x99\xa9\x19\xfd\xf6\x0a\x4c\x0f\x29\x15\x7c\xc6\x94\x9e\xd8\xd1\x58\xae\x7e\xf8\xe2\xc7\x49\xd5\xe2\xc1\xad\x4f\xd5\x05\x23\x59\x04\x80\xb3\x61\x16\xe3\xdf\x05\xa1\x15\xa6\x94\xc9\xd8\x4e\xfa\x0e\x26\xab\xe9\x0d\x23\xd2\x4e\xb6\x60\xc0\x14\x5e\x90\x03\x83\x26\xc1\xa7\xff\x69\x0e\xd6\xbf\x0f\xc8\xd1\x1d\x58\xf5\x0f\xcc\x9f\x07\xf8\x41\x1f\x3b\x66\xee\x05\x1c\xdf\x7e\x18\xe5\xfb\x9c\xcf\xe7\x20\x6e\x81\xe9\xf6\x96\x09\x7d\x0c\xfc\x6d\x46\x84\x0c\x1e\x16\xd6\x45\x56\x3a\xc6\xea\x13\xf9\xe1\x8b\x1f\x0f\xc8\x51\x75\x5d\x46\x04\x65\x1f\xc9\x17\xde\x19\x96\xc9\xf8\xd8\x69\xad\x4b\xa1\xe9\x47\x50\x0c\x16\x52\x31\x81\xbe\x04\x2d\xd1\x20\xab\xa4\x51\x3e\x59\x92\x8c\x51\xc0\x8c\xc9\x1d\xda\xe0\x1c\x28\xd1\x9f\x9c\xd1\x5c\xd7\x22\xeb\xae\xdf\x9f\xbd\x7f\x81\x5f\x33\xdb\x36\x17\x4e\xcb\x9d\x71\x41\x13\x6b\xd9\xf6\xf2\xa1\x99\x48\x81\x9b\xa4\xa5\x55\x6d\x9d\x51\x77\x56\xe8\x22\x67\x93\x7a\xa4\x55\x6b\x8c\x6f\x0a\x73\x6b\x46\x76\x08\x77\xab\x1f\xb4\x47\x0c\x26\x6b\xbd\x44\xb1\xc6\xd9\xba\xba\xc4\x77\x01\x0e\x6e\x5c\x62\x49\x9a\xcd\x2a\x63\x19\x29\xb3\xc0\x88\x65\x5a\x9d\xc8\x5b\x43\x3a\xd9\xdd\xc9\x9d\xcc\x6f\xb8\x98\x8f\x0d\x92\x8d\x71\xe7\xd5\x09\xb0\x98\x93\xdf\xc0\xff\xf6\x5a\x11\xf0\xa9\xf6\xcb\xc2\x98\xd6\x07\x58\x1b\xb0\xcf\x93\x9d\x97\xe6\xe4\xcb\x2e\x9c\xe0\xf0\xca\x29\x7f\xb5\xb7\xcd\x71\x41\x5f\xb8\x0d\x76\x0d\x28\x5c\x4a\x63\x24\x81\x54\x2c\xef\x1d\x8d\x0d\x00\x41\xc7\x8f\x96\x63\x1b\x8d\x3e\xa6\x22\x1e\x7b\xf9\x3a\x5a\xee\x0c\xb1\x82\xb7\x3c\xc0\xdf\x9e\x9f\x3d\x0c\x72\x17\xbc\xd3\x69\xed\x2b\x97\x80\x54\xe2\xcf\x69\x92\x2d\x68\x5f\xbd\x17\x86\x28\x74\xb8\x86\x28\xf4\x21\x0a\x7d\x88\x42\x2f\xaf\x27\x12\x85\x3e\x44\x91\x0f\x51\xe4\x43\x14\xf9\xfa\x9f\x87\x28\xf2\x21\x8a\x7c\x88\x22\xaf\x5f\x43\x14\xf9\x10\x45\x3e\x44\x91\x0f\x51\xe4\x0d\x57\x1f\x05\xeb\x3e\xc1\xf8\xcb\xc1\x39\xf6\x69\x38\xc7\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x07\x8c\x1f\xdc\x5d\x83\xbb\x6b\x70\x77\x0d\xee\xae\x27\xea\xee\xea\xd4\x65\xfc\x93\xae\x9d\xf5\xf0\x65\xb3\xe0\xd6\x6a\xc5\xac\xb5\xc5\xb2\x6c\x9d\xac\x95\x62\x58\x65\x1d\xac\x97\x98\x4e\x79\xff\x45\xb0\xaa\x06\x40\xd7\xa0\xb9\x43\x53\xf6\xc1\xa1\x37\x38\xf4\x06\x87\xde\xb6\x53\xd2\xc1\xa1\x07\xbe\xbc\xf0\x28\x58\x75\xa4\x4c\xe1\x78\xdf\xec\xda\x58\xff\xe9\xf6\xa6\x15\x6b\x55\x09\x3f\xef\x72\x51\xca\xef\x07\x16\x16\x38\x29\x66\x43\x23\x99\x66\x52\x18\xc4\xe8\xc7\xb9\x58\x8e\xd7\x22\x61\xd5\x3d\x6a\xef\x4f\x59\x18\x4c\x6e\x3d\x5b\x69\x26\x15\xab\xd8\x71\x77\x50\xbc\x37\xbb\xa6\xc6\xe8\xf4\x71\x26\xb4\x1d\x14\xf7\xca\xfb\xad\x64\x91\x37\xe1\x1b\xd6\x35\x09\x9e\xa7\x9f\x0b\x96\x63\x1b\xfd\xd2\x81\x53\x02\xc5\x99\x5c\xd1\x25\x55\x01\xcb\xe1\x86\xcd\x6c\x09\xa6\x36\x4b\x25\x1d\xfc\xb1\x2b\xab\x7e\x50\x9f\x2c\x69\xed\x3f\x69\xe1\x3d\x79\xda\xfe\x59\xd2\xd6\x47\x4b\x5a\xfa\x69\x49\x0b\x5f\x2d\x69\xe7\xaf\x25\xad\x7d\xb6\xa4\x8d\xdf\x96\xdc\xb3\xef\x96\xb4\x77\x6a\x92\xd6\x3e\xdc\x95\x49\x3f\x39\x3f\x6e\xc7\x65\xb7\xf1\xe7\xae\x2c\x7a\xf0\xe9\xd6\x40\xbd\xdd\xaf\x4b\xda\xfa\x76\x49\xfb\xf4\xa4\xad\x3e\x5e\x32\xf8\x79\xbb\xf1\x97\xad\x44\xb7\x9b\xbf\xb7\xd5\x5e\xe6\x6c\xd6\xce\x49\x7f\xc9\x66\xb8\x98\x40\x9c\x28\x1d\x1d\x72\xad\x0c\x51\x4a\x1d\x23\x4b\x45\x5d\xfd\x9c\x8a\xec\xf2\x30\x11\x51\x97\x3c\x5a\x5c\x86\xc6\x2b\x1a\xd8\xb2\x80\x46\xba\xd9\x8e\x08\x13\x39\x8f\x16\x6e\xb2\x46\xc8\xb5\x9e\xb5\xcd\x35\x4f\xc2\x69\x6f\xd9\xd0\x76\xec\x6c\xbb\x37\xa7\x61\xa1\x3b\xf8\x74\xc2\x89\x6f\x25\xde\x9b\x0b\xca\xac\x99\x54\x50\x09\xa4\x96\x81\x6f\xf5\xf0\x4a\x96\xba\xc7\xa0\x07\x0c\x6d\x69\x9e\x6e\x39\xdb\x70\xb2\xd4\x25\xa8\xae\xd6\x6c\x11\xe5\xe4\xad\x43\x76\x43\xae\x7d\xb8\x8c\x16\x62\x57\x7b\xc1\x6b\x6b\x3d\x90\xf0\xc1\xb5\x95\x41\xca\xab\xbd\xf4\xd5\xad\x5a\x48\x79\xad\xf8\xc1\xf7\xa9\x0e\xd2\x17\xa7\x2b\xaf\xb6\x65\x3a\xaa\x60\x40\x27\x7c\xaf\x20\xb8\xa3\x10\x6d\x32\x5d\x89\x41\x78\x94\x45\x6e\xad\x4a\xb2\x66\x75\xa7\xfb\x16\x25\xe9\x7b\xf1\xdb\x0a\x51\xac\x59\xc7\x75\xb7\xea\x12\x7d\xcf\x7a\x5b\xfd\x83\x35\xb3\xbe\xea\xb5\x12\xc2\x8e\x73\xdf\x5c\x94\x60\xcd\xcc\xaf\xeb\xe5\x09\x7a\x9c\xd6\xd6\xb8\x85\x86\xf9\x0c\xd1\x0b\x43\xf4\xc2\x13\x8f\x5e\xe8\x74\x06\x36\x45\x32\x34\xa1\xff\x53\x8d\x67\xe8\xb4\xe8\x4d\xb1\x0d\x4d\x8b\x7e\x22\x11\x0e\x9d\xd7\xb8\x31\xda\x61\xdd\x42\x9f\x48\xcc\x43\xa7\xc5\xb6\x8c\x7f\x68\x5a\xf2\x2f\x39\x0a\xa2\x13\x0c\x37\x44\x44\x34\xc1\xed\x49\xc4\x45\xac\x5d\xe0\xaf\xba\xb1\x58\x58\xfe\xf8\xe1\x02\x24\xae\x82\xaf\xd6\x82\x24\xc2\x9f\x56\x02\x25\x2a\xb3\xc5\x60\x89\x86\xa6\x62\xaa\x98\x86\xff\xae\x47\x55\xa8\xea\xc7\xdb\x74\x18\x0b\xed\x6b\x10\x13\xf0\x52\x26\x45\x1a\xda\x38\xc6\xab\xa2\x7f\x46\xa3\x1b\xa3\xb5\xd8\xef\x4d\xc1\xb3\x16\x20\xe7\xdf\x95\x14\x20\x51\x92\x09\x88\x21\x06\x82\xc1\xcf\xb8\x3f\x17\x38\xc8\x67\x1b\x31\xb8\xf1\xf3\xae\x46\xb5\xf5\xd6\x3b\x0d\xa4\x14\x7e\xb2\x95\xa1\xeb\x33\xc2\x57\x57\xe6\x74\x55\xbf\xdd\x7a\x4a\x0b\x2a\x04\x4b\x0c\x2d\x40\x8f\x3e\x48\x77\x1e\x3e\x9b\xc1\x63\x5f\x5e\x99\xcd\xcb\x95\xfb\x0d\xd3\xa9\xa4\xe8\xef\x1b\x23\x13\xa2\x28\xb9\x61\x2c\x53\x81\xb3\xa4\x00\x9f\x0a\xe4\x82\x4c\x97\x46\xbd\x8b\x6e\xa0\xdc\x28\x48\x65\xb0\xde\x97\xb8\x31\x3d\x27\xd0\x03\xb2\x67\x2c\x0a\x6e\x0d\x21\x38\x43\x08\xce\x10\x82\xb3\xed\x8c\xb5\x08\xc1\x09\x0f\x7c\x25\x0c\x87\x0a\x72\x9a\x65\x09\x18\xa5\x5c\x69\x58\x5b\x73\xd0\x16\xdc\x58\xb1\xc4\xed\x98\x5e\x54\x63\x0e\xee\xf6\x0a\x85\xae\xfe\xe0\x99\x5a\xed\x89\x8d\x11\x36\x48\x4f\x9b\xe4\xbb\x8d\xd2\x61\x24\xc5\x8c\xcf\xb7\xe7\xc5\x04\xb0\x7c\x09\xaf\x94\x1e\x33\x1c\xa2\xb0\x95\x6d\x4b\x4e\x05\xe9\x5b\x15\xbe\x7d\x1f\xc9\x31\x33\x90\xc0\xd6\x86\x07\x54\x56\x71\x3e\x2b\xa7\x37\x82\x68\x9a\x9c\xc7\x96\x3e\x66\x32\x3e\x54\x40\xcd\xe2\x22\xb1\xa5\xa6\xb1\x14\x8b\x39\x9a\x82\x27\x66\x25\x63\xaa\xf1\x3c\x30\x85\xf9\x8e\x9f\x0b\xa9\x3f\xf7\x23\xa1\xe1\x25\xe7\x73\xee\x49\x9f\x6f\x59\x92\xc9\x78\xe2\x8b\x39\x68\x70\x59\x56\x07\x9c\x90\x6f\x95\x75\x30\x3b\xe2\x70\xf4\xcf\x7f\x1f\x1b\xc2\xca\x72\x2c\xd4\x69\x07\xae\xbc\xb7\x25\x0a\xa4\xa7\xd8\x1e\x21\x63\x76\xba\x05\xd4\x2b\xe0\x3e\xf3\xf1\x5b\xe6\x75\xbf\x55\x21\x90\xf3\x22\x09\xd2\xc4\x0c\x8c\xf6\x77\xab\xb6\x75\x6c\x64\x68\xe5\x63\xf1\x19\xb8\xed\xaf\xfc\xac\xce\x31\x53\x12\x6f\xbf\xfa\xc8\xa2\x42\x6f\x55\x39\x1b\x8c\xc8\x76\x99\x60\x90\x4a\x12\xfb\x39\x10\x9d\xec\x0f\x66\xbd\xc0\x38\x0d\x78\x6c\x68\x9b\xa2\x9a\xab\xd9\x12\xf3\x6e\x1d\xc0\x58\x10\x1b\x55\x9e\x2f\x23\xa8\x04\x75\x88\xa7\x85\xc6\xd2\xa6\x4b\x12\x2d\xa4\xc1\x2f\x8a\x70\x87\x71\x6f\xb9\xc4\x00\x22\xb0\x07\xe7\x24\x35\x1c\xc0\x6a\x77\xc1\xf0\xe8\xf1\x2e\x5f\x33\xaa\xb0\x54\xba\x84\x95\x0b\xaa\x31\xc3\x80\x9d\xcd\xfc\x31\x37\xea\x0a\x78\xfc\x8a\xd4\x0c\x7a\xc7\xf8\x7c\xa1\xd5\x88\xf0\x09\x9b\xc0\xee\x32\x1a\x2d\x82\x61\x53\xc6\xb4\x22\x34\x49\x7c\x63\x92\x00\x25\x42\x77\xfb\x91\x67\x9a\x96\xc1\x8d\x3c\xbd\xad\xef\x5a\x23\xb8\x46\x84\xe9\x68\x72\x3c\x02\x0f\x9e\x39\x2d\x14\xe6\x38\x5d\x12\xae\xa1\x16\x37\x30\xe8\x5c\x16\x73\x5c\x89\x0d\x34\x50\x5e\x3a\xb2\xf6\x59\x11\x83\x36\x21\xe6\xe4\x00\x17\x77\xe0\x04\x1e\x33\x9c\x35\xb9\xc2\xfa\x5c\x69\x59\xb4\x78\xe6\x39\x53\x99\xc4\x1e\x2c\xf5\xc8\x85\xff\xcf\xbf\x74\xa4\x8e\x4b\x60\x2e\xf8\x7c\xe1\x60\x49\x73\xa4\x29\xd5\x3d\x68\xe7\x7c\x6c\x13\x46\xd2\x32\x88\xa4\xea\xe7\x71\xe5\xe2\x4b\x9c\x08\x76\x4f\xb3\x3c\xf5\x30\x80\x0d\x46\x5d\xdf\x1a\x65\x53\x9b\xc3\x8c\x40\x24\xcf\xc8\x11\xa0\x08\xd7\x87\x0a\xd0\x75\x2c\xb3\xe3\x09\x39\x05\x6d\xb7\xc5\x07\x84\xf4\xe3\xdb\x81\xcc\x47\x95\x2c\xc7\x6a\xe7\xb3\x68\xe7\xa9\xed\xe2\xab\x35\xdc\x3c\xf3\x26\xa5\x56\x8f\x23\x4c\xb6\x3e\xda\xc5\x6f\x4b\x82\x39\xb4\x79\x7a\xc5\xa5\x07\x28\x5d\x86\x2d\xb2\x3c\x1d\x11\xaa\x94\x8c\x78\xd9\x38\x69\x15\xd3\x71\x25\x6d\xfc\x38\x1d\xe1\x4f\x3a\xaf\x9f\x74\x0c\x4c\xad\x5e\xf5\xf8\x4e\x1b\x92\x5a\x85\x4a\x85\x60\x4d\x97\xf0\x2b\x38\x0a\xa7\x2c\xd9\x12\x9d\x19\x5e\x5d\x82\xbf\xdc\xd5\x3a\x08\x6c\xcd\x82\xd6\x2e\xe4\xd1\xe2\x55\x9b\x60\xd2\x01\x39\xf0\xea\x72\x4c\xcb\xab\x4d\x64\x6b\xfd\x8d\x56\x71\xae\xd5\xab\x3b\xfe\xe2\xd5\x2a\x06\xb6\x7a\xad\x88\x24\x7d\x85\xc2\x56\xaf\x8e\x21\x09\xe5\xd5\x3e\x4c\x76\xc3\xba\x2e\xef\x2b\x56\x76\x54\x0d\x94\x25\x5f\x6b\xc4\xf5\x37\x2d\x29\x5b\x0f\x00\x6a\x1b\x50\xbb\x01\x3c\xa7\x9f\x4c\x50\x6d\xc3\x50\x5f\x6b\x33\xcc\x9b\xb5\x2f\x83\xc3\x96\xba\xe0\x52\x2b\xbc\x8d\x6a\x05\x69\xc0\x16\x95\xe5\xcc\x30\x2c\xec\xfd\x65\x3b\xa1\xdc\x5b\x1c\x6f\xd3\xee\x77\x23\xec\x78\x75\x26\xef\xe1\x07\x3b\xa1\x1b\xb0\xc8\xd7\xd0\x38\xeb\x61\xb8\x23\x36\xe9\x1a\xb8\xe3\xc0\x1d\xab\xd7\xc0\x1d\xfd\x35\x70\xc7\x2d\xd7\xc0\x1d\x07\xee\x78\xef\xdc\x11\x75\xd9\x1d\x94\xe7\xef\xd1\xc4\x51\xd7\x96\x81\xd3\x3a\xbf\x50\x55\x6d\x36\xfc\xc6\x25\x50\x5c\x83\xaa\x6d\x6d\xc7\x39\xc4\x86\x3d\x1f\x3f\x7f\xf6\xac\x8b\x52\xbd\xad\xe1\x5b\x78\x05\xcd\xdf\x7e\xff\xc5\xc6\x37\xd6\xd9\xdf\x7a\xb0\x9a\x5a\x1c\xf7\x86\xbc\x8a\xec\xb0\xc6\xf0\x09\xd4\x49\x48\x4d\x52\xa6\x09\xd5\x15\x53\x11\x4f\xd9\xc8\x19\x96\xcb\x16\xdb\xd3\xd2\x34\x1b\x13\x29\x5c\xa4\xa2\x8c\xd9\x64\xb7\x19\x44\x8c\x2a\xc8\x37\x99\x32\x3f\x0b\x99\x9a\xaf\x72\xa1\xdd\x71\x31\x53\x60\x0e\x2a\xe4\x88\x4d\xe6\x13\x12\x17\xcc\x26\x38\xa1\x9f\xce\xb6\xb3\x52\x4b\xa5\x59\x0a\x96\x5c\x99\xfb\xa6\x6f\x3a\x87\x18\x45\x08\x94\x2c\x68\x92\x2c\x09\xbb\xe5\x36\xdb\xd7\x0c\x0e\x6e\x42\xa8\x09\x6f\x56\xd2\xca\x44\xd8\x7b\x7e\x42\x1d\x83\xb7\xa5\x2a\x74\xe1\xf6\x2b\x63\x77\x8e\x34\xbe\xb4\x2b\x99\xac\x15\x56\xb5\x19\x17\x6d\xe0\xf0\x4f\x40\xae\xf7\x97\xdb\x4d\xae\xa4\x33\x25\xeb\x40\xbd\xea\x62\x69\x91\x24\x06\x31\xd0\x0a\xbb\xba\x80\x06\xeb\x68\x43\x22\x1b\x1a\xde\xd3\x20\xa1\x0d\x9b\x98\xcb\x4c\x26\x72\xbe\x0c\x21\x8d\x1d\xe4\x78\x9a\x39\xe3\x38\x7a\xf5\x98\x6f\xd0\xfc\xae\xb6\x35\x83\xe5\x6f\xb0\xfc\x0d\xba\xcd\xca\x35\xe8\x36\xfe\x1a\x74\x9b\x2d\xd7\xa0\xdb\x0c\xba\xcd\x60\xf9\x23\x03\x77\xdc\x00\x93\x81\x3b\x92\x81\x3b\xae\x5d\xd7\xc0\x1d\x37\x82\x67\xe0\x8e\x03\x77\x6c\xba\x32\x19\xef\x11\xe8\x98\xc9\x78\x43\x9c\x23\x5a\x7d\x22\x39\x4e\x64\x84\x6d\x27\x30\x31\xd5\xd9\xf9\x14\x4d\xd1\x10\x35\x22\xff\x90\x82\x61\xf0\x9a\xd9\x1b\x30\x27\x41\x1d\x04\xf3\xf8\x91\x3a\xde\x18\xd8\x34\xc4\x49\x0e\x71\x92\x4f\x3e\x4e\x72\x41\x15\xee\x2b\x12\xa5\xf5\x61\x93\xc1\x81\xbc\x66\x79\xfa\x89\x46\x4d\x1a\x74\xb1\xdb\x0d\x29\x36\xe5\x96\xe2\xca\x63\xeb\x2f\x60\xf1\x45\x75\xbd\x56\x5e\xc6\x5a\x4d\x71\xcc\x62\x92\xb1\x7c\x8c\x28\x22\xc9\x8c\xdb\x62\x56\x35\xec\xb3\xf0\x79\xd4\xe8\xc7\xea\x3a\x1e\x31\x04\xb2\x3a\x91\x1d\x6c\xae\xa1\xe1\xb8\x42\xe1\x9f\x44\x40\x64\x57\xa9\x7e\x4c\xb4\x35\xf2\x7e\xd3\x52\xae\xef\x2e\x9a\xb7\x2a\x7d\xba\x7a\x35\xd6\xd3\xdc\x58\xfb\x74\xe4\x0b\x3c\x44\x54\x21\xa7\xe8\xaa\x5a\x76\x54\xa3\x76\xd3\x53\x76\xb7\x44\x93\x47\x2f\x97\xba\x7a\xed\x2a\xba\xed\x24\xb8\x3d\xfd\x22\xab\xeb\x00\xd4\x59\x41\x27\x3b\x2b\xe9\x64\x27\x45\x9d\xec\xaa\xac\x93\x3d\x14\x76\xb2\x9b\xd2\x4e\x1e\xa0\xc4\xeb\xea\xb5\xb3\x8a\x4a\xf6\xd0\xe3\xc9\x27\x51\x18\x76\xf5\xda\x0b\x58\xbb\xe9\xf4\x64\x28\x27\xdb\xe1\xda\x5d\xe5\x26\xbb\xab\xdd\x64\x77\xcc\x68\x59\x96\x76\xf5\x1a\x0a\xd5\xee\xc5\xd9\x77\x60\x5c\xdd\x8b\xd9\xae\xfb\x78\x27\x2c\xf1\x75\x86\xfa\x17\x36\x75\xd9\xd9\x30\xec\xb5\xe9\x18\x0c\x84\x5a\x04\xcc\xc5\x47\x8d\x00\x8e\xc1\xfd\xd8\x29\xbf\x85\x08\x2a\xb7\x06\x83\xf9\x0a\xba\xb5\x90\x26\xbb\xf1\x52\x30\x05\x82\x1d\xf3\x26\xa2\xb0\xb9\xa2\x79\x76\x82\xe1\x20\x25\xb7\x13\x71\x3d\x40\xa4\x7c\x03\x64\xc4\x94\x51\xa1\xc8\x81\xb3\x3d\x1d\xaa\xf2\x89\x83\x49\x99\xdd\xe7\x47\x84\x24\xe4\x30\xa3\x6f\x73\x53\xf7\x4d\x3b\x3b\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xdd\x78\x0d\x92\x76\x87\x6b\x90\xb4\x07\x49\x7b\xd3\x87\x07\x49\x7b\x90\xb4\xb7\x7f\x7c\x37\x49\x7b\xd7\x38\xa1\x50\xee\xb5\xce\x39\xac\x9c\x05\xad\xf9\x7d\x0c\x91\x2f\x50\x0a\xff\xea\x57\xde\x0e\x65\xe9\x66\x69\x3b\x94\xc8\x57\x74\x8b\xc9\x16\xd1\xda\x0b\xdf\x2b\x6f\x6e\x96\xba\x9f\x56\x2c\xd4\x0e\xb8\x11\x38\x14\x76\x44\x8e\x6b\xe7\x0a\xb7\x95\xe6\xa6\xac\xf4\x93\xc7\xe4\xc8\x79\x5c\xa0\x42\xb4\x90\xba\xfa\xa3\xd0\x7c\x5c\x3e\xe1\x7d\x30\xe0\x5e\xac\xe4\xdb\x24\xd5\xfe\x6a\xa2\x56\x5b\xb1\xdc\x4f\x43\x42\x58\x5e\x99\x03\x77\x8d\xf4\x20\x5a\x22\x2f\x84\x30\xa3\x42\x95\x6c\xf0\xc6\x21\xcd\xc1\x02\x70\xbe\xb3\xbf\x11\x96\x60\x3e\x20\x31\x95\x50\x0a\xfc\x9d\xd4\x96\x91\xb6\xa1\xfc\x52\x58\x8f\xa8\xb9\xe3\xbc\xbe\x0e\x29\x61\x45\xdc\x7f\x7d\x42\x5e\x01\x1e\x86\x03\xdb\x92\xd3\x34\x49\xe4\x5d\x17\x92\xf4\x50\x69\x51\x77\x9d\xd3\xa2\x6a\xfe\xbb\x21\x2b\xea\x57\x92\x15\x05\x3f\xe2\x11\xea\x3d\x3d\x8a\x7c\xbf\x60\x80\x45\x39\x03\x50\xa5\x45\xa2\x79\x56\xc6\x4a\x29\xfc\x54\x82\x52\xe6\xcc\x46\x9e\x54\xf1\xd2\x7c\x8d\x46\x8b\x3a\x7e\xc2\x78\x10\x5b\xa5\xe0\xd0\xda\xe8\x0e\x9a\x24\x36\xa7\xc8\x89\xa4\x18\xc2\xc2\x1f\x3b\x32\xe1\xcc\x55\x45\x74\xda\x0c\x10\x99\x23\x43\x0b\x93\xa5\xad\x54\xb7\x81\x88\xa2\x52\x74\xcb\x1c\xeb\x9d\xf3\x5b\x26\x4a\x4a\x7a\xa4\x8e\x8f\x1d\x0f\xef\x95\xc2\xdf\x0b\x85\xfe\x73\x40\x49\xff\xd2\x86\x46\xc3\x82\x3c\x95\x2e\xc1\x57\xd2\xe8\xc7\x0c\xc1\xe8\xe2\xe7\xef\x66\x63\xd8\xc1\xbf\xff\x80\xbe\xfd\x4f\x27\xb3\xec\x91\x2d\x8c\x8f\x11\x5b\xff\xe4\xad\x8a\x43\x70\x7d\x79\xed\x1b\x5c\x7f\xef\x96\xc3\xc7\x8d\xb1\xff\x04\xac\x85\x8f\x19\x63\x3f\x58\x08\x37\x6e\xca\x53\x0b\x7d\xaf\x5e\x3b\x59\x04\x07\x6b\xe0\xce\x5c\xb8\x23\xc3\xd9\xd7\x0a\xd8\x11\x23\x76\xf4\xb3\x0f\x3e\xf6\x87\xf1\xb1\x0f\x12\x6f\xcb\x6b\x90\x78\xd7\x02\x65\x90\x78\xc9\x20\xf1\x6e\x5b\xde\x20\xf1\x6e\x04\xcf\x20\xf1\x6e\xdc\x94\x41\xe2\x1d\x24\x5e\xf2\xa9\x49\xbc\xbb\x54\xe9\x1a\x7c\xdd\x7b\xf9\xba\xbb\x52\x8b\x4e\x34\xa2\x23\x1e\x74\xf6\x6d\x0f\x7e\xed\xa7\xe2\xd7\x6e\x9d\xf0\x2f\x34\xdf\x37\xe9\x3f\xdc\xab\x75\x99\xff\xf4\x56\xf2\x98\x64\x85\xb6\xf9\xd4\x43\xf6\x7f\x1f\xd9\xff\x15\xc8\x0f\x25\x00\x5a\x95\x00\x58\x07\xb3\xa1\x0e\xc0\x50\x07\xa0\x67\x27\xf4\x50\x07\x60\xa8\x03\x30\xd4\x01\x70\xd7\x90\x9d\x44\x86\xec\xa4\x56\xd7\x90\x9d\xb4\xfe\x1a\xb2\x93\x9e\xac\xf5\x95\x0c\xd9\x49\x4f\xdb\x12\x4b\x86\xec\xa4\xc1\x3a\xdb\x72\xa3\x3e\xc1\xec\xa4\xa1\x0e\xc0\x53\x8d\x51\x20\x83\xa4\x3d\x48\xda\x83\xa4\x3d\x48\xda\x9b\xaf\x41\xd2\xee\x70\x0d\x92\xf6\x20\x69\x6f\xfa\xf0\x20\x69\x0f\x92\xf6\xf6\x8f\x0f\x75\x00\x3e\xa1\xd8\x08\x32\xd4\x01\x18\xe2\x25\x86\x3a\x00\xbf\xde\x3a\x00\x15\xdf\xfd\xe3\x15\x03\xe8\x3e\x8d\xa1\x22\xc0\x50\x11\x60\xa8\x08\x30\x54\x04\x70\xd7\x50\x11\x00\xaf\xa7\x64\x6b\x1c\xf2\xa3\xd6\x02\x65\xc8\x8f\x22\x43\x7e\xd4\xb6\xe5\x7d\x02\x76\xc3\x21\x3f\xea\x09\xda\x0a\x87\xfc\xa8\xc1\x2e\x58\xdf\x9c\x4f\x24\x3f\x6a\xa8\x08\xf0\x14\xbd\xed\x83\xc4\xdb\xf2\x1a\x24\xde\xb5\x40\x19\x24\x5e\x32\x48\xbc\xdb\x96\x37\x48\xbc\x1b\xc1\x33\x48\xbc\x1b\x37\x65\x90\x78\x07\x89\x97\x7c\x6a\x12\xef\x50\x11\x60\xa8\x08\x30\x54\x04\xf8\x14\x3d\xdc\x5b\x77\x9a\x89\xdb\x75\x7b\x5a\xd9\xc5\x57\xe2\xb6\xaa\xa7\x30\x71\xcb\x73\x29\x80\x02\xdf\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\xae\x9d\xff\x76\xc4\xdf\x82\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xed\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xed\x03\xed\xa4\x78\x33\xc4\xe6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xdf\xce\xcf\x5e\xbd\xbb\x3e\x7f\x7d\xfe\xea\x72\x33\xd2\xb5\x24\x2b\x70\x90\x3a\x4c\xf6\xf0\x3b\xb7\x47\x90\xe6\xcd\x84\xa1\xc0\xbf\x3d\xfa\xee\xf4\xf2\x6f\xef\x4e\xdf\xbe\x3a\x06\xf6\xcb\x3e\x66\x54\xc4\x2c\x26\x85\x72\x24\x21\xcb\xd9\x2d\x97\x85\x4a\x96\xfe\x78\x37\x23\x6d\x1d\x5b\xad\xa2\xb9\x24\x8a\xe5\xb7\x3c\x6a\x06\x11\x4a\xb1\xb4\x44\xa0\xc8\x63\x78\xce\x94\x4c\x6e\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x26\x0b\x33\xde\x6f\x7f\x0b\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x3b\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x29\x34\xfd\xf8\x02\x7d\xf0\x07\xbf\x0d\x7e\x3a\x70\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x10\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x5b\x96\x83\x3c\x6d\x77\x61\x44\x72\x36\xa7\x79\x9c\x30\x05\xc1\x03\x77\x0b\x06\xe5\x3c\x50\xc2\xb2\x00\x63\x5e\x5a\x17\x52\x4f\xc8\x19\x9b\xd1\x22\xd1\x40\x43\x0e\x0e\x26\x87\xbd\xa1\xda\xeb\x5c\x6e\x49\x7e\xaf\xa0\xdb\x15\x16\x95\x98\xc9\x7c\xed\xf1\x38\xb4\xa6\x89\x0a\x59\x53\x86\x93\x58\x4d\xcf\xd1\x6a\xd4\x2f\x5a\xac\xa4\x85\x20\xd8\x5e\x9d\x8f\xa4\x98\xf1\xf9\x5b\x9a\x7d\xc3\x96\x97\x6c\xd6\x31\x1a\x02\x99\xa8\xd5\x69\x81\x81\x19\x72\x88\x03\x6e\x67\x3a\xf7\xe8\xcb\x6f\x63\x34\xe9\x66\xf3\x68\x6d\xe9\x58\x29\x69\x81\x4c\xdf\xb2\xef\x1e\x8b\xf3\x94\xd7\x76\x8a\xde\x38\xb9\xc3\x90\xb4\xdb\x73\xaa\x27\xe4\xad\x84\x90\x9c\x99\x7c\x41\x16\x5a\x67\xea\xc5\xc9\xc9\x4d\x31\x65\xb9\x60\x9a\xa9\x09\x97\x27\xb1\x8c\xd4\x49\x24\x45\xc4\x32\xad\x4e\xe4\xad\xa1\x7c\xec\xee\xe4\x4e\xe6\x37\x5c\xcc\xc7\x46\xd2\x19\xe3\xae\xaa\x13\x10\xa6\x4e\x7e\x83\x12\xfb\xf5\xfb\xb3\xf7\x2f\xc8\x69\x1c\xdb\x8a\x3d\x85\x62\xb3\x22\xb1\xd5\x3b\x26\x84\x66\xfc\x3b\x96\x1b\xa5\x6c\x44\x6e\xb8\x88\x47\xa4\xe0\xf1\x5f\x37\x1f\xee\x1d\x21\x26\x33\xd4\x8d\x76\x80\xda\x15\x08\x8a\xcb\x0a\x9d\xf2\x48\x6f\x28\x14\xd7\x0a\xf6\xdc\x19\x0e\x2c\x43\xe9\xb0\x8c\xa9\x94\x09\xa3\x62\xcb\x1b\x00\xb6\xee\x67\xf6\xb0\x3c\xb4\xa8\xe5\x58\x04\xc8\x64\xfc\x82\xa8\x22\xcb\x64\xae\x15\x49\x99\xa6\x31\xd5\x74\x62\x76\x6e\x54\xfd\x13\x84\xe3\x11\xf9\xc9\xdf\x04\x09\x57\xfd\x70\x78\xf8\xe7\x6f\x5e\xfd\xdf\xbf\x1c\x1e\xfe\xf8\x53\xf8\x2b\x90\x3d\x34\x75\x55\x1f\x31\x22\xf7\xc4\x88\xbb\xef\xe0\x1b\xf0\xa7\x65\xa3\xa7\x51\x24\x0b\xa1\xed\x0f\x9a\xea\x42\x4d\x16\x52\xe9\xf3\x0b\xff\x67\x26\xe3\xfa\x5f\x6a\x0b\x27\x20\xf7\x4b\x74\x00\x9c\x17\x54\x2f\x7a\x26\x3d\xe5\xb9\xd8\x01\x5d\xed\x9b\x61\x85\xa4\x94\xc2\x3f\x5f\xbb\xe9\x1a\x0e\x74\x97\x73\xad\x99\x00\xb9\x03\xe2\xee\xe4\x6c\x64\x30\xb7\x64\xb3\xb7\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x0e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xaa\xd7\x9d\x5e\x9c\x93\x5b\x84\x46\xef\x0b\x71\x51\x58\xaf\xf7\x3e\x93\xbe\x52\x95\x5d\x96\x97\x34\x5f\xa0\x65\xc9\xc7\x7b\x91\x84\xa7\xdc\x1a\x80\x6d\x55\x2b\x45\x8e\xf0\xe6\x24\xca\x8a\x91\x7d\x60\x92\xb2\x54\xe6\x4b\xff\x27\xcb\x16\x2c\x35\x12\xdb\x58\x69\x99\xd3\x39\x1b\xf9\xd7\xf1\x35\xff\x17\xbe\x58\xf9\xc0\xea\xdb\x28\x52\x47\x45\x6e\x98\x47\xb2\x74\x14\x84\xc5\x8f\x7b\x16\x1d\x98\x7a\x3e\x8a\x7e\x37\xde\xed\xc8\x72\xbd\xb6\x88\x4c\xdb\xaf\x0a\x64\xc8\x5b\x99\x14\x29\x53\x23\xcf\x9e\x50\x5a\x17\xb7\x46\x9a\x54\xf7\xc2\x08\x63\x7e\xcb\xd5\x4e\xfe\xe9\x2b\x6f\xa9\x03\x13\x59\xa1\x8d\xa6\x82\xc1\xe0\x41\x45\x38\xa9\x40\x07\xf0\x31\x8a\x15\x92\xf2\xfc\xa0\x9d\xf7\x95\x6a\xcd\x72\xf1\x82\xfc\xef\xd1\x87\xdf\xfd\x6b\x7c\xfc\xd7\xa3\xa3\x1f\x9e\x8d\xff\xf3\xc7\xdf\x1d\x7d\x98\xc0\x3f\x3e\x3f\xfe\xeb\xf1\xbf\xdc\x1f\xbf\x3b\x3e\x3e\x3a\xfa\xe1\x9b\xb7\x5f\x5f\x5f\xbc\xfa\x91\x1f\xff\xeb\x07\x51\xa4\x37\xf8\xd7\xbf\x8e\x7e\x60\xaf\x7e\x6c\x39\xc8\xf1\xf1\x5f\x7f\xdb\x6a\x7a\x54\x2c\xdf\xb7\x38\xf0\x78\x8d\x77\x88\xb0\x2f\xdf\xea\x60\xa0\xff\x38\x2e\x85\xb6\x31\x17\x7a\x2c\xf3\x31\xbe\xfe\x82\xe8\xbc\xd8\x7e\x30\x4a\xa2\xb6\x0b\x9e\xbb\x72\x60\x2f\x4a\x82\xe6\x49\x73\xef\x88\xac\x58\x94\x33\xdd\x97\x06\x83\xa3\x39\xfe\x51\x33\xc9\x0e\x4a\x4d\xa9\xd4\x78\xbb\x24\xc0\xab\xe4\xbc\xb3\x5c\xa6\x13\x12\x98\x85\x6e\xc1\x93\x69\x9f\xbb\x61\x5b\xb4\x5c\x77\x0d\x4a\xd0\xa7\xa5\x04\x5d\xe1\xfe\xde\xbb\x06\xc4\xc4\xed\x26\x33\x4d\xdd\xa6\xfb\x1a\x52\x59\x42\x73\xb4\x13\xa0\xb4\x24\x99\xcc\x8a\x84\xea\x35\x66\xbb\x06\xdb\xb4\xc5\xfd\xd2\x0b\x60\x36\x1a\xec\xc0\x96\xca\xa5\xcd\xc6\x50\x72\x9a\x24\x84\x0b\x3c\x09\x30\x80\xb3\xe6\xe5\x0c\xe5\x25\x42\xd1\xe0\x7c\x6b\xa6\x70\x67\x13\x6e\x02\x43\x23\x57\x46\xd7\xc9\x35\x58\xfc\x21\x21\x07\x69\x96\x35\x8d\x71\x51\xa6\xe5\x78\x6e\xeb\xbd\x94\x8d\xf5\x17\x13\xaa\xb4\x9b\x36\xcc\x46\xd3\x1b\x30\x85\x46\x2c\x66\x22\x62\x10\x82\x50\xb0\x72\xad\x53\x23\x0c\x82\x79\x1f\xc6\xa0\x24\x2e\xb2\x84\x47\x06\x7e\x66\x26\xcd\x63\x9c\xa7\x69\xa1\xc1\x50\xfc\x50\x56\x7c\xb3\xe3\x57\xae\xdc\xab\x37\xe6\x03\xa9\xf2\xa2\xb5\x8f\xb6\xf0\xaa\xbb\xda\xcf\x7c\xdf\x8e\xf0\x7a\x73\xdb\x56\x4e\xb5\x42\x71\x4b\x1b\x43\x95\xd2\x3e\xb4\xc5\xb0\x1d\x9d\xfd\x45\xd2\xd8\x0e\xf4\xb5\x3d\x6d\xed\x60\x5c\xea\x4a\x4f\xdb\x5a\x93\xb2\x9c\xcd\xf8\xc7\x0e\xf8\x78\x2a\x4a\x15\x85\xc7\x4c\x68\xa3\x08\x40\x65\xea\x2c\x67\x19\x13\xb1\x4f\xf7\x83\x00\x2f\x51\x5d\xc7\xbd\x7a\x8c\x50\xca\xe8\x7e\xbc\xae\x9a\xa4\x98\xe1\x6c\xfd\xc2\xcf\x96\xdd\xf5\xfe\x0f\x96\x90\xf1\xd6\xe0\xef\xda\x3e\x06\x6f\xd4\x22\x5d\x6d\xf9\x6f\x3b\x49\xa3\xbd\x79\x97\x53\x26\x63\xac\x71\xad\xcb\x20\x84\x09\xb9\x6a\x78\x13\x62\x0d\xec\x13\x87\x87\x0a\xc3\x12\x54\x7d\xa0\x5a\x76\x33\x46\x26\xe0\xa0\x1d\x51\x0a\x59\x5d\x91\x83\xe5\xf7\x84\x2a\xc5\xe7\x62\x9c\xc9\x18\xea\x72\x9f\xac\x43\x88\x16\x87\xaa\x5b\x64\xd3\x56\xbc\xf2\xc6\x89\x76\xdb\x74\xe9\xed\x6f\x81\x6c\xe1\x2a\xc2\xe7\xc1\x8f\xd6\xae\xe3\xe2\xe8\x03\x19\xb2\x94\x88\xf6\x83\x69\x4a\x05\x9d\xb3\xb1\xfd\xf8\xd8\x7f\x7c\xec\xbf\xb5\x0f\x98\xdb\x50\x2d\x34\x29\xb6\x6e\x0b\x71\xf8\x06\x4d\x96\xb1\x6f\x0f\x81\xf1\x7b\x1f\x79\x5a\xa4\x84\xa6\xb2\xc0\x10\xbd\x55\x70\xba\x40\x96\x5e\x00\xd6\x00\x28\xb5\x16\x52\x2d\xa1\x45\x76\x0a\xb9\x7b\xa2\x96\xad\x56\x16\xad\x6e\x96\xac\x0e\x16\xac\x9d\x2d\x57\xce\x48\xdd\x1e\x1f\x2f\x9d\xdd\xbc\x86\x91\x5c\x6c\xc5\xc8\xdc\xd7\xbb\x3f\x9f\x11\x3f\x0e\x57\x44\xa6\x5c\x6b\x6b\xd0\xa5\xe5\xb1\x1f\x11\xae\x2b\xd6\x4f\x7b\x16\xa0\xdf\x03\xb6\xc8\x60\x1f\x8d\x36\xc5\xc1\x8a\xee\xbc\x16\x23\xe4\xb2\x77\x1c\xab\x43\x50\x41\x78\x9a\x61\x30\x2b\xe0\xf4\xd8\xe9\x66\x36\xc8\x60\x38\x1f\xc3\xf9\x68\x7a\x49\x75\x91\x45\x42\x31\xa4\x8c\x60\xf4\xe2\x88\xc1\x6c\xd7\x78\x06\x22\x34\x11\x87\xcc\x59\x80\x20\x7a\x2e\xe6\xe4\x92\x81\x65\xe0\x8a\x69\x65\x63\x22\xe1\x0d\x9a\xb3\xd5\x14\x33\x67\x09\xf1\xa1\xb6\x74\x36\xab\x3e\x11\xb3\x2c\x91\xcb\x14\x24\xdb\x73\x1d\xca\x33\x5e\x74\x61\x69\x96\x50\xcd\xbc\x60\xb3\xd9\xda\xb0\x37\xe7\xeb\x92\xdf\xf5\xb8\x19\x5d\xed\xa2\x83\x5b\xc4\x04\x3f\xfd\x3c\xad\xd6\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\xcb\x7c\xab\xf6\x4a\x60\x2b\xa3\xfc\x7d\x67\x51\x75\x52\xc7\xda\x66\x4a\x3d\xfd\xdc\xa8\x0e\xcb\x6e\x9b\xff\x34\x64\x3c\x6d\x02\x75\xbb\xac\x85\xd6\x19\x0b\xad\xf6\xaf\x65\xe6\xd2\x90\xab\xd4\x81\xbf\xdc\x83\xf0\xb7\x75\x2f\xb5\x4c\x18\x4a\xae\xed\x74\xf7\xeb\xf2\x79\xdf\xff\x0c\xdd\xbb\xc1\x48\x0f\xe3\xa5\xb8\x76\x62\x8b\x39\x5b\xe5\xbc\x00\xb5\xb4\xa6\xd0\xec\x4c\x4b\x37\x2f\xb3\x71\x62\x49\xcc\x9e\x69\xdb\xf9\x2e\x68\x05\xa7\x73\x70\xfa\xfc\xd9\x63\xdb\x88\x81\xfc\xf4\x97\x20\xbe\xdd\xe7\xbf\x78\x0c\xf9\xb3\xfb\xd7\x5f\xf6\xcc\x5b\x68\xc7\xd8\x70\x4a\x1d\x04\x8c\x57\xf0\x02\xe1\x22\x06\x07\x93\x5d\x2a\x40\x00\xc7\x32\xf0\x81\x65\xb9\xfc\x17\x4c\xa4\xb2\x66\x2e\xf0\x44\x95\x0f\x2b\xeb\x32\x0b\xf4\x2a\x6b\x52\x28\x4f\x06\x23\xef\xa4\x2d\x4a\xc8\x46\xe4\x02\x6c\xa9\xe5\x1d\x38\x49\xef\x24\x96\x27\x5c\xeb\xcb\x0a\xe1\xb6\x95\x8b\x6c\x65\xf4\x15\x80\x7c\x53\x32\x79\x5c\x59\x85\xc9\x97\x18\x5c\xc9\x84\xdb\x04\x99\x1b\xb6\x2c\x99\x8d\x15\x21\x80\xe4\x8f\x4a\x2c\x71\xac\x00\x79\xc7\xff\xe7\x4c\x59\xe9\x94\x0b\xfc\x18\x0e\xed\xb6\x02\x46\x77\x00\x35\x92\x5d\x92\xe0\x67\xfa\x00\x57\x3b\x39\xa3\x02\xb3\xf7\x1d\x64\x0c\x4f\x25\x9b\xa5\x8b\x40\xa4\x78\xf5\x73\x41\x93\x6a\x12\x82\xbd\x65\x1f\x5a\xa1\xea\x77\x3c\x89\x23\x9a\xdb\x28\x2f\x38\xa3\x44\x49\xdc\x3d\xac\x8a\x17\x51\xe1\x4f\x7b\xb9\x47\xd8\x07\x91\x64\x34\xd7\x3c\x2a\x12\x9a\x13\x73\x16\xe6\x32\x6f\x95\x28\xb0\x15\xa2\x25\xd2\x5c\xb1\x48\x8a\xb8\x8b\x02\x70\x5d\x7f\xb7\xee\x6b\xcd\x58\xce\x6d\xb9\x3f\x9e\xb2\x3a\x92\x1e\x55\x6d\xda\x72\xe6\x4e\xb5\x3f\x62\x15\xcb\x47\x99\x93\xc9\x15\xe1\x58\x2f\xf4\x38\x20\x8f\xfe\x54\x4c\xc8\x57\x4b\x67\x66\x01\x93\x8b\xcd\xae\x50\x4c\xbb\x44\x18\x87\xb2\x16\xd8\xe5\x81\x9a\xc9\x1c\x92\x53\x8e\x62\x89\x19\x19\xb7\x3c\xd2\xc7\x13\xf2\xff\x58\x2e\x31\x83\x93\xcd\xb1\x7a\xa3\x45\x71\xaf\xb8\x42\xe3\x52\xf0\xe0\x3f\x23\x47\x58\x49\x93\xa7\x29\x8b\x39\xd5\x2c\x59\x1e\xa3\x1e\xeb\x6a\x71\xb6\xd9\xba\x36\x46\x83\xa0\xf0\xea\x97\x7f\xd8\xf0\x64\xd7\x1c\xaa\xef\x5c\x56\x4a\x09\x19\x8c\x21\xa8\x6d\xa1\xe7\x41\x72\x83\xb8\x19\xc6\x20\x94\x49\x9d\x8e\xcc\xf8\x0d\xfe\xbb\xc1\x03\x4a\x72\x36\x07\x2c\x47\xcc\xdd\x13\xc7\x31\x9a\xf2\xad\x2c\xc4\x7a\x93\x60\x65\xe1\x6f\xac\x12\xfe\x5d\xf0\xe2\xda\x2c\xc5\x07\x11\x13\x82\x99\x04\x26\x4a\x4a\xc0\x2e\x09\xec\xdc\x90\x07\x7c\xaa\x8c\x44\xd9\x3a\xc9\x5e\x33\x12\x61\x2e\x5b\xa2\xde\x7b\xc9\x5b\xf4\x1f\xea\x80\xcb\x10\x20\x6e\x01\x53\xcb\xdb\xd3\x96\x1c\x00\x7e\x22\x04\x4b\x04\x85\x6f\xb1\xd8\x45\xb1\x61\xae\x31\xbc\x4a\x0e\x5f\x1c\xf6\x42\x7c\x71\x39\xb9\xcc\xe8\x9c\x6e\xaf\x77\x5c\x55\x46\x6a\xaf\x92\x98\x69\x96\xa7\x50\x98\x76\x21\xef\xf0\x77\x64\x5b\x99\x7d\x8a\xd9\x9a\xbe\x66\xb5\x0b\xa9\x80\x2b\x55\x93\x18\xe1\xfc\x82\x63\xf4\x8e\x2e\x09\xcd\x65\x21\x62\x2b\x35\x79\x02\xfa\xb6\xf6\xe1\x77\x52\x00\xa5\x28\x94\x81\xd5\x75\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x52\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xd1\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xc7\x55\x11\x04\x1e\x69\xb3\xa0\xed\xf1\x20\xaa\x98\xee\x79\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x43\xb5\xe1\xc8\x55\x93\x3b\xc9\x11\x3e\x69\x24\x36\x29\xf5\xc6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\xf4\x96\x29\xa2\x78\xca\x13\x9a\x27\x90\x2b\x78\x85\xf3\x83\x66\xec\x8d\x19\xe8\xdd\xb2\x9b\xc3\x99\x04\xc3\x6d\x05\xb5\x9b\x87\x81\x13\xd0\x08\x37\x2f\x2c\x02\xee\x2a\x87\x7f\x8c\x92\x42\xf1\xdb\x7d\x4f\x93\xcd\x7e\xd8\x81\x55\xd7\xb9\x74\x26\xe3\xab\x8c\x45\x0f\xc9\xa3\xab\x1a\x86\x21\x55\xb1\xdb\x74\xe0\xc9\xa8\xec\x53\x6c\xac\x3f\x65\x84\x46\x11\x53\xca\xc5\x54\x2e\xc3\x38\x4f\xbf\x86\x4f\xa5\xa0\x00\xbd\x53\xaf\x12\xaa\x34\x8f\xbe\x4a\x64\x74\x73\xa5\x65\xde\x29\x67\xbf\xe9\xfd\x5a\x19\x86\xd3\xef\xaf\xc8\x19\x57\x37\x41\x36\x81\x75\x9a\x86\xe6\x12\x4a\x6e\x8a\x29\x4b\x98\x3e\x3c\x54\xc8\xe5\x52\x1a\x2d\xb8\x60\x8e\xc1\x09\x9f\x92\x62\x15\x3e\x03\xe5\xae\x3e\x53\x9b\xf8\x74\x62\xf1\xf5\x37\xf4\x4e\x31\x9c\xfe\xd4\x4c\xdf\xfc\xcc\xda\x64\xa4\xf7\xea\xa7\xc0\xc9\x9c\x9f\xf5\xe4\x83\x98\xa9\x6b\x33\xc7\x6e\xc6\xed\x43\x7c\xcb\xa9\x0e\x33\x9e\x30\xdb\x7d\xc0\x2c\xd8\xc5\xa8\xd9\x53\x01\xfb\xb7\x94\x05\xb9\xa3\xa8\x23\x03\x45\x9c\x90\x6b\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa4\x69\x96\x30\xf5\x82\x1c\xb0\x8f\xfa\x0f\x07\x23\x72\xf0\x71\xa6\xcc\xff\x84\x9e\xa9\x83\x09\x39\x4f\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\x38\x9f\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x27\x31\xbb\x3d\x51\x31\x7d\x3e\x82\xcf\x28\x1b\x08\x58\x9d\x13\x55\xe4\xe0\xf9\xc1\x84\x5c\x39\x46\x3c\x0a\xe7\x58\x3e\x37\x93\xb9\x1f\x10\xec\xec\xcf\x0e\xc8\x91\xcc\x61\xe4\x88\x0a\x92\x30\x7a\x6b\x6d\xcb\x78\xdc\x96\xa8\xee\x1e\xb7\x4e\x88\x6c\x9b\x1b\xd6\xbe\xf3\x4a\x5b\x21\x75\x75\x13\xdd\x7b\xce\x04\x90\x17\x36\x57\x60\x26\x73\x5b\x07\xc4\x3f\xa2\x98\x86\xa3\xc7\x45\x45\x85\x7e\x04\x02\x4b\x3a\xa6\xd2\x3b\xea\xd9\x15\x3a\xee\x3d\xd0\x81\x04\xff\xb9\x60\xe4\xfc\xcc\x27\xd4\xb3\x5c\x71\xa5\xcd\x31\x8e\x2b\xac\x8b\x23\x3f\x3b\x3a\x4d\xe9\x3f\xa4\x20\xaf\xbe\xba\xb2\x13\x38\x7e\x54\x50\x6d\xa5\x06\xf4\x1f\x45\xce\x0c\x17\xee\xc0\xdc\xfd\x3b\x75\x86\x6e\xee\x93\x33\xaa\x29\xf2\x75\x1b\x69\x25\x4a\x52\x6e\x58\xf6\x94\x8b\xd8\xfe\x14\x30\xec\x87\xe6\xad\x66\xf7\xde\x6d\x12\x93\xc2\x07\xbf\xbd\x3c\xef\x89\x07\x47\x40\xcc\xe7\x6f\x65\xdc\x99\x11\x07\xaf\x3a\xe2\xfb\xdf\x06\xa6\x2f\xf1\x3e\x49\xcd\x98\xc4\x68\xef\x23\x72\xc9\x68\x4c\xcc\xf9\xb5\xff\xfc\xde\xe8\x9e\xad\x69\x55\x2b\x16\xe2\x00\xd8\x71\x19\xee\x35\xb7\x84\x30\xd2\x3d\x36\x98\x03\xc7\xca\xf2\x92\x69\x22\xa7\xc4\x1e\x87\xbe\xe7\xfe\xed\xe5\xf9\x0e\x53\xff\xf6\xf2\xdc\xcd\xdc\xfc\x53\xce\x1e\x6e\xd2\x3b\x89\x6f\xa5\xf4\xf6\xba\x26\x6e\x95\x2c\xb9\x4c\xdc\xa8\x8b\x64\xed\xe5\xb1\x49\x5f\x92\x58\x9f\x10\xbb\xe1\xa2\x45\x16\x6e\xf5\x94\x99\x77\x8c\x42\x81\xb1\x6a\x81\x1f\xf1\x6a\x41\x21\xf5\xd9\x27\xe4\xc1\x3e\x9b\x8d\x57\x86\x2b\xb8\x1d\x37\x4a\x20\xd0\x36\x72\xc6\xd0\xcb\x19\xbf\x70\xb1\x03\xfe\x8d\xe6\x17\xde\x42\xa4\x66\x6c\xe9\x2b\xc1\xc0\xcd\x38\x40\xb0\x23\xb4\x2a\x09\xff\x13\xbd\xa5\x3c\xa1\x53\x9e\x70\x28\xa5\x6e\xb4\xfb\x30\x1a\x55\xc1\x94\x7b\x3d\xf5\x3b\x8a\x1c\x5e\x9c\x58\x31\x6e\x91\x23\xf3\xdb\x09\x18\xc7\x8e\x27\x40\xad\xe0\x41\xa8\xd1\x58\x13\x4a\x2e\xb7\x09\x25\xbd\xc9\x0f\xb0\x03\xe6\xc4\x74\xe5\x8a\xe6\x9d\x46\xae\x08\x3f\x5c\xd9\x7a\x72\x4f\x99\x31\x62\xae\x55\x2b\xd6\x08\xf8\xb5\xf5\xc9\xf6\xcc\x71\x5f\xe4\x8a\x3f\x0d\xe4\x22\x3e\xa3\x6d\x07\xfe\x59\xbe\xe8\xf8\x10\x28\x49\x10\x71\x66\xb3\xdd\x2a\xa1\x99\x88\x7d\x57\x96\xd6\xd8\x12\x4c\xc8\x75\x0d\xce\xb5\xe9\x8b\xd6\xa5\x68\x83\xc3\x88\xae\xab\x72\xef\xb9\x45\x21\x09\x84\xdb\xa4\x05\x2e\xb6\x9e\x64\xc4\xb2\xc5\xac\x8b\x4b\xdc\xbc\xf0\xfa\xaa\x6a\x09\x7c\xc9\xb2\x05\x79\x7d\xd5\x70\x8c\x01\xf6\x30\x6b\x85\xf6\xc1\x43\x45\x12\x3e\x63\x9a\x6f\x59\xc2\x3d\x1c\xe4\x54\x0a\xae\x65\xbe\x3e\x05\x9a\x74\x3a\x9c\x6e\xb8\xae\x0c\xd5\xbd\x67\x76\xb6\x2c\x20\xf2\x36\xb8\x4b\x49\x24\x93\x84\x45\xda\x96\xb4\x02\xf0\xfa\xd7\x1a\x94\x27\x66\xed\x01\x93\x9b\x3f\x81\xfa\x64\x15\xa5\x13\xdc\xdc\x93\xcb\x57\xa7\x67\x6f\x5f\x4d\xd2\xf8\x37\x0b\x79\x37\xd6\x72\x5c\x28\x36\xe6\x2d\x2a\x94\x3c\x5e\xf4\x22\x5e\x59\xab\x82\x59\x75\x83\x0c\xd6\xfa\x7a\xef\xf2\x27\xc9\xb7\x0a\xa3\x16\xc0\x76\xe4\x7c\x52\x52\xea\x11\xc9\xa9\xcd\x91\xa4\xd6\xf4\x54\x24\x09\x42\x5b\xe7\x8c\x8d\x42\x5b\xcc\xc6\xd4\x90\xce\x0b\xdb\xdb\x50\x51\x59\xe0\xfd\xca\x10\x0f\x8f\x70\x5d\x38\xc6\x76\x99\x64\x15\x8a\xe5\x9b\x55\x38\x5e\x55\xee\xa3\xe1\x4c\x2f\x0c\x54\x6f\xd8\x92\x40\x20\xf0\x4c\xe6\x06\x9f\xf2\x2a\x6e\x30\x1d\xc1\xd2\x4f\x0a\xc5\xf2\x89\x65\x3b\x0f\x0e\xb6\x0e\x55\x84\x76\x28\xde\xe6\x5f\x6c\x82\x99\xbd\x5d\x56\xf6\xb5\xf2\x1a\x2d\xf4\x82\x09\x6d\xc4\x7e\x43\xcb\x2c\x64\x1a\x81\x68\xe3\xb0\x1f\x1c\x6a\x2d\x8b\x18\x75\x2b\x39\x34\x94\xe9\xe9\x82\x93\xe6\xd4\x74\x45\x47\xf3\x0e\x24\x22\x86\x64\xde\xe7\x72\xe5\x34\x96\x10\xb0\x81\x15\xe8\x2a\x88\x46\xe3\x94\x8b\x27\x78\x3a\x23\x2e\xe2\x6d\x70\xa8\x19\xc0\xe0\x8d\xaa\x28\x66\xef\x59\x83\xbe\xf7\x1b\x52\xa7\x49\x61\xc2\xbb\xf5\x20\x56\xfd\x87\xad\x0e\x5f\xba\x54\x3f\x27\x63\xfc\xca\x38\x8b\x4b\xa8\x0c\xce\xc0\x55\x0f\x5e\xbf\x26\xa5\x07\x70\xf1\xf5\xb4\xdb\xe4\x81\xa5\xa1\xfb\xd5\x73\x1f\x04\x50\x5d\x64\x9e\x7d\xb9\x77\x49\x33\xa1\xf1\xbe\x72\xc9\x67\x58\xd9\x0c\xce\xa8\xd3\x97\xa1\x21\x3f\xcd\x69\xca\x34\xcb\x31\x04\xce\x06\xd5\x09\x9b\x9d\xf0\x3e\x63\xe2\x4a\xd3\xe8\xa6\xef\x52\xa8\x03\xc7\xbd\x3f\x8e\xbb\xb7\x2b\xd0\x21\x82\xad\x8b\xb4\x0c\xbd\xc8\x5c\x58\x2e\xf4\x44\x48\x8c\x2f\x47\xd6\xc5\xca\xe1\xcb\x51\x55\xb9\x6b\x59\x9e\x0c\x0d\x1b\x10\xe9\xe6\xeb\xeb\x41\x04\x3f\x42\xa1\x1f\x6e\xd8\xfe\x0c\x58\x12\xb8\x8b\x1f\x2d\x78\xb5\x4a\x1d\x52\x73\x67\xca\x75\x79\xee\x15\xd3\x24\x63\x79\xca\x6d\x5a\xb7\x14\x24\xb2\x69\x01\xc0\xd7\x0c\x0f\xb3\xc3\x05\x3c\x4f\x10\x19\x69\x6a\x73\x66\xc8\x94\xe9\x3b\xc6\x04\x79\xf6\xec\xd9\x33\x90\x4b\x9e\xfd\xf1\x8f\x7f\x24\x50\x47\x22\x66\x11\x4f\x57\x1f\x84\xa7\xfe\xe3\xf9\xf3\x09\xf9\xbf\xa7\x6f\xdf\x40\x54\x59\xa6\x15\x99\x4a\xbd\xb0\x23\x9b\x07\x2a\x2f\xab\x11\xf9\x9f\xab\xf7\xef\x9c\x38\xa1\x6a\xbf\x82\x0a\xe2\x97\x57\x0d\x11\x7c\xf6\xe5\x1f\xfe\x30\x21\x67\x3c\x87\x7c\x62\x0e\x19\x10\x3e\x08\x32\x73\x81\x81\xd0\x78\xa8\x9e\xc1\x6f\x39\x88\x0d\x12\x4e\xf9\x7c\x01\x00\x30\x07\x42\x8a\x59\xc2\x23\x8d\x35\x05\xf1\xe8\x23\xa0\x6d\x5f\x24\x6a\xd3\xbd\xac\x14\x01\x93\x1b\x91\x84\xdf\x30\x32\x53\x5f\xe7\xb2\xc8\xca\x34\xc7\x9c\x29\x23\xcb\x46\x54\x40\x56\x09\x0c\x56\xee\x95\x62\xfa\x51\x83\x30\x5a\x1a\x82\x2a\x38\x08\xef\xd4\x04\x94\x91\xaf\xad\x36\x46\x7c\xc8\x28\xf7\x81\x83\xe0\x53\xaf\x54\xf6\xf7\xba\x67\x1c\xd4\x92\x73\xb9\x2b\x59\x2e\xff\x8e\x5b\xc5\x85\xcb\x82\xb2\x12\xb2\xb2\x32\x99\x4d\x3a\x15\x81\xcd\xd5\x65\xe5\x1b\x5e\x68\x33\xfe\x83\xfc\xa9\xf3\x59\x98\x68\x07\x69\xe9\xd8\x5e\xad\x52\xf8\xb2\xe1\xcb\x65\xb1\x76\x83\x4d\x0a\xf7\xb5\x10\x2b\x6f\xdb\x3e\x2a\x96\xfc\xd8\xee\x3a\x36\x85\xad\x1c\x03\x43\x71\x6d\x02\x50\xd0\xb3\xa9\x52\x8c\xae\x12\xe5\xa3\x98\x2e\x2c\x68\x20\xf2\xca\x7c\x9b\x29\x65\xf3\x88\x52\x9a\xdf\x18\x25\xc1\x52\x81\x09\x44\x3d\x2b\x9f\xc3\x84\x09\x65\xb7\x68\x2c\x4f\xe9\xb2\x92\x35\x60\x3e\x72\x38\x99\x1c\xe2\x31\x91\x39\xd6\xf2\x44\x9c\x37\xf7\x1f\x29\x5f\xba\x1a\x95\x4e\x33\x6c\xbb\x07\xf6\x1c\xdb\xb6\x84\x56\xa2\x9d\xa9\x85\x54\x9b\x0a\xbe\x1d\xdb\x16\x76\xeb\x8f\xdb\xbe\x2f\xee\x18\x16\xd0\xe2\xd1\xae\x3d\x70\x3b\xf4\xbe\x5d\x57\xad\xc1\xc2\xd8\x9e\x84\xb6\x1d\x21\x3b\xd7\x02\x4f\x5b\xb1\xbe\x86\xa9\x1e\xa6\x96\xf3\xbd\xef\xc6\xf9\x6c\xbe\x5e\xa5\x39\xd8\xd3\x67\x75\xe7\x33\xcc\x74\xa9\x92\x2e\x4b\x1a\x42\x51\xc0\x37\xe2\x2a\xd3\x5e\x9e\x34\x47\x0b\xd1\xa6\x5b\xe1\xf9\x2e\xdc\x0d\xaf\x76\x8e\x09\xbc\x2a\xb8\xe6\xbc\x13\xb8\x68\x4b\x4a\xb3\x4a\x83\x8f\x04\xed\x06\x20\x63\xba\xc3\x33\x21\x6f\x2d\xa9\x45\x24\xa3\x53\x25\x93\x42\xe3\xab\xe5\x8f\x21\x1d\x86\x41\x5d\x95\x05\x20\xbe\xfe\xb1\x80\x2a\xeb\xb2\xc5\x59\x3b\x02\x8d\x57\x87\xc3\x39\x54\xfb\xbc\xc7\x6a\x9f\xbe\x3e\xad\x6a\xd9\xaf\x49\xdd\x5b\x79\xdd\x48\xf1\x2e\xfa\x95\xe2\xe4\xa8\x6c\x13\xe2\xdc\xf1\xe7\x42\xb3\x7c\x46\x23\x76\x1c\xea\x5d\xbe\x1d\x8b\x0f\x11\x72\x79\x11\x0b\x2a\xe2\x04\x05\xf0\x88\xe5\x80\xfb\xec\xa3\x66\xb9\x01\xc9\xcb\xab\x73\x12\xe7\xfc\x96\xe5\x8a\x1c\x7d\xc5\x8c\xbc\xc8\xa8\x2e\x72\xd6\x2a\xbb\xaa\xdf\xd8\x4a\x98\x46\x5f\x9a\x1e\x0c\xd6\x35\x54\x0f\x5e\x72\x94\x47\x04\xe7\xab\x04\x13\x42\x15\x41\xaa\x42\x5d\x76\x62\x50\x09\x08\x34\xd0\x8c\xa5\x2c\x72\x6b\x45\x77\x75\x55\x23\x99\x1b\x75\x09\x07\xa6\x8a\xe4\x6c\x6e\xa4\xd9\xdc\x35\x1b\x66\x24\x4a\x0a\x73\xa3\xd7\x70\xb6\x7d\x02\x00\x4b\xd3\xec\xa6\x58\xbd\x99\x95\xaa\xe5\x2d\x8f\x1d\xab\xc4\xde\xc7\xbe\xab\x61\x46\x55\x90\x6a\x13\x54\xa0\x0f\x00\x8b\x32\x3a\x30\x54\x9f\xc4\x5a\x09\xf6\x0f\x8d\xc2\x12\x6a\x5b\xb4\x68\x1f\xd1\x85\x08\xcb\x98\x5d\x14\xd3\x84\xab\xc5\xd5\x8e\x26\xc4\xa6\x21\x30\x58\x61\xc5\xeb\xb7\xd6\x92\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xe9\x72\x23\x47\x49\x00\xa2\x7b\x3b\x44\x48\x09\xd9\x1f\x09\xb3\x15\x0c\xcc\x4f\xef\xca\x79\xd8\xa4\x34\xac\x59\x12\xb3\x6f\x45\x56\xb9\x1f\xd1\x24\x51\xf5\x84\x5d\x47\x31\x51\xf6\x70\x89\x6a\xb8\xa7\xdc\x6c\xb7\xef\x8c\x52\xab\x7e\xb9\x76\x61\x8a\xa4\x12\xd3\x78\x04\x91\xc2\x3d\x04\xa5\x57\xdc\x0b\x41\x22\x23\xa4\x2b\x03\xca\xf4\xdc\x3a\x72\x30\x97\xde\x9f\xb9\x74\xdf\x38\xbc\xb0\xdf\x7b\x99\x0d\x5d\x29\x4b\xea\x49\xa9\x23\xb9\x5b\x82\x3a\x7a\x75\x2b\xe0\x37\x4f\xb5\xce\xf9\xb4\xd0\xdd\xeb\xbd\xd5\x5e\x07\x36\x6d\x14\x11\x38\xc5\x63\xbb\xfa\x28\x40\x51\xab\x21\xf8\xb3\xb0\x7a\xf6\x4b\x9e\x03\xec\x06\x6f\x1e\x2a\x12\xcb\xa8\xf0\x75\x61\x01\x68\xa5\x03\xad\x4d\xf5\x44\xd2\xf5\x5c\x75\x2f\xe9\x15\x7e\x64\x2b\x7a\xc5\xf2\x4e\xdc\xd1\x3c\x3e\xbd\xd8\x12\x7d\x5f\x65\xe7\xe5\x5b\xa1\xa0\xe4\x6e\x43\x17\x40\x3a\x95\x85\x2e\x4b\x87\xfe\x72\xec\xd5\x4d\x6a\xba\x96\x86\x34\xb4\xb4\x47\x77\x55\xf4\x07\x13\xf7\x60\xe2\xae\x5c\xbb\x98\xb8\xcf\xd1\xc4\x1d\xd6\xc1\xad\x1c\x57\x57\x5e\x81\x27\x6d\x63\x7b\xef\xd3\x4a\x7a\x56\x12\x18\x94\xa6\xea\x71\xfc\x35\x01\x0e\x8f\x48\xb9\xb7\x81\xd0\xe7\x28\x10\xf0\xec\xc7\xb7\xa8\xde\x93\x9d\xb4\x7d\x9f\x62\xbc\xd6\x35\x12\xdc\xd4\xb7\x18\xa4\x86\xa0\xd1\xf0\xc8\x56\x81\x1e\x59\xbd\x4b\xc4\x65\x0b\x3f\x2c\x42\xdd\xa1\x4d\x29\x5e\x1d\x81\x4f\x3a\x6f\x00\xe9\xd8\x44\x18\xaf\xae\xbb\x41\x76\x68\x28\x8c\xd7\x23\xb7\x15\xc6\xab\xb3\xed\x9b\x74\x6f\x31\xdc\xb0\xdc\xfb\x6d\x34\xbc\xe3\xd2\x76\x37\xeb\xef\x6a\xce\x1f\x95\xed\xed\x9e\x3e\x5b\x1f\xcc\xf9\x2b\xd7\x03\x9a\xf3\x03\xc2\xed\x88\x41\x83\x69\x3f\x34\xb7\x39\xfb\xfe\x94\x39\xb1\x72\x52\x56\x5f\x33\x28\xe7\x2c\xfb\x32\xaf\xba\x55\x0f\x27\x93\xc3\x43\x67\xef\xb7\xf8\x59\xe8\xd9\xf8\x4f\x84\x89\x48\xc6\xb8\xa9\x66\xfc\x5c\x69\x60\xfa\xa5\x9a\x1e\xce\x25\x75\xdf\x0a\x5d\xb3\x30\x76\xb7\x2d\xe9\x70\x82\xbb\xb7\x0d\x6f\x82\xf4\x43\x34\x0f\x0f\x5b\x84\x57\x3b\x82\xe3\x13\xfb\xb4\x01\x0f\x81\x77\xef\xfc\xb5\x75\x63\x70\xbc\x76\x61\xaf\x3b\x34\x09\xc7\xeb\x81\x5b\x85\xe3\xb5\x13\x47\xed\xd4\x36\xbc\x61\x71\x0f\xd7\x3c\x1c\xaf\x27\xda\x48\xa6\x7a\x75\x6a\x24\x8e\xd7\x6e\xed\xc4\xab\xef\x76\xdc\xfa\x5e\x5a\x8b\xe3\xd5\xad\xc1\x38\x5e\x7d\xb7\x19\xc7\xab\x25\x24\xc0\x18\x7e\xc6\x3b\xa5\x22\xb8\x77\xaa\xe1\x92\x9a\xa5\x99\xcc\x69\xbe\x24\xb1\xb5\x35\x2c\x1b\x32\x42\x83\x94\xd0\xbd\x4b\xc3\xc0\x3c\x62\x9e\xf7\x94\x8d\xd0\x21\x1b\x94\xc5\xbc\x58\xdb\xae\x79\x1d\xd8\xf0\xad\x10\x68\x77\x50\x0d\xcc\x56\x12\x73\xee\x4e\xfb\x98\x2b\xac\x48\xa3\x1b\xdb\x31\xc8\x41\x15\x79\x7f\x90\xe4\x72\x70\x50\xab\x03\x0d\xe6\x31\xf0\xfd\xd9\xce\x88\xee\x61\x1c\xbb\x62\xca\x42\x6f\x88\x0d\x0b\x38\xb2\x0f\x1e\x1b\x89\xe4\x2d\xb0\xc1\x07\xda\x25\xd2\x31\xb3\x8d\xff\x83\x41\xbb\xb1\xce\xb1\xf1\xee\x45\x5f\x0e\x5a\x82\x64\xee\xfb\xa2\x25\x32\x0a\x7c\xcf\x15\x0e\x05\xdb\xf0\xca\x21\xbf\xb3\xdd\x9b\xcd\x30\xa3\xa2\x7c\x01\x46\x9f\x44\xa1\x5f\x8f\x47\x50\xda\x12\xa4\x78\x00\xa6\xdf\x80\xeb\xa0\x4b\x60\xa1\xcc\x97\xa0\xf2\x7c\xf0\x4c\xf9\xa1\x3b\x57\x61\x53\x07\x8d\xdc\xaa\xba\x87\xf9\xe5\xca\xaf\xac\xd4\xdb\x20\x05\xc2\x09\xea\xaa\x00\x31\xd1\x7e\xc5\x8a\x4b\x72\x06\xbe\xab\xb2\x2d\x9a\x2f\xee\xb8\x82\x66\x82\x27\x55\x3c\x73\xb5\xec\xfc\xc2\x0b\x61\x03\x0d\x56\x90\xa6\x19\x67\x0a\xc5\xf2\xf1\xbc\xe0\xf1\x2e\xd8\xf2\x84\x19\x60\x6b\xb6\xd7\x9d\xd9\x75\x64\x71\x7b\x30\x36\x1f\x88\xd1\x81\x35\x1c\x94\xd1\x1b\x15\xde\x10\x96\xc5\xab\x46\x72\x50\x17\x2c\xe0\x8f\x9c\x73\x09\x5d\x7b\xd5\xd6\xf2\x8c\x68\x19\xd9\x64\x5d\x5e\x29\x77\x89\xc3\x22\xe6\x41\x60\xeb\xd8\xfc\xc7\xa9\xc0\xce\x9e\x3f\x65\x33\x59\x76\x48\x41\x8d\xc8\x86\xe3\xc6\x2c\x61\xd0\x46\xde\xb5\xa8\x37\x0f\x80\x4b\x38\x95\xb7\x06\x99\x3f\x08\xf2\xad\xab\xd9\xcf\x67\x2f\x08\x3d\xae\xa4\x40\xd8\xae\x33\x82\xb1\x18\x63\x74\x93\xf2\x3b\x79\x21\xd4\x88\x4c\x8f\x5d\x3c\x0a\x9c\x38\x61\xc4\xc2\xc4\x49\xbc\xa8\x57\xe7\xcc\x00\x00\xd2\x8e\x73\x99\x12\x25\x68\xa6\x16\x52\x83\x6a\x48\x33\x1a\x71\xbd\x24\x3a\xa7\xd1\x0d\xb4\x28\xca\x99\xfd\xdc\x88\x44\xc7\x36\xb0\x2b\x04\x5f\x35\x6c\x58\x2f\x72\x59\xcc\x17\x10\x09\x8b\x4f\x45\x09\x55\x6e\xf5\x8d\xef\x5b\x6d\x47\x91\x78\x29\x68\xca\x23\x5f\x35\x30\x97\xb7\x5c\x71\x69\xad\xbd\x6e\xdc\x0b\x5f\x19\x0e\x2d\xc8\x2f\x13\xca\x53\x72\xa4\x18\x23\xaf\x1c\x4a\xe0\x2f\xb6\x8d\x3d\x5a\x36\xf2\x6a\x70\x80\xf4\x25\xcd\x85\x2d\x88\x50\x12\x38\xef\xbc\x42\x86\x69\x66\xde\xf8\xd1\x63\xbf\x5d\xcd\x73\x92\x39\x38\xee\x5d\xe9\x4e\x26\x62\x19\x78\x2d\x4f\x2f\xce\x55\xa8\x8d\x20\x6e\xd9\xba\x77\xf0\x43\x22\xc5\x3c\x2c\x23\x50\x62\xa6\x21\xa5\x02\xda\xbb\xdc\xf2\xb8\xa0\x09\x12\x51\x3b\x99\x97\x57\xe7\xf8\x3a\x9f\x2f\xf4\xf8\x8e\x81\x35\x06\x79\x4d\x79\x66\xdc\x47\xf9\x4a\xb4\x0e\x57\x40\x74\xb5\xb5\x26\xa0\x65\xcb\x4c\xed\x8e\x2e\xa1\x6c\x8d\x0d\x31\xa9\x38\x4c\x5d\x61\x31\x1c\xa2\x09\xe2\x30\xbd\x53\xdf\xae\xc3\x88\x0d\x60\xae\x32\x20\x06\x4c\x5d\x9d\x9b\x01\x7c\x50\x07\xd0\xdf\xb6\x9d\xd9\xa8\xd9\x20\x23\xdc\x6d\xd6\x65\xee\x41\x28\xbb\x2d\x37\xf9\xda\xb6\x4e\xec\x28\x1c\x1c\x7c\x1f\x98\xcd\x02\x47\x87\x39\x36\x54\xc4\x63\x9a\x18\xcc\xb9\xf8\xee\xa5\x8d\x70\xc6\x83\x50\x71\xe4\xbb\x2e\x48\x5c\xf8\xb2\xd9\x46\x66\x68\x3c\x02\x90\x07\x3f\x65\x31\x10\x8d\xb0\x61\xe4\x9d\xd1\x90\xed\xe6\x5d\x7c\xf7\x72\x44\xf8\x84\x4d\xdc\x5f\xfe\x51\x47\xb5\xb4\x9c\x63\x18\xa0\x8f\xf1\x04\xbc\x83\xa9\x84\xc6\xa8\xf0\xdd\x9f\xfe\x6c\x26\x69\x7e\xfd\xcb\xf8\xcf\x41\xb5\xd1\xbf\xfc\x64\x88\x60\x6e\x1e\xa8\xde\x0d\x63\xc9\x7c\xd5\xfd\x9f\x2e\x6c\x55\x6a\x5b\xb3\xfa\x27\xdb\x8c\x8b\x09\x6d\xe4\xc6\x0b\x09\x5e\x7a\x1e\x23\x36\xc2\xb7\x73\xf6\x77\x67\x58\x04\x30\x79\xa3\x4e\x44\x35\x13\x40\xa8\x5d\x52\x86\x90\x1a\x5f\xb7\x7d\x67\xcd\xfc\x8f\xc0\x24\x80\x49\x65\x23\xa2\xa5\x84\xe3\x88\x47\xfe\x54\x10\xe6\x7a\x75\xe2\x5a\x01\x1c\xd4\x06\xaa\x39\xde\x63\x86\x35\x10\xf6\x29\xb8\x66\x1e\x30\xb7\xcf\x85\xd4\x9f\xfb\xed\xaf\x75\x11\xa7\xb7\x92\xbb\x02\xe4\xe6\xa4\x08\xec\xe8\xe8\x4b\x62\x4f\x97\x24\xe5\x4a\xd3\x1b\x36\x21\x57\x86\xb7\x84\xde\x30\x84\x9e\x20\x50\xc1\x92\xc5\xa4\x10\x9a\x27\xf0\x6b\x39\x8e\x99\x72\xc8\x73\xce\x67\x44\x15\xd0\xde\x3c\xcb\xd9\xd8\x71\x31\xfb\xd4\x0a\x2d\x28\xd7\x32\xf2\x9b\xbd\xa0\xa8\x0b\x64\x31\xbc\x0a\xf0\xa0\xc2\xa2\xd7\x4a\x1c\x97\x99\xa7\x14\x51\xc9\xb9\x00\x98\x6a\x42\xde\x01\xb3\x4a\x9c\x4b\x18\xd5\x12\x6b\xc0\x14\x2c\x62\x4a\xd1\x7c\x39\x82\xc2\xee\xdc\x17\x03\xb7\xa1\x3b\xc0\x51\x53\x2a\xb0\xac\x7a\xce\x22\x29\x94\xce\x8b\x48\x63\x9f\xbd\x69\x2e\x6f\x98\xf0\xe1\x82\x66\x17\xab\x01\x5c\x65\xfc\x0c\xf8\xbb\x24\x89\x16\x54\xcc\x83\x3e\x35\x29\x8d\x01\xf6\xdf\x78\x29\xc7\xad\xc7\x40\x80\xce\x8c\x60\xc1\x35\x80\x62\x6a\xf8\x88\x37\xc3\x7e\x10\xbe\x1e\xcf\xa8\xb4\x93\x9a\x25\xf1\x64\x0b\xed\xea\x44\xbf\x48\x47\xa3\xde\x18\xd8\x76\xcf\x01\x60\x29\xd3\x34\xa6\x9a\xee\x10\x04\xf6\xb6\x6c\xae\xe7\xfa\xeb\x63\x83\x53\xef\x98\xb4\x7c\xc8\x89\x5b\x32\xe3\x61\xfe\x13\x9c\xc4\x85\x83\x3c\x64\x5c\x6b\x83\x53\xd6\x51\x80\xb1\x5d\x20\xcf\xb8\xee\x65\x66\x78\x37\x1a\x92\x8b\xb2\x35\x63\x49\x4e\xda\xb9\xa1\x3a\x5a\x60\x0d\xe8\x77\x80\xd1\x75\xe9\x2b\x8b\xaa\xf1\x5d\x8d\x22\x08\x72\x09\x26\x34\xcf\x59\x98\x6e\x66\x41\x57\x08\x44\xf2\x1a\x10\x01\xca\x73\xa6\x55\x19\xa1\x82\x74\xd8\x10\x17\xcb\xef\xac\x32\x0a\x44\xda\x02\xd6\xea\x73\xcd\xb2\x10\x82\x5d\x49\x4b\x67\x0d\xe5\xbf\x17\xb8\xee\x62\x74\xc6\x76\x02\x6f\x65\xdc\xc5\x4e\x5d\xab\xc2\x5f\x0e\x51\xc6\x6f\x62\x24\xae\x02\xa5\x1e\x1f\x00\x6f\x95\xaa\x24\xcd\x21\x91\x5b\xd0\xdb\xdd\x8d\x54\xa5\x8c\x34\xf6\xa5\x8c\xe1\x73\x63\xf8\xdc\xf8\x79\x7b\x63\x5e\x97\x08\x10\x77\xb5\x8e\x04\xa9\x7e\xa4\x93\xe5\xd4\x90\x94\xab\x8e\xe6\xce\x5a\x36\xb2\x1f\xc1\xd2\x7c\xeb\x45\xf4\x9e\x5b\x9b\xe9\xc0\xb8\xa1\x16\x2f\xc8\xe7\x15\x2e\x6f\xa5\x29\xaf\x29\x61\xa4\xee\x91\x53\x9d\x26\x76\x2b\x5c\xf2\x79\xf5\xf1\xe3\xda\x60\x20\x5e\x34\x6b\x14\x2e\x22\xd8\x8b\x7c\x46\x3c\xcb\xc1\x78\xe6\xf2\x0f\x0c\x7a\xe5\x32\x49\x58\x0e\x4b\xb0\xda\x53\xcd\x8b\x0e\xb5\x4c\xd1\xa6\x3b\xf2\x2a\xaa\x97\x31\x05\xbb\xf3\xc2\x04\x55\x58\xba\xc5\x79\xbc\x98\x6d\x9c\xb7\x76\x3c\x1f\xb5\x7c\x2a\x96\x38\xf5\xb3\x00\xb4\xa8\x7a\x92\xb9\xf9\x90\x91\x3a\x05\x9d\x26\xe8\x3d\xf6\xcc\x16\xe6\x42\x93\x3b\xba\x54\x80\xf7\xa5\x34\xef\xbf\x6f\xab\xaa\x95\x03\x5f\xb2\x19\xbe\xdd\xda\x23\xb6\x93\x4f\x6c\x17\xaf\x18\xa4\x53\x72\xd1\x26\x04\xa9\x7c\x61\x63\xe3\x90\xfa\xb5\x8b\x1b\x0d\xe2\x54\xc0\x7d\xde\xcd\x27\x52\xed\x53\x7e\x71\x0e\x43\x38\x99\x7c\x0e\x7f\x38\x8e\xe3\x9d\x06\x53\x66\xb0\xba\x4c\x94\x06\x0c\x09\xdf\x6d\x88\x24\x28\x51\xeb\x1b\xa8\xc6\x6a\xad\xc4\xbe\xd3\x58\xce\x20\x12\x04\xbe\x38\x81\x76\x04\x54\x2c\x2d\x27\xd7\x0b\x9e\xc7\xe3\x8c\xe6\x7a\x89\xea\xe3\xa8\xf2\x35\x1f\x5e\xdf\x69\xe1\x3b\xba\x73\xda\x95\x3e\x5e\x0b\x61\x58\xbc\x33\x0f\x5b\xeb\xfc\x5a\xb8\x3e\xc4\x7a\xda\x07\xf0\x37\xae\x27\x2c\x2d\xea\x34\xc2\x47\x5b\x4f\x1c\x92\x8f\xfd\xf9\x86\xa1\x41\xaa\xea\x7a\x45\x36\x10\xb6\xae\x92\x61\x14\xb4\xe7\xf2\xa0\x10\x99\x91\x46\x46\x0f\xa5\x65\xaf\xf1\xc0\xb0\x67\x25\x05\x17\x43\x63\x3b\x1d\x89\xa5\x35\xdd\x84\xdf\x0a\x07\xf0\xa7\x84\x1c\x09\x29\xf0\xe4\xe0\xb3\xc7\x18\x42\xb4\xc6\x36\x05\x8f\xd8\x16\x75\xd5\x0e\xa1\xc1\x49\x75\x4c\x82\x8b\xd8\x6c\x1d\x50\x6e\xd0\x91\x54\x11\x45\x8c\x79\xad\x3a\x6c\x51\x53\x9e\x6c\x3b\x65\xd7\xea\x52\x49\x28\xe2\xa2\x34\x4d\x92\x52\x9b\xb5\xe0\x92\xc0\xe7\x9c\x05\x30\x60\x7f\x95\x44\x1b\xab\xd8\x43\x13\x75\x0c\x7b\x29\x44\x84\x2e\x7c\xae\x97\x6e\x06\x67\x75\x56\x0f\x6a\x84\x42\x25\x97\xcf\xd0\xee\x14\xa8\x03\x1e\x98\x40\x9a\x6c\x0b\xf7\x2a\x67\xb2\xb5\x19\x0c\x1d\x9a\xd2\xe8\xe6\x8e\xe6\x31\xb4\xf2\xcd\xa8\xe6\x58\x16\x7c\x54\x19\xf6\x28\x98\x03\x34\xd2\x0f\xb1\xe8\xd8\x2b\x1d\x8a\xf9\x12\xd4\xe5\x67\x08\x2d\xb4\x4c\xa9\xe6\x11\xa8\xb2\x7c\x16\x58\x11\x53\x5f\xd2\xb0\xd6\x76\x10\xa8\xac\x6f\x60\x7f\x8d\xde\x98\x9c\x11\x7d\x27\x09\x4f\x8d\x84\x40\xa1\x95\xc6\xcc\x67\x0c\x39\x7b\xe7\xa6\x99\x1a\x31\xe8\x7b\x30\x32\x07\x4f\xa1\x92\x6c\x54\x28\x05\xc3\x7b\x8b\xa6\x37\xe5\xd9\x94\x9b\x51\x8d\x81\xdb\x77\x0c\x4e\x9b\xb9\x06\xa8\x3a\x32\xdb\x73\xc7\x8c\x5c\xa0\x36\x22\xac\x9a\x34\xcd\x08\x7b\xda\x2a\x12\x73\x55\x6b\x4c\x7d\x14\xe7\x32\xcb\xac\x81\x24\x3d\xae\xcf\x08\xfc\x06\xf9\x2d\x53\x41\xef\x65\x34\x55\xcf\x99\xf0\xcd\xc3\x6d\x39\x0b\x38\xb9\xf5\x4f\x54\x0e\xcc\x04\x13\x42\x8f\xc9\xb7\xb6\xa9\x90\x47\x5c\x1f\x75\xd7\x4a\x70\x42\x6b\x8b\x95\x9d\x06\x89\xa7\xed\x35\x48\x3c\x83\xc4\xf3\xeb\x96\x78\x7c\xb8\xd7\xae\xd2\x4e\x19\xe3\x58\x6b\x48\xee\x82\x01\xca\x07\xd6\x19\x31\xce\x67\xe4\x92\x45\xf2\x96\xe5\x48\xe4\xa0\xf1\xa7\xe1\xe5\xaf\x29\x4f\x0c\x89\x73\xa4\xae\x54\x0f\xa1\xa2\x6a\xd5\x34\x17\x68\xe4\x1e\x9a\x16\xcd\x53\x3b\x29\x9b\xe9\x67\x9e\xb7\x4e\xb2\x2c\x67\xb7\x5c\x16\xca\x85\x2c\x14\x1a\x8f\x99\xd2\x96\xdf\x2e\xf8\xdc\x17\xe6\xf6\xae\xce\x9c\x45\x32\x8f\xcb\x94\x72\xa5\xa9\x2e\x54\x35\x4f\x22\x42\x6b\x5a\x7f\x06\x1a\x0f\xc7\x7b\xa6\xee\xbb\x51\x52\x8c\xd8\xd8\xe3\x54\x1c\xbe\xc1\x98\x8f\xb2\xef\xb6\x0e\xc2\x50\xca\x10\x18\x23\x42\x15\x9a\x05\x68\x65\x11\xa0\x33\xac\x2b\x59\xaf\x27\xd8\xb8\x65\xec\x87\x1d\x97\x51\x27\x2d\x2a\xae\x87\xd7\x4e\x50\x27\x7b\x24\x78\x86\xd7\x13\x0e\x3c\xa9\x2d\xb6\x7b\xf4\x25\xd9\x33\x02\x93\xec\x13\x85\x49\xfa\x8c\xc4\x24\x3e\x9e\x7b\x9f\x13\x73\xe9\x22\xc9\x6b\x67\xc6\x12\xde\x4d\x67\xa6\x52\x50\xc0\x8f\xc3\x95\xeb\x00\x69\xdd\x9a\xfe\x0c\x80\x49\x30\x8c\x07\xb6\xa7\x15\xb4\x39\xf4\x5d\xb2\x8f\xbe\xea\x6f\x20\xc7\x94\x4d\xb5\xb5\x84\x08\x84\x34\xc3\x4a\x40\x70\xea\xc6\x36\x24\xcb\x69\x4b\xc3\x09\x1e\x4e\x70\xdb\xf7\x1f\xf3\x04\x63\xc4\x73\x97\x80\xfc\x5a\xa7\x20\x7c\xdd\x26\xe1\xd2\x29\x4b\xc8\xcf\x05\xcb\x97\xc4\x08\x41\x65\x78\x0f\x94\x37\x56\x3c\xb6\x01\x32\xd6\xa8\xd2\x5e\x66\x7f\x40\xfe\x0f\x26\x9b\x57\x1f\x8d\x04\x08\x79\x6c\x7b\xd0\xb5\xfa\x50\xd5\x54\x65\x84\x96\x87\x60\x28\xe1\xa1\x87\xb1\x22\xf3\x19\x71\xef\xf4\xdd\xd9\x6e\x8a\x4e\x37\xa7\x16\xd9\xc5\xb1\xb5\xb2\xf8\xd3\x0d\x0b\x44\x40\xf8\x5f\xaa\xdd\xa4\xbc\x29\x82\xdc\xb0\xe5\xc8\xfa\xc1\x6d\xf5\x76\xf7\x30\x86\x73\x54\x4b\x8a\xb6\x2d\x55\xd1\x04\xa0\x1d\x28\xe4\x6e\xd6\x03\xbc\xda\x17\xa1\xac\xbe\xe5\x80\xd0\x95\x10\xef\x4c\xc2\x3b\x15\xab\x0c\xaf\x75\x85\x2b\x11\x27\xa0\x02\x9f\x8b\x6b\xf6\x68\x00\xb1\xdc\x40\x2d\xba\x6e\x22\xd9\x5d\x05\xc6\xcb\x01\x76\xef\xa5\x7a\x34\xad\x04\xe6\xde\xb0\xe5\xa1\xb2\x59\x83\x52\xa8\x05\xcf\x5c\x7d\x78\xa0\x04\x16\x73\xc9\x77\x10\x1f\xe0\x86\xc0\x33\x7f\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x20\x54\x08\x2d\x95\x92\xa9\x77\x52\xc3\x9d\x07\x07\x16\x4e\x77\x6f\x50\x59\x33\x25\x07\x33\x23\x86\xb4\x41\x7e\x86\x0b\x41\x01\x90\x58\x7f\xab\x07\x2b\x57\xe4\x5c\x10\x99\x3b\x98\x68\x57\x3c\x58\xd9\x21\x9c\x6d\x29\xb0\x08\x37\x8c\x61\x41\x29\xf3\x0a\x24\x37\x0c\xe7\x8d\xcb\xdc\xfd\x02\xb6\x27\xb0\xc6\xfb\xb8\x19\x28\x81\x4b\x35\x9b\xf3\x88\xa4\x2c\x9f\x43\x7e\x68\xb4\xd8\x7d\x83\xba\xd3\x6d\xbc\x76\xa2\xde\xe1\x87\x3b\x63\x06\xb0\xba\x37\x10\xb9\xb4\x2f\xc3\xc4\x51\x90\x45\xa4\x34\x33\x48\xf1\x4f\xc3\x09\x60\x5f\xfe\x0d\x25\xab\xd5\x84\x9c\xba\x86\xa7\xe1\x6f\xd6\x8a\x11\x0e\x63\x46\x30\x32\xfd\xcf\x05\xbf\xa5\x09\xc3\x78\x3e\x2a\x7c\x19\x4f\x39\x5b\x61\xd3\x23\x5b\xb7\xda\x50\x29\xef\x19\x3a\xb8\x61\xcb\x83\xd1\x0a\x22\x1d\x9c\x8b\x83\x32\x49\xbb\x82\x3a\x9e\xa1\x81\xd3\xe0\x00\x7e\x3b\xe8\x9b\xb3\x3f\x92\x68\xbf\x03\x96\x58\x83\xd0\xcb\x84\x2a\xd5\x2d\xbf\xb5\x96\x5a\x54\x1b\xa7\xa9\x00\xe3\x55\xf0\x4c\x99\x5c\x64\xa3\x37\x7b\xb7\x67\x41\x94\x7f\xf7\x48\xa3\x4e\xd0\xbb\xb5\xdd\x53\xda\x17\x6e\x68\x2c\x28\x06\x65\x0b\x5c\x0e\x47\x25\x2f\xae\x74\xc6\xae\x81\xd7\x77\x60\x57\x94\xb3\xb0\xc9\x33\x57\xa0\x06\x73\x97\xd5\x21\xa4\x26\x5c\x44\x49\x61\x4d\x8a\xf0\x2a\x28\xd1\x5d\x45\xfd\x1d\x80\xb3\x07\x52\x95\x03\x38\x6c\x72\x6e\xdf\x95\x00\xde\xba\x87\x0e\x7c\xa2\xde\xe3\x85\xb0\xea\x7b\xad\xb3\x2d\xe1\x92\xd5\x62\x9c\x51\x55\xf6\x78\xcd\xa7\x39\x23\x2f\x17\x54\x08\x96\x04\xd9\xae\xd6\xd8\xe1\xdb\x59\x81\x40\x62\x9b\x58\x1d\x56\xbb\x58\x39\xfa\x26\x7c\x6e\x75\xef\xbd\x83\x7f\x49\x4d\xa5\x7a\xeb\x53\x6e\x4b\x35\x2e\xe4\x1d\x89\x25\xb9\x83\xbe\x05\xb7\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x29\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xdd\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x23\xf3\xf0\xf1\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x1c\x93\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6c\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x22\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x85\xdb\x95\xc1\x55\xf1\x89\xe7\x7c\x3e\xdd\x88\x7d\x64\x91\x8d\x0a\xce\x92\x62\xce\xb7\xa4\x3f\xfc\xca\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\xeb\xe6\x02\xe4\x31\xcb\x98\x88\xa1\x24\xda\xeb\x12\x73\x71\xf2\xbd\x42\xce\x96\x17\xeb\x4a\xb5\x5c\x55\xb2\x0a\x05\x0f\x42\xb8\x16\x32\x89\x15\x61\x1f\x75\x4e\x0d\x61\x4a\x0d\x09\xf2\xef\xcc\x08\x15\xed\x89\xcc\xd3\x28\x11\x4c\x7a\xe7\xf6\xf7\xdb\x2f\xf3\x29\xb6\xbc\x2c\xd7\xae\x36\x36\xac\xde\xaf\x74\x3d\x12\x62\x7b\x56\x54\x35\x42\xb8\xa1\xc4\xbc\xfd\x4a\x35\x32\x71\xbf\x52\xf3\xaa\xa1\xa8\x76\x6d\x56\x43\x9b\xce\x4f\xa2\xee\xfc\x0c\x12\x83\xbb\x14\x61\xb2\x6f\xd4\x34\x6a\x7b\xb3\xde\x10\x7a\x83\x06\x6d\xf1\x36\xe0\x03\x50\xf1\xd4\x0e\x64\xd3\x9a\x88\x32\xb0\x2c\x43\xe7\x0a\x21\xb6\x51\xb1\xfb\xa8\x22\x4e\x35\x55\x4c\xb7\xb3\xa6\x54\x45\x87\xf2\x4d\x73\x00\x43\xfc\xb2\x3f\x61\x15\x7b\x08\x48\x77\xc9\xb2\x64\xfc\x17\x2b\x65\x88\xca\x93\x46\xbe\x70\xf0\x71\x45\x9a\x98\xf7\x22\xe3\x18\xb1\xd9\x95\x88\xea\xd6\x2d\x77\x5a\xf1\x05\x3b\x83\x6f\xbf\xed\xdc\xcb\x35\x78\xd3\xc9\x21\xf0\xef\x2a\x10\x2c\x2e\x40\x21\x1f\xfe\x73\x11\xaa\x03\x50\xdc\xc2\x2f\xdb\x3e\xdf\xd7\xda\xe6\x11\x2b\x8d\x57\x67\x5c\xdd\x74\x29\x46\xb6\xf2\x72\xf5\x48\x7c\xfd\xf2\x15\xb1\x77\x5b\xd9\x97\xba\x18\x98\xf6\xad\x8c\x35\x8f\x58\x69\xb4\x8d\xb9\xba\x79\xf0\xb6\xea\x59\xfc\x6e\x5b\x04\xf8\xc3\xd9\xbf\xea\x52\xaf\x2b\xd1\x12\xd4\x0e\x5a\xca\x82\xdc\xd9\xd2\x07\x56\x6a\xbe\xe6\xd9\x0b\xf2\x4a\xa8\x22\x67\xa5\xe7\xb6\x3e\x94\xe1\xba\x4f\xa9\xf5\xfa\x5e\x58\xf2\x94\x8d\x6f\x19\xcd\x35\x88\xc7\x5d\xd1\xc0\xbf\xe8\xe8\x53\x70\x43\xb4\xc1\x83\xf3\x99\x0b\xac\x1b\xd9\x1c\x6f\x5f\xb8\xcc\x3d\x64\x76\x3e\x28\x6b\x12\xee\xf5\x6b\x5f\xf2\x87\x9c\xc4\xec\xf6\x44\xc5\xf4\xf9\x08\x3e\xe3\x02\x9e\xab\x73\xa2\x8a\x1c\x3c\x3f\x98\x90\x2b\x9e\xf2\x84\xe6\xc9\xb2\x52\x8a\xb9\x7c\xce\x30\x0b\x37\x20\x78\xe5\x9e\x1d\x90\x23\x99\xc3\xc8\x11\x15\x24\x61\x2e\xa3\xc9\x9e\xb3\x25\xca\x8e\xc7\x0f\x4d\x5c\xc8\xbd\xda\x2f\x91\xce\x74\xc6\x89\xd8\x71\x6c\xcb\x8f\x2a\xe5\x6c\xce\x4a\x92\xce\x85\xa1\xf3\x13\xf2\x6d\x53\xa3\x72\x38\x32\xee\x89\xc7\x02\xea\xc3\xe8\x7d\x3b\x69\x70\xab\xe6\xe0\xc7\x03\xd3\x76\x2d\x71\xce\xf5\x25\xcb\x64\x27\x09\x01\x5f\xa9\xd9\xe3\xb8\x36\x37\xa4\xe2\x50\xa8\x94\x6a\x68\x0b\x9c\x6b\x1e\x15\x09\x35\x62\x35\x5a\xe3\x26\xe4\xec\xd5\xc5\xe5\xab\x97\xa7\xd7\xaf\xce\x5e\x90\xaf\xed\x48\x3c\x94\xf0\x26\xe4\x3a\xac\x06\x15\x44\xf4\xda\x92\x3b\xfe\x5b\x23\x4b\x86\xa8\x28\x8b\x3b\x42\x8d\x0f\x2a\xc8\xb9\xe0\xba\x2c\x8f\x8c\x71\x67\x89\x14\xcc\x75\x0f\xcd\xa4\xb5\x06\xce\x39\x46\x83\x08\x3b\x98\xf9\xb9\x3a\x1a\x9c\x0e\x2c\xb5\xea\xa7\xb2\x45\x11\xbc\x07\xd1\xa2\x04\x6e\x5f\xe2\xbf\xab\x7f\xda\x55\xf6\xf5\xd5\x68\x5d\x82\x13\x5a\xff\xcb\xfb\xc8\x0c\x7c\x61\x76\x57\xee\xa6\xa1\xa5\x35\x31\x6c\xe6\x70\x72\xe8\x04\x8a\x64\xa5\x08\xbf\x1f\x34\xac\xe8\x55\x45\xb6\x09\x21\xef\x5d\xc8\x36\xa4\x1e\x37\xd7\xf3\xc7\xea\x10\x41\x55\xf8\x1a\xca\xba\xc4\x98\x62\x1a\x7e\xd4\x96\x00\x9b\xf3\x5b\x26\x70\x61\xfd\x52\x28\xf7\xf9\xce\xdd\xd1\xca\x79\x5b\xfd\xe3\xf2\x4d\xbf\x33\xc3\xf3\xd7\x79\x5e\xf6\xd8\xda\x59\x45\x32\x4d\xb1\x5e\xd4\xc2\x27\x18\x96\x39\x82\x9e\x2a\xf4\xa6\xf9\x60\xe5\xab\xd9\x16\xe4\xaf\xd1\x33\xf7\x52\x4d\xd3\xf1\xb7\x6d\x52\x82\x28\xc5\xdc\xee\x75\x98\x6d\x91\x35\xe5\x8a\xa7\x58\xd2\x7e\xe2\x3f\x7e\x72\xf9\xea\xf4\xec\xed\xab\x49\x1a\x3f\x38\x69\x61\x22\xce\x24\x17\x5a\x6d\xd7\x6f\xb6\x75\x9d\x69\x4f\x7e\xfc\x47\xbb\x72\x67\xff\xa2\xc3\x31\x77\x23\xa8\x4b\x17\x33\x4d\x79\xa2\x82\x3d\xd4\x32\x93\x89\x9c\x37\x97\x5f\xee\xb0\x39\xbf\xc1\xfa\x32\x63\x3a\x36\xbb\xde\xaf\xa8\xdf\xa6\x8f\x46\x5d\xca\x2f\x3b\x62\x97\x6b\xf5\x52\x33\xb4\xbb\x78\xa2\xcb\xbd\x17\xe1\x6c\x05\x06\xa8\x48\xc2\x01\x76\x25\xfb\xca\x1a\x78\x41\x0f\x9b\xb6\x52\xdb\x7d\x83\x6e\xbb\xc0\x66\xe8\xcf\xf6\x46\x45\x55\x98\xb9\x77\xaa\x04\x2e\xcb\xd9\xd8\x97\x6b\x82\xd6\x2a\x32\x0f\x18\x6e\x48\xef\x9c\xf5\xc6\xd9\x7a\xf0\xa9\x64\x59\xb7\xe2\x94\xf2\x91\x37\x7d\x61\x8d\x81\x24\x59\x96\x65\x20\xad\x16\x4d\xe7\x58\x86\x29\xb7\x66\xe2\x2c\xe7\xb7\x3c\x61\x73\x28\xc5\xca\xc5\x3c\x48\x7f\x0d\x13\x66\x6d\x69\xd6\xaa\xd1\xf5\xad\xf9\x2b\x28\xba\x0d\x78\xf1\xee\xfd\x35\x54\xf5\x05\x07\xd7\xde\x42\xb8\xf9\x20\x9c\xb7\xf1\x78\x0c\x26\x83\xa3\xbf\x1b\x79\x32\x4e\x8e\xc9\xf7\xcc\x7e\x47\x42\xd9\xe1\x1c\x5a\x01\x2d\xa4\xaf\x01\x0b\x73\x2d\x21\x0b\xe8\x88\xee\x7d\xfb\xd4\x89\x79\xd2\xc8\x4a\xc8\x6a\x2a\xcf\x43\xe7\x53\x2c\xdd\x88\x3e\xa6\x87\x97\x3d\x7b\x24\xfb\x3b\x53\x39\x67\x5a\x6d\xc2\x4f\xef\xf8\x71\xf4\x90\x12\xb5\x4c\x13\x2e\x6e\xca\xba\x60\x33\x69\x70\x08\x53\x13\xb8\xb8\x71\x18\x9b\x33\x9a\xac\xa7\x94\xbb\xe0\x47\xaf\x54\x52\xef\x60\x01\x04\x0b\x9d\x39\x67\xff\xed\x8e\xbd\x75\x43\x87\x24\xee\xe0\xe0\xc9\xad\x97\xab\x6e\x6d\xf0\x0f\xe1\x85\x0a\x4d\x13\xe4\xfc\xea\xe5\xd5\xf9\x83\x5a\xa8\xd7\xb1\x04\x98\xdd\x23\x4a\x75\xfc\xe7\x6d\xde\xe1\x31\x49\x8a\xed\xcf\xa0\x7a\x77\x21\x73\x4d\x93\x9e\x88\x40\xb4\xa0\xd9\x69\xa1\x17\x67\x5c\x41\x0d\x85\xae\x42\xc0\xca\xfb\x41\xa4\x33\xd6\x6e\x76\x05\x03\xb9\x43\x07\xfb\xdc\xcb\xff\x3e\xbd\x20\xb4\x30\xfb\xab\x6d\x71\xd1\x5e\x1d\xee\x6e\x66\x57\x98\x61\xb0\xe3\xba\xec\xdb\x5b\x56\xe5\x9e\xba\xef\x35\xdd\x47\x1c\xee\xe0\x8b\x00\x1a\x8a\x14\xec\x09\xfb\x1f\xb8\xe0\x9a\x53\x2d\x5b\x36\x2a\xab\xa0\x40\xe5\x5d\x6f\x10\x28\x94\x96\xa9\xc5\xe0\x73\xf7\x04\xb8\x90\x81\x8b\xaf\xbc\x54\x5a\x0b\x40\x7a\x07\x88\x9d\x0b\x23\x6b\xd3\x88\xd5\x02\x20\x47\x50\xf4\x13\xc7\xe6\xfe\x99\x3f\x5b\x03\x15\xd4\x07\x4b\xfe\xf2\xa2\x52\x8a\x7d\xa5\xaf\x85\xb3\x52\x94\x4d\x13\x7a\xb5\xf8\xf0\x9f\xbb\x12\x05\xfe\xb3\xa8\x59\xda\x70\x81\xff\xa7\xa0\x09\x02\xe6\x5d\xdf\x66\xa9\x2a\x90\xbb\xce\xb7\xba\x43\x76\xea\xe5\x76\xbc\xf3\x5a\x7a\xa1\xb0\xf2\x18\xae\x47\xe7\x54\x28\xb3\x47\x55\x5d\xec\xd0\x3a\x9e\x0e\xc9\x91\x8e\xb2\xd6\xbd\xfb\xef\x29\xb4\x3d\x29\x44\xa5\x91\x33\xcc\xfc\x1a\xb7\xe5\x8d\x0f\x6d\x6f\x3b\xc9\x7b\x71\x0d\x01\x96\x77\xb5\xaa\xd8\xb7\xfc\x6e\x85\xeb\x42\xd6\x4f\xde\x70\xa5\x5d\x43\x06\xb8\xc1\x95\xad\x23\x0c\x72\xd7\x85\x51\xe4\x78\xf6\x37\x1a\xc7\xf9\x0b\xe4\x52\xae\xfb\x72\x0e\xd2\x97\x2b\xf2\x45\x85\xf7\x25\x1e\xe9\x65\x66\x0b\x00\x5e\xbf\xbc\x20\xd8\x20\xe5\x4f\x5f\x62\xe7\xd7\xdf\x7f\xf1\xe5\xb3\xd6\xdb\xfd\x78\xc1\xe3\x3b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x57\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\xff\x3f\x7b\xd7\xd7\xdc\xb6\x6e\xe5\xdf\xfb\x29\x30\xee\x83\x6f\x66\x24\x39\xb9\x73\xb7\xb7\xd3\x7d\x72\xec\xe4\x56\xdb\x24\x57\x1b\x25\xdd\xe9\x74\x3a\x3b\x10\x09\x4b\xac\x29\x80\x4b\x80\xf2\xd5\x74\xfa\xdd\x77\x70\x0e\x40\x02\x94\x28\x12\x14\x2d\xdb\x89\xf4\x92\x98\x24\x48\xfc\x3d\xff\xcf\xef\xe8\x55\x2e\xe9\x7d\x3f\x09\xe6\x1c\x67\xf7\xa4\x71\x76\xa4\xcc\x28\x41\x22\x11\xb8\x5d\xdc\xa6\x90\x62\xb8\x4b\x76\x90\xe2\xcc\x9e\x1f\xc5\x69\x9d\x9b\xf6\x5d\xe4\xef\x1e\xd7\x19\x6f\xcb\xdf\x54\x21\xec\xb7\x9f\xe6\xff\xfb\xe1\xfa\xed\xbb\x0f\xd0\x53\xe3\xbf\xd7\x5b\x23\xe1\xbd\xe3\xa7\xba\x6f\xb5\x2e\xca\x6b\xfb\x84\x84\xb9\x65\x78\xcd\x21\xc3\xc9\xa7\xf7\xf3\x50\x5f\xcc\xb1\x02\x3a\xbf\xeb\x34\xf6\xd3\x5a\xdb\xa0\xaa\x09\xcb\x87\xcb\x1f\xe9\x6d\x94\x73\x80\xb4\x3c\xfd\x4b\xaf\x14\xf6\xf0\x68\x15\xa9\x75\x05\xc8\x33\xf0\x3b\xe8\xf1\xe2\x1c\x0c\xee\x71\x78\xa4\xb9\xea\x2a\x07\xe4\xe1\x89\x45\x97\xd8\xca\x8a\x00\xfa\x90\x22\x6d\xcb\x35\xcd\xd6\xd4\x9a\xc9\xb2\xfa\xc2\x33\xdd\x29\xd9\x3e\x78\xe6\x10\xea\xb5\xf7\x05\x5e\xb9\x32\xcf\x17\xe3\xe5\x52\x34\xc1\x99\xdb\x08\x05\x6a\x94\x57\x99\xd1\x68\xd0\x82\x2a\xd5\x25\xbc\x02\x49\xee\xa7\x27\x80\xf0\xd9\x01\x03\x69\xcb\xf7\x85\x6e\xe4\xb2\x61\x3d\x4b\x2e\x68\x85\x6c\xa1\x8f\x4c\xd8\x0c\x44\x37\x9d\xee\x89\x97\x8f\x9c\x56\xdb\xf9\x9f\x9e\x8a\xce\xd0\x4a\x4e\xb6\x12\x4a\xf0\xde\x51\xf2\xfb\x9a\xfb\x07\x7a\x06\x4f\xdc\x54\x65\x6c\x9c\x1a\x8f\x10\x41\x59\x3a\x23\xb4\x3c\x67\xd9\x85\xe0\xd6\x2d\xe1\x3b\x25\x4e\x2e\x82\xc4\xd3\xdb\x81\x0e\xdf\xcb\x4d\xf1\x0c\x35\x06\x0f\x1a\x0c\x12\x07\xe7\xa4\xe8\x26\x76\xc6\xa6\xb7\x46\x34\xb3\x09\x27\xd2\x6c\x48\xd2\xbc\x23\x07\x63\x9d\x22\x57\x0f\x22\x0f\x4f\xf5\xf6\x1b\xd6\x62\x15\xcc\xbd\x9d\x54\xac\xe7\x78\x7a\xb0\x8f\x4f\x7c\x82\xe6\x70\x82\x6a\x00\xe7\x4d\x27\xe9\x31\x0e\xd2\xd3\x1e\xa0\x63\x19\xd5\xe3\x66\xf9\x0e\x2a\xa4\xdb\xed\x16\x38\x54\xdb\xcc\x18\x13\xf4\x22\x55\xd4\x82\x82\xc9\xc5\x39\x71\x83\x51\x87\x5c\x60\x09\xca\x10\xc2\x60\xdb\xa0\x01\x17\x81\x9e\xd3\x54\xcf\xaa\xe0\x2e\x44\xb4\x49\xe3\x1d\x11\x44\x59\x5e\xd3\xcc\xd6\xe4\x16\x0f\xfc\x81\xe6\x31\xb9\x9e\x4d\x87\xa1\x06\x01\x71\xd6\xb8\x93\xba\x21\x7a\xf9\x91\xd6\x55\x4b\x2c\x73\xb3\x62\x50\x5b\x91\x2c\x12\x25\xab\x9a\x7e\x4c\xb9\x7a\xa5\xa6\x82\xa5\x2f\x4b\x9f\x65\x7d\x6e\xcd\x9b\x1c\x86\xc9\x89\x88\x14\x4d\x6d\x11\x01\x53\x26\xe7\xf5\xeb\xd7\x68\x0a\x7b\xfd\xf3\xcf\x3f\x63\x65\xa5\x98\x45\xc9\x7a\xf7\x41\x78\xea\x3f\xde\xbc\x99\x90\xbf\x5d\x7f\xfc\x00\x95\x1f\x33\x25\x11\x95\x04\xdf\x8c\x95\xe0\x9d\xc6\x72\x44\xfe\x6b\xfe\xeb\xa7\xaa\x4c\x8c\x7f\xd7\x14\xd4\x36\xc3\x9b\x90\x5b\x27\xfe\xc9\x35\x74\x51\xb5\x32\x05\x8d\x14\xa1\x77\x77\xb8\x31\x16\xb6\x9c\x2e\x1e\x38\x9b\x3d\x0e\x55\xc1\xb1\xfe\x88\xde\x12\x29\x04\x66\x69\x95\x1c\x4d\x83\x16\xd9\x00\xe3\xcc\xe0\x5d\x25\x99\x84\xae\x8c\xb0\x96\xfc\x9d\x84\x2a\x24\x15\xfc\x5f\xce\xa4\x16\x4a\x4d\x75\x45\x7c\x59\xb5\x32\x92\x75\xc6\x7a\x78\x0c\x0f\x50\xe7\xea\x18\xbe\xe9\xde\x9c\x21\x0b\xdf\x6a\xb0\x8b\xab\x32\xf5\xff\x44\x6f\x68\x5b\x90\xf0\x23\x79\x64\xbc\xbe\xce\xca\xde\xe0\xd2\x19\x94\x80\x8a\x4e\xd0\x54\x40\x25\xaf\x72\xa5\x2b\x2e\xe6\x14\xbd\x6f\x1f\x4a\x30\xf8\x62\x28\x00\x2f\x12\xaa\x8f\xb4\x73\x39\x1f\x3f\x5e\xc4\xb6\xf6\x70\x15\xe8\x42\x14\xca\xfa\xb0\xcd\x7d\x48\xc0\xc6\x2a\xeb\x01\x30\x92\x3d\x90\x27\xfb\x20\x10\x07\x83\x98\xfa\xfe\x66\xe0\x09\xbe\x28\x31\x22\x8c\x46\x2b\x72\xcf\xb6\x63\xa4\x5b\x19\x85\x6c\x1e\x98\x95\x5b\x3d\x17\x5e\xe1\x93\xaa\x76\x8d\x96\x8f\xcd\x94\xd9\xc0\x00\x87\xfb\xd8\x6c\x20\x2b\x84\x4a\x23\x2f\x19\x18\x51\xee\x58\x0a\x2c\x56\xb5\x53\x8f\xb8\xc4\x0d\xc5\x62\xe4\x7e\x92\x8a\x3e\x6f\x2c\xd6\xcd\xe4\xa1\x2f\x57\xd1\x10\x9a\x0e\x1a\xee\x56\xf0\x9d\xd6\xa6\xf8\xb6\x11\xfe\xe0\x83\xd4\xa2\x33\x3b\x11\x15\x50\xce\xcf\x54\x72\x32\xcf\xda\x59\x2a\x27\xc2\x4b\xa2\x91\x4c\x15\x66\x6a\xb0\x5e\x58\xc1\x53\x26\x25\x49\x60\x84\x6b\x9a\xdf\x33\x0b\x18\x43\xd3\x09\x99\xe9\x4e\x96\xf8\x55\x08\x8b\xbc\xc1\x10\x3b\x7d\x66\xdd\xec\x20\xfd\x91\xcb\xc9\xe4\x12\x09\xfc\x9e\x5c\xa1\x80\xfd\xd1\x0f\x53\xb7\x07\x96\x6e\xad\xb4\x77\x26\x11\x19\x58\x8b\x7c\x80\x7c\x2d\x20\x0b\x4e\xad\x2c\x03\xa3\x9d\x41\x94\x76\x87\xd3\x03\x00\xb6\x2f\x6e\x79\x1f\xd4\xf2\x4e\x7e\x0b\xff\xd7\x1f\xad\xbc\x17\x56\x79\x13\x52\xb9\x59\x29\x73\xda\xc2\x31\x9c\x8f\x80\xd8\x5e\x07\xc1\xbc\xda\x9f\x6f\xa4\x04\xb9\xc3\x43\xe9\xe9\x24\x23\x1a\xd0\xa7\x94\xbd\x28\xa1\x70\x7a\xb7\xaf\xea\x9c\x4d\x16\x74\xe4\x65\x4b\x43\xf5\x0c\x3c\xbd\x34\x18\x56\xcb\x85\x04\x8b\x87\xf5\x5f\x88\xb8\x58\xff\x75\x73\x06\xd6\x7f\xbe\xc2\xe6\xa4\x25\x95\x44\xdf\x8d\xe2\x87\x29\x55\x02\x30\xbb\xab\x23\x38\x21\x1f\x0d\x53\xc0\xcd\x48\x17\x52\xa4\x85\x2a\x33\x99\xf6\x70\x0c\x78\xa9\x45\xf8\xc6\x94\x52\xfb\x98\xc3\x3f\x80\x73\x22\x59\x0e\x65\x25\xf8\xeb\x75\xc4\x43\x6b\xee\x7d\xb3\xc1\x24\x47\xcc\xa1\x15\x25\x7a\xcf\xa3\x7d\x41\x89\x3b\x61\x63\xa9\x3d\x19\x07\x22\x49\x94\x44\x01\xca\x8a\x2b\xa6\xd0\x53\xf0\x10\xbb\x59\x6d\x4c\x5f\x8d\x61\xe2\x7a\x36\xed\xa5\x01\x38\xed\x1b\x74\x00\xf7\x89\x6f\x58\x0b\x98\xa2\x16\xe0\x96\xdd\xb9\xad\x46\x6e\x4c\xca\x9a\xec\x3c\x7b\x31\x72\xa7\xdb\xef\x35\xb1\x74\x83\x4e\x7d\x0c\x3d\x34\xf6\x54\x64\xd5\xc1\xdd\xb3\x5e\x47\x38\xc4\xcf\x5d\xe4\x3c\xa1\xf8\x08\xf3\x11\x54\x2e\xdd\xfe\x76\xab\xd9\xc1\x60\xc9\x1c\x4a\xdb\xa0\x3e\xe8\x28\x96\x99\x88\xff\x64\x4a\x49\x73\x2e\xb0\x80\x9c\x1c\x61\x6d\x1c\x39\x42\x85\x51\x4b\x11\x8e\xaf\x38\x77\x4c\xee\xbd\xe5\x86\x5e\x55\x8e\x8e\xa9\x73\xa4\x17\x10\x46\x3e\x0b\x5d\x45\x72\x64\xd9\x22\xe2\xb0\xa6\x7e\x85\x50\xbc\x35\x35\x6f\x2a\xeb\xbc\x47\x2b\xb6\xa6\x88\xe1\x67\x87\xa7\xa9\xcc\x43\x9e\x28\xc5\x10\x4b\x89\xe5\x6b\x49\xc4\xdd\xc8\xf3\x19\x5c\x6c\xde\x5c\xf4\x29\x07\x73\x64\xc5\x1e\x52\xad\xc2\x00\x93\x31\xf3\x44\x36\xbd\xaf\x41\x97\x48\x01\x78\x93\xd7\x0c\x12\x9a\xc1\x6c\x70\xf6\x4e\x3e\xf0\x21\xf4\xa8\xbe\xfa\xd3\xa8\x14\x18\xce\xfa\xd3\x59\x7f\x1a\x44\x7f\x72\x18\x8b\x25\x38\x7b\x74\x29\x37\x60\xd8\x2a\x54\x55\x22\x93\x03\xc0\xa3\xb7\xa6\x55\xa5\x44\xee\x5b\xdc\xb4\x3e\x74\x69\x15\x2c\xb3\x8f\x0b\x75\x37\xfe\x23\x61\x3c\x12\x31\x2e\xbe\x7e\x7f\x2e\x15\x88\x36\x95\x4e\xe2\xf6\x65\x6d\xbf\xe5\x5a\xed\xe0\xdd\x7d\x97\xae\x17\x1d\xb0\xae\xc0\xf7\x03\x31\xf8\x8a\xad\x97\xc9\xc4\xb6\x56\xb6\xc5\x1a\x30\xfc\xbd\x72\x42\x62\x59\x69\xd8\xdc\xb6\x62\x2e\xf9\x01\x2f\x4e\xa2\xac\x18\x99\x07\x26\x6b\xb6\x16\xf9\x76\x54\x3e\xa4\x6f\x7a\xad\xcc\x13\xaf\x40\x26\x88\x8a\x5c\x6b\x80\xe9\xf6\xa5\x4a\x07\x76\x82\x4e\x2c\x1c\x94\xeb\x14\x56\x34\xc8\xfd\xf9\x5b\xa2\x02\x15\x03\xfd\xbe\x2a\xa2\x74\x57\x42\x1e\xca\x51\xa5\x76\xea\xab\x8c\x6f\xc8\x86\xe6\x01\x55\xd0\xdd\xdf\x91\xf2\x40\x9c\x6c\x12\xd9\xaf\xde\x61\x6d\xe8\x73\xc3\x34\xd0\xae\x23\x0a\x95\x15\xca\x50\x4a\x7b\x2a\x6c\xca\x7c\x79\x1a\x6a\x42\xd1\x9b\x8b\x5e\xdd\x78\x31\xf5\x85\xf1\xd7\xb3\xca\x30\xfe\x8e\xad\x35\xec\xbf\xa5\xf7\xb6\x19\xb4\x72\xb8\xfd\xd9\x6d\x31\xc4\x39\xac\x58\x64\x85\xf3\x60\x85\xd3\x13\x1d\x34\x0c\x37\xe9\x65\xb7\x31\x08\xf5\xfb\x4d\x36\xe6\xe6\x37\x6c\xad\x19\xd6\x67\x6b\xf2\x0b\xbf\x73\x87\xed\xdc\xd4\x33\x38\x7b\x6b\x3b\x6d\xc1\xb3\xb7\xf6\xec\xad\x3d\x7b\x6b\xcf\xd6\x86\xb3\xb5\xe1\xec\xad\x25\x67\x6f\xed\x20\x73\x38\x9c\xb7\x16\x45\xbd\x7d\x3e\x5b\x23\xec\x55\x0e\xdb\x93\xfa\x6b\x4d\xe1\x9e\xeb\x28\x12\x05\x57\x5f\xc4\x3d\xeb\xec\x74\xa8\xc9\xff\x3b\xef\x01\x00\x84\x06\x7d\x60\xf7\xe1\x93\x29\x07\xe1\x52\x49\x90\x6c\xd1\x47\xaa\xa0\x45\x9c\x68\xc9\xbf\xf7\x36\xb3\x2f\x70\xc1\x89\x78\xcc\xe2\xea\x86\x39\xca\x4a\xcf\xf5\x84\x5c\x93\x9c\x45\x49\x96\x98\x32\xf2\x14\xaf\xe3\xc6\x2b\x6b\x23\x24\x4a\xb2\xf4\xce\x60\xd4\x73\xb7\xd6\x4f\x25\xbf\x1b\x3a\xb8\xf7\x33\xc8\xa1\x84\x45\x32\xb7\xb5\x90\x72\xf6\x4f\xcb\xda\x4c\x6f\xbe\xb8\x6f\x70\xcd\x2b\x30\x14\xaf\xc4\x10\x7c\x2c\x4b\x4c\x82\xf5\x63\x1f\x7f\xf6\x5b\x96\xe4\xb0\x79\xe7\x2c\x12\xbc\x4b\x4d\xd5\x86\x05\xda\x79\x53\xc5\x9f\xc0\x36\xca\x62\x12\x17\x79\x59\x33\x75\x43\xd3\x24\x4e\xd4\xb6\xf4\xda\x99\xf2\x5a\x14\x4f\x4c\xb9\x8c\xb2\x9a\x46\x42\xb3\x2c\x17\x34\x5a\x31\xe9\x7c\x0d\x05\x14\x93\x44\x56\xc6\xbe\x63\x09\x38\x90\x51\xa0\x8d\x66\x90\xe9\x96\xe4\x42\x59\xc7\x7b\xc3\x07\xbf\x38\x2f\x83\xe6\xc8\xe5\x54\xbe\x05\xef\xbc\x70\x5f\x81\xbd\x4a\xee\xdc\x3f\x24\x11\x69\x6c\x21\x4c\xfe\xf8\x5a\x0b\x85\x91\xd9\x83\x9a\xf8\x01\xc0\x85\x12\x24\xd5\x0c\x5b\x13\xc4\xe6\xc6\x3f\xfe\x44\x56\xa2\xc8\xe5\xc4\x05\x1d\x78\x03\xd7\x50\xbf\xb3\x42\xa5\x22\x29\xa3\x52\x91\x37\xaf\xc9\x3a\xe1\x85\xe6\x53\xc1\xdb\x26\x5c\x0e\x72\x24\xa0\x3f\xfc\xd4\xb9\x5d\xa8\xec\xd3\x28\xf5\x64\x88\x8d\x6c\x44\x1f\x73\x92\x30\x31\x0e\x91\xc5\x6b\x82\x90\x21\xba\xee\x6c\x73\x25\x1e\xe1\x7c\xfd\x5f\x21\x16\x5b\x15\x92\x44\x69\x5a\xf8\xd9\x93\xff\x6d\x2e\x76\x01\x4f\xa9\xb0\x53\x0e\x7e\xf4\x51\x2a\x5c\x2c\x13\xa9\x5a\xea\x5b\x54\xf9\x95\x07\x1f\xeb\xce\x56\x96\x5a\x3b\x08\xcc\x95\x81\x36\x56\x22\xb6\xb6\xa5\x28\x62\x58\xcc\xf2\xb6\xaa\x94\xc4\x05\x3e\xdb\xfa\xfa\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\x26\x74\xd9\x2d\x11\x3c\x56\x6c\xe6\x9f\x02\x99\xf0\x25\x82\x9c\xaf\x8b\x54\x25\x59\x5a\x8d\xfb\xb3\x6d\x60\x08\xb9\x6b\x73\xa3\x8e\x99\x88\x62\x62\x31\xa2\x4d\x81\x7d\xf2\x87\xf2\x5d\x8c\x2b\xc4\xea\xce\x35\x3f\xc8\x68\x4e\xcb\xc9\x83\x4a\xba\xf2\x95\x31\xdf\x51\xf0\x28\x1a\x38\x4c\xdd\x8a\xa6\x55\x8f\x1d\x2f\xd2\x90\x9b\x46\x31\x4e\x79\x07\x53\xb5\x0f\xcf\x05\x8d\x88\x78\x28\x83\xc9\xb0\x0c\x4a\x6d\xb7\x18\xa1\xe6\x2d\x8d\xee\x19\x8f\xb1\x68\x14\x0c\x3b\xde\x72\xba\x36\x68\x5b\x4e\x3d\xee\x5a\x7b\x39\x32\x86\x09\x4c\xdf\xb3\x69\xc6\xc8\x75\x87\x9c\x83\x42\x06\x43\xd9\xe8\x26\x6d\xe7\x5c\xa2\xc9\x26\x4f\x36\x11\xb3\xfc\x5f\xb7\x1b\xb2\xeb\x9b\x0e\xb9\xf4\x3b\x9d\xb7\xcb\xe3\xec\x5f\x20\xf7\xa5\xe5\x1c\x40\xb5\x68\xaa\x8f\xf6\xb6\xcc\x19\xad\x2d\xee\x62\x3b\x6c\xd5\x9b\x7c\x11\x92\xf9\x7b\x99\x2f\x62\xff\x10\x7f\xa6\xb1\x90\xe4\x6d\x2a\xa2\x7b\x72\xcb\x40\xe8\x7a\xcc\xf2\x2c\xf9\x22\x7e\x4a\x08\xef\x35\x5d\xb6\xf9\xd9\xc6\x64\x2d\x78\xa2\x44\x7e\x98\x5e\x9c\xae\xec\xe4\x19\xee\xb9\x11\xa1\x4a\xef\xe6\xe7\x0c\xf6\xac\xb7\x5b\xe8\xc2\x43\xa3\x52\x3d\x83\xd3\x89\x97\x4c\x15\xb0\x9e\x67\xed\xf7\x2b\xf1\x30\x56\x62\x5c\x48\x36\x4e\x3a\x38\x74\x03\x86\x79\xcf\xb6\xe0\xc5\x0e\x1c\xa8\x69\xe6\xe9\x0c\x4a\x80\x05\x0a\xae\x6b\xce\xfd\xf9\xed\xed\x57\xc9\xf2\x89\x2b\x03\x5e\x31\x15\x5d\x45\x2c\x5b\x5d\x99\x37\x3c\xcb\x49\xb1\x44\x24\x74\x56\x6c\x3b\x64\x33\x91\x48\x53\x93\x98\x2d\xee\xc8\x0d\xcb\x56\xe5\x8b\x4f\x3d\xea\xa7\x43\x04\xce\x84\x08\x05\x42\xbd\xd4\x6d\xfc\x43\x04\x57\xf0\x0c\x39\x9b\x29\x5f\x84\x15\xa1\x38\xd5\xf6\x79\xd6\xa5\x36\x1f\x71\x72\x1e\x17\x4e\xf9\xd2\xc3\x53\x76\xe3\x3d\x7d\xb0\x64\x1b\x31\xe2\x91\xa0\xe9\x1d\x0a\xdd\x31\x8b\x89\xd8\xb0\x3c\x4f\x62\x26\x49\x49\x83\x5c\x2d\x35\x49\x4f\x3d\x6f\x67\xdc\xe6\x27\xc7\x6d\xee\xa1\x0e\x5d\x82\x3e\xe4\x91\x29\xb8\xb2\x43\xa6\x68\xbc\x4e\xf8\xb3\x23\x54\x32\xa2\x29\x9b\xfe\x1a\xa0\x7f\x98\x16\xbe\x0a\x32\x37\x17\x1d\xfc\xb4\x16\x54\xb2\xbf\x94\xfb\x86\x70\x11\xb7\x99\x54\x1f\x41\x91\x58\x52\xc5\x1e\x5a\xd9\xe1\xb8\x22\x54\xed\x4f\x82\x70\xfa\x94\x2a\xc7\xb3\xc0\x08\x74\xf6\x3c\x82\x9e\x0d\xc9\x54\xcd\xaa\x85\x1a\x27\xb1\x95\x0b\xbf\x5b\x07\xdd\xb5\x3b\xf8\x7a\x36\x25\xbf\xe0\xe3\xc3\xa2\x17\xe6\x42\xa1\x18\x78\x2b\xd6\x34\x09\x2d\xb2\x51\x6f\x5e\x47\x5f\x75\x87\x30\x2b\x9f\x25\xe6\x61\xa7\x80\xcb\x5d\xb2\x2c\xb4\x4e\x67\xf4\xb0\x67\x05\x30\xb7\x23\xba\x3c\x5f\x80\xb9\xe3\xab\x41\x38\x26\x27\x1b\x17\x59\x49\x2c\x76\x29\x81\x95\x94\x3e\x50\x22\x19\x97\x09\x38\x64\x1c\xaf\xb8\xa9\xf4\x87\xa5\x25\x31\x08\x12\x45\x9c\x11\xf9\x20\x96\x09\xb7\xa7\x57\x18\x7f\xdd\x1d\x4d\xd2\xae\x93\x71\x96\x49\x9e\x5c\x26\x91\x32\x7d\xc7\xe9\x22\xed\x12\x6e\xe0\x6f\xb5\xb2\x21\x79\x9f\xd2\x25\x61\xf0\xc7\x55\x9c\x48\xfd\x2f\x99\xcf\x3f\x80\x11\xbe\xe0\x56\x62\x06\x03\xb5\xa1\x7d\x65\x92\x02\x1e\xc4\x61\xcf\x0e\x92\x9e\x1e\xe8\x7f\x4e\x4b\x92\xf0\x58\x77\xdc\x29\x05\x87\x41\x52\xf0\x04\xe2\x21\x96\x31\xbf\x18\x36\xb0\x60\xe4\xcb\x2a\x89\xee\x67\x8e\xdd\x5d\xe4\xfa\x1a\x77\x2e\x79\x0c\xac\x7e\x6f\x48\x6a\x69\xba\x3a\x0b\x57\x8d\x9d\x96\x96\x0f\x58\x82\x31\x37\xe3\x87\x7b\x54\x4a\x11\x25\x95\xcf\x05\x6c\x34\x15\x73\x88\x81\x39\x0c\x3b\x26\x10\x0f\x42\x87\x83\xf2\xc7\x1e\x8e\x66\x57\xd3\x56\xc7\x95\x2e\x07\x4b\xb8\x1d\xf5\xa0\x43\xc0\x3d\xd3\x03\x1a\xbd\x6a\xb8\x0b\x8d\x6e\x85\xe1\x9a\x63\xc1\x86\xa9\x9b\xc5\xb3\x82\x98\xad\xcd\xb9\xb3\x7c\x25\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xd2\x36\xf6\xa9\xe1\x35\x6f\x22\x5e\x33\xae\x06\x38\x73\x99\xc8\x8a\x14\xe3\x39\x8e\xc7\x77\xb7\x36\x63\xfc\xce\x40\xae\x87\x53\xa0\x96\x5e\xba\x81\xbd\xe1\x91\xce\xdf\x06\x76\xa9\x23\xdc\xbd\xfe\xc3\x4f\x3f\xbd\x74\x34\xd3\xae\x2a\xf8\x63\xc0\x99\x76\x34\xd1\xee\xc9\x2f\x9a\x9e\xf3\x8b\xbe\xdf\xfc\xa2\xc7\x47\xa1\x1d\x38\x83\x28\x30\x36\x37\x2c\x2e\xb7\x7b\x8e\x50\xe7\xe8\xdd\xd0\xc8\xdd\x80\x2c\xa0\x61\x73\x7f\x82\x63\x59\x43\xf2\x7c\xce\xd9\x3d\xdf\x6a\x76\x4f\x9f\x58\xd6\xf0\x4c\x9e\x90\x18\xd6\x6f\x31\x6b\x27\xe0\x70\x76\xcf\x2e\x39\x3a\xa7\x24\x1c\x04\x30\xdc\x9e\xd6\xa7\x20\x55\xd5\x72\xaf\x06\x69\x93\xca\x2d\xf6\xd8\xe5\xa5\x74\xa0\xc5\x94\xd0\x27\xf0\x24\x0a\x09\x09\xd0\xc6\xf0\xf5\x22\xa4\x36\xa4\x69\xf3\xeb\xbc\xe6\x98\x29\x2f\x3f\x8d\x3f\xe6\x7b\x70\x78\x9c\x6b\xba\xbc\x10\x93\xbb\xf4\xd0\x5a\xac\xb5\x02\x48\x00\x30\x72\xb1\x70\x51\x22\xab\xa3\x73\x3d\x9b\x6a\x1d\x1c\xd2\x88\x68\x2a\x27\x64\x0f\x9f\xb7\xe6\x52\x23\x17\x58\xfe\x4e\x95\x62\xeb\x4c\x75\x5f\xf5\xb3\xc5\xfd\xc9\x2d\xee\x03\x5a\x00\x57\xc5\x9a\xf2\xb1\x3e\x51\x60\x73\xf7\xbc\x75\x35\xca\x3c\x21\xe6\xec\x20\x7b\x02\x0b\x08\x24\x17\xf8\x85\x8d\xa9\x53\xe6\xf2\x71\xcc\x9e\xf0\xee\xde\x23\x47\xbe\x5a\x3b\x69\x91\xd8\x09\x78\x35\xc3\x29\x67\xc1\x1e\x2a\x87\x39\x7b\x6a\xb8\x5a\x31\xe4\xe1\x33\x48\xc8\xa9\x9e\xf2\x25\x69\x14\xa5\x69\x9a\x8a\x07\xfc\xb6\xcb\xd7\xf4\xec\xeb\xbe\x98\x4c\xb3\x05\x23\xeb\x44\xeb\xe8\xc6\xc0\xea\x76\x07\x5d\xa6\x5a\x22\x67\x39\x0a\xbc\xb9\x71\xb6\xcd\x99\x32\x0b\x05\x0b\xad\xf5\x5b\x8e\x01\xe1\xfa\xff\x36\xaa\x08\xbe\x6d\x69\xc2\x82\xad\xe8\x26\x11\x45\x8e\xad\x95\x20\x17\xe6\x16\xf0\x86\xad\x28\x4a\x7b\x17\x16\xc3\x2c\x47\x27\xf7\xcc\xd3\xa7\xea\x26\xa8\x02\xb1\xb0\xa6\x89\x31\xfb\x2d\x91\x6a\x77\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x23\x33\xcd\x16\x82\xab\xda\x79\xed\x7c\x79\x65\x33\x87\x5b\x2f\xa8\xa6\x5d\x2b\xba\xeb\xc9\x44\xa0\xef\x50\xfc\x29\x3d\x61\x69\x12\x6d\x83\xcb\xbd\xd5\x5a\x5b\xa2\x2d\x4b\x1f\x9a\xbe\x4e\xde\x52\xc9\x62\xf2\x91\x72\xba\x44\x7d\xef\x87\xf9\xec\xed\xc7\x57\x7a\x5d\x41\x9f\x9c\xde\xee\x75\xb4\xcd\xdd\x97\x7f\x1a\x32\x5f\x64\x67\xe0\x3d\x58\xd5\x4e\xfb\x9e\x83\x1f\x34\x11\x86\x94\x7c\xa8\x1b\x58\xef\x1e\x16\x34\xab\xa7\xb0\xd6\x6b\x7e\xd6\x08\xcc\x66\x1d\x1f\x59\xe5\x33\xe1\x52\xd1\x34\x9d\xa5\x94\x5f\x67\x59\x2e\x36\xfb\xb5\x71\xaf\xaf\xf6\x41\xdb\x53\x0c\xf3\xb0\x17\x33\x9c\x7a\x70\x61\x73\x32\xad\xde\x3f\x21\x53\x55\x6a\xe1\x82\x03\x4b\xbd\xb8\x2e\x94\x58\x53\x95\x44\x17\x5a\x59\xbf\xf8\x48\x79\x41\xd3\xbd\x41\x57\x07\x87\xd1\x24\x22\x1e\x6c\xd4\x0c\x5d\xd7\xa1\xd9\x41\x59\xe3\x70\x7b\x45\x73\x4d\x9d\x6e\xe6\x7f\x0d\x6a\x2b\x15\x55\xc5\x0e\x15\x3e\xc0\x19\x9a\x79\xc1\x98\xa4\x54\xaa\xaf\x59\xac\x0f\x7d\xed\xee\x21\x82\x1f\x51\x45\x53\xb1\xfc\x33\xa3\xe9\xfe\x1d\xee\xed\x93\x1b\xf7\x69\x6b\x80\x32\x0e\xff\x62\x51\x3e\x78\x29\x89\x16\xb0\x6d\x0e\x7c\xce\x52\xb6\xa1\x5c\xd9\xe6\x58\x5c\x5d\x5e\x9a\xf1\xc3\x2e\x4a\x2a\xe3\x6b\xcc\x14\xcb\xd7\x09\xf7\xdf\x39\x87\x67\x6f\x04\x8f\x13\x34\x3b\x82\x41\x0d\x5b\xf8\xef\x6d\xde\x6a\x4d\x9e\x86\x03\xbe\x05\x1f\x5d\xd3\xe9\x8f\x3f\x15\xf8\xd8\xc2\xc8\x97\x2b\xbc\x08\x9e\x76\xaf\x6f\x3b\x33\x45\xee\xb9\x16\x0c\x01\x47\x64\x3f\xd9\x6a\x95\x13\xda\xe4\x83\xb1\x5d\x63\xec\x42\x73\xe0\xe8\xd8\xf4\xbb\xc9\x07\x71\x68\x8b\xe1\xaf\x5d\xb2\xa8\x77\xa5\x99\xa6\xee\xdb\x77\x65\x33\xcc\x64\xa9\x15\xe4\xf7\x1e\x6a\xe6\x01\x9d\x04\xaf\x6e\x32\x52\x57\x54\x7b\x9f\xd6\x56\x18\xec\x3b\xaa\x6c\x07\x89\xb1\x95\x69\x75\x04\x97\xf7\x15\xeb\xa9\x89\xff\xcb\x8d\x2a\x42\x49\x96\x30\x04\x3f\xa1\xdc\x4c\x16\x70\x16\x46\x63\x73\x51\x73\x30\xad\x12\xc2\xbd\x91\x71\x86\xa3\x71\xd9\xc4\x5a\x58\x03\x35\x45\xf0\x0f\x70\x5c\x5c\xfd\x22\x8c\x91\xd7\x24\xe9\x6a\x1a\x00\x9c\x7c\x44\x64\x11\xad\x08\x95\xba\x6b\x7a\x43\xeb\x13\xcf\x26\x6b\xca\x93\x3b\x26\xd5\xa4\x44\x09\x96\x7f\xff\xf1\x1f\x13\xf2\x5e\xe4\xc4\x04\xaa\x8f\x2c\xaa\x86\xe9\x67\xb5\x2f\x12\x89\x83\x29\xdb\x56\x5a\x6b\x26\x62\xd3\xe9\x07\xe8\xac\xa2\xf7\x9a\x87\x61\x67\x0b\x06\xae\x8b\x3f\x91\x0b\x2d\x26\x3a\x9f\xfe\x97\x66\x4b\xff\xbe\x20\x3f\x3c\x00\xd3\xbe\xd0\x7f\x5e\xe0\x07\xcb\xb0\x49\x57\xa9\xae\x3e\x8c\xc9\x92\x79\xb2\x5c\xb2\x1c\xd5\x47\x02\x49\x85\xaf\x0c\x2a\x08\x17\xce\xc3\xd6\x29\x5d\xa9\x9b\xf5\x8e\xfc\xfd\xc7\x7f\x5c\x90\x1f\xfc\x71\x91\x84\xc7\xec\x37\xf2\x23\x5a\x97\x13\xa9\xc7\xf8\xca\x38\x73\xe4\x96\x2b\xfa\x9b\x7e\x67\xb4\x12\x92\x71\x54\xe5\x95\x20\x2b\xba\x61\x44\x0a\xad\x01\xb3\x34\x1d\x1b\x5b\x3a\x79\xa0\x80\xd4\x62\xa7\x12\x12\xeb\x49\x46\x73\xe5\x6d\x89\x89\xb1\x90\xc0\xd7\xf4\xb2\x2d\xb9\xf5\x4c\xdf\x25\xdc\xf8\xaf\x8c\xe7\x4c\xaf\x39\x24\x86\xe2\x22\x29\x41\xa2\x15\xe5\xcb\x32\x37\xfd\xae\x50\x45\xce\x5a\x5c\x3f\x1d\xcf\xc0\x7d\xc2\x83\x52\x98\xff\x92\xf0\x7a\x50\xc1\x7e\xbb\xd2\x32\x51\x36\x2b\xc2\xc4\x2a\xaa\xed\x95\x5e\x85\x3c\x59\x14\x4a\xe4\xf2\x2a\x66\x1b\x96\x5e\xc9\x64\x39\xa6\x79\xb4\x4a\x14\x8b\xf4\xb0\xae\x68\x96\x8c\x23\xc1\xf5\x8a\x03\x2a\xc3\x3a\xfe\x3d\x94\x37\x1d\xeb\xae\xb6\xa0\x4e\x77\x1c\x74\xbb\x51\xed\x49\x8d\x69\x83\x8d\xb1\x83\x3d\x68\x77\xa0\x68\x9b\x39\xc1\x68\xc1\x10\x72\x35\xc8\x60\x2d\x68\x72\x38\x8f\xb9\x34\x38\xe0\x51\xfd\x1d\xfa\xd8\x61\x00\x09\x9c\x4a\x8f\x52\xae\x69\x8c\xa4\x94\xf2\xed\xa3\x6f\x7e\x3d\xa5\x00\x97\x1f\x6d\xc7\xf0\x0a\x91\x8e\x29\x8f\xf5\xff\x31\x61\x27\xda\x0e\x32\x87\x45\x12\x44\x08\xbe\x4e\x6f\x4f\x73\x24\x8a\x64\x80\x53\x6f\xe4\xb5\x8e\x42\x14\x8a\xaa\x18\xa8\x91\x17\xcc\x32\x4d\x5f\x40\x4d\xa4\x7d\xeb\x7f\x1a\xff\x4b\x89\x76\xd6\x26\x52\x1d\xf6\x9a\x38\xb2\x63\xc7\xfe\x7e\xa8\x5a\xb8\x36\x39\x08\xbc\xa2\x52\x19\x68\x2d\x8b\x41\xe0\x0d\xc3\x2a\x28\xc0\x60\x9a\x1d\xc3\x9d\xf6\x90\x8d\x17\xd0\x1d\x19\xef\xc5\x5c\x8a\x4a\xa5\xa4\x5d\x81\xaa\xf4\x17\xaf\x0e\x1a\x0e\x4a\x31\xa9\x08\xdd\xd0\x24\x05\xeb\xbc\x58\x48\x96\x6f\xb0\x20\x95\x81\x1a\xa4\x75\x3d\xcb\xd4\x9c\x40\x31\xea\x44\x9a\x8f\x1d\xc3\xee\xaa\x1c\x1a\x00\x68\x43\xb5\xde\x37\xf6\x7a\x10\xbd\x07\xd5\xcb\xc6\xdb\xfa\x0b\x3d\xd5\x18\xbd\xff\xfe\xcc\x68\xae\x16\x8c\xaa\x2f\xc9\x21\xbe\xbb\xb3\xa5\xbd\x76\x65\x29\xf7\x72\x43\x3f\x30\xb2\x14\x4a\x8b\x58\x05\xec\x7d\x94\x49\x11\xd4\xa7\xdc\x68\x8f\xbd\xa3\xab\x51\x7e\xc9\x29\xa4\xf8\x08\x1e\x38\x4c\xbf\xe1\xee\x38\x8d\x74\x6c\x76\x92\xc2\xa7\x11\x48\x43\x70\x66\xd6\x0e\xbd\x19\x40\x81\x4e\x33\xe4\x35\x93\xf2\x20\xc0\x86\x1f\x5d\x88\x4f\xe3\x51\xae\xb9\xd6\xd6\xf6\x1e\xa6\x85\x68\x01\x3a\x66\x8a\x26\xa9\x3d\xca\x38\x15\xe5\x2c\xb5\x51\xd7\x83\x03\xcc\x19\x95\x87\x04\x04\xaf\xd7\x9f\xe1\x61\xec\xb4\xe0\x6c\xfc\x20\xf2\x98\xdc\xd0\x35\x4b\x6f\xa8\x64\xe6\x5d\x6e\x8a\x1e\xae\xd1\xa5\x1c\xb4\xcb\xfb\x6d\x5f\x0d\x5d\x46\xe3\x4f\x65\x12\x86\xbf\x2a\x15\x0b\x3b\x38\xb2\x26\xc8\x2f\x79\xc1\x46\xe4\xbd\xe6\x5e\x23\xf2\x95\xdf\x73\xf1\x70\x5c\x5f\xd5\x41\x2f\x88\xd7\x53\x37\xfc\xc3\xc2\xea\x78\x06\x9f\xb2\xbb\x3d\x7b\x64\x08\x7e\x83\xa9\xd1\x67\x36\xe5\xa3\xb6\x47\xfa\xbf\x3b\x26\x28\xad\x28\xe6\x62\x99\x33\x89\xc8\x35\x7b\x41\x12\xbb\x9a\x9c\x7f\x61\xdc\x24\xf7\xb5\x76\x6f\xba\xaf\x95\xed\xa9\xe5\x6b\xcb\xea\x8e\x59\x6f\xf3\xb1\x2c\xdd\x2b\x6a\x1c\x8e\x08\x74\x3a\xda\x60\x7c\x6a\xea\xe1\x7e\xa3\x93\xc3\xf5\x9c\x67\x51\x28\x39\x64\x1d\xb5\xa3\xbb\x99\xff\xb5\x79\xb2\x1b\x79\x5f\x1b\x7f\x6a\x37\x4b\x1d\x6b\x90\x6a\x3d\x33\xad\x46\xa8\xb3\xf9\xe9\x6c\x7e\x7a\x49\xe6\xa7\xd6\x1d\x7f\xc8\xe4\xf4\x32\x8c\x4d\xad\x43\x3c\x64\x60\x7a\x96\xa6\xa5\x4e\x23\x3a\x68\x4e\x7a\xb6\x86\xa4\xd6\xa1\x75\x34\x1e\x7d\x3f\x66\xa3\xd6\x19\x3b\x60\x2a\x7a\x86\x46\xa2\x2e\x02\x19\x8b\xbb\x88\x89\x53\xe7\x61\x57\x50\xac\xca\x59\x96\xaf\xb3\x41\x39\xae\x38\xd3\x57\x5a\xd4\x02\x5c\x6b\xdf\x2e\x4d\xe7\xba\xcb\x5e\x46\x60\x34\xc5\x1e\x77\x3a\x4b\x6e\xdf\xcd\x3e\xbf\xbb\xb9\xfe\xf2\xee\xb6\x2e\xdf\xed\x9b\xe9\x16\x49\xec\xb0\x0d\x62\xec\x48\x62\x0d\x0f\x68\x82\xdc\x70\x4b\xef\x81\x86\x5b\x45\x91\xec\x6b\x75\xbc\x5c\x78\x14\x97\x3b\x8a\x7f\xb4\x9f\xce\xae\xc7\xf3\x2b\x06\x4e\x51\x13\x73\xa6\xe5\x9e\x95\x48\x63\x69\xe3\x56\xa7\xb7\x65\x26\x55\xc2\xa3\xb4\x88\xb5\x70\xf1\xf5\xeb\xf4\x56\x4e\x08\x79\xcb\x22\x5a\x48\xb0\xc2\xc4\x82\x5f\x2a\xf2\xeb\xa7\x0f\x7f\x83\x78\x6c\x78\x62\x54\xe2\x9a\x00\x2a\x6f\x42\x11\x58\x58\x21\x5c\x1b\x79\xcb\x50\x50\x81\x2f\x47\x34\xd3\x54\x4c\x62\xe5\x0a\x05\xb2\xc8\x8a\xa5\x99\xa6\x98\xf7\x8c\x54\x08\xaa\xfa\xc5\x55\x85\x79\x1b\x3e\xb9\x64\x0a\xb3\xae\x0e\x45\x48\x1e\x9c\xb5\x16\x8b\xeb\x11\xb6\x56\x4f\x7d\x34\xda\xf8\x03\x95\xc6\x62\xb5\xb7\xb7\x2d\xeb\xdb\x6e\x9f\x69\x36\x71\x34\x18\x37\x90\x3c\xc3\x5f\x3b\x7d\xd6\x9d\xad\xec\x18\x18\x44\x92\xa8\xce\xd6\xd4\xe6\x30\xa0\xfd\x75\x00\x76\x6c\x19\xac\x3e\xc9\xde\x87\xcb\x88\x6c\xa7\xcb\xdd\xfa\x02\x45\x44\x62\xaf\xf6\xa7\x89\x9f\xf3\xaf\x15\x8b\xb2\xfa\x6b\xd5\x5f\x63\x91\x21\xff\xfa\xf7\xef\x7e\xf7\xff\x01\x00\x00\xff\xff\x6c\xfc\xad\x6c\x34\x86\x0b\x00") -func olmManifests0231CrdsYamlBytes() ([]byte, error) { +func olmManifests0240CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0231CrdsYaml, - "olm-manifests/0.23.1-crds.yaml", + _olmManifests0240CrdsYaml, + "olm-manifests/0.24.0-crds.yaml", ) } -func olmManifests0231CrdsYaml() (*asset, error) { - bytes, err := olmManifests0231CrdsYamlBytes() +func olmManifests0240CrdsYaml() (*asset, error) { + bytes, err := olmManifests0240CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.23.1-crds.yaml", size: 755252, mode: os.FileMode(420), modTime: time.Unix(1678830330, 0)} + info := bindataFileInfo{name: "olm-manifests/0.24.0-crds.yaml", size: 755252, mode: os.FileMode(420), modTime: time.Unix(1687806533, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0231OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\x1b\xb9\x11\x7f\xd7\x5f\x31\x10\x0a\xb8\x2d\xb2\x92\x95\xc8\x89\x6f\x81\x00\xe7\x3a\xb9\xcb\xa1\xb6\x23\xd8\x49\x5f\x0e\x87\x82\xcb\x1d\xad\x58\xf3\x63\x8f\xe4\x4a\xd1\x15\xfd\xdf\x0b\x2e\xf7\x5b\x94\x2c\x3b\xb9\x4b\x51\x84\x2f\x92\x96\x33\x9c\xe1\x70\x38\x1f\x3f\x6d\x14\x45\x23\x92\xb3\x7f\xa0\x36\x4c\xc9\x18\xd6\xb3\xd1\x3d\x93\x69\x0c\x37\x44\xa0\xc9\x09\xc5\x91\x40\x4b\x52\x62\x49\x3c\x02\x90\x44\x60\x0c\x8a\x8b\x11\x00\x27\x09\x72\xe3\x9e\x02\xe4\x2a\x8d\x0c\xd2\x42\x33\xbb\x9d\xdc\x17\x09\x6a\x89\x16\xcd\x84\xa9\x29\xca\xa5\xd2\x14\x63\xd0\x68\xac\x66\xd4\x62\x7a\x24\x4b\xb4\xae\xb5\xe2\xc4\xa2\xb1\x0f\xb1\x91\x22\x65\xf6\x31\x72\x4a\x86\xc7\x4a\xd9\x10\x2d\x1f\x23\xc4\xd1\xef\xc8\x78\x9a\xd9\x73\xd4\xc4\x2a\x6d\x9e\x60\xfc\x84\x18\xe4\x4c\xe2\x37\xd3\x3b\xd3\x7b\x5b\xdf\xa1\x5e\x33\x8a\x17\x94\xaa\x42\xda\xe1\x79\x04\xdd\x3e\xaa\xcf\x20\x32\x9e\x99\x54\xcc\x9e\xa6\x3c\x39\x7f\x3f\x86\x27\xac\x13\x42\x27\xa4\xb0\x2b\xa5\xd9\x6f\xc4\x32\x25\x27\xf7\xe7\xa5\x96\xcd\xd9\x5f\xf2\xc2\x58\xd4\xb7\x8a\x87\x4e\xdf\x6c\x8d\x45\x11\x53\x25\xad\x56\x9c\xa3\x8e\x1b\x5d\x38\x5b\x22\xdd\x52\x8e\x91\x20\x92\x64\xa8\x47\xba\xe0\x68\xe2\x51\x04\x24\x67\x3f\x6a\x55\xe4\x26\x86\x9f\xc7\x7f\x1d\xff\x32\x02\x67\x3f\x55\x68\x8a\x9d\x47\x6b\xd4\x49\xf3\x33\x02\xa9\xe4\x6d\x45\xf4\xf1\xf6\x6a\x2f\xdd\x67\xed\xf0\x6f\x4c\xa6\x4c\x66\x0f\x99\x39\xf1\x64\x91\x33\xa9\x56\x1c\x6f\x71\xe9\x28\xeb\x6d\x1d\x90\x3a\x02\xd8\x35\xeb\x93\x8c\x69\x8a\xe4\x5f\x48\x6d\x69\xcf\xa0\xe7\x7c\x11\x07\x69\x6e\xf7\x84\x2a\x8d\xca\x7d\x88\xd6\x72\xef\xaf\xae\x2f\x95\x5c\xb2\x90\xc1\xa8\xdf\xe0\xce\x8a\x24\xcf\x4d\xbb\xc2\x1b\xcc\xb9\xda\x0a\x94\xf6\x01\x9b\xef\xaa\xda\x0f\x37\x24\xcf\x07\x0c\x26\x47\xea\xe6\x8c\xd5\xc4\x62\xb6\xf5\x74\x76\x9b\x63\x0c\xb7\x8a\x73\x26\xb3\x8f\x79\x4a\x2c\x96\xde\x97\x73\x46\x89\x89\x61\xe6\x38\x90\x23\xb5\x4a\x7b\x0e\x41\x2c\x5d\x5d\x75\x44\x85\x84\x01\x58\x14\xb9\xbb\xcc\x15\x53\x67\x33\x6e\xf0\x1e\x7f\x78\x05\x80\x5a\xe5\xf2\x7b\x15\x3d\x2e\x95\xb4\xf8\xc9\xb6\xac\xba\x90\x17\xe6\x46\xc9\x5b\xa5\x6c\x0c\x56\x17\xd8\x4c\x19\xa4\x54\x89\x7c\xa1\xd5\x92\x71\x6c\x59\x9a\x6d\x17\xd2\x32\x81\x6f\x70\x49\x0a\x6e\x1b\x41\x5d\xb7\xb9\x39\xc2\x67\xdc\x70\x4e\x4a\x98\x44\xdd\xd9\x54\x14\x3e\xb7\x8e\x76\xe1\x1d\x95\x06\xe1\x5c\x6d\x16\x9a\xad\x19\xc7\x0c\xdf\x1a\x4a\x78\x79\x6f\x62\x58\x12\x6e\xb0\x47\x4b\x49\x4e\x12\xc6\x99\x65\x68\xfa\xab\x00\xa4\x5a\xe5\x31\xfc\x0c\xe3\x8b\xab\xab\x31\xfc\xd2\x99\xa5\x4a\x08\x22\xd3\x2e\x43\x04\xd3\x84\xc9\xa9\xf7\xa6\x46\x13\x9d\x99\x3e\x51\x14\x35\xae\xd7\x7b\xfe\xa7\x3f\xbf\x5f\xbc\xbd\xbd\xf8\xf0\xfe\xf6\x9f\x37\x17\xd7\x6f\xef\x16\x17\x97\x6f\xff\x32\xe0\xdc\x68\x66\xf1\xce\x12\x5b\x18\x67\xda\xde\xec\x78\xdc\xf9\xc9\x04\xc9\x30\x86\x5f\x0b\xb2\x75\xd1\xa9\xb1\xfe\x52\x13\x81\x1b\xa5\xef\x9d\x9a\xdf\x9b\x15\x79\x7e\xf6\x32\x7e\x41\x97\x74\x7e\xba\x24\xf3\xe4\xd5\xab\xef\x96\x38\x4b\xbf\x3b\x9f\xbd\x4a\xe9\xfc\x6c\x4e\x5e\xa6\xaf\x4e\x67\x2f\xce\xf0\x7c\xbe\xc4\x84\xcc\x96\x4b\x3a\x7f\x79\x4e\xe7\x38\x7f\x31\x4f\xf1\xd5\x59\x92\x3c\x27\xf4\x6c\x28\x77\x51\x70\xbe\x50\x9c\xd1\x6d\x0c\x3f\x2d\x6f\x94\x5d\x68\x34\xd8\x1c\x36\x94\x19\x4d\xdb\x81\xb5\xa3\xd6\x0b\x16\x4a\xdb\x18\xce\x4f\xcf\x4f\x07\xe7\xe1\x3d\x42\xa0\x4b\x8e\xa6\x33\xc7\xd9\x1a\x25\x1a\xb3\xd0\x2a\xc1\xfe\xb2\x2b\x6b\xf3\x1f\xd1\x0e\x4f\x36\x27\x76\x15\xc3\x74\x85\x84\xdb\xd5\x6f\xc3\xc9\x7d\xf2\x0d\x5d\xa1\xd3\xe0\xdd\x87\x0f\x8b\xce\x94\x46\x92\xb2\xaf\x28\xdf\xa2\x16\x4c\x96\x1e\x7e\x8d\xc6\xb8\x23\xa8\xcc\xff\x03\xe1\x3c\x21\xf4\xfe\x83\xba\x52\x99\x79\x2f\xdf\x6a\xdd\xbb\x45\x28\xd7\x7d\xef\xf4\x16\xde\xf5\xc4\x9e\x22\x6b\xc2\x0b\xfc\x41\x2b\x31\xdc\xd5\x92\x21\x4f\xab\xfc\x15\x98\x59\x94\x9b\xae\xa3\xd9\x24\x7c\x0f\x02\x1a\xec\x0a\xdf\x1b\x16\xda\xcc\xdf\x63\xd2\xf8\x6b\x81\x66\xe8\x72\x00\x34\x2f\x62\x98\x9d\x8a\xc1\x63\x81\x42\xe9\x6d\x0c\xb3\x97\xa7\xd7\xac\x9a\x93\x2a\xc5\xbb\x5e\x2c\x77\xa3\x5f\x8d\x29\x13\x03\x67\xb2\xf8\xf4\x39\x89\x8a\x12\x4b\xb8\xca\x1e\x97\xac\x76\x98\x7e\xef\x84\x15\xd0\xf2\x09\x49\x2b\xb0\xca\xff\x4d\xe2\x0a\xee\xed\x81\x5d\xc1\x57\x4e\x5e\x95\xce\x07\x13\xd8\x49\x27\x83\x9d\xf4\x66\xfa\xa9\xcf\x25\x2c\x5a\x16\x74\x82\xe4\xae\x9c\x44\xfd\x93\x4b\x0f\xaf\x0f\x64\xa5\x86\xbe\xb5\xbb\xc6\x8c\x19\xab\xb7\x71\xa7\x81\x6a\x05\x14\x96\xf1\xa8\xcc\x3a\xbd\x89\x3f\x3e\xf3\x39\x65\x0c\xda\xc8\x89\xe0\x8a\xa4\x51\x61\x50\x47\x2c\x7d\xdd\x73\xcd\x6f\x99\xb9\x1d\xdf\x32\xf3\xa1\xcc\xfc\x65\x13\xd9\xf9\xe7\xe4\xb1\xdd\x1e\xf3\xe8\x9e\x78\x37\xbb\x91\x2c\xd3\x98\x11\x8b\xae\xdf\x8d\x30\x65\x76\x90\xce\xf6\xaf\xd7\xb2\x5a\x15\x91\x54\x30\x19\xc3\xd8\x5d\xaf\xf1\x63\x18\xb1\x84\x71\x2a\xbe\x30\x88\x10\xea\x53\x77\x71\x05\x53\x24\x86\x6a\x96\x3b\x49\xa6\x8f\x1d\x50\x8d\xc4\xe2\xf8\x19\x8c\x8b\x32\xc7\xba\x6f\xb9\x4b\xa4\xee\x4b\x8a\x1c\x2d\x96\x28\xc4\x13\xa4\x56\x9d\x70\x95\x8d\x2a\xe4\xc7\xb8\x75\xab\xd8\x5d\xd1\xba\x27\x4c\x1a\x4b\x38\xcf\x39\xf1\x14\x07\x34\x6e\x95\xfa\x7d\x0f\x7c\xcd\x70\xf3\x35\x0f\xfc\x11\x7c\x4e\xd5\x2f\xe2\x28\x5f\xee\xc8\x9e\x41\x23\x32\x2b\x95\xe8\x1f\x62\x86\xd6\x91\x70\x66\xca\xcf\x4d\xe9\x71\x3b\x7e\x96\x13\x7a\x4f\x32\x34\x93\xe3\xb4\xaf\xc8\x05\x91\x6c\xe9\x22\x8f\xf7\xe5\xfe\xb3\x29\xa3\x4a\x1e\xa7\xcb\xe3\x20\xa1\x6a\xb6\x54\x3e\xe0\x5b\x19\x57\x09\xe1\x51\x17\x35\xee\x96\xca\xcd\xe3\x2f\x2b\xb5\x5b\x16\x0e\x45\x72\xd1\x54\xde\x96\xe8\x0c\x6d\x83\x76\x57\xde\x1e\x3d\x06\x19\x23\x3c\x5f\x91\x01\xb2\x58\x01\x73\x15\x6b\x40\xbd\xfa\x7c\xcb\x8a\xeb\xa1\xe6\x41\x71\x31\x69\xe0\xe3\xf5\xe9\xe4\xf9\x8b\xc9\xac\xd9\x41\xca\x4c\xce\xc9\xd6\x17\xc3\x0b\xbf\x2c\xdc\xd5\xeb\xa6\xd8\x78\x66\x0c\xb7\x98\xfb\x52\xc2\x00\x91\x8d\x05\x6b\x5d\xc0\xae\x88\x05\x66\x80\xac\x09\xe3\x24\xe1\x08\x4b\xad\x04\x10\xc8\x5c\x7d\x00\x97\xfe\x1e\xdc\x95\x5e\x07\x9b\x15\xa3\x2b\xd8\x30\xce\x4b\x4f\xe4\x6b\x04\xab\x80\x84\x0d\x30\x19\x01\x08\x26\xff\x5e\x24\xd8\x58\x73\x36\x99\xcd\x26\x2e\x43\xdf\xe3\x76\xa3\x74\xea\x1c\xf2\x64\xe8\xb3\x27\xcf\xe0\x44\x71\xe1\x3e\x6a\x8b\x9d\x38\x0f\x16\x84\x75\x6b\xfa\xba\x9a\xbf\xc5\x14\xde\x11\x5f\x29\xa1\x20\x8c\x97\x87\x26\xcd\x8a\x2d\x6d\xeb\x0d\xdf\x6b\x4c\x57\xc4\xba\xe3\x1b\x01\xe4\x5a\xad\x59\x8a\x55\x9a\x1d\xae\xc3\x99\xbc\xef\x89\xd8\xb1\x30\x40\xa1\x79\x5c\x16\x2a\x26\x9e\x4e\x33\x66\x57\x45\x52\xba\x46\xa8\x6c\xdc\x8b\xee\x4e\xad\x46\x9c\x0a\xe2\x8c\x37\xcd\xef\xb3\x69\xb5\xdf\xa8\x71\x91\x2a\xea\x5c\xab\x14\x2b\x8d\x7c\xa7\xf4\x7e\x23\x6f\x7a\x4d\xba\x29\x72\x57\x02\x61\xda\xb4\x5c\x35\xe9\x1d\x93\x19\xc7\x63\xa9\xaf\x0b\x6e\xd9\xb1\xc4\x17\x9c\xb7\xb7\x68\x0f\x6d\xb5\x03\x6f\xe9\xa6\xe7\x85\xb4\x6d\xb4\x61\xd0\x59\x56\x51\x79\xe1\x2a\x34\x53\x46\xe4\x7a\x26\x7a\x62\x33\xe8\x9a\x52\x8e\xbd\x4e\xb0\x0d\xbc\x83\x8a\x7a\x0f\x9c\xff\x40\xf5\x17\x41\x05\xd4\x13\x4a\xd1\x18\x8d\x2e\x47\x75\xcb\x6d\x1f\x7e\x87\xd5\x7b\x59\x8d\x0c\x1e\x66\x68\x1f\xd2\x73\x80\x29\x06\x75\x2a\x7b\x03\xdf\xb2\x1d\xd4\xa3\x2f\xd0\xfd\x76\x99\xa1\xf7\xa0\x4c\x11\x47\xe8\x14\x4c\x5b\x47\xe8\xd9\xcb\xb5\x7f\x90\xae\x87\x73\xed\xc3\x4a\x0f\x83\xd6\x93\xd5\x6e\x2f\x42\xc7\xcd\xc3\xf9\xc2\x8f\xee\x55\x01\x18\xe2\x48\xf5\x08\xe3\x49\x9d\x6d\x75\x67\x86\x3d\x8b\x20\x9f\x3e\xca\x26\x23\x78\xf0\x69\x30\x7f\x57\xe8\x6c\x30\xd3\x82\x55\xcf\x7b\x88\xca\xb0\xa3\x81\x30\x78\x55\x8f\x12\x7e\x0a\x6f\x7d\x88\x64\x35\xab\x0d\x10\xad\x7a\x0c\x91\xad\xa3\x44\xec\x5a\x18\x1e\x02\x86\xe0\x30\xec\xd5\x59\x63\x0f\xfc\xd5\x6c\x6f\x3f\x0c\xd6\x2e\xf2\xb4\x08\xe8\x47\xb8\xc7\xac\xc7\xbe\x5e\xb3\x4f\x15\x82\xd6\xfc\x38\xec\xb8\x47\x9b\xf2\x71\x48\x5b\xa5\xd4\x01\xbc\xcd\x8f\xfd\xa8\x5b\xbd\xad\x1d\xec\xad\xde\x55\x89\xc0\xed\xe4\xe6\x21\x55\xb4\x7e\x3d\x0f\x3d\xf6\x6f\x08\x60\xe4\x12\x63\x60\x7e\x7c\x36\x9f\xbf\x18\x07\x19\xab\x2a\x3a\x04\xc7\xd7\x44\x7d\x64\xcf\x8f\xaf\x85\x64\x75\xa4\x77\xf1\xac\x0b\xbe\x21\x5b\xb3\x43\x17\xc0\xb3\x20\x84\x69\x39\xf3\xec\x50\x1d\x40\xaf\xfc\xd8\x83\x21\xf9\xd1\xc5\x84\xee\x82\x14\x07\xb1\xa6\x56\xff\x3d\xda\x1d\x02\xb7\xfe\x07\xd4\x7b\x3a\xf6\x55\x6f\x2f\x58\x03\xd5\x93\x61\x1c\xcc\x8f\x3d\x68\x98\x1f\x35\x26\x76\xd6\x62\x62\xed\x58\x2b\x5e\x08\xbc\x76\x31\x2d\xe8\x35\x3e\xf2\x58\x91\x2f\x77\x5d\x0d\x40\x38\x3e\xff\x2f\xd7\xd4\x8a\x7c\x14\x5a\x7b\x6f\x38\x0b\x2f\x8a\x22\xb7\xdb\x37\x4c\xc7\xf0\xef\xff\x94\xdd\x89\x2d\xa3\x5a\x0c\x65\x6f\xe8\x3b\xee\x7e\xf7\x56\xbe\x3a\x52\x85\xe7\x14\x97\x4c\x32\xdb\x56\xb7\x6a\x23\x31\xad\x3b\xd1\xcc\xbf\x5f\x72\xb0\x48\xa9\x14\x5a\x77\x5e\x1b\xf2\x4f\x7c\x53\x5a\xf5\x2c\xd7\x55\x81\x52\x63\x8c\xdd\xf8\x3c\x2c\x5e\x42\x5d\xe5\x80\xbf\xd7\x5a\x5e\x0c\x89\xca\x46\xb2\x71\x0f\xc8\x50\x3a\xb5\x31\xf5\x3d\x25\x7e\x62\xc6\x32\x99\xf5\x9b\x4a\xd7\x96\xa6\x60\x57\xc8\x34\xf8\xb7\x4c\xae\xdb\x8a\xb5\x2d\x8e\x6e\xf6\x26\x96\x50\xb8\x78\x52\x17\xdf\xd5\xea\xc0\x1b\x70\xab\x22\x61\x2a\x6a\xff\x8f\xd9\x03\x32\x78\x1b\x7c\x28\x13\x7a\xa6\x73\x3a\xda\x1b\x97\xcb\x05\xeb\x3f\x78\xda\x3f\x53\x7a\xa7\x71\xa9\x84\x28\x24\xb3\xdb\xa6\x83\x77\x26\xca\x8b\x84\x33\xb3\x42\xdd\x42\x23\xef\x8a\xc4\x37\x2c\x4e\xe6\x42\xa5\xde\xa4\x55\xf7\xd5\x4f\xbc\xd5\x54\xff\x9d\x36\x0f\x8b\xde\xf5\x6a\xca\xfa\x8f\x9e\x85\xaa\xfb\x38\xd7\xd6\x59\xd4\x6b\xc2\x63\x78\x79\x2a\x46\xff\x0d\x00\x00\xff\xff\x5e\xc0\x76\x6d\xca\x29\x00\x00") +var _olmManifests0240OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\x1b\xb9\x11\xff\xae\xbf\x62\x20\x14\x70\x5b\xdc\xea\x11\xcb\x89\xb3\x40\x80\x73\x9d\xdc\xe5\x50\xdb\x11\xec\xa4\x5f\x0e\x87\x82\xe2\x8e\x56\xac\xf9\xd8\x23\xb9\x52\x74\x45\xff\xf7\x82\xcb\x7d\x8b\x92\x65\xc7\x77\x29\x8a\xf0\x8b\xa4\xe5\x0c\x67\x38\x1c\xce\xe3\xa7\x8d\xa2\x68\x40\x32\xf6\x0f\xd4\x86\x29\x19\xc3\x7a\x3a\xb8\x67\x32\x89\xe1\x86\x08\x34\x19\xa1\x38\x10\x68\x49\x42\x2c\x89\x07\x00\x92\x08\x8c\x41\x71\x31\x00\xe0\x64\x81\xdc\xb8\xa7\x00\x99\x4a\x22\x83\x34\xd7\xcc\x6e\x47\xf7\xf9\x02\xb5\x44\x8b\x66\xc4\xd4\x18\xe5\x52\x69\x8a\x31\x68\x34\x56\x33\x6a\x31\x39\x92\x25\x5a\x57\x5a\x71\x62\xd1\xd8\x87\xd8\x48\x9e\x30\xfb\x18\x39\x05\xc3\x63\xa5\x6c\x88\x96\x8f\x11\xe2\xe8\x77\x64\x3c\xcd\xec\x19\x6a\x62\x95\x36\x4f\x30\xfe\x82\x18\xe4\x4c\xe2\x37\xd3\x3b\xd3\x7b\x5b\xdf\xa1\x5e\x33\x8a\x17\x94\xaa\x5c\xda\xfe\x79\x04\xdd\x3e\xaa\xce\x20\x32\x9e\x99\x94\xcc\x9e\xa6\x38\x39\x7f\x3f\xfa\x27\xac\x17\x84\x8e\x48\x6e\x57\x4a\xb3\xdf\x88\x65\x4a\x8e\xee\xcf\x0b\x2d\xeb\xb3\xbf\xe4\xb9\xb1\xa8\x6f\x15\x0f\x9d\xbe\xd9\x1a\x8b\x22\xa6\x4a\x5a\xad\x38\x47\x1d\xd7\xba\x70\xb6\x44\xba\xa5\x1c\x23\x41\x24\x49\x51\x0f\x74\xce\xd1\xc4\x83\x08\x48\xc6\x7e\xd4\x2a\xcf\x4c\x0c\x3f\x0f\xff\x3a\xfc\x65\x00\xce\x7e\x2a\xd7\x14\x5b\x8f\xd6\xa8\x17\xf5\xcf\x08\xa4\x92\xb7\x25\xd1\xa7\xdb\xab\xbd\x74\x5f\xb4\xc3\xbf\x31\x99\x30\x99\x3e\x64\xe6\x85\x27\x8b\x9c\x49\xb5\xe2\x78\x8b\x4b\x47\x59\x6d\xeb\x80\xd4\x01\xc0\xae\x59\x9f\x64\x4c\x93\x2f\xfe\x85\xd4\x16\xf6\x0c\x7a\xce\xb3\x38\x48\x7d\xbb\x47\x54\x69\x54\xee\x43\x34\x96\xfb\x70\x75\x7d\xa9\xe4\x92\x85\x0c\x46\xfd\x06\x77\x56\x24\x59\x66\x9a\x15\xde\x62\xc6\xd5\x56\xa0\xb4\x0f\xd8\x7c\x57\xd5\x6e\xb8\x21\x59\xd6\x63\x30\x19\x52\x37\x67\xac\x26\x16\xd3\xad\xa7\xb3\xdb\x0c\x63\xb8\x55\x9c\x33\x99\x7e\xca\x12\x62\xb1\xf0\xbe\x8c\x33\x4a\x4c\x0c\x53\xc7\x81\x1c\xa9\x55\xda\x73\x08\x62\xe9\xea\xaa\x25\x2a\x24\x0c\xc0\xa2\xc8\xdc\x65\x2e\x99\x5a\x9b\x71\x83\x77\xf8\xc3\x2b\x00\x54\x2a\x17\xdf\xcb\xe8\x71\xa9\xa4\xc5\xcf\xb6\x61\xd5\xb9\xbc\x30\x37\x4a\xde\x2a\x65\x63\xb0\x3a\xc7\x7a\xca\x20\xa5\x4a\x64\x73\xad\x96\x8c\x63\xc3\x52\x6f\x3b\x97\x96\x09\x7c\x8b\x4b\x92\x73\x5b\x0b\x6a\xbb\xcd\xcd\x11\x3e\xe3\x86\x73\x52\xc2\x24\xea\xd6\xa6\xa2\xf0\xb9\xb5\xb4\x0b\xef\xa8\x30\x08\xe7\x6a\x33\xd7\x6c\xcd\x38\xa6\xf8\xce\x50\xc2\x8b\x7b\x13\xc3\x92\x70\x83\x1d\x5a\x4a\x32\xb2\x60\x9c\x59\x86\xa6\xbb\x0a\x40\xa2\x55\x16\xc3\xcf\x30\xbc\xb8\xba\x1a\xc2\x2f\xad\x59\xaa\x84\x20\x32\x69\x33\x44\x30\x5e\x30\x39\xf6\xde\x54\x6b\xa2\x53\xd3\x25\x8a\xa2\xda\xf5\x3a\xcf\xff\xf4\xe7\x0f\xf3\x77\xb7\x17\x1f\x3f\xdc\xfe\xf3\xe6\xe2\xfa\xdd\xdd\xfc\xe2\xf2\xdd\x5f\x7a\x9c\x1b\xcd\x2c\xde\x59\x62\x73\xe3\x4c\xdb\x99\x1d\x0e\x5b\x3f\x99\x20\x29\xc6\xf0\x6b\x4e\xb6\x2e\x3a\xd5\xd6\x5f\x6a\x22\x70\xa3\xf4\xbd\x53\xf3\x7b\xb3\x22\x2f\xce\x5e\xc6\xcb\xd7\x48\xce\x29\x2e\x5f\x9f\x11\xfa\x7a\x71\x3a\x9d\xbc\x98\xce\x26\xd3\x64\x76\xfe\xf2\xf4\xd5\x74\x4a\xce\x10\xe9\xeb\xc9\xec\xec\xf4\xe5\x62\x36\x7b\xfd\xea\xc5\x0c\x27\xcb\xc9\xe4\xf4\xec\xd5\xd9\xec\x9c\x9c\x4e\xf1\x55\x5f\xee\x3c\xe7\x7c\xae\x38\xa3\xdb\x18\x7e\x5a\xde\x28\x3b\xd7\x68\xb0\x3e\x6c\x28\x32\x9a\xb6\x3d\x6b\x47\x8d\x17\xcc\x95\xb6\x31\x9c\x4f\xce\x27\xbd\xf3\xf0\x1e\x21\xd0\x25\x47\xd3\x9a\xe3\x6c\x8d\x12\x8d\x99\x6b\xb5\xc0\xee\xb2\x2b\x6b\xb3\x1f\xd1\xf6\x4f\x36\x23\x76\x15\xc3\x78\x85\x84\xdb\xd5\x6f\xfd\xc9\x7d\xf2\x0d\x5d\xa1\xd3\xe0\xfd\xc7\x8f\xf3\xd6\x94\x46\x92\xb0\xaf\x28\xdf\xa2\x16\x4c\x16\x1e\x7e\x8d\xc6\xb8\x23\x28\xcd\xff\x03\xe1\x7c\x41\xe8\xfd\x47\x75\xa5\x52\xf3\x41\xbe\xd3\xba\x73\x8b\x50\xae\xbb\xde\xe9\x2d\xbc\xeb\x89\x1d\x45\xd6\x84\xe7\xf8\x83\x56\xa2\xbf\xab\x25\x43\x9e\x94\xf9\x2b\x30\x33\x2f\x36\x5d\x45\xb3\x51\xf8\x1e\x04\x34\xd8\x15\xbe\x37\x2c\x34\x99\xbf\xc3\xa4\xf1\xd7\x1c\x4d\xdf\xe5\x00\x68\x96\xc7\x30\x9d\x88\xde\x63\x81\x42\xe9\x6d\x0c\xd3\x97\x93\x6b\x56\xce\x49\x95\xe0\x5d\x27\x96\xbb\xd1\xad\xc6\x94\x89\x81\x33\x99\x7f\xfe\x92\x44\x45\x89\x25\x5c\xa5\x8f\x4b\x56\x3b\x4c\xbf\x77\xc2\x0a\x68\xf9\x84\xa4\x15\x58\xe5\xff\x26\x71\x05\xf7\xf6\xc0\xae\xe0\x2b\x27\xaf\x52\xe7\x83\x09\xec\xa4\x95\xc1\x4e\x3a\x33\xdd\xd4\xe7\x12\x16\x2d\x0a\x3a\x41\x32\x57\x4e\xa2\xfe\xc9\xa5\x87\x37\x07\xb2\x52\x4d\xdf\xd8\x5d\x63\xca\x8c\xd5\xdb\xb8\xd5\x40\x35\x02\x72\xcb\x78\x54\x64\x9d\xce\xc4\x1f\x9f\xf9\x9c\x32\x06\x6d\xe4\x44\x70\x45\x92\x28\x37\xa8\x23\x96\xbc\xe9\xb8\xe6\xb7\xcc\xdc\x8c\x6f\x99\xf9\x50\x66\x7e\xde\x44\x76\xfe\x25\x79\x6c\xb7\xc7\x3c\xba\x27\xde\xcd\x6e\x24\x4d\x35\xa6\xc4\xa2\xeb\x77\x23\x4c\x98\xed\xa5\xb3\xfd\xeb\x35\xac\x56\x45\x24\x11\x4c\xc6\x30\x74\xd7\x6b\xf8\x18\x46\x2c\x60\x9c\x92\x2f\x0c\x22\x84\xfa\xd4\x5d\x5c\xc1\xe4\x0b\x43\x35\xcb\x9c\x24\xd3\xc5\x0e\xa8\x46\x62\x71\xf8\x1d\x0c\xf3\x22\xc7\xba\x6f\x99\x4b\xa4\xee\x4b\x82\x1c\x2d\x16\x28\xc4\x13\xa4\x96\x9d\x70\x99\x8d\x4a\xe4\xc7\xb8\x75\xcb\xd8\x5d\xd2\xba\x27\x4c\x1a\x4b\x38\xcf\x38\xf1\x14\x07\x34\x6e\x94\xfa\x7d\x0f\x7c\xcd\x70\xf3\x35\x0f\xfc\x11\x7c\x4e\xd5\x67\x71\x94\xe7\x3b\xb2\xef\xa0\x16\x99\x16\x4a\x74\x0f\x31\x45\xeb\x48\x38\x33\xc5\xe7\xa6\xf0\xb8\x1d\x3f\xcb\x08\xbd\x27\x29\x9a\xd1\x71\xda\x97\xe4\x82\x48\xb6\x74\x91\xc7\xfb\x72\xf7\xd9\x98\x51\x25\x8f\xd3\xe5\x71\x90\x50\x39\x5b\x28\x1f\xf0\xad\x94\xab\x05\xe1\x51\x1b\x35\x6e\x97\xca\xf5\xe3\xe7\x95\xda\x2e\x0b\xfb\x22\xb9\xa8\x2b\x6f\x4b\x74\x8a\xb6\x46\xbb\x4b\x6f\x8f\x1e\x83\x8c\x11\x9e\xad\x48\x0f\x59\x2c\x81\xb9\x92\x35\xa0\x5e\x75\xbe\x45\xc5\xf5\x50\xf3\xa0\xb8\x18\xd5\xf0\xf1\x7a\x32\x7a\x31\x1b\x4d\xea\x1d\x24\xcc\x64\x9c\x6c\x7d\x31\x3c\xf7\xcb\xc2\x5d\xb5\x6e\x82\xb5\x67\xc6\x70\x8b\x99\x2f\x25\x0c\x10\x59\x5b\xb0\xd2\x05\xec\x8a\x58\x60\x06\xc8\x9a\x30\x4e\x16\x1c\x61\xa9\x95\x00\x02\xa9\xab\x0f\xe0\xd2\xdf\x83\xbb\xc2\xeb\x60\xb3\x62\x74\x05\x1b\xc6\x79\xe1\x89\x7c\x8d\x60\x15\x90\xb0\x01\x46\x03\x00\xc1\xe4\xdf\xf3\x05\xd6\xd6\x9c\x8e\xa6\xd3\x91\xcb\xd0\xf7\xb8\xdd\x28\x9d\x38\x87\x3c\xe9\xfb\xec\xc9\x77\x70\xa2\xb8\x70\x1f\x95\xc5\x4e\x9c\x07\x0b\xc2\xda\x35\x7d\x55\xcd\xdf\x62\x02\xef\x89\xaf\x94\x50\x10\xc6\x8b\x43\x93\x66\xc5\x96\xb6\xf1\x86\xef\x35\x26\x2b\x62\xdd\xf1\x0d\x00\x32\xad\xd6\x2c\xc1\x32\xcd\xf6\xd7\xe1\x4c\xde\x77\x44\xec\x58\x18\x20\xd7\x3c\x2e\x0a\x15\x13\x8f\xc7\x29\xb3\xab\x7c\x51\xb8\x46\xa8\x6c\xdc\x8b\xee\x8e\xad\x46\x1c\x0b\xe2\x8c\x37\xce\xee\xd3\x71\xb9\xdf\xa8\x76\x91\x32\xea\x5c\xab\x04\x4b\x8d\x7c\xa7\xf4\x61\x23\x6f\x3a\x4d\xba\xc9\x33\x57\x02\x61\x52\xb7\x5c\x15\xe9\x1d\x93\x29\xc7\x63\xa9\xaf\x73\x6e\xd9\xb1\xc4\x17\x9c\x37\xb7\x68\x0f\x6d\xb9\x03\x6f\xe9\xba\xe7\x85\xa4\x69\xb4\xa1\xd7\x59\x96\x51\x79\xee\x2a\x34\x53\x44\xe4\x6a\x26\x7a\x62\x33\xe8\x9a\x52\x8e\x9d\x4e\xb0\x09\xbc\xbd\x8a\x7a\x0f\x9c\xff\x40\xf5\x17\x41\x09\xd4\x13\x4a\xd1\x18\x8d\x2e\x47\xb5\xcb\x6d\x1f\x7e\xfb\xd5\x7b\x51\x8d\xf4\x1e\xa6\x68\x1f\xd2\xb3\x87\x29\x06\x75\x2a\x7a\x03\xdf\xb2\x1d\xd4\xa3\x2b\xd0\xfd\x76\x99\xa1\xf3\xa0\x48\x11\x47\xe8\x14\x4c\x5b\x47\xe8\xd9\xc9\xb5\x7f\x90\xae\x87\x73\xed\xc3\x4a\xf7\x83\xd6\x93\xd5\x6e\x2e\x42\xcb\xcd\xc3\xf9\xc2\x8f\xf6\x55\x01\xe8\xe3\x48\xd5\x08\xe3\x49\xad\x6d\xb5\x67\xfa\x3d\x8b\x20\x9f\x3f\xc9\x3a\x23\x78\xf0\xa9\x37\x7f\x97\xeb\xb4\x37\xd3\x80\x55\x2f\x3a\x88\x4a\xbf\xa3\x81\x30\x78\x55\x8d\x02\x7e\x0a\x6f\xbd\x8f\x64\xd5\xab\xf5\x10\xad\x6a\xf4\x91\xad\xa3\x44\xec\x5a\x18\x1e\x02\x86\xe0\x30\xec\xd5\x5a\x63\x0f\xfc\x55\x6f\x6f\x3f\x0c\xd6\x2c\xf2\xb4\x08\xe8\x47\xb8\xc7\xac\xc6\xbe\x5e\xb3\x4b\x15\x82\xd6\xfc\x38\xec\xb8\x47\x9b\xf2\x71\x48\x5b\xa9\xd4\x01\xbc\xcd\x8f\xfd\xa8\x5b\xb5\xad\x1d\xec\xad\xda\x55\x81\xc0\xed\xe4\xe6\x3e\x55\xb4\x7e\x33\x0b\x3d\xf6\x6f\x08\x60\xe4\x12\x63\x60\x7e\x78\x36\x9b\x9d\x0e\x83\x8c\x65\x15\x1d\x82\xe3\x2b\xa2\x2e\xb2\xe7\xc7\xd7\x42\xb2\x5a\xd2\xdb\x78\xd6\x05\xdf\x90\xad\xd9\xa1\x0b\xe0\x59\x10\xc2\xb4\x9c\x79\x76\xa8\x0e\xa0\x57\x7e\xec\xc1\x90\xfc\x68\x63\x42\x77\x41\x8a\x83\x58\x53\xa3\xff\x1e\xed\x0e\x81\x5b\xff\x03\xea\x3d\x1d\xfb\xaa\xb6\x17\xac\x81\xaa\xc9\x30\x0e\xe6\xc7\x1e\x34\xcc\x8f\x0a\x13\x3b\x6b\x30\xb1\x66\xac\x15\xcf\x05\x5e\xbb\x98\x16\xf4\x1a\x1f\x79\xac\xc8\x96\xbb\xae\x06\x20\x1c\x9f\xff\x97\x6b\x6c\x45\x36\x08\xad\xbd\x37\x9c\x85\x17\x45\x91\xd9\xed\x5b\xa6\x63\xf8\xf7\x7f\x8a\xee\xc4\x16\x51\x2d\x86\xa2\x37\xf4\x1d\x77\xb7\x7b\x2b\x5e\x1d\x29\xc3\x73\x82\x4b\x26\x99\x6d\xaa\x5b\xb5\x91\x98\x54\x9d\x68\xea\xdf\x2f\x39\x58\xa4\x94\x0a\xad\x5b\xaf\x0d\xf9\x27\xbe\x29\x2d\x7b\x96\xeb\xb2\x40\xa9\x30\xc6\x76\x7c\xee\x17\x2f\xa1\xae\xb2\xc7\xdf\x69\x2d\x2f\xfa\x44\x45\x23\x59\xbb\x07\xa4\x28\x9d\xda\x98\xf8\x9e\x12\x3f\x33\x63\x99\x4c\xbb\x4d\xa5\x6b\x4b\x13\xb0\x2b\x64\x1a\xfc\x5b\x26\xd7\x4d\xc5\xda\x14\x47\x37\x7b\x13\x4b\x28\x5c\x3c\xa9\x8b\x6f\x6b\x75\xe0\x0d\xb8\x55\xbe\x60\x2a\x6a\xfe\x8f\xd9\x03\x32\x78\x1b\x7c\x2c\x12\x7a\xaa\x33\x3a\xd8\x1b\x97\x8b\x05\xab\x3f\x78\x9a\x3f\x53\x3a\xa7\x71\xa9\x84\xc8\x25\xb3\xdb\xba\x83\x77\x26\xca\xf2\x05\x67\x66\x85\xba\x81\x46\xde\xe7\x0b\xdf\xb0\x38\x99\x73\x95\x78\x93\x96\xdd\x57\x37\xf1\x96\x53\xdd\x77\xda\x3c\x2c\x7a\xd7\xa9\x29\xab\x3f\x7a\xe6\xaa\xea\xe3\x5c\x5b\x67\x51\xaf\x09\x8f\xe1\xe5\x44\x0c\xfe\x1b\x00\x00\xff\xff\x21\xd5\xad\x06\xca\x29\x00\x00") -func olmManifests0231OlmYamlBytes() ([]byte, error) { +func olmManifests0240OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0231OlmYaml, - "olm-manifests/0.23.1-olm.yaml", + _olmManifests0240OlmYaml, + "olm-manifests/0.24.0-olm.yaml", ) } -func olmManifests0231OlmYaml() (*asset, error) { - bytes, err := olmManifests0231OlmYamlBytes() +func olmManifests0240OlmYaml() (*asset, error) { + bytes, err := olmManifests0240OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.23.1-olm.yaml", size: 10698, mode: os.FileMode(420), modTime: time.Unix(1678830330, 0)} + info := bindataFileInfo{name: "olm-manifests/0.24.0-olm.yaml", size: 10698, mode: os.FileMode(420), modTime: time.Unix(1687806532, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0240CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\x9e\xbf\x02\xcb\xcd\xb9\xb6\x13\x49\x9e\x49\xda\x7c\xad\xbf\xb4\x59\xae\xed\x24\xbe\x99\xf1\x68\x8d\x9d\xf4\xf6\x9b\x99\x93\x40\xe4\x96\x84\x9a\x04\x58\x00\x94\xad\x9e\x9c\xff\xfd\x2e\x6c\x3c\x48\xea\x65\x49\xa4\xc7\xb2\x87\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xbf\x1f\xdd\x6e\xf7\x33\x9a\xb1\x5f\x40\x2a\x26\xf8\x31\xa1\x19\x83\x3b\x0d\xdc\xfc\xa5\x7a\x37\x7f\x56\x3d\x26\x8e\x26\x2f\x3f\xbb\x61\x3c\x3e\x26\xa7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x33\x18\x32\xce\x34\x13\xfc\xb3\x14\x34\x8d\xa9\xa6\xc7\x9f\x11\x42\x39\x17\x9a\x9a\x9f\x95\xf9\x93\x90\x48\x70\x2d\x45\x92\x80\xec\x8e\x80\xf7\x6e\xf2\x01\x0c\x72\x96\xc4\x20\x71\x72\xff\xea\xc9\x8b\xde\x5f\x7a\x2f\x3e\x23\x24\x92\x80\x8f\x5f\xb3\x14\x94\xa6\x69\x76\x4c\x78\x9e\x24\x9f\x11\xc2\x69\x0a\xc7\x24\xa2\x9a\x26\x62\x64\x17\xa1\x7a\x22\x03\x49\xb5\x90\xaa\x17\x09\x09\xc2\xfc\x27\xfd\x4c\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\x57\xf8\x5a\xfc\x3d\x61\x4a\xff\x34\x7f\xed\x15\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xcf\x08\x51\x91\xc8\xe0\x98\xe0\xa3\x19\x8d\x20\xfe\x8c\x10\x07\x42\x37\x55\x97\xd0\x38\xc6\x6d\xa1\x49\x5f\x32\xae\x41\x9e\x8a\x24\x4f\x79\x78\x95\xb9\x27\x06\x15\x49\x96\x69\x04\xfd\xf5\x18\x48\x26\x41\xeb\x29\x82\x84\x88\x21\xd1\x63\xf0\xef\x0e\x4f\x11\xf2\x2f\x25\x78\x9f\xea\xf1\x31\xe9\x19\x08\xf7\x62\xa6\xb2\x84\x4e\xcd\x6a\x4a\x77\xd9\x6d\x3a\xb3\xd7\x4a\xbf\xeb\xa9\x59\xba\xd2\x92\xf1\xd1\xaa\xa5\x98\xfb\xd6\x5f\x83\x05\xcd\xf5\x34\x9b\x5f\xc2\xcc\x8f\xeb\xbe\x3f\xcb\x07\x09\x53\x63\x90\xeb\x2f\x22\x3c\x32\xb7\x86\xfe\x82\x2b\x4b\x16\x52\x9a\xd4\x1f\xa8\xde\xdc\x61\x98\x7b\xc1\xc9\x68\xfe\x1b\x63\xaa\xfd\x8f\xf6\xa6\xc9\x4b\x9a\x64\x63\xfa\xd2\xfd\xa8\xa2\x31\xa4\xb4\xc0\x07\x91\x01\x3f\xe9\x5f\xfc\xf2\xf5\xd5\xcc\x05\x52\x85\x4e\x05\xcf\x09\x53\x84\x12\x09\x99\x50\x4c\x0b\x39\x35\xd0\x3a\xbd\xfa\x45\x75\xc8\xe9\xdb\x33\xd5\x21\x94\xc7\xe1\xe0\x91\x8c\x46\x37\x74\x04\xaa\x37\xb7\x56\x31\xf8\x17\x44\xba\xf4\xb3\x84\x7f\xe7\x4c\x42\x5c\x5e\x85\x01\x8f\x87\xc9\xcc\xcf\x06\xfe\xa5\x9f\x32\x69\xde\xa9\x4b\x07\xd9\x8e\x12\x95\xab\xfc\x3e\xf3\x85\xfb\x06\x0c\xf6\x3e\x12\x1b\x02\x07\x0a\x51\xc0\x9d\x31\x88\x1d\xec\x2c\x6a\x30\x65\xbe\x5f\x82\x02\x6e\x49\x9e\xf9\x99\x72\xf7\x4d\x3d\x72\x05\xd2\x3c\x68\x8e\x7b\x9e\xc4\x86\x12\x4e\x40\x6a\x22\x21\x12\x23\xce\xfe\x13\x66\x53\x44\x0b\x7c\x4d\x42\x35\x28\x4d\xf0\xd4\x72\x9a\x90\x09\x4d\x72\xb0\xa0\x4c\xe9\x94\x48\x30\xf3\x92\x9c\x97\x66\xc0\x5b\x54\x8f\xbc\x16\x12\x08\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\xb4\xa7\xe1\x91\x48\xd3\x9c\x33\x3d\x3d\x42\x72\xcc\x06\xb9\x21\x87\x47\x31\x4c\x20\x39\x52\x6c\xd4\xa5\x32\x1a\x33\x0d\x91\xce\x25\x1c\xd1\x8c\x75\x71\xb1\x1c\xe9\x78\x2f\x8d\xff\x20\x1d\xd5\x57\xfb\x33\xe0\x5b\x88\xcc\xc4\x93\xcd\x95\xb0\x36\xc4\xd3\x62\x91\x7d\xdc\x7e\x4b\x01\x52\xf3\x93\x81\xca\xdb\xf3\xab\x6b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\x83\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\x6f\x5e\xbd\x26\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x8e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\xf7\x42\xa6\x54\x1f\x93\x6f\xfd\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x1d\x7f\x9b\x09\xa9\xff\x46\xde\xf0\x64\x6a\x26\x8d\xc9\xed\x18\x38\xb9\x0a\xdf\x46\xfe\x5a\xfa\xe3\x07\x99\x45\x3d\x72\x31\xe2\x42\xfa\x3b\x0d\x56\x5d\xa4\x74\x04\x64\xc8\x20\x41\xbc\x56\xa0\x7b\xb3\x3b\xb8\x72\x17\x89\x15\x97\x86\x6c\xf4\x9a\x66\xf7\x82\xe6\xd4\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x86\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xf5\x20\x70\xea\x27\x30\xf0\x2b\x7e\xbe\x70\x94\xab\xb7\xe9\x67\x97\xbf\x6c\xe3\x67\x0b\x31\xe4\x5e\xa0\xbd\x5e\xc4\x45\xd6\x78\xc7\x48\x66\x51\x5f\xc4\xf6\xb3\xef\x7d\xcb\x0f\xe5\xbb\x09\xdc\x65\x42\x81\x22\x31\x1b\x0e\x41\x1a\xba\x23\x26\x20\x25\x8b\x41\x91\xa1\x90\xb8\x5f\x99\x88\xf1\x4c\x86\xfd\xab\xb0\xda\xbe\x88\xd7\xdd\x18\xf3\x6a\x64\x18\x16\x19\x1d\x1a\x2e\xfd\xdc\x85\xa7\x9d\xdc\x73\x78\xcd\xe0\x22\x86\x2b\x48\x20\xd2\x42\x2e\xbe\x63\x06\x26\x97\xa5\x07\x1c\xd5\xf7\x7f\xdd\x8e\x59\x34\x26\x69\xae\x90\xea\x6a\x99\x43\x05\x2e\x5a\x90\x21\xd3\x44\x70\x42\xf1\xb5\x86\xd6\xcf\x3f\x99\x52\x1d\x8d\xdd\x1d\xfb\x8a\x24\x74\x00\x89\x9a\x9d\x67\x00\xc8\x72\xe3\x3c\x81\xd8\x4c\x88\xb4\x04\xe7\x5c\xf2\x09\xf7\x40\x89\x58\x52\x16\xe4\xed\xd5\x30\x23\xf7\x61\x99\x05\x3c\x13\x92\xe9\xe9\x69\x42\x95\x5a\x86\xd3\x73\xd0\xbd\x18\x22\xfa\xb0\x21\x83\xb8\x43\x18\x8f\x99\x51\x69\x94\xff\xf6\x7d\x15\xe6\xed\x99\x7b\x0d\x83\x2b\xdd\xef\x21\xe4\xef\x21\xb7\x2c\x49\x0c\xb0\x62\x18\xd2\x3c\x41\x22\xf9\x1f\x90\x82\x30\xc4\x4e\x89\x78\xc5\x85\xbf\xbc\x1a\x78\x2b\xbe\x55\x41\x94\xe3\xb7\x0a\xae\xe1\x4e\x2f\x3f\x5d\x73\xdf\xbb\x77\xb5\xe8\x51\x64\x09\x03\x20\x82\x23\x21\xfc\x2d\x81\x11\x8d\xa6\xbf\x99\xe5\xff\x26\xc1\x2c\x24\xd2\x10\xff\xd6\x43\x39\xbf\x72\xc4\x0c\x80\x04\x52\x6d\x60\xe6\x0b\x09\xe3\x66\xcb\xcd\x61\x63\x7a\x8c\x00\x92\x6c\x34\xd6\xe6\x2e\xa7\x78\x54\x17\x80\x67\x2e\x5c\x34\xac\x9f\x32\x0e\xf2\xdd\x17\x1f\xe6\xee\xb4\x22\x1b\xf2\xaa\x24\x11\xb7\x65\xfc\x94\x39\x27\x8c\x9b\xf3\x4e\xfc\x07\x92\x93\x38\x65\x0a\x25\xd2\x83\xfe\xd5\xc9\x61\xe5\x4b\x48\x2a\x62\xe8\x98\xef\x8b\x05\x28\xbe\xaf\xcd\x69\x37\x13\x2a\xf0\xaf\xa1\xda\xbc\xc6\xe0\x84\x3b\x2d\x11\x35\x3c\xd3\xbd\xd3\x00\x4c\x18\xc2\x32\x80\xf0\xf2\xab\x13\xf2\xdb\x80\x2a\x48\x18\x07\x0b\xbb\x4c\xb2\x09\x4b\x60\x64\xde\xc8\xbd\xee\xa9\x7a\xe4\x34\x97\x86\x9e\x25\x53\x87\x18\x64\xf1\xae\x30\x45\x72\x3e\x83\x6e\x1e\xb3\xac\xcc\x57\xde\x2c\x73\xb7\x32\x52\xd7\x15\x3e\x31\x35\x5c\x9c\xfa\xfb\x70\x6f\xf4\x98\xf2\xa5\x9b\x6b\x24\x45\x33\x31\xe3\xf6\x29\x16\x5b\xd1\x1c\xa4\x14\xb2\x47\xfe\x61\x68\x67\x6e\x34\x6c\x22\x92\x18\xa4\xd7\xee\x08\x33\xf4\x52\x75\x3c\x90\x50\x62\x77\x72\xa0\x03\xcc\x02\xc0\x2f\xff\x66\x27\xf3\x1b\x82\x03\x28\x97\xf8\xf5\xf6\xc8\x7b\x6e\x04\x4a\x4a\x86\xb9\x11\x01\xbd\x6e\x61\xcf\x5c\x19\x34\xfe\x10\xfa\x09\x4a\xaf\xef\x84\x65\xa7\x94\x39\x54\x0b\x7a\x86\xb4\x06\x16\x33\x17\x0b\xdf\xa7\x2c\x22\xd3\xf0\x3a\x31\x24\x22\x4b\x2d\x05\x54\x79\x66\xc4\x1f\x65\xbe\x94\x1b\xd0\x44\x15\xf6\x93\x89\x58\x2d\x04\x80\x59\x56\x26\x21\xa3\x32\x50\x6c\x05\x24\x1a\x53\x6e\x74\x3d\xf3\xa1\x41\x56\x36\xb2\x97\x79\x2d\x1d\x88\x5c\x23\x8e\xb9\xb3\x3a\x14\x39\x8f\x89\x21\x2a\x85\x38\x7d\x93\x0f\x40\x72\xd0\x80\x12\x75\x2c\x22\x65\x84\xe9\x08\x32\xad\x8e\xfc\x69\x3a\xca\x44\xdc\xf5\x7f\x74\xa9\x3f\x24\x47\xfb\x7b\xdb\x52\x23\xe2\x21\x7f\x4c\xec\x5e\x2d\xb9\x0b\x78\x9e\x2e\x27\xf0\xdd\xd5\x0f\x9b\x1b\x0a\x30\x2e\xbc\x49\x8b\xc4\xa8\xcd\x85\x4d\x67\xd1\x42\xcb\x46\x8b\xe2\x7e\x62\x76\xa2\x64\xb3\x70\xc2\xb9\xa5\x6e\xfb\xaa\x3c\xf5\x6a\xa2\x4d\xa5\xa4\xcb\x3e\x81\x69\x48\x57\x70\xb8\x79\x83\x8a\xa1\x6d\x46\x17\x2b\x16\x8a\x02\x80\xd6\xd4\xf0\x62\x54\x7e\xed\x15\x43\xae\xf8\x94\x18\x7c\x76\x72\x3e\x72\x75\xc7\xc7\xb4\x64\x59\x02\xe4\xdb\x1b\x98\x76\xac\x66\x0c\xc3\x21\x44\xfa\x6f\xee\x3c\x9b\x7b\xf0\x7e\x3c\xdc\xde\xf4\xf0\xad\xff\xd7\xdf\x96\x7d\xf1\x5a\x5c\xfe\x7e\x89\xc8\x0e\xbb\xa4\x55\x77\xcc\x40\xe8\x1c\x1f\x98\x61\xd9\x16\x02\x76\x2e\x03\x1f\xfc\xac\x1e\x39\x4f\x33\x3d\x25\x29\x50\xae\xbc\xbc\x63\x68\x46\xe9\x66\xe5\x28\x5c\x89\xda\x22\x93\x09\x96\x02\xc4\x90\x4b\x71\xe5\xa4\xa0\x0e\xe9\x4b\x18\x82\x2c\x7e\x41\x46\x76\x29\xce\xef\x20\xca\xf5\x52\xb9\xa8\x0c\xb7\x95\x47\xca\x8c\x1b\x98\x6e\x00\x90\x9f\x60\xea\x35\x1a\xfb\x65\x37\x30\xb5\xc8\x80\x3f\x15\x38\x44\xb3\x2c\x61\x60\x95\xf6\x55\x90\xb9\x81\xa9\x42\xa9\xc7\x3c\x7f\x63\x67\x07\x73\x7f\xa7\xc0\x12\x2f\x7c\x9e\x1b\xbd\x51\xfd\x5f\x8b\xaf\x91\x48\x07\x8c\xdb\x97\xd9\xa9\xfd\x56\xe0\xec\x1e\xa0\x3c\xc6\x3f\xf1\x35\x4d\x80\xcb\x2f\x6a\x03\x98\xbd\xf1\xdf\x51\x58\x44\x08\x35\x2b\xda\x57\x44\x42\x62\x4f\xfc\x98\x65\xde\xd0\x84\x4b\xef\x91\x5f\x0c\x7b\x2c\xcc\xe3\x88\x1b\x16\x02\xf8\x55\xe7\xff\xce\x69\xd2\x23\x67\x96\x2a\xe2\xd7\xbb\x9f\xdc\x4d\x06\x90\xff\xce\xd9\x84\x26\x46\xab\xd1\xc2\xb0\xac\x38\xa2\x32\x46\x6e\xe0\xac\x57\x4a\xd8\xdd\xa3\x41\xe0\xf0\xa7\xbd\xd8\x23\x85\x96\x33\x92\x51\xa9\x59\x94\x27\x54\x7a\x8b\xfc\xb4\x11\x88\x16\x48\x73\x05\x91\xe0\xf1\xca\x13\xbc\x94\xba\xba\x67\xcb\x30\x46\x31\x0a\x24\x13\x31\x2a\x6e\x2c\x85\x59\x24\x3d\xa8\x2a\x37\x62\xe8\x4f\x75\x38\x62\x1d\x2b\xd5\xdc\x32\xe5\x8c\x5b\xc1\x80\xc0\xac\x81\xe1\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4f\x3d\xbf\xea\x10\xa6\xad\x44\x8e\xf2\x9f\x97\x61\x3c\xca\x3a\x60\x17\x07\x6a\x28\x24\x18\xa5\xff\x20\x16\xf8\x0c\x4c\x58\xa4\x0f\x7b\xe4\xff\x19\x11\xdf\x6c\x3c\x87\x11\xd5\x6c\x12\x64\x48\x2f\x89\x68\x09\xd4\xc8\xc4\x54\x91\x17\xe4\x00\x1f\x23\x2c\x4d\x21\x66\x54\x43\x32\x3d\x24\x83\x29\xbe\x46\x4d\x95\x86\x74\x9d\xad\x63\x5c\xc3\xa8\x62\x1d\x9f\x1f\x43\x67\xb8\x61\x5c\x7f\xf3\xc7\x15\x77\xe2\x62\x37\xd8\xd9\x5f\x50\xa4\xac\x90\x1a\x2b\x65\xce\x6c\x61\xe0\x41\x22\x50\x91\x40\x37\x98\x72\x67\xa1\x53\x9c\xab\x92\xec\xe7\xc9\x4c\xd8\xe0\x7f\x19\x3c\xa0\x44\x02\x3a\x78\x1c\xe6\xd6\xc0\x71\x16\xad\x32\x98\x2c\xe5\x68\xcb\xed\x79\x04\x25\x14\x23\xfe\x7f\xf3\xc7\x25\x86\x12\x6b\x8d\x37\x7b\x3e\x6f\xf3\x23\x6b\x30\xca\x62\xf2\x65\x9b\x75\xef\xb1\x0e\xaf\xdf\x6a\x06\x14\xf5\xef\x35\xe2\x04\x03\x8a\x51\x91\xdc\x7e\x77\xbd\x9d\x8c\x04\x0d\xcf\xce\x66\x88\x1f\xe3\x4a\x53\xae\x19\x52\xb6\x60\x51\xf3\x16\x36\x23\x7e\x6f\x62\xc4\x41\x5c\x73\x84\xc6\x22\x97\xb3\x99\xce\xd1\x87\x8d\x8d\x6d\x5e\xcd\xbf\xdf\xfa\xda\xf7\x06\x01\xfb\x4e\xaa\x14\x1b\x19\x29\x93\xdc\x02\x6a\xc3\x8e\x9d\x54\xa5\x4d\xab\x15\xe0\x83\xec\x3f\x78\x9a\xd2\xc0\x04\x98\xf6\x72\x7f\x24\xb8\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xeb\x4f\x26\x20\x7b\xe4\x67\x65\x76\x8a\xfc\xc8\x46\x46\xef\x73\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x53\x06\x74\x43\x90\x12\x62\xb4\xb6\x11\x23\x03\xf9\x19\x20\x9e\xb9\x5f\x91\x38\x47\x0f\xc4\xec\x22\x72\x03\x07\x6b\x2e\x90\x46\xa9\xf1\xe6\xb9\x60\x28\xb1\x07\xde\x7c\xd2\x48\x58\x5f\x03\xfa\xc3\x0c\xed\xd4\xa2\xa0\xa3\xcc\x1a\x88\xc3\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x56\x15\x61\x34\x60\xcf\x7c\x0c\x2a\x6e\x39\xb7\xc0\x87\xb2\x95\xc6\x93\x99\x17\x76\xaa\x45\xcf\x21\x39\xa6\xe9\xec\x92\x0b\x9a\x2e\x29\xbf\x81\x98\x24\x70\xc7\x22\x31\x92\x34\x1b\xb3\x88\x26\xc9\x14\x8f\x29\x1a\xc9\x98\x56\xa8\xf5\xaf\x30\x66\x2f\x23\xe3\xc1\x31\xba\xb1\x51\x57\x41\x24\x41\xdf\xef\x20\xb8\xb2\xf7\x15\x4c\x19\xd5\x65\x31\xf4\x13\x58\x1c\x71\x38\xe7\xad\xe0\x34\x8a\xcc\x41\x42\xd4\x35\x5a\xbb\x13\x40\x4a\xa8\xdc\x23\x17\xc8\x52\x07\xa0\x10\xcb\x6f\x00\x32\x8b\x69\x09\x53\x9a\xa8\x14\x6d\x2a\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x99\x51\x4b\x06\x56\x0c\x32\xac\x76\x1a\xf6\x06\xb8\x5e\x2c\xd4\xac\xd6\xbb\x56\xe8\x5c\xab\xc1\x18\x68\xca\xfd\x90\x2c\x68\x91\xe7\x89\xce\x13\xaf\x8a\xa0\x87\x0d\x5e\x6d\xbd\x67\x57\xda\x08\x1f\xa3\xfb\x69\xcd\xcf\x95\xdb\x83\xf7\x75\x2c\x6e\xbd\x1f\x6e\xee\x90\xa3\xc5\xc6\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x54\x70\x85\xf2\xa9\x75\xc7\xa2\x3b\x75\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\x06\x74\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x3a\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x9c\x2d\xce\xe0\x74\x0c\x1a\x64\xca\xb8\x13\x8f\x8c\xa8\x1b\x00\x3b\x00\x7d\x0b\xc0\x49\x34\x86\xe8\x26\x1c\x25\xe7\xcd\x9e\xd9\x35\x67\x7f\xaa\x52\xac\x22\x50\x40\x24\x09\x2a\x1a\x0a\x80\x30\xa3\x13\x70\xb8\x2d\xdb\xac\x16\xb0\x1b\xc3\xa2\x27\x94\x25\x74\x90\x00\x72\xcd\xf0\x57\xa7\xe2\x55\xf7\xfc\x3c\xcb\x93\xc4\x08\xb1\x3c\x26\xa3\xb7\xfd\x53\xa2\x25\x1d\x0e\x59\x64\x2e\xc5\x4c\x5a\xab\x6f\xd5\x21\x5f\x7d\xe1\x2a\x71\x6d\xe9\x89\x50\x9a\xea\x7c\x6e\x8f\x56\x6c\xf0\xaa\x8d\x35\x7a\x08\x5b\x6a\x20\xaa\x6c\xe5\xdb\xaa\xb2\x62\x96\x01\x56\xd9\xaa\xd8\xbf\x7b\xe4\x52\xa0\x8e\x40\x35\x79\x0d\xca\xb0\x5d\x04\xd0\x5b\xa0\x4a\xf0\x12\x75\x45\xe9\x57\xb2\x11\xe3\x34\x71\x1f\x55\xb6\xef\x05\xdd\x83\xa2\x49\x39\x65\x23\x49\x75\x20\x8a\xc5\xba\x1d\x77\x71\x7c\xd1\x5a\x42\x7b\xe4\x84\x4f\x71\xbf\x87\x40\xcd\x0f\x66\x66\x2d\x45\x9c\x47\x68\x87\x4f\x12\x74\xf7\x16\x93\x34\x4a\x46\xab\xee\x85\x53\xff\x12\x2f\xe8\x29\x73\x00\x28\x73\x2e\x25\xc1\x81\x50\x95\x19\x3d\xce\xe3\xa4\x35\x85\x17\x00\x46\x66\x71\xd2\xbf\x20\x3e\x60\xae\x47\xba\xdd\x2e\xb9\x36\x3f\x2b\x2d\xf3\x08\xf9\x8b\x39\x42\x3c\x76\x9c\xc2\x62\x1f\x7e\x24\x45\xb1\x13\x3f\x83\x38\xcb\x87\x15\xc1\x32\xaa\xc7\xa4\x67\x01\xdf\x2b\x81\x82\x90\xef\x0d\xaf\xb9\xa3\x69\x66\xf0\xfe\x3d\xb7\xd4\xfb\x7b\x21\xae\xec\x26\xd9\x77\xfe\x0f\x39\x3a\x9a\xc5\x09\x31\x30\x22\xaa\x33\x20\x22\x6a\x0c\x85\xd8\x57\xd5\x4f\xea\x99\x07\x7f\xe2\xe2\x96\x2f\x7a\x3b\xbe\x8b\x4a\x38\x26\xef\xf7\x4e\xfc\xe9\x7b\xbf\xd7\x21\xef\xf7\xfa\x52\x8c\x8c\xd8\xca\xf8\xc8\xfc\x60\x90\xea\xfd\xde\x19\x8c\x24\x8d\x21\x7e\xbf\x67\xa6\xfd\x32\x33\x1a\xd6\x6b\x90\x23\xf8\x09\xa6\x7f\xc5\xc9\xc2\xcf\x9e\x23\xfc\x35\x35\xd7\xf1\x77\xc3\x82\x0d\x9f\xfa\x6b\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\x4f\x0b\x3c\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x8e\xfe\xf6\x2f\x25\xf8\xf1\xfb\xbd\x62\xfd\x1d\x91\x1a\xcc\xc8\xf4\xf4\xfd\x1e\xa9\xbc\xf5\xf8\xfd\x1e\xbe\xd7\xff\xee\x17\x79\xfc\x7e\xcf\xbc\xc9\xfc\x2c\x85\x16\x83\x7c\x78\xfc\x7e\x6f\x30\xd5\xa0\x3a\x2f\x3b\x12\xb2\x8e\x11\x98\xfe\x5a\xbc\xe1\xfd\xde\x6f\x66\x4f\x8e\x8e\x9c\x0b\x03\x37\x53\x91\xff\x5d\x6c\xac\xbe\x97\xee\xaf\xd6\xdf\xd0\x08\x4d\x95\xbe\x96\x94\x2b\xe6\xe3\xc7\x96\xde\x9a\xda\xf3\xbe\xf4\xba\x44\x1a\xb0\xf4\xb2\xc5\x86\xa5\x97\x97\x70\xcf\x75\x38\xd7\xfc\x37\xac\x69\x75\x9e\x7f\xd0\x8b\x34\xe6\x4a\x61\xa7\x09\xfb\x63\x78\x80\xbb\xdb\x9c\x45\x23\xc7\x9b\x23\xee\xe8\x9b\x91\x18\x39\xee\x5b\xcf\x9d\xdf\xa0\xe0\x87\xd8\x8f\x9c\xc7\x20\x13\x74\x56\x15\xb3\x5a\x4f\x48\xdc\x23\xd6\x6e\x40\x83\x95\xe6\xc6\x1c\x24\xe4\x4e\xbc\x64\xbc\xc6\x75\x85\x19\x0d\xed\xb0\x67\xde\x4d\x83\x8c\x2e\x8a\x20\xd3\xc8\xe9\xb6\x77\x31\x93\x92\x51\xc5\x48\x56\x5d\xbd\x1c\x3d\x1c\x72\xac\x09\x78\x77\xb7\x8b\xd6\xc9\x53\x6a\x58\x07\x8d\xcd\x7a\x8b\x6b\x56\x7d\xb3\xea\x96\x25\xa9\xd6\x29\x64\x6d\xfc\x7e\x1f\x1c\xa8\x1d\x23\x41\xc1\x2c\xd3\xd3\x7b\x2d\x26\x6b\x7d\x7c\x4a\xef\x5e\x01\x1f\xe9\xf1\x31\xf9\xfa\xab\xff\xf3\xcd\x9f\x97\xdc\x68\x09\x23\xc4\x3f\x00\x77\xb6\xa0\x35\xc1\x30\xff\xe0\xac\xd1\xb0\x08\xf1\x1c\x15\xf7\x04\x23\x77\x81\x41\xb7\x14\x03\x38\x1c\xbb\xcc\x33\x03\x17\x43\xe8\xad\xad\x21\x82\x8e\x11\x92\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\xee\x3e\xf4\x16\x2c\x99\x29\xf2\x97\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xaa\x98\x12\x2c\x27\xf4\xc6\x80\x79\x4e\x08\x61\xbd\xf7\x6d\xdc\x7d\xf6\xc0\xf5\x6c\x81\x29\xe3\x2c\xcd\xd3\x63\xf2\x62\xc9\x2d\x96\xa4\xad\xb9\x9b\xf6\xe6\x42\x10\xa0\x86\x74\x8d\x24\x4d\x8d\xc8\x13\x11\x16\x03\xd7\x6c\xc8\x30\x68\x20\xa0\x36\xaa\xfb\xf6\x41\x1f\x83\x12\xa0\x88\xe1\x29\x86\x0e\x95\x90\xbd\x6f\xe5\x1c\x89\x1c\xd8\x79\x6f\xa2\x32\x81\x9a\x66\x60\x4f\x83\x55\x60\x08\xdc\x65\x56\x54\x2d\xb9\x21\x52\xa0\x9c\xf1\x91\x0f\x7b\xf1\xb6\x64\xcb\x75\x6f\xc7\xe0\xbc\xe7\x50\xf6\x05\x45\x46\x59\x8a\x51\x6f\xa2\x64\x94\x53\x49\xb9\x36\x6a\xec\x49\xff\xc2\xca\xe8\xb3\x36\x4d\x5a\xc4\x42\xfa\xd3\x68\x8f\xaa\x25\x56\x66\x89\xce\x6f\x8e\x27\xb6\xb9\xa3\xfa\xf2\xc5\x57\x2b\xb7\x3c\xdc\xb7\xdc\x85\x47\xb5\x06\xc9\x8f\xc9\x7f\xbf\x3b\xe9\xfe\x3f\xda\xfd\xcf\x87\x03\xf7\x8f\x17\xdd\xbf\xfc\xda\x39\xfe\xf0\x45\xe9\xcf\x0f\x87\xdf\x7d\xbe\x64\xa6\xc5\xc2\xfc\x12\xf4\x71\x4c\xc4\xcb\x89\x7e\x47\x3b\x3e\x4a\xe5\x5a\xe6\xd0\x21\xdf\xd3\x44\x41\x87\xfc\xcc\x91\x35\xd4\x04\xda\x6a\x0f\xb5\xe1\xca\x7b\xe6\xad\xcb\x3c\xe5\xee\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xa9\xaf\xeb\x01\xc9\x9b\x1a\x4a\x94\xa6\x14\x73\x8b\x41\x9a\xe6\x20\x89\x9e\x93\x70\x7b\x91\x48\x8f\x4a\x31\xb9\x46\xb4\x7e\x4d\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x54\xac\x48\xc2\x6e\x80\x9c\x14\x7a\xa3\x21\x96\x03\x88\x28\xca\xe2\x72\xc0\xb4\xa4\xd6\xe8\xeb\xe5\xca\xc2\xa2\x34\xcc\x13\x72\x60\xd4\xd5\x1e\x06\x92\xcd\x51\xd7\x43\x67\xbd\x1d\xb0\x84\xe9\xa9\x55\xa5\x23\xc1\x87\x09\x73\x2a\x40\x9a\x09\xa9\x29\xd7\xce\xce\x08\x23\xb8\x23\xac\x70\x7d\x33\x45\x0e\x62\xae\x5e\xbe\xfc\xea\xeb\xab\x7c\x10\x8b\x94\x32\xfe\x7d\xaa\x8f\x0e\xbf\x3b\xf8\x77\x4e\x13\xf4\xf2\x5e\xd2\x14\xbe\x4f\xf5\x61\x73\x6c\xf1\xe5\x37\x6b\x9c\xa2\x83\x77\xf6\xac\x7c\x38\x78\xd7\x75\xff\xfa\xc2\xff\x74\xf8\xdd\xc1\xfb\xde\xca\xeb\x87\x5f\x98\x6f\x28\x9d\xc0\x0f\xef\xba\xc5\xf1\xeb\x7d\xf8\xe2\xf0\xbb\xd2\xb5\xc3\x45\x87\xf1\xae\x5b\x84\x8a\x74\x8d\x16\xd0\x4d\x69\xd6\xbd\x81\xe9\x92\xc3\xb9\x54\x1c\x9d\x9f\xc8\x42\x2c\xa5\xd9\x22\xed\xdb\xc6\xd6\xbe\x05\x8c\xe7\x8c\x16\x22\x79\x4d\x0f\x0c\xa7\x4b\x44\xb2\x6e\x11\x81\xb5\x85\xd5\xc9\xf0\x1d\x6b\x69\x5b\x25\x4e\xaf\x81\x2d\xeb\xc9\x8f\x7c\x45\xfc\xe2\xbd\x2f\x09\xdf\xb9\xf5\x0c\xfe\x7c\x2f\x49\xfd\x58\x7b\x9e\x9c\x2d\xd5\xb4\xaa\x36\xcc\x8b\x33\x2b\xfa\x22\xe9\x41\x71\x6e\x2c\x8c\x9e\x97\x73\xf6\xef\x1c\xc8\xc5\x99\xa3\x47\x1d\xc2\x78\x94\xe4\xb1\x91\x14\x7e\xfe\xf9\xe2\xcc\xe8\xef\x7f\x77\xe4\xe6\x16\x48\x2c\xf8\xbe\x26\x6f\x2e\x5f\xfd\x13\x8d\x01\x78\x47\xc7\x32\x74\xeb\x8f\xa2\x09\xb3\x59\x23\x9e\x01\x93\xbf\x83\x8d\x93\xc3\x37\x47\x34\x0b\xf6\x13\x24\x77\x18\x61\x95\x64\x46\x80\xb8\x01\xa2\x72\xe9\x56\x67\x26\xb6\x1e\x5f\x03\x6b\xe2\xfc\xc1\x23\xd0\x88\xe4\x09\x66\x3f\x6c\x03\x34\x17\x8f\xcf\x04\xbf\x32\x52\xe0\x03\x9c\x0f\x83\xc8\x6f\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x48\x42\xb8\xf7\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfc\x24\xcd\x7d\xef\x56\x6f\xb4\xf6\x4c\xf4\x6c\xbe\xbd\xc7\xfe\x3c\x17\xc6\x55\x55\x9d\x67\x72\xc1\xd0\xb6\x1a\x9c\xa3\x63\xaa\xc8\x00\x80\xa3\x39\xd7\x5a\xff\x80\x3b\xac\x83\xc2\x10\x9b\x67\x5d\x2d\xba\xf1\xe2\xcd\xbb\x07\x72\xf7\x43\x6d\x85\xe6\x5a\xf9\xb6\x93\x8d\x15\xd5\xdb\xf1\x74\x11\x0c\x94\x35\x67\x62\xe0\x90\x97\x41\x36\xfd\xb0\xe5\x8a\xc9\x8c\x55\x17\x35\x0b\x67\xd4\x70\x7a\xc6\xfc\x92\x8c\xf6\x58\xb1\x6c\x68\x81\xde\xbc\xaa\x65\x6f\xf3\x35\xda\x6d\xbe\x02\x39\x61\x5b\x31\xbf\xfb\x0e\x66\x64\xe3\x4c\x4e\x1e\xfe\x58\x19\xd1\x6b\xeb\x97\xa0\xe9\x2f\x12\xf7\xb8\x6f\x56\xc6\xbf\x23\x04\x57\x45\xf9\x6f\x32\xc7\xa6\xcc\xd2\x52\x93\x63\xcc\xb8\xf0\x3f\x69\x21\xd1\xe5\x5e\xfe\x2d\x1f\x04\x41\xb9\x98\xdd\xe9\x40\xe4\x7f\xfe\xf7\xb3\xcf\x9e\x64\x1e\x79\x92\x2b\x0d\xd2\x81\xcf\x27\x51\x7f\xbc\x7c\x72\xfb\x7a\x77\x86\x1c\xe4\xf0\x7a\x29\xaf\x7c\xd1\x3d\xf3\xf9\xe5\x0b\x3f\x04\x6f\x59\x98\x67\xae\x26\xe5\x7f\xbb\x1b\x8b\x8c\xf3\x45\xb3\x3d\x64\xe6\x79\x25\x6b\xed\xea\x97\x12\xf6\x7e\x9c\x74\xf3\x19\xdf\xe2\xea\x25\x4c\x4a\xfb\x54\x7e\xfd\x2f\x73\xbf\xaf\xfb\x7a\xff\xf9\xd4\xbc\xb9\x14\xd0\x22\x38\x66\xc2\x26\xd4\xd7\x0c\x58\xbc\xa0\x05\xb7\xd8\x15\xbd\x9d\xbf\x70\x7f\xde\xb9\xd3\x5d\xb3\x31\x55\xf3\x20\xee\xcf\xfc\xba\x60\xba\x66\xb3\xcd\x17\x61\xbf\x15\xaf\x2d\x05\x09\x9e\x35\xdc\x3b\x23\xf7\xfe\xb6\xf0\x99\xab\x0c\xa2\xdf\xda\xcc\xf3\x36\xf3\xbc\xcd\x3c\xdf\xd1\xcc\xf3\xfb\xcf\xbd\x39\xc3\x24\x86\x28\xa1\x3e\xd3\x45\x43\x92\x60\x1a\xf8\x58\xdc\x86\xe8\xcb\x24\x29\x47\x6b\x16\xb1\x5f\x29\xe5\x18\xd1\x90\x65\xd6\x36\x4e\xc9\x88\x4d\x80\x87\x60\x94\x75\x17\xbf\x3a\x13\x7e\x31\x83\xf2\x57\xdd\x02\x67\xae\xac\x4c\x92\x9f\x95\x81\x56\x40\xed\xa4\xb8\xd7\xd9\x08\x72\x6e\x5d\xfe\xb9\x84\x18\xd3\x1e\x2c\x92\xa7\x34\x43\x29\xcf\xa7\x36\xd2\x32\x82\x63\xc6\xcd\xd4\x27\x9d\x0d\xa6\xc4\x88\x71\x48\x10\xb4\x10\x2e\x30\xc7\x3c\x8b\x84\x41\x82\x96\x0c\x26\x65\x03\x69\x70\x44\x6d\xae\x13\xac\x9f\x46\xbb\x52\x24\xa6\x19\x73\xb2\x4b\x1c\x04\xcb\x35\xa0\xd7\xbf\x70\xf8\x56\x88\xa3\xca\xe1\x1b\x28\xcc\x53\x70\xf2\x41\x90\x6b\xf1\x4d\x0e\xb1\x62\x82\xa9\x17\x16\x33\x0c\xd8\xca\x48\x38\x40\xcb\x8c\xa4\xdc\x5c\x58\x88\xdc\x0f\x90\x9e\x2d\x6e\xf9\xf2\xe8\x80\x66\x53\xbc\xca\xb0\x0b\x3f\x9b\x05\x4e\x30\xc3\xdd\xab\xce\x5a\xe0\x69\xb5\x1a\x34\xc2\xce\xdd\x12\x93\x09\xa3\x84\x8e\x46\x12\xa3\x65\x97\x46\x1a\xac\x99\xa6\x75\x5f\x68\x04\xc1\xc3\x88\x92\xfc\xca\x3b\x0c\x19\x5c\x79\xc3\x52\x0b\xad\xbf\x61\x5e\x58\xac\x8e\xf5\x12\xca\x28\x9a\xd1\x3c\x68\x85\xbc\x27\x77\xe5\xfe\xbd\xb5\xe3\x9e\x1d\xb6\xa3\xba\xcf\x33\x0b\x71\x57\x07\xe6\x7c\x14\xa4\xd9\x90\x83\xa8\xf0\x66\x3b\x37\x49\x06\xd2\xe8\xe3\x36\x9e\x98\x92\xc8\xca\x6f\x81\xf0\x78\xef\xf0\x3d\xcb\x59\x6b\xff\xed\x58\x07\x0b\xec\xe8\x62\x48\xd5\x3d\xb7\xad\xb7\x55\x76\xdc\x53\xca\x62\x76\xac\x99\xc2\xe4\xe6\x5e\x5d\xea\xa2\xd6\xdc\x06\x0c\x8d\x4f\xba\x46\x4e\x8e\x1d\x55\xf3\x16\xbd\x7d\x5d\x8e\x24\x91\xf4\x96\x00\x8f\x84\x21\x16\xff\xdf\xab\x37\x97\x3e\x7f\xed\x42\x13\x96\x66\x09\xa4\x18\x57\xf1\x9a\x4a\x35\xa6\x09\x48\xe4\x4e\x3f\xf3\xb4\xf2\xf7\x4c\x08\x78\x0c\x09\x9d\xda\xc9\x62\x88\x04\x5a\xe2\x85\x24\x99\x11\x70\xd3\x2c\xc7\x14\x0e\xbc\x8a\xef\xbd\x37\x49\x67\x0b\xd0\x14\x26\xaa\xc1\x74\xa1\x05\xb4\x3a\xee\xba\xf1\xba\x34\xa0\xbc\x98\xfb\x29\x81\x1d\x6b\xd1\x83\xf2\xc4\xf7\x7e\x65\xc8\x90\xe9\xaf\xb0\xb1\x95\x67\xdc\x30\x17\xec\xeb\xaf\x56\xdc\x19\x43\x96\x88\xa9\xc1\x8b\xfb\xcf\xca\x9a\xdf\xb3\xf6\xb9\x5e\x77\xbe\x75\xcf\xf2\x9a\xf3\x59\xe3\x54\x13\x33\x2d\x52\xa0\xb6\x9a\x68\x95\xfb\x6f\xa3\x89\x16\xd8\x1f\x97\xcf\xf6\x20\xcc\xaf\x7f\xe1\xad\x0d\xc1\xeb\x6b\x69\xd3\x4f\xc1\x6f\x5c\x12\xa4\xa7\x99\xa3\x34\x46\x16\x9c\x65\x77\x8f\xc3\xe5\xee\x91\x67\xfc\x6d\xf7\x48\x35\xfe\xb6\xfb\x64\x1b\x3b\x36\x61\x9b\xf7\x23\x9d\x1d\x1b\xd1\xd8\xfb\x11\x70\x8b\x49\x27\xab\xbd\xc9\x5b\xcc\x6b\x74\xe2\x1d\x90\xf0\xae\x2a\xcb\xa8\xc8\x77\x2e\xe7\xd0\x08\x6f\x58\xa6\x6a\x90\x88\xe8\xc6\xd9\x2d\xdf\x9e\x85\xf4\x3e\x5f\x96\xcd\x25\xf7\x11\x76\x1f\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x53\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\x75\xcf\x78\x72\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x7d\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x79\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\x28\x61\xef\xea\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfa\x85\x8c\x40\x2b\x83\x05\xb0\xb8\xa9\x42\xcd\x64\x63\xe0\x74\x90\x2c\x9c\xf8\x3e\x52\xe2\x9e\x5c\x6d\x3c\x1e\x08\x61\xbe\x6e\x1e\x62\xa8\xea\x78\x4d\x67\x93\x78\xe6\xbd\x65\x39\x76\x8b\x83\x9a\x4f\xdf\x9e\x35\x15\xca\x8c\xdd\x4d\xc2\xac\xae\x10\x2f\x56\x0e\x74\xb5\xfe\xde\xdc\x72\x88\x31\xc9\xcd\x97\x2d\x37\x87\x9e\x45\x4c\x27\xd3\xf0\xe2\xde\xa2\xb2\x23\x4f\x27\x24\xfa\xf4\xed\xd9\xfa\xe6\x7b\xbf\x01\x1f\xc3\x52\xdf\xda\xe1\x5b\x3b\x7c\x18\xad\x18\xb4\xe5\xa4\xad\x18\xb4\x62\x3c\x6f\x31\x68\xd7\xed\xd6\xad\xb5\x99\xb4\xd6\xe6\xd5\xb7\xb5\xd6\xe6\xd6\xda\xdc\xda\x6f\x96\x8c\x56\x70\xc1\xd1\x0a\x2e\xf7\x8c\x27\x27\xb8\xb4\xd6\xe6\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\x3d\xc5\xd0\xdd\xd6\xe8\xd7\x1a\xfd\x5a\xa3\x5f\xcb\x8d\x5a\x6e\x74\xcf\x78\x72\xdc\xa8\x35\xfa\x6d\x3a\x51\x6b\xf4\x5b\x38\x5a\xa3\xdf\x3d\xa3\x35\xfa\xb5\x46\xbf\x25\xa3\x15\x5c\xb6\x9c\xb4\x15\x5c\x56\x8c\xe7\x2d\xb8\xb4\x46\xbf\x96\x5a\xb5\xd4\xaa\xa5\x56\x4f\x83\x5a\xd5\x37\xfa\xdd\x73\x92\x56\x3f\xbb\xfa\xa4\xac\x7c\x96\x45\xab\x5e\xb8\x75\x4f\xf7\x5a\x0d\x60\x07\x54\xc1\x37\x7f\x9c\xab\x5b\x5e\xbe\x25\x85\x98\x51\xbd\x7d\x7f\xd6\xe2\x15\xcb\xf7\x6c\x8d\xbd\x0f\xcb\xd8\x72\x16\x57\x58\xf9\xde\xa0\x58\xb3\xb5\xf1\x85\xbd\x39\xf4\x99\x9f\xe9\xcb\x59\x70\x1e\xbe\xa4\x00\x7d\x50\x1a\x6f\xc7\xe0\x1b\xda\xb8\xd2\xd3\xa1\x63\x3c\x53\x21\x7a\x79\x61\xff\xa4\x9a\xe1\xc8\xfe\x3d\x0b\x2e\xdf\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x99\xb5\x5e\x9f\x85\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\xfa\x7e\x0e\xdd\x2d\x65\x2a\x2f\xb3\xac\xaf\xc3\x98\x5d\x0f\x8c\x3e\xc8\x94\x29\xb5\x2c\xe0\xba\xba\xf4\xfb\xc8\xe6\x1a\xe4\x72\x09\xfc\xfd\x17\x95\x96\x13\xc4\x27\xdb\xfe\x67\x40\x23\x22\xf3\xc4\x35\x01\x75\xe5\xaf\x09\x8d\x22\x91\x73\x4d\x38\x40\x6c\x2d\x1b\x8b\x70\x75\x0d\x62\xbb\x86\xfc\xb4\xae\xf4\xd4\xb5\xeb\xbc\xf7\x2e\xf7\x0d\x27\xf6\x13\x16\x16\x54\x2f\x8f\xf5\xa5\x2d\x7c\xfd\xfd\x5c\x6b\x13\x56\xb8\x36\x23\xac\xec\x6f\x5f\x24\x2c\x9a\xbe\xcd\x13\x70\x2d\xe2\x4a\x4d\xf4\xad\xb4\x5b\x16\x91\x33\xbc\x1b\x57\x6f\x7b\x53\xc6\x02\x6c\x27\x69\x57\x18\xa0\xf2\xb8\xef\x52\x65\x5b\x3b\x98\x87\x08\xcd\xb2\x04\x53\x29\x84\x11\x5a\x6c\x8f\xfe\xd0\x5f\x6f\xd1\x6d\xeb\x4b\x2f\x6b\x89\xd7\x64\x23\x11\x9b\x78\x9b\xd5\xe0\x3e\x54\x21\x1b\xca\xda\xc4\x96\x88\xff\x41\x8a\x3c\x5b\xf3\xf6\x79\xcb\xa2\x7d\xda\x77\xdf\x2a\x37\xb0\xf1\x17\x9d\xcb\xc8\x77\x0c\xb6\x4d\xba\x9c\x49\xd4\x76\x03\x4f\xf3\x44\xb3\x2c\xb1\x6d\xbe\x47\x76\x42\x2a\xa1\xe0\x1b\x1d\x42\xf9\xd4\x7b\xa0\x5c\x9b\x08\x88\x09\x1d\x99\x19\xb5\x6f\x1e\x6b\xfb\x4b\xe4\x29\x98\xd3\x1c\x97\x1a\x9a\x1a\x75\x8a\x4f\x8b\xd9\xc9\x2d\x4b\x12\x6c\xdf\x9b\x24\xe2\x16\xe2\x1e\xd9\xdb\x9b\x25\xe5\x91\x90\xa5\xf5\x20\x31\xd9\xfb\xa2\x72\x97\xa1\x1c\xc5\x82\xd7\xc1\x11\xb2\xb1\x60\x49\x36\x13\x2e\xc9\xe6\x62\x34\x21\x5c\x70\x6f\x1e\xfe\xf9\xed\xab\xed\x10\xe1\xb2\x3a\x87\xeb\x27\x02\xd8\x1c\x3b\xa3\x52\x33\x9a\x90\x5c\x26\xca\xe2\x02\x35\x8a\x84\xf4\x0d\x59\xc6\x14\xbd\x8b\x11\x28\xdb\xf9\x83\x7c\x61\x77\xdf\x6d\x8e\x3d\xe3\x82\x27\x53\x42\xed\xd6\x0c\xf3\x24\xe9\x90\x21\xe3\xd4\x90\x6e\xc8\x7c\x36\x8d\xd1\xc1\xc8\x15\xe3\x11\x98\x6f\xea\x06\xe1\x04\x57\x64\x66\x34\x34\x22\x1c\xf4\xb8\x53\xea\x0a\x8d\xbd\xbc\xf1\x15\xe6\xd0\x47\xd8\xfa\x6e\x28\xa4\x17\x7b\xde\x8a\x04\x4d\xe4\xce\x78\xee\xba\xe2\xd3\xf2\xe5\xbf\x33\x8e\x8a\x0e\x79\x8b\xcc\xc7\x28\x4c\xc0\xb0\xc7\xb4\x99\x12\x5b\xdd\x1a\x64\x29\x90\xf2\x40\xe5\xd1\xd8\x7c\xd2\x5e\x26\x62\xb5\x67\x48\xd1\x9e\x82\x48\x82\x56\x7b\x87\xe6\xaf\xd9\x6f\xc0\xef\x2b\x3f\x77\x44\x33\xb6\x77\xd8\x21\x08\x20\x6c\x96\x22\xf4\xf8\xe9\xe2\xa1\xff\xd6\x4a\x8f\xae\xfb\xc6\x4c\x27\xc0\xd2\x0c\xae\xf3\x87\xc8\x6c\x23\x0d\x43\xe7\x35\x60\xae\x95\x41\x4a\xdb\xe3\x33\x34\x99\x9f\x25\xf8\x84\x9c\x84\x26\xfb\xa0\xb1\x97\xb8\xbb\x1b\x26\x20\xa7\x7a\x6c\x34\x5e\xa6\x02\x01\x79\xf2\x40\xaf\x07\x70\x77\xe0\x3d\x70\x0b\x24\xb7\xdd\x99\x66\x81\xbb\xff\xc5\xfe\x2c\x21\x2d\x38\xc2\x93\x05\x25\xb2\xe8\xad\xc0\xf8\x8b\x79\xb2\x0a\x42\xfb\x93\xa5\x96\x81\x7e\xbc\x7a\x65\x3b\x31\x39\x58\xfd\xc4\x78\xac\x42\x35\xa4\x38\x74\xdc\x34\xf0\x5e\x08\x64\x5c\xe1\x53\x04\xf0\xbc\x08\xbc\xae\xd8\x7a\xcf\xf4\x25\x1d\x69\x17\xd4\x1a\xec\xec\x54\x91\x94\x0c\x9d\xea\x58\xb7\x95\x11\x41\x12\x3a\x80\xc4\xb6\x6d\x32\x57\x8b\xe5\x93\x93\x57\xaf\x43\x87\x33\xec\x18\xfa\xb1\x95\x99\x35\x9c\xaf\x73\x7d\xe2\xe6\xc7\xfa\xf2\x2b\x82\x62\x33\x83\x32\xb9\x02\x6d\x8f\x59\x4a\x33\x73\xca\xec\x1c\x0b\xed\xa1\xaf\x10\xd2\xf7\x1f\x96\x8d\xe4\xfe\xf5\xfb\x3a\x2d\x7a\xc9\x5a\x47\x65\x3d\xaf\xf1\x26\x67\x6f\x85\x95\xa4\x18\x15\x30\xcf\x20\xb4\xd3\x0d\x9c\x34\x1f\x85\x1e\x7d\x16\x83\x95\x4d\xae\xb6\xa9\xec\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa2\x78\x19\xdd\x3b\x81\x48\x8b\xd5\xa5\xe3\xfc\xcd\x1a\xd2\x2c\xb9\xef\xe4\x91\x8d\x95\xb4\x94\xf1\xb7\x40\xe3\xe9\x15\x44\x82\xc7\x6b\x12\xd8\xca\x7e\xbc\x66\x9c\xa5\x79\x4a\x78\x9e\x0e\x00\x41\xac\xec\x5c\x48\x48\xac\x02\x4c\x09\x87\xdb\x64\xea\xdb\x0d\x93\x4c\xc4\x9e\x9e\x0c\xb0\xab\x72\x3c\xc5\x1e\x69\x58\x64\x95\x4f\xcd\x24\xd8\x3d\xd9\xd7\xe2\x23\x91\xa4\xca\x88\x45\x1d\x9c\x94\x69\xc3\xb1\x06\x80\xfe\x29\x16\x83\xd9\x63\x3a\xa1\x2c\x31\xa2\x75\x8f\x9c\xc1\x90\xe6\x09\xb6\xfa\x23\x2f\xc8\x81\x79\x99\xd7\xc9\x16\x3d\x60\xc4\x5d\x25\x8c\x36\xaf\x5c\x9e\x3c\x2e\xe8\x70\x03\x8b\xfb\x3a\x35\x00\xfd\x58\xb7\x16\xa0\x1f\x19\xcd\xd5\xba\xaa\x7c\x65\x63\x2e\x6c\x57\xed\xb2\x24\x5a\x22\xe9\x4c\xb9\x99\xd7\x63\xd9\xab\xeb\x27\x2c\x58\xb5\x14\x23\x09\x4a\x9d\x01\x8d\x13\xc6\x61\x7b\xfc\xba\x1e\x03\x49\xe9\x1d\xe2\x18\x36\x45\x67\xbc\x82\x61\xb4\xfc\x55\x5a\xd8\xc6\xfb\xfe\xf5\x64\x00\x43\x6c\xe5\x88\x1f\x5c\xda\x7d\x8b\x3f\x43\xca\x12\xa3\xa1\x5f\x57\x61\x53\x74\x40\xb6\x88\x63\xfe\x66\x3c\x07\xf3\x54\x26\x05\x2a\x93\xf6\xd1\x32\x8f\x47\x1e\x4a\x8b\x96\xe4\xbe\xeb\x5f\x7f\x06\x14\xe7\x77\x91\x35\x14\xba\x6e\xe2\x1e\x37\x55\x2e\x87\x46\x75\xf4\x1a\x67\x69\x41\xae\x5d\x2c\xb9\x14\xda\x35\x0f\x0c\x1f\x88\x4f\xbb\x66\x96\xa0\x34\x4b\xf1\x80\xc5\xb9\xf4\xad\x35\x11\x66\x74\xf1\xd6\x57\x8e\xca\x37\x2f\x5e\xac\x29\xbf\x3d\x3c\xd2\x4b\x40\x4d\x79\x1b\x7c\xb9\x0c\x74\xc8\x93\x7f\xa3\x02\x9b\x3d\x66\x4e\x0c\xc6\x1e\xa1\x20\xd1\xd7\xc8\x94\x66\x7c\x94\x33\x35\x26\x03\xd0\xb7\x00\x9c\xc0\x9d\xad\x92\x41\xfe\x03\x52\xe0\xa6\x1a\xf0\x16\x6e\x86\x0a\xd0\x5e\xee\x0e\xc4\x26\x4c\x31\xc1\x7f\x64\x4a\x0b\x39\x7d\xc5\x52\x76\x4f\xf9\x52\x3f\xe6\x3b\x25\x07\x08\x8a\x24\xc6\xfe\xc6\x2c\xa2\x57\x60\x3f\x58\x02\x5a\x41\xb5\xb0\xea\x29\x31\xe7\x64\x40\xa3\x9b\x07\x03\xf0\x8b\x5d\x81\xb0\x67\xd7\x5b\x40\x15\xe5\xbd\x30\x01\x92\x2d\x8b\x94\xe7\x77\x16\x3e\x15\x28\xdf\x8e\x85\x02\xbc\xc1\x1a\x2a\xf1\x31\xef\x58\x60\x2a\x10\x0c\x73\xba\x05\x07\x45\xe8\x70\x58\xbd\xa3\x38\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x1a\x5b\x53\x96\x88\x83\x38\xb1\xaf\x9c\xd8\xbf\x09\x94\xd7\x36\x44\x6f\x6e\x32\x26\x76\x9d\xe7\x77\x46\xb7\xbc\xd7\x23\x54\x1d\x15\x90\xcf\x4e\x53\xd5\x80\x93\xea\x86\x38\xb9\x2d\xb5\x6d\x86\xaf\xd1\x88\x5c\xfc\x82\xbb\x70\x72\x79\xb6\xbe\x29\x66\x1b\x05\x77\x63\x15\x77\xd6\x5c\xbe\xe2\xa3\xbc\xc9\xd4\x5d\xa9\xda\xcc\x6d\x7b\xe9\x0e\xa1\xe4\x06\xa6\xb6\x13\xf5\x5c\x6b\x5f\x09\x89\x93\x24\x00\x3b\xdc\x9a\x9b\x5c\x5b\xea\x0d\xd6\xbb\x31\xf6\xd8\xb1\x99\x3b\xc3\x8f\xae\x59\xe8\x86\x4f\xf8\x8f\xde\xe0\xb1\xcd\x11\xdc\x8e\x1b\x98\x6e\xf6\xc0\xcc\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x43\x10\xf4\xc2\x56\x6f\xe6\x67\x2a\x8f\x8d\x4d\x54\x7e\x78\x20\xd6\xfa\xbc\x80\x7e\x65\x2b\x93\xf9\xc6\x7d\x65\x91\xd1\x9c\xe9\x31\xcb\x90\x11\x79\x67\x80\x6f\x94\xfe\x0b\x4d\x58\x1c\xa6\xb0\xe7\xf7\x82\x77\x8c\xf8\x64\xfe\x83\x44\xd7\x8a\x6b\x67\x02\xd4\xa5\xd0\xf8\xcb\x47\x03\x90\x5d\x66\x2d\xf0\xd8\x29\x9c\x15\x1a\xa9\x0c\x2a\x5e\xa5\x1e\xeb\xaa\xe7\xab\x83\x05\x50\x32\x45\x2e\x38\x11\xd2\xc3\x01\xbb\xde\xdb\x89\xec\x14\xc8\x27\x06\xd6\xc1\x81\xf6\xe9\x85\x73\x38\xf0\x09\x59\x81\xde\x8a\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\xab\x7e\x82\xd2\xae\x13\x55\xa9\x77\x94\xb3\x88\xa4\x20\x47\xe8\x71\x89\xd6\xf6\x38\x54\x37\x65\x33\xba\x6b\xc7\xc6\xd4\xb7\xfc\xc2\x8d\xb0\x00\x59\x93\x35\x01\xd5\x61\x6e\x76\x86\x8a\xc9\xe9\x7f\x0c\x05\xc7\x3d\xf8\x5f\x92\x51\x26\x55\x8f\x9c\x10\xc5\xf8\x28\x81\xca\x35\xa7\x61\x94\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd0\xc4\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x2c\x4b\xed\x38\x49\xc5\x50\x9e\xe0\xe8\xda\xbb\x81\xe9\x5e\x67\x0e\x69\xf6\x2e\xf8\x9e\xe5\x2d\x73\x68\x12\x18\x11\xfa\xc8\xf6\xf0\xda\x5e\x93\x5c\x78\x43\x86\xb3\xad\x1d\xad\xfa\xd2\xb5\x31\xc2\xc7\x87\x6c\x29\xac\x57\xb4\x44\x17\x15\xa5\x05\xc9\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x5b\x94\x1e\x77\x46\xf0\x33\x9a\x04\xe3\xa3\x9f\xb3\x98\xea\xb5\x02\x53\xed\xa8\x40\x64\xff\xad\x9d\x84\xe4\x38\x8b\xc1\xad\x21\x1b\x91\x8c\x4a\x9a\xaa\x1e\xe9\xbb\x0a\x89\x88\x69\x6c\x58\xb6\x25\x3a\xd8\x5d\x4f\x33\x20\x7f\x25\x6f\xcb\x6b\xe9\x91\x6e\xb7\x4b\xae\xdf\x9c\xbd\x39\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x19\x9a\x13\x42\x35\x4c\x40\x92\x5b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x0f\x8b\xc7\xdb\x49\x26\x29\xbd\xbb\xca\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\xc3\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x77\x4c\xfe\x84\xae\x6d\x4a\x32\x90\x11\x70\x4d\x47\x30\x6b\x06\xb0\xf7\xbd\x7c\xf1\x5f\x87\x8e\x1f\x99\x19\x9d\xf5\xe4\x85\xc1\x88\xd7\xf4\xee\x67\x5e\x98\x06\x99\x22\x2f\x7a\xe4\x64\xe6\x65\xf8\x5c\x12\xe5\x09\xda\x5a\xd0\x5d\x5f\x7a\xe5\x60\x4a\xa4\xc8\xd1\x61\x4f\xf2\xac\xaa\xcd\x7e\xf5\xa7\xff\x32\x4a\x1f\x4d\xb3\x04\x8e\x7d\x61\x55\xab\x36\x1b\x19\x46\x0b\xf2\xf5\x8b\xff\xb2\xd4\xd3\x9c\xcf\x42\x2b\x2c\x60\x46\x0d\xc0\xf2\x8c\xb0\xd4\x86\x73\x42\x32\x2d\x2a\xb4\xca\x2a\xfa\x2b\x4d\xa5\x56\x1d\x82\x5e\xfd\x20\x1c\x6a\xa1\x69\x32\xa3\xe5\xa3\x16\x0e\xb7\x16\x48\xb1\x40\x98\x00\x1a\xaa\xc8\xcb\xaf\x5f\xfc\xd7\xbc\x39\xe5\x0d\x8f\x00\x9f\xc4\x27\x30\xcc\x62\x60\x94\xfb\x1b\x96\x24\x10\x77\xee\x5d\xfe\x30\x97\x7a\x0c\xb2\x43\x80\x2b\x6f\xac\x32\xeb\x9b\x59\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\x2f\x5e\xf2\xfa\xc7\xcd\x0c\xca\xa7\x6f\x86\x9b\x8a\x03\xdd\x2d\xcc\x10\xf3\x4f\x6f\x21\x52\xde\x75\x6f\x42\xb6\x65\x97\x71\xdd\x15\xb2\x6b\xa7\x39\x26\x5a\xe6\xf7\x7b\x0d\x8a\x91\x56\x4e\xc0\x47\x20\x03\x79\xe9\xbc\xcd\xed\xea\x83\x9c\xfc\xed\xcf\x73\x2c\x6e\xf9\x72\xca\x81\x84\xd3\xd1\x8c\x2d\x4f\x7d\xd5\xe2\x36\x73\x6c\xcc\xdb\xcd\xdd\xff\x67\x1e\xbb\x37\x20\x07\xee\xec\x86\xd3\x6e\xe4\x2a\xf4\x78\x74\xd6\x78\x7b\x38\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x01\xe5\x9a\x3b\xe1\x0b\x28\x90\x5d\x47\xe1\x90\xd1\x18\x51\x60\xce\xb9\x5a\x7a\xd0\x13\xa0\x4a\x2f\x02\x45\x7b\xd0\xef\x1f\xab\x93\x00\x66\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5a\x44\xd9\x7b\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x5e\x38\x12\x66\xff\xaa\xf2\xd5\x43\x85\xcd\x78\x23\xe7\x36\xa2\xb5\x7b\xb4\x14\x1c\xec\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8c\x14\x9d\x82\xa6\xab\x13\x45\x66\x47\x95\x68\x5f\x69\xca\x63\x2a\x63\xb7\xca\xfd\x7d\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4c\xc6\x5a\x67\xea\xf8\xe8\x68\xc4\x74\xef\xe6\xcf\xaa\xc7\xc4\x51\x24\xd2\x34\xe7\x4c\x4f\x8f\xd0\x81\xc6\x06\xb9\x16\x52\x1d\xc5\x30\x81\xe4\x48\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x44\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\x3f\xf8\x17\x3d\xb0\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x86\x8b\x5b\xde\x45\x4d\x56\x6d\x74\x9a\xd6\x8b\x62\xf0\x63\x06\xde\x9b\x04\x2e\x64\x22\x7e\xf0\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x03\xef\xc5\x36\xb6\xdd\x6e\x11\x18\xb0\x4e\xd4\xba\x1d\xdb\x69\x43\x34\xd2\x6c\x02\x5b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x57\x86\x99\x5f\x1b\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x63\x94\x4f\xe7\xb9\x36\x12\xff\x0d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\x9b\x59\xe6\xb6\x67\x97\x25\x37\xdd\x37\x7f\xdc\x64\xeb\x86\xd8\x8a\x61\x43\x2b\x7b\x35\x82\x62\x58\xce\x12\x70\xdb\xb3\xaf\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\xf3\xa0\x16\x8f\x2d\x5d\x21\xdb\xfb\x1b\x08\x62\xd0\xc9\x56\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\xd3\xa4\x7c\x2c\xa1\x21\x5c\x5b\x9a\x56\xb7\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\xcf\x50\xfa\xbc\x0a\xdf\x75\x31\xe2\x22\xfc\x7c\x7e\x07\x51\xbe\x6e\x36\xf9\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x9c\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\x09\x30\x92\xa4\x86\xc6\xf8\x44\x98\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x16\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x52\x29\xa3\x5a\xd9\x4a\x7c\x10\xb2\x1a\x5c\x2a\x4f\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x0e\x3b\xa4\x48\x36\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x7b\xf6\xe3\xf6\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\x1d\x42\x62\x90\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x6f\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xd3\x1b\x87\x63\xe4\x05\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xfd\xa5\x15\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x61\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x03\x05\x29\x75\xaa\x11\x4a\xe4\x07\x6d\xcf\xf1\xab\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x22\x51\x4e\x0b\xa6\xfa\x41\x9b\x69\x5e\x2d\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\x4b\x13\x60\xd8\x97\xb7\xc3\x7c\x9c\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xad\x5d\xf8\x11\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\x3f\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x72\x24\xf6\x1a\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xb2\xfb\xf2\xc5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x98\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xe6\xed\xb6\xee\x31\xd2\x10\x4f\xa8\xcd\x07\x66\x15\xa8\x3c\x49\x0c\x7a\x5b\x8f\xd9\x3c\x08\x16\x78\xb2\x16\x64\xdb\x58\x37\x6b\x5a\xca\xba\xc1\x7b\xae\x45\x26\x12\x31\x9a\x96\x77\xd0\x76\x75\x29\x95\xb7\xa1\x44\xe5\x03\x27\x02\x9a\x43\x74\x39\xb3\xe5\xad\x2f\x64\xe9\x68\x7d\x21\x73\xa3\xb5\x0f\xcc\x8e\xd6\x3e\xb0\xc1\x68\xed\x03\x0b\x46\x6b\x1f\x98\x1f\xad\x7d\xa0\xb5\x0f\xd4\x19\xcf\xdf\x3e\x40\x5a\x5f\xc8\xb2\xd1\xca\x3a\xc5\x68\x65\x9d\xf5\x47\x2b\xeb\xcc\x8f\x56\xd6\x69\x65\x9d\x56\xd6\x69\x65\x9d\x6d\x47\x0d\xe4\xce\x44\xdc\x78\x8a\x4c\x26\xe2\x15\x19\x32\xd6\x5e\x1d\x89\x6e\x22\xa2\x50\x59\xc4\x3c\xe2\x3c\x1f\x8a\xa6\xd6\x84\xde\x21\xff\x11\x1c\x6c\x7a\x82\x2d\x59\x9b\x02\x11\xd8\x04\x22\x13\xf1\x81\x3a\xdc\x22\xf0\xbc\xcd\xb0\x69\x33\x6c\x3e\x81\x0c\x9b\x31\x55\xae\xf0\x11\x92\xd6\xe5\x09\x37\xa5\xe3\x7f\x0d\x32\xfd\x64\xf3\x6d\x0c\xc2\x39\x84\xc1\x3e\x73\x05\x52\x58\xd8\xc5\xce\xb7\x0b\x71\xbf\x0a\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x76\x2d\x92\x09\x32\x64\xae\xfe\xd7\x0c\xfe\x3a\x08\x3f\xf1\xbc\x99\x2a\x24\x9e\x74\xf2\x4c\xf5\x53\x1a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xe4\x52\x69\x9a\xd1\x4a\xbb\x44\x3b\x77\xda\x4f\xb5\xf4\xd2\xa6\x94\x48\x54\xf2\xae\x36\x2a\x73\xbc\x7c\x2c\x2c\x4e\xfb\xef\x1c\xe4\x94\x88\x09\xc8\x42\x31\x0a\xdd\x79\x3a\xa1\xc9\x4c\x44\x5d\x01\xe4\x66\x0c\x3c\x8d\x98\x22\x9a\xd4\xd4\x9b\xf6\x1a\x92\x1d\xab\x7e\xbc\x7c\x34\xab\x38\x34\xa8\x36\x3c\xb5\x5a\xca\xcb\x47\xa3\xe6\x37\xd2\xb0\x09\x8e\x34\x68\x86\x23\xcd\x9a\xe2\x48\xe3\xe6\x38\xd2\xa4\x49\x8e\x7c\xf4\x0a\xd0\xcb\x47\xc3\xe6\x23\xd2\xb8\x95\x8e\x3c\xc1\x7a\xd2\xcb\xc7\x03\x80\xbb\x49\x8b\x1d\x69\xab\x53\xd7\x1e\x4d\x1b\xd4\x48\xd3\x46\x35\xd2\x34\x1e\x6e\x55\x05\x7b\xf9\x68\xeb\x63\x3f\x80\x9c\xd6\x98\x10\x51\xb7\xa6\xf6\x7d\x0b\x6d\x00\x27\x43\xef\xde\x8f\xa5\x00\x59\x2e\x5d\x34\x8c\x35\xef\x2e\xf5\xea\xc2\x50\xcd\x72\x63\x53\x1f\xb7\x8a\x18\x8d\xbf\xc7\xde\xe0\x95\xf3\x52\xf1\xb8\xd2\x64\x73\xad\x63\x0a\xd3\x59\x68\x1e\x63\x94\x82\xa2\xe9\x54\xe9\x61\xbc\xb7\x67\xc3\x49\x0b\x69\x82\xc7\xb3\x01\xa6\xc5\x13\xa8\x5f\xd8\x76\xb6\x7b\xde\x8e\xbd\xaf\x8a\x3b\xf6\x7a\xe5\xce\xb7\x6e\xc6\x83\xff\xf9\xdf\xc3\x4a\xf5\x96\x62\xc2\x56\xfb\x5b\x7b\xb4\xda\x5f\xad\xd1\x6a\x7f\x4b\x47\xab\xfd\xd5\x18\xad\xf6\xb7\xde\x68\xb5\xbf\xe5\xa3\xd5\xfe\x5a\xed\x6f\x8b\xd1\x6a\x7f\xad\xf6\xb7\xed\xf8\x84\xb5\xbf\x66\xa3\x9a\xcb\xba\x98\x0b\x12\x41\xf9\x51\x53\xcd\xa2\x22\xe2\xd9\xdf\x65\xff\xd5\xac\x0e\x58\xd6\xef\x16\x6b\x80\x65\x2d\x71\x4e\x0b\xee\xdd\xa3\xee\x05\x85\x70\xee\xc9\xd5\x9a\xe0\x73\x8b\xdc\x6e\x0c\x13\x4b\x2e\xe1\x46\x51\xf1\xda\x07\x96\x15\x8d\xd7\x43\xd4\x59\x4c\x0e\xbc\x2f\x1e\x1b\xa9\x70\xa1\xab\x17\xb9\x66\xdd\xe2\x8e\xe0\x9d\xc7\xa0\x9a\x4a\x3e\x7f\xc5\x85\x1c\x62\xd8\x42\x7c\x54\x81\x3d\x86\x3c\x82\xac\xac\x01\x1b\xd7\x0e\x19\xb7\x91\x8e\xbe\xe9\x8f\xe0\x3e\x68\xca\xd2\x53\xa4\x80\x1e\xcf\xad\xe8\x8b\xeb\x41\xf9\xb7\x80\x5d\x29\xca\x87\xe2\x21\xa3\xdc\x25\xc3\x0a\xee\xbb\xd2\xdb\x4e\xf3\x85\xbc\x1c\x7a\xa9\x84\xb7\xf7\xc8\x39\x62\x7d\x79\x62\xa6\x10\x3e\xd4\xf6\x3f\x69\x06\x91\x77\xab\x70\xc3\xed\xc6\x85\x1b\x66\x22\x46\xda\xba\x0d\x6d\xdd\x86\x5a\x75\x1b\xf0\xa2\x3d\xdc\x8d\x17\x70\x20\xff\x70\xed\x91\x24\x20\xa8\xd2\x3c\xd1\x2c\x2b\x22\xb0\x95\x7d\x55\x62\x35\x89\xa1\x8b\x04\xad\xe2\xbb\x79\x1b\x8d\xc6\xb3\x78\x8f\xf3\x61\xc4\xb6\x42\x72\xe2\xa2\x2d\xb1\x99\x11\x56\x1c\xf0\x6a\x87\x0d\x29\x65\x4f\x3f\x52\xf0\x0c\x09\xb6\x2a\xb4\x66\xdb\x6b\xcb\xd0\xf9\xc4\xa0\x84\xa1\xd8\x2b\x18\x44\xb9\xa1\x05\x46\xad\xb2\x09\xf0\x82\x4b\x1c\xa8\xc3\x43\x2f\x0d\x35\xca\xbd\x1e\x84\xfb\x7c\x5b\xe2\x12\x7f\x5b\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\x4f\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x1e\x3d\xa2\xed\x53\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x9e\x87\xdf\xa2\x4d\x18\x5d\x7f\x3c\x85\x84\xd1\x47\xf2\x4d\x3c\x9d\xbc\xd1\x27\xeb\x8f\x78\x2a\x79\xa3\xad\x0f\x62\xa3\xf1\x5c\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8c\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xcc\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x98\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x01\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4c\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\xb3\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x27\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\xf7\x8f\x4f\xbe\x1a\x5d\x25\x96\xee\xf1\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x79\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\xb3\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x89\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\x57\x20\x27\x2c\x82\x93\x28\x32\x7f\x5d\x8b\x1b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xdb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\xaf\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x4b\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7d\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\x2f\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x9f\x1f\xfc\x72\xf2\xf6\xd7\xcb\x93\xd7\xe7\x87\x28\x81\xc2\x5d\x46\xb9\x39\x15\xb9\x2a\x02\x45\xdd\xeb\xcc\x8b\x80\x4f\x98\x14\xdc\xac\x0f\x75\x35\x4a\x26\x7e\xd6\x28\x1c\x06\x09\x4a\x24\x13\x88\xad\x9c\x1c\xde\xe6\xb9\x0e\xe3\x59\xae\xbd\xee\x88\xe1\x8b\xe6\x00\xf1\x68\x4c\xf9\xc8\xac\xf3\x4c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\x4a\x4e\xd4\x63\xed\xe7\x1d\xcf\x29\x0c\xad\x57\xb6\x24\xa2\x8a\x68\xe6\xd7\x5c\xfe\x2c\x35\xe5\x9a\xde\x1d\xdb\xf8\xbd\xbd\xcf\x4b\x97\xf6\x7c\x39\x49\x61\x5e\x61\xf9\x8d\x5d\x55\x82\x95\x0c\x13\xb2\x57\xbe\xbb\x47\xce\xcd\x3b\x20\x2e\x03\xd0\x86\x5f\xc2\x04\x24\x6a\x9e\x0e\x7c\x1d\x22\x61\x44\x65\x9c\x80\xc2\xc0\x43\x4f\x9b\xad\x76\xe0\x00\x06\x41\xaf\xe5\x42\x2f\x22\x26\xe4\xb5\xc0\x20\xc4\xa1\x38\x26\x63\xad\x33\x75\x7c\x74\x74\x93\x0f\x40\x72\xd0\xa0\x7a\x4c\x1c\xc5\x22\x52\x47\x9a\xaa\x1b\x75\xc4\xb8\x39\x5c\xdd\x98\x6a\xda\x2d\x9d\xea\x23\xcb\xb9\xbb\x91\x48\x53\xca\xe3\x2e\x75\xd8\xd5\x0d\xdb\x7a\xf4\x07\xc7\x53\xbb\x34\xdc\xc5\x78\x97\x76\xd5\x18\x92\x64\x7f\x0b\x7c\xae\x27\xf3\xd5\x90\xf5\x6a\xc9\x78\xee\xdb\xeb\x1f\xe0\xf3\x70\x5e\x2d\x0c\x7a\xe4\x52\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\x97\x1e\xe9\xf3\xcb\xeb\xb7\xff\xec\xbf\xb9\xb8\xbc\x6e\x4f\x76\x7b\xb2\xdb\x93\x5d\xe3\x64\x03\x9f\xd4\x3e\xd5\x5e\xe6\x2c\x1d\x93\xb0\xdf\xc8\xa9\x15\x68\x7f\x0c\xc2\x06\xd4\x96\x10\xed\x78\x34\xa8\x57\x20\x70\xce\x27\xbf\xd0\xaa\x85\x9d\x2f\x04\x07\x71\x37\x58\x41\x39\xc8\xe0\x75\xe2\xe3\x6b\x58\xb3\xea\xba\xaf\xb6\x92\x22\xed\xa8\xef\x5a\x32\xaf\xde\xde\xd0\x50\xd9\xbe\x4b\x9a\x16\x15\xaa\x17\xec\x5a\x8f\xbc\xf6\x6a\x0f\x39\xfd\xf5\xe2\xec\xfc\xf2\xfa\xe2\xfb\x8b\xf3\xb7\xdb\xeb\xd1\x0d\x58\x5c\xd0\xa6\xd0\x10\x00\xf6\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xc1\x0a\xb2\x98\x08\xcc\x9e\x7e\xe7\xf7\x9d\x06\x7d\x7c\xe1\x63\x2d\xb3\x6d\x96\xd9\x9e\xc1\x90\xe6\x89\xd5\x9e\xf6\xf6\x7a\xdb\x70\x39\x3b\x9a\x42\xdf\xef\xa5\xa8\x51\x81\xb9\x82\xc2\x57\xb6\x76\xfb\x50\xc8\xa5\xc7\x78\xdf\x45\x1f\x54\x58\x8f\x13\x1e\xad\x85\xce\x49\x8f\xd6\x49\x56\x13\x3a\x35\xbd\x0c\xcd\xf8\xde\x23\xc1\x87\x6c\xf4\x9a\x66\x3f\xc1\xf4\x2d\x0c\xeb\x99\x89\xab\xf0\x46\xeb\xa3\x73\x25\xa3\xad\xd2\xb0\x33\xfb\xb2\x7a\x6e\x9a\xc6\x9c\x34\x4d\x45\x67\xd4\x8f\xcc\x68\x2e\x90\xa2\x91\x20\x8a\xb9\x7a\xf8\xd6\x0e\xed\x2c\xca\x4d\xc5\xd8\x34\xe2\xb9\xaf\xc7\xe5\xfd\xa8\x32\xbb\x32\xbb\x77\x74\x56\xaf\xab\x76\x44\x82\x47\x90\x69\x75\x24\x26\x86\x73\xc1\xed\xd1\xad\x90\x37\x46\x8f\x30\xba\x6b\xd7\x62\xad\x3a\x42\x9f\xc1\xd1\x1f\xac\x1b\xec\xfa\xcd\xd9\x9b\x63\x72\x12\xc7\xae\xb9\x49\xae\x60\x98\x27\xae\x9d\x40\x8f\xd0\x8c\xfd\x02\x52\x31\xc1\x3b\xe4\x86\xf1\xb8\x43\x72\x16\x7f\xb7\x3d\x71\xf6\xa3\xc1\x5d\x10\x99\x75\x75\x36\xbc\x13\x57\xe8\x63\x99\x56\x78\x57\x20\x22\x86\x6b\x31\xad\x10\x37\xbd\xd5\xd9\x09\x19\x0d\x81\x66\x73\x13\xfd\xec\xc0\x2d\x6c\x96\xae\xee\x17\x84\xd5\xba\x38\x1d\xa2\x66\x22\x3e\x26\x2a\xcf\x32\x21\xb5\x22\x29\x68\x6a\x94\xde\x9e\xc1\xb0\x4e\xf5\x4f\xf4\x55\x75\xc8\x6f\xe1\x47\x74\x38\xa9\x77\xfb\xfb\xdf\xfe\x74\xfe\xcf\xbf\xed\xef\x7f\xf8\xad\x7c\x15\x59\xa1\x8d\x02\xaa\xde\xa2\x32\x88\x7a\x5c\xc4\x70\x89\xef\xc0\x3f\x55\xc5\xcd\xe2\x2e\x68\xaa\x73\xd5\x1b\x0b\xa5\x2f\xfa\xe1\xcf\x4c\xc4\xb3\x7f\xa9\x1a\x12\x07\xd9\x4d\xc6\x80\x5b\xd4\xa7\x7a\xbc\x23\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xb9\x89\x4e\x4a\xf1\x9f\xdf\x7b\x10\x18\xe9\xe9\x56\x32\xad\xd1\xf5\xe6\x52\xc1\xc5\xb0\x63\x4e\x6d\x21\x76\x4e\x5e\xd6\xae\x8f\xd2\x28\x69\x0b\x3b\xd8\x30\xc0\x10\x22\x0e\x5a\xf6\x20\x07\x06\x3b\xef\x62\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\xa7\xf7\x7e\xff\xa0\x34\x2e\x34\x5d\x72\xa0\x0a\x1a\xe2\xb1\x0d\x0a\x0a\x49\xc6\x24\x61\x29\x73\xb1\x86\xae\x41\x93\x22\x07\xf6\xc7\x5e\x94\xe5\x1d\x77\x43\x2f\x85\x54\xc8\x69\xf8\x13\xb2\x31\xa4\x46\xd3\xea\x2a\x2d\x24\x1d\x41\x27\x3c\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x85\xab\xd4\x51\x64\x88\x9f\x1f\x6d\xf3\xa0\xdf\x11\xd2\x16\x30\xe3\xf2\x01\x44\xc2\x60\x89\xb3\x02\x67\x80\x22\xea\x93\x13\x91\xe4\x29\xa8\x4e\x10\x83\xac\x35\x80\x4f\x8c\x66\xa9\x76\x4a\x50\x8b\xd9\x84\xa9\x26\xc2\x88\x17\xc8\x69\xcc\x45\xe4\x8b\x5c\x67\xb9\x76\xf5\x66\x4a\x8d\xdd\x84\x42\xbb\x45\x28\x0a\x50\x21\xfb\x2f\xf7\xea\x47\xa3\x53\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\x6b\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xae\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\x3e\x37\x3e\xf7\x29\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x06\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xd6\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x06\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x79\x05\x20\x18\x44\xbc\xf2\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x8f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\x93\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x35\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xd5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x80\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd2\x54\x1b\xac\xbe\x02\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\x6f\x38\x12\x8d\x93\xe4\x96\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\x6e\x99\x5a\xa8\xac\xd4\x46\x9c\x3f\xe0\x4c\x86\x56\xd9\xbf\x3f\xfa\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\x95\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x28\x92\x73\xcd\x12\xbb\x18\x21\x6e\x48\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\x0f\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\x77\x10\x35\x96\xe7\x7f\x7e\x07\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x06\x9e\x51\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xef\xfb\x1d\x02\x3a\x3a\x24\xb7\x82\xef\x6b\x5c\x7e\x8f\x5c\x0b\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcb\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x63\xda\xc5\xab\x19\x92\xf1\x02\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x0f\x48\x81\x39\x88\xdc\x5d\x79\x76\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x01\x9a\x6b\xe2\xf3\xe3\xf5\x75\xff\x07\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\x7f\x8a\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x04\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x9e\x1d\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xc3\x94\xbe\xfc\x18\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\x7f\xfa\xd3\xd7\x7f\xea\xd9\xe9\x43\x94\x02\x27\x17\x27\x97\x27\xbf\x5e\xfd\x72\x8a\xc9\xb1\x75\xa1\xda\x50\x08\x66\xd3\x01\x98\x8d\x86\x5f\x3e\x68\xf0\x25\xa6\x7c\xd4\xa6\x22\x55\xdb\x3f\x4e\x69\x30\xc0\xe8\x6d\x46\xe3\x74\xb2\x5f\xa9\x58\x99\x91\x35\xab\x86\x54\x73\xd4\x76\xe2\x8c\xe9\x28\xbb\x12\xd1\x4d\x83\x7a\xcd\x19\x64\x12\x22\x6b\x27\xbb\x3e\xed\xdb\xd9\x8d\x7e\x79\xf9\xe6\xba\x48\x35\xc0\x78\x1c\xf2\xca\xdb\x97\x7e\x74\x96\x34\xa3\x93\xde\x40\xa6\x83\xea\x3e\xa0\xd1\xcd\x2d\x95\x31\x5a\xb6\xa8\x66\x03\x96\x30\x5b\xfc\xd7\x37\x85\xe4\xc2\x06\xfc\xd9\x22\x67\x62\x38\x5b\x5a\xb3\x30\x87\xa2\xc9\xca\xc6\xd1\x0c\x29\x4b\xd0\x82\x9a\x73\xcd\x52\x70\x11\x41\x51\x16\x4c\x7a\x65\x9b\x76\xab\x7c\xf9\xb1\xb3\xca\xd7\xfe\x1b\xef\xd5\xdb\x58\x0f\xab\x1b\x97\xb8\xc3\xac\xce\xb1\x38\x9b\x10\xd2\xb2\xba\x4f\x82\xd5\x65\x12\xae\xb4\xc8\x1a\xf2\x92\xd8\xc9\x96\xf8\x48\x06\x30\x14\x86\x08\x2f\x75\x7a\xf8\x1e\xc1\x1c\x93\x03\xbd\x55\x4b\x54\x1c\x1b\x36\x22\x53\xe5\xd1\xd8\x1b\x28\x39\x28\x75\x84\xee\x90\x3c\xb3\x5a\x2b\x92\xeb\x5c\x42\xc7\x7c\x1d\xa4\xb8\xba\x4e\x91\xe5\x60\x5e\x0f\xdc\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\xc2\xa0\x6e\xf9\xb3\x6e\x94\x48\x52\x35\x06\x2c\x2f\x02\x77\xcc\x77\x43\xe9\x8b\x78\x7f\xbf\xf8\x14\xc3\x58\x46\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x5b\x4e\x06\x30\x62\x5c\x79\x50\x98\xb9\x3d\xcc\xd0\x1f\xc3\x54\x28\x0c\xd7\x23\x6f\x2b\xc5\x4e\x5c\x1a\x52\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x55\x6a\x99\x1c\x20\xec\xc3\x63\xf5\x1a\x4b\x3e\xc8\x39\xbe\x39\x86\x84\x4e\x6d\xb4\xe9\x90\x71\x9a\xb0\xff\x80\x54\x87\x0d\x78\x9c\x0c\x08\x8b\x6b\x4b\xd7\x81\xa5\xfa\x69\x34\xae\xe7\xfc\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x9c\xb6\x3e\x3a\x15\x58\xe4\xfc\x44\xe5\xa6\x71\xe1\x55\xa5\x3e\x71\xa5\xb2\x20\x3e\x15\xc7\x79\x84\x0a\x3f\xd3\xc2\x7c\xa9\x4d\x5d\x15\x3e\xc9\x50\x1d\x65\xc2\xfe\x5f\xe1\xa8\x28\x79\x28\xac\xc2\xbb\x7d\xce\xda\xa3\x65\x63\xd5\x71\x4b\x7c\x1c\x97\xc4\x8e\xf8\x6f\x1a\x70\x43\xb4\x2e\x88\x67\xe7\x82\x78\x3e\x5d\x73\x9d\x67\xfe\x7a\x2c\x41\x8d\x45\xb2\x35\xa2\x57\x90\xfc\x35\xe3\x2c\xcd\x53\x83\x73\xca\xe0\x33\x9b\x84\x10\x00\x15\xd0\xd5\x52\x6c\x6b\x45\x34\x37\xb2\x18\xb0\xd8\x29\x65\x89\xd9\x46\xcc\xdf\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xb6\x52\x2b\x6b\x38\x5f\xf7\xc2\x9b\x42\xeb\x8c\x97\xf5\xe8\x4d\x3d\x26\x6e\xcb\x91\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\x7f\x78\xdb\x3f\x2d\xb7\xc9\xe6\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\xd8\xc7\x9b\x8c\xb0\xe6\x9a\xf1\x63\x33\xf7\x01\x68\x5a\xd2\x6d\x9c\x5a\xa0\x08\x70\x3a\x48\xcc\x73\xe6\xa9\xc0\x91\xfb\x96\xef\x02\xd5\xb9\x04\x32\xa2\xfa\x31\x09\x7e\x7d\x15\xa6\x96\xfa\xd2\x04\xbf\xa9\x2b\xa1\x57\x6d\x70\x46\x0e\xaf\x5a\xa1\x46\x88\x17\xb6\x82\xfe\xda\x72\x78\x6d\x4a\x59\x5f\x36\xae\x7f\xb4\x08\x96\xb8\xc1\x0f\x6f\x0c\xc0\x7b\xae\xe5\xb3\x67\xe7\x65\x25\xc8\x77\x95\xd2\x82\x64\x09\x2d\xfa\x42\xe1\x0e\xfc\x88\x3c\xe8\x74\x0c\xd1\xcd\x5b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\x79\xcf\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xc7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6a\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x40\x51\xe6\x87\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x31\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xc7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x07\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x82\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x8a\x5b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xec\x88\x06\x56\xa5\x1e\xde\x0a\xec\x5e\x74\xbf\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x65\x51\x4e\xf9\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\xcf\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\x73\x9f\xd5\xf8\xfa\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x8f\x14\x9b\xb2\x83\x82\xee\x13\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x07\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xc3\x92\xc4\x4d\xd3\x23\x57\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf8\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x96\x1f\x6e\xe4\x75\x45\x47\xeb\xf5\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x71\x3b\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xed\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x73\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x89\x4f\xc1\xcb\x3c\xb5\x2a\x02\x0a\x5c\x18\x3e\x7f\xf6\xe6\xfc\x0a\xc3\xf2\x33\x69\x2b\x85\x60\x1c\x17\x5e\xc7\x99\x06\x60\x9e\x70\x9d\x7b\x7b\xe4\x84\x4f\xed\x45\x7b\xa6\x98\x22\x09\x53\x1a\x90\xeb\x39\xb1\xcd\xfb\xaf\xf7\x5e\xf4\xf0\x7f\x7b\x84\xc6\xb1\x34\x72\x5d\x08\x4f\x8b\xe6\xe2\x45\xad\xe4\xc7\x06\x49\xe9\x03\x38\x68\x1b\x8d\xf6\x5a\xc4\x6e\xe5\xc8\x49\xd0\x77\x65\xd9\xa0\xd2\x92\x6a\x18\xb1\x88\xa4\x20\x47\x40\x32\xaa\xa3\x31\x49\xe9\x94\x44\x42\xca\x3c\xb3\x75\xfe\x63\xaa\x69\x8f\x7c\x2f\x24\x49\xfd\x21\x36\x38\x6f\xf8\xf0\xd5\x62\x9f\x7e\x71\xb2\xcb\xff\x64\x4a\xe5\xa0\x8e\x5e\xbe\xf8\xf3\x57\x7f\xfa\xd3\xb3\x6a\x0d\x57\x84\x0b\x99\xbd\x2d\xb5\x86\xa3\x7e\x17\xec\xae\xdb\x56\x81\x8c\x8f\x92\x32\x7e\x6d\xc7\x00\xea\x6a\x99\x75\x75\xcc\x6e\xf1\x05\xfd\x6d\x55\xcd\x46\x5a\xd4\x15\x6b\x68\xa8\xb1\x53\xc1\x07\xbd\x62\xe5\x68\x83\x28\xf7\xea\xbd\xe8\xfb\x83\xe9\xe4\x9c\x74\xa6\xc1\x6b\x56\x44\x27\x75\xc8\x0b\xf2\x2d\xb9\x23\xdf\xa2\xa2\xf5\x4d\xdd\x36\x58\x75\x55\xa0\x26\x82\x8d\x8c\x7e\x7f\xd1\x6f\x08\xe2\xff\x30\x44\xd3\xcc\x68\xa0\xaa\x05\x19\x30\x27\xd8\xc3\x9d\x06\x69\x04\x4d\xb7\x13\x8f\xda\x40\xcc\x2c\xf0\x23\xa2\x99\x75\x3c\x5c\x0c\xab\x01\x4e\x9b\x21\x9a\x79\xfc\x47\xa1\xf4\xa5\xa3\x42\xd5\x56\x38\xc5\x6c\x29\x12\xfe\x0a\x19\x33\x7c\x43\xe9\xe2\x80\x29\x12\x0b\x8c\xb7\xb2\x81\xcc\x63\x56\x23\x8c\x62\x77\xd0\xb8\x9e\x67\xbd\xb2\x9f\xab\x76\x6a\xc6\x94\x82\x3a\x90\x13\xb1\x4a\x35\xb2\x32\x11\x3b\xe9\xcc\x2c\x2b\x2e\xf1\x8c\x15\xe2\x99\xb3\xda\x04\x7b\x33\xe2\x92\x39\x4f\x11\xe5\x36\x95\x64\x08\x52\xda\xd8\xf3\xc1\xd4\x87\xed\xd5\xde\xbc\x5a\x27\x29\x93\x42\x8b\x48\xd4\xe8\x71\x56\xf5\x76\xbb\xe9\x10\x08\x36\xde\xd7\x1b\xcc\x7f\x3e\xeb\x77\xc8\xf5\x69\x1f\xfb\x3e\x5d\x9d\x5e\xf7\xab\x3a\xcb\xde\xf5\x69\x7f\xef\x51\x41\x41\xbc\xc0\x87\x26\xea\x2d\x26\xa9\x98\xa0\x8c\x34\xd9\x4d\x69\xd6\xbd\x81\xe9\x96\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x78\x36\x09\x34\x66\x1f\x29\x9f\xcb\x07\xc4\x86\x77\x2e\x4e\xec\x4a\xc5\x04\x62\x2b\xa5\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbd\x36\x7f\xba\xcd\xf6\x5a\x7b\xb4\xd9\x5e\x6d\xb6\xd7\xfc\xd8\x99\x90\xd6\x36\xdb\xeb\x79\x79\xf0\xdb\x6c\xaf\x4f\x3c\x08\xa0\xcd\xf6\x5a\x3c\xda\x6c\xaf\x36\xdb\x6b\xbd\xd1\x66\x7b\x6d\x3e\x76\x2e\x7c\xa9\xcd\xf6\xda\x68\xb4\xd9\x5e\xf3\xa3\xcd\xf6\x5a\x32\xda\x6c\xaf\x25\xa3\xcd\xf6\x6a\xb3\xbd\xda\x6c\xaf\x36\x08\xf6\xde\xb9\x76\x33\x08\x96\xb4\xd9\x5e\x6e\xb4\xd9\x5e\xcf\x22\xd4\x8f\xb4\xd9\x5e\x6b\x8d\x36\xdb\xab\xcd\xf6\xda\x66\xb4\xd9\x5e\xcf\xc5\x5c\xd2\x66\x7b\xb5\xd9\x5e\x9f\x8e\xa0\xdb\x66\x7b\xb5\xd9\x5e\x6d\xb6\x57\x9b\xed\xb5\x72\x15\x6d\xb6\xd7\x73\x50\x01\x7d\x47\xe0\xfa\xd9\x4b\xfb\xa7\x22\xcd\x72\x0d\xe4\xad\x9f\x32\x48\x91\x96\x30\x30\x55\x96\x08\xea\x87\x10\x46\x82\x0f\xd9\xc8\x51\xf6\x23\xdb\x86\xb7\x1b\xbe\xa7\x5b\x6a\x7d\xfb\x04\xe3\x07\x13\x96\xb2\xed\x52\xca\xc8\xdc\xc6\xbc\xc2\xb9\x4a\x7e\x19\x73\x92\x52\x7a\x87\x47\x84\xa6\x22\xb7\xad\x8b\x23\xb7\x7f\x01\x84\xd6\x7b\xb5\x73\x3b\x43\x9a\x51\x71\x68\xec\xe3\xea\xfa\x4d\x84\x95\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x91\xb8\x39\x81\xb8\x21\x71\xf8\x41\x84\x61\xe7\xd0\x6d\xe8\x2c\xba\x60\x94\xb9\xd3\xe8\x18\xd6\xaa\xd3\xe8\xa9\x29\x8a\x79\x61\x1e\xa6\x88\x48\x99\x36\xc2\xa1\x91\x07\x69\x39\x9c\x95\xe9\x8a\x52\xea\xe8\x00\x06\x74\x53\x6d\x1b\xad\x87\x50\xd0\x52\x10\x8b\xf0\x92\x9f\xeb\x44\xcf\xd2\x2c\xc1\x06\xe7\x78\x9e\xbb\x3e\x96\x05\x99\x6b\x4b\x1b\xee\x1f\x2d\x6d\x78\x8e\xb4\x41\x41\x94\x4b\xa6\xa7\xa7\x82\x6b\xb8\xdb\xca\xc2\x52\x25\x0d\x57\xd5\x09\x5d\xcc\x98\x72\xb1\x6e\xf6\x1a\x11\x99\x8d\xfb\x9e\x49\xac\x1f\x8b\x3c\x89\x31\x99\x23\xe7\xa8\x60\xda\x2c\x3d\xd0\x56\xfb\x43\xbd\x07\x43\xb9\x67\x5f\xe2\xf5\x39\xab\x66\xfe\x3b\x67\x13\x9a\x18\x6d\xb7\x78\xa2\x8f\x1a\x4c\xf9\xa1\x75\xcf\xbc\xa6\xea\xa6\x38\xf0\xd0\x35\x32\x74\x58\xf3\x91\xff\x24\xfc\x09\xee\xf4\x53\x94\xd2\x50\x40\xea\x4b\x36\x61\x09\x8c\xe0\x5c\x45\x34\x41\xba\xd6\x0c\xaf\x38\x59\x32\x3b\x6e\xbc\x14\x89\x22\xb7\x63\x30\xb4\x9a\x50\x6f\x02\xc0\x0c\xbb\x11\x65\xdc\xe6\xc5\x67\xfe\x61\x65\x6d\x09\x86\xfc\x67\x54\x9a\x0d\x0e\x36\x03\x54\x91\x07\x42\x24\x2e\xe3\x21\x99\x16\xf3\xbb\xdc\x1f\x2e\x7e\xe5\x70\xfb\xab\x99\x4d\x91\x61\x42\x47\xc1\x54\xa0\x40\xcf\x59\xfb\x8a\xa9\x97\x7e\x00\xa6\x13\xe4\x40\x68\x72\x4b\xa7\xaa\x30\x9c\x94\x2a\x40\xa8\x63\xf2\xf2\x10\xd1\x99\x2a\x12\xe6\x88\xc9\x57\x87\xe8\xfe\x3b\x3d\xe9\xff\x7a\xf5\xcf\xab\x5f\x4f\xce\x5e\x5f\x5c\x92\x4b\xa1\xc1\x32\xb5\x52\x9b\xc0\x28\x68\x18\x66\x95\xf8\x0e\xd4\xd2\x85\xea\xa1\xed\x92\x29\x72\xcb\x78\x2c\x6e\xd5\xd6\x36\x5a\x8b\x7e\x06\x78\x40\xf9\x56\x73\x44\x34\xa3\xd8\xfd\xb0\x06\x87\x99\x8b\x30\x29\x4f\x8a\x3c\x3c\x8e\x8f\x62\x29\x32\x0b\x04\x6f\xe4\x2a\x58\x6d\x55\x8d\x2e\xc7\xb0\xe2\xfe\x0e\xab\x13\x8e\x24\xe5\xba\xb0\xf6\x14\x7b\xe6\xda\x2e\xf6\x6a\x6f\xc7\xd3\xce\x68\xa2\x71\x73\xd9\x4c\x27\x71\x0c\x71\x05\xfc\xcf\x2e\x72\xf0\xd4\x7f\xdc\xb4\xa8\x52\x41\xfa\x6f\xae\x2e\xfe\x7f\x33\x78\x3c\xcd\xea\x05\x4a\x35\x93\x19\x2b\x45\xd6\xd8\xee\xbe\x75\x99\x97\xed\xfe\xee\xc4\xfe\x06\x6e\xd9\x8c\x7b\xfe\x6d\xce\xab\x25\x8d\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x36\x35\xae\xc3\x1b\x8d\x1c\xf1\xda\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x8e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x0d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xda\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x91\x77\xbd\xc6\x21\x34\x40\x79\xc3\x93\xe9\x5b\x21\xf4\xf7\x21\x8d\xb6\x11\x0c\xf8\x87\x93\x96\xab\xa6\x68\x14\x27\x29\xbe\xb7\x8b\xbb\x81\x87\xaa\x9c\xc1\x7b\x56\xec\xf8\x53\x3f\x52\x32\xe7\x27\xea\x07\x29\xf2\xad\x99\xd8\x9c\xb0\xf9\xc3\xc5\x19\x92\xa2\xdc\xb9\x2a\xb9\x96\x53\x2c\x1d\x30\x5f\xff\x2d\x28\x06\x3f\x3b\x67\x6b\xf9\x4c\x14\x7e\x31\xf2\x9a\x4e\x09\x4d\x94\xf0\xb0\x64\x7c\xa1\x16\xea\x54\x5c\x73\x79\x20\xf4\x78\x4e\xb7\x35\x07\x6a\xfe\xb9\x4e\xc9\x73\x59\x14\xa4\x63\x7c\xee\x71\x4d\x6f\x40\x91\x4c\x42\x04\x31\xf0\xe8\xb1\xb7\xfd\xb1\x1d\x7e\x88\x3a\x97\x82\x9b\x83\xd9\x08\xf2\x5c\x04\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe5\x03\x48\x0c\xe4\x8d\x4a\xea\x7a\xc6\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbe\xa7\x8a\xfc\x7c\x71\x46\x5e\x90\x03\xf3\xae\x43\xc4\x1f\x6c\x29\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\xfb\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x37\x71\xfd\x71\x29\xd4\xcf\x0a\x64\x63\x04\xea\xe7\x2d\x08\x54\x59\x8c\x32\x38\x57\x85\x9e\x45\xac\x14\x34\x8d\xa9\xa6\x8e\x70\xf9\x1b\x76\x76\x4b\x3f\x6d\xf2\xa5\xe0\x15\xe3\xf9\x9d\x0d\x3c\x6a\xce\xd4\x72\x75\x8e\xd3\x92\xc8\x43\x1d\x77\x9d\x66\x59\xc2\x6c\xb5\x8d\x99\x40\xb8\x8b\x0a\xae\x74\x96\x88\x89\x48\x27\x68\x92\x08\x43\x1f\x8d\x70\x42\x79\x2c\xd2\xb9\x97\x19\x21\x12\x2a\x95\x53\x7b\xa4\xc5\xbe\xea\xd8\x11\xa3\x50\x02\x13\xa8\x51\x5b\x6c\xb6\x52\xac\x99\xcd\x00\xc7\x63\x04\x4e\x4f\x12\x3a\x80\xc4\xc2\xd8\x62\xa0\x9a\xc7\xc0\xc7\x8e\x46\x95\x22\x69\x2e\x7d\xe6\xad\x48\xc0\x86\x77\x79\x40\x98\xe9\x9f\x04\x1c\x70\x92\xa6\xe0\x80\xda\x60\x05\x0e\xa8\xd7\x3e\x05\x38\xe4\x35\x58\x3d\x99\x85\x83\x91\x1b\xaa\x70\x40\xe6\xbd\xeb\x70\x50\x10\x45\x22\xcd\xfa\x52\x18\xb5\xb3\x31\xde\xe4\xa6\x2d\x7c\x86\xd6\xb0\xb1\x20\x18\x0b\x79\x41\xf5\x66\x2a\x4b\x81\x9d\x54\x5b\x26\xe1\xa3\x3b\xff\x3f\x25\x9e\x85\xa4\x67\x96\x91\xf9\x59\x2a\xee\x45\xf3\xa4\xbb\xf0\x94\xd9\x41\x13\xb9\x11\x35\x8c\x9d\x8d\x70\x23\x11\xd1\x04\x6b\xc7\xd6\x43\x39\x32\x8b\x76\xb3\x13\x97\xc2\x79\xd1\x47\x89\xbf\xf9\x00\x12\x2c\x23\x8a\xbf\x38\x13\x26\x17\x31\x94\x7c\xd9\x36\x0e\xf9\xda\x86\x7d\xe2\x7d\x3e\x92\xd8\xc8\x15\xde\xad\x1c\x57\x9e\xd6\xc2\x55\x40\x7b\x1d\x2a\xd2\x9a\x05\x02\x8f\x19\x1f\xa1\x5d\xad\x43\x24\x24\x36\x06\xd9\x11\x81\x1b\xab\x41\xee\xe3\x91\xf0\x93\xfa\xf3\xe0\x5f\x8d\xb2\x18\x13\xdc\xcd\x8c\x96\x22\x2f\x61\x0d\x2d\xb9\x65\x8a\xec\xbd\xf2\x00\xa8\x51\xc2\x73\x17\x39\xcc\x9e\xfd\xc2\xb0\x9b\xd6\xd2\x79\xc3\x78\xec\xc2\x75\x2b\xc0\x0a\x35\xe0\xad\x1c\x8c\x81\xe0\x2c\x2e\xd3\x96\x63\xf2\x9e\x93\x00\x2c\xd2\xdd\x1a\x3d\xde\x5a\x91\xd9\xdb\xe8\xba\xab\x0d\xaf\xe1\x25\xb3\xd3\xfc\xcc\x71\xef\xcd\x7b\xbb\x46\x73\x9f\xbf\xcf\x7f\xcb\xa3\x96\xee\x71\xd4\xaf\x69\x2d\xe6\x1f\x76\x5a\x2f\xd2\x47\x06\xad\x35\xe3\x23\x55\xd6\x64\x68\x92\x54\x8c\xe1\x8b\x54\x19\xbf\xc3\xa1\xe2\xff\xbc\x0a\x31\x93\x66\xf0\x54\xd4\x90\xc4\x88\x13\x4f\x5c\x09\x19\xa5\x8a\x9e\x4a\x03\x09\xcd\x68\x72\x95\x6d\x5f\xa2\x94\xcc\x95\xc3\x7b\x7d\x75\x52\x9d\x1a\x99\x35\x36\xa4\x30\x7b\x65\xae\x13\x1a\xa7\x4c\x29\x34\x84\xc1\x60\x2c\xc4\x0d\x39\x58\xd9\xa9\xa1\xab\xd8\x48\x1d\x39\x9c\xef\x9a\xd5\x1f\x12\xc6\x93\x10\x15\x85\x7a\x30\xd7\xca\x1b\x72\xf0\x25\x51\x58\x05\xee\xa1\xab\x5b\xed\x82\x15\xe6\x97\x69\x2b\x55\x1b\x2c\x78\x74\x82\x3d\xbf\x3d\x97\x35\xcb\xae\xdc\xb3\x45\x97\x0e\xb7\x67\x2b\xab\x2d\x84\xa3\x95\x1e\x1f\x1d\x48\x4e\xb8\x88\x40\x35\x57\xd0\xe9\xc7\x62\x4e\x12\x83\xcd\xe2\x01\x8c\x7e\xa2\x4b\x83\xec\xd0\x2e\xbd\x8f\xc9\xa0\xee\xd1\xfd\xb2\x44\x7d\x5d\x10\x17\xa3\x8f\x24\xd9\x98\x76\xad\x92\x6e\x28\x1a\x92\x40\x2f\x42\x8c\x05\x17\x2e\x49\xc2\x30\x51\xc1\x11\xa5\x91\x44\x59\x6f\x1e\xee\x89\x23\xd1\xa5\xa5\x9e\x16\x5e\xe2\xb2\x23\x10\x93\xc9\x74\x68\xad\x62\xd7\x70\xcb\xf4\x18\xeb\xbc\x8e\x67\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\xda\x57\x65\x47\x75\x51\x0a\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x50\x14\xbe\x75\x59\x06\x06\xc1\x5c\x29\xf9\x94\xdd\x99\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc1\xd9\xc5\x97\x0f\x7b\x84\x5c\xf0\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x3e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xca\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0e\x7f\x55\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x91\x4c\x7d\x75\x17\xf6\x1f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x2f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\xb6\xa4\x22\x42\x92\x5b\x2a\x53\xc3\x37\x68\x34\x46\x0f\x25\xe5\x24\xce\x25\x56\x59\xd6\x40\xe3\x69\x57\x69\xaa\x8d\xa4\x0c\xd2\x29\x94\x7e\xfd\x6d\x49\xfd\x95\xa3\x2d\xa9\xbf\xe6\x68\x4b\xea\xb7\x25\xf5\xe7\xc7\xce\x44\x87\xb6\x25\xf5\x9f\x57\x99\xa4\xb6\xa4\xfe\x63\x7b\x13\xda\x92\xfa\x6d\x49\xfd\x55\xa3\x2d\xa9\x7f\xcf\x68\x4b\xea\x6f\x31\x9e\x01\xe5\x6a\x4b\xea\x6f\x31\xda\x92\xfa\x8b\x47\x5b\x52\x7f\x7e\xb4\x25\xf5\x97\x8e\xb6\xa4\xfe\xd6\xa3\x2d\xa9\xdf\x96\xd4\x6f\x2b\x8d\x6e\x36\xd7\x6e\x56\x1a\x25\x6d\x49\x7d\x37\xda\x92\xfa\xcf\xa2\x9e\x22\x69\x4b\xea\xaf\x35\xda\x92\xfa\x6d\x49\xfd\x6d\x46\x5b\x52\xff\xb9\x98\x4b\xda\x92\xfa\x6d\x49\xfd\x4f\x47\xd0\x6d\x4b\xea\xb7\x25\xf5\xdb\x92\xfa\x6d\x49\xfd\x95\xab\x68\x4b\xea\x3f\x07\x15\x50\xe9\x98\x6d\x55\x01\x74\x9d\x62\x45\x2e\x08\xbd\x54\x1b\x60\x90\x0f\x87\x20\x91\x72\xe1\x9b\xe7\x82\xa7\x8a\xba\x8c\xb3\x4e\x56\xd0\x1d\xac\x7b\xe4\xf2\x75\x96\x3c\xee\x8a\x11\x60\xa5\xce\x22\x52\xfc\xfc\xcd\xf7\x0b\x2a\x23\x6d\x1d\x55\xb8\x6d\x8c\x34\xae\xf9\x0d\xdf\xce\x3f\xbe\x04\xe0\x8b\xf2\xc7\x1c\xdc\xa3\x44\x28\x17\xe1\x8e\xc0\x8a\xc6\x94\x73\xf0\xfa\x1e\xd3\x68\x47\x19\x00\x70\x22\x32\x70\xde\x69\x4a\x14\xe3\xa3\x04\x08\xd5\x9a\x46\xe3\x9e\x79\x13\xf7\xc0\x2e\xa2\xd1\xdd\x2f\x4a\x4b\xa0\xa9\x8f\xcb\x4f\x29\xb3\x53\x11\x1a\x49\xa1\x14\x49\xf3\x44\xb3\x2c\x4c\x46\x14\x60\x42\x8d\x65\x54\x01\x18\x18\x15\x57\x84\xb0\x77\x8a\xb7\xb9\x65\x89\x72\x69\x3a\xd4\x36\x3b\x58\x0f\x3c\xcd\xf4\x34\xc4\xf1\x02\x19\x32\xa9\x34\x89\x12\x86\xdc\x1a\xdf\x68\x73\xa7\x71\xbe\x8e\xe7\xd5\xdc\xad\x54\xb9\xa5\xf2\x18\xc5\xd6\x4c\x2b\x1b\x15\x5b\x4c\xe8\xa6\x8a\x99\x72\x62\xbe\xea\x10\xea\xeb\xa6\x59\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x4a\xd3\x95\xea\xc5\x16\x61\xc3\x05\xa2\x63\x8a\x83\x47\xce\x4e\x25\x9b\xa3\x10\x28\x30\x4a\x6f\xee\x18\xe0\x06\x70\x98\x18\x1c\x80\x08\x0c\x7f\xa5\x4b\xb0\xfe\xa3\x23\x7d\x89\x29\xbe\x06\xa5\xe8\x08\xfa\x5b\x3a\x1a\x96\x69\x64\xe8\x6b\x28\x36\x06\x51\x21\xb1\xd9\xb5\xe1\x97\x22\x3a\xb3\x2a\x06\x91\xd4\xae\x29\x08\x3f\xb7\x92\x69\x0d\xb8\xa9\x58\x61\x0f\x7d\x95\xb3\x09\xf8\xfb\x33\x31\x9e\xaf\xfd\x24\xc5\xc3\x86\xa8\xf3\xd8\x46\x5c\x0e\x80\x0c\x24\x83\x21\x19\x32\x0c\xe3\xc4\xc0\xca\x8e\x2d\xb8\x44\xad\x15\x40\x29\xa3\xef\x0a\xee\x65\x59\xbf\xae\x1e\xf9\x87\x5b\x98\x96\x39\x8f\x68\xa9\x96\x2d\x66\x98\xb2\x21\x19\x61\x60\xa6\x93\x16\xff\xf8\xe2\x2f\xdf\x90\xc1\xd4\xb0\x34\x94\xac\xb4\xd0\x34\x09\x1f\x99\x00\x1f\x19\x58\xd9\xe3\x59\xcd\x91\x0c\x10\xc0\x6e\x1e\x76\xe1\x2f\xbf\xba\x19\x54\x79\xec\x51\x0c\x93\xa3\x12\xfc\xba\x89\x18\x2d\xea\x8f\xb2\x7d\xc8\xf6\x96\x2a\xd1\x02\x34\x13\x09\x8b\xa6\xb5\x11\xcd\x57\xfe\x22\x63\x71\x6b\x65\xfd\x05\xd8\x53\xa4\x5b\x65\x22\xcb\x13\x6b\x74\xfe\x3e\x64\x17\xe7\x0a\xe6\x73\x00\x17\x9e\x0b\x34\x93\xba\x29\x66\xeb\xa6\xdb\x78\x5c\xff\x4a\xe1\x72\x4b\x9c\x21\x2f\x14\x00\x43\x45\xe8\x7b\x9a\x24\x03\x1a\xdd\x5c\x8b\x57\x62\xa4\xde\xf0\x73\x29\x85\xac\xae\x25\xa1\x86\x5a\x8e\x73\x7e\x63\x3b\x38\x84\x12\x09\x62\x64\x44\xab\x2c\xd7\x3e\x91\x61\xd1\x07\xdb\x7c\x79\x4f\x84\xbd\x1a\x54\xcc\x02\x77\xac\xd0\x75\x5c\xaa\x96\xc5\xc8\xf2\xfc\xaa\x8c\x6c\x5f\xbd\xf8\xe3\x9f\x2d\xea\x12\x21\xc9\x9f\x5f\x60\xcc\xb6\xea\xd8\x43\x8c\xb4\xcd\x30\x8a\x94\x26\x89\x51\x1b\xca\x48\x69\x00\xbd\x08\x09\x3f\x3a\x0e\xea\xfa\xe8\xb6\xb6\x28\x75\x7d\xfd\x4f\x94\xa3\x98\x56\x90\x0c\x3b\x36\x2b\x29\xa8\x35\xfb\xc8\x18\xf6\x1d\xf5\xc1\xd4\xb0\x1d\x10\x80\x26\x22\xc9\x53\x38\x83\x09\x6b\xa2\x89\x53\x65\x36\xaf\xea\x27\x4c\x61\x02\xd8\x20\x11\xd1\x0d\x89\xdd\xc5\x52\xe4\xc9\x6c\x25\xf0\xed\xa1\xb0\x6d\x0c\x4e\x8d\xd8\x9b\xa5\xdf\x5f\x89\xba\x49\x69\x96\x85\x1c\x21\x49\x6f\x2b\xc0\xc0\x33\x89\xe5\x0a\x6a\xd6\x93\xa9\x6d\x66\xae\x6b\x64\xee\xba\x2f\x32\x74\x73\xeb\x29\xb6\x8e\x3a\xa9\x6f\xa3\x2e\x56\xbf\xbd\x61\xb2\x82\x10\xc5\x84\xfe\x34\x64\xf8\x6f\x9b\x55\x32\x97\x15\x19\x12\xeb\x02\x62\x58\x01\xc0\xa0\x0f\x92\xe4\xed\x0d\xae\x0d\x58\x37\xeb\x85\x1c\x55\xe0\xc2\x83\x55\x39\xa5\xda\x09\x84\xde\x7c\x4d\x49\x06\x52\x31\x65\xf8\xf2\x2f\x78\xa0\x4e\x13\xca\xd2\x92\x09\xf0\x71\x80\x60\x0f\x37\x96\x4f\xae\x4f\x29\xfb\x22\x76\x13\x22\x29\xb4\xa5\xa3\x17\x88\xb5\x55\xa9\xb6\x41\x86\xfa\xd8\xa4\xf2\x97\x02\x9a\x55\x4a\x69\x7e\x09\xa4\xd2\xde\xf5\x9c\x08\x24\x7e\xdf\x53\xa5\x8f\x61\xf1\x0d\x91\x01\x24\x8c\x6e\x73\xab\x94\xb0\xa2\x3c\xda\x83\x52\x12\xe9\x9d\x1e\xd8\x23\xd6\x0b\x6e\xce\x84\x7b\x94\xec\x1f\xef\x3f\x2a\x91\xb4\x20\x92\x22\xa3\xa3\x5a\xbd\x7c\x66\x20\x35\x3b\x6d\xb9\xd0\x84\x51\x83\xf0\x7a\x28\xbb\x86\x77\x41\x5c\xd4\xd1\xc1\x2a\x49\xd6\x3b\xea\x01\xec\x14\x04\x9b\x8f\x7d\x4b\xa7\x84\x4a\x91\xf3\xd8\xd9\x97\x82\x81\xef\xf5\xcc\x8b\x2f\x05\x07\x6f\x38\x9f\xad\x53\x81\x16\x7d\xc6\xc9\xcb\xde\xcb\x17\xcf\x85\x53\xe1\x17\xce\x70\xaa\xcb\xc0\xa9\x2c\x7d\x7a\xd4\x6f\xf5\x15\xef\x1b\xfa\xde\xd7\xce\xc4\x52\x14\xb4\x67\xbe\x5c\x36\xfe\x74\x2b\x99\x86\x52\x8f\xbf\x03\x54\x5c\x8c\x7e\x58\xaa\xca\x70\xb8\xa8\x93\x44\x4d\x20\xd5\x2b\x83\xa1\xf2\xc1\x03\xd2\x2d\x47\xa0\xf0\xb8\x2d\xb2\x70\xa9\x15\x24\xac\x0c\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x09\xcd\x87\x8f\x8a\x5a\x0e\x68\xe7\x77\x59\x8d\x1a\x9b\x33\xb9\xf3\x19\x45\x1b\x5c\xd6\x20\x04\xff\x0e\x63\x3a\x01\x4c\xe4\x66\x09\x95\x09\xfa\x1c\xaf\xec\xda\xc9\x20\xd7\x04\xf8\x84\x49\xc1\x53\xe0\x9a\x4c\xa8\x64\x58\x15\x47\x02\x56\x76\x30\xba\xe8\xe7\x07\xbf\x9c\xbc\xc5\x80\x86\x43\x57\x92\xc2\xad\x32\x57\xbe\x7c\x4d\x79\x25\xa5\xe9\xee\xdd\x3e\xbf\x0e\x03\x43\xa4\xb9\x7e\x5d\xe6\x3d\x69\xae\x73\xdb\x96\xe5\x2e\x4a\x72\xc5\x26\x8f\x45\x49\x5c\x86\xfd\x19\xdb\x6a\x9f\x67\xb2\xfd\x0b\x40\xcd\x25\xee\xa3\x69\x7d\x41\x82\xde\x9c\xc3\x64\x5f\x85\xa4\xbd\xb2\x0f\xdc\x99\x9e\x5c\x2d\x0d\x1b\x3e\xe7\x2b\x2e\xce\x89\x10\x58\x37\xe6\x71\x8d\x50\x31\x57\xa7\xb8\xc2\xcd\xc0\x5a\x0d\x48\xae\xe4\xf1\x9d\x5d\x5e\x95\x8b\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x2a\xd5\x60\xfd\xb4\xa0\x44\x82\x1c\x15\x45\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\xb4\x55\x25\x03\xaa\xac\x93\xe7\xec\xf2\xca\xda\x6c\x37\x83\xd9\xd6\x62\xf6\xf6\x12\xaa\xe1\xf8\x36\x8d\x61\x0b\xe1\xb6\xda\x33\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\x8b\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xa5\xca\xe0\x5b\xc0\xaa\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\xce\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x66\x83\x4d\xbe\x36\x47\xda\x3a\x6a\xde\xd6\x4a\x5e\x0d\x2a\x24\xb6\x2d\x4a\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x82\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x1a\x94\x6b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x62\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\xe5\x37\x5d\x19\xb7\xa2\xc4\xb1\xf5\x0d\xdb\x2a\xd3\x40\xa5\xa7\x68\xb8\xaa\x2d\x4f\x22\x79\x2c\x44\x98\x35\x76\x9c\x5d\x5e\x59\x4a\x68\x3f\x3e\x74\xa7\x5d\xb4\x4b\x05\x55\xdb\x1a\x03\x1f\xad\xca\x50\x1d\xcd\x63\xa6\xb9\x9f\x6b\xd7\x5d\x2b\x90\xa5\x86\xf8\x57\x2b\xd9\xae\xc6\xdb\x15\x50\x19\x8d\xb7\x81\xff\x0a\x42\x60\x27\x25\xb1\xb0\x91\x00\x43\x21\x51\x25\xee\x22\x79\x4f\x84\xb8\xc9\xb3\x75\x28\xba\x9b\xc6\x36\x5c\x5b\x8b\x40\x54\x9e\xf8\xa4\x68\x7a\xcc\xd5\x36\xfe\xde\xaa\xec\x03\xda\x4a\x3c\x38\x51\x91\x40\x21\x66\xf5\xa6\xd3\x24\x57\x1a\xe4\xf7\x4c\x2a\xbd\xe7\xeb\x45\x23\x06\x5b\x9b\xc8\x7e\xf9\x86\x7f\x30\x3d\x76\xa5\x1b\xf7\x3b\xd5\x4b\xe6\x6f\x37\xf1\xbe\xd1\x69\xf7\x2f\x05\x87\xfd\xde\xac\xd8\x15\x48\x79\x20\x6b\x4b\x79\x8a\x5b\xba\x82\xc4\xc6\x8b\xe2\x85\x12\xae\x5c\xbb\xb2\x95\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x38\xbc\x7b\x5c\x94\x99\xb4\x75\xa3\x6c\x9d\x4c\xe1\x04\xbd\x69\x19\x44\xa5\x52\x52\x5a\x2c\xff\xec\x6d\xe4\xb9\x8d\x31\xc0\x96\x1f\x75\xf5\x42\x5e\x31\x7e\xb3\x21\xfa\x55\xa3\x4b\xce\xe7\x66\xab\xd4\x13\xb7\x3e\x5a\xc6\x6d\xf0\x9d\x61\x31\x74\x20\x72\xed\x6b\x92\xa8\x92\xe2\xc8\xf8\xbf\xec\x5e\xa0\xbd\x3d\xb3\x15\xfb\x16\xe9\x88\xaa\x63\x8d\x3e\x5e\x09\x54\x53\xae\x29\xd6\x16\x3d\x13\xd1\x0d\x48\x92\x98\x65\xf4\x48\x11\xf8\x52\xa9\x66\x29\x73\xd8\x30\xea\x62\x5b\x4b\x07\x64\x63\x48\x41\xd2\xa4\x28\xea\x5a\x03\xd4\xaf\x1c\xe1\x0c\xb3\x96\x63\x52\x6c\x51\x34\x57\x86\xd1\x9c\xc3\xf3\x45\x77\xa5\x74\xea\x2b\xdd\x32\x8e\xe1\x06\x77\x4c\xa1\x59\x3f\x13\x71\x39\xf1\x2c\x57\x20\xbb\x21\x2d\xd0\xe5\xde\xa8\x10\x88\x13\xc3\x20\x1f\x8d\x18\x1f\x39\xea\x8c\x34\xbd\x54\x6e\x3b\x68\x3a\x18\xe9\x1d\x49\xb0\x05\x67\x51\x7a\xb0\xf1\x65\xac\x7c\x7f\x2a\x62\x7b\xfb\x60\x6a\xb5\x41\xbf\xb3\x45\x80\xf4\x05\x27\x42\xba\xd2\x08\x34\x8e\x71\xed\xf3\x5f\x88\x57\xab\x5f\xd5\x09\x71\x1c\x36\xb2\x3b\x3c\x55\x02\x8b\xca\x07\x46\xd8\xc9\xe5\xa6\x15\x42\xb7\x25\xfc\x5b\x11\xfd\x6a\xbd\x9f\x13\x5e\x6c\xf1\x69\x39\x60\x8e\x12\x0d\x69\x26\x24\x95\xd3\x59\x17\xa6\x21\x52\x06\x05\x0c\x00\x67\x20\xd5\x17\x31\xd2\xf1\x05\x1b\x3f\xb1\x9d\x7c\x17\xec\xfd\x42\x1c\x43\x2a\xc8\x05\xf1\x10\x35\xf4\x5a\x45\x63\x88\x73\x8c\x1e\x1f\xe5\x14\x3b\x8d\x9b\x53\xec\x8c\xdd\x53\x17\x96\x67\x91\x21\x04\xfc\x85\x34\x81\x29\x06\xc9\x60\x15\x4e\xf3\x0b\x56\xf3\xb4\xa1\x81\xb6\xd1\x32\x36\x5d\x0d\x51\x82\xd7\x45\xef\x07\xfc\x58\x98\xb0\x48\xfb\x87\x86\xcb\x10\x27\xa2\xa1\xbf\x6b\x5f\xb8\xea\x7f\x11\x18\x62\xa4\x55\xf1\x29\x2e\xaa\x04\xeb\x7b\xbe\xe7\x86\x49\x2c\xc7\xc5\x02\xf1\xee\x41\x39\x94\xab\xab\x5b\xb1\xe2\xf8\x06\x28\x2d\xf8\xf6\x4d\x8b\x25\xd5\x10\xca\xb7\xf7\xb8\x6d\xe5\x29\xab\x23\xff\x53\x39\xaa\xaf\x2b\xed\x9f\xc8\x51\x9e\xda\x1a\xde\x62\xa6\x8c\xb2\xc5\x39\xb4\x6b\x19\x96\x75\xfa\xfa\xac\x9c\xc2\x50\x8e\xcd\xf6\x09\x20\x46\x14\xaa\x69\xef\x9c\x35\x78\x5e\x18\xe5\x2c\x58\x51\x0b\xda\xea\xb4\x38\x67\xd1\x0b\x6f\xf3\x5a\x2c\xe3\x99\xe1\xc6\x28\x43\x14\x36\x3d\x1e\x8d\x29\x1f\xa1\x19\x5c\xe4\x66\xbe\xcf\x3f\xc7\x15\x49\x88\xf3\xc8\xf5\x8d\xf0\xf1\xcf\x9f\x7b\xeb\x9f\x2b\xe1\x83\xed\xeb\x54\x44\x33\xbf\xe6\xf2\x67\x59\x56\x7d\x4c\x58\x0f\x7a\x64\xef\xf3\xd2\xa5\x3d\xfb\xf6\x4c\x0a\xf3\x0a\x17\x3a\x8d\xab\x4a\x98\xc6\x83\xb0\x57\xbe\xbb\x47\xce\xcd\x3b\xd0\x23\x12\x00\x58\x8a\xee\x1d\x14\xe0\xeb\x10\x09\x23\x2a\xe3\x04\x33\xee\x86\x41\x28\xb1\x79\x39\x0e\x60\x78\xfa\x30\x9e\x8e\x0b\xbd\xc8\x3a\xb9\x66\x5a\x84\xa6\xea\x46\x1d\x59\x51\xa6\x1b\x53\x4d\xbb\xd8\x6b\xc3\x12\x8d\x23\xab\x5e\x77\x5d\x95\xd3\x2e\x75\x38\xd5\x0d\xdb\x7a\xf4\x07\x97\x59\xd5\xa5\xe1\x2e\xc6\xbb\xb4\x8b\xf5\x46\xb7\x8f\x15\x7d\x84\xb0\x82\x5a\x9a\x6e\x8d\x62\xb7\xb3\xe2\x69\x28\x76\x8e\x30\xc0\x56\x21\x45\x71\xeb\x10\xc1\xe0\xea\xb9\x56\x0e\xf2\xf9\xe5\xf5\xdb\x7f\xf6\xdf\x5c\x5c\x5e\xb7\xe7\xb9\x3d\xcf\xed\x79\xae\x71\x9e\x81\x4f\x6a\x9f\xe5\xa0\xff\x2c\x52\x09\x67\x8a\xcb\x95\x32\xaa\x9f\x51\x70\xd6\x39\x9f\xfc\x42\x8d\xc0\x97\x49\x50\x28\x8b\x18\xb9\x71\x91\x17\xd5\xdd\x60\xbb\x6d\x9d\x3e\xf9\xe8\xac\x47\x8c\xad\x6a\x30\x66\xe5\xb2\x54\x08\x60\xd1\xae\x95\xdb\xdb\x9d\xfe\x7a\x71\x76\x7e\x79\x7d\xf1\xfd\xc5\xf9\xdb\x47\x0d\x36\xa8\x59\xdc\xad\xca\x8d\xb7\xe4\x92\x99\x84\x09\x13\xb9\x4a\xa6\xa1\x3e\xec\x62\x22\x30\x1f\xaf\xc6\x8d\x7a\x36\x0d\x25\x70\x17\x3e\xd6\x32\xdb\x66\x99\x6d\x35\xf6\xa2\x46\x5d\x8f\xa6\xd0\xf7\x7b\x29\xd2\x86\x50\xf8\xca\xaa\xec\xde\xe4\xbd\x08\x9f\xf6\x5d\x09\x80\x0a\xeb\x71\xc2\x63\x51\x6f\xc0\x48\xa1\x69\xa6\x6b\x14\xff\x6f\xa4\x9c\x67\x33\x95\x2f\x6d\x9c\xc2\x6b\x9a\xfd\x04\xd3\xb7\x50\xb3\x7c\xc8\x8c\xab\x21\x81\xc8\x30\x3a\x72\x03\x53\xeb\x81\x3c\xf5\x2f\xab\x53\xe6\x64\x27\xab\xa1\xde\x40\x9d\x4a\xb5\x4d\x96\x31\xbd\x81\x1a\x81\x8b\x7e\xcc\x15\xf4\x34\x5b\x88\x72\x9a\xd9\xd3\x7a\xbb\x47\x9a\x2d\x61\xfa\x00\x65\x5b\xf7\xcb\xec\xde\xd1\x59\xbd\x71\x75\x05\x31\x31\x9c\x0b\x6e\x8f\x5c\xd0\x56\xd7\x68\xac\x5d\x8b\xb5\xea\x08\x23\x53\x8e\xfe\x80\xff\x21\xd7\x6f\xce\xde\x1c\x93\x93\x38\x76\xc1\xc3\xb9\x82\x61\x9e\xd8\x30\x60\xd5\x23\x34\x63\xbf\x80\x54\xd8\x3d\xed\x86\xf1\xb8\x43\x72\x16\x7f\x57\xa7\xe8\x92\x1d\x0d\xee\x82\xf0\x0e\x9b\x66\x77\xe2\xca\xf9\xe3\xca\xbc\x2b\x10\x11\x62\x33\x03\x11\x37\x7d\xfd\x15\x27\x64\x34\x04\x9a\xba\x8d\xe2\x88\xdd\xc2\x66\xe9\xea\x7e\x41\x58\x6d\x9c\x78\x28\x50\x15\x1f\x13\x95\x63\xa1\x18\x15\xba\xbb\x61\xbf\xd4\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\xb7\xf0\x23\xf6\x63\x57\xef\xf6\xf7\xbf\xfd\xe9\xfc\x9f\x7f\xdb\xdf\xff\xf0\x5b\xf9\x2a\xb2\x42\xd4\x9a\x67\x6e\x41\xff\x0e\x17\x31\x5c\xe2\x3b\xf0\x4f\x27\xae\x9d\x44\x91\xc8\xb9\x76\x17\x30\xab\xb7\x37\x16\x4a\x5f\xf4\xc3\x9f\x99\x88\x67\xff\x52\xb5\x2a\x89\xed\x24\x63\xc0\x2d\xaa\x91\x9d\x62\x47\x73\xec\xa1\xa0\x25\x0d\x1f\x55\x37\x6b\xe8\x5c\x11\x8d\x21\xb5\xb5\x8c\xbe\xf7\x20\xc0\x0e\xb4\xbe\x7c\x00\xc7\x9c\x6b\x23\x99\x56\xcb\xca\xed\x4d\x5e\xd6\x6a\xd5\x6d\x47\x83\xa4\x2d\xec\x60\xc3\x00\x43\x88\x38\x68\xd9\x83\x1c\x18\xac\xd7\x52\x0a\x6f\xec\x49\xff\x82\x4c\x2c\x84\x77\x06\x38\xde\x0b\xf6\xfd\x83\xd2\xb8\xb2\xaf\xad\xa2\x21\x1e\xdb\x86\xad\xfe\xba\xcb\xb3\x57\xa1\xf4\x15\x18\xc5\xe6\xc0\xfe\xd8\x8b\xb2\xbc\xe3\x6e\xe8\xa5\x90\x0a\x39\x0d\x7f\x06\x1f\x5f\x57\x69\x21\xe9\x08\xf3\x32\xec\xe3\xf6\xb1\xf0\x97\x7d\xb0\xf2\x82\xf9\xa7\xad\x2a\x1c\xe5\xd2\x08\x0d\xc9\xd4\x53\xe4\x2d\xeb\x45\x14\x63\x07\x69\x9b\x07\xfd\x8e\x90\xb6\x80\x19\x75\xdb\xb2\xda\x51\x45\xc8\xc2\x51\x8f\x02\x67\x80\x22\xea\x93\x2e\xef\xb4\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\x6e\x5d\x39\xab\x18\x0d\x52\xb3\x98\x4d\x98\x12\x35\xb2\x4f\xc2\x44\xcb\x43\xea\x5d\xe9\x0b\x1b\x38\x14\xcc\x66\x77\x19\x16\x0b\x0a\xe7\x75\x86\xec\xbf\xac\xd3\x2f\xc8\x8e\x8c\x6a\x0d\x92\x1f\x93\xff\x3e\x78\xff\xe5\xef\xdd\xc3\xef\x0e\x0e\xde\xbd\xe8\xfe\xe5\xc3\x97\x07\xef\x7b\xf8\x8f\x2f\x0e\xbf\x3b\xfc\xdd\xff\xf1\xe5\xe1\xe1\xc1\xc1\xbb\x9f\x5e\xff\x70\xdd\x3f\xff\xc0\x0e\x7f\x7f\xc7\xf3\xf4\xc6\xfe\xf5\xfb\xc1\x3b\x38\xff\xb0\xe6\x24\x87\x87\xdf\x7d\x5e\x7b\xe9\x0d\xd4\xee\xb4\xa3\xc9\x0a\x9e\xd5\x19\x1b\x41\xbf\x07\x2c\x5b\x6f\x87\x47\xaf\xa6\xcf\xbf\x8f\x1e\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xc7\xb0\xe4\xd8\x37\x95\x2a\x08\xec\x2b\x12\x54\x8b\xe7\xc6\xe7\x3e\x05\xe3\x4e\x68\x38\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\x15\x8e\xee\x0d\xec\x42\xef\xef\xbb\x81\x5a\x2d\x50\xed\x68\x8d\x41\xad\x31\x68\xc9\xb8\xd7\x18\x74\x65\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\x2e\xa1\xb6\x9e\x43\xad\xe7\x8f\x7a\xd1\xa9\xb1\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x91\xd9\x1e\x7c\x9c\xa0\x48\xbb\xb0\xaa\x8d\xab\xf0\x07\x13\xb3\x84\x50\x22\xba\x52\x0c\x12\x03\x1d\x31\xf4\xf4\x1f\x36\x12\xf4\xc6\x06\x87\x1a\x25\x8d\xf1\xa2\x8c\x66\x10\x0e\x8b\xda\xcb\x54\x29\x11\xd9\xa0\xd6\x90\x04\x80\x95\xdd\xdc\xb2\x71\x35\xd8\x06\x3e\x93\x10\x41\x0c\x3c\x02\x57\x97\xb9\xd2\x95\x92\x72\x72\xce\x27\xbe\x36\x75\xec\x53\x4a\x70\x25\x8b\xe7\x78\x5e\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x66\xc5\x50\x0c\x31\x2c\xac\xac\xdb\x35\xae\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\xcf\xc1\x19\x58\x9f\x7d\x7e\x72\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xbb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\x14\x93\x4c\x42\x06\xdc\x66\x09\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2d\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x48\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\xad\xb5\x82\x88\xbc\x31\xa2\x15\x69\x47\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\x7d\xea\xfd\x0b\x84\x46\x96\x27\x89\x4b\xcb\xed\x91\x37\x1c\x8f\xe4\x09\xf6\x41\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\xd6\xa2\x2f\x55\xce\x11\xb2\x32\x41\x51\x94\xab\x46\x18\xfa\xf2\x6d\xf9\x83\x4f\x98\xec\x3e\xd2\x36\x85\x66\x1f\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xeb\xf5\x09\x16\xa2\xc8\x84\xd2\x57\x46\x8b\x6d\xa6\x11\x4c\xdf\x4f\x87\xbd\x15\x68\x92\x40\x5c\xe9\x04\x64\x3b\x58\xd0\xaa\x16\x8d\xf9\xb8\xa1\xa1\x02\x90\x31\xe5\x71\x02\x12\x8b\xa2\xab\xd9\xca\x4f\xac\xe8\x02\x10\xfa\x36\xf8\x04\x4d\x1a\x45\x42\xc6\xae\x03\xab\x4b\x94\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\xa5\x75\xb1\xe0\xb2\x2a\x35\x7f\x18\x0b\x71\x43\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\xe8\x3d\x13\x50\xb4\x6b\x66\x57\x47\xa5\xb6\x34\xf8\x43\xbd\xae\x34\xb5\x84\x95\x26\x44\x15\xb8\x83\xa8\xb1\xbe\x75\xe7\x77\x10\x95\x1a\x2f\x9a\x2d\x71\x9d\x17\xb5\x40\xdb\x46\xfd\x7e\xba\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\xa1\x35\x9c\xd3\xd7\x95\x76\xaf\xc0\x12\xfd\x36\xab\x18\x33\xcf\x7c\xa9\xe9\xca\x61\xb0\x47\x6f\xae\x3a\x5b\x08\x36\xf6\x73\x61\xee\xb3\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\x8a\x13\x5f\x97\x9e\x64\x58\x8d\x2f\xc3\xd2\x76\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\x28\x00\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\x11\xe0\x60\xff\xf7\xfd\x0e\x01\x1d\x1d\x92\x5b\xc1\xf7\x35\x2e\x1f\xcb\x67\xe4\xaa\x34\xd1\x54\xe4\xd8\xa5\xce\x82\x20\xd4\xc2\x30\x14\x8b\x88\xdc\xb6\xb4\x19\x53\xed\xd3\xf0\xce\xef\x98\xf6\x6d\x1c\xc4\x90\xbc\xb0\x1d\x75\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\x53\x34\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\x1f\xb6\xef\xd4\x4a\xe6\x9a\x18\x5f\x5f\xf7\x7f\xa8\xf4\x6a\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x75\x25\x76\x80\x76\x34\xe3\xd0\xab\xd5\xb4\x95\x34\x48\xc2\xea\x36\x6f\x25\xf3\x4d\xa9\x37\xeb\xda\x4a\xfe\x29\x72\xec\x36\x47\x07\xc9\x94\xdc\x52\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x02\x8d\x41\x2a\xa4\x1e\x40\xb7\xae\x9f\xe5\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\xb3\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x67\x3e\x2a\x83\xad\xdc\x8d\x84\x71\x0b\x2c\xdb\x47\xb0\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\xdd\xb4\x91\x4c\xd8\x7a\xad\x3b\xc3\x65\xea\xb6\x16\x27\x8b\x73\x89\x25\xe1\xa1\x13\xec\xd3\x68\x2f\x4e\x9a\x0b\x53\x6c\x3a\x48\xb1\xd1\x10\xc5\x07\x0d\x50\xc4\xb4\x88\xda\x54\xa4\x6a\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\xad\xa2\x6a\x0e\x35\x47\x6d\x27\xce\x98\x8e\xb2\x2b\x11\xdd\x34\xa8\xd7\x9c\x41\x26\x21\xb2\x76\xb2\xeb\xd3\xbe\x9d\xdd\xe8\x97\x97\x6f\xae\x8b\x70\x7c\x8c\x59\x29\x0c\x97\x3f\x3a\x4b\x9a\xd1\x49\x6f\x20\xd3\x41\x75\x1f\xd0\xe8\xe6\x96\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x9e\xa2\x72\x2e\x01\x63\xfd\xb9\xb0\x41\x71\xb6\x48\xa2\xf0\xad\x4e\x43\x1f\xee\x60\xc3\x42\x0b\x99\x8b\x9e\x19\x52\x66\xf4\xf1\xd0\xcf\xd6\x46\xcd\x44\x59\x30\xe9\x95\x2d\xd3\xad\xf2\xe5\xc7\xce\x2a\x5f\xa5\x5e\xad\x9b\xea\x61\x75\x63\xf7\x76\x98\xd5\x39\x16\x27\x43\x2b\xb2\x96\xd5\x35\x34\xdf\xee\xb2\xba\x4c\xc2\x95\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x8f\x38\x07\x57\x2e\xf3\xa4\x7f\x11\xac\x5a\xa2\xe2\xd8\xb0\x51\x8b\xbe\x46\x66\xc2\x26\xc0\x41\xa9\x23\x74\x87\xe4\x99\x6b\xc7\xef\xba\xce\x76\xcc\xd7\x41\x8a\xab\xeb\x14\x99\x00\xae\xe7\x2d\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\x76\x5a\x6e\xf9\xb3\x6e\x94\x48\x52\x35\xb6\xfd\x60\xe1\x8e\x69\xd7\xd3\xb8\x6f\x6b\xe8\x96\xdb\xd2\x8e\x24\x8d\x80\x64\x20\x99\x30\xcc\x28\xe7\x3a\x16\xb7\x9c\x0c\x60\xc4\xb8\xf2\xa0\xc0\x2a\x98\x0e\x66\xe8\x8f\x61\x2a\x94\x4c\xeb\x91\xb7\x95\x82\x20\x2e\x55\x27\x12\xc5\xd1\x74\x6b\x9e\xf5\x24\x21\xc7\x42\x38\xd9\xee\x2a\x01\xc2\xe5\x86\x33\xf7\x2d\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\x11\x99\xd8\x2b\x9a\xfd\x07\xa4\x3a\x6c\xc0\xe3\x64\x5b\x26\xf9\x6b\x4b\xd7\x81\xe5\x47\x69\x34\xae\xe7\xc2\x6d\x5d\x54\x6b\x8e\xd6\x45\x55\x67\x92\xd6\x45\xd5\xba\xa8\xee\x19\xad\x8b\xaa\x75\x51\xcd\x8c\x9d\xd5\x92\x5a\x17\xd5\xd6\xa3\x75\x51\xad\x1e\xad\x8b\x6a\x8d\xd1\xba\xa8\xd6\x1c\xad\x8b\xaa\x75\x51\xb5\x2e\xaa\xd6\x45\xf5\x09\xd9\xed\xfc\x68\x5d\x54\x73\x93\xb4\x2e\xaa\xd6\x45\xb5\xf6\xd8\x59\xe5\xab\x75\x51\xd9\xd1\xba\xa8\xaa\xe3\xd3\x62\x75\xde\xc1\xd3\x37\xaa\x5e\xfd\x46\xbc\xa8\x30\x3a\x1a\xfb\x2c\xd3\x9e\xea\xd8\xff\x3f\x8e\xed\x7f\x47\x1c\x25\x0d\xd8\xfb\x5b\x5b\xff\xb3\xb3\xf5\x37\x63\x27\x6b\xc0\x46\x56\x9b\x26\x3b\x17\xf8\xf5\x58\x82\x1a\x8b\x64\x6b\x44\xaf\x20\xf9\x6b\xc6\x59\x9a\xa7\x06\xe7\x94\xc1\x67\x36\x09\xbe\x76\x55\x74\x27\x46\x17\xbc\x35\xd7\x99\x1b\x59\x0c\x58\x79\x93\xb2\xc4\x6c\x23\x26\x4a\x8e\xe9\xc4\xe0\xba\xca\xa3\x08\x00\xfb\x7a\x95\x55\x89\xaf\x7b\xe1\x4d\xa1\x8f\xc3\xcb\x7a\xf4\xa6\x1e\xb7\xb4\xb5\x31\x71\x96\xaf\xbf\xda\x6a\x8e\x91\xcc\x9a\xa1\xcb\x3f\xbc\xed\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x76\x7f\xc5\x9b\x8c\x54\xe4\xda\xc6\x62\xb7\xd2\x01\x68\x5a\x52\x22\x9c\xfc\xad\x6c\x9b\x62\xf3\x9c\x79\x2a\xa4\xb4\xf7\x6d\x20\x05\x50\x9d\x4b\x20\x23\xaa\x1f\x93\xe0\xd7\xd7\x15\x6a\xe9\x09\x4d\xf0\x9b\xba\xa2\x70\x55\x8e\x31\x02\x6f\xd5\xdc\x33\x42\xbc\xb0\xe5\xdc\xd7\x16\x78\x6b\x53\xca\xfa\x42\x68\xfd\xa3\x45\xb0\xde\x0a\x7e\x78\x63\x00\xde\x73\x7d\xb6\x3d\x3b\x2f\x6b\x1b\xbe\xc5\x91\x16\x24\x4b\x68\xd1\xa4\x08\x77\xe0\x47\xe4\x41\xa7\x63\x88\x6e\xde\x3a\x97\xe7\x81\x02\x08\xf1\x2a\x23\xa6\xc7\xf9\xa0\x17\x89\xf4\xc8\x90\x04\xfb\x7f\x83\x44\x0c\x8e\x52\xaa\x34\xc8\xa3\x58\x44\x8e\xc5\x75\x23\x33\x0b\xe3\xa3\x5e\x1a\x1f\x62\x1b\xdc\x8b\x6a\x53\xc4\x52\x29\x04\xf3\x7e\xa7\x0c\x92\x01\x18\xea\x2a\x50\xe1\x2f\xd5\x53\x33\xcb\xdb\xb8\x71\x6d\x79\xd4\x66\x49\x35\xdd\xcd\x1f\xdf\xd5\xdc\x52\x2e\xd2\x80\x65\xe3\xa9\xb9\x94\x1b\x0b\xad\x68\xc0\x95\xbc\x43\x6e\xe4\x9d\x11\x8d\x77\xc5\x75\xbc\x83\xa5\x8f\x1b\xf0\x74\x36\xe1\x2a\x6e\xce\x4d\xfc\x00\x15\x82\x1f\xc6\x3d\xdc\xa0\x0d\xad\x21\xb7\xf0\xc7\x70\x09\x37\xf2\xd5\x75\x5d\xc1\x1f\xcf\x0d\xdc\xcc\xe7\x36\xa9\x08\x3c\x55\xd7\x6f\x03\xb6\xf0\x26\xed\xe0\x8d\xd9\xc0\x1f\xcc\xd5\x5b\xdf\xcd\xbb\x03\x2e\xde\xda\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xf4\x0a\x22\xc1\xe3\xad\x39\xcc\x4c\xc9\xc8\x70\x7e\x94\x9d\xd6\xd9\xa9\xaa\x19\x0d\x63\xea\x2a\x63\x1b\x8d\xca\x66\x70\x78\xff\x84\x13\x28\xd0\xb5\x60\x57\xb9\x4d\xd1\xb9\x5b\x21\x6f\x12\x41\x63\x75\x94\x09\xfb\x7f\x45\xbe\x42\x29\x51\xc1\xbe\xab\x5e\xa6\xc2\x63\x1b\xc4\x6c\x7a\x47\x93\x9b\xf8\xa3\xb8\x25\x62\xa8\x81\x93\x03\xc6\xfd\x3e\x1e\x96\xd4\xc0\xc2\x3a\x19\xd0\xda\x5c\x7d\xf9\xc2\xdf\xfc\xfc\xcc\x8e\x68\x60\x55\xea\xe1\xad\xc0\xee\x45\xf7\x9b\x81\xdd\x8d\xc3\x3c\xa9\x9a\x82\xad\x79\xb8\x4a\x6f\x5e\x16\xb5\x7d\x5f\xe2\xbc\xe1\xb4\x51\x1e\x13\x97\xf2\xf5\xfc\x36\xad\x76\x00\x4b\x55\xf4\x0b\x01\x2b\xf7\x59\x8d\xaf\x4f\xfb\xd6\x68\xdc\x9a\x4b\x76\xc5\x5c\xf2\x48\x41\x20\x3b\x28\xe8\x3e\xd1\xc0\x8f\x56\xd0\xdd\x60\x94\x92\x40\x7f\x90\x34\x82\x7e\xe3\x32\x82\x3f\x4e\x24\xce\x25\x75\x04\x30\x88\x7c\xfe\xf0\x70\x80\xd8\x9e\xa6\x90\x38\x8b\x29\xa9\xc3\x3c\x49\xa6\x24\xcf\x04\xaf\xa6\x19\x5b\x5f\xfb\x6c\xd6\x2a\x9a\xe4\x17\xbc\xa5\x10\x2c\x33\x29\x1c\xcf\x94\x39\xe7\x86\x06\x17\x0d\xba\x50\x90\xc4\xaa\xc6\xb4\x92\x1b\xab\xd8\xc8\x2c\xdf\xf0\x3f\x4c\x9b\x2d\x22\xfd\x2a\x13\x9a\xa7\x87\x42\x46\x6c\x90\x4c\xc9\x98\x26\xa1\x1b\x0b\x25\x37\x2c\x49\xdc\x34\x3d\x72\x05\xda\xba\x14\x2c\xef\x4c\x04\x1f\xe1\xe2\x28\xf7\x5d\x00\x21\x32\xcf\x46\x09\x50\x9e\x67\xf6\x7d\x86\x13\x4f\x45\x2e\xfd\xfb\x7a\xc1\x31\x51\x74\xdd\x67\x49\xa7\xd4\x6b\x6c\xe5\xc6\x86\xfe\x34\xb9\x32\x02\xc0\x1b\x5f\xc5\xb9\x53\x9e\x53\x4c\x40\x4a\x16\x3b\x3b\xbf\xfd\x2d\x93\x62\xc2\x62\xeb\xdd\xf0\x60\xc3\xae\xc6\xb6\x9b\x4c\x38\xcf\x5c\xf0\x2e\x87\x11\x45\x41\xc5\x9d\x22\xbb\x67\x76\x1e\x1b\x41\xc0\x63\xec\x2f\x63\x24\x7c\x91\x55\xf2\xd6\x27\xcc\x76\xc6\x2d\x41\x8e\x1c\x70\x41\x04\x06\x7e\xe6\x9c\x69\xdb\x6d\x7d\x9c\x6b\x12\x8b\x5b\x7e\xb8\x91\xd7\x15\x1d\xad\xd7\x0b\x01\x54\x75\xbf\x2e\x92\x73\xec\xf7\xae\x06\x2f\x53\xce\xf4\x39\x24\x39\x57\x50\x93\xbd\x37\x26\x1c\x7d\xf3\xc7\xed\x68\x04\x4b\x41\xe4\xfa\xa3\x68\x7f\xb7\x63\x16\x8d\xcb\xc2\x2c\x4b\x41\x11\x91\xcf\xa8\xc5\x2f\xdd\x63\x8b\x77\xa8\x55\x01\x17\x8d\x6d\x0d\xbb\x0b\xac\x5f\xae\x61\xe9\x7c\xfc\x5e\xa9\x21\x33\x86\x66\x9f\x5d\x5e\xfd\xfa\xea\xe4\xef\xe7\xaf\xdc\xf9\xe4\x65\xa6\x9f\x73\xf6\xef\x1c\x08\x4d\x85\x91\x85\x93\x72\x18\x60\x07\x35\xfa\xd2\x0f\x78\x92\x9b\x0d\x18\xdc\x92\x21\x63\xf7\xf8\xfa\x61\x91\xd8\x83\xfe\xe1\xa3\x22\x1f\xbb\xab\x56\x11\xdc\x62\xe4\xc6\x52\x57\x2d\x4a\x38\x68\x73\xf2\xac\x44\x69\xbb\xac\x31\x3e\x4a\xca\xc2\xe4\x76\xe4\xaa\xae\x4e\x54\x57\x23\xea\x16\x5f\xd0\xdf\x56\x31\x6a\xa4\xbb\x57\xb1\x86\x86\x7a\xe2\x14\x54\xdb\xab\x01\xb6\x69\xb1\x57\x03\xac\xe8\x71\xd1\x27\x34\x8e\x25\x8a\x29\x78\xea\xd3\x99\xde\x98\x59\x11\x4b\xd3\x21\x2f\xc8\xb7\xe4\x8e\x7c\x8b\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x63\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\x9d\x06\x69\xc4\x22\xb7\x13\x8f\xda\x7b\xc9\x2c\xf0\x23\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xf9\xac\xdf\x21\xd7\xa7\x7d\x6c\xea\x73\x75\x7a\xdd\xaf\x4a\xd8\x7b\xd7\xa7\xfd\xbd\x47\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\x37\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\x3c\x2f\xd7\x6d\x9b\xe6\xf3\x89\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\xef\x9d\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x2c\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x5c\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xe9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\x3c\x07\x15\xd0\xf7\x5c\xad\x9f\xa3\xf2\xd6\xcf\xb4\x7e\x58\x1f\x39\x5f\xf0\x2b\x5a\x42\x54\x66\x26\x91\xc5\x94\x89\x04\x1a\x4f\x71\x4a\xec\xf3\x50\x12\xb2\x9e\x60\x74\x60\xc2\x52\xb6\x5d\x5a\x10\x99\x3b\x34\xaf\x70\xae\x92\xd7\xc5\x80\x25\xa5\x77\x78\x00\x68\x2a\x72\xdb\xfa\x35\x12\x69\x96\xeb\x2a\x4c\x71\x7b\xb6\xe9\xda\x3a\x64\x23\xc7\x51\x8f\x6c\x83\xd9\x6e\x98\xb6\x5b\x6a\xea\xfa\x88\xad\x5a\x69\xec\xa3\xe6\xfa\x4d\x04\x8d\x50\xad\x41\xf2\x63\xf2\xdf\x07\xef\xbf\xfc\xbd\x7b\xf8\xdd\xc1\xc1\xbb\x17\xdd\xbf\x7c\xf8\xf2\xe0\x7d\x0f\xff\xf1\xc5\xe1\x77\x87\xbf\xfb\x3f\xbe\x3c\x3c\x3c\x38\x78\xf7\xd3\xeb\x1f\xae\xfb\xe7\x1f\xd8\xe1\xef\xef\x78\x9e\xde\xd8\xbf\x7e\x3f\x78\x07\xe7\x1f\xd6\x9c\xe4\xf0\xf0\xbb\xcf\xb7\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x41\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\x70\xff\x68\x69\xc3\x73\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xdd\x56\xf6\x93\x65\x06\xa4\xab\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x73\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc8\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x76\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\xff\x7f\xf6\xde\xc7\x3b\x6e\xdb\xf8\x17\xfd\x57\x70\xd4\x9e\x2b\xa9\xd9\x5d\xd9\x49\xdb\x6f\xea\xdb\xd7\x1c\x55\x92\x13\xbd\xd8\xb2\xae\x25\x27\xb7\x2f\xce\x37\xc5\x92\xd8\x5d\x54\x24\xc0\x12\xa0\xe4\xed\xcd\xfd\xdf\xdf\xc1\xcc\x00\x04\xb9\x2b\x5b\x22\x69\xaf\xe4\x2c\x7b\x4e\x63\xed\x72\x41\x70\x00\xcc\xef\xf9\x4c\x6d\xcf\x83\xf9\x3a\xd5\x3a\xa3\x6a\x84\x6c\x59\x8f\x2f\xd1\xf5\xa6\xf4\x2f\x4a\xdc\xfc\xe2\x46\x33\x6c\x96\xf1\x79\x30\xe3\x8d\xb0\x2b\x9e\xb8\x7a\xe8\x5b\x5f\x00\x52\xfd\x2b\xc1\x78\x76\xc3\x97\xa6\x76\x6a\xd4\x63\x48\xf3\x8c\x3d\xdd\x87\x8d\xc7\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xcd\x1d\x1d\x9e\xff\x72\xf1\x8f\x8b\x5f\x0e\x8f\x5f\x9e\x9e\xb1\x33\x6d\x05\x8a\xa4\xa8\x49\x5a\xc2\x95\xb3\x10\x68\x96\xf0\x0c\xb0\xa0\xb5\x99\x80\x5f\x51\x1a\x76\x23\x55\xaa\x6f\x4c\x67\xff\x29\x6e\x3f\x47\x3c\xc1\x55\xa7\x31\x12\x5e\x70\xe8\xfd\xd6\x43\x3e\xac\x64\x7f\xc4\x83\x82\x04\x4e\xd3\x83\xb4\xd4\x05\x12\xc1\x3b\xa0\x62\x23\xe9\xb8\xe5\x57\xf6\xf9\xa5\xb0\xbe\xb3\xe6\x80\xf3\x92\x2b\x5b\x7b\x62\xea\x35\xa3\xa6\x73\x93\xde\xcb\xf1\xb8\xab\x8d\x78\x3a\x5c\xa5\xd1\x61\x9a\x8a\xb4\x41\xfe\xcf\x2e\xab\xef\xc8\xbf\xdc\xb2\x06\x63\x60\xe7\xaf\x2e\x4e\xff\x77\x6b\x1f\x2f\x8b\x7e\x49\x4c\xc3\x14\x80\x96\xba\x18\x6c\x75\x5f\x8b\x5c\x5f\x6f\xd7\xf7\xa1\xac\x6f\x90\x96\xc3\x84\xce\x5f\x57\x2a\x16\x68\x2a\x1a\x9f\xe5\x3a\x15\x13\x76\x1e\x7c\xf8\xcd\x6f\x63\x90\x99\x52\x30\x77\x8b\xb2\x92\x67\xd9\x32\x56\xa6\xac\xc6\x0a\xc1\x06\x04\x41\xcc\xc8\x67\x3c\x33\x9b\xe6\xc6\x7d\x64\xa3\xd3\x23\x5e\x3a\x6b\x76\x90\xe5\x08\xa3\xb1\x54\x28\x6d\x49\x19\x76\xb3\x04\x58\x87\x52\x27\x0c\x4d\xe7\x28\x51\xaa\x21\xdf\x0c\xc6\x11\xbc\x68\x94\xc6\x13\xfb\x3c\x8c\x8c\x4e\xe4\xca\x08\xb3\x5e\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x89\xeb\x20\x3b\xe0\x47\xd2\x96\x81\x20\xcd\x4c\x2f\x0e\xcf\x1d\xc3\x6a\xc0\xa1\x8a\xab\x6b\x8f\xeb\x15\x7f\xec\x47\xaa\xac\xd4\xa1\xf9\xb6\xd4\x55\x67\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xac\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\x9f\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x1d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0d\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\xb6\xce\x99\x56\xee\x60\x0e\xb2\x79\x4e\x43\x14\x96\x48\x1a\x6f\x15\x88\xe7\x92\xf5\xc7\x21\xaa\x0b\xc7\xb2\x32\xa2\xc4\x10\x74\x59\x09\x5c\xc9\xef\xab\xa9\xc8\x1c\xe5\x9d\x49\x4a\x1d\xb3\xd1\xf1\x20\x73\x3e\x17\x8c\xdb\xb0\xd3\xac\x66\x42\x19\xc7\x31\xd1\x7d\x69\x59\xaa\x45\x5d\x19\xcf\x0d\x7b\x73\x7a\xcc\x9e\xb0\x3d\xf7\xac\x7d\xd8\x3f\xd0\x50\xdb\x6a\x4c\x40\x6b\xdb\xa8\x33\x3f\x04\x4c\x09\x36\x2f\xd3\x25\x32\x89\x11\x53\x9a\x99\x2a\x59\xc4\x5d\xbc\xbd\xd9\x4c\x49\x8a\x10\x18\x79\x98\x7b\x7d\xb3\x1c\xea\x8d\x11\xe5\x60\x0c\xea\x4d\x07\x06\x15\xab\x51\x6e\xcf\x35\xa9\x87\x1b\x2b\x17\x96\xa7\xdc\x72\x62\x5c\xa1\xab\xfa\x43\x5d\xd2\xdf\x36\xfb\x32\xe2\x85\x54\xd5\x3b\x74\x91\x0e\xe7\x6a\xb9\x38\x81\x61\x61\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\xa7\x8d\xbd\x32\xba\x45\x4d\x04\x3e\xe1\xe3\xd0\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x20\xe8\xcd\x93\x45\xfc\x80\xed\xee\x6b\x5e\x0f\xc4\x29\x94\x89\x6b\xd1\x03\x42\xab\xb5\xf3\x5e\xb8\xd1\x1c\x71\xfc\x8e\x80\xe1\x59\xc6\xa7\x22\x43\x1a\xe3\x0e\x34\xab\x3b\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x0f\x51\xcf\xda\x74\x70\x7a\x43\x93\x0e\x20\xbc\x1f\x3a\x1d\x8c\x48\x12\x9d\x17\xe7\xa5\x76\x66\xe7\x60\xb2\x89\x86\xad\xe3\x7c\xe8\xd8\x00\xbf\x7d\x6c\x01\x53\x54\xaf\x79\x33\x2f\xa3\xa4\x4b\x6e\x51\x48\xf8\xcc\xcb\xff\x11\xc9\x2c\x60\x3d\x6d\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\xc7\x2c\x0e\x86\xa8\x5b\xe8\xe1\xec\x1c\x44\x1a\xe9\x84\x67\x00\x91\xda\x6f\xcb\xb1\xf6\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc4\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x32\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x62\x02\x57\x68\x41\xee\xc2\x91\xf0\x83\xfa\xf3\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\xc8\x6e\xa5\x61\x3b\x2f\x3c\x01\x7a\x20\x55\x3e\x44\x09\xb3\x83\x6f\x18\x56\x13\x3d\x9d\x57\x52\xa5\x94\x4a\xdb\x20\x96\xb7\x73\x49\x0f\x86\x24\x6d\x99\xc6\xbc\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\xde\x1e\xaf\x51\x65\xf6\x3e\xba\xf1\xfb\x1d\xaf\xe1\x21\xed\x61\xde\x28\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\xe2\x7e\x43\x5b\x31\x3f\xe2\xb0\x5e\xa5\x4f\xdc\xb6\xb6\x52\xcd\x4d\x6c\xc9\x34\xf1\xf0\xd7\x9b\x32\x7e\x85\x67\xa5\xc6\x12\xcc\x55\x13\xa2\x55\x02\xf0\x58\xcc\x90\xcc\xa9\x13\x8f\xdc\x08\x99\xe7\x86\x1f\x95\x8e\x12\x56\xf2\xec\xa2\xe8\x0e\x1f\xca\x56\xa0\xea\x5e\x5e\x1c\x36\x87\x06\x61\xbd\x10\x25\xca\x7e\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\x6b\xb0\xb2\xa2\x2c\x2b\x23\xe7\xe6\x80\xf6\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\x4c\x26\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\x9e\x99\x92\x15\x56\xa7\x89\x80\xcc\x6e\x17\x6c\x9c\x61\xaf\x2e\xcf\x59\x4f\x48\x94\x0f\x2c\xd1\x19\xed\xed\x36\xea\xd9\x5a\x3a\xa2\xf6\xb8\x71\x22\x91\x72\x91\x08\x33\x1c\xd8\xd2\x77\xf5\x98\x2c\x15\x58\x61\x23\x20\xfb\x89\xdf\x9a\x0e\x07\x7e\xe9\x5d\x28\xd4\xa4\x9f\xee\xc6\x1a\xf5\x65\xcd\x5c\x9c\x3d\x92\x15\x0b\x3e\x46\x23\xdd\x71\x34\x60\x81\x5e\x85\x58\x68\xa5\x4b\xdc\xa2\x4e\x88\x6a\x05\x5b\x1a\x58\x14\x46\xf3\x60\x4d\x88\x45\x47\x53\x3d\xaa\xa3\xc4\x71\x20\x10\x0a\xbd\x10\xdb\xa1\x9e\xc3\x8d\xb4\x0b\xc0\x60\x5d\xb4\xa2\x86\x30\x93\x52\x18\x08\xc0\x28\x26\xca\x52\x97\x94\x90\xe5\xfd\xd6\x30\x12\x70\x72\xc8\xe8\x72\x9b\x84\xbb\xbf\x76\x4d\x1c\xa8\xae\x11\xcf\x21\xc7\xd0\xed\x26\x31\x9b\x89\x04\x14\xad\x98\xc0\xc8\xb5\xf7\x6a\x50\x5a\x5f\xc2\x61\xb5\x47\x4c\xcf\xe5\x3b\xf7\x94\xf8\x57\xad\xbe\x2b\x4a\xab\xf1\xfa\xaf\xf7\x27\x8c\x9d\xaa\x90\x7f\x3b\x72\xab\x18\xdf\xe9\x53\xcf\xac\x7b\xc5\x18\x6e\x1f\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\x74\xb0\xc5\x40\xbf\xdb\xb5\xc5\x40\xbf\xe3\xb5\xc5\x40\xdf\x62\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x81\xfe\x79\xe1\xda\x6c\x31\xd0\x37\xed\x62\xde\x62\xa0\x6f\x31\xd0\xdf\x77\x6d\x31\xd0\x3f\x70\x6d\x31\xd0\x3b\x5c\x9f\x01\xe7\xda\x62\xa0\x77\xb8\xb6\x18\xe8\xeb\xaf\x2d\x06\xfa\xea\xb5\xc5\x40\xbf\xf5\xda\x62\xa0\x77\xbe\xb6\x18\xe8\x5b\x0c\xf4\x2d\x34\xe4\xfd\xc6\x7a\x98\xd0\x90\x6c\x8b\x81\x4e\xd7\x16\x03\xfd\xb3\x00\xc0\x63\x5b\x0c\xf4\x3b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\xb9\xb8\x4b\xb6\x18\xe8\x5b\x0c\xf4\xdf\x8e\xa2\xbb\xc5\x40\xdf\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\xef\x9d\xc5\x16\x03\xfd\x73\x30\x01\x8d\x4d\x65\x27\x58\xc8\xbb\x20\xd8\x50\x66\x72\x54\x30\x3e\xad\x66\x33\x51\x02\xe7\x82\x27\xaf\x24\x4f\xd5\x60\x7d\xed\x20\xab\xb0\x23\x00\xc3\xa1\x22\x8e\x5b\x7e\x4e\x15\xea\x00\xdf\x58\xa7\x0f\x9f\xbc\x7a\xbe\x06\x2e\xa7\x73\x56\x61\xd7\xc4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x15\x15\x11\xdd\x93\x4c\x1b\x4a\x7b\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa2\x4c\x9f\x18\x5b\x0a\x9e\xfb\x64\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb2\x40\x41\x15\x88\x01\x59\x71\x75\x5e\xf3\xa8\x7e\x1a\x4d\x4b\xc7\x78\x65\x60\x6d\x8e\x00\xe2\x39\x2f\xec\x92\xb9\x57\xce\x08\xf6\xb5\x34\x96\x25\x99\x04\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\x65\xb5\xa2\x99\x1a\x9a\xaa\x4a\x41\x6d\x2d\xac\x61\x90\x06\x5c\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\x30\x2d\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\x40\x44\xdd\xde\x44\x07\x56\xbd\xd1\x21\xef\xdd\x6f\xce\x51\x23\xc5\xbf\x56\x28\x20\x4b\x6f\xe5\x18\xc0\x02\x28\x71\xed\xf6\x80\x48\x84\x93\xaf\xfc\x96\x5d\xff\xc9\x37\xbd\xe5\xe5\x5c\xd8\x90\xcf\xd4\x35\x57\xbc\x99\x16\x12\xc3\xfd\xc6\x86\x48\x4d\x32\xa0\xce\xb9\x4e\xa1\xe4\xa7\xae\xab\x5a\x87\x27\x8c\x33\x24\x18\xb5\x75\x37\x78\xc5\x08\x53\x34\xc3\x43\x4d\xc1\x13\x61\xd8\xde\xe9\xf9\xd1\x88\x9d\x9f\x1e\x53\x1e\xa6\x9e\xad\xab\x63\x26\x1e\x86\x3b\xf0\x36\x64\xe3\x80\xd0\x16\x0d\x1f\xd5\x7e\xd2\xb3\xcf\x83\x7e\xf5\x56\x51\x7a\x69\x9b\x03\x80\xca\x15\xd0\xcd\x99\xa9\x40\x45\x22\x9f\x90\x0c\x85\x19\xb4\xf9\x44\x5d\x8e\xe8\x71\x87\xfc\x2f\xc2\x44\x88\x4a\x54\x75\xe1\x63\xdd\xc0\x60\x41\x5e\xaf\x94\x76\x40\x2a\x28\xe5\xbd\x74\xca\x77\xe9\x65\x21\x45\xaa\xd8\x4b\x61\x0c\x9f\x8b\xf3\x8e\xe1\xad\xdb\xfc\x00\x10\xe1\xaa\xd9\x01\x30\xa0\x0c\x0b\x7d\xc3\x27\x75\x4e\x70\x53\xf9\x66\x39\xce\x29\xec\xac\x9b\x52\x5a\x2b\x80\x95\x00\xd8\x1f\x2c\x76\x1b\x0b\x60\xb7\x95\x59\xfc\xd2\x0f\x52\xff\xd8\xa9\x12\x2a\xc5\x3c\xdf\xa9\x60\xd3\x52\x8a\x19\x9b\x49\x48\x1e\x86\x74\xde\x11\x62\x3f\x71\xf4\x3d\x19\x23\x4a\x98\x0f\x59\x50\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\xc2\xa6\x23\xa4\xdc\x43\xb1\xab\x9c\xb1\x39\xa4\x03\x93\x8d\xf2\xc7\x27\x7f\xf9\x33\x9b\x2e\x9d\x22\x05\x1b\xd2\x6a\xcb\xb3\xf0\x92\x99\x50\x73\x47\x2b\x14\x0a\xcd\x72\xcd\x40\x01\x68\x0b\x82\x13\x7f\xfa\xe5\xd5\xb4\xa9\xd9\x1d\xa4\xe2\xfa\x20\xa2\xdf\x38\xd3\xf3\x09\x3b\x0a\xd5\x91\x55\x91\x82\x9f\xbf\x3b\x54\xf7\x70\xdb\x4c\x67\x32\x59\xf6\xde\x68\x1e\x84\x8c\x2d\xf4\x0d\x5a\x98\x6b\x76\x4f\x5d\xf9\x55\xe8\xa2\xca\x30\xd4\xf1\x3c\x14\x3a\x57\x46\xac\x96\x23\xae\x3d\x17\xe0\x9c\xa7\x21\x5a\x7c\x94\xb2\xc0\xfd\x23\x35\x95\xb9\x90\xfb\x38\x60\x91\x01\x33\x79\xce\xb3\x6c\xca\x93\xab\x4b\xfd\x42\xcf\xcd\x2b\x75\x52\x96\xba\x6c\xce\x25\xe3\x4e\x46\x2f\x2a\x75\x85\xad\x20\x02\x5a\x83\x9e\x3b\x85\xbe\xa8\xac\x07\xf7\x5e\xf7\xc2\x58\xba\xef\x45\xbf\x37\xbe\xeb\x51\xc4\x3b\x59\x5b\xd8\x54\x35\x86\x3b\x32\x1e\xdf\xc4\x9b\xed\xcb\x27\x7f\xfc\x1a\xb7\x2e\xd3\x25\xfb\xfa\x09\x54\x0a\x98\x11\x1e\x62\x90\xa8\x4e\x3d\xc9\x79\x96\x39\x46\x1e\x6f\x4a\x47\xe8\x75\x9b\xf0\x93\xef\x41\xdb\x7f\xbb\xdd\x59\x81\xbf\xbc\xfc\x07\x48\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\xc4\x7d\xa0\x4a\xed\x01\xa8\xdd\xd7\x3a\xab\x72\x71\x2c\xae\xe5\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\xc8\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x94\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x1d\x66\xc9\x6f\x1a\xc4\x80\x33\x09\xc8\x09\x3d\xa1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x8e\x6f\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\xc6\x86\xa8\x07\xf4\xa7\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\xc3\xc6\x40\x05\xc0\x6d\x1f\x60\xc9\xdd\xdd\xfc\x03\xf8\xd4\xfb\x25\xba\x35\xe8\xa2\x42\x2c\x23\xe7\x96\x14\x42\x6f\xab\x70\x56\x88\xd2\x48\xe3\xe4\xf2\x0f\x70\xa0\x8e\x32\x2e\xf3\xc8\xf1\xbc\x19\x22\xe0\xe1\x06\x24\xe7\xfe\x9c\xd2\xd9\x29\x38\x20\xb0\x42\x44\xb1\x5e\xa3\xd6\x36\xb5\xda\x8b\x6a\x0a\xfb\x07\x6e\xbf\x4f\x43\xbd\x01\x25\xf1\xa6\x79\xec\x0f\xf5\x32\x34\x59\xac\xfb\x24\xf0\x58\xbc\xeb\x73\xe2\xac\xf0\x7e\x8f\x95\xb1\x86\xc9\x0f\xc4\x3f\x80\xa3\xd2\xe2\x36\x59\x68\xc3\xea\xc4\x13\x16\xd9\x02\x64\x40\x4e\x18\x26\x6d\xb8\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x5d\x91\x44\xa5\x2e\xf8\xbc\x57\x3f\xa2\x16\xa5\xda\xc3\xc6\x60\x19\xce\x7e\x8a\x58\x49\x41\x77\x39\x4e\xe2\xb1\x80\x00\xe9\x09\x83\xf9\x9e\xc0\x64\x59\x40\xbf\x38\x76\xc3\x97\x8c\x97\xba\x52\x29\xb9\x43\x83\x3f\xfa\x65\xeb\xc1\x67\x5a\x09\x1f\xe7\x69\x63\x6d\x40\x00\x4a\x2a\xf6\x74\xf2\xf4\xc9\xe7\x22\xe2\xe0\x0d\x5b\x22\xee\x2c\x88\x38\xe4\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x24\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x53\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x11\xf9\x16\x31\x28\x38\x6e\xeb\x5c\x63\xe6\x3d\x2c\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\x5b\x8b\x88\x76\xf2\xae\xe8\x81\x13\xda\x82\x7a\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x70\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\x90\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xbb\xbe\xf8\x59\x56\xc6\x43\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x02\xcf\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x6b\x99\x77\x49\x56\x19\x79\xbd\x29\x4e\x42\x80\x10\xc7\xb2\xd3\x3a\xb7\xc0\x29\x6a\x42\xad\xe0\x4c\xd4\x61\x82\x0f\xc0\x70\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\x39\xb1\x7b\x98\x49\x6e\xee\xab\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\xd3\x73\x8a\xa0\x79\xba\x49\xf5\x2f\x4c\xac\x09\x66\x09\x26\xca\xe0\x4f\xd0\xdd\x38\x63\x11\x28\x90\x4f\x28\x01\xe6\x0f\x48\x54\x60\x91\x28\xad\xc6\x8b\x08\xb4\xa9\xd0\xe9\x3d\x8b\xfc\xba\x1a\x1e\x9d\x4c\x8e\xf5\x14\x64\x0b\x9d\xa5\xbe\x87\x36\xfa\x72\xa6\xc2\xde\x08\xa1\xd8\xe9\x39\xd0\xcf\xbd\x22\x44\x84\x6e\xa1\x22\x86\x15\x00\x9e\x29\x32\x65\x1b\xf4\xbc\xef\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\x3e\xf3\xdf\x05\x9a\xf9\x8c\x6c\x3e\xd5\xd7\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x62\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xa3\x0a\x1b\xef\x13\x73\xb0\xd3\xf3\xa3\x1e\xdc\x6b\xf7\x0d\xc5\x45\xdc\x50\xbb\xbb\x86\xc9\x22\xa9\x63\xae\x13\x56\x87\x1b\xa3\x42\x09\xd4\x18\xef\x17\xeb\xea\xaa\x26\x46\x4c\xad\x27\x93\x66\x0a\x87\x71\x6c\x85\x8a\xa4\xc9\x9d\x03\x41\x87\x42\xa7\xd0\x7f\xa9\xa6\x86\xf1\xbf\x88\x09\xe2\x93\x25\x90\xc9\x53\xea\xc8\x28\x24\x21\xb7\x18\x13\xb8\xde\x7d\xfa\x61\xc4\xc5\x57\x88\xf9\xc9\x68\x79\x7e\x7a\x3c\xe4\x76\x29\x64\xfa\xe0\xb6\xcb\x1b\x73\xef\x62\xfb\xf7\xbf\x24\x20\xf7\x7d\xe8\x2d\x31\xd8\x44\x60\x7c\xf4\x37\xa4\xa9\x6b\xcb\xa8\xbb\x63\xc8\x84\x5d\x97\xd0\x01\x5c\xa4\xf9\xa4\x91\xfb\x7b\x56\x65\xb0\x49\xeb\xe4\xde\x90\x99\xcc\x43\x5e\x28\x68\x03\xfc\x9a\xcb\x0c\x71\x31\xf5\xed\x43\xfa\xf0\x7b\xa6\x79\x8a\xe5\x1e\x57\xa2\x54\x22\x63\xb9\x4e\xab\x0c\xbd\x79\xa1\x8b\xf0\xcb\x57\xc7\x6f\x5e\x9c\xf8\x24\x2c\x51\x2f\xe7\x88\x71\xa6\xc4\x0d\x8c\xae\x40\x21\x49\x08\x9e\x2b\x94\xfd\xb8\xf3\xe4\x11\x37\xd1\x0c\x45\xc7\x84\x7f\xa1\x5c\x5a\x39\x47\x18\xcd\x5a\x2d\x9c\x96\x82\x5f\xe9\xca\xb2\xeb\x2a\x53\xa2\xac\xbb\x60\x8a\x6b\xa1\xd0\x07\xeb\x7e\xe0\x1e\x1b\x23\x32\xca\xb2\x01\x84\x49\xf0\x68\x1e\xdc\x93\x27\xa4\xc9\x53\x89\x11\x7c\x19\xb5\x80\x6e\x34\x8a\x7c\x3f\x40\xa9\xd7\xbc\x22\x6c\x52\x2c\x27\x5e\x05\x26\xf5\x18\x92\x98\x46\x73\xe1\x33\x60\x28\xf1\xe5\xd3\x1d\x87\xfb\xbb\x5b\x9a\x15\xa2\x4d\x60\x15\x1a\xd0\xcb\xbe\x73\x9d\xde\x62\x35\xd4\x7a\x17\xdc\x1f\x37\xc6\xb6\x9a\x71\x86\xee\xf6\xb1\x07\xa6\x81\x4c\xd9\x2e\x6c\xf0\xde\x42\x13\x2c\x8f\xf3\x2a\xcb\x2e\x44\x52\x8a\xfb\x86\x19\x9a\x9c\xe2\xb4\x35\xd6\x6d\x16\x40\x64\xce\x02\x5a\x07\xdd\xac\x6a\x4c\xd8\x28\xcf\xa9\xae\xc5\x2d\xaa\x0c\x52\xc3\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xd3\x95\xc6\x67\x99\x21\xf7\x69\xac\x82\x11\xe1\x61\xa1\xc5\x1a\x37\x06\x33\x0f\xa4\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\xc0\x28\xa3\x84\x2d\x4e\x68\xe5\x78\x96\x73\x8f\x71\x7c\xdf\x1c\xe6\xfa\x4c\x1e\xe0\xbc\x7f\x87\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\xdb\xe6\x91\xd8\x2d\x80\xd2\xff\x0a\x0c\x83\xd7\x7e\x7d\x3d\x1b\x32\x4c\x28\x5d\xcd\x17\x40\xac\x32\xe7\x1e\x30\x33\x13\x16\xb0\x10\x29\x9f\x01\x93\xd8\xe8\xb7\x29\x59\x19\x31\x36\x64\x73\x6f\x3c\x12\xdb\xa5\xab\x83\xb7\x95\x8c\x1f\xb1\x19\xa2\x91\xbd\xf7\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x34\xbf\xb1\x93\x09\x63\xa4\x88\x39\x00\xc2\x1e\xfc\x0e\xad\xa3\xcb\x57\xc7\xaf\xa0\xb1\x38\x79\xdd\xbd\xa8\x72\xa2\xc0\x4c\x18\x2f\xe4\x0f\xa2\x34\x00\x9d\x7c\x25\x55\x3a\x62\x95\x4c\xbf\xf9\x84\x09\x5f\x52\xc9\x3a\x8b\xb5\x17\xd7\x7a\x41\x5c\x89\xaa\xe8\xe5\x7f\x70\x7b\x46\x12\x74\x2a\x32\xad\xe6\x11\x06\x00\x48\xf3\x53\x25\xed\x4a\x0f\x66\xc4\x33\x05\x0f\x8f\x2e\x53\xc8\x15\x96\xba\x6c\x84\x33\xdc\x78\x80\xf2\x18\x65\x1c\x3b\x96\x26\x1b\xe3\x41\x1a\x97\xa9\x75\x24\x4c\x04\xf2\xe5\xc2\x1e\x04\xdb\xa3\x47\xa2\x2c\x5e\x70\x95\xc2\x9f\x49\xa2\xcb\x94\xe6\x2b\x6d\x48\x6f\xc6\x64\x38\xcc\xc0\x02\x31\xe4\x38\x1a\x57\xed\x27\x83\x9a\x56\xe6\x8d\x54\x58\xaf\xb5\x57\x4a\xfe\xbb\x12\x8c\xe7\xda\x31\xe2\x76\xab\x87\x16\x45\x72\xbe\x04\x59\x08\x53\x7d\xe1\xcb\x35\xa8\xc6\xd6\x8c\xd8\x6b\xe1\x94\xae\x1a\x26\x60\xc4\x5e\x34\x71\x03\x46\x6e\x2e\x17\x58\xd0\x4c\x1f\xe1\xec\x4b\x61\x74\x55\x26\xe2\x35\xc6\x38\x73\x9f\x4f\xb7\xfa\x32\x6e\x55\x2c\xbf\x12\x0a\x7d\x4a\x8e\x34\x10\xc6\xad\x4a\x58\x83\x64\x21\xd2\x0a\xa4\xca\x74\xc9\x66\x12\xfb\xbf\x80\x68\x97\xf3\x85\x30\xd6\xdb\x46\x07\x90\xa3\x56\xb7\xd2\xf3\x13\x80\xed\x1b\x25\xb3\xd7\x5e\xd8\x9c\x03\x3a\x39\x1c\x59\x6e\x7d\xbd\x16\x6a\x83\xa6\xca\xfd\x59\x6e\x53\xda\x4c\xd8\x0b\xf7\x28\xdc\x4f\x51\x5f\x0d\xd9\x22\x2e\xc4\x98\xc9\x8d\xcc\x66\xdc\x2c\xa0\xeb\x4c\x7b\x09\xa8\x65\x45\x52\x95\x8e\x61\x20\x92\x3c\x4f\x53\xc7\x5d\x4b\x56\x62\x63\xf9\x75\x7e\xc7\x9e\xf5\x39\x6e\xb2\xe3\x48\xde\x3d\x16\x21\x76\x18\xea\x2d\x1c\xe1\x93\x16\x27\xc0\x95\x74\x02\xcb\x23\xae\x39\x85\x3b\x04\xfc\x1d\x57\xf8\x74\x22\xa9\x7b\x78\xbf\x53\x58\xbe\x8f\x04\xe4\xe5\xbc\xbf\xe3\x6e\xf7\xb0\x9c\x57\x78\xd0\x89\x0b\xd7\xb8\xf3\x93\x56\xde\x3d\x28\x53\xce\x56\x3d\x7a\x79\x1c\x17\xfa\xc5\x15\x4c\xbe\x4c\x72\xc2\x7e\xe8\x1b\x66\x69\xc7\x59\x1c\x43\xaf\x83\x37\x75\xd7\x18\xc7\x34\xb2\x6b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x24\x09\x6b\x9f\x89\x4a\x16\x5c\xcd\xc1\x4d\xa2\x2b\x37\xde\xef\x7f\x0f\x33\x2a\x45\x5a\x25\xd4\x72\xc7\xef\xda\xdf\xfb\xa0\x03\x01\xdd\x01\xbb\x32\x09\x2f\xfc\x9c\xe3\xd7\x32\x4b\x65\xf9\xbb\x67\x4c\x4e\xc4\x84\xed\xfc\x3e\xfa\x6a\x07\x9f\x5e\x94\xda\x3d\x82\x0a\x8c\x60\x56\x99\xb4\x90\xe8\xb3\x13\xdf\x3d\x61\x27\xee\x19\x10\x88\x0d\x04\x8c\x6a\x60\xa6\x35\xf9\x46\xac\x14\x73\x5e\xa6\x19\x39\x0c\x6f\xa2\xc2\xa9\x40\x30\xf1\x4e\x1a\x6b\xc8\x5b\xd0\x83\x39\x59\x6e\xae\x1c\x2b\x72\x87\x6b\x9c\x72\xcb\xc7\xd1\xa9\x3e\x40\x53\x6b\x4c\x58\xe0\x63\x4e\xbb\xab\xe6\x5a\x07\xbf\xa3\xfa\xe3\x31\x0f\x77\x49\xa7\x94\x03\x2a\x77\x77\x55\xe7\xb1\x79\x89\x7b\x40\xc2\x37\x0f\xf0\x49\xdd\x27\x02\x68\x00\x5d\x96\x6a\x95\x29\xf0\x51\x42\x3d\xbf\xe5\x48\x9f\x9c\x5d\xbe\xfe\xc7\xf9\xab\xd3\xb3\xcb\xed\xc9\xde\x9e\xec\xed\xc9\xee\x71\xb2\x85\xba\xee\x7d\xaa\xbd\xf5\xb4\x2e\x6f\xa1\x0d\xc6\x1a\x95\xe0\x7d\x46\xd9\xa1\x27\xea\xfa\x07\xee\x94\x69\xf2\x6b\x53\xd0\x75\x4d\x1a\x07\xdd\x80\xaa\xfb\xd1\xa3\x4f\x0f\xdd\x60\x72\xe7\x80\x49\x73\xb1\x63\x65\xdd\xaa\xc5\x3d\x42\x8f\x7e\x39\x3d\x3e\x39\xbb\x3c\x7d\x7e\x7a\xf2\x7a\xa3\xd9\x4e\x3d\xc1\x50\x9b\x72\xb9\xa3\x94\x2c\x4a\x71\x2d\x75\x65\xb2\x65\xc0\x53\x5f\xcf\x04\x56\x13\x66\x55\x0a\x1e\x0f\x0f\x19\xbf\xf6\x67\x5b\x61\x3b\xac\xb0\x6d\x26\x7f\xf5\xc0\xc1\x1a\x6a\xfb\x3e\x2f\x75\x3e\xd0\x16\xbe\x40\x5f\x8c\x0f\xb6\xad\xdb\x4f\xbb\x04\x99\xd3\x10\x3d\xa4\x3c\xd6\xf8\x3c\x4e\x1f\xcd\x0b\xdb\xa3\x59\xce\x20\xf0\xd7\xc3\x20\x45\x63\xc2\xd9\x4b\x5e\x7c\x2f\x96\xaf\x45\x4f\xb8\xad\x26\xbd\x45\x26\x12\x27\xe8\xd8\x95\x58\x62\x76\xf1\x91\x7f\x58\x1f\x58\xb0\x07\x89\x1e\x7e\x25\xfa\x20\xbb\x0f\x09\xfb\x7d\x25\x7a\x64\x4e\xfb\x6b\x05\x00\xdb\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xf2\xfb\x23\xc0\x9c\x7f\xbe\x71\x94\xe6\x35\xe0\x2a\xf8\xf0\xed\xc0\x2b\x81\x91\xf4\x65\x43\x76\x05\x26\xc2\xb0\xa6\x19\xf6\xa6\x0f\x3d\x90\x92\x31\x10\x69\xfa\x76\xdb\x64\xb8\x84\xc3\xf2\xd5\xdd\x9a\xb1\x62\xce\x45\x00\x74\x4c\x9f\x79\x0c\x10\x13\x5a\x64\x42\xd3\xe9\x51\xf3\x4f\x4a\x6b\xf9\x67\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xff\xfa\xfd\xc9\x3f\xfe\xb6\xbb\xfb\xf3\x3f\xe3\x6f\x41\x14\x62\x78\xbb\x79\x0b\x00\x9a\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x86\x50\xe8\x0b\xc0\x23\x98\x60\xea\x5d\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\x79\xf3\x41\x0a\x06\x58\xa2\x1e\xe5\x71\x78\x0d\x27\x1e\x6a\x5e\x32\xf0\x51\xa5\x51\x43\xa7\xa7\x64\x21\x72\xc4\xfe\x7b\xee\x49\x00\x6d\xbc\x3d\xf0\x89\x02\xb4\x08\xa7\x99\x36\x61\x58\x77\xae\x9f\xee\x3c\x28\x01\x13\x56\x70\x60\x82\x01\x45\x88\x5a\x78\x90\x83\x80\x0d\x69\x2e\xa1\xcd\xec\xe1\xf9\x29\xbb\x46\x0a\x3f\x18\xe2\xf8\xf0\xe6\xf3\x8f\xca\xe3\x42\x10\xb5\x5d\x95\xfe\x0c\xd3\xca\xfc\xf7\x84\x10\x62\x02\x54\xa4\x70\x86\xcd\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x19\xfe\x0c\x95\xc9\x63\x63\x75\xc9\xe7\x50\x18\x86\x3f\xc7\x9f\x85\xbf\xf0\x87\x8d\x07\xac\xfe\x1a\x4d\xe1\x3a\x96\x4a\x1c\xb9\x23\xd2\x4d\x7d\x3d\x40\xde\xe6\x49\xff\x40\x58\x5b\xd2\x17\xaf\xac\x79\x35\x37\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\x24\x55\xcc\x8f\xea\x2c\x36\xf0\x06\xa8\x6b\x67\x59\x76\x46\x9a\xac\xaf\x01\xb9\x59\x2a\xaf\xa5\xd1\x3d\xca\xdf\xc2\x40\xb7\x67\x3c\x12\x68\x0f\x66\x71\x05\xb7\xd9\xbb\x02\xc0\xf5\xc2\x79\x6d\xb1\xfd\xa7\x7d\xfa\xeb\xe1\x55\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xde\x53\x1f\x00\xeb\x1a\xaf\x21\x11\xaf\x9b\x23\x0e\xb2\xfd\x3e\x62\x9b\x17\xbc\xfc\xf6\x1a\xfa\xfc\xbf\xf6\x5c\x33\xca\xea\xf1\xe2\xfa\xc1\x1c\x70\x4c\x0b\xfd\x14\x9e\x1c\x7c\x52\xb3\x60\x2c\x98\x16\x9f\x9b\x9c\xfb\x2d\x38\x77\x42\x83\x56\x58\xd7\x5a\x13\x9d\x95\x3a\xf7\xb0\x14\x10\xde\xc0\x02\x4a\xba\xef\x4a\xf4\x6a\x19\x8e\xd7\xd6\x19\xb4\x75\x06\xdd\x72\x7d\xd0\x19\x84\x45\x04\x0f\xd7\x13\x24\xd4\x75\xd7\x10\xc6\xda\x08\xba\xb7\x75\x62\xf0\xc7\xbb\x05\xd4\x26\xfe\xa8\xd7\x9d\x8d\xeb\x64\x1a\x14\x68\xf9\xfa\x18\x26\x3b\xcc\x32\x26\x15\x1e\x7c\x18\x20\xd4\x62\x09\x34\x6d\x7c\x11\xf1\xb5\x9b\x42\xa8\xba\x6a\x80\x27\x43\x6e\xb1\x54\x73\x2a\x8c\x42\x51\x42\xd1\x27\xa9\x6a\xd8\xe9\xa0\x1c\xd6\xbd\x0a\xb8\x31\x3a\x81\xa6\x60\x58\x69\x15\x30\x29\x69\xda\x30\x1b\xcb\xaf\x20\xda\x98\x88\x54\xa8\x44\x50\x1f\x83\x46\x17\x67\xae\xd8\x89\xba\xf6\xbd\x1c\xd2\x0a\x93\x41\x90\xfd\xad\x1f\xe3\xf3\x4a\x40\x70\x1b\x91\x82\x60\x51\x1e\x02\x70\xfd\x60\x61\x73\x48\xc5\xd0\xb3\xda\xcb\xda\xad\xd1\x6b\x6f\x29\xde\x5f\x66\x86\xc8\x56\x2f\x65\x68\x45\x58\xd6\xee\xe7\xa6\x90\xfc\x1c\x82\x81\xfd\xc5\xe7\x6f\x4e\x74\x0e\x24\x36\x87\x11\x99\xf7\x88\x9d\x0c\x29\x26\x87\x08\x96\x14\xa5\x98\xc9\x77\x03\x9d\xd3\xc3\xa8\x9e\x50\xa6\x42\x59\x39\x93\xd8\xcb\xba\x28\x45\x21\x14\xb8\x5a\xa1\x44\xc3\xf1\x7e\x92\x94\x75\x70\xfa\x21\x26\xf3\xa0\xc2\x3d\x2c\x2b\xbb\x58\xa7\xec\x6f\xf9\x18\xdb\xf2\xb1\xce\xd7\x27\xe2\x63\xb4\x73\x1f\x0e\x13\x83\xcc\xf3\xfe\xd9\xef\x47\xcd\x54\x76\xd8\xc8\xfd\x4b\x88\x5b\x05\xfa\x81\x35\x5a\x8d\xc9\x6b\x58\xc7\x56\x32\xac\xd9\x47\xbd\x89\xe5\x5c\xf1\x39\xb6\xa2\xb0\x3a\x80\x57\xe9\x32\xb4\x13\x6b\xe7\xdd\x83\x1e\xef\x4b\xbc\xe0\xcb\x52\x67\x99\x28\x0d\xcb\xe4\x95\x60\xc7\xa2\xc8\xf4\x32\xa7\xdc\xd7\x94\x5d\x58\x6e\xdd\xae\xbe\x10\xb6\x5b\xd8\xb7\x1f\xaa\x8d\xaf\x42\x1f\x08\xfb\x1f\xcb\xda\xa1\x28\x9c\x15\x54\x41\xf9\x4a\x01\xd3\x38\x84\xce\x46\x23\x76\x26\xae\x45\x39\x62\xa7\xb3\x33\x6d\xcf\x51\xfb\x6e\x26\xdc\xe1\x8d\x4c\xce\xd8\x33\x67\xd7\x19\xcb\x2c\x76\x97\x89\x0a\xd4\x75\xd9\x18\xa0\xc6\x2d\x1c\xa2\x3e\x6f\xb5\xf6\x1c\x46\x0a\x95\xe7\x9d\x22\x19\xbd\x96\x29\xb4\xef\xea\xbd\x40\x87\x58\x4f\x5a\x43\x59\x47\xfb\x1b\x71\x15\x3c\x12\x1f\x58\x81\x52\xb1\x52\x98\x42\x2b\x23\x9a\x30\xa3\x61\x46\x68\xed\x0e\x8b\x61\xdc\x59\x78\xf6\x15\x9b\x85\x36\x16\x4a\x68\x87\x69\x0a\x77\xee\x87\x83\x8a\x64\x9e\x65\x22\x6d\x74\x05\xc4\x6e\x56\xbc\xe9\x21\x20\x34\x94\xd0\xdf\x06\x0b\x95\x1b\x35\xce\x8d\xfb\x43\x87\x49\xdf\xc3\xc9\xb7\x17\xbf\xad\xb2\xb9\x3e\x98\x20\x47\xa2\x0d\xb0\x02\x78\x0e\x30\xf8\x26\x6a\x04\xb5\xd0\xfa\x8a\x25\x3a\x2f\x32\x38\x3a\x3d\x4e\x56\xdd\x87\x2e\x6c\xa5\xb1\x1b\xdd\x1c\x44\x2d\xea\xe0\x83\x7e\x1d\xea\x7a\x29\x62\x43\xa8\x61\xe2\x9d\x48\x06\xeb\x61\x7b\xf2\x4e\x24\x51\x13\x66\x80\x64\x4b\x3c\x42\x84\x3b\xb1\xfd\x7b\xeb\xf7\x0e\x39\x0c\xe5\xe6\xef\x51\x4b\x17\x5f\x2d\x14\x4b\x18\xd3\xa3\xfd\xd3\x23\xa0\x71\x0a\xd8\x42\x58\x5f\x17\xc3\x68\x84\xcd\x88\x47\x6f\x05\xfa\x32\x24\x52\xfb\xb1\xa0\x45\x9a\xd6\x96\xed\xed\x1e\xec\xee\xaf\xf8\x1f\x5b\x90\xf1\x97\xd1\x2f\x25\x40\x9d\x16\x80\x1b\x2a\x92\xdd\x74\xc4\xa4\xf5\x99\xd6\x08\xf7\x04\xb3\xa2\xa2\xbf\x11\x33\x9a\xd9\x92\xa7\x92\xd4\x18\xf8\xd4\xdd\x64\xcb\x8a\xb8\xfc\xde\xee\xaf\xbb\xd4\xda\xeb\x46\xab\x5d\x0b\xd3\x9f\xb0\x4b\xc4\x89\x09\x03\x2d\x75\x05\xb8\x50\x48\x82\x22\x93\x89\xb4\xd9\x12\x38\x16\xd3\x15\x62\x52\x39\x79\x41\xc5\x86\x27\xef\xa4\xf5\xcd\x75\xf4\x8c\x3d\xc1\xee\x7a\x88\xe1\xc4\x0d\x74\x58\x3f\x58\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x20\xd5\xb1\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x4c\xf4\xdb\xee\x5d\xdb\xd9\x0a\x7a\xdd\xe5\xe5\xf9\xb7\x8d\xbe\xed\xc0\xc5\xad\x2d\x7c\xea\x0e\x78\x03\x44\x39\xd3\x65\xfe\x00\x78\xc7\x30\xc1\xca\x5e\x0d\xdc\xd9\x80\x2c\xac\x6f\x23\x77\xb6\x1e\x8d\xf0\xee\x1d\xdc\xd9\x3f\x74\x05\x60\x20\x7c\x9a\x2d\x03\x12\x83\x11\x96\xed\xb8\xa1\x76\x1c\x7b\x72\xbb\xe1\x3b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xac\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\x4b\x2f\xe9\x64\x4c\xe0\xf4\xf8\xba\xa6\x52\x14\xc8\xe1\xe8\x37\x9f\x1d\xff\x5a\xe1\x1b\x48\xf7\x46\x13\x8f\x24\x26\x5b\xdc\x23\x4a\x2a\x24\x16\xe2\xce\x0c\xc4\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\xa5\x3d\x83\xde\x97\x81\x88\x38\x68\xb4\x9e\xf5\x2f\x15\x8d\xaf\xf7\x13\x60\x98\xc5\x67\x43\x52\xa0\x18\x20\xb5\x7b\x35\xb1\x1b\x61\xa4\xa0\xf4\x12\x99\x2b\xb0\x09\x04\xbe\x7c\x30\x52\xc6\x69\x0b\x83\xbe\x3a\x3a\xca\x4b\xa6\x42\x57\x78\x8f\xf2\xbb\x4a\x90\x28\x33\x81\x9a\xc8\x7b\x77\xae\x17\x47\x5c\xcd\x05\x7b\xea\x7e\xf9\xe7\x3f\xfd\xe9\xab\x3f\x4d\x70\xf8\x90\xa5\xa0\xd8\xe9\xe1\xd9\xe1\x2f\x17\x3f\x1c\x41\x71\x6c\x5f\xaa\x0e\x94\x82\x39\x74\x02\xe6\xa0\xe9\x97\x1f\x35\xf9\x12\x4a\x3e\x7a\x73\x91\xa6\xef\x1f\x86\x8c\xf1\x3d\x49\xf7\x8b\x70\xf6\x10\x83\x36\x76\xa4\xba\xa3\xf6\x20\xce\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\x4b\x0d\x20\x1f\xa7\x06\xd3\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x04\xe8\x60\xc4\xfe\x2b\x05\xb5\x71\xc3\x84\x3f\x04\x39\xf3\x6d\xb2\x91\x97\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x79\x34\x33\x2e\x33\xf0\xa0\x52\x87\x6a\xcc\x08\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x68\xdf\xd7\x0e\xeb\x9b\x97\xf8\x80\x45\x1d\x89\xb8\xb2\xd1\xcc\x7e\x2b\xea\x06\x18\xef\xe1\x8a\xba\xa2\x14\x17\x56\x77\xea\x88\xc1\x56\xa3\x24\x38\xd8\x2d\x31\x92\xa9\x98\x69\xc7\x84\x6f\x0d\x7a\xa4\x15\x1c\x42\xae\xa0\x38\xd0\x7b\xb5\x74\x23\xb0\x81\x19\x99\x01\xbf\x9e\x80\x53\x0f\x4c\x8c\x96\xea\x7b\x81\x8f\xdc\xdb\x89\x1c\x66\x37\xaa\xab\x1c\xa8\x13\x39\x7c\x28\x6c\x82\x9e\xdb\x88\x91\x03\x72\x28\x4d\xbf\x1d\x46\x49\x4a\x6e\x16\xd8\xa5\x5b\xbc\x93\x96\x70\x59\xcf\x75\xda\xee\xad\x3f\x2f\x79\x22\x58\x21\x4a\xa9\x9d\x30\xaa\x94\x4d\xf5\x8d\x62\x53\x31\x97\xca\x78\x52\x00\x78\x3a\xd1\x0c\xe2\x31\xd2\x04\x60\xb8\x09\x7b\xdd\x00\x3b\xa1\x32\xa4\x44\xd7\x47\x93\xe6\xdc\x8e\x24\x81\xc4\x02\x3a\x21\xe0\x7d\xa0\x70\xdc\xcd\xeb\x43\x53\xde\xab\x14\x3c\x39\x15\x19\x5f\x62\xb6\x29\x74\xf0\x97\xff\x11\xa5\xd9\x1f\x20\xe2\x84\xfd\xe8\xfc\x77\xb7\xce\x43\x1a\x56\x0a\x9e\x2c\xfa\x05\x7f\xb7\x21\xaa\x3b\x5e\xdb\x10\x55\x9f\x41\xb6\x21\xaa\x6d\x88\xea\x03\xd7\x36\x44\xb5\x0d\x51\xb5\xae\x07\x6b\x25\x6d\x43\x54\x9d\xaf\x6d\x88\xea\xfd\xd7\x36\x44\x75\x87\x6b\x1b\xa2\xba\xe3\xb5\x0d\x51\x6d\x43\x54\xdb\x10\xd5\x36\x44\xf5\x1b\xf2\xdb\xf9\x6b\x1b\xa2\x5a\x19\x64\x1b\xa2\xda\x86\xa8\xee\x7c\x3d\x58\xe3\x6b\x1b\xa2\xc2\x6b\x1b\xa2\x6a\x5e\xbf\x2d\x51\xe7\x03\x3c\xe7\xce\xd4\xeb\x5f\xd3\x76\x0e\x41\x05\x99\x50\x9c\x48\xcf\x1a\x75\x50\xf8\xa8\x49\xdd\xa3\x22\x82\x05\xf1\xa5\x38\x14\x11\xaa\xe3\x4c\x6b\xeb\xa5\x7a\xf6\x91\x2b\x74\x5a\x07\x2a\xa2\x08\x05\x1a\xbc\xdd\x6b\xd6\x36\x56\x8d\xd5\x27\x2c\xf1\x69\x42\x12\x0f\x24\x7e\x33\x40\x18\x62\x1b\x82\xf8\xec\x42\x10\xc3\xb8\xef\x06\x70\xdd\xf5\x16\x15\x14\x99\xbf\x5c\x94\xc2\x2c\x74\xd6\x79\xa3\x37\x36\xf9\x4b\xa9\x64\x5e\xe5\xd0\x29\xd6\xed\x67\x79\x1d\x52\x00\x4c\xdd\x8a\x1e\x38\x36\x7a\x11\xa3\x96\xb2\xbe\x95\x2c\xd4\x6f\x52\x6b\x78\x53\x25\x89\x10\xd0\x4a\x2d\xb6\x70\xbe\x9a\x84\x27\x85\xd6\x19\x4f\xfb\xf1\x9b\x7e\x42\x1c\xe1\x48\x61\x94\xaf\xbe\xec\x34\xc6\xbc\x2c\x86\xe1\xcb\xdf\xbe\x3e\x3f\x8a\xf8\x32\x57\x9e\x2d\x4b\x75\xad\x33\xa0\x2a\xc7\x9b\x9c\xb2\x46\x0d\xf6\xa5\x33\x98\xa6\xc2\xf2\xc8\xb6\x21\xb3\xc0\x60\x13\x7d\xf7\x3b\xf7\xab\x20\x91\xcf\x51\xee\x62\xff\x7c\x36\xe7\x76\x93\x0c\xbf\xbf\x09\xd3\xcb\x7c\x19\x42\xde\xf4\xd5\xd0\x9b\x3e\x38\xa7\x87\x37\xbd\x50\x73\xd8\x17\x88\xa0\x7f\x67\x3d\xbc\x37\xa7\xec\xaf\x1b\xf7\x3f\x5a\x0c\x20\x6e\xe0\xc5\x07\x23\xf0\xce\x05\xb5\x8e\x22\x71\x1e\x1b\x41\xbe\xab\x94\xd5\xac\xc8\x78\xdd\x17\x0a\x56\xe0\x3b\x90\x41\x47\x0b\x91\x5c\xbd\xa6\x48\xec\x9e\x11\x22\xe8\xa6\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\xb1\x04\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x5d\x25\x11\x37\x4e\xdc\x28\x52\xcd\x27\x79\xba\x3f\x61\x6f\x15\x56\xb7\xd7\x7d\x28\x23\x6c\x07\xf7\x7c\x8f\xb3\x31\x15\x8e\xbb\x6a\xf0\x43\x44\x10\x76\x6e\x7a\x93\x3e\x40\xc9\xbd\x45\x52\xcf\x28\xf8\xa7\x8f\x80\x6f\x39\x17\x1b\xc0\xe1\xf2\xd8\x22\xdd\x83\x65\x7c\x0c\x10\xe1\x7e\x40\xd1\xed\x07\xa3\x1a\x3f\x94\x88\xf6\x03\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x47\x00\x65\xfe\x38\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x45\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x74\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xb1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xd1\x22\xd0\xfd\xa3\xcf\x0f\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x2c\x32\xbe\xbc\x10\x89\x56\x69\x67\x09\xd3\x42\xe9\x0c\xe7\xc7\xe0\xb0\xe4\xa7\x6a\x16\x5a\x2c\x38\x81\x91\x3b\x8b\x0a\x0b\x4b\x7c\x2c\x83\x14\x0a\x88\x2a\xe3\x2c\x1f\x64\x74\x82\x3d\x18\x87\x18\x56\x9d\x0c\xb9\x88\xdf\xe9\x1b\xa6\x67\x56\x28\xb6\x27\x95\x5f\xc7\xfd\xc8\x0c\xac\xbd\x93\x61\x5b\xbb\x6f\x9f\x3e\xf1\x37\x7f\x7e\x6e\x47\x70\xb0\x1a\xf3\xf1\xbd\xc0\xf4\xa0\x0f\xbb\x81\xe9\xc6\x59\x95\x35\x5d\xc1\xe8\x1e\x6e\xf2\x9b\xa7\x35\x9c\xf2\x53\x18\x37\x9c\x36\xae\x52\x46\x95\x68\x9f\xdf\xa2\xf5\xce\xab\x69\xaa\x7e\x21\x8f\xe6\x43\x5e\xe3\xcb\xa3\x73\x74\x1a\x6f\xdd\x25\x0f\xc5\x5d\xb2\xa1\xdc\x94\x07\xa8\xe8\x3e\xd2\x7c\x94\xad\xa2\x7b\x8f\x2b\xaa\x4d\xfd\xb6\xe4\x89\x38\x1f\x5c\x47\xf0\xc7\x89\xa5\x55\xc9\x89\x01\x06\x95\xcf\x1f\x1e\x25\x44\x8a\xa7\x29\xd4\xf3\x42\xa5\xec\xac\xca\xb2\x25\xab\x0a\xad\x9a\xd5\xcf\x18\x6b\x6f\x17\xd3\x82\x4b\x7e\xcd\x53\x6a\xc5\xb2\x28\x35\xc9\xcc\xb2\x52\xca\xf1\xe0\xba\x27\x1a\x28\x92\x00\xd3\xcc\x1b\x25\xbb\x46\xce\xdd\xf4\x9d\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\x95\xcc\x32\x1a\x66\xc2\x2e\x84\xc5\x90\x02\xca\xce\x4c\xab\x39\x4c\x8e\x2b\xdf\x78\x51\x24\xee\xb7\x49\x26\xb8\xaa\x0a\x7c\x9e\x93\xc4\x4b\x5d\x95\xfe\x79\x93\x10\x98\x08\x12\x58\xc9\x6c\x14\xb5\x77\x7b\xef\xc2\x86\xdc\x9f\xca\x38\x05\xe0\x95\x87\xa5\x1e\xc5\x63\x7a\xe4\x70\x13\x35\xf7\x29\x4a\x7d\x2d\x53\x8c\x6e\x78\xb2\x41\x23\x69\x6c\xe0\x13\xce\xb3\xd2\x6a\xac\xc4\x9c\x83\xa2\x42\xa7\x08\xd7\x0c\xc7\xc1\x0c\x02\x95\x42\x4b\x1f\xa7\xe1\xeb\xa2\x51\x4e\x7f\x2d\xb1\x19\x71\x44\x39\xb6\xa7\x34\xd3\x90\x8f\x5a\x29\x69\xb1\xc1\xfd\xa2\xb2\x2c\xd5\x37\x6a\xff\x5e\x51\x57\x08\xb4\x5e\xae\x25\x50\x33\xfc\xba\x4e\xcf\xc1\xf7\x7d\x3f\x79\xa5\x21\xd7\xe7\x8c\x55\xca\x88\x9e\xe2\x7d\x30\xe5\xe8\xcf\x7f\xec\xc6\x23\x64\x2e\x74\x65\x3f\x89\xf5\x77\xb3\x90\xc9\x22\x56\x66\x65\x2e\x0c\xd3\x55\xcb\x2c\x7e\x4a\x3f\x5b\xbf\x42\x5b\x13\x70\xdd\xd5\xd5\xb1\xbb\xc6\xfb\xd5\x86\x43\xa8\x3b\x5f\x43\x9e\xf8\xf1\xd9\xc5\x2f\x2f\x0e\xff\x7e\xf2\x62\xc2\x4e\x78\xb2\x88\x31\x31\x14\xe3\xc0\x34\x80\x51\x2c\xf8\xb5\x60\x9c\x55\x4a\xfe\xbb\xa2\x80\xef\x5e\xf8\xed\xfe\xa0\x58\xed\x1d\xa5\x2f\x74\xe7\x1f\xac\x1d\x1c\xf6\xfa\xc7\xbc\x2c\x6d\x04\x34\x70\x59\x51\x9f\x42\x94\x79\x89\x26\x02\x28\x5c\x90\x3e\x7f\xfc\xea\xe4\x02\xd2\xf2\x8b\x12\x91\x42\x20\x8f\x0b\xbe\x87\x91\xa6\xc2\xfd\x82\x3a\xf7\x4e\xd8\xa1\x5a\xe2\x97\x78\xa6\xa4\x61\x99\x34\x56\x80\xd4\x23\xb5\xcd\xc7\xaf\x77\x9e\x4c\xe0\x7f\x3b\x8c\xa7\x69\xe9\xf4\xba\x90\x9e\x96\xac\xe4\x8b\xa2\xe6\x27\xa7\x59\xf4\x02\x4a\x58\xcc\x46\x7b\xa9\x53\x9a\x39\x48\x12\x88\x5d\xa1\x18\x34\xb6\xe4\x56\xcc\x65\xc2\x72\x51\xce\x05\x2b\xb8\x4d\x16\x2c\xe7\x4b\x96\xe8\xb2\xac\x0a\xc4\xf9\x4f\xb9\xe5\x13\xf6\x5c\x97\x2c\xf7\x87\xd8\xed\x79\x27\x87\x2f\xd6\xc7\xf4\xeb\x93\x1d\xff\x53\x1a\x53\x09\x73\xf0\xf4\xc9\xd7\x5f\xfe\xe9\x4f\x9f\x55\x6b\xb8\x3a\x5d\xc8\xad\x6d\xd4\x1a\x8e\xfb\x55\xc0\x55\xc7\x56\x81\x52\xcd\xb3\x78\x7f\x75\x13\x00\x7d\xad\xcc\xbe\x36\xe6\xb8\x7e\x83\xf3\xae\xa6\xe6\x20\x2d\xea\xea\x39\x0c\xd4\xd8\xa9\x96\x83\xde\xb0\x22\xde\xa0\xe3\x5e\xbd\xa7\xe7\xfe\x60\x92\x9e\x93\xb7\x1a\xbc\x16\x75\x76\xd2\x88\x3d\x61\x7f\x65\xef\xd8\x5f\xc1\xd0\xfa\x73\xdf\x36\x58\x7d\x4d\xa0\x21\x92\x8d\x9c\x7d\x7f\x7a\x3e\x10\xc5\x7f\x74\x4c\xd3\x8d\xe8\xa8\x6a\x35\x9b\x4a\x52\xec\xc5\x3b\x2b\x4a\xa7\x68\xd2\x4a\x6c\xb4\x81\x98\x9b\xe0\x27\xdc\x66\x18\x78\x38\x9d\x35\x13\x9c\xee\xb7\xd1\xdc\xcf\xbf\xd3\xc6\x9e\x11\x17\x6a\xb6\xc2\xa9\x47\xcb\x81\xf1\x37\xd8\x98\x93\x1b\xc6\xd6\x07\xcc\xb0\x54\x43\xbe\x15\x26\x32\x2f\x64\x8f\x34\x8a\x87\xb3\x8d\xfb\x45\xd6\x1b\xeb\xf9\xbe\x95\x6a\xb9\x52\xc0\x06\x22\x15\x2b\xc2\xc8\x2a\x74\x4a\xda\x99\x9b\x56\x1a\xc9\x8c\xf7\xa8\x67\xe4\xb5\x09\xfe\x66\xd8\x4b\xee\x3c\x25\x5c\x61\x29\xc9\x4c\x94\x25\xe6\x9e\x4f\x97\x3e\x6d\xaf\xf7\xe2\xf5\x3a\x49\x45\xa9\xad\x4e\x74\x8f\x1e\x67\xcd\x68\x37\x0d\x07\x44\xc0\x7c\x5f\xef\x30\x7f\x73\x7c\x3e\x62\x97\x47\xe7\xd0\xf7\xe9\xe2\xe8\xf2\xbc\x69\xb3\xec\x5c\x1e\x9d\xef\x6c\x94\x14\xcc\x2b\x7c\xe0\xa2\xee\x30\x48\xc3\x05\xe5\xb4\xc9\x71\xce\x8b\xf1\x95\x58\x76\x94\xa9\x43\xc8\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\xd5\x73\xf9\x84\xd8\xf0\xcc\xf5\x85\x5d\xb9\xbe\x16\x29\x6a\xe9\xfe\x17\x42\xa5\x85\x96\x4e\x5f\xdc\x56\x7b\xdd\xff\xd7\xdb\x6a\xaf\x3b\x5f\xdb\x6a\xaf\x6d\xb5\xd7\xea\xf5\x60\x52\x5a\xb7\xd5\x5e\x9f\x57\x04\x7f\x5b\xed\xf5\x1b\x4f\x02\xd8\x56\x7b\xad\xbf\xb6\xd5\x5e\xdb\x6a\xaf\xbb\x5d\xdb\x6a\xaf\xfb\x5f\x0f\x2e\x7d\x69\x5b\xed\x75\xaf\x6b\x5b\xed\xb5\x7a\x6d\xab\xbd\x6e\xb9\xb6\xd5\x5e\xb7\x5c\xdb\x6a\xaf\x6d\xb5\xd7\xb6\xda\x6b\x9b\x04\xfb\xc1\xb1\x1e\x66\x12\x2c\xdb\x56\x7b\xd1\xb5\xad\xf6\xfa\x2c\x52\xfd\xd8\xb6\xda\xeb\x4e\xd7\xb6\xda\x6b\x5b\xed\xd5\xe5\xda\x56\x7b\x7d\x2e\xee\x92\x6d\xb5\xd7\xb6\xda\xeb\xb7\xa3\xe8\x6e\xab\xbd\xb6\xd5\x5e\xdb\x6a\xaf\x6d\xb5\xd7\x7b\x67\xb1\xad\xf6\xfa\x1c\x4c\x40\xdf\x11\xb8\x7f\xf5\xd2\xee\x91\xce\x8b\xca\x0a\xf6\xda\x0f\x19\xb4\x48\x64\x0c\xd2\xc4\x1a\x41\xff\x14\xc2\x44\xab\x99\x9c\x13\x67\x3f\xc0\x36\xbc\xe3\xf0\x3e\xe3\xa8\xf5\xed\x23\xcc\x1f\xcc\x64\x2e\xbb\x95\x94\xb1\x95\x85\x79\x01\x63\x45\x71\x19\x77\x92\x72\xfe\x0e\x8e\x08\xcf\x75\x85\xad\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\x3d\xb8\x95\x61\xc3\x98\x38\x3c\xf5\x79\x75\xe7\x43\xa4\x95\x70\x6b\x45\xa9\x9e\xb1\xff\xde\x7b\xfb\xc5\xaf\xe3\xfd\x6f\xf6\xf6\x7e\x7a\x32\xfe\xcb\xcf\x5f\xec\xbd\x9d\xc0\x3f\xfe\xb0\xff\xcd\xfe\xaf\xfe\x8f\x2f\xf6\xf7\xf7\xf6\x7e\xfa\xfe\xe5\xb7\x97\xe7\x27\x3f\xcb\xfd\x5f\x7f\x52\x55\x7e\x85\x7f\xfd\xba\xf7\x93\x38\xf9\xf9\x8e\x83\xec\xef\x7f\xf3\xfb\xce\x53\xee\xad\x12\x0f\xa7\x10\x0f\xa4\x0e\x7f\x14\x65\x98\x02\xba\x03\x9d\x45\x4a\x46\x59\x39\x8d\x24\xb0\xde\x77\x1a\x3d\x37\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\xc4\x07\x20\xa1\x9b\x5b\x6c\xb4\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x44\x2f\xf3\x22\x83\x06\xe7\x70\x9e\xc7\x3e\x97\x05\x84\xeb\x96\x37\x7c\xf8\xda\xf2\x86\xcf\x91\x37\x18\x91\x54\xa5\xb4\xcb\x23\xad\xac\x78\xd7\xc9\xc3\xd2\x64\x0d\x17\xcd\x01\x29\x67\xcc\x50\xae\x1b\x7e\xc7\x74\x81\x79\xdf\xad\xc2\xfa\x85\xae\xb2\x14\x8a\x39\x2a\x05\x06\x26\x56\xe9\x09\x8b\xd6\x1f\xd8\x3d\x90\xca\xdd\x7e\x88\xb7\xe7\xd0\xcc\xfc\x77\x25\xaf\x79\xe6\xac\xdd\xfa\x17\xe7\x60\xc1\xc4\x3f\xba\xeb\x99\xb7\xdc\x5c\xd5\x07\x5e\x8c\x9d\x0e\x1d\xe6\x7c\xe0\x5f\x09\x3e\x12\xef\xec\x63\xd4\xd2\x40\x41\x3a\x2f\xe5\xb5\xcc\xc4\x5c\x9c\x98\x84\x67\xc0\xd7\x86\x91\x15\x87\xb7\x8c\x0e\x0b\x5f\xea\xcc\xb0\x9b\x85\x70\xbc\x9a\x71\xef\x02\x80\x0a\xbb\x39\x97\x0a\xeb\xe2\x0b\xff\x63\x83\xbe\x04\xc7\xfe\x0b\x5e\xba\x05\x0e\x3e\x03\x30\x91\xa7\x5a\x67\x54\xf1\x90\x2d\xeb\xf1\xa9\xf6\x47\xe9\x5f\x94\xb8\xf9\xc5\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x27\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x40\x98\x67\xec\xe9\x3e\x6c\x67\x6e\x58\x18\x23\x65\x5f\xee\x43\xf8\xef\xe8\xf0\xfc\x97\x8b\x7f\x5c\xfc\x72\x78\xfc\xf2\xf4\x8c\x9d\x69\x2b\x50\xa8\x45\x6d\x02\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\x8d\x54\xa9\xbe\x31\x9d\x7d\xb4\xb8\xfd\x1c\xf1\x04\x57\x9d\xc6\x48\x78\xc1\xa1\xfb\x61\x0f\x09\xb3\x92\x61\x12\x0f\x0a\x32\x3c\x4d\x0f\xd2\x52\x17\x48\x04\xef\xe4\xaa\x45\x6d\xd3\x8c\x8e\x73\x58\x61\x7d\x67\xcd\x01\xe7\x25\x57\xb6\xf6\xf6\xd4\x6b\x46\x6d\x17\x27\xbd\x97\xe3\x71\x57\x34\xf1\x74\xb8\x6a\xa6\xc3\x34\x15\x69\x83\xfc\x9f\x5d\xe6\xe0\x91\x7f\xb9\x65\x8d\x52\xc1\xce\x5f\x5d\x9c\xfe\xef\xd6\x3e\x5e\x16\xfd\x12\xa5\x86\xa9\x8c\x2d\x75\x31\xd8\xea\xbe\xa6\xca\xcb\xed\xfa\x3e\x88\xf5\x0d\xd2\x72\x98\xf0\xfc\xeb\x4a\x35\x21\x8d\xea\xf1\x59\xae\x53\x31\x61\xe7\x21\x4e\xd0\xfc\x36\x02\x38\xe0\xa5\x60\xee\x16\x65\x25\xcf\xb2\x65\xac\xa2\x59\x8d\x55\x88\x0d\x6c\x86\x98\x91\xcf\x78\x66\x36\xcd\x8d\xfb\xc8\x46\xa7\x47\xbc\x74\xf6\xf0\x20\xcb\x11\x46\x63\xa9\x50\xda\x92\x62\xed\x66\x09\x78\x17\xa5\x4e\x18\x1a\xdf\x51\x32\x56\x43\xbe\x19\x8c\x55\x78\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\x77\x24\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x87\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x19\xed\x20\x3b\xe0\x47\xd2\x96\x9b\xae\x68\x50\x27\x39\x3c\x77\x0c\xab\x01\x87\x2a\xae\xe0\x3d\xae\x57\xfc\xb1\x1f\xa9\xb2\x52\x87\xe6\xdb\x52\x57\x9d\x85\xd8\x8a\xb2\xf9\xed\xe9\x31\xb0\xa2\x8a\x42\x95\xca\x96\x4b\x80\x0e\x58\xc5\x7f\x0b\x86\xc1\x1b\x0a\xb6\xc6\x67\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\x3b\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x90\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\x6c\x9d\x33\xad\xdc\xc1\x1c\x64\xf3\x9c\x86\x48\x2f\x91\x34\xde\x2a\x10\x33\x26\xeb\x8f\x43\xe4\x18\x8e\x65\x65\x44\x89\x61\xee\xb2\x12\xb8\x92\xdf\x57\x53\x91\x39\xca\x3b\x93\x94\x7a\xc6\xa3\x3b\x43\xe6\x7c\x2e\x18\xb7\x61\xa7\x59\xcd\x84\x32\x8e\x63\xa2\x03\xd4\xb2\x54\x8b\xba\xfa\x9e\x1b\xf6\xe6\xf4\x98\x3d\x61\x7b\xee\x59\xfb\xb0\x7f\xa0\xa5\xbc\xd5\x98\xe4\xd6\xb6\x51\x67\x7e\x08\x98\x12\x6c\x5e\xa6\x4b\x64\x12\x23\xa6\x34\x33\x55\xb2\x88\xfb\xd8\x7b\xb3\x99\x12\x21\x21\xb4\xf2\x30\xf7\xfa\x66\x39\xd4\x1b\x23\xca\xc1\x18\xd4\x9b\x0e\x0c\x2a\x56\xa3\xdc\x9e\x6b\x52\x0f\x37\x56\x2e\x2c\x4f\xb9\xe5\xc4\xb8\xfc\x0d\x0f\x76\x49\x7f\xdb\xec\xcb\x88\x17\x52\x55\xef\x30\xf1\x68\x38\x57\xcb\xc5\x09\x0c\xcb\x12\x4f\x75\x58\x75\x5e\x14\x99\x44\xb4\x8d\x56\x22\xdc\x69\x63\xaf\x8c\x6e\x51\x13\x81\x4f\xf0\x2c\xd3\x8e\x3f\x3a\xe5\x84\xab\x54\xe7\x2b\x0f\x73\x4a\xa4\x68\x20\xa7\x4e\xd8\x76\xf7\x35\xaf\x07\xe2\x14\xca\xc4\xb5\xe8\x81\x2d\xd6\x46\x8a\x75\xa3\x39\xe2\xf8\x1d\x01\xc3\xb3\x8c\x4f\x45\x86\x34\xc6\x1d\x68\x56\x77\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x5a\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x8f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x03\x1d\xaa\x1e\xa2\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\x40\x78\x3f\x74\x3a\x18\x91\x24\x3a\x2f\xce\x4b\xed\xcc\xce\xc1\x64\x13\x0d\x5b\xc7\x0c\xd1\xb1\xb1\x26\x19\x0b\x64\x41\xf3\x66\x5e\x46\x89\x9d\xdc\xa2\x90\xf0\xd9\x9d\xff\x23\x92\x59\xc0\x7a\xda\x82\xcc\x8f\xd2\x08\x2f\xba\x5f\xd2\x17\x8f\x59\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\x88\x34\xd2\x09\xcf\x00\x3b\xb6\xdf\x96\x63\xed\x6d\xd7\x1e\x38\x4a\xe7\x85\x18\x25\x7c\xe6\x13\x48\x00\x46\x14\x3e\x21\x17\xa6\xd2\xa9\x88\x62\xd9\x98\x87\x7c\x89\x69\x9f\x70\x9f\xcf\x24\x76\x7a\x85\x0f\x2b\xa7\x8d\x5f\x5b\x4d\x08\x68\x2f\x03\x22\xad\x9b\xa0\x50\xa9\x54\x73\xf0\xab\x8d\x58\x29\x32\xcc\x41\x26\x26\x70\x85\x16\xe4\x2e\x1c\x09\x3f\xa8\x3f\x0f\xfe\xd1\xa0\x8b\x49\xad\x68\x64\xf0\x14\x79\x0d\x6b\x86\xec\x56\x1a\xb6\xf3\xc2\x13\xa0\x07\x84\xe7\x43\x94\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x25\x55\x4a\xe9\xba\x0d\x62\x05\x0c\x78\xd4\x83\x21\x11\x5c\xa6\x31\x6f\x79\xc6\xde\x2a\x16\x88\xc5\xc6\x9d\xb7\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\xba\x87\xb8\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xb7\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x80\xf8\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x21\x4a\xd9\x0a\x1c\xde\xcb\x8b\xc3\xe6\xd0\x20\xac\xa1\x21\x85\x5b\x2b\xf7\x3d\xe3\x69\x2e\x8d\x01\x47\x98\x98\x2e\xb4\xbe\x62\x7b\xef\xed\xd4\x30\x36\x72\x6e\x0e\x68\xcf\x8f\xdd\xec\xf7\x99\x54\x59\xc8\x8a\x02\x3b\x58\x59\xe3\x1d\x39\xf0\x90\x24\xcc\x02\xd6\x90\x70\xab\x29\x59\x61\x75\x9a\x88\x54\xed\x76\xc1\xc6\x19\xf6\xea\xf2\x9c\xf5\x84\x5d\xf9\xc0\x12\x9d\xd1\xde\x6e\x23\xab\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x01\x3a\x7d\x57\x8f\xc9\x52\x81\x55\x3c\x02\xb2\x9f\xf8\xad\x49\x76\xe0\x97\xde\x85\x62\x50\xfa\xe9\x6e\xac\x51\x5f\xd6\xcc\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x1d\x47\x03\x16\xe8\x55\x88\x85\x56\x9a\x8a\x24\x9c\x10\xd5\x0a\xb6\x34\xb0\x28\x8c\xe6\xc1\x9a\x10\x8b\x8e\xa6\x7a\x54\x47\x89\xe3\x40\x20\x14\x93\xd9\xd0\x5a\x05\xe7\x70\x23\xed\x02\x70\x5e\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x9c\x1c\x32\xba\xdc\x26\xe1\xee\xaf\x5d\x13\x07\xaa\x6b\x28\x78\xc8\x57\x74\xbb\x49\xcc\x66\x22\x01\x45\x2b\x26\x30\x72\xed\xbd\x1a\xf8\x96\xaa\x0c\xdc\x06\x23\x28\xf9\x5c\xbe\x73\x4f\x89\x7f\x15\x87\xc4\x09\x70\x76\xfd\xd7\xfb\x13\xc6\x4e\x55\xc8\xe0\x1d\xb9\x55\x8c\xef\xf4\xa9\x67\xd6\xbd\x62\xdc\x87\x00\x5e\x20\x76\x9c\x39\xed\xb0\xac\x06\xd8\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\xca\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\xe5\x73\x84\xa6\x30\x10\x38\xfc\x45\x34\x5a\xa4\xbd\x87\x80\xdb\xb9\x4e\x11\x4d\x25\xa0\x41\x64\x4b\x8f\xee\x22\xff\xe3\xf5\xb3\x5a\xc7\x53\x1a\xab\x03\x62\x98\x15\x82\xd4\x4e\x99\x53\xb5\x33\xef\x5b\xc8\x8b\x4c\x40\x15\x67\x34\x72\x5d\xa0\x1a\xa1\xc9\x8f\xc2\x44\x6a\x40\x7a\x02\x77\x19\xb1\x7f\xc1\xa1\x0c\x89\xa8\x1e\x77\xe2\x3c\xfc\x1c\x2d\x44\x69\x7c\x6b\x09\xa8\xb0\xb4\xda\xbb\x2e\x58\x2a\x67\x33\xe1\x13\x5e\x9d\xe5\xc8\x4b\x9e\x3b\x16\x6f\x18\x91\x60\x2a\xe6\x12\x13\x22\x03\x63\xdb\x75\xea\x1e\xd5\xfa\x8d\x90\x19\x4a\xcb\x72\x39\x5f\xe0\x46\x61\x1c\x2a\x74\x99\x0f\x2a\x66\x9a\xa7\xd0\x92\x8a\xe9\x92\xdd\xf0\x32\x77\x72\x83\x27\x0b\x88\x50\x72\xc5\xd2\xaa\x04\x94\x65\x2b\x78\xba\x1c\x1b\xcb\xad\xd3\x94\x45\x49\x06\xa5\x9f\xff\x16\x52\xff\xbd\xd7\x16\x52\xff\x8e\xd7\x16\x52\x7f\x0b\xa9\xbf\x7a\x3d\x98\xec\xd0\x2d\xa4\xfe\xe7\x05\x93\xb4\x85\xd4\xdf\x74\x34\x61\x0b\xa9\xbf\x85\xd4\x7f\xdf\xb5\x85\xd4\xff\xc0\xb5\x85\xd4\xef\x70\x7d\x06\x9c\x6b\x0b\xa9\xdf\xe1\xda\x42\xea\xaf\xbf\xb6\x90\xfa\xab\xd7\x16\x52\xff\xd6\x6b\x0b\xa9\xdf\xf9\xda\x42\xea\x6f\x21\xf5\xb7\x48\xa3\xf7\x1b\xeb\x61\x22\x8d\xb2\x2d\xa4\x3e\x5d\x5b\x48\xfd\xcf\x02\x4f\x91\x6d\x21\xf5\xef\x74\x6d\x21\xf5\xb7\x90\xfa\x5d\xae\x2d\xa4\xfe\xe7\xe2\x2e\xd9\x42\xea\x6f\x21\xf5\x7f\x3b\x8a\xee\x16\x52\x7f\x0b\xa9\xbf\x85\xd4\xdf\x42\xea\xbf\x77\x16\x5b\x48\xfd\xcf\xc1\x04\x34\x36\x95\x9d\x10\x40\xef\x02\x56\x44\x49\xe8\x11\x36\xc0\xb4\x9a\xcd\x44\x09\x9c\x0b\x9e\xbc\x92\x3c\x55\xe3\x32\xb6\x83\xac\xc2\x8e\x00\xf7\x88\xea\x75\x6e\xf9\x39\x81\x11\x00\x52\x67\x9d\x29\x7e\xf2\xea\xf9\x1a\x64\xa4\xce\x59\x85\x5d\x73\xa4\x61\xce\xaf\x54\xb7\xf8\xf8\x2d\x04\x5f\x57\x3f\x46\x74\x4f\x32\x6d\x28\xc3\x1d\x88\x95\x2c\xb8\x52\xc2\xdb\x7b\xd2\x82\x1f\x65\x2a\x84\x62\xba\x10\x14\x9d\xe6\xcc\x48\x35\xcf\x04\xe3\xd6\xf2\x64\x31\x71\x4f\x52\x9e\xd8\x75\x36\x3a\x7d\x62\x6c\x29\x78\xee\xf3\xf2\x73\x2e\x71\x28\xc6\x93\x52\x1b\xc3\xf2\x2a\xb3\xb2\x08\x83\x31\x23\xa0\xa0\x06\x05\x55\x20\x06\x64\xc5\xd5\x29\xec\xa3\xfa\x69\x34\x2d\x1d\x43\xd3\x81\xb5\x39\x02\x3c\xf0\xbc\xb0\xcb\x90\xc7\x2b\xd8\x4c\x96\xc6\xb2\x24\x93\x20\xad\xe1\x89\x58\x3b\x0d\xe3\x8d\xbc\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x15\x5b\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xdc\x34\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\xf0\x62\xeb\xb4\xe1\x7a\xa3\x43\x89\x83\xdf\x9c\xa3\x46\x35\x47\xad\x50\x40\x96\xde\xca\x31\x80\x05\x50\xe2\xda\xed\x01\x91\x08\x27\x5f\xf9\x2d\xbb\xfe\x93\x6f\xfa\x48\x28\xbe\x14\xc6\xf0\xb9\x38\xef\x18\x68\xb8\xcd\x22\x83\x58\x43\xbd\x30\xb0\x15\x32\xac\xae\x0d\x9f\xd4\xd9\x99\x4d\x35\x88\xe5\x38\xa7\xa0\xfc\xdc\x94\xd2\x5a\x01\x8b\x0a\x08\x7b\x10\xab\x6c\x17\xe0\xef\xb6\x72\x3c\x5f\xfa\x41\xea\x1f\x3b\xa6\xae\x52\xcc\xb8\x9c\x0a\x36\x2d\xa5\x98\xb1\x99\x84\x34\x4e\x48\xac\x1c\x21\xe0\x12\x47\x2f\x80\x31\xce\xde\xd5\xca\xeb\xb2\x7e\x5e\x13\xf6\x23\x4d\xcc\x96\x95\x4a\x78\x84\x65\x0b\x15\xa6\x72\xc6\xe6\x90\x98\x49\xda\xe2\x1f\x9f\xfc\xe5\xcf\x6c\xba\x74\x22\x0d\x34\x2b\xab\x2d\xcf\xc2\x4b\x66\x42\xcd\x1d\xad\xf0\x78\x36\x6b\x24\x03\x05\xa0\x9b\x07\x4e\xfc\xe9\x97\x57\xd3\xa6\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\xfa\xa3\x74\x4f\xd9\xee\x68\x12\xad\xd9\x66\x3a\x93\xc9\xb2\xf7\x46\xf3\xc8\x5f\x6c\xa1\x6f\x50\xd7\x5f\xb3\x7b\xea\x72\xab\x42\x17\x55\x86\x4e\xe7\xe7\xa1\xba\xb8\x32\x62\xb5\x06\x70\xed\xb9\x00\x37\x29\x0d\xd1\xc6\x4d\xc7\x7c\x5c\xff\x48\x4d\xb5\x25\xe4\xc8\x0b\x00\x60\x60\x08\x3d\xe7\x59\x36\xe5\xc9\xd5\xa5\x7e\xa1\xe7\xe6\x95\x3a\x29\x4b\x5d\x36\xe7\x92\x71\xc7\x2d\x17\x95\xba\xc2\x0e\x0e\x01\x22\x41\xcf\x9d\x6a\x55\x54\xd6\x17\x32\xac\x7b\x61\xac\x97\xf7\x4c\xd8\x9b\x41\xf5\x28\xe2\x9d\xac\x6d\x1d\x2a\xd5\xc2\x1d\x19\x8f\x6f\xe2\xcd\xf6\xe5\x93\x3f\x7e\x8d\x5b\x97\xe9\x92\x7d\xfd\x04\x72\xb6\xcd\x08\x0f\x31\xf0\x36\x27\x28\x72\x9e\x65\xce\x6c\x88\x37\xa5\x23\xf4\xba\x4d\xf8\xc9\xf7\xa0\xed\xbf\xdd\xee\xac\x4a\x5d\x5e\xfe\x03\xf4\x28\x69\x8d\xc8\x66\x23\xac\x4a\x0a\x66\xcd\x2e\x08\x86\x5d\xe2\x3e\x50\x1a\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x26\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x05\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x12\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x46\xa8\xe4\x37\x0d\x62\xc0\x99\x04\xb8\x82\x9e\x78\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\xc7\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x63\x43\xd4\x03\xfa\xd3\x50\xc0\xbf\xb1\xaa\x64\xa5\x2a\x32\x14\xd6\x85\x8d\x81\x0a\x80\xdb\x3e\xc0\x92\xbb\x3b\x5c\x07\xf0\x6e\xf6\x4b\x39\x6a\xd0\x45\x05\xaf\x72\xce\x2d\x29\x84\xde\x7d\xcd\x59\x21\x4a\x23\x8d\x93\xcb\x3f\xc0\x81\x3a\xca\xb8\xcc\x23\x17\xe0\x66\x88\x80\x87\x1b\xe0\x93\xfb\x73\xca\x73\x9d\xd2\x80\xc0\x0a\x11\x3a\x7a\x8d\x5a\xdb\xd4\x6a\x07\x14\xa8\x9b\x66\x95\x3f\xd4\xd4\x6c\x72\x4a\xf7\x49\x60\x95\x78\xd7\xe7\xc4\x20\xe1\xfd\x1e\x2b\x7f\x0c\x93\x1f\x88\x0d\x00\x63\xa4\xc5\x6d\x72\xc2\x86\xf1\x88\x07\x25\x52\xe9\xc9\x0e\x9c\x30\x8c\x82\xbb\x33\x41\x3f\x65\xbb\xcf\x76\x37\xca\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x2f\x9f\x16\xa5\xda\xc3\xc6\x40\x13\xce\x0c\x82\xef\x03\xec\x1a\xdc\x25\xd2\x1a\x47\x07\x50\x92\x30\x3a\xea\x09\x4c\x06\x02\xd6\x63\xdf\xf0\x25\xe3\xa5\xae\x54\x4a\xfe\xa5\xe0\xe0\x7b\xd9\x7a\xf0\x99\x56\xc2\x3b\xce\xdb\x38\x15\xe0\xd1\x97\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x48\x2a\x78\xc3\x96\xa4\x3a\x0b\x92\x0a\xf9\xd3\x46\xdf\xd5\x23\xde\x0f\xf4\xbe\x2f\xc9\xc5\x52\x03\xda\x4b\x0f\x97\x0d\x1f\xdd\x94\xd2\x8a\xa8\xc7\xdf\x1e\x18\x2e\xce\x3e\x8c\x50\x19\xf6\xd7\x75\x92\xe8\x49\xa4\x7e\x30\x18\xa6\x9a\x7e\x44\xbe\x45\x0c\x0a\x8e\xdb\x3a\x0f\x97\x79\x0f\x0b\x8b\x09\xb5\xb3\xc3\xf6\xf0\xce\x5d\x2c\x68\xde\xdf\xe8\xd6\x22\xa2\x9d\xbc\x2b\x7a\x60\x6c\xb6\x6a\xe7\x0b\x0e\x3e\xb8\x62\x40\x0a\xfe\x5d\x2c\xf8\xb5\x80\x42\x6e\x99\xf1\x32\x83\x98\xe3\x05\xce\x9d\x4d\x2b\xcb\x84\xba\x96\xa5\x56\xb9\x50\x96\x5d\xf3\x52\x02\x2a\x4e\x29\x00\xd9\xc1\xd9\xa2\xbf\xdf\xfb\xe1\xf0\x35\x24\x34\xec\x13\x24\x05\xcd\xb2\x32\x1e\xbe\x26\x9e\x49\x34\xdc\x07\x97\xcf\xcf\xc3\xd1\x10\x78\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\xdb\xb2\xbc\x4b\xb2\xca\xc8\xeb\x4d\x71\x12\xaa\xb0\x3f\x96\x9d\xd6\xb9\x55\xed\x5f\x13\x6a\xa5\x70\x1f\x5c\xeb\x6b\x0a\xf4\x56\x02\x26\xbb\x26\x14\xed\xc5\x31\x70\x72\x3d\x11\x96\x06\xa6\xcf\x79\xc4\xc5\x15\x15\x02\x70\x63\x36\xeb\x84\x52\x3a\x15\xf7\x47\xdd\x69\xa6\xf7\xd0\x10\x18\x33\x8f\x2a\xf8\x4c\xb2\x10\x69\x05\xf0\x4e\xd2\x20\x38\xaa\x33\x1f\x78\x8d\xc2\xa7\xa0\x4b\xd0\xe9\x2c\x40\x1a\xa8\x31\x38\x07\x91\xe6\xfe\xf7\xa5\x07\x40\xf0\x1f\x98\xd6\x88\x60\x94\xba\xb1\x46\x8c\x1b\x53\xe5\x78\x24\xb0\x01\xc2\x4c\x5a\x13\x7a\xcc\x7a\xed\xd8\x1d\x8c\x7b\x16\x54\xf5\xa0\xef\x85\xc8\x60\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x68\xc3\x51\xc2\x04\x44\xdb\x42\x1e\xa7\x06\x2f\xe9\x4c\x42\x13\x25\x4e\xf4\xbe\x58\xf3\x4b\x54\x1d\xf0\x0e\x80\x87\xe1\x53\x91\x99\xf6\x40\xd3\x7a\x51\x08\x95\x94\x08\xdf\xb3\x4b\x2e\x37\x46\xce\x15\xf4\xcf\x74\xa3\xdd\xb3\x53\x66\x67\x9b\x69\x88\x2e\xb8\x9d\xb9\x5a\x23\x0b\x2b\xe7\xc5\x98\xac\x5e\xab\x73\x99\xdc\x63\x24\x7d\xcf\x29\xb7\x6a\xa5\x1b\x35\xb8\xaf\x2e\x56\x3c\x3e\x26\xf2\x6a\x4c\xd8\x85\xce\x29\xc5\x49\x45\x5d\xbc\x7c\x33\x55\x27\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xd7\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x7e\x92\x9a\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\xfa\xbd\x0d\x29\x30\xcf\xd8\xb8\xd5\x99\x76\xd2\x04\x0d\x7d\xff\x73\xe8\xde\xd1\x87\x9f\x82\xf9\x39\x00\xc7\x77\x7a\x1c\xff\x79\x7a\x7e\x14\xff\xf9\xc6\x38\x2a\xd1\x07\xed\xa9\x35\xbb\x32\xdc\x7e\x57\x8c\x8f\x7d\xdb\x5d\x33\x6c\x6c\xf4\x81\xaf\x8f\x16\x5c\xf9\x40\xd6\xad\xcf\x5b\x9a\xc4\x66\xf5\x74\x16\xbc\x14\x84\x1f\xe7\x38\xb9\x29\x78\x72\xeb\x2c\x02\x58\xdb\x7b\x6f\x78\xef\x4c\x4d\x55\xf8\x86\xdb\x19\xdc\x18\x66\x52\x6f\xbb\x9f\xfe\xf0\xf3\x1d\x89\xf9\xa1\xdf\xac\x23\xed\xfb\x7f\xd3\x68\xdb\x77\xa7\x5f\xac\x6f\xea\x75\xb7\xdf\x46\x7d\xf1\xee\x74\xff\x6d\x3d\x79\xef\xfa\x34\xdf\xcb\xed\x6e\x2f\xd6\x5e\xed\x3b\xdc\x0e\x4b\x7a\x3f\xb4\x82\xce\x2c\xbc\xab\xbb\xab\x83\x93\xaa\xbb\x73\xaa\x9b\xb1\xdf\x52\x00\x6e\x81\x32\x25\x98\x35\x35\x67\x0d\xf0\xa8\xaa\x2c\x85\x82\xb6\xf7\x15\x64\x3a\xfa\x76\xf6\xc8\xa4\x81\xd9\x12\x50\x27\xa2\xcd\xb3\xc3\x20\x0b\x29\x03\x2e\xe7\x00\xde\x19\x81\x55\xcf\x2a\x48\x68\x04\xd6\x8f\x60\x74\x5a\xb9\x79\x3c\x5b\x87\x90\xa1\x0b\xa1\xa2\x5e\xf7\xa4\x35\x8f\xdd\x1e\x6a\x60\x66\xa0\x22\x30\xc9\xd3\xdf\x15\x19\xb7\x33\x5d\xe6\x63\xaf\x1e\x8e\x1b\x4a\x02\x3b\x82\xd4\x1a\xe3\xed\x2b\xcc\x6f\x45\x50\x4d\x95\x66\x22\x92\xe6\xe1\x55\x55\x8a\x10\x54\xac\x52\xa5\x48\xf4\x5c\xc9\xff\xd4\x84\x00\xb9\x16\x9c\x43\xdc\x38\x49\xca\x54\x95\x65\xf7\xcf\x43\xe8\xa8\x04\xe8\x6b\x51\x2e\x04\xbf\xe7\xe6\x6d\xa5\xb4\xd0\x18\x75\xef\x51\x43\x98\x02\xa4\xf2\xfa\x87\x38\xd5\x58\x27\x50\xdb\x86\x21\x76\x9f\xb8\xcc\x41\xa0\x3b\x4d\x8f\xb3\xb9\xbc\x16\xca\x43\x8e\x1f\x65\x3c\xf4\xcf\xf6\x28\xab\x04\x7b\x5e\x59\x1d\x92\x16\x18\xb7\x11\xf0\x31\xe4\x38\x51\xbc\x34\x1e\x27\xba\x85\xba\x6f\x67\xbe\xd3\xd9\x5d\xee\x84\xbc\x01\x6c\xfd\x38\xaa\x5f\x29\xf7\xbe\xd5\x06\xb2\x26\x4b\x20\xbb\xc5\x9b\x22\x94\xd5\xf2\xe1\x47\x50\x4a\x9a\xe3\x41\xeb\x86\x21\x75\x39\x40\xc0\xd6\x84\xcd\x1c\xfb\x5f\xa2\x92\x73\x3a\x6b\x3e\x49\x36\x40\xf7\xa1\xf6\x09\xd4\xef\xda\x1e\x3c\xd7\xa9\xd3\xc2\x46\x2c\x2c\x65\xdc\x7c\x9c\xe2\x2d\x78\x26\xa3\xc3\x88\x4a\x5a\x59\x0a\x53\x68\xc4\xfe\x8f\x1f\x3b\x8a\xfc\x5f\xd2\x36\x92\xed\xb0\x8b\x5b\x38\x1a\x88\xce\xf6\x1f\x51\xea\xb5\x3a\xfc\x5c\xda\xc9\xd5\xd7\xa0\xc0\x0b\xb5\xe0\x2a\x41\xdb\xe9\xe0\x4a\x14\xe6\xc0\xc8\x39\xea\xeb\x7f\xfe\xfa\x6b\x50\xde\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x23\xd2\xe4\x0b\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xf9\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x4b\xe9\x5b\x8b\xd2\xab\xfe\x64\xc0\x9a\x93\xa2\x14\x22\x07\xf6\xd7\x25\x5b\xab\xe9\x25\x6d\x0d\xe5\x05\x2c\xfd\xe5\x78\xa2\x7f\x9a\x9a\x3b\x36\x69\x90\x75\x66\xfa\x06\x32\x2c\xa5\x76\xca\xcf\x84\xbd\x02\x39\xc8\xce\xc4\xb5\x28\x47\x7e\xd4\x17\xee\xa6\xf3\x70\x4f\xec\x86\x5b\x77\x47\xc7\x1c\xff\x8e\x6b\xe2\xe7\xde\x83\x78\xd8\xb7\x84\x26\x0f\xfc\x69\xc2\x7e\xe0\xa5\xd4\x95\x21\x5d\x24\x86\xfb\xc6\x14\xb2\x20\x49\xc0\x2b\x41\x01\x9e\x30\x48\xa8\x0c\xf3\x31\x9e\x40\x9b\xc3\xc0\xaf\x8f\xd6\x8b\x04\x69\xdd\x4a\x5d\xfb\x47\x95\x3e\xd5\x75\x05\x29\x1c\x85\xc1\x5a\xfe\xef\x25\x9a\x89\x27\x0a\xc3\xf8\x79\x00\x6f\x75\x9a\x18\x8e\xb2\x90\x73\x9f\x50\x0d\xef\x8f\xe6\x6b\xf4\x69\xd8\x21\x1d\x96\xb4\xcb\x31\xed\x9a\xd7\x5f\xb4\xdf\xaf\xc7\xb6\x68\xe2\x29\xc7\x90\xcc\xbe\xa2\xa8\x3e\x37\x3b\xb8\x4f\x40\x88\x8c\x93\x52\x5a\x99\xf0\x6c\x07\x84\x93\xff\x2a\xc9\x2a\xa7\x27\xc6\xdf\x96\x82\xd9\x1b\x8d\x4f\xe1\x19\xbb\x12\xcb\x1b\x5d\xa6\x5e\x3e\xfb\x27\xd6\x6b\x61\xac\x7f\xa4\xb3\xe7\xe0\x00\xa3\x9b\xa1\xcc\x45\xc9\xa6\xc2\x7b\xd0\x5b\x37\x2f\x27\xec\x50\x2d\x29\xfc\xa8\xe2\x22\xc3\x08\x99\x0d\x74\x04\xd4\xa2\x1a\x9b\x84\x84\x98\x7f\x1a\xc7\xf2\xcf\xdb\xbc\xcb\x4e\x01\x0b\xa7\xc0\x4b\x7f\xef\x5e\xd6\x25\x55\x39\xc1\xe9\x28\xb1\x46\x4b\xfb\xaf\x3f\x09\xb7\x70\xfa\x8d\x54\xc2\x98\x6f\xdd\x52\xf6\x51\x57\x9b\xbb\x83\x83\x5a\x42\x63\x43\xa5\x54\x9d\x52\x2c\xdc\x91\xc2\x18\xb1\x63\xc3\x3a\xad\xef\x9c\xb0\x43\xf8\x00\x72\xe2\x9d\xe6\x05\x55\x74\x6e\x30\x69\x4d\xbb\xb9\x3c\xde\x71\x78\x76\xec\x73\x97\x51\x53\x30\x4d\xb8\x74\x54\x99\x9b\x33\x01\x4d\x8f\x32\x68\xc5\xbf\x2b\x0e\x7d\x72\x77\x2e\xcb\x4a\xec\x74\x53\x95\x10\x88\xff\xe0\x4f\x5f\x3f\x01\x6d\x29\x3c\x6f\x0c\xcf\xeb\xa2\x2a\xdd\x3f\x47\xa6\x53\x76\x4c\x3b\x31\xe8\x75\xbc\x1f\x3c\xc1\xbd\xdd\x41\x41\x2b\xa8\xed\x85\x65\x0a\x34\xef\xe4\x5a\xed\x94\x0b\xd3\x3d\x0b\x66\x5c\x4f\xf7\xf2\xfe\x3d\xcc\xfa\x24\xb0\x34\x9e\x3b\x44\x94\xab\x1e\x0d\x57\xc5\xe0\x92\x84\xe7\x44\x9e\x5d\x6c\x75\x41\x1f\x43\x3a\x2c\x30\x2e\x88\x0a\x00\x7b\x5c\x16\x3d\x52\x7f\x3b\xf0\x1b\xa8\x74\xe9\xad\xdf\xed\xbe\xc6\x81\x58\x51\x2b\x74\x2b\x15\x0c\x21\xc2\x0b\x7a\x07\xa9\x72\x87\x50\x0e\x36\x62\xaf\xd4\x73\xcc\x8f\x1f\xa1\x76\xd7\x40\x1f\xc1\x9b\x06\x2d\x13\x3c\xf8\x1d\xbd\xfb\x18\xa7\xdc\x85\x29\xdc\x9f\xdc\x91\xe5\xd8\x53\xfa\xef\xbe\x6e\x8d\xd5\xd8\x7a\x0d\xcb\x98\x24\xa4\xac\x7b\x9f\x11\xfb\x64\xf3\x52\x57\x85\x8f\xa4\x36\x1b\x99\xd5\xdd\x3b\x30\x00\x88\x7d\x7e\x95\x6e\x0e\x1d\x9c\x1f\xb0\x81\x45\xed\x35\x4b\x59\x82\xe6\xb1\x97\xba\x58\x05\x85\x1e\x84\xb2\x52\xcd\x3e\xe7\x51\x2c\x72\x27\x13\x73\x9e\x2c\x77\x9a\xcf\x59\x17\xf9\x95\x50\x9c\x23\x73\x04\x4c\xc7\xe7\xd5\x35\x0d\x50\xfa\x00\xfa\x03\x9e\x35\x50\x0d\x2a\x43\x53\xf4\x22\xdf\x17\xe5\xa1\x67\xab\xec\x61\x99\xff\xe9\xeb\x3f\x8d\xbd\xef\x0d\xa6\xf2\x49\x36\x54\x88\xdc\x0e\xaa\x4b\x36\xd6\xcc\x29\x48\xd2\x14\xb0\xbe\xa0\x89\xd5\xe2\x3c\x3c\xfd\x7d\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x12\x72\x35\xbd\xe8\x7d\x8e\x5f\xbb\xed\xcb\x42\x67\x29\x1c\x14\x6a\xce\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\xcd\x24\x35\xc8\x9b\xb0\xba\x68\x2e\x36\x61\x61\x27\x4f\x18\xbb\x10\x02\x9b\x43\x46\xf3\x00\x3e\xeb\x49\x49\xde\x56\x3d\xc3\x4e\xde\x68\x84\x7d\x22\xb7\x50\x77\x71\x4c\xc1\xb4\x9e\x5e\xfb\x9d\xc3\x60\xa5\xc4\x31\x2f\x64\x70\x2b\xfd\x7a\x5b\x92\x09\xd2\x89\xeb\xa8\x2b\x65\x17\x39\x5a\x18\xc4\x88\x85\xbd\xfc\x3d\xf6\xf6\x84\xd4\x49\x88\xfc\xa1\x6f\xf2\xc6\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\x10\xdf\x7d\x1d\x43\x2f\x40\xb3\xca\xa7\x68\xd4\xea\x1b\xf0\x0a\x7f\x7b\x7a\x1c\xce\x88\xbb\xeb\xf9\x05\x86\xf4\xbe\x9c\x50\xeb\x5d\x3b\x97\x29\x9b\x62\xe2\x86\xe3\x97\x7b\x4a\xdc\x60\x2a\x38\x39\x4e\x83\x5e\x7d\xed\x53\xa4\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\x4d\x50\x45\xe9\xad\xf2\xa9\xa4\x54\xd1\x57\xaf\x77\xbd\xbb\xfa\x66\x5c\xde\x8c\xc7\xe3\x31\xc5\x77\x81\x4b\x8f\x1a\x34\x08\xcc\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\xdb\xbc\x7e\x04\xec\x48\xae\x96\x34\xbb\xfe\xfd\x7a\xef\x0f\xcf\xdd\xcf\x1d\xd7\x07\x8e\x61\x4d\xa8\xb8\x6f\x7c\x6a\x5d\xf4\x19\xed\x64\x53\xa3\x9a\xeb\x19\x6e\x52\xc8\x9e\xbf\x65\x61\xbc\x17\x88\x76\x0d\x61\xf5\xa1\x95\x2e\xde\x15\x1a\x91\x80\xa1\x3a\x05\x3a\xb6\xb5\xc3\x13\x90\x11\xea\x4e\x15\x24\xd9\x35\x4e\x0d\x29\x14\x18\x11\xf3\x44\x60\x53\xee\x86\x0c\xd3\xd9\x6b\xed\x93\xfd\x09\x3b\xa5\xad\x05\x06\xa1\xd2\xd4\xf7\x8d\x69\xc5\x44\xb1\x10\xb9\x28\x79\xd6\x7c\x10\x55\xe9\x3e\x73\xec\xb6\x74\xbb\x14\x43\x00\x39\x2f\x90\xdb\x02\xf3\x4c\x65\xe9\xfb\xc6\x46\xa1\xb9\x9d\x57\xea\xb5\xd6\xf6\xa5\x34\xa0\xbb\x90\x33\x04\x35\xcd\x9d\x75\x02\xcd\x7f\x57\xa7\x3c\xf7\xdd\xc9\x9f\x2c\xfe\xc5\x7c\xef\xb7\x21\x78\xad\xe3\x20\x8e\x69\xdd\xb7\xbd\xdb\x1b\x02\xf1\x69\x74\xd1\x0d\xbe\xd8\x75\xcd\xdb\x56\x3a\xb7\x7d\xe2\xd6\x6d\x94\x95\xc5\x6d\x03\x2d\xeb\x53\xb7\x1b\xdf\x1c\xf7\x82\x2d\x73\xa6\xe1\x9c\xf4\xdc\x34\xa7\xab\x1d\xe3\xea\x2d\x02\xee\xbe\xd0\x0a\x53\x69\x35\x86\x0e\x4e\x95\xf1\x81\xcb\xd2\xbb\x7c\x1b\x02\x88\xda\x4a\xa2\xd8\xc4\xd6\x80\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xa1\x98\x6a\x51\x77\x73\xe2\x86\xbd\x39\x3d\x66\x4f\xd8\x1e\x64\xe7\x86\x0a\x6d\xc4\xa4\x70\xa6\x6c\x2b\x85\x74\xe6\x87\x68\x9a\x2e\x04\x08\xa1\x34\xf2\x22\xdf\xea\x52\xab\x20\x86\x09\x58\xf3\x96\x06\x85\x9b\xde\xe3\x5d\xf7\x63\xb7\x1c\xfc\x90\xe5\x32\x00\x0f\x7a\xd3\x81\x07\xc5\x8a\xf5\x10\xed\x25\x37\xbd\x7a\xbf\x75\x0e\xd5\x4c\x54\x1b\x60\x53\x5d\x9c\xc0\x80\x08\x06\xf1\xce\x92\x1a\x7f\xcf\xde\xe5\xab\xa0\x3f\x84\x7c\x14\xf0\x01\x4a\xae\x52\x9d\xaf\x3c\xcd\xad\x26\x18\x6f\xd1\x6a\x6e\xb7\xdd\x6d\x57\xaf\x12\xce\x7e\x15\x90\x60\xe3\x0f\x50\xfa\xfa\x02\x7c\x05\xd2\x84\x9d\x80\xce\x03\x48\x0a\x5f\x31\x5b\x7b\x23\x23\xf4\xae\x04\x2a\x75\xd6\xb1\x98\xae\xf1\xd6\xaf\x75\x46\x45\x0c\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\x30\x41\x9b\xbd\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\x49\x4a\xb3\xf6\x5b\x43\x4a\x6b\xe3\xad\x41\xee\x3e\xc4\xb7\x6e\x66\x30\x0f\x20\x4c\x68\x40\xa6\x29\x8f\x9a\x3a\x09\xb4\x41\x4e\xea\x0c\x49\x70\x42\x3d\x2e\x3e\xda\xa7\x0c\x1e\x13\x9d\x3e\x35\xeb\xd6\x09\xcf\xa8\xf7\x7f\xb7\x75\x66\xed\xb5\x6e\x0f\x19\x25\x63\x70\x37\x5b\xf8\x2c\x4a\x29\xe4\x88\xd0\xa4\xeb\x80\x4c\x2b\xf8\x42\x6e\x3a\xfa\xa5\xcf\x86\x70\xf2\xb7\xce\x70\x8c\x7f\x6d\x35\xb5\x96\xf5\x48\xf0\x1c\x26\x28\x30\x5f\xb1\xe0\x76\x31\x62\xa5\xc8\x10\xdc\x95\xce\xd9\x15\x9a\x52\xbb\x8d\xb4\x49\xbf\x63\xfd\xa3\x41\x61\x81\xd6\xd2\x30\x32\xb8\x7c\xbc\x1a\x32\x43\xfe\x25\x0d\xdb\x79\xe1\x09\xb0\xf3\x98\x19\xf4\x0e\xbe\x4f\x58\x3b\xf4\x62\x5d\x49\x95\x12\xea\x69\x83\x34\x21\x45\x17\x75\x43\xef\x61\xf2\x67\x9d\x97\x02\x9c\xbd\x81\x34\x6c\xdc\x79\x33\x50\x28\xcc\x07\x44\xc7\xb7\x28\x99\xde\xa7\xe2\x1f\xd2\x1e\xe6\x8d\x82\x95\x56\x50\xff\xa0\xf4\x9a\xfb\xfc\xbb\x74\xeb\x80\xd8\x87\xf5\xae\x14\xaa\xf4\x64\xbf\x87\x01\x6b\x6a\x8e\x75\x2f\x91\x0a\x5f\xe3\x51\x92\x5d\x48\xed\x9d\x5b\xaa\xf7\x08\x56\x87\xf2\x5d\x57\xa4\x13\xa6\x57\xe5\xbc\x5c\xb2\x6f\x4f\x8f\x51\x03\x6f\x18\x02\x4a\xfb\x47\x87\x9d\x92\x12\xe4\x20\x57\xcb\x07\xa0\x38\x77\x83\x7d\xe9\x0c\xfa\xd2\x17\x4e\xb7\x97\x99\x88\x65\x58\x3d\xf7\xd4\x05\x15\x73\x2d\x74\x96\x32\x1e\x36\x98\xf2\x85\x5c\xa9\x7f\x0e\x06\xd0\xa3\x92\xce\x89\x33\xbe\x28\x38\x5d\xa9\xba\x52\xc4\xdf\xbf\xd7\x56\x09\xfc\x99\xde\xa7\xfa\x66\xef\x99\xca\x78\xa5\x92\xc5\x6f\x65\xcb\xac\xa1\x7e\x08\x75\x70\x76\x25\x4a\x25\x32\x56\xf0\x92\xe7\xc2\x86\x0e\x86\x46\x74\xc1\xf3\xe9\x09\x07\xd4\x0f\x0c\xa8\x07\x90\x4f\xf7\x4e\x84\x7d\x21\x80\xfa\x00\xab\xac\x69\xcf\x36\x43\xe9\xe8\xa6\xb4\xa4\xae\x9d\x1d\x07\xef\x8d\x76\xd1\xab\xb7\x60\x13\xd9\x0a\x61\xf9\x1f\xc4\xbb\x35\x6b\x77\x07\xb0\x6e\x7e\xc4\x01\x6b\x90\x01\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\xa1\xbd\x76\xcd\x8a\x2b\xaa\xd9\x07\xe1\x13\xfb\xca\x3b\xf3\x5d\xa8\x03\x7c\x54\x1e\xae\x79\x6e\xf8\x51\xe9\xde\xdb\x4a\x9e\x5d\x14\xa2\x63\x67\xfe\x66\x5f\xfe\x97\x17\x87\xcd\x41\x41\x28\x41\xb2\xb5\x5b\x13\xf7\x7d\x54\x32\x70\x23\xa6\x0b\xad\xaf\xd8\xde\x9a\xb2\xc7\xa8\xca\xc5\xc8\xb9\x39\xa0\xed\x3d\x76\xf3\xde\x67\x52\x01\x3e\xed\x2a\xae\xaf\x7f\x48\x12\x66\x01\x6b\x45\x39\x6b\x24\x86\x57\xa7\x09\x3c\x0a\x33\x6a\x36\x61\xe0\xac\x2e\xc6\xfd\xf3\xbd\xfc\xf5\x81\x05\xb9\xad\xfc\x75\x2d\xd5\xd0\xa1\xb1\x11\x92\x90\xb9\xed\xd4\xf7\x01\xe8\xf0\x5d\x3d\x5a\x0c\xa7\x26\x67\x0d\xa4\xf7\xda\x50\x0a\xc1\xca\x5d\xe8\x38\x45\x3f\xdd\x8d\xb5\xfa\x26\x1e\x1a\xcf\x8a\x05\xa7\xd4\x30\x2c\x07\xf6\x19\x14\x53\xc1\x16\x5a\xe9\x92\xca\x1c\xea\x42\x1e\x60\x33\x58\x77\x03\x2b\x40\xfc\x36\x9a\xea\x51\xed\x41\xf2\x4d\x50\x66\x19\x9f\x43\xc7\x9a\x56\x35\x0e\x30\x57\x5d\x61\x54\x33\xbe\xd9\x97\x2c\xfa\x6e\x0c\x00\x06\x6d\x90\x8b\xf9\x60\x26\x95\x6d\x40\x16\xc8\xa1\x9b\xb7\x23\xcb\xb9\x4f\x66\xf6\x53\x00\x37\x45\x28\xda\x34\x6e\xef\x60\xfe\x86\xbc\x16\x0d\x02\x23\xe7\xdd\xf3\x50\x34\x16\x93\xac\x50\x5e\xc0\xef\x39\xcb\xe5\x3b\xf7\x94\xf8\x57\x71\xb5\x81\x4a\x21\x4a\xbc\xfe\xeb\x7d\x67\x8c\xd5\x96\xdb\xc8\xad\x62\x7c\x67\xd4\x29\x41\xc1\x17\x67\x58\x2e\x80\x2f\x10\x47\x5a\xa8\xe9\x41\x9f\xfd\xdd\x1d\xaa\x2c\x84\x4a\x07\x3a\xea\x10\x32\xa5\xe1\xdc\x42\x7b\xf1\xdd\x27\x84\xea\x6e\x19\x22\x8c\xba\x2a\xa3\x3f\xb9\x68\xff\x94\x3c\xcc\x88\xf2\x5a\x26\xe2\x30\x49\x74\xa5\x7a\x65\xa1\x1e\x0b\xf7\x0a\xdc\x8a\xf4\xa2\x31\x26\x7a\xdc\x53\xf8\x16\x2b\xd1\x79\x26\x39\xc2\x0c\x35\xef\xc4\x22\xbb\x7a\x1c\xf0\xd8\xb7\x66\x48\x5b\xc6\x58\xc1\xbb\x65\x94\xf6\xa4\x50\xdf\x54\xf9\xd5\x37\x5e\x27\xe1\x5a\x14\x24\x67\xfd\x4a\x1a\xfc\xdd\x6a\x10\x2c\x37\x57\x35\xf8\x92\x80\x32\xa4\x70\x98\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x90\xa9\x03\x75\xad\xe3\x7b\xee\xe5\x0f\xcd\xf3\xff\x75\x7c\xd6\x2f\x73\x3c\xf4\x9d\xc1\xfa\x96\x05\x0d\x1d\x54\xf5\xb8\x2c\x3f\x2e\x4f\x74\x4f\x1e\xb1\x92\x13\xa4\x3e\xb5\x53\xcb\x04\x47\x9f\x0a\xdb\x8b\x32\xf5\xf7\x27\x8e\xa7\xd7\xd1\x72\x64\xf5\xd4\xfd\x2c\x17\x5c\x99\xa8\x04\x55\xc0\xd0\x3e\x2b\x36\xcc\x07\x05\x21\xad\x36\x79\x0f\xf6\xbc\xd3\xb5\x79\x87\xb1\x65\x95\x58\x56\x59\xe3\x3e\xc7\x87\x7b\x86\x79\x87\xc7\x97\x62\x2e\x8d\x2d\x97\xbe\x2f\xdb\x2c\x9a\x04\x79\x85\xc2\x2d\x57\x62\xc9\xbe\xfb\xfe\xe4\x1f\xbf\xbc\x78\x75\x74\xf8\xe2\x97\x97\x87\x47\xdf\x9d\x9e\x9d\xbc\x7d\x7b\xf1\x8f\x8b\xcb\x93\x97\x6f\xdf\x1e\x21\xc2\x08\x95\xe3\x5e\x08\xfb\xf6\x2d\xed\x54\xf3\xf6\xed\x65\x52\xc8\xe2\xed\xdb\x73\xef\x03\xc1\x8e\x0b\xff\xeb\xf8\x0c\xf8\x27\x56\x85\x85\xb4\x27\x90\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xa5\xb3\xab\xb8\x5b\x0b\x89\xd4\xeb\xb0\xbb\x01\xeb\x56\x49\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\x32\xc6\xb5\x20\x5c\x3c\x2a\x8c\x8e\x70\xb5\xd6\xb5\x63\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x73\x02\x3b\xdf\xd5\x3d\x81\xa0\xac\x19\x4b\x5b\x57\xa1\xbe\x40\x49\x2a\x74\x1a\xfa\x1f\xb5\xfc\xd2\x2b\x3e\xe9\x46\x19\x0d\x82\xb9\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x5b\x72\x2d\xd2\x94\xb7\x54\x9d\x40\x45\xe9\xbb\xa6\xea\xa0\xde\x00\x5d\x98\x51\x87\x1d\x50\x4d\x53\x9d\xf3\xfb\x76\x3a\xfb\x40\xfd\x0a\xf6\xa1\xfc\x77\xc5\x33\xd4\x01\xce\x75\xba\xca\x99\x76\xfe\xea\x3f\xfa\xdb\xe4\xaf\x61\x1e\x7f\x9b\xfc\x15\x3a\x5c\x7a\xb2\xfd\x6d\x62\xae\x93\xc9\x5f\xa9\x40\x9a\xd1\x4d\x6b\x73\x84\x57\xaa\x9d\x48\x9f\xc5\xdf\xc0\xb3\x39\xe8\xbb\x9f\xa4\xdc\x65\xc0\x56\xa1\x03\x37\x08\x45\x2d\x10\x6a\xaf\x93\x52\x70\x4c\x35\x67\xa9\xc8\x44\x8d\x03\xf3\x00\x3a\x54\xde\xde\xb2\xd3\xc7\xda\x1a\x0d\x4d\x63\xdf\x54\xd0\x97\x7e\xf3\x7d\x4f\x63\x83\xe1\xab\xba\x8d\x7c\x87\x03\xd0\x13\xa9\xe1\x5e\x61\x23\xab\x33\x81\xeb\xd3\xe7\xa4\xac\xad\xab\xdb\x35\xf1\xe8\x5d\x08\xb1\x89\x6a\xf4\x4b\x8f\x4e\xea\x76\xc4\x65\x98\x3f\x58\x1a\xd8\xcf\x0f\x83\xab\xf8\x0d\x54\xbb\x2d\x99\x93\x5a\x16\x3d\x19\x71\x85\xa8\x2d\xa1\xf3\xe0\x5f\xaf\xc4\x72\x84\x80\x1e\xa8\x84\xfc\x2d\x82\x59\x0e\x25\xd1\x08\xbc\xa6\x4b\xf6\x57\xff\xaf\xbf\xdd\xd7\x5a\xeb\xe1\x47\xed\xe3\x45\xc5\x97\xea\x1d\xf9\x3a\xc1\x2a\x98\x26\xc2\x07\x52\x96\x0a\x64\xac\x46\x72\x4d\xd8\x09\xd4\xbd\xa2\x46\x4a\x50\xb3\x59\xd6\xb8\xd9\xf8\xb6\x91\x0d\x74\x08\xf0\xbf\x44\xd5\x31\x67\xfa\x82\x2a\x33\x01\x66\x67\x26\xca\xfa\x13\x60\x30\x67\xfa\xe4\x9d\x48\x2a\xfb\x29\xab\xd5\xf1\xba\x12\xfd\x1b\x79\x7d\x2f\x02\x04\x11\xd2\xc6\x69\xe1\xa1\x32\xa1\x3e\x9d\x51\x72\xda\xfb\x69\x7b\x25\x96\x26\x80\xac\x5d\xe1\xe8\x54\xd5\x1c\xf6\xaf\x17\x64\x27\xef\xa4\xb1\xe6\x7f\xfa\x2e\x62\xf9\xb4\xee\xdf\xc6\x31\x4b\xac\x1e\x3d\x02\xd8\x73\x7f\xc2\x63\x3e\x35\xc1\xfd\x0b\xf4\xa6\xfa\x2b\x4f\x89\x08\x42\x8f\xbb\x77\xda\x35\x94\x9e\xa4\x15\x14\xaa\xc5\x58\x6c\x75\x62\x0d\xfe\x18\xf7\x27\xd2\x10\xe8\x72\xe2\x94\xbc\xa6\x98\xa1\x8f\xe8\x26\x09\xa8\x22\xf2\x9a\x67\x42\x11\x34\x6d\x96\x26\xbc\xc4\x10\x3d\x01\x0a\x19\x42\xb7\x26\x24\x0d\x27\xe3\x88\x93\xd5\xab\x6c\x28\x94\xc7\x4b\x2b\x93\x2a\xe3\x25\x73\xe7\x71\xae\xcb\x7b\xe2\x0e\xe1\xd5\xaf\x9b\x5d\xd8\xa2\x3d\x9a\x3c\x37\xf9\x7b\x7b\xc4\x36\xd0\x21\x69\x2f\xce\x64\x82\xfa\x9a\xe6\x41\xd9\x6b\xa2\x63\xeb\x99\xe7\x4d\x81\x51\xc4\x50\x79\xb6\xe1\x1c\x97\x73\xf0\x7f\xef\x47\xc2\x23\x9c\xcc\x09\xfb\x7b\xa8\x16\x1f\xb1\xda\x67\x0c\x35\xa9\xf4\x4c\x3a\x36\xb4\x5c\xf5\xa1\x9e\xe9\x12\x5a\x13\xee\xa5\x1a\x7e\x23\xae\x65\x62\xf7\x27\xec\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xc7\x2c\xd4\xe1\xd6\x80\x7d\x4f\xd8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\x88\x90\x40\x1f\x59\x36\x4c\x8f\x08\xf7\x9a\xe8\x76\x83\x8d\xa2\xa6\xd8\xda\x1a\x41\xf2\xeb\xc0\x21\x03\x4f\x94\x86\x4e\x69\xc3\x73\x1b\xe2\x2c\x9e\x85\x86\x8d\xf3\x2f\xf0\xd1\xb3\x52\xcc\xe1\xfc\xe1\xe9\xf9\x84\xa7\xcf\xea\x42\x67\x7a\xbe\xbc\x28\x4a\xc1\xd3\x23\xad\x8c\x2d\x81\x35\xf4\xc1\x77\xbb\x6d\xcc\xa8\x1b\xd6\x42\xdf\x30\x4e\xe5\xec\x7a\x86\x08\x79\xba\x9a\x2f\x10\xff\x1f\x7e\xe8\x3b\xc7\xfa\x29\x92\xd1\x69\x26\xec\x22\xe0\xfb\xc3\x06\x0f\xed\x02\x60\x14\x70\x78\xdc\xf0\x25\x1d\x26\x3e\x95\xa9\x30\x51\x8e\xb2\x9f\x0c\x86\x7e\x6e\x7d\x7f\xe0\xca\x87\x67\xc7\xf7\x6d\xaa\xb0\x41\x85\xf6\x96\x57\x09\x9a\x11\x52\xbd\xa6\x6f\xd0\x48\x81\x6e\x3c\xd7\xa4\xa9\x22\x96\xab\xa7\xcc\x27\xd4\x4d\xfb\x80\x2f\xe5\xfc\xdd\xc5\x95\xb8\xe9\xf0\x4b\xff\xa2\xdf\x8b\xfb\xa7\x82\x8d\xc1\x1e\x7d\xa3\x0c\xb7\xd2\xcc\xa0\xfb\xca\x27\xd4\xc7\xa1\xe8\xa0\x5b\x93\x08\xbc\x9a\xb5\x3b\xf1\x68\xbe\x28\x3c\xe0\x2d\x36\x36\x0b\xe5\xff\xd5\x76\x10\x0a\x40\x2c\x82\x08\xfd\x25\xdc\x09\x4a\xa8\xe7\x92\xd5\x75\x1c\x1a\x23\x15\x55\x3e\x15\x65\x38\xfb\xe8\x0c\x90\x65\x0b\x9a\xb6\x75\xf6\xbb\x33\xc6\xce\x99\x70\x7d\xd3\xca\x80\x3c\x27\xef\x9c\xe6\x61\xba\x25\x2a\xe1\xd5\x6c\x99\xd6\x1a\x14\xc3\x63\x3e\x81\xb3\xb5\x0c\x8d\xd6\x25\x60\xf6\xc6\x9f\x74\xe5\x73\xf5\xd5\xaf\xe9\x22\xeb\xd7\x78\x91\xad\x49\x94\xbe\xf5\xf5\x5b\xfd\x4f\xe2\x82\x3f\x72\x0a\x99\x11\x2a\xf0\xe8\xc0\xe6\xaa\x16\xec\xd4\x0b\x3f\x0b\xda\x9c\x33\x8a\xdc\x4d\xf8\xbb\xbe\xdd\x8d\x7a\x34\x6e\x64\x03\x34\x6f\x64\xc0\xcb\xae\x3a\x70\xc0\xf8\xf7\x9e\x58\x9d\x07\xe9\xdf\xc6\x91\x75\x37\xa8\xeb\xab\xb1\xa1\xae\x6a\xd3\x1a\x77\x56\xc3\xb4\xae\x99\x5d\x6d\x58\xf7\x7a\xf6\x00\xbd\xcd\x58\x4f\x1b\xb7\xbe\x1a\x84\xd0\xf7\xb0\x76\x39\x04\x98\xf4\xcc\x9f\x8e\xb5\x36\xef\xa9\x1a\xb1\x33\x6d\xdd\x7f\x22\xf3\xf7\x58\x0b\x73\xa6\x2d\x7c\xf2\x20\x48\x89\xaf\x30\x20\x21\x7d\x1b\x01\xc0\x7b\x03\xbe\x49\x21\x5a\x27\xf1\x3c\xc1\xd6\x18\x16\xa7\x8a\xe9\xd2\x53\x2c\x58\x17\x86\x86\x88\xc3\x0a\x84\xb1\x75\xab\x71\xe2\xc6\x89\xe9\xfc\x9e\xe1\x68\x28\xc8\xfe\xc2\x6f\x00\x3c\xb5\xc8\xa0\x40\x20\xad\x4a\xc4\xb0\x75\xba\xa6\x15\x73\x99\xb0\x5c\x94\x73\xe8\x05\x9d\x2c\x86\x58\xbe\x3e\x72\x05\xaf\x9e\xd2\x25\x9e\x4c\x8f\xbd\x04\x22\x1b\x54\xac\x01\x55\x00\x1c\x0f\xc5\x5a\xce\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x59\xc1\x65\x09\x98\xb7\x14\x3b\x8e\xbf\xa3\xe8\x4b\x3c\x8c\x1b\x61\xc5\xb7\xc4\x15\x13\x58\xc9\xe4\x46\x6f\x2b\x1e\x23\x76\xb3\xd0\x06\x85\x61\x70\x7f\xec\x5c\x89\xe5\xce\x68\x65\xeb\xed\x9c\xaa\x9d\x3a\x30\xdc\xd8\x6c\x41\x08\x43\x06\xe1\x0e\x7c\xb7\xf3\xf1\x74\x95\x5e\xc2\x76\x88\x8e\x01\xed\x09\x75\xdc\x57\xf5\xe2\x7d\x2f\x96\xfd\x3d\x66\x2f\x1b\xc3\x79\x65\xc9\x92\x8e\x5e\x4b\x3f\x83\x39\xff\x19\x78\xea\x17\x64\x76\xeb\x6b\xe1\xfb\xc2\xa1\x79\xe9\xf8\x42\xc8\x98\xe1\x59\x82\x3d\x3f\x70\x51\x61\x10\xb7\x98\xde\xc4\xc8\xb4\xbe\xaa\x0a\xbf\x29\x42\x6f\x5f\xa9\x12\x9d\x93\xd1\x41\x9d\xe5\xdc\xbe\xa2\x1d\x37\xa6\x38\x1e\xee\xde\xb0\x37\x08\x69\xbf\x61\xcd\x34\x27\x1c\xdc\x0e\xc2\x31\xbf\x60\x01\xdf\xf1\x15\x42\xca\x4b\x3c\xbb\x09\x03\x9a\x81\x5e\x90\x6a\xb5\x6b\x71\x6c\x7f\xcc\xd6\xbc\x48\x18\x99\xbc\x85\xee\x9c\xaa\x2a\xcb\x02\x7e\x28\xea\xf3\xe8\x0c\x84\x73\x41\x5e\xf4\xb9\x3b\x29\xb6\xf9\x82\x8f\xaa\x59\x7a\x4f\x5e\xda\xe8\x08\xe1\x68\xd4\xb5\x01\x1e\x5e\xe4\x38\xe8\x7d\x7a\x76\x5f\xe2\x40\x91\x93\x0b\x03\xeb\xf3\x52\x60\x45\x33\xec\x2c\xd8\x69\xd4\x22\xa9\x52\xe2\x5a\xb8\x95\x4d\xa5\x21\x50\x4d\x9f\xa7\xf3\xcf\x15\xbf\xc2\xff\x73\xac\xcf\xb4\xf5\xae\xaf\x7f\x7a\xdf\x31\x32\xf1\x77\x32\xaf\x72\x04\x9f\xb3\x6e\x8b\xa6\x72\xe6\xd1\xb4\x7d\x7a\x50\xd3\xe8\x6e\xfa\x7e\x68\x97\x5a\x5e\xce\x21\x4d\x98\x8c\x6e\xcf\xab\xe7\x99\x9e\xf2\x8c\xe5\x52\xb9\xc7\x50\x06\x40\xe3\xb3\x30\x13\xfa\xf3\x3d\x0f\x02\x81\x22\xe7\x72\x9a\x09\xb2\xea\x5b\x40\xf5\xd1\x8f\x5b\x37\x02\x4f\xca\x84\x31\x18\xb4\x7f\x29\xd5\xb1\x77\x09\x3e\x77\xa7\xe6\x1d\xcf\x8b\x4c\x60\x9d\x2b\xfb\x6a\xfc\x1f\xad\x04\xa3\x2c\x97\x11\xf3\xcb\x53\x77\xf4\x7b\x8a\xd2\xa8\xee\xce\x11\x52\x98\x9a\xcc\xc3\xbb\x23\x0d\xfb\xf2\xe0\xcb\x83\xa7\xcf\x9c\x22\x86\xb1\x2e\x6e\x08\xc7\x6b\x95\x1a\x4f\x27\xec\x57\xe6\x66\xf0\x94\xfe\xfb\x25\xfd\xf7\x2b\xf6\x2b\xfb\x95\xb1\x73\x76\xce\xe2\xff\xba\xff\xb0\x5f\xd9\xd8\x11\x21\x9a\xea\xd3\x51\x93\x77\x24\xce\x26\xf5\x55\xeb\xa1\xa3\xa6\xd5\x34\x34\x94\x0c\x26\x3a\x17\x30\xd5\x2f\xff\xa7\xbf\x07\xf2\x2d\x2c\x36\x3d\x85\x49\xed\xc1\x94\xf6\xd9\x0d\x78\xa6\x73\x7e\x85\x5e\x99\xc3\xc4\x56\x3c\x73\x0f\xdf\xfb\x6a\xfc\x74\x9f\x69\xd5\xbc\xfd\x5a\x6a\xc7\x03\xfd\x0c\xf7\x9e\xee\x4f\x56\xa6\xfc\xe5\x9a\x29\xb7\xfa\x7f\x52\xcd\xb0\x1b\xf4\xf6\xfd\xee\xb7\xfa\xa1\x5a\xde\xf0\x65\xd8\xf0\x5e\x64\xcc\xe5\x75\x68\x99\x11\x21\xf9\x40\xc8\x1e\xf6\xaf\xf4\xe0\x6c\x38\xe8\x92\x49\x3b\x61\xa7\x76\x77\xd7\x77\x9b\x75\x06\xb3\xef\xed\x71\x1c\x83\xce\x02\xe1\x61\x6f\x3c\x69\xa5\xf4\x77\x80\x38\x1c\x34\x36\x72\xaf\xe6\x1c\x78\xe5\xe1\x94\xf4\x66\x71\x3b\xf5\x89\x6b\x40\x42\xac\x9e\xfa\xf6\xc1\x0d\xd9\x87\xef\x3d\xdd\x2d\xe8\x78\xcf\x86\xae\x48\x1b\xa9\x4f\x7e\xfd\x4e\x23\x48\x84\xf3\xae\x6f\x86\xbe\x6f\x8c\x77\x19\xf6\x76\xa7\x79\x2e\xdf\xee\x40\x04\x2c\x28\xa1\xd4\x0c\x8b\x24\x3b\x41\x88\xfa\x6d\x1c\xc1\xdc\x1d\xaa\xb4\xce\x3b\xea\x38\x7f\xe8\x03\x01\x86\xd7\x1c\x82\x71\xe5\xea\x9b\x44\xb9\x49\x8d\x54\x56\x77\x0a\xeb\x73\x3c\x61\x87\xb8\x81\x0d\x44\x10\xef\x32\xaf\x5b\x69\x57\x37\x4a\xbe\x01\x9d\x25\x44\x52\x72\x8d\x38\x83\xca\x8b\x47\x72\xf8\x6a\xd2\xbe\xc2\xb2\x9e\xce\xd6\x24\x93\xd5\x51\x16\x44\x70\x75\x9b\x04\x8a\x8f\xe2\xfd\x13\xb5\xc6\x78\xba\x06\xce\x94\x8e\x8b\x69\x92\xeb\x09\x6d\xa4\xfa\x99\xda\xe2\x73\x7f\x6c\xf3\x8f\x60\xc1\x36\xe4\x26\x34\x93\xed\x22\x2c\xbe\x1c\xb5\x66\x4f\x9f\xff\xa9\x8b\x0c\xf9\xf2\xd9\xfd\x84\x03\xfd\xf7\xb2\xb1\xcc\x6b\x57\xf7\x4f\x7b\xf5\x2c\xf7\x21\x0b\x60\xcd\x21\x80\x8a\xa1\x3a\x22\x3c\x09\x02\xcd\x48\x5b\x71\x2c\x32\x52\xe2\x86\x32\x3f\x6f\x7f\xa9\xa8\x50\xd4\x33\xf7\x91\x93\x3f\xbc\x32\x02\x2a\xbf\x2a\x00\x05\x70\x84\xf4\xca\xee\x57\x7b\x5f\xb1\x31\x7b\xb2\xef\x76\x83\xc2\x6d\x05\xc4\x8c\x45\x99\x13\x0d\x94\xc8\x6c\x17\x4e\x79\x72\x94\x31\xa3\xd0\x8f\xae\x25\x84\x60\x49\x2f\x29\xaf\x99\x3b\x7d\x87\xfb\xd6\x8c\x2a\xf5\x8c\x1e\xd5\x93\x9a\x36\xa7\xea\x5c\xa7\xcd\x88\x59\x28\x23\x9b\x43\xd4\x1d\xea\x79\xa8\x4d\x14\xdb\xf3\xff\xa8\xa1\xde\xf7\x3b\xa1\x8a\x6c\x56\x16\x28\x9d\x8a\xc3\x19\xf4\x10\x58\x76\x45\x6f\x6e\xcb\x84\xb3\x95\x31\x23\xd9\xb0\xd0\x37\xec\x86\xf2\x93\xb1\xa1\x26\x96\xd9\xc5\x13\x39\x88\x5b\x9d\x23\x3f\x0b\x2c\x99\x54\x88\xc0\x4a\xe9\x18\x19\x58\xf6\x57\x31\x34\xcd\x98\x7d\xa7\x95\x2e\x9f\xa1\x76\xe4\x86\x34\x35\x2b\xbe\xfd\x71\xc8\x6a\x92\xac\x4a\xa3\xee\x88\xb5\x40\x30\x4e\xbd\x39\x05\x03\xed\xd9\x87\x46\x09\x66\x1c\xa4\x4a\xa7\x81\x8f\xbd\x6f\x70\xdf\x71\x7a\x6d\x4e\x6e\x40\xbf\x5e\x71\xca\xb8\x6f\xe1\x75\xa9\x3f\xc9\x24\xda\xff\x71\x65\xa6\xdf\xd1\xd1\xee\x75\x3f\x75\x4b\x76\xea\xe6\x65\x42\x03\xbb\xf7\x9d\x07\xa8\xc1\xec\xbe\xd9\x3b\x1a\x7a\x8e\x84\x97\x10\x8a\x1f\x72\xa7\xc6\x23\xbe\x77\x9f\x22\x0e\x15\xa6\x02\xf4\xde\x93\xb8\x1d\x42\xc9\x2a\x8c\x3a\x62\x3c\xd3\xe0\x60\x70\x0c\xd6\x7d\x24\x52\xba\x71\x16\x5a\xec\xaf\xf8\x0e\x16\x50\xa5\x5b\x27\xa3\x8c\x1a\x9b\xac\xbd\x5b\xfd\x0b\xdc\x61\x7f\xf6\xda\x8b\xf8\xcc\xcf\x78\x33\x46\x39\x02\x03\x24\xa6\x85\xb1\xbc\xd9\x7c\x25\x40\xe2\xc1\x92\xa1\x77\x68\x02\x74\x21\x03\x86\x8a\x2e\xd0\x01\x47\x02\x59\x9a\x10\x81\x94\x50\xc3\x9e\x44\xed\x8b\x4b\xd4\xc1\x64\x2a\x4a\x14\xa9\x53\xd1\x28\xd1\x09\xb9\x1d\xec\xc7\xfa\x4e\x2c\xcd\x81\x1c\x66\x1c\xe8\x6f\x58\x12\xbe\x33\xad\x92\x2b\x61\xbd\xef\xb6\x84\xaa\x82\xa2\xb2\x6c\xca\x33\xae\x12\xb7\x6b\xdb\xb1\x7c\xab\x71\x30\xfc\x25\x3c\x05\x71\x6e\x42\xe9\x08\x0e\x1d\x65\x1e\x4a\x65\xac\x1b\x0d\x53\x12\xeb\x09\x1e\x66\x46\x8f\xdc\xd9\xf4\x03\xac\xba\x0f\x60\x28\xfa\x37\xba\xa3\x89\xfd\x0b\x61\xa9\x36\x2d\xf2\x21\x13\x9d\x5b\x22\x0b\x4b\xb0\x9b\xfc\x61\xc2\xc4\x64\x0e\x2a\x6e\x6b\xc9\x76\x9a\x05\x92\xbe\xe6\x66\x67\x84\x6f\xed\x56\x8e\x0a\x56\xc9\xbf\x41\xad\x34\xa2\xb7\x52\x29\xd4\x71\xb7\x07\x0e\x77\x34\x9f\xe0\x14\x20\x3f\x3a\x28\xaa\xef\x1f\xfd\xd4\xae\xb3\x71\x3f\xf5\x99\x59\xb1\xe8\xfb\xbb\xd8\x56\x95\xfc\x26\x0b\x87\x2c\x13\x9e\xf9\xea\x0f\x68\xf5\x17\x70\xce\xd5\xee\x6e\xed\x0b\x80\xa3\x80\x9c\xa5\xb6\x56\x1c\xfb\x6c\x58\x0b\x6c\xcf\x2b\x7b\xcc\x8a\x2c\xc3\xc3\x5a\x1b\x4d\x4e\xf9\xb5\xba\xb6\x9a\x24\x8c\xd0\xf4\x5b\xac\xfd\x61\xfc\x23\x5f\x03\x03\xae\xb1\x65\x40\x28\x1c\xb1\x69\x65\xd9\x5c\x5e\x3b\xce\x7f\x27\x37\x07\xba\x72\x16\x22\x2b\x58\x29\xd2\x2a\x21\xdc\x02\x10\x4b\x87\xb1\x4d\x86\x9d\xa5\x3d\x77\xd8\x69\x10\x74\x07\x5b\x9d\xa9\xa6\xd4\x91\x33\x38\x20\xa0\x5a\xc9\x19\x13\xd7\xa2\x5c\xb2\x42\x1b\x03\xc7\x10\xd8\x16\x16\xef\x41\x9c\x28\x80\x29\x83\xfd\x00\xb3\xf2\x2a\xfb\x0e\xe9\xec\x3b\x60\xd3\xea\x06\x2b\xfa\x34\x2e\xbc\xaf\x0e\x9e\x1e\x3c\x7d\xbf\xf9\x75\x0e\xff\xab\x7d\x72\xfe\xbf\xa7\xb3\x35\x56\x66\x3d\x97\xc6\xce\xb9\x8f\xdb\xee\x4b\xf0\xae\x7d\xb5\x1f\x79\xef\xbe\x3a\xf8\xf2\xe0\xe9\x9e\x9b\xeb\x97\xfb\x6e\xd6\x91\x5f\xee\xcb\xc8\x2f\x17\x7e\x49\x33\x12\xa6\xe1\x99\x3b\x55\x54\xa9\x09\x6d\x4e\xc9\x36\xa7\xaa\x3f\x37\x23\x63\x7d\x08\x22\xf7\xbc\x1c\xb7\x5d\xd3\x2f\xb0\x6b\xd1\x41\x28\x2d\xfb\x43\xae\x4b\xf1\x87\xe8\xfe\x5b\x3d\x6a\xdd\x1d\x65\x1d\xd8\xcd\x6a\x48\x20\xe7\xc5\xf8\xaa\x43\x50\xac\x4f\x3a\x60\xdf\x64\xc0\xdb\x02\x1b\x39\x2f\xee\x31\x0e\xf6\x93\xe9\xd5\x6b\xf5\x05\x25\x92\xd1\x50\x94\x28\x85\x6e\xdc\x9c\x12\xfa\xa6\xcb\xb8\xfe\x77\x2a\x9c\x2e\x8b\x5e\xaf\x1a\x24\xf0\x9e\xed\x0d\x8d\xd5\x25\x9f\x8b\x03\x7a\xec\x63\x69\x6b\xfa\x03\x36\xf0\x69\x64\xc5\x20\xfc\x12\xb5\xf6\xf1\x25\xd8\x3e\x5f\x12\xb8\x00\x4f\xa0\x7a\x11\x08\xd9\xc0\xcf\x8c\xea\x22\x1f\x49\xea\x6d\x07\xb0\xbf\x3e\x89\x5e\xfc\xc6\x9c\x64\xdc\x58\x99\xfc\x3d\xd3\xc9\xd5\x85\x75\xe6\x4e\x6f\xd5\x62\xdd\xa8\x8d\x35\x55\xec\xf0\xc7\x0b\x76\x2c\xcd\x55\xdd\x25\x12\x3b\xb1\x34\x0b\x06\x79\x40\x22\x26\xec\x08\x96\xf3\x64\x81\xaa\x2b\x79\x9d\x7d\x37\xaa\xe1\xce\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x67\xc1\x1b\xc3\x8d\xc4\xd7\x39\x3d\xde\x40\xa2\xee\xcc\x74\x6d\x9f\xcb\xd6\xf4\x34\xf3\xe0\xf8\x88\x81\x90\x09\xea\x6b\x0f\x88\xcc\xcd\x3e\x65\xb0\x87\x96\xba\x62\x37\x1c\x0d\x6a\xe0\xb0\x13\x76\x29\x8b\x67\xec\x24\xea\xf8\xb3\x6e\x28\xa7\x7d\x04\xf4\x55\x32\xa8\x61\xcf\x61\xe2\x8d\x63\xc8\x54\xd3\xc3\x4e\x50\xb5\x32\xcf\xd8\x8e\x78\x67\xff\xb8\x33\x62\x3b\xef\x66\xc6\xfd\x47\xd9\x19\x74\x08\xa3\xce\xa3\x4e\xc7\x53\x33\x51\xd6\xa6\x23\xfe\x60\x15\xf8\x68\xf8\x2d\xcb\x2e\x5f\x1d\xbf\x7a\x06\xba\x7c\xaa\x9d\xd5\x47\xbd\xf9\x3d\x8c\x17\xf1\xc6\x88\x0c\x90\x2b\x92\xe8\xbc\x28\x75\x2e\xa3\x62\x5b\x38\x72\x5d\x4e\x00\x1b\x22\xdb\x0b\x0c\x5b\xd8\x0c\x83\xec\xa7\x30\x9c\xdf\x52\xd1\x07\xea\x2e\x9b\xe9\x74\xc6\x34\xa6\x06\x34\xcb\xfd\xa5\x09\x37\xb9\xed\x43\xa3\x60\xc7\xf9\x7a\xc3\x38\xcd\x9c\xbe\x3a\x48\xc5\xf5\x81\x49\xf9\xd3\x11\x3c\x06\x77\xc3\xb2\x35\x27\x6e\xd8\xce\xd3\x9d\x09\xbb\x90\xb9\xcc\x78\x99\x51\x2b\x5c\x1a\xa2\xbe\xcf\x19\x0a\x7e\x40\x30\x7f\x9f\xec\xb0\x3d\xac\xb7\x07\x75\x23\x13\x1e\x7d\x2d\xa0\x8d\x42\x66\xcc\x7e\x27\xed\x92\x0d\xe0\x7e\x67\xbd\x5d\xf0\x8c\xba\xe2\xbf\x52\x59\xe7\x2c\xe5\xe6\xe6\xf0\xa3\xf9\x62\xb5\xb2\x22\x47\xe6\x4c\x97\x64\x04\x86\x5b\x3c\xa8\x8f\x54\xa4\xb6\xbc\x74\x4b\x7f\xff\x4e\xd4\x1f\x4b\xfc\xb0\x01\x80\xe6\x58\x90\x22\xc3\xd0\xd7\x8f\x06\xc9\x07\x4a\xfe\xbb\x12\xec\xf4\xd8\x33\xf1\x42\x94\x46\x1a\xeb\x58\x54\xda\x50\x0d\x24\xea\x0b\x7b\x87\x39\xff\x8f\x56\xec\xe4\xef\x17\x34\xad\xfd\x07\x48\xec\x8e\x9c\x8e\xff\xa7\x2a\x85\xd3\x88\x7a\xab\x5f\x61\xa4\xb6\xca\xe5\x3e\x67\xc7\xdc\x72\xd4\xbc\x90\x53\xe9\x1a\x08\x0b\x94\xaa\x29\x14\x28\x79\x94\xb3\x8e\xca\x33\xdb\xbc\xf6\xe3\x76\xd0\x59\x77\xe4\x6c\xf7\xf3\x37\xaf\x4f\x37\xa0\x3b\x25\x20\x6e\xe7\x2f\x75\x3a\x90\x02\x15\x0d\xe8\x45\x1e\x00\x93\x1e\xe1\xe7\x2c\x77\x4f\x62\x67\x5a\x89\x11\x7b\x2d\x78\xca\x1c\x77\xa3\x7f\xfe\x58\x4a\x7b\x5f\xac\xa7\xfa\xea\x2d\xfa\xfd\x22\x0e\x42\x08\x3f\x98\x27\xc2\x59\x84\xef\x07\x60\x94\xc0\x74\x48\x07\x98\x66\x7a\xca\x88\x59\x6c\xf2\xed\xdf\xbc\x3e\x1d\xec\xe5\xdf\xbc\x3e\xf5\xef\xee\xfe\xa9\x67\x0f\xf3\xb5\x07\x34\x1e\x6a\xdb\xe1\x79\x4b\xd9\xaf\xd5\xb9\xba\x2d\x4e\xdb\x20\xb8\xbb\x35\x30\x19\xca\x0e\xd8\x14\xcd\xaf\xa4\xea\x5c\xef\xd6\xe4\x36\xd0\x12\x27\xc0\x3f\x45\x41\x34\x40\x9d\x4b\x9f\xb1\xbc\xca\x2c\x20\xfc\xc0\x5e\x73\x9b\x0f\xf2\xc3\xfc\xae\x63\x84\x76\xc9\xd8\xb1\xc0\x70\x44\xfa\xcc\xd7\x5c\x84\x5f\xac\xff\xc1\x4b\xae\xf8\xdc\xdd\x0e\x12\x90\xe5\xf8\x67\xb4\xc9\xf7\xd0\xe9\xae\xc2\x57\xfc\x9a\xcb\x8c\x4f\x65\x26\x2d\xe8\x73\xfb\x13\xaf\xcd\x63\x5e\x3e\x4c\x79\x63\xdc\x6f\x50\xd5\x36\xa8\xad\x31\x16\x0a\x40\xf9\xb1\x3d\xf7\xdd\xc1\x8d\x63\xf5\xfb\x13\xe0\xfb\x70\x23\x20\xaf\xb7\x94\xdf\xd7\x1f\x52\x7e\x37\xa2\xa7\xc2\x7a\x3f\xef\xd8\xaf\x6b\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x02\xd8\xfc\xcc\xd5\x27\xec\x99\xde\x43\x81\x82\xb3\xd3\xf1\xf7\x7d\x55\xa8\x8f\x73\x70\xd2\xcf\xef\xe0\x30\xec\x6c\x48\x2b\x3d\x08\xb9\xea\xe1\xbc\xae\x11\x80\x94\xf1\xab\x56\xa9\x38\x9e\xac\x0b\xe2\xe5\x1e\x60\x19\x7e\xef\xce\x53\x17\x20\x09\xbc\x7a\xb3\xdf\xb0\x83\x87\xa1\x8b\x1f\xcd\x93\x05\x85\x14\x7c\xcc\x3a\x9f\xb3\x9e\xaf\x99\x88\x62\x31\xeb\x9f\xcb\xee\x86\x79\x7e\xd1\x8c\xda\x1c\x89\x62\xc1\x9e\x5f\xac\x61\x93\x58\x47\xe0\xde\xdb\x60\x2c\x67\xd7\xb0\x4c\xce\x84\x95\x9d\x88\xb0\x61\x46\x99\x6b\x25\xad\x2e\xcd\x06\xd8\x9c\x7f\xf4\x30\x8a\x9b\x1f\xcd\xed\xcf\xd7\x9e\x28\xec\x65\xf4\x29\x67\x89\xce\x32\x91\xf8\xec\x7e\x58\xe2\xf0\xb3\x35\x8e\x18\xca\x40\x30\x93\xab\xaf\xc1\x15\x43\x4e\x97\x03\xdc\x76\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x77\x0b\x7d\x33\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\x41\xec\x8c\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\x00\xce\x6f\x4c\x0d\xb1\xee\xe3\xce\xa5\xd6\x76\x15\x64\x7d\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x7b\x42\xd0\xd7\xd7\xc3\xd2\x85\x6b\x37\x6f\x83\x44\x1f\x57\x33\x7e\x28\x07\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\x8b\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x57\x62\xc9\x00\x26\x61\xa6\x4b\x68\x59\xd2\xdc\x9f\xc2\x26\x40\xbc\x83\xca\x88\x72\x42\x0a\xc7\x03\x21\x7c\x1f\x55\x04\x5e\xe4\xb5\x98\x0d\x49\xf6\xd7\x62\xb6\x8e\xea\xf4\x31\xe0\xba\x86\xf4\x38\xa7\xaf\x54\x76\x81\xb9\xb1\x88\x27\x8d\xb4\x5d\xbb\x0c\x84\x73\xf1\x40\xe8\xde\x0b\xa1\x60\x08\x14\x9d\x3e\xdd\x10\xd9\xca\xe2\xc5\x6e\x4b\x5a\x24\x7b\xef\x30\x88\xbe\x76\x56\xac\xb8\x39\xb8\xd1\xe5\x95\x54\xf3\xf1\x8d\xb4\x8b\x31\x52\xca\x1c\x00\xba\xfd\xc1\xef\xe0\x3f\x14\x45\x3e\x4c\x53\xca\x7f\xab\x8c\x98\x55\x19\x66\xa6\x99\x09\xe3\x85\xfc\x41\x94\x06\xb2\x2c\xaf\xa4\x4a\x47\xac\x92\xe9\x37\x5d\x57\x8c\x0d\x71\x5a\xba\x77\xa7\x6f\xd3\xba\xa2\x06\xf5\x3a\x16\xa3\xa5\xe7\x49\x25\x4f\xb5\xc1\x1e\x47\x8e\x54\x8d\x23\xc0\xd3\x5c\xaa\x87\x72\x02\xba\x5a\x07\x52\xa5\xdd\x28\xd9\x0a\x40\xc0\x38\x4d\xf3\x80\x3e\xa3\x30\x76\xc8\xf9\xe1\xde\x7b\x82\x4d\xcc\x29\xfb\xa7\x99\xfb\x73\x27\xc6\x92\x2f\xcd\xbf\xb3\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\x89\x3c\xf7\xb9\x3e\x5d\x22\xcf\xb0\x0e\xf9\x4f\x90\x9e\xf3\x51\x77\x1c\x7b\xc0\x3a\xf3\xc7\xf5\x83\x6d\x90\xd4\xfd\x35\xe3\x8f\xa3\xa1\xd5\xd2\x07\xfa\xef\x19\x0f\x0a\x07\x0a\x18\x72\x25\xef\x4f\x83\x1c\xf9\xba\xe1\x93\xc7\x77\x48\xb4\x52\xd4\x0b\xe0\x55\x21\xd4\x85\xe5\xc9\x55\xcf\xa8\xee\x56\xab\xfa\x8d\x69\x55\x1f\x29\x11\xc8\x6f\x51\x2c\xbc\xa3\xf4\xb7\x3a\xd9\x1b\x0f\xf9\x23\x64\xc0\xd8\xd8\xee\x25\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x01\xc8\x5a\x54\x7b\x0a\x74\xfc\xf4\x1a\x4f\xdf\xf3\x4d\x22\x66\xb8\x1c\x98\x68\xc0\x26\x47\xcd\xdd\x27\x53\x69\x6b\x5e\x69\x84\x45\xf0\x27\x82\x03\xd6\x8a\x25\x04\xf0\x00\xfa\x48\x04\x5b\x10\xe9\x2a\x8a\xe9\xc4\xfa\xaa\xd1\x80\x13\xf5\xe4\xc9\x93\x27\x88\x7d\xf3\x5f\xff\xf5\x5f\x4c\x97\xd0\x77\x33\x91\xf9\xea\x8d\x70\xd7\x9f\x9e\x3e\x9d\xb0\x7f\x1c\xbe\x7c\x01\x15\x0d\x85\x35\xd8\x8d\x0d\x47\x76\x37\x34\x7e\x6c\x46\xec\xff\xbd\x78\x75\x56\xa3\x32\x34\xbf\x05\xd3\x3c\xbc\x5e\xb3\x07\xc6\x93\x3f\xff\xf1\x8f\x13\x76\x2c\x4b\xa8\xe8\x92\x22\xf4\x57\x0f\xae\x16\x5e\x0a\xc4\xea\x01\xd4\x14\xaf\x71\xc9\xd0\xca\x90\x0a\x93\x73\x39\x5f\x58\xaa\x88\x75\x1b\x32\x93\x89\xc5\xe2\x31\x64\x6b\xbe\x7d\x3b\xb6\xcf\xa0\x86\x34\xa4\xfd\xc1\xe4\x46\x2c\x93\x57\x82\xcd\xcc\xb7\xa5\xae\x8a\x1a\xd2\x90\x9a\x0e\x53\xa1\x0c\x0e\x56\xaf\x95\x11\xf6\x91\xa7\xad\xf6\x72\x35\x37\xf6\x36\x8c\xd4\x52\x58\xa9\xbc\xb5\xc6\xf5\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\xe8\x77\x19\x7c\x3d\x29\x3b\x0a\x5c\xc5\xa3\x8c\x14\xa5\xfe\x17\x6e\x01\xa8\x45\x8e\xd8\x33\xd4\x0a\xc3\x4a\x52\xa5\x70\x14\xdd\xf2\xf5\xd4\xd4\x60\xdd\x7f\x4c\x5d\x5b\x56\x5b\x5f\x65\xd2\xb8\x47\x00\xbc\xcf\x7b\x9e\x5c\xf7\xed\x75\xbb\xd4\xe0\x7e\xa9\xd4\xca\xaf\x09\x4a\x85\xd8\x25\x35\xbc\x24\xf4\xe1\x7a\x0c\xc4\x05\x20\xe4\x1b\xba\xd7\x53\x29\x10\xa2\x91\x6f\x6d\x84\xad\x88\x34\x90\x45\xef\x9e\x0d\xcd\x18\xe1\x0d\x73\x5e\x5e\x39\xc3\x95\xb8\xcb\x84\x9d\xbb\x49\x06\xf0\x1c\x04\xf6\xbd\xc6\xc0\x66\xce\x97\xf0\x58\x52\xdc\xe0\x21\xbb\x93\xc9\x2e\x1e\x3f\x5d\x32\x63\x79\x49\x67\xc9\x7d\xfe\x79\x20\x8a\xbf\xe4\x85\x41\x84\x5b\xa7\xa9\x02\xfa\xb3\x86\xda\x75\xbb\xf0\x2c\x88\x13\xad\xb7\x28\xe0\x6c\x0c\x84\xe9\x3c\xc0\x03\x47\x00\xa7\xd5\xa7\x53\xfe\x20\xe0\xa9\xf3\x1e\x0a\x07\x5e\xed\x98\x6a\xda\x8a\x6c\xdc\x49\xdf\xa0\x0e\x48\x99\x78\x54\x0a\xc6\xfa\x8e\xa7\xc4\x38\x63\x05\x2c\x6e\x85\xf9\x78\xf5\x08\xbc\x86\xd0\x26\xf0\xea\xaf\x53\xe0\xd5\x27\x88\x8c\x57\x63\x0f\xfb\x48\x32\x12\x93\x04\x18\xca\xa8\x59\xbd\x04\xd0\x97\xae\x88\x8e\x35\x36\x71\xf5\xcd\x88\x15\xe3\x53\xa3\xb3\xca\xe2\x4f\xeb\x2f\x63\xe9\x07\x83\x7a\x7c\x6c\x10\x79\xe1\xb6\x48\x16\x82\x16\x80\xe2\xa3\x8f\x58\xc4\xab\x37\xdb\xe8\xe3\x84\xf8\x0d\x39\x20\x7a\xd3\x39\x18\x6c\x43\xd0\xda\x0f\x16\x2a\xee\x6e\x16\x82\x52\x20\x22\xbd\xcf\x71\x53\xc7\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xa4\x1b\x71\x33\x26\x46\xf6\xf7\x25\x18\xc9\xf6\x8e\x42\x79\xbc\x4f\xbb\x3b\x55\x56\x94\x33\x9e\x88\xfd\xd8\xc7\x20\x8a\x85\xc8\x45\xe9\x08\x45\xf7\xf9\x1a\xed\x05\x57\x29\xc1\x4e\x25\xa2\x84\x13\x2c\xde\x59\x51\x3a\xa2\x1e\x5d\x9c\xb2\xb4\x94\xd7\xa2\x34\x6c\xef\xef\x00\x20\x88\x70\x53\xfb\x8f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\x94\xe7\xe1\x2a\xe2\x33\xf5\x52\x79\x6c\x2c\xb7\xac\x26\xf6\x1d\x4d\xdc\x81\x00\x11\x0a\xdc\x17\xba\x37\x63\x6c\xd3\x23\xb7\x43\x93\xa9\xc4\xe2\xc0\xdc\xb0\x52\xcc\x9d\x35\x56\x46\x30\x7d\x08\x93\xb2\xb1\xe2\x86\xe1\x0b\x4a\xea\x60\xd5\xfb\x6a\x3f\x66\x64\x57\xea\x6b\x99\x7a\x75\x08\xd1\xe8\x03\x26\x5c\xc1\x4d\x04\x5e\xc0\x8d\xd1\x89\x04\x57\x53\xb4\x34\x68\xa5\x82\xd2\xd4\x6c\xfb\xe5\xc3\xcd\x71\x98\x4c\x43\xf3\x9c\x4e\x3d\x47\xd9\x20\x02\x51\xa7\xe2\xbc\x9a\x66\xd2\x2c\x2e\x06\x0d\x89\xac\x1b\x18\x93\x12\x57\x32\x55\x6e\x8d\x8c\x18\xa1\x8c\xa4\x16\xf1\xa8\x6e\x49\xa7\x6d\x6b\x58\x06\xff\xeb\xf8\x50\x68\xa8\x86\x87\xc6\xf3\xfe\xab\xb3\x7a\x1e\x04\x56\x82\x1d\x8f\x53\xf1\x46\x15\x8d\xcf\x13\x9e\x65\x86\xf4\xdb\xd0\xcf\xc3\xcb\x1e\xd4\x50\x3d\x80\x09\xee\x0a\xe9\x36\x8c\x9f\x3d\xa4\xe0\x20\xf3\x0a\xcd\x67\xd6\xbe\x98\x89\x00\x86\xb5\xf2\x37\x41\xe3\x66\xff\x83\x40\x21\xac\xc4\xc1\x4d\xb7\xc1\xb6\x1f\xdb\xf0\xcf\xe3\x0b\xff\x7c\x9c\x9a\x8a\xba\x9d\x26\x87\x0f\xc7\x50\xa1\x85\xa1\x8d\x8a\x5a\xc4\x7a\x41\xe3\x05\xd2\x07\xd2\x34\x37\x16\x02\xc6\xf9\x1d\x5a\xea\x3e\x31\x8c\x77\xb7\x3d\x28\xa8\x62\xce\x14\x07\x0e\x35\x26\xfa\x25\xd1\x91\x22\x1b\x39\x9c\xf3\x55\xbe\x56\xcb\x74\x10\xe7\xf8\xe1\xae\x61\xa9\x4e\x2a\x67\x7c\xd5\x64\xaf\x13\x2e\xfa\x75\xe6\xfb\xbc\x5a\x05\xa5\xfa\x46\xdd\xf0\x32\x3d\x3c\xef\x54\x9b\xdb\x54\xce\xea\xb1\x62\xd5\xdb\x7f\xcc\xdc\xe7\x7c\x0a\x48\xb7\x84\x6d\xb8\x8d\xf6\xad\x1d\x22\xe6\xe6\xeb\xdc\x6d\x56\x3b\x26\x7b\xc7\x68\xde\x7d\x1d\x76\xdb\x00\xe1\x36\x40\xd8\xb8\x1e\x52\x80\xf0\x14\x03\x84\x71\x57\xdb\x06\x7b\x21\x0f\xad\xa3\xf8\x67\x11\x63\x3a\xae\x59\x2a\x6a\xe2\xed\x7a\xde\x96\xf2\x8f\x87\xb7\xde\x75\x91\xc1\xe0\x79\x2e\xe8\x65\x9f\x43\x3c\xea\x01\xc4\x93\x80\x96\x3d\xac\x42\xbc\x9a\x0c\xbf\xae\x57\x43\x94\x5a\x0c\x4c\x47\x11\xee\x42\xa7\xd4\xcd\x00\xda\x6c\x60\xcb\x80\x51\x68\x83\xa7\x7c\xb9\x29\x68\xe7\x05\x4f\x04\xf0\xb7\xa0\xfe\x0c\x12\x24\xe8\xb9\x01\xd8\x40\x9b\x80\xc1\x46\x00\xea\x9c\xf7\xd9\x0d\x6c\xb0\x1d\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x1b\xc1\x24\x0b\x91\x73\xf8\xe7\x73\x4f\x02\xc7\x1b\x9d\xf1\x60\x05\x42\xc0\x89\x32\x37\x4c\xcf\x46\x8d\x4c\xd7\x9d\xeb\xa7\x3b\xfd\x82\x0d\x6c\xb8\x38\x25\xf3\xe7\xe8\xbc\x77\xb0\x87\xb5\x09\x76\xde\x88\xed\xb8\x33\x54\x37\x7c\xf4\xb8\xf7\x21\x83\x02\xe4\x07\x52\xf8\xc1\x10\x67\xe8\x20\x6e\xd7\xe0\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x0d\xde\x7e\x8e\xc1\xdb\x48\x30\x7a\x46\xb7\x26\x90\x1b\x87\x04\x7c\x34\x77\x2a\xbc\x51\x43\x36\x8c\x0f\xe5\xfa\x38\xae\x2e\x9b\xa9\x4b\xbb\x93\xc9\xee\xae\x8f\xee\xd2\xbe\xaf\xec\x6c\xfc\x35\x13\x2a\xd1\xa9\xef\x56\x3b\x93\xa5\xb1\xa0\xee\xd5\xee\xb6\x78\x2e\xb9\x7f\x56\x9c\xfe\x04\x63\x0f\xb1\xd4\xbd\x79\x8b\x87\x24\x7c\xfe\x11\x94\x98\x5a\x75\x09\xc0\x87\x44\xa2\x80\x67\x4d\x3a\x8c\xff\xde\xb0\x4c\xe6\x92\x7a\xbd\xbb\x83\x2e\x8c\x35\x6c\x0f\x3f\x9c\x24\x45\x35\xa2\x1b\x26\xb9\xc8\x75\xb9\x1c\x85\x9b\xdc\x97\x8d\x5f\xd1\x1d\xfb\xd8\xef\xa4\x2a\x4b\xa1\x6c\xb6\xfc\x9c\x35\x20\x4f\xc4\x07\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\xcd\xad\x55\x47\x7c\xc1\x6d\x1e\xf5\x17\x08\x68\xb4\x66\x54\xc7\xc5\xdd\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x39\x7e\xdd\x35\xa0\xce\x93\xca\x6b\x69\x74\xe7\xb0\x68\x34\x50\x4c\x9e\x8b\xe0\x84\x76\x87\x4d\x57\xb6\xa8\x2c\x71\x74\x7f\x02\x3d\xca\x78\x38\x79\x2d\xe5\xf0\x69\x97\x2e\x4a\xcd\xab\xe0\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\x97\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\xbd\xa7\xce\xd5\xf2\x55\x4f\x56\x88\xd7\x78\x40\x91\xdc\x1c\x71\x90\xed\xd7\x6a\x2b\x21\x95\x1d\xeb\x72\x8c\x43\x3f\x03\xb0\xe0\x9e\x0f\xf0\xdb\x6b\xe8\xf3\x5f\xab\x01\x35\xdc\xbe\x57\xea\x37\x7c\xc0\x21\xf4\x79\x2c\x07\x28\x33\xf6\x23\x35\xcb\x64\xac\xc8\x0b\x5d\xf2\x72\xc9\x52\xf2\x66\x2e\xd7\x20\x10\x45\x10\x44\xbd\x21\x85\x61\x1e\xa9\x2c\x37\x50\x69\xdc\x1b\x51\x48\xa4\xb2\xca\x07\xc2\x13\x82\xb1\xe2\xc5\xb8\x01\xe4\x7d\x42\xed\xf7\x29\x45\x74\x1b\x05\x34\xa6\x3c\xb9\x42\x0b\x2a\xac\x16\xea\x8d\x51\x69\xfd\xce\x0e\xa5\x44\x60\x3b\x7f\x72\xec\x43\x6e\x8b\x4e\x85\x5b\x4a\x7f\x33\x8e\xdd\x70\xc2\x63\xa4\x9d\x12\x08\xeb\x8e\x54\xba\x64\x2f\x41\x01\xda\xe8\xea\xb3\x41\xb0\x42\xe4\x7f\xc4\x0b\xa7\xf5\x0d\x54\x89\xea\x87\xf3\x09\x44\x56\x83\xbd\x49\xb8\x5e\x33\x68\xb2\x55\x67\x88\x35\x34\x0b\x58\xc8\x13\x7f\x2c\x7d\xfc\xd6\x2d\xa7\x1b\x15\x75\x53\x70\x4c\x67\x06\xf3\x56\x64\x02\x7d\xa0\xc0\x36\x85\xe5\x08\x4b\x78\x19\xb5\xe6\xaf\x8c\x7b\x92\x56\xcd\x7b\xea\x07\x61\x9b\xac\x29\xee\x09\xdf\x4f\xbb\x69\x51\xbb\x6f\x2e\xc2\x9b\xd5\xfe\x0c\x28\x59\xf6\xe6\xa7\xa9\xc0\x48\xa1\xa7\x90\xaa\xad\x67\x90\x59\x11\xf5\xeb\xf1\x2d\x69\x56\x36\xaa\x92\x59\x73\xa7\xfa\xce\x13\xe1\xc5\x2b\x45\x09\x85\x2b\xdb\x6e\xfd\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xed\xb7\x47\xa7\x76\xf4\x54\x36\x86\x52\x31\x06\x51\x2c\x06\x57\x27\x42\xca\x66\xff\x0e\xaf\x75\xf6\x67\x43\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xcc\xc0\xa7\x1b\x5c\x06\x57\x12\xc9\xd9\x64\x99\x10\xb4\x93\x6c\xb4\xee\xc1\x61\xf1\x4c\x40\x51\xd5\x38\x34\xaa\xae\x1d\x12\x6c\x2a\x66\x98\xf1\x84\xbf\x01\x4f\x01\x95\x82\xa5\x22\x13\x56\x44\x1d\xe6\x0b\xec\x89\x5d\x8a\x5c\x5f\x53\x63\xd6\x37\x86\xe2\xe5\x72\xf6\x8c\xf1\xfd\x46\xc1\xb1\xa1\x96\xc7\x42\xa4\x58\x1f\x16\x35\x15\x2c\x2b\x65\x46\x6c\xba\xef\xf3\x59\xa9\xfd\x65\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe5\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\xd7\xd2\x48\x4d\x91\x2e\x3f\xee\x79\xe8\xc2\x80\xd1\xb3\xa3\x8c\xcb\x9c\xed\x19\x21\xd8\x89\xdf\x12\xf8\xcd\x05\x6a\x92\xe8\x49\x2c\x9b\x49\x75\x04\xf8\x48\xc0\x03\xee\x93\x9a\xf5\x86\x54\x05\x54\x06\xdc\xcc\xd7\x3e\x74\x3f\x2c\xd7\xfa\x39\xe9\x12\x12\xde\x7c\x0b\x20\xa1\x52\x1d\x65\xc4\x1c\x9e\x9f\x9a\xd8\xbe\xa5\x36\x8a\x38\x12\x7c\x91\x69\x35\x8f\x81\xef\xea\x9d\xe9\x98\xbc\x82\x7e\x98\xd7\x32\xad\x78\x86\xec\x9d\x26\x73\x74\x71\x8a\x3f\x97\xf3\x85\x1d\xdf\x08\xf0\x7e\xa2\x14\xac\xcf\x8c\x7f\xa8\x5c\xc9\xb4\x95\x06\xc4\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\xc3\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x86\x9d\xba\x3a\x37\xe8\xf6\x58\xf7\xdc\x08\x1f\xdb\xba\xf3\x23\x28\xc4\xdd\x3b\x04\x6f\x4c\x91\xbd\xae\xb7\xc9\xa5\xc8\x8b\x8c\xdb\x61\x52\x4b\x76\x7e\x8c\xdc\xdf\x51\xf0\xd8\x1d\x47\xae\xd2\x31\xcf\xdc\x8e\x3c\xff\xe1\x88\x2a\xdb\xf0\x80\x35\xd2\xd7\x2e\xeb\x1e\xa5\xbe\x2f\xb5\xd3\x92\xd6\x1e\x2d\xc0\x52\x9b\x8a\x14\x98\x11\x3d\x19\x7c\x14\x37\x0a\x7b\x04\xbb\x3f\xce\x7f\x38\x1a\x31\x39\x11\x13\xff\x57\xb8\xd5\x73\x43\xab\xe7\x58\xe0\x10\x2a\x68\x60\x3f\xc3\x54\x62\xe7\x6f\xfc\xdb\x7f\xfe\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\x5e\x46\x7f\xfb\xa7\x63\xae\xa5\xbb\xa1\xf9\x69\x9c\x5f\x0e\x7c\xcf\xfd\xf5\xcf\x73\x9d\x5e\x14\x22\x99\xe0\x6b\x99\x7f\x62\x96\x00\x13\xca\x3a\x5d\xfb\x5c\x43\x66\x99\x4c\x71\x97\xc3\xb3\x4b\xf1\x2f\x1f\x20\xa0\x76\xa9\xc4\x48\x12\x6e\x85\x02\x01\xe0\x0b\x8d\x95\xb6\xf8\x73\x6c\xb4\x0a\xf3\xdf\x9b\xc5\xad\x4f\xad\xd6\x70\xcc\x91\x95\x1c\x2a\x26\xde\x49\x03\xb8\x33\xf8\xae\x40\x0e\x4e\xc9\xeb\x5e\xa6\xb9\x61\x1d\x85\x03\xcc\x10\xf4\x5e\x75\x73\xfb\x83\xd2\xf6\x0f\x61\xf9\x7d\x62\x22\x76\x30\x67\xfc\x5a\xcb\x94\x55\xd0\x37\xcb\x9d\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x12\x13\x76\xe1\x64\x56\x9c\x61\x80\xd4\x53\x0c\xba\xd0\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x65\xd9\xe9\x8c\x99\x2a\x81\xe6\xbc\xa5\x18\x7b\xe9\x48\x77\xad\xf0\x98\xfa\x5d\x46\x61\xb1\x17\x1c\xed\xa7\x22\x85\x9f\x62\xab\x5f\x45\xdb\x6b\x25\xaf\xda\xcd\x53\xab\xa4\x96\x88\x40\x4c\x68\xaf\xed\x84\x60\xe6\x13\x80\xd0\x94\xa3\x80\x81\x12\x89\x30\x86\x97\x4b\xec\x86\x2a\x43\xd3\x46\x4a\x79\x05\x49\x9d\x73\x55\xc1\x00\xa5\xc0\xde\xba\x55\x02\xd4\xe1\x6c\x5a\xea\x2b\xa1\x42\x09\x81\x5b\xc5\x66\x42\x75\x9d\x35\x8a\x6d\xa7\x59\xb2\xe0\x6a\x2e\xea\x2a\xf2\x9c\xa7\x40\xfb\xef\x83\xa6\xe5\xdf\xc7\x51\x80\xcf\x9c\xc2\x22\x2d\x90\x62\xea\xe4\x53\x08\x7b\xbc\x55\x01\x07\x77\x54\xc7\x25\xdc\x2b\xc9\xac\x13\x4f\x64\xc3\x38\xc2\xfb\xbb\xc0\xc7\xa0\x50\x6c\x30\x79\x3b\x17\x96\xa7\xdc\xf2\xc1\x12\xb8\x5f\xf2\xd0\xf5\x93\x92\x3a\x60\x3b\x44\xc9\x1e\x24\x63\xbd\x2a\xa9\x0b\x19\xe3\x0a\x00\x37\x58\xf8\xd5\x07\x5c\x2a\xeb\xf6\x35\x05\x1d\x31\x2f\x1b\x74\x35\x9e\x65\xfa\x86\x90\xea\xfc\x68\xc8\xb2\x44\xca\xd2\x0a\xd4\xbe\x9a\xa5\xf5\x09\x8a\x0f\x12\x33\x71\x0b\x3d\x18\x95\x2f\xeb\xd8\x7f\xd2\xcc\xcd\x5e\xab\xa0\xa1\xac\x13\xca\x4a\xec\xa1\xef\x81\x20\x88\xf8\x95\xc2\xa3\xda\x5a\x06\x58\xa7\xb9\xb0\xa6\xce\xaa\x44\x69\xe2\x58\x24\xc9\x72\x72\x22\x80\xa8\xa1\xa5\x21\x3b\x7c\xbd\xa6\x88\x0b\x67\x34\x49\x0b\x27\xbf\x36\xbe\x32\xc3\x05\x8f\xb0\xfd\xed\x4b\x9d\xf6\x8f\x42\xb5\xfa\xb8\xd6\x03\xd7\xd5\x26\x58\x79\x64\xc0\xc9\x83\x37\x40\x4c\xde\x34\x60\x32\x50\x04\x2c\xf8\x75\x77\x77\x6a\xad\x99\x8e\x43\xb3\x36\x78\xdc\x18\x1e\x37\x7e\xda\xd7\x71\xdd\x3f\x6b\xd1\x5f\x3d\xb3\x17\x9b\x13\x1a\x20\x52\xe1\x58\xeb\xc5\x20\x81\x84\x16\x8a\x52\x18\x97\xe4\x2f\x65\x66\x84\x6c\x18\xaa\xa7\x15\xd2\x71\xcd\x67\xec\x0f\x0d\x8d\x8b\x34\xdb\x60\x0d\x63\x15\xd3\x9e\x37\x8f\x27\xb4\xf0\x1e\xce\xab\x79\xfb\x7e\x6b\x30\x50\xf5\xd6\x5b\x8d\xbe\x5a\x2a\xa8\xdf\x4e\x55\x86\x3e\xfc\xa1\x46\xd5\x6d\xe6\x52\x67\x99\xef\xdd\x8e\x16\x72\x2b\xb7\x09\xfa\x06\x61\xb4\x64\x14\xdc\x10\x41\xdf\x57\xe2\x26\x28\x76\xdc\x20\x5c\xa9\x8f\xd5\x83\xab\xc4\x27\x9c\xad\x1b\x2f\x54\x74\x1d\xaa\x25\x4e\xfd\x38\x22\x2d\xba\x17\xd8\xdc\x3d\xc8\x59\x00\x8a\x4f\x33\xcc\xc8\x09\x8a\x0f\xcc\x85\x67\x37\x7c\x69\xe0\x94\xd5\x16\x5b\x78\x3e\x61\xbd\xd7\x03\xbf\x16\xb3\x1e\xfd\xe4\xe3\x6b\xb0\x68\xfe\x70\xf1\x7c\x00\x5b\x91\xaa\x7b\x92\x6e\x3d\x4c\x87\x16\xdc\xed\x6b\xb8\xb4\x00\xc8\x8c\x84\xb4\xa8\x21\xe2\xab\x8d\xe3\x7c\x78\x7e\x0a\x03\x7b\xcb\x6d\x0e\x7f\x78\x89\x1e\x02\x85\x53\xe1\xce\x5b\x0d\x11\x05\x7b\x37\xfe\xed\x9a\xbc\xb1\x7a\xd3\x7f\x0f\xfd\x90\x28\xfe\xe2\xeb\x81\x9d\x40\x38\x3c\x3f\xc5\x27\x4e\xa0\x25\x2e\x57\x4b\xd2\xb5\xec\x42\x96\xe9\xb8\xe0\xa5\x5d\xa2\xf3\x62\xd4\x78\x5a\x28\x8a\x1c\x80\x1c\x83\x86\x86\xfb\xb4\x50\x8b\xaf\xc6\x1a\x01\xf9\x7c\xe0\x85\x22\x67\xb7\xae\xcc\x43\xa3\x48\xdf\x12\x4d\x7f\x35\x28\x12\xb7\xd0\xf1\xbe\x8b\x47\x41\x91\x34\x66\xc4\x1f\x4b\x2e\x3b\x1e\x6f\x9a\xe9\x2c\x28\x66\x41\x87\x26\x7f\x93\x8e\xeb\xc6\x82\xce\x06\xc6\xbf\x1b\x69\xc4\xe4\xcc\x09\x38\xad\xc6\x54\xad\x1e\x9c\xe3\xa4\xf7\xf9\xbc\x4f\x34\xe4\xdd\xd1\x45\xf7\x67\xfc\xac\x78\x80\x70\xd6\xd9\x9e\xd2\x0a\xcf\x3f\xde\xbb\x8f\x69\xaf\xb7\xf8\x77\xe1\x96\x09\xfb\x71\x21\x54\x2c\xfc\x62\x87\xf8\x28\x08\x61\xa9\x52\xb7\xf8\x20\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\x35\x7f\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xb8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x60\xb0\x4b\x64\xa9\x4d\xc9\x4f\xd8\x7a\x8e\x9b\x4e\x79\x72\x75\xc3\xcb\xd4\x40\xfd\x3a\xb7\x12\x5b\x1c\x8e\x1a\xc3\xee\x45\x73\x70\x4f\x6f\x68\x0a\xfb\xc1\xb8\x35\x22\xb4\xb2\xab\x1f\xc3\x78\x65\x75\xce\xad\x4c\xc0\x6d\x23\x67\x91\x27\x3e\x0f\x2d\x20\x42\x24\x15\x39\x3b\xc8\x0a\x7a\x0d\xb0\xe0\x4a\x2c\xb3\xb0\x37\x9a\xc9\xdc\x69\x60\x1c\x5a\x3f\xcf\x42\xb5\xba\x8f\x19\xbc\x6f\xa6\x4e\xcd\xfc\x11\x02\x35\xd1\x5d\xe8\x10\x72\xa6\xba\x81\xe1\x43\x54\x20\xb8\xc3\xa9\x2c\x7b\xd4\x52\x90\xe8\x37\x6e\x4f\xbb\xb9\x46\x5b\x75\xe4\x96\xe7\x46\x38\xbd\xcb\xbc\x77\xc3\x9a\xc9\xba\x19\xc9\xb9\xc2\xc2\x5d\x69\xbc\x0b\x81\x32\xb1\xf7\xd2\x52\x17\x05\x39\x03\xf3\xfd\xf6\x8c\x20\xf6\x56\x5e\x0b\x03\x71\x67\x9f\xdb\xed\xc8\x30\x17\x4a\x94\xdc\x82\x27\x9f\xe0\x08\xe1\xe4\xb6\x1f\xd1\x38\x30\x13\x04\x65\xd9\x67\x6f\xa8\xc1\x7f\xd8\xb8\x21\x53\xfc\x4e\x8a\x29\x7a\x16\x49\x37\xdd\x6a\x94\xef\x1d\x66\xab\x51\x6e\x35\xca\x0e\xd7\x56\xa3\x6c\x5f\x5b\x8d\x32\xbe\x42\x32\xf2\xb0\xda\x64\x5d\x5d\x10\x25\x7e\xc4\xa9\x54\xf5\x0d\xb7\xb9\xfc\x4e\x67\xec\xb5\x48\xf4\xb5\x28\x51\x88\x9c\xbc\x2b\xb8\x72\xba\xd2\x73\x2e\x33\x27\x42\xbc\x28\xa9\xdd\x1b\xd0\x47\xa7\xe9\x62\x8f\x3c\x4a\x61\x3d\xe8\xb0\xe6\x34\x29\x42\xba\x70\xf7\x53\x20\xbf\x28\xc5\xb5\xd4\x95\xf1\x09\x5f\x95\x45\x66\x61\x2c\xe9\x33\x0b\x39\x0f\xed\xee\x42\x3a\x46\x29\x12\x5d\xa6\x35\x64\x95\xb1\xdc\x56\xa6\x59\x43\x9a\xa0\x4f\x7b\x38\x77\x66\xa0\xe3\x03\x92\x9e\x43\xca\x19\xcc\x98\x1b\xfc\xbc\xee\xbe\xc0\x4c\x3c\xfc\x70\x4a\xdb\xd0\x27\x07\xd6\x89\x89\x4e\xf5\xad\xac\x88\xb6\x2b\x6d\xac\x7b\xaf\x61\x03\x8f\xe6\x00\x9b\x87\x8f\xc3\xb0\xe3\x3a\x17\xb0\x73\x7f\xc4\xf8\x1a\x70\x35\xd9\xe0\xc0\x29\xf1\xf5\xe8\x52\x07\x9b\xd7\x60\x55\x0b\xec\xa3\x54\x2e\xb0\xe1\xab\x17\xd8\xc7\xaf\x60\x60\xa1\xa2\x6c\xf8\x73\xff\xda\x57\xb8\xb5\x4e\x3e\x89\xa5\xf7\x9d\xfc\x06\x94\x5a\x18\x47\x1a\xa6\x73\x69\xad\xf0\x09\x24\xe1\x24\x83\xc3\x3f\xae\xf0\x21\x9e\x03\xbe\x04\xcc\x12\x11\xef\x42\x0f\xa9\x48\x57\x05\x8d\xf3\x46\x1a\x30\x90\xb8\x72\x76\x2d\x22\xda\x02\xef\x18\x53\xba\xaf\xb7\xd5\xb7\x7c\xa8\xff\xb8\x5b\x3e\x14\x5f\x5b\x3e\xc4\xa0\x1b\x57\x06\xc5\x23\x83\x2a\xc6\x7e\x50\x82\xd2\xe1\x53\x91\xb1\x7f\x57\xa2\x5c\x32\xa7\xe8\xd6\x69\xa6\xd0\x6e\xcb\xc8\x94\x12\x35\xc9\x31\xd9\xd7\xba\x7c\xa0\x3a\x1e\x38\x4e\x4f\xde\x39\x3b\x01\x10\x10\x06\xe7\xfa\xed\x07\x34\x81\x8c\x70\x15\xc2\xca\xc4\xd6\x01\xe6\x88\x34\xec\x05\x67\x2a\x1c\x9e\x1d\x0f\x69\xea\x0f\x91\x3e\xc0\x86\x4b\x21\x60\x2b\x2e\x99\xf7\x90\x08\x49\x19\xbe\x01\xc1\x16\xd2\x3c\x82\xa3\x91\x5d\x89\xe5\x88\xb2\xa9\xa8\xd7\xa2\xbf\x19\x13\x13\x9b\x0d\x5f\xfa\x01\x05\x36\xaf\x81\x25\xd0\x90\xbe\x41\xbc\xfa\x36\xf8\x68\x8e\xe5\x89\x3b\x8c\x50\x1c\x58\xc8\x0e\xd0\x08\x24\xbe\x6e\x6b\x0a\x82\xbb\x15\x7a\x08\xf8\x6a\xa9\xb0\x41\xa1\x42\x0c\x38\xec\x30\xdb\x8b\x0d\xed\x9e\xc2\xcb\x2f\xe3\x47\x22\x56\x38\x82\x8d\xb2\x9c\x2b\xb1\xdc\x35\x84\xa5\xa1\x95\x59\xc8\xc2\x77\x89\x04\x3e\x49\xa7\x92\xfd\x00\xf9\x6f\x7e\x08\xe4\x88\xa7\x6a\xc4\xce\xb4\x75\xff\x39\x81\x84\x5e\x8c\xb1\x68\x61\xce\xb4\x85\x4f\x1e\x34\xb9\xf1\xd5\x3e\x12\xb1\x29\x44\x23\x21\xc4\x82\xa9\xeb\x50\xbb\xea\xd3\x3c\x81\xa8\x94\xcb\x13\x16\x46\x1a\x76\xaa\x98\x2e\x3d\x55\xad\x6f\x7c\x65\x68\x08\xef\xbd\x8e\xa2\x61\x6b\xc6\xa0\xc5\xd0\x65\x63\x2d\xde\x33\x5c\x08\xac\x49\xff\x0d\x78\xb7\x21\x12\x19\x72\x53\xa1\xf9\x12\xb7\x62\x2e\x13\x96\x8b\x72\x0e\xb8\x2b\xc9\x62\xe8\x25\x1e\x4a\x2e\xe2\x35\xa0\x74\xc4\x6b\xd0\x7d\x08\x2a\xca\x0b\xc8\x3a\xfe\x38\xea\x0f\x8e\x8d\xe2\x3a\xe7\x85\xdb\x82\xff\xc7\x49\x65\xd8\x05\xff\x17\x9a\xbb\x99\x09\x3b\x64\x46\xaa\x79\x26\x1a\xdf\x91\x3f\x33\x1e\xc6\x8d\xe0\xec\xd7\x7f\x57\xf2\x9a\x67\x02\xab\x04\xb8\x0a\xad\x57\xf4\x6c\x45\xe9\x1a\x51\x87\x37\xc7\x97\x43\x0c\x7e\xe7\x4a\x2c\x77\x46\x2b\xdb\x76\xe7\x54\xed\xd4\x10\x4e\x8d\x8d\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\x66\xec\x60\x7b\x92\x5c\xce\x47\x19\x37\x66\x08\x34\x99\x56\x41\x78\x6b\xf4\x75\x8d\x25\x2e\xa2\x7b\xea\x92\x70\xaa\x40\x19\xdc\x8f\x0e\x15\x90\x43\xe5\x03\x0f\x40\xff\x6b\xea\x67\xdd\x17\x86\x6e\x2d\x14\x38\x80\xb0\xf9\x0a\xd9\x06\xa2\x42\x9d\xa6\x73\x0b\xc5\x7f\x80\x88\x88\x9e\xb1\xe7\x75\xc3\x08\x69\xc0\x45\x25\x7d\xcd\xac\xd2\x96\x49\x95\x64\x15\x05\x43\xe0\xa7\xe0\xe0\x1a\xc6\x80\x1d\x8c\xbc\x83\x6f\xec\x7a\x58\xbf\xa3\x7d\x4a\xd1\x4a\x21\x54\x3b\xfb\x03\xf2\x6d\x42\x36\x05\x52\x7b\x93\xd4\x9a\x75\x2a\xf9\x68\x36\x3a\x49\x9a\xfa\xe5\x73\x39\x2d\x05\x3b\x5a\x70\xa5\x44\x16\xa1\xc8\x90\x33\x94\x5b\xcb\x93\x05\xc6\xec\x38\x73\xe7\x38\x13\x76\xd7\x60\x83\xfe\x9c\x27\x0b\xa9\x02\xae\x82\x0a\x68\x4a\x75\x5d\xd9\x06\x5a\x03\xf5\x35\x90\x06\xec\x2a\xb3\x4b\x6d\x65\x68\xdf\xc5\xfd\x5c\x9a\xdd\x66\x6a\x80\xf2\xf6\x3d\x35\x52\x3f\x9d\x79\xa0\x3c\xca\x65\x68\x7d\x02\xf7\xbe\xbf\x5f\x4d\x1e\x1c\xda\x52\xcd\x44\x59\xe2\x0a\x4d\x05\xfd\xa0\xd5\x63\x76\x42\x4d\x2c\x16\xfa\x86\xa5\x9a\xdd\x40\xb7\xd5\x6b\xa7\x40\x40\x2a\x92\xf1\xaa\x47\x34\x53\x48\x0c\x4c\x74\x5e\x94\x3a\x97\xc6\x97\x3f\xd2\xf6\xd8\x18\x60\x4a\x56\x75\xc6\x9c\x6d\xae\x62\x56\xa9\x66\xb3\xc7\xe7\x47\xcc\xf2\x72\x2e\xac\x7b\x06\x53\x55\x3e\x15\x3d\x71\x61\x36\x8d\x4a\x3e\x68\x17\x90\xdd\xd0\x06\xa4\x41\xb5\x0f\xf4\xf7\x60\xaf\xfd\xaf\x20\x81\x10\xd2\x14\x67\xba\xa4\x64\xcb\xf0\x25\xc1\xd0\xbb\x5d\xf8\x03\x09\xce\x4a\x59\xd3\x13\x15\xbe\x4f\x7f\x10\xdc\x0a\x3f\xfe\x78\x36\x0c\xac\xfb\x6e\x3d\xde\x6d\xbb\xee\x46\x97\x59\x7a\x23\x53\x54\xce\x0c\xdb\x73\x37\xef\xf7\xa3\xc0\x06\x51\xde\x7b\x9f\xf4\x9b\x1b\x99\x0e\x44\x7c\x18\xaa\x49\x74\x9f\x47\xed\x88\xce\x80\xea\x32\x15\xca\x3a\x66\x59\x1a\xb6\x07\xbf\xd8\x67\x27\x12\x2b\xf1\xe1\xf7\x00\xa2\x9a\x4f\xa5\xaa\x51\x1e\xea\x45\x75\xe2\xd2\xf1\x0d\x6f\xde\x1b\x61\xb1\x86\x1a\xca\x90\xb5\x5d\x30\x23\xf3\x2a\xb3\x5c\x09\x5d\x99\x6c\xd9\x73\x6b\x3f\xd6\x85\x9d\x65\xe2\x1d\x9e\xf0\xfe\x4a\x4f\x18\xaa\xa9\xfc\x40\xa2\x6d\x0d\x9c\xb2\xa2\xfd\xd4\xa9\xe0\xe9\x41\xd0\x84\x02\x10\x80\x78\x27\x12\xaa\x11\x2b\xb2\x6a\x2e\x3b\x15\x05\x6f\xfb\x20\x76\xfa\xf5\xdd\xfa\x20\xd6\xed\xde\x2a\x23\x6a\xe4\xb2\x7e\x7d\xc8\x1f\x60\xdb\xc2\xcd\xea\x97\x97\xeb\x5b\x16\xa6\xa2\x10\x2a\x05\xe8\xf4\xe7\xf5\xf9\xc3\xc9\x6f\x8c\xf6\x04\x59\x3e\x8c\xac\xf0\xf8\xe7\x0d\x29\x1d\x25\xde\x2f\x74\x96\x1a\x26\xde\xd9\x92\x3b\x71\x90\x3b\xc6\x1f\x7e\x33\x63\x5c\xf5\x65\xed\x9f\x4b\xe3\x2d\xf6\x89\x34\xd0\xf4\x33\xd5\x40\xcd\xa0\x1d\x39\x77\x4d\xdc\x87\xb3\xa6\x5e\xe3\xe3\x81\x9b\x73\xa2\x00\x25\xee\x60\x9a\x75\x68\x6b\x9a\x68\xd2\x53\x9a\xf5\x2f\xfd\x9a\x69\x9a\x35\xad\xf5\x5a\xb3\xda\xe0\x61\xdd\x76\xd6\x7c\x5c\x9d\x35\x67\x00\xf7\xd4\x1f\xfc\x98\xc6\x69\xf9\xec\xe8\x43\x52\x5b\xef\xe2\xa3\xa3\x13\x15\xc9\x64\xe8\x94\x43\x03\x11\x6c\x02\x33\x6e\x35\xea\xe2\x88\x4a\xa9\x6e\xdc\x7c\xd3\x7d\x07\xb9\xe5\x46\xd8\x3e\x9e\xe4\xa6\x82\x59\x8f\xe7\x58\x4e\xbc\xf3\xe9\x2b\xec\xde\x09\x85\x9e\x1e\x02\x89\x8d\xff\x46\xba\xa8\x6a\xdc\xe9\xb4\x50\x4f\x77\x0f\x8e\x2c\x42\x66\x19\x8e\x91\xba\xd5\x4e\xb8\xed\xd9\x90\xbe\x87\x34\xa6\xd9\xbe\x79\x73\x7a\x3c\x24\x09\xdd\x78\x5e\x5b\x85\x7f\x37\xc9\x48\xbb\x14\x00\x74\xe5\xbf\xab\xd8\xd0\x06\xe8\xc6\x40\x38\xba\x7f\x13\xd4\x99\x27\xa2\x0e\x13\x1c\x4b\x73\xd5\x1f\xe0\x7c\x65\xc8\xe6\x71\xff\xf6\xe8\x84\xd1\xa7\x77\xf2\xce\xdf\xc7\x3d\xdf\x17\x15\x7b\x9e\x88\x3a\x70\x97\x4a\x73\xb5\x01\x70\xf4\xbe\x36\x70\x91\x9e\x75\xab\xe3\x7c\x98\x91\x86\xb6\x85\xe7\x61\x54\x23\x7c\xdf\xa5\xae\xd8\x0d\xc1\x08\x92\x85\x78\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x86\x56\x7b\x28\xa7\x6f\xdd\xd9\x5e\x04\xa4\x46\xf3\x6c\xb0\xa8\xc4\xd0\x3b\xf5\x73\x09\x73\x14\xbc\xb4\x60\xc8\x0d\xb3\x91\xc2\x70\x9e\x4f\x47\x1f\xa8\xbb\xec\xa4\xd3\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\xb9\xbd\x13\x81\x8c\xc6\xbb\xe5\x79\x00\xf6\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\x4f\x77\x26\xec\x42\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\x62\xd7\x0f\x08\xd9\x2c\x4f\x76\xd8\x9e\x2e\x61\xe4\x84\x2b\x96\x09\x8f\xb9\x40\xa7\x7a\x89\x76\xc7\xfe\xc3\x60\x91\xec\xc1\x44\x8a\x90\x5b\x0e\xb4\xd7\x52\xaf\x53\x91\xbc\x6f\x80\xd6\x1e\xd7\x02\x4f\x2a\x27\x05\x27\xec\x0d\x89\x2f\xd2\x0b\x70\x33\xc0\x61\xf6\x77\x3c\xac\xc5\x7a\x78\xfe\x90\x4e\x9e\x8d\xd5\xd0\xdd\x43\x23\x74\x57\xef\xc9\x5c\xda\xd7\xa2\xd0\x03\xe8\x70\x38\x50\x2b\xbe\x20\xad\xfb\x40\x1b\x09\xed\x69\xb8\x65\x1c\x59\x52\x52\x65\xdc\x19\x75\x18\x5d\x98\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\xd8\xb7\x34\x92\x8c\xed\x80\x09\xbb\x8c\x71\xa7\xa3\x8a\x36\x02\xf7\x0d\xcf\x1a\x11\x8b\xe5\xaa\x6e\x9c\x01\x38\x9c\x5c\xb1\x53\x25\x6d\xdd\x32\x0c\xeb\x02\x32\xad\x28\xd3\xdf\xfd\x9a\xa2\x1b\x73\x89\xf9\xa8\x8a\x06\x73\x5f\x37\x47\x83\x13\x8a\x0d\x76\xc2\x54\x3a\x39\x48\x36\xac\xfc\xd5\xcb\xb3\x09\x43\xd5\xf7\xc2\x19\xc6\xc6\x0a\x7d\x90\x3c\x0c\x04\x46\x8b\xeb\xcf\x51\xd8\x86\xb6\x8f\x1e\x58\x57\x97\x8d\xae\x8c\x93\xc9\xee\x84\x39\x31\xbe\x3b\xd9\xf5\x2a\x5f\xb6\xd2\x3a\x34\x0c\x1a\xe3\x97\x37\x37\xfc\x84\xb1\x57\xbe\x6c\x12\xc0\xa7\xd6\x77\x21\x45\xfc\xc5\xa8\xe7\x64\xeb\xd8\xf8\xd2\xfd\x6a\x1a\x3f\x94\x00\xcf\xe7\xf2\x5a\x28\x7c\xb1\xcd\x71\x6a\x3f\xd5\x41\x96\x31\x7e\x73\xb2\x94\x5f\xbf\xd8\xdc\xbb\x21\xc7\x19\xe8\xcd\x88\x7d\xd1\x7b\x25\x3a\xcf\x11\xa1\x7b\x11\xc0\x64\x6a\x3c\x98\xc0\x1d\x37\x62\xe5\x23\x2e\xf9\xac\xd3\xc1\x6e\x49\x06\x3f\x54\xcb\xaa\x0f\x1f\x53\x79\xb3\xaa\xcd\xa9\xfb\xf7\x31\x23\x60\x7c\xe3\x41\x56\x49\xcc\x1e\x84\x87\x1f\xbc\x3e\x39\x3c\x7e\x79\x32\xc9\xd3\x47\xc8\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\xb2\xf7\x30\xed\x61\x74\xb8\x30\x9c\x3f\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\x76\x97\xd5\x85\xce\xf4\x7c\x7d\x03\xb4\x7b\x6c\x9b\xdf\x21\x42\xee\x98\x8f\xdd\x7e\xdc\x9c\xb1\xdb\xbd\x8f\x72\xdb\xce\xc5\xbe\xc9\x8e\x90\x35\xb5\x82\xdd\x08\xed\x8e\x3f\x03\x82\x7d\x42\x33\x62\x85\x8a\xe8\xce\x01\xf6\xe6\x9b\x50\xd4\x5d\x1d\xa2\xee\xea\x77\xb5\x2f\x36\x43\xfc\xae\xa6\x85\xe3\xe4\x5d\xdb\xf8\x37\xa9\xee\x47\x6a\x0a\x90\xa2\x14\xe3\x00\x9b\x0d\xed\xbd\x75\x19\xa9\x65\xb1\x3c\xf1\x9e\x60\xef\x37\xc6\xbb\xb2\x65\xdb\x23\x5c\x6b\xf2\xc1\x11\x8f\x58\x84\x59\xb6\xac\x5b\xa3\x90\x37\x8c\xcf\x11\x0e\xbb\xa4\x80\x5c\x51\xca\x6b\x99\x89\x39\xb4\x3d\x92\x6a\x1e\xc1\x38\xc5\xc0\x4f\xd4\x06\xa9\x19\x9c\x7a\xe9\xfe\x8a\x5a\xef\xc1\xce\x3a\x7b\x75\x09\x1d\xb4\x20\xa5\xa2\xb7\xc1\xe9\x1e\x08\x67\x7e\x3c\x1e\x83\xeb\x6f\xef\x5f\xce\xf2\x49\xb3\x7d\xf6\xa3\xa0\xe7\x68\x68\xf1\x55\x42\x9b\xfb\x85\x0e\xfd\x96\x60\xae\x35\x65\x61\x43\x63\x1a\x1f\xdd\x75\xe0\xee\x74\x1a\x35\x8a\xf2\xc6\xfd\x52\x00\x64\x77\x9d\x67\xf0\x18\xad\xa4\x0d\x09\xd0\x81\xb9\xbd\x0f\x36\xad\x3b\x23\x21\x7d\xc0\xcb\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xe2\x67\xda\xed\x63\x2c\x67\x96\xea\xca\x9f\x9a\x52\xf0\xec\x76\x89\xd1\x65\x8f\x6e\x4c\x5a\xd8\xc1\xe2\x11\x10\x2f\x70\xdc\xe2\x3b\xcf\xbc\x28\x01\x2c\x66\xf5\x3b\x3b\x8f\x9a\x62\xd2\x24\x46\xf6\x67\xef\x30\x4c\x83\xb7\x2b\x76\x7a\x71\x74\x71\xfa\x49\xa3\x7e\xb7\x09\x57\x98\xdd\xa3\xb6\x1e\xe4\xbf\xbb\x65\x55\x8d\x59\x56\x75\xfd\x25\xba\x5e\xce\x75\x69\x79\xb6\x01\xc6\x99\x2c\x78\x71\x58\xd9\xc5\xb1\x34\x80\xd6\x38\x8c\xfa\xb7\x32\x6a\x54\xaf\x88\x7d\xe8\x7c\xc3\x0d\xe9\xb7\x2f\xdd\x77\xf4\xdd\xe1\x39\xe3\x95\xdb\x8f\x96\x5a\x0c\x6d\x2c\x59\xce\xbf\xc5\x05\xd6\x40\x0f\x4a\x19\x1a\xf3\x03\x74\xf1\x77\x3d\x24\xaa\x7c\xba\xaa\xb7\x6d\x3c\x1a\x24\x17\x72\xfd\xcf\x24\x06\x2d\x95\xb4\x92\x5b\x5d\x0e\x16\x1b\x6c\x8c\x18\x1c\x86\x95\xb1\x3a\xa7\x53\x74\xea\xef\x80\x84\x2c\xd0\xdf\x56\x7e\x54\x7b\x13\xc1\xfa\xfc\xff\xd9\x7b\xd7\xee\xc6\x6d\x6b\x61\xf8\x7b\x7e\x05\x96\xdb\xb5\x6c\xa7\x92\x3c\x93\xf6\xa4\x3d\xf3\xf6\xb4\xcb\x19\xcf\xe4\xf8\x64\x2e\x7e\x6c\x27\x59\xcf\x93\xc9\x69\x20\x12\x92\x50\x93\x00\x43\x80\xf6\xa8\x97\xff\xfe\x2e\xec\x0d\x80\x20\x45\x49\xa4\x44\x5f\x26\x21\x3f\x24\x63\x8a\x04\x81\x8d\x8d\x7d\xbf\x00\xcc\xcf\x85\xd1\x15\x69\xc4\x6a\x69\x36\x23\x68\xfd\x83\x63\x73\xff\xcc\x9f\xad\x11\x1d\xaa\xd8\x27\x7f\x79\x51\x69\x8e\xb9\xd2\xc1\xd8\x59\x31\xcb\xf6\xb8\x8f\x66\x95\xe6\x3f\xf7\x43\xda\xf8\xcf\xa2\xe6\x4f\x40\x10\xfd\x9f\x82\x26\x08\xda\x77\x8f\x69\x7c\xaf\x6e\x69\x3f\x2b\xae\x62\x89\x5d\x7c\x89\x12\xef\xbc\xb5\xad\x50\x58\xa3\x1f\x21\xa2\x73\x2a\x94\xc1\x93\xaa\x3d\xe3\xd0\x06\x40\x1c\x92\x23\x1d\x65\xc7\x8f\x06\xa9\xbe\xd2\x61\x93\x42\x84\xc2\x2a\xae\xfd\x1a\x51\xe3\x8d\x4f\x87\xdd\x6f\x99\x8f\x1e\xe4\x00\xa7\xbd\x1f\xbb\xad\x1d\xcb\xe3\x51\x08\x2f\x14\x10\xc9\x1b\xae\xb4\x6b\x20\x0c\x37\xb8\xb2\xbd\xd6\x40\x17\xb8\x20\x32\x27\x3c\xfb\x1b\x8d\xe3\xfc\x05\xca\x11\x56\x57\x85\x7f\x2b\x5f\x0e\x9f\x0a\x1f\x6d\x73\xa4\x97\x99\x6d\xe2\x71\xfd\xf2\x82\x60\xa3\xf0\x3f\x7d\xf9\x0c\xf4\x82\xdf\x7f\xf1\xe5\xb3\x3d\x11\xf1\x53\xcd\x2a\x24\x7d\xdb\x44\x7b\x8f\xac\xf8\x85\x64\x91\x54\xb2\x45\x0c\x2c\x40\xda\xbd\xc2\xe4\x0c\xc3\x27\x2d\xd1\xc4\x83\x60\xb0\xd2\x73\xef\x3e\x65\xe2\x21\xeb\xe2\x57\x94\x75\x41\x7c\x36\x3e\x12\xd6\x5e\x10\x39\x1c\x10\xca\xea\xac\x12\x70\xa4\xdd\x17\x9f\x0a\xed\xde\x11\xba\xbb\x62\x72\x15\x83\xc3\x10\x3f\xd7\x3a\xbf\x4c\x4f\x3d\x7b\x77\xf5\xb7\x37\xa7\x5f\xbd\x7a\x03\x6b\xb5\x51\x81\x06\x3d\xad\x26\xb4\x4b\xcc\x7a\x7b\x74\xdf\xdd\xb8\xb5\x2b\x48\xfb\x08\x30\x10\xb5\xd0\x02\x41\xde\xbd\xbe\xea\x1a\x55\xb0\xaf\x3a\x2b\x66\x7b\x40\xef\x53\xf3\x6b\x40\xa7\x75\x96\x3f\x4e\xe6\x7c\xcf\x4e\x91\xa0\xec\x7d\xc5\x8e\x62\x70\x08\xd7\xb8\xb7\xa9\x63\x47\xdc\x20\x4f\x4e\xd6\xdb\xec\xff\x36\x10\x43\x28\xf6\xee\xf9\x7e\x50\x68\xef\x27\x43\xe6\x7d\x95\x75\x38\xc4\xb1\x9c\xf8\x68\x48\x18\xf2\x8e\xdc\x70\x55\xc3\x4f\x99\xf2\xdd\x98\x7f\x01\xd8\x9a\x35\xb5\x1e\xdc\x9f\x3b\x34\x0e\x6b\x7b\x70\xbb\xd6\x4b\x41\x54\x41\x25\xaf\x7b\x5d\x03\x4f\x17\x91\x49\xad\x21\x4c\x65\x34\xea\xb5\x21\x7c\x79\x0b\xef\x40\xe9\xbd\x4f\x91\xc1\xc0\xc4\x1f\x29\xbd\xcc\x7f\xbb\x9f\xe3\xe8\x87\xab\x57\x5a\xe9\x84\x25\xae\x7d\x79\x26\x5d\x25\x9d\xb0\x24\xcb\x93\x44\x21\xf2\xe4\xf8\x90\x67\x43\xdf\xef\x68\x6e\x78\x4c\x53\x43\xb6\x90\x5a\x8a\x9e\x73\x68\x9b\x06\xad\x12\xb6\x0b\x78\xe2\x25\x66\xba\x27\x2c\x0f\xe8\x2d\x66\x10\x79\xb7\xba\xd1\x3c\x1c\xeb\x96\xc2\x39\xd8\xab\xee\xf5\x4f\x8f\x12\x65\xf1\xf9\xd9\x23\x10\xa1\x5f\x5a\xb1\xa3\xae\x6e\xc2\x47\x0b\x94\x8d\x7b\xca\xdc\x37\x03\x39\x98\x9f\x9f\x59\x75\xc1\xa5\xe5\x2b\x7b\xac\xc8\xfa\x73\xf5\x28\xa2\x94\xcc\xf5\x9d\xcc\xfb\x2a\x1f\x57\x1d\xae\x16\x85\x69\x7f\x5b\x29\xc6\xf1\xcb\xa4\x22\xb8\xca\x4f\x9e\x92\x5c\x01\x25\xa9\xb5\x41\x5d\x47\x51\xee\x83\xa0\x7c\x3a\x84\xe4\x7e\x04\x97\xfb\xad\xc4\xf5\x68\xea\xaf\x3b\x1e\xbd\x00\xcb\x0d\x66\xcd\xa0\x06\x51\x4a\xba\x4b\xc1\xdc\x1c\x50\x9e\x47\xa1\xb3\xb9\x34\x74\x68\x37\x72\x52\x25\xb1\x6e\x24\x74\x0e\x62\xdb\xc6\x24\x31\x3b\x2b\x45\xd8\xf0\xd1\x16\xeb\x1a\x11\xec\x99\x98\xd2\xcc\x36\xcd\x8f\xe5\x9d\xb8\xa3\x79\x4c\x4e\x2f\xce\x1f\x9e\xae\xee\x9d\x09\x8a\xe7\x61\x9f\xde\x02\xd5\x5c\xd0\x72\x3c\x88\xc0\x87\x20\x21\xf3\xc7\x94\x6b\x85\xa1\xfc\x10\x8c\xaf\x43\x6b\x94\xe1\x53\x3e\x92\xc5\x50\x3a\x43\xd5\xec\x48\x81\x58\x25\x88\x8c\x34\x4d\x5c\x23\x66\xa6\xef\x18\x13\xe4\xd9\xb3\x67\xe8\xa0\x78\xf6\xc7\x3f\xfe\x91\x40\xd7\xcd\x98\x45\x3c\x5d\x7d\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9e\xbe\x7d\x43\x68\x04\xba\x1c\x56\xbe\xc5\x91\x61\x3f\xc3\x97\xd5\x88\xfc\xcf\xd5\xfb\x77\x8e\x7d\xa9\xda\xaf\x80\x2e\x7e\x79\x13\x72\x16\xc4\xde\x87\xce\x03\xaa\x17\x00\x0d\x21\x35\xa1\xb3\x19\x22\x1c\x50\x6e\xae\x1c\x31\x71\xb5\xe7\xf8\x7c\xe1\x3a\xd1\x1b\x54\x4b\x20\x29\x80\x9b\x29\x82\xc3\xc6\xd5\x71\xc4\x1c\x07\x18\xcb\x33\x11\x98\xca\x88\x24\xfc\x86\x91\x99\x82\x7e\xf4\x65\xe3\x94\x9c\x29\xa3\x80\x45\x54\x98\xd1\x71\xb0\x72\x67\x14\xdb\xb3\x36\xe6\x63\x47\x4e\xec\xd9\xb9\xbc\xea\x42\xb6\x67\xde\xb5\x10\xb3\xbd\x01\x5d\x8e\x16\x92\x0c\xb3\x0b\x9f\x6a\x24\x43\x65\xb5\x17\x7e\x3d\x88\x54\xb6\xfa\x61\x49\x19\x69\x22\xc5\x3c\xc4\xc1\x52\xfa\x70\xc1\x94\xcb\x8c\xed\x0a\x8c\x9e\x1a\xea\xf4\xd3\x9e\x0e\x89\xfb\x5b\x9a\xed\xd7\x09\xa4\x1a\xa3\xeb\xc6\xac\xd4\xa1\xa4\x53\x59\x68\x17\xb3\x67\x7f\x87\xf2\x6d\x5a\x3a\xd0\xef\x35\x85\xde\xba\x14\xf5\xd7\xf7\xaf\xa7\xa6\x5b\xd5\x98\x39\xe0\xda\x55\x91\x75\x44\x18\x8d\x16\xe4\x86\x2d\xc7\xc8\x01\x32\x0a\xd5\x23\x00\xda\x67\x06\xc6\x95\x36\xfc\xde\xf2\x1c\x1b\x6d\xd2\x6e\x85\x0b\xb0\x0c\xe4\x03\x57\x7d\xc2\x29\x5c\xca\xca\xe5\xb6\x95\x95\x08\x2c\x94\xae\x77\x65\x24\x85\xb6\x7d\x31\x7d\xef\x2a\x08\x18\xad\x15\x24\x30\x14\x86\xc5\xe6\x35\xb5\xe9\xcb\x65\x54\xa9\xe1\x28\x56\xfe\x28\xc4\xca\xdb\x50\xcf\x1d\x62\x7a\x15\xb3\x95\x91\xa8\xeb\x89\x18\x44\xa6\x2e\x78\x04\x19\x47\xe6\x71\xfb\xac\x83\x92\x07\x44\xa5\x60\x82\x62\xba\xb0\xa0\x81\x38\x61\xf3\x6d\xa6\x14\xe1\xb0\xc2\x94\xe6\x37\xcc\x15\x1a\xa6\xc9\x84\x5c\x98\x49\xfa\x6a\xf3\xd8\x4a\xf0\x16\x13\x44\x0c\x8d\x09\x2b\x41\x98\x8f\x1c\x4e\x26\x87\xc8\x2a\x1b\xea\x42\xec\x8d\x35\x7d\x76\x91\xeb\xad\x7b\x5c\x05\x95\xdf\xd2\x4c\x61\x37\x3d\xa3\x5a\x40\xc7\x4a\x09\x75\x5b\xf4\xc2\x09\x13\x74\xcf\x12\xe2\xe1\xd5\x73\x1b\xb3\x7e\x3b\xa1\xf6\xd7\x07\x75\x0f\x5f\x7b\xf5\xea\xbb\xff\x69\x8f\xdd\x4f\xd7\xf5\x3e\xb5\x38\x64\x29\x49\x5f\x1d\x19\x7b\x6f\xb9\x99\xf6\xd0\xd8\xcc\x5d\x55\xd7\x11\xc8\xb7\x95\x5a\xd2\xad\x74\x11\x5b\x4a\x3d\x61\x9f\x94\xf2\x71\x3e\x03\x92\xda\x5c\xeb\x26\xd4\xcb\x1c\x87\x31\x10\x78\x7c\xad\x63\xdf\x2e\x7b\xee\xba\x8f\x36\xf5\xfb\xab\x25\xf5\x6b\x9f\x20\x9a\xfa\x55\x35\x64\x04\x65\x25\x3c\xab\x0d\xb3\x8f\x61\xab\xb4\x84\x6e\x9d\x25\x71\x98\x90\xb7\x96\x15\x23\x92\xd3\xa9\x92\x49\xa1\x7d\x25\x8a\x06\x3e\x0d\x83\xba\xde\x9e\x58\xb4\xc9\x3d\x16\x70\x6d\x90\x57\x90\x95\xf5\xc3\xc0\xf1\xea\x91\xf8\xec\x1b\x20\x8b\xd7\xaf\x2c\x4c\x16\xaf\x1e\x77\xc1\x89\x8b\x3d\xef\x84\x1b\xd6\x57\xef\x74\x19\x91\x15\xe9\x16\x62\x64\xb5\x42\xd1\xd9\x09\xaa\x98\x43\xb9\x6b\x05\xec\xf2\xda\xdf\xaa\x6b\xd7\x65\x0d\x8c\xa7\x17\xe7\x3d\x6a\xa5\xc1\xa8\x6b\xf4\xd2\xf0\x89\x41\x33\x6d\x73\x55\x00\x7c\x8e\x9a\xa9\x11\xe9\x9d\x01\xe9\xac\x84\xa8\x75\xe9\x19\xa2\xfc\x2b\x50\x6d\x56\x16\xfe\xda\x30\xa3\x30\x99\xab\xda\xa1\x03\x8d\xc1\x25\xdb\x0a\xba\x7a\xb8\x18\x1e\x20\x71\xbf\x7c\x35\xe8\x89\x2a\x2f\x00\xfd\x3d\x32\x76\xea\x57\x95\x8b\x5e\x3a\x20\x92\x2b\x96\x18\xa6\x47\x6a\x26\x9b\x4c\xc6\x2f\xb0\xe7\x37\x15\x42\x6a\xc0\x1b\x35\x22\x09\xf4\x23\x1f\xa1\x29\xc6\x48\xa0\x41\xf4\x57\x1e\x38\x4d\x7b\x96\x39\x7b\x43\x1e\xd2\x3b\x02\x11\x40\x22\x80\xdd\x45\x3f\x98\x44\xee\x01\x9b\xcc\x55\x8a\x2a\x7d\xb6\xe5\xaf\xe0\x95\x1d\xdf\x21\x91\x8a\x16\x2c\xa5\xd8\x8f\xc4\x01\xc8\xd0\xeb\xbb\x9c\x6b\xcd\xb0\xea\x38\xcb\x53\x45\xe4\x6c\x54\xf1\x1b\x1f\xdc\x3e\x3f\xe8\x4b\x9e\x25\xf7\xa1\x50\x13\x77\x42\x77\x2d\x03\xb6\xee\xaa\xfa\x0d\x2a\xca\x85\x39\x9d\xa0\x4d\x27\xd0\x20\x49\xd4\x0c\x96\x46\x88\xb8\x45\xf8\x3f\x69\xd0\xdd\x9f\x2d\x62\x57\x1b\xc4\xc8\x0b\xa6\x83\x0d\x62\xb0\x41\xf4\x31\xe2\xbd\xd9\x20\x02\xc6\xed\x88\x69\x83\x3d\x22\x4c\xc4\x73\x46\x89\xb2\x94\x45\x50\x26\xda\xa0\xbc\x33\x47\xc8\xbc\xea\x2b\x38\x9c\x4c\x0e\x0f\x9d\x91\xc2\x9e\x8f\x42\xcf\xc6\x7f\x22\x4c\x44\x32\x46\xa4\x32\xe3\xe7\x4a\x83\x50\x5b\x6a\xe5\xe1\x5c\x52\xf7\xad\xd0\xdf\x00\x63\xf7\x8b\x12\x3d\x52\x28\x17\x92\xf2\xfa\x5e\x45\xb0\x52\xf0\xf2\x65\xc0\x2c\x00\x7d\xb5\x44\x2b\x81\x95\x21\x32\x09\x4f\xb9\xad\x4f\x68\xc8\x05\x53\x5a\x91\x23\xbc\x39\x89\xb2\x62\x64\x1f\x98\xa4\x2c\x95\xf9\x72\xe4\x1f\x32\x3f\x56\xde\xb2\x4f\x1c\x83\xd4\x16\x15\x79\xce\x84\x4e\x96\xbf\x5e\xf9\xcd\x81\xf8\x09\x8b\x6f\x1e\x2b\xf6\xc9\xfb\x68\xba\xaa\x68\x59\x36\x11\x00\xeb\x9d\x87\x36\xf0\x21\x9b\x81\x31\x2a\x8d\x3f\xe6\x2e\x13\xb7\xe4\x96\xe6\x3b\x67\x60\x34\x5d\xf7\x22\xb1\xc5\xfc\x96\x2b\xb9\x73\x0e\x5b\xe3\x90\x21\xf0\xae\x2c\x53\x46\x1b\xb1\x2c\x74\x56\x68\xcb\x5d\xdc\xd9\x76\x25\xfb\xfc\x99\xae\x09\xbe\xcf\x0f\x7a\x9c\x5c\x46\xb5\x66\xb9\x78\x41\xfe\xf7\xe8\xc3\xef\xfe\x35\x3e\xfe\xeb\xd1\xd1\x0f\xcf\xc6\xff\xf9\xe3\xef\x8e\x3e\x4c\xe0\x1f\x9f\x1f\xff\xf5\xf8\x5f\xee\x8f\xdf\x1d\x1f\x1f\x1d\xfd\xf0\xcd\xdb\xaf\xaf\x2f\x5e\xfd\xc8\x8f\xff\xf5\x83\x28\xd2\x1b\xfc\xeb\x5f\x47\x3f\xb0\x57\x3f\xb6\x1c\xe4\xf8\xf8\xaf\xbf\xed\x71\x11\x54\x2c\xdf\xf7\x46\x82\xf1\x1a\xdf\x8b\x18\x51\x1d\xbb\x67\xd4\x25\xe4\xe3\xb8\xb4\x68\x8f\xb9\xd0\x63\x99\x8f\xf1\x23\x2f\x88\xce\x8b\xbe\x48\x57\xc9\xfe\xee\x8f\xc6\x94\x42\x4c\x59\x01\xd3\x29\x36\x4f\x90\x88\x60\x60\x6a\x8f\x96\x61\xdb\xc7\xb6\xd9\x28\x6c\x7f\x1c\xec\xc1\x6d\xae\x7b\x8c\x54\xb2\xf5\x6c\x7e\xe5\x61\x4a\x57\xb6\x9b\xf2\x10\xa3\xb4\x72\x0d\x31\x4a\xab\xd7\x10\xa3\xd4\xf1\x1a\x62\x94\xdc\x35\xc4\x28\x0d\xf6\xc1\xfd\xaf\x5f\xb9\x7d\x70\x88\x51\xea\x7a\x0d\x31\x4a\x3b\x5f\x9f\x50\x8c\x12\x0a\xf9\x4d\x91\x4a\x56\xcc\x2f\xc3\x94\x9e\x6c\x94\x92\x32\xf8\x10\xb1\xd3\x28\x92\x85\xd0\xd7\xf2\x86\xed\xe9\xc8\xad\xe9\xa4\x2b\xa3\x43\x49\xc4\x35\x3a\xea\xea\xc3\x4f\x52\x61\xed\x4b\x1e\xed\x41\x7e\xec\x4f\x72\xa4\x45\xcc\x8d\x8e\xda\xf3\x61\x71\xc3\x86\x65\xb1\x45\xcc\xe2\xf2\x07\x4b\xd2\xb4\xd9\xef\x09\x39\x25\x39\x8b\x78\xc6\x0d\x03\x80\x5a\x41\x70\x1f\x8f\x8f\xef\xe2\xcc\xb5\x62\xc9\xcc\x76\xb2\x15\x65\x9a\x73\x1e\xe8\x9f\x96\xa3\x34\x7e\x06\x65\x08\xe9\x7a\x8d\x12\xb5\x90\x45\x12\x93\x9c\xfd\xdd\x09\x1f\x76\x36\xd7\xe1\x08\xa1\x49\x15\x96\x52\x7e\xd6\x0e\x4e\x33\x6e\x8b\x8a\x3d\x25\x32\xc8\x3e\x66\x3c\x87\xc3\x76\xc5\x22\x29\xe2\xbe\x2d\x24\x2b\xe3\x97\xb2\x02\xf8\x85\x58\x4c\xe2\x02\x1f\x80\x74\x4c\x9a\xf0\x98\xeb\xa5\x8f\xe7\xc0\x63\x6f\xc4\x56\xec\x1d\x6c\x11\x41\x95\x1b\x41\x68\x96\xe5\x92\x46\x0b\xa6\x82\xaf\xa1\x10\x6a\x0b\x65\xf8\x2c\xcf\xa4\x98\x73\x81\x72\x28\xbc\x63\x84\x95\x64\x49\x72\xa9\x5d\x68\xda\x9a\x0f\x5e\x07\x83\xc1\xeb\x28\x71\xe8\x7c\x09\xf1\x6b\x32\x1c\x02\x67\xc5\x67\xe1\x1f\x8a\xc8\x24\x76\xa5\x59\xff\xf4\xcc\x08\xfe\x91\xc5\x62\xc3\x04\xa0\x68\xa6\x96\x24\x31\xc2\x93\x61\x0c\xeb\x5f\xfe\xe2\x0f\x64\x21\x8b\x5c\x4d\xc2\x62\x7f\xcf\xe1\x1e\x5a\x38\x9c\xe2\xa0\x49\xc2\xa8\xd2\xe4\xf9\x33\x92\x72\x51\x18\x8e\xdf\x13\xe2\xf5\x25\xeb\x06\x52\xee\x97\x7f\xd8\x73\xb4\x7e\xe4\xdb\xb5\x92\x6d\x86\x1d\xf3\xac\x78\x6b\xcf\x38\x16\xf4\xc0\xae\x99\x35\x61\xd7\xb2\xa4\x70\x17\x85\x96\x8f\x7c\xf2\x7f\x2e\xe4\x74\xa9\xf7\x2f\x61\x63\xc7\xa9\xd6\xae\xf9\x3f\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x1d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\x9d\x3a\x7c\x97\x35\x6f\x76\x78\x79\x5f\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf1\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\xdd\x0b\x58\xfb\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xe9\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x91\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xc7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x67\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x61\x22\x26\xdf\x2a\x07\xb8\x78\x29\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x1b\xbd\x53\x68\xd2\xcd\xf9\x6d\xc4\x9c\xec\x68\xde\x7b\xac\xc5\xdf\xee\x5c\xad\x8e\x34\x97\x8e\xb2\x6d\x4c\xf1\x14\x02\x4b\xf7\x9e\x4b\x28\x13\x4f\x13\x43\xe2\x96\xbe\xe6\x4f\x0d\xc1\xa6\x4b\xb0\x7b\x3d\x4a\xe5\xb1\x7c\xba\x7f\x4d\xa9\xc3\x7c\x1a\x57\x89\xd9\x25\x8d\xa5\x22\x5f\x25\x32\xba\x21\x67\x0c\x94\x86\xfb\x6c\xbe\x9f\x4f\xe3\x4f\xbb\x71\x66\x4a\xe7\xbb\x45\x8c\x8c\x49\x2a\x05\xd7\x32\xdf\x85\x1e\x3f\xa1\x42\x81\x43\x2b\xc3\x36\x15\xd3\xcd\x39\xfb\xa5\x34\x32\x34\x28\xdf\x0f\xea\xc0\x50\xde\x74\x02\x94\x07\x6f\x01\x51\xdd\x99\x8e\xfc\x66\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\x7c\xe7\x40\xa8\xbd\x01\x75\xc3\x96\x10\x55\xd6\x0b\xa8\xec\x60\x15\xcd\x5d\x4b\xb0\xb3\xc3\x7d\x23\xdf\x5d\x7e\x75\xf6\xad\x62\xf9\x24\xd4\x56\x4e\x98\x8e\x4e\x22\x96\x2d\x4e\xec\x08\x9f\x3c\x58\x1d\xd9\xec\x07\xae\x6e\x34\x14\x04\x22\x99\x24\xb6\xc0\x98\x9c\x91\x97\x2c\x5b\xf8\xcf\x3d\x0d\xb8\x7d\xca\x3d\xe5\x32\x29\xfb\x69\x37\x75\x68\x46\xaa\x92\x0d\xb8\x83\x54\x23\x40\xfe\x7c\xda\xad\x91\xf7\x53\x44\xf7\x07\xec\xce\xb2\x4b\x2b\xbe\x27\x01\xde\xa7\xd3\xd2\xef\xb0\xd2\xd3\x2f\xcc\x1f\xaa\x36\xec\x73\xd1\xa9\x15\xb2\x7d\x3e\x43\x65\x34\x66\x31\x91\xb7\x2c\xcf\x79\xcc\x14\xf1\x74\x3b\xb4\x41\xf1\xe4\x69\x40\x7e\xe8\x1d\xf8\x69\x05\x1c\x3c\x1d\xf3\xc3\x21\xd8\x1f\x2a\x44\x1c\xee\xac\x10\x71\x1a\xa7\x5c\x3c\x0d\x6c\xdf\x11\x6e\x2a\xa2\x09\x3b\x7f\xbf\xb7\xb6\x6e\xc7\xa9\x2a\xec\x57\xf6\x66\xd0\x53\x60\x4b\x9d\xfd\x6f\x3c\xee\x12\x21\xe3\xdd\x1c\x68\x8f\xac\x76\xcf\xa9\x66\x77\x3b\x0a\x42\xe3\x92\xe4\xef\xfa\x3e\xa8\x67\x9f\xb6\xda\xfe\x24\x3a\x85\x04\xa7\x1c\x4b\xfe\x3f\x96\x90\x65\xf1\xa9\x1f\x47\x12\x8e\x15\x36\x65\xab\xb7\x62\x73\x67\xf6\xf4\xe2\x9c\x7c\x8d\x8f\x3f\x5e\x17\x94\x5c\x6a\x54\x79\xce\x64\x4a\x79\x3f\x0d\xd0\xeb\x83\xd6\xfb\x61\x85\x40\xb8\xf0\xcf\x12\xfb\xb0\x11\x8a\xca\x72\xc3\x45\xce\x62\x62\xed\x29\xbf\xb0\x16\x0f\x2b\xe2\xf4\x2f\xa3\xc5\xc3\x7d\x75\xc9\x0e\x4c\xf3\x2e\x7f\xa7\x94\xa2\x1d\x3a\x81\x10\xe1\x63\x9d\x88\x62\x42\x71\x08\x6f\x08\x22\xf0\x40\xd4\x86\xb0\x74\x9f\xac\x83\x62\xf7\x88\xbc\x91\x73\x2e\x1c\x15\x93\x36\xaa\x66\x46\x79\xb2\x1f\x38\x07\x39\xf9\x57\x26\x27\x2b\x95\xbc\x12\x74\x9a\xec\x1e\x32\x59\x3d\x04\x7e\x38\xf2\x3a\xa1\x73\xc2\xe0\x8f\x93\x98\x2b\xf3\x7f\x72\x75\xf5\x06\x9c\xc1\x85\x70\xfa\x25\xb8\x39\x2d\x6f\xf1\xa9\xd1\x48\x64\x1e\x8f\x2e\x20\x11\xef\xad\x83\x47\x30\x1e\xe1\x22\x36\x4b\x67\xaa\x12\x94\x6c\x9f\xc0\x5e\x29\x3e\xef\x0e\x43\x1f\xa7\x8c\x5c\x2f\x78\x74\x73\x11\xf8\x7f\x65\x6e\xee\x89\xe0\x56\x45\x48\xa9\xff\xf6\x58\xdc\xc8\x2e\xeb\xa2\x2f\x83\x5a\x30\x9e\xe3\xd4\x8e\x9c\x5e\x59\x08\xc2\x6f\x54\x29\x19\xf1\x32\xfe\x00\x2c\xd1\x25\xfb\x8e\x81\x7d\x3f\x1e\x54\x40\xe0\xec\x07\x20\x28\xe7\x36\x48\x2d\x0e\xa3\xec\x13\x54\x85\x52\x0a\x17\x0e\x6e\x8f\x06\x04\xc4\xf1\xde\x5a\x9a\x96\xc3\xad\xb6\x34\x75\x6a\x66\xcd\x45\xee\x12\x5e\x2d\x02\x39\x95\xc1\xf6\xd0\x5e\x45\x21\xdf\xda\xd4\x36\x33\x79\x14\xd0\xed\x9e\x9a\xde\x64\xfe\xab\xc5\x07\xe1\x3d\xeb\x34\x07\xda\x93\xc9\xac\x48\x30\xb2\x76\xff\xce\xae\xce\xc7\x88\xdf\x79\x04\x27\xfa\x53\xeb\xec\x74\x18\xa6\xe7\x75\xcf\x57\xfc\x65\xf4\x77\x0a\x54\x8b\x67\x5f\xfe\xe1\x0f\x9f\x7a\xc7\xa7\xfd\x0c\x77\x8f\xdd\xf2\x69\x2f\xd7\x5b\x43\x6d\x86\xf3\xa1\x36\xc3\x50\x9b\xa1\x7a\x3d\xba\x7f\xf8\xe1\xab\x2f\xf4\x92\xdd\xd6\x47\x66\xdb\xbe\xf5\x15\xf6\xcc\x8a\xeb\x27\x23\x6e\xef\x0a\x0a\x0f\x51\x37\xa1\xa7\x1c\xb1\xfd\x6b\x24\x0c\x95\x11\x7e\x5d\x95\x11\xfa\xcb\x11\xeb\xab\x0a\xc2\xfe\xb9\x61\xbf\x9e\x8a\x07\x7b\x93\x8d\x7d\xf3\xea\xf7\xce\xa6\xef\xab\xe9\x47\x5f\xd6\xfd\xde\x2c\x0c\x87\xe5\x78\x8d\xf6\x16\x57\xe2\xcd\x55\xd3\x3f\x3c\x54\x41\xb1\x7c\x2d\x0d\x75\x79\x44\xd5\x99\xec\x6d\x79\xc0\xa9\xc8\x9d\x78\x77\x93\x15\xef\xfd\x55\x2d\x40\xc0\xdf\x7e\xfa\x71\x01\x83\x83\x7c\xbf\x30\xf5\x5f\x96\x7b\xf4\x17\xda\x01\xff\xbe\xdc\xa3\xaa\x52\x35\xd7\x59\x1d\x81\x40\x82\x08\x27\xa7\x61\x67\x9a\x92\x2c\x9c\x5e\x9c\x93\x28\x67\x50\xda\x81\x26\x6a\x42\x1a\x24\x3c\xe7\x40\xb2\x12\xa1\x93\xec\xa8\xd6\x2c\xcd\xf4\xbe\x98\x37\x78\x47\x7f\x65\xde\xd1\x7b\xf7\x52\x2c\x8a\x94\x8a\xb1\xa1\x16\xe0\x1f\xad\xc4\x9d\xd4\xf8\xe1\x84\x58\xba\x80\x62\x05\xd8\x42\x21\xa5\xb9\x10\xfc\xe7\x82\x95\xe6\x0a\x2f\x75\x3c\x01\xe7\x0e\xcc\xa3\x67\xd8\xa1\x44\x55\xa3\x22\x91\x5c\x49\xe2\xb2\x00\xf1\x70\x74\x04\x23\x10\xcb\x2a\xa6\x37\xbd\x60\x28\xbd\x5d\x40\x91\x84\xf2\xa9\xaa\x7e\x88\x0a\x22\x4d\x12\x79\x87\xdf\x0e\xe5\x11\xb3\x7f\x66\x2e\xb6\x2e\xc9\x94\x91\x94\xe7\xb9\xcc\xad\x1b\x29\x9c\x0e\x86\x0f\x19\x3d\x93\xe5\xa8\xb0\xe5\x36\xe8\xe3\x8a\x69\xbb\xd5\x80\x2a\x5a\x12\x2a\x30\x81\xd3\xfc\xdb\x45\x5c\xc3\xb7\x1d\xbd\x9b\xb2\x05\xbd\xe5\xb2\xc8\xf1\x6d\x2d\xc9\x81\xfd\x09\x78\xef\x52\x16\xde\x76\x5e\x40\x86\x96\x5f\x9d\x6a\x80\xd3\xbb\xf2\x47\x50\x70\x63\xe9\xcc\x91\x63\xf6\x91\x2b\xbd\xba\x16\x07\x22\xd7\x72\xe2\x31\x30\xef\x56\x65\x86\xc1\x7e\xb7\x73\xee\x6d\x15\xdf\xc2\xd1\xaa\x92\xea\xed\x15\xfc\xb4\x4d\x4e\xb5\x15\x6b\x30\x65\xde\xa5\xc3\x7d\x7a\x31\xac\xb8\xca\x1d\x7b\x5d\x3d\x49\x41\x79\x10\x92\x37\x5e\x3e\xca\x22\xe1\xd1\xf2\xfc\xac\xdf\xc8\x0d\x1c\xd3\xb1\x3f\xe5\xa3\x36\xcc\x7d\xf2\x15\x55\x2c\x26\x6f\xa9\xa0\x73\xb4\xba\x1c\x5d\x5d\x7c\xf5\xf6\xd8\x60\x11\x58\x75\xce\xcf\x1a\x43\x3b\xae\xc2\xc1\xdf\x3d\x56\x9e\x3b\xa9\x83\xae\x37\xb1\x61\x65\xd4\x1d\xc1\xf7\x68\x25\x00\x88\x97\x09\xf6\x69\x9f\xd6\x20\x0e\x5c\xd4\x8b\x44\x61\xf8\x86\xab\xfe\xa6\xea\xa4\xfa\x36\x8d\x6f\xee\x13\x00\x81\xdd\x7c\xd3\x2a\xdb\xf9\xc0\x5a\xf8\xb9\xaa\xdd\x48\x74\x4e\x35\x9b\x2f\xcf\x58\x96\xc8\xa5\x41\x80\x8b\xc0\x8c\x8f\x8f\x4e\x51\x6c\xc8\xa7\x34\x22\x79\x91\x30\xec\x2d\x54\x2f\xbb\x26\x18\x8b\x4b\x4a\xc7\x85\xd2\x14\x8a\xae\xe1\xf8\x1b\x67\xd4\x9a\x59\xb5\x65\x4b\x63\x9c\xe7\xd6\xa7\xaa\x25\x2a\xcd\x29\xd9\xf8\x4a\x7b\xc6\x04\x9f\xdf\x8e\xb3\x5d\xfc\x9a\xad\x3d\x98\xd5\xee\x80\x70\xca\x2f\x8b\xc4\x30\x9f\x24\xae\xb5\x78\x05\x39\xcd\xee\x31\x56\xbb\x00\x9a\x60\x66\x3f\x22\xd3\xc2\x08\x71\x4c\x55\x6c\xdc\xab\xa5\x3e\xef\x16\xe8\xd2\x36\x2f\x11\x9a\x65\x09\xc7\x10\x66\x99\x5b\xbf\x74\x60\xd0\x5c\x7d\xac\x0d\x69\xe9\x28\xcb\x74\x93\x5d\xc6\xe4\x96\xe5\xd3\x36\x75\x2a\xba\x8a\x25\x34\xe3\xe0\xc7\x69\x2d\xc5\x54\x36\xee\xf4\xe2\x1c\xdf\x6e\x32\x1c\xbb\x1f\x71\x07\xed\xde\x38\xf7\x86\xed\x19\x84\x9a\x8b\xaf\xb4\x74\x7a\x71\x8e\xa5\xbd\x6c\xb1\xa5\xd2\xfc\x61\xf4\x04\x8a\x41\x8e\x65\x85\x47\x3a\x37\x23\x6a\x22\x85\xff\x28\x13\x45\xca\xb0\x40\x53\xd9\x6c\xcc\x28\x8f\x62\x59\x8e\x5e\x5a\x4f\x8c\xae\x63\x54\x9f\x83\x83\x50\x10\xc6\xd4\x87\x3c\x98\x0f\x10\x93\x83\xcf\x2b\x4f\x19\xca\x51\x4e\xb8\x2d\xfb\xe9\x1e\x25\xd0\x31\x2a\xa0\x33\x3f\x13\x52\x5c\x5a\x50\x7d\x7b\xf9\x66\x37\x44\x78\x57\x1d\xc3\x16\xf5\x61\x50\xbf\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\xb7\x22\xe6\x08\xd8\x50\xbc\x05\xbd\x0d\x0a\x1f\x4d\x08\xf9\x1c\x77\xdf\x6e\x0e\x9e\x71\x6c\xe0\x6b\x4d\xc1\x45\x92\x8c\xc8\x8c\x43\xcb\x76\xcd\x32\x12\xba\xb5\xae\xb8\x88\x8c\x3a\x28\xc6\xbe\x23\x0f\xcc\xc8\x29\x89\xfe\xa0\x83\xd7\x14\x64\x66\x96\xc4\x50\x0c\x13\x3e\x61\x0e\x7d\x04\x26\x0b\xa3\xc5\xbe\x4c\x0a\xa5\x59\x7e\x29\x0d\x43\x09\xc2\x76\xa0\x30\x08\x0d\x7f\xfe\x8a\x8b\x18\xe2\xb4\x2e\x81\xf9\x44\x54\x10\xc6\xc1\x18\x64\x86\x04\xff\xbb\x41\x96\x12\x29\x8f\x54\x11\x2d\xcc\x92\x0e\x32\x19\xab\x03\x43\x8a\x0e\xd0\x64\xa8\x0e\x8e\xcd\x5f\xf5\x35\x60\x14\x4e\xf0\xde\x09\xcd\xf8\xc1\xf1\x88\x00\x80\xc0\x01\x28\xf5\xe2\xd3\xc5\x43\xb7\x56\xd0\xd1\x77\xc2\xc2\xcb\x70\x04\xc0\x41\x51\xba\xfa\xee\x16\x5c\x33\xdf\x5e\x1d\x2d\x4d\xbe\xd2\x4d\x9d\xe0\x13\x72\x2a\x08\x4b\x33\x0d\xd6\x6b\x92\x32\xea\x5c\xe2\xec\x96\xe5\x4b\xbd\xb0\x95\x40\x1c\x01\xf9\xe4\x81\xbe\x1f\xc0\x6b\xbd\xeb\x4b\x24\x87\x13\xb6\x02\xdc\xc3\xcf\x0f\xeb\x84\xb4\xe4\x08\x9f\x2c\x28\x81\x45\xef\x04\xc6\xef\xcc\x9b\x55\x10\xe2\x2d\xa4\x96\x9e\x7e\xbc\x79\x63\x1d\x2b\x08\xab\x6f\xb8\x88\x95\xef\xa6\x68\xe3\xbe\x2d\xbc\x1b\x81\x0c\x33\xfc\x14\x01\xbc\x2a\x02\xb7\x15\x5b\x37\x0c\xef\xa4\xfe\x75\x43\x6d\x1c\xc0\xaa\x0e\x6f\x65\xdc\x7c\x74\x2a\xfb\x7b\x1e\x3c\xec\x83\x0d\x4a\xbb\x8b\x1d\xcb\x8a\xbb\xcb\xac\x51\x27\xd8\xbc\x1d\x1b\x40\xbf\x6e\x26\xa5\xc1\x01\xe8\x64\xf0\x0b\x58\x93\xb0\xce\x39\x99\x25\x74\x5e\xa2\x11\x50\x3d\x14\xb4\x5e\x5e\x7d\xe7\x96\xa0\x08\x6f\x16\x79\xb7\xca\xc4\xdb\xa4\xe0\x71\x09\xa5\xb5\x4f\x98\x8f\x34\xfe\xb8\x5d\x14\xf6\x83\xaf\xc7\xa6\x36\xce\x46\xbd\xd1\x90\xb7\x0e\xfe\xce\x66\x47\x03\x4c\x70\x05\xdb\x9c\x62\x0a\xf1\x53\x20\x87\x5c\x7d\x57\x41\x93\x2d\xf3\x5d\x83\xb4\x37\x6c\x79\x27\xf3\xe6\x5a\xec\x3b\xe3\xd7\xc6\x2f\x26\x74\xca\x92\xed\x07\xe4\x2d\xcd\xcc\xb2\xcb\x60\x55\xd4\xde\xad\xaf\x13\xf5\x07\x8c\x2b\x73\xb1\x7c\x32\x9f\x53\xc1\xff\x81\x11\xbe\x91\x39\xc7\x32\x37\x7f\x1e\xa1\xbf\x04\x75\xff\x84\x45\xfa\xd8\xe2\x5f\x23\xdd\xdb\x82\xa0\x34\x8e\x39\x4a\x0f\x17\x5b\x70\x69\x33\x10\xb8\xb8\xb9\x0f\x98\x6f\x38\x58\xdb\x71\x7f\xb3\xc3\xb5\x05\x6d\x2e\xf2\x0d\xb1\x58\x1b\xdf\x4f\x29\xb7\x9d\x79\x9f\x1c\x54\x58\x4a\xf9\xae\xcb\xc2\x6b\x0f\xb8\xa6\x54\x17\x39\xd7\x8d\x0c\x69\xf3\x8b\x5c\x7c\x53\x4c\x99\xf5\x31\x77\x7e\x5d\x40\xa8\xe1\xe9\xc5\x79\xbf\xdb\x51\x39\xe1\x60\x09\xb0\x13\x34\x72\x0b\x29\x04\x4d\xa7\x7c\x5e\xc8\x42\x25\xcb\xd0\xb0\x49\xc1\x45\x3e\x21\xe4\x1c\x2d\x3b\xe2\x50\x13\x2a\xa4\x58\xa6\xf6\x51\x11\x25\x45\xcc\x2a\x23\x82\x27\xf1\x56\xf2\x98\xd0\x42\xcb\x94\x6a\x1e\x91\x48\xb2\x3c\x02\xaf\x63\x38\x52\xa1\x18\xa1\x6b\xde\x8d\x0a\xa5\x65\x4a\x52\x9a\xab\x05\x4d\x92\x75\x7b\xdc\x03\x57\xdb\x54\xbe\x7c\x0c\xeb\x5f\xfb\xe3\x2d\xce\x7a\x47\xfc\xde\x52\xad\xbd\x05\x7e\x9b\xc9\xed\x35\xc0\xed\x7a\x2c\x6d\x31\x86\xad\x13\xd0\x58\x01\x69\xcb\xc6\x6c\x83\xce\xa6\x93\xbb\x75\x5d\x1b\xa8\xe1\xc6\x77\x21\xd0\x97\xc5\xe7\x29\x9d\xb7\x10\x24\xdf\x18\xed\x80\x8a\xa5\x7b\x0d\x8b\x75\xaa\x11\x91\xb9\x8d\x3c\xf1\xbd\xd5\xed\x4f\xbe\xe0\x6b\x4e\xde\x83\x4b\x4f\xe6\x36\x04\xdc\x62\x29\x24\x06\xb0\x7c\x26\xf3\xd4\xc8\x75\x3c\x27\xb3\x42\x80\xa1\x4d\xd9\x88\x71\x50\x49\xac\xad\x86\x26\x4a\xfa\x13\x08\x3e\x42\xe1\x26\x41\xa8\x22\x77\x2c\x49\x26\xe4\x34\x49\x6c\x15\xd1\xa0\x5e\x44\x99\xf3\x5d\xc6\x25\x4c\x97\x24\xe6\x73\xa6\x34\x39\xba\xfa\xef\xd3\x63\xe0\xda\x60\xc7\x58\x12\x4d\x5d\xca\x5b\xd5\x3e\x03\xfc\x3f\x2e\x40\x4e\x88\xa8\xa6\x89\x9c\xa3\x6b\x1e\x6c\xbd\x22\x26\x59\x42\x97\xd0\x22\x20\xa3\x39\x44\xad\x46\x68\xa3\x21\x79\x21\xa0\x38\xf2\x83\x72\x9c\xed\xa4\x60\x53\xfd\xe2\x31\xe0\xe4\x8e\x47\x7d\x4b\x95\xd8\xfb\x65\x65\x39\xcb\x12\xba\xc6\xaa\x50\xc1\xe8\xeb\x4a\x42\xb3\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x0a\x71\x27\xa5\x3a\x42\xbf\xe8\x4f\x29\xd3\x34\xa6\x9a\x4e\x8c\x2e\xf8\x53\x35\xbb\x4e\x26\xb1\x19\x68\xfd\x46\xaf\x99\x33\xca\x8b\xcd\x4d\xf5\xab\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x68\xc6\xd8\x93\x3e\xc1\xf2\x5f\x7d\x34\xaa\xd8\x46\x3f\x5c\x65\xae\xf5\x97\xaa\x56\x86\xa4\xba\x12\x8b\xad\x29\x83\x52\x93\xd7\xb6\x9b\x92\xbb\x03\x26\xd4\xd3\x77\x67\xeb\xcd\x5d\xdb\x4d\x06\x5b\x4c\x04\x55\xe7\xc2\x86\xe9\x39\x03\xb3\xfd\xa5\xea\x61\x70\x29\x35\x90\x84\x88\x09\x2a\xd4\x55\x94\x71\x0f\xe3\x86\x55\xd3\x27\xf1\xbd\xf5\xf6\x91\x56\x2e\x9e\x36\x8e\x9d\x6d\xd9\x6a\x63\x3f\xd9\xb5\x0f\xb5\xf3\xf3\x6c\xcd\x28\x5b\x97\x31\x86\x90\x87\x04\x13\x67\x22\xf5\xc0\x6e\xeb\x17\x6b\x69\xdf\x71\x4b\xed\x30\x51\xbf\x95\x95\xe0\xa5\x1b\xb6\x3c\x54\x36\x73\x46\x0a\xb5\xe0\x19\xa6\x3c\x5a\x37\x84\xdd\x5d\xf2\x1d\x4d\x78\xec\x87\x40\xac\x3e\x17\x23\xf2\x4e\x6a\xf3\xbf\x57\x1f\xb9\xd2\xa8\x7e\x9e\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x02\x8c\x96\x6c\x38\x57\x81\x9a\xec\x16\x74\x6e\xc9\x9e\x03\x0a\x57\xe4\x5c\x18\x89\xc0\xae\xc8\xa7\x02\x2b\x3b\x84\xcb\x63\x11\x52\x8c\xc1\xc6\xdd\x38\x86\x05\x84\xcc\x2b\x70\xd8\x30\x9c\x1d\x0a\x83\x08\xe1\x17\xae\x1c\x11\xf7\x3c\x9b\x3a\xb3\x1b\x8f\x48\xca\xf2\x39\x78\x6d\xa2\x2d\x5e\x8b\xb6\xa6\xc8\x56\x06\xc8\xad\x7b\x05\x24\xf3\xcd\x5a\xc3\xc5\xca\x26\x05\xcf\x23\x59\x4a\xd1\x9a\xf1\x4f\x43\x7d\x00\x52\xff\x86\x7c\x70\x35\x21\xa7\xae\x55\x4d\xf8\x9b\xf5\x5e\x85\xc3\x98\x11\xb8\x22\x86\x94\xdc\xd2\x84\x61\xa5\x7e\x2a\x7c\xce\x96\x9c\xad\x10\xf6\x91\xcd\x0b\x37\x67\xd6\x8b\x4c\x07\x37\x6c\x79\x30\x5a\xd9\xda\x83\x73\x71\x50\x26\xee\x55\x36\xd3\x13\x51\x90\xb6\x0e\xe0\xb7\x83\xdd\x79\xc1\x46\x62\xd9\xde\xbc\xb2\x75\xdf\xd4\x0d\x6f\x76\x61\x37\x0a\x1b\x47\xea\xd8\x80\x10\xdc\xc6\x39\x49\x65\x0e\xe6\x4c\x73\x37\x2c\x11\x62\x44\xd5\x1b\x9e\x65\x65\x45\x95\x22\x9b\xe7\x34\x66\x64\x9e\xd3\x6c\xd1\x55\x2c\x41\xd9\xa6\x69\xf8\x4f\x46\xd0\x5d\x03\xfc\x0d\x1a\xdd\xc6\xf7\xee\xd8\x74\x21\xe5\x0d\xa4\xd3\x01\x22\xdc\xa3\xfd\xe1\x7b\xfc\xd6\x59\x79\xcf\xa9\x92\x8a\xc4\x4c\x53\x9e\x40\x3c\xc8\xfb\x37\x6f\x6d\xc4\x88\xe3\xe3\x6e\x96\xcd\xc1\x17\x3d\x28\x00\x34\xb6\x91\x4c\x97\xec\x96\xb3\x3b\x6b\x95\x58\x17\xeb\x31\x26\x73\x26\x20\xc0\x61\x43\x20\xd0\x98\x28\x1e\xb3\x57\x90\xbc\xbb\x7e\xa0\x3d\x0c\xe7\x6b\xe6\xbc\xed\xf0\x6e\xa6\xe0\x5b\xa9\x77\x0b\x2e\xeb\xd5\xdf\x0b\x99\x6f\x28\x26\xd4\x2e\x97\xb8\x5d\x9e\xb0\x8d\x46\x7f\x41\xfe\xf0\x87\xdf\xaf\x7d\x28\xa5\x1f\x79\x5a\xa4\x2f\xc8\x97\xff\xf1\x1f\xbf\xff\x8f\xf5\x8f\x71\x81\x8f\x3d\x5f\xbf\x3e\x7b\xda\x5e\x5e\x9e\x3d\x01\x78\xc7\x3e\x22\x6f\xb3\x53\xae\xc5\x50\x33\xca\x93\x22\xb7\xb1\xa0\x2d\x55\x84\xd7\xe1\x3b\xe0\x50\x29\x93\x27\xa8\x1b\xd1\x05\x8c\xd9\x40\xb2\x19\x17\x4c\x41\x13\x98\x42\xe4\x2c\x92\x73\xc1\xff\xc1\x62\xd7\x03\x06\x02\x3b\xa0\x5a\xbc\x43\x71\xc2\x44\x8c\xbd\x38\x0d\xcf\x5b\x50\x11\x27\x9b\x1c\xfe\x2d\x56\x1a\x9e\xe0\xbd\x40\x06\x9c\xa7\x13\xc0\xde\x96\x6f\xd4\xc0\x05\x1d\x45\xad\xfb\x09\x39\x1a\x82\x6d\xaf\x95\x22\x61\xbc\xda\xa0\x58\x37\xcc\x71\x45\xef\x43\x95\x15\xee\xfd\x5c\xb0\x7c\x09\x89\x22\xa5\x60\x1f\x04\x93\x5d\x97\x75\x08\xdc\x32\xac\x44\x85\x85\x60\x6a\xba\x70\x29\xc4\x94\xe1\x1e\xb5\x6f\xc3\x3b\x0c\xdd\xe7\xce\x91\x44\x4e\x89\x28\x92\x64\xdd\xa3\x42\x6e\x72\x39\x85\xb0\xdb\xa2\x4a\xb6\xd3\xf1\xda\x9a\x05\x1a\x20\xfd\xa0\xc6\x81\x70\xe1\x3d\x89\xf2\x4f\xdb\x5c\x10\x2e\xb8\x55\x5c\x68\xfb\x98\xd0\x76\xe5\x6e\x5a\x98\x11\xf0\xea\x12\x34\xda\xb2\x48\xcd\x7d\x1a\x16\xf0\xea\x14\x9f\xd3\xce\xc8\xd0\x30\xf5\x27\x67\x6a\xd8\x61\xf1\x6d\xcc\x0e\x0d\x4b\x1f\x8c\x0f\x2b\x00\x6f\x1b\x0d\xd5\x21\x12\xaa\xe5\x4e\xb6\x30\x4a\xe0\x35\x98\x26\x3a\x71\xa2\x16\x84\xb9\x9b\x99\xa2\xf5\xae\xe6\x8c\x8b\x5b\x89\xc5\xa2\x3b\xc9\x70\x97\x2b\x2f\xd6\x44\xb9\x3b\xa0\xac\x56\x96\xf3\xc2\x6f\x28\xd2\x1a\x85\x96\x14\x6a\xbb\xb1\x7b\xf3\x0a\x36\xe7\x8f\xf4\xa2\x83\x54\x57\x5e\x24\xec\x7b\xae\x17\xef\x5d\x71\x78\x8b\xd5\xba\xc8\x12\x58\x6c\xf0\x83\x41\xa1\xcb\x52\x32\x3c\xc7\x76\x64\x2c\x92\x69\xca\x44\x8c\x41\x44\x29\xbd\x61\xa4\x6c\x79\x69\x64\x3c\x10\x83\x61\x38\xf6\x31\xa3\xa2\x94\x13\x6f\x0d\x2d\xdf\x84\x51\x2d\xf1\xa9\x2d\xaf\x6d\x9d\x98\xb1\x39\x21\x23\xc8\xa8\xa8\x24\x5e\x90\x29\x4b\x24\xa4\x72\x63\xa4\x28\xc6\x32\xbb\x5c\x06\x43\x92\xed\x5d\xcb\xf5\x6c\xe1\x48\x26\xe6\x65\x3d\x2a\x95\x40\x73\x5a\x4b\x81\xa5\x60\x13\x72\x69\x45\x98\x76\x52\x51\x1b\x72\xda\x92\x94\xb6\x66\x88\x65\x2d\x86\xce\x90\x75\xef\x85\xb0\xbd\x75\xf7\xda\x40\xd7\x3d\xfc\x4b\x86\xaf\x6f\xdc\xd0\x0d\xbc\xd5\x23\x5d\x72\x05\x0f\xdb\x1a\xf1\x8a\xb0\xf5\x31\x98\xea\xc6\xe4\xe5\xe5\xab\xd3\xeb\x57\x23\xf2\xed\xc5\x19\xfc\xff\xec\xd5\x9b\x57\xe6\xff\x2f\xdf\xbf\x7b\xf7\xea\xe5\xb5\x91\x23\x3e\xc7\x12\xf4\x46\x8d\x33\xd0\x35\xfc\x48\x56\xa9\x05\x15\x4b\x32\x2b\xb4\x21\x07\xe5\xc7\x2a\xb3\xa0\x68\x03\xa0\x71\x6c\x54\xc6\x4f\x6e\x0f\x9b\x01\x5e\x37\x9b\x84\xbd\x37\xb0\x6a\xbf\x4d\xb8\xda\x2e\x26\xb5\x46\x92\xd6\x59\x07\x95\x29\x1f\xec\x98\x6e\xf0\x41\x90\xd7\x32\x27\xb6\x59\x19\x74\xaf\x8c\xd5\xa1\x4d\xea\x30\xff\x9e\xe0\xad\x93\x44\xce\x0f\x7d\xae\x07\x23\x89\x9c\x13\x55\x4c\x7d\x0e\x0e\x70\x53\x78\xfa\x73\xf7\x58\x25\x75\x61\xe4\x13\x71\x82\xb7\xfc\xe0\x95\x77\xc2\x07\xc2\x71\x4f\xa0\xc3\x58\xe5\x49\x73\xa3\x3e\xe0\xe7\x27\xcd\x33\x70\x82\x13\xcf\x6b\x6f\x7c\x10\x06\x5d\xef\x78\x12\x47\x34\x8f\x57\x70\x16\x98\x1b\x6e\x39\x40\x0f\xcb\xee\x62\x37\xe8\x72\x70\x5b\x2c\x43\xde\xb2\x3c\xa1\x19\x46\x88\x43\xdd\x63\x08\x3d\x82\x8f\x9c\xb1\x8c\x41\x1e\x94\xeb\x56\xce\x44\x94\x48\xa8\xcb\x81\x9c\x71\x54\x5d\x3a\x86\x22\xb9\xe2\x85\x2e\x1b\xcf\x9f\x90\x83\x27\x4b\xe6\x20\xcc\xb8\x13\xf6\x62\x60\xf2\xda\xe2\x2e\x3e\x6f\x03\x95\x46\x2f\xf9\x32\x72\x60\xb3\xcc\x0e\x46\xe4\xc0\xd7\x2f\x89\xad\x94\x7c\xf0\xf9\x41\xf9\x40\x98\xa7\x04\x42\xb2\x75\x09\x8d\xe1\x3b\x61\x46\x24\x6c\xb0\x73\x5c\xf9\x4f\x97\x35\x68\x0c\x6b\xb3\x46\x2c\x98\x43\x75\xa0\x49\x65\x22\x2b\x5f\x2d\x53\xec\xb6\x7e\xd1\x4c\x3f\x78\x5d\x43\x4a\x3b\xa6\xea\x59\xe0\xe4\xcc\xec\x86\x0b\x48\xbb\xaa\x20\x8f\x77\xbc\x85\x45\x72\x78\x4e\x32\x9a\x1b\x55\xc4\x3d\x59\x6d\x73\xf6\xf9\xd6\x26\x67\x2d\x90\x20\xf0\xaf\xb4\x94\xda\xaf\xfc\x1b\x2f\x13\xaa\x54\x83\xe5\x15\x08\x81\x19\x98\x30\x1c\x99\x50\xe7\x7c\x82\x1a\xd6\x0b\x7a\xbb\xa1\xc8\x41\x8b\x49\x6b\x9a\xcf\x99\xde\xec\x19\xa1\x62\xf9\x7e\x63\x59\xb4\x71\xeb\x42\xac\xe3\x76\xa7\xe9\xe3\xb8\x2c\xc2\x35\xe6\x42\x8f\x65\x3e\xc6\x57\x5e\x10\x9d\x17\xeb\x7c\x5c\x9a\xa7\x4c\x16\xfa\x8a\x45\x52\x34\x67\x34\xd8\xe7\x7a\x73\xf5\x74\x48\xf3\xb0\xde\xc6\x53\x27\x46\x84\x85\x0c\x9d\x62\x56\xca\x18\xce\xc3\x58\x2d\xc5\xf2\xfe\xcd\xdb\x7d\x36\x9b\x40\x2a\xf4\xe6\x9d\xfc\xce\x92\x7d\x31\xf7\x33\xb5\x33\xdf\xf8\xda\xdb\x42\x77\x7f\xe9\xa5\xf7\x5c\x6d\x7e\xda\x02\x63\x73\x39\x8d\xb5\xeb\x57\x9a\xea\x62\x05\x1b\x2a\x7b\x63\x89\xe5\x15\xa6\x94\x59\x99\xfe\x0a\xde\x0b\x8d\x7c\xab\x35\x04\xb0\x2e\x09\x3c\xe7\x82\x15\x27\xc4\xbe\x68\xce\xa7\xce\x29\x47\x05\x92\x46\xba\x80\xdc\x64\xaa\x6d\x60\xa3\x2d\xa2\xf3\x59\xd3\x32\x1a\x55\xc6\x4d\x6a\x62\xc4\x72\xad\xde\x50\xa5\xbf\xcd\x62\xba\x26\x7b\xa9\x16\xb0\xa8\x34\x1c\x18\x14\xac\xef\x04\x8b\x0d\x85\xb7\x20\xc0\xf1\xc8\x9d\x21\xbd\x05\x8e\xd8\xd5\x93\x5f\x1e\x20\xf3\xfa\xd8\x7c\xaa\x79\xd6\x97\xd2\xc0\xe4\xb4\x91\x00\x55\x43\x35\xb6\xcd\xd6\xb0\x93\x1c\x46\x23\x82\x7d\x6c\xd2\xb8\xf7\x9f\x71\xc2\xa8\x68\x0e\x97\xaf\x61\x14\x3c\xd7\x1d\x87\xec\x07\xc8\xdd\x82\x1b\x91\x15\xb3\xbc\x14\x71\x22\x54\xcc\x12\xb6\x26\xd9\x6b\xcf\x50\x52\xfb\x85\x33\xfb\x81\x56\x61\x4e\x17\xd5\x77\xbc\x41\xdf\x0a\xe1\x36\x79\xa2\x14\x96\xad\xf4\xe0\xb5\xa6\xfa\xaa\x40\x7c\x99\x26\x32\xba\xc1\xa2\x62\x90\xcf\xcf\xff\xc1\x72\x17\x77\x5e\x36\x14\xb3\x5d\xae\xe6\xae\x83\xa7\x83\x9b\x6b\x69\x04\xa3\x98\xb1\x0d\x00\xfd\xf8\x32\x2f\x2d\x8b\x85\xb0\xd9\x73\x0f\x13\xba\xea\x14\x15\x88\xd7\xaf\x78\x0e\x56\x75\x16\xac\x3f\x02\x35\x0f\xad\xca\x48\x53\x9b\xdd\x72\xf2\xcd\xfa\x4c\x90\x5e\xc3\x51\x37\xe5\xa3\xe0\x13\x00\x3e\x11\x6d\x2c\x57\xb3\x31\x73\xa5\xad\xe5\x6b\x4b\x86\x0a\x69\x2f\xa4\xfb\x29\xb7\x19\xad\xd7\xe0\xc2\xde\xbd\x7d\x6b\xd3\x00\xca\xab\x8b\x0f\xaf\x6d\xb1\xd5\x4e\x5e\x26\xd1\xa5\x28\x66\xb5\x78\x88\x57\x3b\x6c\x92\x27\x7a\xe2\x67\x32\x5f\xab\xc0\xf4\x37\xf9\xcd\xf9\x4c\x5b\x07\x32\xd2\xe7\xfa\xd8\xb5\xd5\xe4\x1d\x43\xbd\xfc\x2b\x23\x42\xc9\x82\x2b\x2d\x73\xeb\x5a\x83\x86\x64\x39\x85\x86\xa9\xcd\x31\x60\xfd\x44\xc3\xbd\xf4\x53\x20\x34\xcb\x18\xf5\xbd\x8a\x2c\x6f\x82\x66\x43\x39\x8b\x64\x1e\x37\x4e\xcc\x69\xf7\x8d\xb2\x54\xe3\xe7\x7b\xc8\xcd\x4c\xa8\xd2\xd7\x7e\x0e\x46\x40\x68\x49\x8d\xab\xe2\x8f\x5d\x62\xb9\x1a\x57\xce\x45\x8a\xf2\x47\x49\xa8\x40\xab\xc6\x7e\x32\xf8\x76\x21\xa3\x5c\x1b\x4a\x73\x3b\xad\xeb\xce\x4b\x6e\xc1\x12\x1f\x66\xe6\x29\x53\x6a\x63\xa2\x51\x2d\x48\x03\xea\x02\x13\x5f\x17\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x2a\x77\x2d\xd7\xa3\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x65\xd9\x82\xaa\xb6\x8b\xf1\xa7\xc8\x87\xf8\xb6\x3e\x0e\x2d\x67\x93\x33\xaa\x36\xa5\x4a\xd6\x60\x3b\xcd\x39\x9b\x91\x97\x34\x65\xc9\x4b\xaa\xfa\x04\x2e\x50\x80\x09\x61\x93\xf9\x84\x1c\x5e\x06\xde\xd6\x77\x52\xbf\xdd\xd4\xb7\x61\x4b\x75\x80\x36\x27\xfa\x5e\xcf\xf2\xde\x4a\xc2\xf6\x93\xbb\xe7\x99\xdd\x7b\x86\x1b\x4e\xe8\x93\x38\x9b\x9b\xf3\x7d\xd7\x9d\xc7\xea\x49\x2c\x72\xb0\xf8\x45\xbb\x9e\xc8\x2d\xc9\x8c\xeb\x4e\xe1\x53\x3e\x7f\x5b\x96\xe4\x87\xb8\x6a\x34\x99\xac\xac\xee\xba\xa2\xb9\x82\xd9\x3f\x0c\xb0\x83\x92\xdf\x66\xa6\x2f\xaf\xbe\xeb\x53\x6c\x79\xdc\x64\x7b\xbb\x81\x6b\x7f\xdf\x20\x97\x8f\x37\x73\xe1\x7d\x13\xf9\x63\x70\xb4\x18\x0c\x78\xc8\x00\x8c\x33\xf7\x55\x6b\xeb\xf0\xd5\x7a\xe1\xaf\x99\xed\x8a\x66\x9f\xa9\xe0\xc7\x11\xf4\x9f\x63\xb7\xd8\xf4\x11\x12\x3e\x18\x11\x4c\x99\x43\x71\xbc\xe1\xf3\x2d\x15\xaa\x76\xca\xd4\x76\x45\x77\xab\x12\x4b\xb6\x6f\xad\x7b\x68\xd3\x06\xe3\xd5\x56\x67\x6b\xa1\x13\x77\x50\xd6\xb6\x6b\x3c\x1d\x06\xdb\x2a\xfe\x75\x1c\xaf\xd9\x80\x5b\xbf\x6a\xd5\x81\xcd\x2b\x97\x40\xa4\xd1\x31\x1c\x19\x0a\x1c\x41\xcd\x68\xa4\xdd\x96\x3c\x55\xed\xb7\x97\x75\x1a\x08\xe1\x86\x55\x0c\xef\x6b\x59\x45\xc1\xfb\x83\xf9\xd6\x0a\x1a\xad\xc7\x7b\x02\xe5\x40\xb6\x22\xd0\xfd\x16\x2a\xc0\x6b\x1b\xd6\x3d\x3e\xbe\xb5\x29\xc8\xb4\x11\xc7\xee\xa9\x32\x8b\x62\xf9\x2d\x8b\x2b\x9e\x3a\x5b\xbb\xbd\x7a\x2f\xf0\xdb\x96\xe3\x5b\xb0\x93\x7f\xfe\xfb\xb3\xcf\xc6\xe3\xf1\x67\x65\x6c\xd6\x0b\x42\x33\xce\x3e\x6a\x86\x11\x78\x93\x9b\x3f\x41\x83\x9e\xdb\xe7\x9f\x01\xc2\x91\x97\x60\x6d\x76\x66\xd6\x33\x9f\x41\xf8\x99\xcb\xc0\x34\x1f\xa1\x42\x48\x1d\xc6\x22\x45\x52\xe8\x5c\x26\x09\xcb\xc7\x73\x26\x26\x37\xc5\x94\x4d\x0b\x9e\xc4\x2c\x87\xc1\xdd\xa7\x6f\x9f\x4d\xfe\x73\xf2\xec\x33\xe2\xf3\x2d\x8d\x64\xaf\x34\x4d\xb3\x17\x90\xf8\xf1\x99\xc5\x38\x57\x91\x2d\x4b\xa8\x50\x13\x1f\xe6\x3d\x89\x64\xce\xa4\xf9\x5f\xfa\x99\xca\x58\x64\xbe\x8d\x07\x8d\x34\x3e\x63\x4d\x67\x76\x8a\xb6\x94\x59\x09\xa6\x31\x91\x49\x0a\xff\xc6\xa5\xdb\x12\x72\x17\x89\xad\x47\x97\x70\xa5\xbf\xa9\xff\xf2\x86\x2b\x64\x97\x59\x52\xe4\x34\xa9\x4e\x15\x7e\x50\x0b\x99\xeb\x4a\xa9\xd5\x31\xe1\xc8\x1a\x15\x17\xf3\x22\xa1\x79\xe5\xad\xcf\x5c\xcc\x43\x69\xae\x33\x5c\xf2\xb6\x12\x4b\x37\xae\x04\xcb\x72\xa1\x59\xfe\x52\x26\x45\x1a\x5a\xc7\xc6\xab\x72\xe5\x8c\xe7\x4a\xdb\x1a\x77\x55\xa7\x42\x93\x5c\x0c\xdf\x0f\x70\xf4\xef\x4a\x0a\x70\x17\x92\x89\x01\xf7\x64\xfd\x4b\x3f\x3c\xfb\x31\x78\x0f\xf7\xb0\x2a\xaf\x36\x9e\x92\x86\x19\xd3\x2c\xcb\xe5\x2d\xc5\x0a\x7d\x1b\xe6\xe2\x9e\x5b\xf9\xec\xe9\xea\x0f\x6b\xbe\xdd\x3c\x64\xc5\x47\x17\x0e\x59\xf9\x41\x37\x54\x2f\xc4\x87\x6f\x9f\xd3\x24\x5b\x50\x97\x67\xa8\xa2\x05\x4b\x69\xb9\x49\x32\x63\xe2\xf4\xe2\xfc\xbb\xdf\x5f\xd5\x7e\x68\xae\x67\x68\x50\xce\xa7\xd6\x05\x95\xf5\xa9\xd3\xc5\x7c\x6a\x44\x79\x02\x56\xa6\xb9\x22\xe4\x35\x0b\x75\x46\x2a\xc7\x33\x5e\xbb\x6d\xa0\x13\xdc\x5a\x27\x5c\x05\x44\xa6\x46\xe8\xaa\x3d\xc4\xca\x80\xcf\xca\xca\x2c\xc2\xb3\xd8\xc2\xac\x8c\xde\x71\x6e\x9e\x72\xd1\xc2\xae\x69\x42\x0c\x32\xb2\xdc\x57\x41\xc2\x34\x4e\x4d\x82\xfc\x43\x1c\x0d\xcc\x15\x98\x27\xa3\x99\xd2\x10\xb7\x90\x0b\xd7\x08\x78\xe4\xfb\x99\xe7\xcc\x8c\x5b\xcd\x60\x74\x29\x19\x0d\x6d\xce\xe6\x5c\x3b\x12\x1a\xc9\x34\x2d\x04\xd7\xcb\x13\xa0\x86\x7c\x5a\x98\xdd\x38\x89\xd9\x2d\x4b\x4e\x14\x9f\x8f\x69\x1e\x2d\xb8\x66\x91\x2e\x72\x76\x42\x33\x3e\x86\xc9\x0a\x0c\xc0\x49\xe3\xdf\x78\x3a\x5e\x57\x3a\xd7\x72\x98\x26\x19\xa1\x0a\x6b\xa8\x08\xc7\x83\x7e\xe5\xd8\x52\xb9\x52\x77\x14\x2a\xdf\xbe\xba\xba\x2e\x5d\x8c\x58\x29\x08\x20\x1c\x38\xd9\x4a\x60\x1b\x40\x41\x3f\x1a\x5b\xe8\xdb\xa5\x76\xfa\x84\x4e\xa8\xf3\x9e\x70\xa3\x93\xa8\x62\x9a\x72\xad\x5c\xac\x23\x06\x0e\xbe\x04\x0e\x02\x65\x27\xd1\x52\x33\x21\xe7\xa2\xd4\xef\xef\x1d\xd4\x10\x15\x34\x36\xe0\x6b\x0f\xec\x90\x01\xae\xbe\xd0\xa0\x48\x39\x16\xb5\x76\x77\x82\x33\x7e\x95\xb1\xc8\x9f\x06\x7f\xa6\x4f\xb1\x66\xba\x2d\xce\xef\x63\x31\x25\x76\x99\x86\x97\x57\x42\x0a\x36\xe8\x75\xeb\x75\xb9\x31\x69\xa0\xa7\xd5\x9f\x1a\x62\x17\xc6\xed\xd8\x08\xd9\xa2\x90\xb9\x4f\x6f\xb7\x03\x39\xde\x60\xb5\x63\xa8\x75\xef\x19\x86\xcd\xc7\x00\x5d\x59\x84\xb0\x85\x1c\x85\x20\x50\xd8\x40\xf6\xe0\xd4\x95\x33\xc4\xfa\xf0\x6f\xa9\x28\x68\xd2\x18\xc0\xb6\x51\xbe\x73\xb0\x59\x5f\x5f\x61\x5d\x85\xdb\xf5\xa0\xeb\xb5\x56\xc3\xc6\xd9\xdb\x7c\xe9\x8d\x25\x26\xd6\x05\x78\x21\x36\x76\x2e\x4d\x11\xd4\x91\x5f\xe7\xd2\xdc\x27\x06\xe9\x20\x3c\x53\x2b\x61\x23\xc8\x40\x37\x87\x8e\x28\xcd\x32\x55\x16\xa9\xd0\x92\x44\x32\xcd\x12\xa6\xab\xbc\x17\x82\x72\xbb\xc5\x28\xd5\x63\x6e\x77\x3c\xa9\xb6\x66\xc9\xd5\x1a\x7f\xed\x18\x2d\xbb\x5d\xce\x9f\xd6\x4c\x14\x86\x0a\x5f\x55\xaa\x81\xaf\x69\xe3\x5a\x3d\x92\xeb\xdf\x0d\x6b\x14\x62\x36\x6a\xb5\x63\x90\x8b\x31\x71\x85\x87\x63\x1b\x98\x1a\x07\x69\x6b\xeb\x43\x4b\xf6\x8c\xd3\x59\x2f\xab\x34\x2f\xb3\x4c\x48\x59\xe9\x7e\xba\xe6\xfd\xad\x6a\x21\x24\xec\x6d\x8a\xc6\xab\x72\xf2\x73\x0b\xd0\xdc\xf6\x89\xa4\x24\xe3\x0c\x63\xe7\xbd\x38\x04\x00\x63\x34\xb6\x37\x0d\xc3\xcb\x99\x8f\x0f\xb7\xf6\x6e\x18\xa0\x14\x97\xa0\xaf\x0f\xc5\x40\x75\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\x6d\x32\xa1\x6d\x1d\x02\x98\x9c\x42\x48\xbb\xeb\x90\x11\x33\x65\xd0\xf3\x0a\x8c\xe7\x29\x15\x7c\xc6\x94\x9e\xf8\x1a\x21\xea\x87\x2f\x7e\x9c\x84\xa9\x01\x23\x57\xdc\xdc\x0b\x15\x16\x35\x80\x94\x9b\xc5\x94\xe5\x35\x7d\x53\xd2\x4c\xba\x4e\x22\x77\x30\x59\x4d\x6f\x0c\xfd\xc6\xc9\x16\x46\x97\xb9\x61\x2f\xc8\x01\xaa\x26\xfe\xd3\xff\x34\x62\xf8\xbf\x0f\xc8\xd1\x1d\x84\x3c\x1f\x98\x3f\x0f\xf0\x83\x5e\x06\x0c\x9b\xe9\x94\x1f\xc6\x40\xe9\x9c\xcf\xe7\x2c\xb7\xbe\x23\x30\xab\x42\xcf\x10\x0e\x6d\x40\xcb\x87\x85\xed\xa9\x56\xd6\xdc\xac\x4f\xe4\x87\x2f\x7e\x3c\x20\x47\xd5\x75\x11\x2e\x62\xf6\x91\x7c\xe1\xdd\x0f\x99\x8c\x8f\x6d\x54\x96\x5a\x0a\x4d\x3f\x9a\x31\xa3\x85\x54\x4c\x60\xc8\xb7\x96\xd8\xc6\x45\x49\xf0\x6c\x25\xc9\xd8\x36\xc9\x27\x77\x98\x36\xec\x40\x89\x69\xb8\x50\xb2\xa8\x2a\x21\x63\x0b\x5d\xf8\x9a\xd9\xb6\x39\x98\x56\x8c\xf4\x85\x7d\x5e\x30\xb1\x21\xac\x92\xa4\x0a\xdc\x24\x43\xfa\x16\x54\x80\x9b\xc5\xb6\x87\x31\xf2\xd4\x64\x9d\x4f\x72\x2b\xc6\x6f\x32\x69\x35\x88\xad\x6d\xda\x0c\x3f\x90\x50\xd8\x7a\x89\x9b\x0c\x66\x8f\xda\x49\x79\xaf\x15\x6d\x8c\x3e\x5a\x5d\x16\x86\x1c\x3d\xc0\xda\xa0\xdf\xec\xc9\xce\x4b\x73\x22\x75\x17\x4e\x70\x78\x85\x07\x3e\xaa\xbf\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x29\x8d\x91\x04\x52\xb1\xbc\x77\x34\x36\x00\x04\xaf\x6d\xb4\x1c\x5b\xbb\xdc\x98\x8a\xd8\xfc\x5b\x71\xa5\xcd\xfd\x9d\x21\xb6\xc1\x10\x5a\x85\xd2\xb7\xe7\x67\x0f\x83\xdc\x05\xdf\xf1\xb4\x4e\x0b\x11\x27\xec\x8d\x94\x37\x6b\x52\x81\x2b\x0b\xfa\x2a\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xec\x63\x68\x03\x2d\x97\x64\x45\x82\xe4\xb5\x10\x19\x8d\x6e\xe8\x9c\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x6b\x5d\xb9\xb5\xb3\x47\x6b\x80\x9d\xe7\x9a\x69\x3a\xbe\x68\xcb\x0e\x50\x37\xef\xed\xf3\xed\xc5\xaf\x5c\x91\x70\x2f\xd9\x6c\xed\x83\xbe\xb8\xfd\xba\xfc\x93\x31\xb4\xf6\x5a\xfb\xa3\x2b\x84\xdc\xf8\xc0\x76\x1f\x62\x7d\x9e\x6d\xa3\x9b\x6a\xaf\xb9\x1d\x71\x04\xc3\x42\xb9\xf2\x18\xdc\xb1\xbb\x00\xdd\xd8\xee\xa8\x02\x0a\x94\xdc\xda\xc8\x9c\x07\x29\x89\xb4\x5d\x6c\x6e\x58\xef\x0e\xc2\x73\x38\xf1\xad\x7e\xbb\xad\x82\x74\xc3\x9c\x06\x71\x7a\x10\xa7\x9f\xb8\x38\xdd\xe9\x0c\x6c\x0f\x3d\xf8\x34\x04\xec\x4e\x8b\xde\x1e\x6d\xff\x24\x45\xee\xce\x6b\x6c\x11\xfc\xff\x64\x85\xf0\x4e\x8b\x6d\x29\x90\x37\x2d\xf9\x97\x2c\x96\x77\x82\xe1\xd6\x78\x98\x27\x28\xa8\xb7\x5e\xe0\xe6\xa4\x90\x86\xf5\x05\xf9\x18\x35\x3b\xb0\x99\x34\xb6\x28\xf7\x76\xda\x50\x4c\xde\x26\x4e\xf5\x52\x01\xb6\xb7\xe8\xbb\x56\x61\x73\x6b\xcb\x12\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x1b\xe2\xcc\xcb\xb8\xe2\xbd\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x5c\x76\x9b\x44\x92\x0e\x4b\x36\x32\x7c\x96\xcb\x69\xdb\x8a\x35\xf7\xb0\xaa\x96\x51\x86\x7b\x86\xb3\x43\x76\xbe\xdf\xdf\xde\x16\xbb\x2d\x89\xa3\x61\xee\x58\xd3\xae\x12\x49\xe6\xf7\xe3\x50\xc1\x26\xdf\xc7\x4c\x77\x0e\xbe\x0c\xc4\x6a\x9c\xe4\xc8\x79\x30\xaf\xf3\x82\x8d\xc8\x6b\x9a\x28\x36\x22\xdf\x8a\x1b\x21\xef\xfa\x9b\xef\xe6\x8a\x0c\x0d\xb3\xbd\xb6\xb5\x17\x5a\xe4\x0a\xb5\x9e\x4a\xa9\xdd\xb7\x24\xf6\xe7\xfe\x05\x67\xa1\xb1\x1a\xfa\xb8\x10\xfc\xe7\xa2\xaa\xa8\x78\x27\xd3\x51\x5d\x85\x79\x79\xf5\x1d\x20\x07\xaa\xdb\xaa\x52\xd4\xd6\xfc\xa8\xd6\x87\x55\xb7\xc9\x83\xda\xa8\xa8\x56\x13\xc3\x8d\xa2\x5f\x55\xb5\x12\x5b\x9e\xb0\x6e\x96\xc9\x8a\x24\x99\x90\x73\x7d\xa8\xcc\x1c\x78\x44\x93\x64\x69\xb4\x96\x5a\xb7\xb0\xfd\x32\xb8\x5a\x30\x88\x95\xc3\x86\x15\x57\xf8\x2d\x0b\x5e\x77\x80\x46\x83\x13\x8b\xed\x3a\xf6\x2b\x99\xb8\xa1\x2f\x56\xc3\xd4\x2e\xed\xe3\x0e\x51\xc2\xfd\x2f\xa1\x6a\x07\x45\x5d\x13\x90\x46\x30\x32\x93\x85\x88\x09\xd5\xb0\x3d\x3b\xce\xb9\xea\xc3\x7d\x38\x87\xff\x66\xf9\xa9\x1f\x63\x63\xe0\x81\x2f\xf3\xf8\x36\x08\x5f\x25\x91\x63\x1f\x59\x54\x04\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\x7e\x73\x5f\x1f\x25\x31\xf5\x61\x73\x4a\xfb\x4e\x9d\xf4\x18\xd0\x3e\xaa\xbb\x9d\xa8\xd0\x43\xec\x79\x9b\xc2\x4e\xed\x2b\x13\x35\xa1\x3d\x70\x45\x7c\x6a\xca\x54\xb0\xc2\x15\xfc\x36\xf4\x84\x42\x05\x16\xc3\x64\x6c\x57\x04\xa8\x53\xb5\x90\x3b\x53\xc6\xb6\xf9\x89\x6f\x9d\xfc\x66\x3e\x08\xb2\xdd\x78\x45\xb6\xb3\xfc\xaf\x94\xed\xa0\x79\x4f\x19\x4a\x03\x4c\x32\xa5\x4b\x08\x4d\x4b\x33\x99\x6b\x8a\x0e\x8e\x42\xc4\x2c\x57\x9a\x62\x8d\x12\x97\x97\x97\x99\x35\x2f\xa8\x22\x5c\x2b\x12\xd9\x24\x43\xdc\xb0\x7b\xca\x64\x0c\x80\x7d\x61\x5e\xf0\x22\x42\xe5\xe3\xc8\x57\x2b\x1b\xb3\x71\x17\x36\x4f\x2c\xa1\x1b\x02\xab\xf6\xa5\xb3\x57\x9a\x65\x75\xba\x1a\x2c\x42\x80\x38\x7e\xcb\x63\x0c\x46\x62\x19\xe1\xa2\x1f\xa2\xba\xdd\x81\x83\x8e\x89\xf5\xc7\x6a\xec\xad\x34\x6b\x1f\xd8\xa0\xd1\x6e\x27\xea\x32\xc3\x48\xf9\x6d\x67\x7f\x73\xf7\x79\xbf\x8a\x3d\xc9\xe5\xfa\x48\x39\xbc\x56\x76\xd5\x65\x5f\x6c\xd8\xdd\x20\x56\x17\xa2\x41\x75\x6e\x25\xa9\x65\xab\x3d\x26\x0f\x5d\xe5\x66\x4b\xea\xdf\xd6\x42\x2c\xe3\x20\x70\xb0\xe5\x63\x60\x98\xdc\xf8\xec\xb6\x3c\xc2\x87\xae\xab\xb3\x67\xc5\x94\xf2\x72\x2e\xa4\x5e\x06\xdb\x6e\x65\x6f\x39\x50\xb9\x35\x3d\x0f\xd7\xc2\x3e\xde\x72\xcc\x56\x09\x80\xfd\xa7\xbd\xb1\xac\x9a\xf6\xdb\xc4\x93\x32\x9a\x6b\x1e\x15\x09\xcd\xcb\xb3\x0f\x44\x7e\x25\x6f\xa9\xf3\x9c\x95\xa6\xb9\x6e\x55\x64\xe1\xca\x3d\xe9\x6b\x2e\x42\xc1\x85\x05\x13\xde\xf9\x87\x69\x60\x64\xca\xe6\x86\x79\x66\x59\xb2\x74\x39\x06\x65\x04\x7b\xc2\x95\x2e\x9b\xff\x81\x2c\xd0\x36\x14\xa2\x73\xb9\x86\x5f\x75\x1e\x9d\x4c\xd2\x48\x8a\x19\x9f\x3f\x5c\x16\xdd\xfb\x37\x6f\x5f\xc2\x27\xe1\x5e\x99\x43\xe7\xef\xaf\x64\xd0\x95\x93\x84\xdb\x65\x92\x9c\xff\xa1\x4c\x91\xb3\xf5\x1c\x1a\xf2\xe3\x5c\xf6\x95\xdb\xcf\x1d\xf3\xae\xfc\x34\x5d\x54\x86\x67\xc5\x2a\x93\x42\x71\x23\x13\x43\xfd\x2c\x78\x08\xbb\x9f\xbc\x7f\xf3\xb6\xdf\xa4\xab\x21\xc3\x6a\xc8\xb0\x1a\x32\xac\xb6\x1d\xa8\x16\x19\x56\xfe\x34\x43\x7e\x95\x0b\xdb\x33\xff\xb6\x69\x42\xe5\x71\xf7\x35\xad\xdb\x7e\x7c\xb3\x7c\x38\x63\xd4\x80\x66\x7b\x64\xe1\x6b\xfb\x60\xd9\x85\xa7\x92\xa7\x6b\xc9\x0c\xe8\xe2\xef\xdf\xbc\xf5\xe3\xde\x43\x4e\x44\xcc\x95\xf9\xcc\x4b\x99\x71\x16\xbf\xbc\xfa\xae\x5d\x93\xe6\xb3\xfa\x5b\x95\x9c\x0e\xfc\xd1\xcc\xfc\x50\x91\x03\x7c\x88\xbc\xbc\xfa\xee\xc0\x2d\x04\x36\xa2\x6c\xe4\xe5\xb3\xda\x08\xd5\xa1\x40\x80\xf4\x7f\x44\x30\x0a\x89\x56\x6f\xc7\x95\x46\x47\x52\xd8\xae\x33\x0b\xaa\xc8\x94\x31\x11\x0c\x8a\x2a\xf0\x7b\xfb\x34\x94\x02\xb5\x71\x4a\x50\xc1\x1b\x8b\xfe\x97\x51\x0d\x13\xf2\xbd\x11\x6d\x72\xc6\x84\x59\x46\x3c\x82\x2d\xc0\x0a\xb9\x0c\x78\x2f\xba\xf4\x82\x85\xa9\x03\x58\x11\x94\xf1\x59\x33\xc9\xcd\x19\x23\x4d\x3a\x69\x8b\xc4\xa7\x12\xd3\xd7\x16\x90\xb9\x47\x6c\x7f\x08\xbb\xf2\x41\x69\x4d\xf6\x47\xc5\xb9\x19\x01\x89\x04\x23\xd4\x9c\x6d\xed\x9d\x66\x81\x18\x5d\x36\x03\x38\xbd\x38\xf7\x65\x64\x27\x64\x3c\x1e\xdb\x78\x31\x9d\x17\x91\xc6\xd2\x50\x1a\x1b\x19\x99\x51\x63\x9e\x03\xb7\x52\x0c\x2c\x41\xae\x5f\x9b\xc5\x4e\x0c\xf2\x82\x80\xcc\x89\xb5\x5e\x95\xa0\x98\x90\x6a\xcc\xde\x07\x01\x90\x20\xaf\xa5\xb4\x9b\x84\xdf\xfc\x27\x39\x39\x21\x97\x35\x03\xf9\xd4\xc8\xad\xb6\x3f\x0a\xc8\xff\x33\x29\x0f\xab\xa6\x32\x36\x31\x2f\x7e\x23\xe4\x9d\x68\xfa\x3a\x7c\x8b\xe6\xec\x05\xf9\x70\x70\x7a\x4b\x79\x62\x50\xf8\xc3\xc1\x88\x7c\x38\xb8\xb0\xe1\xca\x5c\xcc\x3f\xd8\x76\x07\x1f\x0e\xce\x18\xf4\xe0\x8e\x3f\x1c\x98\x61\x7f\x07\x0d\xdc\xde\xb2\x7c\xce\xbe\x61\xcb\xff\x82\xc1\xfc\xed\x2b\x6c\xf6\xb6\xfc\x2f\xec\xf5\x66\xee\x1b\x82\x75\xbd\xcc\xd8\x7f\xa5\x34\xf3\x37\xde\xd2\xcc\xbf\x1c\x44\x62\xfc\xf0\xa3\xa1\xf4\xb7\xcf\x27\xe5\x8e\xfe\xf4\x77\x25\xc5\x8b\x0f\x07\x41\x09\x4f\x99\x1a\xcc\xc8\xf4\xf2\xc3\x01\xa9\x7c\xf5\xc5\x87\x03\xf8\xae\xbb\xef\x26\xf9\xe2\xc3\x81\xf9\x92\xb9\x9d\x4b\x2d\xa7\xc5\xec\xc5\x87\x83\xe9\x52\x33\x35\x7a\x3e\xca\x59\x36\x32\x07\xfb\xbf\xca\x2f\x7c\x38\xf8\xc9\xec\xc9\xc9\x09\xb6\xd9\xc0\xcd\x54\xe4\xdf\xcd\xbd\x31\x7a\x30\x8b\xad\xfa\x1a\xd6\x3e\xba\xad\x3e\x16\xda\xcd\x77\xb1\x9e\xed\xd9\xa0\x7a\xe7\x5a\xa1\xab\x2f\x96\x9d\x2b\xf7\x8b\x08\xb1\xe7\xd7\x37\x7f\xf7\xea\x28\x98\x9e\x51\xff\x2c\x47\xc5\x18\xcc\x78\x42\xb0\x3b\x22\xe6\x20\x1a\x51\x09\x3c\xe8\xd0\xb5\x45\x90\x42\x39\xb1\xad\xaa\xe0\x1a\xda\x81\x67\xde\x0e\x03\x92\x5f\x14\xb1\x4c\x9b\xd3\xf5\x40\x35\x4d\xbb\x55\x06\x4d\x57\xac\xfb\xbb\x47\x6e\x20\xa8\xad\x99\x9f\xba\xce\xbe\xb8\xac\x3d\x17\x9f\xd2\x8f\x6f\xa0\xc1\xd3\x0b\xf2\xfb\x2f\xfe\xf8\xe5\x9f\xd6\x99\x76\xa7\xa8\xd0\x7f\xbd\x31\x75\xb9\x01\x0c\xab\x2f\xd6\xcd\xab\x13\x27\x7f\x4e\xca\xbc\xe8\xb2\x99\x6a\x35\x6c\x47\x31\x4d\xa6\xe0\xc1\x2a\x32\x03\x97\xd7\x2e\x5b\x55\x44\x18\x52\xd8\x38\x18\xf7\x04\x3c\x59\x92\xe7\x5f\x60\x5b\x23\xf8\xf4\x0a\xf9\xfe\xe1\xe3\x8f\x93\x86\x29\x73\x45\xfe\x73\x54\x9b\x8f\x91\x79\x0a\x60\x7a\x06\x71\xd0\x59\x6d\xd4\x55\x1b\x74\xbc\x86\x13\x32\x3f\xdf\x6d\x1b\xd7\xa1\xc5\xc7\x97\x7f\x58\xbf\xbf\xae\x03\xfb\xb3\x3e\xfc\x8a\xd6\x6f\xe8\x05\x01\x8a\x65\xec\x69\x0a\x39\xfd\x41\xe8\x48\x88\xda\xba\x5b\xf0\x0f\xb9\xc8\x65\x5c\x44\x46\x1d\x93\x33\x17\x99\x1e\x85\x04\x0a\x7a\xcb\x98\xd3\x80\x5a\x36\x61\x1f\x0d\xd0\x59\xd9\x64\xc8\xa8\xbc\x8c\x0a\x2e\xe6\xaa\x2c\xe4\x08\x04\x04\xb9\xee\xdd\x82\x01\xeb\xd1\x61\x4b\x4e\x98\x95\xe2\x31\x84\xcd\x53\x32\x2f\x68\x4e\x85\x66\xd8\xac\x01\xdb\x72\xa2\x8e\x59\x92\x3c\x1a\xd4\xc6\xb4\xa7\x11\x8f\x2a\x12\x2b\x33\x45\xab\x0d\x62\x3b\xd7\xde\x8e\xea\xf3\x67\x5f\x6c\xdc\x72\xff\xdc\x7a\x23\x3b\xd5\x9a\xe5\xe2\x05\xf9\xdf\x1f\x4e\xc7\xff\x8f\x8e\xff\xf1\xe3\x91\xfd\xc7\xb3\xf1\x7f\xfe\x6d\xf4\xe2\xc7\xcf\x83\x3f\x7f\x3c\xfe\xeb\x6f\xfb\x30\xb9\xaa\x5e\x83\xab\x5a\x01\x6d\x7b\xd3\x98\x03\xf3\xd5\x4d\x8d\xb9\xc6\xe4\x00\xa6\xb4\xf9\x19\x3b\xdd\x4d\x4a\x46\x3b\x20\xe9\x7a\x4c\x97\x51\x9f\x4a\x3c\x03\x8a\x67\xc4\xd2\x89\x95\x70\x27\x91\x4c\x4f\x02\x0b\x83\x11\xad\xdf\x52\xb1\x24\x25\x59\x43\xa1\xb4\x8e\xe9\x0a\x12\xcd\x68\x94\x4b\xa5\x2a\x56\xe2\x1b\x46\xbc\xe4\x8a\xc4\x72\xca\x22\x0a\xb2\x78\x3e\xe5\x3a\xa7\xf9\x32\x50\x3d\x5c\x91\xfb\x42\xb1\x59\x91\x90\x23\xc5\x18\x99\x08\x19\xb3\x55\xea\x7a\x8c\x34\x94\x4e\x79\xc2\x35\x64\x85\xc4\xcc\xa8\xda\x09\xb7\x2a\x80\xf3\x60\xbb\x2e\xb8\x73\xf6\x91\x70\xed\x3b\xd1\x73\x45\x8e\x62\xa1\x9e\x3f\xff\xe2\xf7\x57\xc5\x34\x96\x29\xe5\xe2\x75\xaa\x4f\x8e\xff\x7a\xf4\x73\x41\x13\xc8\x60\x79\x47\x53\xf6\x3a\xd5\x7b\x05\x8b\x55\xd9\xe2\xf3\x2f\x5b\x9c\xa2\xa3\x1f\xf0\xac\xfc\x78\xf4\xc3\xd8\xfe\xeb\x73\x77\xeb\xf8\xaf\x47\x1f\x26\x1b\x7f\x3f\xfe\xdc\xac\x21\x38\x81\x3f\xfe\x30\x2e\x8f\xdf\xe4\xc7\xcf\x8f\xff\x1a\xfc\x76\xfc\xdb\xc1\xc8\x5e\x5a\xcd\x03\xdd\xeb\xc1\x8c\xed\x76\x0c\xaf\x48\xd5\x8d\xee\xf5\xdf\x57\x8d\xef\x2b\x93\x47\x23\x7c\x43\x11\xbb\xa8\xf2\x91\xc0\x4c\x5f\x1f\xa2\x65\x45\xbb\xbe\x2c\xf6\xf5\x35\xa2\xa4\x8b\xb8\xe1\x35\x7d\xa0\xf5\x86\xf8\xfc\xb4\xf2\xfc\x4f\x36\x41\x24\xb0\x5b\x81\x31\x73\x59\x0d\x70\x91\x60\xfc\xa9\x96\x8c\xf1\xf9\x82\x0d\xa6\x9d\xc1\x0d\x30\xb8\x01\x06\x37\xc0\xd3\x70\x03\xd4\x8f\x3c\xb8\x03\xa0\x2b\xaa\x0a\x8c\xc9\x34\x4e\xb9\x58\x73\xfc\x37\x9f\x7b\x4b\x1d\x46\x24\x93\x46\x96\xe1\x10\x7e\x2d\x6f\x59\x9e\x73\x08\x7b\xc3\x77\x72\x56\x36\x21\x0c\x43\xd0\x7b\x32\xc2\xc6\x2c\x4b\xe4\x32\x5d\x57\xba\xfc\x7e\x22\x8a\xed\x22\x7b\x0e\x62\x1e\x0c\xbf\x83\xe1\xf7\x17\x64\xf8\x1d\xac\xb9\x83\x35\x77\xb0\xe6\x36\x5c\x83\x35\x77\xb0\xe6\x0e\xd6\xdc\xc1\x9a\xbb\x72\x0d\xd6\x5c\xfb\xcc\x60\xcd\x1d\xac\xb9\x0f\x6d\xcd\x2d\x2f\x55\x29\xea\xfb\x40\x6a\x65\x9b\x68\xa7\x15\x85\xde\xb6\x57\xb5\x2a\x7d\x55\x33\x6f\x50\xe7\xb9\x56\x2e\xd9\x10\x34\xf7\x49\xd8\x86\xed\x61\x7b\xce\x0f\xa1\x53\x83\x06\x3d\x68\xd0\x43\xe8\x54\xe5\x1a\x94\x6d\x7f\x0d\xca\xf6\xa0\x6c\x0f\xca\xf6\xa0\x6c\x0f\xca\x76\xfd\x1a\x94\x6d\xbc\x06\x65\x7b\x50\xb6\x1b\xae\x4f\x43\xd9\xde\x14\x3a\x35\x33\x28\xeb\x6e\x6e\x8b\x9d\x22\x61\x50\xcd\x17\x43\x50\xcd\x10\x54\x33\x04\xd5\x0c\x41\x35\xee\x7a\xe8\xa0\x9a\xaa\x05\x0e\x23\x5f\x2a\x16\x37\xc0\xd9\x2c\x97\xb7\x3c\x66\xaa\x16\x82\xe3\xeb\xed\x05\x5c\x26\x85\x0e\x7d\x65\x58\x0d\x7b\x98\xa0\x9a\xc1\x3c\x37\x98\xe7\x06\xf3\xdc\x60\x9e\xab\x5e\x83\x79\xce\x5f\x83\x79\x6e\x30\xcf\x0d\xe6\xb9\xc1\x3c\x37\x98\xe7\xea\xd7\x60\x9e\xc3\x6b\x30\xcf\x0d\xe6\xb9\x86\xeb\xd3\x30\xcf\x85\x18\x34\xa4\x57\x0c\xda\xe7\xa0\x7d\x3e\x3d\xed\x73\x50\x29\x07\x95\x72\x50\x29\x1b\xae\x41\xa5\x1c\x54\xca\x41\xa5\x1c\x54\xca\x95\x6b\x50\x29\xed\x33\x83\x4a\x39\xa8\x94\x43\x7a\x45\xc7\xf4\x8a\xf7\x6f\xde\x06\xf1\x1c\x18\xe7\x11\x60\x16\x34\xd8\x86\xc2\xbb\x8e\x27\x0f\xbe\xd8\x41\x1b\x1e\xb4\xe1\xc1\x17\x6b\xaf\x41\x71\x1e\x14\xe7\x41\x71\x1e\x14\xe7\xca\xc6\x0d\x8a\xf3\xa0\x38\x57\xb7\x72\x50\x9c\xbb\x03\x6d\x50\x9c\x07\xc5\xb9\x61\x2b\x7e\x19\x8a\xf3\x50\x65\x56\xcb\x1c\xaa\xc7\x3e\x7c\x85\xd9\xaf\x7d\x8b\xcf\xd5\xea\xb2\xf0\xdb\xda\xca\xb2\x38\x61\xf8\xa9\xa9\xaa\xac\x44\xac\x5c\x2d\x27\xeb\x9a\x8a\x3e\x42\x29\x59\x6c\x0c\x64\x15\x87\x42\x70\x10\x7b\xd2\x22\xd1\x5c\x33\x41\x45\xb4\x04\x36\xfb\xfe\xcd\x5b\x92\x52\x41\xe7\x41\x6f\x1f\x35\x21\xe7\x1a\xe8\x8d\xce\x7d\x33\x27\xdb\x7f\xc8\x27\x80\x84\xed\x8e\xa0\x12\x85\xef\x38\x04\x0a\x87\x13\x02\x58\x0c\x02\xa0\x61\x1f\xd0\x9d\x28\x6c\x4c\xf4\x59\xfd\x80\x0f\x29\x31\x43\x4a\xcc\x90\x12\xf3\x44\x52\x62\x80\x7e\xac\x6d\x39\x57\x21\x32\x3b\x34\xe2\x8a\xd9\x8c\x16\x49\x43\x73\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x33\x7c\xb2\x83\x89\x55\xb1\x84\x45\x5a\xe6\x5b\xdb\xd6\x5d\xd9\x07\xed\x1b\xb8\xcc\xca\xd2\x0e\xd5\x66\xba\xd5\x62\xa5\xdb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xc7\x0c\x2c\x8d\x6b\x4c\xc3\x2b\xb3\xaf\xbf\x84\x27\xca\x35\xdd\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfa\xee\x6c\xd5\xca\x5d\x5d\xe0\x3a\xc3\x34\xd9\x6c\x9c\x5e\x99\xfa\xe9\x86\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\x37\x6c\x89\xf4\xb1\x92\xa5\x65\x1e\xce\x19\x50\x53\xd8\xcc\x1b\xb6\x84\x87\x2c\xb1\xdc\x22\x60\xf6\xd2\x47\xfc\x86\xad\x83\x10\xfe\xee\x26\xbb\x5e\x40\x6d\xd5\xb1\xfb\x86\x2d\x37\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xc6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x43\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x72\x43\xea\x0d\x3e\x9c\x49\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x4f\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x74\x40\xf3\xf4\xb9\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xc3\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\x76\x10\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\x9b\xe8\x0a\x5e\x5b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x14\xa4\xff\x84\x55\x7e\xb3\xcd\xc1\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x6e\x69\x62\xe8\x1d\xd8\xe7\x09\x4b\x90\xfa\x19\x21\xbd\x46\xd8\x47\xe4\x6e\x21\x15\x12\x33\xb4\x52\x71\x45\x0e\x6e\xd8\xf2\x60\xb4\xb2\xb5\x07\xe7\xc2\xba\xa9\x56\x36\xd3\x13\x51\x29\x92\x25\x39\x80\xdf\x0e\x76\xe7\x05\x1b\x89\x25\x8d\xd1\x7c\x40\x93\x8b\x16\xd4\x6c\xe3\xbe\x55\xfd\xcb\xeb\x3a\xef\xd7\xf8\x7a\xfd\x15\x47\xfc\x30\x35\x37\xd4\x4d\xe0\x49\x42\xf1\x51\xeb\x07\x86\xe6\xa8\x68\x1e\xc1\x0e\xb0\x10\x35\xed\xe1\x7c\xa4\x8e\x71\x67\x8d\x3c\xea\x60\x0f\x9a\x5e\xe7\x96\xef\x46\xa1\xe7\xd1\x05\x66\x10\xc7\xa7\x17\xe7\xdb\x7b\xed\x5e\xc1\x2b\x44\xb3\x24\x41\x2f\xb6\x91\x59\xb5\xb4\x32\x6b\xa3\x08\x93\x05\xe3\x07\x4a\xfe\xda\xc9\x36\xb5\x6f\x85\x5f\x41\x14\xf2\x4a\xec\xf6\xb9\x5e\xd7\x5e\xb0\xe4\x8e\x7d\xcc\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\x08\x76\x42\x3e\x8e\x6f\x8a\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xd5\x23\x50\x17\x61\xb7\x41\xe9\xe0\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x72\xa5\xd7\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x64\x5e\x1b\xd2\x1c\x4d\xf2\x41\x38\x41\xfb\x45\xd9\x1f\x18\x08\x05\xc4\x4b\xb8\xdc\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x5b\xe6\xd4\x58\x64\x09\x86\x19\x64\x0b\xaa\x58\xa9\x83\xa9\x22\x8a\x18\x8b\x59\x8c\x3f\x58\x56\xc2\x66\x33\x16\x69\x7e\xcb\x92\x25\x18\xff\x15\x8a\x24\xfe\xfb\x06\xb3\xf1\xf3\xe5\x82\x6b\x5f\x14\xec\xa3\x76\x4a\x3a\xe1\xa0\x84\x57\x2d\x15\xb9\x5f\xee\x82\x2a\x32\xa3\x3c\x31\x7a\xdd\x07\x41\xae\x59\xb4\xb8\xc8\xd9\x2d\x67\x77\xdf\x0a\x45\x67\xec\x35\xe5\xc9\x6b\x99\xdf\xd1\x3c\x0e\x60\x70\x1f\xcb\x37\xb3\xf2\xbf\xe1\x94\x1c\x5c\x4e\x3d\xe1\x4c\x96\x41\xa7\x66\xeb\x19\x33\xeb\xbd\x73\x0b\xbc\x48\x0c\xc4\xc0\xe1\x4a\x8d\x42\xeb\x31\x8a\xe4\x6c\xc6\x72\x26\xcc\x79\xa2\x6e\xfc\xe0\x25\xcf\x1e\x22\xaa\x69\x22\xe7\x65\x93\x69\xab\xf7\xa2\x63\x8c\xc2\xc7\x1c\xf4\x9c\x1b\x88\x19\x51\x01\xda\x81\xe0\xd9\x0d\x8c\x46\x1f\x04\xf9\xfe\xf4\xf2\xdd\xf9\xbb\xaf\x5f\x00\x57\xd9\x04\xe1\x55\xbc\xe6\x8a\x14\xf0\x54\x60\xf5\x50\x45\xa2\x0d\x8a\x17\xc2\xfb\x8b\xa6\x6c\x41\x6f\xb9\x39\x03\xb9\xb5\x87\xdc\x32\xec\x2c\x6e\xd4\x60\x92\x48\x65\xc6\x49\x98\x52\x64\x29\x0b\x8c\xe3\x89\x19\xcb\xd0\xc5\xad\x34\x15\xd0\xcc\xc4\xfa\x33\xea\x8b\x20\x53\x66\x7e\x75\x16\xb1\x95\xd3\xd5\xe4\x4f\xd8\x42\x39\x9c\xa6\xbb\x46\x91\x25\x1b\x1d\x1e\xe3\x0d\x6f\x99\x5f\x37\x81\xb8\xaa\xf6\xb7\x0f\x98\x42\xc5\x7f\x53\x07\xee\xf0\xc1\xcb\xee\xba\xff\x7a\x3d\x0a\x03\x3f\xbe\x45\x2c\xec\xa0\xf1\x6f\x0e\xaa\xaa\xac\x32\x08\xae\xa9\xc9\xde\x4d\x9c\x33\x08\x12\xea\x93\xd9\x0c\xd1\x5a\x43\xb4\xd6\x10\xad\xd5\xf4\xfb\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x43\xb4\xd6\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x64\x88\xd6\x2a\x9f\x19\xa2\xb5\x86\x68\xad\xc7\x4b\x73\x0a\x14\xd3\xad\x3a\xe6\x9b\xf2\x59\x94\x4e\xb4\x8b\x87\x72\x27\xb3\x2a\x1a\xd6\xb5\x4e\x7b\x8a\x0d\x3f\xb6\xc3\x74\x36\x2c\xb7\x11\xba\x44\x7b\x43\x6e\xd5\x84\x1b\x58\x4e\x56\xbc\xe3\x9e\x03\x55\x16\xf5\x54\x4d\xb5\x55\xe7\xc2\x25\x9b\x75\xf4\x2d\x5c\xb2\x59\x68\x6d\x43\xc0\x54\x5d\x0a\x36\x62\xc5\xfb\x1c\xee\x21\x7c\x60\x7d\x8c\x53\xe3\x12\x8c\xb0\xef\x4c\xa6\x16\x1f\xed\x1a\xd6\xfa\x42\xb7\x1e\x69\xe0\xc7\x17\x54\x2f\x5a\xcd\xe0\xf0\xdc\x82\x0d\x1c\x87\xe0\xca\xcd\x38\x8b\x58\x25\x8c\x0a\xe4\x38\x46\x63\x7b\xd3\x08\x3e\x39\xb3\xbf\x8d\x50\xe2\xb0\xee\xd2\x32\xcc\xca\x08\x4d\x84\x1a\x42\xcc\x63\xf2\x3f\x57\xef\xdf\x9d\x7c\x2d\xad\xac\x60\xb4\x19\x65\x1b\x26\xa5\x4c\xe8\x11\x51\x45\xb4\x20\x54\x99\xa9\x19\xfd\xf6\x0a\x4c\x0f\x29\x15\x7c\xc6\x94\x9e\xd8\xd1\x58\xae\x7e\xf8\xe2\xc7\x49\xd5\xe2\xc1\xad\x4f\xd5\x05\x23\x59\x04\x80\xb3\x61\x16\xe3\xdf\x05\xa1\x15\xa6\x94\xc9\xd8\x4e\xfa\x0e\x26\xab\xe9\x0d\x23\xd2\x4e\xb6\x60\xc0\x14\x5e\x90\x03\x83\x26\xc1\xa7\xff\x69\x0e\xd6\xbf\x0f\xc8\xd1\x1d\x58\xf5\x0f\xcc\x9f\x07\xf8\x41\x1f\x3b\x66\xee\x05\x1c\xdf\x7e\x18\xe5\xfb\x9c\xcf\xe7\x20\x6e\x81\xe9\xf6\x96\x09\x7d\x0c\xfc\x6d\x46\x84\x0c\x1e\x16\xd6\x45\x56\x3a\xc6\xea\x13\xf9\xe1\x8b\x1f\x0f\xc8\x51\x75\x5d\x46\x04\x65\x1f\xc9\x17\xde\x19\x96\xc9\xf8\xd8\x69\xad\x4b\xa1\xe9\x47\x50\x0c\x16\x52\x31\x81\xbe\x04\x2d\xd1\x20\xab\xa4\x51\x3e\x59\x92\x8c\x51\xc0\x8c\xc9\x1d\xda\xe0\x1c\x28\xd1\x9f\x9c\xd1\x5c\xd7\x22\xeb\xae\xdf\x9f\xbd\x7f\x81\x5f\x33\xdb\x36\x17\x4e\xcb\x9d\x71\x41\x13\x6b\xd9\xf6\xf2\xa1\x99\x48\x81\x9b\xa4\xa5\x55\x6d\x9d\x51\x77\x56\xe8\x22\x67\x93\x7a\xa4\x55\x6b\x8c\x6f\x0a\x73\x6b\x46\x76\x08\x77\xab\x1f\xb4\x47\x0c\x26\x6b\xbd\x44\xb1\xc6\xd9\xba\xba\xc4\x77\x01\x0e\x6e\x5c\x62\x49\x9a\xcd\x2a\x63\x19\x29\xb3\xc0\x88\x65\x5a\x9d\xc8\x5b\x43\x3a\xd9\xdd\xc9\x9d\xcc\x6f\xb8\x98\x8f\x0d\x92\x8d\x71\xe7\xd5\x09\xb0\x98\x93\xdf\xc0\xff\xf6\x5a\x11\xf0\xa9\xf6\xcb\xc2\x98\xd6\x07\x58\x1b\xb0\xcf\x93\x9d\x97\xe6\xe4\xcb\x2e\x9c\xe0\xf0\xca\x29\x7f\xb5\xb7\xcd\x71\x41\x5f\xb8\x0d\x76\x0d\x28\x5c\x4a\x63\x24\x81\x54\x2c\xef\x1d\x8d\x0d\x00\x41\xc7\x8f\x96\x63\x1b\x8d\x3e\xa6\x22\x1e\x7b\xf9\x3a\x5a\xee\x0c\xb1\x82\xb7\x3c\xc0\xdf\x9e\x9f\x3d\x0c\x72\x17\xbc\xd3\x69\xed\x2b\x97\x80\x54\xe2\xcf\x69\x92\x2d\x68\x5f\xbd\x17\x86\x28\x74\xb8\x86\x28\xf4\x21\x0a\x7d\x88\x42\x2f\xaf\x27\x12\x85\x3e\x44\x91\x0f\x51\xe4\x43\x14\xf9\xfa\x9f\x87\x28\xf2\x21\x8a\x7c\x88\x22\xaf\x5f\x43\x14\xf9\x10\x45\x3e\x44\x91\x0f\x51\xe4\x0d\x57\x1f\x05\xeb\x3e\xc1\xf8\xcb\xc1\x39\xf6\x69\x38\xc7\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x07\x8c\x1f\xdc\x5d\x83\xbb\x6b\x70\x77\x0d\xee\xae\x27\xea\xee\xea\xd4\x65\xfc\x93\xae\x9d\xf5\xf0\x65\xb3\xe0\xd6\x6a\xc5\xac\xb5\xc5\xb2\x6c\x9d\xac\x95\x62\x58\x65\x1d\xac\x97\x98\x4e\x79\xff\x45\xb0\xaa\x06\x40\xd7\xa0\xb9\x43\x53\xf6\xc1\xa1\x37\x38\xf4\x06\x87\xde\xb6\x53\xd2\xc1\xa1\x07\xbe\xbc\xf0\x28\x58\x75\xa4\x4c\xe1\x78\xdf\xec\xda\x58\xff\xe9\xf6\xa6\x15\x6b\x55\x09\x3f\xef\x72\x51\xca\xef\x07\x16\x16\x38\x29\x66\x43\x23\x99\x66\x52\x18\xc4\xe8\xc7\xb9\x58\x8e\xd7\x22\x61\xd5\x3d\x6a\xef\x4f\x59\x18\x4c\x6e\x3d\x5b\x69\x26\x15\xab\xd8\x71\x77\x50\xbc\x37\xbb\xa6\xc6\xe8\xf4\x71\x26\xb4\x1d\x14\xf7\xca\xfb\xad\x64\x91\x37\xe1\x1b\xd6\x35\x09\x9e\xa7\x9f\x0b\x96\x63\x1b\xfd\xd2\x81\x53\x02\xc5\x99\x5c\xd1\x25\x55\x01\xcb\xe1\x86\xcd\x6c\x09\xa6\x36\x4b\x25\x1d\xfc\xb1\x2b\xab\x7e\x50\x9f\x2c\x69\xed\x3f\x69\xe1\x3d\x79\xda\xfe\x59\xd2\xd6\x47\x4b\x5a\xfa\x69\x49\x0b\x5f\x2d\x69\xe7\xaf\x25\xad\x7d\xb6\xa4\x8d\xdf\x96\xdc\xb3\xef\x96\xb4\x77\x6a\x92\xd6\x3e\xdc\x95\x49\x3f\x39\x3f\x6e\xc7\x65\xb7\xf1\xe7\xae\x2c\x7a\xf0\xe9\xd6\x40\xbd\xdd\xaf\x4b\xda\xfa\x76\x49\xfb\xf4\xa4\xad\x3e\x5e\x32\xf8\x79\xbb\xf1\x97\xad\x44\xb7\x9b\xbf\xb7\xd5\x5e\xe6\x6c\xd6\xce\x49\x7f\xc9\x66\xb8\x98\x40\x9c\x28\x1d\x1d\x72\xad\x0c\x51\x4a\x1d\x23\x4b\x45\x5d\xfd\x9c\x8a\xec\xf2\x30\x11\x51\x97\x3c\x5a\x5c\x86\xc6\x2b\x1a\xd8\xb2\x80\x46\xba\xd9\x8e\x08\x13\x39\x8f\x16\x6e\xb2\x46\xc8\xb5\x9e\xb5\xcd\x35\x4f\xc2\x69\x6f\xd9\xd0\x76\xec\x6c\xbb\x37\xa7\x61\xa1\x3b\xf8\x74\xc2\x89\x6f\x25\xde\x9b\x0b\xca\xac\x99\x54\x50\x09\xa4\x96\x81\x6f\xf5\xf0\x4a\x96\xba\xc7\xa0\x07\x0c\x6d\x69\x9e\x6e\x39\xdb\x70\xb2\xd4\x25\xa8\xae\xd6\x6c\x11\xe5\xe4\xad\x43\x76\x43\xae\x7d\xb8\x8c\x16\x62\x57\x7b\xc1\x6b\x6b\x3d\x90\xf0\xc1\xb5\x95\x41\xca\xab\xbd\xf4\xd5\xad\x5a\x48\x79\xad\xf8\xc1\xf7\xa9\x0e\xd2\x17\xa7\x2b\xaf\xb6\x65\x3a\xaa\x60\x40\x27\x7c\xaf\x20\xb8\xa3\x10\x6d\x32\x5d\x89\x41\x78\x94\x45\x6e\xad\x4a\xb2\x66\x75\xa7\xfb\x16\x25\xe9\x7b\xf1\xdb\x0a\x51\xac\x59\xc7\x75\xb7\xea\x12\x7d\xcf\x7a\x5b\xfd\x83\x35\xb3\xbe\xea\xb5\x12\xc2\x8e\x73\xdf\x5c\x94\x60\xcd\xcc\xaf\xeb\xe5\x09\x7a\x9c\xd6\xd6\xb8\x85\x86\xf9\x0c\xd1\x0b\x43\xf4\xc2\x13\x8f\x5e\xe8\x74\x06\x36\x45\x32\x34\xa1\xff\x53\x8d\x67\xe8\xb4\xe8\x4d\xb1\x0d\x4d\x8b\x7e\x22\x11\x0e\x9d\xd7\xb8\x31\xda\x61\xdd\x42\x9f\x48\xcc\x43\xa7\xc5\xb6\x8c\x7f\x68\x5a\xf2\x2f\x39\x0a\xa2\x13\x0c\x37\x44\x44\x34\xc1\xed\x49\xc4\x45\xac\x5d\xe0\xaf\xba\xb1\x58\x58\xfe\xf8\xe1\x02\x24\xae\x82\xaf\xd6\x82\x24\xc2\x9f\x56\x02\x25\x2a\xb3\xc5\x60\x89\x86\xa6\x62\xaa\x98\x86\xff\xae\x47\x55\xa8\xea\xc7\xdb\x74\x18\x0b\xed\x6b\x10\x13\xf0\x52\x26\x45\x1a\xda\x38\xc6\xab\xa2\x7f\x46\xa3\x1b\xa3\xb5\xd8\xef\x4d\xc1\xb3\x16\x20\xe7\xdf\x95\x14\x20\x51\x92\x09\x88\x21\x06\x82\xc1\xcf\xb8\x3f\x17\x38\xc8\x67\x1b\x31\xb8\xf1\xf3\xae\x46\xb5\xf5\xd6\x3b\x0d\xa4\x14\x7e\xb2\x95\xa1\xeb\x33\xc2\x57\x57\xe6\x74\x55\xbf\xdd\x7a\x4a\x0b\x2a\x04\x4b\x0c\x2d\x40\x8f\x3e\x48\x77\x1e\x3e\x9b\xc1\x63\x5f\x5e\x99\xcd\xcb\x95\xfb\x0d\xd3\xa9\xa4\xe8\xef\x1b\x23\x13\xa2\x28\xb9\x61\x2c\x53\x81\xb3\xa4\x00\x9f\x0a\xe4\x82\x4c\x97\x46\xbd\x8b\x6e\xa0\xdc\x28\x48\x65\xb0\xde\x97\xb8\x31\x3d\x27\xd0\x03\xb2\x67\x2c\x0a\x6e\x0d\x21\x38\x43\x08\xce\x10\x82\xb3\xed\x8c\xb5\x08\xc1\x09\x0f\x7c\x25\x0c\x87\x0a\x72\x9a\x65\x09\x18\xa5\x5c\x69\x58\x5b\x73\xd0\x16\xdc\x58\xb1\xc4\xed\x98\x5e\x54\x63\x0e\xee\xf6\x0a\x85\xae\xfe\xe0\x99\x5a\xed\x89\x8d\x11\x36\x48\x4f\x9b\xe4\xbb\x8d\xd2\x61\x24\xc5\x8c\xcf\xb7\xe7\xc5\x04\xb0\x7c\x09\xaf\x94\x1e\x33\x1c\xa2\xb0\x95\x6d\x4b\x4e\x05\xe9\x5b\x15\xbe\x7d\x1f\xc9\x31\x33\x90\xc0\xd6\x86\x07\x54\x56\x71\x3e\x2b\xa7\x37\x82\x68\x9a\x9c\xc7\x96\x3e\x66\x32\x3e\x54\x40\xcd\xe2\x22\xb1\xa5\xa6\xb1\x14\x8b\x39\x9a\x82\x27\x66\x25\x63\xaa\xf1\x3c\x30\x85\xf9\x8e\x9f\x0b\xa9\x3f\xf7\x23\xa1\xe1\x25\xe7\x73\xee\x49\x9f\x6f\x59\x92\xc9\x78\xe2\x8b\x39\x68\x70\x59\x56\x07\x9c\x90\x6f\x95\x75\x30\x3b\xe2\x70\xf4\xcf\x7f\x1f\x1b\xc2\xca\x72\x2c\xd4\x69\x07\xae\xbc\xb7\x25\x0a\xa4\xa7\xd8\x1e\x21\x63\x76\xba\x05\xd4\x2b\xe0\x3e\xf3\xf1\x5b\xe6\x75\xbf\x55\x21\x90\xf3\x22\x09\xd2\xc4\x0c\x8c\xf6\x77\xab\xb6\x75\x6c\x64\x68\xe5\x63\xf1\x19\xb8\xed\xaf\xfc\xac\xce\x31\x53\x12\x6f\xbf\xfa\xc8\xa2\x42\x6f\x55\x39\x1b\x8c\xc8\x76\x99\x60\x90\x4a\x12\xfb\x39\x10\x9d\xec\x0f\x66\xbd\xc0\x38\x0d\x78\x6c\x68\x9b\xa2\x9a\xab\xd9\x12\xf3\x6e\x1d\xc0\x58\x10\x1b\x55\x9e\x2f\x23\xa8\x04\x75\x88\xa7\x85\xc6\xd2\xa6\x4b\x12\x2d\xa4\xc1\x2f\x8a\x70\x87\x71\x6f\xb9\xc4\x00\x22\xb0\x07\xe7\x24\x35\x1c\xc0\x6a\x77\xc1\xf0\xe8\xf1\x2e\x5f\x33\xaa\xb0\x54\xba\x84\x95\x0b\xaa\x31\xc3\x80\x9d\xcd\xfc\x31\x37\xea\x0a\x78\xfc\x8a\xd4\x0c\x7a\xc7\xf8\x7c\xa1\xd5\x88\xf0\x09\x9b\xc0\xee\x32\x1a\x2d\x82\x61\x53\xc6\xb4\x22\x34\x49\x7c\x63\x92\x00\x25\x42\x77\xfb\x91\x67\x9a\x96\xc1\x8d\x3c\xbd\xad\xef\x5a\x23\xb8\x46\x84\xe9\x68\x72\x3c\x02\x0f\x9e\x39\x2d\x14\xe6\x38\x5d\x12\xae\xa1\x16\x37\x30\xe8\x5c\x16\x73\x5c\x89\x0d\x34\x50\x5e\x3a\xb2\xf6\x59\x11\x83\x36\x21\xe6\xe4\x00\x17\x77\xe0\x04\x1e\x33\x9c\x35\xb9\xc2\xfa\x5c\x69\x59\xb4\x78\xe6\x39\x53\x99\xc4\x1e\x2c\xf5\xc8\x85\xff\xcf\xbf\x74\xa4\x8e\x4b\x60\x2e\xf8\x7c\xe1\x60\x49\x73\xa4\x29\xd5\x3d\x68\xe7\x7c\x6c\x13\x46\xd2\x32\x88\xa4\xea\xe7\x71\xe5\xe2\x4b\x9c\x08\x76\x4f\xb3\x3c\xf5\x30\x80\x0d\x46\x5d\xdf\x1a\x65\x53\x9b\xc3\x8c\x40\x24\xcf\xc8\x11\xa0\x08\xd7\x87\x0a\xd0\x75\x2c\xb3\xe3\x09\x39\x05\x6d\xb7\xc5\x07\x84\xf4\xe3\xdb\x81\xcc\x47\x95\x2c\xc7\x6a\xe7\xb3\x68\xe7\xa9\xed\xe2\xab\x35\xdc\x3c\xf3\x26\xa5\x56\x8f\x23\x4c\xb6\x3e\xda\xc5\x6f\x4b\x82\x39\xb4\x79\x7a\xc5\xa5\x07\x28\x5d\x86\x2d\xb2\x3c\x1d\x11\xaa\x94\x8c\x78\xd9\x38\x69\x15\xd3\x71\x25\x6d\xfc\x38\x1d\xe1\x4f\x3a\xaf\x9f\x74\x0c\x4c\xad\x5e\xf5\xf8\x4e\x1b\x92\x5a\x85\x4a\x85\x60\x4d\x97\xf0\x2b\x38\x0a\xa7\x2c\xd9\x12\x9d\x19\x5e\x5d\x82\xbf\xdc\xd5\x3a\x08\x6c\xcd\x82\xd6\x2e\xe4\xd1\xe2\x55\x9b\x60\xd2\x01\x39\xf0\xea\x72\x4c\xcb\xab\x4d\x64\x6b\xfd\x8d\x56\x71\xae\xd5\xab\x3b\xfe\xe2\xd5\x2a\x06\xb6\x7a\xad\x88\x24\x7d\x85\xc2\x56\xaf\x8e\x21\x09\xe5\xd5\x3e\x4c\x76\xc3\xba\x2e\xef\x2b\x56\x76\x54\x0d\x94\x25\x5f\x6b\xc4\xf5\x37\x2d\x29\x5b\x0f\x00\x6a\x1b\x50\xbb\x01\x3c\xa7\x9f\x4c\x50\x6d\xc3\x50\x5f\x6b\x33\xcc\x9b\xb5\x2f\x83\xc3\x96\xba\xe0\x52\x2b\xbc\x8d\x6a\x05\x69\xc0\x16\x95\xe5\xcc\x30\x2c\xec\xfd\x65\x3b\xa1\xdc\x5b\x1c\x6f\xd3\xee\x77\x23\xec\x78\x75\x26\xef\xe1\x07\x3b\xa1\x1b\xb0\xc8\xd7\xd0\x38\xeb\x61\xb8\x23\x36\xe9\x1a\xb8\xe3\xc0\x1d\xab\xd7\xc0\x1d\xfd\x35\x70\xc7\x2d\xd7\xc0\x1d\x07\xee\x78\xef\xdc\x11\x75\xd9\x1d\x94\xe7\xef\xd1\xc4\x51\xd7\x96\x81\xd3\x3a\xbf\x50\x55\x6d\x36\xfc\xc6\x25\x50\x5c\x83\xaa\x6d\x6d\xc7\x39\xc4\x86\x3d\x1f\x3f\x7f\xf6\xac\x8b\x52\xbd\xad\xe1\x5b\x78\x05\xcd\xdf\x7e\xff\xc5\xc6\x37\xd6\xd9\xdf\x7a\xb0\x9a\x5a\x1c\xf7\x86\xbc\x8a\xec\xb0\xc6\xf0\x09\xd4\x49\x48\x4d\x52\xa6\x09\xd5\x15\x53\x11\x4f\xd9\xc8\x19\x96\xcb\x16\xdb\xd3\xd2\x34\x1b\x13\x29\x5c\xa4\xa2\x8c\xd9\x64\xb7\x19\x44\x8c\x2a\xc8\x37\x99\x32\x3f\x0b\x99\x9a\xaf\x72\xa1\xdd\x71\x31\x53\x60\x0e\x2a\xe4\x88\x4d\xe6\x13\x12\x17\xcc\x26\x38\xa1\x9f\xce\xb6\xb3\x52\x4b\xa5\x59\x0a\x96\x5c\x99\xfb\xa6\x6f\x3a\x87\x18\x45\x08\x94\x2c\x68\x92\x2c\x09\xbb\xe5\x36\xdb\xd7\x0c\x0e\x6e\x42\xa8\x09\x6f\x56\xd2\xca\x44\xd8\x7b\x7e\x42\x1d\x83\xb7\xa5\x2a\x74\xe1\xf6\x2b\x63\x77\x8e\x34\xbe\xb4\x2b\x99\xac\x15\x56\xb5\x19\x17\x6d\xe0\xf0\x4f\x40\xae\xf7\x97\xdb\x4d\xae\xa4\x33\x25\xeb\x40\xbd\xea\x62\x69\x91\x24\x06\x31\xd0\x0a\xbb\xba\x80\x06\xeb\x68\x43\x22\x1b\x1a\xde\xd3\x20\xa1\x0d\x9b\x98\xcb\x4c\x26\x72\xbe\x0c\x21\x8d\x1d\xe4\x78\x9a\x39\xe3\x38\x7a\xf5\x98\x6f\xd0\xfc\xae\xb6\x35\x83\xe5\x6f\xb0\xfc\x0d\xba\xcd\xca\x35\xe8\x36\xfe\x1a\x74\x9b\x2d\xd7\xa0\xdb\x0c\xba\xcd\x60\xf9\x23\x03\x77\xdc\x00\x93\x81\x3b\x92\x81\x3b\xae\x5d\xd7\xc0\x1d\x37\x82\x67\xe0\x8e\x03\x77\x6c\xba\x32\x19\xef\x11\xe8\x98\xc9\x78\x43\x9c\x23\x5a\x7d\x22\x39\x4e\x64\x84\x6d\x27\x30\x31\xd5\xd9\xf9\x14\x4d\xd1\x10\x35\x22\xff\x90\x82\x61\xf0\x9a\xd9\x1b\x30\x27\x41\x1d\x04\xf3\xf8\x91\x3a\xde\x18\xd8\x34\xc4\x49\x0e\x71\x92\x4f\x3e\x4e\x72\x41\x15\xee\x2b\x12\xa5\xf5\x61\x93\xc1\x81\xbc\x66\x79\xfa\x89\x46\x4d\x1a\x74\xb1\xdb\x0d\x29\x36\xe5\x96\xe2\xca\x63\xeb\x2f\x60\xf1\x45\x75\xbd\x56\x5e\xc6\x5a\x4d\x71\xcc\x62\x92\xb1\x7c\x8c\x28\x22\xc9\x8c\xdb\x62\x56\x35\xec\xb3\xf0\x79\xd4\xe8\xc7\xea\x3a\x1e\x31\x04\xb2\x3a\x91\x1d\x6c\xae\xa1\xe1\xb8\x42\xe1\x9f\x44\x40\x64\x57\xa9\x7e\x4c\xb4\x35\xf2\x7e\xd3\x52\xae\xef\x2e\x9a\xb7\x2a\x7d\xba\x7a\x35\xd6\xd3\xdc\x58\xfb\x74\xe4\x0b\x3c\x44\x54\x21\xa7\xe8\xaa\x5a\x76\x54\xa3\x76\xd3\x53\x76\xb7\x44\x93\x47\x2f\x97\xba\x7a\xed\x2a\xba\xed\x24\xb8\x3d\xfd\x22\xab\xeb\x00\xd4\x59\x41\x27\x3b\x2b\xe9\x64\x27\x45\x9d\xec\xaa\xac\x93\x3d\x14\x76\xb2\x9b\xd2\x4e\x1e\xa0\xc4\xeb\xea\xb5\xb3\x8a\x4a\xf6\xd0\xe3\xc9\x27\x51\x18\x76\xf5\xda\x0b\x58\xbb\xe9\xf4\x64\x28\x27\xdb\xe1\xda\x5d\xe5\x26\xbb\xab\xdd\x64\x77\xcc\x68\x59\x96\x76\xf5\x1a\x0a\xd5\xee\xc5\xd9\x77\x60\x5c\xdd\x8b\xd9\xae\xfb\x78\x27\x2c\xf1\x75\x86\xfa\x17\x36\x75\xd9\xd9\x30\xec\xb5\xe9\x18\x0c\x84\x5a\x04\xcc\xc5\x47\x8d\x00\x8e\xc1\xfd\xd8\x29\xbf\x85\x08\x2a\xb7\x06\x83\xf9\x0a\xba\xb5\x90\x26\xbb\xf1\x52\x30\x05\x82\x1d\xf3\x26\xa2\xb0\xb9\xa2\x79\x76\x82\xe1\x20\x25\xb7\x13\x71\x3d\x40\xa4\x7c\x03\x64\xc4\x94\x51\xa1\xc8\x81\xb3\x3d\x1d\xaa\xf2\x89\x83\x49\x99\xdd\xe7\x47\x84\x24\xe4\x30\xa3\x6f\x73\x53\xf7\x4d\x3b\x3b\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xdd\x78\x0d\x92\x76\x87\x6b\x90\xb4\x07\x49\x7b\xd3\x87\x07\x49\x7b\x90\xb4\xb7\x7f\x7c\x37\x49\x7b\xd7\x38\xa1\x50\xee\xb5\xce\x39\xac\x9c\x05\xad\xf9\x7d\x0c\x91\x2f\x50\x0a\xff\xea\x57\xde\x0e\x65\xe9\x66\x69\x3b\x94\xc8\x57\x74\x8b\xc9\x16\xd1\xda\x0b\xdf\x2b\x6f\x6e\x96\xba\x9f\x56\x2c\xd4\x0e\xb8\x11\x38\x14\x76\x44\x8e\x6b\xe7\x0a\xb7\x95\xe6\xa6\xac\xf4\x93\xc7\xe4\xc8\x79\x5c\xa0\x42\xb4\x90\xba\xfa\xa3\xd0\x7c\x5c\x3e\xe1\x7d\x30\xe0\x5e\xac\xe4\xdb\x24\xd5\xfe\x6a\xa2\x56\x5b\xb1\xdc\x4f\x43\x42\x58\x5e\x99\x03\x77\x8d\xf4\x20\x5a\x22\x2f\x84\x30\xa3\x42\x95\x6c\xf0\xc6\x21\xcd\xc1\x02\x70\xbe\xb3\xbf\x11\x96\x60\x3e\x20\x31\x95\x50\x0a\xfc\x9d\xd4\x96\x91\xb6\xa1\xfc\x52\x58\x8f\xa8\xb9\xe3\xbc\xbe\x0e\x29\x61\x45\xdc\x7f\x7d\x42\x5e\x01\x1e\x86\x03\xdb\x92\xd3\x34\x49\xe4\x5d\x17\x92\xf4\x50\x69\x51\x77\x9d\xd3\xa2\x6a\xfe\xbb\x21\x2b\xea\x57\x92\x15\x05\x3f\xe2\x11\xea\x3d\x3d\x8a\x7c\xbf\x60\x80\x45\x39\x03\x50\xa5\x45\xa2\x79\x56\xc6\x4a\x29\xfc\x54\x82\x52\xe6\xcc\x46\x9e\x54\xf1\xd2\x7c\x8d\x46\x8b\x3a\x7e\xc2\x78\x10\x5b\xa5\xe0\xd0\xda\xe8\x0e\x9a\x24\x36\xa7\xc8\x89\xa4\x18\xc2\xc2\x1f\x3b\x32\xe1\xcc\x55\x45\x74\xda\x0c\x10\x99\x23\x43\x0b\x93\xa5\xad\x54\xb7\x81\x88\xa2\x52\x74\xcb\x1c\xeb\x9d\xf3\x5b\x26\x4a\x4a\x7a\xa4\x8e\x8f\x1d\x0f\xef\x95\xc2\xdf\x0b\x85\xfe\x73\x40\x49\xff\xd2\x86\x46\xc3\x82\x3c\x95\x2e\xc1\x57\xd2\xe8\xc7\x0c\xc1\xe8\xe2\xe7\xef\x66\x63\xd8\xc1\xbf\xff\x80\xbe\xfd\x4f\x27\xb3\xec\x91\x2d\x8c\x8f\x11\x5b\xff\xe4\xad\x8a\x43\x70\x7d\x79\xed\x1b\x5c\x7f\xef\x96\xc3\xc7\x8d\xb1\xff\x04\xac\x85\x8f\x19\x63\x3f\x58\x08\x37\x6e\xca\x53\x0b\x7d\xaf\x5e\x3b\x59\x04\x07\x6b\xe0\xce\x5c\xb8\x23\xc3\xd9\xd7\x0a\xd8\x11\x23\x76\xf4\xb3\x0f\x3e\xf6\x87\xf1\xb1\x0f\x12\x6f\xcb\x6b\x90\x78\xd7\x02\x65\x90\x78\xc9\x20\xf1\x6e\x5b\xde\x20\xf1\x6e\x04\xcf\x20\xf1\x6e\xdc\x94\x41\xe2\x1d\x24\x5e\xf2\xa9\x49\xbc\xbb\x54\xe9\x1a\x7c\xdd\x7b\xf9\xba\xbb\x52\x8b\x4e\x34\xa2\x23\x1e\x74\xf6\x6d\x0f\x7e\xed\xa7\xe2\xd7\x6e\x9d\xf0\x2f\x34\xdf\x37\xe9\x3f\xdc\xab\x75\x99\xff\xf4\x56\xf2\x98\x64\x85\xb6\xf9\xd4\x43\xf6\x7f\x1f\xd9\xff\x15\xc8\x0f\x25\x00\x5a\x95\x00\x58\x07\xb3\xa1\x0e\xc0\x50\x07\xa0\x67\x27\xf4\x50\x07\x60\xa8\x03\x30\xd4\x01\x70\xd7\x90\x9d\x44\x86\xec\xa4\x56\xd7\x90\x9d\xb4\xfe\x1a\xb2\x93\x9e\xac\xf5\x95\x0c\xd9\x49\x4f\xdb\x12\x4b\x86\xec\xa4\xc1\x3a\xdb\x72\xa3\x3e\xc1\xec\xa4\xa1\x0e\xc0\x53\x8d\x51\x20\x83\xa4\x3d\x48\xda\x83\xa4\x3d\x48\xda\x9b\xaf\x41\xd2\xee\x70\x0d\x92\xf6\x20\x69\x6f\xfa\xf0\x20\x69\x0f\x92\xf6\xf6\x8f\x0f\x75\x00\x3e\xa1\xd8\x08\x32\xd4\x01\x18\xe2\x25\x86\x3a\x00\xbf\xde\x3a\x00\x15\xdf\xfd\xe3\x15\x03\xe8\x3e\x8d\xa1\x22\xc0\x50\x11\x60\xa8\x08\x30\x54\x04\x70\xd7\x50\x11\x00\xaf\xa7\x64\x6b\x1c\xf2\xa3\xd6\x02\x65\xc8\x8f\x22\x43\x7e\xd4\xb6\xe5\x7d\x02\x76\xc3\x21\x3f\xea\x09\xda\x0a\x87\xfc\xa8\xc1\x2e\x58\xdf\x9c\x4f\x24\x3f\x6a\xa8\x08\xf0\x14\xbd\xed\x83\xc4\xdb\xf2\x1a\x24\xde\xb5\x40\x19\x24\x5e\x32\x48\xbc\xdb\x96\x37\x48\xbc\x1b\xc1\x33\x48\xbc\x1b\x37\x65\x90\x78\x07\x89\x97\x7c\x6a\x12\xef\x50\x11\x60\xa8\x08\x30\x54\x04\xf8\x14\x3d\xdc\x5b\x77\x9a\x89\xdb\x75\x7b\x5a\xd9\xc5\x57\xe2\xb6\xaa\xa7\x30\x71\xcb\x73\x29\x80\x02\xdf\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\xae\x9d\xff\x76\xc4\xdf\x82\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xed\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xed\x03\xed\xa4\x78\x33\xc4\xe6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xdf\xce\xcf\x5e\xbd\xbb\x3e\x7f\x7d\xfe\xea\x72\x33\xd2\xb5\x24\x2b\x70\x90\x3a\x4c\xf6\xf0\x3b\xb7\x47\x90\xe6\xcd\x84\xa1\xc0\xbf\x3d\xfa\xee\xf4\xf2\x6f\xef\x4e\xdf\xbe\x3a\x06\xf6\xcb\x3e\x66\x54\xc4\x2c\x26\x85\x72\x24\x21\xcb\xd9\x2d\x97\x85\x4a\x96\xfe\x78\x37\x23\x6d\x1d\x5b\xad\xa2\xb9\x24\x8a\xe5\xb7\x3c\x6a\x06\x11\x4a\xb1\xb4\x44\xa0\xc8\x63\x78\xce\x94\x4c\x6e\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x26\x0b\x33\xde\x6f\x7f\x0b\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x3b\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x29\x34\xfd\xf8\x02\x7d\xf0\x07\xbf\x0d\x7e\x3a\x70\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x10\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x5b\x96\x83\x3c\x6d\x77\x61\x44\x72\x36\xa7\x79\x9c\x30\x05\xc1\x03\x77\x0b\x06\xe5\x3c\x50\xc2\xb2\x00\x63\x5e\x5a\x17\x52\x4f\xc8\x19\x9b\xd1\x22\xd1\x40\x43\x0e\x0e\x26\x87\xbd\xa1\xda\xeb\x5c\x6e\x49\x7e\xaf\xa0\xdb\x15\x16\x95\x98\xc9\x7c\xed\xf1\x38\xb4\xa6\x89\x0a\x59\x53\x86\x93\x58\x4d\xcf\xd1\x6a\xd4\x2f\x5a\xac\xa4\x85\x20\xd8\x5e\x9d\x8f\xa4\x98\xf1\xf9\x5b\x9a\x7d\xc3\x96\x97\x6c\xd6\x31\x1a\x02\x99\xa8\xd5\x69\x81\x81\x19\x72\x88\x03\x6e\x67\x3a\xf7\xe8\xcb\x6f\x63\x34\xe9\x66\xf3\x68\x6d\xe9\x58\x29\x69\x81\x4c\xdf\xb2\xef\x1e\x8b\xf3\x94\xd7\x76\x8a\xde\x38\xb9\xc3\x90\xb4\xdb\x73\xaa\x27\xe4\xad\x84\x90\x9c\x99\x7c\x41\x16\x5a\x67\xea\xc5\xc9\xc9\x4d\x31\x65\xb9\x60\x9a\xa9\x09\x97\x27\xb1\x8c\xd4\x49\x24\x45\xc4\x32\xad\x4e\xe4\xad\xa1\x7c\xec\xee\xe4\x4e\xe6\x37\x5c\xcc\xc7\x46\xd2\x19\xe3\xae\xaa\x13\x10\xa6\x4e\x7e\x83\x12\xfb\xf5\xfb\xb3\xf7\x2f\xc8\x69\x1c\xdb\x8a\x3d\x85\x62\xb3\x22\xb1\xd5\x3b\x26\x84\x66\xfc\x3b\x96\x1b\xa5\x6c\x44\x6e\xb8\x88\x47\xa4\xe0\xf1\x5f\x37\x1f\xee\x1d\x21\x26\x33\xd4\x8d\x76\x80\xda\x15\x08\x8a\xcb\x0a\x9d\xf2\x48\x6f\x28\x14\xd7\x0a\xf6\xdc\x19\x0e\x2c\x43\xe9\xb0\x8c\xa9\x94\x09\xa3\x62\xcb\x1b\x00\xb6\xee\x67\xf6\xb0\x3c\xb4\xa8\xe5\x58\x04\xc8\x64\xfc\x82\xa8\x22\xcb\x64\xae\x15\x49\x99\xa6\x31\xd5\x74\x62\x76\x6e\x54\xfd\x13\x84\xe3\x11\xf9\xc9\xdf\x04\x09\x57\xfd\x70\x78\xf8\xe7\x6f\x5e\xfd\xdf\xbf\x1c\x1e\xfe\xf8\x53\xf8\x2b\x90\x3d\x34\x75\x55\x1f\x31\x22\xf7\xc4\x88\xbb\xef\xe0\x1b\xf0\xa7\x65\xa3\xa7\x51\x24\x0b\xa1\xed\x0f\x9a\xea\x42\x4d\x16\x52\xe9\xf3\x0b\xff\x67\x26\xe3\xfa\x5f\x6a\x0b\x27\x20\xf7\x4b\x74\x00\x9c\x17\x54\x2f\x7a\x26\x3d\xe5\xb9\xd8\x01\x5d\xed\x9b\x61\x85\xa4\x94\xc2\x3f\x5f\xbb\xe9\x1a\x0e\x74\x97\x73\xad\x99\x00\xb9\x03\xe2\xee\xe4\x6c\x64\x30\xb7\x64\xb3\xb7\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x0e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xaa\xd7\x9d\x5e\x9c\x93\x5b\x84\x46\xef\x0b\x71\x51\x58\xaf\xf7\x3e\x93\xbe\x52\x95\x5d\x96\x97\x34\x5f\xa0\x65\xc9\xc7\x7b\x91\x84\xa7\xdc\x1a\x80\x6d\x55\x2b\x45\x8e\xf0\xe6\x24\xca\x8a\x91\x7d\x60\x92\xb2\x54\xe6\x4b\xff\x27\xcb\x16\x2c\x35\x12\xdb\x58\x69\x99\xd3\x39\x1b\xf9\xd7\xf1\x35\xff\x17\xbe\x58\xf9\xc0\xea\xdb\x28\x52\x47\x45\x6e\x98\x47\xb2\x74\x14\x84\xc5\x8f\x7b\x16\x1d\x98\x7a\x3e\x8a\x7e\x37\xde\xed\xc8\x72\xbd\xb6\x88\x4c\xdb\xaf\x0a\x64\xc8\x5b\x99\x14\x29\x53\x23\xcf\x9e\x50\x5a\x17\xb7\x46\x9a\x54\xf7\xc2\x08\x63\x7e\xcb\xd5\x4e\xfe\xe9\x2b\x6f\xa9\x03\x13\x59\xa1\x8d\xa6\x82\xc1\xe0\x41\x45\x38\xa9\x40\x07\xf0\x31\x8a\x15\x92\xf2\xfc\xa0\x9d\xf7\x95\x6a\xcd\x72\xf1\x82\xfc\xef\xd1\x87\xdf\xfd\x6b\x7c\xfc\xd7\xa3\xa3\x1f\x9e\x8d\xff\xf3\xc7\xdf\x1d\x7d\x98\xc0\x3f\x3e\x3f\xfe\xeb\xf1\xbf\xdc\x1f\xbf\x3b\x3e\x3e\x3a\xfa\xe1\x9b\xb7\x5f\x5f\x5f\xbc\xfa\x91\x1f\xff\xeb\x07\x51\xa4\x37\xf8\xd7\xbf\x8e\x7e\x60\xaf\x7e\x6c\x39\xc8\xf1\xf1\x5f\x7f\xdb\x6a\x7a\x54\x2c\xdf\xb7\x38\xf0\x78\x8d\x77\x88\xb0\x2f\xdf\xea\x60\xa0\xff\x38\x2e\x85\xb6\x31\x17\x7a\x2c\xf3\x31\xbe\xfe\x82\xe8\xbc\xd8\x7e\x30\x4a\xa2\xb6\x0b\x9e\xbb\x72\x60\x2f\x4a\x82\xe6\x49\x73\xef\x88\xac\x58\x94\x33\xdd\x97\x06\x83\xa3\x39\xfe\x51\x33\xc9\x0e\x4a\x4d\xa9\xd4\x78\xbb\x24\xc0\xab\xe4\xbc\xb3\x5c\xa6\x13\x12\x98\x85\x6e\xc1\x93\x69\x9f\xbb\x61\x5b\xb4\x5c\x77\x0d\x4a\xd0\xa7\xa5\x04\x5d\xe1\xfe\xde\xbb\x06\xc4\xc4\xed\x26\x33\x4d\xdd\xa6\xfb\x1a\x52\x59\x42\x73\xb4\x13\xa0\xb4\x24\x99\xcc\x8a\x84\xea\x35\x66\xbb\x06\xdb\xb4\xc5\xfd\xd2\x0b\x60\x36\x1a\xec\xc0\x96\xca\xa5\xcd\xc6\x50\x72\x9a\x24\x84\x0b\x3c\x09\x30\x80\xb3\xe6\xe5\x0c\xe5\x25\x42\xd1\xe0\x7c\x6b\xa6\x70\x67\x13\x6e\x02\x43\x23\x57\x46\xd7\xc9\x35\x58\xfc\x21\x21\x07\x69\x96\x35\x8d\x71\x51\xa6\xe5\x78\x6e\xeb\xbd\x94\x8d\xf5\x17\x13\xaa\xb4\x9b\x36\xcc\x46\xd3\x1b\x30\x85\x46\x2c\x66\x22\x62\x10\x82\x50\xb0\x72\xad\x53\x23\x0c\x82\x79\x1f\xc6\xa0\x24\x2e\xb2\x84\x47\x06\x7e\x66\x26\xcd\x63\x9c\xa7\x69\xa1\xc1\x50\xfc\x50\x56\x7c\xb3\xe3\x57\xae\xdc\xab\x37\xe6\x03\xa9\xf2\xa2\xb5\x8f\xb6\xf0\xaa\xbb\xda\xcf\x7c\xdf\x8e\xf0\x7a\x73\xdb\x56\x4e\xb5\x42\x71\x4b\x1b\x43\x95\xd2\x3e\xb4\xc5\xb0\x1d\x9d\xfd\x45\xd2\xd8\x0e\xf4\xb5\x3d\x6d\xed\x60\x5c\xea\x4a\x4f\xdb\x5a\x93\xb2\x9c\xcd\xf8\xc7\x0e\xf8\x78\x2a\x4a\x15\x85\xc7\x4c\x68\xa3\x08\x40\x65\xea\x2c\x67\x19\x13\xb1\x4f\xf7\x83\x00\x2f\x51\x5d\xc7\xbd\x7a\x8c\x50\xca\xe8\x7e\xbc\xae\x9a\xa4\x98\xe1\x6c\xfd\xc2\xcf\x96\xdd\xf5\xfe\x0f\x96\x90\xf1\xd6\xe0\xef\xda\x3e\x06\x6f\xd4\x22\x5d\x6d\xf9\x6f\x3b\x49\xa3\xbd\x79\x97\x53\x26\x63\xac\x71\xad\xcb\x20\x84\x09\xb9\x6a\x78\x13\x62\x0d\xec\x13\x87\x87\x0a\xc3\x12\x54\x7d\xa0\x5a\x76\x33\x46\x26\xe0\xa0\x1d\x51\x0a\x59\x5d\x91\x83\xe5\xf7\x84\x2a\xc5\xe7\x62\x9c\xc9\x18\xea\x72\x9f\xac\x43\x88\x16\x87\xaa\x5b\x64\xd3\x56\xbc\xf2\xc6\x89\x76\xdb\x74\xe9\xed\x6f\x81\x6c\xe1\x2a\xc2\xe7\xc1\x8f\xd6\xae\xe3\xe2\xe8\x03\x19\xb2\x94\x88\xf6\x83\x69\x4a\x05\x9d\xb3\xb1\xfd\xf8\xd8\x7f\x7c\xec\xbf\xb5\x0f\x98\xdb\x50\x2d\x34\x29\xb6\x6e\x0b\x71\xf8\x06\x4d\x96\xb1\x6f\x0f\x81\xf1\x7b\x1f\x79\x5a\xa4\x84\xa6\xb2\xc0\x10\xbd\x55\x70\xba\x40\x96\x5e\x00\xd6\x00\x28\xb5\x16\x52\x2d\xa1\x45\x76\x0a\xb9\x7b\xa2\x96\xad\x56\x16\xad\x6e\x96\xac\x0e\x16\xac\x9d\x2d\x57\xce\x48\xdd\x1e\x1f\x2f\x9d\xdd\xbc\x86\x91\x5c\x6c\xc5\xc8\xdc\xd7\xbb\x3f\x9f\x11\x3f\x0e\x57\x44\xa6\x5c\x6b\x6b\xd0\xa5\xe5\xb1\x1f\x11\xae\x2b\xd6\x4f\x7b\x16\xa0\xdf\x03\xb6\xc8\x60\x1f\x8d\x36\xc5\xc1\x8a\xee\xbc\x16\x23\xe4\xb2\x77\x1c\xab\x43\x50\x41\x78\x9a\x61\x30\x2b\xe0\xf4\xd8\xe9\x66\x36\xc8\x60\x38\x1f\xc3\xf9\x68\x7a\x49\x75\x91\x45\x42\x31\xa4\x8c\x60\xf4\xe2\x88\xc1\x6c\xd7\x78\x06\x22\x34\x11\x87\xcc\x59\x80\x20\x7a\x2e\xe6\xe4\x92\x81\x65\xe0\x8a\x69\x65\x63\x22\xe1\x0d\x9a\xb3\xd5\x14\x33\x67\x09\xf1\xa1\xb6\x74\x36\xab\x3e\x11\xb3\x2c\x91\xcb\x14\x24\xdb\x73\x1d\xca\x33\x5e\x74\x61\x69\x96\x50\xcd\xbc\x60\xb3\xd9\xda\xb0\x37\xe7\xeb\x92\xdf\xf5\xb8\x19\x5d\xed\xa2\x83\x5b\xc4\x04\x3f\xfd\x3c\xad\xd6\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\xcb\x7c\xab\xf6\x4a\x60\x2b\xa3\xfc\x7d\x67\x51\x75\x52\xc7\xda\x66\x4a\x3d\xfd\xdc\xa8\x0e\xcb\x6e\x9b\xff\x34\x64\x3c\x6d\x02\x75\xbb\xac\x85\xd6\x19\x0b\xad\xf6\xaf\x65\xe6\xd2\x90\xab\xd4\x81\xbf\xdc\x83\xf0\xb7\x75\x2f\xb5\x4c\x18\x4a\xae\xed\x74\xf7\xeb\xf2\x79\xdf\xff\x0c\xdd\xbb\xc1\x48\x0f\xe3\xa5\xb8\x76\x62\x8b\x39\x5b\xe5\xbc\x00\xb5\xb4\xa6\xd0\xec\x4c\x4b\x37\x2f\xb3\x71\x62\x49\xcc\x9e\x69\xdb\xf9\x2e\x68\x05\xa7\x73\x70\xfa\xfc\xd9\x63\xdb\x88\x81\xfc\xf4\x97\x20\xbe\xdd\xe7\xbf\x78\x0c\xf9\xb3\xfb\xd7\x5f\xf6\xcc\x5b\x68\xc7\xd8\x70\x4a\x1d\x04\x8c\x57\xf0\x02\xe1\x22\x06\x07\x93\x5d\x2a\x40\x00\xc7\x32\xf0\x81\x65\xb9\xfc\x17\x4c\xa4\xb2\x66\x2e\xf0\x44\x95\x0f\x2b\xeb\x32\x0b\xf4\x2a\x6b\x52\x28\x4f\x06\x23\xef\xa4\x2d\x4a\xc8\x46\xe4\x02\x6c\xa9\xe5\x1d\x38\x49\xef\x24\x96\x27\x5c\xeb\xcb\x0a\xe1\xb6\x95\x8b\x6c\x65\xf4\x15\x80\x7c\x53\x32\x79\x5c\x59\x85\xc9\x97\x18\x5c\xc9\x84\xdb\x04\x99\x1b\xb6\x2c\x99\x8d\x15\x21\x80\xe4\x8f\x4a\x2c\x71\xac\x00\x79\xc7\xff\xe7\x4c\x59\xe9\x94\x0b\xfc\x18\x0e\xed\xb6\x02\x46\x77\x00\x35\x92\x5d\x92\xe0\x67\xfa\x00\x57\x3b\x39\xa3\x02\xb3\xf7\x1d\x64\x0c\x4f\x25\x9b\xa5\x8b\x40\xa4\x78\xf5\x73\x41\x93\x6a\x12\x82\xbd\x65\x1f\x5a\xa1\xea\x77\x3c\x89\x23\x9a\xdb\x28\x2f\x38\xa3\x44\x49\xdc\x3d\xac\x8a\x17\x51\xe1\x4f\x7b\xb9\x47\xd8\x07\x91\x64\x34\xd7\x3c\x2a\x12\x9a\x13\x73\x16\xe6\x32\x6f\x95\x28\xb0\x15\xa2\x25\xd2\x5c\xb1\x48\x8a\xb8\x8b\x02\x70\x5d\x7f\xb7\xee\x6b\xcd\x58\xce\x6d\xb9\x3f\x9e\xb2\x3a\x92\x1e\x55\x6d\xda\x72\xe6\x4e\xb5\x3f\x62\x15\xcb\x47\x99\x93\xc9\x15\xe1\x58\x2f\xf4\x38\x20\x8f\xfe\x54\x4c\xc8\x57\x4b\x67\x66\x01\x93\x8b\xcd\xae\x50\x4c\xbb\x44\x18\x87\xb2\x16\xd8\xe5\x81\x9a\xc9\x1c\x92\x53\x8e\x62\x89\x19\x19\xb7\x3c\xd2\xc7\x13\xf2\xff\x58\x2e\x31\x83\x93\xcd\xb1\x7a\xa3\x45\x71\xaf\xb8\x42\xe3\x52\xf0\xe0\x3f\x23\x47\x58\x49\x93\xa7\x29\x8b\x39\xd5\x2c\x59\x1e\xa3\x1e\xeb\x6a\x71\xb6\xd9\xba\x36\x46\x83\xa0\xf0\xea\x97\x7f\xd8\xf0\x64\xd7\x1c\xaa\xef\x5c\x56\x4a\x09\x19\x8c\x21\xa8\x6d\xa1\xe7\x41\x72\x83\xb8\x19\xc6\x20\x94\x49\x9d\x8e\xcc\xf8\x0d\xfe\xbb\xc1\x03\x4a\x72\x36\x07\x2c\x47\xcc\xdd\x13\xc7\x31\x9a\xf2\xad\x2c\xc4\x7a\x93\x60\x65\xe1\x6f\xac\x12\xfe\x5d\xf0\xe2\xda\x2c\xc5\x07\x11\x13\x82\x99\x04\x26\x4a\x4a\xc0\x2e\x09\xec\xdc\x90\x07\x7c\xaa\x8c\x44\xd9\x3a\xc9\x5e\x33\x12\x61\x2e\x5b\xa2\xde\x7b\xc9\x5b\xf4\x1f\xea\x80\xcb\x10\x20\x6e\x01\x53\xcb\xdb\xd3\x96\x1c\x00\x7e\x22\x04\x4b\x04\x85\x6f\xb1\xd8\x45\xb1\x61\xae\x31\xbc\x4a\x0e\x5f\x1c\xf6\x42\x7c\x71\x39\xb9\xcc\xe8\x9c\x6e\xaf\x77\x5c\x55\x46\x6a\xaf\x92\x98\x69\x96\xa7\x50\x98\x76\x21\xef\xf0\x77\x64\x5b\x99\x7d\x8a\xd9\x9a\xbe\x66\xb5\x0b\xa9\x80\x2b\x55\x93\x18\xe1\xfc\x82\x63\xf4\x8e\x2e\x09\xcd\x65\x21\x62\x2b\x35\x79\x02\xfa\xb6\xf6\xe1\x77\x52\x00\xa5\x28\x94\x81\xd5\x75\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x52\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xd1\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xc7\x55\x11\x04\x1e\x69\xb3\xa0\xed\xf1\x20\xaa\x98\xee\x79\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x43\xb5\xe1\xc8\x55\x93\x3b\xc9\x11\x3e\x69\x24\x36\x29\xf5\xc6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\xf4\x96\x29\xa2\x78\xca\x13\x9a\x27\x90\x2b\x78\x85\xf3\x83\x66\xec\x8d\x19\xe8\xdd\xb2\x9b\xc3\x99\x04\xc3\x6d\x05\xb5\x9b\x87\x81\x13\xd0\x08\x37\x2f\x2c\x02\xee\x2a\x87\x7f\x8c\x92\x42\xf1\xdb\x7d\x4f\x93\xcd\x7e\xd8\x81\x55\xd7\xb9\x74\x26\xe3\xab\x8c\x45\x0f\xc9\xa3\xab\x1a\x86\x21\x55\xb1\xdb\x74\xe0\xc9\xa8\xec\x53\x6c\xac\x3f\x65\x84\x46\x11\x53\xca\xc5\x54\x2e\xc3\x38\x4f\xbf\x86\x4f\xa5\xa0\x00\xbd\x53\xaf\x12\xaa\x34\x8f\xbe\x4a\x64\x74\x73\xa5\x65\xde\x29\x67\xbf\xe9\xfd\x5a\x19\x86\xd3\xef\xaf\xc8\x19\x57\x37\x41\x36\x81\x75\x9a\x86\xe6\x12\x4a\x6e\x8a\x29\x4b\x98\x3e\x3c\x54\xc8\xe5\x52\x1a\x2d\xb8\x60\x8e\xc1\x09\x9f\x92\x62\x15\x3e\x03\xe5\xae\x3e\x53\x9b\xf8\x74\x62\xf1\xf5\x37\xf4\x4e\x31\x9c\xfe\xd4\x4c\xdf\xfc\xcc\xda\x64\xa4\xf7\xea\xa7\xc0\xc9\x9c\x9f\xf5\xe4\x83\x98\xa9\x6b\x33\xc7\x6e\xc6\xed\x43\x7c\xcb\xa9\x0e\x33\x9e\x30\xdb\x7d\xc0\x2c\xd8\xc5\xa8\xd9\x53\x01\xfb\xb7\x94\x05\xb9\xa3\xa8\x23\x03\x45\x9c\x90\x6b\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa4\x69\x96\x30\xf5\x82\x1c\xb0\x8f\xfa\x0f\x07\x23\x72\xf0\x71\xa6\xcc\xff\x84\x9e\xa9\x83\x09\x39\x4f\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\x38\x9f\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x27\x31\xbb\x3d\x51\x31\x7d\x3e\x82\xcf\x28\x1b\x08\x58\x9d\x13\x55\xe4\xe0\xf9\xc1\x84\x5c\x39\x46\x3c\x0a\xe7\x58\x3e\x37\x93\xb9\x1f\x10\xec\xec\xcf\x0e\xc8\x91\xcc\x61\xe4\x88\x0a\x92\x30\x7a\x6b\x6d\xcb\x78\xdc\x96\xa8\xee\x1e\xb7\x4e\x88\x6c\x9b\x1b\xd6\xbe\xf3\x4a\x5b\x21\x75\x75\x13\xdd\x7b\xce\x04\x90\x17\x36\x57\x60\x26\x73\x5b\x07\xc4\x3f\xa2\x98\x86\xa3\xc7\x45\x45\x85\x7e\x04\x02\x4b\x3a\xa6\xd2\x3b\xea\xd9\x15\x3a\xee\x3d\xd0\x81\x04\xff\xb9\x60\xe4\xfc\xcc\x27\xd4\xb3\x5c\x71\xa5\xcd\x31\x8e\x2b\xac\x8b\x23\x3f\x3b\x3a\x4d\xe9\x3f\xa4\x20\xaf\xbe\xba\xb2\x13\x38\x7e\x54\x50\x6d\xa5\x06\xf4\x1f\x45\xce\x0c\x17\xee\xc0\xdc\xfd\x3b\x75\x86\x6e\xee\x93\x33\xaa\x29\xf2\x75\x1b\x69\x25\x4a\x52\x6e\x58\xf6\x94\x8b\xd8\xfe\x14\x30\xec\x87\xe6\xad\x66\xf7\xde\x6d\x12\x93\xc2\x07\xbf\xbd\x3c\xef\x89\x07\x47\x40\xcc\xe7\x6f\x65\xdc\x99\x11\x07\xaf\x3a\xe2\xfb\xdf\x06\xa6\x2f\xf1\x3e\x49\xcd\x98\xc4\x68\xef\x23\x72\xc9\x68\x4c\xcc\xf9\xb5\xff\xfc\xde\xe8\x9e\xad\x69\x55\x2b\x16\xe2\x00\xd8\x71\x19\xee\x35\xb7\x84\x30\xd2\x3d\x36\x98\x03\xc7\xca\xf2\x92\x69\x22\xa7\xc4\x1e\x87\xbe\xe7\xfe\xed\xe5\xf9\x0e\x53\xff\xf6\xf2\xdc\xcd\xdc\xfc\x53\xce\x1e\x6e\xd2\x3b\x89\x6f\xa5\xf4\xf6\xba\x26\x6e\x95\x2c\xb9\x4c\xdc\xa8\x8b\x64\xed\xe5\xb1\x49\x5f\x92\x58\x9f\x10\xbb\xe1\xa2\x45\x16\x6e\xf5\x94\x99\x77\x8c\x42\x81\xb1\x6a\x81\x1f\xf1\x6a\x41\x21\xf5\xd9\x27\xe4\xc1\x3e\x9b\x8d\x57\x86\x2b\xb8\x1d\x37\x4a\x20\xd0\x36\x72\xc6\xd0\xcb\x19\xbf\x70\xb1\x03\xfe\x8d\xe6\x17\xde\x42\xa4\x66\x6c\xe9\x2b\xc1\xc0\xcd\x38\x40\xb0\x23\xb4\x2a\x09\xff\x13\xbd\xa5\x3c\xa1\x53\x9e\x70\x28\xa5\x6e\xb4\xfb\x30\x1a\x55\xc1\x94\x7b\x3d\xf5\x3b\x8a\x1c\x5e\x9c\x58\x31\x6e\x91\x23\xf3\xdb\x09\x18\xc7\x8e\x27\x40\xad\xe0\x41\xa8\xd1\x58\x13\x4a\x2e\xb7\x09\x25\xbd\xc9\x0f\xb0\x03\xe6\xc4\x74\xe5\x8a\xe6\x9d\x46\xae\x08\x3f\x5c\xd9\x7a\x72\x4f\x99\x31\x62\xae\x55\x2b\xd6\x08\xf8\xb5\xf5\xc9\xf6\xcc\x71\x5f\xe4\x8a\x3f\x0d\xe4\x22\x3e\xa3\x6d\x07\xfe\x59\xbe\xe8\xf8\x10\x28\x49\x10\x71\x66\xb3\xdd\x2a\xa1\x99\x88\x7d\x57\x96\xd6\xd8\x12\x4c\xc8\x75\x0d\xce\xb5\xe9\x8b\xd6\xa5\x68\x83\xc3\x88\xae\xab\x72\xef\xb9\x45\x21\x09\x84\xdb\xa4\x05\x2e\xb6\x9e\x64\xc4\xb2\xc5\xac\x8b\x4b\xdc\xbc\xf0\xfa\xaa\x6a\x09\x7c\xc9\xb2\x05\x79\x7d\xd5\x70\x8c\x01\xf6\x30\x6b\x85\xf6\xc1\x43\x45\x12\x3e\x63\x9a\x6f\x59\xc2\x3d\x1c\xe4\x54\x0a\xae\x65\xbe\x3e\x05\x9a\x74\x3a\x9c\x6e\xb8\xae\x0c\xd5\xbd\x67\x76\xb6\x2c\x20\xf2\x36\xb8\x4b\x49\x24\x93\x84\x45\xda\x96\xb4\x02\xf0\xfa\xd7\x1a\x94\x27\x66\xed\x01\x93\x9b\x3f\x81\xfa\x64\x15\xa5\x13\xdc\xdc\x93\xcb\x57\xa7\x67\x6f\x5f\x4d\xd2\xf8\x37\x0b\x79\x37\xd6\x72\x5c\x28\x36\xe6\x2d\x2a\x94\x3c\x5e\xf4\x22\x5e\x59\xab\x82\x59\x75\x83\x0c\xd6\xfa\x7a\xef\xf2\x27\xc9\xb7\x0a\xa3\x16\xc0\x76\xe4\x7c\x52\x52\xea\x11\xc9\xa9\xcd\x91\xa4\xd6\xf4\x54\x24\x09\x42\x5b\xe7\x8c\x8d\x42\x5b\xcc\xc6\xd4\x90\xce\x0b\xdb\xdb\x50\x51\x59\xe0\xfd\xca\x10\x0f\x8f\x70\x5d\x38\xc6\x76\x99\x64\x15\x8a\xe5\x9b\x55\x38\x5e\x55\xee\xa3\xe1\x4c\x2f\x0c\x54\x6f\xd8\x92\x40\x20\xf0\x4c\xe6\x06\x9f\xf2\x2a\x6e\x30\x1d\xc1\xd2\x4f\x0a\xc5\xf2\x89\x65\x3b\x0f\x0e\xb6\x0e\x55\x84\x76\x28\xde\xe6\x5f\x6c\x82\x99\xbd\x5d\x56\xf6\xb5\xf2\x1a\x2d\xf4\x82\x09\x6d\xc4\x7e\x43\xcb\x2c\x64\x1a\x81\x68\xe3\xb0\x1f\x1c\x6a\x2d\x8b\x18\x75\x2b\x39\x34\x94\xe9\xe9\x82\x93\xe6\xd4\x74\x45\x47\xf3\x0e\x24\x22\x86\x64\xde\xe7\x72\xe5\x34\x96\x10\xb0\x81\x15\xe8\x2a\x88\x46\xe3\x94\x8b\x27\x78\x3a\x23\x2e\xe2\x6d\x70\xa8\x19\xc0\xe0\x8d\xaa\x28\x66\xef\x59\x83\xbe\xf7\x1b\x52\xa7\x49\x61\xc2\xbb\xf5\x20\x56\xfd\x87\xad\x0e\x5f\xba\x54\x3f\x27\x63\xfc\xca\x38\x8b\x4b\xa8\x0c\xce\xc0\x55\x0f\x5e\xbf\x26\xa5\x07\x70\xf1\xf5\xb4\xdb\xe4\x81\xa5\xa1\xfb\xd5\x73\x1f\x04\x50\x5d\x64\x9e\x7d\xb9\x77\x49\x33\xa1\xf1\xbe\x72\xc9\x67\x58\xd9\x0c\xce\xa8\xd3\x97\xa1\x21\x3f\xcd\x69\xca\x34\xcb\x31\x04\xce\x06\xd5\x09\x9b\x9d\xf0\x3e\x63\xe2\x4a\xd3\xe8\xa6\xef\x52\xa8\x03\xc7\xbd\x3f\x8e\xbb\xb7\x2b\xd0\x21\x82\xad\x8b\xb4\x0c\xbd\xc8\x5c\x58\x2e\xf4\x44\x48\x8c\x2f\x47\xd6\xc5\xca\xe1\xcb\x51\x55\xb9\x6b\x59\x9e\x0c\x0d\x1b\x10\xe9\xe6\xeb\xeb\x41\x04\x3f\x42\xa1\x1f\x6e\xd8\xfe\x0c\x58\x12\xb8\x8b\x1f\x2d\x78\xb5\x4a\x1d\x52\x73\x67\xca\x75\x79\xee\x15\xd3\x24\x63\x79\xca\x6d\x5a\xb7\x14\x24\xb2\x69\x01\xc0\xd7\x0c\x0f\xb3\xc3\x05\x3c\x4f\x10\x19\x69\x6a\x73\x66\xc8\x94\xe9\x3b\xc6\x04\x79\xf6\xec\xd9\x33\x90\x4b\x9e\xfd\xf1\x8f\x7f\x24\x50\x47\x22\x66\x11\x4f\x57\x1f\x84\xa7\xfe\xe3\xf9\xf3\x09\xf9\xbf\xa7\x6f\xdf\x40\x54\x59\xa6\x15\x99\x4a\xbd\xb0\x23\x9b\x07\x2a\x2f\xab\x11\xf9\x9f\xab\xf7\xef\x9c\x38\xa1\x6a\xbf\x82\x0a\xe2\x97\x57\x0d\x11\x7c\xf6\xe5\x1f\xfe\x30\x21\x67\x3c\x87\x7c\x62\x0e\x19\x10\x3e\x08\x32\x73\x81\x81\xd0\x78\xa8\x9e\xc1\x6f\x39\x88\x0d\x12\x4e\xf9\x7c\x01\x00\x30\x07\x42\x8a\x59\xc2\x23\x8d\x35\x05\xf1\xe8\x23\xa0\x6d\x5f\x24\x6a\xd3\xbd\xac\x14\x01\x93\x1b\x91\x84\xdf\x30\x32\x53\x5f\xe7\xb2\xc8\xca\x34\xc7\x9c\x29\x23\xcb\x46\x54\x40\x56\x09\x0c\x56\xee\x95\x62\xfa\x51\x83\x30\x5a\x1a\x82\x2a\x38\x08\xef\xd4\x04\x94\x91\xaf\xad\x36\x46\x7c\xc8\x28\xf7\x81\x83\xe0\x53\xaf\x54\xf6\xf7\xba\x67\x1c\xd4\x92\x73\xb9\x2b\x59\x2e\xff\x8e\x5b\xc5\x85\xcb\x82\xb2\x12\xb2\xb2\x32\x99\x4d\x3a\x15\x81\xcd\xd5\x65\xe5\x1b\x5e\x68\x33\xfe\x83\xfc\xa9\xf3\x59\x98\x68\x07\x69\xe9\xd8\x5e\xad\x52\xf8\xb2\xe1\xcb\x65\xb1\x76\x83\x4d\x0a\xf7\xb5\x10\x2b\x6f\xdb\x3e\x2a\x96\xfc\xd8\xee\x3a\x36\x85\xad\x1c\x03\x43\x71\x6d\x02\x50\xd0\xb3\xa9\x52\x8c\xae\x12\xe5\xa3\x98\x2e\x2c\x68\x20\xf2\xca\x7c\x9b\x29\x65\xf3\x88\x52\x9a\xdf\x18\x25\xc1\x52\x81\x09\x44\x3d\x2b\x9f\xc3\x84\x09\x65\xb7\x68\x2c\x4f\xe9\xb2\x92\x35\x60\x3e\x72\x38\x99\x1c\xe2\x31\x91\x39\xd6\xf2\x44\x9c\x37\xf7\x1f\x29\x5f\xba\x1a\x95\x4e\x33\x6c\xbb\x07\xf6\x1c\xdb\xb6\x84\x56\xa2\x9d\xa9\x85\x54\x9b\x0a\xbe\x1d\xdb\x16\x76\xeb\x8f\xdb\xbe\x2f\xee\x18\x16\xd0\xe2\xd1\xae\x3d\x70\x3b\xf4\xbe\x5d\x57\xad\xc1\xc2\xd8\x9e\x84\xb6\x1d\x21\x3b\xd7\x02\x4f\x5b\xb1\xbe\x86\xa9\x1e\xa6\x96\xf3\xbd\xef\xc6\xf9\x6c\xbe\x5e\xa5\x39\xd8\xd3\x67\x75\xe7\x33\xcc\x74\xa9\x92\x2e\x4b\x1a\x42\x51\xc0\x37\xe2\x2a\xd3\x5e\x9e\x34\x47\x0b\xd1\xa6\x5b\xe1\xf9\x2e\xdc\x0d\xaf\x76\x8e\x09\xbc\x2a\xb8\xe6\xbc\x13\xb8\x68\x4b\x4a\xb3\x4a\x83\x8f\x04\xed\x06\x20\x63\xba\xc3\x33\x21\x6f\x2d\xa9\x45\x24\xa3\x53\x25\x93\x42\xe3\xab\xe5\x8f\x21\x1d\x86\x41\x5d\x95\x05\x20\xbe\xfe\xb1\x80\x2a\xeb\xb2\xc5\x59\x3b\x02\x8d\x57\x87\xc3\x39\x54\xfb\xbc\xc7\x6a\x9f\xbe\x3e\xad\x6a\xd9\xaf\x49\xdd\x5b\x79\xdd\x48\xf1\x2e\xfa\x95\xe2\xe4\xa8\x6c\x13\xe2\xdc\xf1\xe7\x42\xb3\x7c\x46\x23\x76\x1c\xea\x5d\xbe\x1d\x8b\x0f\x11\x72\x79\x11\x0b\x2a\xe2\x04\x05\xf0\x88\xe5\x80\xfb\xec\xa3\x66\xb9\x01\xc9\xcb\xab\x73\x12\xe7\xfc\x96\xe5\x8a\x1c\x7d\xc5\x8c\xbc\xc8\xa8\x2e\x72\xd6\x2a\xbb\xaa\xdf\xd8\x4a\x98\x46\x5f\x9a\x1e\x0c\xd6\x35\x54\x0f\x5e\x72\x94\x47\x04\xe7\xab\x04\x13\x42\x15\x41\xaa\x42\x5d\x76\x62\x50\x09\x08\x34\xd0\x8c\xa5\x2c\x72\x6b\x45\x77\x75\x55\x23\x99\x1b\x75\x09\x07\xa6\x8a\xe4\x6c\x6e\xa4\xd9\xdc\x35\x1b\x66\x24\x4a\x0a\x73\xa3\xd7\x70\xb6\x7d\x02\x00\x4b\xd3\xec\xa6\x58\xbd\x99\x95\xaa\xe5\x2d\x8f\x1d\xab\xc4\xde\xc7\xbe\xab\x61\x46\x55\x90\x6a\x13\x54\xa0\x0f\x00\x8b\x32\x3a\x30\x54\x9f\xc4\x5a\x09\xf6\x0f\x8d\xc2\x12\x6a\x5b\xb4\x68\x1f\xd1\x85\x08\xcb\x98\x5d\x14\xd3\x84\xab\xc5\xd5\x8e\x26\xc4\xa6\x21\x30\x58\x61\xc5\xeb\xb7\xd6\x92\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xe9\x72\x23\x47\x49\x00\xa2\x7b\x3b\x44\x48\x09\xd9\x1f\x09\xb3\x15\x0c\xcc\x4f\xef\xca\x79\xd8\xa4\x34\xac\x59\x12\xb3\x6f\x45\x56\xb9\x1f\xd1\x24\x51\xf5\x84\x5d\x47\x31\x51\xf6\x70\x89\x6a\xb8\xa7\xdc\x6c\xb7\xef\x8c\x52\xab\x7e\xb9\x76\x61\x8a\xa4\x12\xd3\x78\x04\x91\xc2\x3d\x04\xa5\x57\xdc\x0b\x41\x22\x23\xa4\x2b\x03\xca\xf4\xdc\x3a\x72\x30\x97\xde\x9f\xb9\x74\xdf\x38\xbc\xb0\xdf\x7b\x99\x0d\x5d\x29\x4b\xea\x49\xa9\x23\xb9\x5b\x82\x3a\x7a\x75\x2b\xe0\x37\x4f\xb5\xce\xf9\xb4\xd0\xdd\xeb\xbd\xd5\x5e\x07\x36\x6d\x14\x11\x38\xc5\x63\xbb\xfa\x28\x40\x51\xab\x21\xf8\xb3\xb0\x7a\xf6\x4b\x9e\x03\xec\x06\x6f\x1e\x2a\x12\xcb\xa8\xf0\x75\x61\x01\x68\xa5\x03\xad\x4d\xf5\x44\xd2\xf5\x5c\x75\x2f\xe9\x15\x7e\x64\x2b\x7a\xc5\xf2\x4e\xdc\xd1\x3c\x3e\xbd\xd8\x12\x7d\x5f\x65\xe7\xe5\x5b\xa1\xa0\xe4\x6e\x43\x17\x40\x3a\x95\x85\x2e\x4b\x87\xfe\x72\xec\xd5\x4d\x6a\xba\x96\x86\x34\xb4\xb4\x47\x77\x55\xf4\x07\x13\xf7\x60\xe2\xae\x5c\xbb\x98\xb8\xcf\xd1\xc4\x1d\xd6\xc1\xad\x1c\x57\x57\x5e\x81\x27\x6d\x63\x7b\xef\xd3\x4a\x7a\x56\x12\x18\x94\xa6\xea\x71\xfc\x35\x01\x0e\x8f\x48\xb9\xb7\x81\xd0\xe7\x28\x10\xf0\xec\xc7\xb7\xa8\xde\x93\x9d\xb4\x7d\x9f\x62\xbc\xd6\x35\x12\xdc\xd4\xb7\x18\xa4\x86\xa0\xd1\xf0\xc8\x56\x81\x1e\x59\xbd\x4b\xc4\x65\x0b\x3f\x2c\x42\xdd\xa1\x4d\x29\x5e\x1d\x81\x4f\x3a\x6f\x00\xe9\xd8\x44\x18\xaf\xae\xbb\x41\x76\x68\x28\x8c\xd7\x23\xb7\x15\xc6\xab\xb3\xed\x9b\x74\x6f\x31\xdc\xb0\xdc\xfb\x6d\x34\xbc\xe3\xd2\x76\x37\xeb\xef\x6a\xce\x1f\x95\xed\xed\x9e\x3e\x5b\x1f\xcc\xf9\x2b\xd7\x03\x9a\xf3\x03\xc2\xed\x88\x41\x83\x69\x3f\x34\xb7\x39\xfb\xfe\x94\x39\xb1\x72\x52\x56\x5f\x33\x28\xe7\x2c\xfb\x32\xaf\xba\x55\x0f\x27\x93\xc3\x43\x67\xef\xb7\xf8\x59\xe8\xd9\xf8\x4f\x84\x89\x48\xc6\xb8\xa9\x66\xfc\x5c\x69\x60\xfa\xa5\x9a\x1e\xce\x25\x75\xdf\x0a\x5d\xb3\x30\x76\xb7\x2d\xe9\x70\x82\xbb\xb7\x0d\x6f\x82\xf4\x43\x34\x0f\x0f\x5b\x84\x57\x3b\x82\xe3\x13\xfb\xb4\x01\x0f\x81\x77\xef\xfc\xb5\x75\x63\x70\xbc\x76\x61\xaf\x3b\x34\x09\xc7\xeb\x81\x5b\x85\xe3\xb5\x13\x47\xed\xd4\x36\xbc\x61\x71\x0f\xd7\x3c\x1c\xaf\x27\xda\x48\xa6\x7a\x75\x6a\x24\x8e\xd7\x6e\xed\xc4\xab\xef\x76\xdc\xfa\x5e\x5a\x8b\xe3\xd5\xad\xc1\x38\x5e\x7d\xb7\x19\xc7\xab\x25\x24\xc0\x18\x7e\xc6\x3b\xa5\x22\xb8\x77\xaa\xe1\x92\x9a\xa5\x99\xcc\x69\xbe\x24\xb1\xb5\x35\x2c\x1b\x32\x42\x83\x94\xd0\xbd\x4b\xc3\xc0\x3c\x62\x9e\xf7\x94\x8d\xd0\x21\x1b\x94\xc5\xbc\x58\xdb\xae\x79\x1d\xd8\xf0\xad\x10\x68\x77\x50\x0d\xcc\x56\x12\x73\xee\x4e\xfb\x98\x2b\xac\x48\xa3\x1b\xdb\x31\xc8\x41\x15\x79\x7f\x90\xe4\x72\x70\x50\xab\x03\x0d\xe6\x31\xf0\xfd\xd9\xce\x88\xee\x61\x1c\xbb\x62\xca\x42\x6f\x88\x0d\x0b\x38\xb2\x0f\x1e\x1b\x89\xe4\x2d\xb0\xc1\x07\xda\x25\xd2\x31\xb3\x8d\xff\x83\x41\xbb\xb1\xce\xb1\xf1\xee\x45\x5f\x0e\x5a\x82\x64\xee\xfb\xa2\x25\x32\x0a\x7c\xcf\x15\x0e\x05\xdb\xf0\xca\x21\xbf\xb3\xdd\x9b\xcd\x30\xa3\xa2\x7c\x01\x46\x9f\x44\xa1\x5f\x8f\x47\x50\xda\x12\xa4\x78\x00\xa6\xdf\x80\xeb\xa0\x4b\x60\xa1\xcc\x97\xa0\xf2\x7c\xf0\x4c\xf9\xa1\x3b\x57\x61\x53\x07\x8d\xdc\xaa\xba\x87\xf9\xe5\xca\xaf\xac\xd4\xdb\x20\x05\xc2\x09\xea\xaa\x00\x31\xd1\x7e\xc5\x8a\x4b\x72\x06\xbe\xab\xb2\x2d\x9a\x2f\xee\xb8\x82\x66\x82\x27\x55\x3c\x73\xb5\xec\xfc\xc2\x0b\x61\x03\x0d\x56\x90\xa6\x19\x67\x0a\xc5\xf2\xf1\xbc\xe0\xf1\x2e\xd8\xf2\x84\x19\x60\x6b\xb6\xd7\x9d\xd9\x75\x64\x71\x7b\x30\x36\x1f\x88\xd1\x81\x35\x1c\x94\xd1\x1b\x15\xde\x10\x96\xc5\xab\x46\x72\x50\x17\x2c\xe0\x8f\x9c\x73\x09\x5d\x7b\xd5\xd6\xf2\x8c\x68\x19\xd9\x64\x5d\x5e\x29\x77\x89\xc3\x22\xe6\x41\x60\xeb\xd8\xfc\xc7\xa9\xc0\xce\x9e\x3f\x65\x33\x59\x76\x48\x41\x8d\xc8\x86\xe3\xc6\x2c\x61\xd0\x46\xde\xb5\xa8\x37\x0f\x80\x4b\x38\x95\xb7\x06\x99\x3f\x08\xf2\xad\xab\xd9\xcf\x67\x2f\x08\x3d\xae\xa4\x40\xd8\xae\x33\x82\xb1\x18\x63\x74\x93\xf2\x3b\x79\x21\xd4\x88\x4c\x8f\x5d\x3c\x0a\x9c\x38\x61\xc4\xc2\xc4\x49\xbc\xa8\x57\xe7\xcc\x00\x00\xd2\x8e\x73\x99\x12\x25\x68\xa6\x16\x52\x83\x6a\x48\x33\x1a\x71\xbd\x24\x3a\xa7\xd1\x0d\xb4\x28\xca\x99\xfd\xdc\x88\x44\xc7\x36\xb0\x2b\x04\x5f\x35\x6c\x58\x2f\x72\x59\xcc\x17\x10\x09\x8b\x4f\x45\x09\x55\x6e\xf5\x8d\xef\x5b\x6d\x47\x91\x78\x29\x68\xca\x23\x5f\x35\x30\x97\xb7\x5c\x71\x69\xad\xbd\x6e\xdc\x0b\x5f\x19\x0e\x2d\xc8\x2f\x13\xca\x53\x72\xa4\x18\x23\xaf\x1c\x4a\xe0\x2f\xb6\x8d\x3d\x5a\x36\xf2\x6a\x70\x80\xf4\x25\xcd\x85\x2d\x88\x50\x12\x38\xef\xbc\x42\x86\x69\x66\xde\xf8\xd1\x63\xbf\x5d\xcd\x73\x92\x39\x38\xee\x5d\xe9\x4e\x26\x62\x19\x78\x2d\x4f\x2f\xce\x55\xa8\x8d\x20\x6e\xd9\xba\x77\xf0\x43\x22\xc5\x3c\x2c\x23\x50\x62\xa6\x21\xa5\x02\xda\xbb\xdc\xf2\xb8\xa0\x09\x12\x51\x3b\x99\x97\x57\xe7\xf8\x3a\x9f\x2f\xf4\xf8\x8e\x81\x35\x06\x79\x4d\x79\x66\xdc\x47\xf9\x4a\xb4\x0e\x57\x40\x74\xb5\xb5\x26\xa0\x65\xcb\x4c\xed\x8e\x2e\xa1\x6c\x8d\x0d\x31\xa9\x38\x4c\x5d\x61\x31\x1c\xa2\x09\xe2\x30\xbd\x53\xdf\xae\xc3\x88\x0d\x60\xae\x32\x20\x06\x4c\x5d\x9d\x9b\x01\x7c\x50\x07\xd0\xdf\xb6\x9d\xd9\xa8\xd9\x20\x23\xdc\x6d\xd6\x65\xee\x41\x28\xbb\x2d\x37\xf9\xda\xb6\x4e\xec\x28\x1c\x1c\x7c\x1f\x98\xcd\x02\x47\x87\x39\x36\x54\xc4\x63\x9a\x18\xcc\xb9\xf8\xee\xa5\x8d\x70\xc6\x83\x50\x71\xe4\xbb\x2e\x48\x5c\xf8\xb2\xd9\x46\x66\x68\x3c\x02\x90\x07\x3f\x65\x31\x10\x8d\xb0\x61\xe4\x9d\xd1\x90\xed\xe6\x5d\x7c\xf7\x72\x44\xf8\x84\x4d\xdc\x5f\xfe\x51\x47\xb5\xb4\x9c\x63\x18\xa0\x8f\xf1\x04\xbc\x83\xa9\x84\xc6\xa8\xf0\xdd\x9f\xfe\x6c\x26\x69\x7e\xfd\xcb\xf8\xcf\x41\xb5\xd1\xbf\xfc\x64\x88\x60\x6e\x1e\xa8\xde\x0d\x63\xc9\x7c\xd5\xfd\x9f\x2e\x6c\x55\x6a\x5b\xb3\xfa\x27\xdb\x8c\x8b\x09\x6d\xe4\xc6\x0b\x09\x5e\x7a\x1e\x23\x36\xc2\xb7\x73\xf6\x77\x67\x58\x04\x30\x79\xa3\x4e\x44\x35\x13\x40\xa8\x5d\x52\x86\x90\x1a\x5f\xb7\x7d\x67\xcd\xfc\x8f\xc0\x24\x80\x49\x65\x23\xa2\xa5\x84\xe3\x88\x47\xfe\x54\x10\xe6\x7a\x75\xe2\x5a\x01\x1c\xd4\x06\xaa\x39\xde\x63\x86\x35\x10\xf6\x29\xb8\x66\x1e\x30\xb7\xcf\x85\xd4\x9f\xfb\xed\xaf\x75\x11\xa7\xb7\x92\xbb\x02\xe4\xe6\xa4\x08\xec\xe8\xe8\x4b\x62\x4f\x97\x24\xe5\x4a\xd3\x1b\x36\x21\x57\x86\xb7\x84\xde\x30\x84\x9e\x20\x50\xc1\x92\xc5\xa4\x10\x9a\x27\xf0\x6b\x39\x8e\x99\x72\xc8\x73\xce\x67\x44\x15\xd0\xde\x3c\xcb\xd9\xd8\x71\x31\xfb\xd4\x0a\x2d\x28\xd7\x32\xf2\x9b\xbd\xa0\xa8\x0b\x64\x31\xbc\x0a\xf0\xa0\xc2\xa2\xd7\x4a\x1c\x97\x99\xa7\x14\x51\xc9\xb9\x00\x98\x6a\x42\xde\x01\xb3\x4a\x9c\x4b\x18\xd5\x12\x6b\xc0\x14\x2c\x62\x4a\xd1\x7c\x39\x82\xc2\xee\xdc\x17\x03\xb7\xa1\x3b\xc0\x51\x53\x2a\xb0\xac\x7a\xce\x22\x29\x94\xce\x8b\x48\x63\x9f\xbd\x69\x2e\x6f\x98\xf0\xe1\x82\x66\x17\xab\x01\x5c\x65\xfc\x0c\xf8\xbb\x24\x89\x16\x54\xcc\x83\x3e\x35\x29\x8d\x01\xf6\xdf\x78\x29\xc7\xad\xc7\x40\x80\xce\x8c\x60\xc1\x35\x80\x62\x6a\xf8\x88\x37\xc3\x7e\x10\xbe\x1e\xcf\xa8\xb4\x93\x9a\x25\xf1\x64\x0b\xed\xea\x44\xbf\x48\x47\xa3\xde\x18\xd8\x76\xcf\x01\x60\x29\xd3\x34\xa6\x9a\xee\x10\x04\xf6\xb6\x6c\xae\xe7\xfa\xeb\x63\x83\x53\xef\x98\xb4\x7c\xc8\x89\x5b\x32\xe3\x61\xfe\x13\x9c\xc4\x85\x83\x3c\x64\x5c\x6b\x83\x53\xd6\x51\x80\xb1\x5d\x20\xcf\xb8\xee\x65\x66\x78\x37\x1a\x92\x8b\xb2\x35\x63\x49\x4e\xda\xb9\xa1\x3a\x5a\x60\x0d\xe8\x77\x80\xd1\x75\xe9\x2b\x8b\xaa\xf1\x5d\x8d\x22\x08\x72\x09\x26\x34\xcf\x59\x98\x6e\x66\x41\x57\x08\x44\xf2\x1a\x10\x01\xca\x73\xa6\x55\x19\xa1\x82\x74\xd8\x10\x17\xcb\xef\xac\x32\x0a\x44\xda\x02\xd6\xea\x73\xcd\xb2\x10\x82\x5d\x49\x4b\x67\x0d\xe5\xbf\x17\xb8\xee\x62\x74\xc6\x76\x02\x6f\x65\xdc\xc5\x4e\x5d\xab\xc2\x5f\x0e\x51\xc6\x6f\x62\x24\xae\x02\xa5\x1e\x1f\x00\x6f\x95\xaa\x24\xcd\x21\x91\x5b\xd0\xdb\xdd\x8d\x54\xa5\x8c\x34\xf6\xa5\x8c\xe1\x73\x63\xf8\xdc\xf8\x79\x7b\x63\x5e\x97\x08\x10\x77\xb5\x8e\x04\xa9\x7e\xa4\x93\xe5\xd4\x90\x94\xab\x8e\xe6\xce\x5a\x36\xb2\x1f\xc1\xd2\x7c\xeb\x45\xf4\x9e\x5b\x9b\xe9\xc0\xb8\xa1\x16\x2f\xc8\xe7\x15\x2e\x6f\xa5\x29\xaf\x29\x61\xa4\xee\x91\x53\x9d\x26\x76\x2b\x5c\xf2\x79\xf5\xf1\xe3\xda\x60\x20\x5e\x34\x6b\x14\x2e\x22\xd8\x8b\x7c\x46\x3c\xcb\xc1\x78\xe6\xf2\x0f\x0c\x7a\xe5\x32\x49\x58\x0e\x4b\xb0\xda\x53\xcd\x8b\x0e\xb5\x4c\xd1\xa6\x3b\xf2\x2a\xaa\x97\x31\x05\xbb\xf3\xc2\x04\x55\x58\xba\xc5\x79\xbc\x98\x6d\x9c\xb7\x76\x3c\x1f\xb5\x7c\x2a\x96\x38\xf5\xb3\x00\xb4\xa8\x7a\x92\xb9\xf9\x90\x91\x3a\x05\x9d\x26\xe8\x3d\xf6\xcc\x16\xe6\x42\x93\x3b\xba\x54\x80\xf7\xa5\x34\xef\xbf\x6f\xab\xaa\x95\x03\x5f\xb2\x19\xbe\xdd\xda\x23\xb6\x93\x4f\x6c\x17\xaf\x18\xa4\x53\x72\xd1\x26\x04\xa9\x7c\x61\x63\xe3\x90\xfa\xb5\x8b\x1b\x0d\xe2\x54\xc0\x7d\xde\xcd\x27\x52\xed\x53\x7e\x71\x0e\x43\x38\x99\x7c\x0e\x7f\x38\x8e\xe3\x9d\x06\x53\x66\xb0\xba\x4c\x94\x06\x0c\x09\xdf\x6d\x88\x24\x28\x51\xeb\x1b\xa8\xc6\x6a\xad\xc4\xbe\xd3\x58\xce\x20\x12\x04\xbe\x38\x81\x76\x04\x54\x2c\x2d\x27\xd7\x0b\x9e\xc7\xe3\x8c\xe6\x7a\x89\xea\xe3\xa8\xf2\x35\x1f\x5e\xdf\x69\xe1\x3b\xba\x73\xda\x95\x3e\x5e\x0b\x61\x58\xbc\x33\x0f\x5b\xeb\xfc\x5a\xb8\x3e\xc4\x7a\xda\x07\xf0\x37\xae\x27\x2c\x2d\xea\x34\xc2\x47\x5b\x4f\x1c\x92\x8f\xfd\xf9\x86\xa1\x41\xaa\xea\x7a\x45\x36\x10\xb6\xae\x92\x61\x14\xb4\xe7\xf2\xa0\x10\x99\x91\x46\x46\x0f\xa5\x65\xaf\xf1\xc0\xb0\x67\x25\x05\x17\x43\x63\x3b\x1d\x89\xa5\x35\xdd\x84\xdf\x0a\x07\xf0\xa7\x84\x1c\x09\x29\xf0\xe4\xe0\xb3\xc7\x18\x42\xb4\xc6\x36\x05\x8f\xd8\x16\x75\xd5\x0e\xa1\xc1\x49\x75\x4c\x82\x8b\xd8\x6c\x1d\x50\x6e\xd0\x91\x54\x11\x45\x8c\x79\xad\x3a\x6c\x51\x53\x9e\x6c\x3b\x65\xd7\xea\x52\x49\x28\xe2\xa2\x34\x4d\x92\x52\x9b\xb5\xe0\x92\xc0\xe7\x9c\x05\x30\x60\x7f\x95\x44\x1b\xab\xd8\x43\x13\x75\x0c\x7b\x29\x44\x84\x2e\x7c\xae\x97\x6e\x06\x67\x75\x56\x0f\x6a\x84\x42\x25\x97\xcf\xd0\xee\x14\xa8\x03\x1e\x98\x40\x9a\x6c\x0b\xf7\x2a\x67\xb2\xb5\x19\x0c\x1d\x9a\xd2\xe8\xe6\x8e\xe6\x31\xb4\xf2\xcd\xa8\xe6\x58\x16\x7c\x54\x19\xf6\x28\x98\x03\x34\xd2\x0f\xb1\xe8\xd8\x2b\x1d\x8a\xf9\x12\xd4\xe5\x67\x08\x2d\xb4\x4c\xa9\xe6\x11\xa8\xb2\x7c\x16\x58\x11\x53\x5f\xd2\xb0\xd6\x76\x10\xa8\xac\x6f\x60\x7f\x8d\xde\x98\x9c\x11\x7d\x27\x09\x4f\x8d\x84\x40\xa1\x95\xc6\xcc\x67\x0c\x39\x7b\xe7\xa6\x99\x1a\x31\xe8\x7b\x30\x32\x07\x4f\xa1\x92\x6c\x54\x28\x05\xc3\x7b\x8b\xa6\x37\xe5\xd9\x94\x9b\x51\x8d\x81\xdb\x77\x0c\x4e\x9b\xb9\x06\xa8\x3a\x32\xdb\x73\xc7\x8c\x5c\xa0\x36\x22\xac\x9a\x34\xcd\x08\x7b\xda\x2a\x12\x73\x55\x6b\x4c\x7d\x14\xe7\x32\xcb\xac\x81\x24\x3d\xae\xcf\x08\xfc\x06\xf9\x2d\x53\x41\xef\x65\x34\x55\xcf\x99\xf0\xcd\xc3\x6d\x39\x0b\x38\xb9\xf5\x4f\x54\x0e\xcc\x04\x13\x42\x8f\xc9\xb7\xb6\xa9\x90\x47\x5c\x1f\x75\xd7\x4a\x70\x42\x6b\x8b\x95\x9d\x06\x89\xa7\xed\x35\x48\x3c\x83\xc4\xf3\xeb\x96\x78\x7c\xb8\xd7\xae\xd2\x4e\x19\xe3\x58\x6b\x48\xee\x82\x01\xca\x07\xd6\x19\x31\xce\x67\xe4\x92\x45\xf2\x96\xe5\x48\xe4\xa0\xf1\xa7\xe1\xe5\xaf\x29\x4f\x0c\x89\x73\xa4\xae\x54\x0f\xa1\xa2\x6a\xd5\x34\x17\x68\xe4\x1e\x9a\x16\xcd\x53\x3b\x29\x9b\xe9\x67\x9e\xb7\x4e\xb2\x2c\x67\xb7\x5c\x16\xca\x85\x2c\x14\x1a\x8f\x99\xd2\x96\xdf\x2e\xf8\xdc\x17\xe6\xf6\xae\xce\x9c\x45\x32\x8f\xcb\x94\x72\xa5\xa9\x2e\x54\x35\x4f\x22\x42\x6b\x5a\x7f\x06\x1a\x0f\xc7\x7b\xa6\xee\xbb\x51\x52\x8c\xd8\xd8\xe3\x54\x1c\xbe\xc1\x98\x8f\xb2\xef\xb6\x0e\xc2\x50\xca\x10\x18\x23\x42\x15\x9a\x05\x68\x65\x11\xa0\x33\xac\x2b\x59\xaf\x27\xd8\xb8\x65\xec\x87\x1d\x97\x51\x27\x2d\x2a\xae\x87\xd7\x4e\x50\x27\x7b\x24\x78\x86\xd7\x13\x0e\x3c\xa9\x2d\xb6\x7b\xf4\x25\xd9\x33\x02\x93\xec\x13\x85\x49\xfa\x8c\xc4\x24\x3e\x9e\x7b\x9f\x13\x73\xe9\x22\xc9\x6b\x67\xc6\x12\xde\x4d\x67\xa6\x52\x50\xc0\x8f\xc3\x95\xeb\x00\x69\xdd\x9a\xfe\x0c\x80\x49\x30\x8c\x07\xb6\xa7\x15\xb4\x39\xf4\x5d\xb2\x8f\xbe\xea\x6f\x20\xc7\x94\x4d\xb5\xb5\x84\x08\x84\x34\xc3\x4a\x40\x70\xea\xc6\x36\x24\xcb\x69\x4b\xc3\x09\x1e\x4e\x70\xdb\xf7\x1f\xf3\x04\x63\xc4\x73\x97\x80\xfc\x5a\xa7\x20\x7c\xdd\x26\xe1\xd2\x29\x4b\xc8\xcf\x05\xcb\x97\xc4\x08\x41\x65\x78\x0f\x94\x37\x56\x3c\xb6\x01\x32\xd6\xa8\xd2\x5e\x66\x7f\x40\xfe\x0f\x26\x9b\x57\x1f\x8d\x04\x08\x79\x6c\x7b\xd0\xb5\xfa\x50\xd5\x54\x65\x84\x96\x87\x60\x28\xe1\xa1\x87\xb1\x22\xf3\x19\x71\xef\xf4\xdd\xd9\x6e\x8a\x4e\x37\xa7\x16\xd9\xc5\xb1\xb5\xb2\xf8\xd3\x0d\x0b\x44\x40\xf8\x5f\xaa\xdd\xa4\xbc\x29\x82\xdc\xb0\xe5\xc8\xfa\xc1\x6d\xf5\x76\xf7\x30\x86\x73\x54\x4b\x8a\xb6\x2d\x55\xd1\x04\xa0\x1d\x28\xe4\x6e\xd6\x03\xbc\xda\x17\xa1\xac\xbe\xe5\x80\xd0\x95\x10\xef\x4c\xc2\x3b\x15\xab\x0c\xaf\x75\x85\x2b\x11\x27\xa0\x02\x9f\x8b\x6b\xf6\x68\x00\xb1\xdc\x40\x2d\xba\x6e\x22\xd9\x5d\x05\xc6\xcb\x01\x76\xef\xa5\x7a\x34\xad\x04\xe6\xde\xb0\xe5\xa1\xb2\x59\x83\x52\xa8\x05\xcf\x5c\x7d\x78\xa0\x04\x16\x73\xc9\x77\x10\x1f\xe0\x86\xc0\x33\x7f\x2e\x46\xe4\x9d\xd4\xe6\x7f\xaf\x20\x54\x08\x2d\x95\x92\xa9\x77\x52\xc3\x9d\x07\x07\x16\x4e\x77\x6f\x50\x59\x33\x25\x07\x33\x23\x86\xb4\x41\x7e\x86\x0b\x41\x01\x90\x58\x7f\xab\x07\x2b\x57\xe4\x5c\x10\x99\x3b\x98\x68\x57\x3c\x58\xd9\x21\x9c\x6d\x29\xb0\x08\x37\x8c\x61\x41\x29\xf3\x0a\x24\x37\x0c\xe7\x8d\xcb\xdc\xfd\x02\xb6\x27\xb0\xc6\xfb\xb8\x19\x28\x81\x4b\x35\x9b\xf3\x88\xa4\x2c\x9f\x43\x7e\x68\xb4\xd8\x7d\x83\xba\xd3\x6d\xbc\x76\xa2\xde\xe1\x87\x3b\x63\x06\xb0\xba\x37\x10\xb9\xb4\x2f\xc3\xc4\x51\x90\x45\xa4\x34\x33\x48\xf1\x4f\xc3\x09\x60\x5f\xfe\x0d\x25\xab\xd5\x84\x9c\xba\x86\xa7\xe1\x6f\xd6\x8a\x11\x0e\x63\x46\x30\x32\xfd\xcf\x05\xbf\xa5\x09\xc3\x78\x3e\x2a\x7c\x19\x4f\x39\x5b\x61\xd3\x23\x5b\xb7\xda\x50\x29\xef\x19\x3a\xb8\x61\xcb\x83\xd1\x0a\x22\x1d\x9c\x8b\x83\x32\x49\xbb\x82\x3a\x9e\xa1\x81\xd3\xe0\x00\x7e\x3b\xe8\x9b\xb3\x3f\x92\x68\xbf\x03\x96\x58\x83\xd0\xcb\x84\x2a\xd5\x2d\xbf\xb5\x96\x5a\x54\x1b\xa7\xa9\x00\xe3\x55\xf0\x4c\x99\x5c\x64\xa3\x37\x7b\xb7\x67\x41\x94\x7f\xf7\x48\xa3\x4e\xd0\xbb\xb5\xdd\x53\xda\x17\x6e\x68\x2c\x28\x06\x65\x0b\x5c\x0e\x47\x25\x2f\xae\x74\xc6\xae\x81\xd7\x77\x60\x57\x94\xb3\xb0\xc9\x33\x57\xa0\x06\x73\x97\xd5\x21\xa4\x26\x5c\x44\x49\x61\x4d\x8a\xf0\x2a\x28\xd1\x5d\x45\xfd\x1d\x80\xb3\x07\x52\x95\x03\x38\x6c\x72\x6e\xdf\x95\x00\xde\xba\x87\x0e\x7c\xa2\xde\xe3\x85\xb0\xea\x7b\xad\xb3\x2d\xe1\x92\xd5\x62\x9c\x51\x55\xf6\x78\xcd\xa7\x39\x23\x2f\x17\x54\x08\x96\x04\xd9\xae\xd6\xd8\xe1\xdb\x59\x81\x40\x62\x9b\x58\x1d\x56\xbb\x58\x39\xfa\x26\x7c\x6e\x75\xef\xbd\x83\x7f\x49\x4d\xa5\x7a\xeb\x53\x6e\x4b\x35\x2e\xe4\x1d\x89\x25\xb9\x83\xbe\x05\xb7\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x29\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xdd\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x23\xf3\xf0\xf1\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x1c\x93\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6c\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x22\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x85\xdb\x95\xc1\x55\xf1\x89\xe7\x7c\x3e\xdd\x88\x7d\x64\x91\x8d\x0a\xce\x92\x62\xce\xb7\xa4\x3f\xfc\xca\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\xeb\xe6\x02\xe4\x31\xcb\x98\x88\xa1\x24\xda\xeb\x12\x73\x71\xf2\xbd\x42\xce\x96\x17\xeb\x4a\xb5\x5c\x55\xb2\x0a\x05\x0f\x42\xb8\x16\x32\x89\x15\x61\x1f\x75\x4e\x0d\x61\x4a\x0d\x09\xf2\xef\xcc\x08\x15\xed\x89\xcc\xd3\x28\x11\x4c\x7a\xe7\xf6\xf7\xdb\x2f\xf3\x29\xb6\xbc\x2c\xd7\xae\x36\x36\xac\xde\xaf\x74\x3d\x12\x62\x7b\x56\x54\x35\x42\xb8\xa1\xc4\xbc\xfd\x4a\x35\x32\x71\xbf\x52\xf3\xaa\xa1\xa8\x76\x6d\x56\x43\x9b\xce\x4f\xa2\xee\xfc\x0c\x12\x83\xbb\x14\x61\xb2\x6f\xd4\x34\x6a\x7b\xb3\xde\x10\x7a\x83\x06\x6d\xf1\x36\xe0\x03\x50\xf1\xd4\x0e\x64\xd3\x9a\x88\x32\xb0\x2c\x43\xe7\x0a\x21\xb6\x51\xb1\xfb\xa8\x22\x4e\x35\x55\x4c\xb7\xb3\xa6\x54\x45\x87\xf2\x4d\x73\x00\x43\xfc\xb2\x3f\x61\x15\x7b\x08\x48\x77\xc9\xb2\x64\xfc\x17\x2b\x65\x88\xca\x93\x46\xbe\x70\xf0\x71\x45\x9a\x98\xf7\x22\xe3\x18\xb1\xd9\x95\x88\xea\xd6\x2d\x77\x5a\xf1\x05\x3b\x83\x6f\xbf\xed\xdc\xcb\x35\x78\xd3\xc9\x21\xf0\xef\x2a\x10\x2c\x2e\x40\x21\x1f\xfe\x73\x11\xaa\x03\x50\xdc\xc2\x2f\xdb\x3e\xdf\xd7\xda\xe6\x11\x2b\x8d\x57\x67\x5c\xdd\x74\x29\x46\xb6\xf2\x72\xf5\x48\x7c\xfd\xf2\x15\xb1\x77\x5b\xd9\x97\xba\x18\x98\xf6\xad\x8c\x35\x8f\x58\x69\xb4\x8d\xb9\xba\x79\xf0\xb6\xea\x59\xfc\x6e\x5b\x04\xf8\xc3\xd9\xbf\xea\x52\xaf\x2b\xd1\x12\xd4\x0e\x5a\xca\x82\xdc\xd9\xd2\x07\x56\x6a\xbe\xe6\xd9\x0b\xf2\x4a\xa8\x22\x67\xa5\xe7\xb6\x3e\x94\xe1\xba\x4f\xa9\xf5\xfa\x5e\x58\xf2\x94\x8d\x6f\x19\xcd\x35\x88\xc7\x5d\xd1\xc0\xbf\xe8\xe8\x53\x70\x43\xb4\xc1\x83\xf3\x99\x0b\xac\x1b\xd9\x1c\x6f\x5f\xb8\xcc\x3d\x64\x76\x3e\x28\x6b\x12\xee\xf5\x6b\x5f\xf2\x87\x9c\xc4\xec\xf6\x44\xc5\xf4\xf9\x08\x3e\xe3\x02\x9e\xab\x73\xa2\x8a\x1c\x3c\x3f\x98\x90\x2b\x9e\xf2\x84\xe6\xc9\xb2\x52\x8a\xb9\x7c\xce\x30\x0b\x37\x20\x78\xe5\x9e\x1d\x90\x23\x99\xc3\xc8\x11\x15\x24\x61\x2e\xa3\xc9\x9e\xb3\x25\xca\x8e\xc7\x0f\x4d\x5c\xc8\xbd\xda\x2f\x91\xce\x74\xc6\x89\xd8\x71\x6c\xcb\x8f\x2a\xe5\x6c\xce\x4a\x92\xce\x85\xa1\xf3\x13\xf2\x6d\x53\xa3\x72\x38\x32\xee\x89\xc7\x02\xea\xc3\xe8\x7d\x3b\x69\x70\xab\xe6\xe0\xc7\x03\xd3\x76\x2d\x71\xce\xf5\x25\xcb\x64\x27\x09\x01\x5f\xa9\xd9\xe3\xb8\x36\x37\xa4\xe2\x50\xa8\x94\x6a\x68\x0b\x9c\x6b\x1e\x15\x09\x35\x62\x35\x5a\xe3\x26\xe4\xec\xd5\xc5\xe5\xab\x97\xa7\xd7\xaf\xce\x5e\x90\xaf\xed\x48\x3c\x94\xf0\x26\xe4\x3a\xac\x06\x15\x44\xf4\xda\x92\x3b\xfe\x5b\x23\x4b\x86\xa8\x28\x8b\x3b\x42\x8d\x0f\x2a\xc8\xb9\xe0\xba\x2c\x8f\x8c\x71\x67\x89\x14\xcc\x75\x0f\xcd\xa4\xb5\x06\xce\x39\x46\x83\x08\x3b\x98\xf9\xb9\x3a\x1a\x9c\x0e\x2c\xb5\xea\xa7\xb2\x45\x11\xbc\x07\xd1\xa2\x04\x6e\x5f\xe2\xbf\xab\x7f\xda\x55\xf6\xf5\xd5\x68\x5d\x82\x13\x5a\xff\xcb\xfb\xc8\x0c\x7c\x61\x76\x57\xee\xa6\xa1\xa5\x35\x31\x6c\xe6\x70\x72\xe8\x04\x8a\x64\xa5\x08\xbf\x1f\x34\xac\xe8\x55\x45\xb6\x09\x21\xef\x5d\xc8\x36\xa4\x1e\x37\xd7\xf3\xc7\xea\x10\x41\x55\xf8\x1a\xca\xba\xc4\x98\x62\x1a\x7e\xd4\x96\x00\x9b\xf3\x5b\x26\x70\x61\xfd\x52\x28\xf7\xf9\xce\xdd\xd1\xca\x79\x5b\xfd\xe3\xf2\x4d\xbf\x33\xc3\xf3\xd7\x79\x5e\xf6\xd8\xda\x59\x45\x32\x4d\xb1\x5e\xd4\xc2\x27\x18\x96\x39\x82\x9e\x2a\xf4\xa6\xf9\x60\xe5\xab\xd9\x16\xe4\xaf\xd1\x33\xf7\x52\x4d\xd3\xf1\xb7\x6d\x52\x82\x28\xc5\xdc\xee\x75\x98\x6d\x91\x35\xe5\x8a\xa7\x58\xd2\x7e\xe2\x3f\x7e\x72\xf9\xea\xf4\xec\xed\xab\x49\x1a\x3f\x38\x69\x61\x22\xce\x24\x17\x5a\x6d\xd7\x6f\xb6\x75\x9d\x69\x4f\x7e\xfc\x47\xbb\x72\x67\xff\xa2\xc3\x31\x77\x23\xa8\x4b\x17\x33\x4d\x79\xa2\x82\x3d\xd4\x32\x93\x89\x9c\x37\x97\x5f\xee\xb0\x39\xbf\xc1\xfa\x32\x63\x3a\x36\xbb\xde\xaf\xa8\xdf\xa6\x8f\x46\x5d\xca\x2f\x3b\x62\x97\x6b\xf5\x52\x33\xb4\xbb\x78\xa2\xcb\xbd\x17\xe1\x6c\x05\x06\xa8\x48\xc2\x01\x76\x25\xfb\xca\x1a\x78\x41\x0f\x9b\xb6\x52\xdb\x7d\x83\x6e\xbb\xc0\x66\xe8\xcf\xf6\x46\x45\x55\x98\xb9\x77\xaa\x04\x2e\xcb\xd9\xd8\x97\x6b\x82\xd6\x2a\x32\x0f\x18\x6e\x48\xef\x9c\xf5\xc6\xd9\x7a\xf0\xa9\x64\x59\xb7\xe2\x94\xf2\x91\x37\x7d\x61\x8d\x81\x24\x59\x96\x65\x20\xad\x16\x4d\xe7\x58\x86\x29\xb7\x66\xe2\x2c\xe7\xb7\x3c\x61\x73\x28\xc5\xca\xc5\x3c\x48\x7f\x0d\x13\x66\x6d\x69\xd6\xaa\xd1\xf5\xad\xf9\x2b\x28\xba\x0d\x78\xf1\xee\xfd\x35\x54\xf5\x05\x07\xd7\xde\x42\xb8\xf9\x20\x9c\xb7\xf1\x78\x0c\x26\x83\xa3\xbf\x1b\x79\x32\x4e\x8e\xc9\xf7\xcc\x7e\x47\x42\xd9\xe1\x1c\x5a\x01\x2d\xa4\xaf\x01\x0b\x73\x2d\x21\x0b\xe8\x88\xee\x7d\xfb\xd4\x89\x79\xd2\xc8\x4a\xc8\x6a\x2a\xcf\x43\xe7\x53\x2c\xdd\x88\x3e\xa6\x87\x97\x3d\x7b\x24\xfb\x3b\x53\x39\x67\x5a\x6d\xc2\x4f\xef\xf8\x71\xf4\x90\x12\xb5\x4c\x13\x2e\x6e\xca\xba\x60\x33\x69\x70\x08\x53\x13\xb8\xb8\x71\x18\x9b\x33\x9a\xac\xa7\x94\xbb\xe0\x47\xaf\x54\x52\xef\x60\x01\x04\x0b\x9d\x39\x67\xff\xed\x8e\xbd\x75\x43\x87\x24\xee\xe0\xe0\xc9\xad\x97\xab\x6e\x6d\xf0\x0f\xe1\x85\x0a\x4d\x13\xe4\xfc\xea\xe5\xd5\xf9\x83\x5a\xa8\xd7\xb1\x04\x98\xdd\x23\x4a\x75\xfc\xe7\x6d\xde\xe1\x31\x49\x8a\xed\xcf\xa0\x7a\x77\x21\x73\x4d\x93\x9e\x88\x40\xb4\xa0\xd9\x69\xa1\x17\x67\x5c\x41\x0d\x85\xae\x42\xc0\xca\xfb\x41\xa4\x33\xd6\x6e\x76\x05\x03\xb9\x43\x07\xfb\xdc\xcb\xff\x3e\xbd\x20\xb4\x30\xfb\xab\x6d\x71\xd1\x5e\x1d\xee\x6e\x66\x57\x98\x61\xb0\xe3\xba\xec\xdb\x5b\x56\xe5\x9e\xba\xef\x35\xdd\x47\x1c\xee\xe0\x8b\x00\x1a\x8a\x14\xec\x09\xfb\x1f\xb8\xe0\x9a\x53\x2d\x5b\x36\x2a\xab\xa0\x40\xe5\x5d\x6f\x10\x28\x94\x96\xa9\xc5\xe0\x73\xf7\x04\xb8\x90\x81\x8b\xaf\xbc\x54\x5a\x0b\x40\x7a\x07\x88\x9d\x0b\x23\x6b\xd3\x88\xd5\x02\x20\x47\x50\xf4\x13\xc7\xe6\xfe\x99\x3f\x5b\x03\x15\xd4\x07\x4b\xfe\xf2\xa2\x52\x8a\x7d\xa5\xaf\x85\xb3\x52\x94\x4d\x13\x7a\xb5\xf8\xf0\x9f\xbb\x12\x05\xfe\xb3\xa8\x59\xda\x70\x81\xff\xa7\xa0\x09\x02\xe6\x5d\xdf\x66\xa9\x2a\x90\xbb\xce\xb7\xba\x43\x76\xea\xe5\x76\xbc\xf3\x5a\x7a\xa1\xb0\xf2\x18\xae\x47\xe7\x54\x28\xb3\x47\x55\x5d\xec\xd0\x3a\x9e\x0e\xc9\x91\x8e\xb2\xd6\xbd\xfb\xef\x29\xb4\x3d\x29\x44\xa5\x91\x33\xcc\xfc\x1a\xb7\xe5\x8d\x0f\x6d\x6f\x3b\xc9\x7b\x71\x0d\x01\x96\x77\xb5\xaa\xd8\xb7\xfc\x6e\x85\xeb\x42\xd6\x4f\xde\x70\xa5\x5d\x43\x06\xb8\xc1\x95\xad\x23\x0c\x72\xd7\x85\x51\xe4\x78\xf6\x37\x1a\xc7\xf9\x0b\xe4\x52\xae\xfb\x72\x0e\xd2\x97\x2b\xf2\x45\x85\xf7\x25\x1e\xe9\x65\x66\x0b\x00\x5e\xbf\xbc\x20\xd8\x20\xe5\x4f\x5f\x62\xe7\xd7\xdf\x7f\xf1\xe5\xb3\xd6\xdb\xfd\x78\xc1\xe3\x3b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x57\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\xff\x3f\x7b\xd7\xd7\xdc\xb6\x6e\xe5\xdf\xfb\x29\x30\xee\x83\x6f\x66\x24\x39\xb9\x73\xb7\xb7\xd3\x7d\x72\xec\xe4\x56\xdb\x24\x57\x1b\x25\xdd\xe9\x74\x3a\x3b\x10\x09\x4b\xac\x29\x80\x4b\x80\xf2\xd5\x74\xfa\xdd\x77\x70\x0e\x40\x02\x94\x28\x12\x14\x2d\xdb\x89\xf4\x92\x98\x24\x48\xfc\x3d\xff\xcf\xef\xe8\x55\x2e\xe9\x7d\x3f\x09\xe6\x1c\x67\xf7\xa4\x71\x76\xa4\xcc\x28\x41\x22\x11\xb8\x5d\xdc\xa6\x90\x62\xb8\x4b\x76\x90\xe2\xcc\x9e\x1f\xc5\x69\x9d\x9b\xf6\x5d\xe4\xef\x1e\xd7\x19\x6f\xcb\xdf\x54\x21\xec\xb7\x9f\xe6\xff\xfb\xe1\xfa\xed\xbb\x0f\xd0\x53\xe3\xbf\xd7\x5b\x23\xe1\xbd\xe3\xa7\xba\x6f\xb5\x2e\xca\x6b\xfb\x84\x84\xb9\x65\x78\xcd\x21\xc3\xc9\xa7\xf7\xf3\x50\x5f\xcc\xb1\x02\x3a\xbf\xeb\x34\xf6\xd3\x5a\xdb\xa0\xaa\x09\xcb\x87\xcb\x1f\xe9\x6d\x94\x73\x80\xb4\x3c\xfd\x4b\xaf\x14\xf6\xf0\x68\x15\xa9\x75\x05\xc8\x33\xf0\x3b\xe8\xf1\xe2\x1c\x0c\xee\x71\x78\xa4\xb9\xea\x2a\x07\xe4\xe1\x89\x45\x97\xd8\xca\x8a\x00\xfa\x90\x22\x6d\xcb\x35\xcd\xd6\xd4\x9a\xc9\xb2\xfa\xc2\x33\xdd\x29\xd9\x3e\x78\xe6\x10\xea\xb5\xf7\x05\x5e\xb9\x32\xcf\x17\xe3\xe5\x52\x34\xc1\x99\xdb\x08\x05\x6a\x94\x57\x99\xd1\x68\xd0\x82\x2a\xd5\x25\xbc\x02\x49\xee\xa7\x27\x80\xf0\xd9\x01\x03\x69\xcb\xf7\x85\x6e\xe4\xb2\x61\x3d\x4b\x2e\x68\x85\x6c\xa1\x8f\x4c\xd8\x0c\x44\x37\x9d\xee\x89\x97\x8f\x9c\x56\xdb\xf9\x9f\x9e\x8a\xce\xd0\x4a\x4e\xb6\x12\x4a\xf0\xde\x51\xf2\xfb\x9a\xfb\x07\x7a\x06\x4f\xdc\x54\x65\x6c\x9c\x1a\x8f\x10\x41\x59\x3a\x23\xb4\x3c\x67\xd9\x85\xe0\xd6\x2d\xe1\x3b\x25\x4e\x2e\x82\xc4\xd3\xdb\x81\x0e\xdf\xcb\x4d\xf1\x0c\x35\x06\x0f\x1a\x0c\x12\x07\xe7\xa4\xe8\x26\x76\xc6\xa6\xb7\x46\x34\xb3\x09\x27\xd2\x6c\x48\xd2\xbc\x23\x07\x63\x9d\x22\x57\x0f\x22\x0f\x4f\xf5\xf6\x1b\xd6\x62\x15\xcc\xbd\x9d\x54\xac\xe7\x78\x7a\xb0\x8f\x4f\x7c\x82\xe6\x70\x82\x6a\x00\xe7\x4d\x27\xe9\x31\x0e\xd2\xd3\x1e\xa0\x63\x19\xd5\xe3\x66\xf9\x0e\x2a\xa4\xdb\xed\x16\x38\x54\xdb\xcc\x18\x13\xf4\x22\x55\xd4\x82\x82\xc9\xc5\x39\x71\x83\x51\x87\x5c\x60\x09\xca\x10\xc2\x60\xdb\xa0\x01\x17\x81\x9e\xd3\x54\xcf\xaa\xe0\x2e\x44\xb4\x49\xe3\x1d\x11\x44\x59\x5e\xd3\xcc\xd6\xe4\x16\x0f\xfc\x81\xe6\x31\xb9\x9e\x4d\x87\xa1\x06\x01\x71\xd6\xb8\x93\xba\x21\x7a\xf9\x91\xd6\x55\x4b\x2c\x73\xb3\x62\x50\x5b\x91\x2c\x12\x25\xab\x9a\x7e\x4c\xb9\x7a\xa5\xa6\x82\xa5\x2f\x4b\x9f\x65\x7d\x6e\xcd\x9b\x1c\x86\xc9\x89\x88\x14\x4d\x6d\x11\x01\x53\x26\xe7\xf5\xeb\xd7\x68\x0a\x7b\xfd\xf3\xcf\x3f\x63\x65\xa5\x98\x45\xc9\x7a\xf7\x41\x78\xea\x3f\xde\xbc\x99\x90\xbf\x5d\x7f\xfc\x00\x95\x1f\x33\x25\x11\x95\x04\xdf\x8c\x95\xe0\x9d\xc6\x72\x44\xfe\x6b\xfe\xeb\xa7\xaa\x4c\x8c\x7f\xd7\x14\xd4\x36\xc3\x9b\x90\x5b\x27\xfe\xc9\x35\x74\x51\xb5\x32\x05\x8d\x14\xa1\x77\x77\xb8\x31\x16\xb6\x9c\x2e\x1e\x38\x9b\x3d\x0e\x55\xc1\xb1\xfe\x88\xde\x12\x29\x04\x66\x69\x95\x1c\x4d\x83\x16\xd9\x00\xe3\xcc\xe0\x5d\x25\x99\x84\xae\x8c\xb0\x96\xfc\x9d\x84\x2a\x24\x15\xfc\x5f\xce\xa4\x16\x4a\x4d\x75\x45\x7c\x59\xb5\x32\x92\x75\xc6\x7a\x78\x0c\x0f\x50\xe7\xea\x18\xbe\xe9\xde\x9c\x21\x0b\xdf\x6a\xb0\x8b\xab\x32\xf5\xff\x44\x6f\x68\x5b\x90\xf0\x23\x79\x64\xbc\xbe\xce\xca\xde\xe0\xd2\x19\x94\x80\x8a\x4e\xd0\x54\x40\x25\xaf\x72\xa5\x2b\x2e\xe6\x14\xbd\x6f\x1f\x4a\x30\xf8\x62\x28\x00\x2f\x12\xaa\x8f\xb4\x73\x39\x1f\x3f\x5e\xc4\xb6\xf6\x70\x15\xe8\x42\x14\xca\xfa\xb0\xcd\x7d\x48\xc0\xc6\x2a\xeb\x01\x30\x92\x3d\x90\x27\xfb\x20\x10\x07\x83\x98\xfa\xfe\x66\xe0\x09\xbe\x28\x31\x22\x8c\x46\x2b\x72\xcf\xb6\x63\xa4\x5b\x19\x85\x6c\x1e\x98\x95\x5b\x3d\x17\x5e\xe1\x93\xaa\x76\x8d\x96\x8f\xcd\x94\xd9\xc0\x00\x87\xfb\xd8\x6c\x20\x2b\x84\x4a\x23\x2f\x19\x18\x51\xee\x58\x0a\x2c\x56\xb5\x53\x8f\xb8\xc4\x0d\xc5\x62\xe4\x7e\x92\x8a\x3e\x6f\x2c\xd6\xcd\xe4\xa1\x2f\x57\xd1\x10\x9a\x0e\x1a\xee\x56\xf0\x9d\xd6\xa6\xf8\xb6\x11\xfe\xe0\x83\xd4\xa2\x33\x3b\x11\x15\x50\xce\xcf\x54\x72\x32\xcf\xda\x59\x2a\x27\xc2\x4b\xa2\x91\x4c\x15\x66\x6a\xb0\x5e\x58\xc1\x53\x26\x25\x49\x60\x84\x6b\x9a\xdf\x33\x0b\x18\x43\xd3\x09\x99\xe9\x4e\x96\xf8\x55\x08\x8b\xbc\xc1\x10\x3b\x7d\x66\xdd\xec\x20\xfd\x91\xcb\xc9\xe4\x12\x09\xfc\x9e\x5c\xa1\x80\xfd\xd1\x0f\x53\xb7\x07\x96\x6e\xad\xb4\x77\x26\x11\x19\x58\x8b\x7c\x80\x7c\x2d\x20\x0b\x4e\xad\x2c\x03\xa3\x9d\x41\x94\x76\x87\xd3\x03\x00\xb6\x2f\x6e\x79\x1f\xd4\xf2\x4e\x7e\x0b\xff\xd7\x1f\xad\xbc\x17\x56\x79\x13\x52\xb9\x59\x29\x73\xda\xc2\x31\x9c\x8f\x80\xd8\x5e\x07\xc1\xbc\xda\x9f\x6f\xa4\x04\xb9\xc3\x43\xe9\xe9\x24\x23\x1a\xd0\xa7\x94\xbd\x28\xa1\x70\x7a\xb7\xaf\xea\x9c\x4d\x16\x74\xe4\x65\x4b\x43\xf5\x0c\x3c\xbd\x34\x18\x56\xcb\x85\x04\x8b\x87\xf5\x5f\x88\xb8\x58\xff\x75\x73\x06\xd6\x7f\xbe\xc2\xe6\xa4\x25\x95\x44\xdf\x8d\xe2\x87\x29\x55\x02\x30\xbb\xab\x23\x38\x21\x1f\x0d\x53\xc0\xcd\x48\x17\x52\xa4\x85\x2a\x33\x99\xf6\x70\x0c\x78\xa9\x45\xf8\xc6\x94\x52\xfb\x98\xc3\x3f\x80\x73\x22\x59\x0e\x65\x25\xf8\xeb\x75\xc4\x43\x6b\xee\x7d\xb3\xc1\x24\x47\xcc\xa1\x15\x25\x7a\xcf\xa3\x7d\x41\x89\x3b\x61\x63\xa9\x3d\x19\x07\x22\x49\x94\x44\x01\xca\x8a\x2b\xa6\xd0\x53\xf0\x10\xbb\x59\x6d\x4c\x5f\x8d\x61\xe2\x7a\x36\xed\xa5\x01\x38\xed\x1b\x74\x00\xf7\x89\x6f\x58\x0b\x98\xa2\x16\xe0\x96\xdd\xb9\xad\x46\x6e\x4c\xca\x9a\xec\x3c\x7b\x31\x72\xa7\xdb\xef\x35\xb1\x74\x83\x4e\x7d\x0c\x3d\x34\xf6\x54\x64\xd5\xc1\xdd\xb3\x5e\x47\x38\xc4\xcf\x5d\xe4\x3c\xa1\xf8\x08\xf3\x11\x54\x2e\xdd\xfe\x76\xab\xd9\xc1\x60\xc9\x1c\x4a\xdb\xa0\x3e\xe8\x28\x96\x99\x88\xff\x64\x4a\x49\x73\x2e\xb0\x80\x9c\x1c\x61\x6d\x1c\x39\x42\x85\x51\x4b\x11\x8e\xaf\x38\x77\x4c\xee\xbd\xe5\x86\x5e\x55\x8e\x8e\xa9\x73\xa4\x17\x10\x46\x3e\x0b\x5d\x45\x72\x64\xd9\x22\xe2\xb0\xa6\x7e\x85\x50\xbc\x35\x35\x6f\x2a\xeb\xbc\x47\x2b\xb6\xa6\x88\xe1\x67\x87\xa7\xa9\xcc\x43\x9e\x28\xc5\x10\x4b\x89\xe5\x6b\x49\xc4\xdd\xc8\xf3\x19\x5c\x6c\xde\x5c\xf4\x29\x07\x73\x64\xc5\x1e\x52\xad\xc2\x00\x93\x31\xf3\x44\x36\xbd\xaf\x41\x97\x48\x01\x78\x93\xd7\x0c\x12\x9a\xc1\x6c\x70\xf6\x4e\x3e\xf0\x21\xf4\xa8\xbe\xfa\xd3\xa8\x14\x18\xce\xfa\xd3\x59\x7f\x1a\x44\x7f\x72\x18\x8b\x25\x38\x7b\x74\x29\x37\x60\xd8\x2a\x54\x55\x22\x93\x03\xc0\xa3\xb7\xa6\x55\xa5\x44\xee\x5b\xdc\xb4\x3e\x74\x69\x15\x2c\xb3\x8f\x0b\x75\x37\xfe\x23\x61\x3c\x12\x31\x2e\xbe\x7e\x7f\x2e\x15\x88\x36\x95\x4e\xe2\xf6\x65\x6d\xbf\xe5\x5a\xed\xe0\xdd\x7d\x97\xae\x17\x1d\xb0\xae\xc0\xf7\x03\x31\xf8\x8a\xad\x97\xc9\xc4\xb6\x56\xb6\xc5\x1a\x30\xfc\xbd\x72\x42\x62\x59\x69\xd8\xdc\xb6\x62\x2e\xf9\x01\x2f\x4e\xa2\xac\x18\x99\x07\x26\x6b\xb6\x16\xf9\x76\x54\x3e\xa4\x6f\x7a\xad\xcc\x13\xaf\x40\x26\x88\x8a\x5c\x6b\x80\xe9\xf6\xa5\x4a\x07\x76\x82\x4e\x2c\x1c\x94\xeb\x14\x56\x34\xc8\xfd\xf9\x5b\xa2\x02\x15\x03\xfd\xbe\x2a\xa2\x74\x57\x42\x1e\xca\x51\xa5\x76\xea\xab\x8c\x6f\xc8\x86\xe6\x01\x55\xd0\xdd\xdf\x91\xf2\x40\x9c\x6c\x12\xd9\xaf\xde\x61\x6d\xe8\x73\xc3\x34\xd0\xae\x23\x0a\x95\x15\xca\x50\x4a\x7b\x2a\x6c\xca\x7c\x79\x1a\x6a\x42\xd1\x9b\x8b\x5e\xdd\x78\x31\xf5\x85\xf1\xd7\xb3\xca\x30\xfe\x8e\xad\x35\xec\xbf\xa5\xf7\xb6\x19\xb4\x72\xb8\xfd\xd9\x6d\x31\xc4\x39\xac\x58\x64\x85\xf3\x60\x85\xd3\x13\x1d\x34\x0c\x37\xe9\x65\xb7\x31\x08\xf5\xfb\x4d\x36\xe6\xe6\x37\x6c\xad\x19\xd6\x67\x6b\xf2\x0b\xbf\x73\x87\xed\xdc\xd4\x33\x38\x7b\x6b\x3b\x6d\xc1\xb3\xb7\xf6\xec\xad\x3d\x7b\x6b\xcf\xd6\x86\xb3\xb5\xe1\xec\xad\x25\x67\x6f\xed\x20\x73\x38\x9c\xb7\x16\x45\xbd\x7d\x3e\x5b\x23\xec\x55\x0e\xdb\x93\xfa\x6b\x4d\xe1\x9e\xeb\x28\x12\x05\x57\x5f\xc4\x3d\xeb\xec\x74\xa8\xc9\xff\x3b\xef\x01\x00\x84\x06\x7d\x60\xf7\xe1\x93\x29\x07\xe1\x52\x49\x90\x6c\xd1\x47\xaa\xa0\x45\x9c\x68\xc9\xbf\xf7\x36\xb3\x2f\x70\xc1\x89\x78\xcc\xe2\xea\x86\x39\xca\x4a\xcf\xf5\x84\x5c\x93\x9c\x45\x49\x96\x98\x32\xf2\x14\xaf\xe3\xc6\x2b\x6b\x23\x24\x4a\xb2\xf4\xce\x60\xd4\x73\xb7\xd6\x4f\x25\xbf\x1b\x3a\xb8\xf7\x33\xc8\xa1\x84\x45\x32\xb7\xb5\x90\x72\xf6\x4f\xcb\xda\x4c\x6f\xbe\xb8\x6f\x70\xcd\x2b\x30\x14\xaf\xc4\x10\x7c\x2c\x4b\x4c\x82\xf5\x63\x1f\x7f\xf6\x5b\x96\xe4\xb0\x79\xe7\x2c\x12\xbc\x4b\x4d\xd5\x86\x05\xda\x79\x53\xc5\x9f\xc0\x36\xca\x62\x12\x17\x79\x59\x33\x75\x43\xd3\x24\x4e\xd4\xb6\xf4\xda\x99\xf2\x5a\x14\x4f\x4c\xb9\x8c\xb2\x9a\x46\x42\xb3\x2c\x17\x34\x5a\x31\xe9\x7c\x0d\x05\x14\x93\x44\x56\xc6\xbe\x63\x09\x38\x90\x51\xa0\x8d\x66\x90\xe9\x96\xe4\x42\x59\xc7\x7b\xc3\x07\xbf\x38\x2f\x83\xe6\xc8\xe5\x54\xbe\x05\xef\xbc\x70\x5f\x81\xbd\x4a\xee\xdc\x3f\x24\x11\x69\x6c\x21\x4c\xfe\xf8\x5a\x0b\x85\x91\xd9\x83\x9a\xf8\x01\xc0\x85\x12\x24\xd5\x0c\x5b\x13\xc4\xe6\xc6\x3f\xfe\x44\x56\xa2\xc8\xe5\xc4\x05\x1d\x78\x03\xd7\x50\xbf\xb3\x42\xa5\x22\x29\xa3\x52\x91\x37\xaf\xc9\x3a\xe1\x85\xe6\x53\xc1\xdb\x26\x5c\x0e\x72\x24\xa0\x3f\xfc\xd4\xb9\x5d\xa8\xec\xd3\x28\xf5\x64\x88\x8d\x6c\x44\x1f\x73\x92\x30\x31\x0e\x91\xc5\x6b\x82\x90\x21\xba\xee\x6c\x73\x25\x1e\xe1\x7c\xfd\x5f\x21\x16\x5b\x15\x92\x44\x69\x5a\xf8\xd9\x93\xff\x6d\x2e\x76\x01\x4f\xa9\xb0\x53\x0e\x7e\xf4\x51\x2a\x5c\x2c\x13\xa9\x5a\xea\x5b\x54\xf9\x95\x07\x1f\xeb\xce\x56\x96\x5a\x3b\x08\xcc\x95\x81\x36\x56\x22\xb6\xb6\xa5\x28\x62\x58\xcc\xf2\xb6\xaa\x94\xc4\x05\x3e\xdb\xfa\xfa\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\x26\x74\xd9\x2d\x11\x3c\x56\x6c\xe6\x9f\x02\x99\xf0\x25\x82\x9c\xaf\x8b\x54\x25\x59\x5a\x8d\xfb\xb3\x6d\x60\x08\xb9\x6b\x73\xa3\x8e\x99\x88\x62\x62\x31\xa2\x4d\x81\x7d\xf2\x87\xf2\x5d\x8c\x2b\xc4\xea\xce\x35\x3f\xc8\x68\x4e\xcb\xc9\x83\x4a\xba\xf2\x95\x31\xdf\x51\xf0\x28\x1a\x38\x4c\xdd\x8a\xa6\x55\x8f\x1d\x2f\xd2\x90\x9b\x46\x31\x4e\x79\x07\x53\xb5\x0f\xcf\x05\x8d\x88\x78\x28\x83\xc9\xb0\x0c\x4a\x6d\xb7\x18\xa1\xe6\x2d\x8d\xee\x19\x8f\xb1\x68\x14\x0c\x3b\xde\x72\xba\x36\x68\x5b\x4e\x3d\xee\x5a\x7b\x39\x32\x86\x09\x4c\xdf\xb3\x69\xc6\xc8\x75\x87\x9c\x83\x42\x06\x43\xd9\xe8\x26\x6d\xe7\x5c\xa2\xc9\x26\x4f\x36\x11\xb3\xfc\x5f\xb7\x1b\xb2\xeb\x9b\x0e\xb9\xf4\x3b\x9d\xb7\xcb\xe3\xec\x5f\x20\xf7\xa5\xe5\x1c\x40\xb5\x68\xaa\x8f\xf6\xb6\xcc\x19\xad\x2d\xee\x62\x3b\x6c\xd5\x9b\x7c\x11\x92\xf9\x7b\x99\x2f\x62\xff\x10\x7f\xa6\xb1\x90\xe4\x6d\x2a\xa2\x7b\x72\xcb\x40\xe8\x7a\xcc\xf2\x2c\xf9\x22\x7e\x4a\x08\xef\x35\x5d\xb6\xf9\xd9\xc6\x64\x2d\x78\xa2\x44\x7e\x98\x5e\x9c\xae\xec\xe4\x19\xee\xb9\x11\xa1\x4a\xef\xe6\xe7\x0c\xf6\xac\xb7\x5b\xe8\xc2\x43\xa3\x52\x3d\x83\xd3\x89\x97\x4c\x15\xb0\x9e\x67\xed\xf7\x2b\xf1\x30\x56\x62\x5c\x48\x36\x4e\x3a\x38\x74\x03\x86\x79\xcf\xb6\xe0\xc5\x0e\x1c\xa8\x69\xe6\xe9\x0c\x4a\x80\x05\x0a\xae\x6b\xce\xfd\xf9\xed\xed\x57\xc9\xf2\x89\x2b\x03\x5e\x31\x15\x5d\x45\x2c\x5b\x5d\x99\x37\x3c\xcb\x49\xb1\x44\x24\x74\x56\x6c\x3b\x64\x33\x91\x48\x53\x93\x98\x2d\xee\xc8\x0d\xcb\x56\xe5\x8b\x4f\x3d\xea\xa7\x43\x04\xce\x84\x08\x05\x42\xbd\xd4\x6d\xfc\x43\x04\x57\xf0\x0c\x39\x9b\x29\x5f\x84\x15\xa1\x38\xd5\xf6\x79\xd6\xa5\x36\x1f\x71\x72\x1e\x17\x4e\xf9\xd2\xc3\x53\x76\xe3\x3d\x7d\xb0\x64\x1b\x31\xe2\x91\xa0\xe9\x1d\x0a\xdd\x31\x8b\x89\xd8\xb0\x3c\x4f\x62\x26\x49\x49\x83\x5c\x2d\x35\x49\x4f\x3d\x6f\x67\xdc\xe6\x27\xc7\x6d\xee\xa1\x0e\x5d\x82\x3e\xe4\x91\x29\xb8\xb2\x43\xa6\x68\xbc\x4e\xf8\xb3\x23\x54\x32\xa2\x29\x9b\xfe\x1a\xa0\x7f\x98\x16\xbe\x0a\x32\x37\x17\x1d\xfc\xb4\x16\x54\xb2\xbf\x94\xfb\x86\x70\x11\xb7\x99\x54\x1f\x41\x91\x58\x52\xc5\x1e\x5a\xd9\xe1\xb8\x22\x54\xed\x4f\x82\x70\xfa\x94\x2a\xc7\xb3\xc0\x08\x74\xf6\x3c\x82\x9e\x0d\xc9\x54\xcd\xaa\x85\x1a\x27\xb1\x95\x0b\xbf\x5b\x07\xdd\xb5\x3b\xf8\x7a\x36\x25\xbf\xe0\xe3\xc3\xa2\x17\xe6\x42\xa1\x18\x78\x2b\xd6\x34\x09\x2d\xb2\x51\x6f\x5e\x47\x5f\x75\x87\x30\x2b\x9f\x25\xe6\x61\xa7\x80\xcb\x5d\xb2\x2c\xb4\x4e\x67\xf4\xb0\x67\x05\x30\xb7\x23\xba\x3c\x5f\x80\xb9\xe3\xab\x41\x38\x26\x27\x1b\x17\x59\x49\x2c\x76\x29\x81\x95\x94\x3e\x50\x22\x19\x97\x09\x38\x64\x1c\xaf\xb8\xa9\xf4\x87\xa5\x25\x31\x08\x12\x45\x9c\x11\xf9\x20\x96\x09\xb7\xa7\x57\x18\x7f\xdd\x1d\x4d\xd2\xae\x93\x71\x96\x49\x9e\x5c\x26\x91\x32\x7d\xc7\xe9\x22\xed\x12\x6e\xe0\x6f\xb5\xb2\x21\x79\x9f\xd2\x25\x61\xf0\xc7\x55\x9c\x48\xfd\x2f\x99\xcf\x3f\x80\x11\xbe\xe0\x56\x62\x06\x03\xb5\xa1\x7d\x65\x92\x02\x1e\xc4\x61\xcf\x0e\x92\x9e\x1e\xe8\x7f\x4e\x4b\x92\xf0\x58\x77\xdc\x29\x05\x87\x41\x52\xf0\x04\xe2\x21\x96\x31\xbf\x18\x36\xb0\x60\xe4\xcb\x2a\x89\xee\x67\x8e\xdd\x5d\xe4\xfa\x1a\x77\x2e\x79\x0c\xac\x7e\x6f\x48\x6a\x69\xba\x3a\x0b\x57\x8d\x9d\x96\x96\x0f\x58\x82\x31\x37\xe3\x87\x7b\x54\x4a\x11\x25\x95\xcf\x05\x6c\x34\x15\x73\x88\x81\x39\x0c\x3b\x26\x10\x0f\x42\x87\x83\xf2\xc7\x1e\x8e\x66\x57\xd3\x56\xc7\x95\x2e\x07\x4b\xb8\x1d\xf5\xa0\x43\xc0\x3d\xd3\x03\x1a\xbd\x6a\xb8\x0b\x8d\x6e\x85\xe1\x9a\x63\xc1\x86\xa9\x9b\xc5\xb3\x82\x98\xad\xcd\xb9\xb3\x7c\x25\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xd2\x36\xf6\xa9\xe1\x35\x6f\x22\x5e\x33\xae\x06\x38\x73\x99\xc8\x8a\x14\xe3\x39\x8e\xc7\x77\xb7\x36\x63\xfc\xce\x40\xae\x87\x53\xa0\x96\x5e\xba\x81\xbd\xe1\x91\xce\xdf\x06\x76\xa9\x23\xdc\xbd\xfe\xc3\x4f\x3f\xbd\x74\x34\xd3\xae\x2a\xf8\x63\xc0\x99\x76\x34\xd1\xee\xc9\x2f\x9a\x9e\xf3\x8b\xbe\xdf\xfc\xa2\xc7\x47\xa1\x1d\x38\x83\x28\x30\x36\x37\x2c\x2e\xb7\x7b\x8e\x50\xe7\xe8\xdd\xd0\xc8\xdd\x80\x2c\xa0\x61\x73\x7f\x82\x63\x59\x43\xf2\x7c\xce\xd9\x3d\xdf\x6a\x76\x4f\x9f\x58\xd6\xf0\x4c\x9e\x90\x18\xd6\x6f\x31\x6b\x27\xe0\x70\x76\xcf\x2e\x39\x3a\xa7\x24\x1c\x04\x30\xdc\x9e\xd6\xa7\x20\x55\xd5\x72\xaf\x06\x69\x93\xca\x2d\xf6\xd8\xe5\xa5\x74\xa0\xc5\x94\xd0\x27\xf0\x24\x0a\x09\x09\xd0\xc6\xf0\xf5\x22\xa4\x36\xa4\x69\xf3\xeb\xbc\xe6\x98\x29\x2f\x3f\x8d\x3f\xe6\x7b\x70\x78\x9c\x6b\xba\xbc\x10\x93\xbb\xf4\xd0\x5a\xac\xb5\x02\x48\x00\x30\x72\xb1\x70\x51\x22\xab\xa3\x73\x3d\x9b\x6a\x1d\x1c\xd2\x88\x68\x2a\x27\x64\x0f\x9f\xb7\xe6\x52\x23\x17\x58\xfe\x4e\x95\x62\xeb\x4c\x75\x5f\xf5\xb3\xc5\xfd\xc9\x2d\xee\x03\x5a\x00\x57\xc5\x9a\xf2\xb1\x3e\x51\x60\x73\xf7\xbc\x75\x35\xca\x3c\x21\xe6\xec\x20\x7b\x02\x0b\x08\x24\x17\xf8\x85\x8d\xa9\x53\xe6\xf2\x71\xcc\x9e\xf0\xee\xde\x23\x47\xbe\x5a\x3b\x69\x91\xd8\x09\x78\x35\xc3\x29\x67\xc1\x1e\x2a\x87\x39\x7b\x6a\xb8\x5a\x31\xe4\xe1\x33\x48\xc8\xa9\x9e\xf2\x25\x69\x14\xa5\x69\x9a\x8a\x07\xfc\xb6\xcb\xd7\xf4\xec\xeb\xbe\x98\x4c\xb3\x05\x23\xeb\x44\xeb\xe8\xc6\xc0\xea\x76\x07\x5d\xa6\x5a\x22\x67\x39\x0a\xbc\xb9\x71\xb6\xcd\x99\x32\x0b\x05\x0b\xad\xf5\x5b\x8e\x01\xe1\xfa\xff\x36\xaa\x08\xbe\x6d\x69\xc2\x82\xad\xe8\x26\x11\x45\x8e\xad\x95\x20\x17\xe6\x16\xf0\x86\xad\x28\x4a\x7b\x17\x16\xc3\x2c\x47\x27\xf7\xcc\xd3\xa7\xea\x26\xa8\x02\xb1\xb0\xa6\x89\x31\xfb\x2d\x91\x6a\x77\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x23\x33\xcd\x16\x82\xab\xda\x79\xed\x7c\x79\x65\x33\x87\x5b\x2f\xa8\xa6\x5d\x2b\xba\xeb\xc9\x44\xa0\xef\x50\xfc\x29\x3d\x61\x69\x12\x6d\x83\xcb\xbd\xd5\x5a\x5b\xa2\x2d\x4b\x1f\x9a\xbe\x4e\xde\x52\xc9\x62\xf2\x91\x72\xba\x44\x7d\xef\x87\xf9\xec\xed\xc7\x57\x7a\x5d\x41\x9f\x9c\xde\xee\x75\xb4\xcd\xdd\x97\x7f\x1a\x32\x5f\x64\x67\xe0\x3d\x58\xd5\x4e\xfb\x9e\x83\x1f\x34\x11\x86\x94\x7c\xa8\x1b\x58\xef\x1e\x16\x34\xab\xa7\xb0\xd6\x6b\x7e\xd6\x08\xcc\x66\x1d\x1f\x59\xe5\x33\xe1\x52\xd1\x34\x9d\xa5\x94\x5f\x67\x59\x2e\x36\xfb\xb5\x71\xaf\xaf\xf6\x41\xdb\x53\x0c\xf3\xb0\x17\x33\x9c\x7a\x70\x61\x73\x32\xad\xde\x3f\x21\x53\x55\x6a\xe1\x82\x03\x4b\xbd\xb8\x2e\x94\x58\x53\x95\x44\x17\x5a\x59\xbf\xf8\x48\x79\x41\xd3\xbd\x41\x57\x07\x87\xd1\x24\x22\x1e\x6c\xd4\x0c\x5d\xd7\xa1\xd9\x41\x59\xe3\x70\x7b\x45\x73\x4d\x9d\x6e\xe6\x7f\x0d\x6a\x2b\x15\x55\xc5\x0e\x15\x3e\xc0\x19\x9a\x79\xc1\x98\xa4\x54\xaa\xaf\x59\xac\x0f\x7d\xed\xee\x21\x82\x1f\x51\x45\x53\xb1\xfc\x33\xa3\xe9\xfe\x1d\xee\xed\x93\x1b\xf7\x69\x6b\x80\x32\x0e\xff\x62\x51\x3e\x78\x29\x89\x16\xb0\x6d\x0e\x7c\xce\x52\xb6\xa1\x5c\xd9\xe6\x58\x5c\x5d\x5e\x9a\xf1\xc3\x2e\x4a\x2a\xe3\x6b\xcc\x14\xcb\xd7\x09\xf7\xdf\x39\x87\x67\x6f\x04\x8f\x13\x34\x3b\x82\x41\x0d\x5b\xf8\xef\x6d\xde\x6a\x4d\x9e\x86\x03\xbe\x05\x1f\x5d\xd3\xe9\x8f\x3f\x15\xf8\xd8\xc2\xc8\x97\x2b\xbc\x08\x9e\x76\xaf\x6f\x3b\x33\x45\xee\xb9\x16\x0c\x01\x47\x64\x3f\xd9\x6a\x95\x13\xda\xe4\x83\xb1\x5d\x63\xec\x42\x73\xe0\xe8\xd8\xf4\xbb\xc9\x07\x71\x68\x8b\xe1\xaf\x5d\xb2\xa8\x77\xa5\x99\xa6\xee\xdb\x77\x65\x33\xcc\x64\xa9\x15\xe4\xf7\x1e\x6a\xe6\x01\x9d\x04\xaf\x6e\x32\x52\x57\x54\x7b\x9f\xd6\x56\x18\xec\x3b\xaa\x6c\x07\x89\xb1\x95\x69\x75\x04\x97\xf7\x15\xeb\xa9\x89\xff\xcb\x8d\x2a\x42\x49\x96\x30\x04\x3f\xa1\xdc\x4c\x16\x70\x16\x46\x63\x73\x51\x73\x30\xad\x12\xc2\xbd\x91\x71\x86\xa3\x71\xd9\xc4\x5a\x58\x03\x35\x45\xf0\x0f\x70\x5c\x5c\xfd\x22\x8c\x91\xd7\x24\xe9\x6a\x1a\x00\x9c\x7c\x44\x64\x11\xad\x08\x95\xba\x6b\x7a\x43\xeb\x13\xcf\x26\x6b\xca\x93\x3b\x26\xd5\xa4\x44\x09\x96\x7f\xff\xf1\x1f\x13\xf2\x5e\xe4\xc4\x04\xaa\x8f\x2c\xaa\x86\xe9\x67\xb5\x2f\x12\x89\x83\x29\xdb\x56\x5a\x6b\x26\x62\xd3\xe9\x07\xe8\xac\xa2\xf7\x9a\x87\x61\x67\x0b\x06\xae\x8b\x3f\x91\x0b\x2d\x26\x3a\x9f\xfe\x97\x66\x4b\xff\xbe\x20\x3f\x3c\x00\xd3\xbe\xd0\x7f\x5e\xe0\x07\xcb\xb0\x49\x57\xa9\xae\x3e\x8c\xc9\x92\x79\xb2\x5c\xb2\x1c\xd5\x47\x02\x49\x85\xaf\x0c\x2a\x08\x17\xce\xc3\xd6\x29\x5d\xa9\x9b\xf5\x8e\xfc\xfd\xc7\x7f\x5c\x90\x1f\xfc\x71\x91\x84\xc7\xec\x37\xf2\x23\x5a\x97\x13\xa9\xc7\xf8\xca\x38\x73\xe4\x96\x2b\xfa\x9b\x7e\x67\xb4\x12\x92\x71\x54\xe5\x95\x20\x2b\xba\x61\x44\x0a\xad\x01\xb3\x34\x1d\x1b\x5b\x3a\x79\xa0\x80\xd4\x62\xa7\x12\x12\xeb\x49\x46\x73\xe5\x6d\x89\x89\xb1\x90\xc0\xd7\xf4\xb2\x2d\xb9\xf5\x4c\xdf\x25\xdc\xf8\xaf\x8c\xe7\x4c\xaf\x39\x24\x86\xe2\x22\x29\x41\xa2\x15\xe5\xcb\x32\x37\xfd\xae\x50\x45\xce\x5a\x5c\x3f\x1d\xcf\xc0\x7d\xc2\x83\x52\x98\xff\x92\xf0\x7a\x50\xc1\x7e\xbb\xd2\x32\x51\x36\x2b\xc2\xc4\x2a\xaa\xed\x95\x5e\x85\x3c\x59\x14\x4a\xe4\xf2\x2a\x66\x1b\x96\x5e\xc9\x64\x39\xa6\x79\xb4\x4a\x14\x8b\xf4\xb0\xae\x68\x96\x8c\x23\xc1\xf5\x8a\x03\x2a\xc3\x3a\xfe\x3d\x94\x37\x1d\xeb\xae\xb6\xa0\x4e\x77\x1c\x74\xbb\x51\xed\x49\x8d\x69\x83\x8d\xb1\x83\x3d\x68\x77\xa0\x68\x9b\x39\xc1\x68\xc1\x10\x72\x35\xc8\x60\x2d\x68\x72\x38\x8f\xb9\x34\x38\xe0\x51\xfd\x1d\xfa\xd8\x61\x00\x09\x9c\x4a\x8f\x52\xae\x69\x8c\xa4\x94\xf2\xed\xa3\x6f\x7e\x3d\xa5\x00\x97\x1f\x6d\xc7\xf0\x0a\x91\x8e\x29\x8f\xf5\xff\x31\x61\x27\xda\x0e\x32\x87\x45\x12\x44\x08\xbe\x4e\x6f\x4f\x73\x24\x8a\x64\x80\x53\x6f\xe4\xb5\x8e\x42\x14\x8a\xaa\x18\xa8\x91\x17\xcc\x32\x4d\x5f\x40\x4d\xa4\x7d\xeb\x7f\x1a\xff\x4b\x89\x76\xd6\x26\x52\x1d\xf6\x9a\x38\xb2\x63\xc7\xfe\x7e\xa8\x5a\xb8\x36\x39\x08\xbc\xa2\x52\x19\x68\x2d\x8b\x41\xe0\x0d\xc3\x2a\x28\xc0\x60\x9a\x1d\xc3\x9d\xf6\x90\x8d\x17\xd0\x1d\x19\xef\xc5\x5c\x8a\x4a\xa5\xa4\x5d\x81\xaa\xf4\x17\xaf\x0e\x1a\x0e\x4a\x31\xa9\x08\xdd\xd0\x24\x05\xeb\xbc\x58\x48\x96\x6f\xb0\x20\x95\x81\x1a\xa4\x75\x3d\xcb\xd4\x9c\x40\x31\xea\x44\x9a\x8f\x1d\xc3\xee\xaa\x1c\x1a\x00\x68\x43\xb5\xde\x37\xf6\x7a\x10\xbd\x07\xd5\xcb\xc6\xdb\xfa\x0b\x3d\xd5\x18\xbd\xff\xfe\xcc\x68\xae\x16\x8c\xaa\x2f\xc9\x21\xbe\xbb\xb3\xa5\xbd\x76\x65\x29\xf7\x72\x43\x3f\x30\xb2\x14\x4a\x8b\x58\x05\xec\x7d\x94\x49\x11\xd4\xa7\xdc\x68\x8f\xbd\xa3\xab\x51\x7e\xc9\x29\xa4\xf8\x08\x1e\x38\x4c\xbf\xe1\xee\x38\x8d\x74\x6c\x76\x92\xc2\xa7\x11\x48\x43\x70\x66\xd6\x0e\xbd\x19\x40\x81\x4e\x33\xe4\x35\x93\xf2\x20\xc0\x86\x1f\x5d\x88\x4f\xe3\x51\xae\xb9\xd6\xd6\xf6\x1e\xa6\x85\x68\x01\x3a\x66\x8a\x26\xa9\x3d\xca\x38\x15\xe5\x2c\xb5\x51\xd7\x83\x03\xcc\x19\x95\x87\x04\x04\xaf\xd7\x9f\xe1\x61\xec\xb4\xe0\x6c\xfc\x20\xf2\x98\xdc\xd0\x35\x4b\x6f\xa8\x64\xe6\x5d\x6e\x8a\x1e\xae\xd1\xa5\x1c\xb4\xcb\xfb\x6d\x5f\x0d\x5d\x46\xe3\x4f\x65\x12\x86\xbf\x2a\x15\x0b\x3b\x38\xb2\x26\xc8\x2f\x79\xc1\x46\xe4\xbd\xe6\x5e\x23\xf2\x95\xdf\x73\xf1\x70\x5c\x5f\xd5\x41\x2f\x88\xd7\x53\x37\xfc\xc3\xc2\xea\x78\x06\x9f\xb2\xbb\x3d\x7b\x64\x08\x7e\x83\xa9\xd1\x67\x36\xe5\xa3\xb6\x47\xfa\xbf\x3b\x26\x28\xad\x28\xe6\x62\x99\x33\x89\xc8\x35\x7b\x41\x12\xbb\x9a\x9c\x7f\x61\xdc\x24\xf7\xb5\x76\x6f\xba\xaf\x95\xed\xa9\xe5\x6b\xcb\xea\x8e\x59\x6f\xf3\xb1\x2c\xdd\x2b\x6a\x1c\x8e\x08\x74\x3a\xda\x60\x7c\x6a\xea\xe1\x7e\xa3\x93\xc3\xf5\x9c\x67\x51\x28\x39\x64\x1d\xb5\xa3\xbb\x99\xff\xb5\x79\xb2\x1b\x79\x5f\x1b\x7f\x6a\x37\x4b\x1d\x6b\x90\x6a\x3d\x33\xad\x46\xa8\xb3\xf9\xe9\x6c\x7e\x7a\x49\xe6\xa7\xd6\x1d\x7f\xc8\xe4\xf4\x32\x8c\x4d\xad\x43\x3c\x64\x60\x7a\x96\xa6\xa5\x4e\x23\x3a\x68\x4e\x7a\xb6\x86\xa4\xd6\xa1\x75\x34\x1e\x7d\x3f\x66\xa3\xd6\x19\x3b\x60\x2a\x7a\x86\x46\xa2\x2e\x02\x19\x8b\xbb\x88\x89\x53\xe7\x61\x57\x50\xac\xca\x59\x96\xaf\xb3\x41\x39\xae\x38\xd3\x57\x5a\xd4\x02\x5c\x6b\xdf\x2e\x4d\xe7\xba\xcb\x5e\x46\x60\x34\xc5\x1e\x77\x3a\x4b\x6e\xdf\xcd\x3e\xbf\xbb\xb9\xfe\xf2\xee\xb6\x2e\xdf\xed\x9b\xe9\x16\x49\xec\xb0\x0d\x62\xec\x48\x62\x0d\x0f\x68\x82\xdc\x70\x4b\xef\x81\x86\x5b\x45\x91\xec\x6b\x75\xbc\x5c\x78\x14\x97\x3b\x8a\x7f\xb4\x9f\xce\xae\xc7\xf3\x2b\x06\x4e\x51\x13\x73\xa6\xe5\x9e\x95\x48\x63\x69\xe3\x56\xa7\xb7\x65\x26\x55\xc2\xa3\xb4\x88\xb5\x70\xf1\xf5\xeb\xf4\x56\x4e\x08\x79\xcb\x22\x5a\x48\xb0\xc2\xc4\x82\x5f\x2a\xf2\xeb\xa7\x0f\x7f\x83\x78\x6c\x78\x62\x54\xe2\x9a\x00\x2a\x6f\x42\x11\x58\x58\x21\x5c\x1b\x79\xcb\x50\x50\x81\x2f\x47\x34\xd3\x54\x4c\x62\xe5\x0a\x05\xb2\xc8\x8a\xa5\x99\xa6\x98\xf7\x8c\x54\x08\xaa\xfa\xc5\x55\x85\x79\x1b\x3e\xb9\x64\x0a\xb3\xae\x0e\x45\x48\x1e\x9c\xb5\x16\x8b\xeb\x11\xb6\x56\x4f\x7d\x34\xda\xf8\x03\x95\xc6\x62\xb5\xb7\xb7\x2d\xeb\xdb\x6e\x9f\x69\x36\x71\x34\x18\x37\x90\x3c\xc3\x5f\x3b\x7d\xd6\x9d\xad\xec\x18\x18\x44\x92\xa8\xce\xd6\xd4\xe6\x30\xa0\xfd\x75\x00\x76\x6c\x19\xac\x3e\xc9\xde\x87\xcb\x88\x6c\xa7\xcb\xdd\xfa\x02\x45\x44\x62\xaf\xf6\xa7\x89\x9f\xf3\xaf\x15\x8b\xb2\xfa\x6b\xd5\x5f\x63\x91\x21\xff\xfa\xf7\xef\x7e\xf7\xff\x01\x00\x00\xff\xff\x6c\xfc\xad\x6c\x34\x86\x0b\x00") +var _olmManifests0250CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\xde\xbf\x02\xcb\xcd\xb9\xb6\x5b\x49\x9e\x49\xda\x7c\xad\xbf\xb6\x59\xae\xed\x24\xbe\x99\xf1\x68\xd9\x4e\x7a\xfb\x65\x72\x1a\x88\xdc\x92\x50\x93\x00\x0b\x80\xb2\x95\x93\xf3\xbf\xdf\x85\x8d\x07\x49\xbd\x25\xd2\x33\xb2\x87\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xbf\x1f\xdd\x6e\xf7\x37\x34\x63\x3f\x80\x54\x4c\xf0\x53\x42\x33\x06\x8f\x1a\xb8\xf9\x4b\xf5\xee\xff\xa4\x7a\x4c\x9c\x4c\x5e\xff\xe6\x9e\xf1\xf8\x94\x9c\xe7\x4a\x8b\xf4\x06\x94\xc8\x65\x04\x17\x30\x64\x9c\x69\x26\xf8\x6f\x52\xd0\x34\xa6\x9a\x9e\xfe\x86\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\x64\x77\x04\xbc\x77\x9f\x0f\x60\x90\xb3\x24\x06\x89\x93\xfb\x57\x4f\x5e\xf5\xfe\xdc\x7b\xf5\x1b\x42\x22\x09\xf8\xf8\x1d\x4b\x41\x69\x9a\x66\xa7\x84\xe7\x49\xf2\x1b\x42\x38\x4d\xe1\x94\x44\x54\xd3\x44\x8c\xec\x22\x54\x4f\x64\x20\xa9\x16\x52\xf5\x22\x21\x41\x98\xff\xa4\xbf\x51\x19\x44\xe6\xed\x23\x29\xf2\xec\x94\x2c\xbc\xc7\xce\xe7\x17\x49\x35\x8c\x84\x64\xfe\x6f\x42\xba\x44\x24\x29\xfe\xdb\x7d\xbc\x7d\xed\x2d\xbe\x16\x7f\x4f\x98\xd2\xdf\xcd\x5f\x7b\xc3\x94\xc6\xeb\x59\x92\x4b\x9a\xcc\x2e\x18\x2f\xa9\xb1\x90\xfa\xba\x78\xbd\x79\x5d\x44\xb5\x92\x91\xbd\xcc\xf8\x28\x4f\xa8\x9c\x79\xf6\x37\x84\xa8\x48\x64\x70\x4a\xf0\xd1\x8c\x46\x10\xff\x86\x10\x07\x42\x37\x55\x97\xd0\x38\xc6\x6d\xa1\x49\x5f\x32\xae\x41\x9e\x8b\x24\x4f\x79\x78\x95\xb9\x27\x06\x15\x49\x96\x69\x04\xfd\xdd\x18\x48\x26\x41\xeb\x29\x82\x84\x88\x21\xd1\x63\xf0\xef\x0e\x4f\x11\xf2\x6f\x25\x78\x9f\xea\xf1\x29\xe9\x19\x08\xf7\x62\xa6\xb2\x84\x4e\xcd\x6a\x4a\x77\xd9\x6d\xba\xb0\xd7\x4a\xbf\xeb\xa9\x59\xba\xd2\x92\xf1\xd1\xaa\xa5\x98\xfb\x36\x5f\x83\x05\xcd\xdd\x34\x9b\x5f\xc2\xcc\x8f\x9b\xbe\x3f\xcb\x07\x09\x53\x63\x90\x9b\x2f\x22\x3c\x32\xb7\x86\xfe\x82\x2b\x4b\x16\x52\x9a\xd4\x1f\xa8\xde\xdc\x61\x98\x7b\xc1\xd9\x68\xfe\x1b\x63\xaa\xfd\x8f\xf6\xa6\xc9\x6b\x9a\x64\x63\xfa\xda\xfd\xa8\xa2\x31\xa4\xb4\xc0\x07\x91\x01\x3f\xeb\x5f\xfd\xf0\xc5\xed\xcc\x05\x52\x85\x4e\x05\xcf\x09\x53\x84\x12\x09\x99\x50\x4c\x0b\x39\x35\xd0\x3a\xbf\xfd\x41\x75\xc8\xf9\xcd\x85\xea\x10\xca\xe3\x70\xf0\x48\x46\xa3\x7b\x3a\x02\xd5\x9b\x5b\xab\x18\xfc\x1b\x22\x5d\xfa\x59\xc2\x7f\x72\x26\x21\x2e\xaf\xc2\x80\xc7\xc3\x64\xe6\x67\x03\xff\xd2\x4f\x99\x34\xef\xd4\xa5\x83\x6c\x47\x89\xca\x55\x7e\x9f\xf9\xc2\x43\x03\x06\x7b\x1f\x89\x0d\x81\x03\x85\x28\xe0\xce\x18\xc4\x0e\x76\x16\x35\x98\x32\xdf\x2f\x41\x01\xb7\x24\xcf\xfc\x4c\xb9\xfb\xa6\x1e\xb9\x05\x69\x1e\x34\xc7\x3d\x4f\x62\x43\x09\x27\x20\x35\x91\x10\x89\x11\x67\xbf\x84\xd9\x14\xd1\x02\x5f\x93\x50\x0d\x4a\x13\x3c\xb5\x9c\x26\x64\x42\x93\x1c\x2c\x28\x53\x3a\x25\x12\xcc\xbc\x24\xe7\xa5\x19\xf0\x16\xd5\x23\x6f\x85\x04\xc2\xf8\x50\x9c\x92\xb1\xd6\x99\x3a\x3d\x39\x19\x31\xed\x69\x78\x24\xd2\x34\xe7\x4c\x4f\x4f\x90\x1c\xb3\x41\x6e\xc8\xe1\x49\x0c\x13\x48\x4e\x14\x1b\x75\xa9\x8c\xc6\x4c\x43\xa4\x73\x09\x27\x34\x63\x5d\x5c\x2c\x47\x3a\xde\x4b\xe3\xdf\x4a\x47\xf5\xd5\xe1\x0c\xf8\x16\x22\x33\xf1\x64\x73\x25\xac\x0d\xf1\xb4\x58\x64\x1f\xb7\xdf\x52\x80\xd4\xfc\x64\xa0\x72\x73\x79\x7b\x47\xfc\x02\x2c\xd8\x2d\x84\x8b\x5b\x55\x01\x6c\x03\x28\xc6\x87\x20\xed\x9d\x43\x29\x52\x9c\x05\x78\x9c\x09\xc6\xb5\x3d\xd2\x09\x03\xae\x89\xca\x07\x29\xd3\x0a\x71\x0e\x94\x36\xfb\xd0\x23\xe7\xc8\xc2\xc8\x00\x48\x9e\x99\x93\x14\xf7\xc8\x15\x27\xe7\x34\x85\xe4\x9c\x2a\x78\x72\x50\x1b\x88\xaa\xae\x01\xdf\xe6\xc0\x2e\x73\xe0\xf9\x07\xe6\xce\x18\x21\x9e\x43\x6e\x74\xf3\xb2\x43\x49\xec\x09\x5c\x44\x81\xc9\x8a\xb3\x68\x06\x8d\x63\x09\x6a\xc1\x85\xb9\x03\x69\x6f\xb4\x78\x32\x16\xca\xec\x1f\xd5\xe4\xdd\x9b\xb7\x24\xa2\x9c\xe4\x0a\xcc\xe1\x89\x04\xe7\x06\x21\xb4\x20\xd4\xf0\xb2\x2e\x3c\x32\x85\x08\x24\x61\xc4\x94\x96\xd3\x1e\xf9\x5a\xc8\x94\xea\x53\xf2\x17\xff\x53\x17\xa7\x13\x92\xb0\xec\x6f\xa7\x7f\xc9\x84\xd4\x7f\x23\xef\x78\x32\x35\x93\xc6\xe4\x61\x0c\x9c\xdc\x86\x6f\x23\x7f\x2d\xfd\xf1\x8d\xcc\xa2\x1e\xb9\x1a\x71\x21\xfd\x9d\x06\xab\xae\x52\x3a\x02\x32\x64\x90\x20\x5e\x2b\xd0\xbd\xd9\x1d\x5c\xb9\x8b\xc4\x8a\x4b\x43\x36\x7a\x4b\xb3\xb5\xa0\x39\xf7\x77\x9a\x77\x99\xd7\x97\x99\x77\x71\x51\x0b\x44\x65\xf3\x49\xe6\x9f\x34\xba\x27\xd4\xbd\x25\xa5\x59\x57\xe1\xb1\x29\x81\x69\x33\x08\x9c\xfb\x09\x0c\xfc\x8a\x9f\xaf\x1c\xe5\xea\x6d\xfb\xd9\xe5\x2f\xdb\xfa\xd9\x42\x0c\x59\x0b\xb4\xb7\x8b\xb8\xc8\x06\xef\x18\xc9\x2c\xea\x8b\xd8\x7e\xf6\xda\xb7\x7c\x53\xbe\x9b\xc0\x63\x26\x14\x28\x12\xb3\xe1\x10\xa4\xa1\x3b\x62\x02\x52\xb2\x18\x14\x19\x0a\x89\xfb\x95\x89\x18\xcf\x64\xd8\xbf\x0a\xab\xed\x8b\x78\xd3\x8d\x31\xaf\x46\x86\x61\x91\xd1\xa1\xe1\xd2\xcf\x5d\x78\xda\xc9\x9a\xc3\x6b\x06\x17\x31\xdc\x42\x02\x91\x16\x72\xf1\x1d\x33\x30\xb9\x2e\x3d\xe0\xa8\xbe\xff\xeb\x61\xcc\xa2\x31\x49\x73\x85\x54\x57\xcb\x1c\x2a\x70\xd1\x82\x0c\x99\x26\x82\x13\x8a\xaf\x35\xb4\x7e\xfe\xc9\x94\xea\x68\xec\xee\x38\x54\x24\xa1\x03\x48\xd4\xec\x3c\x03\x40\x96\x1b\xe7\x09\xc4\x66\x42\xa4\x25\x38\xe7\x92\x4f\x58\x03\x25\x62\x49\x59\x90\xb7\x57\xc3\x8c\xac\xc3\x32\x0b\x78\x26\x24\xd3\xd3\xf3\x84\x2a\xb5\x0c\xa7\xe7\xa0\x7b\x35\x44\xf4\x61\x43\x06\x71\x87\x30\x1e\x33\xa3\xd2\x28\xff\xed\x87\x2a\xcc\xdb\x33\xf7\x1a\x06\x57\xba\xdf\x43\xc8\xdf\x43\x1e\x58\x92\x18\x60\xc5\x30\xa4\x79\x82\x44\xf2\x17\x90\x82\x30\xc4\x4e\x89\x78\xc5\x85\xbf\xbc\x1a\x78\x2b\xbe\x55\x41\x94\xe3\xb7\x0a\xae\xe1\x51\x2f\x3f\x5d\x73\xdf\x7b\x70\xbb\xe8\x51\x64\x09\x03\x20\x82\x23\x21\xfc\x39\x81\x11\x8d\xa6\x3f\x9b\xe5\xff\x2c\xc1\x2c\x24\xd2\x10\xff\xdc\x43\x39\xbf\x72\xc4\x0c\x80\x04\x52\x6d\x60\xe6\x0b\x09\xe3\x66\xcb\xcd\x61\x63\x7a\x8c\x00\x92\x6c\x34\xd6\xe6\x2e\xa7\x78\x54\x17\x80\x67\x2e\x5c\x34\xac\x9f\x32\x0e\xf2\xc7\xdf\xfd\x34\x77\xa7\x15\xd9\x90\x57\x25\x89\x78\x28\xe3\xa7\xcc\x39\x61\xdc\x9c\x77\xe2\x3f\x90\x9c\xc5\x29\x53\x28\x91\x1e\xf5\x6f\xcf\x8e\x2b\x5f\x42\x52\x11\x43\xc7\x7c\x5f\x2c\x40\xf1\x43\x6d\x4e\xbb\x99\x50\x81\x7f\x0d\xd5\xe6\x35\x06\x27\xdc\x69\x89\xa8\xe1\x99\xee\x9d\x06\x60\xc2\x10\x96\x01\x84\x97\xdf\x9e\x91\x9f\x07\x54\x41\xc2\x38\x58\xd8\x65\x92\x4d\x58\x02\x23\xf3\x46\xee\x75\x4f\xd5\x23\xe7\xb9\x34\xf4\x2c\x99\x3a\xc4\x20\x8b\x77\x85\x29\x92\xf3\x19\x74\xf3\x98\x65\x65\xbe\xf2\x66\x99\xbb\x95\x91\xba\x6e\xf1\x89\xa9\xe1\xe2\xd4\xdf\x87\x7b\xa3\xc7\x94\x2f\xdd\x5c\x23\x29\x9a\x89\x19\xb7\x4f\xb1\xd8\x8a\xe6\x20\xa5\x90\x3d\xf2\x0f\x43\x3b\x73\xa3\x61\x13\x91\xc4\x20\xbd\x76\x47\x98\xa1\x97\xaa\xe3\x81\x84\x12\xbb\x93\x03\x1d\x60\x16\x00\x7e\xf9\x37\x3b\x99\xdf\x10\x1c\x40\xb9\xc4\xaf\xb7\x47\xde\x73\x23\x50\x52\x32\xcc\x8d\x08\xe8\x75\x0b\x7b\xe6\xca\xa0\xf1\x87\xd0\x4f\x50\x7a\x7d\x27\x2c\x3b\xa5\xcc\xa1\x5a\xd0\x33\xa4\x35\xb0\x98\xb9\x58\xf8\x3e\x65\x11\x99\x86\xd7\x89\x21\x11\x59\x6a\x29\xa0\xca\x33\x23\xfe\x28\xf3\xa5\xdc\x80\x26\xaa\xb0\x9f\x4c\xc4\x6a\x21\x00\xcc\xb2\x32\x09\x19\x95\x81\x62\x2b\x20\xd1\x98\x72\xa3\xeb\x99\x0f\x0d\xb2\xb2\x91\xbd\xcc\x6b\xe9\x40\xe4\x1a\x71\xcc\x9d\xd5\xa1\xc8\x79\x4c\x0c\x51\x29\xc4\xe9\xfb\x7c\x00\x92\x83\x06\x94\xa8\x63\x11\x29\x23\x4c\x47\x90\x69\x75\xe2\x4f\xd3\x49\x26\xe2\xae\xff\xa3\x4b\xfd\x21\x39\x39\x3c\xd8\x95\x1a\x11\x0f\xf9\x53\x62\xf7\x6a\xc9\x5d\xc0\xf3\x74\x39\x81\xef\xae\x7e\xd8\xdc\x50\x80\x71\xe1\x4d\x5a\x24\x46\x6d\x2e\x6c\x3a\x8b\x16\x5a\x36\x5a\x14\xf7\x13\xb3\x13\x25\x9b\x85\x13\xce\x2d\x75\x3b\x54\xe5\xa9\x57\x13\x6d\x2a\x25\x5d\xf6\x09\x4c\x43\xba\x82\xc3\xcd\x1b\x54\x0c\x6d\x33\xba\x58\xb1\x50\x14\x00\xb4\xa6\x86\x17\xa3\xf2\x6b\xaf\x18\x72\xc5\xa7\xc4\xe0\xb3\x93\xf3\x91\xab\x3b\x3e\xa6\x25\xcb\x12\x20\x7f\xb9\x87\x69\xc7\x6a\xc6\x30\x1c\x42\xa4\xff\xe6\xce\xb3\xb9\x07\xef\xc7\xc3\xed\x4d\x0f\x7f\xf1\xff\xfa\xdb\xb2\x2f\xde\x88\xcb\xaf\x97\x88\xec\xb0\x4b\x5a\x75\xc7\x0c\x84\x2e\xf1\x81\x19\x96\x6d\x21\x60\xe7\x32\xf0\xc1\xcf\xea\x91\xcb\x34\xd3\x53\x92\x02\xe5\xca\xcb\x3b\x86\x66\x94\x6e\x56\x8e\xc2\x95\xa8\x2d\x32\x99\x60\x29\x40\x0c\xb9\x16\xb7\x4e\x0a\xea\x90\xbe\x84\x21\xc8\xe2\x17\x64\x64\xd7\xe2\xf2\x11\xa2\x5c\x2f\x95\x8b\xca\x70\x5b\x79\xa4\xcc\xb8\x87\xe9\x16\x00\xf9\x0e\xa6\x5e\xa3\xb1\x5f\x76\x0f\x53\x8b\x0c\xf8\x53\x81\x43\x34\xcb\x12\x06\x56\x69\x5f\x05\x99\x7b\x98\x2a\x94\x7a\xcc\xf3\xf7\x76\x76\x30\xf7\x77\x0a\x2c\xf1\xc2\xe7\xa5\xd1\x1b\xd5\xff\xb5\xf8\x1a\x89\x74\xc0\xb8\x7d\x99\x9d\xda\x6f\x05\xce\xee\x01\xca\x63\xfc\x13\x5f\xd3\x04\xb8\xfc\xa2\xb6\x80\xd9\x3b\xff\x1d\x85\x45\x84\x50\xb3\xa2\x43\x45\x24\x24\xf6\xc4\x8f\x59\xe6\x0d\x4d\xb8\xf4\x1e\xf9\xc1\xb0\xc7\xc2\x3c\x8e\xb8\x61\x21\x80\x5f\x75\xf9\x9f\x9c\x26\x3d\x72\x61\xa9\x22\x7e\xbd\xfb\xc9\xdd\x64\x00\xf9\x9f\x9c\x4d\x68\x62\xb4\x1a\x2d\x0c\xcb\x8a\x23\x2a\x63\xe4\x06\xce\x7a\xa5\x84\xdd\x3d\x1a\x04\x0e\x7f\xda\x8b\x3d\x52\x68\x39\x23\x19\x95\x9a\x45\x79\x42\xa5\xb7\xc8\x4f\x1b\x81\x68\x81\x34\xb7\x10\x09\x1e\xaf\x3c\xc1\x4b\xa9\xab\x7b\xb6\x0c\x63\x14\xa3\x40\x32\x11\xa3\xe2\xc6\x52\x98\x45\xd2\xa3\xaa\x72\x23\x86\xfe\x54\x87\x23\xd6\xb1\x52\xcd\x03\x53\xce\xb8\x15\x0c\x08\xcc\x1a\x18\x8e\x4b\xe4\x31\x9c\x8a\x1e\xf9\xfb\xd4\xf3\xab\x0e\x61\xda\x4a\xe4\x28\xff\x79\x19\xc6\xa3\xac\x03\x76\x71\xa0\x86\x42\x82\x51\xfa\x8f\x62\x81\xcf\xc0\x84\x45\xfa\xb8\x47\xfe\x9f\x11\xf1\xcd\xc6\x73\x18\x51\xcd\x26\x41\x86\xf4\x92\x88\x96\x40\x8d\x4c\x4c\x15\x79\x45\x8e\xf0\x31\xc2\xd2\x14\x62\x46\x35\x24\xd3\x63\x32\x98\xe2\x6b\xd4\x54\x69\x48\x37\xd9\x3a\xc6\x35\x8c\x2a\xd6\xf1\xf9\x31\x74\x86\x1b\xc6\xf5\x97\x7f\x58\x71\x27\x2e\x76\x8b\x9d\xfd\x01\x45\xca\x0a\xa9\xb1\x52\xe6\xcc\x16\x06\x1e\x24\x02\x15\x09\x74\x83\x29\x77\x16\x3a\xc5\xb9\x2a\xc9\x7e\x9e\xcc\x84\x0d\xfe\xb7\xc1\x03\x4a\x24\xa0\x83\xc7\x61\x6e\x0d\x1c\x67\xd1\x2a\x83\xc9\x52\x8e\xb6\xdc\x9e\x47\x50\x42\x31\xe2\xff\x97\x7f\x58\x62\x28\xb1\xd6\x78\xb3\xe7\xf3\x36\x3f\xb2\x01\xa3\x2c\x26\x5f\xb6\x59\x6b\x8f\x75\x78\xfd\x4e\x33\xa0\xa8\xbf\xd6\x88\x13\x0c\x28\x46\x45\x72\xfb\xdd\xf5\x76\x32\x12\x34\x3c\x3b\x9b\x21\x7e\x8c\x2b\x4d\xb9\x66\x48\xd9\x82\x45\xcd\x5b\xd8\x8c\xf8\xbd\x8d\x11\x07\x71\xcd\x11\x1a\x8b\x5c\xce\x66\x3a\x47\x1f\xb6\x36\xb6\x79\x35\x7f\xbd\xf5\xb5\xef\x0d\x02\xf6\x9d\x54\x29\x36\x32\x52\x26\x79\x00\xd4\x86\x1d\x3b\xa9\x4a\x9b\x56\x2b\xc0\x07\xd9\x2f\x78\x9a\xd2\xc0\x04\x98\xf6\x72\x7f\x24\xb8\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xeb\x4f\x26\x20\x7b\xe4\x7b\x65\x76\x8a\x7c\xcb\x46\x46\xef\x73\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x53\x06\x74\x43\x90\x12\x62\xb4\xb6\x11\x23\x03\xf9\x19\x20\x9e\xb9\x5f\x91\x38\x47\x0f\xc4\xec\x22\x72\x03\x07\x6b\x2e\x90\x46\xa9\xf1\xe6\xb9\x60\x28\xb1\x07\xde\x7c\xd2\x48\x58\x5f\x03\xfa\xc3\x0c\xed\xd4\xa2\xa0\xa3\xcc\x1a\x88\xc3\x1c\x8c\xeb\x2f\x3e\xb7\xf3\x56\x15\x61\x34\x60\xcf\x7c\x0c\x2a\x6e\x39\xb7\xc0\x87\xb2\x95\xc6\x93\x99\x57\x76\xaa\x45\xcf\x21\x39\xa6\xe9\xec\x92\x0b\x9a\x2e\x29\xbf\x87\x98\x24\xf0\xc8\x22\x31\x92\x34\x1b\xb3\x88\x26\xc9\x14\x8f\x29\x1a\xc9\x98\x56\xa8\xf5\xaf\x30\x66\x2f\x23\xe3\xc1\x31\xba\xb5\x51\x57\x41\x24\x41\xaf\x77\x10\xdc\xda\xfb\x0a\xa6\x8c\xea\xb2\x18\xfa\x09\x2c\x8e\x38\x9c\xf3\x56\x70\x1a\x45\xe6\x20\x21\xea\x1a\xad\xdd\x09\x20\x25\x54\xee\x91\x2b\x64\xa9\x03\x50\x88\xe5\xf7\x00\x99\xc5\xb4\x84\x29\x4d\x54\x8a\x36\x15\xc5\x78\x04\x04\x68\x34\xb6\xe0\xe4\x00\xde\xcc\xa8\x25\x03\x2b\x06\x19\x56\x3b\x0d\x7b\x03\x5c\x2f\x16\x6a\x56\xeb\x5d\x2b\x74\xae\xd5\x60\x0c\x34\x65\x3d\x24\x0b\x5a\xe4\x79\xa2\xf3\xc4\xab\x22\xe8\x61\x8b\x57\x5b\xef\xd9\xad\x36\xc2\xc7\x68\x3d\xad\xf9\xbe\x72\x7b\xf0\xbe\x8e\xc5\x83\xf7\xc3\xcd\x1d\x72\xb4\xd8\xf8\xbd\x8d\x99\x8a\xcc\x49\x87\x98\x9c\x0b\xae\x50\x3e\xb5\xee\x58\x74\xa7\x4e\x68\x62\x51\xc1\x4f\x9c\x89\x24\xc1\x23\x9f\x7b\x75\xc2\xc8\xf1\x9c\x40\x3a\x80\x38\x86\xd8\x7c\x96\x5d\xca\x12\x36\x57\xd3\x80\xee\xf9\x43\x5f\x24\xc9\x6a\x2e\xb6\x52\x2f\xdd\x44\x2b\xf5\x00\x58\x25\x1b\x55\x59\x9f\x87\x98\xb3\xc5\x19\x9c\x8e\x41\x83\x4c\x19\x77\xe2\x91\x11\x75\x03\x60\x07\xa0\x1f\x00\x38\x89\xc6\x10\xdd\x87\xa3\xe4\xbc\xd9\x33\xbb\xe6\xec\x4f\x55\x8a\x55\x04\x0a\x88\x24\x41\x45\x43\x01\x10\x66\x74\x02\x0e\x0f\x65\x9b\xd5\x02\x76\x63\x58\xf4\x84\xb2\x84\x0e\x12\x40\xae\x19\xfe\xea\x54\xbc\xea\x9e\x9f\x67\x79\x92\x18\x21\x96\xc7\x64\x74\xd3\x3f\x27\x5a\xd2\xe1\x90\x45\xe6\x52\xcc\xa4\xb5\xfa\x56\x1d\xf2\xd5\x17\xae\x12\xd7\x96\x9e\x08\xa5\xa9\xce\xe7\xf6\x68\xc5\x06\xaf\xda\x58\xa3\x87\xb0\xa5\x06\xa2\xca\x56\xde\x54\x95\x15\xb3\x0c\xb0\xca\x56\xc5\xfe\xdd\x23\xd7\x02\x75\x04\xaa\xc9\x5b\x50\x86\xed\x22\x80\x6e\x80\x2a\xc1\x4b\xd4\x15\xa5\x5f\xc9\x46\x8c\xd3\xc4\x7d\x54\xd9\xbe\x17\x74\x0f\x8a\x26\xe5\x94\x8d\x24\xd5\x81\x28\x16\xeb\x76\xdc\xc5\xf1\x45\x6b\x09\xed\x91\x33\x3e\xc5\xfd\x1e\x02\x35\x3f\x98\x99\xb5\x14\x71\x1e\xa1\x1d\x3e\x49\xd0\xdd\x5b\x4c\xd2\x28\x19\xad\xba\x17\xce\xfd\x4b\xbc\xa0\xa7\xcc\x01\xa0\xcc\xb9\x94\x04\x07\x42\x55\x66\xf4\x38\x8f\x93\xd6\x14\x5e\x00\x18\x99\xc5\x59\xff\x8a\xf8\x80\xb9\x1e\xe9\x76\xbb\xe4\xce\xfc\xac\xb4\xcc\x23\xe4\x2f\xe6\x08\xf1\xd8\x71\x0a\x8b\x7d\xf8\x91\x14\xc5\x4e\xfc\x0c\xe2\x2c\x1f\x56\x04\xcb\xa8\x1e\x93\x9e\x05\x7c\xaf\x04\x0a\x42\xbe\x36\xbc\xe6\x91\xa6\x99\xc1\xfb\xf7\xdc\x52\xef\xaf\x85\xb8\xb5\x9b\x64\xdf\xf9\x3f\xe4\xe4\x64\x16\x27\xc4\xc0\x88\xa8\xce\x80\x88\xa8\x31\x14\xe2\x50\x55\x3f\xa9\x67\x1e\xfc\x8e\x8b\x07\xbe\xe8\xed\xf8\x2e\x2a\xe1\x94\xbc\x3f\x38\xf3\xa7\xef\xfd\x41\x87\xbc\x3f\xe8\x4b\x31\x32\x62\x2b\xe3\x23\xf3\x83\x41\xaa\xf7\x07\x17\x30\x92\x34\x86\xf8\xfd\x81\x99\xf6\xf7\x99\xd1\xb0\xde\x82\x1c\xc1\x77\x30\xfd\x2b\x4e\x16\x7e\xf6\x1c\xe1\xaf\xa9\xb9\x8e\xbf\x1b\x16\x6c\xf8\xd4\x5f\x53\x9a\x85\x1f\xde\xd2\x2c\x3c\x7c\x5e\xe0\xd9\x8f\x3f\xa5\xa0\xe9\xe4\x75\xaf\xd8\xd1\x9f\xff\xad\x04\x3f\x7d\x7f\x50\xac\xbf\x23\x52\x83\x19\x99\x9e\xbe\x3f\x20\x95\xb7\x9e\xbe\x3f\xc0\xf7\xfa\xdf\xfd\x22\x4f\xdf\x1f\x98\x37\x99\x9f\xa5\xd0\x62\x90\x0f\x4f\xdf\x1f\x0c\xa6\x1a\x54\xe7\x75\x47\x42\xd6\x31\x02\xd3\x5f\x8b\x37\xbc\x3f\xf8\xd9\xec\xc9\xc9\x89\x73\x61\xe0\x66\x2a\xf2\xbf\x8b\x8d\xd5\x6b\xe9\xfe\x6a\xfd\x0d\x8d\xd0\x54\xe9\x3b\x49\xb9\x62\x3e\x7e\x6c\xe9\xad\xa9\x3d\xef\x4b\xaf\x4b\xa4\x01\x4b\x2f\x5b\x6c\x58\x7a\x79\x09\xf7\xdc\x84\x73\xcd\x7f\xc3\x86\x56\xe7\xf9\x07\xbd\x48\x63\xae\x14\x76\x9a\xb0\x3f\x86\x07\xb8\xbb\xcd\x59\x34\x72\xbc\x39\xe2\x8e\xbe\x19\x89\x91\xe3\xbe\xf5\xdc\xf9\x0d\x0a\x7e\x88\xfd\xc8\x79\x0c\x32\x41\x67\x55\x31\xab\xf5\x84\xc4\x3d\x62\xed\x06\x34\x58\x69\xee\xcd\x41\x42\xee\xc4\x4b\xc6\x6b\x5c\x57\x98\xd1\xd0\x0e\x7b\xe6\xdd\x34\xc8\xe8\xa2\x08\x32\x8d\x9c\x6e\x77\x17\x33\x29\x19\x55\x8c\x64\xd5\xd5\xcb\xd1\xc3\x21\xc7\x86\x80\x77\x77\xbb\x68\x9d\x3c\xa5\x86\x75\xd0\xd8\xac\xb7\xb8\x66\xd5\x37\xab\x6e\x59\x92\x6a\x9d\x42\xd6\xc6\xef\xf7\xc1\x81\xda\x31\x12\x14\xcc\x32\x3d\x5d\x6b\x31\xd9\xe8\xe3\x53\xfa\xf8\x06\xf8\x48\x8f\x4f\xc9\x17\x9f\xff\x9f\x2f\xff\xb4\xe4\x46\x4b\x18\x21\xfe\x06\xb8\xb3\x05\x6d\x08\x86\xf9\x07\x67\x8d\x86\x45\x88\xe7\xa8\xb8\x27\x18\xb9\x0b\x0c\x7a\xa0\x18\xc0\xe1\xd8\x65\x9e\x19\xb8\x18\x42\x6f\x6d\x0d\x11\x74\x8c\x90\xb4\x70\x32\x16\x08\x78\x32\x25\xaf\x3f\xef\x90\x81\x03\xf1\x3c\xf9\xfe\xf1\xf1\xa7\xde\x82\x25\x33\x45\xfe\xdc\x99\x59\x0f\x53\xc4\x6c\x95\x18\x22\xe2\x58\x15\x53\x82\xe5\x84\xde\x18\x30\xcf\x09\x21\xac\x77\xdd\xc6\xad\xb3\x07\x6e\x66\x0b\x4c\x19\x67\x69\x9e\x9e\x92\x57\x4b\x6e\xb1\x24\x6d\xc3\xdd\xb4\x37\x17\x82\x00\x35\xa4\x6b\x24\x69\x6a\x44\x9e\x88\xb0\x18\xb8\x66\x43\x86\x41\x03\x01\xb5\x51\xdd\xb7\x0f\xfa\x18\x94\x00\x45\x0c\x4f\x31\x74\xa8\x84\xec\x7d\x2b\xe7\x48\xe4\xc0\xce\x7b\x13\x95\x09\xd4\x34\x03\x7b\x1a\xac\x02\x43\xe0\x31\xb3\xa2\x6a\xc9\x0d\x91\x02\xe5\x8c\x8f\x7c\xd8\x8b\xb7\x25\x5b\xae\xfb\x30\x06\xe7\x3d\x87\xb2\x2f\x28\x32\xca\x52\x8c\x7a\x13\x25\xa3\x9c\x4a\xca\xb5\x51\x63\xcf\xfa\x57\x56\x46\x9f\xb5\x69\xd2\x22\x16\xd2\x9f\x46\x7b\x54\x2d\xb1\x32\x4b\x74\x7e\x73\x3c\xb1\xcd\x1d\xd5\xd7\xaf\x3e\x5f\xb9\xe5\xe1\xbe\xe5\x2e\x3c\xaa\x35\x48\x7e\x4a\xfe\xfb\xc7\xb3\xee\xff\xa3\xdd\x5f\x7e\x3a\x72\xff\x78\xd5\xfd\xf3\xbf\x3a\xa7\x3f\xfd\xae\xf4\xe7\x4f\xc7\x5f\x7d\xb6\x64\xa6\xc5\xc2\xfc\x12\xf4\x71\x4c\xc4\xcb\x89\x7e\x47\x3b\x3e\x4a\xe5\x4e\xe6\xd0\x21\x5f\xd3\x44\x41\x87\x7c\xcf\x91\x35\xd4\x04\xda\x6a\x0f\xb5\xe1\xca\x07\xe6\xad\xcb\x3c\xe5\xee\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xa9\xaf\x9b\x01\xc9\x9b\x1a\x4a\x94\xa6\x14\x73\x8b\x41\x9a\xe6\x20\x89\x9e\x93\x70\x7b\x91\x48\x4f\x4a\x31\xb9\x46\xb4\x7e\x4b\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x54\xac\x48\xc2\xee\x81\x9c\x15\x7a\xa3\x21\x96\x03\x88\x28\xca\xe2\x72\xc0\xb4\xa4\xd6\xe8\xeb\xe5\xca\xc2\xa2\x34\xcc\x13\x72\x64\xd4\xd5\x1e\x06\x92\xcd\x51\xd7\x63\x67\xbd\x1d\xb0\x84\xe9\xa9\x55\xa5\x23\xc1\x87\x09\x73\x2a\x40\x9a\x09\xa9\x29\xd7\xce\xce\x08\x23\x78\x24\xac\x70\x7d\x33\x45\x8e\x62\xae\x5e\xbf\xfe\xfc\x8b\xdb\x7c\x10\x8b\x94\x32\xfe\x75\xaa\x4f\x8e\xbf\x3a\xfa\x4f\x4e\x13\xf4\xf2\x5e\xd3\x14\xbe\x4e\xf5\x71\x73\x6c\xf1\xf5\x97\x1b\x9c\xa2\xa3\x1f\xed\x59\xf9\xe9\xe8\xc7\xae\xfb\xd7\xef\xfc\x4f\xc7\x5f\x1d\xbd\xef\xad\xbc\x7e\xfc\x3b\xf3\x0d\xa5\x13\xf8\xd3\x8f\xdd\xe2\xf8\xf5\x7e\xfa\xdd\xf1\x57\xa5\x6b\xc7\x8b\x0e\xe3\x63\xb7\x08\x15\xe9\x1a\x2d\xa0\x9b\xd2\xac\x7b\x0f\xd3\x25\x87\x73\xa9\x38\x3a\x3f\x91\x85\x58\x4a\xb3\x45\xda\xb7\x8d\xad\xbd\x01\x8c\xe7\x8c\x16\x22\x79\x4d\x0f\x0c\xa7\x4b\x44\xb2\x6e\x11\x81\xb5\x83\xd5\xc9\xf0\x1d\x6b\x69\x5b\x25\x4e\x6f\x80\x2d\x9b\xc9\x8f\x7c\x45\xfc\xe2\xda\x97\x84\xef\xdc\x79\x06\x7f\xbe\x97\xa4\x7e\x6c\x3c\x4f\xce\x96\x6a\x5a\x55\x1b\xe6\xd5\x85\x15\x7d\x91\xf4\xa0\x38\x37\x16\x46\xcf\xcb\x39\xfb\x4f\x0e\xe4\xea\xc2\xd1\xa3\x0e\x61\x3c\x4a\xf2\xd8\x48\x0a\xdf\x7f\x7f\x75\x61\xf4\xf7\xbf\x3b\x72\xf3\x00\x24\x16\xfc\x50\x93\x77\xd7\x6f\xfe\x89\xc6\x00\xbc\xa3\x63\x19\xba\xf5\x47\xd1\x84\xd9\xac\x11\xcf\x80\xc9\xdf\xc1\xc6\xc9\xe1\x9b\x23\x9a\x05\xfb\x09\x92\x3b\x8c\xb0\x4a\x32\x23\x40\xdc\x03\x51\xb9\x74\xab\x33\x13\x5b\x8f\xaf\x81\x35\x71\xfe\xe0\x11\x68\x44\xf2\x04\xb3\x1f\x76\x01\x9a\x8b\xc7\x67\x82\xdf\x1a\x29\xf0\x09\xce\x87\x41\xe4\x77\x4e\x66\xc5\x77\xec\x70\x18\x56\x24\x21\xac\xfd\x42\xe2\x0e\xd3\xb9\xfd\xd2\x27\x3f\x49\x73\xdf\xbb\xd3\x1b\xad\x3d\x13\x3d\x9b\x37\x6b\xec\xcf\x73\x61\x5c\x55\xd5\x79\x26\x17\x0c\x6d\xab\xc1\x39\x3a\xa6\x8a\x0c\x00\x38\x9a\x73\xad\xf5\x0f\xb8\xc3\x3a\x28\x0c\xb1\x79\xd6\xd5\xa2\x1b\x2f\xde\xbc\x35\x90\x5b\x0f\xb5\x15\x9a\x6b\xe5\xdb\xce\xb6\x56\x54\x1f\xc6\xd3\x45\x30\x50\xd6\x9c\x89\x81\x43\x5e\x06\xd9\xf6\xc3\x96\x2b\x26\x33\x56\x5d\xd4\x2c\x9c\x51\xc3\xe9\x19\xf3\x4b\x32\xda\x63\xc5\xb2\xa1\x05\x7a\xf3\xaa\x96\xbd\xed\xd7\x68\xb7\xf9\x16\xe4\x84\xed\xc4\xfc\xd6\x1d\xcc\xc8\xc6\x99\x9c\x3d\xfd\xb1\x32\xa2\xd7\xce\x2f\x41\xd3\x5f\x24\xd6\xb8\x6f\x56\xc6\xbf\x23\x04\x57\x45\xf9\x6f\x33\xc7\xb6\xcc\xd2\x52\x93\x53\xcc\xb8\xf0\x3f\x69\x21\xd1\xe5\x5e\xfe\x2d\x1f\x04\x41\xb9\x98\xdd\xe9\x40\xe4\x7f\xfe\xf7\x37\xbf\x79\x96\x79\xe4\x49\xae\x34\x48\x07\x3e\x9f\x44\xfd\xe1\xf2\xc9\xed\xeb\xdd\x19\x72\x90\xc3\xeb\xa5\xbc\xf2\x45\xf7\xcc\xe7\x97\x2f\xfc\x10\xbc\x65\x61\x9e\xb9\x9a\x94\xff\xed\x6e\x2c\x32\xce\x17\xcd\xf6\x94\x99\xe7\x95\xac\xb5\xdb\x1f\x4a\xd8\xfb\x61\xd2\xcd\x67\x7c\x8b\xab\x97\x30\x29\xed\x53\xf9\xf5\x3f\xcc\xfd\xbe\xe9\xeb\xfd\xe7\x53\xf3\xe6\x52\x40\x8b\xe0\x98\x09\x9b\x50\x5f\x33\x60\xf1\x82\x16\xdc\x62\x57\x74\x33\x7f\x61\x7d\xde\xb9\xd3\x5d\xb3\x31\x55\xf3\x20\xee\xcf\xfc\xba\x60\xba\x66\xb3\xcd\x17\x61\xbf\x15\xaf\x2d\x05\x09\x9e\x35\xdc\x3b\x23\xf7\xfe\xbc\xf0\x99\xdb\x0c\xa2\x9f\xdb\xcc\xf3\x36\xf3\xbc\xcd\x3c\xdf\xd3\xcc\xf3\xf5\xe7\xde\x9c\x61\x12\x43\x94\x50\x9f\xe9\xa2\x21\x49\x30\x0d\x7c\x2c\x1e\x42\xf4\x65\x92\x94\xa3\x35\x8b\xd8\xaf\x94\x72\x8c\x68\xc8\x32\x6b\x1b\xa7\x64\xc4\x26\xc0\x43\x30\xca\xa6\x8b\x5f\x9d\x09\xbf\x98\x41\xf9\xab\x6e\x81\x33\x57\x56\x26\xc9\xcf\xca\x40\x2b\xa0\x76\x56\xdc\xeb\x6c\x04\x39\xb7\x2e\xff\x5c\x42\x8c\x69\x0f\x16\xc9\x53\x9a\xa1\x94\xe7\x53\x1b\x69\x19\xc1\x31\xe3\x66\xea\x93\xce\x06\x53\x62\xc4\x38\x24\x08\x5a\x08\x17\x98\x63\x9e\x45\xc2\x20\x41\x4b\x06\x93\xb2\x81\x34\x38\xa2\xb6\xd7\x09\x36\x4f\xa3\x5d\x29\x12\xd3\x8c\x39\xd9\x25\x0e\x82\xe5\x06\xd0\xeb\x5f\x39\x7c\x2b\xc4\x51\xe5\xf0\x0d\x14\xe6\x29\x38\xf9\x20\xc8\xb5\xf8\x26\x87\x58\x31\xc1\xd4\x0b\x8b\x19\x06\x6c\x65\x24\x1c\xa0\x65\x46\x52\x6e\x2e\x2c\x44\xee\x27\x48\xcf\x16\x0f\x7c\x79\x74\x40\xb3\x29\x5e\x65\xd8\x85\x9f\xcd\x02\x27\x98\xe1\xee\x55\x67\x2d\xf0\xb4\x5a\x0d\x1a\x61\xe7\x6e\x89\xc9\x84\x51\x42\x47\x23\x89\xd1\xb2\x4b\x23\x0d\x36\x4c\xd3\x5a\x17\x1a\x41\xf0\x30\xa2\x24\xbf\xf2\x0e\x43\x06\x57\xde\xb0\xd4\x42\xeb\x6f\x98\x17\x16\xab\x63\xb3\x84\x32\x8a\x66\x34\x0f\x5a\x21\xd7\xe4\xae\xac\xdf\x5b\x3b\xd6\xec\xb0\x1d\xd5\x7d\x9e\x59\x88\xbb\x3a\x30\xe7\xa3\x20\xcd\x86\x1c\x44\x85\x37\xdb\xb9\x49\x32\x90\x46\x1f\xb7\xf1\xc4\x94\x44\x56\x7e\x0b\x84\xc7\x7b\x87\xd7\x2c\x67\xa3\xfd\xb7\x63\x13\x2c\xb0\xa3\x8b\x21\x55\x6b\x6e\xdb\x6c\xab\xec\x58\x53\xca\x62\x76\x6c\x98\xc2\xe4\xe6\x5e\x5d\xea\xa2\xd6\xdc\x06\x0c\x8d\x4f\xba\x41\x4e\x8e\x1d\x55\xf3\x16\x7d\x78\x5b\x8e\x24\x91\xf4\x81\x00\x8f\x84\x21\x16\xff\xdf\xdb\x77\xd7\x3e\x7f\xed\x4a\x13\x96\x66\x09\xa4\x18\x57\xf1\x96\x4a\x35\xa6\x09\x48\xe4\x4e\xdf\xf3\xb4\xf2\xf7\x4c\x08\x78\x0c\x09\x9d\xda\xc9\x62\x88\x04\x5a\xe2\x85\x24\x99\x11\x70\xd3\x2c\xc7\x14\x0e\xbc\x8a\xef\x5d\x9b\xa4\xb3\x03\x68\x0a\x13\xd5\x60\xba\xd0\x02\x5a\x1d\x8f\xdd\x78\x53\x1a\x50\x5e\xcc\x7a\x4a\x60\xc7\x46\xf4\xa0\x3c\xf1\xda\xaf\x0c\x19\x32\xfd\x15\x36\xb6\xf2\x8c\x5b\xe6\x82\x7d\xf1\xf9\x8a\x3b\x63\xc8\x12\x31\x35\x78\xb1\xfe\xac\x6c\xf8\x3d\x1b\x9f\xeb\x4d\xe7\xdb\xf4\x2c\x6f\x38\x9f\x35\x4e\x35\x31\xd3\x22\x05\x6a\xa7\x89\x56\xb9\xff\xb6\x9a\x68\x81\xfd\x71\xf9\x6c\x4f\xc2\xfc\xfa\x57\xde\xda\x10\xbc\xbe\xbe\x02\x9e\xff\x13\x73\x77\xbe\x0b\x6e\xe4\x92\x5c\x1d\xbc\x81\xd6\x5a\x8f\x79\x49\x92\xe4\x9a\x25\xec\x17\x58\x93\x34\xfc\x64\x6c\x6f\x8d\x80\xe3\x6f\x5b\x23\xe6\xf8\xdb\xd6\x09\x3b\x76\x6c\xc3\x47\xd7\x63\xa1\x1d\xd5\xe4\x71\xa3\xd9\x3b\x51\x3d\xec\x4c\x5c\xdd\x8a\xc6\x29\xf9\x7a\x34\x5f\xb0\xd2\x3e\x9a\x6f\x2b\xe6\xcf\x65\x0b\x26\x47\xcb\x4c\xe6\x3d\xa3\x17\xf7\xd0\x28\xfb\xe3\x4f\x3d\x3b\xe5\xb1\xcf\x86\x77\xb6\x0d\xb6\x66\x72\x17\x92\x3a\x27\x95\x35\x0e\xa6\xc9\x6a\x2f\xfc\x52\x48\x9d\xf5\xaf\xbc\x81\xf5\x03\x6e\xad\xca\x20\xda\x03\xa9\xfb\xb6\xb2\x8c\x8a\xcc\xed\xf2\x40\x8d\x40\x8d\xa5\xc3\x06\x89\x88\xee\x9d\x2d\xf9\xe6\x22\xa4\x5c\xfa\x52\x79\x2e\xe1\x92\xb0\x75\x44\xa4\x15\xb3\x5b\x31\xbb\x15\xb3\x9f\x8b\x98\x6d\x7d\x36\xfb\x40\xa9\x66\x16\xb2\x94\x56\xd9\x78\xd8\x96\x5a\xad\x18\x2d\xb5\xc2\xd1\x52\xab\x35\xe3\xd9\x51\xab\x8d\x64\xc0\x0d\xe2\x3a\x57\x1f\xe4\xd6\xc0\xdd\x1a\xb8\x5b\x03\xb7\x1b\x2d\x2f\x73\xa3\xe5\x65\x2d\x2f\x6b\x0d\xdc\xab\xa6\x6c\x0d\xdc\x5b\x4e\xd4\x1a\xb8\x5b\x03\x77\x65\xb4\x06\xee\xd6\xc0\xdd\x1a\xb8\x5b\x03\xf7\x92\xd1\x8a\xd9\x3b\x4e\xda\x8a\xd9\x2b\xc6\xcb\x16\xb3\x5b\x03\x77\x4b\xad\x5a\x6a\xd5\x52\xab\xe7\x41\xad\xea\x1b\xb8\xa3\x04\x28\x5f\xac\xe8\xce\xe4\x49\xe0\x7d\xa1\xd5\x83\xab\x67\xeb\x7e\x1d\xc0\x98\x4e\x98\xc8\x65\x51\x50\xec\xfc\xf6\x07\x32\x02\xad\x0c\x16\xc0\xe2\xe6\x23\x35\x93\xf2\x81\xd3\x41\xb2\x70\xe2\x75\xa4\xc4\x3d\xb9\xda\xa0\x3f\x10\xc2\x7c\xdd\x3c\xc4\x50\xae\xf7\x72\xf2\x36\x71\xff\x07\xcb\xf4\x8e\xc5\xc1\xff\xe7\x37\x17\x4d\x85\xfc\x63\x17\xa0\x30\xab\x2b\x58\x8d\x15\x36\x5d\x4d\xcc\x77\x0f\x1c\x62\x4c\x06\xf5\xe5\xfd\xcd\xa1\x67\x11\xd3\xc9\x34\xbc\xb8\xb7\xa8\x3c\xcf\xf3\x49\x1d\x38\xbf\xb9\xd8\xdc\xa5\xe2\x37\xe0\x43\x78\x4f\x5a\xdf\x48\xeb\x1b\x09\xa3\x15\x83\x76\x9c\xb4\x15\x83\x56\x8c\x97\x2d\x06\xed\xbb\x2f\xa1\xf5\x00\x90\xd6\x03\xe0\x6f\x6b\x3d\x00\xad\x07\xa0\x19\x30\xb5\x1e\x80\xd6\x03\xb0\xfa\xa6\x56\x98\xdc\x71\xd2\x56\x98\x5c\x31\x5e\xb6\x30\xd9\x7a\x00\x5a\x6a\xd5\x52\xab\x96\x5a\x3d\x0f\x6a\xf5\x1c\x43\xdc\x5b\x43\x6c\x6b\x88\x6d\x0d\xb1\x2d\x37\x6a\xb9\xd1\x9a\xf1\xec\xb8\x51\x6b\x88\xdd\x76\xa2\xd6\x10\xdb\x1a\x62\x97\x8d\xd6\x10\xdb\x1a\x62\x5b\x43\x6c\x6b\x88\x5d\x3d\x5a\x61\x12\x47\x2b\x4c\xae\x19\xcf\x4e\x98\x6c\x0d\xb1\x2d\xb5\x6a\xa9\x55\x4b\xad\x9e\x07\xb5\xaa\x6f\x88\x5d\x73\x92\x2a\x28\x53\xb6\x9f\x3a\xc9\xd1\xc7\x03\x63\x65\x7f\xd7\xf1\xcd\xb6\xc0\xf2\x0d\xee\x3b\x24\x61\x29\xf3\x75\xdb\x85\x34\xd8\xd1\x8d\xa8\x02\x35\x37\xc7\x82\xf7\xaf\x5e\xfb\xea\x93\xba\xb2\x0f\x4b\x08\x64\x66\xdc\xcf\xe3\x70\x65\xeb\x65\xb0\x68\x03\xd8\x99\xf7\x9b\x1b\x8b\xbe\xb5\xeb\x3f\x7b\x87\x16\xff\x6b\xc9\xf7\xfa\xb6\xea\x03\xaa\xe0\xcb\x3f\xcc\x75\x03\x29\xdf\x92\x42\xcc\xa8\xde\xbd\xeb\x79\xf1\x8a\xe5\x98\xbb\xc1\x09\x08\xcb\xd8\x71\x16\xd7\xae\x60\xed\xde\x19\x04\x8b\xaf\xec\xcd\xbe\x6b\xfe\x6c\xb7\xeb\x82\xff\xf2\x25\x6d\x5d\x82\x66\xf5\x30\x06\xdf\x26\xce\x35\x74\x50\x7e\x52\xa6\x42\xae\xc3\xc2\xae\x84\x35\x93\x17\xfc\x7b\x16\x5c\x5e\xb7\x69\x8b\x7a\x5a\x2c\x04\x96\x07\xd0\x85\xf5\xab\x5c\x84\x22\x0e\xb3\x10\xcb\xa8\x34\x7c\xc2\xfb\x5f\x50\x74\x29\xdd\x3d\x03\xef\xd5\x3d\x1a\x57\xca\x2b\xeb\xe5\x94\x6e\xa9\xd6\xc4\x32\x9f\xcf\x26\xe2\x89\xeb\x2c\xd5\x07\x99\x32\xa5\x96\xa5\x67\x54\x97\xbe\x8e\x79\x6c\xc0\x34\x96\xc0\xdf\x7f\x51\x69\x39\x41\x88\xb4\x6a\xff\x80\x46\x44\xe6\x89\x6b\xad\xed\x9a\x4a\x10\x1a\x45\x22\xe7\x9a\x70\x80\xd8\x26\x7e\x2c\xc2\xd5\x0d\x58\xce\x06\x52\xe4\xa6\x32\x64\xd7\xae\x73\xed\x5d\xee\x1b\xce\xec\x27\x2c\x6c\x53\x52\x1e\x9b\xcb\x9c\xf8\xfa\xf5\xbc\x7b\x1b\x81\x60\x63\x71\xa0\x6a\xe8\x12\x09\x8b\xa6\x37\x79\x02\xae\xf1\x2a\xe3\x96\x6f\x05\x57\x58\x59\x51\xc8\xf0\x6e\x5c\xbd\xed\xf8\x1c\x0b\xb0\x06\x2a\x57\xda\xa5\xf2\xb8\xef\xfd\x68\x1b\x26\x99\x87\x08\xcd\xb2\x04\x13\xaf\x84\xe1\xdd\x0f\x63\x16\x8d\x8b\xae\xb5\x8b\x6e\xdb\x5c\x86\xdb\x48\xc9\x20\x5b\x29\x1a\xc4\x1b\x4f\x07\xeb\x50\x85\x6c\xa9\x71\x10\xdb\x78\xe5\x1b\x29\xf2\x6c\xc3\xdb\xe7\xed\x6e\xf6\x69\xdf\xd3\xb2\x2c\x8e\xf8\x8b\xce\x99\xe9\xfb\xf0\x5b\xe3\x9c\x33\xd6\xf7\x08\xb9\x1a\x92\x34\x4f\x34\xcb\x12\x7c\xc4\xd6\x8b\xb1\xad\xbf\x03\xdf\xe8\x10\xca\xa7\xde\x37\xea\x9a\x2f\x41\x4c\xe8\xc8\xcc\xa8\x7d\x4b\x76\xdb\xb5\x29\x4f\x8d\x0c\x52\x32\xfb\x61\x83\x4f\xf3\x7c\x98\x9d\x3c\xb0\x24\xc1\xa6\xf8\x49\x22\x1e\x20\xee\x91\x83\x83\x59\x52\x1e\x09\x59\x5a\x0f\x12\x93\x83\xdf\x55\xee\x32\x94\xa3\x58\xf0\x26\x38\x42\xb6\x16\xaf\xc9\x76\x22\x36\xd9\x5e\x99\x20\x84\x0b\xee\xcd\xc6\xdf\xdf\xbc\xd9\x0d\x11\xae\xab\x73\xb8\x2e\x5d\xa0\xcd\xb6\x64\x54\x6a\x46\x13\x92\xcb\x44\x59\x5c\xa0\x46\x60\x96\xbe\xcd\xd9\x98\xa2\xdf\x3b\x02\x65\xfb\x69\x91\xdf\xd9\xdd\x77\x9b\x63\xcf\xb8\xe0\xc9\x94\x50\xbb\x35\xc3\x3c\x49\x3a\x64\xc8\x38\x35\xa4\x1b\x32\x9f\x7b\x67\x34\x51\x72\xcb\x78\x04\xe6\x9b\xba\x41\x38\xc1\x15\x99\x19\x0d\x8d\x08\x07\x3d\x76\xad\x99\x9d\xdd\x41\xb9\x57\x98\x43\x1f\x61\x43\x59\x23\xd5\x3a\xb1\xe7\x46\x24\xe8\xad\x09\x26\x65\xec\x12\x46\xcb\x97\xff\xce\x38\xaa\x7b\xe4\x06\x99\x8f\x51\x1b\x81\xe9\xb1\xd1\x22\xb3\x2c\xc1\x06\xf2\x06\x59\x0a\xa4\x3c\x52\x79\x34\x36\x9f\x74\x90\x89\x58\x1d\x18\x52\x74\xa0\x20\x92\xa0\xd5\xc1\xb1\xf9\x6b\xf6\x1b\xf0\xfb\xca\xcf\x9d\xd0\x8c\x1d\x1c\x77\x08\x02\x08\x5b\x90\x09\x3d\x7e\xbe\x78\xe8\xbf\xb5\xd2\xf9\x72\xdd\x98\xe9\xaf\x5b\x9a\xc1\xf5\xd3\x12\x99\x6d\x4f\x65\xe8\xbc\x06\xcc\xcc\x34\x48\x69\x3b\x67\x17\x1e\xb7\x19\x82\x4f\xc8\x19\x27\x60\x7d\x24\xa0\x49\x0a\x94\xbb\xbb\x61\x02\x72\xaa\xc7\xe8\x36\x51\x81\x80\x3c\x7b\xa0\xd7\x03\xb8\x3b\xf0\x1e\xb8\x05\x92\xdb\x9e\x87\xb3\xc0\x3d\xfc\xdd\xe1\x2c\x21\x2d\x38\xc2\xb3\x05\x25\xb2\xe8\x9d\xc0\xf8\x83\x79\xb2\x0a\x42\xfb\x93\xa5\x96\x81\x7e\xbc\x79\x63\xfb\x1b\x3a\x58\x7d\xc7\x78\xac\x42\x3d\xbb\x38\xf4\xb1\x36\xf0\x5e\x08\x64\x5c\xe1\x73\x04\xf0\xbc\x08\xbc\xa9\xd8\xba\x66\xfa\x92\x8e\xb4\x0f\x6a\x0d\xf6\x4b\xac\x48\x4a\x86\x4e\x75\xac\xf3\xce\x88\x20\x09\x1d\x40\xa2\x9c\xc1\x05\x4a\xcb\x27\x67\x6f\xde\x86\xbe\xa1\xd8\x87\xfb\x43\x2b\x33\x1b\x44\x01\xcc\x75\x5f\x9d\x1f\x9b\xcb\xaf\x08\x8a\xed\xcc\xea\xe4\x16\xb4\x3d\x66\x29\xcd\xcc\x29\xb3\x73\x2c\xb4\x0a\xbf\x41\x48\xaf\x3f\x2c\x5b\xc9\xfd\x9b\x77\x4b\x5c\xf4\x92\x8d\x8e\xca\x66\x91\x06\xdb\x9c\xbd\x15\x56\x92\x62\xcc\x18\x55\x2b\x08\xed\x74\x03\x27\xcd\x47\xb4\x6c\x6c\x8d\x41\xd9\x52\x0c\xb6\xf0\x85\xf4\xbf\x17\x53\x34\xbc\x05\xdb\x28\x5e\x46\xf7\x4e\x20\xd2\x62\x75\xf1\x4f\x7f\xb3\x86\x34\x4b\xd6\x9d\x3c\xb2\xb5\x92\x96\x32\x7e\x03\x34\x9e\xde\x42\x24\x78\xbc\x21\x81\xad\xec\xc7\x5b\xc6\x59\x9a\xa7\x84\xe7\xe9\x00\x10\xc4\xca\xce\x85\x84\xc4\x2a\xc0\x94\x70\x78\x48\xa6\xbe\x89\x3f\xc9\x44\xec\xe9\xc9\xc0\x28\x6c\x34\x9e\x62\xe7\x51\x2c\x93\xcd\xa7\x66\x12\xa6\x0b\xee\x23\x49\x24\xa9\x32\x62\x51\x07\x27\x65\xda\x70\xac\x01\xa0\x97\x8e\xc5\x60\xf6\x98\x4e\x28\x4b\x8c\x68\xdd\x23\x17\x30\xa4\x79\x82\x0d\x74\xc9\x2b\x72\x64\x5e\xe6\x75\xb2\x45\x0f\x18\x71\x57\x09\xa3\xcd\x2b\x57\x55\x03\x17\x74\xbc\x85\xdf\x61\x93\x2a\xae\x7e\x6c\x5a\xcd\xd5\x8f\x8c\xe6\x6a\x53\x55\xbe\xb2\x31\x57\x3c\x36\xe7\xa1\x2c\x89\x96\x48\x3a\x53\x6e\xe6\xcd\x58\xf6\xea\x6a\x2b\x0b\x56\x2d\xc5\x48\x82\x52\x17\x40\xe3\x84\x71\xd8\x1d\xbf\xee\xc6\x40\x52\xfa\x88\x38\xa6\x59\x0a\x46\x12\x29\x63\x18\x2d\x7f\x95\x16\x24\xa5\xf7\x10\x5e\x4f\x06\x30\xc4\x06\xc9\xf8\xc1\xa5\xdd\xb7\xf8\x33\xa4\x2c\x31\x1a\xfa\x5d\x15\x36\xd8\x2b\x59\x24\x09\x48\x8b\x38\xe6\x6f\xc6\x73\x0c\xb1\xcb\xa4\x40\x65\xd2\x3e\x5a\xe6\xf1\xc8\x43\xa9\xb9\xd9\xd2\x61\xdf\x4b\xb7\x3f\x03\x8a\xcb\xc7\xc8\x1a\x0a\x25\x50\x85\xb7\x59\xdc\x54\xb9\x1c\x1a\xd5\xd1\x6b\x9c\xa5\x05\xb9\x26\xec\xe4\x5a\x68\x17\xc9\x17\x3e\x10\x9f\x76\x2d\xa2\x41\x69\x96\xe2\x01\x8b\x73\xe9\x1b\x56\x23\xcc\xe8\xe2\xad\xaf\x1c\x95\x2f\x5f\xbd\xda\x50\x7e\x7b\x7a\xa4\x97\x80\x9a\xf2\x2e\xf8\x72\x1d\xe8\x90\x27\xff\x46\x05\x36\x7b\xcc\x9c\x18\x8c\x9d\xb7\x41\xa2\xc7\x95\x29\xcd\xf8\x28\x67\x6a\x4c\x06\xa0\x1f\x00\x38\x81\x47\x5b\x53\x87\xfc\x02\x52\xe0\xa6\x1a\xf0\x16\x6e\x86\x0a\xd0\x5e\xef\x0f\xc4\x26\x4c\x31\xc1\xbf\x65\x4a\x0b\x39\x7d\xc3\x52\xb6\xa6\x00\xb5\x1f\xf3\x6e\xbf\x00\x41\x91\xc4\xe4\xc6\x6e\xc5\x2d\xd8\x0f\x96\x80\x56\x50\x2d\xac\x7a\x4a\xcc\x39\x19\xd0\xe8\xfe\xc9\x00\xfc\x6a\x5f\x20\xec\xd9\xf5\x0e\x50\x45\x79\x2f\x4c\x80\x64\xcb\x22\xe5\xe5\xa3\x85\x4f\x05\xca\x0f\x63\xa1\x00\x6f\xb0\x86\x4a\x7c\xcc\x3b\x16\x98\x0a\x04\x03\xdd\xb2\x1c\x14\xa1\xc3\x61\xf5\x8e\xe2\xb0\xa3\xe4\x99\xe6\x4a\x93\x94\xea\x68\x6c\x4d\x59\x22\x0e\xe2\xc4\xa1\x72\x62\xff\x36\x50\xde\xd8\x10\xbd\xbd\xc9\x98\xd8\x75\x5e\x3e\x1a\xdd\x72\xad\x47\xa8\x3a\x2a\x20\x9f\x9d\xa6\xaa\x01\x27\xd5\x0d\x71\x72\x5b\x6a\x9b\xf7\xdf\xa1\x11\xb9\xf8\x05\x77\xe1\xec\xfa\x62\x73\x53\xcc\x2e\x0a\xee\xd6\x2a\xee\xac\xb9\x7c\xc5\x47\x79\x93\xa9\xbb\x52\xb5\x99\xa3\x86\xa2\x3a\x84\x92\x7b\x98\x76\x2c\x17\x9b\x6d\x98\x2f\x21\x71\x92\x04\x60\xdf\x78\x73\x93\x7d\x6e\x73\x90\xec\x80\x3d\x76\x6c\xe7\xce\xf0\xa3\x6b\x16\xba\xe5\x13\xfe\xa3\xb7\x78\x6c\x7b\x04\xb7\xe3\x1e\xa6\xdb\x3d\x30\xb3\xdd\x66\x17\x9c\xee\x63\xf7\xdd\xfc\x10\x04\xbd\xb0\xd5\xdb\xf9\x99\xca\x63\x6b\x13\x95\x1f\x1e\x88\xb5\x3e\x2f\xa0\x5f\xd9\xca\x64\xbe\xf1\x50\x59\x64\x34\x67\x7a\xcc\x32\x9b\xf5\xe0\x9c\x01\x0e\x23\xc9\x0f\x34\x61\x71\x98\xc2\x9e\xdf\x2b\xde\x31\xe2\x93\xf9\x0f\x12\x5d\x2b\xae\x5d\x08\x50\xd7\x42\xe3\x2f\x1f\x0c\x40\x76\x99\xb5\xc0\x63\xa7\x70\x56\x68\xa4\x32\xa8\x78\xd9\x88\x7b\x0f\x86\xab\xd9\xc8\x1d\x45\xae\x38\x11\xd2\xc3\xc1\x5c\x74\x13\xd9\x29\x90\x4f\x0c\xac\x83\x03\xed\xd3\x0b\xe7\x70\xe0\x13\xb2\x02\xbd\x15\xd3\xb9\xa9\x50\x3e\xb0\x57\x50\xc7\xca\x12\x94\x76\x9d\xa8\x4a\xbd\xa3\x9c\x45\x24\x05\x39\x42\x8f\x4b\xb4\xb1\xc7\xa1\xba\x29\xdb\xd1\x5d\x3b\xb6\xa6\xbe\xe5\x17\x6e\x85\x05\xc8\x9a\xac\x09\xa8\x0e\x73\xb3\x33\x54\x4c\x4e\xff\x63\x28\x38\xee\xc1\xff\x92\x8c\x32\xa9\x7a\xe4\x8c\x28\xc6\x47\x09\x54\xae\x39\x0d\xa3\x3c\x8d\x99\x81\x29\x62\x48\xed\x84\x26\x4e\x97\xa2\x9c\x80\xb5\x59\x99\xd9\x67\x59\x6a\xc7\x49\x2a\x86\xf2\x04\x47\xd7\xc1\x3d\x4c\x0f\x3a\x73\x48\x73\x70\xc5\x0f\x2c\x6f\x99\x43\x93\xc0\x88\xd0\x47\x76\x80\xd7\x0e\x9a\xe4\xc2\x5b\x32\x9c\x5d\xed\x68\xd5\x97\x6e\x8c\x11\x3e\x3e\x64\x47\x61\xbd\xa2\x25\xba\xa8\x28\x2d\x48\xae\xc0\x4a\xeb\x78\xca\x08\x78\x39\x13\xa5\x4a\x54\x4c\x39\x3c\xa0\xf4\xb8\x37\x82\x9f\xd1\x24\x18\x1f\x7d\x9f\xc5\x54\x6f\x14\x9e\x6b\x47\x05\x22\x87\x37\x76\x12\x92\xe3\x2c\x06\xb7\x86\x6c\x44\x32\x2a\x69\xaa\x7a\xa4\xef\xea\xa9\x22\xa6\xb1\x61\xd9\x96\xe8\x60\x77\x37\xcd\x80\xfc\x95\xdc\x94\xd7\xd2\x23\xdd\x6e\x97\xdc\xbd\xbb\x78\x77\x4a\xec\x2f\x56\xca\xd6\x82\x0c\x05\x2a\x41\x22\x97\xe6\x55\x13\xe0\xa8\xf8\x1b\xf9\x5e\x70\x78\x37\x34\x27\x84\x6a\x98\x80\x24\x0f\x66\xab\x22\x16\x43\xb0\x5e\xf5\x0e\x9f\x16\x8f\x77\x93\x4c\x52\xfa\x78\x9b\xcb\xd1\x16\x1b\x40\xe6\x36\xa1\x6c\xb2\x29\x94\x49\x44\xbd\x72\xee\xb9\x8a\xc6\x10\xe7\x09\xc4\x84\x0e\xc4\x04\x2a\x26\xdb\xea\x63\xc8\xd2\x73\xf0\x0f\x1a\x9e\x37\x50\x22\xc9\x75\x50\x56\x8f\xe0\xf1\x94\xfc\x11\x5d\xdb\x94\x64\x20\x23\xe0\x9a\x8e\x60\xd6\x0c\x60\xef\x7b\xfd\xea\xbf\x8e\x1d\x3f\x32\x33\x3a\xeb\xc9\x2b\x83\x11\x6f\xe9\xe3\xf7\xbc\x30\x0d\x32\x45\x5e\xf5\xc8\xd9\xcc\xcb\xf0\xb9\x24\xca\x13\xb4\xb5\xa0\xbb\xbe\xf4\xca\xc1\x94\x48\x91\xa3\xc3\x9e\xe4\x59\x55\x9b\xfd\xfc\x8f\xff\x65\x94\x3e\x9a\x66\x09\x9c\xfa\x32\xcc\x56\x6d\x36\x32\x8c\x16\xe4\x8b\x57\xff\x65\xa9\xa7\x39\x9f\x85\x56\x58\xc0\x8c\x1a\x80\xe5\x19\x61\xa9\x0d\xe7\x84\x64\x5a\xd4\x73\x96\x55\xf4\x57\x9a\x4a\xad\x3a\x04\xbd\xfa\x41\x38\xd4\x42\xd3\x64\x46\xcb\x47\x2d\x1c\x1e\x2c\x90\x62\x81\x30\x01\x34\x54\x91\xd7\x5f\xbc\xfa\xaf\x79\x73\xca\x3b\x1e\x01\x3e\x89\x4f\x60\x98\xc5\xc0\x28\xf7\xf7\x2c\x49\x20\xee\xac\x5d\xfe\x30\x97\x7a\x0c\xb2\x43\x80\x2b\x6f\xac\x32\xeb\x9b\x59\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x95\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\x2f\x5e\xf2\xe6\xc7\xcd\x0c\xca\xa7\xef\x86\xdb\x8a\x03\xdd\x1d\xcc\x10\xf3\x4f\xef\x20\x52\x3e\x76\xef\x43\xe2\x6f\x97\x71\xdd\x15\xb2\x6b\xa7\x39\x25\x5a\xe6\xeb\xbd\x06\xc5\x48\x2b\x27\xe0\x03\x90\x81\xbc\x74\xde\xe6\x76\xf5\x49\x4e\xfe\xee\xe7\x39\x16\x0f\x7c\x39\xe5\x40\xc2\xe9\x68\xc6\x8e\xa7\xbe\x6a\x71\x9b\x39\x36\xe6\xed\xe6\xee\xff\x33\x8f\xdd\x5b\x90\x03\x77\x76\xc3\x69\x37\x72\x15\x7a\x3c\x3a\x1b\xbc\x3d\x1c\x5b\xcb\xf9\xac\xcd\xc9\xdc\x60\x5f\xb3\x80\x72\xcd\x9d\xf0\x05\x14\xc8\xae\xa3\x70\xc8\x68\x8c\x28\x30\xe7\x5c\x2d\x3d\xe8\x09\x50\xa5\x17\x81\xa2\x3d\xe8\xeb\xc7\xea\x24\x80\xd9\x51\x15\x3a\x8d\x84\x84\x20\x2f\x6c\x8c\xe7\x16\x51\x0e\x6e\xc0\x7a\xf8\x6c\xc0\x59\x45\x88\x3a\x08\x47\xc2\xec\x5f\x55\xbe\x7a\xaa\xb0\x19\x6f\xe4\xdc\x45\xb4\x76\x8f\x96\x82\x83\x9d\xe9\xd4\x11\xaf\xe0\x51\xb4\x2e\xcd\xbd\x91\xa2\x53\xd0\x74\x75\xa2\xc8\xec\xa8\x12\xed\x5b\x4d\x79\x4c\x65\xec\x56\x79\x78\xa8\xc2\x94\x3d\xf2\x16\x7d\x69\x7c\x28\x4e\xc9\x58\xeb\x4c\x9d\x9e\x9c\x8c\x98\xee\xdd\xff\x49\xf5\x98\x38\x89\x44\x9a\xe6\x9c\xe9\xe9\x09\x3a\xd0\xd8\x20\xd7\x42\xaa\x93\x18\x26\x90\x9c\x28\x36\xea\x52\x19\x8d\x99\x86\x48\xe7\x12\x4e\x68\xc6\xba\x85\xcc\xac\x7a\x69\xfc\x5b\xff\xa2\x27\x16\x8c\x2b\x67\x08\xad\x4b\x72\x02\xdd\x9c\xdf\x73\xf1\xc0\xbb\xa8\xc9\xaa\xad\x4e\xd3\x66\x51\x0c\x7e\xcc\xc0\x7b\x9b\xc0\x85\x4c\xc4\x4f\xbe\x09\xe6\x63\xba\x94\xc7\x5d\xeb\x74\x7c\xe2\xbd\xd8\xc5\xb6\xdb\x2d\x02\x03\x36\x89\x5a\xb7\x63\x37\x6d\x88\x46\x9a\x4d\x60\x27\x27\xb6\x1f\x95\xed\x7e\xe7\x03\x46\xe3\x5c\xda\x1d\x2f\x79\xb3\xbd\x6f\x26\xa5\x53\x94\x75\xf0\xdd\x44\x58\x56\xce\x45\x0c\xce\xf2\x39\x41\xd5\xfe\xd6\x30\xf3\x3b\x23\x0a\x3b\x1f\x37\xda\x7d\xa7\x4a\x43\x6a\x89\x93\x7d\x3e\x99\x12\x2d\xa7\xd6\x31\x2e\xef\x8d\xf2\xe9\x3c\xd7\x46\xe2\xbf\xc7\xfb\x94\x12\x11\x43\xd1\xa7\x80\xab\x97\xbb\xbc\x0d\x8f\x92\x4c\x28\x86\xef\x76\x3c\x6f\x3b\xcb\xdc\xee\xec\xb2\xe4\xa6\xfb\xf2\x0f\xdb\x6c\xdd\x10\xab\x94\x6c\x69\x65\xaf\x46\x50\x0c\xcb\x59\x02\x6e\x7b\x0e\x95\x57\x5c\x8d\x58\x12\x09\xae\xb4\xa4\x6c\x79\x1e\xd4\xe2\xb1\xa3\x2b\x64\x77\x7f\x03\x41\x0c\x3a\xdb\x09\x28\x64\x71\x62\xeb\x00\x33\x63\x62\x08\xa0\x2e\x03\xc6\xa6\x49\xf9\x58\x42\x43\xb8\x76\x34\xad\xee\x00\x23\x52\x0b\x4e\xf6\x69\x5b\x25\x29\xbe\x40\xe9\xf3\x36\x7c\xd7\xd5\x88\x8b\xf0\xf3\xe5\x23\x44\xf9\xa6\x39\xf5\xf3\x63\xce\x96\xe7\x0d\x22\x2e\xec\xc4\x2e\xc2\x1c\x5d\x7f\xc1\xc9\x1f\x02\xc1\xee\x04\x11\x45\x35\x53\x43\x9b\x73\x16\x36\x02\x4a\x8e\xcf\x80\xc2\xc1\x3d\x8c\x2c\xce\xa6\x3e\x30\x8d\xe4\x26\x1a\x0b\xa1\xcc\x29\xc7\xfd\xc4\x79\x27\x4c\x58\x9f\x1f\x26\xc0\x48\x92\x1a\x1a\xe3\x13\x61\x8a\xe9\xad\xa1\xb6\x78\x8c\x29\xab\x82\x07\x08\x7a\x2f\x95\x99\x06\x0d\x8f\xe6\x8f\x11\x4a\x4d\x4a\x13\x95\xa7\x66\xd2\x07\x60\xa3\xb1\x56\x1d\xc2\x7a\xd0\x43\xac\x01\x1a\x8d\x4b\xd3\xa6\x00\xba\xd2\x77\xa9\x8c\x6a\x65\x2b\xf1\x51\xc8\x6a\x70\xa9\x3c\x9d\xc0\x63\x66\xf7\x72\x21\xb8\x3a\x04\x74\xd4\x3b\xee\x90\x22\xe5\xde\xac\x71\x30\x25\x4c\x83\xa1\xd9\xa8\x8b\x48\x91\x8f\xec\x97\x80\x8f\xe9\xc4\x75\x85\x94\x0f\xf4\xa2\xc6\xa8\x33\x1e\xd8\x8f\x3b\x30\xfb\x86\x2b\xcf\x53\x5f\x14\x09\xbf\x0f\xcd\xea\x10\x12\x83\x24\xa8\x4c\x58\x6d\x73\xd6\xe0\xfe\x7f\xc3\x43\x47\xea\xb8\x00\xe6\x98\x8d\xc6\x1e\x96\xd4\x31\x82\xea\x1e\x6c\x7f\xf6\x48\x2d\x5f\x8a\x1d\x3b\x7a\x54\xec\xa8\xfa\xb6\x7d\xbe\x44\x81\x55\xa5\xfd\xd7\x20\xd3\x00\x45\x44\x11\x24\x19\xce\xce\xed\x5b\x64\x39\x1c\x23\xaf\xc8\x11\x22\x19\xd3\x87\x0a\x11\xbe\x2b\xb2\xe3\x1e\x39\x23\x3c\x0f\x67\x6e\xd5\x0b\xb8\x08\xf3\xbb\x89\xcc\x4b\x95\x28\xe6\xda\xf1\x8b\x6b\x91\x3b\x3b\x76\xf3\x94\x97\x47\xd7\x41\x00\xd6\x17\xfd\x5c\x35\x89\x85\xf5\x8e\x13\xd4\x23\xdd\x7e\x0e\xff\x15\xbb\xcf\x31\x17\x60\x81\xc7\xb5\x88\xa2\x00\x99\x76\xca\xd2\x53\x38\x90\xd5\x53\x6c\x61\xb1\x2b\x56\x90\x66\x30\x83\x34\x04\x57\x52\x2b\x42\x67\xf1\x98\x0d\x63\xf1\x59\x54\x15\x68\x57\x88\xfc\x60\x8a\x57\xb7\x0c\x5e\x5a\x3e\xea\x52\xba\x62\xd4\xa2\x79\xc5\x58\x89\x78\xfb\x17\xd8\xb3\x78\x34\x84\xb6\x76\xd4\x27\x6d\xc5\xd8\x3e\x34\x68\xd9\x3c\x3b\x04\x0c\x2d\x1e\x4d\x9d\x4d\x3b\x76\x08\x2e\x5a\x3c\xe6\x44\xd4\xa7\x89\x35\x5a\x3c\x76\x36\x92\x2e\x1e\xbb\xc6\x25\x2d\x1e\x33\xa9\x8a\x4f\x14\xa4\xd4\xa9\x46\x28\x91\x6f\xb4\x3d\xc7\x6f\x6a\xf1\x93\x62\x34\x0c\xe2\xdd\x22\x9b\x16\x8f\x59\x01\xf0\x99\x44\x39\x2d\x98\xea\x1b\x6d\xa6\x79\xb3\xf4\x61\x9b\xa3\xee\xe3\x74\x9c\x42\xd1\x71\xa9\x33\xde\xce\x8c\x11\xd5\x99\x04\x2c\x4d\x80\x61\x5f\xde\x0e\xf3\x61\x02\xab\x16\x8f\xe6\x18\xa7\x1d\x0d\xb1\x4f\x3b\x1a\x43\x6e\x14\x78\xbe\xb6\x76\xe1\x8f\x28\xeb\x58\xcb\x74\x2b\xeb\xb4\xb2\xce\x16\xa3\x95\x75\x36\x1d\xad\xac\xb3\x6c\xb4\xb2\xce\x82\xd1\xca\x3a\xad\xac\x53\x6b\xec\x9f\xac\x63\x2d\x55\x8d\x19\xcc\xfe\x61\x0d\xae\xb3\x16\x32\x94\xa6\x7c\x48\x4f\xd5\x54\x66\x78\xff\xad\x23\xb1\x77\x68\x5e\x73\x91\xea\x92\xf2\x11\x90\xd7\xdd\xd7\xaf\x36\x4c\x07\x5c\x3c\xea\x04\xed\x94\xc7\xb6\xa9\x83\xb3\x63\x99\x47\xe2\xc9\xbc\x4b\xee\xa4\x06\x87\x47\x45\xc2\x5c\xe2\x20\x0a\x55\xad\x52\xd0\x84\xea\x8a\x41\x9c\xa5\x10\x1c\xa2\x95\x14\xe4\x22\xa6\x57\x70\xe7\xef\x30\x9b\xda\xdb\x6d\x05\x11\x50\x1b\xc7\x3e\x80\xb0\x0a\x91\x82\x4d\x30\xf5\x87\xde\x2c\x01\x3c\xac\xc8\x11\xf4\x46\x3d\x12\xdb\x64\x6d\xca\x5d\xcc\xd8\x71\xa7\xec\x1e\x4f\x0d\x71\x95\xf8\x1f\xb3\x6c\xe7\x1f\x87\x09\x70\x9d\xd3\x24\x99\x12\x98\xb0\x48\x87\xef\xc3\x80\x40\xa6\xad\xb3\xb3\x8e\x2b\xa5\x86\x78\x58\x57\x24\xec\xce\x9d\xad\xed\xfc\xd5\x7e\xd4\x97\xdd\xe6\xd6\xb1\x3b\xbd\x99\x91\x4b\x2c\x84\x7a\x4b\xd5\x2a\x6d\xde\x66\xfd\x95\xf8\x4f\x44\xf0\x77\x37\xbb\xba\xc7\x48\x43\x3c\xa1\x36\x1f\x98\x55\xa0\xf2\x24\x31\xe8\x6d\x3d\x66\xf3\x20\x58\xe0\xc9\x5a\x90\x6d\x63\xdd\xac\x69\x29\xeb\x06\xef\xb9\x13\x99\x48\xc4\x68\x5a\xde\x41\xd7\xc7\xa5\x28\x6f\x43\x89\xca\x07\x4e\x04\x34\x87\xe8\x7a\x66\xcb\x5b\x5f\xc8\xd2\xd1\xfa\x42\xe6\x46\x6b\x1f\x98\x1d\xad\x7d\x60\x8b\xd1\xda\x07\x16\x8c\xd6\x3e\x30\x3f\x5a\xfb\x40\x6b\x1f\xa8\x33\x5e\xbe\x7d\x80\xb4\xbe\x90\x65\xa3\x95\x75\x8a\xd1\xca\x3a\x9b\x8f\x56\xd6\x99\x1f\xad\xac\xd3\xca\x3a\xad\xac\xd3\xca\x3a\xbb\x8e\x1a\xc8\x9d\x89\xb8\xf1\x14\x99\x4c\xc4\x2b\x32\x64\xac\xbd\x3a\x12\xdd\x44\x44\xa1\xb2\x88\x79\xc4\x79\x3e\x14\x4d\xad\x09\xbd\x43\x7e\x11\x1c\x6c\x7a\x82\x2d\x59\x9b\x02\x11\xd8\x04\x22\x13\xf1\x91\x3a\xde\x21\xf0\xbc\xcd\xb0\x69\x33\x6c\x3e\x81\x0c\x9b\x31\x55\xae\xf0\x11\x92\xd6\xe5\x09\x37\xa5\xe3\x7f\x07\x32\xfd\x64\xf3\x6d\x0c\xc2\x39\x84\xc1\x3e\x73\x05\x52\x58\xd8\xc5\xce\xb7\x0b\x71\xbf\x0a\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x76\x2d\x92\x09\x32\x64\xae\xfe\xd7\x0c\xfe\x3a\x08\x3f\xf3\xbc\x99\x2a\x24\x9e\x75\xf2\x4c\xf5\x53\x1a\xf3\x4d\x95\x5d\x74\x15\xae\xf8\xec\x52\x69\x9a\xd1\x4a\xbb\x44\x3b\x77\xda\x77\xb5\xf4\xd2\xa6\x94\x48\x54\xf2\x6e\xb7\x2a\x73\xbc\x7c\x2c\x2c\x4e\xfb\x9f\x1c\xe4\x94\x88\x09\xc8\x42\x31\x0a\xdd\x79\x3a\xa1\xc9\x4c\x44\x5d\x01\xe4\x66\x0c\x3c\x8d\x98\x22\x9a\xd4\xd4\x9b\xf6\x1a\x92\x3d\xab\x7e\xbc\x7c\x34\xab\x38\x34\xa8\x36\x3c\xb7\x5a\xca\xcb\x47\xa3\xe6\x37\xd2\xb0\x09\x8e\x34\x68\x86\x23\xcd\x9a\xe2\x48\xe3\xe6\x38\xd2\xa4\x49\x8e\x7c\xf0\x0a\xd0\xcb\x47\xc3\xe6\x23\xd2\xb8\x95\x8e\x3c\xc3\x7a\xd2\xcb\xc7\x13\x80\xbb\x49\x8b\x1d\x69\xab\x53\xd7\x1e\x4d\x1b\xd4\x48\xd3\x46\x35\xd2\x34\x1e\xee\x54\x05\x7b\xf9\x68\xeb\x63\x3f\x81\x9c\xd6\x98\x10\x51\xb7\xa6\xf6\xba\x85\x36\x80\x93\xa1\x77\xef\x87\x52\x80\x2c\x97\x2e\x1a\xc6\x9a\x77\x97\x7a\x75\x61\xa8\x66\xb9\xb1\xa9\x8f\x5b\x45\x8c\xc6\xdf\x63\x6f\xf0\xca\x79\xa9\x78\x5c\x69\xb2\xb9\xd6\x31\x85\xe9\x2c\x34\x8f\x31\x4a\x41\xd1\x74\xaa\xf4\x30\xde\xdb\xb3\xe1\xa4\x85\x34\xc1\xe3\xd9\x00\xd3\xe2\x09\xd4\x2f\x6c\x3b\xdb\x03\x6f\xc7\x3e\x54\xc5\x1d\x07\xbd\x72\xe7\x5b\x37\xe3\xd1\xff\xfc\xef\x71\xa5\x7a\x4b\x31\x61\xab\xfd\x6d\x3c\x5a\xed\xaf\xd6\x68\xb5\xbf\xa5\xa3\xd5\xfe\x6a\x8c\x56\xfb\xdb\x6c\xb4\xda\xdf\xf2\xd1\x6a\x7f\xad\xf6\xb7\xc3\x68\xb5\xbf\x56\xfb\xdb\x75\x7c\xc2\xda\x5f\xb3\x51\xcd\x65\x5d\xcc\x05\x89\xa0\xfc\xa8\xa9\x66\x51\x11\xf1\xec\xef\xb2\xff\x6a\x56\x07\x2c\xeb\x77\x8b\x35\xc0\xb2\x96\x38\xa7\x05\xf7\xd6\xa8\x7b\x41\x21\x9c\x7b\x72\xb5\x26\xf8\xd2\x22\xb7\x1b\xc3\xc4\x92\x4b\xb8\x51\x54\xbc\xf3\x81\x65\x45\xe3\xf5\x10\x75\x16\x93\x23\xef\x8b\xc7\x46\x2a\x5c\xe8\xea\x45\xae\x59\xb7\xb8\x23\x78\xe7\x31\xa8\xa6\x92\xcf\x5f\x71\x21\x87\x18\xb6\x10\x1f\x55\x60\x8f\x21\x8f\x20\x2b\x6b\xc0\xc6\xb5\x43\xc6\x6d\xa4\xa3\x6f\xfa\x23\xb8\x0f\x9a\xb2\xf4\x14\x29\xa0\xc7\x73\x2b\xfa\xe2\x7a\x50\xfe\x2d\x60\x57\x8a\xf2\xa1\x78\xc8\x28\x77\xc9\xb0\x82\xfb\xae\xf4\xb6\xd3\x7c\x21\x2f\x87\x5e\x2a\xe1\xed\x3d\x72\x89\x58\x5f\x9e\x98\x29\x84\x0f\xb5\xfd\x4f\x9a\x41\xe4\xfd\x2a\xdc\xf0\xb0\x75\xe1\x86\x99\x88\x91\xb6\x6e\x43\x5b\xb7\xa1\x56\xdd\x06\xbc\x68\x0f\x77\xe3\x05\x1c\xc8\x3f\x5c\x7b\x24\x09\x08\xaa\x34\x4f\x34\xcb\x8a\x08\x6c\x65\x5f\x95\x58\x4d\x62\xe8\x22\x41\xab\xf8\x6e\xde\x46\xa3\xf1\x2c\xde\xe3\x7c\x18\xb1\xad\x90\x9c\xb8\x68\x4b\x6c\x66\x84\x15\x07\xbc\xda\x61\x43\x4a\xd9\xf3\x8f\x14\xbc\x40\x82\xad\x0a\xad\xd9\xf6\xda\x32\x74\x3e\x31\x28\x61\x28\xf6\x0a\x06\x51\x6e\x68\x81\x51\xab\x6c\x02\xbc\xe0\x12\x47\xea\xf8\xd8\x4b\x43\x8d\x72\xaf\x27\xe1\x3e\x7f\x29\x71\x89\xbf\x6d\xc2\x7f\xf0\x83\x02\x07\x2a\xc0\x57\xf0\x9f\xe7\x1d\x12\x59\x3f\xba\xad\x09\x8b\x5c\x63\x51\x6d\x1f\x3d\xa2\xed\x53\xaa\x7d\xb1\x97\x3e\x8c\xbd\xd3\x3a\x5e\x86\xdf\xa2\x4d\x18\xdd\x7c\x3c\x87\x84\xd1\x8f\xe4\x9b\x78\x3e\x79\xa3\xcf\xd6\x1f\xf1\x5c\xf2\x46\x5b\x1f\xc4\x56\xe3\xa5\xa6\x73\x56\x47\x83\x3e\x87\xd6\xdf\xd0\xb0\x4c\xd5\x08\xf3\x7f\x1a\x3f\x43\x23\xf8\xd7\x68\x74\x59\x1b\x59\xf6\x31\x23\xcb\x5a\x2d\xac\xd5\xc2\xaa\xa3\xd5\xc2\xe6\x46\xab\x85\x6d\x31\x5a\x2d\x6c\xf9\x68\xb5\xb0\xf9\xd1\x6a\x61\xad\x16\xb6\xc1\x68\xb5\xb0\x56\x0b\xdb\x74\x7c\x62\x5a\x58\x73\xf5\xd6\xdb\x08\xaf\x27\x88\xf0\x6a\x86\x12\x36\x40\xff\x1a\xc1\xba\x86\x22\xba\xda\x68\xae\xfd\x8e\xe6\xaa\x59\x76\x8e\x6b\xf6\x34\xa5\xe7\xca\xbb\xbd\xac\xfe\x1c\x9d\x08\x16\x93\x2c\xd7\xae\xfa\x56\x5b\x83\x6e\x9f\x6b\xd0\x55\x76\xb4\x2d\x44\xb7\x51\x21\xba\x65\x30\x6b\xab\xd1\x2d\x19\xfb\x13\x63\xd6\x56\xa3\xdb\x76\xb4\xd5\xe8\x16\x8f\xb6\x1a\xdd\x8a\xd1\x56\xa3\x6b\xab\xd1\xb5\xf5\x08\x6a\x8c\xb6\x1e\xc1\x82\xd1\xd6\x23\xd8\x7d\xb4\xf5\x08\x36\x1a\x6d\x3d\x82\xb6\x1e\x41\x75\xb4\x5e\xa8\x7a\xa3\xad\x47\x50\x73\xb4\x9e\xa9\xb6\x1e\x41\xad\x09\xdb\x6a\x74\x2f\x2a\x66\x90\xb4\xda\x5f\xab\xfd\x6d\x3c\x5a\xed\x6f\xe9\x68\xb5\xbf\x1a\xa3\xd5\xfe\x36\x1b\xad\xf6\xb7\x7c\xb4\xda\x5f\xab\xfd\xed\x30\x5a\xed\xaf\xd5\xfe\x76\x1d\x9f\xb0\xf6\xd7\x56\xa3\xdb\xfb\x58\x45\xb2\x8f\x19\x49\x6d\x35\xba\x36\x7e\x71\xa7\xed\x6e\xab\xd1\xad\x1f\x9f\x7c\x35\xba\x4a\x2c\xdd\xc7\x2b\x49\xb7\xfd\x32\xda\xba\x74\x6d\x5d\xba\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\xdb\x7c\xec\xbf\x37\x63\xef\xf4\x8f\x97\xe1\xc1\x68\x2b\x22\x6c\x3e\xda\x8a\x08\x4b\x47\x5b\x11\xa1\xad\x88\xd0\x7a\x23\x76\x19\x6d\x45\x84\x2d\x47\xeb\x79\x68\x2b\x22\x6c\x35\xda\xba\x74\x2f\x26\xc6\xac\xd5\xc2\x5a\x2d\xac\x3a\x5a\x2d\x6c\x6e\xb4\x5a\xd8\x16\xa3\xd5\xc2\x96\x8f\x56\x0b\x9b\x1f\xad\x16\xd6\x6a\x61\x1b\x8c\x56\x0b\x6b\xb5\xb0\x4d\xc7\x27\xa6\x85\xb5\x75\xe9\xf6\x3a\xd6\xab\xad\x4b\xb7\x60\xb4\x71\x5d\xfb\x1d\xd7\xb5\x23\xae\xd0\x5c\x8b\x54\xe4\x5c\xdf\x82\x9c\xb0\x08\xce\xa2\xc8\xfc\x75\x27\xee\x61\xcb\x58\xa2\xaa\x1a\xba\x62\x5a\xc2\x78\xcc\x22\x54\x24\x1f\xc6\x80\x65\xe5\x8c\x7c\x8b\xf7\x11\x6a\x6f\x24\x1a\xef\x2c\xd0\x0b\xd7\x69\x88\x1a\x06\xd8\xe0\xd4\xdb\xc2\xcb\x42\x68\x20\x44\x02\x94\x6f\xf1\xa4\xe3\x86\x20\xb7\x3c\xcd\x15\x80\xbc\x71\xa4\xb8\x98\x8c\x0c\x20\x11\x7c\xe4\xe2\x79\xdc\x09\xe8\x91\xf3\xe2\x86\x88\x72\x3c\x3c\xb9\x94\xc0\x75\x32\x45\x38\x60\x81\x2b\xd4\x1a\x52\x31\x81\x18\x49\x36\x86\x11\x59\x39\x92\x6a\x92\x00\x35\xef\xe2\x50\xbc\xcc\x1c\x1e\x4a\xfa\x38\xbf\x9d\x74\x00\x2e\xb4\x69\x27\x20\x6e\x4f\x1b\x77\xa2\x86\x33\x96\x0d\x27\x36\x21\x5f\x8a\x50\x3f\x2a\x7d\x21\x1e\xcd\xa9\xc8\xc9\x03\xb5\x92\x92\xcc\x39\x1e\x66\xfc\x74\x03\xda\x2d\x5f\x5e\x43\x26\xd9\xdd\xfc\xd0\x45\xaa\xb6\xe5\x63\x75\xcc\x01\x54\x8e\x76\x62\x52\x95\xad\x39\x3c\x93\xa3\xdc\x8a\x84\x0e\x95\x81\x6b\x39\xc5\x78\x3b\x2b\x53\x94\x30\x31\xa5\x23\x38\x3c\x54\xe4\xfc\xed\x85\x21\x7f\xb9\x32\xd4\xda\x55\xd9\x73\xe4\x30\x93\x62\xc2\x62\x83\xdc\x3f\x50\xc9\xe8\x20\x31\x72\xe7\x10\x24\x70\x23\x16\x7c\x76\xf4\xc3\xd9\xcd\xbf\xae\xcf\xde\x5e\x1e\xa3\x04\x0a\x8f\x19\xe5\xe6\x54\xe4\xaa\x08\x14\x75\xaf\x33\x2f\x02\x3e\x61\x52\x70\xb3\x3e\xd4\xd5\x28\x99\xf8\x59\xa3\x70\x18\x24\x28\x91\x4c\x20\xb6\x72\x72\x78\x9b\xe7\x3a\x8c\x67\xb9\xf6\xba\x23\x86\x2f\x9a\x03\xc4\xa3\x31\xe5\x23\xb3\xce\x0b\x91\x9b\xf9\x3e\xfb\x0c\x57\x24\x21\xce\x23\x2b\x39\x51\x8f\xb5\x9f\x75\x3c\xa7\x30\xb4\x5e\xd9\x92\x88\x2a\xa2\x99\x5f\x73\xf9\xb3\xd4\x94\x6b\xfa\x78\x6a\xe3\xf7\x0e\x3e\x2b\x5d\x3a\xf0\xe5\x24\x85\x79\x85\xe5\x37\x76\x55\x09\x56\x32\x4c\xc8\x41\xf9\xee\x1e\xb9\x34\xef\x80\xb8\x0c\x40\x1b\x7e\x09\x13\x90\xa8\x79\x3a\xf0\x75\x88\x84\x11\x95\x71\x02\x0a\x03\x0f\x3d\x6d\xb6\xda\x81\x03\x18\x04\xbd\x96\x0b\xbd\x88\x98\x90\xb7\x02\x83\x10\x87\xe2\x94\x8c\xb5\xce\xd4\xe9\xc9\xc9\x7d\x3e\x00\xc9\x41\x83\xea\x31\x71\x12\x8b\x48\x9d\x68\xaa\xee\xd5\x09\xe3\xe6\x70\x75\x63\xaa\x69\xb7\x74\xaa\x4f\x2c\xe7\xee\x46\x22\x4d\x29\x8f\xbb\xd4\x61\x57\x37\x6c\xeb\xc9\x6f\x1d\x4f\xed\xd2\x70\x17\xe3\x5d\xda\x55\x63\x48\x92\xc3\x1d\xf0\xb9\x9e\xcc\x57\x43\xd6\xab\x25\xe3\xb9\x6f\xaf\x7f\x80\x2f\xc3\x79\xb5\x30\xe8\x91\x6b\xa1\x5d\x7c\xac\x0b\xc5\x46\x3a\x8a\xf0\x5d\x7a\xa4\x2f\xaf\xef\x6e\xfe\xd9\x7f\x77\x75\x7d\xd7\x9e\xec\xf6\x64\xb7\x27\xbb\xc6\xc9\x06\x3e\xa9\x7d\xaa\xbd\xcc\x59\x3a\x26\x61\xbf\x91\x53\x2b\xd0\xfe\x18\x84\x0d\xa8\x2d\x21\xda\xf1\xd1\xa0\x5e\x81\xc0\x25\x9f\xfc\x40\xab\x16\x76\xbe\x10\x1c\xc4\xdd\x60\x05\xe5\x20\x83\xd7\x89\x8f\xaf\x61\xcd\xaa\xeb\xbe\xda\x49\x8a\xb4\xa3\xbe\x6b\xc9\xbc\x7a\x77\x43\x43\x65\xfb\xae\x69\x5a\x54\xa8\x5e\xb0\x6b\x3d\xf2\xd6\xab\x3d\xe4\xfc\x5f\x57\x17\x97\xd7\x77\x57\x5f\x5f\x5d\xde\xec\xae\x47\x37\x60\x71\x41\x9b\x42\x43\x00\x38\xdc\x91\x4b\x66\x12\x26\x4c\xe4\x2a\x99\x06\x2b\xc8\x62\x22\x30\x7b\xfa\x9d\xdf\x77\x1a\xf4\xf1\x85\x8f\xb5\xcc\xb6\x59\x66\x7b\x01\x43\x9a\x27\x56\x7b\x3a\x38\xe8\xed\xc2\xe5\xec\x68\x0a\x7d\xbf\x96\xa2\x46\x05\xe6\x0a\x0a\xdf\xda\xda\xed\x43\x21\x97\x1e\xe3\x43\x17\x7d\x50\x61\x3d\x4e\x78\xb4\x16\x3a\x27\x3d\x5a\x27\x59\x4d\xe8\xd4\xf4\x32\x34\xe3\x7b\x8f\x04\x1f\xb2\xd1\x5b\x9a\x7d\x07\xd3\x1b\x18\xd6\x33\x13\x57\xe1\x8d\xd6\x47\xe7\x4a\x46\x5b\xa5\x61\x67\xf6\x65\xf5\xdc\x34\x8d\x39\x69\x9a\x8a\xce\xa8\x1f\x99\xd1\x5c\x20\x45\x23\x41\x14\x73\xf5\xf0\xad\x1d\xda\x59\x94\x9b\x8a\xb1\x69\xc4\x73\x5f\x8f\xcb\xfb\x51\x65\x76\x65\x76\xef\xe8\xac\xde\x54\xed\x88\x04\x8f\x20\xd3\xea\x44\x4c\x0c\xe7\x82\x87\x93\x07\x21\xef\x8d\x1e\x61\x74\xd7\xae\xc5\x5a\x75\x82\x3e\x83\x93\xdf\x5a\x37\xd8\xdd\xbb\x8b\x77\xa7\xe4\x2c\x8e\x5d\x73\x93\x5c\xc1\x30\x4f\x5c\x3b\x81\x1e\xa1\x19\xfb\x01\xa4\x62\x82\x77\xc8\x3d\xe3\x71\x87\xe4\x2c\xfe\x6a\x77\xe2\xec\x47\x83\xbb\x20\x32\xeb\xea\x6c\x78\x27\x6e\xd1\xc7\x32\xad\xf0\xae\x40\x44\x0c\xd7\x62\x5a\x21\x6e\x7a\xab\xb3\x13\x32\x1a\x02\xcd\xf6\x26\xfa\xd9\x81\x5b\xd8\x2c\x5d\x3d\x2c\x08\xab\x75\x71\x3a\x44\xcd\x44\x7c\x4a\x54\x9e\x65\x42\x6a\x45\x52\xd0\xd4\x28\xbd\x3d\x83\x61\x9d\xea\x9f\xe8\xab\xea\x90\x9f\xc3\x8f\xe8\x70\x52\x3f\x1e\x1e\xfe\xe5\xbb\xcb\x7f\xfe\xed\xf0\xf0\xa7\x9f\xcb\x57\x91\x15\xda\x28\xa0\xea\x2d\x2a\x83\xa8\xc7\x45\x0c\xd7\xf8\x0e\xfc\x53\x55\xdc\x2c\xee\x82\xa6\x3a\x57\xbd\xb1\x50\xfa\xaa\x1f\xfe\xcc\x44\x3c\xfb\x97\xaa\x21\x71\x90\xfd\x64\x0c\xb8\x45\x7d\xaa\xc7\x7b\xc2\x1e\x0a\x5a\xd2\xf0\x51\x75\xb3\x96\x9b\xe8\xa4\x14\xff\xf9\xb5\x07\x81\x91\x9e\x1e\x24\xd3\x1a\x5d\x6f\x2e\x15\x5c\x0c\x3b\xe6\xd4\x16\x62\xe7\xe4\x75\xed\xfa\x28\x8d\x92\xb6\xb0\x83\x0d\x03\x0c\x21\xe2\xa0\x65\x0f\x72\x60\xb0\xf3\x2e\xe6\xb3\xfe\x15\x99\x58\x08\xef\x0d\x70\x7c\x7a\xef\xd7\x4f\x4a\xe3\x42\xd3\x25\x07\xaa\xa0\x21\x9e\xda\xa0\xa0\x90\x64\x4c\x12\x96\x32\x17\x6b\xe8\x1a\x34\x29\x72\x64\x7f\xec\x45\x59\xde\x71\x37\xf4\x52\x48\x85\x9c\x86\x3f\x21\x1b\x43\x6a\x34\xad\xae\xd2\x42\xd2\x11\x74\xc2\xe3\xf6\xb1\xf0\x97\x7d\xb0\xf2\x82\xf9\xa7\xad\x2a\x5c\xb8\x4a\x1d\x45\x86\xf8\xe5\xd1\x36\x0f\xfa\x3d\x21\x6d\x01\x33\xae\x9f\x40\x24\x0c\x96\x38\x2b\x70\x06\x28\xa2\x3e\x39\x11\x49\x9e\x82\xea\x04\x31\xc8\x5a\x03\xf8\xc4\x68\x96\x6a\xaf\x04\xb5\x98\x4d\x98\x6a\x22\x8c\x78\x81\x9c\xc6\x5c\x44\xbe\xc8\x75\x96\x6b\x57\x6f\xa6\xd4\xd8\x4d\x28\xb4\x5b\x84\xa2\x00\x15\xb2\xff\xfa\xa0\x7e\x34\x3a\xd5\x1a\x24\x3f\x25\xff\x7d\xf4\xfe\xf7\xbf\x76\x8f\xbf\x3a\x3a\xfa\xf1\x55\xf7\xcf\x3f\xfd\xfe\xe8\x7d\x0f\xff\xf1\xbb\xe3\xaf\x8e\x7f\xf5\x7f\xfc\xfe\xf8\xf8\xe8\xe8\xc7\xef\xde\x7e\x73\xd7\xbf\xfc\x89\x1d\xff\xfa\x23\xcf\xd3\x7b\xfb\xd7\xaf\x47\x3f\xc2\xe5\x4f\x1b\x4e\x72\x7c\xfc\xd5\x67\xb5\x97\x4e\xf9\xf4\x5d\x4d\x02\x6a\x47\xb7\xb1\x72\x41\xb3\x33\x36\x14\x67\xfd\xd8\x2d\x94\xa6\x2e\xe3\xba\x2b\x64\xd7\x4e\x7d\x4a\xb4\xcc\xeb\x11\x93\x82\x29\x35\x7d\xfe\x7d\xf7\xae\xd3\x82\x21\x05\x76\xbd\x37\x07\x5c\x41\x24\x41\x7f\x08\x4b\x8e\x7d\x93\x97\x53\x66\x62\x1e\x5f\x1a\x9f\xfb\x14\x8c\x3b\x21\x64\x10\xf7\xb5\x90\x44\x87\x52\xa4\x3d\x52\x72\x6f\x4c\x30\xe1\xc3\xdd\x77\x0f\x35\xac\xa0\x7e\xb4\xc6\xa0\xd6\x18\xb4\x64\xac\x35\x06\xdd\x5a\x3c\xdc\x5b\x4b\x10\xf0\xc9\xae\x2e\x8c\x85\x1e\x74\xaf\xeb\x68\x41\x32\x91\xe5\x09\xd5\x4b\x3c\x63\x0b\xdc\xe9\xee\xa8\x17\xf1\xc8\x45\x30\x8d\x65\x68\xe9\x62\x1f\x26\x39\x4b\x12\xc2\xb8\x3d\xf8\x38\x81\x77\x98\x49\xb0\xaa\x0d\xa1\xd6\x9f\x3d\x31\x4b\x78\x70\x65\xe5\xca\x71\x39\x8a\x28\x4d\xa5\xc6\xd8\x63\x2c\x3b\x67\x59\x89\xf3\x3e\x31\x5e\x14\x9f\x0b\xc2\x61\xc8\x05\x59\xd8\x19\x33\xa1\x4a\xfb\x65\xe3\x6a\x34\xbd\x47\x6f\x63\x04\x31\xf0\x08\x30\x31\x2d\x87\xe2\x5b\x07\x46\x6f\x23\x97\x7c\x62\xe7\xa0\x24\xce\x6d\x30\x88\x25\x7f\x8b\xe7\x78\x59\x01\x08\x06\x11\x6f\x7d\x03\xe3\x10\x87\x80\x54\x3f\x68\xd8\x21\xbf\x2f\x58\x59\xd5\xc7\x89\x3c\xa8\xcf\x33\x83\x67\xab\x96\x30\x34\xc7\x2c\x0b\xf3\x73\x95\x49\xbe\x04\x67\x60\x7d\xf6\xf9\xc9\xb1\xce\x86\xd8\x66\x33\x2c\x73\x0b\xdf\x49\x93\x6c\xb2\x09\x67\x49\x26\x61\xc8\x1e\x1b\x3a\xa7\x67\xbc\xb0\xc4\xb0\x18\xb8\x66\x43\x66\x7b\xde\x67\x12\x32\xe0\x71\x28\x5c\x8a\xc9\xe1\xbc\x0a\x9b\xbd\x0c\xe6\xb1\x02\x77\xb3\xa4\xec\x76\x91\xb0\xdf\xd2\x31\xd2\xd2\xb1\x9d\xc7\x07\xa2\x63\x0e\x73\xf7\x87\x88\x61\xe4\x79\xfd\xe8\xf7\xf3\x6a\x28\x3b\x22\xf2\xd6\x88\x56\x64\x76\x9d\xe0\x2c\xca\x66\x49\x86\x34\xec\x40\x1a\xb5\xb0\xc1\x6b\x64\xcc\x46\x06\xb2\x09\x4c\x20\x71\x72\x13\x49\x29\xa7\x23\x9b\xdf\xad\x85\x37\xd5\x1a\x45\xcb\xe0\xb1\x64\xf1\x5c\xdc\x3d\xca\xf1\x06\xb7\x13\x41\x63\xbc\x28\x45\x92\x80\x54\x24\x61\xf7\x40\x2e\x20\x4b\xc4\xd4\xa5\x6b\xf3\x98\xdc\x6a\xaa\x0d\x56\xdf\x82\xde\xcd\xed\x5b\x0b\x63\x71\xc5\xfd\x3c\x49\xfa\x22\x61\xd1\x4e\x46\x95\xea\xce\x5d\xe1\x7e\x65\x79\x92\x90\x0c\xa7\xec\x91\x77\x1c\x89\xc6\x59\xf2\x40\xa7\xaa\x43\xae\x61\x02\xb2\x43\xae\x86\xd7\x42\xf7\xad\xf4\x5d\x0d\xb8\xb3\x37\x12\x36\x24\xa7\x58\xdd\x46\x13\x4d\x47\xa8\x3b\x79\x37\x60\xc7\xc0\xbf\x3c\x81\xa5\x0f\x0f\x4c\x2d\x54\x56\x6a\x23\xce\x6f\x71\x26\x43\xab\xec\xdf\x1f\x7c\x9b\x12\x36\x84\x68\x1a\x25\xf5\x8f\xd6\x59\x84\x01\x0c\x45\xc6\x79\x09\xbf\x5d\x35\x75\x97\xe3\x89\x5a\x20\xe3\xc4\x96\x39\xb7\xf5\xdb\x0b\x54\x0f\x2b\xb2\xda\xae\x6a\x54\x49\xdc\x99\x79\xd6\x65\x9b\x99\x50\xfa\xd6\x68\xe8\x8d\x14\x43\x3f\xec\xfb\xe9\x08\x96\x7c\x4e\x12\x88\x09\x4b\x53\x88\x8d\x16\x9f\x4c\x09\x1d\x6a\xcc\xb5\xad\x58\x08\x22\x09\x16\x6b\x5d\x15\x93\x31\xe5\x71\x02\x92\x0c\x29\x4b\x9c\x3d\xa0\x72\xbf\x06\x99\x32\x8e\x66\x01\xeb\x91\x45\x13\x83\xf9\x2b\x8a\x84\xf4\xe5\xe9\x99\x56\xfe\x52\x71\x30\x91\x8f\x94\x10\x60\xd6\xb5\x4c\x06\x89\x88\xee\x15\xc9\xb9\x66\x89\x5d\x8c\x10\xf7\x24\x12\x69\x96\xe0\xd1\xa9\x71\xb2\xc2\x3f\xbb\x01\x95\xba\x66\x76\x75\xf2\xdb\xe2\x12\xfe\xb0\x2b\x43\x6f\x40\x10\x6b\x42\x0c\x83\x47\x88\x1a\xcb\xf3\xbf\x7c\x84\xa8\x54\x58\x02\xfb\x31\xe0\x89\xc6\x3c\x4f\x7a\x0f\x2f\xa8\x92\x5d\x8d\x5c\xba\xf2\xa8\xc0\xef\xdc\xce\xe9\x0b\x61\xb9\x57\x90\x84\x71\xa4\x6f\x2e\xbf\x8e\x30\xae\x0c\x67\xaf\x1c\x06\x7b\xf4\x9c\xd0\x4a\x62\x26\xb1\x0a\xc2\x34\x04\x52\xfb\xb9\xb0\xc0\x80\x10\x9a\x1c\x1d\x9e\x1c\x1e\xcf\xd9\x1f\x0f\x8d\x04\x92\x80\xa5\xb5\x3e\x71\x2f\x2c\x4a\xb1\x34\x4b\xa6\xb8\x8e\xc3\xb8\x43\x98\xf6\x91\xd6\x32\xe7\x7e\x55\x2e\xe9\xaf\x43\x94\x20\x5a\x52\x5f\x5d\xc5\xfe\x6a\x6e\xd2\x32\x77\x54\xfe\xe8\xf0\xd7\xc3\x0e\x01\x1d\x1d\x93\x07\xc1\x0f\x35\x2e\xbf\x47\xee\x84\x11\xa5\x8b\x89\xa6\x22\x27\x1c\x6c\x60\x3f\x3c\x66\x09\x8b\x98\x4e\xa6\x48\xb1\x88\xc8\xb5\xcd\x21\xa6\xda\x27\x1b\x5e\x3e\x32\xed\xe2\xd5\x0c\xc9\x78\x85\xd0\xb4\x54\x8b\x50\x23\xe6\x4c\xe0\x64\x0c\x34\xd1\x63\x1b\x24\xc2\x05\xef\xfe\x02\x52\x60\x0e\x22\x77\x57\x5e\x5c\xd5\xbf\x46\x34\x07\x43\x44\xbf\x81\xe6\x9a\xf8\x7c\x7b\x77\xd7\xff\x06\xf4\x0c\xc9\x30\x6f\xf1\xa1\x3b\x68\x0d\x00\x39\x14\x32\xdd\x03\xda\xd1\x8c\xb3\xb2\x4b\x32\x21\xf7\x81\x84\x8d\x85\xaa\xb5\x97\x64\x6e\x3f\x85\xd2\xa8\x0d\x39\x69\x8c\x43\x64\x76\xb0\x1a\x43\xe2\xfb\xdc\x5c\xf5\x7b\xe4\x9f\x22\x37\x5f\x33\xa0\x83\x64\x1a\x2a\x31\x28\xd0\xe4\xc0\x4c\x75\x60\xc8\x93\xc1\x86\x6f\x81\xc6\x46\x45\x31\xd4\x03\xe8\x7e\xf4\xb3\x22\xee\x3c\xb8\xb5\x35\xcb\x07\x72\xa5\x45\x4a\xc6\xee\xb3\xab\xa9\x97\xee\x64\xf4\xf0\xf4\xf8\xbc\x26\x09\x99\xa5\x70\xee\x99\x17\x47\xbf\xe6\xe8\x86\x85\xbb\xfb\x7d\x80\x65\xac\xa2\x32\xd8\x5c\x43\x27\x9b\x18\xc4\x2d\xb0\x0c\xaa\xc1\x6e\xae\x92\xf2\xd8\xe3\xda\xa3\x3b\x27\x72\xce\x4e\x84\x4e\xbd\xfa\xb1\x5e\x8d\x56\x1e\x6d\x26\x6e\x80\x2c\x32\xb2\x3a\x9c\xb1\xd6\x97\x86\x80\xf8\x34\xa5\x2f\x3f\x04\x00\x9a\xd9\x7c\xd2\x24\x04\xb2\x06\x42\xbb\xe7\x03\xbb\xb5\x30\x7a\x28\xa6\x5e\x5a\xe2\x8a\x64\x42\x81\x9c\xec\x9a\xcc\x5d\x8c\xe6\x3e\x5d\xec\xae\xf1\xfb\xb1\x20\x4f\x5a\x12\x9e\xa7\x03\x90\x45\x66\x8a\xd4\xf3\x00\x29\x45\x26\x5c\xdb\xdb\xbd\x39\xb7\xda\x3e\xd1\x3c\xf9\xe5\x1f\xff\xf8\xc5\x1f\x7b\x76\xfa\x10\xa5\xc0\xc9\xd5\xd9\xf5\xd9\xbf\x6e\x7f\x38\xc7\xe4\xd8\xba\x50\x6d\x28\x04\xb3\xe9\x00\xcc\x46\xc3\x2f\x9f\x34\xf8\x12\x53\x3e\x6a\x53\x91\xaa\xed\x1f\xa7\x34\x18\x60\xf4\x36\xa3\x71\x3a\xd9\xaf\x54\xac\xcc\xc8\x9a\x55\x43\xaa\x39\x6a\x7b\x71\xc6\x74\x94\xdd\x8a\xe8\xbe\x41\xbd\xe6\x02\x32\x09\x91\xb5\x93\xdd\x9d\xf7\xed\xec\x46\xbf\xbc\x7e\x77\x57\xa4\x1a\x60\x3c\x0e\x79\xe3\xed\x4b\xdf\x3a\x4b\x9a\xd1\x49\xef\x21\xd3\x41\x75\x1f\xd0\xe8\xfe\x81\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x2d\xfe\xeb\x9b\x42\x72\x61\x03\xfe\x6c\x91\x33\x31\x9c\x2d\xad\x59\x98\x43\xd1\x64\x65\xe3\x68\x86\x94\x25\x68\x41\xcd\xb9\x66\x29\xb8\x88\xa0\x28\x0b\x26\xbd\xb2\x4d\xbb\x55\xbe\xfc\xd8\x5b\xe5\xeb\xf0\x9d\xf7\xea\x6d\xad\x87\xd5\x8d\x4b\xdc\x63\x56\xe7\x58\x9c\x4d\x08\x69\x59\xdd\x27\xc1\xea\x32\x09\xb7\x5a\x64\x0d\x79\x49\xec\x64\x4b\x7c\x24\x03\x18\x0a\x43\x84\x97\x3a\x3d\x7c\x8f\x60\x8e\xc9\x81\xde\xaa\x25\x2a\x8e\x0d\x1b\x91\xa9\xf2\x68\xec\x0d\x94\x1c\x94\x3a\x41\x77\x48\x9e\x59\xad\x15\xc9\x75\x2e\xa1\x63\xbe\x0e\x52\x5c\x5d\xa7\xc8\x72\x30\xaf\x07\x6e\x7f\x04\x1d\x59\xcb\x6d\x89\x90\x63\x61\x50\xb7\xfc\x59\x37\x4a\x24\xa9\x1a\x03\x96\x17\x81\x47\xe6\xbb\xa1\xf4\x45\x7c\x78\x58\x7c\x8a\x61\x2c\x23\x49\x23\x20\x19\x48\x26\x0c\x33\xca\xb9\x8e\xc5\x03\x27\x03\x18\x31\xae\x3c\x28\xcc\xdc\x1e\x66\xe8\x8f\x61\x2a\x14\x86\xeb\x91\x9b\x4a\xb1\x13\x97\x86\x14\x89\xe2\x68\xba\x35\xcf\x7a\x92\x90\x63\x95\x5a\x26\x07\x08\xfb\xf0\x58\xbd\xc1\x92\x8f\x72\x8e\x6f\x8e\x21\xa1\x53\x1b\x6d\x3a\x64\x9c\x26\xec\x17\x90\xea\xb8\x01\x8f\x93\x01\x61\x71\x6d\xe9\x3a\xb0\x54\x3f\x8d\xc6\xf5\x9c\xbf\xad\x8b\x6a\xc3\xd1\xba\xa8\xea\x4c\xd2\xba\xa8\x5a\x17\xd5\x9a\xd1\xba\xa8\x5a\x17\xd5\xcc\xd8\x5b\x2d\xa9\x75\x51\xed\x3c\x5a\x17\xd5\xea\xd1\xba\xa8\x36\x18\xad\x8b\x6a\xc3\xd1\xba\xa8\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\x9f\x90\xdd\xce\x8f\xd6\x45\x35\x37\x49\xeb\xa2\x6a\x5d\x54\x1b\x8f\xbd\x55\xbe\x5a\x17\x95\x1d\xad\x8b\xaa\x3a\x3e\x2d\x56\xe7\x1d\x3c\x7d\xa3\xea\xd5\xcf\x69\xeb\xa3\x53\x81\x45\xce\x4f\x54\x6e\x1a\x17\x5e\x55\xea\x13\x57\x2a\x0b\xe2\x53\x71\x9c\x47\xa8\xf0\x33\x2d\xcc\x97\xda\xd6\x55\xe1\x93\x0c\xd5\x49\x26\xec\xff\x15\x8e\x8a\x92\x87\xc2\x2a\xbc\xbb\xe7\xac\x7d\xb4\x6c\xac\x3a\x6e\x89\x0f\xe3\x92\xd8\x13\xff\x4d\x03\x6e\x88\xd6\x05\xf1\xe2\x5c\x10\x2f\xa7\x6b\xae\xf3\xcc\xdf\x8d\x25\xa8\xb1\x48\x76\x46\xf4\x0a\x92\xbf\x65\x9c\xa5\x79\x6a\x70\x4e\x19\x7c\x66\x93\x10\x02\xa0\x02\xba\x5a\x8a\x6d\xad\x88\xe6\x46\x16\x03\x16\x3b\xa5\x2c\x31\xdb\x88\xf9\x9b\x63\x3a\x31\xb8\xae\xf2\x28\x02\xc0\x56\x6a\x65\x0d\xe7\x8b\x5e\x78\x53\x68\x9d\xf1\xba\x1e\xbd\xa9\xc7\xc4\x6d\x39\x52\x9c\xe5\x8b\xcf\x77\x9a\x63\x24\xb3\x66\xe8\xf2\x37\x37\xfd\xf3\x72\x9b\x6c\xee\xc9\x32\xe3\x13\x91\x4c\x6c\x87\x7d\xbc\xc9\x08\x6b\xae\x19\x3f\x36\x73\x1f\x80\xa6\x25\xdd\xc6\xa9\x05\x8a\x00\xa7\x83\xc4\x3c\x67\x9e\x0a\x1c\xb9\x6f\xf9\x2e\x50\x9d\x4b\x20\x23\xaa\x3f\x26\xc1\xaf\xaf\xc2\xd4\x52\x5f\x9a\xe0\x37\x75\x25\xf4\xaa\x0d\xce\xc8\xe1\x55\x2b\xd4\x08\xf1\xc2\x56\xd0\xdf\x58\x0e\xaf\x4d\x29\xeb\xcb\xc6\xf5\x8f\x16\xc1\x12\x37\xf8\xe1\x8d\x01\xf8\xc0\xb5\x7c\xf6\xec\xbc\xac\x04\xf9\xae\x52\x5a\x90\x2c\xa1\x45\x5f\x28\xdc\x81\x6f\x91\x07\x9d\x8f\x21\xba\xbf\x71\x9e\xd8\x23\x05\x10\x64\xd3\x11\xd3\xe3\x7c\xd0\x8b\x44\x7a\x62\x48\x82\xfd\xbf\x41\x22\x06\x27\x29\x55\x1a\xa4\x11\x57\x1d\x8b\xeb\x46\x66\x16\xc6\x47\xbd\x34\x3e\xee\x91\xf7\xdc\x66\xb7\x17\x7d\x28\x4b\xb5\x1d\xcc\xfb\x7d\x9d\x8d\x01\x18\xea\x2a\x64\xb9\x7d\xf8\x60\x8a\xcb\xeb\xd5\x29\x94\x5c\x9b\x25\xd5\xf4\x82\x7f\x78\x0f\x78\x4b\xb9\x48\x03\x06\x97\xe7\xe6\xe9\x6e\x2c\xe2\xa3\x01\x0f\xf7\x1e\x79\xb7\xf7\x46\x34\xde\x17\x8f\xf6\x1e\x56\x9b\x6e\xc0\x01\xdb\x84\x07\xbb\x39\xef\xf5\x13\x14\x65\x7e\x1a\xaf\x75\x83\xa6\xbd\x86\xbc\xd5\x1f\xc2\x53\xdd\xc8\x57\xd7\xf5\x50\x7f\x38\xef\x74\x33\x9f\xdb\xa4\x22\xf0\x5c\x3d\xd2\x0d\x98\xe8\x9b\x34\xcf\x37\x66\x9a\x7f\x32\x0f\x74\x7d\xef\xf3\x1e\x78\x9e\x6b\x03\x99\x71\xa6\x19\x4d\x2e\x20\xa1\xd3\x5b\x88\x04\x8f\x77\xe6\x30\x33\x55\x3a\xc3\xf9\x51\x76\x5a\x67\xa7\xaa\x26\x5a\x8c\xa9\x2b\x46\x6e\x34\x2a\x9b\x58\xe2\x7d\x19\x4e\xa0\x40\xaf\xb2\x5d\xe5\x5e\x7a\x27\xc8\xde\x18\xc4\x6c\xd6\x49\x93\x9b\xf8\xad\x78\x20\x62\xa8\x81\x93\x23\xc6\xfd\x3e\x1e\x97\xd4\xc0\xc2\x3a\x19\xd0\xda\x5c\x7d\xfd\xca\xdf\xfc\xf2\xcc\x8e\x68\x60\x55\xea\xe9\xad\xc0\xee\x45\xeb\xcd\xc0\xee\xc6\x61\x9e\x54\x4d\xc1\xd6\x3c\x5c\xa5\x37\xaf\x8b\x72\xca\xaf\x71\xde\x70\xda\x28\x8f\x89\xcb\x44\x7b\x79\x9b\x56\x3b\xae\xa6\x2a\xfa\x85\x38\x9a\x75\x56\xe3\xbb\xf3\xbe\x35\x1a\xb7\xe6\x92\x7d\x31\x97\x7c\xa4\xd8\x94\x3d\x14\x74\x9f\x69\x3c\x4a\x2b\xe8\x6e\x31\x4a\xb9\xa9\xdf\x48\x1a\x41\xbf\x71\x19\xc1\x1f\x27\x12\xe7\x92\x3a\x02\x18\x44\x3e\x7f\x78\x38\x40\x6c\x4f\x53\xc8\xe7\xc5\x4c\xd9\x61\x9e\x24\x53\x92\x67\x82\x57\xb3\x9f\xad\xaf\x7d\x36\x99\x16\x4d\xf2\x0b\xde\x52\x08\x96\x99\x14\x8e\x67\xca\x9c\x73\x43\x83\x8b\x9e\x68\x28\x48\x62\x99\x66\x5a\x49\xd9\x55\x6c\x64\x96\x6f\xf8\x1f\x66\xf3\x16\x01\x88\x95\x09\xcd\xd3\x43\x21\x23\x36\x48\xa6\x64\x4c\x93\xd0\x00\x87\x92\x7b\x96\x24\x6e\x9a\x1e\xb9\x05\x6d\x5d\x0a\x96\x77\x26\x82\x8f\x70\x71\x94\xfb\xc6\x8b\x10\x99\x67\xa3\x04\x28\xcf\x33\xfb\x3e\xc3\x89\xa7\x22\x97\xfe\x7d\xbd\xe0\x98\x08\x1c\x98\xb3\xa4\x53\x6a\xef\xb6\x72\x63\x43\xec\x4f\xae\x8c\x00\xf0\xce\x97\xa5\xee\x94\xe7\xf4\x95\xc3\x55\xa9\xb9\x4f\x26\xc5\x84\xc5\xd6\xbb\xe1\xc1\x86\x8d\xa4\x6d\x03\x9f\x70\x9e\xb9\xe0\x5d\x0e\x23\x8a\x82\x8a\x3b\x45\x76\xcf\xec\x3c\x36\x82\x80\xc7\xd8\xd2\xc7\x48\xf8\x22\xab\xa4\xd3\x4f\x98\x6d\x46\x5c\x82\x1c\x39\xe2\x82\x08\x8c\x47\xcd\x39\xd3\xb6\xc1\xfd\x38\xd7\x24\x16\x0f\xfc\x78\x2b\xaf\x2b\x3a\x5a\xef\x16\x02\xa8\xea\x7e\x5d\x24\xe7\xd8\xef\x5d\x0d\x5e\xa6\x9c\xe9\x73\x48\x72\xae\xa0\x26\x7b\x6f\x4c\x38\xfa\xf2\x0f\xbb\xd1\x08\x96\x82\xc8\xf5\x07\xd1\xfe\x1e\xc6\x2c\x1a\x97\x85\x59\x96\x82\x22\x22\x9f\x51\x8b\x5f\xbb\xc7\x16\xef\x50\xab\x02\x2e\x1a\xbb\x1a\x76\x17\x58\xbf\x66\xcb\x21\x14\x9d\xaf\x31\x4e\xfc\xe2\xfa\xf6\x5f\x6f\xce\xfe\x7e\xf9\xa6\x47\x2e\x69\x34\x2e\xd7\xc4\xe0\x84\x22\xd1\x40\x42\x31\xa6\x13\x20\x94\xe4\x9c\xfd\x27\x77\x0e\xdf\xa3\xf0\xec\x71\xa3\xb5\xda\x77\xe4\xbe\xd8\x9d\xbf\xb1\x76\x70\xb6\xd7\xbf\x8d\xcb\x12\x0a\xb0\x81\xcb\x9c\xf8\x14\xbc\xcc\x53\xab\x22\xa0\xc0\x85\xe1\xf3\x17\xef\x2e\x6f\x31\x2c\x3f\x93\xb6\x52\x08\xc6\x71\xe1\x75\x9c\x69\x00\xe6\x09\xd7\xb9\xb7\x47\xce\xf8\xd4\x5e\xb4\x67\x8a\x29\x92\x30\xa5\x01\xb9\x9e\x13\xdb\xbc\xff\xfa\xe0\x55\x0f\xff\x77\x40\x68\x1c\x4b\x23\xd7\x85\xf0\xb4\x68\x2e\x5e\xd4\x4a\x7e\x6c\x90\x94\x3e\x80\x83\xb6\xd1\x68\x6f\x45\xec\x56\x8e\x9c\x04\x7d\x57\x96\x0d\x2a\x2d\xa9\x86\x11\x8b\x48\x0a\x72\x04\x24\xa3\x3a\x1a\x93\x94\x4e\x49\x24\xa4\xcc\x33\x5b\xe7\x3f\xa6\x9a\xf6\xc8\xd7\x42\x92\xd4\x1f\x62\x83\xf3\x86\x0f\xdf\x2e\xf6\xe9\x17\x27\xbb\xfc\x4f\xa6\x54\x0e\xea\xe4\xf5\xab\x3f\x7d\xfe\xc7\x3f\xbe\xa8\xd6\x70\x45\xb8\x90\xd9\xdb\x52\x6b\x38\xea\x77\xc1\xee\xba\x6d\x15\xc8\xf8\x28\x29\xe3\xd7\x6e\x0c\xa0\xae\x96\x59\x57\xc7\xec\x16\x5f\xd0\xdf\x55\xd5\x6c\xa4\x45\x5d\xb1\x86\x86\x1a\x3b\x15\x7c\xd0\x2b\x56\x8e\x36\x88\x72\xaf\xde\xab\xbe\x3f\x98\x4e\xce\x49\x67\x1a\xbc\x66\x45\x74\x52\x87\xbc\x22\x7f\x21\x8f\xe4\x2f\xa8\x68\x7d\x59\xb7\x0d\x56\x5d\x15\xa8\x89\x60\x23\xa3\xdf\x5f\xf5\x1b\x82\xf8\x3f\x0c\xd1\x34\x33\x1a\xa8\x6a\x41\x06\xcc\x09\xf6\xf0\xa8\x41\x1a\x41\xd3\xed\xc4\x47\x6d\x20\x66\x16\xf8\x01\xd1\xcc\x3a\x1e\xae\x86\xd5\x00\xa7\xed\x10\xcd\x3c\xfe\xad\x50\xfa\xda\x51\xa1\x6a\x2b\x9c\x62\xb6\x14\x09\x7f\x85\x8c\x19\xbe\xa1\x74\x71\xc0\x14\x89\x05\xc6\x5b\xd9\x40\xe6\x31\xab\x11\x46\xb1\x3f\x68\x5c\xcf\xb3\x5e\xd9\xcf\x55\x3b\x35\x63\x4a\x41\x1d\xc8\x89\x58\xa5\x1a\x59\x99\x88\x9d\x74\x66\x96\x15\x97\x78\xc6\x0a\xf1\xcc\x59\x6d\x82\xbd\x19\x71\xc9\x9c\xa7\x88\x72\x9b\x4a\x32\x04\x29\x6d\xec\xf9\x60\xea\xc3\xf6\x6a\x6f\x5e\xad\x93\x94\x49\xa1\x45\x24\x6a\xf4\x38\xab\x7a\xbb\xdd\x74\x08\x04\x1b\xef\xeb\x0d\xe6\xdf\x5f\xf4\x3b\xe4\xee\xbc\x8f\x7d\x9f\x6e\xcf\xef\xfa\x55\x9d\xe5\xe0\xee\xbc\x7f\xf0\x51\x41\x41\xbc\xc0\x87\x26\xea\x1d\x26\xa9\x98\xa0\x8c\x34\xd9\x4d\x69\xd6\xbd\x87\xe9\x8e\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x7a\x36\x09\x34\x66\x1f\x28\x9f\xcb\x07\xc4\x86\x77\x2e\x4e\xec\x4a\xc5\x04\x62\x2b\xa5\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbd\xb6\x7f\xba\xcd\xf6\xda\x78\xb4\xd9\x5e\x6d\xb6\xd7\xfc\xd8\x9b\x90\xd6\x36\xdb\xeb\x65\x79\xf0\xdb\x6c\xaf\x4f\x3c\x08\xa0\xcd\xf6\x5a\x3c\xda\x6c\xaf\x36\xdb\x6b\xb3\xd1\x66\x7b\x6d\x3f\xf6\x2e\x7c\xa9\xcd\xf6\xda\x6a\xb4\xd9\x5e\xf3\xa3\xcd\xf6\x5a\x32\xda\x6c\xaf\x25\xa3\xcd\xf6\x6a\xb3\xbd\xda\x6c\xaf\x36\x08\x76\xed\x5c\xfb\x19\x04\x4b\xda\x6c\x2f\x37\xda\x6c\xaf\x17\x11\xea\x47\xda\x6c\xaf\x8d\x46\x9b\xed\xd5\x66\x7b\xed\x32\xda\x6c\xaf\x97\x62\x2e\x69\xb3\xbd\xda\x6c\xaf\x4f\x47\xd0\x6d\xb3\xbd\xda\x6c\xaf\x36\xdb\xab\xcd\xf6\x5a\xb9\x8a\x36\xdb\xeb\x25\xa8\x80\xbe\x23\x70\xfd\xec\xa5\xc3\x73\x91\x66\xb9\x06\x72\xe3\xa7\x0c\x52\xa4\x25\x0c\x4c\x95\x25\x82\xfa\x21\x84\x91\xe0\x43\x36\x72\x94\xfd\xc4\xb6\xe1\xed\x86\xef\xe9\x96\x5a\xdf\x3e\xc3\xf8\xc1\x28\xa1\x6c\x77\x07\x4d\xd5\x87\x7e\x8e\x73\x61\x5a\x57\xe1\x45\xc7\xc0\xae\x00\xad\x4e\xf0\x50\x1b\x0e\x69\x68\x99\xbf\x64\x1f\xee\xd8\xf0\x30\xc3\xce\x90\x86\x2d\xd8\xd0\xf7\xbc\xa0\xb6\x9c\xd0\x24\x1b\xaf\xa6\xb7\x66\x21\x17\x53\x4e\x53\x16\x79\x8c\x39\x4b\x12\x11\x59\xfe\x5a\xa5\xb8\x7e\x6e\x3b\x9f\x79\x49\x9a\xe6\x9a\x0e\x12\xd8\xd9\x93\x5e\xdf\x8d\x56\xd3\x85\x56\xd9\xa3\x9b\x32\xb4\x6d\x7c\x3c\x70\x73\x84\x04\x07\x02\x5c\xcb\xa9\xd9\x98\xbe\x88\x6f\xcd\xde\x54\xee\xae\x1d\x36\x5f\xd3\x73\xd6\x84\xd7\xac\xa6\xc7\xac\x19\x3f\x57\x7d\x1f\xd7\xbc\x4b\xa0\x94\xc9\x52\x0e\x5f\xa9\xec\x6a\x26\xe2\xde\x82\x23\xe7\x75\xab\xbe\x88\x8d\x64\x89\xad\xd2\xcb\x47\xc0\x4a\x69\x57\x66\xfa\x7b\x14\xc7\xa8\x2e\xfa\xbb\xd3\x09\x65\x89\x39\x1f\x0b\x32\x34\xeb\x35\x71\x69\x40\x6f\x69\x3a\x3d\x80\xd4\xc5\xa0\x26\xc3\xfb\x09\x76\x6c\x49\xd9\x6e\xf9\xc0\x64\x8e\xab\xbe\xc1\xb9\x4a\x4e\x75\x83\x13\x29\x7d\x44\xf9\x86\xa6\x22\xb7\x7d\xe7\x23\xc7\x7c\x03\x45\xb7\xa1\x07\x7b\xc7\x56\x49\x33\x64\x87\xc6\x3e\x28\xba\xdf\x44\x4c\x20\xd5\x1a\x24\x3f\x25\xff\x7d\xf4\xfe\xf7\xbf\x76\x8f\xbf\x3a\x3a\xfa\xf1\x55\xf7\xcf\x3f\xfd\xfe\xe8\x7d\x0f\xff\xf1\xbb\xe3\xaf\x8e\x7f\xf5\x7f\xfc\xfe\xf8\xf8\xe8\xe8\xc7\xef\xde\x7e\x73\xd7\xbf\xfc\x89\x1d\xff\xfa\x23\xcf\xd3\x7b\xfb\xd7\xaf\x47\x3f\xc2\xe5\x4f\x1b\x4e\x72\x7c\xfc\xd5\x67\x3b\x2f\xb9\xb6\x3d\xa3\x39\x6b\x46\x43\xb6\x8c\x27\xb1\x64\xb8\x68\x9c\x86\xce\xa2\x8b\x24\x9c\x3b\x8d\x4e\xdb\x58\x75\x1a\x3d\x97\x44\x1d\x3d\xcc\xc3\x14\x11\x29\xd3\x46\xb3\x37\xca\x3c\x2d\xe7\x22\x30\x5d\xb1\x28\x3a\x3a\x80\xd9\x38\x14\x93\x06\x4a\x71\xfc\xa5\x08\x44\xe1\xd5\x76\xb4\xc7\x71\xc2\xd2\x2c\x81\x14\xb8\xc6\xf3\xdc\xf5\x62\x1e\x6a\x46\x2d\x6d\x58\x3f\x5a\xda\xf0\x12\x69\x83\x82\x28\x97\x4c\x4f\xcf\x05\xd7\xf0\xb8\x93\x79\xbc\x4a\x1a\x6e\xab\x13\x3a\x75\x4a\xb9\x40\x65\x7b\x8d\x88\xcc\x26\xed\xcc\x54\x45\x19\x8b\x3c\x89\x31\x13\x2f\xe7\x68\x1d\xb4\x29\xd6\xa0\xad\xe9\x0e\x25\x3e\x14\x07\x67\x5f\xe2\x8d\x71\xd6\x46\xf8\x9f\x9c\x4d\x68\x02\x5c\x97\x9e\xe8\xa3\xf9\xa9\xfc\xd0\xa6\x67\x5e\x53\x75\x5f\x1c\x78\xe8\x66\x22\x2e\xce\xf7\x89\xff\x24\xfc\x09\x1e\xf5\x73\x54\xb1\x51\x40\xea\x4b\x36\x61\x09\x8c\xe0\x52\x45\x34\x41\xba\xd6\x0c\xaf\x38\x5b\x32\x3b\x6e\xbc\x14\x89\x32\x42\xbd\xa1\xd5\x84\x7a\xfb\x2d\xa6\x47\x8f\x28\xe3\xb6\xa8\x49\xe6\x1f\x56\xd6\x10\x6c\xc8\x7f\x46\xa5\xd9\xe0\x60\xf0\x45\xad\x78\x20\x44\xe2\xd2\xd5\x92\x69\x31\xbf\x4b\xdc\xe4\xe2\x5f\x1c\x1e\xfe\x65\x66\x53\x64\x98\xd0\x51\xb0\xf3\x2a\xd0\x73\xae\x9a\x62\xea\xa5\x1f\x80\xb9\x60\x39\x10\x9a\x3c\xd0\xa9\x2a\xac\xde\xa5\xf2\x3d\xea\x94\xbc\x3e\x46\x74\xa6\x8a\x84\x39\x62\xf2\xf9\x31\xc6\x6e\x9c\x9f\xf5\xff\x75\xfb\xcf\xdb\x7f\x9d\x5d\xbc\xbd\xba\x26\xd7\x42\x83\x65\x6a\x25\x05\x27\x0a\xe6\x21\xb3\x4a\x7c\x07\xea\x48\x42\xf5\x50\x89\x62\x8a\x3c\x30\x1e\x8b\x07\xb5\xb3\x83\xcd\xa2\x9f\x01\x1e\x50\xbe\x9b\x91\x86\x66\x14\x5b\xd7\xd6\xe0\x30\x73\xe1\x81\xe5\x49\x91\x87\xc7\xf1\x49\x2c\x45\x66\x81\xe0\x3d\x14\x05\xab\xad\xda\x40\xcb\x09\x08\xb8\xbf\xc3\xea\x84\x23\x49\xb9\x2e\x4c\xf5\xc5\x9e\xb9\x9e\xb9\xbd\xda\xdb\xf1\xf1\x18\x7f\x13\x66\x00\x1a\x37\x97\x8a\x7a\x16\xc7\x10\x57\xc0\xff\xe2\xc2\xbe\xcf\xfd\xc7\x4d\x8b\x12\x43\xa4\xff\xee\xf6\xea\xff\x37\x83\xc7\xd3\xac\x5e\x94\x6b\x33\x65\x0d\xa4\xc8\x1a\xdb\xdd\x1b\x97\x36\xdf\xee\xef\x5e\xec\x6f\xe0\x96\xcd\xc4\x56\xdd\xe4\xbc\x5a\x8f\xae\x98\x9f\xa4\x22\x86\x1e\xe9\x07\x27\x6f\xf5\x6a\xa9\x3a\x0d\x95\x40\xcc\x2d\x5c\x33\x9a\x24\xd3\xb2\x88\xa6\x85\x4d\x21\xaf\x14\xd6\x29\x13\xf2\x21\x4d\xd4\xc7\xa6\xc6\x75\x78\xa3\x91\x23\xde\x1a\x7d\xb8\x91\xed\x08\xb3\x91\x18\xb8\xd0\x4e\xb0\x36\xab\xc4\x62\x45\x52\x44\xc4\x2a\xdf\xa5\x48\xda\x0a\x7f\x53\xd6\xd1\xec\x59\x23\x53\x1e\xd8\xfd\x30\xb3\xf5\x32\xe6\x0a\x66\x05\x74\xdf\x4e\x3e\xa8\xe3\x66\x76\x09\x34\x16\x3c\x99\x62\xd8\xbc\x0d\x84\x4b\xa9\xba\x87\xd8\xfe\xe0\x44\xb3\xe0\xf6\x40\x4b\xae\x7f\xd5\x9d\x59\xb7\xf7\x70\xa0\x48\x66\xc3\xf3\xd0\x37\x02\xf1\x47\xde\xf5\x1a\x87\xd0\x00\xe5\x1d\x4f\xa6\x37\x42\xe8\xaf\x43\x0d\x84\x46\x30\xe0\x1f\x4e\x5a\xae\xba\x9d\x50\x9c\xa4\xf8\xde\x2e\xee\x06\x1e\xaa\x72\xf9\x85\x8b\x62\xc7\x9f\xfb\x91\x92\x39\x3f\x53\xdf\x48\x91\xef\xcc\xc4\xe6\x84\xcd\x6f\xae\x2e\x90\x14\xe5\x2e\xce\x84\x6b\x39\xc5\xba\x2f\xf3\xc5\x3b\x83\x62\xf0\xbd\x8b\x94\x29\x9f\x89\x22\xa8\x81\xbc\xa5\x53\x42\x13\x25\x3c\x2c\x9d\xdf\x6a\x56\x0b\x75\x2a\xae\xb9\x3c\x10\x7a\x3c\xa7\xdb\x9a\x03\x35\xff\x5c\xa7\x14\x76\x52\x54\x13\x65\x7c\xee\x71\x8d\x4e\x91\x4c\x42\x04\x31\xf0\xe8\x63\x6f\xfb\xc7\x8e\xd6\x40\xd4\xb9\x16\xdc\x1c\xcc\x46\x90\xe7\x2a\x84\xe9\x38\x90\x96\x51\x05\xbd\x5e\x4e\xfb\xa3\x18\xf6\x83\xc7\x32\x57\x20\x6d\x8c\x92\xcc\xc1\xee\xe4\x77\xf9\x00\x12\x03\x79\xa3\x92\x62\xe9\x38\xaa\xad\x39\x83\xa5\x74\x04\x84\xea\x80\x69\x5a\x10\xe0\x2a\x97\x6e\x13\x99\x26\xb1\x80\xa2\x74\x0a\x55\xe4\xfb\xab\x0b\xf2\x8a\x1c\x99\x77\x1d\x23\xfe\x0c\x29\x4b\x30\x22\x48\x53\x39\xbb\x46\x36\xf4\x53\xe0\x92\x10\x79\x89\x90\x96\x48\x74\x08\x17\x44\xe5\xd1\xd8\xaf\xc9\xe8\xbd\x5e\x6d\x76\x51\xec\xe8\x5a\xd9\x4f\x5c\xff\xb8\x14\xea\x7b\x05\xb2\x31\x02\xf5\xfd\x0e\x04\xaa\x2c\x46\x19\x9c\xab\x42\xcf\x22\x56\x0a\x9a\xc6\x54\x53\x47\xb8\xfc\x0d\x7b\xbb\xa5\x9f\x36\xf9\x52\xf0\x86\xf1\xfc\xd1\x46\x8d\x36\x67\x6a\xb9\xbd\xc4\x69\x49\xe4\xa1\x8e\xbb\x4e\xb3\x2c\x61\xb6\x54\xd2\x4c\x14\xf3\x55\x05\x57\x3a\x4b\xc4\x44\xa4\x13\xd4\x86\xb2\x80\x11\x4e\x28\x8f\x45\x3a\xf7\x32\x23\x44\x42\xa5\xec\x75\x8f\xb4\xd8\x57\x1d\x7b\x62\x14\x4a\x60\x02\x35\x0a\x43\xce\x96\xf9\x36\xb3\x19\xe0\x78\x8c\xc0\xe9\x49\x42\x07\x90\xb8\x30\x2b\xc4\x40\x35\x8f\x81\x1f\x3b\x95\x40\x8a\xa4\xb9\xdc\xc7\x1b\x91\x80\x8d\xcd\xf5\x80\x30\xd3\x3f\x0b\x38\xe0\x24\x4d\xc1\x01\xb5\xc1\x0a\x1c\x50\xaf\x7d\x0e\x70\xc8\x6b\xb0\x7a\x32\x0b\x07\x23\x37\x54\xe1\x80\xcc\x7b\xdf\xe1\xa0\x20\x8a\x44\x9a\xf5\xa5\x30\x6a\x67\x63\xbc\xc9\x4d\x5b\xf8\x0c\xad\x61\x63\x41\xe0\x25\xf2\x82\xea\xcd\x54\x96\xa2\xf2\xa9\xb6\x4c\xc2\x87\xe6\xff\x7f\x4a\x3c\x0b\x49\xcf\x2c\x23\xf3\xb3\x54\xdc\x8b\xe6\x49\x77\xe1\x39\xb3\x83\x26\x12\xdb\x6a\x18\x3b\x1b\xe1\x46\x22\xa2\x09\x16\xfe\xae\x87\x72\x64\x16\xed\x66\x27\x2e\xe5\x62\xa0\x8f\x12\x7f\x2b\xc5\x09\x53\x34\xb4\x78\x13\x26\x17\x31\x94\x7c\xd9\x36\x3c\xf1\xce\xc6\xec\xe3\x7d\x3e\x0d\xc4\xc8\x15\xde\xad\x1c\x57\x9e\xd6\xc2\x95\xaf\x7c\x1b\xca\x89\x9b\x05\x02\x8f\x19\x1f\xa1\x5d\xad\x43\x24\x24\x36\x81\xc4\x11\x81\x7b\xab\x41\x1e\xe2\x91\xf0\x93\xfa\xf3\xe0\x5f\xed\xc3\x8a\xdd\xcc\x68\x29\xf2\x12\xd6\xd0\x92\x5b\xa6\xc8\xc1\x1b\x0f\x80\x1a\xf5\x97\xf7\x91\xc3\x1c\xd8\x2f\x0c\xbb\x69\x2d\x9d\xf7\x8c\xc7\x2e\xd7\xa2\x02\xac\xd0\xc0\xc3\xca\xc1\x98\xc5\xc3\xe2\x32\x6d\x39\x25\xef\x39\x09\xc0\x22\xdd\x9d\xd1\xe3\xc6\x8a\xcc\xde\x46\xd7\x5d\x6d\x78\x0d\x2f\x99\x9d\xe6\x7b\x8e\x7b\x6f\xde\xdb\x35\x9a\xfb\xfc\x7d\xfe\x5b\x3e\x6a\xdd\x35\x47\xfd\x9a\xd6\x62\xfe\x61\xa7\xf5\x22\x7d\x64\xd0\x5a\x33\x3e\x52\x65\x4d\x86\x26\x49\xc5\x18\xbe\x48\x95\xf1\x3b\x1c\xda\xb5\xcc\xab\x10\x33\x39\x62\xcf\x45\x0d\x49\x8c\x38\xf1\xcc\x95\x90\x51\xaa\xe8\xb9\x34\x90\xd0\x8c\x26\xb7\xd9\xee\xf5\xa5\xc9\x5c\x2d\xd3\xb7\xb7\x67\xd5\xa9\x91\x59\xbb\xa0\x73\xc0\xeb\x84\xc6\x29\x53\x0a\x0d\x61\x30\x18\x0b\x71\x4f\x8e\x56\xb6\xd9\xe9\x2a\x36\x52\x27\x0e\xe7\xbb\x66\xf5\xc7\x84\xf1\x24\x44\x45\xa1\x1e\xcc\x75\x88\x73\xc7\x97\x44\x61\x15\xb8\x87\xae\xe9\x80\x0b\x56\x98\x5f\xa6\x6d\x33\x60\xb0\xe0\xa3\x13\xec\xf9\xed\xb9\xae\x99\x4f\xb0\x66\x8b\xae\x1d\x6e\xcf\x96\xc5\x5c\x08\x47\x2b\x3d\x7e\x74\x20\x39\xe1\x22\x02\xd5\x5c\x35\xbe\x6f\x8b\x39\x49\x0c\x36\x05\x13\x30\xfa\x89\x2e\x0d\xb2\x43\xbb\xf4\x21\x66\xf2\xbb\x47\x0f\xcb\x12\x75\x35\xd7\x08\x53\x99\xba\x56\x49\x37\x14\x0d\x49\xa0\x17\x21\xc6\x82\x0b\x97\xe1\x66\x98\xa8\xe0\x88\xd2\x48\xa2\xac\x37\x0f\xf7\xc4\x91\xe8\xd2\x52\xcf\x0b\x2f\x71\xd9\x11\x88\x99\xc0\x3a\xf4\xc5\xb2\x6b\x78\x60\x7a\x8c\x45\xba\xc7\x33\x5e\x43\x5c\x89\x04\x85\x0e\x18\x4e\x40\x4a\x21\x5d\x40\x96\xb7\x5b\xbb\x44\xab\xbe\x88\x31\xa2\xcb\x20\x09\x35\x7f\x1d\xaa\xb2\xa3\xba\xe8\xe3\x81\xf1\x8a\x06\x9b\x60\x38\x84\x08\x05\xad\x32\x80\x2d\xd5\x3e\x2a\xaa\x96\xbb\x2c\x03\x83\x60\xae\x0f\x48\xca\x1e\xcd\x5b\xca\x4f\x95\x5d\xe2\xae\x5a\xf8\xe2\xcb\xc7\x3d\x42\xae\x78\x88\xe0\xed\x98\x5d\x2c\xdf\xe9\x43\xcf\xb4\xf9\xc4\x72\x13\x19\xfc\x80\xb2\xe1\xcc\x48\x87\x32\x6f\x00\xe3\xeb\x98\xc3\x49\xd9\x24\xde\x28\x39\x40\xd3\xb8\x9b\xd4\x6c\xbd\x97\x01\xea\x98\xca\xcd\x2d\x4f\x65\x2e\x7f\x1e\x0e\x10\x52\x97\xce\xb9\x52\x38\x0d\x75\xf6\xb8\x2d\xcd\x56\x92\xde\x83\xc3\xad\x2f\x62\x5b\x0a\x2b\x94\xf2\x49\xa6\xbe\x34\x17\xfb\xc5\xcb\x67\x85\x8c\xc7\x85\xcd\x0e\x28\xd7\xc8\x72\xfd\x10\x62\x62\x44\xed\xc4\xdb\x16\xd2\x2c\x01\x4c\xc1\x2f\xcd\x5c\x54\x17\x28\xb5\x02\xe9\x14\x29\x6a\xa1\x9b\x88\xab\xcc\xd5\x21\xff\xc6\x43\x19\x02\x51\x7d\xd1\xa0\x7e\x78\xdc\x6a\x88\x4c\xf9\xbe\x40\x98\x5a\xaa\x85\x37\x5d\x90\x98\x0d\x31\x11\x52\xbb\x57\x66\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x43\x23\xee\xb9\x44\xed\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\xf2\x0a\xc4\x3b\x15\x13\x41\x63\xec\x27\x48\x84\x24\x0f\x54\xa6\x86\x6f\xd0\x68\x8c\x1e\x4a\xca\x49\x9c\x4b\x2c\x91\xaf\x81\xc6\xd3\xae\xd2\x54\x1b\x49\x19\xa4\x53\x28\xfd\xfa\xdb\x7e\x28\x2b\x47\xdb\x0f\x65\xc3\xd1\xf6\x43\x69\xfb\xa1\xcc\x8f\xbd\x89\x0e\x6d\xfb\xa1\xbc\xac\x1a\x77\x6d\x3f\x94\x8f\xed\x4d\x68\xfb\xa1\xb4\xfd\x50\x56\x8d\xb6\x1f\xca\x9a\xd1\xf6\x43\xd9\x61\xbc\x00\xca\xd5\xf6\x43\xd9\x61\xb4\xfd\x50\x16\x8f\xb6\x1f\xca\xfc\x68\xfb\xa1\x2c\x1d\x6d\x3f\x94\x9d\x47\xdb\x0f\xa5\xed\x87\xd2\x96\x89\xde\x6e\xae\xfd\x2c\x13\x4d\xda\x7e\x28\x6e\xb4\xfd\x50\x5e\x44\x31\x5c\xd2\xf6\x43\xd9\x68\xb4\xfd\x50\xda\x7e\x28\xbb\x8c\xb6\x1f\xca\x4b\x31\x97\xb4\xfd\x50\xda\x7e\x28\x9f\x8e\xa0\xdb\xf6\x43\x69\xfb\xa1\xb4\xfd\x50\xda\x7e\x28\x2b\x57\xd1\xf6\x43\x79\x09\x2a\xa0\xd2\x31\xdb\xa9\x02\xe8\x26\xc5\x8a\x5c\x10\x7a\xa9\x36\xc0\x20\x1f\x0e\x41\x22\xe5\xc2\x37\xcf\x05\x4f\x15\x75\x19\x67\x9d\xac\xa0\x3b\x58\xf7\xc8\xe5\xeb\x2c\x79\xdc\x15\x23\xc0\x4a\x9d\x45\xa4\xf8\xe5\xbb\xaf\x17\x54\x46\xda\x39\xaa\x70\xd7\x18\x69\x5c\xf3\x3b\xbe\x9b\x7f\x7c\x09\xc0\x17\xe5\x8f\x39\xb8\x47\x89\x50\x2e\xc2\x1d\x81\x15\x8d\x29\xe7\xe0\xf5\x3d\xa6\xd1\x8e\x32\x00\xe0\x44\x64\xe0\xbc\xd3\x94\x28\xc6\x47\x09\x10\xaa\x35\x8d\xc6\x3d\xf3\x26\xee\x81\x5d\x44\xa3\xbb\x5f\x94\x96\x40\x53\x1f\x97\x9f\x52\x66\xa7\x22\x34\x92\x42\x29\x92\xe6\x89\x66\x59\x98\x8c\x28\xc0\x84\x1a\xcb\xa8\x02\x30\x30\x2a\xae\x08\x61\xef\x14\x6f\x73\xcb\x12\xe5\xd2\x74\xa8\x6d\x76\xb0\x1e\x78\x9a\xe9\x69\x88\xe3\x05\x32\x64\x52\x69\x12\x25\x0c\xb9\x35\xbe\xd1\xe6\x4e\xe3\x7c\x1d\xcf\xab\xb9\x5b\xa9\x72\x4b\xe5\x31\x8a\xad\x99\x56\x36\x2a\xb6\x98\xd0\x4d\x15\x33\xe5\xc4\x7c\xd5\x21\xd4\xd7\x4d\xb3\x80\xf6\x2b\x45\x50\x7b\xce\x62\x67\x77\x3f\x95\xa6\x2b\xd5\x8b\x2d\xc2\x86\x0b\x44\xc7\x14\x07\x8f\x9c\x9d\x4a\x36\x47\x21\x50\xb8\xb6\x17\x33\xc7\x00\x37\x80\xc3\xc4\xe0\x00\x44\x60\xf8\x2b\x5d\x82\xf5\x1f\x1c\xe9\x4b\x4c\xf1\x2d\x28\x45\x47\xd0\xdf\xd1\xd1\xb0\x4c\x23\x43\x5f\x43\xb1\x31\x88\x0a\x89\xcd\xae\x0d\xbf\x14\xd1\x99\x55\x31\x88\xa4\x76\x4d\x41\xf8\x79\x90\x4c\x6b\xc0\x4d\xc5\x0a\x7b\xe8\xab\x9c\x4d\xc0\x3f\x9c\x89\xf1\x7c\xeb\x27\x29\x1e\x36\x44\x9d\xc7\x36\xe2\x72\x00\x64\x20\x19\x0c\xc9\x90\x61\x18\x27\x06\x56\x76\x6c\xc1\x25\x6a\xad\x00\x4a\x19\x7d\x57\x70\x2f\xcb\xfa\x75\xf5\xc8\x3f\xdc\xc2\xb4\xcc\x79\x44\x4b\xb5\x6c\x31\xc3\x94\x0d\xc9\x08\x03\x33\x9d\xb4\xf8\x87\x57\x7f\xfe\x92\x0c\xa6\x86\xa5\xa1\x64\xa5\x85\xa6\x49\xf8\xc8\x04\xf8\xc8\xc0\xca\x1e\xcf\x6a\x8e\x64\x80\x00\x76\xf3\xb0\x0b\x7f\xfd\xf9\xfd\xa0\xca\x63\x4f\x62\x98\x9c\x94\xe0\xd7\x4d\xc4\x68\x51\x73\xab\xdd\x43\xb6\x77\x54\x89\x16\xa0\x99\x48\x58\x34\xad\x8d\x68\xbe\xf2\x17\x19\x8b\x07\x2b\xeb\x2f\xc0\x9e\x22\xdd\x2a\x13\x59\x9e\x58\xa3\xf3\xd7\x21\xbb\x38\x57\x30\x9f\x03\xb8\xf0\x5c\xa0\x99\xd4\x4d\x31\x5b\x37\xdd\xc6\xe3\xfa\x57\x0a\x97\x5b\xe2\x0c\x79\xa1\x00\x18\x2a\x42\x5f\xd3\x24\x19\xd0\xe8\xfe\x4e\xbc\x11\x23\xf5\x8e\x5f\x4a\x29\x64\x75\x2d\x09\x35\xd4\x72\x9c\xf3\x7b\xdb\xc1\x21\x94\x48\x10\x23\x23\x5a\x65\xb9\xf6\x89\x0c\x8b\x3e\xd8\xe6\xcb\x7b\x22\xec\xd5\xa0\x62\x16\x78\x64\x85\xae\xe3\x52\xb5\x2c\x46\x96\xe7\x57\x65\x64\xfb\xfc\xd5\x1f\xfe\x64\x51\x97\x08\x49\xfe\xf4\x0a\x63\xb6\x55\xc7\x1e\x62\xa4\x6d\x86\x51\xa4\x34\x49\x8c\xda\x50\x46\x4a\x03\xe8\x45\x48\xf8\xc1\x71\x50\xd7\x47\xb7\x8d\x45\xa9\xbb\xbb\x7f\xa2\x1c\xc5\xb4\x82\x64\xd8\xb1\x59\x49\x41\xad\x39\x44\xc6\x70\xe8\xa8\x0f\xa6\x86\xed\x81\x00\x34\x11\x49\x9e\xc2\x05\x4c\x58\x13\x1d\xf8\x2a\xb3\x79\x55\x3f\x61\x0a\x13\xc0\x06\x89\x88\xee\x49\xec\x2e\x96\x22\x4f\x66\x2b\x81\xef\x0e\x85\x5d\x63\x70\x6a\xc4\xde\x2c\xfd\xfe\x4a\xd4\x4d\x4a\xb3\x2c\xe4\x08\x49\xfa\x50\x01\x06\x9e\x49\x2c\x57\x50\xb3\x9e\x4c\x6d\x33\x73\x5d\x23\x73\xd7\x7d\x91\xa1\x9b\x3b\x4f\xb1\x73\xd4\x49\x7d\x1b\x75\xb1\xfa\x86\xba\xea\x15\x13\xfa\xd3\x90\xe1\xbf\x6d\x56\xc9\x5c\x56\x64\x48\xac\x0b\x88\x61\x05\x00\x83\x3e\x48\x92\xeb\x76\xda\xab\x65\xdd\xac\x17\x72\x54\x81\x0b\x5f\xd1\x9a\x8e\x92\x0c\xa4\x62\xca\xf0\xe5\x1f\xf0\x40\xd9\x9e\x84\x85\x09\xf0\xe3\x00\xc1\x1e\x6e\x2c\x9f\x5c\x9f\x52\xf6\x45\xec\x26\x44\x52\x68\x4b\x47\x2f\x10\x6b\xab\x52\x6d\x83\x0c\xf5\x63\x93\xca\x1f\x0a\x68\x56\x29\xa5\xf9\x25\x90\x4a\x7b\xd7\x4b\x22\x90\xf8\x7d\xcf\x95\x3e\x86\xc5\x37\x44\x06\x90\x30\xba\xcd\xad\x52\xc2\x8a\xf2\x68\x0f\x4a\x49\xa4\x77\x7a\x60\x8f\x58\x2f\xb8\x39\x13\xee\x51\x72\x78\x7a\xf8\x51\x89\xa4\x05\x91\x14\x19\x1d\xd5\xea\xe5\x33\x03\xa9\xd9\x69\xcb\x85\x26\x8c\x1a\x84\xd7\x43\xd9\x35\xbc\x0b\xe2\xa2\x8e\x0e\x56\x49\xb2\xde\x51\x0f\x60\xa7\x20\xd8\x7c\xec\x07\x3a\x25\x54\x8a\x9c\xc7\xce\xbe\x14\x0c\x7c\x6f\x67\x5e\x7c\x2d\x38\x14\xcd\x3f\xab\x75\x2a\xd0\xa2\xcf\x38\x79\xdd\x7b\xfd\xea\xa5\x70\x2a\xfc\xc2\x19\x4e\x75\x1d\x38\x95\xa5\x4f\x1f\xf5\x5b\x7d\xc5\xfb\x86\xbe\xf7\xad\x33\xb1\x14\x05\xed\x99\x2f\x97\x8d\x3f\x3d\x48\xa6\xa1\xd4\xe3\xef\x08\x15\x17\xa3\x1f\x96\xaa\x32\x1c\x2f\xea\x24\x51\x13\x48\xf5\xca\x60\xa8\x7c\xf0\x84\x74\xcb\x11\x28\x3c\x6e\x8b\x2c\x5c\x6a\x05\x09\x2b\x03\xea\xe0\x80\x1c\xd9\x3b\x0f\x6d\x42\xf3\xf1\x47\x45\x2d\x07\xb4\xcb\xc7\xac\x46\x8d\xcd\x99\xdc\xf9\x8c\xa2\x0d\x2e\x6b\x10\x82\x7f\x87\x31\x9d\x00\x26\x72\xb3\x84\xca\x04\x7d\x8e\xb7\x76\xed\x64\x90\x6b\x02\x7c\xc2\xa4\xe0\x29\x70\x4d\x26\x54\x32\xac\x8a\x53\x6a\x71\xfd\xd9\xd1\x0f\x67\x37\x18\xd0\x70\xec\x4a\x52\xb8\x55\xe6\xca\x97\xaf\x29\xaf\xa4\x34\xdd\xda\xed\xf3\xeb\x30\x30\x44\x9a\xeb\xd7\x65\xde\x93\xe6\x3a\xb7\x6d\x59\x1e\xa3\x24\x57\x6c\xf2\xb1\x28\x89\xcb\xb0\xbf\x60\x3b\xed\xf3\x4c\xb6\x7f\x01\xa8\xb9\xc4\x7d\x34\xad\x2f\x48\xd0\x9b\x73\x98\x1c\xaa\x90\xb4\x57\xf6\x81\x3b\xd3\x93\xab\xa5\x61\xc3\xe7\x7c\xc5\xc5\x39\x11\x02\xeb\xc6\x7c\x5c\x23\x54\xcc\xd5\x39\xae\x70\x3b\xb0\x56\x03\x92\x2b\x79\x7c\x17\xd7\xb7\xe5\x22\x24\x56\x5d\x12\x71\x8f\xf4\x8b\x1f\x8b\x4a\x35\x58\x3f\x2d\x28\x91\x20\x47\x45\x51\xf1\x11\x70\x90\x28\x24\x98\x29\x2b\x6d\x55\xc9\x80\x2a\xeb\xe4\xb9\xb8\xbe\xb5\x36\xdb\xed\x60\xb6\xb3\x98\xbd\xbb\x84\x6a\x38\xbe\x4d\x63\xd8\x41\xb8\xad\xf6\x4c\x0b\x06\x2b\x03\x18\x54\x4a\xed\xc4\xe4\xaa\x4f\x68\x1c\x4b\x74\xfb\x38\xd1\xa7\x54\xa9\x32\xf8\x16\xb0\x2a\x0c\x55\x50\x5e\x53\x09\xdc\x48\xe2\x0a\xc0\x92\x8b\x3c\x4b\x98\x75\x23\x94\x1f\x28\xaa\xd9\x60\x93\xaf\xed\x91\xb6\x8e\x9a\xb7\xb3\x92\x57\x83\x0a\x89\x5d\x8b\x52\xae\xd8\x3d\x09\x4a\x24\x93\xa2\xa0\xf0\xcc\xae\xb9\x13\x81\x26\xf1\xb0\x6b\xbe\x06\xe5\x46\x3b\x06\x5c\x4b\x73\x34\x67\x77\x8b\xdc\x98\x37\xe7\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\xe5\x37\x5d\x19\xb7\xa2\xc4\xb1\xf5\x0d\xdb\x2a\xd3\x40\xa5\xa7\x68\xb8\xaa\x1d\x4f\x22\xf9\x58\x88\x30\x6b\xec\xb8\xb8\xbe\xb5\x94\xd0\x7e\x7c\xe8\x4e\xbb\x68\x97\x0a\xaa\xb6\x33\x06\x7e\xb4\x2a\x43\x75\x34\x8f\x99\xe6\x7e\xae\x5d\x77\xad\x40\x96\x1a\xe2\x5f\xad\x64\xbb\x1a\x6f\x57\x40\x65\x34\xde\x05\xfe\x2b\x08\x81\x9d\x94\xc4\xc2\x46\x02\x0c\x85\x44\x95\xb8\x8b\xe4\x3d\x11\xe2\x3e\xcf\x36\xa1\xe8\x6e\x1a\xdb\x70\x6d\x23\x02\x51\x79\xe2\x93\xa2\xe9\x31\x57\xbb\xf8\x7b\xab\xb2\x0f\x68\x2b\xf1\xe0\x44\x45\x02\x85\x98\xd5\x9b\xce\x93\x5c\x69\x90\x5f\x33\xa9\xf4\x81\xaf\x17\x8d\x18\x6c\x6d\x22\x87\xe5\x1b\xfe\xc1\xf4\xd8\x95\x6e\x3c\xec\x54\x2f\x99\xbf\xdd\xc4\x87\x46\xa7\x3d\xbc\x16\x1c\x0e\x7b\xb3\x62\x57\x20\xe5\x81\xac\x2d\xe5\x29\x6e\xe9\x0a\x12\x1b\x2f\x8a\x17\x4a\xb8\x72\xe7\xca\x56\x9a\x37\x78\xfa\xa7\x40\x13\x8a\x25\xe2\xf0\xee\x71\x51\x66\xd2\xd6\x8d\xb2\x75\x32\x85\x13\xf4\xa6\x65\x10\x95\x4a\x49\x69\xb1\xfc\xb3\x77\x91\xe7\xb6\xc6\x00\x5b\x7e\xd4\xd5\x0b\x79\xc3\xf8\xfd\x96\xe8\x57\x8d\x2e\xb9\x9c\x9b\xad\x52\x4f\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\x81\xc8\xb5\xaf\x49\xa2\x4a\x8a\x23\xe3\xff\xb6\x7b\x81\xf6\xf6\xcc\x56\xec\x5b\xa4\x23\xaa\x8e\x35\xfa\x78\x25\x50\x4d\xb9\xa6\x58\x5b\xf4\x42\x44\xf7\x20\x49\x62\x96\xd1\x23\x45\xe0\x4b\xa5\x9a\xa5\xcc\x61\xcb\xa8\x8b\x5d\x2d\x1d\x90\x8d\x21\x05\x49\x93\xa2\xa8\x6b\x0d\x50\xbf\x71\x84\x33\xcc\x5a\x8e\x49\xb1\x45\xd1\x5c\x19\x46\x73\x0e\x2f\x17\xdd\x95\xd2\xa9\xaf\x74\xcb\x38\x86\x1b\x3c\x32\x85\x66\xfd\x4c\xc4\xe5\xc4\xb3\x5c\x81\xec\x86\xb4\x40\x97\x7b\xa3\x42\x20\x4e\x0c\x83\x7c\x34\x62\x7c\xe4\xa8\x33\xd2\xf4\x52\xb9\xed\xa0\xe9\x60\xa4\x77\x24\xc1\x16\x9c\x45\xe9\xc1\xc6\x97\xb1\xf2\xfd\xa9\x88\xed\xed\x83\xa9\xd5\x06\xfd\xce\x16\x01\xd2\x57\x9c\x08\xe9\x4a\x23\xd0\x38\xc6\xb5\xcf\x7f\x21\x5e\xad\x7e\x55\x27\xc4\x71\xd8\xc8\xee\xf0\x54\x09\x2c\x2a\x1f\x18\x61\x27\x97\xdb\x56\x08\xdd\x95\xf0\xef\x44\xf4\xab\xf5\x7e\xce\x78\xb1\xc5\xe7\xe5\x80\x39\x4a\x34\xa4\x99\x90\x54\x4e\x67\x5d\x98\x86\x48\x19\x14\x30\x00\x9c\x81\x54\x5f\xc4\x48\xc7\x17\x6c\xfc\xc4\x76\xf2\x5d\xb0\xf7\x0b\x71\x0c\xa9\x20\x17\xc4\x43\xd4\xd0\x6b\x15\x8d\x21\xce\x31\x7a\x7c\x94\x53\xec\x34\x6e\x4e\xb1\x33\x76\x4f\x5d\x58\x9e\x45\x86\x10\xf0\x17\xd2\x04\xa6\x18\x24\x83\x55\x38\xcd\x2f\x58\xcd\xd3\x86\x06\xda\x46\xcb\xd8\x74\x35\x44\x09\xde\x15\xbd\x1f\xf0\x63\x61\xc2\x22\xed\x1f\x1a\x2e\x43\x9c\x88\x86\xfe\xae\x7d\xe1\xaa\xff\x45\x60\x88\x91\x56\xc5\xa7\xb8\xa8\x12\xac\xef\xf9\x9e\x1b\x26\xb1\x1c\x17\x0b\xc4\x5b\x83\x72\x28\x57\x57\xb7\x62\xc5\xf1\x0d\x50\x5a\xf0\xed\xdb\x16\x4b\xaa\x21\x94\xef\xee\x71\xdb\xc9\x53\x56\x47\xfe\xa7\x72\x54\x5f\x57\x3a\x3c\x93\xa3\x3c\xb5\x35\xbc\xc5\x4c\x19\x65\x8b\x73\x68\xd7\x32\x2c\xeb\xfc\xed\x45\x39\x85\xa1\x1c\x9b\xed\x13\x40\x8c\x28\x54\xd3\xde\x39\x6b\xf0\xbc\x32\xca\x59\xb0\xa2\x16\xb4\xd5\x69\x71\xce\xa2\x17\xde\xe6\xb5\x58\xc6\x33\xc3\x8d\x51\x86\x28\x6c\x7a\x3c\x1a\x53\x3e\x42\x33\xb8\xc8\xcd\x7c\x9f\x7d\x86\x2b\x92\x10\xe7\x91\xeb\x1b\xe1\xe3\x9f\x3f\xf3\xd6\x3f\x57\xc2\x07\xdb\xd7\xa9\x88\x66\x7e\xcd\xe5\xcf\xb2\xac\xfa\x94\xb0\x1e\xf4\xc8\xc1\x67\xa5\x4b\x07\xf6\xed\x99\x14\xe6\x15\x2e\x74\x1a\x57\x95\x30\x8d\x07\xe1\xa0\x7c\x77\x8f\x5c\x9a\x77\xa0\x47\x24\x00\xb0\x14\xdd\x3b\x28\xc0\xd7\x21\x12\x46\x54\xc6\x09\x66\xdc\x0d\x83\x50\x62\xf3\x72\x1c\xc0\xf0\xf4\x61\x3c\x1d\x17\x7a\x91\x75\x72\xc3\xb4\x08\x4d\xd5\xbd\x3a\xb1\xa2\x4c\x37\xa6\x9a\x76\xb1\xd7\x86\x25\x1a\x27\x56\xbd\xee\xba\x2a\xa7\x5d\xea\x70\xaa\x1b\xb6\xf5\xe4\xb7\x2e\xb3\xaa\x4b\xc3\x5d\x8c\x77\x69\x17\xeb\x8d\xee\x1e\x2b\xfa\x11\xc2\x0a\x6a\x69\xba\x35\x8a\xdd\xce\x8a\xa7\xa1\xd8\x39\xc2\x00\x5b\x85\x14\xc5\xad\x43\x04\x83\xab\xe7\x5a\x39\xc8\x97\xd7\x77\x37\xff\xec\xbf\xbb\xba\xbe\x6b\xcf\x73\x7b\x9e\xdb\xf3\x5c\xe3\x3c\x03\x9f\xd4\x3e\xcb\x41\xff\x59\xa4\x12\xce\x14\x97\x2b\x65\x54\xbf\xa0\xe0\xac\x4b\x3e\xf9\x81\x1a\x81\x2f\x93\xa0\x50\x16\x31\x72\xe3\x22\x2f\xaa\xbb\xc1\x76\xdb\x3a\x7f\xf6\xd1\x59\x1f\x31\xb6\xaa\xc1\x98\x95\xeb\x52\x21\x80\x45\xbb\x56\x6e\x6f\x77\xfe\xaf\xab\x8b\xcb\xeb\xbb\xab\xaf\xaf\x2e\x6f\x3e\x6a\xb0\x41\xcd\xe2\x6e\x55\x6e\xbc\x23\x97\xcc\x24\x4c\x98\xc8\x55\x32\x0d\xf5\x61\x17\x13\x81\xf9\x78\x35\x6e\xd4\xb3\x69\x28\x81\xbb\xf0\xb1\x96\xd9\x36\xcb\x6c\xab\xb1\x17\x35\xea\x7a\x34\x85\xbe\x5f\x4b\x91\x36\x84\xc2\xb7\x56\x65\xf7\x26\xef\x45\xf8\x74\xe8\x4a\x00\x54\x58\x8f\x13\x1e\x8b\x7a\x03\x46\x0a\x4d\x33\x5d\xa3\xf8\x7f\x23\xe5\x3c\x9b\xa9\x7c\x69\xe3\x14\xde\xd2\xec\x3b\x98\xde\x40\xcd\xf2\x21\x33\xae\x86\x04\x22\xc3\xe8\xc8\x3d\x4c\xad\x07\xf2\xdc\xbf\xac\x4e\x99\x93\xbd\xac\x86\x7a\x0f\x75\x2a\xd5\x36\x59\xc6\xf4\x1e\x6a\x04\x2e\xfa\x31\x57\xd0\xd3\x6c\x21\xca\x69\x66\x4f\xeb\xed\x1e\x69\xb6\x84\xe9\x13\x94\x6d\x3d\x2c\xb3\x7b\x47\x67\xf5\xd6\xd5\x15\xc4\xc4\x70\x2e\x78\x38\x71\x41\x5b\x5d\xa3\xb1\x76\x2d\xd6\xaa\x13\x8c\x4c\x39\xf9\x2d\xfe\x87\xdc\xbd\xbb\x78\x77\x4a\xce\xe2\xd8\x05\x0f\xe7\x0a\x86\x79\x62\xc3\x80\x55\x8f\xd0\x8c\xfd\x00\x52\x61\xf7\xb4\x7b\xc6\xe3\x0e\xc9\x59\xfc\x55\x9d\xa2\x4b\x76\x34\xb8\x0b\xc2\x3b\x6c\x9a\xdd\x89\x5b\xe7\x8f\x2b\xf3\xae\x40\x44\x88\xcd\x0c\x44\xdc\xf4\xf5\x57\x9c\x90\xd1\x10\x68\xea\x36\x8a\x23\x76\x0b\x9b\xa5\xab\x87\x05\x61\xb5\x71\xe2\xa1\x40\x55\x7c\x4a\x54\x8e\x85\x62\x54\xe8\xee\x86\xfd\x52\x3b\xd5\x3f\x55\x46\x23\xe8\x90\x9f\xc3\x8f\xd8\x8f\x5d\xfd\x78\x78\xf8\x97\xef\x2e\xff\xf9\xb7\xc3\xc3\x9f\x7e\x2e\x5f\x45\x56\x88\x5a\xf3\xcc\x2d\xe8\xdf\xe1\x22\x86\x6b\x7c\x07\xfe\xe9\xc4\xb5\xb3\x28\x12\x39\xd7\xee\x02\x66\xf5\xf6\xc6\x42\xe9\xab\x7e\xf8\x33\x13\xf1\xec\x5f\xaa\x56\x25\xb1\xbd\x64\x0c\xb8\x45\x35\xb2\x53\xec\x68\x8e\x3d\x14\xb4\xa4\xe1\xa3\xea\x66\x0d\x9d\x2b\xa2\x31\xa4\xb6\x96\xd1\xd7\x1e\x04\xd8\x81\xd6\x97\x0f\xe0\x98\x73\x6d\x24\xd3\x6a\x59\xb9\x83\xc9\xeb\x5a\xad\xba\xed\x68\x90\xb4\x85\x1d\x6c\x18\x60\x08\x11\x07\x2d\x7b\x90\x03\x83\xf5\x5a\x4a\xe1\x8d\x3d\xeb\x5f\x91\x89\x85\xf0\xde\x00\xc7\x7b\xc1\xbe\x7e\x52\x1a\x57\xf6\xb5\x55\x34\xc4\x53\xdb\xb0\xd5\x5f\x77\x79\xf6\x2a\x94\xbe\x02\xa3\xd8\x1c\xd9\x1f\x7b\x51\x96\x77\xdc\x0d\xbd\x14\x52\x21\xa7\xe1\xcf\xe0\xe3\xeb\x2a\x2d\x24\x1d\x61\x5e\x86\x7d\xdc\x3e\x16\xfe\xb2\x0f\x56\x5e\x30\xff\xb4\x55\x85\xa3\x5c\x1a\xa1\x21\x99\x7a\x8a\xbc\x63\xbd\x88\x62\xec\x21\x6d\xf3\xa0\xdf\x13\xd2\x16\x30\xa3\x6e\x5b\x56\x3b\xaa\x08\x59\x38\xea\x51\xe0\x0c\x50\x44\x7d\xd2\xe5\x9d\x76\x82\x18\x64\xad\x01\x7c\x62\x34\xcb\x9d\x2b\x67\x15\xa3\x41\x6a\x16\xb3\x09\x53\xa2\x46\xf6\x49\x98\x68\x79\x48\xbd\x2b\x7d\x61\x03\x87\x82\xd9\xec\x31\xc3\x62\x41\xe1\xbc\xce\x90\xfd\xd7\x75\xfa\x05\xd9\x91\x51\xad\x41\xf2\x53\xf2\xdf\x47\xef\x7f\xff\x6b\xf7\xf8\xab\xa3\xa3\x1f\x5f\x75\xff\xfc\xd3\xef\x8f\xde\xf7\xf0\x1f\xbf\x3b\xfe\xea\xf8\x57\xff\xc7\xef\x8f\x8f\x8f\x8e\x7e\xfc\xee\xed\x37\x77\xfd\xcb\x9f\xd8\xf1\xaf\x3f\xf2\x3c\xbd\xb7\x7f\xfd\x7a\xf4\x23\x5c\xfe\xb4\xe1\x24\xc7\xc7\x5f\x7d\x56\x7b\xe9\x0d\xd4\xee\xb4\xa3\xc9\x0a\x9e\xd5\x19\x1b\x41\xbf\x27\x2c\x5b\x6f\x87\x47\xaf\xa6\xcf\xbf\x8f\x1e\x3e\x2d\x18\x52\x60\xd7\x7b\x73\xc0\x15\x44\x12\xf4\x87\xb0\xe4\xd8\x37\x95\x2a\x08\x1c\x2a\x12\x54\x8b\x97\xc6\xe7\x3e\x05\xe3\x4e\x68\x38\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\x15\x8e\xee\x0d\xec\x42\xef\xef\xbb\x87\x5a\x2d\x50\xed\x68\x8d\x41\xad\x31\x68\xc9\x58\x6b\x0c\xba\xb5\x78\xb8\xb7\x96\x20\xe0\x93\x5d\x5d\x18\x0b\x3d\xe8\x5e\xd7\x29\x97\x50\xdb\xcc\xa1\xd6\xf3\x47\xbd\xe8\xd4\x58\x84\xd0\x58\x86\x96\x2e\xf6\x61\x92\x33\xec\xc8\x6c\x0f\x3e\x4e\x50\xa4\x5d\x58\xd5\xc6\x55\xf8\x83\x89\x59\x42\x28\x11\x5d\x29\x06\x89\x81\x8e\x18\x7a\xfa\x0f\x1b\x09\x7a\x6f\x83\x43\x8d\x92\xc6\x78\x51\x46\x33\x08\x87\x45\xed\x65\xaa\x94\x88\x6c\x50\x6b\x48\x02\xc0\xca\x6e\x6e\xd9\xb8\x1a\x6c\x03\x9f\x49\x88\x20\x06\x1e\x81\xab\xcb\x5c\xe9\x4a\x49\x39\xb9\xe4\x13\x5f\x9b\x3a\xf6\x29\x25\xb8\x92\xc5\x73\xbc\xac\x00\x04\x83\x88\xce\x09\x56\x8a\x43\x40\xaa\x5f\x44\xb3\x62\x28\x86\x18\x16\x56\xd6\xdd\x1a\xd7\xd5\xe6\xe2\xf5\x79\x66\xf0\x6c\xd5\x12\x86\xe6\x98\x65\x61\x7e\xae\x32\xc9\x97\xe0\x0c\xac\xcf\x3e\x3f\x39\xd6\xd9\x10\xdb\x6c\x86\x65\x6e\xe1\x3b\x69\x92\x4d\x36\xe1\x2c\xc9\x24\x0c\xd9\x63\x43\xe7\xf4\x8c\x17\x96\x18\x16\x03\xd7\x6c\xc8\x6c\x8a\x49\x26\x21\x03\x6e\xb3\x04\x68\x34\x46\xda\xef\x38\x65\xe1\x9c\xde\xc7\x60\x1e\x2b\x70\x37\x4b\xca\x6e\x17\x09\xfb\x2d\x1d\x23\x2d\x1d\xdb\x79\x7c\x20\x3a\xe6\x30\x77\x7f\x88\x18\x46\x9e\xd7\x8f\x79\x3f\xaf\xd6\x5a\x41\x44\xde\x1a\xd1\x8a\xb4\xa3\x13\x9c\x65\x27\x03\x74\x2d\x7c\xc0\xd7\xf6\xf3\x24\x69\xa8\x3e\xf5\xe1\x15\x42\x23\xcb\x93\xc4\xa5\xe5\xf6\xc8\x3b\x8e\x47\xf2\x0c\xfb\x20\x74\xc8\x35\x4c\x40\x76\xc8\xd5\xf0\x5a\xe8\xbe\x95\x6d\xab\xe1\x6c\xf6\x46\xc2\x86\xe4\xd4\x68\x4d\x4a\x13\x6d\x6b\xd1\x97\x2a\xe7\x08\x59\x99\xa0\x28\xca\x55\x23\x0c\x7d\xf9\xb6\xfc\xd6\x27\x4c\x76\x3f\xd2\x36\x85\x66\x1f\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xeb\xf5\x19\x16\xa2\xc8\x84\xd2\xb7\x46\x8b\x6d\xa6\x11\x4c\xdf\x4f\x87\xbd\x15\x68\x92\x40\x5c\xe9\x04\x64\x3b\x58\xd0\xaa\x16\x8d\xf9\xb8\xa1\xa1\x02\x90\x31\xe5\x71\x02\x12\x8b\xa2\xab\xd9\xca\x4f\xac\xe8\x02\x10\xfa\x36\xf8\x04\x4d\x1a\x45\x42\xc6\xae\x03\xab\x4b\x94\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\xa5\x75\xb1\xe0\xb2\x2a\x35\x7f\x18\x0b\x71\x4f\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\xe8\x3d\x13\x50\xb4\x6b\x66\x57\x27\xa5\xb6\x34\xf8\x43\xbd\xae\x34\xb5\x84\x95\x26\x44\x15\x78\x84\xa8\xb1\xbe\x75\x97\x8f\x10\x95\x1a\x2f\x9a\x2d\x71\x9d\x17\xb5\x40\xdb\x46\xfd\x7e\xba\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\xa1\x35\x9c\xd3\xd7\x95\x76\xaf\xc0\x12\xfd\x36\xab\x18\x33\xcf\x7c\xa9\xe9\xca\x61\xb0\x47\x6f\xae\x3a\x5b\x08\x36\xf6\x73\x61\xee\xb3\x10\x9a\x1c\x1d\x9e\x1c\x1e\xcf\xd9\xe8\x66\x8a\x13\xdf\x95\x9e\x64\x58\x8d\x2f\xc3\xd2\x76\x10\x1d\xc6\x1d\xc2\xb4\x27\xb6\xb6\x28\x00\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\x11\xe0\xe8\xf0\xd7\xc3\x0e\x01\x1d\x1d\x93\x07\xc1\x0f\x35\x2e\x1f\xcb\x67\xe4\xaa\x34\xd1\x54\xe4\xd8\xa5\xce\x82\x20\xd4\xc2\x30\x14\x8b\x88\xdc\xb6\xb4\x19\x53\xed\xd3\xf0\x2e\x1f\x99\xf6\x6d\x1c\xc4\x90\xbc\xb2\x1d\x75\x80\x3a\x2b\x61\xc2\x26\x70\x32\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\x53\x34\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\x6f\x76\xef\xd4\x4a\xe6\x9a\x18\xdf\xdd\xf5\xbf\xa9\xf4\x6a\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x75\x25\xf6\x80\x76\x34\xe3\xd0\xab\xd5\xb4\x95\x34\x48\xc2\xea\x36\x6f\x25\xf3\x4d\xa9\xb7\xeb\xda\x4a\xfe\x29\x72\xec\x36\x47\x07\xc9\x94\x3c\x50\xae\x7d\x2a\xde\x81\x99\xea\xc0\x90\x27\x83\x0d\xdf\x02\x8d\x41\x2a\xa4\x1e\x40\x77\xae\x9f\xe5\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\x8b\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x67\x3e\x2a\x83\xad\xdc\x8d\x84\x71\x0b\x2c\xdb\x47\xb0\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\xdd\xb4\x91\x4c\xd8\x7a\xad\x7b\xc3\x65\xea\xb6\x16\x27\x8b\x73\x89\x25\xe1\xa1\x13\xec\xf3\x68\x2f\x4e\x9a\x0b\x53\x6c\x3a\x48\xb1\xd1\x10\xc5\x27\x0d\x50\xc4\xb4\x88\xda\x54\xa4\x6a\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\xad\xa2\x6a\x0e\x35\x47\x6d\x2f\xce\x98\x8e\xb2\x5b\x11\xdd\x37\xa8\xd7\x5c\x40\x26\x21\xb2\x76\xb2\xbb\xf3\xbe\x9d\xdd\xe8\x97\xd7\xef\xee\x8a\x70\x7c\x8c\x59\x29\x0c\x97\xdf\x3a\x4b\x9a\xd1\x49\xef\x21\xd3\x41\x75\x1f\xd0\xe8\xfe\x81\xca\x18\x2d\x5b\x54\xb3\x01\x4b\x98\x9e\xa2\x72\x2e\x01\x63\xfd\xb9\xb0\x41\x71\xb6\x48\xa2\xf0\xad\x4e\x43\x1f\xee\x60\xc3\x42\x0b\x99\x8b\x9e\x19\x52\x66\xf4\xf1\xd0\xcf\xd6\x46\xcd\x44\x59\x30\xe9\x95\x2d\xd3\xad\xf2\xe5\xc7\xde\x2a\x5f\xa5\x5e\xad\xdb\xea\x61\x75\x63\xf7\xf6\x98\xd5\x39\x16\x27\x43\x2b\xb2\x96\xd5\x35\x34\xdf\xfe\xb2\xba\x4c\xc2\xad\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x8f\x38\x07\x57\x2e\xf3\xac\x7f\x15\xac\x5a\xa2\xe2\xd8\xb0\x51\x8b\xbe\x46\x66\xc2\x26\xc0\x41\xa9\x13\x74\x87\xe4\x99\x6b\xc7\xef\xba\xce\x76\xcc\xd7\x41\x8a\xab\xeb\x14\x99\x00\xae\xe7\x2d\xfe\x08\x3a\xb2\x96\xdb\x12\x21\xc7\x76\x5a\x6e\xf9\xb3\x6e\x94\x48\x52\x35\xb6\xfd\x60\xe1\x91\x69\xd7\xd3\xb8\x6f\x6b\xe8\x96\xdb\xd2\x8e\x24\x8d\x80\x64\x20\x99\x30\xcc\x28\xe7\x3a\x16\x0f\x9c\x0c\x60\xc4\xb8\xf2\xa0\xc0\x2a\x98\x0e\x66\xe8\x8f\x61\x2a\x94\x4c\xeb\x91\x9b\x4a\x41\x10\x97\xaa\x13\x89\xe2\x68\xba\x35\xcf\x7a\x92\x90\x63\x21\x9c\x6c\x77\x95\x00\xe1\x72\xc3\x99\x75\x4b\x3e\xca\x39\xbe\x39\x86\x84\x4e\x6d\x44\x26\xf6\x8a\x66\xbf\x80\x54\xc7\x0d\x78\x9c\x6c\xcb\x24\x7f\x6d\xe9\x3a\xb0\xfc\x28\x8d\xc6\xf5\x5c\xb8\xad\x8b\x6a\xc3\xd1\xba\xa8\xea\x4c\xd2\xba\xa8\x5a\x17\xd5\x9a\xd1\xba\xa8\x5a\x17\xd5\xcc\xd8\x5b\x2d\xa9\x75\x51\xed\x3c\x5a\x17\xd5\xea\xd1\xba\xa8\x36\x18\xad\x8b\x6a\xc3\xd1\xba\xa8\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\x9f\x90\xdd\xce\x8f\xd6\x45\x35\x37\x49\xeb\xa2\x6a\x5d\x54\x1b\x8f\xbd\x55\xbe\x5a\x17\x95\x1d\xad\x8b\xaa\x3a\x3e\x2d\x56\xe7\x1d\x3c\x7d\xa3\xea\xd5\x6f\xc4\x8b\x0a\xa3\xa3\xb1\x2f\x32\xed\xa9\x8e\xfd\xff\xc3\xd8\xfe\xf7\xc4\x51\xd2\x80\xbd\xbf\xb5\xf5\xbf\x38\x5b\x7f\x33\x76\xb2\x06\x6c\x64\xb5\x69\xb2\x73\x81\xdf\x8d\x25\xa8\xb1\x48\x76\x46\xf4\x0a\x92\xbf\x65\x9c\xa5\x79\x6a\x70\x4e\x19\x7c\x66\x93\xe0\x6b\x57\x45\x77\x62\x74\xc1\x5b\x73\x9d\xb9\x91\xc5\x80\x95\x37\x29\x4b\xcc\x36\x62\xa2\xe4\x98\x4e\x0c\xae\xab\x3c\x8a\x00\xb0\xaf\x57\x59\x95\xf8\xa2\x17\xde\x14\xfa\x38\xbc\xae\x47\x6f\xea\x71\x4b\x5b\x1b\x13\x67\xf9\xe2\xf3\x9d\xe6\x18\xc9\xac\x19\xba\xfc\xcd\x4d\xff\xbc\x44\x97\x29\xf7\x64\x99\xf1\x89\x48\x26\xb6\xfb\x2b\xde\x64\xa4\x22\xd7\x36\x16\xbb\x95\x0e\x40\xd3\x92\x12\xe1\xe4\x6f\x65\xdb\x14\x9b\xe7\xcc\x53\x21\xa5\xbd\x6f\x03\x29\x80\xea\x5c\x02\x19\x51\xfd\x31\x09\x7e\x7d\x5d\xa1\x96\x9e\xd0\x04\xbf\xa9\x2b\x0a\x57\xe5\x18\x23\xf0\x56\xcd\x3d\x23\xc4\x0b\x5b\xce\x7d\x63\x81\xb7\x36\xa5\xac\x2f\x84\xd6\x3f\x5a\x04\xeb\xad\xe0\x87\x37\x06\xe0\x03\xd7\x67\xdb\xb3\xf3\xb2\xb6\xe1\x5b\x1c\x69\x41\xb2\x84\x16\x4d\x8a\x70\x07\xbe\x45\x1e\x74\x3e\x86\xe8\xfe\xc6\xb9\x3c\x8f\x14\x40\x88\x57\x19\x31\x3d\xce\x07\xbd\x48\xa4\x27\x86\x24\xd8\xff\x1b\x24\x62\x70\x92\x52\xa5\x41\x9e\xc4\x22\x72\x2c\xae\x1b\x99\x59\x18\x1f\xf5\xd2\xf8\x18\xdb\xe0\x5e\x55\x9b\x22\x96\x4a\x21\x98\xf7\x3b\x65\x90\x0c\xc0\x50\x57\x81\x0a\x7f\xa9\x9e\x9a\x59\xde\xd6\x8d\x6b\xcb\xa3\x36\x4b\xaa\xe9\x6e\xfe\xf0\xae\xe6\x96\x72\x91\x06\x2c\x1b\xcf\xcd\xa5\xdc\x58\x68\x45\x03\xae\xe4\x3d\x72\x23\xef\x8d\x68\xbc\x2f\xae\xe3\x3d\x2c\x7d\xdc\x80\xa7\xb3\x09\x57\x71\x73\x6e\xe2\x27\xa8\x10\xfc\x34\xee\xe1\x06\x6d\x68\x0d\xb9\x85\x3f\x84\x4b\xb8\x91\xaf\xae\xeb\x0a\xfe\x70\x6e\xe0\x66\x3e\xb7\x49\x45\xe0\xb9\xba\x7e\x1b\xb0\x85\x37\x69\x07\x6f\xcc\x06\xfe\x64\xae\xde\xfa\x6e\xde\x3d\x70\xf1\xd6\x06\x32\xe3\x4c\x33\x9a\x5c\x40\x42\xa7\xb7\x10\x09\x1e\xef\xcc\x61\x66\x4a\x46\x86\xf3\xa3\xec\xb4\xce\x4e\x55\xcd\x68\x18\x53\x57\x19\xdb\x68\x54\x36\x83\xc3\xfb\x27\x9c\x40\x81\xae\x05\xbb\xca\x5d\x8a\xce\x3d\x08\x79\x9f\x08\x1a\xab\x93\x4c\xd8\xff\x2b\xf2\x15\x4a\x89\x0a\xf6\x5d\xf5\x32\x15\x3e\xb6\x41\xcc\xa6\x77\x34\xb9\x89\xdf\x8a\x07\x22\x86\x1a\x38\x39\x62\xdc\xef\xe3\x71\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\xd7\xaf\xfc\xcd\x2f\xcf\xec\x88\x06\x56\xa5\x9e\xde\x0a\xec\x5e\xb4\xde\x0c\xec\x6e\x1c\xe6\x49\xd5\x14\x6c\xcd\xc3\x55\x7a\xf3\xba\xa8\xed\xfb\x1a\xe7\x0d\xa7\x8d\xf2\x98\xb8\x94\xaf\x97\xb7\x69\xb5\x03\x58\xaa\xa2\x5f\x08\x58\x59\x67\x35\xbe\x3b\xef\x5b\xa3\x71\x6b\x2e\xd9\x17\x73\xc9\x47\x0a\x02\xd9\x43\x41\xf7\x99\x06\x7e\xb4\x82\xee\x16\xa3\x94\x04\xfa\x8d\xa4\x11\xf4\x1b\x97\x11\xfc\x71\x22\x71\x2e\xa9\x23\x80\x41\xe4\xf3\x87\x87\x03\xc4\xf6\x34\x85\xc4\x59\x4c\x49\x1d\xe6\x49\x32\x25\x79\x26\x78\x35\xcd\xd8\xfa\xda\x67\xb3\x56\xd1\x24\xbf\xe0\x2d\x85\x60\x99\x49\xe1\x78\xa6\xcc\x39\x37\x34\xb8\x68\xd0\x85\x82\x24\x56\x35\xa6\x95\xdc\x58\xc5\x46\x66\xf9\x86\xff\x61\xda\x6c\x11\xe9\x57\x99\xd0\x3c\x3d\x14\x32\x62\x83\x64\x4a\xc6\x34\x09\xdd\x58\x28\xb9\x67\x49\xe2\xa6\xe9\x91\x5b\xd0\xd6\xa5\x60\x79\x67\x22\xf8\x08\x17\x47\xb9\xef\x02\x08\x91\x79\x36\x4a\x80\xf2\x3c\xb3\xef\x33\x9c\x78\x2a\x72\xe9\xdf\xd7\x0b\x8e\x89\xa2\xeb\x3e\x4b\x3a\xa5\x5e\x63\x2b\x37\x36\xf4\xa7\xc9\x95\x11\x00\xde\xf9\x2a\xce\x9d\xf2\x9c\x62\x02\x52\xb2\xd8\xd9\xf9\xed\x6f\x99\x14\x13\x16\x5b\xef\x86\x07\x1b\x76\x35\xb6\xdd\x64\xc2\x79\xe6\x82\x77\x39\x8c\x28\x0a\x2a\xee\x14\xd9\x3d\xb3\xf3\xd8\x08\x02\x1e\x63\x7f\x19\x23\xe1\x8b\xac\x92\xb7\x3e\x61\xb6\x33\x6e\x09\x72\xe4\x88\x0b\x22\x30\xf0\x33\xe7\x4c\xdb\x6e\xeb\xe3\x5c\x93\x58\x3c\xf0\xe3\xad\xbc\xae\xe8\x68\xbd\x5b\x08\xa0\xaa\xfb\x75\x91\x9c\x63\xbf\x77\x35\x78\x99\x72\xa6\xcf\x21\xc9\xb9\x82\x9a\xec\xbd\x31\xe1\xe8\xcb\x3f\xec\x46\x23\x58\x0a\x22\xd7\x1f\x44\xfb\x7b\x18\xb3\x68\x5c\x16\x66\x59\x0a\x8a\x88\x7c\x46\x2d\x7e\xed\x1e\x5b\xbc\x43\xad\x0a\xb8\x68\xec\x6a\xd8\x5d\x60\xfd\x72\x0d\x4b\xe7\xe3\xf7\x4a\x0d\x99\x31\x34\xfb\xe2\xfa\xf6\x5f\x6f\xce\xfe\x7e\xf9\xc6\x9d\x4f\x5e\x66\xfa\x39\x67\xff\xc9\x81\xd0\x54\x18\x59\x38\x29\x87\x01\x76\x50\xa3\x2f\xfd\x80\x27\xb9\xd9\x80\xc1\x1d\x19\x32\x76\x8f\xaf\x1f\x16\x89\x3d\xe8\x9f\x3e\x2a\xf2\x63\x77\xd5\x2a\x82\x5b\x8c\xdc\x58\xea\xaa\x45\x09\x07\x6d\x4e\x9e\x95\x28\x6d\x97\x35\xc6\x47\x49\x59\x98\xdc\x8d\x5c\xd5\xd5\x89\xea\x6a\x44\xdd\xe2\x0b\xfa\xbb\x2a\x46\x8d\x74\xf7\x2a\xd6\xd0\x50\x4f\x9c\x82\x6a\x7b\x35\xc0\x36\x2d\xf6\x6a\x80\x15\x3d\xae\xfa\x84\xc6\xb1\x44\x31\x05\x4f\x7d\x3a\xd3\x1b\x33\x2b\x62\x69\x3a\xe4\x15\xf9\x0b\x79\x24\x7f\x41\xb5\xe0\xcb\xba\x1d\x84\xea\x0a\xec\x4d\x84\xc6\x18\x6d\xf4\xaa\xdf\x10\xc4\xff\x31\xa6\x1a\x67\x34\x50\xd5\x82\x0c\x98\x13\x43\xe1\x51\x83\x34\x62\x91\xdb\x89\x8f\xda\x7b\xc9\x2c\xf0\x03\xa2\x99\x35\x93\x5f\x0d\xab\xe1\x38\xdb\x21\x9a\x79\xdc\xe8\xf7\xd7\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3f\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\xb9\xa4\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xfe\xa2\xdf\x21\x77\xe7\x7d\x6c\xea\x73\x7b\x7e\xd7\xaf\x4a\xd8\x07\x77\xe7\xfd\x83\x8f\x0a\x0a\xe2\xcd\x6c\x68\x50\xdd\x61\x92\x8a\xc1\x24\x61\x4a\x77\x53\x9a\x75\xef\x61\xba\x23\x4f\x6d\x82\xaf\x77\xc3\x0e\x37\xf2\x41\x16\xcc\x29\xcd\xb6\x9e\x4d\x02\x8d\x59\x9b\xe6\xb3\xf9\x68\xd3\x7c\x36\x1c\x6d\x9a\x4f\x9b\xe6\x33\x3f\xf6\x26\x96\xb1\x4d\xf3\x79\x59\xae\xdb\x36\xcd\xe7\x13\xf7\xfe\xb6\x69\x3e\x8b\x47\x9b\xe6\xd3\xa6\xf9\x6c\x36\xda\x34\x9f\xed\xc7\xde\xc5\xad\xb4\x69\x3e\x5b\x8d\x36\xcd\x67\x7e\xb4\x69\x3e\x4b\x46\x9b\xe6\xb3\x64\xb4\x69\x3e\x6d\x9a\x4f\x9b\xe6\xd3\x46\x3f\xae\x9d\x6b\x3f\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x22\x62\xbc\x48\x9b\xe6\xb3\xd1\x68\xd3\x7c\xda\x34\x9f\x5d\x46\x9b\xe6\xf3\x52\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xe9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\xbc\x04\x15\xd0\xf7\x5c\xad\x9f\xa3\x72\xe3\x67\xda\x3c\xac\x8f\x5c\x2e\xf8\x15\x2d\x21\x2a\x33\x93\xc8\x62\xca\x44\x02\x8d\xa7\x38\x25\xf6\x79\x28\x09\x59\xcf\x30\x3a\x30\x4a\x28\xdb\xdd\xfd\x52\xf5\x90\x9f\xe3\x5c\x24\x61\x4a\x17\x3e\x72\x0c\xdb\x0a\xe0\xeb\x04\xff\xb3\xe1\x7f\x86\x52\xf9\x4b\xf6\xe1\x8e\x0d\xfe\x32\x20\x47\x0a\x85\x74\xfc\xff\xcf\xde\xfb\x78\xb7\x8d\x1b\xff\xa2\xff\x0a\x8e\xdb\x73\x6d\x75\x25\x39\xd9\x6d\x7b\xdb\xdc\xbe\xee\x71\x63\x67\xd7\x6f\x13\xc7\x37\x76\x76\x6f\xdf\x66\xbf\x5b\x88\x84\x24\x7c\x4d\x02\x2c\x01\xca\x51\x5f\xde\xff\xfe\x0e\x66\x06\x20\x48\xc9\x4e\x4c\x32\xb1\x93\x15\x7b\x4e\x37\x96\x28\x10\x1c\x00\xf3\x7b\x3e\x23\x4d\xac\xc0\xbd\x51\x35\x2f\x55\x8c\x67\xc5\xf2\x76\x6e\xea\x26\x72\xbc\x56\x3c\x97\x89\xdf\x18\x47\xb8\x76\x4e\x7a\x36\xf9\xa9\x1f\x1b\xc7\x73\x0f\xc9\xf3\xca\xf2\x59\x26\x3a\xc7\xc9\xfb\x07\xc9\x7a\x06\xc8\xb6\x1e\x0d\xa0\x36\x26\x92\x0b\xe5\xb6\xb5\x56\x82\x09\x65\xcb\xb5\x5b\x98\x73\x9d\x5e\xb8\xb5\x69\xdc\xdd\x3b\xbf\xbc\x67\x5c\x6c\x88\x98\x58\xcf\x78\xd8\x30\x51\xac\xfe\x11\xac\x4d\x87\x7f\x54\xf2\x11\x27\xa7\x34\x56\xd5\x31\xa8\x2d\x47\xce\x5b\x4e\xe7\x3a\x75\x7a\x23\xb4\x9a\x8e\x8f\x00\xea\x60\xa7\x6e\xf8\x2b\x50\xb6\xb8\xad\xfb\x63\xf3\x15\x97\x99\x3b\x1f\x75\xc2\x68\xcf\x2a\x38\x7f\x0d\x60\x95\x0c\x9d\x47\xcf\xfa\xee\xa0\x21\xf3\xe0\x19\x74\xbc\xc8\x65\xb7\x9a\x4e\xb6\xa1\xf1\x3c\x87\xb1\xa2\x90\xb9\xdb\x13\x39\x7f\x0b\xda\x0b\xcf\x75\x85\x7d\xbb\x13\x9d\x17\x95\x6d\x0a\x44\x90\xad\x5d\x5a\x6e\xcf\xe5\x82\xcc\xa1\x43\xec\x0e\x3e\x09\xc3\x4e\xa2\x8e\xdc\xf7\xd8\x67\x9b\xa7\x3e\xe5\xf9\x7c\x88\x8c\x3f\x6e\xad\x28\xd5\x13\xf6\x5f\x07\x6f\xbe\x7a\x37\x19\x7d\x7b\x70\xf0\xf3\xa3\xc9\x5f\x7f\xf9\xea\xe0\xcd\x14\xfe\xf1\x87\xd1\xb7\xa3\x77\xfe\x8f\xaf\x46\xa3\x83\x83\x9f\x7f\x78\xf1\xdd\xe5\xf9\xc9\x2f\x72\xf4\xee\x67\x55\xe5\x57\xf8\xd7\xbb\x83\x9f\xc5\xc9\x2f\x1f\x38\xc8\x68\xf4\xed\xef\x3b\x4f\xb9\xb7\xb7\x62\x38\x5f\xc5\x40\x9e\x8a\x8f\xe2\xa7\xa0\x5c\x9b\x81\xce\x22\xe5\x09\x6e\x9c\x46\xb2\x25\x6e\x3b\x8d\x5e\x4a\x82\x05\x1e\xc6\x91\x86\xe9\x5c\x5a\x4b\x2a\x30\x8f\x2b\x0d\xa4\x6d\xf8\x0b\x89\x0f\xc8\x39\x72\x7a\x69\xe2\x2c\xfd\x28\xbf\x50\x7b\xa3\x1c\xbc\x6d\x8a\xc9\xbc\xc8\xa0\xbb\x3f\x9c\xe7\x89\x57\xf3\xc0\xee\xd9\xf1\x86\xf7\x5f\x3b\xde\xf0\x25\xf2\x06\x23\x92\xaa\x94\x76\xfd\x54\x2b\x2b\xde\x76\x72\x7e\xdf\xe4\xfd\xbf\x68\x0e\x4d\x86\x95\xa1\x84\x64\xfc\x8e\xe9\x02\x8b\x73\x6e\x84\xbd\x58\xea\x2a\x4b\xa1\xa8\xb4\x52\xe0\x0f\xc4\xfa\x64\x61\xd1\x59\x07\x5a\x20\xa8\x88\xed\xc7\x79\xf7\x1b\x0e\xfd\xef\x4a\xae\x78\x26\x94\x8d\x7e\x71\x0e\x0e\xa7\xf8\x47\x9d\x22\x10\xf7\x6c\x20\x83\x7a\x73\x5e\xca\x95\xcc\xc4\x42\x9c\x98\x84\x67\xc0\x95\x86\xe1\xf4\x47\x37\x8c\x0e\x4b\x54\xea\xcc\x38\x95\xdc\x71\x5a\xc6\xbd\x6f\x15\xaa\x80\x17\x5c\x2a\x96\x3b\xa6\x5a\xf8\x1f\x1b\x74\xd2\x3a\xe6\x5d\xf0\xd2\x2d\x45\x70\xc6\x82\x4d\x3b\xd3\x3a\xa3\x52\xb2\x6c\x5d\x8f\x2f\x51\xfb\x57\xfa\x57\x25\xae\x7f\x75\xa3\x19\x36\xcf\xf8\x22\xf8\x60\x8d\xb0\x1b\x61\x94\x7a\xe8\x1b\x5f\x00\xea\xb4\x2a\xc1\x78\x76\xcd\xd7\xa6\xf6\x48\xd7\x63\x48\xf3\x84\x3d\x1e\xc1\xc6\xe3\x86\x85\x31\x52\xf6\xf5\x08\xf2\x2a\x9e\x1e\x9d\xff\x7a\xf1\xcf\x8b\x5f\x8f\x8e\x5f\x9c\x9e\xb1\x33\x6d\x05\x8a\xa4\xc8\x3c\x49\xb8\x52\xda\xfa\x59\xc2\x33\xc0\xc2\xd1\x66\x0a\x26\x90\x34\xec\x5a\xaa\x54\x5f\x9b\xce\xc1\x2f\xdc\x7e\x8e\x78\x82\xab\x6e\x2e\x16\x5e\x70\x68\xdc\xd9\x43\x3e\x6c\xa4\xee\xc5\x83\x82\x04\x4e\xd3\xc3\xb4\xd4\x05\x12\xc1\x47\x0f\x62\x0f\xd7\x71\x2b\x28\xe8\x8b\x03\x60\x7d\xe7\xcd\x01\x17\x25\x57\xb6\x76\xa3\xd7\x6b\x46\x1d\x43\xa7\xbd\x97\xe3\xfe\xc4\xf6\x10\x46\x3c\x4f\x87\x2b\x13\x3d\x4a\x53\x91\x36\xc8\xff\xc5\xa5\x64\x3f\xf5\x2f\xb7\xae\x91\x74\xd8\xf9\xcb\x8b\xd3\xff\xd3\xda\xc7\xeb\xa2\x5f\x06\xea\x30\xd5\xfb\xa5\x2e\x06\x5b\xdd\x57\x22\xd7\xab\xdd\xfa\x3e\x94\xf5\x0d\xd2\x72\x98\xbc\xa7\x57\x95\x8a\x05\x9a\x8a\xc6\x67\xb9\x4e\xc5\x94\x9d\x87\x00\x6c\xf3\xdb\x18\x21\xac\x14\xcc\xdd\xa2\xac\xe4\x59\xb6\x8e\x95\x29\xab\xb1\xbc\xbb\x81\x1f\x13\x33\xf2\x39\xcf\xcc\x7d\x73\xe3\x3e\xb2\xd1\xe9\x11\x2f\x9c\x35\x3b\xc8\x72\x84\xd1\x58\x2a\x94\xb6\xa4\x0c\xbb\x59\x02\x26\x4f\xa9\x13\x86\xa6\x73\x94\xe5\xda\x90\x6f\x06\x83\xc0\x5e\x34\x4a\xe3\x89\x7d\x1e\x46\xc6\x08\x60\x65\x84\xd9\x2e\x1a\x6b\x63\xda\x8d\x5e\x0a\x9e\x6a\x95\xad\x21\xa5\x1d\x93\xd4\x72\x6e\xae\x44\x8a\x1f\x90\x6a\x16\x82\x16\xe0\x87\xf5\x8f\xba\x74\xf3\xf6\xf1\x09\x50\xc9\x30\x75\x0e\x22\x1b\xce\xc2\xbf\xd7\x55\xef\x71\x08\x1d\x51\x5e\xaa\x6c\xfd\x4a\x6b\xfb\x2c\xe0\x13\x0c\xb2\x03\x7e\x22\x6d\xb9\x19\x34\x02\x75\x92\xc3\x73\x27\xb0\x1a\x70\xa8\x62\x68\x84\xe3\x7a\xc5\x3f\xf7\x23\x55\x56\xea\xc8\x7c\x57\xea\xaa\xb3\x10\xdb\x50\x36\xbf\x3b\x3d\x06\x56\x54\x51\x0e\x88\xb2\xe5\xba\xd0\x12\x7d\x50\x37\x18\x06\xaf\x29\x8b\x25\x3e\x13\x75\xc2\x01\x7b\xc1\xd7\x8c\x67\x46\x7b\x5a\x52\xd4\xa9\x65\x2f\x32\x32\x46\xdd\xd7\x33\x6d\x97\x1b\x56\xa8\x3b\x50\x9b\xbf\x1b\x47\x29\x21\x35\xb0\xa3\x54\x1b\x3f\xb7\x10\xd2\x28\x4a\x91\x88\x54\xa8\xe4\xbe\x97\xfd\xbe\x33\x29\x60\xeb\x9c\x69\xe5\x0e\xe6\x20\x9b\xe7\x34\xa4\xd0\x10\x49\xe3\xad\x02\x31\x2b\xb2\xfe\x38\xa4\xe4\xc0\xb1\xac\x8c\x28\x31\x7f\xa8\xac\x04\xae\xe4\x0f\xd5\x4c\x64\x8e\xf2\xce\x24\x05\x84\x34\x6e\xd1\xf1\x20\x73\xbe\x10\x8c\xdb\xb0\xd3\xac\x66\x42\x99\xaa\xa4\x45\x94\x96\xa5\x5a\xd4\xb0\x26\xdc\xb0\xd7\xa7\xc7\xec\x11\x3b\x70\xcf\x1a\xc1\xfe\x99\x73\x99\x41\xb6\x8e\xe5\x65\x7b\x8e\x72\xee\x87\x80\x29\xc1\xe6\x65\xba\x44\x26\x31\x66\x4a\x33\x53\x25\x4b\x3f\x27\x67\xf7\x7a\xb3\x99\x32\xcc\x21\x30\xf2\x30\xf7\xfa\xfd\x72\xa8\xd7\x46\x94\x83\x31\xa8\xd7\x1d\x18\x54\xac\x46\xb9\x3d\xd7\xa4\x1e\x6e\xac\x5c\x58\x9e\x72\xcb\x89\x71\xf9\x1b\x1e\xec\x92\xfe\xb6\xd9\x97\x11\xcf\xa5\xaa\xde\xa2\x8b\x74\x38\x57\xcb\xc5\x09\x0c\x0b\x7b\x08\xa8\x0e\xab\xce\x8b\x22\x93\x75\xf6\x4f\x94\xa0\x72\xda\xd8\x2b\xe3\x1b\xd4\x44\xe0\x13\x3e\x89\xc8\x29\x27\x5c\xa5\x3a\xdf\x78\x18\x64\x2c\xf1\x64\x19\x3f\x60\xb7\xfb\x9a\xd7\x03\x71\x0a\x65\x62\x25\x7a\xe0\x1f\xb6\x76\xde\x73\x37\x9a\x23\x8e\xdf\x11\x30\x3c\xcb\xf8\x4c\x64\x94\x24\x05\x3b\xd0\x6c\xee\xc0\xfb\x4e\xf3\x2f\x75\x36\x5c\x5d\xe2\x2b\x9d\x09\xcc\x9b\xf5\x84\x70\xc3\x7f\x16\x74\x80\x41\x86\xa2\x03\x58\x83\x0d\x3a\x80\x5d\xfb\x39\xd0\xa1\xea\x21\xea\x59\x9b\x0e\x4e\x6f\x68\xd2\x01\x84\xf7\x43\xa7\x83\x11\x49\xa2\xf3\xe2\xbc\xd4\xce\xec\x1c\x4c\x36\xd1\xb0\x75\x9c\x0f\x1d\x1b\x5b\xd2\x26\x41\x16\x34\x6f\xe6\x65\x94\x31\xcf\x2d\x0a\x09\x9f\x36\xff\x3f\x22\x99\x05\xac\xa7\x2d\xc8\xfc\x28\x8d\x40\xa0\xfb\x25\x7d\xf1\x39\x8b\x83\x21\x8a\xce\x7a\x38\x3b\x07\x91\x46\x3a\xe1\x19\xe0\x5b\xf7\xdb\x72\xac\xbd\xed\xda\x03\x47\x75\x12\x10\xa3\x84\xcf\xa2\x2c\x5f\x0e\x8e\x16\xef\xc2\x54\x3a\x15\x51\xd4\x19\x93\x0b\x2f\x31\x9f\x1e\xee\xf3\x25\x1a\x4e\xaf\xa0\x2c\x10\x91\x36\x7e\x6d\x35\x41\x4b\xbe\x08\xa8\xd9\x6e\x82\x42\xa5\x52\x2d\xc0\xaf\x36\x66\xa5\xc8\xb0\xb8\x83\x98\xc0\x15\x5a\x90\xfb\x70\x24\xfc\xa0\xfe\x3c\xf8\x47\xfb\xa4\x60\x1a\x19\x3c\x45\x5e\xc3\x9a\x23\xbb\x95\x86\xed\x3d\xf7\x04\xe8\x01\x33\xfc\x10\x25\xcc\x1e\xbe\x61\x58\x4d\xf4\x74\x5e\x49\x95\x52\x1d\x44\x83\x58\xde\xce\x25\x3d\x18\x2a\x6c\x64\x1a\xf3\x96\x27\xec\x8d\x62\x81\x58\x6c\xd2\x79\x7b\xbc\x42\x95\xd9\xfb\xe8\x26\xb7\x3b\x5e\xc3\x43\xda\xc3\xbc\x56\xb0\xf6\xee\xb9\x13\x67\xb9\x6f\xde\xe7\xdf\xe5\x5e\x31\xd1\x88\xfb\x0d\x6d\xc5\xfc\x84\xc3\x7a\x95\x3e\x71\xdb\xda\x4a\xb5\x30\xb1\x25\xd3\x6c\x66\xb2\xdd\x94\xf1\x2b\x3c\x2f\x75\xee\x13\x87\xdb\xa6\x41\xb3\x7e\xeb\x73\x31\x43\x32\xa7\x4e\x7c\xe6\x46\xc8\x22\x37\xfc\x69\xe9\x28\x61\x25\xcf\x2e\x8a\xee\xd8\xcf\x6c\x03\x67\xf4\xc5\xc5\x51\x73\x68\x10\xd6\x94\x32\x2e\xe0\x7b\xc6\xd3\x5c\x1a\x03\x8e\x30\x31\x5b\x6a\x7d\xc5\x0e\xb6\x00\x1d\x46\x59\x56\x46\x2e\xcc\x21\xed\xf9\x89\x9b\xfd\x88\x49\x95\x85\x4c\x26\xb0\x83\x95\x0d\x59\xea\xf0\x90\x24\xcc\x02\xd6\x90\xb0\xf5\x29\x59\x61\x73\x9a\x88\xa6\xef\x76\xc1\xbd\x33\xec\xcd\xe5\x39\xeb\x59\x0d\xf0\x9e\x25\x3a\xa3\xbd\xdd\x86\xac\xdc\x4a\x47\xd4\x1e\xef\x9d\x48\xa4\x5c\x24\xc2\x0c\x87\x94\xf7\x7d\x3d\x26\x4b\x05\x96\x47\x0a\xc8\x7e\xe2\x37\xa6\xc3\x81\x5f\x7a\x1f\xaa\xec\xe9\xa7\xfb\xb1\x46\xdd\xac\x14\x82\x42\xa4\x09\x1a\xe9\x8e\xa3\x01\x0b\xf4\x2a\xc4\x52\x2b\x5d\xe2\x16\x75\x42\x54\x2b\xd8\xd2\xc0\xa2\x30\x9a\x07\x6b\x42\x2c\x3a\x9a\xea\xd3\x3a\x4a\x1c\x07\x02\xa1\x4a\x17\x81\x79\xea\x39\x5c\x4b\xbb\x04\x00\xed\x65\x2b\x6a\x08\x33\x29\x85\x81\x00\x8c\x62\xa2\x2c\x75\x49\x09\x59\xde\x6f\x4d\x65\x52\xe7\x3a\x85\x8c\x2e\xb7\x49\xb8\xfb\x6b\xdf\xc4\x81\xea\xba\x5d\x05\xe4\x18\xba\xdd\x24\xe6\x73\x91\x80\xa2\x15\x13\x18\xb9\xf6\x41\x8d\x28\xee\xeb\xef\xac\xf6\xed\x2e\x72\xf9\xd6\x3d\x25\xfe\x55\xab\x69\x96\xd2\x6a\xb2\xfd\xeb\xd1\x94\xb1\x53\x15\xf2\x6f\xc7\x6e\x15\xe3\x3b\x7d\xea\x99\x75\xaf\x18\xf7\x4a\x81\x17\x88\x1d\x67\x4e\x3b\x2c\xab\x01\x76\x7c\x1f\x77\x38\x8b\x5d\xe2\x83\xb2\x03\x70\x8d\xd3\xa0\x6e\xe9\xbd\x0e\xd0\xc7\x55\xee\x6e\xf9\x58\xee\xf2\xcf\x23\x00\xc2\xfa\xf2\x39\x82\xa9\xd9\x35\xb0\xf8\xb0\x6b\xd7\xc0\xe2\x03\xaf\x5d\x03\x8b\x5d\x03\x8b\xcd\xeb\xc1\xa4\x0c\xee\x1a\x58\x7c\x59\xa0\x64\xbb\x06\x16\xf7\xed\x62\xde\x35\xb0\xd8\x35\xb0\xb8\xed\xda\x35\xb0\x78\xcf\xb5\x6b\x60\xd1\xe1\xfa\x02\x38\xd7\xae\x81\x45\x87\x6b\xd7\xc0\x62\xfb\xb5\x6b\x60\xb1\x79\xed\x1a\x58\xdc\x78\xed\x1a\x58\x74\xbe\x76\x0d\x2c\x76\x0d\x2c\x76\xb8\xbe\x77\x1b\xeb\x61\xe2\xfa\xb2\x5d\x03\x0b\xba\x76\x0d\x2c\xbe\x08\xf4\x52\xb6\x6b\x60\xf1\x41\xd7\xae\x81\xc5\xae\x81\x45\x97\x6b\xd7\xc0\xe2\x4b\x71\x97\xec\x1a\x58\xec\x1a\x58\xfc\x76\x14\xdd\x5d\x03\x8b\x5d\x03\x8b\x5d\x03\x8b\x5d\x03\x8b\x5b\x67\xb1\x6b\x60\xf1\x25\x98\x80\xc6\xa6\xb2\x13\x2c\xe4\x87\x20\xd8\x50\x66\x72\x54\x30\x3e\xab\xe6\x73\x51\x02\xe7\x82\x27\x6f\x24\x4f\xd5\x60\x7d\xed\x20\xab\xb0\x63\x00\xc3\xa1\x22\x8e\x1b\x7e\x4e\x15\xea\x00\xdf\x58\xa7\x0f\x9f\xbc\x7c\xb6\x05\x2e\xa7\x73\x56\x61\xd7\xc4\x59\x98\xf3\x4b\xd5\x2d\x3e\x7e\x03\xc1\xb7\x15\x15\x11\xdd\x93\x4c\x1b\x4a\x7b\x06\x62\x25\x4b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x09\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\x2d\x32\xc1\xb8\xb5\x3c\x59\x4e\xdd\x93\x94\x27\x76\x9d\xa2\x4c\x9f\x18\x5b\x0a\x9e\xfb\x64\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb2\x40\x41\x15\x88\x01\x59\x71\x75\x5e\xf3\xb8\x7e\x1a\x4d\x4b\xc7\x78\x65\x60\x6d\x8e\x01\xe2\x39\x2f\xec\x9a\xb9\x57\xce\x08\xf6\xb5\x34\x96\x25\x99\x04\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xec\x65\xb5\xa2\x99\x1a\x9a\xaa\x4a\x41\x6d\x2d\xac\x61\x90\x06\x5c\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\xc6\x8c\x7b\x30\x2d\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\x40\x44\xdd\xde\x44\x07\x56\xbd\xd1\x21\xef\xdd\x6f\xce\x71\x23\xc5\xbf\x56\x28\xa8\x93\x41\xeb\x18\xc0\x02\x28\xb1\x72\x7b\x40\x24\xc2\xc9\x57\x7e\xc3\xae\xff\xe4\x9b\xde\xf2\x72\x21\x6c\xc8\x67\xea\x9a\x2b\xde\x4c\x0b\x89\xe1\x7e\x63\x43\xa4\x26\x19\x50\x87\x7a\x82\x44\x75\x55\xdb\xf0\x84\x71\x86\x04\xa3\xb6\xed\x06\xaf\x18\x61\x8a\x66\xdd\x25\xa6\xe0\x89\x30\xec\xe0\xf4\xfc\xe9\x98\x9d\x9f\x1e\x53\x1e\xa6\x9e\x6f\xab\x63\x26\x1e\x86\x3b\xf0\x26\x64\xe3\x80\xd0\x16\x0d\x1f\xd5\x7e\xd2\xb3\xcf\x83\x7e\x05\xad\x5f\xb6\x71\x00\x50\xb9\x02\xba\x39\x33\x15\xa8\x48\xe4\x13\x92\xa1\x30\x83\x36\x9f\xa8\xcb\x11\x3d\xee\x90\xff\x45\x98\x08\x51\x89\xaa\x2e\x7c\xac\x1b\x18\x2c\xc8\xeb\x8d\xd2\x0e\x48\x05\xa5\xbc\x97\x4e\xf9\x2e\xbd\x2c\xa4\x48\x15\x7b\x21\x8c\xe1\x0b\x71\xde\x31\xbc\x75\x93\x1f\x00\x22\x5c\x35\x3b\x00\x06\x94\x61\xa1\x6f\xf8\xa4\xce\x09\x6e\x2a\xdf\x2c\xc7\x39\x85\x9d\x75\x5d\x4a\x6b\x05\xb0\x12\x00\xfb\x83\xc5\x6e\x63\x01\xec\xb7\x32\x8b\x5f\xf8\x41\xea\x1f\x3b\x55\x42\xa5\x98\xe7\x3b\x13\x6c\x56\x4a\x31\x67\x73\x09\xc9\xc3\x90\xce\x3b\x46\xec\x27\x8e\xbe\x27\x63\x44\x89\x1d\x85\xd0\x82\xf2\xf3\x9a\xb2\x9f\x68\x62\xb6\xac\x14\x76\x8c\x22\xe5\x1e\x8a\x5d\xe5\x9c\x2d\x20\x1d\x98\x6c\x94\x3f\x3e\xfa\xeb\x9f\xd9\x6c\xed\x14\x29\xd8\x90\x56\x5b\x9e\x85\x97\xcc\x84\x5a\x38\x5a\xa1\x50\x68\x96\x6b\x06\x0a\x40\x5b\x10\x9c\xf8\xe3\xaf\xaf\x66\x4d\xcd\xee\x30\x15\xab\xc3\x88\x7e\x93\x4c\x2f\xa6\xec\x69\xa8\x8e\xac\x8a\x14\xfc\xfc\xdd\xa1\xba\x87\xdb\x66\x3a\x93\xc9\xba\xf7\x46\xf3\x20\x64\x6c\xa9\xaf\xd1\xc2\xdc\xb2\x7b\xea\xca\xaf\x42\x17\x55\x86\xa1\x8e\x67\xa1\xd0\xb9\x32\x62\xb3\x1c\x71\xeb\xb9\x00\xe7\x3c\x0d\xd1\xe2\xa3\x94\x05\xee\x1f\xa9\xa9\xcc\x85\xdc\xc7\x01\x8b\x0c\x98\xc9\x33\x9e\x65\x33\x9e\x5c\x5d\xea\xe7\x7a\x61\x5e\xaa\x93\xb2\xd4\x65\x73\x2e\x19\x77\x32\x7a\x59\xa9\x2b\x6c\x05\x11\xd0\x1a\xf4\xc2\x29\xf4\x45\x65\x3d\xb8\xf7\xb6\x17\xc6\xd2\x7d\x2f\xfa\xbd\xf1\x5d\x8f\x22\xde\xca\xda\xc2\xa6\xaa\x31\xdc\x91\xf1\xf8\x26\xde\x6c\x5f\x3f\xfa\xe3\x5f\x70\xeb\x32\x5d\xb2\xbf\x3c\x82\x4a\x01\x33\xc6\x43\x0c\x12\xd5\xa9\x27\x39\xcf\x32\xc7\xc8\xe3\x4d\xe9\x08\xbd\x6d\x13\x7e\xf2\x3d\x68\xfb\x6f\xb7\x0f\x56\xe0\x2f\x2f\xff\x09\x52\x44\x5a\x23\xb2\xf9\x18\x0b\xa4\x82\x31\xbd\x0f\xea\xc8\x3e\x71\x1f\xa8\x52\x7b\x00\x6a\xf7\x4a\x67\x55\x2e\x8e\xc5\x4a\x0e\xd1\xa8\xaf\x31\x9a\x77\x30\x65\xd2\x80\x1c\x9c\x65\x3a\xb9\x62\x29\x7d\x19\xe5\x3b\xb5\x41\xc9\xbb\x53\xa1\x6b\xe6\x57\x8f\x8c\xaf\x1b\xdf\xbf\x91\xeb\x95\xf3\xa2\x70\x3a\x00\xd4\x61\x96\xfc\xba\x41\x0c\x38\x93\x80\x9c\xd0\x13\xda\xa6\x77\x70\xa3\x6f\x68\x63\x42\x6f\xe4\xf8\x66\xe7\x21\x3a\xe7\x3a\xf5\x8f\x8c\xd4\xb3\x1f\xa8\x3d\x5f\x3d\xa0\x3f\x0d\x05\xfc\x1b\x6b\x99\x36\x14\xf3\x00\xaa\x19\x36\x06\x2a\x00\x6e\xfb\x00\x4b\xee\xdb\xb2\xaf\x97\x4f\xbd\x5f\xa2\x5b\x83\x2e\xea\x96\x1e\x77\x9c\x15\xa2\x34\xd2\x38\xb9\xfc\x23\x1c\x28\x6c\x6e\x58\x3b\x9e\xef\x87\x08\x78\xb8\x01\xc9\xb9\x3f\xa7\x74\x76\x0a\x0e\x08\xac\x10\x51\xac\xb7\xa8\xb5\x4d\xad\xf6\xa2\x9a\xc1\xfe\x81\xdb\xef\xd2\x0d\x75\x40\x49\x7c\xdf\x3c\xf6\xc7\x7a\x19\x9a\x2c\xd6\x7d\x12\x78\x2c\xde\xf5\x25\x71\x56\x78\xbf\xcf\x95\xb1\x86\xc9\x0f\xc4\x3f\x80\xa3\xd2\xe2\x36\x59\x68\xc3\xea\xc4\x13\x16\xd9\x02\x64\x40\x4e\x19\x26\x6d\xb8\x33\x41\x3f\x65\xfb\x4f\xf6\xef\x95\xbb\x22\x89\x4a\x5d\xf0\x45\xaf\x7e\x44\x2d\x4a\xb5\x87\x8d\xc1\x32\x9c\xfd\x14\xb1\x92\x82\xee\x72\x9c\xc4\x63\x01\x01\xd2\x13\x06\xf3\x3d\x81\xc9\xb2\x80\x7e\x71\xec\x9a\xaf\x19\x2f\x75\xa5\x52\x72\x87\x06\x7f\xf4\x8b\xd6\x83\xcf\xb4\x12\x75\xfb\xd1\x26\xd6\x06\x04\xa0\xa4\x62\x8f\xa7\x8f\x1f\x7d\x29\x22\x0e\xde\xb0\x25\xe2\xce\x82\x88\x43\xfe\x74\xaf\xef\xea\x51\xfb\x07\x7a\xdf\x17\xe4\x9b\xa9\x41\xf9\xa5\x87\xfc\x86\x8f\xae\x4b\x69\x45\xd4\x65\xf0\x00\x2c\x1e\x67\x58\x46\xc8\x12\xa3\x6d\xdd\x30\x7a\x12\xa9\x1f\x94\x87\xa9\x66\x1f\x91\x6f\x11\x83\x82\xe3\xb6\xcd\x35\x66\x6e\x61\x61\x31\xa1\xf6\xf6\xd8\x01\xde\xb9\x8f\xf5\xf7\xa3\x7b\xdd\x5a\x44\xb4\x93\xb7\x45\x0f\x9c\xd0\x16\xd4\x43\xc1\xc1\x79\x57\x0c\x48\xc1\x7f\x88\x25\x5f\x09\xc0\x1d\x90\x19\x2f\x33\x08\x91\x5f\xe0\xdc\xd9\xac\xb2\x4c\xa8\x95\x2c\xb5\x02\x3f\xf1\x8a\x97\x12\x90\x7d\xa2\x26\xdb\xbf\x3f\xf8\xf1\xe8\x15\xe4\xdf\x8c\xb0\xeb\x8b\x9f\x65\x65\x3c\x04\x4f\x3c\x93\x68\xb8\xf7\x2e\x9f\x9f\x87\xa3\x21\xf0\x5c\x3f\x2f\xf7\x9c\xbc\xb2\x15\xb6\x96\x79\x9b\x64\x95\x91\xab\xfb\xe2\x24\x04\x08\x71\x2c\x3b\xad\x73\x0b\x9c\xa2\x26\xd4\x06\xce\x44\x1d\x26\x78\x0f\x0c\xf7\xbe\x09\x35\xa6\x71\xca\x06\xf9\xac\x58\x2e\x17\x4b\x4b\xd9\x9e\xad\xc8\x41\x14\x82\xca\xc1\xcd\x7b\x9f\xde\x2b\x27\x76\x8f\x32\xc9\xcd\x5d\x55\xae\x8d\x42\x46\x1a\x85\xba\xeb\x6b\x9f\x5b\xe4\x9d\x32\xee\x41\xe8\xa9\x3c\x3d\xa7\x08\x9a\xa7\x9b\x54\xff\x8d\x89\x35\xc1\x2c\xc1\x44\x19\xfc\x09\xba\x1b\xe7\x2c\x02\x05\xf2\x09\x25\xc0\xfc\x01\x89\x0a\x2c\x12\xa5\xd5\x64\x19\x81\x36\x15\x3a\xbd\x63\x91\x5f\x57\xc3\xa3\x93\xc9\xb1\x9d\x82\x6c\xa9\xb3\xd4\xf7\xd0\x46\x5f\xce\x4c\xd8\x6b\x21\x14\x3b\x3d\x07\xfa\xb9\x57\x84\x88\xd0\x0d\x54\xc4\xb0\x42\x68\xde\xbe\x8d\x9e\x77\xdd\x60\x3d\xac\x92\x3e\x2a\x7d\x78\xd3\xde\x67\xfe\xfb\x40\x33\x9f\x91\xcd\x67\x7a\x25\x80\xa4\x69\x5a\x0a\xd3\x03\xde\xe8\x1e\xec\xd4\x5e\xac\x54\x76\x6a\xef\xd3\x0c\x8c\x04\xb2\x79\xd7\x12\xa8\xef\x70\x54\x61\xe3\x7d\x62\x0e\x76\x7a\xfe\xb4\x07\xf7\xda\x7f\x4d\x71\x11\x37\xd4\xfe\xbe\x61\xb2\x48\xea\x98\xeb\x94\xd5\xe1\xc6\xa8\x50\x02\x35\xc6\xbb\xc5\xba\xba\xaa\x89\x11\x53\xeb\xc9\xa4\x99\xc2\x61\x1c\x5b\xa1\x22\x69\x72\xe7\x40\xd0\xa1\xd0\x29\xf4\x5f\xaa\xa9\x61\xfc\x2f\x62\x82\xf8\x64\x09\x64\xf2\x94\x3a\x32\x0e\x49\xc8\x2d\xc6\x04\xae\x77\x9f\x7e\x18\x71\xf1\x0d\x62\x7e\x32\x5a\x9e\x9f\x1e\x0f\xb9\x5d\x0a\x99\x3e\xb8\xed\xf2\xda\xdc\xb9\xd8\xfe\xf6\x97\x04\xe4\xbe\xf7\xbd\x25\x06\x9b\x08\x8c\x8f\xfe\x86\x34\x75\x6d\x19\x75\x77\x0c\x99\xb0\xdb\x12\x3a\x80\x8b\x34\x9f\x34\x76\x7f\xcf\xab\x0c\x36\x69\x9d\xdc\x1b\x32\x93\x79\xc8\x0b\x05\x6d\x80\xaf\xb8\xcc\x10\x17\x53\xdf\x3c\xa4\x0f\xbf\x67\x9a\xa7\x58\xee\x71\x25\x4a\x25\x32\x96\xeb\xb4\xca\xd0\x9b\x17\xba\x08\xbf\x78\x79\xfc\xfa\xf9\x89\x4f\xc2\x12\xf5\x72\x8e\x19\x67\x4a\x5c\xc3\xe8\x0a\x14\x92\x84\xe0\xb9\x42\xd9\x8f\x3b\x4f\x1e\x71\x13\xcd\x50\x74\x4c\xf8\x17\xca\xa5\x95\x0b\x84\xd1\xac\xd5\xc2\x59\x29\xf8\x95\xae\x2c\x5b\x55\x99\x12\x65\xdd\x05\x53\xac\x84\x42\x1f\xac\xfb\x81\x7b\x6c\x8c\xc8\x28\xcb\x06\x10\x26\xc1\xa3\x79\x70\x4f\x9e\x90\x26\x4f\x25\x46\xf0\x65\xd4\x02\xba\xd1\x28\xf2\x76\x80\x52\xaf\x79\x45\xd8\xa4\x58\x4e\xbc\x09\x4c\xea\x31\x24\x31\x8d\xe6\xc2\x67\xc0\x50\xe2\xcb\xa7\x3b\x0e\x77\x77\xb7\x34\x2b\x44\x9b\xc0\x2a\x34\xa0\x97\x7d\xe7\x3a\xbd\xc1\x6a\xa8\xf5\x2e\xb8\x3f\x6e\x8c\x6d\x35\xe3\x0c\xdd\xed\x13\x0f\x4c\x03\x99\xb2\x5d\xd8\xe0\x9d\x85\x26\x58\x1e\xe7\x55\x96\x5d\x88\xa4\x14\x77\x0d\x33\x34\x39\xc5\x69\x6b\xac\x9b\x2c\x80\xc8\x9c\x05\xb4\x0e\xba\x59\xd5\x98\xb0\x51\x9e\x53\x5d\x8b\x5b\x54\x19\xa4\x86\x73\xb5\xf6\x04\x87\xd9\x9b\x28\xa6\x2b\x8d\xcf\x32\x43\xee\xd3\x58\x05\x23\xc2\xc3\x42\x8b\x35\x6e\x0c\x66\x1e\x48\x95\xca\x95\x4c\x2b\x9e\xc1\x83\xc0\x28\xa3\x84\x2d\x4e\x68\xe5\x78\x96\x73\x8f\x71\x7c\xd7\x1c\xe6\xfa\x4c\x1e\xe2\xbc\x7f\x87\xd3\x5b\x4b\xb5\x98\xc0\x27\xee\xc1\x34\xc3\x89\x56\x13\x3e\x71\xdb\xe6\x33\xb1\x5b\x00\xa5\xff\x25\x18\x06\xaf\xfc\xfa\x7a\x36\x64\x98\x50\xba\x5a\x2c\x81\x58\x65\xce\x3d\x60\x66\x26\x2c\x60\x21\x52\x3e\x03\x26\xb1\xd1\x6f\x53\xb2\x32\x62\x6c\xc8\xe6\xde\xf8\x4c\x6c\x97\xae\x0e\xde\x56\x32\x7e\xc4\x66\x88\x46\xf6\xce\x3b\x50\xaf\x44\xb9\x92\xe2\xfa\x90\x34\xbf\x89\x93\x09\x13\xa4\x88\x39\x04\xc2\x1e\xfe\x0e\xad\xa3\xcb\x97\xc7\x2f\xa1\xb1\x38\x79\xdd\xbd\xa8\x72\xa2\xc0\x4c\x19\x2f\xe4\x8f\xa2\x34\x00\x9d\x7c\x25\x55\x3a\x66\x95\x4c\xbf\xfd\x84\x09\x5f\x52\xc9\x3a\x8b\xb5\x17\xd7\x7a\x4e\x5c\x89\xaa\xe8\xe5\x7f\x70\x7b\x46\x12\x74\x26\x32\xad\x16\x11\x06\x00\x48\xf3\x53\x25\xed\x46\x0f\x66\xc4\x33\x05\x0f\x8f\x2e\x53\xc8\x15\x96\xba\x6c\x84\x33\xdc\x78\x80\xf2\x18\x65\x1c\x3b\x96\x26\x1b\xe3\x41\x1a\x97\xa9\x75\x24\x4c\x04\xf2\xe5\xc2\x1e\x04\xdb\xa3\x47\xa2\x2c\x5e\x72\x95\xc2\x9f\x49\xa2\xcb\x94\xe6\x2b\x6d\x48\x6f\xc6\x64\x38\xcc\xc0\x02\x31\xe4\x38\x1a\x57\xed\x27\x83\x9a\x56\xe6\x8d\x54\x58\xaf\xb5\x57\x4a\xfe\xbb\x12\x8c\xe7\xda\x31\xe2\x76\xab\x87\x16\x45\x72\xbe\x06\x59\x08\x53\x7d\xee\xcb\x35\xa8\xc6\xd6\x8c\xd9\x2b\xe1\x94\xae\x1a\x26\x60\xcc\x9e\x37\x71\x03\xc6\x6e\x2e\x17\x58\xd0\x4c\x1f\xe1\xec\x4b\x61\x74\x55\x26\xe2\x15\xc6\x38\x73\x9f\x4f\xb7\xf9\x32\x6e\x55\x2c\xbf\x12\x0a\x7d\x4a\x8e\x34\x10\xc6\xad\x4a\x58\x83\x64\x29\xd2\x0a\xa4\xca\x6c\xcd\xe6\x12\xfb\xbf\x80\x68\x97\x8b\xa5\x30\xd6\xdb\x46\x87\x90\xa3\x56\xb7\xd2\xf3\x13\x80\xed\x1b\x25\xb3\xd7\x5e\xd8\x9c\x03\x3a\x39\x1c\x59\x6e\x7d\xbd\x16\x6a\x83\xa6\xca\xfd\x59\x6e\x53\xda\x4c\xd9\x73\xf7\x28\xdc\x4f\x51\x5f\x0d\xd9\x22\x2e\xc4\x98\xc9\x8d\xcc\xe6\xdc\x2c\xa1\xeb\x4c\x7b\x09\xa8\x65\x45\x52\x95\x8e\x61\x20\x92\x3c\x4f\x53\xc7\x5d\x4b\x56\x62\x63\xf9\x6d\x7e\xc7\x9e\xf5\x39\x6e\xb2\x93\x48\xde\x7d\x2e\x42\xec\x28\xd4\x5b\x38\xc2\x27\x2d\x4e\x80\x2b\xe9\x04\x96\x47\x5c\x73\x0a\x77\x08\xf8\x3b\xae\xf0\xe9\x44\x52\xf7\xf0\x7e\xa7\xb0\x7c\x1f\x09\xc8\xcb\x45\x7f\xc7\xdd\xfe\x51\xb9\xa8\xf0\xa0\x13\x17\xae\x71\xe7\xa7\xad\xbc\x7b\x50\xa6\x9c\xad\xfa\xf4\xc5\x71\x5c\xe8\x17\x57\x30\xf9\x32\xc9\x29\xfb\xb1\x6f\x98\xa5\x1d\x67\x71\x0c\xbd\x0e\xde\xd4\x5d\x63\x1c\xd3\xc8\x56\xde\x24\x08\x4f\xf3\x9a\xaf\x54\x45\x65\x49\x12\xd6\x3e\x13\x95\x2c\xb9\x5a\x80\x9b\x44\x57\x6e\xbc\xdf\xff\x1e\x66\x54\x8a\xb4\x4a\xa8\xe5\x8e\xdf\xb5\xbf\xf7\x41\x07\x02\xba\x03\x76\x65\x12\x5e\xf8\x39\xc7\xaf\x65\xd6\xca\xf2\xb7\x4f\x98\x9c\x8a\x29\xdb\xfb\x7d\xf4\xd5\x1e\x3e\xbd\x28\xb5\x7b\x04\x15\x18\xc1\xac\x32\x69\x21\xd1\x67\x2f\xbe\x7b\xca\x4e\xdc\x33\x20\x10\x1b\x08\x18\xd5\xc0\xcc\x6a\xf2\x8d\x59\x29\x16\xbc\x4c\x33\x72\x18\x5e\x47\x85\x53\x81\x60\xe2\xad\x34\xd6\x90\xb7\xa0\x07\x73\xb2\xdc\x5c\x39\x56\xe4\x0e\xd7\x24\xe5\x96\x4f\xa2\x53\x7d\x88\xa6\xd6\x84\xb0\xc0\x27\x9c\x76\x57\xcd\xb5\x0e\x7f\x47\xf5\xc7\x13\x1e\xee\x92\x4e\x29\x07\x54\xee\xee\xaa\xce\xe7\xe6\x25\xee\x01\x09\xdf\x3c\xc0\x27\x75\x9f\x08\xa0\x01\x74\x59\xaa\x55\xa6\xc0\x47\x09\xf5\xfc\x86\x23\x7d\x72\x76\xf9\xea\x9f\xe7\x2f\x4f\xcf\x2e\x77\x27\x7b\x77\xb2\x77\x27\xbb\xc7\xc9\x16\x6a\xd5\xfb\x54\x7b\xeb\x69\x5b\xde\x42\x1b\x8c\x35\x2a\xc1\xfb\x82\xb2\x43\x4f\xd4\xea\x47\xee\x94\x69\xf2\x6b\x53\xd0\x75\x4b\x1a\x07\xdd\x80\xaa\xfb\xd3\xcf\x3e\x3d\xf4\x1e\x93\x3b\x07\x4c\x9a\x8b\x1d\x2b\xdb\x56\x2d\xee\x11\xfa\xf4\xd7\xd3\xe3\x93\xb3\xcb\xd3\x67\xa7\x27\xaf\xee\x35\xdb\xa9\x27\x18\x6a\x53\x2e\x77\x94\x92\x45\x29\x56\x52\x57\x26\x5b\x07\x3c\xf5\xed\x4c\x60\x33\x61\x56\xa5\xe0\xf1\xf0\x90\xf1\x5b\x7f\xb6\x13\xb6\xc3\x0a\xdb\x66\xf2\x57\x0f\x1c\xac\xa1\xb6\xef\xb3\x52\xe7\x03\x6d\xe1\x0b\xf4\xc5\xf8\x60\xdb\xb6\xfd\xb4\x4f\x90\x39\x0d\xd1\x43\xca\x63\x8d\xcf\xe3\xf4\xd1\xbc\xb0\x3d\x9a\xe5\x0c\x02\x7f\x3d\x0c\x52\x34\x26\x9c\xbd\xe0\xc5\x0f\x62\xfd\x4a\xf4\x84\xdb\x6a\xd2\x5b\x64\x22\x71\x82\x8e\x5d\x89\x35\x66\x17\x3f\xf5\x0f\xeb\x03\x0b\xf6\x20\xd1\xc3\xaf\x44\x1f\x64\xf7\x21\x61\xbf\xaf\x44\x8f\xcc\x69\x7f\x6d\x00\x60\xbb\x25\x04\x3d\xcd\xad\x69\xbf\xd5\x63\xc3\x42\x7e\x7f\x04\x98\xf3\x2f\x37\x8e\xd2\xbc\x06\x5c\x05\x1f\xbe\x1d\x78\x25\x30\x92\xbe\x6e\xc8\xae\xc0\x44\x18\xd6\x34\xc3\xde\xf4\xa1\x07\x52\x32\x06\x22\x4d\xdf\x6e\x9b\x0c\x97\x70\x58\xbe\xba\x5f\x33\x56\xcc\xb9\x08\x80\x8e\xe9\x13\x8f\x01\x62\x42\x8b\x4c\x68\x3a\x3d\x6e\xfe\x49\x69\x2d\xff\x0a\x1f\x66\x7c\x26\x32\xf3\xf3\xfe\xfe\xdf\x7e\x38\xf9\xe7\xdf\xf7\xf7\x7f\xf9\x57\xfc\x2d\x88\x42\x0c\x6f\x37\x6f\x01\x40\x13\xa5\x53\x71\x06\xcf\x80\x3f\x49\x5d\x3b\xc2\x10\x0a\x7d\x01\x78\x04\x53\x4c\xbd\x0b\x7f\x16\x3a\x6d\xff\x65\x7a\x21\x6f\x3e\x48\xc1\x00\x4b\xd4\xa3\x3c\x0e\xaf\xe1\xc4\x43\xcd\x4b\x06\x3e\xaa\x34\x6a\xe8\xf4\x94\x2c\x45\x8e\xd8\x7f\xcf\x3c\x09\xa0\x8d\xb7\x07\x3e\x51\x80\x16\xe1\x34\xd3\x26\x0c\xeb\xde\xea\xf1\xde\x83\x12\x30\x61\x05\x07\x26\x18\x50\x84\xa8\x85\x07\x39\x08\xd8\x90\xe6\x12\xda\xcc\x1e\x9d\x9f\xb2\x15\x52\xf8\xc1\x10\xc7\x87\x37\x9f\x7d\x54\x1e\x17\x82\xa8\xed\xaa\xf4\x27\x98\x56\xe6\xbf\x27\x84\x10\x13\xa0\x22\x85\x33\x6c\x0e\xf0\xc3\x69\x52\x54\x63\xba\x61\x9a\x8b\x5c\x97\xeb\xf0\x67\xa8\x4c\x9e\x18\xab\x4b\xbe\x80\xc2\x30\xfc\x39\xfe\x2c\xfc\x85\x3f\x6c\x3c\x60\xf3\xd7\x68\x0a\xd7\xb1\x54\xe2\xc8\x1d\x91\x6e\xea\xeb\x01\xf2\x36\x4f\xfa\x07\xc2\xda\x92\xbe\x78\x65\xcd\xab\xb9\x21\x83\x27\x0e\x15\xce\x40\x45\xb0\x27\xa9\x62\x7e\x5c\x67\xb1\x81\x37\x40\xad\x9c\x65\xd9\x19\x69\xb2\xbe\x06\xe4\x66\xa9\x5c\x49\xa3\x7b\x94\xbf\x85\x81\x6e\xce\x78\x24\xd0\x1e\xcc\xe2\x0a\x6e\xb3\xb7\x05\x80\xeb\x85\xf3\xda\x62\xfb\x8f\xfb\xf4\xd7\xc3\xab\xe0\xd6\x8a\x52\x3d\x61\xff\x75\xf0\xe6\xab\x77\x93\xd1\xb7\x07\x07\x3f\x3f\x9a\xfc\xf5\x97\xaf\x0e\xde\x4c\xe1\x1f\x7f\x18\x7d\x3b\x7a\xe7\xff\xf8\x6a\x34\x3a\x38\xf8\xf9\x87\x17\xdf\x5d\x9e\x9f\xfc\x22\x47\xef\x7e\x56\x55\x7e\x85\x7f\xbd\x3b\xf8\x59\x9c\xfc\xf2\x81\x83\x8c\x46\xdf\xfe\xbe\xf7\xd4\x07\xc0\xba\xc6\x6b\x48\xc4\xeb\xe6\x88\x83\x6c\xbf\x8f\xd8\xe6\x05\x2f\xbf\xbd\x86\x3e\xff\xaf\x3c\xd7\x8c\xb2\x7a\xbc\xb8\x7e\x30\x07\x1c\xd3\x42\x3f\x85\x27\x07\x9f\xd4\x2c\x18\x0b\xa6\xc5\x97\x26\xe7\x7e\x0b\xce\x9d\xd0\xa0\x15\xd6\xb5\xd6\x44\xe7\xa5\xce\x3d\x2c\x05\x84\x37\xb0\x80\x92\xee\xbb\x12\xbd\x5a\x86\xe3\xb5\x73\x06\xed\x9c\x41\x37\x5c\xef\x75\x06\x61\x11\xc1\xc3\xf5\x04\x09\xb5\xea\x1a\xc2\xd8\x1a\x41\xf7\xb6\x4e\x0c\xfe\xf8\x61\x01\xb5\xa9\x3f\xea\x75\x67\xe3\x3a\x99\x06\x05\x5a\xbe\x3d\x86\xc9\x8e\xb2\x8c\x49\x85\x07\x1f\x06\x08\xb5\x58\x02\x4d\x1b\x5f\x44\xbc\x72\x53\x08\x55\x57\x0d\xf0\x64\xc8\x2d\x96\x6a\x41\x85\x51\x28\x4a\x28\xfa\x24\x55\x0d\x3b\x1d\x94\xc3\xba\x57\x01\x37\x46\x27\xd0\x14\x0c\x2b\xad\x02\x26\x25\x4d\x1b\x66\x63\xf9\x15\x44\x1b\x13\x91\x0a\x95\x08\xea\x63\xd0\xe8\xe2\xcc\x15\x3b\x51\x2b\xdf\xcb\x21\xad\x30\x19\x04\xd9\xdf\xf6\x31\xbe\xac\x04\x04\xb7\x11\x29\x08\x16\xe5\x21\x00\xd7\x0f\x16\x36\x87\x54\x0c\x3d\xaf\xbd\xac\xdd\x1a\xbd\xf6\x96\xe2\xfd\x65\x66\x88\x6c\xf5\x52\x86\x36\x84\x65\xed\x7e\x6e\x0a\xc9\x2f\x21\x18\xd8\x5f\x7c\xfe\xe6\x44\xe7\x40\x62\x73\x18\x91\x79\x87\xd8\xc9\x90\x62\x72\x88\x60\x49\x51\x8a\xb9\x7c\x3b\xd0\x39\x3d\x8a\xea\x09\x65\x2a\x94\x95\x73\x89\xbd\xac\x8b\x52\x14\x42\x81\xab\x15\x4a\x34\x1c\xef\x27\x49\x59\x07\xa7\x1f\x62\x32\x0f\x2a\xdc\xc3\xb2\xb2\x8b\x6d\xca\xfe\x8e\x8f\xb1\x1d\x1f\xeb\x7c\x7d\x22\x3e\x46\x3b\xf7\xe1\x30\x31\xc8\x3c\xef\x9f\xfd\xfe\xb4\x99\xca\x0e\x1b\xb9\x7f\x09\x71\xab\x40\x3f\xb0\x46\xab\x31\x79\x0d\xeb\xd8\x4a\x86\x35\xfb\xa8\x37\xb1\x9c\x2b\xbe\xc0\x56\x14\x56\x07\xf0\x2a\x5d\x86\x76\x62\xed\xbc\x7b\xd0\xe3\x7d\x89\x17\x7c\x59\xea\x2c\x13\xa5\x61\x99\xbc\x12\xec\x58\x14\x99\x5e\xe7\x94\xfb\x9a\xb2\x0b\xcb\xad\xdb\xd5\x17\xc2\x76\x0b\xfb\xf6\x43\xb5\xf1\x55\xe8\x03\x61\xff\x63\x59\x3b\x14\x85\xb3\x82\x2a\x28\x5f\x2a\x60\x1a\x47\xd0\xd9\x68\xcc\xce\xc4\x4a\x94\x63\x76\x3a\x3f\xd3\xf6\x1c\xb5\xef\x66\xc2\x1d\xde\xc8\xe4\x9c\x3d\x71\x76\x9d\xb1\xcc\x62\x77\x99\xa8\x40\x5d\x97\x8d\x01\x6a\xdc\xc2\x21\xea\xf3\x36\x6b\xcf\x61\xa4\x50\x79\xde\x29\x92\xd1\x6b\x99\x42\xfb\xae\xde\x0b\x74\x84\xf5\xa4\x35\x94\x75\xb4\xbf\x11\x57\xc1\x23\xf1\x81\x15\x28\x15\x2b\x85\x29\xb4\x32\xa2\x09\x33\x1a\x66\x84\xd6\xee\xb0\x18\xc6\x9d\x85\x67\x5f\xb1\x59\x68\x63\xa1\x84\x76\x98\xa6\x70\xe7\x7e\x38\xa8\x48\xe6\x59\x26\xd2\x46\x57\x40\xec\x66\xc5\x9b\x1e\x02\x42\x43\x09\xfd\x6d\xb0\x50\xb9\x51\xe3\xdc\xb8\x3f\x74\x98\xf4\x3d\x9c\x7c\x7b\xf1\x9b\x2a\x9b\xeb\x83\x09\x72\x24\xda\x00\x1b\x80\xe7\x00\x83\x6f\xa2\x46\x50\x4b\xad\xaf\x58\xa2\xf3\x22\x83\xa3\xd3\xe3\x64\xd5\x7d\xe8\xc2\x56\x9a\xb8\xd1\xcd\x61\xd4\xa2\x0e\x3e\xe8\xd7\xa1\xae\x97\x22\x36\x84\x1a\x26\xde\x8a\x64\xb0\x1e\xb6\x27\x6f\x45\x12\x35\x61\x06\x48\xb6\xc4\x23\x44\xb8\x13\xdb\xbf\xb7\x7e\xef\x90\xc3\x50\x6e\xfe\x1e\xb5\x74\xf1\xd5\x42\xb1\x84\x31\x3d\xda\x3f\x3d\x02\x1a\xa7\x80\x2d\x84\xf5\x75\x31\x8c\x46\xd8\x8c\x78\xf4\x36\xa0\x2f\x43\x22\xb5\x1f\x0b\x5a\xa4\x69\x6d\xd9\xc1\xfe\xe1\xfe\x68\xc3\xff\xd8\x82\x8c\xbf\x8c\x7e\x29\x01\xea\xb4\x00\xdc\x50\x91\xec\xa7\x63\x26\xad\xcf\xb4\x46\xb8\x27\x98\x15\x15\xfd\x8d\x99\xd1\xcc\x96\x3c\x95\xa4\xc6\xc0\xa7\xee\x26\x5b\x56\xc4\xe5\x0f\xf6\xdf\xed\x53\x6b\xaf\x6b\xad\xf6\x2d\x4c\x7f\xca\x2e\x11\x27\x26\x0c\xb4\xd6\x15\xe0\x42\x21\x09\x8a\x4c\x26\xd2\x66\x6b\xe0\x58\x4c\x57\x88\x49\xe5\xe4\x05\x15\x1b\x9e\xbc\x95\xd6\x37\xd7\xd1\x73\xf6\x08\xbb\xeb\x21\x86\x13\x37\xd0\x61\xfd\x70\x29\x78\x66\x97\x98\x24\xa2\xb4\x9a\x60\x83\x54\xc7\x4a\xe8\x9b\xbe\xf1\x92\x7e\xee\xc4\xf8\xea\xe1\x5a\xdc\x9c\x50\x4f\xcb\xc1\x31\xd1\xef\xba\x77\x6d\x67\x1b\xe8\x75\x97\x97\xe7\xdf\x35\xfa\xb6\x03\x17\xb7\xb6\xf0\xa9\x3b\xe0\x0d\x10\xe5\x5c\x97\xf9\x03\xe0\x1d\xc3\x04\x2b\x7b\x35\x70\x67\x03\xb2\xb0\xbe\x8d\xdc\xd9\x76\x34\xc2\x0f\xef\xe0\xce\xfe\xa9\x2b\x00\x03\xe1\xb3\x6c\x1d\x90\x18\x8c\xb0\x6c\xcf\x0d\xb5\xe7\xd8\x93\xdb\x0d\xdf\x0b\x9e\x22\x50\x86\xb1\x82\x77\x52\xdd\xe2\x6b\xb0\x20\x5a\x34\xb7\x61\xe5\x40\x65\xac\xce\xd9\x92\x5e\xbb\x59\x7a\x49\x27\x63\x0a\xa7\xc7\xd7\x35\x95\xa2\x40\x0e\x47\xbf\xf9\xe2\xf8\xd7\x06\xdf\x40\xba\x37\x9a\x78\x24\x31\xd9\xe2\x1e\x51\x52\x21\xb1\x10\x77\x66\x20\x5e\x3a\x40\xf2\x03\x1b\x30\x01\x82\xf5\x2b\xe4\x6c\x0f\x04\x41\xbd\xfe\xb9\x5e\x83\xe5\x54\xb0\xc1\xf2\x06\xd8\x36\x27\x2b\xed\x19\xf4\xbe\x0c\x44\xc4\x41\xa3\xf5\xac\x7f\xa9\x68\x7c\xdd\x4e\x80\x61\x16\x9f\x0d\x49\x81\x62\x80\xd4\xee\xcd\xc4\x6e\x84\x91\x82\xd2\x4b\x64\xae\xc0\x26\x10\xf8\xf2\xc1\x48\x19\xa7\x2d\x0c\xfa\xea\xe8\x28\x2f\x99\x0a\x5d\xe1\x3d\xca\xef\x26\x41\xa2\xcc\x04\x6a\x22\xef\xdd\xb9\x5e\x1c\x71\xb5\x10\xec\xb1\xfb\xe5\x9f\xff\xf4\xa7\x6f\xfe\x34\xc5\xe1\x43\x96\x82\x62\xa7\x47\x67\x47\xbf\x5e\xfc\xf8\x14\x8a\x63\xfb\x52\x75\xa0\x14\xcc\xa1\x13\x30\x07\x4d\xbf\xfc\xa8\xc9\x97\x50\xf2\xd1\x9b\x8b\x34\x7d\xff\x30\x64\x8c\xef\x49\xba\x5f\x84\xb3\x87\x18\xb4\xb1\x23\xd5\x1d\xb5\x07\x71\xc6\x6c\x52\x5c\xe8\xe4\x6a\x40\xbb\xe6\x58\x14\xa5\x48\xd0\x4f\x76\xf9\xf4\x1c\x47\x77\xf6\xe5\xd9\xcb\xcb\xba\xd4\x00\xf2\x71\x6a\x30\xbd\xef\xc9\x93\xe6\x6c\xd2\x2b\x51\xd8\x60\xba\xcf\x78\x72\x75\xcd\xcb\x14\x3c\x5b\xdc\x4a\x80\x0e\x46\xec\xbf\x52\x50\x1b\x37\x4c\xf8\x43\x90\x33\xdf\x26\x1b\x79\x39\x3a\x10\xbc\x3b\x14\x5c\x56\x98\x47\x33\xe7\x32\x03\x0f\x2a\x75\xa8\xc6\x8c\xa0\xa4\x08\x2e\xbd\xd8\xa7\xbd\x33\xbe\xfc\xf5\x60\x8d\xaf\xa8\x83\xf6\x5d\xed\xb0\xbe\x79\x89\x0f\x58\xd4\x91\x88\x2b\x1b\xcd\xec\x77\xa2\x6e\x80\xf1\x1e\xae\xa8\x2b\x4a\x71\x61\x75\xa7\x8e\x18\x6c\x33\x4a\x82\x83\xdd\x10\x23\x99\x89\xb9\x76\x4c\xf8\xc6\xa0\x47\x5a\xc1\x21\xe4\x0a\x8a\x03\xbd\x57\x4b\x37\x02\x1b\x98\x91\x19\xf0\xeb\x09\x38\xf5\xd0\xc4\x68\xa9\xbe\x17\xf8\xd8\xbd\x9d\xc8\x61\x76\xe3\xba\xca\x81\x3a\x91\xc3\x87\xc2\x26\xe8\xb9\x8d\x18\x39\x20\x87\xd2\xf4\xdb\x61\x94\xa4\xe4\x66\x89\x5d\xba\xc5\x5b\x69\x09\x97\xf5\x5c\xa7\xed\xde\xfa\x8b\x92\x27\x82\x15\xa2\x94\xda\x09\xa3\x4a\xd9\x54\x5f\x2b\x36\x13\x0b\xa9\x8c\x27\x05\x80\xa7\x13\xcd\x20\x1e\x23\x4d\x00\x86\x9b\xb2\x57\x0d\xb0\x13\x2a\x43\x4a\x74\x7d\x34\x69\xce\xed\x48\x12\x48\x2c\xa0\x13\x02\xde\x07\x0a\xc7\xdd\xbc\xde\x37\xe5\x83\x4a\xc1\x93\x53\x91\xf1\x35\x66\x9b\x42\x07\x7f\xf9\x1f\x51\x9a\xd1\x00\x11\x27\xec\x47\xe7\xbf\xbb\x71\x1e\xd2\xb0\x52\xf0\x64\xd9\x2f\xf8\xbb\x0b\x51\x7d\xe0\xb5\x0b\x51\xf5\x19\x64\x17\xa2\xda\x85\xa8\xde\x73\xed\x42\x54\xbb\x10\x55\xeb\x7a\xb0\x56\xd2\x2e\x44\xd5\xf9\xda\x85\xa8\x6e\xbf\x76\x21\xaa\x0f\xb8\x76\x21\xaa\x0f\xbc\x76\x21\xaa\x5d\x88\x6a\x17\xa2\xda\x85\xa8\x7e\x43\x7e\x3b\x7f\xed\x42\x54\x1b\x83\xec\x42\x54\xbb\x10\xd5\x07\x5f\x0f\xd6\xf8\xda\x85\xa8\xf0\xda\x85\xa8\x9a\xd7\x6f\x4b\xd4\xf9\x00\xcf\xb9\x33\xf5\xfa\xd7\xb4\x9d\x43\x50\x41\x26\x14\x27\xd2\xf3\x46\x1d\x14\x3e\x6a\x5a\xf7\xa8\x88\x60\x41\x7c\x29\x0e\x45\x84\xea\x38\xd3\xd6\x7a\xa9\x9e\x7d\xe4\x0a\x9d\xd6\x81\x8a\x28\x42\x81\x06\x6f\xf7\x9a\xb5\x7b\xab\xc6\xea\x13\x96\xf8\x34\x21\x89\x07\x12\xbf\x19\x20\x0c\xb1\x0b\x41\x7c\x71\x21\x88\x61\xdc\x77\x03\xb8\xee\x7a\x8b\x0a\x8a\xcc\x5f\x2e\x4b\x61\x96\x3a\xeb\xbc\xd1\x1b\x9b\xfc\x85\x54\x32\xaf\x72\xe8\x14\xeb\xf6\xb3\x5c\x85\x14\x00\x53\xb7\xa2\x07\x8e\x8d\x5e\xc4\xa8\xa5\xac\x6f\x25\x0b\xf5\x9b\xd4\x1a\xde\x54\x49\x22\x04\xb4\x52\x8b\x2d\x9c\x6f\xa6\xe1\x49\xa1\x75\xc6\xe3\x7e\xfc\xa6\x9f\x10\x47\x38\x52\x18\xe5\x9b\xaf\x3b\x8d\xb1\x28\x8b\x61\xf8\xf2\x77\xaf\xce\x9f\x46\x7c\x99\x2b\xcf\x96\xa5\x5a\xe9\x0c\xa8\xca\xf1\x26\xa7\xac\x51\x83\x7d\xe9\x0c\xa6\x99\xb0\x3c\xb2\x6d\xc8\x2c\x30\xd8\x44\xdf\xfd\xce\xfd\x2a\x48\xe4\x73\x94\xbb\xd8\x3f\x9f\x2d\xb8\xbd\x4f\x86\xdf\xdf\x84\xe9\x65\xbe\x0c\x21\x6f\xfa\x6a\xe8\x4d\x1f\x9c\xd3\xc3\x9b\x5e\xa8\x05\xec\x0b\x44\xd0\xff\x60\x3d\xbc\x37\xa7\xec\xaf\x1b\xf7\x3f\x5a\x0c\x20\x6e\xe0\xc5\x07\x23\xf0\xde\x05\xb5\x8e\x22\x71\x1e\x1b\x41\xbe\xab\x94\xd5\xac\xc8\x78\xdd\x17\x0a\x56\xe0\x7b\x90\x41\x4f\x97\x22\xb9\x7a\x45\x91\xd8\x03\x23\x44\xd0\x4d\x17\xd2\x2e\xab\xd9\x34\xd1\xf9\xa1\x63\x09\xf8\x7f\xb3\x4c\xcf\x0e\x73\x6e\xac\x28\x9d\xba\x4a\x22\x6e\x92\xb8\x51\xa4\x5a\x4c\xf3\x74\x34\x65\x6f\x14\x56\xb7\xd7\x7d\x28\x23\x6c\x07\xf7\x7c\x8f\xb3\x31\x13\x8e\xbb\x6a\xf0\x43\x44\x10\x76\x6e\x7a\xd3\x3e\x40\xc9\xbd\x45\x52\xcf\x28\xf8\xa7\x8f\x80\xef\x38\x17\x1b\xc0\xe1\xf2\xb9\x45\xba\x07\xcb\xf8\x18\x20\xc2\xfd\x80\xa2\xdb\x0f\x46\x35\x7e\x28\x11\xed\x07\x88\x36\x3d\x40\x00\x76\x88\x08\xf6\x70\xd1\xeb\x8f\x00\xca\xfc\x71\xa2\xd6\x03\xba\xf6\x06\x8a\x56\x7f\x8a\x48\xf5\x20\x6f\xdd\x37\x42\xfd\xe9\xa2\xd3\xc3\xbc\xee\x90\x86\xc0\xe7\x1a\x91\x1e\xc0\x45\x3f\xa4\x7b\x7e\x30\xd7\xfc\x47\x8b\x40\xf7\x8f\x3e\x3f\x80\xc8\x73\x6f\x22\x4b\x25\xad\xe4\xd9\xb1\xc8\xf8\xfa\x42\x24\x5a\xa5\x9d\x25\x4c\x0b\xa5\x33\x9c\x1f\x83\xc3\x92\x9f\xaa\x59\x68\xb1\xe4\x04\x46\xee\x2c\x2a\x2c\x2c\xf1\xb1\x0c\x52\x28\x20\xaa\x8c\xb3\x7c\x90\xd1\x09\xf6\x60\x1c\x62\x58\x75\x32\xe4\x22\x7e\xaf\xaf\x99\x9e\x5b\xa1\xd8\x81\x54\x7e\x1d\x47\x91\x19\x58\x7b\x27\xc3\xb6\x76\xdf\x3e\x7e\xe4\x6f\xfe\xf2\xdc\x8e\xe0\x60\x35\xe6\xe3\x7b\x81\xe9\x41\xef\x77\x03\xd3\x8d\xf3\x2a\x6b\xba\x82\xd1\x3d\xdc\xe4\x37\x8f\x6b\x38\xe5\xc7\x30\x6e\x38\x6d\x5c\xa5\x8c\x2a\xd1\xbe\xbc\x45\xeb\x9d\x57\xd3\x54\xfd\x42\x1e\xcd\xfb\xbc\xc6\x97\x4f\xcf\xd1\x69\xbc\x73\x97\x3c\x14\x77\xc9\x3d\xe5\xa6\x3c\x40\x45\xf7\x33\xcd\x47\xd9\x29\xba\x77\xb8\xa2\xda\xd4\xef\x4a\x9e\x88\xf3\xc1\x75\x04\x7f\x9c\x58\x5a\x95\x9c\x18\x60\x50\xf9\xfc\xe1\x51\x42\xa4\x78\x9a\x42\x3d\x2f\x54\xca\xce\xab\x2c\x5b\xb3\xaa\xd0\xaa\x59\xfd\x8c\xb1\xf6\x76\x31\x2d\xb8\xe4\xb7\x3c\xa5\x56\x2c\x8b\x52\x93\xcc\x2c\x2b\xa5\x1c\x0f\xae\x7b\xa2\x81\x22\x09\x30\xcd\xbc\x51\xb2\x6b\xe4\xc2\x4d\xdf\xc9\x3f\xa8\xe6\xad\x13\x10\x1b\x03\xba\x5f\xcf\x75\x99\xc8\x59\xb6\x66\x4b\x9e\x85\x06\x38\x9c\x5d\xc9\x2c\xa3\x61\xa6\xec\x42\x58\x0c\x29\xa0\xec\xcc\xb4\x5a\xc0\xe4\xb8\xf2\x8d\x17\x45\xe2\x7e\x9b\x64\x82\xab\xaa\xc0\xe7\x39\x49\xbc\xd6\x55\xe9\x9f\x37\x0d\x81\x89\x20\x81\x95\xcc\xc6\x51\x7b\xb7\x5b\x17\x36\xe4\xfe\x54\xc6\x29\x00\x2f\x3d\x2c\xf5\x38\x1e\xd3\x23\x87\x9b\xa8\xb9\x4f\x51\xea\x95\x4c\x31\xba\xe1\xc9\x06\x8d\xa4\xb1\x81\x4f\x38\xcf\x4a\xab\x89\x12\x0b\x0e\x8a\x0a\x9d\x22\x5c\x33\x1c\x07\x33\x08\x54\x0a\x2d\x7d\x9c\x86\xaf\x8b\x46\x39\xfd\x4a\x62\x33\xe2\x88\x72\xec\x40\x69\xa6\x21\x1f\xb5\x52\xd2\x62\x83\xfb\x65\x65\x59\xaa\xaf\xd5\xe8\x4e\x51\x57\x08\xb4\x5e\x6e\x25\x50\x33\xfc\xba\x4d\xcf\xc1\xf7\xbd\x9d\xbc\xd2\x90\xeb\x73\xce\x2a\x65\x44\x4f\xf1\x3e\x98\x72\xf4\xe7\x3f\x76\xe3\x11\x32\x17\xba\xb2\x9f\xc4\xfa\xbb\x5e\xca\x64\x19\x2b\xb3\x32\x17\x86\xe9\xaa\x65\x16\x3f\xa6\x9f\x6d\x5f\xa1\x9d\x09\xb8\xed\xea\xea\xd8\xdd\xe2\xfd\x6a\xc3\x21\xd4\x9d\xaf\x21\x4f\xfc\xf8\xec\xe2\xd7\xe7\x47\xff\x38\x79\x3e\x65\x27\x3c\x59\xc6\x98\x18\x8a\x71\x60\x1a\xc0\x28\x96\x7c\x25\x18\x67\x95\x92\xff\xae\x28\xe0\x7b\x10\x7e\x3b\x1a\x14\xab\xbd\xa3\xf4\x85\xee\xfc\x83\xb5\x83\xc3\x5e\xff\x98\x97\xa5\x8d\x80\x06\x2e\x1b\xea\x53\x88\x32\xaf\xd1\x44\x00\x85\x0b\xd2\xe7\x8f\x5f\x9e\x5c\x40\x5a\x7e\x51\x22\x52\x08\xe4\x71\xc1\xf7\x30\xd2\x4c\xb8\x5f\x50\xe7\xde\x29\x3b\x52\x6b\xfc\x12\xcf\x94\x34\x2c\x93\xc6\x0a\x90\x7a\xa4\xb6\xf9\xf8\xf5\xde\xa3\x29\xfc\x6f\x8f\xf1\x34\x2d\x9d\x5e\x17\xd2\xd3\x92\x8d\x7c\x51\xd4\xfc\xe4\x2c\x8b\x5e\x40\x09\x8b\xd9\x68\x2f\x74\x4a\x33\x07\x49\x02\xb1\x2b\x14\x83\xc6\x96\xdc\x8a\x85\x4c\x58\x2e\xca\x85\x60\x05\xb7\xc9\x92\xe5\x7c\xcd\x12\x5d\x96\x55\x81\x38\xff\x29\xb7\x7c\xca\x9e\xe9\x92\xe5\xfe\x10\xbb\x3d\xef\xe4\xf0\xc5\xf6\x98\x7e\x7d\xb2\xe3\x7f\x4a\x63\x2a\x61\x0e\x1f\x3f\xfa\xcb\xd7\x7f\xfa\xd3\x17\xd5\x1a\xae\x4e\x17\x72\x6b\x1b\xb5\x86\xe3\x7e\x15\x70\xd5\xb1\x55\xa0\x54\x8b\x2c\xde\x5f\xdd\x04\x40\x5f\x2b\xb3\xaf\x8d\x39\xa9\xdf\xe0\xbc\xab\xa9\x39\x48\x8b\xba\x7a\x0e\x03\x35\x76\xaa\xe5\xa0\x37\xac\x88\x37\xe8\xb8\x57\xef\xe9\xb9\x3f\x98\xa4\xe7\xe4\xad\x06\xaf\x45\x9d\x9d\x34\x66\x8f\xd8\xdf\xd8\x5b\xf6\x37\x30\xb4\xfe\xdc\xb7\x0d\x56\x5f\x13\x68\x88\x64\x23\x67\xdf\x9f\x9e\x0f\x44\xf1\x9f\x1c\xd3\x74\x23\x3a\xaa\x5a\xcd\x66\x92\x14\x7b\xf1\xd6\x8a\xd2\x29\x9a\xb4\x12\xf7\xda\x40\xcc\x4d\xf0\x13\x6e\x33\x0c\x3c\x9c\xce\x9b\x09\x4e\x77\xdb\x68\xee\xe7\xdf\x6b\x63\xcf\x88\x0b\x35\x5b\xe1\xd4\xa3\xe5\xc0\xf8\x1b\x6c\xcc\xc9\x0d\x63\xeb\x03\x66\x58\xaa\x21\xdf\x0a\x13\x99\x97\xb2\x47\x1a\xc5\xc3\xd9\xc6\xfd\x22\xeb\x8d\xf5\xbc\x6d\xa5\x5a\xae\x14\xb0\x81\x48\xc5\x8a\x30\xb2\x0a\x9d\x92\x76\xe6\xa6\x95\x46\x32\xe3\x16\xf5\x8c\xbc\x36\xc1\xdf\x0c\x7b\xc9\x9d\xa7\x84\x2b\x2c\x25\x99\x8b\xb2\xc4\xdc\xf3\xd9\xda\xa7\xed\xf5\x5e\xbc\x5e\x27\xa9\x28\xb5\xd5\x89\xee\xd1\xe3\xac\x19\xed\xa6\xe1\x80\x08\x98\xef\xeb\x1d\xe6\xaf\x8f\xcf\xc7\xec\xf2\xe9\x39\xf4\x7d\xba\x78\x7a\x79\xde\xb4\x59\xf6\x2e\x9f\x9e\xef\xdd\x2b\x29\x98\x57\xf8\xc0\x45\xdd\x61\x90\x86\x0b\xca\x69\x93\x93\x9c\x17\x93\x2b\xb1\xee\x28\x53\x87\x90\xeb\x93\xb0\xc2\x83\xbc\x10\x92\x39\xe7\xc5\x9d\x47\x2b\x05\x4f\xe5\x27\xaa\xe7\xf2\x09\xb1\xe1\x99\xdb\x0b\xbb\x72\xbd\x12\x29\x6a\xe9\xfe\x17\x42\xa5\x85\x96\x4e\x5f\xdc\x55\x7b\xdd\xfd\xd7\xbb\x6a\xaf\x0f\xbe\x76\xd5\x5e\xbb\x6a\xaf\xcd\xeb\xc1\xa4\xb4\xee\xaa\xbd\xbe\xac\x08\xfe\xae\xda\xeb\x37\x9e\x04\xb0\xab\xf6\xda\x7e\xed\xaa\xbd\x76\xd5\x5e\x1f\x76\xed\xaa\xbd\xee\x7e\x3d\xb8\xf4\xa5\x5d\xb5\xd7\x9d\xae\x5d\xb5\xd7\xe6\xb5\xab\xf6\xba\xe1\xda\x55\x7b\xdd\x70\xed\xaa\xbd\x76\xd5\x5e\xbb\x6a\xaf\x5d\x12\xec\x7b\xc7\x7a\x98\x49\xb0\x6c\x57\xed\x45\xd7\xae\xda\xeb\x8b\x48\xf5\x63\xbb\x6a\xaf\x0f\xba\x76\xd5\x5e\xbb\x6a\xaf\x2e\xd7\xae\xda\xeb\x4b\x71\x97\xec\xaa\xbd\x76\xd5\x5e\xbf\x1d\x45\x77\x57\xed\xb5\xab\xf6\xda\x55\x7b\xed\xaa\xbd\x6e\x9d\xc5\xae\xda\xeb\x4b\x30\x01\x7d\x47\xe0\xfe\xd5\x4b\xfb\x4f\x75\x5e\x54\x56\xb0\x57\x7e\xc8\xa0\x45\x22\x63\x90\x26\xd6\x08\xfa\xa7\x10\x26\x5a\xcd\xe5\x82\x38\xfb\x21\xb6\xe1\x9d\x84\xf7\x99\x44\xad\x6f\x3f\xc3\xfc\xc1\x24\xe3\xb2\x7b\x80\xa6\x19\x43\x7f\x0a\x63\x41\x59\x57\x1d\x45\x87\xc4\xae\x40\xad\x71\x88\x50\x3b\x09\xe9\x78\x99\xff\x0a\x7f\x3c\xc6\xf4\x30\x27\xce\x80\x87\x6d\x59\xd0\x37\xaa\xe6\xb6\x8a\xf1\xac\x58\xde\xce\x6f\xdd\x44\x8e\xd7\x8a\xe7\x32\xf1\x3b\xe6\x28\xcb\x74\x82\xf2\xb5\xc9\x71\xfd\xd8\x38\x9e\x7b\x48\x9e\x57\x96\xcf\x32\xd1\x39\x92\xde\x3f\x8c\xd6\x33\x84\xd6\x58\xa3\x57\x31\xb5\x31\x3f\x5e\x28\x77\x84\xb4\x12\x4c\x28\x5b\xae\xdd\xc2\x9c\xeb\xf4\xc2\xad\x4d\xe3\xee\xde\x69\xf3\x3d\x23\x67\x43\x44\xcd\x7a\x46\xcc\x86\x89\x73\xf5\x8f\x71\x6d\x86\x04\xa2\x4a\x96\x38\x7d\xa5\xb1\xaa\x85\x4e\xa7\x5b\x8e\x9c\xb7\xad\xce\x75\xea\x34\x4b\x68\x95\x1e\x1f\x01\xd4\xd2\x4e\xdd\xf0\x57\xa0\x8e\x71\x5b\xf7\x77\xe7\x2b\x2e\x33\x77\x3e\xb6\x54\x68\xf6\x6b\xe2\x32\x80\xdd\x32\x74\x79\x00\xeb\xbb\x83\x86\x4c\xef\x67\xd0\xb1\x25\x97\xdd\xea\x81\xd9\x86\x54\x7d\x0e\x63\x45\x41\x75\xb7\x27\x72\xfe\x16\xf4\x1b\x9e\xeb\x0a\xfb\xce\x27\x24\x7c\x03\x47\xc7\xd4\x83\x07\x27\x56\xd9\x30\x6c\x87\xa7\x3e\x29\xfa\x7c\x88\x9c\x40\x6e\xad\x28\xd5\x13\xf6\x5f\x07\x6f\xbe\x7a\x37\x19\x7d\x7b\x70\xf0\xf3\xa3\xc9\x5f\x7f\xf9\xea\xe0\xcd\x14\xfe\xf1\x87\xd1\xb7\xa3\x77\xfe\x8f\xaf\x46\xa3\x83\x83\x9f\x7f\x78\xf1\xdd\xe5\xf9\xc9\x2f\x72\xf4\xee\x67\x55\xe5\x57\xf8\xd7\xbb\x83\x9f\xc5\xc9\x2f\x1f\x38\xc8\x68\xf4\xed\xef\x3b\x4f\xb9\xb7\x3f\x63\x38\x6f\xc6\x40\xbe\x8c\x8f\xe2\xc9\xa0\x6c\x9c\x81\xce\x22\x65\x12\x6e\x9c\x46\xb2\x36\x6e\x3b\x8d\x5e\x4a\x82\x8d\x1e\xc6\x91\x86\xe9\x5c\x5a\x67\xd9\x3b\x63\x9e\xc7\xb5\x08\xd2\x36\x3c\x8a\xc4\x07\xa0\x1a\x87\x43\xd1\x40\x94\xc7\x1f\x65\x20\x6a\x6f\xb6\x83\x3f\x4e\x31\x99\x17\x99\xc8\x85\xb2\x70\x9e\x27\x5e\xcd\x03\xcb\x68\xc7\x1b\xde\x7f\xed\x78\xc3\x97\xc8\x1b\x8c\x48\xaa\x52\xda\xf5\x53\xad\xac\x78\xdb\xc9\x3d\xde\x64\x0d\x17\xcd\x01\xc9\x9c\x32\x94\xa8\x8c\xdf\x31\x5d\x60\xd1\x4e\x0b\x15\x65\xa9\xab\x2c\x85\x4a\xbc\x4a\x81\x77\x10\x4b\xac\x85\x45\xd7\x1d\x68\x7c\xa0\x0e\xb6\x1f\xe2\x9d\x71\xe8\x23\xfc\x77\x25\x57\x3c\x13\xca\x46\xbf\x38\x07\xf7\x53\xfc\xa3\x0f\x3d\xf3\x96\x9b\xab\xfa\xc0\x8b\x49\xa1\xd3\xfa\x7c\x1f\xfa\x57\x82\x8f\xc4\x5b\xfb\x39\x9a\xd8\xa0\x20\x9d\x97\x72\x25\x33\xb1\x10\x27\x26\xe1\x19\xf0\xb5\x61\x64\xc5\xd1\x0d\xa3\xc3\xc2\x97\x3a\x33\x4e\xa9\x77\xbc\x9a\x71\xef\xbf\x85\xf2\xe8\x05\x97\x0a\x41\x4d\x0a\xff\x63\x83\x8e\x60\xc7\xfe\x0b\x5e\xba\x05\x0e\x0e\x5f\xb0\x8a\x67\x5a\x67\x54\xae\x96\xad\xeb\xf1\xa9\x70\x53\xe9\x5f\x95\xb8\xfe\xd5\x8d\x66\xd8\x3c\xe3\x8b\xe0\xe7\x35\xc2\x6e\x84\x6a\xea\xa1\x6f\x7c\x01\xa8\x05\xab\x04\xe3\xd9\x35\x5f\x9b\xda\xeb\x1d\xc1\xf7\x98\x27\xec\xf1\x08\xb6\x33\x37\x2c\x8c\x91\xb2\xaf\x47\x90\xbb\xf1\xf4\xe8\xfc\xd7\x8b\x7f\x5e\xfc\x7a\x74\xfc\xe2\xf4\x8c\x9d\x69\x2b\x50\xa8\x45\x06\x4e\x12\xdc\x43\x6e\x96\xf0\x0c\xb0\x91\xb4\x99\x82\x11\x25\x0d\xbb\x96\x2a\xd5\xd7\xa6\x73\x80\x0d\xb7\x9f\x23\x9e\xe0\xaa\x9b\x93\x86\x17\x1c\x5a\xd7\xf6\x90\x30\x1b\xe9\x81\xf1\xa0\x20\xc3\xd3\xf4\x30\x2d\x75\x81\x44\xf0\x11\x8a\x5a\xd4\x36\x7d\xa0\x71\x01\x02\xac\xef\xbc\x39\xe0\xa2\xe4\xca\xd6\xae\xfa\x7a\xcd\xa8\x67\xee\xb4\xf7\x72\xdc\x9f\xe0\x1f\xc2\x0d\xc0\xd3\xe1\x4a\x51\x8f\xd2\x54\xa4\x0d\xf2\x7f\x71\x69\xdf\x4f\xfd\xcb\xad\x6b\x88\x21\x76\xfe\xf2\xe2\xf4\xff\xb4\xf6\xf1\xba\xe8\x97\xe5\x3a\x0c\xac\x41\xa9\x8b\xc1\x56\xf7\x15\x95\xcd\xef\xd6\xf7\x41\xac\x6f\x90\x96\xc3\xe4\x56\xbd\xaa\x54\x13\x8f\xae\x1e\x9f\xe5\x3a\x15\x53\x76\x1e\x82\xbc\xcd\x6f\x23\x74\x1a\x5e\x0a\xe6\x6e\x51\x56\xf2\x2c\x5b\xc7\x2a\x9a\xd5\x58\x42\xde\x00\xd6\x89\x19\xf9\x9c\x67\xe6\xbe\xb9\x71\x1f\xd9\xe8\xf4\x88\x17\xce\x1e\x1e\x64\x39\xc2\x68\x2c\x15\x4a\x5b\x52\xac\xdd\x2c\x01\xac\xa8\xd4\x09\x43\xe3\x3b\xca\xa4\x6d\xc8\x37\x83\x81\x66\x2f\x1a\xa5\xf1\xc4\x3e\x0f\x23\x63\x94\xb1\x32\xa2\xad\xa0\xfb\x76\xf2\xc1\x1c\x77\xa3\x97\x82\xa7\x5a\x65\x6b\x48\x9b\xc7\x44\xb8\x9c\x9b\x2b\x91\xe2\x07\xa4\x9a\x85\xb0\x07\x78\x72\xfd\xa3\x2e\xdd\xbc\x7d\x84\x03\x54\x32\x4c\xcf\x83\xd8\x88\x48\xef\x79\xd5\x7b\x1c\x42\x47\x94\x97\x2a\x5b\xbf\xd2\xda\x3e\x0b\x18\x08\x83\xec\x80\x9f\x48\x5b\x6e\x86\x9d\x40\x9d\xe4\xf0\xdc\x09\xac\x06\x1c\xaa\x18\x7e\xe1\xb8\x5e\xf1\xcf\xfd\x48\x95\x95\x3a\x32\xdf\x95\xba\xea\x2c\xc4\x36\x94\xcd\xef\x4e\x8f\x81\x15\x55\x94\x67\xa2\x6c\xb9\x06\xdc\x97\x4d\xf0\xce\x60\x18\xbc\xa6\x4c\x99\xf8\x4c\xd4\x49\x0d\xec\x05\x5f\x33\x9e\x19\xed\x69\x49\x71\xab\xb6\x15\x4a\x26\xae\xfb\x7a\xa6\xed\x72\xc3\xb6\x75\x07\x6a\xf3\x77\xe3\x28\xed\xa4\x46\x13\x95\x6a\xe3\xe7\x16\x82\x22\x45\x29\x12\x91\x0a\x95\xdc\xf7\xb2\xdf\x77\xb6\x06\x6c\x9d\x33\xad\xdc\xc1\x1c\x64\xf3\x9c\x86\x34\x1d\x22\x69\xbc\x55\x20\xea\x45\xd6\x1f\x87\xb4\x1f\x38\x96\x95\x11\x25\xe6\x28\x95\x95\xc0\x95\xfc\xa1\x9a\x89\xcc\x51\xde\x99\xa4\x00\x1d\xc7\x2d\xba\x33\x64\xce\x17\x82\x71\x1b\x76\x9a\xd5\x4c\x28\x53\x95\xb4\x88\xd2\xb2\x54\x8b\x1a\x3a\x85\x1b\xf6\xfa\xf4\x98\x3d\x62\x07\xee\x59\x23\xd8\x3f\x73\x2e\x33\xc8\x08\xb2\xbc\x6c\xcf\x51\xce\xfd\x10\x30\x25\xd8\xbc\x4c\x97\xc8\x24\xc6\x4c\x69\x66\xaa\x64\xe9\xe7\xe4\xec\x5e\x6f\x36\x53\x16\x3b\x84\x56\x1e\xe6\x5e\xbf\x5f\x0e\xf5\xda\x88\x72\x30\x06\xf5\xba\x03\x83\x8a\xd5\x28\xb7\xe7\x9a\xd4\xc3\x8d\x95\x0b\xcb\x53\x6e\x39\x31\x2e\x7f\xc3\x83\x5d\xd2\xdf\x36\xfb\x32\xe2\xb9\x54\xd5\x5b\xcc\x1a\x1d\xce\xd5\x72\x71\x02\xc3\xb2\xc4\x53\x1d\x56\x9d\x17\x45\x26\x11\x2a\xa9\x95\xc5\x7c\xda\xd8\x2b\xe3\x1b\xd4\x44\xe0\x13\x1c\x53\x59\x84\x53\x4e\xb8\x4a\x75\xbe\xf1\x30\xa7\x44\x8a\x06\xec\xf5\x94\xed\x76\x5f\xf3\x7a\x20\x4e\xa1\x4c\xac\x44\x0f\x60\xc8\x36\xcc\xb7\x1b\xcd\x11\xc7\xef\x08\x18\x9e\x65\x7c\x26\x32\x4a\xb3\x82\x1d\x68\x36\x77\xe0\x7d\x97\x12\x94\x3a\x1b\xae\xf6\xf1\x95\xce\x04\xe6\xe6\x7a\x42\xb8\xe1\x3f\x0b\x3a\xc0\x20\x43\xd1\x01\xac\xc1\x06\x1d\xc0\xae\xfd\x1c\xe8\x50\xf5\x10\xf5\xac\x4d\x07\xa7\x37\x34\xe9\x00\xc2\xfb\xa1\xd3\xc1\x88\x24\xd1\x79\x71\x5e\x6a\x67\x76\x0e\x26\x9b\x68\xd8\x3a\x66\x88\x8e\x8d\x2d\x89\x97\x20\x0b\x9a\x37\xf3\x32\xca\xca\xe7\x16\x85\x84\x4f\xcd\xff\x1f\x91\xcc\x02\xd6\xd3\x16\x64\x7e\x94\x46\x78\xd1\xfd\x92\xbe\xf8\x9c\xc5\xc1\x10\x85\x6d\x3d\x9c\x9d\x83\x48\x23\x9d\xf0\x0c\x80\xbf\xfb\x6d\x39\xd6\xde\x76\xed\x81\xa3\x5a\x0c\x88\x51\xc2\x67\x51\x9e\x30\x07\x47\x8b\x77\x61\x2a\x9d\x8a\x28\x96\x8d\xe9\x89\x97\x98\xb3\x0f\xf7\xf9\x32\x10\xa7\x57\xf8\xb0\x72\xda\xf8\xb5\xd5\x04\x5f\xf9\x22\xc0\x89\xbb\x09\x0a\x95\x4a\xb5\x00\xbf\xda\x98\x95\x22\xc3\x02\x12\x62\x02\x57\x68\x41\xee\xc3\x91\xf0\x83\xfa\xf3\xe0\x1f\xed\xd3\x8a\x69\x64\xf0\x14\x79\x0d\x6b\x8e\xec\x56\x1a\xb6\xf7\xdc\x13\xa0\x07\xfe\xf2\x43\x94\x30\x7b\xf8\x86\x61\x35\xd1\xd3\x79\x25\x55\x4a\xb5\x16\x0d\x62\x85\x06\x1e\xa8\x07\x43\x15\x8f\x4c\x63\xde\xf2\x84\xbd\x51\x2c\x10\x8b\x4d\x3a\x6f\x8f\x57\xa8\x32\x7b\x1f\xdd\xe4\x76\xc7\x6b\x78\x48\x7b\x98\xd7\x0a\xd6\xde\x3d\x77\xe2\x2c\xf7\xcd\xfb\xfc\xbb\xdc\x2b\xee\x1a\x71\xbf\xa1\xad\x98\x9f\x70\x58\xaf\xd2\x27\x6e\x5b\x5b\xa9\x16\x26\xb6\x64\x78\x96\x35\x9c\xe1\xdb\x4c\x19\xbf\xc2\xa1\x5d\xcb\xa6\x09\xd1\xaa\x11\xfb\x5c\xcc\x90\xcc\xa9\x13\x9f\xb9\x11\xb2\xc8\x0d\x7f\x5a\x3a\x4a\x58\xc9\xb3\x8b\xa2\x3b\xbe\x34\xdb\xc0\x32\x7d\x71\x71\xd4\x1c\x1a\x84\x35\x25\x9d\x0b\xf8\x9e\xf1\x34\x97\xc6\x80\x23\x4c\xcc\x96\x5a\x5f\xb1\x83\x5b\xdb\xec\x4c\x8c\x5c\x98\x43\xda\xf3\x13\x37\xfb\x11\x93\x2a\x0b\x59\x51\x60\x07\x2b\x1b\xf2\xdc\xe1\x21\x49\x98\x05\xac\x21\x35\x1d\xa0\x64\x85\xcd\x69\x62\x9b\x01\xb7\x0b\xee\x9d\x61\x6f\x2e\xcf\x59\xcf\x7a\x82\xf7\x2c\xd1\x19\xed\xed\x36\x2c\xe6\x56\x3a\xa2\xf6\x78\xef\x44\x22\xe5\x22\x11\x66\x38\x34\xbe\xef\xeb\x31\x59\x2a\xb0\x04\x53\x40\xf6\x13\xbf\x31\xc9\x0e\xfc\xd2\xfb\x50\xc9\x4f\x3f\xdd\x8f\x35\xea\x66\xad\x11\x94\x32\x4d\xd0\x48\x77\x1c\x0d\x58\xa0\x57\x21\x96\x5a\x69\xaa\x70\x73\x42\x54\x2b\xd8\xd2\xc0\xa2\x30\x9a\x07\x6b\x42\x2c\x3a\x9a\xea\xd3\x3a\x4a\x1c\x07\x02\xa1\x12\xd8\x86\xbe\x58\x38\x87\x6b\x69\x97\x00\xd2\xbd\x6c\x45\x0d\x61\x26\xa5\x30\x10\x80\x51\x4c\x94\xa5\x2e\x29\x21\xcb\xfb\xad\xa9\xd0\xea\x5c\xa7\x90\xd1\xe5\x36\x09\x77\x7f\xed\x9b\x38\x50\x5d\xf7\xf1\x80\x7c\x45\xb7\x9b\xc4\x7c\x2e\x12\x50\xb4\x62\x02\x23\xd7\x3e\xa8\x51\xcb\xa9\xca\xc0\x6d\x30\xea\x03\x92\xcb\xb7\xee\x29\xf1\xaf\xe2\x90\x38\xa1\x85\x6f\xff\x7a\x34\x65\xec\x54\x85\x0c\xde\xb1\x5b\xc5\xf8\x4e\x9f\x7a\x66\xdd\x2b\xc6\x4d\x64\xe0\x05\x62\xc7\x99\xd3\x0e\xcb\x6a\x80\x1d\xdf\xc7\x1d\xce\x62\x97\xf8\xa0\xec\x00\x5c\xe3\x34\xa8\x5b\x7a\xaf\x03\xf4\x71\x95\xbb\x5b\x3e\x96\xbb\xfc\xf3\x08\x80\xb0\xbe\x7c\x8e\xa0\x70\x06\xea\xec\x71\x11\x8d\x16\x69\xef\x21\xe0\x76\xae\x53\x84\xc2\x0a\x50\x3e\xd9\xda\x43\x73\xc9\xff\x78\xfd\xac\xd6\xf1\x94\xc6\xea\x80\x18\x23\x8b\xfa\x21\xa4\xcc\xa9\xda\x99\xf7\x2d\xe4\x45\x26\xa0\x04\x3f\x1a\xb9\x46\x17\x88\x5a\x81\x8c\xeb\x12\xb5\xd0\x4d\x84\x90\xb9\xc6\xec\xbf\xe1\x50\x86\x44\x54\x0f\x1a\x74\x1e\x7e\x8e\x16\xa2\x34\xbe\x2f\x10\x94\x96\x5a\xed\x5d\x17\x2c\x95\x73\x28\x84\xb4\xf4\xc8\x82\x97\x3c\x77\x2c\xde\x30\x22\xc1\x4c\x2c\x24\x26\x44\x06\xc6\xb6\xef\xd4\x3d\x2a\xd4\x1e\x23\x33\x94\x96\xe5\x72\xb1\xc4\x8d\xc2\x38\xc0\x2b\x30\x1f\x54\xcc\x34\x4f\xa1\x9f\x20\xd3\x25\xbb\xe6\x65\xee\xe4\x06\x4f\x96\x10\xa1\xe4\x8a\xa5\x55\x09\x10\xf9\x56\xf0\x74\x3d\x31\x96\x5b\xa7\x29\x8b\x92\x0c\x4a\x3f\xff\x5d\x3f\x94\x5b\xaf\x5d\x3f\x94\x0f\xbc\x76\xfd\x50\x76\xfd\x50\x36\xaf\x07\x93\x1d\xba\xeb\x87\xf2\x65\x61\xdc\xed\xfa\xa1\xdc\x77\x34\x61\xd7\x0f\x65\xd7\x0f\xe5\xb6\x6b\xd7\x0f\xe5\x3d\xd7\xae\x1f\x4a\x87\xeb\x0b\xe0\x5c\xbb\x7e\x28\x1d\xae\x5d\x3f\x94\xed\xd7\xae\x1f\xca\xe6\xb5\xeb\x87\x72\xe3\xb5\xeb\x87\xd2\xf9\xda\xf5\x43\xd9\xf5\x43\xd9\xc1\x44\xdf\x6d\xac\x87\x09\x13\xcd\x76\xfd\x50\xe8\xda\xf5\x43\xf9\x22\xc0\x70\xd9\xae\x1f\xca\x07\x5d\xbb\x7e\x28\xbb\x7e\x28\x5d\xae\x5d\x3f\x94\x2f\xc5\x5d\xb2\xeb\x87\xb2\xeb\x87\xf2\xdb\x51\x74\x77\xfd\x50\x76\xfd\x50\x76\xfd\x50\x76\xfd\x50\x6e\x9d\xc5\xae\x1f\xca\x97\x60\x02\x1a\x9b\xca\x4e\x08\xa0\x1f\x02\x56\x44\x49\xe8\x11\x36\xc0\xac\x9a\xcf\x45\x09\x9c\x0b\x9e\xbc\x91\x3c\x55\xe3\x32\xb6\x83\xac\xc2\x8e\x01\xf7\x88\xea\x75\x6e\xf8\x39\x81\x11\x00\x52\x67\x9d\x29\x7e\xf2\xf2\xd9\x16\x64\xa4\xce\x59\x85\x5d\x73\xa4\x61\xce\x2f\x55\xb7\xf8\xf8\x0d\x04\xdf\x56\x3f\x46\x74\x4f\x32\x6d\x28\xc3\x1d\x88\x95\x2c\xb9\x52\xc2\xdb\x7b\xd2\x82\x1f\x65\x26\x84\x62\xba\x10\x14\x9d\xe6\xcc\x48\xb5\xc8\x04\xe3\xd6\xf2\x64\x39\x75\x4f\x52\x9e\xd8\x75\x36\x3a\x7d\x62\x6c\x29\x78\xee\xf3\xf2\x73\x2e\x71\x28\xc6\x93\x52\x1b\xc3\xf2\x2a\xb3\xb2\x08\x83\x31\x23\xa0\xa0\x06\x05\x55\x20\x06\x64\xc5\xd5\x29\xec\xe3\xfa\x69\x34\x2d\x1d\x43\xd3\x81\xb5\x39\x06\x3c\xf0\xbc\xb0\xeb\x90\xc7\x2b\xd8\x5c\x96\xc6\xb2\x24\x93\x20\xad\xe1\x89\x58\x3b\x0d\xe3\x8d\xbd\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x15\x5b\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\xc6\x8c\x7b\xdc\x34\x24\xb4\x9f\x29\x90\xda\x4b\x16\x1c\x9d\x3e\x8a\x86\x8b\xf0\x62\xeb\xb4\xe1\x7a\xa3\x43\x89\x83\xdf\x9c\xe3\x46\x35\x47\xad\x50\x50\xdb\x8b\xd6\x31\x80\x05\x50\x62\xe5\xf6\x80\x48\x84\x93\xaf\xfc\x86\x5d\xff\xc9\x37\x7d\x24\x14\x5f\x08\x63\xf8\x42\x9c\x77\x0c\x34\xdc\x64\x91\x41\xac\xa1\x5e\x18\xd8\x0a\x19\x56\xd7\x86\x4f\xea\xec\xcc\xa6\x1a\xc4\x72\x9c\x53\x50\x7e\xae\x4b\x69\xad\x80\x45\x05\x84\x3d\x88\x55\xb6\x0b\xf0\xf7\x5b\x39\x9e\x2f\xfc\x20\xf5\x8f\x1d\x53\x57\x29\x66\x5c\xce\x04\x9b\x95\x52\xcc\xd9\x5c\x42\x1a\x27\x24\x56\x8e\x11\x70\x89\xa3\x17\xc0\x18\x67\xef\x6a\xe5\x75\x59\x3f\xaf\x29\xfb\x89\x26\x66\xcb\x4a\x25\x3c\xc2\xb2\x85\x0a\x53\x39\x67\x0b\x48\xcc\x24\x6d\xf1\x8f\x8f\xfe\xfa\x67\x36\x5b\x3b\x91\x06\x9a\x95\xd5\x96\x67\xe1\x25\x33\xa1\x16\x8e\x56\x78\x3c\x9b\x35\x92\x81\x02\xd0\xcd\x03\x27\xfe\xf8\xeb\xab\x59\x53\xc6\x1e\xa6\x62\x75\x18\xd1\x6f\x92\xe9\xc5\xb6\xe6\x56\xdd\x53\xb6\x3b\x9a\x44\x5b\xb6\x99\xce\x64\xb2\xee\xbd\xd1\x3c\xf2\x17\x5b\xea\x6b\xd4\xf5\xb7\xec\x9e\xba\xdc\xaa\xd0\x45\x95\xa1\xd3\xf9\x59\xa8\x2e\xae\x8c\xd8\xac\x01\xdc\x7a\x2e\xc0\x4d\x4a\x43\xb4\x71\xd3\x31\x1f\xd7\x3f\x52\x53\x6d\x09\x39\xf2\x02\x00\x18\x18\x42\xcf\x78\x96\xcd\x78\x72\x75\xa9\x9f\xeb\x85\x79\xa9\x4e\xca\x52\x97\xcd\xb9\x64\xdc\x71\xcb\x65\xa5\xae\xb0\x83\x43\x80\x48\xd0\x0b\xa7\x5a\x15\x95\xf5\x85\x0c\xdb\x5e\x18\xeb\xe5\x3d\x13\xf6\x66\x50\x3d\x8a\x78\x2b\x6b\x5b\x87\x4a\xb5\x70\x47\xc6\xe3\x9b\x78\xb3\x7d\xfd\xe8\x8f\x7f\xc1\xad\xcb\x74\xc9\xfe\xf2\x08\x72\xb6\xcd\x18\x0f\x31\xf0\x36\x27\x28\x72\x9e\x65\xce\x6c\x88\x37\xa5\x23\xf4\xb6\x4d\xf8\xc9\xf7\xa0\xed\xbf\xdd\x3e\x58\x95\xba\xbc\xfc\x27\xe8\x51\xd2\x1a\x91\xcd\xc7\x58\x95\x14\xcc\x9a\x7d\x10\x0c\xfb\xc4\x7d\xa0\x34\xec\x01\x28\x40\x2b\x9d\x55\xb9\x38\x16\x2b\x39\x44\x07\xbe\xc6\x68\xde\xd4\xcf\xa4\x81\x02\xb0\x59\xa6\x93\x2b\x96\xd2\x97\x51\xe6\x49\x1b\x09\xbc\x3b\x15\xba\xe6\xe0\xf4\xc8\xbd\xb9\xf1\xfd\x1b\x59\x37\x39\x2f\x8a\x50\x23\x54\xf2\xeb\x06\x31\xe0\x4c\x02\x5c\x41\x4f\x3c\x99\xde\x6e\xe6\xbe\x4e\xe6\x09\xbd\x91\xe3\x9b\x9d\x87\xe8\x9c\x75\xd2\xdf\x47\x5d\xcf\x7e\xa0\xae\x7a\xf5\x80\xfe\x34\x14\xf0\x6f\xac\x2a\xd9\xa8\x8a\x0c\x85\x75\x61\x63\xa0\x02\xe0\xb6\x0f\xb0\xe4\xbe\x9d\xf6\x7a\x79\x37\xfb\xa5\x1c\x35\xe8\xa2\x6e\x69\x4d\xc7\x59\x21\x4a\x23\x8d\x93\xcb\x3f\xc2\x81\xc2\x9e\x84\xb5\x0b\xf0\x7e\x88\x80\x87\x1b\xe0\x93\xfb\x73\xca\x73\x9d\xd2\x80\xc0\x0a\x11\x3a\x7a\x8b\x5a\xdb\xd4\x6a\x07\x14\xa8\xf7\xcd\x2a\x7f\xac\xa9\xd9\xe4\x94\xee\x93\xc0\x2a\xf1\xae\x2f\x89\x41\xc2\xfb\x7d\xae\xfc\x31\x4c\x7e\x20\x36\x00\x8c\x91\x16\xb7\xc9\x09\x1b\xc6\x23\x1e\x94\x48\xa5\x27\x3b\x70\xca\x30\x0a\xee\xce\x04\xfd\x94\xed\x3f\xd9\xbf\x57\x26\x89\x24\x2a\x75\xc1\x17\xbd\x7a\xf9\xb4\x28\xd5\x1e\x36\x06\x9a\x70\x66\x10\x7c\x1f\x60\xd7\xe0\x2e\x91\xd6\x38\x3a\x80\x92\x84\xd1\x51\x4f\x60\x32\x10\xb0\x1e\xfb\x9a\xaf\x19\x2f\x75\xa5\x52\xf2\x2f\x05\x07\xdf\x8b\xd6\x83\xcf\xb4\x12\x75\xf3\xcf\x26\x4e\x05\x78\xf4\xa5\x62\x8f\xa7\x8f\x1f\x7d\x29\x92\x0a\xde\xb0\x25\xa9\xce\x82\xa4\x42\xfe\x74\xaf\xef\xea\x11\xef\x07\x7a\xdf\x17\xe4\x62\xa9\x01\xed\xa5\x87\xcb\x86\x8f\xae\x4b\x69\x45\xd4\xe3\xef\x00\x0c\x17\x67\x1f\x46\xa8\x0c\xa3\x6d\x9d\x24\x7a\x12\xa9\x1f\x0c\x86\xa9\x66\x1f\x91\x6f\x11\x83\x82\xe3\xb6\xcd\xc3\x65\x6e\x61\x61\x31\xa1\xf6\xf6\xd8\x01\xde\xb9\x8f\x05\xcd\xa3\x7b\xdd\x5a\x44\xb4\x93\xb7\x45\x0f\x8c\xcd\x56\xed\x7c\xc1\xc1\x07\x57\x0c\x48\xc1\x7f\x88\x25\x5f\x09\x28\xe4\x96\x19\x2f\x33\x88\x39\x5e\xe0\xdc\xd9\xac\xb2\x4c\xa8\x95\x2c\xb5\xca\x85\xb2\x6c\xc5\x4b\x09\xa8\x38\x51\x8b\xeb\xdf\x1f\xfc\x78\xf4\x0a\x12\x1a\x46\x04\x49\x41\xb3\xac\x8c\x87\xaf\x89\x67\x12\x0d\xf7\xde\xe5\xf3\xf3\x70\x34\x04\x9e\xeb\xe7\xe5\x9e\x93\x57\xb6\xc2\xb6\x2c\x6f\x93\xac\x32\x72\x75\x5f\x9c\x84\x2a\xec\x8f\x65\xa7\x75\x6e\x55\xfb\xd7\x84\xda\x28\xdc\x07\xd7\xfa\x96\x02\xbd\x8d\x80\xc9\xbe\x09\x45\x7b\x71\x0c\x9c\x5c\x4f\x84\xa5\x81\xe9\x73\x1e\x71\x71\x43\x85\x00\xdc\x98\xfb\x75\x42\x29\x9d\x8a\xbb\xa3\xee\x34\xd3\x7b\x68\x08\x8c\x99\x47\x15\x7c\x26\x59\x8a\xb4\xca\xa8\x29\x37\x80\xa3\x3a\xf3\x81\xd7\x28\x7c\x0a\xba\x04\x9d\xce\x03\xa4\x81\x9a\x80\x73\x10\x69\xee\x7f\x5f\x7a\x00\x04\xff\x81\x69\x8d\x08\x46\xa9\x1b\x6b\xcc\xb8\x31\x55\x8e\x47\x02\x1b\x20\xcc\xa5\x35\x75\xcf\x6f\xd2\x8e\xdd\xc1\xb8\x63\x41\x55\x0f\xfa\x5e\x88\x0c\x36\x57\x0f\x1a\xef\x9f\x45\xe3\x20\xa1\x8d\xff\x8b\x36\x1c\x25\x4c\x40\xb4\x2d\xe4\x71\x6a\xf0\x92\xce\x25\x34\x51\xe2\x44\xef\x8b\x2d\xbf\x44\xd5\x01\xef\x00\x78\x18\x3e\x13\x99\x69\x0f\x34\xab\x17\x85\x50\x49\x89\xf0\x3d\xbb\xe4\x72\x63\xe4\x42\x41\xff\x4c\x37\xda\x1d\x3b\x65\x76\xb6\x99\x86\xe8\x82\xdb\x99\xab\x35\xb2\xb0\x72\x5e\x50\x3f\x75\x6e\x75\x2e\x93\x3b\x8c\xa4\xef\x38\xe5\x56\xad\x74\xa3\x06\xf7\xe5\xc5\x86\xc7\xc7\x44\x5e\x8d\x29\xbb\xd0\x39\xa5\x38\xa9\xa8\x8b\x97\x6f\xa6\xea\x24\x46\x29\x1c\x2d\x20\xf1\x48\xd6\xd1\x78\xe8\x7a\xe3\xab\xa0\xe1\x39\x41\x25\xa7\x30\x2e\xc0\x4f\x52\x33\x57\x9d\x65\xfa\x1a\x12\x8b\x71\x5c\xbf\xb7\x21\x05\xe6\x09\x9b\xb4\x3a\xd3\x4e\x9b\xa0\xa1\xb7\x3f\x87\xee\x1d\xbf\xff\x29\x98\x9f\x03\x70\x7c\xa7\xc7\xf1\x9f\xa7\xe7\x4f\xe3\x3f\x5f\x1b\x47\x25\xfa\xa0\x3d\xb5\x66\x57\x86\x9b\xef\x8a\xf1\xb1\x6f\xba\x6b\x8e\x8d\x8d\xde\xf3\xf5\xd3\x25\x57\x3e\x90\x75\xe3\xf3\xd6\x26\xb1\x59\x3d\x9d\x25\x2f\x05\xe1\xc7\x39\x4e\x6e\x0a\x9e\xdc\x38\x8b\x00\xd6\x76\xeb\x0d\xb7\xce\xd4\x54\x85\x6f\xb8\x9d\xc1\x8d\x61\x26\xf5\xb6\xfb\xf9\x0f\xbf\x7c\x20\x31\xdf\xf7\x9b\x6d\xa4\xbd\xfd\x37\x8d\xb6\x7d\x1f\xf4\x8b\xed\x4d\xbd\x3e\xec\xb7\x51\x5f\xbc\x0f\xba\xff\xa6\x9e\xbc\x1f\xfa\x34\xdf\xcb\xed\xc3\x5e\xac\xbd\xda\x1f\x70\x3b\x2c\xe9\xdd\xd0\x0a\x3a\xb3\xf0\xae\xee\xae\x0e\x4e\xaa\xee\xce\xa9\x6e\xc6\x7e\x4b\x01\xb8\x01\xca\x94\x60\xd6\xd4\x82\x35\xc0\xa3\xaa\xb2\x14\x0a\xda\xde\x57\x90\xe9\xe8\xdb\xd9\x23\x93\x06\x66\x4b\x40\x9d\x88\x36\xcf\x8e\x82\x2c\xa4\x0c\xb8\x9c\x03\x78\x67\x04\x56\x3d\xaf\x20\xa1\x11\x58\x3f\x82\xd1\x69\xe5\xe6\xf1\x64\x1b\x42\x86\x2e\x84\x8a\x7a\xdd\x93\xd6\x3c\x71\x7b\xa8\x81\x99\x81\x8a\xc0\x34\x4f\x7f\x57\x64\xdc\xce\x75\x99\x4f\xbc\x7a\x38\x69\x28\x09\xec\x29\xa4\xd6\x18\x6f\x5f\x61\x7e\x2b\x82\x6a\xaa\x34\x13\x91\x34\x0f\xaf\xaa\x52\x84\xa0\x62\x95\x2a\x45\xa2\x17\x4a\xfe\xa7\x26\x04\xc8\xb5\xe0\x1c\xe2\xc6\x49\x52\xa6\xaa\x2c\xbb\x7b\x1e\x42\x47\x25\x40\xaf\x44\xb9\x14\xfc\x8e\x9b\xb7\x95\xd2\x42\x63\xd4\xbd\x47\x0d\x61\x0a\x90\xca\xeb\x1f\xe2\x54\x63\x9d\x40\x6d\x1b\x86\xd8\x7d\xe2\x32\x07\x81\xee\x34\x3d\xce\x16\x72\x25\x94\x87\x1c\x7f\x9a\xf1\xd0\x3f\xdb\xa3\xac\x12\xec\x79\x65\x75\x48\x5a\x60\xdc\x46\xc0\xc7\x90\xe3\x44\xf1\xd2\x78\x9c\xe8\x16\xea\xbe\x9d\xf9\x4e\x67\x1f\x72\x27\xe4\x0d\x60\xeb\xc7\x71\xfd\x4a\xb9\xf7\xad\x36\x90\x35\x59\x02\xd9\x2d\xde\x14\xa1\xac\x96\xf7\x3f\x82\x52\xd2\x1c\x0f\xda\x36\x0c\xa9\xcb\x01\x02\xb6\x26\x6c\xe6\xd8\xff\x1a\x95\x9c\xd3\x79\xf3\x49\xb2\x01\xba\x0f\xb5\x4f\xa0\x7e\xd7\xf6\xe0\xb9\x4e\x9d\x16\x36\x66\x61\x29\xe3\xe6\xe3\x14\x6f\xc1\x33\x19\x1d\x46\x54\xd2\xca\x52\x98\x42\x23\xf6\x7f\xfc\xd8\x71\xe4\xff\x92\xb6\x91\x6c\x87\x5d\xdc\xc2\xd1\x40\x74\xb6\xff\x88\x52\x6f\xd5\xe1\x17\xd2\x4e\xaf\xfe\x02\x0a\xbc\x50\x4b\xae\x12\xb4\x9d\x0e\xaf\x44\x61\x0e\x8d\x5c\xa0\xbe\xfe\xe7\xbf\xfc\x05\x94\x77\x4f\x92\xc3\x57\x27\x47\xc7\x2f\x4e\xa6\x79\xfa\x19\x69\xf2\x05\xb7\x56\x94\xea\x09\xfb\xaf\x83\x37\x5f\xbd\x9b\x8c\xbe\x3d\x38\xf8\xf9\xd1\xe4\xaf\xbf\x7c\x75\xf0\x66\x0a\xff\xf8\xc3\xe8\xdb\xd1\x3b\xff\xc7\x57\xa3\xd1\xc1\xc1\xcf\x3f\xbc\xf8\xee\xf2\xfc\xe4\x17\x39\x7a\xf7\xb3\xaa\xf2\x2b\xfc\xeb\xdd\xc1\xcf\xe2\xe4\x97\x0f\x1c\x64\x34\xfa\xf6\xf7\x77\x9c\x68\xc7\xba\x94\xbe\xb5\x28\xbd\xea\x4f\x06\xac\x39\x29\x4a\x21\x72\x60\x7f\x5d\xb2\xb5\x9a\x5e\xd2\xd6\x50\x5e\xc0\xd2\x5f\x8e\x27\xfa\xa7\xa9\x85\x63\x93\x06\x59\x67\xa6\xaf\x21\xc3\x52\x6a\xa7\xfc\x4c\xd9\x4b\x90\x83\xec\x4c\xac\x44\x39\xf6\xa3\x3e\x77\x37\x9d\x87\x7b\x62\x37\xdc\xb6\x3b\x3a\xe6\xf8\x77\x5c\x13\x3f\xf7\x1e\xc4\xc3\xbe\x25\x34\x79\xe0\x4f\x53\xf6\x23\x2f\xa5\xae\x0c\xe9\x22\x31\xdc\x37\xa6\x90\x05\x49\x02\x5e\x09\x0a\xf0\x84\x41\x42\x65\x98\x8f\xf1\x04\xda\x1c\x05\x7e\xfd\x74\xbb\x48\x90\xd6\xad\xd4\xca\x3f\xaa\xf4\xa9\xae\x1b\x48\xe1\x28\x0c\xb6\xf2\x7f\x2f\xd1\x4c\x3c\x51\x18\xc6\xcf\x03\x78\xab\xd3\xc4\x70\x94\xa5\x5c\xf8\x84\x6a\x78\x7f\x34\x5f\xa3\x4f\xc3\x0e\xe9\xb0\xa4\x5d\x8e\x69\xd7\xbc\xfe\xa2\xfd\x7e\x3d\xb6\x45\x13\x4f\x39\x86\x64\xf6\x15\x45\xf5\xb9\xd9\xc3\x7d\x02\x42\x64\x92\x94\xd2\xca\x84\x67\x7b\x20\x9c\xfc\x57\x49\x56\x39\x3d\x31\xfe\xb6\x14\xcc\x5e\x6b\x7c\x0a\xcf\xd8\x95\x58\x5f\xeb\x32\xf5\xf2\xd9\x3f\xb1\x5e\x0b\x63\xfd\x23\x9d\x3d\x07\x07\x18\xdd\x0c\x65\x2e\x4a\x36\x13\xde\x83\xde\xba\x79\x3d\x65\x47\x6a\x4d\xe1\x47\x15\x17\x19\x46\xc8\x6c\xa0\x23\xa0\x16\xd5\xd8\x24\x24\xc4\xfc\xd3\x38\x96\x7f\xde\xe4\x5d\x76\x0a\x58\x38\x05\x5e\xfa\x7b\xf7\xb2\x2e\xa9\xca\x09\x4e\x47\x89\x35\x5a\xda\x7f\xfd\x49\xb8\x85\xd3\x6f\xa4\x12\xc6\x7c\xe7\x96\xb2\x8f\xba\xda\xdc\x1d\x1c\xd4\x12\x1a\x1b\x2a\xa5\xea\x94\x62\xe1\x8e\x14\xc6\x88\x1d\x1b\xd6\x69\x7d\xe7\x94\x1d\xc1\x07\x90\x13\xef\x34\x2f\xa8\xa2\x73\x83\x49\x6b\xda\xcd\xe5\xf1\x8e\xa3\xb3\x63\x9f\xbb\x8c\x9a\x82\x69\xc2\xa5\xa3\xca\xdc\x9c\x09\x68\x7a\x94\x41\x2b\xfe\x5d\x71\xe8\x93\xbb\x77\x59\x56\x62\xaf\x9b\xaa\x84\x40\xfc\x87\x7f\xfa\xcb\x23\xd0\x96\xc2\xf3\x26\xf0\xbc\x2e\xaa\xd2\xdd\x73\x64\x3a\x65\xc7\xb4\x13\x83\x5e\xc5\xfb\xc1\x13\xdc\xdb\x1d\x14\xb4\x82\xda\x5e\x58\xa6\x40\xf3\x4e\xae\xd5\x4e\xb9\x30\xdd\xb3\x60\x26\xf5\x74\x2f\xef\xde\xc3\xac\x4f\x02\x4b\xe3\xb9\x43\x44\xb9\xea\xd1\x70\x55\x0c\x2e\x49\x78\x4e\xe4\xd9\xc5\x56\x17\xf4\x31\xa4\xc3\x02\xe3\x82\xa8\x00\xb0\xc7\x75\xd1\x23\xf5\xb7\x03\xbf\x41\xe3\x15\xd2\xea\x7a\xf9\xb7\x5f\x35\x46\x22\xce\xed\x45\x45\xeb\xcb\x50\x43\x4e\x09\xd3\xbe\x36\x07\xc0\xa7\x02\x6a\x8c\x07\xf3\x87\xae\x27\xa1\xb1\x07\x54\xe6\xa0\x56\xe0\x27\x6f\xa2\xe4\xc8\x54\x30\xbe\xe2\x32\xc3\x6e\x27\xce\xa4\xd3\xa6\xe1\x64\xc7\x09\x25\x5a\x99\x2a\x87\x67\xe4\x4e\xba\xa0\xcc\x78\xa3\xea\x9a\x54\x85\xad\x56\x6e\xad\x4a\x75\x33\x3c\x5e\x2b\x9e\xcb\xc4\xbf\xe1\x51\xe6\xdb\xbb\xb5\xea\x52\xfd\xd8\xc1\x4d\x2e\xf3\xbc\xb2\x6e\x9a\x77\xc4\x1b\xbd\x67\x7e\x14\x2d\x64\x1c\x37\x17\x6f\x79\x62\xb3\x35\x38\xaa\x9a\x37\xd9\x65\xa9\xab\xc5\x92\x71\x06\x7f\x5f\xc0\x57\x53\x76\x6a\x9d\x2d\x09\x2d\xd9\x09\xae\x41\x5a\x94\xdf\x95\x92\xff\xae\x44\xb6\x66\x12\xba\x06\x85\x98\x49\x73\xd8\x08\x23\x1e\xfa\xc9\x44\x3d\x6c\x50\x0b\x10\x22\xf5\x90\x07\x64\xda\xdf\x30\x79\xb4\xdb\x41\x7b\x70\x02\x9f\xdf\x3d\x89\xe7\x9e\xf8\x67\x87\xec\xbf\x3e\x6c\xb3\x6b\x26\xd5\x26\x16\xdb\xf6\x15\x96\x51\xf8\x38\x69\xaf\x31\x98\x2a\x75\x02\x16\xb4\x63\x3c\x3e\xbb\xf8\xf5\xf9\xd1\x3f\x4e\x9e\x7f\xf2\x5a\x12\x9c\x65\x6f\x62\xe0\x59\x88\x72\x5e\xa9\xcb\x59\x64\xb2\x35\xf6\x6c\xf7\xf7\xbc\xb7\x56\x1b\x0d\x01\xd3\xa7\xeb\x50\xb3\x5b\x73\x7b\xd4\xb6\xc3\x9e\xb7\x0e\x3b\x19\x09\x24\x87\xa1\xa7\x94\x0a\xf1\x37\x5e\xa7\x39\xf4\x2b\xfb\xef\x91\x61\xd5\xa0\xd3\xa5\xc8\x0b\x67\x1f\x0f\x46\xaf\xa6\x74\x8e\x87\x7f\x0f\xe1\xfc\xad\x1f\x4e\x40\x14\x74\x82\x59\xff\xcb\x38\x69\x07\xf2\x4e\xd1\xd9\xcb\x99\x12\xd7\xcd\x87\xf9\x94\x1e\xff\x8b\x99\xae\x14\x75\xbe\xf7\x83\xff\x84\x28\x1e\x94\x93\x02\xd8\xdd\x99\xb0\xde\xba\x6b\xae\x39\x55\x9b\x63\x3b\x28\xba\x0f\x15\x87\x38\xac\xb3\xe5\x37\x33\xc1\xfe\x06\x10\x27\x3c\x17\x7f\x9f\xfc\x2d\x30\x25\xf8\x7b\x4c\x87\xb4\xf5\x71\xed\xd0\x6a\xca\xc8\x29\x3a\x31\x20\xc7\x9f\xba\xa0\x69\xd5\x70\x80\x7b\xb3\x54\x86\x7c\x00\xa7\x12\x29\x50\x8b\x7c\xcb\x48\x67\xc9\xc2\xcf\x29\x7a\xd0\x9c\xf4\x81\x98\x2e\xa6\xcc\x6a\x0d\xd0\x24\x88\x82\x7e\xa4\x98\x78\x2b\x0d\x58\xcc\xed\x57\x8c\x0d\x65\x4a\xdf\xc1\x47\xe8\x6b\xd5\x04\x0a\xc1\xd2\x65\x4a\x99\x32\x64\x21\x46\x69\x2a\x7c\xa5\xa5\x4f\x8d\xe3\x0a\x82\x3f\x18\xa9\x08\xc4\x99\xad\x59\x2e\x0d\xb4\xc2\x01\x3c\xc5\xb4\xca\xf0\xe6\x14\x91\x48\x10\x9e\x0c\x5d\x0d\x6e\x6d\xa1\x18\xaa\x51\x99\x5d\x0f\xda\x52\x00\x9c\xb8\xc8\xf5\x4a\xa4\xb7\x29\x57\xd4\x01\x05\xca\xeb\x17\x6d\x4d\x31\x94\x58\x34\xbc\xfb\x8d\xa7\x44\x05\x69\xa5\xce\x58\x91\x71\x25\xa8\x46\x3f\x78\x24\x36\xf9\x74\x57\x04\xf9\x61\x72\x5c\x9c\x59\x01\x89\x2e\x57\x62\x7d\x67\xb6\xdd\x41\xad\xd8\x7c\x38\xbe\x47\xce\x8b\xbb\x99\x22\x6e\x33\xf4\x76\x35\xef\xbf\xc2\x81\x58\x51\xfb\x96\x37\x8a\xa9\x43\xb2\x29\x70\x15\xf2\x2a\x1f\x01\x32\xc5\x98\xbd\x54\xcf\xb0\x54\x77\x8c\x8e\xe6\x06\x10\x22\xde\x34\x28\x62\xc9\xe1\xef\xe8\xdd\x27\x38\xe5\x2e\xfe\x89\xbb\x5b\x7e\x51\x10\xab\xa7\x23\x72\xff\x55\x6b\xac\x86\x15\xdc\x08\xd2\x35\xc5\x08\x24\xb4\xa1\x27\x87\x2d\x4a\x5d\x15\x5e\x02\x34\x7b\x2a\xd7\x8d\x04\xbd\x18\x40\xef\x5e\x73\xe8\xc0\x72\xc0\x96\x16\xb5\x58\x4b\x9d\x36\x69\xcc\x78\x2b\x57\x2b\x2b\xe5\xfb\x0f\x0b\xf0\x00\x46\x69\x91\x7b\x99\x58\xf0\x64\xbd\xd7\x7c\xce\xb6\x24\x54\x34\x18\x65\x8e\xbd\x9b\xf0\x79\x75\x79\x35\x54\x61\x83\x41\x8c\x66\x3f\x5a\x39\x86\xa6\xe8\xbd\x8f\x1e\x1f\x04\x83\xec\x65\x8f\x20\xe1\x9f\xfe\xf2\xa7\x89\x4f\x03\x80\xa9\x7c\x92\x0d\x15\x92\x48\x07\x75\x6b\x37\xd6\xcc\xc9\x71\x69\x0a\x58\x5f\x90\x53\xb5\x67\x31\x3c\xfd\x36\xcf\xef\xf6\x41\xfc\x02\xd4\x43\x7c\x42\x72\x49\xb5\xe8\xeb\xea\xdd\xbb\x68\x0e\x45\xbb\x51\x17\xfc\xdf\x55\x5d\x72\x4d\xb9\x18\x28\xee\x23\x12\x13\x51\xa0\x06\xb9\x9e\x53\xcd\x1b\xa3\x5d\xf8\xe1\xdb\xb0\x1e\xe8\xf0\x9b\x3f\x7d\xfd\x18\x9c\xb0\xf5\x67\x93\xc8\xbf\xbc\xc5\xe5\x42\xdd\x6d\xbd\xfb\x84\x22\x4f\x6e\xa5\xce\x75\x5a\xbf\x6b\x70\x8d\x36\x1d\x2d\x9f\x91\x33\xa5\xb9\x6e\x40\x82\x3a\x73\x04\x78\xe7\x39\xaa\x59\x8b\x8a\x97\x29\xb8\xdc\x6b\x22\xee\x7c\x14\xdb\xae\xe1\x7c\x14\xbe\x8f\x51\x7d\x24\xd0\x8f\x77\x02\x58\x49\xcd\x4f\xa3\x96\xc5\x9c\x9c\x1b\xa8\x5c\x77\xee\x06\xfe\x5b\x56\x04\x5b\xa9\x8e\x7d\x14\x93\x76\x6f\xde\xa5\xce\x52\x50\x21\x88\xc7\xf8\x47\x31\x6e\x6d\x29\x67\x95\xa5\x5c\xb6\x44\xe7\x79\x13\xd8\x0a\xc3\xdb\x66\xca\x6a\x64\xa3\x38\xcf\x00\x64\xfc\x94\xb1\x0b\x21\x60\xed\xe2\x79\x80\x06\xea\x85\x0c\xb1\x61\x3d\x67\xc2\x6d\x24\xdc\x20\x9f\x28\x77\xa7\xfb\xc1\xa2\x8c\xe7\x9e\xa9\x95\x7b\x47\x21\x94\x1c\x27\x26\xa3\xea\x87\x92\x89\x17\x45\x26\xb1\x0e\xbe\xa5\xb3\x43\xcd\x77\x9d\x1a\x4f\x25\x60\x8e\x16\x14\x1e\x80\xe3\xfa\x43\x35\x73\x86\x3e\xf8\x19\xc0\xe2\xc3\x04\xb2\x6b\x37\xc4\x52\x16\x78\xaa\xb9\x0d\x3f\x07\xdf\x40\xdb\xec\x7d\xe2\xa4\xd2\x63\x74\x15\xe8\x6b\x48\xdd\xfb\xee\xf4\x38\x68\x0f\xee\xae\x67\x17\x98\x77\xfd\x35\xde\x65\x84\x5d\xc8\x94\xcd\xb0\xba\xc6\x69\x92\x07\x4a\x5c\x63\xbd\x3e\x39\x3c\x42\xf0\x73\xe5\xeb\xd8\x71\xb4\xf0\x70\x1a\x72\xc4\xbe\xc1\x31\x0b\x51\xfa\xd4\x89\x99\xa4\x7a\xde\x97\xaf\xf6\x7d\x4e\xe1\xf5\xa4\xbc\x9e\x4c\x26\x13\x4a\xc2\x07\xfd\x75\xdc\xa0\x41\x50\x73\x73\x9d\xca\xf9\xba\x45\x09\xb0\xc0\xc3\x23\x60\x47\x72\xb5\xa6\xd9\x4d\xd9\x99\xb6\xc2\x63\x50\x04\xc3\xba\xee\x2c\xec\x5e\x11\x62\xc1\x90\xaa\xac\xcd\xd4\x7b\x2a\x7c\x9a\xeb\xdd\x2d\xe0\x7e\x39\x53\x7d\x30\x33\xb7\xe4\xf3\xf7\x4d\x22\xde\x56\x22\xe0\x43\x62\xa1\xf5\x9c\x9e\xe3\x26\x05\x88\x83\x1b\x16\xc6\xcb\x21\xda\x35\x14\x1a\xc3\x54\x0a\xf1\xb6\xd0\xd8\xae\x09\xdc\xe4\xe7\x3a\xdd\xcc\x21\x85\xb2\x5d\x77\xaa\xa0\x12\xb2\x71\x6a\xc8\xd4\xc2\xb4\x65\x4f\x04\x36\xe3\x6e\xc8\x30\x9d\x83\xd6\x3e\x19\x41\xe4\x06\x86\x06\x79\xa7\x34\x35\xe7\x67\x5a\x31\x51\x2c\x45\x2e\x4a\x9e\x35\x1f\x44\x50\x6a\x4f\x1c\xbb\x2d\xdd\x2e\xc5\x3c\xcd\x9c\x17\xc8\x6d\x81\x79\xa6\xb2\x04\x48\x5a\xd9\xc8\x9f\xde\x7b\xa9\x5e\x69\x6d\x5f\x48\x03\x56\x1d\x65\xac\xa0\x0d\xbe\xb7\x4d\xd5\xf7\xdf\xd5\x75\xe9\x7d\x77\xf2\x27\x4b\x52\x66\xbe\x41\xff\x10\xbc\xd6\x71\x10\xc7\xb4\xee\xda\x83\xff\x35\x21\x2d\x83\x29\xea\x85\x56\x48\x98\xdb\xd6\x61\x7f\xa3\xbd\xfe\x27\xee\xaf\x4f\x3e\x49\x6e\x1b\x90\xe6\x3d\x17\xfd\x33\xe2\x5e\xb0\x65\xce\x34\x9c\x93\x9e\x9b\xe6\x74\xb3\xad\x7f\xbd\x45\x40\xc7\x75\x7b\x89\x43\xd0\x56\xab\x09\xb4\xd9\xae\x8c\xcf\x2e\x2f\x7d\x5e\x5e\x43\x00\x91\xd7\x1b\xc5\x26\xd4\xe1\x32\x5e\x3b\x3b\x9c\xea\xa4\x4c\x55\x8a\x50\x46\x9a\x6a\x51\xb7\xdc\xe6\x86\xbd\x3e\x3d\x66\x8f\xd8\x01\x94\x50\x07\x18\xbd\x90\x08\xd0\xae\xf3\x9d\xfb\x21\x9a\x4e\x1d\x42\xed\x54\x1a\x79\x51\xdb\x13\x3f\x13\xbe\xfb\x09\xb4\xa3\x79\x78\x7b\xbc\xeb\x7e\xec\x06\x94\x10\x4a\x91\x06\xe0\x41\xaf\x3b\xf0\xa0\x58\xb1\x76\xdb\xab\x49\x2b\xdc\x43\xb9\xb0\x1c\x10\x61\x91\x37\xf9\x1b\x1e\xe4\xea\xfd\xd6\x39\x54\xb3\x9a\x70\x80\x4d\x75\x71\x02\x03\x22\x62\xe7\x5b\x4b\x6a\x3c\xda\x0e\xe9\xa6\xed\xe0\x79\xc1\x7b\x80\x06\x7c\xc0\x30\x80\x38\x96\x5c\xa5\x3a\xdf\x78\x9a\x5b\x4d\x30\xde\xa2\xd5\xdc\x6d\xbb\x9b\xae\x5e\xf9\x07\xfd\xb2\x0f\xc0\xc6\x1f\x00\x9f\xec\x39\xf8\x0a\xa4\x09\x3b\x01\x9d\x07\x50\xb9\xbf\x61\xb6\xf6\x86\xaf\xec\x9d\x4c\x50\xea\xac\x63\xd6\x40\x33\xc7\x42\x67\x84\x34\xe1\x5f\xdb\x0d\xfc\x60\xdf\xda\x76\xcc\xe5\x6c\xb3\x97\x75\xd1\x7a\x6b\x70\xe7\x3c\xd4\xb7\xae\x3a\x49\x69\xd6\x7e\x6b\xa8\x3b\x6e\xbc\x35\xc8\xdd\x87\xf8\xd6\xcd\x32\xf3\x01\x84\x09\x0d\xc8\x34\x15\xbb\x53\xbb\xc7\x36\x12\x6d\x5d\xc6\x0a\x4e\xa8\xcf\x8b\x8f\xf6\xc1\x2a\xc4\x6a\xb4\x4f\xcd\xba\x75\xc2\x33\x40\x84\xe8\xba\xce\xac\xbd\xd6\xed\x21\xa3\x8a\x19\xee\x66\x0b\x9f\x45\x75\x9f\x1c\x61\xb4\x75\x1d\xaa\x6e\x85\xa5\xc9\x4d\x47\xbf\xf4\x69\x89\x4e\xfe\xd6\x65\xa8\xf1\xaf\xad\x06\x14\xa4\xba\x5d\x1f\x87\x09\x0a\x4c\x3b\x29\xb8\x5d\x8e\x19\xa4\xba\xc8\x55\x48\x4d\xb9\x42\x53\x6a\xbf\x51\xdb\xea\x77\xac\x7f\xb4\xcf\x38\xa6\x91\xc1\xe5\xe3\xd5\x90\x39\xf2\x2f\x69\xd8\xde\x73\x4f\x80\xbd\xcf\x99\x41\xef\xe1\xfb\x84\xb5\x43\x2f\xd6\x95\x54\x29\xb5\xa6\x69\x90\x26\xd4\x51\xa3\x6e\xe8\x3d\x4c\xfe\xac\xf3\x52\x80\xb3\x37\x90\x86\x4d\x3a\x6f\x06\x4a\x12\xf0\xa9\x22\x93\x1b\x94\x4c\xef\x53\xf1\x0f\x69\x0f\xf3\x5a\xc1\x4a\x2b\x00\xa9\x50\x7a\xcb\x7d\xfe\x5d\xba\x25\x19\xf5\x61\xbd\x1b\x68\x22\x3d\xd9\xef\x51\x88\x4e\x2f\x10\x9c\x24\x52\xe1\xeb\xa6\x21\x64\x17\x82\x0d\x29\x55\x4b\xf5\x1e\xc3\xea\x50\x51\xf2\x86\x74\xc2\x1a\xb8\x9c\x97\x6b\xf6\xdd\xe9\x31\x81\xde\x90\xa3\xf3\x20\x8e\x82\x8f\xb0\x03\x09\x46\x22\x72\x91\xcf\xd0\xfb\x69\x36\x0b\xc1\x1b\x90\x62\x21\x1f\xae\x92\xe9\x2d\x06\x6d\xdb\xfc\x50\x3a\xc6\x50\xf0\xef\x5e\x02\xb2\x02\x19\x30\x6a\xbd\x5d\x6b\xff\x28\x33\xc4\x3e\x6a\xd6\x9d\x15\x74\xe6\xca\x95\x18\x33\xb1\x12\x8a\xb2\x12\xd7\x70\x87\x93\x6d\x52\x25\x59\x95\xfa\xc7\x41\x8f\x00\x63\xef\x4d\x1c\x76\x43\x2e\xee\x8c\x5b\xdc\xb7\x23\x54\x2f\x23\x1a\x91\x84\x7a\x9e\xb8\x0b\xc2\x23\x5a\xea\x2c\x65\x3c\x1c\xbf\x90\xca\x9b\xfa\xe7\x6c\xa4\x7b\x42\x0e\x2b\x25\x35\x55\xaa\x06\x3b\xf1\xf7\x1f\xb4\x15\x26\xcf\xf1\x46\x04\xd1\xe7\xfd\x76\x19\xaf\x54\xb2\xfc\xad\x6c\x99\x2d\xd4\x0f\x81\x20\xce\xae\x44\xa9\x44\xc6\x0a\x5e\xf2\x5c\x40\x9b\x18\xef\x40\xf8\xf4\x99\xfe\xfd\xf0\xac\x7b\x60\x51\x4f\xd0\xb9\x71\x0f\xc5\x09\x7d\xb0\x81\xb7\x66\x8c\x70\x3f\x25\xec\x75\xd8\x69\x19\xd9\x10\xe5\x04\x40\xd1\x41\x5e\x0d\xbb\x44\x3e\x8c\x77\x6b\xc2\xcf\x0d\x60\xfb\xfd\x84\x03\xd6\x38\x99\x3e\xcf\xe3\xae\xce\x44\xaf\x50\x6e\xa2\xd3\xef\x9b\x0d\x47\x5d\xb3\x95\xe7\x27\x8e\x24\x74\xe6\xbb\x00\x65\xf5\x59\xf9\xff\x16\xb9\xe1\x4f\x4b\x01\x35\x66\x3c\xbb\x28\x44\x32\x80\xfd\xf1\xdd\x8b\x8b\xa3\xe6\xa0\x20\x94\xb0\x70\x6b\x29\xe0\xfb\x08\xf5\xe2\x5a\xcc\x96\x5a\x5f\xb1\x83\x2d\xc8\x5d\x51\xb2\x94\x91\x0b\x73\x48\xdb\x7b\xe2\xe6\x3d\x62\x52\x41\x8b\xa5\x20\x54\x43\x6b\x2a\xff\x90\x24\xcc\x02\xd6\x8a\x72\x9d\x49\x0c\x6f\x4e\xf3\xac\x57\x42\x5a\x6f\x9e\xb4\xb9\x18\xdd\xab\x9b\xde\xb3\x20\x37\x21\xb8\x6d\xa5\x1a\xba\x7b\xee\x85\x24\xe4\x8c\x70\x1a\xf8\x00\x74\xf8\xbe\x1e\x2d\xee\x08\x20\xe7\x8d\x66\x85\xb5\x19\x19\x42\xb9\xfb\xd0\x34\x9d\x7e\xba\x1f\x9b\x1d\xcd\x9a\x9a\x38\x39\x17\x11\xed\x7c\x7e\xc9\x4c\xb0\xa5\x56\xba\x24\xa4\x8e\x1a\x8b\x06\xd8\x0c\x26\xf0\xc2\x0a\x10\xbf\x8d\xa6\x1a\x95\xed\xfa\x34\xde\x79\xc6\x17\xd0\x74\xb9\x05\x28\x03\xcc\x55\x57\x18\xf3\x8d\x6f\xf6\xe5\x54\xbe\xa1\x28\xf4\x33\x33\xc8\xc5\x7c\xa8\x97\x52\x9a\x21\x47\xe6\xc8\xcd\x7b\x8e\xe9\xb5\xfb\x0d\x18\x8b\x3a\x8f\x33\x54\xb9\x05\x83\xa8\x41\x60\xe4\xbc\x07\x32\x94\x4e\x45\x15\xea\x94\x07\x9a\xcb\xb7\xee\x29\xf1\xaf\x62\xc0\x0c\x28\x4b\x52\x93\xed\x5f\x8f\xa6\x8c\x9d\xd6\x76\xed\xd8\xad\x62\x7c\x67\xd4\xec\x53\xc1\x17\x67\x88\x78\x81\x2f\x10\xc7\xa1\xa8\x6f\x67\x9f\xfd\xdd\x1d\x6d\x3f\x04\x92\x07\x3a\xea\x10\x50\xa6\xe1\xdc\x42\x7b\xf1\xdd\x27\xc0\x0c\xb6\xf1\x00\x41\xe6\x4d\x19\xfd\xc9\x45\xfb\xa7\xe4\x61\x46\x94\x2b\x99\x88\xa3\x24\xd1\x95\xea\x95\xa3\x7b\x2c\xdc\x2b\x70\x2b\xd2\x8b\xc6\x98\x18\x8f\x48\xe1\x5b\x4c\x89\xe7\x99\xe4\x88\x94\xdd\xbc\x13\x4b\x2c\xeb\x71\x20\x9e\xd1\x9a\x21\x6d\x19\x63\x05\xef\x96\x6f\xdb\x93\x42\x7d\x4b\xac\x36\xdf\x78\x9b\x84\x6b\x51\x90\x42\x19\x1b\xe5\x53\x1f\x56\xbb\x66\xb9\xb9\xaa\xf1\xc3\x05\x14\x71\x84\xc3\x14\x7d\x4e\x2f\x3a\xe1\xf8\xd4\x4e\x98\xe2\x1d\xa8\x6b\x1d\xdf\x73\x2f\x7f\x64\x9e\xfd\xef\xe3\xb3\x7e\x15\x47\xa1\x75\x32\x42\xb4\x2c\x69\xe8\xa0\xaa\xc7\xc8\x92\x31\xc2\x96\x7b\xf2\x98\x95\x9c\xba\x42\x72\x64\x42\x99\xe0\xe8\x53\x61\x07\x51\x85\xd7\x68\xea\x78\x7a\x9d\x4b\x80\xac\x9e\x1a\xf8\xe7\x82\x2b\x13\xa1\xa8\x09\x18\xda\x3b\xf5\xc2\x7c\x50\x10\xd2\x6a\x93\xf7\xe0\xc0\xbb\xa4\x9b\x77\x18\x5b\x56\x89\x65\x95\x35\xee\x73\x7c\xb8\x67\x98\x1f\xf0\xf8\x52\x2c\xa4\xb1\x25\x01\xce\xb9\x01\xeb\x49\x90\x57\x28\xdc\x72\x25\xd6\xec\xfb\x1f\x4e\xfe\xf9\xeb\xf3\x97\x4f\x8f\x9e\xff\xfa\xe2\xe8\xe9\xf7\xa7\x67\x27\x6f\xde\x5c\xfc\xf3\xe2\xf2\xe4\xc5\x9b\x37\x4f\x11\x24\x97\x10\xe5\x2e\x84\x7d\xf3\x86\x76\xaa\x79\xf3\xe6\x32\x29\x64\xf1\xe6\xcd\xb9\xf7\x81\x60\xd3\xd0\xff\x7d\x7c\x06\xfc\x13\x81\x8d\x42\x52\x18\xc8\x56\x24\x3a\xcc\x7b\xc9\x4d\x9d\x82\xda\xa8\xd3\xec\xd0\x68\xa6\xab\xb8\xdb\x8a\xea\xdd\xeb\xb0\x2f\xc1\x19\xec\xbb\x7d\x7b\x2f\x6d\x5d\x70\x3f\x13\xf6\x5a\x10\x12\xd7\x56\x1c\x79\xde\x2e\x97\xa7\xb4\xf4\x2d\x1d\x85\x3d\x52\xce\x4a\x8a\x6b\x84\x4d\x95\x0b\xc5\xb3\xa8\xad\x35\x20\xf3\x21\x3a\xdb\x26\x5a\x3d\x28\x49\x85\x4e\x43\x0b\xef\x96\xd7\x7e\xc3\x63\xdf\x28\xbf\xc4\x7e\x04\x22\x65\xe7\xa7\xc7\xec\xf1\x14\x95\x9c\xd3\x63\x6c\x8f\xb2\x15\x2c\xdd\x5b\xaa\x4e\xa0\xa2\xf4\xdd\x52\x93\x51\x6f\x80\x2e\xcc\xa8\xc3\x0e\xa8\x66\xa9\xce\xf9\x5d\x9b\xf5\xbf\xa7\xee\x71\x5e\x65\xd9\x9a\xfd\xbb\xe2\x19\xea\x00\xe7\x3a\xdd\xe4\x4c\x7b\x7f\xf3\x1f\xfd\x7d\xfa\xb7\x30\x8f\xbf\x4f\x03\x82\x01\x90\xed\xef\x53\xb3\x4a\xa6\x7f\x23\x8c\x3f\x46\x37\x6d\xcd\xa0\xde\xa8\x92\x25\x7d\x16\x7f\x03\xcf\xe6\xa0\xef\x7e\x92\x32\xc9\xa8\xbd\xf1\x77\x25\x4f\xc4\xb9\x28\x25\xa8\x4c\x5a\xa5\x7d\x8a\x26\xfd\x96\x61\xa9\x47\xbd\x96\x8a\x19\x1c\x36\x90\x40\x09\x91\xa2\x92\x48\xb3\x10\x6c\xe1\x26\x01\x0b\x83\x5a\x20\x40\x4b\x24\xa5\xe0\x98\x88\x4f\x38\x13\x1e\xca\x78\x4a\xee\x33\x1f\x1c\x76\x1a\xbf\x12\x0b\x0c\xf1\x52\x1c\x01\xc3\xc8\xc8\x65\x11\x7e\x30\xc4\x36\x8d\xd5\x05\x93\x79\x2e\x52\xa7\x00\x65\x6b\xb6\x92\x1c\x39\xbf\x5b\x1b\x3a\xa7\x07\x4a\x33\x0d\xde\xf8\x4a\x49\x72\xce\x2d\x2b\xcb\x52\x7d\xad\x46\x75\x03\x7b\x7c\x80\xb3\x56\x64\x36\x6e\x14\x1e\xc3\x2b\xb1\x02\x08\xdb\x44\xeb\xf0\xfa\x12\xcc\xb0\x71\x1b\xe9\x1e\xdb\x88\x87\xe0\x08\x08\xca\xe9\x39\x88\x47\xc0\xae\x8b\xee\x31\xe4\x24\x94\x65\xbc\xd1\xc2\x9a\x5e\xca\xf3\x12\xcc\xcb\x43\x2e\x16\x0f\xe8\x7e\x3d\xd7\x65\x22\x67\xd9\x9a\x2d\x79\x56\xb7\xb3\x8e\x69\x03\x56\x64\xfc\xfa\x99\x56\x8b\x58\x50\x23\xb4\x39\x54\x88\x0b\xae\xaa\x02\x9f\xe7\xe4\xdb\x5a\x57\x37\x18\x0c\xdf\x3c\xf2\xaf\x7a\x0f\x60\xa3\x77\x0a\x1b\x59\x9d\x09\x5c\x9f\x3e\x27\x65\x6b\x3d\xf6\xbe\x89\x47\xef\x42\x88\xfb\xa8\xb9\xbd\xf4\xc8\x25\x6e\x47\x5c\x86\xf9\x83\xa5\x61\x2d\x87\x82\x70\x77\xda\xf1\x1b\xa8\x05\x5c\x33\x27\xb5\x08\x99\x2c\x46\x16\xb0\xa5\x2c\x32\xc1\xfe\x76\x25\xd6\x63\xc4\xa4\x45\x25\xe4\xef\x51\xa7\xb0\x80\xea\x87\xbd\x03\x74\xc9\xfe\xe6\xff\xf5\xf7\x4f\x58\xbf\xdb\xc7\x8b\x8a\x2f\xd5\x3b\xf2\x75\x82\x35\x42\x4d\x90\x5a\xa4\x2c\x95\x0f\x59\x8d\xe4\x9a\xb2\x13\xc0\x4b\x40\x8d\x94\xba\x25\x65\x59\xe3\x66\x43\x9a\x4d\x13\xe0\x14\xfc\x2f\x51\xed\xd0\x99\xa6\x02\x6b\x01\x48\xd1\x73\x51\xd6\x9f\x00\x83\x39\xd3\x27\x6f\x45\x52\xd9\x4f\x09\xb8\x88\xd7\x95\xe8\xdf\x8b\xfe\x07\x11\x50\xb4\x91\x36\x4e\x0b\x0f\x75\x1b\xf5\xe9\x8c\x52\xf7\x6e\xa7\xed\x95\x58\x9b\xd0\x27\xe0\x0a\x47\x27\x34\x8c\xb0\x7f\xbd\x20\x3b\x79\x2b\x8d\x35\xff\xcb\x37\xc2\xcf\x67\x9e\x7f\xe3\xd0\x7e\x31\x61\xf4\xa8\x47\x84\xfb\x13\x1e\xf3\xa9\x09\xee\x5f\xa0\x37\xd5\x5f\x7a\x4a\x44\x5d\x20\xb8\x7b\xa7\x7d\x43\xc9\x5b\x5a\x41\x19\x5f\xdc\x4e\xa0\x4e\x3b\xc2\x1f\xe3\xfe\x44\x1a\x02\x5d\x4e\x9c\x92\xd7\x14\x33\xf4\x11\xdd\x24\x01\x18\x57\xae\x78\x26\x14\x75\x57\xca\xd2\x84\x97\x18\xa2\x27\x4c\x6c\x43\x0d\xda\x08\x0c\xd6\xc9\x38\xe2\x64\xf5\x2a\x1b\x0a\xe5\xf1\xd2\xca\xa4\xca\x78\xc9\xdc\x79\x5c\xe8\xf2\x8e\xd0\xd9\x78\xf5\x5a\x93\x7a\x8b\x76\x52\xe7\xf0\x6a\xf2\xf7\xf6\x88\xed\x5e\x1d\xa4\xbd\x38\x93\x49\x22\xfa\x67\x7c\x50\x0e\x9a\x0d\xde\xf4\xdc\xf3\xa6\xc0\x28\xe2\x6e\x0f\xb6\x09\x38\xb5\x00\xff\xf7\x28\x12\x1e\xe1\x64\x4e\xd9\x3f\x02\xca\xc8\x98\xd5\x3e\x63\xa8\xd8\xa5\x67\xd2\xb1\xa1\xe5\xaa\x0f\xf5\x5c\x97\x62\x25\x4a\x76\x90\x6a\xf8\x8d\x58\xc9\xc4\x8e\xa6\xec\xff\x71\x9a\x22\x38\x91\xbd\x3a\x49\xc7\x2c\x54\x29\xd7\x3d\x27\x1e\xb1\x03\xf8\x59\xac\x4a\x8e\x7c\xa0\x88\x9a\xd9\x7c\x66\xd9\x30\x3d\x22\xdc\x5b\xa2\xdb\x0d\x36\x8a\x9a\x62\x6b\x6b\x04\xc9\xaf\x03\x87\x0c\x3c\x51\x1a\x3a\xa5\x0d\xcf\x6d\x88\xb3\x78\x16\x1a\x36\xce\x7f\x83\x8f\x9e\x95\x62\x01\xe7\x0f\x4f\xcf\x27\x3c\x7d\x56\x17\x3a\xd3\x8b\xf5\x45\x51\x0a\x9e\x3e\xd5\xca\xd8\x12\x58\x43\x9f\x16\x05\x37\x8d\x19\x81\x5b\x2e\xf5\x35\xe3\x94\xc0\xa6\xe7\xd8\xe4\x41\x57\x8b\x25\xb6\xb0\x84\x1f\x32\x9e\x94\x1a\x00\x5b\x71\x38\x32\x3a\x4d\xc0\x8e\xf3\xee\x83\xd0\xf1\x12\x46\x01\x87\xc7\x35\x5f\xd3\x61\xe2\x33\x99\x0a\x13\x65\x70\xfb\xc9\x60\xe8\xe7\xc6\xf7\x07\xae\x7c\x74\x76\x7c\xd7\xbe\xa0\xf7\xa8\xd0\xde\xf0\x2a\x41\x33\x42\xaa\xd7\xf4\x0d\x1a\x29\xd0\x8d\xe7\x9a\x34\x55\x6c\x47\xe4\x29\xf3\x99\x60\xcb\xe4\xfc\xed\xc5\x95\xb8\xee\xf0\x4b\xff\xa2\x3f\x88\xbb\xa7\x82\x4d\xc0\x1e\x7d\xad\x0c\xb7\xd2\xcc\xa1\x81\xf0\x27\xd4\xc7\xa1\x24\xa3\x5b\x9f\x53\xbc\x9a\x95\x4d\xf1\x68\xbe\x64\x3e\xe0\xcf\x36\x36\x0b\xe5\xff\xd5\x76\x10\xa5\x7f\x42\x89\x48\x68\x91\xea\x4e\x50\x42\x6d\xc3\xad\xae\xe3\xd0\x18\xa9\xa8\xf2\x99\x28\xc3\xd9\x47\x67\x80\x2c\x5b\xf8\x8b\xad\xb3\xff\x19\x62\xde\x02\x79\x4e\xde\x3a\xcd\xc3\x74\x4b\x54\xc2\xab\xd9\xf5\xbf\x35\x28\x86\xc7\x7c\x02\x67\x6b\x19\x1a\xdd\x77\x09\x2b\xbd\xfe\xa4\x2b\x9f\xab\xaf\x3e\xa9\x94\x78\x75\x4e\xa8\xc4\xab\x9d\x46\x7e\xe3\xeb\xb7\x5a\xf8\xc6\xe5\x90\xe4\x14\x32\x63\x54\xe0\xd1\x81\x0d\xc0\x69\x24\xd8\xe1\x66\x04\x1f\x35\xc1\x28\x72\x37\xe1\xef\xfa\x36\xe8\xee\xbc\x3f\xf1\xea\x97\xaf\x89\xd7\xc4\xbd\x52\xaf\xdf\x7b\x62\x75\x1e\xa4\xef\x61\xc3\xab\xa3\x41\x5d\x5f\x8d\x0d\x75\x55\x9b\xd6\xb8\xb3\x1a\xa6\x75\xcd\xec\x6a\xc3\xba\xd7\xb3\x07\x68\xcf\xcf\x7a\xda\xb8\xf5\xd5\x20\x84\xbe\x83\xb5\xcb\x21\xc0\x14\x90\x06\xb7\xdb\xbc\xa7\x6a\xcc\xce\xb4\x75\xff\x89\xcc\xdf\x63\x2d\xcc\x99\xb6\xf0\xc9\x83\x20\x25\xbe\xc2\x80\x84\xf4\x9d\x30\x11\xe5\xd0\xf1\x4d\x0a\xd1\x3a\x89\xe7\x09\xb6\xc5\xb0\x38\x55\x4c\x97\x9e\x62\xc1\xba\x30\x34\x44\x1c\x56\x20\x04\xb2\x1b\x8d\x13\x37\x4e\x4c\xe7\x5b\x86\xa3\xa1\x20\xfb\x0b\xbf\x01\xac\xe5\x22\x83\x02\x81\xb4\x2a\xb1\x0d\x93\xd3\x35\xad\x58\xc8\x84\xe5\xa2\x5c\x08\x06\x90\x9a\x43\x2c\x5f\x1f\xb9\x82\x57\x4f\xe9\x12\x4f\xa6\xc7\x5e\x02\x91\x0d\x2a\xd6\x80\x2a\x00\x8e\x87\x62\x2d\xe7\x60\x49\xfd\xbf\xc1\x07\xfd\xff\xb1\x82\xcb\x12\xda\x36\x51\xec\x38\xfe\x8e\xa2\x2f\xf1\x30\x6e\x84\x0d\xdf\x12\x57\x4c\x60\x9d\x97\x1b\xbd\xad\x78\x8c\xd9\x35\xf4\x54\x71\x3c\x31\xb8\x3f\xf6\xae\xc4\x7a\x6f\xbc\xb1\xf5\xf6\x4e\xd5\x5e\x1d\x18\x6e\x6c\xb6\x20\x84\x21\x83\x70\x0f\xbe\xdb\xfb\x78\xba\x4a\x2f\x61\x3b\x44\xd3\xcb\xf6\x84\x3a\xee\xab\x7a\xf1\x7e\xe8\x80\xe9\xc8\xda\x5b\xea\x45\x63\x38\xaf\x2c\x59\xd2\xd1\x6b\xe9\x67\x30\xe7\x3f\x8b\x00\xeb\x0d\xf4\x65\xf5\x28\x62\x05\x62\xba\x2e\xea\x8c\x19\x9e\x25\xd8\xb6\x16\x17\x15\x06\x71\x8b\xe9\x4d\x8c\x4c\xeb\xab\xaa\xf0\x9b\x02\x72\x0c\x00\x22\x48\x25\x3a\x27\xa3\x03\x9f\x0f\x7e\x15\xda\x71\x13\x8a\xe3\xe1\xee\x0d\x7b\x83\x9a\x45\x36\xac\x99\xe6\x84\x83\xdb\x21\xa0\xe2\xdf\xe5\x15\x42\xca\x4b\x3c\xbb\x29\x03\x9a\x81\x5e\x90\x6a\xb5\x6f\x71\x6c\x7f\xcc\xb6\xbc\x48\x18\x99\xbc\x85\xee\x9c\xaa\x2a\xcb\x02\xee\x34\xea\xf3\xe8\x0c\x84\x73\x41\x5e\xf4\x85\x3b\x29\xb6\xf9\x82\xdd\x0d\xa3\xae\xfc\xb5\x07\x57\xed\xc9\x4b\x6f\x02\x16\xe5\x56\xe7\x32\xe9\x70\x88\xc0\x71\xd0\xfb\xf4\xec\xbf\xc0\x81\x22\x27\x17\x06\xd6\x17\xa5\xc0\x7a\x6f\xd8\x59\xb0\xd3\xa8\xcb\x77\xa5\xc4\x4a\xb8\x95\x4d\xa5\x21\xc8\x51\x9f\xa7\xf3\xaf\x0d\xbf\xc2\xff\x75\xac\xcf\xb4\xf5\xae\xaf\x7f\x79\xdf\x31\x32\xf1\xb7\x32\xaf\x72\x84\xe6\xb3\x6e\x8b\xa6\x72\xee\x1b\x1a\xf9\xf4\xa0\xa6\xd1\xdd\xf4\xfd\xd0\x2e\xb5\xbc\x5c\x40\x9a\x30\x19\xdd\x9e\x57\x2f\x32\x3d\xe3\x19\xcb\xa5\x72\x8f\xa1\x0c\x80\xc6\x67\x61\x26\xf4\xe7\x2d\x0f\x02\x81\x22\x17\x72\x96\x09\xb2\xea\x5b\xbd\x16\xa3\x1f\xb7\x6e\x04\x9e\x94\x41\x13\xa7\x25\x57\xec\x85\x54\xc7\xde\x25\xf8\xcc\x9d\x9a\xb7\x3c\x2f\x32\x81\x55\xc0\xec\x9b\xc9\x7f\xb4\x12\x8c\xb2\x5c\xc6\xcc\x2f\x0f\x25\x3f\x59\xcd\x1e\x8f\x7d\xeb\x89\xa8\x3f\x25\xa4\x30\x35\x99\x87\x77\x47\x1a\xf6\xf5\xe1\xd7\x87\x8f\x9f\x38\x45\x0c\x63\x5d\xdc\x10\xca\xd9\x26\x35\x1e\x4f\xd9\x3b\xe6\x66\xf0\x98\xfe\xfb\x35\xfd\xf7\x1b\xf6\x8e\xbd\x63\xec\x9c\x9d\xb3\xf8\xbf\xee\x3f\xec\x1d\x9b\x38\x22\x44\x53\x7d\x3c\x6e\xf2\x8e\xc4\xd9\xa4\xbe\xa6\x9f\xf6\x02\x70\x50\x1c\x1a\x4a\x06\x13\x9d\x0b\x98\xea\xd7\xff\x2b\x06\x27\x96\x96\x69\x45\x77\x3e\x3e\x80\x29\x8d\xd8\x35\x78\xa6\x73\x7e\x85\x5e\x99\xa3\xc4\x56\x3c\x73\x0f\x3f\xf8\x66\xf2\x78\xc4\xb4\x6a\xde\xbe\x92\x1a\xfa\xb8\xd0\x0c\x0f\x1e\x8f\xa6\x1b\x53\xfe\x7a\xcb\x94\x1b\xb3\x85\x59\x70\xb5\x86\xa1\x6f\xde\xef\x7e\xab\x1f\xa9\xf5\x35\x5f\x87\x0d\xef\x45\xc6\x42\xae\x42\xd7\xd7\x08\xe7\x08\x42\xf6\xb0\x7f\xa5\x87\xae\xc3\x41\xd7\x4c\xda\x29\x3b\xb5\xfb\xfb\x06\x1c\xee\x68\x30\xfb\xf6\xb4\xc7\x31\x24\x2f\x10\x1e\xf6\xc6\xa3\x56\x4a\x7f\x07\x00\xc8\x41\x63\x23\x77\xea\x2f\x8b\x57\x1e\x4e\x49\x6f\x16\xb7\x57\x9f\xb8\x06\x60\xc6\xe6\xa9\x6f\x1f\xdc\x90\x7d\x78\xeb\xe9\x6e\x75\x3f\xf4\x6c\xe8\x8a\xb4\x91\xfa\xe4\xd7\xef\x34\x86\x44\x38\xef\xfa\x66\xe8\xfb\xc6\x78\x97\x61\x6f\xf6\x9a\xe7\xf2\xcd\x1e\x44\xc0\x82\x12\x4a\x45\xf2\x24\xd9\x09\x60\xd5\x6f\xe3\x08\x04\xf0\x48\xa5\x75\xde\x51\xc7\xf9\x43\x2b\x53\x30\xbc\x16\x10\x8c\x2b\x37\xdf\x24\xca\x4d\x6a\xa4\xb2\xba\x53\x18\x61\xbd\xb3\x23\xdc\xc0\x06\x22\x88\x1f\x32\xaf\x1b\x69\x67\xea\x40\x0a\xe8\x2c\x21\x92\x92\x63\xcf\x45\x77\x3b\x1d\x6c\x74\xf8\xfa\x1e\x8a\x61\x59\x4f\xe7\x5b\x92\xc9\xea\x28\x0b\xe2\xdb\xba\x4d\x02\xc5\x47\xf1\xfe\x89\xba\xbb\x3e\xde\x02\xf6\x4a\xc7\xc5\x34\xc9\xf5\x88\x36\x52\xfd\x4c\x6d\xf1\xb9\x3f\xb5\xf9\x47\xb0\x60\x1b\x72\x13\x9a\x0c\x74\x11\x16\x5f\x8f\x5b\xb3\xa7\xcf\xff\xd4\x45\x86\x7c\xfd\xe4\x6e\xc2\x81\xfe\x7b\xd9\x58\xe6\xad\xab\xfb\xa7\x83\x7a\x96\x23\xc8\x02\xd8\x72\x08\xa0\x62\xa8\x8e\x08\x4f\x83\x40\x33\xd2\x56\x1c\x8b\x8c\x94\xb8\xa6\xcc\xcf\x9b\x5f\x2a\x2a\x14\xf5\xcc\x7d\xec\xe4\x0f\xaf\xa0\xcd\x66\x5e\x54\x00\x0a\xe0\x08\xe9\x95\xdd\x6f\x0e\xbe\x61\x13\xf6\x68\xe4\x76\x83\xc2\x6d\x05\xc4\x8c\x45\x99\x13\x0d\x94\xc8\x6c\x97\x4e\x79\x72\x94\x31\x63\x6c\xcd\x98\x65\x6d\x21\xd4\xec\x1b\xe1\xf4\x9d\xad\x8d\x3a\xdd\x70\x35\x6d\x4e\xd5\xb9\x4e\x9b\x11\xb3\x46\xeb\x08\x2a\xbe\xf7\xfd\x26\x0e\xa2\xc6\x13\x21\x83\xbf\x0b\xe6\xca\xfd\xca\x02\xa5\x53\x71\x34\x87\xde\x33\xeb\xae\xd8\xd6\x6d\x99\x70\xb6\x31\x66\x24\x1b\x96\xfa\x9a\x5d\x53\x7e\x32\x6c\x39\x2a\xb3\x8b\x27\x72\xe8\xfe\x08\x7b\x0a\xf8\x59\x60\xc9\xa4\x42\x04\x56\x4a\xc7\xc8\xc0\xb2\xbf\x8c\x81\x7b\x26\xec\x7b\xad\x74\xf9\x04\xb5\x23\x37\xa4\xa9\x59\xf1\xcd\x8f\x43\x56\x13\xc3\x98\x34\x04\x82\x71\xea\xcd\x29\x18\x68\x4f\xde\x37\x4a\x30\xe3\x20\x55\x3a\x0d\x7c\xec\xb6\xc1\x11\xaf\xfd\x86\x9c\xdc\x80\x0d\xbe\xe1\x94\x71\xdf\xc2\xeb\x52\x5f\xab\x69\x6b\xff\xb7\xba\xa6\xf8\xe4\xde\x68\x13\xbb\x11\xdc\xca\x9d\xba\xe9\x19\xa9\x15\x2e\xdd\x6d\xc7\x02\x4a\x31\xbb\xef\xf9\x8e\xf6\x9e\xa3\xe4\x25\x44\xe4\x87\xdc\xb0\xf1\x88\xb7\x6e\x57\x04\xeb\xc2\x8c\x80\xde\x5b\x13\x77\x45\xa8\x5c\x85\x51\xc7\x8c\x67\x1a\xfc\x0c\x8e\xcf\xba\x8f\x44\x4a\x37\xce\xb5\x77\x47\x6c\xb8\x10\x96\x50\xac\x5b\xe7\xa4\x8c\x1b\x7b\xad\xbd\x69\xfd\x0b\x7c\xc0\x36\xed\xb5\x25\xf1\x99\x5f\xfe\x9e\x8c\x32\x06\x06\x48\x53\x0b\x63\x79\x23\xfa\x4a\x80\xfc\x83\x95\x43\x5f\xd1\x14\xe8\x42\xe6\x0c\x95\x60\xa0\x3b\xae\xee\x55\xec\xe3\x91\xd8\x46\x37\xe1\x59\xac\x4d\x39\x8d\x4c\xa6\xa2\x44\x01\x3b\x13\x8d\x82\x9d\x90\xe9\xc1\x7e\xaa\xef\xc4\x42\x1d\xc8\x68\xc6\x81\xfe\x8e\x05\xe2\x7b\xb3\x2a\xb9\x12\xd6\x7b\x72\x4b\xa8\x31\x28\x2a\xcb\x66\x3c\xe3\x2a\x71\x9b\xb7\x1d\xd9\xb7\x1a\x07\xc3\x5f\xc2\x53\x10\xf5\x26\x14\x92\xe0\xd0\x51\x1e\xa2\x54\xc6\xba\xd1\x30\x41\xb1\x9e\xe0\x51\x66\xf4\xd8\x1d\x51\x3f\xc0\xa6\x33\x01\x86\xa2\x7f\xa3\x73\x9a\x84\x81\x10\x96\x2a\xd5\x22\x8f\x32\xd1\xb9\x25\xc0\xb0\x20\xbb\xc9\x26\xa6\x0c\x3a\x6b\x9e\xce\xdb\x4b\xb6\xd7\x2c\x97\xf4\x15\x38\x7b\x63\x7c\x6b\xb7\x72\x54\xbe\x4a\xde\x0e\x6a\x3b\x12\xbd\x95\x4a\xa1\xaa\xbb\x3d\x70\xb8\xa3\xf9\x04\xa7\x0e\xf9\xd1\x41\x6d\xbd\x7d\xf4\x53\xbb\xcd\xe2\xfd\xd4\x67\x66\xc3\xbe\xef\xef\x70\xdb\x54\xf9\x9b\x9c\x1c\x72\x4e\x78\xe6\x6b\x41\xa8\xaf\x2a\x61\xc2\xab\xfd\xfd\xda\x33\x00\x47\x01\x39\x4b\x6d\xbb\x38\x2e\xda\xb0\x1d\xd8\x81\x57\xfd\x98\x15\x59\x86\x87\xb5\x36\xa1\x9c\x2a\x6c\x75\x6d\x43\x49\x18\xa1\xe9\xc5\xd8\xfa\xc3\xf8\x47\xbe\x22\x06\x1c\x65\xeb\x80\xe6\x38\x66\xb3\xca\xb2\x85\x5c\x39\x01\xf0\x41\x4e\x0f\x74\xec\x2c\x45\x56\xb0\x52\xa4\x55\x42\x28\x06\x20\x9d\x8e\x62\x0b\x0d\x72\xb6\x03\x77\xd8\x6b\x10\x74\x0f\x1b\x66\xaa\xa6\xf0\x91\x73\x38\x20\xa0\x68\xc9\x39\x13\x2b\x51\xae\x59\xa1\x8d\x81\x63\x08\x6c\x0b\x4b\xf9\x20\x6a\x14\x80\xa7\xc1\x9a\x80\x59\x79\x05\x7e\x8f\x34\xf8\x3d\xb0\x70\x75\x83\x15\x7d\x1a\x87\xde\x37\x87\x8f\x0f\x1f\xdf\x6e\x8c\x9d\xc3\xff\x6a\x0f\x9d\xff\xef\xe9\x7c\x8b\xcd\x59\xcf\xa5\xb1\x73\xee\xe2\xc4\xfb\x1a\x7c\x6d\xdf\x8c\x22\x5f\xde\x37\x87\x5f\x1f\x3e\x3e\x70\x73\xfd\x7a\xe4\x66\x1d\x79\xe9\xbe\x8e\xbc\x74\xe1\x97\x34\x23\x61\x1a\x7e\xba\x53\x45\x75\x9b\xd7\xba\x4c\x29\x3f\xd5\xd7\x00\xba\x19\x21\xe6\x9f\x93\x0d\xb9\xe7\xe5\xb8\xed\x9a\x5e\x82\x7d\x8b\xee\x42\x69\xd9\x1f\x72\x5d\x8a\x3f\x44\xf7\xdf\xe8\x5f\xeb\xee\x36\xbb\xe7\xb6\x67\xdd\x93\x03\xfb\xa6\x06\x0e\xd3\x3f\x0d\x7b\xef\xf4\xc9\xe6\xdd\x7f\xee\x9b\x46\xe2\x50\x94\x36\x85\x4e\xdd\x9c\xd2\xfb\x66\xeb\xb8\x1a\x78\x26\x9c\x4a\x8b\x3e\xb0\x1a\x32\xf0\x8e\x4d\x72\x8d\xd5\x25\x5f\x88\x43\x7a\x6c\x97\xda\xdd\xfb\xc8\xc2\xfd\x11\x9b\x1d\x35\x72\x64\x10\x8c\x89\xda\x20\xf9\x82\x6c\x9f\x3d\x09\x5c\x80\x27\x50\xcb\x08\x84\x6c\xc0\x7d\x46\x55\x92\x9f\x49\x22\xee\x27\x6e\xf2\xc8\xaf\xcd\x49\xc6\x8d\x95\xc9\x3f\x32\x9d\x5c\x5d\x58\x67\xf5\xf4\x56\x2d\xb6\x8d\xda\x58\x53\xc5\x8e\x7e\xba\x60\xc7\xd2\x5c\xd5\xbd\x86\x7d\xf7\xf4\xb8\x7c\x90\x07\xd4\x66\x42\x92\x60\x39\x4f\x96\xa8\xba\x92\x0f\xda\x77\xee\x1a\xee\xac\xfc\x8e\x5f\x1b\x81\xd3\x87\x5e\xae\xee\x6b\xd1\x9d\x05\xdf\x1b\x8a\x24\xbe\xce\xe9\xf1\x3d\xa4\xed\xce\xcd\x65\x67\x88\xea\xcd\xfe\x6f\xbe\x91\x00\x22\x22\x64\x02\xeb\x6c\x10\x8d\xbb\xd9\xd3\x0d\xf6\xd0\x5a\x57\xec\x9a\xa3\x5d\x0d\x1c\x76\xca\x2e\x65\xf1\x84\x9d\x44\xdd\x91\xb6\x0d\xe5\xb4\x8f\x80\xc5\x4a\x06\x35\xec\x39\x4c\xc3\x71\x0c\x99\x2a\x7c\xd8\x09\xaa\x56\xe6\x09\xdb\x13\x6f\xed\x1f\xf7\xc6\x6c\xef\xed\xdc\xb8\xff\x28\x3b\x87\x6e\x6a\xd4\xbf\xda\xe9\x78\x6a\x2e\xca\xda\x74\xc4\x1f\x6c\xc2\x20\x0d\xbf\x65\xd9\xe5\xcb\xe3\x97\x4f\x40\x97\x4f\xb5\xb3\xfa\x8a\x52\xac\x9c\x4e\x49\xa0\x5e\xc4\x1b\x23\x32\x40\xe6\x48\xa2\xf3\xa2\xd4\xb9\x8c\x4a\x6f\xe1\xc8\x75\x39\x01\x6c\x88\xdc\x2f\x30\x6c\x61\x33\x0c\xb2\x9f\xc2\x70\x7e\x4b\x45\x1f\xa8\x0f\xd9\x4c\xa7\x73\xa6\x31\x51\xa0\x59\xfc\x2f\x4d\xb8\xc9\x6d\x1f\x1a\x45\x01\xa2\x52\xbd\x61\x9c\x66\x4e\x5f\x1d\xa6\x62\x75\x68\x52\xfe\x78\x0c\x8f\xc1\xdd\xb0\x6e\xcd\x89\x1b\xb6\xf7\x78\x6f\xca\x2e\x64\x2e\x33\x5e\x66\xd4\x50\x9d\x86\xa8\xef\x73\x86\x82\x1f\x10\xcc\xdf\x47\x7b\xec\x00\xab\xef\x41\xdd\xc8\x84\xc7\x62\x0b\xd8\xa3\x90\x27\x33\xea\xa4\x5d\xb2\x01\x9c\xf1\xac\xb7\x43\x9e\x01\x97\xe4\xe9\x4b\x95\x75\xce\x59\x6e\x6e\x0e\x3f\x9a\x2f\x5d\x2b\x2b\xf2\x67\xce\x75\x49\x46\x60\xb8\xc5\x43\xfc\x48\x45\x6a\xcb\x0b\xb7\xf4\xe6\xc1\x88\x1f\x36\x00\xec\x1c\x0b\x52\x64\x18\xfa\xfa\xd1\x20\x15\x01\xbb\x3b\x9f\x1e\x7b\x26\x5e\x88\xd2\x48\x63\x1d\x8b\x4a\x1b\xaa\x81\x44\x7d\xe1\xe0\x28\xe7\xff\xd1\x8a\x9d\xfc\xe3\x82\xa6\x35\x7a\x80\xc4\xee\xc8\xe9\xf8\x7f\xaa\x52\x38\x8d\xa8\xb7\xfa\x15\x46\x6a\xab\x5c\xee\x73\x76\xcc\x2d\x47\xcd\x0b\x39\x95\xae\x61\xb1\x40\xa9\x9a\x41\xb9\x92\xc7\x3c\xeb\xa8\x3c\xb3\xfb\xd7\x7e\xdc\x0e\x3a\xeb\x8e\xa3\xed\x7e\xfe\xfa\xd5\xe9\x3d\xe8\x4e\x09\x88\xdb\xc5\x0b\x9d\x0e\xa4\x40\x45\x03\x7a\x91\x07\x30\xa5\x4f\xf1\x73\x96\xbb\x27\xb1\x33\xad\xc4\x98\xbd\x12\x3c\x65\x8e\xbb\xd1\x3f\x7f\x2a\xa5\xbd\x2b\xf2\x53\x7d\xf5\x16\xfd\x7e\x11\x07\x21\x84\x1f\xcc\x13\x21\xee\x4d\x0f\xd0\x94\xc0\x74\x48\x07\x98\x65\x7a\xc6\x88\x59\xdc\xe7\xdb\xbf\x7e\x75\x3a\xd8\xcb\xbf\x7e\x75\xea\xdf\xdd\xfd\x53\xcf\x1f\xe6\x6b\x0f\x68\x3c\xd4\xb6\xc3\xb3\x96\xb2\x5f\xab\x73\x75\x0b\xa1\xb6\x41\xf0\xe1\xd6\xc0\x74\x28\x3b\xe0\xbe\x68\x7e\x25\x55\xe7\xea\xb7\x26\xb7\x81\xf6\x41\x01\x0c\x2a\x0a\xa2\x01\x06\x5d\xfa\x84\xe5\x55\x66\x01\xef\x07\xf6\x9a\xdb\x7c\x90\x2d\xe6\x77\x1d\x23\xec\x4b\xc6\x8e\x05\x86\x23\xd2\x27\xbe\x02\x23\xfc\x62\xfb\x0f\x5e\x70\xc5\x17\xee\x76\x90\x80\x2c\xc7\x3f\xa3\x4d\x7e\x80\x4e\x77\x15\xbe\xe2\x2b\x2e\x33\x3e\x93\x99\xb4\xa0\xcf\x8d\xa6\x5e\x9b\xc7\x2c\x7d\x98\xf2\xbd\x71\xbf\x41\x55\xdb\xa0\xb6\xc6\xc8\x28\x00\xec\xc7\x0e\xdc\x77\x87\xd7\x8e\xd5\x8f\xa6\xc0\xf7\xe1\x46\xc0\x61\x6f\x29\xbf\xaf\xde\xa7\xfc\xde\x8b\x9e\x0a\xeb\xfd\xac\x63\x6f\xb3\x4d\xdd\xc9\x8d\xb4\x55\x77\x82\x2f\x08\x6e\xf3\x0b\x57\x9f\xb0\xbf\x7c\x0f\x05\x0a\xce\x4e\xc7\xdf\xf7\x55\xa1\x3e\xce\xc1\x49\xbf\xbc\x83\xc3\xb0\x0b\x24\xad\xf4\x20\xe4\xaa\x87\xf3\xba\x46\x80\x55\xc6\xaf\x5a\x85\xe3\x78\xb2\x2e\x88\x97\x7b\xb8\x65\xf8\xbd\x3b\x4f\x5d\x60\x25\xf0\xea\xcd\x7e\xc3\x0e\x1e\x86\x2e\x7e\x34\x4f\x16\x14\x52\xf0\x31\xeb\x7c\xce\x7a\xbe\x66\x22\x8a\xe5\xbc\x7f\x66\xbb\x1b\xe6\xd9\x45\x33\x6a\xf3\x54\x14\x4b\xf6\xec\x62\x0b\x9b\xc4\xaa\x02\xf7\xde\x06\x63\x39\xfb\x86\x65\x72\x2e\xac\xec\x44\x84\x7b\x66\x94\xb9\x56\xd2\xea\xd2\xdc\x03\x9b\xf3\x8f\x1e\x46\x71\xf3\xa3\xb9\xfd\xf9\xca\x13\x85\xbd\x88\x3e\xe5\x2c\xd1\x59\x26\x12\x9f\xeb\x0f\x4b\x1c\x7e\xb6\xc5\x11\x43\x19\x08\x66\x7a\xf5\x17\x70\xc5\x90\xd3\xe5\x10\xb7\xdd\xe1\xab\x93\xa3\xe3\x17\x27\xd3\x3c\xfd\xdd\x52\x5f\x4f\xac\x9e\x54\x46\x4c\xa4\xed\xa7\x6f\xdd\x23\x92\xc6\x00\x9e\x6e\xbb\x1c\xca\xc9\x6d\x97\x6e\xc9\x6a\x38\xe7\xd7\xa6\x06\x5c\xf7\x71\xe7\x52\x6b\xbb\x09\xb9\x3e\xaf\xb2\x0c\xd7\xd6\x96\x42\x8c\x63\xff\xf6\x1d\x01\xe9\xeb\xeb\x61\xe9\xc2\xb5\x9b\xb7\x41\xa2\x8f\xab\x19\x3f\x94\x03\xd2\x5f\x57\xe8\xaa\x69\xb3\x8d\x75\xa8\xc7\x6b\xae\xc4\x45\xe3\x73\x0c\x88\xd8\xa5\x5b\x97\x2b\xb1\x66\x00\x9a\x30\xd7\x25\x34\x30\x69\xee\x4f\x61\x13\x20\xde\x61\x65\x44\x39\x25\x85\xe3\x81\x10\xbe\x8f\x2a\x02\x2f\xf2\x4a\xcc\x87\x24\xfb\x2b\x31\xdf\x46\x75\xfa\x18\x50\x5e\x43\x7a\x9c\xd3\x57\x2a\xbb\xc4\xdc\x58\x44\x97\x46\xda\x6e\x5d\x06\x42\xbd\x78\x20\x74\xef\x85\x57\x30\x04\xa6\x4e\x9f\xde\x88\x6c\x63\xf1\x62\xb7\x25\x2d\x92\xbd\x73\x18\x44\xaf\x9c\x15\x2b\xae\x0f\xaf\x75\x79\x25\xd5\x62\x72\x2d\xed\x72\x82\x94\x32\x87\x80\x75\x7f\xf8\x3b\xf8\x0f\x45\x91\x8f\xd2\x94\xf2\xdf\x2a\x23\xe6\x55\x86\x99\x69\x66\xca\x78\x21\x7f\x14\xa5\x81\x2c\xcb\x2b\xa9\xd2\x31\xab\x64\xfa\x6d\xd7\x15\x63\x43\x9c\x96\xee\x9d\xfc\xdb\xb4\xae\xa8\x99\xbf\x8e\xc5\x68\xe9\x79\x52\xc9\x53\x6d\xb0\xe3\x91\x23\x55\xe3\x08\xf0\x34\x97\xea\xa1\x9c\x80\xae\xd6\x81\x54\x69\x37\x4a\xb6\x02\x10\x30\x4e\xd3\x3c\xa0\xcf\x28\x8c\x1d\x72\x7e\xb8\xf7\x9e\x60\xc3\x77\xca\xfe\x69\xe6\xfe\x7c\x10\x63\xc9\xd7\xe6\xdf\xd9\x04\x9f\x32\x29\xd2\x9a\xae\xbb\x44\x9e\xbb\x5c\x9f\x2e\x91\x67\x58\x87\xfc\x27\x48\xcf\xf9\xa8\x3b\x8e\x3d\x60\x9d\xf9\xe3\xfa\xc1\xee\x91\xd4\xfd\x35\xe3\x8f\xa3\xa1\xd5\xd2\x07\xba\xf1\x19\x0f\x11\x07\x0a\x18\x72\x25\xef\x4f\x83\x1c\xf9\xba\xfd\x93\x47\x7b\x48\xb4\x52\xd4\x19\xe0\x65\x21\xd4\x85\xe5\xc9\x55\xcf\xa8\xee\x4e\xab\xfa\x8d\x69\x55\x1f\x29\x11\xc8\x6f\x51\x2c\xbc\xa3\xf4\xb7\x3a\xd9\x1b\x0f\xf9\x67\xc8\x80\xb1\xcd\xdd\x0b\x5e\xf4\xf7\xae\xfa\x91\x5a\x1a\x54\xf8\x98\x1c\xaa\x50\x1c\x54\xe8\x02\x70\xb6\xa8\x04\x15\xe8\xf8\xe9\x35\x9e\xbe\xe7\x9b\x44\xcc\x70\x39\x30\xd1\x80\x4d\x8e\x9a\xbb\x4f\x66\xd2\xd6\xbc\xd2\x08\x8b\x50\x50\x04\x0e\xac\x15\x4b\x08\xee\x01\xf4\x91\x08\xc4\x20\xd2\x55\x14\xd3\x89\xf5\x55\xa3\x01\x35\xea\xd1\xa3\x47\x8f\x10\x09\xe7\x7f\xfe\xcf\xff\xc9\x74\x09\x5d\x38\x13\x99\x6f\xde\x08\x77\xfd\xe9\xf1\xe3\x29\xfb\xe7\xd1\x8b\xe7\x50\xd1\x50\x58\x83\xbd\xd9\x70\x64\x77\x43\xe3\xc7\x66\xcc\xfe\xef\x8b\x97\x67\x35\x46\x43\xf3\x5b\x30\xcd\xc3\xeb\x35\x3b\x62\x3c\xfa\xf3\x1f\xff\x38\x65\xc7\xb2\x84\x8a\x2e\x29\x42\xb7\xf5\xe0\x6a\xe1\xa5\x40\xe4\x1e\xc0\x50\xf1\x1a\x97\x0c\x8d\x0d\xa9\x3e\x39\x97\x8b\xa5\xa5\x8a\x58\xb7\x21\x33\x99\x58\x2c\x1e\x43\xb6\xe6\x9b\xb9\x63\x33\x0d\x6a\x4f\x43\xda\x1f\x4c\x6e\xcc\x32\x79\x25\xd8\xdc\x7c\x57\xea\xaa\xa8\x01\x0e\xa9\x05\x31\x15\xca\xe0\x60\xf5\x5a\x19\x61\x3f\xf3\xb4\xd5\x5e\xae\xe6\xc6\xde\x86\x91\x5a\x0a\x2b\x95\xb7\xd6\x28\x7f\x05\x97\xa1\x18\x06\x32\x00\x1b\xdd\x2f\x83\xaf\x27\x65\x4f\x03\x57\xf1\x98\x23\x45\xa9\xff\x1b\xb7\x00\xd4\x22\x47\xec\x19\x6a\x85\x61\x25\xa9\x52\x38\x8a\x6e\xf9\x7a\x6a\x6a\xb7\xee\x3f\xa6\x1e\x2e\x9b\x8d\xb0\x32\x69\xdc\x23\x00\xec\xe7\x96\x27\xd7\x5d\x7c\xdd\x2e\x35\xb8\x5f\x2a\xb5\xf1\x6b\x02\x56\x21\x76\x49\xed\x2f\x09\x8b\xb8\x1e\x03\xe1\x01\x08\x07\x87\xee\xf5\x54\x0a\x84\x68\xe4\x5b\x1b\x61\x2b\x22\x0d\x64\xd1\xbb\x67\x43\x6b\x46\x78\xc3\x9c\x97\x57\xce\x70\x25\xee\x32\x65\xe7\x6e\x92\x01\x4a\x07\x61\x7e\x57\x18\xd8\xcc\xf9\x1a\x1e\x4b\x8a\x1b\x3c\x64\x7f\x3a\xdd\xc7\xe3\xa7\x4b\x66\x2c\x2f\xe9\x2c\xb9\xcf\xbf\x0c\x7c\xf1\x17\xbc\x30\x88\x77\xeb\x34\x55\xc0\x82\xd6\x50\xbb\x6e\x97\x9e\x05\x71\xa2\xf5\x0e\x13\x9c\x4d\x80\x30\x9d\x07\x78\xe0\x78\xe0\xb4\xfa\x74\xca\x1f\x04\x58\x75\xde\x43\xe1\xc0\xab\x1d\x53\x4d\x5b\x91\x8d\x0f\xd2\x37\xa8\x1f\x52\x26\x3e\x2b\x05\x63\x7b\xff\x53\x62\x9c\xb1\x02\x16\x37\xc6\xfc\x7c\xf5\x08\xbc\x86\xd0\x26\xf0\xea\xaf\x53\xe0\xd5\x27\x88\x8c\x57\x63\x0f\xfb\x48\x32\x12\x93\x04\x18\xca\xa8\x79\xbd\x04\xd0\xa5\xae\x88\x8e\x35\xb6\x74\xf5\xad\x89\x15\xe3\x33\xa3\xb3\xca\xe2\x4f\xeb\x2f\x63\xe9\x07\x83\x7a\xb4\x6c\x10\x79\xe1\xb6\x48\x16\x82\x16\x80\xe2\xa3\x8f\x58\xc4\xab\x37\xdb\xe8\xe3\x84\xf8\x0d\x39\x20\x7a\xd3\x39\x18\x6c\x43\xd0\xda\x0f\x16\x2a\xee\xae\x97\x82\x52\x20\x22\xbd\xcf\x71\x53\xc7\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xa4\xf7\xe2\x66\x4c\x8c\xec\xef\x4b\x30\x92\x1d\x3c\x0d\xe5\xf1\x3e\xed\xee\x54\x59\x51\xce\x79\x22\x46\xb1\x8f\x41\x14\x4b\x91\x8b\xd2\x11\x8a\xee\xf3\x35\xda\x4b\xae\x52\x82\x9d\x4a\x44\x09\x27\x58\xbc\xb5\xa2\x74\x44\x7d\x7a\x71\xca\xd2\x52\xae\x44\x69\xd8\xc1\x3f\x00\x4e\x10\xe1\xa6\x46\x9f\x61\x1a\x2c\xbe\xc8\x7d\x78\x40\xe0\xc1\xc3\x94\x7e\xc0\x50\x9e\x87\xab\x88\xcf\xd4\x4b\xe5\xb1\xb1\xdc\xb2\x9a\xd8\x77\x34\x75\x07\x02\x44\x28\x70\x5f\xe8\xe5\x8c\xb1\x4d\x8f\xe3\x0e\x2d\xa7\x12\x8b\x03\x73\xc3\x4a\xb1\x70\xd6\x58\x19\x81\xf6\x21\x4c\xca\xbd\x15\x37\x0c\x5f\x50\x52\x07\xab\x6e\xab\xfd\x98\x93\x5d\xa9\x57\x32\xf5\xea\x10\x62\xd3\x07\x68\xb8\x82\x9b\x08\xbc\x80\x1b\xa3\x13\x09\xae\xa6\x68\x69\xd0\x4a\x05\xa5\xa9\xd9\x04\xcc\x87\x9b\xe3\x30\x99\x86\x56\x3a\x9d\x3a\x90\xb2\x41\x04\xa2\x4e\xc5\x79\x35\xcb\xa4\x59\x5e\x0c\x1a\x12\xd9\x36\x30\x26\x25\x6e\x64\xaa\xdc\x18\x19\x31\x42\x19\x49\x0d\xe3\x51\xdd\x92\x4e\xdb\xd6\xb0\x0c\xfe\xd7\xf1\xa1\xd0\x50\x0d\x0f\x6d\xe8\xfd\x57\x67\xf5\x3c\x08\xac\x04\xfb\x1f\xa7\xe2\xb5\x2a\x1a\x9f\x27\x3c\xcb\x0c\xe9\xb7\xa1\xbb\x87\x97\x3d\xa8\xa1\x7a\x00\x13\xdc\x15\xd2\x6d\x18\x3f\x7b\x48\xc1\x41\xe6\x15\x5a\xd1\x6c\x7d\x31\x13\xc1\x0d\x6b\xe5\x6f\x82\x36\xce\xfe\x07\x81\x42\x58\x89\x83\x9b\xee\x1e\x9b\x80\xec\xc2\x3f\x9f\x5f\xf8\xe7\xe3\xd4\x54\xd4\xcd\x35\x39\x7c\x38\x81\x0a\x2d\x0c\x6d\x54\xd4\x30\xd6\x0b\x1a\x2f\x90\xde\x93\xa6\x79\x6f\x21\x60\x9c\xdf\x91\xa5\x5e\x14\xc3\x78\x77\xdb\x83\x82\x2a\xe6\x4c\x71\xe0\x50\x13\xa2\x5f\x12\x1d\x29\xb2\x91\xc3\x39\xdf\xe4\x6b\xb5\x4c\x07\x71\x8e\x1f\xee\x1b\x96\xea\xa4\x72\xc6\x57\x4d\xf6\x3a\xe1\xa2\x5f\x9f\xbe\x2f\xab\x71\x50\xaa\xaf\xd5\x35\x2f\xd3\xa3\xf3\x4e\xb5\xb9\x4d\xe5\xac\x1e\x2b\x56\xbd\xfd\xc7\xcc\x7d\xce\x67\x00\x78\x4b\xd8\x86\xbb\x68\xdf\xd6\x21\x62\x6e\xbe\xcd\xdd\x66\xb5\x63\xb2\x1f\x18\xcd\xbb\xab\xc3\x6e\x17\x20\xdc\x05\x08\x1b\xd7\x43\x0a\x10\x9e\x62\x80\x30\xee\x71\xdb\x60\x2f\xe4\xa1\x75\x14\xff\x22\x62\x4c\xc7\x35\x4b\x45\x4d\xbc\x5d\xcf\xdb\x52\xfe\xf1\xf0\xd6\xbb\x2e\x32\x18\x3c\xcf\x05\xbd\xec\x4b\x88\x47\x3d\x80\x78\x12\xd0\xb2\x87\x55\x88\x57\x93\xe1\xd7\xf5\x6a\x88\x52\x8b\x81\xe9\x28\xc2\x5d\xe8\x94\x7a\x1b\x40\xd3\x0d\x6c\x20\x30\x0e\x4d\xf1\x94\x2f\x37\x05\xed\xbc\xe0\x89\x00\xfe\x16\xd4\x9f\x41\x82\x04\x3d\x37\x00\x1b\x68\x13\x30\xd8\x08\x40\x9d\xf3\x3e\xbb\x81\x0d\xb6\x23\xdc\x55\x5b\x3c\x7d\x47\x6a\x23\x8a\xe2\xa8\x7e\x23\x98\x64\x29\x72\x0e\xff\x7c\xe6\x49\xe0\x78\xa3\x33\x1e\xac\x40\x08\x38\x51\xe6\x86\xe9\xf9\xb8\x91\xe9\xba\xb7\x7a\xbc\xd7\x2f\xd8\xc0\x86\x8b\x53\x32\x7f\x8e\xce\x7b\x07\x7b\x58\x9b\x60\xe7\x8d\xd8\x8e\x3b\x43\x75\xfb\x47\x8f\x7b\x1f\x32\x28\x40\x7e\x20\x85\x1f\x0c\x71\x86\x0e\xe2\x76\x0d\xde\x8e\x43\xd4\xe0\x33\x50\xfe\x76\xc1\xdb\x2f\x31\x78\x1b\x09\x46\xcf\xe8\xb6\x04\x72\xe3\x90\x80\x8f\xe6\xce\x84\x37\x6a\xc8\x86\xf1\xa1\x5c\x1f\xc7\xd5\x65\x33\x75\x69\x7f\x3a\xdd\xdf\xf7\xd1\x5d\xda\xf7\x95\x9d\x4f\xfe\xc2\x84\x4a\x74\xea\x7b\xd7\xce\x65\x69\x2c\xa8\x7b\xb5\xbb\x2d\x9e\x4b\xee\x9f\x15\xa7\x3f\xc1\xd8\x43\x2c\x75\x6f\xde\xe2\x21\x09\x9f\x7d\x04\x25\xa6\x56\x5d\x02\xf0\x21\x91\x28\xe0\x59\x93\x0e\xe3\xbf\x37\x2c\x93\xb9\xa4\xce\xef\xee\xa0\x0b\x63\x0d\x3b\xc0\x0f\xa7\x49\x51\x8d\xe9\x86\x69\x2e\x72\x5d\xae\xc7\xe1\x26\xf7\x65\xe3\x57\x74\xc7\x08\xfb\x9d\x54\x65\x29\x94\xcd\xd6\x5f\xb2\x06\xe4\x89\xf8\x40\x14\xa0\xb0\xc6\x7d\x10\x47\xea\xab\xb9\xb5\xea\x88\x2f\xb8\xcd\xa3\xfe\x02\x01\x8d\xd6\x8c\xeb\xb8\xb8\xfb\x54\xa8\x15\x5b\xf1\xf2\x8e\xc8\xf1\xdb\xae\x01\x75\x9e\x54\xae\xa4\xd1\x9d\xc3\xa2\xd1\x40\x31\x79\x2e\x82\x13\xda\x1d\x36\x5d\xd9\xa2\xb2\xc4\xd1\xfd\x09\xf4\x28\xe3\xe1\xe4\xb5\x94\xc3\xc7\x5d\xba\x28\x35\xaf\x82\x5b\x2b\x4a\xf5\x84\xfd\xd7\xc1\x9b\xaf\xde\x4d\x46\xdf\x1e\x1c\xfc\xfc\x68\xf2\xd7\x5f\xbe\x3a\x78\x33\x85\x7f\xfc\x61\xf4\xed\xe8\x9d\xff\xe3\xab\xd1\xe8\xe0\xe0\xe7\x1f\x5e\x7c\x77\x79\x7e\xf2\x8b\x1c\xbd\xfb\x59\x55\xf9\x15\xfe\xf5\xee\xe0\x67\x71\xf2\xcb\x07\x0e\x32\x1a\x7d\xfb\xfb\xde\x53\xe7\x6a\xfd\xb2\x27\x2b\xc4\x6b\x32\xa0\x48\x6e\x8e\x38\xc8\xf6\x6b\xb5\x95\x90\xca\x4e\x74\x39\xc1\xa1\x9f\x00\x58\x70\xcf\x07\xf8\xed\x35\xf4\xf9\xaf\xd5\x80\x1a\x6e\xdf\x2b\xf5\xf7\x7c\xc0\x21\xf4\x79\x2c\x07\x28\x33\xf6\x23\x35\xcb\x64\xac\xc8\x0b\x5d\xf2\x72\xcd\x52\xf2\x66\xae\xb7\x20\x10\x45\x10\x44\xbd\x21\x85\x61\x1e\xa9\x2c\xef\xa1\xd2\xb8\x37\xa2\x90\x48\x65\x95\x0f\x84\x27\x04\x63\xc5\x8b\x71\x0d\xc8\xfb\x84\xda\xef\x53\x8a\xe8\x36\x0a\x68\xcc\x78\x72\x85\x16\x54\x58\x2d\xd4\x1b\xa3\xd2\xfa\xbd\x3d\x4a\x89\xc0\xe6\xfe\xe4\xd8\x87\xdc\x16\x9d\x0a\xb7\x94\xfe\x66\x1c\xbb\xe1\x84\xc7\x48\x3b\x25\x10\xd6\x1d\xa9\x74\xc9\x5e\x80\x02\x74\xaf\xab\xcf\x06\xc1\x0a\x91\xff\x11\xcf\x9d\xd6\x37\x50\x25\xaa\x1f\xce\x27\x10\x59\x0d\xf6\x26\xe1\x7a\xcd\xa1\xc9\x56\x9d\x21\xd6\xd0\x2c\x60\x21\x4f\xfc\xb1\xf4\xf1\x5b\xb7\x9c\x6e\x54\xd4\x4d\xc1\x31\x9d\x19\xcc\x5b\x91\x09\xf4\x81\x02\xdb\x14\x96\x23\x2c\xe1\x65\xd4\xa8\xbf\x32\xee\x49\x5a\x35\xef\xa9\x1f\x84\x6d\xb2\x66\xb8\x27\x7c\x77\xed\xa6\x45\xed\xbe\xb9\x08\x6f\x56\xfb\x33\xa0\x64\xd9\x9b\x9f\xa6\x02\x23\x85\x9e\x42\xaa\xb6\x9e\x43\x66\x45\xd4\xaf\xc7\xb7\xa4\xd9\xd8\xa8\x4a\x66\xcd\x9d\xea\x3b\x4f\x84\x17\xaf\x14\x25\x14\x6e\x6c\xbb\xed\xbb\xae\x32\xa2\x9c\x2c\x2a\x99\x0e\xb7\xdf\x3e\x3b\xb5\xa3\xa7\xb2\x31\x94\x8a\x31\x88\x62\x31\xb8\x3a\x11\x52\x36\xfb\x37\x7a\xad\xb3\x3f\x1b\xf2\x34\x6e\x8e\xd1\xcc\x04\xe5\xa1\x1f\x9a\x67\x06\x3e\xdd\xe0\x32\xb8\x92\x48\xce\x26\xeb\x84\xa0\x9d\x64\xa3\x75\x0f\x0e\x8b\x67\x02\x8a\xaa\x26\xa1\x6d\x75\xed\x90\x60\x33\x31\xc7\x8c\x27\xfc\x0d\x78\x0a\xa8\x14\x2c\x15\x99\xb0\x22\xea\x37\x5f\x60\x87\xec\x52\xe4\x7a\x45\xfd\x59\x5f\x1b\x8a\x97\xcb\xf9\x13\xc6\x47\x8d\x82\x63\x43\x0d\x90\x85\x48\xb1\x3e\x2c\x6a\x2a\x58\x56\xca\x8c\xd9\x6c\xe4\xf3\x59\xa9\xfd\x65\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x52\x5b\x70\x99\xf0\x82\x27\xd2\xae\x99\x2d\x79\x72\xe5\x6e\x81\x38\x2a\x3c\x6e\xcc\x92\x11\xa5\xb7\xc7\xe4\x6b\x96\xac\xd9\x65\xa9\xab\xc5\x12\x6a\xa8\xf0\xae\x24\xe3\xc6\xbf\xfd\xd6\xdf\x93\x0d\x6f\x58\xba\x56\x3c\x97\x49\xe8\x1d\x52\xea\x95\x34\x52\x53\xa4\xcb\x8f\x7b\x1e\xba\x30\x60\xf4\xec\x69\xc6\x65\xce\x0e\x8c\x10\xec\xc4\x6f\x09\xfc\xe6\x02\x35\x49\xf4\x24\x96\xcd\xa4\x3a\x02\x7c\x24\xe0\x01\xf7\x49\xcd\x7a\x43\xaa\x02\x2a\x03\x6e\xe6\x5b\x1f\x3a\x0a\xcb\xb5\x7d\x4e\xba\x84\x84\x37\xdf\x02\x48\xa8\x54\x47\x19\x31\x47\xe7\xa7\x26\xb6\x6f\xa9\x8d\x22\x8e\x04\x5f\x64\x5a\x2d\x62\xe0\xbb\x7a\x67\x3a\x26\xaf\xa0\x1f\xe6\x4a\xa6\x15\xcf\x90\xbd\xd3\x64\x9e\x5e\x9c\xe2\xcf\xe5\x62\x69\x27\xd7\x02\xbc\x9f\x28\x05\xeb\x33\xe3\x1f\x2a\x37\x32\x6d\xa5\x01\x71\x60\xc9\xcb\x86\x9e\x64\xe8\x39\xc9\xd7\x00\xbc\x4b\xc9\x9d\x8d\x64\x1c\x0f\x53\x8f\x43\x6c\xa3\x38\x4c\xef\x28\x34\x48\x74\x2a\x11\xb8\x87\x1d\x89\x61\xa7\x6e\xce\x0d\xba\x3d\xd6\x3d\x37\xc2\xc7\xb6\xee\xfc\x08\x0a\x71\xf7\x0e\xc1\xf7\xa6\xc8\xae\xea\x6d\x72\x29\xf2\x22\xe3\x76\x98\xd4\x92\xbd\x9f\x22\xf7\x77\x14\x3c\x76\xc7\x91\xab\x74\xc2\x33\xb7\x23\xcf\x7f\x7c\x4a\x95\x6d\x78\xc0\x1a\xe9\x6b\x97\x75\x8f\x52\xdf\x9e\xda\x69\x49\x5b\x8f\x16\x60\xa9\xcd\x44\x0a\xcc\x88\x9e\x0c\x3e\x8a\x6b\x85\x3d\x82\xdd\x1f\xe7\x3f\x3e\x1d\x33\x39\x15\x53\xff\x57\xb8\xd5\x73\x43\xab\x17\x58\xe0\x10\x2a\x68\x60\x3f\xc3\x54\x62\xe7\x6f\xfc\xdb\x7f\xfd\xcd\x4d\xd2\x7d\xfb\xf7\xc9\xdf\xa2\x5e\x46\x7f\xff\x97\x63\xae\xa5\xbb\xa1\xf9\x69\x9c\x5f\x0e\x7c\xcf\xfd\xf5\xaf\x73\x9d\x5e\x14\x22\x99\xe2\x6b\x99\x7f\x61\x96\x00\x13\xca\x3a\x5d\xfb\x5c\x43\x66\x99\x4c\x71\x97\xc3\xb3\x4b\xf1\xdf\x3e\x40\x40\xed\x52\x89\x91\x24\xdc\x0a\x05\x02\xc0\x17\x1a\x2b\x6d\xf1\xe7\xd8\x68\x15\xe6\x7f\x30\x8f\x5b\x9f\x5a\xad\xe1\x98\x23\x2b\x39\x52\x4c\xbc\x95\x06\x70\x67\xf0\x5d\x81\x1c\x9c\x92\xd7\xbd\x4c\x73\xc3\x3a\x0a\x07\x98\x21\xe8\xbd\xea\xe6\xf6\x07\xa5\xed\x1f\xc2\xf2\xfb\xc4\x44\x6c\x64\xce\xf8\x4a\xcb\x94\x55\xd0\x37\xcb\x9d\x40\x05\x9e\xed\xba\x75\xe1\x6c\xcd\x72\x69\x2c\xbf\x12\x53\x76\xe1\x64\x56\x9c\x61\x80\xd4\x53\x0c\xba\xd0\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x65\xd9\xe9\x9c\x99\x2a\x81\xe6\xbc\xa5\x98\x78\xe9\x48\x77\x6d\xf0\x98\xfa\x5d\xc6\x61\xb1\x97\x1c\xed\xa7\x22\x85\x9f\x62\xab\x5f\x45\xdb\x6b\x23\xaf\xda\xcd\x53\xab\xa4\x96\x88\x40\x4c\x68\xaf\xed\x84\x60\xe6\x13\x80\xd0\x94\xa3\x80\x81\x12\x89\x30\x86\x97\x6b\xec\x86\x2a\x43\xd3\x46\x4a\x79\x05\x49\x9d\x73\x55\xc1\x00\xa5\xc0\xde\xba\x55\x02\xd4\xe1\x6c\x56\xea\x2b\xa1\x42\x09\x81\x5b\xc5\x66\x42\x75\x9d\x35\x8a\x6d\xa7\x59\xb2\xe4\x6a\x21\xea\x2a\xf2\x9c\xa7\x40\xfb\x1f\x82\xa6\xe5\xdf\xc7\x51\x80\xcf\x9d\xc2\x22\x2d\x90\x62\xe6\xe4\x53\x08\x7b\xbc\x51\x01\x07\x77\x5c\xc7\x25\xdc\x2b\xc9\xac\x13\x4f\x64\xc3\x38\xc2\xfb\xbb\xc0\x27\xa0\x50\xdc\x63\xf2\x76\x2e\x2c\x4f\xb9\xe5\x83\x25\x70\xbf\xe0\xa1\xeb\x27\x25\x75\xc0\x76\x88\x92\x3d\x48\xc6\x7a\x55\x52\x17\x32\xc6\x15\x00\x6e\xb0\xf4\xab\x0f\xb8\x54\xd6\xed\x6b\x0a\x3a\x62\x5e\x36\xe8\x6a\x3c\xcb\xf4\x35\x21\xd5\xf9\xd1\x90\x65\x89\x94\xa5\x15\xa8\x7d\x35\x4b\xeb\x13\x14\x1f\x24\x66\xe2\x16\x7a\x30\x2a\x5f\xd6\xb1\xff\xa4\x99\x9b\xbd\x55\x41\x43\x59\x27\x94\x95\xd8\x43\xdf\x03\x41\x10\xf1\x2b\x85\x47\xb5\xb5\x0c\xb0\x4e\x0b\x61\x4d\x9d\x55\x89\xd2\xc4\xb1\x48\x92\xe5\xe4\x44\x00\x51\x43\x4b\x43\x76\xf8\x76\x4d\x11\x17\xce\x68\x92\x16\x4e\x7e\xdd\xfb\xca\x0c\x17\x3c\xc2\xf6\xb7\x2f\x74\xda\x3f\x0a\xd5\xea\xe3\x5a\x0f\x5c\x57\x9b\x60\xe5\x91\x01\x27\x0f\xde\x00\x31\x79\xd3\x80\xc9\x40\x11\xb0\xe4\xab\xee\xee\xd4\x5a\x33\x9d\x84\x66\x6d\xf0\xb8\x09\x3c\x6e\xf2\xb8\xaf\xe3\xba\x7f\xd6\xa2\xbf\x7a\x66\x2f\x36\x27\x34\x40\xa4\xc2\xb1\xd6\x8b\x41\x02\x09\x2d\x14\xa5\x30\x2e\xc9\x5f\xca\xcc\x08\xd9\x30\x54\x4f\x2b\xa4\xe3\x9a\x4f\xd8\x1f\x1a\x1a\x17\x69\xb6\xc1\x1a\xc6\x2a\xa6\x03\x6f\x1e\x4f\x69\xe1\x3d\x9c\x57\xf3\xf6\x51\x6b\x30\x50\xf5\xb6\x5b\x8d\xbe\x5a\x2a\xa8\xdf\x4e\x55\x86\x3e\xfc\xa1\x46\xd5\x6d\xe6\x52\x67\x99\xef\xdd\x8e\x16\x72\x2b\xb7\x09\xfa\x06\x61\xb4\x64\x1c\xdc\x10\x41\xdf\x57\xe2\x3a\x28\x76\xdc\x20\x5c\xa9\x8f\xd5\x83\xab\xc4\x27\x9c\x6d\x1b\x6f\x0a\xcd\xef\xe1\xfb\x23\xb5\xc6\xc9\x1f\x47\xc4\x45\x07\x03\x5b\xb8\x47\x39\x1b\x40\xf1\x59\xe6\xb4\x90\x68\x01\xc2\x73\x5a\x22\xcd\xea\xe8\xae\x57\x62\x4e\x9e\x81\xf8\xa3\x0f\xfb\x2d\xca\xc3\xc6\x0f\xa7\x75\x7a\x24\xa9\xc9\x11\x44\x26\x51\xbd\x71\x4b\x33\x9d\xa8\x35\x5a\x03\xa9\x67\xdb\x0c\x7a\xe6\x1c\x0c\x98\x75\x30\x5c\xde\x01\x80\xc2\x48\xd5\x3d\x99\xb8\x1e\xa6\x43\xab\xf0\xf6\x35\x5c\xfa\x02\x64\x70\x42\xfa\xd6\x10\x71\xe0\x06\xdb\x39\x3a\x3f\x85\x81\xbd\x85\xb9\x80\x3f\xbc\xe6\x11\x02\x9a\x33\xe1\xf8\x42\x0d\x65\x05\x3b\x32\xfe\xed\x96\xfc\xb6\xfa\x70\xfe\x00\x7d\x9b\x28\x4e\xe4\xeb\x96\x9d\xe0\x3a\x3a\x3f\xc5\x27\x4e\xa1\x75\x2f\x57\x6b\xd2\x09\xed\x52\x96\xe9\xa4\xe0\xa5\x5d\xa3\x93\x65\xdc\x78\x5a\x28\xde\x1c\x80\x1c\x83\x86\xb0\xfb\xb4\x7a\x8b\xaf\xc6\x1a\x01\xf9\x7c\x80\x88\x22\x7c\x37\xae\xcc\x43\xa3\x48\xdf\x52\x52\x7f\x35\x28\x12\xb7\xfa\xf1\x3e\x96\xcf\x82\x22\x0d\x1e\xfd\xb1\xf4\x07\xc7\xfe\x4d\x33\xed\x06\xd5\x01\xd0\xf5\xc9\x2f\xa6\xe3\xfa\xb6\xa0\x5b\x82\x93\xc2\x8d\x34\x66\x72\xee\x04\xb1\x56\x13\xaa\xaa\x0f\x4e\x7c\xd2\x4f\x7d\x7e\x2a\x3a\x1c\xe0\xe8\x46\x4f\x89\x7f\x1a\x4e\x39\x3b\x50\x5a\xe1\xc9\xc7\x7b\x47\x98\x98\x7b\x83\x07\x1a\x6e\x09\xd2\x3c\xf6\x4b\x44\x9c\xc6\xab\x09\x52\xa5\x6e\xd9\x41\xec\x81\xc7\xc2\x54\x49\x22\x44\xf0\x71\xc5\x0d\xed\x6b\xce\x44\x53\xce\xb9\x4d\x96\xc2\x30\xa3\x01\x18\xd5\x58\x9e\x65\xb5\x6f\x89\x08\xa5\x41\xd3\xf1\x7e\xfe\x48\x01\x6a\x94\xa1\x93\x9b\xad\xc8\x38\xf9\x72\xe6\x95\x4a\x30\xf5\x4b\xda\x75\xdc\x12\xb5\xa1\xec\x81\x41\x6d\xd0\xe5\x24\xe7\xe8\x5d\x8e\x0c\xe3\x40\x4c\x60\xad\x6b\x64\xa6\x4b\xdf\x74\x1c\x6c\x35\x42\xff\x73\x7c\x74\xc6\x93\xab\x6b\x5e\xa6\x06\x2a\xec\xb9\x95\xd8\x84\x71\x8c\x5a\x47\xac\x44\xa8\xfd\xfd\x38\x42\x2b\x55\x5b\xbf\x89\x27\x72\x10\xcd\x7a\x43\xef\x19\x05\x7d\xc7\x88\xd0\x9e\xaf\x9e\x18\xe3\x95\xd5\x39\xb7\x32\x01\x57\x94\x9c\x47\xd1\x85\x3c\xb4\xb5\x08\xd1\x61\x94\x02\x20\x57\xe8\xc5\x69\x1f\x6c\xd7\x80\xb6\x4c\x3c\x9a\xab\x7f\xcd\xed\xf3\x8a\x44\x13\x3d\xe8\x12\x03\xd5\x10\x05\x2b\x85\x60\x32\x77\x0a\x2c\x87\xce\xd9\xf3\x50\xec\xef\x43\x2e\xb7\x11\xc5\x69\xe9\x3f\x41\x9c\x2b\xba\x0b\xfd\x69\x59\xa6\xaf\x0d\xb3\xd7\x3a\x18\xfd\x75\x34\x81\xaa\xda\xc7\x2d\x95\x8e\x7e\xe3\x8e\x9a\x23\x4b\x74\x8e\xc6\x6e\xef\x5c\x8b\x2c\x73\xff\xbd\xed\x34\x99\xe9\xb6\x19\xc9\x85\xc2\xba\x67\x69\xbc\x07\x86\x12\xd9\x0f\xd2\x52\x17\x05\xf9\x52\xf3\x51\x7b\x46\x10\xba\x2c\x57\xc2\x40\xd8\xde\xa7\xc6\x3b\x32\x2c\x84\x12\x25\xb7\x10\x08\x21\x34\x47\x60\x28\xed\x47\x34\x96\x71\xeb\xe4\x62\x72\x61\x20\xe8\x76\xf2\xd0\xb7\xe0\xb1\x70\x94\xf2\x1b\xc6\x4c\x11\x31\x67\xc4\x5e\x1b\x7c\xa1\x70\x66\x43\x1a\xff\x07\xd9\x0c\xe8\xf6\x25\xb3\x61\xca\x0e\x8e\xb2\x62\x19\x8d\x1a\x6b\xe9\xa1\x4c\xaa\x39\xd3\xc6\xf3\x9e\x96\xda\x98\x33\xff\x93\xbb\x3c\x7a\xa7\xc1\xdf\x36\xcc\x4e\x83\xdf\x69\xf0\x1d\xae\x9d\x06\xdf\xbe\x76\x1a\x7c\xfb\x0a\x0c\xfe\xa3\x90\x25\xa8\x37\x4d\x59\x72\x1b\x81\xd8\x99\xb6\x14\x62\x05\x15\x8f\xdf\xe8\x29\xe2\x20\x48\xae\xf9\x7a\xaa\x84\x25\x28\x1d\xef\x14\x7c\xe5\xc7\xfb\xae\x74\xca\x0e\xe9\xc6\xd1\x61\xf5\x27\xdf\x83\xf8\x44\x4f\xb1\x1a\xe5\x6f\x1d\xf1\x85\xcf\xf7\x0d\xc5\x3b\xdd\xf7\x50\x58\x17\x0f\x90\x88\x29\xbb\x10\xbe\x77\x49\xe3\xe1\x9b\x70\x29\xa9\xb0\x5c\x66\xa6\x16\xb8\x97\x37\x08\xf0\xee\x02\xf5\x21\xed\xb3\x50\x0c\x31\xac\x95\x58\x57\x37\x45\x89\x67\x71\x2a\x67\x7d\xc3\x4d\x21\x87\xd3\x39\x7b\x25\x12\xbd\x12\x25\xd2\xf6\xe4\x6d\xc1\x95\xb3\x84\x9e\x71\x99\x39\xca\x7a\x0a\xd7\xce\x55\xe8\xe3\xd5\x0c\xf1\x45\x1e\xed\xb0\xad\x69\x19\x73\x9a\x14\x21\xed\xb8\xfb\x29\x91\xa8\x28\xc5\x4a\xea\xca\xf8\x84\xd3\xca\xa2\x50\x32\x96\x6c\x8f\xa5\x5c\x84\x76\x9b\x21\x1d\xac\x14\x89\x2e\xd3\x7a\xfb\x1a\xcb\x6d\x65\x9a\x35\xec\x09\xc6\xd4\x86\x0b\xa7\x04\x3a\x3e\x20\x2d\x6d\x48\x7d\x06\x08\x36\xc0\x38\xed\x1c\x20\xb0\x56\x0c\x80\x69\x44\x1c\x30\xe6\x7e\x58\x1e\x24\x15\x2e\xa8\xdb\x44\x53\xff\x15\xfe\x78\x5c\xef\x9d\x3a\x39\x43\x9a\x3a\xad\xb8\xce\x74\x90\x60\x9f\x70\xc7\x50\x22\x43\x3c\xb0\x13\xd8\xbe\x5e\xad\x3f\x46\xcb\xff\x15\x3d\xeb\x28\x73\xd6\x08\xb2\xa7\x88\xa5\x6c\xc9\xa2\x90\x79\x5e\x59\x77\x0e\x3a\x27\x36\xc4\xd7\x70\x91\x35\x36\x5c\x74\x8d\xb5\xd7\xf1\x55\xbc\x22\x31\x46\x9e\x33\xfb\x21\x41\xc9\x2d\x9e\x4f\x60\x6a\xdc\xdd\x19\x08\xab\x79\x0d\x78\x6e\xf0\x1a\xce\xc6\xc1\x6b\x10\x13\x05\xaf\x21\x0f\x36\x5e\x43\x29\x7d\x78\x6d\xaa\x7e\xc0\xb6\xc1\xed\xd6\x50\x01\x1b\xbb\xa3\xd0\xe9\x74\xcb\xf1\x0e\x09\x75\x3a\xa5\x6c\xb9\xa6\x73\x10\x8b\xe7\x4f\xdd\xf0\x57\x3e\x33\x35\x88\x18\xbe\xe2\x32\x83\x3a\x08\xa9\x8c\x4c\x05\xf6\xfa\x21\xb6\x30\xd8\xfb\x0e\xaa\x6d\xb6\x32\xd9\x1d\x67\x9c\xe4\xbc\x98\x5c\x89\xf5\x40\xcb\x3d\xd8\x4e\xdc\x9c\x28\x52\x22\xe7\x45\xef\xd1\xb1\x44\x64\x70\x81\xb3\xff\x1c\x4b\x4f\xf0\xc3\x19\xe9\x3d\xbe\x1a\xa6\xae\xc4\x49\x74\x5e\x54\x56\x44\xfa\x11\x69\x32\x77\x56\x1a\x1a\x00\x8c\x87\x39\x57\x7c\x21\x26\x61\xd8\x49\x5d\xfc\xd2\xb9\x21\x78\x7c\x0d\xcc\x06\x87\x45\x0a\x8c\xaf\xcf\xae\x56\xa6\x79\x0d\x56\xa6\xcb\x3e\x4a\xa9\x2e\x1b\xbe\x5c\x97\x7d\xfc\x92\x5d\x16\x20\x14\x86\x3f\xf7\xaf\x3c\xa4\x43\xeb\xe4\x93\x1d\x74\xdb\xc9\x6f\x60\x07\x87\x71\xa4\x61\x3a\x97\xd6\x0a\x9f\x31\x1d\x4e\x32\x64\xb8\xc4\x25\xed\xc4\x73\x20\x34\x85\x69\xd1\xe2\x6d\x68\x9a\x1a\x59\xeb\xe0\x4a\xbb\x96\x06\xed\x6b\xc5\x64\x5e\x60\x0b\x07\xe0\x1d\x13\xaf\x06\x53\xe8\x67\xc7\x87\xfa\x8f\xbb\xe3\x43\xf1\xb5\xe3\x43\x0c\xda\xcf\x66\x50\x2d\x3d\xa8\x27\xc6\x0f\x4a\xd8\x91\x7c\x26\x32\xf6\xef\x4a\x94\x6b\xa6\x57\x22\xaa\xab\x82\xfe\xb2\x4e\x53\xc5\xca\x24\x8a\x73\xf7\x55\x55\x1f\xa8\x53\xe1\xff\x67\xef\xdb\xbf\x1b\xb7\xad\x84\x7f\xef\x5f\x81\xe3\xf6\x1c\xdb\xa9\x24\xcf\xa4\xdd\xb6\x3b\x5f\xb7\x3d\xce\x78\x26\xeb\xcd\x3c\xfc\xd9\x93\xe4\xec\x97\xc9\x6e\x20\x12\x92\x50\x93\x00\x43\x80\xf6\xa8\x8f\xff\xfd\x3b\xb8\x17\x00\x41\x8a\x92\x48\x89\x7e\x4d\xc8\x1f\x92\x31\x45\x82\xc0\xc5\xc5\x7d\x3f\x40\x21\x78\xf5\x29\xcb\x19\x96\xfc\xea\x9d\xea\xd7\x3f\x50\xad\xdc\x89\xbb\xe0\x77\x26\x34\x47\x61\x50\x74\xc5\x40\x45\x73\x46\x4e\xdf\x9d\xf5\x69\x37\x7c\xec\x5a\xfd\xe9\x06\x10\x21\x28\xfd\x2f\xc0\xd8\x7c\x5c\xb3\x77\x0d\x93\x6b\xb6\x1c\xd9\xf4\x01\xdb\x5c\xdc\x3d\x8c\x99\x38\xd5\x0e\x87\xfb\x55\xc6\xae\x5e\x4f\xc0\x20\xb0\x5f\x47\xbb\xea\x58\x0e\xb8\x8f\xd4\xc0\xb0\x77\xe7\xbb\xf0\x5a\xd7\x05\x0f\xb1\x15\x9a\x66\xb9\xf2\x00\x1e\x41\xa1\x24\x02\x50\xd8\x47\xab\xf7\x13\x68\xce\x84\xdb\x78\x47\xc0\xf2\x47\xb0\x92\x87\x7e\xcd\x96\x87\xca\x16\x8f\x93\x42\x2d\x78\xe6\xda\xa2\x03\x9d\xb4\xa7\x92\x7c\x07\x09\x1f\x6e\x08\xa4\x88\xe7\x62\x44\xde\x49\x6d\xfe\xf7\x0a\x32\xd8\xe0\x1c\x9f\x49\xa6\xde\x49\x0d\x77\x1e\x35\xb8\x71\x69\x77\x04\x6c\x1b\x54\x63\x8d\xce\x90\xab\x09\xc5\x5a\x5c\x5e\x13\x00\xd5\x86\x7a\xfb\x8d\xe1\x8a\x9c\x0b\x22\x73\x07\x55\xed\x3a\xbd\x2a\x3b\x84\x73\xcb\x07\xa1\x52\x0d\x63\xd8\xcd\x90\x79\x65\x2f\x36\x0c\xe7\x83\xa1\xb8\xfb\x05\x3c\x81\x10\xd8\xe6\x93\xb1\xa0\xdb\x28\xd5\x6c\xce\x23\x92\xb2\x7c\x0e\x85\x06\xa3\x45\xdf\x5b\xdc\x17\x5f\xc4\xab\x47\xee\x88\x57\xaf\x78\x08\x22\xca\x1b\x48\xb3\xbb\x1b\xf1\x07\xc7\x46\x76\x9d\xd2\xcc\xa0\xe0\x3f\x0c\x57\x06\x2c\xf8\x17\x74\x33\x56\x13\x72\x4a\x14\x17\xf3\x84\x55\x7e\xb3\x0e\xb4\x70\x18\x33\x82\xd1\x5f\x7f\x2e\xf8\x0d\x4d\x18\xa6\xc5\x52\xe1\x7b\x0d\xca\xd9\x8a\xd0\x35\xb2\x2d\x8d\x0d\x5d\xf6\x56\xdb\x83\x6b\xb6\x3c\x18\xad\xa0\xed\xc1\xb9\x38\x28\x6b\x96\x56\x10\xd5\x0b\x17\x10\x21\x76\x00\xbf\x1d\xdc\x8f\x9c\xf6\x04\xd4\xd8\xde\x70\xd2\xfa\x38\x5f\x26\x14\xbd\xea\xfd\xfa\xa3\xeb\xa3\x37\x75\x52\xbb\x0a\x9e\x29\x63\x11\x6c\xca\x75\xef\x8e\x5b\x28\xf9\xd1\x57\x02\x5c\x0f\xf0\xc7\x79\xed\xd3\xbf\xc3\x5d\x0d\xbd\x6f\xa0\xea\xb0\x2b\x09\x53\x29\x21\x56\xc6\x7b\xaf\x81\xf8\x77\xe0\x82\x97\x33\xf2\xba\xec\x90\x06\xce\x4e\x23\x56\xd9\x22\x31\x42\x6a\xc2\x45\x94\x14\xd6\xfb\x0e\xaf\xa2\xcb\xf6\x71\x81\xb7\x77\xc4\x2e\x87\x75\x18\xed\x22\xd4\x57\x32\xff\xeb\xf1\xba\x10\xbe\xed\x23\x54\x11\xda\x0f\x09\xad\xd9\x4e\x39\xce\xd5\xce\x7e\x51\x55\xbe\x7c\xcd\xa7\x39\x23\x2f\x17\x54\x08\x96\x04\x65\x13\xad\x31\x94\x6a\x4d\xa3\x05\x06\x89\x50\x62\xce\x71\xc2\xf4\xa1\x22\x0b\x09\x4e\xc3\x68\xc1\x85\x2f\x24\x26\x7c\xf9\xd0\xb2\x90\xc2\x03\xf4\xc2\xdc\x57\x41\xea\xb1\x8d\xe2\xa1\xed\xa3\x68\xf1\x2e\x6c\x60\x58\x6d\xaf\x58\x76\xe4\xa9\x3f\x53\xb6\xa6\xb2\x67\x1e\x20\x8f\x7c\x19\x7a\xfd\xc1\xb3\x9b\x1b\x34\xa6\xde\xa0\xcd\xc5\x8c\xe5\x39\xee\xd0\x94\xd9\x17\x08\x9f\x91\x42\x04\xa1\xdf\xd8\xb5\x6d\x21\x6f\x49\x2c\xc9\x2d\x83\x58\x1f\x23\x40\x40\xf0\xb8\x72\xa2\x47\x30\x53\xc8\x33\x89\x64\x9a\xe5\x32\xe5\x3e\xf8\xda\xa2\xc7\x83\x55\x08\x4c\x8a\x9d\x9b\x2c\x54\x77\x31\x29\x44\xb5\xbb\xf9\xeb\x97\x44\xd3\x7c\xce\xb4\xf9\x06\x11\x45\x3a\x65\x7b\x16\x42\x7c\xe8\x36\x3c\xbd\xb6\xbd\x3b\xf4\x7d\xef\x2a\x50\xdb\xd2\xd0\x8e\x5c\xba\xb7\x20\x92\x00\x72\x58\x66\x32\x8f\x5c\x50\xa2\x6b\xa5\x87\x7d\x97\x0c\x16\x7e\x67\x19\x67\x21\xb4\xda\xb3\x0d\xd2\x3e\x0d\xf1\x10\x15\xbe\xff\xfe\x5d\x3f\x7d\x8c\x0e\xcb\xf1\xd6\x61\xdd\xad\xcc\x93\xf8\x96\xc7\x2e\x24\xeb\xc8\x3c\x7c\xbc\x1f\x04\x1e\xb0\xad\xd1\xde\x27\xfd\xf6\x96\xc7\x3d\x01\x1f\x86\xaa\x02\xdd\x25\xe4\x19\xa0\x13\x80\x3a\x8f\x99\xd0\x86\x58\xe6\x8a\x1c\xc1\x1b\xc7\xe4\x15\xc7\xd2\x53\xf0\x3e\x74\x0d\x48\xa7\x5c\x94\x65\xcd\xca\x4d\x35\xec\xd2\xd0\x0d\xa7\xde\x2b\xa6\xb1\x68\x10\xe4\x88\x4b\xbd\x20\x8a\xa7\x45\xa2\xa9\x60\xb2\x50\xc9\x72\x4f\xd4\x7e\xaa\x1b\x3b\x4b\xd8\x27\x3c\xe1\xfb\x0b\x3d\x7e\xa8\xaa\xf0\x03\xa9\x51\x65\xa5\xc0\x15\xe9\xa7\xcc\x2c\x8c\x4f\xbc\x24\xe4\x2b\x5f\xb1\x4f\x2c\xb2\x45\x11\xb2\xa4\x98\xf3\x9d\xaa\xe0\x0c\x8d\xbf\x77\x7a\xbb\x5d\xe3\xef\xb2\xbf\x71\xa1\x58\x59\xaa\xd7\x96\xa8\x7b\x28\xb9\xa4\xff\x3e\xdd\x0f\x2b\x5f\x7e\x68\xee\xd1\x1d\xb3\x8c\x89\x18\x7a\x05\xbd\x2e\xcf\x1f\x4e\xfe\xc1\x60\x6f\x7b\xf4\xf4\xc3\x2b\x5c\xc3\x9f\x0a\x97\x0e\x22\x20\x17\x32\x89\x15\x61\x9f\x74\x4e\x0d\x3b\x48\x0d\xe1\xf7\xef\xcc\x08\x15\xfb\x92\xf6\xcf\xa5\xd3\x2c\xb9\x27\x09\x34\xfe\x4c\x25\x50\xd5\x6b\x0b\xfa\x43\x15\x36\x9e\x2f\xa1\x57\xb9\xdd\x73\x37\x7a\x64\xa0\x96\x3a\xa8\x6a\x41\x83\x86\xae\xf1\x65\x42\xd4\x6a\x65\x9e\x1d\xbb\xc7\xab\x86\x5e\xd2\xb5\x59\x3d\xe0\x61\x1d\x5a\xc9\x3f\xad\x56\xf2\x33\xa8\x6f\xba\x7f\xb7\x0f\x3b\x4e\xcd\x66\x67\x6f\x5a\xb1\xb5\x8d\x8d\xce\x9e\xa8\x80\x27\x9b\x7d\x73\x03\xd9\x3a\x61\x44\x99\xdd\x28\x93\x1a\x0b\x21\x76\xa3\xe6\x0f\xdd\x68\x9b\x6a\xaa\x98\xde\xc7\x92\x5c\x15\x30\xcb\xf1\x0c\xc9\x09\x31\xdf\xfe\x84\xed\xea\xa1\x6e\x88\xab\xf9\x49\xc6\x7f\xb1\xb2\xa8\xa8\x3c\x69\xa4\x50\x07\x77\xd7\x0d\x84\xf9\xc8\x32\x1c\x23\x36\xbb\x1d\x51\xbd\x73\xbe\xed\xde\xdc\xd8\xce\xf6\xdb\x6f\xcf\xcf\xfa\x04\xa1\x19\xcf\x49\xab\xf0\xef\x2a\x18\x27\x3e\x15\xac\x10\xfc\xe7\x22\x54\xb4\xa1\x56\xb9\x07\x9c\x7d\xfe\x21\xa0\x33\x8f\x58\xe9\x26\x38\xe3\xea\x7a\xff\x8e\x3e\x2b\x43\x56\x8f\xfb\xd7\x2f\x5f\x11\x7b\xb7\x95\x75\xbe\x8b\x79\x7e\xdf\x36\x30\xf3\x88\x95\x8e\xbb\x98\xab\xeb\x07\xe8\x06\xb4\xaf\x0e\x9c\xc5\xef\x76\xcb\xb9\x79\x9c\x9e\x86\xba\x86\xe7\xfa\x06\x04\x0d\x2d\x96\xb2\x20\xb7\xb6\x6e\xb6\xd5\x10\x3f\xf0\xec\x05\x79\x25\x54\x91\xb3\x32\x42\xab\x3e\x94\x91\xb7\x5a\xeb\x8b\x50\x9a\x5c\xbd\xe8\xcd\x2b\xd1\x37\xa6\x7e\x2e\x6e\x8e\x8c\xe6\x1a\x14\xb9\x7e\x10\xc9\x0f\xe7\xe8\x74\x70\x43\xb4\xc1\xa4\xf3\x99\x4b\xbe\x18\xd9\x22\xba\xbe\x53\x90\x7b\xc8\xe0\x4e\x50\x55\x3f\xc4\x96\xd7\xbe\x93\x05\x39\x89\xd9\xcd\x89\x8a\xe9\xf3\x11\x7c\xc6\xe5\xa8\x57\xe7\x44\x15\x39\x78\x7e\x30\x21\x57\x3c\xe5\x09\xcd\x93\x65\xa5\xa3\x6f\xf9\x9c\x61\xbb\x6e\x40\x88\x66\x79\x76\x40\x8e\x64\x0e\x23\x47\x54\x90\x84\xb9\x12\x5e\xf6\x54\x2f\x51\xef\x38\x7e\x1c\x24\x92\x3c\x1a\x4f\x11\x52\xcb\x9e\x70\x2d\x76\x32\x95\xe5\xf7\x95\x2e\x0d\x67\x25\xc3\xe3\xc2\x70\xc1\x09\xf9\xd6\xb2\x2f\x2b\x17\x20\x32\xc0\x61\x76\x4f\x3c\xae\xcd\x7a\x7c\xf6\x90\x9d\x2c\x1b\xab\xae\xbb\xc7\x06\xe8\x5d\xad\x27\x73\xae\x2f\x59\x26\x7b\x90\xe1\x70\xa0\x9a\x7f\x81\x6b\x73\x43\x2a\x0e\xfd\x18\xa9\x26\x14\x49\x52\x54\x24\xd4\x28\x75\xe8\x5d\x98\x90\xb3\x57\x17\x97\xaf\x5e\x9e\x7e\x78\x75\xf6\x82\x7c\x6d\x47\xe2\xa1\x1e\x30\x21\x1f\xc2\x46\x2b\x41\x46\x9b\xed\x66\xe1\xbf\x35\xb2\x24\x96\x8a\xb2\x53\x1c\x14\x9e\xa7\x82\x9c\x0b\xae\xcb\x1e\xb9\x98\x17\x90\x48\x61\x23\xfd\xcd\xdb\xd6\xbb\x31\xe7\xda\x96\x32\xc6\xc1\xcc\xcf\xd5\xd1\x6c\xda\xb7\x11\x36\xcb\xac\xed\x27\x28\xfc\x95\xdb\xf3\x10\x8a\xaa\x6b\xfe\xd8\x8f\x8e\xe5\x1b\x7f\xba\xfa\x56\xe8\x2d\x2e\xef\x23\xb3\xf5\x7d\xce\x5d\x27\x09\x99\x57\xda\x90\x4f\x26\x87\x13\x62\xd8\xf8\xe1\xe4\xd0\x89\x7c\xc9\x4a\xaf\x7c\x3f\x68\xd8\xb0\xa7\x8a\xf0\x13\x42\xde\xbb\xb4\x49\xa8\x62\xda\xdc\x76\x1f\x0b\x8e\x07\x4d\xd6\x6b\xc7\xc6\xd5\x8a\x29\xa6\xe1\x47\x6d\x87\x9f\x39\xbf\xb1\xb5\x28\x1f\xcc\xa7\x50\x4e\xb5\x97\x6d\x0c\x57\x6e\x35\xe5\xcb\x37\x0f\xb7\x36\xa4\x38\x3d\xad\xcc\x92\x2f\xbb\xae\x48\xa6\x29\xb6\xa4\x59\xf8\x2a\x79\x65\xa1\x3b\x4f\x1d\x1f\x44\xcb\xc7\x46\x3c\xb3\x9d\x0e\x76\x8d\x33\xb8\xa1\x6a\x5a\xbd\xbf\x6d\xd3\x9b\x45\xa9\x4e\x75\x6f\xdc\x6b\x3b\x41\x29\x57\x40\xcc\xb2\xd9\x13\xff\xf1\x93\xcb\x57\xa7\x67\x6f\x5f\x4d\xd2\xf8\x09\x12\x69\x26\xe2\x4c\x72\xa1\xd5\xae\x1a\x3e\xd5\x8b\x07\x20\xef\x7e\xda\xfd\xc8\x70\x7e\x38\x77\x7e\xdc\x8d\xa0\xad\x97\x2d\xcd\x16\x60\x97\x96\x99\x4c\xe4\xbc\xb9\xe3\x6f\x07\xb4\xf9\x35\xb6\x84\x18\xd3\xb1\xc1\xc7\x87\x53\x76\xf5\xa2\x2f\x3d\x57\x2f\x1c\x20\x4b\x68\x79\xbd\x51\x2f\x3e\x0f\x80\xdd\xa3\x1a\xb1\x02\x45\x34\xe7\x00\x79\x73\x5d\xd7\xca\x36\x66\x19\xcb\x53\x8e\x59\x28\x6d\xf5\x8b\x87\x01\xfe\xae\xaa\x85\xa1\xe4\x17\x3b\xa2\x6b\x15\xea\x6e\xa4\x2a\x03\xc9\x72\x36\xf6\x7d\x62\x66\x3c\x61\x50\x13\xdd\x4b\x48\x21\x3f\x71\x96\x60\x67\x37\xc6\xa7\x92\x65\xdd\x22\x1c\x94\x65\x73\x86\x78\xac\x1e\x9d\x24\xcb\xb2\x17\xa0\xb5\x86\xd1\x39\xf6\x7f\xc9\xad\x43\x2e\xcb\xf9\x0d\x4f\xd8\x1c\xfa\x7c\x72\x31\x0f\xea\x06\x86\x95\x06\x6d\x91\xc9\xaa\x73\xea\xad\xf9\x2b\xe8\x35\x0d\x98\xf5\xee\xfd\x07\x68\x19\x0b\x21\x15\x7b\x2b\x9c\xe6\x83\x70\xe6\xc7\xe3\x31\x98\xfe\x8e\xfe\x66\x34\x9f\x38\x39\x26\xdf\x33\xfb\x1d\x09\x3d\x6d\x73\x1e\x69\x72\xbb\x90\xbe\xc1\x28\xcc\xb5\x84\x2c\x20\x34\x86\xf1\xd9\xa7\x4e\xcc\x93\x46\xa2\x46\x56\x5e\x79\x9e\x33\xe8\xda\x55\xc6\x19\x3c\x45\x2d\xe9\x81\x18\x68\xcf\xd4\xde\x39\x9b\x9a\xce\x88\x0f\x1f\x70\x7c\x81\x12\xb5\x4c\x13\x2e\xae\xcb\xa6\x48\x33\x69\xeb\xaa\x32\x62\x7e\x70\xa7\x26\x67\x34\x59\xcf\x31\x76\xc1\xd1\x07\xe3\x16\xba\x37\x7f\x04\xf8\x0b\x0c\xb5\xf8\x4f\x47\xbc\x6c\x00\x58\x48\xea\x0f\x0e\x9e\x34\xc4\xb8\x8a\x14\xdf\x9f\xbc\xc3\x30\x15\xda\x2e\xc8\xf9\xd5\xcb\xab\xf3\x7b\xf5\xfa\xad\x63\xae\x30\xbb\x27\xad\x3d\xf0\x9f\x77\x8b\xaa\x1a\x93\xa4\xd8\xf5\x4d\x34\xbd\x5c\xc8\x5c\xd3\xe4\x01\x08\x67\xb4\xa0\xd9\x69\xa1\x17\x67\x5c\x41\x79\xe0\x7e\xc4\xbf\x95\x51\x83\x7c\x45\x6c\xbc\xec\x3a\xcc\x71\x87\xbe\xf6\xb9\x97\xff\x79\x7a\x41\x68\x61\xf0\x51\xdb\x9e\x9a\x0f\x16\x2c\xe7\x56\x71\x85\x39\xd0\xbd\x42\xc6\x8e\xb9\x05\x2e\xee\xa9\xc7\x04\x95\xfb\xcb\x7a\x1b\xfc\xd1\xc0\xb9\x90\xea\x7f\x26\x3e\x68\x2e\xb8\xe6\x54\xcb\xbc\x37\xdf\x60\x65\x44\x6f\x30\x2c\x94\x96\xa9\x3d\x45\xe7\xee\x09\x08\xc8\x02\xf9\x6d\xe5\xa5\xd2\x9a\x08\xda\x27\xc0\xfc\x5c\x18\x5d\x91\x46\xac\x96\x66\x33\x82\x5e\x97\x38\x36\xf7\xcf\xfc\xd9\x1a\xd1\xa1\xef\x50\xf2\x97\x17\x95\x6e\xf0\x65\x63\x49\xd7\xc2\xd7\x5a\x31\x23\x29\x04\x8b\xf6\xe9\x8c\xbc\xff\x96\xfc\xdc\x0f\x69\xe3\x3f\x8b\x9a\x3f\x01\x41\xf4\x7f\x0b\x9a\x20\x68\xdf\x3d\xa4\xf1\xbd\xba\xa5\xfd\xac\xb8\x8a\x25\x76\xf1\x25\x4a\xbc\xf3\xd6\xb6\x42\x61\x57\x25\x84\x88\xce\xa9\x50\x06\x4f\xaa\xf6\x8c\x43\x1b\x00\x71\x48\x8e\x74\x94\x1d\x3f\x18\xa4\xfa\x4a\x87\x4d\x0a\x11\x0a\xab\xb8\xf6\x0f\x88\x1a\x6f\x7c\x3a\xec\x7e\xcb\x7c\xf0\x20\x07\x38\xed\xfd\xd8\x6d\xed\x58\x1e\x8f\x42\x78\xa1\x80\x48\xde\x70\xa5\x31\x8f\x06\x1f\x86\x32\x2e\x98\x4f\x68\x74\x81\x0b\x22\x73\xc2\xb3\xff\xa5\x71\x9c\xbf\x40\x39\xc2\xea\xaa\xf0\x6f\xe5\xfb\xfc\x50\xe1\xa3\x6d\x8e\xf4\x32\xb3\x1d\xde\x3e\xbc\xbc\x80\x27\x15\xf9\xd3\x1f\x9e\x81\x5e\xf0\xbb\x2f\xff\xf0\x6c\x4f\x44\x7c\xaa\x59\x85\xa4\x6f\x9b\x68\xef\x91\x15\x9f\x49\x16\x49\x25\x5b\x04\x9a\xc1\x18\x69\xf7\x0a\x93\x33\x0c\x9f\xb4\x44\x13\x0f\x82\xc1\x4a\xcf\xbd\xfb\x94\x89\x87\xac\x8b\x5f\x50\xd6\x05\xf1\xd9\xf8\x48\x58\x7b\x41\xe4\x70\x40\x28\xab\xb3\x4a\xc0\x91\x76\x5f\x3c\x15\xda\xbd\x23\x74\x77\xc5\xe4\x2a\x06\x87\x21\x7e\x36\x11\x37\x48\x4f\x3d\x7b\x77\xf5\xbf\x6f\x4e\xbf\x7a\xf5\x06\xd6\x6a\xa3\x02\x0d\x7a\x5a\x4d\x68\x97\x98\xf5\xf6\xe8\xbe\xbb\x71\x6b\x57\x90\xf6\x11\x60\x20\x6a\xa1\x05\x82\xbc\x7b\x7d\xd5\x35\xaa\x60\x5f\x75\x56\xcc\xf6\x80\xde\x53\xf3\x6b\x98\x57\xa1\xdb\xea\x43\x64\xce\xf7\xec\x14\x09\xca\xde\x57\xec\x28\x06\x87\x70\x8d\x7b\x9b\x3a\x76\xc4\x0d\xf2\xe8\x64\xbd\xcd\xfe\x6f\x03\x31\x84\x62\xef\x9e\xef\x7b\x85\xf6\x7e\x32\x64\xde\x57\x59\x87\x43\x1c\xcb\x89\x8f\x86\x84\x21\xef\xc8\x0d\x57\x35\xfc\x94\x29\xdf\x81\xe8\x33\xc0\xd6\xac\xa9\x59\xf4\xfe\xdc\xa1\x71\x58\xfc\xe7\x95\xeb\xf5\x17\x44\x15\x54\xf2\xba\xd7\xf5\x83\x77\x11\x99\x34\x0d\xda\x62\xf6\x59\xf9\xb1\xbc\x85\x77\xb0\xc5\xdd\x13\x64\x30\x30\xf1\x07\x4a\x2f\xf3\xdf\xee\xe7\x38\xfa\xe1\xea\x95\x56\x3a\x61\x09\xa1\xca\x09\x72\x36\xd6\x3c\x2c\xc9\xf2\x28\x51\x88\x3c\x3a\x3e\xe4\xd9\xd0\xf7\x3b\x9a\x1b\x1e\xd2\xd4\x90\x2d\xa4\x96\xa2\xe7\x1c\xda\xa6\x41\xab\x84\xed\x02\x9e\x78\x89\x99\xee\x09\xcb\x03\x7a\x8b\x19\x44\xde\xad\x6e\x34\x0f\xc7\xba\xa5\x70\x0e\xf6\xaa\x7b\xfd\xe9\x51\xa2\x2c\x3e\x3f\x7b\x00\x22\xf4\xb9\x15\x3b\xea\xea\x26\x7c\xb0\x40\xd9\xb8\xa7\xcc\x7d\x33\x90\x83\xf9\xf9\x99\x55\x17\x5c\x5a\xbe\xb2\xc7\x8a\xac\x3f\x57\x0f\x22\x4a\xc9\x5c\xdf\xca\xbc\xaf\xf2\x71\xd5\xe1\x6a\x51\x98\xf6\xb7\x95\x62\x1c\x9f\x27\x15\xc1\x55\x3e\x79\x4a\x72\x05\x94\xa4\xd6\x77\x7b\x1d\x45\xb9\x0b\x82\xf2\x74\x08\xc9\xdd\x08\x2e\x77\x5b\x89\xeb\xc1\xd4\x5f\x77\x3c\x7a\x01\x96\x1b\xcc\x9a\x41\x0d\xa2\x94\x74\x97\x82\xb9\x39\xa0\x3c\x0f\x42\x67\x73\x69\xe8\xd0\x6e\xe4\xa4\x4a\x62\xdd\x48\xe8\x1c\xc4\xb6\x8d\x49\x62\x76\x56\x8a\xb0\xe1\xa3\x2d\xd6\x35\x22\xd8\x33\x31\xa5\x99\xc2\xa6\x14\xb1\xbc\x15\xb7\x34\x8f\xc9\xe9\xc5\xf9\xfd\xd3\xd5\xbd\x33\x41\xf1\x3c\xec\xd3\x5b\xa0\x9a\x0b\x5a\x8e\x07\x11\xf8\x10\x24\x64\xfe\x98\x72\x8d\x7d\x99\x31\x18\x5f\x87\xd6\x28\xc3\xa7\x7c\x24\x8b\xa1\x74\x86\xaa\xd9\x91\x02\xb1\x4a\x10\x19\x69\x9a\xb8\xce\xff\x4c\xdf\x32\x26\xc8\xb3\x67\xcf\xd0\x41\xf1\xec\x8f\x7f\xfc\x23\x81\xae\x9b\x31\x8b\x78\xba\xfa\x20\x3c\xf5\x6f\xcf\x9f\x4f\xc8\x7f\x9f\xbe\x7d\x43\x68\x04\xba\x1c\x56\xbe\xc5\x91\x61\x3f\xc3\x97\xd5\x88\xfc\xd7\xd5\xfb\x77\x65\x3b\xf8\xea\xaf\x80\x2e\x7e\x79\x13\x72\x16\xc4\xde\x87\xce\x03\xaa\x17\x00\x0d\x21\x35\xa1\xb3\x19\x22\x9c\xeb\x49\x6f\x89\x89\xab\x3d\xc7\xe7\x0b\x58\x2e\x17\x80\x6a\x09\x24\x05\x70\x33\x45\x70\xd8\xb8\x3a\x8e\x98\xe3\x00\x63\x79\x26\x02\x53\x19\x91\x84\x5f\x33\x32\x53\x5f\xe7\xb2\xc8\xca\xc6\x29\x39\x53\x46\x01\x8b\xa8\x30\xa3\xe3\x60\xe5\xce\x28\xb6\x67\x6d\xcc\x87\x8e\x9c\xb0\xe7\xb4\x1f\x17\xb2\x3d\xf3\xae\x85\x98\xed\x0d\xe8\x72\xb4\x90\x64\x98\x5d\x78\xaa\x91\x0c\x95\xd5\x5e\xf8\xf5\x20\x52\xd9\xea\x87\x25\x65\xa4\x89\x14\xf3\x10\x07\x4b\xe9\xc3\x05\x53\x2e\x33\xb6\x2b\x30\x7a\x6a\xa8\xd3\x4f\x7b\x3a\x24\xee\x6f\x69\xb6\x5f\x27\x90\x6a\x8c\xae\x1b\xb3\x52\x87\x92\x4e\x65\xa1\x5d\xcc\x9e\xfd\x1d\xca\xb7\x69\xe9\x40\xbf\xd7\x14\x7a\xeb\x52\xd4\x5f\xdf\xbf\x9e\x9a\x6e\x55\x63\xe6\x80\x6b\x57\x45\xd6\x11\x61\x34\x5a\x90\x6b\xb6\x1c\x23\x07\xc8\x28\x54\x8f\x00\x68\x9f\x19\x18\x63\x99\xdc\x6a\x38\x43\xc4\x62\xa3\x4d\xda\xad\x70\x01\x96\x81\x7c\xe0\xaa\x4f\x38\x85\x4b\x59\xb9\xdc\xb6\xb2\x12\x81\x85\xd2\xf5\xae\x8c\xa4\xd0\xb6\x2f\xa6\xef\x5d\x05\x01\xa3\xb5\x82\x04\x86\xc2\xb0\xd8\xbc\xa6\x36\x7d\xb9\x8c\x2a\x35\x1c\xc5\xca\x1f\x85\x58\x79\x1b\xea\xb9\x43\x4c\xaf\x62\xb6\x32\x12\x75\x3d\x11\x83\xc8\xd4\x05\x8f\x20\xe3\xc8\x3c\x6e\x9f\x75\x50\xf2\x80\xa8\x14\x4c\x50\x4c\x17\x16\x34\x10\x27\x6c\xbe\xcd\x94\x22\x1c\x56\x98\xd2\xfc\x9a\xb9\x42\xc3\x34\x99\x90\x0b\x33\x49\x5f\x6d\x1e\x5b\x09\xde\x60\x82\x88\xa1\x31\x61\x25\x08\xf3\x91\xc3\xc9\xe4\x10\x59\x65\x43\x5d\x88\xbd\xb1\xa6\xcf\x2e\x72\xbd\x75\x8f\xab\xa0\xf2\x5b\x9a\x29\xec\xa6\x67\x54\x0b\xe8\x58\x29\xa1\x6e\x8b\x5e\x38\x61\x82\xee\x59\x42\x3c\xbc\x7a\x6e\x63\xd6\x6f\x27\xd4\xfe\xfa\xa0\xee\xe1\x6b\xaf\x5e\x7d\xf7\x3f\xed\xb1\xfb\xe9\xba\xde\xa7\x16\x87\x2c\x25\xe9\xab\x23\x63\xef\x2d\x37\xd3\x1e\x1a\x9b\xb9\xab\xea\x3a\x02\xf9\xb6\x52\x4b\xba\x95\x2e\x62\x4b\xa9\x27\xec\x49\x29\x1f\xe7\x33\x20\xa9\xcd\xb5\x6e\x42\xbd\xcc\x71\x18\x03\x81\x87\xd7\x3a\xf6\xed\xb2\xe7\xae\xbb\x68\x53\xbf\xbf\x5a\x52\xbf\xf6\x09\xa2\xa9\x5f\x55\x43\x46\x50\x56\xc2\xb3\xda\x30\xfb\x18\xb6\x4a\x4b\xe8\xd6\x59\x12\x87\x09\x79\x6b\x59\x31\x22\x39\x9d\x2a\x99\x14\xda\x57\xa2\x68\xe0\xd3\x30\xa8\xeb\xed\x89\x45\x9b\xdc\x63\x01\xd7\x06\x79\x05\x59\x59\x3f\x0c\x1c\xaf\x1e\x89\xcf\xbe\x01\xb2\x78\xfd\xc2\xc2\x64\xf1\xea\x71\x17\x9c\xb8\xd8\xf3\x4e\xb8\x61\x7d\xf5\x4e\x97\x11\x59\x91\x6e\x21\x46\x56\x2b\x14\x9d\x9d\xa0\x8a\x39\x94\xbb\x56\xc0\x2e\xaf\xfd\xad\xba\x76\x5d\xd6\xc0\x78\x7a\x71\xde\xa3\x56\x1a\x8c\xba\x46\x2f\x0d\x9f\x18\x34\xd3\x36\x57\x05\xc0\xe7\xa8\x99\x1a\x91\xde\x19\x90\xce\x4a\x88\x5a\x97\x9e\x21\xca\xbf\x00\xd5\x66\x65\xe1\xaf\x0d\x33\x0a\x93\xb9\xaa\x1d\x3a\xd0\x18\x5c\xb2\xad\xa0\xab\x87\x8b\xe1\x01\x12\xf7\xf9\xab\x41\x8f\x54\x79\x01\xe8\xef\x91\xb1\x53\xbf\xaa\x5c\xf4\xd2\x01\x91\x5c\xb1\xc4\x30\x3d\x52\x33\xd9\x64\x32\x7e\x81\x3d\xbf\xa9\x10\x52\x03\xde\xa8\x11\x49\xa0\x1f\xf9\x08\x4d\x31\x46\x02\x0d\xa2\xbf\xf2\xc0\x69\xda\xb3\xcc\xd9\x1b\xf2\x90\xde\x11\x88\x00\x12\x01\xec\x2e\xfa\xc1\x24\x72\x07\xd8\x64\xae\x52\x54\xe9\xb3\x2d\x7f\x05\xaf\xec\xf8\x0e\x89\x54\xb4\x60\x29\xc5\x7e\x24\x0e\x40\x86\x5e\xdf\xe6\x5c\x6b\x86\x55\xc7\x59\x9e\x2a\x22\x67\xa3\x8a\xdf\xf8\xe0\xe6\xf9\x41\x5f\xf2\x2c\xb9\x0b\x85\x9a\xb8\x13\xba\x6b\x19\xb0\x75\x57\xd5\x6f\x50\x51\x2e\xcc\xe9\x04\x6d\x3a\x81\x06\x49\xa2\x66\xb0\x34\x42\xc4\x0d\xc2\xff\x51\x83\xee\xee\x6c\x11\xbb\xda\x20\x46\x5e\x30\x1d\x6c\x10\x83\x0d\xa2\x8f\x11\xef\xcc\x06\x11\x30\x6e\x47\x4c\x1b\xec\x11\x61\x22\x9e\x33\x4a\x94\xa5\x2c\x82\x32\xd1\x06\xe5\x9d\x39\x42\xe6\x55\x5f\xc1\xe1\x64\x72\x78\xe8\x8c\x14\xf6\x7c\x14\x7a\x36\xfe\x13\x61\x22\x92\x31\x22\x95\x19\x3f\x57\x1a\x84\xda\x52\x2b\x0f\xe7\x92\xba\x6f\x85\xfe\x06\x18\xbb\x5f\x94\xe8\x91\x42\xb9\x90\x94\xd7\x77\x2a\x82\x95\x82\x97\x2f\x03\x66\x01\xe8\xab\x25\x5a\x09\xac\x0c\x91\x49\x78\xca\x6d\x7d\x42\x43\x2e\x98\xd2\x8a\x1c\xe1\xcd\x49\x94\x15\x23\xfb\xc0\x24\x65\xa9\xcc\x97\x23\xff\x90\xf9\xb1\xf2\x96\x7d\xe2\x18\xa4\xb6\xa8\xc8\x73\x26\x74\xb2\xfc\xe5\xca\x6f\x0e\xc4\x8f\x58\x7c\xf3\x58\xb1\x4f\xde\x47\xd3\x55\x45\xcb\xb2\x89\x00\x58\xef\x3c\xb4\x81\x0f\xd9\x0c\x8c\x51\x69\xfc\x31\x77\x99\xb8\x21\x37\x34\xdf\x39\x03\xa3\xe9\xba\x13\x89\x2d\xe6\x37\x5c\xc9\x9d\x73\xd8\x1a\x87\x0c\x81\x77\x65\x99\x32\xda\x88\x65\xa1\xb3\x42\x5b\xee\xe2\xce\xb6\x2b\xd9\xe7\xcf\x74\x4d\xf0\x7d\x7e\xd0\xe3\xe4\x32\xaa\x35\xcb\xc5\x0b\xf2\x3f\x47\x1f\x7f\xfb\xcf\xf1\xf1\x5f\x8f\x8e\x7e\x78\x36\xfe\xf7\x1f\x7f\x7b\xf4\x71\x02\xff\xf8\xe2\xf8\xaf\xc7\xff\x74\x7f\xfc\xf6\xf8\xf8\xe8\xe8\x87\x6f\xde\x7e\xfd\xe1\xe2\xd5\x8f\xfc\xf8\x9f\x3f\x88\x22\xbd\xc6\xbf\xfe\x79\xf4\x03\x7b\xf5\x63\xcb\x41\x8e\x8f\xff\xfa\x9b\x1e\x17\x41\xc5\xf2\x7d\x6f\x24\x18\xaf\xf1\x9d\x88\x11\xd5\xb1\x7b\x46\x5d\x42\x3e\x8d\x4b\x8b\xf6\x98\x0b\x3d\x96\xf9\x18\x3f\xf2\x82\xe8\xbc\xe8\x8b\x74\x95\xec\xef\xee\x68\x4c\x29\xc4\x94\x15\x30\x9d\x62\xf3\x08\x89\x08\x06\xa6\xf6\x68\x19\xb6\x7d\x6c\x9b\x8d\xc2\xf6\xc7\xc1\x1e\xdc\xe6\xba\xc3\x48\x25\x5b\xcf\xe6\x17\x1e\xa6\x74\x65\xbb\x29\x0f\x31\x4a\x2b\xd7\x10\xa3\xb4\x7a\x0d\x31\x4a\x1d\xaf\x21\x46\xc9\x5d\x43\x8c\xd2\x60\x1f\xdc\xff\xfa\x85\xdb\x07\x87\x18\xa5\xae\xd7\x10\xa3\xb4\xf3\xf5\x84\x62\x94\x50\xc8\x6f\x8a\x54\xb2\x62\x7e\x19\xa6\xf4\x68\xa3\x94\x94\xc1\x87\x88\x9d\x46\x91\x2c\x84\xfe\x20\xaf\xd9\x9e\x8e\xdc\x9a\x4e\xba\x32\x3a\x94\x44\x5c\xa3\xa3\xae\x3e\xfc\x28\x15\xd6\xbe\xe4\xd1\x1e\xe4\xc7\xfe\x24\x47\x5a\xc4\xdc\xe8\xa8\x3d\x1f\x16\x37\x6c\x58\x16\x5b\xc4\x2c\x2e\x7f\xb0\x24\x4d\x9b\xfd\x9e\x90\x53\x92\xb3\x88\x67\xdc\x30\x00\xa8\x15\x04\xf7\xf1\xf8\xf8\x2e\xce\x5c\x2b\x96\xcc\x6c\x27\x5b\x51\xa6\x39\xe7\x81\xfe\x69\x39\x4a\xe3\x67\x50\x86\x90\xae\xd7\x28\x51\x0b\x59\x24\x31\xc9\xd9\xdf\x9c\xf0\x61\x67\xf3\x21\x1c\x21\x34\xa9\xc2\x52\xca\xcf\xda\xc1\x69\xc6\x6d\x51\xb1\xc7\x44\x06\xd9\xa7\x8c\xe7\x70\xd8\xae\x58\x24\x45\xdc\xb7\x85\x64\x65\xfc\x52\x56\x00\xbf\x10\x8b\x49\x5c\xe0\x03\x90\x8e\x49\x13\x1e\x73\xbd\xf4\xf1\x1c\x78\xec\x8d\xd8\x8a\xbd\x83\x2d\x22\xa8\x72\x23\x08\xcd\xb2\x5c\xd2\x68\xc1\x54\xf0\x35\x14\x42\x6d\xa1\x0c\x9f\xe5\x99\x14\x73\x2e\x50\x0e\x85\x77\x8c\xb0\x92\x2c\x49\x2e\xb5\x0b\x4d\x5b\xf3\xc1\x0f\xc1\x60\xf0\x3a\x4a\x1c\x3a\x5f\x42\xfc\x9a\x0c\x87\xc0\x59\xf1\x59\xf8\x87\x22\x32\x89\x5d\x69\xd6\x3f\x3d\x33\x82\x7f\x64\xb1\xd8\x30\x01\x28\x9a\xa9\x25\x49\x8c\xf0\x64\x18\xc3\xfa\x97\xbf\xfc\x3d\x59\xc8\x22\x57\x93\xb0\xd8\xdf\x73\xb8\x87\x16\x0e\xa7\x38\x68\x92\x30\xaa\x34\x79\xfe\x8c\xa4\x5c\x14\x86\xe3\xf7\x84\x78\x7d\xc9\xba\x81\x94\xfb\x87\xdf\xef\x39\x5a\x3f\xf2\xed\x5a\xc9\x36\xc3\x8e\x79\x56\xbc\xb5\x67\x1c\x0b\x7a\x60\xd7\xcc\x9a\xb0\x6b\x59\x52\xb8\x8b\x42\xcb\x07\x3e\xf9\x3f\x17\x72\xba\xd4\xfb\x97\xb0\xb1\xe3\x54\x6b\xd7\xfc\x5f\x7b\xb3\x4d\xa9\xd8\xb2\x52\xec\x0e\x53\x79\xf0\x1e\xdf\x73\xae\xf4\x4e\x1d\xbe\xcb\x9a\x37\x3b\xbc\xbc\x2f\x33\x9f\x1b\xfd\xb8\x97\x4c\x7a\x18\xc9\x69\x74\xce\x22\x1d\x45\x4c\x01\x29\x72\x45\xe1\xc0\xb8\x8b\xcf\xee\xf8\xd1\x47\x5a\x6d\xa6\xa9\x88\x8c\x43\xfe\x1e\x7a\x95\xee\x05\xac\x7d\x44\x7e\x87\xd8\x3d\x41\x0b\x07\xab\xd2\x08\xc5\xc5\x1c\x5b\x8b\xa6\x45\xa2\x79\x96\x94\x90\xbb\x74\x2f\x58\x06\x1c\x7a\x0b\x68\x60\x9e\xa6\x58\xf4\x0a\xab\x9f\x83\x67\xe5\xc8\x8f\xc5\x84\xc6\x0e\x99\xb9\xe1\xe3\x19\xcd\xa9\x07\x7f\x24\xd3\x94\xaa\x63\xeb\x78\xa0\x10\x05\x63\xdb\x00\x99\xb7\x68\x52\xce\x38\x88\x3a\x78\x28\xc4\xd5\x4c\x50\xb1\xb3\xfb\xaf\x5a\x70\x1e\x86\x22\xf2\xd6\x07\xda\x63\x93\xfb\x1a\xc6\x5a\x81\xf8\x2b\x1a\x5d\x33\x11\x93\x6f\x95\x03\x5c\xbc\x14\x34\xb5\xf5\xe3\xb3\x5c\x62\x17\x75\x16\xd7\xde\x57\x23\x6b\x76\xc4\xd2\x27\xae\x80\x15\xca\x5b\x0f\x05\xc5\x42\xf5\x54\x3c\xd8\x0c\xb4\x8d\xde\x29\x34\xe9\xe6\xfc\x26\x62\x4e\x76\x34\xef\x3d\xd4\xe2\x6f\x76\xae\x56\x47\x9a\x4b\x47\xd9\x36\xa6\x78\x0a\x81\xa5\x7b\xcf\x25\x94\x89\xa7\x89\x21\x71\x4b\x5f\xf3\xa7\x86\x60\xd3\x25\xd8\xbd\x1e\xa4\xf2\x58\x3e\xdd\xbf\xa6\xd4\x61\x3e\x8d\xab\xc4\xec\x92\xc6\x52\x91\xaf\x12\x19\x5d\x93\x33\x06\x4a\xc3\x5d\x36\xdf\xcf\xa7\xf1\xd3\x6e\x9c\x99\xd2\xf9\x6e\x11\x23\x63\x92\x4a\xc1\xb5\xcc\x77\xa1\xc7\x8f\xa8\x50\xe0\xd0\xca\xb0\x4d\xc5\x74\x73\xce\x3e\x97\x46\x86\x06\xe5\xfb\x41\x1d\x18\xca\x9b\x4e\x80\xf2\xe0\x2d\x20\xaa\x3b\xd3\x91\x5f\x2f\xe4\xed\x58\xcb\x71\xa1\xd8\x98\xef\x1c\x08\xb5\x37\xa0\xae\xd9\x12\xa2\xca\x7a\x01\x95\x1d\xac\xa2\xb9\x6b\x09\x76\x76\xb8\x6f\xe4\xbb\xcb\xaf\xce\xbe\x55\x2c\x9f\x84\xda\xca\x09\xd3\xd1\x49\xc4\xb2\xc5\x89\x1d\xe1\xc9\x83\xd5\x91\xcd\x7e\xe0\xea\x46\x43\x41\x20\x92\x49\x62\x0b\x8c\xc9\x19\x79\xc9\xb2\x85\xff\xdc\xe3\x80\xdb\x53\xee\x29\x97\x49\xd9\x4f\xbb\xa9\x43\x33\x52\x95\x6c\xc0\x1d\xa4\x1a\x01\xf2\xe7\xd3\x6e\x8d\xbc\x1f\x23\xba\xdf\x63\x77\x96\x5d\x5a\xf1\x3d\x0a\xf0\x3e\x9e\x96\x7e\x87\x95\x9e\x7e\x61\xfe\x50\xb5\x61\x9f\x8b\x4e\xad\x90\xed\xf3\x19\x2a\xa3\x31\x8b\x89\xbc\x61\x79\xce\x63\xa6\x88\xa7\xdb\xa1\x0d\x8a\x27\x8f\x03\xf2\x43\xef\xc0\xa7\x15\x70\xf0\x78\xcc\x0f\x87\x60\x7f\xa8\x10\x71\xb8\xb3\x42\xc4\x69\x9c\x72\xf1\x38\xb0\x7d\x47\xb8\xa9\x88\x26\xec\xfc\xfd\xde\xda\xba\x1d\xa7\xaa\xb0\x5f\xd9\x9b\x41\x4f\x81\x2d\x75\xf6\xbf\xf1\xb8\x4b\x84\x8c\x77\x73\xa0\x3d\xb0\xda\x3d\xa7\x9a\xdd\xee\x28\x08\x8d\x4b\x92\xbf\xeb\xfb\xa0\x9e\x3d\x6d\xb5\xfd\x51\x74\x0a\x09\x4e\x39\x96\xfc\x7f\x28\x21\xcb\xe2\x53\x3f\x8e\x24\x1c\x2b\x6c\xca\x56\x6f\xc5\xe6\xce\xec\xe9\xc5\x39\xf9\x1a\x1f\x7f\xb8\x2e\x28\xb9\xd4\xa8\xf2\x9c\xc9\x94\xf2\x7e\x1a\xa0\xd7\x07\xad\xf7\xc3\x0a\x81\x70\xe1\x9f\x25\xf6\x61\x23\x14\x95\xe5\x86\x8b\x9c\xc5\xc4\xda\x53\x3e\xb3\x16\x0f\x2b\xe2\xf4\xe7\xd1\xe2\xe1\xae\xba\x64\x07\xa6\x79\x97\xbf\x53\x4a\xd1\x0e\x9d\x40\x88\xf0\xb1\x4e\x44\x31\xa1\x38\x84\x37\x04\x11\x78\x20\x6a\x43\x58\xba\x4f\xd6\x41\xb1\x7b\x44\xde\xc8\x39\x17\x8e\x8a\x49\x1b\x55\x33\xa3\x3c\xd9\x0f\x9c\x83\x9c\xfc\x0b\x93\x93\x95\x4a\x5e\x09\x3a\x4d\x76\x0f\x99\xac\x1e\x02\x3f\x1c\x79\x9d\xd0\x39\x61\xf0\xc7\x49\xcc\x95\xf9\x3f\xb9\xba\x7a\x03\xce\xe0\x42\x38\xfd\x12\xdc\x9c\x96\xb7\xf8\xd4\x68\x24\x32\x0f\x47\x17\x90\x88\xf7\xd6\xc1\x23\x18\x8f\x70\x11\x9b\xa5\x33\x55\x09\x4a\xb6\x4f\x60\xaf\x14\x9f\x77\x87\xa1\x8f\x53\x46\x3e\x2c\x78\x74\x7d\x11\xf8\x7f\x65\x6e\xee\x89\xe0\x56\x45\x48\xa9\xff\xf6\x50\xdc\xc8\x2e\xeb\xa2\x2f\x83\x5a\x30\x9e\xe3\xd4\x8e\x9c\x5e\x59\x08\xc2\x6f\x54\x29\x19\xf1\x32\xfe\x00\x2c\xd1\x25\xfb\x8e\x81\x7d\x3f\x1c\x54\x40\xe0\xec\x07\x20\x28\xe7\x36\x48\x2d\x0e\xa3\xec\x13\x54\x85\x52\x0a\x17\x0e\x6e\x0f\x06\x04\xc4\xf1\xde\x5a\x9a\x96\xc3\xad\xb6\x34\x75\x6a\x66\xcd\x45\xee\x12\x5e\x2d\x02\x39\x95\xc1\xf6\xd0\x5e\x45\x21\xdf\xda\xd4\x36\x33\x79\x10\xd0\xed\x9e\x9a\xde\x64\xfe\xab\xc5\x07\xe1\x3d\xeb\x34\x07\xda\x93\xc9\xac\x48\x30\xb2\x76\xff\xce\xae\xce\xc7\x88\xdf\x79\x00\x27\xfa\x63\xeb\xec\x74\x18\xa6\xe7\x75\xcf\x57\xfc\x3c\xfa\x3b\x05\xaa\xc5\xb3\x3f\xfc\xfe\xf7\x4f\xbd\xe3\xd3\x7e\x86\xbb\x87\x6e\xf9\xb4\x97\xeb\xad\xa1\x36\xc3\xf9\x50\x9b\x61\xa8\xcd\x50\xbd\x1e\xdc\x3f\x7c\xff\xd5\x17\x7a\xc9\x6e\xeb\x23\xb3\x6d\xdf\xfa\x0a\x7b\x66\xc5\xf5\x93\x11\xb7\x77\x05\x85\xfb\xa8\x9b\xd0\x53\x8e\xd8\xfe\x35\x12\x86\xca\x08\xbf\xac\xca\x08\xfd\xe5\x88\xf5\x55\x05\x61\xff\xdc\xb0\x5f\x4e\xc5\x83\xbd\xc9\xc6\xbe\x79\xf5\x7b\x67\xd3\xf7\xd5\xf4\xa3\x2f\xeb\x7e\x6f\x16\x86\xc3\x72\xbc\x46\x7b\x8b\x2b\xf1\xe6\xaa\xe9\x1f\x1e\xaa\xa0\x58\xbe\x96\x86\xba\x3c\xa0\xea\x4c\xf6\xb6\x3c\xe0\x54\xe4\x4e\xbc\xbb\xc9\x8a\xf7\xfe\xaa\x16\x20\xe0\x6f\x3f\xfe\xb8\x80\xc1\x41\xbe\x5f\x98\xfa\xe7\xe5\x1e\xfd\x4c\x3b\xe0\xdf\x95\x7b\x54\x55\xaa\xe6\x3a\xab\x23\x10\x48\x10\xe1\xe4\x34\xec\x4c\x53\x92\x85\xd3\x8b\x73\x12\xe5\x0c\x4a\x3b\xd0\x44\x4d\x48\x83\x84\xe7\x1c\x48\x56\x22\x74\x92\x1d\xd5\x9a\xa5\x99\xde\x17\xf3\x06\xef\xe8\x2f\xcc\x3b\x7a\xe7\x5e\x8a\x45\x91\x52\x31\x36\xd4\x02\xfc\xa3\x95\xb8\x93\x1a\x3f\x9c\x10\x4b\x17\x50\xac\x00\x5b\x28\xa4\x34\x17\x82\xff\x5c\xb0\xd2\x5c\xe1\xa5\x8e\x47\xe0\xdc\x81\x79\xf4\x0c\x3b\x94\xa8\x6a\x54\x24\x92\x2b\x49\x5c\x16\x20\x1e\x8e\x8e\x60\x04\x62\x59\xc5\xf4\xa6\x17\x0c\xa5\xb7\x0b\x28\x92\x50\x3e\x55\xd5\x0f\x51\x41\xa4\x49\x22\x6f\xf1\xdb\xa1\x3c\x62\xf6\xcf\xcc\xc5\xd6\x25\x99\x32\x92\xf2\x3c\x97\xb9\x75\x23\x85\xd3\xc1\xf0\x21\xa3\x67\xb2\x1c\x15\xb6\xdc\x06\x7d\x5c\x31\x6d\xb7\x1a\x50\x45\x4b\x42\x05\x26\x70\x9a\x7f\xbb\x88\x6b\xf8\xb6\xa3\x77\x53\xb6\xa0\x37\x5c\x16\x39\xbe\xad\x25\x39\xb0\x3f\x01\xef\x5d\xca\xc2\xdb\xce\x0b\xc8\xd0\xf2\xab\x53\x0d\x70\x7a\x57\xfe\x08\x0a\x6e\x2c\x9d\x39\x72\xcc\x3e\x71\xa5\x57\xd7\xe2\x40\xe4\x5a\x4e\x3c\x04\xe6\xdd\xa8\xcc\x30\xd8\xef\x76\xce\xbd\xad\xe2\x5b\x38\x5a\x55\x52\xbd\xb9\x82\x9f\xb6\xc9\xa9\xb6\x62\x0d\xa6\xcc\xbb\x74\xb8\xa7\x17\xc3\x8a\xab\xdc\xb1\xd7\xd5\xa3\x14\x94\x07\x21\x79\xe3\xe5\xa3\x2c\x12\x1e\x2d\xcf\xcf\xfa\x8d\xdc\xc0\x31\x1d\xfb\x53\x3e\x6a\xc3\xdc\x27\x5f\x51\xc5\x62\xf2\x96\x0a\x3a\x47\xab\xcb\xd1\xd5\xc5\x57\x6f\x8f\x0d\x16\x81\x55\xe7\xfc\xac\x31\xb4\xe3\x2a\x1c\xfc\xdd\x43\xe5\xb9\x93\x3a\xe8\x7a\x13\x1b\x56\x46\xdd\x11\x7c\x0f\x56\x02\x80\x78\x99\x60\x9f\xf6\x69\x0d\xe2\xc0\x45\xbd\x48\x14\x86\x6f\xb8\xea\x6f\xaa\x4e\xaa\x6f\xd2\xf8\xfa\x2e\x01\x10\xd8\xcd\x37\xad\xb2\x9d\x0f\xac\x85\x9f\xab\xda\x8d\x44\xe7\x54\xb3\xf9\xf2\x8c\x65\x89\x5c\x1a\x04\xb8\x08\xcc\xf8\xf8\xe8\x14\xc5\x86\x7c\x4a\x23\x92\x17\x09\xc3\xde\x42\xf5\xb2\x6b\x82\xb1\xb8\xa4\x74\x5c\x28\x4d\xa1\xe8\x1a\x8e\xbf\x71\x46\xad\x99\x55\x5b\xb6\x34\xc6\x79\x6e\x7d\xaa\x5a\xa2\xd2\x9c\x92\x8d\xaf\xb4\x67\x4c\xf0\xf9\xed\x38\xdb\xc5\xaf\xd9\xda\x83\x59\xed\x0e\x08\xa7\xfc\xb2\x48\x0c\xf3\x49\xe2\x5a\x8b\x57\x90\xd3\xec\x1e\x63\xb5\x0b\xa0\x09\x66\xf6\x23\x32\x2d\x8c\x10\xc7\x54\xc5\xc6\xbd\x5a\xea\xf3\x76\x81\x2e\x6d\xf3\x12\xa1\x59\x96\x70\x0c\x61\x96\xb9\xf5\x4b\x07\x06\xcd\xd5\xc7\xda\x90\x96\x8e\xb2\x4c\x37\xd9\x65\x4c\x6e\x58\x3e\x6d\x53\xa7\xa2\xab\x58\x42\x33\x0e\x7e\x9c\xd6\x52\x4c\x65\xe3\x4e\x2f\xce\xf1\xed\x26\xc3\xb1\xfb\x11\x77\xd0\xee\x8d\x73\x6f\xd8\x9e\x41\xa8\xb9\xf8\x4a\x4b\xa7\x17\xe7\x58\xda\xcb\x16\x5b\x2a\xcd\x1f\x46\x4f\xa0\x18\xe4\x58\x56\x78\xa4\x73\x33\xa2\x26\x52\xf8\x8f\x32\x51\xa4\x0c\x0b\x34\x95\xcd\xc6\x8c\xf2\x28\x96\xe5\xe8\xa5\xf5\xc4\xe8\x3a\x46\xf5\x39\x38\x08\x05\x61\x4c\x7d\xc8\x83\xf9\x00\x31\x39\xf8\xa2\xf2\x94\xa1\x1c\xe5\x84\xdb\xb2\x9f\xee\x51\x02\x1d\xa3\x02\x3a\xf3\x33\x21\xc5\xa5\x05\xd5\xb7\x97\x6f\x76\x43\x84\x77\xd5\x31\x6c\x51\x1f\x06\xf5\x0b\x33\x9a\x6b\x4e\x13\x52\xe4\x89\x73\x2b\x62\x8e\x80\x0d\xc5\x5b\xd0\x9b\xa0\xf0\xd1\x84\x90\x2f\x70\xf7\xed\xe6\xe0\x19\xc7\x06\xbe\xd6\x14\x5c\x24\xc9\x88\xcc\x38\xb4\x6c\xd7\x2c\x23\xa1\x5b\xeb\x8a\x8b\xc8\xa8\x83\x62\xec\x3b\xf2\xc0\x8c\x9c\x92\xe8\x0f\x3a\x78\x4d\x41\x66\x66\x49\x0c\xc5\x30\xe1\x13\xe6\xd0\x47\x60\xb2\x30\x5a\xec\xcb\xa4\x50\x9a\xe5\x97\xd2\x30\x94\x20\x6c\x07\x0a\x83\xd0\xf0\xe7\xaf\xb8\x88\x21\x4e\xeb\x12\x98\x4f\x44\x05\x61\x1c\x8c\x41\x66\x48\xf0\xbf\x1b\x64\x29\x91\xf2\x48\x15\xd1\xc2\x2c\xe9\x20\x93\xb1\x3a\x30\xa4\xe8\x00\x4d\x86\xea\xe0\xd8\xfc\x55\x5f\x03\x46\xe1\x04\xef\x9d\xd0\x8c\x1f\x1c\x8f\x08\x00\x08\x1c\x80\x52\x2f\x9e\x2e\x1e\xba\xb5\x82\x8e\xbe\x13\x16\x5e\x86\x23\x00\x0e\x8a\xd2\xd5\x77\xbb\xe0\x9a\xf9\xf6\xea\x68\x69\xf2\x95\x6e\xea\x04\x9f\x90\x53\x41\x58\x9a\x69\xb0\x5e\x93\x94\x51\xe7\x12\x67\x37\x2c\x5f\xea\x85\xad\x04\xe2\x08\xc8\x93\x07\xfa\x7e\x00\xaf\xf5\xae\x2f\x91\x1c\x4e\xd8\x0a\x70\x0f\xbf\x38\xac\x13\xd2\x92\x23\x3c\x59\x50\x02\x8b\xde\x09\x8c\xdf\x99\x37\xab\x20\xc4\x5b\x48\x2d\x3d\xfd\x78\xf3\xc6\x3a\x56\x10\x56\xdf\x70\x11\x2b\xdf\x4d\xd1\xc6\x7d\x5b\x78\x37\x02\x19\x66\xf8\x14\x01\xbc\x2a\x02\xb7\x15\x5b\x37\x0c\xef\xa4\xfe\x75\x43\x6d\x1c\xc0\xaa\x0e\x6f\x65\xdc\x7c\x74\x2a\xfb\x7b\x1e\x3c\xec\x83\x0d\x4a\xbb\x8b\x1d\xcb\x8a\xbb\xcb\xac\x51\x27\xd8\xbc\x1d\x1b\x40\xbf\x6e\x26\xa5\xc1\x01\xe8\x64\xf0\x0b\x58\x93\xb0\xce\x39\x99\x25\x74\x5e\xa2\x11\x50\x3d\x14\xb4\x5e\x5e\x7d\xe7\x96\xa0\x08\x6f\x16\x79\xb7\xca\xc4\xdb\xa4\xe0\x71\x09\xa5\xb5\x4f\x98\x8f\x34\xfe\xb8\x5d\x14\xf6\x83\xaf\xc7\xa6\x36\xce\x46\xbd\xd1\x90\xb7\x0e\xfe\xce\x66\x47\x03\x4c\x70\x05\xdb\x9c\x62\x0a\xf1\x53\x20\x87\x5c\x7d\x57\x41\x93\x2d\xf3\x5d\x83\xb4\xd7\x6c\x79\x2b\xf3\xe6\x5a\xec\x55\xb9\xde\xd3\x21\xf7\x8a\xd3\xc0\x9c\xf3\x12\xed\x83\xb2\xb1\xe8\xfc\xce\xa8\xba\x71\xf2\x09\x9d\xb2\x64\xfb\xd4\xdf\xd2\xcc\xcc\xbb\x8c\x7b\x45\x43\x80\x75\x9b\xa2\x2a\x82\x21\x6a\x2e\x2c\x50\xe6\x73\x2a\xf8\xdf\x31\x58\x38\x32\x24\x41\xe6\xe6\xcf\x23\x74\xbd\xa0\x19\x21\x61\x91\x3e\xb6\xa8\xdc\x48\x42\xb7\xe0\x3a\x8d\x63\x8e\x82\xc8\xc5\x16\xb4\xdc\x0c\x04\x2e\xae\xbb\x6c\x1f\x3c\x8f\xd1\x64\xb8\xd8\x3b\xde\xbb\x0d\x67\x7d\xfb\x71\xdc\xec\x03\x6e\xc1\x2e\x8a\x7c\x43\x78\xd8\xc6\xf7\x53\xca\x6d\xb3\xe0\x2e\xd0\xb5\x98\x43\xad\x84\x69\x08\xa4\x59\x9f\x1f\xed\x1e\x0e\xcb\x5e\x00\x67\x29\xe5\xbb\x42\x0c\xaf\x3d\xb6\x2c\xa5\xba\xc8\xb9\x6e\x64\xbf\x9b\x5f\xe4\xe2\x9b\x62\xca\xac\x47\xbd\xf3\xeb\x02\x02\x2b\x4f\x2f\xce\x1b\xc1\xd2\x0f\x9b\x05\xbb\x87\x9d\xa0\x91\xd2\x48\x21\x68\x3a\xe5\xf3\x42\x16\x2a\x59\x86\x66\x5c\x0a\x01\x01\x13\x42\xce\xd1\x8e\x25\x0e\x35\xa1\x42\x8a\x65\x6a\x1f\x15\x51\x52\xc4\xac\x32\x22\xf8\x4d\x6f\x24\x8f\x09\x2d\xb4\x4c\xa9\xe6\x11\x89\x24\xcb\x23\xf0\xb1\x86\x23\x15\x8a\x11\xba\xe6\xdd\xa8\x50\x5a\xa6\x24\xa5\xb9\x5a\xd0\x24\x59\xb7\xc7\x3d\xf0\xf0\x4d\xc5\xda\xc7\xb0\xfe\xb5\x3f\xde\xe0\xac\x77\xc4\xef\x2d\xb5\xe9\x5b\xe0\xb7\x99\xdc\x5e\x03\xdc\xac\xc7\xd2\x16\x63\xd8\xaa\x08\x8d\xf5\x9e\x2a\x08\xf7\x61\xc1\x48\x56\x4c\x13\xae\x40\x33\x05\x4a\xb4\x24\x53\xb6\xe0\x36\x3a\x7b\x3b\x09\x5a\xbb\xc5\xdb\xe0\xbc\x89\x06\x6c\x85\xd0\x06\x92\xbd\xf1\x5d\xcb\xd2\xce\x53\x3a\x6f\x21\x80\xbf\x31\x04\x9b\x8a\xa5\xe7\x84\x50\xe4\x54\x8d\x88\xcc\x6d\xc4\x8e\xef\x49\x6f\x7f\xf2\x85\x72\x73\xf2\xde\x82\xce\x86\xce\x5b\x7c\x87\x84\x0a\x96\xcf\x64\x9e\x1a\x00\xf3\x9c\xcc\x0a\x01\x06\x4a\x65\x23\xed\x81\x4b\x58\x1b\x17\x4d\x94\xf4\x67\x19\xf6\x42\xb8\x49\x10\xaa\xc8\x2d\x4b\x92\x09\x39\x4d\x12\x5b\x7d\x35\xa8\xb3\x51\xe6\xca\x97\xf1\x1c\xd3\x25\x89\xf9\x9c\x29\x4d\x8e\xae\xfe\xf3\xf4\x18\x44\x14\xb0\xff\x2c\x89\xa6\x2e\x55\xb0\x6a\xd7\x02\x61\x27\x2e\x40\x28\x8a\xa8\xa6\x89\x9c\x63\x48\x03\xd8\xc8\x45\x4c\xb2\x84\x2e\xa1\xb5\x42\x46\x73\x88\xf6\x8d\xd0\xb6\x45\xf2\x42\x40\x51\xe9\x7b\xe5\x5d\xdb\x89\xca\xa6\xba\xcf\x63\xc0\xc9\x1d\x89\xc6\x96\xea\xba\x77\xcb\x14\x73\x96\x25\x74\x8d\x35\x66\xe5\xc0\x97\x89\xe0\x46\x3d\x00\xd5\x5f\x0a\xe6\xc7\x98\x90\x2b\xc4\x9d\x94\xea\x08\xfd\xc9\x3f\xa5\x4c\xd3\x98\x6a\x3a\x31\x3a\xf4\x4f\xd5\xac\x44\x99\xc4\x66\xa0\xf5\x1b\xbd\x66\xce\x28\x1c\xcb\xed\x44\xea\x8d\x91\xe0\xfd\xe3\xa0\xd7\xb8\xf3\xb8\xd1\xfc\xb3\x27\x7d\x82\xe5\xbf\xfa\x64\x54\xd8\x8d\xfe\xcb\xca\x5c\xeb\x2f\x55\xad\x33\x49\x75\x25\x16\x5b\x53\x06\x25\x3a\x3f\xd8\x2e\x54\xee\x0e\x98\x9e\x4f\xdf\x9d\xad\x37\x13\x6e\x37\xb5\x6c\x31\xad\xd4\xe5\xd3\xb5\xd3\x73\x86\x79\xfb\x4b\xd5\x33\xe3\x52\x91\x20\x79\x13\x13\x7b\xa8\xf0\x9c\xc3\x15\xe7\x4f\xc0\x62\x10\xa6\x9d\xe2\x7b\xeb\xed\x4a\xad\x5c\x63\x6d\x1c\x62\xdb\xb2\xfc\xc6\x7e\xb2\x6b\x1f\x6a\xe7\x1f\xdb\x9a\x89\xb7\x2e\xd3\x0e\x21\x0f\x89\x39\xce\xb4\xec\x81\xdd\xd6\x9f\xd8\xd2\x2e\xe6\x96\xda\x61\xa2\x7e\x2b\x2b\x41\x5f\xd7\x6c\x79\x68\x75\x44\x83\xe9\x0b\x9e\x61\xaa\xa8\x75\xdf\xd8\xdd\x25\xdf\xd1\x84\xc7\x7e\x08\xc4\xea\x73\x31\x22\xef\xa4\x36\xff\x7b\xf5\x89\x2b\x8d\xba\xf6\x99\x64\xea\x9d\xd4\x70\xa7\x97\xa5\xe2\x14\x3a\x2c\xd4\x6a\xfb\xe8\x01\x80\x73\x15\xd8\x04\xdc\x82\xce\x67\x15\xc9\xc8\x3c\x7d\x2e\x8c\x44\x60\x57\xe4\x53\xa8\x95\x1d\xc2\xe5\xff\x08\x29\xc6\xe0\x1b\x68\x1c\xc3\x02\x42\xe6\x15\x38\x6c\x18\xce\x0e\x85\xc1\x97\xf0\x0b\x57\x8e\x88\x7b\x9e\x4d\x9d\xb9\x92\x47\x24\x65\xf9\x1c\xbc\x5d\xd1\x16\x6f\x4f\x5b\x13\x6e\x2b\xc3\xed\xd6\xbd\x02\x92\xf9\x66\xad\x95\x66\x65\x93\x82\xe7\x91\x2c\xa5\x68\xba\xf9\x87\xa1\x3e\x00\xa9\x7f\x41\x1e\xbd\x9a\x90\x53\xd7\xe2\x27\xfc\xcd\x7a\xfd\xc2\x61\xcc\x08\x5c\x11\x43\x4a\x6e\x68\xc2\xb0\xc3\x01\x15\x3e\xd7\x4d\xce\x56\x08\xfb\xc8\xe6\xd3\x9b\x33\xeb\x45\xa6\x83\x6b\xb6\x3c\x18\xad\x6c\xed\xc1\xb9\x38\x28\x13\x1e\x2b\x9b\xe9\x89\x28\x48\x5b\x07\xf0\xdb\xc1\xee\xbc\x60\x23\xb1\x6c\x6f\x4b\xda\xba\x6f\xea\x9a\x37\xbb\xfe\x1b\x85\x8d\x23\x75\x0c\x66\x0f\x81\xbd\x96\x64\x0e\x66\x60\x73\x37\x2c\xad\x62\x44\xd5\x6b\x9e\x65\x65\x25\x9a\x22\x9b\xe7\x34\x66\x64\x9e\xd3\x6c\xd1\x55\x2c\x41\xd9\xa6\x69\xf8\x27\x23\xe8\xae\x01\xfe\x06\xdd\x70\xe3\x7b\xb7\x6c\xba\x90\xf2\x1a\xd2\x10\x01\x11\xee\xd0\x92\xf1\x3d\x7e\xeb\xac\xbc\xe7\x94\x52\x45\x62\xa6\x29\x4f\x20\x8e\xe6\xfd\x9b\xb7\x36\xd2\xc6\xf1\x71\x37\xcb\xe6\xa0\x95\x1e\x14\x00\x1a\xdb\x08\xb0\x4b\x76\xc3\xd9\xad\xb5\x6f\xac\x8b\x91\x19\x93\x39\x13\x10\x18\xb2\x21\x80\x6a\x4c\x14\x8f\xd9\x2b\x48\x7a\x5e\x3f\xd0\x1e\x0e\x87\x35\x73\xde\x76\x78\x37\x53\xf0\xad\xd4\xbb\x05\x97\xf5\xea\xef\x85\xcc\x37\x14\x61\x6a\x97\x83\xdd\x2e\xbf\xda\x46\xf1\xbf\x20\xbf\xff\xfd\xef\xd6\x3e\x94\xd2\x4f\x3c\x2d\xd2\x17\xe4\x0f\xff\xf6\x6f\xbf\xfb\xb7\xf5\x8f\x71\x81\x8f\x3d\x5f\xbf\x3e\x7b\xda\x5e\x5e\x9e\x3d\x02\x78\xc7\x3e\x92\x71\xb3\x33\xb3\xc5\x50\x33\xca\x93\x22\xb7\x31\xb4\x2d\x55\x84\xd7\xe1\x3b\xe0\x88\x2a\x93\x4e\xa8\x1b\xd1\x05\xda\xd9\x00\xbc\x19\x17\x4c\x41\xf3\x9c\x42\xe4\x2c\x92\x73\xc1\xff\xce\x62\xd7\x3b\x07\x02\x62\xa0\xca\xbe\x43\x71\xc2\x44\x8c\x3d\x4c\x0d\xcf\x5b\x50\x11\x27\x9b\x02\x25\x5a\xac\x34\x3c\xc1\x7b\x81\x0c\x38\x4f\x27\x80\xbd\x2d\xdf\xa8\x81\x0b\x3a\xb1\x5a\xb7\x1d\x72\x34\x04\xdb\x5e\x2b\x45\xc2\x78\xb5\x41\xb1\x6e\x98\xe3\x8a\xde\x87\x2a\x2b\xdc\xfb\xb9\x60\xf9\x12\x12\x6c\x4a\xc1\x3e\x08\xc2\xfb\x50\xd6\x6f\x70\xcb\xb0\x12\x15\x16\xd0\xa9\xe9\xc2\xa5\x10\x53\x86\xc9\xd4\xbe\x0d\xef\x30\x0c\x3b\x70\x5e\x33\x72\x4a\x44\x91\x24\xeb\x1e\x15\x72\x93\x7f\x2d\x84\xdd\x16\x55\xb2\x9d\x8e\xd7\xd6\x2c\xd0\x00\xe9\x7b\x35\x0e\x84\x0b\xef\x49\x94\x7f\xdc\xe6\x82\x70\xc1\xad\xe2\x69\xdb\xc7\xd2\xb6\x2b\x13\xd4\xc2\x8c\x80\x57\x97\x60\xdb\x96\xc5\x7d\xee\xd2\xb0\x80\x57\xa7\xb8\xa6\x76\x46\x86\x86\xa9\x3f\x3a\x53\xc3\x0e\x8b\x6f\x63\x76\x68\x58\xfa\x60\x7c\x58\x01\x78\xdb\x28\xb2\x0e\x11\x64\x2d\x77\xb2\x85\x51\x02\xaf\xc1\x34\xd1\x89\x13\xb5\x20\xcc\xdd\xcc\x14\xad\x77\x35\x67\x5c\xdc\x48\x2c\xb2\xdd\x49\x86\xbb\x5c\x79\xb1\x26\xca\xdd\x02\x65\xb5\xb2\x9c\x17\x7e\x43\x91\xd6\x28\xb4\xa4\x50\xdb\x8d\xdd\x9b\x57\xb0\x39\xef\xa6\x17\x1d\xa4\xba\xf2\x22\x61\xdf\x73\xbd\x78\xef\x8a\xea\x5b\xac\xd6\x45\x96\xc0\x62\x83\x1f\x0c\x0a\x5d\x96\x92\xe1\x39\xb6\x71\x63\x91\x4c\x53\x26\x62\x0c\x22\x4a\xe9\x35\x23\x65\xab\x50\x23\xe3\x81\x18\x0c\xc3\xb1\x4f\x19\x15\xa5\x9c\x78\x63\x68\xf9\x26\x8c\x6a\x89\x4f\x6d\x79\x6d\xeb\x84\x96\xcd\x89\x2c\x41\x26\x4a\x25\x61\x85\x4c\x59\x22\x21\x05\x1e\x23\x6c\x31\x06\xdc\xe5\x80\x18\x92\x6c\xef\x5a\xae\x67\x0b\x6e\x32\x31\x2f\xeb\x78\xa9\x04\x9a\xfa\x5a\x0a\x2c\x05\x9b\x90\x4b\x2b\xc2\xb4\x93\x8a\xda\x90\xd3\x96\xa4\xb4\x03\x43\xfc\x34\x2e\xab\x65\x8c\x8d\xb0\x3b\xb6\xb3\xd1\x32\xe5\xd1\xb6\x4d\xd9\x6e\xeb\xc0\xab\xbe\x2d\xee\xbd\x70\x63\x6e\xdc\xbd\x36\x5b\xe3\x1e\x1e\x36\x67\xcd\xe5\x5b\x6d\x74\xdb\x9b\x2a\x31\x29\xf9\x91\xdf\x98\x1a\xd9\x8c\xb0\x59\x35\x18\x09\xc7\xe4\xe5\xe5\xab\xd3\x0f\xaf\x46\xe4\xdb\x8b\x33\xf8\xff\xd9\xab\x37\xaf\xcc\xff\x5f\xbe\x7f\xf7\xee\xd5\xcb\x0f\x46\x82\xf9\x02\x9b\x06\x18\x05\xd2\x6c\x8d\xe1\x84\xb2\x4a\xa7\xa8\x58\x92\x59\xa1\x0d\x21\x2a\x3f\x56\x99\x05\x45\xeb\x03\x8d\x63\xa3\xac\x3e\x39\x04\x68\x06\x78\xdd\x60\x13\x76\x4b\xc1\x3e\x0b\x36\x45\x6e\xbb\x80\x76\x3f\x18\xd6\x3a\xc9\xa4\xb2\xde\x83\x1d\xb3\x4b\x3e\x0a\xf2\x5a\xe6\xc4\xf6\xa6\x83\x66\xa5\xb1\x3a\xb4\x39\x3c\xe6\xdf\x13\xbc\x75\x92\xc8\xf9\xa1\x4f\xed\x61\x24\x91\x73\xa2\x8a\xa9\x4f\xb9\x02\x21\x00\x9e\xfe\xc2\x3d\x56\xc9\x54\x19\xf9\xbc\xab\xe0\x2d\x3f\x78\xe5\x9d\xf0\x81\x70\xdc\x13\x68\x28\x57\x79\xd2\xdc\xa8\x0f\xf8\xc5\x49\xf3\x0c\x9c\xbc\xc7\xf3\xda\x1b\x1f\x85\xc1\xf5\x5b\x9e\xc4\x11\xcd\xe3\x15\x84\x07\x9e\x8c\xf8\x02\xd0\xc3\x2a\xcb\xd8\xfc\xbb\x1c\xdc\xd6\x46\x91\x37\x2c\x4f\x68\x86\x09\x01\x50\xe6\x1a\x22\xa6\xe0\x23\x67\x2c\x63\x90\xf6\xe6\x9a\xd3\x33\x11\x25\x12\xca\xb0\x20\x43\x1f\x55\x97\x8e\x11\x54\xae\x56\xa5\x4b\xbe\xf4\xc7\xeb\xe0\xf3\x24\xb0\x10\x47\xde\x09\xf5\x31\xf2\x7c\x6d\x21\x20\x9f\xe3\x83\x8a\xb2\x97\xf6\x19\x39\xb0\x19\x89\x07\x23\x72\xe0\x6b\xdd\xc4\x56\x33\x38\xf8\xe2\xa0\x7c\x20\xcc\x69\x03\xc5\xc0\xba\xc1\xc6\xf0\x9d\x30\x7b\x16\xb0\xc3\x39\xeb\xfc\xa7\xcb\x7a\x45\x86\x23\x5b\xc3\x1d\xcc\xa1\x3a\xd0\xa4\x32\x91\x95\xaf\x96\xe9\x98\x5b\xbf\x68\xa6\x1f\xbc\xae\xa1\xfc\x01\xa6\x75\x5a\xe0\xe4\xcc\x6c\xa5\x0b\xc2\xbb\xaa\x60\x9e\x77\x36\x86\x05\x95\x78\x4e\x32\x9a\x1b\xf5\xcb\x3d\x59\x6d\x89\xf7\xc5\xd6\x86\x78\x2d\x30\x28\xf0\x29\xb5\xd4\x54\xae\xfc\x1b\x2f\x13\xaa\x54\x83\xb5\x19\xa8\x88\x19\x98\x30\x1c\x99\x50\xe7\x70\x83\x7a\xe7\x0b\x7a\xb3\xa1\x20\x46\x8b\x49\x6b\x9a\xcf\x99\xde\xec\x0d\xa2\x62\xf9\x7e\x63\x09\xbd\x71\xeb\xa2\xbd\xe3\x76\x47\xb1\x72\x08\xb9\xd0\x63\x99\x8f\xf1\x95\x17\x44\xe7\xc5\x3a\xbf\x9e\xe6\x29\x93\x85\xbe\x62\x91\x14\xcd\xd9\x2f\xf6\xb9\xde\xdc\x5b\x1d\x52\x82\xac\x87\xf5\xd4\x09\x30\x61\xd1\x4b\xa7\x8c\x96\xd2\x8d\xf3\xaa\x56\xcb\xf6\xbc\x7f\xf3\x76\x9f\xcd\x26\x90\x36\xbf\x79\x27\xbf\xb3\x3c\x43\xcc\xfd\x4c\xed\xcc\x37\xbe\xf6\xb6\xd0\xdd\x5f\x7a\xe9\xbd\x75\x9b\x9f\xb6\xc0\xd8\x5c\x7a\x65\xed\xfa\x95\xa6\xba\x58\xc1\x86\xca\xde\x58\x62\x79\x85\xe9\x87\x56\x15\xb9\x82\xf7\x42\xc3\xe6\x6a\xbd\x09\xac\x61\x03\xcf\xb9\x00\xcd\x09\xb1\x2f\x9a\xf3\xa9\x73\xca\x51\x69\xa6\x91\x2e\x20\x8f\x9d\x6a\x1b\xcc\x69\x0b\x2e\xfd\xaa\x69\x19\x8d\x6a\xf2\x26\xd5\x38\x62\xb9\x56\x6f\xa8\xd2\xdf\x66\x31\x5d\x93\xe9\x56\x0b\xd2\x54\x1a\x0e\x0c\x8a\xf4\xb7\x82\xc5\x86\xc2\x5b\x10\xe0\x78\xe4\xd6\x90\xde\x02\x47\x5c\x1b\x7a\xb0\x16\xe5\xdc\x01\x32\xaf\x8f\xcd\xa7\x9a\x67\x7d\x29\x0d\x4c\x4e\x1b\x09\x50\x35\x3c\x65\xdb\x6c\x0d\x3b\xc9\x61\x34\x22\xd8\xa7\x26\x2b\xc3\xfe\x33\x4e\x18\x15\xcd\xc9\x06\x35\x8c\x82\xe7\xba\xe3\x90\xfd\x00\xb9\x5d\x70\x23\xef\x62\x46\xa0\x22\x4e\xfe\x8a\x59\xc2\xd6\x24\x06\xee\x19\x3e\x6b\xbf\x70\x66\x3f\xd0\x2a\xb4\xeb\xa2\xfa\x8e\x77\x62\x58\x09\xde\xa6\x9e\x94\x92\xb6\x95\x1e\xbc\xbe\x56\x5f\x15\x88\x2f\xd3\x44\x46\xd7\x58\x80\x0e\x6a\x3f\xf0\xbf\xb3\xdc\xc5\xda\x97\xcd\xe7\x6c\x47\xb4\xb9\xeb\xf6\xea\xe0\xe6\xda\x5f\xc1\x28\x66\x6c\x03\x40\x3f\xbe\xcc\x4b\x6b\x6a\x21\x6c\xa6\xe5\xfd\x84\xeb\x3a\x2d\x07\x72\x14\x2a\xde\x92\x55\x85\x07\x6b\xd5\x40\x7d\x4c\xab\xac\xd2\xd4\xe6\x06\x9d\x7c\xb3\x3e\x8f\xa6\xd7\x10\xdc\x4d\xd9\x3c\xf8\x04\x80\x4f\x44\x1b\x4b\x1b\x6d\xcc\xfb\x69\x6b\xed\xdb\x92\xdf\x43\xda\x4b\xf8\x7e\xca\x6d\x46\xeb\x35\xa0\xb2\x77\x0f\xe7\xda\xd4\x87\xf2\xea\xe2\xb7\x6c\x5b\x98\xb7\x93\x67\x4d\x74\x29\xa0\x5a\x2d\x34\xe3\xd5\x0e\x9b\xc5\x8b\xd1\x07\x33\x99\xaf\x55\x60\xfa\x9b\xfc\xe6\x6c\xb0\xad\x03\x19\xe9\x73\x7d\xbc\xde\x6a\xc2\x92\xa1\x5e\xfe\x95\x11\xa1\x64\xc1\x95\x96\xb9\x75\x27\x42\xf3\xba\x9c\x42\x73\xdd\xe6\xb8\xb7\x7e\x22\x00\x5f\xfa\x29\x10\x9a\x65\x8c\xfa\xbe\x56\x96\x37\x41\x63\xaa\x9c\x45\x32\x8f\x1b\x27\xe6\x4c\x03\x8d\xb2\x54\xe3\xe7\x7b\xc8\x6c\x4d\xa8\xd2\x1f\xfc\x1c\x8c\x80\xd0\x92\x1a\x57\xc5\x1f\xbb\xc4\x72\x35\xae\xf4\x8f\x14\xe5\x8f\x92\x50\x81\x26\x91\xfd\x64\xf0\xed\x42\x46\xb9\x36\x94\xe6\x76\x5a\xd7\xad\x97\xdc\x82\x25\xde\xcf\xcc\x53\xa6\xd4\xc6\xe4\xaa\x5a\x60\x0a\xd4\x90\x26\xbe\x86\xb4\x7d\xdd\x31\x7b\x14\x10\x30\x04\xd5\x55\x79\x5b\xae\x47\x35\x02\x62\x02\x1a\x14\xfc\xb1\xda\x6b\xcb\xb2\x05\x55\x6d\x17\xe3\x4f\x91\x0f\x6b\x6e\x7d\x1c\x5a\xce\x26\x67\x54\x6d\x4a\x34\xad\xc1\x76\x9a\x73\x36\x23\x2f\x69\xca\x92\x97\x54\xf5\x09\x5c\xa0\x00\x13\xc2\x26\xf3\x09\x39\xbc\x0c\x3c\xcc\xef\xa4\x7e\xbb\xa9\xc7\xc7\x96\xf2\x0f\x6d\x4e\xf4\x9d\x9e\xe5\xbd\x95\x84\xed\x27\x77\xcf\x33\xbb\xf7\x0c\x37\x9c\xd0\x47\x71\x36\x37\x67\x4b\xaf\x3b\x8f\xd5\x93\x58\xe4\x60\xf1\x8b\x76\x3d\x91\x5b\x12\x38\xd7\x9d\xc2\xc7\x7c\xfe\xb6\x2c\xc9\x0f\x71\xd5\x68\x32\x59\x59\xdd\x87\x8a\xe6\x0a\x3e\x83\x30\xa8\x10\xca\xc3\x9b\x99\xbe\xbc\xfa\xae\x4f\xb1\xe5\x61\x4b\x15\xd8\x0d\x5c\xfb\xfb\x06\xb9\x7c\xbc\x99\x0b\xef\x5b\x06\x21\x06\x2f\x8d\xc1\x80\xfb\x0c\x3a\x39\x73\x5f\xb5\xb6\x0e\x5f\xd9\x19\xfe\x9a\xd9\x0e\x7a\xf6\x99\x0a\x7e\x1c\x41\xaf\x42\x76\x83\x0d\x42\x21\xc9\x85\x11\xc1\x94\x39\x14\xc7\x1b\x3e\xdf\x52\xa1\x6a\xa7\x4c\x6d\x57\x74\xb7\x2a\xb1\x64\xfb\xd6\xba\x87\x36\x6d\x30\x5e\x6d\x75\xb6\x16\x3a\x71\x07\x65\x6d\xbb\xc6\xd3\x61\xb0\xad\xe2\x5f\xc7\xf1\x9a\x0d\xb8\xf5\xab\x56\x49\xda\xbc\x72\x09\x44\x1a\xbd\xca\x91\xa1\xc0\x11\xd4\x17\x47\xda\x6d\xc9\x53\xd5\x7e\x7b\x59\xa7\x81\x10\x62\x59\xc5\xf0\xbe\x96\x55\x14\xbc\x3f\x98\x6f\xad\x3f\xd2\x7a\xbc\x47\x50\x4c\x65\x2b\x02\xdd\x6d\x71\x06\xbc\xb6\x61\xdd\xc3\xe3\x5b\x9b\x4a\x59\x1b\x71\xec\x8e\xea\xda\x28\x96\xdf\xb0\xb8\xe2\xa9\xb3\x75\xfe\xab\xf7\x02\xbf\x6d\x39\xbe\x05\x3b\xf9\xc7\xbf\x7e\xf5\xab\xf1\x78\xfc\xab\x32\xa4\xec\x05\xa1\x19\x67\x9f\x34\xc3\xa8\xc3\xc9\xf5\x9f\xa0\x99\xd3\xcd\xf3\x5f\x01\xc2\x91\x97\x60\x6d\x76\x66\xd6\x33\x9f\x35\xf9\x2b\x97\x75\x6a\x3e\x42\x85\x90\x3a\x8c\x82\x8a\xa4\xd0\xb9\x4c\x12\x96\x8f\xe7\x4c\x4c\xae\x8b\x29\x9b\x16\x3c\x89\x59\x0e\x83\xbb\x4f\xdf\x3c\x9b\xfc\xfb\xe4\xd9\xaf\x88\xcf\x31\x35\x92\xbd\xd2\x34\xcd\x5e\x40\xb2\xcb\xaf\x2c\xc6\xb9\xea\x7d\x59\x42\x85\x9a\xf8\xd0\xf6\x49\x24\x73\x26\xcd\xff\xd2\x5f\xa9\x8c\x45\xe6\xdb\x78\xd0\x48\xe3\x33\xd6\x74\x66\xa7\x68\x6b\xd5\x95\x60\x1a\x13\x99\xa4\xf0\x6f\x5c\xba\x2d\x37\x78\x91\xd8\xda\x85\x09\x57\xfa\x9b\xfa\x2f\x6f\xb8\x42\x76\x99\x25\x45\x4e\x93\xea\x54\xe1\x07\xb5\x90\xb9\xae\x94\xe5\x1d\x13\x8e\xac\x51\x71\x31\x2f\x12\x9a\x57\xde\xfa\x95\x8b\x79\x28\xcd\x75\x86\x4b\xde\x54\x42\x00\xc7\x95\x00\x61\x2e\x34\xcb\x5f\xca\xa4\x48\x43\xeb\xd8\x78\x55\xae\x9c\xf1\x5c\x69\x5b\x0f\xb1\xea\x54\x68\x92\x8b\xe1\xfb\x01\x8e\xfe\x4d\x49\x01\xee\x42\x32\x31\xe0\x9e\xac\x7f\xe9\x87\x67\x3f\x06\xef\xe1\x1e\x56\xe5\xd5\xc6\x53\xd2\x30\x63\x9a\x65\xb9\xbc\xa1\x58\xcd\x71\xc3\x5c\xdc\x73\x2b\x9f\x3d\x5d\xfd\x61\xcd\xb7\x9b\x87\xac\xf8\xe8\xc2\x21\x2b\x3f\xe8\x86\x4a\x97\xf8\xf0\xcd\x73\x9a\x64\x0b\xea\x72\x2b\x55\xb4\x60\x29\x2d\x37\x49\x66\x4c\x9c\x5e\x9c\x7f\xf7\xbb\xab\xda\x0f\xcd\xb5\x2f\x0d\xca\xf9\x74\xc2\xa0\x0b\x03\x75\xba\x98\x4f\x07\x29\x4f\xc0\xca\x34\x57\x84\xbc\x66\xa1\xce\x48\xe5\x78\xc6\x6b\xb7\x0d\x74\x82\x5b\xeb\x84\xab\x80\xc8\xd4\x08\x5d\xb5\xdf\x5c\x19\xa7\x5a\x59\x99\x45\x78\x16\x5b\x98\x95\xd1\x3b\xce\xcd\x53\x2e\x5a\xd8\x35\x4d\x88\x41\x46\x96\xfb\xca\x4f\x98\xba\xaa\x49\x90\x73\x89\xa3\x29\x57\xcf\x11\x52\xac\x34\xc4\x2d\xe4\xc2\x35\x8d\x1e\xf9\xde\xf7\x39\x33\xe3\x56\xb3\x36\x5d\x1a\x4a\x43\x4b\xbc\x39\xd7\x8e\x84\x46\x32\x4d\x0b\xc1\xf5\xf2\x04\xa8\x21\x9f\x16\x66\x37\x4e\x62\x76\xc3\x92\x13\xc5\xe7\x63\x9a\x47\x0b\xae\x59\xa4\x8b\x9c\x9d\xd0\x8c\x8f\x61\xb2\x02\x03\x70\xd2\xf8\xd7\x9e\x8e\xd7\x95\xce\xb5\x1c\xa6\x49\x46\xa8\xc2\x1a\xea\xe9\xf1\xa0\xb7\x3d\xb6\xdf\xae\xd4\xa8\x85\x2a\xc9\xaf\xae\x3e\x94\x2e\x46\xac\x8e\x04\x10\x0e\x9c\x6c\x25\xb0\x0d\xa0\xa0\x77\x91\x2d\x0a\xef\xd2\x59\x7d\x12\x2b\xf4\x04\x48\xb8\xd1\x49\x54\x31\x4d\xb9\x56\x2e\xca\x12\xa3\x0e\x5f\x02\x07\x81\xba\xa2\x68\xa9\x99\x90\x73\x51\xea\xf7\x77\x0e\x6a\x88\x0a\x1a\x1b\xf0\xb5\x07\x76\xc8\x00\x57\x5f\x68\x50\xa4\x1c\x8b\x5a\xbb\x3b\xc1\x19\xbf\xca\x58\xe4\x4f\x83\x3f\xd3\xa7\x58\x5f\xdf\x36\x72\xf0\x81\x9c\x12\x3b\x92\xc3\xcb\x2b\x21\x05\x1b\xf4\xba\xf5\xba\xdc\x98\x34\xd0\xd3\xea\x4f\x0d\xb1\x0b\xe3\x76\x6c\x84\x6c\x51\xc8\xdc\xa7\xb7\xdb\x81\x1c\x6f\xb0\xda\x31\xf4\x45\xf0\x0c\xc3\xe6\xa0\x80\xae\x2c\x42\xd8\x42\x5e\x46\x10\xa2\x6c\x20\x7b\x70\xea\x8a\x41\x62\x2f\x81\xb7\x54\x14\x34\x69\x0c\x60\xdb\x28\xdf\x39\xd8\xac\xaf\x29\xb1\xae\x1a\xf2\x7a\xd0\xf5\x5a\x9f\x62\xe3\xec\x6d\x8e\xf8\xc6\xb2\x1a\xeb\x02\xbc\x10\x1b\x3b\x97\xe3\x08\x7a\x0e\xac\x73\x69\xee\x13\x83\x74\x10\x9e\xa9\x95\xb0\x11\x64\xa0\x9b\x43\x47\x94\x66\x99\x2a\x0b\x73\x68\x49\x22\x99\x66\x09\xd3\x55\xde\x0b\x11\xbd\xdd\x62\x94\xea\x01\xbb\x3b\x9e\x54\x5b\xa7\xe5\x6a\x8d\xbf\x76\x8c\x96\xdd\x2e\xe7\x4f\x6b\x26\x0a\x43\x85\xaf\x2a\x95\xe3\xd7\xb4\xfc\xad\x1e\xc9\xf5\xef\x86\x75\x19\x31\x03\xb7\xda\x5d\xca\xc5\x98\xb8\xca\xd2\xb1\x0d\x4c\x8d\x83\x54\xbd\xf5\xa1\x25\x7b\xc6\xe9\xac\x97\x55\x9a\x97\x59\xe6\xd1\xac\x74\xca\x5d\xf3\xfe\x56\xb5\x10\x92\x14\x37\x45\xe3\x55\x39\xf9\xb9\x05\x68\x6e\x7b\x8a\x52\x92\x71\x86\x81\xf7\x5e\x1c\x02\x80\x31\x1a\xdb\x9b\x86\xe1\xe5\xcc\x07\x97\x5b\x7b\x37\x0c\x50\x8a\x4b\xd0\x03\x8a\x62\x94\x3b\xf9\xaf\xab\xf7\xef\x4e\xbe\x96\x36\x81\xd2\xb6\x99\x01\x4c\x4e\x21\x1e\xde\x75\x53\x89\x99\x32\xe8\x79\x05\xc6\xf3\x94\x0a\x3e\x63\x4a\x4f\x7c\x5d\x14\xf5\xc3\x97\x3f\x4e\xc2\xbc\x82\x91\x2b\x84\xef\x85\x0a\x8b\x1a\x40\xca\xcd\x62\xca\x92\xa2\xbe\x81\x6d\x26\x5d\xd7\x99\x5b\x98\xac\xa6\xd7\x86\x7e\xe3\x64\x0b\xa3\xcb\x5c\xb3\x17\xe4\x00\x55\x13\xff\xe9\x7f\x18\x31\xfc\x5f\x07\xe4\xe8\x16\x42\x9e\x0f\xcc\x9f\x07\xf8\x41\x2f\x03\x86\x8d\x97\xca\x0f\x63\xa0\x74\xce\xe7\x73\x96\x5b\xdf\x11\x98\x55\xa1\xbf\x0c\x87\x96\xb1\xe5\xc3\xc2\xf6\xdf\x2b\xeb\x8c\xd6\x27\xf2\xc3\x97\x3f\x1e\x90\xa3\xea\xba\x08\x17\x31\xfb\x44\xbe\xf4\xee\x87\x4c\xc6\xc7\x36\x2a\x4b\x2d\x85\xa6\x9f\xcc\x98\xd1\x42\x2a\x26\x30\xe4\x5b\x4b\x6c\xf9\xa3\x24\x78\xb6\x92\x64\x8c\x52\x42\x4c\x6e\x31\x55\xda\x81\x12\x53\x8f\xa1\x4c\x53\x55\x42\xc6\x76\xcb\xf0\x35\xb3\x6d\x73\x30\xad\x18\xe9\x0b\x7b\x02\x61\x56\x44\x58\x19\x4a\x15\xb8\x49\x86\xf4\x2d\xa8\x00\x37\x8b\x6d\x25\x64\xe4\xa9\xc9\x3a\x9f\xe4\x56\x8c\xdf\x64\xd2\x6a\x10\x5b\xdb\xb4\xa4\xbe\x27\xa1\xb0\xf5\x12\x37\x19\xcc\x1e\xb4\xeb\xf6\x5e\x2b\xda\x18\x7d\xb4\xba\x2c\x0c\x39\xba\x87\xb5\x41\x6f\xe2\x93\x9d\x97\xe6\x44\xea\x2e\x9c\xe0\xf0\x0a\x0f\x7c\x54\x7f\xdb\x1c\x17\x8c\x38\xb4\x4a\x6b\x40\xe1\x52\x1a\x23\x09\xa4\x62\x79\xe7\x68\x6c\x00\x08\x5e\xdb\x68\x39\xb6\x76\xb9\x31\x15\xb1\xf9\xb7\xe2\x4a\x9b\xfb\x3b\x43\x6c\x83\x21\xb4\x0a\xa5\x6f\xcf\xcf\xee\x07\xb9\x0b\xbe\xe3\x69\x9d\x16\x22\x4e\xd8\x1b\x29\xaf\xd7\xa4\x3f\x57\x16\xf4\x55\xf8\xb4\xf7\xce\xa1\x96\xc6\xc5\xd8\xc7\xd0\x06\x5a\x2e\xc9\x8a\x04\xc9\x6b\x21\x32\x1a\x5d\xd3\x39\xb3\x1f\x05\x36\x62\x8b\x1a\xa0\xa6\x0c\xaa\x40\xaf\xb5\xf4\xd6\xce\x1e\xad\x01\x76\x9e\x6b\xa6\xe9\xf8\xa2\x2d\xb5\x40\xdd\xbc\xb7\xcf\xb7\x17\xbf\x72\x45\xc2\xbd\x64\xb3\xb5\x0f\xfa\xd6\x00\xeb\xf2\x4f\xc6\xd0\x06\x6e\xed\x8f\xae\xf8\x73\xe3\x03\xdb\x7d\x88\xf5\x79\xb6\x8d\x6e\xaa\xbd\xe6\x76\xc4\x11\x0c\x0b\xe5\xca\x63\x70\xc7\xee\x02\x74\xee\xbb\xa5\x0a\x28\x50\x72\x63\x23\x73\xee\xa5\x0c\xd4\x76\xb1\xb9\x61\xbd\x3b\x08\xcf\xe1\xc4\xb7\xfa\xed\xb6\x0a\xd2\x0d\x73\x1a\xc4\xe9\x41\x9c\x7e\xe4\xe2\x74\xa7\x33\xb0\x3d\xf4\xe0\x69\x08\xd8\x9d\x16\xbd\x3d\xda\xfe\x51\x8a\xdc\x9d\xd7\xd8\x22\xf8\xff\xd1\x0a\xe1\x9d\x16\xdb\x52\x20\x6f\x5a\xf2\xe7\x2c\x96\x77\x82\xe1\xd6\x78\x98\x47\x28\xa8\xb7\x5e\xe0\xe6\xa4\x90\x86\xf5\x05\xf9\x18\x35\x3b\xb0\x99\x34\xb6\xb3\xf7\x76\xda\x50\x4c\xde\x26\x4e\xf5\x52\xf5\xb6\xb7\xe8\xbb\x56\x61\x73\x6b\x4b\x31\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x1b\xe2\xcc\xcb\xb8\xe2\xbd\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x5c\x76\x9b\x44\x92\x0e\x4b\x36\x32\x7c\x96\xcb\x69\xdb\x5a\x39\x77\xb0\xaa\x96\x51\x86\x7b\x86\xb3\x43\x76\xbe\xdf\xdf\xde\x16\xbb\x2d\x89\xa3\x61\xee\x58\xc7\xaf\x12\x49\xe6\xf7\xe3\x50\xc1\x26\xdf\xc5\x4c\x77\x0e\xbe\x0c\xc4\x6a\x9c\xe4\xc8\x79\x30\x3f\xe4\x05\x1b\x91\xd7\x34\x51\x6c\x44\xbe\x15\xd7\x42\xde\xf6\x37\xdf\xcd\x15\x19\x1a\x66\xfb\xc1\xd6\x5e\x68\x91\x2b\xd4\x7a\x2a\xa5\x76\xdf\x92\xd8\x9f\xfb\x17\x9c\x85\xc6\x6a\xe8\xe3\x42\xf0\x9f\x8b\xaa\xa2\xe2\x9d\x4c\x47\x75\x15\xe6\xe5\xd5\x77\x80\x1c\xa8\x6e\xab\x4a\x21\x5f\xf3\xa3\x5a\x1f\x56\xdd\x26\x0f\x6a\xa3\xa2\x5a\x4d\x0c\x37\x8a\x7e\x55\xd5\x4a\x6c\x49\xc6\xba\x59\x26\x2b\x92\x64\x42\xce\xf5\xa1\x32\x73\xe0\x11\x4d\x92\xa5\xd1\x5a\x6a\x1d\xd2\xf6\xcb\xe0\x6a\xc1\x20\x56\x0e\x1b\x56\x5c\xe1\x37\x2c\x78\xdd\x01\x1a\x0d\x4e\x2c\xb6\xeb\xd8\xaf\x4c\xe4\x86\x5e\x60\x0d\x53\xbb\xb4\x8f\x3b\x44\x09\xf7\xbf\x84\xaa\x1d\x14\x75\x4d\x40\x1a\xc1\xc8\x4c\x16\x22\x26\x54\xc3\xf6\xec\x38\xe7\xaa\x0f\xf7\xfe\x1c\xfe\x9b\xe5\xa7\x7e\x8c\x8d\x81\x07\xbe\xcc\xe3\xdb\x20\x7c\x95\x44\x8e\x7d\x62\x51\x11\xc4\x78\x85\x31\x1c\xbb\xd9\x1a\xfb\xcd\x7d\x7d\x90\xc4\xd4\xfb\xcd\x29\xed\x3b\x75\xd2\x63\x40\xfb\xa8\xee\x76\xa2\x42\x0f\xb1\xe7\x6d\x0a\x3b\xb5\xaf\x4c\xd4\x84\xf6\xc0\x15\x6d\x2f\x70\xa6\x82\x15\xae\xe0\xb7\xa1\x27\x14\x2a\xb0\x18\x26\x63\x3b\x41\x40\x9d\xaa\x85\xdc\x99\x32\xb6\xcd\x4f\x7c\xeb\xe4\x37\xf3\x41\x90\xed\xc6\x2b\xb2\x9d\xe5\x7f\xa5\x6c\x07\x0d\x8b\xca\x50\x1a\x60\x92\x29\x5d\x42\x68\x5a\x9a\xc9\x5c\x53\x74\x70\x14\x22\x66\xb9\xd2\x14\x6b\x94\xb8\xbc\xbc\xcc\xac\x79\x41\x15\xe1\x5a\x91\xc8\x26\x19\xe2\x86\xdd\x51\x26\x63\x00\xec\x0b\xf3\x82\x17\x11\x2a\x1f\x47\xbe\x5a\xd9\x98\x8d\xbb\xb0\x79\x62\x09\xdd\x10\x58\xb5\x2f\x9d\xbd\xd2\x2c\xab\xd3\xd5\x60\x11\x02\xc4\xf1\x1b\x1e\x63\x30\x12\xcb\x08\x17\xfd\x10\xd5\xed\x0e\x1c\x74\x4c\xac\x3f\x56\x63\x6f\xa5\x59\xfb\xc0\x06\x8d\x76\x3b\x51\x97\x19\x46\xca\x6f\x3b\xfb\xeb\x62\xf3\xf0\xf2\xab\xd8\x93\x5c\xae\x8f\x94\xc3\x6b\x65\x57\x5d\xf6\xc5\x86\xdd\x0d\x62\x75\x21\x1a\x54\xe7\x56\x92\x5a\xb6\xda\x63\x72\xdf\x55\x6e\xb6\xa4\xfe\x6d\x2d\xc4\x32\x0e\x02\x07\x5b\x3e\x06\x86\xc9\x8d\xcf\x6e\xcb\x23\xbc\xef\xba\x3a\x7b\x56\x4c\x29\x2f\xe7\x42\xea\x65\xb0\xed\x56\xf6\x96\x03\x95\x5b\xd3\xf3\x70\x2d\xec\xe3\x2d\xc7\x6c\x95\x00\xd8\x7f\xda\x1b\xcb\xaa\x69\xbf\x4d\x3c\x29\xa3\xb9\xe6\x51\x91\xd0\xbc\x3c\xfb\x40\xe4\x57\xf2\x96\x3a\xcf\x59\x69\x9a\xeb\x56\x45\x16\xae\xdc\x93\xbe\xe6\x22\x14\x5c\x58\x30\xe1\x9d\x7f\x98\x06\x46\xa6\x6c\x6e\x98\x67\x96\x25\x4b\x97\x63\x50\x46\xb0\x27\x5c\xe9\xb2\xe1\x21\xc8\x02\x6d\x43\x21\x3a\x97\x6b\xf8\x45\xe7\xd1\xc9\x24\x8d\xa4\x98\xf1\xf9\xfd\x65\xd1\xbd\x7f\xf3\xf6\x25\x7c\x12\xee\x95\x39\x74\xfe\xfe\x4a\x06\x5d\x39\x49\xb8\x5d\x26\xc9\xf9\x1f\xca\x14\x39\x5b\xcf\xa1\x21\x3f\xce\x65\x5f\xb9\xfd\xdc\x31\xef\xca\x4f\xd3\x45\x65\x78\x56\xac\x32\x29\x14\x37\x32\x31\xd4\xcf\x82\x87\xb0\xe3\xcb\xfb\x37\x6f\xfb\x4d\xba\x1a\x32\xac\x86\x0c\xab\x21\xc3\x6a\xdb\x81\x6a\x91\x61\xe5\x4f\x33\xe4\x57\xb9\xb0\x3d\xf3\x6f\x9b\x26\x54\x1e\x77\x5f\xd3\xba\xed\xc7\x37\xcb\x87\x33\x46\x0d\x68\xb6\x47\x16\xbe\xb6\x0f\x96\x9d\x87\x2a\x79\xba\x96\xcc\x80\x2e\xfe\xfe\xcd\x5b\x3f\xee\x1d\xe4\x44\xc4\x5c\x99\xcf\xbc\x94\x19\x67\xf1\xcb\xab\xef\xda\x35\xa6\x3e\xab\xbf\x55\xc9\xe9\xc0\x1f\xcd\xcc\x0f\x15\x39\xc0\x87\xc8\xcb\xab\xef\x0e\xdc\x42\x60\x23\xca\xe6\x65\x3e\xab\x8d\x50\x1d\x0a\x04\x48\xff\x47\x04\xa3\x90\x68\xf5\x76\x5c\x69\xee\x24\x85\xed\xb4\xb3\xa0\x8a\x4c\x19\x13\xc1\xa0\xa8\x02\xbf\xb7\x4f\x43\x29\x50\x1b\xa7\x04\x15\xbc\xb1\x63\x40\x19\xd5\x30\x21\xdf\x1b\xd1\x26\x67\x4c\x98\x65\xc4\x23\xd8\x02\xac\x90\xcb\x80\xf7\xa2\x4b\x2f\x58\x98\x3a\x80\x15\x41\x19\x9f\x35\x93\xdc\x9c\x31\xd2\xa4\x93\xb6\x48\x7c\x2a\x31\x7d\x6d\x01\x99\x3b\xc4\xf6\xfb\xb0\x2b\x1f\x94\xd6\x64\x7f\x54\x9c\x9b\x11\x90\x48\x30\x42\xcd\xd9\xd6\xde\x69\x16\x88\xd1\x65\x33\x80\xd3\x8b\x73\x5f\x46\x76\x42\xc6\xe3\xb1\x8d\x17\xd3\x79\x11\x69\x2c\x0d\xa5\xb1\x79\x93\x19\x35\xe6\x39\x70\x2b\xc5\xc0\x12\xe4\x7a\xd4\x59\xec\xc4\x20\x2f\x08\xc8\x9c\x58\xeb\x55\x09\x8a\x09\xa9\xc6\xec\x7d\x14\x00\x09\xf2\x5a\x4a\xbb\x49\xf8\xcd\x7f\x90\x93\x13\x72\x59\x33\x90\x4f\x8d\xdc\x6a\x3b\xb3\x80\xfc\x3f\x93\xf2\xb0\x6a\x2a\x63\x13\xf3\xe2\x37\x42\xde\x8a\xa6\xaf\xc3\xb7\x68\xce\x5e\x90\x8f\x07\xa7\x37\x94\x27\x06\x85\x3f\x1e\x8c\xc8\xc7\x83\x0b\x1b\xae\xcc\xc5\xfc\xa3\x6d\x77\xf0\xf1\xe0\x8c\x41\xdf\xf1\xf8\xe3\x81\x19\xf6\xb7\xd0\xb4\xee\x2d\xcb\xe7\xec\x1b\xb6\xfc\x0f\x18\xcc\xdf\xbe\xc2\x06\x77\xcb\xff\xc0\xfe\x76\xe6\xbe\x21\x58\x1f\x96\x19\xfb\x8f\x94\x66\xfe\xc6\x5b\x9a\xf9\x97\x83\x48\x8c\x1f\x7e\x34\x94\xfe\xe6\xf9\xa4\xdc\xd1\x9f\xfe\xa6\xa4\x78\xf1\xf1\x20\x28\xe1\x29\x53\x83\x19\x99\x5e\x7e\x3c\x20\x95\xaf\xbe\xf8\x78\x00\xdf\x75\xf7\xdd\x24\x5f\x7c\x3c\x30\x5f\x32\xb7\x73\xa9\xe5\xb4\x98\xbd\xf8\x78\x30\x5d\x6a\xa6\x46\xcf\x47\x39\xcb\x46\xe6\x60\xff\x47\xf9\x85\x8f\x07\x3f\x99\x3d\x39\x39\xc1\x1e\x1d\xb8\x99\x8a\xfc\xab\xb9\xb1\x46\x0f\x66\xb1\x55\x5f\xc3\xda\x47\xb7\xd5\xc7\x42\xbb\xf9\x2e\xd6\xb3\x3d\x9b\x72\xef\x5c\x2b\x74\xf5\xc5\xb2\x5b\xe7\x7e\x11\x21\xf6\xfc\xfa\x86\xf7\x5e\x1d\x05\xd3\x33\xea\x9f\xe5\xa8\x18\x83\x19\x4f\x08\x76\x84\xc4\x1c\x44\x23\x2a\x81\x07\x1d\x5a\xbe\x08\x52\x28\x27\xb6\x55\x15\x5c\x43\x3b\xf0\xcc\xdb\x61\x40\xf2\x8b\x22\x96\x69\x73\xba\xee\xa9\xa6\x69\xb7\xca\xa0\xe9\x8a\x75\x7f\xf7\xc8\x0d\x04\xb5\x35\xf3\x53\xd7\xcd\x18\x97\xb5\xe7\xe2\x53\xfa\xe9\x0d\xb4\x96\x7a\x41\x7e\xf7\xe5\x1f\xff\xf0\xa7\x75\xa6\xdd\x29\x2a\xf4\x5f\x6f\x4c\x5d\x6e\x00\xc3\xea\x8b\x75\xf3\xea\xc4\xc9\x9f\x93\x32\x2f\xba\x6c\x20\x5b\x0d\xdb\x51\x4c\x93\x29\x78\xb0\x8a\xcc\xc0\xe5\xb5\xcb\x56\x15\x11\x86\x14\x36\x0e\xc6\x3d\x01\x4f\x96\xe4\xf9\x97\xd8\x13\x09\x3e\xbd\x42\xbe\x7f\xf8\xf4\xe3\xa4\x61\xca\x5c\x91\x7f\x1f\xd5\xe6\x63\x64\x9e\x02\x98\x9e\x41\x1c\x74\x56\x1b\x75\xd5\x06\x1d\xaf\xe1\x84\xcc\xcf\x77\xdb\xc6\x75\x68\xf1\xf1\x87\xdf\xaf\xdf\x5f\xd7\x75\xfe\x59\x1f\x7e\x45\xeb\x37\xf4\x82\x00\xc5\x32\xf6\x34\x85\x9c\xfe\x20\x74\x24\x44\x6d\xdd\x2d\xf8\x87\x5c\xe4\x32\x2e\x22\xa3\x8e\xc9\x99\x8b\x4c\x8f\x42\x02\x05\xbd\x65\xcc\x69\x40\x2d\x9b\xb0\x4f\x06\xe8\xac\x6c\x32\x64\x54\x5e\x46\x05\x17\x73\x55\x16\x72\x04\x02\x82\x5c\xf7\x76\xc1\x80\xf5\xe8\xb0\x0d\x29\xcc\x4a\xf1\x18\xc2\xe6\x29\x99\x17\x34\xa7\x42\x33\x6c\xd6\x80\xad\x48\x51\xc7\x2c\x49\x1e\x0d\x6a\x63\xda\xd3\x88\x47\x15\x89\x95\x99\xa2\xd5\x06\xb1\x85\x6d\x6f\x47\xf5\xf9\xb3\x2f\x37\x6e\xb9\x7f\x6e\xbd\x91\x9d\x6a\xcd\x72\xf1\x82\xfc\xcf\x0f\xa7\xe3\xff\x47\xc7\x7f\xff\xf1\xc8\xfe\xe3\xd9\xf8\xdf\xff\x77\xf4\xe2\xc7\x2f\x82\x3f\x7f\x3c\xfe\xeb\x6f\xfa\x30\xb9\xaa\x5e\x83\xab\x5a\x01\x6d\x7b\xd3\x98\x03\xf3\xd5\x4d\x5d\xbd\xc6\xe4\x00\xa6\xb4\xf9\x19\x3b\xdd\x4d\x4a\x46\x3b\x20\xe9\x7a\x4c\x97\x51\x9f\x4a\x3c\x03\x8a\x67\xc4\xd2\x89\x95\x70\x27\x91\x4c\x4f\x02\x0b\x83\x11\xad\xdf\x52\xb1\x24\x25\x59\x43\xa1\xb4\x8e\xe9\x0a\x12\xcd\x68\x94\x4b\xa5\x2a\x56\xe2\x6b\x46\xbc\xe4\x8a\xc4\x72\xca\x22\x0a\xb2\x78\x3e\xe5\x3a\xa7\xf9\x32\x50\x3d\x5c\x91\xfb\x42\xb1\x59\x91\x90\x23\xc5\x18\x99\x08\x19\xb3\x55\xea\x7a\x8c\x34\x94\x4e\x79\xc2\x35\x64\x85\xc4\xcc\xa8\xda\x09\xb7\x2a\x80\xf3\x60\xbb\xce\xbf\x73\xf6\x89\x70\xed\xbb\xef\x73\x45\x8e\x62\xa1\x9e\x3f\xff\xf2\x77\x57\xc5\x34\x96\x29\xe5\xe2\x75\xaa\x4f\x8e\xff\x7a\xf4\x73\x41\x13\xc8\x60\x79\x47\x53\xf6\x3a\xd5\x7b\x05\x8b\x55\xd9\xe2\xf3\x3f\xb4\x38\x45\x47\x3f\xe0\x59\xf9\xf1\xe8\x87\xb1\xfd\xd7\x17\xee\xd6\xf1\x5f\x8f\x3e\x4e\x36\xfe\x7e\xfc\x85\x59\x43\x70\x02\x7f\xfc\x61\x5c\x1e\xbf\xc9\x8f\x5f\x1c\xff\x35\xf8\xed\xf8\x37\x83\x91\xbd\xb4\x9a\x07\xba\xd7\xbd\x19\xdb\xed\x18\x5e\x91\xaa\x1b\xdd\xeb\xbf\xaf\x1a\xdf\x57\x26\x8f\x46\xf8\x86\x22\x76\x51\xe5\x23\x81\x99\xbe\x3e\x44\xcb\x8a\x76\x7d\x59\xec\xeb\x6b\x44\x49\x17\x71\xc3\x6b\xfa\x40\xeb\x0d\xf1\xf9\x69\xe5\xf9\x9f\x6c\x82\x48\x60\xb7\x02\x63\xe6\xb2\x1a\xe0\x22\xc1\xf8\x53\x2d\x19\xe3\xf3\x05\x1b\x4c\x3b\x83\x1b\x60\x70\x03\x0c\x6e\x80\xc7\xe1\x06\xa8\x1f\x79\x70\x07\x40\x4b\x55\x15\x18\x93\x69\x9c\x72\xb1\xe6\xf8\x6f\x3e\xf7\x96\x3a\x8c\x48\x26\x8d\x2c\xc3\x21\xfc\x5a\xde\xb0\x3c\xe7\x10\xf6\x86\xef\xe4\xac\x6c\x42\x18\x86\xa0\xf7\x64\x84\x8d\x59\x96\xc8\x65\xba\xae\x74\xf9\xdd\x44\x14\xdb\x45\xf6\x1c\xc4\x3c\x18\x7e\x07\xc3\xef\x67\x64\xf8\x1d\xac\xb9\x83\x35\x77\xb0\xe6\x36\x5c\x83\x35\x77\xb0\xe6\x0e\xd6\xdc\xc1\x9a\xbb\x72\x0d\xd6\x5c\xfb\xcc\x60\xcd\x1d\xac\xb9\xf7\x6d\xcd\x2d\x2f\x55\x29\xea\x7b\x4f\x6a\x65\x9b\x68\xa7\x15\x85\xde\xb6\x57\xb5\x2a\x7d\x55\x33\x6f\x50\xe7\xb9\x56\x2e\xd9\x10\x34\xf7\x49\xd8\x86\xed\x7e\x7b\xce\x0f\xa1\x53\x83\x06\x3d\x68\xd0\x43\xe8\x54\xe5\x1a\x94\x6d\x7f\x0d\xca\xf6\xa0\x6c\x0f\xca\xf6\xa0\x6c\x0f\xca\x76\xfd\x1a\x94\x6d\xbc\x06\x65\x7b\x50\xb6\x1b\xae\xa7\xa1\x6c\x6f\x0a\x9d\x9a\x19\x94\x75\x37\xb7\xc5\x4e\x91\x30\xa8\xe6\xcb\x21\xa8\x66\x08\xaa\x19\x82\x6a\x86\xa0\x1a\x77\xdd\x77\x50\x4d\xd5\x02\x87\x91\x2f\x15\x8b\x1b\xe0\x6c\x96\xcb\x1b\x1e\x33\x55\x0b\xc1\xf1\xf5\xf6\x02\x2e\x93\x42\x87\xbe\x32\xac\x86\xdd\x4f\x50\xcd\x60\x9e\x1b\xcc\x73\x83\x79\x6e\x30\xcf\x55\xaf\xc1\x3c\xe7\xaf\xc1\x3c\x37\x98\xe7\x06\xf3\xdc\x60\x9e\x1b\xcc\x73\xf5\x6b\x30\xcf\xe1\x35\x98\xe7\x06\xf3\x5c\xc3\xf5\x34\xcc\x73\x21\x06\x0d\xe9\x15\x83\xf6\x39\x68\x9f\x8f\x4f\xfb\x1c\x54\xca\x41\xa5\x1c\x54\xca\x86\x6b\x50\x29\x07\x95\x72\x50\x29\x07\x95\x72\xe5\x1a\x54\x4a\xfb\xcc\xa0\x52\x0e\x2a\xe5\x90\x5e\xd1\x31\xbd\xe2\xfd\x9b\xb7\x41\x3c\x07\xc6\x79\x04\x98\x05\x0d\xb6\xa1\xf0\xae\xe3\xc9\x83\x2f\x76\xd0\x86\x07\x6d\x78\xf0\xc5\xda\x6b\x50\x9c\x07\xc5\x79\x50\x9c\x07\xc5\xb9\xb2\x71\x83\xe2\x3c\x28\xce\xd5\xad\x1c\x14\xe7\xee\x40\x1b\x14\xe7\x41\x71\x6e\xd8\x8a\xcf\x43\x71\x1e\xaa\xcc\x6a\x99\x43\xf5\xd8\xfb\xaf\x30\xfb\xb5\x6f\xf1\xb9\x5a\x5d\x16\x7e\x5b\x5b\x59\x16\x27\x0c\x3f\x35\x55\x95\x95\x88\x95\xab\xe5\x64\x5d\x53\xd1\x07\x28\x25\x8b\x8d\x81\xac\xe2\x50\x08\x0e\x62\x4f\x5a\x24\x9a\x6b\x26\xa8\x88\x96\xc0\x66\xdf\xbf\x79\x4b\x52\x2a\xe8\x3c\xe8\xed\xa3\x26\xe4\x5c\x03\xbd\xd1\xb9\x6f\xe6\x64\xfb\x0f\xf9\x04\x90\xb0\xdd\x11\x54\xa2\xf0\x1d\x87\x40\xe1\x70\x42\x00\x8b\x41\x00\x34\xec\x03\xba\x13\x85\x8d\x89\x7e\x55\x3f\xe0\x43\x4a\xcc\x90\x12\x33\xa4\xc4\x3c\x92\x94\x18\xa0\x1f\x6b\x5b\xce\x55\x88\xcc\x0e\x8d\xb8\x62\x36\xa3\x45\xd2\xd0\xdc\xb7\xc8\xc0\xb6\xe6\x2d\x58\xe4\x0c\x9f\xec\x60\x62\x55\x2c\x61\x91\x96\xf9\xd6\xb6\x75\x57\xf6\x41\xfb\x06\x2e\xb3\xb2\xb4\x43\xb5\x99\x6e\xb5\x58\xe9\xb6\xd9\x12\x10\x5d\x74\xb4\x78\xf5\x29\x03\x4b\xe3\x1a\xd3\xf0\xca\xec\xeb\x2f\xe1\x89\x72\x4d\xf7\x12\x3a\x65\x89\x07\x85\xa3\xa4\x29\x1e\x19\x94\xd4\xca\x3b\x20\x60\x9e\xbe\x3b\x5b\xb5\x72\x57\x17\xb8\xce\x30\x4d\x36\x1b\xa7\x57\xa6\x7e\xba\x61\x7a\x96\x30\xb8\x5f\xc0\xaa\xe0\x95\x57\x24\x7a\x23\x42\xc9\x35\x5b\x22\x7d\xac\x64\x69\x99\x87\x73\x06\xd4\x14\x36\xf3\x9a\x2d\xe1\x21\x4b\x2c\xb7\x08\x98\xbd\xf4\x11\xbf\x66\xeb\x20\x84\xbf\xbb\xc9\xae\x17\x50\x5b\x75\xec\xbe\x66\xcb\x4d\x3f\xd7\x00\x6e\xe0\xe0\x6d\x88\x06\xf2\xe6\x86\x37\xd8\x78\x60\xd3\x2c\x4b\x38\x03\x6a\xb8\x71\xec\x56\xf2\x38\xf1\x4b\xed\x30\x51\xbf\x95\x81\xc5\x09\x36\xfb\x50\xe1\xc6\x1a\x4c\x5f\xf0\xcc\x0a\x19\x28\x5a\x38\x56\xf8\x1d\x4d\x78\x20\xc6\x00\x56\x9f\x8b\x11\x79\x27\xb5\xf9\xdf\xab\x4f\xdc\x90\x7a\x83\x0f\x67\x92\xa9\x77\x52\xc3\x9d\x5e\x96\x8a\x53\xe8\xb0\x50\xab\xd9\xf1\xc0\x53\x22\x67\x15\x7e\x68\xc4\xb0\x59\x25\x1d\xd0\x3c\x7d\x2e\x8c\x3a\x69\x57\x54\x31\x86\x98\x21\xd2\x42\x01\x03\x13\x52\x8c\xd1\x7e\xd1\x34\x86\x05\x84\xcc\x2b\x70\xd8\x30\x9c\x1d\x0a\xec\x24\xf8\x0b\x4a\x40\x89\x11\x65\x49\x8c\x1d\x84\x81\x9b\x1b\xa2\xcd\x23\x82\xde\x0e\xf0\x39\xb4\x01\xef\x26\xba\x82\xd7\x16\xea\xd2\x72\xaf\x80\x64\xbe\x31\x07\xa0\x03\x89\xc5\xe7\x91\x2c\xa5\x34\x33\xdb\xf4\x0f\x43\x7d\x00\x52\xff\x22\x19\xe5\x46\x62\x3e\x05\xe9\x3f\x61\x95\xdf\x6c\x73\xf0\x70\x18\x33\x02\x57\xc4\x90\x92\x1b\x9a\x18\x7a\x07\xf6\x79\xc2\x12\xa4\x7e\x46\x48\xaf\x11\xf6\x11\xb9\x5d\x48\x85\xc4\x0c\xad\x54\x5c\x91\x83\x6b\xb6\x3c\x18\xad\x6c\xed\xc1\xb9\xb0\x6e\xaa\x95\xcd\xf4\x44\x54\x8a\x64\x49\x0e\xe0\xb7\x83\xdd\x79\xc1\x46\x62\x49\x63\x34\x1f\xd0\xe4\xa2\x05\x35\xdb\xb8\x6f\x55\xff\xf2\xba\xce\xfb\x35\xbe\x5e\x7f\xc5\x11\x3f\x4c\xcd\x0d\x75\x13\x78\x92\x50\x7c\xd4\xfa\x81\xa1\x39\x2a\x9a\x47\xb0\x03\x2c\x44\x4d\x7b\x38\x1f\xa9\x63\xdc\x59\x23\x8f\x3a\xd8\x83\xa6\xd7\xb9\xe5\xbb\x51\xe8\x79\x74\x81\x19\xc4\xf1\xe9\xc5\xf9\xf6\x5e\xbb\x57\xf0\x0a\xd1\x2c\x49\xd0\x8b\x6d\x64\x56\x2d\xad\xcc\xda\x28\xc2\x64\xc1\xf8\x81\x92\xbf\x76\xb2\x4d\xed\x5b\xe1\x57\x10\x85\xbc\x12\xbb\x7d\xae\x1f\x6a\x2f\x58\x72\xc7\x3e\x65\x09\x8f\xb8\x76\xf4\xbb\x94\xad\x40\x1f\x82\x97\x80\x70\x71\x90\x06\x14\xd3\xa3\x52\x56\xe3\x8a\xf0\xb9\x90\x79\x33\x7e\xde\x4d\x04\x3b\x21\x9f\xc6\xd7\xc5\x94\xe5\x82\x69\xa6\xc6\x46\xc6\x1a\xdb\x17\xd8\xea\x11\xa8\x8b\xb0\xdb\xa0\x74\xf0\x6d\xf5\x85\x8a\x02\x6a\x07\x73\xb4\x75\xb9\xd2\x6b\x18\x9e\xf2\x10\x84\xf3\x9c\x33\xb4\x18\x7a\x07\x8a\xbe\x95\x44\x15\x99\x4d\x32\xaf\x0d\x69\x8e\x26\xf9\x28\x9c\xa0\xfd\xa2\xec\x0f\x0c\x84\x02\xe2\x25\x5c\x6e\xbb\x3d\x59\x56\x53\x86\xed\x4a\xe5\x0d\x73\x6a\x2c\xb2\x04\xc3\x0c\xb2\x05\x55\xac\xd4\xc1\x54\x11\x45\x8c\xc5\x2c\xc6\x1f\x2c\x2b\x61\xb3\x19\x8b\x34\xbf\x61\xc9\x12\x8c\xff\x0a\x45\x12\xff\x7d\x83\xd9\xf8\xf9\x72\xc1\xb5\x2f\x0a\xf6\x49\x3b\x25\x9d\x70\x50\xc2\xab\x96\x8a\xdc\x2f\x77\x41\x15\x99\x51\x9e\x18\xbd\xee\xa3\x20\x1f\x58\xb4\xb8\xc8\xd9\x0d\x67\xb7\xdf\x0a\x45\x67\xec\x35\xe5\xc9\x6b\x99\xdf\xd2\x3c\x0e\x60\x70\x17\xcb\x37\xb3\xf2\xbf\xe1\x94\x1c\x5c\x4e\x3d\xe1\x4c\x96\x41\xa7\x66\xeb\x19\x33\xeb\xbd\x75\x0b\xbc\x48\x0c\xc4\xc0\xe1\x4a\x8d\x42\xeb\x31\x8a\xe4\x6c\xc6\x72\x26\xcc\x79\xa2\x6e\xfc\xe0\x25\xcf\x1e\x22\xaa\x69\x22\xe7\x65\x93\x69\xab\xf7\xa2\x63\x8c\xc2\xc7\x1c\xf4\x9c\x1b\x88\x19\x51\x01\xda\x81\xe0\xd9\x0d\x8c\x46\x1f\x05\xf9\xfe\xf4\xf2\xdd\xf9\xbb\xaf\x5f\x00\x57\xd9\x04\xe1\x55\xbc\xe6\x8a\x14\xf0\x54\x60\xf5\x50\x45\xa2\x0d\x8a\x17\xc2\xfb\x8b\xa6\x6c\x41\x6f\xb8\x39\x03\xb9\xb5\x87\xdc\x30\xec\x2c\x6e\xd4\x60\x92\x48\x65\xc6\x49\x98\x52\x64\x29\x0b\x8c\xe3\x89\x19\xcb\xd0\xc5\xad\x34\x15\xd0\xcc\xc4\xfa\x33\xea\x8b\x20\x53\x66\x7e\x75\x16\xb1\x95\xd3\xd5\xe4\x4f\xd8\x42\x39\x9c\xa6\xbb\x46\x91\x25\x1b\x1d\x1e\xe3\x0d\x6f\x99\x5f\x37\x81\xb8\xaa\xf6\xb7\x0f\x98\x42\xc5\x7f\x53\x07\xee\xf0\xc1\xcb\xee\xba\xff\x7a\x3d\x0a\x03\x3f\xbe\x45\x2c\xec\xa0\xf1\x6f\x0e\xaa\xaa\xac\x32\x08\xae\xa9\xc9\xde\x4d\x9c\x33\x08\x12\xea\x93\xd9\x0c\xd1\x5a\x43\xb4\xd6\x10\xad\xd5\xf4\xfb\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x43\xb4\xd6\x10\xad\x35\x44\x6b\x0d\xd1\x5a\x64\x88\xd6\x2a\x9f\x19\xa2\xb5\x86\x68\xad\x87\x4b\x73\x0a\x14\xd3\xad\x3a\xe6\x9b\xf2\x59\x94\x4e\xb4\x8b\x87\x72\x27\xb3\x2a\x1a\xd6\xb5\x4e\x7b\x8a\x0d\x3f\xb6\xc3\x74\x36\x2c\xb7\x11\xba\x44\x7b\x43\x6e\xd5\x84\x1b\x58\x4e\x56\xbc\xe3\x9e\x03\x55\x16\xf5\x58\x4d\xb5\x55\xe7\xc2\x25\x9b\x75\xf4\x2d\x5c\xb2\x59\x68\x6d\x43\xc0\x54\x5d\x0a\x36\x62\xc5\xfb\x1c\xee\x20\x7c\x60\x7d\x8c\x53\xe3\x12\x8c\xb0\xef\x4c\xa6\x16\x1f\xed\x1a\xd6\xfa\x42\xb7\x1e\x69\xe0\xc7\x17\x54\x2f\x5a\xcd\xe0\xf0\xdc\x82\x0d\x1c\x87\xe0\xca\xcd\x38\x8b\x58\x25\x8c\x0a\xe4\x38\x46\x63\x7b\xd3\x08\x3e\x39\xb3\xbf\x8d\x50\xe2\xb0\xee\xd2\x32\xcc\xca\x08\x4d\x84\x1a\x42\xcc\x63\xf2\x5f\x57\xef\xdf\x9d\x7c\x2d\xad\xac\x60\xb4\x19\x65\x1b\x26\xa5\x4c\xe8\x11\x51\x45\xb4\x20\x54\x99\xa9\x19\xfd\xf6\x0a\x4c\x0f\x29\x15\x7c\xc6\x94\x9e\xd8\xd1\x58\xae\x7e\xf8\xf2\xc7\x49\xd5\xe2\xc1\xad\x4f\xd5\x05\x23\x59\x04\x80\xb3\x61\x16\xe3\xdf\x05\xa1\x15\xa6\x94\xc9\xd8\x4e\xfa\x16\x26\xab\xe9\x35\x23\xd2\x4e\xb6\x60\xc0\x14\x5e\x90\x03\x83\x26\xc1\xa7\xff\x61\x0e\xd6\xbf\x0e\xc8\xd1\x2d\x58\xf5\x0f\xcc\x9f\x07\xf8\x41\x1f\x3b\x66\xee\x05\x1c\xdf\x7e\x18\xe5\xfb\x9c\xcf\xe7\x20\x6e\x81\xe9\xf6\x86\x09\x7d\x0c\xfc\x6d\x46\x84\x0c\x1e\x16\xd6\x45\x56\x3a\xc6\xea\x13\xf9\xe1\xcb\x1f\x0f\xc8\x51\x75\x5d\x46\x04\x65\x9f\xc8\x97\xde\x19\x96\xc9\xf8\xd8\x69\xad\x4b\xa1\xe9\x27\x50\x0c\x16\x52\x31\x81\xbe\x04\x2d\xd1\x20\xab\xa4\x51\x3e\x59\x92\x8c\x51\xc0\x8c\xc9\x2d\xda\xe0\x1c\x28\xd1\x9f\x9c\xd1\x5c\xd7\x22\xeb\x3e\xbc\x3f\x7b\xff\x02\xbf\x66\xb6\x6d\x2e\x9c\x96\x3b\xe3\x82\x26\xd6\xb2\xed\xe5\x43\x33\x91\x02\x37\x49\x4b\xab\xda\x3a\xa3\xee\xac\xd0\x45\xce\x26\xf5\x48\xab\xd6\x18\xdf\x14\xe6\xd6\x8c\xec\x10\xee\x56\x3f\x68\x0f\x18\x4c\xd6\x7a\x89\x62\x8d\xb3\x75\x75\x89\xef\x02\x1c\xdc\xb8\xc4\x92\x34\x9b\x55\xc6\x32\x52\x66\x81\x11\xcb\xb4\x3a\x91\x37\x86\x74\xb2\xdb\x93\x5b\x99\x5f\x73\x31\x1f\x1b\x24\x1b\xe3\xce\xab\x13\x60\x31\x27\xbf\x86\xff\xed\xb5\x22\xe0\x53\xed\x97\x85\x31\xad\xf7\xb0\x36\x60\x9f\x27\x3b\x2f\xcd\xc9\x97\x5d\x38\xc1\xe1\x95\x53\xfe\x6a\x6f\x9b\xe3\x82\xbe\x70\x1b\xec\x1a\x50\xb8\x94\xc6\x48\x02\xa9\x58\xde\x39\x1a\x1b\x00\x82\x8e\x1f\x2d\xc7\x36\x1a\x7d\x4c\x45\x3c\xf6\xf2\x75\xb4\xdc\x19\x62\x05\x6f\x79\x80\xbf\x3d\x3f\xbb\x1f\xe4\x2e\x78\xa7\xd3\xda\x57\x2e\x01\xa9\xc4\x9f\xd3\x24\x5b\xd0\xbe\x7a\x2f\x0c\x51\xe8\x70\x0d\x51\xe8\x43\x14\xfa\x10\x85\x5e\x5e\x8f\x24\x0a\x7d\x88\x22\x1f\xa2\xc8\x87\x28\xf2\xf5\x3f\x0f\x51\xe4\x43\x14\xf9\x10\x45\x5e\xbf\x86\x28\xf2\x21\x8a\x7c\x88\x22\x1f\xa2\xc8\x1b\xae\x3e\x0a\xd6\x3d\xc1\xf8\xcb\xc1\x39\xf6\x34\x9c\x63\x83\xbb\x6b\x70\x77\x0d\xee\xae\xc1\xdd\xb5\x03\xc6\x0f\xee\xae\xc1\xdd\x35\xb8\xbb\x06\x77\xd7\x23\x75\x77\x75\xea\x32\xfe\xa4\x6b\x67\xdd\x7f\xd9\x2c\xb8\xb5\x5a\x31\x6b\x6d\xb1\x2c\x5b\x27\x6b\xa5\x18\x56\x59\x07\xeb\x25\xa6\x53\xde\x7d\x11\xac\xaa\x01\xd0\x35\x68\xee\xd0\x94\x7d\x70\xe8\x0d\x0e\xbd\xc1\xa1\xb7\xed\x94\x74\x70\xe8\x81\x2f\x2f\x3c\x0a\x56\x1d\x29\x53\x38\xde\x37\xbb\x36\xd6\x7f\xba\xbd\x69\xc5\x5a\x55\xc2\xcf\xbb\x5c\x94\xf2\xfb\x81\x85\x05\x4e\x8a\xd9\xd0\x48\xa6\x99\x14\x06\x31\xfa\x71\x2e\x96\xe3\xb5\x48\x58\x75\x8f\xda\xfb\x53\x16\x06\x93\x5b\xcf\x56\x9a\x49\xc5\x2a\x76\xdc\x1d\x14\xef\xcd\xae\xa9\x31\x3a\x7d\x9c\x09\x6d\x07\xc5\xbd\xf2\x7e\x2b\x59\xe4\x4d\xf8\x86\x75\x4d\x82\xe7\xe9\xe7\x82\xe5\xd8\x46\xbf\x74\xe0\x94\x40\x71\x26\x57\x74\x49\x55\xc0\x72\xb8\x61\x33\x5b\x82\xa9\xcd\x52\x49\x07\x7f\xec\xca\xaa\xef\xd5\x27\x4b\x5a\xfb\x4f\x5a\x78\x4f\x1e\xb7\x7f\x96\xb4\xf5\xd1\x92\x96\x7e\x5a\xd2\xc2\x57\x4b\xda\xf9\x6b\x49\x6b\x9f\x2d\x69\xe3\xb7\x25\x77\xec\xbb\x25\xed\x9d\x9a\xa4\xb5\x0f\x77\x65\xd2\x8f\xce\x8f\xdb\x71\xd9\x6d\xfc\xb9\x2b\x8b\x1e\x7c\xba\x35\x50\x6f\xf7\xeb\x92\xb6\xbe\x5d\xd2\x3e\x3d\x69\xab\x8f\x97\x0c\x7e\xde\x6e\xfc\x65\x2b\xd1\xed\xe6\xef\x6d\xb5\x97\x39\x9b\xb5\x73\xd2\x5f\xb2\x19\x2e\x26\x10\x27\x4a\x47\x87\x5c\x2b\x43\x94\x52\xc7\xc8\x52\x51\x57\x3f\xa7\x22\xbb\xdc\x4f\x44\xd4\x25\x8f\x16\x97\xa1\xf1\x8a\x06\xb6\x2c\xa0\x91\x6e\xb6\x23\xc2\x44\xce\xa3\x85\x9b\xac\x11\x72\xad\x67\x6d\x73\xcd\x93\x70\xda\x5b\x36\xb4\x1d\x3b\xdb\xee\xcd\x69\x58\xe8\x0e\x3e\x9d\x70\xe2\x5b\x89\xf7\xe6\x82\x32\x6b\x26\x15\x54\x02\xa9\x65\xe0\x5b\x3d\xbc\x92\xa5\xee\x31\xe8\x1e\x43\x5b\x9a\xa7\x5b\xce\x36\x9c\x2c\x75\x09\xaa\xab\x35\x5b\x44\x39\x79\xeb\x90\xdd\x90\x6b\x1f\x2e\xa3\x85\xd8\xd5\x5e\xf0\xda\x5a\x0f\x24\x7c\x70\x6d\x65\x90\xf2\x6a\x2f\x7d\x75\xab\x16\x52\x5e\x2b\x7e\xf0\x7d\xaa\x83\xf4\xc5\xe9\xca\xab\x6d\x99\x8e\x2a\x18\xd0\x09\xdf\x2b\x08\x6e\x29\x44\x9b\x4c\x57\x62\x10\x1e\x64\x91\x5b\xab\x92\xac\x59\xdd\xe9\xbe\x45\x49\xfa\x5e\xfc\xb6\x42\x14\x6b\xd6\xf1\xa1\x5b\x75\x89\xbe\x67\xbd\xad\xfe\xc1\x9a\x59\x5f\xf5\x5a\x09\x61\xc7\xb9\x6f\x2e\x4a\xb0\x66\xe6\x1f\xea\xe5\x09\x7a\x9c\xd6\xd6\xb8\x85\x86\xf9\x0c\xd1\x0b\x43\xf4\xc2\x23\x8f\x5e\xe8\x74\x06\x36\x45\x32\x34\xa1\xff\x63\x8d\x67\xe8\xb4\xe8\x4d\xb1\x0d\x4d\x8b\x7e\x24\x11\x0e\x9d\xd7\xb8\x31\xda\x61\xdd\x42\x1f\x49\xcc\x43\xa7\xc5\xb6\x8c\x7f\x68\x5a\xf2\xe7\x1c\x05\xd1\x09\x86\x1b\x22\x22\x9a\xe0\xf6\x28\xe2\x22\xd6\x2e\xf0\x17\xdd\x58\x2c\x2c\x7f\x7c\x7f\x01\x12\x57\xc1\x57\x6b\x41\x12\xe1\x4f\x2b\x81\x12\x95\xd9\x62\xb0\x44\x43\x53\x31\x55\x4c\xc3\x7f\xd7\xa3\x2a\x54\xf5\xe3\x6d\x3a\x8c\x85\xf6\x35\x88\x09\x78\x29\x93\x22\x0d\x6d\x1c\xe3\x55\xd1\x3f\xa3\xd1\xb5\xd1\x5a\xec\xf7\xa6\xe0\x59\x0b\x90\xf3\x6f\x4a\x0a\x90\x28\xc9\x04\xc4\x10\x03\xc1\xe0\x67\xdc\x9f\x0b\x1c\xe4\x57\x1b\x31\xb8\xf1\xf3\xae\x46\xb5\xf5\xd6\x3b\x0d\xa4\x14\x7e\xb2\x95\xa1\xeb\x33\xc2\x57\x57\xe6\x74\x55\xbf\xdd\x7a\x4a\x0b\x2a\x04\x4b\x0c\x2d\x40\x8f\x3e\x48\x77\x1e\x3e\x9b\xc1\x63\x5f\x5e\x99\xcd\xcb\x95\xfb\x0d\xd3\xa9\xa4\xe8\xef\x1b\x23\x13\xa2\x28\xb9\x66\x2c\x53\x81\xb3\xa4\x00\x9f\x0a\xe4\x82\x4c\x97\x46\xbd\x8b\xae\xa1\xdc\x28\x48\x65\xb0\xde\x97\xb8\x31\x3d\x27\xd0\x03\xb2\x67\x2c\x0a\x6e\x0d\x21\x38\x43\x08\xce\x10\x82\xb3\xed\x8c\xb5\x08\xc1\x09\x0f\x7c\x25\x0c\x87\x0a\x72\x9a\x65\x09\x18\xa5\x5c\x69\x58\x5b\x73\xd0\x16\xdc\x58\xb1\xc4\xed\x98\x5e\x54\x63\x0e\xee\xf6\x0a\x85\xae\xfe\xe0\x99\x5a\xed\x89\x8d\x11\x36\x48\x4f\x9b\xe4\xbb\x8d\xd2\x61\x24\xc5\x8c\xcf\xb7\xe7\xc5\x04\xb0\x7c\x09\xaf\x94\x1e\x33\x1c\xa2\xb0\x95\x6d\x4b\x4e\x05\xe9\x5b\x15\xbe\x7d\x17\xc9\x31\x33\x90\xc0\xd6\x86\x07\x54\x56\x71\x3e\x2b\xa7\x37\x82\x68\x9a\x9c\xc7\x96\x3e\x66\x32\x3e\x54\x40\xcd\xe2\x22\xb1\xa5\xa6\xb1\x14\x8b\x39\x9a\x82\x27\x66\x25\x63\xaa\xf1\x3c\x30\x85\xf9\x8e\x5f\x08\xa9\xbf\xf0\x23\xa1\xe1\x25\xe7\x73\xee\x49\x9f\x6f\x59\x92\xc9\x78\xe2\x8b\x39\x68\x70\x59\x56\x07\x9c\x90\x6f\x95\x75\x30\x3b\xe2\x70\xf4\x8f\x7f\x1d\x1b\xc2\xca\x72\x2c\xd4\x69\x07\xae\xbc\xb7\x25\x0a\xa4\xa7\xd8\x1e\x21\x63\x76\xba\x05\xd4\x2b\xe0\x3e\xf3\xf1\x5b\xe6\x75\xbf\x55\x21\x90\xf3\x22\x09\xd2\xc4\x0c\x8c\xf6\x77\xab\xb6\x75\x6c\x64\x68\xe5\x63\xf1\x19\xb8\xed\xaf\xfc\xac\xce\x31\x53\x12\x6f\xbf\xfa\xc4\xa2\x42\x6f\x55\x39\x1b\x8c\xc8\x76\x99\x60\x90\x4a\x12\xfb\x39\x10\x9d\xec\x0f\x66\xbd\xc0\x38\x0d\x78\x6c\x68\x9b\xa2\x9a\xab\xd9\x12\xf3\x6e\x1d\xc0\x58\x10\x1b\x55\x9e\x2f\x23\xa8\x04\x75\x88\xa7\x85\xc6\xd2\xa6\x4b\x12\x2d\xa4\xc1\x2f\x8a\x70\x87\x71\x6f\xb8\xc4\x00\x22\xb0\x07\xe7\x24\x35\x1c\xc0\x6a\x77\xc1\xf0\xe8\xf1\x2e\x5f\x33\xaa\xb0\x54\xba\x84\x95\x0b\xaa\x31\xc3\x80\x9d\xcd\xfc\x31\x37\xea\x0a\x78\xfc\x8a\xd4\x0c\x7a\xcb\xf8\x7c\xa1\xd5\x88\xf0\x09\x9b\xc0\xee\x32\x1a\x2d\x82\x61\x53\xc6\xb4\x22\x34\x49\x7c\x63\x92\x00\x25\x42\x77\xfb\x91\x67\x9a\x96\xc1\x8d\x3c\xbd\xad\xef\x5a\x23\xb8\x46\x84\xe9\x68\x72\x3c\x02\x0f\x9e\x39\x2d\x14\xe6\x38\x5d\x12\xae\xa1\x16\x37\x30\xe8\x5c\x16\x73\x5c\x89\x0d\x34\x50\x5e\x3a\xb2\xf6\x59\x11\x83\x36\x21\xe6\xe4\x00\x17\x77\xe0\x04\x1e\x33\x9c\x35\xb9\xc2\xfa\x5c\x69\x59\xb4\x78\xe6\x39\x53\x99\xc4\x1e\x2c\xf5\xc8\x85\xff\xe3\x5f\x3a\x52\xc7\x25\x30\x17\x7c\xbe\x70\xb0\xa4\x39\xd2\x94\xea\x1e\xb4\x73\x3e\xb6\x09\x23\x69\x19\x44\x52\xf5\xf3\xb8\x72\xf1\x25\x4e\x04\xbb\xa7\x59\x9e\x7a\x18\xc0\x06\xa3\xae\x6f\x8d\xb2\xa9\xcd\x61\x46\x20\x92\x67\xe4\x08\x50\x84\xeb\x43\x05\xe8\x3a\x96\xd9\xf1\x84\x9c\x82\xb6\xdb\xe2\x03\x42\xfa\xf1\xed\x40\xe6\xa3\x4a\x96\x63\xb5\xf3\x59\xb4\xf3\xd4\x76\xf1\xd5\x1a\x6e\x9e\x79\x93\x52\xab\xc7\x11\x26\x5b\x1f\xed\xe2\xb7\x25\xc1\x1c\xda\x3c\xbd\xe2\xd2\x03\x94\x2e\xc3\x16\x59\x9e\x8e\x08\x55\x4a\x46\xbc\x6c\x9c\xb4\x8a\xe9\xb8\x92\x36\x7e\x9c\x8e\xf0\x27\x9d\xd7\x4f\x3a\x06\xa6\x56\xaf\x7a\x7c\xa7\x0d\x49\xad\x42\xa5\x42\xb0\xa6\x4b\xf8\x15\x1c\x85\x53\x96\x6c\x89\xce\x0c\xaf\x2e\xc1\x5f\xee\x6a\x1d\x04\xb6\x66\x41\x6b\x17\xf2\x60\xf1\xaa\x4d\x30\xe9\x80\x1c\x78\x75\x39\xa6\xe5\xd5\x26\xb2\xb5\xfe\x46\xab\x38\xd7\xea\xd5\x1d\x7f\xf1\x6a\x15\x03\x5b\xbd\x56\x44\x92\xbe\x42\x61\xab\x57\xc7\x90\x84\xf2\x6a\x1f\x26\xbb\x61\x5d\x97\x77\x15\x2b\x3b\xaa\x06\xca\x92\xaf\x35\xe2\xfa\x9b\x96\x94\xad\x07\x00\xb5\x0d\xa8\xdd\x00\x9e\xd3\x27\x13\x54\xdb\x30\xd4\xd7\xda\x0c\xf3\x66\xed\xcb\xe0\xb0\xa5\x2e\xb8\xd4\x0a\x6f\xa3\x5a\x41\x1a\xb0\x45\x65\x39\x33\x0c\x0b\x7b\x7f\xd9\x4e\x28\x77\x16\xc7\xdb\xb4\xfb\xdd\x08\x3b\x5e\x9d\xc9\x7b\xf8\xc1\x4e\xe8\x06\x2c\xf2\x35\x34\xce\xba\x1f\xee\x88\x4d\xba\x06\xee\x38\x70\xc7\xea\x35\x70\x47\x7f\x0d\xdc\x71\xcb\x35\x70\xc7\x81\x3b\xde\x39\x77\x44\x5d\x76\x07\xe5\xf9\x7b\x34\x71\xd4\xb5\x65\xe0\xb4\xce\x2f\x54\x55\x9b\x0d\xbf\x71\x09\x14\x1f\x40\xd5\xb6\xb6\xe3\x1c\x62\xc3\x9e\x8f\x9f\x3f\x7b\xd6\x45\xa9\xde\xd6\xf0\x2d\xbc\x82\xe6\x6f\xbf\xfb\x72\xe3\x1b\xeb\xec\x6f\x3d\x58\x4d\x2d\x8e\x7b\x43\x5e\x45\x76\x58\x63\xf8\x04\xea\x24\xa4\x26\x29\xd3\x84\xea\x8a\xa9\x88\xa7\x6c\xe4\x0c\xcb\x65\x8b\xed\x69\x69\x9a\x8d\x89\x14\x2e\x52\x51\xc6\x6c\xb2\xdb\x0c\x22\x46\x15\xe4\x9b\x4c\x99\x9f\x85\x4c\xcd\x57\xb9\xd0\xee\xb8\x98\x29\x30\x07\x15\x72\xc4\x26\xf3\x09\x89\x0b\x66\x13\x9c\xd0\x4f\x67\xdb\x59\xa9\xa5\xd2\x2c\x05\x4b\xae\xcc\x7d\xd3\x37\x9d\x43\x8c\x22\x04\x4a\x16\x34\x49\x96\x84\xdd\x70\x9b\xed\x6b\x06\x07\x37\x21\xd4\x84\x37\x2b\x69\x65\x22\xec\x3d\x3f\xa1\x8e\xc1\xdb\x52\x15\xba\x70\xfb\x95\xb1\x3b\x47\x1a\x5f\xda\x95\x4c\xd6\x0a\xab\xda\x8c\x8b\x36\x70\xf8\x27\x20\xd7\xfb\xcb\xed\x26\x57\xd2\x99\x92\x75\xa0\x5e\x75\xb1\xb4\x48\x12\x83\x18\x68\x85\x5d\x5d\x40\x83\x75\xb4\x21\x91\x0d\x0d\xef\x69\x90\xd0\x86\x4d\xcc\x65\x26\x13\x39\x5f\x86\x90\xc6\x0e\x72\x3c\xcd\x9c\x71\x1c\xbd\x7a\xcc\x37\x68\x7e\x57\xdb\x9a\xc1\xf2\x37\x58\xfe\x06\xdd\x66\xe5\x1a\x74\x1b\x7f\x0d\xba\xcd\x96\x6b\xd0\x6d\x06\xdd\x66\xb0\xfc\x91\x81\x3b\x6e\x80\xc9\xc0\x1d\xc9\xc0\x1d\xd7\xae\x6b\xe0\x8e\x1b\xc1\x33\x70\xc7\x81\x3b\x36\x5d\x99\x8c\xf7\x08\x74\xcc\x64\xbc\x21\xce\x11\xad\x3e\x91\x1c\x27\x32\xc2\xb6\x13\x98\x98\xea\xec\x7c\x8a\xa6\x68\x88\x1a\x91\xbf\x4b\xc1\x30\x78\xcd\xec\x0d\x98\x93\xa0\x0e\x82\x79\xfc\x48\x1d\x6f\x0c\x6c\x1a\xe2\x24\x87\x38\xc9\x47\x1f\x27\xb9\xa0\x0a\xf7\x15\x89\xd2\xfa\xb0\xc9\xe0\x40\x7e\x60\x79\xfa\x44\xa3\x26\x0d\xba\xd8\xed\x86\x14\x9b\x72\x4b\x71\xe5\xb1\xf5\x17\xb0\xf8\xa2\xba\x5e\x2b\x2f\x63\xad\xa6\x38\x66\x31\xc9\x58\x3e\x46\x14\x91\x64\xc6\x6d\x31\xab\x1a\xf6\x59\xf8\x3c\x68\xf4\x63\x75\x1d\x0f\x18\x02\x59\x9d\xc8\x0e\x36\xd7\xd0\x70\x5c\xa1\xf0\x8f\x22\x20\xb2\xab\x54\x3f\x26\xda\x1a\x79\xbf\x69\x29\xd7\x77\x17\xcd\x5b\x95\x3e\x5d\xbd\x1a\xeb\x69\x6e\xac\x7d\x3a\xf2\x05\x1e\x22\xaa\x90\x53\x74\x55\x2d\x3b\xaa\x51\xbb\xe9\x29\xbb\x5b\xa2\xc9\x83\x97\x4b\x5d\xbd\x76\x15\xdd\x76\x12\xdc\x1e\x7f\x91\xd5\x75\x00\xea\xac\xa0\x93\x9d\x95\x74\xb2\x93\xa2\x4e\x76\x55\xd6\xc9\x1e\x0a\x3b\xd9\x4d\x69\x27\xf7\x50\xe2\x75\xf5\xda\x59\x45\x25\x7b\xe8\xf1\xe4\x49\x14\x86\x5d\xbd\xf6\x02\xd6\x6e\x3a\x3d\x19\xca\xc9\x76\xb8\x76\x57\xb9\xc9\xee\x6a\x37\xd9\x1d\x33\x5a\x96\xa5\x5d\xbd\x86\x42\xb5\x7b\x71\xf6\x1d\x18\x57\xf7\x62\xb6\xeb\x3e\xde\x09\x4b\x7c\x9d\xa1\xfe\x85\x4d\x5d\x76\x36\x0c\x7b\x6d\x3a\x06\x03\xa1\x16\x01\x73\xf1\x51\x23\x80\x63\x70\x3f\x76\xca\x6f\x21\x82\xca\xad\xc1\x60\xbe\x82\x6e\x2d\xa4\xc9\x6e\xbc\x14\x4c\x81\x60\xc7\xbc\x89\x28\x6c\xae\x68\x9e\x9d\x60\x38\x48\xc9\xed\x44\x5c\x0f\x10\x29\xdf\x00\x19\x31\x65\x54\x28\x72\xe0\x6c\x4f\x87\xaa\x7c\xe2\x60\x52\x66\xf7\xf9\x11\x21\x09\x39\xcc\xe8\xdb\xdc\xd4\x7d\xd3\xce\x0e\x92\xf6\x20\x69\x0f\x92\xf6\x20\x69\x37\x5e\x83\xa4\xdd\xe1\x1a\x24\xed\x41\xd2\xde\xf4\xe1\x41\xd2\x1e\x24\xed\xed\x1f\xdf\x4d\xd2\xde\x35\x4e\x28\x94\x7b\xad\x73\x0e\x2b\x67\x41\x6b\x7e\x1f\x43\xe4\x0b\x94\xc2\xbf\xfa\x95\xb7\x43\x59\xba\x59\xda\x0e\x25\xf2\x15\xdd\x62\xb2\x45\xb4\xf6\xc2\xf7\xca\x9b\x9b\xa5\xee\xc7\x15\x0b\xb5\x03\x6e\x04\x0e\x85\x1d\x91\xe3\x83\x73\x85\xdb\x4a\x73\x53\x56\xfa\xc9\x63\x72\xe4\x3c\x2e\x50\x21\x5a\x48\x5d\xfd\x51\x68\x3e\x2e\x9f\xf0\x3e\x18\x70\x2f\x56\xf2\x6d\x92\x6a\x7f\x35\x51\xab\xad\x58\xee\xa7\x21\x21\x2c\xaf\xcc\x81\xbb\x46\x7a\x10\x2d\x91\x17\x42\x98\x51\xa1\x4a\x36\x78\xe3\x90\xe6\x60\x01\x38\xdf\xd9\xdf\x08\x4b\x30\x1f\x90\x98\x4a\x28\x05\xfe\x4e\x6a\xcb\x48\xdb\x50\x7e\x29\xac\x47\xd4\xdc\x71\x5e\x5f\x87\x94\xb0\x22\xee\xbf\x3e\x21\xaf\x00\x0f\xc3\x81\x6d\xc9\x69\x9a\x24\xf2\xb6\x0b\x49\xba\xaf\xb4\xa8\xdb\xce\x69\x51\x35\xff\xdd\x90\x15\xf5\x0b\xc9\x8a\x82\x1f\xf1\x08\xf5\x9e\x1e\x45\xbe\x5f\x30\xc0\xa2\x9c\x01\xa8\xd2\x22\xd1\x3c\x2b\x63\xa5\x14\x7e\x2a\x41\x29\x73\x66\x23\x4f\xaa\x78\x69\xbe\x46\xa3\x45\x1d\x3f\x61\x3c\x88\xad\x52\x70\x68\x6d\x74\x07\x4d\x12\x9b\x53\xe4\x44\x52\x0c\x61\xe1\x0f\x1d\x99\x70\xe6\xaa\x22\x3a\x6d\x06\x88\xcc\x91\xa1\x85\xc9\xd2\x56\xaa\xdb\x40\x44\x51\x29\xba\x61\x8e\xf5\xce\xf9\x0d\x13\x25\x25\x3d\x52\xc7\xc7\x8e\x87\xf7\x4a\xe1\xef\x84\x42\xff\x39\xa0\xa4\x7f\x69\x43\xa3\x61\x41\x9e\x4a\x97\xe0\x2b\x69\xf4\x43\x86\x60\x74\xf1\xf3\x77\xb3\x31\xec\xe0\xdf\xbf\x47\xdf\xfe\xd3\xc9\x2c\x7b\x60\x0b\xe3\x43\xc4\xd6\x3f\x7a\xab\xe2\x10\x5c\x5f\x5e\xfb\x06\xd7\xdf\xb9\xe5\xf0\x61\x63\xec\x9f\x80\xb5\xf0\x21\x63\xec\x07\x0b\xe1\xc6\x4d\x79\x6c\xa1\xef\xd5\x6b\x27\x8b\xe0\x60\x0d\xdc\x99\x0b\x77\x64\x38\xfb\x5a\x01\x3b\x62\xc4\x8e\x7e\xf6\xc1\xc7\x7e\x3f\x3e\xf6\x41\xe2\x6d\x79\x0d\x12\xef\x5a\xa0\x0c\x12\x2f\x19\x24\xde\x6d\xcb\x1b\x24\xde\x8d\xe0\x19\x24\xde\x8d\x9b\x32\x48\xbc\x83\xc4\x4b\x9e\x9a\xc4\xbb\x4b\x95\xae\xc1\xd7\xbd\x97\xaf\xbb\x2b\xb5\xe8\x44\x23\x3a\xe2\x41\x67\xdf\xf6\xe0\xd7\x7e\x2c\x7e\xed\xd6\x09\xff\x42\xf3\x7d\x93\xfe\xc3\xbd\x5a\x97\xf9\x4f\x6f\x24\x8f\x49\x56\x68\x9b\x4f\x3d\x64\xff\xf7\x91\xfd\x5f\x81\xfc\x50\x02\xa0\x55\x09\x80\x75\x30\x1b\xea\x00\x0c\x75\x00\x7a\x76\x42\x0f\x75\x00\x86\x3a\x00\x43\x1d\x00\x77\x0d\xd9\x49\x64\xc8\x4e\x6a\x75\x0d\xd9\x49\xeb\xaf\x21\x3b\xe9\xd1\x5a\x5f\xc9\x90\x9d\xf4\xb8\x2d\xb1\x64\xc8\x4e\x1a\xac\xb3\x2d\x37\xea\x09\x66\x27\x0d\x75\x00\x1e\x6b\x8c\x02\x19\x24\xed\x41\xd2\x1e\x24\xed\x41\xd2\xde\x7c\x0d\x92\x76\x87\x6b\x90\xb4\x07\x49\x7b\xd3\x87\x07\x49\x7b\x90\xb4\xb7\x7f\x7c\xa8\x03\xf0\x84\x62\x23\xc8\x50\x07\x60\x88\x97\x18\xea\x00\xfc\x72\xeb\x00\x54\x7c\xf7\x0f\x57\x0c\xa0\xfb\x34\x86\x8a\x00\x43\x45\x80\xa1\x22\xc0\x50\x11\xc0\x5d\x43\x45\x00\xbc\x1e\x93\xad\x71\xc8\x8f\x5a\x0b\x94\x21\x3f\x8a\x0c\xf9\x51\xdb\x96\xf7\x04\xec\x86\x43\x7e\xd4\x23\xb4\x15\x0e\xf9\x51\x83\x5d\xb0\xbe\x39\x4f\x24\x3f\x6a\xa8\x08\xf0\x18\xbd\xed\x83\xc4\xdb\xf2\x1a\x24\xde\xb5\x40\x19\x24\x5e\x32\x48\xbc\xdb\x96\x37\x48\xbc\x1b\xc1\x33\x48\xbc\x1b\x37\x65\x90\x78\x07\x89\x97\x3c\x35\x89\x77\xa8\x08\x30\x54\x04\x18\x2a\x02\x3c\x45\x0f\xf7\xd6\x9d\x66\xe2\x66\xdd\x9e\x56\x76\xf1\x95\xb8\xa9\xea\x29\x4c\xdc\xf0\x5c\x0a\xa0\xc0\x37\x34\xe7\x74\x9a\xc0\x49\x05\x89\xc7\xc2\xdf\xd2\x4f\x96\x4f\xc8\x4b\x2a\xac\xa3\x15\x3d\x99\x6b\xe7\xbf\x1d\xf1\xb7\xa0\x7a\x7d\xda\xdf\xd1\xaa\xa8\x26\x1a\xa7\x4e\xec\x03\x66\xea\x94\xbc\xf4\x13\x5f\xfb\x99\x56\x04\xbc\x8d\x7e\x30\x06\xe4\x5c\xfb\x40\x3b\x29\xde\x0c\xb1\xf9\x6c\x56\xc0\xf2\x8e\xa6\x65\x8a\x7f\x03\x34\x26\xe4\xad\x95\x90\x28\x79\xf9\xbf\xe7\x67\xaf\xde\x7d\x38\x7f\x7d\xfe\xea\x72\x33\xd2\xb5\x24\x2b\x70\x90\x3a\x4c\xf6\xf0\x3b\xb7\x47\x90\xe6\xcd\x84\xa1\xc0\xbf\x39\xfa\xee\xf4\xf2\x7f\xdf\x9d\xbe\x7d\x75\x0c\xec\x97\x7d\xca\xa8\x88\x59\x4c\x0a\xe5\x48\x42\x96\xb3\x1b\x2e\x0b\x95\x2c\xfd\xf1\x6e\x46\xda\x3a\xb6\x5a\x45\x73\x49\x14\xcb\x6f\x78\xd4\x0c\x22\x94\x62\x69\x89\x40\x91\xc7\xf0\x9c\x29\x99\xdc\xb0\x18\x65\x0d\x3f\x69\xf7\x1d\x2e\xb2\x42\x3b\x89\x18\x42\x10\xcc\xa9\x10\xd1\x82\x8a\x39\x8b\x27\xe4\x4c\x16\x66\xbc\xdf\xfc\x06\x16\x96\xb3\xb8\x88\x90\xd7\x51\x27\x30\xfd\x66\xe4\x28\x89\xa1\x05\x0a\xcb\x28\xa8\x88\x66\x6e\xe9\x21\x74\xd4\x52\x68\xfa\xe9\x05\xfa\xe0\x0f\x7e\x13\xfc\x74\xe0\x4a\x50\x48\xf3\x09\xa4\x47\x38\xab\x04\xaa\x1f\x24\xe4\x20\x7c\x7a\x42\x5e\x99\x6f\xb0\x38\xdc\x07\x0c\xa1\x60\x37\x2c\x07\x79\xda\xee\xc2\x88\xe4\x6c\x4e\xf3\x38\x61\x0a\x82\x07\x6e\x17\x0c\xca\x79\xa0\x84\x65\x01\xc6\xbc\xb4\x2e\xa4\x9e\x90\x33\x36\xa3\x45\xa2\x81\x86\x1c\x1c\x4c\x0e\x7b\x43\xb5\xd7\xb9\xdc\x92\xfc\x5e\x41\xb7\x2b\x2c\x2a\x31\x93\xf9\xda\xe3\x71\x68\x4d\x13\x15\xb2\xa6\x0c\x27\xb1\x9a\x9e\xa3\xd5\xa8\x5f\xb4\x58\x49\x0b\x41\xb0\xbd\x3a\x1f\x49\x31\xe3\xf3\xb7\x34\xfb\x86\x2d\x2f\xd9\xac\x63\x34\x04\x32\x51\xab\xd3\x02\x03\x33\xe4\x10\x07\xdc\xce\x74\xee\xd0\x97\xdf\xc6\x68\xd2\xcd\xe6\xd1\xda\xd2\xb1\x52\xd2\x02\x99\xbe\x65\xdf\x3d\x16\xe7\x29\xaf\xed\x14\xbd\x71\x72\x87\x21\x69\xb7\xe7\x54\x4f\xc8\x5b\x09\x21\x39\x33\xf9\x82\x2c\xb4\xce\xd4\x8b\x93\x93\xeb\x62\xca\x72\xc1\x34\x53\x13\x2e\x4f\x62\x19\xa9\x93\x48\x8a\x88\x65\x5a\x9d\xc8\x1b\x43\xf9\xd8\xed\xc9\xad\xcc\xaf\xb9\x98\x8f\x8d\xa4\x33\xc6\x5d\x55\x27\x20\x4c\x9d\xfc\x1a\x25\xf6\x0f\xef\xcf\xde\xbf\x20\xa7\x71\x6c\x2b\xf6\x14\x8a\xcd\x8a\xc4\x56\xef\x98\x10\x9a\xf1\xef\x58\x6e\x94\xb2\x11\xb9\xe6\x22\x1e\x91\x82\xc7\x7f\xdd\x7c\xb8\x77\x84\x98\xcc\x50\x37\xda\x01\x6a\x57\x20\x28\x2e\x2b\x74\xca\x23\xbd\xa1\x50\x5c\x2b\xd8\x73\x67\x38\xb0\x0c\xa5\xc3\x32\xa6\x52\x26\x8c\x8a\x2d\x6f\x00\xd8\xba\x9f\xd9\xc3\xf2\xd0\xa2\x96\x63\x11\x20\x93\xf1\x0b\xa2\x8a\x2c\x93\xb9\x56\x24\x65\x9a\xc6\x54\xd3\x89\xd9\xb9\x51\xf5\x4f\x10\x8e\x47\xe4\x27\x7f\x13\x24\x5c\xf5\xc3\xe1\xe1\x9f\xbf\x79\xf5\xdf\x7f\x39\x3c\xfc\xf1\xa7\xf0\x57\x20\x7b\x68\xea\xaa\x3e\x62\x44\xee\x89\x11\x77\xdf\xc1\x37\xe0\x4f\xcb\x46\x4f\xa3\x48\x16\x42\xdb\x1f\x34\xd5\x85\x9a\x2c\xa4\xd2\xe7\x17\xfe\xcf\x4c\xc6\xf5\xbf\xd4\x16\x4e\x40\xee\x96\xe8\x00\x38\x2f\xa8\x5e\xf4\x4c\x7a\xca\x73\xb1\x03\xba\xda\x37\xc3\x0a\x49\x29\x85\x7f\xbe\x76\xd3\x35\x1c\xe8\x36\xe7\x5a\x33\x01\x72\x07\xc4\xdd\xc9\xd9\xc8\x60\x6e\xc9\x66\x6f\x9e\x77\x52\x47\x5b\x1f\x45\x0f\xb5\x1d\x16\x07\xb3\xb7\x2b\x43\x64\xf6\x84\x76\x55\xaf\x3b\xbd\x38\x27\x37\x08\x8d\xde\x17\xe2\xa2\xb0\x5e\xef\x7d\x26\x7d\xa5\x2a\xbb\x2c\x2f\x69\xbe\x40\xcb\x92\x8f\xf7\x22\x09\x4f\xb9\x35\x00\xdb\xaa\x56\x8a\x1c\xe1\xcd\x49\x94\x15\x23\xfb\xc0\x24\x65\xa9\xcc\x97\xfe\x4f\x96\x2d\x58\x6a\x24\xb6\xb1\xd2\x32\xa7\x73\x36\xf2\xaf\xe3\x6b\xfe\x2f\x7c\xb1\xf2\x81\xd5\xb7\x51\xa4\x8e\x8a\xdc\x30\x8f\x64\xe9\x28\x08\x8b\x1f\xf6\x2c\x3a\x30\xf5\x7c\x14\xfd\x6e\xbc\xdb\x91\xe5\x7a\x6d\x11\x99\xb6\x5f\x15\xc8\x90\x37\x32\x29\x52\xa6\x46\x9e\x3d\xa1\xb4\x2e\x6e\x8c\x34\xa9\xee\x84\x11\xc6\xfc\x86\xab\x9d\xfc\xd3\x57\xde\x52\x07\x26\xb2\x42\x1b\x4d\x05\x83\xc1\x83\x8a\x70\x52\x81\x0e\xe0\x63\x14\x2b\x24\xe5\xf9\x41\x3b\xef\x2b\xd5\x9a\xe5\xe2\x05\xf9\x9f\xa3\x8f\xbf\xfd\xe7\xf8\xf8\xaf\x47\x47\x3f\x3c\x1b\xff\xfb\x8f\xbf\x3d\xfa\x38\x81\x7f\x7c\x71\xfc\xd7\xe3\x7f\xba\x3f\x7e\x7b\x7c\x7c\x74\xf4\xc3\x37\x6f\xbf\xfe\x70\xf1\xea\x47\x7e\xfc\xcf\x1f\x44\x91\x5e\xe3\x5f\xff\x3c\xfa\x81\xbd\xfa\xb1\xe5\x20\xc7\xc7\x7f\xfd\x4d\xab\xe9\x51\xb1\x7c\xdf\xe2\xc0\xe3\x35\xde\x21\xc2\xbe\x7c\xab\x83\x81\xfe\xd3\xb8\x14\xda\xc6\x5c\xe8\xb1\xcc\xc7\xf8\xfa\x0b\xa2\xf3\x62\xfb\xc1\x28\x89\xda\x2e\x78\xee\xca\x81\xbd\x28\x09\x9a\x27\xcd\xbd\x23\xb2\x62\x51\xce\x74\x5f\x1a\x0c\x8e\xe6\xf8\x47\xcd\x24\x3b\x28\x35\xa5\x52\xe3\xed\x92\x00\xaf\x92\xf3\xce\x72\x99\x4e\x48\x60\x16\xba\x01\x4f\xa6\x7d\xee\x9a\x6d\xd1\x72\xdd\x35\x28\x41\x4f\x4b\x09\xba\xc2\xfd\xbd\x73\x0d\x88\x89\x9b\x4d\x66\x9a\xba\x4d\xf7\x35\xa4\xb2\x84\xe6\x68\x27\x40\x69\x49\x32\x99\x15\x09\xd5\x6b\xcc\x76\x0d\xb6\x69\x8b\xfb\xa5\x17\xc0\x6c\x34\xd8\x81\x2d\x95\x4b\x9b\x8d\xa1\xe4\x34\x49\x08\x17\x78\x12\x60\x00\x67\xcd\xcb\x19\xca\x4b\x84\xa2\xc1\xf9\xc6\x4c\xe1\xd6\x26\xdc\x04\x86\x46\xae\x8c\xae\x93\x6b\xb0\xf8\x43\x42\x0e\xd2\x2c\x6b\x1a\xe3\xa2\x4c\xcb\xf1\xdc\xd6\x7b\x29\x1b\xeb\x2f\x26\x54\x69\x37\x6d\x98\x8d\xa6\xd7\x60\x0a\x8d\x58\xcc\x44\xc4\x20\x04\xa1\x60\xe5\x5a\xa7\x46\x18\x04\xf3\x3e\x8c\x41\x49\x5c\x64\x09\x8f\x0c\xfc\xcc\x4c\x9a\xc7\x38\x4f\xd3\x42\x83\xa1\xf8\xbe\xac\xf8\x66\xc7\xaf\x5c\xb9\x57\x6f\xcc\x07\x52\xe5\x45\x6b\x1f\x6d\xe1\x55\x77\xb5\x9f\xf9\xbe\x1d\xe1\xf5\xe6\xb6\xad\x9c\x6a\x85\xe2\x96\x36\x86\x2a\xa5\xbd\x6f\x8b\x61\x3b\x3a\xfb\x59\xd2\xd8\x0e\xf4\xb5\x3d\x6d\xed\x60\x5c\xea\x4a\x4f\xdb\x5a\x93\xb2\x9c\xcd\xf8\xa7\x0e\xf8\x78\x2a\x4a\x15\x85\xc7\x4c\x68\xa3\x08\x40\x65\xea\x2c\x67\x19\x13\xb1\x4f\xf7\x83\x00\x2f\x51\x5d\xc7\x9d\x7a\x8c\x50\xca\xe8\x7e\xbc\xae\x9a\xa4\x98\xe1\x6c\x7d\xe6\x67\xcb\xee\x7a\xff\x07\x4b\xc8\x78\x6b\xf0\x77\x6d\x1f\x83\x37\x6a\x91\xae\xb6\xfc\xb7\x9d\xa4\xd1\xde\xbc\xcb\x29\x93\x31\xd6\xb8\xd6\x65\x10\xc2\x84\x5c\x35\xbc\x09\xb1\x06\xf6\x89\xc3\x43\x85\x61\x09\xaa\x3e\x50\x2d\xbb\x19\x23\x13\x70\xd0\x8e\x28\x85\xac\xae\xc8\xc1\xf2\x7b\x42\x95\xe2\x73\x31\xce\x64\x0c\x75\xb9\x4f\xd6\x21\x44\x8b\x43\xd5\x2d\xb2\x69\x2b\x5e\x79\xe3\x44\xbb\x6d\xba\xf4\xf6\xb7\x40\xb6\x70\x15\xe1\xf3\xe0\x47\x6b\xd7\x71\x71\xf4\x81\x0c\x59\x4a\x44\xfb\xc1\x34\xa5\x82\xce\xd9\xd8\x7e\x7c\xec\x3f\x3e\xf6\xdf\xda\x07\xcc\x6d\xa8\x56\x94\x50\xbe\x39\x94\xa8\x02\xbc\x83\x97\xf0\xbc\x4d\x14\xf7\x11\x58\xb5\x34\x56\x27\x6d\x72\x81\x2e\x01\xf7\x13\xbe\x3c\x42\x94\xa4\xb9\x75\xa3\x36\xc0\xf7\xa3\xc0\x40\x22\x1b\x57\x9a\x64\x0b\x1a\x04\x74\xd9\x9d\x51\x84\x09\x3a\x4d\x9c\x17\xfc\x6c\x29\x68\xca\x23\xb7\xbb\xa7\x09\x04\xfc\x70\x29\xc8\x8c\x51\x5d\xe4\x8c\xcc\xa9\x66\xe5\xd8\x3e\x52\x90\xfb\xcd\xdc\x64\xcc\x6a\x17\xa2\xd5\x22\x30\xab\x56\x73\x3d\x80\x4c\xe8\x69\x97\xc2\x68\x34\x3a\x07\xde\x7b\x21\x63\x43\xfa\x26\x95\xa7\xb7\x44\xbc\xb7\xe6\x6d\x6d\x2d\x18\x5b\x22\x57\xc8\x5d\xb3\x49\xe0\x92\x01\x1d\x74\xc8\x67\x70\xaf\x02\xad\x4c\xc6\x93\x06\xb4\x73\x1c\xf6\x42\xc6\x36\x28\x4c\x57\xd0\xc0\xe0\xe2\x84\x9c\x9b\xe1\xaf\x5d\x40\x97\xb7\x7c\xd1\x1b\xca\x13\x88\x63\xe0\x42\xf1\xd8\xc8\x3d\xd1\xf6\xa8\x21\x77\xb5\xe4\x8c\x15\x83\x9f\x39\x61\xe3\x94\x66\x63\xa3\x6a\x6e\x06\xd5\xd6\x9d\x59\x1d\x18\x67\x94\xd2\x6c\xed\x5b\xe8\x6b\x68\x4d\x18\x0e\xdf\xa0\x2f\x23\xf6\x7d\x63\x30\xb0\xf7\x13\x4f\x8b\x94\xd0\x54\x16\x18\xbb\xbb\x4a\x67\x5d\x84\x5b\x2f\x94\xb4\x81\x82\xaa\xb5\x24\x94\xb4\x3f\x26\xdd\x63\x71\x1f\xa9\xc9\xbb\x95\xa9\xbb\x9b\x89\xbb\x83\x69\x7b\x67\x93\xb6\xf3\x5e\xb5\xc7\xc7\x4b\xe7\x50\xab\x61\x24\x17\x5b\x31\x32\xf7\x8d\x30\xce\x67\xc4\x8f\xc3\x15\x91\x29\xd7\xda\x7a\x7a\x02\x02\x30\x22\x5c\x57\xdc\x22\xf6\x2c\x40\x23\x18\xec\x9d\xc3\x3e\x65\x09\x8f\x38\xb8\xd7\x9c\x3b\x73\x84\xe2\xf7\x2d\xc7\xb2\x31\x54\x10\x9e\x66\x18\xe5\x0e\x38\x3d\x76\x6c\xd4\x46\x1f\x0d\xe7\x63\x38\x1f\x4d\x2f\xa9\x2e\x4a\x4a\xa8\x9f\x94\xa1\xcd\x5e\x4f\x31\x98\xed\x3a\x52\x41\xe8\x36\xe2\x90\x39\x0b\x90\x5d\x63\x84\xad\x4b\x06\x26\xc3\x2b\xa6\x95\x0d\x96\x86\x37\x8c\x3c\xb7\x92\x7b\xea\x4c\xa4\x3e\x06\x9f\xce\x66\xd5\x27\x62\x96\x25\x72\x99\x82\xca\x7b\xae\xeb\x0c\x1e\x74\x1a\x96\x66\x09\xd5\xcc\x6b\x3c\x9b\xcd\x90\x7b\x8b\xc4\x5d\x12\x3f\x1f\x36\xd5\xf3\x6e\x64\xd2\x47\x99\xc0\x79\x07\xe2\xec\x76\x67\x5c\xcb\x44\xcc\xf6\x62\x6f\x2b\x6f\xdd\x5d\xa7\x57\x76\xb2\xd3\xb4\x4d\xa1\x7c\xfc\x49\x93\x1d\x96\xdd\x36\x31\x72\x48\x85\xdc\x04\xea\x76\xe9\x4c\xad\x53\x99\x5a\xed\x5f\xcb\x94\xc6\x21\x89\xb1\x03\x7f\xb9\x03\xe1\x6f\xeb\x5e\x6a\x99\x30\x94\x5c\xdb\x19\xf5\x3e\x94\xcf\xfb\xc6\x88\x18\xf7\x11\x8c\x74\x3f\xee\xcb\x0f\x4e\x6c\x31\x67\xab\x9c\x17\xa0\x96\xd6\x14\xba\x20\x6a\xe9\xe6\x65\x36\x4e\x2c\x89\xd9\x33\x6d\x5b\x62\x06\x3d\x22\x75\x0e\xde\xe0\x3f\x7b\x6c\x1b\x31\x90\x9f\xfe\x12\x24\xbe\xf8\xc4\x38\x8f\x21\x7f\x76\xff\xfa\xcb\x9e\x09\x4d\xed\x18\x1b\x4e\xa9\x83\x80\xf1\x0a\x5e\x20\x5c\xc4\xe0\x79\xb6\x4b\x05\x08\xe0\x58\x06\x3e\xb0\x2c\x97\x18\x87\x19\x96\xd6\xfe\x0d\x2e\xea\xf2\x61\x65\x7d\xe9\x81\x5e\x65\x4d\x0a\xe5\xc9\x60\xe4\x9d\xb4\xd5\x4a\xd9\x88\x5c\x80\x9d\xad\xbc\x03\x27\xe9\x9d\xc4\xba\xa5\x6b\x9d\xdc\x21\xdc\xb6\x72\x91\xad\x8c\xbe\x02\x90\x6f\x4a\x26\x8f\x2b\xab\x30\xf9\x12\x83\x2b\x29\xb2\x9b\x20\x73\xcd\x96\x25\xb3\xb1\x22\x04\x90\xfc\x51\x89\x25\x8e\x15\x20\xef\xf8\x3f\xce\x06\x9b\x4e\xb9\xc0\x8f\xe1\xd0\x6e\x2b\x60\x74\x07\x50\x23\xd9\x25\x09\x7e\xa6\x0f\x70\xb5\x93\x33\x2a\x30\x7b\xdf\x41\xc6\xf0\x54\xb2\x59\xba\x08\x44\x8a\x57\x3f\x17\x34\xa9\x66\x27\xd9\x5b\xf6\xa1\x15\xaa\x7e\xcb\x93\x38\xa2\xb9\x0d\xff\x84\x33\x4a\x94\xb4\x26\x6e\x20\x04\x11\x15\xfe\xb4\x97\x7b\x84\x0d\x52\x49\x46\x73\xcd\xa3\x22\xa1\x39\x31\x67\x61\x2e\xf3\x56\x19\x44\x5b\x21\x5a\x22\xcd\x15\x8b\xa4\x88\xbb\x28\x00\x1f\xea\xef\xd6\x83\x30\x32\x96\x73\x5b\x07\x94\xa7\xac\x8e\xa4\x47\x55\x67\x97\x9c\xb9\x53\xed\x8f\x58\xc5\xf2\x51\xb5\xc5\x63\x21\xe1\xe3\x80\x3c\xfa\x53\x31\x21\x5f\x2d\x9d\x99\x05\x4c\x2e\x36\xed\x4a\x31\xed\x32\xe4\x1c\xca\x5a\x60\x97\x07\x6a\x26\x73\xc8\x5a\x3b\x8a\x25\xa6\x6a\xdd\xf0\x48\x1f\x4f\xc8\xff\x63\xb9\xc4\xd4\x6e\x36\xc7\xb2\xae\x16\xc5\xbd\xe2\x0a\x1d\x8d\x21\xb4\xe7\x19\x39\xc2\x12\xbb\x3c\x4d\x59\xcc\xa9\x66\xc9\xf2\x18\xf5\x58\x57\xa4\xb7\xcd\xd6\xb5\x31\x1a\x04\x15\x99\xff\xf0\xfb\x0d\x4f\x76\x4d\xae\xfc\xce\xa5\xab\x95\x90\xc1\xe0\xa2\xda\x16\x7a\x1e\x24\x37\x88\x9b\x61\x70\x52\x99\xed\xed\xc8\x8c\xdf\xe0\xbf\x19\x3c\xa0\x24\x67\x73\xc0\x72\xc4\xdc\x3d\x71\x1c\xc3\xac\xdf\xca\x42\xac\x37\x09\x56\x16\xfe\xc6\x2a\xe1\xdf\x05\x2f\xae\x4d\x5f\xbe\x17\x31\x21\x98\x49\x60\xa2\xa4\x04\xec\x92\xc0\xce\x0d\x79\xc0\xa7\xca\x10\xb5\x16\x4e\x87\x1e\x53\x95\x61\x2e\x5b\xd2\x61\x7a\x49\x68\xf6\x1f\xea\x80\xcb\x90\x39\x62\x01\x53\x4b\xe8\xd5\x96\x1c\x00\x7e\x22\x04\x4b\x04\x85\x6f\xb1\xd8\x85\xb7\x62\x11\x02\x78\x95\x1c\xbe\x38\xec\x85\xf8\xe2\x72\x72\x99\xd1\x39\xdd\x5e\x08\xbd\xaa\x8c\xd4\x5e\x25\x31\xd3\x2c\x4f\xa1\x62\xf5\x42\xde\xe2\xef\xc8\xb6\x32\xfb\x14\xb3\xc5\xbe\xcd\x6a\x17\x52\x01\x57\xaa\x66\x37\xc3\xf9\x85\x88\x89\x5b\xba\x24\x34\x97\x85\x88\xad\xd4\xe4\x09\xe8\xdb\xda\x87\xdf\x49\xc1\x4a\xb7\x58\xd5\x63\x3a\x65\x9a\x9a\x63\xf3\x7c\xf2\x7c\x4b\x51\xfa\x96\x00\xeb\x98\xd0\x0e\xb3\xa9\x59\x0a\x5d\x10\x8d\x3b\x33\xbd\xcc\x2b\x67\x34\x7e\x2f\x92\x2e\xb2\xdc\x5b\x44\x2f\x78\x75\x0c\x4a\x18\x9f\x81\xed\x76\x84\xb7\x6e\x73\xae\x59\x40\x1e\x8f\x66\x34\x51\xd0\x89\xbf\x10\x5e\x84\x3d\xae\x8a\x20\xf0\x48\x9b\x05\x6d\x0f\x14\x53\xc5\x74\xcf\x73\x66\x0f\x14\xa0\x5c\x79\xcc\x3c\xc2\x1d\xaa\x0d\x47\xae\x9a\xf5\x4d\x8e\xf0\x49\x23\xb1\x49\xa9\x8f\xfb\x89\x1e\xc3\x05\x1a\xcd\xba\x8b\x4a\xe2\x0a\x0a\x64\x3d\xae\xf6\x2b\xb6\xa0\x37\x4c\x11\xc5\x53\x9e\xd0\x3c\x81\x24\xe2\x2b\x9c\x1f\x99\x16\xba\xb9\x34\x45\xb7\xb2\x07\xe1\x4c\x82\xe1\xb6\x82\xda\xcd\xc3\xc0\x09\x68\x84\x9b\x17\x76\x07\x70\x2d\x05\x3e\x45\x49\xa1\xf8\xcd\xbe\xa7\xc9\xa6\x45\xed\xc0\xaa\xeb\x5c\x3a\xb3\xa1\x10\xf7\xc8\xa3\xab\x1a\x86\x21\x55\xb1\xdb\x74\xe0\xc9\xa8\xec\x83\xe6\xbe\x84\x90\xc8\x28\x62\x4a\xb9\x60\xeb\x65\x18\x00\xee\xd7\xf0\x54\x2a\x8d\xd0\x5b\xf5\x2a\xa1\x4a\xf3\xe8\xab\x44\x46\xd7\x57\x5a\xe6\x9d\x8a\x79\x34\xbd\x5f\xab\xcf\x72\xfa\xfd\x15\x39\xe3\xea\x3a\x48\x33\xb2\x4e\xd3\xd0\x5c\x42\xc9\x75\x31\x65\x09\xd3\x87\x87\x0a\xb9\x5c\x4a\xa3\x05\x17\xcc\x31\x38\xe1\x73\xd5\xac\xc2\x67\xa0\xdc\xd5\x67\x6a\x33\x22\x4f\x2c\xbe\xfe\x9a\xde\x2a\x86\xd3\x9f\x9a\xe9\x9b\x9f\x59\x9b\x52\x15\xbd\xfa\x29\x70\x32\xe7\x67\x3d\xf9\x20\x66\xea\x83\x99\x63\x37\xe3\xf6\x21\xbe\xe5\x54\x87\x19\x4f\x98\x6d\x4b\x62\x16\xec\x42\x6b\xec\xa9\x80\xfd\x5b\xca\x82\xdc\x52\xd4\x91\x81\x22\x4e\xc8\x07\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\x26\xa0\x3a\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa2\x69\x96\x30\xf5\x82\x1c\xb0\x4f\xfa\xf7\x07\x23\x72\xf0\x69\xa6\xcc\xff\x84\x9e\xa9\x83\x09\x39\x4f\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x22\x24\xf1\x05\xc3\x9a\x03\xae\x7b\x27\xe8\x62\xa3\x6d\x8d\xec\x16\x4b\x72\x8b\x85\x6a\x0c\xc1\x67\x79\x2e\x73\x9f\xa0\x12\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x86\xe1\x82\xf1\xa1\x4d\xa7\x9e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\x38\x9f\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\xcf\xb4\x25\x27\x31\xbb\x39\x51\x31\x7d\x3e\x82\xcf\x28\x1b\x21\x5c\x9d\x13\x55\xe4\xe0\xf9\xc1\x84\x5c\x39\x46\x3c\x0a\xe7\x58\x3e\x37\x93\xb9\x1f\x10\xec\xec\xcf\x0e\xc8\x91\xcc\x61\xe4\x88\x0a\x92\x30\x7a\x63\x6d\xcb\x78\xdc\x96\xa8\xee\x1e\xb7\xce\x94\x6e\x9b\x34\xda\xbe\x25\x53\x5b\x21\x75\x75\x13\xdd\x7b\xce\x04\x90\x17\x36\x89\x68\x26\x73\x5b\x20\xc8\x3f\xa2\x98\x86\xa3\xc7\x45\x45\x85\x7e\x00\x02\x4b\x3a\xd6\xd8\x70\xd4\xb3\x2b\x74\xdc\x7b\xa0\x03\x09\xfe\x73\xc1\xc8\xf9\x99\xaf\xb4\xc1\x72\xc5\x95\x36\xc7\x38\xae\xb0\x2e\x8e\xfc\xec\xe8\x34\xa5\x7f\x97\x82\xbc\xfa\xea\xca\x4e\xe0\xf8\x41\x41\xb5\x95\x1a\xd0\xbf\x17\x39\x33\x5c\xb8\x03\x73\xf7\xef\xd4\x19\xba\xb9\x4f\xce\xa8\xa6\xc8\xd7\x6d\xa4\x95\x28\x49\xb9\x61\xd9\x53\x2e\x62\xfb\x53\xc0\xb0\xef\x9b\xb7\x9a\xdd\x7b\xb7\x2d\xac\xd5\x3d\xf8\xed\xe5\x79\x4f\x3c\x38\x02\x62\x3e\x7f\x2b\xe3\xce\x8c\x38\x78\xd5\x11\xdf\xff\x34\x30\x7d\x89\xf7\x49\x6a\xc6\x24\x46\x7b\x1f\x91\x4b\x46\x63\x62\xce\xaf\xfd\xe7\xf7\x46\xf7\x6c\x4d\xab\x5a\xb1\x10\x07\xc0\x8e\xcb\x70\xaf\xb9\x25\x84\x29\x30\xb1\xc1\x1c\x38\x56\x96\x97\x4c\x13\x39\x25\xf6\x38\xf4\x3d\xf7\x6f\x2f\xcf\x77\x98\xfa\xb7\x97\xe7\x6e\xe6\xe6\x9f\x72\x76\x7f\x93\xde\x49\x7c\x2b\xa5\xb7\xd7\x35\x71\xab\x64\xc9\x65\x46\x57\x5d\x24\x6b\x2f\x8f\x4d\xfa\x92\xc4\xfa\x84\xd8\x35\x17\x2d\xd2\xf3\xab\xa7\xcc\xbc\x63\x14\x0a\x8c\x55\x0b\xfc\x88\x57\x0b\x0a\x35\x11\x7c\xa6\x2e\xec\xb3\xd9\x78\x65\xb8\x82\xdb\x71\xa3\x04\x02\x6d\x23\x67\x0c\xbd\x9c\xf1\x0b\x17\x3b\xe0\xdf\x68\x7e\xe1\x2d\x44\x6a\xc6\x96\xbe\x12\x0c\xdc\x8c\x03\x04\x3b\x42\xab\x92\xf0\x3f\xd9\xe0\x74\x9e\x70\xe8\xb1\x60\xb4\xfb\x30\x1a\x55\xc1\x94\x7b\x3d\xf5\x3b\x8a\x1c\x5e\x9c\x58\x31\x6e\x91\x23\xf3\xdb\x09\x18\xc7\x8e\x27\x40\xad\xe0\x41\x88\xd3\xaf\x09\x25\x97\xdb\x84\x92\xde\xe4\x07\xd8\x01\x73\x62\xba\x72\x45\xf3\x4e\x23\x57\x84\x1f\xae\x6c\xa1\xc9\xc7\xcc\x18\x31\x09\xb3\x15\x6b\x04\xfc\xda\xfa\x64\x7b\xe6\xb8\x2f\x72\xc5\x4f\x03\xb9\x88\x4f\x75\xdd\x81\x7f\x96\x2f\x3a\x3e\xe4\x73\x61\x5c\x31\x8f\x4a\x68\x26\x62\xdf\x95\xa5\x35\xb6\x36\x1b\x72\x5d\x83\x73\x6d\x1a\x26\x76\xa9\xe6\xe2\x30\xa2\xeb\xaa\xdc\x7b\x6e\x51\x48\x02\xe1\x36\x69\x81\x8b\xad\x27\x19\xb1\x6c\x31\xeb\xe2\x12\x37\x2f\xbc\xbe\xaa\x5a\x02\x5f\xb2\x6c\x41\x5e\x5f\x35\x1c\x63\x80\x3d\xcc\x5a\xa1\x7d\xf0\x50\x91\x84\xcf\x98\xe6\x5b\x96\x70\x07\x07\x39\x95\x82\x6b\x99\xaf\xaf\x8d\x40\x3a\x1d\x4e\x37\x5c\x57\x86\xea\xde\x33\x3b\x5b\x56\x16\x7a\x1b\xdc\xa5\x24\x92\x49\xc2\x22\x6d\x6b\xdd\x01\x78\xfd\x6b\x0d\xca\x13\xb3\xf6\x80\xc9\xf5\x9f\x40\x7d\xb2\x8a\xd2\x09\x6e\xee\xc9\xe5\xab\xd3\xb3\xb7\xaf\x26\x69\xfc\xeb\x85\xbc\x1d\x6b\x39\x2e\x14\x1b\xf3\x16\xa5\x8b\x1e\x2e\x7a\x11\xaf\xac\x55\x25\xbd\xba\x41\x06\x8b\x00\xbe\x77\x89\xd5\xe4\x5b\x85\x51\x0b\x60\x3b\x72\x3e\x29\x29\xf5\x88\xe4\xd4\x26\x4f\x53\x6b\x7a\x2a\x92\x04\xa1\xad\x73\xc6\x46\xa1\x2d\x66\x63\x6a\x48\xe7\x85\xed\x6d\xa8\xa8\x2c\xf0\x6e\x65\x88\xfb\x47\xb8\x2e\x1c\x63\xbb\x4c\xb2\x0a\xc5\xf2\xcd\x2a\x1c\xaf\x2a\xf7\xd1\x70\xa6\x17\x06\xaa\xd7\x6c\x49\x20\x10\x78\x26\x73\x83\x4f\x79\x15\x37\x98\x8e\x60\xe9\x27\x85\x62\xf9\xc4\xb2\x9d\x7b\x07\x5b\x87\xf2\x62\x3b\x54\x75\xf4\x2f\x36\xc1\xcc\xde\x2e\x4b\x7e\x5b\x79\x8d\x16\x7a\xc1\x84\xe6\x36\xfd\xd8\x42\xa6\x11\x88\x36\x0e\xfb\xde\xa1\xd6\xb2\xba\x59\xb7\x5a\x64\x43\xfd\xae\x2e\x38\x69\x4e\x4d\x57\x74\x34\xef\x40\x22\x62\x48\xe6\x7d\x2e\x57\x4e\x63\x09\x01\x1b\x58\x9a\xb2\x82\x68\x34\x4e\xb9\x78\x84\xa7\x33\xe2\x22\xde\x06\x87\x9a\x01\x0c\xde\xa8\x8a\x62\xf6\x9e\x35\xe8\x7b\xbf\x21\x75\x9a\x14\x56\xc2\xb0\x1e\xc4\xaa\xff\xb0\xd5\xe1\x4b\x97\xea\xe7\x64\x8c\x5f\x19\x67\x71\x09\x95\xc1\x19\xb8\xea\xc1\xeb\xd7\xa4\x74\x0f\x2e\xbe\x9e\x76\x9b\xdc\xb3\x34\x74\xb7\x7a\xee\xbd\x00\xaa\x8b\xcc\xb3\x2f\xf7\x2e\x69\x66\x26\xb9\x0d\xff\xf4\xa5\x42\xf1\x8c\x3a\x7d\xd9\xc0\x23\xa3\x39\x4d\x99\x66\x39\x86\xc0\xd9\xa0\x3a\x61\xb3\x13\xde\x67\x4c\x5c\x69\x1a\x5d\xf7\x5d\x23\x79\xe0\xb8\x77\xc7\x71\xf7\x76\x05\x3a\x44\xb0\x05\xd3\x96\xa1\x17\x99\x0b\xcb\x85\x1e\x09\x89\xf1\x75\x0a\xbb\x58\x39\x7c\x9d\xba\x2a\x77\x2d\xeb\x16\xa2\x61\x03\x22\xdd\x7c\xe1\x4d\x88\xe0\x47\x28\xf4\xc3\x0d\xdb\x9f\x01\x4b\x02\x77\xf1\xa3\x05\xaf\x56\xa9\x43\x6a\xee\x4c\xb9\x2e\xcf\xbd\x62\x9a\x64\x2c\x4f\xb9\x4d\xeb\x96\x82\x44\x36\x2d\x00\xf8\x9a\xe1\x61\x76\xb8\x80\xe7\x09\x22\x23\x4d\x6d\xce\x0c\x99\x32\x7d\xcb\x98\x20\xcf\x9e\x3d\x7b\x06\x72\xc9\xb3\x3f\xfe\xf1\x8f\x04\xea\x48\xc4\x2c\xe2\xe9\xea\x83\xf0\xd4\xbf\x3d\x7f\x3e\x21\xff\x7d\xfa\xf6\x0d\x44\x95\x65\x5a\x91\xa9\xd4\x0b\x3b\xb2\x79\xa0\xf2\xb2\x1a\x91\xff\xba\x7a\xff\xae\x2c\x90\x54\xfd\x15\x54\x10\xbf\xbc\x6a\x88\xe0\xb3\x3f\xfc\xfe\xf7\x13\x72\xc6\x73\xc8\x27\xe6\x90\x01\xe1\x83\x20\x33\x17\x18\x08\x1d\xc9\xea\x19\xfc\x96\x83\xd8\x20\xe1\x94\xcf\x17\x00\x00\x73\x20\xa4\x98\x25\x3c\xd2\x58\x6c\x14\x8f\x3e\x02\xda\xd6\xd7\xa1\x36\xdd\xcb\x4a\x11\x30\xb9\x11\x49\xf8\x35\x23\x33\xf5\x75\x2e\x8b\xac\x4c\x73\xcc\x99\x32\xb2\x6c\x44\x05\x64\x95\xc0\x60\xe5\x5e\x29\xa6\x1f\x34\x08\xa3\xa5\x21\xa8\x82\x83\xf0\x4e\x4d\x40\x19\xf9\xa2\x8b\x63\xc4\x87\x8c\x72\x1f\x38\x08\x3e\xf5\x4a\xcb\x0f\xaf\x7b\xc6\x41\x91\x49\x97\xbb\x92\xe5\xf2\x6f\xb8\x55\x5c\xb8\x2c\x28\x2b\x21\x2b\x2b\x93\xd9\xa4\x53\x11\xd8\x5c\x5d\x56\xbe\xe1\x85\x36\xe3\x3f\xc8\x9f\x3a\x9f\x85\x89\x76\x90\x96\x8e\x7d\x17\x2b\x15\x71\x1b\xbe\x5c\x76\x71\x30\xd8\xa4\x70\x5f\x0b\xb1\xf2\xb6\x6d\xb0\x64\xc9\x8f\x6d\xbb\x65\x53\xd8\xca\x31\x30\x14\xd7\x26\x00\x05\xcd\xdc\x2a\x55\x2a\x2b\x51\x3e\x8a\xe9\xc2\x82\x06\x22\xaf\xcc\xb7\x99\x52\x36\x8f\x28\xa5\xf9\xb5\x51\x12\x2c\x15\x98\x40\xd4\xb3\xf2\x39\x4c\x98\x50\x76\x83\xc6\xf2\x94\x2e\x2b\x59\x03\xe6\x23\x87\x93\xc9\x21\x1e\x13\x99\x63\x91\x5f\xc4\x79\x73\xff\x81\xf2\xa5\xab\x51\xe9\x34\xc3\x7e\x9c\x60\xcf\xb1\xfd\x8c\x68\x25\xda\x99\x5a\x48\xb5\x29\xed\xdd\xb1\x9f\x69\xb7\xc6\xd9\xed\x1b\x66\x8f\x61\x01\x2d\x1e\xed\xda\x1c\xbb\x43\x53\xec\x75\xd5\x1a\x2c\x8c\xed\x49\x68\xdb\x2a\xb6\x73\x93\x80\xb4\x15\xeb\x6b\x98\xea\x61\x6a\x39\xdf\xfb\x6e\x9c\xcf\xe6\xeb\x55\xba\x06\x3e\x7e\x56\x77\x3e\xc3\x4c\x97\x2a\xe9\xb2\xa4\x21\x14\x05\x7c\x87\xbe\x32\xed\xe5\x51\x73\xb4\x10\x6d\xba\x75\xa4\xe8\xc2\xdd\xf0\x6a\xe7\x98\xc0\xab\x82\x6b\xce\x3b\x81\x8b\xb6\xa4\x34\xab\x74\xfe\x49\xd0\x6e\x00\x32\xa6\x3b\x3c\x13\xf2\xd6\x92\x5a\x44\x32\x3a\x55\x32\x29\x34\xbe\x5a\xfe\x18\xd2\x61\x18\xd4\x55\x59\x00\xe2\xeb\x1f\x0b\xa8\xb2\x2e\x7b\x1f\xb6\x23\xd0\x78\x75\x38\x9c\x43\x19\xe0\x3b\x2c\x03\xec\x0b\x57\xab\x96\x8d\xdc\xd4\x9d\xd5\xdd\x8e\x14\xef\xa2\x5f\x29\x4e\x8e\xca\xfe\x41\xce\x1d\x7f\x2e\x34\xcb\x67\x34\x62\xc7\xa1\xde\xe5\xfb\x34\xf9\x10\x21\x97\x17\xb1\xa0\x22\x4e\x50\x00\x8f\x58\x0e\xb8\xcf\x3e\x69\x96\x1b\x90\xbc\xbc\x3a\x27\x71\xce\x6f\x58\xae\xc8\xd1\x57\xcc\xc8\x8b\x58\xfd\xb4\x55\x76\x55\xbf\xb1\x95\x30\x8d\xbe\x34\x3d\x18\xac\x6b\xa8\x1e\xbc\xe4\x28\x8f\x08\xce\x57\x09\x26\x84\x2a\x82\x54\x85\xba\xec\xc4\xa0\x12\x10\x68\xa0\x19\x4b\x59\xe4\xd6\x8a\xee\x0a\x2e\x47\x32\x37\xea\x12\x0e\x4c\x15\xc9\xd9\xdc\x48\xb3\xb9\xeb\x42\xce\x48\x94\x14\xe6\x46\xaf\xe1\x6c\xfb\x04\x00\x96\xa6\xd9\x4d\xb1\x7a\x33\x2b\x55\xcb\x1b\x1e\x3b\x56\x89\x4d\xd1\x7d\xbb\xd3\x8c\xaa\x20\xd5\x26\x68\x4d\x11\x00\x16\x65\x74\x60\xa8\x3e\x89\xb5\x12\xec\x1f\x1a\x85\x25\xd4\xb6\x68\xd1\x57\xa6\x0b\x11\x96\x31\xbb\x28\xa6\x09\x57\x8b\xab\x1d\x4d\x88\x4d\x43\x60\xb0\xc2\x8a\xd7\x6f\xad\x25\x51\x31\xa1\x38\xb0\x3c\x43\xc6\x0d\xd3\xe5\x46\x8e\x92\x00\x44\xf7\x76\x88\x90\x12\xb2\x3f\x12\x66\x2b\x18\x98\x9f\xde\x95\xf3\xb0\x49\x69\x58\xb3\x24\x66\xdf\x8a\xac\x72\x3f\xa2\x49\xa2\xea\x09\xbb\x8e\x62\xa2\xec\xe1\x12\xd5\x70\x4f\xb9\xd9\x6e\xdf\x32\xa9\x56\xfd\x72\xed\xc2\x14\x49\x25\xa6\xf1\x08\xa8\xbe\x8b\x0f\x41\xe9\x15\xf7\x42\x90\xc8\x08\xe9\xca\x80\x32\x3d\xf7\x94\x1d\xcc\xa5\x77\x67\x2e\xdd\x37\x0e\x4f\xf9\xf6\x72\x34\xc8\x86\xae\x94\x25\xf5\xa4\xd4\x91\xdc\x2d\x41\x1d\xbd\xba\x15\xf0\x9b\xa7\x5a\xe7\x7c\x5a\xe8\xee\xf5\xde\x6a\xaf\x03\x9b\x36\x8a\x08\x9c\xe2\xb1\x5d\x7d\x14\xa0\x68\x59\xf7\xbc\x4a\x3e\xcb\xb3\x5f\xf2\x1c\x60\x37\x78\xf3\x50\x91\x58\x46\x85\xaf\x0b\x0b\x40\x2b\x1d\x68\x6d\xaa\x27\x92\xae\xe7\xaa\x7b\x49\xaf\xf0\x23\x5b\xd1\x2b\x96\xb7\xe2\x96\xe6\xf1\xe9\xc5\x96\xe8\xfb\x2a\x3b\x2f\xdf\x0a\x05\x25\x77\x1b\xda\x83\xd2\xa9\x2c\x74\x59\x3a\xf4\xf3\xb1\x57\x37\xa9\xe9\x5a\x1a\xd2\xd0\xd2\x1e\xdd\x55\xd1\x1f\x4c\xdc\x83\x89\xbb\x72\xed\x62\xe2\x3e\x47\x13\x77\x58\x07\xb7\x72\x5c\x5d\x79\x05\x9e\xb4\x8d\xed\xbd\x4b\x2b\xe9\x59\x49\x60\x50\x9a\xaa\xc7\xf1\xd7\x04\x38\x3c\x22\xe5\xde\x06\x42\x9f\xa3\x40\xc0\xb3\x1f\xde\xa2\x7a\x47\x76\xd2\xf6\x0d\xcc\xf1\x5a\xd7\x61\x74\x53\x43\x73\x90\x1a\x82\x0e\xe4\x23\x5b\x05\x7a\x64\xf5\x2e\x11\x97\xbd\x3d\xb1\x08\x75\x87\xfe\xc5\x78\x75\x04\x3e\xe9\xbc\x01\xa4\x63\x77\x71\xbc\xba\xee\x06\xd9\xa1\xd3\x38\x5e\x0f\xdc\x6f\x1c\xaf\xce\xb6\x6f\xd2\xbd\xf7\x78\xc3\x72\xef\xb6\x03\xf9\x8e\x4b\xdb\xdd\xac\xbf\xab\x39\x7f\x54\xf6\xbd\x7c\xfc\x6c\x7d\x30\xe7\xaf\x5c\xf7\x68\xce\x0f\x08\xb7\x23\x06\x0d\xa6\xfd\xd0\xdc\xe6\xec\xfb\x53\xe6\xc4\xca\x49\x59\x7d\xcd\xa0\x9c\xb3\xec\xcb\xbc\xea\x56\x3d\x9c\x4c\x0e\x0f\x9d\xbd\xdf\xe2\x67\xa1\x67\xe3\x3f\x11\x26\x22\x19\xe3\xa6\x9a\xf1\x73\xa5\x81\xe9\x97\x6a\x7a\x38\x97\xd4\x7d\x2b\x74\xcd\xc2\xd8\xdd\xb6\xa4\xc3\x09\x76\x25\x01\x5e\xef\xc5\x22\x4b\xc6\xe8\x4b\x0c\xd8\x05\xfa\xaa\x42\x96\x43\x96\xed\x4b\xb0\x73\x4f\xa5\xe9\x3f\x39\xc2\x9b\x93\x28\x2b\x46\xf6\x81\x49\xca\x52\x99\x2f\x47\xfe\x21\xf3\x63\xe5\x2d\xfb\x04\xd6\x9e\x8a\x8a\x3c\x67\x02\x1a\x98\x3c\x56\xfe\xea\x40\x70\x87\xec\xd5\x43\xbd\x5d\x76\x5b\x79\x55\xb7\xb5\xf4\x01\x80\x49\xaa\xec\x35\x37\xf3\x95\x4d\xd4\xa8\xf4\x73\x98\xbb\x4c\xdc\x90\x1b\x9a\xab\xb6\x30\x27\xbb\x72\xd4\x98\xdf\x70\xd5\xa6\xe4\xff\x9a\xc5\x5d\x79\xb3\x0f\x94\x1d\x2c\x74\x56\x68\x4b\x9d\x1c\xee\xba\x4a\x4d\xd5\x96\x71\xa5\xe0\xf0\x7c\x53\x23\xb6\xfa\xf5\x48\x1b\xc9\x54\xaf\x56\x6d\x65\xaa\x57\xb7\x26\x33\xcd\xef\x76\xdc\xfa\x3d\x1a\x34\xd5\x2f\xb7\xb5\xbb\x9f\x91\x92\xc9\x94\x85\xc1\x9c\x60\x76\x07\x87\x00\x8c\xe1\x67\xbc\x53\x2a\x82\x7b\xa7\x1a\x2e\xa9\x59\x9a\xc9\x9c\xe6\x4b\x12\x5b\x5b\xc3\xb2\x21\x23\x34\x48\x09\xdd\xbb\x34\x0c\xcc\x23\xe6\x79\x4f\xd9\x08\x1d\xb2\x41\x59\xcc\x8b\xb5\x7d\xdc\xd7\x81\x0d\xdf\x0a\x81\x76\x0b\xd5\xc0\x6c\x25\x31\xe7\xee\xb4\x8f\xb9\xc2\x8a\x34\xba\xb6\x1d\x83\x1c\x54\x91\xf7\x07\x49\x2e\x07\x07\xb5\x3a\xd0\x60\x1e\x03\xdf\x9f\x6d\x99\xea\x1e\xc6\xb1\x2b\xa6\x2c\xf4\x86\xd8\xb0\x80\x23\xfb\xe0\xb1\x91\x48\xde\x02\x1b\xbc\xa7\x5d\x22\x1d\x33\xdb\xf8\xdf\x19\xb4\x1b\xeb\x1c\x1b\xef\x5e\xf4\xe5\xa0\x25\x48\xe6\xbe\x2f\x5a\x22\xa3\xc0\xf7\x5c\xe1\x50\xb0\x0d\xaf\x1c\xf2\x3b\xdb\xbd\xd9\x0c\x33\x2a\xca\x17\x60\xf4\x49\x14\xfa\xf5\x78\x04\xa5\x2d\x41\x8a\x07\x60\xfa\x0d\xf8\x10\x74\x09\x2c\x94\xf9\x12\x54\x9e\x0f\x9e\x29\x3f\x74\xeb\x2a\x6c\xea\xa0\x91\x5b\x55\xf7\x30\xbf\x5c\xf9\x95\x95\x7a\x1b\xa4\x40\x38\x41\x5d\x15\x20\x26\xda\xaf\x58\x71\x49\xce\xc0\x77\x55\xb6\x45\xf3\xc5\x1d\x57\xd0\x4c\xf0\xa4\x8a\x67\xae\x96\x9d\x5f\x78\x21\x6c\xa0\xc1\x0a\xd2\x34\xe3\x4c\xa1\x58\x3e\x9e\x17\x3c\xde\x05\x5b\x1e\x31\x03\x6c\xcd\xf6\xba\x33\xbb\x8e\x2c\x6e\x0f\xc6\xe6\x03\x31\x3a\xb0\x86\x83\x32\x7a\xa3\xc2\x1b\xc2\xb2\x78\xd5\x48\x0e\xea\x82\x05\xfc\x91\x73\x2e\xa1\x0f\x5e\xb5\xb5\x3c\x23\x5a\x46\x36\x59\x97\x57\xca\x5d\xe2\xb0\x88\x79\x10\xd8\x3a\x36\xff\x71\x2a\xb0\xb3\xe7\x4f\xd9\x4c\x96\x1d\x52\x50\x23\xb2\xe1\xb8\x31\x4b\x98\x86\xe8\x5a\xe6\x2b\x95\xa2\x4b\x38\x95\x37\x06\x99\x3f\x0a\xf2\xad\xab\xd9\xcf\x67\x2f\x08\x3d\xae\xa4\x40\xd8\xae\x33\x82\xb1\x18\x63\x74\x93\xf2\x3b\x79\x21\xd4\x88\x4c\x8f\x5d\x3c\x0a\x9c\x38\x61\xc4\xc2\xc4\x49\xbc\xa8\x57\xe7\xcc\x00\x00\xd2\x8e\x73\x99\x12\x25\x68\xa6\x16\x52\x83\x6a\x48\x33\x1a\x71\xbd\x24\x3a\xa7\xd1\x35\xb4\x28\xca\x99\xfd\xdc\x88\x44\xc7\x36\xb0\x2b\x04\x5f\x35\x6c\x58\x2f\x72\x59\xcc\x17\x10\x09\x8b\x4f\x45\x09\x55\x6e\xf5\x8d\xef\x5b\x6d\x47\x91\x18\xfb\x0b\xfb\xaa\x81\xb9\xbc\xe1\x8a\x4b\x6b\xed\x75\xe3\x5e\xf8\xca\x70\x68\x41\xc6\xc6\xbe\x47\x8a\x31\xf2\xca\xa1\x04\xfe\x72\x85\x32\x0d\x5a\x36\xf2\x6a\x70\x80\xf4\x25\xcd\x85\x2d\x88\x50\x12\x38\xef\xbc\x42\x86\x69\x66\xde\xf8\xd1\x63\xbf\x5d\xcd\x73\x92\x39\x38\xee\x5d\xe9\x4e\x26\x62\x19\x78\x2d\x4f\x2f\xce\x55\xa8\x8d\x20\x6e\xd9\xba\x77\xf0\x43\x22\xc5\x3c\x2c\x23\x50\x62\xa6\x21\xa5\x02\xda\xbb\xdc\xf0\xb8\xa0\x09\x12\x51\x3b\x99\x97\x57\xe7\xf8\x3a\x9f\x2f\xf4\xf8\x96\x81\x35\x06\x79\x4d\x79\x66\xdc\x47\xf9\x4a\xb4\x0e\x57\x40\x74\xb5\xb5\x26\xa0\x65\xcb\x4c\xed\x96\x2e\xa1\x6c\x8d\x0d\x31\xa9\x38\x4c\x5d\x61\x31\x1c\xa2\x09\xe2\x30\xbd\x53\xdf\xae\xc3\x88\x0d\x60\xae\x32\x20\x06\x4c\x5d\x9d\x9b\x01\x7c\x50\x07\xd0\xdf\xb6\x9d\xd9\xa8\xd9\x20\x23\xdc\x6d\xd6\x65\xee\x40\x28\xbb\x29\x37\xf9\x83\x6d\x9d\xd8\x51\x38\x38\xf8\x3e\x30\x9b\x05\x8e\x0e\x73\x6c\xa8\x88\xc7\x34\x31\x98\x73\xf1\xdd\x4b\x1b\xe1\x8c\x07\xa1\xe2\xc8\x77\x5d\x90\xb8\xf0\x65\xb3\x8d\xcc\xd0\x78\x04\x20\x0f\x7e\xca\x62\x20\x1a\x61\xc3\xc8\x5b\xa3\x21\xbb\xb6\xcd\xdf\xbd\x1c\x11\x3e\x61\x13\xf7\x97\x7f\xd4\x51\x2d\x2d\xe7\x18\x06\xe8\x63\x3c\x01\xef\x60\x2a\xa1\x31\x2a\x7c\xf7\xa7\x3f\x9b\x49\x9a\x5f\xff\x32\xfe\x73\x50\x6d\xf4\x2f\x3f\xd9\x1e\xd1\x3f\xd5\xee\x86\xb1\x64\xbe\xea\xfe\x4f\xae\x41\xb7\xad\x59\xfd\x93\x6d\xc6\x05\x2d\xa9\x27\xd0\x71\xfa\x86\x26\x3c\x46\x6c\x84\x6f\xe7\xec\x6f\xce\xb0\x08\x60\xf2\x46\x9d\x88\x6a\x26\x80\x50\xbb\xa4\x0c\x21\x35\xbe\x6e\xfb\xce\x9a\xf9\x1f\x81\x49\x00\x93\xca\x46\x44\x4b\x09\xc7\x11\x8f\xfc\xa9\x20\xcc\xf5\xea\xc4\xb5\x02\x38\xa8\x0d\x54\x73\xbc\xc7\x0c\x6b\x20\xec\x53\x70\xcd\x3c\x60\x6e\x5f\x08\xa9\xbf\xf0\xdb\xef\x42\x34\x80\xc1\x48\x42\x6f\x24\x77\x05\xc8\xcd\x49\x11\xd8\xd1\xd1\x97\xc4\x9e\x2e\x49\xca\x95\xa6\xd7\x6c\x42\xae\x0c\x6f\x09\xbd\x61\x08\x3d\x41\xa0\x82\x25\x8b\x49\x21\x34\x4f\xe0\xd7\x72\x1c\x33\xe5\x90\xe7\x9c\xcf\x88\x2a\x22\x43\x5b\xb3\x9c\x8d\x1d\x17\xb3\x4f\xad\xd0\x82\x72\x2d\x23\xbf\xd9\x0b\x8a\xba\x40\x16\xc3\xab\x00\x0f\x2a\x2c\x7a\xad\xc4\x71\x99\x79\x4a\x11\x95\x9c\x0b\x80\xa9\x26\xe4\x1d\x30\xab\xc4\xb9\x84\x51\x2d\xb1\x06\x4c\xc1\x22\xa6\x14\xcd\x97\x23\x28\xec\xce\x7d\x31\x70\x1b\xba\x03\x1c\x35\xa5\x02\xcb\xaa\xe7\x2c\x92\x42\xe9\xbc\x88\x34\xf6\xd9\x9b\xe6\xf2\x9a\x09\x1f\x2e\xb8\xda\xa3\xbe\x8c\x9f\x01\x7f\x97\x24\xd1\x82\x8a\x79\xd0\xa7\x26\xa5\x31\xc0\xfe\x1b\x2f\xe5\xb8\xf5\x18\x08\xd0\x99\x11\x2c\xb8\x06\x50\x4c\x0d\x1f\xf1\x66\xd8\x8f\xc2\xd7\xe3\x19\x95\x76\x52\xb3\x24\x9e\x6c\xa1\x5d\x9d\xe8\x17\xe9\x68\xd4\x1b\x03\xdb\xee\x39\x00\x2c\x65\x9a\xc6\x54\xd3\x1d\x82\xc0\xde\x96\xcd\xf5\xac\x03\xd2\x36\x38\xf5\x8e\x49\xcb\x87\x9c\xb8\x25\x33\x1e\xe6\x3f\xc1\x49\x5c\x38\xc8\x43\xc6\xb5\x36\x38\x65\x1d\x05\x18\xdb\x05\xf2\x8c\xeb\x5e\x66\x86\x77\xa3\x21\xb9\x28\x5b\x33\x96\xe4\xa4\x9d\x1b\xaa\xa3\x05\xd6\x80\x7e\x07\x18\x7d\x28\x7d\x65\x51\x35\xbe\xab\x51\x04\x41\x2e\xc1\x84\xe6\x39\x0b\xd3\xcd\x2c\xe8\x0a\x81\x48\x5e\x03\x22\x40\x79\xce\xb4\x2a\x23\x54\x90\x0e\x1b\xe2\x62\xf9\x9d\x55\x46\x81\x48\x5b\xc0\x5a\x7d\xae\x59\x16\x42\xb0\x2b\x69\xe9\xac\xa1\xfc\x77\x02\xd7\x5d\x8c\xce\xd8\x4e\xe0\xad\x8c\xbb\xd8\xa9\x6b\x55\xf8\xcb\x21\xca\xf8\x4d\x8c\xc4\x55\xa0\xd4\xe3\x03\xe0\xad\x52\x95\xa4\x39\x24\x72\x0b\x7a\xb3\xbb\x91\xaa\x94\x91\xc6\xbe\x94\x31\x7c\x6e\x0c\x9f\x1b\x3f\x6f\x6f\xcc\xeb\x12\x01\xe2\xae\xd6\x91\x20\xd5\x8f\x74\xb2\x9c\x1a\x92\x72\xd5\xd1\xdc\x59\xcb\x46\xf6\x23\x58\x9a\x6f\xbd\x88\xde\x73\x6b\x33\x1d\x18\x37\xd4\xe2\x05\xf9\xa2\xc2\xe5\xad\x34\xe5\x35\x25\x8c\xd4\x3d\x72\xaa\xd3\xc4\x6e\x85\x4b\x3e\xaf\x3e\x7e\x5c\x1b\x0c\xc4\x8b\x66\x8d\xc2\x45\x04\x7b\x91\xcf\x88\x67\x39\x18\xcf\x5c\xfe\x81\x41\xaf\x5c\x26\x09\xcb\x61\x09\x56\x7b\xaa\x79\xd1\xa1\x96\x29\xda\x74\x47\x5e\x45\xf5\x32\xa6\x60\xb7\x5e\x98\xa0\x0a\x4b\xb7\x38\x8f\x17\xb3\x8d\xf3\xd6\x8e\x67\xdb\x1a\x99\xdf\x4f\xc5\x12\x27\x7f\x16\x00\x17\x95\x4f\x32\x37\x9f\x32\x72\xa7\xa0\xd3\xc4\x70\xbe\x60\x03\xfc\x77\x6a\xa4\x5c\xcb\xe0\xa9\x4b\x36\xb3\x5a\x63\x78\xab\xdd\xbb\xc8\x07\x2a\x2f\x4e\xca\x10\x16\xd7\xd5\xae\x2c\x59\x62\xa1\x5e\x79\xa4\xea\xfa\xae\x8d\x56\xc9\xa4\x6d\x9a\x41\x6b\xcf\xdd\x4e\xbe\xbb\x5d\xbc\x77\x90\xf6\xc9\x45\x9b\x50\xa9\xf2\x85\x8d\x0d\x4e\xea\xd7\x2e\xee\x3e\x88\xa7\x01\x37\x7f\x37\xdf\x4d\xb5\x9f\xfa\xc5\x39\x0c\xe1\x74\x87\x39\xfc\xe1\x38\xa3\x77\x6e\x4c\x99\x39\x7d\x65\x42\x37\xec\x7b\xf8\x6e\x43\xc4\x43\x79\x04\xbe\x81\xaa\xb1\xd6\x9a\xed\x3b\xa2\xe5\x0c\x22\x56\xe0\x8b\x13\x68\x9b\x40\xc5\xd2\x4a\x1c\x7a\xc1\xf3\x78\x9c\xd1\x5c\x2f\x51\xcd\x1d\x55\xbe\xe6\xd3\x00\x3a\x2d\x7c\x47\xb7\x53\xbb\x12\xcd\x6b\x21\x0c\x8b\x77\x66\x6c\xeb\x45\x58\x0b\xd7\xfb\x58\x4f\xfb\x44\x83\xc6\xf5\x84\x25\x50\x9d\xe6\xfa\x60\xeb\xa9\x50\x96\xfd\xf9\x9b\x21\x4f\xaa\xea\x22\x46\x76\x15\xb6\xd8\x92\x61\xb4\xb6\x97\x46\x40\x71\x33\x23\x8d\x8c\xbe\x4c\xcb\x9e\xe8\x81\x01\xd2\x4a\x34\x2e\xd6\xc7\x76\x64\x32\x48\x1f\x7c\x25\x7c\xd5\x9f\x0f\x72\x24\xa4\xc0\x33\x83\xcf\x1e\x63\x90\xd3\x1a\xeb\x19\x3c\xe2\xb9\x4d\xa8\xab\x05\x67\xd4\xb1\x31\x2e\x62\xb3\x69\x40\x96\x41\x8b\x53\x45\x14\x31\xe6\xf5\xfe\xb0\x89\x4e\x79\xa6\xed\x94\x5d\x33\x4e\x25\xa1\xcc\x8c\xd2\x34\x49\x4a\x7d\xdb\x02\x4a\x02\x27\x76\x36\xca\x80\x41\x57\x52\x81\xac\xe9\x01\xda\xbc\x63\x60\x4e\x21\x22\x0c\x32\xe0\x7a\x19\x16\xe0\xaf\x08\x23\xa0\xe8\x28\x54\xc3\xf9\x0c\x2d\x63\x81\xc2\xe2\x81\x09\x44\xc9\x36\x99\x5f\xb8\x56\x29\x20\x85\xdb\xea\x11\x86\x02\x4d\x69\x74\x7d\x4b\xf3\x18\x9a\x0d\x67\x54\x73\x2c\x5c\x3e\x42\xae\x18\x32\x39\x71\x78\x18\xfa\x70\xb8\xa8\xf3\xdf\x70\x22\x47\xc1\xac\x57\xf8\xf2\xb1\xe7\xc7\x8a\xf9\xb2\xda\xe5\xc4\x08\x2d\xb4\x4c\xa9\xe6\x11\xa8\xe7\x7c\x16\x58\x46\x53\x5f\xa6\xb1\xd6\x4a\x11\x28\xb2\x6f\xca\xff\x7d\x7d\xf2\x1b\x27\x1e\xcc\xd5\x2d\xb3\x79\x5e\x01\x51\xf7\x2d\xfb\xc1\x95\x05\x16\xfc\x9c\x31\xc2\x53\x23\x60\x51\xe8\x44\x32\xf3\x09\x57\xce\x5c\xbc\x09\x28\x46\x8a\xfc\x1e\x6c\xf4\xc1\x53\x68\x63\x30\x1a\xa8\x22\xfa\x56\x7a\x75\xae\xb4\x84\xda\x8c\xa5\x51\x4d\xe4\xb0\xef\x98\xa3\x66\xc0\x12\x9c\xa3\xd1\xff\x67\xef\x6b\x7b\xe3\xc6\xad\x7f\xdf\xf7\x53\x10\xee\x0b\x27\x80\x67\x9c\xec\xdd\xbb\x2d\xf6\x5e\x14\x70\x6c\x67\x77\xfe\x4d\xbc\x6e\xec\xec\xa2\x28\x8a\x82\x96\xe8\x19\xd6\x1a\x51\x2b\x52\x76\x06\x45\xbf\xfb\x1f\x3c\xe7\x90\x22\x35\x4f\x92\x46\x1e\x3b\xbb\x9e\x37\x89\x67\x44\x8a\x8f\xe7\xf9\xfc\x8e\x3d\x3b\x0f\x22\xcb\xec\xbf\x9b\x6e\x93\x1e\xaf\x1a\x11\x96\x04\xd6\x2c\x95\xba\x51\xd7\xfb\x55\x5a\xaa\xa2\x20\xfb\xd2\xfc\x75\x73\x44\xe0\x76\x29\xef\x85\x0e\x4a\x57\xa3\xcc\x36\x15\xb9\xaf\xbd\x4e\x68\x20\x40\x50\x9a\xaf\x88\xb6\x71\xe5\xe0\xc2\xe5\x42\x23\xf6\xe6\xe5\xa1\x5f\x41\x17\xb5\x2b\xe5\x0e\x8c\x1e\x63\xb6\xee\x6b\xf6\x99\x2a\x3e\xf9\x3b\xeb\x43\x22\x5b\xc9\xb4\x68\x0a\x23\xb1\x76\xcc\x5e\x9d\x64\xc5\x2c\xe8\x35\x94\x22\x7d\xa8\x75\x3c\xd2\xe8\x7d\xa7\xa5\xd2\xfa\xc2\x35\xe9\xf2\xea\x17\x09\xb3\xe5\xe7\x45\xc2\x7c\x91\x30\x7f\xdf\x12\xa6\x9b\x0f\xd0\x98\x1d\x27\xe5\xd9\x6f\x4c\xeb\x36\x4d\x8f\x5d\x28\x43\x6e\x11\x10\x41\xf8\x5a\x4d\x9b\x03\xa1\x7b\xe0\x8b\x71\x2e\x0c\xa5\xf1\x3a\xa3\xca\x27\xd7\xdf\x0f\xa5\x65\xc6\x24\xbb\x05\xc7\xdc\xdd\x19\x97\x40\x1c\xbc\xc5\x28\xe4\x0f\xb5\x97\x06\xbe\x3f\xd4\xe4\xa3\xb0\xbf\x43\x10\x7d\xd8\x41\x22\xc6\xec\x4a\x38\x34\xcf\xe8\xe5\xcb\xe9\xa2\xa9\x30\x5c\x66\xba\x66\x08\xd7\x6b\x18\x4c\x7f\x82\xff\xd8\xa7\xc4\x07\x8b\xf6\xd5\x41\xea\x08\xe9\x20\x24\x23\x0c\x25\xaa\x1f\x58\x67\x02\x9d\xdc\xb2\x4f\x22\x51\xf7\xa2\xc4\x95\x81\xb2\xc1\x56\xce\x7e\xcf\x65\x66\xd7\xc5\xad\x4f\x6d\x5a\x02\x3c\xe6\xd8\xb0\x1f\xd8\xf3\xfc\xa1\xa4\x4d\x98\xd3\xa0\x28\x4f\xd8\x3e\x4f\x2e\xf6\xa2\x14\xf7\x52\x55\xda\x05\x3c\x55\x06\x89\xb1\x36\x24\xd9\xce\xe4\xd4\xc3\xfa\xfb\x40\x89\x52\x24\xaa\x4c\xeb\xc3\xa7\x0d\x37\x95\x8e\xb3\xac\x12\xb4\xc5\x0f\x67\xde\xf5\xeb\xf8\xc8\x32\x40\x3f\x7e\x0b\xd3\xed\xd4\xa2\xe9\x1d\x07\x99\x55\x43\x42\x63\x40\x67\x42\x1a\x83\x01\xcd\x32\xc7\x85\xb7\x9b\x3d\x76\x3f\x61\xe3\xa3\x7a\x8f\x6b\xb7\xa5\xd4\x41\x7d\x7f\xef\x03\x94\x20\xa5\x72\x7b\x6d\x03\x75\xcc\x5f\x5a\x38\x66\x4e\xb8\x3b\x43\xfd\xef\x13\xbd\xeb\x24\xb3\x32\x29\x12\x81\xe0\xe2\xae\xf0\x2f\xca\xf9\xbc\x32\xf6\xbc\xb6\x70\xf9\x85\x9f\x3e\x16\x79\xd6\xc7\x2a\xbf\xb4\x0b\x9f\xc2\xf5\x0c\xb1\x26\xac\xea\x06\x8e\x77\xbb\xf4\xce\x31\x1f\x3d\xdd\x22\x59\x7e\xd5\x2c\x3b\x9e\x4e\xfc\xf4\x91\x53\xf1\xd3\x51\xf8\xc4\x4f\xbf\x2b\x81\x9f\xee\x22\x05\x7e\x96\x05\x8b\x46\x69\x7e\x27\x60\x44\x3b\x53\xa8\x74\xbc\xe2\x62\xf8\x20\x0d\x95\x52\x04\x46\x6c\x5c\xc1\x44\xae\x89\xed\xfe\xce\x45\x25\x79\x22\x4a\x85\xd0\x32\x30\x93\xc8\x54\x20\x76\x2d\x5d\xa8\x1e\x33\xeb\x29\xcb\x34\xa2\x0d\x2d\x9d\x18\xcd\x79\x31\xba\x13\x8b\xce\xdb\xd2\xe3\x14\x2c\xbf\x1c\xe7\x31\xe7\x45\x87\x7e\x30\x2c\x76\x07\x32\x79\xf8\x01\x03\x6b\xf1\xcb\x1b\xe2\xaa\x2e\xd6\xb7\x8e\x33\x4e\xd4\xbc\xa8\x8c\x08\xb8\x2f\xf1\xc9\xce\x2c\x29\x82\x16\x39\xc6\xea\x78\x23\xdf\xed\xa8\x0e\xed\x6d\x51\xd6\x26\xfc\xf4\xbe\xfe\x7d\x51\x34\xc2\xcf\x33\x8e\xee\x6d\x4c\xb6\x7b\x8a\x0b\xdb\x31\xcd\x85\xed\x92\xea\xc2\x86\x4c\x77\x61\x3e\x69\x6e\x97\x1b\xf3\xc9\xa5\xeb\x35\xee\x0c\xc9\xa7\x9b\xee\x4c\x84\xda\xe4\xfb\x91\xda\x95\xd9\xa6\xd8\x31\x7f\x07\xc0\xef\x1a\x26\x5d\xd1\x6d\x05\x83\x34\x06\x88\x89\x2f\xbe\xb4\x42\xa0\x03\x81\x6a\xff\x20\x35\x6a\x2d\x39\x93\xf3\x02\xe1\x16\xe1\xd6\x8d\x9c\xd8\x43\x06\xdf\x97\x1b\xfc\x72\x83\xdb\xb6\x7f\xca\x1b\x8c\x69\x65\x5d\xb2\x1e\x1b\xe5\x18\xb1\x39\x21\x9d\xf0\x1b\x91\xb1\x5f\x2b\x51\x2e\x98\xd5\x15\xeb\x18\x6a\xa8\x21\x61\x25\x13\x8c\x42\x26\xbf\x50\x7b\xd1\x64\x8f\x6a\x12\x88\x6f\xe7\x5f\xac\xa2\x0c\x60\x01\x3b\xd0\xb5\x66\x57\x31\x1e\x0c\xae\x96\x5f\xc1\x50\x11\xc6\x30\xae\x48\x35\xb6\x1a\xd3\xc9\xc5\x59\x3f\x7b\xc3\x53\xe8\x29\x27\x1b\x26\x88\x0b\xe1\x7f\x89\x4b\x76\x7a\x87\x05\xbb\x13\x8b\x23\x0a\x36\xa4\x12\x39\xee\x61\x8c\x99\x8d\x71\xdb\xdb\xe2\x81\xad\x5a\xa0\xbd\xab\x38\x6d\x91\xbe\xe3\x56\x6e\x11\xf6\xa8\x1c\x75\x40\x04\x0f\x3f\xeb\xd0\xc1\xf1\x4c\x00\xcc\xb1\x4b\x1e\xf3\xc7\x00\x12\xe6\x80\x5a\xec\x55\x67\x61\x00\xc8\x8b\x0b\xbb\xf3\x54\xfd\x31\x8d\xb2\x9f\xee\xc4\xe2\x50\x13\x34\x83\xca\xf5\x4c\x16\xae\x08\x0f\x50\x02\x3a\xb9\xec\x67\x08\xc2\x74\x5d\xe0\x9d\x9f\xe4\x47\xec\x42\x19\xfb\xcf\x39\xc4\x63\xc3\x59\x3f\x53\x42\x5f\x28\x03\xdf\xec\x7d\xb1\x70\xb8\x3b\x2f\x15\x39\x33\xc9\xcc\x03\x79\x03\x90\x04\xeb\xe2\x7c\x61\x49\x28\x04\xcc\x2f\xab\xd4\x6c\x92\x33\x55\xba\x35\x31\xae\x42\x83\xa6\x2e\x9c\xa3\x26\x70\x51\xaf\xe8\x83\x96\x52\x95\xd1\x4a\x6e\xe8\xce\x3b\xa1\xa5\xfb\x05\x2c\xdc\x10\x50\xe0\x83\x93\xa1\xce\x00\x37\x62\x2a\x13\x36\x17\xe5\x14\x40\x38\x92\x59\xff\x0d\xea\x4e\xb7\xf1\xd3\x8b\x7a\x87\x2f\xee\x7c\x32\x80\xd5\x7d\x80\xf0\xf0\x5d\x19\x26\xf6\x82\x2c\x62\xce\x0b\x7b\x28\xfe\x63\x39\x01\xec\xcb\x7f\xa1\x2e\x88\x1e\xb3\x13\x57\x55\x3e\xfc\x8d\x8c\xbd\x61\x37\xb6\x07\x2b\xd3\xff\x5a\xc9\x7b\x9e\x09\x4c\x9a\xe0\xb9\xc7\x4a\x57\xb7\x4b\x6c\xfa\x88\x8a\x83\x58\x2a\xe5\xed\x2f\x07\x77\x62\x71\x70\xb4\x74\x90\x0e\x26\xf9\x41\x8d\x84\x13\x1d\x1d\xcf\xd0\xc0\x57\x7e\x00\xbf\x1d\x0c\xcd\xd9\x9f\x48\xb4\xef\x71\x4a\xc8\x6e\x7e\x9a\x71\xf4\xb3\xf4\xf5\x66\x34\xfb\x59\x85\x72\x7d\x15\x3c\x53\xfb\xa1\x28\x45\x66\x70\xb3\x3f\xa4\x52\x76\x0f\xe7\xee\xb4\x7a\xf7\x54\xa2\xae\x3d\x3a\xd6\x4a\xd4\x56\xc0\x86\x72\x89\xb2\x11\xf8\x40\x1d\x49\xb6\x66\xbd\x7e\x06\xf7\x8b\xba\x85\x52\xfe\x84\x5e\x0d\x06\x74\xcb\xb4\x29\x75\x36\x57\x86\xc9\x3c\xc9\x2a\xf2\xbc\x40\x53\x74\x03\x3c\xfe\xe2\xec\x70\xa8\xea\x0e\xdc\x69\x72\x91\x6b\x4b\x59\x52\xcd\x38\x1e\x08\xeb\xf2\x91\x2b\xb8\x56\x43\xcf\xf5\x76\x4b\x4e\x4a\x8c\x78\x9e\xc4\xb2\xc7\x7b\x79\x53\x0a\x76\x3a\xe3\x79\x2e\xb2\x00\x52\x84\x8c\x1d\xbe\x66\x28\x08\x24\x54\x29\xf4\x30\x2e\x15\xea\xe8\x5b\xee\x01\x6c\xea\x94\xb1\x81\xd0\xf5\x7f\x4b\x95\x3b\xd7\x03\xcc\x77\xad\xd9\x89\x78\xd8\x33\xf5\xc0\x52\xc5\x1e\xa0\x38\xd4\xbd\x65\x5a\x10\xba\xa5\x1d\xbb\x0b\x46\x0a\x51\x9e\x89\x9a\x17\xa5\x9a\x4b\x1f\xfa\x44\xdb\x38\x28\xfe\x46\x56\xb5\x00\x5a\x8c\xf7\x20\xab\xf2\xb8\xee\xce\xfb\x53\x66\x78\x39\x15\xc6\xf6\xc6\xf2\x6a\x7e\x23\x5a\x83\x84\x3c\x06\xd0\xeb\xd7\x54\xa7\x7d\xd8\x4a\xa3\xb8\x0d\xbf\xfc\x72\xd1\x15\xe7\xf6\xb0\x6e\xb9\x6e\x6f\x1f\x54\x99\xa5\x0f\x32\x75\xee\xe2\x57\xf6\xe1\xd7\x6d\xc7\x3f\x30\xec\x6d\x87\x13\xfe\xf0\x20\xd3\xce\xcb\x01\x8d\xe2\x65\x70\x41\xdc\x76\x19\x18\xac\x03\x95\xd1\x94\x50\xab\x04\x5a\xbc\x66\xe7\x12\x53\xb8\xa1\x3d\xa0\x01\xce\x6f\x64\x5e\xa7\xf1\xd7\xcb\x6c\x89\xb1\xbd\x2f\x4e\x35\xd1\xc2\x60\xf2\x2d\xe4\xbd\x28\x33\x63\x5a\xce\xab\xcc\xf0\x5c\xa8\x4a\x67\x8b\xd6\x47\xe5\x69\x96\xfa\x36\x13\x5f\xf0\x64\x77\x61\x72\xbe\x51\xcc\xec\x20\xc0\xb5\xc6\xaa\x58\xe2\x76\x75\x7c\x78\x7a\xec\x39\x9f\xcf\xe9\x16\x5f\x44\x42\xa9\x57\x45\x56\x4d\xe5\x96\x1c\xd3\xdf\x59\xe9\x98\xba\x4a\x47\xa5\x45\x0d\x87\xd4\xb6\x78\xde\x9e\x2a\xbd\x3c\x2d\x87\xbf\x5e\x5d\xe5\x25\x15\x85\xc8\x53\xc0\x9d\x7d\x5f\x9f\x5c\x1c\xfc\xa0\x2b\x47\x18\xae\x5d\xa9\x96\x83\x7e\x8d\x28\x78\x10\x7f\x30\x53\x59\xaa\x99\xf8\x62\x4a\x6e\x09\xd3\xdc\x92\x20\xdf\xe6\x96\xf1\xbc\x3d\x91\x79\x1e\x75\x18\xd8\xe0\xdc\xfe\x71\x8b\x92\x3f\xc7\xba\xe2\xf5\xdc\xa3\xaf\x07\xae\x0f\x84\x84\x98\xee\x8a\x8e\xd3\x9b\x56\xd4\xf1\xa9\xc3\x4f\x97\xf3\x48\x7b\xd6\xf3\xd1\x2b\x2a\x97\x34\x46\xf5\x52\x0b\xfd\xab\x28\xee\x73\x0b\xe8\x2b\x5d\x90\x2e\xa9\x45\x43\xa3\xa6\x2f\x5d\x4d\xe1\x16\x1a\x34\x9d\xdb\x80\x0f\xd8\x55\x77\x1d\x51\xee\x38\xd3\x76\x2d\xeb\x40\xed\x2a\xcf\xb7\x51\xb1\xc7\x28\xd5\xc2\x0d\xd7\xc2\xb4\xb3\xa6\xc4\xa2\x43\xdd\xd2\x5e\xc0\xf0\x7c\xd1\x4f\x58\x2a\x08\x72\xea\x1c\x22\x09\x1b\xfd\x85\xa4\x8c\x3c\x7a\xd2\xca\x17\x6e\x7d\x1c\x12\xa6\xf0\x5e\x64\xec\x23\xb5\xbb\x92\x70\xd3\xba\xae\x61\x2b\xbe\x40\x23\xf8\xfc\xb9\x73\xc1\xfc\xa0\xa5\x93\x43\xe0\xff\xf1\x22\x8c\x7d\x78\x6b\x95\xcb\x5f\xab\x50\x1d\x00\x04\x31\x3f\x6d\x7a\x7e\xa8\xb9\x4d\x13\x51\x1b\xaf\xce\xa4\xbe\xeb\x82\xf8\xba\xd4\x38\xbe\x12\x3f\x9c\x9e\x33\xfa\xb6\x95\x7d\xa9\x8b\x81\x69\x57\xf8\xd1\x69\x22\x6a\xa3\x6d\x2a\xf5\xdd\x40\x68\xb1\xed\xa5\xfa\x22\xbd\xd8\x16\xcb\xb8\x3f\xfb\x57\x53\xea\x75\x38\x78\x01\x40\xe3\x42\x55\xec\x81\xf0\xa5\x48\x6a\xbe\x96\xc5\xf7\xec\x3c\xd7\x55\x29\x6a\xcf\x6d\xb3\x2b\xcb\x75\x5b\xcb\xd0\x00\xe1\xa5\xbf\x1f\xcc\x56\x36\xf4\x29\x79\xce\xc6\xb7\x82\x97\x06\xc4\xe3\xae\xc7\xc0\x37\x74\xf4\x29\xf8\x22\x6f\x73\x0e\x26\xb7\x2e\xb0\xee\x88\x80\x74\x3c\x3a\xac\x7b\xc8\xee\x7c\x80\x1d\x17\xee\xf5\x7b\x8f\xab\xc8\x8e\x53\x71\x7f\xac\x53\xfe\xf6\x08\x5e\xe3\xf2\x42\xe2\x31\x71\xcd\x0e\xde\x1e\x8c\xd9\x95\x9c\xcb\x8c\x97\xd9\x22\xaa\x77\x51\x3f\x67\x99\x85\xeb\x10\xbc\x72\x6f\x0e\xd8\x2b\x55\x42\xcf\x09\xcf\x59\x26\x5c\x52\x36\xdd\xb3\x05\xca\x8e\xaf\xf7\x4d\x5c\xd8\xa3\xda\x2f\x91\xce\x74\x3e\x13\xa9\xe3\xd8\xc4\x8f\x22\xcc\xc0\xb3\x9a\xa4\xcb\xdc\xd2\xf9\x31\xfb\x4c\x04\x9a\xf8\x16\x6e\x1a\x5c\x19\xf7\xc4\x53\x2d\xea\x7e\xf4\xbe\x5e\x1a\xdc\xb2\x39\xf8\xe9\x96\x69\xbb\x96\x38\x95\xe6\x93\x28\x54\x27\x09\x01\x9b\x34\xec\x71\xd2\xd8\x2f\x94\x96\x80\x06\xcf\x0d\xe3\x78\x6d\x93\x2a\xe3\x56\xac\x46\x6b\xdc\x98\x9d\x9d\x5f\x7e\x3a\x3f\x3d\xb9\x3e\x3f\xfb\x9e\xfd\x40\x3d\xc9\x50\xc2\x1b\xb3\xeb\x10\x72\x33\x88\xe8\x25\x5c\x43\xff\xae\x23\x22\x43\x3c\xaf\x11\xb4\x01\x48\x8d\xe7\x6c\x92\x4b\x53\xd7\xa0\xc0\xb8\xb3\x4c\xe5\xc2\x95\x68\x2f\x14\x59\x03\xa7\xd2\x10\xc0\x10\x76\x66\x7f\x8e\x7b\xa3\x64\x0d\x2b\xca\xd4\xb9\x16\x7b\x17\x2d\xea\xc5\x1d\x4a\xfc\x77\x20\xf3\x5d\x65\x5f\x0f\xf9\xef\xb2\x85\xd1\xfa\x5f\x7f\x8f\xcc\xc0\x57\xbf\x71\x98\x82\xaa\x8c\x8a\xd3\x40\xe9\x7a\xcb\x66\x0e\xc7\x87\x4e\xa0\xc8\x96\x2a\x1d\xf9\x4e\x43\xd8\xd4\xf8\xb0\x8d\x19\xfb\xc9\x85\x6c\x03\x6e\xca\xea\xa2\x49\x08\xc1\x15\x94\xde\x69\x1c\x59\x97\x3f\x58\xdd\x84\x2f\x25\x9c\xd5\xa9\xbc\x27\xf4\x8b\x41\xad\x78\xf5\xeb\x3b\x97\xa0\xad\xc7\x4d\xfa\xc7\xa7\x0f\xc3\x8e\x0c\xef\x5f\xe7\x71\xd1\xb5\xa5\x51\x25\x6a\x3e\x47\x50\xce\x99\xcf\xd6\xaf\x13\xee\x3d\x55\x18\x4c\xf3\x41\x78\xd1\xdb\x2d\x87\xbf\x41\xcf\x5c\xa3\x86\xa6\xe3\xbf\xa6\xa4\x84\xbc\x16\x73\xbb\x17\xbb\x20\x24\x5b\xed\x92\xa9\x89\xb4\x1f\xfb\x97\x1f\x7f\x3a\x3f\x39\xfb\x78\x3e\x9e\xa7\x7b\x27\x2d\x22\x4f\x0b\x25\x73\xa3\xb7\xeb\x37\xdb\x4a\xfb\xb5\x27\x3f\xfe\xa5\x5d\xb9\xb3\x6f\xe8\xce\x98\xfb\x22\x00\xff\xa5\x64\xf0\x60\x0f\x8d\x2a\x54\xa6\xa6\xab\x6b\x5c\x74\xd8\x9c\x3f\x22\x88\xdf\x88\x8f\xec\xae\x0f\x2b\xea\xb7\x29\x56\xd6\x94\xf2\xb1\x38\x99\x5d\x86\x7a\xae\x5e\x6a\x86\x9a\x62\xcf\x74\xba\x8f\x22\x9c\x2d\xad\x01\x2a\x92\x70\x81\x1d\x2e\x72\x0d\x34\x1c\x14\x0a\x6c\x2b\xb5\x3d\xf6\xd2\x6d\x17\xd8\x2c\xfd\xd9\x5e\x0d\x32\x5e\x33\xd7\x26\x26\x70\x45\x29\x46\x1e\x13\x13\xea\xd7\xa9\x32\x60\xb8\x21\xbd\x73\xd6\x1b\x67\xeb\xc1\xa7\xb2\x45\xd3\x8a\x13\x24\x77\x3b\xd3\x17\x22\x11\x65\xd9\xa2\xc6\xda\x26\x2d\x9a\x4f\x11\xeb\xb2\x24\x33\x71\x51\xca\x7b\x99\x89\x29\xe0\xdd\xcb\x7c\x1a\xa0\x04\x84\xb8\x02\x04\x08\x11\x1b\x5d\x3f\xda\xbf\x82\xca\x26\x70\x2e\x2e\x7e\xba\x86\xd2\x09\xe0\xe0\xda\x59\x08\xb7\x2f\x84\xfb\x36\x1a\x8d\xc0\x64\xf0\xea\xdf\x56\x9e\x4c\xb3\xd7\xec\x17\x41\xef\x51\x50\xdb\xa1\x84\x7a\x8b\x33\xe5\x81\xf6\x61\xac\xf5\xca\xc2\x71\x44\xf7\x3e\x3d\x75\x6c\x9f\xb4\xb2\x12\xb2\x9a\xe8\x79\x28\x2f\x8f\xf8\xd8\xe8\x63\xda\xbf\xec\x39\x20\xd9\xef\x4d\xe5\x9c\x69\x75\xd5\xf9\xf4\x8e\x1f\x47\x0f\x39\xd3\x8b\x79\x26\xf3\xbb\x1a\x7c\xf5\x56\x11\xfe\x88\x60\xf6\x07\x77\x62\x4b\xc1\xb3\xf5\x94\xb2\xcf\xf9\x18\x94\x4a\x9a\x1e\x16\x40\xb0\xd0\xd9\x7b\xf6\xa3\xbb\xf6\xe4\x86\x0e\x49\xdc\xc1\xc1\xb3\x9b\xaf\xd4\x89\x96\x5d\xc8\x1a\x34\x88\x68\x5a\xce\x26\x57\xa7\x57\x93\xbd\x5a\xa8\xd7\xb1\x04\x18\xdd\x13\x4a\x75\xf2\xd7\x6d\xde\xe1\x11\xcb\xaa\xed\xcf\xa0\x7a\x77\xa9\x4a\xc3\xb3\x81\x88\x40\x32\xe3\xc5\x49\x65\x66\x67\x52\x03\xd4\x4c\x57\x21\x60\xa9\x7d\x10\xe9\x8c\x05\x32\x1c\x2a\xb3\x74\xc7\x81\x9e\x3b\xfd\xf1\xe4\x92\xf1\xca\xee\xaf\x21\x04\xf7\x41\x1d\xee\x6e\x64\x57\x98\x61\xd0\x73\x5e\xd4\x7a\xcb\xac\xdc\x53\x8f\x3d\xa7\xc7\x88\xc3\x7d\xf1\x45\x00\x0d\x45\x0a\xf6\x8c\xfd\x0f\x32\x97\x46\x72\xa3\x5a\x56\x83\x8d\x8e\x40\xd4\xd6\x1b\x04\x2a\x6d\xd4\x9c\x4e\xf0\xc4\x3d\x01\x2e\x64\xe0\xe2\x4b\x8d\x6a\x6b\x01\x48\xef\xb0\x62\x93\xdc\xca\xda\x3c\x11\x8d\x00\xc8\x23\x40\x56\xc7\xbe\xa5\x7f\xe6\xff\x93\x81\x0a\x50\x44\xb3\xbf\x7c\x1f\xd5\xbb\x59\x2a\x1e\xe6\xac\x14\x75\x65\xaa\x41\x2d\x3e\xf2\xd7\xae\x44\x41\xfe\x9a\x37\x2c\x6d\x38\xc1\xbf\x55\x3c\xc3\x85\xb9\x18\xda\x2c\x15\x2f\x72\xd7\xf1\xc6\x3b\x44\x43\xaf\xb7\xe3\xc2\x6b\xe9\x95\x46\x7c\x52\x9c\x8f\x29\x79\xae\xed\x1e\xc5\xba\xd8\x21\x39\x9e\x0e\xd9\x2b\x93\x14\xaf\x07\x9d\x67\xf7\xd0\xf6\xac\xca\x43\x81\x03\x47\x7e\x8d\xdb\xf2\xc1\x87\xb6\xb7\x1d\xe4\xa3\xb8\x86\xe0\x94\x77\xb5\xaa\x50\x2b\xbf\x5b\xe1\xbc\x90\xf5\xb3\x0f\x52\x1b\x57\xf5\x0a\xbe\x90\x9a\x8a\x35\x80\xdc\x75\x69\x15\x39\x59\xfc\x8b\xa7\x69\xf9\x3d\x72\x29\x92\xc9\xe1\xff\xda\x23\x66\xf2\xdc\xfb\x12\x5f\x99\x45\x41\x88\xc4\xd7\xa7\x97\x0c\xab\xd0\xfd\xf9\x3b\x2c\xaf\xff\x7f\xbe\xf9\xee\x4d\xeb\xed\x7e\xba\xe0\xf1\x9e\x76\x8c\xc1\x7d\x4c\xcf\x22\x6e\x30\x8a\x0f\x04\xb0\x45\x2b\x9b\x5c\x61\x38\x9e\xa5\xac\x74\xd5\xf1\x60\xd9\x5d\xf6\xf4\xbe\x9f\x04\xf3\x12\x67\xf7\xa4\x71\x76\xcc\x67\x94\x20\x91\xe8\x78\x5c\xc2\xa6\x90\x62\xb8\x4c\x76\x90\xe2\x5c\x3e\x3f\x8a\xb3\x75\x6d\xb6\x9f\xa2\xf8\xf4\x84\xce\x78\x57\x63\xb0\x0e\x61\x3f\xbb\xb8\xfa\xd7\x87\x93\x77\xe7\x1f\x60\xa4\xe4\xbf\xb7\x47\x43\xe6\xbd\xe3\xa7\xda\x1f\xb5\x36\xca\xeb\xf6\x05\xe9\xe6\x96\xc9\x1b\x0e\x99\x9c\x5d\xbc\xbf\xea\xea\x8b\xd9\x55\x40\xcf\x6f\x5b\xcd\x7d\xbf\xd6\x36\x28\x1d\x27\xca\xe1\xf2\x47\x7a\x1b\xe5\x02\x20\xad\x48\xff\xb2\x3b\x85\x23\xdc\x59\x45\xda\xba\x03\xec\x19\xf8\x1d\xec\x7c\x71\x0d\x06\xf7\x38\x3c\xd2\x5a\xb5\x95\x03\xca\xee\x89\x45\x87\xd8\xca\x89\x00\xf6\x92\x22\x6d\x2b\x2d\xcd\xb6\xd4\x5a\x68\x8f\x82\xf9\x4c\x4f\x4a\xb1\xaa\x88\x43\x17\xea\xb5\xb2\x83\xa8\x26\x6c\xe4\x8b\x89\x72\x29\xd6\x55\x64\x71\x11\x0a\x7c\x1e\x00\x7f\x0f\x89\x6f\x50\x7f\x85\xdf\x20\x90\xf0\xde\x09\x20\xbc\x76\xc0\x40\x5a\xdf\x5f\xd7\x83\xec\x1b\x36\xb3\xe4\x3a\xed\x10\xe3\xda\xb1\x68\x8a\x39\x0a\xd3\xe9\x9e\x78\xfb\xd8\x7e\xb5\x9d\x5f\x7a\x2a\x3a\x43\x2b\x39\xc5\x4c\x19\x95\xf7\x8e\x92\x5f\xd5\x3c\xbe\xd0\x97\xf0\xc4\x69\x5d\x2b\x30\x28\xa4\x0d\x11\x94\xde\x19\x01\x15\x70\x88\x5d\xa8\xdc\xb9\x25\x62\xa7\xc4\xde\x45\x90\x74\x72\x36\xd0\xe5\xfb\x7a\x53\x3c\xbb\x1a\x83\x07\x0d\x06\x49\x3b\xe7\xa4\xd8\x26\x6e\xc5\x26\x67\x24\x9a\xb9\x84\x13\x4d\x07\x92\xad\x3f\x91\x83\xb1\x4e\x55\x9a\x07\x55\x76\x4f\xf5\x8e\x1b\x36\x62\x15\xe8\xb7\xa5\x54\xac\xe7\x78\x7b\x70\x8c\x4f\x7c\x83\xae\xe0\x06\x35\xea\x40\xac\xbb\x49\x8f\x71\x91\x9e\xf6\x02\xed\xca\xa8\x1e\x37\xcb\x77\x50\x21\xdd\x1d\xb7\x8e\x53\x75\xcd\xc8\x98\x60\x37\xa9\xa6\x16\x1c\x4c\x2e\xc1\x8d\x1b\x8c\x3a\x94\x0a\xeb\x7c\x77\x21\x0c\xae\x0d\x1a\x70\x11\xe8\x39\xcb\xec\xaa\xaa\x3c\x84\x88\xa6\x34\xde\x23\x86\x28\xcb\x73\x5e\x50\x39\xb4\x54\x3d\xe4\x0f\xbc\x4c\xd9\xc9\xe5\x64\x18\x6a\xd0\x21\xce\x1a\x4f\x52\x3b\x44\xaf\x38\xd2\xba\x6e\x49\xe5\xf0\x04\x14\xb0\x66\x37\xd2\xe8\xba\x70\xb2\x30\xa1\x5e\x69\xa9\xa0\xf7\x65\xd9\xbb\x6c\xef\x2d\xf5\x14\x30\xcc\x9c\xa9\xc4\xf0\xcc\xd5\x5a\xa1\x62\x7a\x6f\xde\xbc\x41\x53\xd8\x9b\x3f\xfd\xe9\x4f\x58\x1c\x32\x15\x89\x9c\x2f\x3f\x08\x4f\xfd\xdf\xb7\x6f\xc7\xec\xef\x27\x1f\x3f\x50\xf1\x1e\x8d\xa8\x24\xd8\x33\xac\x7b\xd8\x58\x1f\xb1\xff\xb9\xfa\xe9\xa2\x2e\xec\x11\xff\x0a\xdb\xea\xa7\x37\x66\x67\x41\xfc\x53\x68\xe8\xe2\x66\x46\x35\x19\x0d\xe3\xb7\xb7\x78\x30\x5c\x75\x11\xba\x70\x2e\x7b\x5c\x4e\x67\xae\x98\x97\x3d\x12\x19\x04\x66\x59\x95\x1c\x4d\x83\x0e\xd9\x00\xe3\xcc\xa0\x2f\x4f\x26\x61\x28\x47\x2c\x93\x77\x82\xdd\x6a\x28\xe9\x55\xc3\xff\x95\x42\x5b\xa1\x94\x4a\x58\x63\x67\xf5\xce\x68\xd1\x1a\xeb\xe1\x31\x3c\x40\xad\x8b\x08\xc5\xa6\x7b\xba\x43\x0e\xbe\x95\xb0\x8b\x5d\x2c\x29\x5e\x41\xbb\x5a\x4f\xe3\x91\x89\xc6\x7a\xe9\x47\x83\x5b\x47\x28\x01\x35\x9d\xe0\x99\x82\x62\xa4\x7e\xa7\x6b\x2e\xe6\x42\x0e\x16\x85\xd8\x3e\x95\xce\xe0\x8b\x5d\x01\x78\x91\x50\x7d\xe4\xad\x6b\xe3\xc5\xf1\x22\xae\x75\x84\xab\xc0\x6f\x54\x65\x9c\x0f\x9b\x7e\x87\x04\x6c\xa3\xdc\x12\xb5\x7c\x59\x0f\xe4\xc9\x3e\x08\xc4\x9d\x41\x4c\x63\x7f\x33\xf0\x84\x58\x94\x38\x62\x82\x27\x33\x76\x27\x16\x23\xa4\x5b\x05\x87\x6c\x1e\x2c\x21\x64\xd7\x22\xaa\x0f\x15\x54\x4a\x3b\xf5\x4b\xe6\x02\x03\x02\xee\xe3\xb2\x81\x9c\x10\xaa\x49\x5e\x22\x18\xd1\x3c\xb0\x14\x38\xac\x6a\x2a\x97\xee\xbe\xa6\xa2\x01\x93\xa5\x24\x15\x7b\xdf\x44\x6a\x9b\xe9\x4d\x6f\xae\xa3\x21\x2c\x1d\x24\xee\x56\xe5\x4b\xad\xa9\x32\x3a\x09\x7f\xf0\x42\xee\xd0\x99\x83\x88\x0a\xa8\x45\x4c\x65\x11\xe9\x59\xb7\x4a\x7e\x21\xa2\x24\x1a\x2d\x4c\x45\x4b\x83\x55\x45\xab\x3c\x13\x5a\x33\x09\x33\x9c\xf3\xf2\x4e\x38\xc0\x18\x9e\x8d\xd9\xa5\x1d\xa4\xc7\xaf\x42\x58\xe4\x7b\x2a\xfa\xca\x17\x51\x76\x90\x7d\xc9\xe1\x78\x7c\x88\x04\x7e\x45\xae\x50\x87\xf3\xd1\x0f\x53\xb7\x07\x96\x6e\x74\x10\x3f\xf2\x42\x23\x32\xb0\x15\xf9\x00\xf9\x5a\x41\x16\x9c\x99\x39\x06\xc6\x5b\x83\x28\x2d\x4f\xa7\x07\x00\x6c\x5f\xdc\xf2\x3e\xa8\xe5\xad\xfc\x16\xf1\xa7\x3f\x5a\x79\x2f\xac\xf2\x75\x48\xe5\xb4\x53\x74\xdb\xba\x63\x38\xef\x00\xb1\x3d\xef\x04\xf3\xea\x3e\xb1\x91\x12\xe4\x8e\x08\xa5\xa7\x95\x8c\x48\xa0\x4f\x99\xf8\xaa\x84\xc2\xc9\xed\xaa\x12\xae\x2e\x59\x30\x90\x97\x1d\x0d\xc5\x6a\x5a\x4f\x2d\x0d\x76\xab\xe5\xc2\x3a\x8b\x87\xcd\x4f\x17\x71\xb1\xf9\x69\xe7\x0c\x6c\x7e\x62\x85\x2d\x48\x4b\xf2\x44\x3f\x8c\xe2\x87\x25\x35\x0a\x30\xbb\xeb\x2b\x38\x66\x1f\x89\x29\xe0\x61\xe4\x37\x5a\x65\x95\xf1\x99\x4c\x2b\x38\x06\x74\xea\x10\xbe\x31\xa5\xd4\x3d\x16\xf0\x0f\xe0\x9c\x48\x96\xbb\xb2\x12\xfc\xf4\xba\xe2\x5d\xab\xcd\xfd\x66\x83\x49\x76\x58\x43\x27\x4a\xf4\x5e\x47\xd7\x81\xc7\x9d\x70\xb1\xd4\x91\x8c\x03\x91\x24\x46\xa3\x00\xe5\xc4\x15\x2a\xf4\xd4\x79\x8a\xed\xac\x36\x34\x56\x32\x4c\x9c\x5c\x4e\x7a\x69\x00\x41\xfb\x35\x3a\x40\xf8\xc4\x6f\x58\x0b\x98\xa0\x16\x10\x96\xdd\x39\xab\x67\x4e\x26\x65\x4b\x76\x9e\xbd\x18\xb9\x34\xec\xf7\x96\x58\x86\x41\xa7\x31\x86\x1e\x1a\x7b\x6a\xb2\x1a\xe0\xee\x39\xaf\x23\x5c\xe2\xe7\x2e\x72\xee\x51\x7c\x84\xf5\x68\x15\xdd\xd8\xfc\x2c\x57\xb3\x83\xc9\xb2\x2b\x28\x6d\x83\xfa\x60\xa0\x58\x16\x2a\xfd\x1e\xab\x42\xf0\x3c\x57\x58\x40\x4e\x1f\x61\x6d\x1c\x7d\x84\x0a\xa3\x95\x22\x02\x5f\x71\x19\x98\xdc\x7b\xcb\x0d\xbd\xaa\x1c\xed\x52\xe7\xc8\x6e\x20\xcc\xfc\xb2\xeb\x2e\xb2\x1d\xcb\x16\xb1\x80\x35\xf5\x2b\x84\x12\xed\x29\xf5\xe4\x36\x50\x27\x33\x31\xe7\x88\xe1\xe7\xa6\x67\xa9\xcc\x43\x29\x8d\x11\x88\xa5\x24\x4a\x28\xea\x7a\x14\xf9\x0c\x0e\xee\xdf\x1e\xf4\x29\x07\xb3\x63\xc5\x1e\x56\xef\xc2\x00\x8b\x71\x19\x89\x6c\xf6\x5c\x83\x2e\x91\x01\xf0\x66\xde\x30\x48\x58\x06\x73\x8f\xab\xb7\xf7\x89\x0f\xa1\x47\xf5\xd5\x9f\x8e\xbc\xc0\xf0\xa2\x3f\xbd\xe8\x4f\x83\xe8\x4f\x01\x63\x71\x04\x67\x85\x2e\x15\x06\x0c\x3b\x85\xaa\x4e\x64\x0a\x00\x78\xec\xd1\x74\xaa\x94\x2a\x63\x8b\x9b\xd5\x87\x0e\x9d\x82\x45\xe7\xb8\x32\xb7\xa3\x3f\x33\x91\x27\x2a\xc5\xcd\xb7\xfd\x97\xda\x80\x68\x53\xeb\x24\xe1\x58\xe6\xee\x5d\xa1\xd5\x0e\xfa\xee\xbb\x75\xbd\xe8\x80\x73\x05\xbe\x1f\x88\xc1\xd7\x6c\xdd\x27\x13\xd3\xf4\x3d\xd6\x00\xf1\xf7\xda\x09\x89\x65\xa5\x7d\x09\x7b\xa8\x52\xfb\x0a\xbf\x1c\x27\x45\x75\x44\x0f\x8c\xe7\x62\xae\xca\xc5\x91\x7f\xc8\xfe\x18\xb5\xa2\x27\x5e\x83\x4c\x90\x54\xa5\xd5\x00\xb3\xc5\xd7\x2a\x1d\xb8\x05\xda\xb3\x70\xe0\xf7\xa9\x5b\xd1\xa0\xf0\x13\x1f\x89\x1a\x54\x0c\xf4\xfb\xba\x88\xd2\xad\x87\x3c\xd4\x47\xb5\xda\x69\xbf\x15\xf9\x3d\xbb\xe7\x65\x8b\x48\xbc\x55\x9f\x1d\xe5\x81\x54\xde\x4b\xdd\xaf\xde\x61\x63\xea\x57\xc4\x34\xd0\xae\xa3\x2a\x53\x54\x86\x28\xa5\xbb\x15\x2e\x65\xde\xdf\x86\x86\x50\xf4\xf6\xa0\xd7\x30\xbe\x9a\xfa\xc2\xf8\xe9\x59\x65\x18\x3f\xbb\xd6\x1a\x8e\x7b\xe9\x7d\x6c\x06\xad\x1c\xee\x3e\xee\x58\x0c\x71\x0f\x6b\x16\x59\xe3\x3c\x38\xe1\x74\x4f\x17\x0d\xc3\x4d\x7a\xd9\x6d\x08\xa1\x7e\xb5\xc9\x86\x7e\xfc\x0d\x5b\x6b\x86\xf5\xd9\x52\x7e\xe1\xef\xdc\x61\x7b\x45\xf5\x0c\x5e\xbc\xb5\xad\x8e\xe0\x8b\xb7\xf6\xc5\x5b\xfb\xe2\xad\x7d\xb1\x36\xbc\x58\x1b\x5e\xbc\xb5\xec\xc5\x5b\x3b\xc8\x1a\x0e\xe7\xad\x45\x51\x6f\x95\xcf\x96\x84\xbd\xda\x61\xbb\x57\x7f\x2d\x15\xee\x39\x49\x12\x55\xe5\xe6\x5a\xdd\x89\xd6\x4e\x87\x86\xfc\xbf\xd4\x0f\x00\x20\xac\xd1\x07\x96\x1f\xde\x9b\x72\xd0\x5d\x2a\xe9\x24\x5b\xf4\x91\x2a\x78\x95\x4a\x2b\xf9\xf7\x3e\x66\xae\x83\x10\x9c\x28\x4f\x45\x5a\xff\x40\x57\xd9\xd8\xb5\x1e\xb3\x13\x56\x8a\x44\x16\x92\xca\xc8\x73\xfc\x1e\x0f\x9e\xaf\x8d\x20\x8d\x16\xd9\x2d\x61\xd4\xe7\x61\xad\x9f\x5a\x7e\x27\x3a\xb8\xf2\x35\xc8\xa1\x94\x43\x32\x77\xb5\x90\x4a\xf1\x6f\xc7\xda\x68\x34\xd7\x61\x0f\xa1\x79\x05\xa6\x12\x95\x18\x82\x97\x15\x92\x12\xac\x1f\xfb\xfa\x8b\x2f\x85\x2c\xe1\xf0\x5e\x89\x44\xe5\x6d\x6a\xaa\xae\xd9\xa0\xa5\x9e\x6a\xfe\x04\xb6\x51\x91\xb2\xb4\x2a\x7d\xcd\xd4\x7b\x9e\xc9\x54\x9a\x85\xf7\xda\x51\x79\x2d\x8e\x37\xc6\x6f\xa3\xae\x97\x91\xf1\xa2\x28\x15\x4f\x66\x42\x07\x6f\x43\x01\x85\x92\xc8\x7c\xec\x3b\x96\x80\x03\x19\x05\xda\x58\x06\x99\x2d\x58\xa9\x8c\x73\xbc\xaf\x79\xe1\x75\xd0\x19\x34\x47\x2e\x67\xca\x05\x78\xe7\x55\xd8\x05\x8e\x4a\xde\x86\x7f\x68\xa6\xb2\xd4\x41\x98\xfc\xf9\x8d\x15\x0a\x13\x3a\x83\x96\xf8\x01\xc0\x85\x51\x2c\xb3\x0c\xdb\x12\xc4\xf5\x8d\xbf\xf9\x96\xcd\x54\x55\xea\x71\x08\x3a\xf0\x16\xbe\x43\xfd\xce\x09\x95\x86\x65\x82\x6b\xc3\xde\xbe\x61\x73\x99\x57\x96\x4f\x75\x3e\x36\xdd\xe5\xa0\x40\x02\xfa\xee\xdb\xd6\xed\xba\xca\x3e\x6b\xa5\x9e\x02\xb1\x91\x49\xf4\xa1\x9b\x84\x89\x71\x88\x2c\xde\x10\x84\x88\xe8\x86\xab\x9d\x1b\xf5\x08\xf7\xeb\xd7\x4a\xdd\x2c\x4c\x97\x24\x4a\x6a\x11\x67\x4f\xfe\x8d\xbe\x6c\x03\x9e\x52\x63\xa7\x6c\x7c\xe9\xa3\x54\xb8\x98\x4a\x6d\xb6\xd4\xb7\xa8\xf3\x2b\x37\x3e\xd6\x9e\xad\x4c\xad\x76\xd0\x31\x57\x06\xda\x38\x89\xd8\xd9\x96\x92\x44\x60\x31\xcb\xb3\xba\x52\x52\xae\xf0\xd9\xad\xdd\x3f\x31\xe0\x98\x3b\x20\x03\xa0\xa6\xb7\x9c\x6a\x3b\xa1\xcb\x1d\x89\xce\x73\xc5\x66\xf1\x2d\xd0\x32\x9f\x22\xc8\xf9\xbc\xca\x8c\x2c\xb2\x7a\xde\x9f\x5c\x03\x22\xe4\xa1\xcd\x8d\x07\x66\x22\x8e\x89\xc5\x88\x36\x05\xf6\xc9\x57\xbe\x2f\x91\x1b\xc4\xea\x2e\x2d\x3f\x28\x78\xc9\xfd\xe2\x41\x25\x5d\xfd\x9a\xcc\x77\x1c\x3c\x8a\x04\x87\x69\x5b\xf1\xac\x1e\x71\xe0\x45\x1a\xf2\xd0\x18\x91\xf3\xbc\x85\xa9\x3a\x86\xe7\x82\x46\x4c\x3d\xf8\x60\x32\x2c\x83\xd2\x38\x2d\x24\xd4\xbc\xe3\xc9\x9d\xc8\x53\x2c\x1a\x05\xd3\x4e\x17\x39\x9f\x13\xda\x56\x50\x8f\xbb\xd1\x5e\x1f\x91\x61\x02\xd3\xf7\x5c\x9a\x31\x72\xdd\x21\xd7\xa0\xd2\x9d\xa1\x6c\x6c\x93\x6d\xf7\x5c\xa3\xc9\xa6\x94\xf7\x89\x70\xfc\xdf\xb6\x1b\x72\xe8\xf7\x2d\x72\xe9\x97\x06\xef\xb6\x27\x38\xbf\x40\xee\xbd\xe5\x1c\x40\xb5\x78\x66\xaf\xf6\xc2\xe7\x8c\x36\x36\xf7\x66\x31\x6c\xd5\x9b\xf2\xa6\x4b\xe6\xef\x61\x79\x93\xc6\x97\xf8\x13\x4f\x95\x66\xef\x32\x95\xdc\xb1\x33\x01\x42\xd7\x63\x96\x67\x29\x6f\xd2\xa7\x84\xf0\x9e\xf3\xe9\x36\x3f\xdb\x88\xcd\x55\x2e\x8d\x2a\x37\xd3\x8b\xfd\x95\x9d\x7c\x81\x7b\x5e\x8b\x50\x65\x4f\xf3\x73\x06\x7b\xb6\xc7\xad\xeb\xc6\x43\x23\xaf\x9e\xc1\xed\xc4\xaf\xa8\x0a\x58\xcf\xbb\xf6\xc7\x99\x7a\x18\x19\x35\xaa\xb4\x18\xc9\x16\x0e\xdd\x0e\xd3\xbc\x13\x0b\xf0\x62\x77\x9c\x28\x35\x8b\x74\x06\xa3\xc0\x02\x05\xdf\x5b\xce\xfd\xe9\xdd\xd9\x67\x2d\xca\x71\x28\x03\x1e\x0b\x93\x1c\x27\xa2\x98\x1d\x53\x0f\xcf\x72\x51\x1c\x11\xe9\xba\x2a\xae\x1d\xb2\x99\x44\x65\x19\x25\x66\xab\x5b\x76\x2a\x8a\x99\xef\x78\xdf\xb3\x7e\x3a\x44\xe0\x42\xa9\xae\x40\xa8\x87\xb6\x4d\x7c\x89\xe0\x1b\xbc\x43\xc1\x61\x2a\x6f\xba\x15\xa1\xd8\xd7\xf1\x79\xd6\xa5\x36\x1f\x71\x71\x1e\x17\x4e\xf9\x30\xc2\x53\x0e\xe3\x3d\x63\xb0\x64\x17\x31\x12\x91\xa0\xc9\x2d\x0a\xdd\xa9\x48\x99\xba\x17\x65\x29\x53\xa1\x99\xa7\x41\xa1\x96\x2a\xb3\x7d\xaf\xdb\x0b\x6e\xf3\x93\xe3\x36\xf7\x50\x87\x0e\x41\x1f\x8a\xc8\x14\x7c\xb3\x44\xa6\x78\x3a\x97\xf9\xb3\x23\x54\x3a\xe1\x99\x98\xfc\xd4\x41\xff\xa0\x16\xb1\x0a\x72\x45\x5f\x06\xf8\x69\x5b\x50\xc9\xfe\xea\xcf\x0d\xcb\x55\xba\xcd\xa4\xfa\x08\x8a\xc4\x94\x1b\xf1\xb0\x95\x1d\x8e\x6a\x42\xb5\xfd\x49\x10\x4e\x9f\x52\xe5\x78\x16\x18\x81\xc1\x99\x47\xd0\xb3\x21\x99\x2a\xed\x5a\x57\xe3\x24\xb6\x0a\xe1\x77\x9b\xa0\xbb\xee\x04\x9f\x5c\x4e\xd8\x0f\xf8\xf8\xb0\xe8\x85\xa5\x32\x28\x06\x9e\xa9\x39\x97\x5d\x8b\x6c\x34\x9b\x37\xd1\x57\xc3\x29\x5c\xfa\x67\x19\x3d\x1c\x14\x70\xb9\x95\xd3\xca\xea\x74\xa4\x87\x3d\x2b\x80\xb9\x25\xd1\xe5\xf9\x02\xcc\xed\x5e\x0d\x22\x30\x39\xb9\xb8\xc8\x5a\x62\x71\x5b\x09\xac\xc4\xfb\x40\x99\x16\xb9\x96\xe0\x90\x09\xbc\xe2\x54\xe9\x0f\x4b\x4b\x62\x10\x24\x8a\x38\x47\xec\x83\x9a\xca\xdc\xdd\x5e\x45\xfe\xba\x5b\x2e\xb3\xb6\x8b\xf1\x22\x93\x3c\xb9\x4c\xa2\x75\x76\x9e\xf3\x9b\xac\x4d\xb8\x41\x7c\xd4\x7c\x43\xf6\x3e\xe3\x53\x26\xe0\x8f\xe3\x54\x6a\xfb\x2f\xbb\xba\xfa\x00\x46\xf8\x2a\x77\x12\x33\x18\xa8\x89\xf6\xf9\x24\x05\xbc\x88\xc3\xde\x1d\x24\x3d\x3d\xd0\xff\x82\x96\x4c\xe6\xa9\x1d\x78\x50\x0a\x0e\x83\xa4\xe0\x09\xc4\x43\xf4\x31\xbf\x18\x36\x70\x23\xd8\xf5\x4c\x26\x77\x97\x81\xdd\x5d\x95\xf6\xbb\x3c\xf8\x2a\x62\x60\xcd\xdf\x86\xa4\x96\x34\xd4\xcb\xee\xaa\x71\xd0\xd2\xf1\x01\x47\x30\xae\x68\xfe\xf0\x1b\xd7\x5a\x25\xb2\xf6\xb9\x80\x8d\xa6\x66\x0e\x29\x30\x87\x61\xe7\x04\xe2\x41\xd7\xe9\xa0\xfc\xb1\x82\xa3\xb9\xdd\x74\xd5\x71\x75\xc8\xc1\x64\xee\x66\x3d\xe8\x14\xf0\xcc\xf4\x80\x46\xaf\x1b\x2e\x43\xa3\x3b\x61\xb8\xe1\x58\x70\x61\xea\xb4\x79\x4e\x10\x73\xb5\x39\x97\xb6\xcf\x43\xa4\x13\x34\xe1\x60\x13\x6f\x93\xb6\xb1\x4a\x0d\x6f\x78\x13\xf1\x3b\x72\x35\xc0\x9d\x2b\x54\x51\x65\x18\xcf\xb1\x3b\xbe\xbb\xb3\x19\xe3\x7b\x06\x72\x3d\xec\x03\xb5\xf4\x30\x0c\xec\xed\x1e\xe9\xfc\xdb\xc0\x2e\x0d\x84\xbb\x37\xdf\x7d\xfb\xed\xd7\x8e\x66\xda\x56\x05\x7f\x0c\x38\xd3\x96\x26\xda\x15\xf9\x45\x93\x97\xfc\xa2\xdf\x6f\x7e\xd1\xe3\xa3\xd0\x0e\x9c\x41\xd4\x31\x36\xb7\x5b\x5c\x6e\xfb\x1c\xa1\xd6\xd1\xbb\x5d\x23\x77\x3b\x64\x01\x0d\x9b\xfb\xd3\x39\x96\xb5\x4b\x9e\xcf\x4b\x76\xcf\x6f\x35\xbb\xa7\x4f\x2c\x6b\xf7\x4c\x9e\x2e\x31\xac\xbf\xc5\xac\x9d\x0e\x97\xb3\x7d\x76\xc9\xce\x39\x25\xdd\x41\x00\xbb\xdb\xd3\xfa\x14\xa4\xaa\x5b\xae\xd4\x20\x5d\x52\xb9\xc3\x1e\x3b\x3c\xd4\x01\xb4\x98\x51\xf6\x06\xee\x45\x21\x61\x1d\xb4\x31\xec\x5e\x75\xa9\x0d\x49\x6d\x7e\xba\x6a\x38\x66\xfc\xd7\x4f\xe3\x8f\xf9\x3d\x38\x3c\x5e\x6a\xba\x7c\x25\x26\x77\x1d\xa1\xb5\x38\x6b\x05\x90\x00\x60\xe4\xea\x26\x44\x89\xac\xaf\xce\xc9\xe5\xc4\xea\xe0\x90\x46\xc4\x33\x3d\x66\x2b\xf8\xbc\x33\x97\x92\x5c\xe0\xf8\x3b\x37\x46\xcc\x0b\xd3\x7e\xd7\x5f\x2c\xee\x4f\x6e\x71\x1f\xd0\x02\x38\xab\xe6\x3c\x1f\xd9\x1b\x05\x36\xf7\xc8\x5b\xd7\xa0\xcc\x63\x46\x77\x07\xd9\x13\x58\x40\x20\xb9\x20\x2e\x6c\xcc\x83\x32\x97\x8f\x63\xf6\x84\xbe\x7b\xcf\x1c\xf9\x6a\xe3\xa6\x25\x6a\x29\xe0\x95\xa6\xe3\x57\xc1\x5d\xaa\x80\x39\x47\x6a\xb8\x99\x09\xe4\xe1\x97\x90\x90\x53\x3f\x15\x4b\xd2\x28\x4a\xf3\x2c\x53\x0f\xf8\xee\x90\xaf\xd9\xd5\xb7\x63\xa1\x4c\xb3\x1b\xc1\xe6\xd2\xea\xe8\x64\x60\x0d\x87\x83\x2e\x53\x2b\x91\x8b\x12\x05\xde\x92\x9c\x6d\x57\xc2\xd0\x46\xc1\x46\x5b\xfd\x36\xc7\x80\x70\xfb\x7f\x17\x55\x04\xef\x76\x34\xe1\x46\xcc\xf8\xbd\x54\x55\x89\xad\x8d\x62\x07\xf4\x13\xf0\x86\x85\xaa\xbc\xbd\x0b\x8b\x61\xfa\xd9\xe9\x15\xeb\x74\x51\xff\x08\xaa\x40\xaa\x9c\x69\x62\x24\xbe\x48\x6d\x96\xe7\xe2\x96\xc8\xc1\xe0\x0d\x75\x6e\xee\x75\x61\xd9\x42\xe7\xaa\x76\x51\xbb\x58\x5e\xb9\xbf\x82\x9f\xbe\xa2\x9a\x76\x5b\xd1\x5d\xf7\x26\x02\xfd\x0e\xc5\x1f\xef\x09\xcb\x64\xb2\xe8\x5c\xee\xad\xd1\xda\x11\x6d\xed\x7d\x68\xf6\x7b\xf6\x8e\x6b\x91\xb2\x8f\x3c\xe7\x53\xd4\xf7\x5e\x5d\x5d\xbe\xfb\xf8\xda\xee\x2b\xe8\x93\x93\xb3\x95\x8e\xb6\xab\xb0\xf3\x8b\x21\xf3\x45\x96\x26\xde\x83\x55\x2d\xb5\xef\x39\xf9\x41\x13\x61\x98\xe7\x43\xed\xc0\x7a\x57\xb0\xa0\xcb\x66\x0a\x6b\xb3\xe6\x67\x83\xc0\xdc\xcf\xd3\x1d\xab\x7c\xca\x5c\x1b\x9e\x65\x97\x19\xcf\x4f\x8a\xa2\x54\xf7\xab\xb5\xf1\x68\xac\xee\x41\x37\x52\x0c\xf3\x70\x5f\x16\xb8\xf4\xe0\xc2\xce\xd9\xa4\xee\x7f\xcc\x26\xc6\x6b\xe1\x2a\x07\x96\x7a\x70\x52\x19\x35\xe7\x46\x26\x07\x56\x59\x3f\xf8\xc8\xf3\x8a\x67\x2b\x83\xae\x36\x4e\x63\x9d\x88\xb8\xb1\xd1\x7a\xe8\xba\x16\xcd\x36\xca\x1a\x9b\xdb\x1b\x5e\x5a\xea\x74\x7a\xf5\x73\xa7\xb6\xda\x70\x53\x2d\x51\xe1\x0d\x9c\x61\x3d\x2f\x18\xb1\x8c\x6b\xf3\xb9\x48\xed\xa5\x6f\xfc\xba\x89\xe0\x27\xdc\xf0\x4c\x4d\x7f\x14\x3c\x5b\x7d\xc2\xa3\x73\x72\x1a\x3e\xed\x0c\x50\xe4\xf0\xaf\x6e\xfc\x83\x87\x9a\x59\x01\xdb\xe5\xc0\x97\x22\x13\xf7\x3c\x37\xae\x39\x16\x57\xd7\x87\x34\x7f\x38\x45\xb2\x36\xbe\xa6\xc2\x88\x72\x2e\xf3\xb8\xcf\x2b\x78\xf6\x54\xe5\xa9\x44\xb3\x23\x18\xd4\xb0\x45\xdc\xef\xfa\xa3\xb6\xce\xd3\xb0\xc1\xb7\x10\xa3\x6b\x06\xe3\x89\x97\x02\x1f\xbb\x21\xf9\x72\x86\x5f\x82\xa7\x3d\x1a\xdb\xd2\x4a\xb1\xbb\xdc\x0a\x86\x80\x23\xb2\x9a\x6c\x6d\x95\x13\xb6\xc9\x07\x23\xb7\xc7\x38\x84\xf5\x81\xa3\x23\x1a\xf7\x3a\x1f\xc4\xa6\x23\x86\x9f\xed\x92\x45\x73\x28\xeb\x69\xea\xaa\x73\xe7\x9b\x61\x26\x4b\xa3\x20\x7f\xf4\xd0\x7a\x1e\xd0\x4a\xf0\x6a\x27\x23\xb5\x45\xb5\x8f\x69\x6d\x8d\xc1\xbe\xa4\xca\xb6\x90\x18\xb7\x32\xad\x96\xe0\xf2\xb1\x62\x3d\xa1\xf8\xbf\x92\x54\x11\xce\x0a\x29\x10\xfc\x84\xe7\xb4\x58\xc0\x59\x04\x4f\xe9\x4b\xcb\xc1\xac\x4a\x08\xbf\x1d\x91\x33\x1c\x8d\xcb\x14\x6b\xe1\x0c\xd4\x1c\xc1\x3f\xc0\x71\x71\xfc\x83\x22\x23\x2f\x25\xe9\x5a\x1a\x00\x9c\xfc\x88\xe9\x2a\x99\x31\xae\xed\xd0\xec\x81\xb6\x37\x5e\x8c\xe7\x3c\x97\xb7\x42\x9b\xb1\x47\x09\xd6\xff\xf8\xe6\x9f\x63\xf6\x5e\x95\x8c\x02\xd5\x8f\x1c\xaa\x06\x8d\xb3\x3e\x17\x52\xe3\x64\x7c\xdb\x5a\x6b\x2d\x54\x4a\x83\x7e\x80\xc1\x1a\x7e\x67\x79\x18\x0e\xb6\x12\xe0\xba\xf8\x9e\x1d\x58\x31\x31\x78\xf5\x7f\x2c\x5b\xfa\xef\x01\x7b\xf5\x00\x4c\xfb\xc0\xfe\x79\x80\x2f\xf4\x61\x93\xa1\x52\x5d\xbf\x18\x93\x25\x4b\x39\x9d\x8a\x12\xd5\x47\x06\x49\x85\xaf\x09\x15\x24\x57\xc1\xc3\xce\x29\x5d\xab\x9b\xcd\x81\xfc\xe3\x9b\x7f\x1e\xb0\x57\xf1\xbc\x98\xcc\x53\xf1\x85\x7d\x83\xd6\x65\xa9\xed\x1c\x5f\x93\x33\x47\x2f\x72\xc3\xbf\xd8\x3e\x93\x99\xd2\x22\x47\x55\xde\x28\x36\xe3\xf7\x82\x69\x65\x35\x60\x91\x65\x23\xb2\xa5\xb3\x07\x0e\x48\x2d\x6e\x29\x21\xb1\x9e\x15\xbc\x34\xd1\x91\x18\x93\x85\x04\xde\x66\xb7\x6d\x9a\x3b\xcf\xf4\xad\xcc\xc9\x7f\x45\x9e\x33\xbb\xe7\x90\x18\x8a\x9b\x64\x14\x4b\x66\x3c\x9f\xfa\xdc\xf4\xdb\xca\x54\xa5\xd8\xe2\xfa\x69\x79\x07\xee\x64\xde\x29\x85\xf9\xaf\x32\x6f\x06\x15\xac\xb6\x2b\x4d\xa5\x71\x59\x11\x14\xab\x68\x16\xc7\x76\x17\x4a\x79\x53\x19\x55\xea\xe3\x54\xdc\x8b\xec\x58\xcb\xe9\x88\x97\xc9\x4c\x1a\x91\xd8\x69\x1d\xf3\x42\x8e\x12\x95\xdb\x1d\x07\x54\x86\x79\xfa\x47\x28\x6f\x3a\xb2\x43\xdd\x82\x3a\xdd\x72\xd2\xdb\x8d\x6a\x4f\x6a\x4c\x1b\x6c\x8e\x2d\xec\x41\xcb\x13\x45\xdb\xcc\x1e\x66\x0b\x86\x90\xe3\x41\x26\xeb\x40\x93\xbb\xf3\x98\x43\xc2\x01\x4f\x9a\x7d\xd8\x6b\x87\x01\x24\x70\x2b\x23\x4a\x39\xe7\x29\x92\x52\x9e\x2f\x1e\xfd\xf0\xdb\x25\x05\xb8\xfc\x64\x31\x82\x2e\x54\x36\xe2\x79\x6a\xff\x8f\x09\x3b\xc9\x62\x90\x35\xac\x64\x27\x42\xf0\x79\x72\xb6\x9f\x2b\x51\xc9\x01\x6e\x3d\xc9\x6b\x2d\x85\x28\x14\x55\x31\x50\xa3\xac\x84\x63\x9a\xb1\x80\x2a\xb5\xeb\xf5\xff\x91\xff\xc5\xa3\x9d\x6d\x13\xa9\x36\x7b\x4d\x02\xd9\xb1\xe5\x78\x3f\xd4\x2d\x42\x9b\x1c\x04\x5e\x71\x6d\x08\x5a\xcb\x61\x10\x44\xd3\x70\x0a\x0a\x30\x98\xf5\x8e\xe1\x56\x67\xc8\xc5\x0b\xd8\x81\x8c\x56\x62\x2e\x25\x5e\x29\xd9\xae\x40\xd5\xfa\x4b\x54\x07\x0d\x27\x65\x84\x36\x8c\xdf\x73\x99\x81\x75\x5e\xdd\x68\x51\xde\x63\x41\x2a\x82\x1a\xe4\x4d\x3d\x8b\x6a\x4e\xa0\x18\xb5\x27\xcd\xc7\xcd\x61\x79\x57\x36\x4d\x00\xb4\xa1\xc6\xe8\xd7\x8e\x7a\x10\xbd\x07\xd5\xcb\xb5\x3f\xdb\x37\xf4\x54\x63\xec\xf9\xfb\x51\xf0\xd2\xdc\x08\x6e\xae\xe5\x26\xbe\xbb\x74\xa4\xa3\x76\xbe\x94\xbb\x3f\xd0\x0f\x82\x4d\x95\xb1\x22\x56\x05\x67\x1f\x65\x52\x04\xf5\xf1\x07\xed\xb1\x4f\x74\x3d\xcb\xeb\x92\x43\x8a\x8f\xca\x3b\x4e\x33\x6e\xb8\x3c\x4f\x92\x8e\xe9\x24\x19\x7c\x1a\x81\x34\x54\x2e\x68\xef\xd0\x9b\x01\x14\x68\x3f\x53\x9e\x0b\xad\x37\x02\x6c\xc4\xd1\x85\xf8\x34\x5e\xe5\x86\x6b\x6d\xee\x7e\xc3\xb4\x10\x2b\x40\xa7\xc2\x70\x99\xb9\xab\x8c\x4b\xe1\x57\x69\x1b\x75\xdd\x38\xc1\x52\x70\xbd\x49\x40\x88\x46\xfd\x09\x1e\xc6\x41\xab\x5c\x8c\x1e\x54\x99\xb2\x53\x3e\x17\xd9\x29\xd7\x82\xfa\x0a\x53\xf4\x70\x8f\x0e\xf5\xa0\x43\x5e\x6d\xfb\x5a\x33\x64\x34\xfe\xd4\x26\x61\xf8\xab\x56\xb1\x70\x80\x47\xce\x04\x79\x5d\x56\xe2\x88\xbd\xb7\xdc\xeb\x88\x7d\xce\xef\x72\xf5\xb0\xdb\x58\xcd\x46\x2f\x48\x34\xd2\x30\xfc\xc3\xc1\xea\x44\x06\x1f\x3f\xdc\x9e\x23\x22\x82\xbf\xc6\xd4\x18\x33\x1b\xff\xa8\x1b\x91\xfd\xef\x92\x09\xca\x2a\x8a\xa5\x9a\x96\x42\x23\x72\xcd\x4a\x90\xc4\xb6\x26\xe7\x1f\x44\x4e\xc9\x7d\x5b\x87\x37\x59\xd5\xca\x8d\xd4\xf1\xb5\x69\xfd\x0b\xed\x37\xbd\xac\xc8\x56\x8a\x1a\x9b\x23\x02\x83\x81\xae\x31\x3e\xad\x1b\xe1\x6a\xa3\x53\xc0\xf5\x82\x67\x51\x28\xd9\x64\x1d\x75\xb3\x3b\xbd\xfa\x79\xfd\x62\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb3\xd4\xae\x06\xa9\xad\x77\x66\xab\x11\xea\xc5\xfc\xf4\x62\x7e\xfa\x9a\xcc\x4f\x5b\x4f\xfc\x26\x93\xd3\xd7\x61\x6c\xda\x3a\xc5\x4d\x06\xa6\x67\x69\x5a\x6a\x35\xa3\x8d\xe6\xa4\x67\x6b\x48\xda\x3a\xb5\x96\xc6\xa3\xdf\x8f\xd9\x68\xeb\x8a\x6d\x30\x15\x3d\x43\x23\x51\x1b\x81\x4c\xa4\x6d\xc4\xc4\x49\xf0\x70\x28\x28\xd6\xe5\x2c\x7d\x77\x2e\x28\x27\x14\x67\xfa\x4a\x8b\x56\x80\xdb\x3a\xb6\x43\x1a\x5c\x7b\xd9\x8b\x04\x46\x2a\xf6\xb8\x34\x58\x76\x76\x7e\xf9\xe9\xfc\xf4\xe4\xfa\xfc\xac\x29\xdf\xad\x5a\xe9\x2d\x92\xd8\x66\x1b\xc4\x28\x90\xc4\xd6\x3c\x60\x09\xf2\x9a\x9f\xec\x19\x58\xf3\x53\x55\xc9\x55\xad\x76\x97\x0b\x77\xe2\x72\x3b\xf1\x8f\xed\xb7\xb3\xed\xf5\xfc\x8c\x81\x53\x9c\x62\xce\xac\xdc\x33\x53\x59\xaa\x5d\xdc\xea\xe4\xcc\x67\x52\xc9\x3c\xc9\xaa\xd4\x0a\x17\x9f\x3f\x4f\xce\xf4\x98\xb1\x77\x22\xe1\x95\x06\x2b\x4c\xaa\xf2\x43\xc3\x7e\xba\xf8\xf0\x77\x88\xc7\x86\x27\x8e\x3c\xae\x09\xa0\xf2\x4a\x8e\xc0\xc2\x06\xe1\xda\xd8\x3b\x81\x82\x0a\xbc\x39\xe1\x85\xa5\x62\x1a\x2b\x57\x18\x90\x45\x66\x22\x2b\x2c\xc5\xbc\x13\xac\x46\x50\xb5\x1d\xd7\x15\xe6\x5d\xf8\xe4\x54\x18\xcc\xba\xda\x14\x21\xb9\x71\xd5\xb6\x58\x5c\x77\xb0\xb5\x46\xea\x23\x69\xe3\x0f\x5c\x93\xc5\x6a\xe5\x68\xb7\xec\xef\x76\xfb\xcc\x7a\x13\xc7\x1a\xe3\x06\x92\x67\xf8\x6b\x69\xcc\x76\xb0\xb5\x1d\x03\x83\x48\xa4\x69\x6d\x4d\x5d\x1f\x06\xb4\xba\x0e\xc0\x92\x2d\x43\x34\x17\x39\x7a\xb1\x8f\xc8\x0e\x86\xdc\x6e\x2c\x50\x44\x24\x8d\x6a\x7f\x52\xfc\x5c\xfc\x5d\x75\xe3\xab\xbf\xd6\xe3\x25\x8b\x0c\xfb\xcf\x7f\xff\xf0\x87\xff\x0d\x00\x00\xff\xff\xab\x25\x1f\x94\x2d\xcc\x0b\x00") -func olmManifests0240CrdsYamlBytes() ([]byte, error) { +func olmManifests0250CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0240CrdsYaml, - "olm-manifests/0.24.0-crds.yaml", + _olmManifests0250CrdsYaml, + "olm-manifests/0.25.0-crds.yaml", ) } -func olmManifests0240CrdsYaml() (*asset, error) { - bytes, err := olmManifests0240CrdsYamlBytes() +func olmManifests0250CrdsYaml() (*asset, error) { + bytes, err := olmManifests0250CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.24.0-crds.yaml", size: 755252, mode: os.FileMode(420), modTime: time.Unix(1678830331, 0)} + info := bindataFileInfo{name: "olm-manifests/0.25.0-crds.yaml", size: 773165, mode: os.FileMode(420), modTime: time.Unix(1687806535, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0240OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\x1b\xb9\x11\xff\xae\xbf\x62\x20\x14\x70\x5b\xdc\xea\x11\xcb\x89\xb3\x40\x80\x73\x9d\xdc\xe5\x50\xdb\x11\xec\xa4\x5f\x0e\x87\x82\xe2\x8e\x56\xac\xf9\xd8\x23\xb9\x52\x74\x45\xff\xf7\x82\xcb\x7d\x8b\x92\x65\xc7\x77\x29\x8a\xf0\x8b\xa4\xe5\x0c\x67\x38\x1c\xce\xe3\xa7\x8d\xa2\x68\x40\x32\xf6\x0f\xd4\x86\x29\x19\xc3\x7a\x3a\xb8\x67\x32\x89\xe1\x86\x08\x34\x19\xa1\x38\x10\x68\x49\x42\x2c\x89\x07\x00\x92\x08\x8c\x41\x71\x31\x00\xe0\x64\x81\xdc\xb8\xa7\x00\x99\x4a\x22\x83\x34\xd7\xcc\x6e\x47\xf7\xf9\x02\xb5\x44\x8b\x66\xc4\xd4\x18\xe5\x52\x69\x8a\x31\x68\x34\x56\x33\x6a\x31\x39\x92\x25\x5a\x57\x5a\x71\x62\xd1\xd8\x87\xd8\x48\x9e\x30\xfb\x18\x39\x05\xc3\x63\xa5\x6c\x88\x96\x8f\x11\xe2\xe8\x77\x64\x3c\xcd\xec\x19\x6a\x62\x95\x36\x4f\x30\xfe\x82\x18\xe4\x4c\xe2\x37\xd3\x3b\xd3\x7b\x5b\xdf\xa1\x5e\x33\x8a\x17\x94\xaa\x5c\xda\xfe\x79\x04\xdd\x3e\xaa\xce\x20\x32\x9e\x99\x94\xcc\x9e\xa6\x38\x39\x7f\x3f\xfa\x27\xac\x17\x84\x8e\x48\x6e\x57\x4a\xb3\xdf\x88\x65\x4a\x8e\xee\xcf\x0b\x2d\xeb\xb3\xbf\xe4\xb9\xb1\xa8\x6f\x15\x0f\x9d\xbe\xd9\x1a\x8b\x22\xa6\x4a\x5a\xad\x38\x47\x1d\xd7\xba\x70\xb6\x44\xba\xa5\x1c\x23\x41\x24\x49\x51\x0f\x74\xce\xd1\xc4\x83\x08\x48\xc6\x7e\xd4\x2a\xcf\x4c\x0c\x3f\x0f\xff\x3a\xfc\x65\x00\xce\x7e\x2a\xd7\x14\x5b\x8f\xd6\xa8\x17\xf5\xcf\x08\xa4\x92\xb7\x25\xd1\xa7\xdb\xab\xbd\x74\x5f\xb4\xc3\xbf\x31\x99\x30\x99\x3e\x64\xe6\x85\x27\x8b\x9c\x49\xb5\xe2\x78\x8b\x4b\x47\x59\x6d\xeb\x80\xd4\x01\xc0\xae\x59\x9f\x64\x4c\x93\x2f\xfe\x85\xd4\x16\xf6\x0c\x7a\xce\xb3\x38\x48\x7d\xbb\x47\x54\x69\x54\xee\x43\x34\x96\xfb\x70\x75\x7d\xa9\xe4\x92\x85\x0c\x46\xfd\x06\x77\x56\x24\x59\x66\x9a\x15\xde\x62\xc6\xd5\x56\xa0\xb4\x0f\xd8\x7c\x57\xd5\x6e\xb8\x21\x59\xd6\x63\x30\x19\x52\x37\x67\xac\x26\x16\xd3\xad\xa7\xb3\xdb\x0c\x63\xb8\x55\x9c\x33\x99\x7e\xca\x12\x62\xb1\xf0\xbe\x8c\x33\x4a\x4c\x0c\x53\xc7\x81\x1c\xa9\x55\xda\x73\x08\x62\xe9\xea\xaa\x25\x2a\x24\x0c\xc0\xa2\xc8\xdc\x65\x2e\x99\x5a\x9b\x71\x83\x77\xf8\xc3\x2b\x00\x54\x2a\x17\xdf\xcb\xe8\x71\xa9\xa4\xc5\xcf\xb6\x61\xd5\xb9\xbc\x30\x37\x4a\xde\x2a\x65\x63\xb0\x3a\xc7\x7a\xca\x20\xa5\x4a\x64\x73\xad\x96\x8c\x63\xc3\x52\x6f\x3b\x97\x96\x09\x7c\x8b\x4b\x92\x73\x5b\x0b\x6a\xbb\xcd\xcd\x11\x3e\xe3\x86\x73\x52\xc2\x24\xea\xd6\xa6\xa2\xf0\xb9\xb5\xb4\x0b\xef\xa8\x30\x08\xe7\x6a\x33\xd7\x6c\xcd\x38\xa6\xf8\xce\x50\xc2\x8b\x7b\x13\xc3\x92\x70\x83\x1d\x5a\x4a\x32\xb2\x60\x9c\x59\x86\xa6\xbb\x0a\x40\xa2\x55\x16\xc3\xcf\x30\xbc\xb8\xba\x1a\xc2\x2f\xad\x59\xaa\x84\x20\x32\x69\x33\x44\x30\x5e\x30\x39\xf6\xde\x54\x6b\xa2\x53\xd3\x25\x8a\xa2\xda\xf5\x3a\xcf\xff\xf4\xe7\x0f\xf3\x77\xb7\x17\x1f\x3f\xdc\xfe\xf3\xe6\xe2\xfa\xdd\xdd\xfc\xe2\xf2\xdd\x5f\x7a\x9c\x1b\xcd\x2c\xde\x59\x62\x73\xe3\x4c\xdb\x99\x1d\x0e\x5b\x3f\x99\x20\x29\xc6\xf0\x6b\x4e\xb6\x2e\x3a\xd5\xd6\x5f\x6a\x22\x70\xa3\xf4\xbd\x53\xf3\x7b\xb3\x22\x2f\xce\x5e\xc6\xcb\xd7\x48\xce\x29\x2e\x5f\x9f\x11\xfa\x7a\x71\x3a\x9d\xbc\x98\xce\x26\xd3\x64\x76\xfe\xf2\xf4\xd5\x74\x4a\xce\x10\xe9\xeb\xc9\xec\xec\xf4\xe5\x62\x36\x7b\xfd\xea\xc5\x0c\x27\xcb\xc9\xe4\xf4\xec\xd5\xd9\xec\x9c\x9c\x4e\xf1\x55\x5f\xee\x3c\xe7\x7c\xae\x38\xa3\xdb\x18\x7e\x5a\xde\x28\x3b\xd7\x68\xb0\x3e\x6c\x28\x32\x9a\xb6\x3d\x6b\x47\x8d\x17\xcc\x95\xb6\x31\x9c\x4f\xce\x27\xbd\xf3\xf0\x1e\x21\xd0\x25\x47\xd3\x9a\xe3\x6c\x8d\x12\x8d\x99\x6b\xb5\xc0\xee\xb2\x2b\x6b\xb3\x1f\xd1\xf6\x4f\x36\x23\x76\x15\xc3\x78\x85\x84\xdb\xd5\x6f\xfd\xc9\x7d\xf2\x0d\x5d\xa1\xd3\xe0\xfd\xc7\x8f\xf3\xd6\x94\x46\x92\xb0\xaf\x28\xdf\xa2\x16\x4c\x16\x1e\x7e\x8d\xc6\xb8\x23\x28\xcd\xff\x03\xe1\x7c\x41\xe8\xfd\x47\x75\xa5\x52\xf3\x41\xbe\xd3\xba\x73\x8b\x50\xae\xbb\xde\xe9\x2d\xbc\xeb\x89\x1d\x45\xd6\x84\xe7\xf8\x83\x56\xa2\xbf\xab\x25\x43\x9e\x94\xf9\x2b\x30\x33\x2f\x36\x5d\x45\xb3\x51\xf8\x1e\x04\x34\xd8\x15\xbe\x37\x2c\x34\x99\xbf\xc3\xa4\xf1\xd7\x1c\x4d\xdf\xe5\x00\x68\x96\xc7\x30\x9d\x88\xde\x63\x81\x42\xe9\x6d\x0c\xd3\x97\x93\x6b\x56\xce\x49\x95\xe0\x5d\x27\x96\xbb\xd1\xad\xc6\x94\x89\x81\x33\x99\x7f\xfe\x92\x44\x45\x89\x25\x5c\xa5\x8f\x4b\x56\x3b\x4c\xbf\x77\xc2\x0a\x68\xf9\x84\xa4\x15\x58\xe5\xff\x26\x71\x05\xf7\xf6\xc0\xae\xe0\x2b\x27\xaf\x52\xe7\x83\x09\xec\xa4\x95\xc1\x4e\x3a\x33\xdd\xd4\xe7\x12\x16\x2d\x0a\x3a\x41\x32\x57\x4e\xa2\xfe\xc9\xa5\x87\x37\x07\xb2\x52\x4d\xdf\xd8\x5d\x63\xca\x8c\xd5\xdb\xb8\xd5\x40\x35\x02\x72\xcb\x78\x54\x64\x9d\xce\xc4\x1f\x9f\xf9\x9c\x32\x06\x6d\xe4\x44\x70\x45\x92\x28\x37\xa8\x23\x96\xbc\xe9\xb8\xe6\xb7\xcc\xdc\x8c\x6f\x99\xf9\x50\x66\x7e\xde\x44\x76\xfe\x25\x79\x6c\xb7\xc7\x3c\xba\x27\xde\xcd\x6e\x24\x4d\x35\xa6\xc4\xa2\xeb\x77\x23\x4c\x98\xed\xa5\xb3\xfd\xeb\x35\xac\x56\x45\x24\x11\x4c\xc6\x30\x74\xd7\x6b\xf8\x18\x46\x2c\x60\x9c\x92\x2f\x0c\x22\x84\xfa\xd4\x5d\x5c\xc1\xe4\x0b\x43\x35\xcb\x9c\x24\xd3\xc5\x0e\xa8\x46\x62\x71\xf8\x1d\x0c\xf3\x22\xc7\xba\x6f\x99\x4b\xa4\xee\x4b\x82\x1c\x2d\x16\x28\xc4\x13\xa4\x96\x9d\x70\x99\x8d\x4a\xe4\xc7\xb8\x75\xcb\xd8\x5d\xd2\xba\x27\x4c\x1a\x4b\x38\xcf\x38\xf1\x14\x07\x34\x6e\x94\xfa\x7d\x0f\x7c\xcd\x70\xf3\x35\x0f\xfc\x11\x7c\x4e\xd5\x67\x71\x94\xe7\x3b\xb2\xef\xa0\x16\x99\x16\x4a\x74\x0f\x31\x45\xeb\x48\x38\x33\xc5\xe7\xa6\xf0\xb8\x1d\x3f\xcb\x08\xbd\x27\x29\x9a\xd1\x71\xda\x97\xe4\x82\x48\xb6\x74\x91\xc7\xfb\x72\xf7\xd9\x98\x51\x25\x8f\xd3\xe5\x71\x90\x50\x39\x5b\x28\x1f\xf0\xad\x94\xab\x05\xe1\x51\x1b\x35\x6e\x97\xca\xf5\xe3\xe7\x95\xda\x2e\x0b\xfb\x22\xb9\xa8\x2b\x6f\x4b\x74\x8a\xb6\x46\xbb\x4b\x6f\x8f\x1e\x83\x8c\x11\x9e\xad\x48\x0f\x59\x2c\x81\xb9\x92\x35\xa0\x5e\x75\xbe\x45\xc5\xf5\x50\xf3\xa0\xb8\x18\xd5\xf0\xf1\x7a\x32\x7a\x31\x1b\x4d\xea\x1d\x24\xcc\x64\x9c\x6c\x7d\x31\x3c\xf7\xcb\xc2\x5d\xb5\x6e\x82\xb5\x67\xc6\x70\x8b\x99\x2f\x25\x0c\x10\x59\x5b\xb0\xd2\x05\xec\x8a\x58\x60\x06\xc8\x9a\x30\x4e\x16\x1c\x61\xa9\x95\x00\x02\xa9\xab\x0f\xe0\xd2\xdf\x83\xbb\xc2\xeb\x60\xb3\x62\x74\x05\x1b\xc6\x79\xe1\x89\x7c\x8d\x60\x15\x90\xb0\x01\x46\x03\x00\xc1\xe4\xdf\xf3\x05\xd6\xd6\x9c\x8e\xa6\xd3\x91\xcb\xd0\xf7\xb8\xdd\x28\x9d\x38\x87\x3c\xe9\xfb\xec\xc9\x77\x70\xa2\xb8\x70\x1f\x95\xc5\x4e\x9c\x07\x0b\xc2\xda\x35\x7d\x55\xcd\xdf\x62\x02\xef\x89\xaf\x94\x50\x10\xc6\x8b\x43\x93\x66\xc5\x96\xb6\xf1\x86\xef\x35\x26\x2b\x62\xdd\xf1\x0d\x00\x32\xad\xd6\x2c\xc1\x32\xcd\xf6\xd7\xe1\x4c\xde\x77\x44\xec\x58\x18\x20\xd7\x3c\x2e\x0a\x15\x13\x8f\xc7\x29\xb3\xab\x7c\x51\xb8\x46\xa8\x6c\xdc\x8b\xee\x8e\xad\x46\x1c\x0b\xe2\x8c\x37\xce\xee\xd3\x71\xb9\xdf\xa8\x76\x91\x32\xea\x5c\xab\x04\x4b\x8d\x7c\xa7\xf4\x61\x23\x6f\x3a\x4d\xba\xc9\x33\x57\x02\x61\x52\xb7\x5c\x15\xe9\x1d\x93\x29\xc7\x63\xa9\xaf\x73\x6e\xd9\xb1\xc4\x17\x9c\x37\xb7\x68\x0f\x6d\xb9\x03\x6f\xe9\xba\xe7\x85\xa4\x69\xb4\xa1\xd7\x59\x96\x51\x79\xee\x2a\x34\x53\x44\xe4\x6a\x26\x7a\x62\x33\xe8\x9a\x52\x8e\x9d\x4e\xb0\x09\xbc\xbd\x8a\x7a\x0f\x9c\xff\x40\xf5\x17\x41\x09\xd4\x13\x4a\xd1\x18\x8d\x2e\x47\xb5\xcb\x6d\x1f\x7e\xfb\xd5\x7b\x51\x8d\xf4\x1e\xa6\x68\x1f\xd2\xb3\x87\x29\x06\x75\x2a\x7a\x03\xdf\xb2\x1d\xd4\xa3\x2b\xd0\xfd\x76\x99\xa1\xf3\xa0\x48\x11\x47\xe8\x14\x4c\x5b\x47\xe8\xd9\xc9\xb5\x7f\x90\xae\x87\x73\xed\xc3\x4a\xf7\x83\xd6\x93\xd5\x6e\x2e\x42\xcb\xcd\xc3\xf9\xc2\x8f\xf6\x55\x01\xe8\xe3\x48\xd5\x08\xe3\x49\xad\x6d\xb5\x67\xfa\x3d\x8b\x20\x9f\x3f\xc9\x3a\x23\x78\xf0\xa9\x37\x7f\x97\xeb\xb4\x37\xd3\x80\x55\x2f\x3a\x88\x4a\xbf\xa3\x81\x30\x78\x55\x8d\x02\x7e\x0a\x6f\xbd\x8f\x64\xd5\xab\xf5\x10\xad\x6a\xf4\x91\xad\xa3\x44\xec\x5a\x18\x1e\x02\x86\xe0\x30\xec\xd5\x5a\x63\x0f\xfc\x55\x6f\x6f\x3f\x0c\xd6\x2c\xf2\xb4\x08\xe8\x47\xb8\xc7\xac\xc6\xbe\x5e\xb3\x4b\x15\x82\xd6\xfc\x38\xec\xb8\x47\x9b\xf2\x71\x48\x5b\xa9\xd4\x01\xbc\xcd\x8f\xfd\xa8\x5b\xb5\xad\x1d\xec\xad\xda\x55\x81\xc0\xed\xe4\xe6\x3e\x55\xb4\x7e\x33\x0b\x3d\xf6\x6f\x08\x60\xe4\x12\x63\x60\x7e\x78\x36\x9b\x9d\x0e\x83\x8c\x65\x15\x1d\x82\xe3\x2b\xa2\x2e\xb2\xe7\xc7\xd7\x42\xb2\x5a\xd2\xdb\x78\xd6\x05\xdf\x90\xad\xd9\xa1\x0b\xe0\x59\x10\xc2\xb4\x9c\x79\x76\xa8\x0e\xa0\x57\x7e\xec\xc1\x90\xfc\x68\x63\x42\x77\x41\x8a\x83\x58\x53\xa3\xff\x1e\xed\x0e\x81\x5b\xff\x03\xea\x3d\x1d\xfb\xaa\xb6\x17\xac\x81\xaa\xc9\x30\x0e\xe6\xc7\x1e\x34\xcc\x8f\x0a\x13\x3b\x6b\x30\xb1\x66\xac\x15\xcf\x05\x5e\xbb\x98\x16\xf4\x1a\x1f\x79\xac\xc8\x96\xbb\xae\x06\x20\x1c\x9f\xff\x97\x6b\x6c\x45\x36\x08\xad\xbd\x37\x9c\x85\x17\x45\x91\xd9\xed\x5b\xa6\x63\xf8\xf7\x7f\x8a\xee\xc4\x16\x51\x2d\x86\xa2\x37\xf4\x1d\x77\xb7\x7b\x2b\x5e\x1d\x29\xc3\x73\x82\x4b\x26\x99\x6d\xaa\x5b\xb5\x91\x98\x54\x9d\x68\xea\xdf\x2f\x39\x58\xa4\x94\x0a\xad\x5b\xaf\x0d\xf9\x27\xbe\x29\x2d\x7b\x96\xeb\xb2\x40\xa9\x30\xc6\x76\x7c\xee\x17\x2f\xa1\xae\xb2\xc7\xdf\x69\x2d\x2f\xfa\x44\x45\x23\x59\xbb\x07\xa4\x28\x9d\xda\x98\xf8\x9e\x12\x3f\x33\x63\x99\x4c\xbb\x4d\xa5\x6b\x4b\x13\xb0\x2b\x64\x1a\xfc\x5b\x26\xd7\x4d\xc5\xda\x14\x47\x37\x7b\x13\x4b\x28\x5c\x3c\xa9\x8b\x6f\x6b\x75\xe0\x0d\xb8\x55\xbe\x60\x2a\x6a\xfe\x8f\xd9\x03\x32\x78\x1b\x7c\x2c\x12\x7a\xaa\x33\x3a\xd8\x1b\x97\x8b\x05\xab\x3f\x78\x9a\x3f\x53\x3a\xa7\x71\xa9\x84\xc8\x25\xb3\xdb\xba\x83\x77\x26\xca\xf2\x05\x67\x66\x85\xba\x81\x46\xde\xe7\x0b\xdf\xb0\x38\x99\x73\x95\x78\x93\x96\xdd\x57\x37\xf1\x96\x53\xdd\x77\xda\x3c\x2c\x7a\xd7\xa9\x29\xab\x3f\x7a\xe6\xaa\xea\xe3\x5c\x5b\x67\x51\xaf\x09\x8f\xe1\xe5\x44\x0c\xfe\x1b\x00\x00\xff\xff\x21\xd5\xad\x06\xca\x29\x00\x00") +var _olmManifests0250OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\x1b\xb9\x11\xff\xae\xbf\x62\x20\x14\x70\x5b\x64\xf5\x48\x6c\xc5\xb7\x40\x80\x73\x9d\xdc\xe5\x50\xdb\x11\x6c\xa7\x5f\x0e\x87\x82\xe2\x8e\x56\xac\xf9\xd8\x23\xb9\x52\x74\x45\xff\xf7\x82\xcb\x7d\x8b\x92\x65\x27\x77\x29\x8a\xf0\x8b\xa4\xe5\x0c\x67\x38\x1c\xce\xe3\xa7\x8d\xa2\x68\x40\x32\xf6\x0f\xd4\x86\x29\x19\xc3\x7a\x3a\x78\x60\x32\x89\xe1\x86\x08\x34\x19\xa1\x38\x10\x68\x49\x42\x2c\x89\x07\x00\x92\x08\x8c\x41\x71\x31\x00\xe0\x64\x81\xdc\xb8\xa7\x00\x99\x4a\x22\x83\x34\xd7\xcc\x6e\x47\x0f\xf9\x02\xb5\x44\x8b\x66\xc4\xd4\x18\xe5\x52\x69\x8a\x31\x68\x34\x56\x33\x6a\x31\x39\x92\x25\x5a\x57\x5a\x71\x62\xd1\xd8\xc7\xd8\x48\x9e\x30\xfb\x14\x39\x05\xc3\x53\xa5\x6c\x88\x96\x4f\x11\xe2\xe8\x77\x64\x3c\xcf\xec\x19\x6a\x62\x95\x36\xcf\x30\xfe\x82\x18\xe4\x4c\xe2\x37\xd3\x3b\xd3\x7b\x5b\xdf\xa1\x5e\x33\x8a\x17\x94\xaa\x5c\xda\xfe\x79\x04\xdd\x3e\xaa\xce\x20\x32\x9e\x99\x94\xcc\x9e\xa6\x38\x39\x7f\x3f\xfa\x27\xac\x17\x84\x8e\x48\x6e\x57\x4a\xb3\xdf\x88\x65\x4a\x8e\x1e\xce\x0b\x2d\xeb\xb3\xbf\xe4\xb9\xb1\xa8\x6f\x15\x0f\x9d\xbe\xd9\x1a\x8b\x22\xa6\x4a\x5a\xad\x38\x47\x1d\xd7\xba\x70\xb6\x44\xba\xa5\x1c\x23\x41\x24\x49\x51\x0f\x74\xce\xd1\xc4\x83\x08\x48\xc6\x7e\xd4\x2a\xcf\x4c\x0c\x3f\x0f\xff\x3a\xfc\x65\x00\xce\x7e\x2a\xd7\x14\x5b\x8f\xd6\xa8\x17\xf5\xcf\x08\xa4\x92\xb7\x25\xd1\xc7\xdb\xab\xbd\x74\x9f\xb5\xc3\xbf\x31\x99\x30\x99\x3e\x66\xe6\x85\x27\x8b\x9c\x49\xb5\xe2\x78\x8b\x4b\x47\x59\x6d\xeb\x80\xd4\x01\xc0\xae\x59\x9f\x65\x4c\x93\x2f\xfe\x85\xd4\x16\xf6\x0c\x7a\xce\x17\x71\x90\xfa\x76\x8f\xa8\xd2\xa8\xdc\x87\x68\x2c\xf7\xe1\xea\xfa\x52\xc9\x25\x0b\x19\x8c\xfa\x0d\xee\xac\x48\xb2\xcc\x34\x2b\xbc\xc5\x8c\xab\xad\x40\x69\x1f\xb1\xf9\xae\xaa\xdd\x70\x43\xb2\xac\xc7\x60\x32\xa4\x6e\xce\x58\x4d\x2c\xa6\x5b\x4f\x67\xb7\x19\xc6\x70\xab\x38\x67\x32\xfd\x98\x25\xc4\x62\xe1\x7d\x19\x67\x94\x98\x18\xa6\x8e\x03\x39\x52\xab\xb4\xe7\x10\xc4\xd2\xd5\x55\x4b\x54\x48\x18\x80\x45\x91\xb9\xcb\x5c\x32\xb5\x36\xe3\x06\xef\xf0\x87\x57\x00\xa8\x54\x2e\xbe\x97\xd1\xe3\x52\x49\x8b\x9f\x6c\xc3\xaa\x73\x79\x61\x6e\x94\xbc\x55\xca\xc6\x60\x75\x8e\xf5\x94\x41\x4a\x95\xc8\xe6\x5a\x2d\x19\xc7\x86\xa5\xde\x76\x2e\x2d\x13\xf8\x16\x97\x24\xe7\xb6\x16\xd4\x76\x9b\x9b\x23\x7c\xc6\x0d\xe7\xa4\x84\x49\xd4\xad\x4d\x45\xe1\x73\x6b\x69\x17\xde\x51\x61\x10\xce\xd5\x66\xae\xd9\x9a\x71\x4c\xf1\x9d\xa1\x84\x17\xf7\x26\x86\x25\xe1\x06\x3b\xb4\x94\x64\x64\xc1\x38\xb3\x0c\x4d\x77\x15\x80\x44\xab\x2c\x86\x9f\x61\x78\x71\x75\x35\x84\x5f\x5a\xb3\x54\x09\x41\x64\xd2\x66\x88\x60\xbc\x60\x72\xec\xbd\xa9\xd6\x44\xa7\xa6\x4b\x14\x45\xb5\xeb\x75\x9e\xff\xe9\xcf\x1f\xe6\xef\x6e\x2f\xee\x3f\xdc\xfe\xf3\xe6\xe2\xfa\xdd\xdd\xfc\xe2\xf2\xdd\x5f\x7a\x9c\x1b\xcd\x2c\xde\x59\x62\x73\xe3\x4c\xdb\x99\x1d\x0e\x5b\x3f\x99\x20\x29\xc6\xf0\x6b\x4e\xb6\x2e\x3a\xd5\xd6\x5f\x6a\x22\x70\xa3\xf4\x83\x53\xf3\x7b\xb3\x22\x2f\xcf\x66\xf1\x74\xf6\x6a\x41\x68\x32\xfb\x6e\x32\x99\x2e\x91\x4c\xe8\x6c\x36\x43\xba\x3c\x9f\x9d\x4f\xf1\xbb\xd3\xf3\xb3\x57\x67\xd3\x97\xd3\x09\x4d\xf0\xf5\xeb\x53\xc4\x57\xa7\x67\x74\x32\x5b\x9e\x4f\x92\x33\x32\x3b\x9b\x9e\xbe\x7e\xd5\x97\x3b\xcf\x39\x9f\x2b\xce\xe8\x36\x86\x9f\x96\x37\xca\xce\x35\x1a\xac\x0f\x1b\x8a\x8c\xa6\x6d\xcf\xda\x51\xe3\x05\x73\xa5\x6d\x0c\xe7\x93\xf3\x49\xef\x3c\xbc\x47\x08\x74\xc9\xd1\xb4\xe6\x38\x5b\xa3\x44\x63\xe6\x5a\x2d\xb0\xbb\xec\xca\xda\xec\x47\xb4\xfd\x93\xcd\x88\x5d\xc5\x30\x5e\x21\xe1\x76\xf5\x5b\x7f\x72\x9f\x7c\x43\x57\xe8\x34\x78\x7f\x7f\x3f\x6f\x4d\x69\x24\x09\xfb\x8a\xf2\x2d\x6a\xc1\x64\xe1\xe1\xd7\x68\x8c\x3b\x82\xd2\xfc\x3f\x10\xce\x17\x84\x3e\xdc\xab\x2b\x95\x9a\x0f\xf2\x9d\xd6\x9d\x5b\x84\x72\xdd\xf5\x4e\x6f\xe1\x5d\x4f\xec\x28\xb2\x26\x3c\xc7\x1f\xb4\x12\xfd\x5d\x2d\x19\xf2\xa4\xcc\x5f\x81\x99\x79\xb1\xe9\x2a\x9a\x8d\xc2\xf7\x20\xa0\xc1\xae\xf0\xbd\x61\xa1\xc9\xfc\x1d\x26\x8d\xbf\xe6\x68\xfa\x2e\x07\x40\xb3\x3c\x86\xe9\x44\xf4\x1e\x0b\x14\x4a\x6f\x63\x98\xce\x26\xd7\xac\x9c\x93\x2a\xc1\xbb\x4e\x2c\x77\xa3\x5b\x8d\x29\x13\x03\x67\x32\xff\xf4\x39\x89\x8a\x12\x4b\xb8\x4a\x9f\x96\xac\x76\x98\x7e\xef\x84\x15\xd0\xf2\x19\x49\x2b\xb0\xca\xff\x4d\xe2\x0a\xee\xed\x91\x5d\xc1\x57\x4e\x5e\xa5\xce\x07\x13\xd8\x49\x2b\x83\x9d\x74\x66\xba\xa9\xcf\x25\x2c\x5a\x14\x74\x82\x64\xae\x9c\x44\xfd\x93\x4b\x0f\x6f\x0e\x64\xa5\x9a\xbe\xb1\xbb\xc6\x94\x19\xab\xb7\x71\xab\x81\x6a\x04\xe4\x96\xf1\xa8\xc8\x3a\x9d\x89\x3f\x3e\xf3\x39\x65\x0c\xda\xc8\x89\xe0\x8a\x24\x51\x6e\x50\x47\x2c\x79\xd3\x71\xcd\x6f\x99\xb9\x19\xdf\x32\xf3\xa1\xcc\xfc\x65\x13\xd9\xf9\xe7\xe4\xb1\xdd\x1e\xf3\xe8\x9e\x78\x37\xbb\x91\x34\xd5\x98\x12\x8b\xae\xdf\x8d\x30\x61\xb6\x97\xce\xf6\xaf\xd7\xb0\x5a\x15\x91\x44\x30\x19\xc3\xd0\x5d\xaf\xe1\x53\x18\xb1\x80\x71\x4a\xbe\x30\x88\x10\xea\x53\x77\x71\x05\x93\x2f\x0c\xd5\x2c\x73\x92\x4c\x17\x3b\xa0\x1a\x89\xc5\xe1\x0b\x18\xe6\x45\x8e\x75\xdf\x32\x97\x48\xdd\x97\x04\x39\x5a\x2c\x50\x88\x67\x48\x2d\x3b\xe1\x32\x1b\x95\xc8\x8f\x71\xeb\x96\xb1\xbb\xa4\x75\x4f\x98\x34\x96\x70\x9e\x71\xe2\x29\x0e\x68\xdc\x28\xf5\xfb\x1e\xf8\x9a\xe1\xe6\x6b\x1e\xf8\x13\xf8\x9c\xaa\x5f\xc4\x51\xbe\xdc\x91\xbd\x80\x5a\x64\x5a\x28\xd1\x3d\xc4\x14\xad\x23\xe1\xcc\x14\x9f\x9b\xc2\xe3\x76\xfc\x2c\x23\xf4\x81\xa4\x68\x46\xc7\x69\x5f\x92\x0b\x22\xd9\xd2\x45\x1e\xef\xcb\xdd\x67\x63\x46\x95\x3c\x4e\x97\xa7\x41\x42\xe5\x6c\xa1\x7c\xc0\xb7\x52\xae\x16\x84\x47\x6d\xd4\xb8\x5d\x2a\xd7\x8f\xbf\xac\xd4\x76\x59\xd8\x17\xc9\x45\x5d\x79\x5b\xa2\x53\xb4\x35\xda\x5d\x7a\x7b\xf4\x14\x64\x8c\xf0\x6c\x45\x7a\xc8\x62\x09\xcc\x95\xac\x01\xf5\xaa\xf3\x2d\x2a\xae\xc7\x9a\x07\xc5\xc5\xa8\x86\x8f\xd7\x93\xd1\xcb\xb3\xd1\xa4\xde\x41\xc2\x4c\xc6\xc9\xd6\x17\xc3\x73\xbf\x2c\xdc\x55\xeb\x26\x58\x7b\x66\x0c\xb7\x98\xf9\x52\xc2\x00\x91\xb5\x05\x2b\x5d\xc0\xae\x88\x05\x66\x80\xac\x09\xe3\x64\xc1\x11\x96\x5a\x09\x20\x90\xba\xfa\x00\x2e\xfd\x3d\xb8\x2b\xbc\x0e\x36\x2b\x46\x57\xb0\x61\x9c\x17\x9e\xc8\xd7\x08\x56\x01\x09\x1b\x60\x34\x00\x10\x4c\xfe\x3d\x5f\x60\x6d\xcd\xe9\x68\x3a\x1d\xb9\x0c\xfd\x80\xdb\x8d\xd2\x89\x73\xc8\x93\xbe\xcf\x9e\xbc\x80\x13\xc5\x85\xfb\xa8\x2c\x76\xe2\x3c\x58\x10\xd6\xae\xe9\xab\x6a\xfe\x16\x13\x78\x4f\x7c\xa5\x84\x82\x30\x5e\x1c\x9a\x34\x2b\xb6\xb4\x8d\x37\x7c\xaf\x31\x59\x11\xeb\x8e\x6f\x00\x90\x69\xb5\x66\x09\x96\x69\xb6\xbf\x0e\x67\xf2\xa1\x23\x62\xc7\xc2\x00\xb9\xe6\x71\x51\xa8\x98\x78\x3c\x4e\x99\x5d\xe5\x8b\xc2\x35\x42\x65\xe3\x5e\x74\x77\x6c\x35\xe2\x58\x10\x67\xbc\x71\xf6\x90\x8e\xcb\xfd\x46\xb5\x8b\x94\x51\xe7\x5a\x25\x58\x6a\xe4\x3b\xa5\x0f\x1b\x79\xd3\x69\xd2\x4d\x9e\xb9\x12\x08\x93\xba\xe5\xaa\x48\xef\x98\x4c\x39\x1e\x4b\x7d\x9d\x73\xcb\x8e\x25\xbe\xe0\xbc\xb9\x45\x7b\x68\xcb\x1d\x78\x4b\xd7\x3d\x2f\x24\x4d\xa3\x0d\xbd\xce\xb2\x8c\xca\x73\x57\xa1\x99\x22\x22\x57\x33\xd1\x33\x9b\x41\xd7\x94\x72\xec\x74\x82\x4d\xe0\xed\x55\xd4\x7b\xe0\xfc\x47\xaa\xbf\x08\x4a\xa0\x9e\x50\x8a\xc6\x68\x74\x39\xaa\x5d\x6e\xfb\xf0\xdb\xaf\xde\x8b\x6a\xa4\xf7\x30\x45\xfb\x98\x9e\x3d\x4c\x31\xa8\x53\xd1\x1b\xf8\x96\xed\xa0\x1e\x5d\x81\xee\xb7\xcb\x0c\x9d\x07\x45\x8a\x38\x42\xa7\x60\xda\x3a\x42\xcf\x4e\xae\xfd\x83\x74\x3d\x9c\x6b\x1f\x57\xba\x1f\xb4\x9e\xad\x76\x73\x11\x5a\x6e\x1e\xce\x17\x7e\xb4\xaf\x0a\x40\x1f\x47\xaa\x46\x18\x4f\x6a\x6d\xab\x3d\xd3\xef\x59\x04\xf9\xf4\x51\xd6\x19\xc1\x83\x4f\xbd\xf9\xbb\x5c\xa7\xbd\x99\x06\xac\x7a\xd9\x41\x54\xfa\x1d\x0d\x84\xc1\xab\x6a\x14\xf0\x53\x78\xeb\x7d\x24\xab\x5e\xad\x87\x68\x55\xa3\x8f\x6c\x1d\x25\x62\xd7\xc2\xf0\x18\x30\x04\x87\x61\xaf\xd6\x1a\x7b\xe0\xaf\x7a\x7b\xfb\x61\xb0\x66\x91\xe7\x45\x40\x3f\xc2\x3d\x66\x35\xf6\xf5\x9a\x5d\xaa\x10\xb4\xe6\xc7\x61\xc7\x3d\xda\x94\x4f\x43\xda\x4a\xa5\x0e\xe0\x6d\x7e\xec\x47\xdd\xaa\x6d\xed\x60\x6f\xd5\xae\x0a\x04\x6e\x27\x37\xf7\xa9\xa2\xf5\x9b\xd3\xd0\x63\xff\x86\x00\x46\x2e\x31\x06\xe6\x87\x67\xa7\xa7\xaf\x86\x41\xc6\xb2\x8a\x0e\xc1\xf1\x15\x51\x17\xd9\xf3\xe3\x6b\x21\x59\x2d\xe9\x6d\x3c\xeb\x82\x6f\xc8\xd6\xec\xd0\x05\xf0\x2c\x08\x61\x5a\xce\x3c\x81\x03\xcd\xb4\xb2\x8a\x2a\x1e\xc3\xfd\xe5\x7c\x67\xfe\x00\xba\xe5\xc7\x1e\x8c\xc9\x8f\x36\x66\x74\x17\xa4\x38\x88\x45\x35\xfb\xdb\xa3\xfd\x21\xf0\xeb\x7f\x40\xbd\xe7\x63\x63\xd5\xf6\x82\x35\x52\x35\x19\xc6\xc9\xfc\xd8\x83\x96\xf9\x51\x61\x66\x67\x0d\x66\xd6\x8c\xb5\xe2\xb9\xc0\x6b\x17\xf3\x82\x5e\xe5\x23\x93\x15\xd9\x72\xd7\x15\x01\x84\xe3\xf3\xff\x82\x8d\xad\xc8\x06\xa1\xb5\xf7\x86\xbb\xf0\xa2\x28\x32\xbb\x7d\xcb\x74\x0c\xff\xfe\x4f\xd1\xbd\xd8\x22\xea\xc5\x50\xf4\x8e\xbe\x23\xef\x76\x77\xc5\xab\x25\x65\xf8\x4e\x70\xc9\x24\xb3\x4d\xf5\xab\x36\x12\x93\xaa\x53\x4d\xfd\xfb\x27\x07\x8b\x98\x52\xa1\x75\xeb\xb5\x22\xff\xc4\x37\xad\x65\x4f\x73\x5d\x16\x30\x15\x06\xd9\x8e\xdf\xfd\xe2\x26\xd4\x75\xf6\xf8\x3b\xad\xe7\x45\x9f\xa8\x68\x34\x6b\xf7\x80\x14\xa5\x53\x1b\x13\xdf\x73\xe2\x27\x66\x2c\x93\x69\xb7\xe9\x74\x6d\x6b\x02\x76\x85\x4c\x83\x7f\x0b\xe5\xba\xa9\x68\x9b\xe2\xe9\x66\x6f\xe2\x09\x85\x93\x67\x75\xf9\x6d\xad\x0e\xbc\x21\xb7\xca\x17\x4c\x45\xcd\xff\x35\x7b\x40\x08\x6f\x83\xfb\x22\xe1\xa7\x3a\xa3\x83\xbd\x71\xbb\x58\xb0\xfa\x03\xa8\xf9\xb3\xa5\x73\x1a\x97\x4a\x88\x5c\x32\xbb\xad\x3b\x7c\x67\xa2\x2c\x5f\x70\x66\x56\xa8\x1b\xe8\xe4\x7d\xbe\xf0\x0d\x8d\x93\x39\x57\x89\x37\x69\xd9\x9d\x75\x13\x73\x39\xd5\x7d\xe7\xcd\xc3\xa6\x77\x9d\x9a\xb3\xfa\x23\x68\xae\xaa\x3e\xcf\xb5\x7d\x16\xf5\x9a\xf0\x18\x66\x13\x31\xf8\x6f\x00\x00\x00\xff\xff\xec\x51\x46\x9a\xea\x29\x00\x00") -func olmManifests0240OlmYamlBytes() ([]byte, error) { +func olmManifests0250OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0240OlmYaml, - "olm-manifests/0.24.0-olm.yaml", + _olmManifests0250OlmYaml, + "olm-manifests/0.25.0-olm.yaml", ) } -func olmManifests0240OlmYaml() (*asset, error) { - bytes, err := olmManifests0240OlmYamlBytes() +func olmManifests0250OlmYaml() (*asset, error) { + bytes, err := olmManifests0250OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.24.0-olm.yaml", size: 10698, mode: os.FileMode(420), modTime: time.Unix(1678830331, 0)} + info := bindataFileInfo{name: "olm-manifests/0.25.0-olm.yaml", size: 10730, mode: os.FileMode(420), modTime: time.Unix(1687806534, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -254,12 +254,12 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "olm-manifests/0.22.0-crds.yaml": olmManifests0220CrdsYaml, - "olm-manifests/0.22.0-olm.yaml": olmManifests0220OlmYaml, "olm-manifests/0.23.1-crds.yaml": olmManifests0231CrdsYaml, "olm-manifests/0.23.1-olm.yaml": olmManifests0231OlmYaml, "olm-manifests/0.24.0-crds.yaml": olmManifests0240CrdsYaml, "olm-manifests/0.24.0-olm.yaml": olmManifests0240OlmYaml, + "olm-manifests/0.25.0-crds.yaml": olmManifests0250CrdsYaml, + "olm-manifests/0.25.0-olm.yaml": olmManifests0250OlmYaml, } // AssetDir returns the file names below a certain @@ -306,12 +306,12 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "olm-manifests": &bintree{nil, map[string]*bintree{ - "0.22.0-crds.yaml": &bintree{olmManifests0220CrdsYaml, map[string]*bintree{}}, - "0.22.0-olm.yaml": &bintree{olmManifests0220OlmYaml, map[string]*bintree{}}, "0.23.1-crds.yaml": &bintree{olmManifests0231CrdsYaml, map[string]*bintree{}}, "0.23.1-olm.yaml": &bintree{olmManifests0231OlmYaml, map[string]*bintree{}}, "0.24.0-crds.yaml": &bintree{olmManifests0240CrdsYaml, map[string]*bintree{}}, "0.24.0-olm.yaml": &bintree{olmManifests0240OlmYaml, map[string]*bintree{}}, + "0.25.0-crds.yaml": &bintree{olmManifests0250CrdsYaml, map[string]*bintree{}}, + "0.25.0-olm.yaml": &bintree{olmManifests0250OlmYaml, map[string]*bintree{}}, }}, }} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/versions.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/versions.go index e28b69ffe..d1319b375 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/versions.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/versions.go @@ -15,9 +15,9 @@ package olm var availableVersions = map[string]struct{}{ - "0.22.0": {}, "0.23.1": {}, "0.24.0": {}, + "0.25.0": {}, } // HasVersion returns whether version maps to released OLM manifests as bindata. diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go index 7c14aa786..0c1eed9eb 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go @@ -35,6 +35,7 @@ import ( golangv4 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v4" grafanav1alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha" + ansiblev1 "github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1" "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/alpha/config3alphato3" "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle" "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cleanup" @@ -45,7 +46,6 @@ import ( "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/scorecard" "github.com/operator-framework/operator-sdk/internal/flags" "github.com/operator-framework/operator-sdk/internal/plugins" - ansiblev1 "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1" envtestv1 "github.com/operator-framework/operator-sdk/internal/plugins/envtest/v1" helmv1 "github.com/operator-framework/operator-sdk/internal/plugins/helm/v1" manifestsv2 "github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2" diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/internal/relatedimages.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/internal/relatedimages.go index 05baeb82f..4cea2a88b 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/internal/relatedimages.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/internal/relatedimages.go @@ -22,7 +22,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/generate/collector" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/set" ) // FindRelatedImages looks in the controller manager's environment for images used by the operator. @@ -31,7 +31,7 @@ func FindRelatedImages(manifestCol *collector.Manifests) ([]operatorsv1alpha1.Re relatedImages: []*relatedImage{}, relatedImagesByName: make(map[string][]*relatedImage), relatedImagesByImageRef: make(map[string][]*relatedImage), - seenRelatedImages: sets.Set[string]{}, + seenRelatedImages: set.Set[string]{}, } for _, deployment := range manifestCol.Deployments { @@ -65,7 +65,7 @@ type relatedImageCollector struct { relatedImages []*relatedImage relatedImagesByName map[string][]*relatedImage relatedImagesByImageRef map[string][]*relatedImage - seenRelatedImages sets.Set[string] + seenRelatedImages set.Set[string] } func (c *relatedImageCollector) collectFromEnvironment(containerRef string, env []corev1.EnvVar) error { diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/client.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/client.go index dbd23c3a4..6059590b3 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/client.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/client.go @@ -30,7 +30,6 @@ import ( log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -112,18 +111,50 @@ func NewClientForConfig(cfg *rest.Config) (*Client, error) { func (c Client) DoCreate(ctx context.Context, objs ...client.Object) error { for _, obj := range objs { kind := obj.GetObjectKind().GroupVersionKind().Kind - log.Infof(" Creating %s %q", kind, getName(obj.GetNamespace(), obj.GetName())) - err := c.KubeClient.Create(ctx, obj) - if err != nil { - if !apierrors.IsAlreadyExists(err) { - return err - } - log.Infof(" %s %q already exists", kind, getName(obj.GetNamespace(), obj.GetName())) + resourceName := getName(obj.GetNamespace(), obj.GetName()) + + log.Infof(" Creating %s %q", kind, resourceName) + + if err := c.safeCreateOneResource(ctx, obj, kind, resourceName); err != nil { + log.Infof(" failed to create %s %q; %v", kind, resourceName, err) + return err } } return nil } +// try to create 10 times before giving up +func (c Client) safeCreateOneResource(ctx context.Context, obj client.Object, kind string, resourceName string) error { + backoff := wait.Backoff{ + // retrying every one seconds. We're relaying on the timeout context, so the number of steps is very large, so + // we could use the timeout flag (or its default value), as it used to create the context. + Duration: time.Second, + Steps: 1000, + Factor: 1, + } + + err := wait.ExponentialBackoffWithContext(ctx, backoff, func() (bool, error) { + err := c.KubeClient.Create(ctx, obj) + if err == nil || apierrors.IsAlreadyExists(err) { + log.Infof(" %s %q created", kind, resourceName) + return true, nil + } + + if meta.IsNoMatchError(err) { + log.Infof(" Failed to create %s %q. CRD is not ready yet. Retrying...", kind, resourceName) + return false, nil + } + + return false, err + }) + + if err != nil && errors.Is(err, context.DeadlineExceeded) { + return fmt.Errorf("timeout") + } + + return err +} + func (c Client) DoDelete(ctx context.Context, objs ...client.Object) error { for _, obj := range objs { kind := obj.GetObjectKind().GroupVersionKind().Kind diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/status.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/status.go index 45126f458..83913dc3d 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/status.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/client/status.go @@ -33,7 +33,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" apiutilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/utils/set" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -111,8 +111,8 @@ func (s Status) HasInstalledResources() (bool, error) { } // getCRDKindSet returns the set of all kinds specified by all CRDs in s. -func (s Status) getCRDKindSet() (sets.Set[string], error) { - crdKindSet := sets.New[string]() +func (s Status) getCRDKindSet() (set.Set[string], error) { + crdKindSet := set.New[string]() for _, r := range s.Resources { if r.GVK.Kind == "CustomResourceDefinition" { u := &unstructured.Unstructured{} diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/fbcutil/util.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/fbcutil/util.go index 8b34d5a0d..f7a2346fe 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/fbcutil/util.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/fbcutil/util.go @@ -17,6 +17,7 @@ package fbcutil import ( "bytes" "context" + "crypto/sha256" "errors" "fmt" "io" @@ -134,7 +135,8 @@ func NullLogger() *log.Entry { // RenderRefs will invoke Operator Registry APIs and return a declarative config object representation // of the references that are passed in as a string array. func RenderRefs(ctx context.Context, refs []string, skipTLSVerify bool, useHTTP bool) (*declarativeconfig.DeclarativeConfig, error) { - cacheDir := strings.ReplaceAll(strings.Join(refs, "_"), "/", "-") + cacheDir := dirNameFromRefs(refs) + if cacheDir == "" { cacheDir = DefaultCacheDir } @@ -169,6 +171,14 @@ func RenderRefs(ctx context.Context, refs []string, skipTLSVerify bool, useHTTP return declcfg, nil } +func dirNameFromRefs(refs []string) string { + dirNameBytes := []byte(strings.ReplaceAll(strings.Join(refs, "_"), "/", "-")) + hash := sha256.New() + hash.Write(dirNameBytes) + hashBytes := hash.Sum(nil) + return fmt.Sprintf("%x", hashBytes) +} + // IsFBC will determine if an index image uses the File-Based Catalog or SQLite index image format. // The default index image will adopt the File-Based Catalog format. func IsFBC(ctx context.Context, indexImage string) (bool, error) { diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/install_mode.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/install_mode.go index d78c73a35..d4a317df8 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/install_mode.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/install_mode.go @@ -21,8 +21,8 @@ import ( "strings" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/utils/set" ) type InstallMode struct { @@ -131,8 +131,8 @@ func (i InstallMode) CheckCompatibility(csv *v1alpha1.ClusterServiceVersion, ope // GetSupportedInstallModes returns the given slice of InstallModes as a // String set. -func GetSupportedInstallModes(csvInstallModes []v1alpha1.InstallMode) sets.Set[string] { - supported := sets.New[string]() +func GetSupportedInstallModes(csvInstallModes []v1alpha1.InstallMode) set.Set[string] { + supported := set.New[string]() for _, im := range csvInstallModes { if im.Supported { supported.Insert(string(im.Type)) diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/operator_installer.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/operator_installer.go index 8876e2e87..37aeb1990 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/operator_installer.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/operator_installer.go @@ -24,9 +24,9 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/retry" + "k8s.io/utils/set" "sigs.k8s.io/controller-runtime/pkg/client" olmclient "github.com/operator-framework/operator-sdk/internal/olm/client" @@ -43,7 +43,7 @@ type OperatorInstaller struct { InstallMode operator.InstallMode CatalogCreator CatalogCreator CatalogUpdater CatalogUpdater - SupportedInstallModes sets.Set[string] + SupportedInstallModes set.Set[string] cfg *operator.Configuration } @@ -210,7 +210,7 @@ func (o OperatorInstaller) ensureOperatorGroup(ctx context.Context) error { return fmt.Errorf("use install mode %q to watch operator's namespace %q", v1alpha1.InstallModeTypeOwnNamespace, o.cfg.Namespace) } - supported = supported.Intersection(sets.New[string](string(o.InstallMode.InstallModeType))) + supported = supported.Intersection(set.New(string(o.InstallMode.InstallModeType))) if supported.Len() == 0 { return fmt.Errorf("operator %q does not support install mode %q", o.StartingCSV, o.InstallMode.InstallModeType) } @@ -248,8 +248,8 @@ func (o *OperatorInstaller) isOperatorGroupCompatible(og v1.OperatorGroup, targe } // otherwise, check that the target namespaces match - targets := sets.New[string](targetNamespaces...) - ogtargets := sets.New[string](og.Spec.TargetNamespaces...) + targets := set.New(targetNamespaces...) + ogtargets := set.New(og.Spec.TargetNamespaces...) if !ogtargets.Equal(targets) { return fmt.Errorf("existing operatorgroup %q is not compatible with install mode %q", og.Name, o.InstallMode) } @@ -369,7 +369,7 @@ func (o OperatorInstaller) waitForInstallPlan(ctx context.Context, sub *v1alpha1 return nil } -func (o *OperatorInstaller) getTargetNamespaces(supported sets.Set[string]) ([]string, error) { +func (o *OperatorInstaller) getTargetNamespaces(supported set.Set[string]) ([]string, error) { switch { case supported.Has(string(v1alpha1.InstallModeTypeAllNamespaces)): return nil, nil diff --git a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go b/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go index 772d00e90..60f342159 100644 --- a/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go +++ b/tools/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go @@ -28,6 +28,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests" "github.com/operator-framework/operator-sdk/internal/util/projutil" + "github.com/operator-framework/operator-sdk/internal/version" ) // Version of `opm` to download and use for building index images. @@ -68,7 +69,15 @@ func (s *initSubcommand) Scaffold(fs machinery.Filesystem) error { } projectName = strings.ToLower(filepath.Base(dir)) } - makefileBytes = append([]byte(fmt.Sprintf(makefileBundleVarFragment, s.config.GetDomain(), projectName)), makefileBytes...) + makefileBytes = append([]byte(fmt.Sprintf(makefileBundleVarFragment, s.config.GetDomain(), projectName, strings.Trim(version.Version, "+git"))), makefileBytes...) + + // Append SDK recipes. + switch operatorType { + case projutil.OperatorTypeGo: + makefileBytes = append(makefileBytes, []byte(makefileSDKFragmentGo)...) + default: + makefileBytes = append(makefileBytes, []byte(makefileSDKFragmentNonGo)...) + } // Append bundle recipes. switch operatorType { @@ -168,24 +177,65 @@ USE_IMAGE_DIGESTS ?= false ifeq ($(USE_IMAGE_DIGESTS), true) BUNDLE_GEN_FLAGS += --use-image-digests endif + +# Set the Operator SDK version to use. By default, what is installed on the system is used. +# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit. +OPERATOR_SDK_VERSION ?= %[3]s +` + + makefileSDKFragmentGo = ` +.PHONY: operator-sdk +OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk +operator-sdk: ## Download operator-sdk locally if necessary. +ifeq (,$(wildcard $(OPERATOR_SDK))) +ifeq (, $(shell which operator-sdk 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPERATOR_SDK)) ;\ + OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \ + curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$${OS}_$${ARCH} ;\ + chmod +x $(OPERATOR_SDK) ;\ + } +else +OPERATOR_SDK = $(shell which operator-sdk) +endif +endif +` + + makefileSDKFragmentNonGo = ` +.PHONY: operator-sdk +OPERATOR_SDK ?= ./bin/operator-sdk +operator-sdk: ## Download operator-sdk locally if necessary. +ifeq (,$(wildcard $(OPERATOR_SDK))) +ifeq (, $(shell which operator-sdk 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPERATOR_SDK)) ;\ + curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$(OS)_$(ARCH) ;\ + chmod +x $(OPERATOR_SDK) ;\ + } +else +OPERATOR_SDK = $(shell which operator-sdk) +endif +endif ` makefileBundleFragmentGo = ` .PHONY: bundle -bundle: manifests kustomize ## Generate bundle manifests and metadata, then validate generated files. - operator-sdk generate kustomize manifests -q +bundle: manifests kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. + $(OPERATOR_SDK) generate kustomize manifests -q cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) - $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) - operator-sdk bundle validate ./bundle + $(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) + $(OPERATOR_SDK) bundle validate ./bundle ` makefileBundleFragmentNonGo = ` .PHONY: bundle -bundle: kustomize ## Generate bundle manifests and metadata, then validate generated files. - operator-sdk generate kustomize manifests -q +bundle: kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. + $(OPERATOR_SDK) generate kustomize manifests -q cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) - $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) - operator-sdk bundle validate ./bundle + $(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) + $(OPERATOR_SDK) bundle validate ./bundle ` makefileBundleBuildPushFragment = ` diff --git a/tools/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go index 246c5ea94..2f5616894 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go +++ b/tools/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go @@ -28,6 +28,8 @@ var ( MetricsAll = GoRuntimeMetricsRule{regexp.MustCompile("/.*")} // MetricsGC allows only GC metrics to be collected from Go runtime. // e.g. go_gc_cycles_automatic_gc_cycles_total + // NOTE: This does not include new class of "/cpu/classes/gc/..." metrics. + // Use custom metric rule to access those. MetricsGC = GoRuntimeMetricsRule{regexp.MustCompile(`^/gc/.*`)} // MetricsMemory allows only memory metrics to be collected from Go runtime. // e.g. go_memory_classes_heap_free_bytes diff --git a/tools/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/counter.go index a912b75a0..62de4dc59 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 8bc5e44e2..deedc2dfb 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/tools/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" + dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" - dto "github.com/prometheus/client_model/go" + "github.com/prometheus/client_golang/prometheus/internal" ) // 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/tools/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/doc.go index 811072cbd..962608f02 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/doc.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index 21271a5bb..f1ea6c76f 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go index 3a2d55e84..2d8d9f64f 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 4c873a01c..8d818afe9 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/tools/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 @@ -402,7 +401,7 @@ type HistogramOpts struct { // Histogram by a Prometheus server with that feature enabled (requires // Prometheus v2.40+). Sparse buckets are exponential buckets covering // the whole float64 range (with the exception of the “zero†bucket, see - // SparseBucketsZeroThreshold below). From any one bucket to the next, + // NativeHistogramZeroThreshold below). From any one bucket to the next, // the width of the bucket grows by a constant // factor. NativeHistogramBucketFactor provides an upper bound for this // factor (exception see below). The smaller @@ -433,7 +432,7 @@ type HistogramOpts struct { // bucket. For best results, this should be close to a bucket // boundary. This is usually the case if picking a power of two. If // NativeHistogramZeroThreshold is left at zero, - // DefSparseBucketsZeroThreshold is used as the threshold. To configure + // DefNativeHistogramZeroThreshold is used as the threshold. To configure // a zero bucket with an actual threshold of zero (i.e. only // observations of precisely zero will go into the zero bucket), set // NativeHistogramZeroThreshold to the NativeHistogramZeroThresholdZero @@ -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. @@ -632,8 +639,8 @@ func (hc *histogramCounts) observe(v float64, bucket int, doSparse bool) { if frac == 0.5 { key-- } - div := 1 << -schema - key = (key + div - 1) / div + offset := (1 << -schema) - 1 + key = (key + offset) >> -schema } if isInf { key++ @@ -810,7 +817,7 @@ func (h *histogram) observe(v float64, bucket int) { } } -// limitSparsebuckets applies a strategy to limit the number of populated sparse +// limitBuckets applies a strategy to limit the number of populated sparse // buckets. It's generally best effort, and there are situations where the // number can go higher (if even the lowest resolution isn't enough to reduce // the number sufficiently, or if the provided counts aren't fully updated yet @@ -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/tools/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/labels.go index c1b8fad36..63ff8683c 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/metric.go index b5119c504..07bbc9d76 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go index a4cc9810b..09b8d2fbe 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ b/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -37,6 +37,7 @@ import ( "fmt" "io" "net/http" + "strconv" "strings" "sync" "time" @@ -47,9 +48,10 @@ import ( ) const ( - contentTypeHeader = "Content-Type" - contentEncodingHeader = "Content-Encoding" - acceptEncodingHeader = "Accept-Encoding" + contentTypeHeader = "Content-Type" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" + processStartTimeHeader = "Process-Start-Time-Unix" ) var gzipPool = sync.Pool{ @@ -121,6 +123,9 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO } h := http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { + if !opts.ProcessStartTime.IsZero() { + rsp.Header().Set(processStartTimeHeader, strconv.FormatInt(opts.ProcessStartTime.Unix(), 10)) + } if inFlightSem != nil { select { case inFlightSem <- struct{}{}: // All good, carry on. @@ -366,6 +371,14 @@ type HandlerOpts struct { // (which changes the identity of the resulting series on the Prometheus // server). EnableOpenMetrics bool + // ProcessStartTime allows setting process start timevalue that will be exposed + // with "Process-Start-Time-Unix" response header along with the metrics + // payload. This allow callers to have efficient transformations to cumulative + // counters (e.g. OpenTelemetry) or generally _created timestamp estimation per + // scrape target. + // NOTE: This feature is experimental and not covered by OpenMetrics or Prometheus + // exposition format. + ProcessStartTime time.Time } // gzipAccepted returns whether the client will accept gzip-encoded content. diff --git a/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go index 210867816..d3482c40c 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index cca67a78a..3793036ad 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go index c590d912c..5d4383aa1 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 09e34d307..44da9433b 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/summary.go index 7bc448a89..dd359264e 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/timer.go index f28a76f3a..52344fef5 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/timer.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/value.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/value.go index 2d3abc1cb..5f6bb8001 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/vec.go index 7ae322590..f0d0015a0 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/tools/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -20,6 +20,24 @@ import ( "github.com/prometheus/common/model" ) +var labelsPool = &sync.Pool{ + New: func() interface{} { + return make(Labels) + }, +} + +func getLabelsFromPool() Labels { + return labelsPool.Get().(Labels) +} + +func putLabelsToPool(labels Labels) { + for k := range labels { + delete(labels, k) + } + + labelsPool.Put(labels) +} + // MetricVec is a Collector to bundle metrics of the same name that differ in // their label values. MetricVec is not used directly but as a building block // for implementations of vectors of a given metric type, like GaugeVec, @@ -72,6 +90,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 +110,9 @@ 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) + defer putLabelsToPool(labels) + h, err := m.hashLabels(labels) if err != nil { return false @@ -106,6 +128,9 @@ 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) + defer putLabelsToPool(labels) + return m.metricMap.deleteByLabels(labels, m.curry) } @@ -145,10 +170,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 +181,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 +224,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 +250,9 @@ 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) + defer putLabelsToPool(labels) + h, err := m.hashLabels(labels) if err != nil { return nil, err @@ -266,16 +295,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 +482,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 +634,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 +650,7 @@ func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) [] iCurry++ continue } - labelValues[i] = labels[k] + labelValues[i] = labels[k.Name] } return labelValues } @@ -640,3 +669,35 @@ func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { } return labelValues } + +func constrainLabels(desc *Desc, labels Labels) Labels { + constrainedLabels := getLabelsFromPool() + for l, v := range labels { + if i, ok := indexOf(l, desc.variableLabels.labelNames()); ok { + v = desc.variableLabels[i].Constrain(v) + } + + constrainedLabels[l] = v + } + + return constrainedLabels +} + +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/tools/vendor/github.com/prometheus/client_golang/prometheus/vnext.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/vnext.go new file mode 100644 index 000000000..42bc3a8f0 --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/tools/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 1498ee144..25da157f1 100644 --- a/tools/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/tools/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/tools/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/tools/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 35904ea19..2b5bca4b9 100644 --- a/tools/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/expfmt/decode.go b/tools/vendor/github.com/prometheus/common/expfmt/decode.go index 7657f841d..906397815 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/expfmt/encode.go b/tools/vendor/github.com/prometheus/common/expfmt/encode.go index 64dc0eb40..7f611ffaa 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/expfmt/expfmt.go b/tools/vendor/github.com/prometheus/common/expfmt/expfmt.go index 0f176fa64..c4cb20f0d 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/expfmt/fuzz.go b/tools/vendor/github.com/prometheus/common/expfmt/fuzz.go index f819e4f8b..dfac962a4 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/fuzz.go +++ b/tools/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -21,8 +21,8 @@ import "bytes" // Fuzz text metric parser with with github.com/dvyukov/go-fuzz: // -// go-fuzz-build github.com/prometheus/common/expfmt -// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz // // Further input samples should go in the folder fuzz/corpus. func Fuzz(in []byte) int { diff --git a/tools/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/tools/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 9d94ae9ef..21cdddcf0 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/tools/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -46,20 +46,20 @@ import ( // missing features and peculiarities to avoid complications when switching from // Prometheus to OpenMetrics or vice versa: // -// - Counters are expected to have the `_total` suffix in their metric name. In -// the output, the suffix will be truncated from the `# TYPE` and `# HELP` -// line. A counter with a missing `_total` suffix is not an error. However, -// its type will be set to `unknown` in that case to avoid invalid OpenMetrics -// output. +// - Counters are expected to have the `_total` suffix in their metric name. In +// the output, the suffix will be truncated from the `# TYPE` and `# HELP` +// line. A counter with a missing `_total` suffix is not an error. However, +// its type will be set to `unknown` in that case to avoid invalid OpenMetrics +// output. // -// - No support for the following (optional) features: `# UNIT` line, `_created` -// line, info type, stateset type, gaugehistogram type. +// - No support for the following (optional) features: `# UNIT` line, `_created` +// line, info type, stateset type, gaugehistogram type. // -// - The size of exemplar labels is not checked (i.e. it's possible to create -// exemplars that are larger than allowed by the OpenMetrics specification). +// - The size of exemplar labels is not checked (i.e. it's possible to create +// exemplars that are larger than allowed by the OpenMetrics specification). // -// - The value of Counters is not checked. (OpenMetrics doesn't allow counters -// with a `NaN` value.) +// - The value of Counters is not checked. (OpenMetrics doesn't allow counters +// with a `NaN` value.) func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int, err error) { name := in.GetName() if name == "" { diff --git a/tools/vendor/github.com/prometheus/common/expfmt/text_create.go b/tools/vendor/github.com/prometheus/common/expfmt/text_create.go index 5ba503b06..2946b8f1a 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/tools/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -17,7 +17,6 @@ import ( "bufio" "fmt" "io" - "io/ioutil" "math" "strconv" "strings" @@ -44,7 +43,7 @@ const ( var ( bufPool = sync.Pool{ New: func() interface{} { - return bufio.NewWriter(ioutil.Discard) + return bufio.NewWriter(io.Discard) }, } numBufPool = sync.Pool{ diff --git a/tools/vendor/github.com/prometheus/common/expfmt/text_parse.go b/tools/vendor/github.com/prometheus/common/expfmt/text_parse.go index 84be0643e..35db1cc9d 100644 --- a/tools/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/tools/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go index 26e92288c..a21b9d15d 100644 --- a/tools/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go +++ b/tools/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -11,18 +11,18 @@ 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 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. + 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 the Open Knowledge Foundation Ltd. nor the - names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. + Neither the name of the Open Knowledge Foundation Ltd. 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 @@ -35,8 +35,6 @@ 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 goautoneg diff --git a/tools/vendor/github.com/prometheus/common/model/time.go b/tools/vendor/github.com/prometheus/common/model/time.go index c909b8aa8..5727452c1 100644 --- a/tools/vendor/github.com/prometheus/common/model/time.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/model/value.go b/tools/vendor/github.com/prometheus/common/model/value.go index c9d8fb1a2..9eb440413 100644 --- a/tools/vendor/github.com/prometheus/common/model/value.go +++ b/tools/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/tools/vendor/github.com/prometheus/common/model/value_float.go b/tools/vendor/github.com/prometheus/common/model/value_float.go new file mode 100644 index 000000000..0f615a705 --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/common/model/value_histogram.go b/tools/vendor/github.com/prometheus/common/model/value_histogram.go new file mode 100644 index 000000000..54bb038cf --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/common/model/value_type.go b/tools/vendor/github.com/prometheus/common/model/value_type.go new file mode 100644 index 000000000..726c50ee6 --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/Makefile.common b/tools/vendor/github.com/prometheus/procfs/Makefile.common index 6c8e3e219..b111d2562 100644 --- a/tools/vendor/github.com/prometheus/procfs/Makefile.common +++ b/tools/vendor/github.com/prometheus/procfs/Makefile.common @@ -55,19 +55,22 @@ ifneq ($(shell which gotestsum),) endif endif -PROMU_VERSION ?= 0.13.0 +PROMU_VERSION ?= 0.14.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz +SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.45.2 +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)) ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) # If we're in CI and there is an Actions file, that means the linter # is being run in Actions, so we don't need to run it here. - ifeq (,$(CIRCLE_JOB)) + ifneq (,$(SKIP_GOLANGCI_LINT)) + GOLANGCI_LINT := + else ifeq (,$(CIRCLE_JOB)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint else ifeq (,$(wildcard .github/workflows/golangci-lint.yml)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint @@ -88,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 @@ -202,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" \ @@ -211,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/tools/vendor/github.com/prometheus/procfs/cpuinfo.go b/tools/vendor/github.com/prometheus/procfs/cpuinfo.go index ff6b927da..06968ca2e 100644 --- a/tools/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/tools/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -380,6 +380,42 @@ func parseCPUInfoMips(info []byte) ([]CPUInfo, error) { return cpuinfo, nil } +func parseCPUInfoLoong(info []byte) ([]CPUInfo, error) { + scanner := bufio.NewScanner(bytes.NewReader(info)) + // find the first "processor" line + firstLine := firstNonEmptyLine(scanner) + if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") { + return nil, errors.New("invalid cpuinfo file: " + firstLine) + } + field := strings.SplitN(firstLine, ": ", 2) + cpuinfo := []CPUInfo{} + systemType := field[1] + i := 0 + for scanner.Scan() { + line := scanner.Text() + if !strings.Contains(line, ":") { + continue + } + field := strings.SplitN(line, ": ", 2) + switch strings.TrimSpace(field[0]) { + case "processor": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + i = int(v) + cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor + cpuinfo[i].Processor = uint(v) + cpuinfo[i].VendorID = systemType + case "CPU Family": + cpuinfo[i].CPUFamily = field[1] + case "Model Name": + cpuinfo[i].ModelName = field[1] + } + } + return cpuinfo, nil +} + func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) { scanner := bufio.NewScanner(bytes.NewReader(info)) diff --git a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go b/tools/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go similarity index 73% rename from tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go rename to tools/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go index 8f8ac60ff..d88442f0e 100644 --- a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go +++ b/tools/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go @@ -1,10 +1,9 @@ -// Copyright 2018 The etcd Authors -// +// 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 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -12,9 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package rpctypes +//go:build linux +// +build linux + +package procfs -var ( - TokenFieldNameGRPC = "token" - TokenFieldNameSwagger = "authorization" -) +var parseCPUInfo = parseCPUInfoLoong diff --git a/tools/vendor/github.com/prometheus/procfs/cpuinfo_others.go b/tools/vendor/github.com/prometheus/procfs/cpuinfo_others.go index ea41bf2ca..a6b2b3127 100644 --- a/tools/vendor/github.com/prometheus/procfs/cpuinfo_others.go +++ b/tools/vendor/github.com/prometheus/procfs/cpuinfo_others.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build linux && !386 && !amd64 && !arm && !arm64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x -// +build linux,!386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x +//go:build linux && !386 && !amd64 && !arm && !arm64 && !loong64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x +// +build linux,!386,!amd64,!arm,!arm64,!loong64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x package procfs diff --git a/tools/vendor/github.com/prometheus/procfs/doc.go b/tools/vendor/github.com/prometheus/procfs/doc.go index d31a82600..f9d961e44 100644 --- a/tools/vendor/github.com/prometheus/procfs/doc.go +++ b/tools/vendor/github.com/prometheus/procfs/doc.go @@ -16,30 +16,29 @@ // // Example: // -// package main -// -// import ( -// "fmt" -// "log" -// -// "github.com/prometheus/procfs" -// ) -// -// func main() { -// p, err := procfs.Self() -// if err != nil { -// log.Fatalf("could not get process: %s", err) -// } -// -// stat, err := p.Stat() -// if err != nil { -// log.Fatalf("could not get process stat: %s", err) -// } -// -// fmt.Printf("command: %s\n", stat.Comm) -// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) -// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) -// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) -// } -// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.Stat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } package procfs diff --git a/tools/vendor/github.com/prometheus/procfs/fs.go b/tools/vendor/github.com/prometheus/procfs/fs.go index 0102ab0fd..60c551e02 100644 --- a/tools/vendor/github.com/prometheus/procfs/fs.go +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/fs_statfs_notype.go b/tools/vendor/github.com/prometheus/procfs/fs_statfs_notype.go new file mode 100644 index 000000000..800576968 --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/fs_statfs_type.go b/tools/vendor/github.com/prometheus/procfs/fs_statfs_type.go new file mode 100644 index 000000000..6233217ad --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/internal/util/parse.go b/tools/vendor/github.com/prometheus/procfs/internal/util/parse.go index b030951fa..14272dc78 100644 --- a/tools/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/mountstats.go b/tools/vendor/github.com/prometheus/procfs/mountstats.go index f7a828bb1..7f68890cf 100644 --- a/tools/vendor/github.com/prometheus/procfs/mountstats.go +++ b/tools/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 } @@ -284,7 +286,8 @@ func parseMountStats(r io.Reader) ([]*Mount, error) { } // parseMount parses an entry in /proc/[pid]/mountstats in the format: -// device [device] mounted on [mount] with fstype [type] +// +// device [device] mounted on [mount] with fstype [type] func parseMount(ss []string) (*Mount, error) { if len(ss) < deviceEntryLen { return nil, fmt.Errorf("invalid device entry: %v", ss) @@ -533,7 +536,6 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { ns = append(ns, n) } - opStats := NFSOperationStats{ Operation: strings.TrimSuffix(ss[0], ":"), Requests: ns[0], @@ -545,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/tools/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/tools/vendor/github.com/prometheus/procfs/net_conntrackstat.go index 8300daca0..64a0e9460 100644 --- a/tools/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/net_softnet.go b/tools/vendor/github.com/prometheus/procfs/net_softnet.go index a94f86dc4..540cea52c 100644 --- a/tools/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/tools/vendor/github.com/prometheus/procfs/net_softnet.go @@ -27,8 +27,9 @@ import ( // For the proc file format details, // See: // * Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2343 -// * Linux 4.17 https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162 -// and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810. +// * Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086 +// * Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162 +// * Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169 // SoftnetStat contains a single row of data from /proc/net/softnet_stat. type SoftnetStat struct { @@ -38,6 +39,18 @@ type SoftnetStat struct { Dropped uint32 // Number of times processing packets ran out of quota. TimeSqueezed uint32 + // Number of collision occur while obtaining device lock while transmitting. + CPUCollision uint32 + // Number of times cpu woken up received_rps. + ReceivedRps uint32 + // number of times flow limit has been reached. + FlowLimitCount uint32 + // Softnet backlog status. + SoftnetBacklogLen uint32 + // CPU id owning this softnet_data. + Index uint32 + // softnet_data's Width. + Width int } var softNetProcFile = "net/softnet_stat" @@ -63,25 +76,65 @@ 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) + softnetStat := SoftnetStat{} if width < minColumns { return nil, fmt.Errorf("%d columns were detected, but at least %d were expected", width, minColumns) } - // We only parse the first three columns at the moment. - us, err := parseHexUint32s(columns[0:3]) - if err != nil { - return nil, err + // Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2347 + if width >= minColumns { + us, err := parseHexUint32s(columns[0:9]) + if err != nil { + return nil, err + } + + softnetStat.Processed = us[0] + softnetStat.Dropped = us[1] + softnetStat.TimeSqueezed = us[2] + softnetStat.CPUCollision = us[8] + } + + // Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086 + if width >= 10 { + us, err := parseHexUint32s(columns[9:10]) + if err != nil { + return nil, err + } + + softnetStat.ReceivedRps = us[0] } - stats = append(stats, SoftnetStat{ - Processed: us[0], - Dropped: us[1], - TimeSqueezed: us[2], - }) + // Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162 + if width >= 11 { + us, err := parseHexUint32s(columns[10:11]) + if err != nil { + return nil, err + } + + softnetStat.FlowLimitCount = us[0] + } + + // Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169 + if width >= 13 { + us, err := parseHexUint32s(columns[11:13]) + if err != nil { + return nil, err + } + + 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/tools/vendor/github.com/prometheus/procfs/net_wireless.go b/tools/vendor/github.com/prometheus/procfs/net_wireless.go new file mode 100644 index 000000000..c80fb1542 --- /dev/null +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/netstat.go b/tools/vendor/github.com/prometheus/procfs/netstat.go index dcea9c5a6..742dff453 100644 --- a/tools/vendor/github.com/prometheus/procfs/netstat.go +++ b/tools/vendor/github.com/prometheus/procfs/netstat.go @@ -37,32 +37,46 @@ func (fs FS) NetStat() ([]NetStat, error) { var netStatsTotal []NetStat for _, filePath := range statFiles { - file, err := os.Open(filePath) + procNetstat, err := parseNetstat(filePath) if err != nil { return nil, err } + procNetstat.Filename = filepath.Base(filePath) - netStatFile := NetStat{ - Filename: filepath.Base(filePath), - Stats: make(map[string][]uint64), - } - scanner := bufio.NewScanner(file) - scanner.Scan() - // First string is always a header for stats - var headers []string - headers = append(headers, strings.Fields(scanner.Text())...) + netStatsTotal = append(netStatsTotal, procNetstat) + } + return netStatsTotal, nil +} + +// parseNetstat parses the metrics from `/proc/net/stat/` file +// and returns a NetStat structure. +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() - // Other strings represent per-CPU counters - for scanner.Scan() { - for num, counter := range strings.Fields(scanner.Text()) { - value, err := strconv.ParseUint(counter, 16, 64) - if err != nil { - return nil, err - } - netStatFile.Stats[headers[num]] = append(netStatFile.Stats[headers[num]], value) + // First string is always a header for stats + var headers []string + headers = append(headers, strings.Fields(scanner.Text())...) + + // Other strings represent per-CPU counters + for scanner.Scan() { + for num, counter := range strings.Fields(scanner.Text()) { + value, err := strconv.ParseUint(counter, 16, 64) + if err != nil { + return NetStat{}, err } + netStat.Stats[headers[num]] = append(netStat.Stats[headers[num]], value) } - netStatsTotal = append(netStatsTotal, netStatFile) } - return netStatsTotal, nil + + return netStat, nil } diff --git a/tools/vendor/github.com/prometheus/procfs/proc.go b/tools/vendor/github.com/prometheus/procfs/proc.go index c30223af7..48f39dafd 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc.go +++ b/tools/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/tools/vendor/github.com/prometheus/procfs/proc_cgroup.go b/tools/vendor/github.com/prometheus/procfs/proc_cgroup.go index cca03327c..ea83a75ff 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/tools/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -23,7 +23,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the the placement of a PID inside a +// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the placement of a PID inside a // specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. v1 has one hierarchy per available resource // controller, while v2 has one unified hierarchy shared by all controllers. Regardless of v1 or v2, all hierarchies // contain all running processes, so the question answerable with a Cgroup struct is 'where is this process in diff --git a/tools/vendor/github.com/prometheus/procfs/proc_interrupts.go b/tools/vendor/github.com/prometheus/procfs/proc_interrupts.go new file mode 100644 index 000000000..9df79c237 --- /dev/null +++ b/tools/vendor/github.com/prometheus/procfs/proc_interrupts.go @@ -0,0 +1,98 @@ +// 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 procfs + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Interrupt represents a single interrupt line. +type Interrupt struct { + // Info is the type of interrupt. + Info string + // Devices is the name of the device that is located at that IRQ + Devices string + // Values is the number of interrupts per CPU. + Values []string +} + +// Interrupts models the content of /proc/interrupts. Key is the IRQ number. +// - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-interrupts +// - https://raspberrypi.stackexchange.com/questions/105802/explanation-of-proc-interrupts-output +type Interrupts map[string]Interrupt + +// Interrupts creates a new instance from a given Proc instance. +func (p Proc) Interrupts() (Interrupts, error) { + data, err := util.ReadFileNoStat(p.path("interrupts")) + if err != nil { + return nil, err + } + return parseInterrupts(bytes.NewReader(data)) +} + +func parseInterrupts(r io.Reader) (Interrupts, error) { + var ( + interrupts = Interrupts{} + scanner = bufio.NewScanner(r) + ) + + if !scanner.Scan() { + return nil, errors.New("interrupts empty") + } + cpuNum := len(strings.Fields(scanner.Text())) // one header per cpu + + for scanner.Scan() { + parts := strings.Fields(scanner.Text()) + if len(parts) == 0 { // skip empty lines + continue + } + if len(parts) < 2 { + return nil, fmt.Errorf("not enough fields in interrupts (expected at least 2 fields but got %d): %s", len(parts), parts) + } + intName := parts[0][:len(parts[0])-1] // remove trailing : + + if len(parts) == 2 { + interrupts[intName] = Interrupt{ + Info: "", + Devices: "", + Values: []string{ + parts[1], + }, + } + continue + } + + intr := Interrupt{ + Values: parts[1 : cpuNum+1], + } + + if _, err := strconv.Atoi(intName); err == nil { // numeral interrupt + intr.Info = parts[cpuNum+1] + intr.Devices = strings.Join(parts[cpuNum+2:], " ") + } else { + intr.Info = strings.Join(parts[cpuNum+1:], " ") + } + interrupts[intName] = intr + } + + return interrupts, scanner.Err() +} diff --git a/tools/vendor/github.com/prometheus/procfs/proc_netstat.go b/tools/vendor/github.com/prometheus/procfs/proc_netstat.go index 48b523819..6a43bb245 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_netstat.go +++ b/tools/vendor/github.com/prometheus/procfs/proc_netstat.go @@ -33,139 +33,140 @@ type ProcNetstat struct { } type TcpExt struct { // nolint:revive - SyncookiesSent float64 - SyncookiesRecv float64 - SyncookiesFailed float64 - EmbryonicRsts float64 - PruneCalled float64 - RcvPruned float64 - OfoPruned float64 - OutOfWindowIcmps float64 - LockDroppedIcmps float64 - ArpFilter float64 - TW float64 - TWRecycled float64 - TWKilled float64 - PAWSActive float64 - PAWSEstab float64 - DelayedACKs float64 - DelayedACKLocked float64 - DelayedACKLost float64 - ListenOverflows float64 - ListenDrops float64 - TCPHPHits float64 - TCPPureAcks float64 - TCPHPAcks float64 - TCPRenoRecovery float64 - TCPSackRecovery float64 - TCPSACKReneging float64 - TCPSACKReorder float64 - TCPRenoReorder float64 - TCPTSReorder float64 - TCPFullUndo float64 - TCPPartialUndo float64 - TCPDSACKUndo float64 - TCPLossUndo float64 - TCPLostRetransmit float64 - TCPRenoFailures float64 - TCPSackFailures float64 - TCPLossFailures float64 - TCPFastRetrans float64 - TCPSlowStartRetrans float64 - TCPTimeouts float64 - TCPLossProbes float64 - TCPLossProbeRecovery float64 - TCPRenoRecoveryFail float64 - TCPSackRecoveryFail float64 - TCPRcvCollapsed float64 - TCPDSACKOldSent float64 - TCPDSACKOfoSent float64 - TCPDSACKRecv float64 - TCPDSACKOfoRecv float64 - TCPAbortOnData float64 - TCPAbortOnClose float64 - TCPAbortOnMemory float64 - TCPAbortOnTimeout float64 - TCPAbortOnLinger float64 - TCPAbortFailed float64 - TCPMemoryPressures float64 - TCPMemoryPressuresChrono float64 - TCPSACKDiscard float64 - TCPDSACKIgnoredOld float64 - TCPDSACKIgnoredNoUndo float64 - TCPSpuriousRTOs float64 - TCPMD5NotFound float64 - TCPMD5Unexpected float64 - TCPMD5Failure float64 - TCPSackShifted float64 - TCPSackMerged float64 - TCPSackShiftFallback float64 - TCPBacklogDrop float64 - PFMemallocDrop float64 - TCPMinTTLDrop float64 - TCPDeferAcceptDrop float64 - IPReversePathFilter float64 - TCPTimeWaitOverflow float64 - TCPReqQFullDoCookies float64 - TCPReqQFullDrop float64 - TCPRetransFail float64 - TCPRcvCoalesce float64 - TCPOFOQueue float64 - TCPOFODrop float64 - TCPOFOMerge float64 - TCPChallengeACK float64 - TCPSYNChallenge float64 - TCPFastOpenActive float64 - TCPFastOpenActiveFail float64 - TCPFastOpenPassive float64 - TCPFastOpenPassiveFail float64 - TCPFastOpenListenOverflow float64 - TCPFastOpenCookieReqd float64 - TCPFastOpenBlackhole float64 - TCPSpuriousRtxHostQueues float64 - BusyPollRxPackets float64 - TCPAutoCorking float64 - TCPFromZeroWindowAdv float64 - TCPToZeroWindowAdv float64 - TCPWantZeroWindowAdv float64 - TCPSynRetrans float64 - TCPOrigDataSent float64 - TCPHystartTrainDetect float64 - TCPHystartTrainCwnd float64 - TCPHystartDelayDetect float64 - TCPHystartDelayCwnd float64 - TCPACKSkippedSynRecv float64 - TCPACKSkippedPAWS float64 - TCPACKSkippedSeq float64 - TCPACKSkippedFinWait2 float64 - TCPACKSkippedTimeWait float64 - TCPACKSkippedChallenge float64 - TCPWinProbe float64 - TCPKeepAlive float64 - TCPMTUPFail float64 - TCPMTUPSuccess float64 - TCPWqueueTooBig float64 + SyncookiesSent *float64 + SyncookiesRecv *float64 + SyncookiesFailed *float64 + EmbryonicRsts *float64 + PruneCalled *float64 + RcvPruned *float64 + OfoPruned *float64 + OutOfWindowIcmps *float64 + LockDroppedIcmps *float64 + ArpFilter *float64 + TW *float64 + TWRecycled *float64 + TWKilled *float64 + PAWSActive *float64 + PAWSEstab *float64 + DelayedACKs *float64 + DelayedACKLocked *float64 + DelayedACKLost *float64 + ListenOverflows *float64 + ListenDrops *float64 + TCPHPHits *float64 + TCPPureAcks *float64 + TCPHPAcks *float64 + TCPRenoRecovery *float64 + TCPSackRecovery *float64 + TCPSACKReneging *float64 + TCPSACKReorder *float64 + TCPRenoReorder *float64 + TCPTSReorder *float64 + TCPFullUndo *float64 + TCPPartialUndo *float64 + TCPDSACKUndo *float64 + TCPLossUndo *float64 + TCPLostRetransmit *float64 + TCPRenoFailures *float64 + TCPSackFailures *float64 + TCPLossFailures *float64 + TCPFastRetrans *float64 + TCPSlowStartRetrans *float64 + TCPTimeouts *float64 + TCPLossProbes *float64 + TCPLossProbeRecovery *float64 + TCPRenoRecoveryFail *float64 + TCPSackRecoveryFail *float64 + TCPRcvCollapsed *float64 + TCPDSACKOldSent *float64 + TCPDSACKOfoSent *float64 + TCPDSACKRecv *float64 + TCPDSACKOfoRecv *float64 + TCPAbortOnData *float64 + TCPAbortOnClose *float64 + TCPAbortOnMemory *float64 + TCPAbortOnTimeout *float64 + TCPAbortOnLinger *float64 + TCPAbortFailed *float64 + TCPMemoryPressures *float64 + TCPMemoryPressuresChrono *float64 + TCPSACKDiscard *float64 + TCPDSACKIgnoredOld *float64 + TCPDSACKIgnoredNoUndo *float64 + TCPSpuriousRTOs *float64 + TCPMD5NotFound *float64 + TCPMD5Unexpected *float64 + TCPMD5Failure *float64 + TCPSackShifted *float64 + TCPSackMerged *float64 + TCPSackShiftFallback *float64 + TCPBacklogDrop *float64 + PFMemallocDrop *float64 + TCPMinTTLDrop *float64 + TCPDeferAcceptDrop *float64 + IPReversePathFilter *float64 + TCPTimeWaitOverflow *float64 + TCPReqQFullDoCookies *float64 + TCPReqQFullDrop *float64 + TCPRetransFail *float64 + TCPRcvCoalesce *float64 + TCPRcvQDrop *float64 + TCPOFOQueue *float64 + TCPOFODrop *float64 + TCPOFOMerge *float64 + TCPChallengeACK *float64 + TCPSYNChallenge *float64 + TCPFastOpenActive *float64 + TCPFastOpenActiveFail *float64 + TCPFastOpenPassive *float64 + TCPFastOpenPassiveFail *float64 + TCPFastOpenListenOverflow *float64 + TCPFastOpenCookieReqd *float64 + TCPFastOpenBlackhole *float64 + TCPSpuriousRtxHostQueues *float64 + BusyPollRxPackets *float64 + TCPAutoCorking *float64 + TCPFromZeroWindowAdv *float64 + TCPToZeroWindowAdv *float64 + TCPWantZeroWindowAdv *float64 + TCPSynRetrans *float64 + TCPOrigDataSent *float64 + TCPHystartTrainDetect *float64 + TCPHystartTrainCwnd *float64 + TCPHystartDelayDetect *float64 + TCPHystartDelayCwnd *float64 + TCPACKSkippedSynRecv *float64 + TCPACKSkippedPAWS *float64 + TCPACKSkippedSeq *float64 + TCPACKSkippedFinWait2 *float64 + TCPACKSkippedTimeWait *float64 + TCPACKSkippedChallenge *float64 + TCPWinProbe *float64 + TCPKeepAlive *float64 + TCPMTUPFail *float64 + TCPMTUPSuccess *float64 + TCPWqueueTooBig *float64 } type IpExt struct { // nolint:revive - InNoRoutes float64 - InTruncatedPkts float64 - InMcastPkts float64 - OutMcastPkts float64 - InBcastPkts float64 - OutBcastPkts float64 - InOctets float64 - OutOctets float64 - InMcastOctets float64 - OutMcastOctets float64 - InBcastOctets float64 - OutBcastOctets float64 - InCsumErrors float64 - InNoECTPkts float64 - InECT1Pkts float64 - InECT0Pkts float64 - InCEPkts float64 - ReasmOverlaps float64 + InNoRoutes *float64 + InTruncatedPkts *float64 + InMcastPkts *float64 + OutMcastPkts *float64 + InBcastPkts *float64 + OutBcastPkts *float64 + InOctets *float64 + OutOctets *float64 + InMcastOctets *float64 + OutMcastOctets *float64 + InBcastOctets *float64 + OutBcastOctets *float64 + InCsumErrors *float64 + InNoECTPkts *float64 + InECT1Pkts *float64 + InECT0Pkts *float64 + InCEPkts *float64 + ReasmOverlaps *float64 } func (p Proc) Netstat() (ProcNetstat, error) { @@ -174,14 +175,14 @@ func (p Proc) Netstat() (ProcNetstat, error) { if err != nil { return ProcNetstat{PID: p.PID}, err } - procNetstat, err := parseNetstat(bytes.NewReader(data), filename) + procNetstat, err := parseProcNetstat(bytes.NewReader(data), filename) procNetstat.PID = p.PID return procNetstat, err } -// parseNetstat parses the metrics from proc//net/netstat file +// parseProcNetstat parses the metrics from proc//net/netstat file // and returns a ProcNetstat structure. -func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) { +func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) { var ( scanner = bufio.NewScanner(r) procNetstat = ProcNetstat{} @@ -208,230 +209,232 @@ func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) { case "TcpExt": switch key { case "SyncookiesSent": - procNetstat.TcpExt.SyncookiesSent = value + procNetstat.TcpExt.SyncookiesSent = &value case "SyncookiesRecv": - procNetstat.TcpExt.SyncookiesRecv = value + procNetstat.TcpExt.SyncookiesRecv = &value case "SyncookiesFailed": - procNetstat.TcpExt.SyncookiesFailed = value + procNetstat.TcpExt.SyncookiesFailed = &value case "EmbryonicRsts": - procNetstat.TcpExt.EmbryonicRsts = value + procNetstat.TcpExt.EmbryonicRsts = &value case "PruneCalled": - procNetstat.TcpExt.PruneCalled = value + procNetstat.TcpExt.PruneCalled = &value case "RcvPruned": - procNetstat.TcpExt.RcvPruned = value + procNetstat.TcpExt.RcvPruned = &value case "OfoPruned": - procNetstat.TcpExt.OfoPruned = value + procNetstat.TcpExt.OfoPruned = &value case "OutOfWindowIcmps": - procNetstat.TcpExt.OutOfWindowIcmps = value + procNetstat.TcpExt.OutOfWindowIcmps = &value case "LockDroppedIcmps": - procNetstat.TcpExt.LockDroppedIcmps = value + procNetstat.TcpExt.LockDroppedIcmps = &value case "ArpFilter": - procNetstat.TcpExt.ArpFilter = value + procNetstat.TcpExt.ArpFilter = &value case "TW": - procNetstat.TcpExt.TW = value + procNetstat.TcpExt.TW = &value case "TWRecycled": - procNetstat.TcpExt.TWRecycled = value + procNetstat.TcpExt.TWRecycled = &value case "TWKilled": - procNetstat.TcpExt.TWKilled = value + procNetstat.TcpExt.TWKilled = &value case "PAWSActive": - procNetstat.TcpExt.PAWSActive = value + procNetstat.TcpExt.PAWSActive = &value case "PAWSEstab": - procNetstat.TcpExt.PAWSEstab = value + procNetstat.TcpExt.PAWSEstab = &value case "DelayedACKs": - procNetstat.TcpExt.DelayedACKs = value + procNetstat.TcpExt.DelayedACKs = &value case "DelayedACKLocked": - procNetstat.TcpExt.DelayedACKLocked = value + procNetstat.TcpExt.DelayedACKLocked = &value case "DelayedACKLost": - procNetstat.TcpExt.DelayedACKLost = value + procNetstat.TcpExt.DelayedACKLost = &value case "ListenOverflows": - procNetstat.TcpExt.ListenOverflows = value + procNetstat.TcpExt.ListenOverflows = &value case "ListenDrops": - procNetstat.TcpExt.ListenDrops = value + procNetstat.TcpExt.ListenDrops = &value case "TCPHPHits": - procNetstat.TcpExt.TCPHPHits = value + procNetstat.TcpExt.TCPHPHits = &value case "TCPPureAcks": - procNetstat.TcpExt.TCPPureAcks = value + procNetstat.TcpExt.TCPPureAcks = &value case "TCPHPAcks": - procNetstat.TcpExt.TCPHPAcks = value + procNetstat.TcpExt.TCPHPAcks = &value case "TCPRenoRecovery": - procNetstat.TcpExt.TCPRenoRecovery = value + procNetstat.TcpExt.TCPRenoRecovery = &value case "TCPSackRecovery": - procNetstat.TcpExt.TCPSackRecovery = value + procNetstat.TcpExt.TCPSackRecovery = &value case "TCPSACKReneging": - procNetstat.TcpExt.TCPSACKReneging = value + procNetstat.TcpExt.TCPSACKReneging = &value case "TCPSACKReorder": - procNetstat.TcpExt.TCPSACKReorder = value + procNetstat.TcpExt.TCPSACKReorder = &value case "TCPRenoReorder": - procNetstat.TcpExt.TCPRenoReorder = value + procNetstat.TcpExt.TCPRenoReorder = &value case "TCPTSReorder": - procNetstat.TcpExt.TCPTSReorder = value + procNetstat.TcpExt.TCPTSReorder = &value case "TCPFullUndo": - procNetstat.TcpExt.TCPFullUndo = value + procNetstat.TcpExt.TCPFullUndo = &value case "TCPPartialUndo": - procNetstat.TcpExt.TCPPartialUndo = value + procNetstat.TcpExt.TCPPartialUndo = &value case "TCPDSACKUndo": - procNetstat.TcpExt.TCPDSACKUndo = value + procNetstat.TcpExt.TCPDSACKUndo = &value case "TCPLossUndo": - procNetstat.TcpExt.TCPLossUndo = value + procNetstat.TcpExt.TCPLossUndo = &value case "TCPLostRetransmit": - procNetstat.TcpExt.TCPLostRetransmit = value + procNetstat.TcpExt.TCPLostRetransmit = &value case "TCPRenoFailures": - procNetstat.TcpExt.TCPRenoFailures = value + procNetstat.TcpExt.TCPRenoFailures = &value case "TCPSackFailures": - procNetstat.TcpExt.TCPSackFailures = value + procNetstat.TcpExt.TCPSackFailures = &value case "TCPLossFailures": - procNetstat.TcpExt.TCPLossFailures = value + procNetstat.TcpExt.TCPLossFailures = &value case "TCPFastRetrans": - procNetstat.TcpExt.TCPFastRetrans = value + procNetstat.TcpExt.TCPFastRetrans = &value case "TCPSlowStartRetrans": - procNetstat.TcpExt.TCPSlowStartRetrans = value + procNetstat.TcpExt.TCPSlowStartRetrans = &value case "TCPTimeouts": - procNetstat.TcpExt.TCPTimeouts = value + procNetstat.TcpExt.TCPTimeouts = &value case "TCPLossProbes": - procNetstat.TcpExt.TCPLossProbes = value + procNetstat.TcpExt.TCPLossProbes = &value case "TCPLossProbeRecovery": - procNetstat.TcpExt.TCPLossProbeRecovery = value + procNetstat.TcpExt.TCPLossProbeRecovery = &value case "TCPRenoRecoveryFail": - procNetstat.TcpExt.TCPRenoRecoveryFail = value + procNetstat.TcpExt.TCPRenoRecoveryFail = &value case "TCPSackRecoveryFail": - procNetstat.TcpExt.TCPSackRecoveryFail = value + procNetstat.TcpExt.TCPSackRecoveryFail = &value case "TCPRcvCollapsed": - procNetstat.TcpExt.TCPRcvCollapsed = value + procNetstat.TcpExt.TCPRcvCollapsed = &value case "TCPDSACKOldSent": - procNetstat.TcpExt.TCPDSACKOldSent = value + procNetstat.TcpExt.TCPDSACKOldSent = &value case "TCPDSACKOfoSent": - procNetstat.TcpExt.TCPDSACKOfoSent = value + procNetstat.TcpExt.TCPDSACKOfoSent = &value case "TCPDSACKRecv": - procNetstat.TcpExt.TCPDSACKRecv = value + procNetstat.TcpExt.TCPDSACKRecv = &value case "TCPDSACKOfoRecv": - procNetstat.TcpExt.TCPDSACKOfoRecv = value + procNetstat.TcpExt.TCPDSACKOfoRecv = &value case "TCPAbortOnData": - procNetstat.TcpExt.TCPAbortOnData = value + procNetstat.TcpExt.TCPAbortOnData = &value case "TCPAbortOnClose": - procNetstat.TcpExt.TCPAbortOnClose = value + procNetstat.TcpExt.TCPAbortOnClose = &value case "TCPDeferAcceptDrop": - procNetstat.TcpExt.TCPDeferAcceptDrop = value + procNetstat.TcpExt.TCPDeferAcceptDrop = &value case "IPReversePathFilter": - procNetstat.TcpExt.IPReversePathFilter = value + procNetstat.TcpExt.IPReversePathFilter = &value case "TCPTimeWaitOverflow": - procNetstat.TcpExt.TCPTimeWaitOverflow = value + procNetstat.TcpExt.TCPTimeWaitOverflow = &value case "TCPReqQFullDoCookies": - procNetstat.TcpExt.TCPReqQFullDoCookies = value + procNetstat.TcpExt.TCPReqQFullDoCookies = &value case "TCPReqQFullDrop": - procNetstat.TcpExt.TCPReqQFullDrop = value + procNetstat.TcpExt.TCPReqQFullDrop = &value case "TCPRetransFail": - procNetstat.TcpExt.TCPRetransFail = value + procNetstat.TcpExt.TCPRetransFail = &value case "TCPRcvCoalesce": - procNetstat.TcpExt.TCPRcvCoalesce = value + procNetstat.TcpExt.TCPRcvCoalesce = &value + case "TCPRcvQDrop": + procNetstat.TcpExt.TCPRcvQDrop = &value case "TCPOFOQueue": - procNetstat.TcpExt.TCPOFOQueue = value + procNetstat.TcpExt.TCPOFOQueue = &value case "TCPOFODrop": - procNetstat.TcpExt.TCPOFODrop = value + procNetstat.TcpExt.TCPOFODrop = &value case "TCPOFOMerge": - procNetstat.TcpExt.TCPOFOMerge = value + procNetstat.TcpExt.TCPOFOMerge = &value case "TCPChallengeACK": - procNetstat.TcpExt.TCPChallengeACK = value + procNetstat.TcpExt.TCPChallengeACK = &value case "TCPSYNChallenge": - procNetstat.TcpExt.TCPSYNChallenge = value + procNetstat.TcpExt.TCPSYNChallenge = &value case "TCPFastOpenActive": - procNetstat.TcpExt.TCPFastOpenActive = value + procNetstat.TcpExt.TCPFastOpenActive = &value case "TCPFastOpenActiveFail": - procNetstat.TcpExt.TCPFastOpenActiveFail = value + procNetstat.TcpExt.TCPFastOpenActiveFail = &value case "TCPFastOpenPassive": - procNetstat.TcpExt.TCPFastOpenPassive = value + procNetstat.TcpExt.TCPFastOpenPassive = &value case "TCPFastOpenPassiveFail": - procNetstat.TcpExt.TCPFastOpenPassiveFail = value + procNetstat.TcpExt.TCPFastOpenPassiveFail = &value case "TCPFastOpenListenOverflow": - procNetstat.TcpExt.TCPFastOpenListenOverflow = value + procNetstat.TcpExt.TCPFastOpenListenOverflow = &value case "TCPFastOpenCookieReqd": - procNetstat.TcpExt.TCPFastOpenCookieReqd = value + procNetstat.TcpExt.TCPFastOpenCookieReqd = &value case "TCPFastOpenBlackhole": - procNetstat.TcpExt.TCPFastOpenBlackhole = value + procNetstat.TcpExt.TCPFastOpenBlackhole = &value case "TCPSpuriousRtxHostQueues": - procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value + procNetstat.TcpExt.TCPSpuriousRtxHostQueues = &value case "BusyPollRxPackets": - procNetstat.TcpExt.BusyPollRxPackets = value + procNetstat.TcpExt.BusyPollRxPackets = &value case "TCPAutoCorking": - procNetstat.TcpExt.TCPAutoCorking = value + procNetstat.TcpExt.TCPAutoCorking = &value case "TCPFromZeroWindowAdv": - procNetstat.TcpExt.TCPFromZeroWindowAdv = value + procNetstat.TcpExt.TCPFromZeroWindowAdv = &value case "TCPToZeroWindowAdv": - procNetstat.TcpExt.TCPToZeroWindowAdv = value + procNetstat.TcpExt.TCPToZeroWindowAdv = &value case "TCPWantZeroWindowAdv": - procNetstat.TcpExt.TCPWantZeroWindowAdv = value + procNetstat.TcpExt.TCPWantZeroWindowAdv = &value case "TCPSynRetrans": - procNetstat.TcpExt.TCPSynRetrans = value + procNetstat.TcpExt.TCPSynRetrans = &value case "TCPOrigDataSent": - procNetstat.TcpExt.TCPOrigDataSent = value + procNetstat.TcpExt.TCPOrigDataSent = &value case "TCPHystartTrainDetect": - procNetstat.TcpExt.TCPHystartTrainDetect = value + procNetstat.TcpExt.TCPHystartTrainDetect = &value case "TCPHystartTrainCwnd": - procNetstat.TcpExt.TCPHystartTrainCwnd = value + procNetstat.TcpExt.TCPHystartTrainCwnd = &value case "TCPHystartDelayDetect": - procNetstat.TcpExt.TCPHystartDelayDetect = value + procNetstat.TcpExt.TCPHystartDelayDetect = &value case "TCPHystartDelayCwnd": - procNetstat.TcpExt.TCPHystartDelayCwnd = value + procNetstat.TcpExt.TCPHystartDelayCwnd = &value case "TCPACKSkippedSynRecv": - procNetstat.TcpExt.TCPACKSkippedSynRecv = value + procNetstat.TcpExt.TCPACKSkippedSynRecv = &value case "TCPACKSkippedPAWS": - procNetstat.TcpExt.TCPACKSkippedPAWS = value + procNetstat.TcpExt.TCPACKSkippedPAWS = &value case "TCPACKSkippedSeq": - procNetstat.TcpExt.TCPACKSkippedSeq = value + procNetstat.TcpExt.TCPACKSkippedSeq = &value case "TCPACKSkippedFinWait2": - procNetstat.TcpExt.TCPACKSkippedFinWait2 = value + procNetstat.TcpExt.TCPACKSkippedFinWait2 = &value case "TCPACKSkippedTimeWait": - procNetstat.TcpExt.TCPACKSkippedTimeWait = value + procNetstat.TcpExt.TCPACKSkippedTimeWait = &value case "TCPACKSkippedChallenge": - procNetstat.TcpExt.TCPACKSkippedChallenge = value + procNetstat.TcpExt.TCPACKSkippedChallenge = &value case "TCPWinProbe": - procNetstat.TcpExt.TCPWinProbe = value + procNetstat.TcpExt.TCPWinProbe = &value case "TCPKeepAlive": - procNetstat.TcpExt.TCPKeepAlive = value + procNetstat.TcpExt.TCPKeepAlive = &value case "TCPMTUPFail": - procNetstat.TcpExt.TCPMTUPFail = value + procNetstat.TcpExt.TCPMTUPFail = &value case "TCPMTUPSuccess": - procNetstat.TcpExt.TCPMTUPSuccess = value + procNetstat.TcpExt.TCPMTUPSuccess = &value case "TCPWqueueTooBig": - procNetstat.TcpExt.TCPWqueueTooBig = value + procNetstat.TcpExt.TCPWqueueTooBig = &value } case "IpExt": switch key { case "InNoRoutes": - procNetstat.IpExt.InNoRoutes = value + procNetstat.IpExt.InNoRoutes = &value case "InTruncatedPkts": - procNetstat.IpExt.InTruncatedPkts = value + procNetstat.IpExt.InTruncatedPkts = &value case "InMcastPkts": - procNetstat.IpExt.InMcastPkts = value + procNetstat.IpExt.InMcastPkts = &value case "OutMcastPkts": - procNetstat.IpExt.OutMcastPkts = value + procNetstat.IpExt.OutMcastPkts = &value case "InBcastPkts": - procNetstat.IpExt.InBcastPkts = value + procNetstat.IpExt.InBcastPkts = &value case "OutBcastPkts": - procNetstat.IpExt.OutBcastPkts = value + procNetstat.IpExt.OutBcastPkts = &value case "InOctets": - procNetstat.IpExt.InOctets = value + procNetstat.IpExt.InOctets = &value case "OutOctets": - procNetstat.IpExt.OutOctets = value + procNetstat.IpExt.OutOctets = &value case "InMcastOctets": - procNetstat.IpExt.InMcastOctets = value + procNetstat.IpExt.InMcastOctets = &value case "OutMcastOctets": - procNetstat.IpExt.OutMcastOctets = value + procNetstat.IpExt.OutMcastOctets = &value case "InBcastOctets": - procNetstat.IpExt.InBcastOctets = value + procNetstat.IpExt.InBcastOctets = &value case "OutBcastOctets": - procNetstat.IpExt.OutBcastOctets = value + procNetstat.IpExt.OutBcastOctets = &value case "InCsumErrors": - procNetstat.IpExt.InCsumErrors = value + procNetstat.IpExt.InCsumErrors = &value case "InNoECTPkts": - procNetstat.IpExt.InNoECTPkts = value + procNetstat.IpExt.InNoECTPkts = &value case "InECT1Pkts": - procNetstat.IpExt.InECT1Pkts = value + procNetstat.IpExt.InECT1Pkts = &value case "InECT0Pkts": - procNetstat.IpExt.InECT0Pkts = value + procNetstat.IpExt.InECT0Pkts = &value case "InCEPkts": - procNetstat.IpExt.InCEPkts = value + procNetstat.IpExt.InCEPkts = &value case "ReasmOverlaps": - procNetstat.IpExt.ReasmOverlaps = value + procNetstat.IpExt.ReasmOverlaps = &value } } } diff --git a/tools/vendor/github.com/prometheus/procfs/proc_snmp.go b/tools/vendor/github.com/prometheus/procfs/proc_snmp.go index ae191896c..6c46b7188 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_snmp.go +++ b/tools/vendor/github.com/prometheus/procfs/proc_snmp.go @@ -37,100 +37,100 @@ type ProcSnmp struct { } type Ip struct { // nolint:revive - Forwarding float64 - DefaultTTL float64 - InReceives float64 - InHdrErrors float64 - InAddrErrors float64 - ForwDatagrams float64 - InUnknownProtos float64 - InDiscards float64 - InDelivers float64 - OutRequests float64 - OutDiscards float64 - OutNoRoutes float64 - ReasmTimeout float64 - ReasmReqds float64 - ReasmOKs float64 - ReasmFails float64 - FragOKs float64 - FragFails float64 - FragCreates float64 + Forwarding *float64 + DefaultTTL *float64 + InReceives *float64 + InHdrErrors *float64 + InAddrErrors *float64 + ForwDatagrams *float64 + InUnknownProtos *float64 + InDiscards *float64 + InDelivers *float64 + OutRequests *float64 + OutDiscards *float64 + OutNoRoutes *float64 + ReasmTimeout *float64 + ReasmReqds *float64 + ReasmOKs *float64 + ReasmFails *float64 + FragOKs *float64 + FragFails *float64 + FragCreates *float64 } -type Icmp struct { - InMsgs float64 - InErrors float64 - InCsumErrors float64 - InDestUnreachs float64 - InTimeExcds float64 - InParmProbs float64 - InSrcQuenchs float64 - InRedirects float64 - InEchos float64 - InEchoReps float64 - InTimestamps float64 - InTimestampReps float64 - InAddrMasks float64 - InAddrMaskReps float64 - OutMsgs float64 - OutErrors float64 - OutDestUnreachs float64 - OutTimeExcds float64 - OutParmProbs float64 - OutSrcQuenchs float64 - OutRedirects float64 - OutEchos float64 - OutEchoReps float64 - OutTimestamps float64 - OutTimestampReps float64 - OutAddrMasks float64 - OutAddrMaskReps float64 +type Icmp struct { // nolint:revive + InMsgs *float64 + InErrors *float64 + InCsumErrors *float64 + InDestUnreachs *float64 + InTimeExcds *float64 + InParmProbs *float64 + InSrcQuenchs *float64 + InRedirects *float64 + InEchos *float64 + InEchoReps *float64 + InTimestamps *float64 + InTimestampReps *float64 + InAddrMasks *float64 + InAddrMaskReps *float64 + OutMsgs *float64 + OutErrors *float64 + OutDestUnreachs *float64 + OutTimeExcds *float64 + OutParmProbs *float64 + OutSrcQuenchs *float64 + OutRedirects *float64 + OutEchos *float64 + OutEchoReps *float64 + OutTimestamps *float64 + OutTimestampReps *float64 + OutAddrMasks *float64 + OutAddrMaskReps *float64 } type IcmpMsg struct { - InType3 float64 - OutType3 float64 + InType3 *float64 + OutType3 *float64 } type Tcp struct { // nolint:revive - RtoAlgorithm float64 - RtoMin float64 - RtoMax float64 - MaxConn float64 - ActiveOpens float64 - PassiveOpens float64 - AttemptFails float64 - EstabResets float64 - CurrEstab float64 - InSegs float64 - OutSegs float64 - RetransSegs float64 - InErrs float64 - OutRsts float64 - InCsumErrors float64 + RtoAlgorithm *float64 + RtoMin *float64 + RtoMax *float64 + MaxConn *float64 + ActiveOpens *float64 + PassiveOpens *float64 + AttemptFails *float64 + EstabResets *float64 + CurrEstab *float64 + InSegs *float64 + OutSegs *float64 + RetransSegs *float64 + InErrs *float64 + OutRsts *float64 + InCsumErrors *float64 } type Udp struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } type UdpLite struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } func (p Proc) Snmp() (ProcSnmp, error) { @@ -173,178 +173,178 @@ func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) { case "Ip": switch key { case "Forwarding": - procSnmp.Ip.Forwarding = value + procSnmp.Ip.Forwarding = &value case "DefaultTTL": - procSnmp.Ip.DefaultTTL = value + procSnmp.Ip.DefaultTTL = &value case "InReceives": - procSnmp.Ip.InReceives = value + procSnmp.Ip.InReceives = &value case "InHdrErrors": - procSnmp.Ip.InHdrErrors = value + procSnmp.Ip.InHdrErrors = &value case "InAddrErrors": - procSnmp.Ip.InAddrErrors = value + procSnmp.Ip.InAddrErrors = &value case "ForwDatagrams": - procSnmp.Ip.ForwDatagrams = value + procSnmp.Ip.ForwDatagrams = &value case "InUnknownProtos": - procSnmp.Ip.InUnknownProtos = value + procSnmp.Ip.InUnknownProtos = &value case "InDiscards": - procSnmp.Ip.InDiscards = value + procSnmp.Ip.InDiscards = &value case "InDelivers": - procSnmp.Ip.InDelivers = value + procSnmp.Ip.InDelivers = &value case "OutRequests": - procSnmp.Ip.OutRequests = value + procSnmp.Ip.OutRequests = &value case "OutDiscards": - procSnmp.Ip.OutDiscards = value + procSnmp.Ip.OutDiscards = &value case "OutNoRoutes": - procSnmp.Ip.OutNoRoutes = value + procSnmp.Ip.OutNoRoutes = &value case "ReasmTimeout": - procSnmp.Ip.ReasmTimeout = value + procSnmp.Ip.ReasmTimeout = &value case "ReasmReqds": - procSnmp.Ip.ReasmReqds = value + procSnmp.Ip.ReasmReqds = &value case "ReasmOKs": - procSnmp.Ip.ReasmOKs = value + procSnmp.Ip.ReasmOKs = &value case "ReasmFails": - procSnmp.Ip.ReasmFails = value + procSnmp.Ip.ReasmFails = &value case "FragOKs": - procSnmp.Ip.FragOKs = value + procSnmp.Ip.FragOKs = &value case "FragFails": - procSnmp.Ip.FragFails = value + procSnmp.Ip.FragFails = &value case "FragCreates": - procSnmp.Ip.FragCreates = value + procSnmp.Ip.FragCreates = &value } case "Icmp": switch key { case "InMsgs": - procSnmp.Icmp.InMsgs = value + procSnmp.Icmp.InMsgs = &value case "InErrors": - procSnmp.Icmp.InErrors = value + procSnmp.Icmp.InErrors = &value case "InCsumErrors": - procSnmp.Icmp.InCsumErrors = value + procSnmp.Icmp.InCsumErrors = &value case "InDestUnreachs": - procSnmp.Icmp.InDestUnreachs = value + procSnmp.Icmp.InDestUnreachs = &value case "InTimeExcds": - procSnmp.Icmp.InTimeExcds = value + procSnmp.Icmp.InTimeExcds = &value case "InParmProbs": - procSnmp.Icmp.InParmProbs = value + procSnmp.Icmp.InParmProbs = &value case "InSrcQuenchs": - procSnmp.Icmp.InSrcQuenchs = value + procSnmp.Icmp.InSrcQuenchs = &value case "InRedirects": - procSnmp.Icmp.InRedirects = value + procSnmp.Icmp.InRedirects = &value case "InEchos": - procSnmp.Icmp.InEchos = value + procSnmp.Icmp.InEchos = &value case "InEchoReps": - procSnmp.Icmp.InEchoReps = value + procSnmp.Icmp.InEchoReps = &value case "InTimestamps": - procSnmp.Icmp.InTimestamps = value + procSnmp.Icmp.InTimestamps = &value case "InTimestampReps": - procSnmp.Icmp.InTimestampReps = value + procSnmp.Icmp.InTimestampReps = &value case "InAddrMasks": - procSnmp.Icmp.InAddrMasks = value + procSnmp.Icmp.InAddrMasks = &value case "InAddrMaskReps": - procSnmp.Icmp.InAddrMaskReps = value + procSnmp.Icmp.InAddrMaskReps = &value case "OutMsgs": - procSnmp.Icmp.OutMsgs = value + procSnmp.Icmp.OutMsgs = &value case "OutErrors": - procSnmp.Icmp.OutErrors = value + procSnmp.Icmp.OutErrors = &value case "OutDestUnreachs": - procSnmp.Icmp.OutDestUnreachs = value + procSnmp.Icmp.OutDestUnreachs = &value case "OutTimeExcds": - procSnmp.Icmp.OutTimeExcds = value + procSnmp.Icmp.OutTimeExcds = &value case "OutParmProbs": - procSnmp.Icmp.OutParmProbs = value + procSnmp.Icmp.OutParmProbs = &value case "OutSrcQuenchs": - procSnmp.Icmp.OutSrcQuenchs = value + procSnmp.Icmp.OutSrcQuenchs = &value case "OutRedirects": - procSnmp.Icmp.OutRedirects = value + procSnmp.Icmp.OutRedirects = &value case "OutEchos": - procSnmp.Icmp.OutEchos = value + procSnmp.Icmp.OutEchos = &value case "OutEchoReps": - procSnmp.Icmp.OutEchoReps = value + procSnmp.Icmp.OutEchoReps = &value case "OutTimestamps": - procSnmp.Icmp.OutTimestamps = value + procSnmp.Icmp.OutTimestamps = &value case "OutTimestampReps": - procSnmp.Icmp.OutTimestampReps = value + procSnmp.Icmp.OutTimestampReps = &value case "OutAddrMasks": - procSnmp.Icmp.OutAddrMasks = value + procSnmp.Icmp.OutAddrMasks = &value case "OutAddrMaskReps": - procSnmp.Icmp.OutAddrMaskReps = value + procSnmp.Icmp.OutAddrMaskReps = &value } case "IcmpMsg": switch key { case "InType3": - procSnmp.IcmpMsg.InType3 = value + procSnmp.IcmpMsg.InType3 = &value case "OutType3": - procSnmp.IcmpMsg.OutType3 = value + procSnmp.IcmpMsg.OutType3 = &value } case "Tcp": switch key { case "RtoAlgorithm": - procSnmp.Tcp.RtoAlgorithm = value + procSnmp.Tcp.RtoAlgorithm = &value case "RtoMin": - procSnmp.Tcp.RtoMin = value + procSnmp.Tcp.RtoMin = &value case "RtoMax": - procSnmp.Tcp.RtoMax = value + procSnmp.Tcp.RtoMax = &value case "MaxConn": - procSnmp.Tcp.MaxConn = value + procSnmp.Tcp.MaxConn = &value case "ActiveOpens": - procSnmp.Tcp.ActiveOpens = value + procSnmp.Tcp.ActiveOpens = &value case "PassiveOpens": - procSnmp.Tcp.PassiveOpens = value + procSnmp.Tcp.PassiveOpens = &value case "AttemptFails": - procSnmp.Tcp.AttemptFails = value + procSnmp.Tcp.AttemptFails = &value case "EstabResets": - procSnmp.Tcp.EstabResets = value + procSnmp.Tcp.EstabResets = &value case "CurrEstab": - procSnmp.Tcp.CurrEstab = value + procSnmp.Tcp.CurrEstab = &value case "InSegs": - procSnmp.Tcp.InSegs = value + procSnmp.Tcp.InSegs = &value case "OutSegs": - procSnmp.Tcp.OutSegs = value + procSnmp.Tcp.OutSegs = &value case "RetransSegs": - procSnmp.Tcp.RetransSegs = value + procSnmp.Tcp.RetransSegs = &value case "InErrs": - procSnmp.Tcp.InErrs = value + procSnmp.Tcp.InErrs = &value case "OutRsts": - procSnmp.Tcp.OutRsts = value + procSnmp.Tcp.OutRsts = &value case "InCsumErrors": - procSnmp.Tcp.InCsumErrors = value + procSnmp.Tcp.InCsumErrors = &value } case "Udp": switch key { case "InDatagrams": - procSnmp.Udp.InDatagrams = value + procSnmp.Udp.InDatagrams = &value case "NoPorts": - procSnmp.Udp.NoPorts = value + procSnmp.Udp.NoPorts = &value case "InErrors": - procSnmp.Udp.InErrors = value + procSnmp.Udp.InErrors = &value case "OutDatagrams": - procSnmp.Udp.OutDatagrams = value + procSnmp.Udp.OutDatagrams = &value case "RcvbufErrors": - procSnmp.Udp.RcvbufErrors = value + procSnmp.Udp.RcvbufErrors = &value case "SndbufErrors": - procSnmp.Udp.SndbufErrors = value + procSnmp.Udp.SndbufErrors = &value case "InCsumErrors": - procSnmp.Udp.InCsumErrors = value + procSnmp.Udp.InCsumErrors = &value case "IgnoredMulti": - procSnmp.Udp.IgnoredMulti = value + procSnmp.Udp.IgnoredMulti = &value } case "UdpLite": switch key { case "InDatagrams": - procSnmp.UdpLite.InDatagrams = value + procSnmp.UdpLite.InDatagrams = &value case "NoPorts": - procSnmp.UdpLite.NoPorts = value + procSnmp.UdpLite.NoPorts = &value case "InErrors": - procSnmp.UdpLite.InErrors = value + procSnmp.UdpLite.InErrors = &value case "OutDatagrams": - procSnmp.UdpLite.OutDatagrams = value + procSnmp.UdpLite.OutDatagrams = &value case "RcvbufErrors": - procSnmp.UdpLite.RcvbufErrors = value + procSnmp.UdpLite.RcvbufErrors = &value case "SndbufErrors": - procSnmp.UdpLite.SndbufErrors = value + procSnmp.UdpLite.SndbufErrors = &value case "InCsumErrors": - procSnmp.UdpLite.InCsumErrors = value + procSnmp.UdpLite.InCsumErrors = &value case "IgnoredMulti": - procSnmp.UdpLite.IgnoredMulti = value + procSnmp.UdpLite.IgnoredMulti = &value } } } diff --git a/tools/vendor/github.com/prometheus/procfs/proc_snmp6.go b/tools/vendor/github.com/prometheus/procfs/proc_snmp6.go index f611992d5..3059cc6a1 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_snmp6.go +++ b/tools/vendor/github.com/prometheus/procfs/proc_snmp6.go @@ -36,106 +36,106 @@ type ProcSnmp6 struct { } type Ip6 struct { // nolint:revive - InReceives float64 - InHdrErrors float64 - InTooBigErrors float64 - InNoRoutes float64 - InAddrErrors float64 - InUnknownProtos float64 - InTruncatedPkts float64 - InDiscards float64 - InDelivers float64 - OutForwDatagrams float64 - OutRequests float64 - OutDiscards float64 - OutNoRoutes float64 - ReasmTimeout float64 - ReasmReqds float64 - ReasmOKs float64 - ReasmFails float64 - FragOKs float64 - FragFails float64 - FragCreates float64 - InMcastPkts float64 - OutMcastPkts float64 - InOctets float64 - OutOctets float64 - InMcastOctets float64 - OutMcastOctets float64 - InBcastOctets float64 - OutBcastOctets float64 - InNoECTPkts float64 - InECT1Pkts float64 - InECT0Pkts float64 - InCEPkts float64 + InReceives *float64 + InHdrErrors *float64 + InTooBigErrors *float64 + InNoRoutes *float64 + InAddrErrors *float64 + InUnknownProtos *float64 + InTruncatedPkts *float64 + InDiscards *float64 + InDelivers *float64 + OutForwDatagrams *float64 + OutRequests *float64 + OutDiscards *float64 + OutNoRoutes *float64 + ReasmTimeout *float64 + ReasmReqds *float64 + ReasmOKs *float64 + ReasmFails *float64 + FragOKs *float64 + FragFails *float64 + FragCreates *float64 + InMcastPkts *float64 + OutMcastPkts *float64 + InOctets *float64 + OutOctets *float64 + InMcastOctets *float64 + OutMcastOctets *float64 + InBcastOctets *float64 + OutBcastOctets *float64 + InNoECTPkts *float64 + InECT1Pkts *float64 + InECT0Pkts *float64 + InCEPkts *float64 } type Icmp6 struct { - InMsgs float64 - InErrors float64 - OutMsgs float64 - OutErrors float64 - InCsumErrors float64 - InDestUnreachs float64 - InPktTooBigs float64 - InTimeExcds float64 - InParmProblems float64 - InEchos float64 - InEchoReplies float64 - InGroupMembQueries float64 - InGroupMembResponses float64 - InGroupMembReductions float64 - InRouterSolicits float64 - InRouterAdvertisements float64 - InNeighborSolicits float64 - InNeighborAdvertisements float64 - InRedirects float64 - InMLDv2Reports float64 - OutDestUnreachs float64 - OutPktTooBigs float64 - OutTimeExcds float64 - OutParmProblems float64 - OutEchos float64 - OutEchoReplies float64 - OutGroupMembQueries float64 - OutGroupMembResponses float64 - OutGroupMembReductions float64 - OutRouterSolicits float64 - OutRouterAdvertisements float64 - OutNeighborSolicits float64 - OutNeighborAdvertisements float64 - OutRedirects float64 - OutMLDv2Reports float64 - InType1 float64 - InType134 float64 - InType135 float64 - InType136 float64 - InType143 float64 - OutType133 float64 - OutType135 float64 - OutType136 float64 - OutType143 float64 + InMsgs *float64 + InErrors *float64 + OutMsgs *float64 + OutErrors *float64 + InCsumErrors *float64 + InDestUnreachs *float64 + InPktTooBigs *float64 + InTimeExcds *float64 + InParmProblems *float64 + InEchos *float64 + InEchoReplies *float64 + InGroupMembQueries *float64 + InGroupMembResponses *float64 + InGroupMembReductions *float64 + InRouterSolicits *float64 + InRouterAdvertisements *float64 + InNeighborSolicits *float64 + InNeighborAdvertisements *float64 + InRedirects *float64 + InMLDv2Reports *float64 + OutDestUnreachs *float64 + OutPktTooBigs *float64 + OutTimeExcds *float64 + OutParmProblems *float64 + OutEchos *float64 + OutEchoReplies *float64 + OutGroupMembQueries *float64 + OutGroupMembResponses *float64 + OutGroupMembReductions *float64 + OutRouterSolicits *float64 + OutRouterAdvertisements *float64 + OutNeighborSolicits *float64 + OutNeighborAdvertisements *float64 + OutRedirects *float64 + OutMLDv2Reports *float64 + InType1 *float64 + InType134 *float64 + InType135 *float64 + InType136 *float64 + InType143 *float64 + OutType133 *float64 + OutType135 *float64 + OutType136 *float64 + OutType143 *float64 } type Udp6 struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } type UdpLite6 struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 } func (p Proc) Snmp6() (ProcSnmp6, error) { @@ -182,197 +182,197 @@ func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) { case "Ip6": switch key { case "InReceives": - procSnmp6.Ip6.InReceives = value + procSnmp6.Ip6.InReceives = &value case "InHdrErrors": - procSnmp6.Ip6.InHdrErrors = value + procSnmp6.Ip6.InHdrErrors = &value case "InTooBigErrors": - procSnmp6.Ip6.InTooBigErrors = value + procSnmp6.Ip6.InTooBigErrors = &value case "InNoRoutes": - procSnmp6.Ip6.InNoRoutes = value + procSnmp6.Ip6.InNoRoutes = &value case "InAddrErrors": - procSnmp6.Ip6.InAddrErrors = value + procSnmp6.Ip6.InAddrErrors = &value case "InUnknownProtos": - procSnmp6.Ip6.InUnknownProtos = value + procSnmp6.Ip6.InUnknownProtos = &value case "InTruncatedPkts": - procSnmp6.Ip6.InTruncatedPkts = value + procSnmp6.Ip6.InTruncatedPkts = &value case "InDiscards": - procSnmp6.Ip6.InDiscards = value + procSnmp6.Ip6.InDiscards = &value case "InDelivers": - procSnmp6.Ip6.InDelivers = value + procSnmp6.Ip6.InDelivers = &value case "OutForwDatagrams": - procSnmp6.Ip6.OutForwDatagrams = value + procSnmp6.Ip6.OutForwDatagrams = &value case "OutRequests": - procSnmp6.Ip6.OutRequests = value + procSnmp6.Ip6.OutRequests = &value case "OutDiscards": - procSnmp6.Ip6.OutDiscards = value + procSnmp6.Ip6.OutDiscards = &value case "OutNoRoutes": - procSnmp6.Ip6.OutNoRoutes = value + procSnmp6.Ip6.OutNoRoutes = &value case "ReasmTimeout": - procSnmp6.Ip6.ReasmTimeout = value + procSnmp6.Ip6.ReasmTimeout = &value case "ReasmReqds": - procSnmp6.Ip6.ReasmReqds = value + procSnmp6.Ip6.ReasmReqds = &value case "ReasmOKs": - procSnmp6.Ip6.ReasmOKs = value + procSnmp6.Ip6.ReasmOKs = &value case "ReasmFails": - procSnmp6.Ip6.ReasmFails = value + procSnmp6.Ip6.ReasmFails = &value case "FragOKs": - procSnmp6.Ip6.FragOKs = value + procSnmp6.Ip6.FragOKs = &value case "FragFails": - procSnmp6.Ip6.FragFails = value + procSnmp6.Ip6.FragFails = &value case "FragCreates": - procSnmp6.Ip6.FragCreates = value + procSnmp6.Ip6.FragCreates = &value case "InMcastPkts": - procSnmp6.Ip6.InMcastPkts = value + procSnmp6.Ip6.InMcastPkts = &value case "OutMcastPkts": - procSnmp6.Ip6.OutMcastPkts = value + procSnmp6.Ip6.OutMcastPkts = &value case "InOctets": - procSnmp6.Ip6.InOctets = value + procSnmp6.Ip6.InOctets = &value case "OutOctets": - procSnmp6.Ip6.OutOctets = value + procSnmp6.Ip6.OutOctets = &value case "InMcastOctets": - procSnmp6.Ip6.InMcastOctets = value + procSnmp6.Ip6.InMcastOctets = &value case "OutMcastOctets": - procSnmp6.Ip6.OutMcastOctets = value + procSnmp6.Ip6.OutMcastOctets = &value case "InBcastOctets": - procSnmp6.Ip6.InBcastOctets = value + procSnmp6.Ip6.InBcastOctets = &value case "OutBcastOctets": - procSnmp6.Ip6.OutBcastOctets = value + procSnmp6.Ip6.OutBcastOctets = &value case "InNoECTPkts": - procSnmp6.Ip6.InNoECTPkts = value + procSnmp6.Ip6.InNoECTPkts = &value case "InECT1Pkts": - procSnmp6.Ip6.InECT1Pkts = value + procSnmp6.Ip6.InECT1Pkts = &value case "InECT0Pkts": - procSnmp6.Ip6.InECT0Pkts = value + procSnmp6.Ip6.InECT0Pkts = &value case "InCEPkts": - procSnmp6.Ip6.InCEPkts = value + procSnmp6.Ip6.InCEPkts = &value } case "Icmp6": switch key { case "InMsgs": - procSnmp6.Icmp6.InMsgs = value + procSnmp6.Icmp6.InMsgs = &value case "InErrors": - procSnmp6.Icmp6.InErrors = value + procSnmp6.Icmp6.InErrors = &value case "OutMsgs": - procSnmp6.Icmp6.OutMsgs = value + procSnmp6.Icmp6.OutMsgs = &value case "OutErrors": - procSnmp6.Icmp6.OutErrors = value + procSnmp6.Icmp6.OutErrors = &value case "InCsumErrors": - procSnmp6.Icmp6.InCsumErrors = value + procSnmp6.Icmp6.InCsumErrors = &value case "InDestUnreachs": - procSnmp6.Icmp6.InDestUnreachs = value + procSnmp6.Icmp6.InDestUnreachs = &value case "InPktTooBigs": - procSnmp6.Icmp6.InPktTooBigs = value + procSnmp6.Icmp6.InPktTooBigs = &value case "InTimeExcds": - procSnmp6.Icmp6.InTimeExcds = value + procSnmp6.Icmp6.InTimeExcds = &value case "InParmProblems": - procSnmp6.Icmp6.InParmProblems = value + procSnmp6.Icmp6.InParmProblems = &value case "InEchos": - procSnmp6.Icmp6.InEchos = value + procSnmp6.Icmp6.InEchos = &value case "InEchoReplies": - procSnmp6.Icmp6.InEchoReplies = value + procSnmp6.Icmp6.InEchoReplies = &value case "InGroupMembQueries": - procSnmp6.Icmp6.InGroupMembQueries = value + procSnmp6.Icmp6.InGroupMembQueries = &value case "InGroupMembResponses": - procSnmp6.Icmp6.InGroupMembResponses = value + procSnmp6.Icmp6.InGroupMembResponses = &value case "InGroupMembReductions": - procSnmp6.Icmp6.InGroupMembReductions = value + procSnmp6.Icmp6.InGroupMembReductions = &value case "InRouterSolicits": - procSnmp6.Icmp6.InRouterSolicits = value + procSnmp6.Icmp6.InRouterSolicits = &value case "InRouterAdvertisements": - procSnmp6.Icmp6.InRouterAdvertisements = value + procSnmp6.Icmp6.InRouterAdvertisements = &value case "InNeighborSolicits": - procSnmp6.Icmp6.InNeighborSolicits = value + procSnmp6.Icmp6.InNeighborSolicits = &value case "InNeighborAdvertisements": - procSnmp6.Icmp6.InNeighborAdvertisements = value + procSnmp6.Icmp6.InNeighborAdvertisements = &value case "InRedirects": - procSnmp6.Icmp6.InRedirects = value + procSnmp6.Icmp6.InRedirects = &value case "InMLDv2Reports": - procSnmp6.Icmp6.InMLDv2Reports = value + procSnmp6.Icmp6.InMLDv2Reports = &value case "OutDestUnreachs": - procSnmp6.Icmp6.OutDestUnreachs = value + procSnmp6.Icmp6.OutDestUnreachs = &value case "OutPktTooBigs": - procSnmp6.Icmp6.OutPktTooBigs = value + procSnmp6.Icmp6.OutPktTooBigs = &value case "OutTimeExcds": - procSnmp6.Icmp6.OutTimeExcds = value + procSnmp6.Icmp6.OutTimeExcds = &value case "OutParmProblems": - procSnmp6.Icmp6.OutParmProblems = value + procSnmp6.Icmp6.OutParmProblems = &value case "OutEchos": - procSnmp6.Icmp6.OutEchos = value + procSnmp6.Icmp6.OutEchos = &value case "OutEchoReplies": - procSnmp6.Icmp6.OutEchoReplies = value + procSnmp6.Icmp6.OutEchoReplies = &value case "OutGroupMembQueries": - procSnmp6.Icmp6.OutGroupMembQueries = value + procSnmp6.Icmp6.OutGroupMembQueries = &value case "OutGroupMembResponses": - procSnmp6.Icmp6.OutGroupMembResponses = value + procSnmp6.Icmp6.OutGroupMembResponses = &value case "OutGroupMembReductions": - procSnmp6.Icmp6.OutGroupMembReductions = value + procSnmp6.Icmp6.OutGroupMembReductions = &value case "OutRouterSolicits": - procSnmp6.Icmp6.OutRouterSolicits = value + procSnmp6.Icmp6.OutRouterSolicits = &value case "OutRouterAdvertisements": - procSnmp6.Icmp6.OutRouterAdvertisements = value + procSnmp6.Icmp6.OutRouterAdvertisements = &value case "OutNeighborSolicits": - procSnmp6.Icmp6.OutNeighborSolicits = value + procSnmp6.Icmp6.OutNeighborSolicits = &value case "OutNeighborAdvertisements": - procSnmp6.Icmp6.OutNeighborAdvertisements = value + procSnmp6.Icmp6.OutNeighborAdvertisements = &value case "OutRedirects": - procSnmp6.Icmp6.OutRedirects = value + procSnmp6.Icmp6.OutRedirects = &value case "OutMLDv2Reports": - procSnmp6.Icmp6.OutMLDv2Reports = value + procSnmp6.Icmp6.OutMLDv2Reports = &value case "InType1": - procSnmp6.Icmp6.InType1 = value + procSnmp6.Icmp6.InType1 = &value case "InType134": - procSnmp6.Icmp6.InType134 = value + procSnmp6.Icmp6.InType134 = &value case "InType135": - procSnmp6.Icmp6.InType135 = value + procSnmp6.Icmp6.InType135 = &value case "InType136": - procSnmp6.Icmp6.InType136 = value + procSnmp6.Icmp6.InType136 = &value case "InType143": - procSnmp6.Icmp6.InType143 = value + procSnmp6.Icmp6.InType143 = &value case "OutType133": - procSnmp6.Icmp6.OutType133 = value + procSnmp6.Icmp6.OutType133 = &value case "OutType135": - procSnmp6.Icmp6.OutType135 = value + procSnmp6.Icmp6.OutType135 = &value case "OutType136": - procSnmp6.Icmp6.OutType136 = value + procSnmp6.Icmp6.OutType136 = &value case "OutType143": - procSnmp6.Icmp6.OutType143 = value + procSnmp6.Icmp6.OutType143 = &value } case "Udp6": switch key { case "InDatagrams": - procSnmp6.Udp6.InDatagrams = value + procSnmp6.Udp6.InDatagrams = &value case "NoPorts": - procSnmp6.Udp6.NoPorts = value + procSnmp6.Udp6.NoPorts = &value case "InErrors": - procSnmp6.Udp6.InErrors = value + procSnmp6.Udp6.InErrors = &value case "OutDatagrams": - procSnmp6.Udp6.OutDatagrams = value + procSnmp6.Udp6.OutDatagrams = &value case "RcvbufErrors": - procSnmp6.Udp6.RcvbufErrors = value + procSnmp6.Udp6.RcvbufErrors = &value case "SndbufErrors": - procSnmp6.Udp6.SndbufErrors = value + procSnmp6.Udp6.SndbufErrors = &value case "InCsumErrors": - procSnmp6.Udp6.InCsumErrors = value + procSnmp6.Udp6.InCsumErrors = &value case "IgnoredMulti": - procSnmp6.Udp6.IgnoredMulti = value + procSnmp6.Udp6.IgnoredMulti = &value } case "UdpLite6": switch key { case "InDatagrams": - procSnmp6.UdpLite6.InDatagrams = value + procSnmp6.UdpLite6.InDatagrams = &value case "NoPorts": - procSnmp6.UdpLite6.NoPorts = value + procSnmp6.UdpLite6.NoPorts = &value case "InErrors": - procSnmp6.UdpLite6.InErrors = value + procSnmp6.UdpLite6.InErrors = &value case "OutDatagrams": - procSnmp6.UdpLite6.OutDatagrams = value + procSnmp6.UdpLite6.OutDatagrams = &value case "RcvbufErrors": - procSnmp6.UdpLite6.RcvbufErrors = value + procSnmp6.UdpLite6.RcvbufErrors = &value case "SndbufErrors": - procSnmp6.UdpLite6.SndbufErrors = value + procSnmp6.UdpLite6.SndbufErrors = &value case "InCsumErrors": - procSnmp6.UdpLite6.InCsumErrors = value + procSnmp6.UdpLite6.InCsumErrors = &value } } } diff --git a/tools/vendor/github.com/prometheus/procfs/proc_stat.go b/tools/vendor/github.com/prometheus/procfs/proc_stat.go index 06c556ef9..14b249f4f 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/tools/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" ) @@ -102,6 +101,8 @@ type ProcStat struct { RSS int // Soft limit in bytes on the rss of the process. RSSLimit uint64 + // CPU number last executed on. + Processor uint // Real-time scheduling priority, a number in the range 1 to 99 for processes // scheduled under a real-time policy, or 0, for non-real-time processes. RTPriority uint @@ -110,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. @@ -184,7 +185,7 @@ func (p Proc) Stat() (ProcStat, error) { &ignoreUint64, &ignoreUint64, &ignoreInt64, - &ignoreInt64, + &s.Processor, &s.RTPriority, &s.Policy, &s.DelayAcctBlkIOTicks, @@ -208,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/tools/vendor/github.com/prometheus/procfs/proc_status.go b/tools/vendor/github.com/prometheus/procfs/proc_status.go index 594022ded..c055d075d 100644 --- a/tools/vendor/github.com/prometheus/procfs/proc_status.go +++ b/tools/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. @@ -96,10 +100,10 @@ func (p Proc) NewStatus() (ProcStatus, error) { kv := strings.SplitN(line, ":", 2) // removes spaces - k := string(strings.TrimSpace(kv[0])) - v := string(strings.TrimSpace(kv[1])) + k := strings.TrimSpace(kv[0]) + v := strings.TrimSpace(kv[1]) // removes "kB" - v = string(bytes.Trim([]byte(v), " kB")) + v = strings.TrimSuffix(v, " kB") // value to int when possible // we can skip error check here, 'cause vKBytes is not used when value is a string @@ -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/tools/vendor/github.com/prometheus/procfs/stat.go b/tools/vendor/github.com/prometheus/procfs/stat.go index 33f97caa0..586af48af 100644 --- a/tools/vendor/github.com/prometheus/procfs/stat.go +++ b/tools/vendor/github.com/prometheus/procfs/stat.go @@ -62,7 +62,7 @@ type Stat struct { // Summed up cpu statistics. CPUTotal CPUStat // Per-CPU statistics. - CPU []CPUStat + CPU map[int64]CPUStat // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. IRQTotal uint64 // Number of times a numbered IRQ was triggered. @@ -170,10 +170,23 @@ func (fs FS) Stat() (Stat, error) { if err != nil { return Stat{}, err } + procStat, err := parseStat(bytes.NewReader(data), fileName) + if err != nil { + return Stat{}, err + } + return procStat, nil +} - stat := Stat{} +// parseStat parses the metrics from /proc/[pid]/stat. +func parseStat(r io.Reader, fileName string) (Stat, error) { + var ( + scanner = bufio.NewScanner(r) + stat = Stat{ + CPU: make(map[int64]CPUStat), + } + err error + ) - scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(scanner.Text()) @@ -228,9 +241,6 @@ func (fs FS) Stat() (Stat, error) { if cpuID == -1 { stat.CPUTotal = cpuStat } else { - for int64(len(stat.CPU)) <= cpuID { - stat.CPU = append(stat.CPU, CPUStat{}) - } stat.CPU[cpuID] = cpuStat } } diff --git a/tools/vendor/github.com/prometheus/procfs/thread.go b/tools/vendor/github.com/prometheus/procfs/thread.go new file mode 100644 index 000000000..490c14708 --- /dev/null +++ b/tools/vendor/github.com/prometheus/procfs/thread.go @@ -0,0 +1,80 @@ +// 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 procfs + +import ( + "fmt" + "os" + "strconv" + + fsi "github.com/prometheus/procfs/internal/fs" +) + +// Provide access to /proc/PID/task/TID files, for thread specific values. Since +// such files have the same structure as /proc/PID/ ones, the data structures +// and the parsers for the latter may be reused. + +// AllThreads returns a list of all currently available threads under /proc/PID. +func AllThreads(pid int) (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllThreads(pid) +} + +// AllThreads returns a list of all currently available threads for PID. +func (fs FS) AllThreads(pid int) (Procs, error) { + taskPath := fs.proc.Path(strconv.Itoa(pid), "task") + d, err := os.Open(taskPath) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err) + } + + t := Procs{} + for _, n := range names { + tid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + + t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.real}}) + } + + return t, nil +} + +// Thread returns a process for a given PID, TID. +func (fs FS) Thread(pid, tid int) (Proc, error) { + taskPath := fs.proc.Path(strconv.Itoa(pid), "task") + if _, err := os.Stat(taskPath); err != nil { + return Proc{}, err + } + 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 := 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/tools/vendor/github.com/prometheus/procfs/vm.go b/tools/vendor/github.com/prometheus/procfs/vm.go index 20ceb77e2..cdedcae99 100644 --- a/tools/vendor/github.com/prometheus/procfs/vm.go +++ b/tools/vendor/github.com/prometheus/procfs/vm.go @@ -26,7 +26,9 @@ import ( ) // The VM interface is described at -// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// // Each setting is exposed as a single file. // Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array // and numa_zonelist_order (deprecated) which is a string. diff --git a/tools/vendor/github.com/rubenv/sql-migrate/README.md b/tools/vendor/github.com/rubenv/sql-migrate/README.md index 56585233b..9e4435d6d 100644 --- a/tools/vendor/github.com/rubenv/sql-migrate/README.md +++ b/tools/vendor/github.com/rubenv/sql-migrate/README.md @@ -4,8 +4,6 @@ [![Build Status](https://travis-ci.org/rubenv/sql-migrate.svg?branch=master)](https://travis-ci.org/rubenv/sql-migrate) [![GoDoc](https://godoc.org/github.com/rubenv/sql-migrate?status.svg)](https://godoc.org/github.com/rubenv/sql-migrate) -Using [modl](https://github.com/jmoiron/modl)? Check out [modl-migrate](https://github.com/rubenv/modl-migrate). - ## Features * Usable as a CLI tool or as a library @@ -90,12 +88,13 @@ Options: -config=dbconfig.yml Configuration file to use. -env="development" Environment. -limit=0 Limit the number of migrations (0 = unlimited). + -version Run migrate up to a specific version, eg: the version number of migration 1_initial.sql is 1. -dryrun Don't apply migrations, just print them. ``` The `new` command creates a new empty migration template using the following pattern `-.sql`. -The `up` command applies all available migrations. By contrast, `down` will only apply one migration by default. This behavior can be changed for both by using the `-limit` parameter. +The `up` command applies all available migrations. By contrast, `down` will only apply one migration by default. This behavior can be changed for both by using the `-limit` parameter, and the `-version` parameter. Note `-version` has higher priority than `-limit` if you try to use them both. The `redo` command will unapply the last migration and reapply it. This is useful during development, when you're writing migrations. @@ -399,6 +398,10 @@ if err != nil { } ``` +## Questions or Feedback? + +You can use Github Issues for feedback or questions. + ## License This library is distributed under the [MIT](LICENSE) license. diff --git a/tools/vendor/github.com/rubenv/sql-migrate/migrate.go b/tools/vendor/github.com/rubenv/sql-migrate/migrate.go index a92fac5e5..a6ff7b252 100644 --- a/tools/vendor/github.com/rubenv/sql-migrate/migrate.go +++ b/tools/vendor/github.com/rubenv/sql-migrate/migrate.go @@ -16,6 +16,7 @@ import ( "time" "github.com/go-gorp/gorp/v3" + "github.com/rubenv/sql-migrate/sqlparse" ) @@ -444,17 +445,42 @@ func ExecMax(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirecti return migSet.ExecMax(db, dialect, m, dir, max) } +// Execute a set of migrations +// +// Will apply at the target `version` of migration. Cannot be a negative value. +// +// Returns the number of applied migrations. +func ExecVersion(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, version int64) (int, error) { + if version < 0 { + return 0, fmt.Errorf("target version %d should not be negative", version) + } + return migSet.ExecVersion(db, dialect, m, dir, version) +} + // Returns the number of applied migrations. func (ms MigrationSet) ExecMax(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, max int) (int, error) { migrations, dbMap, err := ms.PlanMigration(db, dialect, m, dir, max) if err != nil { return 0, err } + return ms.applyMigrations(dir, migrations, dbMap) +} + +// Returns the number of applied migrations. +func (ms MigrationSet) ExecVersion(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, version int64) (int, error) { + migrations, dbMap, err := ms.PlanMigrationToVersion(db, dialect, m, dir, version) + if err != nil { + return 0, err + } + return ms.applyMigrations(dir, migrations, dbMap) +} - // Apply migrations +// Applies the planned migrations and returns the number of applied migrations. +func (ms MigrationSet) applyMigrations(dir MigrationDirection, migrations []*PlannedMigration, dbMap *gorp.DbMap) (int, error) { applied := 0 for _, migration := range migrations { var executor SqlExecutor + var err error if migration.DisableTransaction { executor = dbMap @@ -524,7 +550,23 @@ func PlanMigration(db *sql.DB, dialect string, m MigrationSource, dir MigrationD return migSet.PlanMigration(db, dialect, m, dir, max) } +// Plan a migration to version. +func PlanMigrationToVersion(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, version int64) ([]*PlannedMigration, *gorp.DbMap, error) { + return migSet.PlanMigrationToVersion(db, dialect, m, dir, version) +} + +// Plan a migration. func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, max int) ([]*PlannedMigration, *gorp.DbMap, error) { + return ms.planMigrationCommon(db, dialect, m, dir, max, -1) +} + +// Plan a migration to version. +func (ms MigrationSet) PlanMigrationToVersion(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, version int64) ([]*PlannedMigration, *gorp.DbMap, error) { + return ms.planMigrationCommon(db, dialect, m, dir, 0, version) +} + +// A common method to plan a migration. +func (ms MigrationSet) planMigrationCommon(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, max int, version int64) ([]*PlannedMigration, *gorp.DbMap, error) { dbMap, err := ms.getMigrationDbMap(db, dialect) if err != nil { return nil, nil, err @@ -581,7 +623,24 @@ func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSour // Figure out which migrations to apply toApply := ToApply(migrations, record.Id, dir) toApplyCount := len(toApply) - if max > 0 && max < toApplyCount { + + if version >= 0 { + targetIndex := 0 + for targetIndex < len(toApply) { + tempVersion := toApply[targetIndex].VersionInt() + if dir == Up && tempVersion > version || dir == Down && tempVersion < version { + return nil, nil, newPlanError(&Migration{}, fmt.Errorf("unknown migration with version id %d in database", version).Error()) + } + if tempVersion == version { + toApplyCount = targetIndex + 1 + break + } + targetIndex++ + } + if targetIndex == len(toApply) { + return nil, nil, newPlanError(&Migration{}, fmt.Errorf("unknown migration with version id %d in database", version).Error()) + } + } else if max > 0 && max < toApplyCount { toApplyCount = max } for _, v := range toApply[0:toApplyCount] { diff --git a/tools/vendor/github.com/sirupsen/logrus/README.md b/tools/vendor/github.com/sirupsen/logrus/README.md index b042c896f..d1d4a85fd 100644 --- a/tools/vendor/github.com/sirupsen/logrus/README.md +++ b/tools/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/tools/vendor/github.com/sirupsen/logrus/writer.go b/tools/vendor/github.com/sirupsen/logrus/writer.go index 72e8e3a1b..074fd4b8b 100644 --- a/tools/vendor/github.com/sirupsen/logrus/writer.go +++ b/tools/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/tools/vendor/github.com/stretchr/testify/assert/assertions.go b/tools/vendor/github.com/stretchr/testify/assert/assertions.go index fa1245b18..2924cf3a1 100644 --- a/tools/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/tools/vendor/github.com/stretchr/testify/assert/assertions.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "os" - "path/filepath" "reflect" "regexp" "runtime" @@ -141,12 +140,11 @@ func CallerInfo() []string { } parts := strings.Split(file, "/") - file = parts[len(parts)-1] if len(parts) > 1 { + filename := parts[len(parts)-1] dir := parts[len(parts)-2] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - path, _ := filepath.Abs(file) - callers = append(callers, fmt.Sprintf("%s:%d", path, line)) + if (dir != "assert" && dir != "mock" && dir != "require") || filename == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) } } @@ -530,7 +528,7 @@ func isNil(object interface{}) bool { []reflect.Kind{ reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, - reflect.Ptr, reflect.Slice}, + reflect.Ptr, reflect.Slice, reflect.UnsafePointer}, kind) if isNilableKind && value.IsNil() { @@ -818,49 +816,44 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok return true // we consider nil to be equal to the nil set } - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } + subsetKind := reflect.TypeOf(subset).Kind() if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } - subsetValue := reflect.ValueOf(subset) if subsetKind == reflect.Map && listKind == reflect.Map { - listValue := reflect.ValueOf(list) - subsetKeys := subsetValue.MapKeys() + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) - for i := 0; i < len(subsetKeys); i++ { - subsetKey := subsetKeys[i] - subsetElement := subsetValue.MapIndex(subsetKey).Interface() - listElement := listValue.MapIndex(subsetKey).Interface() + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) - if !ObjectsAreEqual(subsetElement, listElement) { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, subsetElement), msgAndArgs...) + if !av.IsValid() { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) } } return true } - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() ok, found := containsElement(list, element) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", list), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, element), msgAndArgs...) } } @@ -879,34 +872,28 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...) } - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } + subsetKind := reflect.TypeOf(subset).Kind() if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } - subsetValue := reflect.ValueOf(subset) if subsetKind == reflect.Map && listKind == reflect.Map { - listValue := reflect.ValueOf(list) - subsetKeys := subsetValue.MapKeys() + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) - for i := 0; i < len(subsetKeys); i++ { - subsetKey := subsetKeys[i] - subsetElement := subsetValue.MapIndex(subsetKey).Interface() - listElement := listValue.MapIndex(subsetKey).Interface() + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) - if !ObjectsAreEqual(subsetElement, listElement) { + if !av.IsValid() { + return true + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { return true } } @@ -914,8 +901,9 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) } - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() ok, found := containsElement(list, element) if !ok { return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) diff --git a/tools/vendor/github.com/xlab/treeprint/.gitignore b/tools/vendor/github.com/xlab/treeprint/.gitignore new file mode 100644 index 000000000..7c9305d66 --- /dev/null +++ b/tools/vendor/github.com/xlab/treeprint/.gitignore @@ -0,0 +1,3 @@ +vendor/** +.idea +**/**.iml diff --git a/tools/vendor/github.com/xlab/treeprint/treeprint.go b/tools/vendor/github.com/xlab/treeprint/treeprint.go index f90441461..fc8204b71 100644 --- a/tools/vendor/github.com/xlab/treeprint/treeprint.go +++ b/tools/vendor/github.com/xlab/treeprint/treeprint.go @@ -16,28 +16,28 @@ type Value interface{} type MetaValue interface{} // NodeVisitor function type for iterating over nodes -type NodeVisitor func(item *node) +type NodeVisitor func(item *Node) // Tree represents a tree structure with leaf-nodes and branch-nodes. type Tree interface { - // AddNode adds a new node to a branch. + // AddNode adds a new Node to a branch. AddNode(v Value) Tree - // AddMetaNode adds a new node with meta value provided to a branch. + // AddMetaNode adds a new Node with meta value provided to a branch. AddMetaNode(meta MetaValue, v Value) Tree - // AddBranch adds a new branch node (a level deeper). + // AddBranch adds a new branch Node (a level deeper). AddBranch(v Value) Tree - // AddMetaBranch adds a new branch node (a level deeper) with meta value provided. + // AddMetaBranch adds a new branch Node (a level deeper) with meta value provided. AddMetaBranch(meta MetaValue, v Value) Tree - // Branch converts a leaf-node to a branch-node, - // applying this on a branch-node does no effect. + // Branch converts a leaf-Node to a branch-Node, + // applying this on a branch-Node does no effect. Branch() Tree - // FindByMeta finds a node whose meta value matches the provided one by reflect.DeepEqual, + // FindByMeta finds a Node whose meta value matches the provided one by reflect.DeepEqual, // returns nil if not found. FindByMeta(meta MetaValue) Tree - // FindByValue finds a node whose value matches the provided one by reflect.DeepEqual, + // FindByValue finds a Node whose value matches the provided one by reflect.DeepEqual, // returns nil if not found. FindByValue(value Value) Tree - // returns the last node of a tree + // returns the last Node of a tree FindLastNode() Tree // String renders the tree or subtree as a string. String() string @@ -48,19 +48,19 @@ type Tree interface { SetMetaValue(meta MetaValue) // VisitAll iterates over the tree, branches and nodes. - // If need to iterate over the whole tree, use the root node. + // If need to iterate over the whole tree, use the root Node. // Note this method uses a breadth-first approach. VisitAll(fn NodeVisitor) } -type node struct { - Root *node +type Node struct { + Root *Node Meta MetaValue Value Value - Nodes []*node + Nodes []*Node } -func (n *node) FindLastNode() Tree { +func (n *Node) FindLastNode() Tree { ns := n.Nodes if len(ns) == 0 { return nil @@ -68,16 +68,16 @@ func (n *node) FindLastNode() Tree { return ns[len(ns)-1] } -func (n *node) AddNode(v Value) Tree { - n.Nodes = append(n.Nodes, &node{ +func (n *Node) AddNode(v Value) Tree { + n.Nodes = append(n.Nodes, &Node{ Root: n, Value: v, }) return n } -func (n *node) AddMetaNode(meta MetaValue, v Value) Tree { - n.Nodes = append(n.Nodes, &node{ +func (n *Node) AddMetaNode(meta MetaValue, v Value) Tree { + n.Nodes = append(n.Nodes, &Node{ Root: n, Meta: meta, Value: v, @@ -85,8 +85,8 @@ func (n *node) AddMetaNode(meta MetaValue, v Value) Tree { return n } -func (n *node) AddBranch(v Value) Tree { - branch := &node{ +func (n *Node) AddBranch(v Value) Tree { + branch := &Node{ Root: n, Value: v, } @@ -94,8 +94,8 @@ func (n *node) AddBranch(v Value) Tree { return branch } -func (n *node) AddMetaBranch(meta MetaValue, v Value) Tree { - branch := &node{ +func (n *Node) AddMetaBranch(meta MetaValue, v Value) Tree { + branch := &Node{ Root: n, Meta: meta, Value: v, @@ -104,12 +104,12 @@ func (n *node) AddMetaBranch(meta MetaValue, v Value) Tree { return branch } -func (n *node) Branch() Tree { +func (n *Node) Branch() Tree { n.Root = nil return n } -func (n *node) FindByMeta(meta MetaValue) Tree { +func (n *Node) FindByMeta(meta MetaValue) Tree { for _, node := range n.Nodes { if reflect.DeepEqual(node.Meta, meta) { return node @@ -121,7 +121,7 @@ func (n *node) FindByMeta(meta MetaValue) Tree { return nil } -func (n *node) FindByValue(value Value) Tree { +func (n *Node) FindByValue(value Value) Tree { for _, node := range n.Nodes { if reflect.DeepEqual(node.Value, value) { return node @@ -133,7 +133,7 @@ func (n *node) FindByValue(value Value) Tree { return nil } -func (n *node) Bytes() []byte { +func (n *Node) Bytes() []byte { buf := new(bytes.Buffer) level := 0 var levelsEnded []int @@ -158,19 +158,19 @@ func (n *node) Bytes() []byte { return buf.Bytes() } -func (n *node) String() string { +func (n *Node) String() string { return string(n.Bytes()) } -func (n *node) SetValue(value Value) { +func (n *Node) SetValue(value Value) { n.Value = value } -func (n *node) SetMetaValue(meta MetaValue) { +func (n *Node) SetMetaValue(meta MetaValue) { n.Meta = meta } -func (n *node) VisitAll(fn NodeVisitor) { +func (n *Node) VisitAll(fn NodeVisitor) { for _, node := range n.Nodes { fn(node) @@ -182,7 +182,7 @@ func (n *node) VisitAll(fn NodeVisitor) { } func printNodes(wr io.Writer, - level int, levelsEnded []int, nodes []*node) { + level int, levelsEnded []int, nodes []*Node) { for i, node := range nodes { edge := EdgeTypeMid @@ -198,7 +198,7 @@ func printNodes(wr io.Writer, } func printValues(wr io.Writer, - level int, levelsEnded []int, edge EdgeType, node *node) { + level int, levelsEnded []int, edge EdgeType, node *Node) { for i := 0; i < level; i++ { if isEnded(levelsEnded, i) { @@ -227,7 +227,7 @@ func isEnded(levelsEnded []int, level int) bool { return false } -func renderValue(level int, node *node) Value { +func renderValue(level int, node *Node) Value { lines := strings.Split(fmt.Sprintf("%v", node.Value), "\n") // If value does not contain multiple lines, return itself. @@ -248,10 +248,10 @@ func renderValue(level int, node *node) Value { // padding returns a padding for the multiline values with correctly placed link edges. // It is generated by traversing the tree upwards (from leaf to the root of the tree) -// and, on each level, checking if the node the last one of its siblings. -// If a node is the last one, the padding on that level should be empty (there's nothing to link to below it). -// If a node is not the last one, the padding on that level should be the link edge so the sibling below is correctly connected. -func padding(level int, node *node) string { +// and, on each level, checking if the Node the last one of its siblings. +// If a Node is the last one, the padding on that level should be empty (there's nothing to link to below it). +// If a Node is not the last one, the padding on that level should be the link edge so the sibling below is correctly connected. +func padding(level int, node *Node) string { links := make([]string, level+1) for node.Root != nil { @@ -267,8 +267,8 @@ func padding(level int, node *node) string { return strings.Join(links, "") } -// isLast checks if the node is the last one in the slice of its parent children -func isLast(n *node) bool { +// isLast checks if the Node is the last one in the slice of its parent children +func isLast(n *Node) bool { return n == n.Root.FindLastNode() } @@ -285,10 +285,10 @@ var IndentSize = 3 // New Generates new tree func New() Tree { - return &node{Value: "."} + return &Node{Value: "."} } // NewWithRoot Generates new tree with the given root value func NewWithRoot(root Value) Tree { - return &node{Value: root} + return &Node{Value: root} } diff --git a/tools/vendor/go.etcd.io/bbolt/.gitignore b/tools/vendor/go.etcd.io/bbolt/.gitignore index 18312f004..9fa948ebf 100644 --- a/tools/vendor/go.etcd.io/bbolt/.gitignore +++ b/tools/vendor/go.etcd.io/bbolt/.gitignore @@ -3,5 +3,8 @@ *.swp /bin/ cover.out +cover-*.out /.idea *.iml +/cmd/bbolt/bbolt + diff --git a/tools/vendor/go.etcd.io/bbolt/.travis.yml b/tools/vendor/go.etcd.io/bbolt/.travis.yml deleted file mode 100644 index 452601e49..000000000 --- a/tools/vendor/go.etcd.io/bbolt/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: go -go_import_path: go.etcd.io/bbolt - -sudo: false - -go: -- 1.15 - -before_install: -- go get -v golang.org/x/sys/unix -- go get -v honnef.co/go/tools/... -- go get -v github.com/kisielk/errcheck - -script: -- make fmt -- make test -- make race -# - make errcheck diff --git a/tools/vendor/go.etcd.io/bbolt/Makefile b/tools/vendor/go.etcd.io/bbolt/Makefile index 21ecf48f6..18154c638 100644 --- a/tools/vendor/go.etcd.io/bbolt/Makefile +++ b/tools/vendor/go.etcd.io/bbolt/Makefile @@ -2,35 +2,62 @@ BRANCH=`git rev-parse --abbrev-ref HEAD` COMMIT=`git rev-parse --short HEAD` GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" -race: - @TEST_FREELIST_TYPE=hashmap go test -v -race -test.run="TestSimulate_(100op|1000op)" - @echo "array freelist test" - @TEST_FREELIST_TYPE=array go test -v -race -test.run="TestSimulate_(100op|1000op)" - +TESTFLAGS_RACE=-race=false +ifdef ENABLE_RACE + TESTFLAGS_RACE=-race=true +endif + +TESTFLAGS_CPU= +ifdef CPU + TESTFLAGS_CPU=-cpu=$(CPU) +endif +TESTFLAGS = $(TESTFLAGS_RACE) $(TESTFLAGS_CPU) $(EXTRA_TESTFLAGS) + +.PHONY: fmt fmt: !(gofmt -l -s -d $(shell find . -name \*.go) | grep '[a-z]') -# go get honnef.co/go/tools/simple -gosimple: - gosimple ./... +.PHONY: lint +lint: + golangci-lint run ./... -# go get honnef.co/go/tools/unused -unused: - unused ./... +.PHONY: test +test: + @echo "hashmap freelist test" + TEST_FREELIST_TYPE=hashmap go test -v ${TESTFLAGS} -timeout 30m + TEST_FREELIST_TYPE=hashmap go test -v ${TESTFLAGS} ./cmd/bbolt -# go get github.com/kisielk/errcheck -errcheck: - @errcheck -ignorepkg=bytes -ignore=os:Remove go.etcd.io/bbolt + @echo "array freelist test" + TEST_FREELIST_TYPE=array go test -v ${TESTFLAGS} -timeout 30m + TEST_FREELIST_TYPE=array go test -v ${TESTFLAGS} ./cmd/bbolt -test: - TEST_FREELIST_TYPE=hashmap go test -timeout 20m -v -coverprofile cover.out -covermode atomic - # Note: gets "program not an importable package" in out of path builds - TEST_FREELIST_TYPE=hashmap go test -v ./cmd/bbolt +.PHONY: coverage +coverage: + @echo "hashmap freelist test" + TEST_FREELIST_TYPE=hashmap go test -v -timeout 30m \ + -coverprofile cover-freelist-hashmap.out -covermode atomic @echo "array freelist test" + TEST_FREELIST_TYPE=array go test -v -timeout 30m \ + -coverprofile cover-freelist-array.out -covermode atomic + +.PHONY: gofail-enable +gofail-enable: install-gofail + gofail enable . + +.PHONY: gofail-disable +gofail-disable: + gofail disable . + +.PHONY: install-gofail +install-gofail: + go install go.etcd.io/gofail + +.PHONY: test-failpoint +test-failpoint: + @echo "[failpoint] hashmap freelist test" + TEST_FREELIST_TYPE=hashmap go test -v ${TESTFLAGS} -timeout 30m ./tests/failpoint - @TEST_FREELIST_TYPE=array go test -timeout 20m -v -coverprofile cover.out -covermode atomic - # Note: gets "program not an importable package" in out of path builds - @TEST_FREELIST_TYPE=array go test -v ./cmd/bbolt + @echo "[failpoint] array freelist test" + TEST_FREELIST_TYPE=array go test -v ${TESTFLAGS} -timeout 30m ./tests/failpoint -.PHONY: race fmt errcheck test gosimple unused diff --git a/tools/vendor/go.etcd.io/bbolt/README.md b/tools/vendor/go.etcd.io/bbolt/README.md index f1b4a7b2b..2be669a60 100644 --- a/tools/vendor/go.etcd.io/bbolt/README.md +++ b/tools/vendor/go.etcd.io/bbolt/README.md @@ -26,7 +26,7 @@ and setting values. That's it. [gh_ben]: https://github.com/benbjohnson [bolt]: https://github.com/boltdb/bolt [hyc_symas]: https://twitter.com/hyc_symas -[lmdb]: http://symas.com/mdb/ +[lmdb]: https://www.symas.com/symas-embedded-database-lmdb ## Project Status @@ -78,14 +78,23 @@ New minor versions may add additional features to the API. ### Installing To start using Bolt, install Go and run `go get`: - ```sh -$ go get go.etcd.io/bbolt/... +$ go get go.etcd.io/bbolt@latest ``` -This will retrieve the library and install the `bolt` command line utility into -your `$GOBIN` path. +This will retrieve the library and update your `go.mod` and `go.sum` files. + +To run the command line utility, execute: +```sh +$ go run go.etcd.io/bbolt/cmd/bbolt@latest +``` +Run `go install` to install the `bbolt` command line utility into +your `$GOBIN` path, which defaults to `$GOPATH/bin` or `$HOME/go/bin` if the +`GOPATH` environment variable is not set. +```sh +$ go install go.etcd.io/bbolt/cmd/bbolt@latest +``` ### Importing bbolt @@ -933,7 +942,7 @@ Below is a list of public, open source projects that use Bolt: * [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. * [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies * [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. -* [Key Value Access Langusge (KVAL)](https://github.com/kval-access-language) - A proposed grammar for key-value datastores offering a bbolt binding. +* [Key Value Access Language (KVAL)](https://github.com/kval-access-language) - A proposed grammar for key-value datastores offering a bbolt binding. * [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. * [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. * [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_arm64.go b/tools/vendor/go.etcd.io/bbolt/bolt_arm64.go index 810dfd55c..447bc1973 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_arm64.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_arm64.go @@ -1,3 +1,4 @@ +//go:build arm64 // +build arm64 package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_loong64.go b/tools/vendor/go.etcd.io/bbolt/bolt_loong64.go new file mode 100644 index 000000000..31c17c1d0 --- /dev/null +++ b/tools/vendor/go.etcd.io/bbolt/bolt_loong64.go @@ -0,0 +1,10 @@ +//go:build loong64 +// +build loong64 + +package bbolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_mips64x.go b/tools/vendor/go.etcd.io/bbolt/bolt_mips64x.go index dd8ffe123..a9385beb6 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_mips64x.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_mips64x.go @@ -1,3 +1,4 @@ +//go:build mips64 || mips64le // +build mips64 mips64le package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_mipsx.go b/tools/vendor/go.etcd.io/bbolt/bolt_mipsx.go index a669703a4..ed734ff7f 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_mipsx.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_mipsx.go @@ -1,3 +1,4 @@ +//go:build mips || mipsle // +build mips mipsle package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_ppc.go b/tools/vendor/go.etcd.io/bbolt/bolt_ppc.go index 84e545ef3..e403f57d8 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_ppc.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_ppc.go @@ -1,3 +1,4 @@ +//go:build ppc // +build ppc package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_ppc64.go b/tools/vendor/go.etcd.io/bbolt/bolt_ppc64.go index a76120908..fcd86529f 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_ppc64.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_ppc64.go @@ -1,3 +1,4 @@ +//go:build ppc64 // +build ppc64 package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_ppc64le.go b/tools/vendor/go.etcd.io/bbolt/bolt_ppc64le.go index c830f2fc7..20234aca4 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_ppc64le.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_ppc64le.go @@ -1,3 +1,4 @@ +//go:build ppc64le // +build ppc64le package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_riscv64.go b/tools/vendor/go.etcd.io/bbolt/bolt_riscv64.go index c967613b0..060f30c73 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_riscv64.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_riscv64.go @@ -1,3 +1,4 @@ +//go:build riscv64 // +build riscv64 package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_s390x.go b/tools/vendor/go.etcd.io/bbolt/bolt_s390x.go index ff2a56097..92d2755ad 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_s390x.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_s390x.go @@ -1,3 +1,4 @@ +//go:build s390x // +build s390x package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_unix.go b/tools/vendor/go.etcd.io/bbolt/bolt_unix.go index 4e5f65ccc..757ae4d1a 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_unix.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_unix.go @@ -1,3 +1,4 @@ +//go:build !windows && !plan9 && !solaris && !aix // +build !windows,!plan9,!solaris,!aix package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_unix_aix.go b/tools/vendor/go.etcd.io/bbolt/bolt_unix_aix.go index a64c16f51..6dea4294d 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_unix_aix.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_unix_aix.go @@ -1,3 +1,4 @@ +//go:build aix // +build aix package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bolt_windows.go b/tools/vendor/go.etcd.io/bbolt/bolt_windows.go index fca178bd2..e5dde2745 100644 --- a/tools/vendor/go.etcd.io/bbolt/bolt_windows.go +++ b/tools/vendor/go.etcd.io/bbolt/bolt_windows.go @@ -6,40 +6,10 @@ import ( "syscall" "time" "unsafe" -) - -// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - procLockFileEx = modkernel32.NewProc("LockFileEx") - procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") -) - -const ( - // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - flagLockExclusive = 2 - flagLockFailImmediately = 1 - // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx - errLockViolation syscall.Errno = 0x21 + "golang.org/x/sys/windows" ) -func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { - r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) - if r == 0 { - return err - } - return nil -} - -func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { - r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) - if r == 0 { - return err - } - return nil -} - // fdatasync flushes written data to a file descriptor. func fdatasync(db *DB) error { return db.file.Sync() @@ -51,22 +21,22 @@ func flock(db *DB, exclusive bool, timeout time.Duration) error { if timeout != 0 { t = time.Now() } - var flag uint32 = flagLockFailImmediately + var flags uint32 = windows.LOCKFILE_FAIL_IMMEDIATELY if exclusive { - flag |= flagLockExclusive + flags |= windows.LOCKFILE_EXCLUSIVE_LOCK } for { // Fix for https://github.com/etcd-io/bbolt/issues/121. Use byte-range // -1..0 as the lock on the database file. var m1 uint32 = (1 << 32) - 1 // -1 in a uint32 - err := lockFileEx(syscall.Handle(db.file.Fd()), flag, 0, 1, 0, &syscall.Overlapped{ + err := windows.LockFileEx(windows.Handle(db.file.Fd()), flags, 0, 1, 0, &windows.Overlapped{ Offset: m1, OffsetHigh: m1, }) if err == nil { return nil - } else if err != errLockViolation { + } else if err != windows.ERROR_LOCK_VIOLATION { return err } @@ -83,34 +53,37 @@ func flock(db *DB, exclusive bool, timeout time.Duration) error { // funlock releases an advisory lock on a file descriptor. func funlock(db *DB) error { var m1 uint32 = (1 << 32) - 1 // -1 in a uint32 - err := unlockFileEx(syscall.Handle(db.file.Fd()), 0, 1, 0, &syscall.Overlapped{ + return windows.UnlockFileEx(windows.Handle(db.file.Fd()), 0, 1, 0, &windows.Overlapped{ Offset: m1, OffsetHigh: m1, }) - return err } // mmap memory maps a DB's data file. // Based on: https://github.com/edsrzf/mmap-go func mmap(db *DB, sz int) error { + var sizelo, sizehi uint32 + if !db.readOnly { // Truncate the database to the size of the mmap. if err := db.file.Truncate(int64(sz)); err != nil { return fmt.Errorf("truncate: %s", err) } + sizehi = uint32(sz >> 32) + sizelo = uint32(sz) & 0xffffffff } // Open a file mapping handle. - sizelo := uint32(sz >> 32) - sizehi := uint32(sz) & 0xffffffff - h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizehi, sizelo, nil) if h == 0 { return os.NewSyscallError("CreateFileMapping", errno) } // Create the memory map. - addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, 0) if addr == 0 { + // Do our best and report error returned from MapViewOfFile. + _ = syscall.CloseHandle(h) return os.NewSyscallError("MapViewOfFile", errno) } @@ -134,8 +107,11 @@ func munmap(db *DB) error { } addr := (uintptr)(unsafe.Pointer(&db.data[0])) + var err1 error if err := syscall.UnmapViewOfFile(addr); err != nil { - return os.NewSyscallError("UnmapViewOfFile", err) + err1 = os.NewSyscallError("UnmapViewOfFile", err) } - return nil + db.data = nil + db.datasz = 0 + return err1 } diff --git a/tools/vendor/go.etcd.io/bbolt/boltsync_unix.go b/tools/vendor/go.etcd.io/bbolt/boltsync_unix.go index 9587afefe..81e09a531 100644 --- a/tools/vendor/go.etcd.io/bbolt/boltsync_unix.go +++ b/tools/vendor/go.etcd.io/bbolt/boltsync_unix.go @@ -1,3 +1,4 @@ +//go:build !windows && !plan9 && !linux && !openbsd // +build !windows,!plan9,!linux,!openbsd package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/bucket.go b/tools/vendor/go.etcd.io/bbolt/bucket.go index d8750b148..054467af3 100644 --- a/tools/vendor/go.etcd.io/bbolt/bucket.go +++ b/tools/vendor/go.etcd.io/bbolt/bucket.go @@ -81,7 +81,7 @@ func (b *Bucket) Writable() bool { // Do not use a cursor after the transaction is closed. func (b *Bucket) Cursor() *Cursor { // Update transaction statistics. - b.tx.stats.CursorCount++ + b.tx.stats.IncCursorCount(1) // Allocate and return a cursor. return &Cursor{ @@ -229,11 +229,9 @@ func (b *Bucket) DeleteBucket(key []byte) error { // Recursively delete all child buckets. child := b.Bucket(key) - err := child.ForEach(func(k, v []byte) error { - if _, _, childFlags := child.Cursor().seek(k); (childFlags & bucketLeafFlag) != 0 { - if err := child.DeleteBucket(k); err != nil { - return fmt.Errorf("delete bucket: %s", err) - } + err := child.ForEachBucket(func(k []byte) error { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) } return nil }) @@ -353,7 +351,7 @@ func (b *Bucket) SetSequence(v uint64) error { _ = b.node(b.root, nil) } - // Increment and return the sequence. + // Set the sequence. b.bucket.sequence = v return nil } @@ -378,6 +376,7 @@ func (b *Bucket) NextSequence() (uint64, error) { } // ForEach executes a function for each key/value pair in a bucket. +// Because ForEach uses a Cursor, the iteration over keys is in lexicographical order. // If the provided function returns an error then the iteration is stopped and // the error is returned to the caller. The provided function must not modify // the bucket; this will result in undefined behavior. @@ -394,7 +393,22 @@ func (b *Bucket) ForEach(fn func(k, v []byte) error) error { return nil } -// Stat returns stats on a bucket. +func (b *Bucket) ForEachBucket(fn func(k []byte) error) error { + if b.tx.db == nil { + return ErrTxClosed + } + c := b.Cursor() + for k, _, flags := c.first(); k != nil; k, _, flags = c.next() { + if flags&bucketLeafFlag != 0 { + if err := fn(k); err != nil { + return err + } + } + } + return nil +} + +// Stats returns stats on a bucket. func (b *Bucket) Stats() BucketStats { var s, subStats BucketStats pageSize := b.tx.db.pageSize @@ -402,7 +416,7 @@ func (b *Bucket) Stats() BucketStats { if b.root == 0 { s.InlineBucketN += 1 } - b.forEachPage(func(p *page, depth int) { + b.forEachPage(func(p *page, depth int, pgstack []pgid) { if (p.flags & leafPageFlag) != 0 { s.KeyN += int(p.count) @@ -461,7 +475,7 @@ func (b *Bucket) Stats() BucketStats { // Keep track of maximum page depth. if depth+1 > s.Depth { - s.Depth = (depth + 1) + s.Depth = depth + 1 } }) @@ -477,15 +491,15 @@ func (b *Bucket) Stats() BucketStats { } // forEachPage iterates over every page in a bucket, including inline pages. -func (b *Bucket) forEachPage(fn func(*page, int)) { +func (b *Bucket) forEachPage(fn func(*page, int, []pgid)) { // If we have an inline page then just use that. if b.page != nil { - fn(b.page, 0) + fn(b.page, 0, []pgid{b.root}) return } // Otherwise traverse the page hierarchy. - b.tx.forEachPage(b.root, 0, fn) + b.tx.forEachPage(b.root, fn) } // forEachPageNode iterates over every page (or node) in a bucket. @@ -499,8 +513,8 @@ func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { b._forEachPageNode(b.root, 0, fn) } -func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { - var p, n = b.pageNode(pgid) +func (b *Bucket) _forEachPageNode(pgId pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgId) // Execute function. fn(p, n, depth) @@ -640,11 +654,11 @@ func (b *Bucket) rebalance() { } // node creates a node from a page and associates it with a given parent. -func (b *Bucket) node(pgid pgid, parent *node) *node { +func (b *Bucket) node(pgId pgid, parent *node) *node { _assert(b.nodes != nil, "nodes map expected") // Retrieve node if it's already been created. - if n := b.nodes[pgid]; n != nil { + if n := b.nodes[pgId]; n != nil { return n } @@ -659,15 +673,15 @@ func (b *Bucket) node(pgid pgid, parent *node) *node { // Use the inline page if this is an inline bucket. var p = b.page if p == nil { - p = b.tx.page(pgid) + p = b.tx.page(pgId) } // Read the page into the node and cache it. n.read(p) - b.nodes[pgid] = n + b.nodes[pgId] = n // Update statistics. - b.tx.stats.NodeCount++ + b.tx.stats.IncNodeCount(1) return n } diff --git a/tools/vendor/go.etcd.io/bbolt/compact.go b/tools/vendor/go.etcd.io/bbolt/compact.go index e4fe91b04..5f1d4c3b5 100644 --- a/tools/vendor/go.etcd.io/bbolt/compact.go +++ b/tools/vendor/go.etcd.io/bbolt/compact.go @@ -12,7 +12,11 @@ func Compact(dst, src *DB, txMaxSize int64) error { if err != nil { return err } - defer tx.Rollback() + defer func() { + if tempErr := tx.Rollback(); tempErr != nil { + err = tempErr + } + }() if err := walk(src, func(keys [][]byte, k, v []byte, seq uint64) error { // On each key/value, check if we have exceeded tx size. @@ -73,8 +77,9 @@ func Compact(dst, src *DB, txMaxSize int64) error { }); err != nil { return err } + err = tx.Commit() - return tx.Commit() + return err } // walkFunc is the type of the function called for keys (buckets and "normal" diff --git a/tools/vendor/go.etcd.io/bbolt/cursor.go b/tools/vendor/go.etcd.io/bbolt/cursor.go index 98aeb449a..5dafb0cac 100644 --- a/tools/vendor/go.etcd.io/bbolt/cursor.go +++ b/tools/vendor/go.etcd.io/bbolt/cursor.go @@ -6,7 +6,8 @@ import ( "sort" ) -// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket +// in lexicographical order. // Cursors see nested buckets with value == nil. // Cursors can be obtained from a transaction and are valid as long as the transaction is open. // @@ -30,10 +31,18 @@ func (c *Cursor) Bucket() *Bucket { // The returned key and value are only valid for the life of the transaction. func (c *Cursor) First() (key []byte, value []byte) { _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.first() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +func (c *Cursor) first() (key []byte, value []byte, flags uint32) { c.stack = c.stack[:0] p, n := c.bucket.pageNode(c.bucket.root) c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) - c.first() + c.goToFirstElementOnTheStack() // If we land on an empty page then move to the next value. // https://github.com/boltdb/bolt/issues/450 @@ -43,10 +52,9 @@ func (c *Cursor) First() (key []byte, value []byte) { k, v, flags := c.keyValue() if (flags & uint32(bucketLeafFlag)) != 0 { - return k, nil + return k, nil, flags } - return k, v - + return k, v, flags } // Last moves the cursor to the last item in the bucket and returns its key and value. @@ -60,6 +68,17 @@ func (c *Cursor) Last() (key []byte, value []byte) { ref.index = ref.count() - 1 c.stack = append(c.stack, ref) c.last() + + // If this is an empty page (calling Delete may result in empty pages) + // we call prev to find the last page that is not empty + for len(c.stack) > 0 && c.stack[len(c.stack)-1].count() == 0 { + c.prev() + } + + if len(c.stack) == 0 { + return nil, nil + } + k, v, flags := c.keyValue() if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil @@ -84,37 +103,20 @@ func (c *Cursor) Next() (key []byte, value []byte) { // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Prev() (key []byte, value []byte) { _assert(c.bucket.tx.db != nil, "tx closed") - - // Attempt to move back one element until we're successful. - // Move up the stack as we hit the beginning of each page in our stack. - for i := len(c.stack) - 1; i >= 0; i-- { - elem := &c.stack[i] - if elem.index > 0 { - elem.index-- - break - } - c.stack = c.stack[:i] - } - - // If we've hit the end then return nil. - if len(c.stack) == 0 { - return nil, nil - } - - // Move down the stack to find the last element of the last leaf under this branch. - c.last() - k, v, flags := c.keyValue() + k, v, flags := c.prev() if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil } return k, v } -// Seek moves the cursor to a given key and returns it. +// Seek moves the cursor to a given key using a b-tree search and returns it. // If the key does not exist then the next key is used. If no keys // follow, a nil key is returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.seek(seek) // If we ended up after the last element of a page then move to the next one. @@ -152,8 +154,6 @@ func (c *Cursor) Delete() error { // seek moves the cursor to a given key and returns it. // If the key does not exist then the next key is used. func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { - _assert(c.bucket.tx.db != nil, "tx closed") - // Start from root page/node and traverse to correct page. c.stack = c.stack[:0] c.search(seek, c.bucket.root) @@ -163,7 +163,7 @@ func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { } // first moves the cursor to the first leaf element under the last page in the stack. -func (c *Cursor) first() { +func (c *Cursor) goToFirstElementOnTheStack() { for { // Exit when we hit a leaf page. var ref = &c.stack[len(c.stack)-1] @@ -172,13 +172,13 @@ func (c *Cursor) first() { } // Keep adding pages pointing to the first element to the stack. - var pgid pgid + var pgId pgid if ref.node != nil { - pgid = ref.node.inodes[ref.index].pgid + pgId = ref.node.inodes[ref.index].pgid } else { - pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + pgId = ref.page.branchPageElement(uint16(ref.index)).pgid } - p, n := c.bucket.pageNode(pgid) + p, n := c.bucket.pageNode(pgId) c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) } } @@ -193,13 +193,13 @@ func (c *Cursor) last() { } // Keep adding pages pointing to the last element in the stack. - var pgid pgid + var pgId pgid if ref.node != nil { - pgid = ref.node.inodes[ref.index].pgid + pgId = ref.node.inodes[ref.index].pgid } else { - pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + pgId = ref.page.branchPageElement(uint16(ref.index)).pgid } - p, n := c.bucket.pageNode(pgid) + p, n := c.bucket.pageNode(pgId) var nextRef = elemRef{page: p, node: n} nextRef.index = nextRef.count() - 1 @@ -231,7 +231,7 @@ func (c *Cursor) next() (key []byte, value []byte, flags uint32) { // Otherwise start from where we left off in the stack and find the // first element of the first leaf page. c.stack = c.stack[:i+1] - c.first() + c.goToFirstElementOnTheStack() // If this is an empty page then restart and move back up the stack. // https://github.com/boltdb/bolt/issues/450 @@ -243,9 +243,33 @@ func (c *Cursor) next() (key []byte, value []byte, flags uint32) { } } +// prev moves the cursor to the previous item in the bucket and returns its key and value. +// If the cursor is at the beginning of the bucket then a nil key and value are returned. +func (c *Cursor) prev() (key []byte, value []byte, flags uint32) { + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil, 0 + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + return c.keyValue() +} + // search recursively performs a binary search against a given page/node until it finds a given key. -func (c *Cursor) search(key []byte, pgid pgid) { - p, n := c.bucket.pageNode(pgid) +func (c *Cursor) search(key []byte, pgId pgid) { + p, n := c.bucket.pageNode(pgId) if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) } diff --git a/tools/vendor/go.etcd.io/bbolt/db.go b/tools/vendor/go.etcd.io/bbolt/db.go index a798c390a..c9422127e 100644 --- a/tools/vendor/go.etcd.io/bbolt/db.go +++ b/tools/vendor/go.etcd.io/bbolt/db.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" "hash/fnv" - "log" + "io" "os" "runtime" "sort" @@ -81,7 +81,7 @@ type DB struct { NoFreelistSync bool // FreelistType sets the backend freelist type. There are two options. Array which is simple but endures - // dramatic performance degradation if database is large and framentation in freelist is common. + // dramatic performance degradation if database is large and fragmentation in freelist is common. // The alternative one is using hashmap, it is faster in almost all circumstances // but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe. // The default type is array @@ -95,6 +95,11 @@ type DB struct { // https://github.com/boltdb/bolt/issues/284 NoGrowSync bool + // When `true`, bbolt will always load the free pages when opening the DB. + // When opening db in write mode, this flag will always automatically + // set to `true`. + PreLoadFreelist bool + // If you want to read the entire database fast, you can set MmapFlag to // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. MmapFlags int @@ -129,6 +134,9 @@ type DB struct { path string openFile func(string, int, os.FileMode) (*os.File, error) file *os.File + // `dataref` isn't used at all on Windows, and the golangci-lint + // always fails on Windows platform. + //nolint dataref []byte // mmap'ed readonly, write throws SEGV data *[maxMapSize]byte datasz int @@ -193,6 +201,7 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { db.NoGrowSync = options.NoGrowSync db.MmapFlags = options.MmapFlags db.NoFreelistSync = options.NoFreelistSync + db.PreLoadFreelist = options.PreLoadFreelist db.FreelistType = options.FreelistType db.Mlock = options.Mlock @@ -205,6 +214,9 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { if options.ReadOnly { flag = os.O_RDONLY db.readOnly = true + } else { + // always load free pages in write mode + db.PreLoadFreelist = true } db.openFile = options.OpenFile @@ -252,21 +264,9 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { return nil, err } } else { - // Read the first meta page to determine the page size. - var buf [0x1000]byte - // If we can't read the page size, but can read a page, assume - // it's the same as the OS or one given -- since that's how the - // page size was chosen in the first place. - // - // If the first page is invalid and this OS uses a different - // page size than what the database was created with then we - // are out of luck and cannot access the database. - // - // TODO: scan for next page - if bw, err := db.file.ReadAt(buf[:], 0); err == nil && bw == len(buf) { - if m := db.pageInBuffer(buf[:], 0).meta(); m.validate() == nil { - db.pageSize = int(m.pageSize) - } + // try to get the page size from the metadata pages + if pgSize, err := db.getPageSize(); err == nil { + db.pageSize = pgSize } else { _ = db.close() return nil, ErrInvalid @@ -286,12 +286,14 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { return nil, err } + if db.PreLoadFreelist { + db.loadFreelist() + } + if db.readOnly { return db, nil } - db.loadFreelist() - // Flush freelist when transitioning from no sync to sync so // NoFreelistSync unaware boltdb can open the db later. if !db.NoFreelistSync && !db.hasSyncedFreelist() { @@ -309,6 +311,96 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { return db, nil } +// getPageSize reads the pageSize from the meta pages. It tries +// to read the first meta page firstly. If the first page is invalid, +// then it tries to read the second page using the default page size. +func (db *DB) getPageSize() (int, error) { + var ( + meta0CanRead, meta1CanRead bool + ) + + // Read the first meta page to determine the page size. + if pgSize, canRead, err := db.getPageSizeFromFirstMeta(); err != nil { + // We cannot read the page size from page 0, but can read page 0. + meta0CanRead = canRead + } else { + return pgSize, nil + } + + // Read the second meta page to determine the page size. + if pgSize, canRead, err := db.getPageSizeFromSecondMeta(); err != nil { + // We cannot read the page size from page 1, but can read page 1. + meta1CanRead = canRead + } else { + return pgSize, nil + } + + // If we can't read the page size from both pages, but can read + // either page, then we assume it's the same as the OS or the one + // given, since that's how the page size was chosen in the first place. + // + // If both pages are invalid, and (this OS uses a different page size + // from what the database was created with or the given page size is + // different from what the database was created with), then we are out + // of luck and cannot access the database. + if meta0CanRead || meta1CanRead { + return db.pageSize, nil + } + + return 0, ErrInvalid +} + +// getPageSizeFromFirstMeta reads the pageSize from the first meta page +func (db *DB) getPageSizeFromFirstMeta() (int, bool, error) { + var buf [0x1000]byte + var metaCanRead bool + if bw, err := db.file.ReadAt(buf[:], 0); err == nil && bw == len(buf) { + metaCanRead = true + if m := db.pageInBuffer(buf[:], 0).meta(); m.validate() == nil { + return int(m.pageSize), metaCanRead, nil + } + } + return 0, metaCanRead, ErrInvalid +} + +// getPageSizeFromSecondMeta reads the pageSize from the second meta page +func (db *DB) getPageSizeFromSecondMeta() (int, bool, error) { + var ( + fileSize int64 + metaCanRead bool + ) + + // get the db file size + if info, err := db.file.Stat(); err != nil { + return 0, metaCanRead, err + } else { + fileSize = info.Size() + } + + // We need to read the second meta page, so we should skip the first page; + // but we don't know the exact page size yet, it's chicken & egg problem. + // The solution is to try all the possible page sizes, which starts from 1KB + // and until 16MB (1024<<14) or the end of the db file + // + // TODO: should we support larger page size? + for i := 0; i <= 14; i++ { + var buf [0x1000]byte + var pos int64 = 1024 << uint(i) + if pos >= fileSize-1024 { + break + } + bw, err := db.file.ReadAt(buf[:], pos) + if (err == nil && bw == len(buf)) || (err == io.EOF && int64(bw) == (fileSize-pos)) { + metaCanRead = true + if m := db.pageInBuffer(buf[:], 0).meta(); m.validate() == nil { + return int(m.pageSize), metaCanRead, nil + } + } + } + + return 0, metaCanRead, ErrInvalid +} + // loadFreelist reads the freelist if it is synced, or reconstructs it // by scanning the DB if it is not synced. It assumes there are no // concurrent accesses being made to the freelist. @@ -372,6 +464,8 @@ func (db *DB) mmap(minsz int) error { } // Memory-map the data file as a byte slice. + // gofail: var mapError string + // return errors.New(mapError) if err := mmap(db, size); err != nil { return err } @@ -399,11 +493,25 @@ func (db *DB) mmap(minsz int) error { return nil } +func (db *DB) invalidate() { + db.dataref = nil + db.data = nil + db.datasz = 0 + + db.meta0 = nil + db.meta1 = nil +} + // munmap unmaps the data file from memory. func (db *DB) munmap() error { + defer db.invalidate() + + // gofail: var unmapError string + // return errors.New(unmapError) if err := munmap(db); err != nil { return fmt.Errorf("unmap error: " + err.Error()) } + return nil } @@ -552,7 +660,7 @@ func (db *DB) close() error { if !db.readOnly { // Unlock the file. if err := funlock(db); err != nil { - log.Printf("bolt.Close(): funlock error: %s", err) + return fmt.Errorf("bolt.Close(): funlock error: %w", err) } } @@ -609,6 +717,13 @@ func (db *DB) beginTx() (*Tx, error) { return nil, ErrDatabaseNotOpen } + // Exit if the database is not correctly mapped. + if db.data == nil { + db.mmaplock.RUnlock() + db.metalock.Unlock() + return nil, ErrInvalidMapping + } + // Create a transaction associated with the database. t := &Tx{} t.init(db) @@ -650,6 +765,12 @@ func (db *DB) beginRWTx() (*Tx, error) { return nil, ErrDatabaseNotOpen } + // Exit if the database is not correctly mapped. + if db.data == nil { + db.rwlock.Unlock() + return nil, ErrInvalidMapping + } + // Create a transaction associated with the database. t := &Tx{writable: true} t.init(db) @@ -924,6 +1045,7 @@ func (db *DB) Stats() Stats { // This is for internal access to the raw data bytes from the C cursor, use // carefully, or not at all. func (db *DB) Info() *Info { + _assert(db.data != nil, "database file isn't correctly mapped") return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} } @@ -950,7 +1072,7 @@ func (db *DB) meta() *meta { metaB = db.meta0 } - // Use higher meta page if valid. Otherwise fallback to previous, if valid. + // Use higher meta page if valid. Otherwise, fallback to previous, if valid. if err := metaA.validate(); err == nil { return metaA } else if err := metaB.validate(); err == nil { @@ -1003,7 +1125,7 @@ func (db *DB) grow(sz int) error { // If the data is smaller than the alloc size then only allocate what's needed. // Once it goes over the allocation size then allocate in chunks. - if db.datasz < db.AllocSize { + if db.datasz <= db.AllocSize { sz = db.datasz } else { sz += db.AllocSize @@ -1056,9 +1178,11 @@ func (db *DB) freepages() []pgid { panic(fmt.Sprintf("freepages: failed to get all reachable pages (%v)", e)) } }() - tx.checkBucket(&tx.root, reachable, nofreed, ech) + tx.checkBucket(&tx.root, reachable, nofreed, HexKVStringer(), ech) close(ech) + // TODO: If check bucket reported any corruptions (ech) we shouldn't proceed to freeing the pages. + var fids []pgid for i := pgid(2); i < db.meta().pgid; i++ { if _, ok := reachable[i]; !ok { @@ -1082,8 +1206,13 @@ type Options struct { // under normal operation, but requires a full database re-sync during recovery. NoFreelistSync bool + // PreLoadFreelist sets whether to load the free pages when opening + // the db file. Note when opening db in write mode, bbolt will always + // load the free pages. + PreLoadFreelist bool + // FreelistType sets the backend freelist type. There are two options. Array which is simple but endures - // dramatic performance degradation if database is large and framentation in freelist is common. + // dramatic performance degradation if database is large and fragmentation in freelist is common. // The alternative one is using hashmap, it is faster in almost all circumstances // but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe. // The default type is array @@ -1187,7 +1316,7 @@ func (m *meta) validate() error { return ErrInvalid } else if m.version != version { return ErrVersionMismatch - } else if m.checksum != 0 && m.checksum != m.sum64() { + } else if m.checksum != m.sum64() { return ErrChecksum } return nil diff --git a/tools/vendor/go.etcd.io/bbolt/doc.go b/tools/vendor/go.etcd.io/bbolt/doc.go index 95f25f01c..d1007e4b0 100644 --- a/tools/vendor/go.etcd.io/bbolt/doc.go +++ b/tools/vendor/go.etcd.io/bbolt/doc.go @@ -14,8 +14,7 @@ The design of Bolt is based on Howard Chu's LMDB database project. Bolt currently works on Windows, Mac OS X, and Linux. - -Basics +# Basics There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is a collection of buckets and is represented by a single file on disk. A bucket is @@ -27,8 +26,7 @@ iterate over the dataset sequentially. Read-write transactions can create and delete buckets and can insert and remove keys. Only one read-write transaction is allowed at a time. - -Caveats +# Caveats The database uses a read-only, memory-mapped data file to ensure that applications cannot corrupt the database, however, this means that keys and @@ -38,7 +36,5 @@ will cause Go to panic. Keys and values retrieved from the database are only valid for the life of the transaction. When used outside the transaction, these byte slices can point to different data or can point to invalid memory which will cause a panic. - - */ package bbolt diff --git a/tools/vendor/go.etcd.io/bbolt/errors.go b/tools/vendor/go.etcd.io/bbolt/errors.go index 48758ca57..f2c3b20ed 100644 --- a/tools/vendor/go.etcd.io/bbolt/errors.go +++ b/tools/vendor/go.etcd.io/bbolt/errors.go @@ -16,6 +16,9 @@ var ( // This typically occurs when a file is not a bolt database. ErrInvalid = errors.New("invalid database") + // ErrInvalidMapping is returned when the database file fails to get mapped. + ErrInvalidMapping = errors.New("database isn't correctly mapped") + // ErrVersionMismatch is returned when the data file was created with a // different version of Bolt. ErrVersionMismatch = errors.New("version mismatch") @@ -41,6 +44,10 @@ var ( // ErrDatabaseReadOnly is returned when a mutating transaction is started on a // read-only database. ErrDatabaseReadOnly = errors.New("database is in read-only mode") + + // ErrFreePagesNotLoaded is returned when a readonly transaction without + // preloading the free pages is trying to access the free pages. + ErrFreePagesNotLoaded = errors.New("free pages are not pre-loaded") ) // These errors can occur when putting or deleting a value or a bucket. diff --git a/tools/vendor/go.etcd.io/bbolt/freelist.go b/tools/vendor/go.etcd.io/bbolt/freelist.go index 697a46968..50f2d0e17 100644 --- a/tools/vendor/go.etcd.io/bbolt/freelist.go +++ b/tools/vendor/go.etcd.io/bbolt/freelist.go @@ -24,7 +24,7 @@ type freelist struct { ids []pgid // all free and available free page ids. allocs map[pgid]txid // mapping of txid that allocated a pgid. pending map[txid]*txPending // mapping of soon-to-be free page ids by tx. - cache map[pgid]bool // fast lookup of all free and pending page ids. + cache map[pgid]struct{} // fast lookup of all free and pending page ids. freemaps map[uint64]pidSet // key is the size of continuous pages(span), value is a set which contains the starting pgids of same size forwardMap map[pgid]uint64 // key is start pgid, value is its span size backwardMap map[pgid]uint64 // key is end pgid, value is its span size @@ -41,7 +41,7 @@ func newFreelist(freelistType FreelistType) *freelist { freelistType: freelistType, allocs: make(map[pgid]txid), pending: make(map[txid]*txPending), - cache: make(map[pgid]bool), + cache: make(map[pgid]struct{}), freemaps: make(map[uint64]pidSet), forwardMap: make(map[pgid]uint64), backwardMap: make(map[pgid]uint64), @@ -171,13 +171,13 @@ func (f *freelist) free(txid txid, p *page) { for id := p.id; id <= p.id+pgid(p.overflow); id++ { // Verify that page is not already free. - if f.cache[id] { + if _, ok := f.cache[id]; ok { panic(fmt.Sprintf("page %d already freed", id)) } // Add to the freelist and cache. txp.ids = append(txp.ids, id) txp.alloctx = append(txp.alloctx, allocTxid) - f.cache[id] = true + f.cache[id] = struct{}{} } } @@ -256,8 +256,9 @@ func (f *freelist) rollback(txid txid) { } // freed returns whether a given page is in the free list. -func (f *freelist) freed(pgid pgid) bool { - return f.cache[pgid] +func (f *freelist) freed(pgId pgid) bool { + _, ok := f.cache[pgId] + return ok } // read initializes the freelist from a freelist page. @@ -386,13 +387,13 @@ func (f *freelist) noSyncReload(pgids []pgid) { // reindex rebuilds the free cache based on available and pending free lists. func (f *freelist) reindex() { ids := f.getFreePageIDs() - f.cache = make(map[pgid]bool, len(ids)) + f.cache = make(map[pgid]struct{}, len(ids)) for _, id := range ids { - f.cache[id] = true + f.cache[id] = struct{}{} } for _, txp := range f.pending { for _, pendingID := range txp.ids { - f.cache[pendingID] = true + f.cache[pendingID] = struct{}{} } } } diff --git a/tools/vendor/go.etcd.io/bbolt/mlock_unix.go b/tools/vendor/go.etcd.io/bbolt/mlock_unix.go index 6a6c7b353..744a972f5 100644 --- a/tools/vendor/go.etcd.io/bbolt/mlock_unix.go +++ b/tools/vendor/go.etcd.io/bbolt/mlock_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package bbolt @@ -17,7 +18,7 @@ func mlock(db *DB, fileSize int) error { return nil } -//munlock unlocks memory of db file +// munlock unlocks memory of db file func munlock(db *DB, fileSize int) error { if db.dataref == nil { return nil diff --git a/tools/vendor/go.etcd.io/bbolt/mlock_windows.go b/tools/vendor/go.etcd.io/bbolt/mlock_windows.go index b4a36a493..00b0fb431 100644 --- a/tools/vendor/go.etcd.io/bbolt/mlock_windows.go +++ b/tools/vendor/go.etcd.io/bbolt/mlock_windows.go @@ -5,7 +5,7 @@ func mlock(_ *DB, _ int) error { panic("mlock is supported only on UNIX systems") } -//munlock unlocks memory of db file +// munlock unlocks memory of db file func munlock(_ *DB, _ int) error { panic("munlock is supported only on UNIX systems") } diff --git a/tools/vendor/go.etcd.io/bbolt/node.go b/tools/vendor/go.etcd.io/bbolt/node.go index 73988b5c4..9c56150d8 100644 --- a/tools/vendor/go.etcd.io/bbolt/node.go +++ b/tools/vendor/go.etcd.io/bbolt/node.go @@ -113,9 +113,9 @@ func (n *node) prevSibling() *node { } // put inserts a key/value. -func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { - if pgid >= n.bucket.tx.meta.pgid { - panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) +func (n *node) put(oldKey, newKey, value []byte, pgId pgid, flags uint32) { + if pgId >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgId (%d) above high water mark (%d)", pgId, n.bucket.tx.meta.pgid)) } else if len(oldKey) <= 0 { panic("put: zero-length old key") } else if len(newKey) <= 0 { @@ -136,7 +136,7 @@ func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { inode.flags = flags inode.key = newKey inode.value = value - inode.pgid = pgid + inode.pgid = pgId _assert(len(inode.key) > 0, "put: zero-length inode key") } @@ -188,12 +188,16 @@ func (n *node) read(p *page) { } // write writes the items onto one or more pages. +// The page should have p.id (might be 0 for meta or bucket-inline page) and p.overflow set +// and the rest should be zeroed. func (n *node) write(p *page) { + _assert(p.count == 0 && p.flags == 0, "node cannot be written into a not empty page") + // Initialize page. if n.isLeaf { - p.flags |= leafPageFlag + p.flags = leafPageFlag } else { - p.flags |= branchPageFlag + p.flags = branchPageFlag } if len(n.inodes) >= 0xFFFF { @@ -300,7 +304,7 @@ func (n *node) splitTwo(pageSize uintptr) (*node, *node) { n.inodes = n.inodes[:splitIndex] // Update the statistics. - n.bucket.tx.stats.Split++ + n.bucket.tx.stats.IncSplit(1) return n, next } @@ -387,7 +391,7 @@ func (n *node) spill() error { } // Update the statistics. - tx.stats.Spill++ + tx.stats.IncSpill(1) } // If the root node split and created a new root then we need to spill that @@ -409,7 +413,7 @@ func (n *node) rebalance() { n.unbalanced = false // Update statistics. - n.bucket.tx.stats.Rebalance++ + n.bucket.tx.stats.IncRebalance(1) // Ignore if node is above threshold (25%) and has enough keys. var threshold = n.bucket.tx.db.pageSize / 4 @@ -543,7 +547,7 @@ func (n *node) dereference() { } // Update statistics. - n.bucket.tx.stats.NodeDeref++ + n.bucket.tx.stats.IncNodeDeref(1) } // free adds the node's underlying page to the freelist. @@ -581,6 +585,10 @@ func (n *node) dump() { } */ +func compareKeys(left, right []byte) int { + return bytes.Compare(left, right) +} + type nodes []*node func (s nodes) Len() int { return len(s) } diff --git a/tools/vendor/go.etcd.io/bbolt/page.go b/tools/vendor/go.etcd.io/bbolt/page.go index c9a158fb0..379645c97 100644 --- a/tools/vendor/go.etcd.io/bbolt/page.go +++ b/tools/vendor/go.etcd.io/bbolt/page.go @@ -53,6 +53,16 @@ func (p *page) meta() *meta { return (*meta)(unsafeAdd(unsafe.Pointer(p), unsafe.Sizeof(*p))) } +func (p *page) fastCheck(id pgid) { + _assert(p.id == id, "Page expected to be: %v, but self identifies as %v", id, p.id) + // Only one flag of page-type can be set. + _assert(p.flags == branchPageFlag || + p.flags == leafPageFlag || + p.flags == metaPageFlag || + p.flags == freelistPageFlag, + "page %v: has unexpected type/flags: %x", p.id, p.flags) +} + // leafPageElement retrieves the leaf node by index func (p *page) leafPageElement(index uint16) *leafPageElement { return (*leafPageElement)(unsafeIndex(unsafe.Pointer(p), unsafe.Sizeof(*p), diff --git a/tools/vendor/go.etcd.io/bbolt/tx.go b/tools/vendor/go.etcd.io/bbolt/tx.go index 869d41200..2fac8c0a7 100644 --- a/tools/vendor/go.etcd.io/bbolt/tx.go +++ b/tools/vendor/go.etcd.io/bbolt/tx.go @@ -6,6 +6,7 @@ import ( "os" "sort" "strings" + "sync/atomic" "time" "unsafe" ) @@ -151,17 +152,19 @@ func (tx *Tx) Commit() error { // Rebalance nodes which have had deletions. var startTime = time.Now() tx.root.rebalance() - if tx.stats.Rebalance > 0 { - tx.stats.RebalanceTime += time.Since(startTime) + if tx.stats.GetRebalance() > 0 { + tx.stats.IncRebalanceTime(time.Since(startTime)) } + opgid := tx.meta.pgid + // spill data onto dirty pages. startTime = time.Now() if err := tx.root.spill(); err != nil { tx.rollback() return err } - tx.stats.SpillTime += time.Since(startTime) + tx.stats.IncSpillTime(time.Since(startTime)) // Free the old root bucket. tx.meta.root.root = tx.root.root @@ -180,6 +183,14 @@ func (tx *Tx) Commit() error { tx.meta.freelist = pgidNoFreelist } + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + // Write dirty pages to disk. startTime = time.Now() if err := tx.write(); err != nil { @@ -208,7 +219,7 @@ func (tx *Tx) Commit() error { tx.rollback() return err } - tx.stats.WriteTime += time.Since(startTime) + tx.stats.IncWriteTime(time.Since(startTime)) // Finalize the transaction. tx.close() @@ -224,7 +235,6 @@ func (tx *Tx) Commit() error { func (tx *Tx) commitFreelist() error { // Allocate new pages for the new free list. This will overestimate // the size of the freelist but not underestimate the size (which would be bad). - opgid := tx.meta.pgid p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) if err != nil { tx.rollback() @@ -235,13 +245,6 @@ func (tx *Tx) commitFreelist() error { return err } tx.meta.freelist = p.id - // If the high water mark has moved up then attempt to grow the database. - if tx.meta.pgid > opgid { - if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { - tx.rollback() - return err - } - } return nil } @@ -275,13 +278,17 @@ func (tx *Tx) rollback() { } if tx.writable { tx.db.freelist.rollback(tx.meta.txid) - if !tx.db.hasSyncedFreelist() { - // Reconstruct free page list by scanning the DB to get the whole free page list. - // Note: scaning the whole db is heavy if your db size is large in NoSyncFreeList mode. - tx.db.freelist.noSyncReload(tx.db.freepages()) - } else { - // Read free page list from freelist page. - tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + // When mmap fails, the `data`, `dataref` and `datasz` may be reset to + // zero values, and there is no way to reload free page IDs in this case. + if tx.db.data != nil { + if !tx.db.hasSyncedFreelist() { + // Reconstruct free page list by scanning the DB to get the whole free page list. + // Note: scaning the whole db is heavy if your db size is large in NoSyncFreeList mode. + tx.db.freelist.noSyncReload(tx.db.freepages()) + } else { + // Read free page list from freelist page. + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } } } tx.close() @@ -400,98 +407,6 @@ func (tx *Tx) CopyFile(path string, mode os.FileMode) error { return f.Close() } -// Check performs several consistency checks on the database for this transaction. -// An error is returned if any inconsistency is found. -// -// It can be safely run concurrently on a writable transaction. However, this -// incurs a high cost for large databases and databases with a lot of subbuckets -// because of caching. This overhead can be removed if running on a read-only -// transaction, however, it is not safe to execute other writer transactions at -// the same time. -func (tx *Tx) Check() <-chan error { - ch := make(chan error) - go tx.check(ch) - return ch -} - -func (tx *Tx) check(ch chan error) { - // Force loading free list if opened in ReadOnly mode. - tx.db.loadFreelist() - - // Check if any pages are double freed. - freed := make(map[pgid]bool) - all := make([]pgid, tx.db.freelist.count()) - tx.db.freelist.copyall(all) - for _, id := range all { - if freed[id] { - ch <- fmt.Errorf("page %d: already freed", id) - } - freed[id] = true - } - - // Track every reachable page. - reachable := make(map[pgid]*page) - reachable[0] = tx.page(0) // meta0 - reachable[1] = tx.page(1) // meta1 - if tx.meta.freelist != pgidNoFreelist { - for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { - reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) - } - } - - // Recursively check buckets. - tx.checkBucket(&tx.root, reachable, freed, ch) - - // Ensure all pages below high water mark are either reachable or freed. - for i := pgid(0); i < tx.meta.pgid; i++ { - _, isReachable := reachable[i] - if !isReachable && !freed[i] { - ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) - } - } - - // Close the channel to signal completion. - close(ch) -} - -func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { - // Ignore inline buckets. - if b.root == 0 { - return - } - - // Check every page used by this bucket. - b.tx.forEachPage(b.root, 0, func(p *page, _ int) { - if p.id > tx.meta.pgid { - ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) - } - - // Ensure each page is only referenced once. - for i := pgid(0); i <= pgid(p.overflow); i++ { - var id = p.id + i - if _, ok := reachable[id]; ok { - ch <- fmt.Errorf("page %d: multiple references", int(id)) - } - reachable[id] = p - } - - // We should only encounter un-freed leaf and branch pages. - if freed[p.id] { - ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) - } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { - ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) - } - }) - - // Check each bucket within this bucket. - _ = b.ForEach(func(k, v []byte) error { - if child := b.Bucket(k); child != nil { - tx.checkBucket(child, reachable, freed, ch) - } - return nil - }) -} - // allocate returns a contiguous block of memory starting at a given page. func (tx *Tx) allocate(count int) (*page, error) { p, err := tx.db.allocate(tx.meta.txid, count) @@ -503,8 +418,8 @@ func (tx *Tx) allocate(count int) (*page, error) { tx.pages[p.id] = p // Update statistics. - tx.stats.PageCount += count - tx.stats.PageAlloc += count * tx.db.pageSize + tx.stats.IncPageCount(int64(count)) + tx.stats.IncPageAlloc(int64(count * tx.db.pageSize)) return p, nil } @@ -539,7 +454,7 @@ func (tx *Tx) write() error { } // Update statistics. - tx.stats.Write++ + tx.stats.IncWrite(1) // Exit inner for loop if we've written all the chunks. rem -= sz @@ -574,7 +489,7 @@ func (tx *Tx) write() error { for i := range buf { buf[i] = 0 } - tx.db.pagePool.Put(buf) + tx.db.pagePool.Put(buf) //nolint:staticcheck } return nil @@ -598,7 +513,7 @@ func (tx *Tx) writeMeta() error { } // Update statistics. - tx.stats.Write++ + tx.stats.IncWrite(1) return nil } @@ -609,26 +524,35 @@ func (tx *Tx) page(id pgid) *page { // Check the dirty pages first. if tx.pages != nil { if p, ok := tx.pages[id]; ok { + p.fastCheck(id) return p } } // Otherwise return directly from the mmap. - return tx.db.page(id) + p := tx.db.page(id) + p.fastCheck(id) + return p } // forEachPage iterates over every page within a given page and executes a function. -func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { - p := tx.page(pgid) +func (tx *Tx) forEachPage(pgidnum pgid, fn func(*page, int, []pgid)) { + stack := make([]pgid, 10) + stack[0] = pgidnum + tx.forEachPageInternal(stack[:1], fn) +} + +func (tx *Tx) forEachPageInternal(pgidstack []pgid, fn func(*page, int, []pgid)) { + p := tx.page(pgidstack[len(pgidstack)-1]) // Execute function. - fn(p, depth) + fn(p, len(pgidstack)-1, pgidstack) // Recursively loop over children. if (p.flags & branchPageFlag) != 0 { for i := 0; i < int(p.count); i++ { elem := p.branchPageElement(uint16(i)) - tx.forEachPage(elem.pgid, depth+1, fn) + tx.forEachPageInternal(append(pgidstack, elem.pgid), fn) } } } @@ -642,6 +566,10 @@ func (tx *Tx) Page(id int) (*PageInfo, error) { return nil, nil } + if tx.db.freelist == nil { + return nil, ErrFreePagesNotLoaded + } + // Build the page info. p := tx.db.page(pgid(id)) info := &PageInfo{ @@ -663,43 +591,61 @@ func (tx *Tx) Page(id int) (*PageInfo, error) { // TxStats represents statistics about the actions performed by the transaction. type TxStats struct { // Page statistics. - PageCount int // number of page allocations - PageAlloc int // total bytes allocated + // + // DEPRECATED: Use GetPageCount() or IncPageCount() + PageCount int64 // number of page allocations + // DEPRECATED: Use GetPageAlloc() or IncPageAlloc() + PageAlloc int64 // total bytes allocated // Cursor statistics. - CursorCount int // number of cursors created + // + // DEPRECATED: Use GetCursorCount() or IncCursorCount() + CursorCount int64 // number of cursors created // Node statistics - NodeCount int // number of node allocations - NodeDeref int // number of node dereferences + // + // DEPRECATED: Use GetNodeCount() or IncNodeCount() + NodeCount int64 // number of node allocations + // DEPRECATED: Use GetNodeDeref() or IncNodeDeref() + NodeDeref int64 // number of node dereferences // Rebalance statistics. - Rebalance int // number of node rebalances + // + // DEPRECATED: Use GetRebalance() or IncRebalance() + Rebalance int64 // number of node rebalances + // DEPRECATED: Use GetRebalanceTime() or IncRebalanceTime() RebalanceTime time.Duration // total time spent rebalancing // Split/Spill statistics. - Split int // number of nodes split - Spill int // number of nodes spilled + // + // DEPRECATED: Use GetSplit() or IncSplit() + Split int64 // number of nodes split + // DEPRECATED: Use GetSpill() or IncSpill() + Spill int64 // number of nodes spilled + // DEPRECATED: Use GetSpillTime() or IncSpillTime() SpillTime time.Duration // total time spent spilling // Write statistics. - Write int // number of writes performed + // + // DEPRECATED: Use GetWrite() or IncWrite() + Write int64 // number of writes performed + // DEPRECATED: Use GetWriteTime() or IncWriteTime() WriteTime time.Duration // total time spent writing to disk } func (s *TxStats) add(other *TxStats) { - s.PageCount += other.PageCount - s.PageAlloc += other.PageAlloc - s.CursorCount += other.CursorCount - s.NodeCount += other.NodeCount - s.NodeDeref += other.NodeDeref - s.Rebalance += other.Rebalance - s.RebalanceTime += other.RebalanceTime - s.Split += other.Split - s.Spill += other.Spill - s.SpillTime += other.SpillTime - s.Write += other.Write - s.WriteTime += other.WriteTime + s.IncPageCount(other.GetPageCount()) + s.IncPageAlloc(other.GetPageAlloc()) + s.IncCursorCount(other.GetCursorCount()) + s.IncNodeCount(other.GetNodeCount()) + s.IncNodeDeref(other.GetNodeDeref()) + s.IncRebalance(other.GetRebalance()) + s.IncRebalanceTime(other.GetRebalanceTime()) + s.IncSplit(other.GetSplit()) + s.IncSpill(other.GetSpill()) + s.IncSpillTime(other.GetSpillTime()) + s.IncWrite(other.GetWrite()) + s.IncWriteTime(other.GetWriteTime()) } // Sub calculates and returns the difference between two sets of transaction stats. @@ -707,17 +653,145 @@ func (s *TxStats) add(other *TxStats) { // you need the performance counters that occurred within that time span. func (s *TxStats) Sub(other *TxStats) TxStats { var diff TxStats - diff.PageCount = s.PageCount - other.PageCount - diff.PageAlloc = s.PageAlloc - other.PageAlloc - diff.CursorCount = s.CursorCount - other.CursorCount - diff.NodeCount = s.NodeCount - other.NodeCount - diff.NodeDeref = s.NodeDeref - other.NodeDeref - diff.Rebalance = s.Rebalance - other.Rebalance - diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime - diff.Split = s.Split - other.Split - diff.Spill = s.Spill - other.Spill - diff.SpillTime = s.SpillTime - other.SpillTime - diff.Write = s.Write - other.Write - diff.WriteTime = s.WriteTime - other.WriteTime + diff.PageCount = s.GetPageCount() - other.GetPageCount() + diff.PageAlloc = s.GetPageAlloc() - other.GetPageAlloc() + diff.CursorCount = s.GetCursorCount() - other.GetCursorCount() + diff.NodeCount = s.GetNodeCount() - other.GetNodeCount() + diff.NodeDeref = s.GetNodeDeref() - other.GetNodeDeref() + diff.Rebalance = s.GetRebalance() - other.GetRebalance() + diff.RebalanceTime = s.GetRebalanceTime() - other.GetRebalanceTime() + diff.Split = s.GetSplit() - other.GetSplit() + diff.Spill = s.GetSpill() - other.GetSpill() + diff.SpillTime = s.GetSpillTime() - other.GetSpillTime() + diff.Write = s.GetWrite() - other.GetWrite() + diff.WriteTime = s.GetWriteTime() - other.GetWriteTime() return diff } + +// GetPageCount returns PageCount atomically. +func (s *TxStats) GetPageCount() int64 { + return atomic.LoadInt64(&s.PageCount) +} + +// IncPageCount increases PageCount atomically and returns the new value. +func (s *TxStats) IncPageCount(delta int64) int64 { + return atomic.AddInt64(&s.PageCount, delta) +} + +// GetPageAlloc returns PageAlloc atomically. +func (s *TxStats) GetPageAlloc() int64 { + return atomic.LoadInt64(&s.PageAlloc) +} + +// IncPageAlloc increases PageAlloc atomically and returns the new value. +func (s *TxStats) IncPageAlloc(delta int64) int64 { + return atomic.AddInt64(&s.PageAlloc, delta) +} + +// GetCursorCount returns CursorCount atomically. +func (s *TxStats) GetCursorCount() int64 { + return atomic.LoadInt64(&s.CursorCount) +} + +// IncCursorCount increases CursorCount atomically and return the new value. +func (s *TxStats) IncCursorCount(delta int64) int64 { + return atomic.AddInt64(&s.CursorCount, delta) +} + +// GetNodeCount returns NodeCount atomically. +func (s *TxStats) GetNodeCount() int64 { + return atomic.LoadInt64(&s.NodeCount) +} + +// IncNodeCount increases NodeCount atomically and returns the new value. +func (s *TxStats) IncNodeCount(delta int64) int64 { + return atomic.AddInt64(&s.NodeCount, delta) +} + +// GetNodeDeref returns NodeDeref atomically. +func (s *TxStats) GetNodeDeref() int64 { + return atomic.LoadInt64(&s.NodeDeref) +} + +// IncNodeDeref increases NodeDeref atomically and returns the new value. +func (s *TxStats) IncNodeDeref(delta int64) int64 { + return atomic.AddInt64(&s.NodeDeref, delta) +} + +// GetRebalance returns Rebalance atomically. +func (s *TxStats) GetRebalance() int64 { + return atomic.LoadInt64(&s.Rebalance) +} + +// IncRebalance increases Rebalance atomically and returns the new value. +func (s *TxStats) IncRebalance(delta int64) int64 { + return atomic.AddInt64(&s.Rebalance, delta) +} + +// GetRebalanceTime returns RebalanceTime atomically. +func (s *TxStats) GetRebalanceTime() time.Duration { + return atomicLoadDuration(&s.RebalanceTime) +} + +// IncRebalanceTime increases RebalanceTime atomically and returns the new value. +func (s *TxStats) IncRebalanceTime(delta time.Duration) time.Duration { + return atomicAddDuration(&s.RebalanceTime, delta) +} + +// GetSplit returns Split atomically. +func (s *TxStats) GetSplit() int64 { + return atomic.LoadInt64(&s.Split) +} + +// IncSplit increases Split atomically and returns the new value. +func (s *TxStats) IncSplit(delta int64) int64 { + return atomic.AddInt64(&s.Split, delta) +} + +// GetSpill returns Spill atomically. +func (s *TxStats) GetSpill() int64 { + return atomic.LoadInt64(&s.Spill) +} + +// IncSpill increases Spill atomically and returns the new value. +func (s *TxStats) IncSpill(delta int64) int64 { + return atomic.AddInt64(&s.Spill, delta) +} + +// GetSpillTime returns SpillTime atomically. +func (s *TxStats) GetSpillTime() time.Duration { + return atomicLoadDuration(&s.SpillTime) +} + +// IncSpillTime increases SpillTime atomically and returns the new value. +func (s *TxStats) IncSpillTime(delta time.Duration) time.Duration { + return atomicAddDuration(&s.SpillTime, delta) +} + +// GetWrite returns Write atomically. +func (s *TxStats) GetWrite() int64 { + return atomic.LoadInt64(&s.Write) +} + +// IncWrite increases Write atomically and returns the new value. +func (s *TxStats) IncWrite(delta int64) int64 { + return atomic.AddInt64(&s.Write, delta) +} + +// GetWriteTime returns WriteTime atomically. +func (s *TxStats) GetWriteTime() time.Duration { + return atomicLoadDuration(&s.WriteTime) +} + +// IncWriteTime increases WriteTime atomically and returns the new value. +func (s *TxStats) IncWriteTime(delta time.Duration) time.Duration { + return atomicAddDuration(&s.WriteTime, delta) +} + +func atomicAddDuration(ptr *time.Duration, du time.Duration) time.Duration { + return time.Duration(atomic.AddInt64((*int64)(unsafe.Pointer(ptr)), int64(du))) +} + +func atomicLoadDuration(ptr *time.Duration) time.Duration { + return time.Duration(atomic.LoadInt64((*int64)(unsafe.Pointer(ptr)))) +} diff --git a/tools/vendor/go.etcd.io/bbolt/tx_check.go b/tools/vendor/go.etcd.io/bbolt/tx_check.go new file mode 100644 index 000000000..75c7c0843 --- /dev/null +++ b/tools/vendor/go.etcd.io/bbolt/tx_check.go @@ -0,0 +1,226 @@ +package bbolt + +import ( + "encoding/hex" + "fmt" +) + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + return tx.CheckWithOptions() +} + +// CheckWithOptions allows users to provide a customized `KVStringer` implementation, +// so that bolt can generate human-readable diagnostic messages. +func (tx *Tx) CheckWithOptions(options ...CheckOption) <-chan error { + chkConfig := checkConfig{ + kvStringer: HexKVStringer(), + } + for _, op := range options { + op(&chkConfig) + } + + ch := make(chan error) + go tx.check(chkConfig.kvStringer, ch) + return ch +} + +func (tx *Tx) check(kvStringer KVStringer, ch chan error) { + // Force loading free list if opened in ReadOnly mode. + tx.db.loadFreelist() + + // Check if any pages are double freed. + freed := make(map[pgid]bool) + all := make([]pgid, tx.db.freelist.count()) + tx.db.freelist.copyall(all) + for _, id := range all { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + if tx.meta.freelist != pgidNoFreelist { + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, kvStringer, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, + kvStringer KVStringer, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, func(p *page, _ int, stack []pgid) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d (stack: %v)", int(p.id), int(b.tx.meta.pgid), stack) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references (stack: %v)", int(id), stack) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s (stack: %v)", int(p.id), p.typ(), stack) + } + }) + + tx.recursivelyCheckPages(b.root, kvStringer.KeyToString, ch) + + // Check each bucket within this bucket. + _ = b.ForEachBucket(func(k []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, kvStringer, ch) + } + return nil + }) +} + +// recursivelyCheckPages confirms database consistency with respect to b-tree +// key order constraints: +// - keys on pages must be sorted +// - keys on children pages are between 2 consecutive keys on the parent's branch page). +func (tx *Tx) recursivelyCheckPages(pgId pgid, keyToString func([]byte) string, ch chan error) { + tx.recursivelyCheckPagesInternal(pgId, nil, nil, nil, keyToString, ch) +} + +// recursivelyCheckPagesInternal verifies that all keys in the subtree rooted at `pgid` are: +// - >=`minKeyClosed` (can be nil) +// - <`maxKeyOpen` (can be nil) +// - Are in right ordering relationship to their parents. +// `pagesStack` is expected to contain IDs of pages from the tree root to `pgid` for the clean debugging message. +func (tx *Tx) recursivelyCheckPagesInternal( + pgId pgid, minKeyClosed, maxKeyOpen []byte, pagesStack []pgid, + keyToString func([]byte) string, ch chan error) (maxKeyInSubtree []byte) { + + p := tx.page(pgId) + pagesStack = append(pagesStack, pgId) + switch { + case p.flags&branchPageFlag != 0: + // For branch page we navigate ranges of all subpages. + runningMin := minKeyClosed + for i := range p.branchPageElements() { + elem := p.branchPageElement(uint16(i)) + verifyKeyOrder(elem.pgid, "branch", i, elem.key(), runningMin, maxKeyOpen, ch, keyToString, pagesStack) + + maxKey := maxKeyOpen + if i < len(p.branchPageElements())-1 { + maxKey = p.branchPageElement(uint16(i + 1)).key() + } + maxKeyInSubtree = tx.recursivelyCheckPagesInternal(elem.pgid, elem.key(), maxKey, pagesStack, keyToString, ch) + runningMin = maxKeyInSubtree + } + return maxKeyInSubtree + case p.flags&leafPageFlag != 0: + runningMin := minKeyClosed + for i := range p.leafPageElements() { + elem := p.leafPageElement(uint16(i)) + verifyKeyOrder(pgId, "leaf", i, elem.key(), runningMin, maxKeyOpen, ch, keyToString, pagesStack) + runningMin = elem.key() + } + if p.count > 0 { + return p.leafPageElement(p.count - 1).key() + } + default: + ch <- fmt.Errorf("unexpected page type for pgId:%d", pgId) + } + return maxKeyInSubtree +} + +/*** + * verifyKeyOrder checks whether an entry with given #index on pgId (pageType: "branch|leaf") that has given "key", + * is within range determined by (previousKey..maxKeyOpen) and reports found violations to the channel (ch). + */ +func verifyKeyOrder(pgId pgid, pageType string, index int, key []byte, previousKey []byte, maxKeyOpen []byte, ch chan error, keyToString func([]byte) string, pagesStack []pgid) { + if index == 0 && previousKey != nil && compareKeys(previousKey, key) > 0 { + ch <- fmt.Errorf("the first key[%d]=(hex)%s on %s page(%d) needs to be >= the key in the ancestor (%s). Stack: %v", + index, keyToString(key), pageType, pgId, keyToString(previousKey), pagesStack) + } + if index > 0 { + cmpRet := compareKeys(previousKey, key) + if cmpRet > 0 { + ch <- fmt.Errorf("key[%d]=(hex)%s on %s page(%d) needs to be > (found <) than previous element (hex)%s. Stack: %v", + index, keyToString(key), pageType, pgId, keyToString(previousKey), pagesStack) + } + if cmpRet == 0 { + ch <- fmt.Errorf("key[%d]=(hex)%s on %s page(%d) needs to be > (found =) than previous element (hex)%s. Stack: %v", + index, keyToString(key), pageType, pgId, keyToString(previousKey), pagesStack) + } + } + if maxKeyOpen != nil && compareKeys(key, maxKeyOpen) >= 0 { + ch <- fmt.Errorf("key[%d]=(hex)%s on %s page(%d) needs to be < than key of the next element in ancestor (hex)%s. Pages stack: %v", + index, keyToString(key), pageType, pgId, keyToString(previousKey), pagesStack) + } +} + +// =========================================================================================== + +type checkConfig struct { + kvStringer KVStringer +} + +type CheckOption func(options *checkConfig) + +func WithKVStringer(kvStringer KVStringer) CheckOption { + return func(c *checkConfig) { + c.kvStringer = kvStringer + } +} + +// KVStringer allows to prepare human-readable diagnostic messages. +type KVStringer interface { + KeyToString([]byte) string + ValueToString([]byte) string +} + +// HexKVStringer serializes both key & value to hex representation. +func HexKVStringer() KVStringer { + return hexKvStringer{} +} + +type hexKvStringer struct{} + +func (_ hexKvStringer) KeyToString(key []byte) string { + return hex.EncodeToString(key) +} + +func (_ hexKvStringer) ValueToString(value []byte) string { + return hex.EncodeToString(value) +} diff --git a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go b/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go deleted file mode 100644 index ae112ae13..000000000 --- a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2015 The etcd 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 rpctypes - -import ( - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// server-side error -var ( - ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err() - ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err() - ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err() - ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err() - ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err() - ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err() - ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err() - ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err() - ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err() - - ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err() - ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err() - ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err() - - ErrGRPCWatchCanceled = status.New(codes.Canceled, "etcdserver: watch canceled").Err() - - ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err() - ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err() - ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err() - ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err() - ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err() - ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err() - ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err() - ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err() - - ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err() - ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err() - - ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err() - ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err() - ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err() - ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err() - ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err() - ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err() - ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err() - ErrGRPCRoleEmpty = status.New(codes.InvalidArgument, "etcdserver: role name is empty").Err() - ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err() - ErrGRPCPermissionNotGiven = status.New(codes.InvalidArgument, "etcdserver: permission not given").Err() - ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err() - ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err() - ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err() - ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err() - ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err() - ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err() - ErrGRPCAuthOldRevision = status.New(codes.InvalidArgument, "etcdserver: revision of auth store is old").Err() - - ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err() - ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err() - ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err() - ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err() - ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err() - ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err() - ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err() - ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err() - ErrGRPCTimeoutWaitAppliedIndex = status.New(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long").Err() - ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err() - ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err() - ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err() - ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err() - - ErrGRPCClusterVersionUnavailable = status.New(codes.Unavailable, "etcdserver: cluster version not found during downgrade").Err() - ErrGRPCWrongDowngradeVersionFormat = status.New(codes.InvalidArgument, "etcdserver: wrong downgrade target version format").Err() - ErrGRPCInvalidDowngradeTargetVersion = status.New(codes.InvalidArgument, "etcdserver: invalid downgrade target version").Err() - ErrGRPCDowngradeInProcess = status.New(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress").Err() - ErrGRPCNoInflightDowngrade = status.New(codes.FailedPrecondition, "etcdserver: no inflight downgrade job").Err() - - ErrGRPCCanceled = status.New(codes.Canceled, "etcdserver: request canceled").Err() - ErrGRPCDeadlineExceeded = status.New(codes.DeadlineExceeded, "etcdserver: context deadline exceeded").Err() - - errStringToError = map[string]error{ - ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey, - ErrorDesc(ErrGRPCKeyNotFound): ErrGRPCKeyNotFound, - ErrorDesc(ErrGRPCValueProvided): ErrGRPCValueProvided, - ErrorDesc(ErrGRPCLeaseProvided): ErrGRPCLeaseProvided, - - ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, - ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, - ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, - ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, - ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, - - ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound, - ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist, - ErrorDesc(ErrGRPCLeaseTTLTooLarge): ErrGRPCLeaseTTLTooLarge, - - ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist, - ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist, - ErrorDesc(ErrGRPCMemberNotEnoughStarted): ErrGRPCMemberNotEnoughStarted, - ErrorDesc(ErrGRPCMemberBadURLs): ErrGRPCMemberBadURLs, - ErrorDesc(ErrGRPCMemberNotFound): ErrGRPCMemberNotFound, - ErrorDesc(ErrGRPCMemberNotLearner): ErrGRPCMemberNotLearner, - ErrorDesc(ErrGRPCLearnerNotReady): ErrGRPCLearnerNotReady, - ErrorDesc(ErrGRPCTooManyLearners): ErrGRPCTooManyLearners, - - ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge, - ErrorDesc(ErrGRPCRequestTooManyRequests): ErrGRPCRequestTooManyRequests, - - ErrorDesc(ErrGRPCRootUserNotExist): ErrGRPCRootUserNotExist, - ErrorDesc(ErrGRPCRootRoleNotExist): ErrGRPCRootRoleNotExist, - ErrorDesc(ErrGRPCUserAlreadyExist): ErrGRPCUserAlreadyExist, - ErrorDesc(ErrGRPCUserEmpty): ErrGRPCUserEmpty, - ErrorDesc(ErrGRPCUserNotFound): ErrGRPCUserNotFound, - ErrorDesc(ErrGRPCRoleAlreadyExist): ErrGRPCRoleAlreadyExist, - ErrorDesc(ErrGRPCRoleNotFound): ErrGRPCRoleNotFound, - ErrorDesc(ErrGRPCRoleEmpty): ErrGRPCRoleEmpty, - ErrorDesc(ErrGRPCAuthFailed): ErrGRPCAuthFailed, - ErrorDesc(ErrGRPCPermissionDenied): ErrGRPCPermissionDenied, - ErrorDesc(ErrGRPCRoleNotGranted): ErrGRPCRoleNotGranted, - ErrorDesc(ErrGRPCPermissionNotGranted): ErrGRPCPermissionNotGranted, - ErrorDesc(ErrGRPCAuthNotEnabled): ErrGRPCAuthNotEnabled, - ErrorDesc(ErrGRPCInvalidAuthToken): ErrGRPCInvalidAuthToken, - ErrorDesc(ErrGRPCInvalidAuthMgmt): ErrGRPCInvalidAuthMgmt, - ErrorDesc(ErrGRPCAuthOldRevision): ErrGRPCAuthOldRevision, - - ErrorDesc(ErrGRPCNoLeader): ErrGRPCNoLeader, - ErrorDesc(ErrGRPCNotLeader): ErrGRPCNotLeader, - ErrorDesc(ErrGRPCLeaderChanged): ErrGRPCLeaderChanged, - ErrorDesc(ErrGRPCNotCapable): ErrGRPCNotCapable, - ErrorDesc(ErrGRPCStopped): ErrGRPCStopped, - ErrorDesc(ErrGRPCTimeout): ErrGRPCTimeout, - ErrorDesc(ErrGRPCTimeoutDueToLeaderFail): ErrGRPCTimeoutDueToLeaderFail, - ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost, - ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy, - ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt, - ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner, - ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee, - - ErrorDesc(ErrGRPCClusterVersionUnavailable): ErrGRPCClusterVersionUnavailable, - ErrorDesc(ErrGRPCWrongDowngradeVersionFormat): ErrGRPCWrongDowngradeVersionFormat, - ErrorDesc(ErrGRPCInvalidDowngradeTargetVersion): ErrGRPCInvalidDowngradeTargetVersion, - ErrorDesc(ErrGRPCDowngradeInProcess): ErrGRPCDowngradeInProcess, - ErrorDesc(ErrGRPCNoInflightDowngrade): ErrGRPCNoInflightDowngrade, - } -) - -// client-side error -var ( - ErrEmptyKey = Error(ErrGRPCEmptyKey) - ErrKeyNotFound = Error(ErrGRPCKeyNotFound) - ErrValueProvided = Error(ErrGRPCValueProvided) - ErrLeaseProvided = Error(ErrGRPCLeaseProvided) - ErrTooManyOps = Error(ErrGRPCTooManyOps) - ErrDuplicateKey = Error(ErrGRPCDuplicateKey) - ErrCompacted = Error(ErrGRPCCompacted) - ErrFutureRev = Error(ErrGRPCFutureRev) - ErrNoSpace = Error(ErrGRPCNoSpace) - - ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound) - ErrLeaseExist = Error(ErrGRPCLeaseExist) - ErrLeaseTTLTooLarge = Error(ErrGRPCLeaseTTLTooLarge) - - ErrMemberExist = Error(ErrGRPCMemberExist) - ErrPeerURLExist = Error(ErrGRPCPeerURLExist) - ErrMemberNotEnoughStarted = Error(ErrGRPCMemberNotEnoughStarted) - ErrMemberBadURLs = Error(ErrGRPCMemberBadURLs) - ErrMemberNotFound = Error(ErrGRPCMemberNotFound) - ErrMemberNotLearner = Error(ErrGRPCMemberNotLearner) - ErrMemberLearnerNotReady = Error(ErrGRPCLearnerNotReady) - ErrTooManyLearners = Error(ErrGRPCTooManyLearners) - - ErrRequestTooLarge = Error(ErrGRPCRequestTooLarge) - ErrTooManyRequests = Error(ErrGRPCRequestTooManyRequests) - - ErrRootUserNotExist = Error(ErrGRPCRootUserNotExist) - ErrRootRoleNotExist = Error(ErrGRPCRootRoleNotExist) - ErrUserAlreadyExist = Error(ErrGRPCUserAlreadyExist) - ErrUserEmpty = Error(ErrGRPCUserEmpty) - ErrUserNotFound = Error(ErrGRPCUserNotFound) - ErrRoleAlreadyExist = Error(ErrGRPCRoleAlreadyExist) - ErrRoleNotFound = Error(ErrGRPCRoleNotFound) - ErrRoleEmpty = Error(ErrGRPCRoleEmpty) - ErrAuthFailed = Error(ErrGRPCAuthFailed) - ErrPermissionDenied = Error(ErrGRPCPermissionDenied) - ErrRoleNotGranted = Error(ErrGRPCRoleNotGranted) - ErrPermissionNotGranted = Error(ErrGRPCPermissionNotGranted) - ErrAuthNotEnabled = Error(ErrGRPCAuthNotEnabled) - ErrInvalidAuthToken = Error(ErrGRPCInvalidAuthToken) - ErrAuthOldRevision = Error(ErrGRPCAuthOldRevision) - ErrInvalidAuthMgmt = Error(ErrGRPCInvalidAuthMgmt) - - ErrNoLeader = Error(ErrGRPCNoLeader) - ErrNotLeader = Error(ErrGRPCNotLeader) - ErrLeaderChanged = Error(ErrGRPCLeaderChanged) - ErrNotCapable = Error(ErrGRPCNotCapable) - ErrStopped = Error(ErrGRPCStopped) - ErrTimeout = Error(ErrGRPCTimeout) - ErrTimeoutDueToLeaderFail = Error(ErrGRPCTimeoutDueToLeaderFail) - ErrTimeoutDueToConnectionLost = Error(ErrGRPCTimeoutDueToConnectionLost) - ErrTimeoutWaitAppliedIndex = Error(ErrGRPCTimeoutWaitAppliedIndex) - ErrUnhealthy = Error(ErrGRPCUnhealthy) - ErrCorrupt = Error(ErrGRPCCorrupt) - ErrBadLeaderTransferee = Error(ErrGRPCBadLeaderTransferee) - - ErrClusterVersionUnavailable = Error(ErrGRPCClusterVersionUnavailable) - ErrWrongDowngradeVersionFormat = Error(ErrGRPCWrongDowngradeVersionFormat) - ErrInvalidDowngradeTargetVersion = Error(ErrGRPCInvalidDowngradeTargetVersion) - ErrDowngradeInProcess = Error(ErrGRPCDowngradeInProcess) - ErrNoInflightDowngrade = Error(ErrGRPCNoInflightDowngrade) -) - -// EtcdError defines gRPC server errors. -// (https://github.com/grpc/grpc-go/blob/master/rpc_util.go#L319-L323) -type EtcdError struct { - code codes.Code - desc string -} - -// Code returns grpc/codes.Code. -// TODO: define clientv3/codes.Code. -func (e EtcdError) Code() codes.Code { - return e.code -} - -func (e EtcdError) Error() string { - return e.desc -} - -func Error(err error) error { - if err == nil { - return nil - } - verr, ok := errStringToError[ErrorDesc(err)] - if !ok { // not gRPC error - return err - } - ev, ok := status.FromError(verr) - var desc string - if ok { - desc = ev.Message() - } else { - desc = verr.Error() - } - return EtcdError{code: ev.Code(), desc: desc} -} - -func ErrorDesc(err error) string { - if s, ok := status.FromError(err); ok { - return s.Message() - } - return err.Error() -} diff --git a/tools/vendor/go.opencensus.io/Makefile b/tools/vendor/go.opencensus.io/Makefile index b3ce3df30..d896edc99 100644 --- a/tools/vendor/go.opencensus.io/Makefile +++ b/tools/vendor/go.opencensus.io/Makefile @@ -91,7 +91,7 @@ embedmd: .PHONY: install-tools install-tools: - go get -u golang.org/x/lint/golint - go get -u golang.org/x/tools/cmd/cover - go get -u golang.org/x/tools/cmd/goimports - go get -u github.com/rakyll/embedmd + go install golang.org/x/lint/golint@latest + go install golang.org/x/tools/cmd/cover@latest + go install golang.org/x/tools/cmd/goimports@latest + go install github.com/rakyll/embedmd@latest diff --git a/tools/vendor/go.opencensus.io/opencensus.go b/tools/vendor/go.opencensus.io/opencensus.go index e5e4b4368..11e31f421 100644 --- a/tools/vendor/go.opencensus.io/opencensus.go +++ b/tools/vendor/go.opencensus.io/opencensus.go @@ -17,5 +17,5 @@ package opencensus // import "go.opencensus.io" // Version is the current release version of OpenCensus in use. func Version() string { - return "0.23.0" + return "0.24.0" } diff --git a/tools/vendor/go.opencensus.io/trace/doc.go b/tools/vendor/go.opencensus.io/trace/doc.go index 04b1ee4f3..7a1616a55 100644 --- a/tools/vendor/go.opencensus.io/trace/doc.go +++ b/tools/vendor/go.opencensus.io/trace/doc.go @@ -18,24 +18,23 @@ Package trace contains support for OpenCensus distributed tracing. The following assumes a basic familiarity with OpenCensus concepts. See http://opencensus.io - -Exporting Traces +# Exporting Traces To export collected tracing data, register at least one exporter. You can use one of the provided exporters or write your own. - trace.RegisterExporter(exporter) + trace.RegisterExporter(exporter) By default, traces will be sampled relatively rarely. To change the sampling frequency for your entire program, call ApplyConfig. Use a ProbabilitySampler to sample a subset of traces, or use AlwaysSample to collect a trace on every run: - trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) + trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) Be careful about using trace.AlwaysSample in a production application with significant traffic: a new trace will be started and exported for every request. -Adding Spans to a Trace +# Adding Spans to a Trace A trace consists of a tree of spans. In Go, the current span is carried in a context.Context. @@ -44,8 +43,8 @@ It is common to want to capture all the activity of a function call in a span. F this to work, the function must take a context.Context as a parameter. Add these two lines to the top of the function: - ctx, span := trace.StartSpan(ctx, "example.com/Run") - defer span.End() + ctx, span := trace.StartSpan(ctx, "example.com/Run") + defer span.End() StartSpan will create a new top-level span if the context doesn't contain another span, otherwise it will create a child span. diff --git a/tools/vendor/go.opencensus.io/trace/lrumap.go b/tools/vendor/go.opencensus.io/trace/lrumap.go index 908c2497e..80095a5f6 100644 --- a/tools/vendor/go.opencensus.io/trace/lrumap.go +++ b/tools/vendor/go.opencensus.io/trace/lrumap.go @@ -44,7 +44,7 @@ func (lm lruMap) len() int { } func (lm lruMap) keys() []interface{} { - keys := make([]interface{}, len(lm.cacheKeys)) + keys := make([]interface{}, 0, len(lm.cacheKeys)) for k := range lm.cacheKeys { keys = append(keys, k) } diff --git a/tools/vendor/go.opencensus.io/trace/trace_go11.go b/tools/vendor/go.opencensus.io/trace/trace_go11.go index b7d8aaf28..b8fc1e495 100644 --- a/tools/vendor/go.opencensus.io/trace/trace_go11.go +++ b/tools/vendor/go.opencensus.io/trace/trace_go11.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build go1.11 // +build go1.11 package trace diff --git a/tools/vendor/go.opencensus.io/trace/trace_nongo11.go b/tools/vendor/go.opencensus.io/trace/trace_nongo11.go index e25419859..da488fc87 100644 --- a/tools/vendor/go.opencensus.io/trace/trace_nongo11.go +++ b/tools/vendor/go.opencensus.io/trace/trace_nongo11.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !go1.11 // +build !go1.11 package trace diff --git a/tools/vendor/go.opentelemetry.io/otel/.golangci.yml b/tools/vendor/go.opentelemetry.io/otel/.golangci.yml index 253e3b35b..0f099f575 100644 --- a/tools/vendor/go.opentelemetry.io/otel/.golangci.yml +++ b/tools/vendor/go.opentelemetry.io/otel/.golangci.yml @@ -9,7 +9,6 @@ linters: disable-all: true # Specifically enable linters we want to use. enable: - - deadcode - depguard - errcheck - godot @@ -21,10 +20,8 @@ linters: - misspell - revive - staticcheck - - structcheck - typecheck - unused - - varcheck issues: # Maximum issues count per one linter. @@ -114,8 +111,9 @@ linters-settings: - name: constant-logical-expr disabled: false # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument + # TODO (#3372) reenable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280 - name: context-as-argument - disabled: false + disabled: true arguments: allowTypesBefore: "*testing.T" # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-keys-type diff --git a/tools/vendor/go.opentelemetry.io/otel/.lycheeignore b/tools/vendor/go.opentelemetry.io/otel/.lycheeignore index 545d63452..40d62fa2e 100644 --- a/tools/vendor/go.opentelemetry.io/otel/.lycheeignore +++ b/tools/vendor/go.opentelemetry.io/otel/.lycheeignore @@ -1,3 +1,6 @@ http://localhost http://jaeger-collector https://github.com/open-telemetry/opentelemetry-go/milestone/ +https://github.com/open-telemetry/opentelemetry-go/projects +file:///home/runner/work/opentelemetry-go/opentelemetry-go/libraries +file:///home/runner/work/opentelemetry-go/opentelemetry-go/manual diff --git a/tools/vendor/go.opentelemetry.io/otel/CHANGELOG.md b/tools/vendor/go.opentelemetry.io/otel/CHANGELOG.md index 93b3a7d74..1d9726f60 100644 --- a/tools/vendor/go.opentelemetry.io/otel/CHANGELOG.md +++ b/tools/vendor/go.opentelemetry.io/otel/CHANGELOG.md @@ -8,6 +8,314 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [1.14.0/0.37.0/0.0.4] 2023-02-27 + +This release is the last to support [Go 1.18]. +The next release will require at least [Go 1.19]. + +### Added + +- The `event` type semantic conventions are added to `go.opentelemetry.io/otel/semconv/v1.17.0`. (#3697) +- Support [Go 1.20]. (#3693) +- The `go.opentelemetry.io/otel/semconv/v1.18.0` package. + The package contains semantic conventions from the `v1.18.0` version of the OpenTelemetry specification. (#3719) + - The following `const` renames from `go.opentelemetry.io/otel/semconv/v1.17.0` are included: + - `OtelScopeNameKey` -> `OTelScopeNameKey` + - `OtelScopeVersionKey` -> `OTelScopeVersionKey` + - `OtelLibraryNameKey` -> `OTelLibraryNameKey` + - `OtelLibraryVersionKey` -> `OTelLibraryVersionKey` + - `OtelStatusCodeKey` -> `OTelStatusCodeKey` + - `OtelStatusDescriptionKey` -> `OTelStatusDescriptionKey` + - `OtelStatusCodeOk` -> `OTelStatusCodeOk` + - `OtelStatusCodeError` -> `OTelStatusCodeError` + - The following `func` renames from `go.opentelemetry.io/otel/semconv/v1.17.0` are included: + - `OtelScopeName` -> `OTelScopeName` + - `OtelScopeVersion` -> `OTelScopeVersion` + - `OtelLibraryName` -> `OTelLibraryName` + - `OtelLibraryVersion` -> `OTelLibraryVersion` + - `OtelStatusDescription` -> `OTelStatusDescription` +- A `IsSampled` method is added to the `SpanContext` implementation in `go.opentelemetry.io/otel/bridge/opentracing` to expose the span sampled state. + See the [README](./bridge/opentracing/README.md) for more information. (#3570) +- The `WithInstrumentationAttributes` option to `go.opentelemetry.io/otel/metric`. (#3738) +- The `WithInstrumentationAttributes` option to `go.opentelemetry.io/otel/trace`. (#3739) +- The following environment variables are supported by the periodic `Reader` in `go.opentelemetry.io/otel/sdk/metric`. (#3763) + - `OTEL_METRIC_EXPORT_INTERVAL` sets the time between collections and exports. + - `OTEL_METRIC_EXPORT_TIMEOUT` sets the timeout an export is attempted. + +### Changed + +- Fall-back to `TextMapCarrier` when it's not `HttpHeader`s in `go.opentelemetry.io/otel/bridge/opentracing`. (#3679) +- The `Collect` method of the `"go.opentelemetry.io/otel/sdk/metric".Reader` interface is updated to accept the `metricdata.ResourceMetrics` value the collection will be made into. + This change is made to enable memory reuse by SDK users. (#3732) +- The `WithUnit` option in `go.opentelemetry.io/otel/sdk/metric/instrument` is updated to accept a `string` for the unit value. (#3776) + +### Fixed + +- Ensure `go.opentelemetry.io/otel` does not use generics. (#3723, #3725) +- Multi-reader `MeterProvider`s now export metrics for all readers, instead of just the first reader. (#3720, #3724) +- Remove use of deprecated `"math/rand".Seed` in `go.opentelemetry.io/otel/example/prometheus`. (#3733) +- Do not silently drop unknown schema data with `Parse` in `go.opentelemetry.io/otel/schema/v1.1`. (#3743) +- Data race issue in OTLP exporter retry mechanism. (#3755, #3756) +- Wrapping empty errors when exporting in `go.opentelemetry.io/otel/sdk/metric`. (#3698, #3772) +- Incorrect "all" and "resource" definition for schema files in `go.opentelemetry.io/otel/schema/v1.1`. (#3777) + +### Deprecated + +- The `go.opentelemetry.io/otel/metric/unit` package is deprecated. + Use the equivalent unit string instead. (#3776) + - Use `"1"` instead of `unit.Dimensionless` + - Use `"By"` instead of `unit.Bytes` + - Use `"ms"` instead of `unit.Milliseconds` + +## [1.13.0/0.36.0] 2023-02-07 + +### Added + +- Attribute `KeyValue` creations functions to `go.opentelemetry.io/otel/semconv/v1.17.0` for all non-enum semantic conventions. + These functions ensure semantic convention type correctness. (#3675) + +### Fixed + +- Removed the `http.target` attribute from being added by `ServerRequest` in the following packages. (#3687) + - `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv` + - `go.opentelemetry.io/otel/semconv/v1.14.0/httpconv` + - `go.opentelemetry.io/otel/semconv/v1.15.0/httpconv` + - `go.opentelemetry.io/otel/semconv/v1.16.0/httpconv` + - `go.opentelemetry.io/otel/semconv/v1.17.0/httpconv` + +### Removed + +- The deprecated `go.opentelemetry.io/otel/metric/instrument/asyncfloat64` package is removed. (#3631) +- The deprecated `go.opentelemetry.io/otel/metric/instrument/asyncint64` package is removed. (#3631) +- The deprecated `go.opentelemetry.io/otel/metric/instrument/syncfloat64` package is removed. (#3631) +- The deprecated `go.opentelemetry.io/otel/metric/instrument/syncint64` package is removed. (#3631) + +## [1.12.0/0.35.0] 2023-01-28 + +### Added + +- The `WithInt64Callback` option to `go.opentelemetry.io/otel/metric/instrument`. + This options is used to configure `int64` Observer callbacks during their creation. (#3507) +- The `WithFloat64Callback` option to `go.opentelemetry.io/otel/metric/instrument`. + This options is used to configure `float64` Observer callbacks during their creation. (#3507) +- The `Producer` interface and `Reader.RegisterProducer(Producer)` to `go.opentelemetry.io/otel/sdk/metric`. + These additions are used to enable external metric Producers. (#3524) +- The `Callback` function type to `go.opentelemetry.io/otel/metric`. + This new named function type is registered with a `Meter`. (#3564) +- The `go.opentelemetry.io/otel/semconv/v1.13.0` package. + The package contains semantic conventions from the `v1.13.0` version of the OpenTelemetry specification. (#3499) + - The `EndUserAttributesFromHTTPRequest` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is merged into `ClientRequest` and `ServerRequest` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `HTTPAttributesFromHTTPStatusCode` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is merged into `ClientResponse` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `HTTPClientAttributesFromHTTPRequest` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is replaced by `ClientRequest` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `HTTPServerAttributesFromHTTPRequest` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is replaced by `ServerRequest` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `HTTPServerMetricAttributesFromHTTPRequest` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is replaced by `ServerRequest` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `NetAttributesFromHTTPRequest` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is split into `Transport` in `go.opentelemetry.io/otel/semconv/v1.13.0/netconv` and `ClientRequest` or `ServerRequest` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `SpanStatusFromHTTPStatusCode` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is replaced by `ClientStatus` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `SpanStatusFromHTTPStatusCodeAndSpanKind` function in `go.opentelemetry.io/otel/semconv/v1.12.0` is split into `ClientStatus` and `ServerStatus` in `go.opentelemetry.io/otel/semconv/v1.13.0/httpconv`. + - The `Client` function is included in `go.opentelemetry.io/otel/semconv/v1.13.0/netconv` to generate attributes for a `net.Conn`. + - The `Server` function is included in `go.opentelemetry.io/otel/semconv/v1.13.0/netconv` to generate attributes for a `net.Listener`. +- The `go.opentelemetry.io/otel/semconv/v1.14.0` package. + The package contains semantic conventions from the `v1.14.0` version of the OpenTelemetry specification. (#3566) +- The `go.opentelemetry.io/otel/semconv/v1.15.0` package. + The package contains semantic conventions from the `v1.15.0` version of the OpenTelemetry specification. (#3578) +- The `go.opentelemetry.io/otel/semconv/v1.16.0` package. + The package contains semantic conventions from the `v1.16.0` version of the OpenTelemetry specification. (#3579) +- Metric instruments to `go.opentelemetry.io/otel/metric/instrument`. + These instruments are use as replacements of the depreacted `go.opentelemetry.io/otel/metric/instrument/{asyncfloat64,asyncint64,syncfloat64,syncint64}` packages.(#3575, #3586) + - `Float64ObservableCounter` replaces the `asyncfloat64.Counter` + - `Float64ObservableUpDownCounter` replaces the `asyncfloat64.UpDownCounter` + - `Float64ObservableGauge` replaces the `asyncfloat64.Gauge` + - `Int64ObservableCounter` replaces the `asyncint64.Counter` + - `Int64ObservableUpDownCounter` replaces the `asyncint64.UpDownCounter` + - `Int64ObservableGauge` replaces the `asyncint64.Gauge` + - `Float64Counter` replaces the `syncfloat64.Counter` + - `Float64UpDownCounter` replaces the `syncfloat64.UpDownCounter` + - `Float64Histogram` replaces the `syncfloat64.Histogram` + - `Int64Counter` replaces the `syncint64.Counter` + - `Int64UpDownCounter` replaces the `syncint64.UpDownCounter` + - `Int64Histogram` replaces the `syncint64.Histogram` +- `NewTracerProvider` to `go.opentelemetry.io/otel/bridge/opentracing`. + This is used to create `WrapperTracer` instances from a `TracerProvider`. (#3116) +- The `Extrema` type to `go.opentelemetry.io/otel/sdk/metric/metricdata`. + This type is used to represent min/max values and still be able to distinguish unset and zero values. (#3487) +- The `go.opentelemetry.io/otel/semconv/v1.17.0` package. + The package contains semantic conventions from the `v1.17.0` version of the OpenTelemetry specification. (#3599) + +### Changed + +- Jaeger and Zipkin exporter use `github.com/go-logr/logr` as the logging interface, and add the `WithLogr` option. (#3497, #3500) +- Instrument configuration in `go.opentelemetry.io/otel/metric/instrument` is split into specific options and confguration based on the instrument type. (#3507) + - Use the added `Int64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncint64`. + - Use the added `Float64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncfloat64`. + - Use the added `Int64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncint64`. + - Use the added `Float64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncfloat64`. +- Return a `Registration` from the `RegisterCallback` method of a `Meter` in the `go.opentelemetry.io/otel/metric` package. + This `Registration` can be used to unregister callbacks. (#3522) +- Global error handler uses an atomic value instead of a mutex. (#3543) +- Add `NewMetricProducer` to `go.opentelemetry.io/otel/bridge/opencensus`, which can be used to pass OpenCensus metrics to an OpenTelemetry Reader. (#3541) +- Global logger uses an atomic value instead of a mutex. (#3545) +- The `Shutdown` method of the `"go.opentelemetry.io/otel/sdk/trace".TracerProvider` releases all computational resources when called the first time. (#3551) +- The `Sampler` returned from `TraceIDRatioBased` `go.opentelemetry.io/otel/sdk/trace` now uses the rightmost bits for sampling decisions. + This fixes random sampling when using ID generators like `xray.IDGenerator` and increasing parity with other language implementations. (#3557) +- Errors from `go.opentelemetry.io/otel/exporters/otlp/otlptrace` exporters are wrapped in erros identifying their signal name. + Existing users of the exporters attempting to identify specific errors will need to use `errors.Unwrap()` to get the underlying error. (#3516) +- Exporters from `go.opentelemetry.io/otel/exporters/otlp` will print the final retryable error message when attempts to retry time out. (#3514) +- The instrument kind names in `go.opentelemetry.io/otel/sdk/metric` are updated to match the API. (#3562) + - `InstrumentKindSyncCounter` is renamed to `InstrumentKindCounter` + - `InstrumentKindSyncUpDownCounter` is renamed to `InstrumentKindUpDownCounter` + - `InstrumentKindSyncHistogram` is renamed to `InstrumentKindHistogram` + - `InstrumentKindAsyncCounter` is renamed to `InstrumentKindObservableCounter` + - `InstrumentKindAsyncUpDownCounter` is renamed to `InstrumentKindObservableUpDownCounter` + - `InstrumentKindAsyncGauge` is renamed to `InstrumentKindObservableGauge` +- The `RegisterCallback` method of the `Meter` in `go.opentelemetry.io/otel/metric` changed. + - The named `Callback` replaces the inline function parameter. (#3564) + - `Callback` is required to return an error. (#3576) + - `Callback` accepts the added `Observer` parameter added. + This new parameter is used by `Callback` implementations to observe values for asynchronous instruments instead of calling the `Observe` method of the instrument directly. (#3584) + - The slice of `instrument.Asynchronous` is now passed as a variadic argument. (#3587) +- The exporter from `go.opentelemetry.io/otel/exporters/zipkin` is updated to use the `v1.16.0` version of semantic conventions. + This means it no longer uses the removed `net.peer.ip` or `http.host` attributes to determine the remote endpoint. + Instead it uses the `net.sock.peer` attributes. (#3581) +- The `Min` and `Max` fields of the `HistogramDataPoint` in `go.opentelemetry.io/otel/sdk/metric/metricdata` are now defined with the added `Extrema` type instead of a `*float64`. (#3487) + +### Fixed + +- Asynchronous instruments that use sum aggregators and attribute filters correctly add values from equivalent attribute sets that have been filtered. (#3439, #3549) +- The `RegisterCallback` method of the `Meter` from `go.opentelemetry.io/otel/sdk/metric` only registers a callback for instruments created by that meter. + Trying to register a callback with instruments from a different meter will result in an error being returned. (#3584) + +### Deprecated + +- The `NewMetricExporter` in `go.opentelemetry.io/otel/bridge/opencensus` is deprecated. + Use `NewMetricProducer` instead. (#3541) +- The `go.opentelemetry.io/otel/metric/instrument/asyncfloat64` package is deprecated. + Use the instruments from `go.opentelemetry.io/otel/metric/instrument` instead. (#3575) +- The `go.opentelemetry.io/otel/metric/instrument/asyncint64` package is deprecated. + Use the instruments from `go.opentelemetry.io/otel/metric/instrument` instead. (#3575) +- The `go.opentelemetry.io/otel/metric/instrument/syncfloat64` package is deprecated. + Use the instruments from `go.opentelemetry.io/otel/metric/instrument` instead. (#3575) +- The `go.opentelemetry.io/otel/metric/instrument/syncint64` package is deprecated. + Use the instruments from `go.opentelemetry.io/otel/metric/instrument` instead. (#3575) +- The `NewWrappedTracerProvider` in `go.opentelemetry.io/otel/bridge/opentracing` is now deprecated. + Use `NewTracerProvider` instead. (#3116) + +### Removed + +- The deprecated `go.opentelemetry.io/otel/sdk/metric/view` package is removed. (#3520) +- The `InstrumentProvider` from `go.opentelemetry.io/otel/sdk/metric/asyncint64` is removed. + Use the new creation methods of the `Meter` in `go.opentelemetry.io/otel/sdk/metric` instead. (#3530) + - The `Counter` method is replaced by `Meter.Int64ObservableCounter` + - The `UpDownCounter` method is replaced by `Meter.Int64ObservableUpDownCounter` + - The `Gauge` method is replaced by `Meter.Int64ObservableGauge` +- The `InstrumentProvider` from `go.opentelemetry.io/otel/sdk/metric/asyncfloat64` is removed. + Use the new creation methods of the `Meter` in `go.opentelemetry.io/otel/sdk/metric` instead. (#3530) + - The `Counter` method is replaced by `Meter.Float64ObservableCounter` + - The `UpDownCounter` method is replaced by `Meter.Float64ObservableUpDownCounter` + - The `Gauge` method is replaced by `Meter.Float64ObservableGauge` +- The `InstrumentProvider` from `go.opentelemetry.io/otel/sdk/metric/syncint64` is removed. + Use the new creation methods of the `Meter` in `go.opentelemetry.io/otel/sdk/metric` instead. (#3530) + - The `Counter` method is replaced by `Meter.Int64Counter` + - The `UpDownCounter` method is replaced by `Meter.Int64UpDownCounter` + - The `Histogram` method is replaced by `Meter.Int64Histogram` +- The `InstrumentProvider` from `go.opentelemetry.io/otel/sdk/metric/syncfloat64` is removed. + Use the new creation methods of the `Meter` in `go.opentelemetry.io/otel/sdk/metric` instead. (#3530) + - The `Counter` method is replaced by `Meter.Float64Counter` + - The `UpDownCounter` method is replaced by `Meter.Float64UpDownCounter` + - The `Histogram` method is replaced by `Meter.Float64Histogram` + +## [1.11.2/0.34.0] 2022-12-05 + +### Added + +- The `WithView` `Option` is added to the `go.opentelemetry.io/otel/sdk/metric` package. + This option is used to configure the view(s) a `MeterProvider` will use for all `Reader`s that are registered with it. (#3387) +- Add Instrumentation Scope and Version as info metric and label in Prometheus exporter. + This can be disabled using the `WithoutScopeInfo()` option added to that package.(#3273, #3357) +- OTLP exporters now recognize: (#3363) + - `OTEL_EXPORTER_OTLP_INSECURE` + - `OTEL_EXPORTER_OTLP_TRACES_INSECURE` + - `OTEL_EXPORTER_OTLP_METRICS_INSECURE` + - `OTEL_EXPORTER_OTLP_CLIENT_KEY` + - `OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY` + - `OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY` + - `OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE` + - `OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE` + - `OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE` +- The `View` type and related `NewView` function to create a view according to the OpenTelemetry specification are added to `go.opentelemetry.io/otel/sdk/metric`. + These additions are replacements for the `View` type and `New` function from `go.opentelemetry.io/otel/sdk/metric/view`. (#3459) +- The `Instrument` and `InstrumentKind` type are added to `go.opentelemetry.io/otel/sdk/metric`. + These additions are replacements for the `Instrument` and `InstrumentKind` types from `go.opentelemetry.io/otel/sdk/metric/view`. (#3459) +- The `Stream` type is added to `go.opentelemetry.io/otel/sdk/metric` to define a metric data stream a view will produce. (#3459) +- The `AssertHasAttributes` allows instrument authors to test that datapoints returned have appropriate attributes. (#3487) + +### Changed + +- The `"go.opentelemetry.io/otel/sdk/metric".WithReader` option no longer accepts views to associate with the `Reader`. + Instead, views are now registered directly with the `MeterProvider` via the new `WithView` option. + The views registered with the `MeterProvider` apply to all `Reader`s. (#3387) +- The `Temporality(view.InstrumentKind) metricdata.Temporality` and `Aggregation(view.InstrumentKind) aggregation.Aggregation` methods are added to the `"go.opentelemetry.io/otel/sdk/metric".Exporter` interface. (#3260) +- The `Temporality(view.InstrumentKind) metricdata.Temporality` and `Aggregation(view.InstrumentKind) aggregation.Aggregation` methods are added to the `"go.opentelemetry.io/otel/exporters/otlp/otlpmetric".Client` interface. (#3260) +- The `WithTemporalitySelector` and `WithAggregationSelector` `ReaderOption`s have been changed to `ManualReaderOption`s in the `go.opentelemetry.io/otel/sdk/metric` package. (#3260) +- The periodic reader in the `go.opentelemetry.io/otel/sdk/metric` package now uses the temporality and aggregation selectors from its configured exporter instead of accepting them as options. (#3260) + +### Fixed + +- The `go.opentelemetry.io/otel/exporters/prometheus` exporter fixes duplicated `_total` suffixes. (#3369) +- Remove comparable requirement for `Reader`s. (#3387) +- Cumulative metrics from the OpenCensus bridge (`go.opentelemetry.io/otel/bridge/opencensus`) are defined as monotonic sums, instead of non-monotonic. (#3389) +- Asynchronous counters (`Counter` and `UpDownCounter`) from the metric SDK now produce delta sums when configured with delta temporality. (#3398) +- Exported `Status` codes in the `go.opentelemetry.io/otel/exporters/zipkin` exporter are now exported as all upper case values. (#3340) +- `Aggregation`s from `go.opentelemetry.io/otel/sdk/metric` with no data are not exported. (#3394, #3436) +- Reenabled Attribute Filters in the Metric SDK. (#3396) +- Asynchronous callbacks are only called if they are registered with at least one instrument that does not use drop aggragation. (#3408) +- Do not report empty partial-success responses in the `go.opentelemetry.io/otel/exporters/otlp` exporters. (#3438, #3432) +- Handle partial success responses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` exporters. (#3162, #3440) +- Prevent duplicate Prometheus description, unit, and type. (#3469) +- Prevents panic when using incorrect `attribute.Value.As[Type]Slice()`. (#3489) + +### Removed + +- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric.Client` interface is removed. (#3486) +- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric.New` function is removed. Use the `otlpmetric[http|grpc].New` directly. (#3486) + +### Deprecated + +- The `go.opentelemetry.io/otel/sdk/metric/view` package is deprecated. + Use `Instrument`, `InstrumentKind`, `View`, and `NewView` in `go.opentelemetry.io/otel/sdk/metric` instead. (#3476) + +## [1.11.1/0.33.0] 2022-10-19 + +### Added + +- The Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus` registers with a Prometheus registerer on creation. + By default, it will register with the default Prometheus registerer. + A non-default registerer can be used by passing the `WithRegisterer` option. (#3239) +- Added the `WithAggregationSelector` option to the `go.opentelemetry.io/otel/exporters/prometheus` package to change the default `AggregationSelector` used. (#3341) +- The Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus` converts the `Resource` associated with metric exports into a `target_info` metric. (#3285) + +### Changed + +- The `"go.opentelemetry.io/otel/exporters/prometheus".New` function is updated to return an error. + It will return an error if the exporter fails to register with Prometheus. (#3239) + +### Fixed + +- The URL-encoded values from the `OTEL_RESOURCE_ATTRIBUTES` environment variable are decoded. (#2963) +- The `baggage.NewMember` function decodes the `value` parameter instead of directly using it. + This fixes the implementation to be compliant with the W3C specification. (#3226) +- Slice attributes of the `attribute` package are now comparable based on their value, not instance. (#3108 #3252) +- The `Shutdown` and `ForceFlush` methods of the `"go.opentelemetry.io/otel/sdk/trace".TraceProvider` no longer return an error when no processor is registered. (#3268) +- The Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus` cumulatively sums histogram buckets. (#3281) +- The sum of each histogram data point is now uniquely exported by the `go.opentelemetry.io/otel/exporters/otlpmetric` exporters. (#3284, #3293) +- Recorded values for asynchronous counters (`Counter` and `UpDownCounter`) are interpreted as exact, not incremental, sum values by the metric SDK. (#3350, #3278) +- `UpDownCounters` are now correctly output as Prometheus gauges in the `go.opentelemetry.io/otel/exporters/prometheus` exporter. (#3358) +- The Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus` no longer describes the metrics it will send to Prometheus on startup. + Instead the exporter is defined as an "unchecked" collector for Prometheus. + This fixes the `reader is not registered` warning currently emitted on startup. (#3291 #3342) +- The `go.opentelemetry.io/otel/exporters/prometheus` exporter now correctly adds `_total` suffixes to counter metrics. (#3360) +- The `go.opentelemetry.io/otel/exporters/prometheus` exporter now adds a unit suffix to metric names. + This can be disabled using the `WithoutUnits()` option added to that package. (#3352) + ## [1.11.0/0.32.3] 2022-10-12 ### Added @@ -31,6 +339,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Flush pending measurements with the `PeriodicReader` in the `go.opentelemetry.io/otel/sdk/metric` when `ForceFlush` or `Shutdown` are called. (#3220) - Update histogram default bounds to match the requirements of the latest specification. (#3222) +- Encode the HTTP status code in the OpenTracing bridge (`go.opentelemetry.io/otel/bridge/opentracing`) as an integer. (#3265) ### Fixed @@ -1993,7 +2302,12 @@ It contains api and sdk for trace and meter. - CircleCI build CI manifest files. - CODEOWNERS file to track owners of this project. -[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.11.0...HEAD +[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.14.0...HEAD +[1.14.0/0.37.0/0.0.4]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.14.0 +[1.13.0/0.36.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.13.0 +[1.12.0/0.35.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.12.0 +[1.11.2/0.34.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.11.2 +[1.11.1/0.33.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.11.1 [1.11.0/0.32.3]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.11.0 [0.32.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/sdk/metric/v0.32.2 [0.32.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/sdk/metric/v0.32.1 @@ -2049,3 +2363,7 @@ It contains api and sdk for trace and meter. [0.1.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v0.1.2 [0.1.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v0.1.1 [0.1.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v0.1.0 + +[Go 1.20]: https://go.dev/doc/go1.20 +[Go 1.19]: https://go.dev/doc/go1.19 +[Go 1.18]: https://go.dev/doc/go1.18 diff --git a/tools/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md b/tools/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md index 9371a481a..a6928bfdf 100644 --- a/tools/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md +++ b/tools/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md @@ -508,7 +508,7 @@ Approvers: - [David Ashpole](https://github.com/dashpole), Google - [Robert PajÄ…k](https://github.com/pellared), Splunk - [Chester Cheung](https://github.com/hanyuancheung), Tencent -- [Damien Mathieu](https://github.com/dmathieu), Auth0/Okta +- [Damien Mathieu](https://github.com/dmathieu), Elastic Maintainers: diff --git a/tools/vendor/go.opentelemetry.io/otel/Makefile b/tools/vendor/go.opentelemetry.io/otel/Makefile index 07e31965c..0e6ffa284 100644 --- a/tools/vendor/go.opentelemetry.io/otel/Makefile +++ b/tools/vendor/go.opentelemetry.io/otel/Makefile @@ -17,7 +17,7 @@ TOOLS_MOD_DIR := ./internal/tools ALL_DOCS := $(shell find . -name '*.md' -type f | sort) ALL_GO_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | sort) OTEL_GO_MOD_DIRS := $(filter-out $(TOOLS_MOD_DIR), $(ALL_GO_MOD_DIRS)) -ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example|^$(TOOLS_MOD_DIR)' | sort) +ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | grep -E -v '^./example|^$(TOOLS_MOD_DIR)' | sort) GO = go TIMEOUT = 60 @@ -208,11 +208,12 @@ check-clean-work-tree: SEMCONVPKG ?= "semconv/" .PHONY: semconv-generate semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT) - @[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 ) - @[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 ) - @$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/trace" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" - @$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/resource" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" - @$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)" + [ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 ) + [ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 ) + $(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=span -p conventionType=trace -f trace.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" + $(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" + $(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=resource -p conventionType=resource -f resource.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)" + $(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)" .PHONY: prerelease prerelease: | $(MULTIMOD) diff --git a/tools/vendor/go.opentelemetry.io/otel/README.md b/tools/vendor/go.opentelemetry.io/otel/README.md index 1b2ee21fb..878d87e58 100644 --- a/tools/vendor/go.opentelemetry.io/otel/README.md +++ b/tools/vendor/go.opentelemetry.io/otel/README.md @@ -50,14 +50,19 @@ Currently, this project supports the following environments. | OS | Go Version | Architecture | | ------- | ---------- | ------------ | +| Ubuntu | 1.20 | amd64 | | Ubuntu | 1.19 | amd64 | | Ubuntu | 1.18 | amd64 | +| Ubuntu | 1.20 | 386 | | Ubuntu | 1.19 | 386 | | Ubuntu | 1.18 | 386 | +| MacOS | 1.20 | amd64 | | MacOS | 1.19 | amd64 | | MacOS | 1.18 | amd64 | +| Windows | 1.20 | amd64 | | Windows | 1.19 | amd64 | | Windows | 1.18 | amd64 | +| Windows | 1.20 | 386 | | Windows | 1.19 | 386 | | Windows | 1.18 | 386 | diff --git a/tools/vendor/go.opentelemetry.io/otel/RELEASING.md b/tools/vendor/go.opentelemetry.io/otel/RELEASING.md index 71e576254..77d56c936 100644 --- a/tools/vendor/go.opentelemetry.io/otel/RELEASING.md +++ b/tools/vendor/go.opentelemetry.io/otel/RELEASING.md @@ -6,20 +6,25 @@ New versions of the [OpenTelemetry specification] mean new versions of the `semc The `semconv-generate` make target is used for this. 1. Checkout a local copy of the [OpenTelemetry specification] to the desired release tag. -2. Run the `make semconv-generate ...` target from this repository. +2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest` +3. Run the `make semconv-generate ...` target from this repository. For example, ```sh -export TAG="v1.7.0" # Change to the release version you are generating. +export TAG="v1.13.0" # Change to the release version you are generating. export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification" -git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG" +git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG" -b "$TAG" +docker pull otel/semconvgen:latest make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO. ``` This should create a new sub-package of [`semconv`](./semconv). Ensure things look correct before submitting a pull request to include the addition. +**Note**, the generation code was changed to generate versions >= 1.13. +To generate versions prior to this, checkout the old release of this repository (i.e. [2fe8861](https://github.com/open-telemetry/opentelemetry-go/commit/2fe8861a24e20088c065b116089862caf9e3cd8b)). + ## Pre-Release First, decide which module sets will be released and update their versions diff --git a/tools/vendor/go.opentelemetry.io/otel/attribute/value.go b/tools/vendor/go.opentelemetry.io/otel/attribute/value.go index 57899f682..cb21dd5c0 100644 --- a/tools/vendor/go.opentelemetry.io/otel/attribute/value.go +++ b/tools/vendor/go.opentelemetry.io/otel/attribute/value.go @@ -17,9 +17,11 @@ package attribute // import "go.opentelemetry.io/otel/attribute" import ( "encoding/json" "fmt" + "reflect" "strconv" "go.opentelemetry.io/otel/internal" + "go.opentelemetry.io/otel/internal/attribute" ) //go:generate stringer -type=Type @@ -66,12 +68,7 @@ func BoolValue(v bool) Value { // BoolSliceValue creates a BOOLSLICE Value. func BoolSliceValue(v []bool) Value { - cp := make([]bool, len(v)) - copy(cp, v) - return Value{ - vtype: BOOLSLICE, - slice: &cp, - } + return Value{vtype: BOOLSLICE, slice: attribute.BoolSliceValue(v)} } // IntValue creates an INT64 Value. @@ -81,13 +78,14 @@ func IntValue(v int) Value { // IntSliceValue creates an INTSLICE Value. func IntSliceValue(v []int) Value { - cp := make([]int64, 0, len(v)) - for _, i := range v { - cp = append(cp, int64(i)) + var int64Val int64 + cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(int64Val))) + for i, val := range v { + cp.Elem().Index(i).SetInt(int64(val)) } return Value{ vtype: INT64SLICE, - slice: &cp, + slice: cp.Elem().Interface(), } } @@ -101,12 +99,7 @@ func Int64Value(v int64) Value { // Int64SliceValue creates an INT64SLICE Value. func Int64SliceValue(v []int64) Value { - cp := make([]int64, len(v)) - copy(cp, v) - return Value{ - vtype: INT64SLICE, - slice: &cp, - } + return Value{vtype: INT64SLICE, slice: attribute.Int64SliceValue(v)} } // Float64Value creates a FLOAT64 Value. @@ -119,12 +112,7 @@ func Float64Value(v float64) Value { // Float64SliceValue creates a FLOAT64SLICE Value. func Float64SliceValue(v []float64) Value { - cp := make([]float64, len(v)) - copy(cp, v) - return Value{ - vtype: FLOAT64SLICE, - slice: &cp, - } + return Value{vtype: FLOAT64SLICE, slice: attribute.Float64SliceValue(v)} } // StringValue creates a STRING Value. @@ -137,12 +125,7 @@ func StringValue(v string) Value { // StringSliceValue creates a STRINGSLICE Value. func StringSliceValue(v []string) Value { - cp := make([]string, len(v)) - copy(cp, v) - return Value{ - vtype: STRINGSLICE, - slice: &cp, - } + return Value{vtype: STRINGSLICE, slice: attribute.StringSliceValue(v)} } // Type returns a type of the Value. @@ -159,10 +142,14 @@ func (v Value) AsBool() bool { // AsBoolSlice returns the []bool value. Make sure that the Value's type is // BOOLSLICE. func (v Value) AsBoolSlice() []bool { - if s, ok := v.slice.(*[]bool); ok { - return *s + if v.vtype != BOOLSLICE { + return nil } - return nil + return v.asBoolSlice() +} + +func (v Value) asBoolSlice() []bool { + return attribute.AsBoolSlice(v.slice) } // AsInt64 returns the int64 value. Make sure that the Value's type is @@ -174,10 +161,14 @@ func (v Value) AsInt64() int64 { // AsInt64Slice returns the []int64 value. Make sure that the Value's type is // INT64SLICE. func (v Value) AsInt64Slice() []int64 { - if s, ok := v.slice.(*[]int64); ok { - return *s + if v.vtype != INT64SLICE { + return nil } - return nil + return v.asInt64Slice() +} + +func (v Value) asInt64Slice() []int64 { + return attribute.AsInt64Slice(v.slice) } // AsFloat64 returns the float64 value. Make sure that the Value's @@ -189,10 +180,14 @@ func (v Value) AsFloat64() float64 { // AsFloat64Slice returns the []float64 value. Make sure that the Value's type is // FLOAT64SLICE. func (v Value) AsFloat64Slice() []float64 { - if s, ok := v.slice.(*[]float64); ok { - return *s + if v.vtype != FLOAT64SLICE { + return nil } - return nil + return v.asFloat64Slice() +} + +func (v Value) asFloat64Slice() []float64 { + return attribute.AsFloat64Slice(v.slice) } // AsString returns the string value. Make sure that the Value's type @@ -204,10 +199,14 @@ func (v Value) AsString() string { // AsStringSlice returns the []string value. Make sure that the Value's type is // STRINGSLICE. func (v Value) AsStringSlice() []string { - if s, ok := v.slice.(*[]string); ok { - return *s + if v.vtype != STRINGSLICE { + return nil } - return nil + return v.asStringSlice() +} + +func (v Value) asStringSlice() []string { + return attribute.AsStringSlice(v.slice) } type unknownValueType struct{} @@ -218,19 +217,19 @@ func (v Value) AsInterface() interface{} { case BOOL: return v.AsBool() case BOOLSLICE: - return v.AsBoolSlice() + return v.asBoolSlice() case INT64: return v.AsInt64() case INT64SLICE: - return v.AsInt64Slice() + return v.asInt64Slice() case FLOAT64: return v.AsFloat64() case FLOAT64SLICE: - return v.AsFloat64Slice() + return v.asFloat64Slice() case STRING: return v.stringly case STRINGSLICE: - return v.AsStringSlice() + return v.asStringSlice() } return unknownValueType{} } @@ -239,19 +238,19 @@ func (v Value) AsInterface() interface{} { func (v Value) Emit() string { switch v.Type() { case BOOLSLICE: - return fmt.Sprint(*(v.slice.(*[]bool))) + return fmt.Sprint(v.asBoolSlice()) case BOOL: return strconv.FormatBool(v.AsBool()) case INT64SLICE: - return fmt.Sprint(*(v.slice.(*[]int64))) + return fmt.Sprint(v.asInt64Slice()) case INT64: return strconv.FormatInt(v.AsInt64(), 10) case FLOAT64SLICE: - return fmt.Sprint(*(v.slice.(*[]float64))) + return fmt.Sprint(v.asFloat64Slice()) case FLOAT64: return fmt.Sprint(v.AsFloat64()) case STRINGSLICE: - return fmt.Sprint(*(v.slice.(*[]string))) + return fmt.Sprint(v.asStringSlice()) case STRING: return v.stringly default: diff --git a/tools/vendor/go.opentelemetry.io/otel/baggage/baggage.go b/tools/vendor/go.opentelemetry.io/otel/baggage/baggage.go index 9869fa843..a36db8f8d 100644 --- a/tools/vendor/go.opentelemetry.io/otel/baggage/baggage.go +++ b/tools/vendor/go.opentelemetry.io/otel/baggage/baggage.go @@ -250,8 +250,9 @@ type Member struct { hasData bool } -// NewMember returns a new Member from the passed arguments. An error is -// returned if the created Member would be invalid according to the W3C +// NewMember returns a new Member from the passed arguments. The key will be +// used directly while the value will be url decoded after validation. An error +// is returned if the created Member would be invalid according to the W3C // Baggage specification. func NewMember(key, value string, props ...Property) (Member, error) { m := Member{ @@ -263,7 +264,11 @@ func NewMember(key, value string, props ...Property) (Member, error) { if err := m.validate(); err != nil { return newInvalidMember(), err } - + decodedValue, err := url.QueryUnescape(value) + if err != nil { + return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value) + } + m.value = decodedValue return m, nil } @@ -328,8 +333,9 @@ func parseMember(member string) (Member, error) { return Member{key: key, value: value, properties: props, hasData: true}, nil } -// validate ensures m conforms to the W3C Baggage specification, returning an -// error otherwise. +// validate ensures m conforms to the W3C Baggage specification. +// A key is just an ASCII string, but a value must be URL encoded UTF-8, +// returning an error otherwise. func (m Member) validate() error { if !m.hasData { return fmt.Errorf("%w: %q", errInvalidMember, m) diff --git a/tools/vendor/go.opentelemetry.io/otel/codes/codes.go b/tools/vendor/go.opentelemetry.io/otel/codes/codes.go index 064a9279f..587ebae4e 100644 --- a/tools/vendor/go.opentelemetry.io/otel/codes/codes.go +++ b/tools/vendor/go.opentelemetry.io/otel/codes/codes.go @@ -23,10 +23,20 @@ import ( const ( // Unset is the default status code. Unset Code = 0 + // Error indicates the operation contains an error. + // + // NOTE: The error code in OTLP is 2. + // The value of this enum is only relevant to the internals + // of the Go SDK. Error Code = 1 + // Ok indicates operation has been validated by an Application developers // or Operator to have completed successfully, or contain no error. + // + // NOTE: The Ok code in OTLP is 1. + // The value of this enum is only relevant to the internals + // of the Go SDK. Ok Code = 2 maxCode = 3 diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go index 67003c4a2..53ff3126b 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go @@ -23,6 +23,8 @@ import ( "strconv" "strings" "time" + + "go.opentelemetry.io/otel/internal/global" ) // ConfigFn is the generic function used to set a config. @@ -59,13 +61,26 @@ func WithString(n string, fn func(string)) func(e *EnvOptionsReader) { } } +// WithBool returns a ConfigFn that reads the environment variable n and if it exists passes its parsed bool value to fn. +func WithBool(n string, fn func(bool)) ConfigFn { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + b := strings.ToLower(v) == "true" + fn(b) + } + } +} + // WithDuration retrieves the specified config and passes it to ConfigFn as a duration. func WithDuration(n string, fn func(time.Duration)) func(e *EnvOptionsReader) { return func(e *EnvOptionsReader) { if v, ok := e.GetEnvValue(n); ok { - if d, err := strconv.Atoi(v); err == nil { - fn(time.Duration(d) * time.Millisecond) + d, err := strconv.Atoi(v) + if err != nil { + global.Error(err, "parse duration", "input", v) + return } + fn(time.Duration(d) * time.Millisecond) } } } @@ -83,23 +98,59 @@ func WithHeaders(n string, fn func(map[string]string)) func(e *EnvOptionsReader) func WithURL(n string, fn func(*url.URL)) func(e *EnvOptionsReader) { return func(e *EnvOptionsReader) { if v, ok := e.GetEnvValue(n); ok { - if u, err := url.Parse(v); err == nil { - fn(u) + u, err := url.Parse(v) + if err != nil { + global.Error(err, "parse url", "input", v) + return } + fn(u) } } } -// WithTLSConfig retrieves the specified config and passes it to ConfigFn as a crypto/tls.Config. -func WithTLSConfig(n string, fn func(*tls.Config)) func(e *EnvOptionsReader) { +// WithCertPool returns a ConfigFn that reads the environment variable n as a filepath to a TLS certificate pool. If it exists, it is parsed as a crypto/x509.CertPool and it is passed to fn. +func WithCertPool(n string, fn func(*x509.CertPool)) ConfigFn { return func(e *EnvOptionsReader) { if v, ok := e.GetEnvValue(n); ok { - if b, err := e.ReadFile(v); err == nil { - if c, err := createTLSConfig(b); err == nil { - fn(c) - } + b, err := e.ReadFile(v) + if err != nil { + global.Error(err, "read tls ca cert file", "file", v) + return + } + c, err := createCertPool(b) + if err != nil { + global.Error(err, "create tls cert pool") + return } + fn(c) + } + } +} + +// WithClientCert returns a ConfigFn that reads the environment variable nc and nk as filepaths to a client certificate and key pair. If they exists, they are parsed as a crypto/tls.Certificate and it is passed to fn. +func WithClientCert(nc, nk string, fn func(tls.Certificate)) ConfigFn { + return func(e *EnvOptionsReader) { + vc, okc := e.GetEnvValue(nc) + vk, okk := e.GetEnvValue(nk) + if !okc || !okk { + return + } + cert, err := e.ReadFile(vc) + if err != nil { + global.Error(err, "read tls client cert", "file", vc) + return } + key, err := e.ReadFile(vk) + if err != nil { + global.Error(err, "read tls client key", "file", vk) + return + } + crt, err := tls.X509KeyPair(cert, key) + if err != nil { + global.Error(err, "create tls client key pair") + return + } + fn(crt) } } @@ -117,15 +168,18 @@ func stringToHeader(value string) map[string]string { for _, header := range headersPairs { nameValue := strings.SplitN(header, "=", 2) if len(nameValue) < 2 { + global.Error(errors.New("missing '="), "parse headers", "input", nameValue) continue } name, err := url.QueryUnescape(nameValue[0]) if err != nil { + global.Error(err, "escape header key", "key", nameValue[0]) continue } trimmedName := strings.TrimSpace(name) value, err := url.QueryUnescape(nameValue[1]) if err != nil { + global.Error(err, "escape header value", "value", nameValue[1]) continue } trimmedValue := strings.TrimSpace(value) @@ -136,13 +190,10 @@ func stringToHeader(value string) map[string]string { return headers } -func createTLSConfig(certBytes []byte) (*tls.Config, error) { +func createCertPool(certBytes []byte) (*x509.CertPool, error) { cp := x509.NewCertPool() if ok := cp.AppendCertsFromPEM(certBytes); !ok { return nil, errors.New("failed to append certificate to the cert pool") } - - return &tls.Config{ - RootCAs: cp, - }, nil + return cp, nil } diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/partialsuccess.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/partialsuccess.go index 7994706ab..9ab89b375 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/partialsuccess.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/partialsuccess.go @@ -16,19 +16,6 @@ package internal // import "go.opentelemetry.io/otel/exporters/otlp/internal" import "fmt" -// PartialSuccessDropKind indicates the kind of partial success error -// received by an OTLP exporter, which corresponds with the signal -// being exported. -type PartialSuccessDropKind string - -const ( - // TracingPartialSuccess indicates that some spans were rejected. - TracingPartialSuccess PartialSuccessDropKind = "spans" - - // MetricsPartialSuccess indicates that some metric data points were rejected. - MetricsPartialSuccess PartialSuccessDropKind = "metric data points" -) - // PartialSuccess represents the underlying error for all handling // OTLP partial success messages. Use `errors.Is(err, // PartialSuccess{})` to test whether an error passed to the OTel @@ -36,7 +23,7 @@ const ( type PartialSuccess struct { ErrorMessage string RejectedItems int64 - RejectedKind PartialSuccessDropKind + RejectedKind string } var _ error = PartialSuccess{} @@ -56,13 +43,22 @@ func (ps PartialSuccess) Is(err error) bool { return ok } -// PartialSuccessToError produces an error suitable for passing to -// `otel.Handle()` out of the fields in a partial success response, -// independent of which signal produced the outcome. -func PartialSuccessToError(kind PartialSuccessDropKind, itemsRejected int64, errorMessage string) error { +// TracePartialSuccessError returns an error describing a partial success +// response for the trace signal. +func TracePartialSuccessError(itemsRejected int64, errorMessage string) error { + return PartialSuccess{ + ErrorMessage: errorMessage, + RejectedItems: itemsRejected, + RejectedKind: "spans", + } +} + +// MetricPartialSuccessError returns an error describing a partial success +// response for the metric signal. +func MetricPartialSuccessError(itemsRejected int64, errorMessage string) error { return PartialSuccess{ ErrorMessage: errorMessage, RejectedItems: itemsRejected, - RejectedKind: kind, + RejectedKind: "metric data points", } } diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/retry.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/retry.go index 3d43f7aea..7e1b0055a 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/retry.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/retry.go @@ -76,21 +76,21 @@ func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { } } - // Do not use NewExponentialBackOff since it calls Reset and the code here - // must call Reset after changing the InitialInterval (this saves an - // unnecessary call to Now). - b := &backoff.ExponentialBackOff{ - InitialInterval: c.InitialInterval, - RandomizationFactor: backoff.DefaultRandomizationFactor, - Multiplier: backoff.DefaultMultiplier, - MaxInterval: c.MaxInterval, - MaxElapsedTime: c.MaxElapsedTime, - Stop: backoff.Stop, - Clock: backoff.SystemClock, - } - b.Reset() - return func(ctx context.Context, fn func(context.Context) error) error { + // Do not use NewExponentialBackOff since it calls Reset and the code here + // must call Reset after changing the InitialInterval (this saves an + // unnecessary call to Now). + b := &backoff.ExponentialBackOff{ + InitialInterval: c.InitialInterval, + RandomizationFactor: backoff.DefaultRandomizationFactor, + Multiplier: backoff.DefaultMultiplier, + MaxInterval: c.MaxInterval, + MaxElapsedTime: c.MaxElapsedTime, + Stop: backoff.Stop, + Clock: backoff.SystemClock, + } + b.Reset() + for { err := fn(ctx) if err == nil { @@ -119,8 +119,8 @@ func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { delay = throttle } - if err := waitFunc(ctx, delay); err != nil { - return err + if ctxErr := waitFunc(ctx, delay); ctxErr != nil { + return fmt.Errorf("%w: %s", ctxErr, err) } } } @@ -129,6 +129,9 @@ func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { // Allow override for testing. var waitFunc = wait +// wait takes the caller's context, and the amount of time to wait. It will +// return nil if the timer fires before or at the same time as the context's +// deadline. This indicates that the call can be retried. func wait(ctx context.Context, delay time.Duration) error { timer := time.NewTimer(delay) defer timer.Stop() diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/wrappederror.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/wrappederror.go new file mode 100644 index 000000000..217751da5 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/internal/wrappederror.go @@ -0,0 +1,61 @@ +// Copyright The OpenTelemetry 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 "go.opentelemetry.io/otel/exporters/otlp/internal" + +// ErrorKind is used to identify the kind of export error +// being wrapped. +type ErrorKind int + +const ( + // TracesExport indicates the error comes from the OTLP trace exporter. + TracesExport ErrorKind = iota +) + +// prefix returns a prefix for the Error() string. +func (k ErrorKind) prefix() string { + switch k { + case TracesExport: + return "traces export: " + default: + return "unknown: " + } +} + +// wrappedExportError wraps an OTLP exporter error with the kind of +// signal that produced it. +type wrappedExportError struct { + wrap error + kind ErrorKind +} + +// WrapTracesError wraps an error from the OTLP exporter for traces. +func WrapTracesError(err error) error { + return wrappedExportError{ + wrap: err, + kind: TracesExport, + } +} + +var _ error = wrappedExportError{} + +// Error attaches a prefix corresponding to the kind of exporter. +func (t wrappedExportError) Error() string { + return t.kind.prefix() + t.wrap.Error() +} + +// Unwrap returns the wrapped error. +func (t wrappedExportError) Unwrap() error { + return t.wrap +} diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md index ca91fd4f4..6e9cc0366 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md @@ -12,8 +12,8 @@ go get -u go.opentelemetry.io/otel/exporters/otlp/otlptrace ## Examples -- [Exporter setup and examples](./otlptracehttp/example_test.go) -- [Full example sending telemetry to a local collector](../../../example/otel-collector) +- [HTTP Exporter setup and examples](./otlptracehttp/example_test.go) +- [Full example of gRPC Exporter sending telemetry to a local collector](../../../example/otel-collector) ## [`otlptrace`](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace) diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go index c5ee6c098..b65802edb 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go @@ -19,6 +19,7 @@ import ( "errors" "sync" + "go.opentelemetry.io/otel/exporters/otlp/internal" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" tracesdk "go.opentelemetry.io/otel/sdk/trace" ) @@ -45,7 +46,11 @@ func (e *Exporter) ExportSpans(ctx context.Context, ss []tracesdk.ReadOnlySpan) return nil } - return e.client.UploadTraces(ctx, protoSpans) + err := e.client.UploadTraces(ctx, protoSpans) + if err != nil { + return internal.WrapTracesError(err) + } + return nil } // Start establishes a connection to the receiving endpoint. diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go index b29f618e3..62c5029db 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go @@ -16,6 +16,7 @@ package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/ import ( "crypto/tls" + "crypto/x509" "net/url" "os" "path" @@ -53,6 +54,7 @@ func ApplyHTTPEnvConfigs(cfg Config) Config { func getOptionsFromEnv() []GenericOption { opts := []GenericOption{} + tlsConf := &tls.Config{} DefaultEnvOptionsReader.Apply( envconfig.WithURL("ENDPOINT", func(u *url.URL) { opts = append(opts, withEndpointScheme(u)) @@ -81,8 +83,13 @@ func getOptionsFromEnv() []GenericOption { return cfg }, withEndpointForGRPC(u))) }), - envconfig.WithTLSConfig("CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), - envconfig.WithTLSConfig("TRACES_CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), + envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }), + envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }), + envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }), + envconfig.WithClientCert("TRACES_CLIENT_CERTIFICATE", "TRACES_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }), + withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), + envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }), + envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }), envconfig.WithHeaders("HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), envconfig.WithHeaders("TRACES_HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), WithEnvCompression("COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }), @@ -125,3 +132,19 @@ func WithEnvCompression(n string, fn func(Compression)) func(e *envconfig.EnvOpt } } } + +// revive:disable-next-line:flag-parameter +func withInsecure(b bool) GenericOption { + if b { + return WithInsecure() + } + return WithSecure() +} + +func withTLSConfig(c *tls.Config, fn func(*tls.Config)) func(e *envconfig.EnvOptionsReader) { + return func(e *envconfig.EnvOptionsReader) { + if c.RootCAs != nil || len(c.Certificates) > 0 { + fn(c) + } + } +} diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go index 56e83b853..c48ffd530 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go @@ -97,6 +97,7 @@ func NewGRPCConfig(opts ...GRPCOption) Config { Timeout: DefaultTimeout, }, RetryConfig: retry.DefaultConfig, + DialOptions: []grpc.DialOption{grpc.WithUserAgent(internal.GetUserAgentHeader())}, } cfg = ApplyGRPCEnvConfigs(cfg) for _, opt := range opts { diff --git a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go index 9d6e1898b..fe23f8e37 100644 --- a/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go +++ b/tools/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go @@ -202,11 +202,12 @@ func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc ResourceSpans: protoSpans, }) if resp != nil && resp.PartialSuccess != nil { - otel.Handle(internal.PartialSuccessToError( - internal.TracingPartialSuccess, - resp.PartialSuccess.RejectedSpans, - resp.PartialSuccess.ErrorMessage, - )) + msg := resp.PartialSuccess.GetErrorMessage() + n := resp.PartialSuccess.GetRejectedSpans() + if n != 0 || msg != "" { + err := internal.TracePartialSuccessError(n, msg) + otel.Handle(err) + } } // nil is converted to OK. if status.Code(err) == codes.OK { diff --git a/tools/vendor/go.opentelemetry.io/otel/handler.go b/tools/vendor/go.opentelemetry.io/otel/handler.go index 36cf09f72..ecd363ab5 100644 --- a/tools/vendor/go.opentelemetry.io/otel/handler.go +++ b/tools/vendor/go.opentelemetry.io/otel/handler.go @@ -17,7 +17,8 @@ package otel // import "go.opentelemetry.io/otel" import ( "log" "os" - "sync" + "sync/atomic" + "unsafe" ) var ( @@ -34,28 +35,26 @@ var ( ) type delegator struct { - lock *sync.RWMutex - eh ErrorHandler + delegate unsafe.Pointer } func (d *delegator) Handle(err error) { - d.lock.RLock() - defer d.lock.RUnlock() - d.eh.Handle(err) + d.getDelegate().Handle(err) +} + +func (d *delegator) getDelegate() ErrorHandler { + return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate)) } // setDelegate sets the ErrorHandler delegate. func (d *delegator) setDelegate(eh ErrorHandler) { - d.lock.Lock() - defer d.lock.Unlock() - d.eh = eh + atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh)) } func defaultErrorHandler() *delegator { - return &delegator{ - lock: &sync.RWMutex{}, - eh: &errLogger{l: log.New(os.Stderr, "", log.LstdFlags)}, - } + d := &delegator{} + d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)}) + return d } // errLogger logs errors if no delegate is set, otherwise they are delegated. diff --git a/tools/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go b/tools/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go new file mode 100644 index 000000000..622c3ee3f --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go @@ -0,0 +1,111 @@ +// Copyright The OpenTelemetry 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 attribute provide several helper functions for some commonly used +logic of processing attributes. +*/ +package attribute // import "go.opentelemetry.io/otel/internal/attribute" + +import ( + "reflect" +) + +// BoolSliceValue converts a bool slice into an array with same elements as slice. +func BoolSliceValue(v []bool) interface{} { + var zero bool + cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))) + copy(cp.Elem().Slice(0, len(v)).Interface().([]bool), v) + return cp.Elem().Interface() +} + +// Int64SliceValue converts an int64 slice into an array with same elements as slice. +func Int64SliceValue(v []int64) interface{} { + var zero int64 + cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))) + copy(cp.Elem().Slice(0, len(v)).Interface().([]int64), v) + return cp.Elem().Interface() +} + +// Float64SliceValue converts a float64 slice into an array with same elements as slice. +func Float64SliceValue(v []float64) interface{} { + var zero float64 + cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))) + copy(cp.Elem().Slice(0, len(v)).Interface().([]float64), v) + return cp.Elem().Interface() +} + +// StringSliceValue converts a string slice into an array with same elements as slice. +func StringSliceValue(v []string) interface{} { + var zero string + cp := reflect.New(reflect.ArrayOf(len(v), reflect.TypeOf(zero))) + copy(cp.Elem().Slice(0, len(v)).Interface().([]string), v) + return cp.Elem().Interface() +} + +// AsBoolSlice converts a bool array into a slice into with same elements as array. +func AsBoolSlice(v interface{}) []bool { + rv := reflect.ValueOf(v) + if rv.Type().Kind() != reflect.Array { + return nil + } + var zero bool + correctLen := rv.Len() + correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) + cpy := reflect.New(correctType) + _ = reflect.Copy(cpy.Elem(), rv) + return cpy.Elem().Slice(0, correctLen).Interface().([]bool) +} + +// AsInt64Slice converts an int64 array into a slice into with same elements as array. +func AsInt64Slice(v interface{}) []int64 { + rv := reflect.ValueOf(v) + if rv.Type().Kind() != reflect.Array { + return nil + } + var zero int64 + correctLen := rv.Len() + correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) + cpy := reflect.New(correctType) + _ = reflect.Copy(cpy.Elem(), rv) + return cpy.Elem().Slice(0, correctLen).Interface().([]int64) +} + +// AsFloat64Slice converts a float64 array into a slice into with same elements as array. +func AsFloat64Slice(v interface{}) []float64 { + rv := reflect.ValueOf(v) + if rv.Type().Kind() != reflect.Array { + return nil + } + var zero float64 + correctLen := rv.Len() + correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) + cpy := reflect.New(correctType) + _ = reflect.Copy(cpy.Elem(), rv) + return cpy.Elem().Slice(0, correctLen).Interface().([]float64) +} + +// AsStringSlice converts a string array into a slice into with same elements as array. +func AsStringSlice(v interface{}) []string { + rv := reflect.ValueOf(v) + if rv.Type().Kind() != reflect.Array { + return nil + } + var zero string + correctLen := rv.Len() + correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) + cpy := reflect.New(correctType) + _ = reflect.Copy(cpy.Elem(), rv) + return cpy.Elem().Slice(0, correctLen).Interface().([]string) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go b/tools/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go index ccb325871..293c08961 100644 --- a/tools/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go +++ b/tools/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go @@ -17,7 +17,8 @@ package global // import "go.opentelemetry.io/otel/internal/global" import ( "log" "os" - "sync" + "sync/atomic" + "unsafe" "github.com/go-logr/logr" "github.com/go-logr/stdr" @@ -27,37 +28,36 @@ import ( // // The default logger uses stdr which is backed by the standard `log.Logger` // interface. This logger will only show messages at the Error Level. -var globalLogger logr.Logger = stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)) -var globalLoggerLock = &sync.RWMutex{} +var globalLogger unsafe.Pointer + +func init() { + SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile))) +} // SetLogger overrides the globalLogger with l. // // To see Info messages use a logger with `l.V(1).Enabled() == true` // To see Debug messages use a logger with `l.V(5).Enabled() == true`. func SetLogger(l logr.Logger) { - globalLoggerLock.Lock() - defer globalLoggerLock.Unlock() - globalLogger = l + atomic.StorePointer(&globalLogger, unsafe.Pointer(&l)) +} + +func getLogger() logr.Logger { + return *(*logr.Logger)(atomic.LoadPointer(&globalLogger)) } // Info prints messages about the general state of the API or SDK. // This should usually be less then 5 messages a minute. func Info(msg string, keysAndValues ...interface{}) { - globalLoggerLock.RLock() - defer globalLoggerLock.RUnlock() - globalLogger.V(1).Info(msg, keysAndValues...) + getLogger().V(1).Info(msg, keysAndValues...) } // Error prints messages about exceptional states of the API or SDK. func Error(err error, msg string, keysAndValues ...interface{}) { - globalLoggerLock.RLock() - defer globalLoggerLock.RUnlock() - globalLogger.Error(err, msg, keysAndValues...) + getLogger().Error(err, msg, keysAndValues...) } // Debug prints messages about all internal changes in the API or SDK. func Debug(msg string, keysAndValues ...interface{}) { - globalLoggerLock.RLock() - defer globalLoggerLock.RUnlock() - globalLogger.V(5).Info(msg, keysAndValues...) + getLogger().V(5).Info(msg, keysAndValues...) } diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64.go new file mode 100644 index 000000000..2f624bfe0 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64.go @@ -0,0 +1,131 @@ +// Copyright The OpenTelemetry 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 instrument // import "go.opentelemetry.io/otel/metric/instrument" + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/unit" +) + +// Float64Observable describes a set of instruments used asynchronously to +// record float64 measurements once per collection cycle. Observations of +// these instruments are only made within a callback. +// +// Warning: methods may be added to this interface in minor releases. +type Float64Observable interface { + Asynchronous + + float64Observable() +} + +// Float64ObservableCounter is an instrument used to asynchronously record +// increasing float64 measurements once per collection cycle. Observations are +// only made within a callback for this instrument. The value observed is +// assumed the to be the cumulative sum of the count. +// +// Warning: methods may be added to this interface in minor releases. +type Float64ObservableCounter interface{ Float64Observable } + +// Float64ObservableUpDownCounter is an instrument used to asynchronously +// record float64 measurements once per collection cycle. Observations are only +// made within a callback for this instrument. The value observed is assumed +// the to be the cumulative sum of the count. +// +// Warning: methods may be added to this interface in minor releases. +type Float64ObservableUpDownCounter interface{ Float64Observable } + +// Float64ObservableGauge is an instrument used to asynchronously record +// instantaneous float64 measurements once per collection cycle. Observations +// are only made within a callback for this instrument. +// +// Warning: methods may be added to this interface in minor releases. +type Float64ObservableGauge interface{ Float64Observable } + +// Float64Observer is a recorder of float64 measurements. +// +// Warning: methods may be added to this interface in minor releases. +type Float64Observer interface { + Observe(value float64, attributes ...attribute.KeyValue) +} + +// Float64Callback is a function registered with a Meter that makes +// observations for a Float64Observerable instrument it is registered with. +// Calls to the Float64Observer record measurement values for the +// Float64Observable. +// +// The function needs to complete in a finite amount of time and the deadline +// of the passed context is expected to be honored. +// +// The function needs to make unique observations across all registered +// Float64Callbacks. Meaning, it should not report measurements with the same +// attributes as another Float64Callbacks also registered for the same +// instrument. +// +// The function needs to be concurrent safe. +type Float64Callback func(context.Context, Float64Observer) error + +// Float64ObserverConfig contains options for Asynchronous instruments that +// observe float64 values. +type Float64ObserverConfig struct { + description string + unit unit.Unit + callbacks []Float64Callback +} + +// NewFloat64ObserverConfig returns a new Float64ObserverConfig with all opts +// applied. +func NewFloat64ObserverConfig(opts ...Float64ObserverOption) Float64ObserverConfig { + var config Float64ObserverConfig + for _, o := range opts { + config = o.applyFloat64Observer(config) + } + return config +} + +// Description returns the Config description. +func (c Float64ObserverConfig) Description() string { + return c.description +} + +// Unit returns the Config unit. +func (c Float64ObserverConfig) Unit() unit.Unit { + return c.unit +} + +// Callbacks returns the Config callbacks. +func (c Float64ObserverConfig) Callbacks() []Float64Callback { + return c.callbacks +} + +// Float64ObserverOption applies options to float64 Observer instruments. +type Float64ObserverOption interface { + applyFloat64Observer(Float64ObserverConfig) Float64ObserverConfig +} + +type float64ObserverOptionFunc func(Float64ObserverConfig) Float64ObserverConfig + +func (fn float64ObserverOptionFunc) applyFloat64Observer(cfg Float64ObserverConfig) Float64ObserverConfig { + return fn(cfg) +} + +// WithFloat64Callback adds callback to be called for an instrument. +func WithFloat64Callback(callback Float64Callback) Float64ObserverOption { + return float64ObserverOptionFunc(func(cfg Float64ObserverConfig) Float64ObserverConfig { + cfg.callbacks = append(cfg.callbacks, callback) + return cfg + }) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64/asyncfloat64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64/asyncfloat64.go deleted file mode 100644 index 370715f69..000000000 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64/asyncfloat64.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright The OpenTelemetry 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 asyncfloat64 // import "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - -import ( - "context" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/instrument" -) - -// InstrumentProvider provides access to individual instruments. -type InstrumentProvider interface { - // Counter creates an instrument for recording increasing values. - Counter(name string, opts ...instrument.Option) (Counter, error) - - // UpDownCounter creates an instrument for recording changes of a value. - UpDownCounter(name string, opts ...instrument.Option) (UpDownCounter, error) - - // Gauge creates an instrument for recording the current value. - Gauge(name string, opts ...instrument.Option) (Gauge, error) -} - -// Counter is an instrument that records increasing values. -type Counter interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} - -// UpDownCounter is an instrument that records increasing or decreasing values. -type UpDownCounter interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} - -// Gauge is an instrument that records independent readings. -type Gauge interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64.go new file mode 100644 index 000000000..ac0d09d90 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64.go @@ -0,0 +1,131 @@ +// Copyright The OpenTelemetry 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 instrument // import "go.opentelemetry.io/otel/metric/instrument" + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/unit" +) + +// Int64Observable describes a set of instruments used asynchronously to record +// int64 measurements once per collection cycle. Observations of these +// instruments are only made within a callback. +// +// Warning: methods may be added to this interface in minor releases. +type Int64Observable interface { + Asynchronous + + int64Observable() +} + +// Int64ObservableCounter is an instrument used to asynchronously record +// increasing int64 measurements once per collection cycle. Observations are +// only made within a callback for this instrument. The value observed is +// assumed the to be the cumulative sum of the count. +// +// Warning: methods may be added to this interface in minor releases. +type Int64ObservableCounter interface{ Int64Observable } + +// Int64ObservableUpDownCounter is an instrument used to asynchronously record +// int64 measurements once per collection cycle. Observations are only made +// within a callback for this instrument. The value observed is assumed the to +// be the cumulative sum of the count. +// +// Warning: methods may be added to this interface in minor releases. +type Int64ObservableUpDownCounter interface{ Int64Observable } + +// Int64ObservableGauge is an instrument used to asynchronously record +// instantaneous int64 measurements once per collection cycle. Observations are +// only made within a callback for this instrument. +// +// Warning: methods may be added to this interface in minor releases. +type Int64ObservableGauge interface{ Int64Observable } + +// Int64Observer is a recorder of int64 measurements. +// +// Warning: methods may be added to this interface in minor releases. +type Int64Observer interface { + Observe(value int64, attributes ...attribute.KeyValue) +} + +// Int64Callback is a function registered with a Meter that makes +// observations for a Int64Observerable instrument it is registered with. +// Calls to the Int64Observer record measurement values for the +// Int64Observable. +// +// The function needs to complete in a finite amount of time and the deadline +// of the passed context is expected to be honored. +// +// The function needs to make unique observations across all registered +// Int64Callback. Meaning, it should not report measurements with the same +// attributes as another Int64Callbacks also registered for the same +// instrument. +// +// The function needs to be concurrent safe. +type Int64Callback func(context.Context, Int64Observer) error + +// Int64ObserverConfig contains options for Asynchronous instruments that +// observe int64 values. +type Int64ObserverConfig struct { + description string + unit unit.Unit + callbacks []Int64Callback +} + +// NewInt64ObserverConfig returns a new Int64ObserverConfig with all opts +// applied. +func NewInt64ObserverConfig(opts ...Int64ObserverOption) Int64ObserverConfig { + var config Int64ObserverConfig + for _, o := range opts { + config = o.applyInt64Observer(config) + } + return config +} + +// Description returns the Config description. +func (c Int64ObserverConfig) Description() string { + return c.description +} + +// Unit returns the Config unit. +func (c Int64ObserverConfig) Unit() unit.Unit { + return c.unit +} + +// Callbacks returns the Config callbacks. +func (c Int64ObserverConfig) Callbacks() []Int64Callback { + return c.callbacks +} + +// Int64ObserverOption applies options to int64 Observer instruments. +type Int64ObserverOption interface { + applyInt64Observer(Int64ObserverConfig) Int64ObserverConfig +} + +type int64ObserverOptionFunc func(Int64ObserverConfig) Int64ObserverConfig + +func (fn int64ObserverOptionFunc) applyInt64Observer(cfg Int64ObserverConfig) Int64ObserverConfig { + return fn(cfg) +} + +// WithInt64Callback adds callback to be called for an instrument. +func WithInt64Callback(callback Int64Callback) Int64ObserverOption { + return int64ObserverOptionFunc(func(cfg Int64ObserverConfig) Int64ObserverConfig { + cfg.callbacks = append(cfg.callbacks, callback) + return cfg + }) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64/asyncint64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64/asyncint64.go deleted file mode 100644 index 41a561bc4..000000000 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64/asyncint64.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright The OpenTelemetry 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 asyncint64 // import "go.opentelemetry.io/otel/metric/instrument/asyncint64" - -import ( - "context" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/instrument" -) - -// InstrumentProvider provides access to individual instruments. -type InstrumentProvider interface { - // Counter creates an instrument for recording increasing values. - Counter(name string, opts ...instrument.Option) (Counter, error) - - // UpDownCounter creates an instrument for recording changes of a value. - UpDownCounter(name string, opts ...instrument.Option) (UpDownCounter, error) - - // Gauge creates an instrument for recording the current value. - Gauge(name string, opts ...instrument.Option) (Gauge, error) -} - -// Counter is an instrument that records increasing values. -type Counter interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} - -// UpDownCounter is an instrument that records increasing or decreasing values. -type UpDownCounter interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} - -// Gauge is an instrument that records independent readings. -type Gauge interface { - // Observe records the state of the instrument. - // - // It is only valid to call this within a callback. If called outside of the - // registered callback it should have no effect on the instrument, and an - // error will be reported via the error handler. - Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) - - instrument.Asynchronous -} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/config.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/config.go deleted file mode 100644 index 8778bce16..000000000 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/config.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright The OpenTelemetry 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 instrument // import "go.opentelemetry.io/otel/metric/instrument" - -import "go.opentelemetry.io/otel/metric/unit" - -// Config contains options for metric instrument descriptors. -type Config struct { - description string - unit unit.Unit -} - -// Description describes the instrument in human-readable terms. -func (cfg Config) Description() string { - return cfg.description -} - -// Unit describes the measurement unit for an instrument. -func (cfg Config) Unit() unit.Unit { - return cfg.unit -} - -// Option is an interface for applying metric instrument options. -type Option interface { - applyInstrument(Config) Config -} - -// NewConfig creates a new Config and applies all the given options. -func NewConfig(opts ...Option) Config { - var config Config - for _, o := range opts { - config = o.applyInstrument(config) - } - return config -} - -type optionFunc func(Config) Config - -func (fn optionFunc) applyInstrument(cfg Config) Config { - return fn(cfg) -} - -// WithDescription applies provided description. -func WithDescription(desc string) Option { - return optionFunc(func(cfg Config) Config { - cfg.description = desc - return cfg - }) -} - -// WithUnit applies provided unit. -func WithUnit(u unit.Unit) Option { - return optionFunc(func(cfg Config) Config { - cfg.unit = u - return cfg - }) -} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/instrument.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/instrument.go index e1bbb850d..c583be6fb 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/instrument.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/instrument.go @@ -14,6 +14,8 @@ package instrument // import "go.opentelemetry.io/otel/metric/instrument" +import "go.opentelemetry.io/otel/metric/unit" + // Asynchronous instruments are instruments that are updated within a Callback. // If an instrument is observed outside of it's callback it should be an error. // @@ -28,3 +30,61 @@ type Asynchronous interface { type Synchronous interface { synchronous() } + +// Option applies options to all instruments. +type Option interface { + Float64ObserverOption + Int64ObserverOption + Float64Option + Int64Option +} + +type descOpt string + +func (o descOpt) applyFloat64(c Float64Config) Float64Config { + c.description = string(o) + return c +} + +func (o descOpt) applyInt64(c Int64Config) Int64Config { + c.description = string(o) + return c +} + +func (o descOpt) applyFloat64Observer(c Float64ObserverConfig) Float64ObserverConfig { + c.description = string(o) + return c +} + +func (o descOpt) applyInt64Observer(c Int64ObserverConfig) Int64ObserverConfig { + c.description = string(o) + return c +} + +// WithDescription sets the instrument description. +func WithDescription(desc string) Option { return descOpt(desc) } + +type unitOpt unit.Unit + +func (o unitOpt) applyFloat64(c Float64Config) Float64Config { + c.unit = unit.Unit(o) + return c +} + +func (o unitOpt) applyInt64(c Int64Config) Int64Config { + c.unit = unit.Unit(o) + return c +} + +func (o unitOpt) applyFloat64Observer(c Float64ObserverConfig) Float64ObserverConfig { + c.unit = unit.Unit(o) + return c +} + +func (o unitOpt) applyInt64Observer(c Int64ObserverConfig) Int64ObserverConfig { + c.unit = unit.Unit(o) + return c +} + +// WithUnit sets the instrument unit. +func WithUnit(u unit.Unit) Option { return unitOpt(u) } diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64.go new file mode 100644 index 000000000..d8f6ba9f4 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64.go @@ -0,0 +1,86 @@ +// Copyright The OpenTelemetry 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 instrument // import "go.opentelemetry.io/otel/metric/instrument" + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/unit" +) + +// Float64Counter is an instrument that records increasing float64 values. +// +// Warning: methods may be added to this interface in minor releases. +type Float64Counter interface { + // Add records a change to the counter. + Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Float64UpDownCounter is an instrument that records increasing or decreasing +// float64 values. +// +// Warning: methods may be added to this interface in minor releases. +type Float64UpDownCounter interface { + // Add records a change to the counter. + Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Float64Histogram is an instrument that records a distribution of float64 +// values. +// +// Warning: methods may be added to this interface in minor releases. +type Float64Histogram interface { + // Record adds an additional value to the distribution. + Record(ctx context.Context, incr float64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Float64Config contains options for Asynchronous instruments that +// observe float64 values. +type Float64Config struct { + description string + unit unit.Unit +} + +// Float64Config contains options for Synchronous instruments that record +// float64 values. +func NewFloat64Config(opts ...Float64Option) Float64Config { + var config Float64Config + for _, o := range opts { + config = o.applyFloat64(config) + } + return config +} + +// Description returns the Config description. +func (c Float64Config) Description() string { + return c.description +} + +// Unit returns the Config unit. +func (c Float64Config) Unit() unit.Unit { + return c.unit +} + +// Float64Option applies options to synchronous float64 instruments. +type Float64Option interface { + applyFloat64(Float64Config) Float64Config +} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64/syncfloat64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64/syncfloat64.go index 435db1127..bd835ec84 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64/syncfloat64.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64/syncfloat64.go @@ -12,6 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package syncfloat64 provides synchronous instruments that accept float64 +// measurments. +// +// Deprecated: Use the instruments provided by +// go.opentelemetry.io/otel/metric/instrument instead. package syncfloat64 // import "go.opentelemetry.io/otel/metric/instrument/syncfloat64" import ( @@ -21,17 +26,12 @@ import ( "go.opentelemetry.io/otel/metric/instrument" ) -// InstrumentProvider provides access to individual instruments. -type InstrumentProvider interface { - // Counter creates an instrument for recording increasing values. - Counter(name string, opts ...instrument.Option) (Counter, error) - // UpDownCounter creates an instrument for recording changes of a value. - UpDownCounter(name string, opts ...instrument.Option) (UpDownCounter, error) - // Histogram creates an instrument for recording a distribution of values. - Histogram(name string, opts ...instrument.Option) (Histogram, error) -} - // Counter is an instrument that records increasing values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Float64Counter in +// go.opentelemetry.io/otel/metric/instrument instead. type Counter interface { // Add records a change to the counter. Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) @@ -40,6 +40,11 @@ type Counter interface { } // UpDownCounter is an instrument that records increasing or decreasing values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Float64UpDownCounter in +// go.opentelemetry.io/otel/metric/instrument instead. type UpDownCounter interface { // Add records a change to the counter. Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) @@ -48,6 +53,11 @@ type UpDownCounter interface { } // Histogram is an instrument that records a distribution of values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Float64Histogram in +// go.opentelemetry.io/otel/metric/instrument instead. type Histogram interface { // Record adds an additional value to the distribution. Record(ctx context.Context, incr float64, attrs ...attribute.KeyValue) diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64.go new file mode 100644 index 000000000..96bf730e4 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64.go @@ -0,0 +1,86 @@ +// Copyright The OpenTelemetry 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 instrument // import "go.opentelemetry.io/otel/metric/instrument" + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/unit" +) + +// Int64Counter is an instrument that records increasing int64 values. +// +// Warning: methods may be added to this interface in minor releases. +type Int64Counter interface { + // Add records a change to the counter. + Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Int64UpDownCounter is an instrument that records increasing or decreasing +// int64 values. +// +// Warning: methods may be added to this interface in minor releases. +type Int64UpDownCounter interface { + // Add records a change to the counter. + Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Int64Histogram is an instrument that records a distribution of int64 +// values. +// +// Warning: methods may be added to this interface in minor releases. +type Int64Histogram interface { + // Record adds an additional value to the distribution. + Record(ctx context.Context, incr int64, attrs ...attribute.KeyValue) + + Synchronous +} + +// Int64Config contains options for Synchronous instruments that record int64 +// values. +type Int64Config struct { + description string + unit unit.Unit +} + +// NewInt64Config returns a new Int64Config with all opts +// applied. +func NewInt64Config(opts ...Int64Option) Int64Config { + var config Int64Config + for _, o := range opts { + config = o.applyInt64(config) + } + return config +} + +// Description returns the Config description. +func (c Int64Config) Description() string { + return c.description +} + +// Unit returns the Config unit. +func (c Int64Config) Unit() unit.Unit { + return c.unit +} + +// Int64Option applies options to synchronous int64 instruments. +type Int64Option interface { + applyInt64(Int64Config) Int64Config +} diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64/syncint64.go b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64/syncint64.go index c77a46728..88408113f 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64/syncint64.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/instrument/syncint64/syncint64.go @@ -12,6 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package syncint64 provides synchronous instruments that accept int64 +// measurments. +// +// Deprecated: Use the instruments provided by +// go.opentelemetry.io/otel/metric/instrument instead. package syncint64 // import "go.opentelemetry.io/otel/metric/instrument/syncint64" import ( @@ -21,17 +26,12 @@ import ( "go.opentelemetry.io/otel/metric/instrument" ) -// InstrumentProvider provides access to individual instruments. -type InstrumentProvider interface { - // Counter creates an instrument for recording increasing values. - Counter(name string, opts ...instrument.Option) (Counter, error) - // UpDownCounter creates an instrument for recording changes of a value. - UpDownCounter(name string, opts ...instrument.Option) (UpDownCounter, error) - // Histogram creates an instrument for recording a distribution of values. - Histogram(name string, opts ...instrument.Option) (Histogram, error) -} - // Counter is an instrument that records increasing values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Int64Counter in +// go.opentelemetry.io/otel/metric/instrument instead. type Counter interface { // Add records a change to the counter. Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue) @@ -40,6 +40,11 @@ type Counter interface { } // UpDownCounter is an instrument that records increasing or decreasing values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Int64UpDownCounter in +// go.opentelemetry.io/otel/metric/instrument instead. type UpDownCounter interface { // Add records a change to the counter. Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue) @@ -48,6 +53,11 @@ type UpDownCounter interface { } // Histogram is an instrument that records a distribution of values. +// +// Warning: methods may be added to this interface in minor releases. +// +// Deprecated: Use the Int64Histogram in +// go.opentelemetry.io/otel/metric/instrument instead. type Histogram interface { // Record adds an additional value to the distribution. Record(ctx context.Context, incr int64, attrs ...attribute.KeyValue) diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/instruments.go b/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/instruments.go index aed8b6660..d1480fa5f 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/instruments.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/instruments.go @@ -22,23 +22,27 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" ) +// unwrapper unwraps to return the underlying instrument implementation. +type unwrapper interface { + Unwrap() instrument.Asynchronous +} + type afCounter struct { - name string - opts []instrument.Option + instrument.Float64Observable - delegate atomic.Value //asyncfloat64.Counter + name string + opts []instrument.Float64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Float64ObservableCounter } +var _ unwrapper = (*afCounter)(nil) +var _ instrument.Float64ObservableCounter = (*afCounter)(nil) + func (i *afCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().Counter(i.name, i.opts...) + ctr, err := m.Float64ObservableCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -46,30 +50,27 @@ func (i *afCounter) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *afCounter) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { +func (i *afCounter) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncfloat64.Counter).Observe(ctx, x, attrs...) - } -} - -func (i *afCounter) unwrap() instrument.Asynchronous { - if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncfloat64.Counter) + return ctr.(instrument.Float64ObservableCounter) } return nil } type afUpDownCounter struct { - name string - opts []instrument.Option + instrument.Float64Observable - delegate atomic.Value //asyncfloat64.UpDownCounter + name string + opts []instrument.Float64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Float64ObservableUpDownCounter } +var _ unwrapper = (*afUpDownCounter)(nil) +var _ instrument.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil) + func (i *afUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().UpDownCounter(i.name, i.opts...) + ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -77,30 +78,27 @@ func (i *afUpDownCounter) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *afUpDownCounter) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { +func (i *afUpDownCounter) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncfloat64.UpDownCounter).Observe(ctx, x, attrs...) - } -} - -func (i *afUpDownCounter) unwrap() instrument.Asynchronous { - if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncfloat64.UpDownCounter) + return ctr.(instrument.Float64ObservableUpDownCounter) } return nil } type afGauge struct { - name string - opts []instrument.Option + instrument.Float64Observable - delegate atomic.Value //asyncfloat64.Gauge + name string + opts []instrument.Float64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Float64ObservableGauge } +var _ unwrapper = (*afGauge)(nil) +var _ instrument.Float64ObservableGauge = (*afGauge)(nil) + func (i *afGauge) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().Gauge(i.name, i.opts...) + ctr, err := m.Float64ObservableGauge(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -108,30 +106,27 @@ func (i *afGauge) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *afGauge) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { +func (i *afGauge) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncfloat64.Gauge).Observe(ctx, x, attrs...) - } -} - -func (i *afGauge) unwrap() instrument.Asynchronous { - if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncfloat64.Gauge) + return ctr.(instrument.Float64ObservableGauge) } return nil } type aiCounter struct { - name string - opts []instrument.Option + instrument.Int64Observable - delegate atomic.Value //asyncint64.Counter + name string + opts []instrument.Int64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Int64ObservableCounter } +var _ unwrapper = (*aiCounter)(nil) +var _ instrument.Int64ObservableCounter = (*aiCounter)(nil) + func (i *aiCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().Counter(i.name, i.opts...) + ctr, err := m.Int64ObservableCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -139,30 +134,27 @@ func (i *aiCounter) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *aiCounter) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { +func (i *aiCounter) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncint64.Counter).Observe(ctx, x, attrs...) - } -} - -func (i *aiCounter) unwrap() instrument.Asynchronous { - if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncint64.Counter) + return ctr.(instrument.Int64ObservableCounter) } return nil } type aiUpDownCounter struct { - name string - opts []instrument.Option + instrument.Int64Observable - delegate atomic.Value //asyncint64.UpDownCounter + name string + opts []instrument.Int64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Int64ObservableUpDownCounter } +var _ unwrapper = (*aiUpDownCounter)(nil) +var _ instrument.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil) + func (i *aiUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().UpDownCounter(i.name, i.opts...) + ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -170,30 +162,27 @@ func (i *aiUpDownCounter) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *aiUpDownCounter) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { - if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncint64.UpDownCounter).Observe(ctx, x, attrs...) - } -} - -func (i *aiUpDownCounter) unwrap() instrument.Asynchronous { +func (i *aiUpDownCounter) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncint64.UpDownCounter) + return ctr.(instrument.Int64ObservableUpDownCounter) } return nil } type aiGauge struct { - name string - opts []instrument.Option + instrument.Int64Observable - delegate atomic.Value //asyncint64.Gauge + name string + opts []instrument.Int64ObserverOption - instrument.Asynchronous + delegate atomic.Value //instrument.Int64ObservableGauge } +var _ unwrapper = (*aiGauge)(nil) +var _ instrument.Int64ObservableGauge = (*aiGauge)(nil) + func (i *aiGauge) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().Gauge(i.name, i.opts...) + ctr, err := m.Int64ObservableGauge(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -201,31 +190,27 @@ func (i *aiGauge) setDelegate(m metric.Meter) { i.delegate.Store(ctr) } -func (i *aiGauge) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { - if ctr := i.delegate.Load(); ctr != nil { - ctr.(asyncint64.Gauge).Observe(ctx, x, attrs...) - } -} - -func (i *aiGauge) unwrap() instrument.Asynchronous { +func (i *aiGauge) Unwrap() instrument.Asynchronous { if ctr := i.delegate.Load(); ctr != nil { - return ctr.(asyncint64.Gauge) + return ctr.(instrument.Int64ObservableGauge) } return nil } -//Sync Instruments. +// Sync Instruments. type sfCounter struct { name string - opts []instrument.Option + opts []instrument.Float64Option - delegate atomic.Value //syncfloat64.Counter + delegate atomic.Value //instrument.Float64Counter instrument.Synchronous } +var _ instrument.Float64Counter = (*sfCounter)(nil) + func (i *sfCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncFloat64().Counter(i.name, i.opts...) + ctr, err := m.Float64Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -235,21 +220,23 @@ func (i *sfCounter) setDelegate(m metric.Meter) { func (i *sfCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncfloat64.Counter).Add(ctx, incr, attrs...) + ctr.(instrument.Float64Counter).Add(ctx, incr, attrs...) } } type sfUpDownCounter struct { name string - opts []instrument.Option + opts []instrument.Float64Option - delegate atomic.Value //syncfloat64.UpDownCounter + delegate atomic.Value //instrument.Float64UpDownCounter instrument.Synchronous } +var _ instrument.Float64UpDownCounter = (*sfUpDownCounter)(nil) + func (i *sfUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncFloat64().UpDownCounter(i.name, i.opts...) + ctr, err := m.Float64UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -259,21 +246,23 @@ func (i *sfUpDownCounter) setDelegate(m metric.Meter) { func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncfloat64.UpDownCounter).Add(ctx, incr, attrs...) + ctr.(instrument.Float64UpDownCounter).Add(ctx, incr, attrs...) } } type sfHistogram struct { name string - opts []instrument.Option + opts []instrument.Float64Option - delegate atomic.Value //syncfloat64.Histogram + delegate atomic.Value //instrument.Float64Histogram instrument.Synchronous } +var _ instrument.Float64Histogram = (*sfHistogram)(nil) + func (i *sfHistogram) setDelegate(m metric.Meter) { - ctr, err := m.SyncFloat64().Histogram(i.name, i.opts...) + ctr, err := m.Float64Histogram(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -283,21 +272,23 @@ func (i *sfHistogram) setDelegate(m metric.Meter) { func (i *sfHistogram) Record(ctx context.Context, x float64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncfloat64.Histogram).Record(ctx, x, attrs...) + ctr.(instrument.Float64Histogram).Record(ctx, x, attrs...) } } type siCounter struct { name string - opts []instrument.Option + opts []instrument.Int64Option - delegate atomic.Value //syncint64.Counter + delegate atomic.Value //instrument.Int64Counter instrument.Synchronous } +var _ instrument.Int64Counter = (*siCounter)(nil) + func (i *siCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().Counter(i.name, i.opts...) + ctr, err := m.Int64Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -307,21 +298,23 @@ func (i *siCounter) setDelegate(m metric.Meter) { func (i *siCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncint64.Counter).Add(ctx, x, attrs...) + ctr.(instrument.Int64Counter).Add(ctx, x, attrs...) } } type siUpDownCounter struct { name string - opts []instrument.Option + opts []instrument.Int64Option - delegate atomic.Value //syncint64.UpDownCounter + delegate atomic.Value //instrument.Int64UpDownCounter instrument.Synchronous } +var _ instrument.Int64UpDownCounter = (*siUpDownCounter)(nil) + func (i *siUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().UpDownCounter(i.name, i.opts...) + ctr, err := m.Int64UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -331,21 +324,23 @@ func (i *siUpDownCounter) setDelegate(m metric.Meter) { func (i *siUpDownCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncint64.UpDownCounter).Add(ctx, x, attrs...) + ctr.(instrument.Int64UpDownCounter).Add(ctx, x, attrs...) } } type siHistogram struct { name string - opts []instrument.Option + opts []instrument.Int64Option - delegate atomic.Value //syncint64.Histogram + delegate atomic.Value //instrument.Int64Histogram instrument.Synchronous } +var _ instrument.Int64Histogram = (*siHistogram)(nil) + func (i *siHistogram) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().Histogram(i.name, i.opts...) + ctr, err := m.Int64Histogram(i.name, i.opts...) if err != nil { otel.Handle(err) return @@ -355,6 +350,6 @@ func (i *siHistogram) setDelegate(m metric.Meter) { func (i *siHistogram) Record(ctx context.Context, x int64, attrs ...attribute.KeyValue) { if ctr := i.delegate.Load(); ctr != nil { - ctr.(syncint64.Histogram).Record(ctx, x, attrs...) + ctr.(instrument.Int64Histogram).Record(ctx, x, attrs...) } } diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/meter.go b/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/meter.go index 0fa924f39..8acf63286 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/meter.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/internal/global/meter.go @@ -15,17 +15,13 @@ package global // import "go.opentelemetry.io/otel/metric/internal/global" import ( - "context" + "container/list" "sync" "sync/atomic" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" ) // meterProvider is a placeholder for a configured SDK MeterProvider. @@ -109,7 +105,8 @@ type meter struct { mtx sync.Mutex instruments []delegatedInstrument - callbacks []delegatedCallback + + registry list.List delegate atomic.Value // metric.Meter } @@ -135,213 +132,223 @@ func (m *meter) setDelegate(provider metric.MeterProvider) { inst.setDelegate(meter) } - for _, callback := range m.callbacks { - callback.setDelegate(meter) + for e := m.registry.Front(); e != nil; e = e.Next() { + r := e.Value.(*registration) + r.setDelegate(meter) + m.registry.Remove(e) } m.instruments = nil - m.callbacks = nil + m.registry.Init() } -// AsyncInt64 is the namespace for the Asynchronous Integer instruments. -// -// To Observe data with instruments it must be registered in a callback. -func (m *meter) AsyncInt64() asyncint64.InstrumentProvider { +func (m *meter) Int64Counter(name string, options ...instrument.Int64Option) (instrument.Int64Counter, error) { if del, ok := m.delegate.Load().(metric.Meter); ok { - return del.AsyncInt64() + return del.Int64Counter(name, options...) } - return (*aiInstProvider)(m) + m.mtx.Lock() + defer m.mtx.Unlock() + i := &siCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// AsyncFloat64 is the namespace for the Asynchronous Float instruments. -// -// To Observe data with instruments it must be registered in a callback. -func (m *meter) AsyncFloat64() asyncfloat64.InstrumentProvider { +func (m *meter) Int64UpDownCounter(name string, options ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) { if del, ok := m.delegate.Load().(metric.Meter); ok { - return del.AsyncFloat64() + return del.Int64UpDownCounter(name, options...) } - return (*afInstProvider)(m) + m.mtx.Lock() + defer m.mtx.Unlock() + i := &siUpDownCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// RegisterCallback captures the function that will be called during Collect. -// -// It is only valid to call Observe within the scope of the passed function, -// and only on the instruments that were registered with this call. -func (m *meter) RegisterCallback(insts []instrument.Asynchronous, function func(context.Context)) error { +func (m *meter) Int64Histogram(name string, options ...instrument.Int64Option) (instrument.Int64Histogram, error) { if del, ok := m.delegate.Load().(metric.Meter); ok { - insts = unwrapInstruments(insts) - return del.RegisterCallback(insts, function) + return del.Int64Histogram(name, options...) } - m.mtx.Lock() defer m.mtx.Unlock() - m.callbacks = append(m.callbacks, delegatedCallback{ - instruments: insts, - function: function, - }) - - return nil + i := &siHistogram{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -type wrapped interface { - unwrap() instrument.Asynchronous +func (m *meter) Int64ObservableCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Int64ObservableCounter(name, options...) + } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &aiCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -func unwrapInstruments(instruments []instrument.Asynchronous) []instrument.Asynchronous { - out := make([]instrument.Asynchronous, 0, len(instruments)) - - for _, inst := range instruments { - if in, ok := inst.(wrapped); ok { - out = append(out, in.unwrap()) - } else { - out = append(out, inst) - } +func (m *meter) Int64ObservableUpDownCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Int64ObservableUpDownCounter(name, options...) } - - return out + m.mtx.Lock() + defer m.mtx.Unlock() + i := &aiUpDownCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// SyncInt64 is the namespace for the Synchronous Integer instruments. -func (m *meter) SyncInt64() syncint64.InstrumentProvider { +func (m *meter) Int64ObservableGauge(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) { if del, ok := m.delegate.Load().(metric.Meter); ok { - return del.SyncInt64() + return del.Int64ObservableGauge(name, options...) } - return (*siInstProvider)(m) + m.mtx.Lock() + defer m.mtx.Unlock() + i := &aiGauge{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// SyncFloat64 is the namespace for the Synchronous Float instruments. -func (m *meter) SyncFloat64() syncfloat64.InstrumentProvider { +func (m *meter) Float64Counter(name string, options ...instrument.Float64Option) (instrument.Float64Counter, error) { if del, ok := m.delegate.Load().(metric.Meter); ok { - return del.SyncFloat64() + return del.Float64Counter(name, options...) } - return (*sfInstProvider)(m) + m.mtx.Lock() + defer m.mtx.Unlock() + i := &sfCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -type delegatedCallback struct { - instruments []instrument.Asynchronous - function func(context.Context) +func (m *meter) Float64UpDownCounter(name string, options ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Float64UpDownCounter(name, options...) + } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &sfUpDownCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -func (c *delegatedCallback) setDelegate(m metric.Meter) { - insts := unwrapInstruments(c.instruments) - err := m.RegisterCallback(insts, c.function) - if err != nil { - otel.Handle(err) +func (m *meter) Float64Histogram(name string, options ...instrument.Float64Option) (instrument.Float64Histogram, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Float64Histogram(name, options...) } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &sfHistogram{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -type afInstProvider meter - -// Counter creates an instrument for recording increasing values. -func (ip *afInstProvider) Counter(name string, opts ...instrument.Option) (asyncfloat64.Counter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &afCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +func (m *meter) Float64ObservableCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Float64ObservableCounter(name, options...) + } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &afCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// UpDownCounter creates an instrument for recording changes of a value. -func (ip *afInstProvider) UpDownCounter(name string, opts ...instrument.Option) (asyncfloat64.UpDownCounter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &afUpDownCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +func (m *meter) Float64ObservableUpDownCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Float64ObservableUpDownCounter(name, options...) + } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &afUpDownCounter{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -// Gauge creates an instrument for recording the current value. -func (ip *afInstProvider) Gauge(name string, opts ...instrument.Option) (asyncfloat64.Gauge, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &afGauge{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +func (m *meter) Float64ObservableGauge(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + return del.Float64ObservableGauge(name, options...) + } + m.mtx.Lock() + defer m.mtx.Unlock() + i := &afGauge{name: name, opts: options} + m.instruments = append(m.instruments, i) + return i, nil } -type aiInstProvider meter +// RegisterCallback captures the function that will be called during Collect. +func (m *meter) RegisterCallback(f metric.Callback, insts ...instrument.Asynchronous) (metric.Registration, error) { + if del, ok := m.delegate.Load().(metric.Meter); ok { + insts = unwrapInstruments(insts) + return del.RegisterCallback(f, insts...) + } -// Counter creates an instrument for recording increasing values. -func (ip *aiInstProvider) Counter(name string, opts ...instrument.Option) (asyncint64.Counter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &aiCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil -} + m.mtx.Lock() + defer m.mtx.Unlock() -// UpDownCounter creates an instrument for recording changes of a value. -func (ip *aiInstProvider) UpDownCounter(name string, opts ...instrument.Option) (asyncint64.UpDownCounter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &aiUpDownCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil + reg := ®istration{instruments: insts, function: f} + e := m.registry.PushBack(reg) + reg.unreg = func() error { + m.mtx.Lock() + _ = m.registry.Remove(e) + m.mtx.Unlock() + return nil + } + return reg, nil } -// Gauge creates an instrument for recording the current value. -func (ip *aiInstProvider) Gauge(name string, opts ...instrument.Option) (asyncint64.Gauge, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &aiGauge{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +type wrapped interface { + unwrap() instrument.Asynchronous } -type sfInstProvider meter +func unwrapInstruments(instruments []instrument.Asynchronous) []instrument.Asynchronous { + out := make([]instrument.Asynchronous, 0, len(instruments)) -// Counter creates an instrument for recording increasing values. -func (ip *sfInstProvider) Counter(name string, opts ...instrument.Option) (syncfloat64.Counter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &sfCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil -} + for _, inst := range instruments { + if in, ok := inst.(wrapped); ok { + out = append(out, in.unwrap()) + } else { + out = append(out, inst) + } + } -// UpDownCounter creates an instrument for recording changes of a value. -func (ip *sfInstProvider) UpDownCounter(name string, opts ...instrument.Option) (syncfloat64.UpDownCounter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &sfUpDownCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil + return out } -// Histogram creates an instrument for recording a distribution of values. -func (ip *sfInstProvider) Histogram(name string, opts ...instrument.Option) (syncfloat64.Histogram, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &sfHistogram{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +type registration struct { + instruments []instrument.Asynchronous + function metric.Callback + + unreg func() error + unregMu sync.Mutex } -type siInstProvider meter +func (c *registration) setDelegate(m metric.Meter) { + insts := unwrapInstruments(c.instruments) -// Counter creates an instrument for recording increasing values. -func (ip *siInstProvider) Counter(name string, opts ...instrument.Option) (syncint64.Counter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &siCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil -} + c.unregMu.Lock() + defer c.unregMu.Unlock() + + if c.unreg == nil { + // Unregister already called. + return + } -// UpDownCounter creates an instrument for recording changes of a value. -func (ip *siInstProvider) UpDownCounter(name string, opts ...instrument.Option) (syncint64.UpDownCounter, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &siUpDownCounter{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil + reg, err := m.RegisterCallback(c.function, insts...) + if err != nil { + otel.Handle(err) + } + + c.unreg = reg.Unregister } -// Histogram creates an instrument for recording a distribution of values. -func (ip *siInstProvider) Histogram(name string, opts ...instrument.Option) (syncint64.Histogram, error) { - ip.mtx.Lock() - defer ip.mtx.Unlock() - ctr := &siHistogram{name: name, opts: opts} - ip.instruments = append(ip.instruments, ctr) - return ctr, nil +func (c *registration) Unregister() error { + c.unregMu.Lock() + defer c.unregMu.Unlock() + if c.unreg == nil { + // Unregister already called. + return nil + } + + var err error + err, c.unreg = c.unreg(), nil + return err } diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/meter.go b/tools/vendor/go.opentelemetry.io/otel/metric/meter.go index 21fc1c499..f1e917e93 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/meter.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/meter.go @@ -17,15 +17,14 @@ package metric // import "go.opentelemetry.io/otel/metric" import ( "context" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" ) // MeterProvider provides access to named Meter instances, for instrumenting // an application or library. +// +// Warning: methods may be added to this interface in minor releases. type MeterProvider interface { // Meter creates an instance of a `Meter` interface. The instrumentationName // must be the name of the library providing instrumentation. This name may @@ -36,25 +35,104 @@ type MeterProvider interface { } // Meter provides access to instrument instances for recording metrics. +// +// Warning: methods may be added to this interface in minor releases. type Meter interface { - // AsyncInt64 is the namespace for the Asynchronous Integer instruments. - // - // To Observe data with instruments it must be registered in a callback. - AsyncInt64() asyncint64.InstrumentProvider + // Int64Counter returns a new instrument identified by name and configured + // with options. The instrument is used to synchronously record increasing + // int64 measurements during a computational operation. + Int64Counter(name string, options ...instrument.Int64Option) (instrument.Int64Counter, error) + // Int64UpDownCounter returns a new instrument identified by name and + // configured with options. The instrument is used to synchronously record + // int64 measurements during a computational operation. + Int64UpDownCounter(name string, options ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) + // Int64Histogram returns a new instrument identified by name and + // configured with options. The instrument is used to synchronously record + // the distribution of int64 measurements during a computational operation. + Int64Histogram(name string, options ...instrument.Int64Option) (instrument.Int64Histogram, error) + // Int64ObservableCounter returns a new instrument identified by name and + // configured with options. The instrument is used to asynchronously record + // increasing int64 measurements once per a measurement collection cycle. + Int64ObservableCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) + // Int64ObservableUpDownCounter returns a new instrument identified by name + // and configured with options. The instrument is used to asynchronously + // record int64 measurements once per a measurement collection cycle. + Int64ObservableUpDownCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) + // Int64ObservableGauge returns a new instrument identified by name and + // configured with options. The instrument is used to asynchronously record + // instantaneous int64 measurements once per a measurement collection + // cycle. + Int64ObservableGauge(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) + + // Float64Counter returns a new instrument identified by name and + // configured with options. The instrument is used to synchronously record + // increasing float64 measurements during a computational operation. + Float64Counter(name string, options ...instrument.Float64Option) (instrument.Float64Counter, error) + // Float64UpDownCounter returns a new instrument identified by name and + // configured with options. The instrument is used to synchronously record + // float64 measurements during a computational operation. + Float64UpDownCounter(name string, options ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) + // Float64Histogram returns a new instrument identified by name and + // configured with options. The instrument is used to synchronously record + // the distribution of float64 measurements during a computational + // operation. + Float64Histogram(name string, options ...instrument.Float64Option) (instrument.Float64Histogram, error) + // Float64ObservableCounter returns a new instrument identified by name and + // configured with options. The instrument is used to asynchronously record + // increasing float64 measurements once per a measurement collection cycle. + Float64ObservableCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) + // Float64ObservableUpDownCounter returns a new instrument identified by + // name and configured with options. The instrument is used to + // asynchronously record float64 measurements once per a measurement + // collection cycle. + Float64ObservableUpDownCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) + // Float64ObservableGauge returns a new instrument identified by name and + // configured with options. The instrument is used to asynchronously record + // instantaneous float64 measurements once per a measurement collection + // cycle. + Float64ObservableGauge(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) - // AsyncFloat64 is the namespace for the Asynchronous Float instruments + // RegisterCallback registers f to be called during the collection of a + // measurement cycle. // - // To Observe data with instruments it must be registered in a callback. - AsyncFloat64() asyncfloat64.InstrumentProvider + // If Unregister of the returned Registration is called, f needs to be + // unregistered and not called during collection. + // + // The instruments f is registered with are the only instruments that f may + // observe values for. + // + // If no instruments are passed, f should not be registered nor called + // during collection. + RegisterCallback(f Callback, instruments ...instrument.Asynchronous) (Registration, error) +} + +// Callback is a function registered with a Meter that makes observations for +// the set of instruments it is registered with. The Observer parameter is used +// to record measurment observations for these instruments. +// +// The function needs to complete in a finite amount of time and the deadline +// of the passed context is expected to be honored. +// +// The function needs to make unique observations across all registered +// Callbacks. Meaning, it should not report measurements for an instrument with +// the same attributes as another Callback will report. +// +// The function needs to be concurrent safe. +type Callback func(context.Context, Observer) error + +// Observer records measurements for multiple instruments in a Callback. +type Observer interface { + // ObserveFloat64 records the float64 value with attributes for obsrv. + ObserveFloat64(obsrv instrument.Float64Observable, value float64, attributes ...attribute.KeyValue) + // ObserveInt64 records the int64 value with attributes for obsrv. + ObserveInt64(obsrv instrument.Int64Observable, value int64, attributes ...attribute.KeyValue) +} - // RegisterCallback captures the function that will be called during Collect. +// Registration is an token representing the unique registration of a callback +// for a set of instruments with a Meter. +type Registration interface { + // Unregister removes the callback registration from a Meter. // - // It is only valid to call Observe within the scope of the passed function, - // and only on the instruments that were registered with this call. - RegisterCallback(insts []instrument.Asynchronous, function func(context.Context)) error - - // SyncInt64 is the namespace for the Synchronous Integer instruments - SyncInt64() syncint64.InstrumentProvider - // SyncFloat64 is the namespace for the Synchronous Float instruments - SyncFloat64() syncfloat64.InstrumentProvider + // This method needs to be idempotent and concurrent safe. + Unregister() error } diff --git a/tools/vendor/go.opentelemetry.io/otel/metric/noop.go b/tools/vendor/go.opentelemetry.io/otel/metric/noop.go index e8b9a9a14..c586627ae 100644 --- a/tools/vendor/go.opentelemetry.io/otel/metric/noop.go +++ b/tools/vendor/go.opentelemetry.io/otel/metric/noop.go @@ -19,10 +19,6 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/metric/instrument/asyncfloat64" - "go.opentelemetry.io/otel/metric/instrument/asyncint64" - "go.opentelemetry.io/otel/metric/instrument/syncfloat64" - "go.opentelemetry.io/otel/metric/instrument/syncint64" ) // NewNoopMeterProvider creates a MeterProvider that does not record any metrics. @@ -43,104 +39,126 @@ func NewNoopMeter() Meter { type noopMeter struct{} -// AsyncInt64 creates an instrument that does not record any metrics. -func (noopMeter) AsyncInt64() asyncint64.InstrumentProvider { - return nonrecordingAsyncInt64Instrument{} +func (noopMeter) Int64Counter(string, ...instrument.Int64Option) (instrument.Int64Counter, error) { + return nonrecordingSyncInt64Instrument{}, nil } -// AsyncFloat64 creates an instrument that does not record any metrics. -func (noopMeter) AsyncFloat64() asyncfloat64.InstrumentProvider { - return nonrecordingAsyncFloat64Instrument{} +func (noopMeter) Int64UpDownCounter(string, ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) { + return nonrecordingSyncInt64Instrument{}, nil } -// SyncInt64 creates an instrument that does not record any metrics. -func (noopMeter) SyncInt64() syncint64.InstrumentProvider { - return nonrecordingSyncInt64Instrument{} +func (noopMeter) Int64Histogram(string, ...instrument.Int64Option) (instrument.Int64Histogram, error) { + return nonrecordingSyncInt64Instrument{}, nil } -// SyncFloat64 creates an instrument that does not record any metrics. -func (noopMeter) SyncFloat64() syncfloat64.InstrumentProvider { - return nonrecordingSyncFloat64Instrument{} +func (noopMeter) Int64ObservableCounter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) { + return nonrecordingAsyncInt64Instrument{}, nil +} + +func (noopMeter) Int64ObservableUpDownCounter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) { + return nonrecordingAsyncInt64Instrument{}, nil +} + +func (noopMeter) Int64ObservableGauge(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) { + return nonrecordingAsyncInt64Instrument{}, nil +} + +func (noopMeter) Float64Counter(string, ...instrument.Float64Option) (instrument.Float64Counter, error) { + return nonrecordingSyncFloat64Instrument{}, nil +} + +func (noopMeter) Float64UpDownCounter(string, ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) { + return nonrecordingSyncFloat64Instrument{}, nil +} + +func (noopMeter) Float64Histogram(string, ...instrument.Float64Option) (instrument.Float64Histogram, error) { + return nonrecordingSyncFloat64Instrument{}, nil +} + +func (noopMeter) Float64ObservableCounter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) { + return nonrecordingAsyncFloat64Instrument{}, nil +} + +func (noopMeter) Float64ObservableUpDownCounter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) { + return nonrecordingAsyncFloat64Instrument{}, nil +} + +func (noopMeter) Float64ObservableGauge(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) { + return nonrecordingAsyncFloat64Instrument{}, nil } // RegisterCallback creates a register callback that does not record any metrics. -func (noopMeter) RegisterCallback([]instrument.Asynchronous, func(context.Context)) error { - return nil +func (noopMeter) RegisterCallback(Callback, ...instrument.Asynchronous) (Registration, error) { + return noopReg{}, nil } +type noopReg struct{} + +func (noopReg) Unregister() error { return nil } + type nonrecordingAsyncFloat64Instrument struct { - instrument.Asynchronous + instrument.Float64Observable } var ( - _ asyncfloat64.InstrumentProvider = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.Counter = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.UpDownCounter = nonrecordingAsyncFloat64Instrument{} - _ asyncfloat64.Gauge = nonrecordingAsyncFloat64Instrument{} + _ instrument.Float64ObservableCounter = nonrecordingAsyncFloat64Instrument{} + _ instrument.Float64ObservableUpDownCounter = nonrecordingAsyncFloat64Instrument{} + _ instrument.Float64ObservableGauge = nonrecordingAsyncFloat64Instrument{} ) -func (n nonrecordingAsyncFloat64Instrument) Counter(string, ...instrument.Option) (asyncfloat64.Counter, error) { +func (n nonrecordingAsyncFloat64Instrument) Counter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) { return n, nil } -func (n nonrecordingAsyncFloat64Instrument) UpDownCounter(string, ...instrument.Option) (asyncfloat64.UpDownCounter, error) { +func (n nonrecordingAsyncFloat64Instrument) UpDownCounter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) { return n, nil } -func (n nonrecordingAsyncFloat64Instrument) Gauge(string, ...instrument.Option) (asyncfloat64.Gauge, error) { +func (n nonrecordingAsyncFloat64Instrument) Gauge(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) { return n, nil } -func (nonrecordingAsyncFloat64Instrument) Observe(context.Context, float64, ...attribute.KeyValue) { - -} - type nonrecordingAsyncInt64Instrument struct { - instrument.Asynchronous + instrument.Int64Observable } var ( - _ asyncint64.InstrumentProvider = nonrecordingAsyncInt64Instrument{} - _ asyncint64.Counter = nonrecordingAsyncInt64Instrument{} - _ asyncint64.UpDownCounter = nonrecordingAsyncInt64Instrument{} - _ asyncint64.Gauge = nonrecordingAsyncInt64Instrument{} + _ instrument.Int64ObservableCounter = nonrecordingAsyncInt64Instrument{} + _ instrument.Int64ObservableUpDownCounter = nonrecordingAsyncInt64Instrument{} + _ instrument.Int64ObservableGauge = nonrecordingAsyncInt64Instrument{} ) -func (n nonrecordingAsyncInt64Instrument) Counter(string, ...instrument.Option) (asyncint64.Counter, error) { +func (n nonrecordingAsyncInt64Instrument) Counter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) { return n, nil } -func (n nonrecordingAsyncInt64Instrument) UpDownCounter(string, ...instrument.Option) (asyncint64.UpDownCounter, error) { +func (n nonrecordingAsyncInt64Instrument) UpDownCounter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) { return n, nil } -func (n nonrecordingAsyncInt64Instrument) Gauge(string, ...instrument.Option) (asyncint64.Gauge, error) { +func (n nonrecordingAsyncInt64Instrument) Gauge(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) { return n, nil } -func (nonrecordingAsyncInt64Instrument) Observe(context.Context, int64, ...attribute.KeyValue) { -} - type nonrecordingSyncFloat64Instrument struct { instrument.Synchronous } var ( - _ syncfloat64.InstrumentProvider = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.Counter = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.UpDownCounter = nonrecordingSyncFloat64Instrument{} - _ syncfloat64.Histogram = nonrecordingSyncFloat64Instrument{} + _ instrument.Float64Counter = nonrecordingSyncFloat64Instrument{} + _ instrument.Float64UpDownCounter = nonrecordingSyncFloat64Instrument{} + _ instrument.Float64Histogram = nonrecordingSyncFloat64Instrument{} ) -func (n nonrecordingSyncFloat64Instrument) Counter(string, ...instrument.Option) (syncfloat64.Counter, error) { +func (n nonrecordingSyncFloat64Instrument) Counter(string, ...instrument.Float64Option) (instrument.Float64Counter, error) { return n, nil } -func (n nonrecordingSyncFloat64Instrument) UpDownCounter(string, ...instrument.Option) (syncfloat64.UpDownCounter, error) { +func (n nonrecordingSyncFloat64Instrument) UpDownCounter(string, ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) { return n, nil } -func (n nonrecordingSyncFloat64Instrument) Histogram(string, ...instrument.Option) (syncfloat64.Histogram, error) { +func (n nonrecordingSyncFloat64Instrument) Histogram(string, ...instrument.Float64Option) (instrument.Float64Histogram, error) { return n, nil } @@ -157,21 +175,20 @@ type nonrecordingSyncInt64Instrument struct { } var ( - _ syncint64.InstrumentProvider = nonrecordingSyncInt64Instrument{} - _ syncint64.Counter = nonrecordingSyncInt64Instrument{} - _ syncint64.UpDownCounter = nonrecordingSyncInt64Instrument{} - _ syncint64.Histogram = nonrecordingSyncInt64Instrument{} + _ instrument.Int64Counter = nonrecordingSyncInt64Instrument{} + _ instrument.Int64UpDownCounter = nonrecordingSyncInt64Instrument{} + _ instrument.Int64Histogram = nonrecordingSyncInt64Instrument{} ) -func (n nonrecordingSyncInt64Instrument) Counter(string, ...instrument.Option) (syncint64.Counter, error) { +func (n nonrecordingSyncInt64Instrument) Counter(string, ...instrument.Int64Option) (instrument.Int64Counter, error) { return n, nil } -func (n nonrecordingSyncInt64Instrument) UpDownCounter(string, ...instrument.Option) (syncint64.UpDownCounter, error) { +func (n nonrecordingSyncInt64Instrument) UpDownCounter(string, ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) { return n, nil } -func (n nonrecordingSyncInt64Instrument) Histogram(string, ...instrument.Option) (syncint64.Histogram, error) { +func (n nonrecordingSyncInt64Instrument) Histogram(string, ...instrument.Int64Option) (instrument.Int64Histogram, error) { return n, nil } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go index 7af46c61a..aa0f942f4 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go @@ -22,7 +22,7 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) type ( @@ -60,9 +60,9 @@ var ( func (telemetrySDK) Detect(context.Context) (*Resource, error) { return NewWithAttributes( semconv.SchemaURL, - semconv.TelemetrySDKNameKey.String("opentelemetry"), - semconv.TelemetrySDKLanguageKey.String("go"), - semconv.TelemetrySDKVersionKey.String(otel.Version()), + semconv.TelemetrySDKName("opentelemetry"), + semconv.TelemetrySDKLanguageGo, + semconv.TelemetrySDKVersion(otel.Version()), ), nil } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/config.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/config.go index 8e212b121..f9a2a2999 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/config.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/config.go @@ -194,6 +194,8 @@ func WithContainer() Option { } // WithContainerID adds an attribute with the id of the container to the configured Resource. +// Note: WithContainerID will not extract the correct container ID in an ECS environment. +// Please use the ECS resource detector instead (https://pkg.go.dev/go.opentelemetry.io/contrib/detectors/aws/ecs). func WithContainerID() Option { return WithDetectors(cgroupContainerIDDetector{}) } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/container.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/container.go index 7a897e969..318dcf82f 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/container.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/container.go @@ -22,7 +22,7 @@ import ( "os" "regexp" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) type containerIDProvider func() (string, error) @@ -47,7 +47,7 @@ func (cgroupContainerIDDetector) Detect(ctx context.Context) (*Resource, error) if containerID == "" { return Empty(), nil } - return NewWithAttributes(semconv.SchemaURL, semconv.ContainerIDKey.String(containerID)), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ContainerID(containerID)), nil } var ( diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/env.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/env.go index eb22d0079..e32843cad 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/env.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/env.go @@ -17,11 +17,13 @@ package resource // import "go.opentelemetry.io/otel/sdk/resource" import ( "context" "fmt" + "net/url" "os" "strings" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) const ( @@ -57,7 +59,7 @@ func (fromEnv) Detect(context.Context) (*Resource, error) { var res *Resource if svcName != "" { - res = NewSchemaless(semconv.ServiceNameKey.String(svcName)) + res = NewSchemaless(semconv.ServiceName(svcName)) } r2, err := constructOTResources(attrs) @@ -88,7 +90,14 @@ func constructOTResources(s string) (*Resource, error) { invalid = append(invalid, p) continue } - k, v := strings.TrimSpace(field[0]), strings.TrimSpace(field[1]) + k := strings.TrimSpace(field[0]) + v, err := url.QueryUnescape(strings.TrimSpace(field[1])) + if err != nil { + // Retain original value if decoding fails, otherwise it will be + // an empty string. + v = field[1] + otel.Handle(err) + } attrs = append(attrs, attribute.String(k, v)) } var err error diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/os.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/os.go index 3b4d0c14d..815fe5c20 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/os.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/os.go @@ -19,7 +19,7 @@ import ( "strings" "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) type osDescriptionProvider func() (string, error) @@ -63,7 +63,7 @@ func (osDescriptionDetector) Detect(ctx context.Context) (*Resource, error) { return NewWithAttributes( semconv.SchemaURL, - semconv.OSDescriptionKey.String(description), + semconv.OSDescription(description), ), nil } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/process.go b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/process.go index 9a169f663..bdd0e7fe6 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/resource/process.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/resource/process.go @@ -22,7 +22,7 @@ import ( "path/filepath" "runtime" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) type pidProvider func() int @@ -120,14 +120,14 @@ type processRuntimeDescriptionDetector struct{} // Detect returns a *Resource that describes the process identifier (PID) of the // executing process. func (processPIDDetector) Detect(ctx context.Context) (*Resource, error) { - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessPIDKey.Int(pid())), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessPID(pid())), nil } // Detect returns a *Resource that describes the name of the process executable. func (processExecutableNameDetector) Detect(ctx context.Context) (*Resource, error) { executableName := filepath.Base(commandArgs()[0]) - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutableNameKey.String(executableName)), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutableName(executableName)), nil } // Detect returns a *Resource that describes the full path of the process executable. @@ -137,13 +137,13 @@ func (processExecutablePathDetector) Detect(ctx context.Context) (*Resource, err return nil, err } - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutablePathKey.String(executablePath)), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutablePath(executablePath)), nil } // Detect returns a *Resource that describes all the command arguments as received // by the process. func (processCommandArgsDetector) Detect(ctx context.Context) (*Resource, error) { - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessCommandArgsKey.StringSlice(commandArgs())), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessCommandArgs(commandArgs()...)), nil } // Detect returns a *Resource that describes the username of the user that owns the @@ -154,18 +154,18 @@ func (processOwnerDetector) Detect(ctx context.Context) (*Resource, error) { return nil, err } - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessOwnerKey.String(owner.Username)), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessOwner(owner.Username)), nil } // Detect returns a *Resource that describes the name of the compiler used to compile // this process image. func (processRuntimeNameDetector) Detect(ctx context.Context) (*Resource, error) { - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeNameKey.String(runtimeName())), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeName(runtimeName())), nil } // Detect returns a *Resource that describes the version of the runtime of this process. func (processRuntimeVersionDetector) Detect(ctx context.Context) (*Resource, error) { - return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeVersionKey.String(runtimeVersion())), nil + return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeVersion(runtimeVersion())), nil } // Detect returns a *Resource that describes the runtime of this process. @@ -175,6 +175,6 @@ func (processRuntimeDescriptionDetector) Detect(ctx context.Context) (*Resource, return NewWithAttributes( semconv.SchemaURL, - semconv.ProcessRuntimeDescriptionKey.String(runtimeDescription), + semconv.ProcessRuntimeDescription(runtimeDescription), ), nil } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go index 292ea5481..201c17817 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go @@ -76,6 +76,7 @@ type TracerProvider struct { mu sync.Mutex namedTracer map[instrumentation.Scope]*tracer spanProcessors atomic.Value + isShutdown bool // These fields are not protected by the lock mu. They are assumed to be // immutable after creation of the TracerProvider. @@ -116,12 +117,13 @@ func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider { spanLimits: o.spanLimits, resource: o.resource, } - global.Info("TracerProvider created", "config", o) + spss := spanProcessorStates{} for _, sp := range o.processors { - tp.RegisterSpanProcessor(sp) + spss = append(spss, newSpanProcessorState(sp)) } + tp.spanProcessors.Store(spss) return tp } @@ -159,44 +161,44 @@ func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T } // RegisterSpanProcessor adds the given SpanProcessor to the list of SpanProcessors. -func (p *TracerProvider) RegisterSpanProcessor(s SpanProcessor) { +func (p *TracerProvider) RegisterSpanProcessor(sp SpanProcessor) { p.mu.Lock() defer p.mu.Unlock() - newSPS := spanProcessorStates{} - if old, ok := p.spanProcessors.Load().(spanProcessorStates); ok { - newSPS = append(newSPS, old...) - } - newSpanSync := &spanProcessorState{ - sp: s, - state: &sync.Once{}, + if p.isShutdown { + return } - newSPS = append(newSPS, newSpanSync) + newSPS := spanProcessorStates{} + newSPS = append(newSPS, p.spanProcessors.Load().(spanProcessorStates)...) + newSPS = append(newSPS, newSpanProcessorState(sp)) p.spanProcessors.Store(newSPS) } // UnregisterSpanProcessor removes the given SpanProcessor from the list of SpanProcessors. -func (p *TracerProvider) UnregisterSpanProcessor(s SpanProcessor) { +func (p *TracerProvider) UnregisterSpanProcessor(sp SpanProcessor) { p.mu.Lock() defer p.mu.Unlock() - spss := spanProcessorStates{} - old, ok := p.spanProcessors.Load().(spanProcessorStates) - if !ok || len(old) == 0 { + if p.isShutdown { return } + old := p.spanProcessors.Load().(spanProcessorStates) + if len(old) == 0 { + return + } + spss := spanProcessorStates{} spss = append(spss, old...) // stop the span processor if it is started and remove it from the list var stopOnce *spanProcessorState var idx int for i, sps := range spss { - if sps.sp == s { + if sps.sp == sp { stopOnce = sps idx = i } } if stopOnce != nil { stopOnce.state.Do(func() { - if err := s.Shutdown(context.Background()); err != nil { + if err := sp.Shutdown(context.Background()); err != nil { otel.Handle(err) } }) @@ -213,10 +215,7 @@ func (p *TracerProvider) UnregisterSpanProcessor(s SpanProcessor) { // ForceFlush immediately exports all spans that have not yet been exported for // all the registered span processors. func (p *TracerProvider) ForceFlush(ctx context.Context) error { - spss, ok := p.spanProcessors.Load().(spanProcessorStates) - if !ok { - return fmt.Errorf("failed to load span processors") - } + spss := p.spanProcessors.Load().(spanProcessorStates) if len(spss) == 0 { return nil } @@ -235,12 +234,18 @@ func (p *TracerProvider) ForceFlush(ctx context.Context) error { return nil } -// Shutdown shuts down the span processors in the order they were registered. +// Shutdown shuts down TracerProvider. All registered span processors are shut down +// in the order they were registered and any held computational resources are released. func (p *TracerProvider) Shutdown(ctx context.Context) error { - spss, ok := p.spanProcessors.Load().(spanProcessorStates) - if !ok { - return fmt.Errorf("failed to load span processors") + spss := p.spanProcessors.Load().(spanProcessorStates) + if len(spss) == 0 { + return nil } + + p.mu.Lock() + defer p.mu.Unlock() + p.isShutdown = true + var retErr error for _, sps := range spss { select { @@ -262,6 +267,7 @@ func (p *TracerProvider) Shutdown(ctx context.Context) error { } } } + p.spanProcessors.Store(spanProcessorStates{}) return retErr } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go index a6dcf4b30..5ee9715d2 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go @@ -81,7 +81,7 @@ type traceIDRatioSampler struct { func (ts traceIDRatioSampler) ShouldSample(p SamplingParameters) SamplingResult { psc := trace.SpanContextFromContext(p.ParentContext) - x := binary.BigEndian.Uint64(p.TraceID[0:8]) >> 1 + x := binary.BigEndian.Uint64(p.TraceID[8:16]) >> 1 if x < ts.traceIDUpperBound { return SamplingResult{ Decision: RecordAndSample, @@ -163,10 +163,10 @@ func NeverSample() Sampler { // the root(Sampler) is used to make sampling decision. If the span has // a parent, depending on whether the parent is remote and whether it // is sampled, one of the following samplers will apply: -// - remoteParentSampled(Sampler) (default: AlwaysOn) -// - remoteParentNotSampled(Sampler) (default: AlwaysOff) -// - localParentSampled(Sampler) (default: AlwaysOn) -// - localParentNotSampled(Sampler) (default: AlwaysOff) +// - remoteParentSampled(Sampler) (default: AlwaysOn) +// - remoteParentNotSampled(Sampler) (default: AlwaysOff) +// - localParentSampled(Sampler) (default: AlwaysOn) +// - localParentNotSampled(Sampler) (default: AlwaysOff) func ParentBased(root Sampler, samplers ...ParentBasedSamplerOption) Sampler { return parentBased{ root: root, diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span.go b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span.go index 9760923f7..9fb483a99 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span.go @@ -30,7 +30,7 @@ import ( "go.opentelemetry.io/otel/sdk/instrumentation" "go.opentelemetry.io/otel/sdk/internal" "go.opentelemetry.io/otel/sdk/resource" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" "go.opentelemetry.io/otel/trace" ) @@ -313,26 +313,13 @@ func truncateAttr(limit int, attr attribute.KeyValue) attribute.KeyValue { return attr.Key.String(safeTruncate(v, limit)) } case attribute.STRINGSLICE: - // Do no mutate the original, make a copy. - trucated := attr.Key.StringSlice(attr.Value.AsStringSlice()) - // Do not do this. - // - // v := trucated.Value.AsStringSlice() - // cp := make([]string, len(v)) - // /* Copy and truncate values to cp ... */ - // trucated.Value = attribute.StringSliceValue(cp) - // - // Copying the []string and then assigning it back as a new value with - // attribute.StringSliceValue will copy the data twice. Instead, we - // already made a copy above that only this function owns, update the - // underlying slice data of our copy. - v := trucated.Value.AsStringSlice() + v := attr.Value.AsStringSlice() for i := range v { if len(v[i]) > limit { v[i] = safeTruncate(v[i], limit) } } - return trucated + return attr.Key.StringSlice(v) } return attr } @@ -396,14 +383,14 @@ func (s *recordingSpan) End(options ...trace.SpanEndOption) { defer panic(recovered) opts := []trace.EventOption{ trace.WithAttributes( - semconv.ExceptionTypeKey.String(typeStr(recovered)), - semconv.ExceptionMessageKey.String(fmt.Sprint(recovered)), + semconv.ExceptionType(typeStr(recovered)), + semconv.ExceptionMessage(fmt.Sprint(recovered)), ), } if config.StackTrace() { opts = append(opts, trace.WithAttributes( - semconv.ExceptionStacktraceKey.String(recordStackTrace()), + semconv.ExceptionStacktrace(recordStackTrace()), )) } @@ -423,14 +410,13 @@ func (s *recordingSpan) End(options ...trace.SpanEndOption) { } s.mu.Unlock() - if sps, ok := s.tracer.provider.spanProcessors.Load().(spanProcessorStates); ok { - if len(sps) == 0 { - return - } - snap := s.snapshot() - for _, sp := range sps { - sp.sp.OnEnd(snap) - } + sps := s.tracer.provider.spanProcessors.Load().(spanProcessorStates) + if len(sps) == 0 { + return + } + snap := s.snapshot() + for _, sp := range sps { + sp.sp.OnEnd(snap) } } @@ -444,14 +430,14 @@ func (s *recordingSpan) RecordError(err error, opts ...trace.EventOption) { } opts = append(opts, trace.WithAttributes( - semconv.ExceptionTypeKey.String(typeStr(err)), - semconv.ExceptionMessageKey.String(err.Error()), + semconv.ExceptionType(typeStr(err)), + semconv.ExceptionMessage(err.Error()), )) c := trace.NewEventConfig(opts...) if c.StackTrace() { opts = append(opts, trace.WithAttributes( - semconv.ExceptionStacktraceKey.String(recordStackTrace()), + semconv.ExceptionStacktrace(recordStackTrace()), )) } diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go index b649a2ff0..e6ae19352 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go @@ -64,4 +64,9 @@ type spanProcessorState struct { sp SpanProcessor state *sync.Once } + +func newSpanProcessorState(sp SpanProcessor) *spanProcessorState { + return &spanProcessorState{sp: sp, state: &sync.Once{}} +} + type spanProcessorStates []*spanProcessorState diff --git a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go index 7b11fc465..f17d924b8 100644 --- a/tools/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go +++ b/tools/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go @@ -51,7 +51,7 @@ func (tr *tracer) Start(ctx context.Context, name string, options ...trace.SpanS s := tr.newSpan(ctx, name, &config) if rw, ok := s.(ReadWriteSpan); ok && s.IsRecording() { - sps, _ := tr.provider.spanProcessors.Load().(spanProcessorStates) + sps := tr.provider.spanProcessors.Load().(spanProcessorStates) for _, sp := range sps { sp.sp.OnStart(ctx, rw) } diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/http.go b/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/http.go new file mode 100644 index 000000000..12d6b520f --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/http.go @@ -0,0 +1,404 @@ +// Copyright The OpenTelemetry 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 "go.opentelemetry.io/otel/semconv/internal/v2" + +import ( + "fmt" + "net/http" + "strings" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" +) + +// HTTPConv are the HTTP semantic convention attributes defined for a version +// of the OpenTelemetry specification. +type HTTPConv struct { + NetConv *NetConv + + EnduserIDKey attribute.Key + HTTPClientIPKey attribute.Key + HTTPFlavorKey attribute.Key + HTTPMethodKey attribute.Key + HTTPRequestContentLengthKey attribute.Key + HTTPResponseContentLengthKey attribute.Key + HTTPRouteKey attribute.Key + HTTPSchemeHTTP attribute.KeyValue + HTTPSchemeHTTPS attribute.KeyValue + HTTPStatusCodeKey attribute.Key + HTTPTargetKey attribute.Key + HTTPURLKey attribute.Key + HTTPUserAgentKey attribute.Key +} + +// ClientResponse returns attributes for an HTTP response received by a client +// from a server. The following attributes are returned if the related values +// are defined in resp: "http.status.code", "http.response_content_length". +// +// This does not add all OpenTelemetry required attributes for an HTTP event, +// it assumes ClientRequest was used to create the span with a complete set of +// attributes. If a complete set of attributes can be generated using the +// request contained in resp. For example: +// +// append(ClientResponse(resp), ClientRequest(resp.Request)...) +func (c *HTTPConv) ClientResponse(resp *http.Response) []attribute.KeyValue { + var n int + if resp.StatusCode > 0 { + n++ + } + if resp.ContentLength > 0 { + n++ + } + + attrs := make([]attribute.KeyValue, 0, n) + if resp.StatusCode > 0 { + attrs = append(attrs, c.HTTPStatusCodeKey.Int(resp.StatusCode)) + } + if resp.ContentLength > 0 { + attrs = append(attrs, c.HTTPResponseContentLengthKey.Int(int(resp.ContentLength))) + } + return attrs +} + +// ClientRequest returns attributes for an HTTP request made by a client. The +// following attributes are always returned: "http.url", "http.flavor", +// "http.method", "net.peer.name". The following attributes are returned if the +// related values are defined in req: "net.peer.port", "http.user_agent", +// "http.request_content_length", "enduser.id". +func (c *HTTPConv) ClientRequest(req *http.Request) []attribute.KeyValue { + n := 3 // URL, peer name, proto, and method. + var h string + if req.URL != nil { + h = req.URL.Host + } + peer, p := firstHostPort(h, req.Header.Get("Host")) + port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", p) + if port > 0 { + n++ + } + useragent := req.UserAgent() + if useragent != "" { + n++ + } + if req.ContentLength > 0 { + n++ + } + userID, _, hasUserID := req.BasicAuth() + if hasUserID { + n++ + } + attrs := make([]attribute.KeyValue, 0, n) + + attrs = append(attrs, c.method(req.Method)) + attrs = append(attrs, c.proto(req.Proto)) + + var u string + if req.URL != nil { + // Remove any username/password info that may be in the URL. + userinfo := req.URL.User + req.URL.User = nil + u = req.URL.String() + // Restore any username/password info that was removed. + req.URL.User = userinfo + } + attrs = append(attrs, c.HTTPURLKey.String(u)) + + attrs = append(attrs, c.NetConv.PeerName(peer)) + if port > 0 { + attrs = append(attrs, c.NetConv.PeerPort(port)) + } + + if useragent != "" { + attrs = append(attrs, c.HTTPUserAgentKey.String(useragent)) + } + + if l := req.ContentLength; l > 0 { + attrs = append(attrs, c.HTTPRequestContentLengthKey.Int64(l)) + } + + if hasUserID { + attrs = append(attrs, c.EnduserIDKey.String(userID)) + } + + return attrs +} + +// ServerRequest returns attributes for an HTTP request received by a server. +// +// The server must be the primary server name if it is known. For example this +// would be the ServerName directive +// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache +// server, and the server_name directive +// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an +// nginx server. More generically, the primary server name would be the host +// header value that matches the default virtual host of an HTTP server. It +// should include the host identifier and if a port is used to route to the +// server that port identifier should be included as an appropriate port +// suffix. +// +// If the primary server name is not known, server should be an empty string. +// The req Host will be used to determine the server instead. +// +// The following attributes are always returned: "http.method", "http.scheme", +// "http.flavor", "http.target", "net.host.name". The following attributes are +// returned if they related values are defined in req: "net.host.port", +// "net.sock.peer.addr", "net.sock.peer.port", "http.user_agent", "enduser.id", +// "http.client_ip". +func (c *HTTPConv) ServerRequest(server string, req *http.Request) []attribute.KeyValue { + // TODO: This currently does not add the specification required + // `http.target` attribute. It has too high of a cardinality to safely be + // added. An alternate should be added, or this comment removed, when it is + // addressed by the specification. If it is ultimately decided to continue + // not including the attribute, the HTTPTargetKey field of the HTTPConv + // should be removed as well. + + n := 4 // Method, scheme, proto, and host name. + var host string + var p int + if server == "" { + host, p = splitHostPort(req.Host) + } else { + // Prioritize the primary server name. + host, p = splitHostPort(server) + if p < 0 { + _, p = splitHostPort(req.Host) + } + } + hostPort := requiredHTTPPort(req.TLS != nil, p) + if hostPort > 0 { + n++ + } + peer, peerPort := splitHostPort(req.RemoteAddr) + if peer != "" { + n++ + if peerPort > 0 { + n++ + } + } + useragent := req.UserAgent() + if useragent != "" { + n++ + } + userID, _, hasUserID := req.BasicAuth() + if hasUserID { + n++ + } + clientIP := serverClientIP(req.Header.Get("X-Forwarded-For")) + if clientIP != "" { + n++ + } + attrs := make([]attribute.KeyValue, 0, n) + + attrs = append(attrs, c.method(req.Method)) + attrs = append(attrs, c.scheme(req.TLS != nil)) + attrs = append(attrs, c.proto(req.Proto)) + attrs = append(attrs, c.NetConv.HostName(host)) + + if hostPort > 0 { + attrs = append(attrs, c.NetConv.HostPort(hostPort)) + } + + if peer != "" { + // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a + // file-path that would be interpreted with a sock family. + attrs = append(attrs, c.NetConv.SockPeerAddr(peer)) + if peerPort > 0 { + attrs = append(attrs, c.NetConv.SockPeerPort(peerPort)) + } + } + + if useragent != "" { + attrs = append(attrs, c.HTTPUserAgentKey.String(useragent)) + } + + if hasUserID { + attrs = append(attrs, c.EnduserIDKey.String(userID)) + } + + if clientIP != "" { + attrs = append(attrs, c.HTTPClientIPKey.String(clientIP)) + } + + return attrs +} + +func (c *HTTPConv) method(method string) attribute.KeyValue { + if method == "" { + return c.HTTPMethodKey.String(http.MethodGet) + } + return c.HTTPMethodKey.String(method) +} + +func (c *HTTPConv) scheme(https bool) attribute.KeyValue { // nolint:revive + if https { + return c.HTTPSchemeHTTPS + } + return c.HTTPSchemeHTTP +} + +func (c *HTTPConv) proto(proto string) attribute.KeyValue { + switch proto { + case "HTTP/1.0": + return c.HTTPFlavorKey.String("1.0") + case "HTTP/1.1": + return c.HTTPFlavorKey.String("1.1") + case "HTTP/2": + return c.HTTPFlavorKey.String("2.0") + case "HTTP/3": + return c.HTTPFlavorKey.String("3.0") + default: + return c.HTTPFlavorKey.String(proto) + } +} + +func serverClientIP(xForwardedFor string) string { + if idx := strings.Index(xForwardedFor, ","); idx >= 0 { + xForwardedFor = xForwardedFor[:idx] + } + return xForwardedFor +} + +func requiredHTTPPort(https bool, port int) int { // nolint:revive + if https { + if port > 0 && port != 443 { + return port + } + } else { + if port > 0 && port != 80 { + return port + } + } + return -1 +} + +// Return the request host and port from the first non-empty source. +func firstHostPort(source ...string) (host string, port int) { + for _, hostport := range source { + host, port = splitHostPort(hostport) + if host != "" || port > 0 { + break + } + } + return +} + +// RequestHeader returns the contents of h as OpenTelemetry attributes. +func (c *HTTPConv) RequestHeader(h http.Header) []attribute.KeyValue { + return c.header("http.request.header", h) +} + +// ResponseHeader returns the contents of h as OpenTelemetry attributes. +func (c *HTTPConv) ResponseHeader(h http.Header) []attribute.KeyValue { + return c.header("http.response.header", h) +} + +func (c *HTTPConv) header(prefix string, h http.Header) []attribute.KeyValue { + key := func(k string) attribute.Key { + k = strings.ToLower(k) + k = strings.ReplaceAll(k, "-", "_") + k = fmt.Sprintf("%s.%s", prefix, k) + return attribute.Key(k) + } + + attrs := make([]attribute.KeyValue, 0, len(h)) + for k, v := range h { + attrs = append(attrs, key(k).StringSlice(v)) + } + return attrs +} + +// ClientStatus returns a span status code and message for an HTTP status code +// value received by a client. +func (c *HTTPConv) ClientStatus(code int) (codes.Code, string) { + stat, valid := validateHTTPStatusCode(code) + if !valid { + return stat, fmt.Sprintf("Invalid HTTP status code %d", code) + } + return stat, "" +} + +// ServerStatus returns a span status code and message for an HTTP status code +// value returned by a server. Status codes in the 400-499 range are not +// returned as errors. +func (c *HTTPConv) ServerStatus(code int) (codes.Code, string) { + stat, valid := validateHTTPStatusCode(code) + if !valid { + return stat, fmt.Sprintf("Invalid HTTP status code %d", code) + } + + if code/100 == 4 { + return codes.Unset, "" + } + return stat, "" +} + +type codeRange struct { + fromInclusive int + toInclusive int +} + +func (r codeRange) contains(code int) bool { + return r.fromInclusive <= code && code <= r.toInclusive +} + +var validRangesPerCategory = map[int][]codeRange{ + 1: { + {http.StatusContinue, http.StatusEarlyHints}, + }, + 2: { + {http.StatusOK, http.StatusAlreadyReported}, + {http.StatusIMUsed, http.StatusIMUsed}, + }, + 3: { + {http.StatusMultipleChoices, http.StatusUseProxy}, + {http.StatusTemporaryRedirect, http.StatusPermanentRedirect}, + }, + 4: { + {http.StatusBadRequest, http.StatusTeapot}, // yes, teapot is so useful… + {http.StatusMisdirectedRequest, http.StatusUpgradeRequired}, + {http.StatusPreconditionRequired, http.StatusTooManyRequests}, + {http.StatusRequestHeaderFieldsTooLarge, http.StatusRequestHeaderFieldsTooLarge}, + {http.StatusUnavailableForLegalReasons, http.StatusUnavailableForLegalReasons}, + }, + 5: { + {http.StatusInternalServerError, http.StatusLoopDetected}, + {http.StatusNotExtended, http.StatusNetworkAuthenticationRequired}, + }, +} + +// validateHTTPStatusCode validates the HTTP status code and returns +// corresponding span status code. If the `code` is not a valid HTTP status +// code, returns span status Error and false. +func validateHTTPStatusCode(code int) (codes.Code, bool) { + category := code / 100 + ranges, ok := validRangesPerCategory[category] + if !ok { + return codes.Error, false + } + ok = false + for _, crange := range ranges { + ok = crange.contains(code) + if ok { + break + } + } + if !ok { + return codes.Error, false + } + if category > 0 && category < 4 { + return codes.Unset, true + } + return codes.Error, true +} diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/net.go b/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/net.go new file mode 100644 index 000000000..4a711133a --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/internal/v2/net.go @@ -0,0 +1,324 @@ +// Copyright The OpenTelemetry 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 "go.opentelemetry.io/otel/semconv/internal/v2" + +import ( + "net" + "strconv" + "strings" + + "go.opentelemetry.io/otel/attribute" +) + +// NetConv are the network semantic convention attributes defined for a version +// of the OpenTelemetry specification. +type NetConv struct { + NetHostNameKey attribute.Key + NetHostPortKey attribute.Key + NetPeerNameKey attribute.Key + NetPeerPortKey attribute.Key + NetSockFamilyKey attribute.Key + NetSockPeerAddrKey attribute.Key + NetSockPeerPortKey attribute.Key + NetSockHostAddrKey attribute.Key + NetSockHostPortKey attribute.Key + NetTransportOther attribute.KeyValue + NetTransportTCP attribute.KeyValue + NetTransportUDP attribute.KeyValue + NetTransportInProc attribute.KeyValue +} + +func (c *NetConv) Transport(network string) attribute.KeyValue { + switch network { + case "tcp", "tcp4", "tcp6": + return c.NetTransportTCP + case "udp", "udp4", "udp6": + return c.NetTransportUDP + case "unix", "unixgram", "unixpacket": + return c.NetTransportInProc + default: + // "ip:*", "ip4:*", and "ip6:*" all are considered other. + return c.NetTransportOther + } +} + +// Host returns attributes for a network host address. +func (c *NetConv) Host(address string) []attribute.KeyValue { + h, p := splitHostPort(address) + var n int + if h != "" { + n++ + if p > 0 { + n++ + } + } + + if n == 0 { + return nil + } + + attrs := make([]attribute.KeyValue, 0, n) + attrs = append(attrs, c.HostName(h)) + if p > 0 { + attrs = append(attrs, c.HostPort(int(p))) + } + return attrs +} + +// Server returns attributes for a network listener listening at address. See +// net.Listen for information about acceptable address values, address should +// be the same as the one used to create ln. If ln is nil, only network host +// attributes will be returned that describe address. Otherwise, the socket +// level information about ln will also be included. +func (c *NetConv) Server(address string, ln net.Listener) []attribute.KeyValue { + if ln == nil { + return c.Host(address) + } + + lAddr := ln.Addr() + if lAddr == nil { + return c.Host(address) + } + + hostName, hostPort := splitHostPort(address) + sockHostAddr, sockHostPort := splitHostPort(lAddr.String()) + network := lAddr.Network() + sockFamily := family(network, sockHostAddr) + + n := nonZeroStr(hostName, network, sockHostAddr, sockFamily) + n += positiveInt(hostPort, sockHostPort) + attr := make([]attribute.KeyValue, 0, n) + if hostName != "" { + attr = append(attr, c.HostName(hostName)) + if hostPort > 0 { + // Only if net.host.name is set should net.host.port be. + attr = append(attr, c.HostPort(hostPort)) + } + } + if network != "" { + attr = append(attr, c.Transport(network)) + } + if sockFamily != "" { + attr = append(attr, c.NetSockFamilyKey.String(sockFamily)) + } + if sockHostAddr != "" { + attr = append(attr, c.NetSockHostAddrKey.String(sockHostAddr)) + if sockHostPort > 0 { + // Only if net.sock.host.addr is set should net.sock.host.port be. + attr = append(attr, c.NetSockHostPortKey.Int(sockHostPort)) + } + } + return attr +} + +func (c *NetConv) HostName(name string) attribute.KeyValue { + return c.NetHostNameKey.String(name) +} + +func (c *NetConv) HostPort(port int) attribute.KeyValue { + return c.NetHostPortKey.Int(port) +} + +// Client returns attributes for a client network connection to address. See +// net.Dial for information about acceptable address values, address should be +// the same as the one used to create conn. If conn is nil, only network peer +// attributes will be returned that describe address. Otherwise, the socket +// level information about conn will also be included. +func (c *NetConv) Client(address string, conn net.Conn) []attribute.KeyValue { + if conn == nil { + return c.Peer(address) + } + + lAddr, rAddr := conn.LocalAddr(), conn.RemoteAddr() + + var network string + switch { + case lAddr != nil: + network = lAddr.Network() + case rAddr != nil: + network = rAddr.Network() + default: + return c.Peer(address) + } + + peerName, peerPort := splitHostPort(address) + var ( + sockFamily string + sockPeerAddr string + sockPeerPort int + sockHostAddr string + sockHostPort int + ) + + if lAddr != nil { + sockHostAddr, sockHostPort = splitHostPort(lAddr.String()) + } + + if rAddr != nil { + sockPeerAddr, sockPeerPort = splitHostPort(rAddr.String()) + } + + switch { + case sockHostAddr != "": + sockFamily = family(network, sockHostAddr) + case sockPeerAddr != "": + sockFamily = family(network, sockPeerAddr) + } + + n := nonZeroStr(peerName, network, sockPeerAddr, sockHostAddr, sockFamily) + n += positiveInt(peerPort, sockPeerPort, sockHostPort) + attr := make([]attribute.KeyValue, 0, n) + if peerName != "" { + attr = append(attr, c.PeerName(peerName)) + if peerPort > 0 { + // Only if net.peer.name is set should net.peer.port be. + attr = append(attr, c.PeerPort(peerPort)) + } + } + if network != "" { + attr = append(attr, c.Transport(network)) + } + if sockFamily != "" { + attr = append(attr, c.NetSockFamilyKey.String(sockFamily)) + } + if sockPeerAddr != "" { + attr = append(attr, c.NetSockPeerAddrKey.String(sockPeerAddr)) + if sockPeerPort > 0 { + // Only if net.sock.peer.addr is set should net.sock.peer.port be. + attr = append(attr, c.NetSockPeerPortKey.Int(sockPeerPort)) + } + } + if sockHostAddr != "" { + attr = append(attr, c.NetSockHostAddrKey.String(sockHostAddr)) + if sockHostPort > 0 { + // Only if net.sock.host.addr is set should net.sock.host.port be. + attr = append(attr, c.NetSockHostPortKey.Int(sockHostPort)) + } + } + return attr +} + +func family(network, address string) string { + switch network { + case "unix", "unixgram", "unixpacket": + return "unix" + default: + if ip := net.ParseIP(address); ip != nil { + if ip.To4() == nil { + return "inet6" + } + return "inet" + } + } + return "" +} + +func nonZeroStr(strs ...string) int { + var n int + for _, str := range strs { + if str != "" { + n++ + } + } + return n +} + +func positiveInt(ints ...int) int { + var n int + for _, i := range ints { + if i > 0 { + n++ + } + } + return n +} + +// Peer returns attributes for a network peer address. +func (c *NetConv) Peer(address string) []attribute.KeyValue { + h, p := splitHostPort(address) + var n int + if h != "" { + n++ + if p > 0 { + n++ + } + } + + if n == 0 { + return nil + } + + attrs := make([]attribute.KeyValue, 0, n) + attrs = append(attrs, c.PeerName(h)) + if p > 0 { + attrs = append(attrs, c.PeerPort(int(p))) + } + return attrs +} + +func (c *NetConv) PeerName(name string) attribute.KeyValue { + return c.NetPeerNameKey.String(name) +} + +func (c *NetConv) PeerPort(port int) attribute.KeyValue { + return c.NetPeerPortKey.Int(port) +} + +func (c *NetConv) SockPeerAddr(addr string) attribute.KeyValue { + return c.NetSockPeerAddrKey.String(addr) +} + +func (c *NetConv) SockPeerPort(port int) attribute.KeyValue { + return c.NetSockPeerPortKey.Int(port) +} + +// splitHostPort splits a network address hostport of the form "host", +// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port", +// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and +// port. +// +// An empty host is returned if it is not provided or unparsable. A negative +// port is returned if it is not provided or unparsable. +func splitHostPort(hostport string) (host string, port int) { + port = -1 + + if strings.HasPrefix(hostport, "[") { + addrEnd := strings.LastIndex(hostport, "]") + if addrEnd < 0 { + // Invalid hostport. + return + } + if i := strings.LastIndex(hostport[addrEnd:], ":"); i < 0 { + host = hostport[1:addrEnd] + return + } + } else { + if i := strings.LastIndex(hostport, ":"); i < 0 { + host = hostport + return + } + } + + host, pStr, err := net.SplitHostPort(hostport) + if err != nil { + return + } + + p, err := strconv.ParseUint(pStr, 10, 16) + if err != nil { + return + } + return host, int(p) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/doc.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/doc.go new file mode 100644 index 000000000..71a1f7748 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/doc.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry 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 semconv implements OpenTelemetry semantic conventions. +// +// OpenTelemetry semantic conventions are agreed standardized naming +// patterns for OpenTelemetry things. This package represents the conventions +// as of the v1.17.0 version of the OpenTelemetry specification. +package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go new file mode 100644 index 000000000..679c40c4d --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go @@ -0,0 +1,199 @@ +// Copyright The OpenTelemetry 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 from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" + +import "go.opentelemetry.io/otel/attribute" + +// This semantic convention defines the attributes used to represent a feature +// flag evaluation as an event. +const ( + // FeatureFlagKeyKey is the attribute Key conforming to the + // "feature_flag.key" semantic conventions. It represents the unique + // identifier of the feature flag. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'logo-color' + FeatureFlagKeyKey = attribute.Key("feature_flag.key") + + // FeatureFlagProviderNameKey is the attribute Key conforming to the + // "feature_flag.provider_name" semantic conventions. It represents the + // name of the service provider that performs the flag evaluation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'Flag Manager' + FeatureFlagProviderNameKey = attribute.Key("feature_flag.provider_name") + + // FeatureFlagVariantKey is the attribute Key conforming to the + // "feature_flag.variant" semantic conventions. It represents the sHOULD be + // a semantic identifier for a value. If one is unavailable, a stringified + // version of the value can be used. + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'red', 'true', 'on' + // Note: A semantic identifier, commonly referred to as a variant, provides + // a means + // for referring to a value without including the value itself. This can + // provide additional context for understanding the meaning behind a value. + // For example, the variant `red` maybe be used for the value `#c05543`. + // + // A stringified version of the value can be used in situations where a + // semantic identifier is unavailable. String representation of the value + // should be determined by the implementer. + FeatureFlagVariantKey = attribute.Key("feature_flag.variant") +) + +// FeatureFlagKey returns an attribute KeyValue conforming to the +// "feature_flag.key" semantic conventions. It represents the unique identifier +// of the feature flag. +func FeatureFlagKey(val string) attribute.KeyValue { + return FeatureFlagKeyKey.String(val) +} + +// FeatureFlagProviderName returns an attribute KeyValue conforming to the +// "feature_flag.provider_name" semantic conventions. It represents the name of +// the service provider that performs the flag evaluation. +func FeatureFlagProviderName(val string) attribute.KeyValue { + return FeatureFlagProviderNameKey.String(val) +} + +// FeatureFlagVariant returns an attribute KeyValue conforming to the +// "feature_flag.variant" semantic conventions. It represents the sHOULD be a +// semantic identifier for a value. If one is unavailable, a stringified +// version of the value can be used. +func FeatureFlagVariant(val string) attribute.KeyValue { + return FeatureFlagVariantKey.String(val) +} + +// RPC received/sent message. +const ( + // MessageTypeKey is the attribute Key conforming to the "message.type" + // semantic conventions. It represents the whether this is a received or + // sent message. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + MessageTypeKey = attribute.Key("message.type") + + // MessageIDKey is the attribute Key conforming to the "message.id" + // semantic conventions. It represents the mUST be calculated as two + // different counters starting from `1` one for sent messages and one for + // received message. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Note: This way we guarantee that the values will be consistent between + // different implementations. + MessageIDKey = attribute.Key("message.id") + + // MessageCompressedSizeKey is the attribute Key conforming to the + // "message.compressed_size" semantic conventions. It represents the + // compressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + MessageCompressedSizeKey = attribute.Key("message.compressed_size") + + // MessageUncompressedSizeKey is the attribute Key conforming to the + // "message.uncompressed_size" semantic conventions. It represents the + // uncompressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + MessageUncompressedSizeKey = attribute.Key("message.uncompressed_size") +) + +var ( + // sent + MessageTypeSent = MessageTypeKey.String("SENT") + // received + MessageTypeReceived = MessageTypeKey.String("RECEIVED") +) + +// MessageID returns an attribute KeyValue conforming to the "message.id" +// semantic conventions. It represents the mUST be calculated as two different +// counters starting from `1` one for sent messages and one for received +// message. +func MessageID(val int) attribute.KeyValue { + return MessageIDKey.Int(val) +} + +// MessageCompressedSize returns an attribute KeyValue conforming to the +// "message.compressed_size" semantic conventions. It represents the compressed +// size of the message in bytes. +func MessageCompressedSize(val int) attribute.KeyValue { + return MessageCompressedSizeKey.Int(val) +} + +// MessageUncompressedSize returns an attribute KeyValue conforming to the +// "message.uncompressed_size" semantic conventions. It represents the +// uncompressed size of the message in bytes. +func MessageUncompressedSize(val int) attribute.KeyValue { + return MessageUncompressedSizeKey.Int(val) +} + +// The attributes used to report a single exception associated with a span. +const ( + // ExceptionEscapedKey is the attribute Key conforming to the + // "exception.escaped" semantic conventions. It represents the sHOULD be + // set to true if the exception event is recorded at a point where it is + // known that the exception is escaping the scope of the span. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + // Note: An exception is considered to have escaped (or left) the scope of + // a span, + // if that span is ended while the exception is still logically "in + // flight". + // This may be actually "in flight" in some languages (e.g. if the + // exception + // is passed to a Context manager's `__exit__` method in Python) but will + // usually be caught at the point of recording the exception in most + // languages. + // + // It is usually not possible to determine at the point where an exception + // is thrown + // whether it will escape the scope of a span. + // However, it is trivial to know that an exception + // will escape, if one checks for an active exception just before ending + // the span, + // as done in the [example above](#recording-an-exception). + // + // It follows that an exception may still escape the scope of the span + // even if the `exception.escaped` attribute was not set or set to false, + // since the event might have been recorded at a time where it was not + // clear whether the exception will escape. + ExceptionEscapedKey = attribute.Key("exception.escaped") +) + +// ExceptionEscaped returns an attribute KeyValue conforming to the +// "exception.escaped" semantic conventions. It represents the sHOULD be set to +// true if the exception event is recorded at a point where it is known that +// the exception is escaping the scope of the span. +func ExceptionEscaped(val bool) attribute.KeyValue { + return ExceptionEscapedKey.Bool(val) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/exception.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/exception.go new file mode 100644 index 000000000..9b8c559de --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/exception.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" + +const ( + // ExceptionEventName is the name of the Span event representing an exception. + ExceptionEventName = "exception" +) diff --git a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/md.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/http.go similarity index 71% rename from tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/md.go rename to tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/http.go index 90b8b835b..d5c4b5c13 100644 --- a/tools/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/md.go +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/http.go @@ -1,4 +1,4 @@ -// Copyright 2016 The etcd Authors +// Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,11 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package rpctypes +package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" +// HTTP scheme attributes. var ( - MetadataRequireLeaderKey = "hasleader" - MetadataHasLeader = "true" - - MetadataClientAPIVersionKey = "client-api-version" + HTTPSchemeHTTP = HTTPSchemeKey.String("http") + HTTPSchemeHTTPS = HTTPSchemeKey.String("https") ) diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/httpconv/http.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/httpconv/http.go new file mode 100644 index 000000000..c60b2a6bb --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/httpconv/http.go @@ -0,0 +1,150 @@ +// Copyright The OpenTelemetry 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 httpconv provides OpenTelemetry semantic convetions for the net/http +// package from the standard library. +package httpconv // import "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv" + +import ( + "net/http" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/semconv/internal/v2" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" +) + +var ( + nc = &internal.NetConv{ + NetHostNameKey: semconv.NetHostNameKey, + NetHostPortKey: semconv.NetHostPortKey, + NetPeerNameKey: semconv.NetPeerNameKey, + NetPeerPortKey: semconv.NetPeerPortKey, + NetSockPeerAddrKey: semconv.NetSockPeerAddrKey, + NetSockPeerPortKey: semconv.NetSockPeerPortKey, + NetTransportOther: semconv.NetTransportOther, + NetTransportTCP: semconv.NetTransportTCP, + NetTransportUDP: semconv.NetTransportUDP, + NetTransportInProc: semconv.NetTransportInProc, + } + + hc = &internal.HTTPConv{ + NetConv: nc, + + EnduserIDKey: semconv.EnduserIDKey, + HTTPClientIPKey: semconv.HTTPClientIPKey, + HTTPFlavorKey: semconv.HTTPFlavorKey, + HTTPMethodKey: semconv.HTTPMethodKey, + HTTPRequestContentLengthKey: semconv.HTTPRequestContentLengthKey, + HTTPResponseContentLengthKey: semconv.HTTPResponseContentLengthKey, + HTTPRouteKey: semconv.HTTPRouteKey, + HTTPSchemeHTTP: semconv.HTTPSchemeHTTP, + HTTPSchemeHTTPS: semconv.HTTPSchemeHTTPS, + HTTPStatusCodeKey: semconv.HTTPStatusCodeKey, + HTTPTargetKey: semconv.HTTPTargetKey, + HTTPURLKey: semconv.HTTPURLKey, + HTTPUserAgentKey: semconv.HTTPUserAgentKey, + } +) + +// ClientResponse returns attributes for an HTTP response received by a client +// from a server. It will return the following attributes if the related values +// are defined in resp: "http.status.code", "http.response_content_length". +// +// This does not add all OpenTelemetry required attributes for an HTTP event, +// it assumes ClientRequest was used to create the span with a complete set of +// attributes. If a complete set of attributes can be generated using the +// request contained in resp. For example: +// +// append(ClientResponse(resp), ClientRequest(resp.Request)...) +func ClientResponse(resp *http.Response) []attribute.KeyValue { + return hc.ClientResponse(resp) +} + +// ClientRequest returns attributes for an HTTP request made by a client. The +// following attributes are always returned: "http.url", "http.flavor", +// "http.method", "net.peer.name". The following attributes are returned if the +// related values are defined in req: "net.peer.port", "http.user_agent", +// "http.request_content_length", "enduser.id". +func ClientRequest(req *http.Request) []attribute.KeyValue { + return hc.ClientRequest(req) +} + +// ClientStatus returns a span status code and message for an HTTP status code +// value received by a client. +func ClientStatus(code int) (codes.Code, string) { + return hc.ClientStatus(code) +} + +// ServerRequest returns attributes for an HTTP request received by a server. +// +// The server must be the primary server name if it is known. For example this +// would be the ServerName directive +// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache +// server, and the server_name directive +// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an +// nginx server. More generically, the primary server name would be the host +// header value that matches the default virtual host of an HTTP server. It +// should include the host identifier and if a port is used to route to the +// server that port identifier should be included as an appropriate port +// suffix. +// +// If the primary server name is not known, server should be an empty string. +// The req Host will be used to determine the server instead. +// +// The following attributes are always returned: "http.method", "http.scheme", +// "http.flavor", "http.target", "net.host.name". The following attributes are +// returned if they related values are defined in req: "net.host.port", +// "net.sock.peer.addr", "net.sock.peer.port", "http.user_agent", "enduser.id", +// "http.client_ip". +func ServerRequest(server string, req *http.Request) []attribute.KeyValue { + return hc.ServerRequest(server, req) +} + +// ServerStatus returns a span status code and message for an HTTP status code +// value returned by a server. Status codes in the 400-499 range are not +// returned as errors. +func ServerStatus(code int) (codes.Code, string) { + return hc.ServerStatus(code) +} + +// RequestHeader returns the contents of h as attributes. +// +// Instrumentation should require an explicit configuration of which headers to +// captured and then prune what they pass here. Including all headers can be a +// security risk - explicit configuration helps avoid leaking sensitive +// information. +// +// The User-Agent header is already captured in the http.user_agent attribute +// from ClientRequest and ServerRequest. Instrumentation may provide an option +// to capture that header here even though it is not recommended. Otherwise, +// instrumentation should filter that out of what is passed. +func RequestHeader(h http.Header) []attribute.KeyValue { + return hc.RequestHeader(h) +} + +// ResponseHeader returns the contents of h as attributes. +// +// Instrumentation should require an explicit configuration of which headers to +// captured and then prune what they pass here. Including all headers can be a +// security risk - explicit configuration helps avoid leaking sensitive +// information. +// +// The User-Agent header is already captured in the http.user_agent attribute +// from ClientRequest and ServerRequest. Instrumentation may provide an option +// to capture that header here even though it is not recommended. Otherwise, +// instrumentation should filter that out of what is passed. +func ResponseHeader(h http.Header) []attribute.KeyValue { + return hc.ResponseHeader(h) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go new file mode 100644 index 000000000..39a2eab3a --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go @@ -0,0 +1,2010 @@ +// Copyright The OpenTelemetry 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 from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" + +import "go.opentelemetry.io/otel/attribute" + +// The web browser in which the application represented by the resource is +// running. The `browser.*` attributes MUST be used only for resources that +// represent applications running in a web browser (regardless of whether +// running on a mobile or desktop device). +const ( + // BrowserBrandsKey is the attribute Key conforming to the "browser.brands" + // semantic conventions. It represents the array of brand name and version + // separated by a space + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: ' Not A;Brand 99', 'Chromium 99', 'Chrome 99' + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.brands`). + BrowserBrandsKey = attribute.Key("browser.brands") + + // BrowserPlatformKey is the attribute Key conforming to the + // "browser.platform" semantic conventions. It represents the platform on + // which the browser is running + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Windows', 'macOS', 'Android' + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.platform`). If unavailable, the legacy + // `navigator.platform` API SHOULD NOT be used instead and this attribute + // SHOULD be left unset in order for the values to be consistent. + // The list of possible values is defined in the [W3C User-Agent Client + // Hints + // specification](https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform). + // Note that some (but not all) of these values can overlap with values in + // the [`os.type` and `os.name` attributes](./os.md). However, for + // consistency, the values in the `browser.platform` attribute should + // capture the exact value that the user agent provides. + BrowserPlatformKey = attribute.Key("browser.platform") + + // BrowserMobileKey is the attribute Key conforming to the "browser.mobile" + // semantic conventions. It represents a boolean that is true if the + // browser is running on a mobile device + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.mobile`). If unavailable, this attribute + // SHOULD be left unset. + BrowserMobileKey = attribute.Key("browser.mobile") + + // BrowserUserAgentKey is the attribute Key conforming to the + // "browser.user_agent" semantic conventions. It represents the full + // user-agent string provided by the browser + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) + // AppleWebKit/537.36 (KHTML, ' + // 'like Gecko) Chrome/95.0.4638.54 Safari/537.36' + // Note: The user-agent value SHOULD be provided only from browsers that do + // not have a mechanism to retrieve brands and platform individually from + // the User-Agent Client Hints API. To retrieve the value, the legacy + // `navigator.userAgent` API can be used. + BrowserUserAgentKey = attribute.Key("browser.user_agent") + + // BrowserLanguageKey is the attribute Key conforming to the + // "browser.language" semantic conventions. It represents the preferred + // language of the user using the browser + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'en', 'en-US', 'fr', 'fr-FR' + // Note: This value is intended to be taken from the Navigator API + // `navigator.language`. + BrowserLanguageKey = attribute.Key("browser.language") +) + +// BrowserBrands returns an attribute KeyValue conforming to the +// "browser.brands" semantic conventions. It represents the array of brand name +// and version separated by a space +func BrowserBrands(val ...string) attribute.KeyValue { + return BrowserBrandsKey.StringSlice(val) +} + +// BrowserPlatform returns an attribute KeyValue conforming to the +// "browser.platform" semantic conventions. It represents the platform on which +// the browser is running +func BrowserPlatform(val string) attribute.KeyValue { + return BrowserPlatformKey.String(val) +} + +// BrowserMobile returns an attribute KeyValue conforming to the +// "browser.mobile" semantic conventions. It represents a boolean that is true +// if the browser is running on a mobile device +func BrowserMobile(val bool) attribute.KeyValue { + return BrowserMobileKey.Bool(val) +} + +// BrowserUserAgent returns an attribute KeyValue conforming to the +// "browser.user_agent" semantic conventions. It represents the full user-agent +// string provided by the browser +func BrowserUserAgent(val string) attribute.KeyValue { + return BrowserUserAgentKey.String(val) +} + +// BrowserLanguage returns an attribute KeyValue conforming to the +// "browser.language" semantic conventions. It represents the preferred +// language of the user using the browser +func BrowserLanguage(val string) attribute.KeyValue { + return BrowserLanguageKey.String(val) +} + +// A cloud environment (e.g. GCP, Azure, AWS) +const ( + // CloudProviderKey is the attribute Key conforming to the "cloud.provider" + // semantic conventions. It represents the name of the cloud provider. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + CloudProviderKey = attribute.Key("cloud.provider") + + // CloudAccountIDKey is the attribute Key conforming to the + // "cloud.account.id" semantic conventions. It represents the cloud account + // ID the resource is assigned to. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '111111111111', 'opentelemetry' + CloudAccountIDKey = attribute.Key("cloud.account.id") + + // CloudRegionKey is the attribute Key conforming to the "cloud.region" + // semantic conventions. It represents the geographical region the resource + // is running. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'us-central1', 'us-east-1' + // Note: Refer to your provider's docs to see the available regions, for + // example [Alibaba Cloud + // regions](https://www.alibabacloud.com/help/doc-detail/40654.htm), [AWS + // regions](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/), + // [Azure + // regions](https://azure.microsoft.com/en-us/global-infrastructure/geographies/), + // [Google Cloud regions](https://cloud.google.com/about/locations), or + // [Tencent Cloud + // regions](https://intl.cloud.tencent.com/document/product/213/6091). + CloudRegionKey = attribute.Key("cloud.region") + + // CloudAvailabilityZoneKey is the attribute Key conforming to the + // "cloud.availability_zone" semantic conventions. It represents the cloud + // regions often have multiple, isolated locations known as zones to + // increase availability. Availability zone represents the zone where the + // resource is running. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'us-east-1c' + // Note: Availability zones are called "zones" on Alibaba Cloud and Google + // Cloud. + CloudAvailabilityZoneKey = attribute.Key("cloud.availability_zone") + + // CloudPlatformKey is the attribute Key conforming to the "cloud.platform" + // semantic conventions. It represents the cloud platform in use. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Note: The prefix of the service SHOULD match the one specified in + // `cloud.provider`. + CloudPlatformKey = attribute.Key("cloud.platform") +) + +var ( + // Alibaba Cloud + CloudProviderAlibabaCloud = CloudProviderKey.String("alibaba_cloud") + // Amazon Web Services + CloudProviderAWS = CloudProviderKey.String("aws") + // Microsoft Azure + CloudProviderAzure = CloudProviderKey.String("azure") + // Google Cloud Platform + CloudProviderGCP = CloudProviderKey.String("gcp") + // IBM Cloud + CloudProviderIbmCloud = CloudProviderKey.String("ibm_cloud") + // Tencent Cloud + CloudProviderTencentCloud = CloudProviderKey.String("tencent_cloud") +) + +var ( + // Alibaba Cloud Elastic Compute Service + CloudPlatformAlibabaCloudECS = CloudPlatformKey.String("alibaba_cloud_ecs") + // Alibaba Cloud Function Compute + CloudPlatformAlibabaCloudFc = CloudPlatformKey.String("alibaba_cloud_fc") + // Red Hat OpenShift on Alibaba Cloud + CloudPlatformAlibabaCloudOpenshift = CloudPlatformKey.String("alibaba_cloud_openshift") + // AWS Elastic Compute Cloud + CloudPlatformAWSEC2 = CloudPlatformKey.String("aws_ec2") + // AWS Elastic Container Service + CloudPlatformAWSECS = CloudPlatformKey.String("aws_ecs") + // AWS Elastic Kubernetes Service + CloudPlatformAWSEKS = CloudPlatformKey.String("aws_eks") + // AWS Lambda + CloudPlatformAWSLambda = CloudPlatformKey.String("aws_lambda") + // AWS Elastic Beanstalk + CloudPlatformAWSElasticBeanstalk = CloudPlatformKey.String("aws_elastic_beanstalk") + // AWS App Runner + CloudPlatformAWSAppRunner = CloudPlatformKey.String("aws_app_runner") + // Red Hat OpenShift on AWS (ROSA) + CloudPlatformAWSOpenshift = CloudPlatformKey.String("aws_openshift") + // Azure Virtual Machines + CloudPlatformAzureVM = CloudPlatformKey.String("azure_vm") + // Azure Container Instances + CloudPlatformAzureContainerInstances = CloudPlatformKey.String("azure_container_instances") + // Azure Kubernetes Service + CloudPlatformAzureAKS = CloudPlatformKey.String("azure_aks") + // Azure Functions + CloudPlatformAzureFunctions = CloudPlatformKey.String("azure_functions") + // Azure App Service + CloudPlatformAzureAppService = CloudPlatformKey.String("azure_app_service") + // Azure Red Hat OpenShift + CloudPlatformAzureOpenshift = CloudPlatformKey.String("azure_openshift") + // Google Cloud Compute Engine (GCE) + CloudPlatformGCPComputeEngine = CloudPlatformKey.String("gcp_compute_engine") + // Google Cloud Run + CloudPlatformGCPCloudRun = CloudPlatformKey.String("gcp_cloud_run") + // Google Cloud Kubernetes Engine (GKE) + CloudPlatformGCPKubernetesEngine = CloudPlatformKey.String("gcp_kubernetes_engine") + // Google Cloud Functions (GCF) + CloudPlatformGCPCloudFunctions = CloudPlatformKey.String("gcp_cloud_functions") + // Google Cloud App Engine (GAE) + CloudPlatformGCPAppEngine = CloudPlatformKey.String("gcp_app_engine") + // Red Hat OpenShift on Google Cloud + CloudPlatformGoogleCloudOpenshift = CloudPlatformKey.String("google_cloud_openshift") + // Red Hat OpenShift on IBM Cloud + CloudPlatformIbmCloudOpenshift = CloudPlatformKey.String("ibm_cloud_openshift") + // Tencent Cloud Cloud Virtual Machine (CVM) + CloudPlatformTencentCloudCvm = CloudPlatformKey.String("tencent_cloud_cvm") + // Tencent Cloud Elastic Kubernetes Service (EKS) + CloudPlatformTencentCloudEKS = CloudPlatformKey.String("tencent_cloud_eks") + // Tencent Cloud Serverless Cloud Function (SCF) + CloudPlatformTencentCloudScf = CloudPlatformKey.String("tencent_cloud_scf") +) + +// CloudAccountID returns an attribute KeyValue conforming to the +// "cloud.account.id" semantic conventions. It represents the cloud account ID +// the resource is assigned to. +func CloudAccountID(val string) attribute.KeyValue { + return CloudAccountIDKey.String(val) +} + +// CloudRegion returns an attribute KeyValue conforming to the +// "cloud.region" semantic conventions. It represents the geographical region +// the resource is running. +func CloudRegion(val string) attribute.KeyValue { + return CloudRegionKey.String(val) +} + +// CloudAvailabilityZone returns an attribute KeyValue conforming to the +// "cloud.availability_zone" semantic conventions. It represents the cloud +// regions often have multiple, isolated locations known as zones to increase +// availability. Availability zone represents the zone where the resource is +// running. +func CloudAvailabilityZone(val string) attribute.KeyValue { + return CloudAvailabilityZoneKey.String(val) +} + +// Resources used by AWS Elastic Container Service (ECS). +const ( + // AWSECSContainerARNKey is the attribute Key conforming to the + // "aws.ecs.container.arn" semantic conventions. It represents the Amazon + // Resource Name (ARN) of an [ECS container + // instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: + // 'arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9' + AWSECSContainerARNKey = attribute.Key("aws.ecs.container.arn") + + // AWSECSClusterARNKey is the attribute Key conforming to the + // "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an + // [ECS + // cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster' + AWSECSClusterARNKey = attribute.Key("aws.ecs.cluster.arn") + + // AWSECSLaunchtypeKey is the attribute Key conforming to the + // "aws.ecs.launchtype" semantic conventions. It represents the [launch + // type](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) + // for an ECS task. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + AWSECSLaunchtypeKey = attribute.Key("aws.ecs.launchtype") + + // AWSECSTaskARNKey is the attribute Key conforming to the + // "aws.ecs.task.arn" semantic conventions. It represents the ARN of an + // [ECS task + // definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: + // 'arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b' + AWSECSTaskARNKey = attribute.Key("aws.ecs.task.arn") + + // AWSECSTaskFamilyKey is the attribute Key conforming to the + // "aws.ecs.task.family" semantic conventions. It represents the task + // definition family this task definition is a member of. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry-family' + AWSECSTaskFamilyKey = attribute.Key("aws.ecs.task.family") + + // AWSECSTaskRevisionKey is the attribute Key conforming to the + // "aws.ecs.task.revision" semantic conventions. It represents the revision + // for this task definition. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '8', '26' + AWSECSTaskRevisionKey = attribute.Key("aws.ecs.task.revision") +) + +var ( + // ec2 + AWSECSLaunchtypeEC2 = AWSECSLaunchtypeKey.String("ec2") + // fargate + AWSECSLaunchtypeFargate = AWSECSLaunchtypeKey.String("fargate") +) + +// AWSECSContainerARN returns an attribute KeyValue conforming to the +// "aws.ecs.container.arn" semantic conventions. It represents the Amazon +// Resource Name (ARN) of an [ECS container +// instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html). +func AWSECSContainerARN(val string) attribute.KeyValue { + return AWSECSContainerARNKey.String(val) +} + +// AWSECSClusterARN returns an attribute KeyValue conforming to the +// "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an [ECS +// cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html). +func AWSECSClusterARN(val string) attribute.KeyValue { + return AWSECSClusterARNKey.String(val) +} + +// AWSECSTaskARN returns an attribute KeyValue conforming to the +// "aws.ecs.task.arn" semantic conventions. It represents the ARN of an [ECS +// task +// definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html). +func AWSECSTaskARN(val string) attribute.KeyValue { + return AWSECSTaskARNKey.String(val) +} + +// AWSECSTaskFamily returns an attribute KeyValue conforming to the +// "aws.ecs.task.family" semantic conventions. It represents the task +// definition family this task definition is a member of. +func AWSECSTaskFamily(val string) attribute.KeyValue { + return AWSECSTaskFamilyKey.String(val) +} + +// AWSECSTaskRevision returns an attribute KeyValue conforming to the +// "aws.ecs.task.revision" semantic conventions. It represents the revision for +// this task definition. +func AWSECSTaskRevision(val string) attribute.KeyValue { + return AWSECSTaskRevisionKey.String(val) +} + +// Resources used by AWS Elastic Kubernetes Service (EKS). +const ( + // AWSEKSClusterARNKey is the attribute Key conforming to the + // "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an + // EKS cluster. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster' + AWSEKSClusterARNKey = attribute.Key("aws.eks.cluster.arn") +) + +// AWSEKSClusterARN returns an attribute KeyValue conforming to the +// "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an EKS +// cluster. +func AWSEKSClusterARN(val string) attribute.KeyValue { + return AWSEKSClusterARNKey.String(val) +} + +// Resources specific to Amazon Web Services. +const ( + // AWSLogGroupNamesKey is the attribute Key conforming to the + // "aws.log.group.names" semantic conventions. It represents the name(s) of + // the AWS log group(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '/aws/lambda/my-function', 'opentelemetry-service' + // Note: Multiple log groups must be supported for cases like + // multi-container applications, where a single application has sidecar + // containers, and each write to their own log group. + AWSLogGroupNamesKey = attribute.Key("aws.log.group.names") + + // AWSLogGroupARNsKey is the attribute Key conforming to the + // "aws.log.group.arns" semantic conventions. It represents the Amazon + // Resource Name(s) (ARN) of the AWS log group(s). + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: + // 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*' + // Note: See the [log group ARN format + // documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). + AWSLogGroupARNsKey = attribute.Key("aws.log.group.arns") + + // AWSLogStreamNamesKey is the attribute Key conforming to the + // "aws.log.stream.names" semantic conventions. It represents the name(s) + // of the AWS log stream(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: 'logs/main/10838bed-421f-43ef-870a-f43feacbbb5b' + AWSLogStreamNamesKey = attribute.Key("aws.log.stream.names") + + // AWSLogStreamARNsKey is the attribute Key conforming to the + // "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of + // the AWS log stream(s). + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: + // 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b' + // Note: See the [log stream ARN format + // documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). + // One log group can contain several log streams, so these ARNs necessarily + // identify both a log group and a log stream. + AWSLogStreamARNsKey = attribute.Key("aws.log.stream.arns") +) + +// AWSLogGroupNames returns an attribute KeyValue conforming to the +// "aws.log.group.names" semantic conventions. It represents the name(s) of the +// AWS log group(s) an application is writing to. +func AWSLogGroupNames(val ...string) attribute.KeyValue { + return AWSLogGroupNamesKey.StringSlice(val) +} + +// AWSLogGroupARNs returns an attribute KeyValue conforming to the +// "aws.log.group.arns" semantic conventions. It represents the Amazon Resource +// Name(s) (ARN) of the AWS log group(s). +func AWSLogGroupARNs(val ...string) attribute.KeyValue { + return AWSLogGroupARNsKey.StringSlice(val) +} + +// AWSLogStreamNames returns an attribute KeyValue conforming to the +// "aws.log.stream.names" semantic conventions. It represents the name(s) of +// the AWS log stream(s) an application is writing to. +func AWSLogStreamNames(val ...string) attribute.KeyValue { + return AWSLogStreamNamesKey.StringSlice(val) +} + +// AWSLogStreamARNs returns an attribute KeyValue conforming to the +// "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of the +// AWS log stream(s). +func AWSLogStreamARNs(val ...string) attribute.KeyValue { + return AWSLogStreamARNsKey.StringSlice(val) +} + +// A container instance. +const ( + // ContainerNameKey is the attribute Key conforming to the "container.name" + // semantic conventions. It represents the container name used by container + // runtime. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry-autoconf' + ContainerNameKey = attribute.Key("container.name") + + // ContainerIDKey is the attribute Key conforming to the "container.id" + // semantic conventions. It represents the container ID. Usually a UUID, as + // for example used to [identify Docker + // containers](https://docs.docker.com/engine/reference/run/#container-identification). + // The UUID might be abbreviated. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'a3bf90e006b2' + ContainerIDKey = attribute.Key("container.id") + + // ContainerRuntimeKey is the attribute Key conforming to the + // "container.runtime" semantic conventions. It represents the container + // runtime managing this container. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'docker', 'containerd', 'rkt' + ContainerRuntimeKey = attribute.Key("container.runtime") + + // ContainerImageNameKey is the attribute Key conforming to the + // "container.image.name" semantic conventions. It represents the name of + // the image the container was built on. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'gcr.io/opentelemetry/operator' + ContainerImageNameKey = attribute.Key("container.image.name") + + // ContainerImageTagKey is the attribute Key conforming to the + // "container.image.tag" semantic conventions. It represents the container + // image tag. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '0.1' + ContainerImageTagKey = attribute.Key("container.image.tag") +) + +// ContainerName returns an attribute KeyValue conforming to the +// "container.name" semantic conventions. It represents the container name used +// by container runtime. +func ContainerName(val string) attribute.KeyValue { + return ContainerNameKey.String(val) +} + +// ContainerID returns an attribute KeyValue conforming to the +// "container.id" semantic conventions. It represents the container ID. Usually +// a UUID, as for example used to [identify Docker +// containers](https://docs.docker.com/engine/reference/run/#container-identification). +// The UUID might be abbreviated. +func ContainerID(val string) attribute.KeyValue { + return ContainerIDKey.String(val) +} + +// ContainerRuntime returns an attribute KeyValue conforming to the +// "container.runtime" semantic conventions. It represents the container +// runtime managing this container. +func ContainerRuntime(val string) attribute.KeyValue { + return ContainerRuntimeKey.String(val) +} + +// ContainerImageName returns an attribute KeyValue conforming to the +// "container.image.name" semantic conventions. It represents the name of the +// image the container was built on. +func ContainerImageName(val string) attribute.KeyValue { + return ContainerImageNameKey.String(val) +} + +// ContainerImageTag returns an attribute KeyValue conforming to the +// "container.image.tag" semantic conventions. It represents the container +// image tag. +func ContainerImageTag(val string) attribute.KeyValue { + return ContainerImageTagKey.String(val) +} + +// The software deployment. +const ( + // DeploymentEnvironmentKey is the attribute Key conforming to the + // "deployment.environment" semantic conventions. It represents the name of + // the [deployment + // environment](https://en.wikipedia.org/wiki/Deployment_environment) (aka + // deployment tier). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'staging', 'production' + DeploymentEnvironmentKey = attribute.Key("deployment.environment") +) + +// DeploymentEnvironment returns an attribute KeyValue conforming to the +// "deployment.environment" semantic conventions. It represents the name of the +// [deployment +// environment](https://en.wikipedia.org/wiki/Deployment_environment) (aka +// deployment tier). +func DeploymentEnvironment(val string) attribute.KeyValue { + return DeploymentEnvironmentKey.String(val) +} + +// The device on which the process represented by this resource is running. +const ( + // DeviceIDKey is the attribute Key conforming to the "device.id" semantic + // conventions. It represents a unique identifier representing the device + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2ab2916d-a51f-4ac8-80ee-45ac31a28092' + // Note: The device identifier MUST only be defined using the values + // outlined below. This value is not an advertising identifier and MUST NOT + // be used as such. On iOS (Swift or Objective-C), this value MUST be equal + // to the [vendor + // identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor). + // On Android (Java or Kotlin), this value MUST be equal to the Firebase + // Installation ID or a globally unique UUID which is persisted across + // sessions in your application. More information can be found + // [here](https://developer.android.com/training/articles/user-data-ids) on + // best practices and exact implementation details. Caution should be taken + // when storing personal data or anything which can identify a user. GDPR + // and data protection laws may apply, ensure you do your own due + // diligence. + DeviceIDKey = attribute.Key("device.id") + + // DeviceModelIdentifierKey is the attribute Key conforming to the + // "device.model.identifier" semantic conventions. It represents the model + // identifier for the device + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'iPhone3,4', 'SM-G920F' + // Note: It's recommended this value represents a machine readable version + // of the model identifier rather than the market or consumer-friendly name + // of the device. + DeviceModelIdentifierKey = attribute.Key("device.model.identifier") + + // DeviceModelNameKey is the attribute Key conforming to the + // "device.model.name" semantic conventions. It represents the marketing + // name for the device model + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'iPhone 6s Plus', 'Samsung Galaxy S6' + // Note: It's recommended this value represents a human readable version of + // the device model rather than a machine readable alternative. + DeviceModelNameKey = attribute.Key("device.model.name") + + // DeviceManufacturerKey is the attribute Key conforming to the + // "device.manufacturer" semantic conventions. It represents the name of + // the device manufacturer + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Apple', 'Samsung' + // Note: The Android OS provides this field via + // [Build](https://developer.android.com/reference/android/os/Build#MANUFACTURER). + // iOS apps SHOULD hardcode the value `Apple`. + DeviceManufacturerKey = attribute.Key("device.manufacturer") +) + +// DeviceID returns an attribute KeyValue conforming to the "device.id" +// semantic conventions. It represents a unique identifier representing the +// device +func DeviceID(val string) attribute.KeyValue { + return DeviceIDKey.String(val) +} + +// DeviceModelIdentifier returns an attribute KeyValue conforming to the +// "device.model.identifier" semantic conventions. It represents the model +// identifier for the device +func DeviceModelIdentifier(val string) attribute.KeyValue { + return DeviceModelIdentifierKey.String(val) +} + +// DeviceModelName returns an attribute KeyValue conforming to the +// "device.model.name" semantic conventions. It represents the marketing name +// for the device model +func DeviceModelName(val string) attribute.KeyValue { + return DeviceModelNameKey.String(val) +} + +// DeviceManufacturer returns an attribute KeyValue conforming to the +// "device.manufacturer" semantic conventions. It represents the name of the +// device manufacturer +func DeviceManufacturer(val string) attribute.KeyValue { + return DeviceManufacturerKey.String(val) +} + +// A serverless instance. +const ( + // FaaSNameKey is the attribute Key conforming to the "faas.name" semantic + // conventions. It represents the name of the single function that this + // runtime instance executes. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'my-function', 'myazurefunctionapp/some-function-name' + // Note: This is the name of the function as configured/deployed on the + // FaaS + // platform and is usually different from the name of the callback + // function (which may be stored in the + // [`code.namespace`/`code.function`](../../trace/semantic_conventions/span-general.md#source-code-attributes) + // span attributes). + // + // For some cloud providers, the above definition is ambiguous. The + // following + // definition of function name MUST be used for this attribute + // (and consequently the span name) for the listed cloud + // providers/products: + // + // * **Azure:** The full name `/`, i.e., function app name + // followed by a forward slash followed by the function name (this form + // can also be seen in the resource JSON for the function). + // This means that a span attribute MUST be used, as an Azure function + // app can host multiple functions that would usually share + // a TracerProvider (see also the `faas.id` attribute). + FaaSNameKey = attribute.Key("faas.name") + + // FaaSIDKey is the attribute Key conforming to the "faas.id" semantic + // conventions. It represents the unique ID of the single function that + // this runtime instance executes. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'arn:aws:lambda:us-west-2:123456789012:function:my-function' + // Note: On some cloud providers, it may not be possible to determine the + // full ID at startup, + // so consider setting `faas.id` as a span attribute instead. + // + // The exact value to use for `faas.id` depends on the cloud provider: + // + // * **AWS Lambda:** The function + // [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). + // Take care not to use the "invoked ARN" directly but replace any + // [alias + // suffix](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) + // with the resolved function version, as the same runtime instance may + // be invokable with + // multiple different aliases. + // * **GCP:** The [URI of the + // resource](https://cloud.google.com/iam/docs/full-resource-names) + // * **Azure:** The [Fully Qualified Resource + // ID](https://docs.microsoft.com/en-us/rest/api/resources/resources/get-by-id) + // of the invoked function, + // *not* the function app, having the form + // `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`. + // This means that a span attribute MUST be used, as an Azure function + // app can host multiple functions that would usually share + // a TracerProvider. + FaaSIDKey = attribute.Key("faas.id") + + // FaaSVersionKey is the attribute Key conforming to the "faas.version" + // semantic conventions. It represents the immutable version of the + // function being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '26', 'pinkfroid-00002' + // Note: Depending on the cloud provider and platform, use: + // + // * **AWS Lambda:** The [function + // version](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html) + // (an integer represented as a decimal string). + // * **Google Cloud Run:** The + // [revision](https://cloud.google.com/run/docs/managing/revisions) + // (i.e., the function name plus the revision suffix). + // * **Google Cloud Functions:** The value of the + // [`K_REVISION` environment + // variable](https://cloud.google.com/functions/docs/env-var#runtime_environment_variables_set_automatically). + // * **Azure Functions:** Not applicable. Do not set this attribute. + FaaSVersionKey = attribute.Key("faas.version") + + // FaaSInstanceKey is the attribute Key conforming to the "faas.instance" + // semantic conventions. It represents the execution environment ID as a + // string, that will be potentially reused for other invocations to the + // same function/function version. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de' + // Note: * **AWS Lambda:** Use the (full) log stream name. + FaaSInstanceKey = attribute.Key("faas.instance") + + // FaaSMaxMemoryKey is the attribute Key conforming to the + // "faas.max_memory" semantic conventions. It represents the amount of + // memory available to the serverless function in MiB. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 128 + // Note: It's recommended to set this attribute since e.g. too little + // memory can easily stop a Java AWS Lambda function from working + // correctly. On AWS Lambda, the environment variable + // `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` provides this information. + FaaSMaxMemoryKey = attribute.Key("faas.max_memory") +) + +// FaaSName returns an attribute KeyValue conforming to the "faas.name" +// semantic conventions. It represents the name of the single function that +// this runtime instance executes. +func FaaSName(val string) attribute.KeyValue { + return FaaSNameKey.String(val) +} + +// FaaSID returns an attribute KeyValue conforming to the "faas.id" semantic +// conventions. It represents the unique ID of the single function that this +// runtime instance executes. +func FaaSID(val string) attribute.KeyValue { + return FaaSIDKey.String(val) +} + +// FaaSVersion returns an attribute KeyValue conforming to the +// "faas.version" semantic conventions. It represents the immutable version of +// the function being executed. +func FaaSVersion(val string) attribute.KeyValue { + return FaaSVersionKey.String(val) +} + +// FaaSInstance returns an attribute KeyValue conforming to the +// "faas.instance" semantic conventions. It represents the execution +// environment ID as a string, that will be potentially reused for other +// invocations to the same function/function version. +func FaaSInstance(val string) attribute.KeyValue { + return FaaSInstanceKey.String(val) +} + +// FaaSMaxMemory returns an attribute KeyValue conforming to the +// "faas.max_memory" semantic conventions. It represents the amount of memory +// available to the serverless function in MiB. +func FaaSMaxMemory(val int) attribute.KeyValue { + return FaaSMaxMemoryKey.Int(val) +} + +// A host is defined as a general computing instance. +const ( + // HostIDKey is the attribute Key conforming to the "host.id" semantic + // conventions. It represents the unique host ID. For Cloud, this must be + // the instance_id assigned by the cloud provider. For non-containerized + // Linux systems, the `machine-id` located in `/etc/machine-id` or + // `/var/lib/dbus/machine-id` may be used. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'fdbf79e8af94cb7f9e8df36789187052' + HostIDKey = attribute.Key("host.id") + + // HostNameKey is the attribute Key conforming to the "host.name" semantic + // conventions. It represents the name of the host. On Unix systems, it may + // contain what the hostname command returns, or the fully qualified + // hostname, or another name specified by the user. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry-test' + HostNameKey = attribute.Key("host.name") + + // HostTypeKey is the attribute Key conforming to the "host.type" semantic + // conventions. It represents the type of host. For Cloud, this must be the + // machine type. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'n1-standard-1' + HostTypeKey = attribute.Key("host.type") + + // HostArchKey is the attribute Key conforming to the "host.arch" semantic + // conventions. It represents the CPU architecture the host system is + // running on. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + HostArchKey = attribute.Key("host.arch") + + // HostImageNameKey is the attribute Key conforming to the + // "host.image.name" semantic conventions. It represents the name of the VM + // image or OS install the host was instantiated from. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'infra-ami-eks-worker-node-7d4ec78312', 'CentOS-8-x86_64-1905' + HostImageNameKey = attribute.Key("host.image.name") + + // HostImageIDKey is the attribute Key conforming to the "host.image.id" + // semantic conventions. It represents the vM image ID. For Cloud, this + // value is from the provider. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'ami-07b06b442921831e5' + HostImageIDKey = attribute.Key("host.image.id") + + // HostImageVersionKey is the attribute Key conforming to the + // "host.image.version" semantic conventions. It represents the version + // string of the VM image as defined in [Version + // Attributes](README.md#version-attributes). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '0.1' + HostImageVersionKey = attribute.Key("host.image.version") +) + +var ( + // AMD64 + HostArchAMD64 = HostArchKey.String("amd64") + // ARM32 + HostArchARM32 = HostArchKey.String("arm32") + // ARM64 + HostArchARM64 = HostArchKey.String("arm64") + // Itanium + HostArchIA64 = HostArchKey.String("ia64") + // 32-bit PowerPC + HostArchPPC32 = HostArchKey.String("ppc32") + // 64-bit PowerPC + HostArchPPC64 = HostArchKey.String("ppc64") + // IBM z/Architecture + HostArchS390x = HostArchKey.String("s390x") + // 32-bit x86 + HostArchX86 = HostArchKey.String("x86") +) + +// HostID returns an attribute KeyValue conforming to the "host.id" semantic +// conventions. It represents the unique host ID. For Cloud, this must be the +// instance_id assigned by the cloud provider. For non-containerized Linux +// systems, the `machine-id` located in `/etc/machine-id` or +// `/var/lib/dbus/machine-id` may be used. +func HostID(val string) attribute.KeyValue { + return HostIDKey.String(val) +} + +// HostName returns an attribute KeyValue conforming to the "host.name" +// semantic conventions. It represents the name of the host. On Unix systems, +// it may contain what the hostname command returns, or the fully qualified +// hostname, or another name specified by the user. +func HostName(val string) attribute.KeyValue { + return HostNameKey.String(val) +} + +// HostType returns an attribute KeyValue conforming to the "host.type" +// semantic conventions. It represents the type of host. For Cloud, this must +// be the machine type. +func HostType(val string) attribute.KeyValue { + return HostTypeKey.String(val) +} + +// HostImageName returns an attribute KeyValue conforming to the +// "host.image.name" semantic conventions. It represents the name of the VM +// image or OS install the host was instantiated from. +func HostImageName(val string) attribute.KeyValue { + return HostImageNameKey.String(val) +} + +// HostImageID returns an attribute KeyValue conforming to the +// "host.image.id" semantic conventions. It represents the vM image ID. For +// Cloud, this value is from the provider. +func HostImageID(val string) attribute.KeyValue { + return HostImageIDKey.String(val) +} + +// HostImageVersion returns an attribute KeyValue conforming to the +// "host.image.version" semantic conventions. It represents the version string +// of the VM image as defined in [Version +// Attributes](README.md#version-attributes). +func HostImageVersion(val string) attribute.KeyValue { + return HostImageVersionKey.String(val) +} + +// A Kubernetes Cluster. +const ( + // K8SClusterNameKey is the attribute Key conforming to the + // "k8s.cluster.name" semantic conventions. It represents the name of the + // cluster. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry-cluster' + K8SClusterNameKey = attribute.Key("k8s.cluster.name") +) + +// K8SClusterName returns an attribute KeyValue conforming to the +// "k8s.cluster.name" semantic conventions. It represents the name of the +// cluster. +func K8SClusterName(val string) attribute.KeyValue { + return K8SClusterNameKey.String(val) +} + +// A Kubernetes Node object. +const ( + // K8SNodeNameKey is the attribute Key conforming to the "k8s.node.name" + // semantic conventions. It represents the name of the Node. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'node-1' + K8SNodeNameKey = attribute.Key("k8s.node.name") + + // K8SNodeUIDKey is the attribute Key conforming to the "k8s.node.uid" + // semantic conventions. It represents the UID of the Node. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1eb3a0c6-0477-4080-a9cb-0cb7db65c6a2' + K8SNodeUIDKey = attribute.Key("k8s.node.uid") +) + +// K8SNodeName returns an attribute KeyValue conforming to the +// "k8s.node.name" semantic conventions. It represents the name of the Node. +func K8SNodeName(val string) attribute.KeyValue { + return K8SNodeNameKey.String(val) +} + +// K8SNodeUID returns an attribute KeyValue conforming to the "k8s.node.uid" +// semantic conventions. It represents the UID of the Node. +func K8SNodeUID(val string) attribute.KeyValue { + return K8SNodeUIDKey.String(val) +} + +// A Kubernetes Namespace. +const ( + // K8SNamespaceNameKey is the attribute Key conforming to the + // "k8s.namespace.name" semantic conventions. It represents the name of the + // namespace that the pod is running in. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'default' + K8SNamespaceNameKey = attribute.Key("k8s.namespace.name") +) + +// K8SNamespaceName returns an attribute KeyValue conforming to the +// "k8s.namespace.name" semantic conventions. It represents the name of the +// namespace that the pod is running in. +func K8SNamespaceName(val string) attribute.KeyValue { + return K8SNamespaceNameKey.String(val) +} + +// A Kubernetes Pod object. +const ( + // K8SPodUIDKey is the attribute Key conforming to the "k8s.pod.uid" + // semantic conventions. It represents the UID of the Pod. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SPodUIDKey = attribute.Key("k8s.pod.uid") + + // K8SPodNameKey is the attribute Key conforming to the "k8s.pod.name" + // semantic conventions. It represents the name of the Pod. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry-pod-autoconf' + K8SPodNameKey = attribute.Key("k8s.pod.name") +) + +// K8SPodUID returns an attribute KeyValue conforming to the "k8s.pod.uid" +// semantic conventions. It represents the UID of the Pod. +func K8SPodUID(val string) attribute.KeyValue { + return K8SPodUIDKey.String(val) +} + +// K8SPodName returns an attribute KeyValue conforming to the "k8s.pod.name" +// semantic conventions. It represents the name of the Pod. +func K8SPodName(val string) attribute.KeyValue { + return K8SPodNameKey.String(val) +} + +// A container in a +// [PodTemplate](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates). +const ( + // K8SContainerNameKey is the attribute Key conforming to the + // "k8s.container.name" semantic conventions. It represents the name of the + // Container from Pod specification, must be unique within a Pod. Container + // runtime usually uses different globally unique name (`container.name`). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'redis' + K8SContainerNameKey = attribute.Key("k8s.container.name") + + // K8SContainerRestartCountKey is the attribute Key conforming to the + // "k8s.container.restart_count" semantic conventions. It represents the + // number of times the container was restarted. This attribute can be used + // to identify a particular container (running or stopped) within a + // container spec. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 0, 2 + K8SContainerRestartCountKey = attribute.Key("k8s.container.restart_count") +) + +// K8SContainerName returns an attribute KeyValue conforming to the +// "k8s.container.name" semantic conventions. It represents the name of the +// Container from Pod specification, must be unique within a Pod. Container +// runtime usually uses different globally unique name (`container.name`). +func K8SContainerName(val string) attribute.KeyValue { + return K8SContainerNameKey.String(val) +} + +// K8SContainerRestartCount returns an attribute KeyValue conforming to the +// "k8s.container.restart_count" semantic conventions. It represents the number +// of times the container was restarted. This attribute can be used to identify +// a particular container (running or stopped) within a container spec. +func K8SContainerRestartCount(val int) attribute.KeyValue { + return K8SContainerRestartCountKey.Int(val) +} + +// A Kubernetes ReplicaSet object. +const ( + // K8SReplicaSetUIDKey is the attribute Key conforming to the + // "k8s.replicaset.uid" semantic conventions. It represents the UID of the + // ReplicaSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SReplicaSetUIDKey = attribute.Key("k8s.replicaset.uid") + + // K8SReplicaSetNameKey is the attribute Key conforming to the + // "k8s.replicaset.name" semantic conventions. It represents the name of + // the ReplicaSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SReplicaSetNameKey = attribute.Key("k8s.replicaset.name") +) + +// K8SReplicaSetUID returns an attribute KeyValue conforming to the +// "k8s.replicaset.uid" semantic conventions. It represents the UID of the +// ReplicaSet. +func K8SReplicaSetUID(val string) attribute.KeyValue { + return K8SReplicaSetUIDKey.String(val) +} + +// K8SReplicaSetName returns an attribute KeyValue conforming to the +// "k8s.replicaset.name" semantic conventions. It represents the name of the +// ReplicaSet. +func K8SReplicaSetName(val string) attribute.KeyValue { + return K8SReplicaSetNameKey.String(val) +} + +// A Kubernetes Deployment object. +const ( + // K8SDeploymentUIDKey is the attribute Key conforming to the + // "k8s.deployment.uid" semantic conventions. It represents the UID of the + // Deployment. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SDeploymentUIDKey = attribute.Key("k8s.deployment.uid") + + // K8SDeploymentNameKey is the attribute Key conforming to the + // "k8s.deployment.name" semantic conventions. It represents the name of + // the Deployment. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SDeploymentNameKey = attribute.Key("k8s.deployment.name") +) + +// K8SDeploymentUID returns an attribute KeyValue conforming to the +// "k8s.deployment.uid" semantic conventions. It represents the UID of the +// Deployment. +func K8SDeploymentUID(val string) attribute.KeyValue { + return K8SDeploymentUIDKey.String(val) +} + +// K8SDeploymentName returns an attribute KeyValue conforming to the +// "k8s.deployment.name" semantic conventions. It represents the name of the +// Deployment. +func K8SDeploymentName(val string) attribute.KeyValue { + return K8SDeploymentNameKey.String(val) +} + +// A Kubernetes StatefulSet object. +const ( + // K8SStatefulSetUIDKey is the attribute Key conforming to the + // "k8s.statefulset.uid" semantic conventions. It represents the UID of the + // StatefulSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SStatefulSetUIDKey = attribute.Key("k8s.statefulset.uid") + + // K8SStatefulSetNameKey is the attribute Key conforming to the + // "k8s.statefulset.name" semantic conventions. It represents the name of + // the StatefulSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SStatefulSetNameKey = attribute.Key("k8s.statefulset.name") +) + +// K8SStatefulSetUID returns an attribute KeyValue conforming to the +// "k8s.statefulset.uid" semantic conventions. It represents the UID of the +// StatefulSet. +func K8SStatefulSetUID(val string) attribute.KeyValue { + return K8SStatefulSetUIDKey.String(val) +} + +// K8SStatefulSetName returns an attribute KeyValue conforming to the +// "k8s.statefulset.name" semantic conventions. It represents the name of the +// StatefulSet. +func K8SStatefulSetName(val string) attribute.KeyValue { + return K8SStatefulSetNameKey.String(val) +} + +// A Kubernetes DaemonSet object. +const ( + // K8SDaemonSetUIDKey is the attribute Key conforming to the + // "k8s.daemonset.uid" semantic conventions. It represents the UID of the + // DaemonSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SDaemonSetUIDKey = attribute.Key("k8s.daemonset.uid") + + // K8SDaemonSetNameKey is the attribute Key conforming to the + // "k8s.daemonset.name" semantic conventions. It represents the name of the + // DaemonSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SDaemonSetNameKey = attribute.Key("k8s.daemonset.name") +) + +// K8SDaemonSetUID returns an attribute KeyValue conforming to the +// "k8s.daemonset.uid" semantic conventions. It represents the UID of the +// DaemonSet. +func K8SDaemonSetUID(val string) attribute.KeyValue { + return K8SDaemonSetUIDKey.String(val) +} + +// K8SDaemonSetName returns an attribute KeyValue conforming to the +// "k8s.daemonset.name" semantic conventions. It represents the name of the +// DaemonSet. +func K8SDaemonSetName(val string) attribute.KeyValue { + return K8SDaemonSetNameKey.String(val) +} + +// A Kubernetes Job object. +const ( + // K8SJobUIDKey is the attribute Key conforming to the "k8s.job.uid" + // semantic conventions. It represents the UID of the Job. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SJobUIDKey = attribute.Key("k8s.job.uid") + + // K8SJobNameKey is the attribute Key conforming to the "k8s.job.name" + // semantic conventions. It represents the name of the Job. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SJobNameKey = attribute.Key("k8s.job.name") +) + +// K8SJobUID returns an attribute KeyValue conforming to the "k8s.job.uid" +// semantic conventions. It represents the UID of the Job. +func K8SJobUID(val string) attribute.KeyValue { + return K8SJobUIDKey.String(val) +} + +// K8SJobName returns an attribute KeyValue conforming to the "k8s.job.name" +// semantic conventions. It represents the name of the Job. +func K8SJobName(val string) attribute.KeyValue { + return K8SJobNameKey.String(val) +} + +// A Kubernetes CronJob object. +const ( + // K8SCronJobUIDKey is the attribute Key conforming to the + // "k8s.cronjob.uid" semantic conventions. It represents the UID of the + // CronJob. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SCronJobUIDKey = attribute.Key("k8s.cronjob.uid") + + // K8SCronJobNameKey is the attribute Key conforming to the + // "k8s.cronjob.name" semantic conventions. It represents the name of the + // CronJob. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + K8SCronJobNameKey = attribute.Key("k8s.cronjob.name") +) + +// K8SCronJobUID returns an attribute KeyValue conforming to the +// "k8s.cronjob.uid" semantic conventions. It represents the UID of the +// CronJob. +func K8SCronJobUID(val string) attribute.KeyValue { + return K8SCronJobUIDKey.String(val) +} + +// K8SCronJobName returns an attribute KeyValue conforming to the +// "k8s.cronjob.name" semantic conventions. It represents the name of the +// CronJob. +func K8SCronJobName(val string) attribute.KeyValue { + return K8SCronJobNameKey.String(val) +} + +// The operating system (OS) on which the process represented by this resource +// is running. +const ( + // OSTypeKey is the attribute Key conforming to the "os.type" semantic + // conventions. It represents the operating system type. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + OSTypeKey = attribute.Key("os.type") + + // OSDescriptionKey is the attribute Key conforming to the "os.description" + // semantic conventions. It represents the human readable (not intended to + // be parsed) OS version information, like e.g. reported by `ver` or + // `lsb_release -a` commands. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Microsoft Windows [Version 10.0.18363.778]', 'Ubuntu 18.04.1 + // LTS' + OSDescriptionKey = attribute.Key("os.description") + + // OSNameKey is the attribute Key conforming to the "os.name" semantic + // conventions. It represents the human readable operating system name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'iOS', 'Android', 'Ubuntu' + OSNameKey = attribute.Key("os.name") + + // OSVersionKey is the attribute Key conforming to the "os.version" + // semantic conventions. It represents the version string of the operating + // system as defined in [Version + // Attributes](../../resource/semantic_conventions/README.md#version-attributes). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '14.2.1', '18.04.1' + OSVersionKey = attribute.Key("os.version") +) + +var ( + // Microsoft Windows + OSTypeWindows = OSTypeKey.String("windows") + // Linux + OSTypeLinux = OSTypeKey.String("linux") + // Apple Darwin + OSTypeDarwin = OSTypeKey.String("darwin") + // FreeBSD + OSTypeFreeBSD = OSTypeKey.String("freebsd") + // NetBSD + OSTypeNetBSD = OSTypeKey.String("netbsd") + // OpenBSD + OSTypeOpenBSD = OSTypeKey.String("openbsd") + // DragonFly BSD + OSTypeDragonflyBSD = OSTypeKey.String("dragonflybsd") + // HP-UX (Hewlett Packard Unix) + OSTypeHPUX = OSTypeKey.String("hpux") + // AIX (Advanced Interactive eXecutive) + OSTypeAIX = OSTypeKey.String("aix") + // SunOS, Oracle Solaris + OSTypeSolaris = OSTypeKey.String("solaris") + // IBM z/OS + OSTypeZOS = OSTypeKey.String("z_os") +) + +// OSDescription returns an attribute KeyValue conforming to the +// "os.description" semantic conventions. It represents the human readable (not +// intended to be parsed) OS version information, like e.g. reported by `ver` +// or `lsb_release -a` commands. +func OSDescription(val string) attribute.KeyValue { + return OSDescriptionKey.String(val) +} + +// OSName returns an attribute KeyValue conforming to the "os.name" semantic +// conventions. It represents the human readable operating system name. +func OSName(val string) attribute.KeyValue { + return OSNameKey.String(val) +} + +// OSVersion returns an attribute KeyValue conforming to the "os.version" +// semantic conventions. It represents the version string of the operating +// system as defined in [Version +// Attributes](../../resource/semantic_conventions/README.md#version-attributes). +func OSVersion(val string) attribute.KeyValue { + return OSVersionKey.String(val) +} + +// An operating system process. +const ( + // ProcessPIDKey is the attribute Key conforming to the "process.pid" + // semantic conventions. It represents the process identifier (PID). + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 1234 + ProcessPIDKey = attribute.Key("process.pid") + + // ProcessParentPIDKey is the attribute Key conforming to the + // "process.parent_pid" semantic conventions. It represents the parent + // Process identifier (PID). + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 111 + ProcessParentPIDKey = attribute.Key("process.parent_pid") + + // ProcessExecutableNameKey is the attribute Key conforming to the + // "process.executable.name" semantic conventions. It represents the name + // of the process executable. On Linux based systems, can be set to the + // `Name` in `proc/[pid]/status`. On Windows, can be set to the base name + // of `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: ConditionallyRequired (See alternative attributes + // below.) + // Stability: stable + // Examples: 'otelcol' + ProcessExecutableNameKey = attribute.Key("process.executable.name") + + // ProcessExecutablePathKey is the attribute Key conforming to the + // "process.executable.path" semantic conventions. It represents the full + // path to the process executable. On Linux based systems, can be set to + // the target of `proc/[pid]/exe`. On Windows, can be set to the result of + // `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: ConditionallyRequired (See alternative attributes + // below.) + // Stability: stable + // Examples: '/usr/bin/cmd/otelcol' + ProcessExecutablePathKey = attribute.Key("process.executable.path") + + // ProcessCommandKey is the attribute Key conforming to the + // "process.command" semantic conventions. It represents the command used + // to launch the process (i.e. the command name). On Linux based systems, + // can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can + // be set to the first parameter extracted from `GetCommandLineW`. + // + // Type: string + // RequirementLevel: ConditionallyRequired (See alternative attributes + // below.) + // Stability: stable + // Examples: 'cmd/otelcol' + ProcessCommandKey = attribute.Key("process.command") + + // ProcessCommandLineKey is the attribute Key conforming to the + // "process.command_line" semantic conventions. It represents the full + // command used to launch the process as a single string representing the + // full command. On Windows, can be set to the result of `GetCommandLineW`. + // Do not set this if you have to assemble it just for monitoring; use + // `process.command_args` instead. + // + // Type: string + // RequirementLevel: ConditionallyRequired (See alternative attributes + // below.) + // Stability: stable + // Examples: 'C:\\cmd\\otecol --config="my directory\\config.yaml"' + ProcessCommandLineKey = attribute.Key("process.command_line") + + // ProcessCommandArgsKey is the attribute Key conforming to the + // "process.command_args" semantic conventions. It represents the all the + // command arguments (including the command/executable itself) as received + // by the process. On Linux-based systems (and some other Unixoid systems + // supporting procfs), can be set according to the list of null-delimited + // strings extracted from `proc/[pid]/cmdline`. For libc-based executables, + // this would be the full argv vector passed to `main`. + // + // Type: string[] + // RequirementLevel: ConditionallyRequired (See alternative attributes + // below.) + // Stability: stable + // Examples: 'cmd/otecol', '--config=config.yaml' + ProcessCommandArgsKey = attribute.Key("process.command_args") + + // ProcessOwnerKey is the attribute Key conforming to the "process.owner" + // semantic conventions. It represents the username of the user that owns + // the process. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'root' + ProcessOwnerKey = attribute.Key("process.owner") +) + +// ProcessPID returns an attribute KeyValue conforming to the "process.pid" +// semantic conventions. It represents the process identifier (PID). +func ProcessPID(val int) attribute.KeyValue { + return ProcessPIDKey.Int(val) +} + +// ProcessParentPID returns an attribute KeyValue conforming to the +// "process.parent_pid" semantic conventions. It represents the parent Process +// identifier (PID). +func ProcessParentPID(val int) attribute.KeyValue { + return ProcessParentPIDKey.Int(val) +} + +// ProcessExecutableName returns an attribute KeyValue conforming to the +// "process.executable.name" semantic conventions. It represents the name of +// the process executable. On Linux based systems, can be set to the `Name` in +// `proc/[pid]/status`. On Windows, can be set to the base name of +// `GetProcessImageFileNameW`. +func ProcessExecutableName(val string) attribute.KeyValue { + return ProcessExecutableNameKey.String(val) +} + +// ProcessExecutablePath returns an attribute KeyValue conforming to the +// "process.executable.path" semantic conventions. It represents the full path +// to the process executable. On Linux based systems, can be set to the target +// of `proc/[pid]/exe`. On Windows, can be set to the result of +// `GetProcessImageFileNameW`. +func ProcessExecutablePath(val string) attribute.KeyValue { + return ProcessExecutablePathKey.String(val) +} + +// ProcessCommand returns an attribute KeyValue conforming to the +// "process.command" semantic conventions. It represents the command used to +// launch the process (i.e. the command name). On Linux based systems, can be +// set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to +// the first parameter extracted from `GetCommandLineW`. +func ProcessCommand(val string) attribute.KeyValue { + return ProcessCommandKey.String(val) +} + +// ProcessCommandLine returns an attribute KeyValue conforming to the +// "process.command_line" semantic conventions. It represents the full command +// used to launch the process as a single string representing the full command. +// On Windows, can be set to the result of `GetCommandLineW`. Do not set this +// if you have to assemble it just for monitoring; use `process.command_args` +// instead. +func ProcessCommandLine(val string) attribute.KeyValue { + return ProcessCommandLineKey.String(val) +} + +// ProcessCommandArgs returns an attribute KeyValue conforming to the +// "process.command_args" semantic conventions. It represents the all the +// command arguments (including the command/executable itself) as received by +// the process. On Linux-based systems (and some other Unixoid systems +// supporting procfs), can be set according to the list of null-delimited +// strings extracted from `proc/[pid]/cmdline`. For libc-based executables, +// this would be the full argv vector passed to `main`. +func ProcessCommandArgs(val ...string) attribute.KeyValue { + return ProcessCommandArgsKey.StringSlice(val) +} + +// ProcessOwner returns an attribute KeyValue conforming to the +// "process.owner" semantic conventions. It represents the username of the user +// that owns the process. +func ProcessOwner(val string) attribute.KeyValue { + return ProcessOwnerKey.String(val) +} + +// The single (language) runtime instance which is monitored. +const ( + // ProcessRuntimeNameKey is the attribute Key conforming to the + // "process.runtime.name" semantic conventions. It represents the name of + // the runtime of this process. For compiled native binaries, this SHOULD + // be the name of the compiler. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'OpenJDK Runtime Environment' + ProcessRuntimeNameKey = attribute.Key("process.runtime.name") + + // ProcessRuntimeVersionKey is the attribute Key conforming to the + // "process.runtime.version" semantic conventions. It represents the + // version of the runtime of this process, as returned by the runtime + // without modification. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '14.0.2' + ProcessRuntimeVersionKey = attribute.Key("process.runtime.version") + + // ProcessRuntimeDescriptionKey is the attribute Key conforming to the + // "process.runtime.description" semantic conventions. It represents an + // additional description about the runtime of the process, for example a + // specific vendor customization of the runtime environment. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0' + ProcessRuntimeDescriptionKey = attribute.Key("process.runtime.description") +) + +// ProcessRuntimeName returns an attribute KeyValue conforming to the +// "process.runtime.name" semantic conventions. It represents the name of the +// runtime of this process. For compiled native binaries, this SHOULD be the +// name of the compiler. +func ProcessRuntimeName(val string) attribute.KeyValue { + return ProcessRuntimeNameKey.String(val) +} + +// ProcessRuntimeVersion returns an attribute KeyValue conforming to the +// "process.runtime.version" semantic conventions. It represents the version of +// the runtime of this process, as returned by the runtime without +// modification. +func ProcessRuntimeVersion(val string) attribute.KeyValue { + return ProcessRuntimeVersionKey.String(val) +} + +// ProcessRuntimeDescription returns an attribute KeyValue conforming to the +// "process.runtime.description" semantic conventions. It represents an +// additional description about the runtime of the process, for example a +// specific vendor customization of the runtime environment. +func ProcessRuntimeDescription(val string) attribute.KeyValue { + return ProcessRuntimeDescriptionKey.String(val) +} + +// A service instance. +const ( + // ServiceNameKey is the attribute Key conforming to the "service.name" + // semantic conventions. It represents the logical name of the service. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'shoppingcart' + // Note: MUST be the same for all instances of horizontally scaled + // services. If the value was not specified, SDKs MUST fallback to + // `unknown_service:` concatenated with + // [`process.executable.name`](process.md#process), e.g. + // `unknown_service:bash`. If `process.executable.name` is not available, + // the value MUST be set to `unknown_service`. + ServiceNameKey = attribute.Key("service.name") + + // ServiceNamespaceKey is the attribute Key conforming to the + // "service.namespace" semantic conventions. It represents a namespace for + // `service.name`. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Shop' + // Note: A string value having a meaning that helps to distinguish a group + // of services, for example the team name that owns a group of services. + // `service.name` is expected to be unique within the same namespace. If + // `service.namespace` is not specified in the Resource then `service.name` + // is expected to be unique for all services that have no explicit + // namespace defined (so the empty/unspecified namespace is simply one more + // valid namespace). Zero-length namespace string is assumed equal to + // unspecified namespace. + ServiceNamespaceKey = attribute.Key("service.namespace") + + // ServiceInstanceIDKey is the attribute Key conforming to the + // "service.instance.id" semantic conventions. It represents the string ID + // of the service instance. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '627cc493-f310-47de-96bd-71410b7dec09' + // Note: MUST be unique for each instance of the same + // `service.namespace,service.name` pair (in other words + // `service.namespace,service.name,service.instance.id` triplet MUST be + // globally unique). The ID helps to distinguish instances of the same + // service that exist at the same time (e.g. instances of a horizontally + // scaled service). It is preferable for the ID to be persistent and stay + // the same for the lifetime of the service instance, however it is + // acceptable that the ID is ephemeral and changes during important + // lifetime events for the service (e.g. service restarts). If the service + // has no inherent unique ID that can be used as the value of this + // attribute it is recommended to generate a random Version 1 or Version 4 + // RFC 4122 UUID (services aiming for reproducible UUIDs may also use + // Version 5, see RFC 4122 for more recommendations). + ServiceInstanceIDKey = attribute.Key("service.instance.id") + + // ServiceVersionKey is the attribute Key conforming to the + // "service.version" semantic conventions. It represents the version string + // of the service API or implementation. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2.0.0' + ServiceVersionKey = attribute.Key("service.version") +) + +// ServiceName returns an attribute KeyValue conforming to the +// "service.name" semantic conventions. It represents the logical name of the +// service. +func ServiceName(val string) attribute.KeyValue { + return ServiceNameKey.String(val) +} + +// ServiceNamespace returns an attribute KeyValue conforming to the +// "service.namespace" semantic conventions. It represents a namespace for +// `service.name`. +func ServiceNamespace(val string) attribute.KeyValue { + return ServiceNamespaceKey.String(val) +} + +// ServiceInstanceID returns an attribute KeyValue conforming to the +// "service.instance.id" semantic conventions. It represents the string ID of +// the service instance. +func ServiceInstanceID(val string) attribute.KeyValue { + return ServiceInstanceIDKey.String(val) +} + +// ServiceVersion returns an attribute KeyValue conforming to the +// "service.version" semantic conventions. It represents the version string of +// the service API or implementation. +func ServiceVersion(val string) attribute.KeyValue { + return ServiceVersionKey.String(val) +} + +// The telemetry SDK used to capture data recorded by the instrumentation +// libraries. +const ( + // TelemetrySDKNameKey is the attribute Key conforming to the + // "telemetry.sdk.name" semantic conventions. It represents the name of the + // telemetry SDK as defined above. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'opentelemetry' + TelemetrySDKNameKey = attribute.Key("telemetry.sdk.name") + + // TelemetrySDKLanguageKey is the attribute Key conforming to the + // "telemetry.sdk.language" semantic conventions. It represents the + // language of the telemetry SDK. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + TelemetrySDKLanguageKey = attribute.Key("telemetry.sdk.language") + + // TelemetrySDKVersionKey is the attribute Key conforming to the + // "telemetry.sdk.version" semantic conventions. It represents the version + // string of the telemetry SDK. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.2.3' + TelemetrySDKVersionKey = attribute.Key("telemetry.sdk.version") + + // TelemetryAutoVersionKey is the attribute Key conforming to the + // "telemetry.auto.version" semantic conventions. It represents the version + // string of the auto instrumentation agent, if used. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.2.3' + TelemetryAutoVersionKey = attribute.Key("telemetry.auto.version") +) + +var ( + // cpp + TelemetrySDKLanguageCPP = TelemetrySDKLanguageKey.String("cpp") + // dotnet + TelemetrySDKLanguageDotnet = TelemetrySDKLanguageKey.String("dotnet") + // erlang + TelemetrySDKLanguageErlang = TelemetrySDKLanguageKey.String("erlang") + // go + TelemetrySDKLanguageGo = TelemetrySDKLanguageKey.String("go") + // java + TelemetrySDKLanguageJava = TelemetrySDKLanguageKey.String("java") + // nodejs + TelemetrySDKLanguageNodejs = TelemetrySDKLanguageKey.String("nodejs") + // php + TelemetrySDKLanguagePHP = TelemetrySDKLanguageKey.String("php") + // python + TelemetrySDKLanguagePython = TelemetrySDKLanguageKey.String("python") + // ruby + TelemetrySDKLanguageRuby = TelemetrySDKLanguageKey.String("ruby") + // webjs + TelemetrySDKLanguageWebjs = TelemetrySDKLanguageKey.String("webjs") + // swift + TelemetrySDKLanguageSwift = TelemetrySDKLanguageKey.String("swift") +) + +// TelemetrySDKName returns an attribute KeyValue conforming to the +// "telemetry.sdk.name" semantic conventions. It represents the name of the +// telemetry SDK as defined above. +func TelemetrySDKName(val string) attribute.KeyValue { + return TelemetrySDKNameKey.String(val) +} + +// TelemetrySDKVersion returns an attribute KeyValue conforming to the +// "telemetry.sdk.version" semantic conventions. It represents the version +// string of the telemetry SDK. +func TelemetrySDKVersion(val string) attribute.KeyValue { + return TelemetrySDKVersionKey.String(val) +} + +// TelemetryAutoVersion returns an attribute KeyValue conforming to the +// "telemetry.auto.version" semantic conventions. It represents the version +// string of the auto instrumentation agent, if used. +func TelemetryAutoVersion(val string) attribute.KeyValue { + return TelemetryAutoVersionKey.String(val) +} + +// Resource describing the packaged software running the application code. Web +// engines are typically executed using process.runtime. +const ( + // WebEngineNameKey is the attribute Key conforming to the "webengine.name" + // semantic conventions. It represents the name of the web engine. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'WildFly' + WebEngineNameKey = attribute.Key("webengine.name") + + // WebEngineVersionKey is the attribute Key conforming to the + // "webengine.version" semantic conventions. It represents the version of + // the web engine. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '21.0.0' + WebEngineVersionKey = attribute.Key("webengine.version") + + // WebEngineDescriptionKey is the attribute Key conforming to the + // "webengine.description" semantic conventions. It represents the + // additional description of the web engine (e.g. detailed version and + // edition information). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - + // 2.2.2.Final' + WebEngineDescriptionKey = attribute.Key("webengine.description") +) + +// WebEngineName returns an attribute KeyValue conforming to the +// "webengine.name" semantic conventions. It represents the name of the web +// engine. +func WebEngineName(val string) attribute.KeyValue { + return WebEngineNameKey.String(val) +} + +// WebEngineVersion returns an attribute KeyValue conforming to the +// "webengine.version" semantic conventions. It represents the version of the +// web engine. +func WebEngineVersion(val string) attribute.KeyValue { + return WebEngineVersionKey.String(val) +} + +// WebEngineDescription returns an attribute KeyValue conforming to the +// "webengine.description" semantic conventions. It represents the additional +// description of the web engine (e.g. detailed version and edition +// information). +func WebEngineDescription(val string) attribute.KeyValue { + return WebEngineDescriptionKey.String(val) +} + +// Attributes used by non-OTLP exporters to represent OpenTelemetry Scope's +// concepts. +const ( + // OtelScopeNameKey is the attribute Key conforming to the + // "otel.scope.name" semantic conventions. It represents the name of the + // instrumentation scope - (`InstrumentationScope.Name` in OTLP). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'io.opentelemetry.contrib.mongodb' + OtelScopeNameKey = attribute.Key("otel.scope.name") + + // OtelScopeVersionKey is the attribute Key conforming to the + // "otel.scope.version" semantic conventions. It represents the version of + // the instrumentation scope - (`InstrumentationScope.Version` in OTLP). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.0.0' + OtelScopeVersionKey = attribute.Key("otel.scope.version") +) + +// OtelScopeName returns an attribute KeyValue conforming to the +// "otel.scope.name" semantic conventions. It represents the name of the +// instrumentation scope - (`InstrumentationScope.Name` in OTLP). +func OtelScopeName(val string) attribute.KeyValue { + return OtelScopeNameKey.String(val) +} + +// OtelScopeVersion returns an attribute KeyValue conforming to the +// "otel.scope.version" semantic conventions. It represents the version of the +// instrumentation scope - (`InstrumentationScope.Version` in OTLP). +func OtelScopeVersion(val string) attribute.KeyValue { + return OtelScopeVersionKey.String(val) +} + +// Span attributes used by non-OTLP exporters to represent OpenTelemetry +// Scope's concepts. +const ( + // OtelLibraryNameKey is the attribute Key conforming to the + // "otel.library.name" semantic conventions. It represents the deprecated, + // use the `otel.scope.name` attribute. + // + // Type: string + // RequirementLevel: Optional + // Stability: deprecated + // Examples: 'io.opentelemetry.contrib.mongodb' + OtelLibraryNameKey = attribute.Key("otel.library.name") + + // OtelLibraryVersionKey is the attribute Key conforming to the + // "otel.library.version" semantic conventions. It represents the + // deprecated, use the `otel.scope.version` attribute. + // + // Type: string + // RequirementLevel: Optional + // Stability: deprecated + // Examples: '1.0.0' + OtelLibraryVersionKey = attribute.Key("otel.library.version") +) + +// OtelLibraryName returns an attribute KeyValue conforming to the +// "otel.library.name" semantic conventions. It represents the deprecated, use +// the `otel.scope.name` attribute. +func OtelLibraryName(val string) attribute.KeyValue { + return OtelLibraryNameKey.String(val) +} + +// OtelLibraryVersion returns an attribute KeyValue conforming to the +// "otel.library.version" semantic conventions. It represents the deprecated, +// use the `otel.scope.version` attribute. +func OtelLibraryVersion(val string) attribute.KeyValue { + return OtelLibraryVersionKey.String(val) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go new file mode 100644 index 000000000..42fc525d1 --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" + +// SchemaURL is the schema URL that matches the version of the semantic conventions +// that this package defines. Semconv packages starting from v1.4.0 must declare +// non-empty schema URL in the form https://opentelemetry.io/schemas/ +const SchemaURL = "https://opentelemetry.io/schemas/1.17.0" diff --git a/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go new file mode 100644 index 000000000..8c4a7299d --- /dev/null +++ b/tools/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go @@ -0,0 +1,3375 @@ +// Copyright The OpenTelemetry 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 from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0" + +import "go.opentelemetry.io/otel/attribute" + +// The shared attributes used to report a single exception associated with a +// span or log. +const ( + // ExceptionTypeKey is the attribute Key conforming to the "exception.type" + // semantic conventions. It represents the type of the exception (its + // fully-qualified class name, if applicable). The dynamic type of the + // exception should be preferred over the static type in languages that + // support it. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'java.net.ConnectException', 'OSError' + ExceptionTypeKey = attribute.Key("exception.type") + + // ExceptionMessageKey is the attribute Key conforming to the + // "exception.message" semantic conventions. It represents the exception + // message. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Division by zero', "Can't convert 'int' object to str + // implicitly" + ExceptionMessageKey = attribute.Key("exception.message") + + // ExceptionStacktraceKey is the attribute Key conforming to the + // "exception.stacktrace" semantic conventions. It represents a stacktrace + // as a string in the natural representation for the language runtime. The + // representation is to be determined and documented by each language SIG. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Exception in thread "main" java.lang.RuntimeException: Test + // exception\\n at ' + // 'com.example.GenerateTrace.methodB(GenerateTrace.java:13)\\n at ' + // 'com.example.GenerateTrace.methodA(GenerateTrace.java:9)\\n at ' + // 'com.example.GenerateTrace.main(GenerateTrace.java:5)' + ExceptionStacktraceKey = attribute.Key("exception.stacktrace") +) + +// ExceptionType returns an attribute KeyValue conforming to the +// "exception.type" semantic conventions. It represents the type of the +// exception (its fully-qualified class name, if applicable). The dynamic type +// of the exception should be preferred over the static type in languages that +// support it. +func ExceptionType(val string) attribute.KeyValue { + return ExceptionTypeKey.String(val) +} + +// ExceptionMessage returns an attribute KeyValue conforming to the +// "exception.message" semantic conventions. It represents the exception +// message. +func ExceptionMessage(val string) attribute.KeyValue { + return ExceptionMessageKey.String(val) +} + +// ExceptionStacktrace returns an attribute KeyValue conforming to the +// "exception.stacktrace" semantic conventions. It represents a stacktrace as a +// string in the natural representation for the language runtime. The +// representation is to be determined and documented by each language SIG. +func ExceptionStacktrace(val string) attribute.KeyValue { + return ExceptionStacktraceKey.String(val) +} + +// Attributes for Events represented using Log Records. +const ( + // EventNameKey is the attribute Key conforming to the "event.name" + // semantic conventions. It represents the name identifies the event. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'click', 'exception' + EventNameKey = attribute.Key("event.name") + + // EventDomainKey is the attribute Key conforming to the "event.domain" + // semantic conventions. It represents the domain identifies the business + // context for the events. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + // Note: Events across different domains may have same `event.name`, yet be + // unrelated events. + EventDomainKey = attribute.Key("event.domain") +) + +var ( + // Events from browser apps + EventDomainBrowser = EventDomainKey.String("browser") + // Events from mobile apps + EventDomainDevice = EventDomainKey.String("device") + // Events from Kubernetes + EventDomainK8S = EventDomainKey.String("k8s") +) + +// EventName returns an attribute KeyValue conforming to the "event.name" +// semantic conventions. It represents the name identifies the event. +func EventName(val string) attribute.KeyValue { + return EventNameKey.String(val) +} + +// Span attributes used by AWS Lambda (in addition to general `faas` +// attributes). +const ( + // AWSLambdaInvokedARNKey is the attribute Key conforming to the + // "aws.lambda.invoked_arn" semantic conventions. It represents the full + // invoked ARN as provided on the `Context` passed to the function + // (`Lambda-Runtime-Invoked-Function-ARN` header on the + // `/runtime/invocation/next` applicable). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'arn:aws:lambda:us-east-1:123456:function:myfunction:myalias' + // Note: This may be different from `faas.id` if an alias is involved. + AWSLambdaInvokedARNKey = attribute.Key("aws.lambda.invoked_arn") +) + +// AWSLambdaInvokedARN returns an attribute KeyValue conforming to the +// "aws.lambda.invoked_arn" semantic conventions. It represents the full +// invoked ARN as provided on the `Context` passed to the function +// (`Lambda-Runtime-Invoked-Function-ARN` header on the +// `/runtime/invocation/next` applicable). +func AWSLambdaInvokedARN(val string) attribute.KeyValue { + return AWSLambdaInvokedARNKey.String(val) +} + +// Attributes for CloudEvents. CloudEvents is a specification on how to define +// event data in a standard way. These attributes can be attached to spans when +// performing operations with CloudEvents, regardless of the protocol being +// used. +const ( + // CloudeventsEventIDKey is the attribute Key conforming to the + // "cloudevents.event_id" semantic conventions. It represents the + // [event_id](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id) + // uniquely identifies the event. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: '123e4567-e89b-12d3-a456-426614174000', '0001' + CloudeventsEventIDKey = attribute.Key("cloudevents.event_id") + + // CloudeventsEventSourceKey is the attribute Key conforming to the + // "cloudevents.event_source" semantic conventions. It represents the + // [source](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1) + // identifies the context in which an event happened. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'https://github.com/cloudevents', + // '/cloudevents/spec/pull/123', 'my-service' + CloudeventsEventSourceKey = attribute.Key("cloudevents.event_source") + + // CloudeventsEventSpecVersionKey is the attribute Key conforming to the + // "cloudevents.event_spec_version" semantic conventions. It represents the + // [version of the CloudEvents + // specification](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion) + // which the event uses. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.0' + CloudeventsEventSpecVersionKey = attribute.Key("cloudevents.event_spec_version") + + // CloudeventsEventTypeKey is the attribute Key conforming to the + // "cloudevents.event_type" semantic conventions. It represents the + // [event_type](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type) + // contains a value describing the type of event related to the originating + // occurrence. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'com.github.pull_request.opened', + // 'com.example.object.deleted.v2' + CloudeventsEventTypeKey = attribute.Key("cloudevents.event_type") + + // CloudeventsEventSubjectKey is the attribute Key conforming to the + // "cloudevents.event_subject" semantic conventions. It represents the + // [subject](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject) + // of the event in the context of the event producer (identified by + // source). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'mynewfile.jpg' + CloudeventsEventSubjectKey = attribute.Key("cloudevents.event_subject") +) + +// CloudeventsEventID returns an attribute KeyValue conforming to the +// "cloudevents.event_id" semantic conventions. It represents the +// [event_id](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id) +// uniquely identifies the event. +func CloudeventsEventID(val string) attribute.KeyValue { + return CloudeventsEventIDKey.String(val) +} + +// CloudeventsEventSource returns an attribute KeyValue conforming to the +// "cloudevents.event_source" semantic conventions. It represents the +// [source](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1) +// identifies the context in which an event happened. +func CloudeventsEventSource(val string) attribute.KeyValue { + return CloudeventsEventSourceKey.String(val) +} + +// CloudeventsEventSpecVersion returns an attribute KeyValue conforming to +// the "cloudevents.event_spec_version" semantic conventions. It represents the +// [version of the CloudEvents +// specification](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion) +// which the event uses. +func CloudeventsEventSpecVersion(val string) attribute.KeyValue { + return CloudeventsEventSpecVersionKey.String(val) +} + +// CloudeventsEventType returns an attribute KeyValue conforming to the +// "cloudevents.event_type" semantic conventions. It represents the +// [event_type](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type) +// contains a value describing the type of event related to the originating +// occurrence. +func CloudeventsEventType(val string) attribute.KeyValue { + return CloudeventsEventTypeKey.String(val) +} + +// CloudeventsEventSubject returns an attribute KeyValue conforming to the +// "cloudevents.event_subject" semantic conventions. It represents the +// [subject](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject) +// of the event in the context of the event producer (identified by source). +func CloudeventsEventSubject(val string) attribute.KeyValue { + return CloudeventsEventSubjectKey.String(val) +} + +// Semantic conventions for the OpenTracing Shim +const ( + // OpentracingRefTypeKey is the attribute Key conforming to the + // "opentracing.ref_type" semantic conventions. It represents the + // parent-child Reference type + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Note: The causal relationship between a child Span and a parent Span. + OpentracingRefTypeKey = attribute.Key("opentracing.ref_type") +) + +var ( + // The parent Span depends on the child Span in some capacity + OpentracingRefTypeChildOf = OpentracingRefTypeKey.String("child_of") + // The parent Span does not depend in any way on the result of the child Span + OpentracingRefTypeFollowsFrom = OpentracingRefTypeKey.String("follows_from") +) + +// The attributes used to perform database client calls. +const ( + // DBSystemKey is the attribute Key conforming to the "db.system" semantic + // conventions. It represents an identifier for the database management + // system (DBMS) product being used. See below for a list of well-known + // identifiers. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + DBSystemKey = attribute.Key("db.system") + + // DBConnectionStringKey is the attribute Key conforming to the + // "db.connection_string" semantic conventions. It represents the + // connection string used to connect to the database. It is recommended to + // remove embedded credentials. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Server=(localdb)\\v11.0;Integrated Security=true;' + DBConnectionStringKey = attribute.Key("db.connection_string") + + // DBUserKey is the attribute Key conforming to the "db.user" semantic + // conventions. It represents the username for accessing the database. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'readonly_user', 'reporting_user' + DBUserKey = attribute.Key("db.user") + + // DBJDBCDriverClassnameKey is the attribute Key conforming to the + // "db.jdbc.driver_classname" semantic conventions. It represents the + // fully-qualified class name of the [Java Database Connectivity + // (JDBC)](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) + // driver used to connect. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'org.postgresql.Driver', + // 'com.microsoft.sqlserver.jdbc.SQLServerDriver' + DBJDBCDriverClassnameKey = attribute.Key("db.jdbc.driver_classname") + + // DBNameKey is the attribute Key conforming to the "db.name" semantic + // conventions. It represents the this attribute is used to report the name + // of the database being accessed. For commands that switch the database, + // this should be set to the target database (even if the command fails). + // + // Type: string + // RequirementLevel: ConditionallyRequired (If applicable.) + // Stability: stable + // Examples: 'customers', 'main' + // Note: In some SQL databases, the database name to be used is called + // "schema name". In case there are multiple layers that could be + // considered for database name (e.g. Oracle instance name and schema + // name), the database name to be used is the more specific layer (e.g. + // Oracle schema name). + DBNameKey = attribute.Key("db.name") + + // DBStatementKey is the attribute Key conforming to the "db.statement" + // semantic conventions. It represents the database statement being + // executed. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If applicable and not + // explicitly disabled via instrumentation configuration.) + // Stability: stable + // Examples: 'SELECT * FROM wuser_table', 'SET mykey "WuValue"' + // Note: The value may be sanitized to exclude sensitive information. + DBStatementKey = attribute.Key("db.statement") + + // DBOperationKey is the attribute Key conforming to the "db.operation" + // semantic conventions. It represents the name of the operation being + // executed, e.g. the [MongoDB command + // name](https://docs.mongodb.com/manual/reference/command/#database-operations) + // such as `findAndModify`, or the SQL keyword. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If `db.statement` is not + // applicable.) + // Stability: stable + // Examples: 'findAndModify', 'HMSET', 'SELECT' + // Note: When setting this to an SQL keyword, it is not recommended to + // attempt any client-side parsing of `db.statement` just to get this + // property, but it should be set if the operation name is provided by the + // library being instrumented. If the SQL statement has an ambiguous + // operation, or performs more than one operation, this value may be + // omitted. + DBOperationKey = attribute.Key("db.operation") +) + +var ( + // Some other SQL database. Fallback only. See notes + DBSystemOtherSQL = DBSystemKey.String("other_sql") + // Microsoft SQL Server + DBSystemMSSQL = DBSystemKey.String("mssql") + // MySQL + DBSystemMySQL = DBSystemKey.String("mysql") + // Oracle Database + DBSystemOracle = DBSystemKey.String("oracle") + // IBM DB2 + DBSystemDB2 = DBSystemKey.String("db2") + // PostgreSQL + DBSystemPostgreSQL = DBSystemKey.String("postgresql") + // Amazon Redshift + DBSystemRedshift = DBSystemKey.String("redshift") + // Apache Hive + DBSystemHive = DBSystemKey.String("hive") + // Cloudscape + DBSystemCloudscape = DBSystemKey.String("cloudscape") + // HyperSQL DataBase + DBSystemHSQLDB = DBSystemKey.String("hsqldb") + // Progress Database + DBSystemProgress = DBSystemKey.String("progress") + // SAP MaxDB + DBSystemMaxDB = DBSystemKey.String("maxdb") + // SAP HANA + DBSystemHanaDB = DBSystemKey.String("hanadb") + // Ingres + DBSystemIngres = DBSystemKey.String("ingres") + // FirstSQL + DBSystemFirstSQL = DBSystemKey.String("firstsql") + // EnterpriseDB + DBSystemEDB = DBSystemKey.String("edb") + // InterSystems Caché + DBSystemCache = DBSystemKey.String("cache") + // Adabas (Adaptable Database System) + DBSystemAdabas = DBSystemKey.String("adabas") + // Firebird + DBSystemFirebird = DBSystemKey.String("firebird") + // Apache Derby + DBSystemDerby = DBSystemKey.String("derby") + // FileMaker + DBSystemFilemaker = DBSystemKey.String("filemaker") + // Informix + DBSystemInformix = DBSystemKey.String("informix") + // InstantDB + DBSystemInstantDB = DBSystemKey.String("instantdb") + // InterBase + DBSystemInterbase = DBSystemKey.String("interbase") + // MariaDB + DBSystemMariaDB = DBSystemKey.String("mariadb") + // Netezza + DBSystemNetezza = DBSystemKey.String("netezza") + // Pervasive PSQL + DBSystemPervasive = DBSystemKey.String("pervasive") + // PointBase + DBSystemPointbase = DBSystemKey.String("pointbase") + // SQLite + DBSystemSqlite = DBSystemKey.String("sqlite") + // Sybase + DBSystemSybase = DBSystemKey.String("sybase") + // Teradata + DBSystemTeradata = DBSystemKey.String("teradata") + // Vertica + DBSystemVertica = DBSystemKey.String("vertica") + // H2 + DBSystemH2 = DBSystemKey.String("h2") + // ColdFusion IMQ + DBSystemColdfusion = DBSystemKey.String("coldfusion") + // Apache Cassandra + DBSystemCassandra = DBSystemKey.String("cassandra") + // Apache HBase + DBSystemHBase = DBSystemKey.String("hbase") + // MongoDB + DBSystemMongoDB = DBSystemKey.String("mongodb") + // Redis + DBSystemRedis = DBSystemKey.String("redis") + // Couchbase + DBSystemCouchbase = DBSystemKey.String("couchbase") + // CouchDB + DBSystemCouchDB = DBSystemKey.String("couchdb") + // Microsoft Azure Cosmos DB + DBSystemCosmosDB = DBSystemKey.String("cosmosdb") + // Amazon DynamoDB + DBSystemDynamoDB = DBSystemKey.String("dynamodb") + // Neo4j + DBSystemNeo4j = DBSystemKey.String("neo4j") + // Apache Geode + DBSystemGeode = DBSystemKey.String("geode") + // Elasticsearch + DBSystemElasticsearch = DBSystemKey.String("elasticsearch") + // Memcached + DBSystemMemcached = DBSystemKey.String("memcached") + // CockroachDB + DBSystemCockroachdb = DBSystemKey.String("cockroachdb") + // OpenSearch + DBSystemOpensearch = DBSystemKey.String("opensearch") + // ClickHouse + DBSystemClickhouse = DBSystemKey.String("clickhouse") +) + +// DBConnectionString returns an attribute KeyValue conforming to the +// "db.connection_string" semantic conventions. It represents the connection +// string used to connect to the database. It is recommended to remove embedded +// credentials. +func DBConnectionString(val string) attribute.KeyValue { + return DBConnectionStringKey.String(val) +} + +// DBUser returns an attribute KeyValue conforming to the "db.user" semantic +// conventions. It represents the username for accessing the database. +func DBUser(val string) attribute.KeyValue { + return DBUserKey.String(val) +} + +// DBJDBCDriverClassname returns an attribute KeyValue conforming to the +// "db.jdbc.driver_classname" semantic conventions. It represents the +// fully-qualified class name of the [Java Database Connectivity +// (JDBC)](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) driver +// used to connect. +func DBJDBCDriverClassname(val string) attribute.KeyValue { + return DBJDBCDriverClassnameKey.String(val) +} + +// DBName returns an attribute KeyValue conforming to the "db.name" semantic +// conventions. It represents the this attribute is used to report the name of +// the database being accessed. For commands that switch the database, this +// should be set to the target database (even if the command fails). +func DBName(val string) attribute.KeyValue { + return DBNameKey.String(val) +} + +// DBStatement returns an attribute KeyValue conforming to the +// "db.statement" semantic conventions. It represents the database statement +// being executed. +func DBStatement(val string) attribute.KeyValue { + return DBStatementKey.String(val) +} + +// DBOperation returns an attribute KeyValue conforming to the +// "db.operation" semantic conventions. It represents the name of the operation +// being executed, e.g. the [MongoDB command +// name](https://docs.mongodb.com/manual/reference/command/#database-operations) +// such as `findAndModify`, or the SQL keyword. +func DBOperation(val string) attribute.KeyValue { + return DBOperationKey.String(val) +} + +// Connection-level attributes for Microsoft SQL Server +const ( + // DBMSSQLInstanceNameKey is the attribute Key conforming to the + // "db.mssql.instance_name" semantic conventions. It represents the + // Microsoft SQL Server [instance + // name](https://docs.microsoft.com/en-us/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver15) + // connecting to. This name is used to determine the port of a named + // instance. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'MSSQLSERVER' + // Note: If setting a `db.mssql.instance_name`, `net.peer.port` is no + // longer required (but still recommended if non-standard). + DBMSSQLInstanceNameKey = attribute.Key("db.mssql.instance_name") +) + +// DBMSSQLInstanceName returns an attribute KeyValue conforming to the +// "db.mssql.instance_name" semantic conventions. It represents the Microsoft +// SQL Server [instance +// name](https://docs.microsoft.com/en-us/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver15) +// connecting to. This name is used to determine the port of a named instance. +func DBMSSQLInstanceName(val string) attribute.KeyValue { + return DBMSSQLInstanceNameKey.String(val) +} + +// Call-level attributes for Cassandra +const ( + // DBCassandraPageSizeKey is the attribute Key conforming to the + // "db.cassandra.page_size" semantic conventions. It represents the fetch + // size used for paging, i.e. how many rows will be returned at once. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 5000 + DBCassandraPageSizeKey = attribute.Key("db.cassandra.page_size") + + // DBCassandraConsistencyLevelKey is the attribute Key conforming to the + // "db.cassandra.consistency_level" semantic conventions. It represents the + // consistency level of the query. Based on consistency values from + // [CQL](https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html). + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + DBCassandraConsistencyLevelKey = attribute.Key("db.cassandra.consistency_level") + + // DBCassandraTableKey is the attribute Key conforming to the + // "db.cassandra.table" semantic conventions. It represents the name of the + // primary table that the operation is acting upon, including the keyspace + // name (if applicable). + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'mytable' + // Note: This mirrors the db.sql.table attribute but references cassandra + // rather than sql. It is not recommended to attempt any client-side + // parsing of `db.statement` just to get this property, but it should be + // set if it is provided by the library being instrumented. If the + // operation is acting upon an anonymous table, or more than one table, + // this value MUST NOT be set. + DBCassandraTableKey = attribute.Key("db.cassandra.table") + + // DBCassandraIdempotenceKey is the attribute Key conforming to the + // "db.cassandra.idempotence" semantic conventions. It represents the + // whether or not the query is idempotent. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + DBCassandraIdempotenceKey = attribute.Key("db.cassandra.idempotence") + + // DBCassandraSpeculativeExecutionCountKey is the attribute Key conforming + // to the "db.cassandra.speculative_execution_count" semantic conventions. + // It represents the number of times a query was speculatively executed. + // Not set or `0` if the query was not executed speculatively. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 0, 2 + DBCassandraSpeculativeExecutionCountKey = attribute.Key("db.cassandra.speculative_execution_count") + + // DBCassandraCoordinatorIDKey is the attribute Key conforming to the + // "db.cassandra.coordinator.id" semantic conventions. It represents the ID + // of the coordinating node for a query. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'be13faa2-8574-4d71-926d-27f16cf8a7af' + DBCassandraCoordinatorIDKey = attribute.Key("db.cassandra.coordinator.id") + + // DBCassandraCoordinatorDCKey is the attribute Key conforming to the + // "db.cassandra.coordinator.dc" semantic conventions. It represents the + // data center of the coordinating node for a query. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'us-west-2' + DBCassandraCoordinatorDCKey = attribute.Key("db.cassandra.coordinator.dc") +) + +var ( + // all + DBCassandraConsistencyLevelAll = DBCassandraConsistencyLevelKey.String("all") + // each_quorum + DBCassandraConsistencyLevelEachQuorum = DBCassandraConsistencyLevelKey.String("each_quorum") + // quorum + DBCassandraConsistencyLevelQuorum = DBCassandraConsistencyLevelKey.String("quorum") + // local_quorum + DBCassandraConsistencyLevelLocalQuorum = DBCassandraConsistencyLevelKey.String("local_quorum") + // one + DBCassandraConsistencyLevelOne = DBCassandraConsistencyLevelKey.String("one") + // two + DBCassandraConsistencyLevelTwo = DBCassandraConsistencyLevelKey.String("two") + // three + DBCassandraConsistencyLevelThree = DBCassandraConsistencyLevelKey.String("three") + // local_one + DBCassandraConsistencyLevelLocalOne = DBCassandraConsistencyLevelKey.String("local_one") + // any + DBCassandraConsistencyLevelAny = DBCassandraConsistencyLevelKey.String("any") + // serial + DBCassandraConsistencyLevelSerial = DBCassandraConsistencyLevelKey.String("serial") + // local_serial + DBCassandraConsistencyLevelLocalSerial = DBCassandraConsistencyLevelKey.String("local_serial") +) + +// DBCassandraPageSize returns an attribute KeyValue conforming to the +// "db.cassandra.page_size" semantic conventions. It represents the fetch size +// used for paging, i.e. how many rows will be returned at once. +func DBCassandraPageSize(val int) attribute.KeyValue { + return DBCassandraPageSizeKey.Int(val) +} + +// DBCassandraTable returns an attribute KeyValue conforming to the +// "db.cassandra.table" semantic conventions. It represents the name of the +// primary table that the operation is acting upon, including the keyspace name +// (if applicable). +func DBCassandraTable(val string) attribute.KeyValue { + return DBCassandraTableKey.String(val) +} + +// DBCassandraIdempotence returns an attribute KeyValue conforming to the +// "db.cassandra.idempotence" semantic conventions. It represents the whether +// or not the query is idempotent. +func DBCassandraIdempotence(val bool) attribute.KeyValue { + return DBCassandraIdempotenceKey.Bool(val) +} + +// DBCassandraSpeculativeExecutionCount returns an attribute KeyValue +// conforming to the "db.cassandra.speculative_execution_count" semantic +// conventions. It represents the number of times a query was speculatively +// executed. Not set or `0` if the query was not executed speculatively. +func DBCassandraSpeculativeExecutionCount(val int) attribute.KeyValue { + return DBCassandraSpeculativeExecutionCountKey.Int(val) +} + +// DBCassandraCoordinatorID returns an attribute KeyValue conforming to the +// "db.cassandra.coordinator.id" semantic conventions. It represents the ID of +// the coordinating node for a query. +func DBCassandraCoordinatorID(val string) attribute.KeyValue { + return DBCassandraCoordinatorIDKey.String(val) +} + +// DBCassandraCoordinatorDC returns an attribute KeyValue conforming to the +// "db.cassandra.coordinator.dc" semantic conventions. It represents the data +// center of the coordinating node for a query. +func DBCassandraCoordinatorDC(val string) attribute.KeyValue { + return DBCassandraCoordinatorDCKey.String(val) +} + +// Call-level attributes for Redis +const ( + // DBRedisDBIndexKey is the attribute Key conforming to the + // "db.redis.database_index" semantic conventions. It represents the index + // of the database being accessed as used in the [`SELECT` + // command](https://redis.io/commands/select), provided as an integer. To + // be used instead of the generic `db.name` attribute. + // + // Type: int + // RequirementLevel: ConditionallyRequired (If other than the default + // database (`0`).) + // Stability: stable + // Examples: 0, 1, 15 + DBRedisDBIndexKey = attribute.Key("db.redis.database_index") +) + +// DBRedisDBIndex returns an attribute KeyValue conforming to the +// "db.redis.database_index" semantic conventions. It represents the index of +// the database being accessed as used in the [`SELECT` +// command](https://redis.io/commands/select), provided as an integer. To be +// used instead of the generic `db.name` attribute. +func DBRedisDBIndex(val int) attribute.KeyValue { + return DBRedisDBIndexKey.Int(val) +} + +// Call-level attributes for MongoDB +const ( + // DBMongoDBCollectionKey is the attribute Key conforming to the + // "db.mongodb.collection" semantic conventions. It represents the + // collection being accessed within the database stated in `db.name`. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'customers', 'products' + DBMongoDBCollectionKey = attribute.Key("db.mongodb.collection") +) + +// DBMongoDBCollection returns an attribute KeyValue conforming to the +// "db.mongodb.collection" semantic conventions. It represents the collection +// being accessed within the database stated in `db.name`. +func DBMongoDBCollection(val string) attribute.KeyValue { + return DBMongoDBCollectionKey.String(val) +} + +// Call-level attributes for SQL databases +const ( + // DBSQLTableKey is the attribute Key conforming to the "db.sql.table" + // semantic conventions. It represents the name of the primary table that + // the operation is acting upon, including the database name (if + // applicable). + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'public.users', 'customers' + // Note: It is not recommended to attempt any client-side parsing of + // `db.statement` just to get this property, but it should be set if it is + // provided by the library being instrumented. If the operation is acting + // upon an anonymous table, or more than one table, this value MUST NOT be + // set. + DBSQLTableKey = attribute.Key("db.sql.table") +) + +// DBSQLTable returns an attribute KeyValue conforming to the "db.sql.table" +// semantic conventions. It represents the name of the primary table that the +// operation is acting upon, including the database name (if applicable). +func DBSQLTable(val string) attribute.KeyValue { + return DBSQLTableKey.String(val) +} + +// Span attributes used by non-OTLP exporters to represent OpenTelemetry Span's +// concepts. +const ( + // OtelStatusCodeKey is the attribute Key conforming to the + // "otel.status_code" semantic conventions. It represents the name of the + // code, either "OK" or "ERROR". MUST NOT be set if the status code is + // UNSET. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + OtelStatusCodeKey = attribute.Key("otel.status_code") + + // OtelStatusDescriptionKey is the attribute Key conforming to the + // "otel.status_description" semantic conventions. It represents the + // description of the Status if it has a value, otherwise not set. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'resource not found' + OtelStatusDescriptionKey = attribute.Key("otel.status_description") +) + +var ( + // The operation has been validated by an Application developer or Operator to have completed successfully + OtelStatusCodeOk = OtelStatusCodeKey.String("OK") + // The operation contains an error + OtelStatusCodeError = OtelStatusCodeKey.String("ERROR") +) + +// OtelStatusDescription returns an attribute KeyValue conforming to the +// "otel.status_description" semantic conventions. It represents the +// description of the Status if it has a value, otherwise not set. +func OtelStatusDescription(val string) attribute.KeyValue { + return OtelStatusDescriptionKey.String(val) +} + +// This semantic convention describes an instance of a function that runs +// without provisioning or managing of servers (also known as serverless +// functions or Function as a Service (FaaS)) with spans. +const ( + // FaaSTriggerKey is the attribute Key conforming to the "faas.trigger" + // semantic conventions. It represents the type of the trigger which caused + // this function execution. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Note: For the server/consumer span on the incoming side, + // `faas.trigger` MUST be set. + // + // Clients invoking FaaS instances usually cannot set `faas.trigger`, + // since they would typically need to look in the payload to determine + // the event type. If clients set it, it should be the same as the + // trigger that corresponding incoming would have (i.e., this has + // nothing to do with the underlying transport used to make the API + // call to invoke the lambda, which is often HTTP). + FaaSTriggerKey = attribute.Key("faas.trigger") + + // FaaSExecutionKey is the attribute Key conforming to the "faas.execution" + // semantic conventions. It represents the execution ID of the current + // function execution. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'af9d5aa4-a685-4c5f-a22b-444f80b3cc28' + FaaSExecutionKey = attribute.Key("faas.execution") +) + +var ( + // A response to some data source operation such as a database or filesystem read/write + FaaSTriggerDatasource = FaaSTriggerKey.String("datasource") + // To provide an answer to an inbound HTTP request + FaaSTriggerHTTP = FaaSTriggerKey.String("http") + // A function is set to be executed when messages are sent to a messaging system + FaaSTriggerPubsub = FaaSTriggerKey.String("pubsub") + // A function is scheduled to be executed regularly + FaaSTriggerTimer = FaaSTriggerKey.String("timer") + // If none of the others apply + FaaSTriggerOther = FaaSTriggerKey.String("other") +) + +// FaaSExecution returns an attribute KeyValue conforming to the +// "faas.execution" semantic conventions. It represents the execution ID of the +// current function execution. +func FaaSExecution(val string) attribute.KeyValue { + return FaaSExecutionKey.String(val) +} + +// Semantic Convention for FaaS triggered as a response to some data source +// operation such as a database or filesystem read/write. +const ( + // FaaSDocumentCollectionKey is the attribute Key conforming to the + // "faas.document.collection" semantic conventions. It represents the name + // of the source on which the triggering operation was performed. For + // example, in Cloud Storage or S3 corresponds to the bucket name, and in + // Cosmos DB to the database name. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'myBucketName', 'myDBName' + FaaSDocumentCollectionKey = attribute.Key("faas.document.collection") + + // FaaSDocumentOperationKey is the attribute Key conforming to the + // "faas.document.operation" semantic conventions. It represents the + // describes the type of the operation that was performed on the data. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + FaaSDocumentOperationKey = attribute.Key("faas.document.operation") + + // FaaSDocumentTimeKey is the attribute Key conforming to the + // "faas.document.time" semantic conventions. It represents a string + // containing the time when the data was accessed in the [ISO + // 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format + // expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2020-01-23T13:47:06Z' + FaaSDocumentTimeKey = attribute.Key("faas.document.time") + + // FaaSDocumentNameKey is the attribute Key conforming to the + // "faas.document.name" semantic conventions. It represents the document + // name/table subjected to the operation. For example, in Cloud Storage or + // S3 is the name of the file, and in Cosmos DB the table name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'myFile.txt', 'myTableName' + FaaSDocumentNameKey = attribute.Key("faas.document.name") +) + +var ( + // When a new object is created + FaaSDocumentOperationInsert = FaaSDocumentOperationKey.String("insert") + // When an object is modified + FaaSDocumentOperationEdit = FaaSDocumentOperationKey.String("edit") + // When an object is deleted + FaaSDocumentOperationDelete = FaaSDocumentOperationKey.String("delete") +) + +// FaaSDocumentCollection returns an attribute KeyValue conforming to the +// "faas.document.collection" semantic conventions. It represents the name of +// the source on which the triggering operation was performed. For example, in +// Cloud Storage or S3 corresponds to the bucket name, and in Cosmos DB to the +// database name. +func FaaSDocumentCollection(val string) attribute.KeyValue { + return FaaSDocumentCollectionKey.String(val) +} + +// FaaSDocumentTime returns an attribute KeyValue conforming to the +// "faas.document.time" semantic conventions. It represents a string containing +// the time when the data was accessed in the [ISO +// 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format +// expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +func FaaSDocumentTime(val string) attribute.KeyValue { + return FaaSDocumentTimeKey.String(val) +} + +// FaaSDocumentName returns an attribute KeyValue conforming to the +// "faas.document.name" semantic conventions. It represents the document +// name/table subjected to the operation. For example, in Cloud Storage or S3 +// is the name of the file, and in Cosmos DB the table name. +func FaaSDocumentName(val string) attribute.KeyValue { + return FaaSDocumentNameKey.String(val) +} + +// Semantic Convention for FaaS scheduled to be executed regularly. +const ( + // FaaSTimeKey is the attribute Key conforming to the "faas.time" semantic + // conventions. It represents a string containing the function invocation + // time in the [ISO + // 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format + // expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2020-01-23T13:47:06Z' + FaaSTimeKey = attribute.Key("faas.time") + + // FaaSCronKey is the attribute Key conforming to the "faas.cron" semantic + // conventions. It represents a string containing the schedule period as + // [Cron + // Expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '0/5 * * * ? *' + FaaSCronKey = attribute.Key("faas.cron") +) + +// FaaSTime returns an attribute KeyValue conforming to the "faas.time" +// semantic conventions. It represents a string containing the function +// invocation time in the [ISO +// 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format +// expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +func FaaSTime(val string) attribute.KeyValue { + return FaaSTimeKey.String(val) +} + +// FaaSCron returns an attribute KeyValue conforming to the "faas.cron" +// semantic conventions. It represents a string containing the schedule period +// as [Cron +// Expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm). +func FaaSCron(val string) attribute.KeyValue { + return FaaSCronKey.String(val) +} + +// Contains additional attributes for incoming FaaS spans. +const ( + // FaaSColdstartKey is the attribute Key conforming to the "faas.coldstart" + // semantic conventions. It represents a boolean that is true if the + // serverless function is executed for the first time (aka cold-start). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + FaaSColdstartKey = attribute.Key("faas.coldstart") +) + +// FaaSColdstart returns an attribute KeyValue conforming to the +// "faas.coldstart" semantic conventions. It represents a boolean that is true +// if the serverless function is executed for the first time (aka cold-start). +func FaaSColdstart(val bool) attribute.KeyValue { + return FaaSColdstartKey.Bool(val) +} + +// Contains additional attributes for outgoing FaaS spans. +const ( + // FaaSInvokedNameKey is the attribute Key conforming to the + // "faas.invoked_name" semantic conventions. It represents the name of the + // invoked function. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'my-function' + // Note: SHOULD be equal to the `faas.name` resource attribute of the + // invoked function. + FaaSInvokedNameKey = attribute.Key("faas.invoked_name") + + // FaaSInvokedProviderKey is the attribute Key conforming to the + // "faas.invoked_provider" semantic conventions. It represents the cloud + // provider of the invoked function. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + // Note: SHOULD be equal to the `cloud.provider` resource attribute of the + // invoked function. + FaaSInvokedProviderKey = attribute.Key("faas.invoked_provider") + + // FaaSInvokedRegionKey is the attribute Key conforming to the + // "faas.invoked_region" semantic conventions. It represents the cloud + // region of the invoked function. + // + // Type: string + // RequirementLevel: ConditionallyRequired (For some cloud providers, like + // AWS or GCP, the region in which a function is hosted is essential to + // uniquely identify the function and also part of its endpoint. Since it's + // part of the endpoint being called, the region is always known to + // clients. In these cases, `faas.invoked_region` MUST be set accordingly. + // If the region is unknown to the client or not required for identifying + // the invoked function, setting `faas.invoked_region` is optional.) + // Stability: stable + // Examples: 'eu-central-1' + // Note: SHOULD be equal to the `cloud.region` resource attribute of the + // invoked function. + FaaSInvokedRegionKey = attribute.Key("faas.invoked_region") +) + +var ( + // Alibaba Cloud + FaaSInvokedProviderAlibabaCloud = FaaSInvokedProviderKey.String("alibaba_cloud") + // Amazon Web Services + FaaSInvokedProviderAWS = FaaSInvokedProviderKey.String("aws") + // Microsoft Azure + FaaSInvokedProviderAzure = FaaSInvokedProviderKey.String("azure") + // Google Cloud Platform + FaaSInvokedProviderGCP = FaaSInvokedProviderKey.String("gcp") + // Tencent Cloud + FaaSInvokedProviderTencentCloud = FaaSInvokedProviderKey.String("tencent_cloud") +) + +// FaaSInvokedName returns an attribute KeyValue conforming to the +// "faas.invoked_name" semantic conventions. It represents the name of the +// invoked function. +func FaaSInvokedName(val string) attribute.KeyValue { + return FaaSInvokedNameKey.String(val) +} + +// FaaSInvokedRegion returns an attribute KeyValue conforming to the +// "faas.invoked_region" semantic conventions. It represents the cloud region +// of the invoked function. +func FaaSInvokedRegion(val string) attribute.KeyValue { + return FaaSInvokedRegionKey.String(val) +} + +// These attributes may be used for any network related operation. +const ( + // NetTransportKey is the attribute Key conforming to the "net.transport" + // semantic conventions. It represents the transport protocol used. See + // note below. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + NetTransportKey = attribute.Key("net.transport") + + // NetAppProtocolNameKey is the attribute Key conforming to the + // "net.app.protocol.name" semantic conventions. It represents the + // application layer protocol used. The value SHOULD be normalized to + // lowercase. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'amqp', 'http', 'mqtt' + NetAppProtocolNameKey = attribute.Key("net.app.protocol.name") + + // NetAppProtocolVersionKey is the attribute Key conforming to the + // "net.app.protocol.version" semantic conventions. It represents the + // version of the application layer protocol used. See note below. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '3.1.1' + // Note: `net.app.protocol.version` refers to the version of the protocol + // used and might be different from the protocol client's version. If the + // HTTP client used has a version of `0.27.2`, but sends HTTP version + // `1.1`, this attribute should be set to `1.1`. + NetAppProtocolVersionKey = attribute.Key("net.app.protocol.version") + + // NetSockPeerNameKey is the attribute Key conforming to the + // "net.sock.peer.name" semantic conventions. It represents the remote + // socket peer name. + // + // Type: string + // RequirementLevel: Recommended (If available and different from + // `net.peer.name` and if `net.sock.peer.addr` is set.) + // Stability: stable + // Examples: 'proxy.example.com' + NetSockPeerNameKey = attribute.Key("net.sock.peer.name") + + // NetSockPeerAddrKey is the attribute Key conforming to the + // "net.sock.peer.addr" semantic conventions. It represents the remote + // socket peer address: IPv4 or IPv6 for internet protocols, path for local + // communication, + // [etc](https://man7.org/linux/man-pages/man7/address_families.7.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '127.0.0.1', '/tmp/mysql.sock' + NetSockPeerAddrKey = attribute.Key("net.sock.peer.addr") + + // NetSockPeerPortKey is the attribute Key conforming to the + // "net.sock.peer.port" semantic conventions. It represents the remote + // socket peer port. + // + // Type: int + // RequirementLevel: Recommended (If defined for the address family and if + // different than `net.peer.port` and if `net.sock.peer.addr` is set.) + // Stability: stable + // Examples: 16456 + NetSockPeerPortKey = attribute.Key("net.sock.peer.port") + + // NetSockFamilyKey is the attribute Key conforming to the + // "net.sock.family" semantic conventions. It represents the protocol + // [address + // family](https://man7.org/linux/man-pages/man7/address_families.7.html) + // which is used for communication. + // + // Type: Enum + // RequirementLevel: ConditionallyRequired (If different than `inet` and if + // any of `net.sock.peer.addr` or `net.sock.host.addr` are set. Consumers + // of telemetry SHOULD accept both IPv4 and IPv6 formats for the address in + // `net.sock.peer.addr` if `net.sock.family` is not set. This is to support + // instrumentations that follow previous versions of this document.) + // Stability: stable + // Examples: 'inet6', 'bluetooth' + NetSockFamilyKey = attribute.Key("net.sock.family") + + // NetPeerNameKey is the attribute Key conforming to the "net.peer.name" + // semantic conventions. It represents the logical remote hostname, see + // note below. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'example.com' + // Note: `net.peer.name` SHOULD NOT be set if capturing it would require an + // extra DNS lookup. + NetPeerNameKey = attribute.Key("net.peer.name") + + // NetPeerPortKey is the attribute Key conforming to the "net.peer.port" + // semantic conventions. It represents the logical remote port number + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 80, 8080, 443 + NetPeerPortKey = attribute.Key("net.peer.port") + + // NetHostNameKey is the attribute Key conforming to the "net.host.name" + // semantic conventions. It represents the logical local hostname or + // similar, see note below. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'localhost' + NetHostNameKey = attribute.Key("net.host.name") + + // NetHostPortKey is the attribute Key conforming to the "net.host.port" + // semantic conventions. It represents the logical local port number, + // preferably the one that the peer used to connect + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 8080 + NetHostPortKey = attribute.Key("net.host.port") + + // NetSockHostAddrKey is the attribute Key conforming to the + // "net.sock.host.addr" semantic conventions. It represents the local + // socket address. Useful in case of a multi-IP host. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '192.168.0.1' + NetSockHostAddrKey = attribute.Key("net.sock.host.addr") + + // NetSockHostPortKey is the attribute Key conforming to the + // "net.sock.host.port" semantic conventions. It represents the local + // socket port number. + // + // Type: int + // RequirementLevel: Recommended (If defined for the address family and if + // different than `net.host.port` and if `net.sock.host.addr` is set.) + // Stability: stable + // Examples: 35555 + NetSockHostPortKey = attribute.Key("net.sock.host.port") + + // NetHostConnectionTypeKey is the attribute Key conforming to the + // "net.host.connection.type" semantic conventions. It represents the + // internet connection type currently being used by the host. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'wifi' + NetHostConnectionTypeKey = attribute.Key("net.host.connection.type") + + // NetHostConnectionSubtypeKey is the attribute Key conforming to the + // "net.host.connection.subtype" semantic conventions. It represents the + // this describes more details regarding the connection.type. It may be the + // type of cell technology connection, but it could be used for describing + // details about a wifi connection. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'LTE' + NetHostConnectionSubtypeKey = attribute.Key("net.host.connection.subtype") + + // NetHostCarrierNameKey is the attribute Key conforming to the + // "net.host.carrier.name" semantic conventions. It represents the name of + // the mobile carrier. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'sprint' + NetHostCarrierNameKey = attribute.Key("net.host.carrier.name") + + // NetHostCarrierMccKey is the attribute Key conforming to the + // "net.host.carrier.mcc" semantic conventions. It represents the mobile + // carrier country code. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '310' + NetHostCarrierMccKey = attribute.Key("net.host.carrier.mcc") + + // NetHostCarrierMncKey is the attribute Key conforming to the + // "net.host.carrier.mnc" semantic conventions. It represents the mobile + // carrier network code. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '001' + NetHostCarrierMncKey = attribute.Key("net.host.carrier.mnc") + + // NetHostCarrierIccKey is the attribute Key conforming to the + // "net.host.carrier.icc" semantic conventions. It represents the ISO + // 3166-1 alpha-2 2-character country code associated with the mobile + // carrier network. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'DE' + NetHostCarrierIccKey = attribute.Key("net.host.carrier.icc") +) + +var ( + // ip_tcp + NetTransportTCP = NetTransportKey.String("ip_tcp") + // ip_udp + NetTransportUDP = NetTransportKey.String("ip_udp") + // Named or anonymous pipe. See note below + NetTransportPipe = NetTransportKey.String("pipe") + // In-process communication + NetTransportInProc = NetTransportKey.String("inproc") + // Something else (non IP-based) + NetTransportOther = NetTransportKey.String("other") +) + +var ( + // IPv4 address + NetSockFamilyInet = NetSockFamilyKey.String("inet") + // IPv6 address + NetSockFamilyInet6 = NetSockFamilyKey.String("inet6") + // Unix domain socket path + NetSockFamilyUnix = NetSockFamilyKey.String("unix") +) + +var ( + // wifi + NetHostConnectionTypeWifi = NetHostConnectionTypeKey.String("wifi") + // wired + NetHostConnectionTypeWired = NetHostConnectionTypeKey.String("wired") + // cell + NetHostConnectionTypeCell = NetHostConnectionTypeKey.String("cell") + // unavailable + NetHostConnectionTypeUnavailable = NetHostConnectionTypeKey.String("unavailable") + // unknown + NetHostConnectionTypeUnknown = NetHostConnectionTypeKey.String("unknown") +) + +var ( + // GPRS + NetHostConnectionSubtypeGprs = NetHostConnectionSubtypeKey.String("gprs") + // EDGE + NetHostConnectionSubtypeEdge = NetHostConnectionSubtypeKey.String("edge") + // UMTS + NetHostConnectionSubtypeUmts = NetHostConnectionSubtypeKey.String("umts") + // CDMA + NetHostConnectionSubtypeCdma = NetHostConnectionSubtypeKey.String("cdma") + // EVDO Rel. 0 + NetHostConnectionSubtypeEvdo0 = NetHostConnectionSubtypeKey.String("evdo_0") + // EVDO Rev. A + NetHostConnectionSubtypeEvdoA = NetHostConnectionSubtypeKey.String("evdo_a") + // CDMA2000 1XRTT + NetHostConnectionSubtypeCdma20001xrtt = NetHostConnectionSubtypeKey.String("cdma2000_1xrtt") + // HSDPA + NetHostConnectionSubtypeHsdpa = NetHostConnectionSubtypeKey.String("hsdpa") + // HSUPA + NetHostConnectionSubtypeHsupa = NetHostConnectionSubtypeKey.String("hsupa") + // HSPA + NetHostConnectionSubtypeHspa = NetHostConnectionSubtypeKey.String("hspa") + // IDEN + NetHostConnectionSubtypeIden = NetHostConnectionSubtypeKey.String("iden") + // EVDO Rev. B + NetHostConnectionSubtypeEvdoB = NetHostConnectionSubtypeKey.String("evdo_b") + // LTE + NetHostConnectionSubtypeLte = NetHostConnectionSubtypeKey.String("lte") + // EHRPD + NetHostConnectionSubtypeEhrpd = NetHostConnectionSubtypeKey.String("ehrpd") + // HSPAP + NetHostConnectionSubtypeHspap = NetHostConnectionSubtypeKey.String("hspap") + // GSM + NetHostConnectionSubtypeGsm = NetHostConnectionSubtypeKey.String("gsm") + // TD-SCDMA + NetHostConnectionSubtypeTdScdma = NetHostConnectionSubtypeKey.String("td_scdma") + // IWLAN + NetHostConnectionSubtypeIwlan = NetHostConnectionSubtypeKey.String("iwlan") + // 5G NR (New Radio) + NetHostConnectionSubtypeNr = NetHostConnectionSubtypeKey.String("nr") + // 5G NRNSA (New Radio Non-Standalone) + NetHostConnectionSubtypeNrnsa = NetHostConnectionSubtypeKey.String("nrnsa") + // LTE CA + NetHostConnectionSubtypeLteCa = NetHostConnectionSubtypeKey.String("lte_ca") +) + +// NetAppProtocolName returns an attribute KeyValue conforming to the +// "net.app.protocol.name" semantic conventions. It represents the application +// layer protocol used. The value SHOULD be normalized to lowercase. +func NetAppProtocolName(val string) attribute.KeyValue { + return NetAppProtocolNameKey.String(val) +} + +// NetAppProtocolVersion returns an attribute KeyValue conforming to the +// "net.app.protocol.version" semantic conventions. It represents the version +// of the application layer protocol used. See note below. +func NetAppProtocolVersion(val string) attribute.KeyValue { + return NetAppProtocolVersionKey.String(val) +} + +// NetSockPeerName returns an attribute KeyValue conforming to the +// "net.sock.peer.name" semantic conventions. It represents the remote socket +// peer name. +func NetSockPeerName(val string) attribute.KeyValue { + return NetSockPeerNameKey.String(val) +} + +// NetSockPeerAddr returns an attribute KeyValue conforming to the +// "net.sock.peer.addr" semantic conventions. It represents the remote socket +// peer address: IPv4 or IPv6 for internet protocols, path for local +// communication, +// [etc](https://man7.org/linux/man-pages/man7/address_families.7.html). +func NetSockPeerAddr(val string) attribute.KeyValue { + return NetSockPeerAddrKey.String(val) +} + +// NetSockPeerPort returns an attribute KeyValue conforming to the +// "net.sock.peer.port" semantic conventions. It represents the remote socket +// peer port. +func NetSockPeerPort(val int) attribute.KeyValue { + return NetSockPeerPortKey.Int(val) +} + +// NetPeerName returns an attribute KeyValue conforming to the +// "net.peer.name" semantic conventions. It represents the logical remote +// hostname, see note below. +func NetPeerName(val string) attribute.KeyValue { + return NetPeerNameKey.String(val) +} + +// NetPeerPort returns an attribute KeyValue conforming to the +// "net.peer.port" semantic conventions. It represents the logical remote port +// number +func NetPeerPort(val int) attribute.KeyValue { + return NetPeerPortKey.Int(val) +} + +// NetHostName returns an attribute KeyValue conforming to the +// "net.host.name" semantic conventions. It represents the logical local +// hostname or similar, see note below. +func NetHostName(val string) attribute.KeyValue { + return NetHostNameKey.String(val) +} + +// NetHostPort returns an attribute KeyValue conforming to the +// "net.host.port" semantic conventions. It represents the logical local port +// number, preferably the one that the peer used to connect +func NetHostPort(val int) attribute.KeyValue { + return NetHostPortKey.Int(val) +} + +// NetSockHostAddr returns an attribute KeyValue conforming to the +// "net.sock.host.addr" semantic conventions. It represents the local socket +// address. Useful in case of a multi-IP host. +func NetSockHostAddr(val string) attribute.KeyValue { + return NetSockHostAddrKey.String(val) +} + +// NetSockHostPort returns an attribute KeyValue conforming to the +// "net.sock.host.port" semantic conventions. It represents the local socket +// port number. +func NetSockHostPort(val int) attribute.KeyValue { + return NetSockHostPortKey.Int(val) +} + +// NetHostCarrierName returns an attribute KeyValue conforming to the +// "net.host.carrier.name" semantic conventions. It represents the name of the +// mobile carrier. +func NetHostCarrierName(val string) attribute.KeyValue { + return NetHostCarrierNameKey.String(val) +} + +// NetHostCarrierMcc returns an attribute KeyValue conforming to the +// "net.host.carrier.mcc" semantic conventions. It represents the mobile +// carrier country code. +func NetHostCarrierMcc(val string) attribute.KeyValue { + return NetHostCarrierMccKey.String(val) +} + +// NetHostCarrierMnc returns an attribute KeyValue conforming to the +// "net.host.carrier.mnc" semantic conventions. It represents the mobile +// carrier network code. +func NetHostCarrierMnc(val string) attribute.KeyValue { + return NetHostCarrierMncKey.String(val) +} + +// NetHostCarrierIcc returns an attribute KeyValue conforming to the +// "net.host.carrier.icc" semantic conventions. It represents the ISO 3166-1 +// alpha-2 2-character country code associated with the mobile carrier network. +func NetHostCarrierIcc(val string) attribute.KeyValue { + return NetHostCarrierIccKey.String(val) +} + +// Operations that access some remote service. +const ( + // PeerServiceKey is the attribute Key conforming to the "peer.service" + // semantic conventions. It represents the + // [`service.name`](../../resource/semantic_conventions/README.md#service) + // of the remote service. SHOULD be equal to the actual `service.name` + // resource attribute of the remote service if any. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'AuthTokenCache' + PeerServiceKey = attribute.Key("peer.service") +) + +// PeerService returns an attribute KeyValue conforming to the +// "peer.service" semantic conventions. It represents the +// [`service.name`](../../resource/semantic_conventions/README.md#service) of +// the remote service. SHOULD be equal to the actual `service.name` resource +// attribute of the remote service if any. +func PeerService(val string) attribute.KeyValue { + return PeerServiceKey.String(val) +} + +// These attributes may be used for any operation with an authenticated and/or +// authorized enduser. +const ( + // EnduserIDKey is the attribute Key conforming to the "enduser.id" + // semantic conventions. It represents the username or client_id extracted + // from the access token or + // [Authorization](https://tools.ietf.org/html/rfc7235#section-4.2) header + // in the inbound request from outside the system. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'username' + EnduserIDKey = attribute.Key("enduser.id") + + // EnduserRoleKey is the attribute Key conforming to the "enduser.role" + // semantic conventions. It represents the actual/assumed role the client + // is making the request under extracted from token or application security + // context. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'admin' + EnduserRoleKey = attribute.Key("enduser.role") + + // EnduserScopeKey is the attribute Key conforming to the "enduser.scope" + // semantic conventions. It represents the scopes or granted authorities + // the client currently possesses extracted from token or application + // security context. The value would come from the scope associated with an + // [OAuth 2.0 Access + // Token](https://tools.ietf.org/html/rfc6749#section-3.3) or an attribute + // value in a [SAML 2.0 + // Assertion](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'read:message, write:files' + EnduserScopeKey = attribute.Key("enduser.scope") +) + +// EnduserID returns an attribute KeyValue conforming to the "enduser.id" +// semantic conventions. It represents the username or client_id extracted from +// the access token or +// [Authorization](https://tools.ietf.org/html/rfc7235#section-4.2) header in +// the inbound request from outside the system. +func EnduserID(val string) attribute.KeyValue { + return EnduserIDKey.String(val) +} + +// EnduserRole returns an attribute KeyValue conforming to the +// "enduser.role" semantic conventions. It represents the actual/assumed role +// the client is making the request under extracted from token or application +// security context. +func EnduserRole(val string) attribute.KeyValue { + return EnduserRoleKey.String(val) +} + +// EnduserScope returns an attribute KeyValue conforming to the +// "enduser.scope" semantic conventions. It represents the scopes or granted +// authorities the client currently possesses extracted from token or +// application security context. The value would come from the scope associated +// with an [OAuth 2.0 Access +// Token](https://tools.ietf.org/html/rfc6749#section-3.3) or an attribute +// value in a [SAML 2.0 +// Assertion](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). +func EnduserScope(val string) attribute.KeyValue { + return EnduserScopeKey.String(val) +} + +// These attributes may be used for any operation to store information about a +// thread that started a span. +const ( + // ThreadIDKey is the attribute Key conforming to the "thread.id" semantic + // conventions. It represents the current "managed" thread ID (as opposed + // to OS thread ID). + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 42 + ThreadIDKey = attribute.Key("thread.id") + + // ThreadNameKey is the attribute Key conforming to the "thread.name" + // semantic conventions. It represents the current thread name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'main' + ThreadNameKey = attribute.Key("thread.name") +) + +// ThreadID returns an attribute KeyValue conforming to the "thread.id" +// semantic conventions. It represents the current "managed" thread ID (as +// opposed to OS thread ID). +func ThreadID(val int) attribute.KeyValue { + return ThreadIDKey.Int(val) +} + +// ThreadName returns an attribute KeyValue conforming to the "thread.name" +// semantic conventions. It represents the current thread name. +func ThreadName(val string) attribute.KeyValue { + return ThreadNameKey.String(val) +} + +// These attributes allow to report this unit of code and therefore to provide +// more context about the span. +const ( + // CodeFunctionKey is the attribute Key conforming to the "code.function" + // semantic conventions. It represents the method or function name, or + // equivalent (usually rightmost part of the code unit's name). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'serveRequest' + CodeFunctionKey = attribute.Key("code.function") + + // CodeNamespaceKey is the attribute Key conforming to the "code.namespace" + // semantic conventions. It represents the "namespace" within which + // `code.function` is defined. Usually the qualified class or module name, + // such that `code.namespace` + some separator + `code.function` form a + // unique identifier for the code unit. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'com.example.MyHTTPService' + CodeNamespaceKey = attribute.Key("code.namespace") + + // CodeFilepathKey is the attribute Key conforming to the "code.filepath" + // semantic conventions. It represents the source code file name that + // identifies the code unit as uniquely as possible (preferably an absolute + // file path). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '/usr/local/MyApplication/content_root/app/index.php' + CodeFilepathKey = attribute.Key("code.filepath") + + // CodeLineNumberKey is the attribute Key conforming to the "code.lineno" + // semantic conventions. It represents the line number in `code.filepath` + // best representing the operation. It SHOULD point within the code unit + // named in `code.function`. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 42 + CodeLineNumberKey = attribute.Key("code.lineno") + + // CodeColumnKey is the attribute Key conforming to the "code.column" + // semantic conventions. It represents the column number in `code.filepath` + // best representing the operation. It SHOULD point within the code unit + // named in `code.function`. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 16 + CodeColumnKey = attribute.Key("code.column") +) + +// CodeFunction returns an attribute KeyValue conforming to the +// "code.function" semantic conventions. It represents the method or function +// name, or equivalent (usually rightmost part of the code unit's name). +func CodeFunction(val string) attribute.KeyValue { + return CodeFunctionKey.String(val) +} + +// CodeNamespace returns an attribute KeyValue conforming to the +// "code.namespace" semantic conventions. It represents the "namespace" within +// which `code.function` is defined. Usually the qualified class or module +// name, such that `code.namespace` + some separator + `code.function` form a +// unique identifier for the code unit. +func CodeNamespace(val string) attribute.KeyValue { + return CodeNamespaceKey.String(val) +} + +// CodeFilepath returns an attribute KeyValue conforming to the +// "code.filepath" semantic conventions. It represents the source code file +// name that identifies the code unit as uniquely as possible (preferably an +// absolute file path). +func CodeFilepath(val string) attribute.KeyValue { + return CodeFilepathKey.String(val) +} + +// CodeLineNumber returns an attribute KeyValue conforming to the "code.lineno" +// semantic conventions. It represents the line number in `code.filepath` best +// representing the operation. It SHOULD point within the code unit named in +// `code.function`. +func CodeLineNumber(val int) attribute.KeyValue { + return CodeLineNumberKey.Int(val) +} + +// CodeColumn returns an attribute KeyValue conforming to the "code.column" +// semantic conventions. It represents the column number in `code.filepath` +// best representing the operation. It SHOULD point within the code unit named +// in `code.function`. +func CodeColumn(val int) attribute.KeyValue { + return CodeColumnKey.Int(val) +} + +// Semantic conventions for HTTP client and server Spans. +const ( + // HTTPMethodKey is the attribute Key conforming to the "http.method" + // semantic conventions. It represents the hTTP request method. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'GET', 'POST', 'HEAD' + HTTPMethodKey = attribute.Key("http.method") + + // HTTPStatusCodeKey is the attribute Key conforming to the + // "http.status_code" semantic conventions. It represents the [HTTP + // response status code](https://tools.ietf.org/html/rfc7231#section-6). + // + // Type: int + // RequirementLevel: ConditionallyRequired (If and only if one was + // received/sent.) + // Stability: stable + // Examples: 200 + HTTPStatusCodeKey = attribute.Key("http.status_code") + + // HTTPFlavorKey is the attribute Key conforming to the "http.flavor" + // semantic conventions. It represents the kind of HTTP protocol used. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Note: If `net.transport` is not specified, it can be assumed to be + // `IP.TCP` except if `http.flavor` is `QUIC`, in which case `IP.UDP` is + // assumed. + HTTPFlavorKey = attribute.Key("http.flavor") + + // HTTPUserAgentKey is the attribute Key conforming to the + // "http.user_agent" semantic conventions. It represents the value of the + // [HTTP + // User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) + // header sent by the client. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'CERN-LineMode/2.15 libwww/2.17b3' + HTTPUserAgentKey = attribute.Key("http.user_agent") + + // HTTPRequestContentLengthKey is the attribute Key conforming to the + // "http.request_content_length" semantic conventions. It represents the + // size of the request payload body in bytes. This is the number of bytes + // transferred excluding headers and is often, but not always, present as + // the + // [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) + // header. For requests using transport encoding, this should be the + // compressed size. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 3495 + HTTPRequestContentLengthKey = attribute.Key("http.request_content_length") + + // HTTPResponseContentLengthKey is the attribute Key conforming to the + // "http.response_content_length" semantic conventions. It represents the + // size of the response payload body in bytes. This is the number of bytes + // transferred excluding headers and is often, but not always, present as + // the + // [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) + // header. For requests using transport encoding, this should be the + // compressed size. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 3495 + HTTPResponseContentLengthKey = attribute.Key("http.response_content_length") +) + +var ( + // HTTP/1.0 + HTTPFlavorHTTP10 = HTTPFlavorKey.String("1.0") + // HTTP/1.1 + HTTPFlavorHTTP11 = HTTPFlavorKey.String("1.1") + // HTTP/2 + HTTPFlavorHTTP20 = HTTPFlavorKey.String("2.0") + // HTTP/3 + HTTPFlavorHTTP30 = HTTPFlavorKey.String("3.0") + // SPDY protocol + HTTPFlavorSPDY = HTTPFlavorKey.String("SPDY") + // QUIC protocol + HTTPFlavorQUIC = HTTPFlavorKey.String("QUIC") +) + +// HTTPMethod returns an attribute KeyValue conforming to the "http.method" +// semantic conventions. It represents the hTTP request method. +func HTTPMethod(val string) attribute.KeyValue { + return HTTPMethodKey.String(val) +} + +// HTTPStatusCode returns an attribute KeyValue conforming to the +// "http.status_code" semantic conventions. It represents the [HTTP response +// status code](https://tools.ietf.org/html/rfc7231#section-6). +func HTTPStatusCode(val int) attribute.KeyValue { + return HTTPStatusCodeKey.Int(val) +} + +// HTTPUserAgent returns an attribute KeyValue conforming to the +// "http.user_agent" semantic conventions. It represents the value of the [HTTP +// User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) +// header sent by the client. +func HTTPUserAgent(val string) attribute.KeyValue { + return HTTPUserAgentKey.String(val) +} + +// HTTPRequestContentLength returns an attribute KeyValue conforming to the +// "http.request_content_length" semantic conventions. It represents the size +// of the request payload body in bytes. This is the number of bytes +// transferred excluding headers and is often, but not always, present as the +// [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) +// header. For requests using transport encoding, this should be the compressed +// size. +func HTTPRequestContentLength(val int) attribute.KeyValue { + return HTTPRequestContentLengthKey.Int(val) +} + +// HTTPResponseContentLength returns an attribute KeyValue conforming to the +// "http.response_content_length" semantic conventions. It represents the size +// of the response payload body in bytes. This is the number of bytes +// transferred excluding headers and is often, but not always, present as the +// [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) +// header. For requests using transport encoding, this should be the compressed +// size. +func HTTPResponseContentLength(val int) attribute.KeyValue { + return HTTPResponseContentLengthKey.Int(val) +} + +// Semantic Convention for HTTP Client +const ( + // HTTPURLKey is the attribute Key conforming to the "http.url" semantic + // conventions. It represents the full HTTP request URL in the form + // `scheme://host[:port]/path?query[#fragment]`. Usually the fragment is + // not transmitted over HTTP, but if it is known, it should be included + // nevertheless. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'https://www.foo.bar/search?q=OpenTelemetry#SemConv' + // Note: `http.url` MUST NOT contain credentials passed via URL in form of + // `https://username:password@www.example.com/`. In such case the + // attribute's value should be `https://www.example.com/`. + HTTPURLKey = attribute.Key("http.url") + + // HTTPResendCountKey is the attribute Key conforming to the + // "http.resend_count" semantic conventions. It represents the ordinal + // number of request resending attempt (for any reason, including + // redirects). + // + // Type: int + // RequirementLevel: Recommended (if and only if request was retried.) + // Stability: stable + // Examples: 3 + // Note: The resend count SHOULD be updated each time an HTTP request gets + // resent by the client, regardless of what was the cause of the resending + // (e.g. redirection, authorization failure, 503 Server Unavailable, + // network issues, or any other). + HTTPResendCountKey = attribute.Key("http.resend_count") +) + +// HTTPURL returns an attribute KeyValue conforming to the "http.url" +// semantic conventions. It represents the full HTTP request URL in the form +// `scheme://host[:port]/path?query[#fragment]`. Usually the fragment is not +// transmitted over HTTP, but if it is known, it should be included +// nevertheless. +func HTTPURL(val string) attribute.KeyValue { + return HTTPURLKey.String(val) +} + +// HTTPResendCount returns an attribute KeyValue conforming to the +// "http.resend_count" semantic conventions. It represents the ordinal number +// of request resending attempt (for any reason, including redirects). +func HTTPResendCount(val int) attribute.KeyValue { + return HTTPResendCountKey.Int(val) +} + +// Semantic Convention for HTTP Server +const ( + // HTTPSchemeKey is the attribute Key conforming to the "http.scheme" + // semantic conventions. It represents the URI scheme identifying the used + // protocol. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'http', 'https' + HTTPSchemeKey = attribute.Key("http.scheme") + + // HTTPTargetKey is the attribute Key conforming to the "http.target" + // semantic conventions. It represents the full request target as passed in + // a HTTP request line or equivalent. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: '/path/12314/?q=ddds' + HTTPTargetKey = attribute.Key("http.target") + + // HTTPRouteKey is the attribute Key conforming to the "http.route" + // semantic conventions. It represents the matched route (path template in + // the format used by the respective server framework). See note below + // + // Type: string + // RequirementLevel: ConditionallyRequired (If and only if it's available) + // Stability: stable + // Examples: '/users/:userID?', '{controller}/{action}/{id?}' + // Note: 'http.route' MUST NOT be populated when this is not supported by + // the HTTP server framework as the route attribute should have + // low-cardinality and the URI path can NOT substitute it. + HTTPRouteKey = attribute.Key("http.route") + + // HTTPClientIPKey is the attribute Key conforming to the "http.client_ip" + // semantic conventions. It represents the IP address of the original + // client behind all proxies, if known (e.g. from + // [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For)). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '83.164.160.102' + // Note: This is not necessarily the same as `net.sock.peer.addr`, which + // would + // identify the network-level peer, which may be a proxy. + // + // This attribute should be set when a source of information different + // from the one used for `net.sock.peer.addr`, is available even if that + // other + // source just confirms the same value as `net.sock.peer.addr`. + // Rationale: For `net.sock.peer.addr`, one typically does not know if it + // comes from a proxy, reverse proxy, or the actual client. Setting + // `http.client_ip` when it's the same as `net.sock.peer.addr` means that + // one is at least somewhat confident that the address is not that of + // the closest proxy. + HTTPClientIPKey = attribute.Key("http.client_ip") +) + +// HTTPScheme returns an attribute KeyValue conforming to the "http.scheme" +// semantic conventions. It represents the URI scheme identifying the used +// protocol. +func HTTPScheme(val string) attribute.KeyValue { + return HTTPSchemeKey.String(val) +} + +// HTTPTarget returns an attribute KeyValue conforming to the "http.target" +// semantic conventions. It represents the full request target as passed in a +// HTTP request line or equivalent. +func HTTPTarget(val string) attribute.KeyValue { + return HTTPTargetKey.String(val) +} + +// HTTPRoute returns an attribute KeyValue conforming to the "http.route" +// semantic conventions. It represents the matched route (path template in the +// format used by the respective server framework). See note below +func HTTPRoute(val string) attribute.KeyValue { + return HTTPRouteKey.String(val) +} + +// HTTPClientIP returns an attribute KeyValue conforming to the +// "http.client_ip" semantic conventions. It represents the IP address of the +// original client behind all proxies, if known (e.g. from +// [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For)). +func HTTPClientIP(val string) attribute.KeyValue { + return HTTPClientIPKey.String(val) +} + +// Attributes that exist for multiple DynamoDB request types. +const ( + // AWSDynamoDBTableNamesKey is the attribute Key conforming to the + // "aws.dynamodb.table_names" semantic conventions. It represents the keys + // in the `RequestItems` object field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Users', 'Cats' + AWSDynamoDBTableNamesKey = attribute.Key("aws.dynamodb.table_names") + + // AWSDynamoDBConsumedCapacityKey is the attribute Key conforming to the + // "aws.dynamodb.consumed_capacity" semantic conventions. It represents the + // JSON-serialized value of each item in the `ConsumedCapacity` response + // field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "CapacityUnits": number, "GlobalSecondaryIndexes": { + // "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }, "LocalSecondaryIndexes": { "string" : + // { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }, "ReadCapacityUnits": number, "Table": + // { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number }, "TableName": "string", + // "WriteCapacityUnits": number }' + AWSDynamoDBConsumedCapacityKey = attribute.Key("aws.dynamodb.consumed_capacity") + + // AWSDynamoDBItemCollectionMetricsKey is the attribute Key conforming to + // the "aws.dynamodb.item_collection_metrics" semantic conventions. It + // represents the JSON-serialized value of the `ItemCollectionMetrics` + // response field. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "string" : [ { "ItemCollectionKey": { "string" : { "B": + // blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { + // "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], + // "NULL": boolean, "S": "string", "SS": [ "string" ] } }, + // "SizeEstimateRangeGB": [ number ] } ] }' + AWSDynamoDBItemCollectionMetricsKey = attribute.Key("aws.dynamodb.item_collection_metrics") + + // AWSDynamoDBProvisionedReadCapacityKey is the attribute Key conforming to + // the "aws.dynamodb.provisioned_read_capacity" semantic conventions. It + // represents the value of the `ProvisionedThroughput.ReadCapacityUnits` + // request parameter. + // + // Type: double + // RequirementLevel: Optional + // Stability: stable + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedReadCapacityKey = attribute.Key("aws.dynamodb.provisioned_read_capacity") + + // AWSDynamoDBProvisionedWriteCapacityKey is the attribute Key conforming + // to the "aws.dynamodb.provisioned_write_capacity" semantic conventions. + // It represents the value of the + // `ProvisionedThroughput.WriteCapacityUnits` request parameter. + // + // Type: double + // RequirementLevel: Optional + // Stability: stable + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedWriteCapacityKey = attribute.Key("aws.dynamodb.provisioned_write_capacity") + + // AWSDynamoDBConsistentReadKey is the attribute Key conforming to the + // "aws.dynamodb.consistent_read" semantic conventions. It represents the + // value of the `ConsistentRead` request parameter. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + AWSDynamoDBConsistentReadKey = attribute.Key("aws.dynamodb.consistent_read") + + // AWSDynamoDBProjectionKey is the attribute Key conforming to the + // "aws.dynamodb.projection" semantic conventions. It represents the value + // of the `ProjectionExpression` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Title', 'Title, Price, Color', 'Title, Description, + // RelatedItems, ProductReviews' + AWSDynamoDBProjectionKey = attribute.Key("aws.dynamodb.projection") + + // AWSDynamoDBLimitKey is the attribute Key conforming to the + // "aws.dynamodb.limit" semantic conventions. It represents the value of + // the `Limit` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 10 + AWSDynamoDBLimitKey = attribute.Key("aws.dynamodb.limit") + + // AWSDynamoDBAttributesToGetKey is the attribute Key conforming to the + // "aws.dynamodb.attributes_to_get" semantic conventions. It represents the + // value of the `AttributesToGet` request parameter. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: 'lives', 'id' + AWSDynamoDBAttributesToGetKey = attribute.Key("aws.dynamodb.attributes_to_get") + + // AWSDynamoDBIndexNameKey is the attribute Key conforming to the + // "aws.dynamodb.index_name" semantic conventions. It represents the value + // of the `IndexName` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'name_to_group' + AWSDynamoDBIndexNameKey = attribute.Key("aws.dynamodb.index_name") + + // AWSDynamoDBSelectKey is the attribute Key conforming to the + // "aws.dynamodb.select" semantic conventions. It represents the value of + // the `Select` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'ALL_ATTRIBUTES', 'COUNT' + AWSDynamoDBSelectKey = attribute.Key("aws.dynamodb.select") +) + +// AWSDynamoDBTableNames returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_names" semantic conventions. It represents the keys in +// the `RequestItems` object field. +func AWSDynamoDBTableNames(val ...string) attribute.KeyValue { + return AWSDynamoDBTableNamesKey.StringSlice(val) +} + +// AWSDynamoDBConsumedCapacity returns an attribute KeyValue conforming to +// the "aws.dynamodb.consumed_capacity" semantic conventions. It represents the +// JSON-serialized value of each item in the `ConsumedCapacity` response field. +func AWSDynamoDBConsumedCapacity(val ...string) attribute.KeyValue { + return AWSDynamoDBConsumedCapacityKey.StringSlice(val) +} + +// AWSDynamoDBItemCollectionMetrics returns an attribute KeyValue conforming +// to the "aws.dynamodb.item_collection_metrics" semantic conventions. It +// represents the JSON-serialized value of the `ItemCollectionMetrics` response +// field. +func AWSDynamoDBItemCollectionMetrics(val string) attribute.KeyValue { + return AWSDynamoDBItemCollectionMetricsKey.String(val) +} + +// AWSDynamoDBProvisionedReadCapacity returns an attribute KeyValue +// conforming to the "aws.dynamodb.provisioned_read_capacity" semantic +// conventions. It represents the value of the +// `ProvisionedThroughput.ReadCapacityUnits` request parameter. +func AWSDynamoDBProvisionedReadCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedReadCapacityKey.Float64(val) +} + +// AWSDynamoDBProvisionedWriteCapacity returns an attribute KeyValue +// conforming to the "aws.dynamodb.provisioned_write_capacity" semantic +// conventions. It represents the value of the +// `ProvisionedThroughput.WriteCapacityUnits` request parameter. +func AWSDynamoDBProvisionedWriteCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedWriteCapacityKey.Float64(val) +} + +// AWSDynamoDBConsistentRead returns an attribute KeyValue conforming to the +// "aws.dynamodb.consistent_read" semantic conventions. It represents the value +// of the `ConsistentRead` request parameter. +func AWSDynamoDBConsistentRead(val bool) attribute.KeyValue { + return AWSDynamoDBConsistentReadKey.Bool(val) +} + +// AWSDynamoDBProjection returns an attribute KeyValue conforming to the +// "aws.dynamodb.projection" semantic conventions. It represents the value of +// the `ProjectionExpression` request parameter. +func AWSDynamoDBProjection(val string) attribute.KeyValue { + return AWSDynamoDBProjectionKey.String(val) +} + +// AWSDynamoDBLimit returns an attribute KeyValue conforming to the +// "aws.dynamodb.limit" semantic conventions. It represents the value of the +// `Limit` request parameter. +func AWSDynamoDBLimit(val int) attribute.KeyValue { + return AWSDynamoDBLimitKey.Int(val) +} + +// AWSDynamoDBAttributesToGet returns an attribute KeyValue conforming to +// the "aws.dynamodb.attributes_to_get" semantic conventions. It represents the +// value of the `AttributesToGet` request parameter. +func AWSDynamoDBAttributesToGet(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributesToGetKey.StringSlice(val) +} + +// AWSDynamoDBIndexName returns an attribute KeyValue conforming to the +// "aws.dynamodb.index_name" semantic conventions. It represents the value of +// the `IndexName` request parameter. +func AWSDynamoDBIndexName(val string) attribute.KeyValue { + return AWSDynamoDBIndexNameKey.String(val) +} + +// AWSDynamoDBSelect returns an attribute KeyValue conforming to the +// "aws.dynamodb.select" semantic conventions. It represents the value of the +// `Select` request parameter. +func AWSDynamoDBSelect(val string) attribute.KeyValue { + return AWSDynamoDBSelectKey.String(val) +} + +// DynamoDB.CreateTable +const ( + // AWSDynamoDBGlobalSecondaryIndexesKey is the attribute Key conforming to + // the "aws.dynamodb.global_secondary_indexes" semantic conventions. It + // represents the JSON-serialized value of each item of the + // `GlobalSecondaryIndexes` request field + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "IndexName": "string", "KeySchema": [ { "AttributeName": + // "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ + // "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { + // "ReadCapacityUnits": number, "WriteCapacityUnits": number } }' + AWSDynamoDBGlobalSecondaryIndexesKey = attribute.Key("aws.dynamodb.global_secondary_indexes") + + // AWSDynamoDBLocalSecondaryIndexesKey is the attribute Key conforming to + // the "aws.dynamodb.local_secondary_indexes" semantic conventions. It + // represents the JSON-serialized value of each item of the + // `LocalSecondaryIndexes` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "IndexARN": "string", "IndexName": "string", + // "IndexSizeBytes": number, "ItemCount": number, "KeySchema": [ { + // "AttributeName": "string", "KeyType": "string" } ], "Projection": { + // "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } }' + AWSDynamoDBLocalSecondaryIndexesKey = attribute.Key("aws.dynamodb.local_secondary_indexes") +) + +// AWSDynamoDBGlobalSecondaryIndexes returns an attribute KeyValue +// conforming to the "aws.dynamodb.global_secondary_indexes" semantic +// conventions. It represents the JSON-serialized value of each item of the +// `GlobalSecondaryIndexes` request field +func AWSDynamoDBGlobalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexesKey.StringSlice(val) +} + +// AWSDynamoDBLocalSecondaryIndexes returns an attribute KeyValue conforming +// to the "aws.dynamodb.local_secondary_indexes" semantic conventions. It +// represents the JSON-serialized value of each item of the +// `LocalSecondaryIndexes` request field. +func AWSDynamoDBLocalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBLocalSecondaryIndexesKey.StringSlice(val) +} + +// DynamoDB.ListTables +const ( + // AWSDynamoDBExclusiveStartTableKey is the attribute Key conforming to the + // "aws.dynamodb.exclusive_start_table" semantic conventions. It represents + // the value of the `ExclusiveStartTableName` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Users', 'CatsTable' + AWSDynamoDBExclusiveStartTableKey = attribute.Key("aws.dynamodb.exclusive_start_table") + + // AWSDynamoDBTableCountKey is the attribute Key conforming to the + // "aws.dynamodb.table_count" semantic conventions. It represents the the + // number of items in the `TableNames` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 20 + AWSDynamoDBTableCountKey = attribute.Key("aws.dynamodb.table_count") +) + +// AWSDynamoDBExclusiveStartTable returns an attribute KeyValue conforming +// to the "aws.dynamodb.exclusive_start_table" semantic conventions. It +// represents the value of the `ExclusiveStartTableName` request parameter. +func AWSDynamoDBExclusiveStartTable(val string) attribute.KeyValue { + return AWSDynamoDBExclusiveStartTableKey.String(val) +} + +// AWSDynamoDBTableCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_count" semantic conventions. It represents the the +// number of items in the `TableNames` response parameter. +func AWSDynamoDBTableCount(val int) attribute.KeyValue { + return AWSDynamoDBTableCountKey.Int(val) +} + +// DynamoDB.Query +const ( + // AWSDynamoDBScanForwardKey is the attribute Key conforming to the + // "aws.dynamodb.scan_forward" semantic conventions. It represents the + // value of the `ScanIndexForward` request parameter. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + AWSDynamoDBScanForwardKey = attribute.Key("aws.dynamodb.scan_forward") +) + +// AWSDynamoDBScanForward returns an attribute KeyValue conforming to the +// "aws.dynamodb.scan_forward" semantic conventions. It represents the value of +// the `ScanIndexForward` request parameter. +func AWSDynamoDBScanForward(val bool) attribute.KeyValue { + return AWSDynamoDBScanForwardKey.Bool(val) +} + +// DynamoDB.Scan +const ( + // AWSDynamoDBSegmentKey is the attribute Key conforming to the + // "aws.dynamodb.segment" semantic conventions. It represents the value of + // the `Segment` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 10 + AWSDynamoDBSegmentKey = attribute.Key("aws.dynamodb.segment") + + // AWSDynamoDBTotalSegmentsKey is the attribute Key conforming to the + // "aws.dynamodb.total_segments" semantic conventions. It represents the + // value of the `TotalSegments` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 100 + AWSDynamoDBTotalSegmentsKey = attribute.Key("aws.dynamodb.total_segments") + + // AWSDynamoDBCountKey is the attribute Key conforming to the + // "aws.dynamodb.count" semantic conventions. It represents the value of + // the `Count` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 10 + AWSDynamoDBCountKey = attribute.Key("aws.dynamodb.count") + + // AWSDynamoDBScannedCountKey is the attribute Key conforming to the + // "aws.dynamodb.scanned_count" semantic conventions. It represents the + // value of the `ScannedCount` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 50 + AWSDynamoDBScannedCountKey = attribute.Key("aws.dynamodb.scanned_count") +) + +// AWSDynamoDBSegment returns an attribute KeyValue conforming to the +// "aws.dynamodb.segment" semantic conventions. It represents the value of the +// `Segment` request parameter. +func AWSDynamoDBSegment(val int) attribute.KeyValue { + return AWSDynamoDBSegmentKey.Int(val) +} + +// AWSDynamoDBTotalSegments returns an attribute KeyValue conforming to the +// "aws.dynamodb.total_segments" semantic conventions. It represents the value +// of the `TotalSegments` request parameter. +func AWSDynamoDBTotalSegments(val int) attribute.KeyValue { + return AWSDynamoDBTotalSegmentsKey.Int(val) +} + +// AWSDynamoDBCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.count" semantic conventions. It represents the value of the +// `Count` response parameter. +func AWSDynamoDBCount(val int) attribute.KeyValue { + return AWSDynamoDBCountKey.Int(val) +} + +// AWSDynamoDBScannedCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.scanned_count" semantic conventions. It represents the value +// of the `ScannedCount` response parameter. +func AWSDynamoDBScannedCount(val int) attribute.KeyValue { + return AWSDynamoDBScannedCountKey.Int(val) +} + +// DynamoDB.UpdateTable +const ( + // AWSDynamoDBAttributeDefinitionsKey is the attribute Key conforming to + // the "aws.dynamodb.attribute_definitions" semantic conventions. It + // represents the JSON-serialized value of each item in the + // `AttributeDefinitions` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "AttributeName": "string", "AttributeType": "string" }' + AWSDynamoDBAttributeDefinitionsKey = attribute.Key("aws.dynamodb.attribute_definitions") + + // AWSDynamoDBGlobalSecondaryIndexUpdatesKey is the attribute Key + // conforming to the "aws.dynamodb.global_secondary_index_updates" semantic + // conventions. It represents the JSON-serialized value of each item in the + // the `GlobalSecondaryIndexUpdates` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: '{ "Create": { "IndexName": "string", "KeySchema": [ { + // "AttributeName": "string", "KeyType": "string" } ], "Projection": { + // "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, + // "ProvisionedThroughput": { "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }' + AWSDynamoDBGlobalSecondaryIndexUpdatesKey = attribute.Key("aws.dynamodb.global_secondary_index_updates") +) + +// AWSDynamoDBAttributeDefinitions returns an attribute KeyValue conforming +// to the "aws.dynamodb.attribute_definitions" semantic conventions. It +// represents the JSON-serialized value of each item in the +// `AttributeDefinitions` request field. +func AWSDynamoDBAttributeDefinitions(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributeDefinitionsKey.StringSlice(val) +} + +// AWSDynamoDBGlobalSecondaryIndexUpdates returns an attribute KeyValue +// conforming to the "aws.dynamodb.global_secondary_index_updates" semantic +// conventions. It represents the JSON-serialized value of each item in the the +// `GlobalSecondaryIndexUpdates` request field. +func AWSDynamoDBGlobalSecondaryIndexUpdates(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexUpdatesKey.StringSlice(val) +} + +// Semantic conventions to apply when instrumenting the GraphQL implementation. +// They map GraphQL operations to attributes on a Span. +const ( + // GraphqlOperationNameKey is the attribute Key conforming to the + // "graphql.operation.name" semantic conventions. It represents the name of + // the operation being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'findBookByID' + GraphqlOperationNameKey = attribute.Key("graphql.operation.name") + + // GraphqlOperationTypeKey is the attribute Key conforming to the + // "graphql.operation.type" semantic conventions. It represents the type of + // the operation being executed. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'query', 'mutation', 'subscription' + GraphqlOperationTypeKey = attribute.Key("graphql.operation.type") + + // GraphqlDocumentKey is the attribute Key conforming to the + // "graphql.document" semantic conventions. It represents the GraphQL + // document being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'query findBookByID { bookByID(id: ?) { name } }' + // Note: The value may be sanitized to exclude sensitive information. + GraphqlDocumentKey = attribute.Key("graphql.document") +) + +var ( + // GraphQL query + GraphqlOperationTypeQuery = GraphqlOperationTypeKey.String("query") + // GraphQL mutation + GraphqlOperationTypeMutation = GraphqlOperationTypeKey.String("mutation") + // GraphQL subscription + GraphqlOperationTypeSubscription = GraphqlOperationTypeKey.String("subscription") +) + +// GraphqlOperationName returns an attribute KeyValue conforming to the +// "graphql.operation.name" semantic conventions. It represents the name of the +// operation being executed. +func GraphqlOperationName(val string) attribute.KeyValue { + return GraphqlOperationNameKey.String(val) +} + +// GraphqlDocument returns an attribute KeyValue conforming to the +// "graphql.document" semantic conventions. It represents the GraphQL document +// being executed. +func GraphqlDocument(val string) attribute.KeyValue { + return GraphqlDocumentKey.String(val) +} + +// Semantic convention describing per-message attributes populated on messaging +// spans or links. +const ( + // MessagingMessageIDKey is the attribute Key conforming to the + // "messaging.message.id" semantic conventions. It represents a value used + // by the messaging system as an identifier for the message, represented as + // a string. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '452a7c7c7c7048c2f887f61572b18fc2' + MessagingMessageIDKey = attribute.Key("messaging.message.id") + + // MessagingMessageConversationIDKey is the attribute Key conforming to the + // "messaging.message.conversation_id" semantic conventions. It represents + // the [conversation ID](#conversations) identifying the conversation to + // which the message belongs, represented as a string. Sometimes called + // "Correlation ID". + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'MyConversationID' + MessagingMessageConversationIDKey = attribute.Key("messaging.message.conversation_id") + + // MessagingMessagePayloadSizeBytesKey is the attribute Key conforming to + // the "messaging.message.payload_size_bytes" semantic conventions. It + // represents the (uncompressed) size of the message payload in bytes. Also + // use this attribute if it is unknown whether the compressed or + // uncompressed payload size is reported. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 2738 + MessagingMessagePayloadSizeBytesKey = attribute.Key("messaging.message.payload_size_bytes") + + // MessagingMessagePayloadCompressedSizeBytesKey is the attribute Key + // conforming to the "messaging.message.payload_compressed_size_bytes" + // semantic conventions. It represents the compressed size of the message + // payload in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 2048 + MessagingMessagePayloadCompressedSizeBytesKey = attribute.Key("messaging.message.payload_compressed_size_bytes") +) + +// MessagingMessageID returns an attribute KeyValue conforming to the +// "messaging.message.id" semantic conventions. It represents a value used by +// the messaging system as an identifier for the message, represented as a +// string. +func MessagingMessageID(val string) attribute.KeyValue { + return MessagingMessageIDKey.String(val) +} + +// MessagingMessageConversationID returns an attribute KeyValue conforming +// to the "messaging.message.conversation_id" semantic conventions. It +// represents the [conversation ID](#conversations) identifying the +// conversation to which the message belongs, represented as a string. +// Sometimes called "Correlation ID". +func MessagingMessageConversationID(val string) attribute.KeyValue { + return MessagingMessageConversationIDKey.String(val) +} + +// MessagingMessagePayloadSizeBytes returns an attribute KeyValue conforming +// to the "messaging.message.payload_size_bytes" semantic conventions. It +// represents the (uncompressed) size of the message payload in bytes. Also use +// this attribute if it is unknown whether the compressed or uncompressed +// payload size is reported. +func MessagingMessagePayloadSizeBytes(val int) attribute.KeyValue { + return MessagingMessagePayloadSizeBytesKey.Int(val) +} + +// MessagingMessagePayloadCompressedSizeBytes returns an attribute KeyValue +// conforming to the "messaging.message.payload_compressed_size_bytes" semantic +// conventions. It represents the compressed size of the message payload in +// bytes. +func MessagingMessagePayloadCompressedSizeBytes(val int) attribute.KeyValue { + return MessagingMessagePayloadCompressedSizeBytesKey.Int(val) +} + +// Semantic convention for attributes that describe messaging destination on +// broker +const ( + // MessagingDestinationNameKey is the attribute Key conforming to the + // "messaging.destination.name" semantic conventions. It represents the + // message destination name + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'MyQueue', 'MyTopic' + // Note: Destination name SHOULD uniquely identify a specific queue, topic + // or other entity within the broker. If + // the broker does not have such notion, the destination name SHOULD + // uniquely identify the broker. + MessagingDestinationNameKey = attribute.Key("messaging.destination.name") + + // MessagingDestinationKindKey is the attribute Key conforming to the + // "messaging.destination.kind" semantic conventions. It represents the + // kind of message destination + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + MessagingDestinationKindKey = attribute.Key("messaging.destination.kind") + + // MessagingDestinationTemplateKey is the attribute Key conforming to the + // "messaging.destination.template" semantic conventions. It represents the + // low cardinality representation of the messaging destination name + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '/customers/{customerID}' + // Note: Destination names could be constructed from templates. An example + // would be a destination name involving a user name or product id. + // Although the destination name in this case is of high cardinality, the + // underlying template is of low cardinality and can be effectively used + // for grouping and aggregation. + MessagingDestinationTemplateKey = attribute.Key("messaging.destination.template") + + // MessagingDestinationTemporaryKey is the attribute Key conforming to the + // "messaging.destination.temporary" semantic conventions. It represents a + // boolean that is true if the message destination is temporary and might + // not exist anymore after messages are processed. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + MessagingDestinationTemporaryKey = attribute.Key("messaging.destination.temporary") + + // MessagingDestinationAnonymousKey is the attribute Key conforming to the + // "messaging.destination.anonymous" semantic conventions. It represents a + // boolean that is true if the message destination is anonymous (could be + // unnamed or have auto-generated name). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + MessagingDestinationAnonymousKey = attribute.Key("messaging.destination.anonymous") +) + +var ( + // A message sent to a queue + MessagingDestinationKindQueue = MessagingDestinationKindKey.String("queue") + // A message sent to a topic + MessagingDestinationKindTopic = MessagingDestinationKindKey.String("topic") +) + +// MessagingDestinationName returns an attribute KeyValue conforming to the +// "messaging.destination.name" semantic conventions. It represents the message +// destination name +func MessagingDestinationName(val string) attribute.KeyValue { + return MessagingDestinationNameKey.String(val) +} + +// MessagingDestinationTemplate returns an attribute KeyValue conforming to +// the "messaging.destination.template" semantic conventions. It represents the +// low cardinality representation of the messaging destination name +func MessagingDestinationTemplate(val string) attribute.KeyValue { + return MessagingDestinationTemplateKey.String(val) +} + +// MessagingDestinationTemporary returns an attribute KeyValue conforming to +// the "messaging.destination.temporary" semantic conventions. It represents a +// boolean that is true if the message destination is temporary and might not +// exist anymore after messages are processed. +func MessagingDestinationTemporary(val bool) attribute.KeyValue { + return MessagingDestinationTemporaryKey.Bool(val) +} + +// MessagingDestinationAnonymous returns an attribute KeyValue conforming to +// the "messaging.destination.anonymous" semantic conventions. It represents a +// boolean that is true if the message destination is anonymous (could be +// unnamed or have auto-generated name). +func MessagingDestinationAnonymous(val bool) attribute.KeyValue { + return MessagingDestinationAnonymousKey.Bool(val) +} + +// Semantic convention for attributes that describe messaging source on broker +const ( + // MessagingSourceNameKey is the attribute Key conforming to the + // "messaging.source.name" semantic conventions. It represents the message + // source name + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'MyQueue', 'MyTopic' + // Note: Source name SHOULD uniquely identify a specific queue, topic, or + // other entity within the broker. If + // the broker does not have such notion, the source name SHOULD uniquely + // identify the broker. + MessagingSourceNameKey = attribute.Key("messaging.source.name") + + // MessagingSourceKindKey is the attribute Key conforming to the + // "messaging.source.kind" semantic conventions. It represents the kind of + // message source + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + MessagingSourceKindKey = attribute.Key("messaging.source.kind") + + // MessagingSourceTemplateKey is the attribute Key conforming to the + // "messaging.source.template" semantic conventions. It represents the low + // cardinality representation of the messaging source name + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '/customers/{customerID}' + // Note: Source names could be constructed from templates. An example would + // be a source name involving a user name or product id. Although the + // source name in this case is of high cardinality, the underlying template + // is of low cardinality and can be effectively used for grouping and + // aggregation. + MessagingSourceTemplateKey = attribute.Key("messaging.source.template") + + // MessagingSourceTemporaryKey is the attribute Key conforming to the + // "messaging.source.temporary" semantic conventions. It represents a + // boolean that is true if the message source is temporary and might not + // exist anymore after messages are processed. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + MessagingSourceTemporaryKey = attribute.Key("messaging.source.temporary") + + // MessagingSourceAnonymousKey is the attribute Key conforming to the + // "messaging.source.anonymous" semantic conventions. It represents a + // boolean that is true if the message source is anonymous (could be + // unnamed or have auto-generated name). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + MessagingSourceAnonymousKey = attribute.Key("messaging.source.anonymous") +) + +var ( + // A message received from a queue + MessagingSourceKindQueue = MessagingSourceKindKey.String("queue") + // A message received from a topic + MessagingSourceKindTopic = MessagingSourceKindKey.String("topic") +) + +// MessagingSourceName returns an attribute KeyValue conforming to the +// "messaging.source.name" semantic conventions. It represents the message +// source name +func MessagingSourceName(val string) attribute.KeyValue { + return MessagingSourceNameKey.String(val) +} + +// MessagingSourceTemplate returns an attribute KeyValue conforming to the +// "messaging.source.template" semantic conventions. It represents the low +// cardinality representation of the messaging source name +func MessagingSourceTemplate(val string) attribute.KeyValue { + return MessagingSourceTemplateKey.String(val) +} + +// MessagingSourceTemporary returns an attribute KeyValue conforming to the +// "messaging.source.temporary" semantic conventions. It represents a boolean +// that is true if the message source is temporary and might not exist anymore +// after messages are processed. +func MessagingSourceTemporary(val bool) attribute.KeyValue { + return MessagingSourceTemporaryKey.Bool(val) +} + +// MessagingSourceAnonymous returns an attribute KeyValue conforming to the +// "messaging.source.anonymous" semantic conventions. It represents a boolean +// that is true if the message source is anonymous (could be unnamed or have +// auto-generated name). +func MessagingSourceAnonymous(val bool) attribute.KeyValue { + return MessagingSourceAnonymousKey.Bool(val) +} + +// General attributes used in messaging systems. +const ( + // MessagingSystemKey is the attribute Key conforming to the + // "messaging.system" semantic conventions. It represents a string + // identifying the messaging system. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'kafka', 'rabbitmq', 'rocketmq', 'activemq', 'AmazonSQS' + MessagingSystemKey = attribute.Key("messaging.system") + + // MessagingOperationKey is the attribute Key conforming to the + // "messaging.operation" semantic conventions. It represents a string + // identifying the kind of messaging operation as defined in the [Operation + // names](#operation-names) section above. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + // Note: If a custom value is used, it MUST be of low cardinality. + MessagingOperationKey = attribute.Key("messaging.operation") + + // MessagingBatchMessageCountKey is the attribute Key conforming to the + // "messaging.batch.message_count" semantic conventions. It represents the + // number of messages sent, received, or processed in the scope of the + // batching operation. + // + // Type: int + // RequirementLevel: ConditionallyRequired (If the span describes an + // operation on a batch of messages.) + // Stability: stable + // Examples: 0, 1, 2 + // Note: Instrumentations SHOULD NOT set `messaging.batch.message_count` on + // spans that operate with a single message. When a messaging client + // library supports both batch and single-message API for the same + // operation, instrumentations SHOULD use `messaging.batch.message_count` + // for batching APIs and SHOULD NOT use it for single-message APIs. + MessagingBatchMessageCountKey = attribute.Key("messaging.batch.message_count") +) + +var ( + // publish + MessagingOperationPublish = MessagingOperationKey.String("publish") + // receive + MessagingOperationReceive = MessagingOperationKey.String("receive") + // process + MessagingOperationProcess = MessagingOperationKey.String("process") +) + +// MessagingSystem returns an attribute KeyValue conforming to the +// "messaging.system" semantic conventions. It represents a string identifying +// the messaging system. +func MessagingSystem(val string) attribute.KeyValue { + return MessagingSystemKey.String(val) +} + +// MessagingBatchMessageCount returns an attribute KeyValue conforming to +// the "messaging.batch.message_count" semantic conventions. It represents the +// number of messages sent, received, or processed in the scope of the batching +// operation. +func MessagingBatchMessageCount(val int) attribute.KeyValue { + return MessagingBatchMessageCountKey.Int(val) +} + +// Semantic convention for a consumer of messages received from a messaging +// system +const ( + // MessagingConsumerIDKey is the attribute Key conforming to the + // "messaging.consumer.id" semantic conventions. It represents the + // identifier for the consumer receiving a message. For Kafka, set it to + // `{messaging.kafka.consumer.group} - {messaging.kafka.client_id}`, if + // both are present, or only `messaging.kafka.consumer.group`. For brokers, + // such as RabbitMQ and Artemis, set it to the `client_id` of the client + // consuming the message. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'mygroup - client-6' + MessagingConsumerIDKey = attribute.Key("messaging.consumer.id") +) + +// MessagingConsumerID returns an attribute KeyValue conforming to the +// "messaging.consumer.id" semantic conventions. It represents the identifier +// for the consumer receiving a message. For Kafka, set it to +// `{messaging.kafka.consumer.group} - {messaging.kafka.client_id}`, if both +// are present, or only `messaging.kafka.consumer.group`. For brokers, such as +// RabbitMQ and Artemis, set it to the `client_id` of the client consuming the +// message. +func MessagingConsumerID(val string) attribute.KeyValue { + return MessagingConsumerIDKey.String(val) +} + +// Attributes for RabbitMQ +const ( + // MessagingRabbitmqDestinationRoutingKeyKey is the attribute Key + // conforming to the "messaging.rabbitmq.destination.routing_key" semantic + // conventions. It represents the rabbitMQ message routing key. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If not empty.) + // Stability: stable + // Examples: 'myKey' + MessagingRabbitmqDestinationRoutingKeyKey = attribute.Key("messaging.rabbitmq.destination.routing_key") +) + +// MessagingRabbitmqDestinationRoutingKey returns an attribute KeyValue +// conforming to the "messaging.rabbitmq.destination.routing_key" semantic +// conventions. It represents the rabbitMQ message routing key. +func MessagingRabbitmqDestinationRoutingKey(val string) attribute.KeyValue { + return MessagingRabbitmqDestinationRoutingKeyKey.String(val) +} + +// Attributes for Apache Kafka +const ( + // MessagingKafkaMessageKeyKey is the attribute Key conforming to the + // "messaging.kafka.message.key" semantic conventions. It represents the + // message keys in Kafka are used for grouping alike messages to ensure + // they're processed on the same partition. They differ from + // `messaging.message.id` in that they're not unique. If the key is `null`, + // the attribute MUST NOT be set. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'myKey' + // Note: If the key type is not string, it's string representation has to + // be supplied for the attribute. If the key has no unambiguous, canonical + // string form, don't include its value. + MessagingKafkaMessageKeyKey = attribute.Key("messaging.kafka.message.key") + + // MessagingKafkaConsumerGroupKey is the attribute Key conforming to the + // "messaging.kafka.consumer.group" semantic conventions. It represents the + // name of the Kafka Consumer Group that is handling the message. Only + // applies to consumers, not producers. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'my-group' + MessagingKafkaConsumerGroupKey = attribute.Key("messaging.kafka.consumer.group") + + // MessagingKafkaClientIDKey is the attribute Key conforming to the + // "messaging.kafka.client_id" semantic conventions. It represents the + // client ID for the Consumer or Producer that is handling the message. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'client-5' + MessagingKafkaClientIDKey = attribute.Key("messaging.kafka.client_id") + + // MessagingKafkaDestinationPartitionKey is the attribute Key conforming to + // the "messaging.kafka.destination.partition" semantic conventions. It + // represents the partition the message is sent to. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 2 + MessagingKafkaDestinationPartitionKey = attribute.Key("messaging.kafka.destination.partition") + + // MessagingKafkaSourcePartitionKey is the attribute Key conforming to the + // "messaging.kafka.source.partition" semantic conventions. It represents + // the partition the message is received from. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 2 + MessagingKafkaSourcePartitionKey = attribute.Key("messaging.kafka.source.partition") + + // MessagingKafkaMessageOffsetKey is the attribute Key conforming to the + // "messaging.kafka.message.offset" semantic conventions. It represents the + // offset of a record in the corresponding Kafka partition. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 42 + MessagingKafkaMessageOffsetKey = attribute.Key("messaging.kafka.message.offset") + + // MessagingKafkaMessageTombstoneKey is the attribute Key conforming to the + // "messaging.kafka.message.tombstone" semantic conventions. It represents + // a boolean that is true if the message is a tombstone. + // + // Type: boolean + // RequirementLevel: ConditionallyRequired (If value is `true`. When + // missing, the value is assumed to be `false`.) + // Stability: stable + MessagingKafkaMessageTombstoneKey = attribute.Key("messaging.kafka.message.tombstone") +) + +// MessagingKafkaMessageKey returns an attribute KeyValue conforming to the +// "messaging.kafka.message.key" semantic conventions. It represents the +// message keys in Kafka are used for grouping alike messages to ensure they're +// processed on the same partition. They differ from `messaging.message.id` in +// that they're not unique. If the key is `null`, the attribute MUST NOT be +// set. +func MessagingKafkaMessageKey(val string) attribute.KeyValue { + return MessagingKafkaMessageKeyKey.String(val) +} + +// MessagingKafkaConsumerGroup returns an attribute KeyValue conforming to +// the "messaging.kafka.consumer.group" semantic conventions. It represents the +// name of the Kafka Consumer Group that is handling the message. Only applies +// to consumers, not producers. +func MessagingKafkaConsumerGroup(val string) attribute.KeyValue { + return MessagingKafkaConsumerGroupKey.String(val) +} + +// MessagingKafkaClientID returns an attribute KeyValue conforming to the +// "messaging.kafka.client_id" semantic conventions. It represents the client +// ID for the Consumer or Producer that is handling the message. +func MessagingKafkaClientID(val string) attribute.KeyValue { + return MessagingKafkaClientIDKey.String(val) +} + +// MessagingKafkaDestinationPartition returns an attribute KeyValue +// conforming to the "messaging.kafka.destination.partition" semantic +// conventions. It represents the partition the message is sent to. +func MessagingKafkaDestinationPartition(val int) attribute.KeyValue { + return MessagingKafkaDestinationPartitionKey.Int(val) +} + +// MessagingKafkaSourcePartition returns an attribute KeyValue conforming to +// the "messaging.kafka.source.partition" semantic conventions. It represents +// the partition the message is received from. +func MessagingKafkaSourcePartition(val int) attribute.KeyValue { + return MessagingKafkaSourcePartitionKey.Int(val) +} + +// MessagingKafkaMessageOffset returns an attribute KeyValue conforming to +// the "messaging.kafka.message.offset" semantic conventions. It represents the +// offset of a record in the corresponding Kafka partition. +func MessagingKafkaMessageOffset(val int) attribute.KeyValue { + return MessagingKafkaMessageOffsetKey.Int(val) +} + +// MessagingKafkaMessageTombstone returns an attribute KeyValue conforming +// to the "messaging.kafka.message.tombstone" semantic conventions. It +// represents a boolean that is true if the message is a tombstone. +func MessagingKafkaMessageTombstone(val bool) attribute.KeyValue { + return MessagingKafkaMessageTombstoneKey.Bool(val) +} + +// Attributes for Apache RocketMQ +const ( + // MessagingRocketmqNamespaceKey is the attribute Key conforming to the + // "messaging.rocketmq.namespace" semantic conventions. It represents the + // namespace of RocketMQ resources, resources in different namespaces are + // individual. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'myNamespace' + MessagingRocketmqNamespaceKey = attribute.Key("messaging.rocketmq.namespace") + + // MessagingRocketmqClientGroupKey is the attribute Key conforming to the + // "messaging.rocketmq.client_group" semantic conventions. It represents + // the name of the RocketMQ producer/consumer group that is handling the + // message. The client type is identified by the SpanKind. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'myConsumerGroup' + MessagingRocketmqClientGroupKey = attribute.Key("messaging.rocketmq.client_group") + + // MessagingRocketmqClientIDKey is the attribute Key conforming to the + // "messaging.rocketmq.client_id" semantic conventions. It represents the + // unique identifier for each client. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'myhost@8742@s8083jm' + MessagingRocketmqClientIDKey = attribute.Key("messaging.rocketmq.client_id") + + // MessagingRocketmqMessageDeliveryTimestampKey is the attribute Key + // conforming to the "messaging.rocketmq.message.delivery_timestamp" + // semantic conventions. It represents the timestamp in milliseconds that + // the delay message is expected to be delivered to consumer. + // + // Type: int + // RequirementLevel: ConditionallyRequired (If the message type is delay + // and delay time level is not specified.) + // Stability: stable + // Examples: 1665987217045 + MessagingRocketmqMessageDeliveryTimestampKey = attribute.Key("messaging.rocketmq.message.delivery_timestamp") + + // MessagingRocketmqMessageDelayTimeLevelKey is the attribute Key + // conforming to the "messaging.rocketmq.message.delay_time_level" semantic + // conventions. It represents the delay time level for delay message, which + // determines the message delay time. + // + // Type: int + // RequirementLevel: ConditionallyRequired (If the message type is delay + // and delivery timestamp is not specified.) + // Stability: stable + // Examples: 3 + MessagingRocketmqMessageDelayTimeLevelKey = attribute.Key("messaging.rocketmq.message.delay_time_level") + + // MessagingRocketmqMessageGroupKey is the attribute Key conforming to the + // "messaging.rocketmq.message.group" semantic conventions. It represents + // the it is essential for FIFO message. Messages that belong to the same + // message group are always processed one by one within the same consumer + // group. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If the message type is FIFO.) + // Stability: stable + // Examples: 'myMessageGroup' + MessagingRocketmqMessageGroupKey = attribute.Key("messaging.rocketmq.message.group") + + // MessagingRocketmqMessageTypeKey is the attribute Key conforming to the + // "messaging.rocketmq.message.type" semantic conventions. It represents + // the type of message. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + MessagingRocketmqMessageTypeKey = attribute.Key("messaging.rocketmq.message.type") + + // MessagingRocketmqMessageTagKey is the attribute Key conforming to the + // "messaging.rocketmq.message.tag" semantic conventions. It represents the + // secondary classifier of message besides topic. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'tagA' + MessagingRocketmqMessageTagKey = attribute.Key("messaging.rocketmq.message.tag") + + // MessagingRocketmqMessageKeysKey is the attribute Key conforming to the + // "messaging.rocketmq.message.keys" semantic conventions. It represents + // the key(s) of message, another way to mark message besides message id. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: stable + // Examples: 'keyA', 'keyB' + MessagingRocketmqMessageKeysKey = attribute.Key("messaging.rocketmq.message.keys") + + // MessagingRocketmqConsumptionModelKey is the attribute Key conforming to + // the "messaging.rocketmq.consumption_model" semantic conventions. It + // represents the model of message consumption. This only applies to + // consumer spans. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + MessagingRocketmqConsumptionModelKey = attribute.Key("messaging.rocketmq.consumption_model") +) + +var ( + // Normal message + MessagingRocketmqMessageTypeNormal = MessagingRocketmqMessageTypeKey.String("normal") + // FIFO message + MessagingRocketmqMessageTypeFifo = MessagingRocketmqMessageTypeKey.String("fifo") + // Delay message + MessagingRocketmqMessageTypeDelay = MessagingRocketmqMessageTypeKey.String("delay") + // Transaction message + MessagingRocketmqMessageTypeTransaction = MessagingRocketmqMessageTypeKey.String("transaction") +) + +var ( + // Clustering consumption model + MessagingRocketmqConsumptionModelClustering = MessagingRocketmqConsumptionModelKey.String("clustering") + // Broadcasting consumption model + MessagingRocketmqConsumptionModelBroadcasting = MessagingRocketmqConsumptionModelKey.String("broadcasting") +) + +// MessagingRocketmqNamespace returns an attribute KeyValue conforming to +// the "messaging.rocketmq.namespace" semantic conventions. It represents the +// namespace of RocketMQ resources, resources in different namespaces are +// individual. +func MessagingRocketmqNamespace(val string) attribute.KeyValue { + return MessagingRocketmqNamespaceKey.String(val) +} + +// MessagingRocketmqClientGroup returns an attribute KeyValue conforming to +// the "messaging.rocketmq.client_group" semantic conventions. It represents +// the name of the RocketMQ producer/consumer group that is handling the +// message. The client type is identified by the SpanKind. +func MessagingRocketmqClientGroup(val string) attribute.KeyValue { + return MessagingRocketmqClientGroupKey.String(val) +} + +// MessagingRocketmqClientID returns an attribute KeyValue conforming to the +// "messaging.rocketmq.client_id" semantic conventions. It represents the +// unique identifier for each client. +func MessagingRocketmqClientID(val string) attribute.KeyValue { + return MessagingRocketmqClientIDKey.String(val) +} + +// MessagingRocketmqMessageDeliveryTimestamp returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delivery_timestamp" semantic +// conventions. It represents the timestamp in milliseconds that the delay +// message is expected to be delivered to consumer. +func MessagingRocketmqMessageDeliveryTimestamp(val int) attribute.KeyValue { + return MessagingRocketmqMessageDeliveryTimestampKey.Int(val) +} + +// MessagingRocketmqMessageDelayTimeLevel returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delay_time_level" semantic +// conventions. It represents the delay time level for delay message, which +// determines the message delay time. +func MessagingRocketmqMessageDelayTimeLevel(val int) attribute.KeyValue { + return MessagingRocketmqMessageDelayTimeLevelKey.Int(val) +} + +// MessagingRocketmqMessageGroup returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.group" semantic conventions. It represents +// the it is essential for FIFO message. Messages that belong to the same +// message group are always processed one by one within the same consumer +// group. +func MessagingRocketmqMessageGroup(val string) attribute.KeyValue { + return MessagingRocketmqMessageGroupKey.String(val) +} + +// MessagingRocketmqMessageTag returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.tag" semantic conventions. It represents the +// secondary classifier of message besides topic. +func MessagingRocketmqMessageTag(val string) attribute.KeyValue { + return MessagingRocketmqMessageTagKey.String(val) +} + +// MessagingRocketmqMessageKeys returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.keys" semantic conventions. It represents +// the key(s) of message, another way to mark message besides message id. +func MessagingRocketmqMessageKeys(val ...string) attribute.KeyValue { + return MessagingRocketmqMessageKeysKey.StringSlice(val) +} + +// Semantic conventions for remote procedure calls. +const ( + // RPCSystemKey is the attribute Key conforming to the "rpc.system" + // semantic conventions. It represents a string identifying the remoting + // system. See below for a list of well-known identifiers. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + RPCSystemKey = attribute.Key("rpc.system") + + // RPCServiceKey is the attribute Key conforming to the "rpc.service" + // semantic conventions. It represents the full (logical) name of the + // service being called, including its package name, if applicable. + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'myservice.EchoService' + // Note: This is the logical name of the service from the RPC interface + // perspective, which can be different from the name of any implementing + // class. The `code.namespace` attribute may be used to store the latter + // (despite the attribute name, it may include a class name; e.g., class + // with method actually executing the call on the server side, RPC client + // stub class on the client side). + RPCServiceKey = attribute.Key("rpc.service") + + // RPCMethodKey is the attribute Key conforming to the "rpc.method" + // semantic conventions. It represents the name of the (logical) method + // being called, must be equal to the $method part in the span name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: stable + // Examples: 'exampleMethod' + // Note: This is the logical name of the method from the RPC interface + // perspective, which can be different from the name of any implementing + // method/function. The `code.function` attribute may be used to store the + // latter (e.g., method actually executing the call on the server side, RPC + // client stub method on the client side). + RPCMethodKey = attribute.Key("rpc.method") +) + +var ( + // gRPC + RPCSystemGRPC = RPCSystemKey.String("grpc") + // Java RMI + RPCSystemJavaRmi = RPCSystemKey.String("java_rmi") + // .NET WCF + RPCSystemDotnetWcf = RPCSystemKey.String("dotnet_wcf") + // Apache Dubbo + RPCSystemApacheDubbo = RPCSystemKey.String("apache_dubbo") +) + +// RPCService returns an attribute KeyValue conforming to the "rpc.service" +// semantic conventions. It represents the full (logical) name of the service +// being called, including its package name, if applicable. +func RPCService(val string) attribute.KeyValue { + return RPCServiceKey.String(val) +} + +// RPCMethod returns an attribute KeyValue conforming to the "rpc.method" +// semantic conventions. It represents the name of the (logical) method being +// called, must be equal to the $method part in the span name. +func RPCMethod(val string) attribute.KeyValue { + return RPCMethodKey.String(val) +} + +// Tech-specific attributes for gRPC. +const ( + // RPCGRPCStatusCodeKey is the attribute Key conforming to the + // "rpc.grpc.status_code" semantic conventions. It represents the [numeric + // status + // code](https://github.com/grpc/grpc/blob/v1.33.2/doc/statuscodes.md) of + // the gRPC request. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + RPCGRPCStatusCodeKey = attribute.Key("rpc.grpc.status_code") +) + +var ( + // OK + RPCGRPCStatusCodeOk = RPCGRPCStatusCodeKey.Int(0) + // CANCELLED + RPCGRPCStatusCodeCancelled = RPCGRPCStatusCodeKey.Int(1) + // UNKNOWN + RPCGRPCStatusCodeUnknown = RPCGRPCStatusCodeKey.Int(2) + // INVALID_ARGUMENT + RPCGRPCStatusCodeInvalidArgument = RPCGRPCStatusCodeKey.Int(3) + // DEADLINE_EXCEEDED + RPCGRPCStatusCodeDeadlineExceeded = RPCGRPCStatusCodeKey.Int(4) + // NOT_FOUND + RPCGRPCStatusCodeNotFound = RPCGRPCStatusCodeKey.Int(5) + // ALREADY_EXISTS + RPCGRPCStatusCodeAlreadyExists = RPCGRPCStatusCodeKey.Int(6) + // PERMISSION_DENIED + RPCGRPCStatusCodePermissionDenied = RPCGRPCStatusCodeKey.Int(7) + // RESOURCE_EXHAUSTED + RPCGRPCStatusCodeResourceExhausted = RPCGRPCStatusCodeKey.Int(8) + // FAILED_PRECONDITION + RPCGRPCStatusCodeFailedPrecondition = RPCGRPCStatusCodeKey.Int(9) + // ABORTED + RPCGRPCStatusCodeAborted = RPCGRPCStatusCodeKey.Int(10) + // OUT_OF_RANGE + RPCGRPCStatusCodeOutOfRange = RPCGRPCStatusCodeKey.Int(11) + // UNIMPLEMENTED + RPCGRPCStatusCodeUnimplemented = RPCGRPCStatusCodeKey.Int(12) + // INTERNAL + RPCGRPCStatusCodeInternal = RPCGRPCStatusCodeKey.Int(13) + // UNAVAILABLE + RPCGRPCStatusCodeUnavailable = RPCGRPCStatusCodeKey.Int(14) + // DATA_LOSS + RPCGRPCStatusCodeDataLoss = RPCGRPCStatusCodeKey.Int(15) + // UNAUTHENTICATED + RPCGRPCStatusCodeUnauthenticated = RPCGRPCStatusCodeKey.Int(16) +) + +// Tech-specific attributes for [JSON RPC](https://www.jsonrpc.org/). +const ( + // RPCJsonrpcVersionKey is the attribute Key conforming to the + // "rpc.jsonrpc.version" semantic conventions. It represents the protocol + // version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 + // does not specify this, the value can be omitted. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If other than the default + // version (`1.0`)) + // Stability: stable + // Examples: '2.0', '1.0' + RPCJsonrpcVersionKey = attribute.Key("rpc.jsonrpc.version") + + // RPCJsonrpcRequestIDKey is the attribute Key conforming to the + // "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` + // property of request or response. Since protocol allows id to be int, + // string, `null` or missing (for notifications), value is expected to be + // cast to string for simplicity. Use empty string in case of `null` value. + // Omit entirely if this is a notification. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '10', 'request-7', '' + RPCJsonrpcRequestIDKey = attribute.Key("rpc.jsonrpc.request_id") + + // RPCJsonrpcErrorCodeKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_code" semantic conventions. It represents the + // `error.code` property of response if it is an error response. + // + // Type: int + // RequirementLevel: ConditionallyRequired (If response is not successful.) + // Stability: stable + // Examples: -32700, 100 + RPCJsonrpcErrorCodeKey = attribute.Key("rpc.jsonrpc.error_code") + + // RPCJsonrpcErrorMessageKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_message" semantic conventions. It represents the + // `error.message` property of response if it is an error response. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Parse error', 'User already exists' + RPCJsonrpcErrorMessageKey = attribute.Key("rpc.jsonrpc.error_message") +) + +// RPCJsonrpcVersion returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.version" semantic conventions. It represents the protocol +// version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 +// does not specify this, the value can be omitted. +func RPCJsonrpcVersion(val string) attribute.KeyValue { + return RPCJsonrpcVersionKey.String(val) +} + +// RPCJsonrpcRequestID returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` +// property of request or response. Since protocol allows id to be int, string, +// `null` or missing (for notifications), value is expected to be cast to +// string for simplicity. Use empty string in case of `null` value. Omit +// entirely if this is a notification. +func RPCJsonrpcRequestID(val string) attribute.KeyValue { + return RPCJsonrpcRequestIDKey.String(val) +} + +// RPCJsonrpcErrorCode returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_code" semantic conventions. It represents the +// `error.code` property of response if it is an error response. +func RPCJsonrpcErrorCode(val int) attribute.KeyValue { + return RPCJsonrpcErrorCodeKey.Int(val) +} + +// RPCJsonrpcErrorMessage returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_message" semantic conventions. It represents the +// `error.message` property of response if it is an error response. +func RPCJsonrpcErrorMessage(val string) attribute.KeyValue { + return RPCJsonrpcErrorMessageKey.String(val) +} diff --git a/tools/vendor/go.opentelemetry.io/otel/trace/config.go b/tools/vendor/go.opentelemetry.io/otel/trace/config.go index f058cc781..cb3efbb9a 100644 --- a/tools/vendor/go.opentelemetry.io/otel/trace/config.go +++ b/tools/vendor/go.opentelemetry.io/otel/trace/config.go @@ -25,6 +25,7 @@ type TracerConfig struct { instrumentationVersion string // Schema URL of the telemetry emitted by the Tracer. schemaURL string + attrs attribute.Set } // InstrumentationVersion returns the version of the library providing instrumentation. @@ -32,6 +33,12 @@ func (t *TracerConfig) InstrumentationVersion() string { return t.instrumentationVersion } +// InstrumentationAttributes returns the attributes associated with the library +// providing instrumentation. +func (t *TracerConfig) InstrumentationAttributes() attribute.Set { + return t.attrs +} + // SchemaURL returns the Schema URL of the telemetry emitted by the Tracer. func (t *TracerConfig) SchemaURL() string { return t.schemaURL @@ -307,6 +314,16 @@ func WithInstrumentationVersion(version string) TracerOption { }) } +// WithInstrumentationAttributes sets the instrumentation attributes. +// +// The passed attributes will be de-duplicated. +func WithInstrumentationAttributes(attr ...attribute.KeyValue) TracerOption { + return tracerOptionFunc(func(config TracerConfig) TracerConfig { + config.attrs = attribute.NewSet(attr...) + return config + }) +} + // WithSchemaURL sets the schema URL for the Tracer. func WithSchemaURL(schemaURL string) TracerOption { return tracerOptionFunc(func(cfg TracerConfig) TracerConfig { diff --git a/tools/vendor/go.opentelemetry.io/otel/trace/doc.go b/tools/vendor/go.opentelemetry.io/otel/trace/doc.go index 391417718..ab0346f96 100644 --- a/tools/vendor/go.opentelemetry.io/otel/trace/doc.go +++ b/tools/vendor/go.opentelemetry.io/otel/trace/doc.go @@ -17,7 +17,7 @@ Package trace provides an implementation of the tracing part of the OpenTelemetry API. To participate in distributed traces a Span needs to be created for the -operation being performed as part of a traced workflow. It its simplest form: +operation being performed as part of a traced workflow. In its simplest form: var tracer trace.Tracer diff --git a/tools/vendor/go.opentelemetry.io/otel/version.go b/tools/vendor/go.opentelemetry.io/otel/version.go index cbd042f5b..0e8e5e023 100644 --- a/tools/vendor/go.opentelemetry.io/otel/version.go +++ b/tools/vendor/go.opentelemetry.io/otel/version.go @@ -16,5 +16,5 @@ package otel // import "go.opentelemetry.io/otel" // Version is the current release version of OpenTelemetry in use. func Version() string { - return "1.11.0" + return "1.14.0" } diff --git a/tools/vendor/go.opentelemetry.io/otel/versions.yaml b/tools/vendor/go.opentelemetry.io/otel/versions.yaml index 324f3c6f7..40df1fae4 100644 --- a/tools/vendor/go.opentelemetry.io/otel/versions.yaml +++ b/tools/vendor/go.opentelemetry.io/otel/versions.yaml @@ -14,10 +14,11 @@ module-sets: stable-v1: - version: v1.11.0 + version: v1.14.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/bridge/opentracing + - go.opentelemetry.io/otel/bridge/opentracing/test - go.opentelemetry.io/otel/example/fib - go.opentelemetry.io/otel/example/jaeger - go.opentelemetry.io/otel/example/namedtracer @@ -34,7 +35,7 @@ module-sets: - go.opentelemetry.io/otel/trace - go.opentelemetry.io/otel/sdk experimental-metrics: - version: v0.32.3 + version: v0.37.0 modules: - go.opentelemetry.io/otel/example/opencensus - go.opentelemetry.io/otel/example/prometheus @@ -49,7 +50,7 @@ module-sets: - go.opentelemetry.io/otel/bridge/opencensus/test - go.opentelemetry.io/otel/example/view experimental-schema: - version: v0.0.3 + version: v0.0.4 modules: - go.opentelemetry.io/otel/schema excluded-modules: diff --git a/tools/vendor/go.uber.org/atomic/.codecov.yml b/tools/vendor/go.uber.org/atomic/.codecov.yml deleted file mode 100644 index 571116cc3..000000000 --- a/tools/vendor/go.uber.org/atomic/.codecov.yml +++ /dev/null @@ -1,19 +0,0 @@ -coverage: - range: 80..100 - round: down - precision: 2 - - status: - project: # measuring the overall project coverage - default: # context, you can create multiple ones with custom titles - enabled: yes # must be yes|true to enable this status - target: 100 # specify the target coverage for each commit status - # option: "auto" (must increase from parent commit or pull request base) - # option: "X%" a static target percentage to hit - if_not_found: success # if parent is not found report status as success, error, or failure - if_ci_failed: error # if ci fails report status as success, error, or failure - -# Also update COVER_IGNORE_PKGS in the Makefile. -ignore: - - /internal/gen-atomicint/ - - /internal/gen-valuewrapper/ diff --git a/tools/vendor/go.uber.org/atomic/.gitignore b/tools/vendor/go.uber.org/atomic/.gitignore deleted file mode 100644 index 2e337a0ed..000000000 --- a/tools/vendor/go.uber.org/atomic/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -/bin -.DS_Store -/vendor -cover.html -cover.out -lint.log - -# Binaries -*.test - -# Profiling output -*.prof - -# Output of fossa analyzer -/fossa diff --git a/tools/vendor/go.uber.org/atomic/CHANGELOG.md b/tools/vendor/go.uber.org/atomic/CHANGELOG.md deleted file mode 100644 index 5fe03f21b..000000000 --- a/tools/vendor/go.uber.org/atomic/CHANGELOG.md +++ /dev/null @@ -1,117 +0,0 @@ -# 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). - -## [1.10.0] - 2022-08-11 -### Added -- Add `atomic.Float32` type for atomic operations on `float32`. -- Add `CompareAndSwap` and `Swap` methods to `atomic.String`, `atomic.Error`, - and `atomic.Value`. -- Add generic `atomic.Pointer[T]` type for atomic operations on pointers of any - type. This is present only for Go 1.18 or higher, and is a drop-in for - replacement for the standard library's `sync/atomic.Pointer` type. - -### Changed -- Deprecate `CAS` methods on all types in favor of corresponding - `CompareAndSwap` methods. - -Thanks to @eNV25 and @icpd for their contributions to this release. - -[1.10.0]: https://github.com/uber-go/atomic/compare/v1.9.0...v1.10.0 - -## [1.9.0] - 2021-07-15 -### Added -- Add `Float64.Swap` to match int atomic operations. -- Add `atomic.Time` type for atomic operations on `time.Time` values. - -[1.9.0]: https://github.com/uber-go/atomic/compare/v1.8.0...v1.9.0 - -## [1.8.0] - 2021-06-09 -### Added -- Add `atomic.Uintptr` type for atomic operations on `uintptr` values. -- Add `atomic.UnsafePointer` type for atomic operations on `unsafe.Pointer` values. - -[1.8.0]: https://github.com/uber-go/atomic/compare/v1.7.0...v1.8.0 - -## [1.7.0] - 2020-09-14 -### Added -- Support JSON serialization and deserialization of primitive atomic types. -- Support Text marshalling and unmarshalling for string atomics. - -### Changed -- Disallow incorrect comparison of atomic values in a non-atomic way. - -### Removed -- Remove dependency on `golang.org/x/{lint, tools}`. - -[1.7.0]: https://github.com/uber-go/atomic/compare/v1.6.0...v1.7.0 - -## [1.6.0] - 2020-02-24 -### Changed -- Drop library dependency on `golang.org/x/{lint, tools}`. - -[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0 - -## [1.5.1] - 2019-11-19 -- Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together - causing `CAS` to fail even though the old value matches. - -[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1 - -## [1.5.0] - 2019-10-29 -### Changed -- With Go modules, only the `go.uber.org/atomic` import path is supported now. - If you need to use the old import path, please add a `replace` directive to - your `go.mod`. - -[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0 - -## [1.4.0] - 2019-05-01 -### Added - - Add `atomic.Error` type for atomic operations on `error` values. - -[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0 - -## [1.3.2] - 2018-05-02 -### Added -- Add `atomic.Duration` type for atomic operations on `time.Duration` values. - -[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2 - -## [1.3.1] - 2017-11-14 -### Fixed -- Revert optimization for `atomic.String.Store("")` which caused data races. - -[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1 - -## [1.3.0] - 2017-11-13 -### Added -- Add `atomic.Bool.CAS` for compare-and-swap semantics on bools. - -### Changed -- Optimize `atomic.String.Store("")` by avoiding an allocation. - -[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0 - -## [1.2.0] - 2017-04-12 -### Added -- Shadow `atomic.Value` from `sync/atomic`. - -[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0 - -## [1.1.0] - 2017-03-10 -### Added -- Add atomic `Float64` type. - -### Changed -- Support new `go.uber.org/atomic` import path. - -[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0 - -## [1.0.0] - 2016-07-18 - -- Initial release. - -[1.0.0]: https://github.com/uber-go/atomic/releases/tag/v1.0.0 diff --git a/tools/vendor/go.uber.org/atomic/LICENSE.txt b/tools/vendor/go.uber.org/atomic/LICENSE.txt deleted file mode 100644 index 8765c9fbc..000000000 --- a/tools/vendor/go.uber.org/atomic/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016 Uber Technologies, Inc. - -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/tools/vendor/go.uber.org/atomic/Makefile b/tools/vendor/go.uber.org/atomic/Makefile deleted file mode 100644 index 46c945b32..000000000 --- a/tools/vendor/go.uber.org/atomic/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# Directory to place `go install`ed binaries into. -export GOBIN ?= $(shell pwd)/bin - -GOLINT = $(GOBIN)/golint -GEN_ATOMICINT = $(GOBIN)/gen-atomicint -GEN_ATOMICWRAPPER = $(GOBIN)/gen-atomicwrapper -STATICCHECK = $(GOBIN)/staticcheck - -GO_FILES ?= $(shell find . '(' -path .git -o -path vendor ')' -prune -o -name '*.go' -print) - -# Also update ignore section in .codecov.yml. -COVER_IGNORE_PKGS = \ - go.uber.org/atomic/internal/gen-atomicint \ - go.uber.org/atomic/internal/gen-atomicwrapper - -.PHONY: build -build: - go build ./... - -.PHONY: test -test: - go test -race ./... - -.PHONY: gofmt -gofmt: - $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) - gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true - @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" && cat $(FMT_LOG) && false) - -$(GOLINT): - cd tools && go install golang.org/x/lint/golint - -$(STATICCHECK): - cd tools && go install honnef.co/go/tools/cmd/staticcheck - -$(GEN_ATOMICWRAPPER): $(wildcard ./internal/gen-atomicwrapper/*) - go build -o $@ ./internal/gen-atomicwrapper - -$(GEN_ATOMICINT): $(wildcard ./internal/gen-atomicint/*) - go build -o $@ ./internal/gen-atomicint - -.PHONY: golint -golint: $(GOLINT) - $(GOLINT) ./... - -.PHONY: staticcheck -staticcheck: $(STATICCHECK) - $(STATICCHECK) ./... - -.PHONY: lint -lint: gofmt golint staticcheck generatenodirty - -# comma separated list of packages to consider for code coverage. -COVER_PKG = $(shell \ - go list -find ./... | \ - grep -v $(foreach pkg,$(COVER_IGNORE_PKGS),-e "^$(pkg)$$") | \ - paste -sd, -) - -.PHONY: cover -cover: - go test -coverprofile=cover.out -coverpkg $(COVER_PKG) -v ./... - go tool cover -html=cover.out -o cover.html - -.PHONY: generate -generate: $(GEN_ATOMICINT) $(GEN_ATOMICWRAPPER) - go generate ./... - -.PHONY: generatenodirty -generatenodirty: - @[ -z "$$(git status --porcelain)" ] || ( \ - echo "Working tree is dirty. Commit your changes first."; \ - git status; \ - exit 1 ) - @make generate - @status=$$(git status --porcelain); \ - [ -z "$$status" ] || ( \ - echo "Working tree is dirty after `make generate`:"; \ - echo "$$status"; \ - echo "Please ensure that the generated code is up-to-date." ) diff --git a/tools/vendor/go.uber.org/atomic/README.md b/tools/vendor/go.uber.org/atomic/README.md deleted file mode 100644 index 96b47a1f1..000000000 --- a/tools/vendor/go.uber.org/atomic/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard] - -Simple wrappers for primitive types to enforce atomic access. - -## Installation - -```shell -$ go get -u go.uber.org/atomic@v1 -``` - -### Legacy Import Path - -As of v1.5.0, the import path `go.uber.org/atomic` is the only supported way -of using this package. If you are using Go modules, this package will fail to -compile with the legacy import path path `github.com/uber-go/atomic`. - -We recommend migrating your code to the new import path but if you're unable -to do so, or if your dependencies are still using the old import path, you -will have to add a `replace` directive to your `go.mod` file downgrading the -legacy import path to an older version. - -``` -replace github.com/uber-go/atomic => github.com/uber-go/atomic v1.4.0 -``` - -You can do so automatically by running the following command. - -```shell -$ go mod edit -replace github.com/uber-go/atomic=github.com/uber-go/atomic@v1.4.0 -``` - -## Usage - -The standard library's `sync/atomic` is powerful, but it's easy to forget which -variables must be accessed atomically. `go.uber.org/atomic` preserves all the -functionality of the standard library, but wraps the primitive types to -provide a safer, more convenient API. - -```go -var atom atomic.Uint32 -atom.Store(42) -atom.Sub(2) -atom.CAS(40, 11) -``` - -See the [documentation][doc] for a complete API specification. - -## Development Status - -Stable. - ---- - -Released under the [MIT License](LICENSE.txt). - -[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg -[doc]: https://godoc.org/go.uber.org/atomic -[ci-img]: https://github.com/uber-go/atomic/actions/workflows/go.yml/badge.svg -[ci]: https://github.com/uber-go/atomic/actions/workflows/go.yml -[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg -[cov]: https://codecov.io/gh/uber-go/atomic -[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic -[reportcard]: https://goreportcard.com/report/go.uber.org/atomic diff --git a/tools/vendor/go.uber.org/atomic/bool.go b/tools/vendor/go.uber.org/atomic/bool.go deleted file mode 100644 index dfa2085f4..000000000 --- a/tools/vendor/go.uber.org/atomic/bool.go +++ /dev/null @@ -1,88 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" -) - -// Bool is an atomic type-safe wrapper for bool values. -type Bool struct { - _ nocmp // disallow non-atomic comparison - - v Uint32 -} - -var _zeroBool bool - -// NewBool creates a new Bool. -func NewBool(val bool) *Bool { - x := &Bool{} - if val != _zeroBool { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped bool. -func (x *Bool) Load() bool { - return truthy(x.v.Load()) -} - -// Store atomically stores the passed bool. -func (x *Bool) Store(val bool) { - x.v.Store(boolToInt(val)) -} - -// CAS is an atomic compare-and-swap for bool values. -// -// Deprecated: Use CompareAndSwap. -func (x *Bool) CAS(old, new bool) (swapped bool) { - return x.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap for bool values. -func (x *Bool) CompareAndSwap(old, new bool) (swapped bool) { - return x.v.CompareAndSwap(boolToInt(old), boolToInt(new)) -} - -// Swap atomically stores the given bool and returns the old -// value. -func (x *Bool) Swap(val bool) (old bool) { - return truthy(x.v.Swap(boolToInt(val))) -} - -// MarshalJSON encodes the wrapped bool into JSON. -func (x *Bool) MarshalJSON() ([]byte, error) { - return json.Marshal(x.Load()) -} - -// UnmarshalJSON decodes a bool from JSON. -func (x *Bool) UnmarshalJSON(b []byte) error { - var v bool - if err := json.Unmarshal(b, &v); err != nil { - return err - } - x.Store(v) - return nil -} diff --git a/tools/vendor/go.uber.org/atomic/doc.go b/tools/vendor/go.uber.org/atomic/doc.go deleted file mode 100644 index ae7390ee6..000000000 --- a/tools/vendor/go.uber.org/atomic/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2020 Uber Technologies, Inc. -// -// 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. - -// Package atomic provides simple wrappers around numerics to enforce atomic -// access. -package atomic diff --git a/tools/vendor/go.uber.org/atomic/duration.go b/tools/vendor/go.uber.org/atomic/duration.go deleted file mode 100644 index 6f4157445..000000000 --- a/tools/vendor/go.uber.org/atomic/duration.go +++ /dev/null @@ -1,89 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "time" -) - -// Duration is an atomic type-safe wrapper for time.Duration values. -type Duration struct { - _ nocmp // disallow non-atomic comparison - - v Int64 -} - -var _zeroDuration time.Duration - -// NewDuration creates a new Duration. -func NewDuration(val time.Duration) *Duration { - x := &Duration{} - if val != _zeroDuration { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped time.Duration. -func (x *Duration) Load() time.Duration { - return time.Duration(x.v.Load()) -} - -// Store atomically stores the passed time.Duration. -func (x *Duration) Store(val time.Duration) { - x.v.Store(int64(val)) -} - -// CAS is an atomic compare-and-swap for time.Duration values. -// -// Deprecated: Use CompareAndSwap. -func (x *Duration) CAS(old, new time.Duration) (swapped bool) { - return x.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap for time.Duration values. -func (x *Duration) CompareAndSwap(old, new time.Duration) (swapped bool) { - return x.v.CompareAndSwap(int64(old), int64(new)) -} - -// Swap atomically stores the given time.Duration and returns the old -// value. -func (x *Duration) Swap(val time.Duration) (old time.Duration) { - return time.Duration(x.v.Swap(int64(val))) -} - -// MarshalJSON encodes the wrapped time.Duration into JSON. -func (x *Duration) MarshalJSON() ([]byte, error) { - return json.Marshal(x.Load()) -} - -// UnmarshalJSON decodes a time.Duration from JSON. -func (x *Duration) UnmarshalJSON(b []byte) error { - var v time.Duration - if err := json.Unmarshal(b, &v); err != nil { - return err - } - x.Store(v) - return nil -} diff --git a/tools/vendor/go.uber.org/atomic/duration_ext.go b/tools/vendor/go.uber.org/atomic/duration_ext.go deleted file mode 100644 index 4c18b0a9e..000000000 --- a/tools/vendor/go.uber.org/atomic/duration_ext.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2020 Uber Technologies, Inc. -// -// 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. - -package atomic - -import "time" - -//go:generate bin/gen-atomicwrapper -name=Duration -type=time.Duration -wrapped=Int64 -pack=int64 -unpack=time.Duration -cas -swap -json -imports time -file=duration.go - -// Add atomically adds to the wrapped time.Duration and returns the new value. -func (d *Duration) Add(delta time.Duration) time.Duration { - return time.Duration(d.v.Add(int64(delta))) -} - -// Sub atomically subtracts from the wrapped time.Duration and returns the new value. -func (d *Duration) Sub(delta time.Duration) time.Duration { - return time.Duration(d.v.Sub(int64(delta))) -} - -// String encodes the wrapped value as a string. -func (d *Duration) String() string { - return d.Load().String() -} diff --git a/tools/vendor/go.uber.org/atomic/error.go b/tools/vendor/go.uber.org/atomic/error.go deleted file mode 100644 index 27b23ea16..000000000 --- a/tools/vendor/go.uber.org/atomic/error.go +++ /dev/null @@ -1,62 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -// Error is an atomic type-safe wrapper for error values. -type Error struct { - _ nocmp // disallow non-atomic comparison - - v Value -} - -var _zeroError error - -// NewError creates a new Error. -func NewError(val error) *Error { - x := &Error{} - if val != _zeroError { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped error. -func (x *Error) Load() error { - return unpackError(x.v.Load()) -} - -// Store atomically stores the passed error. -func (x *Error) Store(val error) { - x.v.Store(packError(val)) -} - -// CompareAndSwap is an atomic compare-and-swap for error values. -func (x *Error) CompareAndSwap(old, new error) (swapped bool) { - return x.v.CompareAndSwap(packError(old), packError(new)) -} - -// Swap atomically stores the given error and returns the old -// value. -func (x *Error) Swap(val error) (old error) { - return unpackError(x.v.Swap(packError(val))) -} diff --git a/tools/vendor/go.uber.org/atomic/float32.go b/tools/vendor/go.uber.org/atomic/float32.go deleted file mode 100644 index 5d535a6d2..000000000 --- a/tools/vendor/go.uber.org/atomic/float32.go +++ /dev/null @@ -1,77 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "math" -) - -// Float32 is an atomic type-safe wrapper for float32 values. -type Float32 struct { - _ nocmp // disallow non-atomic comparison - - v Uint32 -} - -var _zeroFloat32 float32 - -// NewFloat32 creates a new Float32. -func NewFloat32(val float32) *Float32 { - x := &Float32{} - if val != _zeroFloat32 { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped float32. -func (x *Float32) Load() float32 { - return math.Float32frombits(x.v.Load()) -} - -// Store atomically stores the passed float32. -func (x *Float32) Store(val float32) { - x.v.Store(math.Float32bits(val)) -} - -// Swap atomically stores the given float32 and returns the old -// value. -func (x *Float32) Swap(val float32) (old float32) { - return math.Float32frombits(x.v.Swap(math.Float32bits(val))) -} - -// MarshalJSON encodes the wrapped float32 into JSON. -func (x *Float32) MarshalJSON() ([]byte, error) { - return json.Marshal(x.Load()) -} - -// UnmarshalJSON decodes a float32 from JSON. -func (x *Float32) UnmarshalJSON(b []byte) error { - var v float32 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - x.Store(v) - return nil -} diff --git a/tools/vendor/go.uber.org/atomic/float32_ext.go b/tools/vendor/go.uber.org/atomic/float32_ext.go deleted file mode 100644 index b0cd8d9c8..000000000 --- a/tools/vendor/go.uber.org/atomic/float32_ext.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "math" - "strconv" -) - -//go:generate bin/gen-atomicwrapper -name=Float32 -type=float32 -wrapped=Uint32 -pack=math.Float32bits -unpack=math.Float32frombits -swap -json -imports math -file=float32.go - -// Add atomically adds to the wrapped float32 and returns the new value. -func (f *Float32) Add(delta float32) float32 { - for { - old := f.Load() - new := old + delta - if f.CAS(old, new) { - return new - } - } -} - -// Sub atomically subtracts from the wrapped float32 and returns the new value. -func (f *Float32) Sub(delta float32) float32 { - return f.Add(-delta) -} - -// CAS is an atomic compare-and-swap for float32 values. -// -// Deprecated: Use CompareAndSwap -func (f *Float32) CAS(old, new float32) (swapped bool) { - return f.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap for float32 values. -// -// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators -// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN. -// This avoids typical CompareAndSwap loops from blocking forever, e.g., -// -// for { -// old := atom.Load() -// new = f(old) -// if atom.CompareAndSwap(old, new) { -// break -// } -// } -// -// If CompareAndSwap did not match NaN to match, then the above would loop forever. -func (f *Float32) CompareAndSwap(old, new float32) (swapped bool) { - return f.v.CompareAndSwap(math.Float32bits(old), math.Float32bits(new)) -} - -// String encodes the wrapped value as a string. -func (f *Float32) String() string { - // 'g' is the behavior for floats with %v. - return strconv.FormatFloat(float64(f.Load()), 'g', -1, 32) -} diff --git a/tools/vendor/go.uber.org/atomic/float64.go b/tools/vendor/go.uber.org/atomic/float64.go deleted file mode 100644 index 11d5189a5..000000000 --- a/tools/vendor/go.uber.org/atomic/float64.go +++ /dev/null @@ -1,77 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "math" -) - -// Float64 is an atomic type-safe wrapper for float64 values. -type Float64 struct { - _ nocmp // disallow non-atomic comparison - - v Uint64 -} - -var _zeroFloat64 float64 - -// NewFloat64 creates a new Float64. -func NewFloat64(val float64) *Float64 { - x := &Float64{} - if val != _zeroFloat64 { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped float64. -func (x *Float64) Load() float64 { - return math.Float64frombits(x.v.Load()) -} - -// Store atomically stores the passed float64. -func (x *Float64) Store(val float64) { - x.v.Store(math.Float64bits(val)) -} - -// Swap atomically stores the given float64 and returns the old -// value. -func (x *Float64) Swap(val float64) (old float64) { - return math.Float64frombits(x.v.Swap(math.Float64bits(val))) -} - -// MarshalJSON encodes the wrapped float64 into JSON. -func (x *Float64) MarshalJSON() ([]byte, error) { - return json.Marshal(x.Load()) -} - -// UnmarshalJSON decodes a float64 from JSON. -func (x *Float64) UnmarshalJSON(b []byte) error { - var v float64 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - x.Store(v) - return nil -} diff --git a/tools/vendor/go.uber.org/atomic/float64_ext.go b/tools/vendor/go.uber.org/atomic/float64_ext.go deleted file mode 100644 index 48c52b0ab..000000000 --- a/tools/vendor/go.uber.org/atomic/float64_ext.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "math" - "strconv" -) - -//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -swap -json -imports math -file=float64.go - -// Add atomically adds to the wrapped float64 and returns the new value. -func (f *Float64) Add(delta float64) float64 { - for { - old := f.Load() - new := old + delta - if f.CAS(old, new) { - return new - } - } -} - -// Sub atomically subtracts from the wrapped float64 and returns the new value. -func (f *Float64) Sub(delta float64) float64 { - return f.Add(-delta) -} - -// CAS is an atomic compare-and-swap for float64 values. -// -// Deprecated: Use CompareAndSwap -func (f *Float64) CAS(old, new float64) (swapped bool) { - return f.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap for float64 values. -// -// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators -// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN. -// This avoids typical CompareAndSwap loops from blocking forever, e.g., -// -// for { -// old := atom.Load() -// new = f(old) -// if atom.CompareAndSwap(old, new) { -// break -// } -// } -// -// If CompareAndSwap did not match NaN to match, then the above would loop forever. -func (f *Float64) CompareAndSwap(old, new float64) (swapped bool) { - return f.v.CompareAndSwap(math.Float64bits(old), math.Float64bits(new)) -} - -// String encodes the wrapped value as a string. -func (f *Float64) String() string { - // 'g' is the behavior for floats with %v. - return strconv.FormatFloat(f.Load(), 'g', -1, 64) -} diff --git a/tools/vendor/go.uber.org/atomic/gen.go b/tools/vendor/go.uber.org/atomic/gen.go deleted file mode 100644 index 1e9ef4f87..000000000 --- a/tools/vendor/go.uber.org/atomic/gen.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2020 Uber Technologies, Inc. -// -// 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. - -package atomic - -//go:generate bin/gen-atomicint -name=Int32 -wrapped=int32 -file=int32.go -//go:generate bin/gen-atomicint -name=Int64 -wrapped=int64 -file=int64.go -//go:generate bin/gen-atomicint -name=Uint32 -wrapped=uint32 -unsigned -file=uint32.go -//go:generate bin/gen-atomicint -name=Uint64 -wrapped=uint64 -unsigned -file=uint64.go -//go:generate bin/gen-atomicint -name=Uintptr -wrapped=uintptr -unsigned -file=uintptr.go diff --git a/tools/vendor/go.uber.org/atomic/int32.go b/tools/vendor/go.uber.org/atomic/int32.go deleted file mode 100644 index b9a68f42c..000000000 --- a/tools/vendor/go.uber.org/atomic/int32.go +++ /dev/null @@ -1,109 +0,0 @@ -// @generated Code generated by gen-atomicint. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "strconv" - "sync/atomic" -) - -// Int32 is an atomic wrapper around int32. -type Int32 struct { - _ nocmp // disallow non-atomic comparison - - v int32 -} - -// NewInt32 creates a new Int32. -func NewInt32(val int32) *Int32 { - return &Int32{v: val} -} - -// Load atomically loads the wrapped value. -func (i *Int32) Load() int32 { - return atomic.LoadInt32(&i.v) -} - -// Add atomically adds to the wrapped int32 and returns the new value. -func (i *Int32) Add(delta int32) int32 { - return atomic.AddInt32(&i.v, delta) -} - -// Sub atomically subtracts from the wrapped int32 and returns the new value. -func (i *Int32) Sub(delta int32) int32 { - return atomic.AddInt32(&i.v, -delta) -} - -// Inc atomically increments the wrapped int32 and returns the new value. -func (i *Int32) Inc() int32 { - return i.Add(1) -} - -// Dec atomically decrements the wrapped int32 and returns the new value. -func (i *Int32) Dec() int32 { - return i.Sub(1) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap. -func (i *Int32) CAS(old, new int32) (swapped bool) { - return i.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (i *Int32) CompareAndSwap(old, new int32) (swapped bool) { - return atomic.CompareAndSwapInt32(&i.v, old, new) -} - -// Store atomically stores the passed value. -func (i *Int32) Store(val int32) { - atomic.StoreInt32(&i.v, val) -} - -// Swap atomically swaps the wrapped int32 and returns the old value. -func (i *Int32) Swap(val int32) (old int32) { - return atomic.SwapInt32(&i.v, val) -} - -// MarshalJSON encodes the wrapped int32 into JSON. -func (i *Int32) MarshalJSON() ([]byte, error) { - return json.Marshal(i.Load()) -} - -// UnmarshalJSON decodes JSON into the wrapped int32. -func (i *Int32) UnmarshalJSON(b []byte) error { - var v int32 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - i.Store(v) - return nil -} - -// String encodes the wrapped value as a string. -func (i *Int32) String() string { - v := i.Load() - return strconv.FormatInt(int64(v), 10) -} diff --git a/tools/vendor/go.uber.org/atomic/int64.go b/tools/vendor/go.uber.org/atomic/int64.go deleted file mode 100644 index 78d260976..000000000 --- a/tools/vendor/go.uber.org/atomic/int64.go +++ /dev/null @@ -1,109 +0,0 @@ -// @generated Code generated by gen-atomicint. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "strconv" - "sync/atomic" -) - -// Int64 is an atomic wrapper around int64. -type Int64 struct { - _ nocmp // disallow non-atomic comparison - - v int64 -} - -// NewInt64 creates a new Int64. -func NewInt64(val int64) *Int64 { - return &Int64{v: val} -} - -// Load atomically loads the wrapped value. -func (i *Int64) Load() int64 { - return atomic.LoadInt64(&i.v) -} - -// Add atomically adds to the wrapped int64 and returns the new value. -func (i *Int64) Add(delta int64) int64 { - return atomic.AddInt64(&i.v, delta) -} - -// Sub atomically subtracts from the wrapped int64 and returns the new value. -func (i *Int64) Sub(delta int64) int64 { - return atomic.AddInt64(&i.v, -delta) -} - -// Inc atomically increments the wrapped int64 and returns the new value. -func (i *Int64) Inc() int64 { - return i.Add(1) -} - -// Dec atomically decrements the wrapped int64 and returns the new value. -func (i *Int64) Dec() int64 { - return i.Sub(1) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap. -func (i *Int64) CAS(old, new int64) (swapped bool) { - return i.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (i *Int64) CompareAndSwap(old, new int64) (swapped bool) { - return atomic.CompareAndSwapInt64(&i.v, old, new) -} - -// Store atomically stores the passed value. -func (i *Int64) Store(val int64) { - atomic.StoreInt64(&i.v, val) -} - -// Swap atomically swaps the wrapped int64 and returns the old value. -func (i *Int64) Swap(val int64) (old int64) { - return atomic.SwapInt64(&i.v, val) -} - -// MarshalJSON encodes the wrapped int64 into JSON. -func (i *Int64) MarshalJSON() ([]byte, error) { - return json.Marshal(i.Load()) -} - -// UnmarshalJSON decodes JSON into the wrapped int64. -func (i *Int64) UnmarshalJSON(b []byte) error { - var v int64 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - i.Store(v) - return nil -} - -// String encodes the wrapped value as a string. -func (i *Int64) String() string { - v := i.Load() - return strconv.FormatInt(int64(v), 10) -} diff --git a/tools/vendor/go.uber.org/atomic/nocmp.go b/tools/vendor/go.uber.org/atomic/nocmp.go deleted file mode 100644 index 54b74174a..000000000 --- a/tools/vendor/go.uber.org/atomic/nocmp.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2020 Uber Technologies, Inc. -// -// 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. - -package atomic - -// nocmp is an uncomparable struct. Embed this inside another struct to make -// it uncomparable. -// -// type Foo struct { -// nocmp -// // ... -// } -// -// This DOES NOT: -// -// - Disallow shallow copies of structs -// - Disallow comparison of pointers to uncomparable structs -type nocmp [0]func() diff --git a/tools/vendor/go.uber.org/atomic/pointer_go118.go b/tools/vendor/go.uber.org/atomic/pointer_go118.go deleted file mode 100644 index e0f47dba4..000000000 --- a/tools/vendor/go.uber.org/atomic/pointer_go118.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2022 Uber Technologies, Inc. -// -// 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. - -//go:build go1.18 && !go1.19 -// +build go1.18,!go1.19 - -package atomic - -import "unsafe" - -type Pointer[T any] struct { - _ nocmp // disallow non-atomic comparison - p UnsafePointer -} - -// NewPointer creates a new Pointer. -func NewPointer[T any](v *T) *Pointer[T] { - var p Pointer[T] - if v != nil { - p.p.Store(unsafe.Pointer(v)) - } - return &p -} - -// Load atomically loads the wrapped value. -func (p *Pointer[T]) Load() *T { - return (*T)(p.p.Load()) -} - -// Store atomically stores the passed value. -func (p *Pointer[T]) Store(val *T) { - p.p.Store(unsafe.Pointer(val)) -} - -// Swap atomically swaps the wrapped pointer and returns the old value. -func (p *Pointer[T]) Swap(val *T) (old *T) { - return (*T)(p.p.Swap(unsafe.Pointer(val))) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) { - return p.p.CompareAndSwap(unsafe.Pointer(old), unsafe.Pointer(new)) -} diff --git a/tools/vendor/go.uber.org/atomic/pointer_go119.go b/tools/vendor/go.uber.org/atomic/pointer_go119.go deleted file mode 100644 index 6726f17ad..000000000 --- a/tools/vendor/go.uber.org/atomic/pointer_go119.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2022 Uber Technologies, Inc. -// -// 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. - -//go:build go1.19 -// +build go1.19 - -package atomic - -import "sync/atomic" - -// Pointer is an atomic pointer of type *T. -type Pointer[T any] struct { - _ nocmp // disallow non-atomic comparison - p atomic.Pointer[T] -} - -// NewPointer creates a new Pointer. -func NewPointer[T any](v *T) *Pointer[T] { - var p Pointer[T] - if v != nil { - p.p.Store(v) - } - return &p -} - -// Load atomically loads the wrapped value. -func (p *Pointer[T]) Load() *T { - return p.p.Load() -} - -// Store atomically stores the passed value. -func (p *Pointer[T]) Store(val *T) { - p.p.Store(val) -} - -// Swap atomically swaps the wrapped pointer and returns the old value. -func (p *Pointer[T]) Swap(val *T) (old *T) { - return p.p.Swap(val) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) { - return p.p.CompareAndSwap(old, new) -} diff --git a/tools/vendor/go.uber.org/atomic/string.go b/tools/vendor/go.uber.org/atomic/string.go deleted file mode 100644 index c4bea70f4..000000000 --- a/tools/vendor/go.uber.org/atomic/string.go +++ /dev/null @@ -1,65 +0,0 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -// String is an atomic type-safe wrapper for string values. -type String struct { - _ nocmp // disallow non-atomic comparison - - v Value -} - -var _zeroString string - -// NewString creates a new String. -func NewString(val string) *String { - x := &String{} - if val != _zeroString { - x.Store(val) - } - return x -} - -// Load atomically loads the wrapped string. -func (x *String) Load() string { - if v := x.v.Load(); v != nil { - return v.(string) - } - return _zeroString -} - -// Store atomically stores the passed string. -func (x *String) Store(val string) { - x.v.Store(val) -} - -// CompareAndSwap is an atomic compare-and-swap for string values. -func (x *String) CompareAndSwap(old, new string) (swapped bool) { - return x.v.CompareAndSwap(old, new) -} - -// Swap atomically stores the given string and returns the old -// value. -func (x *String) Swap(val string) (old string) { - return x.v.Swap(val).(string) -} diff --git a/tools/vendor/go.uber.org/atomic/string_ext.go b/tools/vendor/go.uber.org/atomic/string_ext.go deleted file mode 100644 index 1f63dfd5b..000000000 --- a/tools/vendor/go.uber.org/atomic/string_ext.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -//go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped=Value -compareandswap -swap -file=string.go - -// String returns the wrapped value. -func (s *String) String() string { - return s.Load() -} - -// MarshalText encodes the wrapped string into a textual form. -// -// This makes it encodable as JSON, YAML, XML, and more. -func (s *String) MarshalText() ([]byte, error) { - return []byte(s.Load()), nil -} - -// UnmarshalText decodes text and replaces the wrapped string with it. -// -// This makes it decodable from JSON, YAML, XML, and more. -func (s *String) UnmarshalText(b []byte) error { - s.Store(string(b)) - return nil -} diff --git a/tools/vendor/go.uber.org/atomic/time_ext.go b/tools/vendor/go.uber.org/atomic/time_ext.go deleted file mode 100644 index 1e3dc978a..000000000 --- a/tools/vendor/go.uber.org/atomic/time_ext.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2021 Uber Technologies, Inc. -// -// 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. - -package atomic - -import "time" - -//go:generate bin/gen-atomicwrapper -name=Time -type=time.Time -wrapped=Value -pack=packTime -unpack=unpackTime -imports time -file=time.go - -func packTime(t time.Time) interface{} { - return t -} - -func unpackTime(v interface{}) time.Time { - if t, ok := v.(time.Time); ok { - return t - } - return time.Time{} -} diff --git a/tools/vendor/go.uber.org/atomic/uint32.go b/tools/vendor/go.uber.org/atomic/uint32.go deleted file mode 100644 index d6f04a96d..000000000 --- a/tools/vendor/go.uber.org/atomic/uint32.go +++ /dev/null @@ -1,109 +0,0 @@ -// @generated Code generated by gen-atomicint. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "strconv" - "sync/atomic" -) - -// Uint32 is an atomic wrapper around uint32. -type Uint32 struct { - _ nocmp // disallow non-atomic comparison - - v uint32 -} - -// NewUint32 creates a new Uint32. -func NewUint32(val uint32) *Uint32 { - return &Uint32{v: val} -} - -// Load atomically loads the wrapped value. -func (i *Uint32) Load() uint32 { - return atomic.LoadUint32(&i.v) -} - -// Add atomically adds to the wrapped uint32 and returns the new value. -func (i *Uint32) Add(delta uint32) uint32 { - return atomic.AddUint32(&i.v, delta) -} - -// Sub atomically subtracts from the wrapped uint32 and returns the new value. -func (i *Uint32) Sub(delta uint32) uint32 { - return atomic.AddUint32(&i.v, ^(delta - 1)) -} - -// Inc atomically increments the wrapped uint32 and returns the new value. -func (i *Uint32) Inc() uint32 { - return i.Add(1) -} - -// Dec atomically decrements the wrapped uint32 and returns the new value. -func (i *Uint32) Dec() uint32 { - return i.Sub(1) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap. -func (i *Uint32) CAS(old, new uint32) (swapped bool) { - return i.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (i *Uint32) CompareAndSwap(old, new uint32) (swapped bool) { - return atomic.CompareAndSwapUint32(&i.v, old, new) -} - -// Store atomically stores the passed value. -func (i *Uint32) Store(val uint32) { - atomic.StoreUint32(&i.v, val) -} - -// Swap atomically swaps the wrapped uint32 and returns the old value. -func (i *Uint32) Swap(val uint32) (old uint32) { - return atomic.SwapUint32(&i.v, val) -} - -// MarshalJSON encodes the wrapped uint32 into JSON. -func (i *Uint32) MarshalJSON() ([]byte, error) { - return json.Marshal(i.Load()) -} - -// UnmarshalJSON decodes JSON into the wrapped uint32. -func (i *Uint32) UnmarshalJSON(b []byte) error { - var v uint32 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - i.Store(v) - return nil -} - -// String encodes the wrapped value as a string. -func (i *Uint32) String() string { - v := i.Load() - return strconv.FormatUint(uint64(v), 10) -} diff --git a/tools/vendor/go.uber.org/atomic/uint64.go b/tools/vendor/go.uber.org/atomic/uint64.go deleted file mode 100644 index 2574bdd5e..000000000 --- a/tools/vendor/go.uber.org/atomic/uint64.go +++ /dev/null @@ -1,109 +0,0 @@ -// @generated Code generated by gen-atomicint. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "strconv" - "sync/atomic" -) - -// Uint64 is an atomic wrapper around uint64. -type Uint64 struct { - _ nocmp // disallow non-atomic comparison - - v uint64 -} - -// NewUint64 creates a new Uint64. -func NewUint64(val uint64) *Uint64 { - return &Uint64{v: val} -} - -// Load atomically loads the wrapped value. -func (i *Uint64) Load() uint64 { - return atomic.LoadUint64(&i.v) -} - -// Add atomically adds to the wrapped uint64 and returns the new value. -func (i *Uint64) Add(delta uint64) uint64 { - return atomic.AddUint64(&i.v, delta) -} - -// Sub atomically subtracts from the wrapped uint64 and returns the new value. -func (i *Uint64) Sub(delta uint64) uint64 { - return atomic.AddUint64(&i.v, ^(delta - 1)) -} - -// Inc atomically increments the wrapped uint64 and returns the new value. -func (i *Uint64) Inc() uint64 { - return i.Add(1) -} - -// Dec atomically decrements the wrapped uint64 and returns the new value. -func (i *Uint64) Dec() uint64 { - return i.Sub(1) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap. -func (i *Uint64) CAS(old, new uint64) (swapped bool) { - return i.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (i *Uint64) CompareAndSwap(old, new uint64) (swapped bool) { - return atomic.CompareAndSwapUint64(&i.v, old, new) -} - -// Store atomically stores the passed value. -func (i *Uint64) Store(val uint64) { - atomic.StoreUint64(&i.v, val) -} - -// Swap atomically swaps the wrapped uint64 and returns the old value. -func (i *Uint64) Swap(val uint64) (old uint64) { - return atomic.SwapUint64(&i.v, val) -} - -// MarshalJSON encodes the wrapped uint64 into JSON. -func (i *Uint64) MarshalJSON() ([]byte, error) { - return json.Marshal(i.Load()) -} - -// UnmarshalJSON decodes JSON into the wrapped uint64. -func (i *Uint64) UnmarshalJSON(b []byte) error { - var v uint64 - if err := json.Unmarshal(b, &v); err != nil { - return err - } - i.Store(v) - return nil -} - -// String encodes the wrapped value as a string. -func (i *Uint64) String() string { - v := i.Load() - return strconv.FormatUint(uint64(v), 10) -} diff --git a/tools/vendor/go.uber.org/atomic/uintptr.go b/tools/vendor/go.uber.org/atomic/uintptr.go deleted file mode 100644 index 81b275a7a..000000000 --- a/tools/vendor/go.uber.org/atomic/uintptr.go +++ /dev/null @@ -1,109 +0,0 @@ -// @generated Code generated by gen-atomicint. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "encoding/json" - "strconv" - "sync/atomic" -) - -// Uintptr is an atomic wrapper around uintptr. -type Uintptr struct { - _ nocmp // disallow non-atomic comparison - - v uintptr -} - -// NewUintptr creates a new Uintptr. -func NewUintptr(val uintptr) *Uintptr { - return &Uintptr{v: val} -} - -// Load atomically loads the wrapped value. -func (i *Uintptr) Load() uintptr { - return atomic.LoadUintptr(&i.v) -} - -// Add atomically adds to the wrapped uintptr and returns the new value. -func (i *Uintptr) Add(delta uintptr) uintptr { - return atomic.AddUintptr(&i.v, delta) -} - -// Sub atomically subtracts from the wrapped uintptr and returns the new value. -func (i *Uintptr) Sub(delta uintptr) uintptr { - return atomic.AddUintptr(&i.v, ^(delta - 1)) -} - -// Inc atomically increments the wrapped uintptr and returns the new value. -func (i *Uintptr) Inc() uintptr { - return i.Add(1) -} - -// Dec atomically decrements the wrapped uintptr and returns the new value. -func (i *Uintptr) Dec() uintptr { - return i.Sub(1) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap. -func (i *Uintptr) CAS(old, new uintptr) (swapped bool) { - return i.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (i *Uintptr) CompareAndSwap(old, new uintptr) (swapped bool) { - return atomic.CompareAndSwapUintptr(&i.v, old, new) -} - -// Store atomically stores the passed value. -func (i *Uintptr) Store(val uintptr) { - atomic.StoreUintptr(&i.v, val) -} - -// Swap atomically swaps the wrapped uintptr and returns the old value. -func (i *Uintptr) Swap(val uintptr) (old uintptr) { - return atomic.SwapUintptr(&i.v, val) -} - -// MarshalJSON encodes the wrapped uintptr into JSON. -func (i *Uintptr) MarshalJSON() ([]byte, error) { - return json.Marshal(i.Load()) -} - -// UnmarshalJSON decodes JSON into the wrapped uintptr. -func (i *Uintptr) UnmarshalJSON(b []byte) error { - var v uintptr - if err := json.Unmarshal(b, &v); err != nil { - return err - } - i.Store(v) - return nil -} - -// String encodes the wrapped value as a string. -func (i *Uintptr) String() string { - v := i.Load() - return strconv.FormatUint(uint64(v), 10) -} diff --git a/tools/vendor/go.uber.org/atomic/unsafe_pointer.go b/tools/vendor/go.uber.org/atomic/unsafe_pointer.go deleted file mode 100644 index 34868baf6..000000000 --- a/tools/vendor/go.uber.org/atomic/unsafe_pointer.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2021-2022 Uber Technologies, Inc. -// -// 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. - -package atomic - -import ( - "sync/atomic" - "unsafe" -) - -// UnsafePointer is an atomic wrapper around unsafe.Pointer. -type UnsafePointer struct { - _ nocmp // disallow non-atomic comparison - - v unsafe.Pointer -} - -// NewUnsafePointer creates a new UnsafePointer. -func NewUnsafePointer(val unsafe.Pointer) *UnsafePointer { - return &UnsafePointer{v: val} -} - -// Load atomically loads the wrapped value. -func (p *UnsafePointer) Load() unsafe.Pointer { - return atomic.LoadPointer(&p.v) -} - -// Store atomically stores the passed value. -func (p *UnsafePointer) Store(val unsafe.Pointer) { - atomic.StorePointer(&p.v, val) -} - -// Swap atomically swaps the wrapped unsafe.Pointer and returns the old value. -func (p *UnsafePointer) Swap(val unsafe.Pointer) (old unsafe.Pointer) { - return atomic.SwapPointer(&p.v, val) -} - -// CAS is an atomic compare-and-swap. -// -// Deprecated: Use CompareAndSwap -func (p *UnsafePointer) CAS(old, new unsafe.Pointer) (swapped bool) { - return p.CompareAndSwap(old, new) -} - -// CompareAndSwap is an atomic compare-and-swap. -func (p *UnsafePointer) CompareAndSwap(old, new unsafe.Pointer) (swapped bool) { - return atomic.CompareAndSwapPointer(&p.v, old, new) -} diff --git a/tools/vendor/go.uber.org/atomic/value.go b/tools/vendor/go.uber.org/atomic/value.go deleted file mode 100644 index 52caedb9a..000000000 --- a/tools/vendor/go.uber.org/atomic/value.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2020 Uber Technologies, Inc. -// -// 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. - -package atomic - -import "sync/atomic" - -// Value shadows the type of the same name from sync/atomic -// https://godoc.org/sync/atomic#Value -type Value struct { - _ nocmp // disallow non-atomic comparison - - atomic.Value -} diff --git a/tools/vendor/go.uber.org/multierr/CHANGELOG.md b/tools/vendor/go.uber.org/multierr/CHANGELOG.md index 3ba05276f..f8177b978 100644 --- a/tools/vendor/go.uber.org/multierr/CHANGELOG.md +++ b/tools/vendor/go.uber.org/multierr/CHANGELOG.md @@ -1,6 +1,29 @@ Releases ======== +v1.11.0 (2023-03-28) +==================== +- `Errors` now supports any error that implements multiple-error + interface. +- Add `Every` function to allow checking if all errors in the chain + satisfies `errors.Is` against the target error. + +v1.10.0 (2023-03-08) +==================== + +- Comply with Go 1.20's multiple-error interface. +- Drop Go 1.18 support. + Per the support policy, only Go 1.19 and 1.20 are supported now. +- Drop all non-test external dependencies. + +v1.9.0 (2022-12-12) +=================== + +- Add `AppendFunc` that allow passsing functions to similar to + `AppendInvoke`. + +- Bump up yaml.v3 dependency to 3.0.1. + v1.8.0 (2022-02-28) =================== diff --git a/tools/vendor/go.uber.org/multierr/README.md b/tools/vendor/go.uber.org/multierr/README.md index 70aacecd7..5ab6ac40f 100644 --- a/tools/vendor/go.uber.org/multierr/README.md +++ b/tools/vendor/go.uber.org/multierr/README.md @@ -2,9 +2,29 @@ `multierr` allows combining one or more Go `error`s together. +## Features + +- **Idiomatic**: + multierr follows best practices in Go, and keeps your code idiomatic. + - It keeps the underlying error type hidden, + allowing you to deal in `error` values exclusively. + - It provides APIs to safely append into an error from a `defer` statement. +- **Performant**: + multierr is optimized for performance: + - It avoids allocations where possible. + - It utilizes slice resizing semantics to optimize common cases + like appending into the same error object from a loop. +- **Interoperable**: + multierr interoperates with the Go standard library's error APIs seamlessly: + - The `errors.Is` and `errors.As` functions *just work*. +- **Lightweight**: + multierr comes with virtually no dependencies. + ## Installation - go get -u go.uber.org/multierr +```bash +go get -u go.uber.org/multierr@latest +``` ## Status diff --git a/tools/vendor/go.uber.org/multierr/error.go b/tools/vendor/go.uber.org/multierr/error.go index f45af149c..3a828b2df 100644 --- a/tools/vendor/go.uber.org/multierr/error.go +++ b/tools/vendor/go.uber.org/multierr/error.go @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021 Uber Technologies, Inc. +// Copyright (c) 2017-2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,106 +20,109 @@ // Package multierr allows combining one or more errors together. // -// Overview +// # Overview // // Errors can be combined with the use of the Combine function. // -// multierr.Combine( -// reader.Close(), -// writer.Close(), -// conn.Close(), -// ) +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) // // If only two errors are being combined, the Append function may be used // instead. // -// err = multierr.Append(reader.Close(), writer.Close()) +// err = multierr.Append(reader.Close(), writer.Close()) // // The underlying list of errors for a returned error object may be retrieved // with the Errors function. // -// errors := multierr.Errors(err) -// if len(errors) > 0 { -// fmt.Println("The following errors occurred:", errors) -// } +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:", errors) +// } // -// Appending from a loop +// # Appending from a loop // // You sometimes need to append into an error from a loop. // -// var err error -// for _, item := range items { -// err = multierr.Append(err, process(item)) -// } +// var err error +// for _, item := range items { +// err = multierr.Append(err, process(item)) +// } // // Cases like this may require knowledge of whether an individual instance // failed. This usually requires introduction of a new variable. // -// var err error -// for _, item := range items { -// if perr := process(item); perr != nil { -// log.Warn("skipping item", item) -// err = multierr.Append(err, perr) -// } -// } +// var err error +// for _, item := range items { +// if perr := process(item); perr != nil { +// log.Warn("skipping item", item) +// err = multierr.Append(err, perr) +// } +// } // // multierr includes AppendInto to simplify cases like this. // -// var err error -// for _, item := range items { -// if multierr.AppendInto(&err, process(item)) { -// log.Warn("skipping item", item) -// } -// } +// var err error +// for _, item := range items { +// if multierr.AppendInto(&err, process(item)) { +// log.Warn("skipping item", item) +// } +// } // // This will append the error into the err variable, and return true if that // individual error was non-nil. // -// See AppendInto for more information. +// See [AppendInto] for more information. // -// Deferred Functions +// # Deferred Functions // // Go makes it possible to modify the return value of a function in a defer // block if the function was using named returns. This makes it possible to // record resource cleanup failures from deferred blocks. // -// func sendRequest(req Request) (err error) { -// conn, err := openConnection() -// if err != nil { -// return err -// } -// defer func() { -// err = multierr.Append(err, conn.Close()) -// }() -// // ... -// } +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } // // multierr provides the Invoker type and AppendInvoke function to make cases // like the above simpler and obviate the need for a closure. The following is // roughly equivalent to the example above. // -// func sendRequest(req Request) (err error) { -// conn, err := openConnection() -// if err != nil { -// return err -// } -// defer multierr.AppendInvoke(&err, multierr.Close(conn)) -// // ... -// } +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(conn)) +// // ... +// } // -// See AppendInvoke and Invoker for more information. +// See [AppendInvoke] and [Invoker] for more information. // -// Advanced Usage +// NOTE: If you're modifying an error from inside a defer, you MUST use a named +// return value for that function. +// +// # Advanced Usage // // Errors returned by Combine and Append MAY implement the following // interface. // -// type errorGroup interface { -// // Returns a slice containing the underlying list of errors. -// // -// // This slice MUST NOT be modified by the caller. -// Errors() []error -// } +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } // // Note that if you need access to list of errors behind a multierr error, you // should prefer using the Errors function. That said, if you need cheap @@ -128,13 +131,13 @@ // because errors returned by Combine and Append are not guaranteed to // implement this interface. // -// var errors []error -// group, ok := err.(errorGroup) -// if ok { -// errors = group.Errors() -// } else { -// errors = []error{err} -// } +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } package multierr // import "go.uber.org/multierr" import ( @@ -144,8 +147,7 @@ import ( "io" "strings" "sync" - - "go.uber.org/atomic" + "sync/atomic" ) var ( @@ -185,34 +187,15 @@ type errorGroup interface { // Errors returns a slice containing zero or more errors that the supplied // error is composed of. If the error is nil, a nil slice is returned. // -// err := multierr.Append(r.Close(), w.Close()) -// errors := multierr.Errors(err) +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) // // If the error is not composed of other errors, the returned slice contains // just the error that was passed in. // // Callers of this function are free to modify the returned slice. func Errors(err error) []error { - if err == nil { - return nil - } - - // Note that we're casting to multiError, not errorGroup. Our contract is - // that returned errors MAY implement errorGroup. Errors, however, only - // has special behavior for multierr-specific error objects. - // - // This behavior can be expanded in the future but I think it's prudent to - // start with as little as possible in terms of contract and possibility - // of misuse. - eg, ok := err.(*multiError) - if !ok { - return []error{err} - } - - errors := eg.Errors() - result := make([]error, len(errors)) - copy(result, errors) - return result + return extractErrors(err) } // multiError is an error that holds one or more errors. @@ -227,8 +210,6 @@ type multiError struct { errors []error } -var _ errorGroup = (*multiError)(nil) - // Errors returns the list of underlying errors. // // This slice MUST NOT be modified. @@ -239,33 +220,6 @@ func (merr *multiError) Errors() []error { return merr.errors } -// As attempts to find the first error in the error list that matches the type -// of the value that target points to. -// -// This function allows errors.As to traverse the values stored on the -// multierr error. -func (merr *multiError) As(target interface{}) bool { - for _, err := range merr.Errors() { - if errors.As(err, target) { - return true - } - } - return false -} - -// Is attempts to match the provided error against errors in the error list. -// -// This function allows errors.Is to traverse the values stored on the -// multierr error. -func (merr *multiError) Is(target error) bool { - for _, err := range merr.Errors() { - if errors.Is(err, target) { - return true - } - } - return false -} - func (merr *multiError) Error() string { if merr == nil { return "" @@ -281,6 +235,17 @@ func (merr *multiError) Error() string { return result } +// Every compares every error in the given err against the given target error +// using [errors.Is], and returns true only if every comparison returned true. +func Every(err error, target error) bool { + for _, e := range extractErrors(err) { + if !errors.Is(e, target) { + return false + } + } + return true +} + func (merr *multiError) Format(f fmt.State, c rune) { if c == 'v' && f.Flag('+') { merr.writeMultiline(f) @@ -393,8 +358,7 @@ func fromSlice(errors []error) error { // Otherwise "errors" escapes to the heap // unconditionally for all other cases. // This lets us optimize for the "no errors" case. - out := make([]error, len(errors)) - copy(out, errors) + out := append(([]error)(nil), errors...) return &multiError{errors: out} } } @@ -420,32 +384,32 @@ func fromSlice(errors []error) error { // If zero arguments were passed or if all items are nil, a nil error is // returned. // -// Combine(nil, nil) // == nil +// Combine(nil, nil) // == nil // // If only a single error was passed, it is returned as-is. // -// Combine(err) // == err +// Combine(err) // == err // // Combine skips over nil arguments so this function may be used to combine // together errors from operations that fail independently of each other. // -// multierr.Combine( -// reader.Close(), -// writer.Close(), -// pipe.Close(), -// ) +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) // // If any of the passed errors is a multierr error, it will be flattened along // with the other errors. // -// multierr.Combine(multierr.Combine(err1, err2), err3) -// // is the same as -// multierr.Combine(err1, err2, err3) +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) // // The returned error formats into a readable multi-line error message if // formatted with %+v. // -// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) func Combine(errors ...error) error { return fromSlice(errors) } @@ -455,16 +419,19 @@ func Combine(errors ...error) error { // This function is a specialization of Combine for the common case where // there are only two errors. // -// err = multierr.Append(reader.Close(), writer.Close()) +// err = multierr.Append(reader.Close(), writer.Close()) // // The following pattern may also be used to record failure of deferred // operations without losing information about the original error. // -// func doSomething(..) (err error) { -// f := acquireResource() -// defer func() { -// err = multierr.Append(err, f.Close()) -// }() +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +// +// Note that the variable MUST be a named return to append an error to it from +// the defer statement. See also [AppendInvoke]. func Append(left error, right error) error { switch { case left == nil: @@ -494,37 +461,37 @@ func Append(left error, right error) error { // AppendInto appends an error into the destination of an error pointer and // returns whether the error being appended was non-nil. // -// var err error -// multierr.AppendInto(&err, r.Close()) -// multierr.AppendInto(&err, w.Close()) +// var err error +// multierr.AppendInto(&err, r.Close()) +// multierr.AppendInto(&err, w.Close()) // // The above is equivalent to, // -// err := multierr.Append(r.Close(), w.Close()) +// err := multierr.Append(r.Close(), w.Close()) // // As AppendInto reports whether the provided error was non-nil, it may be // used to build a multierr error in a loop more ergonomically. For example: // -// var err error -// for line := range lines { -// var item Item -// if multierr.AppendInto(&err, parse(line, &item)) { -// continue -// } -// items = append(items, item) -// } +// var err error +// for line := range lines { +// var item Item +// if multierr.AppendInto(&err, parse(line, &item)) { +// continue +// } +// items = append(items, item) +// } // // Compare this with a version that relies solely on Append: // -// var err error -// for line := range lines { -// var item Item -// if parseErr := parse(line, &item); parseErr != nil { -// err = multierr.Append(err, parseErr) -// continue -// } -// items = append(items, item) -// } +// var err error +// for line := range lines { +// var item Item +// if parseErr := parse(line, &item); parseErr != nil { +// err = multierr.Append(err, parseErr) +// continue +// } +// items = append(items, item) +// } func AppendInto(into *error, err error) (errored bool) { if into == nil { // We panic if 'into' is nil. This is not documented above @@ -545,7 +512,7 @@ func AppendInto(into *error, err error) (errored bool) { // AppendInvoke to append the result of calling the function into an error. // This allows you to conveniently defer capture of failing operations. // -// See also, Close and Invoke. +// See also, [Close] and [Invoke]. type Invoker interface { Invoke() error } @@ -556,19 +523,22 @@ type Invoker interface { // // For example, // -// func processReader(r io.Reader) (err error) { -// scanner := bufio.NewScanner(r) -// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) -// for scanner.Scan() { -// // ... -// } -// // ... -// } +// func processReader(r io.Reader) (err error) { +// scanner := bufio.NewScanner(r) +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// for scanner.Scan() { +// // ... +// } +// // ... +// } // // In this example, the following line will construct the Invoker right away, // but defer the invocation of scanner.Err() until the function returns. // -// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// +// Note that the error you're appending to from the defer statement MUST be a +// named return. type Invoke func() error // Invoke calls the supplied function and returns its result. @@ -579,19 +549,22 @@ func (i Invoke) Invoke() error { return i() } // // For example, // -// func processFile(path string) (err error) { -// f, err := os.Open(path) -// if err != nil { -// return err -// } -// defer multierr.AppendInvoke(&err, multierr.Close(f)) -// return processReader(f) -// } +// func processFile(path string) (err error) { +// f, err := os.Open(path) +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// return processReader(f) +// } // // In this example, multierr.Close will construct the Invoker right away, but // defer the invocation of f.Close until the function returns. // -// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// +// Note that the error you're appending to from the defer statement MUST be a +// named return. func Close(closer io.Closer) Invoker { return Invoke(closer.Close) } @@ -601,52 +574,73 @@ func Close(closer io.Closer) Invoker { // invocation of fallible operations until a function returns, and capture the // resulting errors. // -// func doSomething(...) (err error) { -// // ... -// f, err := openFile(..) -// if err != nil { -// return err -// } +// func doSomething(...) (err error) { +// // ... +// f, err := openFile(..) +// if err != nil { +// return err +// } +// +// // multierr will call f.Close() when this function returns and +// // if the operation fails, its append its error into the +// // returned error. +// defer multierr.AppendInvoke(&err, multierr.Close(f)) // -// // multierr will call f.Close() when this function returns and -// // if the operation fails, its append its error into the -// // returned error. -// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// scanner := bufio.NewScanner(f) +// // Similarly, this scheduled scanner.Err to be called and +// // inspected when the function returns and append its error +// // into the returned error. +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) // -// scanner := bufio.NewScanner(f) -// // Similarly, this scheduled scanner.Err to be called and -// // inspected when the function returns and append its error -// // into the returned error. -// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// // ... +// } // -// // ... -// } +// NOTE: If used with a defer, the error variable MUST be a named return. // // Without defer, AppendInvoke behaves exactly like AppendInto. // -// err := // ... -// multierr.AppendInvoke(&err, mutltierr.Invoke(foo)) +// err := // ... +// multierr.AppendInvoke(&err, mutltierr.Invoke(foo)) // -// // ...is roughly equivalent to... +// // ...is roughly equivalent to... // -// err := // ... -// multierr.AppendInto(&err, foo()) +// err := // ... +// multierr.AppendInto(&err, foo()) // // The advantage of the indirection introduced by Invoker is to make it easy // to defer the invocation of a function. Without this indirection, the // invoked function will be evaluated at the time of the defer block rather // than when the function returns. // -// // BAD: This is likely not what the caller intended. This will evaluate -// // foo() right away and append its result into the error when the -// // function returns. -// defer multierr.AppendInto(&err, foo()) +// // BAD: This is likely not what the caller intended. This will evaluate +// // foo() right away and append its result into the error when the +// // function returns. +// defer multierr.AppendInto(&err, foo()) // -// // GOOD: This will defer invocation of foo unutil the function returns. -// defer multierr.AppendInvoke(&err, multierr.Invoke(foo)) +// // GOOD: This will defer invocation of foo unutil the function returns. +// defer multierr.AppendInvoke(&err, multierr.Invoke(foo)) // // multierr provides a few Invoker implementations out of the box for -// convenience. See Invoker for more information. +// convenience. See [Invoker] for more information. func AppendInvoke(into *error, invoker Invoker) { AppendInto(into, invoker.Invoke()) } + +// AppendFunc is a shorthand for [AppendInvoke]. +// It allows using function or method value directly +// without having to wrap it into an [Invoker] interface. +// +// func doSomething(...) (err error) { +// w, err := startWorker(...) +// if err != nil { +// return err +// } +// +// // multierr will call w.Stop() when this function returns and +// // if the operation fails, it appends its error into the +// // returned error. +// defer multierr.AppendFunc(&err, w.Stop) +// } +func AppendFunc(into *error, fn func() error) { + AppendInvoke(into, Invoke(fn)) +} diff --git a/tools/vendor/go.uber.org/atomic/error_ext.go b/tools/vendor/go.uber.org/multierr/error_post_go120.go similarity index 65% rename from tools/vendor/go.uber.org/atomic/error_ext.go rename to tools/vendor/go.uber.org/multierr/error_post_go120.go index d31fb633b..a173f9c25 100644 --- a/tools/vendor/go.uber.org/atomic/error_ext.go +++ b/tools/vendor/go.uber.org/multierr/error_post_go120.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020-2022 Uber Technologies, Inc. +// Copyright (c) 2017-2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,22 +18,31 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package atomic +//go:build go1.20 +// +build go1.20 -// atomic.Value panics on nil inputs, or if the underlying type changes. -// Stabilize by always storing a custom struct that we control. +package multierr -//go:generate bin/gen-atomicwrapper -name=Error -type=error -wrapped=Value -pack=packError -unpack=unpackError -compareandswap -swap -file=error.go - -type packedError struct{ Value error } +// Unwrap returns a list of errors wrapped by this multierr. +func (merr *multiError) Unwrap() []error { + return merr.Errors() +} -func packError(v error) interface{} { - return packedError{v} +type multipleErrors interface { + Unwrap() []error } -func unpackError(v interface{}) error { - if err, ok := v.(packedError); ok { - return err.Value +func extractErrors(err error) []error { + if err == nil { + return nil } - return nil + + // check if the given err is an Unwrapable error that + // implements multipleErrors interface. + eg, ok := err.(multipleErrors) + if !ok { + return []error{err} + } + + return append(([]error)(nil), eg.Unwrap()...) } diff --git a/tools/vendor/go.uber.org/multierr/error_pre_go120.go b/tools/vendor/go.uber.org/multierr/error_pre_go120.go new file mode 100644 index 000000000..93872a3fc --- /dev/null +++ b/tools/vendor/go.uber.org/multierr/error_pre_go120.go @@ -0,0 +1,79 @@ +// Copyright (c) 2017-2023 Uber Technologies, Inc. +// +// 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. + +//go:build !go1.20 +// +build !go1.20 + +package multierr + +import "errors" + +// Versions of Go before 1.20 did not support the Unwrap() []error method. +// This provides a similar behavior by implementing the Is(..) and As(..) +// methods. +// See the errors.Join proposal for details: +// https://github.com/golang/go/issues/53435 + +// As attempts to find the first error in the error list that matches the type +// of the value that target points to. +// +// This function allows errors.As to traverse the values stored on the +// multierr error. +func (merr *multiError) As(target interface{}) bool { + for _, err := range merr.Errors() { + if errors.As(err, target) { + return true + } + } + return false +} + +// Is attempts to match the provided error against errors in the error list. +// +// This function allows errors.Is to traverse the values stored on the +// multierr error. +func (merr *multiError) Is(target error) bool { + for _, err := range merr.Errors() { + if errors.Is(err, target) { + return true + } + } + return false +} + +func extractErrors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + return append(([]error)(nil), eg.Errors()...) +} diff --git a/tools/vendor/go.uber.org/multierr/glide.yaml b/tools/vendor/go.uber.org/multierr/glide.yaml deleted file mode 100644 index 6ef084ec2..000000000 --- a/tools/vendor/go.uber.org/multierr/glide.yaml +++ /dev/null @@ -1,8 +0,0 @@ -package: go.uber.org/multierr -import: -- package: go.uber.org/atomic - version: ^1 -testImport: -- package: github.com/stretchr/testify - subpackages: - - assert diff --git a/tools/vendor/go.uber.org/zap/.golangci.yml b/tools/vendor/go.uber.org/zap/.golangci.yml new file mode 100644 index 000000000..fbc6df790 --- /dev/null +++ b/tools/vendor/go.uber.org/zap/.golangci.yml @@ -0,0 +1,77 @@ +output: + # Make output more digestible with quickfix in vim/emacs/etc. + sort-results: true + print-issued-lines: false + +linters: + # We'll track the golangci-lint default linters manually + # instead of letting them change without our control. + disable-all: true + enable: + # golangci-lint defaults: + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - unused + + # Our own extras: + - gofmt + - nolintlint # lints nolint directives + - revive + +linters-settings: + govet: + # These govet checks are disabled by default, but they're useful. + enable: + - niliness + - reflectvaluecompare + - sortslice + - unusedwrite + + errcheck: + exclude-functions: + # These methods can not fail. + # They operate on an in-memory buffer. + - (*go.uber.org/zap/buffer.Buffer).Write + - (*go.uber.org/zap/buffer.Buffer).WriteByte + - (*go.uber.org/zap/buffer.Buffer).WriteString + + - (*go.uber.org/zap/zapio.Writer).Close + - (*go.uber.org/zap/zapio.Writer).Sync + - (*go.uber.org/zap/zapio.Writer).Write + # Write to zapio.Writer cannot fail, + # so io.WriteString on it cannot fail. + - io.WriteString(*go.uber.org/zap/zapio.Writer) + + # Writing a plain string to a fmt.State cannot fail. + - io.WriteString(fmt.State) + +issues: + # Print all issues reported by all linters. + max-issues-per-linter: 0 + max-same-issues: 0 + + # Don't ignore some of the issues that golangci-lint considers okay. + # This includes documenting all exported entities. + exclude-use-default: false + + exclude-rules: + # Don't warn on unused parameters. + # Parameter names are useful; replacing them with '_' is undesirable. + - linters: [revive] + text: 'unused-parameter: parameter \S+ seems to be unused, consider removing or renaming it as _' + + # staticcheck already has smarter checks for empty blocks. + # revive's empty-block linter has false positives. + # For example, as of writing this, the following is not allowed. + # for foo() { } + - linters: [revive] + text: 'empty-block: this block is empty, you can remove it' + + # Ignore logger.Sync() errcheck failures in example_test.go + # since those are intended to be uncomplicated examples. + - linters: [errcheck] + path: example_test.go + text: 'Error return value of `logger.Sync` is not checked' diff --git a/tools/vendor/go.uber.org/zap/CHANGELOG.md b/tools/vendor/go.uber.org/zap/CHANGELOG.md index 0db1f9f15..11b465976 100644 --- a/tools/vendor/go.uber.org/zap/CHANGELOG.md +++ b/tools/vendor/go.uber.org/zap/CHANGELOG.md @@ -1,7 +1,39 @@ # Changelog All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 1.26.0 (14 Sep 2023) +Enhancements: +* [#1319][]: Add `WithLazy` method to `Logger` which lazily evaluates the structured +context. +* [#1350][]: String encoding is much (~50%) faster now. + +Thanks to @jquirke, @cdvr1993 for their contributions to this release. + +[#1319]: https://github.com/uber-go/zap/pull/1319 +[#1350]: https://github.com/uber-go/zap/pull/1350 + +## 1.25.0 (1 Aug 2023) + +This release contains several improvements including performance, API additions, +and two new experimental packages whose APIs are unstable and may change in the +future. + +Enhancements: +* [#1246][]: Add `zap/exp/zapslog` package for integration with slog. +* [#1273][]: Add `Name` to `Logger` which returns the Logger's name if one is set. +* [#1281][]: Add `zap/exp/expfield` package which contains helper methods +`Str` and `Strs` for constructing String-like zap.Fields. +* [#1310][]: Reduce stack size on `Any`. + +Thanks to @knight42, @dzakaammar, @bcspragu, and @rexywork for their contributions +to this release. + +[#1246]: https://github.com/uber-go/zap/pull/1246 +[#1273]: https://github.com/uber-go/zap/pull/1273 +[#1281]: https://github.com/uber-go/zap/pull/1281 +[#1310]: https://github.com/uber-go/zap/pull/1310 ## 1.24.0 (30 Nov 2022) @@ -27,7 +59,6 @@ Enhancements: [#1147]: https://github.com/uber-go/zap/pull/1147 [#1155]: https://github.com/uber-go/zap/pull/1155 - ## 1.22.0 (8 Aug 2022) Enhancements: @@ -176,6 +207,16 @@ Enhancements: Thanks to @ash2k, @FMLS, @jimmystewpot, @Oncilla, @tsoslow, @tylitianrui, @withshubh, and @wziww for their contributions to this release. +[#865]: https://github.com/uber-go/zap/pull/865 +[#867]: https://github.com/uber-go/zap/pull/867 +[#881]: https://github.com/uber-go/zap/pull/881 +[#903]: https://github.com/uber-go/zap/pull/903 +[#912]: https://github.com/uber-go/zap/pull/912 +[#913]: https://github.com/uber-go/zap/pull/913 +[#928]: https://github.com/uber-go/zap/pull/928 +[#931]: https://github.com/uber-go/zap/pull/931 +[#936]: https://github.com/uber-go/zap/pull/936 + ## 1.16.0 (1 Sep 2020) Bugfixes: @@ -197,6 +238,17 @@ Enhancements: Thanks to @SteelPhase, @tmshn, @lixingwang, @wyxloading, @moul, @segevfiner, @andy-retailnext and @jcorbin for their contributions to this release. +[#629]: https://github.com/uber-go/zap/pull/629 +[#697]: https://github.com/uber-go/zap/pull/697 +[#828]: https://github.com/uber-go/zap/pull/828 +[#835]: https://github.com/uber-go/zap/pull/835 +[#843]: https://github.com/uber-go/zap/pull/843 +[#844]: https://github.com/uber-go/zap/pull/844 +[#852]: https://github.com/uber-go/zap/pull/852 +[#854]: https://github.com/uber-go/zap/pull/854 +[#861]: https://github.com/uber-go/zap/pull/861 +[#862]: https://github.com/uber-go/zap/pull/862 + ## 1.15.0 (23 Apr 2020) Bugfixes: @@ -213,6 +265,11 @@ Enhancements: Thanks to @danielbprice for their contributions to this release. +[#804]: https://github.com/uber-go/zap/pull/804 +[#812]: https://github.com/uber-go/zap/pull/812 +[#806]: https://github.com/uber-go/zap/pull/806 +[#813]: https://github.com/uber-go/zap/pull/813 + ## 1.14.1 (14 Mar 2020) Bugfixes: @@ -225,6 +282,10 @@ Bugfixes: Thanks to @YashishDua for their contributions to this release. +[#791]: https://github.com/uber-go/zap/pull/791 +[#795]: https://github.com/uber-go/zap/pull/795 +[#799]: https://github.com/uber-go/zap/pull/799 + ## 1.14.0 (20 Feb 2020) Enhancements: @@ -235,6 +296,11 @@ Enhancements: Thanks to @caibirdme for their contributions to this release. +[#771]: https://github.com/uber-go/zap/pull/771 +[#773]: https://github.com/uber-go/zap/pull/773 +[#775]: https://github.com/uber-go/zap/pull/775 +[#786]: https://github.com/uber-go/zap/pull/786 + ## 1.13.0 (13 Nov 2019) Enhancements: @@ -243,11 +309,15 @@ Enhancements: Thanks to @jbizzle for their contributions to this release. +[#758]: https://github.com/uber-go/zap/pull/758 + ## 1.12.0 (29 Oct 2019) Enhancements: * [#751][]: Migrate to Go modules. +[#751]: https://github.com/uber-go/zap/pull/751 + ## 1.11.0 (21 Oct 2019) Enhancements: @@ -256,6 +326,9 @@ Enhancements: Thanks to @juicemia, @uhthomas for their contributions to this release. +[#725]: https://github.com/uber-go/zap/pull/725 +[#736]: https://github.com/uber-go/zap/pull/736 + ## 1.10.0 (29 Apr 2019) Bugfixes: @@ -273,12 +346,20 @@ Enhancements: Thanks to @iaroslav-ciupin, @lelenanam, @joa, @NWilson for their contributions to this release. +[#657]: https://github.com/uber-go/zap/pull/657 +[#706]: https://github.com/uber-go/zap/pull/706 +[#610]: https://github.com/uber-go/zap/pull/610 +[#675]: https://github.com/uber-go/zap/pull/675 +[#704]: https://github.com/uber-go/zap/pull/704 + ## v1.9.1 (06 Aug 2018) Bugfixes: * [#614][]: MapObjectEncoder should not ignore empty slices. +[#614]: https://github.com/uber-go/zap/pull/614 + ## v1.9.0 (19 Jul 2018) Enhancements: @@ -288,6 +369,10 @@ Enhancements: Thanks to @nfarah86, @AlekSi, @JeanMertz, @philippgille, @etsangsplk, and @dimroc for their contributions to this release. +[#602]: https://github.com/uber-go/zap/pull/602 +[#572]: https://github.com/uber-go/zap/pull/572 +[#606]: https://github.com/uber-go/zap/pull/606 + ## v1.8.0 (13 Apr 2018) Enhancements: @@ -301,11 +386,18 @@ Bugfixes: Thanks to @DiSiqueira and @djui for their contributions to this release. +[#508]: https://github.com/uber-go/zap/pull/508 +[#518]: https://github.com/uber-go/zap/pull/518 +[#577]: https://github.com/uber-go/zap/pull/577 +[#574]: https://github.com/uber-go/zap/pull/574 + ## v1.7.1 (25 Sep 2017) Bugfixes: * [#504][]: Store strings when using AddByteString with the map encoder. +[#504]: https://github.com/uber-go/zap/pull/504 + ## v1.7.0 (21 Sep 2017) Enhancements: @@ -313,6 +405,8 @@ Enhancements: * [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user to specify the level of the logged messages. +[#487]: https://github.com/uber-go/zap/pull/487 + ## v1.6.0 (30 Aug 2017) Enhancements: @@ -321,6 +415,9 @@ Enhancements: * [#490][]: Add a `ContextMap` method to observer logs for simpler field validation in tests. +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 + ## v1.5.0 (22 Jul 2017) Enhancements: @@ -334,6 +431,11 @@ Bugfixes: Thanks to @richard-tunein and @pavius for their contributions to this release. +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 + ## v1.4.1 (08 Jun 2017) This release fixes two bugs. @@ -343,6 +445,9 @@ Bugfixes: * [#435][]: Support a variety of case conventions when unmarshaling levels. * [#444][]: Fix a panic in the observer. +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 + ## v1.4.0 (12 May 2017) This release adds a few small features and is fully backward-compatible. @@ -355,6 +460,10 @@ Enhancements: * [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a variety of operations a bit simpler. +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 + ## v1.3.0 (25 Apr 2017) This release adds an enhancement to zap's testing helpers as well as the @@ -366,6 +475,9 @@ Enhancements: particularly useful when testing the `SugaredLogger`. * [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 + ## v1.2.0 (13 Apr 2017) This release adds a gRPC compatibility wrapper. It is fully backward-compatible. @@ -375,6 +487,8 @@ Enhancements: * [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements `grpclog.Logger`. +[#402]: https://github.com/uber-go/zap/pull/402 + ## v1.1.0 (31 Mar 2017) This release fixes two bugs and adds some enhancements to zap's testing helpers. @@ -392,6 +506,10 @@ Enhancements: Thanks to @moitias for contributing to this release. +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 + ## v1.0.0 (14 Mar 2017) This is zap's first stable release. All exported APIs are now final, and no @@ -437,6 +555,20 @@ Enhancements: Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their contributions to this release. +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 + ## v1.0.0-rc.3 (7 Mar 2017) This is the third release candidate for zap's stable release. There are no @@ -458,6 +590,11 @@ Enhancements: Thanks to @ansel1 and @suyash for their contributions to this release. +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 + ## v1.0.0-rc.2 (21 Feb 2017) This is the second release candidate for zap's stable release. It includes two @@ -495,6 +632,15 @@ Enhancements: Thanks to @skipor and @chapsuk for their contributions to this release. +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 + ## v1.0.0-rc.1 (14 Feb 2017) This is the first release candidate for zap's stable release. There are multiple @@ -523,95 +669,3 @@ backward compatibility concerns and all functionality is new. Early zap adopters should pin to the 0.1.x minor version until they're ready to upgrade to the upcoming stable release. - -[#316]: https://github.com/uber-go/zap/pull/316 -[#309]: https://github.com/uber-go/zap/pull/309 -[#317]: https://github.com/uber-go/zap/pull/317 -[#321]: https://github.com/uber-go/zap/pull/321 -[#325]: https://github.com/uber-go/zap/pull/325 -[#333]: https://github.com/uber-go/zap/pull/333 -[#326]: https://github.com/uber-go/zap/pull/326 -[#300]: https://github.com/uber-go/zap/pull/300 -[#339]: https://github.com/uber-go/zap/pull/339 -[#307]: https://github.com/uber-go/zap/pull/307 -[#353]: https://github.com/uber-go/zap/pull/353 -[#311]: https://github.com/uber-go/zap/pull/311 -[#366]: https://github.com/uber-go/zap/pull/366 -[#364]: https://github.com/uber-go/zap/pull/364 -[#371]: https://github.com/uber-go/zap/pull/371 -[#362]: https://github.com/uber-go/zap/pull/362 -[#369]: https://github.com/uber-go/zap/pull/369 -[#347]: https://github.com/uber-go/zap/pull/347 -[#373]: https://github.com/uber-go/zap/pull/373 -[#348]: https://github.com/uber-go/zap/pull/348 -[#327]: https://github.com/uber-go/zap/pull/327 -[#376]: https://github.com/uber-go/zap/pull/376 -[#346]: https://github.com/uber-go/zap/pull/346 -[#365]: https://github.com/uber-go/zap/pull/365 -[#372]: https://github.com/uber-go/zap/pull/372 -[#385]: https://github.com/uber-go/zap/pull/385 -[#396]: https://github.com/uber-go/zap/pull/396 -[#386]: https://github.com/uber-go/zap/pull/386 -[#402]: https://github.com/uber-go/zap/pull/402 -[#415]: https://github.com/uber-go/zap/pull/415 -[#416]: https://github.com/uber-go/zap/pull/416 -[#424]: https://github.com/uber-go/zap/pull/424 -[#425]: https://github.com/uber-go/zap/pull/425 -[#431]: https://github.com/uber-go/zap/pull/431 -[#435]: https://github.com/uber-go/zap/pull/435 -[#444]: https://github.com/uber-go/zap/pull/444 -[#477]: https://github.com/uber-go/zap/pull/477 -[#465]: https://github.com/uber-go/zap/pull/465 -[#460]: https://github.com/uber-go/zap/pull/460 -[#470]: https://github.com/uber-go/zap/pull/470 -[#487]: https://github.com/uber-go/zap/pull/487 -[#490]: https://github.com/uber-go/zap/pull/490 -[#491]: https://github.com/uber-go/zap/pull/491 -[#504]: https://github.com/uber-go/zap/pull/504 -[#508]: https://github.com/uber-go/zap/pull/508 -[#518]: https://github.com/uber-go/zap/pull/518 -[#577]: https://github.com/uber-go/zap/pull/577 -[#574]: https://github.com/uber-go/zap/pull/574 -[#602]: https://github.com/uber-go/zap/pull/602 -[#572]: https://github.com/uber-go/zap/pull/572 -[#606]: https://github.com/uber-go/zap/pull/606 -[#614]: https://github.com/uber-go/zap/pull/614 -[#657]: https://github.com/uber-go/zap/pull/657 -[#706]: https://github.com/uber-go/zap/pull/706 -[#610]: https://github.com/uber-go/zap/pull/610 -[#675]: https://github.com/uber-go/zap/pull/675 -[#704]: https://github.com/uber-go/zap/pull/704 -[#725]: https://github.com/uber-go/zap/pull/725 -[#736]: https://github.com/uber-go/zap/pull/736 -[#751]: https://github.com/uber-go/zap/pull/751 -[#758]: https://github.com/uber-go/zap/pull/758 -[#771]: https://github.com/uber-go/zap/pull/771 -[#773]: https://github.com/uber-go/zap/pull/773 -[#775]: https://github.com/uber-go/zap/pull/775 -[#786]: https://github.com/uber-go/zap/pull/786 -[#791]: https://github.com/uber-go/zap/pull/791 -[#795]: https://github.com/uber-go/zap/pull/795 -[#799]: https://github.com/uber-go/zap/pull/799 -[#804]: https://github.com/uber-go/zap/pull/804 -[#812]: https://github.com/uber-go/zap/pull/812 -[#806]: https://github.com/uber-go/zap/pull/806 -[#813]: https://github.com/uber-go/zap/pull/813 -[#629]: https://github.com/uber-go/zap/pull/629 -[#697]: https://github.com/uber-go/zap/pull/697 -[#828]: https://github.com/uber-go/zap/pull/828 -[#835]: https://github.com/uber-go/zap/pull/835 -[#843]: https://github.com/uber-go/zap/pull/843 -[#844]: https://github.com/uber-go/zap/pull/844 -[#852]: https://github.com/uber-go/zap/pull/852 -[#854]: https://github.com/uber-go/zap/pull/854 -[#861]: https://github.com/uber-go/zap/pull/861 -[#862]: https://github.com/uber-go/zap/pull/862 -[#865]: https://github.com/uber-go/zap/pull/865 -[#867]: https://github.com/uber-go/zap/pull/867 -[#881]: https://github.com/uber-go/zap/pull/881 -[#903]: https://github.com/uber-go/zap/pull/903 -[#912]: https://github.com/uber-go/zap/pull/912 -[#913]: https://github.com/uber-go/zap/pull/913 -[#928]: https://github.com/uber-go/zap/pull/928 -[#931]: https://github.com/uber-go/zap/pull/931 -[#936]: https://github.com/uber-go/zap/pull/936 diff --git a/tools/vendor/go.uber.org/zap/Makefile b/tools/vendor/go.uber.org/zap/Makefile index 9b1bc3b0e..eb1cee53b 100644 --- a/tools/vendor/go.uber.org/zap/Makefile +++ b/tools/vendor/go.uber.org/zap/Makefile @@ -1,50 +1,51 @@ -export GOBIN ?= $(shell pwd)/bin +# Directory containing the Makefile. +PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -GOLINT = $(GOBIN)/golint -STATICCHECK = $(GOBIN)/staticcheck +export GOBIN ?= $(PROJECT_ROOT)/bin +export PATH := $(GOBIN):$(PATH) + +GOVULNCHECK = $(GOBIN)/govulncheck BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem # Directories containing independent Go modules. -# -# We track coverage only for the main module. -MODULE_DIRS = . ./benchmarks ./zapgrpc/internal/test +MODULE_DIRS = . ./exp ./benchmarks ./zapgrpc/internal/test -# Many Go tools take file globs or directories as arguments instead of packages. -GO_FILES := $(shell \ - find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ - -o -name '*.go' -print | cut -b3-) +# Directories that we want to track coverage for. +COVER_DIRS = . ./exp .PHONY: all all: lint test .PHONY: lint -lint: $(GOLINT) $(STATICCHECK) - @rm -rf lint.log - @echo "Checking formatting..." - @gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log - @echo "Checking vet..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go vet ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking lint..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(GOLINT) ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking staticcheck..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(STATICCHECK) ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking for unresolved FIXMEs..." - @git grep -i fixme | grep -v -e Makefile | tee -a lint.log - @echo "Checking for license headers..." - @./checklicense.sh | tee -a lint.log - @[ ! -s lint.log ] - @echo "Checking 'go mod tidy'..." - @make tidy - @if ! git diff --quiet; then \ - echo "'go mod tidy' resulted in changes or working tree is dirty:"; \ - git --no-pager diff; \ - fi - -$(GOLINT): - cd tools && go install golang.org/x/lint/golint - -$(STATICCHECK): - cd tools && go install honnef.co/go/tools/cmd/staticcheck +lint: golangci-lint tidy-lint license-lint + +.PHONY: golangci-lint +golangci-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] golangci-lint: $(mod)" && \ + golangci-lint run --path-prefix $(mod)) &&) true + +.PHONY: tidy +tidy: + @$(foreach dir,$(MODULE_DIRS), \ + (cd $(dir) && go mod tidy) &&) true + +.PHONY: tidy-lint +tidy-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] tidy: $(mod)" && \ + go mod tidy && \ + git diff --exit-code -- go.mod go.sum) &&) true + + +.PHONY: license-lint +license-lint: + ./checklicense.sh + +$(GOVULNCHECK): + cd tools && go install golang.org/x/vuln/cmd/govulncheck .PHONY: test test: @@ -52,8 +53,10 @@ test: .PHONY: cover cover: - go test -race -coverprofile=cover.out -coverpkg=./... ./... - go tool cover -html=cover.out -o cover.html + @$(foreach dir,$(COVER_DIRS), ( \ + cd $(dir) && \ + go test -race -coverprofile=cover.out -coverpkg=./... ./... \ + && go tool cover -html=cover.out -o cover.html) &&) true .PHONY: bench BENCH ?= . @@ -68,6 +71,6 @@ updatereadme: rm -f README.md cat .readme.tmpl | go run internal/readme/readme.go > README.md -.PHONY: tidy -tidy: - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go mod tidy) &&) true +.PHONY: vulncheck +vulncheck: $(GOVULNCHECK) + $(GOVULNCHECK) ./... diff --git a/tools/vendor/go.uber.org/zap/README.md b/tools/vendor/go.uber.org/zap/README.md index a553a428c..9de08927b 100644 --- a/tools/vendor/go.uber.org/zap/README.md +++ b/tools/vendor/go.uber.org/zap/README.md @@ -54,7 +54,7 @@ and make many small allocations. Put differently, using `encoding/json` and Zap takes a different approach. It includes a reflection-free, zero-allocation JSON encoder, and the base `Logger` strives to avoid serialization overhead and allocations wherever possible. By building the high-level `SugaredLogger` -on that foundation, zap lets users _choose_ when they need to count every +on that foundation, zap lets users *choose* when they need to count every allocation and when they'd prefer a more familiar, loosely typed API. As measured by its own [benchmarking suite][], not only is zap more performant @@ -64,40 +64,43 @@ id="anchor-versions">[1](#footnote-versions) Log a message and 10 fields: -| Package | Time | Time % to zap | Objects Allocated | -| :------------------ | :---------: | :-----------: | :---------------: | -| :zap: zap | 2900 ns/op | +0% | 5 allocs/op | -| :zap: zap (sugared) | 3475 ns/op | +20% | 10 allocs/op | -| zerolog | 10639 ns/op | +267% | 32 allocs/op | -| go-kit | 14434 ns/op | +398% | 59 allocs/op | -| logrus | 17104 ns/op | +490% | 81 allocs/op | -| apex/log | 32424 ns/op | +1018% | 66 allocs/op | -| log15 | 33579 ns/op | +1058% | 76 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 1744 ns/op | +0% | 5 allocs/op +| :zap: zap (sugared) | 2483 ns/op | +42% | 10 allocs/op +| zerolog | 918 ns/op | -47% | 1 allocs/op +| go-kit | 5590 ns/op | +221% | 57 allocs/op +| slog | 5640 ns/op | +223% | 40 allocs/op +| apex/log | 21184 ns/op | +1115% | 63 allocs/op +| logrus | 24338 ns/op | +1296% | 79 allocs/op +| log15 | 26054 ns/op | +1394% | 74 allocs/op Log a message with a logger that already has 10 fields of context: -| Package | Time | Time % to zap | Objects Allocated | -| :------------------ | :---------: | :-----------: | :---------------: | -| :zap: zap | 373 ns/op | +0% | 0 allocs/op | -| :zap: zap (sugared) | 452 ns/op | +21% | 1 allocs/op | -| zerolog | 288 ns/op | -23% | 0 allocs/op | -| go-kit | 11785 ns/op | +3060% | 58 allocs/op | -| logrus | 19629 ns/op | +5162% | 70 allocs/op | -| log15 | 21866 ns/op | +5762% | 72 allocs/op | -| apex/log | 30890 ns/op | +8182% | 55 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 193 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 227 ns/op | +18% | 1 allocs/op +| zerolog | 81 ns/op | -58% | 0 allocs/op +| slog | 322 ns/op | +67% | 0 allocs/op +| go-kit | 5377 ns/op | +2686% | 56 allocs/op +| apex/log | 19518 ns/op | +10013% | 53 allocs/op +| log15 | 19812 ns/op | +10165% | 70 allocs/op +| logrus | 21997 ns/op | +11297% | 68 allocs/op Log a static string, without any context or `printf`-style templating: -| Package | Time | Time % to zap | Objects Allocated | -| :------------------ | :--------: | :-----------: | :---------------: | -| :zap: zap | 381 ns/op | +0% | 0 allocs/op | -| :zap: zap (sugared) | 410 ns/op | +8% | 1 allocs/op | -| zerolog | 369 ns/op | -3% | 0 allocs/op | -| standard library | 385 ns/op | +1% | 2 allocs/op | -| go-kit | 606 ns/op | +59% | 11 allocs/op | -| logrus | 1730 ns/op | +354% | 25 allocs/op | -| apex/log | 1998 ns/op | +424% | 7 allocs/op | -| log15 | 4546 ns/op | +1093% | 22 allocs/op | +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 165 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 212 ns/op | +28% | 1 allocs/op +| zerolog | 95 ns/op | -42% | 0 allocs/op +| slog | 296 ns/op | +79% | 0 allocs/op +| go-kit | 415 ns/op | +152% | 9 allocs/op +| standard library | 422 ns/op | +156% | 2 allocs/op +| apex/log | 1601 ns/op | +870% | 5 allocs/op +| logrus | 3017 ns/op | +1728% | 23 allocs/op +| log15 | 3469 ns/op | +2002% | 20 allocs/op ## Development Status: Stable @@ -131,3 +134,4 @@ pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks [benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod + diff --git a/tools/vendor/go.uber.org/zap/array.go b/tools/vendor/go.uber.org/zap/array.go index 5be3704a3..abfccb566 100644 --- a/tools/vendor/go.uber.org/zap/array.go +++ b/tools/vendor/go.uber.org/zap/array.go @@ -21,6 +21,7 @@ package zap import ( + "fmt" "time" "go.uber.org/zap/zapcore" @@ -94,11 +95,137 @@ func Int8s(key string, nums []int8) Field { return Array(key, int8s(nums)) } +// Objects constructs a field with the given key, holding a list of the +// provided objects that can be marshaled by Zap. +// +// Note that these objects must implement zapcore.ObjectMarshaler directly. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the Request type, not its pointer (*Request). +// If it's on the pointer, use ObjectValues. +// +// Given an object that implements MarshalLogObject on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Author struct{ ... } +// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var authors []Author = ... +// logger.Info("loading article", zap.Objects("authors", authors)) +// +// Similarly, given a type that implements MarshalLogObject on its pointer +// receiver, you can log a slice of pointers to that object with Objects like +// so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +// +// If instead, you have a slice of values of such an object, use the +// ObjectValues constructor. +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { + return Array(key, objects[T](values)) +} + +type objects[T zapcore.ObjectMarshaler] []T + +func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + if err := arr.AppendObject(o); err != nil { + return err + } + } + return nil +} + +// ObjectMarshalerPtr is a constraint that specifies that the given type +// implements zapcore.ObjectMarshaler on a pointer receiver. +type ObjectMarshalerPtr[T any] interface { + *T + zapcore.ObjectMarshaler +} + +// ObjectValues constructs a field with the given key, holding a list of the +// provided objects, where pointers to these objects can be marshaled by Zap. +// +// Note that pointers to these objects must implement zapcore.ObjectMarshaler. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the *Request type, not the value (Request). +// If it's on the value, use Objects. +// +// Given an object that implements MarshalLogObject on the pointer receiver, +// you can log a slice of those objects with ObjectValues like so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +// +// If instead, you have a slice of pointers of such an object, use the Objects +// field constructor. +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { + return Array(key, objectValues[T, P](values)) +} + +type objectValues[T any, P ObjectMarshalerPtr[T]] []T + +func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range os { + // It is necessary for us to explicitly reference the "P" type. + // We cannot simply pass "&os[i]" to AppendObject because its type + // is "*T", which the type system does not consider as + // implementing ObjectMarshaler. + // Only the type "P" satisfies ObjectMarshaler, which we have + // to convert "*T" to explicitly. + var p P = &os[i] + if err := arr.AppendObject(p); err != nil { + return err + } + } + return nil +} + // Strings constructs a field that carries a slice of strings. func Strings(key string, ss []string) Field { return Array(key, stringArray(ss)) } +// Stringers constructs a field with the given key, holding a list of the +// output provided by the value's String method +// +// Given an object that implements String on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Request struct{ ... } +// func (a Request) String() string +// +// var requests []Request = ... +// logger.Info("sending requests", zap.Stringers("requests", requests)) +// +// Note that these objects must implement fmt.Stringer directly. +// That is, if you're trying to marshal a []Request, the String method +// must be declared on the Request type, not its pointer (*Request). +func Stringers[T fmt.Stringer](key string, values []T) Field { + return Array(key, stringers[T](values)) +} + +type stringers[T fmt.Stringer] []T + +func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + arr.AppendString(o.String()) + } + return nil +} + // Times constructs a field that carries a slice of time.Times. func Times(key string, ts []time.Time) Field { return Array(key, times(ts)) diff --git a/tools/vendor/go.uber.org/zap/array_go118.go b/tools/vendor/go.uber.org/zap/array_go118.go deleted file mode 100644 index d0d2c49d6..000000000 --- a/tools/vendor/go.uber.org/zap/array_go118.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2022 Uber Technologies, Inc. -// -// 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. - -//go:build go1.18 -// +build go1.18 - -package zap - -import ( - "fmt" - - "go.uber.org/zap/zapcore" -) - -// Objects constructs a field with the given key, holding a list of the -// provided objects that can be marshaled by Zap. -// -// Note that these objects must implement zapcore.ObjectMarshaler directly. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the Request type, not its pointer (*Request). -// If it's on the pointer, use ObjectValues. -// -// Given an object that implements MarshalLogObject on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Author struct{ ... } -// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var authors []Author = ... -// logger.Info("loading article", zap.Objects("authors", authors)) -// -// Similarly, given a type that implements MarshalLogObject on its pointer -// receiver, you can log a slice of pointers to that object with Objects like -// so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -// -// If instead, you have a slice of values of such an object, use the -// ObjectValues constructor. -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { - return Array(key, objects[T](values)) -} - -type objects[T zapcore.ObjectMarshaler] []T - -func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - if err := arr.AppendObject(o); err != nil { - return err - } - } - return nil -} - -// ObjectMarshalerPtr is a constraint that specifies that the given type -// implements zapcore.ObjectMarshaler on a pointer receiver. -type ObjectMarshalerPtr[T any] interface { - *T - zapcore.ObjectMarshaler -} - -// ObjectValues constructs a field with the given key, holding a list of the -// provided objects, where pointers to these objects can be marshaled by Zap. -// -// Note that pointers to these objects must implement zapcore.ObjectMarshaler. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the *Request type, not the value (Request). -// If it's on the value, use Objects. -// -// Given an object that implements MarshalLogObject on the pointer receiver, -// you can log a slice of those objects with ObjectValues like so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -// -// If instead, you have a slice of pointers of such an object, use the Objects -// field constructor. -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { - return Array(key, objectValues[T, P](values)) -} - -type objectValues[T any, P ObjectMarshalerPtr[T]] []T - -func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for i := range os { - // It is necessary for us to explicitly reference the "P" type. - // We cannot simply pass "&os[i]" to AppendObject because its type - // is "*T", which the type system does not consider as - // implementing ObjectMarshaler. - // Only the type "P" satisfies ObjectMarshaler, which we have - // to convert "*T" to explicitly. - var p P = &os[i] - if err := arr.AppendObject(p); err != nil { - return err - } - } - return nil -} - -// Stringers constructs a field with the given key, holding a list of the -// output provided by the value's String method -// -// Given an object that implements String on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Request struct{ ... } -// func (a Request) String() string -// -// var requests []Request = ... -// logger.Info("sending requests", zap.Stringers("requests", requests)) -// -// Note that these objects must implement fmt.Stringer directly. -// That is, if you're trying to marshal a []Request, the String method -// must be declared on the Request type, not its pointer (*Request). -func Stringers[T fmt.Stringer](key string, values []T) Field { - return Array(key, stringers[T](values)) -} - -type stringers[T fmt.Stringer] []T - -func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - arr.AppendString(o.String()) - } - return nil -} diff --git a/tools/vendor/go.uber.org/zap/buffer/buffer.go b/tools/vendor/go.uber.org/zap/buffer/buffer.go index 9e929cd98..27fb5cd5d 100644 --- a/tools/vendor/go.uber.org/zap/buffer/buffer.go +++ b/tools/vendor/go.uber.org/zap/buffer/buffer.go @@ -42,6 +42,11 @@ func (b *Buffer) AppendByte(v byte) { b.bs = append(b.bs, v) } +// AppendBytes writes a single byte to the Buffer. +func (b *Buffer) AppendBytes(v []byte) { + b.bs = append(b.bs, v...) +} + // AppendString writes a string to the Buffer. func (b *Buffer) AppendString(s string) { b.bs = append(b.bs, s...) diff --git a/tools/vendor/go.uber.org/zap/buffer/pool.go b/tools/vendor/go.uber.org/zap/buffer/pool.go index 8fb3e202c..846323360 100644 --- a/tools/vendor/go.uber.org/zap/buffer/pool.go +++ b/tools/vendor/go.uber.org/zap/buffer/pool.go @@ -20,25 +20,29 @@ package buffer -import "sync" +import ( + "go.uber.org/zap/internal/pool" +) // A Pool is a type-safe wrapper around a sync.Pool. type Pool struct { - p *sync.Pool + p *pool.Pool[*Buffer] } // NewPool constructs a new Pool. func NewPool() Pool { - return Pool{p: &sync.Pool{ - New: func() interface{} { - return &Buffer{bs: make([]byte, 0, _size)} - }, - }} + return Pool{ + p: pool.New(func() *Buffer { + return &Buffer{ + bs: make([]byte, 0, _size), + } + }), + } } // Get retrieves a Buffer from the pool, creating one if necessary. func (p Pool) Get() *Buffer { - buf := p.p.Get().(*Buffer) + buf := p.p.Get() buf.Reset() buf.pool = p return buf diff --git a/tools/vendor/go.uber.org/zap/config.go b/tools/vendor/go.uber.org/zap/config.go index ee6096766..e76e4e64f 100644 --- a/tools/vendor/go.uber.org/zap/config.go +++ b/tools/vendor/go.uber.org/zap/config.go @@ -95,6 +95,32 @@ type Config struct { // NewProductionEncoderConfig returns an opinionated EncoderConfig for // production environments. +// +// Messages encoded with this configuration will be JSON-formatted +// and will have the following keys by default: +// +// - "level": The logging level (e.g. "info", "error"). +// - "ts": The current time in number of seconds since the Unix epoch. +// - "msg": The message passed to the log statement. +// - "caller": If available, a short path to the file and line number +// where the log statement was issued. +// The logger configuration determines whether this field is captured. +// - "stacktrace": If available, a stack trace from the line +// where the log statement was issued. +// The logger configuration determines whether this field is captured. +// +// By default, the following formats are used for different types: +// +// - Time is formatted as floating-point number of seconds since the Unix +// epoch. +// - Duration is formatted as floating-point number of seconds. +// +// You may change these by setting the appropriate fields in the returned +// object. +// For example, use the following to change the time encoding format: +// +// cfg := zap.NewProductionEncoderConfig() +// cfg.EncodeTime = zapcore.ISO8601TimeEncoder func NewProductionEncoderConfig() zapcore.EncoderConfig { return zapcore.EncoderConfig{ TimeKey: "ts", @@ -112,11 +138,22 @@ func NewProductionEncoderConfig() zapcore.EncoderConfig { } } -// NewProductionConfig is a reasonable production logging configuration. -// Logging is enabled at InfoLevel and above. +// NewProductionConfig builds a reasonable default production logging +// configuration. +// Logging is enabled at InfoLevel and above, and uses a JSON encoder. +// Logs are written to standard error. +// Stacktraces are included on logs of ErrorLevel and above. +// DPanicLevel logs will not panic, but will write a stacktrace. +// +// Sampling is enabled at 100:100 by default, +// meaning that after the first 100 log entries +// with the same level and message in the same second, +// it will log every 100th entry +// with the same level and message in the same second. +// You may disable this behavior by setting Sampling to nil. // -// It uses a JSON encoder, writes to standard error, and enables sampling. -// Stacktraces are automatically included on logs of ErrorLevel and above. +// See [NewProductionEncoderConfig] for information +// on the default encoder configuration. func NewProductionConfig() Config { return Config{ Level: NewAtomicLevelAt(InfoLevel), @@ -134,6 +171,32 @@ func NewProductionConfig() Config { // NewDevelopmentEncoderConfig returns an opinionated EncoderConfig for // development environments. +// +// Messages encoded with this configuration will use Zap's console encoder +// intended to print human-readable output. +// It will print log messages with the following information: +// +// - The log level (e.g. "INFO", "ERROR"). +// - The time in ISO8601 format (e.g. "2017-01-01T12:00:00Z"). +// - The message passed to the log statement. +// - If available, a short path to the file and line number +// where the log statement was issued. +// The logger configuration determines whether this field is captured. +// - If available, a stacktrace from the line +// where the log statement was issued. +// The logger configuration determines whether this field is captured. +// +// By default, the following formats are used for different types: +// +// - Time is formatted in ISO8601 format (e.g. "2017-01-01T12:00:00Z"). +// - Duration is formatted as a string (e.g. "1.234s"). +// +// You may change these by setting the appropriate fields in the returned +// object. +// For example, use the following to change the time encoding format: +// +// cfg := zap.NewDevelopmentEncoderConfig() +// cfg.EncodeTime = zapcore.ISO8601TimeEncoder func NewDevelopmentEncoderConfig() zapcore.EncoderConfig { return zapcore.EncoderConfig{ // Keys can be anything except the empty string. @@ -152,12 +215,15 @@ func NewDevelopmentEncoderConfig() zapcore.EncoderConfig { } } -// NewDevelopmentConfig is a reasonable development logging configuration. -// Logging is enabled at DebugLevel and above. +// NewDevelopmentConfig builds a reasonable default development logging +// configuration. +// Logging is enabled at DebugLevel and above, and uses a console encoder. +// Logs are written to standard error. +// Stacktraces are included on logs of WarnLevel and above. +// DPanicLevel logs will panic. // -// It enables development mode (which makes DPanicLevel logs panic), uses a -// console encoder, writes to standard error, and disables sampling. -// Stacktraces are automatically included on logs of WarnLevel and above. +// See [NewDevelopmentEncoderConfig] for information +// on the default encoder configuration. func NewDevelopmentConfig() Config { return Config{ Level: NewAtomicLevelAt(DebugLevel), diff --git a/tools/vendor/go.uber.org/zap/error.go b/tools/vendor/go.uber.org/zap/error.go index 65982a51e..45f7b838d 100644 --- a/tools/vendor/go.uber.org/zap/error.go +++ b/tools/vendor/go.uber.org/zap/error.go @@ -21,14 +21,13 @@ package zap import ( - "sync" - + "go.uber.org/zap/internal/pool" "go.uber.org/zap/zapcore" ) -var _errArrayElemPool = sync.Pool{New: func() interface{} { +var _errArrayElemPool = pool.New(func() *errArrayElem { return &errArrayElem{} -}} +}) // Error is shorthand for the common idiom NamedError("error", err). func Error(err error) Field { @@ -60,11 +59,14 @@ func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { // potentially an "errorVerbose" attribute, we need to wrap it in a // type that implements LogObjectMarshaler. To prevent this from // allocating, pool the wrapper type. - elem := _errArrayElemPool.Get().(*errArrayElem) + elem := _errArrayElemPool.Get() elem.error = errs[i] - arr.AppendObject(elem) + err := arr.AppendObject(elem) elem.error = nil _errArrayElemPool.Put(elem) + if err != nil { + return err + } } return nil } diff --git a/tools/vendor/go.uber.org/zap/field.go b/tools/vendor/go.uber.org/zap/field.go index bbb745db5..c8dd3358a 100644 --- a/tools/vendor/go.uber.org/zap/field.go +++ b/tools/vendor/go.uber.org/zap/field.go @@ -25,6 +25,7 @@ import ( "math" "time" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -374,7 +375,7 @@ func StackSkip(key string, skip int) Field { // from expanding the zapcore.Field union struct to include a byte slice. Since // taking a stacktrace is already so expensive (~10us), the extra allocation // is okay. - return String(key, takeStacktrace(skip+1)) // skip StackSkip + return String(key, stacktrace.Take(skip+1)) // skip StackSkip } // Duration constructs a field with the given key and value. The encoder @@ -410,6 +411,63 @@ func Inline(val zapcore.ObjectMarshaler) Field { } } +// Dict constructs a field containing the provided key-value pairs. +// It acts similar to [Object], but with the fields specified as arguments. +func Dict(key string, val ...Field) Field { + return dictField(key, val) +} + +// We need a function with the signature (string, T) for zap.Any. +func dictField(key string, val []Field) Field { + return Object(key, dictObject(val)) +} + +type dictObject []Field + +func (d dictObject) MarshalLogObject(enc zapcore.ObjectEncoder) error { + for _, f := range d { + f.AddTo(enc) + } + return nil +} + +// We discovered an issue where zap.Any can cause a performance degradation +// when used in new goroutines. +// +// This happens because the compiler assigns 4.8kb (one zap.Field per arm of +// switch statement) of stack space for zap.Any when it takes the form: +// +// switch v := v.(type) { +// case string: +// return String(key, v) +// case int: +// return Int(key, v) +// // ... +// default: +// return Reflect(key, v) +// } +// +// To avoid this, we use the type switch to assign a value to a single local variable +// and then call a function on it. +// The local variable is just a function reference so it doesn't allocate +// when converted to an interface{}. +// +// A fair bit of experimentation went into this. +// See also: +// +// - https://github.com/uber-go/zap/pull/1301 +// - https://github.com/uber-go/zap/pull/1303 +// - https://github.com/uber-go/zap/pull/1304 +// - https://github.com/uber-go/zap/pull/1305 +// - https://github.com/uber-go/zap/pull/1308 +type anyFieldC[T any] func(string, T) Field + +func (f anyFieldC[T]) Any(key string, val any) Field { + v, _ := val.(T) + // val is guaranteed to be a T, except when it's nil. + return f(key, v) +} + // Any takes a key and an arbitrary value and chooses the best way to represent // them as a field, falling back to a reflection-based approach only if // necessary. @@ -418,132 +476,138 @@ func Inline(val zapcore.ObjectMarshaler) Field { // them. To minimize surprises, []byte values are treated as binary blobs, byte // values are treated as uint8, and runes are always treated as integers. func Any(key string, value interface{}) Field { - switch val := value.(type) { + var c interface{ Any(string, any) Field } + + switch value.(type) { case zapcore.ObjectMarshaler: - return Object(key, val) + c = anyFieldC[zapcore.ObjectMarshaler](Object) case zapcore.ArrayMarshaler: - return Array(key, val) + c = anyFieldC[zapcore.ArrayMarshaler](Array) + case []Field: + c = anyFieldC[[]Field](dictField) case bool: - return Bool(key, val) + c = anyFieldC[bool](Bool) case *bool: - return Boolp(key, val) + c = anyFieldC[*bool](Boolp) case []bool: - return Bools(key, val) + c = anyFieldC[[]bool](Bools) case complex128: - return Complex128(key, val) + c = anyFieldC[complex128](Complex128) case *complex128: - return Complex128p(key, val) + c = anyFieldC[*complex128](Complex128p) case []complex128: - return Complex128s(key, val) + c = anyFieldC[[]complex128](Complex128s) case complex64: - return Complex64(key, val) + c = anyFieldC[complex64](Complex64) case *complex64: - return Complex64p(key, val) + c = anyFieldC[*complex64](Complex64p) case []complex64: - return Complex64s(key, val) + c = anyFieldC[[]complex64](Complex64s) case float64: - return Float64(key, val) + c = anyFieldC[float64](Float64) case *float64: - return Float64p(key, val) + c = anyFieldC[*float64](Float64p) case []float64: - return Float64s(key, val) + c = anyFieldC[[]float64](Float64s) case float32: - return Float32(key, val) + c = anyFieldC[float32](Float32) case *float32: - return Float32p(key, val) + c = anyFieldC[*float32](Float32p) case []float32: - return Float32s(key, val) + c = anyFieldC[[]float32](Float32s) case int: - return Int(key, val) + c = anyFieldC[int](Int) case *int: - return Intp(key, val) + c = anyFieldC[*int](Intp) case []int: - return Ints(key, val) + c = anyFieldC[[]int](Ints) case int64: - return Int64(key, val) + c = anyFieldC[int64](Int64) case *int64: - return Int64p(key, val) + c = anyFieldC[*int64](Int64p) case []int64: - return Int64s(key, val) + c = anyFieldC[[]int64](Int64s) case int32: - return Int32(key, val) + c = anyFieldC[int32](Int32) case *int32: - return Int32p(key, val) + c = anyFieldC[*int32](Int32p) case []int32: - return Int32s(key, val) + c = anyFieldC[[]int32](Int32s) case int16: - return Int16(key, val) + c = anyFieldC[int16](Int16) case *int16: - return Int16p(key, val) + c = anyFieldC[*int16](Int16p) case []int16: - return Int16s(key, val) + c = anyFieldC[[]int16](Int16s) case int8: - return Int8(key, val) + c = anyFieldC[int8](Int8) case *int8: - return Int8p(key, val) + c = anyFieldC[*int8](Int8p) case []int8: - return Int8s(key, val) + c = anyFieldC[[]int8](Int8s) case string: - return String(key, val) + c = anyFieldC[string](String) case *string: - return Stringp(key, val) + c = anyFieldC[*string](Stringp) case []string: - return Strings(key, val) + c = anyFieldC[[]string](Strings) case uint: - return Uint(key, val) + c = anyFieldC[uint](Uint) case *uint: - return Uintp(key, val) + c = anyFieldC[*uint](Uintp) case []uint: - return Uints(key, val) + c = anyFieldC[[]uint](Uints) case uint64: - return Uint64(key, val) + c = anyFieldC[uint64](Uint64) case *uint64: - return Uint64p(key, val) + c = anyFieldC[*uint64](Uint64p) case []uint64: - return Uint64s(key, val) + c = anyFieldC[[]uint64](Uint64s) case uint32: - return Uint32(key, val) + c = anyFieldC[uint32](Uint32) case *uint32: - return Uint32p(key, val) + c = anyFieldC[*uint32](Uint32p) case []uint32: - return Uint32s(key, val) + c = anyFieldC[[]uint32](Uint32s) case uint16: - return Uint16(key, val) + c = anyFieldC[uint16](Uint16) case *uint16: - return Uint16p(key, val) + c = anyFieldC[*uint16](Uint16p) case []uint16: - return Uint16s(key, val) + c = anyFieldC[[]uint16](Uint16s) case uint8: - return Uint8(key, val) + c = anyFieldC[uint8](Uint8) case *uint8: - return Uint8p(key, val) + c = anyFieldC[*uint8](Uint8p) case []byte: - return Binary(key, val) + c = anyFieldC[[]byte](Binary) case uintptr: - return Uintptr(key, val) + c = anyFieldC[uintptr](Uintptr) case *uintptr: - return Uintptrp(key, val) + c = anyFieldC[*uintptr](Uintptrp) case []uintptr: - return Uintptrs(key, val) + c = anyFieldC[[]uintptr](Uintptrs) case time.Time: - return Time(key, val) + c = anyFieldC[time.Time](Time) case *time.Time: - return Timep(key, val) + c = anyFieldC[*time.Time](Timep) case []time.Time: - return Times(key, val) + c = anyFieldC[[]time.Time](Times) case time.Duration: - return Duration(key, val) + c = anyFieldC[time.Duration](Duration) case *time.Duration: - return Durationp(key, val) + c = anyFieldC[*time.Duration](Durationp) case []time.Duration: - return Durations(key, val) + c = anyFieldC[[]time.Duration](Durations) case error: - return NamedError(key, val) + c = anyFieldC[error](NamedError) case []error: - return Errors(key, val) + c = anyFieldC[[]error](Errors) case fmt.Stringer: - return Stringer(key, val) + c = anyFieldC[fmt.Stringer](Stringer) default: - return Reflect(key, val) + c = anyFieldC[any](Reflect) } + + return c.Any(key, value) } diff --git a/tools/vendor/go.uber.org/zap/http_handler.go b/tools/vendor/go.uber.org/zap/http_handler.go index 632b6831a..2be8f6515 100644 --- a/tools/vendor/go.uber.org/zap/http_handler.go +++ b/tools/vendor/go.uber.org/zap/http_handler.go @@ -69,6 +69,13 @@ import ( // // curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if err := lvl.serveHTTP(w, r); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "internal error: %v", err) + } +} + +func (lvl AtomicLevel) serveHTTP(w http.ResponseWriter, r *http.Request) error { type errorResponse struct { Error string `json:"error"` } @@ -80,19 +87,20 @@ func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + case http.MethodPut: requestedLvl, err := decodePutRequest(r.Header.Get("Content-Type"), r) if err != nil { w.WriteHeader(http.StatusBadRequest) - enc.Encode(errorResponse{Error: err.Error()}) - return + return enc.Encode(errorResponse{Error: err.Error()}) } lvl.SetLevel(requestedLvl) - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + default: w.WriteHeader(http.StatusMethodNotAllowed) - enc.Encode(errorResponse{ + return enc.Encode(errorResponse{ Error: "Only GET and PUT are supported.", }) } @@ -129,5 +137,4 @@ func decodePutJSON(body io.Reader) (zapcore.Level, error) { return 0, errors.New("must specify logging level") } return *pld.Level, nil - } diff --git a/tools/vendor/go.uber.org/zap/internal/level_enabler.go b/tools/vendor/go.uber.org/zap/internal/level_enabler.go index 5f3e3f1b9..40bfed81e 100644 --- a/tools/vendor/go.uber.org/zap/internal/level_enabler.go +++ b/tools/vendor/go.uber.org/zap/internal/level_enabler.go @@ -18,6 +18,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +// Package internal and its subpackages hold types and functionality +// that are not part of Zap's public API. package internal import "go.uber.org/zap/zapcore" diff --git a/tools/vendor/go.uber.org/atomic/bool_ext.go b/tools/vendor/go.uber.org/zap/internal/pool/pool.go similarity index 56% rename from tools/vendor/go.uber.org/atomic/bool_ext.go rename to tools/vendor/go.uber.org/zap/internal/pool/pool.go index a2e60e987..60e9d2c43 100644 --- a/tools/vendor/go.uber.org/atomic/bool_ext.go +++ b/tools/vendor/go.uber.org/zap/internal/pool/pool.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,36 +18,41 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package atomic +// Package pool provides internal pool utilities. +package pool import ( - "strconv" + "sync" ) -//go:generate bin/gen-atomicwrapper -name=Bool -type=bool -wrapped=Uint32 -pack=boolToInt -unpack=truthy -cas -swap -json -file=bool.go - -func truthy(n uint32) bool { - return n == 1 +// A Pool is a generic wrapper around [sync.Pool] to provide strongly-typed +// object pooling. +// +// Note that SA6002 (ref: https://staticcheck.io/docs/checks/#SA6002) will +// not be detected, so all internal pool use must take care to only store +// pointer types. +type Pool[T any] struct { + pool sync.Pool } -func boolToInt(b bool) uint32 { - if b { - return 1 +// New returns a new [Pool] for T, and will use fn to construct new Ts when +// the pool is empty. +func New[T any](fn func() T) *Pool[T] { + return &Pool[T]{ + pool: sync.Pool{ + New: func() any { + return fn() + }, + }, } - return 0 } -// Toggle atomically negates the Boolean and returns the previous value. -func (b *Bool) Toggle() (old bool) { - for { - old := b.Load() - if b.CAS(old, !old) { - return old - } - } +// Get gets a T from the pool, or creates a new one if the pool is empty. +func (p *Pool[T]) Get() T { + return p.pool.Get().(T) } -// String encodes the wrapped value as a string. -func (b *Bool) String() string { - return strconv.FormatBool(b.Load()) +// Put returns x into the pool. +func (p *Pool[T]) Put(x T) { + p.pool.Put(x) } diff --git a/tools/vendor/go.uber.org/zap/stacktrace.go b/tools/vendor/go.uber.org/zap/internal/stacktrace/stack.go similarity index 73% rename from tools/vendor/go.uber.org/zap/stacktrace.go rename to tools/vendor/go.uber.org/zap/internal/stacktrace/stack.go index 817a3bde8..82af7551f 100644 --- a/tools/vendor/go.uber.org/zap/stacktrace.go +++ b/tools/vendor/go.uber.org/zap/internal/stacktrace/stack.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,25 +18,26 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package zap +// Package stacktrace provides support for gathering stack traces +// efficiently. +package stacktrace import ( "runtime" - "sync" "go.uber.org/zap/buffer" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/pool" ) -var _stacktracePool = sync.Pool{ - New: func() interface{} { - return &stacktrace{ - storage: make([]uintptr, 64), - } - }, -} +var _stackPool = pool.New(func() *Stack { + return &Stack{ + storage: make([]uintptr, 64), + } +}) -type stacktrace struct { +// Stack is a captured stack trace. +type Stack struct { pcs []uintptr // program counters; always a subslice of storage frames *runtime.Frames @@ -50,30 +51,30 @@ type stacktrace struct { storage []uintptr } -// stacktraceDepth specifies how deep of a stack trace should be captured. -type stacktraceDepth int +// Depth specifies how deep of a stack trace should be captured. +type Depth int const ( - // stacktraceFirst captures only the first frame. - stacktraceFirst stacktraceDepth = iota + // First captures only the first frame. + First Depth = iota - // stacktraceFull captures the entire call stack, allocating more + // Full captures the entire call stack, allocating more // storage for it if needed. - stacktraceFull + Full ) -// captureStacktrace captures a stack trace of the specified depth, skipping +// Capture captures a stack trace of the specified depth, skipping // the provided number of frames. skip=0 identifies the caller of -// captureStacktrace. +// Capture. // // The caller must call Free on the returned stacktrace after using it. -func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { - stack := _stacktracePool.Get().(*stacktrace) +func Capture(skip int, depth Depth) *Stack { + stack := _stackPool.Get() switch depth { - case stacktraceFirst: + case First: stack.pcs = stack.storage[:1] - case stacktraceFull: + case Full: stack.pcs = stack.storage } @@ -87,7 +88,7 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // runtime.Callers truncates the recorded stacktrace if there is no // room in the provided slice. For the full stack trace, keep expanding // storage until there are fewer frames than there is room. - if depth == stacktraceFull { + if depth == Full { pcs := stack.pcs for numFrames == len(pcs) { pcs = make([]uintptr, len(pcs)*2) @@ -109,50 +110,54 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // Free releases resources associated with this stacktrace // and returns it back to the pool. -func (st *stacktrace) Free() { +func (st *Stack) Free() { st.frames = nil st.pcs = nil - _stacktracePool.Put(st) + _stackPool.Put(st) } // Count reports the total number of frames in this stacktrace. // Count DOES NOT change as Next is called. -func (st *stacktrace) Count() int { +func (st *Stack) Count() int { return len(st.pcs) } // Next returns the next frame in the stack trace, // and a boolean indicating whether there are more after it. -func (st *stacktrace) Next() (_ runtime.Frame, more bool) { +func (st *Stack) Next() (_ runtime.Frame, more bool) { return st.frames.Next() } -func takeStacktrace(skip int) string { - stack := captureStacktrace(skip+1, stacktraceFull) +// Take returns a string representation of the current stacktrace. +// +// skip is the number of frames to skip before recording the stack trace. +// skip=0 identifies the caller of Take. +func Take(skip int) string { + stack := Capture(skip+1, Full) defer stack.Free() buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := NewFormatter(buffer) stackfmt.FormatStack(stack) return buffer.String() } -// stackFormatter formats a stack trace into a readable string representation. -type stackFormatter struct { +// Formatter formats a stack trace into a readable string representation. +type Formatter struct { b *buffer.Buffer nonEmpty bool // whehther we've written at least one frame already } -// newStackFormatter builds a new stackFormatter. -func newStackFormatter(b *buffer.Buffer) stackFormatter { - return stackFormatter{b: b} +// NewFormatter builds a new Formatter. +func NewFormatter(b *buffer.Buffer) Formatter { + return Formatter{b: b} } // FormatStack formats all remaining frames in the provided stacktrace -- minus // the final runtime.main/runtime.goexit frame. -func (sf *stackFormatter) FormatStack(stack *stacktrace) { +func (sf *Formatter) FormatStack(stack *Stack) { // Note: On the last iteration, frames.Next() returns false, with a valid // frame, but we ignore this frame. The last frame is a runtime frame which // adds noise, since it's only either runtime.main or runtime.goexit. @@ -162,7 +167,7 @@ func (sf *stackFormatter) FormatStack(stack *stacktrace) { } // FormatFrame formats the given frame. -func (sf *stackFormatter) FormatFrame(frame runtime.Frame) { +func (sf *Formatter) FormatFrame(frame runtime.Frame) { if sf.nonEmpty { sf.b.AppendByte('\n') } diff --git a/tools/vendor/go.uber.org/zap/level.go b/tools/vendor/go.uber.org/zap/level.go index db951e19a..155b208bd 100644 --- a/tools/vendor/go.uber.org/zap/level.go +++ b/tools/vendor/go.uber.org/zap/level.go @@ -21,7 +21,8 @@ package zap import ( - "go.uber.org/atomic" + "sync/atomic" + "go.uber.org/zap/internal" "go.uber.org/zap/zapcore" ) @@ -76,9 +77,9 @@ var _ internal.LeveledEnabler = AtomicLevel{} // NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging // enabled. func NewAtomicLevel() AtomicLevel { - return AtomicLevel{ - l: atomic.NewInt32(int32(InfoLevel)), - } + lvl := AtomicLevel{l: new(atomic.Int32)} + lvl.l.Store(int32(InfoLevel)) + return lvl } // NewAtomicLevelAt is a convenience function that creates an AtomicLevel diff --git a/tools/vendor/go.uber.org/zap/logger.go b/tools/vendor/go.uber.org/zap/logger.go index cd44030d1..6205fe48a 100644 --- a/tools/vendor/go.uber.org/zap/logger.go +++ b/tools/vendor/go.uber.org/zap/logger.go @@ -27,6 +27,7 @@ import ( "strings" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -173,7 +174,8 @@ func (log *Logger) WithOptions(opts ...Option) *Logger { } // With creates a child logger and adds structured context to it. Fields added -// to the child don't affect the parent, and vice versa. +// to the child don't affect the parent, and vice versa. Any fields that +// require evaluation (such as Objects) are evaluated upon invocation of With. func (log *Logger) With(fields ...Field) *Logger { if len(fields) == 0 { return log @@ -183,6 +185,28 @@ func (log *Logger) With(fields ...Field) *Logger { return l } +// WithLazy creates a child logger and adds structured context to it lazily. +// +// The fields are evaluated only if the logger is further chained with [With] +// or is written to with any of the log level methods. +// Until that occurs, the logger may retain references to objects inside the fields, +// and logging will reflect the state of an object at the time of logging, +// not the time of WithLazy(). +// +// WithLazy provides a worthwhile performance optimization for contextual loggers +// when the likelihood of using the child logger is low, +// such as error paths and rarely taken branches. +// +// Similar to [With], fields added to the child don't affect the parent, and vice versa. +func (log *Logger) WithLazy(fields ...Field) *Logger { + if len(fields) == 0 { + return log + } + return log.WithOptions(WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewLazyWith(core, fields) + })) +} + // Level reports the minimum enabled level for this logger. // // For NopLoggers, this is [zapcore.InvalidLevel]. @@ -199,6 +223,8 @@ func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Log logs a message at the specified level. The message includes any fields // passed at the log site, as well as any fields accumulated on the logger. +// Any Fields that require evaluation (such as Objects) are evaluated upon +// invocation of Log. func (log *Logger) Log(lvl zapcore.Level, msg string, fields ...Field) { if ce := log.check(lvl, msg); ce != nil { ce.Write(fields...) @@ -281,9 +307,15 @@ func (log *Logger) Core() zapcore.Core { return log.core } +// Name returns the Logger's underlying name, +// or an empty string if the logger is unnamed. +func (log *Logger) Name() string { + return log.name +} + func (log *Logger) clone() *Logger { - copy := *log - return © + clone := *log + return &clone } func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { @@ -354,17 +386,17 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Adding the caller or stack trace requires capturing the callers of // this function. We'll share information between these two. - stackDepth := stacktraceFirst + stackDepth := stacktrace.First if addStack { - stackDepth = stacktraceFull + stackDepth = stacktrace.Full } - stack := captureStacktrace(log.callerSkip+callerSkipOffset, stackDepth) + stack := stacktrace.Capture(log.callerSkip+callerSkipOffset, stackDepth) defer stack.Free() if stack.Count() == 0 { if log.addCaller { fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) - log.errorOutput.Sync() + _ = log.errorOutput.Sync() } return ce } @@ -385,7 +417,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := stacktrace.NewFormatter(buffer) // We've already extracted the first frame, so format that // separately and defer to stackfmt for the rest. diff --git a/tools/vendor/go.uber.org/zap/sink.go b/tools/vendor/go.uber.org/zap/sink.go index 478c9a10f..499772a00 100644 --- a/tools/vendor/go.uber.org/zap/sink.go +++ b/tools/vendor/go.uber.org/zap/sink.go @@ -66,7 +66,8 @@ func newSinkRegistry() *sinkRegistry { factories: make(map[string]func(*url.URL) (Sink, error)), openFile: os.OpenFile, } - sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) + // Infallible operation: the registry is empty, so we can't have a conflict. + _ = sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) return sr } @@ -154,7 +155,7 @@ func (sr *sinkRegistry) newFileSinkFromPath(path string) (Sink, error) { case "stderr": return nopCloserSink{os.Stderr}, nil } - return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) + return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o666) } func normalizeScheme(s string) (string, error) { diff --git a/tools/vendor/go.uber.org/zap/sugar.go b/tools/vendor/go.uber.org/zap/sugar.go index ac387b3e4..00ac5fe3a 100644 --- a/tools/vendor/go.uber.org/zap/sugar.go +++ b/tools/vendor/go.uber.org/zap/sugar.go @@ -122,74 +122,88 @@ func (s *SugaredLogger) Level() zapcore.Level { return zapcore.LevelOf(s.base.core) } -// Debug uses fmt.Sprint to construct and log a message. +// Debug logs the provided arguments at [DebugLevel]. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Debug(args ...interface{}) { s.log(DebugLevel, "", args, nil) } -// Info uses fmt.Sprint to construct and log a message. +// Info logs the provided arguments at [InfoLevel]. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Info(args ...interface{}) { s.log(InfoLevel, "", args, nil) } -// Warn uses fmt.Sprint to construct and log a message. +// Warn logs the provided arguments at [WarnLevel]. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Warn(args ...interface{}) { s.log(WarnLevel, "", args, nil) } -// Error uses fmt.Sprint to construct and log a message. +// Error logs the provided arguments at [ErrorLevel]. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Error(args ...interface{}) { s.log(ErrorLevel, "", args, nil) } -// DPanic uses fmt.Sprint to construct and log a message. In development, the -// logger then panics. (See DPanicLevel for details.) +// DPanic logs the provided arguments at [DPanicLevel]. +// In development, the logger then panics. (See [DPanicLevel] for details.) +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) DPanic(args ...interface{}) { s.log(DPanicLevel, "", args, nil) } -// Panic uses fmt.Sprint to construct and log a message, then panics. +// Panic constructs a message with the provided arguments and panics. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Panic(args ...interface{}) { s.log(PanicLevel, "", args, nil) } -// Fatal uses fmt.Sprint to construct and log a message, then calls os.Exit. +// Fatal constructs a message with the provided arguments and calls os.Exit. +// Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Fatal(args ...interface{}) { s.log(FatalLevel, "", args, nil) } -// Debugf uses fmt.Sprintf to log a templated message. +// Debugf formats the message according to the format specifier +// and logs it at [DebugLevel]. func (s *SugaredLogger) Debugf(template string, args ...interface{}) { s.log(DebugLevel, template, args, nil) } -// Infof uses fmt.Sprintf to log a templated message. +// Infof formats the message according to the format specifier +// and logs it at [InfoLevel]. func (s *SugaredLogger) Infof(template string, args ...interface{}) { s.log(InfoLevel, template, args, nil) } -// Warnf uses fmt.Sprintf to log a templated message. +// Warnf formats the message according to the format specifier +// and logs it at [WarnLevel]. func (s *SugaredLogger) Warnf(template string, args ...interface{}) { s.log(WarnLevel, template, args, nil) } -// Errorf uses fmt.Sprintf to log a templated message. +// Errorf formats the message according to the format specifier +// and logs it at [ErrorLevel]. func (s *SugaredLogger) Errorf(template string, args ...interface{}) { s.log(ErrorLevel, template, args, nil) } -// DPanicf uses fmt.Sprintf to log a templated message. In development, the -// logger then panics. (See DPanicLevel for details.) +// DPanicf formats the message according to the format specifier +// and logs it at [DPanicLevel]. +// In development, the logger then panics. (See [DPanicLevel] for details.) func (s *SugaredLogger) DPanicf(template string, args ...interface{}) { s.log(DPanicLevel, template, args, nil) } -// Panicf uses fmt.Sprintf to log a templated message, then panics. +// Panicf formats the message according to the format specifier +// and panics. func (s *SugaredLogger) Panicf(template string, args ...interface{}) { s.log(PanicLevel, template, args, nil) } -// Fatalf uses fmt.Sprintf to log a templated message, then calls os.Exit. +// Fatalf formats the message according to the format specifier +// and calls os.Exit. func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { s.log(FatalLevel, template, args, nil) } @@ -241,38 +255,45 @@ func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { s.log(FatalLevel, msg, nil, keysAndValues) } -// Debugln uses fmt.Sprintln to construct and log a message. +// Debugln logs a message at [DebugLevel]. +// Spaces are always added between arguments. func (s *SugaredLogger) Debugln(args ...interface{}) { s.logln(DebugLevel, args, nil) } -// Infoln uses fmt.Sprintln to construct and log a message. +// Infoln logs a message at [InfoLevel]. +// Spaces are always added between arguments. func (s *SugaredLogger) Infoln(args ...interface{}) { s.logln(InfoLevel, args, nil) } -// Warnln uses fmt.Sprintln to construct and log a message. +// Warnln logs a message at [WarnLevel]. +// Spaces are always added between arguments. func (s *SugaredLogger) Warnln(args ...interface{}) { s.logln(WarnLevel, args, nil) } -// Errorln uses fmt.Sprintln to construct and log a message. +// Errorln logs a message at [ErrorLevel]. +// Spaces are always added between arguments. func (s *SugaredLogger) Errorln(args ...interface{}) { s.logln(ErrorLevel, args, nil) } -// DPanicln uses fmt.Sprintln to construct and log a message. In development, the -// logger then panics. (See DPanicLevel for details.) +// DPanicln logs a message at [DPanicLevel]. +// In development, the logger then panics. (See [DPanicLevel] for details.) +// Spaces are always added between arguments. func (s *SugaredLogger) DPanicln(args ...interface{}) { s.logln(DPanicLevel, args, nil) } -// Panicln uses fmt.Sprintln to construct and log a message, then panics. +// Panicln logs a message at [PanicLevel] and panics. +// Spaces are always added between arguments. func (s *SugaredLogger) Panicln(args ...interface{}) { s.logln(PanicLevel, args, nil) } -// Fatalln uses fmt.Sprintln to construct and log a message, then calls os.Exit. +// Fatalln logs a message at [FatalLevel] and calls os.Exit. +// Spaces are always added between arguments. func (s *SugaredLogger) Fatalln(args ...interface{}) { s.logln(FatalLevel, args, nil) } diff --git a/tools/vendor/go.uber.org/zap/writer.go b/tools/vendor/go.uber.org/zap/writer.go index f08728e1e..06768c679 100644 --- a/tools/vendor/go.uber.org/zap/writer.go +++ b/tools/vendor/go.uber.org/zap/writer.go @@ -48,21 +48,21 @@ import ( // os.Stdout and os.Stderr. When specified without a scheme, relative file // paths also work. func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { - writers, close, err := open(paths) + writers, closeAll, err := open(paths) if err != nil { return nil, nil, err } writer := CombineWriteSyncers(writers...) - return writer, close, nil + return writer, closeAll, nil } func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { writers := make([]zapcore.WriteSyncer, 0, len(paths)) closers := make([]io.Closer, 0, len(paths)) - close := func() { + closeAll := func() { for _, c := range closers { - c.Close() + _ = c.Close() } } @@ -77,11 +77,11 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { closers = append(closers, sink) } if openErr != nil { - close() + closeAll() return nil, nil, openErr } - return writers, close, nil + return writers, closeAll, nil } // CombineWriteSyncers is a utility that combines multiple WriteSyncers into a diff --git a/tools/vendor/go.uber.org/zap/zapcore/console_encoder.go b/tools/vendor/go.uber.org/zap/zapcore/console_encoder.go index 1aa5dc364..8ca0bfaf5 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/console_encoder.go +++ b/tools/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -22,20 +22,20 @@ package zapcore import ( "fmt" - "sync" "go.uber.org/zap/buffer" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/pool" ) -var _sliceEncoderPool = sync.Pool{ - New: func() interface{} { - return &sliceArrayEncoder{elems: make([]interface{}, 0, 2)} - }, -} +var _sliceEncoderPool = pool.New(func() *sliceArrayEncoder { + return &sliceArrayEncoder{ + elems: make([]interface{}, 0, 2), + } +}) func getSliceEncoder() *sliceArrayEncoder { - return _sliceEncoderPool.Get().(*sliceArrayEncoder) + return _sliceEncoderPool.Get() } func putSliceEncoder(e *sliceArrayEncoder) { diff --git a/tools/vendor/go.uber.org/zap/zapcore/core.go b/tools/vendor/go.uber.org/zap/zapcore/core.go index 9dfd64051..776e93f6f 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/core.go +++ b/tools/vendor/go.uber.org/zap/zapcore/core.go @@ -102,9 +102,9 @@ func (c *ioCore) Write(ent Entry, fields []Field) error { return err } if ent.Level > ErrorLevel { - // Since we may be crashing the program, sync the output. Ignore Sync - // errors, pending a clean solution to issue #370. - c.Sync() + // Since we may be crashing the program, sync the output. + // Ignore Sync errors, pending a clean solution to issue #370. + _ = c.Sync() } return nil } diff --git a/tools/vendor/go.uber.org/zap/zapcore/entry.go b/tools/vendor/go.uber.org/zap/zapcore/entry.go index 9d326e95e..459a5d7ce 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/entry.go +++ b/tools/vendor/go.uber.org/zap/zapcore/entry.go @@ -24,25 +24,23 @@ import ( "fmt" "runtime" "strings" - "sync" "time" "go.uber.org/multierr" "go.uber.org/zap/internal/bufferpool" "go.uber.org/zap/internal/exit" + "go.uber.org/zap/internal/pool" ) -var ( - _cePool = sync.Pool{New: func() interface{} { - // Pre-allocate some space for cores. - return &CheckedEntry{ - cores: make([]Core, 4), - } - }} -) +var _cePool = pool.New(func() *CheckedEntry { + // Pre-allocate some space for cores. + return &CheckedEntry{ + cores: make([]Core, 4), + } +}) func getCheckedEntry() *CheckedEntry { - ce := _cePool.Get().(*CheckedEntry) + ce := _cePool.Get() ce.reset() return ce } @@ -244,7 +242,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { // CheckedEntry is being used after it was returned to the pool, // the message may be an amalgamation from multiple call sites. fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", ce.Time, ce.Entry) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } return } @@ -256,7 +254,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { } if err != nil && ce.ErrorOutput != nil { fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", ce.Time, err) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } hook := ce.after diff --git a/tools/vendor/go.uber.org/zap/zapcore/error.go b/tools/vendor/go.uber.org/zap/zapcore/error.go index 06359907a..c40df1326 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/error.go +++ b/tools/vendor/go.uber.org/zap/zapcore/error.go @@ -23,7 +23,8 @@ package zapcore import ( "fmt" "reflect" - "sync" + + "go.uber.org/zap/internal/pool" ) // Encodes the given error into fields of an object. A field with the given @@ -97,15 +98,18 @@ func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { } el := newErrArrayElem(errs[i]) - arr.AppendObject(el) + err := arr.AppendObject(el) el.Free() + if err != nil { + return err + } } return nil } -var _errArrayElemPool = sync.Pool{New: func() interface{} { +var _errArrayElemPool = pool.New(func() *errArrayElem { return &errArrayElem{} -}} +}) // Encodes any error into a {"error": ...} re-using the same errors logic. // @@ -113,7 +117,7 @@ var _errArrayElemPool = sync.Pool{New: func() interface{} { type errArrayElem struct{ err error } func newErrArrayElem(err error) *errArrayElem { - e := _errArrayElemPool.Get().(*errArrayElem) + e := _errArrayElemPool.Get() e.err = err return e } diff --git a/tools/vendor/go.uber.org/zap/zapcore/json_encoder.go b/tools/vendor/go.uber.org/zap/zapcore/json_encoder.go index 3921c5cd3..c8ab86979 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/tools/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -23,24 +23,20 @@ package zapcore import ( "encoding/base64" "math" - "sync" "time" "unicode/utf8" "go.uber.org/zap/buffer" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/pool" ) // For JSON-escaping; see jsonEncoder.safeAddString below. const _hex = "0123456789abcdef" -var _jsonPool = sync.Pool{New: func() interface{} { +var _jsonPool = pool.New(func() *jsonEncoder { return &jsonEncoder{} -}} - -func getJSONEncoder() *jsonEncoder { - return _jsonPool.Get().(*jsonEncoder) -} +}) func putJSONEncoder(enc *jsonEncoder) { if enc.reflectBuf != nil { @@ -354,7 +350,7 @@ func (enc *jsonEncoder) Clone() Encoder { } func (enc *jsonEncoder) clone() *jsonEncoder { - clone := getJSONEncoder() + clone := _jsonPool.Get() clone.EncoderConfig = enc.EncoderConfig clone.spaced = enc.spaced clone.openNamespaces = enc.openNamespaces @@ -490,73 +486,98 @@ func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { // Unlike the standard library's encoder, it doesn't attempt to protect the // user from browser vulnerabilities or JSONP-related problems. func (enc *jsonEncoder) safeAddString(s string) { - for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { - i++ - continue - } - r, size := utf8.DecodeRuneInString(s[i:]) - if enc.tryAddRuneError(r, size) { - i++ - continue - } - enc.buf.AppendString(s[i : i+size]) - i += size - } + safeAppendStringLike( + (*buffer.Buffer).AppendString, + utf8.DecodeRuneInString, + enc.buf, + s, + ) } // safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. func (enc *jsonEncoder) safeAddByteString(s []byte) { + safeAppendStringLike( + (*buffer.Buffer).AppendBytes, + utf8.DecodeRune, + enc.buf, + s, + ) +} + +// safeAppendStringLike is a generic implementation of safeAddString and safeAddByteString. +// It appends a string or byte slice to the buffer, escaping all special characters. +func safeAppendStringLike[S []byte | string]( + // appendTo appends this string-like object to the buffer. + appendTo func(*buffer.Buffer, S), + // decodeRune decodes the next rune from the string-like object + // and returns its value and width in bytes. + decodeRune func(S) (rune, int), + buf *buffer.Buffer, + s S, +) { + // The encoding logic below works by skipping over characters + // that can be safely copied as-is, + // until a character is found that needs special handling. + // At that point, we copy everything we've seen so far, + // and then handle that special character. + // + // last is the index of the last byte that was copied to the buffer. + last := 0 for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { + if s[i] >= utf8.RuneSelf { + // Character >= RuneSelf may be part of a multi-byte rune. + // They need to be decoded before we can decide how to handle them. + r, size := decodeRune(s[i:]) + if r != utf8.RuneError || size != 1 { + // No special handling required. + // Skip over this rune and continue. + i += size + continue + } + + // Invalid UTF-8 sequence. + // Replace it with the Unicode replacement character. + appendTo(buf, s[last:i]) + buf.AppendString(`\ufffd`) + i++ - continue - } - r, size := utf8.DecodeRune(s[i:]) - if enc.tryAddRuneError(r, size) { + last = i + } else { + // Character < RuneSelf is a single-byte UTF-8 rune. + if s[i] >= 0x20 && s[i] != '\\' && s[i] != '"' { + // No escaping necessary. + // Skip over this character and continue. + i++ + continue + } + + // This character needs to be escaped. + appendTo(buf, s[last:i]) + switch s[i] { + case '\\', '"': + buf.AppendByte('\\') + buf.AppendByte(s[i]) + case '\n': + buf.AppendByte('\\') + buf.AppendByte('n') + case '\r': + buf.AppendByte('\\') + buf.AppendByte('r') + case '\t': + buf.AppendByte('\\') + buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + buf.AppendString(`\u00`) + buf.AppendByte(_hex[s[i]>>4]) + buf.AppendByte(_hex[s[i]&0xF]) + } + i++ - continue + last = i } - enc.buf.Write(s[i : i+size]) - i += size - } -} - -// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. -func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { - if b >= utf8.RuneSelf { - return false - } - if 0x20 <= b && b != '\\' && b != '"' { - enc.buf.AppendByte(b) - return true - } - switch b { - case '\\', '"': - enc.buf.AppendByte('\\') - enc.buf.AppendByte(b) - case '\n': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('n') - case '\r': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('r') - case '\t': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('t') - default: - // Encode bytes < 0x20, except for the escape sequences above. - enc.buf.AppendString(`\u00`) - enc.buf.AppendByte(_hex[b>>4]) - enc.buf.AppendByte(_hex[b&0xF]) } - return true -} -func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { - if r == utf8.RuneError && size == 1 { - enc.buf.AppendString(`\ufffd`) - return true - } - return false + // add remaining + appendTo(buf, s[last:]) } diff --git a/tools/vendor/go.uber.org/atomic/time.go b/tools/vendor/go.uber.org/zap/zapcore/lazy_with.go similarity index 60% rename from tools/vendor/go.uber.org/atomic/time.go rename to tools/vendor/go.uber.org/zap/zapcore/lazy_with.go index 1660feb14..05288d6a8 100644 --- a/tools/vendor/go.uber.org/atomic/time.go +++ b/tools/vendor/go.uber.org/zap/zapcore/lazy_with.go @@ -1,6 +1,4 @@ -// @generated Code generated by gen-atomicwrapper. - -// Copyright (c) 2020-2022 Uber Technologies, Inc. +// Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,36 +18,37 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package atomic - -import ( - "time" -) +package zapcore -// Time is an atomic type-safe wrapper for time.Time values. -type Time struct { - _ nocmp // disallow non-atomic comparison +import "sync" - v Value +type lazyWithCore struct { + Core + sync.Once + fields []Field } -var _zeroTime time.Time - -// NewTime creates a new Time. -func NewTime(val time.Time) *Time { - x := &Time{} - if val != _zeroTime { - x.Store(val) +// NewLazyWith wraps a Core with a "lazy" Core that will only encode fields if +// the logger is written to (or is further chained in a lon-lazy manner). +func NewLazyWith(core Core, fields []Field) Core { + return &lazyWithCore{ + Core: core, + fields: fields, } - return x } -// Load atomically loads the wrapped time.Time. -func (x *Time) Load() time.Time { - return unpackTime(x.v.Load()) +func (d *lazyWithCore) initOnce() { + d.Once.Do(func() { + d.Core = d.Core.With(d.fields) + }) +} + +func (d *lazyWithCore) With(fields []Field) Core { + d.initOnce() + return d.Core.With(fields) } -// Store atomically stores the passed time.Time. -func (x *Time) Store(val time.Time) { - x.v.Store(packTime(val)) +func (d *lazyWithCore) Check(e Entry, ce *CheckedEntry) *CheckedEntry { + d.initOnce() + return d.Core.Check(e, ce) } diff --git a/tools/vendor/go.uber.org/zap/zapcore/sampler.go b/tools/vendor/go.uber.org/zap/zapcore/sampler.go index dc518055a..b7c093a4f 100644 --- a/tools/vendor/go.uber.org/zap/zapcore/sampler.go +++ b/tools/vendor/go.uber.org/zap/zapcore/sampler.go @@ -21,9 +21,8 @@ package zapcore import ( + "sync/atomic" "time" - - "go.uber.org/atomic" ) const ( @@ -66,16 +65,16 @@ func (c *counter) IncCheckReset(t time.Time, tick time.Duration) uint64 { tn := t.UnixNano() resetAfter := c.resetAt.Load() if resetAfter > tn { - return c.counter.Inc() + return c.counter.Add(1) } c.counter.Store(1) newResetAfter := tn + tick.Nanoseconds() - if !c.resetAt.CAS(resetAfter, newResetAfter) { + if !c.resetAt.CompareAndSwap(resetAfter, newResetAfter) { // We raced with another goroutine trying to reset, and it also reset // the counter to 1, so we need to reincrement the counter. - return c.counter.Inc() + return c.counter.Add(1) } return 1 diff --git a/tools/vendor/golang.org/x/crypto/bcrypt/bcrypt.go b/tools/vendor/golang.org/x/crypto/bcrypt/bcrypt.go index aeb73f81a..5577c0f93 100644 --- a/tools/vendor/golang.org/x/crypto/bcrypt/bcrypt.go +++ b/tools/vendor/golang.org/x/crypto/bcrypt/bcrypt.go @@ -50,7 +50,7 @@ func (ih InvalidHashPrefixError) Error() string { type InvalidCostError int func (ic InvalidCostError) Error() string { - return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), int(MinCost), int(MaxCost)) + return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), MinCost, MaxCost) } const ( @@ -82,11 +82,20 @@ type hashed struct { minor byte } +// ErrPasswordTooLong is returned when the password passed to +// GenerateFromPassword is too long (i.e. > 72 bytes). +var ErrPasswordTooLong = errors.New("bcrypt: password length exceeds 72 bytes") + // GenerateFromPassword returns the bcrypt hash of the password at the given // cost. If the cost given is less than MinCost, the cost will be set to // DefaultCost, instead. Use CompareHashAndPassword, as defined in this package, // to compare the returned hashed password with its cleartext version. +// GenerateFromPassword does not accept passwords longer than 72 bytes, which +// is the longest password bcrypt will operate on. func GenerateFromPassword(password []byte, cost int) ([]byte, error) { + if len(password) > 72 { + return nil, ErrPasswordTooLong + } p, err := newFromPassword(password, cost) if err != nil { return nil, err diff --git a/tools/vendor/golang.org/x/crypto/cast5/cast5.go b/tools/vendor/golang.org/x/crypto/cast5/cast5.go index ddcbeb6f2..425e8eecb 100644 --- a/tools/vendor/golang.org/x/crypto/cast5/cast5.go +++ b/tools/vendor/golang.org/x/crypto/cast5/cast5.go @@ -13,7 +13,10 @@ // golang.org/x/crypto/chacha20poly1305). package cast5 // import "golang.org/x/crypto/cast5" -import "errors" +import ( + "errors" + "math/bits" +) const BlockSize = 8 const KeySize = 16 @@ -241,19 +244,19 @@ func (c *Cipher) keySchedule(in []byte) { // These are the three 'f' functions. See RFC 2144, section 2.2. func f1(d, m uint32, r uint8) uint32 { t := m + d - I := (t << r) | (t >> (32 - r)) + I := bits.RotateLeft32(t, int(r)) return ((sBox[0][I>>24] ^ sBox[1][(I>>16)&0xff]) - sBox[2][(I>>8)&0xff]) + sBox[3][I&0xff] } func f2(d, m uint32, r uint8) uint32 { t := m ^ d - I := (t << r) | (t >> (32 - r)) + I := bits.RotateLeft32(t, int(r)) return ((sBox[0][I>>24] - sBox[1][(I>>16)&0xff]) + sBox[2][(I>>8)&0xff]) ^ sBox[3][I&0xff] } func f3(d, m uint32, r uint8) uint32 { t := m - d - I := (t << r) | (t >> (32 - r)) + I := bits.RotateLeft32(t, int(r)) return ((sBox[0][I>>24] + sBox[1][(I>>16)&0xff]) ^ sBox[2][(I>>8)&0xff]) - sBox[3][I&0xff] } diff --git a/tools/vendor/golang.org/x/crypto/openpgp/armor/armor.go b/tools/vendor/golang.org/x/crypto/openpgp/armor/armor.go index be342ad47..8907183ec 100644 --- a/tools/vendor/golang.org/x/crypto/openpgp/armor/armor.go +++ b/tools/vendor/golang.org/x/crypto/openpgp/armor/armor.go @@ -156,7 +156,7 @@ func (r *openpgpReader) Read(p []byte) (n int, err error) { n, err = r.b64Reader.Read(p) r.currentCRC = crc24(r.currentCRC, p[:n]) - if err == io.EOF && r.lReader.crcSet && r.lReader.crc != uint32(r.currentCRC&crc24Mask) { + if err == io.EOF && r.lReader.crcSet && r.lReader.crc != r.currentCRC&crc24Mask { return 0, ArmorCorrupt } diff --git a/tools/vendor/golang.org/x/crypto/openpgp/keys.go b/tools/vendor/golang.org/x/crypto/openpgp/keys.go index faa2fb369..d62f787e9 100644 --- a/tools/vendor/golang.org/x/crypto/openpgp/keys.go +++ b/tools/vendor/golang.org/x/crypto/openpgp/keys.go @@ -61,7 +61,7 @@ type Key struct { type KeyRing interface { // KeysById returns the set of keys that have the given key id. KeysById(id uint64) []Key - // KeysByIdAndUsage returns the set of keys with the given id + // KeysByIdUsage returns the set of keys with the given id // that also meet the key usage given by requiredUsage. // The requiredUsage is expressed as the bitwise-OR of // packet.KeyFlag* values. @@ -183,7 +183,7 @@ func (el EntityList) KeysById(id uint64) (keys []Key) { return } -// KeysByIdAndUsage returns the set of keys with the given id that also meet +// KeysByIdUsage returns the set of keys with the given id that also meet // the key usage given by requiredUsage. The requiredUsage is expressed as // the bitwise-OR of packet.KeyFlag* values. func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { diff --git a/tools/vendor/golang.org/x/crypto/openpgp/packet/compressed.go b/tools/vendor/golang.org/x/crypto/openpgp/packet/compressed.go index e8f0b5caa..353f94524 100644 --- a/tools/vendor/golang.org/x/crypto/openpgp/packet/compressed.go +++ b/tools/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/tools/vendor/golang.org/x/exp/LICENSE b/tools/vendor/golang.org/x/exp/LICENSE new file mode 100644 index 000000000..6a66aea5e --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/exp/PATENTS b/tools/vendor/golang.org/x/exp/PATENTS new file mode 100644 index 000000000..733099041 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/exp/constraints/constraints.go b/tools/vendor/golang.org/x/exp/constraints/constraints.go new file mode 100644 index 000000000..2c033dff4 --- /dev/null +++ b/tools/vendor/golang.org/x/exp/constraints/constraints.go @@ -0,0 +1,50 @@ +// 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 constraints defines a set of useful constraints to be used +// with type parameters. +package constraints + +// Signed is a constraint that permits any signed integer type. +// If future releases of Go add new predeclared signed integer types, +// this constraint will be modified to include them. +type Signed interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 +} + +// Unsigned is a constraint that permits any unsigned integer type. +// If future releases of Go add new predeclared unsigned integer types, +// this constraint will be modified to include them. +type Unsigned interface { + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr +} + +// Integer is a constraint that permits any integer type. +// If future releases of Go add new predeclared integer types, +// this constraint will be modified to include them. +type Integer interface { + Signed | Unsigned +} + +// Float is a constraint that permits any floating-point type. +// If future releases of Go add new predeclared floating-point types, +// this constraint will be modified to include them. +type Float interface { + ~float32 | ~float64 +} + +// Complex is a constraint that permits any complex numeric type. +// If future releases of Go add new predeclared complex numeric types, +// this constraint will be modified to include them. +type Complex interface { + ~complex64 | ~complex128 +} + +// Ordered is a constraint that permits any ordered type: any type +// that supports the operators < <= >= >. +// If future releases of Go add new ordered types, +// this constraint will be modified to include them. +type Ordered interface { + Integer | Float | ~string +} diff --git a/tools/vendor/golang.org/x/exp/slices/cmp.go b/tools/vendor/golang.org/x/exp/slices/cmp.go new file mode 100644 index 000000000..fbf1934a0 --- /dev/null +++ b/tools/vendor/golang.org/x/exp/slices/cmp.go @@ -0,0 +1,44 @@ +// 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 slices + +import "golang.org/x/exp/constraints" + +// min is a version of the predeclared function from the Go 1.21 release. +func min[T constraints.Ordered](a, b T) T { + if a < b || isNaN(a) { + return a + } + return b +} + +// max is a version of the predeclared function from the Go 1.21 release. +func max[T constraints.Ordered](a, b T) T { + if a > b || isNaN(a) { + return a + } + return b +} + +// cmpLess is a copy of cmp.Less from the Go 1.21 release. +func cmpLess[T constraints.Ordered](x, y T) bool { + return (isNaN(x) && !isNaN(y)) || x < y +} + +// cmpCompare is a copy of cmp.Compare from the Go 1.21 release. +func cmpCompare[T constraints.Ordered](x, y T) int { + xNaN := isNaN(x) + yNaN := isNaN(y) + if xNaN && yNaN { + return 0 + } + if xNaN || x < y { + return -1 + } + if yNaN || x > y { + return +1 + } + return 0 +} diff --git a/tools/vendor/golang.org/x/exp/slices/slices.go b/tools/vendor/golang.org/x/exp/slices/slices.go new file mode 100644 index 000000000..5e8158bba --- /dev/null +++ b/tools/vendor/golang.org/x/exp/slices/slices.go @@ -0,0 +1,499 @@ +// 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 slices defines various functions useful with slices of any type. +package slices + +import ( + "unsafe" + + "golang.org/x/exp/constraints" +) + +// Equal reports whether two slices are equal: the same length and all +// elements equal. If the lengths are different, Equal returns false. +// Otherwise, the elements are compared in increasing index order, and the +// comparison stops at the first unequal pair. +// Floating point NaNs are not considered equal. +func Equal[S ~[]E, E comparable](s1, s2 S) bool { + if len(s1) != len(s2) { + return false + } + for i := range s1 { + if s1[i] != s2[i] { + return false + } + } + return true +} + +// EqualFunc reports whether two slices are equal using an equality +// function on each pair of elements. If the lengths are different, +// EqualFunc returns false. Otherwise, the elements are compared in +// increasing index order, and the comparison stops at the first index +// for which eq returns false. +func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool { + if len(s1) != len(s2) { + return false + } + for i, v1 := range s1 { + v2 := s2[i] + if !eq(v1, v2) { + return false + } + } + return true +} + +// Compare compares the elements of s1 and s2, using [cmp.Compare] on each pair +// of elements. The elements are compared sequentially, starting at index 0, +// until one element is not equal to the other. +// The result of comparing the first non-matching elements is returned. +// If both slices are equal until one of them ends, the shorter slice is +// considered less than the longer one. +// The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. +func Compare[S ~[]E, E constraints.Ordered](s1, s2 S) int { + for i, v1 := range s1 { + if i >= len(s2) { + return +1 + } + v2 := s2[i] + if c := cmpCompare(v1, v2); c != 0 { + return c + } + } + if len(s1) < len(s2) { + return -1 + } + return 0 +} + +// CompareFunc is like [Compare] but uses a custom comparison function on each +// pair of elements. +// The result is the first non-zero result of cmp; if cmp always +// returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2), +// and +1 if len(s1) > len(s2). +func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int { + for i, v1 := range s1 { + if i >= len(s2) { + return +1 + } + v2 := s2[i] + if c := cmp(v1, v2); c != 0 { + return c + } + } + if len(s1) < len(s2) { + return -1 + } + return 0 +} + +// Index returns the index of the first occurrence of v in s, +// or -1 if not present. +func Index[S ~[]E, E comparable](s S, v E) int { + for i := range s { + if v == s[i] { + return i + } + } + return -1 +} + +// IndexFunc returns the first index i satisfying f(s[i]), +// or -1 if none do. +func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int { + for i := range s { + if f(s[i]) { + return i + } + } + return -1 +} + +// Contains reports whether v is present in s. +func Contains[S ~[]E, E comparable](s S, v E) bool { + return Index(s, v) >= 0 +} + +// ContainsFunc reports whether at least one +// element e of s satisfies f(e). +func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool { + return IndexFunc(s, f) >= 0 +} + +// Insert inserts the values v... into s at index i, +// returning the modified slice. +// The elements at s[i:] are shifted up to make room. +// In the returned slice r, r[i] == v[0], +// and r[i+len(v)] == value originally at r[i]. +// Insert panics if i is out of range. +// This function is O(len(s) + len(v)). +func Insert[S ~[]E, E any](s S, i int, v ...E) S { + m := len(v) + if m == 0 { + return s + } + n := len(s) + if i == n { + return append(s, v...) + } + if n+m > cap(s) { + // Use append rather than make so that we bump the size of + // the slice up to the next storage class. + // This is what Grow does but we don't call Grow because + // that might copy the values twice. + s2 := append(s[:i], make(S, n+m-i)...) + copy(s2[i:], v) + copy(s2[i+m:], s[i:]) + return s2 + } + s = s[:n+m] + + // before: + // s: aaaaaaaabbbbccccccccdddd + // ^ ^ ^ ^ + // i i+m n n+m + // after: + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // + // a are the values that don't move in s. + // v are the values copied in from v. + // b and c are the values from s that are shifted up in index. + // d are the values that get overwritten, never to be seen again. + + if !overlaps(v, s[i+m:]) { + // Easy case - v does not overlap either the c or d regions. + // (It might be in some of a or b, or elsewhere entirely.) + // The data we copy up doesn't write to v at all, so just do it. + + copy(s[i+m:], s[i:]) + + // Now we have + // s: aaaaaaaabbbbbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // Note the b values are duplicated. + + copy(s[i:], v) + + // Now we have + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // That's the result we want. + return s + } + + // The hard case - v overlaps c or d. We can't just shift up + // the data because we'd move or clobber the values we're trying + // to insert. + // So instead, write v on top of d, then rotate. + copy(s[n:], v) + + // Now we have + // s: aaaaaaaabbbbccccccccvvvv + // ^ ^ ^ ^ + // i i+m n n+m + + rotateRight(s[i:], m) + + // Now we have + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // That's the result we want. + return s +} + +// Delete removes the elements s[i:j] from s, returning the modified slice. +// Delete panics if s[i:j] is not a valid slice of s. +// Delete is O(len(s)-j), so if many items must be deleted, it is better to +// make a single call deleting them all together than to delete one at a time. +// Delete might not modify the elements s[len(s)-(j-i):len(s)]. If those +// elements contain pointers you might consider zeroing those elements so that +// objects they reference can be garbage collected. +func Delete[S ~[]E, E any](s S, i, j int) S { + _ = s[i:j] // bounds check + + return append(s[:i], s[j:]...) +} + +// DeleteFunc removes any elements from s for which del returns true, +// returning the modified slice. +// When DeleteFunc removes m elements, it might not modify the elements +// s[len(s)-m:len(s)]. If those elements contain pointers you might consider +// zeroing those elements so that objects they reference can be garbage +// collected. +func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S { + i := IndexFunc(s, del) + if i == -1 { + return s + } + // Don't start copying elements until we find one to delete. + for j := i + 1; j < len(s); j++ { + if v := s[j]; !del(v) { + s[i] = v + i++ + } + } + return s[:i] +} + +// Replace replaces the elements s[i:j] by the given v, and returns the +// modified slice. Replace panics if s[i:j] is not a valid slice of s. +func Replace[S ~[]E, E any](s S, i, j int, v ...E) S { + _ = s[i:j] // verify that i:j is a valid subslice + + if i == j { + return Insert(s, i, v...) + } + if j == len(s) { + return append(s[:i], v...) + } + + tot := len(s[:i]) + len(v) + len(s[j:]) + if tot > cap(s) { + // Too big to fit, allocate and copy over. + s2 := append(s[:i], make(S, tot-i)...) // See Insert + copy(s2[i:], v) + copy(s2[i+len(v):], s[j:]) + return s2 + } + + r := s[:tot] + + if i+len(v) <= j { + // Easy, as v fits in the deleted portion. + copy(r[i:], v) + if i+len(v) != j { + copy(r[i+len(v):], s[j:]) + } + return r + } + + // We are expanding (v is bigger than j-i). + // The situation is something like this: + // (example has i=4,j=8,len(s)=16,len(v)=6) + // s: aaaaxxxxbbbbbbbbyy + // ^ ^ ^ ^ + // i j len(s) tot + // a: prefix of s + // x: deleted range + // b: more of s + // y: area to expand into + + if !overlaps(r[i+len(v):], v) { + // Easy, as v is not clobbered by the first copy. + copy(r[i+len(v):], s[j:]) + copy(r[i:], v) + return r + } + + // This is a situation where we don't have a single place to which + // we can copy v. Parts of it need to go to two different places. + // We want to copy the prefix of v into y and the suffix into x, then + // rotate |y| spots to the right. + // + // v[2:] v[:2] + // | | + // s: aaaavvvvbbbbbbbbvv + // ^ ^ ^ ^ + // i j len(s) tot + // + // If either of those two destinations don't alias v, then we're good. + y := len(v) - (j - i) // length of y portion + + if !overlaps(r[i:j], v) { + copy(r[i:j], v[y:]) + copy(r[len(s):], v[:y]) + rotateRight(r[i:], y) + return r + } + if !overlaps(r[len(s):], v) { + copy(r[len(s):], v[:y]) + copy(r[i:j], v[y:]) + rotateRight(r[i:], y) + return r + } + + // Now we know that v overlaps both x and y. + // That means that the entirety of b is *inside* v. + // So we don't need to preserve b at all; instead we + // can copy v first, then copy the b part of v out of + // v to the right destination. + k := startIdx(v, s[j:]) + copy(r[i:], v) + copy(r[i+len(v):], r[i+k:]) + return r +} + +// Clone returns a copy of the slice. +// The elements are copied using assignment, so this is a shallow clone. +func Clone[S ~[]E, E any](s S) S { + // Preserve nil in case it matters. + if s == nil { + return nil + } + return append(S([]E{}), s...) +} + +// Compact replaces consecutive runs of equal elements with a single copy. +// This is like the uniq command found on Unix. +// Compact modifies the contents of the slice s and returns the modified slice, +// which may have a smaller length. +// When Compact discards m elements in total, it might not modify the elements +// s[len(s)-m:len(s)]. If those elements contain pointers you might consider +// zeroing those elements so that objects they reference can be garbage collected. +func Compact[S ~[]E, E comparable](s S) S { + if len(s) < 2 { + return s + } + i := 1 + for k := 1; k < len(s); k++ { + if s[k] != s[k-1] { + if i != k { + s[i] = s[k] + } + i++ + } + } + return s[:i] +} + +// CompactFunc is like [Compact] but uses an equality function to compare elements. +// For runs of elements that compare equal, CompactFunc keeps the first one. +func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S { + if len(s) < 2 { + return s + } + i := 1 + for k := 1; k < len(s); k++ { + if !eq(s[k], s[k-1]) { + if i != k { + s[i] = s[k] + } + i++ + } + } + return s[:i] +} + +// Grow increases the slice's capacity, if necessary, to guarantee space for +// another n elements. After Grow(n), at least n elements can be appended +// to the slice without another allocation. If n is negative or too large to +// allocate the memory, Grow panics. +func Grow[S ~[]E, E any](s S, n int) S { + if n < 0 { + panic("cannot be negative") + } + if n -= cap(s) - len(s); n > 0 { + // TODO(https://go.dev/issue/53888): Make using []E instead of S + // to workaround a compiler bug where the runtime.growslice optimization + // does not take effect. Revert when the compiler is fixed. + s = append([]E(s)[:cap(s)], make([]E, n)...)[:len(s)] + } + return s +} + +// Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. +func Clip[S ~[]E, E any](s S) S { + return s[:len(s):len(s)] +} + +// Rotation algorithm explanation: +// +// rotate left by 2 +// start with +// 0123456789 +// split up like this +// 01 234567 89 +// swap first 2 and last 2 +// 89 234567 01 +// join first parts +// 89234567 01 +// recursively rotate first left part by 2 +// 23456789 01 +// join at the end +// 2345678901 +// +// rotate left by 8 +// start with +// 0123456789 +// split up like this +// 01 234567 89 +// swap first 2 and last 2 +// 89 234567 01 +// join last parts +// 89 23456701 +// recursively rotate second part left by 6 +// 89 01234567 +// join at the end +// 8901234567 + +// TODO: There are other rotate algorithms. +// This algorithm has the desirable property that it moves each element exactly twice. +// The triple-reverse algorithm is simpler and more cache friendly, but takes more writes. +// The follow-cycles algorithm can be 1-write but it is not very cache friendly. + +// rotateLeft rotates b left by n spaces. +// s_final[i] = s_orig[i+r], wrapping around. +func rotateLeft[E any](s []E, r int) { + for r != 0 && r != len(s) { + if r*2 <= len(s) { + swap(s[:r], s[len(s)-r:]) + s = s[:len(s)-r] + } else { + swap(s[:len(s)-r], s[r:]) + s, r = s[len(s)-r:], r*2-len(s) + } + } +} +func rotateRight[E any](s []E, r int) { + rotateLeft(s, len(s)-r) +} + +// swap swaps the contents of x and y. x and y must be equal length and disjoint. +func swap[E any](x, y []E) { + for i := 0; i < len(x); i++ { + x[i], y[i] = y[i], x[i] + } +} + +// overlaps reports whether the memory ranges a[0:len(a)] and b[0:len(b)] overlap. +func overlaps[E any](a, b []E) bool { + if len(a) == 0 || len(b) == 0 { + return false + } + elemSize := unsafe.Sizeof(a[0]) + if elemSize == 0 { + return false + } + // TODO: use a runtime/unsafe facility once one becomes available. See issue 12445. + // Also see crypto/internal/alias/alias.go:AnyOverlap + return uintptr(unsafe.Pointer(&a[0])) <= uintptr(unsafe.Pointer(&b[len(b)-1]))+(elemSize-1) && + uintptr(unsafe.Pointer(&b[0])) <= uintptr(unsafe.Pointer(&a[len(a)-1]))+(elemSize-1) +} + +// startIdx returns the index in haystack where the needle starts. +// prerequisite: the needle must be aliased entirely inside the haystack. +func startIdx[E any](haystack, needle []E) int { + p := &needle[0] + for i := range haystack { + if p == &haystack[i] { + return i + } + } + // TODO: what if the overlap is by a non-integral number of Es? + panic("needle not found") +} + +// Reverse reverses the elements of the slice in place. +func Reverse[S ~[]E, E any](s S) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} diff --git a/tools/vendor/golang.org/x/exp/slices/sort.go b/tools/vendor/golang.org/x/exp/slices/sort.go new file mode 100644 index 000000000..b67897f76 --- /dev/null +++ b/tools/vendor/golang.org/x/exp/slices/sort.go @@ -0,0 +1,195 @@ +// 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:generate go run $GOROOT/src/sort/gen_sort_variants.go -exp + +package slices + +import ( + "math/bits" + + "golang.org/x/exp/constraints" +) + +// Sort sorts a slice of any ordered type in ascending order. +// When sorting floating-point numbers, NaNs are ordered before other values. +func Sort[S ~[]E, E constraints.Ordered](x S) { + n := len(x) + pdqsortOrdered(x, 0, n, bits.Len(uint(n))) +} + +// SortFunc sorts the slice x in ascending order as determined by the cmp +// function. This sort is not guaranteed to be stable. +// cmp(a, b) should return a negative number when a < b, a positive number when +// a > b and zero when a == b. +// +// SortFunc requires that cmp is a strict weak ordering. +// See https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings. +func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { + n := len(x) + pdqsortCmpFunc(x, 0, n, bits.Len(uint(n)), cmp) +} + +// SortStableFunc sorts the slice x while keeping the original order of equal +// elements, using cmp to compare elements in the same way as [SortFunc]. +func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { + stableCmpFunc(x, len(x), cmp) +} + +// IsSorted reports whether x is sorted in ascending order. +func IsSorted[S ~[]E, E constraints.Ordered](x S) bool { + for i := len(x) - 1; i > 0; i-- { + if cmpLess(x[i], x[i-1]) { + return false + } + } + return true +} + +// IsSortedFunc reports whether x is sorted in ascending order, with cmp as the +// comparison function as defined by [SortFunc]. +func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool { + for i := len(x) - 1; i > 0; i-- { + if cmp(x[i], x[i-1]) < 0 { + return false + } + } + return true +} + +// Min returns the minimal value in x. It panics if x is empty. +// For floating-point numbers, Min propagates NaNs (any NaN value in x +// forces the output to be NaN). +func Min[S ~[]E, E constraints.Ordered](x S) E { + if len(x) < 1 { + panic("slices.Min: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + m = min(m, x[i]) + } + return m +} + +// MinFunc returns the minimal value in x, using cmp to compare elements. +// It panics if x is empty. If there is more than one minimal element +// according to the cmp function, MinFunc returns the first one. +func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E { + if len(x) < 1 { + panic("slices.MinFunc: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + if cmp(x[i], m) < 0 { + m = x[i] + } + } + return m +} + +// Max returns the maximal value in x. It panics if x is empty. +// For floating-point E, Max propagates NaNs (any NaN value in x +// forces the output to be NaN). +func Max[S ~[]E, E constraints.Ordered](x S) E { + if len(x) < 1 { + panic("slices.Max: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + m = max(m, x[i]) + } + return m +} + +// MaxFunc returns the maximal value in x, using cmp to compare elements. +// It panics if x is empty. If there is more than one maximal element +// according to the cmp function, MaxFunc returns the first one. +func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E { + if len(x) < 1 { + panic("slices.MaxFunc: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + if cmp(x[i], m) > 0 { + m = x[i] + } + } + return m +} + +// BinarySearch searches for target in a sorted slice and returns the position +// where target is found, or the position where target would appear in the +// sort order; it also returns a bool saying whether the target is really found +// in the slice. The slice must be sorted in increasing order. +func BinarySearch[S ~[]E, E constraints.Ordered](x S, target E) (int, bool) { + // Inlining is faster than calling BinarySearchFunc with a lambda. + n := len(x) + // Define x[-1] < target and x[n] >= target. + // Invariant: x[i-1] < target, x[j] >= target. + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) // avoid overflow when computing h + // i ≤ h < j + if cmpLess(x[h], target) { + i = h + 1 // preserves x[i-1] < target + } else { + j = h // preserves x[j] >= target + } + } + // i == j, x[i-1] < target, and x[j] (= x[i]) >= target => answer is i. + return i, i < n && (x[i] == target || (isNaN(x[i]) && isNaN(target))) +} + +// BinarySearchFunc works like [BinarySearch], but uses a custom comparison +// function. The slice must be sorted in increasing order, where "increasing" +// is defined by cmp. cmp should return 0 if the slice element matches +// the target, a negative number if the slice element precedes the target, +// or a positive number if the slice element follows the target. +// cmp must implement the same ordering as the slice, such that if +// cmp(a, t) < 0 and cmp(b, t) >= 0, then a must precede b in the slice. +func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool) { + n := len(x) + // Define cmp(x[-1], target) < 0 and cmp(x[n], target) >= 0 . + // Invariant: cmp(x[i - 1], target) < 0, cmp(x[j], target) >= 0. + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) // avoid overflow when computing h + // i ≤ h < j + if cmp(x[h], target) < 0 { + i = h + 1 // preserves cmp(x[i - 1], target) < 0 + } else { + j = h // preserves cmp(x[j], target) >= 0 + } + } + // i == j, cmp(x[i-1], target) < 0, and cmp(x[j], target) (= cmp(x[i], target)) >= 0 => answer is i. + return i, i < n && cmp(x[i], target) == 0 +} + +type sortedHint int // hint for pdqsort when choosing the pivot + +const ( + unknownHint sortedHint = iota + increasingHint + decreasingHint +) + +// xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf +type xorshift uint64 + +func (r *xorshift) Next() uint64 { + *r ^= *r << 13 + *r ^= *r >> 17 + *r ^= *r << 5 + return uint64(*r) +} + +func nextPowerOfTwo(length int) uint { + return 1 << bits.Len(uint(length)) +} + +// isNaN reports whether x is a NaN without requiring the math package. +// This will always return false if T is not floating-point. +func isNaN[T constraints.Ordered](x T) bool { + return x != x +} diff --git a/tools/vendor/golang.org/x/exp/slices/zsortanyfunc.go b/tools/vendor/golang.org/x/exp/slices/zsortanyfunc.go new file mode 100644 index 000000000..06f2c7a24 --- /dev/null +++ b/tools/vendor/golang.org/x/exp/slices/zsortanyfunc.go @@ -0,0 +1,479 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// 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 slices + +// insertionSortCmpFunc sorts data[a:b] using insertion sort. +func insertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && (cmp(data[j], data[j-1]) < 0); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownCmpFunc implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownCmpFunc[E any](data []E, lo, hi, first int, cmp func(a, b E) int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && (cmp(data[first+child], data[first+child+1]) < 0) { + child++ + } + if !(cmp(data[first+root], data[first+child]) < 0) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownCmpFunc(data, i, hi, first, cmp) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownCmpFunc(data, lo, i, first, cmp) + } +} + +// pdqsortCmpFunc sorts data[a:b]. +// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. +// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf +// C++ implementation: https://github.com/orlp/pdqsort +// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ +// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. +func pdqsortCmpFunc[E any](data []E, a, b, limit int, cmp func(a, b E) int) { + const maxInsertion = 12 + + var ( + wasBalanced = true // whether the last partitioning was reasonably balanced + wasPartitioned = true // whether the slice was already partitioned + ) + + for { + length := b - a + + if length <= maxInsertion { + insertionSortCmpFunc(data, a, b, cmp) + return + } + + // Fall back to heapsort if too many bad choices were made. + if limit == 0 { + heapSortCmpFunc(data, a, b, cmp) + return + } + + // If the last partitioning was imbalanced, we need to breaking patterns. + if !wasBalanced { + breakPatternsCmpFunc(data, a, b, cmp) + limit-- + } + + pivot, hint := choosePivotCmpFunc(data, a, b, cmp) + if hint == decreasingHint { + reverseRangeCmpFunc(data, a, b, cmp) + // The chosen pivot was pivot-a elements after the start of the array. + // After reversing it is pivot-a elements before the end of the array. + // The idea came from Rust's implementation. + pivot = (b - 1) - (pivot - a) + hint = increasingHint + } + + // The slice is likely already sorted. + if wasBalanced && wasPartitioned && hint == increasingHint { + if partialInsertionSortCmpFunc(data, a, b, cmp) { + return + } + } + + // Probably the slice contains many duplicate elements, partition the slice into + // elements equal to and elements greater than the pivot. + if a > 0 && !(cmp(data[a-1], data[pivot]) < 0) { + mid := partitionEqualCmpFunc(data, a, b, pivot, cmp) + a = mid + continue + } + + mid, alreadyPartitioned := partitionCmpFunc(data, a, b, pivot, cmp) + wasPartitioned = alreadyPartitioned + + leftLen, rightLen := mid-a, b-mid + balanceThreshold := length / 8 + if leftLen < rightLen { + wasBalanced = leftLen >= balanceThreshold + pdqsortCmpFunc(data, a, mid, limit, cmp) + a = mid + 1 + } else { + wasBalanced = rightLen >= balanceThreshold + pdqsortCmpFunc(data, mid+1, b, limit, cmp) + b = mid + } + } +} + +// partitionCmpFunc does one quicksort partition. +// Let p = data[pivot] +// Moves elements in data[a:b] around, so that data[i]

    =p for inewpivot. +// On return, data[newpivot] = p +func partitionCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int, alreadyPartitioned bool) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + data[j], data[a] = data[a], data[j] + return j, true + } + data[i], data[j] = data[j], data[i] + i++ + j-- + + for { + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + data[j], data[a] = data[a], data[j] + return j, false +} + +// partitionEqualCmpFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. +// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. +func partitionEqualCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for { + for i <= j && !(cmp(data[a], data[i]) < 0) { + i++ + } + for i <= j && (cmp(data[a], data[j]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + return i +} + +// partialInsertionSortCmpFunc partially sorts a slice, returns true if the slice is sorted at the end. +func partialInsertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) bool { + const ( + maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted + shortestShifting = 50 // don't shift any elements on short arrays + ) + i := a + 1 + for j := 0; j < maxSteps; j++ { + for i < b && !(cmp(data[i], data[i-1]) < 0) { + i++ + } + + if i == b { + return true + } + + if b-a < shortestShifting { + return false + } + + data[i], data[i-1] = data[i-1], data[i] + + // Shift the smaller one to the left. + if i-a >= 2 { + for j := i - 1; j >= 1; j-- { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + // Shift the greater one to the right. + if b-i >= 2 { + for j := i + 1; j < b; j++ { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + } + return false +} + +// breakPatternsCmpFunc scatters some elements around in an attempt to break some patterns +// that might cause imbalanced partitions in quicksort. +func breakPatternsCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + length := b - a + if length >= 8 { + random := xorshift(length) + modulus := nextPowerOfTwo(length) + + for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { + other := int(uint(random.Next()) & (modulus - 1)) + if other >= length { + other -= length + } + data[idx], data[a+other] = data[a+other], data[idx] + } + } +} + +// choosePivotCmpFunc chooses a pivot in data[a:b]. +// +// [0,8): chooses a static pivot. +// [8,shortestNinther): uses the simple median-of-three method. +// [shortestNinther,∞): uses the Tukey ninther method. +func choosePivotCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) (pivot int, hint sortedHint) { + const ( + shortestNinther = 50 + maxSwaps = 4 * 3 + ) + + l := b - a + + var ( + swaps int + i = a + l/4*1 + j = a + l/4*2 + k = a + l/4*3 + ) + + if l >= 8 { + if l >= shortestNinther { + // Tukey ninther method, the idea came from Rust's implementation. + i = medianAdjacentCmpFunc(data, i, &swaps, cmp) + j = medianAdjacentCmpFunc(data, j, &swaps, cmp) + k = medianAdjacentCmpFunc(data, k, &swaps, cmp) + } + // Find the median among i, j, k and stores it into j. + j = medianCmpFunc(data, i, j, k, &swaps, cmp) + } + + switch swaps { + case 0: + return j, increasingHint + case maxSwaps: + return j, decreasingHint + default: + return j, unknownHint + } +} + +// order2CmpFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. +func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int) (int, int) { + if cmp(data[b], data[a]) < 0 { + *swaps++ + return b, a + } + return a, b +} + +// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. +func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int { + a, b = order2CmpFunc(data, a, b, swaps, cmp) + b, c = order2CmpFunc(data, b, c, swaps, cmp) + a, b = order2CmpFunc(data, a, b, swaps, cmp) + return b +} + +// medianAdjacentCmpFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. +func medianAdjacentCmpFunc[E any](data []E, a int, swaps *int, cmp func(a, b E) int) int { + return medianCmpFunc(data, a-1, a, a+1, swaps, cmp) +} + +func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + i := a + j := b - 1 + for i < j { + data[i], data[j] = data[j], data[i] + i++ + j-- + } +} + +func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func stableCmpFunc[E any](data []E, n int, cmp func(a, b E) int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortCmpFunc(data, a, b, cmp) + a = b + b += blockSize + } + insertionSortCmpFunc(data, a, n, cmp) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeCmpFunc(data, a, a+blockSize, b, cmp) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeCmpFunc(data, a, m, n, cmp) + } + blockSize *= 2 + } +} + +// symMergeCmpFunc merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if cmp(data[h], data[a]) < 0 { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !(cmp(data[m], data[h]) < 0) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !(cmp(data[p-c], data[c]) < 0) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateCmpFunc(data, start, m, end, cmp) + } + if a < start && start < mid { + symMergeCmpFunc(data, a, start, mid, cmp) + } + if mid < end && end < b { + symMergeCmpFunc(data, mid, end, b, cmp) + } +} + +// rotateCmpFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeCmpFunc(data, m-i, m, j, cmp) + i -= j + } else { + swapRangeCmpFunc(data, m-i, m+j-i, i, cmp) + j -= i + } + } + // i == j + swapRangeCmpFunc(data, m-i, m, i, cmp) +} diff --git a/tools/vendor/golang.org/x/exp/slices/zsortordered.go b/tools/vendor/golang.org/x/exp/slices/zsortordered.go new file mode 100644 index 000000000..99b47c398 --- /dev/null +++ b/tools/vendor/golang.org/x/exp/slices/zsortordered.go @@ -0,0 +1,481 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// 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 slices + +import "golang.org/x/exp/constraints" + +// insertionSortOrdered sorts data[a:b] using insertion sort. +func insertionSortOrdered[E constraints.Ordered](data []E, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && cmpLess(data[j], data[j-1]); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownOrdered implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownOrdered[E constraints.Ordered](data []E, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && cmpLess(data[first+child], data[first+child+1]) { + child++ + } + if !cmpLess(data[first+root], data[first+child]) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortOrdered[E constraints.Ordered](data []E, a, b int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownOrdered(data, i, hi, first) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownOrdered(data, lo, i, first) + } +} + +// pdqsortOrdered sorts data[a:b]. +// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. +// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf +// C++ implementation: https://github.com/orlp/pdqsort +// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ +// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. +func pdqsortOrdered[E constraints.Ordered](data []E, a, b, limit int) { + const maxInsertion = 12 + + var ( + wasBalanced = true // whether the last partitioning was reasonably balanced + wasPartitioned = true // whether the slice was already partitioned + ) + + for { + length := b - a + + if length <= maxInsertion { + insertionSortOrdered(data, a, b) + return + } + + // Fall back to heapsort if too many bad choices were made. + if limit == 0 { + heapSortOrdered(data, a, b) + return + } + + // If the last partitioning was imbalanced, we need to breaking patterns. + if !wasBalanced { + breakPatternsOrdered(data, a, b) + limit-- + } + + pivot, hint := choosePivotOrdered(data, a, b) + if hint == decreasingHint { + reverseRangeOrdered(data, a, b) + // The chosen pivot was pivot-a elements after the start of the array. + // After reversing it is pivot-a elements before the end of the array. + // The idea came from Rust's implementation. + pivot = (b - 1) - (pivot - a) + hint = increasingHint + } + + // The slice is likely already sorted. + if wasBalanced && wasPartitioned && hint == increasingHint { + if partialInsertionSortOrdered(data, a, b) { + return + } + } + + // Probably the slice contains many duplicate elements, partition the slice into + // elements equal to and elements greater than the pivot. + if a > 0 && !cmpLess(data[a-1], data[pivot]) { + mid := partitionEqualOrdered(data, a, b, pivot) + a = mid + continue + } + + mid, alreadyPartitioned := partitionOrdered(data, a, b, pivot) + wasPartitioned = alreadyPartitioned + + leftLen, rightLen := mid-a, b-mid + balanceThreshold := length / 8 + if leftLen < rightLen { + wasBalanced = leftLen >= balanceThreshold + pdqsortOrdered(data, a, mid, limit) + a = mid + 1 + } else { + wasBalanced = rightLen >= balanceThreshold + pdqsortOrdered(data, mid+1, b, limit) + b = mid + } + } +} + +// partitionOrdered does one quicksort partition. +// Let p = data[pivot] +// Moves elements in data[a:b] around, so that data[i]

    =p for inewpivot. +// On return, data[newpivot] = p +func partitionOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int, alreadyPartitioned bool) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for i <= j && cmpLess(data[i], data[a]) { + i++ + } + for i <= j && !cmpLess(data[j], data[a]) { + j-- + } + if i > j { + data[j], data[a] = data[a], data[j] + return j, true + } + data[i], data[j] = data[j], data[i] + i++ + j-- + + for { + for i <= j && cmpLess(data[i], data[a]) { + i++ + } + for i <= j && !cmpLess(data[j], data[a]) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + data[j], data[a] = data[a], data[j] + return j, false +} + +// partitionEqualOrdered partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. +// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. +func partitionEqualOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for { + for i <= j && !cmpLess(data[a], data[i]) { + i++ + } + for i <= j && cmpLess(data[a], data[j]) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + return i +} + +// partialInsertionSortOrdered partially sorts a slice, returns true if the slice is sorted at the end. +func partialInsertionSortOrdered[E constraints.Ordered](data []E, a, b int) bool { + const ( + maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted + shortestShifting = 50 // don't shift any elements on short arrays + ) + i := a + 1 + for j := 0; j < maxSteps; j++ { + for i < b && !cmpLess(data[i], data[i-1]) { + i++ + } + + if i == b { + return true + } + + if b-a < shortestShifting { + return false + } + + data[i], data[i-1] = data[i-1], data[i] + + // Shift the smaller one to the left. + if i-a >= 2 { + for j := i - 1; j >= 1; j-- { + if !cmpLess(data[j], data[j-1]) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + // Shift the greater one to the right. + if b-i >= 2 { + for j := i + 1; j < b; j++ { + if !cmpLess(data[j], data[j-1]) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + } + return false +} + +// breakPatternsOrdered scatters some elements around in an attempt to break some patterns +// that might cause imbalanced partitions in quicksort. +func breakPatternsOrdered[E constraints.Ordered](data []E, a, b int) { + length := b - a + if length >= 8 { + random := xorshift(length) + modulus := nextPowerOfTwo(length) + + for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { + other := int(uint(random.Next()) & (modulus - 1)) + if other >= length { + other -= length + } + data[idx], data[a+other] = data[a+other], data[idx] + } + } +} + +// choosePivotOrdered chooses a pivot in data[a:b]. +// +// [0,8): chooses a static pivot. +// [8,shortestNinther): uses the simple median-of-three method. +// [shortestNinther,∞): uses the Tukey ninther method. +func choosePivotOrdered[E constraints.Ordered](data []E, a, b int) (pivot int, hint sortedHint) { + const ( + shortestNinther = 50 + maxSwaps = 4 * 3 + ) + + l := b - a + + var ( + swaps int + i = a + l/4*1 + j = a + l/4*2 + k = a + l/4*3 + ) + + if l >= 8 { + if l >= shortestNinther { + // Tukey ninther method, the idea came from Rust's implementation. + i = medianAdjacentOrdered(data, i, &swaps) + j = medianAdjacentOrdered(data, j, &swaps) + k = medianAdjacentOrdered(data, k, &swaps) + } + // Find the median among i, j, k and stores it into j. + j = medianOrdered(data, i, j, k, &swaps) + } + + switch swaps { + case 0: + return j, increasingHint + case maxSwaps: + return j, decreasingHint + default: + return j, unknownHint + } +} + +// order2Ordered returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. +func order2Ordered[E constraints.Ordered](data []E, a, b int, swaps *int) (int, int) { + if cmpLess(data[b], data[a]) { + *swaps++ + return b, a + } + return a, b +} + +// medianOrdered returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. +func medianOrdered[E constraints.Ordered](data []E, a, b, c int, swaps *int) int { + a, b = order2Ordered(data, a, b, swaps) + b, c = order2Ordered(data, b, c, swaps) + a, b = order2Ordered(data, a, b, swaps) + return b +} + +// medianAdjacentOrdered finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. +func medianAdjacentOrdered[E constraints.Ordered](data []E, a int, swaps *int) int { + return medianOrdered(data, a-1, a, a+1, swaps) +} + +func reverseRangeOrdered[E constraints.Ordered](data []E, a, b int) { + i := a + j := b - 1 + for i < j { + data[i], data[j] = data[j], data[i] + i++ + j-- + } +} + +func swapRangeOrdered[E constraints.Ordered](data []E, a, b, n int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func stableOrdered[E constraints.Ordered](data []E, n int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortOrdered(data, a, b) + a = b + b += blockSize + } + insertionSortOrdered(data, a, n) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeOrdered(data, a, a+blockSize, b) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeOrdered(data, a, m, n) + } + blockSize *= 2 + } +} + +// symMergeOrdered merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeOrdered[E constraints.Ordered](data []E, a, m, b int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if cmpLess(data[h], data[a]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !cmpLess(data[m], data[h]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !cmpLess(data[p-c], data[c]) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateOrdered(data, start, m, end) + } + if a < start && start < mid { + symMergeOrdered(data, a, start, mid) + } + if mid < end && end < b { + symMergeOrdered(data, mid, end, b) + } +} + +// rotateOrdered rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateOrdered[E constraints.Ordered](data []E, a, m, b int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeOrdered(data, m-i, m, j) + i -= j + } else { + swapRangeOrdered(data, m-i, m+j-i, i) + j -= i + } + } + // i == j + swapRangeOrdered(data, m-i, m, i) +} diff --git a/tools/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go b/tools/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go index 2681af35a..150f887e7 100644 --- a/tools/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go +++ b/tools/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go @@ -13,7 +13,7 @@ import ( "sync" ) -// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be +// Regexp is a wrapper around [regexp.Regexp], where the underlying regexp will be // compiled the first time it is needed. type Regexp struct { str string diff --git a/tools/vendor/golang.org/x/mod/modfile/print.go b/tools/vendor/golang.org/x/mod/modfile/print.go index 524f93022..2a0123d4b 100644 --- a/tools/vendor/golang.org/x/mod/modfile/print.go +++ b/tools/vendor/golang.org/x/mod/modfile/print.go @@ -16,7 +16,13 @@ import ( func Format(f *FileSyntax) []byte { pr := &printer{} pr.file(f) - return pr.Bytes() + + // remove trailing blank lines + b := pr.Bytes() + for len(b) > 0 && b[len(b)-1] == '\n' && (len(b) == 1 || b[len(b)-2] == '\n') { + b = b[:len(b)-1] + } + return b } // A printer collects the state during printing of a file or expression. @@ -59,7 +65,11 @@ func (p *printer) newline() { } p.trim() - p.printf("\n") + if b := p.Bytes(); len(b) == 0 || (len(b) >= 2 && b[len(b)-1] == '\n' && b[len(b)-2] == '\n') { + // skip the blank line at top of file or after a blank line + } else { + p.printf("\n") + } for i := 0; i < p.margin; i++ { p.printf("\t") } diff --git a/tools/vendor/golang.org/x/mod/modfile/read.go b/tools/vendor/golang.org/x/mod/modfile/read.go index a503bc210..5b5bb5e11 100644 --- a/tools/vendor/golang.org/x/mod/modfile/read.go +++ b/tools/vendor/golang.org/x/mod/modfile/read.go @@ -65,7 +65,7 @@ type Comments struct { } // Comment returns the receiver. This isn't useful by itself, but -// a Comments struct is embedded into all the expression +// a [Comments] struct is embedded into all the expression // implementation types, and this gives each of those a Comment // method to satisfy the Expr interface. func (c *Comments) Comment() *Comments { diff --git a/tools/vendor/golang.org/x/mod/modfile/rule.go b/tools/vendor/golang.org/x/mod/modfile/rule.go index 6bcde8fab..e0869fa38 100644 --- a/tools/vendor/golang.org/x/mod/modfile/rule.go +++ b/tools/vendor/golang.org/x/mod/modfile/rule.go @@ -5,17 +5,17 @@ // Package modfile implements a parser and formatter for go.mod files. // // The go.mod syntax is described in -// https://golang.org/cmd/go/#hdr-The_go_mod_file. +// https://pkg.go.dev/cmd/go/#hdr-The_go_mod_file. // -// The Parse and ParseLax functions both parse a go.mod file and return an +// The [Parse] and [ParseLax] functions both parse a go.mod file and return an // abstract syntax tree. ParseLax ignores unknown statements and may be used to // parse go.mod files that may have been developed with newer versions of Go. // -// The File struct returned by Parse and ParseLax represent an abstract -// go.mod file. File has several methods like AddNewRequire and DropReplace -// that can be used to programmatically edit a file. +// The [File] struct returned by Parse and ParseLax represent an abstract +// go.mod file. File has several methods like [File.AddNewRequire] and +// [File.DropReplace] that can be used to programmatically edit a file. // -// The Format function formats a File back to a byte slice which can be +// The [Format] function formats a File back to a byte slice which can be // written to a file. package modfile @@ -35,12 +35,13 @@ import ( // A File is the parsed, interpreted form of a go.mod file. type File struct { - Module *Module - Go *Go - Require []*Require - Exclude []*Exclude - Replace []*Replace - Retract []*Retract + Module *Module + Go *Go + Toolchain *Toolchain + Require []*Require + Exclude []*Exclude + Replace []*Replace + Retract []*Retract Syntax *FileSyntax } @@ -58,6 +59,12 @@ type Go struct { Syntax *Line } +// A Toolchain is the toolchain statement. +type Toolchain struct { + Name string // "go1.21rc1" + Syntax *Line +} + // An Exclude is a single exclude statement. type Exclude struct { Mod module.Version @@ -219,7 +226,7 @@ var dontFixRetract VersionFixer = func(_, vers string) (string, error) { // data is the content of the file. // // fix is an optional function that canonicalizes module versions. -// If fix is nil, all module versions must be canonical (module.CanonicalVersion +// If fix is nil, all module versions must be canonical ([module.CanonicalVersion] // must return the same string). func Parse(file string, data []byte, fix VersionFixer) (*File, error) { return parseToFile(file, data, fix, true) @@ -296,9 +303,13 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parse return f, nil } -var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)$`) +var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))?([a-z]+[0-9]+)?$`) var laxGoVersionRE = lazyregexp.New(`^v?(([1-9][0-9]*)\.(0|[1-9][0-9]*))([^0-9].*)$`) +// Toolchains must be named beginning with `go1`, +// like "go1.20.3" or "go1.20.3-gccgo". As a special case, "default" is also permitted. +var ToolchainRE = lazyregexp.New(`^default$|^go1($|\.)`) + func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool) { // If strict is false, this module is a dependency. // We ignore all unknown directives as well as main-module-only @@ -356,7 +367,7 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a } } if !fixed { - errorf("invalid go version '%s': must match format 1.23", args[0]) + errorf("invalid go version '%s': must match format 1.23.0", args[0]) return } } @@ -364,6 +375,21 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a f.Go = &Go{Syntax: line} f.Go.Version = args[0] + case "toolchain": + if f.Toolchain != nil { + errorf("repeated toolchain statement") + return + } + if len(args) != 1 { + errorf("toolchain directive expects exactly one argument") + return + } else if strict && !ToolchainRE.MatchString(args[0]) { + errorf("invalid toolchain version '%s': must match format go1.23.0 or local", args[0]) + return + } + f.Toolchain = &Toolchain{Syntax: line} + f.Toolchain.Name = args[0] + case "module": if f.Module != nil { errorf("repeated module statement") @@ -612,6 +638,22 @@ func (f *WorkFile) add(errs *ErrorList, line *Line, verb string, args []string, f.Go = &Go{Syntax: line} f.Go.Version = args[0] + case "toolchain": + if f.Toolchain != nil { + errorf("repeated toolchain statement") + return + } + if len(args) != 1 { + errorf("toolchain directive expects exactly one argument") + return + } else if !ToolchainRE.MatchString(args[0]) { + errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0]) + return + } + + f.Toolchain = &Toolchain{Syntax: line} + f.Toolchain.Name = args[0] + case "use": if len(args) != 1 { errorf("usage: %s local/dir", verb) @@ -881,7 +923,7 @@ func (f *File) Format() ([]byte, error) { } // Cleanup cleans up the file f after any edit operations. -// To avoid quadratic behavior, modifications like DropRequire +// To avoid quadratic behavior, modifications like [File.DropRequire] // clear the entry but do not remove it from the slice. // Cleanup cleans out all the cleared entries. func (f *File) Cleanup() { @@ -926,7 +968,7 @@ func (f *File) Cleanup() { func (f *File) AddGoStmt(version string) error { if !GoVersionRE.MatchString(version) { - return fmt.Errorf("invalid language version string %q", version) + return fmt.Errorf("invalid language version %q", version) } if f.Go == nil { var hint Expr @@ -944,6 +986,44 @@ func (f *File) AddGoStmt(version string) error { return nil } +// DropGoStmt deletes the go statement from the file. +func (f *File) DropGoStmt() { + if f.Go != nil { + f.Go.Syntax.markRemoved() + f.Go = nil + } +} + +// DropToolchainStmt deletes the toolchain statement from the file. +func (f *File) DropToolchainStmt() { + if f.Toolchain != nil { + f.Toolchain.Syntax.markRemoved() + f.Toolchain = nil + } +} + +func (f *File) AddToolchainStmt(name string) error { + if !ToolchainRE.MatchString(name) { + return fmt.Errorf("invalid toolchain name %q", name) + } + if f.Toolchain == nil { + var hint Expr + if f.Go != nil && f.Go.Syntax != nil { + hint = f.Go.Syntax + } else if f.Module != nil && f.Module.Syntax != nil { + hint = f.Module.Syntax + } + f.Toolchain = &Toolchain{ + Name: name, + Syntax: f.Syntax.addLine(hint, "toolchain", name), + } + } else { + f.Toolchain.Name = name + f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name) + } + return nil +} + // AddRequire sets the first require line for path to version vers, // preserving any existing comments for that line and removing all // other lines for path. @@ -995,8 +1075,8 @@ func (f *File) AddNewRequire(path, vers string, indirect bool) { // The requirements in req must specify at most one distinct version for each // module path. // -// If any existing requirements may be removed, the caller should call Cleanup -// after all edits are complete. +// If any existing requirements may be removed, the caller should call +// [File.Cleanup] after all edits are complete. func (f *File) SetRequire(req []*Require) { type elem struct { version string @@ -1387,13 +1467,21 @@ func (f *File) DropRetract(vi VersionInterval) error { func (f *File) SortBlocks() { f.removeDups() // otherwise sorting is unsafe + // semanticSortForExcludeVersionV is the Go version (plus leading "v") at which + // lines in exclude blocks start to use semantic sort instead of lexicographic sort. + // See go.dev/issue/60028. + const semanticSortForExcludeVersionV = "v1.21" + useSemanticSortForExclude := f.Go != nil && semver.Compare("v"+f.Go.Version, semanticSortForExcludeVersionV) >= 0 + for _, stmt := range f.Syntax.Stmt { block, ok := stmt.(*LineBlock) if !ok { continue } less := lineLess - if block.Token[0] == "retract" { + if block.Token[0] == "exclude" && useSemanticSortForExclude { + less = lineExcludeLess + } else if block.Token[0] == "retract" { less = lineRetractLess } sort.SliceStable(block.Line, func(i, j int) bool { @@ -1496,6 +1584,22 @@ func lineLess(li, lj *Line) bool { return len(li.Token) < len(lj.Token) } +// lineExcludeLess reports whether li should be sorted before lj for lines in +// an "exclude" block. +func lineExcludeLess(li, lj *Line) bool { + if len(li.Token) != 2 || len(lj.Token) != 2 { + // Not a known exclude specification. + // Fall back to sorting lexicographically. + return lineLess(li, lj) + } + // An exclude specification has two tokens: ModulePath and Version. + // Compare module path by string order and version by semver rules. + if pi, pj := li.Token[0], lj.Token[0]; pi != pj { + return pi < pj + } + return semver.Compare(li.Token[1], lj.Token[1]) < 0 +} + // lineRetractLess returns whether li should be sorted before lj for lines in // a "retract" block. It treats each line as a version interval. Single versions // are compared as if they were intervals with the same low and high version. diff --git a/tools/vendor/golang.org/x/mod/modfile/work.go b/tools/vendor/golang.org/x/mod/modfile/work.go index 0c0e52152..d7b99376e 100644 --- a/tools/vendor/golang.org/x/mod/modfile/work.go +++ b/tools/vendor/golang.org/x/mod/modfile/work.go @@ -12,9 +12,10 @@ import ( // A WorkFile is the parsed, interpreted form of a go.work file. type WorkFile struct { - Go *Go - Use []*Use - Replace []*Replace + Go *Go + Toolchain *Toolchain + Use []*Use + Replace []*Replace Syntax *FileSyntax } @@ -33,7 +34,7 @@ type Use struct { // data is the content of the file. // // fix is an optional function that canonicalizes module versions. -// If fix is nil, all module versions must be canonical (module.CanonicalVersion +// If fix is nil, all module versions must be canonical ([module.CanonicalVersion] // must return the same string). func ParseWork(file string, data []byte, fix VersionFixer) (*WorkFile, error) { fs, err := parse(file, data) @@ -82,7 +83,7 @@ func ParseWork(file string, data []byte, fix VersionFixer) (*WorkFile, error) { } // Cleanup cleans up the file f after any edit operations. -// To avoid quadratic behavior, modifications like DropRequire +// To avoid quadratic behavior, modifications like [WorkFile.DropRequire] // clear the entry but do not remove it from the slice. // Cleanup cleans out all the cleared entries. func (f *WorkFile) Cleanup() { @@ -109,7 +110,7 @@ func (f *WorkFile) Cleanup() { func (f *WorkFile) AddGoStmt(version string) error { if !GoVersionRE.MatchString(version) { - return fmt.Errorf("invalid language version string %q", version) + return fmt.Errorf("invalid language version %q", version) } if f.Go == nil { stmt := &Line{Token: []string{"go", version}} @@ -117,7 +118,7 @@ func (f *WorkFile) AddGoStmt(version string) error { Version: version, Syntax: stmt, } - // Find the first non-comment-only block that's and add + // Find the first non-comment-only block and add // the go statement before it. That will keep file comments at the top. i := 0 for i = 0; i < len(f.Syntax.Stmt); i++ { @@ -133,6 +134,56 @@ func (f *WorkFile) AddGoStmt(version string) error { return nil } +func (f *WorkFile) AddToolchainStmt(name string) error { + if !ToolchainRE.MatchString(name) { + return fmt.Errorf("invalid toolchain name %q", name) + } + if f.Toolchain == nil { + stmt := &Line{Token: []string{"toolchain", name}} + f.Toolchain = &Toolchain{ + Name: name, + Syntax: stmt, + } + // Find the go line and add the toolchain line after it. + // Or else find the first non-comment-only block and add + // the toolchain line before it. That will keep file comments at the top. + i := 0 + for i = 0; i < len(f.Syntax.Stmt); i++ { + if line, ok := f.Syntax.Stmt[i].(*Line); ok && len(line.Token) > 0 && line.Token[0] == "go" { + i++ + goto Found + } + } + for i = 0; i < len(f.Syntax.Stmt); i++ { + if _, ok := f.Syntax.Stmt[i].(*CommentBlock); !ok { + break + } + } + Found: + f.Syntax.Stmt = append(append(f.Syntax.Stmt[:i:i], stmt), f.Syntax.Stmt[i:]...) + } else { + f.Toolchain.Name = name + f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name) + } + return nil +} + +// DropGoStmt deletes the go statement from the file. +func (f *WorkFile) DropGoStmt() { + if f.Go != nil { + f.Go.Syntax.markRemoved() + f.Go = nil + } +} + +// DropToolchainStmt deletes the toolchain statement from the file. +func (f *WorkFile) DropToolchainStmt() { + if f.Toolchain != nil { + f.Toolchain.Syntax.markRemoved() + f.Toolchain = nil + } +} + func (f *WorkFile) AddUse(diskPath, modulePath string) error { need := true for _, d := range f.Use { diff --git a/tools/vendor/golang.org/x/mod/module/module.go b/tools/vendor/golang.org/x/mod/module/module.go index e9dec6e61..2a364b229 100644 --- a/tools/vendor/golang.org/x/mod/module/module.go +++ b/tools/vendor/golang.org/x/mod/module/module.go @@ -4,7 +4,7 @@ // Package module defines the module.Version type along with support code. // -// The module.Version type is a simple Path, Version pair: +// The [module.Version] type is a simple Path, Version pair: // // type Version struct { // Path string @@ -12,7 +12,7 @@ // } // // There are no restrictions imposed directly by use of this structure, -// but additional checking functions, most notably Check, verify that +// but additional checking functions, most notably [Check], verify that // a particular path, version pair is valid. // // # Escaped Paths @@ -140,7 +140,7 @@ type ModuleError struct { Err error } -// VersionError returns a ModuleError derived from a Version and error, +// VersionError returns a [ModuleError] derived from a [Version] and error, // or err itself if it is already such an error. func VersionError(v Version, err error) error { var mErr *ModuleError @@ -169,7 +169,7 @@ func (e *ModuleError) Unwrap() error { return e.Err } // An InvalidVersionError indicates an error specific to a version, with the // module path unknown or specified externally. // -// A ModuleError may wrap an InvalidVersionError, but an InvalidVersionError +// A [ModuleError] may wrap an InvalidVersionError, but an InvalidVersionError // must not wrap a ModuleError. type InvalidVersionError struct { Version string @@ -193,8 +193,8 @@ func (e *InvalidVersionError) Error() string { func (e *InvalidVersionError) Unwrap() error { return e.Err } // An InvalidPathError indicates a module, import, or file path doesn't -// satisfy all naming constraints. See CheckPath, CheckImportPath, -// and CheckFilePath for specific restrictions. +// satisfy all naming constraints. See [CheckPath], [CheckImportPath], +// and [CheckFilePath] for specific restrictions. type InvalidPathError struct { Kind string // "module", "import", or "file" Path string @@ -294,7 +294,7 @@ func fileNameOK(r rune) bool { } // CheckPath checks that a module path is valid. -// A valid module path is a valid import path, as checked by CheckImportPath, +// A valid module path is a valid import path, as checked by [CheckImportPath], // with three additional constraints. // First, the leading path element (up to the first slash, if any), // by convention a domain name, must contain only lower-case ASCII letters, @@ -380,7 +380,7 @@ const ( // checkPath returns an error describing why the path is not valid. // Because these checks apply to module, import, and file paths, // and because other checks may be applied, the caller is expected to wrap -// this error with InvalidPathError. +// this error with [InvalidPathError]. func checkPath(path string, kind pathKind) error { if !utf8.ValidString(path) { return fmt.Errorf("invalid UTF-8") @@ -532,7 +532,7 @@ var badWindowsNames = []string{ // they require ".vN" instead of "/vN", and for all N, not just N >= 2. // SplitPathVersion returns with ok = false when presented with // a path whose last path element does not satisfy the constraints -// applied by CheckPath, such as "example.com/pkg/v1" or "example.com/pkg/v1.2". +// applied by [CheckPath], such as "example.com/pkg/v1" or "example.com/pkg/v1.2". func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { if strings.HasPrefix(path, "gopkg.in/") { return splitGopkgIn(path) @@ -582,7 +582,7 @@ func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { // MatchPathMajor reports whether the semantic version v // matches the path major version pathMajor. // -// MatchPathMajor returns true if and only if CheckPathMajor returns nil. +// MatchPathMajor returns true if and only if [CheckPathMajor] returns nil. func MatchPathMajor(v, pathMajor string) bool { return CheckPathMajor(v, pathMajor) == nil } @@ -622,7 +622,7 @@ func CheckPathMajor(v, pathMajor string) error { // PathMajorPrefix returns the major-version tag prefix implied by pathMajor. // An empty PathMajorPrefix allows either v0 or v1. // -// Note that MatchPathMajor may accept some versions that do not actually begin +// Note that [MatchPathMajor] may accept some versions that do not actually begin // with this prefix: namely, it accepts a 'v0.0.0-' prefix for a '.v1' // pathMajor, even though that pathMajor implies 'v1' tagging. func PathMajorPrefix(pathMajor string) string { @@ -643,7 +643,7 @@ func PathMajorPrefix(pathMajor string) string { } // CanonicalVersion returns the canonical form of the version string v. -// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible". +// It is the same as [semver.Canonical] except that it preserves the special build suffix "+incompatible". func CanonicalVersion(v string) string { cv := semver.Canonical(v) if semver.Build(v) == "+incompatible" { @@ -652,8 +652,8 @@ func CanonicalVersion(v string) string { return cv } -// Sort sorts the list by Path, breaking ties by comparing Version fields. -// The Version fields are interpreted as semantic versions (using semver.Compare) +// Sort sorts the list by Path, breaking ties by comparing [Version] fields. +// The Version fields are interpreted as semantic versions (using [semver.Compare]) // optionally followed by a tie-breaking suffix introduced by a slash character, // like in "v0.0.1/go.mod". func Sort(list []Version) { @@ -793,7 +793,7 @@ func unescapeString(escaped string) (string, bool) { } // MatchPrefixPatterns reports whether any path prefix of target matches one of -// the glob patterns (as defined by path.Match) in the comma-separated globs +// the glob patterns (as defined by [path.Match]) in the comma-separated globs // list. This implements the algorithm used when matching a module path to the // GOPRIVATE environment variable, as described by 'go help module-private'. // diff --git a/tools/vendor/golang.org/x/mod/module/pseudo.go b/tools/vendor/golang.org/x/mod/module/pseudo.go index f04ad3788..9cf19d325 100644 --- a/tools/vendor/golang.org/x/mod/module/pseudo.go +++ b/tools/vendor/golang.org/x/mod/module/pseudo.go @@ -125,7 +125,7 @@ func IsPseudoVersion(v string) bool { } // IsZeroPseudoVersion returns whether v is a pseudo-version with a zero base, -// timestamp, and revision, as returned by ZeroPseudoVersion. +// timestamp, and revision, as returned by [ZeroPseudoVersion]. func IsZeroPseudoVersion(v string) bool { return v == ZeroPseudoVersion(semver.Major(v)) } diff --git a/tools/vendor/golang.org/x/mod/semver/semver.go b/tools/vendor/golang.org/x/mod/semver/semver.go index a30a22bf2..9a2dfd33a 100644 --- a/tools/vendor/golang.org/x/mod/semver/semver.go +++ b/tools/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/tools/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/tools/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go deleted file mode 100644 index 37dc0cfdb..000000000 --- a/tools/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +++ /dev/null @@ -1,71 +0,0 @@ -// 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 ctxhttp provides helper functions for performing context-aware HTTP requests. -package ctxhttp // import "golang.org/x/net/context/ctxhttp" - -import ( - "context" - "io" - "net/http" - "net/url" - "strings" -) - -// Do sends an HTTP request with the provided http.Client and returns -// an HTTP response. -// -// If the client is nil, http.DefaultClient is used. -// -// The provided ctx must be non-nil. If it is canceled or times out, -// ctx.Err() will be returned. -func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { - if client == nil { - client = http.DefaultClient - } - resp, err := client.Do(req.WithContext(ctx)) - // If we got an error, and the context has been canceled, - // the context's error is probably more useful. - if err != nil { - select { - case <-ctx.Done(): - err = ctx.Err() - default: - } - } - return resp, err -} - -// Get issues a GET request via the Do function. -func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Head issues a HEAD request via the Do function. -func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("HEAD", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Post issues a POST request via the Do function. -func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { - req, err := http.NewRequest("POST", url, body) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", bodyType) - return Do(ctx, client, req) -} - -// PostForm issues a POST request via the Do function. -func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { - return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) -} diff --git a/tools/vendor/golang.org/x/net/http2/Dockerfile b/tools/vendor/golang.org/x/net/http2/Dockerfile deleted file mode 100644 index 851224595..000000000 --- a/tools/vendor/golang.org/x/net/http2/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# -# This Dockerfile builds a recent curl with HTTP/2 client support, using -# a recent nghttp2 build. -# -# See the Makefile for how to tag it. If Docker and that image is found, the -# Go tests use this curl binary for integration tests. -# - -FROM ubuntu:trusty - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y git-core build-essential wget - -RUN apt-get install -y --no-install-recommends \ - autotools-dev libtool pkg-config zlib1g-dev \ - libcunit1-dev libssl-dev libxml2-dev libevent-dev \ - automake autoconf - -# The list of packages nghttp2 recommends for h2load: -RUN apt-get install -y --no-install-recommends make binutils \ - autoconf automake autotools-dev \ - libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ - libev-dev libevent-dev libjansson-dev libjemalloc-dev \ - cython python3.4-dev python-setuptools - -# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: -ENV NGHTTP2_VER 895da9a -RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git - -WORKDIR /root/nghttp2 -RUN git reset --hard $NGHTTP2_VER -RUN autoreconf -i -RUN automake -RUN autoconf -RUN ./configure -RUN make -RUN make install - -WORKDIR /root -RUN wget https://curl.se/download/curl-7.45.0.tar.gz -RUN tar -zxvf curl-7.45.0.tar.gz -WORKDIR /root/curl-7.45.0 -RUN ./configure --with-ssl --with-nghttp2=/usr/local -RUN make -RUN make install -RUN ldconfig - -CMD ["-h"] -ENTRYPOINT ["/usr/local/bin/curl"] - diff --git a/tools/vendor/golang.org/x/net/http2/Makefile b/tools/vendor/golang.org/x/net/http2/Makefile deleted file mode 100644 index 55fd826f7..000000000 --- a/tools/vendor/golang.org/x/net/http2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -curlimage: - docker build -t gohttp2/curl . - diff --git a/tools/vendor/golang.org/x/net/http2/server.go b/tools/vendor/golang.org/x/net/http2/server.go index cd057f398..de60fa88f 100644 --- a/tools/vendor/golang.org/x/net/http2/server.go +++ b/tools/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 @@ -1012,14 +1012,6 @@ func (sc *serverConn) serve() { } } -func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { - select { - case <-sc.doneServing: - case <-sharedCh: - close(privateCh) - } -} - type serverMessage int // Message values sent to serveMsgCh. @@ -1900,9 +1892,11 @@ func (st *stream) copyTrailersToHandlerRequest() { // onReadTimeout is run on its own goroutine (from time.AfterFunc) // when the stream's ReadTimeout has fired. func (st *stream) onReadTimeout() { - // Wrap the ErrDeadlineExceeded to avoid callers depending on us - // returning the bare error. - st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + if st.body != nil { + // Wrap the ErrDeadlineExceeded to avoid callers depending on us + // returning the bare error. + st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + } } // onWriteTimeout is run on its own goroutine (from time.AfterFunc) @@ -2020,9 +2014,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { // (in Go 1.8), though. That's a more sane option anyway. if sc.hs.ReadTimeout != 0 { sc.conn.SetReadDeadline(time.Time{}) - if st.body != nil { - st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) - } + st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) } go sc.runHandler(rw, req, handler) @@ -2429,7 +2421,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 } @@ -2569,7 +2561,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"] @@ -2774,7 +2767,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/tools/vendor/golang.org/x/net/http2/transport.go b/tools/vendor/golang.org/x/net/http2/transport.go index f965579f7..4515b22c4 100644 --- a/tools/vendor/golang.org/x/net/http2/transport.go +++ b/tools/vendor/golang.org/x/net/http2/transport.go @@ -19,6 +19,7 @@ import ( "io/fs" "log" "math" + "math/bits" mathrand "math/rand" "net" "net/http" @@ -290,8 +291,7 @@ func (t *Transport) initConnPool() { // HTTP/2 server. type ClientConn struct { t *Transport - tconn net.Conn // usually *tls.Conn, except specialized impls - tconnClosed bool + tconn net.Conn // usually *tls.Conn, except specialized impls tlsState *tls.ConnectionState // nil only for specialized impls reused uint32 // whether conn is being reused; atomic singleUse bool // whether being used for a single http.Request @@ -518,11 +518,14 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { func authorityAddr(scheme string, authority string) (addr string) { host, port, err := net.SplitHostPort(authority) if err != nil { // authority didn't have a port + host = authority + port = "" + } + if port == "" { // authority's port was empty port = "443" if scheme == "http" { port = "80" } - host = authority } if a, err := idna.ToASCII(host); err == nil { host = a @@ -1266,6 +1269,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: @@ -1285,10 +1311,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) } } } @@ -1654,7 +1680,27 @@ func (cs *clientStream) frameScratchBufferLen(maxFrameSize int) int { return int(n) // doesn't truncate; max is 512K } -var bufPool sync.Pool // of *[]byte +// Seven bufPools manage different frame sizes. This helps to avoid scenarios where long-running +// streaming requests using small frame sizes occupy large buffers initially allocated for prior +// requests needing big buffers. The size ranges are as follows: +// {0 KB, 16 KB], {16 KB, 32 KB], {32 KB, 64 KB], {64 KB, 128 KB], {128 KB, 256 KB], +// {256 KB, 512 KB], {512 KB, infinity} +// In practice, the maximum scratch buffer size should not exceed 512 KB due to +// frameScratchBufferLen(maxFrameSize), thus the "infinity pool" should never be used. +// It exists mainly as a safety measure, for potential future increases in max buffer size. +var bufPools [7]sync.Pool // of *[]byte +func bufPoolIndex(size int) int { + if size <= 16384 { + return 0 + } + size -= 1 + bits := bits.Len(uint(size)) + index := bits - 14 + if index >= len(bufPools) { + return len(bufPools) - 1 + } + return index +} func (cs *clientStream) writeRequestBody(req *http.Request) (err error) { cc := cs.cc @@ -1672,12 +1718,13 @@ func (cs *clientStream) writeRequestBody(req *http.Request) (err error) { // Scratch buffer for reading into & writing from. scratchLen := cs.frameScratchBufferLen(maxFrameSize) var buf []byte - if bp, ok := bufPool.Get().(*[]byte); ok && len(*bp) >= scratchLen { - defer bufPool.Put(bp) + index := bufPoolIndex(scratchLen) + if bp, ok := bufPools[index].Get().(*[]byte); ok && len(*bp) >= scratchLen { + defer bufPools[index].Put(bp) buf = *bp } else { buf = make([]byte, scratchLen) - defer bufPool.Put(&buf) + defer bufPools[index].Put(&buf) } var sawEOF bool @@ -1845,6 +1892,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" { @@ -1881,7 +1931,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 diff --git a/tools/vendor/golang.org/x/net/http2/writesched.go b/tools/vendor/golang.org/x/net/http2/writesched.go index c7cd00173..cc893adc2 100644 --- a/tools/vendor/golang.org/x/net/http2/writesched.go +++ b/tools/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/tools/vendor/golang.org/x/net/http2/writesched_roundrobin.go b/tools/vendor/golang.org/x/net/http2/writesched_roundrobin.go new file mode 100644 index 000000000..54fe86322 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/net/idna/idna9.0.0.go b/tools/vendor/golang.org/x/net/idna/idna9.0.0.go index aae6aac87..ee1698cef 100644 --- a/tools/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/tools/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/tools/vendor/golang.org/x/net/idna/tables13.0.0.go b/tools/vendor/golang.org/x/net/idna/tables13.0.0.go index 390c5e56d..66701eadf 100644 --- a/tools/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/tools/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 ̆ ̇ ÌŠ ̨ ̃ Ì‹lxÌˆÌ Î¹; ̈Ìեւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼à¹à¸²à»àº²àº«àº™àº«àº¡à½‚ྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷà¾à¾µÐ²Ð´Ð¾Ñтъѣæ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/tools/vendor/golang.org/x/net/idna/tables15.0.0.go b/tools/vendor/golang.org/x/net/idna/tables15.0.0.go new file mode 100644 index 000000000..40033778f --- /dev/null +++ b/tools/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 ̆ ̇ ÌŠ ̨ ̃ Ì‹lxÌˆÌ Î¹; ̈Ìեւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼à¹à¸²à»àº²àº«àº™àº«àº¡à½‚ྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷà¾à¾µÐ²Ð´Ð¾Ñтъѣæ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\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07" + + "\x01\x00\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03" + + "\x09\x11\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03" + + "\x0a/1\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03" + + "\x07<3\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06" + + "\x13\x00\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(" + + ";\x03\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08" + + "\x14$\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03" + + "\x0a\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19" + + "\x01\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18" + + "\x03\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03" + + "\x07\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03" + + "\x0a\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03" + + "\x0b\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03" + + "\x08\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05" + + "\x03\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11" + + "\x03\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03" + + "\x09\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a" + + ".\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\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/tools/vendor/golang.org/x/net/idna/trie.go b/tools/vendor/golang.org/x/net/idna/trie.go index c4ef847e7..421274172 100644 --- a/tools/vendor/golang.org/x/net/idna/trie.go +++ b/tools/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/tools/vendor/golang.org/x/net/idna/trie12.0.0.go b/tools/vendor/golang.org/x/net/idna/trie12.0.0.go new file mode 100644 index 000000000..bb63f904b --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/net/idna/trie13.0.0.go b/tools/vendor/golang.org/x/net/idna/trie13.0.0.go new file mode 100644 index 000000000..7d68a8dc1 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/net/internal/socks/socks.go b/tools/vendor/golang.org/x/net/internal/socks/socks.go index 97db2340e..84fcc32b6 100644 --- a/tools/vendor/golang.org/x/net/internal/socks/socks.go +++ b/tools/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/tools/vendor/golang.org/x/oauth2/README.md b/tools/vendor/golang.org/x/oauth2/README.md index 1473e1296..781770c20 100644 --- a/tools/vendor/golang.org/x/oauth2/README.md +++ b/tools/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/tools/vendor/golang.org/x/oauth2/internal/oauth2.go b/tools/vendor/golang.org/x/oauth2/internal/oauth2.go index c0ab196cf..14989beaf 100644 --- a/tools/vendor/golang.org/x/oauth2/internal/oauth2.go +++ b/tools/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/tools/vendor/golang.org/x/oauth2/internal/token.go b/tools/vendor/golang.org/x/oauth2/internal/token.go index 355c38696..58901bda5 100644 --- a/tools/vendor/golang.org/x/oauth2/internal/token.go +++ b/tools/vendor/golang.org/x/oauth2/internal/token.go @@ -19,8 +19,6 @@ import ( "strings" "sync" "time" - - "golang.org/x/net/context/ctxhttp" ) // Token represents the credentials used to authorize @@ -57,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) { @@ -229,7 +233,7 @@ func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, } func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { - r, err := ctxhttp.Do(ctx, ContextClient(ctx), req) + r, err := ContextClient(ctx).Do(req.WithContext(ctx)) if err != nil { return nil, err } @@ -238,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"), @@ -267,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, @@ -278,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/tools/vendor/golang.org/x/oauth2/oauth2.go b/tools/vendor/golang.org/x/oauth2/oauth2.go index 291df5c83..9085fabe3 100644 --- a/tools/vendor/golang.org/x/oauth2/oauth2.go +++ b/tools/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/tools/vendor/golang.org/x/oauth2/token.go b/tools/vendor/golang.org/x/oauth2/token.go index 822720341..5ffce9764 100644 --- a/tools/vendor/golang.org/x/oauth2/token.go +++ b/tools/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/tools/vendor/golang.org/x/sync/errgroup/errgroup.go b/tools/vendor/golang.org/x/sync/errgroup/errgroup.go index cbee7a4e2..b18efb743 100644 --- a/tools/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/tools/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/tools/vendor/golang.org/x/sync/errgroup/go120.go b/tools/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 000000000..7d419d376 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/sync/errgroup/pre_go120.go b/tools/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 000000000..1795c18ac --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/sync/singleflight/singleflight.go b/tools/vendor/golang.org/x/sync/singleflight/singleflight.go new file mode 100644 index 000000000..405183098 --- /dev/null +++ b/tools/vendor/golang.org/x/sync/singleflight/singleflight.go @@ -0,0 +1,214 @@ +// Copyright 2013 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 singleflight provides a duplicate function call suppression +// mechanism. +package singleflight // import "golang.org/x/sync/singleflight" + +import ( + "bytes" + "errors" + "fmt" + "runtime" + "runtime/debug" + "sync" +) + +// errGoexit indicates the runtime.Goexit was called in +// the user given function. +var errGoexit = errors.New("runtime.Goexit was called") + +// A panicError is an arbitrary value recovered from a panic +// with the stack trace during the execution of given function. +type panicError struct { + value interface{} + stack []byte +} + +// Error implements error interface. +func (p *panicError) Error() string { + return fmt.Sprintf("%v\n\n%s", p.value, p.stack) +} + +func (p *panicError) Unwrap() error { + err, ok := p.value.(error) + if !ok { + return nil + } + + return err +} + +func newPanicError(v interface{}) error { + stack := debug.Stack() + + // The first line of the stack trace is of the form "goroutine N [status]:" + // but by the time the panic reaches Do the goroutine may no longer exist + // and its status will have changed. Trim out the misleading line. + if line := bytes.IndexByte(stack[:], '\n'); line >= 0 { + stack = stack[line+1:] + } + return &panicError{value: v, stack: stack} +} + +// call is an in-flight or completed singleflight.Do call +type call struct { + wg sync.WaitGroup + + // These fields are written once before the WaitGroup is done + // and are only read after the WaitGroup is done. + val interface{} + err error + + // These fields are read and written with the singleflight + // mutex held before the WaitGroup is done, and are read but + // not written after the WaitGroup is done. + dups int + chans []chan<- Result +} + +// Group represents a class of work and forms a namespace in +// which units of work can be executed with duplicate suppression. +type Group struct { + mu sync.Mutex // protects m + m map[string]*call // lazily initialized +} + +// Result holds the results of Do, so they can be passed +// on a channel. +type Result struct { + Val interface{} + Err error + Shared bool +} + +// Do executes and returns the results of the given function, making +// sure that only one execution is in-flight for a given key at a +// time. If a duplicate comes in, the duplicate caller waits for the +// original to complete and receives the same results. +// The return value shared indicates whether v was given to multiple callers. +func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) { + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + g.mu.Unlock() + c.wg.Wait() + + if e, ok := c.err.(*panicError); ok { + panic(e) + } else if c.err == errGoexit { + runtime.Goexit() + } + return c.val, c.err, true + } + c := new(call) + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + g.doCall(c, key, fn) + return c.val, c.err, c.dups > 0 +} + +// DoChan is like Do but returns a channel that will receive the +// results when they are ready. +// +// The returned channel will not be closed. +func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result { + ch := make(chan Result, 1) + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + c.chans = append(c.chans, ch) + g.mu.Unlock() + return ch + } + c := &call{chans: []chan<- Result{ch}} + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + go g.doCall(c, key, fn) + + return ch +} + +// doCall handles the single call for a key. +func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) { + normalReturn := false + recovered := false + + // use double-defer to distinguish panic from runtime.Goexit, + // more details see https://golang.org/cl/134395 + defer func() { + // the given function invoked runtime.Goexit + if !normalReturn && !recovered { + c.err = errGoexit + } + + g.mu.Lock() + defer g.mu.Unlock() + c.wg.Done() + if g.m[key] == c { + delete(g.m, key) + } + + if e, ok := c.err.(*panicError); ok { + // In order to prevent the waiting channels from being blocked forever, + // needs to ensure that this panic cannot be recovered. + if len(c.chans) > 0 { + go panic(e) + select {} // Keep this goroutine around so that it will appear in the crash dump. + } else { + panic(e) + } + } else if c.err == errGoexit { + // Already in the process of goexit, no need to call again + } else { + // Normal return + for _, ch := range c.chans { + ch <- Result{c.val, c.err, c.dups > 0} + } + } + }() + + func() { + defer func() { + if !normalReturn { + // Ideally, we would wait to take a stack trace until we've determined + // whether this is a panic or a runtime.Goexit. + // + // Unfortunately, the only way we can distinguish the two is to see + // whether the recover stopped the goroutine from terminating, and by + // the time we know that, the part of the stack trace relevant to the + // panic has been discarded. + if r := recover(); r != nil { + c.err = newPanicError(r) + } + } + }() + + c.val, c.err = fn() + normalReturn = true + }() + + if !normalReturn { + recovered = true + } +} + +// Forget tells the singleflight to forget about a key. Future calls +// to Do for this key will call the function rather than waiting for +// an earlier call to complete. +func (g *Group) Forget(key string) { + g.mu.Lock() + delete(g.m, key) + g.mu.Unlock() +} diff --git a/tools/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go b/tools/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go deleted file mode 100644 index e07899b90..000000000 --- a/tools/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2020 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 unsafeheader contains header declarations for the Go runtime's -// slice and string implementations. -// -// This package allows x/sys to use types equivalent to -// reflect.SliceHeader and reflect.StringHeader without introducing -// a dependency on the (relatively heavy) "reflect" package. -package unsafeheader - -import ( - "unsafe" -) - -// Slice is the runtime representation of a slice. -// It cannot be used safely or portably and its representation may change in a later release. -type Slice struct { - Data unsafe.Pointer - Len int - Cap int -} - -// String is the runtime representation of a string. -// It cannot be used safely or portably and its representation may change in a later release. -type String struct { - Data unsafe.Pointer - Len int -} diff --git a/tools/vendor/golang.org/x/sys/unix/mkall.sh b/tools/vendor/golang.org/x/sys/unix/mkall.sh index 8e3947c36..e6f31d374 100644 --- a/tools/vendor/golang.org/x/sys/unix/mkall.sh +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/mkerrors.sh b/tools/vendor/golang.org/x/sys/unix/mkerrors.sh index 2045d3dad..47fa6a7eb 100644 --- a/tools/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/tools/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -204,6 +204,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -518,7 +519,7 @@ 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_/ || @@ -582,6 +583,7 @@ ccflags="$@" $2 ~ /^PERF_/ || $2 ~ /^SECCOMP_MODE_/ || $2 ~ /^SEEK_/ || + $2 ~ /^SCHED_/ || $2 ~ /^SPLICE_/ || $2 ~ /^SYNC_FILE_RANGE_/ || $2 !~ /IOC_MAGIC/ && @@ -623,7 +625,7 @@ ccflags="$@" $2 ~ /^MEM/ || $2 ~ /^WG/ || $2 ~ /^FIB_RULE_/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE|IOMIN$|IOOPT$|ALIGNOFF$|DISCARD|ROTATIONAL$|ZEROOUT$|GETDISKSEQ$)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} @@ -740,7 +742,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; @@ -759,7 +762,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/tools/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/tools/vendor/golang.org/x/sys/unix/mmap_nomremap.go new file mode 100644 index 000000000..ca0513632 --- /dev/null +++ b/tools/vendor/golang.org/x/sys/unix/mmap_nomremap.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 aix || darwin || dragonfly || freebsd || openbsd || solaris +// +build aix darwin dragonfly freebsd openbsd solaris + +package unix + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} diff --git a/tools/vendor/golang.org/x/sys/unix/mremap.go b/tools/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 000000000..fa93d0aa9 --- /dev/null +++ b/tools/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,53 @@ +// 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 || netbsd +// +build linux netbsd + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, +} + +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&mremapFixed != 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&mremapDontunmap == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} + +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} diff --git a/tools/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/tools/vendor/golang.org/x/sys/unix/ptrace_darwin.go index 39dba6ca6..463c3eff7 100644 --- a/tools/vendor/golang.org/x/sys/unix/ptrace_darwin.go +++ b/tools/vendor/golang.org/x/sys/unix/ptrace_darwin.go @@ -7,12 +7,6 @@ package unix -import "unsafe" - func ptrace(request int, pid int, addr uintptr, data uintptr) error { return ptrace1(request, pid, addr, data) } - -func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) error { - return ptrace1Ptr(request, pid, addr, data) -} diff --git a/tools/vendor/golang.org/x/sys/unix/ptrace_ios.go b/tools/vendor/golang.org/x/sys/unix/ptrace_ios.go index 9ea66330a..ed0509a01 100644 --- a/tools/vendor/golang.org/x/sys/unix/ptrace_ios.go +++ b/tools/vendor/golang.org/x/sys/unix/ptrace_ios.go @@ -7,12 +7,6 @@ package unix -import "unsafe" - func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { return ENOTSUP } - -func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - return ENOTSUP -} diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_aix.go b/tools/vendor/golang.org/x/sys/unix/syscall_aix.go index c406ae00f..e94e6cdac 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -487,8 +487,6 @@ func Fsync(fd int) error { //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys write(fd int, p []byte) (n int, err error) -//sys readlen(fd int, p *byte, np int) (n int, err error) = read -//sys writelen(fd int, p *byte, np int) (n int, err error) = write //sys Dup2(oldfd int, newfd int) (err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 @@ -535,21 +533,6 @@ func Fsync(fd int) error { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_bsd.go b/tools/vendor/golang.org/x/sys/unix/syscall_bsd.go index 7705c3270..4217de518 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -601,20 +601,6 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { // Gethostuuid(uuid *byte, timeout *Timespec) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, behav int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_darwin.go b/tools/vendor/golang.org/x/sys/unix/syscall_darwin.go index 206921504..59542a897 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -510,30 +510,36 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { return nil, err } - // Find size. - n := uintptr(0) - if err := sysctl(mib, nil, &n, nil, 0); err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + for { + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // Read into buffer of that size. - buf := make([]KinfoProc, n/SizeofKinfoProc) - if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { - return nil, err - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + // Read into buffer of that size. + buf := make([]KinfoProc, n/SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { + if err == ENOMEM { + // Process table grew. Try again. + continue + } + return nil, err + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // The actual call may return less than the original reported required - // size so ensure we deal with that. - return buf[:n/SizeofKinfoProc], nil + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n/SizeofKinfoProc], nil + } } //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) @@ -638,189 +644,3 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE - -/* - * Unimplemented - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Ioctl -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// sendfile -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Poll_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/tools/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 9fa879806..b37310ce9 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -47,6 +47,5 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace -//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/tools/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index f17b8c526..d51ec9963 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -47,6 +47,5 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT //sys Lstat(path string, stat *Stat_t) (err error) //sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace -//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/tools/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index d4ce988e7..97cb916f2 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -343,203 +343,5 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - * TODO(jsing): Update this list for DragonFly. - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Mount -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Setattrlist -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Getxattr -// Fgetxattr -// Setxattr -// Fsetxattr -// Removexattr -// Fremovexattr -// Listxattr -// Flistxattr -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shmat -// Shmctl -// Shmdt -// Shmget -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/tools/vendor/golang.org/x/sys/unix/syscall_freebsd.go index afb10106f..64d1bb4db 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -449,197 +449,5 @@ func Dup3(oldfd, newfd, flags int) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Ioctl -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Mount -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Setattrlist -// Getdents -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shmat -// Shmctl -// Shmdt -// Shmget -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Poll_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux.go index fbaeb5fff..fb4e50224 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -693,10 +693,10 @@ type SockaddrALG struct { func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { // Leave room for NUL byte terminator. - if len(sa.Type) > 13 { + if len(sa.Type) > len(sa.raw.Type)-1 { return nil, 0, EINVAL } - if len(sa.Name) > 63 { + if len(sa.Name) > len(sa.raw.Name)-1 { return nil, 0, EINVAL } @@ -704,17 +704,8 @@ func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Feat = sa.Feature sa.raw.Mask = sa.Mask - typ, err := ByteSliceFromString(sa.Type) - if err != nil { - return nil, 0, err - } - name, err := ByteSliceFromString(sa.Name) - if err != nil { - return nil, 0, err - } - - copy(sa.raw.Type[:], typ) - copy(sa.raw.Name[:], name) + copy(sa.raw.Type[:], sa.Type) + copy(sa.raw.Name[:], sa.Name) return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil } @@ -1699,12 +1690,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) { @@ -1874,7 +1876,7 @@ func Getpgrp() (pid int) { //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 //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 pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) @@ -1977,8 +1979,6 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { //sys Unshare(flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys exitThread(code int) (err error) = SYS_EXIT -//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ -//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE //sys readv(fd int, iovs []Iovec) (n int, err error) = SYS_READV //sys writev(fd int, iovs []Iovec) (n int, err error) = SYS_WRITEV //sys preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PREADV @@ -2113,21 +2113,7 @@ func writevRacedetect(iovecs []Iovec, n int) { // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - +//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) @@ -2136,6 +2122,12 @@ func Munmap(b []byte) (err error) { //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) +const ( + mremapFixed = MREMAP_FIXED + mremapDontunmap = MREMAP_DONTUNMAP + mremapMaymove = MREMAP_MAYMOVE +) + // Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, // using the specified flags. func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { @@ -2420,99 +2412,73 @@ func PthreadSigmask(how int, set, oldset *Sigset_t) error { return rtSigprocmask(how, set, oldset, _C__NSIG/8) } -/* - * Unimplemented - */ -// AfsSyscall -// ArchPrctl -// Brk -// ClockNanosleep -// ClockSettime -// Clone -// EpollCtlOld -// EpollPwait -// EpollWaitOld -// Execve -// Fork -// Futex -// GetKernelSyms -// GetMempolicy -// GetRobustList -// GetThreadArea -// Getpmsg -// IoCancel -// IoDestroy -// IoGetevents -// IoSetup -// IoSubmit -// IoprioGet -// IoprioSet -// KexecLoad -// LookupDcookie -// Mbind -// MigratePages -// Mincore -// ModifyLdt -// Mount -// MovePages -// MqGetsetattr -// MqNotify -// MqOpen -// MqTimedreceive -// MqTimedsend -// MqUnlink -// Mremap -// Msgctl -// Msgget -// Msgrcv -// Msgsnd -// Nfsservctl -// Personality -// Pselect6 -// Ptrace -// Putpmsg -// Quotactl -// Readahead -// Readv -// RemapFilePages -// RestartSyscall -// RtSigaction -// RtSigpending -// RtSigqueueinfo -// RtSigreturn -// RtSigsuspend -// RtSigtimedwait -// SchedGetPriorityMax -// SchedGetPriorityMin -// SchedGetparam -// SchedGetscheduler -// SchedRrGetInterval -// SchedSetparam -// SchedYield -// Security -// Semctl -// Semget -// Semop -// Semtimedop -// SetMempolicy -// SetRobustList -// SetThreadArea -// SetTidAddress -// Sigaltstack -// Swapoff -// Swapon -// Sysfs -// TimerCreate -// TimerDelete -// TimerGetoverrun -// TimerGettime -// TimerSettime -// Tkill (obsolete) -// Tuxcall -// Umount2 -// Uselib -// Utimensat -// Vfork -// Vhangup -// Vserver -// _Sysctl +//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) +} + +// Pselect is a wrapper around the Linux pselect6 system call. +// This version does not modify the timeout argument. +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + // Per https://man7.org/linux/man-pages/man2/select.2.html#NOTES, + // The Linux pselect6() system call modifies its timeout argument. + // [Not modifying the argument] is the behavior required by POSIX.1-2001. + var mutableTimeout *Timespec + if timeout != nil { + mutableTimeout = new(Timespec) + *mutableTimeout = *timeout + } + + // The final argument of the pselect6() system call is not a + // sigset_t * pointer, but is instead a structure + var kernelMask *sigset_argpack + if sigmask != nil { + wordBits := 32 << (^uintptr(0) >> 63) // see math.intSize + + // A sigset stores one bit per signal, + // offset by 1 (because signal 0 does not exist). + // So the number of words needed is ⌈__C_NSIG - 1 / wordBits⌉. + sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + + sigsetBytes := uintptr(sigsetWords * (wordBits / 8)) + kernelMask = &sigset_argpack{ + ss: sigmask, + ssLen: sigsetBytes, + } + } + + return pselect6(nfd, r, w, e, mutableTimeout, kernelMask) +} + +//sys schedSetattr(pid int, attr *SchedAttr, flags uint) (err error) +//sys schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) + +// SchedSetAttr is a wrapper for sched_setattr(2) syscall. +// https://man7.org/linux/man-pages/man2/sched_setattr.2.html +func SchedSetAttr(pid int, attr *SchedAttr, flags uint) error { + if attr == nil { + return EINVAL + } + attr.Size = SizeofSchedAttr + return schedSetattr(pid, attr, flags) +} + +// SchedGetAttr is a wrapper for sched_getattr(2) syscall. +// https://man7.org/linux/man-pages/man2/sched_getattr.2.html +func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { + attr := &SchedAttr{} + if err := schedGetattr(pid, attr, SizeofSchedAttr, flags); err != nil { + return nil, err + } + return attr, nil +} diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 5b21fcfd7..70601ce36 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -40,7 +40,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index a81f5742b..f5266689a 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -33,7 +33,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 69d2d7c3d..f6ab02ec1 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -28,7 +28,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 76d564095..93fe59d25 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -31,7 +31,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/tools/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 35851ef70..5e6ceee12 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -32,7 +32,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) @@ -177,3 +177,14 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +//sys riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) + +func RISCVHWProbe(pairs []RISCVHWProbePairs, set *CPUSet, flags uint) (err error) { + var setSize uintptr + + if set != nil { + setSize = uintptr(unsafe.Sizeof(*set)) + } + return riscvHWProbe(pairs, setSize, set, flags) +} diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/tools/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 018d7d478..88162099a 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -356,266 +356,16 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) -/* - * Unimplemented - */ -// ____semctl13 -// __clone -// __fhopen40 -// __fhstat40 -// __fhstatvfs140 -// __fstat30 -// __getcwd -// __getfh30 -// __getlogin -// __lstat30 -// __mount50 -// __msgctl13 -// __msync13 -// __ntp_gettime30 -// __posix_chown -// __posix_fchown -// __posix_lchown -// __posix_rename -// __setlogin -// __shmctl13 -// __sigaction_sigtramp -// __sigaltstack14 -// __sigpending14 -// __sigprocmask14 -// __sigsuspend14 -// __sigtimedwait -// __stat30 -// __syscall -// __vfork14 -// _ksem_close -// _ksem_destroy -// _ksem_getvalue -// _ksem_init -// _ksem_open -// _ksem_post -// _ksem_trywait -// _ksem_unlink -// _ksem_wait -// _lwp_continue -// _lwp_create -// _lwp_ctl -// _lwp_detach -// _lwp_exit -// _lwp_getname -// _lwp_getprivate -// _lwp_kill -// _lwp_park -// _lwp_self -// _lwp_setname -// _lwp_setprivate -// _lwp_suspend -// _lwp_unpark -// _lwp_unpark_all -// _lwp_wait -// _lwp_wakeup -// _pset_bind -// _sched_getaffinity -// _sched_getparam -// _sched_setaffinity -// _sched_setparam -// acct -// aio_cancel -// aio_error -// aio_fsync -// aio_read -// aio_return -// aio_suspend -// aio_write -// break -// clock_getres -// clock_gettime -// clock_settime -// compat_09_ogetdomainname -// compat_09_osetdomainname -// compat_09_ouname -// compat_10_omsgsys -// compat_10_osemsys -// compat_10_oshmsys -// compat_12_fstat12 -// compat_12_getdirentries -// compat_12_lstat12 -// compat_12_msync -// compat_12_oreboot -// compat_12_oswapon -// compat_12_stat12 -// compat_13_sigaction13 -// compat_13_sigaltstack13 -// compat_13_sigpending13 -// compat_13_sigprocmask13 -// compat_13_sigreturn13 -// compat_13_sigsuspend13 -// compat_14___semctl -// compat_14_msgctl -// compat_14_shmctl -// compat_16___sigaction14 -// compat_16___sigreturn14 -// compat_20_fhstatfs -// compat_20_fstatfs -// compat_20_getfsstat -// compat_20_statfs -// compat_30___fhstat30 -// compat_30___fstat13 -// compat_30___lstat13 -// compat_30___stat13 -// compat_30_fhopen -// compat_30_fhstat -// compat_30_fhstatvfs1 -// compat_30_getdents -// compat_30_getfh -// compat_30_ntp_gettime -// compat_30_socket -// compat_40_mount -// compat_43_fstat43 -// compat_43_lstat43 -// compat_43_oaccept -// compat_43_ocreat -// compat_43_oftruncate -// compat_43_ogetdirentries -// compat_43_ogetdtablesize -// compat_43_ogethostid -// compat_43_ogethostname -// compat_43_ogetkerninfo -// compat_43_ogetpagesize -// compat_43_ogetpeername -// compat_43_ogetrlimit -// compat_43_ogetsockname -// compat_43_okillpg -// compat_43_olseek -// compat_43_ommap -// compat_43_oquota -// compat_43_orecv -// compat_43_orecvfrom -// compat_43_orecvmsg -// compat_43_osend -// compat_43_osendmsg -// compat_43_osethostid -// compat_43_osethostname -// compat_43_osigblock -// compat_43_osigsetmask -// compat_43_osigstack -// compat_43_osigvec -// compat_43_otruncate -// compat_43_owait -// compat_43_stat43 -// execve -// extattr_delete_fd -// extattr_delete_file -// extattr_delete_link -// extattr_get_fd -// extattr_get_file -// extattr_get_link -// extattr_list_fd -// extattr_list_file -// extattr_list_link -// extattr_set_fd -// extattr_set_file -// extattr_set_link -// extattrctl -// fchroot -// fdatasync -// fgetxattr -// fktrace -// flistxattr -// fork -// fremovexattr -// fsetxattr -// fstatvfs1 -// fsync_range -// getcontext -// getitimer -// getvfsstat -// getxattr -// ktrace -// lchflags -// lchmod -// lfs_bmapv -// lfs_markv -// lfs_segclean -// lfs_segwait -// lgetxattr -// lio_listio -// listxattr -// llistxattr -// lremovexattr -// lseek -// lsetxattr -// lutimes -// madvise -// mincore -// minherit -// modctl -// mq_close -// mq_getattr -// mq_notify -// mq_open -// mq_receive -// mq_send -// mq_setattr -// mq_timedreceive -// mq_timedsend -// mq_unlink -// mremap -// msgget -// msgrcv -// msgsnd -// nfssvc -// ntp_adjtime -// pmc_control -// pmc_get_info -// pollts -// preadv -// profil -// pselect -// pset_assign -// pset_create -// pset_destroy -// ptrace -// pwritev -// quotactl -// rasctl -// readv -// reboot -// removexattr -// sa_enable -// sa_preempt -// sa_register -// sa_setconcurrency -// sa_stacks -// sa_yield -// sbrk -// sched_yield -// semconfig -// semget -// semop -// setcontext -// setitimer -// setxattr -// shmat -// shmdt -// shmget -// sstk -// statvfs1 -// swapctl -// sysarch -// syscall -// timer_create -// timer_delete -// timer_getoverrun -// timer_gettime -// timer_settime -// undelete -// utrace -// uuidgen -// vadvise -// vfork -// writev +const ( + mremapFixed = MAP_FIXED + mremapDontunmap = 0 + mremapMaymove = 0 +) + +//sys mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) = SYS_MREMAP + +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (uintptr, error) { + return mremapNetBSD(oldaddr, oldlength, newaddr, newlength, flags) +} diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/tools/vendor/golang.org/x/sys/unix/syscall_openbsd.go index f9c7a9663..6f34479b5 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/tools/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 @@ -311,80 +326,4 @@ func Uname(uname *Utsname) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - */ -// __getcwd -// __semctl -// __syscall -// __sysctl -// adjfreq -// break -// clock_getres -// clock_gettime -// clock_settime -// closefrom -// execve -// fhopen -// fhstat -// fhstatfs -// fork -// futimens -// getfh -// getgid -// getitimer -// getlogin -// getresgid -// getresuid -// getthrid -// ktrace -// lfs_bmapv -// lfs_markv -// lfs_segclean -// lfs_segwait -// mincore -// minherit -// mount -// mquery -// msgctl -// msgget -// msgrcv -// msgsnd -// nfssvc -// nnpfspioctl -// preadv -// profil -// pwritev -// quotactl -// readv -// reboot -// renameat -// rfork -// sched_yield -// semget -// semop -// setgroups -// setitimer -// setsockopt -// shmat -// shmctl -// shmdt -// shmget -// sigaction -// sigaltstack -// sigpending -// sigprocmask -// sigreturn -// sigsuspend -// sysarch -// syscall -// threxit -// thrsigdivert -// thrsleep -// thrwakeup -// vfork -// writev diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_solaris.go b/tools/vendor/golang.org/x/sys/unix/syscall_solaris.go index b600a289d..b99cfa134 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -698,38 +698,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) - n = int(r0) - if e1 != 0 { - err = e1 - } - return -} - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) - n = int(r0) - if e1 != 0 { - err = e1 - } - return -} - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - // Event Ports type fileObjCookie struct { diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_unix.go b/tools/vendor/golang.org/x/sys/unix/syscall_unix.go index 8e48c29ec..f6eda2705 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -147,6 +147,14 @@ func (m *mmapper) Munmap(data []byte) (err error) { return nil } +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + func Read(fd int, p []byte) (n int, err error) { n, err = read(fd, p) if raceenabled { @@ -541,6 +549,9 @@ func SetNonblock(fd int, nonblocking bool) (err error) { if err != nil { return err } + if (flag&O_NONBLOCK != 0) == nonblocking { + return nil + } if nonblocking { flag |= O_NONBLOCK } else { diff --git a/tools/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/tools/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d3d49ec3e..4596d041c 100644 --- a/tools/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/tools/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -192,7 +192,6 @@ func (cmsg *Cmsghdr) SetLen(length int) { //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys read(fd int, p []byte) (n int, err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys write(fd int, p []byte) (n int, err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = SYS___ACCEPT_A @@ -285,25 +284,11 @@ func Close(fd int) (err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - // Dummy function: there are no semantics for Madvise on z/OS func Madvise(b []byte, advice int) (err error) { return } -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux.go index 398c37e52..f9c7f479b 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/tools/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 @@ -2406,6 +2421,15 @@ const ( PR_PAC_GET_ENABLED_KEYS = 0x3d PR_PAC_RESET_KEYS = 0x36 PR_PAC_SET_ENABLED_KEYS = 0x3c + PR_RISCV_V_GET_CONTROL = 0x46 + PR_RISCV_V_SET_CONTROL = 0x45 + PR_RISCV_V_VSTATE_CTRL_CUR_MASK = 0x3 + PR_RISCV_V_VSTATE_CTRL_DEFAULT = 0x0 + PR_RISCV_V_VSTATE_CTRL_INHERIT = 0x10 + PR_RISCV_V_VSTATE_CTRL_MASK = 0x1f + PR_RISCV_V_VSTATE_CTRL_NEXT_MASK = 0xc + PR_RISCV_V_VSTATE_CTRL_OFF = 0x1 + PR_RISCV_V_VSTATE_CTRL_ON = 0x2 PR_SCHED_CORE = 0x3e PR_SCHED_CORE_CREATE = 0x1 PR_SCHED_CORE_GET = 0x0 @@ -2423,6 +2447,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 +2532,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 +2563,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 @@ -2802,6 +2830,23 @@ const ( RWF_SUPPORTED = 0x1f RWF_SYNC = 0x4 RWF_WRITE_LIFE_NOT_SET = 0x0 + SCHED_BATCH = 0x3 + SCHED_DEADLINE = 0x6 + SCHED_FIFO = 0x1 + SCHED_FLAG_ALL = 0x7f + SCHED_FLAG_DL_OVERRUN = 0x4 + SCHED_FLAG_KEEP_ALL = 0x18 + SCHED_FLAG_KEEP_PARAMS = 0x10 + SCHED_FLAG_KEEP_POLICY = 0x8 + SCHED_FLAG_RECLAIM = 0x2 + SCHED_FLAG_RESET_ON_FORK = 0x1 + SCHED_FLAG_UTIL_CLAMP = 0x60 + SCHED_FLAG_UTIL_CLAMP_MAX = 0x40 + SCHED_FLAG_UTIL_CLAMP_MIN = 0x20 + SCHED_IDLE = 0x5 + SCHED_NORMAL = 0x0 + SCHED_RESET_ON_FORK = 0x40000000 + SCHED_RR = 0x2 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d @@ -2967,6 +3012,7 @@ const ( SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_TLS = 0x11a + SOL_UDP = 0x11 SOL_X25 = 0x106 SOL_XDP = 0x11b SOMAXCONN = 0x1000 @@ -3071,7 +3117,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 +3283,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 +3298,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/tools/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index a46df0f1e..30aee00a5 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6cd4a3ea9..8ebfa5127 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -318,10 +327,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c7ebee24d..271a21cdc 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -324,10 +333,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9d5352c3e..910c330a3 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -314,10 +323,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 @@ -443,6 +454,7 @@ const ( TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 + TPIDR2_MAGIC = 0x54504902 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETDEVNETNS = 0x54e3 @@ -515,6 +527,7 @@ const ( XCASE = 0x4 XTABS = 0x1800 ZA_MAGIC = 0x54366345 + ZT_MAGIC = 0x5a544e01 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index f26a164f4..a640798c9 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -109,6 +118,8 @@ const ( IUCLC = 0x200 IXOFF = 0x1000 IXON = 0x400 + LASX_CTX_MAGIC = 0x41535801 + LSX_CTX_MAGIC = 0x53580001 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 @@ -308,10 +319,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 890bc3c9b..0d5925d34 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 549f26ac6..d72a00e0b 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index e0365e32c..02ba129f8 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index fdccce15c..8daa6dd96 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index b2205c83f..63c8fa2f7 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -372,10 +381,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 81aa5ad0f..930799ec1 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -376,10 +385,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 76807a1fd..8605a7dd7 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -376,10 +385,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index d4a5ab9e4..95a016f1c 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -305,10 +314,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 66e65db95..1ae0108f5 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -380,10 +389,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index f61925269..1bb7c6333 100644 --- a/tools/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/tools/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -30,22 +30,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -329,6 +338,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 @@ -371,10 +428,12 @@ const ( SO_NOFCS = 0x27 SO_OOBINLINE = 0x100 SO_PASSCRED = 0x2 + SO_PASSPIDFD = 0x55 SO_PASSSEC = 0x1f SO_PEEK_OFF = 0x26 SO_PEERCRED = 0x40 SO_PEERGROUPS = 0x3d + SO_PEERPIDFD = 0x56 SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x48 SO_PROTOCOL = 0x1028 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 9a257219d..d1d1d2331 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -817,28 +817,6 @@ func write(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, er := C.read(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) - n = int(r0) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, er := C.write(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) - n = int(r0) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Dup2(oldfd int, newfd int) (err error) { r0, er := C.dup2(C.int(oldfd), C.int(newfd)) if r0 == -1 && er != nil { diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index 6de80c20c..f99a18adc 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -762,28 +762,6 @@ func write(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, e1 := callread(fd, uintptr(unsafe.Pointer(p)), np) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, e1 := callwrite(fd, uintptr(unsafe.Pointer(p)), np) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Dup2(oldfd int, newfd int) (err error) { _, e1 := calldup2(oldfd, newfd) if e1 != 0 { diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 4037ccf7a..1cad561e9 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -725,6 +725,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 "/usr/lib/libSystem.B.dylib" + +// 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 { @@ -733,10 +739,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 "/usr/lib/libSystem.B.dylib" - // 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) { @@ -2410,28 +2412,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall_syscall(libc_fstat64_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2521,14 +2501,6 @@ func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { return } -func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - _, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - var libc_ptrace_trampoline_addr uintptr //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 4baaed0bc..8b8bb2840 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -5,703 +5,586 @@ TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fdopendir(SB) - GLOBL ·libc_fdopendir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB) TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgroups(SB) - GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgroups(SB) - GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_wait4(SB) - GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_accept(SB) - GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_bind(SB) - GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_connect(SB) - GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socket(SB) - GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockopt(SB) - GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsockopt(SB) - GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpeername(SB) - GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockname(SB) - GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shutdown(SB) - GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socketpair(SB) - GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvfrom(SB) - GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendto(SB) - GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvmsg(SB) - GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) - GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) - GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) - GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) - GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_poll(SB) - GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_madvise(SB) - GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlock(SB) - GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlockall(SB) - GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mprotect(SB) - GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_msync(SB) - GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) - GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) - GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_closedir(SB) - GLOBL ·libc_closedir_trampoline_addr(SB), RODATA, $8 DATA ·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB) TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readdir_r(SB) - GLOBL ·libc_readdir_r_trampoline_addr(SB), RODATA, $8 DATA ·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB) TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pipe(SB) - GLOBL ·libc_pipe_trampoline_addr(SB), RODATA, $8 DATA ·libc_pipe_trampoline_addr(SB)/8, $libc_pipe_trampoline<>(SB) TEXT libc_getxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getxattr(SB) - GLOBL ·libc_getxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_getxattr_trampoline_addr(SB)/8, $libc_getxattr_trampoline<>(SB) TEXT libc_fgetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fgetxattr(SB) - GLOBL ·libc_fgetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fgetxattr_trampoline_addr(SB)/8, $libc_fgetxattr_trampoline<>(SB) TEXT libc_setxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setxattr(SB) - GLOBL ·libc_setxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_setxattr_trampoline_addr(SB)/8, $libc_setxattr_trampoline<>(SB) TEXT libc_fsetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsetxattr(SB) - GLOBL ·libc_fsetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsetxattr_trampoline_addr(SB)/8, $libc_fsetxattr_trampoline<>(SB) TEXT libc_removexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_removexattr(SB) - GLOBL ·libc_removexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_removexattr_trampoline_addr(SB)/8, $libc_removexattr_trampoline<>(SB) TEXT libc_fremovexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fremovexattr(SB) - GLOBL ·libc_fremovexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fremovexattr_trampoline_addr(SB)/8, $libc_fremovexattr_trampoline<>(SB) TEXT libc_listxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listxattr(SB) - GLOBL ·libc_listxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_listxattr_trampoline_addr(SB)/8, $libc_listxattr_trampoline<>(SB) TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) - GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) - GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kill(SB) - GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) - GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) - GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmat(SB) - GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmctl(SB) - GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmdt(SB) - GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmget(SB) - GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) - GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_adjtime(SB) - GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chdir(SB) - GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chflags(SB) - GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chmod(SB) - GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chown(SB) - GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) - GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clock_gettime(SB) - GLOBL ·libc_clock_gettime_trampoline_addr(SB), RODATA, $8 DATA ·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB) TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_close(SB) - GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) TEXT libc_clonefile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefile(SB) - GLOBL ·libc_clonefile_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefile_trampoline_addr(SB)/8, $libc_clonefile_trampoline<>(SB) TEXT libc_clonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefileat(SB) - GLOBL ·libc_clonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefileat_trampoline_addr(SB)/8, $libc_clonefileat_trampoline<>(SB) TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup(SB) - GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup2(SB) - GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) TEXT libc_exchangedata_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exchangedata(SB) - GLOBL ·libc_exchangedata_trampoline_addr(SB), RODATA, $8 DATA ·libc_exchangedata_trampoline_addr(SB)/8, $libc_exchangedata_trampoline<>(SB) TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exit(SB) - GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_faccessat(SB) - GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchdir(SB) - GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchflags(SB) - GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmod(SB) - GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmodat(SB) - GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchown(SB) - GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchownat(SB) - GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) TEXT libc_fclonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fclonefileat(SB) - GLOBL ·libc_fclonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fclonefileat_trampoline_addr(SB)/8, $libc_fclonefileat_trampoline<>(SB) TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flock(SB) - GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fpathconf(SB) - GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsync(SB) - GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ftruncate(SB) - GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getcwd(SB) - GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) TEXT libc_getdtablesize_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getdtablesize(SB) - GLOBL ·libc_getdtablesize_trampoline_addr(SB), RODATA, $8 DATA ·libc_getdtablesize_trampoline_addr(SB)/8, $libc_getdtablesize_trampoline<>(SB) TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getegid(SB) - GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_geteuid(SB) - GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgid(SB) - GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgid(SB) - GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgrp(SB) - GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpid(SB) - GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getppid(SB) - GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpriority(SB) - GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrlimit(SB) - GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrusage(SB) - GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsid(SB) - GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) - GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getuid(SB) - GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_issetugid(SB) - GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kqueue(SB) - GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lchown(SB) - GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_link(SB) - GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_linkat(SB) - GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listen(SB) - GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdir(SB) - GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdirat(SB) - GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkfifo(SB) - GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mknod(SB) - GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mount(SB) - GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) - GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_openat(SB) - GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pathconf(SB) - GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pread(SB) - GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) - GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_read(SB) - GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) - GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlinkat(SB) - GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rename(SB) - GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_renameat(SB) - GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_revoke(SB) - GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rmdir(SB) - GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lseek(SB) - GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_select(SB) - GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) @@ -712,192 +595,160 @@ DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) - GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_seteuid(SB) - GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgid(SB) - GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setlogin(SB) - GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpgid(SB) - GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpriority(SB) - GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) TEXT libc_setprivexec_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setprivexec(SB) - GLOBL ·libc_setprivexec_trampoline_addr(SB), RODATA, $8 DATA ·libc_setprivexec_trampoline_addr(SB)/8, $libc_setprivexec_trampoline<>(SB) TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setregid(SB) - GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setreuid(SB) - GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) - GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_settimeofday(SB) - GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setuid(SB) - GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlink(SB) - GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlinkat(SB) - GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sync(SB) - GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_truncate(SB) - GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_umask(SB) - GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) TEXT libc_undelete_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_undelete(SB) - GLOBL ·libc_undelete_trampoline_addr(SB), RODATA, $8 DATA ·libc_undelete_trampoline_addr(SB)/8, $libc_undelete_trampoline<>(SB) TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlink(SB) - GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlinkat(SB) - GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) - GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_write(SB) - GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) - GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) TEXT libc_fstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstat64(SB) - GLOBL ·libc_fstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstat64_trampoline_addr(SB)/8, $libc_fstat64_trampoline<>(SB) TEXT libc_fstatat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatat64(SB) - GLOBL ·libc_fstatat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatat64_trampoline_addr(SB)/8, $libc_fstatat64_trampoline<>(SB) TEXT libc_fstatfs64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) - GLOBL ·libc_fstatfs64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatfs64_trampoline_addr(SB)/8, $libc_fstatfs64_trampoline<>(SB) TEXT libc_getfsstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) - GLOBL ·libc_getfsstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_getfsstat64_trampoline_addr(SB)/8, $libc_getfsstat64_trampoline<>(SB) TEXT libc_lstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lstat64(SB) - GLOBL ·libc_lstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_lstat64_trampoline_addr(SB)/8, $libc_lstat64_trampoline<>(SB) TEXT libc_ptrace_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ptrace(SB) - GLOBL ·libc_ptrace_trampoline_addr(SB), RODATA, $8 DATA ·libc_ptrace_trampoline_addr(SB)/8, $libc_ptrace_trampoline<>(SB) TEXT libc_stat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_stat64(SB) - GLOBL ·libc_stat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_stat64_trampoline_addr(SB)/8, $libc_stat64_trampoline<>(SB) TEXT libc_statfs64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_statfs64(SB) - GLOBL ·libc_statfs64_trampoline_addr(SB), RODATA, $8 DATA ·libc_statfs64_trampoline_addr(SB)/8, $libc_statfs64_trampoline<>(SB) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 51d6f3fb2..b18edbd0e 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -725,6 +725,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 "/usr/lib/libSystem.B.dylib" + +// 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 { @@ -733,10 +739,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 "/usr/lib/libSystem.B.dylib" - // 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) { @@ -2410,28 +2412,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2521,14 +2501,6 @@ func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { return } -func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - _, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - var libc_ptrace_trampoline_addr uintptr //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index c3b82c037..08362c1ab 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -5,703 +5,586 @@ TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fdopendir(SB) - GLOBL ·libc_fdopendir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB) TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgroups(SB) - GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgroups(SB) - GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_wait4(SB) - GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_accept(SB) - GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_bind(SB) - GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_connect(SB) - GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socket(SB) - GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockopt(SB) - GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsockopt(SB) - GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpeername(SB) - GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockname(SB) - GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shutdown(SB) - GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socketpair(SB) - GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvfrom(SB) - GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendto(SB) - GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvmsg(SB) - GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) - GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) - GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) - GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) - GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_poll(SB) - GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_madvise(SB) - GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlock(SB) - GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlockall(SB) - GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mprotect(SB) - GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_msync(SB) - GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) - GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) - GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_closedir(SB) - GLOBL ·libc_closedir_trampoline_addr(SB), RODATA, $8 DATA ·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB) TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readdir_r(SB) - GLOBL ·libc_readdir_r_trampoline_addr(SB), RODATA, $8 DATA ·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB) TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pipe(SB) - GLOBL ·libc_pipe_trampoline_addr(SB), RODATA, $8 DATA ·libc_pipe_trampoline_addr(SB)/8, $libc_pipe_trampoline<>(SB) TEXT libc_getxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getxattr(SB) - GLOBL ·libc_getxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_getxattr_trampoline_addr(SB)/8, $libc_getxattr_trampoline<>(SB) TEXT libc_fgetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fgetxattr(SB) - GLOBL ·libc_fgetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fgetxattr_trampoline_addr(SB)/8, $libc_fgetxattr_trampoline<>(SB) TEXT libc_setxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setxattr(SB) - GLOBL ·libc_setxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_setxattr_trampoline_addr(SB)/8, $libc_setxattr_trampoline<>(SB) TEXT libc_fsetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsetxattr(SB) - GLOBL ·libc_fsetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsetxattr_trampoline_addr(SB)/8, $libc_fsetxattr_trampoline<>(SB) TEXT libc_removexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_removexattr(SB) - GLOBL ·libc_removexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_removexattr_trampoline_addr(SB)/8, $libc_removexattr_trampoline<>(SB) TEXT libc_fremovexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fremovexattr(SB) - GLOBL ·libc_fremovexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fremovexattr_trampoline_addr(SB)/8, $libc_fremovexattr_trampoline<>(SB) TEXT libc_listxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listxattr(SB) - GLOBL ·libc_listxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_listxattr_trampoline_addr(SB)/8, $libc_listxattr_trampoline<>(SB) TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) - GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) - GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kill(SB) - GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) - GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) - GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmat(SB) - GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmctl(SB) - GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmdt(SB) - GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmget(SB) - GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) - GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_adjtime(SB) - GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chdir(SB) - GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chflags(SB) - GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chmod(SB) - GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chown(SB) - GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) - GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clock_gettime(SB) - GLOBL ·libc_clock_gettime_trampoline_addr(SB), RODATA, $8 DATA ·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB) TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_close(SB) - GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) TEXT libc_clonefile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefile(SB) - GLOBL ·libc_clonefile_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefile_trampoline_addr(SB)/8, $libc_clonefile_trampoline<>(SB) TEXT libc_clonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefileat(SB) - GLOBL ·libc_clonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefileat_trampoline_addr(SB)/8, $libc_clonefileat_trampoline<>(SB) TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup(SB) - GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup2(SB) - GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) TEXT libc_exchangedata_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exchangedata(SB) - GLOBL ·libc_exchangedata_trampoline_addr(SB), RODATA, $8 DATA ·libc_exchangedata_trampoline_addr(SB)/8, $libc_exchangedata_trampoline<>(SB) TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exit(SB) - GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_faccessat(SB) - GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchdir(SB) - GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchflags(SB) - GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmod(SB) - GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmodat(SB) - GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchown(SB) - GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchownat(SB) - GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) TEXT libc_fclonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fclonefileat(SB) - GLOBL ·libc_fclonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fclonefileat_trampoline_addr(SB)/8, $libc_fclonefileat_trampoline<>(SB) TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flock(SB) - GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fpathconf(SB) - GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsync(SB) - GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ftruncate(SB) - GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getcwd(SB) - GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) TEXT libc_getdtablesize_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getdtablesize(SB) - GLOBL ·libc_getdtablesize_trampoline_addr(SB), RODATA, $8 DATA ·libc_getdtablesize_trampoline_addr(SB)/8, $libc_getdtablesize_trampoline<>(SB) TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getegid(SB) - GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_geteuid(SB) - GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgid(SB) - GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgid(SB) - GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgrp(SB) - GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpid(SB) - GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getppid(SB) - GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpriority(SB) - GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrlimit(SB) - GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrusage(SB) - GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsid(SB) - GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) - GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getuid(SB) - GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_issetugid(SB) - GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kqueue(SB) - GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lchown(SB) - GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_link(SB) - GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_linkat(SB) - GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listen(SB) - GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdir(SB) - GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdirat(SB) - GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkfifo(SB) - GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mknod(SB) - GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mount(SB) - GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) - GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_openat(SB) - GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pathconf(SB) - GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pread(SB) - GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) - GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_read(SB) - GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) - GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlinkat(SB) - GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rename(SB) - GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_renameat(SB) - GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_revoke(SB) - GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rmdir(SB) - GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lseek(SB) - GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_select(SB) - GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) @@ -712,192 +595,160 @@ DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) - GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_seteuid(SB) - GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgid(SB) - GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setlogin(SB) - GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpgid(SB) - GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpriority(SB) - GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) TEXT libc_setprivexec_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setprivexec(SB) - GLOBL ·libc_setprivexec_trampoline_addr(SB), RODATA, $8 DATA ·libc_setprivexec_trampoline_addr(SB)/8, $libc_setprivexec_trampoline<>(SB) TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setregid(SB) - GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setreuid(SB) - GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) - GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_settimeofday(SB) - GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setuid(SB) - GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlink(SB) - GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlinkat(SB) - GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sync(SB) - GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_truncate(SB) - GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_umask(SB) - GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) TEXT libc_undelete_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_undelete(SB) - GLOBL ·libc_undelete_trampoline_addr(SB), RODATA, $8 DATA ·libc_undelete_trampoline_addr(SB)/8, $libc_undelete_trampoline<>(SB) TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlink(SB) - GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlinkat(SB) - GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) - GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_write(SB) - GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) - GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstat(SB) - GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatat(SB) - GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatfs(SB) - GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getfsstat(SB) - GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lstat(SB) - GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) TEXT libc_ptrace_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ptrace(SB) - GLOBL ·libc_ptrace_trampoline_addr(SB), RODATA, $8 DATA ·libc_ptrace_trampoline_addr(SB)/8, $libc_ptrace_trampoline<>(SB) TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_stat(SB) - GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_statfs(SB) - GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 0eabac7ad..0c67df64a 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1642,28 +1642,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index ee313eb00..e6e05d145 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 4c986e448..7508accac 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 555216944..7b56aead4 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 67a226fbf..cc623dcaa 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go index f0b9ddaaa..581849197 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go index b57c7050d..6be25cd19 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go @@ -40,7 +40,7 @@ func readv(fd int, iovs []Iovec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procreadv)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -55,7 +55,7 @@ func preadv(fd int, iovs []Iovec, off int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpreadv)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), uintptr(off), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -70,7 +70,7 @@ func writev(fd int, iovs []Iovec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwritev)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -85,7 +85,7 @@ func pwritev(fd int, iovs []Iovec, off int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwritev)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), uintptr(off), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -96,7 +96,7 @@ func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept4)), 4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_linux.go index da63d9d78..1ff3aec74 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1356,7 +1356,7 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { +func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { @@ -1734,28 +1734,6 @@ func exitThread(code int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func readv(fd int, iovs []Iovec) (n int, err error) { var _p0 unsafe.Pointer if len(iovs) > 0 { @@ -1868,6 +1846,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 { @@ -2172,3 +2161,37 @@ 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func schedSetattr(pid int, attr *SchedAttr, flags uint) (err error) { + _, _, e1 := Syscall(SYS_SCHED_SETATTR, uintptr(pid), uintptr(unsafe.Pointer(attr)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) { + _, _, e1 := Syscall6(SYS_SCHED_GETATTR, uintptr(pid), uintptr(unsafe.Pointer(attr)), uintptr(size), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 0b2923958..0ab4f2ed7 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -531,3 +531,19 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) { + var _p0 unsafe.Pointer + if len(pairs) > 0 { + _p0 = unsafe.Pointer(&pairs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_RISCV_HWPROBE, uintptr(_p0), uintptr(len(pairs)), uintptr(cpuCount), uintptr(unsafe.Pointer(cpus)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index cdb2af5ae..2df3c5bac 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 9d25f76b0..a60556bab 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index d3f803516..9f788917a 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 887188a52..82a4cb2dc 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 6699a783e..66b3b6456 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 04f0de34b..3dcacd30d 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 1e775fe05..c5c4cc112 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/tools/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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 27b6f4df7..2763620b0 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 7f6427899..93bfbb328 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index b797045fd..c92231404 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 756ef7b17..a107b8fda 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index a87126622..a6bc32c92 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index 7bc2e24eb..c427de509 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index 05d4bffd7..b4e7bceab 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index 739be6217..60c1a99ae 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 74a25f8d6..ca3f76600 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 7d95a1978..52eba360f 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/tools/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 { @@ -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) { @@ -2189,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index 990be2457..477a7d5b2 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/tools/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 diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 609d1c598..b40189464 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -436,7 +436,7 @@ func pipe(p *[2]_C_int) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -446,7 +446,7 @@ func pipe(p *[2]_C_int) (n int, err error) { func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -456,7 +456,7 @@ func pipe2(p *[2]_C_int, flags int) (err error) { func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -471,7 +471,7 @@ func Getcwd(buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -482,7 +482,7 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -492,7 +492,7 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -503,7 +503,7 @@ func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int32(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -518,7 +518,7 @@ func gethostname(buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -533,7 +533,7 @@ func utimes(path string, times *[2]Timeval) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -548,7 +548,7 @@ func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -559,7 +559,7 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -569,7 +569,7 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -580,7 +580,7 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -591,7 +591,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -602,7 +602,7 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -612,7 +612,7 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func acct(path *byte) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -647,7 +647,7 @@ 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 { - err = e1 + err = errnoErr(e1) } return } @@ -658,7 +658,7 @@ 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 { - err = e1 + err = errnoErr(e1) } return } @@ -669,7 +669,7 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -684,7 +684,7 @@ func Access(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -694,7 +694,7 @@ func Access(path string, mode uint32) (err error) { func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -709,7 +709,7 @@ func Chdir(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -724,7 +724,7 @@ func Chmod(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -739,7 +739,7 @@ func Chown(path string, uid int, gid int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -754,7 +754,7 @@ func Chroot(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -764,7 +764,7 @@ func Chroot(path string) (err error) { func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClockGettime)), 2, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -774,7 +774,7 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func Close(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -790,7 +790,7 @@ func Creat(path string, mode uint32) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -801,7 +801,7 @@ func Dup(fd int) (nfd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) nfd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -811,7 +811,7 @@ func Dup(fd int) (nfd int, err error) { func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -833,7 +833,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFaccessat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -843,7 +843,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func Fchdir(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -853,7 +853,7 @@ func Fchdir(fd int) (err error) { func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -868,7 +868,7 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -878,7 +878,7 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -893,7 +893,7 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -903,7 +903,7 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func Fdatasync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -913,7 +913,7 @@ func Fdatasync(fd int) (err error) { func Flock(fd int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -924,7 +924,7 @@ func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -934,7 +934,7 @@ func Fpathconf(fd int, name int) (val int, err error) { func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -949,7 +949,7 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -959,7 +959,7 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -974,7 +974,7 @@ func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1001,7 +1001,7 @@ func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1012,7 +1012,7 @@ func Getpgrp() (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1047,7 +1047,7 @@ func Getpriority(which int, who int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1057,7 +1057,7 @@ func Getpriority(which int, who int) (n int, err error) { func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1067,7 +1067,7 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1078,7 +1078,7 @@ func Getsid(pid int) (sid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetsid)), 1, uintptr(pid), 0, 0, 0, 0, 0) sid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1088,7 +1088,7 @@ func Getsid(pid int) (sid int, err error) { func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1106,7 +1106,7 @@ func Getuid() (uid int) { func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1121,7 +1121,7 @@ func Lchown(path string, uid int, gid int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1141,7 +1141,7 @@ func Link(path string, link string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1151,7 +1151,7 @@ func Link(path string, link string) (err error) { func Listen(s int, backlog int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1166,7 +1166,7 @@ func Lstat(path string, stat *Stat_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1180,7 +1180,7 @@ func Madvise(b []byte, advice int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1195,7 +1195,7 @@ func Mkdir(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1210,7 +1210,7 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1225,7 +1225,7 @@ func Mkfifo(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1240,7 +1240,7 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1255,7 +1255,7 @@ func Mknod(path string, mode uint32, dev int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1270,7 +1270,7 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1284,7 +1284,7 @@ func Mlock(b []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1294,7 +1294,7 @@ func Mlock(b []byte) (err error) { func Mlockall(flags int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1308,7 +1308,7 @@ func Mprotect(b []byte, prot int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1322,7 +1322,7 @@ func Msync(b []byte, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1336,7 +1336,7 @@ func Munlock(b []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1346,7 +1346,7 @@ func Munlock(b []byte) (err error) { func Munlockall() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1356,7 +1356,7 @@ func Munlockall() (err error) { func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1372,7 +1372,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1388,7 +1388,7 @@ func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1404,7 +1404,7 @@ func Pathconf(path string, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1414,7 +1414,7 @@ func Pathconf(path string, name int) (val int, err error) { func Pause() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1429,7 +1429,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1444,7 +1444,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1459,7 +1459,7 @@ func read(fd int, p []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1479,7 +1479,7 @@ func Readlink(path string, buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1499,7 +1499,7 @@ func Rename(from string, to string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1519,7 +1519,7 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1534,7 +1534,7 @@ func Rmdir(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1545,7 +1545,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) newoffset = int64(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1556,7 +1556,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1566,7 +1566,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func Setegid(egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1576,7 +1576,7 @@ func Setegid(egid int) (err error) { func Seteuid(euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1586,7 +1586,7 @@ func Seteuid(euid int) (err error) { func Setgid(gid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1600,7 +1600,7 @@ func Sethostname(p []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1610,7 +1610,7 @@ func Sethostname(p []byte) (err error) { func Setpgid(pid int, pgid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1620,7 +1620,7 @@ func Setpgid(pid int, pgid int) (err error) { func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1630,7 +1630,7 @@ func Setpriority(which int, who int, prio int) (err error) { func Setregid(rgid int, egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1640,7 +1640,7 @@ func Setregid(rgid int, egid int) (err error) { func Setreuid(ruid int, euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1651,7 +1651,7 @@ func Setsid() (pid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1661,7 +1661,7 @@ func Setsid() (pid int, err error) { func Setuid(uid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1671,7 +1671,7 @@ func Setuid(uid int) (err error) { func Shutdown(s int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1686,7 +1686,7 @@ func Stat(path string, stat *Stat_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1701,7 +1701,7 @@ func Statvfs(path string, vfsstat *Statvfs_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1721,7 +1721,7 @@ func Symlink(path string, link string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1731,7 +1731,7 @@ func Symlink(path string, link string) (err error) { func Sync() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1742,7 +1742,7 @@ func Sysconf(which int) (n int64, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSysconf)), 1, uintptr(which), 0, 0, 0, 0, 0) n = int64(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1753,7 +1753,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) ticks = uintptr(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1768,7 +1768,7 @@ func Truncate(path string, length int64) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1778,7 +1778,7 @@ func Truncate(path string, length int64) (err error) { func Fsync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1788,7 +1788,7 @@ func Fsync(fd int) (err error) { func Ftruncate(fd int, length int64) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1806,7 +1806,7 @@ func Umask(mask int) (oldmask int) { func Uname(buf *Utsname) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1821,7 +1821,7 @@ func Unmount(target string, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1836,7 +1836,7 @@ func Unlink(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1851,7 +1851,7 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1861,7 +1861,7 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1876,7 +1876,7 @@ func Utime(path string, buf *Utimbuf) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1886,7 +1886,7 @@ func Utime(path string, buf *Utimbuf) (err error) { func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1896,7 +1896,7 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1907,7 +1907,7 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1917,7 +1917,7 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1928,7 +1928,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendfile)), 4, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1942,7 +1942,7 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1953,7 +1953,7 @@ func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1963,7 +1963,7 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1978,7 +1978,7 @@ func write(fd int, p []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1988,7 +1988,7 @@ func write(fd int, p []byte) (n int, err error) { func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1998,7 +1998,7 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2008,7 +2008,7 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2023,7 +2023,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2034,7 +2034,7 @@ func port_create() (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_create)), 0, 0, 0, 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2045,7 +2045,7 @@ func port_associate(port int, source int, object uintptr, events int, user *byte r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_associate)), 5, uintptr(port), uintptr(source), uintptr(object), uintptr(events), uintptr(unsafe.Pointer(user)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2056,7 +2056,7 @@ func port_dissociate(port int, source int, object uintptr) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_dissociate)), 3, uintptr(port), uintptr(source), uintptr(object), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2067,7 +2067,7 @@ func port_get(port int, pe *portEvent, timeout *Timespec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_get)), 3, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(unsafe.Pointer(timeout)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2078,7 +2078,7 @@ func port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Times r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_getn)), 5, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(max), uintptr(unsafe.Pointer(nget)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2088,7 +2088,7 @@ func port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Times func putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procputmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2098,7 +2098,7 @@ func putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) { func getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(unsafe.Pointer(flags)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } diff --git a/tools/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/tools/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go index c31681743..1d8fe1d4b 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +++ b/tools/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -40,17 +40,6 @@ func read(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index c9c4ad031..9862853d3 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -447,4 +447,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 12ff3417c..8901f0f4e 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -369,4 +369,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index c3fb5e77a..6902c37ee 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -411,4 +411,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 358c847a4..a6d3dff81 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -314,4 +314,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index 81c4849b1..b18f3f710 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -308,4 +308,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 202a57e90..0302e5e3d 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -431,4 +431,5 @@ const ( SYS_PROCESS_MRELEASE = 4448 SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 + SYS_CACHESTAT = 4451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 1fbceb52d..6693ba4a0 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -361,4 +361,5 @@ const ( SYS_PROCESS_MRELEASE = 5448 SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 + SYS_CACHESTAT = 5451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index b4ffb7a20..fd93f4987 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -361,4 +361,5 @@ const ( SYS_PROCESS_MRELEASE = 5448 SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 + SYS_CACHESTAT = 5451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 867985f9b..760ddcadc 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -431,4 +431,5 @@ const ( SYS_PROCESS_MRELEASE = 4448 SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 + SYS_CACHESTAT = 4451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index a8cce69ed..cff2b2555 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -438,4 +438,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index d44c5b39d..a4b2405d0 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -410,4 +410,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 4214dd9c0..aca54b4e3 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -410,4 +410,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 3e594a8c0..9d1738d64 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -251,6 +251,8 @@ const ( SYS_ACCEPT4 = 242 SYS_RECVMMSG = 243 SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_RISCV_HWPROBE = 258 + SYS_RISCV_FLUSH_ICACHE = 259 SYS_WAIT4 = 260 SYS_PRLIMIT64 = 261 SYS_FANOTIFY_INIT = 262 @@ -313,4 +315,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 7ea465204..022878dc8 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -372,7 +372,9 @@ 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 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 92f628ef4..4100a761c 100644 --- a/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/tools/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -389,4 +389,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/tools/vendor/golang.org/x/sys/unix/ztypes_linux.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux.go index ca84727cf..18aa70b42 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/tools/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -866,6 +866,11 @@ const ( POLLNVAL = 0x20 ) +type sigset_argpack struct { + ss *Sigset_t + ssLen uintptr +} + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1538,6 +1543,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 +1977,7 @@ const ( NFT_MSG_GETFLOWTABLE = 0x17 NFT_MSG_DELFLOWTABLE = 0x18 NFT_MSG_GETRULE_RESET = 0x19 - NFT_MSG_MAX = 0x1a + NFT_MSG_MAX = 0x22 NFTA_LIST_UNSPEC = 0x0 NFTA_LIST_ELEM = 0x1 NFTA_HOOK_UNSPEC = 0x0 @@ -2555,6 +2564,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 +2580,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 +2625,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 +2636,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 +2671,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 +2710,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 +2723,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 +2763,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 +2778,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 +2803,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 +2876,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 +2889,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 +3660,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 +3700,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 +3804,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 +3842,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 +4499,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 = 0x146 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4673,7 +4728,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 +4869,7 @@ const ( NL80211_CMD_LEAVE_IBSS = 0x2c NL80211_CMD_LEAVE_MESH = 0x45 NL80211_CMD_LEAVE_OCB = 0x6d - NL80211_CMD_MAX = 0x98 + NL80211_CMD_MAX = 0x9a NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 NL80211_CMD_MODIFY_LINK_STA = 0x97 NL80211_CMD_NAN_MATCH = 0x78 @@ -5448,7 +5503,7 @@ const ( NL80211_RATE_INFO_HE_RU_ALLOC_52 = 0x1 NL80211_RATE_INFO_HE_RU_ALLOC_996 = 0x5 NL80211_RATE_INFO_HE_RU_ALLOC = 0x11 - NL80211_RATE_INFO_MAX = 0x16 + NL80211_RATE_INFO_MAX = 0x1d NL80211_RATE_INFO_MCS = 0x2 NL80211_RATE_INFO_SHORT_GI = 0x4 NL80211_RATE_INFO_VHT_MCS = 0x6 @@ -5795,6 +5850,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 +5861,25 @@ 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 ) + +type SchedAttr struct { + Size uint32 + Policy uint32 + Flags uint64 + Nice int32 + Priority uint32 + Runtime uint64 + Deadline uint64 + Period uint64 + Util_min uint32 + Util_max uint32 +} + +const SizeofSchedAttr = 0x38 diff --git a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4ecc1495c..6d8acbcc5 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 34fddff96..59293c688 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 3b14a6031..40cfa38c2 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0517651ab..055bc4216 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 3b0c51813..f28affbc6 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index fccdf4dd0..9d71e7ccd 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 500de8fc0..fd5ccd332 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index d0434cd2c..7704de77a 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 84206ba53..df00b8757 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index ab078cf1f..0942840db 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 42eb2c4ce..034874395 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 31304a4e8..bad067047 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c311f9612..1b4c97c32 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/tools/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 @@ -716,3 +718,30 @@ type SysvShmDesc struct { _ uint64 _ uint64 } + +type RISCVHWProbePairs struct { + Key int64 + Value uint64 +} + +const ( + RISCV_HWPROBE_KEY_MVENDORID = 0x0 + RISCV_HWPROBE_KEY_MARCHID = 0x1 + RISCV_HWPROBE_KEY_MIMPID = 0x2 + RISCV_HWPROBE_KEY_BASE_BEHAVIOR = 0x3 + RISCV_HWPROBE_BASE_BEHAVIOR_IMA = 0x1 + RISCV_HWPROBE_KEY_IMA_EXT_0 = 0x4 + RISCV_HWPROBE_IMA_FD = 0x1 + RISCV_HWPROBE_IMA_C = 0x2 + RISCV_HWPROBE_IMA_V = 0x4 + RISCV_HWPROBE_EXT_ZBA = 0x8 + RISCV_HWPROBE_EXT_ZBB = 0x10 + RISCV_HWPROBE_EXT_ZBS = 0x20 + RISCV_HWPROBE_KEY_CPUPERF_0 = 0x5 + RISCV_HWPROBE_MISALIGNED_UNKNOWN = 0x0 + RISCV_HWPROBE_MISALIGNED_EMULATED = 0x1 + RISCV_HWPROBE_MISALIGNED_SLOW = 0x2 + RISCV_HWPROBE_MISALIGNED_FAST = 0x3 + RISCV_HWPROBE_MISALIGNED_UNSUPPORTED = 0x4 + RISCV_HWPROBE_MISALIGNED_MASK = 0x7 +) diff --git a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index bba3cefac..aa268d025 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/tools/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/tools/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/tools/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index ad8a01380..444045b6c 100644 --- a/tools/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/tools/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/tools/vendor/golang.org/x/sys/windows/env_windows.go b/tools/vendor/golang.org/x/sys/windows/env_windows.go index 92ac05ff4..b8ad19250 100644 --- a/tools/vendor/golang.org/x/sys/windows/env_windows.go +++ b/tools/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/tools/vendor/golang.org/x/sys/windows/exec_windows.go b/tools/vendor/golang.org/x/sys/windows/exec_windows.go index 75980fd44..9cabbb694 100644 --- a/tools/vendor/golang.org/x/sys/windows/exec_windows.go +++ b/tools/vendor/golang.org/x/sys/windows/exec_windows.go @@ -22,7 +22,7 @@ import ( // but only if there is space or tab inside s. func EscapeArg(s string) string { if len(s) == 0 { - return "\"\"" + return `""` } n := len(s) hasSpace := false @@ -35,7 +35,7 @@ func EscapeArg(s string) string { } } if hasSpace { - n += 2 + n += 2 // Reserve space for quotes. } if n == len(s) { return s @@ -82,36 +82,106 @@ func EscapeArg(s string) string { // in CreateProcess's CommandLine argument, CreateService/ChangeServiceConfig's BinaryPathName argument, // or any program that uses CommandLineToArgv. func ComposeCommandLine(args []string) string { - var commandLine string - for i := range args { - if i > 0 { - commandLine += " " + if len(args) == 0 { + return "" + } + + // Per https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw: + // “This function accepts command lines that contain a program name; the + // program name can be enclosed in quotation marks or not.†+ // + // Unfortunately, it provides no means of escaping interior quotation marks + // within that program name, and we have no way to report them here. + prog := args[0] + mustQuote := len(prog) == 0 + for i := 0; i < len(prog); i++ { + c := prog[i] + if c <= ' ' || (c == '"' && i == 0) { + // Force quotes for not only the ASCII space and tab as described in the + // MSDN article, but also ASCII control characters. + // The documentation for CommandLineToArgvW doesn't say what happens when + // the first argument is not a valid program name, but it empirically + // seems to drop unquoted control characters. + mustQuote = true + break + } + } + var commandLine []byte + if mustQuote { + commandLine = make([]byte, 0, len(prog)+2) + commandLine = append(commandLine, '"') + for i := 0; i < len(prog); i++ { + c := prog[i] + if c == '"' { + // This quote would interfere with our surrounding quotes. + // We have no way to report an error, so just strip out + // the offending character instead. + continue + } + commandLine = append(commandLine, c) + } + commandLine = append(commandLine, '"') + } else { + if len(args) == 1 { + // args[0] is a valid command line representing itself. + // No need to allocate a new slice or string for it. + return prog } - commandLine += EscapeArg(args[i]) + commandLine = []byte(prog) } - return commandLine + + for _, arg := range args[1:] { + commandLine = append(commandLine, ' ') + // TODO(bcmills): since we're already appending to a slice, it would be nice + // to avoid the intermediate allocations of EscapeArg. + // Perhaps we can factor out an appendEscapedArg function. + commandLine = append(commandLine, EscapeArg(arg)...) + } + return string(commandLine) } // 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 an 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 } defer LocalFree(Handle(unsafe.Pointer(argv))) + var args []string - for _, v := range (*argv)[:argc] { - args = append(args, UTF16ToString((*v)[:])) + for _, p := range unsafe.Slice(argv, argc) { + args = append(args, UTF16PtrToString(p)) } return args, nil } +// CommandLineToArgv parses a Unicode command line string and sets +// argc to the number of parsed arguments. +// +// The returned memory should be freed using a single call to LocalFree. +// +// Note that although the return type of CommandLineToArgv indicates 8192 +// entries of up to 8192 characters each, the actual count of parsed arguments +// may exceed 8192, and the documentation for CommandLineToArgvW does not mention +// any bound on the lengths of the individual argument strings. +// (See https://go.dev/issue/63236.) +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + argp, err := commandLineToArgv(cmd, argc) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(argp)) + return argv, err +} + func CloseOnExec(fd Handle) { SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) } diff --git a/tools/vendor/golang.org/x/sys/windows/security_windows.go b/tools/vendor/golang.org/x/sys/windows/security_windows.go index d414ef13b..26be94a8a 100644 --- a/tools/vendor/golang.org/x/sys/windows/security_windows.go +++ b/tools/vendor/golang.org/x/sys/windows/security_windows.go @@ -7,8 +7,6 @@ package windows import ( "syscall" "unsafe" - - "golang.org/x/sys/internal/unsafeheader" ) const ( @@ -1341,21 +1339,14 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() sdLen = min } - var src []byte - h := (*unsafeheader.Slice)(unsafe.Pointer(&src)) - h.Data = unsafe.Pointer(selfRelativeSD) - h.Len = sdLen - h.Cap = sdLen - + src := unsafe.Slice((*byte)(unsafe.Pointer(selfRelativeSD)), sdLen) + // SECURITY_DESCRIPTOR has pointers in it, which means checkptr expects for it to + // be aligned properly. When we're copying a Windows-allocated struct to a + // Go-allocated one, make sure that the Go allocation is aligned to the + // pointer size. const psize = int(unsafe.Sizeof(uintptr(0))) - - var dst []byte - h = (*unsafeheader.Slice)(unsafe.Pointer(&dst)) alloc := make([]uintptr, (sdLen+psize-1)/psize) - h.Data = (*unsafeheader.Slice)(unsafe.Pointer(&alloc)).Data - h.Len = sdLen - h.Cap = sdLen - + dst := unsafe.Slice((*byte)(unsafe.Pointer(&alloc[0])), sdLen) copy(dst, src) return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&dst[0])) } diff --git a/tools/vendor/golang.org/x/sys/windows/service.go b/tools/vendor/golang.org/x/sys/windows/service.go index f8deca839..c44a1b963 100644 --- a/tools/vendor/golang.org/x/sys/windows/service.go +++ b/tools/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/tools/vendor/golang.org/x/sys/windows/syscall_windows.go b/tools/vendor/golang.org/x/sys/windows/syscall_windows.go index 3723b2c22..35cfc57ca 100644 --- a/tools/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/tools/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -15,8 +15,6 @@ import ( "time" "unicode/utf16" "unsafe" - - "golang.org/x/sys/internal/unsafeheader" ) type Handle uintptr @@ -135,14 +133,14 @@ func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } @@ -216,7 +214,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) -//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys getStartupInfo(startupInfo *StartupInfo) = GetStartupInfoW //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] @@ -240,7 +238,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW //sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW //sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW -//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW //sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] //sys LocalAlloc(flags uint32, length uint32) (ptr uintptr, err error) //sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) @@ -299,12 +297,15 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue //sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId +//sys ClosePseudoConsole(console Handle) = kernel32.ClosePseudoConsole +//sys createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) = kernel32.CreatePseudoConsole //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo //sys setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW //sys Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW @@ -405,7 +406,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 @@ -437,6 +438,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute //sys DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute +// Windows Multimedia API +//sys TimeBeginPeriod (period uint32) (err error) [failretval != 0] = winmm.timeBeginPeriod +//sys TimeEndPeriod (period uint32) (err error) [failretval != 0] = winmm.timeEndPeriod + // syscall interface implementation for other packages // GetCurrentProcess returns the handle for the current process. @@ -1354,6 +1359,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) { @@ -1613,6 +1629,11 @@ func SetConsoleCursorPosition(console Handle, position Coord) error { return setConsoleCursorPosition(console, *((*uint32)(unsafe.Pointer(&position)))) } +func GetStartupInfo(startupInfo *StartupInfo) error { + getStartupInfo(startupInfo) + return nil +} + func (s NTStatus) Errno() syscall.Errno { return rtlNtStatusToDosErrorNoTeb(s) } @@ -1647,12 +1668,8 @@ func NewNTUnicodeString(s string) (*NTUnicodeString, error) { // Slice returns a uint16 slice that aliases the data in the NTUnicodeString. func (s *NTUnicodeString) Slice() []uint16 { - var slice []uint16 - hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) - hdr.Data = unsafe.Pointer(s.Buffer) - hdr.Len = int(s.Length) - hdr.Cap = int(s.MaximumLength) - return slice + slice := unsafe.Slice(s.Buffer, s.MaximumLength) + return slice[:s.Length] } func (s *NTUnicodeString) String() string { @@ -1675,12 +1692,8 @@ func NewNTString(s string) (*NTString, error) { // Slice returns a byte slice that aliases the data in the NTString. func (s *NTString) Slice() []byte { - var slice []byte - hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) - hdr.Data = unsafe.Pointer(s.Buffer) - hdr.Len = int(s.Length) - hdr.Cap = int(s.MaximumLength) - return slice + slice := unsafe.Slice(s.Buffer, s.MaximumLength) + return slice[:s.Length] } func (s *NTString) String() string { @@ -1732,10 +1745,7 @@ func LoadResourceData(module, resInfo Handle) (data []byte, err error) { if err != nil { return } - h := (*unsafeheader.Slice)(unsafe.Pointer(&data)) - h.Data = unsafe.Pointer(ptr) - h.Len = int(size) - h.Cap = int(size) + data = unsafe.Slice((*byte)(unsafe.Pointer(ptr)), size) return } @@ -1806,3 +1816,17 @@ type PSAPI_WORKING_SET_EX_INFORMATION struct { // A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress. VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK } + +// CreatePseudoConsole creates a windows pseudo console. +func CreatePseudoConsole(size Coord, in Handle, out Handle, flags uint32, pconsole *Handle) error { + // We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only + // accept arguments that can be casted to uintptr, and Coord can't. + return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), in, out, flags, pconsole) +} + +// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`. +func ResizePseudoConsole(pconsole Handle, size Coord) error { + // We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only + // accept arguments that can be casted to uintptr, and Coord can't. + return resizePseudoConsole(pconsole, *((*uint32)(unsafe.Pointer(&size)))) +} diff --git a/tools/vendor/golang.org/x/sys/windows/types_windows.go b/tools/vendor/golang.org/x/sys/windows/types_windows.go index 0dbb20841..b88dc7c85 100644 --- a/tools/vendor/golang.org/x/sys/windows/types_windows.go +++ b/tools/vendor/golang.org/x/sys/windows/types_windows.go @@ -247,6 +247,7 @@ const ( PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = 0x00020007 PROC_THREAD_ATTRIBUTE_UMS_THREAD = 0x00030006 PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL = 0x0002000b + PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x00020016 ) const ( @@ -2139,6 +2140,12 @@ const ( ENABLE_LVB_GRID_WORLDWIDE = 0x10 ) +// Pseudo console related constants used for the flags parameter to +// CreatePseudoConsole. See: https://learn.microsoft.com/en-us/windows/console/createpseudoconsole +const ( + PSEUDOCONSOLE_INHERIT_CURSOR = 0x1 +) + type Coord struct { X int16 Y int16 @@ -2220,15 +2227,19 @@ 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 + JobObjectLimitViolationInformation = 13 JobObjectLimitViolationInformation2 = 34 JobObjectNetRateControlInformation = 32 JobObjectNotificationLimitInformation = 12 diff --git a/tools/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/tools/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 6d2a26853..8b1688de4 100644 --- a/tools/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/tools/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -55,6 +55,7 @@ var ( moduser32 = NewLazySystemDLL("user32.dll") moduserenv = NewLazySystemDLL("userenv.dll") modversion = NewLazySystemDLL("version.dll") + modwinmm = NewLazySystemDLL("winmm.dll") modwintrust = NewLazySystemDLL("wintrust.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") @@ -86,6 +87,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") @@ -186,6 +188,7 @@ var ( procCancelIo = modkernel32.NewProc("CancelIo") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procCloseHandle = modkernel32.NewProc("CloseHandle") + procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") procCreateEventExW = modkernel32.NewProc("CreateEventExW") @@ -200,6 +203,7 @@ var ( procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procCreatePipe = modkernel32.NewProc("CreatePipe") procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") @@ -326,6 +330,7 @@ var ( procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") procResetEvent = modkernel32.NewProc("ResetEvent") + procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") procResumeThread = modkernel32.NewProc("ResumeThread") procSetCommTimeouts = modkernel32.NewProc("SetCommTimeouts") procSetConsoleCursorPosition = modkernel32.NewProc("SetConsoleCursorPosition") @@ -467,6 +472,8 @@ var ( procGetFileVersionInfoSizeW = modversion.NewProc("GetFileVersionInfoSizeW") procGetFileVersionInfoW = modversion.NewProc("GetFileVersionInfoW") procVerQueryValueW = modversion.NewProc("VerQueryValueW") + proctimeBeginPeriod = modwinmm.NewProc("timeBeginPeriod") + proctimeEndPeriod = modwinmm.NewProc("timeEndPeriod") procWinVerifyTrustEx = modwintrust.NewProc("WinVerifyTrustEx") procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") @@ -734,6 +741,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 { @@ -1621,6 +1636,11 @@ func CloseHandle(handle Handle) (err error) { return } +func ClosePseudoConsole(console Handle) { + syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(console), 0, 0) + return +} + func ConnectNamedPipe(pipe Handle, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { @@ -1750,6 +1770,14 @@ func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityA return } +func createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) { + r0, _, _ := syscall.Syscall6(procCreatePseudoConsole.Addr(), 5, uintptr(size), uintptr(in), uintptr(out), uintptr(flags), uintptr(unsafe.Pointer(pconsole)), 0) + if r0 != 0 { + hr = syscall.Errno(r0) + } + return +} + func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) if r1&0xff == 0 { @@ -2358,11 +2386,8 @@ func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uin return } -func GetStartupInfo(startupInfo *StartupInfo) (err error) { - r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) - if r1 == 0 { - err = errnoErr(e1) - } +func getStartupInfo(startupInfo *StartupInfo) { + syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) return } @@ -2853,6 +2878,14 @@ func ResetEvent(event Handle) (err error) { return } +func resizePseudoConsole(pconsole Handle, size uint32) (hr error) { + r0, _, _ := syscall.Syscall(procResizePseudoConsole.Addr(), 2, uintptr(pconsole), uintptr(size), 0) + if r0 != 0 { + hr = syscall.Errno(r0) + } + return +} + func ResumeThread(thread Handle) (ret uint32, err error) { r0, _, e1 := syscall.Syscall(procResumeThread.Addr(), 1, uintptr(thread), 0, 0) ret = uint32(r0) @@ -3507,12 +3540,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) } @@ -3815,9 +3844,9 @@ func setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (er return } -func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { +func commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) { r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) - argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + argv = (**uint16)(unsafe.Pointer(r0)) if argv == nil { err = errnoErr(e1) } @@ -4012,6 +4041,22 @@ func _VerQueryValue(block unsafe.Pointer, subBlock *uint16, pointerToBufferPoint return } +func TimeBeginPeriod(period uint32) (err error) { + r1, _, e1 := syscall.Syscall(proctimeBeginPeriod.Addr(), 1, uintptr(period), 0, 0) + if r1 != 0 { + err = errnoErr(e1) + } + return +} + +func TimeEndPeriod(period uint32) (err error) { + r1, _, e1 := syscall.Syscall(proctimeEndPeriod.Addr(), 1, uintptr(period), 0, 0) + if r1 != 0 { + err = errnoErr(e1) + } + return +} + func WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) { r0, _, _ := syscall.Syscall(procWinVerifyTrustEx.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(actionId)), uintptr(unsafe.Pointer(data))) if r0 != 0 { diff --git a/tools/vendor/golang.org/x/term/term_unix.go b/tools/vendor/golang.org/x/term/term_unix.go index a4e31ab1b..62c2b3f41 100644 --- a/tools/vendor/golang.org/x/term/term_unix.go +++ b/tools/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/tools/vendor/golang.org/x/text/cases/tables13.0.0.go b/tools/vendor/golang.org/x/text/cases/tables13.0.0.go index cd874775b..68d2981d1 100644 --- a/tools/vendor/golang.org/x/text/cases/tables13.0.0.go +++ b/tools/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/tools/vendor/golang.org/x/text/cases/tables15.0.0.go b/tools/vendor/golang.org/x/text/cases/tables15.0.0.go new file mode 100644 index 000000000..e431b9953 --- /dev/null +++ b/tools/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\x12Ç„Ç…\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj" + + "\x12\x12njnjNj\x12\x12njnjNJ\x10\x12ÇŠÇ‹\x13\x1bjÌŒ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\x1bwÌŠWÌŠWÌŠ\x13\x1byÌŠ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/tools/vendor/golang.org/x/text/feature/plural/common.go b/tools/vendor/golang.org/x/text/feature/plural/common.go new file mode 100644 index 000000000..fdcb373fd --- /dev/null +++ b/tools/vendor/golang.org/x/text/feature/plural/common.go @@ -0,0 +1,70 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package plural + +// Form defines a plural form. +// +// Not all languages support all forms. Also, the meaning of each form varies +// per language. It is important to note that the name of a form does not +// necessarily correspond one-to-one with the set of numbers. For instance, +// for Croation, One matches not only 1, but also 11, 21, etc. +// +// Each language must at least support the form "other". +type Form byte + +const ( + Other Form = iota + Zero + One + Two + Few + Many +) + +var countMap = map[string]Form{ + "other": Other, + "zero": Zero, + "one": One, + "two": Two, + "few": Few, + "many": Many, +} + +type pluralCheck struct { + // category: + // 3..7: opID + // 0..2: category + cat byte + setID byte +} + +// opID identifies the type of operand in the plural rule, being i, n or f. +// (v, w, and t are treated as filters in our implementation.) +type opID byte + +const ( + opMod opID = 0x1 // is '%' used? + opNotEqual opID = 0x2 // using "!=" to compare + opI opID = 0 << 2 // integers after taking the absolute value + opN opID = 1 << 2 // full number (must be integer) + opF opID = 2 << 2 // fraction + opV opID = 3 << 2 // number of visible digits + opW opID = 4 << 2 // number of visible digits without trailing zeros + opBretonM opID = 5 << 2 // hard-wired rule for Breton + opItalian800 opID = 6 << 2 // hard-wired rule for Italian + opAzerbaijan00s opID = 7 << 2 // hard-wired rule for Azerbaijan +) +const ( + // Use this plural form to indicate the next rule needs to match as well. + // The last condition in the list will have the correct plural form. + andNext = 0x7 + formMask = 0x7 + + opShift = 3 + + // numN indicates the maximum integer, or maximum mod value, for which we + // have inclusion masks. + numN = 100 + // The common denominator of the modulo that is taken. + maxMod = 100 +) diff --git a/tools/vendor/golang.org/x/text/feature/plural/message.go b/tools/vendor/golang.org/x/text/feature/plural/message.go new file mode 100644 index 000000000..56d518cc3 --- /dev/null +++ b/tools/vendor/golang.org/x/text/feature/plural/message.go @@ -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. + +package plural + +import ( + "fmt" + "io" + "reflect" + "strconv" + + "golang.org/x/text/internal/catmsg" + "golang.org/x/text/internal/number" + "golang.org/x/text/language" + "golang.org/x/text/message/catalog" +) + +// TODO: consider deleting this interface. Maybe VisibleDigits is always +// sufficient and practical. + +// Interface is used for types that can determine their own plural form. +type Interface interface { + // PluralForm reports the plural form for the given language of the + // underlying value. It also returns the integer value. If the integer value + // is larger than fits in n, PluralForm may return a value modulo + // 10,000,000. + PluralForm(t language.Tag, scale int) (f Form, n int) +} + +// Selectf returns the first case for which its selector is a match for the +// arg-th substitution argument to a formatting call, formatting it as indicated +// by format. +// +// The cases argument are pairs of selectors and messages. Selectors are of type +// string or Form. Messages are of type string or catalog.Message. A selector +// matches an argument if: +// - it is "other" or Other +// - it matches the plural form of the argument: "zero", "one", "two", "few", +// or "many", or the equivalent Form +// - it is of the form "=x" where x is an integer that matches the value of +// the argument. +// - it is of the form " kindDefault { + e.EncodeUint(uint64(m.scale)) + } + + forms := validForms(cardinal, e.Language()) + + for i := 0; i < len(m.cases); { + if err := compileSelector(e, forms, m.cases[i]); err != nil { + return err + } + if i++; i >= len(m.cases) { + return fmt.Errorf("plural: no message defined for selector %v", m.cases[i-1]) + } + var msg catalog.Message + switch x := m.cases[i].(type) { + case string: + msg = catalog.String(x) + case catalog.Message: + msg = x + default: + return fmt.Errorf("plural: message of type %T; must be string or catalog.Message", x) + } + if err := e.EncodeMessage(msg); err != nil { + return err + } + i++ + } + return nil +} + +func compileSelector(e *catmsg.Encoder, valid []Form, selector interface{}) error { + form := Other + switch x := selector.(type) { + case string: + if x == "" { + return fmt.Errorf("plural: empty selector") + } + if c := x[0]; c == '=' || c == '<' { + val, err := strconv.ParseUint(x[1:], 10, 16) + if err != nil { + return fmt.Errorf("plural: invalid number in selector %q: %v", selector, err) + } + e.EncodeUint(uint64(c)) + e.EncodeUint(val) + return nil + } + var ok bool + form, ok = countMap[x] + if !ok { + return fmt.Errorf("plural: invalid plural form %q", selector) + } + case Form: + form = x + default: + return fmt.Errorf("plural: selector of type %T; want string or Form", selector) + } + + ok := false + for _, f := range valid { + if f == form { + ok = true + break + } + } + if !ok { + return fmt.Errorf("plural: form %q not supported for language %q", selector, e.Language()) + } + e.EncodeUint(uint64(form)) + return nil +} + +func execute(d *catmsg.Decoder) bool { + lang := d.Language() + argN := int(d.DecodeUint()) + kind := int(d.DecodeUint()) + scale := -1 // default + if kind > kindDefault { + scale = int(d.DecodeUint()) + } + form := Other + n := -1 + if arg := d.Arg(argN); arg == nil { + // Default to Other. + } else if x, ok := arg.(number.VisibleDigits); ok { + d := x.Digits(nil, lang, scale) + form, n = cardinal.matchDisplayDigits(lang, &d) + } else if x, ok := arg.(Interface); ok { + // This covers lists and formatters from the number package. + form, n = x.PluralForm(lang, scale) + } else { + var f number.Formatter + switch kind { + case kindScale: + f.InitDecimal(lang) + f.SetScale(scale) + case kindScientific: + f.InitScientific(lang) + f.SetScale(scale) + case kindPrecision: + f.InitDecimal(lang) + f.SetPrecision(scale) + case kindDefault: + // sensible default + f.InitDecimal(lang) + if k := reflect.TypeOf(arg).Kind(); reflect.Int <= k && k <= reflect.Uintptr { + f.SetScale(0) + } else { + f.SetScale(2) + } + } + var dec number.Decimal // TODO: buffer in Printer + dec.Convert(f.RoundingContext, arg) + v := number.FormatDigits(&dec, f.RoundingContext) + if !v.NaN && !v.Inf { + form, n = cardinal.matchDisplayDigits(d.Language(), &v) + } + } + for !d.Done() { + f := d.DecodeUint() + if (f == '=' && n == int(d.DecodeUint())) || + (f == '<' && 0 <= n && n < int(d.DecodeUint())) || + form == Form(f) || + Other == Form(f) { + return d.ExecuteMessage() + } + d.SkipMessage() + } + return false +} diff --git a/tools/vendor/golang.org/x/text/feature/plural/plural.go b/tools/vendor/golang.org/x/text/feature/plural/plural.go new file mode 100644 index 000000000..e9f2d42e0 --- /dev/null +++ b/tools/vendor/golang.org/x/text/feature/plural/plural.go @@ -0,0 +1,262 @@ +// 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:generate go run gen.go gen_common.go + +// Package plural provides utilities for handling linguistic plurals in text. +// +// The definitions in this package are based on the plural rule handling defined +// in CLDR. See +// https://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules for +// details. +package plural + +import ( + "golang.org/x/text/internal/language/compact" + "golang.org/x/text/internal/number" + "golang.org/x/text/language" +) + +// Rules defines the plural rules for all languages for a certain plural type. +// +// This package is UNDER CONSTRUCTION and its API may change. +type Rules struct { + rules []pluralCheck + index []byte + langToIndex []byte + inclusionMasks []uint64 +} + +var ( + // Cardinal defines the plural rules for numbers indicating quantities. + Cardinal *Rules = cardinal + + // Ordinal defines the plural rules for numbers indicating position + // (first, second, etc.). + Ordinal *Rules = ordinal + + ordinal = &Rules{ + ordinalRules, + ordinalIndex, + ordinalLangToIndex, + ordinalInclusionMasks[:], + } + + cardinal = &Rules{ + cardinalRules, + cardinalIndex, + cardinalLangToIndex, + cardinalInclusionMasks[:], + } +) + +// getIntApprox converts the digits in slice digits[start:end] to an integer +// according to the following rules: +// - Let i be asInt(digits[start:end]), where out-of-range digits are assumed +// to be zero. +// - Result n is big if i / 10^nMod > 1. +// - Otherwise the result is i % 10^nMod. +// +// For example, if digits is {1, 2, 3} and start:end is 0:5, then the result +// for various values of nMod is: +// - when nMod == 2, n == big +// - when nMod == 3, n == big +// - when nMod == 4, n == big +// - when nMod == 5, n == 12300 +// - when nMod == 6, n == 12300 +// - when nMod == 7, n == 12300 +func getIntApprox(digits []byte, start, end, nMod, big int) (n int) { + // Leading 0 digits just result in 0. + p := start + if p < 0 { + p = 0 + } + // Range only over the part for which we have digits. + mid := end + if mid >= len(digits) { + mid = len(digits) + } + // Check digits more significant that nMod. + if q := end - nMod; q > 0 { + if q > mid { + q = mid + } + for ; p < q; p++ { + if digits[p] != 0 { + return big + } + } + } + for ; p < mid; p++ { + n = 10*n + int(digits[p]) + } + // Multiply for trailing zeros. + for ; p < end; p++ { + n *= 10 + } + return n +} + +// MatchDigits computes the plural form for the given language and the given +// decimal floating point digits. The digits are stored in big-endian order and +// are of value byte(0) - byte(9). The floating point position is indicated by +// exp and the number of visible decimals is scale. All leading and trailing +// zeros may be omitted from digits. +// +// The following table contains examples of possible arguments to represent +// the given numbers. +// +// decimal digits exp scale +// 123 []byte{1, 2, 3} 3 0 +// 123.4 []byte{1, 2, 3, 4} 3 1 +// 123.40 []byte{1, 2, 3, 4} 3 2 +// 100000 []byte{1} 6 0 +// 100000.00 []byte{1} 6 3 +func (p *Rules) MatchDigits(t language.Tag, digits []byte, exp, scale int) Form { + index := tagToID(t) + + // Differentiate up to including mod 1000000 for the integer part. + n := getIntApprox(digits, 0, exp, 6, 1000000) + + // Differentiate up to including mod 100 for the fractional part. + f := getIntApprox(digits, exp, exp+scale, 2, 100) + + return matchPlural(p, index, n, f, scale) +} + +func (p *Rules) matchDisplayDigits(t language.Tag, d *number.Digits) (Form, int) { + n := getIntApprox(d.Digits, 0, int(d.Exp), 6, 1000000) + return p.MatchDigits(t, d.Digits, int(d.Exp), d.NumFracDigits()), n +} + +func validForms(p *Rules, t language.Tag) (forms []Form) { + offset := p.langToIndex[tagToID(t)] + rules := p.rules[p.index[offset]:p.index[offset+1]] + + forms = append(forms, Other) + last := Other + for _, r := range rules { + if cat := Form(r.cat & formMask); cat != andNext && last != cat { + forms = append(forms, cat) + last = cat + } + } + return forms +} + +func (p *Rules) matchComponents(t language.Tag, n, f, scale int) Form { + return matchPlural(p, tagToID(t), n, f, scale) +} + +// MatchPlural returns the plural form for the given language and plural +// operands (as defined in +// https://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules): +// +// where +// n absolute value of the source number (integer and decimals) +// input +// i integer digits of n. +// v number of visible fraction digits in n, with trailing zeros. +// w number of visible fraction digits in n, without trailing zeros. +// f visible fractional digits in n, with trailing zeros (f = t * 10^(v-w)) +// t visible fractional digits in n, without trailing zeros. +// +// If any of the operand values is too large to fit in an int, it is okay to +// pass the value modulo 10,000,000. +func (p *Rules) MatchPlural(lang language.Tag, i, v, w, f, t int) Form { + return matchPlural(p, tagToID(lang), i, f, v) +} + +func matchPlural(p *Rules, index compact.ID, n, f, v int) Form { + nMask := p.inclusionMasks[n%maxMod] + // Compute the fMask inline in the rules below, as it is relatively rare. + // fMask := p.inclusionMasks[f%maxMod] + vMask := p.inclusionMasks[v%maxMod] + + // Do the matching + offset := p.langToIndex[index] + rules := p.rules[p.index[offset]:p.index[offset+1]] + for i := 0; i < len(rules); i++ { + rule := rules[i] + setBit := uint64(1 << rule.setID) + var skip bool + switch op := opID(rule.cat >> opShift); op { + case opI: // i = x + skip = n >= numN || nMask&setBit == 0 + + case opI | opNotEqual: // i != x + skip = n < numN && nMask&setBit != 0 + + case opI | opMod: // i % m = x + skip = nMask&setBit == 0 + + case opI | opMod | opNotEqual: // i % m != x + skip = nMask&setBit != 0 + + case opN: // n = x + skip = f != 0 || n >= numN || nMask&setBit == 0 + + case opN | opNotEqual: // n != x + skip = f == 0 && n < numN && nMask&setBit != 0 + + case opN | opMod: // n % m = x + skip = f != 0 || nMask&setBit == 0 + + case opN | opMod | opNotEqual: // n % m != x + skip = f == 0 && nMask&setBit != 0 + + case opF: // f = x + skip = f >= numN || p.inclusionMasks[f%maxMod]&setBit == 0 + + case opF | opNotEqual: // f != x + skip = f < numN && p.inclusionMasks[f%maxMod]&setBit != 0 + + case opF | opMod: // f % m = x + skip = p.inclusionMasks[f%maxMod]&setBit == 0 + + case opF | opMod | opNotEqual: // f % m != x + skip = p.inclusionMasks[f%maxMod]&setBit != 0 + + case opV: // v = x + skip = v < numN && vMask&setBit == 0 + + case opV | opNotEqual: // v != x + skip = v < numN && vMask&setBit != 0 + + case opW: // w == 0 + skip = f != 0 + + case opW | opNotEqual: // w != 0 + skip = f == 0 + + // Hard-wired rules that cannot be handled by our algorithm. + + case opBretonM: + skip = f != 0 || n == 0 || n%1000000 != 0 + + case opAzerbaijan00s: + // 100,200,300,400,500,600,700,800,900 + skip = n == 0 || n >= 1000 || n%100 != 0 + + case opItalian800: + skip = (f != 0 || n >= numN || nMask&setBit == 0) && n != 800 + } + if skip { + // advance over AND entries. + for ; i < len(rules) && rules[i].cat&formMask == andNext; i++ { + } + continue + } + // return if we have a final entry. + if cat := rule.cat & formMask; cat != andNext { + return Form(cat) + } + } + return Other +} + +func tagToID(t language.Tag) compact.ID { + id, _ := compact.RegionalID(compact.Tag(t)) + return id +} diff --git a/tools/vendor/golang.org/x/text/feature/plural/tables.go b/tools/vendor/golang.org/x/text/feature/plural/tables.go new file mode 100644 index 000000000..b06b9cb4e --- /dev/null +++ b/tools/vendor/golang.org/x/text/feature/plural/tables.go @@ -0,0 +1,552 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package plural + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "32" + +var ordinalRules = []pluralCheck{ // 64 elements + 0: {cat: 0x2f, setID: 0x4}, + 1: {cat: 0x3a, setID: 0x5}, + 2: {cat: 0x22, setID: 0x1}, + 3: {cat: 0x22, setID: 0x6}, + 4: {cat: 0x22, setID: 0x7}, + 5: {cat: 0x2f, setID: 0x8}, + 6: {cat: 0x3c, setID: 0x9}, + 7: {cat: 0x2f, setID: 0xa}, + 8: {cat: 0x3c, setID: 0xb}, + 9: {cat: 0x2c, setID: 0xc}, + 10: {cat: 0x24, setID: 0xd}, + 11: {cat: 0x2d, setID: 0xe}, + 12: {cat: 0x2d, setID: 0xf}, + 13: {cat: 0x2f, setID: 0x10}, + 14: {cat: 0x35, setID: 0x3}, + 15: {cat: 0xc5, setID: 0x11}, + 16: {cat: 0x2, setID: 0x1}, + 17: {cat: 0x5, setID: 0x3}, + 18: {cat: 0xd, setID: 0x12}, + 19: {cat: 0x22, setID: 0x1}, + 20: {cat: 0x2f, setID: 0x13}, + 21: {cat: 0x3d, setID: 0x14}, + 22: {cat: 0x2f, setID: 0x15}, + 23: {cat: 0x3a, setID: 0x16}, + 24: {cat: 0x2f, setID: 0x17}, + 25: {cat: 0x3b, setID: 0x18}, + 26: {cat: 0x2f, setID: 0xa}, + 27: {cat: 0x3c, setID: 0xb}, + 28: {cat: 0x22, setID: 0x1}, + 29: {cat: 0x23, setID: 0x19}, + 30: {cat: 0x24, setID: 0x1a}, + 31: {cat: 0x22, setID: 0x1b}, + 32: {cat: 0x23, setID: 0x2}, + 33: {cat: 0x24, setID: 0x1a}, + 34: {cat: 0xf, setID: 0x15}, + 35: {cat: 0x1a, setID: 0x16}, + 36: {cat: 0xf, setID: 0x17}, + 37: {cat: 0x1b, setID: 0x18}, + 38: {cat: 0xf, setID: 0x1c}, + 39: {cat: 0x1d, setID: 0x1d}, + 40: {cat: 0xa, setID: 0x1e}, + 41: {cat: 0xa, setID: 0x1f}, + 42: {cat: 0xc, setID: 0x20}, + 43: {cat: 0xe4, setID: 0x0}, + 44: {cat: 0x5, setID: 0x3}, + 45: {cat: 0xd, setID: 0xe}, + 46: {cat: 0xd, setID: 0x21}, + 47: {cat: 0x22, setID: 0x1}, + 48: {cat: 0x23, setID: 0x19}, + 49: {cat: 0x24, setID: 0x1a}, + 50: {cat: 0x25, setID: 0x22}, + 51: {cat: 0x22, setID: 0x23}, + 52: {cat: 0x23, setID: 0x19}, + 53: {cat: 0x24, setID: 0x1a}, + 54: {cat: 0x25, setID: 0x22}, + 55: {cat: 0x22, setID: 0x24}, + 56: {cat: 0x23, setID: 0x19}, + 57: {cat: 0x24, setID: 0x1a}, + 58: {cat: 0x25, setID: 0x22}, + 59: {cat: 0x21, setID: 0x25}, + 60: {cat: 0x22, setID: 0x1}, + 61: {cat: 0x23, setID: 0x2}, + 62: {cat: 0x24, setID: 0x26}, + 63: {cat: 0x25, setID: 0x27}, +} // Size: 152 bytes + +var ordinalIndex = []uint8{ // 22 elements + 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x07, 0x09, + 0x0b, 0x0f, 0x10, 0x13, 0x16, 0x1c, 0x1f, 0x22, + 0x28, 0x2f, 0x33, 0x37, 0x3b, 0x40, +} // Size: 46 bytes + +var ordinalLangToIndex = []uint8{ // 775 elements + // Entry 0 - 3F + 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, + 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x00, 0x00, 0x05, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 40 - 7F + 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 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 80 - BF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + // Entry C0 - FF + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 100 - 13F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 140 - 17F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 180 - 1BF + 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 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 1C0 - 1FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 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, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x0d, 0x0d, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 200 - 23F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 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, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 240 - 27F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x02, 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, + // Entry 280 - 2BF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 300 - 33F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0c, +} // Size: 799 bytes + +var ordinalInclusionMasks = []uint64{ // 100 elements + // Entry 0 - 1F + 0x0000002000010009, 0x00000018482000d3, 0x0000000042840195, 0x000000410a040581, + 0x00000041040c0081, 0x0000009840040041, 0x0000008400045001, 0x0000003850040001, + 0x0000003850060001, 0x0000003800049001, 0x0000000800052001, 0x0000000040660031, + 0x0000000041840331, 0x0000000100040f01, 0x00000001001c0001, 0x0000000040040001, + 0x0000000000045001, 0x0000000070040001, 0x0000000070040001, 0x0000000000049001, + 0x0000000080050001, 0x0000000040200011, 0x0000000040800111, 0x0000000100000501, + 0x0000000100080001, 0x0000000040000001, 0x0000000000005001, 0x0000000050000001, + 0x0000000050000001, 0x0000000000009001, 0x0000000000010001, 0x0000000040200011, + // Entry 20 - 3F + 0x0000000040800111, 0x0000000100000501, 0x0000000100080001, 0x0000000040000001, + 0x0000000000005001, 0x0000000050000001, 0x0000000050000001, 0x0000000000009001, + 0x0000000200050001, 0x0000000040200011, 0x0000000040800111, 0x0000000100000501, + 0x0000000100080001, 0x0000000040000001, 0x0000000000005001, 0x0000000050000001, + 0x0000000050000001, 0x0000000000009001, 0x0000000080010001, 0x0000000040200011, + 0x0000000040800111, 0x0000000100000501, 0x0000000100080001, 0x0000000040000001, + 0x0000000000005001, 0x0000000050000001, 0x0000000050000001, 0x0000000000009001, + 0x0000000200050001, 0x0000000040200011, 0x0000000040800111, 0x0000000100000501, + // Entry 40 - 5F + 0x0000000100080001, 0x0000000040000001, 0x0000000000005001, 0x0000000050000001, + 0x0000000050000001, 0x0000000000009001, 0x0000000080010001, 0x0000000040200011, + 0x0000000040800111, 0x0000000100000501, 0x0000000100080001, 0x0000000040000001, + 0x0000000000005001, 0x0000000050000001, 0x0000000050000001, 0x0000000000009001, + 0x0000000080070001, 0x0000000040200011, 0x0000000040800111, 0x0000000100000501, + 0x0000000100080001, 0x0000000040000001, 0x0000000000005001, 0x0000000050000001, + 0x0000000050000001, 0x0000000000009001, 0x0000000200010001, 0x0000000040200011, + 0x0000000040800111, 0x0000000100000501, 0x0000000100080001, 0x0000000040000001, + // Entry 60 - 7F + 0x0000000000005001, 0x0000000050000001, 0x0000000050000001, 0x0000000000009001, +} // Size: 824 bytes + +// Slots used for ordinal: 40 of 0xFF rules; 16 of 0xFF indexes; 40 of 64 sets + +var cardinalRules = []pluralCheck{ // 166 elements + 0: {cat: 0x2, setID: 0x3}, + 1: {cat: 0x22, setID: 0x1}, + 2: {cat: 0x2, setID: 0x4}, + 3: {cat: 0x2, setID: 0x4}, + 4: {cat: 0x7, setID: 0x1}, + 5: {cat: 0x62, setID: 0x3}, + 6: {cat: 0x22, setID: 0x4}, + 7: {cat: 0x7, setID: 0x3}, + 8: {cat: 0x42, setID: 0x1}, + 9: {cat: 0x22, setID: 0x4}, + 10: {cat: 0x22, setID: 0x4}, + 11: {cat: 0x22, setID: 0x5}, + 12: {cat: 0x22, setID: 0x1}, + 13: {cat: 0x22, setID: 0x1}, + 14: {cat: 0x7, setID: 0x4}, + 15: {cat: 0x92, setID: 0x3}, + 16: {cat: 0xf, setID: 0x6}, + 17: {cat: 0x1f, setID: 0x7}, + 18: {cat: 0x82, setID: 0x3}, + 19: {cat: 0x92, setID: 0x3}, + 20: {cat: 0xf, setID: 0x6}, + 21: {cat: 0x62, setID: 0x3}, + 22: {cat: 0x4a, setID: 0x6}, + 23: {cat: 0x7, setID: 0x8}, + 24: {cat: 0x62, setID: 0x3}, + 25: {cat: 0x1f, setID: 0x9}, + 26: {cat: 0x62, setID: 0x3}, + 27: {cat: 0x5f, setID: 0x9}, + 28: {cat: 0x72, setID: 0x3}, + 29: {cat: 0x29, setID: 0xa}, + 30: {cat: 0x29, setID: 0xb}, + 31: {cat: 0x4f, setID: 0xb}, + 32: {cat: 0x61, setID: 0x2}, + 33: {cat: 0x2f, setID: 0x6}, + 34: {cat: 0x3a, setID: 0x7}, + 35: {cat: 0x4f, setID: 0x6}, + 36: {cat: 0x5f, setID: 0x7}, + 37: {cat: 0x62, setID: 0x2}, + 38: {cat: 0x4f, setID: 0x6}, + 39: {cat: 0x72, setID: 0x2}, + 40: {cat: 0x21, setID: 0x3}, + 41: {cat: 0x7, setID: 0x4}, + 42: {cat: 0x32, setID: 0x3}, + 43: {cat: 0x21, setID: 0x3}, + 44: {cat: 0x22, setID: 0x1}, + 45: {cat: 0x22, setID: 0x1}, + 46: {cat: 0x23, setID: 0x2}, + 47: {cat: 0x2, setID: 0x3}, + 48: {cat: 0x22, setID: 0x1}, + 49: {cat: 0x24, setID: 0xc}, + 50: {cat: 0x7, setID: 0x1}, + 51: {cat: 0x62, setID: 0x3}, + 52: {cat: 0x74, setID: 0x3}, + 53: {cat: 0x24, setID: 0x3}, + 54: {cat: 0x2f, setID: 0xd}, + 55: {cat: 0x34, setID: 0x1}, + 56: {cat: 0xf, setID: 0x6}, + 57: {cat: 0x1f, setID: 0x7}, + 58: {cat: 0x62, setID: 0x3}, + 59: {cat: 0x4f, setID: 0x6}, + 60: {cat: 0x5a, setID: 0x7}, + 61: {cat: 0xf, setID: 0xe}, + 62: {cat: 0x1f, setID: 0xf}, + 63: {cat: 0x64, setID: 0x3}, + 64: {cat: 0x4f, setID: 0xe}, + 65: {cat: 0x5c, setID: 0xf}, + 66: {cat: 0x22, setID: 0x10}, + 67: {cat: 0x23, setID: 0x11}, + 68: {cat: 0x24, setID: 0x12}, + 69: {cat: 0xf, setID: 0x1}, + 70: {cat: 0x62, setID: 0x3}, + 71: {cat: 0xf, setID: 0x2}, + 72: {cat: 0x63, setID: 0x3}, + 73: {cat: 0xf, setID: 0x13}, + 74: {cat: 0x64, setID: 0x3}, + 75: {cat: 0x74, setID: 0x3}, + 76: {cat: 0xf, setID: 0x1}, + 77: {cat: 0x62, setID: 0x3}, + 78: {cat: 0x4a, setID: 0x1}, + 79: {cat: 0xf, setID: 0x2}, + 80: {cat: 0x63, setID: 0x3}, + 81: {cat: 0x4b, setID: 0x2}, + 82: {cat: 0xf, setID: 0x13}, + 83: {cat: 0x64, setID: 0x3}, + 84: {cat: 0x4c, setID: 0x13}, + 85: {cat: 0x7, setID: 0x1}, + 86: {cat: 0x62, setID: 0x3}, + 87: {cat: 0x7, setID: 0x2}, + 88: {cat: 0x63, setID: 0x3}, + 89: {cat: 0x2f, setID: 0xa}, + 90: {cat: 0x37, setID: 0x14}, + 91: {cat: 0x65, setID: 0x3}, + 92: {cat: 0x7, setID: 0x1}, + 93: {cat: 0x62, setID: 0x3}, + 94: {cat: 0x7, setID: 0x15}, + 95: {cat: 0x64, setID: 0x3}, + 96: {cat: 0x75, setID: 0x3}, + 97: {cat: 0x7, setID: 0x1}, + 98: {cat: 0x62, setID: 0x3}, + 99: {cat: 0xf, setID: 0xe}, + 100: {cat: 0x1f, setID: 0xf}, + 101: {cat: 0x64, setID: 0x3}, + 102: {cat: 0xf, setID: 0x16}, + 103: {cat: 0x17, setID: 0x1}, + 104: {cat: 0x65, setID: 0x3}, + 105: {cat: 0xf, setID: 0x17}, + 106: {cat: 0x65, setID: 0x3}, + 107: {cat: 0xf, setID: 0xf}, + 108: {cat: 0x65, setID: 0x3}, + 109: {cat: 0x2f, setID: 0x6}, + 110: {cat: 0x3a, setID: 0x7}, + 111: {cat: 0x2f, setID: 0xe}, + 112: {cat: 0x3c, setID: 0xf}, + 113: {cat: 0x2d, setID: 0xa}, + 114: {cat: 0x2d, setID: 0x17}, + 115: {cat: 0x2d, setID: 0x18}, + 116: {cat: 0x2f, setID: 0x6}, + 117: {cat: 0x3a, setID: 0xb}, + 118: {cat: 0x2f, setID: 0x19}, + 119: {cat: 0x3c, setID: 0xb}, + 120: {cat: 0x55, setID: 0x3}, + 121: {cat: 0x22, setID: 0x1}, + 122: {cat: 0x24, setID: 0x3}, + 123: {cat: 0x2c, setID: 0xc}, + 124: {cat: 0x2d, setID: 0xb}, + 125: {cat: 0xf, setID: 0x6}, + 126: {cat: 0x1f, setID: 0x7}, + 127: {cat: 0x62, setID: 0x3}, + 128: {cat: 0xf, setID: 0xe}, + 129: {cat: 0x1f, setID: 0xf}, + 130: {cat: 0x64, setID: 0x3}, + 131: {cat: 0xf, setID: 0xa}, + 132: {cat: 0x65, setID: 0x3}, + 133: {cat: 0xf, setID: 0x17}, + 134: {cat: 0x65, setID: 0x3}, + 135: {cat: 0xf, setID: 0x18}, + 136: {cat: 0x65, setID: 0x3}, + 137: {cat: 0x2f, setID: 0x6}, + 138: {cat: 0x3a, setID: 0x1a}, + 139: {cat: 0x2f, setID: 0x1b}, + 140: {cat: 0x3b, setID: 0x1c}, + 141: {cat: 0x2f, setID: 0x1d}, + 142: {cat: 0x3c, setID: 0x1e}, + 143: {cat: 0x37, setID: 0x3}, + 144: {cat: 0xa5, setID: 0x0}, + 145: {cat: 0x22, setID: 0x1}, + 146: {cat: 0x23, setID: 0x2}, + 147: {cat: 0x24, setID: 0x1f}, + 148: {cat: 0x25, setID: 0x20}, + 149: {cat: 0xf, setID: 0x6}, + 150: {cat: 0x62, setID: 0x3}, + 151: {cat: 0xf, setID: 0x1b}, + 152: {cat: 0x63, setID: 0x3}, + 153: {cat: 0xf, setID: 0x21}, + 154: {cat: 0x64, setID: 0x3}, + 155: {cat: 0x75, setID: 0x3}, + 156: {cat: 0x21, setID: 0x3}, + 157: {cat: 0x22, setID: 0x1}, + 158: {cat: 0x23, setID: 0x2}, + 159: {cat: 0x2c, setID: 0x22}, + 160: {cat: 0x2d, setID: 0x5}, + 161: {cat: 0x21, setID: 0x3}, + 162: {cat: 0x22, setID: 0x1}, + 163: {cat: 0x23, setID: 0x2}, + 164: {cat: 0x24, setID: 0x23}, + 165: {cat: 0x25, setID: 0x24}, +} // Size: 356 bytes + +var cardinalIndex = []uint8{ // 36 elements + 0x00, 0x00, 0x02, 0x03, 0x04, 0x06, 0x09, 0x0a, + 0x0c, 0x0d, 0x10, 0x14, 0x17, 0x1d, 0x28, 0x2b, + 0x2d, 0x2f, 0x32, 0x38, 0x42, 0x45, 0x4c, 0x55, + 0x5c, 0x61, 0x6d, 0x74, 0x79, 0x7d, 0x89, 0x91, + 0x95, 0x9c, 0xa1, 0xa6, +} // Size: 60 bytes + +var cardinalLangToIndex = []uint8{ // 775 elements + // Entry 0 - 3F + 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x06, 0x06, + 0x01, 0x01, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x01, 0x01, 0x08, 0x08, 0x04, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x00, 0x00, 0x1a, 0x1a, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x00, 0x00, + // Entry 40 - 7F + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x1e, + 0x08, 0x08, 0x13, 0x13, 0x13, 0x13, 0x13, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x18, 0x18, 0x00, 0x00, 0x22, 0x22, 0x09, 0x09, + 0x09, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x00, 0x00, 0x16, 0x16, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 80 - BF + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry C0 - FF + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + // Entry 100 - 13F + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x08, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x0c, 0x0c, + 0x08, 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 140 - 17F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x08, 0x08, 0x04, 0x04, 0x1f, 0x1f, + 0x14, 0x14, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, + 0x01, 0x01, 0x06, 0x00, 0x00, 0x20, 0x20, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x17, 0x17, 0x01, + 0x01, 0x13, 0x13, 0x13, 0x16, 0x16, 0x08, 0x08, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 180 - 1BF + 0x00, 0x04, 0x0a, 0x0a, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x10, 0x17, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x04, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x02, + 0x02, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x00, 0x0f, 0x0f, 0x08, 0x10, + // Entry 1C0 - 1FF + 0x10, 0x08, 0x08, 0x0e, 0x0e, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x08, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, + 0x00, 0x00, 0x08, 0x08, 0x0b, 0x0b, 0x08, 0x08, + 0x08, 0x08, 0x12, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 200 - 23F + 0x00, 0x08, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, + 0x06, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x08, 0x19, 0x19, 0x0d, 0x0d, + 0x08, 0x08, 0x03, 0x04, 0x03, 0x04, 0x04, 0x04, + // Entry 240 - 27F + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x12, + 0x12, 0x12, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x00, 0x00, 0x08, 0x08, 0x00, + 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x08, + 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x05, 0x05, 0x18, 0x18, 0x15, 0x15, 0x10, 0x10, + // Entry 280 - 2BF + 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x08, 0x08, 0x08, 0x0c, 0x08, 0x00, 0x00, 0x08, + // Entry 2C0 - 2FF + 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x07, 0x08, 0x08, 0x1d, 0x1d, 0x04, 0x04, 0x04, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, + 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 300 - 33F + 0x00, 0x00, 0x00, 0x01, 0x01, 0x04, 0x04, +} // Size: 799 bytes + +var cardinalInclusionMasks = []uint64{ // 100 elements + // Entry 0 - 1F + 0x0000000200500419, 0x0000000000512153, 0x000000000a327105, 0x0000000ca23c7101, + 0x00000004a23c7201, 0x0000000482943001, 0x0000001482943201, 0x0000000502943001, + 0x0000000502943001, 0x0000000522943201, 0x0000000540543401, 0x00000000454128e1, + 0x000000005b02e821, 0x000000006304e821, 0x000000006304ea21, 0x0000000042842821, + 0x0000000042842a21, 0x0000000042842821, 0x0000000042842821, 0x0000000062842a21, + 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, + 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, + 0x0000000002800021, 0x0000000022800221, 0x0000000000400421, 0x0000000000400061, + // Entry 20 - 3F + 0x000000000a004021, 0x0000000022004021, 0x0000000022004221, 0x0000000002800021, + 0x0000000002800221, 0x0000000002800021, 0x0000000002800021, 0x0000000022800221, + 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, + 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, + 0x0000000002800021, 0x0000000022800221, 0x0000000000400421, 0x0000000000400061, + 0x000000000a004021, 0x0000000022004021, 0x0000000022004221, 0x0000000002800021, + 0x0000000002800221, 0x0000000002800021, 0x0000000002800021, 0x0000000022800221, + 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, + // Entry 40 - 5F + 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, + 0x0000000002800021, 0x0000000022800221, 0x0000000040400421, 0x0000000044400061, + 0x000000005a004021, 0x0000000062004021, 0x0000000062004221, 0x0000000042800021, + 0x0000000042800221, 0x0000000042800021, 0x0000000042800021, 0x0000000062800221, + 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, + 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, + 0x0000000002800021, 0x0000000022800221, 0x0000000040400421, 0x0000000044400061, + 0x000000005a004021, 0x0000000062004021, 0x0000000062004221, 0x0000000042800021, + // Entry 60 - 7F + 0x0000000042800221, 0x0000000042800021, 0x0000000042800021, 0x0000000062800221, +} // Size: 824 bytes + +// Slots used for cardinal: A6 of 0xFF rules; 24 of 0xFF indexes; 37 of 64 sets + +// Total table size 3860 bytes (3KiB); checksum: AAFBF21 diff --git a/tools/vendor/golang.org/x/text/internal/catmsg/catmsg.go b/tools/vendor/golang.org/x/text/internal/catmsg/catmsg.go new file mode 100644 index 000000000..1b257a7b4 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/catmsg/catmsg.go @@ -0,0 +1,417 @@ +// 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 catmsg contains support types for package x/text/message/catalog. +// +// This package contains the low-level implementations of Message used by the +// catalog package and provides primitives for other packages to implement their +// own. For instance, the plural package provides functionality for selecting +// translation strings based on the plural category of substitution arguments. +// +// # Encoding and Decoding +// +// Catalogs store Messages encoded as a single string. Compiling a message into +// a string both results in compacter representation and speeds up evaluation. +// +// A Message must implement a Compile method to convert its arbitrary +// representation to a string. The Compile method takes an Encoder which +// facilitates serializing the message. Encoders also provide more context of +// the messages's creation (such as for which language the message is intended), +// which may not be known at the time of the creation of the message. +// +// Each message type must also have an accompanying decoder registered to decode +// the message. This decoder takes a Decoder argument which provides the +// counterparts for the decoding. +// +// # Renderers +// +// A Decoder must be initialized with a Renderer implementation. These +// implementations must be provided by packages that use Catalogs, typically +// formatting packages such as x/text/message. A typical user will not need to +// worry about this type; it is only relevant to packages that do string +// formatting and want to use the catalog package to handle localized strings. +// +// A package that uses catalogs for selecting strings receives selection results +// as sequence of substrings passed to the Renderer. The following snippet shows +// how to express the above example using the message package. +// +// message.Set(language.English, "You are %d minute(s) late.", +// catalog.Var("minutes", plural.Select(1, "one", "minute")), +// catalog.String("You are %[1]d ${minutes} late.")) +// +// p := message.NewPrinter(language.English) +// p.Printf("You are %d minute(s) late.", 5) // always 5 minutes late. +// +// To evaluate the Printf, package message wraps the arguments in a Renderer +// that is passed to the catalog for message decoding. The call sequence that +// results from evaluating the above message, assuming the person is rather +// tardy, is: +// +// Render("You are %[1]d ") +// Arg(1) +// Render("minutes") +// Render(" late.") +// +// The calls to Arg is caused by the plural.Select execution, which evaluates +// the argument to determine whether the singular or plural message form should +// be selected. The calls to Render reports the partial results to the message +// package for further evaluation. +package catmsg + +import ( + "errors" + "fmt" + "strconv" + "strings" + "sync" + + "golang.org/x/text/language" +) + +// A Handle refers to a registered message type. +type Handle int + +// A Handler decodes and evaluates data compiled by a Message and sends the +// result to the Decoder. The output may depend on the value of the substitution +// arguments, accessible by the Decoder's Arg method. The Handler returns false +// if there is no translation for the given substitution arguments. +type Handler func(d *Decoder) bool + +// Register records the existence of a message type and returns a Handle that +// can be used in the Encoder's EncodeMessageType method to create such +// messages. The prefix of the name should be the package path followed by +// an optional disambiguating string. +// Register will panic if a handle for the same name was already registered. +func Register(name string, handler Handler) Handle { + mutex.Lock() + defer mutex.Unlock() + + if _, ok := names[name]; ok { + panic(fmt.Errorf("catmsg: handler for %q already exists", name)) + } + h := Handle(len(handlers)) + names[name] = h + handlers = append(handlers, handler) + return h +} + +// These handlers require fixed positions in the handlers slice. +const ( + msgVars Handle = iota + msgFirst + msgRaw + msgString + msgAffix + // Leave some arbitrary room for future expansion: 20 should suffice. + numInternal = 20 +) + +const prefix = "golang.org/x/text/internal/catmsg." + +var ( + // TODO: find a more stable way to link handles to message types. + mutex sync.Mutex + names = map[string]Handle{ + prefix + "Vars": msgVars, + prefix + "First": msgFirst, + prefix + "Raw": msgRaw, + prefix + "String": msgString, + prefix + "Affix": msgAffix, + } + handlers = make([]Handler, numInternal) +) + +func init() { + // This handler is a message type wrapper that initializes a decoder + // with a variable block. This message type, if present, is always at the + // start of an encoded message. + handlers[msgVars] = func(d *Decoder) bool { + blockSize := int(d.DecodeUint()) + d.vars = d.data[:blockSize] + d.data = d.data[blockSize:] + return d.executeMessage() + } + + // First takes the first message in a sequence that results in a match for + // the given substitution arguments. + handlers[msgFirst] = func(d *Decoder) bool { + for !d.Done() { + if d.ExecuteMessage() { + return true + } + } + return false + } + + handlers[msgRaw] = func(d *Decoder) bool { + d.Render(d.data) + return true + } + + // A String message alternates between a string constant and a variable + // substitution. + handlers[msgString] = func(d *Decoder) bool { + for !d.Done() { + if str := d.DecodeString(); str != "" { + d.Render(str) + } + if d.Done() { + break + } + d.ExecuteSubstitution() + } + return true + } + + handlers[msgAffix] = func(d *Decoder) bool { + // TODO: use an alternative method for common cases. + prefix := d.DecodeString() + suffix := d.DecodeString() + if prefix != "" { + d.Render(prefix) + } + ret := d.ExecuteMessage() + if suffix != "" { + d.Render(suffix) + } + return ret + } +} + +var ( + // ErrIncomplete indicates a compiled message does not define translations + // for all possible argument values. If this message is returned, evaluating + // a message may result in the ErrNoMatch error. + ErrIncomplete = errors.New("catmsg: incomplete message; may not give result for all inputs") + + // ErrNoMatch indicates no translation message matched the given input + // parameters when evaluating a message. + ErrNoMatch = errors.New("catmsg: no translation for inputs") +) + +// A Message holds a collection of translations for the same phrase that may +// vary based on the values of substitution arguments. +type Message interface { + // Compile encodes the format string(s) of the message as a string for later + // evaluation. + // + // The first call Compile makes on the encoder must be EncodeMessageType. + // The handle passed to this call may either be a handle returned by + // Register to encode a single custom message, or HandleFirst followed by + // a sequence of calls to EncodeMessage. + // + // Compile must return ErrIncomplete if it is possible for evaluation to + // not match any translation for a given set of formatting parameters. + // For example, selecting a translation based on plural form may not yield + // a match if the form "Other" is not one of the selectors. + // + // Compile may return any other application-specific error. For backwards + // compatibility with package like fmt, which often do not do sanity + // checking of format strings ahead of time, Compile should still make an + // effort to have some sensible fallback in case of an error. + Compile(e *Encoder) error +} + +// Compile converts a Message to a data string that can be stored in a Catalog. +// The resulting string can subsequently be decoded by passing to the Execute +// method of a Decoder. +func Compile(tag language.Tag, macros Dictionary, m Message) (data string, err error) { + // TODO: pass macros so they can be used for validation. + v := &Encoder{inBody: true} // encoder for variables + v.root = v + e := &Encoder{root: v, parent: v, tag: tag} // encoder for messages + err = m.Compile(e) + // This package serves te message package, which in turn is meant to be a + // drop-in replacement for fmt. With the fmt package, format strings are + // evaluated lazily and errors are handled by substituting strings in the + // result, rather then returning an error. Dealing with multiple languages + // makes it more important to check errors ahead of time. We chose to be + // consistent and compatible and allow graceful degradation in case of + // errors. + buf := e.buf[stripPrefix(e.buf):] + if len(v.buf) > 0 { + // Prepend variable block. + b := make([]byte, 1+maxVarintBytes+len(v.buf)+len(buf)) + b[0] = byte(msgVars) + b = b[:1+encodeUint(b[1:], uint64(len(v.buf)))] + b = append(b, v.buf...) + b = append(b, buf...) + buf = b + } + if err == nil { + err = v.err + } + return string(buf), err +} + +// FirstOf is a message type that prints the first message in the sequence that +// resolves to a match for the given substitution arguments. +type FirstOf []Message + +// Compile implements Message. +func (s FirstOf) Compile(e *Encoder) error { + e.EncodeMessageType(msgFirst) + err := ErrIncomplete + for i, m := range s { + if err == nil { + return fmt.Errorf("catalog: message argument %d is complete and blocks subsequent messages", i-1) + } + err = e.EncodeMessage(m) + } + return err +} + +// Var defines a message that can be substituted for a placeholder of the same +// name. If an expression does not result in a string after evaluation, Name is +// used as the substitution. For example: +// +// Var{ +// Name: "minutes", +// Message: plural.Select(1, "one", "minute"), +// } +// +// will resolve to minute for singular and minutes for plural forms. +type Var struct { + Name string + Message Message +} + +var errIsVar = errors.New("catmsg: variable used as message") + +// Compile implements Message. +// +// Note that this method merely registers a variable; it does not create an +// encoded message. +func (v *Var) Compile(e *Encoder) error { + if err := e.addVar(v.Name, v.Message); err != nil { + return err + } + // Using a Var by itself is an error. If it is in a sequence followed by + // other messages referring to it, this error will be ignored. + return errIsVar +} + +// Raw is a message consisting of a single format string that is passed as is +// to the Renderer. +// +// Note that a Renderer may still do its own variable substitution. +type Raw string + +// Compile implements Message. +func (r Raw) Compile(e *Encoder) (err error) { + e.EncodeMessageType(msgRaw) + // Special case: raw strings don't have a size encoding and so don't use + // EncodeString. + e.buf = append(e.buf, r...) + return nil +} + +// String is a message consisting of a single format string which contains +// placeholders that may be substituted with variables. +// +// Variable substitutions are marked with placeholders and a variable name of +// the form ${name}. Any other substitutions such as Go templates or +// printf-style substitutions are left to be done by the Renderer. +// +// When evaluation a string interpolation, a Renderer will receive separate +// calls for each placeholder and interstitial string. For example, for the +// message: "%[1]v ${invites} %[2]v to ${their} party." The sequence of calls +// is: +// +// d.Render("%[1]v ") +// d.Arg(1) +// d.Render(resultOfInvites) +// d.Render(" %[2]v to ") +// d.Arg(2) +// d.Render(resultOfTheir) +// d.Render(" party.") +// +// where the messages for "invites" and "their" both use a plural.Select +// referring to the first argument. +// +// Strings may also invoke macros. Macros are essentially variables that can be +// reused. Macros may, for instance, be used to make selections between +// different conjugations of a verb. See the catalog package description for an +// overview of macros. +type String string + +// Compile implements Message. It parses the placeholder formats and returns +// any error. +func (s String) Compile(e *Encoder) (err error) { + msg := string(s) + const subStart = "${" + hasHeader := false + p := 0 + b := []byte{} + for { + i := strings.Index(msg[p:], subStart) + if i == -1 { + break + } + b = append(b, msg[p:p+i]...) + p += i + len(subStart) + if i = strings.IndexByte(msg[p:], '}'); i == -1 { + b = append(b, "$!(MISSINGBRACE)"...) + err = fmt.Errorf("catmsg: missing '}'") + p = len(msg) + break + } + name := strings.TrimSpace(msg[p : p+i]) + if q := strings.IndexByte(name, '('); q == -1 { + if !hasHeader { + hasHeader = true + e.EncodeMessageType(msgString) + } + e.EncodeString(string(b)) + e.EncodeSubstitution(name) + b = b[:0] + } else if j := strings.IndexByte(name[q:], ')'); j == -1 { + // TODO: what should the error be? + b = append(b, "$!(MISSINGPAREN)"...) + err = fmt.Errorf("catmsg: missing ')'") + } else if x, sErr := strconv.ParseUint(strings.TrimSpace(name[q+1:q+j]), 10, 32); sErr != nil { + // TODO: handle more than one argument + b = append(b, "$!(BADNUM)"...) + err = fmt.Errorf("catmsg: invalid number %q", strings.TrimSpace(name[q+1:q+j])) + } else { + if !hasHeader { + hasHeader = true + e.EncodeMessageType(msgString) + } + e.EncodeString(string(b)) + e.EncodeSubstitution(name[:q], int(x)) + b = b[:0] + } + p += i + 1 + } + b = append(b, msg[p:]...) + if !hasHeader { + // Simplify string to a raw string. + Raw(string(b)).Compile(e) + } else if len(b) > 0 { + e.EncodeString(string(b)) + } + return err +} + +// Affix is a message that adds a prefix and suffix to another message. +// This is mostly used add back whitespace to a translation that was stripped +// before sending it out. +type Affix struct { + Message Message + Prefix string + Suffix string +} + +// Compile implements Message. +func (a Affix) Compile(e *Encoder) (err error) { + // TODO: consider adding a special message type that just adds a single + // return. This is probably common enough to handle the majority of cases. + // Get some stats first, though. + e.EncodeMessageType(msgAffix) + e.EncodeString(a.Prefix) + e.EncodeString(a.Suffix) + e.EncodeMessage(a.Message) + return nil +} diff --git a/tools/vendor/golang.org/x/text/internal/catmsg/codec.go b/tools/vendor/golang.org/x/text/internal/catmsg/codec.go new file mode 100644 index 000000000..49c9fc978 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/catmsg/codec.go @@ -0,0 +1,407 @@ +// 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 catmsg + +import ( + "errors" + "fmt" + + "golang.org/x/text/language" +) + +// A Renderer renders a Message. +type Renderer interface { + // Render renders the given string. The given string may be interpreted as a + // format string, such as the one used by the fmt package or a template. + Render(s string) + + // Arg returns the i-th argument passed to format a message. This method + // should return nil if there is no such argument. Messages need access to + // arguments to allow selecting a message based on linguistic features of + // those arguments. + Arg(i int) interface{} +} + +// A Dictionary specifies a source of messages, including variables or macros. +type Dictionary interface { + // Lookup returns the message for the given key. It returns false for ok if + // such a message could not be found. + Lookup(key string) (data string, ok bool) + + // TODO: consider returning an interface, instead of a string. This will + // allow implementations to do their own message type decoding. +} + +// An Encoder serializes a Message to a string. +type Encoder struct { + // The root encoder is used for storing encoded variables. + root *Encoder + // The parent encoder provides the surrounding scopes for resolving variable + // names. + parent *Encoder + + tag language.Tag + + // buf holds the encoded message so far. After a message completes encoding, + // the contents of buf, prefixed by the encoded length, are flushed to the + // parent buffer. + buf []byte + + // vars is the lookup table of variables in the current scope. + vars []keyVal + + err error + inBody bool // if false next call must be EncodeMessageType +} + +type keyVal struct { + key string + offset int +} + +// Language reports the language for which the encoded message will be stored +// in the Catalog. +func (e *Encoder) Language() language.Tag { return e.tag } + +func (e *Encoder) setError(err error) { + if e.root.err == nil { + e.root.err = err + } +} + +// EncodeUint encodes x. +func (e *Encoder) EncodeUint(x uint64) { + e.checkInBody() + var buf [maxVarintBytes]byte + n := encodeUint(buf[:], x) + e.buf = append(e.buf, buf[:n]...) +} + +// EncodeString encodes s. +func (e *Encoder) EncodeString(s string) { + e.checkInBody() + e.EncodeUint(uint64(len(s))) + e.buf = append(e.buf, s...) +} + +// EncodeMessageType marks the current message to be of type h. +// +// It must be the first call of a Message's Compile method. +func (e *Encoder) EncodeMessageType(h Handle) { + if e.inBody { + panic("catmsg: EncodeMessageType not the first method called") + } + e.inBody = true + e.EncodeUint(uint64(h)) +} + +// EncodeMessage serializes the given message inline at the current position. +func (e *Encoder) EncodeMessage(m Message) error { + e = &Encoder{root: e.root, parent: e, tag: e.tag} + err := m.Compile(e) + if _, ok := m.(*Var); !ok { + e.flushTo(e.parent) + } + return err +} + +func (e *Encoder) checkInBody() { + if !e.inBody { + panic("catmsg: expected prior call to EncodeMessageType") + } +} + +// stripPrefix indicates the number of prefix bytes that must be stripped to +// turn a single-element sequence into a message that is just this single member +// without its size prefix. If the message can be stripped, b[1:n] contains the +// size prefix. +func stripPrefix(b []byte) (n int) { + if len(b) > 0 && Handle(b[0]) == msgFirst { + x, n, _ := decodeUint(b[1:]) + if 1+n+int(x) == len(b) { + return 1 + n + } + } + return 0 +} + +func (e *Encoder) flushTo(dst *Encoder) { + data := e.buf + p := stripPrefix(data) + if p > 0 { + data = data[1:] + } else { + // Prefix the size. + dst.EncodeUint(uint64(len(data))) + } + dst.buf = append(dst.buf, data...) +} + +func (e *Encoder) addVar(key string, m Message) error { + for _, v := range e.parent.vars { + if v.key == key { + err := fmt.Errorf("catmsg: duplicate variable %q", key) + e.setError(err) + return err + } + } + scope := e.parent + // If a variable message is Incomplete, and does not evaluate to a message + // during execution, we fall back to the variable name. We encode this by + // appending the variable name if the message reports it's incomplete. + + err := m.Compile(e) + if err != ErrIncomplete { + e.setError(err) + } + switch { + case len(e.buf) == 1 && Handle(e.buf[0]) == msgFirst: // empty sequence + e.buf = e.buf[:0] + e.inBody = false + fallthrough + case len(e.buf) == 0: + // Empty message. + if err := String(key).Compile(e); err != nil { + e.setError(err) + } + case err == ErrIncomplete: + if Handle(e.buf[0]) != msgFirst { + seq := &Encoder{root: e.root, parent: e} + seq.EncodeMessageType(msgFirst) + e.flushTo(seq) + e = seq + } + // e contains a sequence; append the fallback string. + e.EncodeMessage(String(key)) + } + + // Flush result to variable heap. + offset := len(e.root.buf) + e.flushTo(e.root) + e.buf = e.buf[:0] + + // Record variable offset in current scope. + scope.vars = append(scope.vars, keyVal{key: key, offset: offset}) + return err +} + +const ( + substituteVar = iota + substituteMacro + substituteError +) + +// EncodeSubstitution inserts a resolved reference to a variable or macro. +// +// This call must be matched with a call to ExecuteSubstitution at decoding +// time. +func (e *Encoder) EncodeSubstitution(name string, arguments ...int) { + if arity := len(arguments); arity > 0 { + // TODO: also resolve macros. + e.EncodeUint(substituteMacro) + e.EncodeString(name) + for _, a := range arguments { + e.EncodeUint(uint64(a)) + } + return + } + for scope := e; scope != nil; scope = scope.parent { + for _, v := range scope.vars { + if v.key != name { + continue + } + e.EncodeUint(substituteVar) // TODO: support arity > 0 + e.EncodeUint(uint64(v.offset)) + return + } + } + // TODO: refer to dictionary-wide scoped variables. + e.EncodeUint(substituteError) + e.EncodeString(name) + e.setError(fmt.Errorf("catmsg: unknown var %q", name)) +} + +// A Decoder deserializes and evaluates messages that are encoded by an encoder. +type Decoder struct { + tag language.Tag + dst Renderer + macros Dictionary + + err error + vars string + data string + + macroArg int // TODO: allow more than one argument +} + +// NewDecoder returns a new Decoder. +// +// Decoders are designed to be reused for multiple invocations of Execute. +// Only one goroutine may call Execute concurrently. +func NewDecoder(tag language.Tag, r Renderer, macros Dictionary) *Decoder { + return &Decoder{ + tag: tag, + dst: r, + macros: macros, + } +} + +func (d *Decoder) setError(err error) { + if d.err == nil { + d.err = err + } +} + +// Language returns the language in which the message is being rendered. +// +// The destination language may be a child language of the language used for +// encoding. For instance, a decoding language of "pt-PT"" is consistent with an +// encoding language of "pt". +func (d *Decoder) Language() language.Tag { return d.tag } + +// Done reports whether there are more bytes to process in this message. +func (d *Decoder) Done() bool { return len(d.data) == 0 } + +// Render implements Renderer. +func (d *Decoder) Render(s string) { d.dst.Render(s) } + +// Arg implements Renderer. +// +// During evaluation of macros, the argument positions may be mapped to +// arguments that differ from the original call. +func (d *Decoder) Arg(i int) interface{} { + if d.macroArg != 0 { + if i != 1 { + panic("catmsg: only macros with single argument supported") + } + i = d.macroArg + } + return d.dst.Arg(i) +} + +// DecodeUint decodes a number that was encoded with EncodeUint and advances the +// position. +func (d *Decoder) DecodeUint() uint64 { + x, n, err := decodeUintString(d.data) + d.data = d.data[n:] + if err != nil { + d.setError(err) + } + return x +} + +// DecodeString decodes a string that was encoded with EncodeString and advances +// the position. +func (d *Decoder) DecodeString() string { + size := d.DecodeUint() + s := d.data[:size] + d.data = d.data[size:] + return s +} + +// SkipMessage skips the message at the current location and advances the +// position. +func (d *Decoder) SkipMessage() { + n := int(d.DecodeUint()) + d.data = d.data[n:] +} + +// Execute decodes and evaluates msg. +// +// Only one goroutine may call execute. +func (d *Decoder) Execute(msg string) error { + d.err = nil + if !d.execute(msg) { + return ErrNoMatch + } + return d.err +} + +func (d *Decoder) execute(msg string) bool { + saved := d.data + d.data = msg + ok := d.executeMessage() + d.data = saved + return ok +} + +// executeMessageFromData is like execute, but also decodes a leading message +// size and clips the given string accordingly. +// +// It reports the number of bytes consumed and whether a message was selected. +func (d *Decoder) executeMessageFromData(s string) (n int, ok bool) { + saved := d.data + d.data = s + size := int(d.DecodeUint()) + n = len(s) - len(d.data) + // Sanitize the setting. This allows skipping a size argument for + // RawString and method Done. + d.data = d.data[:size] + ok = d.executeMessage() + n += size - len(d.data) + d.data = saved + return n, ok +} + +var errUnknownHandler = errors.New("catmsg: string contains unsupported handler") + +// executeMessage reads the handle id, initializes the decoder and executes the +// message. It is assumed that all of d.data[d.p:] is the single message. +func (d *Decoder) executeMessage() bool { + if d.Done() { + // We interpret no data as a valid empty message. + return true + } + handle := d.DecodeUint() + + var fn Handler + mutex.Lock() + if int(handle) < len(handlers) { + fn = handlers[handle] + } + mutex.Unlock() + if fn == nil { + d.setError(errUnknownHandler) + d.execute(fmt.Sprintf("\x02$!(UNKNOWNMSGHANDLER=%#x)", handle)) + return true + } + return fn(d) +} + +// ExecuteMessage decodes and executes the message at the current position. +func (d *Decoder) ExecuteMessage() bool { + n, ok := d.executeMessageFromData(d.data) + d.data = d.data[n:] + return ok +} + +// ExecuteSubstitution executes the message corresponding to the substitution +// as encoded by EncodeSubstitution. +func (d *Decoder) ExecuteSubstitution() { + switch x := d.DecodeUint(); x { + case substituteVar: + offset := d.DecodeUint() + d.executeMessageFromData(d.vars[offset:]) + case substituteMacro: + name := d.DecodeString() + data, ok := d.macros.Lookup(name) + old := d.macroArg + // TODO: support macros of arity other than 1. + d.macroArg = int(d.DecodeUint()) + switch { + case !ok: + // TODO: detect this at creation time. + d.setError(fmt.Errorf("catmsg: undefined macro %q", name)) + fallthrough + case !d.execute(data): + d.dst.Render(name) // fall back to macro name. + } + d.macroArg = old + case substituteError: + d.dst.Render(d.DecodeString()) + default: + panic("catmsg: unreachable") + } +} diff --git a/tools/vendor/golang.org/x/text/internal/catmsg/varint.go b/tools/vendor/golang.org/x/text/internal/catmsg/varint.go new file mode 100644 index 000000000..a2cee2cf5 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/catmsg/varint.go @@ -0,0 +1,62 @@ +// 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 catmsg + +// This file implements varint encoding analogous to the one in encoding/binary. +// We need a string version of this function, so we add that here and then add +// the rest for consistency. + +import "errors" + +var ( + errIllegalVarint = errors.New("catmsg: illegal varint") + errVarintTooLarge = errors.New("catmsg: varint too large for uint64") +) + +const maxVarintBytes = 10 // maximum length of a varint + +// encodeUint encodes x as a variable-sized integer into buf and returns the +// number of bytes written. buf must be at least maxVarintBytes long +func encodeUint(buf []byte, x uint64) (n int) { + for ; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return n +} + +func decodeUintString(s string) (x uint64, size int, err error) { + i := 0 + for shift := uint(0); shift < 64; shift += 7 { + if i >= len(s) { + return 0, i, errIllegalVarint + } + b := uint64(s[i]) + i++ + x |= (b & 0x7F) << shift + if b&0x80 == 0 { + return x, i, nil + } + } + return 0, i, errVarintTooLarge +} + +func decodeUint(b []byte) (x uint64, size int, err error) { + i := 0 + for shift := uint(0); shift < 64; shift += 7 { + if i >= len(b) { + return 0, i, errIllegalVarint + } + c := uint64(b[i]) + i++ + x |= (c & 0x7F) << shift + if c&0x80 == 0 { + return x, i, nil + } + } + return 0, i, errVarintTooLarge +} diff --git a/tools/vendor/golang.org/x/text/internal/format/format.go b/tools/vendor/golang.org/x/text/internal/format/format.go new file mode 100644 index 000000000..ee1c57a3c --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/format/format.go @@ -0,0 +1,41 @@ +// 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 format contains types for defining language-specific formatting of +// values. +// +// This package is internal now, but will eventually be exposed after the API +// settles. +package format // import "golang.org/x/text/internal/format" + +import ( + "fmt" + + "golang.org/x/text/language" +) + +// State represents the printer state passed to custom formatters. It provides +// access to the fmt.State interface and the sentence and language-related +// context. +type State interface { + fmt.State + + // Language reports the requested language in which to render a message. + Language() language.Tag + + // TODO: consider this and removing rune from the Format method in the + // Formatter interface. + // + // Verb returns the format variant to render, analogous to the types used + // in fmt. Use 'v' for the default or only variant. + // Verb() rune + + // TODO: more info: + // - sentence context such as linguistic features passed by the translator. +} + +// Formatter is analogous to fmt.Formatter. +type Formatter interface { + Format(state State, verb rune) +} diff --git a/tools/vendor/golang.org/x/text/internal/format/parser.go b/tools/vendor/golang.org/x/text/internal/format/parser.go new file mode 100644 index 000000000..855aed71d --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/format/parser.go @@ -0,0 +1,358 @@ +// 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 format + +import ( + "reflect" + "unicode/utf8" +) + +// A Parser parses a format string. The result from the parse are set in the +// struct fields. +type Parser struct { + Verb rune + + WidthPresent bool + PrecPresent bool + Minus bool + Plus bool + Sharp bool + Space bool + Zero bool + + // For the formats %+v %#v, we set the plusV/sharpV flags + // and clear the plus/sharp flags since %+v and %#v are in effect + // different, flagless formats set at the top level. + PlusV bool + SharpV bool + + HasIndex bool + + Width int + Prec int // precision + + // retain arguments across calls. + Args []interface{} + // retain current argument number across calls + ArgNum int + + // reordered records whether the format string used argument reordering. + Reordered bool + // goodArgNum records whether the most recent reordering directive was valid. + goodArgNum bool + + // position info + format string + startPos int + endPos int + Status Status +} + +// Reset initializes a parser to scan format strings for the given args. +func (p *Parser) Reset(args []interface{}) { + p.Args = args + p.ArgNum = 0 + p.startPos = 0 + p.Reordered = false +} + +// Text returns the part of the format string that was parsed by the last call +// to Scan. It returns the original substitution clause if the current scan +// parsed a substitution. +func (p *Parser) Text() string { return p.format[p.startPos:p.endPos] } + +// SetFormat sets a new format string to parse. It does not reset the argument +// count. +func (p *Parser) SetFormat(format string) { + p.format = format + p.startPos = 0 + p.endPos = 0 +} + +// Status indicates the result type of a call to Scan. +type Status int + +const ( + StatusText Status = iota + StatusSubstitution + StatusBadWidthSubstitution + StatusBadPrecSubstitution + StatusNoVerb + StatusBadArgNum + StatusMissingArg +) + +// ClearFlags reset the parser to default behavior. +func (p *Parser) ClearFlags() { + p.WidthPresent = false + p.PrecPresent = false + p.Minus = false + p.Plus = false + p.Sharp = false + p.Space = false + p.Zero = false + + p.PlusV = false + p.SharpV = false + + p.HasIndex = false +} + +// Scan scans the next part of the format string and sets the status to +// indicate whether it scanned a string literal, substitution or error. +func (p *Parser) Scan() bool { + p.Status = StatusText + format := p.format + end := len(format) + if p.endPos >= end { + return false + } + afterIndex := false // previous item in format was an index like [3]. + + p.startPos = p.endPos + p.goodArgNum = true + i := p.startPos + for i < end && format[i] != '%' { + i++ + } + if i > p.startPos { + p.endPos = i + return true + } + // Process one verb + i++ + + p.Status = StatusSubstitution + + // Do we have flags? + p.ClearFlags() + +simpleFormat: + for ; i < end; i++ { + c := p.format[i] + switch c { + case '#': + p.Sharp = true + case '0': + p.Zero = !p.Minus // Only allow zero padding to the left. + case '+': + p.Plus = true + case '-': + p.Minus = true + p.Zero = false // Do not pad with zeros to the right. + case ' ': + p.Space = true + default: + // Fast path for common case of ascii lower case simple verbs + // without precision or width or argument indices. + if 'a' <= c && c <= 'z' && p.ArgNum < len(p.Args) { + if c == 'v' { + // Go syntax + p.SharpV = p.Sharp + p.Sharp = false + // Struct-field syntax + p.PlusV = p.Plus + p.Plus = false + } + p.Verb = rune(c) + p.ArgNum++ + p.endPos = i + 1 + return true + } + // Format is more complex than simple flags and a verb or is malformed. + break simpleFormat + } + } + + // Do we have an explicit argument index? + i, afterIndex = p.updateArgNumber(format, i) + + // Do we have width? + if i < end && format[i] == '*' { + i++ + p.Width, p.WidthPresent = p.intFromArg() + + if !p.WidthPresent { + p.Status = StatusBadWidthSubstitution + } + + // We have a negative width, so take its value and ensure + // that the minus flag is set + if p.Width < 0 { + p.Width = -p.Width + p.Minus = true + p.Zero = false // Do not pad with zeros to the right. + } + afterIndex = false + } else { + p.Width, p.WidthPresent, i = parsenum(format, i, end) + if afterIndex && p.WidthPresent { // "%[3]2d" + p.goodArgNum = false + } + } + + // Do we have precision? + if i+1 < end && format[i] == '.' { + i++ + if afterIndex { // "%[3].2d" + p.goodArgNum = false + } + i, afterIndex = p.updateArgNumber(format, i) + if i < end && format[i] == '*' { + i++ + p.Prec, p.PrecPresent = p.intFromArg() + // Negative precision arguments don't make sense + if p.Prec < 0 { + p.Prec = 0 + p.PrecPresent = false + } + if !p.PrecPresent { + p.Status = StatusBadPrecSubstitution + } + afterIndex = false + } else { + p.Prec, p.PrecPresent, i = parsenum(format, i, end) + if !p.PrecPresent { + p.Prec = 0 + p.PrecPresent = true + } + } + } + + if !afterIndex { + i, afterIndex = p.updateArgNumber(format, i) + } + p.HasIndex = afterIndex + + if i >= end { + p.endPos = i + p.Status = StatusNoVerb + return true + } + + verb, w := utf8.DecodeRuneInString(format[i:]) + p.endPos = i + w + p.Verb = verb + + switch { + case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec. + p.startPos = p.endPos - 1 + p.Status = StatusText + case !p.goodArgNum: + p.Status = StatusBadArgNum + case p.ArgNum >= len(p.Args): // No argument left over to print for the current verb. + p.Status = StatusMissingArg + p.ArgNum++ + case verb == 'v': + // Go syntax + p.SharpV = p.Sharp + p.Sharp = false + // Struct-field syntax + p.PlusV = p.Plus + p.Plus = false + fallthrough + default: + p.ArgNum++ + } + return true +} + +// intFromArg gets the ArgNumth element of Args. On return, isInt reports +// whether the argument has integer type. +func (p *Parser) intFromArg() (num int, isInt bool) { + if p.ArgNum < len(p.Args) { + arg := p.Args[p.ArgNum] + num, isInt = arg.(int) // Almost always OK. + if !isInt { + // Work harder. + switch v := reflect.ValueOf(arg); v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n := v.Int() + if int64(int(n)) == n { + num = int(n) + isInt = true + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n := v.Uint() + if int64(n) >= 0 && uint64(int(n)) == n { + num = int(n) + isInt = true + } + default: + // Already 0, false. + } + } + p.ArgNum++ + if tooLarge(num) { + num = 0 + isInt = false + } + } + return +} + +// parseArgNumber returns the value of the bracketed number, minus 1 +// (explicit argument numbers are one-indexed but we want zero-indexed). +// The opening bracket is known to be present at format[0]. +// The returned values are the index, the number of bytes to consume +// up to the closing paren, if present, and whether the number parsed +// ok. The bytes to consume will be 1 if no closing paren is present. +func parseArgNumber(format string) (index int, wid int, ok bool) { + // There must be at least 3 bytes: [n]. + if len(format) < 3 { + return 0, 1, false + } + + // Find closing bracket. + for i := 1; i < len(format); i++ { + if format[i] == ']' { + width, ok, newi := parsenum(format, 1, i) + if !ok || newi != i { + return 0, i + 1, false + } + return width - 1, i + 1, true // arg numbers are one-indexed and skip paren. + } + } + return 0, 1, false +} + +// updateArgNumber returns the next argument to evaluate, which is either the value of the passed-in +// argNum or the value of the bracketed integer that begins format[i:]. It also returns +// the new value of i, that is, the index of the next byte of the format to process. +func (p *Parser) updateArgNumber(format string, i int) (newi int, found bool) { + if len(format) <= i || format[i] != '[' { + return i, false + } + p.Reordered = true + index, wid, ok := parseArgNumber(format[i:]) + if ok && 0 <= index && index < len(p.Args) { + p.ArgNum = index + return i + wid, true + } + p.goodArgNum = false + return i + wid, ok +} + +// tooLarge reports whether the magnitude of the integer is +// too large to be used as a formatting width or precision. +func tooLarge(x int) bool { + const max int = 1e6 + return x > max || x < -max +} + +// parsenum converts ASCII to integer. num is 0 (and isnum is false) if no number present. +func parsenum(s string, start, end int) (num int, isnum bool, newi int) { + if start >= end { + return 0, false, end + } + for newi = start; newi < end && '0' <= s[newi] && s[newi] <= '9'; newi++ { + if tooLarge(num) { + return 0, false, end // Overflow; crazy long number most likely. + } + num = num*10 + int(s[newi]-'0') + isnum = true + } + return +} diff --git a/tools/vendor/golang.org/x/text/internal/language/compact/tables.go b/tools/vendor/golang.org/x/text/internal/language/compact/tables.go index 32af9de59..a09ed198a 100644 --- a/tools/vendor/golang.org/x/text/internal/language/compact/tables.go +++ b/tools/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/tools/vendor/golang.org/x/text/internal/language/tables.go b/tools/vendor/golang.org/x/text/internal/language/tables.go index fb6b58378..14167e74e 100644 --- a/tools/vendor/golang.org/x/text/internal/language/tables.go +++ b/tools/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/tools/vendor/golang.org/x/text/internal/number/common.go b/tools/vendor/golang.org/x/text/internal/number/common.go new file mode 100644 index 000000000..a6e9c8e0d --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/common.go @@ -0,0 +1,55 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package number + +import ( + "unicode/utf8" + + "golang.org/x/text/internal/language/compact" +) + +// A system identifies a CLDR numbering system. +type system byte + +type systemData struct { + id system + digitSize byte // number of UTF-8 bytes per digit + zero [utf8.UTFMax]byte // UTF-8 sequence of zero digit. +} + +// A SymbolType identifies a symbol of a specific kind. +type SymbolType int + +const ( + SymDecimal SymbolType = iota + SymGroup + SymList + SymPercentSign + SymPlusSign + SymMinusSign + SymExponential + SymSuperscriptingExponent + SymPerMille + SymInfinity + SymNan + SymTimeSeparator + + NumSymbolTypes +) + +const hasNonLatnMask = 0x8000 + +// symOffset is an offset into altSymData if the bit indicated by hasNonLatnMask +// is not 0 (with this bit masked out), and an offset into symIndex otherwise. +// +// TODO: this type can be a byte again if we use an indirection into altsymData +// and introduce an alt -> offset slice (the length of this will be number of +// alternatives plus 1). This also allows getting rid of the compactTag field +// in altSymData. In total this will save about 1K. +type symOffset uint16 + +type altSymData struct { + compactTag compact.ID + symIndex symOffset + system system +} diff --git a/tools/vendor/golang.org/x/text/internal/number/decimal.go b/tools/vendor/golang.org/x/text/internal/number/decimal.go new file mode 100644 index 000000000..e128cf343 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/decimal.go @@ -0,0 +1,500 @@ +// 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:generate stringer -type RoundingMode + +package number + +import ( + "math" + "strconv" +) + +// RoundingMode determines how a number is rounded to the desired precision. +type RoundingMode byte + +const ( + ToNearestEven RoundingMode = iota // towards the nearest integer, or towards an even number if equidistant. + ToNearestZero // towards the nearest integer, or towards zero if equidistant. + ToNearestAway // towards the nearest integer, or away from zero if equidistant. + ToPositiveInf // towards infinity + ToNegativeInf // towards negative infinity + ToZero // towards zero + AwayFromZero // away from zero + numModes +) + +const maxIntDigits = 20 + +// A Decimal represents a floating point number in decimal format. +// Digits represents a number [0, 1.0), and the absolute value represented by +// Decimal is Digits * 10^Exp. Leading and trailing zeros may be omitted and Exp +// may point outside a valid position in Digits. +// +// Examples: +// +// Number Decimal +// 12345 Digits: [1, 2, 3, 4, 5], Exp: 5 +// 12.345 Digits: [1, 2, 3, 4, 5], Exp: 2 +// 12000 Digits: [1, 2], Exp: 5 +// 12000.00 Digits: [1, 2], Exp: 5 +// 0.00123 Digits: [1, 2, 3], Exp: -2 +// 0 Digits: [], Exp: 0 +type Decimal struct { + digits + + buf [maxIntDigits]byte +} + +type digits struct { + Digits []byte // mantissa digits, big-endian + Exp int32 // exponent + Neg bool + Inf bool // Takes precedence over Digits and Exp. + NaN bool // Takes precedence over Inf. +} + +// Digits represents a floating point number represented in digits of the +// base in which a number is to be displayed. It is similar to Decimal, but +// keeps track of trailing fraction zeros and the comma placement for +// engineering notation. Digits must have at least one digit. +// +// Examples: +// +// Number Decimal +// decimal +// 12345 Digits: [1, 2, 3, 4, 5], Exp: 5 End: 5 +// 12.345 Digits: [1, 2, 3, 4, 5], Exp: 2 End: 5 +// 12000 Digits: [1, 2], Exp: 5 End: 5 +// 12000.00 Digits: [1, 2], Exp: 5 End: 7 +// 0.00123 Digits: [1, 2, 3], Exp: -2 End: 3 +// 0 Digits: [], Exp: 0 End: 1 +// scientific (actual exp is Exp - Comma) +// 0e0 Digits: [0], Exp: 1, End: 1, Comma: 1 +// .0e0 Digits: [0], Exp: 0, End: 1, Comma: 0 +// 0.0e0 Digits: [0], Exp: 1, End: 2, Comma: 1 +// 1.23e4 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 1 +// .123e5 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 0 +// engineering +// 12.3e3 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 2 +type Digits struct { + digits + // End indicates the end position of the number. + End int32 // For decimals Exp <= End. For scientific len(Digits) <= End. + // Comma is used for the comma position for scientific (always 0 or 1) and + // engineering notation (always 0, 1, 2, or 3). + Comma uint8 + // IsScientific indicates whether this number is to be rendered as a + // scientific number. + IsScientific bool +} + +func (d *Digits) NumFracDigits() int { + if d.Exp >= d.End { + return 0 + } + return int(d.End - d.Exp) +} + +// normalize returns a new Decimal with leading and trailing zeros removed. +func (d *Decimal) normalize() (n Decimal) { + n = *d + b := n.Digits + // Strip leading zeros. Resulting number of digits is significant digits. + for len(b) > 0 && b[0] == 0 { + b = b[1:] + n.Exp-- + } + // Strip trailing zeros + for len(b) > 0 && b[len(b)-1] == 0 { + b = b[:len(b)-1] + } + if len(b) == 0 { + n.Exp = 0 + } + n.Digits = b + return n +} + +func (d *Decimal) clear() { + b := d.Digits + if b == nil { + b = d.buf[:0] + } + *d = Decimal{} + d.Digits = b[:0] +} + +func (x *Decimal) String() string { + if x.NaN { + return "NaN" + } + var buf []byte + if x.Neg { + buf = append(buf, '-') + } + if x.Inf { + buf = append(buf, "Inf"...) + return string(buf) + } + switch { + case len(x.Digits) == 0: + buf = append(buf, '0') + case x.Exp <= 0: + // 0.00ddd + buf = append(buf, "0."...) + buf = appendZeros(buf, -int(x.Exp)) + buf = appendDigits(buf, x.Digits) + + case /* 0 < */ int(x.Exp) < len(x.Digits): + // dd.ddd + buf = appendDigits(buf, x.Digits[:x.Exp]) + buf = append(buf, '.') + buf = appendDigits(buf, x.Digits[x.Exp:]) + + default: // len(x.Digits) <= x.Exp + // ddd00 + buf = appendDigits(buf, x.Digits) + buf = appendZeros(buf, int(x.Exp)-len(x.Digits)) + } + return string(buf) +} + +func appendDigits(buf []byte, digits []byte) []byte { + for _, c := range digits { + buf = append(buf, c+'0') + } + return buf +} + +// appendZeros appends n 0 digits to buf and returns buf. +func appendZeros(buf []byte, n int) []byte { + for ; n > 0; n-- { + buf = append(buf, '0') + } + return buf +} + +func (d *digits) round(mode RoundingMode, n int) { + if n >= len(d.Digits) { + return + } + // Make rounding decision: The result mantissa is truncated ("rounded down") + // by default. Decide if we need to increment, or "round up", the (unsigned) + // mantissa. + inc := false + switch mode { + case ToNegativeInf: + inc = d.Neg + case ToPositiveInf: + inc = !d.Neg + case ToZero: + // nothing to do + case AwayFromZero: + inc = true + case ToNearestEven: + inc = d.Digits[n] > 5 || d.Digits[n] == 5 && + (len(d.Digits) > n+1 || n == 0 || d.Digits[n-1]&1 != 0) + case ToNearestAway: + inc = d.Digits[n] >= 5 + case ToNearestZero: + inc = d.Digits[n] > 5 || d.Digits[n] == 5 && len(d.Digits) > n+1 + default: + panic("unreachable") + } + if inc { + d.roundUp(n) + } else { + d.roundDown(n) + } +} + +// roundFloat rounds a floating point number. +func (r RoundingMode) roundFloat(x float64) float64 { + // Make rounding decision: The result mantissa is truncated ("rounded down") + // by default. Decide if we need to increment, or "round up", the (unsigned) + // mantissa. + abs := x + if x < 0 { + abs = -x + } + i, f := math.Modf(abs) + if f == 0.0 { + return x + } + inc := false + switch r { + case ToNegativeInf: + inc = x < 0 + case ToPositiveInf: + inc = x >= 0 + case ToZero: + // nothing to do + case AwayFromZero: + inc = true + case ToNearestEven: + // TODO: check overflow + inc = f > 0.5 || f == 0.5 && int64(i)&1 != 0 + case ToNearestAway: + inc = f >= 0.5 + case ToNearestZero: + inc = f > 0.5 + default: + panic("unreachable") + } + if inc { + i += 1 + } + if abs != x { + i = -i + } + return i +} + +func (x *digits) roundUp(n int) { + if n < 0 || n >= len(x.Digits) { + return // nothing to do + } + // find first digit < 9 + for n > 0 && x.Digits[n-1] >= 9 { + n-- + } + + if n == 0 { + // all digits are 9s => round up to 1 and update exponent + x.Digits[0] = 1 // ok since len(x.Digits) > n + x.Digits = x.Digits[:1] + x.Exp++ + return + } + x.Digits[n-1]++ + x.Digits = x.Digits[:n] + // x already trimmed +} + +func (x *digits) roundDown(n int) { + if n < 0 || n >= len(x.Digits) { + return // nothing to do + } + x.Digits = x.Digits[:n] + trim(x) +} + +// trim cuts off any trailing zeros from x's mantissa; +// they are meaningless for the value of x. +func trim(x *digits) { + i := len(x.Digits) + for i > 0 && x.Digits[i-1] == 0 { + i-- + } + x.Digits = x.Digits[:i] + if i == 0 { + x.Exp = 0 + } +} + +// A Converter converts a number into decimals according to the given rounding +// criteria. +type Converter interface { + Convert(d *Decimal, r RoundingContext) +} + +const ( + signed = true + unsigned = false +) + +// Convert converts the given number to the decimal representation using the +// supplied RoundingContext. +func (d *Decimal) Convert(r RoundingContext, number interface{}) { + switch f := number.(type) { + case Converter: + d.clear() + f.Convert(d, r) + case float32: + d.ConvertFloat(r, float64(f), 32) + case float64: + d.ConvertFloat(r, f, 64) + case int: + d.ConvertInt(r, signed, uint64(f)) + case int8: + d.ConvertInt(r, signed, uint64(f)) + case int16: + d.ConvertInt(r, signed, uint64(f)) + case int32: + d.ConvertInt(r, signed, uint64(f)) + case int64: + d.ConvertInt(r, signed, uint64(f)) + case uint: + d.ConvertInt(r, unsigned, uint64(f)) + case uint8: + d.ConvertInt(r, unsigned, uint64(f)) + case uint16: + d.ConvertInt(r, unsigned, uint64(f)) + case uint32: + d.ConvertInt(r, unsigned, uint64(f)) + case uint64: + d.ConvertInt(r, unsigned, f) + + default: + d.NaN = true + // TODO: + // case string: if produced by strconv, allows for easy arbitrary pos. + // case reflect.Value: + // case big.Float + // case big.Int + // case big.Rat? + // catch underlyings using reflect or will this already be done by the + // message package? + } +} + +// ConvertInt converts an integer to decimals. +func (d *Decimal) ConvertInt(r RoundingContext, signed bool, x uint64) { + if r.Increment > 0 { + // TODO: if uint64 is too large, fall back to float64 + if signed { + d.ConvertFloat(r, float64(int64(x)), 64) + } else { + d.ConvertFloat(r, float64(x), 64) + } + return + } + d.clear() + if signed && int64(x) < 0 { + x = uint64(-int64(x)) + d.Neg = true + } + d.fillIntDigits(x) + d.Exp = int32(len(d.Digits)) +} + +// ConvertFloat converts a floating point number to decimals. +func (d *Decimal) ConvertFloat(r RoundingContext, x float64, size int) { + d.clear() + if math.IsNaN(x) { + d.NaN = true + return + } + // Simple case: decimal notation + if r.Increment > 0 { + scale := int(r.IncrementScale) + mult := 1.0 + if scale >= len(scales) { + mult = math.Pow(10, float64(scale)) + } else { + mult = scales[scale] + } + // We multiply x instead of dividing inc as it gives less rounding + // issues. + x *= mult + x /= float64(r.Increment) + x = r.Mode.roundFloat(x) + x *= float64(r.Increment) + x /= mult + } + + abs := x + if x < 0 { + d.Neg = true + abs = -x + } + if math.IsInf(abs, 1) { + d.Inf = true + return + } + + // By default we get the exact decimal representation. + verb := byte('g') + prec := -1 + // As the strconv API does not return the rounding accuracy, we can only + // round using ToNearestEven. + if r.Mode == ToNearestEven { + if n := r.RoundSignificantDigits(); n >= 0 { + prec = n + } else if n = r.RoundFractionDigits(); n >= 0 { + prec = n + verb = 'f' + } + } else { + // TODO: At this point strconv's rounding is imprecise to the point that + // it is not usable for this purpose. + // See https://github.com/golang/go/issues/21714 + // If rounding is requested, we ask for a large number of digits and + // round from there to simulate rounding only once. + // Ideally we would have strconv export an AppendDigits that would take + // a rounding mode and/or return an accuracy. Something like this would + // work: + // AppendDigits(dst []byte, x float64, base, size, prec int) (digits []byte, exp, accuracy int) + hasPrec := r.RoundSignificantDigits() >= 0 + hasScale := r.RoundFractionDigits() >= 0 + if hasPrec || hasScale { + // prec is the number of mantissa bits plus some extra for safety. + // We need at least the number of mantissa bits as decimals to + // accurately represent the floating point without rounding, as each + // bit requires one more decimal to represent: 0.5, 0.25, 0.125, ... + prec = 60 + } + } + + b := strconv.AppendFloat(d.Digits[:0], abs, verb, prec, size) + i := 0 + k := 0 + beforeDot := 1 + for i < len(b) { + if c := b[i]; '0' <= c && c <= '9' { + b[k] = c - '0' + k++ + d.Exp += int32(beforeDot) + } else if c == '.' { + beforeDot = 0 + d.Exp = int32(k) + } else { + break + } + i++ + } + d.Digits = b[:k] + if i != len(b) { + i += len("e") + pSign := i + exp := 0 + for i++; i < len(b); i++ { + exp *= 10 + exp += int(b[i] - '0') + } + if b[pSign] == '-' { + exp = -exp + } + d.Exp = int32(exp) + 1 + } +} + +func (d *Decimal) fillIntDigits(x uint64) { + if cap(d.Digits) < maxIntDigits { + d.Digits = d.buf[:] + } else { + d.Digits = d.buf[:maxIntDigits] + } + i := 0 + for ; x > 0; x /= 10 { + d.Digits[i] = byte(x % 10) + i++ + } + d.Digits = d.Digits[:i] + for p := 0; p < i; p++ { + i-- + d.Digits[p], d.Digits[i] = d.Digits[i], d.Digits[p] + } +} + +var scales [70]float64 + +func init() { + x := 1.0 + for i := range scales { + scales[i] = x + x *= 10 + } +} diff --git a/tools/vendor/golang.org/x/text/internal/number/format.go b/tools/vendor/golang.org/x/text/internal/number/format.go new file mode 100644 index 000000000..cd94c5dc4 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/format.go @@ -0,0 +1,535 @@ +// 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 number + +import ( + "strconv" + "unicode/utf8" + + "golang.org/x/text/language" +) + +// TODO: +// - grouping of fractions +// - allow user-defined superscript notation (such as 4) +// - same for non-breaking spaces, like   + +// A VisibleDigits computes digits, comma placement and trailing zeros as they +// will be shown to the user. +type VisibleDigits interface { + Digits(buf []byte, t language.Tag, scale int) Digits + // TODO: Do we also need to add the verb or pass a format.State? +} + +// Formatting proceeds along the following lines: +// 0) Compose rounding information from format and context. +// 1) Convert a number into a Decimal. +// 2) Sanitize Decimal by adding trailing zeros, removing leading digits, and +// (non-increment) rounding. The Decimal that results from this is suitable +// for determining the plural form. +// 3) Render the Decimal in the localized form. + +// Formatter contains all the information needed to render a number. +type Formatter struct { + Pattern + Info +} + +func (f *Formatter) init(t language.Tag, index []uint8) { + f.Info = InfoFromTag(t) + f.Pattern = formats[index[tagToID(t)]] +} + +// InitPattern initializes a Formatter for the given Pattern. +func (f *Formatter) InitPattern(t language.Tag, pat *Pattern) { + f.Info = InfoFromTag(t) + f.Pattern = *pat +} + +// InitDecimal initializes a Formatter using the default Pattern for the given +// language. +func (f *Formatter) InitDecimal(t language.Tag) { + f.init(t, tagToDecimal) +} + +// InitScientific initializes a Formatter using the default Pattern for the +// given language. +func (f *Formatter) InitScientific(t language.Tag) { + f.init(t, tagToScientific) + f.Pattern.MinFractionDigits = 0 + f.Pattern.MaxFractionDigits = -1 +} + +// InitEngineering initializes a Formatter using the default Pattern for the +// given language. +func (f *Formatter) InitEngineering(t language.Tag) { + f.init(t, tagToScientific) + f.Pattern.MinFractionDigits = 0 + f.Pattern.MaxFractionDigits = -1 + f.Pattern.MaxIntegerDigits = 3 + f.Pattern.MinIntegerDigits = 1 +} + +// InitPercent initializes a Formatter using the default Pattern for the given +// language. +func (f *Formatter) InitPercent(t language.Tag) { + f.init(t, tagToPercent) +} + +// InitPerMille initializes a Formatter using the default Pattern for the given +// language. +func (f *Formatter) InitPerMille(t language.Tag) { + f.init(t, tagToPercent) + f.Pattern.DigitShift = 3 +} + +func (f *Formatter) Append(dst []byte, x interface{}) []byte { + var d Decimal + r := f.RoundingContext + d.Convert(r, x) + return f.Render(dst, FormatDigits(&d, r)) +} + +func FormatDigits(d *Decimal, r RoundingContext) Digits { + if r.isScientific() { + return scientificVisibleDigits(r, d) + } + return decimalVisibleDigits(r, d) +} + +func (f *Formatter) Format(dst []byte, d *Decimal) []byte { + return f.Render(dst, FormatDigits(d, f.RoundingContext)) +} + +func (f *Formatter) Render(dst []byte, d Digits) []byte { + var result []byte + var postPrefix, preSuffix int + if d.IsScientific { + result, postPrefix, preSuffix = appendScientific(dst, f, &d) + } else { + result, postPrefix, preSuffix = appendDecimal(dst, f, &d) + } + if f.PadRune == 0 { + return result + } + width := int(f.FormatWidth) + if count := utf8.RuneCount(result); count < width { + insertPos := 0 + switch f.Flags & PadMask { + case PadAfterPrefix: + insertPos = postPrefix + case PadBeforeSuffix: + insertPos = preSuffix + case PadAfterSuffix: + insertPos = len(result) + } + num := width - count + pad := [utf8.UTFMax]byte{' '} + sz := 1 + if r := f.PadRune; r != 0 { + sz = utf8.EncodeRune(pad[:], r) + } + extra := sz * num + if n := len(result) + extra; n < cap(result) { + result = result[:n] + copy(result[insertPos+extra:], result[insertPos:]) + } else { + buf := make([]byte, n) + copy(buf, result[:insertPos]) + copy(buf[insertPos+extra:], result[insertPos:]) + result = buf + } + for ; num > 0; num-- { + insertPos += copy(result[insertPos:], pad[:sz]) + } + } + return result +} + +// decimalVisibleDigits converts d according to the RoundingContext. Note that +// the exponent may change as a result of this operation. +func decimalVisibleDigits(r RoundingContext, d *Decimal) Digits { + if d.NaN || d.Inf { + return Digits{digits: digits{Neg: d.Neg, NaN: d.NaN, Inf: d.Inf}} + } + n := Digits{digits: d.normalize().digits} + + exp := n.Exp + exp += int32(r.DigitShift) + + // Cap integer digits. Remove *most-significant* digits. + if r.MaxIntegerDigits > 0 { + if p := int(exp) - int(r.MaxIntegerDigits); p > 0 { + if p > len(n.Digits) { + p = len(n.Digits) + } + if n.Digits = n.Digits[p:]; len(n.Digits) == 0 { + exp = 0 + } else { + exp -= int32(p) + } + // Strip leading zeros. + for len(n.Digits) > 0 && n.Digits[0] == 0 { + n.Digits = n.Digits[1:] + exp-- + } + } + } + + // Rounding if not already done by Convert. + p := len(n.Digits) + if maxSig := int(r.MaxSignificantDigits); maxSig > 0 { + p = maxSig + } + if maxFrac := int(r.MaxFractionDigits); maxFrac >= 0 { + if cap := int(exp) + maxFrac; cap < p { + p = int(exp) + maxFrac + } + if p < 0 { + p = 0 + } + } + n.round(r.Mode, p) + + // set End (trailing zeros) + n.End = int32(len(n.Digits)) + if n.End == 0 { + exp = 0 + if r.MinFractionDigits > 0 { + n.End = int32(r.MinFractionDigits) + } + if p := int32(r.MinSignificantDigits) - 1; p > n.End { + n.End = p + } + } else { + if end := exp + int32(r.MinFractionDigits); end > n.End { + n.End = end + } + if n.End < int32(r.MinSignificantDigits) { + n.End = int32(r.MinSignificantDigits) + } + } + n.Exp = exp + return n +} + +// appendDecimal appends a formatted number to dst. It returns two possible +// insertion points for padding. +func appendDecimal(dst []byte, f *Formatter, n *Digits) (b []byte, postPre, preSuf int) { + if dst, ok := f.renderSpecial(dst, n); ok { + return dst, 0, len(dst) + } + digits := n.Digits + exp := n.Exp + + // Split in integer and fraction part. + var intDigits, fracDigits []byte + numInt := 0 + numFrac := int(n.End - n.Exp) + if exp > 0 { + numInt = int(exp) + if int(exp) >= len(digits) { // ddddd | ddddd00 + intDigits = digits + } else { // ddd.dd + intDigits = digits[:exp] + fracDigits = digits[exp:] + } + } else { + fracDigits = digits + } + + neg := n.Neg + affix, suffix := f.getAffixes(neg) + dst = appendAffix(dst, f, affix, neg) + savedLen := len(dst) + + minInt := int(f.MinIntegerDigits) + if minInt == 0 && f.MinSignificantDigits > 0 { + minInt = 1 + } + // add leading zeros + for i := minInt; i > numInt; i-- { + dst = f.AppendDigit(dst, 0) + if f.needsSep(i) { + dst = append(dst, f.Symbol(SymGroup)...) + } + } + i := 0 + for ; i < len(intDigits); i++ { + dst = f.AppendDigit(dst, intDigits[i]) + if f.needsSep(numInt - i) { + dst = append(dst, f.Symbol(SymGroup)...) + } + } + for ; i < numInt; i++ { + dst = f.AppendDigit(dst, 0) + if f.needsSep(numInt - i) { + dst = append(dst, f.Symbol(SymGroup)...) + } + } + + if numFrac > 0 || f.Flags&AlwaysDecimalSeparator != 0 { + dst = append(dst, f.Symbol(SymDecimal)...) + } + // Add trailing zeros + i = 0 + for n := -int(n.Exp); i < n; i++ { + dst = f.AppendDigit(dst, 0) + } + for _, d := range fracDigits { + i++ + dst = f.AppendDigit(dst, d) + } + for ; i < numFrac; i++ { + dst = f.AppendDigit(dst, 0) + } + return appendAffix(dst, f, suffix, neg), savedLen, len(dst) +} + +func scientificVisibleDigits(r RoundingContext, d *Decimal) Digits { + if d.NaN || d.Inf { + return Digits{digits: digits{Neg: d.Neg, NaN: d.NaN, Inf: d.Inf}} + } + n := Digits{digits: d.normalize().digits, IsScientific: true} + + // Normalize to have at least one digit. This simplifies engineering + // notation. + if len(n.Digits) == 0 { + n.Digits = append(n.Digits, 0) + n.Exp = 1 + } + + // Significant digits are transformed by the parser for scientific notation + // and do not need to be handled here. + maxInt, numInt := int(r.MaxIntegerDigits), int(r.MinIntegerDigits) + if numInt == 0 { + numInt = 1 + } + + // If a maximum number of integers is specified, the minimum must be 1 + // and the exponent is grouped by this number (e.g. for engineering) + if maxInt > numInt { + // Correct the exponent to reflect a single integer digit. + numInt = 1 + // engineering + // 0.01234 ([12345]e-1) -> 1.2345e-2 12.345e-3 + // 12345 ([12345]e+5) -> 1.2345e4 12.345e3 + d := int(n.Exp-1) % maxInt + if d < 0 { + d += maxInt + } + numInt += d + } + + p := len(n.Digits) + if maxSig := int(r.MaxSignificantDigits); maxSig > 0 { + p = maxSig + } + if maxFrac := int(r.MaxFractionDigits); maxFrac >= 0 && numInt+maxFrac < p { + p = numInt + maxFrac + } + n.round(r.Mode, p) + + n.Comma = uint8(numInt) + n.End = int32(len(n.Digits)) + if minSig := int32(r.MinFractionDigits) + int32(numInt); n.End < minSig { + n.End = minSig + } + return n +} + +// appendScientific appends a formatted number to dst. It returns two possible +// insertion points for padding. +func appendScientific(dst []byte, f *Formatter, n *Digits) (b []byte, postPre, preSuf int) { + if dst, ok := f.renderSpecial(dst, n); ok { + return dst, 0, 0 + } + digits := n.Digits + numInt := int(n.Comma) + numFrac := int(n.End) - int(n.Comma) + + var intDigits, fracDigits []byte + if numInt <= len(digits) { + intDigits = digits[:numInt] + fracDigits = digits[numInt:] + } else { + intDigits = digits + } + neg := n.Neg + affix, suffix := f.getAffixes(neg) + dst = appendAffix(dst, f, affix, neg) + savedLen := len(dst) + + i := 0 + for ; i < len(intDigits); i++ { + dst = f.AppendDigit(dst, intDigits[i]) + if f.needsSep(numInt - i) { + dst = append(dst, f.Symbol(SymGroup)...) + } + } + for ; i < numInt; i++ { + dst = f.AppendDigit(dst, 0) + if f.needsSep(numInt - i) { + dst = append(dst, f.Symbol(SymGroup)...) + } + } + + if numFrac > 0 || f.Flags&AlwaysDecimalSeparator != 0 { + dst = append(dst, f.Symbol(SymDecimal)...) + } + i = 0 + for ; i < len(fracDigits); i++ { + dst = f.AppendDigit(dst, fracDigits[i]) + } + for ; i < numFrac; i++ { + dst = f.AppendDigit(dst, 0) + } + + // exp + buf := [12]byte{} + // TODO: use exponential if superscripting is not available (no Latin + // numbers or no tags) and use exponential in all other cases. + exp := n.Exp - int32(n.Comma) + exponential := f.Symbol(SymExponential) + if exponential == "E" { + dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE + dst = append(dst, f.Symbol(SymSuperscriptingExponent)...) + dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE + dst = f.AppendDigit(dst, 1) + dst = f.AppendDigit(dst, 0) + switch { + case exp < 0: + dst = append(dst, superMinus...) + exp = -exp + case f.Flags&AlwaysExpSign != 0: + dst = append(dst, superPlus...) + } + b = strconv.AppendUint(buf[:0], uint64(exp), 10) + for i := len(b); i < int(f.MinExponentDigits); i++ { + dst = append(dst, superDigits[0]...) + } + for _, c := range b { + dst = append(dst, superDigits[c-'0']...) + } + } else { + dst = append(dst, exponential...) + switch { + case exp < 0: + dst = append(dst, f.Symbol(SymMinusSign)...) + exp = -exp + case f.Flags&AlwaysExpSign != 0: + dst = append(dst, f.Symbol(SymPlusSign)...) + } + b = strconv.AppendUint(buf[:0], uint64(exp), 10) + for i := len(b); i < int(f.MinExponentDigits); i++ { + dst = f.AppendDigit(dst, 0) + } + for _, c := range b { + dst = f.AppendDigit(dst, c-'0') + } + } + return appendAffix(dst, f, suffix, neg), savedLen, len(dst) +} + +const ( + superMinus = "\u207B" // SUPERSCRIPT HYPHEN-MINUS + superPlus = "\u207A" // SUPERSCRIPT PLUS SIGN +) + +var ( + // Note: the digits are not sequential!!! + superDigits = []string{ + "\u2070", // SUPERSCRIPT DIGIT ZERO + "\u00B9", // SUPERSCRIPT DIGIT ONE + "\u00B2", // SUPERSCRIPT DIGIT TWO + "\u00B3", // SUPERSCRIPT DIGIT THREE + "\u2074", // SUPERSCRIPT DIGIT FOUR + "\u2075", // SUPERSCRIPT DIGIT FIVE + "\u2076", // SUPERSCRIPT DIGIT SIX + "\u2077", // SUPERSCRIPT DIGIT SEVEN + "\u2078", // SUPERSCRIPT DIGIT EIGHT + "\u2079", // SUPERSCRIPT DIGIT NINE + } +) + +func (f *Formatter) getAffixes(neg bool) (affix, suffix string) { + str := f.Affix + if str != "" { + if f.NegOffset > 0 { + if neg { + str = str[f.NegOffset:] + } else { + str = str[:f.NegOffset] + } + } + sufStart := 1 + str[0] + affix = str[1:sufStart] + suffix = str[sufStart+1:] + } + // TODO: introduce a NeedNeg sign to indicate if the left pattern already + // has a sign marked? + if f.NegOffset == 0 && (neg || f.Flags&AlwaysSign != 0) { + affix = "-" + affix + } + return affix, suffix +} + +func (f *Formatter) renderSpecial(dst []byte, d *Digits) (b []byte, ok bool) { + if d.NaN { + return fmtNaN(dst, f), true + } + if d.Inf { + return fmtInfinite(dst, f, d), true + } + return dst, false +} + +func fmtNaN(dst []byte, f *Formatter) []byte { + return append(dst, f.Symbol(SymNan)...) +} + +func fmtInfinite(dst []byte, f *Formatter, d *Digits) []byte { + affix, suffix := f.getAffixes(d.Neg) + dst = appendAffix(dst, f, affix, d.Neg) + dst = append(dst, f.Symbol(SymInfinity)...) + dst = appendAffix(dst, f, suffix, d.Neg) + return dst +} + +func appendAffix(dst []byte, f *Formatter, affix string, neg bool) []byte { + quoting := false + escaping := false + for _, r := range affix { + switch { + case escaping: + // escaping occurs both inside and outside of quotes + dst = append(dst, string(r)...) + escaping = false + case r == '\\': + escaping = true + case r == '\'': + quoting = !quoting + case quoting: + dst = append(dst, string(r)...) + case r == '%': + if f.DigitShift == 3 { + dst = append(dst, f.Symbol(SymPerMille)...) + } else { + dst = append(dst, f.Symbol(SymPercentSign)...) + } + case r == '-' || r == '+': + if neg { + dst = append(dst, f.Symbol(SymMinusSign)...) + } else if f.Flags&ElideSign == 0 { + dst = append(dst, f.Symbol(SymPlusSign)...) + } else { + dst = append(dst, ' ') + } + default: + dst = append(dst, string(r)...) + } + } + return dst +} diff --git a/tools/vendor/golang.org/x/text/internal/number/number.go b/tools/vendor/golang.org/x/text/internal/number/number.go new file mode 100644 index 000000000..e1d933c3f --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/number.go @@ -0,0 +1,152 @@ +// 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:generate go run gen.go gen_common.go + +// Package number contains tools and data for formatting numbers. +package number + +import ( + "unicode/utf8" + + "golang.org/x/text/internal/language/compact" + "golang.org/x/text/language" +) + +// Info holds number formatting configuration data. +type Info struct { + system systemData // numbering system information + symIndex symOffset // index to symbols +} + +// InfoFromLangID returns a Info for the given compact language identifier and +// numbering system identifier. If system is the empty string, the default +// numbering system will be taken for that language. +func InfoFromLangID(compactIndex compact.ID, numberSystem string) Info { + p := langToDefaults[compactIndex] + // Lookup the entry for the language. + pSymIndex := symOffset(0) // Default: Latin, default symbols + system, ok := systemMap[numberSystem] + if !ok { + // Take the value for the default numbering system. This is by far the + // most common case as an alternative numbering system is hardly used. + if p&hasNonLatnMask == 0 { // Latn digits. + pSymIndex = p + } else { // Non-Latn or multiple numbering systems. + // Take the first entry from the alternatives list. + data := langToAlt[p&^hasNonLatnMask] + pSymIndex = data.symIndex + system = data.system + } + } else { + langIndex := compactIndex + ns := system + outerLoop: + for ; ; p = langToDefaults[langIndex] { + if p&hasNonLatnMask == 0 { + if ns == 0 { + // The index directly points to the symbol data. + pSymIndex = p + break + } + // Move to the parent and retry. + langIndex = langIndex.Parent() + } else { + // The index points to a list of symbol data indexes. + for _, e := range langToAlt[p&^hasNonLatnMask:] { + if e.compactTag != langIndex { + if langIndex == 0 { + // The CLDR root defines full symbol information for + // all numbering systems (even though mostly by + // means of aliases). Fall back to the default entry + // for Latn if there is no data for the numbering + // system of this language. + if ns == 0 { + break + } + // Fall back to Latin and start from the original + // language. See + // https://unicode.org/reports/tr35/#Locale_Inheritance. + ns = numLatn + langIndex = compactIndex + continue outerLoop + } + // Fall back to parent. + langIndex = langIndex.Parent() + } else if e.system == ns { + pSymIndex = e.symIndex + break outerLoop + } + } + } + } + } + if int(system) >= len(numSysData) { // algorithmic + // Will generate ASCII digits in case the user inadvertently calls + // WriteDigit or Digit on it. + d := numSysData[0] + d.id = system + return Info{ + system: d, + symIndex: pSymIndex, + } + } + return Info{ + system: numSysData[system], + symIndex: pSymIndex, + } +} + +// InfoFromTag returns a Info for the given language tag. +func InfoFromTag(t language.Tag) Info { + return InfoFromLangID(tagToID(t), t.TypeForKey("nu")) +} + +// IsDecimal reports if the numbering system can convert decimal to native +// symbols one-to-one. +func (n Info) IsDecimal() bool { + return int(n.system.id) < len(numSysData) +} + +// WriteDigit writes the UTF-8 sequence for n corresponding to the given ASCII +// digit to dst and reports the number of bytes written. dst must be large +// enough to hold the rune (can be up to utf8.UTFMax bytes). +func (n Info) WriteDigit(dst []byte, asciiDigit rune) int { + copy(dst, n.system.zero[:n.system.digitSize]) + dst[n.system.digitSize-1] += byte(asciiDigit - '0') + return int(n.system.digitSize) +} + +// AppendDigit appends the UTF-8 sequence for n corresponding to the given digit +// to dst and reports the number of bytes written. dst must be large enough to +// hold the rune (can be up to utf8.UTFMax bytes). +func (n Info) AppendDigit(dst []byte, digit byte) []byte { + dst = append(dst, n.system.zero[:n.system.digitSize]...) + dst[len(dst)-1] += digit + return dst +} + +// Digit returns the digit for the numbering system for the corresponding ASCII +// value. For example, ni.Digit('3') could return '三'. Note that the argument +// is the rune constant '3', which equals 51, not the integer constant 3. +func (n Info) Digit(asciiDigit rune) rune { + var x [utf8.UTFMax]byte + n.WriteDigit(x[:], asciiDigit) + r, _ := utf8.DecodeRune(x[:]) + return r +} + +// Symbol returns the string for the given symbol type. +func (n Info) Symbol(t SymbolType) string { + return symData.Elem(int(symIndex[n.symIndex][t])) +} + +func formatForLang(t language.Tag, index []byte) *Pattern { + return &formats[index[tagToID(t)]] +} + +func tagToID(t language.Tag) compact.ID { + id, _ := compact.RegionalID(compact.Tag(t)) + return id +} diff --git a/tools/vendor/golang.org/x/text/internal/number/pattern.go b/tools/vendor/golang.org/x/text/internal/number/pattern.go new file mode 100644 index 000000000..06e59559a --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/pattern.go @@ -0,0 +1,485 @@ +// 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 number + +import ( + "errors" + "unicode/utf8" +) + +// This file contains a parser for the CLDR number patterns as described in +// https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. +// +// The following BNF is derived from this standard. +// +// pattern := subpattern (';' subpattern)? +// subpattern := affix? number exponent? affix? +// number := decimal | sigDigits +// decimal := '#'* '0'* ('.' fraction)? | '#' | '0' +// fraction := '0'* '#'* +// sigDigits := '#'* '@' '@'* '#'* +// exponent := 'E' '+'? '0'* '0' +// padSpec := '*' \L +// +// Notes: +// - An affix pattern may contain any runes, but runes with special meaning +// should be escaped. +// - Sequences of digits, '#', and '@' in decimal and sigDigits may have +// interstitial commas. + +// TODO: replace special characters in affixes (-, +, ¤) with control codes. + +// Pattern holds information for formatting numbers. It is designed to hold +// information from CLDR number patterns. +// +// This pattern is precompiled for all patterns for all languages. Even though +// the number of patterns is not very large, we want to keep this small. +// +// This type is only intended for internal use. +type Pattern struct { + RoundingContext + + Affix string // includes prefix and suffix. First byte is prefix length. + Offset uint16 // Offset into Affix for prefix and suffix + NegOffset uint16 // Offset into Affix for negative prefix and suffix or 0. + PadRune rune + FormatWidth uint16 + + GroupingSize [2]uint8 + Flags PatternFlag +} + +// A RoundingContext indicates how a number should be converted to digits. +// It contains all information needed to determine the "visible digits" as +// required by the pluralization rules. +type RoundingContext struct { + // TODO: unify these two fields so that there is a more unambiguous meaning + // of how precision is handled. + MaxSignificantDigits int16 // -1 is unlimited + MaxFractionDigits int16 // -1 is unlimited + + Increment uint32 + IncrementScale uint8 // May differ from printed scale. + + Mode RoundingMode + + DigitShift uint8 // Number of decimals to shift. Used for % and ‰. + + // Number of digits. + MinIntegerDigits uint8 + + MaxIntegerDigits uint8 + MinFractionDigits uint8 + MinSignificantDigits uint8 + + MinExponentDigits uint8 +} + +// RoundSignificantDigits returns the number of significant digits an +// implementation of Convert may round to or n < 0 if there is no maximum or +// a maximum is not recommended. +func (r *RoundingContext) RoundSignificantDigits() (n int) { + if r.MaxFractionDigits == 0 && r.MaxSignificantDigits > 0 { + return int(r.MaxSignificantDigits) + } else if r.isScientific() && r.MaxIntegerDigits == 1 { + if r.MaxSignificantDigits == 0 || + int(r.MaxFractionDigits+1) == int(r.MaxSignificantDigits) { + // Note: don't add DigitShift: it is only used for decimals. + return int(r.MaxFractionDigits) + 1 + } + } + return -1 +} + +// RoundFractionDigits returns the number of fraction digits an implementation +// of Convert may round to or n < 0 if there is no maximum or a maximum is not +// recommended. +func (r *RoundingContext) RoundFractionDigits() (n int) { + if r.MinExponentDigits == 0 && + r.MaxSignificantDigits == 0 && + r.MaxFractionDigits >= 0 { + return int(r.MaxFractionDigits) + int(r.DigitShift) + } + return -1 +} + +// SetScale fixes the RoundingContext to a fixed number of fraction digits. +func (r *RoundingContext) SetScale(scale int) { + r.MinFractionDigits = uint8(scale) + r.MaxFractionDigits = int16(scale) +} + +func (r *RoundingContext) SetPrecision(prec int) { + r.MaxSignificantDigits = int16(prec) +} + +func (r *RoundingContext) isScientific() bool { + return r.MinExponentDigits > 0 +} + +func (f *Pattern) needsSep(pos int) bool { + p := pos - 1 + size := int(f.GroupingSize[0]) + if size == 0 || p == 0 { + return false + } + if p == size { + return true + } + if p -= size; p < 0 { + return false + } + // TODO: make second groupingsize the same as first if 0 so that we can + // avoid this check. + if x := int(f.GroupingSize[1]); x != 0 { + size = x + } + return p%size == 0 +} + +// A PatternFlag is a bit mask for the flag field of a Pattern. +type PatternFlag uint8 + +const ( + AlwaysSign PatternFlag = 1 << iota + ElideSign // Use space instead of plus sign. AlwaysSign must be true. + AlwaysExpSign + AlwaysDecimalSeparator + ParenthesisForNegative // Common pattern. Saves space. + + PadAfterNumber + PadAfterAffix + + PadBeforePrefix = 0 // Default + PadAfterPrefix = PadAfterAffix + PadBeforeSuffix = PadAfterNumber + PadAfterSuffix = PadAfterNumber | PadAfterAffix + PadMask = PadAfterNumber | PadAfterAffix +) + +type parser struct { + *Pattern + + leadingSharps int + + pos int + err error + doNotTerminate bool + groupingCount uint + hasGroup bool + buf []byte +} + +func (p *parser) setError(err error) { + if p.err == nil { + p.err = err + } +} + +func (p *parser) updateGrouping() { + if p.hasGroup && + 0 < p.groupingCount && p.groupingCount < 255 { + p.GroupingSize[1] = p.GroupingSize[0] + p.GroupingSize[0] = uint8(p.groupingCount) + } + p.groupingCount = 0 + p.hasGroup = true +} + +var ( + // TODO: more sensible and localizeable error messages. + errMultiplePadSpecifiers = errors.New("format: pattern has multiple pad specifiers") + errInvalidPadSpecifier = errors.New("format: invalid pad specifier") + errInvalidQuote = errors.New("format: invalid quote") + errAffixTooLarge = errors.New("format: prefix or suffix exceeds maximum UTF-8 length of 256 bytes") + errDuplicatePercentSign = errors.New("format: duplicate percent sign") + errDuplicatePermilleSign = errors.New("format: duplicate permille sign") + errUnexpectedEnd = errors.New("format: unexpected end of pattern") +) + +// ParsePattern extracts formatting information from a CLDR number pattern. +// +// See https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. +func ParsePattern(s string) (f *Pattern, err error) { + p := parser{Pattern: &Pattern{}} + + s = p.parseSubPattern(s) + + if s != "" { + // Parse negative sub pattern. + if s[0] != ';' { + p.setError(errors.New("format: error parsing first sub pattern")) + return nil, p.err + } + neg := parser{Pattern: &Pattern{}} // just for extracting the affixes. + s = neg.parseSubPattern(s[len(";"):]) + p.NegOffset = uint16(len(p.buf)) + p.buf = append(p.buf, neg.buf...) + } + if s != "" { + p.setError(errors.New("format: spurious characters at end of pattern")) + } + if p.err != nil { + return nil, p.err + } + if affix := string(p.buf); affix == "\x00\x00" || affix == "\x00\x00\x00\x00" { + // No prefix or suffixes. + p.NegOffset = 0 + } else { + p.Affix = affix + } + if p.Increment == 0 { + p.IncrementScale = 0 + } + return p.Pattern, nil +} + +func (p *parser) parseSubPattern(s string) string { + s = p.parsePad(s, PadBeforePrefix) + s = p.parseAffix(s) + s = p.parsePad(s, PadAfterPrefix) + + s = p.parse(p.number, s) + p.updateGrouping() + + s = p.parsePad(s, PadBeforeSuffix) + s = p.parseAffix(s) + s = p.parsePad(s, PadAfterSuffix) + return s +} + +func (p *parser) parsePad(s string, f PatternFlag) (tail string) { + if len(s) >= 2 && s[0] == '*' { + r, sz := utf8.DecodeRuneInString(s[1:]) + if p.PadRune != 0 { + p.err = errMultiplePadSpecifiers + } else { + p.Flags |= f + p.PadRune = r + } + return s[1+sz:] + } + return s +} + +func (p *parser) parseAffix(s string) string { + x := len(p.buf) + p.buf = append(p.buf, 0) // placeholder for affix length + + s = p.parse(p.affix, s) + + n := len(p.buf) - x - 1 + if n > 0xFF { + p.setError(errAffixTooLarge) + } + p.buf[x] = uint8(n) + return s +} + +// state implements a state transition. It returns the new state. A state +// function may set an error on the parser or may simply return on an incorrect +// token and let the next phase fail. +type state func(r rune) state + +// parse repeatedly applies a state function on the given string until a +// termination condition is reached. +func (p *parser) parse(fn state, s string) (tail string) { + for i, r := range s { + p.doNotTerminate = false + if fn = fn(r); fn == nil || p.err != nil { + return s[i:] + } + p.FormatWidth++ + } + if p.doNotTerminate { + p.setError(errUnexpectedEnd) + } + return "" +} + +func (p *parser) affix(r rune) state { + switch r { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '#', '@', '.', '*', ',', ';': + return nil + case '\'': + p.FormatWidth-- + return p.escapeFirst + case '%': + if p.DigitShift != 0 { + p.setError(errDuplicatePercentSign) + } + p.DigitShift = 2 + case '\u2030': // ‰ Per mille + if p.DigitShift != 0 { + p.setError(errDuplicatePermilleSign) + } + p.DigitShift = 3 + // TODO: handle currency somehow: ¤, ¤¤, ¤¤¤, ¤¤¤¤ + } + p.buf = append(p.buf, string(r)...) + return p.affix +} + +func (p *parser) escapeFirst(r rune) state { + switch r { + case '\'': + p.buf = append(p.buf, "\\'"...) + return p.affix + default: + p.buf = append(p.buf, '\'') + p.buf = append(p.buf, string(r)...) + } + return p.escape +} + +func (p *parser) escape(r rune) state { + switch r { + case '\'': + p.FormatWidth-- + p.buf = append(p.buf, '\'') + return p.affix + default: + p.buf = append(p.buf, string(r)...) + } + return p.escape +} + +// number parses a number. The BNF says the integer part should always have +// a '0', but that does not appear to be the case according to the rest of the +// documentation. We will allow having only '#' numbers. +func (p *parser) number(r rune) state { + switch r { + case '#': + p.groupingCount++ + p.leadingSharps++ + case '@': + p.groupingCount++ + p.leadingSharps = 0 + p.MaxFractionDigits = -1 + return p.sigDigits(r) + case ',': + if p.leadingSharps == 0 { // no leading commas + return nil + } + p.updateGrouping() + case 'E': + p.MaxIntegerDigits = uint8(p.leadingSharps) + return p.exponent + case '.': // allow ".##" etc. + p.updateGrouping() + return p.fraction + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + return p.integer(r) + default: + return nil + } + return p.number +} + +func (p *parser) integer(r rune) state { + if !('0' <= r && r <= '9') { + var next state + switch r { + case 'E': + if p.leadingSharps > 0 { + p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits + } + next = p.exponent + case '.': + next = p.fraction + case ',': + next = p.integer + } + p.updateGrouping() + return next + } + p.Increment = p.Increment*10 + uint32(r-'0') + p.groupingCount++ + p.MinIntegerDigits++ + return p.integer +} + +func (p *parser) sigDigits(r rune) state { + switch r { + case '@': + p.groupingCount++ + p.MaxSignificantDigits++ + p.MinSignificantDigits++ + case '#': + return p.sigDigitsFinal(r) + case 'E': + p.updateGrouping() + return p.normalizeSigDigitsWithExponent() + default: + p.updateGrouping() + return nil + } + return p.sigDigits +} + +func (p *parser) sigDigitsFinal(r rune) state { + switch r { + case '#': + p.groupingCount++ + p.MaxSignificantDigits++ + case 'E': + p.updateGrouping() + return p.normalizeSigDigitsWithExponent() + default: + p.updateGrouping() + return nil + } + return p.sigDigitsFinal +} + +func (p *parser) normalizeSigDigitsWithExponent() state { + p.MinIntegerDigits, p.MaxIntegerDigits = 1, 1 + p.MinFractionDigits = p.MinSignificantDigits - 1 + p.MaxFractionDigits = p.MaxSignificantDigits - 1 + p.MinSignificantDigits, p.MaxSignificantDigits = 0, 0 + return p.exponent +} + +func (p *parser) fraction(r rune) state { + switch r { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + p.Increment = p.Increment*10 + uint32(r-'0') + p.IncrementScale++ + p.MinFractionDigits++ + p.MaxFractionDigits++ + case '#': + p.MaxFractionDigits++ + case 'E': + if p.leadingSharps > 0 { + p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits + } + return p.exponent + default: + return nil + } + return p.fraction +} + +func (p *parser) exponent(r rune) state { + switch r { + case '+': + // Set mode and check it wasn't already set. + if p.Flags&AlwaysExpSign != 0 || p.MinExponentDigits > 0 { + break + } + p.Flags |= AlwaysExpSign + p.doNotTerminate = true + return p.exponent + case '0': + p.MinExponentDigits++ + return p.exponent + } + // termination condition + if p.MinExponentDigits == 0 { + p.setError(errors.New("format: need at least one digit")) + } + return nil +} diff --git a/tools/vendor/golang.org/x/text/internal/number/roundingmode_string.go b/tools/vendor/golang.org/x/text/internal/number/roundingmode_string.go new file mode 100644 index 000000000..bcc22471d --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/roundingmode_string.go @@ -0,0 +1,30 @@ +// Code generated by "stringer -type RoundingMode"; DO NOT EDIT. + +package number + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[ToNearestEven-0] + _ = x[ToNearestZero-1] + _ = x[ToNearestAway-2] + _ = x[ToPositiveInf-3] + _ = x[ToNegativeInf-4] + _ = x[ToZero-5] + _ = x[AwayFromZero-6] + _ = x[numModes-7] +} + +const _RoundingMode_name = "ToNearestEvenToNearestZeroToNearestAwayToPositiveInfToNegativeInfToZeroAwayFromZeronumModes" + +var _RoundingMode_index = [...]uint8{0, 13, 26, 39, 52, 65, 71, 83, 91} + +func (i RoundingMode) String() string { + if i >= RoundingMode(len(_RoundingMode_index)-1) { + return "RoundingMode(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _RoundingMode_name[_RoundingMode_index[i]:_RoundingMode_index[i+1]] +} diff --git a/tools/vendor/golang.org/x/text/internal/number/tables.go b/tools/vendor/golang.org/x/text/internal/number/tables.go new file mode 100644 index 000000000..8efce81b5 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/number/tables.go @@ -0,0 +1,1219 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package number + +import "golang.org/x/text/internal/stringset" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "32" + +var numSysData = []systemData{ // 59 elements + 0: {id: 0x0, digitSize: 0x1, zero: [4]uint8{0x30, 0x0, 0x0, 0x0}}, + 1: {id: 0x1, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9e, 0xa5, 0x90}}, + 2: {id: 0x2, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9c, 0xb0}}, + 3: {id: 0x3, digitSize: 0x2, zero: [4]uint8{0xd9, 0xa0, 0x0, 0x0}}, + 4: {id: 0x4, digitSize: 0x2, zero: [4]uint8{0xdb, 0xb0, 0x0, 0x0}}, + 5: {id: 0x5, digitSize: 0x3, zero: [4]uint8{0xe1, 0xad, 0x90, 0x0}}, + 6: {id: 0x6, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa7, 0xa6, 0x0}}, + 7: {id: 0x7, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xb1, 0x90}}, + 8: {id: 0x8, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x81, 0xa6}}, + 9: {id: 0x9, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x84, 0xb6}}, + 10: {id: 0xa, digitSize: 0x3, zero: [4]uint8{0xea, 0xa9, 0x90, 0x0}}, + 11: {id: 0xb, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa5, 0xa6, 0x0}}, + 12: {id: 0xc, digitSize: 0x3, zero: [4]uint8{0xef, 0xbc, 0x90, 0x0}}, + 13: {id: 0xd, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xb5, 0x90}}, + 14: {id: 0xe, digitSize: 0x3, zero: [4]uint8{0xe0, 0xab, 0xa6, 0x0}}, + 15: {id: 0xf, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa9, 0xa6, 0x0}}, + 16: {id: 0x10, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xad, 0x90}}, + 17: {id: 0x11, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0x90, 0x0}}, + 18: {id: 0x12, digitSize: 0x3, zero: [4]uint8{0xea, 0xa4, 0x80, 0x0}}, + 19: {id: 0x13, digitSize: 0x3, zero: [4]uint8{0xe1, 0x9f, 0xa0, 0x0}}, + 20: {id: 0x14, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb3, 0xa6, 0x0}}, + 21: {id: 0x15, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x80, 0x0}}, + 22: {id: 0x16, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x90, 0x0}}, + 23: {id: 0x17, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbb, 0x90, 0x0}}, + 24: {id: 0x18, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x80, 0x0}}, + 25: {id: 0x19, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa5, 0x86, 0x0}}, + 26: {id: 0x1a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x8e}}, + 27: {id: 0x1b, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x98}}, + 28: {id: 0x1c, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xb6}}, + 29: {id: 0x1d, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xac}}, + 30: {id: 0x1e, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xa2}}, + 31: {id: 0x1f, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb5, 0xa6, 0x0}}, + 32: {id: 0x20, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x99, 0x90}}, + 33: {id: 0x21, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa0, 0x90, 0x0}}, + 34: {id: 0x22, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xa9, 0xa0}}, + 35: {id: 0x23, digitSize: 0x3, zero: [4]uint8{0xea, 0xaf, 0xb0, 0x0}}, + 36: {id: 0x24, digitSize: 0x3, zero: [4]uint8{0xe1, 0x81, 0x80, 0x0}}, + 37: {id: 0x25, digitSize: 0x3, zero: [4]uint8{0xe1, 0x82, 0x90, 0x0}}, + 38: {id: 0x26, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0xb0, 0x0}}, + 39: {id: 0x27, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x91, 0x90}}, + 40: {id: 0x28, digitSize: 0x2, zero: [4]uint8{0xdf, 0x80, 0x0, 0x0}}, + 41: {id: 0x29, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x90, 0x0}}, + 42: {id: 0x2a, digitSize: 0x3, zero: [4]uint8{0xe0, 0xad, 0xa6, 0x0}}, + 43: {id: 0x2b, digitSize: 0x4, zero: [4]uint8{0xf0, 0x90, 0x92, 0xa0}}, + 44: {id: 0x2c, digitSize: 0x3, zero: [4]uint8{0xea, 0xa3, 0x90, 0x0}}, + 45: {id: 0x2d, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x87, 0x90}}, + 46: {id: 0x2e, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x8b, 0xb0}}, + 47: {id: 0x2f, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb7, 0xa6, 0x0}}, + 48: {id: 0x30, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x83, 0xb0}}, + 49: {id: 0x31, digitSize: 0x3, zero: [4]uint8{0xe1, 0xae, 0xb0, 0x0}}, + 50: {id: 0x32, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9b, 0x80}}, + 51: {id: 0x33, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa7, 0x90, 0x0}}, + 52: {id: 0x34, digitSize: 0x3, zero: [4]uint8{0xe0, 0xaf, 0xa6, 0x0}}, + 53: {id: 0x35, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb1, 0xa6, 0x0}}, + 54: {id: 0x36, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb9, 0x90, 0x0}}, + 55: {id: 0x37, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbc, 0xa0, 0x0}}, + 56: {id: 0x38, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x93, 0x90}}, + 57: {id: 0x39, digitSize: 0x3, zero: [4]uint8{0xea, 0x98, 0xa0, 0x0}}, + 58: {id: 0x3a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xa3, 0xa0}}, +} // Size: 378 bytes + +const ( + numAdlm = 0x1 + numAhom = 0x2 + numArab = 0x3 + numArabext = 0x4 + numArmn = 0x3b + numArmnlow = 0x3c + numBali = 0x5 + numBeng = 0x6 + numBhks = 0x7 + numBrah = 0x8 + numCakm = 0x9 + numCham = 0xa + numCyrl = 0x3d + numDeva = 0xb + numEthi = 0x3e + numFullwide = 0xc + numGeor = 0x3f + numGonm = 0xd + numGrek = 0x40 + numGreklow = 0x41 + numGujr = 0xe + numGuru = 0xf + numHanidays = 0x42 + numHanidec = 0x43 + numHans = 0x44 + numHansfin = 0x45 + numHant = 0x46 + numHantfin = 0x47 + numHebr = 0x48 + numHmng = 0x10 + numJava = 0x11 + numJpan = 0x49 + numJpanfin = 0x4a + numKali = 0x12 + numKhmr = 0x13 + numKnda = 0x14 + numLana = 0x15 + numLanatham = 0x16 + numLaoo = 0x17 + numLatn = 0x0 + numLepc = 0x18 + numLimb = 0x19 + numMathbold = 0x1a + numMathdbl = 0x1b + numMathmono = 0x1c + numMathsanb = 0x1d + numMathsans = 0x1e + numMlym = 0x1f + numModi = 0x20 + numMong = 0x21 + numMroo = 0x22 + numMtei = 0x23 + numMymr = 0x24 + numMymrshan = 0x25 + numMymrtlng = 0x26 + numNewa = 0x27 + numNkoo = 0x28 + numOlck = 0x29 + numOrya = 0x2a + numOsma = 0x2b + numRoman = 0x4b + numRomanlow = 0x4c + numSaur = 0x2c + numShrd = 0x2d + numSind = 0x2e + numSinh = 0x2f + numSora = 0x30 + numSund = 0x31 + numTakr = 0x32 + numTalu = 0x33 + numTaml = 0x4d + numTamldec = 0x34 + numTelu = 0x35 + numThai = 0x36 + numTibt = 0x37 + numTirh = 0x38 + numVaii = 0x39 + numWara = 0x3a + numNumberSystems +) + +var systemMap = map[string]system{ + "adlm": numAdlm, + "ahom": numAhom, + "arab": numArab, + "arabext": numArabext, + "armn": numArmn, + "armnlow": numArmnlow, + "bali": numBali, + "beng": numBeng, + "bhks": numBhks, + "brah": numBrah, + "cakm": numCakm, + "cham": numCham, + "cyrl": numCyrl, + "deva": numDeva, + "ethi": numEthi, + "fullwide": numFullwide, + "geor": numGeor, + "gonm": numGonm, + "grek": numGrek, + "greklow": numGreklow, + "gujr": numGujr, + "guru": numGuru, + "hanidays": numHanidays, + "hanidec": numHanidec, + "hans": numHans, + "hansfin": numHansfin, + "hant": numHant, + "hantfin": numHantfin, + "hebr": numHebr, + "hmng": numHmng, + "java": numJava, + "jpan": numJpan, + "jpanfin": numJpanfin, + "kali": numKali, + "khmr": numKhmr, + "knda": numKnda, + "lana": numLana, + "lanatham": numLanatham, + "laoo": numLaoo, + "latn": numLatn, + "lepc": numLepc, + "limb": numLimb, + "mathbold": numMathbold, + "mathdbl": numMathdbl, + "mathmono": numMathmono, + "mathsanb": numMathsanb, + "mathsans": numMathsans, + "mlym": numMlym, + "modi": numModi, + "mong": numMong, + "mroo": numMroo, + "mtei": numMtei, + "mymr": numMymr, + "mymrshan": numMymrshan, + "mymrtlng": numMymrtlng, + "newa": numNewa, + "nkoo": numNkoo, + "olck": numOlck, + "orya": numOrya, + "osma": numOsma, + "roman": numRoman, + "romanlow": numRomanlow, + "saur": numSaur, + "shrd": numShrd, + "sind": numSind, + "sinh": numSinh, + "sora": numSora, + "sund": numSund, + "takr": numTakr, + "talu": numTalu, + "taml": numTaml, + "tamldec": numTamldec, + "telu": numTelu, + "thai": numThai, + "tibt": numTibt, + "tirh": numTirh, + "vaii": numVaii, + "wara": numWara, +} + +var symIndex = [][12]uint8{ // 81 elements + 0: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 1: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 2: [12]uint8{0x0, 0x1, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, + 3: [12]uint8{0x1, 0x0, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, + 4: [12]uint8{0x0, 0x1, 0x2, 0x11, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, + 5: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x12, 0xb}, + 6: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 7: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x13, 0xb}, + 8: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 9: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 10: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 11: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 12: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 13: [12]uint8{0x0, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 14: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x16, 0xb}, + 15: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 16: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0x0}, + 17: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 18: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 19: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, + 20: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x19, 0x1a, 0xa, 0xb}, + 21: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 22: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, + 23: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 24: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0x1d, 0xb}, + 25: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0x1e, 0x0}, + 26: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 27: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 28: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x1f, 0xb}, + 29: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 30: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x20, 0xb}, + 31: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x21, 0x7, 0x8, 0x9, 0x22, 0xb}, + 32: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x23, 0xb}, + 33: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x14, 0x8, 0x9, 0x24, 0xb}, + 34: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0x24, 0xb}, + 35: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x25, 0xb}, + 36: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x26, 0xb}, + 37: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x27, 0xb}, + 38: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x28, 0xb}, + 39: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x29, 0xb}, + 40: [12]uint8{0x1, 0x0, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 41: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2a, 0xb}, + 42: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2b, 0xb}, + 43: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x2c, 0x14, 0x8, 0x9, 0x24, 0xb}, + 44: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 45: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 46: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 47: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2d, 0x0}, + 48: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2e, 0xb}, + 49: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2f, 0xb}, + 50: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x30, 0x7, 0x8, 0x9, 0xa, 0xb}, + 51: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x31, 0xb}, + 52: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x32, 0xb}, + 53: [12]uint8{0x1, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 54: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x33, 0xb}, + 55: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x34, 0xb}, + 56: [12]uint8{0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 57: [12]uint8{0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x7, 0x3c, 0x9, 0x3d, 0xb}, + 58: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x3e, 0x3f, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 59: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x39, 0x3a, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 60: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x39, 0x40, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 61: [12]uint8{0x35, 0x36, 0x37, 0x41, 0x3e, 0x3f, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 62: [12]uint8{0x35, 0x36, 0x37, 0x38, 0x3e, 0x3f, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0xb}, + 63: [12]uint8{0x35, 0xc, 0x37, 0x38, 0x39, 0x42, 0x3b, 0x7, 0x3c, 0x9, 0xa, 0x0}, + 64: [12]uint8{0x35, 0xc, 0x37, 0x38, 0x39, 0x42, 0x43, 0x7, 0x44, 0x9, 0x24, 0xb}, + 65: [12]uint8{0x35, 0x36, 0x37, 0x38, 0x39, 0x5, 0x3b, 0x7, 0x3c, 0x9, 0x33, 0xb}, + 66: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x45, 0x46, 0x43, 0x7, 0x3c, 0x9, 0xa, 0x35}, + 67: [12]uint8{0x35, 0x36, 0x37, 0x11, 0xe, 0x1c, 0x43, 0x7, 0x3c, 0x9, 0x1d, 0xb}, + 68: [12]uint8{0x35, 0x36, 0x37, 0x11, 0xe, 0x1c, 0x43, 0x7, 0x3c, 0x9, 0xa, 0x35}, + 69: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x45, 0x5, 0x43, 0x7, 0x3c, 0x9, 0xa, 0x35}, + 70: [12]uint8{0x1, 0xc, 0x37, 0x11, 0x45, 0x47, 0x43, 0x7, 0x3c, 0x9, 0xa, 0x0}, + 71: [12]uint8{0x35, 0x1, 0x37, 0x11, 0x4, 0x5, 0x43, 0x7, 0x3c, 0x9, 0xa, 0x35}, + 72: [12]uint8{0x1, 0xc, 0x37, 0x11, 0x45, 0x47, 0x43, 0x7, 0x3c, 0x9, 0x24, 0xb}, + 73: [12]uint8{0x35, 0x36, 0x2, 0x3, 0x45, 0x46, 0x43, 0x7, 0x8, 0x9, 0xa, 0x35}, + 74: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x4, 0x5, 0x43, 0x7, 0x3c, 0x9, 0x31, 0x35}, + 75: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x4, 0x5, 0x43, 0x7, 0x3c, 0x9, 0x32, 0x35}, + 76: [12]uint8{0x35, 0x36, 0x37, 0x11, 0x48, 0x46, 0x43, 0x7, 0x3c, 0x9, 0x33, 0x35}, + 77: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x49}, + 78: [12]uint8{0x0, 0x1, 0x4a, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x28, 0xb}, + 79: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x4b, 0xb}, + 80: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x4c, 0x4d, 0xb}, +} // Size: 996 bytes + +var symData = stringset.Set{ + Data: "" + // Size: 599 bytes + ".,;%+-E׉∞NaN:\u00a0\u200e%\u200e\u200e+\u200e-ليس\u00a0رقمًا٪NDТерхьаш" + + "\u00a0дац·’mnne×10^0/00INF−\u200e−ناعددepälukuÕˆÕ¹Ô¹áƒáƒ \u00a0áƒáƒ áƒ˜áƒ¡\u00a0რიცხვ" + + "იZMdMÑан\u00a0емеѤ¤¤Ñан\u00a0ÑмеÑບà»à»ˆ\u200bà»àº¡à»ˆàº™\u200bໂຕ\u200bເລàºNSဂá€á€”်" + + "းမဟုá€á€ºá€žá€±á€¬ÐÐне\u00a0чиÑлочыыһыла\u00a0буотах·10^epilohosan\u00a0dälTFЕs" + + "on\u00a0emasҳақиқий\u00a0Ñон\u00a0ÑмаÑéžæ•¸å€¼éžæ•°å€¼Ù«Ù¬Ø›Ùª\u061c\u061c+\u061c-اس؉ل" + + "يس\u00a0رقم\u200f+\u200f-\u200f−٪\u200f\u061c−×۱۰^؉\u200f\u200e+\u200e" + + "\u200e-\u200e\u200e−\u200e+\u200e:áŠà½¨à½„་མེན་གྲངས་མེདཨང་མད", + Index: []uint16{ // 79 elements + // Entry 0 - 3F + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0009, 0x000c, 0x000f, 0x0012, 0x0013, 0x0015, 0x001c, 0x0020, + 0x0024, 0x0036, 0x0038, 0x003a, 0x0050, 0x0052, 0x0055, 0x0058, + 0x0059, 0x005e, 0x0062, 0x0065, 0x0068, 0x006e, 0x0078, 0x0080, + 0x0086, 0x00ae, 0x00af, 0x00b2, 0x00c2, 0x00c8, 0x00d8, 0x0105, + 0x0107, 0x012e, 0x0132, 0x0142, 0x015e, 0x0163, 0x016a, 0x0173, + 0x0175, 0x0177, 0x0180, 0x01a0, 0x01a9, 0x01b2, 0x01b4, 0x01b6, + 0x01b8, 0x01bc, 0x01bf, 0x01c2, 0x01c6, 0x01c8, 0x01d6, 0x01da, + // Entry 40 - 7F + 0x01de, 0x01e4, 0x01e9, 0x01ee, 0x01f5, 0x01fa, 0x0201, 0x0208, + 0x0211, 0x0215, 0x0218, 0x021b, 0x0230, 0x0248, 0x0257, + }, +} // Size: 797 bytes + +// langToDefaults maps a compact language index to the default numbering system +// and default symbol set +var langToDefaults = [775]symOffset{ + // Entry 0 - 3F + 0x8000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 0x0004, + 0x0002, 0x0004, 0x0002, 0x0002, 0x0002, 0x0003, 0x0002, 0x0000, + 0x8005, 0x0000, 0x0000, 0x0000, 0x8006, 0x0005, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x8009, 0x0000, 0x0000, 0x800a, 0x0000, 0x0000, 0x800c, 0x0001, + 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x800e, 0x0000, 0x0000, 0x0007, + 0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 0x800f, 0x0008, 0x0008, + 0x8011, 0x0001, 0x0001, 0x0001, 0x803c, 0x0000, 0x0009, 0x0009, + 0x0009, 0x0000, 0x0000, 0x000a, 0x000b, 0x000a, 0x000c, 0x000a, + 0x000a, 0x000c, 0x000a, 0x000d, 0x000d, 0x000a, 0x000a, 0x0001, + 0x0001, 0x0000, 0x0001, 0x0001, 0x803f, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x000e, 0x000e, 0x000e, 0x000f, 0x000f, 0x000f, 0x0000, 0x0000, + 0x0006, 0x0000, 0x0000, 0x0000, 0x000a, 0x0010, 0x0000, 0x0006, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011, 0x0000, 0x000a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0000, 0x0009, 0x0000, + 0x0000, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x0000, + 0x0000, 0x000f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0015, + 0x0015, 0x0006, 0x0000, 0x0006, 0x0006, 0x0000, 0x0000, 0x0006, + 0x0006, 0x0001, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, + 0x0000, 0x0006, 0x0000, 0x0000, 0x0006, 0x0006, 0x0016, 0x0016, + 0x0017, 0x0017, 0x0001, 0x0001, 0x8041, 0x0018, 0x0018, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0019, 0x0019, 0x0000, 0x0000, + 0x0017, 0x0017, 0x0017, 0x8044, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, + // Entry 140 - 17F + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0000, 0x0000, + 0x8047, 0x0000, 0x0006, 0x0006, 0x001a, 0x001a, 0x001a, 0x001a, + 0x804a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x804c, 0x001b, 0x0000, + 0x0000, 0x0006, 0x0006, 0x0006, 0x000a, 0x000a, 0x0001, 0x0001, + 0x001c, 0x001c, 0x0009, 0x0009, 0x804f, 0x0000, 0x0000, 0x0000, + // Entry 180 - 1BF + 0x0000, 0x0000, 0x8052, 0x0006, 0x0006, 0x001d, 0x0006, 0x0006, + 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001e, 0x001e, 0x001f, + 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, + 0x0001, 0x000d, 0x000d, 0x0000, 0x0000, 0x0020, 0x0020, 0x0006, + 0x0006, 0x0021, 0x0021, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, + 0x0000, 0x8054, 0x0000, 0x0000, 0x0000, 0x0000, 0x8056, 0x001b, + 0x0000, 0x0000, 0x0001, 0x0001, 0x0022, 0x0022, 0x0000, 0x0000, + // Entry 1C0 - 1FF + 0x0000, 0x0023, 0x0023, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0024, 0x0024, 0x8058, 0x0000, 0x0000, 0x0016, 0x0016, 0x0006, + 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0025, 0x0025, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x000d, 0x0000, 0x0000, + 0x0006, 0x0006, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x805a, 0x0000, 0x0000, 0x0006, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x805b, 0x0026, 0x805d, + // Entry 200 - 23F + 0x0000, 0x0000, 0x0000, 0x0000, 0x805e, 0x0015, 0x0015, 0x0000, + 0x0000, 0x0006, 0x0006, 0x0006, 0x8061, 0x0000, 0x0000, 0x8062, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, + 0x0001, 0x0015, 0x0015, 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0027, 0x0027, 0x0027, 0x8065, 0x8067, + 0x001b, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, + 0x8069, 0x0028, 0x0006, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, + // Entry 240 - 27F + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0006, 0x0000, 0x0000, 0x001a, 0x001a, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0006, 0x0006, 0x0000, 0x0000, 0x002a, + 0x002a, 0x0000, 0x0000, 0x0000, 0x0000, 0x806b, 0x0000, 0x0000, + 0x002b, 0x002b, 0x002b, 0x002b, 0x0006, 0x0006, 0x000d, 0x000d, + 0x0006, 0x0006, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x002c, 0x002c, 0x002d, 0x002d, 0x002e, 0x002e, 0x0000, 0x0000, + // Entry 280 - 2BF + 0x0000, 0x002f, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, 0x806d, 0x0022, 0x0022, + 0x0022, 0x0000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0030, 0x0030, 0x0000, 0x0000, 0x8071, 0x0031, 0x0006, + // Entry 2C0 - 2FF + 0x0006, 0x0006, 0x0000, 0x0001, 0x0001, 0x000d, 0x000d, 0x0001, + 0x0001, 0x0000, 0x0000, 0x0032, 0x0032, 0x8074, 0x8076, 0x001b, + 0x8077, 0x8079, 0x0028, 0x807b, 0x0034, 0x0033, 0x0033, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0035, 0x0035, 0x0006, 0x0006, + 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0036, 0x0037, 0x0037, 0x0036, 0x0036, 0x0001, + 0x0001, 0x807d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, + // Entry 300 - 33F + 0x0036, 0x0036, 0x0036, 0x0000, 0x0000, 0x0006, 0x0014, +} // Size: 1550 bytes + +// langToAlt is a list of numbering system and symbol set pairs, sorted and +// marked by compact language index. +var langToAlt = []altSymData{ // 131 elements + 1: {compactTag: 0x0, symIndex: 0x38, system: 0x3}, + 2: {compactTag: 0x0, symIndex: 0x42, system: 0x4}, + 3: {compactTag: 0xa, symIndex: 0x39, system: 0x3}, + 4: {compactTag: 0xa, symIndex: 0x2, system: 0x0}, + 5: {compactTag: 0x28, symIndex: 0x0, system: 0x6}, + 6: {compactTag: 0x2c, symIndex: 0x5, system: 0x0}, + 7: {compactTag: 0x2c, symIndex: 0x3a, system: 0x3}, + 8: {compactTag: 0x2c, symIndex: 0x42, system: 0x4}, + 9: {compactTag: 0x40, symIndex: 0x0, system: 0x6}, + 10: {compactTag: 0x43, symIndex: 0x0, system: 0x0}, + 11: {compactTag: 0x43, symIndex: 0x4f, system: 0x37}, + 12: {compactTag: 0x46, symIndex: 0x1, system: 0x0}, + 13: {compactTag: 0x46, symIndex: 0x38, system: 0x3}, + 14: {compactTag: 0x54, symIndex: 0x0, system: 0x9}, + 15: {compactTag: 0x5d, symIndex: 0x3a, system: 0x3}, + 16: {compactTag: 0x5d, symIndex: 0x8, system: 0x0}, + 17: {compactTag: 0x60, symIndex: 0x1, system: 0x0}, + 18: {compactTag: 0x60, symIndex: 0x38, system: 0x3}, + 19: {compactTag: 0x60, symIndex: 0x42, system: 0x4}, + 20: {compactTag: 0x60, symIndex: 0x0, system: 0x5}, + 21: {compactTag: 0x60, symIndex: 0x0, system: 0x6}, + 22: {compactTag: 0x60, symIndex: 0x0, system: 0x8}, + 23: {compactTag: 0x60, symIndex: 0x0, system: 0x9}, + 24: {compactTag: 0x60, symIndex: 0x0, system: 0xa}, + 25: {compactTag: 0x60, symIndex: 0x0, system: 0xb}, + 26: {compactTag: 0x60, symIndex: 0x0, system: 0xc}, + 27: {compactTag: 0x60, symIndex: 0x0, system: 0xd}, + 28: {compactTag: 0x60, symIndex: 0x0, system: 0xe}, + 29: {compactTag: 0x60, symIndex: 0x0, system: 0xf}, + 30: {compactTag: 0x60, symIndex: 0x0, system: 0x11}, + 31: {compactTag: 0x60, symIndex: 0x0, system: 0x12}, + 32: {compactTag: 0x60, symIndex: 0x0, system: 0x13}, + 33: {compactTag: 0x60, symIndex: 0x0, system: 0x14}, + 34: {compactTag: 0x60, symIndex: 0x0, system: 0x15}, + 35: {compactTag: 0x60, symIndex: 0x0, system: 0x16}, + 36: {compactTag: 0x60, symIndex: 0x0, system: 0x17}, + 37: {compactTag: 0x60, symIndex: 0x0, system: 0x18}, + 38: {compactTag: 0x60, symIndex: 0x0, system: 0x19}, + 39: {compactTag: 0x60, symIndex: 0x0, system: 0x1f}, + 40: {compactTag: 0x60, symIndex: 0x0, system: 0x21}, + 41: {compactTag: 0x60, symIndex: 0x0, system: 0x23}, + 42: {compactTag: 0x60, symIndex: 0x0, system: 0x24}, + 43: {compactTag: 0x60, symIndex: 0x0, system: 0x25}, + 44: {compactTag: 0x60, symIndex: 0x0, system: 0x28}, + 45: {compactTag: 0x60, symIndex: 0x0, system: 0x29}, + 46: {compactTag: 0x60, symIndex: 0x0, system: 0x2a}, + 47: {compactTag: 0x60, symIndex: 0x0, system: 0x2b}, + 48: {compactTag: 0x60, symIndex: 0x0, system: 0x2c}, + 49: {compactTag: 0x60, symIndex: 0x0, system: 0x2d}, + 50: {compactTag: 0x60, symIndex: 0x0, system: 0x30}, + 51: {compactTag: 0x60, symIndex: 0x0, system: 0x31}, + 52: {compactTag: 0x60, symIndex: 0x0, system: 0x32}, + 53: {compactTag: 0x60, symIndex: 0x0, system: 0x33}, + 54: {compactTag: 0x60, symIndex: 0x0, system: 0x34}, + 55: {compactTag: 0x60, symIndex: 0x0, system: 0x35}, + 56: {compactTag: 0x60, symIndex: 0x0, system: 0x36}, + 57: {compactTag: 0x60, symIndex: 0x0, system: 0x37}, + 58: {compactTag: 0x60, symIndex: 0x0, system: 0x39}, + 59: {compactTag: 0x60, symIndex: 0x0, system: 0x43}, + 60: {compactTag: 0x64, symIndex: 0x0, system: 0x0}, + 61: {compactTag: 0x64, symIndex: 0x38, system: 0x3}, + 62: {compactTag: 0x64, symIndex: 0x42, system: 0x4}, + 63: {compactTag: 0x7c, symIndex: 0x50, system: 0x37}, + 64: {compactTag: 0x7c, symIndex: 0x0, system: 0x0}, + 65: {compactTag: 0x114, symIndex: 0x43, system: 0x4}, + 66: {compactTag: 0x114, symIndex: 0x18, system: 0x0}, + 67: {compactTag: 0x114, symIndex: 0x3b, system: 0x3}, + 68: {compactTag: 0x123, symIndex: 0x1, system: 0x0}, + 69: {compactTag: 0x123, symIndex: 0x3c, system: 0x3}, + 70: {compactTag: 0x123, symIndex: 0x44, system: 0x4}, + 71: {compactTag: 0x158, symIndex: 0x0, system: 0x0}, + 72: {compactTag: 0x158, symIndex: 0x3b, system: 0x3}, + 73: {compactTag: 0x158, symIndex: 0x45, system: 0x4}, + 74: {compactTag: 0x160, symIndex: 0x0, system: 0x0}, + 75: {compactTag: 0x160, symIndex: 0x38, system: 0x3}, + 76: {compactTag: 0x16d, symIndex: 0x1b, system: 0x0}, + 77: {compactTag: 0x16d, symIndex: 0x0, system: 0x9}, + 78: {compactTag: 0x16d, symIndex: 0x0, system: 0xa}, + 79: {compactTag: 0x17c, symIndex: 0x0, system: 0x0}, + 80: {compactTag: 0x17c, symIndex: 0x3d, system: 0x3}, + 81: {compactTag: 0x17c, symIndex: 0x42, system: 0x4}, + 82: {compactTag: 0x182, symIndex: 0x6, system: 0x0}, + 83: {compactTag: 0x182, symIndex: 0x38, system: 0x3}, + 84: {compactTag: 0x1b1, symIndex: 0x0, system: 0x0}, + 85: {compactTag: 0x1b1, symIndex: 0x3e, system: 0x3}, + 86: {compactTag: 0x1b6, symIndex: 0x42, system: 0x4}, + 87: {compactTag: 0x1b6, symIndex: 0x1b, system: 0x0}, + 88: {compactTag: 0x1d2, symIndex: 0x42, system: 0x4}, + 89: {compactTag: 0x1d2, symIndex: 0x0, system: 0x0}, + 90: {compactTag: 0x1f3, symIndex: 0x0, system: 0xb}, + 91: {compactTag: 0x1fd, symIndex: 0x4e, system: 0x24}, + 92: {compactTag: 0x1fd, symIndex: 0x26, system: 0x0}, + 93: {compactTag: 0x1ff, symIndex: 0x42, system: 0x4}, + 94: {compactTag: 0x204, symIndex: 0x15, system: 0x0}, + 95: {compactTag: 0x204, symIndex: 0x3f, system: 0x3}, + 96: {compactTag: 0x204, symIndex: 0x46, system: 0x4}, + 97: {compactTag: 0x20c, symIndex: 0x0, system: 0xb}, + 98: {compactTag: 0x20f, symIndex: 0x6, system: 0x0}, + 99: {compactTag: 0x20f, symIndex: 0x38, system: 0x3}, + 100: {compactTag: 0x20f, symIndex: 0x42, system: 0x4}, + 101: {compactTag: 0x22e, symIndex: 0x0, system: 0x0}, + 102: {compactTag: 0x22e, symIndex: 0x47, system: 0x4}, + 103: {compactTag: 0x22f, symIndex: 0x42, system: 0x4}, + 104: {compactTag: 0x22f, symIndex: 0x1b, system: 0x0}, + 105: {compactTag: 0x238, symIndex: 0x42, system: 0x4}, + 106: {compactTag: 0x238, symIndex: 0x28, system: 0x0}, + 107: {compactTag: 0x265, symIndex: 0x38, system: 0x3}, + 108: {compactTag: 0x265, symIndex: 0x0, system: 0x0}, + 109: {compactTag: 0x29d, symIndex: 0x22, system: 0x0}, + 110: {compactTag: 0x29d, symIndex: 0x40, system: 0x3}, + 111: {compactTag: 0x29d, symIndex: 0x48, system: 0x4}, + 112: {compactTag: 0x29d, symIndex: 0x4d, system: 0xc}, + 113: {compactTag: 0x2bd, symIndex: 0x31, system: 0x0}, + 114: {compactTag: 0x2bd, symIndex: 0x3e, system: 0x3}, + 115: {compactTag: 0x2bd, symIndex: 0x42, system: 0x4}, + 116: {compactTag: 0x2cd, symIndex: 0x1b, system: 0x0}, + 117: {compactTag: 0x2cd, symIndex: 0x49, system: 0x4}, + 118: {compactTag: 0x2ce, symIndex: 0x49, system: 0x4}, + 119: {compactTag: 0x2d0, symIndex: 0x33, system: 0x0}, + 120: {compactTag: 0x2d0, symIndex: 0x4a, system: 0x4}, + 121: {compactTag: 0x2d1, symIndex: 0x42, system: 0x4}, + 122: {compactTag: 0x2d1, symIndex: 0x28, system: 0x0}, + 123: {compactTag: 0x2d3, symIndex: 0x34, system: 0x0}, + 124: {compactTag: 0x2d3, symIndex: 0x4b, system: 0x4}, + 125: {compactTag: 0x2f9, symIndex: 0x0, system: 0x0}, + 126: {compactTag: 0x2f9, symIndex: 0x38, system: 0x3}, + 127: {compactTag: 0x2f9, symIndex: 0x42, system: 0x4}, + 128: {compactTag: 0x2ff, symIndex: 0x36, system: 0x0}, + 129: {compactTag: 0x2ff, symIndex: 0x41, system: 0x3}, + 130: {compactTag: 0x2ff, symIndex: 0x4c, system: 0x4}, +} // Size: 810 bytes + +var tagToDecimal = []uint8{ // 775 elements + // Entry 0 - 3F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 40 - 7F + 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x05, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, + // Entry 80 - BF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry C0 - FF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 100 - 13F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 140 - 17F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, + 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 180 - 1BF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 1C0 - 1FF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 200 - 23F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x05, 0x01, + 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 240 - 27F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 280 - 2BF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, + 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 2C0 - 2FF + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 300 - 33F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, +} // Size: 799 bytes + +var tagToScientific = []uint8{ // 775 elements + // Entry 0 - 3F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 40 - 7F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 80 - BF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry C0 - FF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 100 - 13F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 140 - 17F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x0c, 0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0c, + 0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 180 - 1BF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 1C0 - 1FF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x0d, 0x0d, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x0c, 0x0c, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 200 - 23F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0c, 0x02, + 0x02, 0x0c, 0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 240 - 27F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x0d, 0x0d, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 280 - 2BF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 2C0 - 2FF + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 300 - 33F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x09, +} // Size: 799 bytes + +var tagToPercent = []uint8{ // 775 elements + // Entry 0 - 3F + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry 40 - 7F + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x03, 0x03, + 0x06, 0x06, 0x03, 0x04, 0x04, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x03, + 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, + 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x03, + 0x03, 0x04, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, + 0x03, 0x04, 0x04, 0x04, 0x07, 0x07, 0x04, 0x04, + // Entry 80 - BF + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x03, 0x04, + 0x04, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry C0 - FF + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + // Entry 100 - 13F + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, + 0x0b, 0x0b, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + // Entry 140 - 17F + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry 180 - 1BF + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, + // Entry 1C0 - 1FF + 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry 200 - 23F + 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry 240 - 27F + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, + // Entry 280 - 2BF + 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, + 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x0e, + // Entry 2C0 - 2FF + 0x0e, 0x0e, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, + 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + // Entry 300 - 33F + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0a, +} // Size: 799 bytes + +var formats = []Pattern{Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x0, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x0, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 3, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x9, + GroupingSize: [2]uint8{0x3, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x0, + MaxIntegerDigits: 0x1, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x1}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x3, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x00\x03\u00a0%", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x7, + GroupingSize: [2]uint8{0x3, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x00\x01%", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x6, + GroupingSize: [2]uint8{0x3, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 3, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0xc, + GroupingSize: [2]uint8{0x3, + 0x2}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x00\x01%", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x9, + GroupingSize: [2]uint8{0x3, + 0x2}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x00\x03\u00a0%", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0xa, + GroupingSize: [2]uint8{0x3, + 0x2}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 6, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x8, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 6, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x6, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x3}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0xd, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x4}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x00\x01%", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x2, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x03%\u00a0\x00", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x7, + GroupingSize: [2]uint8{0x3, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x0, + MaxIntegerDigits: 0x1, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x1}, + Affix: "\x01[\x01]", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x5, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x0, + MinIntegerDigits: 0x0, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x1, + GroupingSize: [2]uint8{0x0, + 0x0}, + Flags: 0x0}, + Pattern{RoundingContext: RoundingContext{MaxSignificantDigits: 0, + MaxFractionDigits: 0, + Increment: 0x0, + IncrementScale: 0x0, + Mode: 0x0, + DigitShift: 0x2, + MinIntegerDigits: 0x1, + MaxIntegerDigits: 0x0, + MinFractionDigits: 0x0, + MinSignificantDigits: 0x0, + MinExponentDigits: 0x0}, + Affix: "\x01%\x00", + Offset: 0x0, + NegOffset: 0x0, + PadRune: 0, + FormatWidth: 0x6, + GroupingSize: [2]uint8{0x3, + 0x0}, + Flags: 0x0}} + +// Total table size 8634 bytes (8KiB); checksum: 8F23386D diff --git a/tools/vendor/golang.org/x/text/internal/stringset/set.go b/tools/vendor/golang.org/x/text/internal/stringset/set.go new file mode 100644 index 000000000..bb2fffbc7 --- /dev/null +++ b/tools/vendor/golang.org/x/text/internal/stringset/set.go @@ -0,0 +1,86 @@ +// 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 stringset provides a way to represent a collection of strings +// compactly. +package stringset + +import "sort" + +// A Set holds a collection of strings that can be looked up by an index number. +type Set struct { + // These fields are exported to allow for code generation. + + Data string + Index []uint16 +} + +// Elem returns the string with index i. It panics if i is out of range. +func (s *Set) Elem(i int) string { + return s.Data[s.Index[i]:s.Index[i+1]] +} + +// Len returns the number of strings in the set. +func (s *Set) Len() int { + return len(s.Index) - 1 +} + +// Search returns the index of the given string or -1 if it is not in the set. +// The Set must have been created with strings in sorted order. +func Search(s *Set, str string) int { + // TODO: optimize this if it gets used a lot. + n := len(s.Index) - 1 + p := sort.Search(n, func(i int) bool { + return s.Elem(i) >= str + }) + if p == n || str != s.Elem(p) { + return -1 + } + return p +} + +// A Builder constructs Sets. +type Builder struct { + set Set + index map[string]int +} + +// NewBuilder returns a new and initialized Builder. +func NewBuilder() *Builder { + return &Builder{ + set: Set{ + Index: []uint16{0}, + }, + index: map[string]int{}, + } +} + +// Set creates the set created so far. +func (b *Builder) Set() Set { + return b.set +} + +// Index returns the index for the given string, which must have been added +// before. +func (b *Builder) Index(s string) int { + return b.index[s] +} + +// Add adds a string to the index. Strings that are added by a single Add will +// be stored together, unless they match an existing string. +func (b *Builder) Add(ss ...string) { + // First check if the string already exists. + for _, s := range ss { + if _, ok := b.index[s]; ok { + continue + } + b.index[s] = len(b.set.Index) - 1 + b.set.Data += s + x := len(b.set.Data) + if x > 0xFFFF { + panic("Index too > 0xFFFF") + } + b.set.Index = append(b.set.Index, uint16(x)) + } +} diff --git a/tools/vendor/golang.org/x/text/language/match.go b/tools/vendor/golang.org/x/text/language/match.go index ee45f4947..1153baf29 100644 --- a/tools/vendor/golang.org/x/text/language/match.go +++ b/tools/vendor/golang.org/x/text/language/match.go @@ -434,7 +434,7 @@ func newMatcher(supported []Tag, options []MatchOption) *matcher { // (their canonicalization simply substitutes a different language code, but // nothing else), the match confidence is Exact, otherwise it is High. for i, lm := range language.AliasMap { - // If deprecated codes match and there is no fiddling with the script or + // If deprecated codes match and there is no fiddling with the script // or region, we consider it an exact match. conf := Exact if language.AliasTypes[i] != language.Macro { diff --git a/tools/vendor/golang.org/x/text/language/tables.go b/tools/vendor/golang.org/x/text/language/tables.go index 34a732b69..a6573dcb2 100644 --- a/tools/vendor/golang.org/x/text/language/tables.go +++ b/tools/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/tools/vendor/golang.org/x/text/message/catalog.go b/tools/vendor/golang.org/x/text/message/catalog.go new file mode 100644 index 000000000..068271def --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/catalog.go @@ -0,0 +1,36 @@ +// 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 message + +// TODO: some types in this file will need to be made public at some time. +// Documentation and method names will reflect this by using the exported name. + +import ( + "golang.org/x/text/language" + "golang.org/x/text/message/catalog" +) + +// MatchLanguage reports the matched tag obtained from language.MatchStrings for +// the Matcher of the DefaultCatalog. +func MatchLanguage(preferred ...string) language.Tag { + c := DefaultCatalog + tag, _ := language.MatchStrings(c.Matcher(), preferred...) + return tag +} + +// DefaultCatalog is used by SetString. +var DefaultCatalog catalog.Catalog = defaultCatalog + +var defaultCatalog = catalog.NewBuilder() + +// SetString calls SetString on the initial default Catalog. +func SetString(tag language.Tag, key string, msg string) error { + return defaultCatalog.SetString(tag, key, msg) +} + +// Set calls Set on the initial default Catalog. +func Set(tag language.Tag, key string, msg ...catalog.Message) error { + return defaultCatalog.Set(tag, key, msg...) +} diff --git a/tools/vendor/golang.org/x/text/message/catalog/catalog.go b/tools/vendor/golang.org/x/text/message/catalog/catalog.go new file mode 100644 index 000000000..96955d075 --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/catalog/catalog.go @@ -0,0 +1,365 @@ +// 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 catalog defines collections of translated format strings. +// +// This package mostly defines types for populating catalogs with messages. The +// catmsg package contains further definitions for creating custom message and +// dictionary types as well as packages that use Catalogs. +// +// Package catalog defines various interfaces: Dictionary, Loader, and Message. +// A Dictionary maintains a set of translations of format strings for a single +// language. The Loader interface defines a source of dictionaries. A +// translation of a format string is represented by a Message. +// +// # Catalogs +// +// A Catalog defines a programmatic interface for setting message translations. +// It maintains a set of per-language dictionaries with translations for a set +// of keys. For message translation to function properly, a translation should +// be defined for each key for each supported language. A dictionary may be +// underspecified, though, if there is a parent language that already defines +// the key. For example, a Dictionary for "en-GB" could leave out entries that +// are identical to those in a dictionary for "en". +// +// # Messages +// +// A Message is a format string which varies on the value of substitution +// variables. For instance, to indicate the number of results one could want "no +// results" if there are none, "1 result" if there is 1, and "%d results" for +// any other number. Catalog is agnostic to the kind of format strings that are +// used: for instance, messages can follow either the printf-style substitution +// from package fmt or use templates. +// +// A Message does not substitute arguments in the format string. This job is +// reserved for packages that render strings, such as message, that use Catalogs +// to selected string. This separation of concerns allows Catalog to be used to +// store any kind of formatting strings. +// +// # Selecting messages based on linguistic features of substitution arguments +// +// Messages may vary based on any linguistic features of the argument values. +// The most common one is plural form, but others exist. +// +// Selection messages are provided in packages that provide support for a +// specific linguistic feature. The following snippet uses plural.Selectf: +// +// catalog.Set(language.English, "You are %d minute(s) late.", +// plural.Selectf(1, "", +// plural.One, "You are 1 minute late.", +// plural.Other, "You are %d minutes late.")) +// +// In this example, a message is stored in the Catalog where one of two messages +// is selected based on the first argument, a number. The first message is +// selected if the argument is singular (identified by the selector "one") and +// the second message is selected in all other cases. The selectors are defined +// by the plural rules defined in CLDR. The selector "other" is special and will +// always match. Each language always defines one of the linguistic categories +// to be "other." For English, singular is "one" and plural is "other". +// +// Selects can be nested. This allows selecting sentences based on features of +// multiple arguments or multiple linguistic properties of a single argument. +// +// # String interpolation +// +// There is often a lot of commonality between the possible variants of a +// message. For instance, in the example above the word "minute" varies based on +// the plural catogory of the argument, but the rest of the sentence is +// identical. Using interpolation the above message can be rewritten as: +// +// catalog.Set(language.English, "You are %d minute(s) late.", +// catalog.Var("minutes", +// plural.Selectf(1, "", plural.One, "minute", plural.Other, "minutes")), +// catalog.String("You are %[1]d ${minutes} late.")) +// +// Var is defined to return the variable name if the message does not yield a +// match. This allows us to further simplify this snippet to +// +// catalog.Set(language.English, "You are %d minute(s) late.", +// catalog.Var("minutes", plural.Selectf(1, "", plural.One, "minute")), +// catalog.String("You are %d ${minutes} late.")) +// +// Overall this is still only a minor improvement, but things can get a lot more +// unwieldy if more than one linguistic feature is used to determine a message +// variant. Consider the following example: +// +// // argument 1: list of hosts, argument 2: list of guests +// catalog.Set(language.English, "%[1]v invite(s) %[2]v to their party.", +// catalog.Var("their", +// plural.Selectf(1, "" +// plural.One, gender.Select(1, "female", "her", "other", "his"))), +// catalog.Var("invites", plural.Selectf(1, "", plural.One, "invite")) +// catalog.String("%[1]v ${invites} %[2]v to ${their} party.")), +// +// Without variable substitution, this would have to be written as +// +// // argument 1: list of hosts, argument 2: list of guests +// catalog.Set(language.English, "%[1]v invite(s) %[2]v to their party.", +// plural.Selectf(1, "", +// plural.One, gender.Select(1, +// "female", "%[1]v invites %[2]v to her party." +// "other", "%[1]v invites %[2]v to his party."), +// plural.Other, "%[1]v invites %[2]v to their party.")) +// +// Not necessarily shorter, but using variables there is less duplication and +// the messages are more maintenance friendly. Moreover, languages may have up +// to six plural forms. This makes the use of variables more welcome. +// +// Different messages using the same inflections can reuse variables by moving +// them to macros. Using macros we can rewrite the message as: +// +// // argument 1: list of hosts, argument 2: list of guests +// catalog.SetString(language.English, "%[1]v invite(s) %[2]v to their party.", +// "%[1]v ${invites(1)} %[2]v to ${their(1)} party.") +// +// Where the following macros were defined separately. +// +// catalog.SetMacro(language.English, "invites", plural.Selectf(1, "", +// plural.One, "invite")) +// catalog.SetMacro(language.English, "their", plural.Selectf(1, "", +// plural.One, gender.Select(1, "female", "her", "other", "his"))), +// +// Placeholders use parentheses and the arguments to invoke a macro. +// +// # Looking up messages +// +// Message lookup using Catalogs is typically only done by specialized packages +// and is not something the user should be concerned with. For instance, to +// express the tardiness of a user using the related message we defined earlier, +// the user may use the package message like so: +// +// p := message.NewPrinter(language.English) +// p.Printf("You are %d minute(s) late.", 5) +// +// Which would print: +// +// You are 5 minutes late. +// +// This package is UNDER CONSTRUCTION and its API may change. +package catalog // import "golang.org/x/text/message/catalog" + +// TODO: +// Some way to freeze a catalog. +// - Locking on each lockup turns out to be about 50% of the total running time +// for some of the benchmarks in the message package. +// Consider these: +// - Sequence type to support sequences in user-defined messages. +// - Garbage collection: Remove dictionaries that can no longer be reached +// as other dictionaries have been added that cover all possible keys. + +import ( + "errors" + "fmt" + + "golang.org/x/text/internal" + + "golang.org/x/text/internal/catmsg" + "golang.org/x/text/language" +) + +// A Catalog allows lookup of translated messages. +type Catalog interface { + // Languages returns all languages for which the Catalog contains variants. + Languages() []language.Tag + + // Matcher returns a Matcher for languages from this Catalog. + Matcher() language.Matcher + + // A Context is used for evaluating Messages. + Context(tag language.Tag, r catmsg.Renderer) *Context + + // This method also makes Catalog a private interface. + lookup(tag language.Tag, key string) (data string, ok bool) +} + +// NewFromMap creates a Catalog from the given map. If a Dictionary is +// underspecified the entry is retrieved from a parent language. +func NewFromMap(dictionaries map[string]Dictionary, opts ...Option) (Catalog, error) { + options := options{} + for _, o := range opts { + o(&options) + } + c := &catalog{ + dicts: map[language.Tag]Dictionary{}, + } + _, hasFallback := dictionaries[options.fallback.String()] + if hasFallback { + // TODO: Should it be okay to not have a fallback language? + // Catalog generators could enforce there is always a fallback. + c.langs = append(c.langs, options.fallback) + } + for lang, dict := range dictionaries { + tag, err := language.Parse(lang) + if err != nil { + return nil, fmt.Errorf("catalog: invalid language tag %q", lang) + } + if _, ok := c.dicts[tag]; ok { + return nil, fmt.Errorf("catalog: duplicate entry for tag %q after normalization", tag) + } + c.dicts[tag] = dict + if !hasFallback || tag != options.fallback { + c.langs = append(c.langs, tag) + } + } + if hasFallback { + internal.SortTags(c.langs[1:]) + } else { + internal.SortTags(c.langs) + } + c.matcher = language.NewMatcher(c.langs) + return c, nil +} + +// A Dictionary is a source of translations for a single language. +type Dictionary interface { + // Lookup returns a message compiled with catmsg.Compile for the given key. + // It returns false for ok if such a message could not be found. + Lookup(key string) (data string, ok bool) +} + +type catalog struct { + langs []language.Tag + dicts map[language.Tag]Dictionary + macros store + matcher language.Matcher +} + +func (c *catalog) Languages() []language.Tag { return c.langs } +func (c *catalog) Matcher() language.Matcher { return c.matcher } + +func (c *catalog) lookup(tag language.Tag, key string) (data string, ok bool) { + for ; ; tag = tag.Parent() { + if dict, ok := c.dicts[tag]; ok { + if data, ok := dict.Lookup(key); ok { + return data, true + } + } + if tag == language.Und { + break + } + } + return "", false +} + +// Context returns a Context for formatting messages. +// Only one Message may be formatted per context at any given time. +func (c *catalog) Context(tag language.Tag, r catmsg.Renderer) *Context { + return &Context{ + cat: c, + tag: tag, + dec: catmsg.NewDecoder(tag, r, &dict{&c.macros, tag}), + } +} + +// A Builder allows building a Catalog programmatically. +type Builder struct { + options + matcher language.Matcher + + index store + macros store +} + +type options struct { + fallback language.Tag +} + +// An Option configures Catalog behavior. +type Option func(*options) + +// Fallback specifies the default fallback language. The default is Und. +func Fallback(tag language.Tag) Option { + return func(o *options) { o.fallback = tag } +} + +// TODO: +// // Catalogs specifies one or more sources for a Catalog. +// // Lookups are in order. +// // This can be changed inserting a Catalog used for setting, which implements +// // Loader, used for setting in the chain. +// func Catalogs(d ...Loader) Option { +// return nil +// } +// +// func Delims(start, end string) Option {} +// +// func Dict(tag language.Tag, d ...Dictionary) Option + +// NewBuilder returns an empty mutable Catalog. +func NewBuilder(opts ...Option) *Builder { + c := &Builder{} + for _, o := range opts { + o(&c.options) + } + return c +} + +// SetString is shorthand for Set(tag, key, String(msg)). +func (c *Builder) SetString(tag language.Tag, key string, msg string) error { + return c.set(tag, key, &c.index, String(msg)) +} + +// Set sets the translation for the given language and key. +// +// When evaluation this message, the first Message in the sequence to msgs to +// evaluate to a string will be the message returned. +func (c *Builder) Set(tag language.Tag, key string, msg ...Message) error { + return c.set(tag, key, &c.index, msg...) +} + +// SetMacro defines a Message that may be substituted in another message. +// The arguments to a macro Message are passed as arguments in the +// placeholder the form "${foo(arg1, arg2)}". +func (c *Builder) SetMacro(tag language.Tag, name string, msg ...Message) error { + return c.set(tag, name, &c.macros, msg...) +} + +// ErrNotFound indicates there was no message for the given key. +var ErrNotFound = errors.New("catalog: message not found") + +// String specifies a plain message string. It can be used as fallback if no +// other strings match or as a simple standalone message. +// +// It is an error to pass more than one String in a message sequence. +func String(name string) Message { + return catmsg.String(name) +} + +// Var sets a variable that may be substituted in formatting patterns using +// named substitution of the form "${name}". The name argument is used as a +// fallback if the statements do not produce a match. The statement sequence may +// not contain any Var calls. +// +// The name passed to a Var must be unique within message sequence. +func Var(name string, msg ...Message) Message { + return &catmsg.Var{Name: name, Message: firstInSequence(msg)} +} + +// Context returns a Context for formatting messages. +// Only one Message may be formatted per context at any given time. +func (b *Builder) Context(tag language.Tag, r catmsg.Renderer) *Context { + return &Context{ + cat: b, + tag: tag, + dec: catmsg.NewDecoder(tag, r, &dict{&b.macros, tag}), + } +} + +// A Context is used for evaluating Messages. +// Only one Message may be formatted per context at any given time. +type Context struct { + cat Catalog + tag language.Tag // TODO: use compact index. + dec *catmsg.Decoder +} + +// Execute looks up and executes the message with the given key. +// It returns ErrNotFound if no message could be found in the index. +func (c *Context) Execute(key string) error { + data, ok := c.cat.lookup(c.tag, key) + if !ok { + return ErrNotFound + } + return c.dec.Execute(data) +} diff --git a/tools/vendor/golang.org/x/text/message/catalog/dict.go b/tools/vendor/golang.org/x/text/message/catalog/dict.go new file mode 100644 index 000000000..a0eb81810 --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/catalog/dict.go @@ -0,0 +1,129 @@ +// 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 catalog + +import ( + "sync" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/catmsg" + "golang.org/x/text/language" +) + +// TODO: +// Dictionary returns a Dictionary that returns the first Message, using the +// given language tag, that matches: +// 1. the last one registered by one of the Set methods +// 2. returned by one of the Loaders +// 3. repeat from 1. using the parent language +// This approach allows messages to be underspecified. +// func (c *Catalog) Dictionary(tag language.Tag) (Dictionary, error) { +// // TODO: verify dictionary exists. +// return &dict{&c.index, tag}, nil +// } + +type dict struct { + s *store + tag language.Tag // TODO: make compact tag. +} + +func (d *dict) Lookup(key string) (data string, ok bool) { + return d.s.lookup(d.tag, key) +} + +func (b *Builder) lookup(tag language.Tag, key string) (data string, ok bool) { + return b.index.lookup(tag, key) +} + +func (c *Builder) set(tag language.Tag, key string, s *store, msg ...Message) error { + data, err := catmsg.Compile(tag, &dict{&c.macros, tag}, firstInSequence(msg)) + + s.mutex.Lock() + defer s.mutex.Unlock() + + m := s.index[tag] + if m == nil { + m = msgMap{} + if s.index == nil { + s.index = map[language.Tag]msgMap{} + } + c.matcher = nil + s.index[tag] = m + } + + m[key] = data + return err +} + +func (c *Builder) Matcher() language.Matcher { + c.index.mutex.RLock() + m := c.matcher + c.index.mutex.RUnlock() + if m != nil { + return m + } + + c.index.mutex.Lock() + if c.matcher == nil { + c.matcher = language.NewMatcher(c.unlockedLanguages()) + } + m = c.matcher + c.index.mutex.Unlock() + return m +} + +type store struct { + mutex sync.RWMutex + index map[language.Tag]msgMap +} + +type msgMap map[string]string + +func (s *store) lookup(tag language.Tag, key string) (data string, ok bool) { + s.mutex.RLock() + defer s.mutex.RUnlock() + + for ; ; tag = tag.Parent() { + if msgs, ok := s.index[tag]; ok { + if msg, ok := msgs[key]; ok { + return msg, true + } + } + if tag == language.Und { + break + } + } + return "", false +} + +// Languages returns all languages for which the Catalog contains variants. +func (b *Builder) Languages() []language.Tag { + s := &b.index + s.mutex.RLock() + defer s.mutex.RUnlock() + + return b.unlockedLanguages() +} + +func (b *Builder) unlockedLanguages() []language.Tag { + s := &b.index + if len(s.index) == 0 { + return nil + } + tags := make([]language.Tag, 0, len(s.index)) + _, hasFallback := s.index[b.options.fallback] + offset := 0 + if hasFallback { + tags = append(tags, b.options.fallback) + offset = 1 + } + for t := range s.index { + if t != b.options.fallback { + tags = append(tags, t) + } + } + internal.SortTags(tags[offset:]) + return tags +} diff --git a/tools/vendor/golang.org/x/text/message/catalog/go19.go b/tools/vendor/golang.org/x/text/message/catalog/go19.go new file mode 100644 index 000000000..4e5e87f8f --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/catalog/go19.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 go1.9 +// +build go1.9 + +package catalog + +import "golang.org/x/text/internal/catmsg" + +// A Message holds a collection of translations for the same phrase that may +// vary based on the values of substitution arguments. +type Message = catmsg.Message + +type firstInSequence = catmsg.FirstOf diff --git a/tools/vendor/golang.org/x/text/message/catalog/gopre19.go b/tools/vendor/golang.org/x/text/message/catalog/gopre19.go new file mode 100644 index 000000000..9e14685a5 --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/catalog/gopre19.go @@ -0,0 +1,24 @@ +// 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 catalog + +import "golang.org/x/text/internal/catmsg" + +// A Message holds a collection of translations for the same phrase that may +// vary based on the values of substitution arguments. +type Message interface { + catmsg.Message +} + +func firstInSequence(m []Message) catmsg.Message { + a := []catmsg.Message{} + for _, m := range m { + a = append(a, m) + } + return catmsg.FirstOf(a) +} diff --git a/tools/vendor/golang.org/x/text/message/doc.go b/tools/vendor/golang.org/x/text/message/doc.go new file mode 100644 index 000000000..4bf7bdcac --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/doc.go @@ -0,0 +1,99 @@ +// 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 message implements formatted I/O for localized strings with functions +// analogous to the fmt's print functions. It is a drop-in replacement for fmt. +// +// # Localized Formatting +// +// A format string can be localized by replacing any of the print functions of +// fmt with an equivalent call to a Printer. +// +// p := message.NewPrinter(message.MatchLanguage("en")) +// p.Println(123456.78) // Prints 123,456.78 +// +// p.Printf("%d ducks in a row", 4331) // Prints 4,331 ducks in a row +// +// p := message.NewPrinter(message.MatchLanguage("nl")) +// p.Printf("Hoogte: %.1f meter", 1244.9) // Prints Hoogte: 1,244.9 meter +// +// p := message.NewPrinter(message.MatchLanguage("bn")) +// p.Println(123456.78) // Prints ১,২৩,৪৫৬.৭৮ +// +// Printer currently supports numbers and specialized types for which packages +// exist in x/text. Other builtin types such as time.Time and slices are +// planned. +// +// Format strings largely have the same meaning as with fmt with the following +// notable exceptions: +// - flag # always resorts to fmt for printing +// - verb 'f', 'e', 'g', 'd' use localized formatting unless the '#' flag is +// specified. +// - verb 'm' inserts a translation of a string argument. +// +// See package fmt for more options. +// +// # Translation +// +// The format strings that are passed to Printf, Sprintf, Fprintf, or Errorf +// are used as keys to look up translations for the specified languages. +// More on how these need to be specified below. +// +// One can use arbitrary keys to distinguish between otherwise ambiguous +// strings: +// +// p := message.NewPrinter(language.English) +// p.Printf("archive(noun)") // Prints "archive" +// p.Printf("archive(verb)") // Prints "archive" +// +// p := message.NewPrinter(language.German) +// p.Printf("archive(noun)") // Prints "Archiv" +// p.Printf("archive(verb)") // Prints "archivieren" +// +// To retain the fallback functionality, use Key: +// +// p.Printf(message.Key("archive(noun)", "archive")) +// p.Printf(message.Key("archive(verb)", "archive")) +// +// # Translation Pipeline +// +// Format strings that contain text need to be translated to support different +// locales. The first step is to extract strings that need to be translated. +// +// 1. Install gotext +// +// go get -u golang.org/x/text/cmd/gotext +// gotext -help +// +// 2. Mark strings in your source to be translated by using message.Printer, +// instead of the functions of the fmt package. +// +// 3. Extract the strings from your source +// +// gotext extract +// +// The output will be written to the textdata directory. +// +// 4. Send the files for translation +// +// It is planned to support multiple formats, but for now one will have to +// rewrite the JSON output to the desired format. +// +// 5. Inject translations into program +// +// 6. Repeat from 2 +// +// Right now this has to be done programmatically with calls to Set or +// SetString. These functions as well as the methods defined in +// see also package golang.org/x/text/message/catalog can be used to implement +// either dynamic or static loading of messages. +// +// # Plural and Gender Forms +// +// Translated messages can vary based on the plural and gender forms of +// substitution values. In general, it is up to the translators to provide +// alternative translations for such forms. See the packages in +// golang.org/x/text/feature and golang.org/x/text/message/catalog for more +// information. +package message diff --git a/tools/vendor/golang.org/x/text/message/format.go b/tools/vendor/golang.org/x/text/message/format.go new file mode 100644 index 000000000..a47d17dd4 --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/format.go @@ -0,0 +1,510 @@ +// 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 message + +import ( + "bytes" + "strconv" + "unicode/utf8" + + "golang.org/x/text/internal/format" +) + +const ( + ldigits = "0123456789abcdefx" + udigits = "0123456789ABCDEFX" +) + +const ( + signed = true + unsigned = false +) + +// A formatInfo is the raw formatter used by Printf etc. +// It prints into a buffer that must be set up separately. +type formatInfo struct { + buf *bytes.Buffer + + format.Parser + + // intbuf is large enough to store %b of an int64 with a sign and + // avoids padding at the end of the struct on 32 bit architectures. + intbuf [68]byte +} + +func (f *formatInfo) init(buf *bytes.Buffer) { + f.ClearFlags() + f.buf = buf +} + +// writePadding generates n bytes of padding. +func (f *formatInfo) writePadding(n int) { + if n <= 0 { // No padding bytes needed. + return + } + f.buf.Grow(n) + // Decide which byte the padding should be filled with. + padByte := byte(' ') + if f.Zero { + padByte = byte('0') + } + // Fill padding with padByte. + for i := 0; i < n; i++ { + f.buf.WriteByte(padByte) // TODO: make more efficient. + } +} + +// pad appends b to f.buf, padded on left (!f.minus) or right (f.minus). +func (f *formatInfo) pad(b []byte) { + if !f.WidthPresent || f.Width == 0 { + f.buf.Write(b) + return + } + width := f.Width - utf8.RuneCount(b) + if !f.Minus { + // left padding + f.writePadding(width) + f.buf.Write(b) + } else { + // right padding + f.buf.Write(b) + f.writePadding(width) + } +} + +// padString appends s to f.buf, padded on left (!f.minus) or right (f.minus). +func (f *formatInfo) padString(s string) { + if !f.WidthPresent || f.Width == 0 { + f.buf.WriteString(s) + return + } + width := f.Width - utf8.RuneCountInString(s) + if !f.Minus { + // left padding + f.writePadding(width) + f.buf.WriteString(s) + } else { + // right padding + f.buf.WriteString(s) + f.writePadding(width) + } +} + +// fmt_boolean formats a boolean. +func (f *formatInfo) fmt_boolean(v bool) { + if v { + f.padString("true") + } else { + f.padString("false") + } +} + +// fmt_unicode formats a uint64 as "U+0078" or with f.sharp set as "U+0078 'x'". +func (f *formatInfo) fmt_unicode(u uint64) { + buf := f.intbuf[0:] + + // With default precision set the maximum needed buf length is 18 + // for formatting -1 with %#U ("U+FFFFFFFFFFFFFFFF") which fits + // into the already allocated intbuf with a capacity of 68 bytes. + prec := 4 + if f.PrecPresent && f.Prec > 4 { + prec = f.Prec + // Compute space needed for "U+" , number, " '", character, "'". + width := 2 + prec + 2 + utf8.UTFMax + 1 + if width > len(buf) { + buf = make([]byte, width) + } + } + + // Format into buf, ending at buf[i]. Formatting numbers is easier right-to-left. + i := len(buf) + + // For %#U we want to add a space and a quoted character at the end of the buffer. + if f.Sharp && u <= utf8.MaxRune && strconv.IsPrint(rune(u)) { + i-- + buf[i] = '\'' + i -= utf8.RuneLen(rune(u)) + utf8.EncodeRune(buf[i:], rune(u)) + i-- + buf[i] = '\'' + i-- + buf[i] = ' ' + } + // Format the Unicode code point u as a hexadecimal number. + for u >= 16 { + i-- + buf[i] = udigits[u&0xF] + prec-- + u >>= 4 + } + i-- + buf[i] = udigits[u] + prec-- + // Add zeros in front of the number until requested precision is reached. + for prec > 0 { + i-- + buf[i] = '0' + prec-- + } + // Add a leading "U+". + i-- + buf[i] = '+' + i-- + buf[i] = 'U' + + oldZero := f.Zero + f.Zero = false + f.pad(buf[i:]) + f.Zero = oldZero +} + +// fmt_integer formats signed and unsigned integers. +func (f *formatInfo) fmt_integer(u uint64, base int, isSigned bool, digits string) { + negative := isSigned && int64(u) < 0 + if negative { + u = -u + } + + buf := f.intbuf[0:] + // The already allocated f.intbuf with a capacity of 68 bytes + // is large enough for integer formatting when no precision or width is set. + if f.WidthPresent || f.PrecPresent { + // Account 3 extra bytes for possible addition of a sign and "0x". + width := 3 + f.Width + f.Prec // wid and prec are always positive. + if width > len(buf) { + // We're going to need a bigger boat. + buf = make([]byte, width) + } + } + + // Two ways to ask for extra leading zero digits: %.3d or %03d. + // If both are specified the f.zero flag is ignored and + // padding with spaces is used instead. + prec := 0 + if f.PrecPresent { + prec = f.Prec + // Precision of 0 and value of 0 means "print nothing" but padding. + if prec == 0 && u == 0 { + oldZero := f.Zero + f.Zero = false + f.writePadding(f.Width) + f.Zero = oldZero + return + } + } else if f.Zero && f.WidthPresent { + prec = f.Width + if negative || f.Plus || f.Space { + prec-- // leave room for sign + } + } + + // Because printing is easier right-to-left: format u into buf, ending at buf[i]. + // We could make things marginally faster by splitting the 32-bit case out + // into a separate block but it's not worth the duplication, so u has 64 bits. + i := len(buf) + // Use constants for the division and modulo for more efficient code. + // Switch cases ordered by popularity. + switch base { + case 10: + for u >= 10 { + i-- + next := u / 10 + buf[i] = byte('0' + u - next*10) + u = next + } + case 16: + for u >= 16 { + i-- + buf[i] = digits[u&0xF] + u >>= 4 + } + case 8: + for u >= 8 { + i-- + buf[i] = byte('0' + u&7) + u >>= 3 + } + case 2: + for u >= 2 { + i-- + buf[i] = byte('0' + u&1) + u >>= 1 + } + default: + panic("fmt: unknown base; can't happen") + } + i-- + buf[i] = digits[u] + for i > 0 && prec > len(buf)-i { + i-- + buf[i] = '0' + } + + // Various prefixes: 0x, -, etc. + if f.Sharp { + switch base { + case 8: + if buf[i] != '0' { + i-- + buf[i] = '0' + } + case 16: + // Add a leading 0x or 0X. + i-- + buf[i] = digits[16] + i-- + buf[i] = '0' + } + } + + if negative { + i-- + buf[i] = '-' + } else if f.Plus { + i-- + buf[i] = '+' + } else if f.Space { + i-- + buf[i] = ' ' + } + + // Left padding with zeros has already been handled like precision earlier + // or the f.zero flag is ignored due to an explicitly set precision. + oldZero := f.Zero + f.Zero = false + f.pad(buf[i:]) + f.Zero = oldZero +} + +// truncate truncates the string to the specified precision, if present. +func (f *formatInfo) truncate(s string) string { + if f.PrecPresent { + n := f.Prec + for i := range s { + n-- + if n < 0 { + return s[:i] + } + } + } + return s +} + +// fmt_s formats a string. +func (f *formatInfo) fmt_s(s string) { + s = f.truncate(s) + f.padString(s) +} + +// fmt_sbx formats a string or byte slice as a hexadecimal encoding of its bytes. +func (f *formatInfo) fmt_sbx(s string, b []byte, digits string) { + length := len(b) + if b == nil { + // No byte slice present. Assume string s should be encoded. + length = len(s) + } + // Set length to not process more bytes than the precision demands. + if f.PrecPresent && f.Prec < length { + length = f.Prec + } + // Compute width of the encoding taking into account the f.sharp and f.space flag. + width := 2 * length + if width > 0 { + if f.Space { + // Each element encoded by two hexadecimals will get a leading 0x or 0X. + if f.Sharp { + width *= 2 + } + // Elements will be separated by a space. + width += length - 1 + } else if f.Sharp { + // Only a leading 0x or 0X will be added for the whole string. + width += 2 + } + } else { // The byte slice or string that should be encoded is empty. + if f.WidthPresent { + f.writePadding(f.Width) + } + return + } + // Handle padding to the left. + if f.WidthPresent && f.Width > width && !f.Minus { + f.writePadding(f.Width - width) + } + // Write the encoding directly into the output buffer. + buf := f.buf + if f.Sharp { + // Add leading 0x or 0X. + buf.WriteByte('0') + buf.WriteByte(digits[16]) + } + var c byte + for i := 0; i < length; i++ { + if f.Space && i > 0 { + // Separate elements with a space. + buf.WriteByte(' ') + if f.Sharp { + // Add leading 0x or 0X for each element. + buf.WriteByte('0') + buf.WriteByte(digits[16]) + } + } + if b != nil { + c = b[i] // Take a byte from the input byte slice. + } else { + c = s[i] // Take a byte from the input string. + } + // Encode each byte as two hexadecimal digits. + buf.WriteByte(digits[c>>4]) + buf.WriteByte(digits[c&0xF]) + } + // Handle padding to the right. + if f.WidthPresent && f.Width > width && f.Minus { + f.writePadding(f.Width - width) + } +} + +// fmt_sx formats a string as a hexadecimal encoding of its bytes. +func (f *formatInfo) fmt_sx(s, digits string) { + f.fmt_sbx(s, nil, digits) +} + +// fmt_bx formats a byte slice as a hexadecimal encoding of its bytes. +func (f *formatInfo) fmt_bx(b []byte, digits string) { + f.fmt_sbx("", b, digits) +} + +// fmt_q formats a string as a double-quoted, escaped Go string constant. +// If f.sharp is set a raw (backquoted) string may be returned instead +// if the string does not contain any control characters other than tab. +func (f *formatInfo) fmt_q(s string) { + s = f.truncate(s) + if f.Sharp && strconv.CanBackquote(s) { + f.padString("`" + s + "`") + return + } + buf := f.intbuf[:0] + if f.Plus { + f.pad(strconv.AppendQuoteToASCII(buf, s)) + } else { + f.pad(strconv.AppendQuote(buf, s)) + } +} + +// fmt_c formats an integer as a Unicode character. +// If the character is not valid Unicode, it will print '\ufffd'. +func (f *formatInfo) fmt_c(c uint64) { + r := rune(c) + if c > utf8.MaxRune { + r = utf8.RuneError + } + buf := f.intbuf[:0] + w := utf8.EncodeRune(buf[:utf8.UTFMax], r) + f.pad(buf[:w]) +} + +// fmt_qc formats an integer as a single-quoted, escaped Go character constant. +// If the character is not valid Unicode, it will print '\ufffd'. +func (f *formatInfo) fmt_qc(c uint64) { + r := rune(c) + if c > utf8.MaxRune { + r = utf8.RuneError + } + buf := f.intbuf[:0] + if f.Plus { + f.pad(strconv.AppendQuoteRuneToASCII(buf, r)) + } else { + f.pad(strconv.AppendQuoteRune(buf, r)) + } +} + +// fmt_float formats a float64. It assumes that verb is a valid format specifier +// for strconv.AppendFloat and therefore fits into a byte. +func (f *formatInfo) fmt_float(v float64, size int, verb rune, prec int) { + // Explicit precision in format specifier overrules default precision. + if f.PrecPresent { + prec = f.Prec + } + // Format number, reserving space for leading + sign if needed. + num := strconv.AppendFloat(f.intbuf[:1], v, byte(verb), prec, size) + if num[1] == '-' || num[1] == '+' { + num = num[1:] + } else { + num[0] = '+' + } + // f.space means to add a leading space instead of a "+" sign unless + // the sign is explicitly asked for by f.plus. + if f.Space && num[0] == '+' && !f.Plus { + num[0] = ' ' + } + // Special handling for infinities and NaN, + // which don't look like a number so shouldn't be padded with zeros. + if num[1] == 'I' || num[1] == 'N' { + oldZero := f.Zero + f.Zero = false + // Remove sign before NaN if not asked for. + if num[1] == 'N' && !f.Space && !f.Plus { + num = num[1:] + } + f.pad(num) + f.Zero = oldZero + return + } + // The sharp flag forces printing a decimal point for non-binary formats + // and retains trailing zeros, which we may need to restore. + if f.Sharp && verb != 'b' { + digits := 0 + switch verb { + case 'v', 'g', 'G': + digits = prec + // If no precision is set explicitly use a precision of 6. + if digits == -1 { + digits = 6 + } + } + + // Buffer pre-allocated with enough room for + // exponent notations of the form "e+123". + var tailBuf [5]byte + tail := tailBuf[:0] + + hasDecimalPoint := false + // Starting from i = 1 to skip sign at num[0]. + for i := 1; i < len(num); i++ { + switch num[i] { + case '.': + hasDecimalPoint = true + case 'e', 'E': + tail = append(tail, num[i:]...) + num = num[:i] + default: + digits-- + } + } + if !hasDecimalPoint { + num = append(num, '.') + } + for digits > 0 { + num = append(num, '0') + digits-- + } + num = append(num, tail...) + } + // We want a sign if asked for and if the sign is not positive. + if f.Plus || num[0] != '+' { + // If we're zero padding to the left we want the sign before the leading zeros. + // Achieve this by writing the sign out and then padding the unsigned number. + if f.Zero && f.WidthPresent && f.Width > len(num) { + f.buf.WriteByte(num[0]) + f.writePadding(f.Width - len(num)) + f.buf.Write(num[1:]) + return + } + f.pad(num) + return + } + // No sign to show and the number is positive; just print the unsigned number. + f.pad(num[1:]) +} diff --git a/tools/vendor/golang.org/x/text/message/message.go b/tools/vendor/golang.org/x/text/message/message.go new file mode 100644 index 000000000..48d76630c --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/message.go @@ -0,0 +1,193 @@ +// 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 message // import "golang.org/x/text/message" + +import ( + "io" + "os" + + // Include features to facilitate generated catalogs. + _ "golang.org/x/text/feature/plural" + + "golang.org/x/text/internal/number" + "golang.org/x/text/language" + "golang.org/x/text/message/catalog" +) + +// A Printer implements language-specific formatted I/O analogous to the fmt +// package. +type Printer struct { + // the language + tag language.Tag + + toDecimal number.Formatter + toScientific number.Formatter + + cat catalog.Catalog +} + +type options struct { + cat catalog.Catalog + // TODO: + // - allow %s to print integers in written form (tables are likely too large + // to enable this by default). + // - list behavior + // +} + +// An Option defines an option of a Printer. +type Option func(o *options) + +// Catalog defines the catalog to be used. +func Catalog(c catalog.Catalog) Option { + return func(o *options) { o.cat = c } +} + +// NewPrinter returns a Printer that formats messages tailored to language t. +func NewPrinter(t language.Tag, opts ...Option) *Printer { + options := &options{ + cat: DefaultCatalog, + } + for _, o := range opts { + o(options) + } + p := &Printer{ + tag: t, + cat: options.cat, + } + p.toDecimal.InitDecimal(t) + p.toScientific.InitScientific(t) + return p +} + +// Sprint is like fmt.Sprint, but using language-specific formatting. +func (p *Printer) Sprint(a ...interface{}) string { + pp := newPrinter(p) + pp.doPrint(a) + s := pp.String() + pp.free() + return s +} + +// Fprint is like fmt.Fprint, but using language-specific formatting. +func (p *Printer) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + pp := newPrinter(p) + pp.doPrint(a) + n64, err := io.Copy(w, &pp.Buffer) + pp.free() + return int(n64), err +} + +// Print is like fmt.Print, but using language-specific formatting. +func (p *Printer) Print(a ...interface{}) (n int, err error) { + return p.Fprint(os.Stdout, a...) +} + +// Sprintln is like fmt.Sprintln, but using language-specific formatting. +func (p *Printer) Sprintln(a ...interface{}) string { + pp := newPrinter(p) + pp.doPrintln(a) + s := pp.String() + pp.free() + return s +} + +// Fprintln is like fmt.Fprintln, but using language-specific formatting. +func (p *Printer) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + pp := newPrinter(p) + pp.doPrintln(a) + n64, err := io.Copy(w, &pp.Buffer) + pp.free() + return int(n64), err +} + +// Println is like fmt.Println, but using language-specific formatting. +func (p *Printer) Println(a ...interface{}) (n int, err error) { + return p.Fprintln(os.Stdout, a...) +} + +// Sprintf is like fmt.Sprintf, but using language-specific formatting. +func (p *Printer) Sprintf(key Reference, a ...interface{}) string { + pp := newPrinter(p) + lookupAndFormat(pp, key, a) + s := pp.String() + pp.free() + return s +} + +// Fprintf is like fmt.Fprintf, but using language-specific formatting. +func (p *Printer) Fprintf(w io.Writer, key Reference, a ...interface{}) (n int, err error) { + pp := newPrinter(p) + lookupAndFormat(pp, key, a) + n, err = w.Write(pp.Bytes()) + pp.free() + return n, err + +} + +// Printf is like fmt.Printf, but using language-specific formatting. +func (p *Printer) Printf(key Reference, a ...interface{}) (n int, err error) { + pp := newPrinter(p) + lookupAndFormat(pp, key, a) + n, err = os.Stdout.Write(pp.Bytes()) + pp.free() + return n, err +} + +func lookupAndFormat(p *printer, r Reference, a []interface{}) { + p.fmt.Reset(a) + var id, msg string + switch v := r.(type) { + case string: + id, msg = v, v + case key: + id, msg = v.id, v.fallback + default: + panic("key argument is not a Reference") + } + + if p.catContext.Execute(id) == catalog.ErrNotFound { + if p.catContext.Execute(msg) == catalog.ErrNotFound { + p.Render(msg) + return + } + } +} + +type rawPrinter struct { + p *printer +} + +func (p rawPrinter) Render(msg string) { p.p.WriteString(msg) } +func (p rawPrinter) Arg(i int) interface{} { return nil } + +// Arg implements catmsg.Renderer. +func (p *printer) Arg(i int) interface{} { // TODO, also return "ok" bool + i-- + if uint(i) < uint(len(p.fmt.Args)) { + return p.fmt.Args[i] + } + return nil +} + +// Render implements catmsg.Renderer. +func (p *printer) Render(msg string) { + p.doPrintf(msg) +} + +// A Reference is a string or a message reference. +type Reference interface { + // TODO: also allow []string +} + +// Key creates a message Reference for a message where the given id is used for +// message lookup and the fallback is returned when no matches are found. +func Key(id string, fallback string) Reference { + return key{id, fallback} +} + +type key struct { + id, fallback string +} diff --git a/tools/vendor/golang.org/x/text/message/print.go b/tools/vendor/golang.org/x/text/message/print.go new file mode 100644 index 000000000..da304cc0e --- /dev/null +++ b/tools/vendor/golang.org/x/text/message/print.go @@ -0,0 +1,984 @@ +// 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 message + +import ( + "bytes" + "fmt" // TODO: consider copying interfaces from package fmt to avoid dependency. + "math" + "reflect" + "sync" + "unicode/utf8" + + "golang.org/x/text/internal/format" + "golang.org/x/text/internal/number" + "golang.org/x/text/language" + "golang.org/x/text/message/catalog" +) + +// Strings for use with buffer.WriteString. +// This is less overhead than using buffer.Write with byte arrays. +const ( + commaSpaceString = ", " + nilAngleString = "" + nilParenString = "(nil)" + nilString = "nil" + mapString = "map[" + percentBangString = "%!" + missingString = "(MISSING)" + badIndexString = "(BADINDEX)" + panicString = "(PANIC=" + extraString = "%!(EXTRA " + badWidthString = "%!(BADWIDTH)" + badPrecString = "%!(BADPREC)" + noVerbString = "%!(NOVERB)" + + invReflectString = "" +) + +var printerPool = sync.Pool{ + New: func() interface{} { return new(printer) }, +} + +// newPrinter allocates a new printer struct or grabs a cached one. +func newPrinter(pp *Printer) *printer { + p := printerPool.Get().(*printer) + p.Printer = *pp + // TODO: cache most of the following call. + p.catContext = pp.cat.Context(pp.tag, p) + + p.panicking = false + p.erroring = false + p.fmt.init(&p.Buffer) + return p +} + +// free saves used printer structs in printerFree; avoids an allocation per invocation. +func (p *printer) free() { + p.Buffer.Reset() + p.arg = nil + p.value = reflect.Value{} + printerPool.Put(p) +} + +// printer is used to store a printer's state. +// It implements "golang.org/x/text/internal/format".State. +type printer struct { + Printer + + // the context for looking up message translations + catContext *catalog.Context + + // buffer for accumulating output. + bytes.Buffer + + // arg holds the current item, as an interface{}. + arg interface{} + // value is used instead of arg for reflect values. + value reflect.Value + + // fmt is used to format basic items such as integers or strings. + fmt formatInfo + + // panicking is set by catchPanic to avoid infinite panic, recover, panic, ... recursion. + panicking bool + // erroring is set when printing an error string to guard against calling handleMethods. + erroring bool +} + +// Language implements "golang.org/x/text/internal/format".State. +func (p *printer) Language() language.Tag { return p.tag } + +func (p *printer) Width() (wid int, ok bool) { return p.fmt.Width, p.fmt.WidthPresent } + +func (p *printer) Precision() (prec int, ok bool) { return p.fmt.Prec, p.fmt.PrecPresent } + +func (p *printer) Flag(b int) bool { + switch b { + case '-': + return p.fmt.Minus + case '+': + return p.fmt.Plus || p.fmt.PlusV + case '#': + return p.fmt.Sharp || p.fmt.SharpV + case ' ': + return p.fmt.Space + case '0': + return p.fmt.Zero + } + return false +} + +// getField gets the i'th field of the struct value. +// If the field is itself is an interface, return a value for +// the thing inside the interface, not the interface itself. +func getField(v reflect.Value, i int) reflect.Value { + val := v.Field(i) + if val.Kind() == reflect.Interface && !val.IsNil() { + val = val.Elem() + } + return val +} + +func (p *printer) unknownType(v reflect.Value) { + if !v.IsValid() { + p.WriteString(nilAngleString) + return + } + p.WriteByte('?') + p.WriteString(v.Type().String()) + p.WriteByte('?') +} + +func (p *printer) badVerb(verb rune) { + p.erroring = true + p.WriteString(percentBangString) + p.WriteRune(verb) + p.WriteByte('(') + switch { + case p.arg != nil: + p.WriteString(reflect.TypeOf(p.arg).String()) + p.WriteByte('=') + p.printArg(p.arg, 'v') + case p.value.IsValid(): + p.WriteString(p.value.Type().String()) + p.WriteByte('=') + p.printValue(p.value, 'v', 0) + default: + p.WriteString(nilAngleString) + } + p.WriteByte(')') + p.erroring = false +} + +func (p *printer) fmtBool(v bool, verb rune) { + switch verb { + case 't', 'v': + p.fmt.fmt_boolean(v) + default: + p.badVerb(verb) + } +} + +// fmt0x64 formats a uint64 in hexadecimal and prefixes it with 0x or +// not, as requested, by temporarily setting the sharp flag. +func (p *printer) fmt0x64(v uint64, leading0x bool) { + sharp := p.fmt.Sharp + p.fmt.Sharp = leading0x + p.fmt.fmt_integer(v, 16, unsigned, ldigits) + p.fmt.Sharp = sharp +} + +// fmtInteger formats a signed or unsigned integer. +func (p *printer) fmtInteger(v uint64, isSigned bool, verb rune) { + switch verb { + case 'v': + if p.fmt.SharpV && !isSigned { + p.fmt0x64(v, true) + return + } + fallthrough + case 'd': + if p.fmt.Sharp || p.fmt.SharpV { + p.fmt.fmt_integer(v, 10, isSigned, ldigits) + } else { + p.fmtDecimalInt(v, isSigned) + } + case 'b': + p.fmt.fmt_integer(v, 2, isSigned, ldigits) + case 'o': + p.fmt.fmt_integer(v, 8, isSigned, ldigits) + case 'x': + p.fmt.fmt_integer(v, 16, isSigned, ldigits) + case 'X': + p.fmt.fmt_integer(v, 16, isSigned, udigits) + case 'c': + p.fmt.fmt_c(v) + case 'q': + if v <= utf8.MaxRune { + p.fmt.fmt_qc(v) + } else { + p.badVerb(verb) + } + case 'U': + p.fmt.fmt_unicode(v) + default: + p.badVerb(verb) + } +} + +// fmtFloat formats a float. The default precision for each verb +// is specified as last argument in the call to fmt_float. +func (p *printer) fmtFloat(v float64, size int, verb rune) { + switch verb { + case 'b': + p.fmt.fmt_float(v, size, verb, -1) + case 'v': + verb = 'g' + fallthrough + case 'g', 'G': + if p.fmt.Sharp || p.fmt.SharpV { + p.fmt.fmt_float(v, size, verb, -1) + } else { + p.fmtVariableFloat(v, size) + } + case 'e', 'E': + if p.fmt.Sharp || p.fmt.SharpV { + p.fmt.fmt_float(v, size, verb, 6) + } else { + p.fmtScientific(v, size, 6) + } + case 'f', 'F': + if p.fmt.Sharp || p.fmt.SharpV { + p.fmt.fmt_float(v, size, verb, 6) + } else { + p.fmtDecimalFloat(v, size, 6) + } + default: + p.badVerb(verb) + } +} + +func (p *printer) setFlags(f *number.Formatter) { + f.Flags &^= number.ElideSign + if p.fmt.Plus || p.fmt.Space { + f.Flags |= number.AlwaysSign + if !p.fmt.Plus { + f.Flags |= number.ElideSign + } + } else { + f.Flags &^= number.AlwaysSign + } +} + +func (p *printer) updatePadding(f *number.Formatter) { + f.Flags &^= number.PadMask + if p.fmt.Minus { + f.Flags |= number.PadAfterSuffix + } else { + f.Flags |= number.PadBeforePrefix + } + f.PadRune = ' ' + f.FormatWidth = uint16(p.fmt.Width) +} + +func (p *printer) initDecimal(minFrac, maxFrac int) { + f := &p.toDecimal + f.MinIntegerDigits = 1 + f.MaxIntegerDigits = 0 + f.MinFractionDigits = uint8(minFrac) + f.MaxFractionDigits = int16(maxFrac) + p.setFlags(f) + f.PadRune = 0 + if p.fmt.WidthPresent { + if p.fmt.Zero { + wid := p.fmt.Width + // Use significant integers for this. + // TODO: this is not the same as width, but so be it. + if f.MinFractionDigits > 0 { + wid -= 1 + int(f.MinFractionDigits) + } + if p.fmt.Plus || p.fmt.Space { + wid-- + } + if wid > 0 && wid > int(f.MinIntegerDigits) { + f.MinIntegerDigits = uint8(wid) + } + } + p.updatePadding(f) + } +} + +func (p *printer) initScientific(minFrac, maxFrac int) { + f := &p.toScientific + if maxFrac < 0 { + f.SetPrecision(maxFrac) + } else { + f.SetPrecision(maxFrac + 1) + f.MinFractionDigits = uint8(minFrac) + f.MaxFractionDigits = int16(maxFrac) + } + f.MinExponentDigits = 2 + p.setFlags(f) + f.PadRune = 0 + if p.fmt.WidthPresent { + f.Flags &^= number.PadMask + if p.fmt.Zero { + f.PadRune = f.Digit(0) + f.Flags |= number.PadAfterPrefix + } else { + f.PadRune = ' ' + f.Flags |= number.PadBeforePrefix + } + p.updatePadding(f) + } +} + +func (p *printer) fmtDecimalInt(v uint64, isSigned bool) { + var d number.Decimal + + f := &p.toDecimal + if p.fmt.PrecPresent { + p.setFlags(f) + f.MinIntegerDigits = uint8(p.fmt.Prec) + f.MaxIntegerDigits = 0 + f.MinFractionDigits = 0 + f.MaxFractionDigits = 0 + if p.fmt.WidthPresent { + p.updatePadding(f) + } + } else { + p.initDecimal(0, 0) + } + d.ConvertInt(p.toDecimal.RoundingContext, isSigned, v) + + out := p.toDecimal.Format([]byte(nil), &d) + p.Buffer.Write(out) +} + +func (p *printer) fmtDecimalFloat(v float64, size, prec int) { + var d number.Decimal + if p.fmt.PrecPresent { + prec = p.fmt.Prec + } + p.initDecimal(prec, prec) + d.ConvertFloat(p.toDecimal.RoundingContext, v, size) + + out := p.toDecimal.Format([]byte(nil), &d) + p.Buffer.Write(out) +} + +func (p *printer) fmtVariableFloat(v float64, size int) { + prec := -1 + if p.fmt.PrecPresent { + prec = p.fmt.Prec + } + var d number.Decimal + p.initScientific(0, prec) + d.ConvertFloat(p.toScientific.RoundingContext, v, size) + + // Copy logic of 'g' formatting from strconv. It is simplified a bit as + // we don't have to mind having prec > len(d.Digits). + shortest := prec < 0 + ePrec := prec + if shortest { + prec = len(d.Digits) + ePrec = 6 + } else if prec == 0 { + prec = 1 + ePrec = 1 + } + exp := int(d.Exp) - 1 + if exp < -4 || exp >= ePrec { + p.initScientific(0, prec) + + out := p.toScientific.Format([]byte(nil), &d) + p.Buffer.Write(out) + } else { + if prec > int(d.Exp) { + prec = len(d.Digits) + } + if prec -= int(d.Exp); prec < 0 { + prec = 0 + } + p.initDecimal(0, prec) + + out := p.toDecimal.Format([]byte(nil), &d) + p.Buffer.Write(out) + } +} + +func (p *printer) fmtScientific(v float64, size, prec int) { + var d number.Decimal + if p.fmt.PrecPresent { + prec = p.fmt.Prec + } + p.initScientific(prec, prec) + rc := p.toScientific.RoundingContext + d.ConvertFloat(rc, v, size) + + out := p.toScientific.Format([]byte(nil), &d) + p.Buffer.Write(out) + +} + +// fmtComplex formats a complex number v with +// r = real(v) and j = imag(v) as (r+ji) using +// fmtFloat for r and j formatting. +func (p *printer) fmtComplex(v complex128, size int, verb rune) { + // Make sure any unsupported verbs are found before the + // calls to fmtFloat to not generate an incorrect error string. + switch verb { + case 'v', 'b', 'g', 'G', 'f', 'F', 'e', 'E': + p.WriteByte('(') + p.fmtFloat(real(v), size/2, verb) + // Imaginary part always has a sign. + if math.IsNaN(imag(v)) { + // By CLDR's rules, NaNs do not use patterns or signs. As this code + // relies on AlwaysSign working for imaginary parts, we need to + // manually handle NaNs. + f := &p.toScientific + p.setFlags(f) + p.updatePadding(f) + p.setFlags(f) + nan := f.Symbol(number.SymNan) + extra := 0 + if w, ok := p.Width(); ok { + extra = w - utf8.RuneCountInString(nan) - 1 + } + if f.Flags&number.PadAfterNumber == 0 { + for ; extra > 0; extra-- { + p.WriteRune(f.PadRune) + } + } + p.WriteString(f.Symbol(number.SymPlusSign)) + p.WriteString(nan) + for ; extra > 0; extra-- { + p.WriteRune(f.PadRune) + } + p.WriteString("i)") + return + } + oldPlus := p.fmt.Plus + p.fmt.Plus = true + p.fmtFloat(imag(v), size/2, verb) + p.WriteString("i)") // TODO: use symbol? + p.fmt.Plus = oldPlus + default: + p.badVerb(verb) + } +} + +func (p *printer) fmtString(v string, verb rune) { + switch verb { + case 'v': + if p.fmt.SharpV { + p.fmt.fmt_q(v) + } else { + p.fmt.fmt_s(v) + } + case 's': + p.fmt.fmt_s(v) + case 'x': + p.fmt.fmt_sx(v, ldigits) + case 'X': + p.fmt.fmt_sx(v, udigits) + case 'q': + p.fmt.fmt_q(v) + case 'm': + ctx := p.cat.Context(p.tag, rawPrinter{p}) + if ctx.Execute(v) == catalog.ErrNotFound { + p.WriteString(v) + } + default: + p.badVerb(verb) + } +} + +func (p *printer) fmtBytes(v []byte, verb rune, typeString string) { + switch verb { + case 'v', 'd': + if p.fmt.SharpV { + p.WriteString(typeString) + if v == nil { + p.WriteString(nilParenString) + return + } + p.WriteByte('{') + for i, c := range v { + if i > 0 { + p.WriteString(commaSpaceString) + } + p.fmt0x64(uint64(c), true) + } + p.WriteByte('}') + } else { + p.WriteByte('[') + for i, c := range v { + if i > 0 { + p.WriteByte(' ') + } + p.fmt.fmt_integer(uint64(c), 10, unsigned, ldigits) + } + p.WriteByte(']') + } + case 's': + p.fmt.fmt_s(string(v)) + case 'x': + p.fmt.fmt_bx(v, ldigits) + case 'X': + p.fmt.fmt_bx(v, udigits) + case 'q': + p.fmt.fmt_q(string(v)) + default: + p.printValue(reflect.ValueOf(v), verb, 0) + } +} + +func (p *printer) fmtPointer(value reflect.Value, verb rune) { + var u uintptr + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer: + u = value.Pointer() + default: + p.badVerb(verb) + return + } + + switch verb { + case 'v': + if p.fmt.SharpV { + p.WriteByte('(') + p.WriteString(value.Type().String()) + p.WriteString(")(") + if u == 0 { + p.WriteString(nilString) + } else { + p.fmt0x64(uint64(u), true) + } + p.WriteByte(')') + } else { + if u == 0 { + p.fmt.padString(nilAngleString) + } else { + p.fmt0x64(uint64(u), !p.fmt.Sharp) + } + } + case 'p': + p.fmt0x64(uint64(u), !p.fmt.Sharp) + case 'b', 'o', 'd', 'x', 'X': + if verb == 'd' { + p.fmt.Sharp = true // Print as standard go. TODO: does this make sense? + } + p.fmtInteger(uint64(u), unsigned, verb) + default: + p.badVerb(verb) + } +} + +func (p *printer) catchPanic(arg interface{}, verb rune) { + if err := recover(); err != nil { + // If it's a nil pointer, just say "". The likeliest causes are a + // Stringer that fails to guard against nil or a nil pointer for a + // value receiver, and in either case, "" is a nice result. + if v := reflect.ValueOf(arg); v.Kind() == reflect.Ptr && v.IsNil() { + p.WriteString(nilAngleString) + return + } + // Otherwise print a concise panic message. Most of the time the panic + // value will print itself nicely. + if p.panicking { + // Nested panics; the recursion in printArg cannot succeed. + panic(err) + } + + oldFlags := p.fmt.Parser + // For this output we want default behavior. + p.fmt.ClearFlags() + + p.WriteString(percentBangString) + p.WriteRune(verb) + p.WriteString(panicString) + p.panicking = true + p.printArg(err, 'v') + p.panicking = false + p.WriteByte(')') + + p.fmt.Parser = oldFlags + } +} + +func (p *printer) handleMethods(verb rune) (handled bool) { + if p.erroring { + return + } + // Is it a Formatter? + if formatter, ok := p.arg.(format.Formatter); ok { + handled = true + defer p.catchPanic(p.arg, verb) + formatter.Format(p, verb) + return + } + if formatter, ok := p.arg.(fmt.Formatter); ok { + handled = true + defer p.catchPanic(p.arg, verb) + formatter.Format(p, verb) + return + } + + // If we're doing Go syntax and the argument knows how to supply it, take care of it now. + if p.fmt.SharpV { + if stringer, ok := p.arg.(fmt.GoStringer); ok { + handled = true + defer p.catchPanic(p.arg, verb) + // Print the result of GoString unadorned. + p.fmt.fmt_s(stringer.GoString()) + return + } + } else { + // If a string is acceptable according to the format, see if + // the value satisfies one of the string-valued interfaces. + // Println etc. set verb to %v, which is "stringable". + switch verb { + case 'v', 's', 'x', 'X', 'q': + // Is it an error or Stringer? + // The duplication in the bodies is necessary: + // setting handled and deferring catchPanic + // must happen before calling the method. + switch v := p.arg.(type) { + case error: + handled = true + defer p.catchPanic(p.arg, verb) + p.fmtString(v.Error(), verb) + return + + case fmt.Stringer: + handled = true + defer p.catchPanic(p.arg, verb) + p.fmtString(v.String(), verb) + return + } + } + } + return false +} + +func (p *printer) printArg(arg interface{}, verb rune) { + p.arg = arg + p.value = reflect.Value{} + + if arg == nil { + switch verb { + case 'T', 'v': + p.fmt.padString(nilAngleString) + default: + p.badVerb(verb) + } + return + } + + // Special processing considerations. + // %T (the value's type) and %p (its address) are special; we always do them first. + switch verb { + case 'T': + p.fmt.fmt_s(reflect.TypeOf(arg).String()) + return + case 'p': + p.fmtPointer(reflect.ValueOf(arg), 'p') + return + } + + // Some types can be done without reflection. + switch f := arg.(type) { + case bool: + p.fmtBool(f, verb) + case float32: + p.fmtFloat(float64(f), 32, verb) + case float64: + p.fmtFloat(f, 64, verb) + case complex64: + p.fmtComplex(complex128(f), 64, verb) + case complex128: + p.fmtComplex(f, 128, verb) + case int: + p.fmtInteger(uint64(f), signed, verb) + case int8: + p.fmtInteger(uint64(f), signed, verb) + case int16: + p.fmtInteger(uint64(f), signed, verb) + case int32: + p.fmtInteger(uint64(f), signed, verb) + case int64: + p.fmtInteger(uint64(f), signed, verb) + case uint: + p.fmtInteger(uint64(f), unsigned, verb) + case uint8: + p.fmtInteger(uint64(f), unsigned, verb) + case uint16: + p.fmtInteger(uint64(f), unsigned, verb) + case uint32: + p.fmtInteger(uint64(f), unsigned, verb) + case uint64: + p.fmtInteger(f, unsigned, verb) + case uintptr: + p.fmtInteger(uint64(f), unsigned, verb) + case string: + p.fmtString(f, verb) + case []byte: + p.fmtBytes(f, verb, "[]byte") + case reflect.Value: + // Handle extractable values with special methods + // since printValue does not handle them at depth 0. + if f.IsValid() && f.CanInterface() { + p.arg = f.Interface() + if p.handleMethods(verb) { + return + } + } + p.printValue(f, verb, 0) + default: + // If the type is not simple, it might have methods. + if !p.handleMethods(verb) { + // Need to use reflection, since the type had no + // interface methods that could be used for formatting. + p.printValue(reflect.ValueOf(f), verb, 0) + } + } +} + +// printValue is similar to printArg but starts with a reflect value, not an interface{} value. +// It does not handle 'p' and 'T' verbs because these should have been already handled by printArg. +func (p *printer) printValue(value reflect.Value, verb rune, depth int) { + // Handle values with special methods if not already handled by printArg (depth == 0). + if depth > 0 && value.IsValid() && value.CanInterface() { + p.arg = value.Interface() + if p.handleMethods(verb) { + return + } + } + p.arg = nil + p.value = value + + switch f := value; value.Kind() { + case reflect.Invalid: + if depth == 0 { + p.WriteString(invReflectString) + } else { + switch verb { + case 'v': + p.WriteString(nilAngleString) + default: + p.badVerb(verb) + } + } + case reflect.Bool: + p.fmtBool(f.Bool(), verb) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p.fmtInteger(uint64(f.Int()), signed, verb) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p.fmtInteger(f.Uint(), unsigned, verb) + case reflect.Float32: + p.fmtFloat(f.Float(), 32, verb) + case reflect.Float64: + p.fmtFloat(f.Float(), 64, verb) + case reflect.Complex64: + p.fmtComplex(f.Complex(), 64, verb) + case reflect.Complex128: + p.fmtComplex(f.Complex(), 128, verb) + case reflect.String: + p.fmtString(f.String(), verb) + case reflect.Map: + if p.fmt.SharpV { + p.WriteString(f.Type().String()) + if f.IsNil() { + p.WriteString(nilParenString) + return + } + p.WriteByte('{') + } else { + p.WriteString(mapString) + } + keys := f.MapKeys() + for i, key := range keys { + if i > 0 { + if p.fmt.SharpV { + p.WriteString(commaSpaceString) + } else { + p.WriteByte(' ') + } + } + p.printValue(key, verb, depth+1) + p.WriteByte(':') + p.printValue(f.MapIndex(key), verb, depth+1) + } + if p.fmt.SharpV { + p.WriteByte('}') + } else { + p.WriteByte(']') + } + case reflect.Struct: + if p.fmt.SharpV { + p.WriteString(f.Type().String()) + } + p.WriteByte('{') + for i := 0; i < f.NumField(); i++ { + if i > 0 { + if p.fmt.SharpV { + p.WriteString(commaSpaceString) + } else { + p.WriteByte(' ') + } + } + if p.fmt.PlusV || p.fmt.SharpV { + if name := f.Type().Field(i).Name; name != "" { + p.WriteString(name) + p.WriteByte(':') + } + } + p.printValue(getField(f, i), verb, depth+1) + } + p.WriteByte('}') + case reflect.Interface: + value := f.Elem() + if !value.IsValid() { + if p.fmt.SharpV { + p.WriteString(f.Type().String()) + p.WriteString(nilParenString) + } else { + p.WriteString(nilAngleString) + } + } else { + p.printValue(value, verb, depth+1) + } + case reflect.Array, reflect.Slice: + switch verb { + case 's', 'q', 'x', 'X': + // Handle byte and uint8 slices and arrays special for the above verbs. + t := f.Type() + if t.Elem().Kind() == reflect.Uint8 { + var bytes []byte + if f.Kind() == reflect.Slice { + bytes = f.Bytes() + } else if f.CanAddr() { + bytes = f.Slice(0, f.Len()).Bytes() + } else { + // We have an array, but we cannot Slice() a non-addressable array, + // so we build a slice by hand. This is a rare case but it would be nice + // if reflection could help a little more. + bytes = make([]byte, f.Len()) + for i := range bytes { + bytes[i] = byte(f.Index(i).Uint()) + } + } + p.fmtBytes(bytes, verb, t.String()) + return + } + } + if p.fmt.SharpV { + p.WriteString(f.Type().String()) + if f.Kind() == reflect.Slice && f.IsNil() { + p.WriteString(nilParenString) + return + } + p.WriteByte('{') + for i := 0; i < f.Len(); i++ { + if i > 0 { + p.WriteString(commaSpaceString) + } + p.printValue(f.Index(i), verb, depth+1) + } + p.WriteByte('}') + } else { + p.WriteByte('[') + for i := 0; i < f.Len(); i++ { + if i > 0 { + p.WriteByte(' ') + } + p.printValue(f.Index(i), verb, depth+1) + } + p.WriteByte(']') + } + case reflect.Ptr: + // pointer to array or slice or struct? ok at top level + // but not embedded (avoid loops) + if depth == 0 && f.Pointer() != 0 { + switch a := f.Elem(); a.Kind() { + case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map: + p.WriteByte('&') + p.printValue(a, verb, depth+1) + return + } + } + fallthrough + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + p.fmtPointer(f, verb) + default: + p.unknownType(f) + } +} + +func (p *printer) badArgNum(verb rune) { + p.WriteString(percentBangString) + p.WriteRune(verb) + p.WriteString(badIndexString) +} + +func (p *printer) missingArg(verb rune) { + p.WriteString(percentBangString) + p.WriteRune(verb) + p.WriteString(missingString) +} + +func (p *printer) doPrintf(fmt string) { + for p.fmt.Parser.SetFormat(fmt); p.fmt.Scan(); { + switch p.fmt.Status { + case format.StatusText: + p.WriteString(p.fmt.Text()) + case format.StatusSubstitution: + p.printArg(p.Arg(p.fmt.ArgNum), p.fmt.Verb) + case format.StatusBadWidthSubstitution: + p.WriteString(badWidthString) + p.printArg(p.Arg(p.fmt.ArgNum), p.fmt.Verb) + case format.StatusBadPrecSubstitution: + p.WriteString(badPrecString) + p.printArg(p.Arg(p.fmt.ArgNum), p.fmt.Verb) + case format.StatusNoVerb: + p.WriteString(noVerbString) + case format.StatusBadArgNum: + p.badArgNum(p.fmt.Verb) + case format.StatusMissingArg: + p.missingArg(p.fmt.Verb) + default: + panic("unreachable") + } + } + + // Check for extra arguments, but only if there was at least one ordered + // argument. Note that this behavior is necessarily different from fmt: + // different variants of messages may opt to drop some or all of the + // arguments. + if !p.fmt.Reordered && p.fmt.ArgNum < len(p.fmt.Args) && p.fmt.ArgNum != 0 { + p.fmt.ClearFlags() + p.WriteString(extraString) + for i, arg := range p.fmt.Args[p.fmt.ArgNum:] { + if i > 0 { + p.WriteString(commaSpaceString) + } + if arg == nil { + p.WriteString(nilAngleString) + } else { + p.WriteString(reflect.TypeOf(arg).String()) + p.WriteString("=") + p.printArg(arg, 'v') + } + } + p.WriteByte(')') + } +} + +func (p *printer) doPrint(a []interface{}) { + prevString := false + for argNum, arg := range a { + isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String + // Add a space between two non-string arguments. + if argNum > 0 && !isString && !prevString { + p.WriteByte(' ') + } + p.printArg(arg, 'v') + prevString = isString + } +} + +// doPrintln is like doPrint but always adds a space between arguments +// and a newline after the last argument. +func (p *printer) doPrintln(a []interface{}) { + for argNum, arg := range a { + if argNum > 0 { + p.WriteByte(' ') + } + p.printArg(arg, 'v') + } + p.WriteByte('\n') +} diff --git a/tools/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/tools/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index f248effae..ffadb7beb 100644 --- a/tools/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/tools/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/tools/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/tools/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go new file mode 100644 index 000000000..92cce5802 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/tools/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index 9115ef257..f65785e8a 100644 --- a/tools/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/tools/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/tools/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/tools/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go new file mode 100644 index 000000000..e1858b879 --- /dev/null +++ b/tools/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/tools/vendor/golang.org/x/text/unicode/norm/trie.go b/tools/vendor/golang.org/x/text/unicode/norm/trie.go index 423386bf4..e4250ae22 100644 --- a/tools/vendor/golang.org/x/text/unicode/norm/trie.go +++ b/tools/vendor/golang.org/x/text/unicode/norm/trie.go @@ -29,7 +29,7 @@ var ( nfkcData = newNfkcTrie(0) ) -// lookupValue determines the type of block n and looks up the value for b. +// lookup determines the type of block n and looks up the value for b. // For n < t.cutoff, the block is a simple lookup table. Otherwise, the block // is a list of ranges with an accompanying value. Given a matching range r, // the value for b is by r.value + (b - r.lo) * stride. diff --git a/tools/vendor/golang.org/x/text/width/tables13.0.0.go b/tools/vendor/golang.org/x/text/width/tables13.0.0.go index ab258e384..b1fcb522c 100644 --- a/tools/vendor/golang.org/x/text/width/tables13.0.0.go +++ b/tools/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/tools/vendor/golang.org/x/text/width/tables15.0.0.go b/tools/vendor/golang.org/x/text/width/tables15.0.0.go new file mode 100644 index 000000000..4b91e3384 --- /dev/null +++ b/tools/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: +// +// <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 (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/tools/vendor/golang.org/x/tools/cmd/stringer/stringer.go b/tools/vendor/golang.org/x/tools/cmd/stringer/stringer.go index 998d1a51b..2b19c93e8 100644 --- a/tools/vendor/golang.org/x/tools/cmd/stringer/stringer.go +++ b/tools/vendor/golang.org/x/tools/cmd/stringer/stringer.go @@ -188,6 +188,8 @@ type Generator struct { trimPrefix string lineComment bool + + logf func(format string, args ...interface{}) // test logging hook; nil when not testing } func (g *Generator) Printf(format string, args ...interface{}) { @@ -221,13 +223,14 @@ func (g *Generator) parsePackage(patterns []string, tags []string) { // in a separate pass? For later. Tests: false, BuildFlags: []string{fmt.Sprintf("-tags=%s", strings.Join(tags, " "))}, + Logf: g.logf, } pkgs, err := packages.Load(cfg, patterns...) if err != nil { log.Fatal(err) } if len(pkgs) != 1 { - log.Fatalf("error: %d packages found", len(pkgs)) + log.Fatalf("error: %d packages matching %v", len(pkgs), strings.Join(patterns, " ")) } g.addPackage(pkgs[0]) } diff --git a/tools/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/tools/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go index 165ede0f8..03543bd4b 100644 --- a/tools/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go +++ b/tools/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go @@ -128,15 +128,14 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, // (from "version"). Select appropriate importer. if len(data) > 0 { switch data[0] { - case 'i': - _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) - return pkg, err + case 'v', 'c', 'd': // binary, till go1.10 + return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - case 'v', 'c', 'd': - _, pkg, err := gcimporter.BImportData(fset, imports, data, path) + case 'i': // indexed, till go1.19 + _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) return pkg, err - case 'u': + case 'u': // unified, from go1.20 _, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path) return pkg, err diff --git a/tools/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/tools/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go index 18a002f82..0454cdd78 100644 --- a/tools/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go +++ b/tools/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go @@ -8,7 +8,6 @@ package packagesdriver import ( "context" "fmt" - "go/types" "strings" "golang.org/x/tools/internal/gocommand" @@ -16,7 +15,7 @@ import ( var debug = false -func GetSizesGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner *gocommand.Runner) (types.Sizes, error) { +func GetSizesForArgsGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner *gocommand.Runner) (string, string, error) { inv.Verb = "list" inv.Args = []string{"-f", "{{context.GOARCH}} {{context.Compiler}}", "--", "unsafe"} stdout, stderr, friendlyErr, rawErr := gocmdRunner.RunRaw(ctx, inv) @@ -29,21 +28,21 @@ func GetSizesGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner * inv.Args = []string{"GOARCH"} envout, enverr := gocmdRunner.Run(ctx, inv) if enverr != nil { - return nil, enverr + return "", "", enverr } goarch = strings.TrimSpace(envout.String()) compiler = "gc" } else { - return nil, friendlyErr + return "", "", friendlyErr } } else { fields := strings.Fields(stdout.String()) if len(fields) < 2 { - return nil, fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", + return "", "", fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", stdout.String(), stderr.String()) } goarch = fields[0] compiler = fields[1] } - return types.SizesFor(compiler, goarch), nil + return compiler, goarch, nil } diff --git a/tools/vendor/golang.org/x/tools/go/packages/doc.go b/tools/vendor/golang.org/x/tools/go/packages/doc.go index da4ab89fe..a7a8f73e3 100644 --- a/tools/vendor/golang.org/x/tools/go/packages/doc.go +++ b/tools/vendor/golang.org/x/tools/go/packages/doc.go @@ -35,7 +35,7 @@ The Package struct provides basic information about the package, including - Imports, a map from source import strings to the Packages they name; - Types, the type information for the package's exported symbols; - Syntax, the parsed syntax trees for the package's source code; and - - TypeInfo, the result of a complete type-check of the package syntax trees. + - TypesInfo, the result of a complete type-check of the package syntax trees. (See the documentation for type Package for the complete list of fields and more detailed descriptions.) diff --git a/tools/vendor/golang.org/x/tools/go/packages/golist.go b/tools/vendor/golang.org/x/tools/go/packages/golist.go index 6bb7168d2..1f1eade0a 100644 --- a/tools/vendor/golang.org/x/tools/go/packages/golist.go +++ b/tools/vendor/golang.org/x/tools/go/packages/golist.go @@ -9,8 +9,6 @@ import ( "context" "encoding/json" "fmt" - "go/types" - "io/ioutil" "log" "os" "path" @@ -153,10 +151,10 @@ func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) { if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { sizeswg.Add(1) go func() { - var sizes types.Sizes - sizes, sizeserr = packagesdriver.GetSizesGolist(ctx, state.cfgInvocation(), cfg.gocmdRunner) - // types.SizesFor always returns nil or a *types.StdSizes. - response.dr.Sizes, _ = sizes.(*types.StdSizes) + compiler, arch, err := packagesdriver.GetSizesForArgsGolist(ctx, state.cfgInvocation(), cfg.gocmdRunner) + sizeserr = err + response.dr.Compiler = compiler + response.dr.Arch = arch sizeswg.Done() }() } @@ -625,7 +623,12 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse } if pkg.PkgPath == "unsafe" { - pkg.GoFiles = nil // ignore fake unsafe.go file + pkg.CompiledGoFiles = nil // ignore fake unsafe.go file (#59929) + } else if len(pkg.CompiledGoFiles) == 0 { + // Work around for pre-go.1.11 versions of go list. + // TODO(matloob): they should be handled by the fallback. + // Can we delete this? + pkg.CompiledGoFiles = pkg.GoFiles } // Assume go list emits only absolute paths for Dir. @@ -663,16 +666,12 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse response.Roots = append(response.Roots, pkg.ID) } - // Work around for pre-go.1.11 versions of go list. - // TODO(matloob): they should be handled by the fallback. - // Can we delete this? - if len(pkg.CompiledGoFiles) == 0 { - pkg.CompiledGoFiles = pkg.GoFiles - } - // Temporary work-around for golang/go#39986. Parse filenames out of // error messages. This happens if there are unrecoverable syntax // errors in the source, so we can't match on a specific error message. + // + // TODO(rfindley): remove this heuristic, in favor of considering + // InvalidGoFiles from the list driver. if err := p.Error; err != nil && state.shouldAddFilenameFromError(p) { addFilenameFromPos := func(pos string) bool { split := strings.Split(pos, ":") @@ -891,6 +890,15 @@ func golistargs(cfg *Config, words []string, goVersion int) []string { // probably because you'd just get the TestMain. fmt.Sprintf("-find=%t", !cfg.Tests && cfg.Mode&findFlags == 0 && !usesExportData(cfg)), } + + // golang/go#60456: with go1.21 and later, go list serves pgo variants, which + // can be costly to compute and may result in redundant processing for the + // caller. Disable these variants. If someone wants to add e.g. a NeedPGO + // mode flag, that should be a separate proposal. + if goVersion >= 21 { + fullargs = append(fullargs, "-pgo=off") + } + fullargs = append(fullargs, cfg.BuildFlags...) fullargs = append(fullargs, "--") fullargs = append(fullargs, words...) @@ -1100,7 +1108,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err if len(state.cfg.Overlay) == 0 { return "", func() {}, nil } - dir, err := ioutil.TempDir("", "gopackages-*") + dir, err := os.MkdirTemp("", "gopackages-*") if err != nil { return "", nil, err } @@ -1119,7 +1127,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err // Create a unique filename for the overlaid files, to avoid // creating nested directories. noSeparator := strings.Join(strings.Split(filepath.ToSlash(k), "/"), "") - f, err := ioutil.TempFile(dir, fmt.Sprintf("*-%s", noSeparator)) + f, err := os.CreateTemp(dir, fmt.Sprintf("*-%s", noSeparator)) if err != nil { return "", func() {}, err } @@ -1137,7 +1145,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err } // Write out the overlay file that contains the filepath mappings. filename = filepath.Join(dir, "overlay.json") - if err := ioutil.WriteFile(filename, b, 0665); err != nil { + if err := os.WriteFile(filename, b, 0665); err != nil { return "", func() {}, err } return filename, cleanup, nil diff --git a/tools/vendor/golang.org/x/tools/go/packages/packages.go b/tools/vendor/golang.org/x/tools/go/packages/packages.go index 0f1505b80..ece0e7c60 100644 --- a/tools/vendor/golang.org/x/tools/go/packages/packages.go +++ b/tools/vendor/golang.org/x/tools/go/packages/packages.go @@ -16,7 +16,6 @@ import ( "go/token" "go/types" "io" - "io/ioutil" "log" "os" "path/filepath" @@ -220,8 +219,10 @@ type driverResponse struct { // lists of multiple drivers, go/packages will fall back to the next driver. NotHandled bool - // Sizes, if not nil, is the types.Sizes to use when type checking. - Sizes *types.StdSizes + // Compiler and Arch are the arguments pass of types.SizesFor + // to get a types.Sizes to use when type checking. + Compiler string + Arch string // Roots is the set of package IDs that make up the root packages. // We have to encode this separately because when we encode a single package @@ -262,7 +263,7 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) { if err != nil { return nil, err } - l.sizes = response.Sizes + l.sizes = types.SizesFor(response.Compiler, response.Arch) return l.refine(response) } @@ -308,6 +309,9 @@ type Package struct { TypeErrors []types.Error // GoFiles lists the absolute file paths of the package's Go source files. + // It may include files that should not be compiled, for example because + // they contain non-matching build tags, are documentary pseudo-files such as + // unsafe/unsafe.go or builtin/builtin.go, or are subject to cgo preprocessing. GoFiles []string // CompiledGoFiles lists the absolute file paths of the package's source @@ -627,7 +631,7 @@ func newLoader(cfg *Config) *loader { return ld } -// refine connects the supplied packages into a graph and then adds type and +// refine connects the supplied packages into a graph and then adds type // and syntax information as requested by the LoadMode. func (ld *loader) refine(response *driverResponse) ([]*Package, error) { roots := response.Roots @@ -1040,6 +1044,9 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { Error: appendError, Sizes: ld.sizes, } + if lpkg.Module != nil && lpkg.Module.GoVersion != "" { + typesinternal.SetGoVersion(tc, "go"+lpkg.Module.GoVersion) + } if (ld.Mode & typecheckCgo) != 0 { if !typesinternal.SetUsesCgo(tc) { appendError(Error{ @@ -1119,7 +1126,7 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) { var err error if src == nil { ioLimit <- true // wait - src, err = ioutil.ReadFile(filename) + src, err = os.ReadFile(filename) <-ioLimit // signal } if err != nil { diff --git a/tools/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/tools/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index be8f5a867..fa5834baf 100644 --- a/tools/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/tools/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -29,10 +29,10 @@ import ( "sort" "strconv" "strings" + _ "unsafe" "golang.org/x/tools/internal/typeparams" - - _ "unsafe" // for go:linkname + "golang.org/x/tools/internal/typesinternal" ) // A Path is an opaque name that identifies a types.Object @@ -113,6 +113,32 @@ const ( 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 { + scopeMemo map[*types.Scope][]types.Object // memoization of scopeObjects + namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() + skipMethodSorting bool +} + +// Expose back doors so that gopls can avoid method sorting, which can dominate +// analysis on certain repositories. +// +// TODO(golang/go#61443): remove this. +func init() { + typesinternal.SkipEncoderMethodSorting = func(enc interface{}) { + enc.(*Encoder).skipMethodSorting = true + } + typesinternal.ObjectpathObject = object +} + // 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. // @@ -125,6 +151,17 @@ const ( // 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. // +// The set of objects accessible from a package's Scope depends on +// whether the package was produced by type-checking syntax, or +// reading export data; the latter may have a smaller Scope since +// export data trims objects that are not reachable from an exported +// declaration. For example, the For function will return a path for +// an exported method of an unexported type that is not reachable +// from any public declaration; this path will cause the Object +// function to fail if called on a package loaded from export data. +// TODO(adonovan): is this a bug or feature? Should this package +// compute accessibility in the same way? +// // For does not return a path for predeclared names, imported package // names, local names, and unexported package-level names (except // types). @@ -145,24 +182,7 @@ const ( // .Type().Field(0) (field Var X) // // where p is the package (*types.Package) to which X belongs. -func For(obj types.Object) (Path, error) { - return newEncoderFor()(obj) -} - -// An encoder amortizes the cost of encoding the paths of multiple objects. -// Nonexported pending approval of proposal 58668. -type encoder struct { - scopeNamesMemo map[*types.Scope][]string // memoization of Scope.Names() - namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() -} - -// Exposed to gopls via golang.org/x/tools/internal/typesinternal -// pending approval of proposal 58668. -// -//go:linkname newEncoderFor -func newEncoderFor() func(types.Object) (Path, error) { return new(encoder).For } - -func (enc *encoder) For(obj types.Object) (Path, error) { +func (enc *Encoder) For(obj types.Object) (Path, error) { pkg := obj.Pkg() // This table lists the cases of interest. @@ -260,15 +280,14 @@ func (enc *encoder) For(obj types.Object) (Path, error) { // 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) + objs := enc.scopeObjects(scope) + for _, o := range objs { tname, ok := o.(*types.TypeName) if !ok { continue // handle non-types in second pass } - path := append(empty, name...) + path := append(empty, o.Name()...) path = append(path, opType) T := o.Type() @@ -294,9 +313,8 @@ func (enc *encoder) For(obj types.Object) (Path, error) { // Then inspect everything else: // non-types, and declared methods of defined types. - for _, name := range names { - o := scope.Lookup(name) - path := append(empty, name...) + for _, o := range objs { + path := append(empty, o.Name()...) if _, ok := o.(*types.TypeName); !ok { if o.Exported() { // exported non-type (const, var, func) @@ -310,16 +328,31 @@ func (enc *encoder) For(obj types.Object) (Path, error) { // 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 !enc.skipMethodSorting { + // 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 + } } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil + } else { + // This branch must match the logic in the branch above, using go/types + // APIs without sorting. + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + 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 + } } } } @@ -341,7 +374,7 @@ func appendOpArg(path []byte, op byte, arg int) []byte { // 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) { +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 @@ -414,14 +447,33 @@ func (enc *encoder) concreteMethod(meth *types.Func) (Path, bool) { 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 + + if !enc.skipMethodSorting { + for i, m := range enc.namedMethods(named) { + if m == meth { + path = appendOpArg(path, opMethod, i) + return Path(path), true + } + } + } else { + // This branch must match the logic of the branch above, using go/types + // APIs without sorting. + for i := 0; i < named.NumMethods(); i++ { + m := named.Method(i) + if m == meth { + path = appendOpArg(path, opMethod, i) + return Path(path), true + } } } - panic(fmt.Sprintf("couldn't find method %s on type %s", meth, named)) + // 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. @@ -524,11 +576,16 @@ func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte // 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 object(pkg, string(p), false) +} + +// Note: the skipMethodSorting parameter must match the value of +// Encoder.skipMethodSorting used during encoding. +func object(pkg *types.Package, pathstr string, skipMethodSorting bool) (types.Object, error) { + if pathstr == "" { return nil, fmt.Errorf("empty path") } - pathstr := string(p) var pkgobj, suffix string if dot := strings.IndexByte(pathstr, opType); dot < 0 { pkgobj = pathstr @@ -687,11 +744,15 @@ func Object(pkg *types.Package, p Path) (types.Object, error) { 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)) + if index >= t.NumMethods() { + return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods()) + } + if skipMethodSorting { + obj = t.Method(index) + } else { + methods := namedMethods(t) // (unmemoized) + obj = methods[index] // Id-ordered } - obj = methods[index] // Id-ordered default: return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t) @@ -730,23 +791,8 @@ func namedMethods(named *types.Named) []*types.Func { 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 -} - // namedMethods is a memoization of the namedMethods function. Callers must not modify the result. -func (enc *encoder) namedMethods(named *types.Named) []*types.Func { +func (enc *Encoder) namedMethods(named *types.Named) []*types.Func { m := enc.namedMethodsMemo if m == nil { m = make(map[*types.Named][]*types.Func) @@ -758,5 +804,24 @@ func (enc *encoder) namedMethods(named *types.Named) []*types.Func { m[named] = methods } return methods +} +// scopeObjects is a memoization of scope objects. +// Callers must not modify the result. +func (enc *Encoder) scopeObjects(scope *types.Scope) []types.Object { + m := enc.scopeMemo + if m == nil { + m = make(map[*types.Scope][]types.Object) + enc.scopeMemo = m + } + objs, ok := m[scope] + if !ok { + names := scope.Names() // allocates and sorts + objs = make([]types.Object, len(names)) + for i, name := range names { + objs[i] = scope.Lookup(name) + } + m[scope] = objs + } + return objs } diff --git a/tools/vendor/golang.org/x/tools/imports/forward.go b/tools/vendor/golang.org/x/tools/imports/forward.go index d2547c743..cb6db8893 100644 --- a/tools/vendor/golang.org/x/tools/imports/forward.go +++ b/tools/vendor/golang.org/x/tools/imports/forward.go @@ -7,8 +7,8 @@ package imports // import "golang.org/x/tools/imports" import ( - "io/ioutil" "log" + "os" "golang.org/x/tools/internal/gocommand" intimp "golang.org/x/tools/internal/imports" @@ -44,7 +44,7 @@ var LocalPrefix string func Process(filename string, src []byte, opt *Options) ([]byte, error) { var err error if src == nil { - src, err = ioutil.ReadFile(filename) + src, err = os.ReadFile(filename) if err != nil { return nil, err } diff --git a/tools/vendor/golang.org/x/tools/internal/event/tag/tag.go b/tools/vendor/golang.org/x/tools/internal/event/tag/tag.go new file mode 100644 index 000000000..581b26c20 --- /dev/null +++ b/tools/vendor/golang.org/x/tools/internal/event/tag/tag.go @@ -0,0 +1,59 @@ +// 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. + +// Package tag provides the labels used for telemetry throughout gopls. +package tag + +import ( + "golang.org/x/tools/internal/event/keys" +) + +var ( + // create the label keys we use + Method = keys.NewString("method", "") + StatusCode = keys.NewString("status.code", "") + StatusMessage = keys.NewString("status.message", "") + RPCID = keys.NewString("id", "") + RPCDirection = keys.NewString("direction", "") + File = keys.NewString("file", "") + Directory = keys.New("directory", "") + URI = keys.New("URI", "") + Package = keys.NewString("package", "") // sorted comma-separated list of Package IDs + PackagePath = keys.NewString("package_path", "") + Query = keys.New("query", "") + Snapshot = keys.NewUInt64("snapshot", "") + Operation = keys.NewString("operation", "") + + Position = keys.New("position", "") + Category = keys.NewString("category", "") + PackageCount = keys.NewInt("packages", "") + Files = keys.New("files", "") + Port = keys.NewInt("port", "") + Type = keys.New("type", "") + HoverKind = keys.NewString("hoverkind", "") + + NewServer = keys.NewString("new_server", "A new server was added") + EndServer = keys.NewString("end_server", "A server was shut down") + + ServerID = keys.NewString("server", "The server ID an event is related to") + Logfile = keys.NewString("logfile", "") + DebugAddress = keys.NewString("debug_address", "") + GoplsPath = keys.NewString("gopls_path", "") + ClientID = keys.NewString("client_id", "") + + Level = keys.NewInt("level", "The logging level") +) + +var ( + // create the stats we measure + Started = keys.NewInt64("started", "Count of started RPCs.") + ReceivedBytes = keys.NewInt64("received_bytes", "Bytes received.") //, unit.Bytes) + SentBytes = keys.NewInt64("sent_bytes", "Bytes sent.") //, unit.Bytes) + Latency = keys.NewFloat64("latency_ms", "Elapsed time in milliseconds") //, unit.Milliseconds) +) + +const ( + Inbound = "in" + Outbound = "out" +) diff --git a/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go index 798fe599b..c40c7e931 100644 --- a/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go +++ b/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package fastwalk provides a faster version of filepath.Walk for file system +// Package fastwalk provides a faster version of [filepath.Walk] for file system // scanning tools. package fastwalk @@ -23,31 +23,31 @@ var ErrTraverseLink = errors.New("fastwalk: traverse symlink, assuming target is // Child directories will still be traversed. var ErrSkipFiles = errors.New("fastwalk: skip remaining files in directory") -// Walk is a faster implementation of filepath.Walk. +// Walk is a faster implementation of [filepath.Walk]. // -// filepath.Walk's design necessarily calls os.Lstat on each file, +// [filepath.Walk]'s design necessarily calls [os.Lstat] on each file, // even if the caller needs less info. // Many tools need only the type of each file. // On some platforms, this information is provided directly by the readdir // system call, avoiding the need to stat each file individually. // fastwalk_unix.go contains a fork of the syscall routines. // -// See golang.org/issue/16399 +// See golang.org/issue/16399. // // Walk walks the file tree rooted at root, calling walkFn for // each file or directory in the tree, including root. // -// If fastWalk returns filepath.SkipDir, the directory is skipped. +// If Walk returns [filepath.SkipDir], the directory is skipped. // -// Unlike filepath.Walk: +// Unlike [filepath.Walk]: // - file stat calls must be done by the user. // The only provided metadata is the file type, which does not include // any permission bits. // - multiple goroutines stat the filesystem concurrently. The provided // walkFn must be safe for concurrent use. -// - fastWalk can follow symlinks if walkFn returns the TraverseLink +// - Walk can follow symlinks if walkFn returns the TraverseLink // sentinel error. It is the walkFn's responsibility to prevent -// fastWalk from going into symlink cycles. +// Walk from going into symlink cycles. func Walk(root string, walkFn func(path string, typ os.FileMode) error) error { // TODO(bradfitz): make numWorkers configurable? We used a // minimum of 4 to give the kernel more info about multiple diff --git a/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go b/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go index 085d31160..27e860243 100644 --- a/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go +++ b/tools/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go @@ -8,7 +8,6 @@ package fastwalk import ( - "io/ioutil" "os" ) @@ -17,16 +16,20 @@ import ( // If fn returns a non-nil error, readDir returns with that error // immediately. func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fis, err := ioutil.ReadDir(dirName) + fis, err := os.ReadDir(dirName) if err != nil { return err } skipFiles := false for _, fi := range fis { - if fi.Mode().IsRegular() && skipFiles { + info, err := fi.Info() + if err != nil { + return err + } + if info.Mode().IsRegular() && skipFiles { continue } - if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { + if err := fn(dirName, fi.Name(), info.Mode()&os.ModeType); err != nil { if err == ErrSkipFiles { skipFiles = true continue diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/bexport.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/bexport.go deleted file mode 100644 index 30582ed6d..000000000 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/bexport.go +++ /dev/null @@ -1,852 +0,0 @@ -// 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. - -// Binary package export. -// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go; -// see that file for specification of the format. - -package gcimporter - -import ( - "bytes" - "encoding/binary" - "fmt" - "go/constant" - "go/token" - "go/types" - "math" - "math/big" - "sort" - "strings" -) - -// If debugFormat is set, each integer and string value is preceded by a marker -// and position information in the encoding. This mechanism permits an importer -// to recognize immediately when it is out of sync. The importer recognizes this -// mode automatically (i.e., it can import export data produced with debugging -// support even if debugFormat is not set at the time of import). This mode will -// lead to massively larger export data (by a factor of 2 to 3) and should only -// be enabled during development and debugging. -// -// NOTE: This flag is the first flag to enable if importing dies because of -// (suspected) format errors, and whenever a change is made to the format. -const debugFormat = false // default: false - -// Current export format version. Increase with each format change. -// -// Note: The latest binary (non-indexed) export format is at version 6. -// This exporter is still at level 4, but it doesn't matter since -// the binary importer can handle older versions just fine. -// -// 6: package height (CL 105038) -- NOT IMPLEMENTED HERE -// 5: improved position encoding efficiency (issue 20080, CL 41619) -- NOT IMPLEMENTED HERE -// 4: type name objects support type aliases, uses aliasTag -// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used) -// 2: removed unused bool in ODCL export (compiler only) -// 1: header format change (more regular), export package for _ struct fields -// 0: Go1.7 encoding -const exportVersion = 4 - -// trackAllTypes enables cycle tracking for all types, not just named -// types. The existing compiler invariants assume that unnamed types -// that are not completely set up are not used, or else there are spurious -// errors. -// If disabled, only named types are tracked, possibly leading to slightly -// less efficient encoding in rare cases. It also prevents the export of -// some corner-case type declarations (but those are not handled correctly -// with with the textual export format either). -// TODO(gri) enable and remove once issues caused by it are fixed -const trackAllTypes = false - -type exporter struct { - fset *token.FileSet - out bytes.Buffer - - // object -> index maps, indexed in order of serialization - strIndex map[string]int - pkgIndex map[*types.Package]int - typIndex map[types.Type]int - - // position encoding - posInfoFormat bool - prevFile string - prevLine int - - // debugging support - written int // bytes written - indent int // for trace -} - -// internalError represents an error generated inside this package. -type internalError string - -func (e internalError) Error() string { return "gcimporter: " + string(e) } - -func internalErrorf(format string, args ...interface{}) error { - return internalError(fmt.Sprintf(format, args...)) -} - -// BExportData returns binary export data for pkg. -// If no file set is provided, position info will be missing. -func BExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) { - if !debug { - defer func() { - if e := recover(); e != nil { - if ierr, ok := e.(internalError); ok { - err = ierr - return - } - // Not an internal error; panic again. - panic(e) - } - }() - } - - p := exporter{ - fset: fset, - strIndex: map[string]int{"": 0}, // empty string is mapped to 0 - pkgIndex: make(map[*types.Package]int), - typIndex: make(map[types.Type]int), - posInfoFormat: true, // TODO(gri) might become a flag, eventually - } - - // write version info - // The version string must start with "version %d" where %d is the version - // number. Additional debugging information may follow after a blank; that - // text is ignored by the importer. - p.rawStringln(fmt.Sprintf("version %d", exportVersion)) - var debug string - if debugFormat { - debug = "debug" - } - p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly - p.bool(trackAllTypes) - p.bool(p.posInfoFormat) - - // --- generic export data --- - - // populate type map with predeclared "known" types - for index, typ := range predeclared() { - p.typIndex[typ] = index - } - if len(p.typIndex) != len(predeclared()) { - return nil, internalError("duplicate entries in type map?") - } - - // write package data - p.pkg(pkg, true) - if trace { - p.tracef("\n") - } - - // write objects - objcount := 0 - scope := pkg.Scope() - for _, name := range scope.Names() { - if !token.IsExported(name) { - continue - } - if trace { - p.tracef("\n") - } - p.obj(scope.Lookup(name)) - objcount++ - } - - // indicate end of list - if trace { - p.tracef("\n") - } - p.tag(endTag) - - // for self-verification only (redundant) - p.int(objcount) - - if trace { - p.tracef("\n") - } - - // --- end of export data --- - - return p.out.Bytes(), nil -} - -func (p *exporter) pkg(pkg *types.Package, emptypath bool) { - if pkg == nil { - panic(internalError("unexpected nil pkg")) - } - - // if we saw the package before, write its index (>= 0) - if i, ok := p.pkgIndex[pkg]; ok { - p.index('P', i) - return - } - - // otherwise, remember the package, write the package tag (< 0) and package data - if trace { - p.tracef("P%d = { ", len(p.pkgIndex)) - defer p.tracef("} ") - } - p.pkgIndex[pkg] = len(p.pkgIndex) - - p.tag(packageTag) - p.string(pkg.Name()) - if emptypath { - p.string("") - } else { - p.string(pkg.Path()) - } -} - -func (p *exporter) obj(obj types.Object) { - switch obj := obj.(type) { - case *types.Const: - p.tag(constTag) - p.pos(obj) - p.qualifiedName(obj) - p.typ(obj.Type()) - p.value(obj.Val()) - - case *types.TypeName: - if obj.IsAlias() { - p.tag(aliasTag) - p.pos(obj) - p.qualifiedName(obj) - } else { - p.tag(typeTag) - } - p.typ(obj.Type()) - - case *types.Var: - p.tag(varTag) - p.pos(obj) - p.qualifiedName(obj) - p.typ(obj.Type()) - - case *types.Func: - p.tag(funcTag) - p.pos(obj) - p.qualifiedName(obj) - sig := obj.Type().(*types.Signature) - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) - - default: - panic(internalErrorf("unexpected object %v (%T)", obj, obj)) - } -} - -func (p *exporter) pos(obj types.Object) { - if !p.posInfoFormat { - return - } - - file, line := p.fileLine(obj) - if file == p.prevFile { - // common case: write line delta - // delta == 0 means different file or no line change - delta := line - p.prevLine - p.int(delta) - if delta == 0 { - p.int(-1) // -1 means no file change - } - } else { - // different file - p.int(0) - // Encode filename as length of common prefix with previous - // filename, followed by (possibly empty) suffix. Filenames - // frequently share path prefixes, so this can save a lot - // of space and make export data size less dependent on file - // path length. The suffix is unlikely to be empty because - // file names tend to end in ".go". - n := commonPrefixLen(p.prevFile, file) - p.int(n) // n >= 0 - p.string(file[n:]) // write suffix only - p.prevFile = file - p.int(line) - } - p.prevLine = line -} - -func (p *exporter) fileLine(obj types.Object) (file string, line int) { - if p.fset != nil { - pos := p.fset.Position(obj.Pos()) - file = pos.Filename - line = pos.Line - } - return -} - -func commonPrefixLen(a, b string) int { - if len(a) > len(b) { - a, b = b, a - } - // len(a) <= len(b) - i := 0 - for i < len(a) && a[i] == b[i] { - i++ - } - return i -} - -func (p *exporter) qualifiedName(obj types.Object) { - p.string(obj.Name()) - p.pkg(obj.Pkg(), false) -} - -func (p *exporter) typ(t types.Type) { - if t == nil { - panic(internalError("nil type")) - } - - // Possible optimization: Anonymous pointer types *T where - // T is a named type are common. We could canonicalize all - // such types *T to a single type PT = *T. This would lead - // to at most one *T entry in typIndex, and all future *T's - // would be encoded as the respective index directly. Would - // save 1 byte (pointerTag) per *T and reduce the typIndex - // size (at the cost of a canonicalization map). We can do - // this later, without encoding format change. - - // if we saw the type before, write its index (>= 0) - if i, ok := p.typIndex[t]; ok { - p.index('T', i) - return - } - - // otherwise, remember the type, write the type tag (< 0) and type data - if trackAllTypes { - if trace { - p.tracef("T%d = {>\n", len(p.typIndex)) - defer p.tracef("<\n} ") - } - p.typIndex[t] = len(p.typIndex) - } - - switch t := t.(type) { - case *types.Named: - if !trackAllTypes { - // if we don't track all types, track named types now - p.typIndex[t] = len(p.typIndex) - } - - p.tag(namedTag) - p.pos(t.Obj()) - p.qualifiedName(t.Obj()) - p.typ(t.Underlying()) - if !types.IsInterface(t) { - p.assocMethods(t) - } - - case *types.Array: - p.tag(arrayTag) - p.int64(t.Len()) - p.typ(t.Elem()) - - case *types.Slice: - p.tag(sliceTag) - p.typ(t.Elem()) - - case *dddSlice: - p.tag(dddTag) - p.typ(t.elem) - - case *types.Struct: - p.tag(structTag) - p.fieldList(t) - - case *types.Pointer: - p.tag(pointerTag) - p.typ(t.Elem()) - - case *types.Signature: - p.tag(signatureTag) - p.paramList(t.Params(), t.Variadic()) - p.paramList(t.Results(), false) - - case *types.Interface: - p.tag(interfaceTag) - p.iface(t) - - case *types.Map: - p.tag(mapTag) - p.typ(t.Key()) - p.typ(t.Elem()) - - case *types.Chan: - p.tag(chanTag) - p.int(int(3 - t.Dir())) // hack - p.typ(t.Elem()) - - default: - panic(internalErrorf("unexpected type %T: %s", t, t)) - } -} - -func (p *exporter) assocMethods(named *types.Named) { - // Sort methods (for determinism). - var methods []*types.Func - for i := 0; i < named.NumMethods(); i++ { - methods = append(methods, named.Method(i)) - } - sort.Sort(methodsByName(methods)) - - p.int(len(methods)) - - if trace && methods != nil { - p.tracef("associated methods {>\n") - } - - for i, m := range methods { - if trace && i > 0 { - p.tracef("\n") - } - - p.pos(m) - name := m.Name() - p.string(name) - if !exported(name) { - p.pkg(m.Pkg(), false) - } - - sig := m.Type().(*types.Signature) - p.paramList(types.NewTuple(sig.Recv()), false) - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) - p.int(0) // dummy value for go:nointerface pragma - ignored by importer - } - - if trace && methods != nil { - p.tracef("<\n} ") - } -} - -type methodsByName []*types.Func - -func (x methodsByName) Len() int { return len(x) } -func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() } - -func (p *exporter) fieldList(t *types.Struct) { - if trace && t.NumFields() > 0 { - p.tracef("fields {>\n") - defer p.tracef("<\n} ") - } - - p.int(t.NumFields()) - for i := 0; i < t.NumFields(); i++ { - if trace && i > 0 { - p.tracef("\n") - } - p.field(t.Field(i)) - p.string(t.Tag(i)) - } -} - -func (p *exporter) field(f *types.Var) { - if !f.IsField() { - panic(internalError("field expected")) - } - - p.pos(f) - p.fieldName(f) - p.typ(f.Type()) -} - -func (p *exporter) iface(t *types.Interface) { - // TODO(gri): enable importer to load embedded interfaces, - // then emit Embeddeds and ExplicitMethods separately here. - p.int(0) - - n := t.NumMethods() - if trace && n > 0 { - p.tracef("methods {>\n") - defer p.tracef("<\n} ") - } - p.int(n) - for i := 0; i < n; i++ { - if trace && i > 0 { - p.tracef("\n") - } - p.method(t.Method(i)) - } -} - -func (p *exporter) method(m *types.Func) { - sig := m.Type().(*types.Signature) - if sig.Recv() == nil { - panic(internalError("method expected")) - } - - p.pos(m) - p.string(m.Name()) - if m.Name() != "_" && !token.IsExported(m.Name()) { - p.pkg(m.Pkg(), false) - } - - // interface method; no need to encode receiver. - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) -} - -func (p *exporter) fieldName(f *types.Var) { - name := f.Name() - - if f.Anonymous() { - // anonymous field - we distinguish between 3 cases: - // 1) field name matches base type name and is exported - // 2) field name matches base type name and is not exported - // 3) field name doesn't match base type name (alias name) - bname := basetypeName(f.Type()) - if name == bname { - if token.IsExported(name) { - name = "" // 1) we don't need to know the field name or package - } else { - name = "?" // 2) use unexported name "?" to force package export - } - } else { - // 3) indicate alias and export name as is - // (this requires an extra "@" but this is a rare case) - p.string("@") - } - } - - p.string(name) - if name != "" && !token.IsExported(name) { - p.pkg(f.Pkg(), false) - } -} - -func basetypeName(typ types.Type) string { - switch typ := deref(typ).(type) { - case *types.Basic: - return typ.Name() - case *types.Named: - return typ.Obj().Name() - default: - return "" // unnamed type - } -} - -func (p *exporter) paramList(params *types.Tuple, variadic bool) { - // use negative length to indicate unnamed parameters - // (look at the first parameter only since either all - // names are present or all are absent) - n := params.Len() - if n > 0 && params.At(0).Name() == "" { - n = -n - } - p.int(n) - for i := 0; i < params.Len(); i++ { - q := params.At(i) - t := q.Type() - if variadic && i == params.Len()-1 { - t = &dddSlice{t.(*types.Slice).Elem()} - } - p.typ(t) - if n > 0 { - name := q.Name() - p.string(name) - if name != "_" { - p.pkg(q.Pkg(), false) - } - } - p.string("") // no compiler-specific info - } -} - -func (p *exporter) value(x constant.Value) { - if trace { - p.tracef("= ") - } - - switch x.Kind() { - case constant.Bool: - tag := falseTag - if constant.BoolVal(x) { - tag = trueTag - } - p.tag(tag) - - case constant.Int: - if v, exact := constant.Int64Val(x); exact { - // common case: x fits into an int64 - use compact encoding - p.tag(int64Tag) - p.int64(v) - return - } - // uncommon case: large x - use float encoding - // (powers of 2 will be encoded efficiently with exponent) - p.tag(floatTag) - p.float(constant.ToFloat(x)) - - case constant.Float: - p.tag(floatTag) - p.float(x) - - case constant.Complex: - p.tag(complexTag) - p.float(constant.Real(x)) - p.float(constant.Imag(x)) - - case constant.String: - p.tag(stringTag) - p.string(constant.StringVal(x)) - - case constant.Unknown: - // package contains type errors - p.tag(unknownTag) - - default: - panic(internalErrorf("unexpected value %v (%T)", x, x)) - } -} - -func (p *exporter) float(x constant.Value) { - if x.Kind() != constant.Float { - panic(internalErrorf("unexpected constant %v, want float", x)) - } - // extract sign (there is no -0) - sign := constant.Sign(x) - if sign == 0 { - // x == 0 - p.int(0) - return - } - // x != 0 - - var f big.Float - if v, exact := constant.Float64Val(x); exact { - // float64 - f.SetFloat64(v) - } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int { - // TODO(gri): add big.Rat accessor to constant.Value. - r := valueToRat(num) - f.SetRat(r.Quo(r, valueToRat(denom))) - } else { - // Value too large to represent as a fraction => inaccessible. - // TODO(gri): add big.Float accessor to constant.Value. - f.SetFloat64(math.MaxFloat64) // FIXME - } - - // extract exponent such that 0.5 <= m < 1.0 - var m big.Float - exp := f.MantExp(&m) - - // extract mantissa as *big.Int - // - set exponent large enough so mant satisfies mant.IsInt() - // - get *big.Int from mant - m.SetMantExp(&m, int(m.MinPrec())) - mant, acc := m.Int(nil) - if acc != big.Exact { - panic(internalError("internal error")) - } - - p.int(sign) - p.int(exp) - p.string(string(mant.Bytes())) -} - -func valueToRat(x constant.Value) *big.Rat { - // Convert little-endian to big-endian. - // I can't believe this is necessary. - bytes := constant.Bytes(x) - for i := 0; i < len(bytes)/2; i++ { - bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] - } - return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) -} - -func (p *exporter) bool(b bool) bool { - if trace { - p.tracef("[") - defer p.tracef("= %v] ", b) - } - - x := 0 - if b { - x = 1 - } - p.int(x) - return b -} - -// ---------------------------------------------------------------------------- -// Low-level encoders - -func (p *exporter) index(marker byte, index int) { - if index < 0 { - panic(internalError("invalid index < 0")) - } - if debugFormat { - p.marker('t') - } - if trace { - p.tracef("%c%d ", marker, index) - } - p.rawInt64(int64(index)) -} - -func (p *exporter) tag(tag int) { - if tag >= 0 { - panic(internalError("invalid tag >= 0")) - } - if debugFormat { - p.marker('t') - } - if trace { - p.tracef("%s ", tagString[-tag]) - } - p.rawInt64(int64(tag)) -} - -func (p *exporter) int(x int) { - p.int64(int64(x)) -} - -func (p *exporter) int64(x int64) { - if debugFormat { - p.marker('i') - } - if trace { - p.tracef("%d ", x) - } - p.rawInt64(x) -} - -func (p *exporter) string(s string) { - if debugFormat { - p.marker('s') - } - if trace { - p.tracef("%q ", s) - } - // if we saw the string before, write its index (>= 0) - // (the empty string is mapped to 0) - if i, ok := p.strIndex[s]; ok { - p.rawInt64(int64(i)) - return - } - // otherwise, remember string and write its negative length and bytes - p.strIndex[s] = len(p.strIndex) - p.rawInt64(-int64(len(s))) - for i := 0; i < len(s); i++ { - p.rawByte(s[i]) - } -} - -// marker emits a marker byte and position information which makes -// it easy for a reader to detect if it is "out of sync". Used for -// debugFormat format only. -func (p *exporter) marker(m byte) { - p.rawByte(m) - // Enable this for help tracking down the location - // of an incorrect marker when running in debugFormat. - if false && trace { - p.tracef("#%d ", p.written) - } - p.rawInt64(int64(p.written)) -} - -// rawInt64 should only be used by low-level encoders. -func (p *exporter) rawInt64(x int64) { - var tmp [binary.MaxVarintLen64]byte - n := binary.PutVarint(tmp[:], x) - for i := 0; i < n; i++ { - p.rawByte(tmp[i]) - } -} - -// rawStringln should only be used to emit the initial version string. -func (p *exporter) rawStringln(s string) { - for i := 0; i < len(s); i++ { - p.rawByte(s[i]) - } - p.rawByte('\n') -} - -// rawByte is the bottleneck interface to write to p.out. -// rawByte escapes b as follows (any encoding does that -// hides '$'): -// -// '$' => '|' 'S' -// '|' => '|' '|' -// -// Necessary so other tools can find the end of the -// export data by searching for "$$". -// rawByte should only be used by low-level encoders. -func (p *exporter) rawByte(b byte) { - switch b { - case '$': - // write '$' as '|' 'S' - b = 'S' - fallthrough - case '|': - // write '|' as '|' '|' - p.out.WriteByte('|') - p.written++ - } - p.out.WriteByte(b) - p.written++ -} - -// tracef is like fmt.Printf but it rewrites the format string -// to take care of indentation. -func (p *exporter) tracef(format string, args ...interface{}) { - if strings.ContainsAny(format, "<>\n") { - var buf bytes.Buffer - for i := 0; i < len(format); i++ { - // no need to deal with runes - ch := format[i] - switch ch { - case '>': - p.indent++ - continue - case '<': - p.indent-- - continue - } - buf.WriteByte(ch) - if ch == '\n' { - for j := p.indent; j > 0; j-- { - buf.WriteString(". ") - } - } - } - format = buf.String() - } - fmt.Printf(format, args...) -} - -// Debugging support. -// (tagString is only used when tracing is enabled) -var tagString = [...]string{ - // Packages - -packageTag: "package", - - // Types - -namedTag: "named type", - -arrayTag: "array", - -sliceTag: "slice", - -dddTag: "ddd", - -structTag: "struct", - -pointerTag: "pointer", - -signatureTag: "signature", - -interfaceTag: "interface", - -mapTag: "map", - -chanTag: "chan", - - // Values - -falseTag: "false", - -trueTag: "true", - -int64Tag: "int64", - -floatTag: "float", - -fractionTag: "fraction", - -complexTag: "complex", - -stringTag: "string", - -unknownTag: "unknown", - - // Type aliases - -aliasTag: "alias", -} diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/bimport.go index b85de0147..d98b0db2a 100644 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/bimport.go +++ b/tools/vendor/golang.org/x/tools/internal/gcimporter/bimport.go @@ -2,340 +2,24 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go. +// This file contains the remaining vestiges of +// $GOROOT/src/go/internal/gcimporter/bimport.go. package gcimporter import ( - "encoding/binary" "fmt" - "go/constant" "go/token" "go/types" - "sort" - "strconv" - "strings" "sync" - "unicode" - "unicode/utf8" ) -type importer struct { - imports map[string]*types.Package - data []byte - importpath string - buf []byte // for reading strings - version int // export format version - - // object lists - strList []string // in order of appearance - pathList []string // in order of appearance - pkgList []*types.Package // in order of appearance - typList []types.Type // in order of appearance - interfaceList []*types.Interface // for delayed completion only - trackAllTypes bool - - // position encoding - posInfoFormat bool - prevFile string - prevLine int - fake fakeFileSet - - // debugging support - debugFormat bool - read int // bytes read -} - -// BImportData imports a package from the serialized package data -// and returns the number of bytes consumed and a reference to the package. -// If the export data version is not recognized or the format is otherwise -// compromised, an error is returned. -func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { - // catch panics and return them as errors - const currentVersion = 6 - version := -1 // unknown version - defer func() { - if e := recover(); e != nil { - // Return a (possibly nil or incomplete) package unchanged (see #16088). - if version > currentVersion { - err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) - } else { - err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) - } - } - }() - - p := importer{ - imports: imports, - data: data, - importpath: path, - version: version, - strList: []string{""}, // empty string is mapped to 0 - pathList: []string{""}, // empty string is mapped to 0 - fake: fakeFileSet{ - fset: fset, - files: make(map[string]*fileInfo), - }, - } - defer p.fake.setLines() // set lines for files in fset - - // read version info - var versionstr string - if b := p.rawByte(); b == 'c' || b == 'd' { - // Go1.7 encoding; first byte encodes low-level - // encoding format (compact vs debug). - // For backward-compatibility only (avoid problems with - // old installed packages). Newly compiled packages use - // the extensible format string. - // TODO(gri) Remove this support eventually; after Go1.8. - if b == 'd' { - p.debugFormat = true - } - p.trackAllTypes = p.rawByte() == 'a' - p.posInfoFormat = p.int() != 0 - versionstr = p.string() - if versionstr == "v1" { - version = 0 - } - } else { - // Go1.8 extensible encoding - // read version string and extract version number (ignore anything after the version number) - versionstr = p.rawStringln(b) - if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" { - if v, err := strconv.Atoi(s[1]); err == nil && v > 0 { - version = v - } - } - } - p.version = version - - // read version specific flags - extend as necessary - switch p.version { - // case currentVersion: - // ... - // fallthrough - case currentVersion, 5, 4, 3, 2, 1: - p.debugFormat = p.rawStringln(p.rawByte()) == "debug" - p.trackAllTypes = p.int() != 0 - p.posInfoFormat = p.int() != 0 - case 0: - // Go1.7 encoding format - nothing to do here - default: - errorf("unknown bexport format version %d (%q)", p.version, versionstr) - } - - // --- generic export data --- - - // populate typList with predeclared "known" types - p.typList = append(p.typList, predeclared()...) - - // read package data - pkg = p.pkg() - - // read objects of phase 1 only (see cmd/compile/internal/gc/bexport.go) - objcount := 0 - for { - tag := p.tagOrIndex() - if tag == endTag { - break - } - p.obj(tag) - objcount++ - } - - // self-verification - if count := p.int(); count != objcount { - errorf("got %d objects; want %d", objcount, count) - } - - // ignore compiler-specific import data - - // complete interfaces - // TODO(gri) re-investigate if we still need to do this in a delayed fashion - for _, typ := range p.interfaceList { - typ.Complete() - } - - // record all referenced packages as imports - list := append(([]*types.Package)(nil), p.pkgList[1:]...) - sort.Sort(byPath(list)) - pkg.SetImports(list) - - // package was imported completely and without errors - pkg.MarkComplete() - - return p.read, pkg, nil -} - func errorf(format string, args ...interface{}) { panic(fmt.Sprintf(format, args...)) } -func (p *importer) pkg() *types.Package { - // if the package was seen before, i is its index (>= 0) - i := p.tagOrIndex() - if i >= 0 { - return p.pkgList[i] - } - - // otherwise, i is the package tag (< 0) - if i != packageTag { - errorf("unexpected package tag %d version %d", i, p.version) - } - - // read package data - name := p.string() - var path string - if p.version >= 5 { - path = p.path() - } else { - path = p.string() - } - if p.version >= 6 { - p.int() // package height; unused by go/types - } - - // we should never see an empty package name - if name == "" { - errorf("empty package name in import") - } - - // an empty path denotes the package we are currently importing; - // it must be the first package we see - if (path == "") != (len(p.pkgList) == 0) { - errorf("package path %q for pkg index %d", path, len(p.pkgList)) - } - - // if the package was imported before, use that one; otherwise create a new one - if path == "" { - path = p.importpath - } - pkg := p.imports[path] - if pkg == nil { - pkg = types.NewPackage(path, name) - p.imports[path] = pkg - } else if pkg.Name() != name { - errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path) - } - p.pkgList = append(p.pkgList, pkg) - - return pkg -} - -// objTag returns the tag value for each object kind. -func objTag(obj types.Object) int { - switch obj.(type) { - case *types.Const: - return constTag - case *types.TypeName: - return typeTag - case *types.Var: - return varTag - case *types.Func: - return funcTag - default: - errorf("unexpected object: %v (%T)", obj, obj) // panics - panic("unreachable") - } -} - -func sameObj(a, b types.Object) bool { - // Because unnamed types are not canonicalized, we cannot simply compare types for - // (pointer) identity. - // Ideally we'd check equality of constant values as well, but this is good enough. - return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type()) -} - -func (p *importer) declare(obj types.Object) { - pkg := obj.Pkg() - if alt := pkg.Scope().Insert(obj); alt != nil { - // This can only trigger if we import a (non-type) object a second time. - // Excluding type aliases, this cannot happen because 1) we only import a package - // once; and b) we ignore compiler-specific export data which may contain - // functions whose inlined function bodies refer to other functions that - // were already imported. - // However, type aliases require reexporting the original type, so we need - // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go, - // method importer.obj, switch case importing functions). - // TODO(gri) review/update this comment once the gc compiler handles type aliases. - if !sameObj(obj, alt) { - errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt) - } - } -} - -func (p *importer) obj(tag int) { - switch tag { - case constTag: - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - val := p.value() - p.declare(types.NewConst(pos, pkg, name, typ, val)) - - case aliasTag: - // TODO(gri) verify type alias hookup is correct - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - p.declare(types.NewTypeName(pos, pkg, name, typ)) - - case typeTag: - p.typ(nil, nil) - - case varTag: - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - p.declare(types.NewVar(pos, pkg, name, typ)) - - case funcTag: - pos := p.pos() - pkg, name := p.qualifiedName() - params, isddd := p.paramList() - result, _ := p.paramList() - sig := types.NewSignature(nil, params, result, isddd) - p.declare(types.NewFunc(pos, pkg, name, sig)) - - default: - errorf("unexpected object tag %d", tag) - } -} - const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go -func (p *importer) pos() token.Pos { - if !p.posInfoFormat { - return token.NoPos - } - - file := p.prevFile - line := p.prevLine - delta := p.int() - line += delta - if p.version >= 5 { - if delta == deltaNewFile { - if n := p.int(); n >= 0 { - // file changed - file = p.path() - line = n - } - } - } else { - if delta == 0 { - if n := p.int(); n >= 0 { - // file changed - file = p.prevFile[:n] + p.string() - line = p.int() - } - } - } - p.prevFile = file - p.prevLine = line - - return p.fake.pos(file, line, 0) -} - // Synthesize a token.Pos type fakeFileSet struct { fset *token.FileSet @@ -389,205 +73,6 @@ var ( fakeLinesOnce sync.Once ) -func (p *importer) qualifiedName() (pkg *types.Package, name string) { - name = p.string() - pkg = p.pkg() - return -} - -func (p *importer) record(t types.Type) { - p.typList = append(p.typList, t) -} - -// A dddSlice is a types.Type representing ...T parameters. -// It only appears for parameter types and does not escape -// the importer. -type dddSlice struct { - elem types.Type -} - -func (t *dddSlice) Underlying() types.Type { return t } -func (t *dddSlice) String() string { return "..." + t.elem.String() } - -// parent is the package which declared the type; parent == nil means -// the package currently imported. The parent package is needed for -// exported struct fields and interface methods which don't contain -// explicit package information in the export data. -// -// A non-nil tname is used as the "owner" of the result type; i.e., -// the result type is the underlying type of tname. tname is used -// to give interface methods a named receiver type where possible. -func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type { - // if the type was seen before, i is its index (>= 0) - i := p.tagOrIndex() - if i >= 0 { - return p.typList[i] - } - - // otherwise, i is the type tag (< 0) - switch i { - case namedTag: - // read type object - pos := p.pos() - parent, name := p.qualifiedName() - scope := parent.Scope() - obj := scope.Lookup(name) - - // if the object doesn't exist yet, create and insert it - if obj == nil { - obj = types.NewTypeName(pos, parent, name, nil) - scope.Insert(obj) - } - - if _, ok := obj.(*types.TypeName); !ok { - errorf("pkg = %s, name = %s => %s", parent, name, obj) - } - - // associate new named type with obj if it doesn't exist yet - t0 := types.NewNamed(obj.(*types.TypeName), nil, nil) - - // but record the existing type, if any - tname := obj.Type().(*types.Named) // tname is either t0 or the existing type - p.record(tname) - - // read underlying type - t0.SetUnderlying(p.typ(parent, t0)) - - // interfaces don't have associated methods - if types.IsInterface(t0) { - return tname - } - - // read associated methods - for i := p.int(); i > 0; i-- { - // TODO(gri) replace this with something closer to fieldName - pos := p.pos() - name := p.string() - if !exported(name) { - p.pkg() - } - - recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver? - params, isddd := p.paramList() - result, _ := p.paramList() - p.int() // go:nointerface pragma - discarded - - sig := types.NewSignature(recv.At(0), params, result, isddd) - t0.AddMethod(types.NewFunc(pos, parent, name, sig)) - } - - return tname - - case arrayTag: - t := new(types.Array) - if p.trackAllTypes { - p.record(t) - } - - n := p.int64() - *t = *types.NewArray(p.typ(parent, nil), n) - return t - - case sliceTag: - t := new(types.Slice) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewSlice(p.typ(parent, nil)) - return t - - case dddTag: - t := new(dddSlice) - if p.trackAllTypes { - p.record(t) - } - - t.elem = p.typ(parent, nil) - return t - - case structTag: - t := new(types.Struct) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewStruct(p.fieldList(parent)) - return t - - case pointerTag: - t := new(types.Pointer) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewPointer(p.typ(parent, nil)) - return t - - case signatureTag: - t := new(types.Signature) - if p.trackAllTypes { - p.record(t) - } - - params, isddd := p.paramList() - result, _ := p.paramList() - *t = *types.NewSignature(nil, params, result, isddd) - return t - - case interfaceTag: - // Create a dummy entry in the type list. This is safe because we - // cannot expect the interface type to appear in a cycle, as any - // such cycle must contain a named type which would have been - // first defined earlier. - // TODO(gri) Is this still true now that we have type aliases? - // See issue #23225. - n := len(p.typList) - if p.trackAllTypes { - p.record(nil) - } - - var embeddeds []types.Type - for n := p.int(); n > 0; n-- { - p.pos() - embeddeds = append(embeddeds, p.typ(parent, nil)) - } - - t := newInterface(p.methodList(parent, tname), embeddeds) - p.interfaceList = append(p.interfaceList, t) - if p.trackAllTypes { - p.typList[n] = t - } - return t - - case mapTag: - t := new(types.Map) - if p.trackAllTypes { - p.record(t) - } - - key := p.typ(parent, nil) - val := p.typ(parent, nil) - *t = *types.NewMap(key, val) - return t - - case chanTag: - t := new(types.Chan) - if p.trackAllTypes { - p.record(t) - } - - dir := chanDir(p.int()) - val := p.typ(parent, nil) - *t = *types.NewChan(dir, val) - return t - - default: - errorf("unexpected type tag %d", i) // panics - panic("unreachable") - } -} - func chanDir(d int) types.ChanDir { // tag values must match the constants in cmd/compile/internal/gc/go.go switch d { @@ -603,394 +88,6 @@ func chanDir(d int) types.ChanDir { } } -func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) { - if n := p.int(); n > 0 { - fields = make([]*types.Var, n) - tags = make([]string, n) - for i := range fields { - fields[i], tags[i] = p.field(parent) - } - } - return -} - -func (p *importer) field(parent *types.Package) (*types.Var, string) { - pos := p.pos() - pkg, name, alias := p.fieldName(parent) - typ := p.typ(parent, nil) - tag := p.string() - - anonymous := false - if name == "" { - // anonymous field - typ must be T or *T and T must be a type name - switch typ := deref(typ).(type) { - case *types.Basic: // basic types are named types - pkg = nil // // objects defined in Universe scope have no package - name = typ.Name() - case *types.Named: - name = typ.Obj().Name() - default: - errorf("named base type expected") - } - anonymous = true - } else if alias { - // anonymous field: we have an explicit name because it's an alias - anonymous = true - } - - return types.NewField(pos, pkg, name, typ, anonymous), tag -} - -func (p *importer) methodList(parent *types.Package, baseType *types.Named) (methods []*types.Func) { - if n := p.int(); n > 0 { - methods = make([]*types.Func, n) - for i := range methods { - methods[i] = p.method(parent, baseType) - } - } - return -} - -func (p *importer) method(parent *types.Package, baseType *types.Named) *types.Func { - pos := p.pos() - pkg, name, _ := p.fieldName(parent) - // If we don't have a baseType, use a nil receiver. - // A receiver using the actual interface type (which - // we don't know yet) will be filled in when we call - // types.Interface.Complete. - var recv *types.Var - if baseType != nil { - recv = types.NewVar(token.NoPos, parent, "", baseType) - } - params, isddd := p.paramList() - result, _ := p.paramList() - sig := types.NewSignature(recv, params, result, isddd) - return types.NewFunc(pos, pkg, name, sig) -} - -func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) { - name = p.string() - pkg = parent - if pkg == nil { - // use the imported package instead - pkg = p.pkgList[0] - } - if p.version == 0 && name == "_" { - // version 0 didn't export a package for _ fields - return - } - switch name { - case "": - // 1) field name matches base type name and is exported: nothing to do - case "?": - // 2) field name matches base type name and is not exported: need package - name = "" - pkg = p.pkg() - case "@": - // 3) field name doesn't match type name (alias) - name = p.string() - alias = true - fallthrough - default: - if !exported(name) { - pkg = p.pkg() - } - } - return -} - -func (p *importer) paramList() (*types.Tuple, bool) { - n := p.int() - if n == 0 { - return nil, false - } - // negative length indicates unnamed parameters - named := true - if n < 0 { - n = -n - named = false - } - // n > 0 - params := make([]*types.Var, n) - isddd := false - for i := range params { - params[i], isddd = p.param(named) - } - return types.NewTuple(params...), isddd -} - -func (p *importer) param(named bool) (*types.Var, bool) { - t := p.typ(nil, nil) - td, isddd := t.(*dddSlice) - if isddd { - t = types.NewSlice(td.elem) - } - - var pkg *types.Package - var name string - if named { - name = p.string() - if name == "" { - errorf("expected named parameter") - } - if name != "_" { - pkg = p.pkg() - } - if i := strings.Index(name, "·"); i > 0 { - name = name[:i] // cut off gc-specific parameter numbering - } - } - - // read and discard compiler-specific info - p.string() - - return types.NewVar(token.NoPos, pkg, name, t), isddd -} - -func exported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - -func (p *importer) value() constant.Value { - switch tag := p.tagOrIndex(); tag { - case falseTag: - return constant.MakeBool(false) - case trueTag: - return constant.MakeBool(true) - case int64Tag: - return constant.MakeInt64(p.int64()) - case floatTag: - return p.float() - case complexTag: - re := p.float() - im := p.float() - return constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) - case stringTag: - return constant.MakeString(p.string()) - case unknownTag: - return constant.MakeUnknown() - default: - errorf("unexpected value tag %d", tag) // panics - panic("unreachable") - } -} - -func (p *importer) float() constant.Value { - sign := p.int() - if sign == 0 { - return constant.MakeInt64(0) - } - - exp := p.int() - mant := []byte(p.string()) // big endian - - // remove leading 0's if any - for len(mant) > 0 && mant[0] == 0 { - mant = mant[1:] - } - - // convert to little endian - // TODO(gri) go/constant should have a more direct conversion function - // (e.g., once it supports a big.Float based implementation) - for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 { - mant[i], mant[j] = mant[j], mant[i] - } - - // adjust exponent (constant.MakeFromBytes creates an integer value, - // but mant represents the mantissa bits such that 0.5 <= mant < 1.0) - exp -= len(mant) << 3 - if len(mant) > 0 { - for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 { - exp++ - } - } - - x := constant.MakeFromBytes(mant) - switch { - case exp < 0: - d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) - x = constant.BinaryOp(x, token.QUO, d) - case exp > 0: - x = constant.Shift(x, token.SHL, uint(exp)) - } - - if sign < 0 { - x = constant.UnaryOp(token.SUB, x, 0) - } - return x -} - -// ---------------------------------------------------------------------------- -// Low-level decoders - -func (p *importer) tagOrIndex() int { - if p.debugFormat { - p.marker('t') - } - - return int(p.rawInt64()) -} - -func (p *importer) int() int { - x := p.int64() - if int64(int(x)) != x { - errorf("exported integer too large") - } - return int(x) -} - -func (p *importer) int64() int64 { - if p.debugFormat { - p.marker('i') - } - - return p.rawInt64() -} - -func (p *importer) path() string { - if p.debugFormat { - p.marker('p') - } - // if the path was seen before, i is its index (>= 0) - // (the empty string is at index 0) - i := p.rawInt64() - if i >= 0 { - return p.pathList[i] - } - // otherwise, i is the negative path length (< 0) - a := make([]string, -i) - for n := range a { - a[n] = p.string() - } - s := strings.Join(a, "/") - p.pathList = append(p.pathList, s) - return s -} - -func (p *importer) string() string { - if p.debugFormat { - p.marker('s') - } - // if the string was seen before, i is its index (>= 0) - // (the empty string is at index 0) - i := p.rawInt64() - if i >= 0 { - return p.strList[i] - } - // otherwise, i is the negative string length (< 0) - if n := int(-i); n <= cap(p.buf) { - p.buf = p.buf[:n] - } else { - p.buf = make([]byte, n) - } - for i := range p.buf { - p.buf[i] = p.rawByte() - } - s := string(p.buf) - p.strList = append(p.strList, s) - return s -} - -func (p *importer) marker(want byte) { - if got := p.rawByte(); got != want { - errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read) - } - - pos := p.read - if n := int(p.rawInt64()); n != pos { - errorf("incorrect position: got %d; want %d", n, pos) - } -} - -// rawInt64 should only be used by low-level decoders. -func (p *importer) rawInt64() int64 { - i, err := binary.ReadVarint(p) - if err != nil { - errorf("read error: %v", err) - } - return i -} - -// rawStringln should only be used to read the initial version string. -func (p *importer) rawStringln(b byte) string { - p.buf = p.buf[:0] - for b != '\n' { - p.buf = append(p.buf, b) - b = p.rawByte() - } - return string(p.buf) -} - -// needed for binary.ReadVarint in rawInt64 -func (p *importer) ReadByte() (byte, error) { - return p.rawByte(), nil -} - -// byte is the bottleneck interface for reading p.data. -// It unescapes '|' 'S' to '$' and '|' '|' to '|'. -// rawByte should only be used by low-level decoders. -func (p *importer) rawByte() byte { - b := p.data[0] - r := 1 - if b == '|' { - b = p.data[1] - r = 2 - switch b { - case 'S': - b = '$' - case '|': - // nothing to do - default: - errorf("unexpected escape sequence in export data") - } - } - p.data = p.data[r:] - p.read += r - return b - -} - -// ---------------------------------------------------------------------------- -// Export format - -// Tags. Must be < 0. -const ( - // Objects - packageTag = -(iota + 1) - constTag - typeTag - varTag - funcTag - endTag - - // Types - namedTag - arrayTag - sliceTag - dddTag - structTag - pointerTag - signatureTag - interfaceTag - mapTag - chanTag - - // Values - falseTag - trueTag - int64Tag - floatTag - fractionTag // not used by gc - complexTag - stringTag - nilTag // only used by gc (appears in exported inlined function bodies) - unknownTag // not used by gc (only appears in packages with errors) - - // Type aliases - aliasTag -) - var predeclOnce sync.Once var predecl []types.Type // initialized lazily diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go index a973dece9..2d078ccb1 100644 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go +++ b/tools/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go @@ -29,7 +29,6 @@ import ( "go/token" "go/types" "io" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -221,7 +220,7 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func switch hdr { case "$$B\n": var data []byte - data, err = ioutil.ReadAll(buf) + data, err = io.ReadAll(buf) if err != nil { break } @@ -230,20 +229,17 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func // Or, define a new standard go/types/gcexportdata package. fset := token.NewFileSet() - // The indexed export format starts with an 'i'; the older - // binary export format starts with a 'c', 'd', or 'v' - // (from "version"). Select appropriate importer. + // Select appropriate importer. if len(data) > 0 { switch data[0] { - case 'i': - _, pkg, err := IImportData(fset, packages, data[1:], id) - return pkg, err + case 'v', 'c', 'd': // binary, till go1.10 + return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - case 'v', 'c', 'd': - _, pkg, err := BImportData(fset, packages, data, id) + case 'i': // indexed, till go1.19 + _, pkg, err := IImportData(fset, packages, data[1:], id) return pkg, err - case 'u': + case 'u': // unified, from go1.20 _, pkg, err := UImportData(fset, packages, data[1:size], id) return pkg, err diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index a0dc0b5e2..6103dd710 100644 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/tools/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -22,17 +22,23 @@ import ( "strconv" "strings" + "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/internal/tokeninternal" "golang.org/x/tools/internal/typeparams" ) // IExportShallow encodes "shallow" export data for the specified package. // -// No promises are made about the encoding other than that it can be -// decoded by the same version of IIExportShallow. If you plan to save -// export data in the file system, be sure to include a cryptographic -// digest of the executable in the key to avoid version skew. -func IExportShallow(fset *token.FileSet, pkg *types.Package) ([]byte, error) { +// No promises are made about the encoding other than that it can be decoded by +// the same version of IIExportShallow. If you plan to save export data in the +// file system, be sure to include a cryptographic digest of the executable in +// the key to avoid version skew. +// +// If the provided reportf func is non-nil, it will be used for reporting bugs +// encountered during export. +// TODO(rfindley): remove reportf when we are confident enough in the new +// objectpath encoding. +func IExportShallow(fset *token.FileSet, pkg *types.Package, reportf ReportFunc) ([]byte, error) { // In principle this operation can only fail if out.Write fails, // but that's impossible for bytes.Buffer---and as a matter of // fact iexportCommon doesn't even check for I/O errors. @@ -47,19 +53,27 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package) ([]byte, error) { // 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, getPackage GetPackageFunc, data []byte, path string, insert InsertType) (*types.Package, error) { +// +// The importer calls getPackages to obtain package symbols for all +// packages mentioned in the export data, including the one being +// decoded. +// +// If the provided reportf func is non-nil, it will be used for reporting bugs +// encountered during import. +// TODO(rfindley): remove reportf when we are confident enough in the new +// objectpath encoding. +func IImportShallow(fset *token.FileSet, getPackages GetPackagesFunc, data []byte, path string, reportf ReportFunc) (*types.Package, error) { const bundle = false - pkgs, err := iimportCommon(fset, getPackage, data, bundle, path, insert) + const shallow = true + pkgs, err := iimportCommon(fset, getPackages, data, bundle, path, shallow, reportf) if err != nil { return nil, err } return pkgs[0], nil } -// InsertType is the type of a function that creates a types.TypeName -// object for a named type and inserts it into the scope of the -// specified Package. -type InsertType = func(pkg *types.Package, name string) +// ReportFunc is the type of a function used to report formatted bugs. +type ReportFunc = func(string, ...interface{}) // Current bundled export format version. Increase with each format change. // 0: initial implementation @@ -313,8 +327,9 @@ type iexporter struct { out *bytes.Buffer version int - shallow bool // don't put types from other packages in the index - localpkg *types.Package // (nil in bundle mode) + shallow bool // don't put types from other packages in the index + objEncoder *objectpath.Encoder // encodes objects from other packages in shallow mode; lazily allocated + localpkg *types.Package // (nil in bundle mode) // allPkgs tracks all packages that have been referenced by // the export data, so we can ensure to include them in the @@ -354,6 +369,17 @@ func (p *iexporter) trace(format string, args ...interface{}) { fmt.Printf(strings.Repeat("..", p.indent)+format+"\n", args...) } +// objectpathEncoder returns the lazily allocated objectpath.Encoder to use +// when encoding objects in other packages during shallow export. +// +// Using a shared Encoder amortizes some of cost of objectpath search. +func (p *iexporter) objectpathEncoder() *objectpath.Encoder { + if p.objEncoder == nil { + p.objEncoder = new(objectpath.Encoder) + } + return p.objEncoder +} + // stringOff returns the offset of s within the string section. // If not already present, it's added to the end. func (p *iexporter) stringOff(s string) uint64 { @@ -413,7 +439,6 @@ type exportWriter struct { p *iexporter data intWriter - currPkg *types.Package prevFile string prevLine int64 prevColumn int64 @@ -436,7 +461,6 @@ func (p *iexporter) doDecl(obj types.Object) { }() } w := p.newWriter() - w.setPkg(obj.Pkg(), false) switch obj := obj.(type) { case *types.Var: @@ -673,6 +697,9 @@ func (w *exportWriter) qualifiedType(obj *types.TypeName) { w.pkg(obj.Pkg()) } +// TODO(rfindley): what does 'pkg' even mean here? It would be better to pass +// it in explicitly into signatures and structs that may use it for +// constructing fields. func (w *exportWriter) typ(t types.Type, pkg *types.Package) { w.data.uint64(w.p.typOff(t, pkg)) } @@ -764,30 +791,53 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { case *types.Signature: w.startType(signatureType) - w.setPkg(pkg, true) + w.pkg(pkg) w.signature(t) case *types.Struct: w.startType(structType) n := t.NumFields() + // Even for struct{} we must emit some qualifying package, because that's + // what the compiler does, and thus that's what the importer expects. + fieldPkg := pkg if n > 0 { - w.setPkg(t.Field(0).Pkg(), true) // qualifying package for field objects - } else { - w.setPkg(pkg, true) + fieldPkg = t.Field(0).Pkg() + } + if fieldPkg == nil { + // TODO(rfindley): improve this very hacky logic. + // + // The importer expects a package to be set for all struct types, even + // those with no fields. A better encoding might be to set NumFields + // before pkg. setPkg panics with a nil package, which may be possible + // to reach with invalid packages (and perhaps valid packages, too?), so + // (arbitrarily) set the localpkg if available. + // + // Alternatively, we may be able to simply guarantee that pkg != nil, by + // reconsidering the encoding of constant values. + if w.p.shallow { + fieldPkg = w.p.localpkg + } else { + panic(internalErrorf("no package to set for empty struct")) + } } + w.pkg(fieldPkg) w.uint64(uint64(n)) + for i := 0; i < n; i++ { f := t.Field(i) + if w.p.shallow { + w.objectPath(f) + } w.pos(f.Pos()) w.string(f.Name()) // unexported fields implicitly qualified by prior setPkg - w.typ(f.Type(), pkg) + w.typ(f.Type(), fieldPkg) w.bool(f.Anonymous()) w.string(t.Tag(i)) // note (or tag) } case *types.Interface: w.startType(interfaceType) - w.setPkg(pkg, true) + w.pkg(pkg) n := t.NumEmbeddeds() w.uint64(uint64(n)) @@ -802,10 +852,16 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { w.typ(ft, tPkg) } + // See comment for struct fields. In shallow mode we change the encoding + // for interface methods that are promoted from other packages. + n = t.NumExplicitMethods() w.uint64(uint64(n)) for i := 0; i < n; i++ { m := t.ExplicitMethod(i) + if w.p.shallow { + w.objectPath(m) + } w.pos(m.Pos()) w.string(m.Name()) sig, _ := m.Type().(*types.Signature) @@ -827,12 +883,61 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { } } -func (w *exportWriter) setPkg(pkg *types.Package, write bool) { - if write { - w.pkg(pkg) +// objectPath writes the package and objectPath to use to look up obj in a +// different package, when encoding in "shallow" mode. +// +// When doing a shallow import, the importer creates only the local package, +// and requests package symbols for dependencies from the client. +// However, certain types defined in the local package may hold objects defined +// (perhaps deeply) within another package. +// +// For example, consider the following: +// +// package a +// func F() chan * map[string] struct { X int } +// +// package b +// import "a" +// var B = a.F() +// +// In this example, the type of b.B holds fields defined in package a. +// In order to have the correct canonical objects for the field defined in the +// type of B, they are encoded as objectPaths and later looked up in the +// importer. The same problem applies to interface methods. +func (w *exportWriter) objectPath(obj types.Object) { + if obj.Pkg() == nil || obj.Pkg() == w.p.localpkg { + // obj.Pkg() may be nil for the builtin error.Error. + // In this case, or if obj is declared in the local package, no need to + // encode. + w.string("") + return } - - w.currPkg = pkg + objectPath, err := w.p.objectpathEncoder().For(obj) + if err != nil { + // Fall back to the empty string, which will cause the importer to create a + // new object, which matches earlier behavior. Creating a new object is + // sufficient for many purposes (such as type checking), but causes certain + // references algorithms to fail (golang/go#60819). However, we didn't + // notice this problem during months of gopls@v0.12.0 testing. + // + // TODO(golang/go#61674): this workaround is insufficient, as in the case + // where the field forwarded from an instantiated type that may not appear + // in the export data of the original package: + // + // // package a + // type A[P any] struct{ F P } + // + // // package b + // type B a.A[int] + // + // We need to update references algorithms not to depend on this + // de-duplication, at which point we may want to simply remove the + // workaround here. + w.string("") + return + } + w.string(string(objectPath)) + w.pkg(obj.Pkg()) } func (w *exportWriter) signature(sig *types.Signature) { @@ -913,6 +1018,17 @@ func (w *exportWriter) value(typ types.Type, v constant.Value) { w.int64(int64(v.Kind())) } + if v.Kind() == constant.Unknown { + // golang/go#60605: treat unknown constant values as if they have invalid type + // + // This loses some fidelity over the package type-checked from source, but that + // is acceptable. + // + // TODO(rfindley): we should switch on the recorded constant kind rather + // than the constant type + return + } + switch b := typ.Underlying().(*types.Basic); b.Info() & types.IsConstType { case types.IsBoolean: w.bool(constant.BoolVal(v)) @@ -969,6 +1085,16 @@ func constantToFloat(x constant.Value) *big.Float { return &f } +func valueToRat(x constant.Value) *big.Rat { + // Convert little-endian to big-endian. + // I can't believe this is necessary. + bytes := constant.Bytes(x) + for i := 0; i < len(bytes)/2; i++ { + bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] + } + return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) +} + // mpint exports a multi-precision integer. // // For unsigned types, small values are written out as a single @@ -1178,3 +1304,19 @@ func (q *objQueue) popHead() types.Object { q.head++ return obj } + +// internalError represents an error generated inside this package. +type internalError string + +func (e internalError) Error() string { return "gcimporter: " + string(e) } + +// TODO(adonovan): make this call panic, so that it's symmetric with errorf. +// Otherwise it's easy to forget to do anything with the error. +// +// TODO(adonovan): also, consider switching the names "errorf" and +// "internalErrorf" as the former is used for bugs, whose cause is +// internal inconsistency, whereas the latter is used for ordinary +// situations like bad input, whose cause is external. +func internalErrorf(format string, args ...interface{}) error { + return internalError(fmt.Sprintf(format, args...)) +} diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/iimport.go index be6dace15..8e64cf644 100644 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/iimport.go +++ b/tools/vendor/golang.org/x/tools/internal/gcimporter/iimport.go @@ -21,6 +21,7 @@ import ( "sort" "strings" + "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/internal/typeparams" ) @@ -85,7 +86,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, GetPackageFromMap(imports), data, false, path, nil) + pkgs, err := iimportCommon(fset, GetPackagesFromMap(imports), data, false, path, false, nil) if err != nil { return 0, nil, err } @@ -94,33 +95,49 @@ 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, GetPackageFromMap(imports), data, true, "", nil) + return iimportCommon(fset, GetPackagesFromMap(imports), data, true, "", false, nil) } -// 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. +// A GetPackagesFunc function obtains the non-nil symbols for a set of +// packages, creating and recursively importing them as needed. An +// implementation should store each package symbol is in the Pkg +// field of the items array. // -// 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 +// Any error causes importing to fail. This can be used to quickly read +// the import manifest of an export data file without fully decoding it. +type GetPackagesFunc = func(items []GetPackagesItem) error + +// A GetPackagesItem is a request from the importer for the package +// symbol of the specified name and path. +type GetPackagesItem struct { + Name, Path string + Pkg *types.Package // to be filled in by GetPackagesFunc call + + // private importer state + pathOffset uint64 + nameIndex map[string]uint64 +} -// GetPackageFromMap returns a GetPackageFunc that retrieves packages from the -// given map of package path -> package. +// GetPackagesFromMap returns a GetPackagesFunc that retrieves +// packages from the given map of package path to 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) +// The returned function may mutate m: each requested package that is not +// found is created with types.NewPackage and inserted into m. +func GetPackagesFromMap(m map[string]*types.Package) GetPackagesFunc { + return func(items []GetPackagesItem) error { + for i, item := range items { + pkg, ok := m[item.Path] + if !ok { + pkg = types.NewPackage(item.Path, item.Name) + m[item.Path] = pkg + } + items[i].Pkg = pkg } - return m[path] + return nil } } -func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, bundle bool, path string, insert InsertType) (pkgs []*types.Package, err error) { +func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte, bundle bool, path string, shallow bool, reportf ReportFunc) (pkgs []*types.Package, err error) { const currentVersion = iexportVersionCurrent version := int64(-1) if !debug { @@ -131,7 +148,7 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, } else if version > currentVersion { err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) } else { - err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) + err = fmt.Errorf("internal error while importing %q (%v); please report an issue", path, e) } } }() @@ -140,11 +157,8 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, r := &intReader{bytes.NewReader(data), path} if bundle { - bundleVersion := r.uint64() - switch bundleVersion { - case bundleVersion: - default: - errorf("unknown bundle format version %d", bundleVersion) + if v := r.uint64(); v != bundleVersion { + errorf("unknown bundle format version %d", v) } } @@ -162,7 +176,7 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, sLen := int64(r.uint64()) var fLen int64 var fileOffset []uint64 - if insert != nil { + if shallow { // Shallow mode uses a different position encoding. fLen = int64(r.uint64()) fileOffset = make([]uint64, r.uint64()) @@ -181,7 +195,8 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, p := iimporter{ version: int(version), ipath: path, - insert: insert, + shallow: shallow, + reportf: reportf, stringData: stringData, stringCache: make(map[uint64]string), @@ -208,8 +223,9 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, p.typCache[uint64(i)] = pt } - pkgList := make([]*types.Package, r.uint64()) - for i := range pkgList { + // Gather the relevant packages from the manifest. + items := make([]GetPackagesItem, r.uint64()) + for i := range items { pkgPathOff := r.uint64() pkgPath := p.stringAt(pkgPathOff) pkgName := p.stringAt(r.uint64()) @@ -218,29 +234,42 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, if pkgPath == "" { pkgPath = path } - pkg := getPackage(pkgPath, pkgName) - if pkg == nil { - 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) - } - if i == 0 && !bundle { - p.localpkg = pkg - } - - p.pkgCache[pkgPathOff] = pkg + items[i].Name = pkgName + items[i].Path = pkgPath + items[i].pathOffset = pkgPathOff // Read index for package. nameIndex := make(map[string]uint64) nSyms := r.uint64() - // In shallow mode we don't expect an index for other packages. - assert(nSyms == 0 || p.localpkg == pkg || p.insert == nil) + // In shallow mode, only the current package (i=0) has an index. + assert(!(shallow && i > 0 && nSyms != 0)) for ; nSyms > 0; nSyms-- { name := p.stringAt(r.uint64()) nameIndex[name] = r.uint64() } - p.pkgIndex[pkg] = nameIndex + items[i].nameIndex = nameIndex + } + + // Request packages all at once from the client, + // enabling a parallel implementation. + if err := getPackages(items); err != nil { + return nil, err // don't wrap this error + } + + // Check the results and complete the index. + pkgList := make([]*types.Package, len(items)) + for i, item := range items { + pkg := item.Pkg + if pkg == nil { + errorf("internal error: getPackages returned nil package for %q", item.Path) + } else if pkg.Path() != item.Path { + errorf("internal error: getPackages returned wrong path %q, want %q", pkg.Path(), item.Path) + } else if pkg.Name() != item.Name { + errorf("internal error: getPackages returned wrong name %s for package %q, want %s", pkg.Name(), item.Path, item.Name) + } + p.pkgCache[item.pathOffset] = pkg + p.pkgIndex[pkg] = item.nameIndex pkgList[i] = pkg } @@ -299,6 +328,13 @@ func iimportCommon(fset *token.FileSet, getPackage GetPackageFunc, data []byte, typ.Complete() } + // Workaround for golang/go#61561. See the doc for instanceList for details. + for _, typ := range p.instanceList { + if iface, _ := typ.Underlying().(*types.Interface); iface != nil { + iface.Complete() + } + } + return pkgs, nil } @@ -311,8 +347,8 @@ type iimporter struct { version int ipath string - localpkg *types.Package - insert func(pkg *types.Package, name string) // "shallow" mode only + shallow bool + reportf ReportFunc // if non-nil, used to report bugs stringData []byte stringCache map[uint64]string @@ -329,6 +365,12 @@ type iimporter struct { fake fakeFileSet interfaceList []*types.Interface + // Workaround for the go/types bug golang/go#61561: instances produced during + // instantiation may contain incomplete interfaces. Here we only complete the + // underlying type of the instance, which is the most common case but doesn't + // handle parameterized interface literals defined deeper in the type. + instanceList []types.Type // instances for later completion (see golang/go#61561) + // Arguments for calls to SetConstraint that are deferred due to recursive types later []setConstraintArgs @@ -360,13 +402,9 @@ func (p *iimporter) doDecl(pkg *types.Package, name string) { off, ok := p.pkgIndex[pkg][name] if !ok { - // In "shallow" mode, call back to the application to - // find the object and insert it into the package scope. - if p.insert != nil { - assert(pkg != p.localpkg) - p.insert(pkg, name) // "can't fail" - return - } + // In deep mode, the index should be complete. In shallow + // mode, we should have already recursively loaded necessary + // dependencies so the above Lookup succeeds. errorf("%v.%v not in index", pkg, name) } @@ -733,7 +771,8 @@ func (r *importReader) qualifiedIdent() (*types.Package, string) { } func (r *importReader) pos() token.Pos { - if r.p.insert != nil { // shallow mode + if r.p.shallow { + // precise offsets are encoded only in shallow mode return r.posv2() } if r.p.version >= iexportVersionPosCol { @@ -834,13 +873,28 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { fields := make([]*types.Var, r.uint64()) tags := make([]string, len(fields)) for i := range fields { + var field *types.Var + if r.p.shallow { + field, _ = r.objectPathObject().(*types.Var) + } + fpos := r.pos() fname := r.ident() ftyp := r.typ() emb := r.bool() tag := r.string() - fields[i] = types.NewField(fpos, r.currPkg, fname, ftyp, emb) + // Either this is not a shallow import, the field is local, or the + // encoded objectPath failed to produce an object (a bug). + // + // Even in this last, buggy case, fall back on creating a new field. As + // discussed in iexport.go, this is not correct, but mostly works and is + // preferable to failing (for now at least). + if field == nil { + field = types.NewField(fpos, r.currPkg, fname, ftyp, emb) + } + + fields[i] = field tags[i] = tag } return types.NewStruct(fields, tags) @@ -856,6 +910,11 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { methods := make([]*types.Func, r.uint64()) for i := range methods { + var method *types.Func + if r.p.shallow { + method, _ = r.objectPathObject().(*types.Func) + } + mpos := r.pos() mname := r.ident() @@ -865,9 +924,12 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { if base != nil { recv = types.NewVar(token.NoPos, r.currPkg, "", base) } - msig := r.signature(recv, nil, nil) - methods[i] = types.NewFunc(mpos, r.currPkg, mname, msig) + + if method == nil { + method = types.NewFunc(mpos, r.currPkg, mname, msig) + } + methods[i] = method } typ := newInterface(methods, embeddeds) @@ -905,6 +967,9 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { // we must always use the methods of the base (orig) type. // TODO provide a non-nil *Environment t, _ := typeparams.Instantiate(nil, baseType, targs, false) + + // Workaround for golang/go#61561. See the doc for instanceList for details. + r.p.instanceList = append(r.p.instanceList, t) return t case unionType: @@ -923,6 +988,26 @@ func (r *importReader) kind() itag { return itag(r.uint64()) } +// objectPathObject is the inverse of exportWriter.objectPath. +// +// In shallow mode, certain fields and methods may need to be looked up in an +// imported package. See the doc for exportWriter.objectPath for a full +// explanation. +func (r *importReader) objectPathObject() types.Object { + objPath := objectpath.Path(r.string()) + if objPath == "" { + return nil + } + pkg := r.pkg() + obj, err := objectpath.Object(pkg, objPath) + if err != nil { + if r.p.reportf != nil { + r.p.reportf("failed to find object for objectPath %q: %v", objPath, err) + } + } + return obj +} + func (r *importReader) signature(recv *types.Var, rparams []*typeparams.TypeParam, tparams []*typeparams.TypeParam) *types.Signature { params := r.paramList() results := r.paramList() diff --git a/tools/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/tools/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go index 34fc783f8..b977435f6 100644 --- a/tools/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go +++ b/tools/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go @@ -10,6 +10,7 @@ package gcimporter import ( + "fmt" "go/token" "go/types" "sort" @@ -63,6 +64,14 @@ type typeInfo struct { } func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + if !debug { + defer func() { + if x := recover(); x != nil { + err = fmt.Errorf("internal error in importing %q (%v); please report an issue", path, x) + } + }() + } + s := string(data) s = s[:strings.LastIndex(s, "\n$$\n")] input := pkgbits.NewPkgDecoder(path, s) diff --git a/tools/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/tools/vendor/golang.org/x/tools/internal/gocommand/invoke.go index d50551693..53cf66da0 100644 --- a/tools/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/tools/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" @@ -22,6 +24,9 @@ import ( exec "golang.org/x/sys/execabs" "golang.org/x/tools/internal/event" + "golang.org/x/tools/internal/event/keys" + "golang.org/x/tools/internal/event/label" + "golang.org/x/tools/internal/event/tag" ) // An Runner will run go command invocations and serialize @@ -51,9 +56,19 @@ func (runner *Runner) initialize() { // 1.14: go: updating go.mod: existing contents have changed since last read var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed`) +// verb is an event label for the go command verb. +var verb = keys.NewString("verb", "go command verb") + +func invLabels(inv Invocation) []label.Label { + return []label.Label{verb.Of(inv.Verb), tag.Directory.Of(inv.WorkingDir)} +} + // Run is a convenience wrapper around RunRaw. // It returns only stdout and a "friendly" error. func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, error) { + ctx, done := event.Start(ctx, "gocommand.Runner.Run", invLabels(inv)...) + defer done() + stdout, _, friendly, _ := runner.RunRaw(ctx, inv) return stdout, friendly } @@ -61,6 +76,9 @@ func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, e // RunPiped runs the invocation serially, always waiting for any concurrent // invocations to complete first. func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) error { + ctx, done := event.Start(ctx, "gocommand.Runner.RunPiped", invLabels(inv)...) + defer done() + _, err := runner.runPiped(ctx, inv, stdout, stderr) return err } @@ -68,6 +86,8 @@ func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stde // RunRaw runs the invocation, serializing requests only if they fight over // go.mod changes. func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { + ctx, done := event.Start(ctx, "gocommand.Runner.RunRaw", invLabels(inv)...) + defer done() // Make sure the runner is always initialized. runner.initialize() @@ -215,6 +235,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 +261,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 +275,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 it 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 it 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 +361,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 +381,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/tools/vendor/golang.org/x/tools/internal/gocommand/version.go b/tools/vendor/golang.org/x/tools/internal/gocommand/version.go index 307a76d47..446c5846a 100644 --- a/tools/vendor/golang.org/x/tools/internal/gocommand/version.go +++ b/tools/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/tools/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/tools/vendor/golang.org/x/tools/internal/gopathwalk/walk.go index 168405322..452e342c5 100644 --- a/tools/vendor/golang.org/x/tools/internal/gopathwalk/walk.go +++ b/tools/vendor/golang.org/x/tools/internal/gopathwalk/walk.go @@ -9,8 +9,6 @@ package gopathwalk import ( "bufio" "bytes" - "fmt" - "io/ioutil" "log" "os" "path/filepath" @@ -78,7 +76,7 @@ func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) } start := time.Now() if opts.Logf != nil { - opts.Logf("gopathwalk: scanning %s", root.Path) + opts.Logf("scanning %s", root.Path) } w := &walker{ root: root, @@ -88,11 +86,15 @@ func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) } w.init() if err := fastwalk.Walk(root.Path, w.walk); err != nil { - log.Printf("gopathwalk: scanning directory %v: %v", root.Path, err) + logf := opts.Logf + if logf == nil { + logf = log.Printf + } + logf("scanning directory %v: %v", root.Path, err) } if opts.Logf != nil { - opts.Logf("gopathwalk: scanned %s in %v", root.Path, time.Since(start)) + opts.Logf("scanned %s in %v", root.Path, time.Since(start)) } } @@ -135,7 +137,7 @@ func (w *walker) init() { // The provided path is one of the $GOPATH entries with "src" appended. func (w *walker) getIgnoredDirs(path string) []string { file := filepath.Join(path, ".goimportsignore") - slurp, err := ioutil.ReadFile(file) + slurp, err := os.ReadFile(file) if w.opts.Logf != nil { if err != nil { w.opts.Logf("%v", err) @@ -222,7 +224,11 @@ func (w *walker) walk(path string, typ os.FileMode) error { func (w *walker) shouldTraverse(path string) bool { ts, err := os.Stat(path) if err != nil { - fmt.Fprintln(os.Stderr, err) + logf := w.opts.Logf + if logf == nil { + logf = log.Printf + } + logf("%v", err) return false } if !ts.IsDir() { diff --git a/tools/vendor/golang.org/x/tools/internal/imports/fix.go b/tools/vendor/golang.org/x/tools/internal/imports/fix.go index 642a5ac2d..01e8ba5fa 100644 --- a/tools/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/tools/vendor/golang.org/x/tools/internal/imports/fix.go @@ -13,6 +13,7 @@ import ( "go/build" "go/parser" "go/token" + "io/fs" "io/ioutil" "os" "path" @@ -26,6 +27,7 @@ import ( "unicode/utf8" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/gopathwalk" ) @@ -106,7 +108,7 @@ func parseOtherFiles(fset *token.FileSet, srcDir, filename string) []*ast.File { considerTests := strings.HasSuffix(filename, "_test.go") fileBase := filepath.Base(filename) - packageFileInfos, err := ioutil.ReadDir(srcDir) + packageFileInfos, err := os.ReadDir(srcDir) if err != nil { return nil } @@ -414,9 +416,16 @@ func (p *pass) fix() ([]*ImportFix, bool) { }) } } + // Collecting fixes involved map iteration, so sort for stability. See + // golang/go#59976. + sortFixes(fixes) + // collect selected fixes in a separate slice, so that it can be sorted + // separately. Note that these fixes must occur after fixes to existing + // imports. TODO(rfindley): figure out why. + var selectedFixes []*ImportFix for _, imp := range selected { - fixes = append(fixes, &ImportFix{ + selectedFixes = append(selectedFixes, &ImportFix{ StmtInfo: ImportInfo{ Name: p.importSpecName(imp), ImportPath: imp.ImportPath, @@ -425,8 +434,25 @@ func (p *pass) fix() ([]*ImportFix, bool) { FixType: AddImport, }) } + sortFixes(selectedFixes) - return fixes, true + return append(fixes, selectedFixes...), true +} + +func sortFixes(fixes []*ImportFix) { + sort.Slice(fixes, func(i, j int) bool { + fi, fj := fixes[i], fixes[j] + if fi.StmtInfo.ImportPath != fj.StmtInfo.ImportPath { + return fi.StmtInfo.ImportPath < fj.StmtInfo.ImportPath + } + if fi.StmtInfo.Name != fj.StmtInfo.Name { + return fi.StmtInfo.Name < fj.StmtInfo.Name + } + if fi.IdentName != fj.IdentName { + return fi.IdentName < fj.IdentName + } + return fi.FixType < fj.FixType + }) } // importSpecName gets the import name of imp in the import spec. @@ -519,7 +545,7 @@ func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) { var fixImports = fixImportsDefault func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) error { - fixes, err := getFixes(fset, f, filename, env) + fixes, err := getFixes(context.Background(), fset, f, filename, env) if err != nil { return err } @@ -529,7 +555,7 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P // getFixes gets the import fixes that need to be made to f in order to fix the imports. // It does not modify the ast. -func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { +func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { abs, err := filepath.Abs(filename) if err != nil { return nil, err @@ -583,7 +609,7 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv // Go look for candidates in $GOPATH, etc. We don't necessarily load // the real exports of sibling imports, so keep assuming their contents. - if err := addExternalCandidates(p, p.missingRefs, filename); err != nil { + if err := addExternalCandidates(ctx, p, p.missingRefs, filename); err != nil { return nil, err } @@ -1031,7 +1057,10 @@ type scanCallback struct { exportsLoaded func(pkg *pkg, exports []string) } -func addExternalCandidates(pass *pass, refs references, filename string) error { +func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error { + ctx, done := event.Start(ctx, "imports.addExternalCandidates") + defer done() + var mu sync.Mutex found := make(map[string][]pkgDistance) callback := &scanCallback{ @@ -1441,11 +1470,11 @@ func VendorlessPath(ipath string) string { func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []string, error) { // Look for non-test, buildable .go files which could provide exports. - all, err := ioutil.ReadDir(dir) + all, err := os.ReadDir(dir) if err != nil { return "", nil, err } - var files []os.FileInfo + var files []fs.DirEntry for _, fi := range all { name := fi.Name() if !strings.HasSuffix(name, ".go") || (!includeTest && strings.HasSuffix(name, "_test.go")) { diff --git a/tools/vendor/golang.org/x/tools/internal/imports/imports.go b/tools/vendor/golang.org/x/tools/internal/imports/imports.go index 95a88383a..58e637b90 100644 --- a/tools/vendor/golang.org/x/tools/internal/imports/imports.go +++ b/tools/vendor/golang.org/x/tools/internal/imports/imports.go @@ -11,6 +11,7 @@ package imports import ( "bufio" "bytes" + "context" "fmt" "go/ast" "go/format" @@ -23,6 +24,7 @@ import ( "strings" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/internal/event" ) // Options is golang.org/x/tools/imports.Options with extra internal-only options. @@ -66,14 +68,17 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. -func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { +func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { + ctx, done := event.Start(ctx, "imports.FixImports") + defer done() + fileSet := token.NewFileSet() file, _, err := parse(fileSet, filename, src, opt) if err != nil { return nil, err } - return getFixes(fileSet, file, filename, opt.Env) + return getFixes(ctx, fileSet, file, filename, opt.Env) } // ApplyFixes applies all of the fixes to the file and formats it. extraMode diff --git a/tools/vendor/golang.org/x/tools/internal/imports/mod.go b/tools/vendor/golang.org/x/tools/internal/imports/mod.go index 7d99d04ca..5f4d435d3 100644 --- a/tools/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/tools/vendor/golang.org/x/tools/internal/imports/mod.go @@ -9,7 +9,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "os" "path" "path/filepath" @@ -19,6 +18,7 @@ import ( "strings" "golang.org/x/mod/module" + "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/gopathwalk" ) @@ -37,7 +37,7 @@ type ModuleResolver struct { mains []*gocommand.ModuleJSON mainByDir map[string]*gocommand.ModuleJSON modsByModPath []*gocommand.ModuleJSON // All modules, ordered by # of path components in module Path... - modsByDir []*gocommand.ModuleJSON // ...or Dir. + modsByDir []*gocommand.ModuleJSON // ...or number of path components in their Dir. // moduleCacheCache stores information about the module cache. moduleCacheCache *dirInfoCache @@ -123,7 +123,7 @@ func (r *ModuleResolver) init() error { }) sort.Slice(r.modsByDir, func(i, j int) bool { count := func(x int) int { - return strings.Count(r.modsByDir[x].Dir, "/") + return strings.Count(r.modsByDir[x].Dir, string(filepath.Separator)) } return count(j) < count(i) // descending order }) @@ -264,7 +264,7 @@ func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, } // Not cached. Read the filesystem. - pkgFiles, err := ioutil.ReadDir(pkgDir) + pkgFiles, err := os.ReadDir(pkgDir) if err != nil { continue } @@ -327,6 +327,10 @@ func (r *ModuleResolver) findModuleByDir(dir string) *gocommand.ModuleJSON { // - in /vendor/ in -mod=vendor mode. // - nested module? Dunno. // Rumor has it that replace targets cannot contain other replace targets. + // + // Note that it is critical here that modsByDir is sorted to have deeper dirs + // first. This ensures that findModuleByDir finds the innermost module. + // See also golang/go#56291. for _, m := range r.modsByDir { if !strings.HasPrefix(dir, m.Dir) { continue @@ -365,7 +369,7 @@ func (r *ModuleResolver) dirIsNestedModule(dir string, mod *gocommand.ModuleJSON func (r *ModuleResolver) modInfo(dir string) (modDir string, modName string) { readModName := func(modFile string) string { - modBytes, err := ioutil.ReadFile(modFile) + modBytes, err := os.ReadFile(modFile) if err != nil { return "" } @@ -424,6 +428,9 @@ func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) ( } func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error { + ctx, done := event.Start(ctx, "imports.ModuleResolver.scan") + defer done() + if err := r.init(); err != nil { return err } diff --git a/tools/vendor/golang.org/x/tools/internal/imports/mod_cache.go b/tools/vendor/golang.org/x/tools/internal/imports/mod_cache.go index 18dada495..45690abbb 100644 --- a/tools/vendor/golang.org/x/tools/internal/imports/mod_cache.go +++ b/tools/vendor/golang.org/x/tools/internal/imports/mod_cache.go @@ -12,7 +12,7 @@ import ( "golang.org/x/tools/internal/gopathwalk" ) -// To find packages to import, the resolver needs to know about all of the +// To find packages to import, the resolver needs to know about all of // the packages that could be imported. This includes packages that are // already in modules that are in (1) the current module, (2) replace targets, // and (3) packages in the module cache. Packages in (1) and (2) may change over diff --git a/tools/vendor/golang.org/x/tools/internal/imports/zstdlib.go b/tools/vendor/golang.org/x/tools/internal/imports/zstdlib.go index 31a75949c..9f992c2be 100644 --- a/tools/vendor/golang.org/x/tools/internal/imports/zstdlib.go +++ b/tools/vendor/golang.org/x/tools/internal/imports/zstdlib.go @@ -93,6 +93,7 @@ var stdlib = map[string][]string{ "Compare", "Contains", "ContainsAny", + "ContainsFunc", "ContainsRune", "Count", "Cut", @@ -147,6 +148,11 @@ var stdlib = map[string][]string{ "TrimSpace", "TrimSuffix", }, + "cmp": { + "Compare", + "Less", + "Ordered", + }, "compress/bzip2": { "NewReader", "StructuralError", @@ -228,6 +234,7 @@ var stdlib = map[string][]string{ "Ring", }, "context": { + "AfterFunc", "Background", "CancelCauseFunc", "CancelFunc", @@ -239,8 +246,11 @@ var stdlib = map[string][]string{ "WithCancel", "WithCancelCause", "WithDeadline", + "WithDeadlineCause", "WithTimeout", + "WithTimeoutCause", "WithValue", + "WithoutCancel", }, "crypto": { "BLAKE2b_256", @@ -445,6 +455,7 @@ var stdlib = map[string][]string{ "XORBytes", }, "crypto/tls": { + "AlertError", "Certificate", "CertificateRequestInfo", "CertificateVerificationError", @@ -476,6 +487,7 @@ var stdlib = map[string][]string{ "LoadX509KeyPair", "NewLRUClientSessionCache", "NewListener", + "NewResumptionState", "NoClientCert", "PKCS1WithSHA1", "PKCS1WithSHA256", @@ -484,6 +496,27 @@ var stdlib = map[string][]string{ "PSSWithSHA256", "PSSWithSHA384", "PSSWithSHA512", + "ParseSessionState", + "QUICClient", + "QUICConfig", + "QUICConn", + "QUICEncryptionLevel", + "QUICEncryptionLevelApplication", + "QUICEncryptionLevelEarly", + "QUICEncryptionLevelHandshake", + "QUICEncryptionLevelInitial", + "QUICEvent", + "QUICEventKind", + "QUICHandshakeDone", + "QUICNoEvent", + "QUICRejectedEarlyData", + "QUICServer", + "QUICSessionTicketOptions", + "QUICSetReadSecret", + "QUICSetWriteSecret", + "QUICTransportParameters", + "QUICTransportParametersRequired", + "QUICWriteData", "RecordHeaderError", "RenegotiateFreelyAsClient", "RenegotiateNever", @@ -493,6 +526,7 @@ var stdlib = map[string][]string{ "RequireAndVerifyClientCert", "RequireAnyClientCert", "Server", + "SessionState", "SignatureScheme", "TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", @@ -523,6 +557,7 @@ var stdlib = map[string][]string{ "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_RC4_128_SHA", "VerifyClientCertIfGiven", + "VersionName", "VersionSSL30", "VersionTLS10", "VersionTLS11", @@ -618,6 +653,7 @@ var stdlib = map[string][]string{ "PureEd25519", "RSA", "RevocationList", + "RevocationListEntry", "SHA1WithRSA", "SHA256WithRSA", "SHA256WithRSAPSS", @@ -1002,10 +1038,42 @@ var stdlib = map[string][]string{ "COMPRESS_LOOS", "COMPRESS_LOPROC", "COMPRESS_ZLIB", + "COMPRESS_ZSTD", "Chdr32", "Chdr64", "Class", "CompressionType", + "DF_1_CONFALT", + "DF_1_DIRECT", + "DF_1_DISPRELDNE", + "DF_1_DISPRELPND", + "DF_1_EDITED", + "DF_1_ENDFILTEE", + "DF_1_GLOBAL", + "DF_1_GLOBAUDIT", + "DF_1_GROUP", + "DF_1_IGNMULDEF", + "DF_1_INITFIRST", + "DF_1_INTERPOSE", + "DF_1_KMOD", + "DF_1_LOADFLTR", + "DF_1_NOCOMMON", + "DF_1_NODEFLIB", + "DF_1_NODELETE", + "DF_1_NODIRECT", + "DF_1_NODUMP", + "DF_1_NOHDR", + "DF_1_NOKSYMS", + "DF_1_NOOPEN", + "DF_1_NORELOC", + "DF_1_NOW", + "DF_1_ORIGIN", + "DF_1_PIE", + "DF_1_SINGLETON", + "DF_1_STUB", + "DF_1_SYMINTPOSE", + "DF_1_TRANS", + "DF_1_WEAKFILTER", "DF_BIND_NOW", "DF_ORIGIN", "DF_STATIC_TLS", @@ -1144,6 +1212,7 @@ var stdlib = map[string][]string{ "Dyn32", "Dyn64", "DynFlag", + "DynFlag1", "DynTag", "EI_ABIVERSION", "EI_CLASS", @@ -2111,6 +2180,7 @@ var stdlib = map[string][]string{ "R_PPC64_REL16_LO", "R_PPC64_REL24", "R_PPC64_REL24_NOTOC", + "R_PPC64_REL24_P9NOTOC", "R_PPC64_REL30", "R_PPC64_REL32", "R_PPC64_REL64", @@ -2848,6 +2918,7 @@ var stdlib = map[string][]string{ "MaxVarintLen16", "MaxVarintLen32", "MaxVarintLen64", + "NativeEndian", "PutUvarint", "PutVarint", "Read", @@ -2963,6 +3034,7 @@ var stdlib = map[string][]string{ }, "errors": { "As", + "ErrUnsupported", "Is", "Join", "New", @@ -2989,6 +3061,7 @@ var stdlib = map[string][]string{ "Arg", "Args", "Bool", + "BoolFunc", "BoolVar", "CommandLine", "ContinueOnError", @@ -3119,6 +3192,7 @@ var stdlib = map[string][]string{ "Inspect", "InterfaceType", "IsExported", + "IsGenerated", "KeyValueExpr", "LabeledStmt", "Lbl", @@ -3169,6 +3243,7 @@ var stdlib = map[string][]string{ "ArchChar", "Context", "Default", + "Directive", "FindOnly", "IgnoreVendor", "Import", @@ -3184,6 +3259,7 @@ var stdlib = map[string][]string{ "go/build/constraint": { "AndExpr", "Expr", + "GoVersion", "IsGoBuild", "IsPlusBuild", "NotExpr", @@ -3626,6 +3702,7 @@ var stdlib = map[string][]string{ "ErrBadHTML", "ErrBranchEnd", "ErrEndContext", + "ErrJSTemplate", "ErrNoSuchTemplate", "ErrOutputContext", "ErrPartialCharset", @@ -3870,6 +3947,8 @@ var stdlib = map[string][]string{ "FileInfo", "FileInfoToDirEntry", "FileMode", + "FormatDirEntry", + "FormatFileInfo", "Glob", "GlobFS", "ModeAppend", @@ -3942,6 +4021,78 @@ var stdlib = map[string][]string{ "SetPrefix", "Writer", }, + "log/slog": { + "Any", + "AnyValue", + "Attr", + "Bool", + "BoolValue", + "Debug", + "DebugContext", + "Default", + "Duration", + "DurationValue", + "Error", + "ErrorContext", + "Float64", + "Float64Value", + "Group", + "GroupValue", + "Handler", + "HandlerOptions", + "Info", + "InfoContext", + "Int", + "Int64", + "Int64Value", + "IntValue", + "JSONHandler", + "Kind", + "KindAny", + "KindBool", + "KindDuration", + "KindFloat64", + "KindGroup", + "KindInt64", + "KindLogValuer", + "KindString", + "KindTime", + "KindUint64", + "Level", + "LevelDebug", + "LevelError", + "LevelInfo", + "LevelKey", + "LevelVar", + "LevelWarn", + "Leveler", + "Log", + "LogAttrs", + "LogValuer", + "Logger", + "MessageKey", + "New", + "NewJSONHandler", + "NewLogLogger", + "NewRecord", + "NewTextHandler", + "Record", + "SetDefault", + "Source", + "SourceKey", + "String", + "StringValue", + "TextHandler", + "Time", + "TimeKey", + "TimeValue", + "Uint64", + "Uint64Value", + "Value", + "Warn", + "WarnContext", + "With", + }, "log/syslog": { "Dial", "LOG_ALERT", @@ -3977,6 +4128,13 @@ var stdlib = map[string][]string{ "Priority", "Writer", }, + "maps": { + "Clone", + "Copy", + "DeleteFunc", + "Equal", + "EqualFunc", + }, "math": { "Abs", "Acos", @@ -4371,6 +4529,7 @@ var stdlib = map[string][]string{ "ErrNoLocation", "ErrNotMultipart", "ErrNotSupported", + "ErrSchemeMismatch", "ErrServerClosed", "ErrShortBody", "ErrSkipAltProtocol", @@ -5084,6 +5243,8 @@ var stdlib = map[string][]string{ "NumCPU", "NumCgoCall", "NumGoroutine", + "PanicNilError", + "Pinner", "ReadMemStats", "ReadTrace", "SetBlockProfileRate", @@ -5172,6 +5333,37 @@ var stdlib = map[string][]string{ "Task", "WithRegion", }, + "slices": { + "BinarySearch", + "BinarySearchFunc", + "Clip", + "Clone", + "Compact", + "CompactFunc", + "Compare", + "CompareFunc", + "Contains", + "ContainsFunc", + "Delete", + "DeleteFunc", + "Equal", + "EqualFunc", + "Grow", + "Index", + "IndexFunc", + "Insert", + "IsSorted", + "IsSortedFunc", + "Max", + "MaxFunc", + "Min", + "MinFunc", + "Replace", + "Reverse", + "Sort", + "SortFunc", + "SortStableFunc", + }, "sort": { "Find", "Float64Slice", @@ -5242,6 +5434,7 @@ var stdlib = map[string][]string{ "Compare", "Contains", "ContainsAny", + "ContainsFunc", "ContainsRune", "Count", "Cut", @@ -5299,6 +5492,9 @@ var stdlib = map[string][]string{ "Mutex", "NewCond", "Once", + "OnceFunc", + "OnceValue", + "OnceValues", "Pool", "RWMutex", "WaitGroup", @@ -9135,10 +9331,12 @@ var stdlib = map[string][]string{ "SYS_AIO_CANCEL", "SYS_AIO_ERROR", "SYS_AIO_FSYNC", + "SYS_AIO_MLOCK", "SYS_AIO_READ", "SYS_AIO_RETURN", "SYS_AIO_SUSPEND", "SYS_AIO_SUSPEND_NOCANCEL", + "SYS_AIO_WAITCOMPLETE", "SYS_AIO_WRITE", "SYS_ALARM", "SYS_ARCH_PRCTL", @@ -9368,6 +9566,7 @@ var stdlib = map[string][]string{ "SYS_GET_MEMPOLICY", "SYS_GET_ROBUST_LIST", "SYS_GET_THREAD_AREA", + "SYS_GSSD_SYSCALL", "SYS_GTTY", "SYS_IDENTITYSVC", "SYS_IDLE", @@ -9411,8 +9610,24 @@ var stdlib = map[string][]string{ "SYS_KLDSYM", "SYS_KLDUNLOAD", "SYS_KLDUNLOADF", + "SYS_KMQ_NOTIFY", + "SYS_KMQ_OPEN", + "SYS_KMQ_SETATTR", + "SYS_KMQ_TIMEDRECEIVE", + "SYS_KMQ_TIMEDSEND", + "SYS_KMQ_UNLINK", "SYS_KQUEUE", "SYS_KQUEUE1", + "SYS_KSEM_CLOSE", + "SYS_KSEM_DESTROY", + "SYS_KSEM_GETVALUE", + "SYS_KSEM_INIT", + "SYS_KSEM_OPEN", + "SYS_KSEM_POST", + "SYS_KSEM_TIMEDWAIT", + "SYS_KSEM_TRYWAIT", + "SYS_KSEM_UNLINK", + "SYS_KSEM_WAIT", "SYS_KTIMER_CREATE", "SYS_KTIMER_DELETE", "SYS_KTIMER_GETOVERRUN", @@ -9504,11 +9719,14 @@ var stdlib = map[string][]string{ "SYS_NFSSVC", "SYS_NFSTAT", "SYS_NICE", + "SYS_NLM_SYSCALL", "SYS_NLSTAT", "SYS_NMOUNT", "SYS_NSTAT", "SYS_NTP_ADJTIME", "SYS_NTP_GETTIME", + "SYS_NUMA_GETAFFINITY", + "SYS_NUMA_SETAFFINITY", "SYS_OABI_SYSCALL_BASE", "SYS_OBREAK", "SYS_OLDFSTAT", @@ -9891,6 +10109,7 @@ var stdlib = map[string][]string{ "SYS___ACL_SET_FD", "SYS___ACL_SET_FILE", "SYS___ACL_SET_LINK", + "SYS___CAP_RIGHTS_GET", "SYS___CLONE", "SYS___DISABLE_THREADSIGNAL", "SYS___GETCWD", @@ -10574,6 +10793,7 @@ var stdlib = map[string][]string{ "Short", "T", "TB", + "Testing", "Verbose", }, "testing/fstest": { @@ -10603,6 +10823,9 @@ var stdlib = map[string][]string{ "SetupError", "Value", }, + "testing/slogtest": { + "TestHandler", + }, "text/scanner": { "Char", "Comment", @@ -10826,6 +11049,7 @@ var stdlib = map[string][]string{ "Cs", "Cuneiform", "Cypriot", + "Cypro_Minoan", "Cyrillic", "Dash", "Deprecated", @@ -10889,6 +11113,7 @@ var stdlib = map[string][]string{ "Kaithi", "Kannada", "Katakana", + "Kawi", "Kayah_Li", "Kharoshthi", "Khitan_Small_Script", @@ -10943,6 +11168,7 @@ var stdlib = map[string][]string{ "Myanmar", "N", "Nabataean", + "Nag_Mundari", "Nandinagari", "Nd", "New_Tai_Lue", @@ -10964,6 +11190,7 @@ var stdlib = map[string][]string{ "Old_Sogdian", "Old_South_Arabian", "Old_Turkic", + "Old_Uyghur", "Oriya", "Osage", "Osmanya", @@ -11038,6 +11265,7 @@ var stdlib = map[string][]string{ "Tai_Viet", "Takri", "Tamil", + "Tangsa", "Tangut", "Telugu", "Terminal_Punctuation", @@ -11052,6 +11280,7 @@ var stdlib = map[string][]string{ "ToLower", "ToTitle", "ToUpper", + "Toto", "TurkishCase", "Ugaritic", "Unified_Ideograph", @@ -11061,6 +11290,7 @@ var stdlib = map[string][]string{ "Vai", "Variation_Selector", "Version", + "Vithkuqi", "Wancho", "Warang_Citi", "White_Space", diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/common.go b/tools/vendor/golang.org/x/tools/internal/typeparams/common.go index cfba8189f..d0d0649fe 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/common.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -23,6 +23,7 @@ package typeparams import ( + "fmt" "go/ast" "go/token" "go/types" @@ -105,6 +106,31 @@ func OriginMethod(fn *types.Func) *types.Func { } orig := NamedTypeOrigin(named) gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) + + // This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In: + // package p + // type T *int + // func (*T) f() {} + // LookupFieldOrMethod(T, true, p, f)=nil, but NewMethodSet(*T)={(*T).f}. + // Here we make them consistent by force. + // (The go/types bug is general, but this workaround is reached only + // for generic T thanks to the early return above.) + if gfn == nil { + mset := types.NewMethodSet(types.NewPointer(orig)) + for i := 0; i < mset.Len(); i++ { + m := mset.At(i) + if m.Obj().Id() == fn.Id() { + gfn = m.Obj() + break + } + } + } + + // In golang/go#61196, we observe another crash, this time inexplicable. + if gfn == nil { + panic(fmt.Sprintf("missing origin method for %s.%s; named == origin: %t, named.NumMethods(): %d, origin.NumMethods(): %d", named, fn, named == orig, named.NumMethods(), orig.NumMethods())) + } + return gfn.(*types.Func) } diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go b/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go index 993135ec9..71248209e 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go @@ -81,13 +81,13 @@ func CoreType(T types.Type) types.Type { // restrictions may be arbitrarily complex. For example, consider the // following: // -// type A interface{ ~string|~[]byte } +// type A interface{ ~string|~[]byte } // -// type B interface{ int|string } +// type B interface{ int|string } // -// type C interface { ~string|~int } +// type C interface { ~string|~int } // -// type T[P interface{ A|B; C }] int +// type T[P interface{ A|B; C }] int // // In this example, the structural type restriction of P is ~string|int: A|B // expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/termlist.go b/tools/vendor/golang.org/x/tools/internal/typeparams/termlist.go index 933106a23..cbd12f801 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/termlist.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/termlist.go @@ -30,7 +30,7 @@ func (xl termlist) String() string { var buf bytes.Buffer for i, x := range xl { if i > 0 { - buf.WriteString(" ∪ ") + buf.WriteString(" | ") } buf.WriteString(x.String()) } diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go b/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go index b4788978f..7ed86e171 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go @@ -129,7 +129,7 @@ func NamedTypeArgs(*types.Named) *TypeList { } // NamedTypeOrigin is the identity method at this Go version. -func NamedTypeOrigin(named *types.Named) types.Type { +func NamedTypeOrigin(named *types.Named) *types.Named { return named } diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go b/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go index 114a36b86..cf301af1d 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go @@ -103,7 +103,7 @@ func NamedTypeArgs(named *types.Named) *TypeList { } // NamedTypeOrigin returns named.Orig(). -func NamedTypeOrigin(named *types.Named) types.Type { +func NamedTypeOrigin(named *types.Named) *types.Named { return named.Origin() } diff --git a/tools/vendor/golang.org/x/tools/internal/typeparams/typeterm.go b/tools/vendor/golang.org/x/tools/internal/typeparams/typeterm.go index 7ddee28d9..7350bb702 100644 --- a/tools/vendor/golang.org/x/tools/internal/typeparams/typeterm.go +++ b/tools/vendor/golang.org/x/tools/internal/typeparams/typeterm.go @@ -10,11 +10,10 @@ import "go/types" // A term describes elementary type sets: // -// ∅: (*term)(nil) == ∅ // set of no types (empty set) -// ð“¤: &term{} == 𓤠// set of all types (ð“¤niverse) -// T: &term{false, T} == {T} // set of type T -// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t -// +// ∅: (*term)(nil) == ∅ // set of no types (empty set) +// ð“¤: &term{} == 𓤠// set of all types (ð“¤niverse) +// T: &term{false, T} == {T} // set of type T +// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t type term struct { tilde bool // valid if typ != nil typ types.Type diff --git a/tools/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go b/tools/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go new file mode 100644 index 000000000..5e96e8955 --- /dev/null +++ b/tools/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go @@ -0,0 +1,24 @@ +// 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 typesinternal + +import "go/types" + +// This file contains back doors that allow gopls to avoid method sorting when +// using the objectpath package. +// +// This is performance-critical in certain repositories, but changing the +// behavior of the objectpath package is still being discussed in +// golang/go#61443. If we decide to remove the sorting in objectpath we can +// simply delete these back doors. Otherwise, we should add a new API to +// objectpath that allows controlling the sorting. + +// SkipEncoderMethodSorting marks enc (which must be an *objectpath.Encoder) as +// not requiring sorted methods. +var SkipEncoderMethodSorting func(enc interface{}) + +// ObjectpathObject is like objectpath.Object, but allows suppressing method +// sorting. +var ObjectpathObject func(pkg *types.Package, p string, skipMethodSorting bool) (types.Object, error) diff --git a/tools/vendor/golang.org/x/tools/internal/typesinternal/types.go b/tools/vendor/golang.org/x/tools/internal/typesinternal/types.go index 3c53fbc63..ce7d4351b 100644 --- a/tools/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/tools/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -11,8 +11,6 @@ import ( "go/types" "reflect" "unsafe" - - "golang.org/x/tools/go/types/objectpath" ) func SetUsesCgo(conf *types.Config) bool { @@ -52,10 +50,3 @@ 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/tools/vendor/google.golang.org/genproto/googleapis/api/LICENSE b/tools/vendor/google.golang.org/genproto/googleapis/api/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/tools/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/tools/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go b/tools/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go index e841579c8..63c1ad934 100644 --- a/tools/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go +++ b/tools/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.5 +// protoc v3.21.9 // source: google/api/expr/v1alpha1/syntax.proto package expr @@ -883,6 +883,13 @@ type Expr_CreateList struct { // The elements part of the list. Elements []*Expr `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"` + // The indices within the elements list which are marked as optional + // elements. + // + // When an optional-typed value is present, the value it contains + // is included in the list. If the optional-typed value is absent, the list + // element is omitted from the CreateList result. + OptionalIndices []int32 `protobuf:"varint,2,rep,packed,name=optional_indices,json=optionalIndices,proto3" json:"optional_indices,omitempty"` } func (x *Expr_CreateList) Reset() { @@ -924,6 +931,13 @@ func (x *Expr_CreateList) GetElements() []*Expr { return nil } +func (x *Expr_CreateList) GetOptionalIndices() []int32 { + if x != nil { + return x.OptionalIndices + } + return nil +} + // A map or message creation expression. // // Maps are constructed as `{'key_name': 'value'}`. Message construction is @@ -1262,7 +1276,7 @@ var file_google_api_expr_v1alpha1_syntax_proto_rawDesc = []byte{ 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x83, 0x0d, 0x0a, 0x04, 0x45, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xae, 0x0d, 0x0a, 0x04, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, @@ -1315,129 +1329,132 @@ var file_google_api_expr_v1alpha1_syntax_proto_rawDesc = []byte{ 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x48, 0x0a, 0x0a, 0x43, + 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x73, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xdb, 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0xda, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1d, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x12, - 0x39, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, - 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, - 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x1a, 0xfd, 0x02, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x74, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x12, 0x3d, 0x0a, 0x0a, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, + 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x1a, 0xdb, 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x1a, 0xda, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x07, 0x6d, 0x61, + 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6d, + 0x61, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x75, 0x56, 0x61, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x63, - 0x63, 0x75, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x61, - 0x63, 0x63, 0x75, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x45, 0x78, 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0xfd, + 0x02, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x69, 0x74, 0x65, 0x72, 0x56, 0x61, 0x72, 0x12, 0x3d, 0x0a, 0x0a, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, - 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, - 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, - 0x72, 0x52, 0x08, 0x6c, 0x6f, 0x6f, 0x70, 0x53, 0x74, 0x65, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x22, 0xc1, 0x03, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, - 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, - 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, - 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, - 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x46, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 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, 0x42, 0x02, 0x18, - 0x01, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6e, - 0x74, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x69, - 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x09, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, + 0x09, 0x69, 0x74, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, + 0x63, 0x75, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x75, 0x56, 0x61, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x61, 0x63, 0x63, 0x75, 0x49, 0x6e, + 0x69, 0x74, 0x12, 0x45, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, + 0x70, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0b, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, - 0x6c, 0x6c, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x5d, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x70, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x42, 0x6e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x6c, 0x6f, + 0x6f, 0x70, 0x53, 0x74, 0x65, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x0b, + 0x0a, 0x09, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc1, 0x03, 0x0a, 0x08, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x00, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, + 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, + 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 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, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0e, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, + 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0xb9, 0x03, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, + 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x42, 0x0b, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, - 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x78, 0x70, - 0x72, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x78, 0x70, 0x72, 0xf8, - 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x1a, 0x3c, + 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0f, + 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, + 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x70, 0x0a, 0x0e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x42, 0x6e, 0x0a, + 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x65, 0x78, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0b, 0x53, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, + 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/tools/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go b/tools/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go index af72196c8..3543268f8 100644 --- a/tools/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go +++ b/tools/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/tools/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE b/tools/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/tools/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/tools/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go b/tools/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go index 2f3ab9249..7bd161e48 100644 --- a/tools/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go +++ b/tools/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2022 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/rpc/error_details.proto package errdetails @@ -36,6 +36,112 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Describes the cause of the error with structured details. +// +// Example of an error when contacting the "pubsub.googleapis.com" API when it +// is not enabled: +// +// { "reason": "API_DISABLED" +// "domain": "googleapis.com" +// "metadata": { +// "resource": "projects/123", +// "service": "pubsub.googleapis.com" +// } +// } +// +// This response indicates that the pubsub.googleapis.com API is not enabled. +// +// Example of an error that is returned when attempting to create a Spanner +// instance in a region that is out of stock: +// +// { "reason": "STOCKOUT" +// "domain": "spanner.googleapis.com", +// "metadata": { +// "availableRegions": "us-central1,us-east2" +// } +// } +type ErrorInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The reason of the error. This is a constant value that identifies the + // proximate cause of the error. Error reasons are unique within a particular + // domain of errors. This should be at most 63 characters and match a + // regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + // UPPER_SNAKE_CASE. + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` + // The logical grouping to which the "reason" belongs. The error domain + // is typically the registered service name of the tool or product that + // generates the error. Example: "pubsub.googleapis.com". If the error is + // generated by some common infrastructure, the error domain must be a + // globally unique value that identifies the infrastructure. For Google API + // infrastructure, the error domain is "googleapis.com". + Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` + // Additional structured details about this error. + // + // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + // length. When identifying the current value of an exceeded limit, the units + // should be contained in the key, not the value. For example, rather than + // {"instanceLimit": "100/request"}, should be returned as, + // {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + // instances that can be created in a single (batch) request. + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ErrorInfo) Reset() { + *x = ErrorInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_google_rpc_error_details_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ErrorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ErrorInfo) ProtoMessage() {} + +func (x *ErrorInfo) ProtoReflect() protoreflect.Message { + mi := &file_google_rpc_error_details_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) +} + +// Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. +func (*ErrorInfo) Descriptor() ([]byte, []int) { + return file_google_rpc_error_details_proto_rawDescGZIP(), []int{0} +} + +func (x *ErrorInfo) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *ErrorInfo) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +func (x *ErrorInfo) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + // Describes when the clients can retry a failed request. Clients could ignore // the recommendation here or retry when this information is missing from error // responses. @@ -61,7 +167,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_google_rpc_error_details_proto_msgTypes[0] + mi := &file_google_rpc_error_details_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -74,7 +180,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_rpc_error_details_proto_msgTypes[0] + mi := &file_google_rpc_error_details_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -87,7 +193,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_google_rpc_error_details_proto_rawDescGZIP(), []int{0} + return file_google_rpc_error_details_proto_rawDescGZIP(), []int{1} } func (x *RetryInfo) GetRetryDelay() *durationpb.Duration { @@ -112,7 +218,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_google_rpc_error_details_proto_msgTypes[1] + mi := &file_google_rpc_error_details_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -125,7 +231,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_rpc_error_details_proto_msgTypes[1] + mi := &file_google_rpc_error_details_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -138,7 +244,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_google_rpc_error_details_proto_rawDescGZIP(), []int{1} + return file_google_rpc_error_details_proto_rawDescGZIP(), []int{2} } func (x *DebugInfo) GetStackEntries() []string { @@ -178,7 +284,7 @@ type QuotaFailure struct { func (x *QuotaFailure) Reset() { *x = QuotaFailure{} if protoimpl.UnsafeEnabled { - mi := &file_google_rpc_error_details_proto_msgTypes[2] + mi := &file_google_rpc_error_details_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -191,7 +297,7 @@ func (x *QuotaFailure) String() string { func (*QuotaFailure) ProtoMessage() {} func (x *QuotaFailure) ProtoReflect() protoreflect.Message { - mi := &file_google_rpc_error_details_proto_msgTypes[2] + mi := &file_google_rpc_error_details_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -204,7 +310,7 @@ func (x *QuotaFailure) ProtoReflect() protoreflect.Message { // Deprecated: Use QuotaFailure.ProtoReflect.Descriptor instead. func (*QuotaFailure) Descriptor() ([]byte, []int) { - return file_google_rpc_error_details_proto_rawDescGZIP(), []int{2} + return file_google_rpc_error_details_proto_rawDescGZIP(), []int{3} } func (x *QuotaFailure) GetViolations() []*QuotaFailure_Violation { @@ -214,111 +320,6 @@ func (x *QuotaFailure) GetViolations() []*QuotaFailure_Violation { return nil } -// Describes the cause of the error with structured details. -// -// Example of an error when contacting the "pubsub.googleapis.com" API when it -// is not enabled: -// -// { "reason": "API_DISABLED" -// "domain": "googleapis.com" -// "metadata": { -// "resource": "projects/123", -// "service": "pubsub.googleapis.com" -// } -// } -// -// This response indicates that the pubsub.googleapis.com API is not enabled. -// -// Example of an error that is returned when attempting to create a Spanner -// instance in a region that is out of stock: -// -// { "reason": "STOCKOUT" -// "domain": "spanner.googleapis.com", -// "metadata": { -// "availableRegions": "us-central1,us-east2" -// } -// } -type ErrorInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The reason of the error. This is a constant value that identifies the - // proximate cause of the error. Error reasons are unique within a particular - // domain of errors. This should be at most 63 characters and match - // /[A-Z0-9_]+/. - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` - // The logical grouping to which the "reason" belongs. The error domain - // is typically the registered service name of the tool or product that - // generates the error. Example: "pubsub.googleapis.com". If the error is - // generated by some common infrastructure, the error domain must be a - // globally unique value that identifies the infrastructure. For Google API - // infrastructure, the error domain is "googleapis.com". - Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` - // Additional structured details about this error. - // - // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in - // length. When identifying the current value of an exceeded limit, the units - // should be contained in the key, not the value. For example, rather than - // {"instanceLimit": "100/request"}, should be returned as, - // {"instanceLimitPerRequest": "100"}, if the client exceeds the number of - // instances that can be created in a single (batch) request. - Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *ErrorInfo) Reset() { - *x = ErrorInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_google_rpc_error_details_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ErrorInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ErrorInfo) ProtoMessage() {} - -func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_rpc_error_details_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) -} - -// Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. -func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_google_rpc_error_details_proto_rawDescGZIP(), []int{3} -} - -func (x *ErrorInfo) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *ErrorInfo) GetDomain() string { - if x != nil { - return x.Domain - } - return "" -} - -func (x *ErrorInfo) GetMetadata() map[string]string { - if x != nil { - return x.Metadata - } - return nil -} - // Describes what preconditions have failed. // // For example, if an RPC failed because it required the Terms of Service to be @@ -495,7 +496,8 @@ type ResourceInfo struct { ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` // The name of the resource being accessed. For example, a shared calendar // name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current - // error is [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + // error is + // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. ResourceName string `protobuf:"bytes,2,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // The owner of the resource (optional). // For example, "user:" or "project: google.protobuf.Duration - 10, // 1: google.rpc.QuotaFailure.violations:type_name -> google.rpc.QuotaFailure.Violation - 11, // 2: google.rpc.ErrorInfo.metadata:type_name -> google.rpc.ErrorInfo.MetadataEntry + 10, // 0: google.rpc.ErrorInfo.metadata:type_name -> google.rpc.ErrorInfo.MetadataEntry + 15, // 1: google.rpc.RetryInfo.retry_delay:type_name -> google.protobuf.Duration + 11, // 2: google.rpc.QuotaFailure.violations:type_name -> google.rpc.QuotaFailure.Violation 12, // 3: google.rpc.PreconditionFailure.violations:type_name -> google.rpc.PreconditionFailure.Violation 13, // 4: google.rpc.BadRequest.field_violations:type_name -> google.rpc.BadRequest.FieldViolation 14, // 5: google.rpc.Help.links:type_name -> google.rpc.Help.Link @@ -1089,7 +1125,7 @@ func file_google_rpc_error_details_proto_init() { } if !protoimpl.UnsafeEnabled { file_google_rpc_error_details_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetryInfo); i { + switch v := v.(*ErrorInfo); i { case 0: return &v.state case 1: @@ -1101,7 +1137,7 @@ func file_google_rpc_error_details_proto_init() { } } file_google_rpc_error_details_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DebugInfo); i { + switch v := v.(*RetryInfo); i { case 0: return &v.state case 1: @@ -1113,7 +1149,7 @@ func file_google_rpc_error_details_proto_init() { } } file_google_rpc_error_details_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuotaFailure); i { + switch v := v.(*DebugInfo); i { case 0: return &v.state case 1: @@ -1125,7 +1161,7 @@ func file_google_rpc_error_details_proto_init() { } } file_google_rpc_error_details_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorInfo); i { + switch v := v.(*QuotaFailure); i { case 0: return &v.state case 1: @@ -1208,7 +1244,7 @@ func file_google_rpc_error_details_proto_init() { return nil } } - file_google_rpc_error_details_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_google_rpc_error_details_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QuotaFailure_Violation); i { case 0: return &v.state diff --git a/tools/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/tools/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go index f34a38e4e..a6b508188 100644 --- a/tools/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go +++ b/tools/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2022 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/rpc/status.proto package status @@ -48,11 +48,13 @@ type Status struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + // The status code, which should be an enum value of + // [google.rpc.Code][google.rpc.Code]. Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // A developer-facing error message, which should be in English. Any // user-facing error message should be localized and sent in the - // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized + // by the client. Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // A list of messages that carry the error details. There is a common set of // message types for APIs to use. diff --git a/tools/vendor/google.golang.org/grpc/CONTRIBUTING.md b/tools/vendor/google.golang.org/grpc/CONTRIBUTING.md index 52338d004..8e001134d 100644 --- a/tools/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/tools/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -20,6 +20,19 @@ 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. +- For speculative changes, consider opening an issue and discussing it first. If + you are suggesting a behavioral or API change, consider starting with a [gRFC + proposal](https://github.com/grpc/proposal). + +- 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 +45,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/tools/vendor/google.golang.org/grpc/balancer/balancer.go b/tools/vendor/google.golang.org/grpc/balancer/balancer.go index 392b21fb2..09d61dd1b 100644 --- a/tools/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/tools/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(). + Metatada metadata.MD } // TransientFailureError returns e. It exists for backward compatibility and diff --git a/tools/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/tools/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 64a232f28..8cd89dab9 100644 --- a/tools/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/tools/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,14 +18,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc-gen-go v1.28.1 +// protoc v4.22.0 // source: grpc/binlog/v1/binarylog.proto package grpc_binarylog_v1 import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" @@ -41,10 +40,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - // Enumerates the type of event // Note the terminology is different from the RPC semantics // definition, but the same meaning is expressed here. diff --git a/tools/vendor/google.golang.org/grpc/clientconn.go b/tools/vendor/google.golang.org/grpc/clientconn.go index 422639c79..b9cc05507 100644 --- a/tools/vendor/google.golang.org/grpc/clientconn.go +++ b/tools/vendor/google.golang.org/grpc/clientconn.go @@ -146,8 +146,18 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil}) cc.ctx, cc.cancel = context.WithCancel(context.Background()) - 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 { @@ -256,7 +266,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * if err != nil { return nil, err } - cc.authority, err = determineAuthority(cc.parsedTarget.Endpoint, cc.target, cc.dopts) + cc.authority, err = determineAuthority(cc.parsedTarget.Endpoint(), cc.target, cc.dopts) if err != nil { return nil, err } @@ -788,10 +798,16 @@ func (cc *ClientConn) incrCallsFailed() { func (ac *addrConn) connect() error { ac.mu.Lock() if ac.state == connectivity.Shutdown { + if logger.V(2) { + logger.Infof("connect called on shutdown addrConn; ignoring.") + } ac.mu.Unlock() return errConnClosing } if ac.state != connectivity.Idle { + if logger.V(2) { + logger.Infof("connect called on addrConn in non-idle state (%v); ignoring.", ac.state) + } ac.mu.Unlock() return nil } @@ -928,7 +944,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, @@ -1097,7 +1113,11 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) return } 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) } @@ -1231,9 +1251,11 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne addr.ServerName = ac.cc.getServerName(addr) hctx, hcancel := context.WithCancel(ac.ctx) - onClose := grpcsync.OnceFunc(func() { + onClose := func(r transport.GoAwayReason) { ac.mu.Lock() defer ac.mu.Unlock() + // adjust params based on GoAwayReason + ac.adjustParams(r) 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 @@ -1254,20 +1276,17 @@ 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) 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) + } // newTr is either nil, or closed. hcancel() channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %s. Err: %v", addr, err) @@ -1371,7 +1390,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) } } }() @@ -1522,6 +1541,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() { @@ -1582,30 +1604,17 @@ func (cc *ClientConn) parseTargetAndFindResolver() (resolver.Builder, error) { } // 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 } diff --git a/tools/vendor/google.golang.org/grpc/codes/code_string.go b/tools/vendor/google.golang.org/grpc/codes/code_string.go index 0b206a578..934fac2b0 100644 --- a/tools/vendor/google.golang.org/grpc/codes/code_string.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/credentials/tls.go b/tools/vendor/google.golang.org/grpc/credentials/tls.go index ce2bbc10a..877b7cd21 100644 --- a/tools/vendor/google.golang.org/grpc/credentials/tls.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/dialoptions.go b/tools/vendor/google.golang.org/grpc/dialoptions.go index 9372dc322..e9d6852fd 100644 --- a/tools/vendor/google.golang.org/grpc/dialoptions.go +++ b/tools/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 @@ -82,7 +84,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 +97,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,13 +123,28 @@ 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 // 32KB. // -// Zero will disable the write buffer such that each write will be on underlying -// connection. Note: A Send call may not directly translate to a write. +// Zero or negative values will disable the write buffer such that each write +// will be on underlying connection. Note: A Send call may not directly +// translate to a write. func WithWriteBufferSize(s int) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.WriteBufferSize = s @@ -127,8 +154,9 @@ func WithWriteBufferSize(s int) DialOption { // WithReadBufferSize lets you set the size of read buffer, this determines how // much data can be read at most for each read syscall. // -// The default value for this buffer is 32KB. Zero will disable read buffer for -// a connection so data framer can access the underlying conn directly. +// The default value for this buffer is 32KB. Zero or negative values will +// disable read buffer for a connection so data framer can access the +// underlying conn directly. func WithReadBufferSize(s int) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.ReadBufferSize = s diff --git a/tools/vendor/google.golang.org/grpc/encoding/encoding.go b/tools/vendor/google.golang.org/grpc/encoding/encoding.go index 711763d54..07a586135 100644 --- a/tools/vendor/google.golang.org/grpc/encoding/encoding.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/encoding/gzip/gzip.go b/tools/vendor/google.golang.org/grpc/encoding/gzip/gzip.go index ca820bd47..a3bb173c2 100644 --- a/tools/vendor/google.golang.org/grpc/encoding/gzip/gzip.go +++ b/tools/vendor/google.golang.org/grpc/encoding/gzip/gzip.go @@ -30,7 +30,6 @@ import ( "encoding/binary" "fmt" "io" - "io/ioutil" "sync" "google.golang.org/grpc/encoding" @@ -42,7 +41,7 @@ const Name = "gzip" func init() { c := &compressor{} c.poolCompressor.New = func() interface{} { - return &writer{Writer: gzip.NewWriter(ioutil.Discard), pool: &c.poolCompressor} + return &writer{Writer: gzip.NewWriter(io.Discard), pool: &c.poolCompressor} } encoding.RegisterCompressor(c) } @@ -63,7 +62,7 @@ func SetLevel(level int) error { } c := encoding.GetCompressor(Name).(*compressor) c.poolCompressor.New = func() interface{} { - w, err := gzip.NewWriterLevel(ioutil.Discard, level) + w, err := gzip.NewWriterLevel(io.Discard, level) if err != nil { panic(err) } diff --git a/tools/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/tools/vendor/google.golang.org/grpc/grpclog/loggerv2.go index b5560b47e..5de66e40d 100644 --- a/tools/vendor/google.golang.org/grpc/grpclog/loggerv2.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go b/tools/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go index 809d73cca..af03a40d9 100644 --- a/tools/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go +++ b/tools/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go @@ -28,8 +28,10 @@ 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. type Logger interface { GetMethodLogger(methodName string) MethodLogger } @@ -40,8 +42,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/tools/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/tools/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go index 179f4a26d..56fcf008d 100644 --- a/tools/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go +++ b/tools/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" ) @@ -49,7 +50,7 @@ var idGen callIDGenerator // MethodLogger is the sub-logger for each method. type MethodLogger interface { - Log(LogEntryConfig) + Log(context.Context, LogEntryConfig) } // TruncatingMethodLogger is a method logger that truncates headers and messages @@ -79,7 +80,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 +88,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 } @@ -121,7 +122,7 @@ func (ml *TruncatingMethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated // but not counted towards the size limit. continue } - currentEntryLen := uint64(len(entry.Value)) + currentEntryLen := uint64(len(entry.GetKey())) + uint64(len(entry.GetValue())) if currentEntryLen > bytesLimit { break } @@ -132,7 +133,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 } @@ -145,7 +146,7 @@ func (ml *TruncatingMethodLogger) truncateMessage(msgPb *pb.Message) (truncated // LogEntryConfig represents the configuration for binary log entry. type LogEntryConfig interface { - toProto() *pb.GrpcLogEntry + toProto() *binlogpb.GrpcLogEntry } // ClientHeader configs the binary log entry to be a ClientHeader entry. @@ -159,10 +160,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 +171,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 +196,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 +224,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 +239,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 +264,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 +279,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 +301,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 +325,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 +341,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 +353,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 +368,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 +393,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 +411,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/tools/vendor/google.golang.org/grpc/internal/binarylog/sink.go b/tools/vendor/google.golang.org/grpc/internal/binarylog/sink.go index c2fdd58b3..264de387c 100644 --- a/tools/vendor/google.golang.org/grpc/internal/binarylog/sink.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/tools/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 7edd196bd..5ba9d94d4 100644 --- a/tools/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/tools/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -21,19 +21,42 @@ 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) ) + +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/tools/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/tools/vendor/google.golang.org/grpc/internal/envconfig/xds.go index af09711a3..04136882c 100644 --- a/tools/vendor/google.golang.org/grpc/internal/envconfig/xds.go +++ b/tools/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,40 @@ 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") + XDSClientSideSecurity = boolFromEnv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", true) // 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") + 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", false) // XDSRLS indicates whether processing of Cluster Specifier plugins and // support for the RLS CLuster Specifier is enabled, which can be enabled by // setting the environment variable "GRPC_EXPERIMENTAL_XDS_RLS_LB" to // "true". - XDSRLS = strings.EqualFold(os.Getenv(rlsInXDSEnv), "true") + XDSRLS = boolFromEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB", false) // C2PResolverTestOnlyTrafficDirectorURI is the TD URI for testing. - C2PResolverTestOnlyTrafficDirectorURI = os.Getenv(c2pResolverTestOnlyTrafficDirectorURIEnv) + C2PResolverTestOnlyTrafficDirectorURI = os.Getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI") ) diff --git a/tools/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/tools/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go index 82af70e96..02224b42c 100644 --- a/tools/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/internal/internal.go b/tools/vendor/google.golang.org/grpc/internal/internal.go index fd0ee3dca..836b6a3b3 100644 --- a/tools/vendor/google.golang.org/grpc/internal/internal.go +++ b/tools/vendor/google.golang.org/grpc/internal/internal.go @@ -58,6 +58,9 @@ 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. + 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 @@ -74,9 +77,16 @@ var ( // globally for newly created client channels. The priority will be: 1. // user-provided; 2. this method; 3. default values. AddGlobalDialOptions interface{} // func(opt ...DialOption) + // DisableGlobalDialOptions returns a DialOption that prevents the + // ClientConn from applying the global DialOptions (set via + // AddGlobalDialOptions). + DisableGlobalDialOptions interface{} // func() grpc.DialOption // ClearGlobalDialOptions clears the array of extra DialOption. This // method is useful in testing and benchmarking. 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 @@ -127,6 +137,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/tools/vendor/google.golang.org/grpc/internal/metadata/metadata.go b/tools/vendor/google.golang.org/grpc/internal/metadata/metadata.go index b2980f8ac..c82e608e0 100644 --- a/tools/vendor/google.golang.org/grpc/internal/metadata/metadata.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/tools/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index 75301c514..09a667f33 100644 --- a/tools/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/tools/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 } @@ -140,10 +140,10 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts disableServiceConfig: opts.DisableServiceConfig, } - if target.Authority == "" { + if target.URL.Host == "" { d.resolver = defaultResolver } else { - d.resolver, err = customAuthorityResolver(target.Authority) + d.resolver, err = customAuthorityResolver(target.URL.Host) if err != nil { return nil, err } diff --git a/tools/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/tools/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go index 520d9229e..afac56572 100644 --- a/tools/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go +++ b/tools/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go @@ -20,13 +20,20 @@ // name without scheme back to gRPC as resolved address. package passthrough -import "google.golang.org/grpc/resolver" +import ( + "errors" + + "google.golang.org/grpc/resolver" +) 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 { + return nil, errors.New("passthrough: received empty target in Build()") + } r := &passthroughResolver{ target: target, cc: cc, @@ -45,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/tools/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go b/tools/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go index 7f1a702ca..160911687 100644 --- a/tools/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go +++ b/tools/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go @@ -34,8 +34,8 @@ type builder struct { } func (b *builder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) { - if target.Authority != "" { - return nil, fmt.Errorf("invalid (non-empty) authority: %v", target.Authority) + if target.URL.Host != "" { + return nil, fmt.Errorf("invalid (non-empty) authority: %v", target.URL.Host) } // gRPC was parsing the dial target manually before PR #4817, and we diff --git a/tools/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/tools/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index 409769f48..c343c23a5 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/tools/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -22,6 +22,7 @@ import ( "bytes" "errors" "fmt" + "net" "runtime" "strconv" "sync" @@ -191,7 +192,7 @@ type goAway struct { code http2.ErrCode debugData []byte headsUp bool - closeConn bool + closeConn error // if set, loopyWriter will exit, resulting in conn closure } func (*goAway) isTransportResponseFrame() bool { return false } @@ -209,6 +210,14 @@ type outFlowControlSizeRequest struct { func (*outFlowControlSizeRequest) isTransportResponseFrame() bool { return false } +// closeConnection is an instruction to tell the loopy writer to flush the +// framer and exit, which will cause the transport's connection to be closed +// (by the client or server). The transport itself will close after the reader +// encounters the EOF caused by the connection closure. +type closeConnection struct{} + +func (closeConnection) isTransportResponseFrame() bool { return false } + type outStreamState int const ( @@ -408,7 +417,7 @@ func (c *controlBuffer) get(block bool) (interface{}, error) { select { case <-c.ch: case <-c.done: - return nil, ErrConnClosing + return nil, errors.New("transport closed by client") } } } @@ -478,12 +487,13 @@ type loopyWriter struct { hEnc *hpack.Encoder // HPACK encoder. bdpEst *bdpEstimator draining bool + conn net.Conn // 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) *loopyWriter { var buf bytes.Buffer l := &loopyWriter{ side: s, @@ -496,6 +506,7 @@ func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimato hBuf: &buf, hEnc: hpack.NewEncoder(&buf), bdpEst: bdpEst, + conn: conn, } return l } @@ -513,23 +524,26 @@ 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 err == ErrConnClosing { - // Don't log ErrConnClosing as error since it happens - // 1. When the connection is closed by some other known issue. - // 2. User closed the connection. - // 3. A graceful close of connection. - if logger.V(logLevel) { - logger.Infof("transport: loopyWriter.run returning. %v", err) - } - err = nil + if logger.V(logLevel) { + logger.Infof("transport: 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) @@ -574,7 +588,6 @@ func (l *loopyWriter) run() (err error) { } l.framer.writer.Flush() break hasdata - } } } @@ -583,11 +596,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 { @@ -595,10 +608,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 { @@ -606,13 +618,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, @@ -620,7 +630,6 @@ func (l *loopyWriter) registerStreamHandler(h *registerStream) error { wq: h.wq, } l.estdStreams[h.streamID] = str - return nil } func (l *loopyWriter) headerHandler(h *headerFrame) error { @@ -655,19 +664,20 @@ 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) - if err := hdr.initStream(str.id); err != nil { - if err == ErrConnClosing { - return err - } - // Other errors(errStreamDrain) need not close transport. +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 { + return err + } if err := l.writeHeader(str.id, hdr.endStream, hdr.hf, hdr.onWrite); err != nil { return err } @@ -721,10 +731,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. @@ -733,7 +743,6 @@ func (l *loopyWriter) preprocessData(df *dataFrame) error { str.state = active l.activeStreams.enqueue(str) } - return nil } func (l *loopyWriter) pingHandler(p *ping) error { @@ -744,9 +753,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 { @@ -763,8 +771,9 @@ func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { return err } } - if l.side == clientSide && l.draining && len(l.estdStreams) == 0 { - return ErrConnClosing + 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 } @@ -799,7 +808,8 @@ func (l *loopyWriter) incomingGoAwayHandler(*incomingGoAway) error { if l.side == clientSide { l.draining = true if len(l.estdStreams) == 0 { - return ErrConnClosing + // Flush and close the connection; we are done with it. + return errors.New("received GOAWAY with no active streams") } } return nil @@ -820,7 +830,7 @@ func (l *loopyWriter) goAwayHandler(g *goAway) error { 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: @@ -830,7 +840,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: @@ -838,19 +848,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: + // 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: @@ -869,7 +884,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 @@ -903,7 +917,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/tools/vendor/google.golang.org/grpc/internal/transport/defaults.go b/tools/vendor/google.golang.org/grpc/internal/transport/defaults.go index 9fa306b2e..bc8ee0747 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/defaults.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/tools/vendor/google.golang.org/grpc/internal/transport/handler_server.go index fb272235d..e6626bf96 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/tools/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -46,24 +46,32 @@ import ( "google.golang.org/grpc/status" ) -// NewServerHandlerTransport returns a ServerTransport handling gRPC -// from inside an http.Handler. It requires that the http Server -// supports HTTP/2. +// NewServerHandlerTransport returns a ServerTransport handling gRPC from +// inside an http.Handler, or writes an HTTP error to w and returns an error. +// It requires that the http Server supports HTTP/2. func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler) (ServerTransport, error) { if r.ProtoMajor != 2 { - return nil, errors.New("gRPC requires HTTP/2") + msg := "gRPC requires HTTP/2" + http.Error(w, msg, http.StatusBadRequest) + return nil, errors.New(msg) } if r.Method != "POST" { - return nil, errors.New("invalid gRPC request method") + msg := fmt.Sprintf("invalid gRPC request method %q", r.Method) + http.Error(w, msg, http.StatusBadRequest) + return nil, errors.New(msg) } contentType := r.Header.Get("Content-Type") // TODO: do we assume contentType is lowercase? we did before contentSubtype, validContentType := grpcutil.ContentSubtype(contentType) if !validContentType { - return nil, errors.New("invalid gRPC request content-type") + msg := fmt.Sprintf("invalid gRPC request content-type %q", contentType) + http.Error(w, msg, http.StatusUnsupportedMediaType) + return nil, errors.New(msg) } if _, ok := w.(http.Flusher); !ok { - return nil, errors.New("gRPC requires a ResponseWriter supporting http.Flusher") + msg := "gRPC requires a ResponseWriter supporting http.Flusher" + http.Error(w, msg, http.StatusInternalServerError) + return nil, errors.New(msg) } st := &serverHandlerTransport{ @@ -79,7 +87,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s if v := r.Header.Get("grpc-timeout"); v != "" { to, err := decodeTimeout(v) if err != nil { - return nil, status.Errorf(codes.Internal, "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) } st.timeoutSet = true st.timeout = to @@ -97,7 +107,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s for _, v := range vv { v, err := decodeMetadataHeader(k, v) if err != nil { - return nil, status.Errorf(codes.Internal, "malformed binary metadata: %v", err) + msg := fmt.Sprintf("malformed binary metadata %q in header %q: %v", v, k, err) + http.Error(w, msg, http.StatusBadRequest) + return nil, status.Error(codes.Internal, msg) } metakv = append(metakv, k, v) } @@ -141,12 +153,15 @@ type serverHandlerTransport struct { stats []stats.Handler } -func (ht *serverHandlerTransport) Close() { - ht.closeOnce.Do(ht.closeCloseChanOnce) +func (ht *serverHandlerTransport) Close(err error) { + ht.closeOnce.Do(func() { + if logger.V(logLevel) { + logger.Infof("Closing serverHandlerTransport: %v", err) + } + close(ht.closedCh) + }) } -func (ht *serverHandlerTransport) closeCloseChanOnce() { close(ht.closedCh) } - func (ht *serverHandlerTransport) RemoteAddr() net.Addr { return strAddr(ht.req.RemoteAddr) } // strAddr is a net.Addr backed by either a TCP "ip:port" string, or @@ -236,7 +251,7 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro }) } } - ht.Close() + ht.Close(errors.New("finished writing status")) return err } @@ -346,7 +361,7 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace case <-ht.req.Context().Done(): } cancel() - ht.Close() + ht.Close(errors.New("request is done processing")) }() req := ht.req diff --git a/tools/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/tools/vendor/google.golang.org/grpc/internal/transport/http2_client.go index d518b07e1..9826feb8c 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/tools/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -59,11 +59,15 @@ var clientConnectionCounter uint64 // http2Client implements the ClientTransport interface with HTTP2. type http2Client struct { - lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. - ctx context.Context - cancel context.CancelFunc - ctxDone <-chan struct{} // Cache the ctx.Done() chan. - userAgent string + lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. + ctx context.Context + cancel context.CancelFunc + ctxDone <-chan struct{} // Cache the ctx.Done() chan. + userAgent string + // address contains the resolver returned address for this transport. + // If the `ServerName` field is set, it takes precedence over `CallHdr.Host` + // passed to `NewStream`, when determining the :authority header. + address resolver.Address md metadata.MD conn net.Conn // underlying communication channel loopy *loopyWriter @@ -136,8 +140,7 @@ type http2Client struct { channelzID *channelz.Identifier czData *channelzData - onGoAway func(GoAwayReason) - onClose func() + onClose func(GoAwayReason) bufferPool *bufferPool @@ -193,7 +196,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() { @@ -213,7 +216,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 @@ -238,8 +241,11 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts go func(conn net.Conn) { defer ctxMonitorDone.Fire() // Signal this goroutine has exited. <-newClientCtx.Done() // Block until connectCtx expires or the defer above executes. - if connectCtx.Err() != nil { + 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) + } conn.Close() } }(conn) @@ -314,6 +320,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts cancel: cancel, userAgent: opts.UserAgent, registeredCompressors: grpcutil.RegisteredCompressors(), + address: addr, conn: conn, remoteAddr: conn.RemoteAddr(), localAddr: conn.LocalAddr(), @@ -335,7 +342,6 @@ 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, @@ -438,17 +444,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 err != nil { - if logger.V(logLevel) { - logger.Errorf("transport: loopyWriter.run returning. 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.loopy.run() close(t.writerDone) }() return t, nil @@ -702,6 +699,18 @@ func (e NewStreamError) Error() string { // streams. All non-nil errors returned will be *NewStreamError. func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) { ctx = peer.NewContext(ctx, t.getPeer()) + + // ServerName field of the resolver returned address takes precedence over + // Host field of CallHdr to determine the :authority header. This is because, + // the ServerName field takes precedence for server authentication during + // TLS handshake, and the :authority header should match the value used + // for server authentication. + if t.address.ServerName != "" { + newCallHdr := *callHdr + newCallHdr.Host = t.address.ServerName + callHdr = &newCallHdr + } + headerFields, err := t.createHeaderFields(ctx, callHdr) if err != nil { return nil, &NewStreamError{Err: err, AllowTransparentRetry: false} @@ -726,15 +735,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) @@ -752,6 +758,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 { @@ -767,6 +774,11 @@ 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() @@ -846,6 +858,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, sh.HandleRPC(s.ctx, outHeader) } } + if transportDrainRequired { + if logger.V(logLevel) { + logger.Infof("transport: t.nextID > MaxStreamID. Draining") + } + t.GracefulClose() + } return s, nil } @@ -934,9 +952,14 @@ func (t *http2Client) Close(err error) { t.mu.Unlock() return } + if logger.V(logLevel) { + logger.Infof("transport: 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 @@ -986,11 +1009,15 @@ func (t *http2Client) GracefulClose() { t.mu.Unlock() return } + if logger.V(logLevel) { + logger.Infof("transport: GracefulClose called") + } + t.onClose(GoAwayInvalid) t.state = draining active := len(t.activeStreams) t.mu.Unlock() if active == 0 { - t.Close(ErrConnClosing) + t.Close(connectionErrorf(true, nil, "no active streams left to process while draining")) return } t.controlBuf.put(&incomingGoAway{}) @@ -1148,7 +1175,7 @@ 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) + logger.Warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error: %v", f.ErrCode) } statusCode = codes.Unknown } @@ -1230,10 +1257,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 { @@ -1266,8 +1295,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. @@ -1756,3 +1787,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/tools/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/tools/vendor/google.golang.org/grpc/internal/transport/http2_server.go index 3dd15647b..99ae1a737 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/tools/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -21,6 +21,7 @@ package transport import ( "bytes" "context" + "errors" "fmt" "io" "math" @@ -41,6 +42,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcrand" + "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" @@ -101,13 +103,13 @@ type http2Server struct { mu sync.Mutex // guard the following - // drainChan is initialized when Drain() is called the first time. - // After which the server writes out the first GoAway(with ID 2^31-1) frame. - // Then an independent goroutine will be launched to later send the second GoAway. - // During this time we don't want to write another first GoAway(with ID 2^31 -1) frame. - // Thus call to Drain() will be a no-op if drainChan is already initialized since draining is - // already underway. - drainChan chan struct{} + // drainEvent is initialized when Drain() is called the first time. After + // which the server writes out the first GoAway(with ID 2^31-1) frame. Then + // an independent goroutine will be launched to later send the second + // GoAway. During this time we don't want to write another first GoAway(with + // ID 2^31 -1) frame. Thus call to Drain() will be a no-op if drainEvent is + // already initialized since draining is already underway. + drainEvent *grpcsync.Event state transportState activeStreams map[uint32]*Stream // idle is the time instant when the connection went idle. @@ -293,7 +295,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, defer func() { if err != nil { - t.Close() + t.Close(err) } }() @@ -329,23 +331,18 @@ 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.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler - if err := t.loopy.run(); err != nil { - if logger.V(logLevel) { - logger.Errorf("transport: loopyWriter.run returning. Err: %v", err) - } - } - t.conn.Close() - t.controlBuf.finish() + t.loopy.run() close(t.writerDone) }() go t.keepalive() return t, nil } -// operateHeader takes action on the decoded headers. -func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) (fatal bool) { +// operateHeaders takes action on the decoded headers. Returns an error if fatal +// error encountered and transport needs to close, otherwise returns nil. +func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) error { // Acquire max stream ID lock for entire duration t.maxStreamMu.Lock() defer t.maxStreamMu.Unlock() @@ -361,15 +358,12 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( rstCode: http2.ErrCodeFrameSize, onWrite: func() {}, }) - return false + return nil } if streamID%2 != 1 || streamID <= t.maxStreamID { // illegal gRPC stream id. - if logger.V(logLevel) { - logger.Errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", streamID) - } - return true + return fmt.Errorf("received an illegal stream id: %v. headers frame: %+v", streamID, frame) } t.maxStreamID = streamID @@ -381,13 +375,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 @@ -398,11 +393,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": @@ -413,7 +420,7 @@ 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 @@ -421,14 +428,14 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( if logger.V(logLevel) { logger.Errorf("transport: http2Server.operateHeaders parsed a :connection header which makes a 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 + headerError = status.Newf(codes.Internal, "malformed binary metadata %q in header %q: %v", hf.Value, hf.Name, err) logger.Warningf("Failed to decode metadata header (%q, %q): %v", hf.Name, hf.Value, err) break } @@ -447,23 +454,43 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( logger.Errorf("transport: %v", errMsg) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 400, + httpStatus: http.StatusBadRequest, streamID: streamID, contentSubtype: s.contentSubtype, status: status.New(codes.Internal, errMsg), rst: !frame.StreamEnded(), }) - return false + return nil } - if !isGRPC || headerError { + if protocolError { t.controlBuf.put(&cleanupStream{ streamID: streamID, rst: true, rstCode: http2.ErrCodeProtocol, onWrite: func() {}, }) - return false + 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 @@ -503,7 +530,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( if t.state != reachable { t.mu.Unlock() s.cancel() - return false + return nil } if uint32(len(t.activeStreams)) >= t.maxStreams { t.mu.Unlock() @@ -514,7 +541,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( onWrite: func() {}, }) s.cancel() - return false + return nil } if httpMethod != http.MethodPost { t.mu.Unlock() @@ -530,7 +557,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( rst: !frame.StreamEnded(), }) s.cancel() - return false + return nil } if t.inTapHandle != nil { var err error @@ -550,7 +577,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( status: stat, rst: !frame.StreamEnded(), }) - return false + return nil } } t.activeStreams[streamID] = s @@ -574,7 +601,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) } @@ -597,7 +624,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( wq: s.wq, }) handle(s) - return false + return nil } // HandleStreams receives incoming streams using the given handler. This is @@ -630,19 +657,16 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. continue } if err == io.EOF || err == io.ErrUnexpectedEOF { - t.Close() + t.Close(err) return } - if logger.V(logLevel) { - logger.Warningf("transport: http2Server.HandleStreams failed to read frame: %v", err) - } - t.Close() + t.Close(err) return } switch frame := frame.(type) { case *http2.MetaHeadersFrame: - if t.operateHeaders(frame, handle, traceCtx) { - t.Close() + if err := t.operateHeaders(frame, handle, traceCtx); err != nil { + t.Close(err) break } case *http2.DataFrame: @@ -843,8 +867,8 @@ const ( func (t *http2Server) handlePing(f *http2.PingFrame) { if f.IsAck() { - if f.Data == goAwayPing.data && t.drainChan != nil { - close(t.drainChan) + if f.Data == goAwayPing.data && t.drainEvent != nil { + t.drainEvent.Fire() return } // Maybe it's a BDP ping. @@ -886,10 +910,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) { if t.pingStrikes > maxPingStrikes { // Send goaway and close the connection. - if logger.V(logLevel) { - logger.Errorf("transport: Got too many pings from the client, closing the connection.") - } - t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true}) + t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: errors.New("got too many pings from the client")}) } } @@ -1153,7 +1174,7 @@ func (t *http2Server) keepalive() { if logger.V(logLevel) { logger.Infof("transport: closing server transport due to maximum connection age.") } - t.Close() + t.controlBuf.put(closeConnection{}) case <-t.done: } return @@ -1169,10 +1190,7 @@ func (t *http2Server) keepalive() { continue } if outstandingPing && kpTimeoutLeft <= 0 { - if logger.V(logLevel) { - logger.Infof("transport: closing server transport due to idleness.") - } - t.Close() + t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Time)) return } if !outstandingPing { @@ -1199,12 +1217,15 @@ func (t *http2Server) keepalive() { // Close starts shutting down the http2Server transport. // TODO(zhaoq): Now the destruction is not blocked on any pending streams. This // could cause some resource issue. Revisit this later. -func (t *http2Server) Close() { +func (t *http2Server) Close(err error) { t.mu.Lock() if t.state == closing { t.mu.Unlock() return } + if logger.V(logLevel) { + logger.Infof("transport: closing: %v", err) + } t.state = closing streams := t.activeStreams t.activeStreams = nil @@ -1295,10 +1316,10 @@ func (t *http2Server) RemoteAddr() net.Addr { func (t *http2Server) Drain() { t.mu.Lock() defer t.mu.Unlock() - if t.drainChan != nil { + if t.drainEvent != nil { return } - t.drainChan = make(chan struct{}) + t.drainEvent = grpcsync.NewEvent() t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte{}, headsUp: true}) } @@ -1319,19 +1340,17 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { // Stop accepting more streams now. t.state = draining sid := t.maxStreamID + retErr := g.closeConn if len(t.activeStreams) == 0 { - g.closeConn = true + retErr = errors.New("second GOAWAY written and no active streams left to process") } t.mu.Unlock() t.maxStreamMu.Unlock() if err := t.framer.fr.WriteGoAway(sid, g.code, g.debugData); err != nil { return false, err } - if g.closeConn { - // Abruptly close the connection following the GoAway (via - // loopywriter). But flush out what's inside the buffer first. - t.framer.writer.Flush() - return false, fmt.Errorf("transport: Connection closing") + if retErr != nil { + return false, retErr } return true, nil } @@ -1353,7 +1372,7 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { timer := time.NewTimer(time.Minute) defer timer.Stop() select { - case <-t.drainChan: + case <-t.drainEvent.Done(): case <-timer.C: case <-t.done: return diff --git a/tools/vendor/google.golang.org/grpc/internal/transport/http_util.go b/tools/vendor/google.golang.org/grpc/internal/transport/http_util.go index 2c601a864..8fcae4f4d 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/http_util.go +++ b/tools/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -21,6 +21,7 @@ package transport import ( "bufio" "encoding/base64" + "errors" "fmt" "io" "math" @@ -330,7 +331,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 +354,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/tools/vendor/google.golang.org/grpc/internal/transport/transport.go b/tools/vendor/google.golang.org/grpc/internal/transport/transport.go index 2e615ee20..1b7d7fabc 100644 --- a/tools/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/tools/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 @@ -701,7 +720,7 @@ type ServerTransport interface { // Close tears down the transport. Once it is called, the transport // should not be accessed any more. All the pending streams and their // handlers will be terminated asynchronously. - Close() + Close(err error) // RemoteAddr returns the remote network address. RemoteAddr() net.Addr diff --git a/tools/vendor/google.golang.org/grpc/metadata/metadata.go b/tools/vendor/google.golang.org/grpc/metadata/metadata.go index fb4a88f59..a2cdcaf12 100644 --- a/tools/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/picker_wrapper.go b/tools/vendor/google.golang.org/grpc/picker_wrapper.go index a5d5516ee..c525dc070 100644 --- a/tools/vendor/google.golang.org/grpc/picker_wrapper.go +++ b/tools/vendor/google.golang.org/grpc/picker_wrapper.go @@ -58,12 +58,18 @@ func (pw *pickerWrapper) updatePicker(p balancer.Picker) { pw.mu.Unlock() } -func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) func(balancer.DoneInfo) { +// 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(acw *acBalancerWrapper, result *balancer.PickResult) { acw.mu.Lock() ac := acw.ac acw.mu.Unlock() 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 +88,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 +96,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 +117,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 +131,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 +141,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,7 +149,7 @@ 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) @@ -154,9 +159,10 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } if t := acw.getAddrConn().getReadyTransport(); t != nil { if channelz.IsOn() { - return t, doneChannelzWrapper(acw, pickResult.Done), nil + doneChannelzWrapper(acw, &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. diff --git a/tools/vendor/google.golang.org/grpc/pickfirst.go b/tools/vendor/google.golang.org/grpc/pickfirst.go index fb7a99e0a..fc91b4d26 100644 --- a/tools/vendor/google.golang.org/grpc/pickfirst.go +++ b/tools/vendor/google.golang.org/grpc/pickfirst.go @@ -51,7 +51,7 @@ type pickfirstBalancer struct { 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 @@ -102,8 +102,8 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState b.subConn = subConn b.state = connectivity.Idle b.cc.UpdateState(balancer.State{ - ConnectivityState: connectivity.Idle, - Picker: &picker{result: balancer.PickResult{SubConn: b.subConn}}, + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, }) b.subConn.Connect() return nil diff --git a/tools/vendor/google.golang.org/grpc/regenerate.sh b/tools/vendor/google.golang.org/grpc/regenerate.sh index 99db79faf..a6f26c8ab 100644 --- a/tools/vendor/google.golang.org/grpc/regenerate.sh +++ b/tools/vendor/google.golang.org/grpc/regenerate.sh @@ -57,7 +57,8 @@ LEGACY_SOURCES=( ${WORKDIR}/grpc-proto/grpc/health/v1/health.proto ${WORKDIR}/grpc-proto/grpc/lb/v1/load_balancer.proto profiling/proto/service.proto - reflection/grpc_reflection_v1alpha/reflection.proto + ${WORKDIR}/grpc-proto/grpc/reflection/v1alpha/reflection.proto + ${WORKDIR}/grpc-proto/grpc/reflection/v1/reflection.proto ) # Generates only the new gRPC Service symbols @@ -119,8 +120,4 @@ mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/ # see grpc_testing_not_regenerate/README.md for details. rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testing_not_regenerate/*.pb.go -# grpc/testing does not have a go_package option. -mv ${WORKDIR}/out/grpc/testing/*.pb.go interop/grpc_testing/ -mv ${WORKDIR}/out/grpc/core/*.pb.go interop/grpc_testing/core/ - cp -R ${WORKDIR}/out/google.golang.org/grpc/* . diff --git a/tools/vendor/google.golang.org/grpc/resolver/resolver.go b/tools/vendor/google.golang.org/grpc/resolver/resolver.go index 967cbc737..6215e5ef2 100644 --- a/tools/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/tools/vendor/google.golang.org/grpc/resolver/resolver.go @@ -24,6 +24,7 @@ import ( "context" "net" "net/url" + "strings" "google.golang.org/grpc/attributes" "google.golang.org/grpc/credentials" @@ -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 @@ -202,6 +204,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 +258,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 +265,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 +290,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/tools/vendor/google.golang.org/grpc/rpc_util.go b/tools/vendor/google.golang.org/grpc/rpc_util.go index 934fc1aa0..2030736a3 100644 --- a/tools/vendor/google.golang.org/grpc/rpc_util.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/server.go b/tools/vendor/google.golang.org/grpc/server.go index f4dde72b4..087b9ad7c 100644 --- a/tools/vendor/google.golang.org/grpc/server.go +++ b/tools/vendor/google.golang.org/grpc/server.go @@ -45,6 +45,7 @@ import ( "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 +75,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 @@ -183,7 +184,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 { @@ -233,10 +234,11 @@ func newJoinServerOption(opts ...ServerOption) ServerOption { return &joinServerOption{opts: opts} } -// WriteBufferSize 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 32KB. -// Zero will disable the write buffer such that each write will be on underlying connection. +// WriteBufferSize 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 +// 32KB. Zero or negative values will disable the write buffer such that each +// write will be on underlying connection. // Note: A Send call may not directly translate to a write. func WriteBufferSize(s int) ServerOption { return newFuncServerOption(func(o *serverOptions) { @@ -244,11 +246,10 @@ func WriteBufferSize(s int) ServerOption { }) } -// ReadBufferSize lets you set the size of read buffer, this determines how much data can be read at most -// for one read syscall. -// The default value for this buffer is 32KB. -// Zero will disable read buffer for a connection so data framer can access the underlying -// conn directly. +// ReadBufferSize lets you set the size of read buffer, this determines how much +// data can be read at most for one read syscall. The default value for this +// buffer is 32KB. Zero or negative values will disable read buffer for a +// connection so data framer can access the underlying conn directly. func ReadBufferSize(s int) ServerOption { return newFuncServerOption(func(o *serverOptions) { o.readBufferSize = s @@ -600,7 +601,7 @@ func (s *Server) stopServerWorkers() { // 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 { @@ -942,7 +943,7 @@ func (s *Server) newHTTP2Transport(c net.Conn) transport.ServerTransport { } func (s *Server) serveStreams(st transport.ServerTransport) { - defer st.Close() + defer st.Close(errors.New("finished serving streams for the server transport")) var wg sync.WaitGroup var roundRobinCounter uint32 @@ -1008,7 +1009,8 @@ var _ http.Handler = (*Server)(nil) func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers) if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) + // Errors returned from transport.NewServerHandlerTransport have + // already been written to w. return } if !s.addConn(listenerAddressForServeHTTP, st) { @@ -1046,7 +1048,7 @@ func (s *Server) addConn(addr string, st transport.ServerTransport) bool { s.mu.Lock() defer s.mu.Unlock() if s.conns == nil { - st.Close() + st.Close(errors.New("Server.addConn called when server has already been stopped")) return false } if s.drain { @@ -1150,21 +1152,16 @@ func chainUnaryServerInterceptors(s *Server) { func chainUnaryInterceptors(interceptors []UnaryServerInterceptor) UnaryServerInterceptor { return func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (interface{}, error) { - // the struct ensures the variables are allocated together, rather than separately, since we - // know they should be garbage collected together. This saves 1 allocation and decreases - // time/call by about 10% on the microbenchmark. - var state struct { - i int - next UnaryHandler - } - state.next = func(ctx context.Context, req interface{}) (interface{}, error) { - if state.i == len(interceptors)-1 { - return interceptors[state.i](ctx, req, info, handler) - } - state.i++ - return interceptors[state.i-1](ctx, req, info, state.next) - } - return state.next(ctx, req) + return interceptors[0](ctx, req, info, getChainUnaryHandler(interceptors, 0, info, handler)) + } +} + +func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info *UnaryServerInfo, finalHandler UnaryHandler) UnaryHandler { + if curr == len(interceptors)-1 { + return finalHandler + } + return func(ctx context.Context, req interface{}) (interface{}, error) { + return interceptors[curr+1](ctx, req, info, getChainUnaryHandler(interceptors, curr+1, info, finalHandler)) } } @@ -1256,7 +1253,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) } } @@ -1267,6 +1264,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. @@ -1287,12 +1285,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) } } @@ -1303,7 +1307,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 } @@ -1316,11 +1320,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 { @@ -1328,7 +1333,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 { @@ -1361,7 +1366,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{ @@ -1369,7 +1374,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 @@ -1379,6 +1384,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). @@ -1406,8 +1416,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 @@ -1421,8 +1431,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() { @@ -1434,17 +1444,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. @@ -1470,21 +1479,16 @@ func chainStreamServerInterceptors(s *Server) { func chainStreamInterceptors(interceptors []StreamServerInterceptor) StreamServerInterceptor { return func(srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler) error { - // the struct ensures the variables are allocated together, rather than separately, since we - // know they should be garbage collected together. This saves 1 allocation and decreases - // time/call by about 10% on the microbenchmark. - var state struct { - i int - next StreamHandler - } - state.next = func(srv interface{}, ss ServerStream) error { - if state.i == len(interceptors)-1 { - return interceptors[state.i](srv, ss, info, handler) - } - state.i++ - return interceptors[state.i-1](srv, ss, info, state.next) - } - return state.next(srv, ss) + return interceptors[0](srv, ss, info, getChainStreamHandler(interceptors, 0, info, handler)) + } +} + +func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, info *StreamServerInfo, finalHandler StreamHandler) StreamHandler { + if curr == len(interceptors)-1 { + return finalHandler + } + return func(srv interface{}, stream ServerStream) error { + return interceptors[curr+1](srv, stream, info, getChainStreamHandler(interceptors, curr+1, info, finalHandler)) } } @@ -1583,7 +1587,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) } } @@ -1606,12 +1610,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) } } @@ -1649,16 +1659,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 } @@ -1667,17 +1677,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) { @@ -1819,7 +1828,7 @@ func (s *Server) Stop() { } for _, cs := range conns { for st := range cs { - st.Close() + st.Close(errors.New("Server.Stop called")) } } if s.opts.numServerWorkers > 0 { @@ -1944,6 +1953,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. // @@ -1978,3 +2041,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/tools/vendor/google.golang.org/grpc/service_config.go b/tools/vendor/google.golang.org/grpc/service_config.go index 01bbb2025..f22acace4 100644 --- a/tools/vendor/google.golang.org/grpc/service_config.go +++ b/tools/vendor/google.golang.org/grpc/service_config.go @@ -226,7 +226,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{ @@ -254,7 +254,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { } d, err := parseDuration(m.Timeout) 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} } @@ -263,7 +263,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { Timeout: d, } 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 +283,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{}{} diff --git a/tools/vendor/google.golang.org/grpc/stats/stats.go b/tools/vendor/google.golang.org/grpc/stats/stats.go index 0285dcc6a..7a552a9b7 100644 --- a/tools/vendor/google.golang.org/grpc/stats/stats.go +++ b/tools/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/tools/vendor/google.golang.org/grpc/stream.go b/tools/vendor/google.golang.org/grpc/stream.go index 960c3e33d..d1226a412 100644 --- a/tools/vendor/google.golang.org/grpc/stream.go +++ b/tools/vendor/google.golang.org/grpc/stream.go @@ -168,10 +168,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 +361,7 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client } } for _, binlog := range cs.binlogs { - binlog.Log(logEntry) + binlog.Log(cs.ctx, logEntry) } } @@ -416,7 +425,7 @@ func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) ctx = trace.NewContext(ctx, trInfo.tr) } - if cs.cc.parsedTarget.Scheme == "xds" { + if cs.cc.parsedTarget.URL.Scheme == "xds" { // Add extra metadata (metadata that will be added by transport) to context // so the balancer can see them. ctx = grpcutil.WithExtraMetadata(ctx, metadata.Pairs( @@ -438,7 +447,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 +464,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.Metatada != 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.Metatada) + 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 +557,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 +809,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 +890,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 +914,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 +935,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 +962,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 +980,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 +1004,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 +1093,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 +1135,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, @@ -1464,6 +1496,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 +1524,8 @@ type serverStream struct { comp encoding.Compressor decomp encoding.Compressor + sendCompressorName string + maxReceiveMessageSize int maxSendMessageSize int trInfo *traceInfo @@ -1536,7 +1573,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 +1618,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 +1646,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 +1701,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 +1717,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 +1729,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/tools/vendor/google.golang.org/grpc/version.go b/tools/vendor/google.golang.org/grpc/version.go index 2198e7098..3c6e3c911 100644 --- a/tools/vendor/google.golang.org/grpc/version.go +++ b/tools/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.51.0" +const Version = "1.54.0" diff --git a/tools/vendor/google.golang.org/grpc/vet.sh b/tools/vendor/google.golang.org/grpc/vet.sh index bd8e0cdb3..a8e4732b3 100644 --- a/tools/vendor/google.golang.org/grpc/vet.sh +++ b/tools/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 @@ -121,8 +116,9 @@ done # # TODO(dfawley): don't use deprecated functions in examples or first-party # plugins. +# TODO(dfawley): enable ST1019 (duplicate imports) but allow for protobufs. SC_OUT="$(mktemp)" -staticcheck -go 1.9 -checks 'inherit,-ST1015' ./... > "${SC_OUT}" || true +staticcheck -go 1.19 -checks 'inherit,-ST1015,-ST1019,-SA1019' ./... > "${SC_OUT}" || true # Error if anything other than deprecation warnings are printed. not grep -v "is deprecated:.*SA1019" "${SC_OUT}" # Only ignore the following deprecated types/fields/functions. diff --git a/tools/vendor/gopkg.in/evanphx/json-patch.v5/.gitignore b/tools/vendor/gopkg.in/evanphx/json-patch.v5/.gitignore new file mode 100644 index 000000000..b7ed7f956 --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/.gitignore @@ -0,0 +1,6 @@ +# editor and IDE paraphernalia +.idea +.vscode + +# macOS paraphernalia +.DS_Store diff --git a/tools/vendor/gopkg.in/evanphx/json-patch.v5/LICENSE b/tools/vendor/gopkg.in/evanphx/json-patch.v5/LICENSE new file mode 100644 index 000000000..df76d7d77 --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014, Evan Phoenix +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 the Evan Phoenix 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/tools/vendor/gopkg.in/evanphx/json-patch.v5/README.md b/tools/vendor/gopkg.in/evanphx/json-patch.v5/README.md new file mode 100644 index 000000000..28e351693 --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/README.md @@ -0,0 +1,317 @@ +# JSON-Patch +`jsonpatch` is a library which provides functionality for both applying +[RFC6902 JSON patches](http://tools.ietf.org/html/rfc6902) against documents, as +well as for calculating & applying [RFC7396 JSON merge patches](https://tools.ietf.org/html/rfc7396). + +[![GoDoc](https://godoc.org/github.com/evanphx/json-patch?status.svg)](http://godoc.org/github.com/evanphx/json-patch) +[![Build Status](https://travis-ci.org/evanphx/json-patch.svg?branch=master)](https://travis-ci.org/evanphx/json-patch) +[![Report Card](https://goreportcard.com/badge/github.com/evanphx/json-patch)](https://goreportcard.com/report/github.com/evanphx/json-patch) + +# Get It! + +**Latest and greatest**: +```bash +go get -u github.com/evanphx/json-patch/v5 +``` + +**Stable Versions**: +* Version 5: `go get -u gopkg.in/evanphx/json-patch.v5` +* Version 4: `go get -u gopkg.in/evanphx/json-patch.v4` + +(previous versions below `v3` are unavailable) + +# Use It! +* [Create and apply a merge patch](#create-and-apply-a-merge-patch) +* [Create and apply a JSON Patch](#create-and-apply-a-json-patch) +* [Comparing JSON documents](#comparing-json-documents) +* [Combine merge patches](#combine-merge-patches) + + +# Configuration + +* There is a global configuration variable `jsonpatch.SupportNegativeIndices`. + This defaults to `true` and enables the non-standard practice of allowing + negative indices to mean indices starting at the end of an array. This + functionality can be disabled by setting `jsonpatch.SupportNegativeIndices = + false`. + +* There is a global configuration variable `jsonpatch.AccumulatedCopySizeLimit`, + which limits the total size increase in bytes caused by "copy" operations in a + patch. It defaults to 0, which means there is no limit. + +These global variables control the behavior of `jsonpatch.Apply`. + +An alternative to `jsonpatch.Apply` is `jsonpatch.ApplyWithOptions` whose behavior +is controlled by an `options` parameter of type `*jsonpatch.ApplyOptions`. + +Structure `jsonpatch.ApplyOptions` includes the configuration options above +and adds two new options: `AllowMissingPathOnRemove` and `EnsurePathExistsOnAdd`. + +When `AllowMissingPathOnRemove` is set to `true`, `jsonpatch.ApplyWithOptions` will ignore +`remove` operations whose `path` points to a non-existent location in the JSON document. +`AllowMissingPathOnRemove` defaults to `false` which will lead to `jsonpatch.ApplyWithOptions` +returning an error when hitting a missing `path` on `remove`. + +When `EnsurePathExistsOnAdd` is set to `true`, `jsonpatch.ApplyWithOptions` will make sure +that `add` operations produce all the `path` elements that are missing from the target object. + +Use `jsonpatch.NewApplyOptions` to create an instance of `jsonpatch.ApplyOptions` +whose values are populated from the global configuration variables. + +## Create and apply a merge patch +Given both an original JSON document and a modified JSON document, you can create +a [Merge Patch](https://tools.ietf.org/html/rfc7396) document. + +It can describe the changes needed to convert from the original to the +modified JSON document. + +Once you have a merge patch, you can apply it to other JSON documents using the +`jsonpatch.MergePatch(document, patch)` function. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + // Let's create a merge patch from these two documents... + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + target := []byte(`{"name": "Jane", "age": 24}`) + + patch, err := jsonpatch.CreateMergePatch(original, target) + if err != nil { + panic(err) + } + + // Now lets apply the patch against a different JSON document... + + alternative := []byte(`{"name": "Tina", "age": 28, "height": 3.75}`) + modifiedAlternative, err := jsonpatch.MergePatch(alternative, patch) + + fmt.Printf("patch document: %s\n", patch) + fmt.Printf("updated alternative doc: %s\n", modifiedAlternative) +} +``` + +When ran, you get the following output: + +```bash +$ go run main.go +patch document: {"height":null,"name":"Jane"} +updated alternative doc: {"age":28,"name":"Jane"} +``` + +## Create and apply a JSON Patch +You can create patch objects using `DecodePatch([]byte)`, which can then +be applied against JSON documents. + +The following is an example of creating a patch from two operations, and +applying it against a JSON document. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + patchJSON := []byte(`[ + {"op": "replace", "path": "/name", "value": "Jane"}, + {"op": "remove", "path": "/height"} + ]`) + + patch, err := jsonpatch.DecodePatch(patchJSON) + if err != nil { + panic(err) + } + + modified, err := patch.Apply(original) + if err != nil { + panic(err) + } + + fmt.Printf("Original document: %s\n", original) + fmt.Printf("Modified document: %s\n", modified) +} +``` + +When ran, you get the following output: + +```bash +$ go run main.go +Original document: {"name": "John", "age": 24, "height": 3.21} +Modified document: {"age":24,"name":"Jane"} +``` + +## Comparing JSON documents +Due to potential whitespace and ordering differences, one cannot simply compare +JSON strings or byte-arrays directly. + +As such, you can instead use `jsonpatch.Equal(document1, document2)` to +determine if two JSON documents are _structurally_ equal. This ignores +whitespace differences, and key-value ordering. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + similar := []byte(` + { + "age": 24, + "height": 3.21, + "name": "John" + } + `) + different := []byte(`{"name": "Jane", "age": 20, "height": 3.37}`) + + if jsonpatch.Equal(original, similar) { + fmt.Println(`"original" is structurally equal to "similar"`) + } + + if !jsonpatch.Equal(original, different) { + fmt.Println(`"original" is _not_ structurally equal to "different"`) + } +} +``` + +When ran, you get the following output: +```bash +$ go run main.go +"original" is structurally equal to "similar" +"original" is _not_ structurally equal to "different" +``` + +## Combine merge patches +Given two JSON merge patch documents, it is possible to combine them into a +single merge patch which can describe both set of changes. + +The resulting merge patch can be used such that applying it results in a +document structurally similar as merging each merge patch to the document +in succession. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + + nameAndHeight := []byte(`{"height":null,"name":"Jane"}`) + ageAndEyes := []byte(`{"age":4.23,"eyes":"blue"}`) + + // Let's combine these merge patch documents... + combinedPatch, err := jsonpatch.MergeMergePatches(nameAndHeight, ageAndEyes) + if err != nil { + panic(err) + } + + // Apply each patch individual against the original document + withoutCombinedPatch, err := jsonpatch.MergePatch(original, nameAndHeight) + if err != nil { + panic(err) + } + + withoutCombinedPatch, err = jsonpatch.MergePatch(withoutCombinedPatch, ageAndEyes) + if err != nil { + panic(err) + } + + // Apply the combined patch against the original document + + withCombinedPatch, err := jsonpatch.MergePatch(original, combinedPatch) + if err != nil { + panic(err) + } + + // Do both result in the same thing? They should! + if jsonpatch.Equal(withCombinedPatch, withoutCombinedPatch) { + fmt.Println("Both JSON documents are structurally the same!") + } + + fmt.Printf("combined merge patch: %s", combinedPatch) +} +``` + +When ran, you get the following output: +```bash +$ go run main.go +Both JSON documents are structurally the same! +combined merge patch: {"age":4.23,"eyes":"blue","height":null,"name":"Jane"} +``` + +# CLI for comparing JSON documents +You can install the commandline program `json-patch`. + +This program can take multiple JSON patch documents as arguments, +and fed a JSON document from `stdin`. It will apply the patch(es) against +the document and output the modified doc. + +**patch.1.json** +```json +[ + {"op": "replace", "path": "/name", "value": "Jane"}, + {"op": "remove", "path": "/height"} +] +``` + +**patch.2.json** +```json +[ + {"op": "add", "path": "/address", "value": "123 Main St"}, + {"op": "replace", "path": "/age", "value": "21"} +] +``` + +**document.json** +```json +{ + "name": "John", + "age": 24, + "height": 3.21 +} +``` + +You can then run: + +```bash +$ go install github.com/evanphx/json-patch/cmd/json-patch +$ cat document.json | json-patch -p patch.1.json -p patch.2.json +{"address":"123 Main St","age":"21","name":"Jane"} +``` + +# Help It! +Contributions are welcomed! Leave [an issue](https://github.com/evanphx/json-patch/issues) +or [create a PR](https://github.com/evanphx/json-patch/compare). + + +Before creating a pull request, we'd ask that you make sure tests are passing +and that you have added new tests when applicable. + +Contributors can run tests using: + +```bash +go test -cover ./... +``` + +Builds for pull requests are tested automatically +using [TravisCI](https://travis-ci.org/evanphx/json-patch). diff --git a/tools/vendor/gopkg.in/evanphx/json-patch.v5/errors.go b/tools/vendor/gopkg.in/evanphx/json-patch.v5/errors.go new file mode 100644 index 000000000..75304b443 --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/tools/vendor/gopkg.in/evanphx/json-patch.v5/merge.go b/tools/vendor/gopkg.in/evanphx/json-patch.v5/merge.go new file mode 100644 index 000000000..ad88d4018 --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/merge.go @@ -0,0 +1,389 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "reflect" +) + +func merge(cur, patch *lazyNode, mergeMerge bool) *lazyNode { + curDoc, err := cur.intoDoc() + + if err != nil { + pruneNulls(patch) + return patch + } + + patchDoc, err := patch.intoDoc() + + if err != nil { + return patch + } + + mergeDocs(curDoc, patchDoc, mergeMerge) + + return cur +} + +func mergeDocs(doc, patch *partialDoc, mergeMerge bool) { + for k, v := range *patch { + if v == nil { + if mergeMerge { + (*doc)[k] = nil + } else { + delete(*doc, k) + } + } else { + cur, ok := (*doc)[k] + + if !ok || cur == nil { + if !mergeMerge { + pruneNulls(v) + } + + (*doc)[k] = v + } else { + (*doc)[k] = merge(cur, v, mergeMerge) + } + } + } +} + +func pruneNulls(n *lazyNode) { + sub, err := n.intoDoc() + + if err == nil { + pruneDocNulls(sub) + } else { + ary, err := n.intoAry() + + if err == nil { + pruneAryNulls(ary) + } + } +} + +func pruneDocNulls(doc *partialDoc) *partialDoc { + for k, v := range *doc { + if v == nil { + delete(*doc, k) + } else { + pruneNulls(v) + } + } + + return doc +} + +func pruneAryNulls(ary *partialArray) *partialArray { + newAry := []*lazyNode{} + + for _, v := range *ary { + if v != nil { + pruneNulls(v) + } + newAry = append(newAry, v) + } + + *ary = newAry + + return ary +} + +var ErrBadJSONDoc = fmt.Errorf("Invalid JSON Document") +var ErrBadJSONPatch = fmt.Errorf("Invalid JSON Patch") +var errBadMergeTypes = fmt.Errorf("Mismatched JSON Documents") + +// MergeMergePatches merges two merge patches together, such that +// applying this resulting merged merge patch to a document yields the same +// as merging each merge patch to the document in succession. +func MergeMergePatches(patch1Data, patch2Data []byte) ([]byte, error) { + return doMergePatch(patch1Data, patch2Data, true) +} + +// MergePatch merges the patchData into the docData. +func MergePatch(docData, patchData []byte) ([]byte, error) { + return doMergePatch(docData, patchData, false) +} + +func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) { + doc := &partialDoc{} + + docErr := json.Unmarshal(docData, doc) + + patch := &partialDoc{} + + patchErr := json.Unmarshal(patchData, patch) + + if _, ok := docErr.(*json.SyntaxError); ok { + return nil, ErrBadJSONDoc + } + + if _, ok := patchErr.(*json.SyntaxError); ok { + return nil, ErrBadJSONPatch + } + + if docErr == nil && *doc == nil { + return nil, ErrBadJSONDoc + } + + if patchErr == nil && *patch == nil { + return nil, ErrBadJSONPatch + } + + if docErr != nil || patchErr != nil { + // Not an error, just not a doc, so we turn straight into the patch + if patchErr == nil { + if mergeMerge { + doc = patch + } else { + doc = pruneDocNulls(patch) + } + } else { + patchAry := &partialArray{} + patchErr = json.Unmarshal(patchData, patchAry) + + if patchErr != nil { + return nil, ErrBadJSONPatch + } + + pruneAryNulls(patchAry) + + out, patchErr := json.Marshal(patchAry) + + if patchErr != nil { + return nil, ErrBadJSONPatch + } + + return out, nil + } + } else { + mergeDocs(doc, patch, mergeMerge) + } + + return json.Marshal(doc) +} + +// resemblesJSONArray indicates whether the byte-slice "appears" to be +// a JSON array or not. +// False-positives are possible, as this function does not check the internal +// structure of the array. It only checks that the outer syntax is present and +// correct. +func resemblesJSONArray(input []byte) bool { + input = bytes.TrimSpace(input) + + hasPrefix := bytes.HasPrefix(input, []byte("[")) + hasSuffix := bytes.HasSuffix(input, []byte("]")) + + return hasPrefix && hasSuffix +} + +// CreateMergePatch will return a merge patch document capable of converting +// the original document(s) to the modified document(s). +// The parameters can be bytes of either two JSON Documents, or two arrays of +// JSON documents. +// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07 +func CreateMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalResemblesArray := resemblesJSONArray(originalJSON) + modifiedResemblesArray := resemblesJSONArray(modifiedJSON) + + // Do both byte-slices seem like JSON arrays? + if originalResemblesArray && modifiedResemblesArray { + return createArrayMergePatch(originalJSON, modifiedJSON) + } + + // Are both byte-slices are not arrays? Then they are likely JSON objects... + if !originalResemblesArray && !modifiedResemblesArray { + return createObjectMergePatch(originalJSON, modifiedJSON) + } + + // None of the above? Then return an error because of mismatched types. + return nil, errBadMergeTypes +} + +// createObjectMergePatch will return a merge-patch document capable of +// converting the original document to the modified document. +func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDoc := map[string]interface{}{} + modifiedDoc := map[string]interface{}{} + + err := json.Unmarshal(originalJSON, &originalDoc) + if err != nil { + return nil, ErrBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDoc) + if err != nil { + return nil, ErrBadJSONDoc + } + + dest, err := getDiff(originalDoc, modifiedDoc) + if err != nil { + return nil, err + } + + return json.Marshal(dest) +} + +// createArrayMergePatch will return an array of merge-patch documents capable +// of converting the original document to the modified document for each +// pair of JSON documents provided in the arrays. +// Arrays of mismatched sizes will result in an error. +func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDocs := []json.RawMessage{} + modifiedDocs := []json.RawMessage{} + + err := json.Unmarshal(originalJSON, &originalDocs) + if err != nil { + return nil, ErrBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDocs) + if err != nil { + return nil, ErrBadJSONDoc + } + + total := len(originalDocs) + if len(modifiedDocs) != total { + return nil, ErrBadJSONDoc + } + + result := []json.RawMessage{} + for i := 0; i < len(originalDocs); i++ { + original := originalDocs[i] + modified := modifiedDocs[i] + + patch, err := createObjectMergePatch(original, modified) + if err != nil { + return nil, err + } + + result = append(result, json.RawMessage(patch)) + } + + return json.Marshal(result) +} + +// Returns true if the array matches (must be json types). +// As is idiomatic for go, an empty array is not the same as a nil array. +func matchesArray(a, b []interface{}) bool { + if len(a) != len(b) { + return false + } + if (a == nil && b != nil) || (a != nil && b == nil) { + return false + } + for i := range a { + if !matchesValue(a[i], b[i]) { + return false + } + } + return true +} + +// Returns true if the values matches (must be json types) +// The types of the values must match, otherwise it will always return false +// If two map[string]interface{} are given, all elements must match. +func matchesValue(av, bv interface{}) bool { + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + return false + } + switch at := av.(type) { + case string: + bt := bv.(string) + if bt == at { + return true + } + case float64: + bt := bv.(float64) + if bt == at { + return true + } + case bool: + bt := bv.(bool) + if bt == at { + return true + } + case nil: + // Both nil, fine. + return true + case map[string]interface{}: + bt := bv.(map[string]interface{}) + if len(bt) != len(at) { + return false + } + for key := range bt { + av, aOK := at[key] + bv, bOK := bt[key] + if aOK != bOK { + return false + } + if !matchesValue(av, bv) { + return false + } + } + return true + case []interface{}: + bt := bv.([]interface{}) + return matchesArray(at, bt) + } + return false +} + +// getDiff returns the (recursive) difference between a and b as a map[string]interface{}. +func getDiff(a, b map[string]interface{}) (map[string]interface{}, error) { + into := map[string]interface{}{} + for key, bv := range b { + av, ok := a[key] + // value was added + if !ok { + into[key] = bv + continue + } + // If types have changed, replace completely + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + into[key] = bv + continue + } + // Types are the same, compare values + switch at := av.(type) { + case map[string]interface{}: + bt := bv.(map[string]interface{}) + dst := make(map[string]interface{}, len(bt)) + dst, err := getDiff(at, bt) + if err != nil { + return nil, err + } + if len(dst) > 0 { + into[key] = dst + } + case string, float64, bool: + if !matchesValue(av, bv) { + into[key] = bv + } + case []interface{}: + bt := bv.([]interface{}) + if !matchesArray(at, bt) { + into[key] = bv + } + case nil: + switch bv.(type) { + case nil: + // Both nil, fine. + default: + into[key] = bv + } + default: + panic(fmt.Sprintf("Unknown type:%T in key %s", av, key)) + } + } + // Now add all deleted values as nil + for key := range a { + _, found := b[key] + if !found { + into[key] = nil + } + } + return into, nil +} diff --git a/tools/vendor/gopkg.in/evanphx/json-patch.v5/patch.go b/tools/vendor/gopkg.in/evanphx/json-patch.v5/patch.go new file mode 100644 index 000000000..4bce5936d --- /dev/null +++ b/tools/vendor/gopkg.in/evanphx/json-patch.v5/patch.go @@ -0,0 +1,809 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/pkg/errors" +) + +const ( + eRaw = iota + eDoc + eAry +) + +var ( + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool = true + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 = 0 +) + +var ( + ErrTestFailed = errors.New("test failed") + ErrMissing = errors.New("missing value") + ErrUnknownType = errors.New("unknown object type") + ErrInvalid = errors.New("invalid state detected") + ErrInvalidIndex = errors.New("invalid index referenced") +) + +type lazyNode struct { + raw *json.RawMessage + doc partialDoc + ary partialArray + which int +} + +// Operation is a single JSON-Patch step, such as a single 'add' operation. +type Operation map[string]*json.RawMessage + +// Patch is an ordered collection of Operations. +type Patch []Operation + +type partialDoc map[string]*lazyNode +type partialArray []*lazyNode + +type container interface { + get(key string) (*lazyNode, error) + set(key string, val *lazyNode) error + add(key string, val *lazyNode) error + remove(key string) error +} + +func newLazyNode(raw *json.RawMessage) *lazyNode { + return &lazyNode{raw: raw, doc: nil, ary: nil, which: eRaw} +} + +func (n *lazyNode) MarshalJSON() ([]byte, error) { + switch n.which { + case eRaw: + return json.Marshal(n.raw) + case eDoc: + return json.Marshal(n.doc) + case eAry: + return json.Marshal(n.ary) + default: + return nil, ErrUnknownType + } +} + +func (n *lazyNode) UnmarshalJSON(data []byte) error { + dest := make(json.RawMessage, len(data)) + copy(dest, data) + n.raw = &dest + n.which = eRaw + return nil +} + +func deepCopy(src *lazyNode) (*lazyNode, int, error) { + if src == nil { + return nil, 0, nil + } + a, err := src.MarshalJSON() + if err != nil { + return nil, 0, err + } + sz := len(a) + ra := make(json.RawMessage, sz) + copy(ra, a) + return newLazyNode(&ra), sz, nil +} + +func (n *lazyNode) intoDoc() (*partialDoc, error) { + if n.which == eDoc { + return &n.doc, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return nil, err + } + + n.which = eDoc + return &n.doc, nil +} + +func (n *lazyNode) intoAry() (*partialArray, error) { + if n.which == eAry { + return &n.ary, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return nil, err + } + + n.which = eAry + return &n.ary, nil +} + +func (n *lazyNode) compact() []byte { + buf := &bytes.Buffer{} + + if n.raw == nil { + return nil + } + + err := json.Compact(buf, *n.raw) + + if err != nil { + return *n.raw + } + + return buf.Bytes() +} + +func (n *lazyNode) tryDoc() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return false + } + + n.which = eDoc + return true +} + +func (n *lazyNode) tryAry() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return false + } + + n.which = eAry + return true +} + +func (n *lazyNode) equal(o *lazyNode) bool { + if n.which == eRaw { + if !n.tryDoc() && !n.tryAry() { + if o.which != eRaw { + return false + } + + return bytes.Equal(n.compact(), o.compact()) + } + } + + if n.which == eDoc { + if o.which == eRaw { + if !o.tryDoc() { + return false + } + } + + if o.which != eDoc { + return false + } + + if len(n.doc) != len(o.doc) { + return false + } + + for k, v := range n.doc { + ov, ok := o.doc[k] + + if !ok { + return false + } + + if (v == nil) != (ov == nil) { + return false + } + + if v == nil && ov == nil { + continue + } + + if !v.equal(ov) { + return false + } + } + + return true + } + + if o.which != eAry && !o.tryAry() { + return false + } + + if len(n.ary) != len(o.ary) { + return false + } + + for idx, val := range n.ary { + if !val.equal(o.ary[idx]) { + return false + } + } + + return true +} + +// Kind reads the "op" field of the Operation. +func (o Operation) Kind() string { + if obj, ok := o["op"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +// Path reads the "path" field of the Operation. +func (o Operation) Path() (string, error) { + if obj, ok := o["path"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation missing path field") +} + +// From reads the "from" field of the Operation. +func (o Operation) From() (string, error) { + if obj, ok := o["from"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation, missing from field") +} + +func (o Operation) value() *lazyNode { + if obj, ok := o["value"]; ok { + return newLazyNode(obj) + } + + return nil +} + +// ValueInterface decodes the operation value into an interface. +func (o Operation) ValueInterface() (interface{}, error) { + if obj, ok := o["value"]; ok && obj != nil { + var v interface{} + + err := json.Unmarshal(*obj, &v) + + if err != nil { + return nil, err + } + + return v, nil + } + + return nil, errors.Wrapf(ErrMissing, "operation, missing value field") +} + +func isArray(buf []byte) bool { +Loop: + for _, c := range buf { + switch c { + case ' ': + case '\n': + case '\t': + continue + case '[': + return true + default: + break Loop + } + } + + return false +} + +func findObject(pd *container, path string) (container, string) { + doc := *pd + + split := strings.Split(path, "/") + + if len(split) < 2 { + return nil, "" + } + + parts := split[1 : len(split)-1] + + key := split[len(split)-1] + + var err error + + for _, part := range parts { + + next, ok := doc.get(decodePatchKey(part)) + + if next == nil || ok != nil { + return nil, "" + } + + if isArray(*next.raw) { + doc, err = next.intoAry() + + if err != nil { + return nil, "" + } + } else { + doc, err = next.intoDoc() + + if err != nil { + return nil, "" + } + } + } + + return doc, decodePatchKey(key) +} + +func (d *partialDoc) set(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) add(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) get(key string) (*lazyNode, error) { + return (*d)[key], nil +} + +func (d *partialDoc) remove(key string) error { + _, ok := (*d)[key] + if !ok { + return errors.Wrapf(ErrMissing, "Unable to remove nonexistent key: %s", key) + } + + delete(*d, key) + return nil +} + +// set should only be used to implement the "replace" operation, so "key" must +// be an already existing index in "d". +func (d *partialArray) set(key string, val *lazyNode) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + (*d)[idx] = val + return nil +} + +func (d *partialArray) add(key string, val *lazyNode) error { + if key == "-" { + *d = append(*d, val) + return nil + } + + idx, err := strconv.Atoi(key) + if err != nil { + return errors.Wrapf(err, "value was not a proper array index: '%s'", key) + } + + sz := len(*d) + 1 + + ary := make([]*lazyNode, sz) + + cur := *d + + if idx >= len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(ary) + } + + copy(ary[0:idx], cur[0:idx]) + ary[idx] = val + copy(ary[idx+1:], cur[idx:]) + + *d = ary + return nil +} + +func (d *partialArray) get(key string) (*lazyNode, error) { + idx, err := strconv.Atoi(key) + + if err != nil { + return nil, err + } + + if idx < 0 { + if !SupportNegativeIndices { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + if idx >= len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + return (*d)[idx], nil +} + +func (d *partialArray) remove(key string) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + cur := *d + + if idx >= len(cur) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(cur) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(cur) + } + + ary := make([]*lazyNode, len(cur)-1) + + copy(ary[0:idx], cur[0:idx]) + copy(ary[idx:], cur[idx+1:]) + + *d = ary + return nil + +} + +func (p Patch) add(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "add operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "add operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.add(key, op.value()) + if err != nil { + return errors.Wrapf(err, "error in add for path: '%s'", path) + } + + return nil +} + +func (p Patch) remove(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "remove operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "remove operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.remove(key) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) replace(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "replace operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing path: %s", path) + } + + _, ok := con.get(key) + if ok != nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing key: %s", path) + } + + err = con.set(key, op.value()) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) move(doc *container, op Operation) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode from") + } + + con, key := findObject(doc, from) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + err = con.remove(key) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode path") + } + + con, key = findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing destination path: %s", path) + } + + err = con.add(key, val) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", path) + } + + return nil +} + +func (p Patch) test(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "test operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "test operation does not apply: is missing path: %s", path) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in test for path: '%s'", path) + } + + if val == nil { + if op.value().raw == nil { + return nil + } + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } else if op.value() == nil { + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + + if val.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) +} + +func (p Patch) copy(doc *container, op Operation, accumulatedCopySize *int64) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "copy operation failed to decode from") + } + + con, key := findObject(doc, from) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in copy for from: '%s'", from) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "copy operation failed to decode path") + } + + con, key = findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing destination path: %s", path) + } + + valCopy, sz, err := deepCopy(val) + if err != nil { + return errors.Wrapf(err, "error while performing deep copy") + } + + (*accumulatedCopySize) += int64(sz) + if AccumulatedCopySizeLimit > 0 && *accumulatedCopySize > AccumulatedCopySizeLimit { + return NewAccumulatedCopySizeError(AccumulatedCopySizeLimit, *accumulatedCopySize) + } + + err = con.add(key, valCopy) + if err != nil { + return errors.Wrapf(err, "error while adding value during copy") + } + + return nil +} + +// Equal indicates if 2 JSON documents have the same structural equality. +func Equal(a, b []byte) bool { + ra := make(json.RawMessage, len(a)) + copy(ra, a) + la := newLazyNode(&ra) + + rb := make(json.RawMessage, len(b)) + copy(rb, b) + lb := newLazyNode(&rb) + + return la.equal(lb) +} + +// DecodePatch decodes the passed JSON document as an RFC 6902 patch. +func DecodePatch(buf []byte) (Patch, error) { + var p Patch + + err := json.Unmarshal(buf, &p) + + if err != nil { + return nil, err + } + + return p, nil +} + +// Apply mutates a JSON document according to the patch, and returns the new +// document. +func (p Patch) Apply(doc []byte) ([]byte, error) { + return p.ApplyIndent(doc, "") +} + +// ApplyIndent mutates a JSON document according to the patch, and returns the new +// document indented. +func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { + if len(doc) == 0 { + return doc, nil + } + + var pd container + if doc[0] == '[' { + pd = &partialArray{} + } else { + pd = &partialDoc{} + } + + err := json.Unmarshal(doc, pd) + + if err != nil { + return nil, err + } + + err = nil + + var accumulatedCopySize int64 + + for _, op := range p { + switch op.Kind() { + case "add": + err = p.add(&pd, op) + case "remove": + err = p.remove(&pd, op) + case "replace": + err = p.replace(&pd, op) + case "move": + err = p.move(&pd, op) + case "test": + err = p.test(&pd, op) + case "copy": + err = p.copy(&pd, op, &accumulatedCopySize) + default: + err = fmt.Errorf("Unexpected kind: %s", op.Kind()) + } + + if err != nil { + return nil, err + } + } + + if indent != "" { + return json.MarshalIndent(pd, "", indent) + } + + return json.Marshal(pd) +} + +// From http://tools.ietf.org/html/rfc6901#section-4 : +// +// Evaluation of each reference token begins by decoding any escaped +// character sequence. This is performed by first transforming any +// occurrence of the sequence '~1' to '/', and then transforming any +// occurrence of the sequence '~0' to '~'. + +var ( + rfc6901Decoder = strings.NewReplacer("~1", "/", "~0", "~") +) + +func decodePatchKey(k string) string { + return rfc6901Decoder.Replace(k) +} diff --git a/tools/vendor/helm.sh/helm/v3/internal/version/version.go b/tools/vendor/helm.sh/helm/v3/internal/version/version.go index bf2af39bb..3cfcfef92 100644 --- a/tools/vendor/helm.sh/helm/v3/internal/version/version.go +++ b/tools/vendor/helm.sh/helm/v3/internal/version/version.go @@ -29,7 +29,7 @@ var ( // // Increment major number for new feature additions and behavioral changes. // Increment minor number for bug fixes and performance enhancements. - version = "v3.10" + version = "v3.11" // metadata is extra build time data metadata = "" diff --git a/tools/vendor/helm.sh/helm/v3/pkg/action/action.go b/tools/vendor/helm.sh/helm/v3/pkg/action/action.go index 82760250f..016aec3f6 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/action/action.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/action/action.go @@ -101,8 +101,9 @@ type Configuration struct { // // TODO: This function is badly in need of a refactor. // TODO: As part of the refactor the duplicate code in cmd/helm/template.go should be removed -// This code has to do with writing files to disk. -func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Values, releaseName, outputDir string, subNotes, useReleaseName, includeCrds bool, pr postrender.PostRenderer, dryRun bool) ([]*release.Hook, *bytes.Buffer, string, error) { +// +// This code has to do with writing files to disk. +func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Values, releaseName, outputDir string, subNotes, useReleaseName, includeCrds bool, pr postrender.PostRenderer, dryRun, enableDNS bool) ([]*release.Hook, *bytes.Buffer, string, error) { hs := []*release.Hook{} b := bytes.NewBuffer(nil) @@ -130,9 +131,13 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu if err != nil { return hs, b, "", err } - files, err2 = engine.RenderWithClient(ch, values, restConfig) + e := engine.New(restConfig) + e.EnableDNS = enableDNS + files, err2 = e.Render(ch, values) } else { - files, err2 = engine.Render(ch, values) + var e engine.Engine + e.EnableDNS = enableDNS + files, err2 = e.Render(ch, values) } if err2 != nil { diff --git a/tools/vendor/helm.sh/helm/v3/pkg/action/install.go b/tools/vendor/helm.sh/helm/v3/pkg/action/install.go index fa5508234..9e1d89f0b 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/action/install.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/action/install.go @@ -69,6 +69,7 @@ type Install struct { ChartPathOptions ClientOnly bool + Force bool CreateNamespace bool DryRun bool DisableHooks bool @@ -96,6 +97,8 @@ type Install struct { APIVersions chartutil.VersionSet // Used by helm template to render charts with .Release.IsUpgrade. Ignored if Dry-Run is false IsUpgrade bool + // Enable DNS lookups when rendering templates + EnableDNS bool // Used by helm template to add the release as part of OutputDir path // OutputDir/ UseReleaseName bool @@ -256,7 +259,7 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma rel := i.createRelease(chrt, vals) var manifestDoc *bytes.Buffer - rel.Hooks, manifestDoc, rel.Info.Notes, err = i.cfg.renderResources(chrt, valuesToRender, i.ReleaseName, i.OutputDir, i.SubNotes, i.UseReleaseName, i.IncludeCRDs, i.PostRenderer, i.DryRun) + rel.Hooks, manifestDoc, rel.Info.Notes, err = i.cfg.renderResources(chrt, valuesToRender, i.ReleaseName, i.OutputDir, i.SubNotes, i.UseReleaseName, i.IncludeCRDs, i.PostRenderer, i.DryRun, i.EnableDNS) // Even for errors, attach this if available if manifestDoc != nil { rel.Manifest = manifestDoc.String() @@ -344,13 +347,17 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma return rel, err } rChan := make(chan resultMessage) + ctxChan := make(chan resultMessage) doneChan := make(chan struct{}) defer close(doneChan) go i.performInstall(rChan, rel, toBeAdopted, resources) - go i.handleContext(ctx, rChan, doneChan, rel) - result := <-rChan - //start preformInstall go routine - return result.r, result.e + go i.handleContext(ctx, ctxChan, doneChan, rel) + select { + case result := <-rChan: + return result.r, result.e + case result := <-ctxChan: + return result.r, result.e + } } func (i *Install) performInstall(c chan<- resultMessage, rel *release.Release, toBeAdopted kube.ResourceList, resources kube.ResourceList) { @@ -372,7 +379,7 @@ func (i *Install) performInstall(c chan<- resultMessage, rel *release.Release, t return } } else if len(resources) > 0 { - if _, err := i.cfg.KubeClient.Update(toBeAdopted, resources, false); err != nil { + if _, err := i.cfg.KubeClient.Update(toBeAdopted, resources, i.Force); err != nil { i.reportToRun(c, rel, err) return } @@ -456,10 +463,10 @@ func (i *Install) failRelease(rel *release.Release, err error) (*release.Release // // Roughly, this will return an error if name is // -// - empty -// - too long -// - already in use, and not deleted -// - used by a deleted release, and i.Replace is false +// - empty +// - too long +// - already in use, and not deleted +// - used by a deleted release, and i.Replace is false func (i *Install) availableName() error { start := i.ReleaseName diff --git a/tools/vendor/helm.sh/helm/v3/pkg/action/status.go b/tools/vendor/helm.sh/helm/v3/pkg/action/status.go index 1c556e28d..ee1c9d613 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/action/status.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/action/status.go @@ -17,6 +17,10 @@ limitations under the License. package action import ( + "bytes" + "errors" + + "helm.sh/helm/v3/pkg/kube" "helm.sh/helm/v3/pkg/release" ) @@ -32,6 +36,14 @@ type Status struct { // only affect print type table. // TODO Helm 4: Remove this flag and output the description by default. ShowDescription bool + + // ShowResources sets if the resources should be retrieved with the status. + // TODO Helm 4: Remove this flag and output the resources by default. + ShowResources bool + + // ShowResourcesTable is used with ShowResources. When true this will cause + // the resulting objects to be retrieved as a kind=table. + ShowResourcesTable bool } // NewStatus creates a new Status object with the given configuration. @@ -47,5 +59,37 @@ func (s *Status) Run(name string) (*release.Release, error) { return nil, err } - return s.cfg.releaseContent(name, s.Version) + if !s.ShowResources { + return s.cfg.releaseContent(name, s.Version) + } + + rel, err := s.cfg.releaseContent(name, s.Version) + if err != nil { + return nil, err + } + + if kubeClient, ok := s.cfg.KubeClient.(kube.InterfaceResources); ok { + var resources kube.ResourceList + if s.ShowResourcesTable { + resources, err = kubeClient.BuildTable(bytes.NewBufferString(rel.Manifest), false) + if err != nil { + return nil, err + } + } else { + resources, err = s.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), false) + if err != nil { + return nil, err + } + } + + resp, err := kubeClient.Get(resources, true) + if err != nil { + return nil, err + } + + rel.Info.Resources = resp + + return rel, nil + } + return nil, errors.New("unable to get kubeClient with interface InterfaceResources") } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/action/upgrade.go b/tools/vendor/helm.sh/helm/v3/pkg/action/upgrade.go index 690397d4a..8fb895df0 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/action/upgrade.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/action/upgrade.go @@ -103,6 +103,8 @@ type Upgrade struct { DependencyUpdate bool // Lock to control raceconditions when the process receives a SIGTERM Lock sync.Mutex + // Enable DNS lookups when rendering templates + EnableDNS bool } type resultMessage struct { @@ -231,7 +233,7 @@ func (u *Upgrade) prepareUpgrade(name string, chart *chart.Chart, vals map[strin return nil, nil, err } - hooks, manifestDoc, notesTxt, err := u.cfg.renderResources(chart, valuesToRender, "", "", u.SubNotes, false, false, u.PostRenderer, u.DryRun) + hooks, manifestDoc, notesTxt, err := u.cfg.renderResources(chart, valuesToRender, "", "", u.SubNotes, false, false, u.PostRenderer, u.DryRun, u.EnableDNS) if err != nil { return nil, nil, err } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/chart/dependency.go b/tools/vendor/helm.sh/helm/v3/pkg/chart/dependency.go index d9d4ee981..4ef5eeb32 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/chart/dependency.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/chart/dependency.go @@ -54,7 +54,7 @@ type Dependency struct { // loaded. func (d *Dependency) Validate() error { if d == nil { - return ValidationError("dependency cannot be an empty list") + return ValidationError("dependencies must not contain empty or null nodes") } d.Name = sanitizeString(d.Name) d.Version = sanitizeString(d.Version) diff --git a/tools/vendor/helm.sh/helm/v3/pkg/chart/metadata.go b/tools/vendor/helm.sh/helm/v3/pkg/chart/metadata.go index 7d16ecd1b..ae572abb7 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/chart/metadata.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/chart/metadata.go @@ -35,7 +35,7 @@ type Maintainer struct { // Validate checks valid data and sanitizes string characters. func (m *Maintainer) Validate() error { if m == nil { - return ValidationError("maintainer cannot be an empty list") + return ValidationError("maintainers must not contain empty or null nodes") } m.Name = sanitizeString(m.Name) m.Email = sanitizeString(m.Email) diff --git a/tools/vendor/helm.sh/helm/v3/pkg/cli/environment.go b/tools/vendor/helm.sh/helm/v3/pkg/cli/environment.go index ac3093629..dac2a4bc1 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/cli/environment.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/cli/environment.go @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -/*Package cli describes the operating environment for the Helm CLI. +/* +Package cli describes the operating environment for the Helm CLI. Helm's environment encapsulates all of the service dependencies Helm has. These dependencies are expressed as interfaces so that alternate implementations @@ -24,6 +25,7 @@ package cli import ( "fmt" + "net/http" "os" "strconv" "strings" @@ -32,6 +34,7 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/rest" + "helm.sh/helm/v3/internal/version" "helm.sh/helm/v3/pkg/helmpath" ) @@ -116,6 +119,10 @@ func New() *EnvSettings { ImpersonateGroup: &env.KubeAsGroups, WrapConfigFn: func(config *rest.Config) *rest.Config { config.Burst = env.BurstLimit + config.Wrap(func(rt http.RoundTripper) http.RoundTripper { + return &retryingRoundTripper{wrapped: rt} + }) + config.UserAgent = version.GetUserAgent() return config }, } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/cli/roundtripper.go b/tools/vendor/helm.sh/helm/v3/pkg/cli/roundtripper.go new file mode 100644 index 000000000..9cd4eacba --- /dev/null +++ b/tools/vendor/helm.sh/helm/v3/pkg/cli/roundtripper.go @@ -0,0 +1,80 @@ +/* +Copyright The Helm 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 cli + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "strings" +) + +type retryingRoundTripper struct { + wrapped http.RoundTripper +} + +func (rt *retryingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + return rt.roundTrip(req, 1, nil) +} + +func (rt *retryingRoundTripper) roundTrip(req *http.Request, retry int, prevResp *http.Response) (*http.Response, error) { + if retry < 0 { + return prevResp, nil + } + resp, rtErr := rt.wrapped.RoundTrip(req) + if rtErr != nil { + return resp, rtErr + } + if resp.StatusCode < 500 { + return resp, rtErr + } + if resp.Header.Get("content-type") != "application/json" { + return resp, rtErr + } + b, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + return resp, rtErr + } + + var ke kubernetesError + r := bytes.NewReader(b) + err = json.NewDecoder(r).Decode(&ke) + r.Seek(0, io.SeekStart) + resp.Body = io.NopCloser(r) + if err != nil { + return resp, rtErr + } + if ke.Code < 500 { + return resp, rtErr + } + // Matches messages like "etcdserver: leader changed" + if strings.HasSuffix(ke.Message, "etcdserver: leader changed") { + return rt.roundTrip(req, retry-1, resp) + } + // Matches messages like "rpc error: code = Unknown desc = raft proposal dropped" + if strings.HasSuffix(ke.Message, "raft proposal dropped") { + return rt.roundTrip(req, retry-1, resp) + } + return resp, rtErr +} + +type kubernetesError struct { + Message string `json:"message"` + Code int `json:"code"` +} diff --git a/tools/vendor/helm.sh/helm/v3/pkg/downloader/chart_downloader.go b/tools/vendor/helm.sh/helm/v3/pkg/downloader/chart_downloader.go index c532759b5..29a9d64c2 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/downloader/chart_downloader.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/downloader/chart_downloader.go @@ -294,32 +294,13 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, er } // TODO: Seems that picking first URL is not fully correct - u, err = url.Parse(cv.URLs[0]) + resolvedURL, err := repo.ResolveReferenceURL(rc.URL, cv.URLs[0]) + if err != nil { return u, errors.Errorf("invalid chart URL format: %s", ref) } - // If the URL is relative (no scheme), prepend the chart repo's base URL - if !u.IsAbs() { - repoURL, err := url.Parse(rc.URL) - if err != nil { - return repoURL, err - } - q := repoURL.Query() - // We need a trailing slash for ResolveReference to work, but make sure there isn't already one - repoURL.RawPath = strings.TrimSuffix(repoURL.RawPath, "/") + "/" - repoURL.Path = strings.TrimSuffix(repoURL.Path, "/") + "/" - u = repoURL.ResolveReference(u) - u.RawQuery = q.Encode() - // TODO add user-agent - if _, err := getter.NewHTTPGetter(getter.WithURL(rc.URL)); err != nil { - return repoURL, err - } - return u, err - } - - // TODO add user-agent - return u, nil + return url.Parse(resolvedURL) } // VerifyChart takes a path to a chart archive and a keyring, and verifies the chart. diff --git a/tools/vendor/helm.sh/helm/v3/pkg/engine/engine.go b/tools/vendor/helm.sh/helm/v3/pkg/engine/engine.go index 00494f9d7..657d5767b 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/engine/engine.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/engine/engine.go @@ -42,6 +42,15 @@ type Engine struct { LintMode bool // the rest config to connect to the kubernetes api config *rest.Config + // EnableDNS tells the engine to allow DNS lookups when rendering templates + EnableDNS bool +} + +// New creates a new instance of Engine using the passed in rest config. +func New(config *rest.Config) Engine { + return Engine{ + config: config, + } } // Render takes a chart, optional values, and value overrides, and attempts to render the Go templates. @@ -189,6 +198,14 @@ func (e Engine) initFunMap(t *template.Template, referenceTpls map[string]render funcMap["lookup"] = NewLookupFunction(e.config) } + // When DNS lookups are not enabled override the sprig function and return + // an empty string. + if !e.EnableDNS { + funcMap["getHostByName"] = func(name string) string { + return "" + } + } + t.Funcs(funcMap) } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/getter/httpgetter.go b/tools/vendor/helm.sh/helm/v3/pkg/getter/httpgetter.go index 6fe1aa71f..081bf059e 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/getter/httpgetter.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/getter/httpgetter.go @@ -128,7 +128,6 @@ func (g *HTTPGetter) httpClient() (*http.Client, error) { if err != nil { return nil, errors.Wrap(err, "can't create TLS config for client") } - tlsConf.BuildNameToCertificate() sni, err := urlutil.ExtractHostname(g.opts.url) if err != nil { diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/client.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/client.go index 38c8b93f2..1ab59f25d 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/client.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/client.go @@ -17,12 +17,14 @@ limitations under the License. package kube // import "helm.sh/helm/v3/pkg/kube" import ( + "bytes" "context" "encoding/json" "fmt" "io" "os" "path/filepath" + "reflect" "strings" "sync" "time" @@ -35,10 +37,13 @@ import ( apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" + multierror "github.com/hashicorp/go-multierror" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" @@ -47,6 +52,7 @@ import ( "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" cachetools "k8s.io/client-go/tools/cache" watchtools "k8s.io/client-go/tools/watch" cmdutil "k8s.io/kubectl/pkg/cmd/util" @@ -132,6 +138,141 @@ func (c *Client) Create(resources ResourceList) (*Result, error) { return &Result{Created: resources}, nil } +func transformRequests(req *rest.Request) { + tableParam := strings.Join([]string{ + fmt.Sprintf("application/json;as=Table;v=%s;g=%s", metav1.SchemeGroupVersion.Version, metav1.GroupName), + fmt.Sprintf("application/json;as=Table;v=%s;g=%s", metav1beta1.SchemeGroupVersion.Version, metav1beta1.GroupName), + "application/json", + }, ",") + req.SetHeader("Accept", tableParam) + + // if sorting, ensure we receive the full object in order to introspect its fields via jsonpath + req.Param("includeObject", "Object") +} + +// Get retrieves the resource objects supplied. If related is set to true the +// related pods are fetched as well. If the passed in resources are a table kind +// the related resources will also be fetched as kind=table. +func (c *Client) Get(resources ResourceList, related bool) (map[string][]runtime.Object, error) { + buf := new(bytes.Buffer) + objs := make(map[string][]runtime.Object) + + podSelectors := []map[string]string{} + err := resources.Visit(func(info *resource.Info, err error) error { + if err != nil { + return err + } + + gvk := info.ResourceMapping().GroupVersionKind + vk := gvk.Version + "/" + gvk.Kind + obj, err := getResource(info) + if err != nil { + fmt.Fprintf(buf, "Get resource %s failed, err:%v\n", info.Name, err) + } else { + objs[vk] = append(objs[vk], obj) + + // Only fetch related pods if they are requested + if related { + // Discover if the existing object is a table. If it is, request + // the pods as Tables. Otherwise request them normally. + objGVK := obj.GetObjectKind().GroupVersionKind() + var isTable bool + if objGVK.Kind == "Table" { + isTable = true + } + + objs, err = c.getSelectRelationPod(info, objs, isTable, &podSelectors) + if err != nil { + c.Log("Warning: get the relation pod is failed, err:%s", err.Error()) + } + } + } + + return nil + }) + if err != nil { + return nil, err + } + + return objs, nil +} + +func (c *Client) getSelectRelationPod(info *resource.Info, objs map[string][]runtime.Object, table bool, podSelectors *[]map[string]string) (map[string][]runtime.Object, error) { + if info == nil { + return objs, nil + } + c.Log("get relation pod of object: %s/%s/%s", info.Namespace, info.Mapping.GroupVersionKind.Kind, info.Name) + selector, ok, _ := getSelectorFromObject(info.Object) + if !ok { + return objs, nil + } + + for index := range *podSelectors { + if reflect.DeepEqual((*podSelectors)[index], selector) { + // check if pods for selectors are already added. This avoids duplicate printing of pods + return objs, nil + } + } + + *podSelectors = append(*podSelectors, selector) + + var infos []*resource.Info + var err error + if table { + infos, err = c.Factory.NewBuilder(). + Unstructured(). + ContinueOnError(). + NamespaceParam(info.Namespace). + DefaultNamespace(). + ResourceTypes("pods"). + LabelSelector(labels.Set(selector).AsSelector().String()). + TransformRequests(transformRequests). + Do().Infos() + if err != nil { + return objs, err + } + } else { + infos, err = c.Factory.NewBuilder(). + Unstructured(). + ContinueOnError(). + NamespaceParam(info.Namespace). + DefaultNamespace(). + ResourceTypes("pods"). + LabelSelector(labels.Set(selector).AsSelector().String()). + Do().Infos() + if err != nil { + return objs, err + } + } + vk := "v1/Pod(related)" + + for _, info := range infos { + objs[vk] = append(objs[vk], info.Object) + } + return objs, nil +} + +func getSelectorFromObject(obj runtime.Object) (map[string]string, bool, error) { + typed := obj.(*unstructured.Unstructured) + kind := typed.Object["kind"] + switch kind { + case "ReplicaSet", "Deployment", "StatefulSet", "DaemonSet", "Job": + return unstructured.NestedStringMap(typed.Object, "spec", "selector", "matchLabels") + case "ReplicationController": + return unstructured.NestedStringMap(typed.Object, "spec", "selector") + default: + return nil, false, nil + } +} + +func getResource(info *resource.Info) (runtime.Object, error) { + obj, err := resource.NewHelper(info.Client, info.Mapping).Get(info.Namespace, info.Name) + if err != nil { + return nil, err + } + return obj, nil +} + // Wait waits up to the given timeout for the specified resources to be ready. func (c *Client) Wait(resources ResourceList, timeout time.Duration) error { cs, err := c.getKubeClient() @@ -215,6 +356,33 @@ func (c *Client) Build(reader io.Reader, validate bool) (ResourceList, error) { return result, scrubValidationError(err) } +// BuildTable validates for Kubernetes objects and returns unstructured infos. +// The returned kind is a Table. +func (c *Client) BuildTable(reader io.Reader, validate bool) (ResourceList, error) { + validationDirective := metav1.FieldValidationIgnore + if validate { + validationDirective = metav1.FieldValidationStrict + } + + dynamicClient, err := c.Factory.DynamicClient() + if err != nil { + return nil, err + } + + verifier := resource.NewQueryParamVerifier(dynamicClient, c.Factory.OpenAPIGetter(), resource.QueryParamFieldValidation) + schema, err := c.Factory.Validator(validationDirective, verifier) + if err != nil { + return nil, err + } + result, err := c.newBuilder(). + Unstructured(). + Schema(schema). + Stream(reader, ""). + TransformRequests(transformRequests). + Do().Infos() + return result, scrubValidationError(err) +} + // Update takes the current list of objects and target list of objects and // creates resources that don't already exist, updates resources that have been // modified in the target configuration, and deletes resources from the current @@ -308,16 +476,20 @@ func (c *Client) Delete(resources ResourceList) (*Result, []error) { mtx := sync.Mutex{} err := perform(resources, func(info *resource.Info) error { c.Log("Starting delete for %q %s", info.Name, info.Mapping.GroupVersionKind.Kind) - if err := c.skipIfNotFound(deleteResource(info)); err != nil { - mtx.Lock() - defer mtx.Unlock() - // Collect the error and continue on - errs = append(errs, err) - } else { + err := deleteResource(info) + if err == nil || apierrors.IsNotFound(err) { + if err != nil { + c.Log("Ignoring delete failure for %q %s: %v", info.Name, info.Mapping.GroupVersionKind, err) + } mtx.Lock() defer mtx.Unlock() res.Deleted = append(res.Deleted, info) + return nil } + mtx.Lock() + defer mtx.Unlock() + // Collect the error and continue on + errs = append(errs, err) return nil }) if err != nil { @@ -334,14 +506,6 @@ func (c *Client) Delete(resources ResourceList) (*Result, []error) { return res, nil } -func (c *Client) skipIfNotFound(err error) error { - if apierrors.IsNotFound(err) { - c.Log("%v", err) - return nil - } - return err -} - func (c *Client) watchTimeout(t time.Duration) func(*resource.Info) error { return func(info *resource.Info) error { return c.watchUntilReady(t, info) @@ -356,10 +520,10 @@ func (c *Client) watchTimeout(t time.Duration) func(*resource.Info) error { // For most kinds, it checks to see if the resource is marked as Added or Modified // by the Kubernetes event stream. For some kinds, it does more: // -// - Jobs: A job is marked "Ready" when it has successfully completed. This is -// ascertained by watching the Status fields in a job's output. -// - Pods: A pod is marked "Ready" when it has successfully completed. This is -// ascertained by watching the status.phase field in a pod's output. +// - Jobs: A job is marked "Ready" when it has successfully completed. This is +// ascertained by watching the Status fields in a job's output. +// - Pods: A pod is marked "Ready" when it has successfully completed. This is +// ascertained by watching the status.phase field in a pod's output. // // Handling for other kinds will be added as necessary. func (c *Client) WatchUntilReady(resources ResourceList, timeout time.Duration) error { @@ -369,6 +533,8 @@ func (c *Client) WatchUntilReady(resources ResourceList, timeout time.Duration) } func perform(infos ResourceList, fn func(*resource.Info) error) error { + var result error + if len(infos) == 0 { return ErrNoObjectsVisited } @@ -379,10 +545,11 @@ func perform(infos ResourceList, fn func(*resource.Info) error) error { for range infos { err := <-errs if err != nil { - return err + result = multierror.Append(result, err) } } - return nil + + return result } // getManagedFieldsManager returns the manager string. If one was set it will be returned. diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/fake.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/fake.go index 0fc953116..fb38c3654 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/fake.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/fake.go @@ -22,6 +22,7 @@ import ( "time" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/cli-runtime/pkg/resource" "helm.sh/helm/v3/pkg/kube" @@ -33,11 +34,13 @@ import ( type FailingKubeClient struct { PrintingKubeClient CreateError error + GetError error WaitError error DeleteError error WatchUntilReadyError error UpdateError error BuildError error + BuildTableError error BuildUnstructuredError error WaitAndGetCompletedPodPhaseError error WaitDuration time.Duration @@ -51,6 +54,14 @@ func (f *FailingKubeClient) Create(resources kube.ResourceList) (*kube.Result, e return f.PrintingKubeClient.Create(resources) } +// Get returns the configured error if set or prints +func (f *FailingKubeClient) Get(resources kube.ResourceList, related bool) (map[string][]runtime.Object, error) { + if f.GetError != nil { + return nil, f.GetError + } + return f.PrintingKubeClient.Get(resources, related) +} + // Waits the amount of time defined on f.WaitDuration, then returns the configured error if set or prints. func (f *FailingKubeClient) Wait(resources kube.ResourceList, d time.Duration) error { time.Sleep(f.WaitDuration) @@ -108,6 +119,14 @@ func (f *FailingKubeClient) Build(r io.Reader, _ bool) (kube.ResourceList, error return f.PrintingKubeClient.Build(r, false) } +// BuildTable returns the configured error if set or prints +func (f *FailingKubeClient) BuildTable(r io.Reader, _ bool) (kube.ResourceList, error) { + if f.BuildTableError != nil { + return []*resource.Info{}, f.BuildTableError + } + return f.PrintingKubeClient.BuildTable(r, false) +} + // WaitAndGetCompletedPodPhase returns the configured error if set or prints func (f *FailingKubeClient) WaitAndGetCompletedPodPhase(s string, d time.Duration) (v1.PodPhase, error) { if f.WaitAndGetCompletedPodPhaseError != nil { diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/printer.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/printer.go index 1e8cf0066..267aa1ff8 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/printer.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/fake/printer.go @@ -22,6 +22,7 @@ import ( "time" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/cli-runtime/pkg/resource" "helm.sh/helm/v3/pkg/kube" @@ -47,6 +48,14 @@ func (p *PrintingKubeClient) Create(resources kube.ResourceList) (*kube.Result, return &kube.Result{Created: resources}, nil } +func (p *PrintingKubeClient) Get(resources kube.ResourceList, related bool) (map[string][]runtime.Object, error) { + _, err := io.Copy(p.Out, bufferize(resources)) + if err != nil { + return nil, err + } + return make(map[string][]runtime.Object), nil +} + func (p *PrintingKubeClient) Wait(resources kube.ResourceList, _ time.Duration) error { _, err := io.Copy(p.Out, bufferize(resources)) return err @@ -96,6 +105,11 @@ func (p *PrintingKubeClient) Build(_ io.Reader, _ bool) (kube.ResourceList, erro return []*resource.Info{}, nil } +// BuildTable implements KubeClient BuildTable. +func (p *PrintingKubeClient) BuildTable(_ io.Reader, _ bool) (kube.ResourceList, error) { + return []*resource.Info{}, nil +} + // WaitAndGetCompletedPodPhase implements KubeClient WaitAndGetCompletedPodPhase. func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(_ string, _ time.Duration) (v1.PodPhase, error) { return v1.PodSucceeded, nil diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/interface.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/interface.go index 299e34e95..11f948e34 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/interface.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/interface.go @@ -21,6 +21,7 @@ import ( "time" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" ) // Interface represents a client capable of communicating with the Kubernetes API. @@ -78,5 +79,28 @@ type InterfaceExt interface { WaitForDelete(resources ResourceList, timeout time.Duration) error } +// InterfaceResources is introduced to avoid breaking backwards compatibility for Interface implementers. +// +// TODO Helm 4: Remove InterfaceResources and integrate its method(s) into the Interface. +type InterfaceResources interface { + // Get details of deployed resources. + // The first argument is a list of resources to get. The second argument + // specifies if related pods should be fetched. For example, the pods being + // managed by a deployment. + Get(resources ResourceList, related bool) (map[string][]runtime.Object, error) + + // BuildTable creates a resource list from a Reader. This differs from + // Interface.Build() in that a table kind is returned. A table is useful + // if you want to use a printer to display the information. + // + // Reader must contain a YAML stream (one or more YAML documents separated + // by "\n---\n") + // + // Validates against OpenAPI schema if validate is true. + // TODO Helm 4: Integrate into Build with an argument + BuildTable(reader io.Reader, validate bool) (ResourceList, error) +} + var _ Interface = (*Client)(nil) var _ InterfaceExt = (*Client)(nil) +var _ InterfaceResources = (*Client)(nil) diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/ready.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/ready.go index 0554c1729..bdad3af08 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/ready.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/ready.go @@ -291,7 +291,7 @@ func (c *ReadyChecker) daemonSetReady(ds *appsv1.DaemonSet) bool { c.log("DaemonSet is not ready: %s/%s. %d out of %d expected pods have been scheduled", ds.Namespace, ds.Name, ds.Status.UpdatedNumberScheduled, ds.Status.DesiredNumberScheduled) return false } - maxUnavailable, err := intstr.GetValueFromIntOrPercent(ds.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable, int(ds.Status.DesiredNumberScheduled), true) + maxUnavailable, err := intstr.GetScaledValueFromIntOrPercent(ds.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable, int(ds.Status.DesiredNumberScheduled), true) if err != nil { // If for some reason the value is invalid, set max unavailable to the // number of desired replicas. This is the same behavior as the @@ -393,8 +393,10 @@ func (c *ReadyChecker) statefulSetReady(sts *appsv1.StatefulSet) bool { c.log("StatefulSet is not ready: %s/%s. %d out of %d expected pods are ready", sts.Namespace, sts.Name, sts.Status.ReadyReplicas, replicas) return false } - - if sts.Status.CurrentRevision != sts.Status.UpdateRevision { + // This check only makes sense when all partitions are being upgraded otherwise during a + // partioned rolling upgrade, this condition will never evaluate to true, leading to + // error. + if partition == 0 && sts.Status.CurrentRevision != sts.Status.UpdateRevision { c.log("StatefulSet is not ready: %s/%s. currentRevision %s does not yet match updateRevision %s", sts.Namespace, sts.Name, sts.Status.CurrentRevision, sts.Status.UpdateRevision) return false } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/kube/wait.go b/tools/vendor/helm.sh/helm/v3/pkg/kube/wait.go index fd01e9bc7..8928d6745 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/kube/wait.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/kube/wait.go @@ -22,9 +22,6 @@ import ( "time" "github.com/pkg/errors" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "google.golang.org/grpc/codes" - appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta2 "k8s.io/api/apps/v1beta2" @@ -35,6 +32,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" ) @@ -44,22 +42,6 @@ type waiter struct { log func(string, ...interface{}) } -// isServiceUnavailable helps figure out if the error is caused by etcd not being available -// see https://pkg.go.dev/go.etcd.io/etcd/api/v3/v3rpc/rpctypes for `codes.Unavailable` -// we use this to check if the etcdserver is not available we should retry in case -// this is a temporary situation -func isServiceUnavailable(err error) bool { - if err != nil { - err = rpctypes.Error(err) - if ev, ok := err.(rpctypes.EtcdError); ok { - if ev.Code() == codes.Unavailable { - return true - } - } - } - return false -} - // waitForResources polls to get the current status of all pods, PVCs, Services and // Jobs(optional) until all are ready or a timeout is reached func (w *waiter) waitForResources(created ResourceList) error { @@ -72,9 +54,6 @@ func (w *waiter) waitForResources(created ResourceList) error { for _, v := range created { ready, err := w.c.IsReady(ctx, v) if !ready || err != nil { - if isServiceUnavailable(err) { - return false, nil - } return false, err } } @@ -93,9 +72,6 @@ func (w *waiter) waitForDeletedResources(deleted ResourceList) error { for _, v := range deleted { err := v.Get() if err == nil || !apierrors.IsNotFound(err) { - if isServiceUnavailable(err) { - return false, nil - } return false, err } } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/release/info.go b/tools/vendor/helm.sh/helm/v3/pkg/release/info.go index 0cb2bab64..b030a8a54 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/release/info.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/release/info.go @@ -16,6 +16,8 @@ limitations under the License. package release import ( + "k8s.io/apimachinery/pkg/runtime" + "helm.sh/helm/v3/pkg/time" ) @@ -33,4 +35,6 @@ type Info struct { Status Status `json:"status,omitempty"` // Contains the rendered templates/NOTES.txt if available Notes string `json:"notes,omitempty"` + // Contains the deployed resources information + Resources map[string][]runtime.Object `json:"resources,omitempty"` } diff --git a/tools/vendor/helm.sh/helm/v3/pkg/repo/chartrepo.go b/tools/vendor/helm.sh/helm/v3/pkg/repo/chartrepo.go index fce947e4c..3901ad1b0 100644 --- a/tools/vendor/helm.sh/helm/v3/pkg/repo/chartrepo.go +++ b/tools/vendor/helm.sh/helm/v3/pkg/repo/chartrepo.go @@ -25,7 +25,6 @@ import ( "log" "net/url" "os" - "path" "path/filepath" "strings" @@ -116,15 +115,11 @@ func (r *ChartRepository) Load() error { // DownloadIndexFile fetches the index from a repository. func (r *ChartRepository) DownloadIndexFile() (string, error) { - parsedURL, err := url.Parse(r.Config.URL) + indexURL, err := ResolveReferenceURL(r.Config.URL, "index.yaml") if err != nil { return "", err } - parsedURL.RawPath = path.Join(parsedURL.RawPath, "index.yaml") - parsedURL.Path = path.Join(parsedURL.Path, "index.yaml") - indexURL := parsedURL.String() - // TODO add user-agent resp, err := r.Client.Get(indexURL, getter.WithURL(r.Config.URL), getter.WithInsecureSkipVerifyTLS(r.Config.InsecureSkipTLSverify), @@ -219,7 +214,7 @@ func FindChartInAuthRepoURL(repoURL, username, password, chartName, chartVersion // but it also receives credentials and TLS verify flag for the chart repository. // TODO Helm 4, FindChartInAuthAndTLSRepoURL should be integrated into FindChartInAuthRepoURL. func FindChartInAuthAndTLSRepoURL(repoURL, username, password, chartName, chartVersion, certFile, keyFile, caFile string, insecureSkipTLSverify bool, getters getter.Providers) (string, error) { - return FindChartInAuthAndTLSAndPassRepoURL(repoURL, username, password, chartName, chartVersion, certFile, keyFile, caFile, false, false, getters) + return FindChartInAuthAndTLSAndPassRepoURL(repoURL, username, password, chartName, chartVersion, certFile, keyFile, caFile, insecureSkipTLSverify, false, getters) } // FindChartInAuthAndTLSAndPassRepoURL finds chart in chart repository pointed by repoURL @@ -290,18 +285,27 @@ func FindChartInAuthAndTLSAndPassRepoURL(repoURL, username, password, chartName, // ResolveReferenceURL resolves refURL relative to baseURL. // If refURL is absolute, it simply returns refURL. func ResolveReferenceURL(baseURL, refURL string) (string, error) { - // We need a trailing slash for ResolveReference to work, but make sure there isn't already one - parsedBaseURL, err := url.Parse(strings.TrimSuffix(baseURL, "/") + "/") + parsedRefURL, err := url.Parse(refURL) if err != nil { - return "", errors.Wrapf(err, "failed to parse %s as URL", baseURL) + return "", errors.Wrapf(err, "failed to parse %s as URL", refURL) } - parsedRefURL, err := url.Parse(refURL) + if parsedRefURL.IsAbs() { + return refURL, nil + } + + parsedBaseURL, err := url.Parse(baseURL) if err != nil { - return "", errors.Wrapf(err, "failed to parse %s as URL", refURL) + return "", errors.Wrapf(err, "failed to parse %s as URL", baseURL) } - return parsedBaseURL.ResolveReference(parsedRefURL).String(), nil + // We need a trailing slash for ResolveReference to work, but make sure there isn't already one + parsedBaseURL.RawPath = strings.TrimSuffix(parsedBaseURL.RawPath, "/") + "/" + parsedBaseURL.Path = strings.TrimSuffix(parsedBaseURL.Path, "/") + "/" + + resolvedURL := parsedBaseURL.ResolveReference(parsedRefURL) + resolvedURL.RawQuery = parsedBaseURL.RawQuery + return resolvedURL.String(), nil } func (e *Entry) String() string { diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1/generated.proto b/tools/vendor/k8s.io/api/admissionregistration/v1/generated.proto index cdf1f4765..a8903621c 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1/generated.proto +++ b/tools/vendor/k8s.io/api/admissionregistration/v1/generated.proto @@ -215,7 +215,7 @@ message MutatingWebhook { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge @@ -473,7 +473,7 @@ message ValidatingWebhook { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1/types.go b/tools/vendor/k8s.io/api/admissionregistration/v1/types.go index 74f17d54a..07ed7a624 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1/types.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1/types.go @@ -320,7 +320,7 @@ type ValidatingWebhook struct { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge @@ -489,7 +489,7 @@ type MutatingWebhook struct { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go index ce306b307..c41cceb2f 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go @@ -50,7 +50,7 @@ var map_MutatingWebhook = map[string]string{ "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", "reinvocationPolicy": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", - "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate.", + "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate.", } func (MutatingWebhook) SwaggerDoc() map[string]string { @@ -122,7 +122,7 @@ var map_ValidatingWebhook = map[string]string{ "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", - "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate.", + "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate.", } func (ValidatingWebhook) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go index 746535026..4f1373ec5 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go @@ -493,6 +493,34 @@ func (m *Validation) XXX_DiscardUnknown() { var xxx_messageInfo_Validation proto.InternalMessageInfo +func (m *Variable) Reset() { *m = Variable{} } +func (*Variable) ProtoMessage() {} +func (*Variable) Descriptor() ([]byte, []int) { + return fileDescriptor_c3be8d256e3ae3cf, []int{16} +} +func (m *Variable) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Variable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Variable) XXX_Merge(src proto.Message) { + xxx_messageInfo_Variable.Merge(m, src) +} +func (m *Variable) XXX_Size() int { + return m.Size() +} +func (m *Variable) XXX_DiscardUnknown() { + xxx_messageInfo_Variable.DiscardUnknown(m) +} + +var xxx_messageInfo_Variable proto.InternalMessageInfo + func init() { proto.RegisterType((*AuditAnnotation)(nil), "k8s.io.api.admissionregistration.v1alpha1.AuditAnnotation") proto.RegisterType((*ExpressionWarning)(nil), "k8s.io.api.admissionregistration.v1alpha1.ExpressionWarning") @@ -510,6 +538,7 @@ func init() { proto.RegisterType((*ValidatingAdmissionPolicySpec)(nil), "k8s.io.api.admissionregistration.v1alpha1.ValidatingAdmissionPolicySpec") proto.RegisterType((*ValidatingAdmissionPolicyStatus)(nil), "k8s.io.api.admissionregistration.v1alpha1.ValidatingAdmissionPolicyStatus") proto.RegisterType((*Validation)(nil), "k8s.io.api.admissionregistration.v1alpha1.Validation") + proto.RegisterType((*Variable)(nil), "k8s.io.api.admissionregistration.v1alpha1.Variable") } func init() { @@ -517,95 +546,102 @@ func init() { } var fileDescriptor_c3be8d256e3ae3cf = []byte{ - // 1407 bytes of a gzipped FileDescriptorProto + // 1509 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0x45, - 0x18, 0xcf, 0xc6, 0x4e, 0x9a, 0x8c, 0xf3, 0xb0, 0x87, 0x56, 0x75, 0x23, 0x6a, 0x47, 0xab, 0x0a, - 0x35, 0x12, 0xec, 0x92, 0xb4, 0x50, 0x40, 0x48, 0x28, 0xdb, 0x17, 0x7d, 0xa4, 0x89, 0xa6, 0x28, - 0x91, 0x10, 0x95, 0x98, 0xec, 0x4e, 0xec, 0xa9, 0xbd, 0x0f, 0x76, 0xd6, 0xa1, 0x11, 0x48, 0x54, - 0xe2, 0x02, 0x37, 0x0e, 0x5c, 0xf8, 0x5f, 0xb8, 0x70, 0xeb, 0xb1, 0xc7, 0x72, 0xc0, 0x22, 0xe6, - 0xc2, 0x5f, 0x00, 0x52, 0x2e, 0xa0, 0x99, 0x9d, 0x7d, 0x3b, 0xc4, 0x2e, 0x81, 0x9b, 0xf7, 0x7b, - 0xfc, 0x7e, 0xf3, 0x7d, 0xf3, 0x7d, 0x33, 0xdf, 0x18, 0xa0, 0xce, 0x3b, 0x4c, 0xa3, 0xae, 0xde, - 0xe9, 0xed, 0x12, 0xdf, 0x21, 0x01, 0x61, 0xfa, 0x3e, 0x71, 0x2c, 0xd7, 0xd7, 0xa5, 0x02, 0x7b, - 0x54, 0xc7, 0x96, 0x4d, 0x19, 0xa3, 0xae, 0xe3, 0x93, 0x16, 0x65, 0x81, 0x8f, 0x03, 0xea, 0x3a, - 0xfa, 0xfe, 0x2a, 0xee, 0x7a, 0x6d, 0xbc, 0xaa, 0xb7, 0x88, 0x43, 0x7c, 0x1c, 0x10, 0x4b, 0xf3, - 0x7c, 0x37, 0x70, 0xe1, 0x4a, 0xe8, 0xaa, 0x61, 0x8f, 0x6a, 0x43, 0x5d, 0xb5, 0xc8, 0x75, 0xe9, - 0x8d, 0x16, 0x0d, 0xda, 0xbd, 0x5d, 0xcd, 0x74, 0x6d, 0xbd, 0xe5, 0xb6, 0x5c, 0x5d, 0x20, 0xec, - 0xf6, 0xf6, 0xc4, 0x97, 0xf8, 0x10, 0xbf, 0x42, 0xe4, 0xa5, 0x2b, 0x23, 0x2c, 0x2a, 0xbf, 0x9c, - 0xa5, 0xab, 0x89, 0x93, 0x8d, 0xcd, 0x36, 0x75, 0x88, 0x7f, 0xa0, 0x7b, 0x9d, 0x16, 0x17, 0x30, - 0xdd, 0x26, 0x01, 0x1e, 0xe6, 0xa5, 0x1f, 0xe7, 0xe5, 0xf7, 0x9c, 0x80, 0xda, 0xa4, 0xe0, 0xf0, - 0xf6, 0x49, 0x0e, 0xcc, 0x6c, 0x13, 0x1b, 0xe7, 0xfd, 0x54, 0x06, 0x16, 0xd7, 0x7b, 0x16, 0x0d, - 0xd6, 0x1d, 0xc7, 0x0d, 0x44, 0x10, 0xf0, 0x22, 0x28, 0x75, 0xc8, 0x41, 0x5d, 0x59, 0x56, 0x2e, - 0xcf, 0x1a, 0x95, 0x67, 0xfd, 0xe6, 0xc4, 0xa0, 0xdf, 0x2c, 0xdd, 0x23, 0x07, 0x88, 0xcb, 0xe1, - 0x3a, 0x58, 0xdc, 0xc7, 0xdd, 0x1e, 0xb9, 0xf9, 0xc4, 0xf3, 0x89, 0x48, 0x41, 0x7d, 0x52, 0x98, - 0x9e, 0x97, 0xa6, 0x8b, 0xdb, 0x59, 0x35, 0xca, 0xdb, 0xab, 0x5d, 0x50, 0x4b, 0xbe, 0x76, 0xb0, - 0xef, 0x50, 0xa7, 0x05, 0x5f, 0x07, 0x33, 0x7b, 0x94, 0x74, 0x2d, 0x44, 0xf6, 0x24, 0x60, 0x55, - 0x02, 0xce, 0xdc, 0x92, 0x72, 0x14, 0x5b, 0xc0, 0x15, 0x70, 0xe6, 0xf3, 0xd0, 0xb1, 0x5e, 0x12, - 0xc6, 0x8b, 0xd2, 0xf8, 0x8c, 0xc4, 0x43, 0x91, 0x5e, 0xdd, 0x03, 0x0b, 0x1b, 0x38, 0x30, 0xdb, - 0xd7, 0x5d, 0xc7, 0xa2, 0x22, 0xc2, 0x65, 0x50, 0x76, 0xb0, 0x4d, 0x64, 0x88, 0x73, 0xd2, 0xb3, - 0xfc, 0x00, 0xdb, 0x04, 0x09, 0x0d, 0x5c, 0x03, 0x80, 0xe4, 0xe3, 0x83, 0xd2, 0x0e, 0xa4, 0x42, - 0x4b, 0x59, 0xa9, 0x3f, 0x97, 0x25, 0x11, 0x22, 0xcc, 0xed, 0xf9, 0x26, 0x61, 0xf0, 0x09, 0xa8, - 0x71, 0x38, 0xe6, 0x61, 0x93, 0x3c, 0x24, 0x5d, 0x62, 0x06, 0xae, 0x2f, 0x58, 0x2b, 0x6b, 0x57, - 0xb4, 0xa4, 0x4e, 0xe3, 0x1d, 0xd3, 0xbc, 0x4e, 0x8b, 0x0b, 0x98, 0xc6, 0x0b, 0x43, 0xdb, 0x5f, - 0xd5, 0xee, 0xe3, 0x5d, 0xd2, 0x8d, 0x5c, 0x8d, 0x73, 0x83, 0x7e, 0xb3, 0xf6, 0x20, 0x8f, 0x88, - 0x8a, 0x24, 0xd0, 0x05, 0x0b, 0xee, 0xee, 0x63, 0x62, 0x06, 0x31, 0xed, 0xe4, 0xcb, 0xd3, 0xc2, - 0x41, 0xbf, 0xb9, 0xb0, 0x99, 0x81, 0x43, 0x39, 0x78, 0xf8, 0x15, 0x98, 0xf7, 0x65, 0xdc, 0xa8, - 0xd7, 0x25, 0xac, 0x5e, 0x5a, 0x2e, 0x5d, 0xae, 0xac, 0x19, 0xda, 0xc8, 0xed, 0xa8, 0xf1, 0xc0, - 0x2c, 0xee, 0xbc, 0x43, 0x83, 0xf6, 0xa6, 0x47, 0x42, 0x3d, 0x33, 0xce, 0xc9, 0xc4, 0xcf, 0xa3, - 0x34, 0x01, 0xca, 0xf2, 0xc1, 0xef, 0x15, 0x70, 0x96, 0x3c, 0x31, 0xbb, 0x3d, 0x8b, 0x64, 0xec, - 0xea, 0xe5, 0x53, 0x5b, 0xc8, 0xab, 0x72, 0x21, 0x67, 0x6f, 0x0e, 0xe1, 0x41, 0x43, 0xd9, 0xe1, - 0x0d, 0x50, 0xb1, 0x79, 0x51, 0x6c, 0xb9, 0x5d, 0x6a, 0x1e, 0xd4, 0xcf, 0x88, 0x52, 0x52, 0x07, - 0xfd, 0x66, 0x65, 0x23, 0x11, 0x1f, 0xf5, 0x9b, 0x8b, 0xa9, 0xcf, 0x8f, 0x0e, 0x3c, 0x82, 0xd2, - 0x6e, 0xea, 0x0b, 0x05, 0x9c, 0x3f, 0x66, 0x55, 0xf0, 0x5a, 0x92, 0x79, 0x51, 0x1a, 0x75, 0x65, - 0xb9, 0x74, 0x79, 0xd6, 0xa8, 0xa5, 0x33, 0x26, 0x14, 0x28, 0x6b, 0x07, 0xbf, 0x56, 0x00, 0xf4, - 0x0b, 0x78, 0xb2, 0x50, 0xae, 0x8d, 0x92, 0x2f, 0x6d, 0x48, 0x92, 0x96, 0x64, 0x92, 0x60, 0x51, - 0x87, 0x86, 0xd0, 0xa9, 0x18, 0xcc, 0x6e, 0x61, 0x1f, 0xdb, 0xf7, 0xa8, 0x63, 0xf1, 0xbe, 0xc3, - 0x1e, 0xdd, 0x26, 0xbe, 0xe8, 0x3b, 0x25, 0xdb, 0x77, 0xeb, 0x5b, 0x77, 0xa4, 0x06, 0xa5, 0xac, - 0x78, 0x37, 0x77, 0xa8, 0x63, 0xc9, 0x2e, 0x8d, 0xbb, 0x99, 0xe3, 0x21, 0xa1, 0x51, 0x1f, 0x81, - 0x19, 0x41, 0xc1, 0x0f, 0x8e, 0x93, 0x7b, 0x5f, 0x07, 0xb3, 0x71, 0x3f, 0x49, 0xd0, 0x9a, 0x34, - 0x9b, 0x8d, 0x7b, 0x0f, 0x25, 0x36, 0xea, 0x0f, 0x0a, 0x98, 0xe3, 0x5b, 0x76, 0xbd, 0x4d, 0xcc, - 0x0e, 0x3f, 0xca, 0xbe, 0x51, 0x00, 0x24, 0xf9, 0x03, 0x2e, 0xdc, 0x97, 0xca, 0xda, 0xfb, 0x63, - 0x14, 0x62, 0xe1, 0x94, 0x4c, 0xb2, 0x5b, 0x50, 0x31, 0x34, 0x84, 0x53, 0xfd, 0x65, 0x12, 0x5c, - 0xd8, 0xc6, 0x5d, 0x6a, 0xe1, 0x80, 0x3a, 0xad, 0xf5, 0x88, 0x2e, 0x2c, 0x2b, 0xf8, 0x29, 0x98, - 0xe1, 0x1d, 0x6f, 0xe1, 0x00, 0xcb, 0x63, 0xe9, 0xcd, 0xd1, 0xce, 0x87, 0xf0, 0x30, 0xd8, 0x20, - 0x01, 0x4e, 0xb6, 0x27, 0x91, 0xa1, 0x18, 0x15, 0x3e, 0x06, 0x65, 0xe6, 0x11, 0x53, 0x16, 0xd5, - 0x87, 0x63, 0xc4, 0x7e, 0xec, 0xaa, 0x1f, 0x7a, 0xc4, 0x4c, 0x36, 0x8e, 0x7f, 0x21, 0xc1, 0x01, - 0x7d, 0x30, 0xcd, 0x02, 0x1c, 0xf4, 0x98, 0xb8, 0x12, 0x2a, 0x6b, 0x77, 0x4f, 0x85, 0x4d, 0x20, - 0x1a, 0x0b, 0x92, 0x6f, 0x3a, 0xfc, 0x46, 0x92, 0x49, 0xfd, 0x53, 0x01, 0xcb, 0xc7, 0xfa, 0x1a, - 0xd4, 0xb1, 0x78, 0x3d, 0xfc, 0xf7, 0x69, 0xfe, 0x2c, 0x93, 0xe6, 0xcd, 0xd3, 0x08, 0x5c, 0x2e, - 0xfe, 0xb8, 0x6c, 0xab, 0x7f, 0x28, 0xe0, 0xd2, 0x49, 0xce, 0xf7, 0x29, 0x0b, 0xe0, 0x27, 0x85, - 0xe8, 0xb5, 0x11, 0x2f, 0x21, 0xca, 0xc2, 0xd8, 0xe3, 0x41, 0x20, 0x92, 0xa4, 0x22, 0xf7, 0xc0, - 0x14, 0x0d, 0x88, 0xcd, 0x8f, 0x2d, 0xde, 0x5d, 0xf7, 0x4e, 0x31, 0x74, 0x63, 0x5e, 0xf2, 0x4e, - 0xdd, 0xe1, 0x0c, 0x28, 0x24, 0x52, 0xbf, 0x2d, 0x9d, 0x1c, 0x38, 0xcf, 0x13, 0x3f, 0xcc, 0x3c, - 0x21, 0x7c, 0x90, 0x1c, 0x38, 0xf1, 0x36, 0x6e, 0xc5, 0x1a, 0x94, 0xb2, 0x82, 0x8f, 0xc0, 0x8c, - 0x27, 0x8f, 0xaa, 0x21, 0x37, 0xf6, 0x49, 0x11, 0x45, 0xa7, 0x9c, 0x31, 0xc7, 0xb3, 0x15, 0x7d, - 0xa1, 0x18, 0x12, 0xf6, 0xc0, 0x82, 0x9d, 0x19, 0x51, 0x64, 0xab, 0xbc, 0x3b, 0x06, 0x49, 0x76, - 0xc6, 0x09, 0x87, 0x83, 0xac, 0x0c, 0xe5, 0x48, 0xe0, 0x0e, 0xa8, 0xed, 0xcb, 0x8c, 0xb9, 0xce, - 0xba, 0x19, 0xde, 0x33, 0x65, 0x71, 0x4d, 0xad, 0xf0, 0x91, 0x66, 0x3b, 0xaf, 0x3c, 0xea, 0x37, - 0xab, 0x79, 0x21, 0x2a, 0x62, 0xa8, 0xbf, 0x2b, 0xe0, 0xe2, 0xb1, 0x7b, 0xf1, 0x3f, 0x54, 0x1f, - 0xcd, 0x56, 0xdf, 0x8d, 0x53, 0xa9, 0xbe, 0xe1, 0x65, 0xf7, 0xe3, 0xd4, 0x3f, 0x84, 0x2a, 0xea, - 0x0d, 0x83, 0x59, 0x2f, 0xba, 0x49, 0x65, 0xac, 0x57, 0xc7, 0x2d, 0x1e, 0xee, 0x6b, 0xcc, 0xf3, - 0xab, 0x2e, 0xfe, 0x44, 0x09, 0x2a, 0xfc, 0x02, 0x54, 0x6d, 0x39, 0x4b, 0x73, 0x00, 0xea, 0x04, - 0xd1, 0xbc, 0xf0, 0x2f, 0x2a, 0xe8, 0xec, 0xa0, 0xdf, 0xac, 0x6e, 0xe4, 0x60, 0x51, 0x81, 0x08, - 0x76, 0x41, 0x25, 0xa9, 0x80, 0x68, 0xc0, 0x7c, 0xeb, 0x25, 0x52, 0xee, 0x3a, 0xc6, 0x2b, 0x32, - 0xc7, 0x95, 0x44, 0xc6, 0x50, 0x1a, 0x1e, 0xde, 0x07, 0xf3, 0x7b, 0x98, 0x76, 0x7b, 0x3e, 0x91, - 0xa3, 0x5b, 0x59, 0x34, 0xf0, 0x6b, 0x7c, 0xac, 0xba, 0x95, 0x56, 0x1c, 0xf5, 0x9b, 0xb5, 0x8c, - 0x40, 0x8c, 0x6f, 0x59, 0x67, 0xf8, 0x54, 0x01, 0x55, 0x9c, 0x7d, 0x68, 0xb1, 0xfa, 0x94, 0x88, - 0xe0, 0xbd, 0x31, 0x22, 0xc8, 0xbd, 0xd5, 0x8c, 0xba, 0x0c, 0xa3, 0x9a, 0x53, 0x30, 0x54, 0x60, - 0x83, 0x5f, 0x82, 0x45, 0x3b, 0xf3, 0x0e, 0x62, 0xf5, 0x69, 0xb1, 0x80, 0xb1, 0xb7, 0x2e, 0x46, - 0x48, 0xde, 0x7c, 0x59, 0x39, 0x43, 0x79, 0x2a, 0xf5, 0xa7, 0x49, 0xd0, 0x3c, 0xe1, 0x92, 0x85, - 0x77, 0x01, 0x74, 0x77, 0x19, 0xf1, 0xf7, 0x89, 0x75, 0x3b, 0x7c, 0xa7, 0x46, 0x53, 0x60, 0x29, - 0x19, 0x7c, 0x36, 0x0b, 0x16, 0x68, 0x88, 0x17, 0xb4, 0xc1, 0x5c, 0x90, 0x9a, 0xc9, 0xc6, 0x99, - 0x6a, 0x65, 0xa8, 0xe9, 0x91, 0xce, 0xa8, 0x0e, 0xfa, 0xcd, 0xcc, 0x90, 0x87, 0x32, 0xf0, 0xd0, - 0x04, 0xc0, 0x4c, 0xf2, 0x1a, 0x96, 0xa6, 0x3e, 0xda, 0x41, 0x93, 0x64, 0x33, 0xbe, 0x1c, 0x52, - 0x89, 0x4c, 0xc1, 0xaa, 0x7f, 0x29, 0x00, 0x24, 0xf5, 0x0a, 0x2f, 0x81, 0xd4, 0x53, 0x54, 0xde, - 0x2f, 0x65, 0x0e, 0x81, 0x52, 0x72, 0xfe, 0x52, 0xb6, 0x09, 0x63, 0xb8, 0x15, 0x0d, 0xb3, 0xf1, - 0x4b, 0x79, 0x23, 0x14, 0xa3, 0x48, 0x0f, 0x77, 0xc0, 0xb4, 0x4f, 0x30, 0x73, 0x1d, 0xf9, 0xa6, - 0xfe, 0x80, 0x0f, 0x3c, 0x48, 0x48, 0x8e, 0xfa, 0xcd, 0xd5, 0x51, 0xfe, 0xc9, 0xd0, 0xe4, 0x7c, - 0x24, 0x9c, 0x90, 0x84, 0x83, 0xb7, 0x41, 0x4d, 0x72, 0xa4, 0x16, 0x1c, 0xf6, 0xd3, 0x05, 0xb9, - 0x9a, 0xda, 0x46, 0xde, 0x00, 0x15, 0x7d, 0x8c, 0xcd, 0x67, 0x87, 0x8d, 0x89, 0xe7, 0x87, 0x8d, - 0x89, 0x17, 0x87, 0x8d, 0x89, 0xa7, 0x83, 0x86, 0xf2, 0x6c, 0xd0, 0x50, 0x9e, 0x0f, 0x1a, 0xca, - 0x8b, 0x41, 0x43, 0xf9, 0x75, 0xd0, 0x50, 0xbe, 0xfb, 0xad, 0x31, 0xf1, 0xf1, 0xca, 0xc8, 0xff, - 0x1e, 0xfd, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x08, 0xaf, 0xaa, 0x52, 0x82, 0x12, 0x00, 0x00, + 0x18, 0xcf, 0xc6, 0x6e, 0x12, 0x8f, 0xf3, 0xf2, 0xd0, 0x2a, 0x6e, 0xa0, 0xde, 0x68, 0x55, 0xa1, + 0x46, 0x82, 0x35, 0x49, 0x0b, 0x85, 0x0a, 0x09, 0x65, 0xfb, 0xa2, 0x8f, 0x3c, 0x34, 0x45, 0x89, + 0x84, 0x40, 0x62, 0xb2, 0x3b, 0x71, 0xa6, 0xf6, 0x3e, 0xd8, 0x59, 0x9b, 0x46, 0x20, 0x51, 0x89, + 0x0b, 0xdc, 0x38, 0x70, 0xe1, 0xca, 0x9f, 0xc0, 0x7f, 0xc0, 0xad, 0xc7, 0x1e, 0xcb, 0x01, 0x8b, + 0x9a, 0x0b, 0x7f, 0x01, 0x48, 0xb9, 0x80, 0x66, 0x76, 0xf6, 0x69, 0x9b, 0xd8, 0x25, 0x70, 0xf3, + 0x7c, 0x8f, 0xdf, 0xf7, 0x98, 0xef, 0xfb, 0xf6, 0x1b, 0x03, 0xd4, 0x7c, 0x9b, 0xe9, 0xd4, 0xad, + 0x37, 0xdb, 0xfb, 0xc4, 0x77, 0x48, 0x40, 0x58, 0xbd, 0x43, 0x1c, 0xcb, 0xf5, 0xeb, 0x92, 0x81, + 0x3d, 0x5a, 0xc7, 0x96, 0x4d, 0x19, 0xa3, 0xae, 0xe3, 0x93, 0x06, 0x65, 0x81, 0x8f, 0x03, 0xea, + 0x3a, 0xf5, 0xce, 0x1a, 0x6e, 0x79, 0x87, 0x78, 0xad, 0xde, 0x20, 0x0e, 0xf1, 0x71, 0x40, 0x2c, + 0xdd, 0xf3, 0xdd, 0xc0, 0x85, 0xab, 0xa1, 0xaa, 0x8e, 0x3d, 0xaa, 0x0f, 0x54, 0xd5, 0x23, 0xd5, + 0xe5, 0xd7, 0x1b, 0x34, 0x38, 0x6c, 0xef, 0xeb, 0xa6, 0x6b, 0xd7, 0x1b, 0x6e, 0xc3, 0xad, 0x0b, + 0x84, 0xfd, 0xf6, 0x81, 0x38, 0x89, 0x83, 0xf8, 0x15, 0x22, 0x2f, 0x5f, 0x1e, 0xc1, 0xa9, 0xbc, + 0x3b, 0xcb, 0x57, 0x12, 0x25, 0x1b, 0x9b, 0x87, 0xd4, 0x21, 0xfe, 0x51, 0xdd, 0x6b, 0x36, 0x38, + 0x81, 0xd5, 0x6d, 0x12, 0xe0, 0x41, 0x5a, 0xf5, 0x61, 0x5a, 0x7e, 0xdb, 0x09, 0xa8, 0x4d, 0xfa, + 0x14, 0xde, 0x3a, 0x49, 0x81, 0x99, 0x87, 0xc4, 0xc6, 0x79, 0x3d, 0x8d, 0x81, 0x85, 0x8d, 0xb6, + 0x45, 0x83, 0x0d, 0xc7, 0x71, 0x03, 0x11, 0x04, 0xbc, 0x00, 0x0a, 0x4d, 0x72, 0x54, 0x55, 0x56, + 0x94, 0x4b, 0x25, 0xa3, 0xfc, 0xa4, 0xab, 0x4e, 0xf4, 0xba, 0x6a, 0xe1, 0x1e, 0x39, 0x42, 0x9c, + 0x0e, 0x37, 0xc0, 0x42, 0x07, 0xb7, 0xda, 0xe4, 0xe6, 0x23, 0xcf, 0x27, 0x22, 0x05, 0xd5, 0x49, + 0x21, 0xba, 0x24, 0x45, 0x17, 0x76, 0xb3, 0x6c, 0x94, 0x97, 0xd7, 0x5a, 0xa0, 0x92, 0x9c, 0xf6, + 0xb0, 0xef, 0x50, 0xa7, 0x01, 0x5f, 0x03, 0x33, 0x07, 0x94, 0xb4, 0x2c, 0x44, 0x0e, 0x24, 0xe0, + 0xa2, 0x04, 0x9c, 0xb9, 0x25, 0xe9, 0x28, 0x96, 0x80, 0xab, 0x60, 0xfa, 0xb3, 0x50, 0xb1, 0x5a, + 0x10, 0xc2, 0x0b, 0x52, 0x78, 0x5a, 0xe2, 0xa1, 0x88, 0xaf, 0x1d, 0x80, 0xf9, 0x4d, 0x1c, 0x98, + 0x87, 0xd7, 0x5d, 0xc7, 0xa2, 0x22, 0xc2, 0x15, 0x50, 0x74, 0xb0, 0x4d, 0x64, 0x88, 0xb3, 0x52, + 0xb3, 0xb8, 0x85, 0x6d, 0x82, 0x04, 0x07, 0xae, 0x03, 0x40, 0xf2, 0xf1, 0x41, 0x29, 0x07, 0x52, + 0xa1, 0xa5, 0xa4, 0xb4, 0x9f, 0x8b, 0xd2, 0x10, 0x22, 0xcc, 0x6d, 0xfb, 0x26, 0x61, 0xf0, 0x11, + 0xa8, 0x70, 0x38, 0xe6, 0x61, 0x93, 0x3c, 0x20, 0x2d, 0x62, 0x06, 0xae, 0x2f, 0xac, 0x96, 0xd7, + 0x2f, 0xeb, 0x49, 0x9d, 0xc6, 0x37, 0xa6, 0x7b, 0xcd, 0x06, 0x27, 0x30, 0x9d, 0x17, 0x86, 0xde, + 0x59, 0xd3, 0xef, 0xe3, 0x7d, 0xd2, 0x8a, 0x54, 0x8d, 0x73, 0xbd, 0xae, 0x5a, 0xd9, 0xca, 0x23, + 0xa2, 0x7e, 0x23, 0xd0, 0x05, 0xf3, 0xee, 0xfe, 0x43, 0x62, 0x06, 0xb1, 0xd9, 0xc9, 0x17, 0x37, + 0x0b, 0x7b, 0x5d, 0x75, 0x7e, 0x3b, 0x03, 0x87, 0x72, 0xf0, 0xf0, 0x4b, 0x30, 0xe7, 0xcb, 0xb8, + 0x51, 0xbb, 0x45, 0x58, 0xb5, 0xb0, 0x52, 0xb8, 0x54, 0x5e, 0x37, 0xf4, 0x91, 0xdb, 0x51, 0xe7, + 0x81, 0x59, 0x5c, 0x79, 0x8f, 0x06, 0x87, 0xdb, 0x1e, 0x09, 0xf9, 0xcc, 0x38, 0x27, 0x13, 0x3f, + 0x87, 0xd2, 0x06, 0x50, 0xd6, 0x1e, 0xfc, 0x4e, 0x01, 0x67, 0xc9, 0x23, 0xb3, 0xd5, 0xb6, 0x48, + 0x46, 0xae, 0x5a, 0x3c, 0x35, 0x47, 0x5e, 0x91, 0x8e, 0x9c, 0xbd, 0x39, 0xc0, 0x0e, 0x1a, 0x68, + 0x1d, 0xde, 0x00, 0x65, 0x9b, 0x17, 0xc5, 0x8e, 0xdb, 0xa2, 0xe6, 0x51, 0x75, 0x5a, 0x94, 0x92, + 0xd6, 0xeb, 0xaa, 0xe5, 0xcd, 0x84, 0x7c, 0xdc, 0x55, 0x17, 0x52, 0xc7, 0x0f, 0x8e, 0x3c, 0x82, + 0xd2, 0x6a, 0xda, 0x33, 0x05, 0x2c, 0x0d, 0xf1, 0x0a, 0x5e, 0x4d, 0x32, 0x2f, 0x4a, 0xa3, 0xaa, + 0xac, 0x14, 0x2e, 0x95, 0x8c, 0x4a, 0x3a, 0x63, 0x82, 0x81, 0xb2, 0x72, 0xf0, 0x2b, 0x05, 0x40, + 0xbf, 0x0f, 0x4f, 0x16, 0xca, 0xd5, 0x51, 0xf2, 0xa5, 0x0f, 0x48, 0xd2, 0xb2, 0x4c, 0x12, 0xec, + 0xe7, 0xa1, 0x01, 0xe6, 0x34, 0x0c, 0x4a, 0x3b, 0xd8, 0xc7, 0xf6, 0x3d, 0xea, 0x58, 0xbc, 0xef, + 0xb0, 0x47, 0x77, 0x89, 0x2f, 0xfa, 0x4e, 0xc9, 0xf6, 0xdd, 0xc6, 0xce, 0x1d, 0xc9, 0x41, 0x29, + 0x29, 0xde, 0xcd, 0x4d, 0xea, 0x58, 0xb2, 0x4b, 0xe3, 0x6e, 0xe6, 0x78, 0x48, 0x70, 0xb4, 0x1f, + 0x27, 0xc1, 0x8c, 0xb0, 0xc1, 0x27, 0xc7, 0xc9, 0xcd, 0x5f, 0x07, 0xa5, 0xb8, 0xa1, 0x24, 0x6a, + 0x45, 0x8a, 0x95, 0xe2, 0xe6, 0x43, 0x89, 0x0c, 0xfc, 0x18, 0xcc, 0xb0, 0xa8, 0xcd, 0x0a, 0x2f, + 0xde, 0x66, 0xb3, 0x7c, 0xd6, 0xc5, 0x0d, 0x16, 0x43, 0xc2, 0x00, 0x2c, 0x79, 0xdc, 0x7b, 0x12, + 0x10, 0x7f, 0xcb, 0x0d, 0x6e, 0xb9, 0x6d, 0xc7, 0xda, 0x30, 0x79, 0xf6, 0xaa, 0x45, 0xe1, 0xdd, + 0xb5, 0x5e, 0x57, 0x5d, 0xda, 0x19, 0x2c, 0x72, 0xdc, 0x55, 0x5f, 0x1e, 0xc2, 0x12, 0x65, 0x36, + 0x0c, 0x5a, 0xfb, 0x5e, 0x01, 0xb3, 0x5c, 0xe2, 0xfa, 0x21, 0x31, 0x9b, 0x7c, 0x40, 0x7f, 0xad, + 0x00, 0x48, 0xf2, 0x63, 0x3b, 0xac, 0xb6, 0xf2, 0xfa, 0xbb, 0x63, 0xb4, 0x57, 0xdf, 0xec, 0x4f, + 0x6a, 0xa6, 0x8f, 0xc5, 0xd0, 0x00, 0x9b, 0xda, 0x2f, 0x93, 0xe0, 0xfc, 0x2e, 0x6e, 0x51, 0x0b, + 0x07, 0xd4, 0x69, 0x6c, 0x44, 0xe6, 0xc2, 0x66, 0x81, 0x9f, 0x80, 0x19, 0x9e, 0x60, 0x0b, 0x07, + 0x58, 0x0e, 0xdb, 0x37, 0x46, 0xbb, 0x8e, 0x70, 0xc4, 0x6d, 0x92, 0x00, 0x27, 0x45, 0x97, 0xd0, + 0x50, 0x8c, 0x0a, 0x1f, 0x82, 0x22, 0xf3, 0x88, 0x29, 0x5b, 0xe5, 0xfd, 0x31, 0x62, 0x1f, 0xea, + 0xf5, 0x03, 0x8f, 0x98, 0x49, 0x35, 0xf2, 0x13, 0x12, 0x36, 0xa0, 0x0f, 0xa6, 0x58, 0x80, 0x83, + 0x36, 0x93, 0xa5, 0x75, 0xf7, 0x54, 0xac, 0x09, 0x44, 0x63, 0x5e, 0xda, 0x9b, 0x0a, 0xcf, 0x48, + 0x5a, 0xd2, 0xfe, 0x54, 0xc0, 0xca, 0x50, 0x5d, 0x83, 0x3a, 0x16, 0xaf, 0x87, 0xff, 0x3e, 0xcd, + 0x9f, 0x66, 0xd2, 0xbc, 0x7d, 0x1a, 0x81, 0x4b, 0xe7, 0x87, 0x65, 0x5b, 0xfb, 0x43, 0x01, 0x17, + 0x4f, 0x52, 0xbe, 0x4f, 0x59, 0x00, 0x3f, 0xea, 0x8b, 0x5e, 0x1f, 0xb1, 0xe7, 0x29, 0x0b, 0x63, + 0x8f, 0xd7, 0x9b, 0x88, 0x92, 0x8a, 0xdc, 0x03, 0x67, 0x68, 0x40, 0x6c, 0x3e, 0x8c, 0x79, 0x77, + 0xdd, 0x3b, 0xc5, 0xd0, 0x8d, 0x39, 0x69, 0xf7, 0xcc, 0x1d, 0x6e, 0x01, 0x85, 0x86, 0xb4, 0x6f, + 0x0a, 0x27, 0x07, 0xce, 0xf3, 0xc4, 0x47, 0xb4, 0x27, 0x88, 0x5b, 0xc9, 0x14, 0x8d, 0xaf, 0x71, + 0x27, 0xe6, 0xa0, 0x94, 0x14, 0x1f, 0x90, 0x9e, 0x9c, 0xbf, 0x03, 0xf6, 0x90, 0x93, 0x22, 0x8a, + 0x46, 0x77, 0x38, 0x20, 0xa3, 0x13, 0x8a, 0x21, 0x61, 0x1b, 0xcc, 0xdb, 0x99, 0xc5, 0x4b, 0xb6, + 0xca, 0x3b, 0x63, 0x18, 0xc9, 0x6e, 0x6e, 0xe1, 0xca, 0x93, 0xa5, 0xa1, 0x9c, 0x11, 0xb8, 0x07, + 0x2a, 0x1d, 0x99, 0x31, 0xd7, 0x09, 0xa7, 0x66, 0xb8, 0x6d, 0x94, 0x8c, 0x55, 0xbe, 0xa8, 0xed, + 0xe6, 0x99, 0xc7, 0x5d, 0x75, 0x31, 0x4f, 0x44, 0xfd, 0x18, 0xda, 0xef, 0x0a, 0xb8, 0x30, 0xf4, + 0x2e, 0xfe, 0x87, 0xea, 0xa3, 0xd9, 0xea, 0xbb, 0x71, 0x2a, 0xd5, 0x37, 0xb8, 0xec, 0x7e, 0x98, + 0xfa, 0x87, 0x50, 0x45, 0xbd, 0x61, 0x50, 0xf2, 0xa2, 0xfd, 0x40, 0xc6, 0x7a, 0x65, 0xdc, 0xe2, + 0xe1, 0xba, 0xc6, 0x1c, 0xff, 0x7e, 0xc7, 0x47, 0x94, 0xa0, 0xc2, 0xcf, 0xc1, 0xa2, 0x2d, 0x5f, + 0x08, 0x1c, 0x80, 0x3a, 0x41, 0xb4, 0x05, 0xfd, 0x8b, 0x0a, 0x3a, 0xdb, 0xeb, 0xaa, 0x8b, 0x9b, + 0x39, 0x58, 0xd4, 0x67, 0x08, 0xb6, 0x40, 0x39, 0xa9, 0x80, 0x68, 0x6d, 0x7e, 0xf3, 0x05, 0x52, + 0xee, 0x3a, 0xc6, 0x4b, 0x32, 0xc7, 0xe5, 0x84, 0xc6, 0x50, 0x1a, 0x1e, 0xde, 0x07, 0x73, 0x07, + 0x98, 0xb6, 0xda, 0x3e, 0x91, 0x0b, 0x69, 0xb8, 0x41, 0xbc, 0xca, 0x97, 0xc5, 0x5b, 0x69, 0xc6, + 0x71, 0x57, 0xad, 0x64, 0x08, 0x62, 0x5b, 0xc8, 0x2a, 0xc3, 0xc7, 0x0a, 0x58, 0xc4, 0xd9, 0xe7, + 0x23, 0xab, 0x9e, 0x11, 0x11, 0x5c, 0x1b, 0x23, 0x82, 0xdc, 0x0b, 0xd4, 0xa8, 0xca, 0x30, 0x16, + 0x73, 0x0c, 0x86, 0xfa, 0xac, 0xc1, 0x2f, 0xc0, 0x82, 0x9d, 0x79, 0xdd, 0xb1, 0xea, 0x94, 0x70, + 0x60, 0xec, 0xab, 0x8b, 0x11, 0x92, 0x97, 0x6c, 0x96, 0xce, 0x50, 0xde, 0x14, 0xb4, 0x40, 0xa9, + 0x83, 0x7d, 0x8a, 0xf7, 0xf9, 0x43, 0x63, 0x5a, 0xd8, 0xbd, 0x3c, 0xd6, 0xd5, 0x85, 0xba, 0xc9, + 0x7e, 0x19, 0x51, 0x18, 0x4a, 0x80, 0xb5, 0x9f, 0x26, 0x81, 0x7a, 0xc2, 0xa7, 0x1c, 0xde, 0x05, + 0xd0, 0xdd, 0x67, 0xc4, 0xef, 0x10, 0xeb, 0x76, 0xf8, 0xc6, 0x8f, 0x36, 0xe8, 0x42, 0xb2, 0x5e, + 0x6d, 0xf7, 0x49, 0xa0, 0x01, 0x5a, 0xd0, 0x06, 0xb3, 0x41, 0x6a, 0xf3, 0x1b, 0xe7, 0x45, 0x20, + 0x03, 0x4b, 0x2f, 0x8e, 0xc6, 0x62, 0xaf, 0xab, 0x66, 0x56, 0x49, 0x94, 0x81, 0x87, 0x26, 0x00, + 0x66, 0x72, 0x7b, 0x61, 0x03, 0xd4, 0x47, 0x1b, 0x67, 0xc9, 0x9d, 0xc5, 0x9f, 0xa0, 0xd4, 0x75, + 0xa5, 0x60, 0xb5, 0xbf, 0x14, 0x00, 0x92, 0xae, 0x80, 0x17, 0x41, 0xea, 0x19, 0x2f, 0xbf, 0x62, + 0x45, 0x0e, 0x81, 0x52, 0x74, 0xb8, 0x0a, 0xa6, 0x6d, 0xc2, 0x18, 0x6e, 0x44, 0xef, 0x80, 0xf8, + 0x5f, 0x86, 0xcd, 0x90, 0x8c, 0x22, 0x3e, 0xdc, 0x03, 0x53, 0x3e, 0xc1, 0xcc, 0x75, 0xe4, 0xff, + 0x11, 0xef, 0xf1, 0xb5, 0x0a, 0x09, 0xca, 0x71, 0x57, 0x5d, 0x1b, 0xe5, 0x5f, 0x20, 0x5d, 0x6e, + 0x61, 0x42, 0x09, 0x49, 0x38, 0x78, 0x1b, 0x54, 0xa4, 0x8d, 0x94, 0xc3, 0x61, 0xd7, 0x9e, 0x97, + 0xde, 0x54, 0x36, 0xf3, 0x02, 0xa8, 0x5f, 0x47, 0xbb, 0x0b, 0x66, 0xa2, 0xea, 0x82, 0x55, 0x50, + 0x4c, 0x7d, 0xbe, 0xc3, 0xc0, 0x05, 0x25, 0x97, 0x98, 0xc9, 0xc1, 0x89, 0x31, 0xb6, 0x9f, 0x3c, + 0xaf, 0x4d, 0x3c, 0x7d, 0x5e, 0x9b, 0x78, 0xf6, 0xbc, 0x36, 0xf1, 0xb8, 0x57, 0x53, 0x9e, 0xf4, + 0x6a, 0xca, 0xd3, 0x5e, 0x4d, 0x79, 0xd6, 0xab, 0x29, 0xbf, 0xf6, 0x6a, 0xca, 0xb7, 0xbf, 0xd5, + 0x26, 0x3e, 0x5c, 0x1d, 0xf9, 0x5f, 0xbc, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xad, 0xe2, 0x61, + 0x96, 0x0a, 0x14, 0x00, 0x00, } func (m *AuditAnnotation) Marshal() (dAtA []byte, err error) { @@ -884,6 +920,25 @@ func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ParameterNotFoundAction != nil { + i -= len(*m.ParameterNotFoundAction) + copy(dAtA[i:], *m.ParameterNotFoundAction) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) + i-- + dAtA[i] = 0x22 + } + if m.Selector != nil { + { + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } i -= len(m.Namespace) copy(dAtA[i:], m.Namespace) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) @@ -1205,6 +1260,20 @@ func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } if len(m.MatchConditions) > 0 { for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { { @@ -1378,6 +1447,39 @@ func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Variable) 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 *Variable) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { offset -= sovGenerated(v) base := offset @@ -1501,6 +1603,14 @@ func (m *ParamRef) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Namespace) n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ParameterNotFoundAction != nil { + l = len(*m.ParameterNotFoundAction) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1642,6 +1752,12 @@ func (m *ValidatingAdmissionPolicySpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -1684,6 +1800,19 @@ func (m *Validation) Size() (n int) { return n } +func (m *Variable) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func sovGenerated(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1776,6 +1905,8 @@ func (this *ParamRef) String() string { s := strings.Join([]string{`&ParamRef{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, `}`, }, "") return s @@ -1882,6 +2013,11 @@ func (this *ValidatingAdmissionPolicySpec) String() string { repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," } repeatedStringForMatchConditions += "}" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, @@ -1889,6 +2025,7 @@ func (this *ValidatingAdmissionPolicySpec) String() string { `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `Variables:` + repeatedStringForVariables + `,`, `}`, }, "") return s @@ -1923,6 +2060,17 @@ func (this *Validation) String() string { }, "") return s } +func (this *Variable) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Variable{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} func valueToStringGenerated(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -2818,6 +2966,75 @@ func (m *ParamRef) Unmarshal(dAtA []byte) error { } m.Namespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParameterNotFoundAction", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ParameterNotFoundActionType(dAtA[iNdEx:postIndex]) + m.ParameterNotFoundAction = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3844,6 +4061,40 @@ func (m *ValidatingAdmissionPolicySpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Variables = append(m.Variables, Variable{}) + if err := m.Variables[len(m.Variables)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4183,6 +4434,120 @@ func (m *Validation) Unmarshal(dAtA []byte) error { } return nil } +func (m *Variable) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Variable: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Variable: 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGenerated(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto index c718c5464..db02dd929 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto +++ b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto @@ -227,16 +227,59 @@ message ParamKind { optional string kind = 2; } -// ParamRef references a parameter resource +// ParamRef describes how to locate the params to be used as input to +// expressions of rules applied by a policy binding. // +structType=atomic message ParamRef { - // Name of the resource being referenced. + // `name` is the name of the resource being referenced. + // + // `name` and `selector` are mutually exclusive properties. If one is set, + // the other must be unset. + // + // +optional optional string name = 1; - // Namespace of the referenced resource. - // Should be empty for the cluster-scoped resources + // namespace is the namespace of the referenced resource. Allows limiting + // the search for params to a specific namespace. Applies to both `name` and + // `selector` fields. + // + // A per-namespace parameter may be used by specifying a namespace-scoped + // `paramKind` in the policy and leaving this field empty. + // + // - If `paramKind` is cluster-scoped, this field MUST be unset. Setting this + // field results in a configuration error. + // + // - If `paramKind` is namespace-scoped, the namespace of the object being + // evaluated for admission will be used when this field is left unset. Take + // care that if this is left empty the binding must not match any cluster-scoped + // resources, which will result in an error. + // // +optional optional string namespace = 2; + + // selector can be used to match multiple param objects based on their labels. + // Supply selector: {} to match all resources of the ParamKind. + // + // If multiple params are found, they are all evaluated with the policy expressions + // and the results are ANDed together. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; + + // `parameterNotFoundAction` controls the behavior of the binding when the resource + // exists, and name or selector is valid, but there are no parameters + // matched by the binding. If the value is set to `Allow`, then no + // matched parameters will be treated as successful validation by the binding. + // If set to `Deny`, then no matched parameters will be subject to the + // `failurePolicy` of the policy. + // + // Allowed values are `Allow` or `Deny` + // Default to `Deny` + // +optional + optional string parameterNotFoundAction = 4; } // TypeChecking contains results of type checking the expressions in the @@ -267,6 +310,15 @@ message ValidatingAdmissionPolicy { // ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. // ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// +// The CEL expressions of a policy must have a computed CEL cost below the maximum +// CEL budget. Each evaluation of the policy is given an independent CEL cost budget. +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. message ValidatingAdmissionPolicyBinding { // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. // +optional @@ -294,9 +346,10 @@ message ValidatingAdmissionPolicyBindingSpec { // Required. optional string policyName = 1; - // ParamRef specifies the parameter resource used to configure the admission control policy. + // paramRef specifies the parameter resource used to configure the admission control policy. // It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. // +optional optional ParamRef paramRef = 2; @@ -430,6 +483,20 @@ message ValidatingAdmissionPolicySpec { // +listMapKey=name // +optional repeated MatchCondition matchConditions = 6; + + // Variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except MatchConditions because MatchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, Variables must be sorted by the order of first appearance and acyclic. + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + repeated Variable variables = 7; } // ValidatingAdmissionPolicyStatus represents the status of a ValidatingAdmissionPolicy. @@ -460,6 +527,9 @@ message Validation { // - 'oldObject' - The existing object. The value is null for CREATE requests. // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the @@ -525,3 +595,15 @@ message Validation { optional string messageExpression = 4; } +// Variable is the definition of a variable that is used for composition. +message Variable { + // Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. + // The variable can be accessed in other expressions through `variables` + // For example, if name is "foo", the variable will be available as `variables.foo` + optional string Name = 1; + + // Expression is the expression that will be evaluated as the value of the variable. + // The CEL expression has access to the same identifiers as the CEL expressions in Validation. + optional string Expression = 2; +} + diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types.go b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types.go index 2bbb55a47..575456c83 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types.go @@ -39,6 +39,18 @@ const ( AllScopes ScopeType = v1.AllScopes ) +// ParameterNotFoundActionType specifies a failure policy that defines how a binding +// is evaluated when the param referred by its perNamespaceParamRef is not found. +// +enum +type ParameterNotFoundActionType string + +const ( + // Ignore means that an error finding params for a binding is ignored + AllowAction ParameterNotFoundActionType = "Allow" + // Fail means that an error finding params for a binding is ignored + DenyAction ParameterNotFoundActionType = "Deny" +) + // FailurePolicyType specifies a failure policy that defines how unrecognized errors from the admission endpoint are handled. // +enum type FailurePolicyType string @@ -201,6 +213,20 @@ type ValidatingAdmissionPolicySpec struct { // +listMapKey=name // +optional MatchConditions []MatchCondition `json:"matchConditions,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,6,rep,name=matchConditions"` + + // Variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except MatchConditions because MatchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, Variables must be sorted by the order of first appearance and acyclic. + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + Variables []Variable `json:"variables" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=variables"` } type MatchCondition v1.MatchCondition @@ -228,6 +254,9 @@ type Validation struct { // - 'oldObject' - The existing object. The value is null for CREATE requests. // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the @@ -290,6 +319,18 @@ type Validation struct { MessageExpression string `json:"messageExpression,omitempty" protobuf:"bytes,4,opt,name=messageExpression"` } +// Variable is the definition of a variable that is used for composition. +type Variable struct { + // Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. + // The variable can be accessed in other expressions through `variables` + // For example, if name is "foo", the variable will be available as `variables.foo` + Name string `json:"name" protobuf:"bytes,1,opt,name=Name"` + + // Expression is the expression that will be evaluated as the value of the variable. + // The CEL expression has access to the same identifiers as the CEL expressions in Validation. + Expression string `json:"expression" protobuf:"bytes,2,opt,name=Expression"` +} + // AuditAnnotation describes how to produce an audit annotation for an API request. type AuditAnnotation struct { // key specifies the audit annotation key. The audit annotation keys of @@ -334,6 +375,15 @@ type AuditAnnotation struct { // ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. // ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// +// The CEL expressions of a policy must have a computed CEL cost below the maximum +// CEL budget. Each evaluation of the policy is given an independent CEL cost budget. +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. type ValidatingAdmissionPolicyBinding struct { metav1.TypeMeta `json:",inline"` // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. @@ -364,9 +414,10 @@ type ValidatingAdmissionPolicyBindingSpec struct { // Required. PolicyName string `json:"policyName,omitempty" protobuf:"bytes,1,rep,name=policyName"` - // ParamRef specifies the parameter resource used to configure the admission control policy. + // paramRef specifies the parameter resource used to configure the admission control policy. // It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. // +optional ParamRef *ParamRef `json:"paramRef,omitempty" protobuf:"bytes,2,rep,name=paramRef"` @@ -421,15 +472,59 @@ type ValidatingAdmissionPolicyBindingSpec struct { ValidationActions []ValidationAction `json:"validationActions,omitempty" protobuf:"bytes,4,rep,name=validationActions"` } -// ParamRef references a parameter resource +// ParamRef describes how to locate the params to be used as input to +// expressions of rules applied by a policy binding. // +structType=atomic type ParamRef struct { - // Name of the resource being referenced. + // `name` is the name of the resource being referenced. + // + // `name` and `selector` are mutually exclusive properties. If one is set, + // the other must be unset. + // + // +optional Name string `json:"name,omitempty" protobuf:"bytes,1,rep,name=name"` - // Namespace of the referenced resource. - // Should be empty for the cluster-scoped resources + + // namespace is the namespace of the referenced resource. Allows limiting + // the search for params to a specific namespace. Applies to both `name` and + // `selector` fields. + // + // A per-namespace parameter may be used by specifying a namespace-scoped + // `paramKind` in the policy and leaving this field empty. + // + // - If `paramKind` is cluster-scoped, this field MUST be unset. Setting this + // field results in a configuration error. + // + // - If `paramKind` is namespace-scoped, the namespace of the object being + // evaluated for admission will be used when this field is left unset. Take + // care that if this is left empty the binding must not match any cluster-scoped + // resources, which will result in an error. + // // +optional Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,rep,name=namespace"` + + // selector can be used to match multiple param objects based on their labels. + // Supply selector: {} to match all resources of the ParamKind. + // + // If multiple params are found, they are all evaluated with the policy expressions + // and the results are ANDed together. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,rep,name=selector"` + + // `parameterNotFoundAction` controls the behavior of the binding when the resource + // exists, and name or selector is valid, but there are no parameters + // matched by the binding. If the value is set to `Allow`, then no + // matched parameters will be treated as successful validation by the binding. + // If set to `Deny`, then no matched parameters will be subject to the + // `failurePolicy` of the policy. + // + // Allowed values are `Allow` or `Deny` + // Default to `Deny` + // +optional + ParameterNotFoundAction *ParameterNotFoundActionType `json:"parameterNotFoundAction,omitempty" protobuf:"bytes,4,rep,name=parameterNotFoundAction"` } // MatchResources decides whether to run the admission control policy on an object based diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go index b3cac1821..dcf46b324 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go @@ -80,9 +80,11 @@ func (ParamKind) SwaggerDoc() map[string]string { } var map_ParamRef = map[string]string{ - "": "ParamRef references a parameter resource", - "name": "Name of the resource being referenced.", - "namespace": "Namespace of the referenced resource. Should be empty for the cluster-scoped resources", + "": "ParamRef describes how to locate the params to be used as input to expressions of rules applied by a policy binding.", + "name": "`name` is the name of the resource being referenced.\n\n`name` and `selector` are mutually exclusive properties. If one is set, the other must be unset.", + "namespace": "namespace is the namespace of the referenced resource. Allows limiting the search for params to a specific namespace. Applies to both `name` and `selector` fields.\n\nA per-namespace parameter may be used by specifying a namespace-scoped `paramKind` in the policy and leaving this field empty.\n\n- If `paramKind` is cluster-scoped, this field MUST be unset. Setting this field results in a configuration error.\n\n- If `paramKind` is namespace-scoped, the namespace of the object being evaluated for admission will be used when this field is left unset. Take care that if this is left empty the binding must not match any cluster-scoped resources, which will result in an error.", + "selector": "selector can be used to match multiple param objects based on their labels. Supply selector: {} to match all resources of the ParamKind.\n\nIf multiple params are found, they are all evaluated with the policy expressions and the results are ANDed together.\n\nOne of `name` or `selector` must be set, but `name` and `selector` are mutually exclusive properties. If one is set, the other must be unset.", + "parameterNotFoundAction": "`parameterNotFoundAction` controls the behavior of the binding when the resource exists, and name or selector is valid, but there are no parameters matched by the binding. If the value is set to `Allow`, then no matched parameters will be treated as successful validation by the binding. If set to `Deny`, then no matched parameters will be subject to the `failurePolicy` of the policy.\n\nAllowed values are `Allow` or `Deny` Default to `Deny`", } func (ParamRef) SwaggerDoc() map[string]string { @@ -110,7 +112,7 @@ func (ValidatingAdmissionPolicy) SwaggerDoc() map[string]string { } var map_ValidatingAdmissionPolicyBinding = map[string]string{ - "": "ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters.", + "": "ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters.\n\nFor a given admission request, each binding will cause its policy to be evaluated N times, where N is 1 for policies/bindings that don't use params, otherwise N is the number of parameters selected by the binding.\n\nThe CEL expressions of a policy must have a computed CEL cost below the maximum CEL budget. Each evaluation of the policy is given an independent CEL cost budget. Adding/removing policies, bindings, or params can not affect whether a given (policy, binding, param) combination is within its own CEL budget.", "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", "spec": "Specification of the desired behavior of the ValidatingAdmissionPolicyBinding.", } @@ -132,7 +134,7 @@ func (ValidatingAdmissionPolicyBindingList) SwaggerDoc() map[string]string { var map_ValidatingAdmissionPolicyBindingSpec = map[string]string{ "": "ValidatingAdmissionPolicyBindingSpec is the specification of the ValidatingAdmissionPolicyBinding.", "policyName": "PolicyName references a ValidatingAdmissionPolicy name which the ValidatingAdmissionPolicyBinding binds to. If the referenced resource does not exist, this binding is considered invalid and will be ignored Required.", - "paramRef": "ParamRef specifies the parameter resource used to configure the admission control policy. It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied.", + "paramRef": "paramRef specifies the parameter resource used to configure the admission control policy. It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param.", "matchResources": "MatchResources declares what resources match this binding and will be validated by it. Note that this is intersected with the policy's matchConstraints, so only requests that are matched by the policy can be selected by this. If this is unset, all resources matched by the policy are validated by this binding When resourceRules is unset, it does not constrain resource matching. If a resource is matched by the other fields of this object, it will be validated. Note that this is differs from ValidatingAdmissionPolicy matchConstraints, where resourceRules are required.", "validationActions": "validationActions declares how Validations of the referenced ValidatingAdmissionPolicy are enforced. If a validation evaluates to false it is always enforced according to these actions.\n\nFailures defined by the ValidatingAdmissionPolicy's FailurePolicy are enforced according to these actions only if the FailurePolicy is set to Fail, otherwise the failures are ignored. This includes compilation errors, runtime errors and misconfigurations of the policy.\n\nvalidationActions is declared as a set of action values. Order does not matter. validationActions may not contain duplicates of the same action.\n\nThe supported actions values are:\n\n\"Deny\" specifies that a validation failure results in a denied request.\n\n\"Warn\" specifies that a validation failure is reported to the request client in HTTP Warning headers, with a warning code of 299. Warnings can be sent both for allowed or denied admission responses.\n\n\"Audit\" specifies that a validation failure is included in the published audit event for the request. The audit event will contain a `validation.policy.admission.k8s.io/validation_failure` audit annotation with a value containing the details of the validation failures, formatted as a JSON list of objects, each with the following fields: - message: The validation failure message string - policy: The resource name of the ValidatingAdmissionPolicy - binding: The resource name of the ValidatingAdmissionPolicyBinding - expressionIndex: The index of the failed validations in the ValidatingAdmissionPolicy - validationActions: The enforcement actions enacted for the validation failure Example audit annotation: `\"validation.policy.admission.k8s.io/validation_failure\": \"[{\"message\": \"Invalid value\", {\"policy\": \"policy.example.com\", {\"binding\": \"policybinding.example.com\", {\"expressionIndex\": \"1\", {\"validationActions\": [\"Audit\"]}]\"`\n\nClients should expect to handle additional values by ignoring any values not recognized.\n\n\"Deny\" and \"Warn\" may not be used together since this combination needlessly duplicates the validation failure both in the API response body and the HTTP warning headers.\n\nRequired.", } @@ -159,6 +161,7 @@ var map_ValidatingAdmissionPolicySpec = map[string]string{ "failurePolicy": "failurePolicy defines how to handle failures for the admission policy. Failures can occur from CEL expression parse errors, type check errors, runtime errors and invalid or mis-configured policy definitions or bindings.\n\nA policy is invalid if spec.paramKind refers to a non-existent Kind. A binding is invalid if spec.paramRef.name refers to a non-existent resource.\n\nfailurePolicy does not define how validations that evaluate to false are handled.\n\nWhen failurePolicy is set to Fail, ValidatingAdmissionPolicyBinding validationActions define how failures are enforced.\n\nAllowed values are Ignore or Fail. Defaults to Fail.", "auditAnnotations": "auditAnnotations contains CEL expressions which are used to produce audit annotations for the audit event of the API request. validations and auditAnnotations may not both be empty; a least one of validations or auditAnnotations is required.", "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be validated. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nIf a parameter object is provided, it can be accessed via the `params` handle in the same manner as validation expressions.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the policy is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the policy is skipped", + "variables": "Variables contain definitions of variables that can be used in composition of other expressions. Each variable is defined as a named CEL expression. The variables defined here will be available under `variables` in other expressions of the policy except MatchConditions because MatchConditions are evaluated before the rest of the policy.\n\nThe expression of a variable can refer to other variables defined earlier in the list but not those after. Thus, Variables must be sorted by the order of first appearance and acyclic.", } func (ValidatingAdmissionPolicySpec) SwaggerDoc() map[string]string { @@ -178,7 +181,7 @@ func (ValidatingAdmissionPolicyStatus) SwaggerDoc() map[string]string { var map_Validation = map[string]string{ "": "Validation specifies the CEL expression which is used to apply the validation.", - "expression": "Expression represents the expression which will be evaluated by CEL. ref: https://github.com/google/cel-spec CEL expressions have access to the contents of the API request/response, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nThe `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the object. No other metadata properties are accessible.\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Accessible property names are escaped according to the following rules when accessed in the expression: - '__' escapes to '__underscores__' - '.' escapes to '__dot__' - '-' escapes to '__dash__' - '/' escapes to '__slash__' - Property names that exactly match a CEL RESERVED keyword escape to '__{keyword}__'. The keywords are:\n\t \"true\", \"false\", \"null\", \"in\", \"as\", \"break\", \"const\", \"continue\", \"else\", \"for\", \"function\", \"if\",\n\t \"import\", \"let\", \"loop\", \"package\", \"namespace\", \"return\".\nExamples:\n - Expression accessing a property named \"namespace\": {\"Expression\": \"object.__namespace__ > 0\"}\n - Expression accessing a property named \"x-prop\": {\"Expression\": \"object.x__dash__prop > 0\"}\n - Expression accessing a property named \"redact__d\": {\"Expression\": \"object.redact__underscores__d > 0\"}\n\nEquality on arrays with list type of 'set' or 'map' ignores element order, i.e. [1, 2] == [2, 1]. Concatenation on arrays with x-kubernetes-list-type use the semantics of the list type:\n - 'set': `X + Y` performs a union where the array positions of all elements in `X` are preserved and\n non-intersecting elements in `Y` are appended, retaining their partial order.\n - 'map': `X + Y` performs a merge where the array positions of all keys in `X` are preserved but the values\n are overwritten by values in `Y` when the key sets of `X` and `Y` intersect. Elements in `Y` with\n non-intersecting keys are appended, retaining their partial order.\nRequired.", + "expression": "Expression represents the expression which will be evaluated by CEL. ref: https://github.com/google/cel-spec CEL expressions have access to the contents of the API request/response, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nThe `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the object. No other metadata properties are accessible.\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Accessible property names are escaped according to the following rules when accessed in the expression: - '__' escapes to '__underscores__' - '.' escapes to '__dot__' - '-' escapes to '__dash__' - '/' escapes to '__slash__' - Property names that exactly match a CEL RESERVED keyword escape to '__{keyword}__'. The keywords are:\n\t \"true\", \"false\", \"null\", \"in\", \"as\", \"break\", \"const\", \"continue\", \"else\", \"for\", \"function\", \"if\",\n\t \"import\", \"let\", \"loop\", \"package\", \"namespace\", \"return\".\nExamples:\n - Expression accessing a property named \"namespace\": {\"Expression\": \"object.__namespace__ > 0\"}\n - Expression accessing a property named \"x-prop\": {\"Expression\": \"object.x__dash__prop > 0\"}\n - Expression accessing a property named \"redact__d\": {\"Expression\": \"object.redact__underscores__d > 0\"}\n\nEquality on arrays with list type of 'set' or 'map' ignores element order, i.e. [1, 2] == [2, 1]. Concatenation on arrays with x-kubernetes-list-type use the semantics of the list type:\n - 'set': `X + Y` performs a union where the array positions of all elements in `X` are preserved and\n non-intersecting elements in `Y` are appended, retaining their partial order.\n - 'map': `X + Y` performs a merge where the array positions of all keys in `X` are preserved but the values\n are overwritten by values in `Y` when the key sets of `X` and `Y` intersect. Elements in `Y` with\n non-intersecting keys are appended, retaining their partial order.\nRequired.", "message": "Message represents the message displayed when validation fails. The message is required if the Expression contains line breaks. The message must not contain line breaks. If unset, the message is \"failed rule: {Rule}\". e.g. \"must be a URL with the host matching spec.host\" If the Expression contains line breaks. Message is required. The message must not contain line breaks. If unset, the message is \"failed Expression: {Expression}\".", "reason": "Reason represents a machine-readable description of why this validation failed. If this is the first validation in the list to fail, this reason, as well as the corresponding HTTP response code, are used in the HTTP response to the client. The currently supported reasons are: \"Unauthorized\", \"Forbidden\", \"Invalid\", \"RequestEntityTooLarge\". If not set, StatusReasonInvalid is used in the response to the client.", "messageExpression": "messageExpression declares a CEL expression that evaluates to the validation failure message that is returned when this rule fails. Since messageExpression is used as a failure message, it must evaluate to a string. If both message and messageExpression are present on a validation, then messageExpression will be used if validation fails. If messageExpression results in a runtime error, the runtime error is logged, and the validation failure message is produced as if the messageExpression field were unset. If messageExpression evaluates to an empty string, a string with only spaces, or a string that contains line breaks, then the validation failure message will also be produced as if the messageExpression field were unset, and the fact that messageExpression produced an empty string/string with only spaces/string with line breaks will be logged. messageExpression has access to all the same variables as the `expression` except for 'authorizer' and 'authorizer.requestResource'. Example: \"object.x must be less than max (\"+string(params.max)+\")\"", @@ -188,4 +191,14 @@ func (Validation) SwaggerDoc() map[string]string { return map_Validation } +var map_Variable = map[string]string{ + "": "Variable is the definition of a variable that is used for composition.", + "name": "Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. The variable can be accessed in other expressions through `variables` For example, if name is \"foo\", the variable will be available as `variables.foo`", + "expression": "Expression is the expression that will be evaluated as the value of the variable. The CEL expression has access to the same identifiers as the CEL expressions in Validation.", +} + +func (Variable) SwaggerDoc() map[string]string { + return map_Variable +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go index 8e4abfd08..24cd0e4e9 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go @@ -160,6 +160,16 @@ func (in *ParamKind) DeepCopy() *ParamKind { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ParamRef) DeepCopyInto(out *ParamRef) { *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.ParameterNotFoundAction != nil { + in, out := &in.ParameterNotFoundAction, &out.ParameterNotFoundAction + *out = new(ParameterNotFoundActionType) + **out = **in + } return } @@ -288,7 +298,7 @@ func (in *ValidatingAdmissionPolicyBindingSpec) DeepCopyInto(out *ValidatingAdmi if in.ParamRef != nil { in, out := &in.ParamRef, &out.ParamRef *out = new(ParamRef) - **out = **in + (*in).DeepCopyInto(*out) } if in.MatchResources != nil { in, out := &in.MatchResources, &out.MatchResources @@ -381,6 +391,11 @@ func (in *ValidatingAdmissionPolicySpec) DeepCopyInto(out *ValidatingAdmissionPo *out = make([]MatchCondition, len(*in)) copy(*out, *in) } + if in.Variables != nil { + in, out := &in.Variables, &out.Variables + *out = make([]Variable, len(*in)) + copy(*out, *in) + } return } @@ -442,3 +457,19 @@ func (in *Validation) DeepCopy() *Validation { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Variable) DeepCopyInto(out *Variable) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Variable. +func (in *Variable) DeepCopy() *Variable { + if in == nil { + return nil + } + out := new(Variable) + in.DeepCopyInto(out) + return out +} diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index 8fb354c31..267ddc1cb 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -25,8 +25,9 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" - v1 "k8s.io/api/admissionregistration/v1" - v11 "k8s.io/apimachinery/pkg/apis/meta/v1" + v11 "k8s.io/api/admissionregistration/v1" + k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" @@ -45,10 +46,66 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *AuditAnnotation) Reset() { *m = AuditAnnotation{} } +func (*AuditAnnotation) ProtoMessage() {} +func (*AuditAnnotation) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{0} +} +func (m *AuditAnnotation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AuditAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AuditAnnotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_AuditAnnotation.Merge(m, src) +} +func (m *AuditAnnotation) XXX_Size() int { + return m.Size() +} +func (m *AuditAnnotation) XXX_DiscardUnknown() { + xxx_messageInfo_AuditAnnotation.DiscardUnknown(m) +} + +var xxx_messageInfo_AuditAnnotation proto.InternalMessageInfo + +func (m *ExpressionWarning) Reset() { *m = ExpressionWarning{} } +func (*ExpressionWarning) ProtoMessage() {} +func (*ExpressionWarning) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{1} +} +func (m *ExpressionWarning) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExpressionWarning) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExpressionWarning) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExpressionWarning.Merge(m, src) +} +func (m *ExpressionWarning) XXX_Size() int { + return m.Size() +} +func (m *ExpressionWarning) XXX_DiscardUnknown() { + xxx_messageInfo_ExpressionWarning.DiscardUnknown(m) +} + +var xxx_messageInfo_ExpressionWarning proto.InternalMessageInfo + func (m *MatchCondition) Reset() { *m = MatchCondition{} } func (*MatchCondition) ProtoMessage() {} func (*MatchCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{0} + return fileDescriptor_abeea74cbc46f55a, []int{2} } func (m *MatchCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -73,10 +130,38 @@ func (m *MatchCondition) XXX_DiscardUnknown() { var xxx_messageInfo_MatchCondition proto.InternalMessageInfo +func (m *MatchResources) Reset() { *m = MatchResources{} } +func (*MatchResources) ProtoMessage() {} +func (*MatchResources) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{3} +} +func (m *MatchResources) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MatchResources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MatchResources) XXX_Merge(src proto.Message) { + xxx_messageInfo_MatchResources.Merge(m, src) +} +func (m *MatchResources) XXX_Size() int { + return m.Size() +} +func (m *MatchResources) XXX_DiscardUnknown() { + xxx_messageInfo_MatchResources.DiscardUnknown(m) +} + +var xxx_messageInfo_MatchResources proto.InternalMessageInfo + func (m *MutatingWebhook) Reset() { *m = MutatingWebhook{} } func (*MutatingWebhook) ProtoMessage() {} func (*MutatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{1} + return fileDescriptor_abeea74cbc46f55a, []int{4} } func (m *MutatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -104,7 +189,7 @@ var xxx_messageInfo_MutatingWebhook proto.InternalMessageInfo func (m *MutatingWebhookConfiguration) Reset() { *m = MutatingWebhookConfiguration{} } func (*MutatingWebhookConfiguration) ProtoMessage() {} func (*MutatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{2} + return fileDescriptor_abeea74cbc46f55a, []int{5} } func (m *MutatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -132,7 +217,7 @@ var xxx_messageInfo_MutatingWebhookConfiguration proto.InternalMessageInfo func (m *MutatingWebhookConfigurationList) Reset() { *m = MutatingWebhookConfigurationList{} } func (*MutatingWebhookConfigurationList) ProtoMessage() {} func (*MutatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{3} + return fileDescriptor_abeea74cbc46f55a, []int{6} } func (m *MutatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -157,10 +242,94 @@ func (m *MutatingWebhookConfigurationList) XXX_DiscardUnknown() { var xxx_messageInfo_MutatingWebhookConfigurationList proto.InternalMessageInfo +func (m *NamedRuleWithOperations) Reset() { *m = NamedRuleWithOperations{} } +func (*NamedRuleWithOperations) ProtoMessage() {} +func (*NamedRuleWithOperations) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{7} +} +func (m *NamedRuleWithOperations) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NamedRuleWithOperations) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NamedRuleWithOperations) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedRuleWithOperations.Merge(m, src) +} +func (m *NamedRuleWithOperations) XXX_Size() int { + return m.Size() +} +func (m *NamedRuleWithOperations) XXX_DiscardUnknown() { + xxx_messageInfo_NamedRuleWithOperations.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedRuleWithOperations proto.InternalMessageInfo + +func (m *ParamKind) Reset() { *m = ParamKind{} } +func (*ParamKind) ProtoMessage() {} +func (*ParamKind) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{8} +} +func (m *ParamKind) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ParamKind) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ParamKind) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParamKind.Merge(m, src) +} +func (m *ParamKind) XXX_Size() int { + return m.Size() +} +func (m *ParamKind) XXX_DiscardUnknown() { + xxx_messageInfo_ParamKind.DiscardUnknown(m) +} + +var xxx_messageInfo_ParamKind proto.InternalMessageInfo + +func (m *ParamRef) Reset() { *m = ParamRef{} } +func (*ParamRef) ProtoMessage() {} +func (*ParamRef) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{9} +} +func (m *ParamRef) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ParamRef) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ParamRef) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParamRef.Merge(m, src) +} +func (m *ParamRef) XXX_Size() int { + return m.Size() +} +func (m *ParamRef) XXX_DiscardUnknown() { + xxx_messageInfo_ParamRef.DiscardUnknown(m) +} + +var xxx_messageInfo_ParamRef proto.InternalMessageInfo + func (m *ServiceReference) Reset() { *m = ServiceReference{} } func (*ServiceReference) ProtoMessage() {} func (*ServiceReference) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{4} + return fileDescriptor_abeea74cbc46f55a, []int{10} } func (m *ServiceReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -185,10 +354,234 @@ func (m *ServiceReference) XXX_DiscardUnknown() { var xxx_messageInfo_ServiceReference proto.InternalMessageInfo +func (m *TypeChecking) Reset() { *m = TypeChecking{} } +func (*TypeChecking) ProtoMessage() {} +func (*TypeChecking) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{11} +} +func (m *TypeChecking) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TypeChecking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *TypeChecking) XXX_Merge(src proto.Message) { + xxx_messageInfo_TypeChecking.Merge(m, src) +} +func (m *TypeChecking) XXX_Size() int { + return m.Size() +} +func (m *TypeChecking) XXX_DiscardUnknown() { + xxx_messageInfo_TypeChecking.DiscardUnknown(m) +} + +var xxx_messageInfo_TypeChecking proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicy) Reset() { *m = ValidatingAdmissionPolicy{} } +func (*ValidatingAdmissionPolicy) ProtoMessage() {} +func (*ValidatingAdmissionPolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{12} +} +func (m *ValidatingAdmissionPolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicy.Merge(m, src) +} +func (m *ValidatingAdmissionPolicy) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicy) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicy proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicyBinding) Reset() { *m = ValidatingAdmissionPolicyBinding{} } +func (*ValidatingAdmissionPolicyBinding) ProtoMessage() {} +func (*ValidatingAdmissionPolicyBinding) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{13} +} +func (m *ValidatingAdmissionPolicyBinding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicyBinding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicyBinding) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicyBinding.Merge(m, src) +} +func (m *ValidatingAdmissionPolicyBinding) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicyBinding) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicyBinding.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicyBinding proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicyBindingList) Reset() { *m = ValidatingAdmissionPolicyBindingList{} } +func (*ValidatingAdmissionPolicyBindingList) ProtoMessage() {} +func (*ValidatingAdmissionPolicyBindingList) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{14} +} +func (m *ValidatingAdmissionPolicyBindingList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicyBindingList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicyBindingList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicyBindingList.Merge(m, src) +} +func (m *ValidatingAdmissionPolicyBindingList) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicyBindingList) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicyBindingList.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicyBindingList proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicyBindingSpec) Reset() { *m = ValidatingAdmissionPolicyBindingSpec{} } +func (*ValidatingAdmissionPolicyBindingSpec) ProtoMessage() {} +func (*ValidatingAdmissionPolicyBindingSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{15} +} +func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicyBindingSpec.Merge(m, src) +} +func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicyBindingSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicyBindingSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicyBindingSpec proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicyList) Reset() { *m = ValidatingAdmissionPolicyList{} } +func (*ValidatingAdmissionPolicyList) ProtoMessage() {} +func (*ValidatingAdmissionPolicyList) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{16} +} +func (m *ValidatingAdmissionPolicyList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicyList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicyList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicyList.Merge(m, src) +} +func (m *ValidatingAdmissionPolicyList) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicyList) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicyList.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicyList proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicySpec) Reset() { *m = ValidatingAdmissionPolicySpec{} } +func (*ValidatingAdmissionPolicySpec) ProtoMessage() {} +func (*ValidatingAdmissionPolicySpec) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{17} +} +func (m *ValidatingAdmissionPolicySpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicySpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicySpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicySpec.Merge(m, src) +} +func (m *ValidatingAdmissionPolicySpec) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicySpec) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicySpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicySpec proto.InternalMessageInfo + +func (m *ValidatingAdmissionPolicyStatus) Reset() { *m = ValidatingAdmissionPolicyStatus{} } +func (*ValidatingAdmissionPolicyStatus) ProtoMessage() {} +func (*ValidatingAdmissionPolicyStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{18} +} +func (m *ValidatingAdmissionPolicyStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatingAdmissionPolicyStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ValidatingAdmissionPolicyStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatingAdmissionPolicyStatus.Merge(m, src) +} +func (m *ValidatingAdmissionPolicyStatus) XXX_Size() int { + return m.Size() +} +func (m *ValidatingAdmissionPolicyStatus) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatingAdmissionPolicyStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatingAdmissionPolicyStatus proto.InternalMessageInfo + func (m *ValidatingWebhook) Reset() { *m = ValidatingWebhook{} } func (*ValidatingWebhook) ProtoMessage() {} func (*ValidatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{5} + return fileDescriptor_abeea74cbc46f55a, []int{19} } func (m *ValidatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -216,7 +609,7 @@ var xxx_messageInfo_ValidatingWebhook proto.InternalMessageInfo func (m *ValidatingWebhookConfiguration) Reset() { *m = ValidatingWebhookConfiguration{} } func (*ValidatingWebhookConfiguration) ProtoMessage() {} func (*ValidatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{6} + return fileDescriptor_abeea74cbc46f55a, []int{20} } func (m *ValidatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -244,7 +637,7 @@ var xxx_messageInfo_ValidatingWebhookConfiguration proto.InternalMessageInfo func (m *ValidatingWebhookConfigurationList) Reset() { *m = ValidatingWebhookConfigurationList{} } func (*ValidatingWebhookConfigurationList) ProtoMessage() {} func (*ValidatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{7} + return fileDescriptor_abeea74cbc46f55a, []int{21} } func (m *ValidatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -269,15 +662,15 @@ func (m *ValidatingWebhookConfigurationList) XXX_DiscardUnknown() { var xxx_messageInfo_ValidatingWebhookConfigurationList proto.InternalMessageInfo -func (m *WebhookClientConfig) Reset() { *m = WebhookClientConfig{} } -func (*WebhookClientConfig) ProtoMessage() {} -func (*WebhookClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_abeea74cbc46f55a, []int{8} +func (m *Validation) Reset() { *m = Validation{} } +func (*Validation) ProtoMessage() {} +func (*Validation) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{22} } -func (m *WebhookClientConfig) XXX_Unmarshal(b []byte) error { +func (m *Validation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *WebhookClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Validation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -285,27 +678,99 @@ func (m *WebhookClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, } return b[:n], nil } -func (m *WebhookClientConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_WebhookClientConfig.Merge(m, src) +func (m *Validation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Validation.Merge(m, src) } -func (m *WebhookClientConfig) XXX_Size() int { +func (m *Validation) XXX_Size() int { return m.Size() } -func (m *WebhookClientConfig) XXX_DiscardUnknown() { - xxx_messageInfo_WebhookClientConfig.DiscardUnknown(m) +func (m *Validation) XXX_DiscardUnknown() { + xxx_messageInfo_Validation.DiscardUnknown(m) } -var xxx_messageInfo_WebhookClientConfig proto.InternalMessageInfo +var xxx_messageInfo_Validation proto.InternalMessageInfo -func init() { - proto.RegisterType((*MatchCondition)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchCondition") - proto.RegisterType((*MutatingWebhook)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhook") +func (m *Variable) Reset() { *m = Variable{} } +func (*Variable) ProtoMessage() {} +func (*Variable) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{23} +} +func (m *Variable) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Variable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Variable) XXX_Merge(src proto.Message) { + xxx_messageInfo_Variable.Merge(m, src) +} +func (m *Variable) XXX_Size() int { + return m.Size() +} +func (m *Variable) XXX_DiscardUnknown() { + xxx_messageInfo_Variable.DiscardUnknown(m) +} + +var xxx_messageInfo_Variable proto.InternalMessageInfo + +func (m *WebhookClientConfig) Reset() { *m = WebhookClientConfig{} } +func (*WebhookClientConfig) ProtoMessage() {} +func (*WebhookClientConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_abeea74cbc46f55a, []int{24} +} +func (m *WebhookClientConfig) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WebhookClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *WebhookClientConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_WebhookClientConfig.Merge(m, src) +} +func (m *WebhookClientConfig) XXX_Size() int { + return m.Size() +} +func (m *WebhookClientConfig) XXX_DiscardUnknown() { + xxx_messageInfo_WebhookClientConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_WebhookClientConfig proto.InternalMessageInfo + +func init() { + proto.RegisterType((*AuditAnnotation)(nil), "k8s.io.api.admissionregistration.v1beta1.AuditAnnotation") + proto.RegisterType((*ExpressionWarning)(nil), "k8s.io.api.admissionregistration.v1beta1.ExpressionWarning") + proto.RegisterType((*MatchCondition)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchCondition") + proto.RegisterType((*MatchResources)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchResources") + proto.RegisterType((*MutatingWebhook)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhook") proto.RegisterType((*MutatingWebhookConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfiguration") proto.RegisterType((*MutatingWebhookConfigurationList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfigurationList") + proto.RegisterType((*NamedRuleWithOperations)(nil), "k8s.io.api.admissionregistration.v1beta1.NamedRuleWithOperations") + proto.RegisterType((*ParamKind)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamKind") + proto.RegisterType((*ParamRef)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamRef") proto.RegisterType((*ServiceReference)(nil), "k8s.io.api.admissionregistration.v1beta1.ServiceReference") + proto.RegisterType((*TypeChecking)(nil), "k8s.io.api.admissionregistration.v1beta1.TypeChecking") + proto.RegisterType((*ValidatingAdmissionPolicy)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicy") + proto.RegisterType((*ValidatingAdmissionPolicyBinding)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding") + proto.RegisterType((*ValidatingAdmissionPolicyBindingList)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingList") + proto.RegisterType((*ValidatingAdmissionPolicyBindingSpec)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingSpec") + proto.RegisterType((*ValidatingAdmissionPolicyList)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyList") + proto.RegisterType((*ValidatingAdmissionPolicySpec)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicySpec") + proto.RegisterType((*ValidatingAdmissionPolicyStatus)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyStatus") proto.RegisterType((*ValidatingWebhook)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingWebhook") proto.RegisterType((*ValidatingWebhookConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration") proto.RegisterType((*ValidatingWebhookConfigurationList)(nil), "k8s.io.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationList") + proto.RegisterType((*Validation)(nil), "k8s.io.api.admissionregistration.v1beta1.Validation") + proto.RegisterType((*Variable)(nil), "k8s.io.api.admissionregistration.v1beta1.Variable") proto.RegisterType((*WebhookClientConfig)(nil), "k8s.io.api.admissionregistration.v1beta1.WebhookClientConfig") } @@ -314,73 +779,197 @@ func init() { } var fileDescriptor_abeea74cbc46f55a = []byte{ - // 1041 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x73, 0xdb, 0xc4, - 0x1b, 0x8e, 0xe2, 0xf8, 0x17, 0x67, 0xed, 0x24, 0xcd, 0xfe, 0x80, 0x88, 0xd0, 0xb1, 0x3c, 0x3e, - 0x30, 0xbe, 0x20, 0xb5, 0x29, 0x03, 0xa5, 0x0c, 0x87, 0x2a, 0xb4, 0x03, 0x33, 0x49, 0x5a, 0x36, - 0xfd, 0x33, 0x03, 0x65, 0xa6, 0x6b, 0xf9, 0xb5, 0xbd, 0x58, 0xd2, 0x7a, 0xb4, 0xab, 0xb4, 0x19, - 0x2e, 0x7c, 0x04, 0xbe, 0x02, 0x1f, 0x84, 0x03, 0xb7, 0x1c, 0x7b, 0xec, 0x05, 0x0d, 0x11, 0x67, - 0x0e, 0x5c, 0x73, 0x62, 0xb4, 0x52, 0x6c, 0xcb, 0x76, 0x5a, 0x11, 0x66, 0x72, 0xca, 0xcd, 0xfb, - 0xbc, 0xfb, 0xbe, 0xcf, 0x3e, 0xab, 0x77, 0xdf, 0x67, 0x8c, 0xbe, 0x19, 0xdc, 0x16, 0x26, 0xe3, - 0xd6, 0x20, 0x6c, 0x43, 0xe0, 0x83, 0x04, 0x61, 0x1d, 0x82, 0xdf, 0xe1, 0x81, 0x95, 0x05, 0xe8, - 0x90, 0x59, 0xb4, 0xe3, 0x31, 0x21, 0x18, 0xf7, 0x03, 0xe8, 0x31, 0x21, 0x03, 0x2a, 0x19, 0xf7, - 0xad, 0xc3, 0x9b, 0x6d, 0x90, 0xf4, 0xa6, 0xd5, 0x03, 0x1f, 0x02, 0x2a, 0xa1, 0x63, 0x0e, 0x03, - 0x2e, 0x39, 0x6e, 0xa5, 0x99, 0x26, 0x1d, 0x32, 0x73, 0x6e, 0xa6, 0x99, 0x65, 0x6e, 0x7d, 0xd4, - 0x63, 0xb2, 0x1f, 0xb6, 0x4d, 0x87, 0x7b, 0x56, 0x8f, 0xf7, 0xb8, 0xa5, 0x0a, 0xb4, 0xc3, 0xae, - 0x5a, 0xa9, 0x85, 0xfa, 0x95, 0x16, 0xde, 0xba, 0x55, 0xe0, 0x48, 0xd3, 0xa7, 0xd9, 0xfa, 0x78, - 0x9c, 0xe4, 0x51, 0xa7, 0xcf, 0x7c, 0x08, 0x8e, 0xac, 0xe1, 0xa0, 0x97, 0x00, 0xc2, 0xf2, 0x40, - 0xd2, 0x79, 0x59, 0xd6, 0x79, 0x59, 0x41, 0xe8, 0x4b, 0xe6, 0xc1, 0x4c, 0xc2, 0x27, 0x6f, 0x4b, - 0x10, 0x4e, 0x1f, 0x3c, 0x3a, 0x9d, 0xd7, 0xec, 0xa2, 0xb5, 0x3d, 0x2a, 0x9d, 0xfe, 0x0e, 0xf7, - 0x3b, 0x2c, 0xd1, 0x80, 0x1b, 0x68, 0xc9, 0xa7, 0x1e, 0xe8, 0x5a, 0x43, 0x6b, 0xad, 0xd8, 0xb5, - 0xe3, 0xc8, 0x58, 0x88, 0x23, 0x63, 0x69, 0x9f, 0x7a, 0x40, 0x54, 0x04, 0x6f, 0x23, 0x04, 0x2f, - 0x87, 0x01, 0x28, 0xfd, 0xfa, 0xa2, 0xda, 0x87, 0xb3, 0x7d, 0xe8, 0xde, 0x28, 0x42, 0x26, 0x76, - 0x35, 0x7f, 0xab, 0xa0, 0xf5, 0xbd, 0x50, 0x52, 0xc9, 0xfc, 0xde, 0x53, 0x68, 0xf7, 0x39, 0x1f, - 0x14, 0x60, 0x7a, 0x81, 0x6a, 0x8e, 0xcb, 0xc0, 0x97, 0x3b, 0xdc, 0xef, 0xb2, 0x9e, 0xe2, 0xaa, - 0x6e, 0x7f, 0x61, 0x16, 0xfd, 0xc2, 0x66, 0x46, 0xb5, 0x33, 0x51, 0xc4, 0x7e, 0x27, 0x23, 0xaa, - 0x4d, 0xa2, 0x24, 0x47, 0x84, 0x9f, 0xa1, 0x72, 0x10, 0xba, 0x20, 0xf4, 0x52, 0xa3, 0xd4, 0xaa, - 0x6e, 0x7f, 0x5a, 0x84, 0xd1, 0x24, 0xa1, 0x0b, 0x4f, 0x99, 0xec, 0x3f, 0x18, 0x42, 0x0a, 0x0a, - 0x7b, 0x35, 0xe3, 0x2a, 0x27, 0x31, 0x41, 0xd2, 0xa2, 0x78, 0x17, 0xad, 0x76, 0x29, 0x73, 0xc3, - 0x00, 0x1e, 0x72, 0x97, 0x39, 0x47, 0xfa, 0x92, 0xba, 0x81, 0x0f, 0xe3, 0xc8, 0x58, 0xbd, 0x3f, - 0x19, 0x38, 0x8d, 0x8c, 0x8d, 0x1c, 0xf0, 0xe8, 0x68, 0x08, 0x24, 0x9f, 0x8c, 0xbf, 0x44, 0x55, - 0x2f, 0xf9, 0x84, 0x59, 0xad, 0x15, 0x55, 0xab, 0x19, 0x47, 0x46, 0x75, 0x6f, 0x0c, 0x9f, 0x46, - 0xc6, 0xfa, 0xc4, 0x52, 0xd5, 0x99, 0x4c, 0xc3, 0x2f, 0xd1, 0x46, 0x72, 0xe5, 0x62, 0x48, 0x1d, - 0x38, 0x00, 0x17, 0x1c, 0xc9, 0x03, 0xbd, 0xac, 0xee, 0xfb, 0xd6, 0x84, 0xfa, 0x51, 0x73, 0x99, - 0xc3, 0x41, 0x2f, 0x01, 0x84, 0x99, 0xf4, 0x70, 0x22, 0x7f, 0x97, 0xb6, 0xc1, 0x3d, 0x4b, 0xb5, - 0xdf, 0x8d, 0x23, 0x63, 0x63, 0x7f, 0xba, 0x22, 0x99, 0x25, 0xc1, 0x1c, 0xad, 0xf1, 0xf6, 0x0f, - 0xe0, 0xc8, 0x11, 0x6d, 0xf5, 0xe2, 0xb4, 0x38, 0x8e, 0x8c, 0xb5, 0x07, 0xb9, 0x72, 0x64, 0xaa, - 0x7c, 0x72, 0x61, 0x82, 0x75, 0xe0, 0x5e, 0xb7, 0x0b, 0x8e, 0x14, 0xfa, 0xff, 0xc6, 0x17, 0x76, - 0x30, 0x86, 0x93, 0x0b, 0x1b, 0x2f, 0x77, 0x5c, 0x2a, 0x04, 0x99, 0x4c, 0xc3, 0x77, 0xd0, 0x5a, - 0xf2, 0xb0, 0x78, 0x28, 0x0f, 0xc0, 0xe1, 0x7e, 0x47, 0xe8, 0xcb, 0x0d, 0xad, 0x55, 0x4e, 0x4f, - 0xf0, 0x28, 0x17, 0x21, 0x53, 0x3b, 0xf1, 0x63, 0xb4, 0x39, 0xea, 0x22, 0x02, 0x87, 0x0c, 0x5e, - 0x3c, 0x81, 0x20, 0x59, 0x08, 0xbd, 0xd2, 0x28, 0xb5, 0x56, 0xec, 0x0f, 0xe2, 0xc8, 0xd8, 0xbc, - 0x3b, 0x7f, 0x0b, 0x39, 0x2f, 0x17, 0x3f, 0x47, 0x38, 0x00, 0xe6, 0x1f, 0x72, 0x47, 0xb5, 0x5f, - 0xd6, 0x10, 0x48, 0xe9, 0xbb, 0x11, 0x47, 0x06, 0x26, 0x33, 0xd1, 0xd3, 0xc8, 0x78, 0x6f, 0x16, - 0x55, 0xed, 0x31, 0xa7, 0x16, 0xfe, 0x11, 0xad, 0x7b, 0xb9, 0x71, 0x21, 0xf4, 0x9a, 0x7a, 0x21, - 0xb7, 0x8b, 0xbf, 0xc9, 0xfc, 0xbc, 0xb1, 0x37, 0xb3, 0x27, 0xb2, 0x9e, 0xc7, 0x05, 0x99, 0x66, - 0x6a, 0xfe, 0xae, 0xa1, 0xeb, 0x53, 0x33, 0x24, 0x7d, 0xae, 0x61, 0xca, 0x80, 0x9f, 0xa3, 0x4a, - 0xd2, 0x15, 0x1d, 0x2a, 0xa9, 0x1a, 0x2a, 0xd5, 0xed, 0x1b, 0xc5, 0x7a, 0x28, 0x6d, 0x98, 0x3d, - 0x90, 0x74, 0x3c, 0xc8, 0xc6, 0x18, 0x19, 0x55, 0xc5, 0xdf, 0xa1, 0x4a, 0xc6, 0x2c, 0xf4, 0x45, - 0x25, 0xfc, 0xb3, 0x7f, 0x21, 0x3c, 0x7f, 0x76, 0x7b, 0x29, 0xa1, 0x22, 0xa3, 0x82, 0xcd, 0xbf, - 0x34, 0xd4, 0x78, 0x93, 0xbe, 0x5d, 0x26, 0x24, 0x7e, 0x36, 0xa3, 0xd1, 0x2c, 0xf8, 0x4e, 0x98, - 0x48, 0x15, 0x5e, 0xcb, 0x14, 0x56, 0xce, 0x90, 0x09, 0x7d, 0x03, 0x54, 0x66, 0x12, 0xbc, 0x33, - 0x71, 0xf7, 0x2f, 0x2c, 0x2e, 0x77, 0xf0, 0xf1, 0x18, 0xfc, 0x3a, 0x29, 0x4e, 0x52, 0x8e, 0xe6, - 0x2f, 0x1a, 0xba, 0x76, 0x00, 0xc1, 0x21, 0x73, 0x80, 0x40, 0x17, 0x02, 0xf0, 0x1d, 0xc0, 0x16, - 0x5a, 0x19, 0x8d, 0x88, 0xcc, 0x19, 0x36, 0xb2, 0xec, 0x95, 0xd1, 0x38, 0x21, 0xe3, 0x3d, 0x23, - 0x17, 0x59, 0x3c, 0xd7, 0x45, 0xae, 0xa3, 0xa5, 0x21, 0x95, 0x7d, 0xbd, 0xa4, 0x76, 0x54, 0x92, - 0xe8, 0x43, 0x2a, 0xfb, 0x44, 0xa1, 0x2a, 0xca, 0x03, 0xa9, 0x66, 0x70, 0x39, 0x8b, 0xf2, 0x40, - 0x12, 0x85, 0x36, 0x4f, 0x96, 0xd1, 0xc6, 0x13, 0xea, 0xb2, 0xce, 0x95, 0x73, 0x5d, 0x39, 0xd7, - 0xdb, 0x9d, 0x0b, 0x5d, 0x39, 0xd7, 0x85, 0x9c, 0x6b, 0x8e, 0xaf, 0x54, 0x2f, 0xcd, 0x57, 0x4e, - 0x34, 0x54, 0x9f, 0x79, 0xe3, 0x97, 0xed, 0x2c, 0xdf, 0xcf, 0x38, 0xcb, 0xe7, 0xc5, 0xa5, 0xcf, - 0x9c, 0x7e, 0xc6, 0x5b, 0xfe, 0xd6, 0x50, 0xf3, 0xcd, 0x1a, 0x2f, 0xc1, 0x5d, 0xbc, 0xbc, 0xbb, - 0x7c, 0xf5, 0x1f, 0x04, 0x16, 0xf1, 0x97, 0x5f, 0x35, 0xf4, 0xff, 0x39, 0x63, 0x14, 0xbf, 0x8f, - 0x4a, 0x61, 0xe0, 0x66, 0x76, 0xb0, 0x1c, 0x47, 0x46, 0xe9, 0x31, 0xd9, 0x25, 0x09, 0x86, 0x29, - 0x5a, 0x16, 0xa9, 0x23, 0x65, 0xf2, 0xef, 0x14, 0x3f, 0xe3, 0xb4, 0x95, 0xd9, 0xd5, 0x38, 0x32, - 0x96, 0xcf, 0xd0, 0xb3, 0xba, 0xb8, 0x85, 0x2a, 0x0e, 0xb5, 0x43, 0xbf, 0xe3, 0xa6, 0x9e, 0x55, - 0xb3, 0x6b, 0xc9, 0x75, 0xed, 0xdc, 0x4d, 0x31, 0x32, 0x8a, 0xda, 0xfb, 0xc7, 0x27, 0xf5, 0x85, - 0x57, 0x27, 0xf5, 0x85, 0xd7, 0x27, 0xf5, 0x85, 0x9f, 0xe2, 0xba, 0x76, 0x1c, 0xd7, 0xb5, 0x57, - 0x71, 0x5d, 0x7b, 0x1d, 0xd7, 0xb5, 0x3f, 0xe2, 0xba, 0xf6, 0xf3, 0x9f, 0xf5, 0x85, 0x6f, 0x5b, - 0x45, 0xff, 0x28, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x1f, 0xf5, 0x97, 0x1c, 0x6c, 0x0f, 0x00, - 0x00, + // 1973 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x1a, 0x4d, 0x6f, 0x23, 0x49, + 0x35, 0x1d, 0xe7, 0xc3, 0x7e, 0xce, 0x97, 0x6b, 0x67, 0x89, 0x77, 0x76, 0xd6, 0x8e, 0x5a, 0x2b, + 0x94, 0x91, 0xc0, 0xde, 0xc9, 0xae, 0x76, 0x97, 0x59, 0x21, 0x14, 0x67, 0x67, 0x86, 0x99, 0x9d, + 0x64, 0x42, 0x65, 0x37, 0x91, 0x60, 0x57, 0x9a, 0x72, 0x77, 0xd9, 0x6e, 0x6c, 0x77, 0x37, 0x5d, + 0x6d, 0xcf, 0x04, 0x24, 0x40, 0xe2, 0xb0, 0x57, 0x24, 0x2e, 0x48, 0x9c, 0xf8, 0x0b, 0xdc, 0x91, + 0xe0, 0x36, 0xc7, 0xbd, 0x31, 0x12, 0xc2, 0x22, 0xe6, 0xc0, 0x89, 0x03, 0x07, 0x38, 0xe4, 0x02, + 0xaa, 0xea, 0xea, 0x4f, 0xb7, 0x27, 0x9d, 0x90, 0x09, 0x97, 0xb9, 0xa5, 0xdf, 0x67, 0xbd, 0x57, + 0xef, 0xab, 0x9e, 0x03, 0xdf, 0xeb, 0x7e, 0xc8, 0x6a, 0x86, 0x55, 0xef, 0x0e, 0x9a, 0xd4, 0x31, + 0xa9, 0x4b, 0x59, 0x7d, 0x48, 0x4d, 0xdd, 0x72, 0xea, 0x12, 0x41, 0x6c, 0xa3, 0x4e, 0xf4, 0xbe, + 0xc1, 0x98, 0x61, 0x99, 0x0e, 0x6d, 0x1b, 0xcc, 0x75, 0x88, 0x6b, 0x58, 0x66, 0x7d, 0x78, 0xab, + 0x49, 0x5d, 0x72, 0xab, 0xde, 0xa6, 0x26, 0x75, 0x88, 0x4b, 0xf5, 0x9a, 0xed, 0x58, 0xae, 0x85, + 0x36, 0x3d, 0xce, 0x1a, 0xb1, 0x8d, 0x5a, 0x2a, 0x67, 0x4d, 0x72, 0x5e, 0xff, 0x66, 0xdb, 0x70, + 0x3b, 0x83, 0x66, 0x4d, 0xb3, 0xfa, 0xf5, 0xb6, 0xd5, 0xb6, 0xea, 0x42, 0x40, 0x73, 0xd0, 0x12, + 0x5f, 0xe2, 0x43, 0xfc, 0xe5, 0x09, 0xbe, 0xfe, 0x6e, 0x86, 0x23, 0x25, 0x4f, 0x73, 0xfd, 0xbd, + 0x90, 0xa9, 0x4f, 0xb4, 0x8e, 0x61, 0x52, 0xe7, 0xb8, 0x6e, 0x77, 0xdb, 0x1c, 0xc0, 0xea, 0x7d, + 0xea, 0x92, 0x34, 0xae, 0xfa, 0x34, 0x2e, 0x67, 0x60, 0xba, 0x46, 0x9f, 0x4e, 0x30, 0xbc, 0x7f, + 0x16, 0x03, 0xd3, 0x3a, 0xb4, 0x4f, 0x92, 0x7c, 0x2a, 0x83, 0xd5, 0xed, 0x81, 0x6e, 0xb8, 0xdb, + 0xa6, 0x69, 0xb9, 0xc2, 0x08, 0xf4, 0x16, 0xe4, 0xba, 0xf4, 0xb8, 0xac, 0x6c, 0x28, 0x9b, 0x85, + 0x46, 0xf1, 0xd9, 0xa8, 0x3a, 0x33, 0x1e, 0x55, 0x73, 0x9f, 0xd0, 0x63, 0xcc, 0xe1, 0x68, 0x1b, + 0x56, 0x87, 0xa4, 0x37, 0xa0, 0x77, 0x9e, 0xda, 0x0e, 0x15, 0x2e, 0x28, 0xcf, 0x0a, 0xd2, 0x75, + 0x49, 0xba, 0x7a, 0x18, 0x47, 0xe3, 0x24, 0xbd, 0xda, 0x83, 0x52, 0xf8, 0x75, 0x44, 0x1c, 0xd3, + 0x30, 0xdb, 0xe8, 0x1b, 0x90, 0x6f, 0x19, 0xb4, 0xa7, 0x63, 0xda, 0x92, 0x02, 0xd7, 0xa4, 0xc0, + 0xfc, 0x5d, 0x09, 0xc7, 0x01, 0x05, 0xba, 0x09, 0x8b, 0x4f, 0x3c, 0xc6, 0x72, 0x4e, 0x10, 0xaf, + 0x4a, 0xe2, 0x45, 0x29, 0x0f, 0xfb, 0x78, 0xb5, 0x05, 0x2b, 0xbb, 0xc4, 0xd5, 0x3a, 0x3b, 0x96, + 0xa9, 0x1b, 0xc2, 0xc2, 0x0d, 0x98, 0x33, 0x49, 0x9f, 0x4a, 0x13, 0x97, 0x24, 0xe7, 0xdc, 0x1e, + 0xe9, 0x53, 0x2c, 0x30, 0x68, 0x0b, 0x80, 0x26, 0xed, 0x43, 0x92, 0x0e, 0x22, 0xa6, 0x45, 0xa8, + 0xd4, 0x3f, 0xcd, 0x49, 0x45, 0x98, 0x32, 0x6b, 0xe0, 0x68, 0x94, 0xa1, 0xa7, 0x50, 0xe2, 0xe2, + 0x98, 0x4d, 0x34, 0x7a, 0x40, 0x7b, 0x54, 0x73, 0x2d, 0x47, 0x68, 0x2d, 0x6e, 0xbd, 0x5b, 0x0b, + 0xc3, 0x34, 0xb8, 0xb1, 0x9a, 0xdd, 0x6d, 0x73, 0x00, 0xab, 0xf1, 0xc0, 0xa8, 0x0d, 0x6f, 0xd5, + 0x1e, 0x92, 0x26, 0xed, 0xf9, 0xac, 0x8d, 0xd7, 0xc7, 0xa3, 0x6a, 0x69, 0x2f, 0x29, 0x11, 0x4f, + 0x2a, 0x41, 0x16, 0xac, 0x58, 0xcd, 0x1f, 0x52, 0xcd, 0x0d, 0xd4, 0xce, 0x5e, 0x5c, 0x2d, 0x1a, + 0x8f, 0xaa, 0x2b, 0x8f, 0x62, 0xe2, 0x70, 0x42, 0x3c, 0xfa, 0x29, 0x2c, 0x3b, 0xd2, 0x6e, 0x3c, + 0xe8, 0x51, 0x56, 0xce, 0x6d, 0xe4, 0x36, 0x8b, 0x5b, 0xdb, 0xb5, 0xac, 0xd9, 0x58, 0xe3, 0x76, + 0xe9, 0x9c, 0xf7, 0xc8, 0x70, 0x3b, 0x8f, 0x6c, 0xea, 0xa1, 0x59, 0xe3, 0x75, 0xe9, 0xf7, 0x65, + 0x1c, 0x95, 0x8f, 0xe3, 0xea, 0xd0, 0xaf, 0x14, 0xb8, 0x46, 0x9f, 0x6a, 0xbd, 0x81, 0x4e, 0x63, + 0x74, 0xe5, 0xb9, 0xcb, 0x3a, 0xc7, 0x0d, 0x79, 0x8e, 0x6b, 0x77, 0x52, 0xd4, 0xe0, 0x54, 0xe5, + 0xe8, 0x63, 0x28, 0xf6, 0x79, 0x48, 0xec, 0x5b, 0x3d, 0x43, 0x3b, 0x2e, 0x2f, 0x8a, 0x40, 0x52, + 0xc7, 0xa3, 0x6a, 0x71, 0x37, 0x04, 0x9f, 0x8e, 0xaa, 0xab, 0x91, 0xcf, 0x4f, 0x8f, 0x6d, 0x8a, + 0xa3, 0x6c, 0xea, 0x1f, 0xf3, 0xb0, 0xba, 0x3b, 0xe0, 0xe9, 0x69, 0xb6, 0x8f, 0x68, 0xb3, 0x63, + 0x59, 0xdd, 0x0c, 0x31, 0xfc, 0x04, 0x96, 0xb4, 0x9e, 0x41, 0x4d, 0x77, 0xc7, 0x32, 0x5b, 0x46, + 0x5b, 0x06, 0xc0, 0xb7, 0xb3, 0x3b, 0x42, 0xaa, 0xda, 0x89, 0x08, 0x69, 0x5c, 0x93, 0x8a, 0x96, + 0xa2, 0x50, 0x1c, 0x53, 0x84, 0x3e, 0x87, 0x79, 0x27, 0x12, 0x02, 0x1f, 0x64, 0xd1, 0x58, 0x4b, + 0x71, 0xf8, 0xb2, 0xd4, 0x35, 0xef, 0x79, 0xd8, 0x13, 0x8a, 0x1e, 0xc2, 0x72, 0x8b, 0x18, 0xbd, + 0x81, 0x43, 0xa5, 0x53, 0xe7, 0x84, 0x07, 0xbe, 0xce, 0x23, 0xe4, 0x6e, 0x14, 0x71, 0x3a, 0xaa, + 0x96, 0x62, 0x00, 0xe1, 0xd8, 0x38, 0x73, 0xf2, 0x82, 0x0a, 0x17, 0xba, 0xa0, 0xf4, 0x3c, 0x9f, + 0xff, 0xff, 0xe4, 0x79, 0xf1, 0xe5, 0xe6, 0xf9, 0xc7, 0x50, 0x64, 0x86, 0x4e, 0xef, 0xb4, 0x5a, + 0x54, 0x73, 0x59, 0x79, 0x21, 0x74, 0xd8, 0x41, 0x08, 0xe6, 0x0e, 0x0b, 0x3f, 0x77, 0x7a, 0x84, + 0x31, 0x1c, 0x65, 0x43, 0xb7, 0x61, 0x85, 0x77, 0x25, 0x6b, 0xe0, 0x1e, 0x50, 0xcd, 0x32, 0x75, + 0x26, 0x52, 0x63, 0xde, 0x3b, 0xc1, 0xa7, 0x31, 0x0c, 0x4e, 0x50, 0xa2, 0xcf, 0x60, 0x3d, 0x88, + 0x22, 0x4c, 0x87, 0x06, 0x7d, 0x72, 0x48, 0x1d, 0xfe, 0xc1, 0xca, 0xf9, 0x8d, 0xdc, 0x66, 0xa1, + 0xf1, 0xe6, 0x78, 0x54, 0x5d, 0xdf, 0x4e, 0x27, 0xc1, 0xd3, 0x78, 0xd1, 0x63, 0x40, 0x0e, 0x35, + 0xcc, 0xa1, 0xa5, 0x89, 0xf0, 0x93, 0x01, 0x01, 0xc2, 0xbe, 0x77, 0xc6, 0xa3, 0x2a, 0xc2, 0x13, + 0xd8, 0xd3, 0x51, 0xf5, 0x6b, 0x93, 0x50, 0x11, 0x1e, 0x29, 0xb2, 0xd0, 0x4f, 0x60, 0xb5, 0x1f, + 0x6b, 0x44, 0xac, 0xbc, 0x24, 0x32, 0xe4, 0xc3, 0xec, 0x39, 0x19, 0xef, 0x64, 0x61, 0xcf, 0x8d, + 0xc3, 0x19, 0x4e, 0x6a, 0x52, 0xff, 0xa2, 0xc0, 0x8d, 0x44, 0x0d, 0xf1, 0xd2, 0x75, 0xe0, 0x69, + 0x40, 0x8f, 0x21, 0xcf, 0xa3, 0x42, 0x27, 0x2e, 0x91, 0x2d, 0xea, 0x9d, 0x6c, 0x31, 0xe4, 0x05, + 0xcc, 0x2e, 0x75, 0x49, 0xd8, 0x22, 0x43, 0x18, 0x0e, 0xa4, 0xa2, 0x1f, 0x40, 0x5e, 0x6a, 0x66, + 0xe5, 0x59, 0x61, 0xf8, 0xb7, 0xce, 0x61, 0x78, 0xfc, 0xec, 0x8d, 0x39, 0xae, 0x0a, 0x07, 0x02, + 0xd5, 0x7f, 0x28, 0xb0, 0xf1, 0x22, 0xfb, 0x1e, 0x1a, 0xcc, 0x45, 0x9f, 0x4f, 0xd8, 0x58, 0xcb, + 0x98, 0x27, 0x06, 0xf3, 0x2c, 0x0c, 0x66, 0x12, 0x1f, 0x12, 0xb1, 0xaf, 0x0b, 0xf3, 0x86, 0x4b, + 0xfb, 0xbe, 0x71, 0x77, 0x2f, 0x6c, 0x5c, 0xec, 0xe0, 0x61, 0x19, 0xbc, 0xcf, 0x85, 0x63, 0x4f, + 0x87, 0xfa, 0x5c, 0x81, 0xf5, 0x29, 0x9d, 0x0a, 0x7d, 0x10, 0xf6, 0x62, 0x51, 0x44, 0xca, 0x8a, + 0xc8, 0x8b, 0x52, 0xb4, 0x89, 0x0a, 0x04, 0x8e, 0xd3, 0xa1, 0x5f, 0x28, 0x80, 0x9c, 0x09, 0x79, + 0xb2, 0x73, 0x5c, 0xb8, 0x8e, 0x5f, 0x97, 0x06, 0xa0, 0x49, 0x1c, 0x4e, 0x51, 0xa7, 0x12, 0x28, + 0xec, 0x13, 0x87, 0xf4, 0x3f, 0x31, 0x4c, 0x9d, 0x4f, 0x62, 0xc4, 0x36, 0x64, 0x96, 0xca, 0x6e, + 0x17, 0x84, 0xd9, 0xf6, 0xfe, 0x7d, 0x89, 0xc1, 0x11, 0x2a, 0xde, 0x1b, 0xbb, 0x86, 0xa9, 0xcb, + 0xb9, 0x2d, 0xe8, 0x8d, 0x5c, 0x1e, 0x16, 0x18, 0xf5, 0x77, 0xb3, 0x90, 0x17, 0x3a, 0xf8, 0x2c, + 0x79, 0x76, 0x2b, 0xad, 0x43, 0x21, 0x28, 0xbd, 0x52, 0x6a, 0x49, 0x92, 0x15, 0x82, 0x32, 0x8d, + 0x43, 0x1a, 0xf4, 0x05, 0xe4, 0x99, 0x5f, 0x90, 0x73, 0x17, 0x2f, 0xc8, 0x4b, 0x3c, 0xd2, 0x82, + 0x52, 0x1c, 0x88, 0x44, 0x2e, 0xac, 0xdb, 0xfc, 0xf4, 0xd4, 0xa5, 0xce, 0x9e, 0xe5, 0xde, 0xb5, + 0x06, 0xa6, 0xbe, 0xad, 0x71, 0xef, 0xc9, 0x6e, 0x78, 0x9b, 0x97, 0xc0, 0xfd, 0x74, 0x92, 0xd3, + 0x51, 0xf5, 0xcd, 0x29, 0x28, 0x51, 0xba, 0xa6, 0x89, 0x56, 0x7f, 0xab, 0xc0, 0xda, 0x01, 0x75, + 0x86, 0x86, 0x46, 0x31, 0x6d, 0x51, 0x87, 0x9a, 0x5a, 0xc2, 0x35, 0x4a, 0x06, 0xd7, 0xf8, 0xde, + 0x9e, 0x9d, 0xea, 0xed, 0x1b, 0x30, 0x67, 0x13, 0xb7, 0x23, 0x07, 0xfb, 0x3c, 0xc7, 0xee, 0x13, + 0xb7, 0x83, 0x05, 0x54, 0x60, 0x2d, 0xc7, 0x15, 0x86, 0xce, 0x4b, 0xac, 0xe5, 0xb8, 0x58, 0x40, + 0xd5, 0x5f, 0x2b, 0xb0, 0xc4, 0xad, 0xd8, 0xe9, 0x50, 0xad, 0xcb, 0x9f, 0x15, 0x5f, 0x2a, 0x80, + 0x68, 0xf2, 0xb1, 0xe1, 0x65, 0x44, 0x71, 0xeb, 0xa3, 0xec, 0x29, 0x3a, 0xf1, 0x60, 0x09, 0xc3, + 0x7a, 0x02, 0xc5, 0x70, 0x8a, 0x4a, 0xf5, 0xcf, 0xb3, 0xf0, 0xc6, 0x21, 0xe9, 0x19, 0xba, 0x48, + 0xf5, 0xa0, 0x3f, 0xc9, 0xe6, 0xf0, 0xf2, 0xcb, 0xaf, 0x01, 0x73, 0xcc, 0xa6, 0x9a, 0xcc, 0xe6, + 0x7b, 0xd9, 0x4d, 0x9f, 0x7a, 0xe8, 0x03, 0x9b, 0x6a, 0xe1, 0x0d, 0xf2, 0x2f, 0x2c, 0x54, 0xa0, + 0x1f, 0xc1, 0x02, 0x73, 0x89, 0x3b, 0x60, 0x32, 0xf8, 0xef, 0x5f, 0x86, 0x32, 0x21, 0xb0, 0xb1, + 0x22, 0xd5, 0x2d, 0x78, 0xdf, 0x58, 0x2a, 0x52, 0xff, 0xad, 0xc0, 0xc6, 0x54, 0xde, 0x86, 0x61, + 0xea, 0x3c, 0x18, 0x5e, 0xbe, 0x93, 0xed, 0x98, 0x93, 0xf7, 0x2e, 0xc1, 0x6e, 0x79, 0xf6, 0x69, + 0xbe, 0x56, 0xff, 0xa5, 0xc0, 0xdb, 0x67, 0x31, 0x5f, 0x41, 0xf3, 0xb3, 0xe2, 0xcd, 0xef, 0xc1, + 0xe5, 0x59, 0x3e, 0xa5, 0x01, 0x7e, 0x99, 0x3b, 0xdb, 0x6e, 0xee, 0x26, 0xde, 0x41, 0x6c, 0x01, + 0xdc, 0x0b, 0x8b, 0x7c, 0x70, 0x89, 0xfb, 0x01, 0x06, 0x47, 0xa8, 0xb8, 0xaf, 0x6c, 0xd9, 0x1e, + 0xe4, 0x55, 0x6e, 0x65, 0x37, 0xc8, 0x6f, 0x2c, 0x5e, 0xf9, 0xf6, 0xbf, 0x70, 0x20, 0x11, 0xb9, + 0xb0, 0xd2, 0x8f, 0x2d, 0x0a, 0x64, 0x9a, 0x9c, 0x77, 0x0e, 0x0c, 0xf8, 0xbd, 0xb9, 0x39, 0x0e, + 0xc3, 0x09, 0x1d, 0xe8, 0x08, 0x4a, 0x43, 0xe9, 0x2f, 0xcb, 0xf4, 0x4a, 0xba, 0xf7, 0x3a, 0x2e, + 0x34, 0x6e, 0xf2, 0xf7, 0xc6, 0x61, 0x12, 0x79, 0x3a, 0xaa, 0xae, 0x25, 0x81, 0x78, 0x52, 0x86, + 0xfa, 0x77, 0x05, 0xde, 0x9a, 0x7a, 0x13, 0x57, 0x10, 0x7a, 0x9d, 0x78, 0xe8, 0xed, 0x5c, 0x46, + 0xe8, 0xa5, 0xc7, 0xdc, 0x6f, 0x16, 0x5e, 0x60, 0xa9, 0x08, 0xb6, 0xc7, 0x50, 0xb0, 0xfd, 0xd9, + 0x25, 0x65, 0xd3, 0x93, 0x25, 0x72, 0x38, 0x6b, 0x63, 0x99, 0xf7, 0xcf, 0xe0, 0x13, 0x87, 0x42, + 0xd1, 0x8f, 0x61, 0xcd, 0x9f, 0xed, 0x39, 0xbf, 0x61, 0xba, 0xfe, 0x80, 0x76, 0xf1, 0xf0, 0xb9, + 0x36, 0x1e, 0x55, 0xd7, 0x76, 0x13, 0x52, 0xf1, 0x84, 0x1e, 0xd4, 0x85, 0x62, 0x78, 0xfd, 0xfe, + 0xfb, 0xfe, 0xbd, 0xf3, 0xfb, 0xdb, 0x32, 0x1b, 0xaf, 0x49, 0x07, 0x17, 0x43, 0x18, 0xc3, 0x51, + 0xe9, 0x97, 0xfc, 0xd0, 0xff, 0x19, 0xac, 0x91, 0xf8, 0xa2, 0x93, 0x95, 0xe7, 0xcf, 0xfb, 0x08, + 0x49, 0xac, 0x4a, 0x1b, 0x65, 0x69, 0xc4, 0x5a, 0x02, 0xc1, 0xf0, 0x84, 0xb2, 0xb4, 0xd7, 0xdf, + 0xc2, 0x55, 0xbd, 0xfe, 0x90, 0x06, 0x85, 0x21, 0x71, 0x0c, 0xd2, 0xec, 0x51, 0xfe, 0xd4, 0xce, + 0x9d, 0xaf, 0xa0, 0x1d, 0x4a, 0xd6, 0x70, 0xb2, 0xf3, 0x21, 0x0c, 0x87, 0x72, 0xd5, 0x3f, 0xcc, + 0x42, 0xf5, 0x8c, 0xf6, 0x8d, 0x1e, 0x00, 0xb2, 0x9a, 0x8c, 0x3a, 0x43, 0xaa, 0xdf, 0xf3, 0x56, + 0xd1, 0xfe, 0x58, 0x9f, 0x0b, 0x07, 0xaa, 0x47, 0x13, 0x14, 0x38, 0x85, 0x0b, 0xf5, 0x60, 0xc9, + 0x8d, 0x8c, 0x7a, 0x32, 0x0b, 0xde, 0xcf, 0x6e, 0x57, 0x74, 0x50, 0x6c, 0xac, 0x8d, 0x47, 0xd5, + 0xd8, 0xe8, 0x88, 0x63, 0xd2, 0x91, 0x06, 0xa0, 0x85, 0x57, 0xe7, 0x85, 0x7e, 0x3d, 0x5b, 0x15, + 0x0b, 0x6f, 0x2c, 0xe8, 0x3b, 0x91, 0xcb, 0x8a, 0x88, 0x55, 0x4f, 0x16, 0xa1, 0x14, 0xba, 0xf0, + 0xd5, 0xae, 0xef, 0xd5, 0xae, 0xef, 0x85, 0xbb, 0x3e, 0x78, 0xb5, 0xeb, 0xbb, 0xd0, 0xae, 0x2f, + 0xa5, 0x16, 0x17, 0xaf, 0x6c, 0x13, 0x77, 0xa2, 0x40, 0x65, 0x22, 0xc7, 0xaf, 0x7a, 0x17, 0xf7, + 0xc5, 0xc4, 0x2e, 0xee, 0xa3, 0x8b, 0x8c, 0x4d, 0xd3, 0xb6, 0x71, 0xff, 0x54, 0x40, 0x7d, 0xb1, + 0x8d, 0x57, 0x30, 0x17, 0xf6, 0xe3, 0x73, 0xe1, 0x77, 0xff, 0x07, 0x03, 0xb3, 0x6c, 0xe4, 0xfe, + 0xa3, 0x00, 0x84, 0xc3, 0x0c, 0x7a, 0x1b, 0x22, 0x3f, 0x14, 0xca, 0xd2, 0xed, 0xb9, 0x29, 0x02, + 0x47, 0x37, 0x61, 0xb1, 0x4f, 0x19, 0x23, 0x6d, 0x7f, 0x21, 0x12, 0xfc, 0x8e, 0xb9, 0xeb, 0x81, + 0xb1, 0x8f, 0x47, 0x47, 0xb0, 0xe0, 0x50, 0xc2, 0x2c, 0x53, 0x2e, 0x46, 0xbe, 0xc3, 0x5f, 0xc1, + 0x58, 0x40, 0x4e, 0x47, 0xd5, 0x5b, 0x59, 0x7e, 0x67, 0xae, 0xc9, 0x47, 0xb3, 0x60, 0xc2, 0x52, + 0x1c, 0xba, 0x07, 0x25, 0xa9, 0x23, 0x72, 0x60, 0xaf, 0xd2, 0xbe, 0x21, 0x4f, 0x53, 0xda, 0x4d, + 0x12, 0xe0, 0x49, 0x1e, 0xf5, 0x01, 0xe4, 0xfd, 0xc1, 0x00, 0x95, 0x61, 0x2e, 0xf2, 0xde, 0xf2, + 0x0c, 0x17, 0x90, 0x84, 0x63, 0x66, 0xd3, 0x1d, 0xa3, 0xfe, 0x5e, 0x81, 0xd7, 0x52, 0x9a, 0x12, + 0x7a, 0x03, 0x72, 0x03, 0xa7, 0x27, 0x5d, 0xb0, 0x38, 0x1e, 0x55, 0x73, 0x9f, 0xe1, 0x87, 0x98, + 0xc3, 0x10, 0x81, 0x45, 0xe6, 0xad, 0xa7, 0x64, 0x30, 0xdd, 0xce, 0x7e, 0xe3, 0xc9, 0xbd, 0x56, + 0xa3, 0xc8, 0xef, 0xc0, 0x87, 0xfa, 0x72, 0xd1, 0x26, 0xe4, 0x35, 0xd2, 0x18, 0x98, 0x7a, 0xcf, + 0xbb, 0xaf, 0x25, 0xef, 0x8d, 0xb7, 0xb3, 0xed, 0xc1, 0x70, 0x80, 0x6d, 0xec, 0x3d, 0x3b, 0xa9, + 0xcc, 0x7c, 0x75, 0x52, 0x99, 0x79, 0x7e, 0x52, 0x99, 0xf9, 0xf9, 0xb8, 0xa2, 0x3c, 0x1b, 0x57, + 0x94, 0xaf, 0xc6, 0x15, 0xe5, 0xf9, 0xb8, 0xa2, 0xfc, 0x75, 0x5c, 0x51, 0x7e, 0xf9, 0xb7, 0xca, + 0xcc, 0xf7, 0x37, 0xb3, 0xfe, 0x97, 0xc3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x71, 0x54, 0x54, + 0xe6, 0x29, 0x21, 0x00, 0x00, +} + +func (m *AuditAnnotation) 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 *AuditAnnotation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AuditAnnotation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.ValueExpression) + copy(dAtA[i:], m.ValueExpression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValueExpression))) + i-- + dAtA[i] = 0x12 + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ExpressionWarning) 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 *ExpressionWarning) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExpressionWarning) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Warning) + copy(dAtA[i:], m.Warning) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Warning))) + i-- + dAtA[i] = 0x1a + i -= len(m.FieldRef) + copy(dAtA[i:], m.FieldRef) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.FieldRef))) + i-- + dAtA[i] = 0x12 + return len(dAtA) - i, nil } func (m *MatchCondition) Marshal() (dAtA []byte, err error) { @@ -416,6 +1005,88 @@ func (m *MatchCondition) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MatchResources) 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 *MatchResources) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MatchResources) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x3a + } + if len(m.ExcludeResourceRules) > 0 { + for iNdEx := len(m.ExcludeResourceRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ExcludeResourceRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.ResourceRules) > 0 { + for iNdEx := len(m.ResourceRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ResourceRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -642,7 +1313,7 @@ func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *ServiceReference) Marshal() (dAtA []byte, err error) { +func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -652,42 +1323,72 @@ func (m *ServiceReference) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Port != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) - i-- - dAtA[i] = 0x20 + { + size, err := m.RuleWithOperations.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - if m.Path != nil { - i -= len(*m.Path) - copy(dAtA[i:], *m.Path) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) - i-- - dAtA[i] = 0x1a + i-- + dAtA[i] = 0x12 + if len(m.ResourceNames) > 0 { + for iNdEx := len(m.ResourceNames) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ResourceNames[iNdEx]) + copy(dAtA[i:], m.ResourceNames[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceNames[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + return len(dAtA) - i, nil +} + +func (m *ParamKind) 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 *ParamKind) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParamKind) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) i-- dAtA[i] = 0x12 - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i -= len(m.APIVersion) + copy(dAtA[i:], m.APIVersion) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { +func (m *ParamRef) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -697,33 +1398,26 @@ func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { +func (m *ParamRef) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - } + if m.ParameterNotFoundAction != nil { + i -= len(*m.ParameterNotFoundAction) + copy(dAtA[i:], *m.ParameterNotFoundAction) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) + i-- + dAtA[i] = 0x22 } - if m.ObjectSelector != nil { + if m.Selector != nil { { - size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -731,59 +1425,90 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x52 - } - if m.MatchPolicy != nil { - i -= len(*m.MatchPolicy) - copy(dAtA[i:], *m.MatchPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) - i-- - dAtA[i] = 0x4a - } - if len(m.AdmissionReviewVersions) > 0 { - for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AdmissionReviewVersions[iNdEx]) - copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if m.TimeoutSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - i-- - dAtA[i] = 0x38 + dAtA[i] = 0x1a } - if m.SideEffects != nil { - i -= len(*m.SideEffects) - copy(dAtA[i:], *m.SideEffects) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) - i-- - dAtA[i] = 0x32 + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ServiceReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if m.NamespaceSelector != nil { - { - size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + return dAtA[:n], nil +} + +func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Port != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x20 } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + if m.Path != nil { + i -= len(*m.Path) + copy(dAtA[i:], *m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } - if len(m.Rules) > 0 { - for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *TypeChecking) 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 *TypeChecking) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ExpressionWarnings) > 0 { + for iNdEx := len(m.ExpressionWarnings) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ExpressionWarnings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -791,11 +1516,44 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ValidatingAdmissionPolicy) 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 *ValidatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a { - size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -804,15 +1562,20 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -822,30 +1585,26 @@ func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Webhooks) > 0 { - for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -859,7 +1618,7 @@ func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -869,12 +1628,12 @@ func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -906,7 +1665,7 @@ func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) ( return len(dAtA) - i, nil } -func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -916,33 +1675,40 @@ func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.URL != nil { - i -= len(*m.URL) - copy(dAtA[i:], *m.URL) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) - i-- - dAtA[i] = 0x1a + if len(m.ValidationActions) > 0 { + for iNdEx := len(m.ValidationActions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ValidationActions[iNdEx]) + copy(dAtA[i:], m.ValidationActions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValidationActions[iNdEx]))) + i-- + dAtA[i] = 0x22 + } } - if m.CABundle != nil { - i -= len(m.CABundle) - copy(dAtA[i:], m.CABundle) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) + if m.MatchResources != nil { + { + size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - if m.Service != nil { + if m.ParamRef != nil { { - size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -950,432 +1716,3359 @@ func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } + i -= len(m.PolicyName) + copy(dAtA[i:], m.PolicyName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *MatchCondition) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Expression) - n += 1 + l + sovGenerated(uint64(l)) - return n + +func (m *ValidatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhook) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ClientConfig.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Rules) > 0 { - for _, e := range m.Rules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } } - if m.FailurePolicy != nil { - l = len(*m.FailurePolicy) - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SideEffects != nil { - l = len(*m.SideEffects) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.TimeoutSeconds != nil { - n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) - } - if len(m.AdmissionReviewVersions) > 0 { - for _, s := range m.AdmissionReviewVersions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ReinvocationPolicy != nil { - l = len(*m.ReinvocationPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.MatchConditions) > 0 { - for _, e := range m.MatchConditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *MutatingWebhookConfiguration) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Webhooks) > 0 { - for _, e := range m.Webhooks { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } +func (m *ValidatingAdmissionPolicySpec) 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 n + return dAtA[:n], nil } -func (m *MutatingWebhookConfigurationList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n +func (m *ValidatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ServiceReference) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if m.Path != nil { - l = len(*m.Path) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.Port != nil { - n += 1 + sovGenerated(uint64(*m.Port)) + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } } - return n -} - -func (m *ValidatingWebhook) Size() (n int) { - if m == nil { - return 0 + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ClientConfig.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Rules) > 0 { - for _, e := range m.Rules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.AuditAnnotations) > 0 { + for iNdEx := len(m.AuditAnnotations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AuditAnnotations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a } } if m.FailurePolicy != nil { - l = len(*m.FailurePolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SideEffects != nil { - l = len(*m.SideEffects) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.TimeoutSeconds != nil { - n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 } - if len(m.AdmissionReviewVersions) > 0 { - for _, s := range m.AdmissionReviewVersions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Validations) > 0 { + for iNdEx := len(m.Validations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Validations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.MatchConstraints != nil { + { + size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - if len(m.MatchConditions) > 0 { - for _, e := range m.MatchConditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.ParamKind != nil { + { + size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfiguration) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Webhooks) > 0 { - for _, e := range m.Webhooks { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } +func (m *ValidatingAdmissionPolicyStatus) 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 n + return dAtA[:n], nil } -func (m *ValidatingWebhookConfigurationList) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingAdmissionPolicyStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingAdmissionPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - return n + if m.TypeChecking != nil { + { + size, err := m.TypeChecking.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil } -func (m *WebhookClientConfig) Size() (n int) { - if m == nil { - return 0 +func (m *ValidatingWebhook) 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 *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Service != nil { - l = m.Service.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.CABundle != nil { - l = len(m.CABundle) - n += 1 + l + sovGenerated(uint64(l)) + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } } - if m.URL != nil { - l = len(*m.URL) - n += 1 + l + sovGenerated(uint64(l)) + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 } - return n -} - -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *MatchCondition) String() string { - if this == nil { - return "nil" + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x4a } - s := strings.Join([]string{`&MatchCondition{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `}`, - }, "") - return s -} -func (this *MutatingWebhook) String() string { - if this == nil { - return "nil" + if len(m.AdmissionReviewVersions) > 0 { + for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AdmissionReviewVersions[iNdEx]) + copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) + i-- + dAtA[i] = 0x42 + } } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x38 } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + if m.SideEffects != nil { + i -= len(*m.SideEffects) + copy(dAtA[i:], *m.SideEffects) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i-- + dAtA[i] = 0x32 } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&MutatingWebhook{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, - `Rules:` + repeatedStringForRules + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v11.LabelSelector", 1) + `,`, - `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v11.LabelSelector", 1) + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, - `}`, - }, "") - return s -} -func (this *MutatingWebhookConfiguration) String() string { - if this == nil { - return "nil" + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a } - repeatedStringForWebhooks := "[]MutatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&MutatingWebhookConfiguration{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, - `}`, - }, "") - return s -} -func (this *MutatingWebhookConfigurationList) String() string { - if this == nil { - return "nil" + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } } - repeatedStringForItems := "[]MutatingWebhookConfiguration{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + { + size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - repeatedStringForItems += "}" - s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (this *ServiceReference) String() string { - if this == nil { - return "nil" + +func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - s := strings.Join([]string{`&ServiceReference{`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Path:` + valueToStringGenerated(this.Path) + `,`, - `Port:` + valueToStringGenerated(this.Port) + `,`, - `}`, - }, "") - return s + return dAtA[:n], nil } -func (this *ValidatingWebhook) String() string { - if this == nil { - return "nil" - } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + +func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Webhooks) > 0 { + for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&ValidatingWebhook{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ValidatingWebhookConfigurationList) 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 *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Validation) 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 *Validation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.MessageExpression) + copy(dAtA[i:], m.MessageExpression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) + i-- + dAtA[i] = 0x22 + if m.Reason != nil { + i -= len(*m.Reason) + copy(dAtA[i:], *m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + i-- + dAtA[i] = 0x1a + } + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x12 + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Variable) 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 *Variable) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *WebhookClientConfig) 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 *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.URL != nil { + i -= len(*m.URL) + copy(dAtA[i:], *m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) + i-- + dAtA[i] = 0x1a + } + if m.CABundle != nil { + i -= len(m.CABundle) + copy(dAtA[i:], m.CABundle) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) + i-- + dAtA[i] = 0x12 + } + if m.Service != nil { + { + size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *AuditAnnotation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ValueExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ExpressionWarning) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FieldRef) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Warning) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchCondition) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchResources) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ResourceRules) > 0 { + for _, e := range m.ResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.ExcludeResourceRules) > 0 { + for _, e := range m.ExcludeResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MutatingWebhook) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.ClientConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.SideEffects != nil { + l = len(*m.SideEffects) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + } + if len(m.AdmissionReviewVersions) > 0 { + for _, s := range m.AdmissionReviewVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ReinvocationPolicy != nil { + l = len(*m.ReinvocationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *MutatingWebhookConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for _, e := range m.Webhooks { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *MutatingWebhookConfigurationList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *NamedRuleWithOperations) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ResourceNames) > 0 { + for _, s := range m.ResourceNames { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.RuleWithOperations.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ParamKind) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.APIVersion) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ParamRef) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ParameterNotFoundAction != nil { + l = len(*m.ParameterNotFoundAction) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *ServiceReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Port != nil { + n += 1 + sovGenerated(uint64(*m.Port)) + } + return n +} + +func (m *TypeChecking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ExpressionWarnings) > 0 { + for _, e := range m.ExpressionWarnings { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingAdmissionPolicy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ValidatingAdmissionPolicyBinding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PolicyName) + n += 1 + l + sovGenerated(uint64(l)) + if m.ParamRef != nil { + l = m.ParamRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.MatchResources != nil { + l = m.MatchResources.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ValidationActions) > 0 { + for _, s := range m.ValidationActions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingAdmissionPolicyList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingAdmissionPolicySpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ParamKind != nil { + l = m.ParamKind.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.MatchConstraints != nil { + l = m.MatchConstraints.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.Validations) > 0 { + for _, e := range m.Validations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.AuditAnnotations) > 0 { + for _, e := range m.AuditAnnotations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingAdmissionPolicyStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) + if m.TypeChecking != nil { + l = m.TypeChecking.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingWebhook) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.ClientConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.SideEffects != nil { + l = len(*m.SideEffects) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + } + if len(m.AdmissionReviewVersions) > 0 { + for _, s := range m.AdmissionReviewVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingWebhookConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for _, e := range m.Webhooks { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingWebhookConfigurationList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *Validation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + if m.Reason != nil { + l = len(*m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.MessageExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Variable) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *WebhookClientConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Service != nil { + l = m.Service.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.CABundle != nil { + l = len(m.CABundle) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.URL != nil { + l = len(*m.URL) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *AuditAnnotation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AuditAnnotation{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `ValueExpression:` + fmt.Sprintf("%v", this.ValueExpression) + `,`, + `}`, + }, "") + return s +} +func (this *ExpressionWarning) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExpressionWarning{`, + `FieldRef:` + fmt.Sprintf("%v", this.FieldRef) + `,`, + `Warning:` + fmt.Sprintf("%v", this.Warning) + `,`, + `}`, + }, "") + return s +} +func (this *MatchCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MatchCondition{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *MatchResources) String() string { + if this == nil { + return "nil" + } + repeatedStringForResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ResourceRules { + repeatedStringForResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForResourceRules += "}" + repeatedStringForExcludeResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ExcludeResourceRules { + repeatedStringForExcludeResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForExcludeResourceRules += "}" + s := strings.Join([]string{`&MatchResources{`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ResourceRules:` + repeatedStringForResourceRules + `,`, + `ExcludeResourceRules:` + repeatedStringForExcludeResourceRules + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&MutatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, + `Rules:` + repeatedStringForRules + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]MutatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&MutatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]MutatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *NamedRuleWithOperations) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NamedRuleWithOperations{`, + `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, + `RuleWithOperations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuleWithOperations), "RuleWithOperations", "v11.RuleWithOperations", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ParamKind) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamKind{`, + `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `}`, + }, "") + return s +} +func (this *ParamRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamRef{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, + `}`, + }, "") + return s +} +func (this *ServiceReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ServiceReference{`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Path:` + valueToStringGenerated(this.Path) + `,`, + `Port:` + valueToStringGenerated(this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *TypeChecking) String() string { + if this == nil { + return "nil" + } + repeatedStringForExpressionWarnings := "[]ExpressionWarning{" + for _, f := range this.ExpressionWarnings { + repeatedStringForExpressionWarnings += strings.Replace(strings.Replace(f.String(), "ExpressionWarning", "ExpressionWarning", 1), `&`, ``, 1) + "," + } + repeatedStringForExpressionWarnings += "}" + s := strings.Join([]string{`&TypeChecking{`, + `ExpressionWarnings:` + repeatedStringForExpressionWarnings + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicy{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicySpec", "ValidatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ValidatingAdmissionPolicyStatus", "ValidatingAdmissionPolicyStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBinding) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBinding{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicyBindingSpec", "ValidatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicyBinding{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicyBinding", "ValidatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingSpec{`, + `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, + `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, + `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, + `ValidationActions:` + fmt.Sprintf("%v", this.ValidationActions) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicy{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicy", "ValidatingAdmissionPolicy", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicySpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForValidations := "[]Validation{" + for _, f := range this.Validations { + repeatedStringForValidations += strings.Replace(strings.Replace(f.String(), "Validation", "Validation", 1), `&`, ``, 1) + "," + } + repeatedStringForValidations += "}" + repeatedStringForAuditAnnotations := "[]AuditAnnotation{" + for _, f := range this.AuditAnnotations { + repeatedStringForAuditAnnotations += strings.Replace(strings.Replace(f.String(), "AuditAnnotation", "AuditAnnotation", 1), `&`, ``, 1) + "," + } + repeatedStringForAuditAnnotations += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, + `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, + `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, + `Validations:` + repeatedStringForValidations + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `Variables:` + repeatedStringForVariables + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyStatus{`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `TypeChecking:` + strings.Replace(this.TypeChecking.String(), "TypeChecking", "TypeChecking", 1) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&ValidatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, `Rules:` + repeatedStringForRules + `,`, `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v11.LabelSelector", 1) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v11.LabelSelector", 1) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, `MatchConditions:` + repeatedStringForMatchConditions + `,`, `}`, }, "") return s } -func (this *ValidatingWebhookConfiguration) String() string { - if this == nil { - return "nil" +func (this *ValidatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]ValidatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *Validation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Validation{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `Reason:` + valueToStringGenerated(this.Reason) + `,`, + `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + `}`, + }, "") + return s +} +func (this *Variable) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Variable{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *WebhookClientConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&WebhookClientConfig{`, + `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, + `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, + `URL:` + valueToStringGenerated(this.URL) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuditAnnotation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuditAnnotation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValueExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValueExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExpressionWarning: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExpressionWarning: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldRef = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warning", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warning = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchCondition: 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchResources) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchResources: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchResources: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NamespaceSelector == nil { + m.NamespaceSelector = &v1.LabelSelector{} + } + if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ObjectSelector == nil { + m.ObjectSelector = &v1.LabelSelector{} + } + if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceRules = append(m.ResourceRules, NamedRuleWithOperations{}) + if err := m.ResourceRules[len(m.ResourceRules)-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 ExcludeResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeResourceRules = append(m.ExcludeResourceRules, NamedRuleWithOperations{}) + if err := m.ExcludeResourceRules[len(m.ExcludeResourceRules)-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 MatchPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := MatchPolicyType(dAtA[iNdEx:postIndex]) + m.MatchPolicy = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingWebhook: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingWebhook: 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ClientConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rules = append(m.Rules, v11.RuleWithOperations{}) + if err := m.Rules[len(m.Rules)-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 FailurePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FailurePolicyType(dAtA[iNdEx:postIndex]) + m.FailurePolicy = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NamespaceSelector == nil { + m.NamespaceSelector = &v1.LabelSelector{} + } + if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SideEffects", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := SideEffectClass(dAtA[iNdEx:postIndex]) + m.SideEffects = &s + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TimeoutSeconds = &v + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdmissionReviewVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AdmissionReviewVersions = append(m.AdmissionReviewVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := MatchPolicyType(dAtA[iNdEx:postIndex]) + m.MatchPolicy = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReinvocationPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ReinvocationPolicyType(dAtA[iNdEx:postIndex]) + m.ReinvocationPolicy = &s + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ObjectSelector == nil { + m.ObjectSelector = &v1.LabelSelector{} + } + if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchConditions = append(m.MatchConditions, MatchCondition{}) + if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingWebhookConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingWebhookConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Webhooks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Webhooks = append(m.Webhooks, MutatingWebhook{}) + if err := m.Webhooks[len(m.Webhooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingWebhookConfigurationList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingWebhookConfigurationList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, MutatingWebhookConfiguration{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NamedRuleWithOperations) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NamedRuleWithOperations: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NamedRuleWithOperations: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceNames", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceNames = append(m.ResourceNames, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuleWithOperations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RuleWithOperations.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ParamKind) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ParamKind: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ParamKind: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - repeatedStringForWebhooks := "[]ValidatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + + if iNdEx > l { + return io.ErrUnexpectedEOF } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, - `}`, - }, "") - return s + return nil } -func (this *ValidatingWebhookConfigurationList) String() string { - if this == nil { - return "nil" +func (m *ParamRef) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ParamRef: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ParamRef: 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParameterNotFoundAction", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ParameterNotFoundActionType(dAtA[iNdEx:postIndex]) + m.ParameterNotFoundAction = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - repeatedStringForItems := "[]ValidatingWebhookConfiguration{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + + if iNdEx > l { + return io.ErrUnexpectedEOF } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s + return nil } -func (this *WebhookClientConfig) String() string { - if this == nil { - return "nil" +func (m *ServiceReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ServiceReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ServiceReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Port = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - s := strings.Join([]string{`&WebhookClientConfig{`, - `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, - `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, - `URL:` + valueToStringGenerated(this.URL) + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" + + if iNdEx > l { + return io.ErrUnexpectedEOF } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) + return nil } -func (m *MatchCondition) Unmarshal(dAtA []byte) error { +func (m *TypeChecking) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1398,17 +5091,17 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + return fmt.Errorf("proto: TypeChecking: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MatchCondition: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TypeChecking: 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) + return fmt.Errorf("proto: wrong wireType = %d for field ExpressionWarnings", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1418,55 +5111,25 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF + m.ExpressionWarnings = append(m.ExpressionWarnings, ExpressionWarning{}) + if err := m.ExpressionWarnings[len(m.ExpressionWarnings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Expression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -1489,7 +5152,7 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } return nil } -func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { +func (m *ValidatingAdmissionPolicy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1512,17 +5175,17 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MutatingWebhook: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatingAdmissionPolicy: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MutatingWebhook: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatingAdmissionPolicy: 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) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1532,27 +5195,28 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientConfig", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1579,13 +5243,13 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ClientConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1612,16 +5276,65 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Rules = append(m.Rules, v1.RuleWithOperations{}) - if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatingAdmissionPolicyBinding) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidatingAdmissionPolicyBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatingAdmissionPolicyBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailurePolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1631,28 +5344,28 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := FailurePolicyType(dAtA[iNdEx:postIndex]) - m.FailurePolicy = &s + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1679,18 +5392,65 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.NamespaceSelector == nil { - m.NamespaceSelector = &v11.LabelSelector{} - } - if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatingAdmissionPolicyBindingList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidatingAdmissionPolicyBindingList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatingAdmissionPolicyBindingList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SideEffects", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1700,50 +5460,30 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := SideEffectClass(dAtA[iNdEx:postIndex]) - m.SideEffects = &s - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.TimeoutSeconds = &v - case 8: + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AdmissionReviewVersions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1753,27 +5493,79 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ValidatingAdmissionPolicyBinding{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatingAdmissionPolicyBindingSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.AdmissionReviewVersions = append(m.AdmissionReviewVersions, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 9: + 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: ValidatingAdmissionPolicyBindingSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatingAdmissionPolicyBindingSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PolicyName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1801,14 +5593,13 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := MatchPolicyType(dAtA[iNdEx:postIndex]) - m.MatchPolicy = &s + m.PolicyName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 10: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ReinvocationPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ParamRef", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1818,28 +5609,31 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := ReinvocationPolicyType(dAtA[iNdEx:postIndex]) - m.ReinvocationPolicy = &s + if m.ParamRef == nil { + m.ParamRef = &ParamRef{} + } + if err := m.ParamRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 11: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchResources", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1866,18 +5660,18 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ObjectSelector == nil { - m.ObjectSelector = &v11.LabelSelector{} + if m.MatchResources == nil { + m.MatchResources = &MatchResources{} } - if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.MatchResources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 12: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidationActions", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1887,25 +5681,23 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.MatchConditions = append(m.MatchConditions, MatchCondition{}) - if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ValidationActions = append(m.ValidationActions, ValidationAction(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -1928,7 +5720,7 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { } return nil } -func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { +func (m *ValidatingAdmissionPolicyList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1951,15 +5743,15 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MutatingWebhookConfiguration: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatingAdmissionPolicyList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MutatingWebhookConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatingAdmissionPolicyList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1986,13 +5778,13 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Webhooks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2019,8 +5811,8 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Webhooks = append(m.Webhooks, MutatingWebhook{}) - if err := m.Webhooks[len(m.Webhooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, ValidatingAdmissionPolicy{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2045,7 +5837,7 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { } return nil } -func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { +func (m *ValidatingAdmissionPolicySpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2068,15 +5860,15 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MutatingWebhookConfigurationList: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatingAdmissionPolicySpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MutatingWebhookConfigurationList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatingAdmissionPolicySpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ParamKind", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2103,13 +5895,187 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ParamKind == nil { + m.ParamKind = &ParamKind{} + } + if err := m.ParamKind.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchConstraints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MatchConstraints == nil { + m.MatchConstraints = &MatchResources{} + } + if err := m.MatchConstraints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validations = append(m.Validations, Validation{}) + if err := m.Validations[len(m.Validations)-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 FailurePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FailurePolicyType(dAtA[iNdEx:postIndex]) + m.FailurePolicy = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuditAnnotations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AuditAnnotations = append(m.AuditAnnotations, AuditAnnotation{}) + if err := m.AuditAnnotations[len(m.AuditAnnotations)-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 MatchConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchConditions = append(m.MatchConditions, MatchCondition{}) + if err := m.MatchConditions[len(m.MatchConditions)-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 Variables", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2136,8 +6102,8 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, MutatingWebhookConfiguration{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Variables = append(m.Variables, Variable{}) + if err := m.Variables[len(m.Variables)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2162,7 +6128,7 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { } return nil } -func (m *ServiceReference) Unmarshal(dAtA []byte) error { +func (m *ValidatingAdmissionPolicyStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2185,17 +6151,17 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ServiceReference: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatingAdmissionPolicyStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceReference: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatingAdmissionPolicyStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) } - var stringLen uint64 + m.ObservedGeneration = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2205,29 +6171,16 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.ObservedGeneration |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TypeChecking", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2237,29 +6190,33 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if m.TypeChecking == nil { + m.TypeChecking = &TypeChecking{} + } + if err := m.TypeChecking.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2269,45 +6226,26 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Path = &s - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Port = &v + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -2452,7 +6390,7 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Rules = append(m.Rules, v1.RuleWithOperations{}) + m.Rules = append(m.Rules, v11.RuleWithOperations{}) if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -2520,7 +6458,7 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NamespaceSelector == nil { - m.NamespaceSelector = &v11.LabelSelector{} + m.NamespaceSelector = &v1.LabelSelector{} } if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2563,27 +6501,212 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TimeoutSeconds = &v + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdmissionReviewVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AdmissionReviewVersions = append(m.AdmissionReviewVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := MatchPolicyType(dAtA[iNdEx:postIndex]) + m.MatchPolicy = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ObjectSelector == nil { + m.ObjectSelector = &v1.LabelSelector{} + } + if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchConditions = append(m.MatchConditions, MatchCondition{}) + if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - m.TimeoutSeconds = &v - case 8: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidatingWebhookConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatingWebhookConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AdmissionReviewVersions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2593,29 +6716,30 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.AdmissionReviewVersions = append(m.AdmissionReviewVersions, string(dAtA[iNdEx:postIndex])) + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 9: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Webhooks", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2625,28 +6749,79 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := MatchPolicyType(dAtA[iNdEx:postIndex]) - m.MatchPolicy = &s + m.Webhooks = append(m.Webhooks, ValidatingWebhook{}) + if err := m.Webhooks[len(m.Webhooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 10: + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidatingWebhookConfigurationList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatingWebhookConfigurationList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2673,16 +6848,13 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ObjectSelector == nil { - m.ObjectSelector = &v11.LabelSelector{} - } - if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 11: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2709,8 +6881,8 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.MatchConditions = append(m.MatchConditions, MatchCondition{}) - if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, ValidatingWebhookConfiguration{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2735,7 +6907,7 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { } return nil } -func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { +func (m *Validation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2758,17 +6930,17 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidatingWebhookConfiguration: wiretype end group for non-group") + return fmt.Errorf("proto: Validation: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidatingWebhookConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Validation: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2778,30 +6950,29 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Expression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Webhooks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2811,25 +6982,88 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Webhooks = append(m.Webhooks, ValidatingWebhook{}) - if err := m.Webhooks[len(m.Webhooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF } + s := k8s_io_apimachinery_pkg_apis_meta_v1.StatusReason(dAtA[iNdEx:postIndex]) + m.Reason = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MessageExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MessageExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -2852,7 +7086,7 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { } return nil } -func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { +func (m *Variable) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2875,17 +7109,17 @@ func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidatingWebhookConfigurationList: wiretype end group for non-group") + return fmt.Errorf("proto: Variable: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidatingWebhookConfigurationList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Variable: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2895,30 +7129,29 @@ func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -2928,25 +7161,23 @@ func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, ValidatingWebhookConfiguration{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Expression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index cfd759285..1855cdfc4 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -29,6 +29,56 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/admissionregistration/v1beta1"; +// AuditAnnotation describes how to produce an audit annotation for an API request. +message AuditAnnotation { + // key specifies the audit annotation key. The audit annotation keys of + // a ValidatingAdmissionPolicy must be unique. The key must be a qualified + // name ([A-Za-z0-9][-A-Za-z0-9_.]*) no more than 63 bytes in length. + // + // The key is combined with the resource name of the + // ValidatingAdmissionPolicy to construct an audit annotation key: + // "{ValidatingAdmissionPolicy name}/{key}". + // + // If an admission webhook uses the same resource name as this ValidatingAdmissionPolicy + // and the same audit annotation key, the annotation key will be identical. + // In this case, the first annotation written with the key will be included + // in the audit event and all subsequent annotations with the same key + // will be discarded. + // + // Required. + optional string key = 1; + + // valueExpression represents the expression which is evaluated by CEL to + // produce an audit annotation value. The expression must evaluate to either + // a string or null value. If the expression evaluates to a string, the + // audit annotation is included with the string value. If the expression + // evaluates to null or empty string the audit annotation will be omitted. + // The valueExpression may be no longer than 5kb in length. + // If the result of the valueExpression is more than 10kb in length, it + // will be truncated to 10kb. + // + // If multiple ValidatingAdmissionPolicyBinding resources match an + // API request, then the valueExpression will be evaluated for + // each binding. All unique values produced by the valueExpressions + // will be joined together in a comma-separated list. + // + // Required. + optional string valueExpression = 2; +} + +// ExpressionWarning is a warning information that targets a specific expression. +message ExpressionWarning { + // The path to the field that refers the expression. + // For example, the reference to the expression of the first item of + // validations is "spec.validations[0].expression" + optional string fieldRef = 2; + + // The content of type checking information in a human-readable form. + // Each line of the warning contains the type that the expression is checked + // against, followed by the type check error from the compiler. + optional string warning = 3; +} + // MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook. message MatchCondition { // Name is an identifier for this match condition, used for strategic merging of MatchConditions, @@ -58,6 +108,101 @@ message MatchCondition { optional string expression = 2; } +// MatchResources decides whether to run the admission control policy on an object based +// on whether it meets the match criteria. +// The exclude rules take precedence over include rules (if a resource matches both, it is excluded) +// +structType=atomic +message MatchResources { + // NamespaceSelector decides whether to run the admission control policy on an object based + // on whether the namespace for that object matches the selector. If the + // object itself is a namespace, the matching is performed on + // object.metadata.labels. If the object is another cluster scoped resource, + // it never skips the policy. + // + // For example, to run the webhook on any objects whose namespace is not + // associated with "runlevel" of "0" or "1"; you will set the selector as + // follows: + // "namespaceSelector": { + // "matchExpressions": [ + // { + // "key": "runlevel", + // "operator": "NotIn", + // "values": [ + // "0", + // "1" + // ] + // } + // ] + // } + // + // If instead you want to only run the policy on any objects whose + // namespace is associated with the "environment" of "prod" or "staging"; + // you will set the selector as follows: + // "namespaceSelector": { + // "matchExpressions": [ + // { + // "key": "environment", + // "operator": "In", + // "values": [ + // "prod", + // "staging" + // ] + // } + // ] + // } + // + // See + // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + // for more examples of label selectors. + // + // Default to the empty LabelSelector, which matches everything. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 1; + + // ObjectSelector decides whether to run the validation based on if the + // object has matching labels. objectSelector is evaluated against both + // the oldObject and newObject that would be sent to the cel validation, and + // is considered to match if either object matches the selector. A null + // object (oldObject in the case of create, or newObject in the case of + // delete) or an object that cannot have labels (like a + // DeploymentRollback or a PodProxyOptions object) is not considered to + // match. + // Use the object selector only if the webhook is opt-in, because end + // users may skip the admission webhook by setting the labels. + // Default to the empty LabelSelector, which matches everything. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector objectSelector = 2; + + // ResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy matches. + // The policy cares about an operation if it matches _any_ Rule. + // +listType=atomic + // +optional + repeated NamedRuleWithOperations resourceRules = 3; + + // ExcludeResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy should not care about. + // The exclude rules take precedence over include rules (if a resource matches both, it is excluded) + // +listType=atomic + // +optional + repeated NamedRuleWithOperations excludeResourceRules = 4; + + // matchPolicy defines how the "MatchResources" list is used to match incoming requests. + // Allowed values are "Exact" or "Equivalent". + // + // - Exact: match a request only if it exactly matches a specified rule. + // For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, + // but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, + // a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the ValidatingAdmissionPolicy. + // + // - Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. + // For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, + // and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, + // a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the ValidatingAdmissionPolicy. + // + // Defaults to "Equivalent" + // +optional + optional string matchPolicy = 7; +} + // MutatingWebhook describes an admission webhook and the resources and operations it applies to. message MutatingWebhook { // The name of the admission webhook. @@ -219,7 +364,7 @@ message MutatingWebhook { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge @@ -255,6 +400,88 @@ message MutatingWebhookConfigurationList { repeated MutatingWebhookConfiguration items = 2; } +// NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames. +// +structType=atomic +message NamedRuleWithOperations { + // ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + // +listType=atomic + // +optional + repeated string resourceNames = 1; + + // RuleWithOperations is a tuple of Operations and Resources. + optional k8s.io.api.admissionregistration.v1.RuleWithOperations ruleWithOperations = 2; +} + +// ParamKind is a tuple of Group Kind and Version. +// +structType=atomic +message ParamKind { + // APIVersion is the API group version the resources belong to. + // In format of "group/version". + // Required. + optional string apiVersion = 1; + + // Kind is the API kind the resources belong to. + // Required. + optional string kind = 2; +} + +// ParamRef describes how to locate the params to be used as input to +// expressions of rules applied by a policy binding. +// +structType=atomic +message ParamRef { + // name is the name of the resource being referenced. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // A single parameter used for all admission requests can be configured + // by setting the `name` field, leaving `selector` blank, and setting namespace + // if `paramKind` is namespace-scoped. + optional string name = 1; + + // namespace is the namespace of the referenced resource. Allows limiting + // the search for params to a specific namespace. Applies to both `name` and + // `selector` fields. + // + // A per-namespace parameter may be used by specifying a namespace-scoped + // `paramKind` in the policy and leaving this field empty. + // + // - If `paramKind` is cluster-scoped, this field MUST be unset. Setting this + // field results in a configuration error. + // + // - If `paramKind` is namespace-scoped, the namespace of the object being + // evaluated for admission will be used when this field is left unset. Take + // care that if this is left empty the binding must not match any cluster-scoped + // resources, which will result in an error. + // + // +optional + optional string namespace = 2; + + // selector can be used to match multiple param objects based on their labels. + // Supply selector: {} to match all resources of the ParamKind. + // + // If multiple params are found, they are all evaluated with the policy expressions + // and the results are ANDed together. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; + + // `parameterNotFoundAction` controls the behavior of the binding when the resource + // exists, and name or selector is valid, but there are no parameters + // matched by the binding. If the value is set to `Allow`, then no + // matched parameters will be treated as successful validation by the binding. + // If set to `Deny`, then no matched parameters will be subject to the + // `failurePolicy` of the policy. + // + // Allowed values are `Allow` or `Deny` + // + // Required + optional string parameterNotFoundAction = 4; +} + // ServiceReference holds a reference to Service.legacy.k8s.io message ServiceReference { // `namespace` is the namespace of the service. @@ -277,6 +504,248 @@ message ServiceReference { optional int32 port = 4; } +// TypeChecking contains results of type checking the expressions in the +// ValidatingAdmissionPolicy +message TypeChecking { + // The type checking warnings for each expression. + // +optional + // +listType=atomic + repeated ExpressionWarning expressionWarnings = 1; +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 +// ValidatingAdmissionPolicy describes the definition of an admission validation policy that accepts or rejects an object without changing it. +message ValidatingAdmissionPolicy { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the ValidatingAdmissionPolicy. + optional ValidatingAdmissionPolicySpec spec = 2; + + // The status of the ValidatingAdmissionPolicy, including warnings that are useful to determine if the policy + // behaves in the expected way. + // Populated by the system. + // Read-only. + // +optional + optional ValidatingAdmissionPolicyStatus status = 3; +} + +// ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. +// ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// +// The CEL expressions of a policy must have a computed CEL cost below the maximum +// CEL budget. Each evaluation of the policy is given an independent CEL cost budget. +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +message ValidatingAdmissionPolicyBinding { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the ValidatingAdmissionPolicyBinding. + optional ValidatingAdmissionPolicyBindingSpec spec = 2; +} + +// ValidatingAdmissionPolicyBindingList is a list of ValidatingAdmissionPolicyBinding. +message ValidatingAdmissionPolicyBindingList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of PolicyBinding. + repeated ValidatingAdmissionPolicyBinding items = 2; +} + +// ValidatingAdmissionPolicyBindingSpec is the specification of the ValidatingAdmissionPolicyBinding. +message ValidatingAdmissionPolicyBindingSpec { + // PolicyName references a ValidatingAdmissionPolicy name which the ValidatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + optional string policyName = 1; + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + optional ParamRef paramRef = 2; + + // MatchResources declares what resources match this binding and will be validated by it. + // Note that this is intersected with the policy's matchConstraints, so only requests that are matched by the policy can be selected by this. + // If this is unset, all resources matched by the policy are validated by this binding + // When resourceRules is unset, it does not constrain resource matching. If a resource is matched by the other fields of this object, it will be validated. + // Note that this is differs from ValidatingAdmissionPolicy matchConstraints, where resourceRules are required. + // +optional + optional MatchResources matchResources = 3; + + // validationActions declares how Validations of the referenced ValidatingAdmissionPolicy are enforced. + // If a validation evaluates to false it is always enforced according to these actions. + // + // Failures defined by the ValidatingAdmissionPolicy's FailurePolicy are enforced according + // to these actions only if the FailurePolicy is set to Fail, otherwise the failures are + // ignored. This includes compilation errors, runtime errors and misconfigurations of the policy. + // + // validationActions is declared as a set of action values. Order does + // not matter. validationActions may not contain duplicates of the same action. + // + // The supported actions values are: + // + // "Deny" specifies that a validation failure results in a denied request. + // + // "Warn" specifies that a validation failure is reported to the request client + // in HTTP Warning headers, with a warning code of 299. Warnings can be sent + // both for allowed or denied admission responses. + // + // "Audit" specifies that a validation failure is included in the published + // audit event for the request. The audit event will contain a + // `validation.policy.admission.k8s.io/validation_failure` audit annotation + // with a value containing the details of the validation failures, formatted as + // a JSON list of objects, each with the following fields: + // - message: The validation failure message string + // - policy: The resource name of the ValidatingAdmissionPolicy + // - binding: The resource name of the ValidatingAdmissionPolicyBinding + // - expressionIndex: The index of the failed validations in the ValidatingAdmissionPolicy + // - validationActions: The enforcement actions enacted for the validation failure + // Example audit annotation: + // `"validation.policy.admission.k8s.io/validation_failure": "[{\"message\": \"Invalid value\", {\"policy\": \"policy.example.com\", {\"binding\": \"policybinding.example.com\", {\"expressionIndex\": \"1\", {\"validationActions\": [\"Audit\"]}]"` + // + // Clients should expect to handle additional values by ignoring + // any values not recognized. + // + // "Deny" and "Warn" may not be used together since this combination + // needlessly duplicates the validation failure both in the + // API response body and the HTTP warning headers. + // + // Required. + // +listType=set + repeated string validationActions = 4; +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 +// ValidatingAdmissionPolicyList is a list of ValidatingAdmissionPolicy. +message ValidatingAdmissionPolicyList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of ValidatingAdmissionPolicy. + repeated ValidatingAdmissionPolicy items = 2; +} + +// ValidatingAdmissionPolicySpec is the specification of the desired behavior of the AdmissionPolicy. +message ValidatingAdmissionPolicySpec { + // ParamKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If ParamKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in ValidatingAdmissionPolicyBinding, the params variable will be null. + // +optional + optional ParamKind paramKind = 1; + + // MatchConstraints specifies what resources this policy is designed to validate. + // The AdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // ValidatingAdmissionPolicy cannot match ValidatingAdmissionPolicy and ValidatingAdmissionPolicyBinding. + // Required. + optional MatchResources matchConstraints = 2; + + // Validations contain CEL expressions which is used to apply the validation. + // Validations and AuditAnnotations may not both be empty; a minimum of one Validations or AuditAnnotations is + // required. + // +listType=atomic + // +optional + repeated Validation validations = 3; + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if spec.paramKind refers to a non-existent Kind. + // A binding is invalid if spec.paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // When failurePolicy is set to Fail, ValidatingAdmissionPolicyBinding validationActions + // define how failures are enforced. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + optional string failurePolicy = 4; + + // auditAnnotations contains CEL expressions which are used to produce audit + // annotations for the audit event of the API request. + // validations and auditAnnotations may not both be empty; a least one of validations or auditAnnotations is + // required. + // +listType=atomic + // +optional + repeated AuditAnnotation auditAnnotations = 5; + + // MatchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the rules, + // namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + repeated MatchCondition matchConditions = 6; + + // Variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except MatchConditions because MatchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, Variables must be sorted by the order of first appearance and acyclic. + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + repeated Variable variables = 7; +} + +// ValidatingAdmissionPolicyStatus represents the status of an admission validation policy. +message ValidatingAdmissionPolicyStatus { + // The generation observed by the controller. + // +optional + optional int64 observedGeneration = 1; + + // The results of type checking for each expression. + // Presence of this field indicates the completion of the type checking. + // +optional + optional TypeChecking typeChecking = 2; + + // The conditions represent the latest available observations of a policy's current state. + // +optional + // +listType=map + // +listMapKey=type + repeated k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 3; +} + // ValidatingWebhook describes an admission webhook and the resources and operations it applies to. message ValidatingWebhook { // The name of the admission webhook. @@ -420,7 +889,7 @@ message ValidatingWebhook { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge @@ -456,6 +925,97 @@ message ValidatingWebhookConfigurationList { repeated ValidatingWebhookConfiguration items = 2; } +// Validation specifies the CEL expression which is used to apply the validation. +message Validation { + // Expression represents the expression which will be evaluated by CEL. + // ref: https://github.com/google/cel-spec + // CEL expressions have access to the contents of the API request/response, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Accessible property names are escaped according to the following rules when accessed in the expression: + // - '__' escapes to '__underscores__' + // - '.' escapes to '__dot__' + // - '-' escapes to '__dash__' + // - '/' escapes to '__slash__' + // - Property names that exactly match a CEL RESERVED keyword escape to '__{keyword}__'. The keywords are: + // "true", "false", "null", "in", "as", "break", "const", "continue", "else", "for", "function", "if", + // "import", "let", "loop", "package", "namespace", "return". + // Examples: + // - Expression accessing a property named "namespace": {"Expression": "object.__namespace__ > 0"} + // - Expression accessing a property named "x-prop": {"Expression": "object.x__dash__prop > 0"} + // - Expression accessing a property named "redact__d": {"Expression": "object.redact__underscores__d > 0"} + // + // Equality on arrays with list type of 'set' or 'map' ignores element order, i.e. [1, 2] == [2, 1]. + // Concatenation on arrays with x-kubernetes-list-type use the semantics of the list type: + // - 'set': `X + Y` performs a union where the array positions of all elements in `X` are preserved and + // non-intersecting elements in `Y` are appended, retaining their partial order. + // - 'map': `X + Y` performs a merge where the array positions of all keys in `X` are preserved but the values + // are overwritten by values in `Y` when the key sets of `X` and `Y` intersect. Elements in `Y` with + // non-intersecting keys are appended, retaining their partial order. + // Required. + optional string Expression = 1; + + // Message represents the message displayed when validation fails. The message is required if the Expression contains + // line breaks. The message must not contain line breaks. + // If unset, the message is "failed rule: {Rule}". + // e.g. "must be a URL with the host matching spec.host" + // If the Expression contains line breaks. Message is required. + // The message must not contain line breaks. + // If unset, the message is "failed Expression: {Expression}". + // +optional + optional string message = 2; + + // Reason represents a machine-readable description of why this validation failed. + // If this is the first validation in the list to fail, this reason, as well as the + // corresponding HTTP response code, are used in the + // HTTP response to the client. + // The currently supported reasons are: "Unauthorized", "Forbidden", "Invalid", "RequestEntityTooLarge". + // If not set, StatusReasonInvalid is used in the response to the client. + // +optional + optional string reason = 3; + + // messageExpression declares a CEL expression that evaluates to the validation failure message that is returned when this rule fails. + // Since messageExpression is used as a failure message, it must evaluate to a string. + // If both message and messageExpression are present on a validation, then messageExpression will be used if validation fails. + // If messageExpression results in a runtime error, the runtime error is logged, and the validation failure message is produced + // as if the messageExpression field were unset. If messageExpression evaluates to an empty string, a string with only spaces, or a string + // that contains line breaks, then the validation failure message will also be produced as if the messageExpression field were unset, and + // the fact that messageExpression produced an empty string/string with only spaces/string with line breaks will be logged. + // messageExpression has access to all the same variables as the `expression` except for 'authorizer' and 'authorizer.requestResource'. + // Example: + // "object.x must be less than max ("+string(params.max)+")" + // +optional + optional string messageExpression = 4; +} + +// Variable is the definition of a variable that is used for composition. A variable is defined as a named expression. +// +structType=atomic +message Variable { + // Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. + // The variable can be accessed in other expressions through `variables` + // For example, if name is "foo", the variable will be available as `variables.foo` + optional string Name = 1; + + // Expression is the expression that will be evaluated as the value of the variable. + // The CEL expression has access to the same identifiers as the CEL expressions in Validation. + optional string Expression = 2; +} + // WebhookClientConfig contains the information to make a TLS // connection with the webhook message WebhookClientConfig { diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/register.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/register.go index 098744cf6..363233a2f 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/register.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/register.go @@ -50,6 +50,10 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ValidatingWebhookConfigurationList{}, &MutatingWebhookConfiguration{}, &MutatingWebhookConfigurationList{}, + &ValidatingAdmissionPolicy{}, + &ValidatingAdmissionPolicyList{}, + &ValidatingAdmissionPolicyBinding{}, + &ValidatingAdmissionPolicyBindingList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index 82ee7df9b..c199702fb 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -38,6 +38,18 @@ const ( AllScopes ScopeType = v1.AllScopes ) +// ParameterNotFoundActionType specifies a failure policy that defines how a binding +// is evaluated when the param referred by its perNamespaceParamRef is not found. +type ParameterNotFoundActionType string + +const ( + // Allow means all requests will be admitted if no param resources + // could be found. + AllowAction ParameterNotFoundActionType = "Allow" + // Deny means all requests will be denied if no param resources are found. + DenyAction ParameterNotFoundActionType = "Deny" +) + // FailurePolicyType specifies a failure policy that defines how unrecognized errors from the admission endpoint are handled. type FailurePolicyType string @@ -75,6 +87,584 @@ const ( SideEffectClassNoneOnDryRun SideEffectClass = "NoneOnDryRun" ) +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 +// ValidatingAdmissionPolicy describes the definition of an admission validation policy that accepts or rejects an object without changing it. +type ValidatingAdmissionPolicy struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the ValidatingAdmissionPolicy. + Spec ValidatingAdmissionPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` + // The status of the ValidatingAdmissionPolicy, including warnings that are useful to determine if the policy + // behaves in the expected way. + // Populated by the system. + // Read-only. + // +optional + Status ValidatingAdmissionPolicyStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// ValidatingAdmissionPolicyStatus represents the status of an admission validation policy. +type ValidatingAdmissionPolicyStatus struct { + // The generation observed by the controller. + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,1,opt,name=observedGeneration"` + // The results of type checking for each expression. + // Presence of this field indicates the completion of the type checking. + // +optional + TypeChecking *TypeChecking `json:"typeChecking,omitempty" protobuf:"bytes,2,opt,name=typeChecking"` + // The conditions represent the latest available observations of a policy's current state. + // +optional + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty" protobuf:"bytes,3,rep,name=conditions"` +} + +// ValidatingAdmissionPolicyConditionType is the condition type of admission validation policy. +type ValidatingAdmissionPolicyConditionType string + +// TypeChecking contains results of type checking the expressions in the +// ValidatingAdmissionPolicy +type TypeChecking struct { + // The type checking warnings for each expression. + // +optional + // +listType=atomic + ExpressionWarnings []ExpressionWarning `json:"expressionWarnings,omitempty" protobuf:"bytes,1,rep,name=expressionWarnings"` +} + +// ExpressionWarning is a warning information that targets a specific expression. +type ExpressionWarning struct { + // The path to the field that refers the expression. + // For example, the reference to the expression of the first item of + // validations is "spec.validations[0].expression" + FieldRef string `json:"fieldRef" protobuf:"bytes,2,opt,name=fieldRef"` + // The content of type checking information in a human-readable form. + // Each line of the warning contains the type that the expression is checked + // against, followed by the type check error from the compiler. + Warning string `json:"warning" protobuf:"bytes,3,opt,name=warning"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 +// ValidatingAdmissionPolicyList is a list of ValidatingAdmissionPolicy. +type ValidatingAdmissionPolicyList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of ValidatingAdmissionPolicy. + Items []ValidatingAdmissionPolicy `json:"items,omitempty" protobuf:"bytes,2,rep,name=items"` +} + +// ValidatingAdmissionPolicySpec is the specification of the desired behavior of the AdmissionPolicy. +type ValidatingAdmissionPolicySpec struct { + // ParamKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If ParamKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in ValidatingAdmissionPolicyBinding, the params variable will be null. + // +optional + ParamKind *ParamKind `json:"paramKind,omitempty" protobuf:"bytes,1,rep,name=paramKind"` + + // MatchConstraints specifies what resources this policy is designed to validate. + // The AdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // ValidatingAdmissionPolicy cannot match ValidatingAdmissionPolicy and ValidatingAdmissionPolicyBinding. + // Required. + MatchConstraints *MatchResources `json:"matchConstraints,omitempty" protobuf:"bytes,2,rep,name=matchConstraints"` + + // Validations contain CEL expressions which is used to apply the validation. + // Validations and AuditAnnotations may not both be empty; a minimum of one Validations or AuditAnnotations is + // required. + // +listType=atomic + // +optional + Validations []Validation `json:"validations,omitempty" protobuf:"bytes,3,rep,name=validations"` + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if spec.paramKind refers to a non-existent Kind. + // A binding is invalid if spec.paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // When failurePolicy is set to Fail, ValidatingAdmissionPolicyBinding validationActions + // define how failures are enforced. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + FailurePolicy *FailurePolicyType `json:"failurePolicy,omitempty" protobuf:"bytes,4,opt,name=failurePolicy,casttype=FailurePolicyType"` + + // auditAnnotations contains CEL expressions which are used to produce audit + // annotations for the audit event of the API request. + // validations and auditAnnotations may not both be empty; a least one of validations or auditAnnotations is + // required. + // +listType=atomic + // +optional + AuditAnnotations []AuditAnnotation `json:"auditAnnotations,omitempty" protobuf:"bytes,5,rep,name=auditAnnotations"` + + // MatchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the rules, + // namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + MatchConditions []MatchCondition `json:"matchConditions,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,6,rep,name=matchConditions"` + + // Variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except MatchConditions because MatchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, Variables must be sorted by the order of first appearance and acyclic. + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + Variables []Variable `json:"variables" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=variables"` +} + +// ParamKind is a tuple of Group Kind and Version. +// +structType=atomic +type ParamKind struct { + // APIVersion is the API group version the resources belong to. + // In format of "group/version". + // Required. + APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,1,rep,name=apiVersion"` + + // Kind is the API kind the resources belong to. + // Required. + Kind string `json:"kind,omitempty" protobuf:"bytes,2,rep,name=kind"` +} + +// Validation specifies the CEL expression which is used to apply the validation. +type Validation struct { + // Expression represents the expression which will be evaluated by CEL. + // ref: https://github.com/google/cel-spec + // CEL expressions have access to the contents of the API request/response, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Accessible property names are escaped according to the following rules when accessed in the expression: + // - '__' escapes to '__underscores__' + // - '.' escapes to '__dot__' + // - '-' escapes to '__dash__' + // - '/' escapes to '__slash__' + // - Property names that exactly match a CEL RESERVED keyword escape to '__{keyword}__'. The keywords are: + // "true", "false", "null", "in", "as", "break", "const", "continue", "else", "for", "function", "if", + // "import", "let", "loop", "package", "namespace", "return". + // Examples: + // - Expression accessing a property named "namespace": {"Expression": "object.__namespace__ > 0"} + // - Expression accessing a property named "x-prop": {"Expression": "object.x__dash__prop > 0"} + // - Expression accessing a property named "redact__d": {"Expression": "object.redact__underscores__d > 0"} + // + // Equality on arrays with list type of 'set' or 'map' ignores element order, i.e. [1, 2] == [2, 1]. + // Concatenation on arrays with x-kubernetes-list-type use the semantics of the list type: + // - 'set': `X + Y` performs a union where the array positions of all elements in `X` are preserved and + // non-intersecting elements in `Y` are appended, retaining their partial order. + // - 'map': `X + Y` performs a merge where the array positions of all keys in `X` are preserved but the values + // are overwritten by values in `Y` when the key sets of `X` and `Y` intersect. Elements in `Y` with + // non-intersecting keys are appended, retaining their partial order. + // Required. + Expression string `json:"expression" protobuf:"bytes,1,opt,name=Expression"` + // Message represents the message displayed when validation fails. The message is required if the Expression contains + // line breaks. The message must not contain line breaks. + // If unset, the message is "failed rule: {Rule}". + // e.g. "must be a URL with the host matching spec.host" + // If the Expression contains line breaks. Message is required. + // The message must not contain line breaks. + // If unset, the message is "failed Expression: {Expression}". + // +optional + Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` + // Reason represents a machine-readable description of why this validation failed. + // If this is the first validation in the list to fail, this reason, as well as the + // corresponding HTTP response code, are used in the + // HTTP response to the client. + // The currently supported reasons are: "Unauthorized", "Forbidden", "Invalid", "RequestEntityTooLarge". + // If not set, StatusReasonInvalid is used in the response to the client. + // +optional + Reason *metav1.StatusReason `json:"reason,omitempty" protobuf:"bytes,3,opt,name=reason"` + // messageExpression declares a CEL expression that evaluates to the validation failure message that is returned when this rule fails. + // Since messageExpression is used as a failure message, it must evaluate to a string. + // If both message and messageExpression are present on a validation, then messageExpression will be used if validation fails. + // If messageExpression results in a runtime error, the runtime error is logged, and the validation failure message is produced + // as if the messageExpression field were unset. If messageExpression evaluates to an empty string, a string with only spaces, or a string + // that contains line breaks, then the validation failure message will also be produced as if the messageExpression field were unset, and + // the fact that messageExpression produced an empty string/string with only spaces/string with line breaks will be logged. + // messageExpression has access to all the same variables as the `expression` except for 'authorizer' and 'authorizer.requestResource'. + // Example: + // "object.x must be less than max ("+string(params.max)+")" + // +optional + MessageExpression string `json:"messageExpression,omitempty" protobuf:"bytes,4,opt,name=messageExpression"` +} + +// Variable is the definition of a variable that is used for composition. A variable is defined as a named expression. +// +structType=atomic +type Variable struct { + // Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. + // The variable can be accessed in other expressions through `variables` + // For example, if name is "foo", the variable will be available as `variables.foo` + Name string `json:"name" protobuf:"bytes,1,opt,name=Name"` + + // Expression is the expression that will be evaluated as the value of the variable. + // The CEL expression has access to the same identifiers as the CEL expressions in Validation. + Expression string `json:"expression" protobuf:"bytes,2,opt,name=Expression"` +} + +// AuditAnnotation describes how to produce an audit annotation for an API request. +type AuditAnnotation struct { + // key specifies the audit annotation key. The audit annotation keys of + // a ValidatingAdmissionPolicy must be unique. The key must be a qualified + // name ([A-Za-z0-9][-A-Za-z0-9_.]*) no more than 63 bytes in length. + // + // The key is combined with the resource name of the + // ValidatingAdmissionPolicy to construct an audit annotation key: + // "{ValidatingAdmissionPolicy name}/{key}". + // + // If an admission webhook uses the same resource name as this ValidatingAdmissionPolicy + // and the same audit annotation key, the annotation key will be identical. + // In this case, the first annotation written with the key will be included + // in the audit event and all subsequent annotations with the same key + // will be discarded. + // + // Required. + Key string `json:"key" protobuf:"bytes,1,opt,name=key"` + + // valueExpression represents the expression which is evaluated by CEL to + // produce an audit annotation value. The expression must evaluate to either + // a string or null value. If the expression evaluates to a string, the + // audit annotation is included with the string value. If the expression + // evaluates to null or empty string the audit annotation will be omitted. + // The valueExpression may be no longer than 5kb in length. + // If the result of the valueExpression is more than 10kb in length, it + // will be truncated to 10kb. + // + // If multiple ValidatingAdmissionPolicyBinding resources match an + // API request, then the valueExpression will be evaluated for + // each binding. All unique values produced by the valueExpressions + // will be joined together in a comma-separated list. + // + // Required. + ValueExpression string `json:"valueExpression" protobuf:"bytes,2,opt,name=valueExpression"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 + +// ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. +// ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// +// The CEL expressions of a policy must have a computed CEL cost below the maximum +// CEL budget. Each evaluation of the policy is given an independent CEL cost budget. +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +type ValidatingAdmissionPolicyBinding struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the ValidatingAdmissionPolicyBinding. + Spec ValidatingAdmissionPolicyBindingSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.28 + +// ValidatingAdmissionPolicyBindingList is a list of ValidatingAdmissionPolicyBinding. +type ValidatingAdmissionPolicyBindingList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of PolicyBinding. + Items []ValidatingAdmissionPolicyBinding `json:"items,omitempty" protobuf:"bytes,2,rep,name=items"` +} + +// ValidatingAdmissionPolicyBindingSpec is the specification of the ValidatingAdmissionPolicyBinding. +type ValidatingAdmissionPolicyBindingSpec struct { + // PolicyName references a ValidatingAdmissionPolicy name which the ValidatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + PolicyName string `json:"policyName,omitempty" protobuf:"bytes,1,rep,name=policyName"` + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + ParamRef *ParamRef `json:"paramRef,omitempty" protobuf:"bytes,2,rep,name=paramRef"` + + // MatchResources declares what resources match this binding and will be validated by it. + // Note that this is intersected with the policy's matchConstraints, so only requests that are matched by the policy can be selected by this. + // If this is unset, all resources matched by the policy are validated by this binding + // When resourceRules is unset, it does not constrain resource matching. If a resource is matched by the other fields of this object, it will be validated. + // Note that this is differs from ValidatingAdmissionPolicy matchConstraints, where resourceRules are required. + // +optional + MatchResources *MatchResources `json:"matchResources,omitempty" protobuf:"bytes,3,rep,name=matchResources"` + + // validationActions declares how Validations of the referenced ValidatingAdmissionPolicy are enforced. + // If a validation evaluates to false it is always enforced according to these actions. + // + // Failures defined by the ValidatingAdmissionPolicy's FailurePolicy are enforced according + // to these actions only if the FailurePolicy is set to Fail, otherwise the failures are + // ignored. This includes compilation errors, runtime errors and misconfigurations of the policy. + // + // validationActions is declared as a set of action values. Order does + // not matter. validationActions may not contain duplicates of the same action. + // + // The supported actions values are: + // + // "Deny" specifies that a validation failure results in a denied request. + // + // "Warn" specifies that a validation failure is reported to the request client + // in HTTP Warning headers, with a warning code of 299. Warnings can be sent + // both for allowed or denied admission responses. + // + // "Audit" specifies that a validation failure is included in the published + // audit event for the request. The audit event will contain a + // `validation.policy.admission.k8s.io/validation_failure` audit annotation + // with a value containing the details of the validation failures, formatted as + // a JSON list of objects, each with the following fields: + // - message: The validation failure message string + // - policy: The resource name of the ValidatingAdmissionPolicy + // - binding: The resource name of the ValidatingAdmissionPolicyBinding + // - expressionIndex: The index of the failed validations in the ValidatingAdmissionPolicy + // - validationActions: The enforcement actions enacted for the validation failure + // Example audit annotation: + // `"validation.policy.admission.k8s.io/validation_failure": "[{\"message\": \"Invalid value\", {\"policy\": \"policy.example.com\", {\"binding\": \"policybinding.example.com\", {\"expressionIndex\": \"1\", {\"validationActions\": [\"Audit\"]}]"` + // + // Clients should expect to handle additional values by ignoring + // any values not recognized. + // + // "Deny" and "Warn" may not be used together since this combination + // needlessly duplicates the validation failure both in the + // API response body and the HTTP warning headers. + // + // Required. + // +listType=set + ValidationActions []ValidationAction `json:"validationActions,omitempty" protobuf:"bytes,4,rep,name=validationActions"` +} + +// ParamRef describes how to locate the params to be used as input to +// expressions of rules applied by a policy binding. +// +structType=atomic +type ParamRef struct { + // name is the name of the resource being referenced. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // A single parameter used for all admission requests can be configured + // by setting the `name` field, leaving `selector` blank, and setting namespace + // if `paramKind` is namespace-scoped. + // + Name string `json:"name,omitempty" protobuf:"bytes,1,rep,name=name"` + + // namespace is the namespace of the referenced resource. Allows limiting + // the search for params to a specific namespace. Applies to both `name` and + // `selector` fields. + // + // A per-namespace parameter may be used by specifying a namespace-scoped + // `paramKind` in the policy and leaving this field empty. + // + // - If `paramKind` is cluster-scoped, this field MUST be unset. Setting this + // field results in a configuration error. + // + // - If `paramKind` is namespace-scoped, the namespace of the object being + // evaluated for admission will be used when this field is left unset. Take + // care that if this is left empty the binding must not match any cluster-scoped + // resources, which will result in an error. + // + // +optional + Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,rep,name=namespace"` + + // selector can be used to match multiple param objects based on their labels. + // Supply selector: {} to match all resources of the ParamKind. + // + // If multiple params are found, they are all evaluated with the policy expressions + // and the results are ANDed together. + // + // One of `name` or `selector` must be set, but `name` and `selector` are + // mutually exclusive properties. If one is set, the other must be unset. + // + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,rep,name=selector"` + + // `parameterNotFoundAction` controls the behavior of the binding when the resource + // exists, and name or selector is valid, but there are no parameters + // matched by the binding. If the value is set to `Allow`, then no + // matched parameters will be treated as successful validation by the binding. + // If set to `Deny`, then no matched parameters will be subject to the + // `failurePolicy` of the policy. + // + // Allowed values are `Allow` or `Deny` + // + // Required + ParameterNotFoundAction *ParameterNotFoundActionType `json:"parameterNotFoundAction,omitempty" protobuf:"bytes,4,rep,name=parameterNotFoundAction"` +} + +// MatchResources decides whether to run the admission control policy on an object based +// on whether it meets the match criteria. +// The exclude rules take precedence over include rules (if a resource matches both, it is excluded) +// +structType=atomic +type MatchResources struct { + // NamespaceSelector decides whether to run the admission control policy on an object based + // on whether the namespace for that object matches the selector. If the + // object itself is a namespace, the matching is performed on + // object.metadata.labels. If the object is another cluster scoped resource, + // it never skips the policy. + // + // For example, to run the webhook on any objects whose namespace is not + // associated with "runlevel" of "0" or "1"; you will set the selector as + // follows: + // "namespaceSelector": { + // "matchExpressions": [ + // { + // "key": "runlevel", + // "operator": "NotIn", + // "values": [ + // "0", + // "1" + // ] + // } + // ] + // } + // + // If instead you want to only run the policy on any objects whose + // namespace is associated with the "environment" of "prod" or "staging"; + // you will set the selector as follows: + // "namespaceSelector": { + // "matchExpressions": [ + // { + // "key": "environment", + // "operator": "In", + // "values": [ + // "prod", + // "staging" + // ] + // } + // ] + // } + // + // See + // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + // for more examples of label selectors. + // + // Default to the empty LabelSelector, which matches everything. + // +optional + NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,1,opt,name=namespaceSelector"` + // ObjectSelector decides whether to run the validation based on if the + // object has matching labels. objectSelector is evaluated against both + // the oldObject and newObject that would be sent to the cel validation, and + // is considered to match if either object matches the selector. A null + // object (oldObject in the case of create, or newObject in the case of + // delete) or an object that cannot have labels (like a + // DeploymentRollback or a PodProxyOptions object) is not considered to + // match. + // Use the object selector only if the webhook is opt-in, because end + // users may skip the admission webhook by setting the labels. + // Default to the empty LabelSelector, which matches everything. + // +optional + ObjectSelector *metav1.LabelSelector `json:"objectSelector,omitempty" protobuf:"bytes,2,opt,name=objectSelector"` + // ResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy matches. + // The policy cares about an operation if it matches _any_ Rule. + // +listType=atomic + // +optional + ResourceRules []NamedRuleWithOperations `json:"resourceRules,omitempty" protobuf:"bytes,3,rep,name=resourceRules"` + // ExcludeResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy should not care about. + // The exclude rules take precedence over include rules (if a resource matches both, it is excluded) + // +listType=atomic + // +optional + ExcludeResourceRules []NamedRuleWithOperations `json:"excludeResourceRules,omitempty" protobuf:"bytes,4,rep,name=excludeResourceRules"` + // matchPolicy defines how the "MatchResources" list is used to match incoming requests. + // Allowed values are "Exact" or "Equivalent". + // + // - Exact: match a request only if it exactly matches a specified rule. + // For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, + // but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, + // a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the ValidatingAdmissionPolicy. + // + // - Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. + // For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, + // and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, + // a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the ValidatingAdmissionPolicy. + // + // Defaults to "Equivalent" + // +optional + MatchPolicy *MatchPolicyType `json:"matchPolicy,omitempty" protobuf:"bytes,7,opt,name=matchPolicy,casttype=MatchPolicyType"` +} + +// ValidationAction specifies a policy enforcement action. +// +enum +type ValidationAction string + +const ( + // Deny specifies that a validation failure results in a denied request. + Deny ValidationAction = "Deny" + // Warn specifies that a validation failure is reported to the request client + // in HTTP Warning headers, with a warning code of 299. Warnings can be sent + // both for allowed or denied admission responses. + Warn ValidationAction = "Warn" + // Audit specifies that a validation failure is included in the published + // audit event for the request. The audit event will contain a + // `validation.policy.admission.k8s.io/validation_failure` audit annotation + // with a value containing the details of the validation failure. + Audit ValidationAction = "Audit" +) + +// NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames. +// +structType=atomic +type NamedRuleWithOperations struct { + // ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + // +listType=atomic + // +optional + ResourceNames []string `json:"resourceNames,omitempty" protobuf:"bytes,1,rep,name=resourceNames"` + // RuleWithOperations is a tuple of Operations and Resources. + RuleWithOperations `json:",inline" protobuf:"bytes,2,opt,name=ruleWithOperations"` +} + // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -296,7 +886,7 @@ type ValidatingWebhook struct { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge @@ -468,7 +1058,7 @@ type MutatingWebhook struct { // - If failurePolicy=Fail, reject the request // - If failurePolicy=Ignore, the error is ignored and the webhook is skipped // - // This is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate. + // This is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate. // // +patchMergeKey=name // +patchStrategy=merge diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index 2c0a9f011..adaf4bc11 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -27,6 +27,26 @@ package v1beta1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_AuditAnnotation = map[string]string{ + "": "AuditAnnotation describes how to produce an audit annotation for an API request.", + "key": "key specifies the audit annotation key. The audit annotation keys of a ValidatingAdmissionPolicy must be unique. The key must be a qualified name ([A-Za-z0-9][-A-Za-z0-9_.]*) no more than 63 bytes in length.\n\nThe key is combined with the resource name of the ValidatingAdmissionPolicy to construct an audit annotation key: \"{ValidatingAdmissionPolicy name}/{key}\".\n\nIf an admission webhook uses the same resource name as this ValidatingAdmissionPolicy and the same audit annotation key, the annotation key will be identical. In this case, the first annotation written with the key will be included in the audit event and all subsequent annotations with the same key will be discarded.\n\nRequired.", + "valueExpression": "valueExpression represents the expression which is evaluated by CEL to produce an audit annotation value. The expression must evaluate to either a string or null value. If the expression evaluates to a string, the audit annotation is included with the string value. If the expression evaluates to null or empty string the audit annotation will be omitted. The valueExpression may be no longer than 5kb in length. If the result of the valueExpression is more than 10kb in length, it will be truncated to 10kb.\n\nIf multiple ValidatingAdmissionPolicyBinding resources match an API request, then the valueExpression will be evaluated for each binding. All unique values produced by the valueExpressions will be joined together in a comma-separated list.\n\nRequired.", +} + +func (AuditAnnotation) SwaggerDoc() map[string]string { + return map_AuditAnnotation +} + +var map_ExpressionWarning = map[string]string{ + "": "ExpressionWarning is a warning information that targets a specific expression.", + "fieldRef": "The path to the field that refers the expression. For example, the reference to the expression of the first item of validations is \"spec.validations[0].expression\"", + "warning": "The content of type checking information in a human-readable form. Each line of the warning contains the type that the expression is checked against, followed by the type check error from the compiler.", +} + +func (ExpressionWarning) SwaggerDoc() map[string]string { + return map_ExpressionWarning +} + var map_MatchCondition = map[string]string{ "": "MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook.", "name": "Name is an identifier for this match condition, used for strategic merging of MatchConditions, as well as providing an identifier for logging purposes. A good name should be descriptive of the associated expression. Name must be a qualified name consisting of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]') with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')\n\nRequired.", @@ -37,6 +57,19 @@ func (MatchCondition) SwaggerDoc() map[string]string { return map_MatchCondition } +var map_MatchResources = map[string]string{ + "": "MatchResources decides whether to run the admission control policy on an object based on whether it meets the match criteria. The exclude rules take precedence over include rules (if a resource matches both, it is excluded)", + "namespaceSelector": "NamespaceSelector decides whether to run the admission control policy on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the policy.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the policy on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", + "objectSelector": "ObjectSelector decides whether to run the validation based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the cel validation, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything.", + "resourceRules": "ResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy matches. The policy cares about an operation if it matches _any_ Rule.", + "excludeResourceRules": "ExcludeResourceRules describes what operations on what resources/subresources the ValidatingAdmissionPolicy should not care about. The exclude rules take precedence over include rules (if a resource matches both, it is excluded)", + "matchPolicy": "matchPolicy defines how the \"MatchResources\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the ValidatingAdmissionPolicy.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the ValidatingAdmissionPolicy.\n\nDefaults to \"Equivalent\"", +} + +func (MatchResources) SwaggerDoc() map[string]string { + return map_MatchResources +} + var map_MutatingWebhook = map[string]string{ "": "MutatingWebhook describes an admission webhook and the resources and operations it applies to.", "name": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", @@ -50,7 +83,7 @@ var map_MutatingWebhook = map[string]string{ "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", "reinvocationPolicy": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", - "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate.", + "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate.", } func (MutatingWebhook) SwaggerDoc() map[string]string { @@ -77,6 +110,37 @@ func (MutatingWebhookConfigurationList) SwaggerDoc() map[string]string { return map_MutatingWebhookConfigurationList } +var map_NamedRuleWithOperations = map[string]string{ + "": "NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames.", + "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", +} + +func (NamedRuleWithOperations) SwaggerDoc() map[string]string { + return map_NamedRuleWithOperations +} + +var map_ParamKind = map[string]string{ + "": "ParamKind is a tuple of Group Kind and Version.", + "apiVersion": "APIVersion is the API group version the resources belong to. In format of \"group/version\". Required.", + "kind": "Kind is the API kind the resources belong to. Required.", +} + +func (ParamKind) SwaggerDoc() map[string]string { + return map_ParamKind +} + +var map_ParamRef = map[string]string{ + "": "ParamRef describes how to locate the params to be used as input to expressions of rules applied by a policy binding.", + "name": "name is the name of the resource being referenced.\n\nOne of `name` or `selector` must be set, but `name` and `selector` are mutually exclusive properties. If one is set, the other must be unset.\n\nA single parameter used for all admission requests can be configured by setting the `name` field, leaving `selector` blank, and setting namespace if `paramKind` is namespace-scoped.", + "namespace": "namespace is the namespace of the referenced resource. Allows limiting the search for params to a specific namespace. Applies to both `name` and `selector` fields.\n\nA per-namespace parameter may be used by specifying a namespace-scoped `paramKind` in the policy and leaving this field empty.\n\n- If `paramKind` is cluster-scoped, this field MUST be unset. Setting this field results in a configuration error.\n\n- If `paramKind` is namespace-scoped, the namespace of the object being evaluated for admission will be used when this field is left unset. Take care that if this is left empty the binding must not match any cluster-scoped resources, which will result in an error.", + "selector": "selector can be used to match multiple param objects based on their labels. Supply selector: {} to match all resources of the ParamKind.\n\nIf multiple params are found, they are all evaluated with the policy expressions and the results are ANDed together.\n\nOne of `name` or `selector` must be set, but `name` and `selector` are mutually exclusive properties. If one is set, the other must be unset.", + "parameterNotFoundAction": "`parameterNotFoundAction` controls the behavior of the binding when the resource exists, and name or selector is valid, but there are no parameters matched by the binding. If the value is set to `Allow`, then no matched parameters will be treated as successful validation by the binding. If set to `Deny`, then no matched parameters will be subject to the `failurePolicy` of the policy.\n\nAllowed values are `Allow` or `Deny`\n\nRequired", +} + +func (ParamRef) SwaggerDoc() map[string]string { + return map_ParamRef +} + var map_ServiceReference = map[string]string{ "": "ServiceReference holds a reference to Service.legacy.k8s.io", "namespace": "`namespace` is the namespace of the service. Required", @@ -89,6 +153,94 @@ func (ServiceReference) SwaggerDoc() map[string]string { return map_ServiceReference } +var map_TypeChecking = map[string]string{ + "": "TypeChecking contains results of type checking the expressions in the ValidatingAdmissionPolicy", + "expressionWarnings": "The type checking warnings for each expression.", +} + +func (TypeChecking) SwaggerDoc() map[string]string { + return map_TypeChecking +} + +var map_ValidatingAdmissionPolicy = map[string]string{ + "": "ValidatingAdmissionPolicy describes the definition of an admission validation policy that accepts or rejects an object without changing it.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the ValidatingAdmissionPolicy.", + "status": "The status of the ValidatingAdmissionPolicy, including warnings that are useful to determine if the policy behaves in the expected way. Populated by the system. Read-only.", +} + +func (ValidatingAdmissionPolicy) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicy +} + +var map_ValidatingAdmissionPolicyBinding = map[string]string{ + "": "ValidatingAdmissionPolicyBinding binds the ValidatingAdmissionPolicy with paramerized resources. ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for clusters.\n\nFor a given admission request, each binding will cause its policy to be evaluated N times, where N is 1 for policies/bindings that don't use params, otherwise N is the number of parameters selected by the binding.\n\nThe CEL expressions of a policy must have a computed CEL cost below the maximum CEL budget. Each evaluation of the policy is given an independent CEL cost budget. Adding/removing policies, bindings, or params can not affect whether a given (policy, binding, param) combination is within its own CEL budget.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the ValidatingAdmissionPolicyBinding.", +} + +func (ValidatingAdmissionPolicyBinding) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicyBinding +} + +var map_ValidatingAdmissionPolicyBindingList = map[string]string{ + "": "ValidatingAdmissionPolicyBindingList is a list of ValidatingAdmissionPolicyBinding.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of PolicyBinding.", +} + +func (ValidatingAdmissionPolicyBindingList) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicyBindingList +} + +var map_ValidatingAdmissionPolicyBindingSpec = map[string]string{ + "": "ValidatingAdmissionPolicyBindingSpec is the specification of the ValidatingAdmissionPolicyBinding.", + "policyName": "PolicyName references a ValidatingAdmissionPolicy name which the ValidatingAdmissionPolicyBinding binds to. If the referenced resource does not exist, this binding is considered invalid and will be ignored Required.", + "paramRef": "paramRef specifies the parameter resource used to configure the admission control policy. It should point to a resource of the type specified in ParamKind of the bound ValidatingAdmissionPolicy. If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the ValidatingAdmissionPolicy applied. If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param.", + "matchResources": "MatchResources declares what resources match this binding and will be validated by it. Note that this is intersected with the policy's matchConstraints, so only requests that are matched by the policy can be selected by this. If this is unset, all resources matched by the policy are validated by this binding When resourceRules is unset, it does not constrain resource matching. If a resource is matched by the other fields of this object, it will be validated. Note that this is differs from ValidatingAdmissionPolicy matchConstraints, where resourceRules are required.", + "validationActions": "validationActions declares how Validations of the referenced ValidatingAdmissionPolicy are enforced. If a validation evaluates to false it is always enforced according to these actions.\n\nFailures defined by the ValidatingAdmissionPolicy's FailurePolicy are enforced according to these actions only if the FailurePolicy is set to Fail, otherwise the failures are ignored. This includes compilation errors, runtime errors and misconfigurations of the policy.\n\nvalidationActions is declared as a set of action values. Order does not matter. validationActions may not contain duplicates of the same action.\n\nThe supported actions values are:\n\n\"Deny\" specifies that a validation failure results in a denied request.\n\n\"Warn\" specifies that a validation failure is reported to the request client in HTTP Warning headers, with a warning code of 299. Warnings can be sent both for allowed or denied admission responses.\n\n\"Audit\" specifies that a validation failure is included in the published audit event for the request. The audit event will contain a `validation.policy.admission.k8s.io/validation_failure` audit annotation with a value containing the details of the validation failures, formatted as a JSON list of objects, each with the following fields: - message: The validation failure message string - policy: The resource name of the ValidatingAdmissionPolicy - binding: The resource name of the ValidatingAdmissionPolicyBinding - expressionIndex: The index of the failed validations in the ValidatingAdmissionPolicy - validationActions: The enforcement actions enacted for the validation failure Example audit annotation: `\"validation.policy.admission.k8s.io/validation_failure\": \"[{\"message\": \"Invalid value\", {\"policy\": \"policy.example.com\", {\"binding\": \"policybinding.example.com\", {\"expressionIndex\": \"1\", {\"validationActions\": [\"Audit\"]}]\"`\n\nClients should expect to handle additional values by ignoring any values not recognized.\n\n\"Deny\" and \"Warn\" may not be used together since this combination needlessly duplicates the validation failure both in the API response body and the HTTP warning headers.\n\nRequired.", +} + +func (ValidatingAdmissionPolicyBindingSpec) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicyBindingSpec +} + +var map_ValidatingAdmissionPolicyList = map[string]string{ + "": "ValidatingAdmissionPolicyList is a list of ValidatingAdmissionPolicy.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of ValidatingAdmissionPolicy.", +} + +func (ValidatingAdmissionPolicyList) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicyList +} + +var map_ValidatingAdmissionPolicySpec = map[string]string{ + "": "ValidatingAdmissionPolicySpec is the specification of the desired behavior of the AdmissionPolicy.", + "paramKind": "ParamKind specifies the kind of resources used to parameterize this policy. If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. If ParamKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. If paramKind is specified but paramRef is unset in ValidatingAdmissionPolicyBinding, the params variable will be null.", + "matchConstraints": "MatchConstraints specifies what resources this policy is designed to validate. The AdmissionPolicy cares about a request if it matches _all_ Constraints. However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API ValidatingAdmissionPolicy cannot match ValidatingAdmissionPolicy and ValidatingAdmissionPolicyBinding. Required.", + "validations": "Validations contain CEL expressions which is used to apply the validation. Validations and AuditAnnotations may not both be empty; a minimum of one Validations or AuditAnnotations is required.", + "failurePolicy": "failurePolicy defines how to handle failures for the admission policy. Failures can occur from CEL expression parse errors, type check errors, runtime errors and invalid or mis-configured policy definitions or bindings.\n\nA policy is invalid if spec.paramKind refers to a non-existent Kind. A binding is invalid if spec.paramRef.name refers to a non-existent resource.\n\nfailurePolicy does not define how validations that evaluate to false are handled.\n\nWhen failurePolicy is set to Fail, ValidatingAdmissionPolicyBinding validationActions define how failures are enforced.\n\nAllowed values are Ignore or Fail. Defaults to Fail.", + "auditAnnotations": "auditAnnotations contains CEL expressions which are used to produce audit annotations for the audit event of the API request. validations and auditAnnotations may not both be empty; a least one of validations or auditAnnotations is required.", + "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be validated. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nIf a parameter object is provided, it can be accessed via the `params` handle in the same manner as validation expressions.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the policy is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the policy is skipped", + "variables": "Variables contain definitions of variables that can be used in composition of other expressions. Each variable is defined as a named CEL expression. The variables defined here will be available under `variables` in other expressions of the policy except MatchConditions because MatchConditions are evaluated before the rest of the policy.\n\nThe expression of a variable can refer to other variables defined earlier in the list but not those after. Thus, Variables must be sorted by the order of first appearance and acyclic.", +} + +func (ValidatingAdmissionPolicySpec) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicySpec +} + +var map_ValidatingAdmissionPolicyStatus = map[string]string{ + "": "ValidatingAdmissionPolicyStatus represents the status of an admission validation policy.", + "observedGeneration": "The generation observed by the controller.", + "typeChecking": "The results of type checking for each expression. Presence of this field indicates the completion of the type checking.", + "conditions": "The conditions represent the latest available observations of a policy's current state.", +} + +func (ValidatingAdmissionPolicyStatus) SwaggerDoc() map[string]string { + return map_ValidatingAdmissionPolicyStatus +} + var map_ValidatingWebhook = map[string]string{ "": "ValidatingWebhook describes an admission webhook and the resources and operations it applies to.", "name": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", @@ -101,7 +253,7 @@ var map_ValidatingWebhook = map[string]string{ "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", - "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is an alpha feature and managed by the AdmissionWebhookMatchConditions feature gate.", + "matchConditions": "MatchConditions is a list of conditions that must be met for a request to be sent to this webhook. Match conditions filter requests that have already been matched by the rules, namespaceSelector, and objectSelector. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the webhook is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the webhook is called.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the error is ignored and the webhook is skipped\n\nThis is a beta feature and managed by the AdmissionWebhookMatchConditions feature gate.", } func (ValidatingWebhook) SwaggerDoc() map[string]string { @@ -128,6 +280,28 @@ func (ValidatingWebhookConfigurationList) SwaggerDoc() map[string]string { return map_ValidatingWebhookConfigurationList } +var map_Validation = map[string]string{ + "": "Validation specifies the CEL expression which is used to apply the validation.", + "expression": "Expression represents the expression which will be evaluated by CEL. ref: https://github.com/google/cel-spec CEL expressions have access to the contents of the API request/response, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nThe `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the object. No other metadata properties are accessible.\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Accessible property names are escaped according to the following rules when accessed in the expression: - '__' escapes to '__underscores__' - '.' escapes to '__dot__' - '-' escapes to '__dash__' - '/' escapes to '__slash__' - Property names that exactly match a CEL RESERVED keyword escape to '__{keyword}__'. The keywords are:\n\t \"true\", \"false\", \"null\", \"in\", \"as\", \"break\", \"const\", \"continue\", \"else\", \"for\", \"function\", \"if\",\n\t \"import\", \"let\", \"loop\", \"package\", \"namespace\", \"return\".\nExamples:\n - Expression accessing a property named \"namespace\": {\"Expression\": \"object.__namespace__ > 0\"}\n - Expression accessing a property named \"x-prop\": {\"Expression\": \"object.x__dash__prop > 0\"}\n - Expression accessing a property named \"redact__d\": {\"Expression\": \"object.redact__underscores__d > 0\"}\n\nEquality on arrays with list type of 'set' or 'map' ignores element order, i.e. [1, 2] == [2, 1]. Concatenation on arrays with x-kubernetes-list-type use the semantics of the list type:\n - 'set': `X + Y` performs a union where the array positions of all elements in `X` are preserved and\n non-intersecting elements in `Y` are appended, retaining their partial order.\n - 'map': `X + Y` performs a merge where the array positions of all keys in `X` are preserved but the values\n are overwritten by values in `Y` when the key sets of `X` and `Y` intersect. Elements in `Y` with\n non-intersecting keys are appended, retaining their partial order.\nRequired.", + "message": "Message represents the message displayed when validation fails. The message is required if the Expression contains line breaks. The message must not contain line breaks. If unset, the message is \"failed rule: {Rule}\". e.g. \"must be a URL with the host matching spec.host\" If the Expression contains line breaks. Message is required. The message must not contain line breaks. If unset, the message is \"failed Expression: {Expression}\".", + "reason": "Reason represents a machine-readable description of why this validation failed. If this is the first validation in the list to fail, this reason, as well as the corresponding HTTP response code, are used in the HTTP response to the client. The currently supported reasons are: \"Unauthorized\", \"Forbidden\", \"Invalid\", \"RequestEntityTooLarge\". If not set, StatusReasonInvalid is used in the response to the client.", + "messageExpression": "messageExpression declares a CEL expression that evaluates to the validation failure message that is returned when this rule fails. Since messageExpression is used as a failure message, it must evaluate to a string. If both message and messageExpression are present on a validation, then messageExpression will be used if validation fails. If messageExpression results in a runtime error, the runtime error is logged, and the validation failure message is produced as if the messageExpression field were unset. If messageExpression evaluates to an empty string, a string with only spaces, or a string that contains line breaks, then the validation failure message will also be produced as if the messageExpression field were unset, and the fact that messageExpression produced an empty string/string with only spaces/string with line breaks will be logged. messageExpression has access to all the same variables as the `expression` except for 'authorizer' and 'authorizer.requestResource'. Example: \"object.x must be less than max (\"+string(params.max)+\")\"", +} + +func (Validation) SwaggerDoc() map[string]string { + return map_Validation +} + +var map_Variable = map[string]string{ + "": "Variable is the definition of a variable that is used for composition. A variable is defined as a named expression.", + "name": "Name is the name of the variable. The name must be a valid CEL identifier and unique among all variables. The variable can be accessed in other expressions through `variables` For example, if name is \"foo\", the variable will be available as `variables.foo`", + "expression": "Expression is the expression that will be evaluated as the value of the variable. The CEL expression has access to the same identifiers as the CEL expressions in Validation.", +} + +func (Variable) SwaggerDoc() map[string]string { + return map_Variable +} + var map_WebhookClientConfig = map[string]string{ "": "WebhookClientConfig contains the information to make a TLS connection with the webhook", "url": "`url` gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go index 9c5299bdf..4c10b1d11 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go @@ -22,11 +22,43 @@ limitations under the License. package v1beta1 import ( - v1 "k8s.io/api/admissionregistration/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" + v1 "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 *AuditAnnotation) DeepCopyInto(out *AuditAnnotation) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuditAnnotation. +func (in *AuditAnnotation) DeepCopy() *AuditAnnotation { + if in == nil { + return nil + } + out := new(AuditAnnotation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExpressionWarning) DeepCopyInto(out *ExpressionWarning) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExpressionWarning. +func (in *ExpressionWarning) DeepCopy() *ExpressionWarning { + if in == nil { + return nil + } + out := new(ExpressionWarning) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MatchCondition) DeepCopyInto(out *MatchCondition) { *out = *in @@ -43,13 +75,58 @@ func (in *MatchCondition) DeepCopy() *MatchCondition { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MatchResources) DeepCopyInto(out *MatchResources) { + *out = *in + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.ObjectSelector != nil { + in, out := &in.ObjectSelector, &out.ObjectSelector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.ResourceRules != nil { + in, out := &in.ResourceRules, &out.ResourceRules + *out = make([]NamedRuleWithOperations, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ExcludeResourceRules != nil { + in, out := &in.ExcludeResourceRules, &out.ExcludeResourceRules + *out = make([]NamedRuleWithOperations, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.MatchPolicy != nil { + in, out := &in.MatchPolicy, &out.MatchPolicy + *out = new(MatchPolicyType) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MatchResources. +func (in *MatchResources) DeepCopy() *MatchResources { + if in == nil { + return nil + } + out := new(MatchResources) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { *out = *in in.ClientConfig.DeepCopyInto(&out.ClientConfig) if in.Rules != nil { in, out := &in.Rules, &out.Rules - *out = make([]v1.RuleWithOperations, len(*in)) + *out = make([]admissionregistrationv1.RuleWithOperations, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -66,12 +143,12 @@ func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - *out = new(metav1.LabelSelector) + *out = new(v1.LabelSelector) (*in).DeepCopyInto(*out) } if in.ObjectSelector != nil { in, out := &in.ObjectSelector, &out.ObjectSelector - *out = new(metav1.LabelSelector) + *out = new(v1.LabelSelector) (*in).DeepCopyInto(*out) } if in.SideEffects != nil { @@ -178,6 +255,70 @@ func (in *MutatingWebhookConfigurationList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NamedRuleWithOperations) DeepCopyInto(out *NamedRuleWithOperations) { + *out = *in + if in.ResourceNames != nil { + in, out := &in.ResourceNames, &out.ResourceNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.RuleWithOperations.DeepCopyInto(&out.RuleWithOperations) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedRuleWithOperations. +func (in *NamedRuleWithOperations) DeepCopy() *NamedRuleWithOperations { + if in == nil { + return nil + } + out := new(NamedRuleWithOperations) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ParamKind) DeepCopyInto(out *ParamKind) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParamKind. +func (in *ParamKind) DeepCopy() *ParamKind { + if in == nil { + return nil + } + out := new(ParamKind) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ParamRef) DeepCopyInto(out *ParamRef) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.ParameterNotFoundAction != nil { + in, out := &in.ParameterNotFoundAction, &out.ParameterNotFoundAction + *out = new(ParameterNotFoundActionType) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParamRef. +func (in *ParamRef) DeepCopy() *ParamRef { + if in == nil { + return nil + } + out := new(ParamRef) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServiceReference) DeepCopyInto(out *ServiceReference) { *out = *in @@ -204,13 +345,267 @@ func (in *ServiceReference) DeepCopy() *ServiceReference { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TypeChecking) DeepCopyInto(out *TypeChecking) { + *out = *in + if in.ExpressionWarnings != nil { + in, out := &in.ExpressionWarnings, &out.ExpressionWarnings + *out = make([]ExpressionWarning, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TypeChecking. +func (in *TypeChecking) DeepCopy() *TypeChecking { + if in == nil { + return nil + } + out := new(TypeChecking) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValidatingAdmissionPolicy) DeepCopyInto(out *ValidatingAdmissionPolicy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicy. +func (in *ValidatingAdmissionPolicy) DeepCopy() *ValidatingAdmissionPolicy { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ValidatingAdmissionPolicy) 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 *ValidatingAdmissionPolicyBinding) DeepCopyInto(out *ValidatingAdmissionPolicyBinding) { + *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 ValidatingAdmissionPolicyBinding. +func (in *ValidatingAdmissionPolicyBinding) DeepCopy() *ValidatingAdmissionPolicyBinding { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicyBinding) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ValidatingAdmissionPolicyBinding) 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 *ValidatingAdmissionPolicyBindingList) DeepCopyInto(out *ValidatingAdmissionPolicyBindingList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ValidatingAdmissionPolicyBinding, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicyBindingList. +func (in *ValidatingAdmissionPolicyBindingList) DeepCopy() *ValidatingAdmissionPolicyBindingList { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicyBindingList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ValidatingAdmissionPolicyBindingList) 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 *ValidatingAdmissionPolicyBindingSpec) DeepCopyInto(out *ValidatingAdmissionPolicyBindingSpec) { + *out = *in + if in.ParamRef != nil { + in, out := &in.ParamRef, &out.ParamRef + *out = new(ParamRef) + (*in).DeepCopyInto(*out) + } + if in.MatchResources != nil { + in, out := &in.MatchResources, &out.MatchResources + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + if in.ValidationActions != nil { + in, out := &in.ValidationActions, &out.ValidationActions + *out = make([]ValidationAction, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicyBindingSpec. +func (in *ValidatingAdmissionPolicyBindingSpec) DeepCopy() *ValidatingAdmissionPolicyBindingSpec { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicyBindingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValidatingAdmissionPolicyList) DeepCopyInto(out *ValidatingAdmissionPolicyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ValidatingAdmissionPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicyList. +func (in *ValidatingAdmissionPolicyList) DeepCopy() *ValidatingAdmissionPolicyList { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ValidatingAdmissionPolicyList) 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 *ValidatingAdmissionPolicySpec) DeepCopyInto(out *ValidatingAdmissionPolicySpec) { + *out = *in + if in.ParamKind != nil { + in, out := &in.ParamKind, &out.ParamKind + *out = new(ParamKind) + **out = **in + } + if in.MatchConstraints != nil { + in, out := &in.MatchConstraints, &out.MatchConstraints + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + if in.Validations != nil { + in, out := &in.Validations, &out.Validations + *out = make([]Validation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailurePolicy != nil { + in, out := &in.FailurePolicy, &out.FailurePolicy + *out = new(FailurePolicyType) + **out = **in + } + if in.AuditAnnotations != nil { + in, out := &in.AuditAnnotations, &out.AuditAnnotations + *out = make([]AuditAnnotation, len(*in)) + copy(*out, *in) + } + if in.MatchConditions != nil { + in, out := &in.MatchConditions, &out.MatchConditions + *out = make([]MatchCondition, len(*in)) + copy(*out, *in) + } + if in.Variables != nil { + in, out := &in.Variables, &out.Variables + *out = make([]Variable, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicySpec. +func (in *ValidatingAdmissionPolicySpec) DeepCopy() *ValidatingAdmissionPolicySpec { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ValidatingAdmissionPolicyStatus) DeepCopyInto(out *ValidatingAdmissionPolicyStatus) { + *out = *in + if in.TypeChecking != nil { + in, out := &in.TypeChecking, &out.TypeChecking + *out = new(TypeChecking) + (*in).DeepCopyInto(*out) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValidatingAdmissionPolicyStatus. +func (in *ValidatingAdmissionPolicyStatus) DeepCopy() *ValidatingAdmissionPolicyStatus { + if in == nil { + return nil + } + out := new(ValidatingAdmissionPolicyStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValidatingWebhook) DeepCopyInto(out *ValidatingWebhook) { *out = *in in.ClientConfig.DeepCopyInto(&out.ClientConfig) if in.Rules != nil { in, out := &in.Rules, &out.Rules - *out = make([]v1.RuleWithOperations, len(*in)) + *out = make([]admissionregistrationv1.RuleWithOperations, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -227,12 +622,12 @@ func (in *ValidatingWebhook) DeepCopyInto(out *ValidatingWebhook) { } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - *out = new(metav1.LabelSelector) + *out = new(v1.LabelSelector) (*in).DeepCopyInto(*out) } if in.ObjectSelector != nil { in, out := &in.ObjectSelector, &out.ObjectSelector - *out = new(metav1.LabelSelector) + *out = new(v1.LabelSelector) (*in).DeepCopyInto(*out) } if in.SideEffects != nil { @@ -334,6 +729,43 @@ func (in *ValidatingWebhookConfigurationList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Validation) DeepCopyInto(out *Validation) { + *out = *in + if in.Reason != nil { + in, out := &in.Reason, &out.Reason + *out = new(v1.StatusReason) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Validation. +func (in *Validation) DeepCopy() *Validation { + if in == nil { + return nil + } + out := new(Validation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Variable) DeepCopyInto(out *Variable) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Variable. +func (in *Variable) DeepCopy() *Variable { + if in == nil { + return nil + } + out := new(Variable) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WebhookClientConfig) DeepCopyInto(out *WebhookClientConfig) { *out = *in diff --git a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go index 09a92f476..c1be5122a 100644 --- a/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/tools/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go @@ -73,6 +73,78 @@ func (in *MutatingWebhookConfigurationList) APILifecycleRemoved() (major, minor return 1, 22 } +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ValidatingAdmissionPolicy) APILifecycleIntroduced() (major, minor int) { + return 1, 28 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ValidatingAdmissionPolicy) APILifecycleDeprecated() (major, minor int) { + return 1, 31 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ValidatingAdmissionPolicy) APILifecycleRemoved() (major, minor int) { + return 1, 34 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ValidatingAdmissionPolicyBinding) APILifecycleIntroduced() (major, minor int) { + return 1, 28 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ValidatingAdmissionPolicyBinding) APILifecycleDeprecated() (major, minor int) { + return 1, 31 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ValidatingAdmissionPolicyBinding) APILifecycleRemoved() (major, minor int) { + return 1, 34 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ValidatingAdmissionPolicyBindingList) APILifecycleIntroduced() (major, minor int) { + return 1, 28 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ValidatingAdmissionPolicyBindingList) APILifecycleDeprecated() (major, minor int) { + return 1, 31 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ValidatingAdmissionPolicyBindingList) APILifecycleRemoved() (major, minor int) { + return 1, 34 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ValidatingAdmissionPolicyList) APILifecycleIntroduced() (major, minor int) { + return 1, 28 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ValidatingAdmissionPolicyList) APILifecycleDeprecated() (major, minor int) { + return 1, 31 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ValidatingAdmissionPolicyList) APILifecycleRemoved() (major, minor int) { + return 1, 34 +} + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *ValidatingWebhookConfiguration) APILifecycleIntroduced() (major, minor int) { diff --git a/tools/vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto b/tools/vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto index aa08b4978..a09af750b 100644 --- a/tools/vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto +++ b/tools/vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto @@ -71,7 +71,7 @@ message APIResourceDiscovery { // responseKind describes the group, version, and kind of the serialization schema for the object type this endpoint typically returns. // APIs may return other objects types at their discretion, such as error conditions, requests for alternate representations, or other operation specific behavior. - // This value will be null if an APIService reports subresources but supports no operations on the parent resource + // This value will be null or empty if an APIService reports subresources but supports no operations on the parent resource optional k8s.io.apimachinery.pkg.apis.meta.v1.GroupVersionKind responseKind = 2; // scope indicates the scope of a resource, either Cluster or Namespaced @@ -111,7 +111,7 @@ message APISubresourceDiscovery { optional string subresource = 1; // responseKind describes the group, version, and kind of the serialization schema for the object type this endpoint typically returns. - // Some subresources do not return normal resources, these will have null return types. + // Some subresources do not return normal resources, these will have null or empty return types. optional k8s.io.apimachinery.pkg.apis.meta.v1.GroupVersionKind responseKind = 2; // acceptedTypes describes the kinds that this endpoint accepts. diff --git a/tools/vendor/k8s.io/api/apidiscovery/v2beta1/types.go b/tools/vendor/k8s.io/api/apidiscovery/v2beta1/types.go index 1aff3e370..834293773 100644 --- a/tools/vendor/k8s.io/api/apidiscovery/v2beta1/types.go +++ b/tools/vendor/k8s.io/api/apidiscovery/v2beta1/types.go @@ -92,7 +92,7 @@ type APIResourceDiscovery struct { Resource string `json:"resource" protobuf:"bytes,1,opt,name=resource"` // responseKind describes the group, version, and kind of the serialization schema for the object type this endpoint typically returns. // APIs may return other objects types at their discretion, such as error conditions, requests for alternate representations, or other operation specific behavior. - // This value will be null if an APIService reports subresources but supports no operations on the parent resource + // This value will be null or empty if an APIService reports subresources but supports no operations on the parent resource ResponseKind *v1.GroupVersionKind `json:"responseKind,omitempty" protobuf:"bytes,2,opt,name=responseKind"` // scope indicates the scope of a resource, either Cluster or Namespaced Scope ResourceScope `json:"scope" protobuf:"bytes,3,opt,name=scope"` @@ -141,7 +141,7 @@ type APISubresourceDiscovery struct { // for this resource across all versions. Subresource string `json:"subresource" protobuf:"bytes,1,opt,name=subresource"` // responseKind describes the group, version, and kind of the serialization schema for the object type this endpoint typically returns. - // Some subresources do not return normal resources, these will have null return types. + // Some subresources do not return normal resources, these will have null or empty return types. ResponseKind *v1.GroupVersionKind `json:"responseKind,omitempty" protobuf:"bytes,2,opt,name=responseKind"` // acceptedTypes describes the kinds that this endpoint accepts. // Subresources may accept the standard content types or define diff --git a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go index 4effbc6c1..6871da414 100644 --- a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go +++ b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go @@ -225,55 +225,57 @@ func init() { } var fileDescriptor_a3903ff5e3cc7a03 = []byte{ - // 768 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xdf, 0x4e, 0x13, 0x4d, - 0x14, 0xef, 0xd2, 0x52, 0x60, 0xfa, 0x7d, 0xf4, 0x63, 0x3e, 0x08, 0xb5, 0x26, 0x5b, 0x6c, 0x82, - 0x41, 0x8d, 0xbb, 0xd2, 0x88, 0x91, 0x98, 0x68, 0x58, 0x20, 0x06, 0x05, 0x31, 0x03, 0xf1, 0x02, - 0xbd, 0x70, 0xba, 0x3b, 0x6e, 0xd7, 0x76, 0x77, 0x36, 0x3b, 0xd3, 0x26, 0xdc, 0x18, 0x1f, 0xc1, - 0x07, 0xf1, 0xd2, 0x87, 0xe0, 0xca, 0x70, 0x63, 0x42, 0x62, 0xd2, 0xc8, 0xfa, 0x16, 0x5c, 0x99, - 0x99, 0xdd, 0xb6, 0x6c, 0xbb, 0xc4, 0x86, 0x8b, 0x26, 0x9d, 0x73, 0xce, 0xef, 0x77, 0xfe, 0xcc, - 0x6f, 0xce, 0x82, 0x57, 0xcd, 0xc7, 0x4c, 0x73, 0xa8, 0xde, 0x6c, 0xd7, 0x49, 0xe0, 0x11, 0x4e, - 0x98, 0xde, 0x21, 0x9e, 0x45, 0x03, 0x3d, 0x76, 0x60, 0xdf, 0x11, 0x3f, 0x46, 0x82, 0x0e, 0x09, - 0x1c, 0x8f, 0x93, 0xc0, 0xc3, 0x2d, 0xbd, 0xb3, 0x8a, 0x5b, 0x7e, 0x03, 0xaf, 0xea, 0x36, 0xf1, - 0x48, 0x80, 0x39, 0xb1, 0x34, 0x3f, 0xa0, 0x9c, 0xc2, 0xe5, 0x08, 0xa6, 0x61, 0xdf, 0xd1, 0x46, - 0x60, 0x5a, 0x0f, 0x56, 0xbe, 0x6f, 0x3b, 0xbc, 0xd1, 0xae, 0x6b, 0x26, 0x75, 0x75, 0x9b, 0xda, - 0x54, 0x97, 0xe8, 0x7a, 0xfb, 0x83, 0x3c, 0xc9, 0x83, 0xfc, 0x17, 0xb1, 0x96, 0x1f, 0x0e, 0x8a, - 0x71, 0xb1, 0xd9, 0x70, 0x3c, 0x12, 0x1c, 0xeb, 0x7e, 0xd3, 0x96, 0x95, 0xe9, 0x2e, 0xe1, 0x58, - 0xef, 0x8c, 0xd4, 0x52, 0xd6, 0xaf, 0x42, 0x05, 0x6d, 0x8f, 0x3b, 0x2e, 0x19, 0x01, 0x3c, 0xfa, - 0x1b, 0x80, 0x99, 0x0d, 0xe2, 0xe2, 0x61, 0x5c, 0xf5, 0x87, 0x02, 0xe6, 0x0f, 0x64, 0xa7, 0x07, - 0x9c, 0x06, 0xd8, 0x26, 0x6f, 0x48, 0xc0, 0x1c, 0xea, 0xc1, 0x35, 0x50, 0xc0, 0xbe, 0x13, 0xb9, - 0x76, 0xb6, 0x4a, 0xca, 0x92, 0xb2, 0x32, 0x63, 0xfc, 0x7f, 0xd2, 0xad, 0x64, 0xc2, 0x6e, 0xa5, - 0xb0, 0xf1, 0x7a, 0xa7, 0xe7, 0x42, 0x97, 0xe3, 0xe0, 0x06, 0x28, 0x12, 0xcf, 0xa4, 0x96, 0xe3, - 0xd9, 0x31, 0x53, 0x69, 0x42, 0x42, 0x17, 0x63, 0x68, 0x71, 0x3b, 0xe9, 0x46, 0xc3, 0xf1, 0x70, - 0x13, 0xcc, 0x59, 0xc4, 0xa4, 0x16, 0xae, 0xb7, 0x7a, 0xd5, 0xb0, 0x52, 0x76, 0x29, 0xbb, 0x32, - 0x63, 0x2c, 0x84, 0xdd, 0xca, 0xdc, 0xd6, 0xb0, 0x13, 0x8d, 0xc6, 0x57, 0xbf, 0x4d, 0x80, 0xd9, - 0xa1, 0x8e, 0xde, 0x83, 0x69, 0x31, 0x6e, 0x0b, 0x73, 0x2c, 0xdb, 0x29, 0xd4, 0x1e, 0x68, 0x83, - 0x2b, 0xef, 0x4f, 0x4d, 0xf3, 0x9b, 0xb6, 0xbc, 0x7f, 0x4d, 0x44, 0x6b, 0x9d, 0x55, 0x6d, 0xbf, - 0xfe, 0x91, 0x98, 0x7c, 0x8f, 0x70, 0x6c, 0xc0, 0xb8, 0x0b, 0x30, 0xb0, 0xa1, 0x3e, 0x2b, 0x7c, - 0x0b, 0x72, 0xcc, 0x27, 0xa6, 0xec, 0xb8, 0x50, 0x5b, 0xd7, 0xc6, 0x12, 0x94, 0x96, 0x2c, 0xf3, - 0xc0, 0x27, 0xa6, 0xf1, 0x4f, 0x9c, 0x26, 0x27, 0x4e, 0x48, 0x92, 0x42, 0x13, 0xe4, 0x19, 0xc7, - 0xbc, 0x2d, 0x66, 0x21, 0xe8, 0x9f, 0x5c, 0x8f, 0x5e, 0x52, 0x18, 0xb3, 0x71, 0x82, 0x7c, 0x74, - 0x46, 0x31, 0x75, 0xf5, 0x6b, 0x16, 0x2c, 0x26, 0x01, 0x9b, 0xd4, 0xb3, 0x1c, 0x2e, 0xe6, 0xf7, - 0x0c, 0xe4, 0xf8, 0xb1, 0x4f, 0x62, 0x29, 0xdc, 0xeb, 0x95, 0x78, 0x78, 0xec, 0x93, 0x8b, 0x6e, - 0xe5, 0xe6, 0x15, 0x30, 0xe1, 0x46, 0x12, 0x08, 0xd7, 0xfb, 0x1d, 0x44, 0x92, 0xb8, 0x95, 0x2c, - 0xe2, 0xa2, 0x5b, 0x29, 0xf6, 0x61, 0xc9, 0xba, 0xe0, 0x0b, 0x00, 0x69, 0x5d, 0x76, 0x68, 0x3d, - 0x8f, 0x14, 0x2c, 0x94, 0x25, 0x06, 0x91, 0x35, 0xca, 0x31, 0x0d, 0xdc, 0x1f, 0x89, 0x40, 0x29, - 0x28, 0xd8, 0x01, 0xb0, 0x85, 0x19, 0x3f, 0x0c, 0xb0, 0xc7, 0xa2, 0x12, 0x1d, 0x97, 0x94, 0x72, - 0x72, 0xa8, 0x77, 0xc7, 0x53, 0x84, 0x40, 0x0c, 0xf2, 0xee, 0x8e, 0xb0, 0xa1, 0x94, 0x0c, 0xf0, - 0x36, 0xc8, 0x07, 0x04, 0x33, 0xea, 0x95, 0x26, 0x65, 0xfb, 0xfd, 0x3b, 0x40, 0xd2, 0x8a, 0x62, - 0x2f, 0xbc, 0x03, 0xa6, 0x5c, 0xc2, 0x18, 0xb6, 0x49, 0x29, 0x2f, 0x03, 0x8b, 0x71, 0xe0, 0xd4, - 0x5e, 0x64, 0x46, 0x3d, 0x7f, 0xf5, 0xbb, 0x02, 0x60, 0x72, 0xee, 0xbb, 0x0e, 0xe3, 0xf0, 0xdd, - 0x88, 0xd2, 0xb5, 0xf1, 0xfa, 0x12, 0x68, 0xa9, 0xf3, 0xff, 0xe2, 0x94, 0xd3, 0x3d, 0xcb, 0x25, - 0x95, 0x1f, 0x81, 0x49, 0x87, 0x13, 0x57, 0xdc, 0x62, 0x76, 0xa5, 0x50, 0x5b, 0xbb, 0x96, 0x0e, - 0x8d, 0x7f, 0xe3, 0x0c, 0x93, 0x3b, 0x82, 0x0b, 0x45, 0x94, 0xd5, 0xf9, 0xe1, 0x7e, 0xc4, 0x03, - 0xa8, 0xfe, 0x9c, 0x00, 0xf3, 0x69, 0x32, 0x86, 0x9f, 0x40, 0x91, 0x25, 0xec, 0xac, 0xa4, 0xc8, - 0xa2, 0xc6, 0x7e, 0x1c, 0x29, 0xab, 0x6f, 0xb0, 0xaa, 0x92, 0x76, 0x86, 0x86, 0x93, 0xc1, 0x7d, - 0xb0, 0x60, 0x52, 0xd7, 0xa5, 0xde, 0x76, 0xea, 0xce, 0xbb, 0x11, 0x76, 0x2b, 0x0b, 0x9b, 0x69, - 0x01, 0x28, 0x1d, 0x07, 0x03, 0x00, 0xcc, 0xde, 0x13, 0x88, 0x96, 0x5e, 0xa1, 0xf6, 0xf4, 0x5a, - 0x03, 0xee, 0xbf, 0xa4, 0xc1, 0xce, 0xea, 0x9b, 0x18, 0xba, 0x94, 0xc5, 0x78, 0x79, 0x72, 0xae, - 0x66, 0x4e, 0xcf, 0xd5, 0xcc, 0xd9, 0xb9, 0x9a, 0xf9, 0x1c, 0xaa, 0xca, 0x49, 0xa8, 0x2a, 0xa7, - 0xa1, 0xaa, 0x9c, 0x85, 0xaa, 0xf2, 0x2b, 0x54, 0x95, 0x2f, 0xbf, 0xd5, 0xcc, 0xd1, 0xf2, 0x58, - 0x1f, 0xd5, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa0, 0xd0, 0x65, 0xbc, 0x95, 0x07, 0x00, 0x00, + // 790 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x41, 0x4f, 0xdb, 0x48, + 0x14, 0x8e, 0x49, 0x08, 0x30, 0xd9, 0x4d, 0x96, 0x59, 0x10, 0xd9, 0xac, 0xe4, 0xb0, 0x91, 0x58, + 0xb1, 0xbb, 0x5a, 0x7b, 0x89, 0x96, 0xaa, 0xb4, 0x52, 0x2b, 0x0c, 0xa8, 0xa2, 0x85, 0x52, 0x4d, + 0x50, 0x0f, 0xb4, 0x87, 0x4e, 0xec, 0xa9, 0xe3, 0x26, 0xf6, 0x58, 0x9e, 0x49, 0x24, 0x2e, 0x55, + 0x7f, 0x42, 0xfb, 0x3f, 0x7a, 0xec, 0x8f, 0xe0, 0x54, 0x71, 0x44, 0xaa, 0x14, 0x15, 0xf7, 0x5f, + 0x70, 0xaa, 0x66, 0xec, 0x38, 0x38, 0x09, 0x6a, 0xc4, 0x21, 0x52, 0xe6, 0xbd, 0xf7, 0x7d, 0xef, + 0xcd, 0x37, 0xdf, 0x8c, 0xc1, 0xd3, 0xf6, 0x5d, 0xa6, 0x39, 0x54, 0x6f, 0x77, 0x9b, 0x24, 0xf0, + 0x08, 0x27, 0x4c, 0xef, 0x11, 0xcf, 0xa2, 0x81, 0x1e, 0x27, 0xb0, 0xef, 0x88, 0x1f, 0x23, 0x41, + 0x8f, 0x04, 0x8e, 0xc7, 0x49, 0xe0, 0xe1, 0x8e, 0xde, 0xdb, 0xc0, 0x1d, 0xbf, 0x85, 0x37, 0x74, + 0x9b, 0x78, 0x24, 0xc0, 0x9c, 0x58, 0x9a, 0x1f, 0x50, 0x4e, 0xe1, 0x5a, 0x04, 0xd3, 0xb0, 0xef, + 0x68, 0x63, 0x30, 0x6d, 0x00, 0xab, 0xfc, 0x6b, 0x3b, 0xbc, 0xd5, 0x6d, 0x6a, 0x26, 0x75, 0x75, + 0x9b, 0xda, 0x54, 0x97, 0xe8, 0x66, 0xf7, 0xb5, 0x5c, 0xc9, 0x85, 0xfc, 0x17, 0xb1, 0x56, 0xfe, + 0x1f, 0x0e, 0xe3, 0x62, 0xb3, 0xe5, 0x78, 0x24, 0x38, 0xd5, 0xfd, 0xb6, 0x2d, 0x27, 0xd3, 0x5d, + 0xc2, 0xb1, 0xde, 0x1b, 0x9b, 0xa5, 0xa2, 0xdf, 0x84, 0x0a, 0xba, 0x1e, 0x77, 0x5c, 0x32, 0x06, + 0xb8, 0xf3, 0x23, 0x00, 0x33, 0x5b, 0xc4, 0xc5, 0xa3, 0xb8, 0xda, 0x87, 0x19, 0xb0, 0xd4, 0x90, + 0x3b, 0x6d, 0x70, 0x1a, 0x60, 0x9b, 0x3c, 0x27, 0x01, 0x73, 0xa8, 0x07, 0x37, 0x41, 0x01, 0xfb, + 0x4e, 0x94, 0xda, 0xdf, 0x2d, 0x2b, 0xab, 0xca, 0xfa, 0x82, 0xf1, 0xeb, 0x59, 0xbf, 0x9a, 0x09, + 0xfb, 0xd5, 0xc2, 0xf6, 0xb3, 0xfd, 0x41, 0x0a, 0x5d, 0xaf, 0x83, 0xdb, 0xa0, 0x44, 0x3c, 0x93, + 0x5a, 0x8e, 0x67, 0xc7, 0x4c, 0xe5, 0x19, 0x09, 0x5d, 0x89, 0xa1, 0xa5, 0xbd, 0x74, 0x1a, 0x8d, + 0xd6, 0xc3, 0x1d, 0xb0, 0x68, 0x11, 0x93, 0x5a, 0xb8, 0xd9, 0x19, 0x4c, 0xc3, 0xca, 0xd9, 0xd5, + 0xec, 0xfa, 0x82, 0xb1, 0x1c, 0xf6, 0xab, 0x8b, 0xbb, 0xa3, 0x49, 0x34, 0x5e, 0x0f, 0xef, 0x81, + 0xa2, 0x3c, 0x40, 0x2b, 0x61, 0xc8, 0x49, 0x06, 0x18, 0xf6, 0xab, 0xc5, 0x46, 0x2a, 0x83, 0x46, + 0x2a, 0x6b, 0x9f, 0x66, 0x40, 0x71, 0x44, 0x8d, 0x57, 0x60, 0x5e, 0x1c, 0x95, 0x85, 0x39, 0x96, + 0x52, 0x14, 0xea, 0xff, 0x69, 0x43, 0xbb, 0x24, 0x8a, 0x6b, 0x7e, 0xdb, 0x96, 0xde, 0xd1, 0x44, + 0xb5, 0xd6, 0xdb, 0xd0, 0x8e, 0x9a, 0x6f, 0x88, 0xc9, 0x0f, 0x09, 0xc7, 0x06, 0x8c, 0x15, 0x00, + 0xc3, 0x18, 0x4a, 0x58, 0xe1, 0x0b, 0x90, 0x63, 0x3e, 0x31, 0xa5, 0x5a, 0x85, 0xfa, 0x96, 0x36, + 0x95, 0x19, 0xb5, 0xf4, 0x98, 0x0d, 0x9f, 0x98, 0xc6, 0x4f, 0x71, 0x9b, 0x9c, 0x58, 0x21, 0x49, + 0x0a, 0x4d, 0x90, 0x67, 0x1c, 0xf3, 0xae, 0xd0, 0x51, 0xd0, 0xdf, 0xbf, 0x1d, 0xbd, 0xa4, 0x30, + 0x8a, 0x71, 0x83, 0x7c, 0xb4, 0x46, 0x31, 0x75, 0xed, 0x63, 0x16, 0xac, 0xa4, 0x01, 0x3b, 0xd4, + 0xb3, 0x1c, 0x2e, 0xf4, 0x7b, 0x08, 0x72, 0xfc, 0xd4, 0x27, 0xb1, 0x8d, 0xfe, 0x19, 0x8c, 0x78, + 0x7c, 0xea, 0x93, 0xab, 0x7e, 0xf5, 0xf7, 0x1b, 0x60, 0x22, 0x8d, 0x24, 0x10, 0x6e, 0x25, 0x3b, + 0x88, 0xec, 0xf4, 0x47, 0x7a, 0x88, 0xab, 0x7e, 0xb5, 0x94, 0xc0, 0xd2, 0x73, 0xc1, 0xc7, 0x00, + 0xd2, 0x66, 0x74, 0xc4, 0x8f, 0x22, 0xf7, 0x0b, 0x57, 0x0a, 0x21, 0xb2, 0x46, 0x25, 0xa6, 0x81, + 0x47, 0x63, 0x15, 0x68, 0x02, 0x0a, 0xf6, 0x00, 0xec, 0x60, 0xc6, 0x8f, 0x03, 0xec, 0xb1, 0x68, + 0x44, 0xc7, 0x25, 0xe5, 0x9c, 0x14, 0xf5, 0xef, 0xe9, 0x1c, 0x21, 0x10, 0xc3, 0xbe, 0x07, 0x63, + 0x6c, 0x68, 0x42, 0x07, 0xf8, 0x27, 0xc8, 0x07, 0x04, 0x33, 0xea, 0x95, 0x67, 0xe5, 0xf6, 0x93, + 0x33, 0x40, 0x32, 0x8a, 0xe2, 0x2c, 0xfc, 0x0b, 0xcc, 0xb9, 0x84, 0x31, 0x6c, 0x93, 0x72, 0x5e, + 0x16, 0x96, 0xe2, 0xc2, 0xb9, 0xc3, 0x28, 0x8c, 0x06, 0xf9, 0xda, 0x67, 0x05, 0xc0, 0xb4, 0xee, + 0x07, 0x0e, 0xe3, 0xf0, 0xe5, 0x98, 0xd3, 0xb5, 0xe9, 0xf6, 0x25, 0xd0, 0xd2, 0xe7, 0xbf, 0xc4, + 0x2d, 0xe7, 0x07, 0x91, 0x6b, 0x2e, 0x3f, 0x01, 0xb3, 0x0e, 0x27, 0xae, 0x38, 0xc5, 0xec, 0x7a, + 0xa1, 0xbe, 0x79, 0x2b, 0x1f, 0x1a, 0x3f, 0xc7, 0x1d, 0x66, 0xf7, 0x05, 0x17, 0x8a, 0x28, 0x6b, + 0x4b, 0xa3, 0xfb, 0x11, 0x17, 0xa0, 0xf6, 0x45, 0x3c, 0x70, 0x13, 0x6c, 0x0c, 0xdf, 0x82, 0x12, + 0x4b, 0xc5, 0x59, 0x59, 0x91, 0x43, 0x4d, 0x7d, 0x39, 0x26, 0x3c, 0x9b, 0xc3, 0x67, 0x2e, 0x1d, + 0x67, 0x68, 0xb4, 0x19, 0x3c, 0x02, 0xcb, 0x26, 0x75, 0x5d, 0xea, 0xed, 0x4d, 0x7c, 0x2f, 0x7f, + 0x0b, 0xfb, 0xd5, 0xe5, 0x9d, 0x49, 0x05, 0x68, 0x32, 0x0e, 0x06, 0x00, 0x98, 0x83, 0x2b, 0x10, + 0x3d, 0x98, 0x85, 0xfa, 0x83, 0x5b, 0x09, 0x9c, 0xdc, 0xa4, 0xe1, 0x9b, 0x95, 0x84, 0x18, 0xba, + 0xd6, 0xc5, 0x78, 0x72, 0x76, 0xa9, 0x66, 0xce, 0x2f, 0xd5, 0xcc, 0xc5, 0xa5, 0x9a, 0x79, 0x17, + 0xaa, 0xca, 0x59, 0xa8, 0x2a, 0xe7, 0xa1, 0xaa, 0x5c, 0x84, 0xaa, 0xf2, 0x35, 0x54, 0x95, 0xf7, + 0xdf, 0xd4, 0xcc, 0xc9, 0xda, 0x54, 0x1f, 0xe4, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x3a, + 0x2e, 0x07, 0xd1, 0x07, 0x00, 0x00, } func (m *ServerStorageVersion) Marshal() (dAtA []byte, err error) { @@ -296,6 +298,15 @@ func (m *ServerStorageVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ServedVersions) > 0 { + for iNdEx := len(m.ServedVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ServedVersions[iNdEx]) + copy(dAtA[i:], m.ServedVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServedVersions[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.DecodableVersions) > 0 { for iNdEx := len(m.DecodableVersions) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DecodableVersions[iNdEx]) @@ -582,6 +593,12 @@ func (m *ServerStorageVersion) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.ServedVersions) > 0 { + for _, s := range m.ServedVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -685,6 +702,7 @@ func (this *ServerStorageVersion) String() string { `APIServerID:` + fmt.Sprintf("%v", this.APIServerID) + `,`, `EncodingVersion:` + fmt.Sprintf("%v", this.EncodingVersion) + `,`, `DecodableVersions:` + fmt.Sprintf("%v", this.DecodableVersions) + `,`, + `ServedVersions:` + fmt.Sprintf("%v", this.ServedVersions) + `,`, `}`, }, "") return s @@ -896,6 +914,38 @@ func (m *ServerStorageVersion) Unmarshal(dAtA []byte) error { } m.DecodableVersions = append(m.DecodableVersions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServedVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServedVersions = append(m.ServedVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto index 63c45d54d..6e6bab521 100644 --- a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto +++ b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto @@ -42,6 +42,11 @@ message ServerStorageVersion { // The encodingVersion must be included in the decodableVersions. // +listType=set repeated string decodableVersions = 3; + + // The API server can serve these versions. + // DecodableVersions must include all ServedVersions. + // +listType=set + repeated string servedVersions = 4; } // Storage version of a specific resource. diff --git a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go index a0437b507..0ffcf95f0 100644 --- a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go +++ b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go @@ -77,6 +77,11 @@ type ServerStorageVersion struct { // The encodingVersion must be included in the decodableVersions. // +listType=set DecodableVersions []string `json:"decodableVersions,omitempty" protobuf:"bytes,3,opt,name=decodableVersions"` + + // The API server can serve these versions. + // DecodableVersions must include all ServedVersions. + // +listType=set + ServedVersions []string `json:"servedVersions,omitempty" protobuf:"bytes,4,opt,name=servedVersions"` } type StorageVersionConditionType string diff --git a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go index 3b75fa65b..6fd1c3ebe 100644 --- a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go @@ -32,6 +32,7 @@ var map_ServerStorageVersion = map[string]string{ "apiServerID": "The ID of the reporting API server.", "encodingVersion": "The API server encodes the object to this version when persisting it in the backend (e.g., etcd).", "decodableVersions": "The API server can decode objects encoded in these versions. The encodingVersion must be included in the decodableVersions.", + "servedVersions": "The API server can serve these versions. DecodableVersions must include all ServedVersions.", } func (ServerStorageVersion) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/zz_generated.deepcopy.go index 44dffa751..638d80140 100644 --- a/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/apiserverinternal/v1alpha1/zz_generated.deepcopy.go @@ -33,6 +33,11 @@ func (in *ServerStorageVersion) DeepCopyInto(out *ServerStorageVersion) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ServedVersions != nil { + in, out := &in.ServedVersions, &out.ServedVersions + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/tools/vendor/k8s.io/api/apps/v1/types.go b/tools/vendor/k8s.io/api/apps/v1/types.go index 15dc3150a..644d368fe 100644 --- a/tools/vendor/k8s.io/api/apps/v1/types.go +++ b/tools/vendor/k8s.io/api/apps/v1/types.go @@ -17,7 +17,7 @@ limitations under the License. package v1 import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" @@ -29,6 +29,7 @@ const ( DeprecatedRollbackTo = "deprecated.deployment.rollback.to" DeprecatedTemplateGeneration = "deprecated.daemonset.template.generation" StatefulSetPodNameLabel = "statefulset.kubernetes.io/pod-name" + PodIndexLabel = "apps.kubernetes.io/pod-index" ) // +genclient diff --git a/tools/vendor/k8s.io/api/authentication/v1/generated.pb.go b/tools/vendor/k8s.io/api/authentication/v1/generated.pb.go index efbecf02c..304bbd074 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/generated.pb.go +++ b/tools/vendor/k8s.io/api/authentication/v1/generated.pb.go @@ -102,10 +102,66 @@ func (m *ExtraValue) XXX_DiscardUnknown() { var xxx_messageInfo_ExtraValue proto.InternalMessageInfo +func (m *SelfSubjectReview) Reset() { *m = SelfSubjectReview{} } +func (*SelfSubjectReview) ProtoMessage() {} +func (*SelfSubjectReview) Descriptor() ([]byte, []int) { + return fileDescriptor_2953ea822e7ffe1e, []int{2} +} +func (m *SelfSubjectReview) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SelfSubjectReview) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SelfSubjectReview) XXX_Merge(src proto.Message) { + xxx_messageInfo_SelfSubjectReview.Merge(m, src) +} +func (m *SelfSubjectReview) XXX_Size() int { + return m.Size() +} +func (m *SelfSubjectReview) XXX_DiscardUnknown() { + xxx_messageInfo_SelfSubjectReview.DiscardUnknown(m) +} + +var xxx_messageInfo_SelfSubjectReview proto.InternalMessageInfo + +func (m *SelfSubjectReviewStatus) Reset() { *m = SelfSubjectReviewStatus{} } +func (*SelfSubjectReviewStatus) ProtoMessage() {} +func (*SelfSubjectReviewStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_2953ea822e7ffe1e, []int{3} +} +func (m *SelfSubjectReviewStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SelfSubjectReviewStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SelfSubjectReviewStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_SelfSubjectReviewStatus.Merge(m, src) +} +func (m *SelfSubjectReviewStatus) XXX_Size() int { + return m.Size() +} +func (m *SelfSubjectReviewStatus) XXX_DiscardUnknown() { + xxx_messageInfo_SelfSubjectReviewStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_SelfSubjectReviewStatus proto.InternalMessageInfo + func (m *TokenRequest) Reset() { *m = TokenRequest{} } func (*TokenRequest) ProtoMessage() {} func (*TokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{2} + return fileDescriptor_2953ea822e7ffe1e, []int{4} } func (m *TokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -133,7 +189,7 @@ var xxx_messageInfo_TokenRequest proto.InternalMessageInfo func (m *TokenRequestSpec) Reset() { *m = TokenRequestSpec{} } func (*TokenRequestSpec) ProtoMessage() {} func (*TokenRequestSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{3} + return fileDescriptor_2953ea822e7ffe1e, []int{5} } func (m *TokenRequestSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -161,7 +217,7 @@ var xxx_messageInfo_TokenRequestSpec proto.InternalMessageInfo func (m *TokenRequestStatus) Reset() { *m = TokenRequestStatus{} } func (*TokenRequestStatus) ProtoMessage() {} func (*TokenRequestStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{4} + return fileDescriptor_2953ea822e7ffe1e, []int{6} } func (m *TokenRequestStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -189,7 +245,7 @@ var xxx_messageInfo_TokenRequestStatus proto.InternalMessageInfo func (m *TokenReview) Reset() { *m = TokenReview{} } func (*TokenReview) ProtoMessage() {} func (*TokenReview) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{5} + return fileDescriptor_2953ea822e7ffe1e, []int{7} } func (m *TokenReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -217,7 +273,7 @@ var xxx_messageInfo_TokenReview proto.InternalMessageInfo func (m *TokenReviewSpec) Reset() { *m = TokenReviewSpec{} } func (*TokenReviewSpec) ProtoMessage() {} func (*TokenReviewSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{6} + return fileDescriptor_2953ea822e7ffe1e, []int{8} } func (m *TokenReviewSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -245,7 +301,7 @@ var xxx_messageInfo_TokenReviewSpec proto.InternalMessageInfo func (m *TokenReviewStatus) Reset() { *m = TokenReviewStatus{} } func (*TokenReviewStatus) ProtoMessage() {} func (*TokenReviewStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{7} + return fileDescriptor_2953ea822e7ffe1e, []int{9} } func (m *TokenReviewStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -273,7 +329,7 @@ var xxx_messageInfo_TokenReviewStatus proto.InternalMessageInfo func (m *UserInfo) Reset() { *m = UserInfo{} } func (*UserInfo) ProtoMessage() {} func (*UserInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2953ea822e7ffe1e, []int{8} + return fileDescriptor_2953ea822e7ffe1e, []int{10} } func (m *UserInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,6 +357,8 @@ var xxx_messageInfo_UserInfo proto.InternalMessageInfo func init() { proto.RegisterType((*BoundObjectReference)(nil), "k8s.io.api.authentication.v1.BoundObjectReference") proto.RegisterType((*ExtraValue)(nil), "k8s.io.api.authentication.v1.ExtraValue") + proto.RegisterType((*SelfSubjectReview)(nil), "k8s.io.api.authentication.v1.SelfSubjectReview") + proto.RegisterType((*SelfSubjectReviewStatus)(nil), "k8s.io.api.authentication.v1.SelfSubjectReviewStatus") proto.RegisterType((*TokenRequest)(nil), "k8s.io.api.authentication.v1.TokenRequest") proto.RegisterType((*TokenRequestSpec)(nil), "k8s.io.api.authentication.v1.TokenRequestSpec") proto.RegisterType((*TokenRequestStatus)(nil), "k8s.io.api.authentication.v1.TokenRequestStatus") @@ -316,64 +374,67 @@ func init() { } var fileDescriptor_2953ea822e7ffe1e = []byte{ - // 907 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0xf3, 0xa3, 0x4a, 0x26, 0xdb, 0xd2, 0xce, 0xb2, 0x52, 0x54, 0x96, 0xa4, 0x78, 0x25, - 0x54, 0x01, 0x6b, 0x6f, 0x23, 0x04, 0xab, 0x45, 0x42, 0xaa, 0x69, 0x04, 0x11, 0x82, 0x5d, 0xcd, - 0x6e, 0x0b, 0xe2, 0xc4, 0xc4, 0x7e, 0x4d, 0x87, 0xe0, 0xb1, 0xb1, 0xc7, 0x61, 0x73, 0xdb, 0x3f, - 0x81, 0x23, 0x48, 0x1c, 0xf8, 0x23, 0x90, 0xf8, 0x17, 0x7a, 0x5c, 0x71, 0xea, 0x01, 0x45, 0xd4, - 0x5c, 0x39, 0x72, 0xe2, 0x84, 0x66, 0x3c, 0xad, 0xe3, 0xa4, 0x4d, 0x73, 0xe2, 0x96, 0x79, 0xef, - 0x7b, 0xdf, 0xbc, 0xf7, 0xcd, 0xe7, 0x99, 0xa0, 0xde, 0xe8, 0x61, 0x6c, 0xb1, 0xc0, 0x1e, 0x25, - 0x03, 0x88, 0x38, 0x08, 0x88, 0xed, 0x31, 0x70, 0x2f, 0x88, 0x6c, 0x9d, 0xa0, 0x21, 0xb3, 0x69, - 0x22, 0x4e, 0x80, 0x0b, 0xe6, 0x52, 0xc1, 0x02, 0x6e, 0x8f, 0xf7, 0xec, 0x21, 0x70, 0x88, 0xa8, - 0x00, 0xcf, 0x0a, 0xa3, 0x40, 0x04, 0xf8, 0x6e, 0x86, 0xb6, 0x68, 0xc8, 0xac, 0x22, 0xda, 0x1a, - 0xef, 0x6d, 0xdf, 0x1f, 0x32, 0x71, 0x92, 0x0c, 0x2c, 0x37, 0xf0, 0xed, 0x61, 0x30, 0x0c, 0x6c, - 0x55, 0x34, 0x48, 0x8e, 0xd5, 0x4a, 0x2d, 0xd4, 0xaf, 0x8c, 0x6c, 0xfb, 0xdd, 0x7c, 0x6b, 0x9f, - 0xba, 0x27, 0x8c, 0x43, 0x34, 0xb1, 0xc3, 0xd1, 0x50, 0x06, 0x62, 0xdb, 0x07, 0x41, 0xaf, 0x68, - 0x61, 0xdb, 0xbe, 0xae, 0x2a, 0x4a, 0xb8, 0x60, 0x3e, 0x2c, 0x14, 0xbc, 0x77, 0x53, 0x41, 0xec, - 0x9e, 0x80, 0x4f, 0xe7, 0xeb, 0xcc, 0xdf, 0x0d, 0xf4, 0xaa, 0x13, 0x24, 0xdc, 0x7b, 0x3c, 0xf8, - 0x06, 0x5c, 0x41, 0xe0, 0x18, 0x22, 0xe0, 0x2e, 0xe0, 0x1d, 0x54, 0x1d, 0x31, 0xee, 0xb5, 0x8c, - 0x1d, 0x63, 0xb7, 0xe1, 0xdc, 0x3a, 0x9d, 0x76, 0x4a, 0xe9, 0xb4, 0x53, 0xfd, 0x94, 0x71, 0x8f, - 0xa8, 0x0c, 0xee, 0x22, 0x44, 0x43, 0x76, 0x04, 0x51, 0xcc, 0x02, 0xde, 0x2a, 0x2b, 0x1c, 0xd6, - 0x38, 0xb4, 0xff, 0xa4, 0xaf, 0x33, 0x64, 0x06, 0x25, 0x59, 0x39, 0xf5, 0xa1, 0x55, 0x29, 0xb2, - 0x7e, 0x4e, 0x7d, 0x20, 0x2a, 0x83, 0x1d, 0x54, 0x49, 0xfa, 0x07, 0xad, 0xaa, 0x02, 0x3c, 0xd0, - 0x80, 0xca, 0x61, 0xff, 0xe0, 0xdf, 0x69, 0xe7, 0x8d, 0xeb, 0x86, 0x14, 0x93, 0x10, 0x62, 0xeb, - 0xb0, 0x7f, 0x40, 0x64, 0xb1, 0xf9, 0x3e, 0x42, 0xbd, 0xe7, 0x22, 0xa2, 0x47, 0xf4, 0xdb, 0x04, - 0x70, 0x07, 0xd5, 0x98, 0x00, 0x3f, 0x6e, 0x19, 0x3b, 0x95, 0xdd, 0x86, 0xd3, 0x48, 0xa7, 0x9d, - 0x5a, 0x5f, 0x06, 0x48, 0x16, 0x7f, 0x54, 0xff, 0xf1, 0x97, 0x4e, 0xe9, 0xc5, 0x1f, 0x3b, 0x25, - 0xf3, 0xe7, 0x32, 0xba, 0xf5, 0x2c, 0x18, 0x01, 0x27, 0xf0, 0x5d, 0x02, 0xb1, 0xc0, 0x5f, 0xa3, - 0xba, 0x3c, 0x22, 0x8f, 0x0a, 0xaa, 0x94, 0x68, 0x76, 0x1f, 0x58, 0xb9, 0x3b, 0x2e, 0x9b, 0xb0, - 0xc2, 0xd1, 0x50, 0x06, 0x62, 0x4b, 0xa2, 0xad, 0xf1, 0x9e, 0x95, 0xc9, 0xf9, 0x19, 0x08, 0x9a, - 0x6b, 0x92, 0xc7, 0xc8, 0x25, 0x2b, 0x7e, 0x82, 0xaa, 0x71, 0x08, 0xae, 0xd2, 0xaf, 0xd9, 0xb5, - 0xac, 0x65, 0xde, 0xb3, 0x66, 0x7b, 0x7b, 0x1a, 0x82, 0x9b, 0x2b, 0x28, 0x57, 0x44, 0x31, 0xe1, - 0x2f, 0xd1, 0x5a, 0x2c, 0xa8, 0x48, 0x62, 0xa5, 0x72, 0xb1, 0xe3, 0x9b, 0x38, 0x55, 0x9d, 0xb3, - 0xa1, 0x59, 0xd7, 0xb2, 0x35, 0xd1, 0x7c, 0xe6, 0x3f, 0x06, 0xda, 0x9c, 0x6f, 0x01, 0xbf, 0x8d, - 0x1a, 0x34, 0xf1, 0x98, 0x34, 0xcd, 0x85, 0xc4, 0xeb, 0xe9, 0xb4, 0xd3, 0xd8, 0xbf, 0x08, 0x92, - 0x3c, 0x8f, 0x3f, 0x42, 0x5b, 0xf0, 0x3c, 0x64, 0x91, 0xda, 0xfd, 0x29, 0xb8, 0x01, 0xf7, 0x62, - 0x75, 0xd6, 0x15, 0xe7, 0x4e, 0x3a, 0xed, 0x6c, 0xf5, 0xe6, 0x93, 0x64, 0x11, 0x8f, 0x39, 0xda, - 0x18, 0x14, 0x2c, 0xab, 0x07, 0xed, 0x2e, 0x1f, 0xf4, 0x2a, 0x9b, 0x3b, 0x38, 0x9d, 0x76, 0x36, - 0x8a, 0x19, 0x32, 0xc7, 0x6e, 0xfe, 0x6a, 0x20, 0xbc, 0xa8, 0x12, 0xbe, 0x87, 0x6a, 0x42, 0x46, - 0xf5, 0x27, 0xb2, 0xae, 0x45, 0xab, 0x65, 0xd0, 0x2c, 0x87, 0x27, 0xe8, 0x76, 0x3e, 0xc0, 0x33, - 0xe6, 0x43, 0x2c, 0xa8, 0x1f, 0xea, 0xd3, 0x7e, 0x6b, 0x35, 0x2f, 0xc9, 0x32, 0xe7, 0x35, 0x4d, - 0x7f, 0xbb, 0xb7, 0x48, 0x47, 0xae, 0xda, 0xc3, 0xfc, 0xa9, 0x8c, 0x9a, 0xba, 0xed, 0x31, 0x83, - 0xef, 0xff, 0x07, 0x2f, 0x3f, 0x2e, 0x78, 0xf9, 0xfe, 0x4a, 0xbe, 0x93, 0xad, 0x5d, 0x6b, 0xe5, - 0x2f, 0xe6, 0xac, 0x6c, 0xaf, 0x4e, 0xb9, 0xdc, 0xc9, 0x2e, 0x7a, 0x65, 0x6e, 0xff, 0xd5, 0x8e, - 0xb3, 0x60, 0xf6, 0xf2, 0x72, 0xb3, 0x9b, 0x7f, 0x1b, 0x68, 0x6b, 0xa1, 0x25, 0xfc, 0x01, 0x5a, - 0x9f, 0xe9, 0x1c, 0xb2, 0x1b, 0xb6, 0xee, 0xdc, 0xd1, 0xfb, 0xad, 0xef, 0xcf, 0x26, 0x49, 0x11, - 0x8b, 0x3f, 0x41, 0xd5, 0x24, 0x86, 0x48, 0x2b, 0xfc, 0xe6, 0x72, 0x39, 0x0e, 0x63, 0x88, 0xfa, - 0xfc, 0x38, 0xc8, 0xa5, 0x95, 0x11, 0xa2, 0x18, 0x8a, 0x93, 0x54, 0x6f, 0xf8, 0x6c, 0xef, 0xa1, - 0x1a, 0x44, 0x51, 0x10, 0xe9, 0x7b, 0xfb, 0x52, 0x9b, 0x9e, 0x0c, 0x92, 0x2c, 0x67, 0xfe, 0x56, - 0x46, 0xf5, 0x8b, 0x2d, 0xf1, 0x3b, 0xa8, 0x2e, 0xb7, 0x51, 0x97, 0x7d, 0x26, 0xe8, 0xa6, 0x2e, - 0x52, 0x18, 0x19, 0x27, 0x97, 0x08, 0xfc, 0x3a, 0xaa, 0x24, 0xcc, 0xd3, 0x6f, 0x48, 0x73, 0xe6, - 0xd2, 0x27, 0x32, 0x8e, 0x4d, 0xb4, 0x36, 0x8c, 0x82, 0x24, 0x94, 0x36, 0x90, 0x8d, 0x22, 0x79, - 0xa2, 0x1f, 0xab, 0x08, 0xd1, 0x19, 0x7c, 0x84, 0x6a, 0x20, 0xef, 0x7c, 0x35, 0x4b, 0xb3, 0xbb, - 0xb7, 0x9a, 0x34, 0x96, 0x7a, 0x27, 0x7a, 0x5c, 0x44, 0x93, 0x99, 0xa9, 0x64, 0x8c, 0x64, 0x74, - 0xdb, 0x03, 0xfd, 0x96, 0x28, 0x0c, 0xde, 0x44, 0x95, 0x11, 0x4c, 0xb2, 0x89, 0x88, 0xfc, 0x89, - 0x3f, 0x44, 0xb5, 0xb1, 0x7c, 0x66, 0xf4, 0x91, 0xec, 0x2e, 0xdf, 0x37, 0x7f, 0x96, 0x48, 0x56, - 0xf6, 0xa8, 0xfc, 0xd0, 0x70, 0x9c, 0xd3, 0xf3, 0x76, 0xe9, 0xe5, 0x79, 0xbb, 0x74, 0x76, 0xde, - 0x2e, 0xbd, 0x48, 0xdb, 0xc6, 0x69, 0xda, 0x36, 0x5e, 0xa6, 0x6d, 0xe3, 0x2c, 0x6d, 0x1b, 0x7f, - 0xa6, 0x6d, 0xe3, 0x87, 0xbf, 0xda, 0xa5, 0xaf, 0xee, 0x2e, 0xfb, 0x13, 0xf3, 0x5f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x12, 0xb8, 0x31, 0x91, 0xfc, 0x08, 0x00, 0x00, + // 958 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4b, 0x6f, 0x23, 0x45, + 0x10, 0xf6, 0xf8, 0x11, 0xd9, 0xe5, 0x4d, 0x48, 0x7a, 0x59, 0x61, 0x85, 0xc5, 0x0e, 0xb3, 0x12, + 0x8a, 0x80, 0x9d, 0xd9, 0x58, 0x3c, 0x56, 0x8b, 0x84, 0x94, 0x21, 0x16, 0x58, 0x08, 0x76, 0xd5, + 0x4e, 0x02, 0x42, 0x42, 0xa2, 0x3d, 0xae, 0x38, 0x83, 0x77, 0x1e, 0xcc, 0xf4, 0x98, 0xf5, 0x6d, + 0x7f, 0x02, 0x47, 0x90, 0x38, 0xf0, 0x23, 0x90, 0xf8, 0x0b, 0x39, 0xae, 0x10, 0x87, 0x3d, 0x20, + 0x8b, 0x0c, 0x57, 0x8e, 0x9c, 0x38, 0xa1, 0xee, 0xe9, 0xf8, 0x99, 0x4c, 0x7c, 0xda, 0x9b, 0xa7, + 0x1e, 0x5f, 0x55, 0x7d, 0x55, 0x5d, 0x65, 0x68, 0x0d, 0xee, 0x47, 0x86, 0xe3, 0x9b, 0x83, 0xb8, + 0x8b, 0xa1, 0x87, 0x1c, 0x23, 0x73, 0x88, 0x5e, 0xcf, 0x0f, 0x4d, 0xa5, 0x60, 0x81, 0x63, 0xb2, + 0x98, 0x9f, 0xa2, 0xc7, 0x1d, 0x9b, 0x71, 0xc7, 0xf7, 0xcc, 0xe1, 0x9e, 0xd9, 0x47, 0x0f, 0x43, + 0xc6, 0xb1, 0x67, 0x04, 0xa1, 0xcf, 0x7d, 0x72, 0x3b, 0xb5, 0x36, 0x58, 0xe0, 0x18, 0xf3, 0xd6, + 0xc6, 0x70, 0x6f, 0xfb, 0x6e, 0xdf, 0xe1, 0xa7, 0x71, 0xd7, 0xb0, 0x7d, 0xd7, 0xec, 0xfb, 0x7d, + 0xdf, 0x94, 0x4e, 0xdd, 0xf8, 0x44, 0x7e, 0xc9, 0x0f, 0xf9, 0x2b, 0x05, 0xdb, 0x7e, 0x67, 0x1a, + 0xda, 0x65, 0xf6, 0xa9, 0xe3, 0x61, 0x38, 0x32, 0x83, 0x41, 0x5f, 0x08, 0x22, 0xd3, 0x45, 0xce, + 0x2e, 0x49, 0x61, 0xdb, 0xbc, 0xca, 0x2b, 0x8c, 0x3d, 0xee, 0xb8, 0xb8, 0xe4, 0xf0, 0xde, 0x75, + 0x0e, 0x91, 0x7d, 0x8a, 0x2e, 0x5b, 0xf4, 0xd3, 0x7f, 0xd7, 0xe0, 0x65, 0xcb, 0x8f, 0xbd, 0xde, + 0xc3, 0xee, 0xb7, 0x68, 0x73, 0x8a, 0x27, 0x18, 0xa2, 0x67, 0x23, 0xd9, 0x81, 0xe2, 0xc0, 0xf1, + 0x7a, 0x35, 0x6d, 0x47, 0xdb, 0xad, 0x58, 0x37, 0xce, 0xc6, 0x8d, 0x5c, 0x32, 0x6e, 0x14, 0x3f, + 0x75, 0xbc, 0x1e, 0x95, 0x1a, 0xd2, 0x04, 0x60, 0x81, 0x73, 0x8c, 0x61, 0xe4, 0xf8, 0x5e, 0x2d, + 0x2f, 0xed, 0x88, 0xb2, 0x83, 0xfd, 0x47, 0x6d, 0xa5, 0xa1, 0x33, 0x56, 0x02, 0xd5, 0x63, 0x2e, + 0xd6, 0x0a, 0xf3, 0xa8, 0x9f, 0x33, 0x17, 0xa9, 0xd4, 0x10, 0x0b, 0x0a, 0x71, 0xfb, 0xa0, 0x56, + 0x94, 0x06, 0xf7, 0x94, 0x41, 0xe1, 0xa8, 0x7d, 0xf0, 0xdf, 0xb8, 0xf1, 0xfa, 0x55, 0x45, 0xf2, + 0x51, 0x80, 0x91, 0x71, 0xd4, 0x3e, 0xa0, 0xc2, 0x59, 0x7f, 0x1f, 0xa0, 0xf5, 0x84, 0x87, 0xec, + 0x98, 0x3d, 0x8e, 0x91, 0x34, 0xa0, 0xe4, 0x70, 0x74, 0xa3, 0x9a, 0xb6, 0x53, 0xd8, 0xad, 0x58, + 0x95, 0x64, 0xdc, 0x28, 0xb5, 0x85, 0x80, 0xa6, 0xf2, 0x07, 0xe5, 0x1f, 0x7f, 0x69, 0xe4, 0x9e, + 0xfe, 0xb9, 0x93, 0xd3, 0xff, 0xd0, 0x60, 0xab, 0x83, 0x8f, 0x4f, 0x3a, 0xb1, 0x62, 0x63, 0xe8, + 0xe0, 0xf7, 0xe4, 0x1b, 0x28, 0x8b, 0x3e, 0xf5, 0x18, 0x67, 0x92, 0x8e, 0x6a, 0xf3, 0x9e, 0x31, + 0x1d, 0x91, 0x49, 0x26, 0x46, 0x30, 0xe8, 0x0b, 0x41, 0x64, 0x08, 0x6b, 0x63, 0xb8, 0x67, 0xa4, + 0x9c, 0x7e, 0x86, 0x9c, 0x4d, 0x89, 0x99, 0xca, 0xe8, 0x04, 0x95, 0x7c, 0x0d, 0x6b, 0x11, 0x67, + 0x3c, 0x8e, 0x24, 0x8d, 0xd5, 0xe6, 0xbb, 0x46, 0xd6, 0x08, 0x1a, 0x4b, 0x29, 0x76, 0xa4, 0xb3, + 0xb5, 0xa1, 0x82, 0xac, 0xa5, 0xdf, 0x54, 0x81, 0xea, 0x3e, 0xbc, 0x72, 0x85, 0x0b, 0x39, 0x84, + 0x72, 0x1c, 0x61, 0xd8, 0xf6, 0x4e, 0x7c, 0x55, 0xdb, 0x1b, 0xd9, 0xb1, 0x8f, 0x94, 0xb5, 0xb5, + 0xa9, 0x82, 0x95, 0x2f, 0x24, 0x74, 0x82, 0xa4, 0xff, 0x9c, 0x87, 0x1b, 0x87, 0xfe, 0x00, 0x3d, + 0x8a, 0xdf, 0xc5, 0x18, 0xf1, 0x17, 0x40, 0xe1, 0x23, 0x28, 0x46, 0x01, 0xda, 0x8a, 0x40, 0x23, + 0xbb, 0x88, 0xd9, 0xdc, 0x3a, 0x01, 0xda, 0xd3, 0x49, 0x14, 0x5f, 0x54, 0x22, 0x91, 0x2f, 0x27, + 0x4d, 0x29, 0x2c, 0x65, 0x7c, 0x1d, 0x66, 0x76, 0x3f, 0xfe, 0xd5, 0x60, 0x73, 0x31, 0x05, 0xf2, + 0x16, 0x54, 0x58, 0xdc, 0x73, 0xc4, 0xe3, 0xbb, 0x18, 0xd5, 0xf5, 0x64, 0xdc, 0xa8, 0xec, 0x5f, + 0x08, 0xe9, 0x54, 0x4f, 0x3e, 0x82, 0x2d, 0x7c, 0x12, 0x38, 0xa1, 0x8c, 0xde, 0x41, 0xdb, 0xf7, + 0x7a, 0x91, 0x7c, 0x33, 0x05, 0xeb, 0x56, 0x32, 0x6e, 0x6c, 0xb5, 0x16, 0x95, 0x74, 0xd9, 0x9e, + 0x78, 0xb0, 0xd1, 0x9d, 0x7b, 0xfa, 0xaa, 0xd0, 0x66, 0x76, 0xa1, 0x97, 0xad, 0x0b, 0x8b, 0x24, + 0xe3, 0xc6, 0xc6, 0xbc, 0x86, 0x2e, 0xa0, 0xeb, 0xbf, 0x6a, 0x40, 0x96, 0x59, 0x22, 0x77, 0xa0, + 0xc4, 0x85, 0x54, 0xad, 0x9a, 0x75, 0x45, 0x5a, 0x29, 0x35, 0x4d, 0x75, 0x64, 0x04, 0x37, 0xa7, + 0x05, 0x1c, 0x3a, 0x2e, 0x46, 0x9c, 0xb9, 0x81, 0xea, 0xf6, 0x9b, 0xab, 0xcd, 0x92, 0x70, 0xb3, + 0x5e, 0x55, 0xf0, 0x37, 0x5b, 0xcb, 0x70, 0xf4, 0xb2, 0x18, 0xfa, 0x4f, 0x79, 0xa8, 0xaa, 0xb4, + 0x5f, 0xd0, 0x3a, 0x78, 0x38, 0x37, 0xcb, 0x77, 0x57, 0x9a, 0x3b, 0xf9, 0xa6, 0xaf, 0x1a, 0xe5, + 0x2f, 0x16, 0x46, 0xd9, 0x5c, 0x1d, 0x32, 0x7b, 0x92, 0x6d, 0x78, 0x69, 0x21, 0xfe, 0x6a, 0xed, + 0x9c, 0x1b, 0xf6, 0x7c, 0xf6, 0xb0, 0xeb, 0xff, 0x68, 0xb0, 0xb5, 0x94, 0x12, 0xf9, 0x00, 0xd6, + 0x67, 0x32, 0xc7, 0xf4, 0x52, 0x95, 0xad, 0x5b, 0x2a, 0xde, 0xfa, 0xfe, 0xac, 0x92, 0xce, 0xdb, + 0x92, 0x4f, 0xa0, 0x28, 0x96, 0x95, 0x62, 0x78, 0xd5, 0x95, 0x37, 0xa1, 0x56, 0x48, 0xa8, 0x44, + 0x98, 0xaf, 0xa4, 0x78, 0xcd, 0xb3, 0xbd, 0x03, 0x25, 0x0c, 0x43, 0x3f, 0x54, 0xf7, 0x6f, 0xc2, + 0x4d, 0x4b, 0x08, 0x69, 0xaa, 0xd3, 0x7f, 0xcb, 0xc3, 0x64, 0xa7, 0x92, 0xb7, 0xd3, 0xfd, 0x2c, + 0x8f, 0x66, 0x4a, 0xe8, 0xdc, 0xde, 0x15, 0x72, 0x3a, 0xb1, 0x20, 0xaf, 0x41, 0x21, 0x76, 0x7a, + 0xea, 0x16, 0x57, 0x67, 0x8e, 0x27, 0x15, 0x72, 0xa2, 0xc3, 0x5a, 0x3f, 0xf4, 0xe3, 0x40, 0x8c, + 0x81, 0x48, 0x14, 0x44, 0x47, 0x3f, 0x96, 0x12, 0xaa, 0x34, 0xe4, 0x18, 0x4a, 0x28, 0x6e, 0xa7, + 0xac, 0xa5, 0xda, 0xdc, 0x5b, 0x8d, 0x1a, 0x43, 0xde, 0xdb, 0x96, 0xc7, 0xc3, 0xd1, 0x4c, 0x55, + 0x42, 0x46, 0x53, 0xb8, 0xed, 0xae, 0xba, 0xc9, 0xd2, 0x86, 0x6c, 0x42, 0x61, 0x80, 0xa3, 0xb4, + 0x22, 0x2a, 0x7e, 0x92, 0x0f, 0xa1, 0x34, 0x14, 0xe7, 0x5a, 0xb5, 0x64, 0x37, 0x3b, 0xee, 0xf4, + 0xbc, 0xd3, 0xd4, 0xed, 0x41, 0xfe, 0xbe, 0x66, 0x59, 0x67, 0xe7, 0xf5, 0xdc, 0xb3, 0xf3, 0x7a, + 0xee, 0xf9, 0x79, 0x3d, 0xf7, 0x34, 0xa9, 0x6b, 0x67, 0x49, 0x5d, 0x7b, 0x96, 0xd4, 0xb5, 0xe7, + 0x49, 0x5d, 0xfb, 0x2b, 0xa9, 0x6b, 0x3f, 0xfc, 0x5d, 0xcf, 0x7d, 0x75, 0x3b, 0xeb, 0xcf, 0xe0, + 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x9a, 0x38, 0x17, 0x44, 0x0a, 0x00, 0x00, } func (m *BoundObjectReference) Marshal() (dAtA []byte, err error) { @@ -451,6 +512,82 @@ func (m ExtraValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SelfSubjectReview) 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 *SelfSubjectReview) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SelfSubjectReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *SelfSubjectReviewStatus) 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 *SelfSubjectReviewStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SelfSubjectReviewStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.UserInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *TokenRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -850,6 +987,30 @@ func (m ExtraValue) Size() (n int) { return n } +func (m *SelfSubjectReview) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *SelfSubjectReviewStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.UserInfo.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *TokenRequest) Size() (n int) { if m == nil { return 0 @@ -999,6 +1160,27 @@ func (this *BoundObjectReference) String() string { }, "") return s } +func (this *SelfSubjectReview) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SelfSubjectReview{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "SelfSubjectReviewStatus", "SelfSubjectReviewStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *SelfSubjectReviewStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SelfSubjectReviewStatus{`, + `UserInfo:` + strings.Replace(strings.Replace(this.UserInfo.String(), "UserInfo", "UserInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *TokenRequest) String() string { if this == nil { return "nil" @@ -1361,6 +1543,205 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { } return nil } +func (m *SelfSubjectReview) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SelfSubjectReview: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SelfSubjectReview: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SelfSubjectReviewStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SelfSubjectReviewStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SelfSubjectReviewStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TokenRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/tools/vendor/k8s.io/api/authentication/v1/generated.proto b/tools/vendor/k8s.io/api/authentication/v1/generated.proto index f4806a3c6..1632070c8 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/generated.proto +++ b/tools/vendor/k8s.io/api/authentication/v1/generated.proto @@ -56,6 +56,26 @@ message ExtraValue { repeated string items = 1; } +// SelfSubjectReview contains the user information that the kube-apiserver has about the user making this request. +// When using impersonation, users will receive the user info of the user being impersonated. If impersonation or +// request header authentication is used, any extra keys will have their case ignored and returned as lowercase. +message SelfSubjectReview { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Status is filled in by the server with the user attributes. + optional SelfSubjectReviewStatus status = 2; +} + +// SelfSubjectReviewStatus is filled by the kube-apiserver and sent back to a user. +message SelfSubjectReviewStatus { + // User attributes of the user making this request. + // +optional + optional UserInfo userInfo = 1; +} + // TokenRequest requests a token for a given service account. message TokenRequest { // Standard object's metadata. diff --git a/tools/vendor/k8s.io/api/authentication/v1/register.go b/tools/vendor/k8s.io/api/authentication/v1/register.go index c522e4a46..6a32b5926 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/register.go +++ b/tools/vendor/k8s.io/api/authentication/v1/register.go @@ -46,6 +46,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &TokenReview{}, &TokenRequest{}, + &SelfSubjectReview{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/tools/vendor/k8s.io/api/authentication/v1/types.go b/tools/vendor/k8s.io/api/authentication/v1/types.go index 4e221e58c..b498007c0 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/types.go +++ b/tools/vendor/k8s.io/api/authentication/v1/types.go @@ -197,3 +197,28 @@ type BoundObjectReference struct { // +optional UID types.UID `json:"uid,omitempty" protobuf:"bytes,4,opt,name=uID,casttype=k8s.io/apimachinery/pkg/types.UID"` } + +// +genclient +// +genclient:nonNamespaced +// +genclient:onlyVerbs=create +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// SelfSubjectReview contains the user information that the kube-apiserver has about the user making this request. +// When using impersonation, users will receive the user info of the user being impersonated. If impersonation or +// request header authentication is used, any extra keys will have their case ignored and returned as lowercase. +type SelfSubjectReview struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Status is filled in by the server with the user attributes. + Status SelfSubjectReviewStatus `json:"status,omitempty" protobuf:"bytes,2,opt,name=status"` +} + +// SelfSubjectReviewStatus is filled by the kube-apiserver and sent back to a user. +type SelfSubjectReviewStatus struct { + // User attributes of the user making this request. + // +optional + UserInfo UserInfo `json:"userInfo,omitempty" protobuf:"bytes,1,opt,name=userInfo"` +} diff --git a/tools/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go index b1a730b81..ebfd4852c 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go @@ -39,6 +39,25 @@ func (BoundObjectReference) SwaggerDoc() map[string]string { return map_BoundObjectReference } +var map_SelfSubjectReview = map[string]string{ + "": "SelfSubjectReview contains the user information that the kube-apiserver has about the user making this request. When using impersonation, users will receive the user info of the user being impersonated. If impersonation or request header authentication is used, any extra keys will have their case ignored and returned as lowercase.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "status": "Status is filled in by the server with the user attributes.", +} + +func (SelfSubjectReview) SwaggerDoc() map[string]string { + return map_SelfSubjectReview +} + +var map_SelfSubjectReviewStatus = map[string]string{ + "": "SelfSubjectReviewStatus is filled by the kube-apiserver and sent back to a user.", + "userInfo": "User attributes of the user making this request.", +} + +func (SelfSubjectReviewStatus) SwaggerDoc() map[string]string { + return map_SelfSubjectReviewStatus +} + var map_TokenRequest = map[string]string{ "": "TokenRequest requests a token for a given service account.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", diff --git a/tools/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go index 2af533191..369c89b86 100644 --- a/tools/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go @@ -61,6 +61,50 @@ func (in ExtraValue) DeepCopy() ExtraValue { return *out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SelfSubjectReview) DeepCopyInto(out *SelfSubjectReview) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SelfSubjectReview. +func (in *SelfSubjectReview) DeepCopy() *SelfSubjectReview { + if in == nil { + return nil + } + out := new(SelfSubjectReview) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SelfSubjectReview) 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 *SelfSubjectReviewStatus) DeepCopyInto(out *SelfSubjectReviewStatus) { + *out = *in + in.UserInfo.DeepCopyInto(&out.UserInfo) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SelfSubjectReviewStatus. +func (in *SelfSubjectReviewStatus) DeepCopy() *SelfSubjectReviewStatus { + if in == nil { + return nil + } + out := new(SelfSubjectReviewStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TokenRequest) DeepCopyInto(out *TokenRequest) { *out = *in diff --git a/tools/vendor/k8s.io/api/batch/v1/generated.pb.go b/tools/vendor/k8s.io/api/batch/v1/generated.pb.go index feafc23c2..59a7482a0 100644 --- a/tools/vendor/k8s.io/api/batch/v1/generated.pb.go +++ b/tools/vendor/k8s.io/api/batch/v1/generated.pb.go @@ -495,113 +495,120 @@ func init() { } var fileDescriptor_3b52da57c93de713 = []byte{ - // 1696 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x73, 0xe3, 0x48, - 0x15, 0x8f, 0xe2, 0xd8, 0xb1, 0xdb, 0xc9, 0xc4, 0xd3, 0xb3, 0x33, 0x63, 0xc2, 0x96, 0x95, 0xd5, - 0xec, 0x6e, 0x65, 0xa9, 0x45, 0x66, 0xb2, 0x53, 0x2c, 0xff, 0x8b, 0x91, 0x87, 0x59, 0x26, 0x78, - 0x36, 0xa6, 0x9d, 0x40, 0xd5, 0xb2, 0x50, 0xc8, 0x52, 0xdb, 0xd1, 0x46, 0x56, 0x1b, 0x75, 0x2b, - 0xb5, 0xb9, 0x50, 0x54, 0xf1, 0x05, 0xe0, 0xc8, 0x17, 0xe0, 0xc8, 0x05, 0xce, 0x70, 0xa3, 0x72, - 0xdc, 0xe2, 0xb4, 0xc5, 0x41, 0xc5, 0x88, 0x0f, 0xc0, 0x3d, 0x5c, 0xa8, 0x6e, 0xb5, 0xf5, 0xcf, - 0x52, 0xc8, 0x6c, 0x15, 0x5b, 0xdc, 0xa2, 0xf7, 0x7e, 0xef, 0xd7, 0x4f, 0xfd, 0x9e, 0x7e, 0xef, - 0xc5, 0xe0, 0x5b, 0x67, 0x5f, 0xa3, 0xba, 0x43, 0xfa, 0x67, 0xc1, 0x04, 0xfb, 0x1e, 0x66, 0x98, - 0xf6, 0xcf, 0xb1, 0x67, 0x13, 0xbf, 0x2f, 0x1d, 0xe6, 0xc2, 0xe9, 0x4f, 0x4c, 0x66, 0x9d, 0xf6, - 0xcf, 0x1f, 0xf6, 0x67, 0xd8, 0xc3, 0xbe, 0xc9, 0xb0, 0xad, 0x2f, 0x7c, 0xc2, 0x08, 0xbc, 0x13, - 0x83, 0x74, 0x73, 0xe1, 0xe8, 0x02, 0xa4, 0x9f, 0x3f, 0xdc, 0xfd, 0xf2, 0xcc, 0x61, 0xa7, 0xc1, - 0x44, 0xb7, 0xc8, 0xbc, 0x3f, 0x23, 0x33, 0xd2, 0x17, 0xd8, 0x49, 0x30, 0x15, 0x4f, 0xe2, 0x41, - 0xfc, 0x15, 0x73, 0xec, 0x6a, 0x99, 0x83, 0x2c, 0xe2, 0xe3, 0x92, 0x73, 0x76, 0x1f, 0xa5, 0x98, - 0xb9, 0x69, 0x9d, 0x3a, 0x1e, 0xf6, 0x2f, 0xfa, 0x8b, 0xb3, 0x19, 0x37, 0xd0, 0xfe, 0x1c, 0x33, - 0xb3, 0x2c, 0xaa, 0x5f, 0x15, 0xe5, 0x07, 0x1e, 0x73, 0xe6, 0x78, 0x25, 0xe0, 0xab, 0xff, 0x2d, - 0x80, 0x5a, 0xa7, 0x78, 0x6e, 0x16, 0xe3, 0xb4, 0x7f, 0x2b, 0x60, 0x73, 0xe0, 0x13, 0xef, 0x90, - 0x4c, 0xe0, 0xcf, 0x41, 0x93, 0xe7, 0x63, 0x9b, 0xcc, 0xec, 0x2a, 0x7b, 0xca, 0x7e, 0xfb, 0xe0, - 0x2b, 0x7a, 0x7a, 0x4b, 0x09, 0xad, 0xbe, 0x38, 0x9b, 0x71, 0x03, 0xd5, 0x39, 0x5a, 0x3f, 0x7f, - 0xa8, 0x1f, 0x4d, 0x3e, 0xc2, 0x16, 0x7b, 0x8e, 0x99, 0x69, 0xc0, 0xcb, 0x50, 0x5d, 0x8b, 0x42, - 0x15, 0xa4, 0x36, 0x94, 0xb0, 0x42, 0x03, 0x6c, 0xd0, 0x05, 0xb6, 0xba, 0xeb, 0x82, 0x7d, 0x4f, - 0x2f, 0xa9, 0x81, 0x2e, 0xb3, 0x19, 0x2f, 0xb0, 0x65, 0x6c, 0x49, 0xb6, 0x0d, 0xfe, 0x84, 0x44, - 0x2c, 0x3c, 0x04, 0x0d, 0xca, 0x4c, 0x16, 0xd0, 0x6e, 0x4d, 0xb0, 0x68, 0xd7, 0xb2, 0x08, 0xa4, - 0x71, 0x4b, 0xf2, 0x34, 0xe2, 0x67, 0x24, 0x19, 0xb4, 0x3f, 0x28, 0xa0, 0x2d, 0x91, 0x43, 0x87, - 0x32, 0xf8, 0xe1, 0xca, 0x0d, 0xe8, 0x37, 0xbb, 0x01, 0x1e, 0x2d, 0xde, 0xbf, 0x23, 0x4f, 0x6a, - 0x2e, 0x2d, 0x99, 0xb7, 0x7f, 0x0c, 0xea, 0x0e, 0xc3, 0x73, 0xda, 0x5d, 0xdf, 0xab, 0xed, 0xb7, - 0x0f, 0x5e, 0xbd, 0x2e, 0x71, 0x63, 0x5b, 0x12, 0xd5, 0x9f, 0xf1, 0x10, 0x14, 0x47, 0x6a, 0x7f, - 0xdb, 0x48, 0x12, 0xe6, 0x57, 0x02, 0xdf, 0x06, 0x4d, 0x5e, 0x58, 0x3b, 0x70, 0xb1, 0x48, 0xb8, - 0x95, 0x26, 0x30, 0x96, 0x76, 0x94, 0x20, 0xe0, 0x3e, 0x68, 0xf2, 0x5e, 0xf8, 0x80, 0x78, 0xb8, - 0xdb, 0x14, 0xe8, 0x2d, 0x8e, 0x3c, 0x96, 0x36, 0x94, 0x78, 0xe1, 0x09, 0xb8, 0x4f, 0x99, 0xe9, - 0x33, 0xc7, 0x9b, 0x3d, 0xc1, 0xa6, 0xed, 0x3a, 0x1e, 0x1e, 0x63, 0x8b, 0x78, 0x36, 0x15, 0xb5, - 0xab, 0x19, 0x5f, 0x8c, 0x42, 0xf5, 0xfe, 0xb8, 0x1c, 0x82, 0xaa, 0x62, 0xe1, 0x87, 0xe0, 0xb6, - 0x45, 0x3c, 0x2b, 0xf0, 0x7d, 0xec, 0x59, 0x17, 0x23, 0xe2, 0x3a, 0xd6, 0x85, 0x28, 0x63, 0xcb, - 0xd0, 0x65, 0xde, 0xb7, 0x07, 0x45, 0xc0, 0x55, 0x99, 0x11, 0xad, 0x12, 0xc1, 0x37, 0xc0, 0x26, - 0x0d, 0xe8, 0x02, 0x7b, 0x76, 0x77, 0x63, 0x4f, 0xd9, 0x6f, 0x1a, 0xed, 0x28, 0x54, 0x37, 0xc7, - 0xb1, 0x09, 0x2d, 0x7d, 0xf0, 0x27, 0xa0, 0xfd, 0x11, 0x99, 0x1c, 0xe3, 0xf9, 0xc2, 0x35, 0x19, - 0xee, 0xd6, 0x45, 0x9d, 0x5f, 0x2f, 0x2d, 0xc6, 0x61, 0x8a, 0x13, 0xfd, 0x78, 0x47, 0x26, 0xd9, - 0xce, 0x38, 0x50, 0x96, 0x0d, 0xfe, 0x0c, 0xec, 0xd2, 0xc0, 0xb2, 0x30, 0xa5, 0xd3, 0xc0, 0x3d, - 0x24, 0x13, 0xfa, 0x7d, 0x87, 0x32, 0xe2, 0x5f, 0x0c, 0x9d, 0xb9, 0xc3, 0xba, 0x8d, 0x3d, 0x65, - 0xbf, 0x6e, 0xf4, 0xa2, 0x50, 0xdd, 0x1d, 0x57, 0xa2, 0xd0, 0x35, 0x0c, 0x10, 0x81, 0x7b, 0x53, - 0xd3, 0x71, 0xb1, 0xbd, 0xc2, 0xbd, 0x29, 0xb8, 0x77, 0xa3, 0x50, 0xbd, 0xf7, 0xb4, 0x14, 0x81, - 0x2a, 0x22, 0xb5, 0x3f, 0xaf, 0x83, 0xed, 0xdc, 0xf7, 0x02, 0x7f, 0x00, 0x1a, 0xa6, 0xc5, 0x9c, - 0x73, 0xde, 0x54, 0xbc, 0x55, 0x1f, 0x64, 0x6f, 0x87, 0x2b, 0x5d, 0xfa, 0xd5, 0x23, 0x3c, 0xc5, - 0xbc, 0x08, 0x38, 0xfd, 0xc8, 0x1e, 0x8b, 0x50, 0x24, 0x29, 0xa0, 0x0b, 0x3a, 0xae, 0x49, 0xd9, - 0xb2, 0x1f, 0x79, 0xb7, 0x89, 0xfa, 0xb4, 0x0f, 0xbe, 0x74, 0xb3, 0x8f, 0x8b, 0x47, 0x18, 0xaf, - 0x44, 0xa1, 0xda, 0x19, 0x16, 0x78, 0xd0, 0x0a, 0x33, 0xf4, 0x01, 0x14, 0xb6, 0xe4, 0x0a, 0xc5, - 0x79, 0xf5, 0x97, 0x3e, 0xef, 0x5e, 0x14, 0xaa, 0x70, 0xb8, 0xc2, 0x84, 0x4a, 0xd8, 0xb5, 0x7f, - 0x29, 0xa0, 0xf6, 0xf9, 0x08, 0xe8, 0x77, 0x72, 0x02, 0xfa, 0x6a, 0x55, 0xd3, 0x56, 0x8a, 0xe7, - 0xd3, 0x82, 0x78, 0xf6, 0x2a, 0x19, 0xae, 0x17, 0xce, 0xbf, 0xd6, 0xc0, 0xd6, 0x21, 0x99, 0x0c, - 0x88, 0x67, 0x3b, 0xcc, 0x21, 0x1e, 0x7c, 0x04, 0x36, 0xd8, 0xc5, 0x62, 0x29, 0x42, 0x7b, 0xcb, - 0xa3, 0x8f, 0x2f, 0x16, 0xf8, 0x2a, 0x54, 0x3b, 0x59, 0x2c, 0xb7, 0x21, 0x81, 0x86, 0xc3, 0x24, - 0x9d, 0x75, 0x11, 0xf7, 0x28, 0x7f, 0xdc, 0x55, 0xa8, 0x96, 0x8c, 0x58, 0x3d, 0x61, 0xca, 0x27, - 0x05, 0x67, 0x60, 0x9b, 0x17, 0x67, 0xe4, 0x93, 0x49, 0xdc, 0x65, 0xb5, 0x97, 0xae, 0xfa, 0x5d, - 0x99, 0xc0, 0xf6, 0x30, 0x4b, 0x84, 0xf2, 0xbc, 0xf0, 0x3c, 0xee, 0xb1, 0x63, 0xdf, 0xf4, 0x68, - 0xfc, 0x4a, 0x9f, 0xad, 0xa7, 0x77, 0xe5, 0x69, 0xa2, 0xcf, 0xf2, 0x6c, 0xa8, 0xe4, 0x04, 0xf8, - 0x26, 0x68, 0xf8, 0xd8, 0xa4, 0xc4, 0x13, 0xfd, 0xdc, 0x4a, 0xab, 0x83, 0x84, 0x15, 0x49, 0x2f, - 0x7c, 0x0b, 0x6c, 0xce, 0x31, 0xa5, 0xe6, 0x0c, 0x0b, 0xc5, 0x69, 0x19, 0x3b, 0x12, 0xb8, 0xf9, - 0x3c, 0x36, 0xa3, 0xa5, 0x5f, 0xfb, 0xbd, 0x02, 0x36, 0x3f, 0x9f, 0xe9, 0xf7, 0xed, 0xfc, 0xf4, - 0xeb, 0x56, 0x75, 0x5e, 0xc5, 0xe4, 0xfb, 0x5d, 0x43, 0x24, 0x2a, 0xa6, 0xde, 0x43, 0xd0, 0x5e, - 0x98, 0xbe, 0xe9, 0xba, 0xd8, 0x75, 0xe8, 0x5c, 0xe4, 0x5a, 0x37, 0x76, 0xb8, 0x2e, 0x8f, 0x52, - 0x33, 0xca, 0x62, 0x78, 0x88, 0x45, 0xe6, 0x0b, 0x17, 0xf3, 0xcb, 0x8c, 0xdb, 0x4d, 0x86, 0x0c, - 0x52, 0x33, 0xca, 0x62, 0xe0, 0x11, 0xb8, 0x1b, 0x2b, 0x58, 0x71, 0x02, 0xd6, 0xc4, 0x04, 0xfc, - 0x42, 0x14, 0xaa, 0x77, 0x1f, 0x97, 0x01, 0x50, 0x79, 0x1c, 0x9c, 0x81, 0xce, 0x82, 0xd8, 0x5c, - 0x9c, 0x03, 0x1f, 0xcb, 0xe1, 0xd7, 0x16, 0xf7, 0xfc, 0x46, 0xe9, 0x65, 0x8c, 0x0a, 0xe0, 0x58, - 0x03, 0x8b, 0x56, 0xb4, 0x42, 0x0a, 0x1f, 0x81, 0xad, 0x89, 0x69, 0x9d, 0x91, 0xe9, 0x34, 0x3b, - 0x1a, 0x3a, 0x51, 0xa8, 0x6e, 0x19, 0x19, 0x3b, 0xca, 0xa1, 0xe0, 0x4f, 0x41, 0x93, 0x62, 0x17, - 0x5b, 0x8c, 0xf8, 0xb2, 0x97, 0xdf, 0xb9, 0x61, 0xf9, 0xcd, 0x09, 0x76, 0xc7, 0x32, 0x34, 0x5e, - 0x29, 0x96, 0x4f, 0x28, 0xa1, 0x84, 0xdf, 0x00, 0xb7, 0xe6, 0xa6, 0x17, 0x98, 0x09, 0x52, 0x34, - 0x71, 0xd3, 0x80, 0x51, 0xa8, 0xde, 0x7a, 0x9e, 0xf3, 0xa0, 0x02, 0x12, 0xfe, 0x10, 0x34, 0xd9, - 0x72, 0x5e, 0x37, 0x44, 0x6a, 0xa5, 0x13, 0x69, 0x44, 0xec, 0xdc, 0xb8, 0x4e, 0xda, 0x31, 0x99, - 0xd5, 0x09, 0x0d, 0xdf, 0x70, 0x18, 0x73, 0x65, 0x69, 0x1e, 0x4f, 0x19, 0xf6, 0x9f, 0x3a, 0x9e, - 0x43, 0x4f, 0xb1, 0x2d, 0x56, 0xa3, 0x7a, 0xbc, 0xe1, 0x1c, 0x1f, 0x0f, 0xcb, 0x20, 0xa8, 0x2a, - 0x16, 0x0e, 0xc1, 0xad, 0xb4, 0x87, 0x9e, 0x13, 0x1b, 0x77, 0x5b, 0xe2, 0x0b, 0x7c, 0x9d, 0xbf, - 0xe5, 0x20, 0xe7, 0xb9, 0x5a, 0xb1, 0xa0, 0x42, 0x6c, 0x76, 0xa3, 0x01, 0xd5, 0x1b, 0x8d, 0xf6, - 0xdb, 0x3a, 0x68, 0xa5, 0xc3, 0xfb, 0x04, 0x00, 0x6b, 0xa9, 0x90, 0x54, 0x0e, 0xf0, 0xd7, 0xaa, - 0xbe, 0xb6, 0x44, 0x4b, 0xd3, 0xc1, 0x93, 0x98, 0x28, 0xca, 0x10, 0xc1, 0x1f, 0x83, 0x96, 0x58, - 0xeb, 0x84, 0xd6, 0xad, 0xbf, 0xb4, 0xd6, 0x6d, 0x47, 0xa1, 0xda, 0x1a, 0x2f, 0x09, 0x50, 0xca, - 0x05, 0xa7, 0xd9, 0x2b, 0xfb, 0x8c, 0xba, 0x0d, 0xf3, 0xd7, 0x2b, 0x8e, 0x28, 0xb0, 0x72, 0xf5, - 0x94, 0x4b, 0xcd, 0x86, 0x28, 0x70, 0xd5, 0xbe, 0xd2, 0x07, 0x2d, 0xb1, 0x80, 0x61, 0x1b, 0xdb, - 0xa2, 0x47, 0xeb, 0xc6, 0x6d, 0x09, 0x6d, 0x8d, 0x97, 0x0e, 0x94, 0x62, 0x38, 0x71, 0xbc, 0x59, - 0xc9, 0xfd, 0x2e, 0x21, 0x8e, 0xf7, 0x30, 0x24, 0xbd, 0xf0, 0x09, 0xe8, 0xc8, 0x94, 0xb0, 0xfd, - 0xcc, 0xb3, 0xf1, 0xc7, 0x98, 0x8a, 0x4f, 0xb3, 0x65, 0x74, 0x65, 0x44, 0x67, 0x50, 0xf0, 0xa3, - 0x95, 0x08, 0xf8, 0x6b, 0x05, 0xdc, 0x0f, 0x3c, 0x8b, 0x04, 0x1e, 0xc3, 0xf6, 0x31, 0xf6, 0xe7, - 0x8e, 0xc7, 0xff, 0x9f, 0x1b, 0x11, 0x9b, 0x8a, 0xce, 0x6d, 0x1f, 0xbc, 0x5d, 0x5a, 0xec, 0x93, - 0xf2, 0x98, 0xb8, 0xcf, 0x2b, 0x9c, 0xa8, 0xea, 0x24, 0xa8, 0x82, 0xba, 0x8f, 0x4d, 0xfb, 0x42, - 0xb4, 0x77, 0xdd, 0x68, 0x71, 0xbd, 0x46, 0xdc, 0x80, 0x62, 0xbb, 0xf6, 0x47, 0x05, 0xec, 0x14, - 0xd6, 0xe7, 0xff, 0xff, 0xfd, 0x48, 0x9b, 0x80, 0x15, 0x7d, 0x85, 0xef, 0x83, 0xba, 0x1f, 0xb8, - 0x78, 0xf9, 0x29, 0xbd, 0x75, 0x23, 0xad, 0x46, 0x81, 0x8b, 0xd3, 0x49, 0xc6, 0x9f, 0x28, 0x8a, - 0x69, 0xb4, 0xbf, 0x2b, 0xe0, 0xcd, 0x22, 0xfc, 0xc8, 0xfb, 0xde, 0xc7, 0x0e, 0x1b, 0x10, 0x1b, - 0x53, 0x84, 0x7f, 0x11, 0x38, 0x3e, 0x9e, 0x63, 0x8f, 0xc1, 0x77, 0xc1, 0xb6, 0x45, 0x3c, 0x66, - 0xf2, 0x6b, 0x79, 0xdf, 0x9c, 0x2f, 0xd7, 0xab, 0xdb, 0x7c, 0x43, 0x19, 0x64, 0x1d, 0x28, 0x8f, - 0x83, 0x63, 0xd0, 0x24, 0x0b, 0xfe, 0x8f, 0x3e, 0xf1, 0xe5, 0x6a, 0xf5, 0xee, 0x52, 0x0b, 0x8f, - 0xa4, 0xfd, 0x2a, 0x54, 0x1f, 0x5c, 0x93, 0xc6, 0x12, 0x86, 0x12, 0x22, 0xa8, 0x81, 0xc6, 0xb9, - 0xe9, 0x06, 0x98, 0x4f, 0xc0, 0xda, 0x7e, 0xdd, 0x00, 0xbc, 0xc7, 0x7f, 0x24, 0x2c, 0x48, 0x7a, - 0xb4, 0xbf, 0x94, 0xbe, 0xdc, 0x88, 0xd8, 0xa9, 0xaa, 0x8c, 0x4c, 0xc6, 0xb0, 0xef, 0xc1, 0xf7, - 0x72, 0x2b, 0xe3, 0x3b, 0x85, 0x95, 0xf1, 0x41, 0xc9, 0xe2, 0x97, 0xa5, 0xf9, 0x5f, 0x6d, 0x91, - 0xda, 0xe5, 0x3a, 0x78, 0xa5, 0xac, 0x9a, 0xf0, 0xbb, 0xb1, 0x7e, 0x10, 0x4f, 0x66, 0xbc, 0x9f, - 0xd5, 0x0f, 0xe2, 0x5d, 0x85, 0xea, 0xbd, 0x62, 0x5c, 0xec, 0x41, 0x32, 0x0e, 0x7a, 0xa0, 0x4d, - 0xd2, 0x1b, 0x96, 0x4d, 0xfa, 0xcd, 0x1b, 0xf5, 0x53, 0x79, 0x83, 0xc4, 0x1b, 0x4c, 0xd6, 0x97, - 0x3d, 0x00, 0xfe, 0x12, 0xec, 0x90, 0xfc, 0xdd, 0x8b, 0xca, 0xdd, 0xfc, 0xcc, 0xb2, 0xba, 0x19, - 0xf7, 0xe5, 0x7b, 0xef, 0x14, 0xfc, 0xa8, 0x78, 0x98, 0xf6, 0x27, 0x05, 0x54, 0x29, 0x0b, 0x1c, - 0x65, 0x55, 0x96, 0x7f, 0x59, 0x2d, 0xe3, 0x20, 0xa7, 0xb0, 0x57, 0xa1, 0xfa, 0x5a, 0xd5, 0x8f, - 0x5a, 0xbc, 0xec, 0x54, 0x3f, 0x79, 0xf6, 0x24, 0x2b, 0xc3, 0xef, 0x25, 0x32, 0xbc, 0x2e, 0xe8, - 0xfa, 0xa9, 0x04, 0xdf, 0x8c, 0x4b, 0x86, 0x1b, 0x5f, 0xbf, 0x7c, 0xd1, 0x5b, 0xfb, 0xe4, 0x45, - 0x6f, 0xed, 0xd3, 0x17, 0xbd, 0xb5, 0x5f, 0x45, 0x3d, 0xe5, 0x32, 0xea, 0x29, 0x9f, 0x44, 0x3d, - 0xe5, 0xd3, 0xa8, 0xa7, 0xfc, 0x23, 0xea, 0x29, 0xbf, 0xf9, 0x67, 0x6f, 0xed, 0x83, 0x3b, 0x25, - 0xbf, 0x32, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x8e, 0x19, 0x59, 0x94, 0x14, 0x00, 0x00, + // 1797 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6f, 0x23, 0x49, + 0x15, 0x8f, 0x93, 0x38, 0xb1, 0xcb, 0xf9, 0xf0, 0xd4, 0x64, 0x66, 0x4c, 0x58, 0xb9, 0xb3, 0x9e, + 0xdd, 0x55, 0x16, 0x2d, 0xed, 0x9d, 0xec, 0x88, 0xe5, 0x5b, 0x3b, 0x9d, 0x61, 0x96, 0x09, 0xce, + 0x8e, 0x29, 0x67, 0x40, 0x5a, 0x16, 0x44, 0xb9, 0xbb, 0xec, 0xf4, 0xa6, 0xdd, 0xd5, 0x74, 0x55, + 0x47, 0x93, 0x0b, 0x42, 0xe2, 0x0f, 0x80, 0xbf, 0x82, 0x23, 0x17, 0x38, 0xc3, 0x0d, 0xcd, 0x71, + 0xc5, 0x69, 0xc5, 0xa1, 0xc5, 0x34, 0x7f, 0x00, 0xf7, 0x20, 0x24, 0x54, 0xd5, 0xe5, 0xfe, 0x72, + 0x77, 0xc8, 0xac, 0xc4, 0x88, 0x5b, 0xfa, 0xbd, 0xdf, 0xfb, 0xd5, 0xc7, 0x7b, 0xf5, 0x7b, 0x2f, + 0x06, 0xdf, 0x3e, 0xfb, 0x3a, 0xd3, 0x6d, 0xda, 0x3f, 0x0b, 0xc6, 0xc4, 0x77, 0x09, 0x27, 0xac, + 0x7f, 0x4e, 0x5c, 0x8b, 0xfa, 0x7d, 0xe5, 0xc0, 0x9e, 0xdd, 0x1f, 0x63, 0x6e, 0x9e, 0xf6, 0xcf, + 0xef, 0xf5, 0xa7, 0xc4, 0x25, 0x3e, 0xe6, 0xc4, 0xd2, 0x3d, 0x9f, 0x72, 0x0a, 0x6f, 0xc6, 0x20, + 0x1d, 0x7b, 0xb6, 0x2e, 0x41, 0xfa, 0xf9, 0xbd, 0xdd, 0xaf, 0x4e, 0x6d, 0x7e, 0x1a, 0x8c, 0x75, + 0x93, 0xce, 0xfa, 0x53, 0x3a, 0xa5, 0x7d, 0x89, 0x1d, 0x07, 0x13, 0xf9, 0x25, 0x3f, 0xe4, 0x5f, + 0x31, 0xc7, 0x6e, 0x2f, 0xb3, 0x90, 0x49, 0x7d, 0x52, 0xb2, 0xce, 0xee, 0xfd, 0x14, 0x33, 0xc3, + 0xe6, 0xa9, 0xed, 0x12, 0xff, 0xa2, 0xef, 0x9d, 0x4d, 0x85, 0x81, 0xf5, 0x67, 0x84, 0xe3, 0xb2, + 0xa8, 0x7e, 0x55, 0x94, 0x1f, 0xb8, 0xdc, 0x9e, 0x91, 0x85, 0x80, 0xaf, 0xfd, 0xb7, 0x00, 0x66, + 0x9e, 0x92, 0x19, 0x2e, 0xc6, 0xf5, 0xfe, 0x55, 0x03, 0xeb, 0x87, 0x3e, 0x75, 0x8f, 0xe8, 0x18, + 0xfe, 0x1c, 0x34, 0xc4, 0x7e, 0x2c, 0xcc, 0x71, 0xa7, 0xb6, 0x57, 0xdb, 0x6f, 0x1d, 0xbc, 0xab, + 0xa7, 0xb7, 0x94, 0xd0, 0xea, 0xde, 0xd9, 0x54, 0x18, 0x98, 0x2e, 0xd0, 0xfa, 0xf9, 0x3d, 0xfd, + 0xc9, 0xf8, 0x53, 0x62, 0xf2, 0x63, 0xc2, 0xb1, 0x01, 0x9f, 0x87, 0xda, 0x52, 0x14, 0x6a, 0x20, + 0xb5, 0xa1, 0x84, 0x15, 0x1a, 0x60, 0x95, 0x79, 0xc4, 0xec, 0x2c, 0x4b, 0xf6, 0x3d, 0xbd, 0x24, + 0x07, 0xba, 0xda, 0xcd, 0xc8, 0x23, 0xa6, 0xb1, 0xa1, 0xd8, 0x56, 0xc5, 0x17, 0x92, 0xb1, 0xf0, + 0x08, 0xac, 0x31, 0x8e, 0x79, 0xc0, 0x3a, 0x2b, 0x92, 0xa5, 0x77, 0x25, 0x8b, 0x44, 0x1a, 0x5b, + 0x8a, 0x67, 0x2d, 0xfe, 0x46, 0x8a, 0xa1, 0xf7, 0xfb, 0x1a, 0x68, 0x29, 0xe4, 0xc0, 0x66, 0x1c, + 0x7e, 0xb2, 0x70, 0x03, 0xfa, 0xf5, 0x6e, 0x40, 0x44, 0xcb, 0xf3, 0xb7, 0xd5, 0x4a, 0x8d, 0xb9, + 0x25, 0x73, 0xfa, 0x07, 0xa0, 0x6e, 0x73, 0x32, 0x63, 0x9d, 0xe5, 0xbd, 0x95, 0xfd, 0xd6, 0xc1, + 0x6b, 0x57, 0x6d, 0xdc, 0xd8, 0x54, 0x44, 0xf5, 0xc7, 0x22, 0x04, 0xc5, 0x91, 0xbd, 0xbf, 0xae, + 0x26, 0x1b, 0x16, 0x57, 0x02, 0xdf, 0x01, 0x0d, 0x91, 0x58, 0x2b, 0x70, 0x88, 0xdc, 0x70, 0x33, + 0xdd, 0xc0, 0x48, 0xd9, 0x51, 0x82, 0x80, 0xfb, 0xa0, 0x21, 0x6a, 0xe1, 0x63, 0xea, 0x92, 0x4e, + 0x43, 0xa2, 0x37, 0x04, 0xf2, 0x44, 0xd9, 0x50, 0xe2, 0x85, 0x4f, 0xc1, 0x1d, 0xc6, 0xb1, 0xcf, + 0x6d, 0x77, 0xfa, 0x90, 0x60, 0xcb, 0xb1, 0x5d, 0x32, 0x22, 0x26, 0x75, 0x2d, 0x26, 0x73, 0xb7, + 0x62, 0x7c, 0x39, 0x0a, 0xb5, 0x3b, 0xa3, 0x72, 0x08, 0xaa, 0x8a, 0x85, 0x9f, 0x80, 0x1b, 0x26, + 0x75, 0xcd, 0xc0, 0xf7, 0x89, 0x6b, 0x5e, 0x0c, 0xa9, 0x63, 0x9b, 0x17, 0x32, 0x8d, 0x4d, 0x43, + 0x57, 0xfb, 0xbe, 0x71, 0x58, 0x04, 0x5c, 0x96, 0x19, 0xd1, 0x22, 0x11, 0x7c, 0x13, 0xac, 0xb3, + 0x80, 0x79, 0xc4, 0xb5, 0x3a, 0xab, 0x7b, 0xb5, 0xfd, 0x86, 0xd1, 0x8a, 0x42, 0x6d, 0x7d, 0x14, + 0x9b, 0xd0, 0xdc, 0x07, 0x7f, 0x02, 0x5a, 0x9f, 0xd2, 0xf1, 0x09, 0x99, 0x79, 0x0e, 0xe6, 0xa4, + 0x53, 0x97, 0x79, 0x7e, 0xa3, 0x34, 0x19, 0x47, 0x29, 0x4e, 0xd6, 0xe3, 0x4d, 0xb5, 0xc9, 0x56, + 0xc6, 0x81, 0xb2, 0x6c, 0xf0, 0x67, 0x60, 0x97, 0x05, 0xa6, 0x49, 0x18, 0x9b, 0x04, 0xce, 0x11, + 0x1d, 0xb3, 0xef, 0xdb, 0x8c, 0x53, 0xff, 0x62, 0x60, 0xcf, 0x6c, 0xde, 0x59, 0xdb, 0xab, 0xed, + 0xd7, 0x8d, 0x6e, 0x14, 0x6a, 0xbb, 0xa3, 0x4a, 0x14, 0xba, 0x82, 0x01, 0x22, 0x70, 0x7b, 0x82, + 0x6d, 0x87, 0x58, 0x0b, 0xdc, 0xeb, 0x92, 0x7b, 0x37, 0x0a, 0xb5, 0xdb, 0x8f, 0x4a, 0x11, 0xa8, + 0x22, 0xb2, 0xf7, 0xa7, 0x65, 0xb0, 0x99, 0x7b, 0x2f, 0xf0, 0x07, 0x60, 0x0d, 0x9b, 0xdc, 0x3e, + 0x17, 0x45, 0x25, 0x4a, 0xf5, 0x6e, 0xf6, 0x76, 0x84, 0xd2, 0xa5, 0xaf, 0x1e, 0x91, 0x09, 0x11, + 0x49, 0x20, 0xe9, 0x23, 0x7b, 0x20, 0x43, 0x91, 0xa2, 0x80, 0x0e, 0x68, 0x3b, 0x98, 0xf1, 0x79, + 0x3d, 0x8a, 0x6a, 0x93, 0xf9, 0x69, 0x1d, 0x7c, 0xe5, 0x7a, 0x8f, 0x4b, 0x44, 0x18, 0x3b, 0x51, + 0xa8, 0xb5, 0x07, 0x05, 0x1e, 0xb4, 0xc0, 0x0c, 0x7d, 0x00, 0xa5, 0x2d, 0xb9, 0x42, 0xb9, 0x5e, + 0xfd, 0xa5, 0xd7, 0xbb, 0x1d, 0x85, 0x1a, 0x1c, 0x2c, 0x30, 0xa1, 0x12, 0xf6, 0xde, 0x3f, 0x6b, + 0x60, 0xe5, 0xd5, 0x08, 0xe8, 0x77, 0x73, 0x02, 0xfa, 0x5a, 0x55, 0xd1, 0x56, 0x8a, 0xe7, 0xa3, + 0x82, 0x78, 0x76, 0x2b, 0x19, 0xae, 0x16, 0xce, 0xbf, 0xac, 0x80, 0x8d, 0x23, 0x3a, 0x3e, 0xa4, + 0xae, 0x65, 0x73, 0x9b, 0xba, 0xf0, 0x3e, 0x58, 0xe5, 0x17, 0xde, 0x5c, 0x84, 0xf6, 0xe6, 0x4b, + 0x9f, 0x5c, 0x78, 0xe4, 0x32, 0xd4, 0xda, 0x59, 0xac, 0xb0, 0x21, 0x89, 0x86, 0x83, 0x64, 0x3b, + 0xcb, 0x32, 0xee, 0x7e, 0x7e, 0xb9, 0xcb, 0x50, 0x2b, 0x69, 0xb1, 0x7a, 0xc2, 0x94, 0xdf, 0x14, + 0x9c, 0x82, 0x4d, 0x91, 0x9c, 0xa1, 0x4f, 0xc7, 0x71, 0x95, 0xad, 0xbc, 0x74, 0xd6, 0x6f, 0xa9, + 0x0d, 0x6c, 0x0e, 0xb2, 0x44, 0x28, 0xcf, 0x0b, 0xcf, 0xe3, 0x1a, 0x3b, 0xf1, 0xb1, 0xcb, 0xe2, + 0x23, 0x7d, 0xb1, 0x9a, 0xde, 0x55, 0xab, 0xc9, 0x3a, 0xcb, 0xb3, 0xa1, 0x92, 0x15, 0xe0, 0x5b, + 0x60, 0xcd, 0x27, 0x98, 0x51, 0x57, 0xd6, 0x73, 0x33, 0xcd, 0x0e, 0x92, 0x56, 0xa4, 0xbc, 0xf0, + 0x6d, 0xb0, 0x3e, 0x23, 0x8c, 0xe1, 0x29, 0x91, 0x8a, 0xd3, 0x34, 0xb6, 0x15, 0x70, 0xfd, 0x38, + 0x36, 0xa3, 0xb9, 0xbf, 0xf7, 0xbb, 0x1a, 0x58, 0x7f, 0x35, 0xdd, 0xef, 0x3b, 0xf9, 0xee, 0xd7, + 0xa9, 0xaa, 0xbc, 0x8a, 0xce, 0xf7, 0x9b, 0x86, 0xdc, 0xa8, 0xec, 0x7a, 0xf7, 0x40, 0xcb, 0xc3, + 0x3e, 0x76, 0x1c, 0xe2, 0xd8, 0x6c, 0x26, 0xf7, 0x5a, 0x37, 0xb6, 0x85, 0x2e, 0x0f, 0x53, 0x33, + 0xca, 0x62, 0x44, 0x88, 0x49, 0x67, 0x9e, 0x43, 0xc4, 0x65, 0xc6, 0xe5, 0xa6, 0x42, 0x0e, 0x53, + 0x33, 0xca, 0x62, 0xe0, 0x13, 0x70, 0x2b, 0x56, 0xb0, 0x62, 0x07, 0x5c, 0x91, 0x1d, 0xf0, 0x4b, + 0x51, 0xa8, 0xdd, 0x7a, 0x50, 0x06, 0x40, 0xe5, 0x71, 0x70, 0x0a, 0xda, 0x1e, 0xb5, 0x84, 0x38, + 0x07, 0x3e, 0x51, 0xcd, 0xaf, 0x25, 0xef, 0xf9, 0xcd, 0xd2, 0xcb, 0x18, 0x16, 0xc0, 0xb1, 0x06, + 0x16, 0xad, 0x68, 0x81, 0x14, 0xde, 0x07, 0x1b, 0x63, 0x6c, 0x9e, 0xd1, 0xc9, 0x24, 0xdb, 0x1a, + 0xda, 0x51, 0xa8, 0x6d, 0x18, 0x19, 0x3b, 0xca, 0xa1, 0xe0, 0x00, 0xec, 0x64, 0xbf, 0x87, 0xc4, + 0x7f, 0xec, 0x5a, 0xe4, 0x59, 0x67, 0x43, 0x46, 0x77, 0xa2, 0x50, 0xdb, 0x31, 0x4a, 0xfc, 0xa8, + 0x34, 0x0a, 0x7e, 0x00, 0xda, 0x33, 0xfc, 0x2c, 0xee, 0x44, 0xd2, 0x42, 0x58, 0x67, 0x53, 0x32, + 0xc9, 0x53, 0x1c, 0x17, 0x7c, 0x68, 0x01, 0x0d, 0x7f, 0x0a, 0x1a, 0x8c, 0x38, 0xc4, 0xe4, 0xd4, + 0x57, 0x6f, 0xeb, 0xbd, 0x6b, 0x96, 0x23, 0x1e, 0x13, 0x67, 0xa4, 0x42, 0xe3, 0x11, 0x67, 0xfe, + 0x85, 0x12, 0x4a, 0xf8, 0x4d, 0xb0, 0x35, 0xc3, 0x6e, 0x80, 0x13, 0xa4, 0x7c, 0x54, 0x0d, 0x03, + 0x46, 0xa1, 0xb6, 0x75, 0x9c, 0xf3, 0xa0, 0x02, 0x12, 0xfe, 0x10, 0x34, 0xf8, 0x7c, 0x7e, 0x58, + 0x93, 0x5b, 0x2b, 0xed, 0x90, 0x43, 0x6a, 0xe5, 0xc6, 0x87, 0xe4, 0x79, 0x24, 0xb3, 0x43, 0x42, + 0x23, 0x26, 0x2e, 0xce, 0x1d, 0x55, 0x2a, 0x0f, 0x26, 0x9c, 0xf8, 0x8f, 0x6c, 0xd7, 0x66, 0xa7, + 0xc4, 0x92, 0xa3, 0x5a, 0x3d, 0x9e, 0xb8, 0x4e, 0x4e, 0x06, 0x65, 0x10, 0x54, 0x15, 0x0b, 0x07, + 0x60, 0x2b, 0xad, 0xe9, 0x63, 0x6a, 0x91, 0x4e, 0x53, 0x2a, 0xc2, 0x1b, 0xe2, 0x94, 0x87, 0x39, + 0xcf, 0xe5, 0x82, 0x05, 0x15, 0x62, 0xb3, 0x13, 0x16, 0xb8, 0x62, 0xc2, 0xb2, 0xc0, 0x8e, 0x47, + 0x2d, 0x44, 0x3c, 0x07, 0x9b, 0x64, 0x46, 0x5c, 0xae, 0x8a, 0x7d, 0x4b, 0x2e, 0xfd, 0xae, 0xa8, + 0xa4, 0x61, 0x89, 0xff, 0xb2, 0xc2, 0x8e, 0x4a, 0xd9, 0x7a, 0xff, 0xae, 0x83, 0x66, 0x3a, 0xb2, + 0x3c, 0x05, 0xc0, 0x9c, 0xf7, 0x05, 0xa6, 0xc6, 0x96, 0xd7, 0xab, 0x34, 0x26, 0xe9, 0x20, 0x69, + 0xbb, 0x4d, 0x4c, 0x0c, 0x65, 0x88, 0xe0, 0x8f, 0x41, 0x53, 0x0e, 0xb3, 0x52, 0xe1, 0x97, 0x5f, + 0x5a, 0xe1, 0x37, 0xa3, 0x50, 0x6b, 0x8e, 0xe6, 0x04, 0x28, 0xe5, 0x82, 0x93, 0x6c, 0x62, 0xbe, + 0x60, 0xb7, 0x82, 0xf9, 0x24, 0xca, 0x25, 0x0a, 0xac, 0xa2, 0x67, 0xa8, 0x51, 0x6e, 0x55, 0x96, + 0x51, 0xd5, 0x94, 0xd6, 0x07, 0x4d, 0x39, 0x76, 0x12, 0x8b, 0x58, 0xf2, 0x25, 0xd4, 0x8d, 0x1b, + 0x0a, 0xda, 0x1c, 0xcd, 0x1d, 0x28, 0xc5, 0x08, 0xe2, 0x78, 0x9e, 0x54, 0x53, 0x6d, 0x42, 0x1c, + 0xbf, 0x62, 0xa4, 0xbc, 0x42, 0x79, 0x39, 0xf1, 0x67, 0xb6, 0x8b, 0xc5, 0x7f, 0x04, 0x52, 0xf0, + 0x94, 0xf2, 0x9e, 0xa4, 0x66, 0x94, 0xc5, 0xc0, 0x87, 0xa0, 0xad, 0x4e, 0x91, 0x6a, 0xc7, 0xba, + 0xac, 0x9d, 0x8e, 0x5a, 0xa4, 0x7d, 0x58, 0xf0, 0xa3, 0x85, 0x08, 0xf8, 0x3e, 0xd8, 0x9c, 0xe4, + 0xe4, 0x07, 0x48, 0x8a, 0x1b, 0xa2, 0xbd, 0xe7, 0xb5, 0x27, 0x8f, 0x83, 0xbf, 0xae, 0x81, 0x3b, + 0x81, 0x6b, 0xd2, 0xc0, 0xe5, 0xc4, 0x9a, 0x6f, 0x92, 0x58, 0x43, 0x6a, 0x31, 0xf9, 0x16, 0x5b, + 0x07, 0xef, 0x94, 0x16, 0xd6, 0xd3, 0xf2, 0x98, 0xf8, 0xe5, 0x56, 0x38, 0x51, 0xd5, 0x4a, 0x50, + 0x03, 0x75, 0x9f, 0x60, 0xeb, 0x42, 0x3e, 0xd8, 0xba, 0xd1, 0x14, 0x1d, 0x11, 0x09, 0x03, 0x8a, + 0xed, 0xbd, 0x3f, 0xd4, 0xc0, 0x76, 0xe1, 0x1f, 0x94, 0xff, 0xff, 0x09, 0xb4, 0x37, 0x06, 0x0b, + 0x1d, 0x0c, 0x7e, 0x04, 0xea, 0x7e, 0xe0, 0x90, 0xf9, 0xb3, 0x7d, 0xfb, 0x5a, 0xdd, 0x10, 0x05, + 0x0e, 0x49, 0x67, 0x05, 0xf1, 0xc5, 0x50, 0x4c, 0xd3, 0xfb, 0x5b, 0x0d, 0xbc, 0x55, 0x84, 0x3f, + 0x71, 0xbf, 0xf7, 0xcc, 0xe6, 0x87, 0xd4, 0x22, 0x0c, 0x91, 0x5f, 0x04, 0xb6, 0x2f, 0xa5, 0x44, + 0x14, 0x89, 0x49, 0x5d, 0x8e, 0xc5, 0xb5, 0x7c, 0x84, 0x67, 0xf3, 0x01, 0x56, 0x16, 0xc9, 0x61, + 0xd6, 0x81, 0xf2, 0x38, 0x38, 0x02, 0x0d, 0xea, 0x11, 0x1f, 0x8b, 0xc6, 0x11, 0x0f, 0xaf, 0xef, + 0xcf, 0xd5, 0xfd, 0x89, 0xb2, 0x5f, 0x86, 0xda, 0xdd, 0x2b, 0xb6, 0x31, 0x87, 0xa1, 0x84, 0x08, + 0xf6, 0xc0, 0xda, 0x39, 0x76, 0x02, 0x22, 0x66, 0x8c, 0x95, 0xfd, 0xba, 0x01, 0xc4, 0x7b, 0xfa, + 0x91, 0xb4, 0x20, 0xe5, 0xe9, 0xfd, 0xb9, 0xf4, 0x70, 0x43, 0x6a, 0xa5, 0x0a, 0x36, 0xc4, 0x9c, + 0x13, 0xdf, 0x85, 0x1f, 0xe6, 0x86, 0xf2, 0xf7, 0x0a, 0x43, 0xf9, 0xdd, 0x92, 0xd1, 0x3a, 0x4b, + 0xf3, 0xbf, 0x9a, 0xd3, 0x7b, 0xcf, 0x97, 0xc1, 0x4e, 0x59, 0x36, 0xe1, 0x07, 0xb1, 0x56, 0x51, + 0x57, 0xed, 0x78, 0x3f, 0xab, 0x55, 0xd4, 0xbd, 0x0c, 0xb5, 0xdb, 0xc5, 0xb8, 0xd8, 0x83, 0x54, + 0x1c, 0x74, 0x41, 0x8b, 0xa6, 0x37, 0xac, 0x8a, 0xf4, 0x5b, 0xd7, 0xaa, 0xa7, 0xf2, 0x02, 0x89, + 0x95, 0x2a, 0xeb, 0xcb, 0x2e, 0x00, 0x7f, 0x09, 0xb6, 0x69, 0xfe, 0xee, 0x65, 0xe6, 0xae, 0xbf, + 0x66, 0x59, 0xde, 0x8c, 0x3b, 0xea, 0xdc, 0xdb, 0x05, 0x3f, 0x2a, 0x2e, 0xd6, 0xfb, 0x63, 0x0d, + 0x54, 0x29, 0x0b, 0x1c, 0x66, 0x15, 0x5d, 0xbc, 0xac, 0xa6, 0x71, 0x90, 0x53, 0xf3, 0xcb, 0x50, + 0x7b, 0xbd, 0xea, 0x67, 0x43, 0x91, 0x76, 0xa6, 0x3f, 0x7d, 0xfc, 0x30, 0x2b, 0xf9, 0x1f, 0x26, + 0x92, 0xbf, 0x2c, 0xe9, 0xfa, 0xa9, 0xdc, 0x5f, 0x8f, 0x4b, 0x85, 0x1b, 0xdf, 0x78, 0xfe, 0xa2, + 0xbb, 0xf4, 0xd9, 0x8b, 0xee, 0xd2, 0xe7, 0x2f, 0xba, 0x4b, 0xbf, 0x8a, 0xba, 0xb5, 0xe7, 0x51, + 0xb7, 0xf6, 0x59, 0xd4, 0xad, 0x7d, 0x1e, 0x75, 0x6b, 0x7f, 0x8f, 0xba, 0xb5, 0xdf, 0xfe, 0xa3, + 0xbb, 0xf4, 0xf1, 0xcd, 0x92, 0xdf, 0x71, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x43, 0xdf, 0xa6, + 0x7c, 0xf6, 0x15, 0x00, 0x00, } func (m *CronJob) Marshal() (dAtA []byte, err error) { @@ -1023,6 +1030,23 @@ func (m *JobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PodReplacementPolicy != nil { + i -= len(*m.PodReplacementPolicy) + copy(dAtA[i:], *m.PodReplacementPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PodReplacementPolicy))) + i-- + dAtA[i] = 0x72 + } + if m.MaxFailedIndexes != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxFailedIndexes)) + i-- + dAtA[i] = 0x68 + } + if m.BackoffLimitPerIndex != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.BackoffLimitPerIndex)) + i-- + dAtA[i] = 0x60 + } if m.PodFailurePolicy != nil { { size, err := m.PodFailurePolicy.MarshalToSizedBuffer(dAtA[:i]) @@ -1132,6 +1156,18 @@ func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Terminating != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Terminating)) + i-- + dAtA[i] = 0x58 + } + if m.FailedIndexes != nil { + i -= len(*m.FailedIndexes) + copy(dAtA[i:], *m.FailedIndexes) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailedIndexes))) + i-- + dAtA[i] = 0x52 + } if m.Ready != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.Ready)) i-- @@ -1645,6 +1681,16 @@ func (m *JobSpec) Size() (n int) { l = m.PodFailurePolicy.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.BackoffLimitPerIndex != nil { + n += 1 + sovGenerated(uint64(*m.BackoffLimitPerIndex)) + } + if m.MaxFailedIndexes != nil { + n += 1 + sovGenerated(uint64(*m.MaxFailedIndexes)) + } + if m.PodReplacementPolicy != nil { + l = len(*m.PodReplacementPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1680,6 +1726,13 @@ func (m *JobStatus) Size() (n int) { if m.Ready != nil { n += 1 + sovGenerated(uint64(*m.Ready)) } + if m.FailedIndexes != nil { + l = len(*m.FailedIndexes) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Terminating != nil { + n += 1 + sovGenerated(uint64(*m.Terminating)) + } return n } @@ -1913,6 +1966,9 @@ func (this *JobSpec) String() string { `CompletionMode:` + valueToStringGenerated(this.CompletionMode) + `,`, `Suspend:` + valueToStringGenerated(this.Suspend) + `,`, `PodFailurePolicy:` + strings.Replace(this.PodFailurePolicy.String(), "PodFailurePolicy", "PodFailurePolicy", 1) + `,`, + `BackoffLimitPerIndex:` + valueToStringGenerated(this.BackoffLimitPerIndex) + `,`, + `MaxFailedIndexes:` + valueToStringGenerated(this.MaxFailedIndexes) + `,`, + `PodReplacementPolicy:` + valueToStringGenerated(this.PodReplacementPolicy) + `,`, `}`, }, "") return s @@ -1936,6 +1992,8 @@ func (this *JobStatus) String() string { `CompletedIndexes:` + fmt.Sprintf("%v", this.CompletedIndexes) + `,`, `UncountedTerminatedPods:` + strings.Replace(this.UncountedTerminatedPods.String(), "UncountedTerminatedPods", "UncountedTerminatedPods", 1) + `,`, `Ready:` + valueToStringGenerated(this.Ready) + `,`, + `FailedIndexes:` + valueToStringGenerated(this.FailedIndexes) + `,`, + `Terminating:` + valueToStringGenerated(this.Terminating) + `,`, `}`, }, "") return s @@ -3527,6 +3585,79 @@ func (m *JobSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BackoffLimitPerIndex", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.BackoffLimitPerIndex = &v + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxFailedIndexes", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxFailedIndexes = &v + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodReplacementPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := PodReplacementPolicy(dAtA[iNdEx:postIndex]) + m.PodReplacementPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3828,6 +3959,59 @@ func (m *JobStatus) Unmarshal(dAtA []byte) error { } } m.Ready = &v + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FailedIndexes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.FailedIndexes = &s + iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Terminating", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Terminating = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/batch/v1/generated.proto b/tools/vendor/k8s.io/api/batch/v1/generated.proto index 181c79597..e1bef3a46 100644 --- a/tools/vendor/k8s.io/api/batch/v1/generated.proto +++ b/tools/vendor/k8s.io/api/batch/v1/generated.proto @@ -213,8 +213,8 @@ message JobSpec { // checked against the backoffLimit. This field cannot be used in combination // with restartPolicy=OnFailure. // - // This field is alpha-level. To use this field, you must enable the - // `JobPodFailurePolicy` feature gate (disabled by default). + // This field is beta-level. It can be used when the `JobPodFailurePolicy` + // feature gate is enabled (enabled by default). // +optional optional PodFailurePolicy podFailurePolicy = 11; @@ -223,6 +223,30 @@ message JobSpec { // +optional optional int32 backoffLimit = 7; + // Specifies the limit for the number of retries within an + // index before marking this index as failed. When enabled the number of + // failures per index is kept in the pod's + // batch.kubernetes.io/job-index-failure-count annotation. It can only + // be set when Job's completionMode=Indexed, and the Pod's restart + // policy is Never. The field is immutable. + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + optional int32 backoffLimitPerIndex = 12; + + // Specifies the maximal number of failed indexes before marking the Job as + // failed, when backoffLimitPerIndex is set. Once the number of failed + // indexes exceeds this number the entire Job is marked as Failed and its + // execution is terminated. When left as null the job continues execution of + // all of its indexes and is marked with the `Complete` Job condition. + // It can only be specified when backoffLimitPerIndex is set. + // It can be null or up to completions. It is required and must be + // less than or equal to 10^4 when is completions greater than 10^5. + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + optional int32 maxFailedIndexes = 13; + // A label query over pods that should match the pod count. // Normally, the system sets this field for you. // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors @@ -292,6 +316,19 @@ message JobSpec { // // +optional optional bool suspend = 10; + + // podReplacementPolicy specifies when to create replacement Pods. + // Possible values are: + // - TerminatingOrFailed means that we recreate pods + // when they are terminating (has a metadata.deletionTimestamp) or failed. + // - Failed means to wait until a previously created Pod is fully terminated (has phase + // Failed or Succeeded) before creating a replacement Pod. + // + // When using podFailurePolicy, Failed is the the only allowed value. + // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. + // This is an alpha field. Enable JobPodReplacementPolicy to be able to use this field. + // +optional + optional string podReplacementPolicy = 14; } // JobStatus represents the current state of a Job. @@ -335,6 +372,14 @@ message JobStatus { // +optional optional int32 failed = 6; + // The number of pods which are terminating (in phase Pending or Running + // and have a deletionTimestamp). + // + // This field is alpha-level. The job controller populates the field when + // the feature gate JobPodReplacementPolicy is enabled (disabled by default). + // +optional + optional int32 terminating = 11; + // completedIndexes holds the completed indexes when .spec.completionMode = // "Indexed" in a text format. The indexes are represented as decimal integers // separated by commas. The numbers are listed in increasing order. Three or @@ -345,6 +390,19 @@ message JobStatus { // +optional optional string completedIndexes = 7; + // FailedIndexes holds the failed indexes when backoffLimitPerIndex=true. + // The indexes are represented in the text format analogous as for the + // `completedIndexes` field, ie. they are kept as decimal integers + // separated by commas. The numbers are listed in increasing order. Three or + // more consecutive numbers are compressed and represented by the first and + // last element of the series, separated by a hyphen. + // For example, if the failed indexes are 1, 3, 4, 5 and 7, they are + // represented as "1,3-5,7". + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + optional string failedIndexes = 10; + // uncountedTerminatedPods holds the UIDs of Pods that have terminated but // the job controller hasn't yet accounted for in the status counters. // @@ -452,6 +510,10 @@ message PodFailurePolicyRule { // // - FailJob: indicates that the pod's job is marked as Failed and all // running pods are terminated. + // - FailIndex: indicates that the pod's index is marked as Failed and will + // not be restarted. + // This value is alpha-level. It can be used when the + // `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default). // - Ignore: indicates that the counter towards the .backoffLimit is not // incremented and a replacement pod is created. // - Count: indicates that the pod is handled in the default way - the diff --git a/tools/vendor/k8s.io/api/batch/v1/types.go b/tools/vendor/k8s.io/api/batch/v1/types.go index 346676b09..883d193aa 100644 --- a/tools/vendor/k8s.io/api/batch/v1/types.go +++ b/tools/vendor/k8s.io/api/batch/v1/types.go @@ -27,6 +27,11 @@ const ( // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#label-selector-and-annotation-conventions labelPrefix = "batch.kubernetes.io/" + // CronJobScheduledTimestampAnnotation is the scheduled timestamp annotation for the Job. + // It records the original/expected scheduled timestamp for the running job, represented in RFC3339. + // The CronJob controller adds this annotation if the CronJobsScheduledAnnotation feature gate (beta in 1.28) is enabled. + CronJobScheduledTimestampAnnotation = labelPrefix + "cronjob-scheduled-timestamp" + JobCompletionIndexAnnotation = labelPrefix + "job-completion-index" // JobTrackingFinalizer is a finalizer for Job's pods. It prevents them from // being deleted before being accounted in the Job status. @@ -45,6 +50,13 @@ const ( // ControllerUid is used to programatically get pods corresponding to a Job. // There is a corresponding label without the batch.kubernetes.io that we support for legacy reasons. ControllerUidLabel = labelPrefix + "controller-uid" + // Annotation indicating the number of failures for the index corresponding + // to the pod, which are counted towards the backoff limit. + JobIndexFailureCountAnnotation = labelPrefix + "job-index-failure-count" + // Annotation indicating the number of failures for the index corresponding + // to the pod, which don't count towards the backoff limit, according to the + // pod failure policy. When the annotation is absent zero is implied. + JobIndexIgnoredFailureCountAnnotation = labelPrefix + "job-index-ignored-failure-count" ) // +genclient @@ -109,6 +121,11 @@ const ( // pod's job as Failed and terminate all running pods. PodFailurePolicyActionFailJob PodFailurePolicyAction = "FailJob" + // This is an action which might be taken on a pod failure - mark the + // Job's index as failed to avoid restarts within this index. This action + // can only be used when backoffLimitPerIndex is set. + PodFailurePolicyActionFailIndex PodFailurePolicyAction = "FailIndex" + // This is an action which might be taken on a pod failure - the counter towards // .backoffLimit, represented by the job's .status.failed field, is not // incremented and a replacement pod is created. @@ -128,6 +145,19 @@ const ( PodFailurePolicyOnExitCodesOpNotIn PodFailurePolicyOnExitCodesOperator = "NotIn" ) +// PodReplacementPolicy specifies the policy for creating pod replacements. +// +enum +type PodReplacementPolicy string + +const ( + // TerminatingOrFailed means that we recreate pods + // when they are terminating (has a metadata.deletionTimestamp) or failed. + TerminatingOrFailed PodReplacementPolicy = "TerminatingOrFailed" + // Failed means to wait until a previously created Pod is fully terminated (has phase + // Failed or Succeeded) before creating a replacement Pod. + Failed PodReplacementPolicy = "Failed" +) + // PodFailurePolicyOnExitCodesRequirement describes the requirement for handling // a failed pod based on its container exit codes. In particular, it lookups the // .state.terminated.exitCode for each app container and init container status, @@ -186,6 +216,10 @@ type PodFailurePolicyRule struct { // // - FailJob: indicates that the pod's job is marked as Failed and all // running pods are terminated. + // - FailIndex: indicates that the pod's index is marked as Failed and will + // not be restarted. + // This value is alpha-level. It can be used when the + // `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default). // - Ignore: indicates that the counter towards the .backoffLimit is not // incremented and a replacement pod is created. // - Count: indicates that the pod is handled in the default way - the @@ -252,8 +286,8 @@ type JobSpec struct { // checked against the backoffLimit. This field cannot be used in combination // with restartPolicy=OnFailure. // - // This field is alpha-level. To use this field, you must enable the - // `JobPodFailurePolicy` feature gate (disabled by default). + // This field is beta-level. It can be used when the `JobPodFailurePolicy` + // feature gate is enabled (enabled by default). // +optional PodFailurePolicy *PodFailurePolicy `json:"podFailurePolicy,omitempty" protobuf:"bytes,11,opt,name=podFailurePolicy"` @@ -262,6 +296,30 @@ type JobSpec struct { // +optional BackoffLimit *int32 `json:"backoffLimit,omitempty" protobuf:"varint,7,opt,name=backoffLimit"` + // Specifies the limit for the number of retries within an + // index before marking this index as failed. When enabled the number of + // failures per index is kept in the pod's + // batch.kubernetes.io/job-index-failure-count annotation. It can only + // be set when Job's completionMode=Indexed, and the Pod's restart + // policy is Never. The field is immutable. + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + BackoffLimitPerIndex *int32 `json:"backoffLimitPerIndex,omitempty" protobuf:"varint,12,opt,name=backoffLimitPerIndex"` + + // Specifies the maximal number of failed indexes before marking the Job as + // failed, when backoffLimitPerIndex is set. Once the number of failed + // indexes exceeds this number the entire Job is marked as Failed and its + // execution is terminated. When left as null the job continues execution of + // all of its indexes and is marked with the `Complete` Job condition. + // It can only be specified when backoffLimitPerIndex is set. + // It can be null or up to completions. It is required and must be + // less than or equal to 10^4 when is completions greater than 10^5. + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + MaxFailedIndexes *int32 `json:"maxFailedIndexes,omitempty" protobuf:"varint,13,opt,name=maxFailedIndexes"` + // TODO enabled it when https://github.com/kubernetes/kubernetes/issues/28486 has been fixed // Optional number of failed pods to retain. // +optional @@ -336,6 +394,19 @@ type JobSpec struct { // // +optional Suspend *bool `json:"suspend,omitempty" protobuf:"varint,10,opt,name=suspend"` + + // podReplacementPolicy specifies when to create replacement Pods. + // Possible values are: + // - TerminatingOrFailed means that we recreate pods + // when they are terminating (has a metadata.deletionTimestamp) or failed. + // - Failed means to wait until a previously created Pod is fully terminated (has phase + // Failed or Succeeded) before creating a replacement Pod. + // + // When using podFailurePolicy, Failed is the the only allowed value. + // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. + // This is an alpha field. Enable JobPodReplacementPolicy to be able to use this field. + // +optional + PodReplacementPolicy *PodReplacementPolicy `json:"podReplacementPolicy,omitempty" protobuf:"bytes,14,opt,name=podReplacementPolicy,casttype=podReplacementPolicy"` } // JobStatus represents the current state of a Job. @@ -379,6 +450,14 @@ type JobStatus struct { // +optional Failed int32 `json:"failed,omitempty" protobuf:"varint,6,opt,name=failed"` + // The number of pods which are terminating (in phase Pending or Running + // and have a deletionTimestamp). + // + // This field is alpha-level. The job controller populates the field when + // the feature gate JobPodReplacementPolicy is enabled (disabled by default). + // +optional + Terminating *int32 `json:"terminating,omitempty" protobuf:"varint,11,opt,name=terminating"` + // completedIndexes holds the completed indexes when .spec.completionMode = // "Indexed" in a text format. The indexes are represented as decimal integers // separated by commas. The numbers are listed in increasing order. Three or @@ -389,6 +468,19 @@ type JobStatus struct { // +optional CompletedIndexes string `json:"completedIndexes,omitempty" protobuf:"bytes,7,opt,name=completedIndexes"` + // FailedIndexes holds the failed indexes when backoffLimitPerIndex=true. + // The indexes are represented in the text format analogous as for the + // `completedIndexes` field, ie. they are kept as decimal integers + // separated by commas. The numbers are listed in increasing order. Three or + // more consecutive numbers are compressed and represented by the first and + // last element of the series, separated by a hyphen. + // For example, if the failed indexes are 1, 3, 4, 5 and 7, they are + // represented as "1,3-5,7". + // This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` + // feature gate is enabled (disabled by default). + // +optional + FailedIndexes *string `json:"failedIndexes,omitempty" protobuf:"bytes,10,opt,name=failedIndexes"` + // uncountedTerminatedPods holds the UIDs of Pods that have terminated but // the job controller hasn't yet accounted for in the status counters. // diff --git a/tools/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index 1f28f006c..43b4e1e7d 100644 --- a/tools/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -115,14 +115,17 @@ var map_JobSpec = map[string]string{ "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to null means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", - "podFailurePolicy": "Specifies the policy of handling failed pods. In particular, it allows to specify the set of actions and conditions which need to be satisfied to take the associated action. If empty, the default behaviour applies - the counter of failed pods, represented by the jobs's .status.failed field, is incremented and it is checked against the backoffLimit. This field cannot be used in combination with restartPolicy=OnFailure.\n\nThis field is alpha-level. To use this field, you must enable the `JobPodFailurePolicy` feature gate (disabled by default).", + "podFailurePolicy": "Specifies the policy of handling failed pods. In particular, it allows to specify the set of actions and conditions which need to be satisfied to take the associated action. If empty, the default behaviour applies - the counter of failed pods, represented by the jobs's .status.failed field, is incremented and it is checked against the backoffLimit. This field cannot be used in combination with restartPolicy=OnFailure.\n\nThis field is beta-level. It can be used when the `JobPodFailurePolicy` feature gate is enabled (enabled by default).", "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", + "backoffLimitPerIndex": "Specifies the limit for the number of retries within an index before marking this index as failed. When enabled the number of failures per index is kept in the pod's batch.kubernetes.io/job-index-failure-count annotation. It can only be set when Job's completionMode=Indexed, and the Pod's restart policy is Never. The field is immutable. This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default).", + "maxFailedIndexes": "Specifies the maximal number of failed indexes before marking the Job as failed, when backoffLimitPerIndex is set. Once the number of failed indexes exceeds this number the entire Job is marked as Failed and its execution is terminated. When left as null the job continues execution of all of its indexes and is marked with the `Complete` Job condition. It can only be specified when backoffLimitPerIndex is set. It can be null or up to completions. It is required and must be less than or equal to 10^4 when is completions greater than 10^5. This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default).", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", "template": "Describes the pod that will be created when executing a job. The only allowed template.spec.restartPolicy values are \"Never\" or \"OnFailure\". More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "ttlSecondsAfterFinished": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes.", "completionMode": "completionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other.\n\n`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job.", "suspend": "suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false.", + "podReplacementPolicy": "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. This is an alpha field. Enable JobPodReplacementPolicy to be able to use this field.", } func (JobSpec) SwaggerDoc() map[string]string { @@ -137,7 +140,9 @@ var map_JobStatus = map[string]string{ "active": "The number of pending and running pods.", "succeeded": "The number of pods which reached phase Succeeded.", "failed": "The number of pods which reached phase Failed.", + "terminating": "The number of pods which are terminating (in phase Pending or Running and have a deletionTimestamp).\n\nThis field is alpha-level. The job controller populates the field when the feature gate JobPodReplacementPolicy is enabled (disabled by default).", "completedIndexes": "completedIndexes holds the completed indexes when .spec.completionMode = \"Indexed\" in a text format. The indexes are represented as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the completed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\".", + "failedIndexes": "FailedIndexes holds the failed indexes when backoffLimitPerIndex=true. The indexes are represented in the text format analogous as for the `completedIndexes` field, ie. they are kept as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the failed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\". This field is alpha-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default).", "uncountedTerminatedPods": "uncountedTerminatedPods holds the UIDs of Pods that have terminated but the job controller hasn't yet accounted for in the status counters.\n\nThe job controller creates pods with a finalizer. When a pod terminates (succeeded or failed), the controller does three steps to account for it in the job status:\n\n1. Add the pod UID to the arrays in this field. 2. Remove the pod finalizer. 3. Remove the pod UID from the arrays while increasing the corresponding\n counter.\n\nOld jobs might not be tracked using this field, in which case the field remains null.", "ready": "The number of pods which have a Ready condition.\n\nThis field is beta-level. The job controller populates the field when the feature gate JobReadyPods is enabled (enabled by default).", } @@ -188,7 +193,7 @@ func (PodFailurePolicyOnPodConditionsPattern) SwaggerDoc() map[string]string { var map_PodFailurePolicyRule = map[string]string{ "": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of onExitCodes and onPodConditions, but not both, can be used in each rule.", - "action": "Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are:\n\n- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule.", + "action": "Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are:\n\n- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- FailIndex: indicates that the pod's index is marked as Failed and will\n not be restarted.\n This value is alpha-level. It can be used when the\n `JobBackoffLimitPerIndex` feature gate is enabled (disabled by default).\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule.", "onExitCodes": "Represents the requirement on the container exit codes.", "onPodConditions": "Represents the requirement on the pod conditions. The requirement is represented as a list of pod condition patterns. The requirement is satisfied if at least one pattern matches an actual pod condition. At most 20 elements are allowed.", } diff --git a/tools/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go index 2a901e9d0..43fc41515 100644 --- a/tools/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -267,6 +267,16 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = new(int32) **out = **in } + if in.BackoffLimitPerIndex != nil { + in, out := &in.BackoffLimitPerIndex, &out.BackoffLimitPerIndex + *out = new(int32) + **out = **in + } + if in.MaxFailedIndexes != nil { + in, out := &in.MaxFailedIndexes, &out.MaxFailedIndexes + *out = new(int32) + **out = **in + } if in.Selector != nil { in, out := &in.Selector, &out.Selector *out = new(metav1.LabelSelector) @@ -293,6 +303,11 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = new(bool) **out = **in } + if in.PodReplacementPolicy != nil { + in, out := &in.PodReplacementPolicy, &out.PodReplacementPolicy + *out = new(PodReplacementPolicy) + **out = **in + } return } @@ -324,6 +339,16 @@ func (in *JobStatus) DeepCopyInto(out *JobStatus) { in, out := &in.CompletionTime, &out.CompletionTime *out = (*in).DeepCopy() } + if in.Terminating != nil { + in, out := &in.Terminating, &out.Terminating + *out = new(int32) + **out = **in + } + if in.FailedIndexes != nil { + in, out := &in.FailedIndexes, &out.FailedIndexes + *out = new(string) + **out = **in + } if in.UncountedTerminatedPods != nil { in, out := &in.UncountedTerminatedPods, &out.UncountedTerminatedPods *out = new(UncountedTerminatedPods) diff --git a/tools/vendor/k8s.io/api/core/v1/annotation_key_constants.go b/tools/vendor/k8s.io/api/core/v1/annotation_key_constants.go index 61f86f850..106ba14c3 100644 --- a/tools/vendor/k8s.io/api/core/v1/annotation_key_constants.go +++ b/tools/vendor/k8s.io/api/core/v1/annotation_key_constants.go @@ -56,9 +56,9 @@ const ( // AppArmorBetaContainerAnnotationKeyPrefix is the prefix to an annotation key specifying a container's apparmor profile. AppArmorBetaContainerAnnotationKeyPrefix = "container.apparmor.security.beta.kubernetes.io/" - // AppArmorBetaDefaultProfileAnnotatoinKey is the annotation key specifying the default AppArmor profile. + // AppArmorBetaDefaultProfileAnnotationKey is the annotation key specifying the default AppArmor profile. AppArmorBetaDefaultProfileAnnotationKey = "apparmor.security.beta.kubernetes.io/defaultProfileName" - // AppArmorBetaAllowedProfileAnnotationKey is the annotation key specifying the allowed AppArmor profiles. + // AppArmorBetaAllowedProfilesAnnotationKey is the annotation key specifying the allowed AppArmor profiles. AppArmorBetaAllowedProfilesAnnotationKey = "apparmor.security.beta.kubernetes.io/allowedProfileNames" // AppArmorBetaProfileRuntimeDefault is the profile specifying the runtime default. @@ -78,7 +78,7 @@ const ( // in the Annotations of a Node. PreferAvoidPodsAnnotationKey string = "scheduler.alpha.kubernetes.io/preferAvoidPods" - // ObjectTTLAnnotations represents a suggestion for kubelet for how long it can cache + // ObjectTTLAnnotationKey represents a suggestion for kubelet for how long it can cache // an object (e.g. secret, config map) before fetching it again from apiserver. // This annotation can be attached to node. ObjectTTLAnnotationKey string = "node.alpha.kubernetes.io/ttl" diff --git a/tools/vendor/k8s.io/api/core/v1/generated.pb.go b/tools/vendor/k8s.io/api/core/v1/generated.pb.go index c76646296..c267a5feb 100644 --- a/tools/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/tools/vendor/k8s.io/api/core/v1/generated.pb.go @@ -1981,10 +1981,38 @@ func (m *HostAlias) XXX_DiscardUnknown() { var xxx_messageInfo_HostAlias proto.InternalMessageInfo +func (m *HostIP) Reset() { *m = HostIP{} } +func (*HostIP) ProtoMessage() {} +func (*HostIP) Descriptor() ([]byte, []int) { + return fileDescriptor_83c10c24ec417dc9, []int{69} +} +func (m *HostIP) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HostIP) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *HostIP) XXX_Merge(src proto.Message) { + xxx_messageInfo_HostIP.Merge(m, src) +} +func (m *HostIP) XXX_Size() int { + return m.Size() +} +func (m *HostIP) XXX_DiscardUnknown() { + xxx_messageInfo_HostIP.DiscardUnknown(m) +} + +var xxx_messageInfo_HostIP proto.InternalMessageInfo + func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{69} + return fileDescriptor_83c10c24ec417dc9, []int{70} } func (m *HostPathVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2012,7 +2040,7 @@ var xxx_messageInfo_HostPathVolumeSource proto.InternalMessageInfo func (m *ISCSIPersistentVolumeSource) Reset() { *m = ISCSIPersistentVolumeSource{} } func (*ISCSIPersistentVolumeSource) ProtoMessage() {} func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{70} + return fileDescriptor_83c10c24ec417dc9, []int{71} } func (m *ISCSIPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2040,7 +2068,7 @@ var xxx_messageInfo_ISCSIPersistentVolumeSource proto.InternalMessageInfo func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{71} + return fileDescriptor_83c10c24ec417dc9, []int{72} } func (m *ISCSIVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2068,7 +2096,7 @@ var xxx_messageInfo_ISCSIVolumeSource proto.InternalMessageInfo func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} func (*KeyToPath) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{72} + return fileDescriptor_83c10c24ec417dc9, []int{73} } func (m *KeyToPath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2096,7 +2124,7 @@ var xxx_messageInfo_KeyToPath proto.InternalMessageInfo func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} func (*Lifecycle) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{73} + return fileDescriptor_83c10c24ec417dc9, []int{74} } func (m *Lifecycle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2124,7 +2152,7 @@ var xxx_messageInfo_Lifecycle proto.InternalMessageInfo func (m *LifecycleHandler) Reset() { *m = LifecycleHandler{} } func (*LifecycleHandler) ProtoMessage() {} func (*LifecycleHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{74} + return fileDescriptor_83c10c24ec417dc9, []int{75} } func (m *LifecycleHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2152,7 +2180,7 @@ var xxx_messageInfo_LifecycleHandler proto.InternalMessageInfo func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} func (*LimitRange) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{75} + return fileDescriptor_83c10c24ec417dc9, []int{76} } func (m *LimitRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2208,7 @@ var xxx_messageInfo_LimitRange proto.InternalMessageInfo func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} func (*LimitRangeItem) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{76} + return fileDescriptor_83c10c24ec417dc9, []int{77} } func (m *LimitRangeItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2208,7 +2236,7 @@ var xxx_messageInfo_LimitRangeItem proto.InternalMessageInfo func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} func (*LimitRangeList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{77} + return fileDescriptor_83c10c24ec417dc9, []int{78} } func (m *LimitRangeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2236,7 +2264,7 @@ var xxx_messageInfo_LimitRangeList proto.InternalMessageInfo func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} func (*LimitRangeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{78} + return fileDescriptor_83c10c24ec417dc9, []int{79} } func (m *LimitRangeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2264,7 +2292,7 @@ var xxx_messageInfo_LimitRangeSpec proto.InternalMessageInfo func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{79} + return fileDescriptor_83c10c24ec417dc9, []int{80} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2292,7 +2320,7 @@ var xxx_messageInfo_List proto.InternalMessageInfo func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{80} + return fileDescriptor_83c10c24ec417dc9, []int{81} } func (m *LoadBalancerIngress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2320,7 +2348,7 @@ var xxx_messageInfo_LoadBalancerIngress proto.InternalMessageInfo func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{81} + return fileDescriptor_83c10c24ec417dc9, []int{82} } func (m *LoadBalancerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2348,7 +2376,7 @@ var xxx_messageInfo_LoadBalancerStatus proto.InternalMessageInfo func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} func (*LocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{82} + return fileDescriptor_83c10c24ec417dc9, []int{83} } func (m *LocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2376,7 +2404,7 @@ var xxx_messageInfo_LocalObjectReference proto.InternalMessageInfo func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} func (*LocalVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{83} + return fileDescriptor_83c10c24ec417dc9, []int{84} } func (m *LocalVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2404,7 +2432,7 @@ var xxx_messageInfo_LocalVolumeSource proto.InternalMessageInfo func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{84} + return fileDescriptor_83c10c24ec417dc9, []int{85} } func (m *NFSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2432,7 +2460,7 @@ var xxx_messageInfo_NFSVolumeSource proto.InternalMessageInfo func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{85} + return fileDescriptor_83c10c24ec417dc9, []int{86} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2488,7 @@ var xxx_messageInfo_Namespace proto.InternalMessageInfo func (m *NamespaceCondition) Reset() { *m = NamespaceCondition{} } func (*NamespaceCondition) ProtoMessage() {} func (*NamespaceCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{86} + return fileDescriptor_83c10c24ec417dc9, []int{87} } func (m *NamespaceCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2488,7 +2516,7 @@ var xxx_messageInfo_NamespaceCondition proto.InternalMessageInfo func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} func (*NamespaceList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{87} + return fileDescriptor_83c10c24ec417dc9, []int{88} } func (m *NamespaceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2516,7 +2544,7 @@ var xxx_messageInfo_NamespaceList proto.InternalMessageInfo func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{88} + return fileDescriptor_83c10c24ec417dc9, []int{89} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2572,7 @@ var xxx_messageInfo_NamespaceSpec proto.InternalMessageInfo func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} func (*NamespaceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{89} + return fileDescriptor_83c10c24ec417dc9, []int{90} } func (m *NamespaceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2572,7 +2600,7 @@ var xxx_messageInfo_NamespaceStatus proto.InternalMessageInfo func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{90} + return fileDescriptor_83c10c24ec417dc9, []int{91} } func (m *Node) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2628,7 @@ var xxx_messageInfo_Node proto.InternalMessageInfo func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{91} + return fileDescriptor_83c10c24ec417dc9, []int{92} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2628,7 +2656,7 @@ var xxx_messageInfo_NodeAddress proto.InternalMessageInfo func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} func (*NodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{92} + return fileDescriptor_83c10c24ec417dc9, []int{93} } func (m *NodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2684,7 @@ var xxx_messageInfo_NodeAffinity proto.InternalMessageInfo func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} func (*NodeCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{93} + return fileDescriptor_83c10c24ec417dc9, []int{94} } func (m *NodeCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2684,7 +2712,7 @@ var xxx_messageInfo_NodeCondition proto.InternalMessageInfo func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} func (*NodeConfigSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{94} + return fileDescriptor_83c10c24ec417dc9, []int{95} } func (m *NodeConfigSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2712,7 +2740,7 @@ var xxx_messageInfo_NodeConfigSource proto.InternalMessageInfo func (m *NodeConfigStatus) Reset() { *m = NodeConfigStatus{} } func (*NodeConfigStatus) ProtoMessage() {} func (*NodeConfigStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{95} + return fileDescriptor_83c10c24ec417dc9, []int{96} } func (m *NodeConfigStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2768,7 @@ var xxx_messageInfo_NodeConfigStatus proto.InternalMessageInfo func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{96} + return fileDescriptor_83c10c24ec417dc9, []int{97} } func (m *NodeDaemonEndpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2796,7 @@ var xxx_messageInfo_NodeDaemonEndpoints proto.InternalMessageInfo func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} func (*NodeList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{97} + return fileDescriptor_83c10c24ec417dc9, []int{98} } func (m *NodeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2796,7 +2824,7 @@ var xxx_messageInfo_NodeList proto.InternalMessageInfo func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} func (*NodeProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{98} + return fileDescriptor_83c10c24ec417dc9, []int{99} } func (m *NodeProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2824,7 +2852,7 @@ var xxx_messageInfo_NodeProxyOptions proto.InternalMessageInfo func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} func (*NodeResources) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{99} + return fileDescriptor_83c10c24ec417dc9, []int{100} } func (m *NodeResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2852,7 +2880,7 @@ var xxx_messageInfo_NodeResources proto.InternalMessageInfo func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} func (*NodeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{100} + return fileDescriptor_83c10c24ec417dc9, []int{101} } func (m *NodeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2880,7 +2908,7 @@ var xxx_messageInfo_NodeSelector proto.InternalMessageInfo func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{101} + return fileDescriptor_83c10c24ec417dc9, []int{102} } func (m *NodeSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2908,7 +2936,7 @@ var xxx_messageInfo_NodeSelectorRequirement proto.InternalMessageInfo func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{102} + return fileDescriptor_83c10c24ec417dc9, []int{103} } func (m *NodeSelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +2964,7 @@ var xxx_messageInfo_NodeSelectorTerm proto.InternalMessageInfo func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} func (*NodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{103} + return fileDescriptor_83c10c24ec417dc9, []int{104} } func (m *NodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2964,7 +2992,7 @@ var xxx_messageInfo_NodeSpec proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{104} + return fileDescriptor_83c10c24ec417dc9, []int{105} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2992,7 +3020,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{105} + return fileDescriptor_83c10c24ec417dc9, []int{106} } func (m *NodeSystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3020,7 +3048,7 @@ var xxx_messageInfo_NodeSystemInfo proto.InternalMessageInfo func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{106} + return fileDescriptor_83c10c24ec417dc9, []int{107} } func (m *ObjectFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3048,7 +3076,7 @@ var xxx_messageInfo_ObjectFieldSelector proto.InternalMessageInfo func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} func (*ObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{107} + return fileDescriptor_83c10c24ec417dc9, []int{108} } func (m *ObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3076,7 +3104,7 @@ var xxx_messageInfo_ObjectReference proto.InternalMessageInfo func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} func (*PersistentVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{108} + return fileDescriptor_83c10c24ec417dc9, []int{109} } func (m *PersistentVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3104,7 +3132,7 @@ var xxx_messageInfo_PersistentVolume proto.InternalMessageInfo func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{109} + return fileDescriptor_83c10c24ec417dc9, []int{110} } func (m *PersistentVolumeClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3132,7 +3160,7 @@ var xxx_messageInfo_PersistentVolumeClaim proto.InternalMessageInfo func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } func (*PersistentVolumeClaimCondition) ProtoMessage() {} func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{110} + return fileDescriptor_83c10c24ec417dc9, []int{111} } func (m *PersistentVolumeClaimCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3160,7 +3188,7 @@ var xxx_messageInfo_PersistentVolumeClaimCondition proto.InternalMessageInfo func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{111} + return fileDescriptor_83c10c24ec417dc9, []int{112} } func (m *PersistentVolumeClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,7 +3216,7 @@ var xxx_messageInfo_PersistentVolumeClaimList proto.InternalMessageInfo func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{112} + return fileDescriptor_83c10c24ec417dc9, []int{113} } func (m *PersistentVolumeClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3216,7 +3244,7 @@ var xxx_messageInfo_PersistentVolumeClaimSpec proto.InternalMessageInfo func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{113} + return fileDescriptor_83c10c24ec417dc9, []int{114} } func (m *PersistentVolumeClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3244,7 +3272,7 @@ var xxx_messageInfo_PersistentVolumeClaimStatus proto.InternalMessageInfo func (m *PersistentVolumeClaimTemplate) Reset() { *m = PersistentVolumeClaimTemplate{} } func (*PersistentVolumeClaimTemplate) ProtoMessage() {} func (*PersistentVolumeClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{114} + return fileDescriptor_83c10c24ec417dc9, []int{115} } func (m *PersistentVolumeClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3272,7 +3300,7 @@ var xxx_messageInfo_PersistentVolumeClaimTemplate proto.InternalMessageInfo func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{115} + return fileDescriptor_83c10c24ec417dc9, []int{116} } func (m *PersistentVolumeClaimVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3328,7 @@ var xxx_messageInfo_PersistentVolumeClaimVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} func (*PersistentVolumeList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{116} + return fileDescriptor_83c10c24ec417dc9, []int{117} } func (m *PersistentVolumeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3328,7 +3356,7 @@ var xxx_messageInfo_PersistentVolumeList proto.InternalMessageInfo func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{117} + return fileDescriptor_83c10c24ec417dc9, []int{118} } func (m *PersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3356,7 +3384,7 @@ var xxx_messageInfo_PersistentVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{118} + return fileDescriptor_83c10c24ec417dc9, []int{119} } func (m *PersistentVolumeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3412,7 @@ var xxx_messageInfo_PersistentVolumeSpec proto.InternalMessageInfo func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{119} + return fileDescriptor_83c10c24ec417dc9, []int{120} } func (m *PersistentVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3412,7 +3440,7 @@ var xxx_messageInfo_PersistentVolumeStatus proto.InternalMessageInfo func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{120} + return fileDescriptor_83c10c24ec417dc9, []int{121} } func (m *PhotonPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3440,7 +3468,7 @@ var xxx_messageInfo_PhotonPersistentDiskVolumeSource proto.InternalMessageInfo func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} func (*Pod) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{121} + return fileDescriptor_83c10c24ec417dc9, []int{122} } func (m *Pod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3468,7 +3496,7 @@ var xxx_messageInfo_Pod proto.InternalMessageInfo func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} func (*PodAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{122} + return fileDescriptor_83c10c24ec417dc9, []int{123} } func (m *PodAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3524,7 @@ var xxx_messageInfo_PodAffinity proto.InternalMessageInfo func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} func (*PodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{123} + return fileDescriptor_83c10c24ec417dc9, []int{124} } func (m *PodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3524,7 +3552,7 @@ var xxx_messageInfo_PodAffinityTerm proto.InternalMessageInfo func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} func (*PodAntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{124} + return fileDescriptor_83c10c24ec417dc9, []int{125} } func (m *PodAntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3552,7 +3580,7 @@ var xxx_messageInfo_PodAntiAffinity proto.InternalMessageInfo func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} func (*PodAttachOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{125} + return fileDescriptor_83c10c24ec417dc9, []int{126} } func (m *PodAttachOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3580,7 +3608,7 @@ var xxx_messageInfo_PodAttachOptions proto.InternalMessageInfo func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} func (*PodCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{126} + return fileDescriptor_83c10c24ec417dc9, []int{127} } func (m *PodCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3608,7 +3636,7 @@ var xxx_messageInfo_PodCondition proto.InternalMessageInfo func (m *PodDNSConfig) Reset() { *m = PodDNSConfig{} } func (*PodDNSConfig) ProtoMessage() {} func (*PodDNSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{127} + return fileDescriptor_83c10c24ec417dc9, []int{128} } func (m *PodDNSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3636,7 +3664,7 @@ var xxx_messageInfo_PodDNSConfig proto.InternalMessageInfo func (m *PodDNSConfigOption) Reset() { *m = PodDNSConfigOption{} } func (*PodDNSConfigOption) ProtoMessage() {} func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{128} + return fileDescriptor_83c10c24ec417dc9, []int{129} } func (m *PodDNSConfigOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3664,7 +3692,7 @@ var xxx_messageInfo_PodDNSConfigOption proto.InternalMessageInfo func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} func (*PodExecOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{129} + return fileDescriptor_83c10c24ec417dc9, []int{130} } func (m *PodExecOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3692,7 +3720,7 @@ var xxx_messageInfo_PodExecOptions proto.InternalMessageInfo func (m *PodIP) Reset() { *m = PodIP{} } func (*PodIP) ProtoMessage() {} func (*PodIP) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{130} + return fileDescriptor_83c10c24ec417dc9, []int{131} } func (m *PodIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3720,7 +3748,7 @@ var xxx_messageInfo_PodIP proto.InternalMessageInfo func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} func (*PodList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{131} + return fileDescriptor_83c10c24ec417dc9, []int{132} } func (m *PodList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3748,7 +3776,7 @@ var xxx_messageInfo_PodList proto.InternalMessageInfo func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} func (*PodLogOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{132} + return fileDescriptor_83c10c24ec417dc9, []int{133} } func (m *PodLogOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3776,7 +3804,7 @@ var xxx_messageInfo_PodLogOptions proto.InternalMessageInfo func (m *PodOS) Reset() { *m = PodOS{} } func (*PodOS) ProtoMessage() {} func (*PodOS) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{133} + return fileDescriptor_83c10c24ec417dc9, []int{134} } func (m *PodOS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3804,7 +3832,7 @@ var xxx_messageInfo_PodOS proto.InternalMessageInfo func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{134} + return fileDescriptor_83c10c24ec417dc9, []int{135} } func (m *PodPortForwardOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3832,7 +3860,7 @@ var xxx_messageInfo_PodPortForwardOptions proto.InternalMessageInfo func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} func (*PodProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{135} + return fileDescriptor_83c10c24ec417dc9, []int{136} } func (m *PodProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3860,7 +3888,7 @@ var xxx_messageInfo_PodProxyOptions proto.InternalMessageInfo func (m *PodReadinessGate) Reset() { *m = PodReadinessGate{} } func (*PodReadinessGate) ProtoMessage() {} func (*PodReadinessGate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{136} + return fileDescriptor_83c10c24ec417dc9, []int{137} } func (m *PodReadinessGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3888,7 +3916,7 @@ var xxx_messageInfo_PodReadinessGate proto.InternalMessageInfo func (m *PodResourceClaim) Reset() { *m = PodResourceClaim{} } func (*PodResourceClaim) ProtoMessage() {} func (*PodResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{137} + return fileDescriptor_83c10c24ec417dc9, []int{138} } func (m *PodResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3913,10 +3941,38 @@ func (m *PodResourceClaim) XXX_DiscardUnknown() { var xxx_messageInfo_PodResourceClaim proto.InternalMessageInfo +func (m *PodResourceClaimStatus) Reset() { *m = PodResourceClaimStatus{} } +func (*PodResourceClaimStatus) ProtoMessage() {} +func (*PodResourceClaimStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_83c10c24ec417dc9, []int{139} +} +func (m *PodResourceClaimStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodResourceClaimStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodResourceClaimStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodResourceClaimStatus.Merge(m, src) +} +func (m *PodResourceClaimStatus) XXX_Size() int { + return m.Size() +} +func (m *PodResourceClaimStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodResourceClaimStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodResourceClaimStatus proto.InternalMessageInfo + func (m *PodSchedulingGate) Reset() { *m = PodSchedulingGate{} } func (*PodSchedulingGate) ProtoMessage() {} func (*PodSchedulingGate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{138} + return fileDescriptor_83c10c24ec417dc9, []int{140} } func (m *PodSchedulingGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3944,7 +4000,7 @@ var xxx_messageInfo_PodSchedulingGate proto.InternalMessageInfo func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} func (*PodSecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{139} + return fileDescriptor_83c10c24ec417dc9, []int{141} } func (m *PodSecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3972,7 +4028,7 @@ var xxx_messageInfo_PodSecurityContext proto.InternalMessageInfo func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} func (*PodSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{140} + return fileDescriptor_83c10c24ec417dc9, []int{142} } func (m *PodSignature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4000,7 +4056,7 @@ var xxx_messageInfo_PodSignature proto.InternalMessageInfo func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} func (*PodSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{141} + return fileDescriptor_83c10c24ec417dc9, []int{143} } func (m *PodSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4028,7 +4084,7 @@ var xxx_messageInfo_PodSpec proto.InternalMessageInfo func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} func (*PodStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{142} + return fileDescriptor_83c10c24ec417dc9, []int{144} } func (m *PodStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4056,7 +4112,7 @@ var xxx_messageInfo_PodStatus proto.InternalMessageInfo func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} func (*PodStatusResult) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{143} + return fileDescriptor_83c10c24ec417dc9, []int{145} } func (m *PodStatusResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4084,7 +4140,7 @@ var xxx_messageInfo_PodStatusResult proto.InternalMessageInfo func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} func (*PodTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{144} + return fileDescriptor_83c10c24ec417dc9, []int{146} } func (m *PodTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4112,7 +4168,7 @@ var xxx_messageInfo_PodTemplate proto.InternalMessageInfo func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} func (*PodTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{145} + return fileDescriptor_83c10c24ec417dc9, []int{147} } func (m *PodTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4140,7 +4196,7 @@ var xxx_messageInfo_PodTemplateList proto.InternalMessageInfo func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} func (*PodTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{146} + return fileDescriptor_83c10c24ec417dc9, []int{148} } func (m *PodTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4168,7 +4224,7 @@ var xxx_messageInfo_PodTemplateSpec proto.InternalMessageInfo func (m *PortStatus) Reset() { *m = PortStatus{} } func (*PortStatus) ProtoMessage() {} func (*PortStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{147} + return fileDescriptor_83c10c24ec417dc9, []int{149} } func (m *PortStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4196,7 +4252,7 @@ var xxx_messageInfo_PortStatus proto.InternalMessageInfo func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{148} + return fileDescriptor_83c10c24ec417dc9, []int{150} } func (m *PortworxVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4224,7 +4280,7 @@ var xxx_messageInfo_PortworxVolumeSource proto.InternalMessageInfo func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} func (*Preconditions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{149} + return fileDescriptor_83c10c24ec417dc9, []int{151} } func (m *Preconditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4252,7 +4308,7 @@ var xxx_messageInfo_Preconditions proto.InternalMessageInfo func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{150} + return fileDescriptor_83c10c24ec417dc9, []int{152} } func (m *PreferAvoidPodsEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4336,7 @@ var xxx_messageInfo_PreferAvoidPodsEntry proto.InternalMessageInfo func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{151} + return fileDescriptor_83c10c24ec417dc9, []int{153} } func (m *PreferredSchedulingTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4308,7 +4364,7 @@ var xxx_messageInfo_PreferredSchedulingTerm proto.InternalMessageInfo func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} func (*Probe) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{152} + return fileDescriptor_83c10c24ec417dc9, []int{154} } func (m *Probe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4336,7 +4392,7 @@ var xxx_messageInfo_Probe proto.InternalMessageInfo func (m *ProbeHandler) Reset() { *m = ProbeHandler{} } func (*ProbeHandler) ProtoMessage() {} func (*ProbeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{153} + return fileDescriptor_83c10c24ec417dc9, []int{155} } func (m *ProbeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4364,7 +4420,7 @@ var xxx_messageInfo_ProbeHandler proto.InternalMessageInfo func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{154} + return fileDescriptor_83c10c24ec417dc9, []int{156} } func (m *ProjectedVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4392,7 +4448,7 @@ var xxx_messageInfo_ProjectedVolumeSource proto.InternalMessageInfo func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{155} + return fileDescriptor_83c10c24ec417dc9, []int{157} } func (m *QuobyteVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4476,7 @@ var xxx_messageInfo_QuobyteVolumeSource proto.InternalMessageInfo func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{156} + return fileDescriptor_83c10c24ec417dc9, []int{158} } func (m *RBDPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4448,7 +4504,7 @@ var xxx_messageInfo_RBDPersistentVolumeSource proto.InternalMessageInfo func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} func (*RBDVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{157} + return fileDescriptor_83c10c24ec417dc9, []int{159} } func (m *RBDVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4476,7 +4532,7 @@ var xxx_messageInfo_RBDVolumeSource proto.InternalMessageInfo func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} func (*RangeAllocation) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{158} + return fileDescriptor_83c10c24ec417dc9, []int{160} } func (m *RangeAllocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4504,7 +4560,7 @@ var xxx_messageInfo_RangeAllocation proto.InternalMessageInfo func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} func (*ReplicationController) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{159} + return fileDescriptor_83c10c24ec417dc9, []int{161} } func (m *ReplicationController) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4532,7 +4588,7 @@ var xxx_messageInfo_ReplicationController proto.InternalMessageInfo func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{160} + return fileDescriptor_83c10c24ec417dc9, []int{162} } func (m *ReplicationControllerCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4616,7 @@ var xxx_messageInfo_ReplicationControllerCondition proto.InternalMessageInfo func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{161} + return fileDescriptor_83c10c24ec417dc9, []int{163} } func (m *ReplicationControllerList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4588,7 +4644,7 @@ var xxx_messageInfo_ReplicationControllerList proto.InternalMessageInfo func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{162} + return fileDescriptor_83c10c24ec417dc9, []int{164} } func (m *ReplicationControllerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4616,7 +4672,7 @@ var xxx_messageInfo_ReplicationControllerSpec proto.InternalMessageInfo func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{163} + return fileDescriptor_83c10c24ec417dc9, []int{165} } func (m *ReplicationControllerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4644,7 +4700,7 @@ var xxx_messageInfo_ReplicationControllerStatus proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{164} + return fileDescriptor_83c10c24ec417dc9, []int{166} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4672,7 +4728,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{165} + return fileDescriptor_83c10c24ec417dc9, []int{167} } func (m *ResourceFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4700,7 +4756,7 @@ var xxx_messageInfo_ResourceFieldSelector proto.InternalMessageInfo func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} func (*ResourceQuota) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{166} + return fileDescriptor_83c10c24ec417dc9, []int{168} } func (m *ResourceQuota) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4728,7 +4784,7 @@ var xxx_messageInfo_ResourceQuota proto.InternalMessageInfo func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} func (*ResourceQuotaList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{167} + return fileDescriptor_83c10c24ec417dc9, []int{169} } func (m *ResourceQuotaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4812,7 @@ var xxx_messageInfo_ResourceQuotaList proto.InternalMessageInfo func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{168} + return fileDescriptor_83c10c24ec417dc9, []int{170} } func (m *ResourceQuotaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4784,7 +4840,7 @@ var xxx_messageInfo_ResourceQuotaSpec proto.InternalMessageInfo func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{169} + return fileDescriptor_83c10c24ec417dc9, []int{171} } func (m *ResourceQuotaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4812,7 +4868,7 @@ var xxx_messageInfo_ResourceQuotaStatus proto.InternalMessageInfo func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{170} + return fileDescriptor_83c10c24ec417dc9, []int{172} } func (m *ResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4840,7 +4896,7 @@ var xxx_messageInfo_ResourceRequirements proto.InternalMessageInfo func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{171} + return fileDescriptor_83c10c24ec417dc9, []int{173} } func (m *SELinuxOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4868,7 +4924,7 @@ var xxx_messageInfo_SELinuxOptions proto.InternalMessageInfo func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{172} + return fileDescriptor_83c10c24ec417dc9, []int{174} } func (m *ScaleIOPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +4952,7 @@ var xxx_messageInfo_ScaleIOPersistentVolumeSource proto.InternalMessageInfo func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{173} + return fileDescriptor_83c10c24ec417dc9, []int{175} } func (m *ScaleIOVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4924,7 +4980,7 @@ var xxx_messageInfo_ScaleIOVolumeSource proto.InternalMessageInfo func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } func (*ScopeSelector) ProtoMessage() {} func (*ScopeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{174} + return fileDescriptor_83c10c24ec417dc9, []int{176} } func (m *ScopeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4952,7 +5008,7 @@ var xxx_messageInfo_ScopeSelector proto.InternalMessageInfo func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } func (*ScopedResourceSelectorRequirement) ProtoMessage() {} func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{175} + return fileDescriptor_83c10c24ec417dc9, []int{177} } func (m *ScopedResourceSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4980,7 +5036,7 @@ var xxx_messageInfo_ScopedResourceSelectorRequirement proto.InternalMessageInfo func (m *SeccompProfile) Reset() { *m = SeccompProfile{} } func (*SeccompProfile) ProtoMessage() {} func (*SeccompProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{176} + return fileDescriptor_83c10c24ec417dc9, []int{178} } func (m *SeccompProfile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5064,7 @@ var xxx_messageInfo_SeccompProfile proto.InternalMessageInfo func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{177} + return fileDescriptor_83c10c24ec417dc9, []int{179} } func (m *Secret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5036,7 +5092,7 @@ var xxx_messageInfo_Secret proto.InternalMessageInfo func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} func (*SecretEnvSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{178} + return fileDescriptor_83c10c24ec417dc9, []int{180} } func (m *SecretEnvSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5120,7 @@ var xxx_messageInfo_SecretEnvSource proto.InternalMessageInfo func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} func (*SecretKeySelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{179} + return fileDescriptor_83c10c24ec417dc9, []int{181} } func (m *SecretKeySelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5092,7 +5148,7 @@ var xxx_messageInfo_SecretKeySelector proto.InternalMessageInfo func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} func (*SecretList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{180} + return fileDescriptor_83c10c24ec417dc9, []int{182} } func (m *SecretList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5120,7 +5176,7 @@ var xxx_messageInfo_SecretList proto.InternalMessageInfo func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} func (*SecretProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{181} + return fileDescriptor_83c10c24ec417dc9, []int{183} } func (m *SecretProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5148,7 +5204,7 @@ var xxx_messageInfo_SecretProjection proto.InternalMessageInfo func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{182} + return fileDescriptor_83c10c24ec417dc9, []int{184} } func (m *SecretReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5176,7 +5232,7 @@ var xxx_messageInfo_SecretReference proto.InternalMessageInfo func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} func (*SecretVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{183} + return fileDescriptor_83c10c24ec417dc9, []int{185} } func (m *SecretVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5204,7 +5260,7 @@ var xxx_messageInfo_SecretVolumeSource proto.InternalMessageInfo func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} func (*SecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{184} + return fileDescriptor_83c10c24ec417dc9, []int{186} } func (m *SecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5232,7 +5288,7 @@ var xxx_messageInfo_SecurityContext proto.InternalMessageInfo func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} func (*SerializedReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{185} + return fileDescriptor_83c10c24ec417dc9, []int{187} } func (m *SerializedReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5260,7 +5316,7 @@ var xxx_messageInfo_SerializedReference proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{186} + return fileDescriptor_83c10c24ec417dc9, []int{188} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5344,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{187} + return fileDescriptor_83c10c24ec417dc9, []int{189} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5316,7 +5372,7 @@ var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} func (*ServiceAccountList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{188} + return fileDescriptor_83c10c24ec417dc9, []int{190} } func (m *ServiceAccountList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5344,7 +5400,7 @@ var xxx_messageInfo_ServiceAccountList proto.InternalMessageInfo func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{189} + return fileDescriptor_83c10c24ec417dc9, []int{191} } func (m *ServiceAccountTokenProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5372,7 +5428,7 @@ var xxx_messageInfo_ServiceAccountTokenProjection proto.InternalMessageInfo func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} func (*ServiceList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{190} + return fileDescriptor_83c10c24ec417dc9, []int{192} } func (m *ServiceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5400,7 +5456,7 @@ var xxx_messageInfo_ServiceList proto.InternalMessageInfo func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} func (*ServicePort) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{191} + return fileDescriptor_83c10c24ec417dc9, []int{193} } func (m *ServicePort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5428,7 +5484,7 @@ var xxx_messageInfo_ServicePort proto.InternalMessageInfo func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{192} + return fileDescriptor_83c10c24ec417dc9, []int{194} } func (m *ServiceProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5456,7 +5512,7 @@ var xxx_messageInfo_ServiceProxyOptions proto.InternalMessageInfo func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} func (*ServiceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{193} + return fileDescriptor_83c10c24ec417dc9, []int{195} } func (m *ServiceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5540,7 @@ var xxx_messageInfo_ServiceSpec proto.InternalMessageInfo func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} func (*ServiceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{194} + return fileDescriptor_83c10c24ec417dc9, []int{196} } func (m *ServiceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5512,7 +5568,7 @@ var xxx_messageInfo_ServiceStatus proto.InternalMessageInfo func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{195} + return fileDescriptor_83c10c24ec417dc9, []int{197} } func (m *SessionAffinityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5596,7 @@ var xxx_messageInfo_SessionAffinityConfig proto.InternalMessageInfo func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{196} + return fileDescriptor_83c10c24ec417dc9, []int{198} } func (m *StorageOSPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5568,7 +5624,7 @@ var xxx_messageInfo_StorageOSPersistentVolumeSource proto.InternalMessageInfo func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{197} + return fileDescriptor_83c10c24ec417dc9, []int{199} } func (m *StorageOSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5596,7 +5652,7 @@ var xxx_messageInfo_StorageOSVolumeSource proto.InternalMessageInfo func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} func (*Sysctl) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{198} + return fileDescriptor_83c10c24ec417dc9, []int{200} } func (m *Sysctl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5624,7 +5680,7 @@ var xxx_messageInfo_Sysctl proto.InternalMessageInfo func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} func (*TCPSocketAction) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{199} + return fileDescriptor_83c10c24ec417dc9, []int{201} } func (m *TCPSocketAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5652,7 +5708,7 @@ var xxx_messageInfo_TCPSocketAction proto.InternalMessageInfo func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} func (*Taint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{200} + return fileDescriptor_83c10c24ec417dc9, []int{202} } func (m *Taint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5736,7 @@ var xxx_messageInfo_Taint proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{201} + return fileDescriptor_83c10c24ec417dc9, []int{203} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5708,7 +5764,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } func (*TopologySelectorLabelRequirement) ProtoMessage() {} func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{202} + return fileDescriptor_83c10c24ec417dc9, []int{204} } func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5736,7 +5792,7 @@ var xxx_messageInfo_TopologySelectorLabelRequirement proto.InternalMessageInfo func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{203} + return fileDescriptor_83c10c24ec417dc9, []int{205} } func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5764,7 +5820,7 @@ var xxx_messageInfo_TopologySelectorTerm proto.InternalMessageInfo func (m *TopologySpreadConstraint) Reset() { *m = TopologySpreadConstraint{} } func (*TopologySpreadConstraint) ProtoMessage() {} func (*TopologySpreadConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{204} + return fileDescriptor_83c10c24ec417dc9, []int{206} } func (m *TopologySpreadConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5792,7 +5848,7 @@ var xxx_messageInfo_TopologySpreadConstraint proto.InternalMessageInfo func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } func (*TypedLocalObjectReference) ProtoMessage() {} func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{205} + return fileDescriptor_83c10c24ec417dc9, []int{207} } func (m *TypedLocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5820,7 +5876,7 @@ var xxx_messageInfo_TypedLocalObjectReference proto.InternalMessageInfo func (m *TypedObjectReference) Reset() { *m = TypedObjectReference{} } func (*TypedObjectReference) ProtoMessage() {} func (*TypedObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{206} + return fileDescriptor_83c10c24ec417dc9, []int{208} } func (m *TypedObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5848,7 +5904,7 @@ var xxx_messageInfo_TypedObjectReference proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{207} + return fileDescriptor_83c10c24ec417dc9, []int{209} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5876,7 +5932,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} func (*VolumeDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{208} + return fileDescriptor_83c10c24ec417dc9, []int{210} } func (m *VolumeDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5904,7 +5960,7 @@ var xxx_messageInfo_VolumeDevice proto.InternalMessageInfo func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} func (*VolumeMount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{209} + return fileDescriptor_83c10c24ec417dc9, []int{211} } func (m *VolumeMount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5932,7 +5988,7 @@ var xxx_messageInfo_VolumeMount proto.InternalMessageInfo func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{210} + return fileDescriptor_83c10c24ec417dc9, []int{212} } func (m *VolumeNodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5960,7 +6016,7 @@ var xxx_messageInfo_VolumeNodeAffinity proto.InternalMessageInfo func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} func (*VolumeProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{211} + return fileDescriptor_83c10c24ec417dc9, []int{213} } func (m *VolumeProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5988,7 +6044,7 @@ var xxx_messageInfo_VolumeProjection proto.InternalMessageInfo func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} func (*VolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{212} + return fileDescriptor_83c10c24ec417dc9, []int{214} } func (m *VolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6016,7 +6072,7 @@ var xxx_messageInfo_VolumeSource proto.InternalMessageInfo func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{213} + return fileDescriptor_83c10c24ec417dc9, []int{215} } func (m *VsphereVirtualDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6044,7 +6100,7 @@ var xxx_messageInfo_VsphereVirtualDiskVolumeSource proto.InternalMessageInfo func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{214} + return fileDescriptor_83c10c24ec417dc9, []int{216} } func (m *WeightedPodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6072,7 +6128,7 @@ var xxx_messageInfo_WeightedPodAffinityTerm proto.InternalMessageInfo func (m *WindowsSecurityContextOptions) Reset() { *m = WindowsSecurityContextOptions{} } func (*WindowsSecurityContextOptions) ProtoMessage() {} func (*WindowsSecurityContextOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{215} + return fileDescriptor_83c10c24ec417dc9, []int{217} } func (m *WindowsSecurityContextOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6174,6 +6230,7 @@ func init() { proto.RegisterType((*HTTPGetAction)(nil), "k8s.io.api.core.v1.HTTPGetAction") proto.RegisterType((*HTTPHeader)(nil), "k8s.io.api.core.v1.HTTPHeader") proto.RegisterType((*HostAlias)(nil), "k8s.io.api.core.v1.HostAlias") + proto.RegisterType((*HostIP)(nil), "k8s.io.api.core.v1.HostIP") proto.RegisterType((*HostPathVolumeSource)(nil), "k8s.io.api.core.v1.HostPathVolumeSource") proto.RegisterType((*ISCSIPersistentVolumeSource)(nil), "k8s.io.api.core.v1.ISCSIPersistentVolumeSource") proto.RegisterType((*ISCSIVolumeSource)(nil), "k8s.io.api.core.v1.ISCSIVolumeSource") @@ -6227,6 +6284,7 @@ func init() { proto.RegisterType((*PersistentVolumeClaimList)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimList") proto.RegisterType((*PersistentVolumeClaimSpec)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimSpec") proto.RegisterType((*PersistentVolumeClaimStatus)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimStatus") + proto.RegisterMapType((map[ResourceName]ClaimResourceStatus)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimStatus.AllocatedResourceStatusesEntry") proto.RegisterMapType((ResourceList)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimStatus.AllocatedResourcesEntry") proto.RegisterMapType((ResourceList)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimStatus.CapacityEntry") proto.RegisterType((*PersistentVolumeClaimTemplate)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimTemplate") @@ -6254,6 +6312,7 @@ func init() { proto.RegisterType((*PodProxyOptions)(nil), "k8s.io.api.core.v1.PodProxyOptions") proto.RegisterType((*PodReadinessGate)(nil), "k8s.io.api.core.v1.PodReadinessGate") proto.RegisterType((*PodResourceClaim)(nil), "k8s.io.api.core.v1.PodResourceClaim") + proto.RegisterType((*PodResourceClaimStatus)(nil), "k8s.io.api.core.v1.PodResourceClaimStatus") proto.RegisterType((*PodSchedulingGate)(nil), "k8s.io.api.core.v1.PodSchedulingGate") proto.RegisterType((*PodSecurityContext)(nil), "k8s.io.api.core.v1.PodSecurityContext") proto.RegisterType((*PodSignature)(nil), "k8s.io.api.core.v1.PodSignature") @@ -6350,925 +6409,934 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 14685 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x5c, 0xd7, - 0x75, 0x18, 0xac, 0xd7, 0x3d, 0x5b, 0x9f, 0xd9, 0xef, 0x00, 0xe0, 0x60, 0x48, 0xa0, 0xc1, 0x47, - 0x12, 0x04, 0x45, 0x72, 0x20, 0x70, 0x91, 0x28, 0x52, 0xa2, 0x35, 0x2b, 0x30, 0x04, 0x66, 0xd0, - 0xbc, 0x3d, 0x00, 0x24, 0x8a, 0x52, 0xe9, 0x4d, 0xf7, 0x9d, 0x99, 0xa7, 0xe9, 0x7e, 0xaf, 0xf9, - 0xde, 0xeb, 0x01, 0x06, 0x9f, 0x54, 0x9f, 0x2d, 0xc7, 0x8b, 0x6c, 0x27, 0xa5, 0x4a, 0x39, 0x4b, - 0xc9, 0x2e, 0x57, 0xca, 0x76, 0x6c, 0x2b, 0xca, 0xa6, 0xc8, 0xb1, 0x1d, 0xcb, 0x5b, 0xb6, 0x8a, - 0x93, 0x4a, 0x39, 0x8e, 0xab, 0x62, 0xb9, 0xe2, 0xca, 0xc4, 0x82, 0x53, 0xe5, 0x52, 0x55, 0x62, - 0x3b, 0xcb, 0x8f, 0x64, 0xe2, 0xc4, 0xa9, 0xbb, 0xbe, 0x7b, 0xdf, 0xd2, 0xdd, 0x03, 0x0e, 0x46, - 0x94, 0x8a, 0xff, 0xba, 0xcf, 0x39, 0xf7, 0xdc, 0xfb, 0xee, 0x7a, 0xee, 0x39, 0xe7, 0x9e, 0x03, - 0xaf, 0xec, 0xbc, 0x14, 0xce, 0xba, 0xfe, 0xc5, 0x9d, 0xf6, 0x06, 0x09, 0x3c, 0x12, 0x91, 0xf0, - 0xe2, 0x2e, 0xf1, 0xea, 0x7e, 0x70, 0x51, 0x20, 0x9c, 0x96, 0x7b, 0xb1, 0xe6, 0x07, 0xe4, 0xe2, - 0xee, 0xa5, 0x8b, 0x5b, 0xc4, 0x23, 0x81, 0x13, 0x91, 0xfa, 0x6c, 0x2b, 0xf0, 0x23, 0x1f, 0x21, - 0x4e, 0x33, 0xeb, 0xb4, 0xdc, 0x59, 0x4a, 0x33, 0xbb, 0x7b, 0x69, 0xe6, 0xd9, 0x2d, 0x37, 0xda, - 0x6e, 0x6f, 0xcc, 0xd6, 0xfc, 0xe6, 0xc5, 0x2d, 0x7f, 0xcb, 0xbf, 0xc8, 0x48, 0x37, 0xda, 0x9b, - 0xec, 0x1f, 0xfb, 0xc3, 0x7e, 0x71, 0x16, 0x33, 0x2f, 0xc4, 0xd5, 0x34, 0x9d, 0xda, 0xb6, 0xeb, - 0x91, 0x60, 0xef, 0x62, 0x6b, 0x67, 0x8b, 0xd5, 0x1b, 0x90, 0xd0, 0x6f, 0x07, 0x35, 0x92, 0xac, - 0xb8, 0x63, 0xa9, 0xf0, 0x62, 0x93, 0x44, 0x4e, 0x46, 0x73, 0x67, 0x2e, 0xe6, 0x95, 0x0a, 0xda, - 0x5e, 0xe4, 0x36, 0xd3, 0xd5, 0xbc, 0xbf, 0x5b, 0x81, 0xb0, 0xb6, 0x4d, 0x9a, 0x4e, 0xaa, 0xdc, - 0xf3, 0x79, 0xe5, 0xda, 0x91, 0xdb, 0xb8, 0xe8, 0x7a, 0x51, 0x18, 0x05, 0xc9, 0x42, 0xf6, 0xd7, - 0x2d, 0x38, 0x37, 0x77, 0xab, 0xba, 0xd4, 0x70, 0xc2, 0xc8, 0xad, 0xcd, 0x37, 0xfc, 0xda, 0x4e, - 0x35, 0xf2, 0x03, 0x72, 0xd3, 0x6f, 0xb4, 0x9b, 0xa4, 0xca, 0x3a, 0x02, 0x3d, 0x03, 0x43, 0xbb, - 0xec, 0xff, 0xca, 0xe2, 0xb4, 0x75, 0xce, 0xba, 0x50, 0x9a, 0x9f, 0xf8, 0xcd, 0xfd, 0xf2, 0x7b, - 0xee, 0xed, 0x97, 0x87, 0x6e, 0x0a, 0x38, 0x56, 0x14, 0xe8, 0x3c, 0x0c, 0x6c, 0x86, 0xeb, 0x7b, - 0x2d, 0x32, 0x5d, 0x60, 0xb4, 0x63, 0x82, 0x76, 0x60, 0xb9, 0x4a, 0xa1, 0x58, 0x60, 0xd1, 0x45, - 0x28, 0xb5, 0x9c, 0x20, 0x72, 0x23, 0xd7, 0xf7, 0xa6, 0x8b, 0xe7, 0xac, 0x0b, 0xfd, 0xf3, 0x93, - 0x82, 0xb4, 0x54, 0x91, 0x08, 0x1c, 0xd3, 0xd0, 0x66, 0x04, 0xc4, 0xa9, 0x5f, 0xf7, 0x1a, 0x7b, - 0xd3, 0x7d, 0xe7, 0xac, 0x0b, 0x43, 0x71, 0x33, 0xb0, 0x80, 0x63, 0x45, 0x61, 0x7f, 0xb1, 0x00, - 0x43, 0x73, 0x9b, 0x9b, 0xae, 0xe7, 0x46, 0x7b, 0xe8, 0x26, 0x8c, 0x78, 0x7e, 0x9d, 0xc8, 0xff, - 0xec, 0x2b, 0x86, 0x9f, 0x3b, 0x37, 0x9b, 0x9e, 0x4a, 0xb3, 0x6b, 0x1a, 0xdd, 0xfc, 0xc4, 0xbd, - 0xfd, 0xf2, 0x88, 0x0e, 0xc1, 0x06, 0x1f, 0x84, 0x61, 0xb8, 0xe5, 0xd7, 0x15, 0xdb, 0x02, 0x63, - 0x5b, 0xce, 0x62, 0x5b, 0x89, 0xc9, 0xe6, 0xc7, 0xef, 0xed, 0x97, 0x87, 0x35, 0x00, 0xd6, 0x99, - 0xa0, 0x0d, 0x18, 0xa7, 0x7f, 0xbd, 0xc8, 0x55, 0x7c, 0x8b, 0x8c, 0xef, 0x63, 0x79, 0x7c, 0x35, - 0xd2, 0xf9, 0xa9, 0x7b, 0xfb, 0xe5, 0xf1, 0x04, 0x10, 0x27, 0x19, 0xda, 0x77, 0x61, 0x6c, 0x2e, - 0x8a, 0x9c, 0xda, 0x36, 0xa9, 0xf3, 0x11, 0x44, 0x2f, 0x40, 0x9f, 0xe7, 0x34, 0x89, 0x18, 0xdf, - 0x73, 0xa2, 0x63, 0xfb, 0xd6, 0x9c, 0x26, 0x39, 0xd8, 0x2f, 0x4f, 0xdc, 0xf0, 0xdc, 0xb7, 0xda, - 0x62, 0x56, 0x50, 0x18, 0x66, 0xd4, 0xe8, 0x39, 0x80, 0x3a, 0xd9, 0x75, 0x6b, 0xa4, 0xe2, 0x44, - 0xdb, 0x62, 0xbc, 0x91, 0x28, 0x0b, 0x8b, 0x0a, 0x83, 0x35, 0x2a, 0xfb, 0x0e, 0x94, 0xe6, 0x76, - 0x7d, 0xb7, 0x5e, 0xf1, 0xeb, 0x21, 0xda, 0x81, 0xf1, 0x56, 0x40, 0x36, 0x49, 0xa0, 0x40, 0xd3, - 0xd6, 0xb9, 0xe2, 0x85, 0xe1, 0xe7, 0x2e, 0x64, 0x7e, 0xac, 0x49, 0xba, 0xe4, 0x45, 0xc1, 0xde, - 0xfc, 0x43, 0xa2, 0xbe, 0xf1, 0x04, 0x16, 0x27, 0x39, 0xdb, 0xff, 0xac, 0x00, 0x27, 0xe7, 0xee, - 0xb6, 0x03, 0xb2, 0xe8, 0x86, 0x3b, 0xc9, 0x19, 0x5e, 0x77, 0xc3, 0x9d, 0xb5, 0xb8, 0x07, 0xd4, - 0xd4, 0x5a, 0x14, 0x70, 0xac, 0x28, 0xd0, 0xb3, 0x30, 0x48, 0x7f, 0xdf, 0xc0, 0x2b, 0xe2, 0x93, - 0xa7, 0x04, 0xf1, 0xf0, 0xa2, 0x13, 0x39, 0x8b, 0x1c, 0x85, 0x25, 0x0d, 0x5a, 0x85, 0xe1, 0x1a, - 0x5b, 0x90, 0x5b, 0xab, 0x7e, 0x9d, 0xb0, 0xc1, 0x2c, 0xcd, 0x3f, 0x4d, 0xc9, 0x17, 0x62, 0xf0, - 0xc1, 0x7e, 0x79, 0x9a, 0xb7, 0x4d, 0xb0, 0xd0, 0x70, 0x58, 0x2f, 0x8f, 0x6c, 0xb5, 0xbe, 0xfa, - 0x18, 0x27, 0xc8, 0x58, 0x5b, 0x17, 0xb4, 0xa5, 0xd2, 0xcf, 0x96, 0xca, 0x48, 0xf6, 0x32, 0x41, - 0x97, 0xa0, 0x6f, 0xc7, 0xf5, 0xea, 0xd3, 0x03, 0x8c, 0xd7, 0x19, 0x3a, 0xe6, 0x57, 0x5d, 0xaf, - 0x7e, 0xb0, 0x5f, 0x9e, 0x34, 0x9a, 0x43, 0x81, 0x98, 0x91, 0xda, 0xff, 0xdd, 0x82, 0x32, 0xc3, - 0x2d, 0xbb, 0x0d, 0x52, 0x21, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0xa3, 0x43, 0x9f, 0x03, 0x08, - 0x49, 0x2d, 0x20, 0x91, 0xd6, 0xa5, 0x6a, 0x62, 0x54, 0x15, 0x06, 0x6b, 0x54, 0x74, 0x43, 0x08, - 0xb7, 0x9d, 0x80, 0xcd, 0x2f, 0xd1, 0xb1, 0x6a, 0x43, 0xa8, 0x4a, 0x04, 0x8e, 0x69, 0x8c, 0x0d, - 0xa1, 0xd8, 0x6d, 0x43, 0x40, 0x1f, 0x86, 0xf1, 0xb8, 0xb2, 0xb0, 0xe5, 0xd4, 0x64, 0x07, 0xb2, - 0x25, 0x53, 0x35, 0x51, 0x38, 0x49, 0x6b, 0xff, 0x2d, 0x4b, 0x4c, 0x1e, 0xfa, 0xd5, 0xef, 0xf0, - 0x6f, 0xb5, 0x7f, 0xc9, 0x82, 0xc1, 0x79, 0xd7, 0xab, 0xbb, 0xde, 0x16, 0xfa, 0x14, 0x0c, 0xd1, - 0xb3, 0xa9, 0xee, 0x44, 0x8e, 0xd8, 0xf7, 0xde, 0xa7, 0xad, 0x2d, 0x75, 0x54, 0xcc, 0xb6, 0x76, - 0xb6, 0x28, 0x20, 0x9c, 0xa5, 0xd4, 0x74, 0xb5, 0x5d, 0xdf, 0xf8, 0x34, 0xa9, 0x45, 0xab, 0x24, - 0x72, 0xe2, 0xcf, 0x89, 0x61, 0x58, 0x71, 0x45, 0x57, 0x61, 0x20, 0x72, 0x82, 0x2d, 0x12, 0x89, - 0x0d, 0x30, 0x73, 0xa3, 0xe2, 0x25, 0x31, 0x5d, 0x91, 0xc4, 0xab, 0x91, 0xf8, 0x58, 0x58, 0x67, - 0x45, 0xb1, 0x60, 0x61, 0xff, 0x9f, 0x41, 0x38, 0xbd, 0x50, 0x5d, 0xc9, 0x99, 0x57, 0xe7, 0x61, - 0xa0, 0x1e, 0xb8, 0xbb, 0x24, 0x10, 0xfd, 0xac, 0xb8, 0x2c, 0x32, 0x28, 0x16, 0x58, 0xf4, 0x12, - 0x8c, 0xf0, 0x03, 0xe9, 0x8a, 0xe3, 0xd5, 0x1b, 0xb2, 0x8b, 0x4f, 0x08, 0xea, 0x91, 0x9b, 0x1a, - 0x0e, 0x1b, 0x94, 0x87, 0x9c, 0x54, 0xe7, 0x13, 0x8b, 0x31, 0xef, 0xb0, 0xfb, 0xbc, 0x05, 0x13, - 0xbc, 0x9a, 0xb9, 0x28, 0x0a, 0xdc, 0x8d, 0x76, 0x44, 0xc2, 0xe9, 0x7e, 0xb6, 0xd3, 0x2d, 0x64, - 0xf5, 0x56, 0x6e, 0x0f, 0xcc, 0xde, 0x4c, 0x70, 0xe1, 0x9b, 0xe0, 0xb4, 0xa8, 0x77, 0x22, 0x89, - 0xc6, 0xa9, 0x6a, 0xd1, 0xf7, 0x5a, 0x30, 0x53, 0xf3, 0xbd, 0x28, 0xf0, 0x1b, 0x0d, 0x12, 0x54, - 0xda, 0x1b, 0x0d, 0x37, 0xdc, 0xe6, 0xf3, 0x14, 0x93, 0x4d, 0xb6, 0x13, 0xe4, 0x8c, 0xa1, 0x22, - 0x12, 0x63, 0x78, 0xf6, 0xde, 0x7e, 0x79, 0x66, 0x21, 0x97, 0x15, 0xee, 0x50, 0x0d, 0xda, 0x01, - 0x44, 0x8f, 0xd2, 0x6a, 0xe4, 0x6c, 0x91, 0xb8, 0xf2, 0xc1, 0xde, 0x2b, 0x3f, 0x75, 0x6f, 0xbf, - 0x8c, 0xd6, 0x52, 0x2c, 0x70, 0x06, 0x5b, 0xf4, 0x16, 0x9c, 0xa0, 0xd0, 0xd4, 0xb7, 0x0e, 0xf5, - 0x5e, 0xdd, 0xf4, 0xbd, 0xfd, 0xf2, 0x89, 0xb5, 0x0c, 0x26, 0x38, 0x93, 0x35, 0xfa, 0x6e, 0x0b, - 0x4e, 0xc7, 0x9f, 0xbf, 0x74, 0xa7, 0xe5, 0x78, 0xf5, 0xb8, 0xe2, 0x52, 0xef, 0x15, 0xd3, 0x3d, - 0xf9, 0xf4, 0x42, 0x1e, 0x27, 0x9c, 0x5f, 0x09, 0xf2, 0x60, 0x8a, 0x36, 0x2d, 0x59, 0x37, 0xf4, - 0x5e, 0xf7, 0x43, 0xf7, 0xf6, 0xcb, 0x53, 0x6b, 0x69, 0x1e, 0x38, 0x8b, 0xf1, 0xcc, 0x02, 0x9c, - 0xcc, 0x9c, 0x9d, 0x68, 0x02, 0x8a, 0x3b, 0x84, 0x4b, 0x5d, 0x25, 0x4c, 0x7f, 0xa2, 0x13, 0xd0, - 0xbf, 0xeb, 0x34, 0xda, 0x62, 0x61, 0x62, 0xfe, 0xe7, 0xe5, 0xc2, 0x4b, 0x96, 0xfd, 0xcf, 0x8b, - 0x30, 0xbe, 0x50, 0x5d, 0xb9, 0xaf, 0x55, 0xaf, 0x1f, 0x7b, 0x85, 0x8e, 0xc7, 0x5e, 0x7c, 0x88, - 0x16, 0x73, 0x0f, 0xd1, 0xff, 0x3f, 0x63, 0xc9, 0xf6, 0xb1, 0x25, 0xfb, 0xc1, 0x9c, 0x25, 0x7b, - 0xc4, 0x0b, 0x75, 0x37, 0x67, 0xd6, 0xf6, 0xb3, 0x01, 0xcc, 0x94, 0x90, 0xae, 0xf9, 0x35, 0xa7, - 0x91, 0xdc, 0x6a, 0x0f, 0x39, 0x75, 0x8f, 0x66, 0x1c, 0x6b, 0x30, 0xb2, 0xe0, 0xb4, 0x9c, 0x0d, - 0xb7, 0xe1, 0x46, 0x2e, 0x09, 0xd1, 0x93, 0x50, 0x74, 0xea, 0x75, 0x26, 0xdd, 0x95, 0xe6, 0x4f, - 0xde, 0xdb, 0x2f, 0x17, 0xe7, 0xea, 0x54, 0xcc, 0x00, 0x45, 0xb5, 0x87, 0x29, 0x05, 0x7a, 0x2f, - 0xf4, 0xd5, 0x03, 0xbf, 0x35, 0x5d, 0x60, 0x94, 0x74, 0x95, 0xf7, 0x2d, 0x06, 0x7e, 0x2b, 0x41, - 0xca, 0x68, 0xec, 0xdf, 0x28, 0xc0, 0x23, 0x0b, 0xa4, 0xb5, 0xbd, 0x5c, 0xcd, 0x39, 0x2f, 0x2e, - 0xc0, 0x50, 0xd3, 0xf7, 0xdc, 0xc8, 0x0f, 0x42, 0x51, 0x35, 0x9b, 0x11, 0xab, 0x02, 0x86, 0x15, - 0x16, 0x9d, 0x83, 0xbe, 0x56, 0x2c, 0xc4, 0x8e, 0x48, 0x01, 0x98, 0x89, 0xaf, 0x0c, 0x43, 0x29, - 0xda, 0x21, 0x09, 0xc4, 0x8c, 0x51, 0x14, 0x37, 0x42, 0x12, 0x60, 0x86, 0x89, 0x25, 0x01, 0x2a, - 0x23, 0x88, 0x13, 0x21, 0x21, 0x09, 0x50, 0x0c, 0xd6, 0xa8, 0x50, 0x05, 0x4a, 0x61, 0x62, 0x64, - 0x7b, 0x5a, 0x9a, 0xa3, 0x4c, 0x54, 0x50, 0x23, 0x19, 0x33, 0x31, 0x4e, 0xb0, 0x81, 0xae, 0xa2, - 0xc2, 0xd7, 0x0a, 0x80, 0x78, 0x17, 0x7e, 0x9b, 0x75, 0xdc, 0x8d, 0x74, 0xc7, 0xf5, 0xbe, 0x24, - 0x8e, 0xaa, 0xf7, 0xfe, 0x87, 0x05, 0x8f, 0x2c, 0xb8, 0x5e, 0x9d, 0x04, 0x39, 0x13, 0xf0, 0xc1, - 0xdc, 0x9d, 0x0f, 0x27, 0xa4, 0x18, 0x53, 0xac, 0xef, 0x08, 0xa6, 0x98, 0xfd, 0x27, 0x16, 0x20, - 0xfe, 0xd9, 0xef, 0xb8, 0x8f, 0xbd, 0x91, 0xfe, 0xd8, 0x23, 0x98, 0x16, 0xf6, 0xdf, 0xb3, 0x60, - 0x78, 0xa1, 0xe1, 0xb8, 0x4d, 0xf1, 0xa9, 0x0b, 0x30, 0x29, 0x15, 0x45, 0x0c, 0xac, 0xc9, 0xfe, - 0x74, 0x73, 0x9b, 0xc4, 0x49, 0x24, 0x4e, 0xd3, 0xa3, 0x8f, 0xc3, 0x69, 0x03, 0xb8, 0x4e, 0x9a, - 0xad, 0x86, 0x13, 0xe9, 0xb7, 0x02, 0x76, 0xfa, 0xe3, 0x3c, 0x22, 0x9c, 0x5f, 0xde, 0xbe, 0x06, - 0x63, 0x0b, 0x0d, 0x97, 0x78, 0xd1, 0x4a, 0x65, 0xc1, 0xf7, 0x36, 0xdd, 0x2d, 0xf4, 0x32, 0x8c, - 0x45, 0x6e, 0x93, 0xf8, 0xed, 0xa8, 0x4a, 0x6a, 0xbe, 0xc7, 0xee, 0xda, 0xd6, 0x85, 0xfe, 0x79, - 0x74, 0x6f, 0xbf, 0x3c, 0xb6, 0x6e, 0x60, 0x70, 0x82, 0xd2, 0xfe, 0x7d, 0x3a, 0xe2, 0x7e, 0xb3, - 0xe5, 0x7b, 0xc4, 0x8b, 0x16, 0x7c, 0xaf, 0xce, 0x75, 0x32, 0x2f, 0x43, 0x5f, 0x44, 0x47, 0x90, - 0x7f, 0xf9, 0x79, 0xb9, 0xb4, 0xe9, 0xb8, 0x1d, 0xec, 0x97, 0x4f, 0xa5, 0x4b, 0xb0, 0x91, 0x65, - 0x65, 0xd0, 0x07, 0x61, 0x20, 0x8c, 0x9c, 0xa8, 0x1d, 0x8a, 0x4f, 0x7d, 0x54, 0x8e, 0x7f, 0x95, - 0x41, 0x0f, 0xf6, 0xcb, 0xe3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x05, 0x83, 0x4d, 0x12, - 0x86, 0xce, 0x96, 0x3c, 0xbf, 0xc7, 0x45, 0xd9, 0xc1, 0x55, 0x0e, 0xc6, 0x12, 0x8f, 0x1e, 0x83, - 0x7e, 0x12, 0x04, 0x7e, 0x20, 0x76, 0x95, 0x51, 0x41, 0xd8, 0xbf, 0x44, 0x81, 0x98, 0xe3, 0xec, - 0x7f, 0x63, 0xc1, 0xb8, 0x6a, 0x2b, 0xaf, 0xeb, 0x18, 0xee, 0x4d, 0x6f, 0x00, 0xd4, 0xe4, 0x07, - 0x86, 0xec, 0xbc, 0x1b, 0x7e, 0xee, 0x7c, 0xa6, 0x68, 0x91, 0xea, 0xc6, 0x98, 0xb3, 0x02, 0x85, - 0x58, 0xe3, 0x66, 0xff, 0xaa, 0x05, 0x53, 0x89, 0x2f, 0xba, 0xe6, 0x86, 0x11, 0x7a, 0x33, 0xf5, - 0x55, 0xb3, 0xbd, 0x7d, 0x15, 0x2d, 0xcd, 0xbe, 0x49, 0x2d, 0x3e, 0x09, 0xd1, 0xbe, 0xe8, 0x0a, - 0xf4, 0xbb, 0x11, 0x69, 0xca, 0x8f, 0x79, 0xac, 0xe3, 0xc7, 0xf0, 0x56, 0xc5, 0x23, 0xb2, 0x42, - 0x4b, 0x62, 0xce, 0xc0, 0xfe, 0x8d, 0x22, 0x94, 0xf8, 0xb4, 0x5d, 0x75, 0x5a, 0xc7, 0x30, 0x16, - 0x4f, 0x43, 0xc9, 0x6d, 0x36, 0xdb, 0x91, 0xb3, 0x21, 0x0e, 0xa0, 0x21, 0xbe, 0x19, 0xac, 0x48, - 0x20, 0x8e, 0xf1, 0x68, 0x05, 0xfa, 0x58, 0x53, 0xf8, 0x57, 0x3e, 0x99, 0xfd, 0x95, 0xa2, 0xed, - 0xb3, 0x8b, 0x4e, 0xe4, 0x70, 0xd9, 0x4f, 0x9d, 0x7c, 0x14, 0x84, 0x19, 0x0b, 0xe4, 0x00, 0x6c, - 0xb8, 0x9e, 0x13, 0xec, 0x51, 0xd8, 0x74, 0x91, 0x31, 0x7c, 0xb6, 0x33, 0xc3, 0x79, 0x45, 0xcf, - 0xd9, 0xaa, 0x0f, 0x8b, 0x11, 0x58, 0x63, 0x3a, 0xf3, 0x01, 0x28, 0x29, 0xe2, 0xc3, 0x88, 0x70, - 0x33, 0x1f, 0x86, 0xf1, 0x44, 0x5d, 0xdd, 0x8a, 0x8f, 0xe8, 0x12, 0xe0, 0x2f, 0xb3, 0x2d, 0x43, - 0xb4, 0x7a, 0xc9, 0xdb, 0x15, 0x3b, 0xe7, 0x5d, 0x38, 0xd1, 0xc8, 0xd8, 0x7b, 0xc5, 0xb8, 0xf6, - 0xbe, 0x57, 0x3f, 0x22, 0x3e, 0xfb, 0x44, 0x16, 0x16, 0x67, 0xd6, 0x41, 0xa5, 0x1a, 0xbf, 0x45, - 0x17, 0x88, 0xd3, 0xd0, 0x2f, 0x08, 0xd7, 0x05, 0x0c, 0x2b, 0x2c, 0xdd, 0xef, 0x4e, 0xa8, 0xc6, - 0x5f, 0x25, 0x7b, 0x55, 0xd2, 0x20, 0xb5, 0xc8, 0x0f, 0xbe, 0xa5, 0xcd, 0x3f, 0xc3, 0x7b, 0x9f, - 0x6f, 0x97, 0xc3, 0x82, 0x41, 0xf1, 0x2a, 0xd9, 0xe3, 0x43, 0xa1, 0x7f, 0x5d, 0xb1, 0xe3, 0xd7, - 0x7d, 0xc5, 0x82, 0x51, 0xf5, 0x75, 0xc7, 0xb0, 0x2f, 0xcc, 0x9b, 0xfb, 0xc2, 0x99, 0x8e, 0x13, - 0x3c, 0x67, 0x47, 0xf8, 0x5a, 0x01, 0x4e, 0x2b, 0x1a, 0x7a, 0x9b, 0xe1, 0x7f, 0xc4, 0xac, 0xba, - 0x08, 0x25, 0x4f, 0xe9, 0xf5, 0x2c, 0x53, 0xa1, 0x16, 0x6b, 0xf5, 0x62, 0x1a, 0x2a, 0x94, 0x7a, - 0xf1, 0x31, 0x3b, 0xa2, 0x2b, 0xbc, 0x85, 0x72, 0x7b, 0x1e, 0x8a, 0x6d, 0xb7, 0x2e, 0x0e, 0x98, - 0xf7, 0xc9, 0xde, 0xbe, 0xb1, 0xb2, 0x78, 0xb0, 0x5f, 0x7e, 0x34, 0xcf, 0xd8, 0x42, 0x4f, 0xb6, - 0x70, 0xf6, 0xc6, 0xca, 0x22, 0xa6, 0x85, 0xd1, 0x1c, 0x8c, 0xcb, 0x13, 0xfa, 0x26, 0x15, 0x10, - 0x7d, 0x4f, 0x9c, 0x43, 0x4a, 0x6b, 0x8d, 0x4d, 0x34, 0x4e, 0xd2, 0xa3, 0x45, 0x98, 0xd8, 0x69, - 0x6f, 0x90, 0x06, 0x89, 0xf8, 0x07, 0x5f, 0x25, 0x5c, 0xa7, 0x5b, 0x8a, 0xef, 0x92, 0x57, 0x13, - 0x78, 0x9c, 0x2a, 0x61, 0xff, 0x39, 0x3b, 0x0f, 0x44, 0xef, 0x55, 0x02, 0x9f, 0x4e, 0x2c, 0xca, - 0xfd, 0x5b, 0x39, 0x9d, 0x7b, 0x99, 0x15, 0x57, 0xc9, 0xde, 0xba, 0x4f, 0xef, 0x12, 0xd9, 0xb3, - 0xc2, 0x98, 0xf3, 0x7d, 0x1d, 0xe7, 0xfc, 0xcf, 0x17, 0xe0, 0xa4, 0xea, 0x01, 0x43, 0x6c, 0xfd, - 0x76, 0xef, 0x83, 0x4b, 0x30, 0x5c, 0x27, 0x9b, 0x4e, 0xbb, 0x11, 0x29, 0x03, 0x43, 0x3f, 0x37, - 0x32, 0x2d, 0xc6, 0x60, 0xac, 0xd3, 0x1c, 0xa2, 0xdb, 0xfe, 0xfd, 0x08, 0x3b, 0x88, 0x23, 0x87, - 0xce, 0x71, 0xb5, 0x6a, 0xac, 0xdc, 0x55, 0xf3, 0x18, 0xf4, 0xbb, 0x4d, 0x2a, 0x98, 0x15, 0x4c, - 0x79, 0x6b, 0x85, 0x02, 0x31, 0xc7, 0xa1, 0x27, 0x60, 0xb0, 0xe6, 0x37, 0x9b, 0x8e, 0x57, 0x67, - 0x47, 0x5e, 0x69, 0x7e, 0x98, 0xca, 0x6e, 0x0b, 0x1c, 0x84, 0x25, 0x0e, 0x3d, 0x02, 0x7d, 0x4e, - 0xb0, 0xc5, 0xb5, 0x2e, 0xa5, 0xf9, 0x21, 0x5a, 0xd3, 0x5c, 0xb0, 0x15, 0x62, 0x06, 0xa5, 0x97, - 0xc6, 0xdb, 0x7e, 0xb0, 0xe3, 0x7a, 0x5b, 0x8b, 0x6e, 0x20, 0x96, 0x84, 0x3a, 0x0b, 0x6f, 0x29, - 0x0c, 0xd6, 0xa8, 0xd0, 0x32, 0xf4, 0xb7, 0xfc, 0x20, 0x0a, 0xa7, 0x07, 0x58, 0x77, 0x3f, 0x9a, - 0xb3, 0x11, 0xf1, 0xaf, 0xad, 0xf8, 0x41, 0x14, 0x7f, 0x00, 0xfd, 0x17, 0x62, 0x5e, 0x1c, 0x5d, - 0x83, 0x41, 0xe2, 0xed, 0x2e, 0x07, 0x7e, 0x73, 0x7a, 0x2a, 0x9f, 0xd3, 0x12, 0x27, 0xe1, 0xd3, - 0x2c, 0x96, 0x51, 0x05, 0x18, 0x4b, 0x16, 0xe8, 0x83, 0x50, 0x24, 0xde, 0xee, 0xf4, 0x20, 0xe3, - 0x34, 0x93, 0xc3, 0xe9, 0xa6, 0x13, 0xc4, 0x7b, 0xfe, 0x92, 0xb7, 0x8b, 0x69, 0x19, 0xf4, 0x31, - 0x28, 0xc9, 0x0d, 0x23, 0x14, 0xea, 0xcc, 0xcc, 0x09, 0x2b, 0xb7, 0x19, 0x4c, 0xde, 0x6a, 0xbb, - 0x01, 0x69, 0x12, 0x2f, 0x0a, 0xe3, 0x1d, 0x52, 0x62, 0x43, 0x1c, 0x73, 0x43, 0x35, 0x18, 0x09, - 0x48, 0xe8, 0xde, 0x25, 0x15, 0xbf, 0xe1, 0xd6, 0xf6, 0xa6, 0x1f, 0x62, 0xcd, 0x7b, 0xaa, 0x63, - 0x97, 0x61, 0xad, 0x40, 0xac, 0x6e, 0xd7, 0xa1, 0xd8, 0x60, 0x8a, 0x3e, 0x26, 0x15, 0xf5, 0xab, - 0x7e, 0xdb, 0x8b, 0xc2, 0xe9, 0x12, 0xab, 0x24, 0xd3, 0x84, 0x7a, 0x33, 0xa6, 0x4b, 0x6a, 0xf2, - 0x79, 0x61, 0x6c, 0xb0, 0x42, 0x9f, 0x80, 0x51, 0xfe, 0x9f, 0x1b, 0x22, 0xc3, 0xe9, 0x93, 0x8c, - 0xf7, 0xb9, 0x7c, 0xde, 0x9c, 0x70, 0xfe, 0xa4, 0x60, 0x3e, 0xaa, 0x43, 0x43, 0x6c, 0x72, 0x43, - 0x18, 0x46, 0x1b, 0xee, 0x2e, 0xf1, 0x48, 0x18, 0x56, 0x02, 0x7f, 0x83, 0x08, 0xbd, 0xea, 0xe9, - 0x6c, 0xc3, 0xa5, 0xbf, 0x41, 0xe6, 0x27, 0x29, 0xcf, 0x6b, 0x7a, 0x19, 0x6c, 0xb2, 0x40, 0x37, - 0x60, 0x8c, 0x5e, 0x64, 0xdd, 0x98, 0xe9, 0x70, 0x37, 0xa6, 0xec, 0xf2, 0x86, 0x8d, 0x42, 0x38, - 0xc1, 0x04, 0x5d, 0x87, 0x91, 0x30, 0x72, 0x82, 0xa8, 0xdd, 0xe2, 0x4c, 0x4f, 0x75, 0x63, 0xca, - 0xec, 0xde, 0x55, 0xad, 0x08, 0x36, 0x18, 0xa0, 0xd7, 0xa0, 0xd4, 0x70, 0x37, 0x49, 0x6d, 0xaf, - 0xd6, 0x20, 0xd3, 0x23, 0x8c, 0x5b, 0xe6, 0xce, 0x75, 0x4d, 0x12, 0x71, 0x61, 0x5a, 0xfd, 0xc5, - 0x71, 0x71, 0x74, 0x13, 0x4e, 0x45, 0x24, 0x68, 0xba, 0x9e, 0x43, 0x77, 0x1c, 0x71, 0x7f, 0x63, - 0xf6, 0xe4, 0x51, 0xb6, 0xa4, 0xcf, 0x8a, 0xd1, 0x38, 0xb5, 0x9e, 0x49, 0x85, 0x73, 0x4a, 0xa3, - 0x3b, 0x30, 0x9d, 0x81, 0xe1, 0x53, 0xf9, 0x04, 0xe3, 0xfc, 0x21, 0xc1, 0x79, 0x7a, 0x3d, 0x87, - 0xee, 0xa0, 0x03, 0x0e, 0xe7, 0x72, 0x47, 0xd7, 0x61, 0x9c, 0x6d, 0x73, 0x95, 0x76, 0xa3, 0x21, - 0x2a, 0x1c, 0x63, 0x15, 0x3e, 0x21, 0x0f, 0xfd, 0x15, 0x13, 0x7d, 0xb0, 0x5f, 0x86, 0xf8, 0x1f, - 0x4e, 0x96, 0x46, 0x1b, 0xcc, 0x74, 0xd9, 0x0e, 0xdc, 0x68, 0x8f, 0xae, 0x34, 0x72, 0x27, 0x9a, - 0x1e, 0xef, 0xa8, 0xc6, 0xd1, 0x49, 0x95, 0x7d, 0x53, 0x07, 0xe2, 0x24, 0x43, 0xba, 0x6f, 0x87, - 0x51, 0xdd, 0xf5, 0xa6, 0x27, 0xf8, 0xe5, 0x47, 0x6e, 0x7b, 0x55, 0x0a, 0xc4, 0x1c, 0xc7, 0xcc, - 0x96, 0xf4, 0xc7, 0x75, 0x7a, 0x3c, 0x4e, 0x32, 0xc2, 0xd8, 0x6c, 0x29, 0x11, 0x38, 0xa6, 0xa1, - 0x12, 0x6b, 0x14, 0xed, 0x4d, 0x23, 0x46, 0xaa, 0x76, 0xaf, 0xf5, 0xf5, 0x8f, 0x61, 0x0a, 0xb7, - 0x37, 0x60, 0x4c, 0x6d, 0x1d, 0xac, 0x4f, 0x50, 0x19, 0xfa, 0x99, 0x8c, 0x26, 0x94, 0x8e, 0x25, - 0xda, 0x04, 0x26, 0xbf, 0x61, 0x0e, 0x67, 0x4d, 0x70, 0xef, 0x92, 0xf9, 0xbd, 0x88, 0x70, 0xc5, - 0x41, 0x51, 0x6b, 0x82, 0x44, 0xe0, 0x98, 0xc6, 0xfe, 0xbf, 0x5c, 0xd6, 0x8d, 0xb7, 0xf4, 0x1e, - 0x0e, 0xb1, 0x67, 0x60, 0x68, 0xdb, 0x0f, 0x23, 0x4a, 0xcd, 0xea, 0xe8, 0x8f, 0xa5, 0xdb, 0x2b, - 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x05, 0x46, 0x6b, 0x7a, 0x05, 0xe2, 0x04, 0x56, 0xdb, 0x88, 0x51, - 0x3b, 0x36, 0x69, 0xd1, 0x4b, 0x30, 0xc4, 0x5c, 0x71, 0x6a, 0x7e, 0x43, 0x88, 0x86, 0x52, 0x8c, - 0x18, 0xaa, 0x08, 0xf8, 0x81, 0xf6, 0x1b, 0x2b, 0x6a, 0x74, 0x1e, 0x06, 0x68, 0x13, 0x56, 0x2a, - 0xe2, 0xec, 0x53, 0xfa, 0xb3, 0x2b, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0x55, 0x8b, 0x09, 0x3e, 0xe9, - 0x0d, 0x1a, 0x5d, 0x61, 0x3b, 0x3c, 0xdb, 0xee, 0x35, 0xfd, 0xd5, 0xe3, 0xda, 0xb6, 0xad, 0x70, - 0x07, 0x89, 0xff, 0xd8, 0x28, 0x89, 0xde, 0x80, 0xd1, 0x80, 0xb0, 0x2d, 0x42, 0x4c, 0x78, 0x7e, - 0xfa, 0xbf, 0x20, 0xbb, 0x00, 0xeb, 0xc8, 0x83, 0xfd, 0xf2, 0xc3, 0xf1, 0x79, 0x44, 0xdb, 0x63, - 0xa0, 0xb1, 0xc9, 0xca, 0xfe, 0xcb, 0x05, 0x6d, 0x96, 0x54, 0x23, 0x27, 0x22, 0xa8, 0x02, 0x83, - 0xb7, 0x1d, 0x37, 0x72, 0xbd, 0x2d, 0x21, 0xa4, 0x75, 0x3e, 0x95, 0x58, 0xa1, 0x5b, 0xbc, 0x00, - 0x17, 0x35, 0xc4, 0x1f, 0x2c, 0xd9, 0x50, 0x8e, 0x41, 0xdb, 0xf3, 0x28, 0xc7, 0x42, 0xaf, 0x1c, - 0x31, 0x2f, 0xc0, 0x39, 0x8a, 0x3f, 0x58, 0xb2, 0x41, 0x6f, 0x02, 0xc8, 0x1d, 0x82, 0xd4, 0x85, - 0x0b, 0xcf, 0x33, 0xdd, 0x99, 0xae, 0xab, 0x32, 0xf3, 0x63, 0x54, 0x90, 0x89, 0xff, 0x63, 0x8d, - 0x9f, 0x1d, 0x69, 0x63, 0xaa, 0x37, 0x06, 0x7d, 0x9c, 0x2e, 0x51, 0x27, 0x88, 0x48, 0x7d, 0x2e, - 0x12, 0x9d, 0xf3, 0xde, 0xde, 0x6e, 0x72, 0xeb, 0x6e, 0x93, 0xe8, 0xcb, 0x59, 0x30, 0xc1, 0x31, - 0x3f, 0xfb, 0x17, 0x8b, 0x30, 0x9d, 0xd7, 0x5c, 0xba, 0x68, 0xc8, 0x1d, 0x37, 0x5a, 0xa0, 0x32, - 0xa8, 0x65, 0x2e, 0x9a, 0x25, 0x01, 0xc7, 0x8a, 0x82, 0xce, 0xde, 0xd0, 0xdd, 0x92, 0x17, 0xf1, - 0xfe, 0x78, 0xf6, 0x56, 0x19, 0x14, 0x0b, 0x2c, 0xa5, 0x0b, 0x88, 0x13, 0x0a, 0x1f, 0x31, 0x6d, - 0x96, 0x63, 0x06, 0xc5, 0x02, 0xab, 0xab, 0x04, 0xfb, 0xba, 0xa8, 0x04, 0x8d, 0x2e, 0xea, 0x3f, - 0xda, 0x2e, 0x42, 0x9f, 0x04, 0xd8, 0x74, 0x3d, 0x37, 0xdc, 0x66, 0xdc, 0x07, 0x0e, 0xcd, 0x5d, - 0x49, 0xb0, 0xcb, 0x8a, 0x0b, 0xd6, 0x38, 0xa2, 0x17, 0x61, 0x58, 0x6d, 0x20, 0x2b, 0x8b, 0xcc, - 0x60, 0xae, 0x39, 0x20, 0xc5, 0xbb, 0xe9, 0x22, 0xd6, 0xe9, 0xec, 0x4f, 0x27, 0xe7, 0x8b, 0x58, - 0x01, 0x5a, 0xff, 0x5a, 0xbd, 0xf6, 0x6f, 0xa1, 0x73, 0xff, 0xda, 0xdf, 0x18, 0x80, 0x71, 0xa3, - 0xb2, 0x76, 0xd8, 0xc3, 0x9e, 0x7b, 0x99, 0x1e, 0x40, 0x4e, 0x44, 0xc4, 0xfa, 0xb3, 0xbb, 0x2f, - 0x15, 0xfd, 0x90, 0xa2, 0x2b, 0x80, 0x97, 0x47, 0x9f, 0x84, 0x52, 0xc3, 0x09, 0x99, 0x7a, 0x91, - 0x88, 0x75, 0xd7, 0x0b, 0xb3, 0xf8, 0xf6, 0xe6, 0x84, 0x91, 0x76, 0xea, 0x73, 0xde, 0x31, 0x4b, - 0x7a, 0x52, 0x52, 0xf9, 0x4a, 0x3a, 0x21, 0xaa, 0x46, 0x50, 0x21, 0x6c, 0x0f, 0x73, 0x1c, 0x7a, - 0x89, 0x6d, 0xad, 0x74, 0x56, 0x2c, 0x50, 0x69, 0x94, 0x4d, 0xb3, 0x7e, 0x43, 0x22, 0x56, 0x38, - 0x6c, 0x50, 0xc6, 0x17, 0xa8, 0x81, 0x0e, 0x17, 0xa8, 0xa7, 0x60, 0x90, 0xfd, 0x50, 0x33, 0x40, - 0x8d, 0xc6, 0x0a, 0x07, 0x63, 0x89, 0x4f, 0x4e, 0x98, 0xa1, 0xde, 0x26, 0x0c, 0xbd, 0xa2, 0x89, - 0x49, 0xcd, 0x9c, 0x15, 0x86, 0xf8, 0x2e, 0x27, 0xa6, 0x3c, 0x96, 0x38, 0xf4, 0xb3, 0x16, 0x20, - 0xa7, 0x41, 0xaf, 0xb6, 0x14, 0xac, 0x6e, 0x22, 0xc0, 0x44, 0xed, 0x57, 0xba, 0x76, 0x7b, 0x3b, - 0x9c, 0x9d, 0x4b, 0x95, 0xe6, 0x6a, 0xcd, 0x97, 0x45, 0x13, 0x51, 0x9a, 0x40, 0x3f, 0x8c, 0xae, - 0xb9, 0x61, 0xf4, 0xb9, 0xff, 0x98, 0x38, 0x9c, 0x32, 0x9a, 0x84, 0x6e, 0xe8, 0x37, 0xa5, 0xe1, - 0x43, 0xde, 0x94, 0x46, 0xf3, 0x6e, 0x49, 0x33, 0x6d, 0x78, 0x28, 0xe7, 0x0b, 0x32, 0x94, 0xa5, - 0x8b, 0xba, 0xb2, 0xb4, 0x8b, 0x8a, 0x6d, 0x56, 0xd6, 0x31, 0xfb, 0x7a, 0xdb, 0xf1, 0x22, 0x37, - 0xda, 0xd3, 0x95, 0xab, 0xef, 0x85, 0xb1, 0x45, 0x87, 0x34, 0x7d, 0x6f, 0xc9, 0xab, 0xb7, 0x7c, - 0xd7, 0x8b, 0xd0, 0x34, 0xf4, 0x31, 0xe1, 0x83, 0x6f, 0xbd, 0x7d, 0xb4, 0xf7, 0x30, 0x83, 0xd8, - 0x5b, 0x70, 0x72, 0xd1, 0xbf, 0xed, 0xdd, 0x76, 0x82, 0xfa, 0x5c, 0x65, 0x45, 0x53, 0xfe, 0xac, - 0x49, 0xe5, 0x83, 0x95, 0x7f, 0xb5, 0xd3, 0x4a, 0xf2, 0xeb, 0xd0, 0xb2, 0xdb, 0x20, 0x39, 0x2a, - 0xba, 0xbf, 0x56, 0x30, 0x6a, 0x8a, 0xe9, 0x95, 0x91, 0xd8, 0xca, 0x35, 0x12, 0xbf, 0x0e, 0x43, - 0x9b, 0x2e, 0x69, 0xd4, 0x31, 0xd9, 0x14, 0xbd, 0xf3, 0x64, 0xbe, 0x1b, 0xd9, 0x32, 0xa5, 0x94, - 0x2a, 0x59, 0xae, 0xba, 0x58, 0x16, 0x85, 0xb1, 0x62, 0x83, 0x76, 0x60, 0x42, 0xf6, 0xa1, 0xc4, - 0x8a, 0xfd, 0xe0, 0xa9, 0x4e, 0x03, 0x6f, 0x32, 0x3f, 0x71, 0x6f, 0xbf, 0x3c, 0x81, 0x13, 0x6c, - 0x70, 0x8a, 0x31, 0x7a, 0x04, 0xfa, 0x9a, 0xf4, 0xe4, 0xeb, 0x63, 0xdd, 0xcf, 0x74, 0x15, 0x4c, - 0xed, 0xc2, 0xa0, 0xf6, 0x8f, 0x5b, 0xf0, 0x50, 0xaa, 0x67, 0x84, 0xfa, 0xe9, 0x88, 0x47, 0x21, - 0xa9, 0x0e, 0x2a, 0x74, 0x57, 0x07, 0xd9, 0x7f, 0xdb, 0x82, 0x13, 0x4b, 0xcd, 0x56, 0xb4, 0xb7, - 0xe8, 0x9a, 0x16, 0xdd, 0x0f, 0xc0, 0x40, 0x93, 0xd4, 0xdd, 0x76, 0x53, 0x8c, 0x5c, 0x59, 0x9e, - 0x0e, 0xab, 0x0c, 0x7a, 0xb0, 0x5f, 0x1e, 0xad, 0x46, 0x7e, 0xe0, 0x6c, 0x11, 0x0e, 0xc0, 0x82, - 0x9c, 0x9d, 0xb1, 0xee, 0x5d, 0x72, 0xcd, 0x6d, 0xba, 0xd1, 0xfd, 0xcd, 0x76, 0x61, 0x8c, 0x95, - 0x4c, 0x70, 0xcc, 0xcf, 0xfe, 0xba, 0x05, 0xe3, 0x72, 0xde, 0xcf, 0xd5, 0xeb, 0x01, 0x09, 0x43, - 0x34, 0x03, 0x05, 0xb7, 0x25, 0x5a, 0x09, 0xa2, 0x95, 0x85, 0x95, 0x0a, 0x2e, 0xb8, 0x2d, 0x29, - 0xce, 0xb3, 0x03, 0xa8, 0x68, 0xda, 0xa5, 0xaf, 0x08, 0x38, 0x56, 0x14, 0xe8, 0x02, 0x0c, 0x79, - 0x7e, 0x9d, 0x4b, 0xc4, 0x5c, 0x94, 0x60, 0x13, 0x6c, 0x4d, 0xc0, 0xb0, 0xc2, 0xa2, 0x0a, 0x94, - 0xb8, 0xd7, 0x62, 0x3c, 0x69, 0x7b, 0xf2, 0x7d, 0x64, 0x5f, 0xb6, 0x2e, 0x4b, 0xe2, 0x98, 0x89, - 0xfd, 0xeb, 0x16, 0x8c, 0xc8, 0x2f, 0xeb, 0xf1, 0xae, 0x42, 0x97, 0x56, 0x7c, 0x4f, 0x89, 0x97, - 0x16, 0xbd, 0x6b, 0x30, 0x8c, 0x71, 0xc5, 0x28, 0x1e, 0xea, 0x8a, 0x71, 0x09, 0x86, 0x9d, 0x56, - 0xab, 0x62, 0xde, 0x4f, 0xd8, 0x54, 0x9a, 0x8b, 0xc1, 0x58, 0xa7, 0xb1, 0x7f, 0xac, 0x00, 0x63, - 0xf2, 0x0b, 0xaa, 0xed, 0x8d, 0x90, 0x44, 0x68, 0x1d, 0x4a, 0x0e, 0x1f, 0x25, 0x22, 0x27, 0xf9, - 0x63, 0xd9, 0x4a, 0x2e, 0x63, 0x48, 0x63, 0x41, 0x6b, 0x4e, 0x96, 0xc6, 0x31, 0x23, 0xd4, 0x80, - 0x49, 0xcf, 0x8f, 0xd8, 0xa1, 0xab, 0xf0, 0x9d, 0xec, 0x8e, 0x49, 0xee, 0xa7, 0x05, 0xf7, 0xc9, - 0xb5, 0x24, 0x17, 0x9c, 0x66, 0x8c, 0x96, 0xa4, 0xe2, 0xb0, 0x98, 0xaf, 0x44, 0xd2, 0x07, 0x2e, - 0x5b, 0x6f, 0x68, 0xff, 0x8a, 0x05, 0x25, 0x49, 0x76, 0x1c, 0x26, 0xe6, 0x55, 0x18, 0x0c, 0xd9, - 0x20, 0xc8, 0xae, 0xb1, 0x3b, 0x35, 0x9c, 0x8f, 0x57, 0x2c, 0x4b, 0xf0, 0xff, 0x21, 0x96, 0x3c, - 0x98, 0xdd, 0x48, 0x35, 0xff, 0x1d, 0x62, 0x37, 0x52, 0xed, 0xc9, 0x39, 0x94, 0xfe, 0x88, 0xb5, - 0x59, 0x53, 0xc4, 0x52, 0x91, 0xb7, 0x15, 0x90, 0x4d, 0xf7, 0x4e, 0x52, 0xe4, 0xad, 0x30, 0x28, - 0x16, 0x58, 0xf4, 0x26, 0x8c, 0xd4, 0xa4, 0xc1, 0x20, 0x5e, 0xe1, 0xe7, 0x3b, 0x1a, 0xaf, 0x94, - 0x9d, 0x93, 0xeb, 0xd0, 0x16, 0xb4, 0xf2, 0xd8, 0xe0, 0x66, 0x7a, 0xe5, 0x14, 0xbb, 0x79, 0xe5, - 0xc4, 0x7c, 0xf3, 0x7d, 0x54, 0x7e, 0xc2, 0x82, 0x01, 0xae, 0x28, 0xee, 0x4d, 0x4f, 0xaf, 0x99, - 0x7d, 0xe3, 0xbe, 0xbb, 0x49, 0x81, 0x42, 0xd2, 0x40, 0xab, 0x50, 0x62, 0x3f, 0x98, 0xa2, 0xbb, - 0x98, 0xff, 0x68, 0x86, 0xd7, 0xaa, 0x37, 0xf0, 0xa6, 0x2c, 0x86, 0x63, 0x0e, 0xf6, 0x8f, 0x16, - 0xe9, 0xee, 0x16, 0x93, 0x1a, 0x87, 0xbe, 0xf5, 0xe0, 0x0e, 0xfd, 0xc2, 0x83, 0x3a, 0xf4, 0xb7, - 0x60, 0xbc, 0xa6, 0x19, 0x89, 0xe3, 0x91, 0xbc, 0xd0, 0x71, 0x92, 0x68, 0xf6, 0x64, 0xae, 0x9d, - 0x5b, 0x30, 0x99, 0xe0, 0x24, 0x57, 0xf4, 0x71, 0x18, 0xe1, 0xe3, 0x2c, 0x6a, 0xe1, 0x8e, 0x4d, - 0x4f, 0xe4, 0xcf, 0x17, 0xbd, 0x0a, 0xae, 0xcd, 0xd5, 0x8a, 0x63, 0x83, 0x99, 0xfd, 0xa7, 0x16, - 0xa0, 0xa5, 0xd6, 0x36, 0x69, 0x92, 0xc0, 0x69, 0xc4, 0xb6, 0x9e, 0x1f, 0xb2, 0x60, 0x9a, 0xa4, - 0xc0, 0x0b, 0x7e, 0xb3, 0x29, 0x2e, 0x8b, 0x39, 0xfa, 0x8c, 0xa5, 0x9c, 0x32, 0xea, 0x55, 0xd1, - 0x74, 0x1e, 0x05, 0xce, 0xad, 0x0f, 0xad, 0xc2, 0x14, 0x3f, 0x25, 0x15, 0x42, 0x73, 0x92, 0x7a, - 0x58, 0x30, 0x9e, 0x5a, 0x4f, 0x93, 0xe0, 0xac, 0x72, 0xf6, 0x37, 0x47, 0x20, 0xb7, 0x15, 0xef, - 0x1a, 0xb9, 0xde, 0x35, 0x72, 0xbd, 0x6b, 0xe4, 0x7a, 0xd7, 0xc8, 0xf5, 0xae, 0x91, 0xeb, 0x5d, - 0x23, 0xd7, 0x51, 0x18, 0xb9, 0xfe, 0x8a, 0x05, 0x27, 0xd5, 0x59, 0x63, 0xdc, 0xae, 0x3f, 0x03, - 0x53, 0x7c, 0xb9, 0x19, 0xde, 0xbb, 0xe2, 0x6c, 0xbd, 0x94, 0x39, 0x73, 0x13, 0x5e, 0xe6, 0x46, - 0x41, 0xfe, 0x5c, 0x27, 0x03, 0x81, 0xb3, 0xaa, 0xb1, 0x7f, 0x71, 0x08, 0xfa, 0x97, 0x76, 0x89, - 0x17, 0x1d, 0xc3, 0x3d, 0xa4, 0x06, 0x63, 0xae, 0xb7, 0xeb, 0x37, 0x76, 0x49, 0x9d, 0xe3, 0x0f, - 0x73, 0x5d, 0x3e, 0x25, 0x58, 0x8f, 0xad, 0x18, 0x2c, 0x70, 0x82, 0xe5, 0x83, 0x30, 0x15, 0x5c, - 0x86, 0x01, 0x7e, 0x52, 0x08, 0x3b, 0x41, 0xe6, 0x9e, 0xcd, 0x3a, 0x51, 0x9c, 0x7f, 0xb1, 0x19, - 0x83, 0x9f, 0x44, 0xa2, 0x38, 0xfa, 0x34, 0x8c, 0x6d, 0xba, 0x41, 0x18, 0xad, 0xbb, 0x4d, 0x12, - 0x46, 0x4e, 0xb3, 0x75, 0x1f, 0xa6, 0x01, 0xd5, 0x0f, 0xcb, 0x06, 0x27, 0x9c, 0xe0, 0x8c, 0xb6, - 0x60, 0xb4, 0xe1, 0xe8, 0x55, 0x0d, 0x1e, 0xba, 0x2a, 0x75, 0x3a, 0x5c, 0xd3, 0x19, 0x61, 0x93, - 0x2f, 0x5d, 0x4e, 0x35, 0xa6, 0xdd, 0x1e, 0x62, 0xba, 0x07, 0xb5, 0x9c, 0xb8, 0x5a, 0x9b, 0xe3, - 0xa8, 0x34, 0xc5, 0x5c, 0xc4, 0x4b, 0xa6, 0x34, 0xa5, 0x39, 0x82, 0x7f, 0x0a, 0x4a, 0x84, 0x76, - 0x21, 0x65, 0x2c, 0x0e, 0x98, 0x8b, 0xbd, 0xb5, 0x75, 0xd5, 0xad, 0x05, 0xbe, 0x69, 0x94, 0x59, - 0x92, 0x9c, 0x70, 0xcc, 0x14, 0x2d, 0xc0, 0x40, 0x48, 0x02, 0x57, 0x29, 0x7e, 0x3b, 0x0c, 0x23, - 0x23, 0xe3, 0xef, 0xc1, 0xf8, 0x6f, 0x2c, 0x8a, 0xd2, 0xe9, 0xe5, 0x30, 0xbd, 0x29, 0x3b, 0x0c, - 0xb4, 0xe9, 0x35, 0xc7, 0xa0, 0x58, 0x60, 0xd1, 0x6b, 0x30, 0x18, 0x90, 0x06, 0xb3, 0xfa, 0x8d, - 0xf6, 0x3e, 0xc9, 0xb9, 0x11, 0x91, 0x97, 0xc3, 0x92, 0x01, 0xba, 0x0a, 0x28, 0x20, 0x54, 0x1a, - 0x73, 0xbd, 0x2d, 0xe5, 0x38, 0x2d, 0x36, 0x5a, 0x25, 0xf5, 0xe2, 0x98, 0x42, 0x3e, 0x05, 0xc4, - 0x19, 0xc5, 0xd0, 0x65, 0x98, 0x54, 0xd0, 0x15, 0x2f, 0x8c, 0x1c, 0xba, 0xc1, 0x8d, 0x33, 0x5e, - 0x4a, 0x19, 0x82, 0x93, 0x04, 0x38, 0x5d, 0xc6, 0xfe, 0x92, 0x05, 0xbc, 0x9f, 0x8f, 0x41, 0x05, - 0xf0, 0xaa, 0xa9, 0x02, 0x38, 0x9d, 0x3b, 0x72, 0x39, 0xd7, 0xff, 0x2f, 0x59, 0x30, 0xac, 0x8d, - 0x6c, 0x3c, 0x67, 0xad, 0x0e, 0x73, 0xb6, 0x0d, 0x13, 0x74, 0xa6, 0x5f, 0xdf, 0x08, 0x49, 0xb0, - 0x4b, 0xea, 0x6c, 0x62, 0x16, 0xee, 0x6f, 0x62, 0x2a, 0x27, 0xcd, 0x6b, 0x09, 0x86, 0x38, 0x55, - 0x85, 0xfd, 0x29, 0xd9, 0x54, 0xe5, 0xd3, 0x5a, 0x53, 0x63, 0x9e, 0xf0, 0x69, 0x55, 0xa3, 0x8a, - 0x63, 0x1a, 0xba, 0xd4, 0xb6, 0xfd, 0x30, 0x4a, 0xfa, 0xb4, 0x5e, 0xf1, 0xc3, 0x08, 0x33, 0x8c, - 0xfd, 0x3c, 0xc0, 0xd2, 0x1d, 0x52, 0xe3, 0x33, 0x56, 0xbf, 0xa1, 0x58, 0xf9, 0x37, 0x14, 0xfb, - 0x77, 0x2c, 0x18, 0x5b, 0x5e, 0x30, 0x4e, 0xae, 0x59, 0x00, 0x7e, 0xad, 0xba, 0x75, 0x6b, 0x4d, - 0xfa, 0x6a, 0x70, 0x73, 0xb5, 0x82, 0x62, 0x8d, 0x02, 0x9d, 0x86, 0x62, 0xa3, 0xed, 0x09, 0x1d, - 0xe5, 0x20, 0x3d, 0x1e, 0xaf, 0xb5, 0x3d, 0x4c, 0x61, 0xda, 0x33, 0xa0, 0x62, 0xcf, 0xcf, 0x80, - 0xba, 0x86, 0xff, 0x40, 0x65, 0xe8, 0xbf, 0x7d, 0xdb, 0xad, 0xf3, 0x47, 0xd6, 0xc2, 0x8f, 0xe4, - 0xd6, 0xad, 0x95, 0xc5, 0x10, 0x73, 0xb8, 0xfd, 0x85, 0x22, 0xcc, 0x2c, 0x37, 0xc8, 0x9d, 0xb7, - 0xf9, 0xd0, 0xbc, 0xd7, 0x47, 0x4c, 0x87, 0xd3, 0xf6, 0x1c, 0xf6, 0xa1, 0x5a, 0xf7, 0xfe, 0xd8, - 0x84, 0x41, 0xee, 0xd2, 0x29, 0x9f, 0x9d, 0x67, 0xda, 0xe6, 0xf2, 0x3b, 0x64, 0x96, 0xbb, 0x86, - 0x0a, 0xdb, 0x9c, 0x3a, 0x30, 0x05, 0x14, 0x4b, 0xe6, 0x33, 0x2f, 0xc3, 0x88, 0x4e, 0x79, 0xa8, - 0x27, 0xa3, 0xdf, 0x53, 0x84, 0x09, 0xda, 0x82, 0x07, 0x3a, 0x10, 0x37, 0xd2, 0x03, 0x71, 0xd4, - 0xcf, 0x06, 0xbb, 0x8f, 0xc6, 0x9b, 0xc9, 0xd1, 0xb8, 0x94, 0x37, 0x1a, 0xc7, 0x3d, 0x06, 0xdf, - 0x6b, 0xc1, 0xd4, 0x72, 0xc3, 0xaf, 0xed, 0x24, 0x9e, 0xf6, 0xbd, 0x08, 0xc3, 0x74, 0x3b, 0x0e, - 0x8d, 0x28, 0x17, 0x46, 0xdc, 0x13, 0x81, 0xc2, 0x3a, 0x9d, 0x56, 0xec, 0xc6, 0x8d, 0x95, 0xc5, - 0xac, 0x70, 0x29, 0x02, 0x85, 0x75, 0x3a, 0xfb, 0xb7, 0x2c, 0x38, 0x73, 0x79, 0x61, 0x29, 0x9e, - 0x8a, 0xa9, 0x88, 0x2d, 0xe7, 0x61, 0xa0, 0x55, 0xd7, 0x9a, 0x12, 0xeb, 0x70, 0x17, 0x59, 0x2b, - 0x04, 0xf6, 0x9d, 0x12, 0x8d, 0xe8, 0x06, 0xc0, 0x65, 0x5c, 0x59, 0x10, 0xfb, 0xae, 0x34, 0xd9, - 0x58, 0xb9, 0x26, 0x9b, 0x27, 0x60, 0x90, 0x9e, 0x0b, 0x6e, 0x4d, 0xb6, 0x9b, 0x5b, 0xdf, 0x39, - 0x08, 0x4b, 0x9c, 0xfd, 0x73, 0x16, 0x4c, 0x5d, 0x76, 0x23, 0x7a, 0x68, 0x27, 0x43, 0x92, 0xd0, - 0x53, 0x3b, 0x74, 0x23, 0x3f, 0xd8, 0x4b, 0x86, 0x24, 0xc1, 0x0a, 0x83, 0x35, 0x2a, 0xfe, 0x41, - 0xbb, 0x2e, 0x7b, 0xa3, 0x50, 0x30, 0x8d, 0x64, 0x58, 0xc0, 0xb1, 0xa2, 0xa0, 0xfd, 0x55, 0x77, - 0x03, 0xa6, 0x5f, 0xdc, 0x13, 0x1b, 0xb7, 0xea, 0xaf, 0x45, 0x89, 0xc0, 0x31, 0x8d, 0xfd, 0xc7, - 0x16, 0x94, 0x2f, 0x37, 0xda, 0x61, 0x44, 0x82, 0xcd, 0x30, 0x67, 0xd3, 0x7d, 0x1e, 0x4a, 0x44, - 0x6a, 0xf3, 0xe5, 0x63, 0x4a, 0x29, 0x88, 0x2a, 0x35, 0x3f, 0x8f, 0x8c, 0xa2, 0xe8, 0x7a, 0x78, - 0x7f, 0x7c, 0xb8, 0x07, 0xa4, 0xcb, 0x80, 0x88, 0x5e, 0x97, 0x1e, 0x2a, 0x86, 0xc5, 0x9c, 0x58, - 0x4a, 0x61, 0x71, 0x46, 0x09, 0xfb, 0xc7, 0x2d, 0x38, 0xa9, 0x3e, 0xf8, 0x1d, 0xf7, 0x99, 0xf6, - 0x57, 0x0b, 0x30, 0x7a, 0x65, 0x7d, 0xbd, 0x72, 0x99, 0x44, 0xda, 0xac, 0xec, 0x6c, 0xa3, 0xc7, - 0x9a, 0xa9, 0xb1, 0xd3, 0x1d, 0xb1, 0x1d, 0xb9, 0x8d, 0x59, 0x1e, 0x71, 0x6c, 0x76, 0xc5, 0x8b, - 0xae, 0x07, 0xd5, 0x28, 0x70, 0xbd, 0xad, 0xcc, 0x99, 0x2e, 0x65, 0x96, 0x62, 0x9e, 0xcc, 0x82, - 0x9e, 0x87, 0x01, 0x16, 0xf2, 0x4c, 0x0e, 0xc2, 0xc3, 0xea, 0x8a, 0xc5, 0xa0, 0x07, 0xfb, 0xe5, - 0xd2, 0x0d, 0xbc, 0xc2, 0xff, 0x60, 0x41, 0x8a, 0x6e, 0xc0, 0xf0, 0x76, 0x14, 0xb5, 0xae, 0x10, - 0xa7, 0x4e, 0x02, 0xb9, 0xcb, 0x9e, 0xcd, 0xda, 0x65, 0x69, 0x27, 0x70, 0xb2, 0x78, 0x63, 0x8a, - 0x61, 0x21, 0xd6, 0xf9, 0xd8, 0x55, 0x80, 0x18, 0x77, 0x44, 0x56, 0x16, 0x7b, 0x1d, 0x4a, 0xf4, - 0x73, 0xe7, 0x1a, 0xae, 0xd3, 0xd9, 0x8e, 0xfd, 0x34, 0x94, 0xa4, 0x95, 0x3a, 0x14, 0xf1, 0x11, - 0xd8, 0x89, 0x24, 0x8d, 0xd8, 0x21, 0x8e, 0xf1, 0xf6, 0x26, 0x9c, 0x60, 0xbe, 0xaa, 0x4e, 0xb4, - 0x6d, 0xcc, 0xbe, 0xee, 0xc3, 0xfc, 0x8c, 0xb8, 0xb1, 0xf1, 0x36, 0x4f, 0x6b, 0x0f, 0x7a, 0x47, - 0x24, 0xc7, 0xf8, 0xf6, 0x66, 0x7f, 0xb3, 0x0f, 0x1e, 0x5e, 0xa9, 0xe6, 0x87, 0xec, 0x79, 0x09, - 0x46, 0xb8, 0x20, 0x48, 0x07, 0xdd, 0x69, 0x88, 0x7a, 0x95, 0x6e, 0x73, 0x5d, 0xc3, 0x61, 0x83, - 0x12, 0x9d, 0x81, 0xa2, 0xfb, 0x96, 0x97, 0x7c, 0xee, 0xb6, 0xf2, 0xfa, 0x1a, 0xa6, 0x70, 0x8a, - 0xa6, 0x32, 0x25, 0xdf, 0xac, 0x15, 0x5a, 0xc9, 0x95, 0xaf, 0xc2, 0x98, 0x1b, 0xd6, 0x42, 0x77, - 0xc5, 0xa3, 0x2b, 0x50, 0x5b, 0xc3, 0x4a, 0x9b, 0x40, 0x1b, 0xad, 0xb0, 0x38, 0x41, 0xad, 0x9d, - 0x1c, 0xfd, 0x3d, 0xcb, 0xa5, 0x5d, 0x03, 0x06, 0xd0, 0x8d, 0xbd, 0xc5, 0xbe, 0x2e, 0x64, 0x9a, - 0x70, 0xb1, 0xb1, 0xf3, 0x0f, 0x0e, 0xb1, 0xc4, 0xd1, 0xab, 0x5a, 0x6d, 0xdb, 0x69, 0xcd, 0xb5, - 0xa3, 0xed, 0x45, 0x37, 0xac, 0xf9, 0xbb, 0x24, 0xd8, 0x63, 0xb7, 0xec, 0xa1, 0xf8, 0xaa, 0xa6, - 0x10, 0x0b, 0x57, 0xe6, 0x2a, 0x94, 0x12, 0xa7, 0xcb, 0xa0, 0x39, 0x18, 0x97, 0xc0, 0x2a, 0x09, - 0xd9, 0xe6, 0x3e, 0xcc, 0xd8, 0xa8, 0x07, 0x68, 0x02, 0xac, 0x98, 0x24, 0xe9, 0x4d, 0xd1, 0x15, - 0x8e, 0x42, 0x74, 0xfd, 0x00, 0x8c, 0xba, 0x9e, 0x1b, 0xb9, 0x4e, 0xe4, 0x73, 0x33, 0x0e, 0xbf, - 0x50, 0x33, 0xd5, 0xf1, 0x8a, 0x8e, 0xc0, 0x26, 0x9d, 0xfd, 0x9f, 0xfa, 0x60, 0x92, 0x0d, 0xdb, - 0xbb, 0x33, 0xec, 0x3b, 0x69, 0x86, 0xdd, 0x48, 0xcf, 0xb0, 0xa3, 0x90, 0xc9, 0xef, 0x7b, 0x9a, - 0x7d, 0x1a, 0x4a, 0xea, 0xcd, 0x9d, 0x7c, 0x74, 0x6b, 0xe5, 0x3c, 0xba, 0xed, 0x7e, 0x2e, 0x4b, - 0xcf, 0xb0, 0x62, 0xa6, 0x67, 0xd8, 0x97, 0x2d, 0x88, 0x4d, 0x06, 0xe8, 0x75, 0x28, 0xb5, 0x7c, - 0xe6, 0x68, 0x1a, 0x48, 0xef, 0xed, 0xc7, 0x3b, 0xda, 0x1c, 0x78, 0xd4, 0xb2, 0x80, 0xf7, 0x42, - 0x45, 0x16, 0xc5, 0x31, 0x17, 0x74, 0x15, 0x06, 0x5b, 0x01, 0xa9, 0x46, 0x2c, 0xa4, 0x4e, 0xef, - 0x0c, 0xf9, 0xac, 0xe1, 0x05, 0xb1, 0xe4, 0x60, 0xff, 0x67, 0x0b, 0x26, 0x92, 0xa4, 0xe8, 0x43, - 0xd0, 0x47, 0xee, 0x90, 0x9a, 0x68, 0x6f, 0xe6, 0x21, 0x1b, 0x2b, 0x1d, 0x78, 0x07, 0xd0, 0xff, - 0x98, 0x95, 0x42, 0x57, 0x60, 0x90, 0x9e, 0xb0, 0x97, 0x55, 0xf8, 0xb8, 0x47, 0xf3, 0x4e, 0x69, - 0x25, 0xaa, 0xf0, 0xc6, 0x09, 0x10, 0x96, 0xc5, 0x99, 0x3b, 0x56, 0xad, 0x55, 0xa5, 0x97, 0x97, - 0xa8, 0xd3, 0x1d, 0x7b, 0x7d, 0xa1, 0xc2, 0x89, 0x04, 0x37, 0xee, 0x8e, 0x25, 0x81, 0x38, 0x66, - 0x62, 0xff, 0xbc, 0x05, 0xc0, 0xbd, 0xcf, 0x1c, 0x6f, 0x8b, 0x1c, 0x83, 0x9e, 0x7c, 0x11, 0xfa, - 0xc2, 0x16, 0xa9, 0x75, 0xf2, 0x81, 0x8e, 0xdb, 0x53, 0x6d, 0x91, 0x5a, 0x3c, 0xe3, 0xe8, 0x3f, - 0xcc, 0x4a, 0xdb, 0xdf, 0x07, 0x30, 0x16, 0x93, 0xad, 0x44, 0xa4, 0x89, 0x9e, 0x35, 0x02, 0x75, - 0x9c, 0x4e, 0x04, 0xea, 0x28, 0x31, 0x6a, 0x4d, 0x25, 0xfb, 0x69, 0x28, 0x36, 0x9d, 0x3b, 0x42, - 0xe7, 0xf6, 0x74, 0xe7, 0x66, 0x50, 0xfe, 0xb3, 0xab, 0xce, 0x1d, 0x7e, 0x2d, 0x7d, 0x5a, 0xae, - 0x90, 0x55, 0xe7, 0x4e, 0x57, 0x3f, 0x5d, 0x5a, 0x09, 0xab, 0xcb, 0xf5, 0x84, 0x63, 0x55, 0x4f, - 0x75, 0xb9, 0x5e, 0xb2, 0x2e, 0xd7, 0xeb, 0xa1, 0x2e, 0xd7, 0x43, 0x77, 0x61, 0x50, 0xf8, 0x3d, - 0x8a, 0x50, 0x5e, 0x17, 0x7b, 0xa8, 0x4f, 0xb8, 0x4d, 0xf2, 0x3a, 0x2f, 0xca, 0x6b, 0xb7, 0x80, - 0x76, 0xad, 0x57, 0x56, 0x88, 0xfe, 0xaa, 0x05, 0x63, 0xe2, 0x37, 0x26, 0x6f, 0xb5, 0x49, 0x18, - 0x09, 0xb1, 0xf4, 0xfd, 0xbd, 0xb7, 0x41, 0x14, 0xe4, 0x4d, 0x79, 0xbf, 0x3c, 0x67, 0x4c, 0x64, - 0xd7, 0x16, 0x25, 0x5a, 0x81, 0xfe, 0xae, 0x05, 0x27, 0x9a, 0xce, 0x1d, 0x5e, 0x23, 0x87, 0x61, - 0x27, 0x72, 0x7d, 0xe1, 0x3f, 0xf0, 0xa1, 0xde, 0x86, 0x3f, 0x55, 0x9c, 0x37, 0x52, 0xda, 0x1f, - 0x4f, 0x64, 0x91, 0x74, 0x6d, 0x6a, 0x66, 0xbb, 0x66, 0x36, 0x61, 0x48, 0xce, 0xb7, 0x07, 0xe9, - 0x64, 0xcd, 0xea, 0x11, 0x73, 0xed, 0x81, 0xd6, 0xf3, 0x69, 0x18, 0xd1, 0xe7, 0xd8, 0x03, 0xad, - 0xeb, 0x2d, 0x98, 0xca, 0x98, 0x4b, 0x0f, 0xb4, 0xca, 0xdb, 0x70, 0x3a, 0x77, 0x7e, 0x3c, 0x50, - 0x27, 0xf9, 0xaf, 0x5a, 0xfa, 0x3e, 0x78, 0x0c, 0xc6, 0x8a, 0x05, 0xd3, 0x58, 0x71, 0xb6, 0xf3, - 0xca, 0xc9, 0xb1, 0x58, 0xbc, 0xa9, 0x37, 0x9a, 0xee, 0xea, 0xe8, 0x35, 0x18, 0x68, 0x50, 0x88, - 0xf4, 0x9e, 0xb5, 0xbb, 0xaf, 0xc8, 0x58, 0x98, 0x64, 0xf0, 0x10, 0x0b, 0x0e, 0xf6, 0x2f, 0x59, - 0xd0, 0x77, 0x0c, 0x3d, 0x81, 0xcd, 0x9e, 0x78, 0x36, 0x97, 0xb5, 0x88, 0x6a, 0x3e, 0x8b, 0x9d, - 0xdb, 0x4b, 0x77, 0x22, 0xe2, 0x85, 0xec, 0x44, 0xce, 0xec, 0x98, 0x9f, 0xb6, 0x60, 0xea, 0x9a, - 0xef, 0xd4, 0xe7, 0x9d, 0x86, 0xe3, 0xd5, 0x48, 0xb0, 0xe2, 0x6d, 0x1d, 0xca, 0xf5, 0xbb, 0xd0, - 0xd5, 0xf5, 0x7b, 0x41, 0x7a, 0x4e, 0xf5, 0xe5, 0x8f, 0x1f, 0x95, 0xa4, 0x93, 0xa1, 0x8b, 0x0c, - 0x1f, 0xdf, 0x6d, 0x40, 0x7a, 0x2b, 0xc5, 0x03, 0x28, 0x0c, 0x83, 0x2e, 0x6f, 0xaf, 0x18, 0xc4, - 0x27, 0xb3, 0x25, 0xdc, 0xd4, 0xe7, 0x69, 0x4f, 0x7b, 0x38, 0x00, 0x4b, 0x46, 0xf6, 0x4b, 0x90, - 0x19, 0x6a, 0xa2, 0xbb, 0x5e, 0xc2, 0xfe, 0x18, 0x4c, 0xb2, 0x92, 0x87, 0xd4, 0x0c, 0xd8, 0x09, - 0x6d, 0x6a, 0x46, 0xd8, 0x4c, 0xfb, 0xf3, 0x16, 0x8c, 0xaf, 0x25, 0xa2, 0x09, 0x9e, 0x67, 0xf6, - 0xd7, 0x0c, 0x25, 0x7e, 0x95, 0x41, 0xb1, 0xc0, 0x1e, 0xb9, 0x92, 0xeb, 0xcf, 0x2d, 0x88, 0xa3, - 0xbf, 0x1c, 0x83, 0xf8, 0xb6, 0x60, 0x88, 0x6f, 0x99, 0x82, 0xac, 0x6a, 0x4e, 0x9e, 0xf4, 0x86, - 0xae, 0xaa, 0xb8, 0x68, 0x1d, 0x64, 0xd8, 0x98, 0x0d, 0x9f, 0x8a, 0x63, 0x66, 0xf0, 0x34, 0x19, - 0x29, 0xcd, 0xfe, 0xdd, 0x02, 0x20, 0x45, 0xdb, 0x73, 0xdc, 0xb6, 0x74, 0x89, 0xa3, 0x89, 0xdb, - 0xb6, 0x0b, 0x88, 0x79, 0x10, 0x04, 0x8e, 0x17, 0x72, 0xb6, 0xae, 0x50, 0xeb, 0x1d, 0xce, 0x3d, - 0x61, 0x46, 0xbe, 0x0d, 0xbb, 0x96, 0xe2, 0x86, 0x33, 0x6a, 0xd0, 0x3c, 0x43, 0xfa, 0x7b, 0xf5, - 0x0c, 0x19, 0xe8, 0xf2, 0xc8, 0xf1, 0x2b, 0x16, 0x8c, 0xaa, 0x6e, 0x7a, 0x87, 0xb8, 0xc2, 0xab, - 0xf6, 0xe4, 0x6c, 0xa0, 0x15, 0xad, 0xc9, 0xec, 0x60, 0xf9, 0x2e, 0xf6, 0x58, 0xd5, 0x69, 0xb8, - 0x77, 0x89, 0x8a, 0xf3, 0x59, 0x16, 0x8f, 0x4f, 0x05, 0xf4, 0x60, 0xbf, 0x3c, 0xaa, 0xfe, 0xf1, - 0x38, 0xe6, 0x71, 0x11, 0xba, 0x25, 0x8f, 0x27, 0xa6, 0x22, 0x7a, 0x11, 0xfa, 0x5b, 0xdb, 0x4e, - 0x48, 0x12, 0x4f, 0x86, 0xfa, 0x2b, 0x14, 0x78, 0xb0, 0x5f, 0x1e, 0x53, 0x05, 0x18, 0x04, 0x73, - 0xea, 0xde, 0xa3, 0xe1, 0xa5, 0x27, 0x67, 0xd7, 0x68, 0x78, 0x7f, 0x6a, 0x41, 0xdf, 0x9a, 0x5f, - 0x3f, 0x8e, 0x2d, 0xe0, 0x55, 0x63, 0x0b, 0x78, 0x24, 0x2f, 0xc5, 0x44, 0xee, 0xea, 0x5f, 0x4e, - 0xac, 0xfe, 0xb3, 0xb9, 0x1c, 0x3a, 0x2f, 0xfc, 0x26, 0x0c, 0xb3, 0xc4, 0x15, 0xe2, 0x79, 0xd4, - 0xf3, 0xc6, 0x82, 0x2f, 0x27, 0x16, 0xfc, 0xb8, 0x46, 0xaa, 0xad, 0xf4, 0xa7, 0x60, 0x50, 0xbc, - 0xb7, 0x49, 0xbe, 0xf9, 0x15, 0xb4, 0x58, 0xe2, 0xed, 0x9f, 0x28, 0x82, 0x91, 0x28, 0x03, 0xfd, - 0x8a, 0x05, 0xb3, 0x01, 0xf7, 0xc3, 0xad, 0x2f, 0xb6, 0x03, 0xd7, 0xdb, 0xaa, 0xd6, 0xb6, 0x49, - 0xbd, 0xdd, 0x70, 0xbd, 0xad, 0x95, 0x2d, 0xcf, 0x57, 0xe0, 0xa5, 0x3b, 0xa4, 0xd6, 0x66, 0x66, - 0xb7, 0x2e, 0x59, 0x39, 0x94, 0x3f, 0xfb, 0x73, 0xf7, 0xf6, 0xcb, 0xb3, 0xf8, 0x50, 0xbc, 0xf1, - 0x21, 0xdb, 0x82, 0x7e, 0xcb, 0x82, 0x8b, 0x3c, 0x7f, 0x44, 0xef, 0xed, 0xef, 0x70, 0x5b, 0xae, - 0x48, 0x56, 0x31, 0x93, 0x75, 0x12, 0x34, 0xe7, 0x3f, 0x20, 0x3a, 0xf4, 0x62, 0xe5, 0x70, 0x75, - 0xe1, 0xc3, 0x36, 0xce, 0xfe, 0xc7, 0x45, 0x18, 0x15, 0x51, 0xd3, 0xc4, 0x19, 0xf0, 0xa2, 0x31, - 0x25, 0x1e, 0x4d, 0x4c, 0x89, 0x49, 0x83, 0xf8, 0x68, 0xb6, 0xff, 0x10, 0x26, 0xe9, 0xe6, 0x7c, - 0x85, 0x38, 0x41, 0xb4, 0x41, 0x1c, 0xee, 0xf0, 0x55, 0x3c, 0xf4, 0xee, 0xaf, 0xf4, 0x93, 0xd7, - 0x92, 0xcc, 0x70, 0x9a, 0xff, 0x77, 0xd2, 0x99, 0xe3, 0xc1, 0x44, 0x2a, 0xf0, 0xdd, 0x1b, 0x50, - 0x52, 0x8f, 0x45, 0xc4, 0xa6, 0xd3, 0x39, 0x7e, 0x64, 0x92, 0x03, 0x57, 0x7f, 0xc5, 0x0f, 0x95, - 0x62, 0x76, 0xf6, 0xdf, 0x2f, 0x18, 0x15, 0xf2, 0x41, 0x5c, 0x83, 0x21, 0x27, 0x0c, 0xdd, 0x2d, - 0x8f, 0xd4, 0x3b, 0x69, 0x28, 0x53, 0xd5, 0xb0, 0x07, 0x3b, 0x73, 0xa2, 0x24, 0x56, 0x3c, 0xd0, - 0x15, 0xee, 0x56, 0xb7, 0x4b, 0x3a, 0xa9, 0x27, 0x53, 0xdc, 0x40, 0x3a, 0xde, 0xed, 0x12, 0x2c, - 0xca, 0xa3, 0x4f, 0x70, 0xbf, 0xc7, 0xab, 0x9e, 0x7f, 0xdb, 0xbb, 0xec, 0xfb, 0x32, 0xe8, 0x46, - 0x6f, 0x0c, 0x27, 0xa5, 0xb7, 0xa3, 0x2a, 0x8e, 0x4d, 0x6e, 0xbd, 0x45, 0x92, 0xfd, 0x0c, 0xb0, - 0x78, 0xf9, 0xe6, 0xdb, 0xec, 0x10, 0x11, 0x18, 0x17, 0x21, 0xf9, 0x24, 0x4c, 0xf4, 0x5d, 0xe6, - 0x55, 0xce, 0x2c, 0x1d, 0x2b, 0xd2, 0xaf, 0x9a, 0x2c, 0x70, 0x92, 0xa7, 0xfd, 0xb3, 0x16, 0xb0, - 0x77, 0xaa, 0xc7, 0x20, 0x8f, 0x7c, 0xd8, 0x94, 0x47, 0xa6, 0xf3, 0x3a, 0x39, 0x47, 0x14, 0x79, - 0x81, 0xcf, 0xac, 0x4a, 0xe0, 0xdf, 0xd9, 0x13, 0xce, 0x2a, 0xdd, 0xef, 0x1f, 0xf6, 0xff, 0xb6, - 0xf8, 0x26, 0x16, 0xbf, 0xea, 0xff, 0x2c, 0x0c, 0xd5, 0x9c, 0x96, 0x53, 0xe3, 0x59, 0x9d, 0x72, - 0x35, 0x7a, 0x46, 0xa1, 0xd9, 0x05, 0x51, 0x82, 0x6b, 0xa8, 0x64, 0x68, 0xc7, 0x21, 0x09, 0xee, - 0xaa, 0x95, 0x52, 0x55, 0xce, 0xec, 0xc0, 0xa8, 0xc1, 0xec, 0x81, 0xaa, 0x33, 0x3e, 0xcb, 0x8f, - 0x58, 0x15, 0x8a, 0xb4, 0x09, 0x93, 0x9e, 0xf6, 0x9f, 0x1e, 0x28, 0xf2, 0x72, 0xf9, 0x78, 0xb7, - 0x43, 0x94, 0x9d, 0x3e, 0xda, 0x13, 0xd8, 0x04, 0x1b, 0x9c, 0xe6, 0x6c, 0xff, 0xa4, 0x05, 0x0f, - 0xe9, 0x84, 0xda, 0x2b, 0x9b, 0x6e, 0x46, 0x92, 0x45, 0x18, 0xf2, 0x5b, 0x24, 0x70, 0x22, 0x3f, - 0x10, 0xa7, 0xc6, 0x05, 0xd9, 0xe9, 0xd7, 0x05, 0xfc, 0x40, 0xe4, 0x28, 0x90, 0xdc, 0x25, 0x1c, - 0xab, 0x92, 0xf4, 0xf6, 0xc9, 0x3a, 0x23, 0x14, 0xef, 0xa9, 0xd8, 0x1e, 0xc0, 0x2c, 0xe9, 0x21, - 0x16, 0x18, 0xfb, 0x9b, 0x16, 0x9f, 0x58, 0x7a, 0xd3, 0xd1, 0x5b, 0x30, 0xd1, 0x74, 0xa2, 0xda, - 0xf6, 0xd2, 0x9d, 0x56, 0xc0, 0x4d, 0x4e, 0xb2, 0x9f, 0x9e, 0xee, 0xd6, 0x4f, 0xda, 0x47, 0xc6, - 0xae, 0x9c, 0xab, 0x09, 0x66, 0x38, 0xc5, 0x1e, 0x6d, 0xc0, 0x30, 0x83, 0xb1, 0xa7, 0x82, 0x61, - 0x27, 0xd1, 0x20, 0xaf, 0x36, 0xe5, 0x8c, 0xb0, 0x1a, 0xf3, 0xc1, 0x3a, 0x53, 0xfb, 0xcb, 0x45, - 0xbe, 0xda, 0x99, 0x28, 0xff, 0x14, 0x0c, 0xb6, 0xfc, 0xfa, 0xc2, 0xca, 0x22, 0x16, 0xa3, 0xa0, - 0x8e, 0x91, 0x0a, 0x07, 0x63, 0x89, 0x47, 0x17, 0x60, 0x48, 0xfc, 0x94, 0x26, 0x42, 0xb6, 0x37, - 0x0b, 0xba, 0x10, 0x2b, 0x2c, 0x7a, 0x0e, 0xa0, 0x15, 0xf8, 0xbb, 0x6e, 0x9d, 0x85, 0x0e, 0x29, - 0x9a, 0x7e, 0x44, 0x15, 0x85, 0xc1, 0x1a, 0x15, 0x7a, 0x05, 0x46, 0xdb, 0x5e, 0xc8, 0xc5, 0x11, - 0x2d, 0x9a, 0xb2, 0xf2, 0x70, 0xb9, 0xa1, 0x23, 0xb1, 0x49, 0x8b, 0xe6, 0x60, 0x20, 0x72, 0x98, - 0x5f, 0x4c, 0x7f, 0xbe, 0xbb, 0xef, 0x3a, 0xa5, 0xd0, 0x13, 0x08, 0xd1, 0x02, 0x58, 0x14, 0x44, - 0x6f, 0xc8, 0x57, 0xbb, 0x7c, 0x63, 0x17, 0x7e, 0xf6, 0xbd, 0x1d, 0x02, 0xda, 0x9b, 0x5d, 0xe1, - 0xbf, 0x6f, 0xf0, 0x42, 0x2f, 0x03, 0x90, 0x3b, 0x11, 0x09, 0x3c, 0xa7, 0xa1, 0xbc, 0xd9, 0x94, - 0x5c, 0xb0, 0xe8, 0xaf, 0xf9, 0xd1, 0x8d, 0x90, 0x2c, 0x29, 0x0a, 0xac, 0x51, 0xdb, 0xbf, 0x55, - 0x02, 0x88, 0xe5, 0x76, 0x74, 0x37, 0xb5, 0x71, 0x3d, 0xd3, 0x59, 0xd2, 0x3f, 0xba, 0x5d, 0x0b, - 0x7d, 0xbf, 0x05, 0xc3, 0x22, 0x42, 0x0a, 0x1b, 0xa1, 0x42, 0xe7, 0x8d, 0xd3, 0x0c, 0xd4, 0x42, - 0x4b, 0xf0, 0x26, 0x3c, 0x2f, 0x67, 0xa8, 0x86, 0xe9, 0xda, 0x0a, 0xbd, 0x62, 0xf4, 0x3e, 0x79, - 0x55, 0x2c, 0x1a, 0x5d, 0xa9, 0xae, 0x8a, 0x25, 0x76, 0x46, 0xe8, 0xb7, 0xc4, 0x1b, 0xc6, 0x2d, - 0xb1, 0x2f, 0xff, 0x59, 0xa2, 0x21, 0xbe, 0x76, 0xbb, 0x20, 0xa2, 0x8a, 0x1e, 0xa2, 0xa0, 0x3f, - 0xff, 0x79, 0x9e, 0x76, 0x4f, 0xea, 0x12, 0x9e, 0xe0, 0xd3, 0x30, 0x5e, 0x37, 0x85, 0x00, 0x31, - 0x13, 0x9f, 0xcc, 0xe3, 0x9b, 0x90, 0x19, 0xe2, 0x63, 0x3f, 0x81, 0xc0, 0x49, 0xc6, 0xa8, 0xc2, - 0x23, 0x56, 0xac, 0x78, 0x9b, 0xbe, 0x78, 0xeb, 0x61, 0xe7, 0x8e, 0xe5, 0x5e, 0x18, 0x91, 0x26, - 0xa5, 0x8c, 0x4f, 0xf7, 0x35, 0x51, 0x16, 0x2b, 0x2e, 0xe8, 0x35, 0x18, 0x60, 0xef, 0xb3, 0xc2, - 0xe9, 0xa1, 0x7c, 0x8d, 0xb3, 0x19, 0xba, 0x2f, 0x5e, 0x90, 0xec, 0x6f, 0x88, 0x05, 0x07, 0x74, - 0x45, 0xbe, 0x7e, 0x0c, 0x57, 0xbc, 0x1b, 0x21, 0x61, 0xaf, 0x1f, 0x4b, 0xf3, 0x8f, 0xc7, 0x0f, - 0x1b, 0x39, 0x3c, 0x33, 0xcd, 0xa0, 0x51, 0x92, 0x4a, 0x51, 0xe2, 0xbf, 0xcc, 0x5e, 0x28, 0x02, - 0x0d, 0x65, 0x36, 0xcf, 0xcc, 0x70, 0x18, 0x77, 0xe7, 0x4d, 0x93, 0x05, 0x4e, 0xf2, 0xa4, 0x12, - 0x29, 0x5f, 0xf5, 0xe2, 0xb5, 0x48, 0xb7, 0xbd, 0x83, 0x5f, 0xc4, 0xd9, 0x69, 0xc4, 0x21, 0x58, - 0x94, 0x3f, 0x56, 0xf1, 0x60, 0xc6, 0x83, 0x89, 0xe4, 0x12, 0x7d, 0xa0, 0xe2, 0xc8, 0x1f, 0xf6, - 0xc1, 0x98, 0x39, 0xa5, 0xd0, 0x45, 0x28, 0x09, 0x26, 0x2a, 0x03, 0x88, 0x5a, 0x25, 0xab, 0x12, - 0x81, 0x63, 0x1a, 0x96, 0xf8, 0x85, 0x15, 0xd7, 0xdc, 0x83, 0xe3, 0xc4, 0x2f, 0x0a, 0x83, 0x35, - 0x2a, 0x7a, 0xb1, 0xda, 0xf0, 0xfd, 0x48, 0x1d, 0x48, 0x6a, 0xde, 0xcd, 0x33, 0x28, 0x16, 0x58, - 0x7a, 0x10, 0xed, 0x90, 0xc0, 0x23, 0x0d, 0x33, 0xf2, 0xb6, 0x3a, 0x88, 0xae, 0xea, 0x48, 0x6c, - 0xd2, 0xd2, 0xe3, 0xd4, 0x0f, 0xd9, 0x44, 0x16, 0xd7, 0xb7, 0xd8, 0xdd, 0xba, 0xca, 0x5f, 0x79, - 0x4b, 0x3c, 0xfa, 0x18, 0x3c, 0xa4, 0x02, 0x67, 0x61, 0x6e, 0xcd, 0x90, 0x35, 0x0e, 0x18, 0xda, - 0x96, 0x87, 0x16, 0xb2, 0xc9, 0x70, 0x5e, 0x79, 0xf4, 0x2a, 0x8c, 0x09, 0x11, 0x5f, 0x72, 0x1c, - 0x34, 0x3d, 0x8c, 0xae, 0x1a, 0x58, 0x9c, 0xa0, 0x96, 0xb1, 0xc3, 0x99, 0x94, 0x2d, 0x39, 0x0c, - 0xa5, 0x63, 0x87, 0xeb, 0x78, 0x9c, 0x2a, 0x81, 0xe6, 0x60, 0x9c, 0xcb, 0x60, 0xae, 0xb7, 0xc5, - 0xc7, 0x44, 0x3c, 0xe6, 0x52, 0x4b, 0xea, 0xba, 0x89, 0xc6, 0x49, 0x7a, 0xf4, 0x12, 0x8c, 0x38, - 0x41, 0x6d, 0xdb, 0x8d, 0x48, 0x2d, 0x6a, 0x07, 0xfc, 0x95, 0x97, 0xe6, 0xa2, 0x35, 0xa7, 0xe1, - 0xb0, 0x41, 0x69, 0xdf, 0x85, 0xa9, 0x8c, 0xf0, 0x0f, 0x74, 0xe2, 0x38, 0x2d, 0x57, 0x7e, 0x53, - 0xc2, 0xc3, 0x79, 0xae, 0xb2, 0x22, 0xbf, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0x85, 0x89, 0xd0, 0x92, - 0x95, 0xaa, 0xd9, 0xb9, 0x2c, 0x11, 0x38, 0xa6, 0xb1, 0xff, 0x5b, 0x01, 0xc6, 0x33, 0x6c, 0x2b, - 0x2c, 0x61, 0x66, 0xe2, 0x92, 0x12, 0xe7, 0xc7, 0x34, 0x43, 0xd1, 0x17, 0x0e, 0x11, 0x8a, 0xbe, - 0xd8, 0x2d, 0x14, 0x7d, 0xdf, 0xdb, 0x09, 0x45, 0x6f, 0xf6, 0x58, 0x7f, 0x4f, 0x3d, 0x96, 0x11, - 0xbe, 0x7e, 0xe0, 0x90, 0xe1, 0xeb, 0x8d, 0x4e, 0x1f, 0xec, 0xa1, 0xd3, 0x7f, 0xb4, 0x00, 0x13, - 0x49, 0x57, 0xd2, 0x63, 0xd0, 0xdb, 0xbe, 0x66, 0xe8, 0x6d, 0x2f, 0xf4, 0xf2, 0xf8, 0x36, 0x57, - 0x87, 0x8b, 0x13, 0x3a, 0xdc, 0xf7, 0xf6, 0xc4, 0xad, 0xb3, 0x3e, 0xf7, 0xa7, 0x0a, 0x70, 0x32, - 0xf3, 0xf5, 0xef, 0x31, 0xf4, 0xcd, 0x75, 0xa3, 0x6f, 0x9e, 0xed, 0xf9, 0x61, 0x72, 0x6e, 0x07, - 0xdd, 0x4a, 0x74, 0xd0, 0xc5, 0xde, 0x59, 0x76, 0xee, 0xa5, 0xaf, 0x17, 0xe1, 0x6c, 0x66, 0xb9, - 0x58, 0xed, 0xb9, 0x6c, 0xa8, 0x3d, 0x9f, 0x4b, 0xa8, 0x3d, 0xed, 0xce, 0xa5, 0x8f, 0x46, 0x0f, - 0x2a, 0x1e, 0xe8, 0xb2, 0x30, 0x03, 0xf7, 0xa9, 0x03, 0x35, 0x1e, 0xe8, 0x2a, 0x46, 0xd8, 0xe4, - 0xfb, 0x9d, 0xa4, 0xfb, 0xfc, 0x97, 0x16, 0x9c, 0xce, 0x1c, 0x9b, 0x63, 0xd0, 0x75, 0xad, 0x99, - 0xba, 0xae, 0xa7, 0x7a, 0x9e, 0xad, 0x39, 0xca, 0xaf, 0x9f, 0xe9, 0xcf, 0xf9, 0x16, 0x76, 0x93, - 0xbf, 0x0e, 0xc3, 0x4e, 0xad, 0x46, 0xc2, 0x70, 0xd5, 0xaf, 0xab, 0x40, 0xd8, 0xcf, 0xb2, 0x7b, - 0x56, 0x0c, 0x3e, 0xd8, 0x2f, 0xcf, 0x24, 0x59, 0xc4, 0x68, 0xac, 0x73, 0x40, 0x9f, 0x80, 0xa1, - 0x50, 0x9c, 0x9b, 0x62, 0xec, 0x9f, 0xef, 0xb1, 0x73, 0x9c, 0x0d, 0xd2, 0x30, 0x23, 0x2e, 0x29, - 0x4d, 0x85, 0x62, 0x69, 0x46, 0x67, 0x29, 0x1c, 0x69, 0x74, 0x96, 0xe7, 0x00, 0x76, 0xd5, 0x65, - 0x20, 0xa9, 0x7f, 0xd0, 0xae, 0x09, 0x1a, 0x15, 0xfa, 0x08, 0x4c, 0x84, 0x3c, 0x24, 0xe1, 0x42, - 0xc3, 0x09, 0xd9, 0x3b, 0x1a, 0x31, 0x0b, 0x59, 0x54, 0xa7, 0x6a, 0x02, 0x87, 0x53, 0xd4, 0x68, - 0x59, 0xd6, 0xca, 0xe2, 0x27, 0xf2, 0x89, 0x79, 0x3e, 0xae, 0x51, 0xa4, 0xeb, 0x3e, 0x91, 0xec, - 0x7e, 0xd6, 0xf1, 0x5a, 0x49, 0xf4, 0x09, 0x00, 0x3a, 0x7d, 0x84, 0x1e, 0x62, 0x30, 0x7f, 0xf3, - 0xa4, 0xbb, 0x4a, 0x3d, 0xd3, 0xb9, 0x99, 0xbd, 0xa9, 0x5d, 0x54, 0x4c, 0xb0, 0xc6, 0x10, 0x39, - 0x30, 0x1a, 0xff, 0x8b, 0xb3, 0xd9, 0x5e, 0xc8, 0xad, 0x21, 0xc9, 0x9c, 0xa9, 0xbc, 0x17, 0x75, - 0x16, 0xd8, 0xe4, 0x68, 0xff, 0xf8, 0x20, 0x3c, 0xdc, 0x61, 0x1b, 0x46, 0x73, 0xa6, 0xa9, 0xf7, - 0xe9, 0xe4, 0xfd, 0x7d, 0x26, 0xb3, 0xb0, 0x71, 0xa1, 0x4f, 0xcc, 0xf6, 0xc2, 0xdb, 0x9e, 0xed, - 0x3f, 0x6c, 0x69, 0x9a, 0x15, 0xee, 0x54, 0xfa, 0xe1, 0x43, 0x1e, 0x2f, 0x47, 0xa8, 0x6a, 0xd9, - 0xcc, 0xd0, 0x57, 0x3c, 0xd7, 0x73, 0x73, 0x7a, 0x57, 0x60, 0x7c, 0x35, 0x3b, 0x0e, 0x2f, 0x57, - 0x65, 0x5c, 0x3e, 0xec, 0xf7, 0x1f, 0x57, 0x4c, 0xde, 0x8f, 0xc9, 0xe8, 0x4b, 0xbc, 0x5e, 0xb1, - 0xd6, 0x5e, 0x8c, 0xc3, 0x29, 0xa9, 0xb3, 0xf4, 0xd1, 0xcc, 0xe6, 0xea, 0x44, 0xd8, 0x60, 0x75, - 0xbc, 0x57, 0xef, 0x6f, 0x51, 0x10, 0xe0, 0xdf, 0xb1, 0xe0, 0x4c, 0xc7, 0x88, 0x30, 0xdf, 0x86, - 0xb2, 0xa1, 0xfd, 0x39, 0x0b, 0xb2, 0x07, 0xdb, 0xf0, 0x28, 0xbb, 0x08, 0xa5, 0x5a, 0x22, 0xef, - 0x66, 0x1c, 0x1b, 0x41, 0xe5, 0xdc, 0x8c, 0x69, 0x0c, 0xc7, 0xb1, 0x42, 0x57, 0xc7, 0xb1, 0x5f, - 0xb7, 0x20, 0xb5, 0xbf, 0x1f, 0x83, 0xa0, 0xb1, 0x62, 0x0a, 0x1a, 0x8f, 0xf7, 0xd2, 0x9b, 0x39, - 0x32, 0xc6, 0x9f, 0x8c, 0xc3, 0xa9, 0x9c, 0x17, 0x79, 0xbb, 0x30, 0xb9, 0x55, 0x23, 0xe6, 0xe3, - 0xea, 0x4e, 0x41, 0x87, 0x3a, 0xbe, 0xc4, 0xe6, 0xe9, 0x4e, 0x53, 0x24, 0x38, 0x5d, 0x05, 0xfa, - 0x9c, 0x05, 0x27, 0x9c, 0xdb, 0xe1, 0x12, 0x15, 0x18, 0xdd, 0xda, 0x7c, 0xc3, 0xaf, 0xed, 0xd0, - 0xd3, 0x58, 0x2e, 0x84, 0x17, 0x32, 0x95, 0x78, 0xb7, 0xaa, 0x29, 0x7a, 0xa3, 0x7a, 0x96, 0xdc, - 0x3a, 0x8b, 0x0a, 0x67, 0xd6, 0x85, 0xb0, 0x48, 0xed, 0x41, 0xaf, 0xa3, 0x1d, 0x9e, 0xff, 0x67, - 0x3d, 0x9d, 0xe4, 0x12, 0x90, 0xc4, 0x60, 0xc5, 0x07, 0x7d, 0x0a, 0x4a, 0x5b, 0xf2, 0xa5, 0x6f, - 0x86, 0x84, 0x15, 0x77, 0x64, 0xe7, 0xf7, 0xcf, 0xdc, 0x12, 0xaf, 0x88, 0x70, 0xcc, 0x14, 0xbd, - 0x0a, 0x45, 0x6f, 0x33, 0xec, 0x94, 0x1f, 0x3a, 0xe1, 0x72, 0xc9, 0x83, 0x6c, 0xac, 0x2d, 0x57, - 0x31, 0x2d, 0x88, 0xae, 0x40, 0x31, 0xd8, 0xa8, 0x0b, 0x0d, 0x74, 0xe6, 0x22, 0xc5, 0xf3, 0x8b, - 0x39, 0xad, 0x62, 0x9c, 0xf0, 0xfc, 0x22, 0xa6, 0x2c, 0x50, 0x05, 0xfa, 0xd9, 0x33, 0x36, 0x21, - 0xcf, 0x64, 0xde, 0xdc, 0x3a, 0x3c, 0x07, 0xe5, 0x91, 0x38, 0x18, 0x01, 0xe6, 0x8c, 0xd0, 0x3a, - 0x0c, 0xd4, 0x58, 0x2e, 0x61, 0x21, 0xc0, 0xbc, 0x2f, 0x53, 0xd7, 0xdc, 0x21, 0xc9, 0xb2, 0x50, - 0xbd, 0x32, 0x0a, 0x2c, 0x78, 0x31, 0xae, 0xa4, 0xb5, 0xbd, 0x19, 0x8a, 0x5c, 0xfb, 0xd9, 0x5c, - 0x3b, 0xe4, 0x0e, 0x17, 0x5c, 0x19, 0x05, 0x16, 0xbc, 0xd0, 0xcb, 0x50, 0xd8, 0xac, 0x89, 0x27, - 0x6a, 0x99, 0x4a, 0x67, 0x33, 0x4e, 0xca, 0xfc, 0xc0, 0xbd, 0xfd, 0x72, 0x61, 0x79, 0x01, 0x17, - 0x36, 0x6b, 0x68, 0x0d, 0x06, 0x37, 0x79, 0x64, 0x05, 0xa1, 0x57, 0x7e, 0x32, 0x3b, 0xe8, 0x43, - 0x2a, 0xf8, 0x02, 0x7f, 0xee, 0x24, 0x10, 0x58, 0x32, 0x61, 0x99, 0x26, 0x54, 0x84, 0x08, 0x11, - 0xa0, 0x6e, 0xf6, 0x70, 0x51, 0x3d, 0xb8, 0x7c, 0x19, 0xc7, 0x99, 0xc0, 0x1a, 0x47, 0x3a, 0xab, - 0x9d, 0xbb, 0xed, 0x80, 0x85, 0x1a, 0x17, 0x91, 0x8c, 0x32, 0x67, 0xf5, 0x9c, 0x24, 0xea, 0x34, - 0xab, 0x15, 0x11, 0x8e, 0x99, 0xa2, 0x1d, 0x18, 0xdd, 0x0d, 0x5b, 0xdb, 0x44, 0x2e, 0x69, 0x16, - 0xd8, 0x28, 0x47, 0x3e, 0xba, 0x29, 0x08, 0xdd, 0x20, 0x6a, 0x3b, 0x8d, 0xd4, 0x2e, 0xc4, 0x64, - 0xd9, 0x9b, 0x3a, 0x33, 0x6c, 0xf2, 0xa6, 0xdd, 0xff, 0x56, 0xdb, 0xdf, 0xd8, 0x8b, 0x88, 0x88, - 0x2b, 0x97, 0xd9, 0xfd, 0xaf, 0x73, 0x92, 0x74, 0xf7, 0x0b, 0x04, 0x96, 0x4c, 0xd0, 0x4d, 0xd1, - 0x3d, 0x6c, 0xf7, 0x9c, 0xc8, 0x8f, 0x30, 0x3b, 0x27, 0x89, 0x72, 0x3a, 0x85, 0xed, 0x96, 0x31, - 0x2b, 0xb6, 0x4b, 0xb6, 0xb6, 0xfd, 0xc8, 0xf7, 0x12, 0x3b, 0xf4, 0x64, 0xfe, 0x2e, 0x59, 0xc9, - 0xa0, 0x4f, 0xef, 0x92, 0x59, 0x54, 0x38, 0xb3, 0x2e, 0x54, 0x87, 0xb1, 0x96, 0x1f, 0x44, 0xb7, - 0xfd, 0x40, 0xce, 0x2f, 0xd4, 0x41, 0x2f, 0x66, 0x50, 0x8a, 0x1a, 0x59, 0xc8, 0x46, 0x13, 0x83, - 0x13, 0x3c, 0xd1, 0x47, 0x61, 0x30, 0xac, 0x39, 0x0d, 0xb2, 0x72, 0x7d, 0x7a, 0x2a, 0xff, 0xf8, - 0xa9, 0x72, 0x92, 0x9c, 0xd9, 0xc5, 0x03, 0x63, 0x70, 0x12, 0x2c, 0xd9, 0xa1, 0x65, 0xe8, 0x67, - 0xe9, 0x16, 0x59, 0x10, 0xc4, 0x9c, 0x40, 0xb9, 0x29, 0x07, 0x78, 0xbe, 0x37, 0x31, 0x30, 0xe6, - 0xc5, 0xe9, 0x1a, 0x10, 0xd7, 0x43, 0x3f, 0x9c, 0x3e, 0x99, 0xbf, 0x06, 0xc4, 0xad, 0xf2, 0x7a, - 0xb5, 0xd3, 0x1a, 0x50, 0x44, 0x38, 0x66, 0x4a, 0x77, 0x66, 0xba, 0x9b, 0x9e, 0xea, 0xe0, 0xb9, - 0x95, 0xbb, 0x97, 0xb2, 0x9d, 0x99, 0xee, 0xa4, 0x94, 0x85, 0xfd, 0x07, 0x83, 0x69, 0x99, 0x85, - 0x29, 0x14, 0xfe, 0x82, 0x95, 0xb2, 0x35, 0xbf, 0xbf, 0x57, 0xfd, 0xe6, 0x11, 0x5e, 0x85, 0x3e, - 0x67, 0xc1, 0xa9, 0x56, 0xe6, 0x87, 0x08, 0x01, 0xa0, 0x37, 0x35, 0x29, 0xff, 0x74, 0x15, 0x30, - 0x33, 0x1b, 0x8f, 0x73, 0x6a, 0x4a, 0x5e, 0x37, 0x8b, 0x6f, 0xfb, 0xba, 0xb9, 0x0a, 0x43, 0x35, - 0x7e, 0x15, 0xe9, 0x98, 0x5b, 0x3f, 0x79, 0xf7, 0x66, 0xa2, 0x84, 0xb8, 0xc3, 0x6c, 0x62, 0xc5, - 0x02, 0xfd, 0x88, 0x05, 0x67, 0x92, 0x4d, 0xc7, 0x84, 0xa1, 0x45, 0x94, 0x4d, 0xae, 0xcb, 0x58, - 0x16, 0xdf, 0x9f, 0x92, 0xff, 0x0d, 0xe2, 0x83, 0x6e, 0x04, 0xb8, 0x73, 0x65, 0x68, 0x31, 0x43, - 0x99, 0x32, 0x60, 0x1a, 0x90, 0x7a, 0x50, 0xa8, 0xbc, 0x00, 0x23, 0x4d, 0xbf, 0xed, 0x45, 0xc2, - 0xd1, 0x4b, 0x38, 0x9d, 0x30, 0x67, 0x8b, 0x55, 0x0d, 0x8e, 0x0d, 0xaa, 0x84, 0x1a, 0x66, 0xe8, - 0xbe, 0xd5, 0x30, 0x6f, 0xc2, 0x88, 0xa7, 0x79, 0x26, 0x0b, 0x79, 0xe0, 0x7c, 0x7e, 0x84, 0x5c, - 0xdd, 0x8f, 0x99, 0xb7, 0x52, 0x87, 0x60, 0x83, 0xdb, 0xf1, 0x7a, 0x80, 0x7d, 0xc9, 0xca, 0x10, - 0xea, 0xb9, 0x2a, 0xe6, 0x43, 0xa6, 0x2a, 0xe6, 0x7c, 0x52, 0x15, 0x93, 0x32, 0x1e, 0x18, 0x5a, - 0x98, 0xde, 0xb3, 0x3b, 0xf5, 0x1a, 0x65, 0xd3, 0x6e, 0xc0, 0xb9, 0x6e, 0xc7, 0x12, 0xf3, 0xf8, - 0xab, 0x2b, 0x53, 0x71, 0xec, 0xf1, 0x57, 0x5f, 0x59, 0xc4, 0x0c, 0xd3, 0x6b, 0xfc, 0x26, 0xfb, - 0xbf, 0x58, 0x50, 0xac, 0xf8, 0xf5, 0x63, 0xb8, 0xf0, 0x7e, 0xd8, 0xb8, 0xf0, 0x3e, 0x9c, 0x7d, - 0x20, 0xd6, 0x73, 0x4d, 0x1f, 0x4b, 0x09, 0xd3, 0xc7, 0x99, 0x3c, 0x06, 0x9d, 0x0d, 0x1d, 0x3f, - 0x5d, 0x84, 0xe1, 0x8a, 0x5f, 0x57, 0xee, 0xf6, 0xff, 0xf4, 0x7e, 0xdc, 0xed, 0x73, 0x73, 0x65, - 0x68, 0x9c, 0x99, 0xa3, 0xa0, 0x7c, 0x69, 0xfc, 0x6d, 0xe6, 0x75, 0x7f, 0x8b, 0xb8, 0x5b, 0xdb, - 0x11, 0xa9, 0x27, 0x3f, 0xe7, 0xf8, 0xbc, 0xee, 0xff, 0xa0, 0x00, 0xe3, 0x89, 0xda, 0x51, 0x03, - 0x46, 0x1b, 0xba, 0x62, 0x5d, 0xcc, 0xd3, 0xfb, 0xd2, 0xc9, 0x0b, 0xaf, 0x65, 0x0d, 0x84, 0x4d, - 0xe6, 0x68, 0x16, 0x40, 0x59, 0x9a, 0xa5, 0x7a, 0x95, 0x49, 0xfd, 0xca, 0x14, 0x1d, 0x62, 0x8d, - 0x02, 0xbd, 0x08, 0xc3, 0x91, 0xdf, 0xf2, 0x1b, 0xfe, 0xd6, 0xde, 0x55, 0x22, 0x43, 0x7b, 0x29, - 0x5f, 0xc4, 0xf5, 0x18, 0x85, 0x75, 0x3a, 0x74, 0x07, 0x26, 0x15, 0x93, 0xea, 0x11, 0x18, 0x1b, - 0x98, 0x56, 0x61, 0x2d, 0xc9, 0x11, 0xa7, 0x2b, 0xb1, 0x7f, 0xae, 0xc8, 0xbb, 0xd8, 0x8b, 0xdc, - 0x77, 0x57, 0xc3, 0x3b, 0x7b, 0x35, 0x7c, 0xdd, 0x82, 0x09, 0x5a, 0x3b, 0x73, 0xb4, 0x92, 0xc7, - 0xbc, 0x8a, 0xc9, 0x6d, 0x75, 0x88, 0xc9, 0x7d, 0x9e, 0xee, 0x9a, 0x75, 0xbf, 0x1d, 0x09, 0xdd, - 0x9d, 0xb6, 0x2d, 0x52, 0x28, 0x16, 0x58, 0x41, 0x47, 0x82, 0x40, 0x3c, 0x0e, 0xd5, 0xe9, 0x48, - 0x10, 0x60, 0x81, 0x95, 0x21, 0xbb, 0xfb, 0xb2, 0x43, 0x76, 0xf3, 0xc8, 0xab, 0xc2, 0x25, 0x47, - 0x08, 0x5c, 0x5a, 0xe4, 0x55, 0xe9, 0xab, 0x13, 0xd3, 0xd8, 0x5f, 0x2d, 0xc2, 0x48, 0xc5, 0xaf, - 0xc7, 0x56, 0xe6, 0x17, 0x0c, 0x2b, 0xf3, 0xb9, 0x84, 0x95, 0x79, 0x42, 0xa7, 0x7d, 0xd7, 0xa6, - 0xfc, 0xad, 0xb2, 0x29, 0xff, 0x9a, 0xc5, 0x46, 0x6d, 0x71, 0xad, 0xca, 0xfd, 0xf6, 0xd0, 0x25, - 0x18, 0x66, 0x1b, 0x0c, 0x7b, 0x8d, 0x2c, 0x4d, 0xaf, 0x2c, 0xdf, 0xd5, 0x5a, 0x0c, 0xc6, 0x3a, - 0x0d, 0xba, 0x00, 0x43, 0x21, 0x71, 0x82, 0xda, 0xb6, 0xda, 0x5d, 0x85, 0x9d, 0x94, 0xc3, 0xb0, - 0xc2, 0xa2, 0xd7, 0xe3, 0xa0, 0x9f, 0xc5, 0xfc, 0xd7, 0x8d, 0x7a, 0x7b, 0xf8, 0x12, 0xc9, 0x8f, - 0xf4, 0x69, 0xdf, 0x02, 0x94, 0xa6, 0xef, 0x21, 0x2c, 0x5d, 0xd9, 0x0c, 0x4b, 0x57, 0x4a, 0x85, - 0xa4, 0xfb, 0x33, 0x0b, 0xc6, 0x2a, 0x7e, 0x9d, 0x2e, 0xdd, 0xef, 0xa4, 0x75, 0xaa, 0x47, 0x3c, - 0x1e, 0xe8, 0x10, 0xf1, 0xf8, 0x31, 0xe8, 0xaf, 0xf8, 0xf5, 0x95, 0x4a, 0xa7, 0xd0, 0x02, 0xf6, - 0xdf, 0xb4, 0x60, 0xb0, 0xe2, 0xd7, 0x8f, 0xc1, 0x2c, 0xf0, 0x21, 0xd3, 0x2c, 0xf0, 0x50, 0xce, - 0xbc, 0xc9, 0xb1, 0x04, 0xfc, 0x8d, 0x3e, 0x18, 0xa5, 0xed, 0xf4, 0xb7, 0xe4, 0x50, 0x1a, 0xdd, - 0x66, 0xf5, 0xd0, 0x6d, 0x54, 0x0a, 0xf7, 0x1b, 0x0d, 0xff, 0x76, 0x72, 0x58, 0x97, 0x19, 0x14, - 0x0b, 0x2c, 0x7a, 0x06, 0x86, 0x5a, 0x01, 0xd9, 0x75, 0x7d, 0x21, 0xde, 0x6a, 0x46, 0x96, 0x8a, - 0x80, 0x63, 0x45, 0x41, 0xaf, 0x85, 0xa1, 0xeb, 0xd1, 0xa3, 0xbc, 0xe6, 0x7b, 0x75, 0xae, 0x39, - 0x2f, 0x8a, 0xb4, 0x1c, 0x1a, 0x1c, 0x1b, 0x54, 0xe8, 0x16, 0x94, 0xd8, 0x7f, 0xb6, 0xed, 0x1c, - 0x3e, 0x7b, 0xaf, 0xc8, 0x2a, 0x28, 0x18, 0xe0, 0x98, 0x17, 0x7a, 0x0e, 0x20, 0x92, 0xa1, 0xed, - 0x43, 0x11, 0x68, 0x4d, 0x5d, 0x05, 0x54, 0xd0, 0xfb, 0x10, 0x6b, 0x54, 0xe8, 0x69, 0x28, 0x45, - 0x8e, 0xdb, 0xb8, 0xe6, 0x7a, 0x24, 0x64, 0x1a, 0xf1, 0xa2, 0x4c, 0xee, 0x27, 0x80, 0x38, 0xc6, - 0x53, 0x51, 0x8c, 0x05, 0xe1, 0xe0, 0xb9, 0xcb, 0x87, 0x18, 0x35, 0x13, 0xc5, 0xae, 0x29, 0x28, - 0xd6, 0x28, 0xd0, 0x36, 0x3c, 0xe2, 0x7a, 0x2c, 0x85, 0x05, 0xa9, 0xee, 0xb8, 0xad, 0xf5, 0x6b, - 0xd5, 0x9b, 0x24, 0x70, 0x37, 0xf7, 0xe6, 0x9d, 0xda, 0x0e, 0xf1, 0x64, 0x5e, 0x56, 0x99, 0xae, - 0xfb, 0x91, 0x95, 0x0e, 0xb4, 0xb8, 0x23, 0x27, 0xfb, 0x79, 0x36, 0xdf, 0xaf, 0x57, 0xd1, 0x7b, - 0x8d, 0xad, 0xe3, 0x94, 0xbe, 0x75, 0x1c, 0xec, 0x97, 0x07, 0xae, 0x57, 0xb5, 0x18, 0x12, 0x2f, - 0xc1, 0xc9, 0x8a, 0x5f, 0xaf, 0xf8, 0x41, 0xb4, 0xec, 0x07, 0xb7, 0x9d, 0xa0, 0x2e, 0xa7, 0x57, - 0x59, 0x46, 0xd1, 0xa0, 0xfb, 0x67, 0x3f, 0xdf, 0x5d, 0x8c, 0x08, 0x19, 0xcf, 0x33, 0x89, 0xed, - 0x90, 0x6f, 0xbf, 0x6a, 0x4c, 0x76, 0x50, 0x49, 0x60, 0x2e, 0x3b, 0x11, 0x41, 0xd7, 0x59, 0xe6, - 0xf5, 0xf8, 0x18, 0x15, 0xc5, 0x9f, 0xd2, 0x32, 0xaf, 0xc7, 0xc8, 0xcc, 0x73, 0xd7, 0x2c, 0x6f, - 0x7f, 0x56, 0x54, 0xc2, 0xef, 0xe0, 0xdc, 0xbf, 0xae, 0x97, 0xd4, 0xc5, 0x32, 0x4b, 0x44, 0x21, - 0x3f, 0xbd, 0x00, 0xb7, 0x7a, 0x76, 0xcc, 0x12, 0x61, 0xbf, 0x08, 0x93, 0xf4, 0xea, 0xa7, 0xe4, - 0x28, 0xf6, 0x91, 0xdd, 0xa3, 0x79, 0xfc, 0xd7, 0x7e, 0x76, 0x0e, 0x24, 0xd2, 0x9f, 0xa0, 0x4f, - 0xc2, 0x58, 0x48, 0xae, 0xb9, 0x5e, 0xfb, 0x8e, 0x54, 0xbc, 0x74, 0x78, 0x73, 0x58, 0x5d, 0xd2, - 0x29, 0xb9, 0xfa, 0xd6, 0x84, 0xe1, 0x04, 0x37, 0xd4, 0x84, 0xb1, 0xdb, 0xae, 0x57, 0xf7, 0x6f, - 0x87, 0x92, 0xff, 0x50, 0xbe, 0x16, 0xf7, 0x16, 0xa7, 0x4c, 0xb4, 0xd1, 0xa8, 0xee, 0x96, 0xc1, - 0x0c, 0x27, 0x98, 0xd3, 0xb5, 0x16, 0xb4, 0xbd, 0xb9, 0xf0, 0x46, 0x48, 0x02, 0x91, 0xf9, 0x9f, - 0xa7, 0xe5, 0x95, 0x40, 0x1c, 0xe3, 0xe9, 0x5a, 0x63, 0x7f, 0x2e, 0x07, 0x7e, 0x9b, 0xe7, 0xda, - 0x10, 0x6b, 0x0d, 0x2b, 0x28, 0xd6, 0x28, 0xe8, 0x5e, 0xc4, 0xfe, 0xad, 0xf9, 0x1e, 0xf6, 0xfd, - 0x48, 0xee, 0x5e, 0xcc, 0x13, 0x41, 0x83, 0x63, 0x83, 0x0a, 0x2d, 0x03, 0x0a, 0xdb, 0xad, 0x56, - 0x83, 0x39, 0x33, 0x39, 0x0d, 0xc6, 0x8a, 0x7b, 0x79, 0x14, 0x79, 0xac, 0xe0, 0x6a, 0x0a, 0x8b, - 0x33, 0x4a, 0xd0, 0x63, 0x69, 0x53, 0x34, 0xb5, 0x9f, 0x35, 0x95, 0x5b, 0x7c, 0xaa, 0xbc, 0x9d, - 0x12, 0x87, 0x96, 0x60, 0x30, 0xdc, 0x0b, 0x6b, 0x91, 0x08, 0xed, 0x98, 0x93, 0x46, 0xab, 0xca, - 0x48, 0xb4, 0x2c, 0x8e, 0xbc, 0x08, 0x96, 0x65, 0x51, 0x0d, 0xa6, 0x04, 0xc7, 0x85, 0x6d, 0xc7, - 0x53, 0xf9, 0x82, 0xb8, 0x4f, 0xf7, 0xa5, 0x7b, 0xfb, 0xe5, 0x29, 0x51, 0xb3, 0x8e, 0x3e, 0xd8, - 0x2f, 0x9f, 0xaa, 0xf8, 0xf5, 0x0c, 0x0c, 0xce, 0xe2, 0xc6, 0x27, 0x5f, 0xad, 0xe6, 0x37, 0x5b, - 0x95, 0xc0, 0xdf, 0x74, 0x1b, 0xa4, 0x93, 0xd5, 0xac, 0x6a, 0x50, 0x8a, 0xc9, 0x67, 0xc0, 0x70, - 0x82, 0x9b, 0xfd, 0x59, 0x26, 0xba, 0xb1, 0x64, 0xf1, 0x51, 0x3b, 0x20, 0xa8, 0x09, 0xa3, 0x2d, - 0xb6, 0xb8, 0x45, 0x06, 0x0c, 0x31, 0xd7, 0x5f, 0xe8, 0x51, 0xfb, 0x73, 0x9b, 0xe5, 0xf5, 0x32, - 0x3c, 0xa3, 0x2a, 0x3a, 0x3b, 0x6c, 0x72, 0xb7, 0xff, 0xf5, 0x69, 0x76, 0xf8, 0x57, 0xb9, 0x4a, - 0x67, 0x50, 0x3c, 0x21, 0x11, 0xb7, 0xc8, 0x99, 0x7c, 0xdd, 0x62, 0x3c, 0x2c, 0xe2, 0x19, 0x0a, - 0x96, 0x65, 0xd1, 0x27, 0x60, 0x8c, 0x5e, 0xca, 0xd4, 0x01, 0x1c, 0x4e, 0x9f, 0xc8, 0x0f, 0xf5, - 0xa1, 0xa8, 0xf4, 0xec, 0x38, 0x7a, 0x61, 0x9c, 0x60, 0x86, 0x5e, 0x67, 0x9e, 0x48, 0x92, 0x75, - 0xa1, 0x17, 0xd6, 0xba, 0xd3, 0x91, 0x64, 0xab, 0x31, 0x41, 0x6d, 0x98, 0x4a, 0x27, 0xec, 0x0b, - 0xa7, 0xed, 0x7c, 0xe9, 0x36, 0x9d, 0x73, 0x2f, 0x4e, 0x63, 0x92, 0xc6, 0x85, 0x38, 0x8b, 0x3f, - 0xba, 0x06, 0xa3, 0x22, 0x63, 0xba, 0x98, 0xb9, 0x45, 0x43, 0xe5, 0x39, 0x8a, 0x75, 0xe4, 0x41, - 0x12, 0x80, 0xcd, 0xc2, 0x68, 0x0b, 0xce, 0x68, 0x49, 0xae, 0x2e, 0x07, 0x0e, 0xf3, 0x5b, 0x70, - 0xd9, 0x76, 0xaa, 0x89, 0x25, 0x8f, 0xde, 0xdb, 0x2f, 0x9f, 0x59, 0xef, 0x44, 0x88, 0x3b, 0xf3, - 0x41, 0xd7, 0xe1, 0x24, 0x7f, 0xa8, 0xbe, 0x48, 0x9c, 0x7a, 0xc3, 0xf5, 0x94, 0xdc, 0xc3, 0x97, - 0xfc, 0xe9, 0x7b, 0xfb, 0xe5, 0x93, 0x73, 0x59, 0x04, 0x38, 0xbb, 0x1c, 0xfa, 0x10, 0x94, 0xea, - 0x5e, 0x28, 0xfa, 0x60, 0xc0, 0xc8, 0x23, 0x56, 0x5a, 0x5c, 0xab, 0xaa, 0xef, 0x8f, 0xff, 0xe0, - 0xb8, 0x00, 0xda, 0xe2, 0x6a, 0x71, 0xa5, 0xac, 0x19, 0x4c, 0x05, 0xea, 0x4a, 0xea, 0x33, 0x8d, - 0xa7, 0xaa, 0xdc, 0x1e, 0xa4, 0x5e, 0x70, 0x18, 0xaf, 0x58, 0x0d, 0xc6, 0xe8, 0x35, 0x40, 0x22, - 0x5e, 0xfd, 0x5c, 0x8d, 0xa5, 0x57, 0x61, 0x56, 0x84, 0x21, 0xf3, 0xf1, 0x64, 0x35, 0x45, 0x81, - 0x33, 0x4a, 0xa1, 0x2b, 0x74, 0x57, 0xd1, 0xa1, 0x62, 0xd7, 0x52, 0xa9, 0x25, 0x17, 0x49, 0x2b, - 0x20, 0xcc, 0x0f, 0xcb, 0xe4, 0x88, 0x13, 0xe5, 0x50, 0x1d, 0x1e, 0x71, 0xda, 0x91, 0xcf, 0x2c, - 0x0e, 0x26, 0xe9, 0xba, 0xbf, 0x43, 0x3c, 0x66, 0xec, 0x1b, 0x9a, 0x3f, 0x47, 0x05, 0xab, 0xb9, - 0x0e, 0x74, 0xb8, 0x23, 0x17, 0x2a, 0x10, 0xab, 0x5c, 0xd2, 0x60, 0x86, 0x1f, 0xcb, 0xc8, 0x27, - 0xfd, 0x22, 0x0c, 0x6f, 0xfb, 0x61, 0xb4, 0x46, 0xa2, 0xdb, 0x7e, 0xb0, 0x23, 0xc2, 0xe8, 0xc6, - 0x41, 0xc9, 0x63, 0x14, 0xd6, 0xe9, 0xe8, 0x8d, 0x97, 0xb9, 0xa2, 0xac, 0x2c, 0x32, 0x2f, 0x80, - 0xa1, 0x78, 0x8f, 0xb9, 0xc2, 0xc1, 0x58, 0xe2, 0x25, 0xe9, 0x4a, 0x65, 0x81, 0x59, 0xf4, 0x13, - 0xa4, 0x2b, 0x95, 0x05, 0x2c, 0xf1, 0x74, 0xba, 0x86, 0xdb, 0x4e, 0x40, 0x2a, 0x81, 0x5f, 0x23, - 0xa1, 0x16, 0x0a, 0xff, 0x61, 0x1e, 0x24, 0x98, 0x4e, 0xd7, 0x6a, 0x16, 0x01, 0xce, 0x2e, 0x87, - 0x48, 0x3a, 0xc1, 0xdb, 0x58, 0xbe, 0x29, 0x26, 0x2d, 0xcf, 0xf4, 0x98, 0xe3, 0xcd, 0x83, 0x09, - 0x95, 0x5a, 0x8e, 0x87, 0x05, 0x0e, 0xa7, 0xc7, 0xd9, 0xdc, 0xee, 0x3d, 0xa6, 0xb0, 0x32, 0x6e, - 0xad, 0x24, 0x38, 0xe1, 0x14, 0x6f, 0x23, 0xc2, 0xdc, 0x44, 0xd7, 0x08, 0x73, 0x17, 0xa1, 0x14, - 0xb6, 0x37, 0xea, 0x7e, 0xd3, 0x71, 0x3d, 0x66, 0xd1, 0xd7, 0xae, 0x5e, 0x55, 0x89, 0xc0, 0x31, - 0x0d, 0x5a, 0x86, 0x21, 0x47, 0x5a, 0xae, 0x50, 0x7e, 0x4c, 0x21, 0x65, 0xaf, 0xe2, 0x61, 0x36, - 0xa4, 0xad, 0x4a, 0x95, 0x45, 0xaf, 0xc0, 0xa8, 0x78, 0x68, 0x2d, 0x52, 0xa7, 0x4e, 0x99, 0xaf, - 0xe1, 0xaa, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x06, 0x0c, 0x47, 0x7e, 0x83, 0x3d, 0xe9, 0xa2, 0x62, - 0xde, 0xa9, 0xfc, 0xe8, 0x78, 0xeb, 0x8a, 0x4c, 0x57, 0x1a, 0xab, 0xa2, 0x58, 0xe7, 0x83, 0xd6, - 0xf9, 0x7c, 0x67, 0x81, 0xef, 0x49, 0x28, 0x72, 0x6f, 0x9e, 0xc9, 0x73, 0xc7, 0x62, 0x64, 0xe6, - 0x72, 0x10, 0x25, 0xb1, 0xce, 0x06, 0x5d, 0x86, 0xc9, 0x56, 0xe0, 0xfa, 0x6c, 0x4e, 0x28, 0xa3, - 0xe5, 0xb4, 0x99, 0xe6, 0xaa, 0x92, 0x24, 0xc0, 0xe9, 0x32, 0xec, 0x9d, 0xbc, 0x00, 0x4e, 0x9f, - 0xe6, 0xa9, 0x3a, 0xf8, 0x4d, 0x96, 0xc3, 0xb0, 0xc2, 0xa2, 0x55, 0xb6, 0x13, 0x73, 0x25, 0xcc, - 0xf4, 0x4c, 0x7e, 0x18, 0x23, 0x5d, 0x59, 0xc3, 0x85, 0x57, 0xf5, 0x17, 0xc7, 0x1c, 0x50, 0x5d, - 0xcb, 0x90, 0x49, 0xaf, 0x00, 0xe1, 0xf4, 0x23, 0x1d, 0xfc, 0x01, 0x13, 0x97, 0xa2, 0x58, 0x20, - 0x30, 0xc0, 0x21, 0x4e, 0xf0, 0x44, 0x1f, 0x81, 0x09, 0x11, 0x7c, 0x31, 0xee, 0xa6, 0x33, 0xb1, - 0xa3, 0x3c, 0x4e, 0xe0, 0x70, 0x8a, 0x9a, 0xa7, 0xca, 0x70, 0x36, 0x1a, 0x44, 0x6c, 0x7d, 0xd7, - 0x5c, 0x6f, 0x27, 0x9c, 0x3e, 0xcb, 0xf6, 0x07, 0x91, 0x2a, 0x23, 0x89, 0xc5, 0x19, 0x25, 0xd0, - 0x3a, 0x4c, 0xb4, 0x02, 0x42, 0x9a, 0x4c, 0xd0, 0x17, 0xe7, 0x59, 0x99, 0x87, 0x89, 0xa0, 0x2d, - 0xa9, 0x24, 0x70, 0x07, 0x19, 0x30, 0x9c, 0xe2, 0x80, 0x6e, 0xc3, 0x90, 0xbf, 0x4b, 0x82, 0x6d, - 0xe2, 0xd4, 0xa7, 0xcf, 0x75, 0x78, 0xb8, 0x21, 0x0e, 0xb7, 0xeb, 0x82, 0x36, 0xe1, 0xe8, 0x20, - 0xc1, 0xdd, 0x1d, 0x1d, 0x64, 0x65, 0xe8, 0x2f, 0x5a, 0x70, 0x5a, 0xda, 0x46, 0xaa, 0x2d, 0xda, - 0xeb, 0x0b, 0xbe, 0x17, 0x46, 0x01, 0x0f, 0x6c, 0xf0, 0x68, 0xfe, 0x63, 0xff, 0xf5, 0x9c, 0x42, - 0x4a, 0x0f, 0x7c, 0x3a, 0x8f, 0x22, 0xc4, 0xf9, 0x35, 0xa2, 0x05, 0x98, 0x0c, 0x49, 0x24, 0x37, - 0xa3, 0xb9, 0x70, 0xf9, 0xf5, 0xc5, 0xb5, 0xe9, 0xc7, 0x78, 0x54, 0x06, 0xba, 0x18, 0xaa, 0x49, - 0x24, 0x4e, 0xd3, 0xa3, 0x4b, 0x50, 0xf0, 0xc3, 0xe9, 0xc7, 0x3b, 0x24, 0x55, 0xf5, 0xeb, 0xd7, - 0xab, 0xdc, 0xe1, 0xed, 0x7a, 0x15, 0x17, 0xfc, 0x50, 0xa6, 0xab, 0xa0, 0xf7, 0xb1, 0x70, 0xfa, - 0x09, 0xae, 0x35, 0x94, 0xe9, 0x2a, 0x18, 0x10, 0xc7, 0x78, 0xb4, 0x0d, 0xe3, 0xa1, 0x71, 0xef, - 0x0d, 0xa7, 0xcf, 0xb3, 0x9e, 0x7a, 0x22, 0x6f, 0xd0, 0x0c, 0x6a, 0x2d, 0xda, 0xbc, 0xc9, 0x05, - 0x27, 0xd9, 0xf2, 0xd5, 0xa5, 0x5d, 0xf0, 0xc3, 0xe9, 0x27, 0xbb, 0xac, 0x2e, 0x8d, 0x58, 0x5f, - 0x5d, 0x3a, 0x0f, 0x9c, 0xe0, 0x39, 0xf3, 0x5d, 0x30, 0x99, 0x12, 0x97, 0x0e, 0x93, 0x89, 0x69, - 0x66, 0x07, 0x46, 0x8d, 0x29, 0xf9, 0x40, 0x1d, 0x0b, 0xbe, 0x67, 0x08, 0x4a, 0xca, 0xe8, 0x8c, - 0x2e, 0x9a, 0xbe, 0x04, 0xa7, 0x93, 0xbe, 0x04, 0x43, 0x15, 0xbf, 0x6e, 0xb8, 0x0f, 0xac, 0x67, - 0xc4, 0xee, 0xcb, 0xdb, 0x00, 0x7b, 0x7f, 0xd3, 0xa0, 0x69, 0xf2, 0x8b, 0x3d, 0x3b, 0x25, 0xf4, - 0x75, 0x34, 0x0e, 0x5c, 0x86, 0x49, 0xcf, 0x67, 0x32, 0x3a, 0xa9, 0x4b, 0x01, 0x8c, 0xc9, 0x59, - 0x25, 0x3d, 0x18, 0x4e, 0x82, 0x00, 0xa7, 0xcb, 0xd0, 0x0a, 0xb9, 0xa0, 0x94, 0xb4, 0x46, 0x70, - 0x39, 0x0a, 0x0b, 0x2c, 0x7a, 0x0c, 0xfa, 0x5b, 0x7e, 0x7d, 0xa5, 0x22, 0xe4, 0x73, 0x2d, 0x62, - 0x6c, 0x7d, 0xa5, 0x82, 0x39, 0x0e, 0xcd, 0xc1, 0x00, 0xfb, 0x11, 0x4e, 0x8f, 0xe4, 0x47, 0x3d, - 0x61, 0x25, 0xb4, 0x3c, 0x57, 0xac, 0x00, 0x16, 0x05, 0x99, 0x56, 0x94, 0x5e, 0x6a, 0x98, 0x56, - 0x74, 0xf0, 0x3e, 0xb5, 0xa2, 0x92, 0x01, 0x8e, 0x79, 0xa1, 0x3b, 0x70, 0xd2, 0xb8, 0x48, 0xf2, - 0x29, 0x42, 0x42, 0x11, 0x79, 0xe1, 0xb1, 0x8e, 0x37, 0x48, 0xe1, 0xc4, 0x70, 0x46, 0x34, 0xfa, - 0xe4, 0x4a, 0x16, 0x27, 0x9c, 0x5d, 0x01, 0x6a, 0xc0, 0x64, 0x2d, 0x55, 0xeb, 0x50, 0xef, 0xb5, - 0xaa, 0x01, 0x4d, 0xd7, 0x98, 0x66, 0x8c, 0x5e, 0x81, 0xa1, 0xb7, 0xfc, 0x90, 0x9d, 0x6d, 0xe2, - 0x4e, 0x21, 0x9f, 0xed, 0x0f, 0xbd, 0x7e, 0xbd, 0xca, 0xe0, 0x07, 0xfb, 0xe5, 0xe1, 0x8a, 0x5f, - 0x97, 0x7f, 0xb1, 0x2a, 0x80, 0x7e, 0xc0, 0x82, 0x99, 0xf4, 0x4d, 0x55, 0x35, 0x7a, 0xb4, 0xf7, - 0x46, 0xdb, 0xa2, 0xd2, 0x99, 0xa5, 0x5c, 0x76, 0xb8, 0x43, 0x55, 0xe8, 0x83, 0x74, 0x21, 0x84, - 0xee, 0x5d, 0x22, 0x92, 0x84, 0x3e, 0x1a, 0x2f, 0x04, 0x0a, 0x3d, 0xd8, 0x2f, 0x8f, 0xf3, 0x2d, - 0x2d, 0x7e, 0x37, 0x23, 0x0a, 0xd8, 0xbf, 0x6c, 0x31, 0xb5, 0xac, 0x80, 0x92, 0xb0, 0xdd, 0x38, - 0x8e, 0xcc, 0xc0, 0x4b, 0x86, 0xc9, 0xf3, 0xbe, 0xfd, 0x61, 0xfe, 0x89, 0xc5, 0xfc, 0x61, 0x8e, - 0xf1, 0xe1, 0xcb, 0xeb, 0x30, 0x14, 0xc9, 0x8c, 0xcd, 0x1d, 0x92, 0x19, 0x6b, 0x8d, 0x62, 0x3e, - 0x41, 0xea, 0x72, 0xa0, 0x92, 0x33, 0x2b, 0x36, 0xf6, 0x3f, 0xe4, 0x23, 0x20, 0x31, 0xc7, 0x60, - 0x59, 0x5a, 0x34, 0x2d, 0x4b, 0xe5, 0x2e, 0x5f, 0x90, 0x63, 0x61, 0xfa, 0x07, 0x66, 0xbb, 0x99, - 0x52, 0xec, 0x9d, 0xee, 0x88, 0x65, 0x7f, 0xde, 0x02, 0x88, 0x63, 0x79, 0xf7, 0x90, 0x93, 0xef, - 0x25, 0x7a, 0x1d, 0xf0, 0x23, 0xbf, 0xe6, 0x37, 0x84, 0xdd, 0xf4, 0x91, 0xd8, 0xb8, 0xc5, 0xe1, - 0x07, 0xda, 0x6f, 0xac, 0xa8, 0x51, 0x59, 0x46, 0x0e, 0x2c, 0xc6, 0xe6, 0x56, 0x23, 0x6a, 0xe0, - 0x17, 0x2d, 0x38, 0x91, 0xe5, 0x45, 0x4d, 0x2f, 0x97, 0x5c, 0x3d, 0xa8, 0x9c, 0xe4, 0xd4, 0x68, - 0xde, 0x14, 0x70, 0xac, 0x28, 0x7a, 0x4e, 0x76, 0x78, 0xb8, 0x20, 0xda, 0xd7, 0x61, 0xb4, 0x12, - 0x10, 0xed, 0x5c, 0x7e, 0x95, 0x47, 0xa3, 0xe0, 0xed, 0x79, 0xe6, 0xd0, 0x91, 0x28, 0xec, 0x2f, - 0x17, 0xe0, 0x04, 0xf7, 0x35, 0x99, 0xdb, 0xf5, 0xdd, 0x7a, 0xc5, 0xaf, 0x8b, 0xb7, 0x72, 0x6f, - 0xc0, 0x48, 0x4b, 0xd3, 0xe9, 0x76, 0x0a, 0x08, 0xab, 0xeb, 0x7e, 0x63, 0x2d, 0x94, 0x0e, 0xc5, - 0x06, 0x2f, 0x54, 0x87, 0x11, 0xb2, 0xeb, 0xd6, 0x94, 0xc3, 0x42, 0xe1, 0xd0, 0x67, 0xa4, 0xaa, - 0x65, 0x49, 0xe3, 0x83, 0x0d, 0xae, 0x0f, 0x20, 0x05, 0xb9, 0xfd, 0x63, 0x16, 0x3c, 0x94, 0x13, - 0x3e, 0x96, 0x56, 0x77, 0x9b, 0x79, 0xf5, 0x88, 0x69, 0xab, 0xaa, 0xe3, 0xbe, 0x3e, 0x58, 0x60, - 0xd1, 0x47, 0x01, 0xb8, 0xaf, 0x0e, 0xf1, 0x6a, 0x5d, 0xe3, 0x6c, 0x1a, 0x21, 0x02, 0xb5, 0x68, - 0x6f, 0xb2, 0x3c, 0xd6, 0x78, 0xd9, 0x5f, 0xec, 0x83, 0x7e, 0xe6, 0x1b, 0x82, 0x2a, 0x30, 0xb8, - 0xcd, 0x13, 0x02, 0x75, 0x1c, 0x37, 0x4a, 0x2b, 0x73, 0x0c, 0xc5, 0xe3, 0xa6, 0x41, 0xb1, 0x64, - 0x83, 0x56, 0x61, 0x8a, 0xe7, 0x65, 0x6a, 0x2c, 0x92, 0x86, 0xb3, 0x27, 0xd5, 0xa5, 0x3c, 0x89, - 0xb0, 0x52, 0x1b, 0xaf, 0xa4, 0x49, 0x70, 0x56, 0x39, 0xf4, 0x2a, 0x8c, 0xd1, 0xeb, 0xab, 0xdf, - 0x8e, 0x24, 0x27, 0x9e, 0x91, 0x49, 0x49, 0xf4, 0xeb, 0x06, 0x16, 0x27, 0xa8, 0xd1, 0x2b, 0x30, - 0xda, 0x4a, 0x29, 0x86, 0xfb, 0x63, 0x0d, 0x8a, 0xa9, 0x0c, 0x36, 0x69, 0x99, 0x23, 0x75, 0x9b, - 0xb9, 0x8d, 0xaf, 0x6f, 0x07, 0x24, 0xdc, 0xf6, 0x1b, 0x75, 0x26, 0x39, 0xf6, 0x6b, 0x8e, 0xd4, - 0x09, 0x3c, 0x4e, 0x95, 0xa0, 0x5c, 0x36, 0x1d, 0xb7, 0xd1, 0x0e, 0x48, 0xcc, 0x65, 0xc0, 0xe4, - 0xb2, 0x9c, 0xc0, 0xe3, 0x54, 0x89, 0xee, 0x1a, 0xef, 0xc1, 0xa3, 0xd1, 0x78, 0xdb, 0x3f, 0x53, - 0x00, 0x63, 0x68, 0xbf, 0x73, 0x33, 0x45, 0xd1, 0x2f, 0xdb, 0x0a, 0x5a, 0x35, 0xe1, 0x07, 0x95, - 0xf9, 0x65, 0x71, 0x02, 0x58, 0xfe, 0x65, 0xf4, 0x3f, 0x66, 0xa5, 0xe8, 0x1a, 0x3f, 0x59, 0x09, - 0x7c, 0x7a, 0xc8, 0xc9, 0x78, 0x65, 0xea, 0xbd, 0xc2, 0xa0, 0x7c, 0xcb, 0xdd, 0x21, 0xb2, 0xa7, - 0xf0, 0xe8, 0xe6, 0x1c, 0x0c, 0x97, 0xa1, 0xaa, 0x08, 0xaa, 0x20, 0xb9, 0xa0, 0x4b, 0x30, 0x2c, - 0xd2, 0xff, 0x30, 0xb7, 0x7a, 0xbe, 0x98, 0x98, 0x8b, 0xd3, 0x62, 0x0c, 0xc6, 0x3a, 0x8d, 0xfd, - 0x83, 0x05, 0x98, 0xca, 0x78, 0x17, 0xc5, 0x8f, 0x91, 0x2d, 0x37, 0x8c, 0x54, 0x8e, 0x59, 0xed, - 0x18, 0xe1, 0x70, 0xac, 0x28, 0xe8, 0x5e, 0xc5, 0x0f, 0xaa, 0xe4, 0xe1, 0x24, 0xde, 0x1d, 0x08, - 0xec, 0x21, 0xb3, 0xb5, 0x9e, 0x83, 0xbe, 0x76, 0x48, 0x64, 0x4c, 0x5e, 0x75, 0x6c, 0x33, 0x73, - 0x30, 0xc3, 0xd0, 0x1b, 0xd8, 0x96, 0xb2, 0xac, 0x6a, 0x37, 0x30, 0x6e, 0x5b, 0xe5, 0x38, 0xda, - 0xb8, 0x88, 0x78, 0x8e, 0x17, 0x89, 0x7b, 0x5a, 0x1c, 0x5c, 0x92, 0x41, 0xb1, 0xc0, 0xda, 0x5f, - 0x28, 0xc2, 0xe9, 0xdc, 0x97, 0x92, 0xb4, 0xe9, 0x4d, 0xdf, 0x73, 0x23, 0x5f, 0xf9, 0x8e, 0xf1, - 0x80, 0x92, 0xa4, 0xb5, 0xbd, 0x2a, 0xe0, 0x58, 0x51, 0xa0, 0xf3, 0xd0, 0xcf, 0x94, 0xc9, 0xa9, - 0x6c, 0xbb, 0xf3, 0x8b, 0x3c, 0xc2, 0x18, 0x47, 0xf7, 0x9c, 0x20, 0xfd, 0x31, 0x2a, 0xc1, 0xf8, - 0x8d, 0xe4, 0x81, 0x42, 0x9b, 0xeb, 0xfb, 0x0d, 0xcc, 0x90, 0xe8, 0x09, 0xd1, 0x5f, 0x09, 0x67, - 0x29, 0xec, 0xd4, 0xfd, 0x50, 0xeb, 0xb4, 0xa7, 0x60, 0x70, 0x87, 0xec, 0x05, 0xae, 0xb7, 0x95, - 0x74, 0xa2, 0xbb, 0xca, 0xc1, 0x58, 0xe2, 0xcd, 0xf4, 0x90, 0x83, 0x47, 0x9d, 0xd9, 0x7c, 0xa8, - 0xab, 0x78, 0xf2, 0xc3, 0x45, 0x18, 0xc7, 0xf3, 0x8b, 0xef, 0x0e, 0xc4, 0x8d, 0xf4, 0x40, 0x1c, - 0x75, 0x66, 0xf3, 0xee, 0xa3, 0xf1, 0x0b, 0x16, 0x8c, 0xb3, 0x24, 0x44, 0x22, 0x1e, 0x82, 0xeb, - 0x7b, 0xc7, 0x70, 0x15, 0x78, 0x0c, 0xfa, 0x03, 0x5a, 0x69, 0x32, 0xcd, 0x2e, 0x6b, 0x09, 0xe6, - 0x38, 0xf4, 0x08, 0xf4, 0xb1, 0x26, 0xd0, 0xc1, 0x1b, 0xe1, 0x5b, 0xf0, 0xa2, 0x13, 0x39, 0x98, - 0x41, 0x59, 0x7c, 0x2d, 0x4c, 0x5a, 0x0d, 0x97, 0x37, 0x3a, 0x36, 0xf5, 0xbf, 0x33, 0x62, 0x28, - 0x64, 0x36, 0xed, 0xed, 0xc5, 0xd7, 0xca, 0x66, 0xd9, 0xf9, 0x9a, 0xfd, 0xc7, 0x05, 0x38, 0x9b, - 0x59, 0xae, 0xe7, 0xf8, 0x5a, 0x9d, 0x4b, 0x3f, 0xc8, 0x34, 0x33, 0xc5, 0x63, 0x74, 0x51, 0xee, - 0xeb, 0x55, 0xfa, 0xef, 0xef, 0x21, 0xec, 0x55, 0x66, 0x97, 0xbd, 0x43, 0xc2, 0x5e, 0x65, 0xb6, - 0x2d, 0x47, 0x4d, 0xf0, 0xe7, 0x85, 0x9c, 0x6f, 0x61, 0x0a, 0x83, 0x0b, 0x74, 0x9f, 0x61, 0xc8, - 0x50, 0x5e, 0xc2, 0xf9, 0x1e, 0xc3, 0x61, 0x58, 0x61, 0xd1, 0x1c, 0x8c, 0x37, 0x5d, 0x8f, 0x6e, - 0x3e, 0x7b, 0xa6, 0x28, 0xae, 0x6c, 0x00, 0xab, 0x26, 0x1a, 0x27, 0xe9, 0x91, 0xab, 0x85, 0xc4, - 0xe2, 0x5f, 0xf7, 0xca, 0xa1, 0x56, 0xdd, 0xac, 0xe9, 0x06, 0xa1, 0x7a, 0x31, 0x23, 0x3c, 0xd6, - 0xaa, 0xa6, 0x27, 0x2a, 0xf6, 0xae, 0x27, 0x1a, 0xc9, 0xd6, 0x11, 0xcd, 0xbc, 0x02, 0xa3, 0xf7, - 0x6d, 0x53, 0xb0, 0xbf, 0x5e, 0x84, 0x87, 0x3b, 0x2c, 0x7b, 0xbe, 0xd7, 0x1b, 0x63, 0xa0, 0xed, - 0xf5, 0xa9, 0x71, 0xa8, 0xc0, 0x89, 0xcd, 0x76, 0xa3, 0xb1, 0xc7, 0x5e, 0xee, 0x90, 0xba, 0xa4, - 0x10, 0x32, 0xa5, 0x54, 0x8e, 0x9c, 0x58, 0xce, 0xa0, 0xc1, 0x99, 0x25, 0xe9, 0x15, 0x8b, 0x9e, - 0x24, 0x7b, 0x8a, 0x55, 0xe2, 0x8a, 0x85, 0x75, 0x24, 0x36, 0x69, 0xd1, 0x65, 0x98, 0x74, 0x76, - 0x1d, 0x97, 0xc7, 0x15, 0x97, 0x0c, 0xf8, 0x1d, 0x4b, 0xa9, 0x82, 0xe7, 0x92, 0x04, 0x38, 0x5d, - 0x06, 0xbd, 0x06, 0xc8, 0xdf, 0x60, 0xfe, 0xfd, 0xf5, 0xcb, 0xc4, 0x13, 0xd6, 0x6a, 0x36, 0x76, - 0xc5, 0x78, 0x4b, 0xb8, 0x9e, 0xa2, 0xc0, 0x19, 0xa5, 0x12, 0xf1, 0x9f, 0x06, 0xf2, 0xe3, 0x3f, - 0x75, 0xde, 0x17, 0xbb, 0x66, 0x38, 0xba, 0x04, 0xa3, 0x87, 0xf4, 0x5a, 0xb5, 0xff, 0x83, 0x45, - 0x4f, 0x3c, 0x5e, 0xc6, 0x0c, 0xae, 0xfa, 0x0a, 0x73, 0xab, 0xe5, 0x9a, 0x65, 0x2d, 0xc0, 0xce, - 0x49, 0xcd, 0xad, 0x36, 0x46, 0x62, 0x93, 0x96, 0xcf, 0x21, 0xcd, 0x1d, 0xd6, 0xb8, 0x15, 0x88, - 0x08, 0x70, 0x8a, 0x02, 0x7d, 0x0c, 0x06, 0xeb, 0xee, 0xae, 0x1b, 0x0a, 0xe5, 0xd8, 0xa1, 0x8d, - 0x58, 0xf1, 0xd6, 0xb9, 0xc8, 0xd9, 0x60, 0xc9, 0xcf, 0xfe, 0xe1, 0x42, 0xdc, 0x27, 0xaf, 0xb7, - 0xfd, 0xc8, 0x39, 0x86, 0x93, 0xfc, 0xb2, 0x71, 0x92, 0x3f, 0xd1, 0x29, 0x0c, 0x1e, 0x6b, 0x52, - 0xee, 0x09, 0x7e, 0x3d, 0x71, 0x82, 0x3f, 0xd9, 0x9d, 0x55, 0xe7, 0x93, 0xfb, 0x1f, 0x59, 0x30, - 0x69, 0xd0, 0x1f, 0xc3, 0x01, 0xb2, 0x6c, 0x1e, 0x20, 0x8f, 0x76, 0xfd, 0x86, 0x9c, 0x83, 0xe3, - 0xfb, 0x8a, 0x89, 0xb6, 0xb3, 0x03, 0xe3, 0x2d, 0xe8, 0xdb, 0x76, 0x82, 0x7a, 0xa7, 0xb4, 0x1f, - 0xa9, 0x42, 0xb3, 0x57, 0x9c, 0x40, 0x58, 0xf8, 0x9f, 0x91, 0xbd, 0x4e, 0x41, 0x5d, 0xad, 0xfb, - 0xac, 0x2a, 0xf4, 0x12, 0x0c, 0x84, 0x35, 0xbf, 0xa5, 0x9e, 0xfa, 0x9c, 0x63, 0x1d, 0xcd, 0x20, - 0x07, 0xfb, 0x65, 0x64, 0x56, 0x47, 0xc1, 0x58, 0xd0, 0xa3, 0x37, 0x60, 0x94, 0xfd, 0x52, 0xee, - 0x76, 0xc5, 0x7c, 0x0d, 0x46, 0x55, 0x27, 0xe4, 0xbe, 0xa8, 0x06, 0x08, 0x9b, 0xac, 0x66, 0xb6, - 0xa0, 0xa4, 0x3e, 0xeb, 0x81, 0x5a, 0x89, 0xff, 0x6d, 0x11, 0xa6, 0x32, 0xe6, 0x1c, 0x0a, 0x8d, - 0x91, 0xb8, 0xd4, 0xe3, 0x54, 0x7d, 0x9b, 0x63, 0x11, 0xb2, 0x0b, 0x54, 0x5d, 0xcc, 0xad, 0x9e, - 0x2b, 0xbd, 0x11, 0x92, 0x64, 0xa5, 0x14, 0xd4, 0xbd, 0x52, 0x5a, 0xd9, 0xb1, 0x75, 0x35, 0xad, - 0x48, 0xb5, 0xf4, 0x81, 0x8e, 0xe9, 0xaf, 0xf5, 0xc1, 0x89, 0xac, 0xc8, 0x9c, 0xe8, 0x33, 0x89, - 0xa4, 0xb3, 0x2f, 0xf4, 0x1a, 0xd3, 0x93, 0x67, 0xa2, 0x15, 0x11, 0x03, 0x67, 0xcd, 0x34, 0xb4, - 0x5d, 0xbb, 0x59, 0xd4, 0xc9, 0x62, 0x96, 0x04, 0x3c, 0x59, 0xb0, 0xdc, 0x3e, 0xde, 0xdf, 0x73, - 0x03, 0x44, 0x96, 0xe1, 0x30, 0xe1, 0xca, 0x23, 0xc1, 0xdd, 0x5d, 0x79, 0x64, 0xcd, 0x68, 0x05, - 0x06, 0x6a, 0xdc, 0x47, 0xa4, 0xd8, 0x7d, 0x0b, 0xe3, 0x0e, 0x22, 0x6a, 0x03, 0x16, 0x8e, 0x21, - 0x82, 0xc1, 0x8c, 0x0b, 0xc3, 0x5a, 0xc7, 0x3c, 0xd0, 0xc9, 0xb3, 0x43, 0x0f, 0x3e, 0xad, 0x0b, - 0x1e, 0xe8, 0x04, 0xfa, 0x31, 0x0b, 0x12, 0x0f, 0x45, 0x94, 0x52, 0xce, 0xca, 0x55, 0xca, 0x9d, - 0x83, 0xbe, 0xc0, 0x6f, 0x90, 0x64, 0xa2, 0x57, 0xec, 0x37, 0x08, 0x66, 0x18, 0x4a, 0x11, 0xc5, - 0xaa, 0x96, 0x11, 0xfd, 0x1a, 0x29, 0x2e, 0x88, 0x8f, 0x41, 0x7f, 0x83, 0xec, 0x92, 0x46, 0x32, - 0x1f, 0xd7, 0x35, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x42, 0x1f, 0x9c, 0xe9, 0x18, 0x40, 0x88, 0x5e, - 0xc6, 0xb6, 0x9c, 0x88, 0xdc, 0x76, 0xf6, 0x92, 0x89, 0x73, 0x2e, 0x73, 0x30, 0x96, 0x78, 0xf6, - 0x6a, 0x91, 0xc7, 0xbf, 0x4f, 0xa8, 0x30, 0x45, 0xd8, 0x7b, 0x81, 0x35, 0x55, 0x62, 0xc5, 0xa3, - 0x50, 0x89, 0x3d, 0x07, 0x10, 0x86, 0x0d, 0xee, 0x4e, 0x57, 0x17, 0xcf, 0x21, 0xe3, 0x3c, 0x09, - 0xd5, 0x6b, 0x02, 0x83, 0x35, 0x2a, 0xb4, 0x08, 0x13, 0xad, 0xc0, 0x8f, 0xb8, 0x46, 0x78, 0x91, - 0x7b, 0x9c, 0xf6, 0x9b, 0xb1, 0x5b, 0x2a, 0x09, 0x3c, 0x4e, 0x95, 0x40, 0x2f, 0xc2, 0xb0, 0x88, - 0xe7, 0x52, 0xf1, 0xfd, 0x86, 0x50, 0x42, 0x29, 0x27, 0xcc, 0x6a, 0x8c, 0xc2, 0x3a, 0x9d, 0x56, - 0x8c, 0xa9, 0x99, 0x07, 0x33, 0x8b, 0x71, 0x55, 0xb3, 0x46, 0x97, 0x08, 0xf8, 0x3b, 0xd4, 0x53, - 0xc0, 0xdf, 0x58, 0x2d, 0x57, 0xea, 0xd9, 0xea, 0x09, 0x5d, 0x15, 0x59, 0x5f, 0xe9, 0x83, 0x29, - 0x31, 0x71, 0x1e, 0xf4, 0x74, 0xb9, 0x91, 0x9e, 0x2e, 0x47, 0xa1, 0xb8, 0x7b, 0x77, 0xce, 0x1c, - 0xf7, 0x9c, 0xf9, 0x11, 0x0b, 0x4c, 0x49, 0x0d, 0xfd, 0x7f, 0xb9, 0x99, 0xc7, 0x5e, 0xcc, 0x95, - 0xfc, 0x94, 0xc3, 0xe1, 0xdb, 0xcc, 0x41, 0x66, 0xff, 0x3b, 0x0b, 0x1e, 0xed, 0xca, 0x11, 0x2d, - 0x41, 0x89, 0x89, 0x93, 0xda, 0x45, 0xef, 0x49, 0xe5, 0x91, 0x2e, 0x11, 0x39, 0xd2, 0x6d, 0x5c, - 0x12, 0x2d, 0xa5, 0x52, 0xbc, 0x3d, 0x95, 0x91, 0xe2, 0xed, 0xa4, 0xd1, 0x3d, 0xf7, 0x99, 0xe3, - 0xed, 0x87, 0xe8, 0x89, 0x63, 0xbc, 0x06, 0x43, 0xef, 0x37, 0x94, 0x8e, 0x76, 0x42, 0xe9, 0x88, - 0x4c, 0x6a, 0xed, 0x0c, 0xf9, 0x08, 0x4c, 0xb0, 0x40, 0x6f, 0xec, 0x7d, 0x84, 0x78, 0xa7, 0x56, - 0x88, 0x7d, 0xa0, 0xaf, 0x25, 0x70, 0x38, 0x45, 0x6d, 0xff, 0x51, 0x11, 0x06, 0xf8, 0xf2, 0x3b, - 0x86, 0xeb, 0xe5, 0xd3, 0x50, 0x72, 0x9b, 0xcd, 0x36, 0xcf, 0xda, 0xd5, 0x1f, 0x7b, 0xd4, 0xae, - 0x48, 0x20, 0x8e, 0xf1, 0x68, 0x59, 0xe8, 0xbb, 0x3b, 0xc4, 0x92, 0xe5, 0x0d, 0x9f, 0x5d, 0x74, - 0x22, 0x87, 0xcb, 0x4a, 0xea, 0x9c, 0x8d, 0x35, 0xe3, 0xe8, 0x93, 0x00, 0x61, 0x14, 0xb8, 0xde, - 0x16, 0x85, 0x89, 0x10, 0xd6, 0xef, 0xed, 0xc0, 0xad, 0xaa, 0x88, 0x39, 0xcf, 0x78, 0xcf, 0x51, - 0x08, 0xac, 0x71, 0x44, 0xb3, 0xc6, 0x49, 0x3f, 0x93, 0x18, 0x3b, 0xe0, 0x5c, 0xe3, 0x31, 0x9b, - 0xf9, 0x00, 0x94, 0x14, 0xf3, 0x6e, 0xda, 0xaf, 0x11, 0x5d, 0x2c, 0xfa, 0x30, 0x8c, 0x27, 0xda, - 0x76, 0x28, 0xe5, 0xd9, 0x2f, 0x5a, 0x30, 0xce, 0x1b, 0xb3, 0xe4, 0xed, 0x8a, 0xd3, 0xe0, 0x2e, - 0x9c, 0x68, 0x64, 0xec, 0xca, 0x62, 0xf8, 0x7b, 0xdf, 0xc5, 0x95, 0xb2, 0x2c, 0x0b, 0x8b, 0x33, - 0xeb, 0x40, 0x17, 0xe8, 0x8a, 0xa3, 0xbb, 0xae, 0xd3, 0x10, 0xcf, 0xf2, 0x47, 0xf8, 0x6a, 0xe3, - 0x30, 0xac, 0xb0, 0xf6, 0xef, 0x59, 0x30, 0xc9, 0x5b, 0x7e, 0x95, 0xec, 0xa9, 0xbd, 0xe9, 0x5b, - 0xd9, 0x76, 0x91, 0x2f, 0xb2, 0x90, 0x93, 0x2f, 0x52, 0xff, 0xb4, 0x62, 0xc7, 0x4f, 0xfb, 0xb2, - 0x05, 0x62, 0x86, 0x1c, 0x83, 0x3e, 0xe3, 0xbb, 0x4c, 0x7d, 0xc6, 0x4c, 0xfe, 0x22, 0xc8, 0x51, - 0x64, 0xfc, 0x99, 0x05, 0x13, 0x9c, 0x20, 0xb6, 0xd5, 0x7f, 0x4b, 0xc7, 0xa1, 0x97, 0xac, 0xf2, - 0x57, 0xc9, 0xde, 0xba, 0x5f, 0x71, 0xa2, 0xed, 0xec, 0x8f, 0x32, 0x06, 0xab, 0xaf, 0xe3, 0x60, - 0xd5, 0xe5, 0x02, 0x32, 0xd2, 0x29, 0x75, 0x79, 0x5c, 0x7f, 0xd8, 0x74, 0x4a, 0xf6, 0x37, 0x2d, - 0x40, 0xbc, 0x1a, 0x43, 0x70, 0xa3, 0xe2, 0x10, 0x83, 0x6a, 0x07, 0x5d, 0xbc, 0x35, 0x29, 0x0c, - 0xd6, 0xa8, 0x8e, 0xa4, 0x7b, 0x12, 0x0e, 0x17, 0xc5, 0xee, 0x0e, 0x17, 0x87, 0xe8, 0xd1, 0x7f, - 0x31, 0x00, 0xc9, 0x17, 0x71, 0xe8, 0x26, 0x8c, 0xd4, 0x9c, 0x96, 0xb3, 0xe1, 0x36, 0xdc, 0xc8, - 0x25, 0x61, 0x27, 0x6f, 0xac, 0x05, 0x8d, 0x4e, 0x98, 0xc8, 0x35, 0x08, 0x36, 0xf8, 0xa0, 0x59, - 0x80, 0x56, 0xe0, 0xee, 0xba, 0x0d, 0xb2, 0xc5, 0xd4, 0x2e, 0x2c, 0x10, 0x08, 0x77, 0x0d, 0x93, - 0x50, 0xac, 0x51, 0x64, 0x84, 0x1f, 0x28, 0x3e, 0xe0, 0xf0, 0x03, 0x70, 0x6c, 0xe1, 0x07, 0xfa, - 0x0e, 0x15, 0x7e, 0x60, 0xe8, 0xd0, 0xe1, 0x07, 0xfa, 0x7b, 0x0a, 0x3f, 0x80, 0xe1, 0x94, 0x94, - 0x3d, 0xe9, 0xff, 0x65, 0xb7, 0x41, 0xc4, 0x85, 0x83, 0x47, 0x2f, 0x99, 0xb9, 0xb7, 0x5f, 0x3e, - 0x85, 0x33, 0x29, 0x70, 0x4e, 0x49, 0xf4, 0x51, 0x98, 0x76, 0x1a, 0x0d, 0xff, 0xb6, 0x1a, 0xd4, - 0xa5, 0xb0, 0xe6, 0x34, 0xb8, 0x09, 0x64, 0x90, 0x71, 0x7d, 0xe4, 0xde, 0x7e, 0x79, 0x7a, 0x2e, - 0x87, 0x06, 0xe7, 0x96, 0x46, 0x1f, 0x82, 0x52, 0x2b, 0xf0, 0x6b, 0xab, 0xda, 0xb3, 0xdd, 0xb3, - 0xb4, 0x03, 0x2b, 0x12, 0x78, 0xb0, 0x5f, 0x1e, 0x55, 0x7f, 0xd8, 0x81, 0x1f, 0x17, 0xc8, 0x88, - 0x27, 0x30, 0x7c, 0xa4, 0xf1, 0x04, 0x76, 0x60, 0xaa, 0x4a, 0x02, 0xd7, 0x69, 0xb8, 0x77, 0xa9, - 0xbc, 0x2c, 0xf7, 0xa7, 0x75, 0x28, 0x05, 0x89, 0x1d, 0xb9, 0xa7, 0xf8, 0xae, 0x5a, 0x5e, 0x1b, - 0xb9, 0x03, 0xc7, 0x8c, 0xec, 0xff, 0x65, 0xc1, 0xa0, 0x78, 0x01, 0x77, 0x0c, 0x52, 0xe3, 0x9c, - 0x61, 0x94, 0x28, 0x67, 0x77, 0x18, 0x6b, 0x4c, 0xae, 0x39, 0x62, 0x25, 0x61, 0x8e, 0x78, 0xb4, - 0x13, 0x93, 0xce, 0x86, 0x88, 0xbf, 0x5e, 0xa4, 0xd2, 0xbb, 0xf1, 0x16, 0xfb, 0xc1, 0x77, 0xc1, - 0x1a, 0x0c, 0x86, 0xe2, 0x2d, 0x70, 0x21, 0xff, 0x31, 0x46, 0x72, 0x10, 0x63, 0x2f, 0x3a, 0xf1, - 0xfa, 0x57, 0x32, 0xc9, 0x7c, 0x64, 0x5c, 0x7c, 0x80, 0x8f, 0x8c, 0xbb, 0xbd, 0x56, 0xef, 0x3b, - 0x8a, 0xd7, 0xea, 0xf6, 0xd7, 0xd8, 0xc9, 0xa9, 0xc3, 0x8f, 0x41, 0xa8, 0xba, 0x6c, 0x9e, 0xb1, - 0x76, 0x87, 0x99, 0x25, 0x1a, 0x95, 0x23, 0x5c, 0xfd, 0xbc, 0x05, 0x67, 0x32, 0xbe, 0x4a, 0x93, - 0xb4, 0x9e, 0x81, 0x21, 0xa7, 0x5d, 0x77, 0xd5, 0x5a, 0xd6, 0x4c, 0x93, 0x73, 0x02, 0x8e, 0x15, - 0x05, 0x5a, 0x80, 0x49, 0x72, 0xa7, 0xe5, 0x72, 0x43, 0xae, 0xee, 0x7c, 0x5c, 0xe4, 0xcf, 0x26, - 0x97, 0x92, 0x48, 0x9c, 0xa6, 0x57, 0x71, 0x8d, 0x8a, 0xb9, 0x71, 0x8d, 0xfe, 0x8e, 0x05, 0xc3, - 0xea, 0x35, 0xec, 0x03, 0xef, 0xed, 0x8f, 0x98, 0xbd, 0xfd, 0x70, 0x87, 0xde, 0xce, 0xe9, 0xe6, - 0xdf, 0x29, 0xa8, 0xf6, 0x56, 0xfc, 0x20, 0xea, 0x41, 0x82, 0xbb, 0xff, 0x87, 0x13, 0x97, 0x60, - 0xd8, 0x69, 0xb5, 0x24, 0x42, 0x7a, 0xc0, 0xb1, 0x68, 0xdd, 0x31, 0x18, 0xeb, 0x34, 0xea, 0x1d, - 0x47, 0x31, 0xf7, 0x1d, 0x47, 0x1d, 0x20, 0x72, 0x82, 0x2d, 0x12, 0x51, 0x98, 0x70, 0xd8, 0xcd, - 0xdf, 0x6f, 0xda, 0x91, 0xdb, 0x98, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0xd9, 0x15, 0x2f, 0xba, 0x1e, - 0xf0, 0x2b, 0xa4, 0x16, 0x19, 0x4c, 0xf1, 0xc2, 0x1a, 0x5f, 0x19, 0xf9, 0x81, 0xd5, 0xd1, 0x6f, - 0xba, 0x52, 0xac, 0x09, 0x38, 0x56, 0x14, 0xf6, 0x07, 0xd8, 0xe9, 0xc3, 0xfa, 0xf4, 0x70, 0x51, - 0xb1, 0x7e, 0x6a, 0x44, 0x8d, 0x06, 0x33, 0x8a, 0x2e, 0xea, 0xb1, 0xb7, 0x3a, 0x6f, 0xf6, 0xb4, - 0x62, 0xfd, 0x41, 0x62, 0x1c, 0xa0, 0x0b, 0x7d, 0x3c, 0xe5, 0x1e, 0xf3, 0x6c, 0x97, 0x53, 0xe3, - 0x10, 0x0e, 0x31, 0x2c, 0x75, 0x0f, 0x4b, 0x6c, 0xb2, 0x52, 0x11, 0xeb, 0x42, 0x4b, 0xdd, 0x23, - 0x10, 0x38, 0xa6, 0xa1, 0xc2, 0x94, 0xfa, 0x13, 0x4e, 0xa3, 0x38, 0x84, 0xad, 0xa2, 0x0e, 0xb1, - 0x46, 0x81, 0x2e, 0x0a, 0x85, 0x02, 0xb7, 0x0b, 0x3c, 0x9c, 0x50, 0x28, 0xc8, 0xee, 0xd2, 0xb4, - 0x40, 0x97, 0x60, 0x58, 0x25, 0x6a, 0xaf, 0xf0, 0xa4, 0x59, 0x62, 0x9a, 0x2d, 0xc5, 0x60, 0xac, - 0xd3, 0xa0, 0x75, 0x18, 0x0f, 0xb9, 0x9e, 0x4d, 0xc5, 0x15, 0xe7, 0xfa, 0xca, 0xf7, 0xaa, 0x77, - 0xc8, 0x26, 0xfa, 0x80, 0x81, 0xf8, 0xee, 0x24, 0xa3, 0x33, 0x24, 0x59, 0xa0, 0x57, 0x61, 0xac, - 0xe1, 0x3b, 0xf5, 0x79, 0xa7, 0xe1, 0x78, 0x35, 0xd6, 0x3f, 0x43, 0x66, 0xbe, 0xdf, 0x6b, 0x06, - 0x16, 0x27, 0xa8, 0xa9, 0xf0, 0xa6, 0x43, 0x44, 0x74, 0x31, 0xc7, 0xdb, 0x22, 0xa1, 0x48, 0xbb, - 0xcd, 0x84, 0xb7, 0x6b, 0x39, 0x34, 0x38, 0xb7, 0x34, 0x7a, 0x09, 0x46, 0xe4, 0xe7, 0x6b, 0xc1, - 0x4c, 0xe2, 0x27, 0x31, 0x1a, 0x0e, 0x1b, 0x94, 0x28, 0x84, 0x93, 0xf2, 0xff, 0x7a, 0xe0, 0x6c, - 0x6e, 0xba, 0x35, 0xf1, 0xc2, 0x9f, 0x3f, 0xbb, 0xfd, 0xb0, 0x7c, 0x1b, 0xba, 0x94, 0x45, 0x74, - 0xb0, 0x5f, 0x7e, 0x44, 0xf4, 0x5a, 0x26, 0x1e, 0x67, 0xf3, 0x46, 0xab, 0x30, 0xb5, 0x4d, 0x9c, - 0x46, 0xb4, 0xbd, 0xb0, 0x4d, 0x6a, 0x3b, 0x72, 0xc1, 0xb1, 0xf0, 0x28, 0xda, 0xd3, 0x91, 0x2b, - 0x69, 0x12, 0x9c, 0x55, 0x0e, 0xbd, 0x09, 0xd3, 0xad, 0xf6, 0x46, 0xc3, 0x0d, 0xb7, 0xd7, 0xfc, - 0x88, 0x39, 0x21, 0xa9, 0x9c, 0xef, 0x22, 0x8e, 0x8a, 0x0a, 0x40, 0x53, 0xc9, 0xa1, 0xc3, 0xb9, - 0x1c, 0xd0, 0x5d, 0x38, 0x99, 0x98, 0x08, 0x22, 0x92, 0xc4, 0x58, 0x7e, 0x56, 0x91, 0x6a, 0x56, - 0x01, 0x11, 0x94, 0x25, 0x0b, 0x85, 0xb3, 0xab, 0x40, 0x2f, 0x03, 0xb8, 0xad, 0x65, 0xa7, 0xe9, - 0x36, 0xe8, 0x55, 0x71, 0x8a, 0xcd, 0x11, 0x7a, 0x6d, 0x80, 0x95, 0x8a, 0x84, 0xd2, 0xbd, 0x59, - 0xfc, 0xdb, 0xc3, 0x1a, 0x35, 0xba, 0x06, 0x63, 0xe2, 0xdf, 0x9e, 0x18, 0x52, 0x1e, 0xd0, 0xe4, - 0x71, 0x16, 0x8d, 0xaa, 0xa2, 0x63, 0x0e, 0x52, 0x10, 0x9c, 0x28, 0x8b, 0xb6, 0xe0, 0x8c, 0xcc, - 0x10, 0xa7, 0xcf, 0x4f, 0x39, 0x06, 0x21, 0x4b, 0xe5, 0x31, 0xc4, 0x5f, 0xa5, 0xcc, 0x75, 0x22, - 0xc4, 0x9d, 0xf9, 0xd0, 0x73, 0x5d, 0x9f, 0xe6, 0xfc, 0xc9, 0xef, 0x49, 0xee, 0xe1, 0x44, 0xcf, - 0xf5, 0x6b, 0x49, 0x24, 0x4e, 0xd3, 0x23, 0x1f, 0x4e, 0xba, 0x5e, 0xd6, 0xac, 0x3e, 0xc5, 0x18, - 0x7d, 0x90, 0xbf, 0x76, 0xee, 0x3c, 0xa3, 0x33, 0xf1, 0x38, 0x9b, 0xef, 0xdb, 0xf3, 0xfb, 0xfb, - 0x5d, 0x8b, 0x96, 0xd6, 0xa4, 0x73, 0xf4, 0x29, 0x18, 0xd1, 0x3f, 0x4a, 0x48, 0x1a, 0xe7, 0xb3, - 0x85, 0x57, 0x6d, 0x4f, 0xe0, 0xb2, 0xbd, 0x5a, 0xf7, 0x3a, 0x0e, 0x1b, 0x1c, 0x51, 0x2d, 0x23, - 0x26, 0xc0, 0xc5, 0xde, 0x24, 0x99, 0xde, 0xdd, 0xde, 0x08, 0x64, 0x4f, 0x77, 0x74, 0x0d, 0x86, - 0x6a, 0x0d, 0x97, 0x78, 0xd1, 0x4a, 0xa5, 0x53, 0xd4, 0xc3, 0x05, 0x41, 0x23, 0xd6, 0x8f, 0xc8, - 0xca, 0xc1, 0x61, 0x58, 0x71, 0xb0, 0x7f, 0xa3, 0x00, 0xe5, 0x2e, 0x29, 0x5e, 0x12, 0x66, 0x28, - 0xab, 0x27, 0x33, 0xd4, 0x1c, 0x8c, 0xc7, 0xff, 0x74, 0x0d, 0x97, 0xf2, 0x64, 0xbd, 0x69, 0xa2, - 0x71, 0x92, 0xbe, 0xe7, 0x47, 0x09, 0xba, 0x25, 0xab, 0xaf, 0xeb, 0xb3, 0x1a, 0xc3, 0x82, 0xdd, - 0xdf, 0xfb, 0xb5, 0x37, 0xd7, 0x1a, 0x69, 0x7f, 0xad, 0x00, 0x27, 0x55, 0x17, 0x7e, 0xe7, 0x76, - 0xdc, 0x8d, 0x74, 0xc7, 0x1d, 0x81, 0x2d, 0xd7, 0xbe, 0x0e, 0x03, 0x3c, 0x8c, 0x63, 0x0f, 0xe2, - 0xf6, 0x63, 0x66, 0x70, 0x67, 0x25, 0xe1, 0x19, 0x01, 0x9e, 0x7f, 0xc0, 0x82, 0xf1, 0xc4, 0xeb, - 0x36, 0x84, 0xb5, 0x27, 0xd0, 0xf7, 0x23, 0x12, 0x67, 0x09, 0xdb, 0xe7, 0xa0, 0x6f, 0xdb, 0x0f, - 0xa3, 0xa4, 0xa3, 0xc7, 0x15, 0x3f, 0x8c, 0x30, 0xc3, 0xd8, 0xbf, 0x6f, 0x41, 0xff, 0xba, 0xe3, - 0x7a, 0x91, 0x34, 0x0a, 0x58, 0x39, 0x46, 0x81, 0x5e, 0xbe, 0x0b, 0xbd, 0x08, 0x03, 0x64, 0x73, - 0x93, 0xd4, 0x22, 0x31, 0xaa, 0x32, 0xf4, 0xc4, 0xc0, 0x12, 0x83, 0x52, 0xf9, 0x8f, 0x55, 0xc6, - 0xff, 0x62, 0x41, 0x8c, 0x6e, 0x41, 0x29, 0x72, 0x9b, 0x64, 0xae, 0x5e, 0x17, 0xa6, 0xf2, 0xfb, - 0x08, 0x9f, 0xb1, 0x2e, 0x19, 0xe0, 0x98, 0x97, 0xfd, 0x85, 0x02, 0x40, 0x1c, 0xff, 0xaa, 0xdb, - 0x27, 0xce, 0xa7, 0x8c, 0xa8, 0xe7, 0x33, 0x8c, 0xa8, 0x28, 0x66, 0x98, 0x61, 0x41, 0x55, 0xdd, - 0x54, 0xec, 0xa9, 0x9b, 0xfa, 0x0e, 0xd3, 0x4d, 0x0b, 0x30, 0x19, 0xc7, 0xef, 0x32, 0xc3, 0x17, - 0xb2, 0xa3, 0x73, 0x3d, 0x89, 0xc4, 0x69, 0x7a, 0x9b, 0xc0, 0x39, 0x15, 0xc6, 0x48, 0x9c, 0x68, - 0xcc, 0x0f, 0x5c, 0x37, 0x4a, 0x77, 0xe9, 0xa7, 0xd8, 0x4a, 0x5c, 0xc8, 0xb5, 0x12, 0xff, 0xa4, - 0x05, 0x27, 0x92, 0xf5, 0xb0, 0x47, 0xd3, 0x9f, 0xb7, 0xe0, 0x24, 0xb3, 0x95, 0xb3, 0x5a, 0xd3, - 0x96, 0xf9, 0x17, 0x3a, 0x86, 0x66, 0xca, 0x69, 0x71, 0x1c, 0xe3, 0x64, 0x35, 0x8b, 0x35, 0xce, - 0xae, 0xd1, 0xfe, 0x9f, 0x7d, 0x30, 0x9d, 0x17, 0xd3, 0x89, 0x3d, 0x13, 0x71, 0xee, 0x54, 0x77, - 0xc8, 0x6d, 0xe1, 0x8c, 0x1f, 0x3f, 0x13, 0xe1, 0x60, 0x2c, 0xf1, 0xc9, 0xac, 0x1d, 0x85, 0x1e, - 0xb3, 0x76, 0x6c, 0xc3, 0xe4, 0xed, 0x6d, 0xe2, 0xdd, 0xf0, 0x42, 0x27, 0x72, 0xc3, 0x4d, 0x97, - 0xd9, 0x95, 0xf9, 0xbc, 0x91, 0xa9, 0x7e, 0x27, 0x6f, 0x25, 0x09, 0x0e, 0xf6, 0xcb, 0x67, 0x0c, - 0x40, 0xdc, 0x64, 0xbe, 0x91, 0xe0, 0x34, 0xd3, 0x74, 0xd2, 0x93, 0xbe, 0x07, 0x9c, 0xf4, 0xa4, - 0xe9, 0x0a, 0x6f, 0x14, 0xf9, 0x06, 0x80, 0xdd, 0x18, 0x57, 0x15, 0x14, 0x6b, 0x14, 0xe8, 0x13, - 0x80, 0xf4, 0xa4, 0x4e, 0x46, 0x48, 0xcd, 0x67, 0xef, 0xed, 0x97, 0xd1, 0x5a, 0x0a, 0x7b, 0xb0, - 0x5f, 0x9e, 0xa2, 0xd0, 0x15, 0x8f, 0xde, 0x3c, 0xe3, 0x38, 0x64, 0x19, 0x8c, 0xd0, 0x2d, 0x98, - 0xa0, 0x50, 0xb6, 0xa2, 0x64, 0xbc, 0x4e, 0x7e, 0x5b, 0x7c, 0xfa, 0xde, 0x7e, 0x79, 0x62, 0x2d, - 0x81, 0xcb, 0x63, 0x9d, 0x62, 0x82, 0x5e, 0x86, 0xb1, 0x78, 0x5e, 0x5d, 0x25, 0x7b, 0x3c, 0x3e, - 0x4e, 0x89, 0x2b, 0xbc, 0x57, 0x0d, 0x0c, 0x4e, 0x50, 0xda, 0x9f, 0xb7, 0xe0, 0x74, 0x6e, 0xe2, - 0x71, 0x74, 0x01, 0x86, 0x9c, 0x96, 0xcb, 0xcd, 0x17, 0xe2, 0xa8, 0x61, 0x6a, 0xb2, 0xca, 0x0a, - 0x37, 0x5e, 0x28, 0x2c, 0xdd, 0xe1, 0x77, 0x5c, 0xaf, 0x9e, 0xdc, 0xe1, 0xaf, 0xba, 0x5e, 0x1d, - 0x33, 0x8c, 0x3a, 0xb2, 0x8a, 0xb9, 0x4f, 0x11, 0xbe, 0x42, 0xd7, 0x6a, 0x46, 0x8a, 0xf2, 0xe3, - 0x6d, 0x06, 0x7a, 0x5a, 0x37, 0x35, 0x0a, 0xaf, 0xc2, 0x5c, 0x33, 0xe3, 0xf7, 0x5b, 0x20, 0x9e, - 0x2e, 0xf7, 0x70, 0x26, 0xbf, 0x01, 0x23, 0xbb, 0xe9, 0x84, 0x77, 0xe7, 0xf2, 0xdf, 0x72, 0x8b, - 0x40, 0xe1, 0x4a, 0xd0, 0x36, 0x92, 0xdb, 0x19, 0xbc, 0xec, 0x3a, 0x08, 0xec, 0x22, 0x61, 0x06, - 0x85, 0xee, 0xad, 0x79, 0x0e, 0xa0, 0xce, 0x68, 0x59, 0x16, 0xdc, 0x82, 0x29, 0x71, 0x2d, 0x2a, - 0x0c, 0xd6, 0xa8, 0xec, 0x7f, 0x55, 0x80, 0x61, 0x99, 0x60, 0xad, 0xed, 0xf5, 0xa2, 0xf6, 0x3b, - 0x54, 0xc6, 0x65, 0x74, 0x11, 0x4a, 0x4c, 0x2f, 0x5d, 0x89, 0xb5, 0xa5, 0x4a, 0x2b, 0xb4, 0x2a, - 0x11, 0x38, 0xa6, 0xa1, 0xbb, 0x63, 0xd8, 0xde, 0x60, 0xe4, 0x89, 0x87, 0xb6, 0x55, 0x0e, 0xc6, - 0x12, 0x8f, 0x3e, 0x0a, 0x13, 0xbc, 0x5c, 0xe0, 0xb7, 0x9c, 0x2d, 0x6e, 0xcb, 0xea, 0x57, 0xd1, - 0x4b, 0x26, 0x56, 0x13, 0xb8, 0x83, 0xfd, 0xf2, 0x89, 0x24, 0x8c, 0x19, 0x69, 0x53, 0x5c, 0x98, - 0xcb, 0x1a, 0xaf, 0x84, 0xee, 0xea, 0x29, 0x4f, 0xb7, 0x18, 0x85, 0x75, 0x3a, 0xfb, 0x53, 0x80, - 0xd2, 0xa9, 0xe6, 0xd0, 0x6b, 0xdc, 0xe5, 0xd9, 0x0d, 0x48, 0xbd, 0x93, 0xd1, 0x56, 0x8f, 0xd1, - 0x21, 0xdf, 0xc8, 0xf1, 0x52, 0x58, 0x95, 0xb7, 0xff, 0x52, 0x11, 0x26, 0x92, 0x51, 0x01, 0xd0, - 0x15, 0x18, 0xe0, 0x22, 0xa5, 0x60, 0xdf, 0xc1, 0x27, 0x48, 0x8b, 0x25, 0xc0, 0x0e, 0x57, 0x21, - 0x95, 0x8a, 0xf2, 0xe8, 0x4d, 0x18, 0xae, 0xfb, 0xb7, 0xbd, 0xdb, 0x4e, 0x50, 0x9f, 0xab, 0xac, - 0x88, 0xe9, 0x9c, 0xa9, 0xa8, 0x58, 0x8c, 0xc9, 0xf4, 0xf8, 0x04, 0xcc, 0xfe, 0x1d, 0xa3, 0xb0, - 0xce, 0x0e, 0xad, 0xb3, 0xfc, 0x14, 0x9b, 0xee, 0xd6, 0xaa, 0xd3, 0xea, 0xf4, 0xfe, 0x65, 0x41, - 0x12, 0x69, 0x9c, 0x47, 0x45, 0x12, 0x0b, 0x8e, 0xc0, 0x31, 0x23, 0xf4, 0x19, 0x98, 0x0a, 0x73, - 0x4c, 0x27, 0x79, 0x99, 0x47, 0x3b, 0x59, 0x13, 0xe6, 0x1f, 0xba, 0xb7, 0x5f, 0x9e, 0xca, 0x32, - 0xb2, 0x64, 0x55, 0x63, 0x7f, 0xf1, 0x04, 0x18, 0x8b, 0xd8, 0x48, 0x44, 0x6d, 0x1d, 0x51, 0x22, - 0x6a, 0x0c, 0x43, 0xa4, 0xd9, 0x8a, 0xf6, 0x16, 0xdd, 0x40, 0x8c, 0x49, 0x26, 0xcf, 0x25, 0x41, - 0x93, 0xe6, 0x29, 0x31, 0x58, 0xf1, 0xc9, 0xce, 0x16, 0x5e, 0xfc, 0x16, 0x66, 0x0b, 0xef, 0x3b, - 0xc6, 0x6c, 0xe1, 0x6b, 0x30, 0xb8, 0xe5, 0x46, 0x98, 0xb4, 0x7c, 0x71, 0x99, 0xcb, 0x9c, 0x87, - 0x97, 0x39, 0x49, 0x3a, 0x2f, 0xad, 0x40, 0x60, 0xc9, 0x04, 0xbd, 0xa6, 0x56, 0xe0, 0x40, 0xbe, - 0xc2, 0x25, 0xed, 0xbc, 0x92, 0xb9, 0x06, 0x45, 0x4e, 0xf0, 0xc1, 0xfb, 0xcd, 0x09, 0xbe, 0x2c, - 0x33, 0x79, 0x0f, 0xe5, 0x3f, 0x56, 0x63, 0x89, 0xba, 0xbb, 0xe4, 0xef, 0xbe, 0xa9, 0x67, 0x3f, - 0x2f, 0xe5, 0xef, 0x04, 0x2a, 0xb1, 0x79, 0x8f, 0x39, 0xcf, 0xbf, 0xdf, 0x82, 0x93, 0xc9, 0xec, - 0xa4, 0xec, 0x4d, 0x85, 0xf0, 0xf3, 0x78, 0xb1, 0x97, 0x74, 0xb1, 0xac, 0x80, 0x51, 0x21, 0xd3, - 0x91, 0x66, 0x92, 0xe1, 0xec, 0xea, 0x68, 0x47, 0x07, 0x1b, 0x75, 0xe1, 0x6f, 0xf0, 0x58, 0x4e, - 0xf2, 0xf4, 0x0e, 0x29, 0xd3, 0xd7, 0x33, 0x12, 0x75, 0x3f, 0x9e, 0x97, 0xa8, 0xbb, 0xe7, 0xf4, - 0xdc, 0xaf, 0xa9, 0xb4, 0xe9, 0xa3, 0xf9, 0x53, 0x89, 0x27, 0x45, 0xef, 0x9a, 0x2c, 0xfd, 0x35, - 0x95, 0x2c, 0xbd, 0x43, 0x44, 0x6e, 0x9e, 0x0a, 0xbd, 0x6b, 0x8a, 0x74, 0x2d, 0xcd, 0xf9, 0xf8, - 0xd1, 0xa4, 0x39, 0x37, 0x8e, 0x1a, 0x9e, 0x69, 0xfb, 0xe9, 0x2e, 0x47, 0x8d, 0xc1, 0xb7, 0xf3, - 0x61, 0xc3, 0x53, 0xba, 0x4f, 0xde, 0x57, 0x4a, 0xf7, 0x9b, 0x7a, 0x8a, 0x74, 0xd4, 0x25, 0x07, - 0x38, 0x25, 0xea, 0x31, 0x31, 0xfa, 0x4d, 0xfd, 0x00, 0x9c, 0xca, 0xe7, 0xab, 0xce, 0xb9, 0x34, - 0xdf, 0xcc, 0x23, 0x30, 0x95, 0x70, 0xfd, 0xc4, 0xf1, 0x24, 0x5c, 0x3f, 0x79, 0xe4, 0x09, 0xd7, - 0x4f, 0x1d, 0x43, 0xc2, 0xf5, 0x87, 0x8e, 0x31, 0xe1, 0xfa, 0x4d, 0xe6, 0x1c, 0xc5, 0x03, 0x40, - 0x89, 0x08, 0xe2, 0x4f, 0xe5, 0xc4, 0x4f, 0x4b, 0x47, 0x89, 0xe2, 0x1f, 0xa7, 0x50, 0x38, 0x66, - 0x95, 0x91, 0xc8, 0x7d, 0xfa, 0x01, 0x24, 0x72, 0x5f, 0x8b, 0x13, 0xb9, 0x9f, 0xce, 0x1f, 0xea, - 0x8c, 0xe7, 0x34, 0x39, 0xe9, 0xdb, 0x6f, 0xea, 0x69, 0xd7, 0x1f, 0xee, 0x60, 0x05, 0xcb, 0x52, - 0x28, 0x77, 0x48, 0xb6, 0xfe, 0x2a, 0x4f, 0xb6, 0xfe, 0x48, 0xfe, 0x4e, 0x9e, 0x3c, 0xee, 0x8c, - 0x14, 0xeb, 0xb4, 0x5d, 0x2a, 0xf6, 0x2a, 0x8b, 0x95, 0x9e, 0xd3, 0x2e, 0x15, 0xbc, 0x35, 0xdd, - 0x2e, 0x85, 0xc2, 0x31, 0x2b, 0xfb, 0x07, 0x0b, 0x70, 0xb6, 0xf3, 0x7a, 0x8b, 0xb5, 0xe4, 0x95, - 0xd8, 0x21, 0x20, 0xa1, 0x25, 0xe7, 0x77, 0xb6, 0x98, 0xaa, 0xe7, 0x78, 0x90, 0x97, 0x61, 0x52, - 0xbd, 0xc3, 0x69, 0xb8, 0xb5, 0xbd, 0xb5, 0xf8, 0x9a, 0xac, 0x22, 0x27, 0x54, 0x93, 0x04, 0x38, - 0x5d, 0x06, 0xcd, 0xc1, 0xb8, 0x01, 0x5c, 0x59, 0x14, 0x77, 0xb3, 0x38, 0x3a, 0xb7, 0x89, 0xc6, - 0x49, 0x7a, 0xfb, 0x4b, 0x16, 0x3c, 0x94, 0x93, 0xa9, 0xb4, 0xe7, 0x70, 0x87, 0x9b, 0x30, 0xde, - 0x32, 0x8b, 0x76, 0x89, 0xd0, 0x6a, 0xe4, 0x43, 0x55, 0x6d, 0x4d, 0x20, 0x70, 0x92, 0xa9, 0xfd, - 0xb3, 0x05, 0x38, 0xd3, 0xd1, 0xb1, 0x14, 0x61, 0x38, 0xb5, 0xd5, 0x0c, 0x9d, 0x85, 0x80, 0xd4, - 0x89, 0x17, 0xb9, 0x4e, 0xa3, 0xda, 0x22, 0x35, 0xcd, 0xce, 0xc1, 0x3c, 0x34, 0x2f, 0xaf, 0x56, - 0xe7, 0xd2, 0x14, 0x38, 0xa7, 0x24, 0x5a, 0x06, 0x94, 0xc6, 0x88, 0x11, 0x66, 0x51, 0xf7, 0xd3, - 0xfc, 0x70, 0x46, 0x09, 0xf4, 0x01, 0x18, 0x55, 0x0e, 0xab, 0xda, 0x88, 0xb3, 0x8d, 0x1d, 0xeb, - 0x08, 0x6c, 0xd2, 0xa1, 0x4b, 0x3c, 0x6d, 0x83, 0x48, 0xf0, 0x21, 0x8c, 0x22, 0xe3, 0x32, 0x27, - 0x83, 0x00, 0x63, 0x9d, 0x66, 0xfe, 0xa5, 0xdf, 0xfc, 0xc6, 0xd9, 0xf7, 0xfc, 0xf6, 0x37, 0xce, - 0xbe, 0xe7, 0xf7, 0xbe, 0x71, 0xf6, 0x3d, 0xdf, 0x7d, 0xef, 0xac, 0xf5, 0x9b, 0xf7, 0xce, 0x5a, - 0xbf, 0x7d, 0xef, 0xac, 0xf5, 0x7b, 0xf7, 0xce, 0x5a, 0x7f, 0x70, 0xef, 0xac, 0xf5, 0x85, 0x3f, - 0x3c, 0xfb, 0x9e, 0x37, 0x50, 0x1c, 0x40, 0xf4, 0x22, 0x1d, 0x9d, 0x8b, 0xbb, 0x97, 0xfe, 0x5f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x6c, 0x51, 0x7f, 0x2c, 0x10, 0x01, 0x00, + // 14822 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x70, 0x24, 0xc9, + 0x75, 0x18, 0xcc, 0xea, 0xc6, 0xd5, 0x0f, 0x77, 0x62, 0x0e, 0x0c, 0x76, 0x66, 0x7a, 0xb6, 0x76, + 0x77, 0x76, 0xf6, 0xc2, 0x70, 0xf6, 0x20, 0x97, 0xbb, 0xe4, 0x8a, 0x38, 0x67, 0xb0, 0x03, 0x60, + 0x7a, 0xb3, 0x31, 0x33, 0xe4, 0x72, 0xc9, 0x60, 0xa1, 0x3b, 0x01, 0x14, 0xd1, 0xa8, 0xea, 0xad, + 0xaa, 0xc6, 0x0c, 0xe6, 0x23, 0x43, 0x12, 0xf5, 0xe9, 0xa0, 0xa4, 0xef, 0x0b, 0xc6, 0x17, 0xfa, + 0x8e, 0xa0, 0x14, 0x8a, 0x2f, 0x24, 0x59, 0x87, 0x69, 0xd9, 0xa6, 0x29, 0x4b, 0xb2, 0xa8, 0xcb, + 0x57, 0x58, 0x72, 0x38, 0x64, 0x59, 0x11, 0x16, 0x15, 0xa1, 0x30, 0x24, 0x8e, 0x1c, 0x21, 0x2b, + 0xc2, 0x96, 0xe4, 0xe3, 0x87, 0x0d, 0xcb, 0x96, 0x23, 0xcf, 0xca, 0xac, 0xa3, 0xbb, 0x31, 0x8b, + 0x01, 0x97, 0x8c, 0xfd, 0xd7, 0xfd, 0xde, 0xcb, 0x97, 0x59, 0x79, 0xbe, 0x7c, 0xef, 0xe5, 0x7b, + 0xf0, 0xea, 0xf6, 0xcb, 0xe1, 0xb4, 0xeb, 0x5f, 0xde, 0x6e, 0xad, 0x93, 0xc0, 0x23, 0x11, 0x09, + 0x2f, 0xef, 0x12, 0xaf, 0xee, 0x07, 0x97, 0x05, 0xc2, 0x69, 0xba, 0x97, 0x6b, 0x7e, 0x40, 0x2e, + 0xef, 0x5e, 0xb9, 0xbc, 0x49, 0x3c, 0x12, 0x38, 0x11, 0xa9, 0x4f, 0x37, 0x03, 0x3f, 0xf2, 0x11, + 0xe2, 0x34, 0xd3, 0x4e, 0xd3, 0x9d, 0xa6, 0x34, 0xd3, 0xbb, 0x57, 0xa6, 0x9e, 0xdb, 0x74, 0xa3, + 0xad, 0xd6, 0xfa, 0x74, 0xcd, 0xdf, 0xb9, 0xbc, 0xe9, 0x6f, 0xfa, 0x97, 0x19, 0xe9, 0x7a, 0x6b, + 0x83, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0xce, 0x62, 0xea, 0xc5, 0xb8, 0x9a, 0x1d, 0xa7, 0xb6, 0xe5, + 0x7a, 0x24, 0xd8, 0xbb, 0xdc, 0xdc, 0xde, 0x64, 0xf5, 0x06, 0x24, 0xf4, 0x5b, 0x41, 0x8d, 0x24, + 0x2b, 0x6e, 0x5b, 0x2a, 0xbc, 0xbc, 0x43, 0x22, 0x27, 0xa3, 0xb9, 0x53, 0x97, 0xf3, 0x4a, 0x05, + 0x2d, 0x2f, 0x72, 0x77, 0xd2, 0xd5, 0x7c, 0xa0, 0x53, 0x81, 0xb0, 0xb6, 0x45, 0x76, 0x9c, 0x54, + 0xb9, 0x17, 0xf2, 0xca, 0xb5, 0x22, 0xb7, 0x71, 0xd9, 0xf5, 0xa2, 0x30, 0x0a, 0x92, 0x85, 0xec, + 0xaf, 0x5b, 0x70, 0x61, 0xe6, 0x76, 0x75, 0xa1, 0xe1, 0x84, 0x91, 0x5b, 0x9b, 0x6d, 0xf8, 0xb5, + 0xed, 0x6a, 0xe4, 0x07, 0xe4, 0x96, 0xdf, 0x68, 0xed, 0x90, 0x2a, 0xeb, 0x08, 0xf4, 0x2c, 0x0c, + 0xec, 0xb2, 0xff, 0x4b, 0xf3, 0x93, 0xd6, 0x05, 0xeb, 0x52, 0x69, 0x76, 0xec, 0xb7, 0xf6, 0xcb, + 0xef, 0xbb, 0xbf, 0x5f, 0x1e, 0xb8, 0x25, 0xe0, 0x58, 0x51, 0xa0, 0x8b, 0xd0, 0xb7, 0x11, 0xae, + 0xed, 0x35, 0xc9, 0x64, 0x81, 0xd1, 0x8e, 0x08, 0xda, 0xbe, 0xc5, 0x2a, 0x85, 0x62, 0x81, 0x45, + 0x97, 0xa1, 0xd4, 0x74, 0x82, 0xc8, 0x8d, 0x5c, 0xdf, 0x9b, 0x2c, 0x5e, 0xb0, 0x2e, 0xf5, 0xce, + 0x8e, 0x0b, 0xd2, 0x52, 0x45, 0x22, 0x70, 0x4c, 0x43, 0x9b, 0x11, 0x10, 0xa7, 0x7e, 0xc3, 0x6b, + 0xec, 0x4d, 0xf6, 0x5c, 0xb0, 0x2e, 0x0d, 0xc4, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0xa5, + 0x02, 0x0c, 0xcc, 0x6c, 0x6c, 0xb8, 0x9e, 0x1b, 0xed, 0xa1, 0x5b, 0x30, 0xe4, 0xf9, 0x75, 0x22, + 0xff, 0xb3, 0xaf, 0x18, 0x7c, 0xfe, 0xc2, 0x74, 0x7a, 0x2a, 0x4d, 0xaf, 0x6a, 0x74, 0xb3, 0x63, + 0xf7, 0xf7, 0xcb, 0x43, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xc1, 0xa6, 0x5f, 0x57, 0x6c, 0x0b, + 0x8c, 0x6d, 0x39, 0x8b, 0x6d, 0x25, 0x26, 0x9b, 0x1d, 0xbd, 0xbf, 0x5f, 0x1e, 0xd4, 0x00, 0x58, + 0x67, 0x82, 0xd6, 0x61, 0x94, 0xfe, 0xf5, 0x22, 0x57, 0xf1, 0x2d, 0x32, 0xbe, 0x8f, 0xe5, 0xf1, + 0xd5, 0x48, 0x67, 0x27, 0xee, 0xef, 0x97, 0x47, 0x13, 0x40, 0x9c, 0x64, 0x68, 0xdf, 0x83, 0x91, + 0x99, 0x28, 0x72, 0x6a, 0x5b, 0xa4, 0xce, 0x47, 0x10, 0xbd, 0x08, 0x3d, 0x9e, 0xb3, 0x43, 0xc4, + 0xf8, 0x5e, 0x10, 0x1d, 0xdb, 0xb3, 0xea, 0xec, 0x90, 0x83, 0xfd, 0xf2, 0xd8, 0x4d, 0xcf, 0x7d, + 0xbb, 0x25, 0x66, 0x05, 0x85, 0x61, 0x46, 0x8d, 0x9e, 0x07, 0xa8, 0x93, 0x5d, 0xb7, 0x46, 0x2a, + 0x4e, 0xb4, 0x25, 0xc6, 0x1b, 0x89, 0xb2, 0x30, 0xaf, 0x30, 0x58, 0xa3, 0xb2, 0xef, 0x42, 0x69, + 0x66, 0xd7, 0x77, 0xeb, 0x15, 0xbf, 0x1e, 0xa2, 0x6d, 0x18, 0x6d, 0x06, 0x64, 0x83, 0x04, 0x0a, + 0x34, 0x69, 0x5d, 0x28, 0x5e, 0x1a, 0x7c, 0xfe, 0x52, 0xe6, 0xc7, 0x9a, 0xa4, 0x0b, 0x5e, 0x14, + 0xec, 0xcd, 0x9e, 0x16, 0xf5, 0x8d, 0x26, 0xb0, 0x38, 0xc9, 0xd9, 0xfe, 0x27, 0x05, 0x38, 0x39, + 0x73, 0xaf, 0x15, 0x90, 0x79, 0x37, 0xdc, 0x4e, 0xce, 0xf0, 0xba, 0x1b, 0x6e, 0xaf, 0xc6, 0x3d, + 0xa0, 0xa6, 0xd6, 0xbc, 0x80, 0x63, 0x45, 0x81, 0x9e, 0x83, 0x7e, 0xfa, 0xfb, 0x26, 0x5e, 0x12, + 0x9f, 0x3c, 0x21, 0x88, 0x07, 0xe7, 0x9d, 0xc8, 0x99, 0xe7, 0x28, 0x2c, 0x69, 0xd0, 0x0a, 0x0c, + 0xd6, 0xd8, 0x82, 0xdc, 0x5c, 0xf1, 0xeb, 0x84, 0x0d, 0x66, 0x69, 0xf6, 0x19, 0x4a, 0x3e, 0x17, + 0x83, 0x0f, 0xf6, 0xcb, 0x93, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0xf5, + 0xd5, 0xc3, 0x38, 0x41, 0xc6, 0xda, 0xba, 0xa4, 0x2d, 0x95, 0x5e, 0xb6, 0x54, 0x86, 0xb2, 0x97, + 0x09, 0xba, 0x02, 0x3d, 0xdb, 0xae, 0x57, 0x9f, 0xec, 0x63, 0xbc, 0xce, 0xd1, 0x31, 0xbf, 0xee, + 0x7a, 0xf5, 0x83, 0xfd, 0xf2, 0xb8, 0xd1, 0x1c, 0x0a, 0xc4, 0x8c, 0xd4, 0xfe, 0xcf, 0x16, 0x94, + 0x19, 0x6e, 0xd1, 0x6d, 0x90, 0x0a, 0x09, 0x42, 0x37, 0x8c, 0x88, 0x17, 0x19, 0x1d, 0xfa, 0x3c, + 0x40, 0x48, 0x6a, 0x01, 0x89, 0xb4, 0x2e, 0x55, 0x13, 0xa3, 0xaa, 0x30, 0x58, 0xa3, 0xa2, 0x1b, + 0x42, 0xb8, 0xe5, 0x04, 0x6c, 0x7e, 0x89, 0x8e, 0x55, 0x1b, 0x42, 0x55, 0x22, 0x70, 0x4c, 0x63, + 0x6c, 0x08, 0xc5, 0x4e, 0x1b, 0x02, 0xfa, 0x08, 0x8c, 0xc6, 0x95, 0x85, 0x4d, 0xa7, 0x26, 0x3b, + 0x90, 0x2d, 0x99, 0xaa, 0x89, 0xc2, 0x49, 0x5a, 0xfb, 0x6f, 0x5a, 0x62, 0xf2, 0xd0, 0xaf, 0x7e, + 0x97, 0x7f, 0xab, 0xfd, 0xcb, 0x16, 0xf4, 0xcf, 0xba, 0x5e, 0xdd, 0xf5, 0x36, 0xd1, 0xa7, 0x61, + 0x80, 0x9e, 0x4d, 0x75, 0x27, 0x72, 0xc4, 0xbe, 0xf7, 0x7e, 0x6d, 0x6d, 0xa9, 0xa3, 0x62, 0xba, + 0xb9, 0xbd, 0x49, 0x01, 0xe1, 0x34, 0xa5, 0xa6, 0xab, 0xed, 0xc6, 0xfa, 0x67, 0x48, 0x2d, 0x5a, + 0x21, 0x91, 0x13, 0x7f, 0x4e, 0x0c, 0xc3, 0x8a, 0x2b, 0xba, 0x0e, 0x7d, 0x91, 0x13, 0x6c, 0x92, + 0x48, 0x6c, 0x80, 0x99, 0x1b, 0x15, 0x2f, 0x89, 0xe9, 0x8a, 0x24, 0x5e, 0x8d, 0xc4, 0xc7, 0xc2, + 0x1a, 0x2b, 0x8a, 0x05, 0x0b, 0xfb, 0x7f, 0xf4, 0xc3, 0x99, 0xb9, 0xea, 0x52, 0xce, 0xbc, 0xba, + 0x08, 0x7d, 0xf5, 0xc0, 0xdd, 0x25, 0x81, 0xe8, 0x67, 0xc5, 0x65, 0x9e, 0x41, 0xb1, 0xc0, 0xa2, + 0x97, 0x61, 0x88, 0x1f, 0x48, 0xd7, 0x1c, 0xaf, 0xde, 0x90, 0x5d, 0x7c, 0x42, 0x50, 0x0f, 0xdd, + 0xd2, 0x70, 0xd8, 0xa0, 0x3c, 0xe4, 0xa4, 0xba, 0x98, 0x58, 0x8c, 0x79, 0x87, 0xdd, 0x17, 0x2c, + 0x18, 0xe3, 0xd5, 0xcc, 0x44, 0x51, 0xe0, 0xae, 0xb7, 0x22, 0x12, 0x4e, 0xf6, 0xb2, 0x9d, 0x6e, + 0x2e, 0xab, 0xb7, 0x72, 0x7b, 0x60, 0xfa, 0x56, 0x82, 0x0b, 0xdf, 0x04, 0x27, 0x45, 0xbd, 0x63, + 0x49, 0x34, 0x4e, 0x55, 0x8b, 0xbe, 0xc7, 0x82, 0xa9, 0x9a, 0xef, 0x45, 0x81, 0xdf, 0x68, 0x90, + 0xa0, 0xd2, 0x5a, 0x6f, 0xb8, 0xe1, 0x16, 0x9f, 0xa7, 0x98, 0x6c, 0xb0, 0x9d, 0x20, 0x67, 0x0c, + 0x15, 0x91, 0x18, 0xc3, 0xf3, 0xf7, 0xf7, 0xcb, 0x53, 0x73, 0xb9, 0xac, 0x70, 0x9b, 0x6a, 0xd0, + 0x36, 0x20, 0x7a, 0x94, 0x56, 0x23, 0x67, 0x93, 0xc4, 0x95, 0xf7, 0x77, 0x5f, 0xf9, 0xa9, 0xfb, + 0xfb, 0x65, 0xb4, 0x9a, 0x62, 0x81, 0x33, 0xd8, 0xa2, 0xb7, 0xe1, 0x04, 0x85, 0xa6, 0xbe, 0x75, + 0xa0, 0xfb, 0xea, 0x26, 0xef, 0xef, 0x97, 0x4f, 0xac, 0x66, 0x30, 0xc1, 0x99, 0xac, 0xd1, 0x77, + 0x59, 0x70, 0x26, 0xfe, 0xfc, 0x85, 0xbb, 0x4d, 0xc7, 0xab, 0xc7, 0x15, 0x97, 0xba, 0xaf, 0x98, + 0xee, 0xc9, 0x67, 0xe6, 0xf2, 0x38, 0xe1, 0xfc, 0x4a, 0x90, 0x07, 0x13, 0xb4, 0x69, 0xc9, 0xba, + 0xa1, 0xfb, 0xba, 0x4f, 0xdf, 0xdf, 0x2f, 0x4f, 0xac, 0xa6, 0x79, 0xe0, 0x2c, 0xc6, 0x53, 0x73, + 0x70, 0x32, 0x73, 0x76, 0xa2, 0x31, 0x28, 0x6e, 0x13, 0x2e, 0x75, 0x95, 0x30, 0xfd, 0x89, 0x4e, + 0x40, 0xef, 0xae, 0xd3, 0x68, 0x89, 0x85, 0x89, 0xf9, 0x9f, 0x57, 0x0a, 0x2f, 0x5b, 0xf6, 0x3f, + 0x2d, 0xc2, 0xe8, 0x5c, 0x75, 0xe9, 0x81, 0x56, 0xbd, 0x7e, 0xec, 0x15, 0xda, 0x1e, 0x7b, 0xf1, + 0x21, 0x5a, 0xcc, 0x3d, 0x44, 0xbf, 0x33, 0x63, 0xc9, 0xf6, 0xb0, 0x25, 0xfb, 0xa1, 0x9c, 0x25, + 0x7b, 0xc4, 0x0b, 0x75, 0x37, 0x67, 0xd6, 0xf6, 0xb2, 0x01, 0xcc, 0x94, 0x90, 0x96, 0xfd, 0x9a, + 0xd3, 0x48, 0x6e, 0xb5, 0x87, 0x9c, 0xba, 0x47, 0x33, 0x8e, 0x35, 0x18, 0x9a, 0x73, 0x9a, 0xce, + 0xba, 0xdb, 0x70, 0x23, 0x97, 0x84, 0xe8, 0x49, 0x28, 0x3a, 0xf5, 0x3a, 0x93, 0xee, 0x4a, 0xb3, + 0x27, 0xef, 0xef, 0x97, 0x8b, 0x33, 0x75, 0x2a, 0x66, 0x80, 0xa2, 0xda, 0xc3, 0x94, 0x02, 0x3d, + 0x0d, 0x3d, 0xf5, 0xc0, 0x6f, 0x4e, 0x16, 0x18, 0x25, 0x5d, 0xe5, 0x3d, 0xf3, 0x81, 0xdf, 0x4c, + 0x90, 0x32, 0x1a, 0xfb, 0x37, 0x0b, 0x70, 0x76, 0x8e, 0x34, 0xb7, 0x16, 0xab, 0x39, 0xe7, 0xc5, + 0x25, 0x18, 0xd8, 0xf1, 0x3d, 0x37, 0xf2, 0x83, 0x50, 0x54, 0xcd, 0x66, 0xc4, 0x8a, 0x80, 0x61, + 0x85, 0x45, 0x17, 0xa0, 0xa7, 0x19, 0x0b, 0xb1, 0x43, 0x52, 0x00, 0x66, 0xe2, 0x2b, 0xc3, 0x50, + 0x8a, 0x56, 0x48, 0x02, 0x31, 0x63, 0x14, 0xc5, 0xcd, 0x90, 0x04, 0x98, 0x61, 0x62, 0x49, 0x80, + 0xca, 0x08, 0xe2, 0x44, 0x48, 0x48, 0x02, 0x14, 0x83, 0x35, 0x2a, 0x54, 0x81, 0x52, 0x98, 0x18, + 0xd9, 0xae, 0x96, 0xe6, 0x30, 0x13, 0x15, 0xd4, 0x48, 0xc6, 0x4c, 0x8c, 0x13, 0xac, 0xaf, 0xa3, + 0xa8, 0xf0, 0xb5, 0x02, 0x20, 0xde, 0x85, 0xdf, 0x62, 0x1d, 0x77, 0x33, 0xdd, 0x71, 0xdd, 0x2f, + 0x89, 0xa3, 0xea, 0xbd, 0xff, 0x62, 0xc1, 0xd9, 0x39, 0xd7, 0xab, 0x93, 0x20, 0x67, 0x02, 0x3e, + 0x9c, 0xbb, 0xf3, 0xe1, 0x84, 0x14, 0x63, 0x8a, 0xf5, 0x1c, 0xc1, 0x14, 0xb3, 0xff, 0xc2, 0x02, + 0xc4, 0x3f, 0xfb, 0x5d, 0xf7, 0xb1, 0x37, 0xd3, 0x1f, 0x7b, 0x04, 0xd3, 0xc2, 0xfe, 0x3b, 0x16, + 0x0c, 0xce, 0x35, 0x1c, 0x77, 0x47, 0x7c, 0xea, 0x1c, 0x8c, 0x4b, 0x45, 0x11, 0x03, 0x6b, 0xb2, + 0x3f, 0xdd, 0xdc, 0xc6, 0x71, 0x12, 0x89, 0xd3, 0xf4, 0xe8, 0x13, 0x70, 0xc6, 0x00, 0xae, 0x91, + 0x9d, 0x66, 0xc3, 0x89, 0xf4, 0x5b, 0x01, 0x3b, 0xfd, 0x71, 0x1e, 0x11, 0xce, 0x2f, 0x6f, 0x2f, + 0xc3, 0xc8, 0x5c, 0xc3, 0x25, 0x5e, 0xb4, 0x54, 0x99, 0xf3, 0xbd, 0x0d, 0x77, 0x13, 0xbd, 0x02, + 0x23, 0x91, 0xbb, 0x43, 0xfc, 0x56, 0x54, 0x25, 0x35, 0xdf, 0x63, 0x77, 0x6d, 0xeb, 0x52, 0xef, + 0x2c, 0xba, 0xbf, 0x5f, 0x1e, 0x59, 0x33, 0x30, 0x38, 0x41, 0x69, 0xff, 0x21, 0x1d, 0x71, 0x7f, + 0xa7, 0xe9, 0x7b, 0xc4, 0x8b, 0xe6, 0x7c, 0xaf, 0xce, 0x75, 0x32, 0xaf, 0x40, 0x4f, 0x44, 0x47, + 0x90, 0x7f, 0xf9, 0x45, 0xb9, 0xb4, 0xe9, 0xb8, 0x1d, 0xec, 0x97, 0x4f, 0xa5, 0x4b, 0xb0, 0x91, + 0x65, 0x65, 0xd0, 0x87, 0xa0, 0x2f, 0x8c, 0x9c, 0xa8, 0x15, 0x8a, 0x4f, 0x7d, 0x54, 0x8e, 0x7f, + 0x95, 0x41, 0x0f, 0xf6, 0xcb, 0xa3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x05, 0xfd, 0x3b, + 0x24, 0x0c, 0x9d, 0x4d, 0x79, 0x7e, 0x8f, 0x8a, 0xb2, 0xfd, 0x2b, 0x1c, 0x8c, 0x25, 0x1e, 0x3d, + 0x06, 0xbd, 0x24, 0x08, 0xfc, 0x40, 0xec, 0x2a, 0xc3, 0x82, 0xb0, 0x77, 0x81, 0x02, 0x31, 0xc7, + 0xd9, 0xff, 0xd2, 0x82, 0x51, 0xd5, 0x56, 0x5e, 0xd7, 0x31, 0xdc, 0x9b, 0xde, 0x04, 0xa8, 0xc9, + 0x0f, 0x0c, 0xd9, 0x79, 0x37, 0xf8, 0xfc, 0xc5, 0x4c, 0xd1, 0x22, 0xd5, 0x8d, 0x31, 0x67, 0x05, + 0x0a, 0xb1, 0xc6, 0xcd, 0xfe, 0x35, 0x0b, 0x26, 0x12, 0x5f, 0xb4, 0xec, 0x86, 0x11, 0x7a, 0x2b, + 0xf5, 0x55, 0xd3, 0xdd, 0x7d, 0x15, 0x2d, 0xcd, 0xbe, 0x49, 0x2d, 0x3e, 0x09, 0xd1, 0xbe, 0xe8, + 0x1a, 0xf4, 0xba, 0x11, 0xd9, 0x91, 0x1f, 0xf3, 0x58, 0xdb, 0x8f, 0xe1, 0xad, 0x8a, 0x47, 0x64, + 0x89, 0x96, 0xc4, 0x9c, 0x81, 0xfd, 0x9b, 0x45, 0x28, 0xf1, 0x69, 0xbb, 0xe2, 0x34, 0x8f, 0x61, + 0x2c, 0x9e, 0x81, 0x92, 0xbb, 0xb3, 0xd3, 0x8a, 0x9c, 0x75, 0x71, 0x00, 0x0d, 0xf0, 0xcd, 0x60, + 0x49, 0x02, 0x71, 0x8c, 0x47, 0x4b, 0xd0, 0xc3, 0x9a, 0xc2, 0xbf, 0xf2, 0xc9, 0xec, 0xaf, 0x14, + 0x6d, 0x9f, 0x9e, 0x77, 0x22, 0x87, 0xcb, 0x7e, 0xea, 0xe4, 0xa3, 0x20, 0xcc, 0x58, 0x20, 0x07, + 0x60, 0xdd, 0xf5, 0x9c, 0x60, 0x8f, 0xc2, 0x26, 0x8b, 0x8c, 0xe1, 0x73, 0xed, 0x19, 0xce, 0x2a, + 0x7a, 0xce, 0x56, 0x7d, 0x58, 0x8c, 0xc0, 0x1a, 0xd3, 0xa9, 0x0f, 0x42, 0x49, 0x11, 0x1f, 0x46, + 0x84, 0x9b, 0xfa, 0x08, 0x8c, 0x26, 0xea, 0xea, 0x54, 0x7c, 0x48, 0x97, 0x00, 0x7f, 0x85, 0x6d, + 0x19, 0xa2, 0xd5, 0x0b, 0xde, 0xae, 0xd8, 0x39, 0xef, 0xc1, 0x89, 0x46, 0xc6, 0xde, 0x2b, 0xc6, + 0xb5, 0xfb, 0xbd, 0xfa, 0xac, 0xf8, 0xec, 0x13, 0x59, 0x58, 0x9c, 0x59, 0x07, 0x95, 0x6a, 0xfc, + 0x26, 0x5d, 0x20, 0x4e, 0x43, 0xbf, 0x20, 0xdc, 0x10, 0x30, 0xac, 0xb0, 0x74, 0xbf, 0x3b, 0xa1, + 0x1a, 0x7f, 0x9d, 0xec, 0x55, 0x49, 0x83, 0xd4, 0x22, 0x3f, 0xf8, 0xa6, 0x36, 0xff, 0x1c, 0xef, + 0x7d, 0xbe, 0x5d, 0x0e, 0x0a, 0x06, 0xc5, 0xeb, 0x64, 0x8f, 0x0f, 0x85, 0xfe, 0x75, 0xc5, 0xb6, + 0x5f, 0xf7, 0x15, 0x0b, 0x86, 0xd5, 0xd7, 0x1d, 0xc3, 0xbe, 0x30, 0x6b, 0xee, 0x0b, 0xe7, 0xda, + 0x4e, 0xf0, 0x9c, 0x1d, 0xe1, 0x6b, 0x05, 0x38, 0xa3, 0x68, 0xe8, 0x6d, 0x86, 0xff, 0x11, 0xb3, + 0xea, 0x32, 0x94, 0x3c, 0xa5, 0xd7, 0xb3, 0x4c, 0x85, 0x5a, 0xac, 0xd5, 0x8b, 0x69, 0xa8, 0x50, + 0xea, 0xc5, 0xc7, 0xec, 0x90, 0xae, 0xf0, 0x16, 0xca, 0xed, 0x59, 0x28, 0xb6, 0xdc, 0xba, 0x38, + 0x60, 0xde, 0x2f, 0x7b, 0xfb, 0xe6, 0xd2, 0xfc, 0xc1, 0x7e, 0xf9, 0xd1, 0x3c, 0x63, 0x0b, 0x3d, + 0xd9, 0xc2, 0xe9, 0x9b, 0x4b, 0xf3, 0x98, 0x16, 0x46, 0x33, 0x30, 0x2a, 0x4f, 0xe8, 0x5b, 0x54, + 0x40, 0xf4, 0x3d, 0x71, 0x0e, 0x29, 0xad, 0x35, 0x36, 0xd1, 0x38, 0x49, 0x8f, 0xe6, 0x61, 0x6c, + 0xbb, 0xb5, 0x4e, 0x1a, 0x24, 0xe2, 0x1f, 0x7c, 0x9d, 0x70, 0x9d, 0x6e, 0x29, 0xbe, 0x4b, 0x5e, + 0x4f, 0xe0, 0x71, 0xaa, 0x84, 0xfd, 0xd7, 0xec, 0x3c, 0x10, 0xbd, 0x57, 0x09, 0x7c, 0x3a, 0xb1, + 0x28, 0xf7, 0x6f, 0xe6, 0x74, 0xee, 0x66, 0x56, 0x5c, 0x27, 0x7b, 0x6b, 0x3e, 0xbd, 0x4b, 0x64, + 0xcf, 0x0a, 0x63, 0xce, 0xf7, 0xb4, 0x9d, 0xf3, 0xbf, 0x50, 0x80, 0x93, 0xaa, 0x07, 0x0c, 0xb1, + 0xf5, 0x5b, 0xbd, 0x0f, 0xae, 0xc0, 0x60, 0x9d, 0x6c, 0x38, 0xad, 0x46, 0xa4, 0x0c, 0x0c, 0xbd, + 0xdc, 0xc8, 0x34, 0x1f, 0x83, 0xb1, 0x4e, 0x73, 0x88, 0x6e, 0xfb, 0xf9, 0x61, 0x76, 0x10, 0x47, + 0x0e, 0x9d, 0xe3, 0x6a, 0xd5, 0x58, 0xb9, 0xab, 0xe6, 0x31, 0xe8, 0x75, 0x77, 0xa8, 0x60, 0x56, + 0x30, 0xe5, 0xad, 0x25, 0x0a, 0xc4, 0x1c, 0x87, 0x9e, 0x80, 0xfe, 0x9a, 0xbf, 0xb3, 0xe3, 0x78, + 0x75, 0x76, 0xe4, 0x95, 0x66, 0x07, 0xa9, 0xec, 0x36, 0xc7, 0x41, 0x58, 0xe2, 0xd0, 0x59, 0xe8, + 0x71, 0x82, 0x4d, 0xae, 0x75, 0x29, 0xcd, 0x0e, 0xd0, 0x9a, 0x66, 0x82, 0xcd, 0x10, 0x33, 0x28, + 0xbd, 0x34, 0xde, 0xf1, 0x83, 0x6d, 0xd7, 0xdb, 0x9c, 0x77, 0x03, 0xb1, 0x24, 0xd4, 0x59, 0x78, + 0x5b, 0x61, 0xb0, 0x46, 0x85, 0x16, 0xa1, 0xb7, 0xe9, 0x07, 0x51, 0x38, 0xd9, 0xc7, 0xba, 0xfb, + 0xd1, 0x9c, 0x8d, 0x88, 0x7f, 0x6d, 0xc5, 0x0f, 0xa2, 0xf8, 0x03, 0xe8, 0xbf, 0x10, 0xf3, 0xe2, + 0x68, 0x19, 0xfa, 0x89, 0xb7, 0xbb, 0x18, 0xf8, 0x3b, 0x93, 0x13, 0xf9, 0x9c, 0x16, 0x38, 0x09, + 0x9f, 0x66, 0xb1, 0x8c, 0x2a, 0xc0, 0x58, 0xb2, 0x40, 0x1f, 0x82, 0x22, 0xf1, 0x76, 0x27, 0xfb, + 0x19, 0xa7, 0xa9, 0x1c, 0x4e, 0xb7, 0x9c, 0x20, 0xde, 0xf3, 0x17, 0xbc, 0x5d, 0x4c, 0xcb, 0xa0, + 0x8f, 0x43, 0x49, 0x6e, 0x18, 0xa1, 0x50, 0x67, 0x66, 0x4e, 0x58, 0xb9, 0xcd, 0x60, 0xf2, 0x76, + 0xcb, 0x0d, 0xc8, 0x0e, 0xf1, 0xa2, 0x30, 0xde, 0x21, 0x25, 0x36, 0xc4, 0x31, 0x37, 0x54, 0x83, + 0xa1, 0x80, 0x84, 0xee, 0x3d, 0x52, 0xf1, 0x1b, 0x6e, 0x6d, 0x6f, 0xf2, 0x34, 0x6b, 0xde, 0x53, + 0x6d, 0xbb, 0x0c, 0x6b, 0x05, 0x62, 0x75, 0xbb, 0x0e, 0xc5, 0x06, 0x53, 0xf4, 0x06, 0x0c, 0x07, + 0x24, 0x8c, 0x9c, 0x20, 0x12, 0xb5, 0x4c, 0x2a, 0xf3, 0xd8, 0x30, 0xd6, 0x11, 0xfc, 0x3a, 0x11, + 0x57, 0x13, 0x63, 0xb0, 0xc9, 0x01, 0x7d, 0x5c, 0xea, 0xfe, 0x57, 0xfc, 0x96, 0x17, 0x85, 0x93, + 0x25, 0xd6, 0xee, 0x4c, 0xab, 0xec, 0xad, 0x98, 0x2e, 0x69, 0x1c, 0xe0, 0x85, 0xb1, 0xc1, 0x0a, + 0x7d, 0x12, 0x86, 0xf9, 0x7f, 0x6e, 0xdb, 0x0c, 0x27, 0x4f, 0x32, 0xde, 0x17, 0xf2, 0x79, 0x73, + 0xc2, 0xd9, 0x93, 0x82, 0xf9, 0xb0, 0x0e, 0x0d, 0xb1, 0xc9, 0x0d, 0x61, 0x18, 0x6e, 0xb8, 0xbb, + 0xc4, 0x23, 0x61, 0x58, 0x09, 0xfc, 0x75, 0x22, 0x54, 0xb5, 0x67, 0xb2, 0x6d, 0xa1, 0xfe, 0x3a, + 0x99, 0x1d, 0xa7, 0x3c, 0x97, 0xf5, 0x32, 0xd8, 0x64, 0x81, 0x6e, 0xc2, 0x08, 0xbd, 0x1b, 0xbb, + 0x31, 0xd3, 0xc1, 0x4e, 0x4c, 0xd9, 0x7d, 0x10, 0x1b, 0x85, 0x70, 0x82, 0x09, 0xba, 0x01, 0x43, + 0xac, 0xcf, 0x5b, 0x4d, 0xce, 0xf4, 0x54, 0x27, 0xa6, 0xcc, 0x94, 0x5e, 0xd5, 0x8a, 0x60, 0x83, + 0x01, 0x7a, 0x1d, 0x4a, 0x0d, 0x77, 0x83, 0xd4, 0xf6, 0x6a, 0x0d, 0x32, 0x39, 0xc4, 0xb8, 0x65, + 0x6e, 0x86, 0xcb, 0x92, 0x88, 0xcb, 0xe7, 0xea, 0x2f, 0x8e, 0x8b, 0xa3, 0x5b, 0x70, 0x2a, 0x22, + 0xc1, 0x8e, 0xeb, 0x39, 0x74, 0x13, 0x13, 0x57, 0x42, 0x66, 0xa2, 0x1e, 0x66, 0xb3, 0xeb, 0xbc, + 0x18, 0x8d, 0x53, 0x6b, 0x99, 0x54, 0x38, 0xa7, 0x34, 0xba, 0x0b, 0x93, 0x19, 0x18, 0x3e, 0x6f, + 0x4f, 0x30, 0xce, 0x1f, 0x16, 0x9c, 0x27, 0xd7, 0x72, 0xe8, 0x0e, 0xda, 0xe0, 0x70, 0x2e, 0x77, + 0x74, 0x03, 0x46, 0xd9, 0xce, 0x59, 0x69, 0x35, 0x1a, 0xa2, 0xc2, 0x11, 0x56, 0xe1, 0x13, 0x52, + 0x8e, 0x58, 0x32, 0xd1, 0x07, 0xfb, 0x65, 0x88, 0xff, 0xe1, 0x64, 0x69, 0xb4, 0xce, 0xac, 0xa1, + 0xad, 0xc0, 0x8d, 0xf6, 0xe8, 0xaa, 0x22, 0x77, 0xa3, 0xc9, 0xd1, 0xb6, 0x9a, 0x21, 0x9d, 0x54, + 0x99, 0x4c, 0x75, 0x20, 0x4e, 0x32, 0xa4, 0x47, 0x41, 0x18, 0xd5, 0x5d, 0x6f, 0x72, 0x8c, 0xdf, + 0xa7, 0xe4, 0x4e, 0x5a, 0xa5, 0x40, 0xcc, 0x71, 0xcc, 0x12, 0x4a, 0x7f, 0xdc, 0xa0, 0x27, 0xee, + 0x38, 0x23, 0x8c, 0x2d, 0xa1, 0x12, 0x81, 0x63, 0x1a, 0x2a, 0x04, 0x47, 0xd1, 0xde, 0x24, 0x62, + 0xa4, 0x6a, 0x43, 0x5c, 0x5b, 0xfb, 0x38, 0xa6, 0x70, 0x7b, 0x1d, 0x46, 0xd4, 0x36, 0xc1, 0xfa, + 0x04, 0x95, 0xa1, 0x97, 0x89, 0x7d, 0x42, 0x8f, 0x59, 0xa2, 0x4d, 0x60, 0x22, 0x21, 0xe6, 0x70, + 0xd6, 0x04, 0xf7, 0x1e, 0x99, 0xdd, 0x8b, 0x08, 0xd7, 0x45, 0x14, 0xb5, 0x26, 0x48, 0x04, 0x8e, + 0x69, 0xec, 0xff, 0xc9, 0xc5, 0xe7, 0xf8, 0x94, 0xe8, 0xe2, 0x5c, 0x7c, 0x16, 0x06, 0xb6, 0xfc, + 0x30, 0xa2, 0xd4, 0xac, 0x8e, 0xde, 0x58, 0x60, 0xbe, 0x26, 0xe0, 0x58, 0x51, 0xa0, 0x57, 0x61, + 0xb8, 0xa6, 0x57, 0x20, 0x0e, 0x75, 0xb5, 0x8d, 0x18, 0xb5, 0x63, 0x93, 0x16, 0xbd, 0x0c, 0x03, + 0xcc, 0xbb, 0xa7, 0xe6, 0x37, 0x84, 0xb4, 0x29, 0x25, 0x93, 0x81, 0x8a, 0x80, 0x1f, 0x68, 0xbf, + 0xb1, 0xa2, 0x46, 0x17, 0xa1, 0x8f, 0x36, 0x61, 0xa9, 0x22, 0x8e, 0x53, 0xa5, 0x92, 0xbb, 0xc6, + 0xa0, 0x58, 0x60, 0xed, 0x5f, 0xb3, 0x98, 0x2c, 0x95, 0xde, 0xf3, 0xd1, 0x35, 0x76, 0x68, 0xb0, + 0x13, 0x44, 0x53, 0x89, 0x3d, 0xae, 0x9d, 0x04, 0x0a, 0x77, 0x90, 0xf8, 0x8f, 0x8d, 0x92, 0xe8, + 0xcd, 0xe4, 0xc9, 0xc0, 0x05, 0x8a, 0x17, 0x65, 0x17, 0x24, 0x4f, 0x87, 0x47, 0xe2, 0x23, 0x8e, + 0xb6, 0xa7, 0xdd, 0x11, 0x61, 0xff, 0x5f, 0x05, 0x6d, 0x96, 0x54, 0x23, 0x27, 0x22, 0xa8, 0x02, + 0xfd, 0x77, 0x1c, 0x37, 0x72, 0xbd, 0x4d, 0x21, 0xf7, 0xb5, 0x3f, 0xe8, 0x58, 0xa1, 0xdb, 0xbc, + 0x00, 0x97, 0x5e, 0xc4, 0x1f, 0x2c, 0xd9, 0x50, 0x8e, 0x41, 0xcb, 0xf3, 0x28, 0xc7, 0x42, 0xb7, + 0x1c, 0x31, 0x2f, 0xc0, 0x39, 0x8a, 0x3f, 0x58, 0xb2, 0x41, 0x6f, 0x01, 0xc8, 0x1d, 0x82, 0xd4, + 0x85, 0x57, 0xd0, 0xb3, 0x9d, 0x99, 0xae, 0xa9, 0x32, 0xb3, 0x23, 0x54, 0x36, 0x8a, 0xff, 0x63, + 0x8d, 0x9f, 0x1d, 0x69, 0x63, 0xaa, 0x37, 0x06, 0x7d, 0x82, 0x2e, 0x51, 0x27, 0x88, 0x48, 0x7d, + 0x26, 0x12, 0x9d, 0xf3, 0x74, 0x77, 0x97, 0xc3, 0x35, 0x77, 0x87, 0xe8, 0xcb, 0x59, 0x30, 0xc1, + 0x31, 0x3f, 0xfb, 0x97, 0x8a, 0x30, 0x99, 0xd7, 0x5c, 0xba, 0x68, 0xc8, 0x5d, 0x37, 0x9a, 0xa3, + 0x62, 0xad, 0x65, 0x2e, 0x9a, 0x05, 0x01, 0xc7, 0x8a, 0x82, 0xce, 0xde, 0xd0, 0xdd, 0x94, 0x77, + 0xfb, 0xde, 0x78, 0xf6, 0x56, 0x19, 0x14, 0x0b, 0x2c, 0xa5, 0x0b, 0x88, 0x13, 0x0a, 0xb7, 0x33, + 0x6d, 0x96, 0x63, 0x06, 0xc5, 0x02, 0xab, 0x6b, 0x19, 0x7b, 0x3a, 0x68, 0x19, 0x8d, 0x2e, 0xea, + 0x3d, 0xda, 0x2e, 0x42, 0x9f, 0x02, 0xd8, 0x70, 0x3d, 0x37, 0xdc, 0x62, 0xdc, 0xfb, 0x0e, 0xcd, + 0x5d, 0x09, 0xc5, 0x8b, 0x8a, 0x0b, 0xd6, 0x38, 0xa2, 0x97, 0x60, 0x50, 0x6d, 0x20, 0x4b, 0xf3, + 0xcc, 0x06, 0xaf, 0xf9, 0x34, 0xc5, 0xbb, 0xe9, 0x3c, 0xd6, 0xe9, 0xec, 0xcf, 0x24, 0xe7, 0x8b, + 0x58, 0x01, 0x5a, 0xff, 0x5a, 0xdd, 0xf6, 0x6f, 0xa1, 0x7d, 0xff, 0xda, 0xdf, 0xe8, 0x83, 0x51, + 0xa3, 0xb2, 0x56, 0xd8, 0xc5, 0x9e, 0x7b, 0x95, 0x1e, 0x40, 0x4e, 0x44, 0xc4, 0xfa, 0xb3, 0x3b, + 0x2f, 0x15, 0xfd, 0x90, 0xa2, 0x2b, 0x80, 0x97, 0x47, 0x9f, 0x82, 0x52, 0xc3, 0x09, 0x99, 0xc6, + 0x92, 0x88, 0x75, 0xd7, 0x0d, 0xb3, 0xf8, 0x42, 0xe8, 0x84, 0x91, 0x76, 0xea, 0x73, 0xde, 0x31, + 0x4b, 0x7a, 0x52, 0x52, 0xf9, 0x4a, 0xfa, 0x35, 0xaa, 0x46, 0x50, 0x21, 0x6c, 0x0f, 0x73, 0x1c, + 0x7a, 0x99, 0x6d, 0xad, 0x74, 0x56, 0xcc, 0x51, 0x69, 0x94, 0x4d, 0xb3, 0x5e, 0x43, 0xc8, 0x56, + 0x38, 0x6c, 0x50, 0xc6, 0x77, 0xb2, 0xbe, 0x36, 0x77, 0xb2, 0xa7, 0xa0, 0x9f, 0xfd, 0x50, 0x33, + 0x40, 0x8d, 0xc6, 0x12, 0x07, 0x63, 0x89, 0x4f, 0x4e, 0x98, 0x81, 0xee, 0x26, 0x0c, 0xbd, 0xf5, + 0x89, 0x49, 0xcd, 0xfc, 0x1f, 0x06, 0xf8, 0x2e, 0x27, 0xa6, 0x3c, 0x96, 0x38, 0xf4, 0x33, 0x16, + 0x20, 0xa7, 0x41, 0x6f, 0xcb, 0x14, 0xac, 0x2e, 0x37, 0xc0, 0x44, 0xed, 0x57, 0x3b, 0x76, 0x7b, + 0x2b, 0x9c, 0x9e, 0x49, 0x95, 0xe6, 0x9a, 0xd2, 0x57, 0x44, 0x13, 0x51, 0x9a, 0x40, 0x3f, 0x8c, + 0x96, 0xdd, 0x30, 0xfa, 0xfc, 0x1f, 0x25, 0x0e, 0xa7, 0x8c, 0x26, 0xa1, 0x9b, 0xfa, 0xe5, 0x6b, + 0xf0, 0x90, 0x97, 0xaf, 0xe1, 0xbc, 0x8b, 0xd7, 0x54, 0x0b, 0x4e, 0xe7, 0x7c, 0x41, 0x86, 0xfe, + 0x75, 0x5e, 0xd7, 0xbf, 0x76, 0xd0, 0xda, 0x4d, 0xcb, 0x3a, 0xa6, 0xdf, 0x68, 0x39, 0x5e, 0xe4, + 0x46, 0x7b, 0xba, 0xbe, 0xf6, 0x69, 0x18, 0x99, 0x77, 0xc8, 0x8e, 0xef, 0x2d, 0x78, 0xf5, 0xa6, + 0xef, 0x7a, 0x11, 0x9a, 0x84, 0x1e, 0x26, 0x7c, 0xf0, 0xad, 0xb7, 0x87, 0xf6, 0x1e, 0x66, 0x10, + 0x7b, 0x13, 0x4e, 0xce, 0xfb, 0x77, 0xbc, 0x3b, 0x4e, 0x50, 0x9f, 0xa9, 0x2c, 0x69, 0xfa, 0xa4, + 0x55, 0xa9, 0xcf, 0xb0, 0xf2, 0x6f, 0x8b, 0x5a, 0x49, 0x7e, 0x1d, 0x5a, 0x74, 0x1b, 0x24, 0x47, + 0xeb, 0xf7, 0xff, 0x16, 0x8c, 0x9a, 0x62, 0x7a, 0x65, 0x77, 0xb6, 0x72, 0xed, 0xce, 0x6f, 0xc0, + 0xc0, 0x86, 0x4b, 0x1a, 0x75, 0x4c, 0x36, 0x44, 0xef, 0x3c, 0x99, 0xef, 0x99, 0xb6, 0x48, 0x29, + 0xa5, 0x96, 0x97, 0x6b, 0x43, 0x16, 0x45, 0x61, 0xac, 0xd8, 0xa0, 0x6d, 0x18, 0x93, 0x7d, 0x28, + 0xb1, 0x62, 0x3f, 0x78, 0xaa, 0xdd, 0xc0, 0x9b, 0xcc, 0x4f, 0xdc, 0xdf, 0x2f, 0x8f, 0xe1, 0x04, + 0x1b, 0x9c, 0x62, 0x8c, 0xce, 0x42, 0xcf, 0x0e, 0x3d, 0xf9, 0x7a, 0x58, 0xf7, 0x33, 0xf5, 0x07, + 0xd3, 0xe4, 0x30, 0xa8, 0xfd, 0x63, 0x16, 0x9c, 0x4e, 0xf5, 0x8c, 0xd0, 0x68, 0x1d, 0xf1, 0x28, + 0x24, 0x35, 0x4c, 0x85, 0xce, 0x1a, 0x26, 0xfb, 0x6f, 0x59, 0x70, 0x62, 0x61, 0xa7, 0x19, 0xed, + 0xcd, 0xbb, 0xa6, 0x91, 0xf8, 0x83, 0xd0, 0xb7, 0x43, 0xea, 0x6e, 0x6b, 0x47, 0x8c, 0x5c, 0x59, + 0x9e, 0x0e, 0x2b, 0x0c, 0x7a, 0xb0, 0x5f, 0x1e, 0xae, 0x46, 0x7e, 0xe0, 0x6c, 0x12, 0x0e, 0xc0, + 0x82, 0x9c, 0x9d, 0xb1, 0xee, 0x3d, 0xb2, 0xec, 0xee, 0xb8, 0xd1, 0x83, 0xcd, 0x76, 0x61, 0xdf, + 0x95, 0x4c, 0x70, 0xcc, 0xcf, 0xfe, 0xba, 0x05, 0xa3, 0x72, 0xde, 0xcf, 0xd4, 0xeb, 0x01, 0x09, + 0x43, 0x34, 0x05, 0x05, 0xb7, 0x29, 0x5a, 0x09, 0xa2, 0x95, 0x85, 0xa5, 0x0a, 0x2e, 0xb8, 0x4d, + 0x29, 0xce, 0xb3, 0x03, 0xa8, 0x68, 0x9a, 0xba, 0xaf, 0x09, 0x38, 0x56, 0x14, 0xe8, 0x12, 0x0c, + 0x78, 0x7e, 0x9d, 0x4b, 0xc4, 0x5c, 0x94, 0x60, 0x13, 0x6c, 0x55, 0xc0, 0xb0, 0xc2, 0xa2, 0x0a, + 0x94, 0xb8, 0x23, 0x64, 0x3c, 0x69, 0xbb, 0x72, 0xa7, 0x64, 0x5f, 0xb6, 0x26, 0x4b, 0xe2, 0x98, + 0x89, 0xfd, 0x1b, 0x16, 0x0c, 0xc9, 0x2f, 0xeb, 0xf2, 0xae, 0x42, 0x97, 0x56, 0x7c, 0x4f, 0x89, + 0x97, 0x16, 0xbd, 0x6b, 0x30, 0x8c, 0x71, 0xc5, 0x28, 0x1e, 0xea, 0x8a, 0x71, 0x05, 0x06, 0x9d, + 0x66, 0xb3, 0x62, 0xde, 0x4f, 0xd8, 0x54, 0x9a, 0x89, 0xc1, 0x58, 0xa7, 0xb1, 0x7f, 0xb4, 0x00, + 0x23, 0xf2, 0x0b, 0xaa, 0xad, 0xf5, 0x90, 0x44, 0x68, 0x0d, 0x4a, 0x0e, 0x1f, 0x25, 0x22, 0x27, + 0xf9, 0x63, 0xd9, 0x7a, 0x33, 0x63, 0x48, 0x63, 0x41, 0x6b, 0x46, 0x96, 0xc6, 0x31, 0x23, 0xd4, + 0x80, 0x71, 0xcf, 0x8f, 0xd8, 0xa1, 0xab, 0xf0, 0xed, 0x4c, 0x99, 0x49, 0xee, 0x67, 0x04, 0xf7, + 0xf1, 0xd5, 0x24, 0x17, 0x9c, 0x66, 0x8c, 0x16, 0xa4, 0x2e, 0xb2, 0x98, 0xaf, 0x44, 0xd2, 0x07, + 0x2e, 0x5b, 0x15, 0x69, 0xff, 0xaa, 0x05, 0x25, 0x49, 0x76, 0x1c, 0x56, 0xeb, 0x15, 0xe8, 0x0f, + 0xd9, 0x20, 0xc8, 0xae, 0xb1, 0xdb, 0x35, 0x9c, 0x8f, 0x57, 0x2c, 0x4b, 0xf0, 0xff, 0x21, 0x96, + 0x3c, 0x98, 0x29, 0x4a, 0x35, 0xff, 0x5d, 0x62, 0x8a, 0x52, 0xed, 0xc9, 0x39, 0x94, 0xfe, 0x94, + 0xb5, 0x59, 0xd3, 0xed, 0x52, 0x91, 0xb7, 0x19, 0x90, 0x0d, 0xf7, 0x6e, 0x52, 0xe4, 0xad, 0x30, + 0x28, 0x16, 0x58, 0xf4, 0x16, 0x0c, 0xd5, 0xa4, 0x0d, 0x22, 0x5e, 0xe1, 0x17, 0xdb, 0xda, 0xc3, + 0x94, 0xe9, 0x94, 0xeb, 0xd0, 0xe6, 0xb4, 0xf2, 0xd8, 0xe0, 0x66, 0x3a, 0xfa, 0x14, 0x3b, 0x39, + 0xfa, 0xc4, 0x7c, 0xf3, 0xdd, 0x5e, 0x7e, 0xdc, 0x82, 0x3e, 0xae, 0x7b, 0xee, 0x4e, 0xf5, 0xaf, + 0x59, 0x92, 0xe3, 0xbe, 0xbb, 0x45, 0x81, 0x42, 0xd2, 0x40, 0x2b, 0x50, 0x62, 0x3f, 0x98, 0xee, + 0xbc, 0x98, 0xff, 0x0e, 0x87, 0xd7, 0xaa, 0x37, 0xf0, 0x96, 0x2c, 0x86, 0x63, 0x0e, 0xf6, 0x8f, + 0x14, 0xe9, 0xee, 0x16, 0x93, 0x1a, 0x87, 0xbe, 0xf5, 0xf0, 0x0e, 0xfd, 0xc2, 0xc3, 0x3a, 0xf4, + 0x37, 0x61, 0xb4, 0xa6, 0xd9, 0x9d, 0xe3, 0x91, 0xbc, 0xd4, 0x76, 0x92, 0x68, 0x26, 0x6a, 0xae, + 0x9d, 0x9b, 0x33, 0x99, 0xe0, 0x24, 0x57, 0xf4, 0x09, 0x18, 0xe2, 0xe3, 0x2c, 0x6a, 0xe1, 0xbe, + 0x52, 0x4f, 0xe4, 0xcf, 0x17, 0xbd, 0x0a, 0xae, 0xcd, 0xd5, 0x8a, 0x63, 0x83, 0x99, 0xfd, 0x97, + 0x16, 0xa0, 0x85, 0xe6, 0x16, 0xd9, 0x21, 0x81, 0xd3, 0x88, 0xcd, 0x47, 0x3f, 0x68, 0xc1, 0x24, + 0x49, 0x81, 0xe7, 0xfc, 0x9d, 0x1d, 0x71, 0x59, 0xcc, 0xd1, 0x67, 0x2c, 0xe4, 0x94, 0x51, 0x0f, + 0x95, 0x26, 0xf3, 0x28, 0x70, 0x6e, 0x7d, 0x68, 0x05, 0x26, 0xf8, 0x29, 0xa9, 0x10, 0x9a, 0xdf, + 0xd5, 0x23, 0x82, 0xf1, 0xc4, 0x5a, 0x9a, 0x04, 0x67, 0x95, 0xb3, 0x7f, 0x75, 0x18, 0x72, 0x5b, + 0xf1, 0x9e, 0xdd, 0xec, 0x3d, 0xbb, 0xd9, 0x7b, 0x76, 0xb3, 0xf7, 0xec, 0x66, 0xef, 0xd9, 0xcd, + 0xde, 0xb3, 0x9b, 0xbd, 0x4b, 0xed, 0x66, 0xff, 0xb7, 0x05, 0x27, 0xd5, 0xf1, 0x65, 0x5c, 0xd8, + 0x3f, 0x0b, 0x13, 0x7c, 0xb9, 0x19, 0x3e, 0xc6, 0xe2, 0xb8, 0xbe, 0x92, 0x39, 0x73, 0x13, 0xbe, + 0xf0, 0x46, 0x41, 0xfe, 0xa8, 0x28, 0x03, 0x81, 0xb3, 0xaa, 0xb1, 0x7f, 0x69, 0x00, 0x7a, 0x17, + 0x76, 0x89, 0x17, 0x1d, 0xc3, 0xd5, 0xa6, 0x06, 0x23, 0xae, 0xb7, 0xeb, 0x37, 0x76, 0x49, 0x9d, + 0xe3, 0x0f, 0x73, 0x03, 0x3f, 0x25, 0x58, 0x8f, 0x2c, 0x19, 0x2c, 0x70, 0x82, 0xe5, 0xc3, 0xb0, + 0x3e, 0x5c, 0x85, 0x3e, 0x7e, 0xf8, 0x08, 0xd3, 0x43, 0xe6, 0x9e, 0xcd, 0x3a, 0x51, 0x1c, 0xa9, + 0xb1, 0x65, 0x84, 0x1f, 0x6e, 0xa2, 0x38, 0xfa, 0x0c, 0x8c, 0x6c, 0xb8, 0x41, 0x18, 0xad, 0xb9, + 0x3b, 0xf4, 0x68, 0xd8, 0x69, 0x3e, 0x80, 0xb5, 0x41, 0xf5, 0xc3, 0xa2, 0xc1, 0x09, 0x27, 0x38, + 0xa3, 0x4d, 0x18, 0x6e, 0x38, 0x7a, 0x55, 0xfd, 0x87, 0xae, 0x4a, 0x9d, 0x0e, 0xcb, 0x3a, 0x23, + 0x6c, 0xf2, 0xa5, 0xcb, 0xa9, 0xc6, 0x14, 0xe6, 0x03, 0x4c, 0x9d, 0xa1, 0x96, 0x13, 0xd7, 0x94, + 0x73, 0x1c, 0x15, 0xd0, 0x98, 0x23, 0x7b, 0xc9, 0x14, 0xd0, 0x34, 0x77, 0xf5, 0x4f, 0x43, 0x89, + 0xd0, 0x2e, 0xa4, 0x8c, 0xc5, 0x01, 0x73, 0xb9, 0xbb, 0xb6, 0xae, 0xb8, 0xb5, 0xc0, 0x37, 0xed, + 0x3c, 0x0b, 0x92, 0x13, 0x8e, 0x99, 0xa2, 0x39, 0xe8, 0x0b, 0x49, 0xe0, 0x2a, 0x5d, 0x72, 0x9b, + 0x61, 0x64, 0x64, 0xfc, 0xd5, 0x1a, 0xff, 0x8d, 0x45, 0x51, 0x3a, 0xbd, 0x1c, 0xa6, 0x8a, 0x65, + 0x87, 0x81, 0x36, 0xbd, 0x66, 0x18, 0x14, 0x0b, 0x2c, 0x7a, 0x1d, 0xfa, 0x03, 0xd2, 0x60, 0x86, + 0xc4, 0xe1, 0xee, 0x27, 0x39, 0xb7, 0x4b, 0xf2, 0x72, 0x58, 0x32, 0x40, 0xd7, 0x01, 0x05, 0x84, + 0x0a, 0x78, 0xae, 0xb7, 0xa9, 0xdc, 0xbb, 0xc5, 0x46, 0xab, 0x04, 0x69, 0x1c, 0x53, 0xc8, 0x07, + 0x8b, 0x38, 0xa3, 0x18, 0xba, 0x0a, 0xe3, 0x0a, 0xba, 0xe4, 0x85, 0x91, 0x43, 0x37, 0xb8, 0x51, + 0xc6, 0x4b, 0xe9, 0x57, 0x70, 0x92, 0x00, 0xa7, 0xcb, 0xd8, 0x3f, 0x67, 0x01, 0xef, 0xe7, 0x63, + 0xd0, 0x2a, 0xbc, 0x66, 0x6a, 0x15, 0xce, 0xe4, 0x8e, 0x5c, 0x8e, 0x46, 0xe1, 0xe7, 0x2c, 0x18, + 0xd4, 0x46, 0x36, 0x9e, 0xb3, 0x56, 0x9b, 0x39, 0xdb, 0x82, 0x31, 0x3a, 0xd3, 0x6f, 0xac, 0x87, + 0x24, 0xd8, 0x25, 0x75, 0x36, 0x31, 0x0b, 0x0f, 0x36, 0x31, 0x95, 0x2b, 0xe9, 0x72, 0x82, 0x21, + 0x4e, 0x55, 0x61, 0x7f, 0x5a, 0x36, 0x55, 0x79, 0xde, 0xd6, 0xd4, 0x98, 0x27, 0x3c, 0x6f, 0xd5, + 0xa8, 0xe2, 0x98, 0x86, 0x2e, 0xb5, 0x2d, 0x3f, 0x8c, 0x92, 0x9e, 0xb7, 0xd7, 0xfc, 0x30, 0xc2, + 0x0c, 0x63, 0xbf, 0x00, 0xb0, 0x70, 0x97, 0xd4, 0xf8, 0x8c, 0xd5, 0x2f, 0x3d, 0x56, 0xfe, 0xa5, + 0xc7, 0xfe, 0x3d, 0x0b, 0x46, 0x16, 0xe7, 0x8c, 0x93, 0x6b, 0x1a, 0x80, 0xdf, 0xd4, 0x6e, 0xdf, + 0x5e, 0x95, 0xee, 0x1f, 0xdc, 0x02, 0xae, 0xa0, 0x58, 0xa3, 0x40, 0x67, 0xa0, 0xd8, 0x68, 0x79, + 0x42, 0xed, 0xd9, 0x4f, 0x8f, 0xc7, 0xe5, 0x96, 0x87, 0x29, 0x4c, 0x7b, 0xac, 0x54, 0xec, 0xfa, + 0xb1, 0x52, 0xc7, 0x20, 0x25, 0xa8, 0x0c, 0xbd, 0x77, 0xee, 0xb8, 0x75, 0xfe, 0x14, 0x5c, 0xb8, + 0xa6, 0xdc, 0xbe, 0xbd, 0x34, 0x1f, 0x62, 0x0e, 0xb7, 0xbf, 0x58, 0x84, 0xa9, 0xc5, 0x06, 0xb9, + 0xfb, 0x0e, 0x9f, 0xc3, 0x77, 0xfb, 0xd4, 0xea, 0x70, 0x0a, 0xa4, 0xc3, 0x3e, 0xa7, 0xeb, 0xdc, + 0x1f, 0x1b, 0xd0, 0xcf, 0x1d, 0x4f, 0xe5, 0xe3, 0xf8, 0x4c, 0x73, 0x5f, 0x7e, 0x87, 0x4c, 0x73, + 0x07, 0x56, 0x61, 0xee, 0x53, 0x07, 0xa6, 0x80, 0x62, 0xc9, 0x7c, 0xea, 0x15, 0x18, 0xd2, 0x29, + 0x0f, 0xf5, 0xb0, 0xf5, 0xbb, 0x8b, 0x30, 0x46, 0x5b, 0xf0, 0x50, 0x07, 0xe2, 0x66, 0x7a, 0x20, + 0x8e, 0xfa, 0x71, 0x63, 0xe7, 0xd1, 0x78, 0x2b, 0x39, 0x1a, 0x57, 0xf2, 0x46, 0xe3, 0xb8, 0xc7, + 0xe0, 0x7b, 0x2c, 0x98, 0x58, 0x6c, 0xf8, 0xb5, 0xed, 0xc4, 0x03, 0xc4, 0x97, 0x60, 0x90, 0x6e, + 0xc7, 0xa1, 0x11, 0x8b, 0xc3, 0x88, 0xce, 0x22, 0x50, 0x58, 0xa7, 0xd3, 0x8a, 0xdd, 0xbc, 0xb9, + 0x34, 0x9f, 0x15, 0xd4, 0x45, 0xa0, 0xb0, 0x4e, 0x67, 0xff, 0x8e, 0x05, 0xe7, 0xae, 0xce, 0x2d, + 0xc4, 0x53, 0x31, 0x15, 0x57, 0xe6, 0x22, 0xf4, 0x35, 0xeb, 0x5a, 0x53, 0x62, 0xb5, 0xf0, 0x3c, + 0x6b, 0x85, 0xc0, 0xbe, 0x5b, 0x62, 0x26, 0xdd, 0x04, 0xb8, 0x8a, 0x2b, 0x73, 0x62, 0xdf, 0x95, + 0x56, 0x20, 0x2b, 0xd7, 0x0a, 0xf4, 0x04, 0xf4, 0xd3, 0x73, 0xc1, 0xad, 0xc9, 0x76, 0x73, 0x83, + 0x3e, 0x07, 0x61, 0x89, 0xb3, 0x7f, 0xd6, 0x82, 0x89, 0xab, 0x6e, 0x44, 0x0f, 0xed, 0x64, 0xe0, + 0x14, 0x7a, 0x6a, 0x87, 0x6e, 0xe4, 0x07, 0x7b, 0xc9, 0xc0, 0x29, 0x58, 0x61, 0xb0, 0x46, 0xc5, + 0x3f, 0x68, 0xd7, 0x65, 0x2f, 0x29, 0x0a, 0xa6, 0xdd, 0x0d, 0x0b, 0x38, 0x56, 0x14, 0xb4, 0xbf, + 0xea, 0x6e, 0xc0, 0x54, 0x96, 0x7b, 0x62, 0xe3, 0x56, 0xfd, 0x35, 0x2f, 0x11, 0x38, 0xa6, 0xb1, + 0xff, 0xdc, 0x82, 0xf2, 0xd5, 0x46, 0x2b, 0x8c, 0x48, 0xb0, 0x11, 0xe6, 0x6c, 0xba, 0x2f, 0x40, + 0x89, 0x48, 0x03, 0x81, 0x7c, 0xf2, 0x29, 0x05, 0x51, 0x65, 0x39, 0xe0, 0xf1, 0x5b, 0x14, 0x5d, + 0x17, 0xaf, 0xa4, 0x0f, 0xf7, 0xcc, 0x75, 0x11, 0x10, 0xd1, 0xeb, 0xd2, 0x03, 0xda, 0xb0, 0xc8, + 0x18, 0x0b, 0x29, 0x2c, 0xce, 0x28, 0x61, 0xff, 0x98, 0x05, 0x27, 0xd5, 0x07, 0xbf, 0xeb, 0x3e, + 0xd3, 0xfe, 0x6a, 0x01, 0x86, 0xaf, 0xad, 0xad, 0x55, 0xae, 0x92, 0x48, 0x9b, 0x95, 0xed, 0xcd, + 0xfe, 0x58, 0xb3, 0x5e, 0xb6, 0xbb, 0x23, 0xb6, 0x22, 0xb7, 0x31, 0xcd, 0xe3, 0xa2, 0x4d, 0x2f, + 0x79, 0xd1, 0x8d, 0xa0, 0x1a, 0x05, 0xae, 0xb7, 0x99, 0x39, 0xd3, 0xa5, 0xcc, 0x52, 0xcc, 0x93, + 0x59, 0xd0, 0x0b, 0xd0, 0xc7, 0x02, 0xb3, 0xc9, 0x41, 0x78, 0x44, 0x5d, 0xb1, 0x18, 0xf4, 0x60, + 0xbf, 0x5c, 0xba, 0x89, 0x97, 0xf8, 0x1f, 0x2c, 0x48, 0xd1, 0x4d, 0x18, 0xdc, 0x8a, 0xa2, 0xe6, + 0x35, 0xe2, 0xd4, 0x49, 0x20, 0x77, 0xd9, 0xf3, 0x59, 0xbb, 0x2c, 0xed, 0x04, 0x4e, 0x16, 0x6f, + 0x4c, 0x31, 0x2c, 0xc4, 0x3a, 0x1f, 0xbb, 0x0a, 0x10, 0xe3, 0x8e, 0xc8, 0x70, 0x63, 0xaf, 0x41, + 0x89, 0x7e, 0xee, 0x4c, 0xc3, 0x75, 0xda, 0x9b, 0xc6, 0x9f, 0x81, 0x92, 0x34, 0x7c, 0x87, 0x22, + 0x8a, 0x03, 0x3b, 0x91, 0xa4, 0x5d, 0x3c, 0xc4, 0x31, 0xde, 0x7e, 0x1c, 0x84, 0x6f, 0x69, 0x3b, + 0x96, 0xf6, 0x06, 0x9c, 0x60, 0x4e, 0xb2, 0x4e, 0xb4, 0x65, 0xcc, 0xd1, 0xce, 0x93, 0xe1, 0x59, + 0x71, 0xaf, 0xe3, 0x5f, 0x36, 0xa9, 0x3d, 0x4e, 0x1e, 0x92, 0x1c, 0xe3, 0x3b, 0x9e, 0xfd, 0x67, + 0x3d, 0xf0, 0xc8, 0x52, 0x35, 0x3f, 0xfc, 0xd0, 0xcb, 0x30, 0xc4, 0xc5, 0x45, 0x3a, 0x35, 0x9c, + 0x86, 0xa8, 0x57, 0x69, 0x40, 0xd7, 0x34, 0x1c, 0x36, 0x28, 0xd1, 0x39, 0x28, 0xba, 0x6f, 0x7b, + 0xc9, 0xa7, 0x7b, 0x4b, 0x6f, 0xac, 0x62, 0x0a, 0xa7, 0x68, 0x2a, 0x79, 0xf2, 0x2d, 0x5d, 0xa1, + 0x95, 0xf4, 0xf9, 0x1a, 0x8c, 0xb8, 0x61, 0x2d, 0x74, 0x97, 0x3c, 0xba, 0x4e, 0xb5, 0x95, 0xae, + 0x74, 0x0e, 0xb4, 0xd1, 0x0a, 0x8b, 0x13, 0xd4, 0xda, 0xf9, 0xd2, 0xdb, 0xb5, 0xf4, 0xda, 0x31, + 0xf8, 0x01, 0xdd, 0xfe, 0x9b, 0xec, 0xeb, 0x42, 0xa6, 0x82, 0x17, 0xdb, 0x3f, 0xff, 0xe0, 0x10, + 0x4b, 0x1c, 0xbd, 0xd0, 0xd5, 0xb6, 0x9c, 0xe6, 0x4c, 0x2b, 0xda, 0x9a, 0x77, 0xc3, 0x9a, 0xbf, + 0x4b, 0x82, 0x3d, 0x76, 0x17, 0x1f, 0x88, 0x2f, 0x74, 0x0a, 0x31, 0x77, 0x6d, 0xa6, 0x42, 0x29, + 0x71, 0xba, 0x0c, 0x9a, 0x81, 0x51, 0x09, 0xac, 0x92, 0x90, 0x1d, 0x01, 0x83, 0x8c, 0x8d, 0x7a, + 0x4c, 0x27, 0xc0, 0x8a, 0x49, 0x92, 0xde, 0x14, 0x70, 0xe1, 0x28, 0x04, 0xdc, 0x0f, 0xc2, 0xb0, + 0xeb, 0xb9, 0x91, 0xeb, 0x44, 0x3e, 0xb7, 0x1f, 0xf1, 0x6b, 0x37, 0x53, 0x30, 0x2f, 0xe9, 0x08, + 0x6c, 0xd2, 0xd9, 0xff, 0xb6, 0x07, 0xc6, 0xd9, 0xb0, 0xbd, 0x37, 0xc3, 0xbe, 0x9d, 0x66, 0xd8, + 0xcd, 0xf4, 0x0c, 0x3b, 0x0a, 0xc9, 0xfd, 0x81, 0xa7, 0xd9, 0x67, 0xa0, 0xa4, 0xde, 0x0f, 0xca, + 0x07, 0xc4, 0x56, 0xce, 0x03, 0xe2, 0xce, 0xa7, 0xb7, 0x74, 0x49, 0x2b, 0x66, 0xba, 0xa4, 0x7d, + 0xd9, 0x82, 0xd8, 0xb0, 0x80, 0xde, 0x80, 0x52, 0xd3, 0x67, 0x1e, 0xae, 0x81, 0x74, 0x1b, 0x7f, + 0xbc, 0xad, 0x65, 0x82, 0x47, 0x60, 0x0b, 0x78, 0x2f, 0x54, 0x64, 0x51, 0x1c, 0x73, 0x41, 0xd7, + 0xa1, 0xbf, 0x19, 0x90, 0x6a, 0xc4, 0xc2, 0x03, 0x75, 0xcf, 0x90, 0xcf, 0x1a, 0x5e, 0x10, 0x4b, + 0x0e, 0xf6, 0xbf, 0xb7, 0x60, 0x2c, 0x49, 0x8a, 0x3e, 0x0c, 0x3d, 0xe4, 0x2e, 0xa9, 0x89, 0xf6, + 0x66, 0x1e, 0xc5, 0xb1, 0x6a, 0x82, 0x77, 0x00, 0xfd, 0x8f, 0x59, 0x29, 0x74, 0x0d, 0xfa, 0xe9, + 0x39, 0x7c, 0x55, 0x85, 0xc2, 0x7b, 0x34, 0xef, 0x2c, 0x57, 0x02, 0x0d, 0x6f, 0x9c, 0x00, 0x61, + 0x59, 0x9c, 0xf9, 0x81, 0xd5, 0x9a, 0x55, 0x7a, 0xc5, 0x89, 0xda, 0xdd, 0xc4, 0xd7, 0xe6, 0x2a, + 0x9c, 0x48, 0x70, 0xe3, 0x7e, 0x60, 0x12, 0x88, 0x63, 0x26, 0xf6, 0x2f, 0x58, 0x00, 0xdc, 0xed, + 0xcd, 0xf1, 0x36, 0xc9, 0x31, 0x68, 0xd3, 0xe7, 0xa1, 0x27, 0x6c, 0x92, 0x5a, 0x3b, 0xe7, 0xeb, + 0xb8, 0x3d, 0xd5, 0x26, 0xa9, 0xc5, 0x33, 0x8e, 0xfe, 0xc3, 0xac, 0xb4, 0xfd, 0xbd, 0x00, 0x23, + 0x31, 0xd9, 0x52, 0x44, 0x76, 0xd0, 0x73, 0x46, 0xd0, 0x91, 0x33, 0x89, 0xa0, 0x23, 0x25, 0x46, + 0xad, 0x29, 0x6e, 0x3f, 0x03, 0xc5, 0x1d, 0xe7, 0xae, 0xd0, 0xcc, 0x3d, 0xd3, 0xbe, 0x19, 0x94, + 0xff, 0xf4, 0x8a, 0x73, 0x97, 0x5f, 0x5e, 0x9f, 0x91, 0x2b, 0x64, 0xc5, 0xb9, 0xdb, 0xd1, 0x41, + 0x98, 0x56, 0xc2, 0xea, 0x72, 0x3d, 0xe1, 0xd1, 0xd5, 0x55, 0x5d, 0xae, 0x97, 0xac, 0xcb, 0xf5, + 0xba, 0xa8, 0xcb, 0xf5, 0xd0, 0x3d, 0xe8, 0x17, 0x0e, 0x97, 0x22, 0x2c, 0xd9, 0xe5, 0x2e, 0xea, + 0x13, 0xfe, 0x9a, 0xbc, 0xce, 0xcb, 0xf2, 0x72, 0x2e, 0xa0, 0x1d, 0xeb, 0x95, 0x15, 0xa2, 0xff, + 0xc7, 0x82, 0x11, 0xf1, 0x1b, 0x93, 0xb7, 0x5b, 0x24, 0x8c, 0x84, 0xf0, 0xfa, 0x81, 0xee, 0xdb, + 0x20, 0x0a, 0xf2, 0xa6, 0x7c, 0x40, 0x9e, 0x33, 0x26, 0xb2, 0x63, 0x8b, 0x12, 0xad, 0x40, 0x7f, + 0xdb, 0x82, 0x13, 0x3b, 0xce, 0x5d, 0x5e, 0x23, 0x87, 0x61, 0x27, 0x72, 0x7d, 0xe1, 0xb8, 0xf0, + 0xe1, 0xee, 0x86, 0x3f, 0x55, 0x9c, 0x37, 0x52, 0x5a, 0x29, 0x4f, 0x64, 0x91, 0x74, 0x6c, 0x6a, + 0x66, 0xbb, 0xa6, 0x36, 0x60, 0x40, 0xce, 0xb7, 0x87, 0xe9, 0xdd, 0xcd, 0xea, 0x11, 0x73, 0xed, + 0xa1, 0xd6, 0xf3, 0x19, 0x18, 0xd2, 0xe7, 0xd8, 0x43, 0xad, 0xeb, 0x6d, 0x98, 0xc8, 0x98, 0x4b, + 0x0f, 0xb5, 0xca, 0x3b, 0x70, 0x26, 0x77, 0x7e, 0x3c, 0x54, 0xef, 0xfc, 0xaf, 0x5a, 0xfa, 0x3e, + 0x78, 0x0c, 0x26, 0x8d, 0x39, 0xd3, 0xa4, 0x71, 0xbe, 0xfd, 0xca, 0xc9, 0xb1, 0x6b, 0xbc, 0xa5, + 0x37, 0x9a, 0xee, 0xea, 0xe8, 0x75, 0xe8, 0x6b, 0x50, 0x88, 0x74, 0xdb, 0xb5, 0x3b, 0xaf, 0xc8, + 0x58, 0x98, 0x64, 0xf0, 0x10, 0x0b, 0x0e, 0xf6, 0x2f, 0x5b, 0xd0, 0x73, 0x0c, 0x3d, 0x81, 0xcd, + 0x9e, 0x78, 0x2e, 0x97, 0xb5, 0x88, 0xd0, 0x3e, 0x8d, 0x9d, 0x3b, 0x0b, 0x77, 0x23, 0xe2, 0x85, + 0xec, 0x44, 0xce, 0xec, 0x98, 0x9f, 0xb2, 0x60, 0x62, 0xd9, 0x77, 0xea, 0xb3, 0x4e, 0xc3, 0xf1, + 0x6a, 0x24, 0x58, 0xf2, 0x36, 0x0f, 0xe5, 0x73, 0x5e, 0xe8, 0xe8, 0x73, 0x3e, 0x27, 0x5d, 0xb6, + 0x7a, 0xf2, 0xc7, 0x8f, 0x4a, 0xd2, 0xc9, 0x30, 0x4c, 0x86, 0x73, 0xf1, 0x16, 0x20, 0xbd, 0x95, + 0xe2, 0xe5, 0x15, 0x86, 0x7e, 0x97, 0xb7, 0x57, 0x0c, 0xe2, 0x93, 0xd9, 0x12, 0x6e, 0xea, 0xf3, + 0xb4, 0x37, 0x45, 0x1c, 0x80, 0x25, 0x23, 0xfb, 0x65, 0xc8, 0x0c, 0x9b, 0xd1, 0x59, 0x7b, 0x61, + 0x7f, 0x1c, 0xc6, 0x59, 0xc9, 0x43, 0x6a, 0x06, 0xec, 0x84, 0xce, 0x35, 0x23, 0x04, 0xa8, 0xfd, + 0x05, 0x0b, 0x46, 0x57, 0x13, 0x91, 0x11, 0x2f, 0x32, 0x2b, 0x6d, 0x86, 0xaa, 0xbf, 0xca, 0xa0, + 0x58, 0x60, 0x8f, 0x5c, 0x15, 0xf6, 0xd7, 0x16, 0xc4, 0x91, 0x6c, 0x8e, 0x41, 0x7c, 0x9b, 0x33, + 0xc4, 0xb7, 0x4c, 0x41, 0x56, 0x35, 0x27, 0x4f, 0x7a, 0x43, 0xd7, 0x55, 0x8c, 0xb7, 0x36, 0x32, + 0x6c, 0xcc, 0x86, 0x4f, 0xc5, 0x11, 0x33, 0x10, 0x9c, 0x8c, 0xfa, 0x66, 0xff, 0x7e, 0x01, 0x90, + 0xa2, 0xed, 0x3a, 0x06, 0x5d, 0xba, 0xc4, 0xd1, 0xc4, 0xa0, 0xdb, 0x05, 0xc4, 0xfc, 0x0c, 0x02, + 0xc7, 0x0b, 0x39, 0x5b, 0x57, 0x28, 0xff, 0x0e, 0xe7, 0xc4, 0x30, 0x25, 0x1f, 0xa5, 0x2d, 0xa7, + 0xb8, 0xe1, 0x8c, 0x1a, 0x34, 0xff, 0x91, 0xde, 0x6e, 0xfd, 0x47, 0xfa, 0x3a, 0xbc, 0xae, 0xfc, + 0x8a, 0x05, 0xc3, 0xaa, 0x9b, 0xde, 0x25, 0x3e, 0xf8, 0xaa, 0x3d, 0x39, 0x1b, 0x68, 0x45, 0x6b, + 0x32, 0x3b, 0x58, 0xbe, 0x83, 0xbd, 0x92, 0x75, 0x1a, 0xee, 0x3d, 0xa2, 0x62, 0x96, 0x96, 0xc5, + 0xab, 0x57, 0x01, 0x3d, 0xd8, 0x2f, 0x0f, 0xab, 0x7f, 0x3c, 0x26, 0x7b, 0x5c, 0x84, 0x6e, 0xc9, + 0xa3, 0x89, 0xa9, 0x88, 0x5e, 0x82, 0xde, 0xe6, 0x96, 0x13, 0x92, 0xc4, 0x5b, 0xa5, 0xde, 0x0a, + 0x05, 0x1e, 0xec, 0x97, 0x47, 0x54, 0x01, 0x06, 0xc1, 0x9c, 0xba, 0xfb, 0xc8, 0x7e, 0xe9, 0xc9, + 0xd9, 0x31, 0xb2, 0xdf, 0x5f, 0x5a, 0xd0, 0xb3, 0xea, 0xd7, 0x8f, 0x63, 0x0b, 0x78, 0xcd, 0xd8, + 0x02, 0xce, 0xe6, 0xa5, 0xcb, 0xc8, 0x5d, 0xfd, 0x8b, 0x89, 0xd5, 0x7f, 0x3e, 0x97, 0x43, 0xfb, + 0x85, 0xbf, 0x03, 0x83, 0x2c, 0x09, 0x87, 0x78, 0x97, 0xf5, 0x82, 0xb1, 0xe0, 0xcb, 0x89, 0x05, + 0x3f, 0xaa, 0x91, 0x6a, 0x2b, 0xfd, 0x29, 0xe8, 0x17, 0x0f, 0x7d, 0x92, 0x8f, 0x8d, 0x05, 0x2d, + 0x96, 0x78, 0xfb, 0xc7, 0x8b, 0x60, 0x24, 0xfd, 0x40, 0xbf, 0x6a, 0xc1, 0x74, 0xc0, 0x1d, 0x80, + 0xeb, 0xf3, 0xad, 0xc0, 0xf5, 0x36, 0xab, 0xb5, 0x2d, 0x52, 0x6f, 0x35, 0x5c, 0x6f, 0x73, 0x69, + 0xd3, 0xf3, 0x15, 0x78, 0xe1, 0x2e, 0xa9, 0xb5, 0x98, 0x71, 0xae, 0x43, 0x86, 0x11, 0xe5, 0x48, + 0xff, 0xfc, 0xfd, 0xfd, 0xf2, 0x34, 0x3e, 0x14, 0x6f, 0x7c, 0xc8, 0xb6, 0xa0, 0xdf, 0xb1, 0xe0, + 0x32, 0xcf, 0x85, 0xd1, 0x7d, 0xfb, 0xdb, 0xdc, 0x96, 0x2b, 0x92, 0x55, 0xcc, 0x64, 0x8d, 0x04, + 0x3b, 0xb3, 0x1f, 0x14, 0x1d, 0x7a, 0xb9, 0x72, 0xb8, 0xba, 0xf0, 0x61, 0x1b, 0x67, 0xff, 0xc3, + 0x22, 0x0c, 0x8b, 0x08, 0x70, 0xe2, 0x0c, 0x78, 0xc9, 0x98, 0x12, 0x8f, 0x26, 0xa6, 0xc4, 0xb8, + 0x41, 0x7c, 0x34, 0xdb, 0x7f, 0x08, 0xe3, 0x74, 0x73, 0xbe, 0x46, 0x9c, 0x20, 0x5a, 0x27, 0x0e, + 0x77, 0x0b, 0x2b, 0x1e, 0x7a, 0xf7, 0x57, 0xfa, 0xc9, 0xe5, 0x24, 0x33, 0x9c, 0xe6, 0xff, 0xed, + 0x74, 0xe6, 0x78, 0x30, 0x96, 0x0a, 0xe2, 0xf7, 0x26, 0x94, 0xd4, 0x2b, 0x15, 0xb1, 0xe9, 0xb4, + 0x8f, 0x85, 0x99, 0xe4, 0xc0, 0xd5, 0x5f, 0xf1, 0x0b, 0xa9, 0x98, 0x9d, 0xfd, 0x77, 0x0b, 0x46, + 0x85, 0x7c, 0x10, 0x57, 0x61, 0xc0, 0x09, 0x43, 0x77, 0xd3, 0x23, 0xf5, 0x76, 0x1a, 0xca, 0x54, + 0x35, 0xec, 0xa5, 0xd0, 0x8c, 0x28, 0x89, 0x15, 0x0f, 0x74, 0x8d, 0x3b, 0xdf, 0xed, 0x92, 0x76, + 0xea, 0xc9, 0x14, 0x37, 0x90, 0xee, 0x79, 0xbb, 0x04, 0x8b, 0xf2, 0xe8, 0x93, 0xdc, 0x3b, 0xf2, + 0xba, 0xe7, 0xdf, 0xf1, 0xae, 0xfa, 0xbe, 0x8c, 0xf6, 0xd1, 0x1d, 0xc3, 0x71, 0xe9, 0x13, 0xa9, + 0x8a, 0x63, 0x93, 0x5b, 0x77, 0x51, 0x71, 0x3f, 0x0b, 0x2c, 0xf6, 0xbf, 0xf9, 0x28, 0x3c, 0x44, + 0x04, 0x46, 0x45, 0x78, 0x41, 0x09, 0x13, 0x7d, 0x97, 0x79, 0x95, 0x33, 0x4b, 0xc7, 0x8a, 0xf4, + 0xeb, 0x26, 0x0b, 0x9c, 0xe4, 0x69, 0xff, 0x8c, 0x05, 0xec, 0x81, 0xec, 0x31, 0xc8, 0x23, 0x1f, + 0x31, 0xe5, 0x91, 0xc9, 0xbc, 0x4e, 0xce, 0x11, 0x45, 0x5e, 0xe4, 0x33, 0xab, 0x12, 0xf8, 0x77, + 0xf7, 0x84, 0x4b, 0x4b, 0xe7, 0xfb, 0x87, 0xfd, 0xdf, 0x2d, 0xbe, 0x89, 0xc5, 0xe1, 0x04, 0x3e, + 0x07, 0x03, 0x35, 0xa7, 0xe9, 0xd4, 0x78, 0x86, 0xaa, 0x5c, 0x8d, 0x9e, 0x51, 0x68, 0x7a, 0x4e, + 0x94, 0xe0, 0x1a, 0x2a, 0x19, 0xa6, 0x72, 0x40, 0x82, 0x3b, 0x6a, 0xa5, 0x54, 0x95, 0x53, 0xdb, + 0x30, 0x6c, 0x30, 0x7b, 0xa8, 0xea, 0x8c, 0xcf, 0xf1, 0x23, 0x56, 0x85, 0x55, 0xdd, 0x81, 0x71, + 0x4f, 0xfb, 0x4f, 0x0f, 0x14, 0x79, 0xb9, 0x7c, 0xbc, 0xd3, 0x21, 0xca, 0x4e, 0x1f, 0xed, 0xed, + 0x6d, 0x82, 0x0d, 0x4e, 0x73, 0xb6, 0x7f, 0xc2, 0x82, 0xd3, 0x3a, 0xa1, 0xf6, 0xbc, 0xa7, 0x93, + 0x91, 0x64, 0x1e, 0x06, 0xfc, 0x26, 0x09, 0x9c, 0xc8, 0x0f, 0xc4, 0xa9, 0x71, 0x49, 0x76, 0xfa, + 0x0d, 0x01, 0x3f, 0x10, 0xf9, 0x16, 0x24, 0x77, 0x09, 0xc7, 0xaa, 0x24, 0xbd, 0x7d, 0xb2, 0xce, + 0x08, 0xc5, 0x43, 0x2e, 0xb6, 0x07, 0x30, 0x7b, 0x7b, 0x88, 0x05, 0xc6, 0xfe, 0x33, 0x8b, 0x4f, + 0x2c, 0xbd, 0xe9, 0xe8, 0x6d, 0x18, 0xdb, 0x71, 0xa2, 0xda, 0xd6, 0xc2, 0xdd, 0x66, 0xc0, 0x4d, + 0x4e, 0xb2, 0x9f, 0x9e, 0xe9, 0xd4, 0x4f, 0xda, 0x47, 0xc6, 0x0e, 0x9f, 0x2b, 0x09, 0x66, 0x38, + 0xc5, 0x1e, 0xad, 0xc3, 0x20, 0x83, 0xb1, 0x37, 0x8a, 0x61, 0x3b, 0xd1, 0x20, 0xaf, 0x36, 0xe5, + 0xb2, 0xb0, 0x12, 0xf3, 0xc1, 0x3a, 0x53, 0xfb, 0xcb, 0x45, 0xbe, 0xda, 0x99, 0x28, 0xff, 0x14, + 0xf4, 0x37, 0xfd, 0xfa, 0xdc, 0xd2, 0x3c, 0x16, 0xa3, 0xa0, 0x8e, 0x91, 0x0a, 0x07, 0x63, 0x89, + 0x47, 0x97, 0x60, 0x40, 0xfc, 0x94, 0x26, 0x42, 0xb6, 0x37, 0x0b, 0xba, 0x10, 0x2b, 0x2c, 0x7a, + 0x1e, 0xa0, 0x19, 0xf8, 0xbb, 0x6e, 0x9d, 0xc5, 0x2c, 0x29, 0x9a, 0xde, 0x46, 0x15, 0x85, 0xc1, + 0x1a, 0x15, 0x7a, 0x15, 0x86, 0x5b, 0x5e, 0xc8, 0xc5, 0x11, 0x2d, 0x32, 0xb4, 0xf2, 0x83, 0xb9, + 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x66, 0xa0, 0x2f, 0x72, 0x98, 0xf7, 0x4c, 0x6f, 0xbe, 0x53, 0xf0, + 0x1a, 0xa5, 0xd0, 0x93, 0x21, 0xd1, 0x02, 0x58, 0x14, 0x44, 0x6f, 0xca, 0xe7, 0xc2, 0x7c, 0x63, + 0x17, 0xde, 0xf8, 0xdd, 0x1d, 0x02, 0xda, 0x63, 0x61, 0xe1, 0xe5, 0x6f, 0xf0, 0x42, 0xaf, 0x00, + 0x90, 0xbb, 0x11, 0x09, 0x3c, 0xa7, 0xa1, 0x7c, 0xde, 0x94, 0x5c, 0x30, 0xef, 0xaf, 0xfa, 0xd1, + 0xcd, 0x90, 0x2c, 0x28, 0x0a, 0xac, 0x51, 0xdb, 0xbf, 0x53, 0x02, 0x88, 0xe5, 0x76, 0x74, 0x2f, + 0xb5, 0x71, 0x3d, 0xdb, 0x5e, 0xd2, 0x3f, 0xba, 0x5d, 0x0b, 0x7d, 0x9f, 0x05, 0x83, 0x22, 0x34, + 0x0b, 0x1b, 0xa1, 0x42, 0xfb, 0x8d, 0xd3, 0x8c, 0x10, 0x43, 0x4b, 0xf0, 0x26, 0xbc, 0x20, 0x67, + 0xa8, 0x86, 0xe9, 0xd8, 0x0a, 0xbd, 0x62, 0xf4, 0x7e, 0x79, 0x55, 0x2c, 0x1a, 0x5d, 0xa9, 0xae, + 0x8a, 0x25, 0x76, 0x46, 0xe8, 0xb7, 0xc4, 0x9b, 0xc6, 0x2d, 0xb1, 0x27, 0xff, 0x3d, 0xa4, 0x21, + 0xbe, 0x76, 0xba, 0x20, 0xa2, 0x8a, 0x1e, 0x1b, 0xa1, 0x37, 0xff, 0x11, 0x9f, 0x76, 0x4f, 0xea, + 0x10, 0x17, 0xe1, 0x33, 0x30, 0x5a, 0x37, 0x85, 0x00, 0x31, 0x13, 0x9f, 0xcc, 0xe3, 0x9b, 0x90, + 0x19, 0xe2, 0x63, 0x3f, 0x81, 0xc0, 0x49, 0xc6, 0xa8, 0xc2, 0x43, 0x65, 0x2c, 0x79, 0x1b, 0xbe, + 0x78, 0x11, 0x62, 0xe7, 0x8e, 0xe5, 0x5e, 0x18, 0x91, 0x1d, 0x4a, 0x19, 0x9f, 0xee, 0xab, 0xa2, + 0x2c, 0x56, 0x5c, 0xd0, 0xeb, 0xd0, 0xc7, 0x5e, 0x71, 0x85, 0x93, 0x03, 0xf9, 0x1a, 0x67, 0x33, + 0x66, 0x60, 0xbc, 0x20, 0xd9, 0xdf, 0x10, 0x0b, 0x0e, 0xe8, 0x9a, 0x7c, 0x23, 0x19, 0x2e, 0x79, + 0x37, 0x43, 0xc2, 0xde, 0x48, 0x96, 0x66, 0x1f, 0x8f, 0x9f, 0x3f, 0x72, 0x78, 0x66, 0xca, 0x44, + 0xa3, 0x24, 0x95, 0xa2, 0xc4, 0x7f, 0x99, 0x89, 0x51, 0x44, 0x38, 0xca, 0x6c, 0x9e, 0x99, 0xad, + 0x31, 0xee, 0xce, 0x5b, 0x26, 0x0b, 0x9c, 0xe4, 0x49, 0x25, 0x52, 0xbe, 0xea, 0xc5, 0x9b, 0x92, + 0x4e, 0x7b, 0x07, 0xbf, 0x88, 0xb3, 0xd3, 0x88, 0x43, 0xb0, 0x28, 0x7f, 0xac, 0xe2, 0xc1, 0x94, + 0x07, 0x63, 0xc9, 0x25, 0xfa, 0x50, 0xc5, 0x91, 0x3f, 0xe9, 0x81, 0x11, 0x73, 0x4a, 0xa1, 0xcb, + 0x50, 0x12, 0x4c, 0x54, 0x36, 0x13, 0xb5, 0x4a, 0x56, 0x24, 0x02, 0xc7, 0x34, 0x2c, 0x89, 0x0d, + 0x2b, 0xae, 0x39, 0x11, 0xc7, 0x49, 0x6c, 0x14, 0x06, 0x6b, 0x54, 0xf4, 0x62, 0xb5, 0xee, 0xfb, + 0x91, 0x3a, 0x90, 0xd4, 0xbc, 0x9b, 0x65, 0x50, 0x2c, 0xb0, 0xf4, 0x20, 0xda, 0x26, 0x81, 0x47, + 0x1a, 0x66, 0x14, 0x71, 0x75, 0x10, 0x5d, 0xd7, 0x91, 0xd8, 0xa4, 0xa5, 0xc7, 0xa9, 0x1f, 0xb2, + 0x89, 0x2c, 0xae, 0x6f, 0xb1, 0x53, 0x76, 0x95, 0x3f, 0x2f, 0x97, 0x78, 0xf4, 0x71, 0x38, 0xad, + 0x22, 0x76, 0x61, 0x6e, 0xcd, 0x90, 0x35, 0xf6, 0x19, 0xda, 0x96, 0xd3, 0x73, 0xd9, 0x64, 0x38, + 0xaf, 0x3c, 0x7a, 0x0d, 0x46, 0x84, 0x88, 0x2f, 0x39, 0xf6, 0x9b, 0x1e, 0x46, 0xd7, 0x0d, 0x2c, + 0x4e, 0x50, 0xcb, 0x38, 0xe8, 0x4c, 0xca, 0x96, 0x1c, 0x06, 0xd2, 0x71, 0xd0, 0x75, 0x3c, 0x4e, + 0x95, 0x40, 0x33, 0x30, 0xca, 0x65, 0x30, 0xd7, 0xdb, 0xe4, 0x63, 0x22, 0x9e, 0x7c, 0xa9, 0x25, + 0x75, 0xc3, 0x44, 0xe3, 0x24, 0x3d, 0x7a, 0x19, 0x86, 0x9c, 0xa0, 0xb6, 0xe5, 0x46, 0xa4, 0x16, + 0xb5, 0x02, 0xfe, 0x16, 0x4c, 0x73, 0xd1, 0x9a, 0xd1, 0x70, 0xd8, 0xa0, 0xb4, 0xef, 0xc1, 0x44, + 0x46, 0xdc, 0x09, 0x3a, 0x71, 0x9c, 0xa6, 0x2b, 0xbf, 0x29, 0xe1, 0x07, 0x3d, 0x53, 0x59, 0x92, + 0x5f, 0xa3, 0x51, 0xd1, 0xd9, 0xc9, 0xe2, 0x53, 0x68, 0x89, 0x57, 0xd5, 0xec, 0x5c, 0x94, 0x08, + 0x1c, 0xd3, 0xd8, 0xff, 0xa9, 0x00, 0xa3, 0x19, 0xb6, 0x15, 0x96, 0xfc, 0x33, 0x71, 0x49, 0x89, + 0x73, 0x7d, 0x9a, 0x61, 0xf5, 0x0b, 0x87, 0x08, 0xab, 0x5f, 0xec, 0x14, 0x56, 0xbf, 0xe7, 0x9d, + 0x84, 0xd5, 0x37, 0x7b, 0xac, 0xb7, 0xab, 0x1e, 0xcb, 0x08, 0xc5, 0xdf, 0x77, 0xc8, 0x50, 0xfc, + 0x46, 0xa7, 0xf7, 0x77, 0xd1, 0xe9, 0x3f, 0x52, 0x80, 0xb1, 0xa4, 0x2b, 0xe9, 0x31, 0xe8, 0x6d, + 0x5f, 0x37, 0xf4, 0xb6, 0x97, 0xba, 0x79, 0xa2, 0x9b, 0xab, 0xc3, 0xc5, 0x09, 0x1d, 0xee, 0xd3, + 0x5d, 0x71, 0x6b, 0xaf, 0xcf, 0xfd, 0xc9, 0x02, 0x9c, 0xcc, 0x7c, 0x23, 0x7c, 0x0c, 0x7d, 0x73, + 0xc3, 0xe8, 0x9b, 0xe7, 0xba, 0x7e, 0xbe, 0x9c, 0xdb, 0x41, 0xb7, 0x13, 0x1d, 0x74, 0xb9, 0x7b, + 0x96, 0xed, 0x7b, 0xe9, 0xeb, 0x45, 0x38, 0x9f, 0x59, 0x2e, 0x56, 0x7b, 0x2e, 0x1a, 0x6a, 0xcf, + 0xe7, 0x13, 0x6a, 0x4f, 0xbb, 0x7d, 0xe9, 0xa3, 0xd1, 0x83, 0x8a, 0x67, 0xbc, 0x2c, 0x18, 0xc1, + 0x03, 0xea, 0x40, 0x8d, 0x67, 0xbc, 0x8a, 0x11, 0x36, 0xf9, 0x7e, 0x3b, 0xe9, 0x3e, 0x7f, 0xdb, + 0x82, 0x33, 0x99, 0x63, 0x73, 0x0c, 0xba, 0xae, 0x55, 0x53, 0xd7, 0xf5, 0x54, 0xd7, 0xb3, 0x35, + 0x47, 0xf9, 0xf5, 0xd3, 0xbd, 0x39, 0xdf, 0xc2, 0x6e, 0xf2, 0x37, 0x60, 0xd0, 0xa9, 0xd5, 0x48, + 0x18, 0xae, 0xf8, 0x75, 0x15, 0x81, 0xfb, 0x39, 0x76, 0xcf, 0x8a, 0xc1, 0x07, 0xfb, 0xe5, 0xa9, + 0x24, 0x8b, 0x18, 0x8d, 0x75, 0x0e, 0xe8, 0x93, 0x30, 0x10, 0x8a, 0x73, 0x53, 0x8c, 0xfd, 0x0b, + 0x5d, 0x76, 0x8e, 0xb3, 0x4e, 0x1a, 0x66, 0xa8, 0x27, 0xa5, 0xa9, 0x50, 0x2c, 0xcd, 0xb0, 0x30, + 0x85, 0x23, 0x0d, 0x0b, 0xf3, 0x3c, 0xc0, 0xae, 0xba, 0x0c, 0x24, 0xf5, 0x0f, 0xda, 0x35, 0x41, + 0xa3, 0x42, 0x1f, 0x85, 0xb1, 0x90, 0xc7, 0x42, 0x9c, 0x6b, 0x38, 0x21, 0x7b, 0x6d, 0x23, 0x66, + 0x21, 0x0b, 0x27, 0x55, 0x4d, 0xe0, 0x70, 0x8a, 0x1a, 0x2d, 0xca, 0x5a, 0x59, 0xe0, 0x46, 0x3e, + 0x31, 0x2f, 0xc6, 0x35, 0x8a, 0xd4, 0xe3, 0x27, 0x92, 0xdd, 0xcf, 0x3a, 0x5e, 0x2b, 0x89, 0x3e, + 0x09, 0x40, 0xa7, 0x8f, 0xd0, 0x43, 0xf4, 0xe7, 0x6f, 0x9e, 0x74, 0x57, 0xa9, 0x67, 0x3a, 0x37, + 0xb3, 0x97, 0xb7, 0xf3, 0x8a, 0x09, 0xd6, 0x18, 0x22, 0x07, 0x86, 0xe3, 0x7f, 0x71, 0x66, 0xde, + 0x4b, 0xb9, 0x35, 0x24, 0x99, 0x33, 0x95, 0xf7, 0xbc, 0xce, 0x02, 0x9b, 0x1c, 0xed, 0x7f, 0x37, + 0x00, 0x8f, 0xb4, 0xd9, 0x86, 0xd1, 0x8c, 0x69, 0xea, 0x7d, 0x26, 0x79, 0x7f, 0x9f, 0xca, 0x2c, + 0x6c, 0x5c, 0xe8, 0x13, 0xb3, 0xbd, 0xf0, 0x8e, 0x67, 0xfb, 0x0f, 0x59, 0x9a, 0x66, 0x85, 0x3b, + 0x95, 0x7e, 0xe4, 0x90, 0xc7, 0xcb, 0x11, 0xaa, 0x5a, 0x36, 0x32, 0xf4, 0x15, 0xcf, 0x77, 0xdd, + 0x9c, 0xee, 0x15, 0x18, 0x5f, 0xcd, 0x0e, 0x00, 0xcc, 0x55, 0x19, 0x57, 0x0f, 0xfb, 0xfd, 0xc7, + 0x15, 0x0c, 0xf8, 0xf7, 0x2d, 0x38, 0x93, 0x02, 0xf3, 0x36, 0x90, 0x50, 0xc4, 0xa8, 0x5a, 0x7d, + 0xc7, 0x8d, 0x97, 0x0c, 0xf9, 0x37, 0x5c, 0x13, 0xdf, 0x70, 0x26, 0x97, 0x2e, 0xd9, 0xf4, 0x1f, + 0xfc, 0xa3, 0xf2, 0x04, 0xab, 0xc0, 0x24, 0xc4, 0xf9, 0x4d, 0x3f, 0xde, 0x8b, 0xff, 0x37, 0x27, + 0xf6, 0xf1, 0xd4, 0x32, 0x9c, 0x6f, 0xdf, 0xd5, 0x87, 0x7a, 0x9e, 0xfc, 0x7b, 0x16, 0x9c, 0x6b, + 0x1b, 0x03, 0xe7, 0x5b, 0x50, 0xce, 0xb5, 0x3f, 0x6f, 0xc1, 0xa3, 0x99, 0x25, 0x0c, 0xef, 0xb8, + 0xcb, 0x50, 0xaa, 0x25, 0xf2, 0xa1, 0xc6, 0xd1, 0x20, 0x54, 0x2e, 0xd4, 0x98, 0xc6, 0x70, 0x82, + 0x2b, 0x74, 0x74, 0x82, 0xfb, 0x0d, 0x0b, 0x52, 0x67, 0xd5, 0x31, 0x08, 0x4d, 0x4b, 0xa6, 0xd0, + 0xf4, 0x78, 0x37, 0xbd, 0x99, 0x23, 0x2f, 0xfd, 0xc5, 0x28, 0x9c, 0xca, 0x79, 0x5d, 0xb8, 0x0b, + 0xe3, 0x9b, 0x35, 0x62, 0x3e, 0x27, 0x6f, 0x17, 0x66, 0xa9, 0xed, 0xdb, 0x73, 0x9e, 0x86, 0x36, + 0x45, 0x82, 0xd3, 0x55, 0xa0, 0xcf, 0x5b, 0x70, 0xc2, 0xb9, 0x13, 0x2e, 0x50, 0xe1, 0xd7, 0xad, + 0xcd, 0x36, 0xfc, 0xda, 0x36, 0x95, 0x2c, 0xe4, 0xb2, 0x7a, 0x31, 0x53, 0x21, 0x79, 0xbb, 0x9a, + 0xa2, 0x37, 0xaa, 0x67, 0x49, 0xc7, 0xb3, 0xa8, 0x70, 0x66, 0x5d, 0x08, 0x8b, 0xfc, 0x28, 0xf4, + 0x6a, 0xdd, 0x26, 0xe0, 0x41, 0xd6, 0x33, 0x50, 0x2e, 0xcd, 0x49, 0x0c, 0x56, 0x7c, 0xd0, 0xa7, + 0xa1, 0xb4, 0x29, 0xdf, 0x36, 0x67, 0x48, 0x8b, 0x71, 0x47, 0xb6, 0x7f, 0xf1, 0xcd, 0xbd, 0x0a, + 0x14, 0x11, 0x8e, 0x99, 0xa2, 0xd7, 0xa0, 0xe8, 0x6d, 0x84, 0xed, 0xf2, 0x76, 0x27, 0xdc, 0x47, + 0x79, 0x58, 0x91, 0xd5, 0xc5, 0x2a, 0xa6, 0x05, 0xd1, 0x35, 0x28, 0x06, 0xeb, 0x75, 0xa1, 0x4d, + 0xcf, 0x5c, 0xa4, 0x78, 0x76, 0x3e, 0xa7, 0x55, 0x8c, 0x13, 0x9e, 0x9d, 0xc7, 0x94, 0x05, 0xaa, + 0x40, 0x2f, 0x7b, 0x92, 0x27, 0x64, 0xb3, 0xcc, 0x5b, 0x68, 0x9b, 0xa7, 0xad, 0x3c, 0xf6, 0x08, + 0x23, 0xc0, 0x9c, 0x11, 0x5a, 0x83, 0xbe, 0x1a, 0xcb, 0xf1, 0x2c, 0x84, 0xb1, 0xf7, 0x67, 0xea, + 0xcd, 0xdb, 0x24, 0xbf, 0x16, 0x6a, 0x64, 0x46, 0x81, 0x05, 0x2f, 0xc6, 0x95, 0x34, 0xb7, 0x36, + 0x42, 0xa6, 0x77, 0xcb, 0xe3, 0xda, 0x26, 0xa7, 0xbb, 0xe0, 0xca, 0x28, 0xb0, 0xe0, 0x85, 0x5e, + 0x81, 0xc2, 0x46, 0x4d, 0x3c, 0xb7, 0xcb, 0x54, 0xa0, 0x9b, 0x91, 0x61, 0x66, 0xfb, 0xee, 0xef, + 0x97, 0x0b, 0x8b, 0x73, 0xb8, 0xb0, 0x51, 0x43, 0xab, 0xd0, 0xbf, 0xc1, 0x63, 0x49, 0x08, 0x1d, + 0xf9, 0x93, 0xd9, 0x61, 0x2e, 0x52, 0xe1, 0x26, 0xf8, 0xd3, 0x2d, 0x81, 0xc0, 0x92, 0x09, 0x4b, + 0xd7, 0xa1, 0x62, 0x62, 0x88, 0x90, 0x7c, 0xd3, 0x87, 0x8b, 0x63, 0xc2, 0x65, 0xe5, 0x38, 0xb2, + 0x06, 0xd6, 0x38, 0xd2, 0x59, 0xed, 0xdc, 0x6b, 0x05, 0x2c, 0x5e, 0xbb, 0x88, 0xdd, 0x94, 0x39, + 0xab, 0x67, 0x24, 0x51, 0xbb, 0x59, 0xad, 0x88, 0x70, 0xcc, 0x14, 0x6d, 0xc3, 0xf0, 0x6e, 0xd8, + 0xdc, 0x22, 0x72, 0x49, 0xb3, 0x50, 0x4e, 0x39, 0xb2, 0xde, 0x2d, 0x41, 0xe8, 0x06, 0x51, 0xcb, + 0x69, 0xa4, 0x76, 0x21, 0x26, 0x97, 0xdf, 0xd2, 0x99, 0x61, 0x93, 0x37, 0xed, 0xfe, 0xb7, 0x5b, + 0xfe, 0xfa, 0x5e, 0x44, 0x44, 0x24, 0xbd, 0xcc, 0xee, 0x7f, 0x83, 0x93, 0xa4, 0xbb, 0x5f, 0x20, + 0xb0, 0x64, 0x82, 0x6e, 0x89, 0xee, 0x61, 0xbb, 0xe7, 0x58, 0x7e, 0x98, 0xde, 0x19, 0x49, 0x94, + 0xd3, 0x29, 0x6c, 0xb7, 0x8c, 0x59, 0xb1, 0x5d, 0xb2, 0xb9, 0xe5, 0x47, 0xbe, 0x97, 0xd8, 0xa1, + 0xc7, 0xf3, 0x77, 0xc9, 0x4a, 0x06, 0x7d, 0x7a, 0x97, 0xcc, 0xa2, 0xc2, 0x99, 0x75, 0xa1, 0x3a, + 0x8c, 0x34, 0xfd, 0x20, 0xba, 0xe3, 0x07, 0x72, 0x7e, 0xa1, 0x36, 0x3a, 0x3e, 0x83, 0x52, 0xd4, + 0xc8, 0x82, 0x54, 0x9a, 0x18, 0x9c, 0xe0, 0x89, 0x3e, 0x06, 0xfd, 0x61, 0xcd, 0x69, 0x90, 0xa5, + 0x1b, 0x93, 0x13, 0xf9, 0xc7, 0x4f, 0x95, 0x93, 0xe4, 0xcc, 0x2e, 0x1e, 0x0a, 0x84, 0x93, 0x60, + 0xc9, 0x0e, 0x2d, 0x42, 0x2f, 0x4b, 0x83, 0xc9, 0xc2, 0x3e, 0xe6, 0x44, 0x1b, 0x4e, 0x39, 0xf3, + 0xf3, 0xbd, 0x89, 0x81, 0x31, 0x2f, 0x4e, 0xd7, 0x80, 0xb8, 0xea, 0xfa, 0xe1, 0xe4, 0xc9, 0xfc, + 0x35, 0x20, 0x6e, 0xc8, 0x37, 0xaa, 0xed, 0xd6, 0x80, 0x22, 0xc2, 0x31, 0x53, 0xba, 0x33, 0xd3, + 0xdd, 0xf4, 0x54, 0x1b, 0x2f, 0xb4, 0xdc, 0xbd, 0x94, 0xed, 0xcc, 0x74, 0x27, 0xa5, 0x2c, 0xec, + 0x3f, 0xee, 0x4f, 0xcb, 0x2c, 0x4c, 0x39, 0xf2, 0xbf, 0x5b, 0x29, 0xbb, 0xf9, 0x07, 0xba, 0xd5, + 0xd5, 0x1e, 0xe1, 0xb5, 0xee, 0xf3, 0x16, 0x9c, 0x6a, 0x66, 0x7e, 0x88, 0x10, 0x00, 0xba, 0x53, + 0xf9, 0xf2, 0x4f, 0x57, 0x21, 0x42, 0xb3, 0xf1, 0x38, 0xa7, 0xa6, 0xe4, 0xd5, 0xb9, 0xf8, 0x8e, + 0xaf, 0xce, 0x2b, 0x30, 0x50, 0xe3, 0xf7, 0x1c, 0x19, 0xda, 0xba, 0xab, 0x00, 0x77, 0x4c, 0x94, + 0x10, 0x17, 0xa4, 0x0d, 0xac, 0x58, 0xa0, 0x1f, 0xb6, 0xe0, 0x5c, 0xb2, 0xe9, 0x98, 0x30, 0xb4, + 0x88, 0x2b, 0xca, 0xf5, 0x32, 0x8b, 0xe2, 0xfb, 0x53, 0xf2, 0xbf, 0x41, 0x7c, 0xd0, 0x89, 0x00, + 0xb7, 0xaf, 0x0c, 0xcd, 0x67, 0x28, 0x86, 0xfa, 0x4c, 0x63, 0x58, 0x17, 0xca, 0xa1, 0x17, 0x61, + 0x68, 0xc7, 0x6f, 0x79, 0x91, 0x70, 0x5a, 0x13, 0x0e, 0x34, 0xcc, 0x71, 0x64, 0x45, 0x83, 0x63, + 0x83, 0x2a, 0xa1, 0x52, 0x1a, 0x78, 0x60, 0x95, 0xd2, 0x5b, 0x30, 0xe4, 0x69, 0x5e, 0xd6, 0x42, + 0x1e, 0xb8, 0x98, 0x1f, 0x13, 0x58, 0xf7, 0xc9, 0xe6, 0xad, 0xd4, 0x21, 0xd8, 0xe0, 0x76, 0xbc, + 0xde, 0x6c, 0x3f, 0x5f, 0xc8, 0x10, 0xea, 0xb9, 0x5a, 0xe9, 0xc3, 0xa6, 0x5a, 0xe9, 0x62, 0x52, + 0xad, 0x94, 0x32, 0x84, 0x18, 0x1a, 0xa5, 0xee, 0x53, 0x64, 0x75, 0x1d, 0x57, 0xf4, 0xbb, 0x2d, + 0x38, 0xcd, 0x34, 0xeb, 0xb4, 0x82, 0x77, 0xac, 0x4d, 0x7f, 0xe4, 0xfe, 0x7e, 0xf9, 0xf4, 0x72, + 0x36, 0x3b, 0x9c, 0x57, 0x8f, 0xdd, 0x80, 0x0b, 0x9d, 0x8e, 0x46, 0xe6, 0x41, 0x59, 0x57, 0xa6, + 0xf7, 0xd8, 0x83, 0xb2, 0xbe, 0x34, 0x8f, 0x19, 0xa6, 0xdb, 0xa8, 0x59, 0xf6, 0x7f, 0xb0, 0xa0, + 0x58, 0xf1, 0xeb, 0xc7, 0x70, 0xe9, 0xfe, 0x88, 0x71, 0xe9, 0x7e, 0x24, 0xfb, 0x50, 0xae, 0xe7, + 0x9a, 0x92, 0x16, 0x12, 0xa6, 0xa4, 0x73, 0x79, 0x0c, 0xda, 0x1b, 0x8e, 0x7e, 0xaa, 0x08, 0x83, + 0x15, 0xbf, 0xae, 0x9e, 0x2f, 0xfc, 0xe3, 0x07, 0x79, 0xbe, 0x90, 0x9b, 0xf4, 0x44, 0xe3, 0xcc, + 0x1c, 0x2f, 0xe5, 0xcb, 0xed, 0x6f, 0xb1, 0x57, 0x0c, 0xb7, 0x89, 0xbb, 0xb9, 0x15, 0x91, 0x7a, + 0xf2, 0x73, 0x8e, 0xef, 0x15, 0xc3, 0x1f, 0x17, 0x60, 0x34, 0x51, 0x3b, 0x6a, 0xc0, 0x70, 0x43, + 0x37, 0x54, 0x88, 0x79, 0xfa, 0x40, 0x36, 0x0e, 0xe1, 0x05, 0xae, 0x81, 0xb0, 0xc9, 0x1c, 0x4d, + 0x03, 0x28, 0xcb, 0xbd, 0x54, 0x57, 0xb3, 0x9b, 0x87, 0x32, 0xed, 0x87, 0x58, 0xa3, 0x40, 0x2f, + 0xc1, 0x60, 0xe4, 0x37, 0xfd, 0x86, 0xbf, 0xb9, 0x77, 0x9d, 0xc8, 0x80, 0x6a, 0xca, 0xb7, 0x73, + 0x2d, 0x46, 0x61, 0x9d, 0x0e, 0xdd, 0x85, 0x71, 0xc5, 0xa4, 0x7a, 0x04, 0xc6, 0x1b, 0xa6, 0xd9, + 0x58, 0x4d, 0x72, 0xc4, 0xe9, 0x4a, 0xec, 0x9f, 0x2d, 0xf2, 0x2e, 0xf6, 0x22, 0xf7, 0xbd, 0xd5, + 0xf0, 0xee, 0x5e, 0x0d, 0x5f, 0xb7, 0x60, 0x8c, 0xd6, 0xce, 0x1c, 0xd7, 0xa4, 0xa8, 0xa1, 0x22, + 0xa1, 0x5b, 0x6d, 0x22, 0xa1, 0x5f, 0xa4, 0xbb, 0x66, 0xdd, 0x6f, 0x45, 0x42, 0x7f, 0xa8, 0x6d, + 0x8b, 0x14, 0x8a, 0x05, 0x56, 0xd0, 0x91, 0x20, 0x10, 0x8f, 0x6d, 0x75, 0x3a, 0x12, 0x04, 0x58, + 0x60, 0x65, 0xa0, 0xf4, 0x9e, 0xec, 0x40, 0xe9, 0x3c, 0xde, 0xad, 0x70, 0x71, 0x12, 0x42, 0x9f, + 0x16, 0xef, 0x56, 0xfa, 0x3e, 0xc5, 0x34, 0xf6, 0x57, 0x8b, 0x30, 0x54, 0xf1, 0xeb, 0xb1, 0xd5, + 0xfe, 0x45, 0xc3, 0x6a, 0x7f, 0x21, 0x61, 0xb5, 0x1f, 0xd3, 0x69, 0xdf, 0xb3, 0xd1, 0x7f, 0xb3, + 0x6c, 0xf4, 0xbf, 0x6e, 0xb1, 0x51, 0x9b, 0x5f, 0xad, 0x72, 0x3f, 0x48, 0x74, 0x05, 0x06, 0xd9, + 0x06, 0xc3, 0x5e, 0x77, 0x4b, 0x53, 0x36, 0x4b, 0x5c, 0xb6, 0x1a, 0x83, 0xb1, 0x4e, 0x83, 0x2e, + 0xc1, 0x40, 0x48, 0x9c, 0xa0, 0xb6, 0xa5, 0x76, 0x57, 0x61, 0x77, 0xe6, 0x30, 0xac, 0xb0, 0xe8, + 0x8d, 0x38, 0xd4, 0x6a, 0x31, 0xff, 0xb5, 0xa8, 0xde, 0x1e, 0xbe, 0x44, 0xf2, 0xe3, 0xab, 0xda, + 0xb7, 0x01, 0xa5, 0xe9, 0xbb, 0x08, 0x06, 0x58, 0x36, 0x83, 0x01, 0x96, 0x52, 0x81, 0x00, 0xff, + 0xca, 0x82, 0x91, 0x8a, 0x5f, 0xa7, 0x4b, 0xf7, 0xdb, 0x69, 0x9d, 0xea, 0x71, 0xa6, 0xfb, 0xda, + 0xc4, 0x99, 0x7e, 0x0c, 0x7a, 0x2b, 0x7e, 0xbd, 0x43, 0xc0, 0xc2, 0xbf, 0x61, 0x41, 0x7f, 0xc5, + 0xaf, 0x1f, 0x83, 0x69, 0xe2, 0xc3, 0xa6, 0x69, 0xe2, 0x74, 0xce, 0xbc, 0xc9, 0xb1, 0x46, 0xfc, + 0xff, 0x3d, 0x30, 0x4c, 0xdb, 0xe9, 0x6f, 0xca, 0xa1, 0x34, 0xba, 0xcd, 0xea, 0xa2, 0xdb, 0xa8, + 0x14, 0xee, 0x37, 0x1a, 0xfe, 0x9d, 0xe4, 0xb0, 0x2e, 0x32, 0x28, 0x16, 0x58, 0xf4, 0x2c, 0x0c, + 0x34, 0x03, 0xb2, 0xeb, 0xfa, 0x42, 0xbc, 0xd5, 0x0c, 0x3d, 0x15, 0x01, 0xc7, 0x8a, 0x82, 0x5e, + 0x4d, 0x43, 0xd7, 0xa3, 0x47, 0x79, 0xcd, 0xf7, 0xea, 0x5c, 0x7b, 0x5f, 0x14, 0xc9, 0x50, 0x34, + 0x38, 0x36, 0xa8, 0xd0, 0x6d, 0x28, 0xb1, 0xff, 0x6c, 0xdb, 0x39, 0x7c, 0x1a, 0x66, 0x91, 0x1e, + 0x52, 0x30, 0xc0, 0x31, 0x2f, 0xf4, 0x3c, 0x40, 0x24, 0x13, 0x0a, 0x84, 0x22, 0x70, 0x9d, 0xba, + 0x0a, 0xa8, 0x54, 0x03, 0x21, 0xd6, 0xa8, 0xd0, 0x33, 0x50, 0x8a, 0x1c, 0xb7, 0xb1, 0xec, 0x7a, + 0xcc, 0xfe, 0x4b, 0xdb, 0x2f, 0xb2, 0x34, 0x0a, 0x20, 0x8e, 0xf1, 0x54, 0x14, 0x63, 0x41, 0x4d, + 0x78, 0x12, 0xfa, 0x01, 0x46, 0xcd, 0x44, 0xb1, 0x65, 0x05, 0xc5, 0x1a, 0x05, 0xda, 0x82, 0xb3, + 0xae, 0xc7, 0x12, 0x87, 0x90, 0xea, 0xb6, 0xdb, 0x5c, 0x5b, 0xae, 0xde, 0x22, 0x81, 0xbb, 0xb1, + 0x37, 0xeb, 0xd4, 0xb6, 0x89, 0x27, 0x13, 0xec, 0xca, 0xbc, 0xeb, 0x67, 0x97, 0xda, 0xd0, 0xe2, + 0xb6, 0x9c, 0xec, 0x17, 0xd8, 0x7c, 0xbf, 0x51, 0x45, 0x4f, 0x1b, 0x5b, 0xc7, 0x29, 0x7d, 0xeb, + 0x38, 0xd8, 0x2f, 0xf7, 0xdd, 0xa8, 0x6a, 0x31, 0x39, 0x5e, 0x86, 0x93, 0x15, 0xbf, 0x5e, 0xf1, + 0x83, 0x68, 0xd1, 0x0f, 0xee, 0x38, 0x41, 0x5d, 0x4e, 0xaf, 0xb2, 0x8c, 0x4a, 0x42, 0xf7, 0xcf, + 0x5e, 0xbe, 0xbb, 0x18, 0x11, 0x47, 0x5e, 0x60, 0x12, 0xdb, 0x21, 0xdf, 0xd2, 0xd5, 0x98, 0xec, + 0xa0, 0x52, 0xef, 0x5c, 0x75, 0x22, 0x82, 0x6e, 0xb0, 0x14, 0xfa, 0xf1, 0x31, 0x2a, 0x8a, 0x3f, + 0xa5, 0xa5, 0xd0, 0x8f, 0x91, 0x99, 0xe7, 0xae, 0x59, 0xde, 0xfe, 0x9c, 0xa8, 0x84, 0xeb, 0x01, + 0xb8, 0xbf, 0x62, 0x37, 0x39, 0xa8, 0x65, 0x6e, 0x8e, 0x42, 0x7e, 0x52, 0x07, 0x6e, 0x79, 0x6d, + 0x9b, 0x9b, 0xc3, 0xfe, 0x4e, 0x38, 0x95, 0xac, 0xbe, 0xeb, 0x44, 0xd8, 0x73, 0x30, 0x1e, 0xe8, + 0x05, 0xb5, 0x44, 0x67, 0x27, 0x79, 0x3e, 0x85, 0x04, 0x12, 0xa7, 0xe9, 0xed, 0x97, 0x60, 0x9c, + 0xde, 0x3d, 0x95, 0x20, 0xc7, 0x7a, 0xb9, 0x73, 0x78, 0x96, 0xff, 0xd8, 0xcb, 0x0e, 0xa2, 0x44, + 0xd6, 0x1b, 0xf4, 0x29, 0x18, 0x09, 0xc9, 0xb2, 0xeb, 0xb5, 0xee, 0x4a, 0xed, 0x53, 0x9b, 0x47, + 0xa4, 0xd5, 0x05, 0x9d, 0x92, 0xeb, 0xb0, 0x4d, 0x18, 0x4e, 0x70, 0x43, 0x3b, 0x30, 0x72, 0xc7, + 0xf5, 0xea, 0xfe, 0x9d, 0x50, 0xf2, 0x1f, 0xc8, 0x57, 0x65, 0xdf, 0xe6, 0x94, 0x89, 0x36, 0x1a, + 0xd5, 0xdd, 0x36, 0x98, 0xe1, 0x04, 0x73, 0xba, 0xd8, 0x83, 0x96, 0x37, 0x13, 0xde, 0x0c, 0x09, + 0x7f, 0x16, 0x28, 0x16, 0x3b, 0x96, 0x40, 0x1c, 0xe3, 0xe9, 0x62, 0x67, 0x7f, 0xae, 0x06, 0x7e, + 0x8b, 0xa7, 0x58, 0x11, 0x8b, 0x1d, 0x2b, 0x28, 0xd6, 0x28, 0xe8, 0x66, 0xc8, 0xfe, 0xad, 0xfa, + 0x1e, 0xf6, 0xfd, 0x48, 0x6e, 0x9f, 0x2c, 0x45, 0x98, 0x06, 0xc7, 0x06, 0x15, 0x5a, 0x04, 0x14, + 0xb6, 0x9a, 0xcd, 0x06, 0xf3, 0x4e, 0x73, 0x1a, 0x8c, 0x15, 0x77, 0xdb, 0x29, 0xf2, 0x10, 0xd1, + 0xd5, 0x14, 0x16, 0x67, 0x94, 0xa0, 0xe7, 0xe2, 0x86, 0x68, 0x6a, 0x2f, 0x6b, 0x2a, 0x37, 0x7b, + 0x55, 0x79, 0x3b, 0x25, 0x0e, 0x2d, 0x40, 0x7f, 0xb8, 0x17, 0xd6, 0xa2, 0x46, 0xd8, 0x2e, 0x21, + 0x5b, 0x95, 0x91, 0x68, 0xf9, 0x40, 0x79, 0x11, 0x2c, 0xcb, 0xa2, 0x1a, 0x4c, 0x08, 0x8e, 0x73, + 0x5b, 0x8e, 0xa7, 0xd2, 0x44, 0x71, 0x27, 0xfd, 0x2b, 0xf7, 0xf7, 0xcb, 0x13, 0xa2, 0x66, 0x1d, + 0x7d, 0xb0, 0x5f, 0xa6, 0x8b, 0x23, 0x03, 0x83, 0xb3, 0xb8, 0xf1, 0xc9, 0x57, 0xab, 0xf9, 0x3b, + 0xcd, 0x4a, 0xe0, 0x6f, 0xb8, 0x0d, 0xd2, 0xce, 0x74, 0x58, 0x35, 0x28, 0xc5, 0xe4, 0x33, 0x60, + 0x38, 0xc1, 0xcd, 0xfe, 0x1c, 0x93, 0x1d, 0xab, 0xee, 0xa6, 0xe7, 0x44, 0xad, 0x80, 0xa0, 0x1d, + 0x18, 0x6e, 0xb2, 0xdd, 0x45, 0x24, 0x3e, 0x11, 0x73, 0xfd, 0xc5, 0x2e, 0xd5, 0x4f, 0x77, 0x58, + 0xea, 0x36, 0xc3, 0xd5, 0xad, 0xa2, 0xb3, 0xc3, 0x26, 0x77, 0xfb, 0x5f, 0x9c, 0x61, 0xd2, 0x47, + 0x95, 0xeb, 0x94, 0xfa, 0xc5, 0x9b, 0x20, 0x71, 0x8d, 0x9d, 0xca, 0x57, 0xb0, 0xc6, 0xc3, 0x22, + 0xde, 0x15, 0x61, 0x59, 0x16, 0x7d, 0x12, 0x46, 0xe8, 0xad, 0x50, 0x49, 0x00, 0xe1, 0xe4, 0x89, + 0xfc, 0xd8, 0x2d, 0x8a, 0x4a, 0x4f, 0x8a, 0xa4, 0x17, 0xc6, 0x09, 0x66, 0xe8, 0x0d, 0xe6, 0x5a, + 0x26, 0x59, 0x17, 0xba, 0x61, 0xad, 0x7b, 0x91, 0x49, 0xb6, 0x1a, 0x13, 0xd4, 0x82, 0x89, 0x74, + 0xea, 0xc7, 0x70, 0xd2, 0xce, 0x17, 0xaf, 0xd3, 0xd9, 0x1b, 0xe3, 0xec, 0x35, 0x69, 0x5c, 0x88, + 0xb3, 0xf8, 0xa3, 0xe5, 0x64, 0x62, 0xbe, 0xa2, 0xa1, 0xf7, 0x4d, 0x25, 0xe7, 0x1b, 0x6e, 0x9b, + 0x93, 0x6f, 0x13, 0xce, 0x69, 0xb9, 0xcd, 0xae, 0x06, 0x0e, 0x73, 0xde, 0x70, 0xd9, 0x76, 0xaa, + 0xc9, 0x45, 0x8f, 0xde, 0xdf, 0x2f, 0x9f, 0x5b, 0x6b, 0x47, 0x88, 0xdb, 0xf3, 0x41, 0x37, 0xe0, + 0x24, 0x8f, 0x3c, 0x30, 0x4f, 0x9c, 0x7a, 0xc3, 0xf5, 0x94, 0xe0, 0xc5, 0x97, 0xfc, 0x99, 0xfb, + 0xfb, 0xe5, 0x93, 0x33, 0x59, 0x04, 0x38, 0xbb, 0x1c, 0xfa, 0x30, 0x94, 0xea, 0x5e, 0x28, 0xfa, + 0xa0, 0xcf, 0x48, 0x1f, 0x57, 0x9a, 0x5f, 0xad, 0xaa, 0xef, 0x8f, 0xff, 0xe0, 0xb8, 0x00, 0xda, + 0xe4, 0xb6, 0x01, 0xa5, 0x2d, 0xea, 0x4f, 0x45, 0x5e, 0x4b, 0x2a, 0x54, 0x8d, 0xb7, 0xc7, 0xdc, + 0x28, 0xa6, 0x9e, 0xe4, 0x18, 0xcf, 0x92, 0x0d, 0xc6, 0xe8, 0x75, 0x40, 0x22, 0x4d, 0xc1, 0x4c, + 0x8d, 0x65, 0xd5, 0x61, 0x47, 0xe3, 0x80, 0xf9, 0x1a, 0xb6, 0x9a, 0xa2, 0xc0, 0x19, 0xa5, 0xd0, + 0x35, 0xba, 0xab, 0xe8, 0x50, 0xb1, 0x6b, 0xa9, 0x24, 0xa5, 0xf3, 0xa4, 0x19, 0x10, 0xe6, 0x63, + 0x66, 0x72, 0xc4, 0x89, 0x72, 0xa8, 0x0e, 0x67, 0x9d, 0x56, 0xe4, 0x33, 0xb3, 0x8b, 0x49, 0xba, + 0xe6, 0x6f, 0x13, 0x8f, 0x59, 0x3c, 0x07, 0x66, 0x2f, 0x50, 0xc9, 0x6e, 0xa6, 0x0d, 0x1d, 0x6e, + 0xcb, 0x85, 0x4a, 0xe4, 0x2a, 0x2b, 0x39, 0x98, 0xf1, 0xe4, 0x32, 0x32, 0x93, 0xbf, 0x04, 0x83, + 0x5b, 0x7e, 0x18, 0xad, 0x92, 0xe8, 0x8e, 0x1f, 0x6c, 0x8b, 0xb8, 0xc8, 0x71, 0x2c, 0xfa, 0x18, + 0x85, 0x75, 0x3a, 0x7a, 0xe5, 0x66, 0xfe, 0x38, 0x4b, 0xf3, 0xcc, 0x15, 0x62, 0x20, 0xde, 0x63, + 0xae, 0x71, 0x30, 0x96, 0x78, 0x49, 0xba, 0x54, 0x99, 0x63, 0x6e, 0x0d, 0x09, 0xd2, 0xa5, 0xca, + 0x1c, 0x96, 0x78, 0x3a, 0x5d, 0xc3, 0x2d, 0x27, 0x20, 0x95, 0xc0, 0xaf, 0x91, 0x50, 0xcb, 0x80, + 0xf0, 0x08, 0x8f, 0xfa, 0x4c, 0xa7, 0x6b, 0x35, 0x8b, 0x00, 0x67, 0x97, 0x43, 0x24, 0x9d, 0xd7, + 0x6f, 0x24, 0xdf, 0x1e, 0x95, 0x96, 0x67, 0xba, 0x4c, 0xed, 0xe7, 0xc1, 0x98, 0xca, 0x28, 0xc8, + 0xe3, 0x3c, 0x87, 0x93, 0xa3, 0x6c, 0x6e, 0x77, 0x1f, 0x24, 0x5a, 0x59, 0xf8, 0x96, 0x12, 0x9c, + 0x70, 0x8a, 0xb7, 0x11, 0x32, 0x70, 0xac, 0x63, 0xc8, 0xc0, 0xcb, 0x50, 0x0a, 0x5b, 0xeb, 0x75, + 0x7f, 0xc7, 0x71, 0x3d, 0xe6, 0xd6, 0xa0, 0xdd, 0xfd, 0xaa, 0x12, 0x81, 0x63, 0x1a, 0xb4, 0x08, + 0x03, 0x8e, 0x34, 0xdf, 0xa1, 0xfc, 0x20, 0x51, 0xca, 0x68, 0xc7, 0xe3, 0xa6, 0x48, 0x83, 0x9d, + 0x2a, 0x8b, 0x5e, 0x85, 0x61, 0xf1, 0x72, 0x5e, 0x24, 0xe1, 0x9d, 0x30, 0x9f, 0x37, 0x56, 0x75, + 0x24, 0x36, 0x69, 0xd1, 0x4d, 0x18, 0x8c, 0xfc, 0x06, 0x7b, 0xa3, 0x47, 0xc5, 0xbc, 0x53, 0xf9, + 0xe1, 0x0e, 0xd7, 0x14, 0x99, 0xae, 0xb5, 0x56, 0x45, 0xb1, 0xce, 0x07, 0xad, 0xf1, 0xf9, 0xce, + 0xf2, 0x1d, 0x90, 0x50, 0x64, 0x71, 0x3d, 0x97, 0xe7, 0x93, 0xc6, 0xc8, 0xcc, 0xe5, 0x20, 0x4a, + 0x62, 0x9d, 0x0d, 0xba, 0x0a, 0xe3, 0xcd, 0xc0, 0xf5, 0xd9, 0x9c, 0x50, 0x96, 0xdb, 0x49, 0x33, + 0xbb, 0x59, 0x25, 0x49, 0x80, 0xd3, 0x65, 0x58, 0xe0, 0x03, 0x01, 0x9c, 0x3c, 0xc3, 0x33, 0xb4, + 0xf0, 0xab, 0x34, 0x87, 0x61, 0x85, 0x45, 0x2b, 0x6c, 0x27, 0xe6, 0x5a, 0xa0, 0xc9, 0xa9, 0xfc, + 0xb8, 0x54, 0xba, 0xb6, 0x88, 0x0b, 0xaf, 0xea, 0x2f, 0x8e, 0x39, 0xa0, 0xba, 0x96, 0x18, 0x95, + 0x5e, 0x01, 0xc2, 0xc9, 0xb3, 0x6d, 0x9c, 0x22, 0x13, 0xb7, 0xb2, 0x58, 0x20, 0x30, 0xc0, 0x21, + 0x4e, 0xf0, 0x44, 0x1f, 0x85, 0x31, 0x11, 0x4d, 0x33, 0xee, 0xa6, 0x73, 0xf1, 0xcb, 0x07, 0x9c, + 0xc0, 0xe1, 0x14, 0x35, 0xcf, 0x90, 0xe2, 0xac, 0x37, 0x88, 0xd8, 0xfa, 0x96, 0x5d, 0x6f, 0x3b, + 0x9c, 0x3c, 0xcf, 0xf6, 0x07, 0x91, 0x21, 0x25, 0x89, 0xc5, 0x19, 0x25, 0xd0, 0x1a, 0x8c, 0x35, + 0x03, 0x42, 0x76, 0x98, 0xa0, 0x2f, 0xce, 0xb3, 0x32, 0x8f, 0xfb, 0x41, 0x5b, 0x52, 0x49, 0xe0, + 0x0e, 0x32, 0x60, 0x38, 0xc5, 0x01, 0xdd, 0x81, 0x01, 0x7f, 0x97, 0x04, 0x5b, 0xc4, 0xa9, 0x4f, + 0x5e, 0x68, 0xf3, 0x12, 0x47, 0x1c, 0x6e, 0x37, 0x04, 0x6d, 0xc2, 0xdb, 0x43, 0x82, 0x3b, 0x7b, + 0x7b, 0xc8, 0xca, 0xd0, 0xff, 0x61, 0xc1, 0x19, 0x69, 0x9c, 0xa9, 0x36, 0x69, 0xaf, 0xcf, 0xf9, + 0x5e, 0x18, 0x05, 0x3c, 0x52, 0xc5, 0xa3, 0xf9, 0xd1, 0x1b, 0xd6, 0x72, 0x0a, 0x29, 0x45, 0xf4, + 0x99, 0x3c, 0x8a, 0x10, 0xe7, 0xd7, 0x48, 0xaf, 0xa6, 0x21, 0x89, 0xe4, 0x66, 0x34, 0x13, 0x2e, + 0xbe, 0x31, 0xbf, 0x3a, 0xf9, 0x18, 0x0f, 0xb3, 0x41, 0x17, 0x43, 0x35, 0x89, 0xc4, 0x69, 0x7a, + 0x74, 0x05, 0x0a, 0x7e, 0x38, 0xf9, 0x78, 0x9b, 0x5c, 0xba, 0x7e, 0xfd, 0x46, 0x95, 0x7b, 0xfd, + 0xdd, 0xa8, 0xe2, 0x82, 0x1f, 0xca, 0x2c, 0x25, 0xf4, 0x3e, 0x16, 0x4e, 0x3e, 0xc1, 0xd5, 0x96, + 0x32, 0x4b, 0x09, 0x03, 0xe2, 0x18, 0x8f, 0xb6, 0x60, 0x34, 0x34, 0xee, 0xbd, 0xe1, 0xe4, 0x45, + 0xd6, 0x53, 0x4f, 0xe4, 0x0d, 0x9a, 0x41, 0xad, 0xa5, 0x0f, 0x30, 0xb9, 0xe0, 0x24, 0x5b, 0xbe, + 0xba, 0xb4, 0x9b, 0x77, 0x38, 0xf9, 0x64, 0x87, 0xd5, 0xa5, 0x11, 0xeb, 0xab, 0x4b, 0xe7, 0x81, + 0x13, 0x3c, 0xa7, 0xbe, 0x03, 0xc6, 0x53, 0xe2, 0xd2, 0x61, 0x3c, 0xdc, 0xa7, 0xb6, 0x61, 0xd8, + 0x98, 0x92, 0x0f, 0xd5, 0xbb, 0xe2, 0xb7, 0x4b, 0x50, 0x52, 0x56, 0x6f, 0x74, 0xd9, 0x74, 0xa8, + 0x38, 0x93, 0x74, 0xa8, 0x18, 0xa8, 0xf8, 0x75, 0xc3, 0x87, 0x62, 0x2d, 0x23, 0x18, 0x63, 0xde, + 0x06, 0xd8, 0xfd, 0x23, 0x15, 0xcd, 0x94, 0x50, 0xec, 0xda, 0x33, 0xa3, 0xa7, 0xad, 0x75, 0xe2, + 0x2a, 0x8c, 0x7b, 0x3e, 0x93, 0xd1, 0x49, 0x5d, 0x0a, 0x60, 0x4c, 0xce, 0x2a, 0xe9, 0xd1, 0x8d, + 0x12, 0x04, 0x38, 0x5d, 0x86, 0x56, 0xc8, 0x05, 0xa5, 0xa4, 0x39, 0x84, 0xcb, 0x51, 0x58, 0x60, + 0xe9, 0xdd, 0x90, 0xff, 0x0a, 0x27, 0xc7, 0xf2, 0xef, 0x86, 0xbc, 0x50, 0x52, 0x18, 0x0b, 0xa5, + 0x30, 0xc6, 0xb4, 0xff, 0x4d, 0xbf, 0xbe, 0x54, 0x11, 0x62, 0xbe, 0x16, 0x49, 0xb8, 0xbe, 0x54, + 0xc1, 0x1c, 0x87, 0x66, 0xa0, 0x8f, 0xfd, 0x08, 0x27, 0x87, 0xf2, 0xa3, 0xe1, 0xb0, 0x12, 0x5a, + 0x96, 0x34, 0x56, 0x00, 0x8b, 0x82, 0x4c, 0xbb, 0x4b, 0xef, 0x46, 0x4c, 0xbb, 0xdb, 0xff, 0x80, + 0xda, 0x5d, 0xc9, 0x00, 0xc7, 0xbc, 0xd0, 0x5d, 0x38, 0x69, 0xdc, 0x47, 0xd5, 0xab, 0x1d, 0xc8, + 0x37, 0xfc, 0x26, 0x88, 0x67, 0xcf, 0x89, 0x46, 0x9f, 0x5c, 0xca, 0xe2, 0x84, 0xb3, 0x2b, 0x40, + 0x0d, 0x18, 0xaf, 0xa5, 0x6a, 0x1d, 0xe8, 0xbe, 0x56, 0x35, 0x2f, 0xd2, 0x35, 0xa6, 0x19, 0xa3, + 0x57, 0x61, 0xe0, 0x6d, 0x3f, 0x64, 0x47, 0xa4, 0xb8, 0x9a, 0xc8, 0x70, 0x0e, 0x03, 0x6f, 0xdc, + 0xa8, 0x32, 0xf8, 0xc1, 0x7e, 0x79, 0xb0, 0xe2, 0xd7, 0xe5, 0x5f, 0xac, 0x0a, 0xa0, 0xef, 0xb7, + 0x60, 0x2a, 0x7d, 0xe1, 0x55, 0x8d, 0x1e, 0xee, 0xbe, 0xd1, 0xb6, 0xa8, 0x74, 0x6a, 0x21, 0x97, + 0x1d, 0x6e, 0x53, 0x15, 0xfa, 0x10, 0x5d, 0x4f, 0xa1, 0x7b, 0x8f, 0x88, 0x14, 0xb3, 0x8f, 0xc6, + 0xeb, 0x89, 0x42, 0x0f, 0xf6, 0xcb, 0xa3, 0x7c, 0x67, 0x74, 0xef, 0xc9, 0xe7, 0x4d, 0xa2, 0x00, + 0xfa, 0x4e, 0x38, 0x19, 0xa4, 0x35, 0xa8, 0x44, 0x0a, 0xe1, 0x4f, 0x77, 0xb3, 0xcb, 0x26, 0x07, + 0x1c, 0x67, 0x31, 0xc4, 0xd9, 0xf5, 0xd8, 0xbf, 0x62, 0x31, 0xfd, 0xb6, 0x68, 0x16, 0x09, 0x5b, + 0x8d, 0xe3, 0x48, 0x6c, 0xbd, 0x60, 0xd8, 0x8e, 0x1f, 0xd8, 0xb1, 0xe8, 0x1f, 0x59, 0xcc, 0xb1, + 0xe8, 0x18, 0x5f, 0x31, 0xbd, 0x01, 0x03, 0x91, 0x4c, 0x38, 0xde, 0x26, 0x17, 0xb7, 0xd6, 0x28, + 0xe6, 0x5c, 0xa5, 0x2e, 0x39, 0x2a, 0xb7, 0xb8, 0x62, 0x63, 0xff, 0x7d, 0x3e, 0x02, 0x12, 0x73, + 0x0c, 0x26, 0xba, 0x79, 0xd3, 0x44, 0x57, 0xee, 0xf0, 0x05, 0x39, 0xa6, 0xba, 0xbf, 0x67, 0xb6, + 0x9b, 0x29, 0xf7, 0xde, 0xed, 0x1e, 0x6d, 0xf6, 0x17, 0x2c, 0x80, 0x38, 0xc8, 0x7c, 0x17, 0x29, + 0x25, 0x5f, 0xa6, 0xd7, 0x1a, 0x3f, 0xf2, 0x6b, 0x7e, 0x43, 0x18, 0x28, 0xce, 0xc6, 0x56, 0x42, + 0x0e, 0x3f, 0xd0, 0x7e, 0x63, 0x45, 0x8d, 0xca, 0x32, 0xa4, 0x65, 0x31, 0xb6, 0x5b, 0x1b, 0xe1, + 0x2c, 0xbf, 0x64, 0xc1, 0x89, 0x2c, 0x97, 0x78, 0x7a, 0x49, 0xe6, 0x6a, 0x4e, 0xe5, 0x6d, 0xa8, + 0x46, 0xf3, 0x96, 0x80, 0x63, 0x45, 0xd1, 0x75, 0xae, 0xce, 0xc3, 0x45, 0x77, 0xbf, 0x01, 0xc3, + 0x95, 0x80, 0x68, 0xf2, 0xc5, 0x6b, 0x3c, 0x4c, 0x0a, 0x6f, 0xcf, 0xb3, 0x87, 0x0e, 0x91, 0x62, + 0x7f, 0xb9, 0x00, 0x27, 0xb8, 0xd3, 0xce, 0xcc, 0xae, 0xef, 0xd6, 0x2b, 0x7e, 0x5d, 0x3c, 0x64, + 0x7c, 0x13, 0x86, 0x9a, 0x9a, 0x6e, 0xba, 0x5d, 0xa4, 0x62, 0x5d, 0x87, 0x1d, 0x6b, 0xd3, 0x74, + 0x28, 0x36, 0x78, 0xa1, 0x3a, 0x0c, 0x91, 0x5d, 0xb7, 0xa6, 0x3c, 0x3f, 0x0a, 0x87, 0x3e, 0xa4, + 0x55, 0x2d, 0x0b, 0x1a, 0x1f, 0x6c, 0x70, 0x7d, 0x08, 0x19, 0xf4, 0xed, 0x1f, 0xb5, 0xe0, 0x74, + 0x4e, 0x5c, 0x63, 0x5a, 0xdd, 0x1d, 0xe6, 0x1e, 0x25, 0xa6, 0xad, 0xaa, 0x8e, 0x3b, 0x4d, 0x61, + 0x81, 0x45, 0x1f, 0x03, 0xe0, 0x4e, 0x4f, 0xc4, 0xab, 0x75, 0x0c, 0x00, 0x6b, 0xc4, 0xae, 0xd4, + 0xc2, 0x10, 0xca, 0xf2, 0x58, 0xe3, 0x65, 0x7f, 0xa9, 0x07, 0x7a, 0x99, 0x93, 0x0d, 0xaa, 0x40, + 0xff, 0x16, 0xcf, 0x54, 0xd5, 0x76, 0xdc, 0x28, 0xad, 0x4c, 0x7e, 0x15, 0x8f, 0x9b, 0x06, 0xc5, + 0x92, 0x0d, 0x5a, 0x81, 0x09, 0x9e, 0x30, 0xac, 0x31, 0x4f, 0x1a, 0xce, 0x9e, 0x54, 0xfb, 0xf2, + 0x1c, 0xd8, 0x4a, 0xfd, 0xbd, 0x94, 0x26, 0xc1, 0x59, 0xe5, 0xd0, 0x6b, 0x30, 0x42, 0xaf, 0xe1, + 0x7e, 0x2b, 0x92, 0x9c, 0x78, 0xaa, 0x30, 0x75, 0x33, 0x59, 0x33, 0xb0, 0x38, 0x41, 0x8d, 0x5e, + 0x85, 0xe1, 0x66, 0x4a, 0xc1, 0xdd, 0x1b, 0x6b, 0x82, 0x4c, 0xa5, 0xb6, 0x49, 0xcb, 0xbc, 0xe2, + 0x5b, 0xec, 0x0d, 0xc0, 0xda, 0x56, 0x40, 0xc2, 0x2d, 0xbf, 0x51, 0x67, 0x12, 0x70, 0xaf, 0xe6, + 0x15, 0x9f, 0xc0, 0xe3, 0x54, 0x09, 0xca, 0x65, 0xc3, 0x71, 0x1b, 0xad, 0x80, 0xc4, 0x5c, 0xfa, + 0x4c, 0x2e, 0x8b, 0x09, 0x3c, 0x4e, 0x95, 0xe8, 0xac, 0xb9, 0xef, 0x3f, 0x1a, 0xcd, 0xbd, 0xfd, + 0xd3, 0x05, 0x30, 0x86, 0xf6, 0xdb, 0x37, 0x85, 0x19, 0xfd, 0xb2, 0xcd, 0xa0, 0x59, 0x13, 0x0e, + 0x65, 0x99, 0x5f, 0x16, 0xe7, 0x2f, 0xe6, 0x5f, 0x46, 0xff, 0x63, 0x56, 0x8a, 0xae, 0xf1, 0x93, + 0x95, 0xc0, 0xa7, 0x87, 0x9c, 0x0c, 0xa4, 0xa7, 0x1e, 0x9f, 0xf4, 0xcb, 0x20, 0x03, 0x6d, 0x42, + 0xce, 0x0a, 0xf7, 0x7c, 0xce, 0xc1, 0xf0, 0xbd, 0xaa, 0x8a, 0x68, 0x1f, 0x92, 0x0b, 0xba, 0x02, + 0x83, 0x22, 0x2f, 0x15, 0x7b, 0x23, 0xc1, 0x17, 0x13, 0xf3, 0x15, 0x9b, 0x8f, 0xc1, 0x58, 0xa7, + 0xb1, 0x7f, 0xa0, 0x00, 0x13, 0x19, 0x8f, 0xdc, 0xf8, 0x31, 0xb2, 0xe9, 0x86, 0x91, 0x4a, 0x91, + 0xac, 0x1d, 0x23, 0x1c, 0x8e, 0x15, 0x05, 0xdd, 0xab, 0xf8, 0x41, 0x95, 0x3c, 0x9c, 0xc4, 0x23, + 0x12, 0x81, 0x3d, 0x64, 0xb2, 0xe1, 0x0b, 0xd0, 0xd3, 0x0a, 0x89, 0x0c, 0x16, 0xad, 0x8e, 0x6d, + 0x66, 0xd6, 0x66, 0x18, 0x7a, 0x05, 0xdc, 0x54, 0x16, 0x62, 0xed, 0x0a, 0xc8, 0x6d, 0xc4, 0x1c, + 0x47, 0x1b, 0x17, 0x11, 0xcf, 0xf1, 0x22, 0x71, 0x51, 0x8c, 0xa3, 0x9e, 0x32, 0x28, 0x16, 0x58, + 0xfb, 0x8b, 0x45, 0x38, 0x93, 0xfb, 0xec, 0x95, 0x36, 0x7d, 0xc7, 0xf7, 0xdc, 0xc8, 0x57, 0x4e, + 0x78, 0x3c, 0xd2, 0x29, 0x69, 0x6e, 0xad, 0x08, 0x38, 0x56, 0x14, 0xe8, 0x22, 0xf4, 0x32, 0xa5, + 0x78, 0x2a, 0x59, 0xf4, 0xec, 0x3c, 0x0f, 0x7d, 0xc7, 0xd1, 0x5d, 0xe7, 0xf7, 0x7f, 0x8c, 0x4a, + 0x30, 0x7e, 0x23, 0x79, 0xa0, 0xd0, 0xe6, 0xfa, 0x7e, 0x03, 0x33, 0x24, 0x7a, 0x42, 0xf4, 0x57, + 0xc2, 0xeb, 0x0c, 0x3b, 0x75, 0x3f, 0xd4, 0x3a, 0xed, 0x29, 0xe8, 0xdf, 0x26, 0x7b, 0x81, 0xeb, + 0x6d, 0x26, 0xbd, 0x11, 0xaf, 0x73, 0x30, 0x96, 0x78, 0x33, 0x6f, 0x69, 0xff, 0x51, 0x27, 0xe6, + 0x1f, 0xe8, 0x28, 0x9e, 0xfc, 0x50, 0x11, 0x46, 0xf1, 0xec, 0xfc, 0x7b, 0x03, 0x71, 0x33, 0x3d, + 0x10, 0x47, 0x9d, 0x98, 0xbf, 0xf3, 0x68, 0xfc, 0xa2, 0x05, 0xa3, 0x2c, 0x3b, 0x96, 0x88, 0x59, + 0xe1, 0xfa, 0xde, 0x31, 0x5c, 0x05, 0x1e, 0x83, 0xde, 0x80, 0x56, 0x9a, 0xcc, 0x12, 0xcd, 0x5a, + 0x82, 0x39, 0x0e, 0x9d, 0x85, 0x1e, 0xd6, 0x04, 0x3a, 0x78, 0x43, 0x7c, 0x0b, 0x9e, 0x77, 0x22, + 0x07, 0x33, 0x28, 0x0b, 0xfc, 0x86, 0x49, 0xb3, 0xe1, 0xf2, 0x46, 0xc7, 0x2e, 0x0b, 0xef, 0x8e, + 0x80, 0x18, 0x99, 0x4d, 0x7b, 0x67, 0x81, 0xdf, 0xb2, 0x59, 0xb6, 0xbf, 0x66, 0xff, 0x79, 0x01, + 0xce, 0x67, 0x96, 0xeb, 0x3a, 0xf0, 0x5b, 0xfb, 0xd2, 0x0f, 0x33, 0xff, 0x51, 0xf1, 0x18, 0x7d, + 0xbd, 0x7b, 0xba, 0x95, 0xfe, 0x7b, 0xbb, 0x88, 0xc7, 0x96, 0xd9, 0x65, 0xef, 0x92, 0x78, 0x6c, + 0x99, 0x6d, 0xcb, 0x51, 0x13, 0xfc, 0x75, 0x21, 0xe7, 0x5b, 0x98, 0xc2, 0xe0, 0x12, 0xdd, 0x67, + 0x18, 0x32, 0x94, 0x97, 0x70, 0xbe, 0xc7, 0x70, 0x18, 0x56, 0x58, 0x34, 0x03, 0xa3, 0x3b, 0xae, + 0x47, 0x37, 0x9f, 0x3d, 0x53, 0x14, 0x57, 0xb6, 0x8c, 0x15, 0x13, 0x8d, 0x93, 0xf4, 0xc8, 0xd5, + 0x62, 0xb5, 0xf1, 0xaf, 0x7b, 0xf5, 0x50, 0xab, 0x6e, 0xda, 0x74, 0xe7, 0x50, 0xbd, 0x98, 0x11, + 0xb7, 0x6d, 0x45, 0xd3, 0x13, 0x15, 0xbb, 0xd7, 0x13, 0x0d, 0x65, 0xeb, 0x88, 0xa6, 0x5e, 0x85, + 0xe1, 0x07, 0xb6, 0x8d, 0xd8, 0x5f, 0x2f, 0xc2, 0x23, 0x6d, 0x96, 0x3d, 0xdf, 0xeb, 0x8d, 0x31, + 0xd0, 0xf6, 0xfa, 0xd4, 0x38, 0x54, 0xe0, 0xc4, 0x46, 0xab, 0xd1, 0xd8, 0x63, 0x4f, 0xa0, 0x48, + 0x5d, 0x52, 0x08, 0x99, 0x52, 0x2a, 0x47, 0x4e, 0x2c, 0x66, 0xd0, 0xe0, 0xcc, 0x92, 0xf4, 0x8a, + 0x45, 0x4f, 0x92, 0x3d, 0xc5, 0x2a, 0x71, 0xc5, 0xc2, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x2a, 0x8c, + 0x3b, 0xbb, 0x8e, 0xcb, 0x03, 0xde, 0x4b, 0x06, 0xfc, 0x8e, 0xa5, 0x74, 0xd1, 0x33, 0x49, 0x02, + 0x9c, 0x2e, 0x83, 0x5e, 0x07, 0xe4, 0xaf, 0xb3, 0x87, 0x12, 0xf5, 0xab, 0xc4, 0x13, 0x56, 0x77, + 0x36, 0x76, 0xc5, 0x78, 0x4b, 0xb8, 0x91, 0xa2, 0xc0, 0x19, 0xa5, 0x12, 0x81, 0xc9, 0xfa, 0xf2, + 0x03, 0x93, 0xb5, 0xdf, 0x17, 0x3b, 0xa6, 0xde, 0xba, 0x02, 0xc3, 0x87, 0x74, 0xff, 0xb5, 0xff, + 0x8d, 0x05, 0x4a, 0x41, 0x6c, 0x46, 0xfd, 0x7d, 0x95, 0xf9, 0x27, 0x73, 0xd5, 0xb6, 0x16, 0x2d, + 0xe9, 0xa4, 0xe6, 0x9f, 0x1c, 0x23, 0xb1, 0x49, 0xcb, 0xe7, 0x90, 0xe6, 0x57, 0x6c, 0xdc, 0x0a, + 0x44, 0x68, 0x42, 0x45, 0x81, 0x3e, 0x0e, 0xfd, 0x75, 0x77, 0xd7, 0x0d, 0x85, 0x72, 0xec, 0xd0, + 0xc6, 0xb8, 0x78, 0xeb, 0x9c, 0xe7, 0x6c, 0xb0, 0xe4, 0x67, 0xff, 0x50, 0x21, 0xee, 0x93, 0x37, + 0x5a, 0x7e, 0xe4, 0x1c, 0xc3, 0x49, 0x7e, 0xd5, 0x38, 0xc9, 0x9f, 0x68, 0x17, 0x9f, 0x91, 0x35, + 0x29, 0xf7, 0x04, 0xbf, 0x91, 0x38, 0xc1, 0x9f, 0xec, 0xcc, 0xaa, 0xfd, 0xc9, 0xfd, 0x0f, 0x2c, + 0x18, 0x37, 0xe8, 0x8f, 0xe1, 0x00, 0x59, 0x34, 0x0f, 0x90, 0x47, 0x3b, 0x7e, 0x43, 0xce, 0xc1, + 0xf1, 0xbd, 0xc5, 0x44, 0xdb, 0xd9, 0x81, 0xf1, 0x36, 0xf4, 0x6c, 0x39, 0x41, 0xbd, 0x5d, 0x3e, + 0x9a, 0x54, 0xa1, 0xe9, 0x6b, 0x4e, 0x20, 0x3c, 0x15, 0x9e, 0x95, 0xbd, 0x4e, 0x41, 0x1d, 0xbd, + 0x14, 0x58, 0x55, 0xe8, 0x65, 0xe8, 0x0b, 0x6b, 0x7e, 0x53, 0xbd, 0x99, 0xba, 0xc0, 0x3a, 0x9a, + 0x41, 0x0e, 0xf6, 0xcb, 0xc8, 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x47, 0x6f, 0xc2, 0x30, 0xfb, 0xa5, + 0xdc, 0x06, 0x8b, 0xf9, 0x1a, 0x8c, 0xaa, 0x4e, 0xc8, 0x7d, 0x6a, 0x0d, 0x10, 0x36, 0x59, 0x4d, + 0x6d, 0x42, 0x49, 0x7d, 0xd6, 0x43, 0xb5, 0x76, 0xff, 0xab, 0x22, 0x4c, 0x64, 0xcc, 0x39, 0x14, + 0x1a, 0x23, 0x71, 0xa5, 0xcb, 0xa9, 0xfa, 0x0e, 0xc7, 0x22, 0x64, 0x17, 0xa8, 0xba, 0x98, 0x5b, + 0x5d, 0x57, 0x7a, 0x33, 0x24, 0xc9, 0x4a, 0x29, 0xa8, 0x73, 0xa5, 0xb4, 0xb2, 0x63, 0xeb, 0x6a, + 0x5a, 0x91, 0x6a, 0xe9, 0x43, 0x1d, 0xd3, 0x5f, 0xef, 0x81, 0x13, 0x59, 0x21, 0x63, 0xd1, 0x67, + 0x13, 0xd9, 0x90, 0x5f, 0xec, 0x36, 0xd8, 0x2c, 0x4f, 0x91, 0x2c, 0xc2, 0x40, 0x4e, 0x9b, 0xf9, + 0x91, 0x3b, 0x76, 0xb3, 0xa8, 0x93, 0x05, 0xa0, 0x09, 0x78, 0x16, 0x6b, 0xb9, 0x7d, 0x7c, 0xa0, + 0xeb, 0x06, 0x88, 0xf4, 0xd7, 0x61, 0xc2, 0x25, 0x49, 0x82, 0x3b, 0xbb, 0x24, 0xc9, 0x9a, 0xd1, + 0x12, 0xf4, 0xd5, 0xb8, 0xaf, 0x4b, 0xb1, 0xf3, 0x16, 0xc6, 0x1d, 0x5d, 0xd4, 0x06, 0x2c, 0x1c, + 0x5c, 0x04, 0x83, 0x29, 0x17, 0x06, 0xb5, 0x8e, 0x79, 0xa8, 0x93, 0x67, 0x9b, 0x1e, 0x7c, 0x5a, + 0x17, 0x3c, 0xd4, 0x09, 0xf4, 0xa3, 0x16, 0x24, 0x1e, 0xbc, 0x28, 0xa5, 0x9c, 0x95, 0xab, 0x94, + 0xbb, 0x00, 0x3d, 0x81, 0xdf, 0x20, 0xc9, 0x0c, 0xc4, 0xd8, 0x6f, 0x10, 0xcc, 0x30, 0x94, 0x22, + 0x8a, 0x55, 0x2d, 0x43, 0xfa, 0x35, 0x52, 0x5c, 0x10, 0x1f, 0x83, 0xde, 0x06, 0xd9, 0x25, 0x8d, + 0x64, 0xa2, 0xb8, 0x65, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x62, 0x0f, 0x9c, 0x6b, 0x1b, 0x0d, 0x8a, + 0x5e, 0xc6, 0x36, 0x9d, 0x88, 0xdc, 0x71, 0xf6, 0x92, 0x19, 0x9d, 0xae, 0x72, 0x30, 0x96, 0x78, + 0xf6, 0xfc, 0x93, 0x27, 0x66, 0x48, 0xa8, 0x30, 0x45, 0x3e, 0x06, 0x81, 0x35, 0x55, 0x62, 0xc5, + 0xa3, 0x50, 0x89, 0x3d, 0x0f, 0x10, 0x86, 0x0d, 0xee, 0x16, 0x58, 0x17, 0xef, 0x4a, 0xe3, 0x04, + 0x1e, 0xd5, 0x65, 0x81, 0xc1, 0x1a, 0x15, 0x9a, 0x87, 0xb1, 0x66, 0xe0, 0x47, 0x5c, 0x23, 0x3c, + 0xcf, 0x3d, 0x67, 0x7b, 0xcd, 0x40, 0x3c, 0x95, 0x04, 0x1e, 0xa7, 0x4a, 0xa0, 0x97, 0x60, 0x50, + 0x04, 0xe7, 0xa9, 0xf8, 0x7e, 0x43, 0x28, 0xa1, 0x94, 0x33, 0x69, 0x35, 0x46, 0x61, 0x9d, 0x4e, + 0x2b, 0xc6, 0xd4, 0xcc, 0xfd, 0x99, 0xc5, 0xb8, 0xaa, 0x59, 0xa3, 0x4b, 0x44, 0xa2, 0x1e, 0xe8, + 0x2a, 0x12, 0x75, 0xac, 0x96, 0x2b, 0x75, 0x6d, 0xf5, 0x84, 0x8e, 0x8a, 0xac, 0xaf, 0xf4, 0xc0, + 0x84, 0x98, 0x38, 0x0f, 0x7b, 0xba, 0xdc, 0x4c, 0x4f, 0x97, 0xa3, 0x50, 0xdc, 0xbd, 0x37, 0x67, + 0x8e, 0x7b, 0xce, 0xfc, 0xb0, 0x05, 0xa6, 0xa4, 0x86, 0xfe, 0xb7, 0xdc, 0x94, 0x78, 0x2f, 0xe5, + 0x4a, 0x7e, 0x71, 0x94, 0xdf, 0x77, 0x96, 0x1c, 0xcf, 0xfe, 0xd7, 0x16, 0x3c, 0xda, 0x91, 0x23, + 0x5a, 0x80, 0x12, 0x13, 0x27, 0xb5, 0x8b, 0xde, 0x93, 0xca, 0xb3, 0x5e, 0x22, 0x72, 0xa4, 0xdb, + 0xb8, 0x24, 0x5a, 0x48, 0xe5, 0x1e, 0x7c, 0x2a, 0x23, 0xf7, 0xe0, 0x49, 0xa3, 0x7b, 0x1e, 0x30, + 0xf9, 0xe0, 0x0f, 0xd2, 0x13, 0xc7, 0x78, 0xd5, 0x86, 0x3e, 0x60, 0x28, 0x1d, 0xed, 0x84, 0xd2, + 0x11, 0x99, 0xd4, 0xda, 0x19, 0xf2, 0x51, 0x18, 0x63, 0x51, 0xfb, 0xd8, 0x3b, 0x0f, 0xf1, 0xde, + 0xae, 0x10, 0xfb, 0x72, 0x2f, 0x27, 0x70, 0x38, 0x45, 0x6d, 0xff, 0x69, 0x11, 0xfa, 0xf8, 0xf2, + 0x3b, 0x86, 0xeb, 0xe5, 0x33, 0x50, 0x72, 0x77, 0x76, 0x5a, 0x3c, 0x9d, 0x5c, 0x6f, 0xec, 0x19, + 0xbc, 0x24, 0x81, 0x38, 0xc6, 0xa3, 0x45, 0xa1, 0xef, 0x6e, 0x13, 0x18, 0x98, 0x37, 0x7c, 0x7a, + 0xde, 0x89, 0x1c, 0x2e, 0x2b, 0xa9, 0x73, 0x36, 0xd6, 0x8c, 0xa3, 0x4f, 0x01, 0x84, 0x51, 0xe0, + 0x7a, 0x9b, 0x14, 0x26, 0x62, 0xab, 0x3f, 0xdd, 0x86, 0x5b, 0x55, 0x11, 0x73, 0x9e, 0xf1, 0x9e, + 0xa3, 0x10, 0x58, 0xe3, 0x88, 0xa6, 0x8d, 0x93, 0x7e, 0x2a, 0x31, 0x76, 0xc0, 0xb9, 0xc6, 0x63, + 0x36, 0xf5, 0x41, 0x28, 0x29, 0xe6, 0x9d, 0xb4, 0x5f, 0x43, 0xba, 0x58, 0xf4, 0x11, 0x18, 0x4d, + 0xb4, 0xed, 0x50, 0xca, 0xb3, 0x5f, 0xb2, 0x60, 0x94, 0x37, 0x66, 0xc1, 0xdb, 0x15, 0xa7, 0xc1, + 0x3d, 0x38, 0xd1, 0xc8, 0xd8, 0x95, 0xc5, 0xf0, 0x77, 0xbf, 0x8b, 0x2b, 0x65, 0x59, 0x16, 0x16, + 0x67, 0xd6, 0x81, 0x2e, 0xd1, 0x15, 0x47, 0x77, 0x5d, 0xa7, 0x21, 0xe2, 0x1b, 0x0c, 0xf1, 0xd5, + 0xc6, 0x61, 0x58, 0x61, 0xed, 0x3f, 0xb0, 0x60, 0x9c, 0xb7, 0xfc, 0x3a, 0xd9, 0x53, 0x7b, 0xd3, + 0x37, 0xb3, 0xed, 0x22, 0x91, 0x69, 0x21, 0x27, 0x91, 0xa9, 0xfe, 0x69, 0xc5, 0xb6, 0x9f, 0xf6, + 0x65, 0x0b, 0xc4, 0x0c, 0x39, 0x06, 0x7d, 0xc6, 0x77, 0x98, 0xfa, 0x8c, 0xa9, 0xfc, 0x45, 0x90, + 0xa3, 0xc8, 0xf8, 0x2b, 0x0b, 0xc6, 0x38, 0x41, 0x6c, 0xab, 0xff, 0xa6, 0x8e, 0xc3, 0xac, 0xf9, + 0x45, 0x99, 0xce, 0x97, 0xd7, 0xc9, 0xde, 0x9a, 0x5f, 0x71, 0xa2, 0xad, 0xec, 0x8f, 0x32, 0x06, + 0xab, 0xa7, 0xed, 0x60, 0xd5, 0xe5, 0x02, 0x32, 0xf2, 0x7c, 0x75, 0x08, 0x10, 0x70, 0xd8, 0x3c, + 0x5f, 0xf6, 0x9f, 0x59, 0x80, 0x78, 0x35, 0x86, 0xe0, 0x46, 0xc5, 0x21, 0x06, 0xd5, 0x0e, 0xba, + 0x78, 0x6b, 0x52, 0x18, 0xac, 0x51, 0x1d, 0x49, 0xf7, 0x24, 0x1c, 0x2e, 0x8a, 0x9d, 0x1d, 0x2e, + 0x0e, 0xd1, 0xa3, 0xff, 0xac, 0x0f, 0x92, 0x2f, 0xfb, 0xd0, 0x2d, 0x18, 0xaa, 0x39, 0x4d, 0x67, + 0xdd, 0x6d, 0xb8, 0x91, 0x4b, 0xc2, 0x76, 0xde, 0x58, 0x73, 0x1a, 0x9d, 0x30, 0x91, 0x6b, 0x10, + 0x6c, 0xf0, 0x41, 0xd3, 0x00, 0xcd, 0xc0, 0xdd, 0x75, 0x1b, 0x64, 0x93, 0xa9, 0x5d, 0x58, 0x44, + 0x15, 0xee, 0x1a, 0x26, 0xa1, 0x58, 0xa3, 0xc8, 0x08, 0xa3, 0x50, 0x7c, 0xc8, 0x61, 0x14, 0xe0, + 0xd8, 0xc2, 0x28, 0xf4, 0x1c, 0x2a, 0x8c, 0xc2, 0xc0, 0xa1, 0xc3, 0x28, 0xf4, 0x76, 0x15, 0x46, + 0x01, 0xc3, 0x29, 0x29, 0x7b, 0xd2, 0xff, 0x8b, 0x6e, 0x83, 0x88, 0x0b, 0x07, 0x0f, 0x03, 0x33, + 0x75, 0x7f, 0xbf, 0x7c, 0x0a, 0x67, 0x52, 0xe0, 0x9c, 0x92, 0xe8, 0x63, 0x30, 0xe9, 0x34, 0x1a, + 0xfe, 0x1d, 0x35, 0xa8, 0x0b, 0x61, 0xcd, 0x69, 0x70, 0x13, 0x48, 0x3f, 0xe3, 0x7a, 0xf6, 0xfe, + 0x7e, 0x79, 0x72, 0x26, 0x87, 0x06, 0xe7, 0x96, 0x46, 0x1f, 0x86, 0x52, 0x33, 0xf0, 0x6b, 0x2b, + 0xda, 0xf3, 0xe3, 0xf3, 0xb4, 0x03, 0x2b, 0x12, 0x78, 0xb0, 0x5f, 0x1e, 0x56, 0x7f, 0xd8, 0x81, + 0x1f, 0x17, 0xc8, 0x88, 0x8b, 0x30, 0x78, 0xa4, 0x71, 0x11, 0xb6, 0x61, 0xa2, 0x4a, 0x02, 0xd7, + 0x69, 0xb8, 0xf7, 0xa8, 0xbc, 0x2c, 0xf7, 0xa7, 0x35, 0x28, 0x05, 0x89, 0x1d, 0xb9, 0xab, 0x60, + 0xbd, 0x5a, 0xc2, 0x25, 0xb9, 0x03, 0xc7, 0x8c, 0xec, 0xff, 0x66, 0x41, 0xbf, 0x78, 0xc9, 0x77, + 0x0c, 0x52, 0xe3, 0x8c, 0x61, 0x94, 0x28, 0x67, 0x77, 0x18, 0x6b, 0x4c, 0xae, 0x39, 0x62, 0x29, + 0x61, 0x8e, 0x78, 0xb4, 0x1d, 0x93, 0xf6, 0x86, 0x88, 0xff, 0xaf, 0x48, 0xa5, 0x77, 0xe3, 0x4d, + 0xf9, 0xc3, 0xef, 0x82, 0x55, 0xe8, 0x0f, 0xc5, 0x9b, 0xe6, 0x42, 0xfe, 0x6b, 0x90, 0xe4, 0x20, + 0xc6, 0x5e, 0x74, 0xe2, 0x15, 0xb3, 0x64, 0x92, 0xf9, 0x58, 0xba, 0xf8, 0x10, 0x1f, 0x4b, 0x77, + 0x7a, 0x75, 0xdf, 0x73, 0x14, 0xaf, 0xee, 0xed, 0xaf, 0xb1, 0x93, 0x53, 0x87, 0x1f, 0x83, 0x50, + 0x75, 0xd5, 0x3c, 0x63, 0xed, 0x36, 0x33, 0x4b, 0x34, 0x2a, 0x47, 0xb8, 0xfa, 0x05, 0x0b, 0xce, + 0x65, 0x7c, 0x95, 0x26, 0x69, 0x3d, 0x0b, 0x03, 0x4e, 0xab, 0xee, 0xaa, 0xb5, 0xac, 0x99, 0x26, + 0x67, 0x04, 0x1c, 0x2b, 0x0a, 0x34, 0x07, 0xe3, 0xe4, 0x6e, 0xd3, 0xe5, 0x86, 0x5c, 0xdd, 0xf9, + 0xb8, 0xc8, 0x9f, 0x7f, 0x2e, 0x24, 0x91, 0x38, 0x4d, 0xaf, 0x02, 0x44, 0x15, 0x73, 0x03, 0x44, + 0xfd, 0xbc, 0x05, 0x83, 0xea, 0x55, 0xef, 0x43, 0xef, 0xed, 0x8f, 0x9a, 0xbd, 0xfd, 0x48, 0x9b, + 0xde, 0xce, 0xe9, 0xe6, 0xdf, 0x2b, 0xa8, 0xf6, 0x56, 0xfc, 0x20, 0xea, 0x42, 0x82, 0x7b, 0xf0, + 0x87, 0x13, 0x57, 0x60, 0xd0, 0x69, 0x36, 0x25, 0x42, 0x7a, 0xc0, 0xb1, 0xd0, 0xeb, 0x31, 0x18, + 0xeb, 0x34, 0xea, 0x1d, 0x47, 0x31, 0xf7, 0x1d, 0x47, 0x1d, 0x20, 0x72, 0x82, 0x4d, 0x12, 0x51, + 0x98, 0x70, 0xd8, 0xcd, 0xdf, 0x6f, 0x5a, 0x91, 0xdb, 0x98, 0x76, 0xbd, 0x28, 0x8c, 0x82, 0xe9, + 0x25, 0x2f, 0xba, 0x11, 0xf0, 0x2b, 0xa4, 0x16, 0x62, 0x4d, 0xf1, 0xc2, 0x1a, 0x5f, 0x19, 0xc1, + 0x82, 0xd5, 0xd1, 0x6b, 0xba, 0x52, 0xac, 0x0a, 0x38, 0x56, 0x14, 0xf6, 0x07, 0xd9, 0xe9, 0xc3, + 0xfa, 0xf4, 0x70, 0xe1, 0xc5, 0x7e, 0x72, 0x48, 0x8d, 0x06, 0x33, 0x8a, 0xce, 0xeb, 0x41, 0xcc, + 0xda, 0x6f, 0xf6, 0xb4, 0x62, 0xfd, 0x45, 0x64, 0x1c, 0xe9, 0x0c, 0x7d, 0x22, 0xe5, 0x1e, 0xf3, + 0x5c, 0x87, 0x53, 0xe3, 0x10, 0x0e, 0x31, 0x2c, 0x0f, 0x13, 0xcb, 0x52, 0xb3, 0x54, 0x11, 0xeb, + 0x42, 0xcb, 0xc3, 0x24, 0x10, 0x38, 0xa6, 0xa1, 0xc2, 0x94, 0xfa, 0x13, 0x4e, 0xa2, 0x38, 0x16, + 0xb0, 0xa2, 0x0e, 0xb1, 0x46, 0x81, 0x2e, 0x0b, 0x85, 0x02, 0xb7, 0x0b, 0x3c, 0x92, 0x50, 0x28, + 0xc8, 0xee, 0xd2, 0xb4, 0x40, 0x57, 0x60, 0x90, 0xdc, 0x8d, 0x48, 0xe0, 0x39, 0x0d, 0x5a, 0x43, + 0x6f, 0x1c, 0x3f, 0x73, 0x21, 0x06, 0x63, 0x9d, 0x06, 0xad, 0xc1, 0x68, 0xc8, 0xf5, 0x6c, 0x2a, + 0x48, 0x3c, 0xd7, 0x57, 0x3e, 0xad, 0xde, 0x53, 0x9b, 0xe8, 0x03, 0x06, 0xe2, 0xbb, 0x93, 0x8c, + 0x32, 0x91, 0x64, 0x81, 0x5e, 0x83, 0x91, 0x86, 0xef, 0xd4, 0x67, 0x9d, 0x86, 0xe3, 0xd5, 0x58, + 0xff, 0x0c, 0x98, 0x89, 0xa8, 0x97, 0x0d, 0x2c, 0x4e, 0x50, 0x53, 0xe1, 0x4d, 0x87, 0x88, 0x30, + 0x6d, 0x8e, 0xb7, 0x49, 0x42, 0x91, 0x0f, 0x9e, 0x09, 0x6f, 0xcb, 0x39, 0x34, 0x38, 0xb7, 0x34, + 0x7a, 0x19, 0x86, 0xe4, 0xe7, 0x6b, 0x41, 0x59, 0xe2, 0x27, 0x31, 0x1a, 0x0e, 0x1b, 0x94, 0x28, + 0x84, 0x93, 0xf2, 0xff, 0x5a, 0xe0, 0x6c, 0x6c, 0xb8, 0x35, 0x11, 0xa9, 0x80, 0x3f, 0x1f, 0xfe, + 0x88, 0x7c, 0xab, 0xb8, 0x90, 0x45, 0x74, 0xb0, 0x5f, 0x3e, 0x2b, 0x7a, 0x2d, 0x13, 0x8f, 0xb3, + 0x79, 0xa3, 0x15, 0x98, 0xd8, 0x22, 0x4e, 0x23, 0xda, 0x9a, 0xdb, 0x22, 0xb5, 0x6d, 0xb9, 0xe0, + 0x58, 0x98, 0x17, 0xed, 0xe9, 0xc8, 0xb5, 0x34, 0x09, 0xce, 0x2a, 0x87, 0xde, 0x82, 0xc9, 0x66, + 0x6b, 0xbd, 0xe1, 0x86, 0x5b, 0xab, 0x7e, 0xc4, 0x9c, 0x90, 0x66, 0xea, 0xf5, 0x80, 0x84, 0xfc, + 0x75, 0x29, 0x3b, 0x7a, 0x65, 0x20, 0x9d, 0x4a, 0x0e, 0x1d, 0xce, 0xe5, 0x80, 0xee, 0xc1, 0xc9, + 0xc4, 0x44, 0x10, 0x11, 0x31, 0x46, 0xf2, 0x53, 0xc4, 0x54, 0xb3, 0x0a, 0x88, 0xe0, 0x32, 0x59, + 0x28, 0x9c, 0x5d, 0x05, 0x7a, 0x05, 0xc0, 0x6d, 0x2e, 0x3a, 0x3b, 0x6e, 0x83, 0x5e, 0x15, 0x27, + 0xd8, 0x1c, 0xa1, 0xd7, 0x06, 0x58, 0xaa, 0x48, 0x28, 0xdd, 0x9b, 0xc5, 0xbf, 0x3d, 0xac, 0x51, + 0xa3, 0x65, 0x18, 0x11, 0xff, 0xf6, 0xc4, 0x90, 0xf2, 0xc0, 0x2c, 0x8f, 0xb3, 0xa8, 0x5a, 0x15, + 0x1d, 0x73, 0x90, 0x82, 0xe0, 0x44, 0x59, 0xb4, 0x09, 0xe7, 0x64, 0xa2, 0x3f, 0x7d, 0x7e, 0xca, + 0x31, 0x08, 0x59, 0x5e, 0x96, 0x01, 0xfe, 0x2a, 0x65, 0xa6, 0x1d, 0x21, 0x6e, 0xcf, 0x87, 0x9e, + 0xeb, 0xfa, 0x34, 0xe7, 0x6f, 0x8e, 0x4f, 0xc6, 0x11, 0x07, 0x97, 0x93, 0x48, 0x9c, 0xa6, 0x47, + 0x3e, 0x9c, 0x74, 0xbd, 0xac, 0x59, 0x7d, 0x8a, 0x31, 0xfa, 0x10, 0x7f, 0x6e, 0xdd, 0x7e, 0x46, + 0x67, 0xe2, 0x71, 0x36, 0xdf, 0x77, 0xe6, 0xf7, 0xf7, 0xfb, 0x16, 0x2d, 0xad, 0x49, 0xe7, 0xe8, + 0xd3, 0x30, 0xa4, 0x7f, 0x94, 0x90, 0x34, 0x2e, 0x66, 0x0b, 0xaf, 0xda, 0x9e, 0xc0, 0x65, 0x7b, + 0xb5, 0xee, 0x75, 0x1c, 0x36, 0x38, 0xa2, 0x5a, 0x46, 0x6c, 0x83, 0xcb, 0xdd, 0x49, 0x32, 0xdd, + 0xbb, 0xbd, 0x11, 0xc8, 0x9e, 0xee, 0x68, 0x19, 0x06, 0x6a, 0x0d, 0x97, 0x78, 0xd1, 0x52, 0xa5, + 0x5d, 0xf4, 0xc6, 0x39, 0x41, 0x23, 0xd6, 0x8f, 0x48, 0xb1, 0xc2, 0x61, 0x58, 0x71, 0xb0, 0x7f, + 0xb3, 0x00, 0xe5, 0x0e, 0xf9, 0x7a, 0x12, 0x66, 0x28, 0xab, 0x2b, 0x33, 0xd4, 0x0c, 0x8c, 0xc6, + 0xff, 0x74, 0x0d, 0x97, 0xf2, 0x64, 0xbd, 0x65, 0xa2, 0x71, 0x92, 0xbe, 0xeb, 0x47, 0x09, 0xba, + 0x25, 0xab, 0xa7, 0xe3, 0xb3, 0x1a, 0xc3, 0x82, 0xdd, 0xdb, 0xfd, 0xb5, 0x37, 0xd7, 0x1a, 0x69, + 0x7f, 0xad, 0x00, 0x27, 0x55, 0x17, 0x7e, 0xfb, 0x76, 0xdc, 0xcd, 0x74, 0xc7, 0x1d, 0x81, 0x2d, + 0xd7, 0xbe, 0x01, 0x7d, 0x3c, 0x1c, 0x65, 0x17, 0xe2, 0xf6, 0x63, 0x66, 0x94, 0x6c, 0x25, 0xe1, + 0x19, 0x91, 0xb2, 0xbf, 0xdf, 0x82, 0xd1, 0xc4, 0xeb, 0x36, 0x84, 0xb5, 0x27, 0xd0, 0x0f, 0x22, + 0x12, 0x67, 0x09, 0xdb, 0x17, 0xa0, 0x67, 0xcb, 0x0f, 0xa3, 0xa4, 0xa3, 0xc7, 0x35, 0x3f, 0x8c, + 0x30, 0xc3, 0xd8, 0x7f, 0x68, 0x41, 0xef, 0x9a, 0xe3, 0x7a, 0x91, 0x34, 0x0a, 0x58, 0x39, 0x46, + 0x81, 0x6e, 0xbe, 0x0b, 0xbd, 0x04, 0x7d, 0x64, 0x63, 0x83, 0xd4, 0x22, 0x31, 0xaa, 0x32, 0x14, + 0x42, 0xdf, 0x02, 0x83, 0x52, 0xf9, 0x8f, 0x55, 0xc6, 0xff, 0x62, 0x41, 0x8c, 0x6e, 0x43, 0x29, + 0x72, 0x77, 0xc8, 0x4c, 0xbd, 0x2e, 0x4c, 0xe5, 0x0f, 0x10, 0xbf, 0x63, 0x4d, 0x32, 0xc0, 0x31, + 0x2f, 0xfb, 0x8b, 0x05, 0x80, 0x38, 0x8e, 0x57, 0xa7, 0x4f, 0x9c, 0x4d, 0x19, 0x51, 0x2f, 0x66, + 0x18, 0x51, 0x51, 0xcc, 0x30, 0xc3, 0x82, 0xaa, 0xba, 0xa9, 0xd8, 0x55, 0x37, 0xf5, 0x1c, 0xa6, + 0x9b, 0xe6, 0x60, 0x3c, 0x8e, 0x43, 0x66, 0x86, 0x61, 0x64, 0x47, 0xe7, 0x5a, 0x12, 0x89, 0xd3, + 0xf4, 0x36, 0x81, 0x0b, 0x2a, 0x1c, 0x93, 0x38, 0xd1, 0x98, 0x1f, 0xb8, 0x6e, 0x94, 0xee, 0xd0, + 0x4f, 0xb1, 0x95, 0xb8, 0x90, 0x6b, 0x25, 0xfe, 0x09, 0x0b, 0x4e, 0x24, 0xeb, 0x61, 0x8f, 0xa6, + 0xbf, 0x60, 0xc1, 0x49, 0x66, 0x2b, 0x67, 0xb5, 0xa6, 0x2d, 0xf3, 0x2f, 0xb6, 0x0d, 0x31, 0x95, + 0xd3, 0xe2, 0x38, 0xe6, 0xc6, 0x4a, 0x16, 0x6b, 0x9c, 0x5d, 0xa3, 0xfd, 0x5f, 0x7b, 0x60, 0x32, + 0x2f, 0x36, 0x15, 0x7b, 0x26, 0xe2, 0xdc, 0xad, 0x6e, 0x93, 0x3b, 0xc2, 0x19, 0x3f, 0x7e, 0x26, + 0xc2, 0xc1, 0x58, 0xe2, 0x93, 0xe9, 0x4f, 0x0a, 0x5d, 0xa6, 0x3f, 0xd9, 0x82, 0xf1, 0x3b, 0x5b, + 0xc4, 0xbb, 0xe9, 0x85, 0x4e, 0xe4, 0x86, 0x1b, 0x2e, 0xb3, 0x2b, 0xf3, 0x79, 0x23, 0x73, 0x50, + 0x8f, 0xdf, 0x4e, 0x12, 0x1c, 0xec, 0x97, 0xcf, 0x19, 0x80, 0xb8, 0xc9, 0x7c, 0x23, 0xc1, 0x69, + 0xa6, 0xe9, 0xec, 0x31, 0x3d, 0x0f, 0x39, 0x7b, 0xcc, 0x8e, 0x2b, 0xbc, 0x51, 0xe4, 0x1b, 0x00, + 0x76, 0x63, 0x5c, 0x51, 0x50, 0xac, 0x51, 0xa0, 0x4f, 0x02, 0xd2, 0x33, 0x74, 0x19, 0xa1, 0x41, + 0x9f, 0xbb, 0xbf, 0x5f, 0x46, 0xab, 0x29, 0xec, 0xc1, 0x7e, 0x79, 0x82, 0x42, 0x97, 0x3c, 0x7a, + 0xf3, 0x8c, 0xe3, 0xa9, 0x65, 0x30, 0x42, 0xb7, 0x61, 0x8c, 0x42, 0xd9, 0x8a, 0x92, 0x71, 0x47, + 0xf9, 0x6d, 0xf1, 0x99, 0xfb, 0xfb, 0xe5, 0xb1, 0xd5, 0x04, 0x2e, 0x8f, 0x75, 0x8a, 0x09, 0x7a, + 0x05, 0x46, 0xe2, 0x79, 0x75, 0x9d, 0xec, 0xf1, 0x00, 0x3d, 0x25, 0xae, 0xf0, 0x5e, 0x31, 0x30, + 0x38, 0x41, 0x69, 0x7f, 0xc1, 0x82, 0x33, 0xb9, 0x19, 0xf1, 0xd1, 0x25, 0x18, 0x70, 0x9a, 0x2e, + 0x37, 0x5f, 0x88, 0xa3, 0x86, 0xa9, 0xc9, 0x2a, 0x4b, 0xdc, 0x78, 0xa1, 0xb0, 0x74, 0x87, 0xdf, + 0x76, 0xbd, 0x7a, 0x72, 0x87, 0xbf, 0xee, 0x7a, 0x75, 0xcc, 0x30, 0xea, 0xc8, 0x2a, 0xe6, 0x3e, + 0x45, 0xf8, 0x0a, 0x5d, 0xab, 0x19, 0xb9, 0xf3, 0x8f, 0xb7, 0x19, 0xe8, 0x19, 0xdd, 0xd4, 0x28, + 0xbc, 0x0a, 0x73, 0xcd, 0x8c, 0xdf, 0x67, 0x81, 0x78, 0xba, 0xdc, 0xc5, 0x99, 0xfc, 0x26, 0x0c, + 0xed, 0xa6, 0xb3, 0x17, 0x5e, 0xc8, 0x7f, 0xcb, 0x2d, 0x22, 0xae, 0x2b, 0x41, 0xdb, 0xc8, 0x54, + 0x68, 0xf0, 0xb2, 0xeb, 0x20, 0xb0, 0xf3, 0x84, 0x19, 0x14, 0x3a, 0xb7, 0xe6, 0x79, 0x80, 0x3a, + 0xa3, 0x65, 0x29, 0x8d, 0x0b, 0xa6, 0xc4, 0x35, 0xaf, 0x30, 0x58, 0xa3, 0xb2, 0xff, 0x79, 0x01, + 0x06, 0x65, 0xb6, 0xbc, 0x96, 0xd7, 0x8d, 0xda, 0xef, 0x50, 0xe9, 0xb3, 0xd1, 0x65, 0x28, 0x31, + 0xbd, 0x74, 0x25, 0xd6, 0x96, 0x2a, 0xad, 0xd0, 0x8a, 0x44, 0xe0, 0x98, 0x86, 0xee, 0x8e, 0x61, + 0x6b, 0x9d, 0x91, 0x27, 0x1e, 0xda, 0x56, 0x39, 0x18, 0x4b, 0x3c, 0xfa, 0x18, 0x8c, 0xf1, 0x72, + 0x81, 0xdf, 0x74, 0x36, 0xb9, 0x2d, 0xab, 0x57, 0x45, 0x2f, 0x19, 0x5b, 0x49, 0xe0, 0x0e, 0xf6, + 0xcb, 0x27, 0x92, 0x30, 0x66, 0xa4, 0x4d, 0x71, 0x61, 0x2e, 0x6b, 0xbc, 0x12, 0xba, 0xab, 0xa7, + 0x3c, 0xdd, 0x62, 0x14, 0xd6, 0xe9, 0xec, 0x4f, 0x03, 0x4a, 0xe7, 0x0d, 0x44, 0xaf, 0x73, 0x97, + 0x67, 0x37, 0x20, 0xf5, 0x76, 0x46, 0x5b, 0x3d, 0x46, 0x87, 0x7c, 0x23, 0xc7, 0x4b, 0x61, 0x55, + 0xde, 0xfe, 0x3f, 0x8b, 0x30, 0x96, 0x8c, 0x0a, 0x80, 0xae, 0x41, 0x1f, 0x17, 0x29, 0x05, 0xfb, + 0x36, 0x3e, 0x41, 0x5a, 0x2c, 0x01, 0x76, 0xb8, 0x0a, 0xa9, 0x54, 0x94, 0x47, 0x6f, 0xc1, 0x60, + 0xdd, 0xbf, 0xe3, 0xdd, 0x71, 0x82, 0xfa, 0x4c, 0x65, 0x49, 0x4c, 0xe7, 0x4c, 0x45, 0xc5, 0x7c, + 0x4c, 0xa6, 0xc7, 0x27, 0x60, 0xf6, 0xef, 0x18, 0x85, 0x75, 0x76, 0x68, 0x8d, 0x25, 0xfa, 0xd8, + 0x70, 0x37, 0x57, 0x9c, 0x66, 0xbb, 0xf7, 0x2f, 0x73, 0x92, 0x48, 0xe3, 0x3c, 0x2c, 0xb2, 0x81, + 0x70, 0x04, 0x8e, 0x19, 0xa1, 0xcf, 0xc2, 0x44, 0x98, 0x63, 0x3a, 0xc9, 0x4b, 0x23, 0xdb, 0xce, + 0x9a, 0x30, 0x7b, 0xfa, 0xfe, 0x7e, 0x79, 0x22, 0xcb, 0xc8, 0x92, 0x55, 0x8d, 0xfd, 0xa5, 0x13, + 0x60, 0x2c, 0x62, 0x23, 0xab, 0xb8, 0x75, 0x44, 0x59, 0xc5, 0x31, 0x0c, 0x90, 0x9d, 0x66, 0xb4, + 0x37, 0xef, 0x06, 0x62, 0x4c, 0x32, 0x79, 0x2e, 0x08, 0x9a, 0x34, 0x4f, 0x89, 0xc1, 0x8a, 0x4f, + 0x76, 0xea, 0xf7, 0xe2, 0x37, 0x31, 0xf5, 0x7b, 0xcf, 0x31, 0xa6, 0x7e, 0x5f, 0x85, 0xfe, 0x4d, + 0x37, 0xc2, 0xa4, 0xe9, 0x8b, 0xcb, 0x5c, 0xe6, 0x3c, 0xbc, 0xca, 0x49, 0xd2, 0x49, 0x86, 0x05, + 0x02, 0x4b, 0x26, 0xe8, 0x75, 0xb5, 0x02, 0xfb, 0xf2, 0x15, 0x2e, 0x69, 0xe7, 0x95, 0xcc, 0x35, + 0x28, 0x12, 0xbc, 0xf7, 0x3f, 0x68, 0x82, 0xf7, 0x45, 0x99, 0x96, 0x7d, 0x20, 0xff, 0xb1, 0x1a, + 0xcb, 0xba, 0xde, 0x21, 0x19, 0xfb, 0x2d, 0x3d, 0x95, 0x7d, 0x29, 0x7f, 0x27, 0x50, 0x59, 0xea, + 0xbb, 0x4c, 0x60, 0xff, 0x7d, 0x16, 0x9c, 0x4c, 0xa6, 0x9a, 0x65, 0x6f, 0x2a, 0x84, 0x9f, 0xc7, + 0x4b, 0xdd, 0xe4, 0xfe, 0x65, 0x05, 0x8c, 0x0a, 0x99, 0x8e, 0x34, 0x93, 0x0c, 0x67, 0x57, 0x47, + 0x3b, 0x3a, 0x58, 0xaf, 0x0b, 0x7f, 0x83, 0xc7, 0x72, 0x32, 0xe1, 0xb7, 0xc9, 0x7f, 0xbf, 0x96, + 0x91, 0x75, 0xfd, 0xf1, 0xbc, 0xac, 0xeb, 0x5d, 0xe7, 0x5a, 0x7f, 0x5d, 0xe5, 0xc0, 0x1f, 0xce, + 0x9f, 0x4a, 0x3c, 0xc3, 0x7d, 0xc7, 0xcc, 0xf7, 0xaf, 0xab, 0xcc, 0xf7, 0x6d, 0x22, 0x8b, 0xf3, + 0xbc, 0xf6, 0x1d, 0xf3, 0xdd, 0x6b, 0x39, 0xeb, 0x47, 0x8f, 0x26, 0x67, 0xbd, 0x71, 0xd4, 0xf0, + 0xb4, 0xe9, 0xcf, 0x74, 0x38, 0x6a, 0x0c, 0xbe, 0xed, 0x0f, 0x1b, 0x9e, 0x9f, 0x7f, 0xfc, 0x81, + 0xf2, 0xf3, 0xdf, 0xd2, 0xf3, 0xdd, 0xa3, 0x0e, 0x09, 0xdd, 0x29, 0x51, 0x97, 0x59, 0xee, 0x6f, + 0xe9, 0x07, 0xe0, 0x44, 0x3e, 0x5f, 0x75, 0xce, 0xa5, 0xf9, 0x66, 0x1e, 0x81, 0xa9, 0xec, 0xf9, + 0x27, 0x8e, 0x27, 0x7b, 0xfe, 0xc9, 0x23, 0xcf, 0x9e, 0x7f, 0xea, 0x18, 0xb2, 0xe7, 0x9f, 0x3e, + 0xc6, 0xec, 0xf9, 0xb7, 0x98, 0x73, 0x14, 0x0f, 0x00, 0x25, 0x22, 0xa1, 0x3f, 0x95, 0x13, 0x3f, + 0x2d, 0x1d, 0x25, 0x8a, 0x7f, 0x9c, 0x42, 0xe1, 0x98, 0x55, 0x46, 0x56, 0xfe, 0xc9, 0x87, 0x90, + 0x95, 0x7f, 0x35, 0xce, 0xca, 0x7f, 0x26, 0x7f, 0xa8, 0x33, 0x9e, 0xd3, 0xe4, 0xe4, 0xe2, 0xbf, + 0xa5, 0xe7, 0xd0, 0x7f, 0xa4, 0x8d, 0x15, 0x2c, 0x4b, 0xa1, 0xdc, 0x26, 0x73, 0xfe, 0x6b, 0x3c, + 0x73, 0xfe, 0xd9, 0xfc, 0x9d, 0x3c, 0x79, 0xdc, 0x19, 0xf9, 0xf2, 0x69, 0xbb, 0x54, 0xf0, 0x57, + 0x16, 0xf3, 0x3d, 0xa7, 0x5d, 0x2a, 0x7a, 0x6c, 0xba, 0x5d, 0x0a, 0x85, 0x63, 0x56, 0xf6, 0x0f, + 0x14, 0xe0, 0x7c, 0xfb, 0xf5, 0x16, 0x6b, 0xc9, 0x2b, 0xb1, 0x43, 0x40, 0x42, 0x4b, 0xce, 0xef, + 0x6c, 0x31, 0x55, 0xd7, 0xf1, 0x20, 0xaf, 0xc2, 0xb8, 0x7a, 0x87, 0xd3, 0x70, 0x6b, 0x7b, 0xab, + 0xf1, 0x35, 0x59, 0x45, 0x4e, 0xa8, 0x26, 0x09, 0x70, 0xba, 0x0c, 0x9a, 0x81, 0x51, 0x03, 0xb8, + 0x34, 0x2f, 0xee, 0x66, 0x71, 0x94, 0x71, 0x13, 0x8d, 0x93, 0xf4, 0xf6, 0xcf, 0x59, 0x70, 0x3a, + 0x27, 0xe5, 0x6b, 0xd7, 0xe1, 0x0e, 0x37, 0x60, 0xb4, 0x69, 0x16, 0xed, 0x10, 0xa1, 0xd5, 0x48, + 0x2c, 0xab, 0xda, 0x9a, 0x40, 0xe0, 0x24, 0x53, 0xfb, 0x67, 0x0a, 0x70, 0xae, 0xad, 0x63, 0x29, + 0xc2, 0x70, 0x6a, 0x73, 0x27, 0x74, 0xe6, 0x02, 0x52, 0x27, 0x5e, 0xe4, 0x3a, 0x8d, 0x6a, 0x93, + 0xd4, 0x34, 0x3b, 0x07, 0xf3, 0xd0, 0xbc, 0xba, 0x52, 0x9d, 0x49, 0x53, 0xe0, 0x9c, 0x92, 0x68, + 0x11, 0x50, 0x1a, 0x23, 0x46, 0x98, 0x65, 0x0f, 0x48, 0xf3, 0xc3, 0x19, 0x25, 0xd0, 0x07, 0x61, + 0x58, 0x39, 0xac, 0x6a, 0x23, 0xce, 0x36, 0x76, 0xac, 0x23, 0xb0, 0x49, 0x87, 0xae, 0xf0, 0xf4, + 0x13, 0x22, 0x51, 0x89, 0x30, 0x8a, 0x8c, 0xca, 0xdc, 0x12, 0x02, 0x8c, 0x75, 0x9a, 0xd9, 0x97, + 0x7f, 0xeb, 0x1b, 0xe7, 0xdf, 0xf7, 0xbb, 0xdf, 0x38, 0xff, 0xbe, 0x3f, 0xf8, 0xc6, 0xf9, 0xf7, + 0x7d, 0xd7, 0xfd, 0xf3, 0xd6, 0x6f, 0xdd, 0x3f, 0x6f, 0xfd, 0xee, 0xfd, 0xf3, 0xd6, 0x1f, 0xdc, + 0x3f, 0x6f, 0xfd, 0xf1, 0xfd, 0xf3, 0xd6, 0x17, 0xff, 0xe4, 0xfc, 0xfb, 0xde, 0x44, 0x71, 0x00, + 0xd1, 0xcb, 0x74, 0x74, 0x2e, 0xef, 0x5e, 0xf9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x0b, + 0x0a, 0x3d, 0x91, 0x13, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -8752,6 +8820,15 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.RestartPolicy != nil { + i -= len(*m.RestartPolicy) + copy(dAtA[i:], *m.RestartPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.RestartPolicy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } if len(m.ResizePolicy) > 0 { for iNdEx := len(m.ResizePolicy) - 1; iNdEx >= 0; iNdEx-- { { @@ -10105,6 +10182,15 @@ func (m *EphemeralContainerCommon) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.RestartPolicy != nil { + i -= len(*m.RestartPolicy) + copy(dAtA[i:], *m.RestartPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.RestartPolicy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } if len(m.ResizePolicy) > 0 { for iNdEx := len(m.ResizePolicy) - 1; iNdEx >= 0; iNdEx-- { { @@ -11255,6 +11341,34 @@ func (m *HostAlias) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *HostIP) 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 *HostIP) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HostIP) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.IP) + copy(dAtA[i:], m.IP) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IP))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *HostPathVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -13740,12 +13854,29 @@ func (m *PersistentVolumeClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, er _ = i var l int _ = l - if m.ResizeStatus != nil { - i -= len(*m.ResizeStatus) - copy(dAtA[i:], *m.ResizeStatus) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ResizeStatus))) - i-- - dAtA[i] = 0x32 + if len(m.AllocatedResourceStatuses) > 0 { + keysForAllocatedResourceStatuses := make([]string, 0, len(m.AllocatedResourceStatuses)) + for k := range m.AllocatedResourceStatuses { + keysForAllocatedResourceStatuses = append(keysForAllocatedResourceStatuses, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAllocatedResourceStatuses) + for iNdEx := len(keysForAllocatedResourceStatuses) - 1; iNdEx >= 0; iNdEx-- { + v := m.AllocatedResourceStatuses[ResourceName(keysForAllocatedResourceStatuses[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForAllocatedResourceStatuses[iNdEx]) + copy(dAtA[i:], keysForAllocatedResourceStatuses[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAllocatedResourceStatuses[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } } if len(m.AllocatedResources) > 0 { keysForAllocatedResources := make([]string, 0, len(m.AllocatedResources)) @@ -14404,6 +14535,18 @@ func (m *PersistentVolumeStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if m.LastPhaseTransitionTime != nil { + { + size, err := m.LastPhaseTransitionTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } i -= len(m.Reason) copy(dAtA[i:], m.Reason) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -15267,6 +15410,41 @@ func (m *PodResourceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodResourceClaimStatus) 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 *PodResourceClaimStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ResourceClaimName != nil { + i -= len(*m.ResourceClaimName) + copy(dAtA[i:], *m.ResourceClaimName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ResourceClaimName))) + i-- + dAtA[i] = 0x12 + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PodSchedulingGate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15936,6 +16114,36 @@ func (m *PodStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.HostIPs) > 0 { + for iNdEx := len(m.HostIPs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.HostIPs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } + } + if len(m.ResourceClaimStatuses) > 0 { + for iNdEx := len(m.ResourceClaimStatuses) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ResourceClaimStatuses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + } i -= len(m.Resize) copy(dAtA[i:], m.Resize) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resize))) @@ -20970,6 +21178,10 @@ func (m *Container) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if m.RestartPolicy != nil { + l = len(*m.RestartPolicy) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -21469,6 +21681,10 @@ func (m *EphemeralContainerCommon) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if m.RestartPolicy != nil { + l = len(*m.RestartPolicy) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -21805,6 +22021,17 @@ func (m *HostAlias) Size() (n int) { return n } +func (m *HostIP) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IP) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *HostPathVolumeSource) Size() (n int) { if m == nil { return 0 @@ -22744,9 +22971,13 @@ func (m *PersistentVolumeClaimStatus) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } - if m.ResizeStatus != nil { - l = len(*m.ResizeStatus) - n += 1 + l + sovGenerated(uint64(l)) + if len(m.AllocatedResourceStatuses) > 0 { + for k, v := range m.AllocatedResourceStatuses { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } } return n } @@ -22950,6 +23181,10 @@ func (m *PersistentVolumeStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Reason) n += 1 + l + sovGenerated(uint64(l)) + if m.LastPhaseTransitionTime != nil { + l = m.LastPhaseTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -23263,6 +23498,21 @@ func (m *PodResourceClaim) Size() (n int) { return n } +func (m *PodResourceClaimStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.ResourceClaimName != nil { + l = len(*m.ResourceClaimName) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *PodSchedulingGate) Size() (n int) { if m == nil { return 0 @@ -23552,6 +23802,18 @@ func (m *PodStatus) Size() (n int) { } l = len(m.Resize) n += 1 + l + sovGenerated(uint64(l)) + if len(m.ResourceClaimStatuses) > 0 { + for _, e := range m.ResourceClaimStatuses { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.HostIPs) > 0 { + for _, e := range m.HostIPs { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -25585,6 +25847,7 @@ func (this *Container) String() string { `VolumeDevices:` + repeatedStringForVolumeDevices + `,`, `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, + `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, `}`, }, "") return s @@ -25960,6 +26223,7 @@ func (this *EphemeralContainerCommon) String() string { `VolumeDevices:` + repeatedStringForVolumeDevices + `,`, `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, + `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, `}`, }, "") return s @@ -26221,6 +26485,16 @@ func (this *HostAlias) String() string { }, "") return s } +func (this *HostIP) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HostIP{`, + `IP:` + fmt.Sprintf("%v", this.IP) + `,`, + `}`, + }, "") + return s +} func (this *HostPathVolumeSource) String() string { if this == nil { return "nil" @@ -26972,13 +27246,23 @@ func (this *PersistentVolumeClaimStatus) String() string { mapStringForAllocatedResources += fmt.Sprintf("%v: %v,", k, this.AllocatedResources[ResourceName(k)]) } mapStringForAllocatedResources += "}" + keysForAllocatedResourceStatuses := make([]string, 0, len(this.AllocatedResourceStatuses)) + for k := range this.AllocatedResourceStatuses { + keysForAllocatedResourceStatuses = append(keysForAllocatedResourceStatuses, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAllocatedResourceStatuses) + mapStringForAllocatedResourceStatuses := "map[ResourceName]ClaimResourceStatus{" + for _, k := range keysForAllocatedResourceStatuses { + mapStringForAllocatedResourceStatuses += fmt.Sprintf("%v: %v,", k, this.AllocatedResourceStatuses[ResourceName(k)]) + } + mapStringForAllocatedResourceStatuses += "}" s := strings.Join([]string{`&PersistentVolumeClaimStatus{`, `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `AccessModes:` + fmt.Sprintf("%v", this.AccessModes) + `,`, `Capacity:` + mapStringForCapacity + `,`, `Conditions:` + repeatedStringForConditions + `,`, `AllocatedResources:` + mapStringForAllocatedResources + `,`, - `ResizeStatus:` + valueToStringGenerated(this.ResizeStatus) + `,`, + `AllocatedResourceStatuses:` + mapStringForAllocatedResourceStatuses + `,`, `}`, }, "") return s @@ -27088,6 +27372,7 @@ func (this *PersistentVolumeStatus) String() string { `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `LastPhaseTransitionTime:` + strings.Replace(fmt.Sprintf("%v", this.LastPhaseTransitionTime), "Time", "v1.Time", 1) + `,`, `}`, }, "") return s @@ -27337,6 +27622,17 @@ func (this *PodResourceClaim) String() string { }, "") return s } +func (this *PodResourceClaimStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodResourceClaimStatus{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ResourceClaimName:` + valueToStringGenerated(this.ResourceClaimName) + `,`, + `}`, + }, "") + return s +} func (this *PodSchedulingGate) String() string { if this == nil { return "nil" @@ -27533,6 +27829,16 @@ func (this *PodStatus) String() string { repeatedStringForEphemeralContainerStatuses += strings.Replace(strings.Replace(f.String(), "ContainerStatus", "ContainerStatus", 1), `&`, ``, 1) + "," } repeatedStringForEphemeralContainerStatuses += "}" + repeatedStringForResourceClaimStatuses := "[]PodResourceClaimStatus{" + for _, f := range this.ResourceClaimStatuses { + repeatedStringForResourceClaimStatuses += strings.Replace(strings.Replace(f.String(), "PodResourceClaimStatus", "PodResourceClaimStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForResourceClaimStatuses += "}" + repeatedStringForHostIPs := "[]HostIP{" + for _, f := range this.HostIPs { + repeatedStringForHostIPs += strings.Replace(strings.Replace(f.String(), "HostIP", "HostIP", 1), `&`, ``, 1) + "," + } + repeatedStringForHostIPs += "}" s := strings.Join([]string{`&PodStatus{`, `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `Conditions:` + repeatedStringForConditions + `,`, @@ -27548,6 +27854,8 @@ func (this *PodStatus) String() string { `PodIPs:` + repeatedStringForPodIPs + `,`, `EphemeralContainerStatuses:` + repeatedStringForEphemeralContainerStatuses + `,`, `Resize:` + fmt.Sprintf("%v", this.Resize) + `,`, + `ResourceClaimStatuses:` + repeatedStringForResourceClaimStatuses + `,`, + `HostIPs:` + repeatedStringForHostIPs + `,`, `}`, }, "") return s @@ -34125,6 +34433,39 @@ func (m *Container) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) + m.RestartPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -38278,6 +38619,39 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) + m.RestartPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -41368,6 +41742,88 @@ func (m *HostAlias) Unmarshal(dAtA []byte) error { } return nil } +func (m *HostIP) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HostIP: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HostIP: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IP", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IP = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *HostPathVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -49625,11 +50081,140 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.AllocatedResources == nil { - m.AllocatedResources = make(ResourceList) + if m.AllocatedResources == nil { + m.AllocatedResources = make(ResourceList) + } + var mapkey ResourceName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.AllocatedResources[ResourceName(mapkey)] = *mapvalue + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocatedResourceStatuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AllocatedResourceStatuses == nil { + m.AllocatedResourceStatuses = make(map[ResourceName]ClaimResourceStatus) } var mapkey ResourceName - mapvalue := &resource.Quantity{} + var mapvalue ClaimResourceStatus for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 @@ -49678,7 +50263,7 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { mapkey = ResourceName(dAtA[iNdEx:postStringIndexmapkey]) iNdEx = postStringIndexmapkey } else if fieldNum == 2 { - var mapmsglen int + var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -49688,26 +50273,24 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - mapmsglen |= int(b&0x7F) << shift + stringLenmapvalue |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if mapmsglen < 0 { + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { return ErrInvalidLengthGenerated } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { return ErrInvalidLengthGenerated } - if postmsgIndex > l { + if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF } - mapvalue = &resource.Quantity{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex + mapvalue = ClaimResourceStatus(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -49723,40 +50306,7 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { iNdEx += skippy } } - m.AllocatedResources[ResourceName(mapkey)] = *mapvalue - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResizeStatus", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := PersistentVolumeClaimResizeStatus(dAtA[iNdEx:postIndex]) - m.ResizeStatus = &s + m.AllocatedResourceStatuses[ResourceName(mapkey)] = ((ClaimResourceStatus)(mapvalue)) iNdEx = postIndex default: iNdEx = preIndex @@ -51526,6 +52076,42 @@ func (m *PersistentVolumeStatus) Unmarshal(dAtA []byte) error { } m.Reason = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastPhaseTransitionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastPhaseTransitionTime == nil { + m.LastPhaseTransitionTime = &v1.Time{} + } + if err := m.LastPhaseTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -54039,6 +54625,121 @@ func (m *PodResourceClaim) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodResourceClaimStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodResourceClaimStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodResourceClaimStatus: 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 ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceClaimName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ResourceClaimName = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PodSchedulingGate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -56483,6 +57184,74 @@ func (m *PodStatus) Unmarshal(dAtA []byte) error { } m.Resize = PodResizeStatus(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceClaimStatuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceClaimStatuses = append(m.ResourceClaimStatuses, PodResourceClaimStatus{}) + if err := m.ResourceClaimStatuses[len(m.ResourceClaimStatuses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostIPs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HostIPs = append(m.HostIPs, HostIP{}) + if err := m.HostIPs[len(m.HostIPs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/core/v1/generated.proto b/tools/vendor/k8s.io/api/core/v1/generated.proto index 94e0a7115..901e83731 100644 --- a/tools/vendor/k8s.io/api/core/v1/generated.proto +++ b/tools/vendor/k8s.io/api/core/v1/generated.proto @@ -414,15 +414,9 @@ message ClaimSource { // // The template will be used to create a new ResourceClaim, which will // be bound to this pod. When this pod is deleted, the ResourceClaim - // will also be deleted. The name of the ResourceClaim will be -, where is the - // PodResourceClaim.Name. Pod validation will reject the pod if the - // concatenated name is not valid for a ResourceClaim (e.g. too long). - // - // An existing ResourceClaim with that name that is not owned by the - // pod will not be used for the pod to avoid using an unrelated - // resource by mistake. Scheduling and pod startup are then blocked - // until the unrelated ResourceClaim is removed. + // will also be deleted. The pod name and resource name, along with a + // generated component, will be used to form a unique name for the + // ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses. // // This field is immutable and no changes will be made to the // corresponding ResourceClaim by the control plane after creating the @@ -729,6 +723,25 @@ message Container { // +listType=atomic repeated ContainerResizePolicy resizePolicy = 23; + // RestartPolicy defines the restart behavior of individual containers in a pod. + // This field may only be set for init containers, and the only allowed value is "Always". + // For non-init containers or when this field is not specified, + // the restart behavior is defined by the Pod's restart policy and the container type. + // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // this init container will be continually restarted on + // exit until all regular containers have terminated. Once all regular + // containers have completed, all init containers with restartPolicy "Always" + // will be shut down. This lifecycle differs from normal init containers and + // is often referred to as a "sidecar" container. Although this init + // container still starts in the init container sequence, it does not wait + // for the container to complete before proceeding to the next init + // container. Instead, the next init container starts immediately after this + // init container is started, or after any startupProbe has successfully + // completed. + // +featureGate=SidecarContainers + // +optional + optional string restartPolicy = 24; + // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -1147,6 +1160,8 @@ message EndpointPort { // // * Kubernetes-defined prefixed names: // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 // // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. @@ -1386,6 +1401,14 @@ message EphemeralContainerCommon { // +listType=atomic repeated ContainerResizePolicy resizePolicy = 23; + // Restart policy for the container to manage the restart behavior of each + // container within a pod. + // This may only be set for init containers. You cannot set this field on + // ephemeral containers. + // +featureGate=SidecarContainers + // +optional + optional string restartPolicy = 24; + // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -1853,7 +1876,8 @@ message HTTPGetAction { // HTTPHeader describes a custom header to be used in HTTP probes message HTTPHeader { - // The header field name + // The header field name. + // This will be canonicalized upon output, so case-variant names will be understood as the same header. optional string name = 1; // The header field value @@ -1870,6 +1894,12 @@ message HostAlias { repeated string hostnames = 2; } +// HostIP represents a single IP address allocated to the host. +message HostIP { + // IP is the IP address assigned to the host + optional string ip = 1; +} + // Represents a host path mapped into a pod. // Host path volumes do not support ownership management or SELinux relabeling. message HostPathVolumeSource { @@ -2862,25 +2892,71 @@ message PersistentVolumeClaimStatus { // +patchStrategy=merge repeated PersistentVolumeClaimCondition conditions = 4; - // allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may - // be larger than the actual capacity when a volume expansion operation is requested. + // allocatedResources tracks the resources allocated to a PVC including its capacity. + // Key names follow standard Kubernetes label syntax. Valid values are either: + // * Un-prefixed keys: + // - storage - the capacity of the volume. + // * Custom resources must use implementation-defined prefixed names such as "example.com/my-custom-resource" + // Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered + // reserved and hence may not be used. + // + // Capacity reported here may be larger than the actual capacity when a volume expansion operation + // is requested. // For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. // If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. // If a volume expansion capacity request is lowered, allocatedResources is only // lowered if there are no expansion operations in progress and if the actual volume capacity // is equal or lower than the requested capacity. + // + // A controller that receives PVC update with previously unknown resourceName + // should ignore the update for the purpose it was designed. For example - a controller that + // only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid + // resources associated with PVC. + // // This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature. // +featureGate=RecoverVolumeExpansionFailure // +optional map allocatedResources = 5; - // resizeStatus stores status of resize operation. - // ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty - // string by resize controller or kubelet. + // allocatedResourceStatuses stores status of resource being resized for the given PVC. + // Key names follow standard Kubernetes label syntax. Valid values are either: + // * Un-prefixed keys: + // - storage - the capacity of the volume. + // * Custom resources must use implementation-defined prefixed names such as "example.com/my-custom-resource" + // Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered + // reserved and hence may not be used. + // + // ClaimResourceStatus can be in any of following states: + // - ControllerResizeInProgress: + // State set when resize controller starts resizing the volume in control-plane. + // - ControllerResizeFailed: + // State set when resize has failed in resize controller with a terminal error. + // - NodeResizePending: + // State set when resize controller has finished resizing the volume but further resizing of + // volume is needed on the node. + // - NodeResizeInProgress: + // State set when kubelet starts resizing the volume. + // - NodeResizeFailed: + // State set when resizing has failed in kubelet with a terminal error. Transient errors don't set + // NodeResizeFailed. + // For example: if expanding a PVC for more capacity - this field can be one of the following states: + // - pvc.status.allocatedResourceStatus['storage'] = "ControllerResizeInProgress" + // - pvc.status.allocatedResourceStatus['storage'] = "ControllerResizeFailed" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizePending" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizeInProgress" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizeFailed" + // When this field is not set, it means that no resize operation is in progress for the given PVC. + // + // A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus + // should ignore the update for the purpose it was designed. For example - a controller that + // only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid + // resources associated with PVC. + // // This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature. // +featureGate=RecoverVolumeExpansionFailure + // +mapType=granular // +optional - optional string resizeStatus = 6; + map allocatedResourceStatuses = 7; } // PersistentVolumeClaimTemplate is used to produce @@ -3102,6 +3178,13 @@ message PersistentVolumeStatus { // for machine parsing and tidy display in the CLI. // +optional optional string reason = 3; + + // lastPhaseTransitionTime is the time the phase transitioned from one to another + // and automatically resets to current time everytime a volume phase transitions. + // This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature. + // +featureGate=PersistentVolumeLastPhaseTransitionTime + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastPhaseTransitionTime = 4; } // Represents a Photon Controller persistent disk resource. @@ -3346,12 +3429,9 @@ message PodExecOptions { repeated string command = 6; } -// IP address information for entries in the (plural) PodIPs field. -// Each entry includes: -// -// IP: An IP address allocated to the pod. Routable at least within the cluster. +// PodIP represents a single IP address allocated to the pod. message PodIP { - // ip is an IP address (IPv4 or IPv6) assigned to the pod + // IP is the IP address assigned to the pod optional string ip = 1; } @@ -3468,6 +3548,24 @@ message PodResourceClaim { optional ClaimSource source = 2; } +// PodResourceClaimStatus is stored in the PodStatus for each PodResourceClaim +// which references a ResourceClaimTemplate. It stores the generated name for +// the corresponding ResourceClaim. +message PodResourceClaimStatus { + // Name uniquely identifies this resource claim inside the pod. + // This must match the name of an entry in pod.spec.resourceClaims, + // which implies that the string must be a DNS_LABEL. + optional string name = 1; + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. It this is + // unset, then generating a ResourceClaim was not necessary. The + // pod.spec.resourceClaims entry can be ignored in this case. + // + // +optional + optional string resourceClaimName = 2; +} + // PodSchedulingGate is associated to a Pod to guard its scheduling. message PodSchedulingGate { // Name of the scheduling gate. @@ -3959,11 +4057,23 @@ message PodStatus { // +optional optional string nominatedNodeName = 11; - // IP address of the host to which the pod is assigned. Empty if not yet scheduled. + // hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. + // A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will + // not be updated even if there is a node is assigned to pod // +optional optional string hostIP = 5; - // IP address allocated to the pod. Routable at least within the cluster. + // hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must + // match the hostIP field. This list is empty if the pod has not started yet. + // A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will + // not be updated even if there is a node is assigned to this pod. + // +optional + // +patchStrategy=merge + // +patchMergeKey=ip + // +listType=atomic + repeated HostIP hostIPs = 16; + + // podIP address allocated to the pod. Routable at least within the cluster. // Empty if not yet allocated. // +optional optional string podIP = 6; @@ -4008,6 +4118,15 @@ message PodStatus { // +featureGate=InPlacePodVerticalScaling // +optional optional string resize = 14; + + // Status of resource claims. + // +patchMergeKey=name + // +patchStrategy=merge,retainKeys + // +listType=map + // +listMapKey=name + // +featureGate=DynamicResourceAllocation + // +optional + repeated PodResourceClaimStatus resourceClaimStatuses = 15; } // PodStatusResult is a wrapper for PodStatus returned by kubelet that can be encode/decoded @@ -4752,7 +4871,7 @@ message SeccompProfile { // localhostProfile indicates a profile defined in a file on the node should be used. // The profile must be preconfigured on the node to work. // Must be a descending path, relative to the kubelet's configured seccomp profile location. - // Must only be set if type is "Localhost". + // Must be set if type is "Localhost". Must NOT be set for any other type. // +optional optional string localhostProfile = 2; } @@ -5123,10 +5242,19 @@ message ServicePort { optional string protocol = 2; // The application protocol for this port. + // This is used as a hint for implementations to offer richer behavior for protocols that they understand. // This field follows standard Kubernetes label syntax. - // Un-prefixed names are reserved for IANA standard service names (as per + // Valid values are either: + // + // * Un-prefixed protocol names - reserved for IANA standard service names (as per // RFC-6335 and https://www.iana.org/assignments/service-names). - // Non-standard protocols should use prefixed names such as + // + // * Kubernetes-defined prefixed names: + // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 + // + // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. // +optional optional string appProtocol = 6; @@ -5274,10 +5402,9 @@ message ServiceSpec { // This feature depends on whether the underlying cloud-provider supports specifying // the loadBalancerIP when a load balancer is created. // This field will be ignored if the cloud-provider does not support the feature. - // Deprecated: This field was under-specified and its meaning varies across implementations, - // and it cannot support dual-stack. - // As of Kubernetes v1.24, users are encouraged to use implementation-specific annotations when available. - // This field may be removed in a future API version. + // Deprecated: This field was under-specified and its meaning varies across implementations. + // Using it is non-portable and it may not support dual-stack. + // Users are encouraged to use implementation-specific annotations when available. // +optional optional string loadBalancerIP = 8; @@ -6052,12 +6179,9 @@ message WindowsSecurityContextOptions { optional string runAsUserName = 3; // HostProcess determines if a container should be run as a 'Host Process' container. - // This field is alpha-level and will only be honored by components that enable the - // WindowsHostProcessContainers feature flag. Setting this field without the feature - // flag will result in errors when validating the Pod. All of a Pod's containers must - // have the same effective HostProcess value (it is not allowed to have a mix of HostProcess - // containers and non-HostProcess containers). In addition, if HostProcess is true - // then HostNetwork must also be set to true. + // All of a Pod's containers must have the same effective HostProcess value + // (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). + // In addition, if HostProcess is true then HostNetwork must also be set to true. // +optional optional bool hostProcess = 4; } diff --git a/tools/vendor/k8s.io/api/core/v1/types.go b/tools/vendor/k8s.io/api/core/v1/types.go index c9bb18a2c..9e05c2235 100644 --- a/tools/vendor/k8s.io/api/core/v1/types.go +++ b/tools/vendor/k8s.io/api/core/v1/types.go @@ -411,6 +411,12 @@ type PersistentVolumeStatus struct { // for machine parsing and tidy display in the CLI. // +optional Reason string `json:"reason,omitempty" protobuf:"bytes,3,opt,name=reason"` + // lastPhaseTransitionTime is the time the phase transitioned from one to another + // and automatically resets to current time everytime a volume phase transitions. + // This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature. + // +featureGate=PersistentVolumeLastPhaseTransitionTime + // +optional + LastPhaseTransitionTime *metav1.Time `json:"lastPhaseTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastPhaseTransitionTime"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -558,23 +564,27 @@ const ( ) // +enum -type PersistentVolumeClaimResizeStatus string +// When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource +// that it does not recognizes, then it should ignore that update and let other controllers +// handle it. +type ClaimResourceStatus string const ( - // When expansion is complete, the empty string is set by resize controller or kubelet. - PersistentVolumeClaimNoExpansionInProgress PersistentVolumeClaimResizeStatus = "" - // State set when resize controller starts expanding the volume in control-plane - PersistentVolumeClaimControllerExpansionInProgress PersistentVolumeClaimResizeStatus = "ControllerExpansionInProgress" - // State set when expansion has failed in resize controller with a terminal error. - // Transient errors such as timeout should not set this status and should leave ResizeStatus + // State set when resize controller starts resizing the volume in control-plane. + PersistentVolumeClaimControllerResizeInProgress ClaimResourceStatus = "ControllerResizeInProgress" + + // State set when resize has failed in resize controller with a terminal error. + // Transient errors such as timeout should not set this status and should leave allocatedResourceStatus // unmodified, so as resize controller can resume the volume expansion. - PersistentVolumeClaimControllerExpansionFailed PersistentVolumeClaimResizeStatus = "ControllerExpansionFailed" - // State set when resize controller has finished expanding the volume but further expansion is needed on the node. - PersistentVolumeClaimNodeExpansionPending PersistentVolumeClaimResizeStatus = "NodeExpansionPending" - // State set when kubelet starts expanding the volume. - PersistentVolumeClaimNodeExpansionInProgress PersistentVolumeClaimResizeStatus = "NodeExpansionInProgress" - // State set when expansion has failed in kubelet with a terminal error. Transient errors don't set NodeExpansionFailed. - PersistentVolumeClaimNodeExpansionFailed PersistentVolumeClaimResizeStatus = "NodeExpansionFailed" + PersistentVolumeClaimControllerResizeFailed ClaimResourceStatus = "ControllerResizeFailed" + + // State set when resize controller has finished resizing the volume but further resizing of volume + // is needed on the node. + PersistentVolumeClaimNodeResizePending ClaimResourceStatus = "NodeResizePending" + // State set when kubelet starts resizing the volume. + PersistentVolumeClaimNodeResizeInProgress ClaimResourceStatus = "NodeResizeInProgress" + // State set when resizing has failed in kubelet with a terminal error. Transient errors don't set NodeResizeFailed + PersistentVolumeClaimNodeResizeFailed ClaimResourceStatus = "NodeResizeFailed" ) // PersistentVolumeClaimCondition contains details about state of pvc @@ -615,24 +625,74 @@ type PersistentVolumeClaimStatus struct { // +patchMergeKey=type // +patchStrategy=merge Conditions []PersistentVolumeClaimCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,4,rep,name=conditions"` - // allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may - // be larger than the actual capacity when a volume expansion operation is requested. + // allocatedResources tracks the resources allocated to a PVC including its capacity. + // Key names follow standard Kubernetes label syntax. Valid values are either: + // * Un-prefixed keys: + // - storage - the capacity of the volume. + // * Custom resources must use implementation-defined prefixed names such as "example.com/my-custom-resource" + // Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered + // reserved and hence may not be used. + // + // Capacity reported here may be larger than the actual capacity when a volume expansion operation + // is requested. // For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. // If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. // If a volume expansion capacity request is lowered, allocatedResources is only // lowered if there are no expansion operations in progress and if the actual volume capacity // is equal or lower than the requested capacity. + // + // A controller that receives PVC update with previously unknown resourceName + // should ignore the update for the purpose it was designed. For example - a controller that + // only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid + // resources associated with PVC. + // // This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature. // +featureGate=RecoverVolumeExpansionFailure // +optional AllocatedResources ResourceList `json:"allocatedResources,omitempty" protobuf:"bytes,5,rep,name=allocatedResources,casttype=ResourceList,castkey=ResourceName"` - // resizeStatus stores status of resize operation. - // ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty - // string by resize controller or kubelet. + + // resizestatus is tombstoned since the field was replaced by allocatedResourceStatus + // ResizeStatus *PersistentVolumeClaimResizeStatus `json:"resizeStatus,omitempty" protobuf:"bytes,6,opt,name=resizeStatus,casttype=PersistentVolumeClaimResizeStatus"` + + // allocatedResourceStatuses stores status of resource being resized for the given PVC. + // Key names follow standard Kubernetes label syntax. Valid values are either: + // * Un-prefixed keys: + // - storage - the capacity of the volume. + // * Custom resources must use implementation-defined prefixed names such as "example.com/my-custom-resource" + // Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered + // reserved and hence may not be used. + // + // ClaimResourceStatus can be in any of following states: + // - ControllerResizeInProgress: + // State set when resize controller starts resizing the volume in control-plane. + // - ControllerResizeFailed: + // State set when resize has failed in resize controller with a terminal error. + // - NodeResizePending: + // State set when resize controller has finished resizing the volume but further resizing of + // volume is needed on the node. + // - NodeResizeInProgress: + // State set when kubelet starts resizing the volume. + // - NodeResizeFailed: + // State set when resizing has failed in kubelet with a terminal error. Transient errors don't set + // NodeResizeFailed. + // For example: if expanding a PVC for more capacity - this field can be one of the following states: + // - pvc.status.allocatedResourceStatus['storage'] = "ControllerResizeInProgress" + // - pvc.status.allocatedResourceStatus['storage'] = "ControllerResizeFailed" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizePending" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizeInProgress" + // - pvc.status.allocatedResourceStatus['storage'] = "NodeResizeFailed" + // When this field is not set, it means that no resize operation is in progress for the given PVC. + // + // A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus + // should ignore the update for the purpose it was designed. For example - a controller that + // only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid + // resources associated with PVC. + // // This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature. // +featureGate=RecoverVolumeExpansionFailure + // +mapType=granular // +optional - ResizeStatus *PersistentVolumeClaimResizeStatus `json:"resizeStatus,omitempty" protobuf:"bytes,6,opt,name=resizeStatus,casttype=PersistentVolumeClaimResizeStatus"` + AllocatedResourceStatuses map[ResourceName]ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty" protobuf:"bytes,7,rep,name=allocatedResourceStatuses"` } // +enum @@ -2137,7 +2197,8 @@ type SecretEnvSource struct { // HTTPHeader describes a custom header to be used in HTTP probes type HTTPHeader struct { - // The header field name + // The header field name. + // This will be canonicalized upon output, so case-variant names will be understood as the same header. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` // The header field value Value string `json:"value" protobuf:"bytes,2,opt,name=value"` @@ -2445,6 +2506,24 @@ type Container struct { // +optional // +listType=atomic ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` + // RestartPolicy defines the restart behavior of individual containers in a pod. + // This field may only be set for init containers, and the only allowed value is "Always". + // For non-init containers or when this field is not specified, + // the restart behavior is defined by the Pod's restart policy and the container type. + // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // this init container will be continually restarted on + // exit until all regular containers have terminated. Once all regular + // containers have completed, all init containers with restartPolicy "Always" + // will be shut down. This lifecycle differs from normal init containers and + // is often referred to as a "sidecar" container. Although this init + // container still starts in the init container sequence, it does not wait + // for the container to complete before proceeding to the next init + // container. Instead, the next init container starts immediately after this + // init container is started, or after any startupProbe has successfully + // completed. + // +featureGate=SidecarContainers + // +optional + RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -2841,6 +2920,14 @@ const ( RestartPolicyNever RestartPolicy = "Never" ) +// ContainerRestartPolicy is the restart policy for a single container. +// This may only be set for init containers and only allowed value is "Always". +type ContainerRestartPolicy string + +const ( + ContainerRestartPolicyAlways ContainerRestartPolicy = "Always" +) + // DNSPolicy defines how a pod's DNS will be configured. // +enum type DNSPolicy string @@ -3523,15 +3610,9 @@ type ClaimSource struct { // // The template will be used to create a new ResourceClaim, which will // be bound to this pod. When this pod is deleted, the ResourceClaim - // will also be deleted. The name of the ResourceClaim will be -, where is the - // PodResourceClaim.Name. Pod validation will reject the pod if the - // concatenated name is not valid for a ResourceClaim (e.g. too long). - // - // An existing ResourceClaim with that name that is not owned by the - // pod will not be used for the pod to avoid using an unrelated - // resource by mistake. Scheduling and pod startup are then blocked - // until the unrelated ResourceClaim is removed. + // will also be deleted. The pod name and resource name, along with a + // generated component, will be used to form a unique name for the + // ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses. // // This field is immutable and no changes will be made to the // corresponding ResourceClaim by the control plane after creating the @@ -3539,6 +3620,24 @@ type ClaimSource struct { ResourceClaimTemplateName *string `json:"resourceClaimTemplateName,omitempty" protobuf:"bytes,2,opt,name=resourceClaimTemplateName"` } +// PodResourceClaimStatus is stored in the PodStatus for each PodResourceClaim +// which references a ResourceClaimTemplate. It stores the generated name for +// the corresponding ResourceClaim. +type PodResourceClaimStatus struct { + // Name uniquely identifies this resource claim inside the pod. + // This must match the name of an entry in pod.spec.resourceClaims, + // which implies that the string must be a DNS_LABEL. + Name string `json:"name" protobuf:"bytes,1,name=name"` + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. It this is + // unset, then generating a ResourceClaim was not necessary. The + // pod.spec.resourceClaims entry can be ignored in this case. + // + // +optional + ResourceClaimName *string `json:"resourceClaimName,omitempty" protobuf:"bytes,2,opt,name=resourceClaimName"` +} + // OSName is the set of OS'es that can be used in OS. type OSName string @@ -3837,7 +3936,7 @@ type SeccompProfile struct { // localhostProfile indicates a profile defined in a file on the node should be used. // The profile must be preconfigured on the node to work. // Must be a descending path, relative to the kubelet's configured seccomp profile location. - // Must only be set if type is "Localhost". + // Must be set if type is "Localhost". Must NOT be set for any other type. // +optional LocalhostProfile *string `json:"localhostProfile,omitempty" protobuf:"bytes,2,opt,name=localhostProfile"` } @@ -3898,12 +3997,15 @@ type PodDNSConfigOption struct { Value *string `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"` } -// IP address information for entries in the (plural) PodIPs field. -// Each entry includes: -// -// IP: An IP address allocated to the pod. Routable at least within the cluster. +// PodIP represents a single IP address allocated to the pod. type PodIP struct { - // ip is an IP address (IPv4 or IPv6) assigned to the pod + // IP is the IP address assigned to the pod + IP string `json:"ip,omitempty" protobuf:"bytes,1,opt,name=ip"` +} + +// HostIP represents a single IP address allocated to the host. +type HostIP struct { + // IP is the IP address assigned to the host IP string `json:"ip,omitempty" protobuf:"bytes,1,opt,name=ip"` } @@ -3975,6 +4077,13 @@ type EphemeralContainerCommon struct { // +optional // +listType=atomic ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` + // Restart policy for the container to manage the restart behavior of each + // container within a pod. + // This may only be set for init containers. You cannot set this field on + // ephemeral containers. + // +featureGate=SidecarContainers + // +optional + RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -4127,10 +4236,23 @@ type PodStatus struct { // +optional NominatedNodeName string `json:"nominatedNodeName,omitempty" protobuf:"bytes,11,opt,name=nominatedNodeName"` - // IP address of the host to which the pod is assigned. Empty if not yet scheduled. + // hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. + // A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will + // not be updated even if there is a node is assigned to pod // +optional HostIP string `json:"hostIP,omitempty" protobuf:"bytes,5,opt,name=hostIP"` - // IP address allocated to the pod. Routable at least within the cluster. + + // hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must + // match the hostIP field. This list is empty if the pod has not started yet. + // A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will + // not be updated even if there is a node is assigned to this pod. + // +optional + // +patchStrategy=merge + // +patchMergeKey=ip + // +listType=atomic + HostIPs []HostIP `json:"hostIPs,omitempty" protobuf:"bytes,16,rep,name=hostIPs" patchStrategy:"merge" patchMergeKey:"ip"` + + // podIP address allocated to the pod. Routable at least within the cluster. // Empty if not yet allocated. // +optional PodIP string `json:"podIP,omitempty" protobuf:"bytes,6,opt,name=podIP"` @@ -4173,6 +4295,15 @@ type PodStatus struct { // +featureGate=InPlacePodVerticalScaling // +optional Resize PodResizeStatus `json:"resize,omitempty" protobuf:"bytes,14,opt,name=resize,casttype=PodResizeStatus"` + + // Status of resource claims. + // +patchMergeKey=name + // +patchStrategy=merge,retainKeys + // +listType=map + // +listMapKey=name + // +featureGate=DynamicResourceAllocation + // +optional + ResourceClaimStatuses []PodResourceClaimStatus `json:"resourceClaimStatuses,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,15,rep,name=resourceClaimStatuses"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -4713,10 +4844,9 @@ type ServiceSpec struct { // This feature depends on whether the underlying cloud-provider supports specifying // the loadBalancerIP when a load balancer is created. // This field will be ignored if the cloud-provider does not support the feature. - // Deprecated: This field was under-specified and its meaning varies across implementations, - // and it cannot support dual-stack. - // As of Kubernetes v1.24, users are encouraged to use implementation-specific annotations when available. - // This field may be removed in a future API version. + // Deprecated: This field was under-specified and its meaning varies across implementations. + // Using it is non-portable and it may not support dual-stack. + // Users are encouraged to use implementation-specific annotations when available. // +optional LoadBalancerIP string `json:"loadBalancerIP,omitempty" protobuf:"bytes,8,opt,name=loadBalancerIP"` @@ -4865,10 +4995,19 @@ type ServicePort struct { Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,2,opt,name=protocol,casttype=Protocol"` // The application protocol for this port. + // This is used as a hint for implementations to offer richer behavior for protocols that they understand. // This field follows standard Kubernetes label syntax. - // Un-prefixed names are reserved for IANA standard service names (as per + // Valid values are either: + // + // * Un-prefixed protocol names - reserved for IANA standard service names (as per // RFC-6335 and https://www.iana.org/assignments/service-names). - // Non-standard protocols should use prefixed names such as + // + // * Kubernetes-defined prefixed names: + // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 + // + // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. // +optional AppProtocol *string `json:"appProtocol,omitempty" protobuf:"bytes,6,opt,name=appProtocol"` @@ -5109,6 +5248,8 @@ type EndpointPort struct { // // * Kubernetes-defined prefixed names: // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 // // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. @@ -6801,12 +6942,9 @@ type WindowsSecurityContextOptions struct { RunAsUserName *string `json:"runAsUserName,omitempty" protobuf:"bytes,3,opt,name=runAsUserName"` // HostProcess determines if a container should be run as a 'Host Process' container. - // This field is alpha-level and will only be honored by components that enable the - // WindowsHostProcessContainers feature flag. Setting this field without the feature - // flag will result in errors when validating the Pod. All of a Pod's containers must - // have the same effective HostProcess value (it is not allowed to have a mix of HostProcess - // containers and non-HostProcess containers). In addition, if HostProcess is true - // then HostNetwork must also be set to true. + // All of a Pod's containers must have the same effective HostProcess value + // (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). + // In addition, if HostProcess is true then HostNetwork must also be set to true. // +optional HostProcess *bool `json:"hostProcess,omitempty" protobuf:"bytes,4,opt,name=hostProcess"` } diff --git a/tools/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index a2cf00db8..9734d8b41 100644 --- a/tools/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -212,7 +212,7 @@ func (CinderVolumeSource) SwaggerDoc() map[string]string { var map_ClaimSource = map[string]string{ "": "ClaimSource describes a reference to a ResourceClaim.\n\nExactly one of these fields should be set. Consumers of this type must treat an empty object as if it has an unknown value.", "resourceClaimName": "ResourceClaimName is the name of a ResourceClaim object in the same namespace as this pod.", - "resourceClaimTemplateName": "ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod.\n\nThe template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long).\n\nAn existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed.\n\nThis field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim.", + "resourceClaimTemplateName": "ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod.\n\nThe template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The pod name and resource name, along with a generated component, will be used to form a unique name for the ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\nThis field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim.", } func (ClaimSource) SwaggerDoc() map[string]string { @@ -347,6 +347,7 @@ var map_Container = map[string]string{ "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "resizePolicy": "Resources resize policy for the container.", + "restartPolicy": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "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", @@ -530,7 +531,7 @@ var map_EndpointPort = map[string]string{ "name": "The name of this port. This must match the 'name' field in the corresponding ServicePort. Must be a DNS_LABEL. Optional only if one port is defined.", "port": "The port number of the endpoint.", "protocol": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", - "appProtocol": "The application protocol for this port. This is used as a hint for implementations to offer richer behavior for protocols that they understand. This field follows standard Kubernetes label syntax. Valid values are either:\n\n* Un-prefixed protocol names - reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names).\n\n* Kubernetes-defined prefixed names:\n * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540\n\n* Other protocols should use implementation-defined prefixed names such as mycompany.com/my-custom-protocol.", + "appProtocol": "The application protocol for this port. This is used as a hint for implementations to offer richer behavior for protocols that they understand. This field follows standard Kubernetes label syntax. Valid values are either:\n\n* Un-prefixed protocol names - reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names).\n\n* Kubernetes-defined prefixed names:\n * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540\n * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n* Other protocols should use implementation-defined prefixed names such as mycompany.com/my-custom-protocol.", } func (EndpointPort) SwaggerDoc() map[string]string { @@ -623,6 +624,7 @@ var map_EphemeralContainerCommon = map[string]string{ "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.", "resizePolicy": "Resources resize policy for the container.", + "restartPolicy": "Restart policy for the container to manage the restart behavior of each container within a pod. This may only be set for init containers. You cannot set this field on ephemeral containers.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Probes are not allowed for ephemeral containers.", @@ -832,7 +834,7 @@ func (HTTPGetAction) SwaggerDoc() map[string]string { var map_HTTPHeader = map[string]string{ "": "HTTPHeader describes a custom header to be used in HTTP probes", - "name": "The header field name", + "name": "The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.", "value": "The header field value", } @@ -850,6 +852,15 @@ func (HostAlias) SwaggerDoc() map[string]string { return map_HostAlias } +var map_HostIP = map[string]string{ + "": "HostIP represents a single IP address allocated to the host.", + "ip": "IP is the IP address assigned to the host", +} + +func (HostIP) SwaggerDoc() map[string]string { + return map_HostIP +} + var map_HostPathVolumeSource = map[string]string{ "": "Represents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.", "path": "path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath", @@ -1344,13 +1355,13 @@ func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { } var map_PersistentVolumeClaimStatus = map[string]string{ - "": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", - "phase": "phase represents the current phase of PersistentVolumeClaim.", - "accessModes": "accessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", - "capacity": "capacity represents the actual resources of the underlying volume.", - "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", - "allocatedResources": "allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "resizeStatus": "resizeStatus stores status of resize operation. ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty string by resize controller or kubelet. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", + "phase": "phase represents the current phase of PersistentVolumeClaim.", + "accessModes": "accessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", + "capacity": "capacity represents the actual resources of the underlying volume.", + "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", + "allocatedResources": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nCapacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity.\n\nA controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "allocatedResourceStatuses": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nClaimResourceStatus can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState set when resize controller starts resizing the volume in control-plane.\n\t- ControllerResizeFailed:\n\t\tState set when resize has failed in resize controller with a terminal error.\n\t- NodeResizePending:\n\t\tState set when resize controller has finished resizing the volume but further resizing of\n\t\tvolume is needed on the node.\n\t- NodeResizeInProgress:\n\t\tState set when kubelet starts resizing the volume.\n\t- NodeResizeFailed:\n\t\tState set when resizing has failed in kubelet with a terminal error. Transient errors don't set\n\t\tNodeResizeFailed.\nFor example: if expanding a PVC for more capacity - this field can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\"\nWhen this field is not set, it means that no resize operation is in progress for the given PVC.\n\nA controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { @@ -1434,10 +1445,11 @@ func (PersistentVolumeSpec) SwaggerDoc() map[string]string { } var map_PersistentVolumeStatus = map[string]string{ - "": "PersistentVolumeStatus is the current status of a persistent volume.", - "phase": "phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase", - "message": "message is a human-readable message indicating details about why the volume is in this state.", - "reason": "reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.", + "": "PersistentVolumeStatus is the current status of a persistent volume.", + "phase": "phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase", + "message": "message is a human-readable message indicating details about why the volume is in this state.", + "reason": "reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.", + "lastPhaseTransitionTime": "lastPhaseTransitionTime is the time the phase transitioned from one to another and automatically resets to current time everytime a volume phase transitions. This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature.", } func (PersistentVolumeStatus) SwaggerDoc() map[string]string { @@ -1559,8 +1571,8 @@ func (PodExecOptions) SwaggerDoc() map[string]string { } var map_PodIP = map[string]string{ - "": "IP address information for entries in the (plural) PodIPs field. Each entry includes:\n\n\tIP: An IP address allocated to the pod. Routable at least within the cluster.", - "ip": "ip is an IP address (IPv4 or IPv6) assigned to the pod", + "": "PodIP represents a single IP address allocated to the pod.", + "ip": "IP is the IP address assigned to the pod", } func (PodIP) SwaggerDoc() map[string]string { @@ -1640,6 +1652,16 @@ func (PodResourceClaim) SwaggerDoc() map[string]string { return map_PodResourceClaim } +var map_PodResourceClaimStatus = map[string]string{ + "": "PodResourceClaimStatus is stored in the PodStatus for each PodResourceClaim which references a ResourceClaimTemplate. It stores the generated name for the corresponding ResourceClaim.", + "name": "Name uniquely identifies this resource claim inside the pod. This must match the name of an entry in pod.spec.resourceClaims, which implies that the string must be a DNS_LABEL.", + "resourceClaimName": "ResourceClaimName is the name of the ResourceClaim that was generated for the Pod in the namespace of the Pod. It this is unset, then generating a ResourceClaim was not necessary. The pod.spec.resourceClaims entry can be ignored in this case.", +} + +func (PodResourceClaimStatus) SwaggerDoc() map[string]string { + return map_PodResourceClaimStatus +} + var map_PodSchedulingGate = map[string]string{ "": "PodSchedulingGate is associated to a Pod to guard its scheduling.", "name": "Name of the scheduling gate. Each scheduling gate must have a unique name field.", @@ -1730,8 +1752,9 @@ var map_PodStatus = map[string]string{ "message": "A human readable message indicating details about why the pod is in this condition.", "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", "nominatedNodeName": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", - "hostIP": "IP address of the host to which the pod is assigned. Empty if not yet scheduled.", - "podIP": "IP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", + "hostIP": "hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will not be updated even if there is a node is assigned to pod", + "hostIPs": "hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must match the hostIP field. This list is empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will not be updated even if there is a node is assigned to this pod.", + "podIP": "podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", "podIPs": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", "startTime": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod.", "initContainerStatuses": "The list has one entry per init container in the manifest. The most recent successful init container will have ready = true, the most recently started container will have startTime set. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", @@ -1739,6 +1762,7 @@ var map_PodStatus = map[string]string{ "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/#quality-of-service-classes", "ephemeralContainerStatuses": "Status for any ephemeral containers that have run in this pod.", "resize": "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\"", + "resourceClaimStatuses": "Status of resource claims.", } func (PodStatus) SwaggerDoc() map[string]string { @@ -2134,7 +2158,7 @@ func (ScopedResourceSelectorRequirement) SwaggerDoc() map[string]string { var map_SeccompProfile = map[string]string{ "": "SeccompProfile defines a pod/container's seccomp profile settings. Only one profile source may be set.", "type": "type indicates which kind of seccomp profile will be applied. Valid options are:\n\nLocalhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.", - "localhostProfile": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "localhostProfile": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", } func (SeccompProfile) SwaggerDoc() map[string]string { @@ -2301,7 +2325,7 @@ var map_ServicePort = map[string]string{ "": "ServicePort contains information on service's port.", "name": "The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. When considering the endpoints for a Service, this must match the 'name' field in the EndpointPort. Optional if only one ServicePort is defined on this service.", "protocol": "The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\". Default is TCP.", - "appProtocol": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.", + "appProtocol": "The application protocol for this port. This is used as a hint for implementations to offer richer behavior for protocols that they understand. This field follows standard Kubernetes label syntax. Valid values are either:\n\n* Un-prefixed protocol names - reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names).\n\n* Kubernetes-defined prefixed names:\n * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540\n * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n* Other protocols should use implementation-defined prefixed names such as mycompany.com/my-custom-protocol.", "port": "The port that will be exposed by this service.", "targetPort": "Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service", "nodePort": "The port on each node on which this service is exposed when type is NodePort or LoadBalancer. Usually assigned by the system. If a value is specified, in-range, and not in use it will be used, otherwise the operation will fail. If not specified, a port will be allocated if this Service requires one. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport", @@ -2329,7 +2353,7 @@ var map_ServiceSpec = map[string]string{ "type": "type determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. \"ClusterIP\" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object or EndpointSlice objects. If clusterIP is \"None\", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a virtual IP. \"NodePort\" builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the clusterIP. \"LoadBalancer\" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the same endpoints as the clusterIP. \"ExternalName\" aliases this service to the specified externalName. Several other fields do not apply to ExternalName services. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types", "externalIPs": "externalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service. These IPs are not managed by Kubernetes. The user is responsible for ensuring that traffic arrives at a node with this IP. A common example is external load-balancers that are not part of the Kubernetes system.", "sessionAffinity": "Supports \"ClientIP\" and \"None\". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", - "loadBalancerIP": "Only applies to Service Type: LoadBalancer. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature. Deprecated: This field was under-specified and its meaning varies across implementations, and it cannot support dual-stack. As of Kubernetes v1.24, users are encouraged to use implementation-specific annotations when available. This field may be removed in a future API version.", + "loadBalancerIP": "Only applies to Service Type: LoadBalancer. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature. Deprecated: This field was under-specified and its meaning varies across implementations. Using it is non-portable and it may not support dual-stack. Users are encouraged to use implementation-specific annotations when available.", "loadBalancerSourceRanges": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/", "externalName": "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".", "externalTrafficPolicy": "externalTrafficPolicy describes how nodes distribute service traffic they receive on one of the Service's \"externally-facing\" addresses (NodePorts, ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure the service in a way that assumes that external load balancers will take care of balancing the service traffic between nodes, and so each node will deliver traffic only to the node-local endpoints of the service, without masquerading the client source IP. (Traffic mistakenly sent to a node with no endpoints will be dropped.) The default value, \"Cluster\", uses the standard behavior of routing to all endpoints evenly (possibly modified by topology and other features). Note that traffic sent to an External IP or LoadBalancer IP from within the cluster will always get \"Cluster\" semantics, but clients sending to a NodePort from within the cluster may need to take traffic policy into account when picking a node.", @@ -2612,7 +2636,7 @@ var map_WindowsSecurityContextOptions = map[string]string{ "gmsaCredentialSpecName": "GMSACredentialSpecName is the name of the GMSA credential spec to use.", "gmsaCredentialSpec": "GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.", "runAsUserName": "The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", - "hostProcess": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "hostProcess": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", } func (WindowsSecurityContextOptions) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/core/v1/well_known_labels.go b/tools/vendor/k8s.io/api/core/v1/well_known_labels.go index 5cf82a981..8c3cb87b8 100644 --- a/tools/vendor/k8s.io/api/core/v1/well_known_labels.go +++ b/tools/vendor/k8s.io/api/core/v1/well_known_labels.go @@ -19,6 +19,10 @@ package v1 const ( LabelHostname = "kubernetes.io/hostname" + // Label value is the network location of kube-apiserver stored as + // Stored in APIServer Identity lease objects to view what address is used for peer proxy + AnnotationPeerAdvertiseAddress = "kubernetes.io/peer-advertise-address" + LabelTopologyZone = "topology.kubernetes.io/zone" LabelTopologyRegion = "topology.kubernetes.io/region" diff --git a/tools/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index bfb7e0bff..d76f0bbbc 100644 --- a/tools/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -793,6 +793,11 @@ func (in *Container) DeepCopyInto(out *Container) { *out = make([]ContainerResizePolicy, len(*in)) copy(*out, *in) } + if in.RestartPolicy != nil { + in, out := &in.RestartPolicy, &out.RestartPolicy + *out = new(ContainerRestartPolicy) + **out = **in + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -1420,6 +1425,11 @@ func (in *EphemeralContainerCommon) DeepCopyInto(out *EphemeralContainerCommon) *out = make([]ContainerResizePolicy, len(*in)) copy(*out, *in) } + if in.RestartPolicy != nil { + in, out := &in.RestartPolicy, &out.RestartPolicy + *out = new(ContainerRestartPolicy) + **out = **in + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -1871,6 +1881,22 @@ func (in *HostAlias) DeepCopy() *HostAlias { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HostIP) DeepCopyInto(out *HostIP) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostIP. +func (in *HostIP) DeepCopy() *HostIP { + if in == nil { + return nil + } + out := new(HostIP) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HostPathVolumeSource) DeepCopyInto(out *HostPathVolumeSource) { *out = *in @@ -2895,7 +2921,7 @@ func (in *PersistentVolume) DeepCopyInto(out *PersistentVolume) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -3072,10 +3098,12 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val.DeepCopy() } } - if in.ResizeStatus != nil { - in, out := &in.ResizeStatus, &out.ResizeStatus - *out = new(PersistentVolumeClaimResizeStatus) - **out = **in + if in.AllocatedResourceStatuses != nil { + in, out := &in.AllocatedResourceStatuses, &out.AllocatedResourceStatuses + *out = make(map[ResourceName]ClaimResourceStatus, len(*in)) + for key, val := range *in { + (*out)[key] = val + } } return } @@ -3335,6 +3363,10 @@ func (in *PersistentVolumeSpec) DeepCopy() *PersistentVolumeSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PersistentVolumeStatus) DeepCopyInto(out *PersistentVolumeStatus) { *out = *in + if in.LastPhaseTransitionTime != nil { + in, out := &in.LastPhaseTransitionTime, &out.LastPhaseTransitionTime + *out = (*in).DeepCopy() + } return } @@ -3807,6 +3839,27 @@ func (in *PodResourceClaim) DeepCopy() *PodResourceClaim { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodResourceClaimStatus) DeepCopyInto(out *PodResourceClaimStatus) { + *out = *in + if in.ResourceClaimName != nil { + in, out := &in.ResourceClaimName, &out.ResourceClaimName + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodResourceClaimStatus. +func (in *PodResourceClaimStatus) DeepCopy() *PodResourceClaimStatus { + if in == nil { + return nil + } + out := new(PodResourceClaimStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodSchedulingGate) DeepCopyInto(out *PodSchedulingGate) { *out = *in @@ -4091,6 +4144,11 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.HostIPs != nil { + in, out := &in.HostIPs, &out.HostIPs + *out = make([]HostIP, len(*in)) + copy(*out, *in) + } if in.PodIPs != nil { in, out := &in.PodIPs, &out.PodIPs *out = make([]PodIP, len(*in)) @@ -4121,6 +4179,13 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ResourceClaimStatuses != nil { + in, out := &in.ResourceClaimStatuses, &out.ResourceClaimStatuses + *out = make([]PodResourceClaimStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/tools/vendor/k8s.io/api/discovery/v1/generated.proto b/tools/vendor/k8s.io/api/discovery/v1/generated.proto index b7150ef2c..490ce8922 100644 --- a/tools/vendor/k8s.io/api/discovery/v1/generated.proto +++ b/tools/vendor/k8s.io/api/discovery/v1/generated.proto @@ -146,6 +146,8 @@ message EndpointPort { // // * Kubernetes-defined prefixed names: // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 // // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. diff --git a/tools/vendor/k8s.io/api/discovery/v1/types.go b/tools/vendor/k8s.io/api/discovery/v1/types.go index 9b4daafca..efbb09918 100644 --- a/tools/vendor/k8s.io/api/discovery/v1/types.go +++ b/tools/vendor/k8s.io/api/discovery/v1/types.go @@ -196,6 +196,8 @@ type EndpointPort struct { // // * Kubernetes-defined prefixed names: // * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540 + // * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455 + // * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455 // // * Other protocols should use implementation-defined prefixed names such as // mycompany.com/my-custom-protocol. diff --git a/tools/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go index c780c9573..bef774539 100644 --- a/tools/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go @@ -68,7 +68,7 @@ var map_EndpointPort = map[string]string{ "name": "name represents the name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", "protocol": "protocol represents the IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", "port": "port represents the port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", - "appProtocol": "The application protocol for this port. This is used as a hint for implementations to offer richer behavior for protocols that they understand. This field follows standard Kubernetes label syntax. Valid values are either:\n\n* Un-prefixed protocol names - reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names).\n\n* Kubernetes-defined prefixed names:\n * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540\n\n* Other protocols should use implementation-defined prefixed names such as mycompany.com/my-custom-protocol.", + "appProtocol": "The application protocol for this port. This is used as a hint for implementations to offer richer behavior for protocols that they understand. This field follows standard Kubernetes label syntax. Valid values are either:\n\n* Un-prefixed protocol names - reserved for IANA standard service names (as per RFC-6335 and https://www.iana.org/assignments/service-names).\n\n* Kubernetes-defined prefixed names:\n * 'kubernetes.io/h2c' - HTTP/2 over cleartext as described in https://www.rfc-editor.org/rfc/rfc7540\n * 'kubernetes.io/ws' - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n* Other protocols should use implementation-defined prefixed names such as mycompany.com/my-custom-protocol.", } func (EndpointPort) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go b/tools/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go index 863ebbc4a..d967e3810 100644 --- a/tools/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/tools/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -1001,38 +1001,10 @@ func (m *NetworkPolicySpec) XXX_DiscardUnknown() { var xxx_messageInfo_NetworkPolicySpec proto.InternalMessageInfo -func (m *NetworkPolicyStatus) Reset() { *m = NetworkPolicyStatus{} } -func (*NetworkPolicyStatus) ProtoMessage() {} -func (*NetworkPolicyStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{34} -} -func (m *NetworkPolicyStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NetworkPolicyStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *NetworkPolicyStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkPolicyStatus.Merge(m, src) -} -func (m *NetworkPolicyStatus) XXX_Size() int { - return m.Size() -} -func (m *NetworkPolicyStatus) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkPolicyStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkPolicyStatus proto.InternalMessageInfo - func (m *ReplicaSet) Reset() { *m = ReplicaSet{} } func (*ReplicaSet) ProtoMessage() {} func (*ReplicaSet) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{35} + return fileDescriptor_cdc93917efc28165, []int{34} } func (m *ReplicaSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1060,7 +1032,7 @@ var xxx_messageInfo_ReplicaSet proto.InternalMessageInfo func (m *ReplicaSetCondition) Reset() { *m = ReplicaSetCondition{} } func (*ReplicaSetCondition) ProtoMessage() {} func (*ReplicaSetCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{36} + return fileDescriptor_cdc93917efc28165, []int{35} } func (m *ReplicaSetCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1088,7 +1060,7 @@ var xxx_messageInfo_ReplicaSetCondition proto.InternalMessageInfo func (m *ReplicaSetList) Reset() { *m = ReplicaSetList{} } func (*ReplicaSetList) ProtoMessage() {} func (*ReplicaSetList) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{37} + return fileDescriptor_cdc93917efc28165, []int{36} } func (m *ReplicaSetList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1116,7 +1088,7 @@ var xxx_messageInfo_ReplicaSetList proto.InternalMessageInfo func (m *ReplicaSetSpec) Reset() { *m = ReplicaSetSpec{} } func (*ReplicaSetSpec) ProtoMessage() {} func (*ReplicaSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{38} + return fileDescriptor_cdc93917efc28165, []int{37} } func (m *ReplicaSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1116,7 @@ var xxx_messageInfo_ReplicaSetSpec proto.InternalMessageInfo func (m *ReplicaSetStatus) Reset() { *m = ReplicaSetStatus{} } func (*ReplicaSetStatus) ProtoMessage() {} func (*ReplicaSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{39} + return fileDescriptor_cdc93917efc28165, []int{38} } func (m *ReplicaSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1172,7 +1144,7 @@ var xxx_messageInfo_ReplicaSetStatus proto.InternalMessageInfo func (m *RollbackConfig) Reset() { *m = RollbackConfig{} } func (*RollbackConfig) ProtoMessage() {} func (*RollbackConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{40} + return fileDescriptor_cdc93917efc28165, []int{39} } func (m *RollbackConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1200,7 +1172,7 @@ var xxx_messageInfo_RollbackConfig proto.InternalMessageInfo func (m *RollingUpdateDaemonSet) Reset() { *m = RollingUpdateDaemonSet{} } func (*RollingUpdateDaemonSet) ProtoMessage() {} func (*RollingUpdateDaemonSet) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{41} + return fileDescriptor_cdc93917efc28165, []int{40} } func (m *RollingUpdateDaemonSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1228,7 +1200,7 @@ var xxx_messageInfo_RollingUpdateDaemonSet proto.InternalMessageInfo func (m *RollingUpdateDeployment) Reset() { *m = RollingUpdateDeployment{} } func (*RollingUpdateDeployment) ProtoMessage() {} func (*RollingUpdateDeployment) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{42} + return fileDescriptor_cdc93917efc28165, []int{41} } func (m *RollingUpdateDeployment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1256,7 +1228,7 @@ var xxx_messageInfo_RollingUpdateDeployment proto.InternalMessageInfo func (m *Scale) Reset() { *m = Scale{} } func (*Scale) ProtoMessage() {} func (*Scale) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{43} + return fileDescriptor_cdc93917efc28165, []int{42} } func (m *Scale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1284,7 +1256,7 @@ var xxx_messageInfo_Scale proto.InternalMessageInfo func (m *ScaleSpec) Reset() { *m = ScaleSpec{} } func (*ScaleSpec) ProtoMessage() {} func (*ScaleSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{44} + return fileDescriptor_cdc93917efc28165, []int{43} } func (m *ScaleSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1312,7 +1284,7 @@ var xxx_messageInfo_ScaleSpec proto.InternalMessageInfo func (m *ScaleStatus) Reset() { *m = ScaleStatus{} } func (*ScaleStatus) ProtoMessage() {} func (*ScaleStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_cdc93917efc28165, []int{45} + return fileDescriptor_cdc93917efc28165, []int{44} } func (m *ScaleStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1373,7 +1345,6 @@ func init() { proto.RegisterType((*NetworkPolicyPeer)(nil), "k8s.io.api.extensions.v1beta1.NetworkPolicyPeer") proto.RegisterType((*NetworkPolicyPort)(nil), "k8s.io.api.extensions.v1beta1.NetworkPolicyPort") proto.RegisterType((*NetworkPolicySpec)(nil), "k8s.io.api.extensions.v1beta1.NetworkPolicySpec") - proto.RegisterType((*NetworkPolicyStatus)(nil), "k8s.io.api.extensions.v1beta1.NetworkPolicyStatus") proto.RegisterType((*ReplicaSet)(nil), "k8s.io.api.extensions.v1beta1.ReplicaSet") proto.RegisterType((*ReplicaSetCondition)(nil), "k8s.io.api.extensions.v1beta1.ReplicaSetCondition") proto.RegisterType((*ReplicaSetList)(nil), "k8s.io.api.extensions.v1beta1.ReplicaSetList") @@ -1393,188 +1364,186 @@ func init() { } var fileDescriptor_cdc93917efc28165 = []byte{ - // 2890 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcf, 0x6f, 0x24, 0x47, - 0xf5, 0xdf, 0x9e, 0xf1, 0xd8, 0xe3, 0xe7, 0xb5, 0xbd, 0x5b, 0xeb, 0xac, 0x1d, 0xef, 0x37, 0x76, - 0xd4, 0x5f, 0x11, 0x36, 0x61, 0x33, 0xc3, 0x6e, 0x92, 0x25, 0x3f, 0xa4, 0x84, 0x1d, 0xef, 0x26, - 0xeb, 0xc4, 0x1e, 0x4f, 0x6a, 0xc6, 0x09, 0x8a, 0x08, 0xd0, 0xee, 0x29, 0x8f, 0x3b, 0xee, 0xe9, - 0x1e, 0x75, 0xd7, 0x98, 0x35, 0x27, 0x10, 0x5c, 0x72, 0x82, 0x4b, 0x20, 0x47, 0x10, 0x12, 0x57, - 0xae, 0x1c, 0x42, 0x04, 0x22, 0x48, 0x2b, 0xc4, 0x21, 0x12, 0x07, 0x72, 0xb2, 0x88, 0x73, 0x42, - 0xfc, 0x03, 0x68, 0x4f, 0xa8, 0x7e, 0x74, 0xf5, 0x6f, 0xbb, 0xc7, 0x38, 0x16, 0x41, 0x9c, 0x3c, - 0x5d, 0xef, 0xbd, 0x4f, 0xbd, 0xaa, 0x7a, 0xf5, 0xde, 0xa7, 0xba, 0xda, 0xf0, 0xf2, 0xee, 0xb3, - 0x7e, 0xcd, 0x72, 0xeb, 0xbb, 0xc3, 0x2d, 0xe2, 0x39, 0x84, 0x12, 0xbf, 0xbe, 0x47, 0x9c, 0xae, - 0xeb, 0xd5, 0xa5, 0xc0, 0x18, 0x58, 0x75, 0x72, 0x8f, 0x12, 0xc7, 0xb7, 0x5c, 0xc7, 0xaf, 0xef, - 0x5d, 0xdf, 0x22, 0xd4, 0xb8, 0x5e, 0xef, 0x11, 0x87, 0x78, 0x06, 0x25, 0xdd, 0xda, 0xc0, 0x73, - 0xa9, 0x8b, 0x1e, 0x11, 0xea, 0x35, 0x63, 0x60, 0xd5, 0x42, 0xf5, 0x9a, 0x54, 0x5f, 0x7c, 0xb2, - 0x67, 0xd1, 0x9d, 0xe1, 0x56, 0xcd, 0x74, 0xfb, 0xf5, 0x9e, 0xdb, 0x73, 0xeb, 0xdc, 0x6a, 0x6b, - 0xb8, 0xcd, 0x9f, 0xf8, 0x03, 0xff, 0x25, 0xd0, 0x16, 0xf5, 0x48, 0xe7, 0xa6, 0xeb, 0x91, 0xfa, - 0x5e, 0xaa, 0xc7, 0xc5, 0xa7, 0x43, 0x9d, 0xbe, 0x61, 0xee, 0x58, 0x0e, 0xf1, 0xf6, 0xeb, 0x83, - 0xdd, 0x1e, 0x6b, 0xf0, 0xeb, 0x7d, 0x42, 0x8d, 0x2c, 0xab, 0x7a, 0x9e, 0x95, 0x37, 0x74, 0xa8, - 0xd5, 0x27, 0x29, 0x83, 0x9b, 0xc7, 0x19, 0xf8, 0xe6, 0x0e, 0xe9, 0x1b, 0x29, 0xbb, 0xa7, 0xf2, - 0xec, 0x86, 0xd4, 0xb2, 0xeb, 0x96, 0x43, 0x7d, 0xea, 0x25, 0x8d, 0xf4, 0xf7, 0x4a, 0x30, 0x79, - 0xdb, 0x20, 0x7d, 0xd7, 0x69, 0x13, 0x8a, 0xbe, 0x03, 0x55, 0x36, 0x8c, 0xae, 0x41, 0x8d, 0x05, - 0xed, 0x51, 0xed, 0xea, 0xd4, 0x8d, 0xaf, 0xd6, 0xc2, 0x69, 0x56, 0xa8, 0xb5, 0xc1, 0x6e, 0x8f, - 0x35, 0xf8, 0x35, 0xa6, 0x5d, 0xdb, 0xbb, 0x5e, 0xdb, 0xd8, 0x7a, 0x87, 0x98, 0x74, 0x9d, 0x50, - 0xa3, 0x81, 0xee, 0x1f, 0x2c, 0x9f, 0x3b, 0x3c, 0x58, 0x86, 0xb0, 0x0d, 0x2b, 0x54, 0xd4, 0x84, - 0x31, 0x7f, 0x40, 0xcc, 0x85, 0x12, 0x47, 0xbf, 0x56, 0x3b, 0x72, 0x11, 0x6b, 0xca, 0xb3, 0xf6, - 0x80, 0x98, 0x8d, 0xf3, 0x12, 0x79, 0x8c, 0x3d, 0x61, 0x8e, 0x83, 0xde, 0x80, 0x71, 0x9f, 0x1a, - 0x74, 0xe8, 0x2f, 0x94, 0x39, 0x62, 0xad, 0x30, 0x22, 0xb7, 0x6a, 0xcc, 0x48, 0xcc, 0x71, 0xf1, - 0x8c, 0x25, 0x9a, 0xfe, 0xf7, 0x12, 0x20, 0xa5, 0xbb, 0xe2, 0x3a, 0x5d, 0x8b, 0x5a, 0xae, 0x83, - 0x9e, 0x87, 0x31, 0xba, 0x3f, 0x20, 0x7c, 0x72, 0x26, 0x1b, 0x8f, 0x05, 0x0e, 0x75, 0xf6, 0x07, - 0xe4, 0xc1, 0xc1, 0xf2, 0xe5, 0xb4, 0x05, 0x93, 0x60, 0x6e, 0x83, 0xd6, 0x94, 0xab, 0x25, 0x6e, - 0xfd, 0x74, 0xbc, 0xeb, 0x07, 0x07, 0xcb, 0x19, 0x41, 0x58, 0x53, 0x48, 0x71, 0x07, 0xd1, 0x1e, - 0x20, 0xdb, 0xf0, 0x69, 0xc7, 0x33, 0x1c, 0x5f, 0xf4, 0x64, 0xf5, 0x89, 0x9c, 0x84, 0x27, 0x8a, - 0x2d, 0x1a, 0xb3, 0x68, 0x2c, 0x4a, 0x2f, 0xd0, 0x5a, 0x0a, 0x0d, 0x67, 0xf4, 0x80, 0x1e, 0x83, - 0x71, 0x8f, 0x18, 0xbe, 0xeb, 0x2c, 0x8c, 0xf1, 0x51, 0xa8, 0x09, 0xc4, 0xbc, 0x15, 0x4b, 0x29, - 0x7a, 0x1c, 0x26, 0xfa, 0xc4, 0xf7, 0x8d, 0x1e, 0x59, 0xa8, 0x70, 0xc5, 0x59, 0xa9, 0x38, 0xb1, - 0x2e, 0x9a, 0x71, 0x20, 0xd7, 0x3f, 0xd0, 0x60, 0x5a, 0xcd, 0xdc, 0x9a, 0xe5, 0x53, 0xf4, 0xcd, - 0x54, 0x1c, 0xd6, 0x8a, 0x0d, 0x89, 0x59, 0xf3, 0x28, 0xbc, 0x20, 0x7b, 0xab, 0x06, 0x2d, 0x91, - 0x18, 0x5c, 0x87, 0x8a, 0x45, 0x49, 0x9f, 0xad, 0x43, 0xf9, 0xea, 0xd4, 0x8d, 0xab, 0x45, 0x43, - 0xa6, 0x31, 0x2d, 0x41, 0x2b, 0xab, 0xcc, 0x1c, 0x0b, 0x14, 0xfd, 0xa7, 0x63, 0x11, 0xf7, 0x59, - 0x68, 0xa2, 0xb7, 0xa1, 0xea, 0x13, 0x9b, 0x98, 0xd4, 0xf5, 0xa4, 0xfb, 0x4f, 0x15, 0x74, 0xdf, - 0xd8, 0x22, 0x76, 0x5b, 0x9a, 0x36, 0xce, 0x33, 0xff, 0x83, 0x27, 0xac, 0x20, 0xd1, 0xeb, 0x50, - 0xa5, 0xa4, 0x3f, 0xb0, 0x0d, 0x4a, 0xe4, 0x3e, 0xfa, 0xff, 0xe8, 0x10, 0x58, 0xe4, 0x30, 0xb0, - 0x96, 0xdb, 0xed, 0x48, 0x35, 0xbe, 0x7d, 0xd4, 0x94, 0x04, 0xad, 0x58, 0xc1, 0xa0, 0x3d, 0x98, - 0x19, 0x0e, 0xba, 0x4c, 0x93, 0xb2, 0xec, 0xd0, 0xdb, 0x97, 0x91, 0x74, 0xb3, 0xe8, 0xdc, 0x6c, - 0xc6, 0xac, 0x1b, 0x97, 0x65, 0x5f, 0x33, 0xf1, 0x76, 0x9c, 0xe8, 0x05, 0xdd, 0x82, 0xd9, 0xbe, - 0xe5, 0x60, 0x62, 0x74, 0xf7, 0xdb, 0xc4, 0x74, 0x9d, 0xae, 0xcf, 0xc3, 0xaa, 0xd2, 0x98, 0x97, - 0x00, 0xb3, 0xeb, 0x71, 0x31, 0x4e, 0xea, 0xa3, 0x57, 0x01, 0x05, 0xc3, 0x78, 0x45, 0x24, 0x37, - 0xcb, 0x75, 0x78, 0xcc, 0x95, 0xc3, 0xe0, 0xee, 0xa4, 0x34, 0x70, 0x86, 0x15, 0x5a, 0x83, 0x39, - 0x8f, 0xec, 0x59, 0x6c, 0x8c, 0x77, 0x2d, 0x9f, 0xba, 0xde, 0xfe, 0x9a, 0xd5, 0xb7, 0xe8, 0xc2, - 0x38, 0xf7, 0x69, 0xe1, 0xf0, 0x60, 0x79, 0x0e, 0x67, 0xc8, 0x71, 0xa6, 0x95, 0xfe, 0xb3, 0x71, - 0x98, 0x4d, 0xe4, 0x1b, 0xf4, 0x06, 0x5c, 0x36, 0x87, 0x9e, 0x47, 0x1c, 0xda, 0x1c, 0xf6, 0xb7, - 0x88, 0xd7, 0x36, 0x77, 0x48, 0x77, 0x68, 0x93, 0x2e, 0x0f, 0x94, 0x4a, 0x63, 0x49, 0x7a, 0x7c, - 0x79, 0x25, 0x53, 0x0b, 0xe7, 0x58, 0xb3, 0x59, 0x70, 0x78, 0xd3, 0xba, 0xe5, 0xfb, 0x0a, 0xb3, - 0xc4, 0x31, 0xd5, 0x2c, 0x34, 0x53, 0x1a, 0x38, 0xc3, 0x8a, 0xf9, 0xd8, 0x25, 0xbe, 0xe5, 0x91, - 0x6e, 0xd2, 0xc7, 0x72, 0xdc, 0xc7, 0xdb, 0x99, 0x5a, 0x38, 0xc7, 0x1a, 0x3d, 0x03, 0x53, 0xa2, - 0x37, 0xbe, 0x7e, 0x72, 0xa1, 0x2f, 0x49, 0xb0, 0xa9, 0x66, 0x28, 0xc2, 0x51, 0x3d, 0x36, 0x34, - 0x77, 0xcb, 0x27, 0xde, 0x1e, 0xe9, 0xe6, 0x2f, 0xf0, 0x46, 0x4a, 0x03, 0x67, 0x58, 0xb1, 0xa1, - 0x89, 0x08, 0x4c, 0x0d, 0x6d, 0x3c, 0x3e, 0xb4, 0xcd, 0x4c, 0x2d, 0x9c, 0x63, 0xcd, 0xe2, 0x58, - 0xb8, 0x7c, 0x6b, 0xcf, 0xb0, 0x6c, 0x63, 0xcb, 0x26, 0x0b, 0x13, 0xf1, 0x38, 0x6e, 0xc6, 0xc5, - 0x38, 0xa9, 0x8f, 0x5e, 0x81, 0x8b, 0xa2, 0x69, 0xd3, 0x31, 0x14, 0x48, 0x95, 0x83, 0x3c, 0x2c, - 0x41, 0x2e, 0x36, 0x93, 0x0a, 0x38, 0x6d, 0x83, 0x9e, 0x87, 0x19, 0xd3, 0xb5, 0x6d, 0x1e, 0x8f, - 0x2b, 0xee, 0xd0, 0xa1, 0x0b, 0x93, 0x1c, 0x05, 0xb1, 0xfd, 0xb8, 0x12, 0x93, 0xe0, 0x84, 0x26, - 0x22, 0x00, 0x66, 0x50, 0x70, 0xfc, 0x05, 0xe0, 0xf9, 0xf1, 0x7a, 0xd1, 0x1c, 0xa0, 0x4a, 0x55, - 0xc8, 0x01, 0x54, 0x93, 0x8f, 0x23, 0xc0, 0xfa, 0x9f, 0x34, 0x98, 0xcf, 0x49, 0x1d, 0xe8, 0xa5, - 0x58, 0x89, 0xfd, 0x4a, 0xa2, 0xc4, 0x5e, 0xc9, 0x31, 0x8b, 0xd4, 0x59, 0x07, 0xa6, 0x3d, 0x36, - 0x2a, 0xa7, 0x27, 0x54, 0x64, 0x8e, 0x7c, 0xe6, 0x98, 0x61, 0xe0, 0xa8, 0x4d, 0x98, 0xf3, 0x2f, - 0x1e, 0x1e, 0x2c, 0x4f, 0xc7, 0x64, 0x38, 0x0e, 0xaf, 0xbf, 0x5f, 0x02, 0xb8, 0x4d, 0x06, 0xb6, - 0xbb, 0xdf, 0x27, 0xce, 0x59, 0x70, 0xa8, 0x8d, 0x18, 0x87, 0x7a, 0xf2, 0xb8, 0xe5, 0x51, 0xae, - 0xe5, 0x92, 0xa8, 0x37, 0x13, 0x24, 0xaa, 0x5e, 0x1c, 0xf2, 0x68, 0x16, 0xf5, 0xd7, 0x32, 0x5c, - 0x0a, 0x95, 0x43, 0x1a, 0xf5, 0x42, 0x6c, 0x8d, 0xbf, 0x9c, 0x58, 0xe3, 0xf9, 0x0c, 0x93, 0xcf, - 0x8d, 0x47, 0xbd, 0x03, 0x33, 0x8c, 0xe5, 0x88, 0xb5, 0xe4, 0x1c, 0x6a, 0x7c, 0x64, 0x0e, 0xa5, - 0xaa, 0xdd, 0x5a, 0x0c, 0x09, 0x27, 0x90, 0x73, 0x38, 0xdb, 0xc4, 0x17, 0x91, 0xb3, 0x7d, 0xa8, - 0xc1, 0x4c, 0xb8, 0x4c, 0x67, 0x40, 0xda, 0x9a, 0x71, 0xd2, 0xf6, 0x78, 0xe1, 0x10, 0xcd, 0x61, - 0x6d, 0xff, 0x64, 0x04, 0x5f, 0x29, 0xb1, 0x0d, 0xbe, 0x65, 0x98, 0xbb, 0xe8, 0x51, 0x18, 0x73, - 0x8c, 0x7e, 0x10, 0x99, 0x6a, 0xb3, 0x34, 0x8d, 0x3e, 0xc1, 0x5c, 0x82, 0xde, 0xd3, 0x00, 0xc9, - 0x2a, 0x70, 0xcb, 0x71, 0x5c, 0x6a, 0x88, 0x5c, 0x29, 0xdc, 0x5a, 0x2d, 0xec, 0x56, 0xd0, 0x63, - 0x6d, 0x33, 0x85, 0x75, 0xc7, 0xa1, 0xde, 0x7e, 0xb8, 0xc8, 0x69, 0x05, 0x9c, 0xe1, 0x00, 0x32, - 0x00, 0x3c, 0x89, 0xd9, 0x71, 0xe5, 0x46, 0x7e, 0xb2, 0x40, 0xce, 0x63, 0x06, 0x2b, 0xae, 0xb3, - 0x6d, 0xf5, 0xc2, 0xb4, 0x83, 0x15, 0x10, 0x8e, 0x80, 0x2e, 0xde, 0x81, 0xf9, 0x1c, 0x6f, 0xd1, - 0x05, 0x28, 0xef, 0x92, 0x7d, 0x31, 0x6d, 0x98, 0xfd, 0x44, 0x73, 0x50, 0xd9, 0x33, 0xec, 0xa1, - 0x48, 0xbf, 0x93, 0x58, 0x3c, 0x3c, 0x5f, 0x7a, 0x56, 0xd3, 0x3f, 0xa8, 0x44, 0x63, 0x87, 0x33, - 0xe6, 0xab, 0x50, 0xf5, 0xc8, 0xc0, 0xb6, 0x4c, 0xc3, 0x97, 0x44, 0x88, 0x93, 0x5f, 0x2c, 0xdb, - 0xb0, 0x92, 0xc6, 0xb8, 0x75, 0xe9, 0xf3, 0xe5, 0xd6, 0xe5, 0xd3, 0xe1, 0xd6, 0xdf, 0x86, 0xaa, - 0x1f, 0xb0, 0xea, 0x31, 0x0e, 0x79, 0x7d, 0x84, 0xfc, 0x2a, 0x09, 0xb5, 0xea, 0x40, 0x51, 0x69, - 0x05, 0x9a, 0x45, 0xa2, 0x2b, 0x23, 0x92, 0xe8, 0x53, 0x25, 0xbe, 0x2c, 0xdf, 0x0c, 0x8c, 0xa1, - 0x4f, 0xba, 0x3c, 0xb7, 0x55, 0xc3, 0x7c, 0xd3, 0xe2, 0xad, 0x58, 0x4a, 0xd1, 0xdb, 0xb1, 0x90, - 0xad, 0x9e, 0x24, 0x64, 0x67, 0xf2, 0xc3, 0x15, 0x6d, 0xc2, 0xfc, 0xc0, 0x73, 0x7b, 0x1e, 0xf1, - 0xfd, 0xdb, 0xc4, 0xe8, 0xda, 0x96, 0x43, 0x82, 0xf9, 0x11, 0x8c, 0xe8, 0xca, 0xe1, 0xc1, 0xf2, - 0x7c, 0x2b, 0x5b, 0x05, 0xe7, 0xd9, 0xea, 0xf7, 0xc7, 0xe0, 0x42, 0xb2, 0x02, 0xe6, 0x90, 0x54, - 0xed, 0x44, 0x24, 0xf5, 0x5a, 0x64, 0x33, 0x08, 0x06, 0xaf, 0x56, 0x3f, 0x63, 0x43, 0xdc, 0x82, - 0x59, 0x99, 0x0d, 0x02, 0xa1, 0xa4, 0xe9, 0x6a, 0xf5, 0x37, 0xe3, 0x62, 0x9c, 0xd4, 0x47, 0x2f, - 0xc0, 0xb4, 0xc7, 0x79, 0x77, 0x00, 0x20, 0xb8, 0xeb, 0x43, 0x12, 0x60, 0x1a, 0x47, 0x85, 0x38, - 0xae, 0xcb, 0x78, 0x6b, 0x48, 0x47, 0x03, 0x80, 0xb1, 0x38, 0x6f, 0xbd, 0x95, 0x54, 0xc0, 0x69, - 0x1b, 0xb4, 0x0e, 0x97, 0x86, 0x4e, 0x1a, 0x4a, 0x84, 0xf2, 0x15, 0x09, 0x75, 0x69, 0x33, 0xad, - 0x82, 0xb3, 0xec, 0xd0, 0x76, 0x8c, 0xca, 0x8e, 0xf3, 0xf4, 0x7c, 0xa3, 0xf0, 0xc6, 0x2b, 0xcc, - 0x65, 0x33, 0xe8, 0x76, 0xb5, 0x28, 0xdd, 0xd6, 0x7f, 0xaf, 0x45, 0x8b, 0x90, 0xa2, 0xc0, 0xc7, - 0xbd, 0x65, 0x4a, 0x59, 0x44, 0xd8, 0x91, 0x9b, 0xcd, 0x7e, 0x6f, 0x8e, 0xc4, 0x7e, 0xc3, 0xe2, - 0x79, 0x3c, 0xfd, 0xfd, 0x83, 0x06, 0xb3, 0x77, 0x3b, 0x9d, 0xd6, 0xaa, 0xc3, 0x77, 0x4b, 0xcb, - 0xa0, 0x3b, 0xac, 0x8a, 0x0e, 0x0c, 0xba, 0x93, 0xac, 0xa2, 0x4c, 0x86, 0xb9, 0x04, 0x3d, 0x0d, - 0x55, 0xf6, 0x97, 0x39, 0xce, 0xc3, 0x75, 0x92, 0x27, 0x99, 0x6a, 0x4b, 0xb6, 0x3d, 0x88, 0xfc, - 0xc6, 0x4a, 0x13, 0x7d, 0x03, 0x26, 0xd8, 0xde, 0x26, 0x4e, 0xb7, 0x20, 0xf9, 0x95, 0x4e, 0x35, - 0x84, 0x51, 0xc8, 0x67, 0x64, 0x03, 0x0e, 0xe0, 0xf4, 0x5d, 0x98, 0x8b, 0x0c, 0x02, 0x0f, 0x6d, - 0xf2, 0x06, 0xab, 0x57, 0xa8, 0x0d, 0x15, 0xd6, 0x3b, 0xab, 0x4a, 0xe5, 0x02, 0xaf, 0x17, 0x13, - 0x13, 0x11, 0x72, 0x0f, 0xf6, 0xe4, 0x63, 0x81, 0xa5, 0x6f, 0xc0, 0xc4, 0x6a, 0xab, 0x61, 0xbb, - 0x82, 0x6f, 0x98, 0x56, 0xd7, 0x4b, 0xce, 0xd4, 0xca, 0xea, 0x6d, 0x8c, 0xb9, 0x04, 0xe9, 0x30, - 0x4e, 0xee, 0x99, 0x64, 0x40, 0x39, 0xc5, 0x98, 0x6c, 0x00, 0x4b, 0xa4, 0x77, 0x78, 0x0b, 0x96, - 0x12, 0xfd, 0xc7, 0x25, 0x98, 0x90, 0xdd, 0x9e, 0xc1, 0xf9, 0x63, 0x2d, 0x76, 0xfe, 0x78, 0xa2, - 0xd8, 0x12, 0xe4, 0x1e, 0x3e, 0x3a, 0x89, 0xc3, 0xc7, 0xb5, 0x82, 0x78, 0x47, 0x9f, 0x3c, 0xde, - 0x2d, 0xc1, 0x4c, 0x7c, 0xf1, 0xd1, 0x33, 0x30, 0xc5, 0x52, 0xad, 0x65, 0x92, 0x66, 0xc8, 0xf0, - 0xd4, 0xeb, 0x87, 0x76, 0x28, 0xc2, 0x51, 0x3d, 0xd4, 0x53, 0x66, 0x2d, 0xd7, 0xa3, 0x72, 0xd0, - 0xf9, 0x53, 0x3a, 0xa4, 0x96, 0x5d, 0x13, 0x2f, 0xdb, 0x6b, 0xab, 0x0e, 0xdd, 0xf0, 0xda, 0xd4, - 0xb3, 0x9c, 0x5e, 0xaa, 0x23, 0x06, 0x86, 0xa3, 0xc8, 0xe8, 0x4d, 0x96, 0xf6, 0x7d, 0x77, 0xe8, - 0x99, 0x24, 0x8b, 0xbe, 0x05, 0xd4, 0x83, 0x6d, 0x84, 0xee, 0x9a, 0x6b, 0x1a, 0xb6, 0x58, 0x1c, - 0x4c, 0xb6, 0x89, 0x47, 0x1c, 0x93, 0x04, 0x94, 0x49, 0x40, 0x60, 0x05, 0xa6, 0xff, 0x46, 0x83, - 0x29, 0x39, 0x17, 0x67, 0x40, 0xd4, 0x5f, 0x8b, 0x13, 0xf5, 0xc7, 0x0a, 0xee, 0xd0, 0x6c, 0x96, - 0xfe, 0x5b, 0x0d, 0x16, 0x03, 0xd7, 0x5d, 0xa3, 0xdb, 0x30, 0x6c, 0xc3, 0x31, 0x89, 0x17, 0xc4, - 0xfa, 0x22, 0x94, 0xac, 0x81, 0x5c, 0x49, 0x90, 0x00, 0xa5, 0xd5, 0x16, 0x2e, 0x59, 0x03, 0x56, - 0x45, 0x77, 0x5c, 0x9f, 0x72, 0x36, 0x2f, 0x0e, 0x8a, 0xca, 0xeb, 0xbb, 0xb2, 0x1d, 0x2b, 0x0d, - 0xb4, 0x09, 0x95, 0x81, 0xeb, 0x51, 0x56, 0xb9, 0xca, 0x89, 0xf5, 0x3d, 0xc2, 0x6b, 0xb6, 0x6e, - 0x32, 0x10, 0xc3, 0x9d, 0xce, 0x60, 0xb0, 0x40, 0xd3, 0x7f, 0xa0, 0xc1, 0xc3, 0x19, 0xfe, 0x4b, - 0xd2, 0xd0, 0x85, 0x09, 0x4b, 0x08, 0x65, 0x7a, 0x79, 0xae, 0x58, 0xb7, 0x19, 0x53, 0x11, 0xa6, - 0xb6, 0x20, 0x85, 0x05, 0xd0, 0xfa, 0x2f, 0x35, 0xb8, 0x98, 0xf2, 0x97, 0xa7, 0x68, 0x16, 0xcf, - 0x92, 0x6d, 0xab, 0x14, 0xcd, 0xc2, 0x92, 0x4b, 0xd0, 0x6b, 0x50, 0xe5, 0x77, 0x44, 0xa6, 0x6b, - 0xcb, 0x09, 0xac, 0x07, 0x13, 0xd8, 0x92, 0xed, 0x0f, 0x0e, 0x96, 0xaf, 0x64, 0x9c, 0xb5, 0x03, - 0x31, 0x56, 0x00, 0x68, 0x19, 0x2a, 0xc4, 0xf3, 0x5c, 0x4f, 0x26, 0xfb, 0x49, 0x36, 0x53, 0x77, - 0x58, 0x03, 0x16, 0xed, 0xfa, 0xaf, 0xc2, 0x20, 0x65, 0xd9, 0x97, 0xf9, 0xc7, 0x16, 0x27, 0x99, - 0x18, 0xd9, 0xd2, 0x61, 0x2e, 0x41, 0x43, 0xb8, 0x60, 0x25, 0xd2, 0xb5, 0xdc, 0x9d, 0xf5, 0x62, - 0xd3, 0xa8, 0xcc, 0x1a, 0x0b, 0x12, 0xfe, 0x42, 0x52, 0x82, 0x53, 0x5d, 0xe8, 0x04, 0x52, 0x5a, - 0xe8, 0x75, 0x18, 0xdb, 0xa1, 0x74, 0x90, 0xf1, 0xb2, 0xff, 0x98, 0x22, 0x11, 0xba, 0x50, 0xe5, - 0xa3, 0xeb, 0x74, 0x5a, 0x98, 0x43, 0xe9, 0xbf, 0x2b, 0xa9, 0xf9, 0xe0, 0x27, 0xa4, 0xaf, 0xab, - 0xd1, 0xae, 0xd8, 0x86, 0xef, 0xf3, 0x14, 0x26, 0x4e, 0xf3, 0x73, 0x11, 0xc7, 0x95, 0x0c, 0xa7, - 0xb4, 0x51, 0x27, 0x2c, 0x9e, 0xda, 0x49, 0x8a, 0xe7, 0x54, 0x56, 0xe1, 0x44, 0x77, 0xa1, 0x4c, - 0xed, 0xa2, 0xa7, 0x72, 0x89, 0xd8, 0x59, 0x6b, 0x37, 0xa6, 0xe4, 0x94, 0x97, 0x3b, 0x6b, 0x6d, - 0xcc, 0x20, 0xd0, 0x06, 0x54, 0xbc, 0xa1, 0x4d, 0x58, 0x1d, 0x28, 0x17, 0xaf, 0x2b, 0x6c, 0x06, - 0xc3, 0xcd, 0xc7, 0x9e, 0x7c, 0x2c, 0x70, 0xf4, 0x1f, 0x6a, 0x30, 0x1d, 0xab, 0x16, 0xc8, 0x83, - 0xf3, 0x76, 0x64, 0xef, 0xc8, 0x79, 0x78, 0x76, 0xf4, 0x5d, 0x27, 0x37, 0xfd, 0x9c, 0xec, 0xf7, - 0x7c, 0x54, 0x86, 0x63, 0x7d, 0xe8, 0x06, 0x40, 0x38, 0x6c, 0xb6, 0x0f, 0x58, 0xf0, 0x8a, 0x0d, - 0x2f, 0xf7, 0x01, 0x8b, 0x69, 0x1f, 0x8b, 0x76, 0x74, 0x03, 0xc0, 0x27, 0xa6, 0x47, 0x68, 0x33, - 0x4c, 0x5c, 0xaa, 0x1c, 0xb7, 0x95, 0x04, 0x47, 0xb4, 0xf4, 0x5f, 0x94, 0x60, 0xba, 0x49, 0xe8, - 0x77, 0x5d, 0x6f, 0xb7, 0xe5, 0xda, 0x96, 0xb9, 0x7f, 0x06, 0x24, 0x00, 0xc7, 0x48, 0xc0, 0x71, - 0xf9, 0x32, 0xe6, 0x5d, 0x2e, 0x15, 0x78, 0x2b, 0x41, 0x05, 0x6e, 0x8c, 0x84, 0x7a, 0x34, 0x21, - 0xf8, 0x50, 0x83, 0xf9, 0x98, 0xfe, 0x9d, 0x30, 0xd7, 0xa8, 0xe4, 0xaf, 0x15, 0x4a, 0xfe, 0x31, - 0x18, 0x96, 0x30, 0xb3, 0x93, 0x3f, 0x5a, 0x83, 0x12, 0x75, 0xe5, 0xce, 0x18, 0x0d, 0x93, 0x10, - 0x2f, 0xac, 0x67, 0x1d, 0x17, 0x97, 0xa8, 0xab, 0xff, 0x51, 0x83, 0x85, 0x98, 0x56, 0x34, 0x5b, - 0x7e, 0x4e, 0x23, 0xc0, 0x30, 0xb6, 0xed, 0xb9, 0xfd, 0x13, 0x8f, 0x41, 0x2d, 0xf2, 0xcb, 0x9e, - 0xdb, 0xc7, 0x1c, 0x4b, 0xff, 0x48, 0x83, 0x8b, 0x31, 0xcd, 0x33, 0xe0, 0x24, 0xaf, 0xc7, 0x39, - 0xc9, 0xb5, 0x51, 0x06, 0x92, 0xc3, 0x4c, 0x3e, 0x2a, 0x25, 0x86, 0xc1, 0x06, 0x8c, 0xb6, 0x61, - 0x6a, 0xe0, 0x76, 0xdb, 0xa7, 0x70, 0xf9, 0x3b, 0xcb, 0xb8, 0x62, 0x2b, 0xc4, 0xc2, 0x51, 0x60, - 0x74, 0x0f, 0x2e, 0x32, 0xda, 0xe2, 0x0f, 0x0c, 0x93, 0xb4, 0x4f, 0xe1, 0x75, 0xd8, 0x43, 0xfc, - 0x76, 0x29, 0x89, 0x88, 0xd3, 0x9d, 0xa0, 0x75, 0x98, 0xb0, 0x06, 0xfc, 0xec, 0x22, 0x37, 0xe9, - 0xb1, 0x04, 0x4f, 0x9c, 0x74, 0x44, 0xf9, 0x90, 0x0f, 0x38, 0xc0, 0xd0, 0xff, 0x92, 0x8c, 0x06, - 0x4e, 0x85, 0x5f, 0x89, 0x50, 0x0f, 0x79, 0x0f, 0x74, 0x32, 0xda, 0xd1, 0x94, 0x2c, 0xe7, 0xa4, - 0xac, 0xbd, 0x9a, 0xe0, 0x44, 0x5f, 0x82, 0x09, 0xe2, 0x74, 0xf9, 0x41, 0x40, 0xbc, 0x64, 0xe1, - 0xa3, 0xba, 0x23, 0x9a, 0x70, 0x20, 0xd3, 0x7f, 0x54, 0x4e, 0x8c, 0x8a, 0x97, 0xf0, 0x77, 0x4e, - 0x2d, 0x38, 0xd4, 0x61, 0x22, 0x37, 0x40, 0xb6, 0x42, 0x6a, 0x29, 0x62, 0xfe, 0x6b, 0xa3, 0xc4, - 0x7c, 0xb4, 0xb6, 0xe6, 0x12, 0x4b, 0xf4, 0x2d, 0x18, 0x27, 0xa2, 0x0b, 0x51, 0xb1, 0x6f, 0x8e, - 0xd2, 0x45, 0x98, 0x7e, 0xc3, 0x94, 0x2d, 0xdb, 0x24, 0x2a, 0x7a, 0x89, 0xcd, 0x17, 0xd3, 0x65, - 0x47, 0x1e, 0xc1, 0xcc, 0x27, 0x1b, 0x8f, 0x88, 0x61, 0xab, 0xe6, 0x07, 0x07, 0xcb, 0x10, 0x3e, - 0xe2, 0xa8, 0x85, 0xfe, 0x3d, 0xb8, 0x94, 0x51, 0x22, 0x90, 0x19, 0x7b, 0x33, 0x24, 0x32, 0x66, - 0xbd, 0xd8, 0x32, 0x14, 0xbf, 0xe2, 0x7c, 0xbf, 0x04, 0x20, 0xdf, 0x45, 0x9d, 0xcd, 0x97, 0x55, - 0xa3, 0xdd, 0x0a, 0x86, 0xae, 0x9d, 0xda, 0xad, 0x60, 0x04, 0xf2, 0xe8, 0x52, 0xfc, 0x8f, 0x12, - 0x5c, 0x0a, 0x95, 0x0b, 0xdf, 0x0a, 0x66, 0x98, 0xfc, 0xef, 0xeb, 0xaa, 0x62, 0x37, 0x75, 0xe1, - 0xd4, 0xfd, 0xe7, 0xdd, 0xd4, 0x85, 0xbe, 0xe5, 0x54, 0xda, 0x5f, 0x97, 0xa2, 0x03, 0x18, 0xf1, - 0xba, 0xe8, 0x14, 0x3e, 0x30, 0xfa, 0xc2, 0xdd, 0x38, 0xe9, 0x7f, 0x2e, 0xc3, 0x85, 0xe4, 0x6e, - 0x8c, 0xdd, 0x2a, 0x68, 0xc7, 0xde, 0x2a, 0xb4, 0x60, 0x6e, 0x7b, 0x68, 0xdb, 0xfb, 0x7c, 0x0c, - 0x91, 0xab, 0x05, 0x71, 0x1f, 0xf1, 0x7f, 0xd2, 0x72, 0xee, 0xe5, 0x0c, 0x1d, 0x9c, 0x69, 0x99, - 0xbe, 0x64, 0x18, 0xfb, 0x77, 0x2f, 0x19, 0x2a, 0x27, 0xb8, 0x64, 0xc8, 0xbe, 0xa7, 0x29, 0x9f, - 0xe8, 0x9e, 0xe6, 0x24, 0x37, 0x0c, 0x19, 0x49, 0xec, 0xd8, 0x52, 0xf2, 0x22, 0xcc, 0xc4, 0x6f, - 0xbd, 0xc4, 0x5a, 0x8a, 0x8b, 0x37, 0x79, 0xc7, 0x14, 0x59, 0x4b, 0xd1, 0x8e, 0x95, 0x86, 0x7e, - 0xa8, 0xc1, 0xe5, 0xec, 0xaf, 0x5b, 0x90, 0x0d, 0x33, 0x7d, 0xe3, 0x5e, 0xf4, 0x8b, 0x23, 0xed, - 0x84, 0x4c, 0x89, 0x5f, 0x77, 0xac, 0xc7, 0xb0, 0x70, 0x02, 0x1b, 0xbd, 0x05, 0xd5, 0xbe, 0x71, - 0xaf, 0x3d, 0xf4, 0x7a, 0xe4, 0xc4, 0x8c, 0x8c, 0x6f, 0xa3, 0x75, 0x89, 0x82, 0x15, 0x9e, 0xfe, - 0x99, 0x06, 0xf3, 0x39, 0x97, 0x18, 0xff, 0x45, 0xa3, 0x7c, 0xb7, 0x04, 0x95, 0xb6, 0x69, 0xd8, - 0xe4, 0x0c, 0x08, 0xc5, 0xab, 0x31, 0x42, 0x71, 0xdc, 0x57, 0xb2, 0xdc, 0xab, 0x5c, 0x2e, 0x81, - 0x13, 0x5c, 0xe2, 0x89, 0x42, 0x68, 0x47, 0xd3, 0x88, 0xe7, 0x60, 0x52, 0x75, 0x3a, 0x5a, 0x76, - 0xd3, 0x7f, 0x5e, 0x82, 0xa9, 0x48, 0x17, 0x23, 0xe6, 0xc6, 0xed, 0x58, 0x41, 0x28, 0x17, 0x78, - 0x83, 0x14, 0xe9, 0xab, 0x16, 0x94, 0x00, 0xf1, 0x95, 0x47, 0x78, 0xaf, 0x9f, 0xae, 0x0c, 0x2f, - 0xc2, 0x0c, 0x35, 0xbc, 0x1e, 0xa1, 0xea, 0xc8, 0x20, 0x5e, 0x9e, 0xaa, 0xcf, 0x8d, 0x3a, 0x31, - 0x29, 0x4e, 0x68, 0x2f, 0xbe, 0x00, 0xd3, 0xb1, 0xce, 0x46, 0xf9, 0x48, 0xa3, 0xb1, 0x72, 0xff, - 0xd3, 0xa5, 0x73, 0x1f, 0x7f, 0xba, 0x74, 0xee, 0x93, 0x4f, 0x97, 0xce, 0x7d, 0xff, 0x70, 0x49, - 0xbb, 0x7f, 0xb8, 0xa4, 0x7d, 0x7c, 0xb8, 0xa4, 0x7d, 0x72, 0xb8, 0xa4, 0xfd, 0xed, 0x70, 0x49, - 0xfb, 0xc9, 0x67, 0x4b, 0xe7, 0xde, 0x7a, 0xe4, 0xc8, 0xff, 0xd9, 0xf8, 0x57, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x39, 0x36, 0x95, 0x55, 0xec, 0x31, 0x00, 0x00, + // 2858 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x24, 0x47, + 0x15, 0xdf, 0x9e, 0xf1, 0xd8, 0xe3, 0xe7, 0xb5, 0xbd, 0x5b, 0xeb, 0xac, 0x1d, 0x2f, 0xb1, 0xa3, + 0x46, 0x84, 0x4d, 0xd8, 0xcc, 0xb0, 0x9b, 0x64, 0xc9, 0x87, 0x94, 0xb0, 0xe3, 0xdd, 0x64, 0x9d, + 0xd8, 0xe3, 0x49, 0xcd, 0x38, 0x41, 0x11, 0x01, 0xda, 0x3d, 0xe5, 0x71, 0xc7, 0x3d, 0xdd, 0xa3, + 0xee, 0x1a, 0xb3, 0xbe, 0x81, 0xe0, 0x92, 0x13, 0x5c, 0x02, 0x1c, 0x91, 0x90, 0xb8, 0x72, 0xe5, + 0x10, 0x22, 0x10, 0x41, 0x5a, 0x21, 0x0e, 0x91, 0x38, 0x90, 0x93, 0x45, 0x9c, 0x13, 0xe2, 0x1f, + 0x40, 0x7b, 0x42, 0xf5, 0xd1, 0xd5, 0xdf, 0x76, 0x8f, 0xf1, 0x5a, 0x04, 0x71, 0x5a, 0x4f, 0xbd, + 0xf7, 0x7e, 0xf5, 0xaa, 0xea, 0xd5, 0x7b, 0xbf, 0xaa, 0xea, 0x85, 0x57, 0x77, 0x9f, 0xf7, 0x6b, + 0x96, 0x5b, 0xdf, 0x1d, 0x6e, 0x11, 0xcf, 0x21, 0x94, 0xf8, 0xf5, 0x3d, 0xe2, 0x74, 0x5d, 0xaf, + 0x2e, 0x05, 0xc6, 0xc0, 0xaa, 0x93, 0x7b, 0x94, 0x38, 0xbe, 0xe5, 0x3a, 0x7e, 0x7d, 0xef, 0xfa, + 0x16, 0xa1, 0xc6, 0xf5, 0x7a, 0x8f, 0x38, 0xc4, 0x33, 0x28, 0xe9, 0xd6, 0x06, 0x9e, 0x4b, 0x5d, + 0xf4, 0x98, 0x50, 0xaf, 0x19, 0x03, 0xab, 0x16, 0xaa, 0xd7, 0xa4, 0xfa, 0xe2, 0xd3, 0x3d, 0x8b, + 0xee, 0x0c, 0xb7, 0x6a, 0xa6, 0xdb, 0xaf, 0xf7, 0xdc, 0x9e, 0x5b, 0xe7, 0x56, 0x5b, 0xc3, 0x6d, + 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0x09, 0xb4, 0x45, 0x3d, 0xd2, 0xb9, 0xe9, 0x7a, 0xa4, 0xbe, 0x97, + 0xea, 0x71, 0xf1, 0xd9, 0x50, 0xa7, 0x6f, 0x98, 0x3b, 0x96, 0x43, 0xbc, 0xfd, 0xfa, 0x60, 0xb7, + 0xc7, 0x1a, 0xfc, 0x7a, 0x9f, 0x50, 0x23, 0xcb, 0xaa, 0x9e, 0x67, 0xe5, 0x0d, 0x1d, 0x6a, 0xf5, + 0x49, 0xca, 0xe0, 0xe6, 0x71, 0x06, 0xbe, 0xb9, 0x43, 0xfa, 0x46, 0xca, 0xee, 0x99, 0x3c, 0xbb, + 0x21, 0xb5, 0xec, 0xba, 0xe5, 0x50, 0x9f, 0x7a, 0x49, 0x23, 0xfd, 0x83, 0x12, 0x4c, 0xde, 0x36, + 0x48, 0xdf, 0x75, 0xda, 0x84, 0xa2, 0xef, 0x41, 0x95, 0x0d, 0xa3, 0x6b, 0x50, 0x63, 0x41, 0x7b, + 0x5c, 0xbb, 0x3a, 0x75, 0xe3, 0xeb, 0xb5, 0x70, 0x9a, 0x15, 0x6a, 0x6d, 0xb0, 0xdb, 0x63, 0x0d, + 0x7e, 0x8d, 0x69, 0xd7, 0xf6, 0xae, 0xd7, 0x36, 0xb6, 0xde, 0x23, 0x26, 0x5d, 0x27, 0xd4, 0x68, + 0xa0, 0xfb, 0x07, 0xcb, 0xe7, 0x0e, 0x0f, 0x96, 0x21, 0x6c, 0xc3, 0x0a, 0x15, 0x35, 0x61, 0xcc, + 0x1f, 0x10, 0x73, 0xa1, 0xc4, 0xd1, 0xaf, 0xd5, 0x8e, 0x5c, 0xc4, 0x9a, 0xf2, 0xac, 0x3d, 0x20, + 0x66, 0xe3, 0xbc, 0x44, 0x1e, 0x63, 0xbf, 0x30, 0xc7, 0x41, 0x6f, 0xc1, 0xb8, 0x4f, 0x0d, 0x3a, + 0xf4, 0x17, 0xca, 0x1c, 0xb1, 0x56, 0x18, 0x91, 0x5b, 0x35, 0x66, 0x24, 0xe6, 0xb8, 0xf8, 0x8d, + 0x25, 0x9a, 0xfe, 0x8f, 0x12, 0x20, 0xa5, 0xbb, 0xe2, 0x3a, 0x5d, 0x8b, 0x5a, 0xae, 0x83, 0x5e, + 0x84, 0x31, 0xba, 0x3f, 0x20, 0x7c, 0x72, 0x26, 0x1b, 0x4f, 0x04, 0x0e, 0x75, 0xf6, 0x07, 0xe4, + 0xc1, 0xc1, 0xf2, 0xe5, 0xb4, 0x05, 0x93, 0x60, 0x6e, 0x83, 0xd6, 0x94, 0xab, 0x25, 0x6e, 0xfd, + 0x6c, 0xbc, 0xeb, 0x07, 0x07, 0xcb, 0x19, 0x41, 0x58, 0x53, 0x48, 0x71, 0x07, 0xd1, 0x1e, 0x20, + 0xdb, 0xf0, 0x69, 0xc7, 0x33, 0x1c, 0x5f, 0xf4, 0x64, 0xf5, 0x89, 0x9c, 0x84, 0xa7, 0x8a, 0x2d, + 0x1a, 0xb3, 0x68, 0x2c, 0x4a, 0x2f, 0xd0, 0x5a, 0x0a, 0x0d, 0x67, 0xf4, 0x80, 0x9e, 0x80, 0x71, + 0x8f, 0x18, 0xbe, 0xeb, 0x2c, 0x8c, 0xf1, 0x51, 0xa8, 0x09, 0xc4, 0xbc, 0x15, 0x4b, 0x29, 0x7a, + 0x12, 0x26, 0xfa, 0xc4, 0xf7, 0x8d, 0x1e, 0x59, 0xa8, 0x70, 0xc5, 0x59, 0xa9, 0x38, 0xb1, 0x2e, + 0x9a, 0x71, 0x20, 0xd7, 0x3f, 0xd4, 0x60, 0x5a, 0xcd, 0xdc, 0x9a, 0xe5, 0x53, 0xf4, 0xed, 0x54, + 0x1c, 0xd6, 0x8a, 0x0d, 0x89, 0x59, 0xf3, 0x28, 0xbc, 0x20, 0x7b, 0xab, 0x06, 0x2d, 0x91, 0x18, + 0x5c, 0x87, 0x8a, 0x45, 0x49, 0x9f, 0xad, 0x43, 0xf9, 0xea, 0xd4, 0x8d, 0xab, 0x45, 0x43, 0xa6, + 0x31, 0x2d, 0x41, 0x2b, 0xab, 0xcc, 0x1c, 0x0b, 0x14, 0xfd, 0x67, 0x63, 0x11, 0xf7, 0x59, 0x68, + 0xa2, 0x77, 0xa1, 0xea, 0x13, 0x9b, 0x98, 0xd4, 0xf5, 0xa4, 0xfb, 0xcf, 0x14, 0x74, 0xdf, 0xd8, + 0x22, 0x76, 0x5b, 0x9a, 0x36, 0xce, 0x33, 0xff, 0x83, 0x5f, 0x58, 0x41, 0xa2, 0x37, 0xa1, 0x4a, + 0x49, 0x7f, 0x60, 0x1b, 0x94, 0xc8, 0x7d, 0xf4, 0xe5, 0xe8, 0x10, 0x58, 0xe4, 0x30, 0xb0, 0x96, + 0xdb, 0xed, 0x48, 0x35, 0xbe, 0x7d, 0xd4, 0x94, 0x04, 0xad, 0x58, 0xc1, 0xa0, 0x3d, 0x98, 0x19, + 0x0e, 0xba, 0x4c, 0x93, 0xb2, 0xec, 0xd0, 0xdb, 0x97, 0x91, 0x74, 0xb3, 0xe8, 0xdc, 0x6c, 0xc6, + 0xac, 0x1b, 0x97, 0x65, 0x5f, 0x33, 0xf1, 0x76, 0x9c, 0xe8, 0x05, 0xdd, 0x82, 0xd9, 0xbe, 0xe5, + 0x60, 0x62, 0x74, 0xf7, 0xdb, 0xc4, 0x74, 0x9d, 0xae, 0xcf, 0xc3, 0xaa, 0xd2, 0x98, 0x97, 0x00, + 0xb3, 0xeb, 0x71, 0x31, 0x4e, 0xea, 0xa3, 0xd7, 0x01, 0x05, 0xc3, 0x78, 0x4d, 0x24, 0x37, 0xcb, + 0x75, 0x78, 0xcc, 0x95, 0xc3, 0xe0, 0xee, 0xa4, 0x34, 0x70, 0x86, 0x15, 0x5a, 0x83, 0x39, 0x8f, + 0xec, 0x59, 0x6c, 0x8c, 0x77, 0x2d, 0x9f, 0xba, 0xde, 0xfe, 0x9a, 0xd5, 0xb7, 0xe8, 0xc2, 0x38, + 0xf7, 0x69, 0xe1, 0xf0, 0x60, 0x79, 0x0e, 0x67, 0xc8, 0x71, 0xa6, 0x95, 0xfe, 0xf3, 0x71, 0x98, + 0x4d, 0xe4, 0x1b, 0xf4, 0x16, 0x5c, 0x36, 0x87, 0x9e, 0x47, 0x1c, 0xda, 0x1c, 0xf6, 0xb7, 0x88, + 0xd7, 0x36, 0x77, 0x48, 0x77, 0x68, 0x93, 0x2e, 0x0f, 0x94, 0x4a, 0x63, 0x49, 0x7a, 0x7c, 0x79, + 0x25, 0x53, 0x0b, 0xe7, 0x58, 0xb3, 0x59, 0x70, 0x78, 0xd3, 0xba, 0xe5, 0xfb, 0x0a, 0xb3, 0xc4, + 0x31, 0xd5, 0x2c, 0x34, 0x53, 0x1a, 0x38, 0xc3, 0x8a, 0xf9, 0xd8, 0x25, 0xbe, 0xe5, 0x91, 0x6e, + 0xd2, 0xc7, 0x72, 0xdc, 0xc7, 0xdb, 0x99, 0x5a, 0x38, 0xc7, 0x1a, 0x3d, 0x07, 0x53, 0xa2, 0x37, + 0xbe, 0x7e, 0x72, 0xa1, 0x2f, 0x49, 0xb0, 0xa9, 0x66, 0x28, 0xc2, 0x51, 0x3d, 0x36, 0x34, 0x77, + 0xcb, 0x27, 0xde, 0x1e, 0xe9, 0xe6, 0x2f, 0xf0, 0x46, 0x4a, 0x03, 0x67, 0x58, 0xb1, 0xa1, 0x89, + 0x08, 0x4c, 0x0d, 0x6d, 0x3c, 0x3e, 0xb4, 0xcd, 0x4c, 0x2d, 0x9c, 0x63, 0xcd, 0xe2, 0x58, 0xb8, + 0x7c, 0x6b, 0xcf, 0xb0, 0x6c, 0x63, 0xcb, 0x26, 0x0b, 0x13, 0xf1, 0x38, 0x6e, 0xc6, 0xc5, 0x38, + 0xa9, 0x8f, 0x5e, 0x83, 0x8b, 0xa2, 0x69, 0xd3, 0x31, 0x14, 0x48, 0x95, 0x83, 0x3c, 0x2a, 0x41, + 0x2e, 0x36, 0x93, 0x0a, 0x38, 0x6d, 0x83, 0x5e, 0x84, 0x19, 0xd3, 0xb5, 0x6d, 0x1e, 0x8f, 0x2b, + 0xee, 0xd0, 0xa1, 0x0b, 0x93, 0x1c, 0x05, 0xb1, 0xfd, 0xb8, 0x12, 0x93, 0xe0, 0x84, 0x26, 0x22, + 0x00, 0x66, 0x50, 0x70, 0xfc, 0x05, 0xe0, 0xf9, 0xf1, 0x7a, 0xd1, 0x1c, 0xa0, 0x4a, 0x55, 0xc8, + 0x01, 0x54, 0x93, 0x8f, 0x23, 0xc0, 0xfa, 0x9f, 0x35, 0x98, 0xcf, 0x49, 0x1d, 0xe8, 0x95, 0x58, + 0x89, 0xfd, 0x5a, 0xa2, 0xc4, 0x5e, 0xc9, 0x31, 0x8b, 0xd4, 0x59, 0x07, 0xa6, 0x3d, 0x36, 0x2a, + 0xa7, 0x27, 0x54, 0x64, 0x8e, 0x7c, 0xee, 0x98, 0x61, 0xe0, 0xa8, 0x4d, 0x98, 0xf3, 0x2f, 0x1e, + 0x1e, 0x2c, 0x4f, 0xc7, 0x64, 0x38, 0x0e, 0xaf, 0xff, 0xa2, 0x04, 0x70, 0x9b, 0x0c, 0x6c, 0x77, + 0xbf, 0x4f, 0x9c, 0xb3, 0xe0, 0x50, 0x1b, 0x31, 0x0e, 0xf5, 0xf4, 0x71, 0xcb, 0xa3, 0x5c, 0xcb, + 0x25, 0x51, 0x6f, 0x27, 0x48, 0x54, 0xbd, 0x38, 0xe4, 0xd1, 0x2c, 0xea, 0x6f, 0x65, 0xb8, 0x14, + 0x2a, 0x87, 0x34, 0xea, 0xa5, 0xd8, 0x1a, 0x7f, 0x35, 0xb1, 0xc6, 0xf3, 0x19, 0x26, 0x0f, 0x8d, + 0x47, 0xbd, 0x07, 0x33, 0x8c, 0xe5, 0x88, 0xb5, 0xe4, 0x1c, 0x6a, 0x7c, 0x64, 0x0e, 0xa5, 0xaa, + 0xdd, 0x5a, 0x0c, 0x09, 0x27, 0x90, 0x73, 0x38, 0xdb, 0xc4, 0x17, 0x91, 0xb3, 0x7d, 0xa4, 0xc1, + 0x4c, 0xb8, 0x4c, 0x67, 0x40, 0xda, 0x9a, 0x71, 0xd2, 0xf6, 0x64, 0xe1, 0x10, 0xcd, 0x61, 0x6d, + 0xff, 0x62, 0x04, 0x5f, 0x29, 0xb1, 0x0d, 0xbe, 0x65, 0x98, 0xbb, 0xe8, 0x71, 0x18, 0x73, 0x8c, + 0x7e, 0x10, 0x99, 0x6a, 0xb3, 0x34, 0x8d, 0x3e, 0xc1, 0x5c, 0x82, 0x3e, 0xd0, 0x00, 0xc9, 0x2a, + 0x70, 0xcb, 0x71, 0x5c, 0x6a, 0x88, 0x5c, 0x29, 0xdc, 0x5a, 0x2d, 0xec, 0x56, 0xd0, 0x63, 0x6d, + 0x33, 0x85, 0x75, 0xc7, 0xa1, 0xde, 0x7e, 0xb8, 0xc8, 0x69, 0x05, 0x9c, 0xe1, 0x00, 0x32, 0x00, + 0x3c, 0x89, 0xd9, 0x71, 0xe5, 0x46, 0x7e, 0xba, 0x40, 0xce, 0x63, 0x06, 0x2b, 0xae, 0xb3, 0x6d, + 0xf5, 0xc2, 0xb4, 0x83, 0x15, 0x10, 0x8e, 0x80, 0x2e, 0xde, 0x81, 0xf9, 0x1c, 0x6f, 0xd1, 0x05, + 0x28, 0xef, 0x92, 0x7d, 0x31, 0x6d, 0x98, 0xfd, 0x89, 0xe6, 0xa0, 0xb2, 0x67, 0xd8, 0x43, 0x91, + 0x7e, 0x27, 0xb1, 0xf8, 0xf1, 0x62, 0xe9, 0x79, 0x4d, 0xff, 0xb0, 0x12, 0x8d, 0x1d, 0xce, 0x98, + 0xaf, 0x42, 0xd5, 0x23, 0x03, 0xdb, 0x32, 0x0d, 0x5f, 0x12, 0x21, 0x4e, 0x7e, 0xb1, 0x6c, 0xc3, + 0x4a, 0x1a, 0xe3, 0xd6, 0xa5, 0x87, 0xcb, 0xad, 0xcb, 0xa7, 0xc3, 0xad, 0xbf, 0x0b, 0x55, 0x3f, + 0x60, 0xd5, 0x63, 0x1c, 0xf2, 0xfa, 0x08, 0xf9, 0x55, 0x12, 0x6a, 0xd5, 0x81, 0xa2, 0xd2, 0x0a, + 0x34, 0x8b, 0x44, 0x57, 0x46, 0x24, 0xd1, 0xa7, 0x4a, 0x7c, 0x59, 0xbe, 0x19, 0x18, 0x43, 0x9f, + 0x74, 0x79, 0x6e, 0xab, 0x86, 0xf9, 0xa6, 0xc5, 0x5b, 0xb1, 0x94, 0xa2, 0x77, 0x63, 0x21, 0x5b, + 0x3d, 0x49, 0xc8, 0xce, 0xe4, 0x87, 0x2b, 0xda, 0x84, 0xf9, 0x81, 0xe7, 0xf6, 0x3c, 0xe2, 0xfb, + 0xb7, 0x89, 0xd1, 0xb5, 0x2d, 0x87, 0x04, 0xf3, 0x23, 0x18, 0xd1, 0x95, 0xc3, 0x83, 0xe5, 0xf9, + 0x56, 0xb6, 0x0a, 0xce, 0xb3, 0xd5, 0xef, 0x8f, 0xc1, 0x85, 0x64, 0x05, 0xcc, 0x21, 0xa9, 0xda, + 0x89, 0x48, 0xea, 0xb5, 0xc8, 0x66, 0x10, 0x0c, 0x5e, 0xad, 0x7e, 0xc6, 0x86, 0xb8, 0x05, 0xb3, + 0x32, 0x1b, 0x04, 0x42, 0x49, 0xd3, 0xd5, 0xea, 0x6f, 0xc6, 0xc5, 0x38, 0xa9, 0x8f, 0x5e, 0x82, + 0x69, 0x8f, 0xf3, 0xee, 0x00, 0x40, 0x70, 0xd7, 0x47, 0x24, 0xc0, 0x34, 0x8e, 0x0a, 0x71, 0x5c, + 0x97, 0xf1, 0xd6, 0x90, 0x8e, 0x06, 0x00, 0x63, 0x71, 0xde, 0x7a, 0x2b, 0xa9, 0x80, 0xd3, 0x36, + 0x68, 0x1d, 0x2e, 0x0d, 0x9d, 0x34, 0x94, 0x08, 0xe5, 0x2b, 0x12, 0xea, 0xd2, 0x66, 0x5a, 0x05, + 0x67, 0xd9, 0xa1, 0xed, 0x18, 0x95, 0x1d, 0xe7, 0xe9, 0xf9, 0x46, 0xe1, 0x8d, 0x57, 0x98, 0xcb, + 0x66, 0xd0, 0xed, 0x6a, 0x51, 0xba, 0xad, 0xff, 0x41, 0x8b, 0x16, 0x21, 0x45, 0x81, 0x8f, 0xbb, + 0x65, 0x4a, 0x59, 0x44, 0xd8, 0x91, 0x9b, 0xcd, 0x7e, 0x6f, 0x8e, 0xc4, 0x7e, 0xc3, 0xe2, 0x79, + 0x3c, 0xfd, 0xfd, 0xa3, 0x06, 0xb3, 0x77, 0x3b, 0x9d, 0xd6, 0xaa, 0xc3, 0x77, 0x4b, 0xcb, 0xa0, + 0x3b, 0xac, 0x8a, 0x0e, 0x0c, 0xba, 0x93, 0xac, 0xa2, 0x4c, 0x86, 0xb9, 0x04, 0x3d, 0x0b, 0x55, + 0xf6, 0x2f, 0x73, 0x9c, 0x87, 0xeb, 0x24, 0x4f, 0x32, 0xd5, 0x96, 0x6c, 0x7b, 0x10, 0xf9, 0x1b, + 0x2b, 0x4d, 0xf4, 0x2d, 0x98, 0x60, 0x7b, 0x9b, 0x38, 0xdd, 0x82, 0xe4, 0x57, 0x3a, 0xd5, 0x10, + 0x46, 0x21, 0x9f, 0x91, 0x0d, 0x38, 0x80, 0xd3, 0x77, 0x61, 0x2e, 0x32, 0x08, 0x3c, 0xb4, 0xc9, + 0x5b, 0xac, 0x5e, 0xa1, 0x36, 0x54, 0x58, 0xef, 0xac, 0x2a, 0x95, 0x0b, 0x5c, 0x2f, 0x26, 0x26, + 0x22, 0xe4, 0x1e, 0xec, 0x97, 0x8f, 0x05, 0x96, 0xbe, 0x01, 0x13, 0xab, 0xad, 0x86, 0xed, 0x0a, + 0xbe, 0x61, 0x5a, 0x5d, 0x2f, 0x39, 0x53, 0x2b, 0xab, 0xb7, 0x31, 0xe6, 0x12, 0xa4, 0xc3, 0x38, + 0xb9, 0x67, 0x92, 0x01, 0xe5, 0x14, 0x63, 0xb2, 0x01, 0x2c, 0x91, 0xde, 0xe1, 0x2d, 0x58, 0x4a, + 0xf4, 0x9f, 0x94, 0x60, 0x42, 0x76, 0x7b, 0x06, 0xe7, 0x8f, 0xb5, 0xd8, 0xf9, 0xe3, 0xa9, 0x62, + 0x4b, 0x90, 0x7b, 0xf8, 0xe8, 0x24, 0x0e, 0x1f, 0xd7, 0x0a, 0xe2, 0x1d, 0x7d, 0xf2, 0x78, 0xbf, + 0x04, 0x33, 0xf1, 0xc5, 0x47, 0xcf, 0xc1, 0x14, 0x4b, 0xb5, 0x96, 0x49, 0x9a, 0x21, 0xc3, 0x53, + 0xd7, 0x0f, 0xed, 0x50, 0x84, 0xa3, 0x7a, 0xa8, 0xa7, 0xcc, 0x5a, 0xae, 0x47, 0xe5, 0xa0, 0xf3, + 0xa7, 0x74, 0x48, 0x2d, 0xbb, 0x26, 0x2e, 0xdb, 0x6b, 0xab, 0x0e, 0xdd, 0xf0, 0xda, 0xd4, 0xb3, + 0x9c, 0x5e, 0xaa, 0x23, 0x06, 0x86, 0xa3, 0xc8, 0xe8, 0x6d, 0x96, 0xf6, 0x7d, 0x77, 0xe8, 0x99, + 0x24, 0x8b, 0xbe, 0x05, 0xd4, 0x83, 0x6d, 0x84, 0xee, 0x9a, 0x6b, 0x1a, 0xb6, 0x58, 0x1c, 0x4c, + 0xb6, 0x89, 0x47, 0x1c, 0x93, 0x04, 0x94, 0x49, 0x40, 0x60, 0x05, 0xa6, 0xff, 0x56, 0x83, 0x29, + 0x39, 0x17, 0x67, 0x40, 0xd4, 0xdf, 0x88, 0x13, 0xf5, 0x27, 0x0a, 0xee, 0xd0, 0x6c, 0x96, 0xfe, + 0x3b, 0x0d, 0x16, 0x03, 0xd7, 0x5d, 0xa3, 0xdb, 0x30, 0x6c, 0xc3, 0x31, 0x89, 0x17, 0xc4, 0xfa, + 0x22, 0x94, 0xac, 0x81, 0x5c, 0x49, 0x90, 0x00, 0xa5, 0xd5, 0x16, 0x2e, 0x59, 0x03, 0x56, 0x45, + 0x77, 0x5c, 0x9f, 0x72, 0x36, 0x2f, 0x0e, 0x8a, 0xca, 0xeb, 0xbb, 0xb2, 0x1d, 0x2b, 0x0d, 0xb4, + 0x09, 0x95, 0x81, 0xeb, 0x51, 0x56, 0xb9, 0xca, 0x89, 0xf5, 0x3d, 0xc2, 0x6b, 0xb6, 0x6e, 0x32, + 0x10, 0xc3, 0x9d, 0xce, 0x60, 0xb0, 0x40, 0xd3, 0x7f, 0xa8, 0xc1, 0xa3, 0x19, 0xfe, 0x4b, 0xd2, + 0xd0, 0x85, 0x09, 0x4b, 0x08, 0x65, 0x7a, 0x79, 0xa1, 0x58, 0xb7, 0x19, 0x53, 0x11, 0xa6, 0xb6, + 0x20, 0x85, 0x05, 0xd0, 0xfa, 0xaf, 0x34, 0xb8, 0x98, 0xf2, 0x97, 0xa7, 0x68, 0x16, 0xcf, 0x92, + 0x6d, 0xab, 0x14, 0xcd, 0xc2, 0x92, 0x4b, 0xd0, 0x1b, 0x50, 0xe5, 0x6f, 0x44, 0xa6, 0x6b, 0xcb, + 0x09, 0xac, 0x07, 0x13, 0xd8, 0x92, 0xed, 0x0f, 0x0e, 0x96, 0xaf, 0x64, 0x9c, 0xb5, 0x03, 0x31, + 0x56, 0x00, 0x68, 0x19, 0x2a, 0xc4, 0xf3, 0x5c, 0x4f, 0x26, 0xfb, 0x49, 0x36, 0x53, 0x77, 0x58, + 0x03, 0x16, 0xed, 0xfa, 0xaf, 0xc3, 0x20, 0x65, 0xd9, 0x97, 0xf9, 0xc7, 0x16, 0x27, 0x99, 0x18, + 0xd9, 0xd2, 0x61, 0x2e, 0x41, 0x43, 0xb8, 0x60, 0x25, 0xd2, 0xb5, 0xdc, 0x9d, 0xf5, 0x62, 0xd3, + 0xa8, 0xcc, 0x1a, 0x0b, 0x12, 0xfe, 0x42, 0x52, 0x82, 0x53, 0x5d, 0xe8, 0x04, 0x52, 0x5a, 0xe8, + 0x4d, 0x18, 0xdb, 0xa1, 0x74, 0x90, 0x71, 0xd9, 0x7f, 0x4c, 0x91, 0x08, 0x5d, 0xa8, 0xf2, 0xd1, + 0x75, 0x3a, 0x2d, 0xcc, 0xa1, 0xf4, 0xdf, 0x97, 0xd4, 0x7c, 0xf0, 0x13, 0xd2, 0x37, 0xd5, 0x68, + 0x57, 0x6c, 0xc3, 0xf7, 0x79, 0x0a, 0x13, 0xa7, 0xf9, 0xb9, 0x88, 0xe3, 0x4a, 0x86, 0x53, 0xda, + 0xa8, 0x13, 0x16, 0x4f, 0xed, 0x24, 0xc5, 0x73, 0x2a, 0xab, 0x70, 0xa2, 0xbb, 0x50, 0xa6, 0x76, + 0xd1, 0x53, 0xb9, 0x44, 0xec, 0xac, 0xb5, 0x1b, 0x53, 0x72, 0xca, 0xcb, 0x9d, 0xb5, 0x36, 0x66, + 0x10, 0x68, 0x03, 0x2a, 0xde, 0xd0, 0x26, 0xac, 0x0e, 0x94, 0x8b, 0xd7, 0x15, 0x36, 0x83, 0xe1, + 0xe6, 0x63, 0xbf, 0x7c, 0x2c, 0x70, 0xf4, 0x1f, 0x69, 0x30, 0x1d, 0xab, 0x16, 0xc8, 0x83, 0xf3, + 0x76, 0x64, 0xef, 0xc8, 0x79, 0x78, 0x7e, 0xf4, 0x5d, 0x27, 0x37, 0xfd, 0x9c, 0xec, 0xf7, 0x7c, + 0x54, 0x86, 0x63, 0x7d, 0xe8, 0x06, 0x40, 0x38, 0x6c, 0xb6, 0x0f, 0x58, 0xf0, 0x8a, 0x0d, 0x2f, + 0xf7, 0x01, 0x8b, 0x69, 0x1f, 0x8b, 0x76, 0x74, 0x03, 0xc0, 0x27, 0xa6, 0x47, 0x68, 0x33, 0x4c, + 0x5c, 0xaa, 0x1c, 0xb7, 0x95, 0x04, 0x47, 0xb4, 0xf4, 0x3f, 0x69, 0x30, 0xdd, 0x24, 0xf4, 0xfb, + 0xae, 0xb7, 0xdb, 0x72, 0x6d, 0xcb, 0xdc, 0x3f, 0x03, 0x12, 0x80, 0x63, 0x24, 0xe0, 0xb8, 0x7c, + 0x19, 0xf3, 0x2e, 0x8f, 0x0a, 0xe8, 0x1f, 0x69, 0x30, 0x1f, 0xd3, 0xbc, 0x13, 0xe6, 0x03, 0x95, + 0xa0, 0xb5, 0x42, 0x09, 0x3a, 0x06, 0xc3, 0x92, 0x5a, 0x76, 0x82, 0x46, 0x6b, 0x50, 0xa2, 0xae, + 0x8c, 0xde, 0xd1, 0x30, 0x09, 0xf1, 0xc2, 0x9a, 0xd3, 0x71, 0x71, 0x89, 0xba, 0x6c, 0x21, 0x16, + 0x62, 0x5a, 0xd1, 0x8c, 0xf6, 0x90, 0x46, 0x80, 0x61, 0x6c, 0xdb, 0x73, 0xfb, 0x27, 0x1e, 0x83, + 0x5a, 0x88, 0x57, 0x3d, 0xb7, 0x8f, 0x39, 0x96, 0xfe, 0xb1, 0x06, 0x17, 0x63, 0x9a, 0x67, 0xc0, + 0x1b, 0xde, 0x8c, 0xf3, 0x86, 0x6b, 0xa3, 0x0c, 0x24, 0x87, 0x3d, 0x7c, 0x5c, 0x4a, 0x0c, 0x83, + 0x0d, 0x18, 0x6d, 0xc3, 0xd4, 0xc0, 0xed, 0xb6, 0x4f, 0xe1, 0x81, 0x76, 0x96, 0xf1, 0xb9, 0x56, + 0x88, 0x85, 0xa3, 0xc0, 0xe8, 0x1e, 0x5c, 0x64, 0xd4, 0xc2, 0x1f, 0x18, 0x26, 0x69, 0x9f, 0xc2, + 0x95, 0xd5, 0x23, 0xfc, 0x05, 0x28, 0x89, 0x88, 0xd3, 0x9d, 0xa0, 0x75, 0x98, 0xb0, 0x06, 0xfc, + 0x7c, 0x21, 0x89, 0xe4, 0xb1, 0x24, 0x4c, 0x9c, 0x46, 0x44, 0x8a, 0x97, 0x3f, 0x70, 0x80, 0xa1, + 0xff, 0x35, 0x19, 0x0d, 0x9c, 0xae, 0xbe, 0x16, 0xa1, 0x07, 0xf2, 0xad, 0xe6, 0x64, 0xd4, 0xa0, + 0x29, 0x99, 0xc8, 0x49, 0x99, 0x75, 0x35, 0xc1, 0x5b, 0xbe, 0x02, 0x13, 0xc4, 0xe9, 0x72, 0xb2, + 0x2e, 0x2e, 0x42, 0xf8, 0xa8, 0xee, 0x88, 0x26, 0x1c, 0xc8, 0xf4, 0x1f, 0x97, 0x13, 0xa3, 0xe2, + 0x65, 0xf6, 0xbd, 0x53, 0x0b, 0x0e, 0x45, 0xf8, 0x73, 0x03, 0x64, 0x2b, 0xa4, 0x7f, 0x22, 0xe6, + 0xbf, 0x31, 0x4a, 0xcc, 0x47, 0xeb, 0x5f, 0x2e, 0xf9, 0x43, 0xdf, 0x81, 0x71, 0x22, 0xba, 0x10, + 0x55, 0xf5, 0xe6, 0x28, 0x5d, 0x84, 0xe9, 0x37, 0x3c, 0x67, 0xc9, 0x36, 0x89, 0x8a, 0x5e, 0x61, + 0xf3, 0xc5, 0x74, 0xd9, 0xb1, 0x44, 0xb0, 0xe7, 0xc9, 0xc6, 0x63, 0x62, 0xd8, 0xaa, 0xf9, 0xc1, + 0xc1, 0x32, 0x84, 0x3f, 0x71, 0xd4, 0x82, 0xbf, 0x9e, 0xc9, 0x3b, 0x9b, 0xb3, 0xf9, 0x02, 0x69, + 0xb4, 0xd7, 0xb3, 0xd0, 0xb5, 0x53, 0x7b, 0x3d, 0x8b, 0x40, 0x1e, 0x7d, 0x86, 0xfd, 0x67, 0x09, + 0x2e, 0x85, 0xca, 0x85, 0x5f, 0xcf, 0x32, 0x4c, 0xfe, 0xff, 0x15, 0x52, 0xb1, 0x17, 0xad, 0x70, + 0xea, 0xfe, 0xfb, 0x5e, 0xb4, 0x42, 0xdf, 0x72, 0xaa, 0xdd, 0x6f, 0x4a, 0xd1, 0x01, 0x8c, 0xf8, + 0xac, 0x72, 0x0a, 0x1f, 0xe2, 0x7c, 0xe1, 0x5e, 0x66, 0xf4, 0xbf, 0x94, 0xe1, 0x42, 0x72, 0x37, + 0xc6, 0x6e, 0xdf, 0xb5, 0x63, 0x6f, 0xdf, 0x5b, 0x30, 0xb7, 0x3d, 0xb4, 0xed, 0x7d, 0x3e, 0x86, + 0xc8, 0x15, 0xbc, 0xb8, 0xb7, 0xff, 0x92, 0xb4, 0x9c, 0x7b, 0x35, 0x43, 0x07, 0x67, 0x5a, 0xa6, + 0x2f, 0xe3, 0xc7, 0xfe, 0xd3, 0xcb, 0xf8, 0xca, 0x09, 0x2e, 0xe3, 0xb3, 0xdf, 0x33, 0xca, 0x27, + 0x7a, 0xcf, 0x38, 0xc9, 0x4d, 0x7c, 0x46, 0x12, 0x3b, 0xf6, 0xab, 0x92, 0x97, 0x61, 0x26, 0xfe, + 0x3a, 0x24, 0xd6, 0x52, 0x3c, 0x50, 0xc9, 0xb7, 0x98, 0xc8, 0x5a, 0x8a, 0x76, 0xac, 0x34, 0xf4, + 0x43, 0x0d, 0x2e, 0x67, 0x7f, 0x05, 0x82, 0x6c, 0x98, 0xe9, 0x1b, 0xf7, 0xa2, 0x5f, 0xe6, 0x68, + 0x27, 0x64, 0x2b, 0xfc, 0x59, 0x60, 0x3d, 0x86, 0x85, 0x13, 0xd8, 0xe8, 0x1d, 0xa8, 0xf6, 0x8d, + 0x7b, 0xed, 0xa1, 0xd7, 0x23, 0x27, 0x66, 0x45, 0x7c, 0x1b, 0xad, 0x4b, 0x14, 0xac, 0xf0, 0xf4, + 0xcf, 0x35, 0x98, 0xcf, 0xb9, 0xec, 0xff, 0x1f, 0x1a, 0xe5, 0xfb, 0x25, 0xa8, 0xb4, 0x4d, 0xc3, + 0x26, 0x67, 0x40, 0x28, 0x5e, 0x8f, 0x11, 0x8a, 0xe3, 0xbe, 0x26, 0xe5, 0x5e, 0xe5, 0x72, 0x09, + 0x9c, 0xe0, 0x12, 0x4f, 0x15, 0x42, 0x3b, 0x9a, 0x46, 0xbc, 0x00, 0x93, 0xaa, 0xd3, 0xd1, 0xb2, + 0x9b, 0xfe, 0xcb, 0x12, 0x4c, 0x45, 0xba, 0x18, 0x31, 0x37, 0x6e, 0xc7, 0x0a, 0x42, 0xb9, 0xc0, + 0x4d, 0x4b, 0xa4, 0xaf, 0x5a, 0x50, 0x02, 0xc4, 0xd7, 0x10, 0xe1, 0xfb, 0x77, 0xba, 0x32, 0xbc, + 0x0c, 0x33, 0xd4, 0xf0, 0x7a, 0x84, 0x2a, 0xda, 0x2e, 0x2e, 0x19, 0xd5, 0x67, 0x39, 0x9d, 0x98, + 0x14, 0x27, 0xb4, 0x17, 0x5f, 0x82, 0xe9, 0x58, 0x67, 0xa3, 0x7c, 0xcc, 0xd0, 0x58, 0xb9, 0xff, + 0xd9, 0xd2, 0xb9, 0x4f, 0x3e, 0x5b, 0x3a, 0xf7, 0xe9, 0x67, 0x4b, 0xe7, 0x7e, 0x70, 0xb8, 0xa4, + 0xdd, 0x3f, 0x5c, 0xd2, 0x3e, 0x39, 0x5c, 0xd2, 0x3e, 0x3d, 0x5c, 0xd2, 0xfe, 0x7e, 0xb8, 0xa4, + 0xfd, 0xf4, 0xf3, 0xa5, 0x73, 0xef, 0x3c, 0x76, 0xe4, 0xff, 0x6d, 0xf8, 0x77, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xf3, 0x1c, 0xa0, 0x16, 0x14, 0x31, 0x00, 0x00, } func (m *DaemonSet) Marshal() (dAtA []byte, err error) { @@ -2944,16 +2913,6 @@ func (m *NetworkPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a { size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -3302,43 +3261,6 @@ func (m *NetworkPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NetworkPolicyStatus) 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 *NetworkPolicyStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NetworkPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *ReplicaSet) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4362,8 +4284,6 @@ func (m *NetworkPolicy) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) return n } @@ -4496,21 +4416,6 @@ func (m *NetworkPolicySpec) Size() (n int) { return n } -func (m *NetworkPolicyStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - func (m *ReplicaSet) Size() (n int) { if m == nil { return 0 @@ -5098,7 +5003,6 @@ func (this *NetworkPolicy) String() string { s := strings.Join([]string{`&NetworkPolicy{`, `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "NetworkPolicySpec", "NetworkPolicySpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "NetworkPolicyStatus", "NetworkPolicyStatus", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -5208,21 +5112,6 @@ func (this *NetworkPolicySpec) String() string { }, "") return s } -func (this *NetworkPolicyStatus) String() string { - if this == nil { - return "nil" - } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&NetworkPolicyStatus{`, - `Conditions:` + repeatedStringForConditions + `,`, - `}`, - }, "") - return s -} func (this *ReplicaSet) String() string { if this == nil { return "nil" @@ -9627,39 +9516,6 @@ func (m *NetworkPolicy) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -10514,90 +10370,6 @@ func (m *NetworkPolicySpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *NetworkPolicyStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NetworkPolicyStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NetworkPolicyStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Conditions = append(m.Conditions, v1.Condition{}) - if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ReplicaSet) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/tools/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/tools/vendor/k8s.io/api/extensions/v1beta1/generated.proto index 3ab6a093b..3f2549681 100644 --- a/tools/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/tools/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -646,11 +646,6 @@ message NetworkPolicy { // Specification of the desired behavior for this NetworkPolicy. // +optional optional NetworkPolicySpec spec = 2; - - // Status is the current state of the NetworkPolicy. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional NetworkPolicyStatus status = 3; } // DEPRECATED 1.9 - This group version of NetworkPolicyEgressRule is deprecated by networking/v1/NetworkPolicyEgressRule. @@ -798,18 +793,6 @@ message NetworkPolicySpec { repeated string policyTypes = 4; } -// NetworkPolicyStatus describe the current state of the NetworkPolicy. -message NetworkPolicyStatus { - // Conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - repeated k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; -} - // DEPRECATED - This group version of ReplicaSet is deprecated by apps/v1beta2/ReplicaSet. See the release notes for // more information. // ReplicaSet ensures that a specified number of pod replicas are running at any given time. diff --git a/tools/vendor/k8s.io/api/extensions/v1beta1/types.go b/tools/vendor/k8s.io/api/extensions/v1beta1/types.go index c0ac6fa25..70b349f65 100644 --- a/tools/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/tools/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -1041,10 +1041,10 @@ type NetworkPolicy struct { // +optional Spec NetworkPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - // Status is the current state of the NetworkPolicy. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Status NetworkPolicyStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` + // Status is tombstoned to show why 3 is a reserved protobuf tag. + // This commented field should remain, so in the future if we decide to reimplement + // NetworkPolicyStatus a different protobuf name and tag SHOULD be used! + // Status NetworkPolicyStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // DEPRECATED 1.9 - This group version of PolicyType is deprecated by networking/v1/PolicyType. @@ -1207,48 +1207,6 @@ type NetworkPolicyPeer struct { IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } -// NetworkPolicyConditionType is the type for status conditions on -// a NetworkPolicy. This type should be used with the -// NetworkPolicyStatus.Conditions field. -type NetworkPolicyConditionType string - -const ( - // NetworkPolicyConditionStatusAccepted represents status of a Network Policy that could be properly parsed by - // the Network Policy provider and will be implemented in the cluster - NetworkPolicyConditionStatusAccepted NetworkPolicyConditionType = "Accepted" - - // NetworkPolicyConditionStatusPartialFailure represents status of a Network Policy that could be partially - // parsed by the Network Policy provider and may not be completely implemented due to a lack of a feature or some - // other condition - NetworkPolicyConditionStatusPartialFailure NetworkPolicyConditionType = "PartialFailure" - - // NetworkPolicyConditionStatusFailure represents status of a Network Policy that could not be parsed by the - // Network Policy provider and will not be implemented in the cluster - NetworkPolicyConditionStatusFailure NetworkPolicyConditionType = "Failure" -) - -// NetworkPolicyConditionReason defines the set of reasons that explain why a -// particular NetworkPolicy condition type has been raised. -type NetworkPolicyConditionReason string - -const ( - // NetworkPolicyConditionReasonFeatureNotSupported represents a reason where the Network Policy may not have been - // implemented in the cluster due to a lack of some feature not supported by the Network Policy provider - NetworkPolicyConditionReasonFeatureNotSupported NetworkPolicyConditionReason = "FeatureNotSupported" -) - -// NetworkPolicyStatus describe the current state of the NetworkPolicy. -type NetworkPolicyStatus struct { - // Conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` -} - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.3 // +k8s:prerelease-lifecycle-gen:deprecated=1.9 diff --git a/tools/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 39aaf4853..408022c9d 100644 --- a/tools/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -338,7 +338,6 @@ var map_NetworkPolicy = map[string]string{ "": "DEPRECATED 1.9 - This group version of NetworkPolicy is deprecated by networking/v1/NetworkPolicy. NetworkPolicy describes what network traffic is allowed for a set of Pods", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "spec": "Specification of the desired behavior for this NetworkPolicy.", - "status": "Status is the current state of the NetworkPolicy. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", } func (NetworkPolicy) SwaggerDoc() map[string]string { @@ -409,15 +408,6 @@ func (NetworkPolicySpec) SwaggerDoc() map[string]string { return map_NetworkPolicySpec } -var map_NetworkPolicyStatus = map[string]string{ - "": "NetworkPolicyStatus describe the current state of the NetworkPolicy.", - "conditions": "Conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. Current service state", -} - -func (NetworkPolicyStatus) SwaggerDoc() map[string]string { - return map_NetworkPolicyStatus -} - var map_ReplicaSet = map[string]string{ "": "DEPRECATED - This group version of ReplicaSet is deprecated by apps/v1beta2/ReplicaSet. See the release notes for more information. ReplicaSet ensures that a specified number of pod replicas are running at any given time.", "metadata": "If the Labels of a ReplicaSet are empty, they are defaulted to be the same as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", diff --git a/tools/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index b6e927299..6b474ae48 100644 --- a/tools/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -725,7 +725,6 @@ func (in *NetworkPolicy) DeepCopyInto(out *NetworkPolicy) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) return } @@ -938,29 +937,6 @@ func (in *NetworkPolicySpec) DeepCopy() *NetworkPolicySpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkPolicyStatus) DeepCopyInto(out *NetworkPolicyStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPolicyStatus. -func (in *NetworkPolicyStatus) DeepCopy() *NetworkPolicyStatus { - if in == nil { - return nil - } - out := new(NetworkPolicyStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ReplicaSet) DeepCopyInto(out *ReplicaSet) { *out = *in diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go index cf5fc5600..b54e1ceef 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go @@ -43,10 +43,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ExemptPriorityLevelConfiguration) Reset() { *m = ExemptPriorityLevelConfiguration{} } +func (*ExemptPriorityLevelConfiguration) ProtoMessage() {} +func (*ExemptPriorityLevelConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_45ba024d525b289b, []int{0} +} +func (m *ExemptPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExemptPriorityLevelConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExemptPriorityLevelConfiguration.Merge(m, src) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ExemptPriorityLevelConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ExemptPriorityLevelConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ExemptPriorityLevelConfiguration proto.InternalMessageInfo + func (m *FlowDistinguisherMethod) Reset() { *m = FlowDistinguisherMethod{} } func (*FlowDistinguisherMethod) ProtoMessage() {} func (*FlowDistinguisherMethod) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{0} + return fileDescriptor_45ba024d525b289b, []int{1} } func (m *FlowDistinguisherMethod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +102,7 @@ var xxx_messageInfo_FlowDistinguisherMethod proto.InternalMessageInfo func (m *FlowSchema) Reset() { *m = FlowSchema{} } func (*FlowSchema) ProtoMessage() {} func (*FlowSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{1} + return fileDescriptor_45ba024d525b289b, []int{2} } func (m *FlowSchema) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +130,7 @@ var xxx_messageInfo_FlowSchema proto.InternalMessageInfo func (m *FlowSchemaCondition) Reset() { *m = FlowSchemaCondition{} } func (*FlowSchemaCondition) ProtoMessage() {} func (*FlowSchemaCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{2} + return fileDescriptor_45ba024d525b289b, []int{3} } func (m *FlowSchemaCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +158,7 @@ var xxx_messageInfo_FlowSchemaCondition proto.InternalMessageInfo func (m *FlowSchemaList) Reset() { *m = FlowSchemaList{} } func (*FlowSchemaList) ProtoMessage() {} func (*FlowSchemaList) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{3} + return fileDescriptor_45ba024d525b289b, []int{4} } func (m *FlowSchemaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +186,7 @@ var xxx_messageInfo_FlowSchemaList proto.InternalMessageInfo func (m *FlowSchemaSpec) Reset() { *m = FlowSchemaSpec{} } func (*FlowSchemaSpec) ProtoMessage() {} func (*FlowSchemaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{4} + return fileDescriptor_45ba024d525b289b, []int{5} } func (m *FlowSchemaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +214,7 @@ var xxx_messageInfo_FlowSchemaSpec proto.InternalMessageInfo func (m *FlowSchemaStatus) Reset() { *m = FlowSchemaStatus{} } func (*FlowSchemaStatus) ProtoMessage() {} func (*FlowSchemaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{5} + return fileDescriptor_45ba024d525b289b, []int{6} } func (m *FlowSchemaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +242,7 @@ var xxx_messageInfo_FlowSchemaStatus proto.InternalMessageInfo func (m *GroupSubject) Reset() { *m = GroupSubject{} } func (*GroupSubject) ProtoMessage() {} func (*GroupSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{6} + return fileDescriptor_45ba024d525b289b, []int{7} } func (m *GroupSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +270,7 @@ var xxx_messageInfo_GroupSubject proto.InternalMessageInfo func (m *LimitResponse) Reset() { *m = LimitResponse{} } func (*LimitResponse) ProtoMessage() {} func (*LimitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{7} + return fileDescriptor_45ba024d525b289b, []int{8} } func (m *LimitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +298,7 @@ var xxx_messageInfo_LimitResponse proto.InternalMessageInfo func (m *LimitedPriorityLevelConfiguration) Reset() { *m = LimitedPriorityLevelConfiguration{} } func (*LimitedPriorityLevelConfiguration) ProtoMessage() {} func (*LimitedPriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{8} + return fileDescriptor_45ba024d525b289b, []int{9} } func (m *LimitedPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +326,7 @@ var xxx_messageInfo_LimitedPriorityLevelConfiguration proto.InternalMessageInfo func (m *NonResourcePolicyRule) Reset() { *m = NonResourcePolicyRule{} } func (*NonResourcePolicyRule) ProtoMessage() {} func (*NonResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{9} + return fileDescriptor_45ba024d525b289b, []int{10} } func (m *NonResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +354,7 @@ var xxx_messageInfo_NonResourcePolicyRule proto.InternalMessageInfo func (m *PolicyRulesWithSubjects) Reset() { *m = PolicyRulesWithSubjects{} } func (*PolicyRulesWithSubjects) ProtoMessage() {} func (*PolicyRulesWithSubjects) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{10} + return fileDescriptor_45ba024d525b289b, []int{11} } func (m *PolicyRulesWithSubjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +382,7 @@ var xxx_messageInfo_PolicyRulesWithSubjects proto.InternalMessageInfo func (m *PriorityLevelConfiguration) Reset() { *m = PriorityLevelConfiguration{} } func (*PriorityLevelConfiguration) ProtoMessage() {} func (*PriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{11} + return fileDescriptor_45ba024d525b289b, []int{12} } func (m *PriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +410,7 @@ var xxx_messageInfo_PriorityLevelConfiguration proto.InternalMessageInfo func (m *PriorityLevelConfigurationCondition) Reset() { *m = PriorityLevelConfigurationCondition{} } func (*PriorityLevelConfigurationCondition) ProtoMessage() {} func (*PriorityLevelConfigurationCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{12} + return fileDescriptor_45ba024d525b289b, []int{13} } func (m *PriorityLevelConfigurationCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +438,7 @@ var xxx_messageInfo_PriorityLevelConfigurationCondition proto.InternalMessageInf func (m *PriorityLevelConfigurationList) Reset() { *m = PriorityLevelConfigurationList{} } func (*PriorityLevelConfigurationList) ProtoMessage() {} func (*PriorityLevelConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{13} + return fileDescriptor_45ba024d525b289b, []int{14} } func (m *PriorityLevelConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +466,7 @@ var xxx_messageInfo_PriorityLevelConfigurationList proto.InternalMessageInfo func (m *PriorityLevelConfigurationReference) Reset() { *m = PriorityLevelConfigurationReference{} } func (*PriorityLevelConfigurationReference) ProtoMessage() {} func (*PriorityLevelConfigurationReference) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{14} + return fileDescriptor_45ba024d525b289b, []int{15} } func (m *PriorityLevelConfigurationReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +494,7 @@ var xxx_messageInfo_PriorityLevelConfigurationReference proto.InternalMessageInf func (m *PriorityLevelConfigurationSpec) Reset() { *m = PriorityLevelConfigurationSpec{} } func (*PriorityLevelConfigurationSpec) ProtoMessage() {} func (*PriorityLevelConfigurationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{15} + return fileDescriptor_45ba024d525b289b, []int{16} } func (m *PriorityLevelConfigurationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +522,7 @@ var xxx_messageInfo_PriorityLevelConfigurationSpec proto.InternalMessageInfo func (m *PriorityLevelConfigurationStatus) Reset() { *m = PriorityLevelConfigurationStatus{} } func (*PriorityLevelConfigurationStatus) ProtoMessage() {} func (*PriorityLevelConfigurationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{16} + return fileDescriptor_45ba024d525b289b, []int{17} } func (m *PriorityLevelConfigurationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +550,7 @@ var xxx_messageInfo_PriorityLevelConfigurationStatus proto.InternalMessageInfo func (m *QueuingConfiguration) Reset() { *m = QueuingConfiguration{} } func (*QueuingConfiguration) ProtoMessage() {} func (*QueuingConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{17} + return fileDescriptor_45ba024d525b289b, []int{18} } func (m *QueuingConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +578,7 @@ var xxx_messageInfo_QueuingConfiguration proto.InternalMessageInfo func (m *ResourcePolicyRule) Reset() { *m = ResourcePolicyRule{} } func (*ResourcePolicyRule) ProtoMessage() {} func (*ResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{18} + return fileDescriptor_45ba024d525b289b, []int{19} } func (m *ResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +606,7 @@ var xxx_messageInfo_ResourcePolicyRule proto.InternalMessageInfo func (m *ServiceAccountSubject) Reset() { *m = ServiceAccountSubject{} } func (*ServiceAccountSubject) ProtoMessage() {} func (*ServiceAccountSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{19} + return fileDescriptor_45ba024d525b289b, []int{20} } func (m *ServiceAccountSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +634,7 @@ var xxx_messageInfo_ServiceAccountSubject proto.InternalMessageInfo func (m *Subject) Reset() { *m = Subject{} } func (*Subject) ProtoMessage() {} func (*Subject) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{20} + return fileDescriptor_45ba024d525b289b, []int{21} } func (m *Subject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +662,7 @@ var xxx_messageInfo_Subject proto.InternalMessageInfo func (m *UserSubject) Reset() { *m = UserSubject{} } func (*UserSubject) ProtoMessage() {} func (*UserSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_45ba024d525b289b, []int{21} + return fileDescriptor_45ba024d525b289b, []int{22} } func (m *UserSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -660,6 +688,7 @@ func (m *UserSubject) XXX_DiscardUnknown() { var xxx_messageInfo_UserSubject proto.InternalMessageInfo func init() { + proto.RegisterType((*ExemptPriorityLevelConfiguration)(nil), "k8s.io.api.flowcontrol.v1alpha1.ExemptPriorityLevelConfiguration") proto.RegisterType((*FlowDistinguisherMethod)(nil), "k8s.io.api.flowcontrol.v1alpha1.FlowDistinguisherMethod") proto.RegisterType((*FlowSchema)(nil), "k8s.io.api.flowcontrol.v1alpha1.FlowSchema") proto.RegisterType((*FlowSchemaCondition)(nil), "k8s.io.api.flowcontrol.v1alpha1.FlowSchemaCondition") @@ -689,105 +718,142 @@ func init() { } var fileDescriptor_45ba024d525b289b = []byte{ - // 1554 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0x13, 0xc7, - 0x1b, 0xcf, 0x3a, 0x76, 0x12, 0x4f, 0x5e, 0x99, 0x10, 0xc5, 0xff, 0x20, 0xd9, 0x61, 0xff, 0x52, - 0xa1, 0x05, 0x76, 0x09, 0x05, 0x4a, 0x85, 0x2a, 0x94, 0x0d, 0x94, 0xb7, 0x24, 0x24, 0x13, 0xa0, - 0x2a, 0xa2, 0x12, 0x9b, 0xf5, 0xc4, 0x1e, 0x62, 0xef, 0x6e, 0x67, 0x76, 0x9d, 0xa6, 0xe2, 0x50, - 0xa9, 0x5f, 0xa0, 0x1f, 0x80, 0x63, 0x0f, 0x3d, 0xf7, 0x13, 0xf4, 0x18, 0x55, 0x3d, 0x70, 0xe4, - 0x64, 0x11, 0xf7, 0xda, 0x0f, 0xd0, 0x72, 0xa8, 0xaa, 0x99, 0x9d, 0xdd, 0xf5, 0xfa, 0x25, 0x6b, - 0x1a, 0x89, 0x53, 0x6f, 0xd9, 0xe7, 0xe5, 0xf7, 0xbc, 0xcc, 0xf3, 0xe6, 0x80, 0x3b, 0xbb, 0xd7, - 0x98, 0x46, 0x1c, 0x7d, 0xd7, 0xdf, 0xc6, 0xd4, 0xc6, 0x1e, 0x66, 0x7a, 0x03, 0xdb, 0x65, 0x87, - 0xea, 0x92, 0x61, 0xba, 0x44, 0xdf, 0xa9, 0x39, 0x7b, 0x96, 0x63, 0x7b, 0xd4, 0xa9, 0xe9, 0x8d, - 0x25, 0xb3, 0xe6, 0x56, 0xcd, 0x25, 0xbd, 0x82, 0x6d, 0x4c, 0x4d, 0x0f, 0x97, 0x35, 0x97, 0x3a, - 0x9e, 0x03, 0x4b, 0x81, 0x82, 0x66, 0xba, 0x44, 0x6b, 0x53, 0xd0, 0x42, 0x85, 0x85, 0x0b, 0x15, - 0xe2, 0x55, 0xfd, 0x6d, 0xcd, 0x72, 0xea, 0x7a, 0xc5, 0xa9, 0x38, 0xba, 0xd0, 0xdb, 0xf6, 0x77, - 0xc4, 0x97, 0xf8, 0x10, 0x7f, 0x05, 0x78, 0x0b, 0x97, 0x63, 0x07, 0xea, 0xa6, 0x55, 0x25, 0x36, - 0xa6, 0xfb, 0xba, 0xbb, 0x5b, 0xe1, 0x04, 0xa6, 0xd7, 0xb1, 0x67, 0xea, 0x8d, 0x2e, 0x2f, 0x16, - 0xf4, 0x7e, 0x5a, 0xd4, 0xb7, 0x3d, 0x52, 0xc7, 0x5d, 0x0a, 0x57, 0xd3, 0x14, 0x98, 0x55, 0xc5, - 0x75, 0xb3, 0x53, 0x4f, 0x7d, 0x02, 0xe6, 0x3f, 0xaf, 0x39, 0x7b, 0x37, 0x09, 0xf3, 0x88, 0x5d, - 0xf1, 0x09, 0xab, 0x62, 0xba, 0x86, 0xbd, 0xaa, 0x53, 0x86, 0x37, 0x40, 0xd6, 0xdb, 0x77, 0x71, - 0x41, 0x59, 0x54, 0xce, 0xe6, 0x8d, 0x73, 0x07, 0xcd, 0xd2, 0x50, 0xab, 0x59, 0xca, 0x3e, 0xdc, - 0x77, 0xf1, 0xdb, 0x66, 0xe9, 0x54, 0x1f, 0x35, 0xce, 0x46, 0x42, 0x51, 0x7d, 0x99, 0x01, 0x80, - 0x4b, 0x6d, 0x09, 0xd3, 0xf0, 0x19, 0x18, 0xe3, 0xe1, 0x96, 0x4d, 0xcf, 0x14, 0x98, 0xe3, 0x97, - 0x2e, 0x6a, 0x71, 0xb2, 0x23, 0xaf, 0x35, 0x77, 0xb7, 0xc2, 0x09, 0x4c, 0xe3, 0xd2, 0x5a, 0x63, - 0x49, 0x7b, 0xb0, 0xfd, 0x1c, 0x5b, 0xde, 0x1a, 0xf6, 0x4c, 0x03, 0x4a, 0x2f, 0x40, 0x4c, 0x43, - 0x11, 0x2a, 0xdc, 0x04, 0x59, 0xe6, 0x62, 0xab, 0x90, 0x11, 0xe8, 0xba, 0x96, 0xf2, 0x94, 0x5a, - 0xec, 0xdc, 0x96, 0x8b, 0x2d, 0x63, 0x22, 0x0c, 0x91, 0x7f, 0x21, 0x01, 0x05, 0xbf, 0x04, 0x23, - 0xcc, 0x33, 0x3d, 0x9f, 0x15, 0x86, 0x05, 0xe8, 0xd2, 0xbb, 0x80, 0x0a, 0x45, 0x63, 0x4a, 0xc2, - 0x8e, 0x04, 0xdf, 0x48, 0x02, 0xaa, 0xaf, 0x33, 0x60, 0x36, 0x16, 0x5e, 0x71, 0xec, 0x32, 0xf1, - 0x88, 0x63, 0xc3, 0xeb, 0x89, 0xbc, 0x9f, 0xe9, 0xc8, 0xfb, 0x7c, 0x0f, 0x95, 0x38, 0xe7, 0xf0, - 0xd3, 0xc8, 0xdf, 0x8c, 0x50, 0x3f, 0x9d, 0x34, 0xfe, 0xb6, 0x59, 0x9a, 0x8e, 0xd4, 0x92, 0xfe, - 0xc0, 0x06, 0x80, 0x35, 0x93, 0x79, 0x0f, 0xa9, 0x69, 0xb3, 0x00, 0x96, 0xd4, 0xb1, 0x0c, 0xfb, - 0xa3, 0xc1, 0x5e, 0x8a, 0x6b, 0x18, 0x0b, 0xd2, 0x24, 0x5c, 0xed, 0x42, 0x43, 0x3d, 0x2c, 0xc0, - 0x0f, 0xc0, 0x08, 0xc5, 0x26, 0x73, 0xec, 0x42, 0x56, 0xb8, 0x1c, 0xe5, 0x0b, 0x09, 0x2a, 0x92, - 0x5c, 0xf8, 0x21, 0x18, 0xad, 0x63, 0xc6, 0xcc, 0x0a, 0x2e, 0xe4, 0x84, 0xe0, 0xb4, 0x14, 0x1c, - 0x5d, 0x0b, 0xc8, 0x28, 0xe4, 0xab, 0xbf, 0x28, 0x60, 0x2a, 0xce, 0xd3, 0x2a, 0x61, 0x1e, 0x7c, - 0xda, 0x55, 0x7d, 0xda, 0x60, 0x31, 0x71, 0x6d, 0x51, 0x7b, 0x33, 0xd2, 0xdc, 0x58, 0x48, 0x69, - 0xab, 0xbc, 0x0d, 0x90, 0x23, 0x1e, 0xae, 0xf3, 0xac, 0x0f, 0x9f, 0x1d, 0xbf, 0x74, 0xee, 0x1d, - 0xaa, 0xc4, 0x98, 0x94, 0xb8, 0xb9, 0xbb, 0x1c, 0x01, 0x05, 0x40, 0xea, 0x1f, 0xc3, 0xed, 0x21, - 0xf0, 0x8a, 0x84, 0x3f, 0x29, 0x60, 0xc1, 0xa5, 0xc4, 0xa1, 0xc4, 0xdb, 0x5f, 0xc5, 0x0d, 0x5c, - 0x5b, 0x71, 0xec, 0x1d, 0x52, 0xf1, 0xa9, 0xc9, 0x73, 0x29, 0xa3, 0xba, 0x99, 0x6a, 0x7a, 0xa3, - 0x2f, 0x04, 0xc2, 0x3b, 0x98, 0x62, 0xdb, 0xc2, 0x86, 0x2a, 0x7d, 0x5a, 0x38, 0x42, 0xf8, 0x08, - 0x5f, 0xe0, 0x3d, 0x00, 0xeb, 0xa6, 0xc7, 0x73, 0x5a, 0xd9, 0xa0, 0xd8, 0xc2, 0x65, 0x8e, 0x2a, - 0x4a, 0x32, 0x17, 0xd7, 0xc7, 0x5a, 0x97, 0x04, 0xea, 0xa1, 0x05, 0xbf, 0x57, 0xc0, 0x6c, 0xb9, - 0x7b, 0xd0, 0xc8, 0xca, 0xbc, 0x36, 0x50, 0xaa, 0x7b, 0x0c, 0x2a, 0x63, 0xbe, 0xd5, 0x2c, 0xcd, - 0xf6, 0x60, 0xa0, 0x5e, 0xd6, 0xe0, 0x57, 0x20, 0x47, 0xfd, 0x1a, 0x66, 0x85, 0xac, 0x78, 0xe1, - 0x74, 0xb3, 0x1b, 0x4e, 0x8d, 0x58, 0xfb, 0x88, 0xeb, 0x7c, 0x41, 0xbc, 0xea, 0x96, 0x2f, 0x26, - 0x16, 0x8b, 0x9f, 0x5b, 0xb0, 0x50, 0x80, 0xaa, 0xbe, 0x00, 0x33, 0x9d, 0x83, 0x03, 0x56, 0x01, - 0xb0, 0xc2, 0x5e, 0x65, 0x05, 0x45, 0xd8, 0xbd, 0xfc, 0x0e, 0x95, 0x15, 0x35, 0x7a, 0x3c, 0x36, - 0x23, 0x12, 0x43, 0x6d, 0xd8, 0xea, 0x45, 0x30, 0x71, 0x9b, 0x3a, 0xbe, 0x2b, 0x9d, 0x84, 0x8b, - 0x20, 0x6b, 0x9b, 0xf5, 0x70, 0x04, 0x45, 0x73, 0x71, 0xdd, 0xac, 0x63, 0x24, 0x38, 0xea, 0x8f, - 0x0a, 0x98, 0x5c, 0x25, 0x75, 0xe2, 0x21, 0xcc, 0x5c, 0xc7, 0x66, 0x18, 0x5e, 0x49, 0x8c, 0xad, - 0xd3, 0x1d, 0x63, 0xeb, 0x44, 0x42, 0xb8, 0x6d, 0x60, 0x3d, 0x05, 0xa3, 0x5f, 0xfb, 0xd8, 0x27, - 0x76, 0x45, 0x8e, 0xed, 0x2b, 0xa9, 0x11, 0x6e, 0x06, 0xf2, 0x89, 0x8a, 0x33, 0xc6, 0xf9, 0x20, - 0x90, 0x1c, 0x14, 0x42, 0xaa, 0x7f, 0x67, 0xc0, 0x69, 0x61, 0x19, 0x97, 0xfb, 0x57, 0x32, 0x7c, - 0x0a, 0x0a, 0x26, 0x63, 0x3e, 0xc5, 0xe5, 0x15, 0xc7, 0xb6, 0x7c, 0xca, 0x7b, 0x60, 0x7f, 0xab, - 0x6a, 0x52, 0xcc, 0x44, 0x38, 0x39, 0x63, 0x51, 0x86, 0x53, 0x58, 0xee, 0x23, 0x87, 0xfa, 0x22, - 0xc0, 0x5d, 0x30, 0x59, 0x6b, 0x0f, 0x5e, 0xc6, 0xa9, 0xa5, 0xc6, 0x99, 0x48, 0x99, 0x31, 0x27, - 0x5d, 0x48, 0xa6, 0x1d, 0x25, 0xb1, 0xe1, 0x67, 0x60, 0xba, 0x86, 0xed, 0xb2, 0xb9, 0x5d, 0xc3, - 0x1b, 0x98, 0x5a, 0xd8, 0xf6, 0x44, 0x9f, 0xe4, 0x8c, 0xd9, 0x56, 0xb3, 0x34, 0xbd, 0x9a, 0x64, - 0xa1, 0x4e, 0x59, 0xf8, 0x00, 0xcc, 0x6d, 0x3b, 0x94, 0x3a, 0x7b, 0xc4, 0xae, 0x08, 0x3b, 0x21, - 0x48, 0x56, 0x80, 0xfc, 0xaf, 0xd5, 0x2c, 0xcd, 0x19, 0xbd, 0x04, 0x50, 0x6f, 0x3d, 0x75, 0x0f, - 0xcc, 0xad, 0xf3, 0xc1, 0xc2, 0x1c, 0x9f, 0x5a, 0x38, 0xee, 0x09, 0x58, 0x02, 0xb9, 0x06, 0xa6, - 0xdb, 0x41, 0x5d, 0xe7, 0x8d, 0x3c, 0xef, 0x88, 0xc7, 0x9c, 0x80, 0x02, 0x3a, 0x8f, 0xc4, 0x8e, - 0x35, 0x1f, 0xa1, 0x55, 0x56, 0x18, 0x11, 0xa2, 0x22, 0x92, 0xf5, 0x24, 0x0b, 0x75, 0xca, 0xaa, - 0x87, 0x19, 0x30, 0xdf, 0xa7, 0x05, 0xe1, 0x63, 0x30, 0xc6, 0xe4, 0xdf, 0xb2, 0xad, 0xce, 0xa6, - 0x3e, 0x86, 0x54, 0x8e, 0xb7, 0x40, 0x88, 0x86, 0x22, 0x2c, 0xe8, 0x82, 0x49, 0x2a, 0x7d, 0x10, - 0x46, 0xe5, 0x36, 0xf8, 0x38, 0x15, 0xbc, 0x3b, 0x3f, 0xf1, 0x73, 0xa3, 0x76, 0x44, 0x94, 0x34, - 0x00, 0x5f, 0x80, 0x99, 0xb6, 0xc0, 0x03, 0xa3, 0xc3, 0xc2, 0xe8, 0xd5, 0x54, 0xa3, 0x3d, 0xdf, - 0xc5, 0x28, 0x48, 0xbb, 0x33, 0xeb, 0x1d, 0xb8, 0xa8, 0xcb, 0x92, 0xfa, 0x5b, 0x06, 0x1c, 0xb1, - 0x20, 0xde, 0xc3, 0xc1, 0x67, 0x26, 0x0e, 0xbe, 0x1b, 0xc7, 0x58, 0x7d, 0x7d, 0x0f, 0x40, 0xd2, - 0x71, 0x00, 0x2e, 0x1f, 0xc7, 0xc8, 0xd1, 0x07, 0xe1, 0x9f, 0x19, 0xf0, 0xff, 0xfe, 0xca, 0xf1, - 0x81, 0x78, 0x3f, 0x31, 0x69, 0x3f, 0xe9, 0x98, 0xb4, 0x67, 0x06, 0x80, 0xf8, 0xef, 0x60, 0xec, - 0x38, 0x18, 0xdf, 0x28, 0xa0, 0xd8, 0x3f, 0x6f, 0xef, 0xe1, 0x80, 0x7c, 0x96, 0x3c, 0x20, 0xaf, - 0x1f, 0xa3, 0xca, 0xfa, 0x1c, 0x94, 0xb7, 0x8f, 0x2a, 0xae, 0xe8, 0xf2, 0x1b, 0x60, 0xf5, 0x1f, - 0x1c, 0x99, 0x2b, 0x71, 0xa9, 0xa6, 0xfc, 0x84, 0x49, 0x68, 0xdf, 0xb2, 0xf9, 0x02, 0xaa, 0xf3, - 0x1d, 0x12, 0x54, 0x24, 0x01, 0xa3, 0xb5, 0x60, 0x65, 0xcb, 0xbe, 0x36, 0x06, 0xdb, 0x94, 0x47, - 0xad, 0xf8, 0xe0, 0x3c, 0x90, 0x62, 0x28, 0xc4, 0x57, 0x5f, 0x2a, 0x60, 0x31, 0xad, 0x5d, 0xe1, - 0x37, 0x3d, 0xce, 0xb0, 0xe3, 0x5c, 0xd9, 0x83, 0x9f, 0x65, 0x3f, 0x2b, 0xe0, 0x64, 0xaf, 0x63, - 0x87, 0x77, 0x00, 0xbf, 0x70, 0xa2, 0xf3, 0x24, 0xea, 0x80, 0x4d, 0x41, 0x45, 0x92, 0x0b, 0xcf, - 0x83, 0xb1, 0xaa, 0x69, 0x97, 0xb7, 0xc8, 0xb7, 0xe1, 0xf1, 0x1d, 0xd5, 0xe0, 0x1d, 0x49, 0x47, - 0x91, 0x04, 0xbc, 0x09, 0x66, 0x84, 0xde, 0x2a, 0xb6, 0x2b, 0x5e, 0x55, 0x24, 0x4b, 0x1e, 0x0f, - 0xd1, 0x52, 0xd8, 0xec, 0xe0, 0xa3, 0x2e, 0x0d, 0xf5, 0x2f, 0x05, 0xc0, 0x7f, 0xb3, 0xef, 0xcf, - 0x81, 0xbc, 0xe9, 0x12, 0x71, 0x86, 0x06, 0x5d, 0x90, 0x37, 0x26, 0x5b, 0xcd, 0x52, 0x7e, 0x79, - 0xe3, 0x6e, 0x40, 0x44, 0x31, 0x9f, 0x0b, 0x87, 0x8b, 0x30, 0x58, 0x78, 0x52, 0x38, 0x34, 0xcc, - 0x50, 0xcc, 0x87, 0xd7, 0xc0, 0x84, 0x55, 0xf3, 0x99, 0x87, 0xe9, 0x96, 0xe5, 0xb8, 0x58, 0x4c, - 0x8d, 0x31, 0xe3, 0xa4, 0x8c, 0x69, 0x62, 0xa5, 0x8d, 0x87, 0x12, 0x92, 0x50, 0x03, 0x80, 0x97, - 0x3c, 0x73, 0x4d, 0x6e, 0x27, 0x27, 0xec, 0x4c, 0xf1, 0x07, 0x5b, 0x8f, 0xa8, 0xa8, 0x4d, 0x42, - 0x7d, 0x0e, 0xe6, 0xb6, 0x30, 0x6d, 0x10, 0x0b, 0x2f, 0x5b, 0x96, 0xe3, 0xdb, 0x5e, 0x78, 0x50, - 0xeb, 0x20, 0x1f, 0x89, 0xc9, 0xae, 0x38, 0x21, 0xed, 0xe7, 0x23, 0x2c, 0x14, 0xcb, 0x44, 0x6d, - 0x98, 0xe9, 0xdb, 0x86, 0xbf, 0x66, 0xc0, 0x68, 0x0c, 0x9f, 0xdd, 0x25, 0x76, 0x59, 0x22, 0x9f, - 0x0a, 0xa5, 0xef, 0x13, 0xbb, 0xfc, 0xb6, 0x59, 0x1a, 0x97, 0x62, 0xfc, 0x13, 0x09, 0x41, 0x78, - 0x0f, 0x64, 0x7d, 0x86, 0xa9, 0x6c, 0xb0, 0xf3, 0xa9, 0xd5, 0xfc, 0x88, 0x61, 0x1a, 0x5e, 0x40, - 0x63, 0x1c, 0x9a, 0x13, 0x90, 0xc0, 0x80, 0xeb, 0x20, 0x57, 0xe1, 0xaf, 0x22, 0x27, 0xff, 0x85, - 0x54, 0xb0, 0xf6, 0x9f, 0x1a, 0x41, 0x21, 0x08, 0x0a, 0x0a, 0x60, 0x20, 0x05, 0x53, 0x2c, 0x91, - 0x44, 0xf1, 0x60, 0x83, 0x5c, 0x34, 0x3d, 0x73, 0x6f, 0xc0, 0x56, 0xb3, 0x34, 0x95, 0x64, 0xa1, - 0x0e, 0x0b, 0xaa, 0x0e, 0xc6, 0xdb, 0x42, 0x4c, 0x1f, 0x82, 0xc6, 0xad, 0x83, 0xc3, 0xe2, 0xd0, - 0xab, 0xc3, 0xe2, 0xd0, 0xeb, 0xc3, 0xe2, 0xd0, 0x77, 0xad, 0xa2, 0x72, 0xd0, 0x2a, 0x2a, 0xaf, - 0x5a, 0x45, 0xe5, 0x75, 0xab, 0xa8, 0xbc, 0x69, 0x15, 0x95, 0x1f, 0x7e, 0x2f, 0x0e, 0x3d, 0x29, - 0xa5, 0xfc, 0xf7, 0xf1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x48, 0x2e, 0x29, 0x16, 0xb8, 0x14, - 0x00, 0x00, + // 1621 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0xdb, 0x46, + 0x1a, 0x36, 0x65, 0xc9, 0xb6, 0xc6, 0x9f, 0x19, 0xc7, 0xb0, 0xd6, 0x59, 0x48, 0x0e, 0x17, 0xd8, + 0x64, 0x37, 0x09, 0x15, 0x67, 0x93, 0x6c, 0x16, 0xc1, 0x22, 0x30, 0x93, 0x6c, 0xbe, 0x6c, 0xc7, + 0x1e, 0x27, 0xd9, 0x36, 0x48, 0x81, 0xd0, 0xd4, 0x58, 0x9a, 0x58, 0x22, 0xd9, 0x19, 0x52, 0x8e, + 0x8b, 0x1c, 0x0a, 0xf4, 0x0f, 0xf4, 0x07, 0xe4, 0xd8, 0x43, 0x6f, 0x05, 0x7a, 0xed, 0xa5, 0xc7, + 0xa0, 0xe8, 0x21, 0xc7, 0x9c, 0x84, 0x58, 0xbd, 0xf6, 0x07, 0xb4, 0x39, 0x14, 0xc5, 0x0c, 0x87, + 0xa4, 0x28, 0x89, 0xa2, 0x52, 0x03, 0x39, 0xf5, 0x66, 0xbe, 0x1f, 0xcf, 0x3b, 0xf3, 0xce, 0xfb, + 0xf1, 0xc8, 0xe0, 0xf6, 0xde, 0x15, 0xa6, 0x11, 0xbb, 0xbc, 0xe7, 0xed, 0x60, 0x6a, 0x61, 0x17, + 0xb3, 0x72, 0x13, 0x5b, 0x15, 0x9b, 0x96, 0xa5, 0xc2, 0x70, 0x48, 0x79, 0xb7, 0x6e, 0xef, 0x9b, + 0xb6, 0xe5, 0x52, 0xbb, 0x5e, 0x6e, 0xae, 0x18, 0x75, 0xa7, 0x66, 0xac, 0x94, 0xab, 0xd8, 0xc2, + 0xd4, 0x70, 0x71, 0x45, 0x73, 0xa8, 0xed, 0xda, 0xb0, 0xe4, 0x3b, 0x68, 0x86, 0x43, 0xb4, 0x0e, + 0x07, 0x2d, 0x70, 0x58, 0x3a, 0x57, 0x25, 0x6e, 0xcd, 0xdb, 0xd1, 0x4c, 0xbb, 0x51, 0xae, 0xda, + 0x55, 0xbb, 0x2c, 0xfc, 0x76, 0xbc, 0x5d, 0xf1, 0x25, 0x3e, 0xc4, 0x5f, 0x3e, 0xde, 0xd2, 0xc5, + 0xe8, 0x00, 0x0d, 0xc3, 0xac, 0x11, 0x0b, 0xd3, 0x83, 0xb2, 0xb3, 0x57, 0xe5, 0x02, 0x56, 0x6e, + 0x60, 0xd7, 0x28, 0x37, 0x7b, 0x4e, 0xb1, 0x54, 0x4e, 0xf2, 0xa2, 0x9e, 0xe5, 0x92, 0x06, 0xee, + 0x71, 0xb8, 0x9c, 0xe6, 0xc0, 0xcc, 0x1a, 0x6e, 0x18, 0xdd, 0x7e, 0xea, 0x77, 0x0a, 0x58, 0xbe, + 0xf9, 0x1c, 0x37, 0x1c, 0x77, 0x93, 0x12, 0x9b, 0x12, 0xf7, 0x60, 0x0d, 0x37, 0x71, 0xfd, 0xba, + 0x6d, 0xed, 0x92, 0xaa, 0x47, 0x0d, 0x97, 0xd8, 0x16, 0xfc, 0x08, 0x14, 0x2c, 0xbb, 0x41, 0x2c, + 0x83, 0xcb, 0x4d, 0x8f, 0x52, 0x6c, 0x99, 0x07, 0xdb, 0x35, 0x83, 0x62, 0x56, 0x50, 0x96, 0x95, + 0xd3, 0x39, 0xfd, 0xaf, 0xed, 0x56, 0xa9, 0xb0, 0x91, 0x60, 0x83, 0x12, 0xbd, 0xe1, 0x7f, 0xc1, + 0x6c, 0x1d, 0x5b, 0x15, 0x63, 0xa7, 0x8e, 0x37, 0x31, 0x35, 0xb1, 0xe5, 0x16, 0x32, 0x02, 0x70, + 0xbe, 0xdd, 0x2a, 0xcd, 0xae, 0xc5, 0x55, 0xa8, 0xdb, 0x56, 0x7d, 0x0c, 0x16, 0xff, 0x57, 0xb7, + 0xf7, 0x6f, 0x10, 0xe6, 0x12, 0xab, 0xea, 0x11, 0x56, 0xc3, 0x74, 0x1d, 0xbb, 0x35, 0xbb, 0x02, + 0xaf, 0x81, 0xac, 0x7b, 0xe0, 0x60, 0x71, 0xbe, 0xbc, 0x7e, 0xe6, 0x55, 0xab, 0x34, 0xd2, 0x6e, + 0x95, 0xb2, 0x0f, 0x0e, 0x1c, 0xfc, 0xae, 0x55, 0x3a, 0x91, 0xe0, 0xc6, 0xd5, 0x48, 0x38, 0xaa, + 0x2f, 0x33, 0x00, 0x70, 0xab, 0x6d, 0x91, 0x38, 0xf8, 0x14, 0x4c, 0xf0, 0xc7, 0xaa, 0x18, 0xae, + 0x21, 0x30, 0x27, 0x2f, 0x9c, 0xd7, 0xa2, 0x52, 0x09, 0x73, 0xae, 0x39, 0x7b, 0x55, 0x2e, 0x60, + 0x1a, 0xb7, 0xd6, 0x9a, 0x2b, 0xda, 0xfd, 0x9d, 0x67, 0xd8, 0x74, 0xd7, 0xb1, 0x6b, 0xe8, 0x50, + 0x9e, 0x02, 0x44, 0x32, 0x14, 0xa2, 0xc2, 0x2d, 0x90, 0x65, 0x0e, 0x36, 0x45, 0x02, 0x26, 0x2f, + 0x94, 0xb5, 0x94, 0x42, 0xd4, 0xa2, 0xc3, 0x6d, 0x3b, 0xd8, 0xd4, 0xa7, 0x82, 0x2b, 0xf2, 0x2f, + 0x24, 0xa0, 0xe0, 0xc7, 0x60, 0x8c, 0xb9, 0x86, 0xeb, 0xb1, 0xc2, 0xa8, 0x00, 0x5d, 0x79, 0x1f, + 0x50, 0xe1, 0xa8, 0xcf, 0x48, 0xd8, 0x31, 0xff, 0x1b, 0x49, 0x40, 0xf5, 0x4d, 0x06, 0xcc, 0x47, + 0xc6, 0xd7, 0x6d, 0xab, 0x42, 0x44, 0xad, 0x5c, 0x8d, 0xe5, 0xfd, 0x54, 0x57, 0xde, 0x17, 0xfb, + 0xb8, 0x44, 0x39, 0x87, 0xff, 0x09, 0xcf, 0x9b, 0x11, 0xee, 0x27, 0xe3, 0xc1, 0xdf, 0xb5, 0x4a, + 0xb3, 0xa1, 0x5b, 0xfc, 0x3c, 0xb0, 0x09, 0x60, 0xdd, 0x60, 0xee, 0x03, 0x6a, 0x58, 0xcc, 0x87, + 0x25, 0x0d, 0x2c, 0xaf, 0xfd, 0xcf, 0xe1, 0x5e, 0x8a, 0x7b, 0xe8, 0x4b, 0x32, 0x24, 0x5c, 0xeb, + 0x41, 0x43, 0x7d, 0x22, 0xc0, 0xbf, 0x83, 0x31, 0x8a, 0x0d, 0x66, 0x5b, 0x85, 0xac, 0x38, 0x72, + 0x98, 0x2f, 0x24, 0xa4, 0x48, 0x6a, 0xe1, 0x3f, 0xc0, 0x78, 0x03, 0x33, 0x66, 0x54, 0x71, 0x21, + 0x27, 0x0c, 0x67, 0xa5, 0xe1, 0xf8, 0xba, 0x2f, 0x46, 0x81, 0x5e, 0xfd, 0x5e, 0x01, 0x33, 0x51, + 0x9e, 0xd6, 0x08, 0x73, 0xe1, 0x93, 0x9e, 0xea, 0xd3, 0x86, 0xbb, 0x13, 0xf7, 0x16, 0xb5, 0x37, + 0x27, 0xc3, 0x4d, 0x04, 0x92, 0x8e, 0xca, 0xdb, 0x04, 0x39, 0xe2, 0xe2, 0x06, 0xcf, 0xfa, 0xe8, + 0xe9, 0xc9, 0x0b, 0x67, 0xde, 0xa3, 0x4a, 0xf4, 0x69, 0x89, 0x9b, 0xbb, 0xc3, 0x11, 0x90, 0x0f, + 0xa4, 0xfe, 0x3c, 0xda, 0x79, 0x05, 0x5e, 0x91, 0xf0, 0x6b, 0x05, 0x2c, 0x39, 0x89, 0x33, 0x46, + 0xde, 0xea, 0x46, 0x6a, 0xe8, 0xe4, 0x31, 0x85, 0xf0, 0x2e, 0xe6, 0xb3, 0x05, 0xeb, 0xaa, 0x3c, + 0xd3, 0xd2, 0x00, 0xe3, 0x01, 0x67, 0x81, 0x77, 0x01, 0x6c, 0x18, 0x2e, 0xcf, 0x69, 0x75, 0x93, + 0x62, 0x13, 0x57, 0x38, 0xaa, 0x1c, 0x4c, 0x61, 0x7d, 0xac, 0xf7, 0x58, 0xa0, 0x3e, 0x5e, 0xf0, + 0x0b, 0x05, 0xcc, 0x57, 0x7a, 0x07, 0x8d, 0xac, 0xcc, 0x2b, 0x43, 0xa5, 0xba, 0xcf, 0xa0, 0xd2, + 0x17, 0xdb, 0xad, 0xd2, 0x7c, 0x1f, 0x05, 0xea, 0x17, 0x0d, 0x7e, 0x02, 0x72, 0xd4, 0xab, 0x63, + 0x56, 0xc8, 0x8a, 0x17, 0x4e, 0x0f, 0xbb, 0x69, 0xd7, 0x89, 0x79, 0x80, 0xb8, 0xcf, 0xff, 0x89, + 0x5b, 0xdb, 0xf6, 0xc4, 0xc4, 0x62, 0xd1, 0x73, 0x0b, 0x15, 0xf2, 0x51, 0xd5, 0x17, 0x60, 0xae, + 0x7b, 0x70, 0xc0, 0x1a, 0x00, 0x66, 0xd0, 0xab, 0x7c, 0x4d, 0xf0, 0xb8, 0x17, 0xdf, 0xa3, 0xb2, + 0xc2, 0x46, 0x8f, 0xc6, 0x66, 0x28, 0x62, 0xa8, 0x03, 0x5b, 0x3d, 0x0f, 0xa6, 0x6e, 0x51, 0xdb, + 0x73, 0xe4, 0x21, 0xe1, 0x32, 0xc8, 0x5a, 0x46, 0x23, 0x18, 0x41, 0xe1, 0x5c, 0xdc, 0x30, 0x1a, + 0x18, 0x09, 0x8d, 0xfa, 0x95, 0x02, 0xa6, 0xd7, 0x48, 0x83, 0xb8, 0x08, 0x33, 0xc7, 0xb6, 0x18, + 0x86, 0x97, 0x62, 0x63, 0xeb, 0x64, 0xd7, 0xd8, 0x3a, 0x16, 0x33, 0xee, 0x18, 0x58, 0x4f, 0xc0, + 0xf8, 0xa7, 0x1e, 0xf6, 0x88, 0x55, 0x95, 0x63, 0xfb, 0x52, 0xea, 0x0d, 0xb7, 0x7c, 0xfb, 0x58, + 0xc5, 0xe9, 0x93, 0x7c, 0x10, 0x48, 0x0d, 0x0a, 0x20, 0xd5, 0xdf, 0x32, 0xe0, 0xa4, 0x88, 0x8c, + 0x2b, 0x03, 0xb6, 0xf3, 0x13, 0x50, 0x30, 0x18, 0xf3, 0x28, 0xae, 0x24, 0x6d, 0xe7, 0x65, 0x79, + 0x9d, 0xc2, 0x6a, 0x82, 0x1d, 0x4a, 0x44, 0x80, 0x7b, 0x60, 0xba, 0xde, 0x79, 0x79, 0x79, 0x4f, + 0x2d, 0xf5, 0x9e, 0xb1, 0x94, 0xe9, 0x0b, 0xf2, 0x08, 0xf1, 0xb4, 0xa3, 0x38, 0x76, 0x3f, 0x3a, + 0x30, 0x3a, 0x3c, 0x1d, 0x80, 0xf7, 0xc1, 0xc2, 0x8e, 0x4d, 0xa9, 0xbd, 0x4f, 0xac, 0xaa, 0x88, + 0x13, 0x80, 0x64, 0x05, 0xc8, 0x5f, 0xda, 0xad, 0xd2, 0x82, 0xde, 0xcf, 0x00, 0xf5, 0xf7, 0x53, + 0xf7, 0xc1, 0xc2, 0x06, 0x1f, 0x2c, 0xcc, 0xf6, 0xa8, 0x89, 0xa3, 0x9e, 0x80, 0x25, 0x90, 0x6b, + 0x62, 0xba, 0xe3, 0xd7, 0x75, 0x5e, 0xcf, 0xf3, 0x8e, 0x78, 0xc4, 0x05, 0xc8, 0x97, 0xf3, 0x9b, + 0x58, 0x91, 0xe7, 0x43, 0xb4, 0xc6, 0x0a, 0x63, 0xc2, 0x54, 0xdc, 0x64, 0x23, 0xae, 0x42, 0xdd, + 0xb6, 0xea, 0x61, 0x06, 0x2c, 0x26, 0xb4, 0x20, 0x7c, 0x04, 0x26, 0x98, 0xfc, 0x5b, 0xb6, 0xd5, + 0xe9, 0xd4, 0xc7, 0x90, 0xce, 0xd1, 0x16, 0x08, 0xd0, 0x50, 0x88, 0x05, 0x1d, 0x30, 0x4d, 0xe5, + 0x19, 0x44, 0x50, 0xb9, 0x0d, 0xfe, 0x95, 0x0a, 0xde, 0x9b, 0x9f, 0xe8, 0xb9, 0x51, 0x27, 0x22, + 0x8a, 0x07, 0x80, 0x2f, 0xc0, 0x5c, 0xc7, 0xc5, 0xfd, 0xa0, 0xa3, 0x22, 0xe8, 0xe5, 0xd4, 0xa0, + 0x7d, 0xdf, 0x45, 0x2f, 0xc8, 0xb8, 0x73, 0x1b, 0x5d, 0xb8, 0xa8, 0x27, 0x92, 0xfa, 0x63, 0x06, + 0x0c, 0x58, 0x10, 0x1f, 0x80, 0xf0, 0x19, 0x31, 0xc2, 0x77, 0xed, 0x08, 0xab, 0x2f, 0x91, 0x00, + 0x92, 0x2e, 0x02, 0xb8, 0x7a, 0x94, 0x20, 0x83, 0x09, 0xe1, 0x2f, 0x19, 0xf0, 0xb7, 0x64, 0xe7, + 0x88, 0x20, 0xde, 0x8b, 0x4d, 0xda, 0x7f, 0x77, 0x4d, 0xda, 0x53, 0x43, 0x40, 0xfc, 0x49, 0x18, + 0xbb, 0x08, 0xe3, 0x5b, 0x05, 0x14, 0x93, 0xf3, 0xf6, 0x01, 0x08, 0xe4, 0xd3, 0x38, 0x81, 0xbc, + 0x7a, 0x84, 0x2a, 0x4b, 0x20, 0x94, 0xb7, 0x06, 0x15, 0x57, 0xc8, 0xfc, 0x86, 0x58, 0xfd, 0xdf, + 0x64, 0x06, 0xe5, 0x4a, 0x30, 0xd5, 0x94, 0x9f, 0x30, 0x31, 0xef, 0x9b, 0x16, 0x5f, 0x40, 0x0d, + 0xbe, 0x43, 0xfc, 0x8a, 0x24, 0x60, 0xbc, 0xee, 0xaf, 0x6c, 0xd9, 0xd7, 0xfa, 0x70, 0x9b, 0x72, + 0xd0, 0x8a, 0xf7, 0xe9, 0x81, 0x34, 0x43, 0x01, 0x3e, 0xc4, 0x60, 0x0c, 0x8b, 0x9f, 0xee, 0x43, + 0x37, 0x77, 0xda, 0x2f, 0x7d, 0x1d, 0xf0, 0x42, 0xf4, 0xad, 0x90, 0x04, 0x57, 0x5f, 0x2a, 0x60, + 0x39, 0x6d, 0x2a, 0xc0, 0xe7, 0x7d, 0xd8, 0xde, 0x51, 0xc8, 0xfc, 0xf0, 0xec, 0xef, 0x5b, 0x05, + 0x1c, 0xef, 0xc7, 0xa9, 0x78, 0xa3, 0x71, 0x22, 0x15, 0xb2, 0xa0, 0xb0, 0xd1, 0xb6, 0x84, 0x14, + 0x49, 0x2d, 0x3c, 0x0b, 0x26, 0x6a, 0x86, 0x55, 0xd9, 0x26, 0x9f, 0x05, 0x1c, 0x3f, 0x2c, 0xf5, + 0xdb, 0x52, 0x8e, 0x42, 0x0b, 0x78, 0x03, 0xcc, 0x09, 0xbf, 0x35, 0x6c, 0x55, 0xdd, 0x9a, 0x78, + 0x13, 0xc9, 0x51, 0xc2, 0xdd, 0xb3, 0xd5, 0xa5, 0x47, 0x3d, 0x1e, 0xea, 0xaf, 0x0a, 0x80, 0x7f, + 0x84, 0x56, 0x9c, 0x01, 0x79, 0xc3, 0x21, 0x82, 0xed, 0xfa, 0xcd, 0x96, 0xd7, 0xa7, 0xdb, 0xad, + 0x52, 0x7e, 0x75, 0xf3, 0x8e, 0x2f, 0x44, 0x91, 0x9e, 0x1b, 0x07, 0xfb, 0xd6, 0xdf, 0xab, 0xd2, + 0x38, 0x08, 0xcc, 0x50, 0xa4, 0x87, 0x57, 0xc0, 0x94, 0x59, 0xf7, 0x98, 0x8b, 0xe9, 0xb6, 0x69, + 0x3b, 0x58, 0x0c, 0xa7, 0x09, 0xfd, 0xb8, 0xbc, 0xd3, 0xd4, 0xf5, 0x0e, 0x1d, 0x8a, 0x59, 0x42, + 0x0d, 0x00, 0xde, 0x59, 0xcc, 0x31, 0x78, 0x9c, 0x9c, 0x88, 0x33, 0xc3, 0x1f, 0x6c, 0x23, 0x94, + 0xa2, 0x0e, 0x0b, 0xf5, 0x19, 0x58, 0xd8, 0xc6, 0xb4, 0x49, 0x4c, 0xbc, 0x6a, 0x9a, 0xb6, 0x67, + 0xb9, 0x01, 0x6f, 0x2f, 0x83, 0x7c, 0x68, 0x26, 0x9b, 0xef, 0x98, 0x8c, 0x9f, 0x0f, 0xb1, 0x50, + 0x64, 0x13, 0x76, 0x7b, 0x26, 0xb1, 0xdb, 0x7f, 0xc8, 0x80, 0xf1, 0x08, 0x3e, 0xbb, 0x47, 0xac, + 0x8a, 0x44, 0x3e, 0x11, 0x58, 0xdf, 0x23, 0x56, 0xe5, 0x5d, 0xab, 0x34, 0x29, 0xcd, 0xf8, 0x27, + 0x12, 0x86, 0xf0, 0x2e, 0xc8, 0x7a, 0x0c, 0x53, 0xd9, 0xc7, 0x67, 0x53, 0xab, 0xf9, 0x21, 0xc3, + 0x34, 0x20, 0x5a, 0x13, 0x1c, 0x9a, 0x0b, 0x90, 0xc0, 0x80, 0x1b, 0x20, 0x57, 0xe5, 0xaf, 0x22, + 0x5b, 0xf5, 0x5c, 0x2a, 0x58, 0xe7, 0x2f, 0x1a, 0xbf, 0x10, 0x84, 0x04, 0xf9, 0x30, 0x90, 0x82, + 0x19, 0x16, 0x4b, 0xa2, 0x78, 0xb0, 0x61, 0x88, 0x53, 0xdf, 0xdc, 0xeb, 0xb0, 0xdd, 0x2a, 0xcd, + 0xc4, 0x55, 0xa8, 0x2b, 0x82, 0x5a, 0x06, 0x93, 0x1d, 0x57, 0x4c, 0x9f, 0xb5, 0xfa, 0xcd, 0x57, + 0x87, 0xc5, 0x91, 0xd7, 0x87, 0xc5, 0x91, 0x37, 0x87, 0xc5, 0x91, 0xcf, 0xdb, 0x45, 0xe5, 0x55, + 0xbb, 0xa8, 0xbc, 0x6e, 0x17, 0x95, 0x37, 0xed, 0xa2, 0xf2, 0xb6, 0x5d, 0x54, 0xbe, 0xfc, 0xa9, + 0x38, 0xf2, 0xb8, 0x94, 0xf2, 0x2f, 0xda, 0xdf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x6c, 0x4e, + 0x4e, 0xdd, 0x15, 0x00, 0x00, +} + +func (m *ExemptPriorityLevelConfiguration) 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 *ExemptPriorityLevelConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExemptPriorityLevelConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.LendablePercent != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.LendablePercent)) + i-- + dAtA[i] = 0x10 + } + if m.NominalConcurrencyShares != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.NominalConcurrencyShares)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *FlowDistinguisherMethod) Marshal() (dAtA []byte, err error) { @@ -1491,6 +1557,18 @@ func (m *PriorityLevelConfigurationSpec) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.Exempt != nil { + { + size, err := m.Exempt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if m.Limited != nil { { size, err := m.Limited.MarshalToSizedBuffer(dAtA[:i]) @@ -1783,6 +1861,21 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *ExemptPriorityLevelConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NominalConcurrencyShares != nil { + n += 1 + sovGenerated(uint64(*m.NominalConcurrencyShares)) + } + if m.LendablePercent != nil { + n += 1 + sovGenerated(uint64(*m.LendablePercent)) + } + return n +} + func (m *FlowDistinguisherMethod) Size() (n int) { if m == nil { return 0 @@ -2048,6 +2141,10 @@ func (m *PriorityLevelConfigurationSpec) Size() (n int) { l = m.Limited.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Exempt != nil { + l = m.Exempt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2165,6 +2262,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *ExemptPriorityLevelConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExemptPriorityLevelConfiguration{`, + `NominalConcurrencyShares:` + valueToStringGenerated(this.NominalConcurrencyShares) + `,`, + `LendablePercent:` + valueToStringGenerated(this.LendablePercent) + `,`, + `}`, + }, "") + return s +} func (this *FlowDistinguisherMethod) String() string { if this == nil { return "nil" @@ -2381,6 +2489,7 @@ func (this *PriorityLevelConfigurationSpec) String() string { s := strings.Join([]string{`&PriorityLevelConfigurationSpec{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Limited:` + strings.Replace(this.Limited.String(), "LimitedPriorityLevelConfiguration", "LimitedPriorityLevelConfiguration", 1) + `,`, + `Exempt:` + strings.Replace(this.Exempt.String(), "ExemptPriorityLevelConfiguration", "ExemptPriorityLevelConfiguration", 1) + `,`, `}`, }, "") return s @@ -2468,6 +2577,96 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *ExemptPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NominalConcurrencyShares", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NominalConcurrencyShares = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LendablePercent", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.LendablePercent = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4547,6 +4746,42 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exempt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exempt == nil { + m.Exempt = &ExemptPriorityLevelConfiguration{} + } + if err := m.Exempt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto index 69ca79ad2..6509386f2 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto +++ b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto @@ -28,6 +28,40 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/flowcontrol/v1alpha1"; +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +message ExemptPriorityLevelConfiguration { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + optional int32 nominalConcurrencyShares = 1; + + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + optional int32 lendablePercent = 2; +} + // FlowDistinguisherMethod specifies the method of a flow distinguisher. message FlowDistinguisherMethod { // `type` is the type of flow distinguisher method @@ -332,6 +366,14 @@ message PriorityLevelConfigurationSpec { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional optional LimitedPriorityLevelConfiguration limited = 2; + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + optional ExemptPriorityLevelConfiguration exempt = 3; } // PriorityLevelConfigurationStatus represents the current state of a "request-priority". diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go index ebf665bcc..161411ff3 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go @@ -399,6 +399,14 @@ type PriorityLevelConfigurationSpec struct { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional Limited *LimitedPriorityLevelConfiguration `json:"limited,omitempty" protobuf:"bytes,2,opt,name=limited"` + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + Exempt *ExemptPriorityLevelConfiguration `json:"exempt,omitempty" protobuf:"bytes,3,opt,name=exempt"` } // PriorityLevelEnablement indicates whether limits on execution are enabled for the priority level @@ -469,6 +477,43 @@ type LimitedPriorityLevelConfiguration struct { BorrowingLimitPercent *int32 `json:"borrowingLimitPercent,omitempty" protobuf:"varint,4,opt,name=borrowingLimitPercent"` } +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +type ExemptPriorityLevelConfiguration struct { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty" protobuf:"varint,1,opt,name=nominalConcurrencyShares"` + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + LendablePercent *int32 `json:"lendablePercent,omitempty" protobuf:"varint,2,opt,name=lendablePercent"` + // The `BorrowingCL` of an Exempt priority level is implicitly `ServerCL`. + // In other words, an exempt priority level + // has no meaningful limit on how much it borrows. + // There is no explicit representation of that here. +} + // LimitResponse defines how to handle requests that can not be executed right now. // +union type LimitResponse struct { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go index c95999fa5..1d0680c10 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go @@ -27,6 +27,16 @@ package v1alpha1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ExemptPriorityLevelConfiguration = map[string]string{ + "": "ExemptPriorityLevelConfiguration describes the configurable aspects of the handling of exempt requests. In the mandatory exempt configuration object the values in the fields here can be modified by authorized users, unlike the rest of the `spec`.", + "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats nominally reserved for this priority level. This DOES NOT limit the dispatching from this priority level but affects the other priority levels through the borrowing mechanism. The server's concurrency limit (ServerCL) is divided among all the priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other priority level. This field has a default value of zero.", + "lendablePercent": "`lendablePercent` prescribes the fraction of the level's NominalCL that can be borrowed by other priority levels. This value of this field must be between 0 and 100, inclusive, and it defaults to 0. The number of seats that other levels can borrow from this level, known as this level's LendableConcurrencyLimit (LendableCL), is defined as follows.\n\nLendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 )", +} + +func (ExemptPriorityLevelConfiguration) SwaggerDoc() map[string]string { + return map_ExemptPriorityLevelConfiguration +} + var map_FlowDistinguisherMethod = map[string]string{ "": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "type": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", @@ -190,6 +200,7 @@ var map_PriorityLevelConfigurationSpec = map[string]string{ "": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", "type": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", "limited": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`.", + "exempt": "`exempt` specifies how requests are handled for an exempt priority level. This field MUST be empty if `type` is `\"Limited\"`. This field MAY be non-empty if `type` is `\"Exempt\"`. If empty and `type` is `\"Exempt\"` then the default values for `ExemptPriorityLevelConfiguration` apply.", } func (PriorityLevelConfigurationSpec) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/zz_generated.deepcopy.go index e0272804f..a5c9737aa 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1alpha1/zz_generated.deepcopy.go @@ -25,6 +25,32 @@ import ( 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 *ExemptPriorityLevelConfiguration) DeepCopyInto(out *ExemptPriorityLevelConfiguration) { + *out = *in + if in.NominalConcurrencyShares != nil { + in, out := &in.NominalConcurrencyShares, &out.NominalConcurrencyShares + *out = new(int32) + **out = **in + } + if in.LendablePercent != nil { + in, out := &in.LendablePercent, &out.LendablePercent + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExemptPriorityLevelConfiguration. +func (in *ExemptPriorityLevelConfiguration) DeepCopy() *ExemptPriorityLevelConfiguration { + if in == nil { + return nil + } + out := new(ExemptPriorityLevelConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlowDistinguisherMethod) DeepCopyInto(out *FlowDistinguisherMethod) { *out = *in @@ -400,6 +426,11 @@ func (in *PriorityLevelConfigurationSpec) DeepCopyInto(out *PriorityLevelConfigu *out = new(LimitedPriorityLevelConfiguration) (*in).DeepCopyInto(*out) } + if in.Exempt != nil { + in, out := &in.Exempt, &out.Exempt + *out = new(ExemptPriorityLevelConfiguration) + (*in).DeepCopyInto(*out) + } return } diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go index fbaea85dd..33f4b97e3 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go @@ -43,10 +43,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ExemptPriorityLevelConfiguration) Reset() { *m = ExemptPriorityLevelConfiguration{} } +func (*ExemptPriorityLevelConfiguration) ProtoMessage() {} +func (*ExemptPriorityLevelConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_80171c2a4e3669de, []int{0} +} +func (m *ExemptPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExemptPriorityLevelConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExemptPriorityLevelConfiguration.Merge(m, src) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ExemptPriorityLevelConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ExemptPriorityLevelConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ExemptPriorityLevelConfiguration proto.InternalMessageInfo + func (m *FlowDistinguisherMethod) Reset() { *m = FlowDistinguisherMethod{} } func (*FlowDistinguisherMethod) ProtoMessage() {} func (*FlowDistinguisherMethod) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{0} + return fileDescriptor_80171c2a4e3669de, []int{1} } func (m *FlowDistinguisherMethod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +102,7 @@ var xxx_messageInfo_FlowDistinguisherMethod proto.InternalMessageInfo func (m *FlowSchema) Reset() { *m = FlowSchema{} } func (*FlowSchema) ProtoMessage() {} func (*FlowSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{1} + return fileDescriptor_80171c2a4e3669de, []int{2} } func (m *FlowSchema) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +130,7 @@ var xxx_messageInfo_FlowSchema proto.InternalMessageInfo func (m *FlowSchemaCondition) Reset() { *m = FlowSchemaCondition{} } func (*FlowSchemaCondition) ProtoMessage() {} func (*FlowSchemaCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{2} + return fileDescriptor_80171c2a4e3669de, []int{3} } func (m *FlowSchemaCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +158,7 @@ var xxx_messageInfo_FlowSchemaCondition proto.InternalMessageInfo func (m *FlowSchemaList) Reset() { *m = FlowSchemaList{} } func (*FlowSchemaList) ProtoMessage() {} func (*FlowSchemaList) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{3} + return fileDescriptor_80171c2a4e3669de, []int{4} } func (m *FlowSchemaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +186,7 @@ var xxx_messageInfo_FlowSchemaList proto.InternalMessageInfo func (m *FlowSchemaSpec) Reset() { *m = FlowSchemaSpec{} } func (*FlowSchemaSpec) ProtoMessage() {} func (*FlowSchemaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{4} + return fileDescriptor_80171c2a4e3669de, []int{5} } func (m *FlowSchemaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +214,7 @@ var xxx_messageInfo_FlowSchemaSpec proto.InternalMessageInfo func (m *FlowSchemaStatus) Reset() { *m = FlowSchemaStatus{} } func (*FlowSchemaStatus) ProtoMessage() {} func (*FlowSchemaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{5} + return fileDescriptor_80171c2a4e3669de, []int{6} } func (m *FlowSchemaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +242,7 @@ var xxx_messageInfo_FlowSchemaStatus proto.InternalMessageInfo func (m *GroupSubject) Reset() { *m = GroupSubject{} } func (*GroupSubject) ProtoMessage() {} func (*GroupSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{6} + return fileDescriptor_80171c2a4e3669de, []int{7} } func (m *GroupSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +270,7 @@ var xxx_messageInfo_GroupSubject proto.InternalMessageInfo func (m *LimitResponse) Reset() { *m = LimitResponse{} } func (*LimitResponse) ProtoMessage() {} func (*LimitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{7} + return fileDescriptor_80171c2a4e3669de, []int{8} } func (m *LimitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +298,7 @@ var xxx_messageInfo_LimitResponse proto.InternalMessageInfo func (m *LimitedPriorityLevelConfiguration) Reset() { *m = LimitedPriorityLevelConfiguration{} } func (*LimitedPriorityLevelConfiguration) ProtoMessage() {} func (*LimitedPriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{8} + return fileDescriptor_80171c2a4e3669de, []int{9} } func (m *LimitedPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +326,7 @@ var xxx_messageInfo_LimitedPriorityLevelConfiguration proto.InternalMessageInfo func (m *NonResourcePolicyRule) Reset() { *m = NonResourcePolicyRule{} } func (*NonResourcePolicyRule) ProtoMessage() {} func (*NonResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{9} + return fileDescriptor_80171c2a4e3669de, []int{10} } func (m *NonResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +354,7 @@ var xxx_messageInfo_NonResourcePolicyRule proto.InternalMessageInfo func (m *PolicyRulesWithSubjects) Reset() { *m = PolicyRulesWithSubjects{} } func (*PolicyRulesWithSubjects) ProtoMessage() {} func (*PolicyRulesWithSubjects) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{10} + return fileDescriptor_80171c2a4e3669de, []int{11} } func (m *PolicyRulesWithSubjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +382,7 @@ var xxx_messageInfo_PolicyRulesWithSubjects proto.InternalMessageInfo func (m *PriorityLevelConfiguration) Reset() { *m = PriorityLevelConfiguration{} } func (*PriorityLevelConfiguration) ProtoMessage() {} func (*PriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{11} + return fileDescriptor_80171c2a4e3669de, []int{12} } func (m *PriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +410,7 @@ var xxx_messageInfo_PriorityLevelConfiguration proto.InternalMessageInfo func (m *PriorityLevelConfigurationCondition) Reset() { *m = PriorityLevelConfigurationCondition{} } func (*PriorityLevelConfigurationCondition) ProtoMessage() {} func (*PriorityLevelConfigurationCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{12} + return fileDescriptor_80171c2a4e3669de, []int{13} } func (m *PriorityLevelConfigurationCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +438,7 @@ var xxx_messageInfo_PriorityLevelConfigurationCondition proto.InternalMessageInf func (m *PriorityLevelConfigurationList) Reset() { *m = PriorityLevelConfigurationList{} } func (*PriorityLevelConfigurationList) ProtoMessage() {} func (*PriorityLevelConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{13} + return fileDescriptor_80171c2a4e3669de, []int{14} } func (m *PriorityLevelConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +466,7 @@ var xxx_messageInfo_PriorityLevelConfigurationList proto.InternalMessageInfo func (m *PriorityLevelConfigurationReference) Reset() { *m = PriorityLevelConfigurationReference{} } func (*PriorityLevelConfigurationReference) ProtoMessage() {} func (*PriorityLevelConfigurationReference) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{14} + return fileDescriptor_80171c2a4e3669de, []int{15} } func (m *PriorityLevelConfigurationReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +494,7 @@ var xxx_messageInfo_PriorityLevelConfigurationReference proto.InternalMessageInf func (m *PriorityLevelConfigurationSpec) Reset() { *m = PriorityLevelConfigurationSpec{} } func (*PriorityLevelConfigurationSpec) ProtoMessage() {} func (*PriorityLevelConfigurationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{15} + return fileDescriptor_80171c2a4e3669de, []int{16} } func (m *PriorityLevelConfigurationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +522,7 @@ var xxx_messageInfo_PriorityLevelConfigurationSpec proto.InternalMessageInfo func (m *PriorityLevelConfigurationStatus) Reset() { *m = PriorityLevelConfigurationStatus{} } func (*PriorityLevelConfigurationStatus) ProtoMessage() {} func (*PriorityLevelConfigurationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{16} + return fileDescriptor_80171c2a4e3669de, []int{17} } func (m *PriorityLevelConfigurationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +550,7 @@ var xxx_messageInfo_PriorityLevelConfigurationStatus proto.InternalMessageInfo func (m *QueuingConfiguration) Reset() { *m = QueuingConfiguration{} } func (*QueuingConfiguration) ProtoMessage() {} func (*QueuingConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{17} + return fileDescriptor_80171c2a4e3669de, []int{18} } func (m *QueuingConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +578,7 @@ var xxx_messageInfo_QueuingConfiguration proto.InternalMessageInfo func (m *ResourcePolicyRule) Reset() { *m = ResourcePolicyRule{} } func (*ResourcePolicyRule) ProtoMessage() {} func (*ResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{18} + return fileDescriptor_80171c2a4e3669de, []int{19} } func (m *ResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +606,7 @@ var xxx_messageInfo_ResourcePolicyRule proto.InternalMessageInfo func (m *ServiceAccountSubject) Reset() { *m = ServiceAccountSubject{} } func (*ServiceAccountSubject) ProtoMessage() {} func (*ServiceAccountSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{19} + return fileDescriptor_80171c2a4e3669de, []int{20} } func (m *ServiceAccountSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +634,7 @@ var xxx_messageInfo_ServiceAccountSubject proto.InternalMessageInfo func (m *Subject) Reset() { *m = Subject{} } func (*Subject) ProtoMessage() {} func (*Subject) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{20} + return fileDescriptor_80171c2a4e3669de, []int{21} } func (m *Subject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +662,7 @@ var xxx_messageInfo_Subject proto.InternalMessageInfo func (m *UserSubject) Reset() { *m = UserSubject{} } func (*UserSubject) ProtoMessage() {} func (*UserSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_80171c2a4e3669de, []int{21} + return fileDescriptor_80171c2a4e3669de, []int{22} } func (m *UserSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -660,6 +688,7 @@ func (m *UserSubject) XXX_DiscardUnknown() { var xxx_messageInfo_UserSubject proto.InternalMessageInfo func init() { + proto.RegisterType((*ExemptPriorityLevelConfiguration)(nil), "k8s.io.api.flowcontrol.v1beta1.ExemptPriorityLevelConfiguration") proto.RegisterType((*FlowDistinguisherMethod)(nil), "k8s.io.api.flowcontrol.v1beta1.FlowDistinguisherMethod") proto.RegisterType((*FlowSchema)(nil), "k8s.io.api.flowcontrol.v1beta1.FlowSchema") proto.RegisterType((*FlowSchemaCondition)(nil), "k8s.io.api.flowcontrol.v1beta1.FlowSchemaCondition") @@ -689,105 +718,141 @@ func init() { } var fileDescriptor_80171c2a4e3669de = []byte{ - // 1553 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4f, 0x6f, 0xdb, 0xc6, - 0x12, 0x37, 0x65, 0xc9, 0xb6, 0xc6, 0x7f, 0xb3, 0x8e, 0x61, 0x3d, 0x07, 0x90, 0x1c, 0x3e, 0xe0, - 0xe5, 0xbd, 0x97, 0x84, 0x4a, 0xd2, 0xa4, 0x49, 0x5b, 0xf4, 0x8f, 0xe9, 0xb4, 0x69, 0x1a, 0xdb, - 0x71, 0xd6, 0x49, 0x5b, 0xa4, 0x01, 0x1a, 0x8a, 0x5a, 0x4b, 0x8c, 0x25, 0x92, 0xd9, 0x25, 0x65, - 0xb8, 0xb9, 0x14, 0xfd, 0x04, 0x3d, 0xb7, 0xc7, 0x1e, 0x7a, 0xef, 0x17, 0xe8, 0xb1, 0x41, 0x4f, - 0x39, 0xe6, 0xa4, 0x36, 0xea, 0xa9, 0xdf, 0xa0, 0x0d, 0x50, 0xa0, 0xd8, 0xe5, 0x92, 0x14, 0xf5, - 0x8f, 0x42, 0x02, 0xe4, 0xd4, 0x9b, 0x39, 0xf3, 0x9b, 0xdf, 0xec, 0xcc, 0xce, 0xcc, 0x8e, 0x0c, - 0xd7, 0x0e, 0xae, 0x30, 0xcd, 0x72, 0xca, 0x07, 0x7e, 0x85, 0x50, 0x9b, 0x78, 0x84, 0x95, 0x5b, - 0xc4, 0xae, 0x3a, 0xb4, 0x2c, 0x15, 0x86, 0x6b, 0x95, 0xf7, 0x1b, 0xce, 0xa1, 0xe9, 0xd8, 0x1e, - 0x75, 0x1a, 0xe5, 0xd6, 0xf9, 0x0a, 0xf1, 0x8c, 0xf3, 0xe5, 0x1a, 0xb1, 0x09, 0x35, 0x3c, 0x52, - 0xd5, 0x5c, 0xea, 0x78, 0x0e, 0x2a, 0x06, 0x78, 0xcd, 0x70, 0x2d, 0xad, 0x0b, 0xaf, 0x49, 0xfc, - 0xda, 0xd9, 0x9a, 0xe5, 0xd5, 0xfd, 0x8a, 0x66, 0x3a, 0xcd, 0x72, 0xcd, 0xa9, 0x39, 0x65, 0x61, - 0x56, 0xf1, 0xf7, 0xc5, 0x97, 0xf8, 0x10, 0x7f, 0x05, 0x74, 0x6b, 0x17, 0x63, 0xf7, 0x4d, 0xc3, - 0xac, 0x5b, 0x36, 0xa1, 0x47, 0x65, 0xf7, 0xa0, 0xc6, 0x05, 0xac, 0xdc, 0x24, 0x9e, 0x51, 0x6e, - 0xf5, 0x1d, 0x62, 0xad, 0x3c, 0xcc, 0x8a, 0xfa, 0xb6, 0x67, 0x35, 0x49, 0x9f, 0xc1, 0xeb, 0x69, - 0x06, 0xcc, 0xac, 0x93, 0xa6, 0xd1, 0x6b, 0xa7, 0xde, 0x85, 0xd5, 0x0f, 0x1a, 0xce, 0xe1, 0x55, - 0x8b, 0x79, 0x96, 0x5d, 0xf3, 0x2d, 0x56, 0x27, 0x74, 0x9b, 0x78, 0x75, 0xa7, 0x8a, 0xde, 0x85, - 0xac, 0x77, 0xe4, 0x92, 0x82, 0xb2, 0xae, 0xfc, 0x37, 0xaf, 0x9f, 0x7e, 0xdc, 0x2e, 0x4d, 0x74, - 0xda, 0xa5, 0xec, 0xed, 0x23, 0x97, 0x3c, 0x6f, 0x97, 0x4e, 0x0c, 0x31, 0xe3, 0x6a, 0x2c, 0x0c, - 0xd5, 0x6f, 0x32, 0x00, 0x1c, 0xb5, 0x27, 0x5c, 0xa3, 0xfb, 0x30, 0xc3, 0xc3, 0xad, 0x1a, 0x9e, - 0x21, 0x38, 0x67, 0x2f, 0x9c, 0xd3, 0xe2, 0x5c, 0x47, 0xa7, 0xd6, 0xdc, 0x83, 0x1a, 0x17, 0x30, - 0x8d, 0xa3, 0xb5, 0xd6, 0x79, 0xed, 0x66, 0xe5, 0x01, 0x31, 0xbd, 0x6d, 0xe2, 0x19, 0x3a, 0x92, - 0xa7, 0x80, 0x58, 0x86, 0x23, 0x56, 0xb4, 0x0b, 0x59, 0xe6, 0x12, 0xb3, 0x90, 0x11, 0xec, 0x9a, - 0x36, 0xfa, 0x26, 0xb5, 0xf8, 0x6c, 0x7b, 0x2e, 0x31, 0xf5, 0xb9, 0x30, 0x42, 0xfe, 0x85, 0x05, - 0x13, 0xfa, 0x14, 0xa6, 0x98, 0x67, 0x78, 0x3e, 0x2b, 0x4c, 0xf6, 0x9d, 0x38, 0x8d, 0x53, 0xd8, - 0xe9, 0x0b, 0x92, 0x75, 0x2a, 0xf8, 0xc6, 0x92, 0x4f, 0x7d, 0x9a, 0x81, 0xe5, 0x18, 0xbc, 0xe9, - 0xd8, 0x55, 0xcb, 0xb3, 0x1c, 0x1b, 0xbd, 0x95, 0xc8, 0xfa, 0xa9, 0x9e, 0xac, 0xaf, 0x0e, 0x30, - 0x89, 0x33, 0x8e, 0xde, 0x88, 0x8e, 0x9b, 0x11, 0xe6, 0x27, 0x93, 0xce, 0x9f, 0xb7, 0x4b, 0x8b, - 0x91, 0x59, 0xf2, 0x3c, 0xa8, 0x05, 0xa8, 0x61, 0x30, 0xef, 0x36, 0x35, 0x6c, 0x16, 0xd0, 0x5a, - 0x4d, 0x22, 0xa3, 0xfe, 0xff, 0x78, 0xf7, 0xc4, 0x2d, 0xf4, 0x35, 0xe9, 0x12, 0x6d, 0xf5, 0xb1, - 0xe1, 0x01, 0x1e, 0xd0, 0x7f, 0x60, 0x8a, 0x12, 0x83, 0x39, 0x76, 0x21, 0x2b, 0x8e, 0x1c, 0xe5, - 0x0b, 0x0b, 0x29, 0x96, 0x5a, 0xf4, 0x3f, 0x98, 0x6e, 0x12, 0xc6, 0x8c, 0x1a, 0x29, 0xe4, 0x04, - 0x70, 0x51, 0x02, 0xa7, 0xb7, 0x03, 0x31, 0x0e, 0xf5, 0xea, 0x8f, 0x0a, 0x2c, 0xc4, 0x79, 0xda, - 0xb2, 0x98, 0x87, 0xee, 0xf5, 0xd5, 0x9e, 0x36, 0x5e, 0x4c, 0xdc, 0x5a, 0x54, 0xde, 0x92, 0x74, - 0x37, 0x13, 0x4a, 0xba, 0xea, 0xee, 0x26, 0xe4, 0x2c, 0x8f, 0x34, 0x79, 0xd6, 0x27, 0x7b, 0xd2, - 0x95, 0x52, 0x24, 0xfa, 0xbc, 0xa4, 0xcd, 0x5d, 0xe7, 0x04, 0x38, 0xe0, 0x51, 0x7f, 0x9f, 0xec, - 0x8e, 0x80, 0xd7, 0x23, 0xfa, 0x5e, 0x81, 0x35, 0x97, 0x5a, 0x0e, 0xb5, 0xbc, 0xa3, 0x2d, 0xd2, - 0x22, 0x8d, 0x4d, 0xc7, 0xde, 0xb7, 0x6a, 0x3e, 0x35, 0x78, 0x2a, 0x65, 0x50, 0x9b, 0x69, 0x9e, - 0x77, 0x87, 0x32, 0x60, 0xb2, 0x4f, 0x28, 0xb1, 0x4d, 0xa2, 0xab, 0xf2, 0x48, 0x6b, 0x23, 0xc0, - 0x23, 0x8e, 0x82, 0x3e, 0x02, 0xd4, 0x34, 0x3c, 0x9e, 0xd1, 0xda, 0x2e, 0x25, 0x26, 0xa9, 0x72, - 0x56, 0x51, 0x90, 0xb9, 0xb8, 0x3a, 0xb6, 0xfb, 0x10, 0x78, 0x80, 0x15, 0xfa, 0x4a, 0x81, 0xe5, - 0x6a, 0xff, 0x90, 0x91, 0x75, 0x79, 0x79, 0x9c, 0x44, 0x0f, 0x98, 0x51, 0xfa, 0x6a, 0xa7, 0x5d, - 0x5a, 0x1e, 0xa0, 0xc0, 0x83, 0x9c, 0xa1, 0x7b, 0x90, 0xa3, 0x7e, 0x83, 0xb0, 0x42, 0x56, 0x5c, - 0x6f, 0xaa, 0xd7, 0x5d, 0xa7, 0x61, 0x99, 0x47, 0x98, 0x9b, 0x7c, 0x62, 0x79, 0xf5, 0x3d, 0x5f, - 0xcc, 0x2a, 0x16, 0xdf, 0xb5, 0x50, 0xe1, 0x80, 0x54, 0x7d, 0x04, 0x4b, 0xbd, 0x43, 0x03, 0xd5, - 0x00, 0xcc, 0xb0, 0x4f, 0x59, 0x41, 0x11, 0x6e, 0x5f, 0x1b, 0xbf, 0xaa, 0xa2, 0x1e, 0x8f, 0xe7, - 0x65, 0x24, 0x62, 0xb8, 0x8b, 0x5a, 0x3d, 0x07, 0x73, 0xd7, 0xa8, 0xe3, 0xbb, 0xf2, 0x8c, 0x68, - 0x1d, 0xb2, 0xb6, 0xd1, 0x0c, 0xa7, 0x4f, 0x34, 0x11, 0x77, 0x8c, 0x26, 0xc1, 0x42, 0xa3, 0x7e, - 0xa7, 0xc0, 0xfc, 0x96, 0xd5, 0xb4, 0x3c, 0x4c, 0x98, 0xeb, 0xd8, 0x8c, 0xa0, 0x4b, 0x89, 0x89, - 0x75, 0xb2, 0x67, 0x62, 0x1d, 0x4b, 0x80, 0xbb, 0x66, 0xd5, 0x67, 0x30, 0xfd, 0xd0, 0x27, 0xbe, - 0x65, 0xd7, 0xe4, 0xbc, 0xbe, 0x98, 0x16, 0xe0, 0xad, 0x00, 0x9e, 0xa8, 0x36, 0x7d, 0x96, 0x8f, - 0x00, 0xa9, 0xc1, 0x21, 0xa3, 0xfa, 0x57, 0x06, 0x4e, 0x0a, 0xc7, 0xa4, 0x3a, 0xbc, 0x8a, 0xd1, - 0x3d, 0x28, 0x18, 0x8c, 0xf9, 0x94, 0x54, 0x37, 0x1d, 0xdb, 0xf4, 0x29, 0xaf, 0xff, 0xa3, 0xbd, - 0xba, 0x41, 0x09, 0x13, 0xd1, 0xe4, 0xf4, 0x75, 0x19, 0x4d, 0x61, 0x63, 0x08, 0x0e, 0x0f, 0x65, - 0x40, 0x0f, 0x60, 0xbe, 0xd1, 0x1d, 0xbb, 0x0c, 0xf3, 0x6c, 0x5a, 0x98, 0x89, 0x84, 0xe9, 0x2b, - 0xf2, 0x04, 0xc9, 0xa4, 0xe3, 0x24, 0x35, 0x7a, 0x1b, 0x16, 0x1b, 0xc4, 0xae, 0x1a, 0x95, 0x06, - 0xd9, 0x25, 0xd4, 0x24, 0xb6, 0x27, 0x5a, 0x24, 0xa7, 0x2f, 0x77, 0xda, 0xa5, 0xc5, 0xad, 0xa4, - 0x0a, 0xf7, 0x62, 0xd1, 0x4d, 0x58, 0xa9, 0x38, 0x94, 0x3a, 0x87, 0x96, 0x5d, 0x13, 0x7e, 0x42, - 0x92, 0xac, 0x20, 0xf9, 0x57, 0xa7, 0x5d, 0x5a, 0xd1, 0x07, 0x01, 0xf0, 0x60, 0x3b, 0xf5, 0x10, - 0x56, 0x76, 0xf8, 0x4c, 0x61, 0x8e, 0x4f, 0x4d, 0x12, 0x37, 0x04, 0x2a, 0x41, 0xae, 0x45, 0x68, - 0x25, 0x28, 0xea, 0xbc, 0x9e, 0xe7, 0xed, 0xf0, 0x31, 0x17, 0xe0, 0x40, 0xce, 0x23, 0xb1, 0x63, - 0xcb, 0x3b, 0x78, 0x8b, 0x15, 0xa6, 0x04, 0x54, 0x44, 0xb2, 0x93, 0x54, 0xe1, 0x5e, 0xac, 0xda, - 0xce, 0xc0, 0xea, 0x90, 0xfe, 0x43, 0x77, 0x60, 0x86, 0xc9, 0xbf, 0x65, 0x4f, 0x9d, 0x4a, 0xbb, - 0x0b, 0x69, 0x1b, 0x4f, 0xff, 0x90, 0x0c, 0x47, 0x54, 0xc8, 0x81, 0x79, 0x2a, 0x8f, 0x20, 0x7c, - 0xca, 0x57, 0xe0, 0x42, 0x1a, 0x77, 0x7f, 0x76, 0xe2, 0xcb, 0xc6, 0xdd, 0x84, 0x38, 0xc9, 0x8f, - 0x1e, 0xc1, 0x52, 0x57, 0xd8, 0x81, 0xcf, 0x49, 0xe1, 0xf3, 0x52, 0x9a, 0xcf, 0x81, 0x97, 0xa2, - 0x17, 0xa4, 0xdb, 0xa5, 0x9d, 0x1e, 0x5a, 0xdc, 0xe7, 0x48, 0xfd, 0x39, 0x03, 0x23, 0x1e, 0x86, - 0x57, 0xb0, 0xe4, 0xdd, 0x4f, 0x2c, 0x79, 0xef, 0xbc, 0xf8, 0x8b, 0x37, 0x74, 0xe9, 0xab, 0xf7, - 0x2c, 0x7d, 0xef, 0xbd, 0x84, 0x8f, 0xd1, 0x4b, 0xe0, 0x1f, 0x19, 0xf8, 0xf7, 0x70, 0xe3, 0x78, - 0x29, 0xbc, 0x91, 0x18, 0xb1, 0x97, 0x7b, 0x46, 0xec, 0xa9, 0x31, 0x28, 0xfe, 0x59, 0x12, 0x7b, - 0x96, 0xc4, 0x5f, 0x14, 0x28, 0x0e, 0xcf, 0xdb, 0x2b, 0x58, 0x1a, 0x3f, 0x4f, 0x2e, 0x8d, 0x6f, - 0xbe, 0x78, 0x91, 0x0d, 0x59, 0x22, 0xaf, 0x8d, 0xaa, 0xad, 0x68, 0xdd, 0x1b, 0xe3, 0xc9, 0xff, - 0x69, 0x64, 0xaa, 0xc4, 0x76, 0x9a, 0xf2, 0xab, 0x25, 0x61, 0xfd, 0xbe, 0xcd, 0x9f, 0x9e, 0x26, - 0x7f, 0x3d, 0x82, 0x82, 0xac, 0xc3, 0x74, 0x23, 0x78, 0xab, 0x65, 0x53, 0x6f, 0x8c, 0xf5, 0x44, - 0x8e, 0x7a, 0xda, 0x83, 0xb5, 0x40, 0xc2, 0x70, 0x48, 0xaf, 0x7e, 0xab, 0xc0, 0x7a, 0x5a, 0xb3, - 0xa2, 0xc3, 0x01, 0xcb, 0xd7, 0x4b, 0x2c, 0xd6, 0xe3, 0x2f, 0x63, 0x3f, 0x28, 0x70, 0x7c, 0xd0, - 0x8e, 0xc3, 0xcb, 0x9f, 0x2f, 0x36, 0xd1, 0x56, 0x12, 0x95, 0xff, 0x2d, 0x21, 0xc5, 0x52, 0x8b, - 0xce, 0xc0, 0x4c, 0xdd, 0xb0, 0xab, 0x7b, 0xd6, 0x17, 0xe1, 0xbe, 0x1d, 0x15, 0xe0, 0x87, 0x52, - 0x8e, 0x23, 0x04, 0xba, 0x0a, 0x4b, 0xc2, 0x6e, 0x8b, 0xd8, 0x35, 0xaf, 0x2e, 0x72, 0x25, 0x97, - 0x86, 0xe8, 0x3d, 0xb8, 0xd5, 0xa3, 0xc7, 0x7d, 0x16, 0xea, 0x9f, 0x0a, 0xa0, 0x17, 0x79, 0xe7, - 0x4f, 0x43, 0xde, 0x70, 0x2d, 0xb1, 0x7c, 0x06, 0x2d, 0x90, 0xd7, 0xe7, 0x3b, 0xed, 0x52, 0x7e, - 0x63, 0xf7, 0x7a, 0x20, 0xc4, 0xb1, 0x9e, 0x83, 0xc3, 0x27, 0x30, 0x78, 0xea, 0x24, 0x38, 0x74, - 0xcc, 0x70, 0xac, 0x47, 0x57, 0x60, 0xce, 0x6c, 0xf8, 0xcc, 0x23, 0x74, 0xcf, 0x74, 0x5c, 0x22, - 0x46, 0xc6, 0x8c, 0x7e, 0x5c, 0xc6, 0x34, 0xb7, 0xd9, 0xa5, 0xc3, 0x09, 0x24, 0xd2, 0x00, 0x78, - 0xc1, 0x33, 0xd7, 0xe0, 0x7e, 0x72, 0xc2, 0xcf, 0x02, 0xbf, 0xb0, 0x9d, 0x48, 0x8a, 0xbb, 0x10, - 0xea, 0x03, 0x58, 0xd9, 0x23, 0xb4, 0x65, 0x99, 0x64, 0xc3, 0x34, 0x1d, 0xdf, 0xf6, 0xc2, 0x35, - 0xba, 0x0c, 0xf9, 0x08, 0x26, 0x7b, 0xe2, 0x98, 0xf4, 0x9f, 0x8f, 0xb8, 0x70, 0x8c, 0x89, 0x9a, - 0x30, 0x33, 0xbc, 0x09, 0x33, 0x30, 0x1d, 0xd3, 0x67, 0x0f, 0x2c, 0xbb, 0x2a, 0x99, 0x4f, 0x84, - 0xe8, 0x1b, 0x96, 0x5d, 0x7d, 0xde, 0x2e, 0xcd, 0x4a, 0x18, 0xff, 0xc4, 0x02, 0x88, 0xae, 0x43, - 0xd6, 0x67, 0x84, 0xca, 0xf6, 0x3a, 0x9d, 0x56, 0xcc, 0x77, 0x18, 0xa1, 0xe1, 0xe6, 0x33, 0xc3, - 0x99, 0xb9, 0x00, 0x0b, 0x0a, 0xb4, 0x0d, 0xb9, 0x1a, 0xbf, 0x14, 0x39, 0xf5, 0xcf, 0xa4, 0x71, - 0x75, 0xff, 0xbc, 0x08, 0xca, 0x40, 0x48, 0x70, 0xc0, 0x82, 0x1e, 0xc2, 0x02, 0x4b, 0xa4, 0x50, - 0x5c, 0xd7, 0x18, 0x9b, 0xcc, 0xc0, 0xc4, 0xeb, 0xa8, 0xd3, 0x2e, 0x2d, 0x24, 0x55, 0xb8, 0xc7, - 0x81, 0x5a, 0x86, 0xd9, 0xae, 0x00, 0xd3, 0xe7, 0x9f, 0x7e, 0xf5, 0xf1, 0xb3, 0xe2, 0xc4, 0x93, - 0x67, 0xc5, 0x89, 0xa7, 0xcf, 0x8a, 0x13, 0x5f, 0x76, 0x8a, 0xca, 0xe3, 0x4e, 0x51, 0x79, 0xd2, - 0x29, 0x2a, 0x4f, 0x3b, 0x45, 0xe5, 0xd7, 0x4e, 0x51, 0xf9, 0xfa, 0xb7, 0xe2, 0xc4, 0xdd, 0xe2, - 0xe8, 0xff, 0x33, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x6d, 0x6e, 0x75, 0xa1, 0x14, 0x00, - 0x00, + // 1614 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x73, 0xdb, 0xc4, + 0x17, 0x8f, 0x1c, 0x3b, 0x89, 0x5f, 0x7e, 0x76, 0xd3, 0x4c, 0xfc, 0x4d, 0xbf, 0x63, 0xa7, 0x62, + 0x86, 0x02, 0x6d, 0xe5, 0xb6, 0xb4, 0xb4, 0xc0, 0xf0, 0x23, 0x4a, 0x4b, 0x29, 0x4d, 0xd2, 0x74, + 0xd3, 0x42, 0xa7, 0x74, 0x86, 0xca, 0xf2, 0xc6, 0x56, 0x63, 0x4b, 0xea, 0xae, 0xe4, 0x10, 0x7a, + 0x61, 0xf8, 0x0b, 0x38, 0xc3, 0x91, 0x03, 0x27, 0x2e, 0x5c, 0x39, 0x70, 0xa4, 0xc3, 0xa9, 0xc7, + 0x9e, 0x0c, 0x35, 0x27, 0xfe, 0x03, 0xe8, 0x0c, 0x33, 0xcc, 0xae, 0xd6, 0x92, 0xe5, 0x5f, 0xf2, + 0xb4, 0x33, 0x3d, 0x71, 0x8b, 0xde, 0xfb, 0xbc, 0xcf, 0xdb, 0x7d, 0xfb, 0x7e, 0x39, 0x70, 0x79, + 0xef, 0x02, 0xd3, 0x2c, 0xa7, 0xb8, 0xe7, 0x97, 0x08, 0xb5, 0x89, 0x47, 0x58, 0xb1, 0x41, 0xec, + 0xb2, 0x43, 0x8b, 0x52, 0x61, 0xb8, 0x56, 0x71, 0xb7, 0xe6, 0xec, 0x9b, 0x8e, 0xed, 0x51, 0xa7, + 0x56, 0x6c, 0x9c, 0x2e, 0x11, 0xcf, 0x38, 0x5d, 0xac, 0x10, 0x9b, 0x50, 0xc3, 0x23, 0x65, 0xcd, + 0xa5, 0x8e, 0xe7, 0xa0, 0x7c, 0x80, 0xd7, 0x0c, 0xd7, 0xd2, 0x3a, 0xf0, 0x9a, 0xc4, 0xaf, 0x9c, + 0xac, 0x58, 0x5e, 0xd5, 0x2f, 0x69, 0xa6, 0x53, 0x2f, 0x56, 0x9c, 0x8a, 0x53, 0x14, 0x66, 0x25, + 0x7f, 0x57, 0x7c, 0x89, 0x0f, 0xf1, 0x57, 0x40, 0xb7, 0x72, 0x36, 0x72, 0x5f, 0x37, 0xcc, 0xaa, + 0x65, 0x13, 0x7a, 0x50, 0x74, 0xf7, 0x2a, 0x5c, 0xc0, 0x8a, 0x75, 0xe2, 0x19, 0xc5, 0x46, 0xcf, + 0x21, 0x56, 0x8a, 0x83, 0xac, 0xa8, 0x6f, 0x7b, 0x56, 0x9d, 0xf4, 0x18, 0xbc, 0x91, 0x64, 0xc0, + 0xcc, 0x2a, 0xa9, 0x1b, 0xdd, 0x76, 0xea, 0x4f, 0x0a, 0xac, 0x5e, 0xfa, 0x9c, 0xd4, 0x5d, 0x6f, + 0x9b, 0x5a, 0x0e, 0xb5, 0xbc, 0x83, 0x0d, 0xd2, 0x20, 0xb5, 0x75, 0xc7, 0xde, 0xb5, 0x2a, 0x3e, + 0x35, 0x3c, 0xcb, 0xb1, 0xd1, 0x2d, 0xc8, 0xd9, 0x4e, 0xdd, 0xb2, 0x0d, 0x2e, 0x37, 0x7d, 0x4a, + 0x89, 0x6d, 0x1e, 0xec, 0x54, 0x0d, 0x4a, 0x58, 0x4e, 0x59, 0x55, 0x5e, 0xc9, 0xe8, 0xff, 0x6f, + 0x35, 0x0b, 0xb9, 0xad, 0x01, 0x18, 0x3c, 0xd0, 0x1a, 0xbd, 0x03, 0xf3, 0x35, 0x62, 0x97, 0x8d, + 0x52, 0x8d, 0x6c, 0x13, 0x6a, 0x12, 0xdb, 0xcb, 0xa5, 0x04, 0xe1, 0x62, 0xab, 0x59, 0x98, 0xdf, + 0x88, 0xab, 0x70, 0x37, 0x56, 0xbd, 0x0d, 0xcb, 0x1f, 0xd4, 0x9c, 0xfd, 0x8b, 0x16, 0xf3, 0x2c, + 0xbb, 0xe2, 0x5b, 0xac, 0x4a, 0xe8, 0x26, 0xf1, 0xaa, 0x4e, 0x19, 0xbd, 0x07, 0x69, 0xef, 0xc0, + 0x25, 0xe2, 0x7c, 0x59, 0xfd, 0xf8, 0xc3, 0x66, 0x61, 0xac, 0xd5, 0x2c, 0xa4, 0x6f, 0x1c, 0xb8, + 0xe4, 0x69, 0xb3, 0x70, 0x64, 0x80, 0x19, 0x57, 0x63, 0x61, 0xa8, 0x7e, 0x93, 0x02, 0xe0, 0xa8, + 0x1d, 0x11, 0x38, 0x74, 0x17, 0xa6, 0xf8, 0x63, 0x95, 0x0d, 0xcf, 0x10, 0x9c, 0xd3, 0x67, 0x4e, + 0x69, 0x51, 0xa6, 0x84, 0x31, 0xd7, 0xdc, 0xbd, 0x0a, 0x17, 0x30, 0x8d, 0xa3, 0xb5, 0xc6, 0x69, + 0xed, 0x5a, 0xe9, 0x1e, 0x31, 0xbd, 0x4d, 0xe2, 0x19, 0x3a, 0x92, 0xa7, 0x80, 0x48, 0x86, 0x43, + 0x56, 0xb4, 0x0d, 0x69, 0xe6, 0x12, 0x53, 0x04, 0x60, 0xfa, 0x8c, 0xa6, 0x0d, 0xcf, 0x43, 0x2d, + 0x3a, 0xdb, 0x8e, 0x4b, 0x4c, 0x7d, 0xa6, 0x7d, 0x43, 0xfe, 0x85, 0x05, 0x13, 0xba, 0x05, 0x13, + 0xcc, 0x33, 0x3c, 0x9f, 0xe5, 0xc6, 0x7b, 0x4e, 0x9c, 0xc4, 0x29, 0xec, 0xf4, 0x39, 0xc9, 0x3a, + 0x11, 0x7c, 0x63, 0xc9, 0xa7, 0x3e, 0x4e, 0xc1, 0x62, 0x04, 0x5e, 0x77, 0xec, 0xb2, 0x25, 0x32, + 0xe5, 0xed, 0x58, 0xd4, 0x8f, 0x75, 0x45, 0x7d, 0xb9, 0x8f, 0x49, 0x14, 0x71, 0xf4, 0x66, 0x78, + 0xdc, 0x94, 0x30, 0x3f, 0x1a, 0x77, 0xfe, 0xb4, 0x59, 0x98, 0x0f, 0xcd, 0xe2, 0xe7, 0x41, 0x0d, + 0x40, 0x35, 0x83, 0x79, 0x37, 0xa8, 0x61, 0xb3, 0x80, 0xd6, 0xaa, 0x13, 0x79, 0xeb, 0xd7, 0x46, + 0x7b, 0x27, 0x6e, 0xa1, 0xaf, 0x48, 0x97, 0x68, 0xa3, 0x87, 0x0d, 0xf7, 0xf1, 0x80, 0x5e, 0x86, + 0x09, 0x4a, 0x0c, 0xe6, 0xd8, 0xb9, 0xb4, 0x38, 0x72, 0x18, 0x2f, 0x2c, 0xa4, 0x58, 0x6a, 0xd1, + 0xab, 0x30, 0x59, 0x27, 0x8c, 0x19, 0x15, 0x92, 0xcb, 0x08, 0xe0, 0xbc, 0x04, 0x4e, 0x6e, 0x06, + 0x62, 0xdc, 0xd6, 0xab, 0x3f, 0x2b, 0x30, 0x17, 0xc5, 0x69, 0xc3, 0x62, 0x1e, 0xba, 0xd3, 0x93, + 0x7b, 0xda, 0x68, 0x77, 0xe2, 0xd6, 0x22, 0xf3, 0x16, 0xa4, 0xbb, 0xa9, 0xb6, 0xa4, 0x23, 0xef, + 0xae, 0x41, 0xc6, 0xf2, 0x48, 0x9d, 0x47, 0x7d, 0xbc, 0x2b, 0x5c, 0x09, 0x49, 0xa2, 0xcf, 0x4a, + 0xda, 0xcc, 0x15, 0x4e, 0x80, 0x03, 0x1e, 0xf5, 0xcf, 0xf1, 0xce, 0x1b, 0xf0, 0x7c, 0x44, 0xdf, + 0x2b, 0xb0, 0xe2, 0x0e, 0x6c, 0x30, 0xf2, 0x52, 0xeb, 0x49, 0x9e, 0x07, 0xb7, 0x28, 0x4c, 0x76, + 0x09, 0xef, 0x2b, 0x44, 0x57, 0xe5, 0x91, 0x56, 0x86, 0x80, 0x87, 0x1c, 0x05, 0x7d, 0x04, 0xa8, + 0x6e, 0x78, 0x3c, 0xa2, 0x95, 0x6d, 0x4a, 0x4c, 0x52, 0xe6, 0xac, 0xb2, 0x29, 0x85, 0xd9, 0xb1, + 0xd9, 0x83, 0xc0, 0x7d, 0xac, 0xd0, 0x57, 0x0a, 0x2c, 0x96, 0x7b, 0x9b, 0x8c, 0xcc, 0xcb, 0xf3, + 0xa3, 0x04, 0xba, 0x4f, 0x8f, 0xd2, 0x97, 0x5b, 0xcd, 0xc2, 0x62, 0x1f, 0x05, 0xee, 0xe7, 0x0c, + 0xdd, 0x81, 0x0c, 0xf5, 0x6b, 0x84, 0xe5, 0xd2, 0xe2, 0x79, 0x13, 0xbd, 0x6e, 0x3b, 0x35, 0xcb, + 0x3c, 0xc0, 0xdc, 0xe4, 0x13, 0xcb, 0xab, 0xee, 0xf8, 0xa2, 0x57, 0xb1, 0xe8, 0xad, 0x85, 0x0a, + 0x07, 0xa4, 0xea, 0x03, 0x58, 0xe8, 0x6e, 0x1a, 0xa8, 0x02, 0x60, 0xb6, 0xeb, 0x94, 0x0f, 0x08, + 0xee, 0xf6, 0xf5, 0xd1, 0xb3, 0x2a, 0xac, 0xf1, 0xa8, 0x5f, 0x86, 0x22, 0x86, 0x3b, 0xa8, 0xd5, + 0x53, 0x30, 0x73, 0x99, 0x3a, 0xbe, 0x2b, 0xcf, 0x88, 0x56, 0x21, 0x6d, 0x1b, 0xf5, 0x76, 0xf7, + 0x09, 0x3b, 0xe2, 0x96, 0x51, 0x27, 0x58, 0x68, 0xd4, 0xef, 0x14, 0x98, 0xdd, 0xb0, 0xea, 0x96, + 0x87, 0x09, 0x73, 0x1d, 0x9b, 0x11, 0x74, 0x2e, 0xd6, 0xb1, 0x8e, 0x76, 0x75, 0xac, 0x43, 0x31, + 0x70, 0x47, 0xaf, 0xfa, 0x14, 0x26, 0xef, 0xfb, 0xc4, 0xb7, 0xec, 0x8a, 0xec, 0xd7, 0x67, 0x93, + 0x2e, 0x78, 0x3d, 0x80, 0xc7, 0xb2, 0x4d, 0x9f, 0xe6, 0x2d, 0x40, 0x6a, 0x70, 0x9b, 0x51, 0xfd, + 0x27, 0x05, 0x47, 0x85, 0x63, 0x52, 0x1e, 0x32, 0x95, 0xef, 0x40, 0xce, 0x60, 0xcc, 0xa7, 0xa4, + 0x3c, 0x68, 0x2a, 0xaf, 0xca, 0xdb, 0xe4, 0xd6, 0x06, 0xe0, 0xf0, 0x40, 0x06, 0x74, 0x0f, 0x66, + 0x6b, 0x9d, 0x77, 0x97, 0xd7, 0x3c, 0x99, 0x74, 0xcd, 0x58, 0xc0, 0xf4, 0x25, 0x79, 0x82, 0x78, + 0xd0, 0x71, 0x9c, 0xba, 0xdf, 0x16, 0x30, 0x3e, 0xfa, 0x16, 0x80, 0xae, 0xc1, 0x52, 0xc9, 0xa1, + 0xd4, 0xd9, 0xb7, 0xec, 0x8a, 0xf0, 0xd3, 0x26, 0x49, 0x0b, 0x92, 0xff, 0xb5, 0x9a, 0x85, 0x25, + 0xbd, 0x1f, 0x00, 0xf7, 0xb7, 0x53, 0xf7, 0x61, 0x69, 0x8b, 0xf7, 0x14, 0xe6, 0xf8, 0xd4, 0x24, + 0x51, 0x41, 0xa0, 0x02, 0x64, 0x1a, 0x84, 0x96, 0x82, 0xa4, 0xce, 0xea, 0x59, 0x5e, 0x0e, 0x1f, + 0x73, 0x01, 0x0e, 0xe4, 0xfc, 0x26, 0x76, 0x64, 0x79, 0x13, 0x6f, 0xb0, 0xdc, 0x84, 0x80, 0x8a, + 0x9b, 0x6c, 0xc5, 0x55, 0xb8, 0x1b, 0xab, 0x36, 0x53, 0xb0, 0x3c, 0xa0, 0xfe, 0xd0, 0x4d, 0x98, + 0x62, 0xf2, 0x6f, 0x59, 0x53, 0xc7, 0x92, 0xde, 0x42, 0xda, 0x46, 0xdd, 0xbf, 0x4d, 0x86, 0x43, + 0x2a, 0xe4, 0xc0, 0x2c, 0x95, 0x47, 0x10, 0x3e, 0xe5, 0x14, 0x38, 0x93, 0xc4, 0xdd, 0x1b, 0x9d, + 0xe8, 0xb1, 0x71, 0x27, 0x21, 0x8e, 0xf3, 0xa3, 0x07, 0xb0, 0xd0, 0x71, 0xed, 0xc0, 0xe7, 0xb8, + 0xf0, 0x79, 0x2e, 0xc9, 0x67, 0xdf, 0x47, 0xd1, 0x73, 0xd2, 0xed, 0xc2, 0x56, 0x17, 0x2d, 0xee, + 0x71, 0xa4, 0xfe, 0x9a, 0x82, 0x21, 0x83, 0xe1, 0x05, 0x2c, 0x79, 0x77, 0x63, 0x4b, 0xde, 0xbb, + 0xcf, 0x3e, 0xf1, 0x06, 0x2e, 0x7d, 0xd5, 0xae, 0xa5, 0xef, 0xfd, 0xe7, 0xf0, 0x31, 0x7c, 0x09, + 0xfc, 0x2b, 0x05, 0x2f, 0x0d, 0x36, 0x8e, 0x96, 0xc2, 0xab, 0xb1, 0x16, 0x7b, 0xbe, 0xab, 0xc5, + 0x1e, 0x1b, 0x81, 0xe2, 0xbf, 0x25, 0xb1, 0x6b, 0x49, 0xfc, 0x4d, 0x81, 0xfc, 0xe0, 0xb8, 0xbd, + 0x80, 0xa5, 0xf1, 0xb3, 0xf8, 0xd2, 0xf8, 0xd6, 0xb3, 0x27, 0xd9, 0x80, 0x25, 0xf2, 0xf2, 0xb0, + 0xdc, 0x0a, 0xd7, 0xbd, 0x11, 0x46, 0xfe, 0x0f, 0xa9, 0x61, 0xa1, 0x12, 0xdb, 0x69, 0xc2, 0xaf, + 0x96, 0x98, 0xf5, 0x25, 0x9b, 0x8f, 0x9e, 0x3a, 0x9f, 0x1e, 0x41, 0x42, 0x56, 0x61, 0xb2, 0x16, + 0xcc, 0x6a, 0x59, 0xd4, 0x6b, 0x23, 0x8d, 0xc8, 0x61, 0xa3, 0x3d, 0x58, 0x0b, 0x24, 0x0c, 0xb7, + 0xe9, 0x51, 0x19, 0x26, 0x88, 0xf8, 0xa9, 0x3e, 0x6a, 0x65, 0x27, 0xfd, 0xb0, 0xd7, 0x81, 0x67, + 0x61, 0x80, 0xc2, 0x92, 0x5b, 0xfd, 0x56, 0x81, 0xd5, 0xa4, 0x96, 0x80, 0xf6, 0xfb, 0xac, 0x78, + 0xcf, 0xb1, 0xbe, 0x8f, 0xbe, 0xf2, 0xfd, 0xa8, 0xc0, 0xe1, 0x7e, 0x9b, 0x14, 0x2f, 0x32, 0xbe, + 0x3e, 0x85, 0xbb, 0x4f, 0x58, 0x64, 0xd7, 0x85, 0x14, 0x4b, 0x2d, 0x3a, 0x01, 0x53, 0x55, 0xc3, + 0x2e, 0xef, 0x58, 0x5f, 0xb4, 0xb7, 0xfa, 0x30, 0xcd, 0x3f, 0x94, 0x72, 0x1c, 0x22, 0xd0, 0x45, + 0x58, 0x10, 0x76, 0x1b, 0xc4, 0xae, 0x78, 0x55, 0xf1, 0x22, 0x72, 0x35, 0x09, 0xa7, 0xce, 0xf5, + 0x2e, 0x3d, 0xee, 0xb1, 0x50, 0xff, 0x56, 0x00, 0x3d, 0xcb, 0x36, 0x71, 0x1c, 0xb2, 0x86, 0x6b, + 0x89, 0x15, 0x37, 0x28, 0xb4, 0xac, 0x3e, 0xdb, 0x6a, 0x16, 0xb2, 0x6b, 0xdb, 0x57, 0x02, 0x21, + 0x8e, 0xf4, 0x1c, 0xdc, 0x1e, 0xb4, 0xc1, 0x40, 0x95, 0xe0, 0xb6, 0x63, 0x86, 0x23, 0x3d, 0xba, + 0x00, 0x33, 0x66, 0xcd, 0x67, 0x1e, 0xa1, 0x3b, 0xa6, 0xe3, 0x12, 0xd1, 0x98, 0xa6, 0xf4, 0xc3, + 0xf2, 0x4e, 0x33, 0xeb, 0x1d, 0x3a, 0x1c, 0x43, 0x22, 0x0d, 0x80, 0x97, 0x15, 0x73, 0x0d, 0xee, + 0x27, 0x23, 0xfc, 0xcc, 0xf1, 0x07, 0xdb, 0x0a, 0xa5, 0xb8, 0x03, 0xa1, 0xde, 0x83, 0xa5, 0x1d, + 0x42, 0x1b, 0x96, 0x49, 0xd6, 0x4c, 0xd3, 0xf1, 0x6d, 0xaf, 0xbd, 0xac, 0x17, 0x21, 0x1b, 0xc2, + 0x64, 0xe5, 0x1d, 0x92, 0xfe, 0xb3, 0x21, 0x17, 0x8e, 0x30, 0x61, 0xa9, 0xa7, 0x06, 0x96, 0xfa, + 0x2f, 0x29, 0x98, 0x8c, 0xe8, 0xd3, 0x7b, 0x96, 0x5d, 0x96, 0xcc, 0x47, 0xda, 0xe8, 0xab, 0x96, + 0x5d, 0x7e, 0xda, 0x2c, 0x4c, 0x4b, 0x18, 0xff, 0xc4, 0x02, 0x88, 0xae, 0x40, 0xda, 0x67, 0x84, + 0xca, 0x22, 0x3e, 0x9e, 0x94, 0xcc, 0x37, 0x19, 0xa1, 0xed, 0xfd, 0x6a, 0x8a, 0x33, 0x73, 0x01, + 0x16, 0x14, 0x68, 0x13, 0x32, 0x15, 0xfe, 0x28, 0xb2, 0x4e, 0x4f, 0x24, 0x71, 0x75, 0xfe, 0x88, + 0x09, 0xd2, 0x40, 0x48, 0x70, 0xc0, 0x82, 0xee, 0xc3, 0x1c, 0x8b, 0x85, 0x50, 0x3c, 0xd7, 0x08, + 0xfb, 0x52, 0xdf, 0xc0, 0xeb, 0xa8, 0xd5, 0x2c, 0xcc, 0xc5, 0x55, 0xb8, 0xcb, 0x81, 0x5a, 0x84, + 0xe9, 0x8e, 0x0b, 0x26, 0x77, 0x59, 0xfd, 0xe2, 0xc3, 0x27, 0xf9, 0xb1, 0x47, 0x4f, 0xf2, 0x63, + 0x8f, 0x9f, 0xe4, 0xc7, 0xbe, 0x6c, 0xe5, 0x95, 0x87, 0xad, 0xbc, 0xf2, 0xa8, 0x95, 0x57, 0x1e, + 0xb7, 0xf2, 0xca, 0xef, 0xad, 0xbc, 0xf2, 0xf5, 0x1f, 0xf9, 0xb1, 0xdb, 0xf9, 0xe1, 0xff, 0x8b, + 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xda, 0x82, 0x48, 0xc5, 0x15, 0x00, 0x00, +} + +func (m *ExemptPriorityLevelConfiguration) 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 *ExemptPriorityLevelConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExemptPriorityLevelConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.LendablePercent != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.LendablePercent)) + i-- + dAtA[i] = 0x10 + } + if m.NominalConcurrencyShares != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.NominalConcurrencyShares)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *FlowDistinguisherMethod) Marshal() (dAtA []byte, err error) { @@ -1491,6 +1556,18 @@ func (m *PriorityLevelConfigurationSpec) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.Exempt != nil { + { + size, err := m.Exempt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if m.Limited != nil { { size, err := m.Limited.MarshalToSizedBuffer(dAtA[:i]) @@ -1783,6 +1860,21 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *ExemptPriorityLevelConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NominalConcurrencyShares != nil { + n += 1 + sovGenerated(uint64(*m.NominalConcurrencyShares)) + } + if m.LendablePercent != nil { + n += 1 + sovGenerated(uint64(*m.LendablePercent)) + } + return n +} + func (m *FlowDistinguisherMethod) Size() (n int) { if m == nil { return 0 @@ -2048,6 +2140,10 @@ func (m *PriorityLevelConfigurationSpec) Size() (n int) { l = m.Limited.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Exempt != nil { + l = m.Exempt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2165,6 +2261,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *ExemptPriorityLevelConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExemptPriorityLevelConfiguration{`, + `NominalConcurrencyShares:` + valueToStringGenerated(this.NominalConcurrencyShares) + `,`, + `LendablePercent:` + valueToStringGenerated(this.LendablePercent) + `,`, + `}`, + }, "") + return s +} func (this *FlowDistinguisherMethod) String() string { if this == nil { return "nil" @@ -2381,6 +2488,7 @@ func (this *PriorityLevelConfigurationSpec) String() string { s := strings.Join([]string{`&PriorityLevelConfigurationSpec{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Limited:` + strings.Replace(this.Limited.String(), "LimitedPriorityLevelConfiguration", "LimitedPriorityLevelConfiguration", 1) + `,`, + `Exempt:` + strings.Replace(this.Exempt.String(), "ExemptPriorityLevelConfiguration", "ExemptPriorityLevelConfiguration", 1) + `,`, `}`, }, "") return s @@ -2468,6 +2576,96 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *ExemptPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NominalConcurrencyShares", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NominalConcurrencyShares = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LendablePercent", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.LendablePercent = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4547,6 +4745,42 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exempt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exempt == nil { + m.Exempt = &ExemptPriorityLevelConfiguration{} + } + if err := m.Exempt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto index 98bfabe9c..96df0ace7 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto @@ -28,6 +28,40 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/flowcontrol/v1beta1"; +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +message ExemptPriorityLevelConfiguration { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + optional int32 nominalConcurrencyShares = 1; + + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + optional int32 lendablePercent = 2; +} + // FlowDistinguisherMethod specifies the method of a flow distinguisher. message FlowDistinguisherMethod { // `type` is the type of flow distinguisher method @@ -332,6 +366,14 @@ message PriorityLevelConfigurationSpec { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional optional LimitedPriorityLevelConfiguration limited = 2; + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + optional ExemptPriorityLevelConfiguration exempt = 3; } // PriorityLevelConfigurationStatus represents the current state of a "request-priority". diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types.go index c3b7f607a..9e05ff1a0 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types.go @@ -77,7 +77,9 @@ const ( // is a boolean false or has an invalid boolean representation // (if the cluster operator sets it to 'false' it will be stomped) // - any changes to the spec made by the cluster operator will be - // stomped. + // stomped, except for changes to the `nominalConcurrencyShares` + // and `lendablePercent` fields of the PriorityLevelConfiguration + // named "exempt". // // The kube-apiserver will apply updates on the suggested configuration if: // - the cluster operator has enabled auto-update by setting the annotation @@ -435,6 +437,14 @@ type PriorityLevelConfigurationSpec struct { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional Limited *LimitedPriorityLevelConfiguration `json:"limited,omitempty" protobuf:"bytes,2,opt,name=limited"` + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + Exempt *ExemptPriorityLevelConfiguration `json:"exempt,omitempty" protobuf:"bytes,3,opt,name=exempt"` } // PriorityLevelEnablement indicates whether limits on execution are enabled for the priority level @@ -505,6 +515,43 @@ type LimitedPriorityLevelConfiguration struct { BorrowingLimitPercent *int32 `json:"borrowingLimitPercent,omitempty" protobuf:"varint,4,opt,name=borrowingLimitPercent"` } +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +type ExemptPriorityLevelConfiguration struct { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty" protobuf:"varint,1,opt,name=nominalConcurrencyShares"` + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + LendablePercent *int32 `json:"lendablePercent,omitempty" protobuf:"varint,2,opt,name=lendablePercent"` + // The `BorrowingCL` of an Exempt priority level is implicitly `ServerCL`. + // In other words, an exempt priority level + // has no meaningful limit on how much it borrows. + // There is no explicit representation of that here. +} + // LimitResponse defines how to handle requests that can not be executed right now. // +union type LimitResponse struct { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go index fc08e128d..1405f3c3c 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go @@ -27,6 +27,16 @@ package v1beta1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ExemptPriorityLevelConfiguration = map[string]string{ + "": "ExemptPriorityLevelConfiguration describes the configurable aspects of the handling of exempt requests. In the mandatory exempt configuration object the values in the fields here can be modified by authorized users, unlike the rest of the `spec`.", + "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats nominally reserved for this priority level. This DOES NOT limit the dispatching from this priority level but affects the other priority levels through the borrowing mechanism. The server's concurrency limit (ServerCL) is divided among all the priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other priority level. This field has a default value of zero.", + "lendablePercent": "`lendablePercent` prescribes the fraction of the level's NominalCL that can be borrowed by other priority levels. This value of this field must be between 0 and 100, inclusive, and it defaults to 0. The number of seats that other levels can borrow from this level, known as this level's LendableConcurrencyLimit (LendableCL), is defined as follows.\n\nLendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 )", +} + +func (ExemptPriorityLevelConfiguration) SwaggerDoc() map[string]string { + return map_ExemptPriorityLevelConfiguration +} + var map_FlowDistinguisherMethod = map[string]string{ "": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "type": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", @@ -190,6 +200,7 @@ var map_PriorityLevelConfigurationSpec = map[string]string{ "": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", "type": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", "limited": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`.", + "exempt": "`exempt` specifies how requests are handled for an exempt priority level. This field MUST be empty if `type` is `\"Limited\"`. This field MAY be non-empty if `type` is `\"Exempt\"`. If empty and `type` is `\"Exempt\"` then the default values for `ExemptPriorityLevelConfiguration` apply.", } func (PriorityLevelConfigurationSpec) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/zz_generated.deepcopy.go index 027c3057f..965d5e55a 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta1/zz_generated.deepcopy.go @@ -25,6 +25,32 @@ import ( 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 *ExemptPriorityLevelConfiguration) DeepCopyInto(out *ExemptPriorityLevelConfiguration) { + *out = *in + if in.NominalConcurrencyShares != nil { + in, out := &in.NominalConcurrencyShares, &out.NominalConcurrencyShares + *out = new(int32) + **out = **in + } + if in.LendablePercent != nil { + in, out := &in.LendablePercent, &out.LendablePercent + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExemptPriorityLevelConfiguration. +func (in *ExemptPriorityLevelConfiguration) DeepCopy() *ExemptPriorityLevelConfiguration { + if in == nil { + return nil + } + out := new(ExemptPriorityLevelConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlowDistinguisherMethod) DeepCopyInto(out *FlowDistinguisherMethod) { *out = *in @@ -400,6 +426,11 @@ func (in *PriorityLevelConfigurationSpec) DeepCopyInto(out *PriorityLevelConfigu *out = new(LimitedPriorityLevelConfiguration) (*in).DeepCopyInto(*out) } + if in.Exempt != nil { + in, out := &in.Exempt, &out.Exempt + *out = new(ExemptPriorityLevelConfiguration) + (*in).DeepCopyInto(*out) + } return } diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.pb.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.pb.go index b4c8f958f..7f8ee0850 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.pb.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.pb.go @@ -43,10 +43,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ExemptPriorityLevelConfiguration) Reset() { *m = ExemptPriorityLevelConfiguration{} } +func (*ExemptPriorityLevelConfiguration) ProtoMessage() {} +func (*ExemptPriorityLevelConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_ed300aa8e672704e, []int{0} +} +func (m *ExemptPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExemptPriorityLevelConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExemptPriorityLevelConfiguration.Merge(m, src) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ExemptPriorityLevelConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ExemptPriorityLevelConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ExemptPriorityLevelConfiguration proto.InternalMessageInfo + func (m *FlowDistinguisherMethod) Reset() { *m = FlowDistinguisherMethod{} } func (*FlowDistinguisherMethod) ProtoMessage() {} func (*FlowDistinguisherMethod) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{0} + return fileDescriptor_ed300aa8e672704e, []int{1} } func (m *FlowDistinguisherMethod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +102,7 @@ var xxx_messageInfo_FlowDistinguisherMethod proto.InternalMessageInfo func (m *FlowSchema) Reset() { *m = FlowSchema{} } func (*FlowSchema) ProtoMessage() {} func (*FlowSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{1} + return fileDescriptor_ed300aa8e672704e, []int{2} } func (m *FlowSchema) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +130,7 @@ var xxx_messageInfo_FlowSchema proto.InternalMessageInfo func (m *FlowSchemaCondition) Reset() { *m = FlowSchemaCondition{} } func (*FlowSchemaCondition) ProtoMessage() {} func (*FlowSchemaCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{2} + return fileDescriptor_ed300aa8e672704e, []int{3} } func (m *FlowSchemaCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +158,7 @@ var xxx_messageInfo_FlowSchemaCondition proto.InternalMessageInfo func (m *FlowSchemaList) Reset() { *m = FlowSchemaList{} } func (*FlowSchemaList) ProtoMessage() {} func (*FlowSchemaList) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{3} + return fileDescriptor_ed300aa8e672704e, []int{4} } func (m *FlowSchemaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +186,7 @@ var xxx_messageInfo_FlowSchemaList proto.InternalMessageInfo func (m *FlowSchemaSpec) Reset() { *m = FlowSchemaSpec{} } func (*FlowSchemaSpec) ProtoMessage() {} func (*FlowSchemaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{4} + return fileDescriptor_ed300aa8e672704e, []int{5} } func (m *FlowSchemaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +214,7 @@ var xxx_messageInfo_FlowSchemaSpec proto.InternalMessageInfo func (m *FlowSchemaStatus) Reset() { *m = FlowSchemaStatus{} } func (*FlowSchemaStatus) ProtoMessage() {} func (*FlowSchemaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{5} + return fileDescriptor_ed300aa8e672704e, []int{6} } func (m *FlowSchemaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +242,7 @@ var xxx_messageInfo_FlowSchemaStatus proto.InternalMessageInfo func (m *GroupSubject) Reset() { *m = GroupSubject{} } func (*GroupSubject) ProtoMessage() {} func (*GroupSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{6} + return fileDescriptor_ed300aa8e672704e, []int{7} } func (m *GroupSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +270,7 @@ var xxx_messageInfo_GroupSubject proto.InternalMessageInfo func (m *LimitResponse) Reset() { *m = LimitResponse{} } func (*LimitResponse) ProtoMessage() {} func (*LimitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{7} + return fileDescriptor_ed300aa8e672704e, []int{8} } func (m *LimitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +298,7 @@ var xxx_messageInfo_LimitResponse proto.InternalMessageInfo func (m *LimitedPriorityLevelConfiguration) Reset() { *m = LimitedPriorityLevelConfiguration{} } func (*LimitedPriorityLevelConfiguration) ProtoMessage() {} func (*LimitedPriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{8} + return fileDescriptor_ed300aa8e672704e, []int{9} } func (m *LimitedPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +326,7 @@ var xxx_messageInfo_LimitedPriorityLevelConfiguration proto.InternalMessageInfo func (m *NonResourcePolicyRule) Reset() { *m = NonResourcePolicyRule{} } func (*NonResourcePolicyRule) ProtoMessage() {} func (*NonResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{9} + return fileDescriptor_ed300aa8e672704e, []int{10} } func (m *NonResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +354,7 @@ var xxx_messageInfo_NonResourcePolicyRule proto.InternalMessageInfo func (m *PolicyRulesWithSubjects) Reset() { *m = PolicyRulesWithSubjects{} } func (*PolicyRulesWithSubjects) ProtoMessage() {} func (*PolicyRulesWithSubjects) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{10} + return fileDescriptor_ed300aa8e672704e, []int{11} } func (m *PolicyRulesWithSubjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +382,7 @@ var xxx_messageInfo_PolicyRulesWithSubjects proto.InternalMessageInfo func (m *PriorityLevelConfiguration) Reset() { *m = PriorityLevelConfiguration{} } func (*PriorityLevelConfiguration) ProtoMessage() {} func (*PriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{11} + return fileDescriptor_ed300aa8e672704e, []int{12} } func (m *PriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +410,7 @@ var xxx_messageInfo_PriorityLevelConfiguration proto.InternalMessageInfo func (m *PriorityLevelConfigurationCondition) Reset() { *m = PriorityLevelConfigurationCondition{} } func (*PriorityLevelConfigurationCondition) ProtoMessage() {} func (*PriorityLevelConfigurationCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{12} + return fileDescriptor_ed300aa8e672704e, []int{13} } func (m *PriorityLevelConfigurationCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +438,7 @@ var xxx_messageInfo_PriorityLevelConfigurationCondition proto.InternalMessageInf func (m *PriorityLevelConfigurationList) Reset() { *m = PriorityLevelConfigurationList{} } func (*PriorityLevelConfigurationList) ProtoMessage() {} func (*PriorityLevelConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{13} + return fileDescriptor_ed300aa8e672704e, []int{14} } func (m *PriorityLevelConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +466,7 @@ var xxx_messageInfo_PriorityLevelConfigurationList proto.InternalMessageInfo func (m *PriorityLevelConfigurationReference) Reset() { *m = PriorityLevelConfigurationReference{} } func (*PriorityLevelConfigurationReference) ProtoMessage() {} func (*PriorityLevelConfigurationReference) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{14} + return fileDescriptor_ed300aa8e672704e, []int{15} } func (m *PriorityLevelConfigurationReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +494,7 @@ var xxx_messageInfo_PriorityLevelConfigurationReference proto.InternalMessageInf func (m *PriorityLevelConfigurationSpec) Reset() { *m = PriorityLevelConfigurationSpec{} } func (*PriorityLevelConfigurationSpec) ProtoMessage() {} func (*PriorityLevelConfigurationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{15} + return fileDescriptor_ed300aa8e672704e, []int{16} } func (m *PriorityLevelConfigurationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +522,7 @@ var xxx_messageInfo_PriorityLevelConfigurationSpec proto.InternalMessageInfo func (m *PriorityLevelConfigurationStatus) Reset() { *m = PriorityLevelConfigurationStatus{} } func (*PriorityLevelConfigurationStatus) ProtoMessage() {} func (*PriorityLevelConfigurationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{16} + return fileDescriptor_ed300aa8e672704e, []int{17} } func (m *PriorityLevelConfigurationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +550,7 @@ var xxx_messageInfo_PriorityLevelConfigurationStatus proto.InternalMessageInfo func (m *QueuingConfiguration) Reset() { *m = QueuingConfiguration{} } func (*QueuingConfiguration) ProtoMessage() {} func (*QueuingConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{17} + return fileDescriptor_ed300aa8e672704e, []int{18} } func (m *QueuingConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +578,7 @@ var xxx_messageInfo_QueuingConfiguration proto.InternalMessageInfo func (m *ResourcePolicyRule) Reset() { *m = ResourcePolicyRule{} } func (*ResourcePolicyRule) ProtoMessage() {} func (*ResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{18} + return fileDescriptor_ed300aa8e672704e, []int{19} } func (m *ResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +606,7 @@ var xxx_messageInfo_ResourcePolicyRule proto.InternalMessageInfo func (m *ServiceAccountSubject) Reset() { *m = ServiceAccountSubject{} } func (*ServiceAccountSubject) ProtoMessage() {} func (*ServiceAccountSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{19} + return fileDescriptor_ed300aa8e672704e, []int{20} } func (m *ServiceAccountSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +634,7 @@ var xxx_messageInfo_ServiceAccountSubject proto.InternalMessageInfo func (m *Subject) Reset() { *m = Subject{} } func (*Subject) ProtoMessage() {} func (*Subject) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{20} + return fileDescriptor_ed300aa8e672704e, []int{21} } func (m *Subject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +662,7 @@ var xxx_messageInfo_Subject proto.InternalMessageInfo func (m *UserSubject) Reset() { *m = UserSubject{} } func (*UserSubject) ProtoMessage() {} func (*UserSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_ed300aa8e672704e, []int{21} + return fileDescriptor_ed300aa8e672704e, []int{22} } func (m *UserSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -660,6 +688,7 @@ func (m *UserSubject) XXX_DiscardUnknown() { var xxx_messageInfo_UserSubject proto.InternalMessageInfo func init() { + proto.RegisterType((*ExemptPriorityLevelConfiguration)(nil), "k8s.io.api.flowcontrol.v1beta2.ExemptPriorityLevelConfiguration") proto.RegisterType((*FlowDistinguisherMethod)(nil), "k8s.io.api.flowcontrol.v1beta2.FlowDistinguisherMethod") proto.RegisterType((*FlowSchema)(nil), "k8s.io.api.flowcontrol.v1beta2.FlowSchema") proto.RegisterType((*FlowSchemaCondition)(nil), "k8s.io.api.flowcontrol.v1beta2.FlowSchemaCondition") @@ -689,105 +718,142 @@ func init() { } var fileDescriptor_ed300aa8e672704e = []byte{ - // 1554 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4f, 0x6f, 0xdb, 0xc6, - 0x12, 0x37, 0x65, 0xc9, 0xb6, 0xc6, 0x7f, 0xb3, 0x8e, 0x61, 0x3d, 0x07, 0x90, 0x1c, 0x3e, 0xe0, - 0xe5, 0xbd, 0x97, 0x84, 0x4a, 0xd2, 0xa4, 0x49, 0x5b, 0xf4, 0x8f, 0xe9, 0xb4, 0x69, 0x1a, 0xdb, - 0x71, 0xd6, 0x49, 0x5b, 0xa4, 0x01, 0x1a, 0x8a, 0x5a, 0x4b, 0x8c, 0x25, 0x92, 0xd9, 0x25, 0x65, - 0xb8, 0xb9, 0x14, 0xfd, 0x04, 0x3d, 0xb7, 0xc7, 0x1e, 0x7a, 0xef, 0x17, 0xe8, 0xb1, 0x41, 0x4f, - 0x39, 0xe6, 0xa4, 0x36, 0xea, 0xa9, 0xdf, 0xa0, 0x0d, 0x50, 0xa0, 0xd8, 0xe5, 0x92, 0x14, 0xf5, - 0x8f, 0x42, 0x02, 0xe4, 0xd4, 0x9b, 0x39, 0xf3, 0x9b, 0xdf, 0xec, 0xcc, 0xce, 0xcc, 0x8e, 0x0c, - 0xd7, 0x0e, 0xae, 0x30, 0xcd, 0x72, 0xca, 0x07, 0x7e, 0x85, 0x50, 0x9b, 0x78, 0x84, 0x95, 0x5b, - 0xc4, 0xae, 0x3a, 0xb4, 0x2c, 0x15, 0x86, 0x6b, 0x95, 0xf7, 0x1b, 0xce, 0xa1, 0xe9, 0xd8, 0x1e, - 0x75, 0x1a, 0xe5, 0xd6, 0xf9, 0x0a, 0xf1, 0x8c, 0x0b, 0xe5, 0x1a, 0xb1, 0x09, 0x35, 0x3c, 0x52, - 0xd5, 0x5c, 0xea, 0x78, 0x0e, 0x2a, 0x06, 0x78, 0xcd, 0x70, 0x2d, 0xad, 0x0b, 0xaf, 0x49, 0xfc, - 0xda, 0xd9, 0x9a, 0xe5, 0xd5, 0xfd, 0x8a, 0x66, 0x3a, 0xcd, 0x72, 0xcd, 0xa9, 0x39, 0x65, 0x61, - 0x56, 0xf1, 0xf7, 0xc5, 0x97, 0xf8, 0x10, 0x7f, 0x05, 0x74, 0x6b, 0x17, 0x63, 0xf7, 0x4d, 0xc3, - 0xac, 0x5b, 0x36, 0xa1, 0x47, 0x65, 0xf7, 0xa0, 0xc6, 0x05, 0xac, 0xdc, 0x24, 0x9e, 0x51, 0x6e, - 0x9d, 0xef, 0x3d, 0xc4, 0x5a, 0x79, 0x98, 0x15, 0xf5, 0x6d, 0xcf, 0x6a, 0x92, 0x3e, 0x83, 0xd7, - 0xd3, 0x0c, 0x98, 0x59, 0x27, 0x4d, 0xa3, 0xd7, 0x4e, 0xbd, 0x0b, 0xab, 0x1f, 0x34, 0x9c, 0xc3, - 0xab, 0x16, 0xf3, 0x2c, 0xbb, 0xe6, 0x5b, 0xac, 0x4e, 0xe8, 0x36, 0xf1, 0xea, 0x4e, 0x15, 0xbd, - 0x0b, 0x59, 0xef, 0xc8, 0x25, 0x05, 0x65, 0x5d, 0xf9, 0x6f, 0x5e, 0x3f, 0xfd, 0xb8, 0x5d, 0x9a, - 0xe8, 0xb4, 0x4b, 0xd9, 0xdb, 0x47, 0x2e, 0x79, 0xde, 0x2e, 0x9d, 0x18, 0x62, 0xc6, 0xd5, 0x58, - 0x18, 0xaa, 0xdf, 0x64, 0x00, 0x38, 0x6a, 0x4f, 0xb8, 0x46, 0xf7, 0x61, 0x86, 0x87, 0x5b, 0x35, - 0x3c, 0x43, 0x70, 0xce, 0x5e, 0x38, 0xa7, 0xc5, 0xb9, 0x8e, 0x4e, 0xad, 0xb9, 0x07, 0x35, 0x2e, - 0x60, 0x1a, 0x47, 0x6b, 0xad, 0xf3, 0xda, 0xcd, 0xca, 0x03, 0x62, 0x7a, 0xdb, 0xc4, 0x33, 0x74, - 0x24, 0x4f, 0x01, 0xb1, 0x0c, 0x47, 0xac, 0x68, 0x17, 0xb2, 0xcc, 0x25, 0x66, 0x21, 0x23, 0xd8, - 0x35, 0x6d, 0xf4, 0x4d, 0x6a, 0xf1, 0xd9, 0xf6, 0x5c, 0x62, 0xea, 0x73, 0x61, 0x84, 0xfc, 0x0b, - 0x0b, 0x26, 0xf4, 0x29, 0x4c, 0x31, 0xcf, 0xf0, 0x7c, 0x56, 0x98, 0xec, 0x3b, 0x71, 0x1a, 0xa7, - 0xb0, 0xd3, 0x17, 0x24, 0xeb, 0x54, 0xf0, 0x8d, 0x25, 0x9f, 0xfa, 0x34, 0x03, 0xcb, 0x31, 0x78, - 0xd3, 0xb1, 0xab, 0x96, 0x67, 0x39, 0x36, 0x7a, 0x2b, 0x91, 0xf5, 0x53, 0x3d, 0x59, 0x5f, 0x1d, - 0x60, 0x12, 0x67, 0x1c, 0xbd, 0x11, 0x1d, 0x37, 0x23, 0xcc, 0x4f, 0x26, 0x9d, 0x3f, 0x6f, 0x97, - 0x16, 0x23, 0xb3, 0xe4, 0x79, 0x50, 0x0b, 0x50, 0xc3, 0x60, 0xde, 0x6d, 0x6a, 0xd8, 0x2c, 0xa0, - 0xb5, 0x9a, 0x44, 0x46, 0xfd, 0xff, 0xf1, 0xee, 0x89, 0x5b, 0xe8, 0x6b, 0xd2, 0x25, 0xda, 0xea, - 0x63, 0xc3, 0x03, 0x3c, 0xa0, 0xff, 0xc0, 0x14, 0x25, 0x06, 0x73, 0xec, 0x42, 0x56, 0x1c, 0x39, - 0xca, 0x17, 0x16, 0x52, 0x2c, 0xb5, 0xe8, 0x7f, 0x30, 0xdd, 0x24, 0x8c, 0x19, 0x35, 0x52, 0xc8, - 0x09, 0xe0, 0xa2, 0x04, 0x4e, 0x6f, 0x07, 0x62, 0x1c, 0xea, 0xd5, 0x1f, 0x15, 0x58, 0x88, 0xf3, - 0xb4, 0x65, 0x31, 0x0f, 0xdd, 0xeb, 0xab, 0x3d, 0x6d, 0xbc, 0x98, 0xb8, 0xb5, 0xa8, 0xbc, 0x25, - 0xe9, 0x6e, 0x26, 0x94, 0x74, 0xd5, 0xdd, 0x4d, 0xc8, 0x59, 0x1e, 0x69, 0xf2, 0xac, 0x4f, 0xf6, - 0xa4, 0x2b, 0xa5, 0x48, 0xf4, 0x79, 0x49, 0x9b, 0xbb, 0xce, 0x09, 0x70, 0xc0, 0xa3, 0xfe, 0x3e, - 0xd9, 0x1d, 0x01, 0xaf, 0x47, 0xf4, 0xbd, 0x02, 0x6b, 0x2e, 0xb5, 0x1c, 0x6a, 0x79, 0x47, 0x5b, - 0xa4, 0x45, 0x1a, 0x9b, 0x8e, 0xbd, 0x6f, 0xd5, 0x7c, 0x6a, 0xf0, 0x54, 0xca, 0xa0, 0x36, 0xd3, - 0x3c, 0xef, 0x0e, 0x65, 0xc0, 0x64, 0x9f, 0x50, 0x62, 0x9b, 0x44, 0x57, 0xe5, 0x91, 0xd6, 0x46, - 0x80, 0x47, 0x1c, 0x05, 0x7d, 0x04, 0xa8, 0x69, 0x78, 0x3c, 0xa3, 0xb5, 0x5d, 0x4a, 0x4c, 0x52, - 0xe5, 0xac, 0xa2, 0x20, 0x73, 0x71, 0x75, 0x6c, 0xf7, 0x21, 0xf0, 0x00, 0x2b, 0xf4, 0x95, 0x02, - 0xcb, 0xd5, 0xfe, 0x21, 0x23, 0xeb, 0xf2, 0xf2, 0x38, 0x89, 0x1e, 0x30, 0xa3, 0xf4, 0xd5, 0x4e, - 0xbb, 0xb4, 0x3c, 0x40, 0x81, 0x07, 0x39, 0x43, 0xf7, 0x20, 0x47, 0xfd, 0x06, 0x61, 0x85, 0xac, - 0xb8, 0xde, 0x54, 0xaf, 0xbb, 0x4e, 0xc3, 0x32, 0x8f, 0x30, 0x37, 0xf9, 0xc4, 0xf2, 0xea, 0x7b, - 0xbe, 0x98, 0x55, 0x2c, 0xbe, 0x6b, 0xa1, 0xc2, 0x01, 0xa9, 0xfa, 0x08, 0x96, 0x7a, 0x87, 0x06, - 0xaa, 0x01, 0x98, 0x61, 0x9f, 0xb2, 0x82, 0x22, 0xdc, 0xbe, 0x36, 0x7e, 0x55, 0x45, 0x3d, 0x1e, - 0xcf, 0xcb, 0x48, 0xc4, 0x70, 0x17, 0xb5, 0x7a, 0x0e, 0xe6, 0xae, 0x51, 0xc7, 0x77, 0xe5, 0x19, - 0xd1, 0x3a, 0x64, 0x6d, 0xa3, 0x19, 0x4e, 0x9f, 0x68, 0x22, 0xee, 0x18, 0x4d, 0x82, 0x85, 0x46, - 0xfd, 0x4e, 0x81, 0xf9, 0x2d, 0xab, 0x69, 0x79, 0x98, 0x30, 0xd7, 0xb1, 0x19, 0x41, 0x97, 0x12, - 0x13, 0xeb, 0x64, 0xcf, 0xc4, 0x3a, 0x96, 0x00, 0x77, 0xcd, 0xaa, 0xcf, 0x60, 0xfa, 0xa1, 0x4f, - 0x7c, 0xcb, 0xae, 0xc9, 0x79, 0x7d, 0x31, 0x2d, 0xc0, 0x5b, 0x01, 0x3c, 0x51, 0x6d, 0xfa, 0x2c, - 0x1f, 0x01, 0x52, 0x83, 0x43, 0x46, 0xf5, 0xaf, 0x0c, 0x9c, 0x14, 0x8e, 0x49, 0x75, 0x78, 0x15, - 0xa3, 0x7b, 0x50, 0x30, 0x18, 0xf3, 0x29, 0xa9, 0x6e, 0x3a, 0xb6, 0xe9, 0x53, 0x5e, 0xff, 0x47, - 0x7b, 0x75, 0x83, 0x12, 0x26, 0xa2, 0xc9, 0xe9, 0xeb, 0x32, 0x9a, 0xc2, 0xc6, 0x10, 0x1c, 0x1e, - 0xca, 0x80, 0x1e, 0xc0, 0x7c, 0xa3, 0x3b, 0x76, 0x19, 0xe6, 0xd9, 0xb4, 0x30, 0x13, 0x09, 0xd3, - 0x57, 0xe4, 0x09, 0x92, 0x49, 0xc7, 0x49, 0x6a, 0xf4, 0x36, 0x2c, 0x36, 0x88, 0x5d, 0x35, 0x2a, - 0x0d, 0xb2, 0x4b, 0xa8, 0x49, 0x6c, 0x4f, 0xb4, 0x48, 0x4e, 0x5f, 0xee, 0xb4, 0x4b, 0x8b, 0x5b, - 0x49, 0x15, 0xee, 0xc5, 0xa2, 0x9b, 0xb0, 0x52, 0x71, 0x28, 0x75, 0x0e, 0x2d, 0xbb, 0x26, 0xfc, - 0x84, 0x24, 0x59, 0x41, 0xf2, 0xaf, 0x4e, 0xbb, 0xb4, 0xa2, 0x0f, 0x02, 0xe0, 0xc1, 0x76, 0xea, - 0x21, 0xac, 0xec, 0xf0, 0x99, 0xc2, 0x1c, 0x9f, 0x9a, 0x24, 0x6e, 0x08, 0x54, 0x82, 0x5c, 0x8b, - 0xd0, 0x4a, 0x50, 0xd4, 0x79, 0x3d, 0xcf, 0xdb, 0xe1, 0x63, 0x2e, 0xc0, 0x81, 0x9c, 0x47, 0x62, - 0xc7, 0x96, 0x77, 0xf0, 0x16, 0x2b, 0x4c, 0x09, 0xa8, 0x88, 0x64, 0x27, 0xa9, 0xc2, 0xbd, 0x58, - 0xb5, 0x9d, 0x81, 0xd5, 0x21, 0xfd, 0x87, 0xee, 0xc0, 0x0c, 0x93, 0x7f, 0xcb, 0x9e, 0x3a, 0x95, - 0x76, 0x17, 0xd2, 0x36, 0x9e, 0xfe, 0x21, 0x19, 0x8e, 0xa8, 0x90, 0x03, 0xf3, 0x54, 0x1e, 0x41, - 0xf8, 0x94, 0xaf, 0xc0, 0x85, 0x34, 0xee, 0xfe, 0xec, 0xc4, 0x97, 0x8d, 0xbb, 0x09, 0x71, 0x92, - 0x1f, 0x3d, 0x82, 0xa5, 0xae, 0xb0, 0x03, 0x9f, 0x93, 0xc2, 0xe7, 0xa5, 0x34, 0x9f, 0x03, 0x2f, - 0x45, 0x2f, 0x48, 0xb7, 0x4b, 0x3b, 0x3d, 0xb4, 0xb8, 0xcf, 0x91, 0xfa, 0x73, 0x06, 0x46, 0x3c, - 0x0c, 0xaf, 0x60, 0xc9, 0xbb, 0x9f, 0x58, 0xf2, 0xde, 0x79, 0xf1, 0x17, 0x6f, 0xe8, 0xd2, 0x57, - 0xef, 0x59, 0xfa, 0xde, 0x7b, 0x09, 0x1f, 0xa3, 0x97, 0xc0, 0x3f, 0x32, 0xf0, 0xef, 0xe1, 0xc6, - 0xf1, 0x52, 0x78, 0x23, 0x31, 0x62, 0x2f, 0xf7, 0x8c, 0xd8, 0x53, 0x63, 0x50, 0xfc, 0xb3, 0x24, - 0xf6, 0x2c, 0x89, 0xbf, 0x28, 0x50, 0x1c, 0x9e, 0xb7, 0x57, 0xb0, 0x34, 0x7e, 0x9e, 0x5c, 0x1a, - 0xdf, 0x7c, 0xf1, 0x22, 0x1b, 0xb2, 0x44, 0x5e, 0x1b, 0x55, 0x5b, 0xd1, 0xba, 0x37, 0xc6, 0x93, - 0xff, 0xd3, 0xc8, 0x54, 0x89, 0xed, 0x34, 0xe5, 0x57, 0x4b, 0xc2, 0xfa, 0x7d, 0x9b, 0x3f, 0x3d, - 0x4d, 0xfe, 0x7a, 0x04, 0x05, 0x59, 0x87, 0xe9, 0x46, 0xf0, 0x56, 0xcb, 0xa6, 0xde, 0x18, 0xeb, - 0x89, 0x1c, 0xf5, 0xb4, 0x07, 0x6b, 0x81, 0x84, 0xe1, 0x90, 0x5e, 0xfd, 0x56, 0x81, 0xf5, 0xb4, - 0x66, 0x45, 0x87, 0x03, 0x96, 0xaf, 0x97, 0x58, 0xac, 0xc7, 0x5f, 0xc6, 0x7e, 0x50, 0xe0, 0xf8, - 0xa0, 0x1d, 0x87, 0x97, 0x3f, 0x5f, 0x6c, 0xa2, 0xad, 0x24, 0x2a, 0xff, 0x5b, 0x42, 0x8a, 0xa5, - 0x16, 0x9d, 0x81, 0x99, 0xba, 0x61, 0x57, 0xf7, 0xac, 0x2f, 0xc2, 0x7d, 0x3b, 0x2a, 0xc0, 0x0f, - 0xa5, 0x1c, 0x47, 0x08, 0x74, 0x15, 0x96, 0x84, 0xdd, 0x16, 0xb1, 0x6b, 0x5e, 0x5d, 0xe4, 0x4a, - 0x2e, 0x0d, 0xd1, 0x7b, 0x70, 0xab, 0x47, 0x8f, 0xfb, 0x2c, 0xd4, 0x3f, 0x15, 0x40, 0x2f, 0xf2, - 0xce, 0x9f, 0x86, 0xbc, 0xe1, 0x5a, 0x62, 0xf9, 0x0c, 0x5a, 0x20, 0xaf, 0xcf, 0x77, 0xda, 0xa5, - 0xfc, 0xc6, 0xee, 0xf5, 0x40, 0x88, 0x63, 0x3d, 0x07, 0x87, 0x4f, 0x60, 0xf0, 0xd4, 0x49, 0x70, - 0xe8, 0x98, 0xe1, 0x58, 0x8f, 0xae, 0xc0, 0x9c, 0xd9, 0xf0, 0x99, 0x47, 0xe8, 0x9e, 0xe9, 0xb8, - 0x44, 0x8c, 0x8c, 0x19, 0xfd, 0xb8, 0x8c, 0x69, 0x6e, 0xb3, 0x4b, 0x87, 0x13, 0x48, 0xa4, 0x01, - 0xf0, 0x82, 0x67, 0xae, 0xc1, 0xfd, 0xe4, 0x84, 0x9f, 0x05, 0x7e, 0x61, 0x3b, 0x91, 0x14, 0x77, - 0x21, 0xd4, 0x07, 0xb0, 0xb2, 0x47, 0x68, 0xcb, 0x32, 0xc9, 0x86, 0x69, 0x3a, 0xbe, 0xed, 0x85, - 0x6b, 0x74, 0x19, 0xf2, 0x11, 0x4c, 0xf6, 0xc4, 0x31, 0xe9, 0x3f, 0x1f, 0x71, 0xe1, 0x18, 0x13, - 0x35, 0x61, 0x66, 0x78, 0x13, 0x66, 0x60, 0x3a, 0xa6, 0xcf, 0x1e, 0x58, 0x76, 0x55, 0x32, 0x9f, - 0x08, 0xd1, 0x37, 0x2c, 0xbb, 0xfa, 0xbc, 0x5d, 0x9a, 0x95, 0x30, 0xfe, 0x89, 0x05, 0x10, 0x5d, - 0x87, 0xac, 0xcf, 0x08, 0x95, 0xed, 0x75, 0x3a, 0xad, 0x98, 0xef, 0x30, 0x42, 0xc3, 0xcd, 0x67, - 0x86, 0x33, 0x73, 0x01, 0x16, 0x14, 0x68, 0x1b, 0x72, 0x35, 0x7e, 0x29, 0x72, 0xea, 0x9f, 0x49, - 0xe3, 0xea, 0xfe, 0x79, 0x11, 0x94, 0x81, 0x90, 0xe0, 0x80, 0x05, 0x3d, 0x84, 0x05, 0x96, 0x48, - 0xa1, 0xb8, 0xae, 0x31, 0x36, 0x99, 0x81, 0x89, 0xd7, 0x51, 0xa7, 0x5d, 0x5a, 0x48, 0xaa, 0x70, - 0x8f, 0x03, 0xb5, 0x0c, 0xb3, 0x5d, 0x01, 0xa6, 0xcf, 0x3f, 0xfd, 0xea, 0xe3, 0x67, 0xc5, 0x89, - 0x27, 0xcf, 0x8a, 0x13, 0x4f, 0x9f, 0x15, 0x27, 0xbe, 0xec, 0x14, 0x95, 0xc7, 0x9d, 0xa2, 0xf2, - 0xa4, 0x53, 0x54, 0x9e, 0x76, 0x8a, 0xca, 0xaf, 0x9d, 0xa2, 0xf2, 0xf5, 0x6f, 0xc5, 0x89, 0xbb, - 0xc5, 0xd1, 0xff, 0x67, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x87, 0x72, 0xbf, 0xe2, 0xa1, 0x14, - 0x00, 0x00, + // 1617 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4b, 0x73, 0x1b, 0xc5, + 0x16, 0xf6, 0xc8, 0x92, 0x6d, 0x1d, 0x3f, 0xd3, 0x8e, 0xcb, 0xba, 0xce, 0x2d, 0xc9, 0x99, 0x5b, + 0x75, 0x73, 0x2f, 0x49, 0x46, 0x89, 0x49, 0x48, 0x80, 0xe2, 0xe1, 0x71, 0x42, 0x08, 0xb1, 0x1d, + 0xa7, 0x9d, 0x40, 0x2a, 0xa4, 0x8a, 0x8c, 0x46, 0x6d, 0x69, 0x62, 0x69, 0x66, 0xd2, 0x3d, 0x23, + 0x63, 0xb2, 0xa1, 0xf8, 0x05, 0xac, 0x61, 0xc9, 0x82, 0x15, 0x1b, 0xb6, 0x2c, 0x58, 0x92, 0x62, + 0x95, 0x65, 0x56, 0x82, 0x88, 0x15, 0xff, 0x00, 0x52, 0x45, 0x15, 0xd5, 0x3d, 0xad, 0x19, 0x8d, + 0x5e, 0xa3, 0x4a, 0xaa, 0xb2, 0x62, 0xe7, 0x39, 0xe7, 0x3b, 0xdf, 0xe9, 0x3e, 0x7d, 0x5e, 0x32, + 0x5c, 0xd9, 0xbf, 0xc8, 0x34, 0xcb, 0x29, 0xee, 0xfb, 0x25, 0x42, 0x6d, 0xe2, 0x11, 0x56, 0x6c, + 0x10, 0xbb, 0xec, 0xd0, 0xa2, 0x54, 0x18, 0xae, 0x55, 0xdc, 0xab, 0x39, 0x07, 0xa6, 0x63, 0x7b, + 0xd4, 0xa9, 0x15, 0x1b, 0x67, 0x4b, 0xc4, 0x33, 0xd6, 0x8a, 0x15, 0x62, 0x13, 0x6a, 0x78, 0xa4, + 0xac, 0xb9, 0xd4, 0xf1, 0x1c, 0x94, 0x0f, 0xf0, 0x9a, 0xe1, 0x5a, 0x5a, 0x07, 0x5e, 0x93, 0xf8, + 0x95, 0xd3, 0x15, 0xcb, 0xab, 0xfa, 0x25, 0xcd, 0x74, 0xea, 0xc5, 0x8a, 0x53, 0x71, 0x8a, 0xc2, + 0xac, 0xe4, 0xef, 0x89, 0x2f, 0xf1, 0x21, 0xfe, 0x0a, 0xe8, 0x56, 0xce, 0x45, 0xee, 0xeb, 0x86, + 0x59, 0xb5, 0x6c, 0x42, 0x0f, 0x8b, 0xee, 0x7e, 0x85, 0x0b, 0x58, 0xb1, 0x4e, 0x3c, 0xa3, 0xd8, + 0x38, 0xdb, 0x7d, 0x88, 0x95, 0xe2, 0x20, 0x2b, 0xea, 0xdb, 0x9e, 0x55, 0x27, 0x3d, 0x06, 0xaf, + 0x25, 0x19, 0x30, 0xb3, 0x4a, 0xea, 0x46, 0xb7, 0x9d, 0xfa, 0x83, 0x02, 0xab, 0x97, 0x3f, 0x25, + 0x75, 0xd7, 0xdb, 0xa1, 0x96, 0x43, 0x2d, 0xef, 0x70, 0x93, 0x34, 0x48, 0x6d, 0xc3, 0xb1, 0xf7, + 0xac, 0x8a, 0x4f, 0x0d, 0xcf, 0x72, 0x6c, 0x74, 0x1b, 0x72, 0xb6, 0x53, 0xb7, 0x6c, 0x83, 0xcb, + 0x4d, 0x9f, 0x52, 0x62, 0x9b, 0x87, 0xbb, 0x55, 0x83, 0x12, 0x96, 0x53, 0x56, 0x95, 0xff, 0x65, + 0xf4, 0x7f, 0xb7, 0x9a, 0x85, 0xdc, 0xf6, 0x00, 0x0c, 0x1e, 0x68, 0x8d, 0xde, 0x82, 0xf9, 0x1a, + 0xb1, 0xcb, 0x46, 0xa9, 0x46, 0x76, 0x08, 0x35, 0x89, 0xed, 0xe5, 0x52, 0x82, 0x70, 0xb1, 0xd5, + 0x2c, 0xcc, 0x6f, 0xc6, 0x55, 0xb8, 0x1b, 0xab, 0xde, 0x81, 0xe5, 0xf7, 0x6a, 0xce, 0xc1, 0x25, + 0x8b, 0x79, 0x96, 0x5d, 0xf1, 0x2d, 0x56, 0x25, 0x74, 0x8b, 0x78, 0x55, 0xa7, 0x8c, 0xde, 0x81, + 0xb4, 0x77, 0xe8, 0x12, 0x71, 0xbe, 0xac, 0x7e, 0xf2, 0x51, 0xb3, 0x30, 0xd6, 0x6a, 0x16, 0xd2, + 0x37, 0x0f, 0x5d, 0xf2, 0xac, 0x59, 0x38, 0x36, 0xc0, 0x8c, 0xab, 0xb1, 0x30, 0x54, 0xbf, 0x4a, + 0x01, 0x70, 0xd4, 0xae, 0x08, 0x1c, 0xba, 0x07, 0x53, 0xfc, 0xb1, 0xca, 0x86, 0x67, 0x08, 0xce, + 0xe9, 0xb5, 0x33, 0x5a, 0x94, 0x29, 0x61, 0xcc, 0x35, 0x77, 0xbf, 0xc2, 0x05, 0x4c, 0xe3, 0x68, + 0xad, 0x71, 0x56, 0xbb, 0x5e, 0xba, 0x4f, 0x4c, 0x6f, 0x8b, 0x78, 0x86, 0x8e, 0xe4, 0x29, 0x20, + 0x92, 0xe1, 0x90, 0x15, 0xed, 0x40, 0x9a, 0xb9, 0xc4, 0x14, 0x01, 0x98, 0x5e, 0xd3, 0xb4, 0xe1, + 0x79, 0xa8, 0x45, 0x67, 0xdb, 0x75, 0x89, 0xa9, 0xcf, 0xb4, 0x6f, 0xc8, 0xbf, 0xb0, 0x60, 0x42, + 0xb7, 0x61, 0x82, 0x79, 0x86, 0xe7, 0xb3, 0xdc, 0x78, 0xcf, 0x89, 0x93, 0x38, 0x85, 0x9d, 0x3e, + 0x27, 0x59, 0x27, 0x82, 0x6f, 0x2c, 0xf9, 0xd4, 0x27, 0x29, 0x58, 0x8c, 0xc0, 0x1b, 0x8e, 0x5d, + 0xb6, 0x44, 0xa6, 0xbc, 0x19, 0x8b, 0xfa, 0x89, 0xae, 0xa8, 0x2f, 0xf7, 0x31, 0x89, 0x22, 0x8e, + 0x5e, 0x0f, 0x8f, 0x9b, 0x12, 0xe6, 0xc7, 0xe3, 0xce, 0x9f, 0x35, 0x0b, 0xf3, 0xa1, 0x59, 0xfc, + 0x3c, 0xa8, 0x01, 0xa8, 0x66, 0x30, 0xef, 0x26, 0x35, 0x6c, 0x16, 0xd0, 0x5a, 0x75, 0x22, 0x6f, + 0xfd, 0xca, 0x68, 0xef, 0xc4, 0x2d, 0xf4, 0x15, 0xe9, 0x12, 0x6d, 0xf6, 0xb0, 0xe1, 0x3e, 0x1e, + 0xd0, 0x7f, 0x61, 0x82, 0x12, 0x83, 0x39, 0x76, 0x2e, 0x2d, 0x8e, 0x1c, 0xc6, 0x0b, 0x0b, 0x29, + 0x96, 0x5a, 0xf4, 0x7f, 0x98, 0xac, 0x13, 0xc6, 0x8c, 0x0a, 0xc9, 0x65, 0x04, 0x70, 0x5e, 0x02, + 0x27, 0xb7, 0x02, 0x31, 0x6e, 0xeb, 0xd5, 0x1f, 0x15, 0x98, 0x8b, 0xe2, 0xb4, 0x69, 0x31, 0x0f, + 0xdd, 0xed, 0xc9, 0x3d, 0x6d, 0xb4, 0x3b, 0x71, 0x6b, 0x91, 0x79, 0x0b, 0xd2, 0xdd, 0x54, 0x5b, + 0xd2, 0x91, 0x77, 0xd7, 0x21, 0x63, 0x79, 0xa4, 0xce, 0xa3, 0x3e, 0xde, 0x15, 0xae, 0x84, 0x24, + 0xd1, 0x67, 0x25, 0x6d, 0xe6, 0x2a, 0x27, 0xc0, 0x01, 0x8f, 0xfa, 0xfb, 0x78, 0xe7, 0x0d, 0x78, + 0x3e, 0xa2, 0x6f, 0x15, 0x58, 0x71, 0x07, 0x36, 0x18, 0x79, 0xa9, 0x8d, 0x24, 0xcf, 0x83, 0x5b, + 0x14, 0x26, 0x7b, 0x84, 0xf7, 0x15, 0xa2, 0xab, 0xf2, 0x48, 0x2b, 0x43, 0xc0, 0x43, 0x8e, 0x82, + 0x3e, 0x00, 0x54, 0x37, 0x3c, 0x1e, 0xd1, 0xca, 0x0e, 0x25, 0x26, 0x29, 0x73, 0x56, 0xd9, 0x94, + 0xc2, 0xec, 0xd8, 0xea, 0x41, 0xe0, 0x3e, 0x56, 0xe8, 0x0b, 0x05, 0x16, 0xcb, 0xbd, 0x4d, 0x46, + 0xe6, 0xe5, 0x85, 0x51, 0x02, 0xdd, 0xa7, 0x47, 0xe9, 0xcb, 0xad, 0x66, 0x61, 0xb1, 0x8f, 0x02, + 0xf7, 0x73, 0x86, 0xee, 0x42, 0x86, 0xfa, 0x35, 0xc2, 0x72, 0x69, 0xf1, 0xbc, 0x89, 0x5e, 0x77, + 0x9c, 0x9a, 0x65, 0x1e, 0x62, 0x6e, 0xf2, 0x91, 0xe5, 0x55, 0x77, 0x7d, 0xd1, 0xab, 0x58, 0xf4, + 0xd6, 0x42, 0x85, 0x03, 0x52, 0xf5, 0x21, 0x2c, 0x74, 0x37, 0x0d, 0x54, 0x01, 0x30, 0xdb, 0x75, + 0xca, 0x07, 0x04, 0x77, 0xfb, 0xea, 0xe8, 0x59, 0x15, 0xd6, 0x78, 0xd4, 0x2f, 0x43, 0x11, 0xc3, + 0x1d, 0xd4, 0xea, 0x19, 0x98, 0xb9, 0x42, 0x1d, 0xdf, 0x95, 0x67, 0x44, 0xab, 0x90, 0xb6, 0x8d, + 0x7a, 0xbb, 0xfb, 0x84, 0x1d, 0x71, 0xdb, 0xa8, 0x13, 0x2c, 0x34, 0xea, 0x37, 0x0a, 0xcc, 0x6e, + 0x5a, 0x75, 0xcb, 0xc3, 0x84, 0xb9, 0x8e, 0xcd, 0x08, 0x3a, 0x1f, 0xeb, 0x58, 0xc7, 0xbb, 0x3a, + 0xd6, 0x91, 0x18, 0xb8, 0xa3, 0x57, 0x7d, 0x0c, 0x93, 0x0f, 0x7c, 0xe2, 0x5b, 0x76, 0x45, 0xf6, + 0xeb, 0x73, 0x49, 0x17, 0xbc, 0x11, 0xc0, 0x63, 0xd9, 0xa6, 0x4f, 0xf3, 0x16, 0x20, 0x35, 0xb8, + 0xcd, 0xa8, 0xfe, 0x95, 0x82, 0xe3, 0xc2, 0x31, 0x29, 0x0f, 0x99, 0xca, 0x77, 0x21, 0x67, 0x30, + 0xe6, 0x53, 0x52, 0x1e, 0x34, 0x95, 0x57, 0xe5, 0x6d, 0x72, 0xeb, 0x03, 0x70, 0x78, 0x20, 0x03, + 0xba, 0x0f, 0xb3, 0xb5, 0xce, 0xbb, 0xcb, 0x6b, 0x9e, 0x4e, 0xba, 0x66, 0x2c, 0x60, 0xfa, 0x92, + 0x3c, 0x41, 0x3c, 0xe8, 0x38, 0x4e, 0xdd, 0x6f, 0x0b, 0x18, 0x1f, 0x7d, 0x0b, 0x40, 0xd7, 0x61, + 0xa9, 0xe4, 0x50, 0xea, 0x1c, 0x58, 0x76, 0x45, 0xf8, 0x69, 0x93, 0xa4, 0x05, 0xc9, 0xbf, 0x5a, + 0xcd, 0xc2, 0x92, 0xde, 0x0f, 0x80, 0xfb, 0xdb, 0xa9, 0x07, 0xb0, 0xb4, 0xcd, 0x7b, 0x0a, 0x73, + 0x7c, 0x6a, 0x92, 0xa8, 0x20, 0x50, 0x01, 0x32, 0x0d, 0x42, 0x4b, 0x41, 0x52, 0x67, 0xf5, 0x2c, + 0x2f, 0x87, 0x0f, 0xb9, 0x00, 0x07, 0x72, 0x7e, 0x13, 0x3b, 0xb2, 0xbc, 0x85, 0x37, 0x59, 0x6e, + 0x42, 0x40, 0xc5, 0x4d, 0xb6, 0xe3, 0x2a, 0xdc, 0x8d, 0x55, 0x9b, 0x29, 0x58, 0x1e, 0x50, 0x7f, + 0xe8, 0x16, 0x4c, 0x31, 0xf9, 0xb7, 0xac, 0xa9, 0x13, 0x49, 0x6f, 0x21, 0x6d, 0xa3, 0xee, 0xdf, + 0x26, 0xc3, 0x21, 0x15, 0x72, 0x60, 0x96, 0xca, 0x23, 0x08, 0x9f, 0x72, 0x0a, 0xac, 0x25, 0x71, + 0xf7, 0x46, 0x27, 0x7a, 0x6c, 0xdc, 0x49, 0x88, 0xe3, 0xfc, 0xe8, 0x21, 0x2c, 0x74, 0x5c, 0x3b, + 0xf0, 0x39, 0x2e, 0x7c, 0x9e, 0x4f, 0xf2, 0xd9, 0xf7, 0x51, 0xf4, 0x9c, 0x74, 0xbb, 0xb0, 0xdd, + 0x45, 0x8b, 0x7b, 0x1c, 0xa9, 0x3f, 0xa7, 0x60, 0xc8, 0x60, 0x78, 0x09, 0x4b, 0xde, 0xbd, 0xd8, + 0x92, 0xf7, 0xf6, 0xf3, 0x4f, 0xbc, 0x81, 0x4b, 0x5f, 0xb5, 0x6b, 0xe9, 0x7b, 0xf7, 0x05, 0x7c, + 0x0c, 0x5f, 0x02, 0xff, 0x48, 0xc1, 0x7f, 0x06, 0x1b, 0x47, 0x4b, 0xe1, 0xb5, 0x58, 0x8b, 0xbd, + 0xd0, 0xd5, 0x62, 0x4f, 0x8c, 0x40, 0xf1, 0xcf, 0x92, 0xd8, 0xb5, 0x24, 0xfe, 0xa2, 0x40, 0x7e, + 0x70, 0xdc, 0x5e, 0xc2, 0xd2, 0xf8, 0x49, 0x7c, 0x69, 0x7c, 0xe3, 0xf9, 0x93, 0x6c, 0xc0, 0x12, + 0x79, 0x65, 0x58, 0x6e, 0x85, 0xeb, 0xde, 0x08, 0x23, 0xff, 0xbb, 0xd4, 0xb0, 0x50, 0x89, 0xed, + 0x34, 0xe1, 0x57, 0x4b, 0xcc, 0xfa, 0xb2, 0xcd, 0x47, 0x4f, 0x9d, 0x4f, 0x8f, 0x20, 0x21, 0xab, + 0x30, 0x59, 0x0b, 0x66, 0xb5, 0x2c, 0xea, 0xf5, 0x91, 0x46, 0xe4, 0xb0, 0xd1, 0x1e, 0xac, 0x05, + 0x12, 0x86, 0xdb, 0xf4, 0xa8, 0x0c, 0x13, 0x44, 0xfc, 0x54, 0x1f, 0xb5, 0xb2, 0x93, 0x7e, 0xd8, + 0xeb, 0xc0, 0xb3, 0x30, 0x40, 0x61, 0xc9, 0xad, 0x7e, 0xad, 0xc0, 0x6a, 0x52, 0x4b, 0x40, 0x07, + 0x7d, 0x56, 0xbc, 0x17, 0x58, 0xdf, 0x47, 0x5f, 0xf9, 0xbe, 0x57, 0xe0, 0x68, 0xbf, 0x4d, 0x8a, + 0x17, 0x19, 0x5f, 0x9f, 0xc2, 0xdd, 0x27, 0x2c, 0xb2, 0x1b, 0x42, 0x8a, 0xa5, 0x16, 0x9d, 0x82, + 0xa9, 0xaa, 0x61, 0x97, 0x77, 0xad, 0xcf, 0xda, 0x5b, 0x7d, 0x98, 0xe6, 0xef, 0x4b, 0x39, 0x0e, + 0x11, 0xe8, 0x12, 0x2c, 0x08, 0xbb, 0x4d, 0x62, 0x57, 0xbc, 0xaa, 0x78, 0x11, 0xb9, 0x9a, 0x84, + 0x53, 0xe7, 0x46, 0x97, 0x1e, 0xf7, 0x58, 0xa8, 0x7f, 0x2a, 0x80, 0x9e, 0x67, 0x9b, 0x38, 0x09, + 0x59, 0xc3, 0xb5, 0xc4, 0x8a, 0x1b, 0x14, 0x5a, 0x56, 0x9f, 0x6d, 0x35, 0x0b, 0xd9, 0xf5, 0x9d, + 0xab, 0x81, 0x10, 0x47, 0x7a, 0x0e, 0x6e, 0x0f, 0xda, 0x60, 0xa0, 0x4a, 0x70, 0xdb, 0x31, 0xc3, + 0x91, 0x1e, 0x5d, 0x84, 0x19, 0xb3, 0xe6, 0x33, 0x8f, 0xd0, 0x5d, 0xd3, 0x71, 0x89, 0x68, 0x4c, + 0x53, 0xfa, 0x51, 0x79, 0xa7, 0x99, 0x8d, 0x0e, 0x1d, 0x8e, 0x21, 0x91, 0x06, 0xc0, 0xcb, 0x8a, + 0xb9, 0x06, 0xf7, 0x93, 0x11, 0x7e, 0xe6, 0xf8, 0x83, 0x6d, 0x87, 0x52, 0xdc, 0x81, 0x50, 0xef, + 0xc3, 0xd2, 0x2e, 0xa1, 0x0d, 0xcb, 0x24, 0xeb, 0xa6, 0xe9, 0xf8, 0xb6, 0xd7, 0x5e, 0xd6, 0x8b, + 0x90, 0x0d, 0x61, 0xb2, 0xf2, 0x8e, 0x48, 0xff, 0xd9, 0x90, 0x0b, 0x47, 0x98, 0xb0, 0xd4, 0x53, + 0x03, 0x4b, 0xfd, 0xa7, 0x14, 0x4c, 0x46, 0xf4, 0xe9, 0x7d, 0xcb, 0x2e, 0x4b, 0xe6, 0x63, 0x6d, + 0xf4, 0x35, 0xcb, 0x2e, 0x3f, 0x6b, 0x16, 0xa6, 0x25, 0x8c, 0x7f, 0x62, 0x01, 0x44, 0x57, 0x21, + 0xed, 0x33, 0x42, 0x65, 0x11, 0x9f, 0x4c, 0x4a, 0xe6, 0x5b, 0x8c, 0xd0, 0xf6, 0x7e, 0x35, 0xc5, + 0x99, 0xb9, 0x00, 0x0b, 0x0a, 0xb4, 0x05, 0x99, 0x0a, 0x7f, 0x14, 0x59, 0xa7, 0xa7, 0x92, 0xb8, + 0x3a, 0x7f, 0xc4, 0x04, 0x69, 0x20, 0x24, 0x38, 0x60, 0x41, 0x0f, 0x60, 0x8e, 0xc5, 0x42, 0x28, + 0x9e, 0x6b, 0x84, 0x7d, 0xa9, 0x6f, 0xe0, 0x75, 0xd4, 0x6a, 0x16, 0xe6, 0xe2, 0x2a, 0xdc, 0xe5, + 0x40, 0x2d, 0xc2, 0x74, 0xc7, 0x05, 0x93, 0xbb, 0xac, 0x7e, 0xe9, 0xd1, 0xd3, 0xfc, 0xd8, 0xe3, + 0xa7, 0xf9, 0xb1, 0x27, 0x4f, 0xf3, 0x63, 0x9f, 0xb7, 0xf2, 0xca, 0xa3, 0x56, 0x5e, 0x79, 0xdc, + 0xca, 0x2b, 0x4f, 0x5a, 0x79, 0xe5, 0xd7, 0x56, 0x5e, 0xf9, 0xf2, 0xb7, 0xfc, 0xd8, 0x9d, 0xfc, + 0xf0, 0xff, 0xc5, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x4d, 0x1e, 0x25, 0xc5, 0x15, 0x00, + 0x00, +} + +func (m *ExemptPriorityLevelConfiguration) 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 *ExemptPriorityLevelConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExemptPriorityLevelConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.LendablePercent != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.LendablePercent)) + i-- + dAtA[i] = 0x10 + } + if m.NominalConcurrencyShares != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.NominalConcurrencyShares)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *FlowDistinguisherMethod) Marshal() (dAtA []byte, err error) { @@ -1491,6 +1557,18 @@ func (m *PriorityLevelConfigurationSpec) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.Exempt != nil { + { + size, err := m.Exempt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if m.Limited != nil { { size, err := m.Limited.MarshalToSizedBuffer(dAtA[:i]) @@ -1783,6 +1861,21 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *ExemptPriorityLevelConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NominalConcurrencyShares != nil { + n += 1 + sovGenerated(uint64(*m.NominalConcurrencyShares)) + } + if m.LendablePercent != nil { + n += 1 + sovGenerated(uint64(*m.LendablePercent)) + } + return n +} + func (m *FlowDistinguisherMethod) Size() (n int) { if m == nil { return 0 @@ -2048,6 +2141,10 @@ func (m *PriorityLevelConfigurationSpec) Size() (n int) { l = m.Limited.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Exempt != nil { + l = m.Exempt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2165,6 +2262,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *ExemptPriorityLevelConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExemptPriorityLevelConfiguration{`, + `NominalConcurrencyShares:` + valueToStringGenerated(this.NominalConcurrencyShares) + `,`, + `LendablePercent:` + valueToStringGenerated(this.LendablePercent) + `,`, + `}`, + }, "") + return s +} func (this *FlowDistinguisherMethod) String() string { if this == nil { return "nil" @@ -2381,6 +2489,7 @@ func (this *PriorityLevelConfigurationSpec) String() string { s := strings.Join([]string{`&PriorityLevelConfigurationSpec{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Limited:` + strings.Replace(this.Limited.String(), "LimitedPriorityLevelConfiguration", "LimitedPriorityLevelConfiguration", 1) + `,`, + `Exempt:` + strings.Replace(this.Exempt.String(), "ExemptPriorityLevelConfiguration", "ExemptPriorityLevelConfiguration", 1) + `,`, `}`, }, "") return s @@ -2468,6 +2577,96 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *ExemptPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NominalConcurrencyShares", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NominalConcurrencyShares = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LendablePercent", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.LendablePercent = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4547,6 +4746,42 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exempt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exempt == nil { + m.Exempt = &ExemptPriorityLevelConfiguration{} + } + if err := m.Exempt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto index 4c98f21bc..a8c8a3273 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto @@ -28,6 +28,40 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/flowcontrol/v1beta2"; +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +message ExemptPriorityLevelConfiguration { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + optional int32 nominalConcurrencyShares = 1; + + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + optional int32 lendablePercent = 2; +} + // FlowDistinguisherMethod specifies the method of a flow distinguisher. message FlowDistinguisherMethod { // `type` is the type of flow distinguisher method @@ -332,6 +366,14 @@ message PriorityLevelConfigurationSpec { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional optional LimitedPriorityLevelConfiguration limited = 2; + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + optional ExemptPriorityLevelConfiguration exempt = 3; } // PriorityLevelConfigurationStatus represents the current state of a "request-priority". diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types.go index 75409cee3..e8cf7abff 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types.go @@ -77,7 +77,9 @@ const ( // is a boolean false or has an invalid boolean representation // (if the cluster operator sets it to 'false' it will be stomped) // - any changes to the spec made by the cluster operator will be - // stomped. + // stomped, except for changes to the `nominalConcurrencyShares` + // and `lendablePercent` fields of the PriorityLevelConfiguration + // named "exempt". // // The kube-apiserver will apply updates on the suggested configuration if: // - the cluster operator has enabled auto-update by setting the annotation @@ -435,6 +437,14 @@ type PriorityLevelConfigurationSpec struct { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional Limited *LimitedPriorityLevelConfiguration `json:"limited,omitempty" protobuf:"bytes,2,opt,name=limited"` + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + Exempt *ExemptPriorityLevelConfiguration `json:"exempt,omitempty" protobuf:"bytes,3,opt,name=exempt"` } // PriorityLevelEnablement indicates whether limits on execution are enabled for the priority level @@ -505,6 +515,43 @@ type LimitedPriorityLevelConfiguration struct { BorrowingLimitPercent *int32 `json:"borrowingLimitPercent,omitempty" protobuf:"varint,4,opt,name=borrowingLimitPercent"` } +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +type ExemptPriorityLevelConfiguration struct { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty" protobuf:"varint,1,opt,name=nominalConcurrencyShares"` + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + LendablePercent *int32 `json:"lendablePercent,omitempty" protobuf:"varint,2,opt,name=lendablePercent"` + // The `BorrowingCL` of an Exempt priority level is implicitly `ServerCL`. + // In other words, an exempt priority level + // has no meaningful limit on how much it borrows. + // There is no explicit representation of that here. +} + // LimitResponse defines how to handle requests that can not be executed right now. // +union type LimitResponse struct { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go index b2eff7f96..49a417809 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go @@ -27,6 +27,16 @@ package v1beta2 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ExemptPriorityLevelConfiguration = map[string]string{ + "": "ExemptPriorityLevelConfiguration describes the configurable aspects of the handling of exempt requests. In the mandatory exempt configuration object the values in the fields here can be modified by authorized users, unlike the rest of the `spec`.", + "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats nominally reserved for this priority level. This DOES NOT limit the dispatching from this priority level but affects the other priority levels through the borrowing mechanism. The server's concurrency limit (ServerCL) is divided among all the priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other priority level. This field has a default value of zero.", + "lendablePercent": "`lendablePercent` prescribes the fraction of the level's NominalCL that can be borrowed by other priority levels. This value of this field must be between 0 and 100, inclusive, and it defaults to 0. The number of seats that other levels can borrow from this level, known as this level's LendableConcurrencyLimit (LendableCL), is defined as follows.\n\nLendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 )", +} + +func (ExemptPriorityLevelConfiguration) SwaggerDoc() map[string]string { + return map_ExemptPriorityLevelConfiguration +} + var map_FlowDistinguisherMethod = map[string]string{ "": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "type": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", @@ -190,6 +200,7 @@ var map_PriorityLevelConfigurationSpec = map[string]string{ "": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", "type": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", "limited": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`.", + "exempt": "`exempt` specifies how requests are handled for an exempt priority level. This field MUST be empty if `type` is `\"Limited\"`. This field MAY be non-empty if `type` is `\"Exempt\"`. If empty and `type` is `\"Exempt\"` then the default values for `ExemptPriorityLevelConfiguration` apply.", } func (PriorityLevelConfigurationSpec) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/zz_generated.deepcopy.go index aa692484c..e0605b95d 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta2/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta2/zz_generated.deepcopy.go @@ -25,6 +25,32 @@ import ( 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 *ExemptPriorityLevelConfiguration) DeepCopyInto(out *ExemptPriorityLevelConfiguration) { + *out = *in + if in.NominalConcurrencyShares != nil { + in, out := &in.NominalConcurrencyShares, &out.NominalConcurrencyShares + *out = new(int32) + **out = **in + } + if in.LendablePercent != nil { + in, out := &in.LendablePercent, &out.LendablePercent + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExemptPriorityLevelConfiguration. +func (in *ExemptPriorityLevelConfiguration) DeepCopy() *ExemptPriorityLevelConfiguration { + if in == nil { + return nil + } + out := new(ExemptPriorityLevelConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlowDistinguisherMethod) DeepCopyInto(out *FlowDistinguisherMethod) { *out = *in @@ -400,6 +426,11 @@ func (in *PriorityLevelConfigurationSpec) DeepCopyInto(out *PriorityLevelConfigu *out = new(LimitedPriorityLevelConfiguration) (*in).DeepCopyInto(*out) } + if in.Exempt != nil { + in, out := &in.Exempt, &out.Exempt + *out = new(ExemptPriorityLevelConfiguration) + (*in).DeepCopyInto(*out) + } return } diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go index 166e8520b..c6598306d 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go @@ -43,10 +43,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ExemptPriorityLevelConfiguration) Reset() { *m = ExemptPriorityLevelConfiguration{} } +func (*ExemptPriorityLevelConfiguration) ProtoMessage() {} +func (*ExemptPriorityLevelConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_803504887082f044, []int{0} +} +func (m *ExemptPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExemptPriorityLevelConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExemptPriorityLevelConfiguration.Merge(m, src) +} +func (m *ExemptPriorityLevelConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ExemptPriorityLevelConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ExemptPriorityLevelConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ExemptPriorityLevelConfiguration proto.InternalMessageInfo + func (m *FlowDistinguisherMethod) Reset() { *m = FlowDistinguisherMethod{} } func (*FlowDistinguisherMethod) ProtoMessage() {} func (*FlowDistinguisherMethod) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{0} + return fileDescriptor_803504887082f044, []int{1} } func (m *FlowDistinguisherMethod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +102,7 @@ var xxx_messageInfo_FlowDistinguisherMethod proto.InternalMessageInfo func (m *FlowSchema) Reset() { *m = FlowSchema{} } func (*FlowSchema) ProtoMessage() {} func (*FlowSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{1} + return fileDescriptor_803504887082f044, []int{2} } func (m *FlowSchema) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +130,7 @@ var xxx_messageInfo_FlowSchema proto.InternalMessageInfo func (m *FlowSchemaCondition) Reset() { *m = FlowSchemaCondition{} } func (*FlowSchemaCondition) ProtoMessage() {} func (*FlowSchemaCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{2} + return fileDescriptor_803504887082f044, []int{3} } func (m *FlowSchemaCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +158,7 @@ var xxx_messageInfo_FlowSchemaCondition proto.InternalMessageInfo func (m *FlowSchemaList) Reset() { *m = FlowSchemaList{} } func (*FlowSchemaList) ProtoMessage() {} func (*FlowSchemaList) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{3} + return fileDescriptor_803504887082f044, []int{4} } func (m *FlowSchemaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +186,7 @@ var xxx_messageInfo_FlowSchemaList proto.InternalMessageInfo func (m *FlowSchemaSpec) Reset() { *m = FlowSchemaSpec{} } func (*FlowSchemaSpec) ProtoMessage() {} func (*FlowSchemaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{4} + return fileDescriptor_803504887082f044, []int{5} } func (m *FlowSchemaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +214,7 @@ var xxx_messageInfo_FlowSchemaSpec proto.InternalMessageInfo func (m *FlowSchemaStatus) Reset() { *m = FlowSchemaStatus{} } func (*FlowSchemaStatus) ProtoMessage() {} func (*FlowSchemaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{5} + return fileDescriptor_803504887082f044, []int{6} } func (m *FlowSchemaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +242,7 @@ var xxx_messageInfo_FlowSchemaStatus proto.InternalMessageInfo func (m *GroupSubject) Reset() { *m = GroupSubject{} } func (*GroupSubject) ProtoMessage() {} func (*GroupSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{6} + return fileDescriptor_803504887082f044, []int{7} } func (m *GroupSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +270,7 @@ var xxx_messageInfo_GroupSubject proto.InternalMessageInfo func (m *LimitResponse) Reset() { *m = LimitResponse{} } func (*LimitResponse) ProtoMessage() {} func (*LimitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{7} + return fileDescriptor_803504887082f044, []int{8} } func (m *LimitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +298,7 @@ var xxx_messageInfo_LimitResponse proto.InternalMessageInfo func (m *LimitedPriorityLevelConfiguration) Reset() { *m = LimitedPriorityLevelConfiguration{} } func (*LimitedPriorityLevelConfiguration) ProtoMessage() {} func (*LimitedPriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{8} + return fileDescriptor_803504887082f044, []int{9} } func (m *LimitedPriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +326,7 @@ var xxx_messageInfo_LimitedPriorityLevelConfiguration proto.InternalMessageInfo func (m *NonResourcePolicyRule) Reset() { *m = NonResourcePolicyRule{} } func (*NonResourcePolicyRule) ProtoMessage() {} func (*NonResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{9} + return fileDescriptor_803504887082f044, []int{10} } func (m *NonResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +354,7 @@ var xxx_messageInfo_NonResourcePolicyRule proto.InternalMessageInfo func (m *PolicyRulesWithSubjects) Reset() { *m = PolicyRulesWithSubjects{} } func (*PolicyRulesWithSubjects) ProtoMessage() {} func (*PolicyRulesWithSubjects) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{10} + return fileDescriptor_803504887082f044, []int{11} } func (m *PolicyRulesWithSubjects) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +382,7 @@ var xxx_messageInfo_PolicyRulesWithSubjects proto.InternalMessageInfo func (m *PriorityLevelConfiguration) Reset() { *m = PriorityLevelConfiguration{} } func (*PriorityLevelConfiguration) ProtoMessage() {} func (*PriorityLevelConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{11} + return fileDescriptor_803504887082f044, []int{12} } func (m *PriorityLevelConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +410,7 @@ var xxx_messageInfo_PriorityLevelConfiguration proto.InternalMessageInfo func (m *PriorityLevelConfigurationCondition) Reset() { *m = PriorityLevelConfigurationCondition{} } func (*PriorityLevelConfigurationCondition) ProtoMessage() {} func (*PriorityLevelConfigurationCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{12} + return fileDescriptor_803504887082f044, []int{13} } func (m *PriorityLevelConfigurationCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +438,7 @@ var xxx_messageInfo_PriorityLevelConfigurationCondition proto.InternalMessageInf func (m *PriorityLevelConfigurationList) Reset() { *m = PriorityLevelConfigurationList{} } func (*PriorityLevelConfigurationList) ProtoMessage() {} func (*PriorityLevelConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{13} + return fileDescriptor_803504887082f044, []int{14} } func (m *PriorityLevelConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +466,7 @@ var xxx_messageInfo_PriorityLevelConfigurationList proto.InternalMessageInfo func (m *PriorityLevelConfigurationReference) Reset() { *m = PriorityLevelConfigurationReference{} } func (*PriorityLevelConfigurationReference) ProtoMessage() {} func (*PriorityLevelConfigurationReference) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{14} + return fileDescriptor_803504887082f044, []int{15} } func (m *PriorityLevelConfigurationReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +494,7 @@ var xxx_messageInfo_PriorityLevelConfigurationReference proto.InternalMessageInf func (m *PriorityLevelConfigurationSpec) Reset() { *m = PriorityLevelConfigurationSpec{} } func (*PriorityLevelConfigurationSpec) ProtoMessage() {} func (*PriorityLevelConfigurationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{15} + return fileDescriptor_803504887082f044, []int{16} } func (m *PriorityLevelConfigurationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +522,7 @@ var xxx_messageInfo_PriorityLevelConfigurationSpec proto.InternalMessageInfo func (m *PriorityLevelConfigurationStatus) Reset() { *m = PriorityLevelConfigurationStatus{} } func (*PriorityLevelConfigurationStatus) ProtoMessage() {} func (*PriorityLevelConfigurationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{16} + return fileDescriptor_803504887082f044, []int{17} } func (m *PriorityLevelConfigurationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +550,7 @@ var xxx_messageInfo_PriorityLevelConfigurationStatus proto.InternalMessageInfo func (m *QueuingConfiguration) Reset() { *m = QueuingConfiguration{} } func (*QueuingConfiguration) ProtoMessage() {} func (*QueuingConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{17} + return fileDescriptor_803504887082f044, []int{18} } func (m *QueuingConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +578,7 @@ var xxx_messageInfo_QueuingConfiguration proto.InternalMessageInfo func (m *ResourcePolicyRule) Reset() { *m = ResourcePolicyRule{} } func (*ResourcePolicyRule) ProtoMessage() {} func (*ResourcePolicyRule) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{18} + return fileDescriptor_803504887082f044, []int{19} } func (m *ResourcePolicyRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +606,7 @@ var xxx_messageInfo_ResourcePolicyRule proto.InternalMessageInfo func (m *ServiceAccountSubject) Reset() { *m = ServiceAccountSubject{} } func (*ServiceAccountSubject) ProtoMessage() {} func (*ServiceAccountSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{19} + return fileDescriptor_803504887082f044, []int{20} } func (m *ServiceAccountSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +634,7 @@ var xxx_messageInfo_ServiceAccountSubject proto.InternalMessageInfo func (m *Subject) Reset() { *m = Subject{} } func (*Subject) ProtoMessage() {} func (*Subject) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{20} + return fileDescriptor_803504887082f044, []int{21} } func (m *Subject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +662,7 @@ var xxx_messageInfo_Subject proto.InternalMessageInfo func (m *UserSubject) Reset() { *m = UserSubject{} } func (*UserSubject) ProtoMessage() {} func (*UserSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_803504887082f044, []int{21} + return fileDescriptor_803504887082f044, []int{22} } func (m *UserSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -660,6 +688,7 @@ func (m *UserSubject) XXX_DiscardUnknown() { var xxx_messageInfo_UserSubject proto.InternalMessageInfo func init() { + proto.RegisterType((*ExemptPriorityLevelConfiguration)(nil), "k8s.io.api.flowcontrol.v1beta3.ExemptPriorityLevelConfiguration") proto.RegisterType((*FlowDistinguisherMethod)(nil), "k8s.io.api.flowcontrol.v1beta3.FlowDistinguisherMethod") proto.RegisterType((*FlowSchema)(nil), "k8s.io.api.flowcontrol.v1beta3.FlowSchema") proto.RegisterType((*FlowSchemaCondition)(nil), "k8s.io.api.flowcontrol.v1beta3.FlowSchemaCondition") @@ -689,104 +718,141 @@ func init() { } var fileDescriptor_803504887082f044 = []byte{ - // 1552 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0xdb, 0x46, - 0x13, 0x36, 0x65, 0xc9, 0xb6, 0xd6, 0x9f, 0x59, 0xc7, 0xb0, 0x5e, 0x07, 0x90, 0x1c, 0xbe, 0xc0, - 0x9b, 0xb7, 0x4d, 0x42, 0xe5, 0xb3, 0x49, 0x5b, 0xf4, 0x23, 0x74, 0xda, 0x34, 0x8d, 0xed, 0x38, - 0xeb, 0xa4, 0x2d, 0xd2, 0x00, 0x0d, 0x45, 0xad, 0xa9, 0x8d, 0x25, 0x92, 0xd9, 0x25, 0x65, 0xb8, - 0xb9, 0x14, 0xfd, 0x05, 0x3d, 0xb7, 0xc7, 0x1e, 0x7a, 0xef, 0x1f, 0xe8, 0xb1, 0x41, 0x4f, 0x39, - 0xe6, 0xa4, 0x36, 0xea, 0xa9, 0xff, 0xa0, 0x0d, 0x50, 0xa0, 0xd8, 0xe5, 0x92, 0x14, 0xa9, 0x0f, - 0x0a, 0x09, 0x90, 0x53, 0x6f, 0xe6, 0xcc, 0x33, 0xcf, 0xec, 0xcc, 0xce, 0xcc, 0x8e, 0x0c, 0xae, - 0xed, 0x5f, 0x66, 0x1a, 0x71, 0xaa, 0xfb, 0x7e, 0x0d, 0x53, 0x1b, 0x7b, 0x98, 0x55, 0xdb, 0xd8, - 0xae, 0x3b, 0xb4, 0x2a, 0x15, 0x86, 0x4b, 0xaa, 0x7b, 0x4d, 0xe7, 0xc0, 0x74, 0x6c, 0x8f, 0x3a, - 0xcd, 0x6a, 0xfb, 0x6c, 0x0d, 0x7b, 0xc6, 0xf9, 0xaa, 0x85, 0x6d, 0x4c, 0x0d, 0x0f, 0xd7, 0x35, - 0x97, 0x3a, 0x9e, 0x03, 0xcb, 0x01, 0x5e, 0x33, 0x5c, 0xa2, 0xf5, 0xe0, 0x35, 0x89, 0x5f, 0x3b, - 0x6d, 0x11, 0xaf, 0xe1, 0xd7, 0x34, 0xd3, 0x69, 0x55, 0x2d, 0xc7, 0x72, 0xaa, 0xc2, 0xac, 0xe6, - 0xef, 0x89, 0x2f, 0xf1, 0x21, 0xfe, 0x0a, 0xe8, 0xd6, 0x2e, 0xc4, 0xee, 0x5b, 0x86, 0xd9, 0x20, - 0x36, 0xa6, 0x87, 0x55, 0x77, 0xdf, 0xe2, 0x02, 0x56, 0x6d, 0x61, 0xcf, 0xa8, 0xb6, 0xcf, 0xa6, - 0x0f, 0xb1, 0x56, 0x1d, 0x66, 0x45, 0x7d, 0xdb, 0x23, 0x2d, 0xdc, 0x67, 0xf0, 0x46, 0x96, 0x01, - 0x33, 0x1b, 0xb8, 0x65, 0xa4, 0xed, 0xd4, 0xbb, 0x60, 0xf5, 0xc3, 0xa6, 0x73, 0x70, 0x95, 0x30, - 0x8f, 0xd8, 0x96, 0x4f, 0x58, 0x03, 0xd3, 0x2d, 0xec, 0x35, 0x9c, 0x3a, 0x7c, 0x0f, 0xe4, 0xbd, - 0x43, 0x17, 0x97, 0x94, 0x75, 0xe5, 0xff, 0x45, 0xfd, 0xe4, 0xe3, 0x4e, 0x65, 0xa2, 0xdb, 0xa9, - 0xe4, 0x6f, 0x1f, 0xba, 0xf8, 0x79, 0xa7, 0x72, 0x6c, 0x88, 0x19, 0x57, 0x23, 0x61, 0xa8, 0x7e, - 0x9b, 0x03, 0x80, 0xa3, 0x76, 0x85, 0x6b, 0x78, 0x1f, 0xcc, 0xf0, 0x70, 0xeb, 0x86, 0x67, 0x08, - 0xce, 0xd9, 0x73, 0x67, 0xb4, 0x38, 0xd7, 0xd1, 0xa9, 0x35, 0x77, 0xdf, 0xe2, 0x02, 0xa6, 0x71, - 0xb4, 0xd6, 0x3e, 0xab, 0xdd, 0xac, 0x3d, 0xc0, 0xa6, 0xb7, 0x85, 0x3d, 0x43, 0x87, 0xf2, 0x14, - 0x20, 0x96, 0xa1, 0x88, 0x15, 0xee, 0x80, 0x3c, 0x73, 0xb1, 0x59, 0xca, 0x09, 0x76, 0x4d, 0x1b, - 0x7d, 0x93, 0x5a, 0x7c, 0xb6, 0x5d, 0x17, 0x9b, 0xfa, 0x5c, 0x18, 0x21, 0xff, 0x42, 0x82, 0x09, - 0x7e, 0x06, 0xa6, 0x98, 0x67, 0x78, 0x3e, 0x2b, 0x4d, 0xf6, 0x9d, 0x38, 0x8b, 0x53, 0xd8, 0xe9, - 0x0b, 0x92, 0x75, 0x2a, 0xf8, 0x46, 0x92, 0x4f, 0x7d, 0x9a, 0x03, 0xcb, 0x31, 0x78, 0xc3, 0xb1, - 0xeb, 0xc4, 0x23, 0x8e, 0x0d, 0xdf, 0x4e, 0x64, 0xfd, 0x44, 0x2a, 0xeb, 0xab, 0x03, 0x4c, 0xe2, - 0x8c, 0xc3, 0x37, 0xa3, 0xe3, 0xe6, 0x84, 0xf9, 0xf1, 0xa4, 0xf3, 0xe7, 0x9d, 0xca, 0x62, 0x64, - 0x96, 0x3c, 0x0f, 0x6c, 0x03, 0xd8, 0x34, 0x98, 0x77, 0x9b, 0x1a, 0x36, 0x0b, 0x68, 0x49, 0x0b, - 0xcb, 0xa8, 0x5f, 0x1f, 0xef, 0x9e, 0xb8, 0x85, 0xbe, 0x26, 0x5d, 0xc2, 0xcd, 0x3e, 0x36, 0x34, - 0xc0, 0x03, 0xfc, 0x1f, 0x98, 0xa2, 0xd8, 0x60, 0x8e, 0x5d, 0xca, 0x8b, 0x23, 0x47, 0xf9, 0x42, - 0x42, 0x8a, 0xa4, 0x16, 0xbe, 0x06, 0xa6, 0x5b, 0x98, 0x31, 0xc3, 0xc2, 0xa5, 0x82, 0x00, 0x2e, - 0x4a, 0xe0, 0xf4, 0x56, 0x20, 0x46, 0xa1, 0x5e, 0xfd, 0x49, 0x01, 0x0b, 0x71, 0x9e, 0x36, 0x09, - 0xf3, 0xe0, 0xbd, 0xbe, 0xda, 0xd3, 0xc6, 0x8b, 0x89, 0x5b, 0x8b, 0xca, 0x5b, 0x92, 0xee, 0x66, - 0x42, 0x49, 0x4f, 0xdd, 0xdd, 0x04, 0x05, 0xe2, 0xe1, 0x16, 0xcf, 0xfa, 0x64, 0x2a, 0x5d, 0x19, - 0x45, 0xa2, 0xcf, 0x4b, 0xda, 0xc2, 0x75, 0x4e, 0x80, 0x02, 0x1e, 0xf5, 0x8f, 0xc9, 0xde, 0x08, - 0x78, 0x3d, 0xc2, 0x1f, 0x14, 0xb0, 0xe6, 0x52, 0xe2, 0x50, 0xe2, 0x1d, 0x6e, 0xe2, 0x36, 0x6e, - 0x6e, 0x38, 0xf6, 0x1e, 0xb1, 0x7c, 0x6a, 0xf0, 0x54, 0xca, 0xa0, 0x36, 0xb2, 0x3c, 0xef, 0x0c, - 0x65, 0x40, 0x78, 0x0f, 0x53, 0x6c, 0x9b, 0x58, 0x57, 0xe5, 0x91, 0xd6, 0x46, 0x80, 0x47, 0x1c, - 0x05, 0x7e, 0x0c, 0x60, 0xcb, 0xf0, 0x78, 0x46, 0xad, 0x1d, 0x8a, 0x4d, 0x5c, 0xe7, 0xac, 0xa2, - 0x20, 0x0b, 0x71, 0x75, 0x6c, 0xf5, 0x21, 0xd0, 0x00, 0x2b, 0xf8, 0xb5, 0x02, 0x96, 0xeb, 0xfd, - 0x43, 0x46, 0xd6, 0xe5, 0xa5, 0x71, 0x12, 0x3d, 0x60, 0x46, 0xe9, 0xab, 0xdd, 0x4e, 0x65, 0x79, - 0x80, 0x02, 0x0d, 0x72, 0x06, 0xef, 0x81, 0x02, 0xf5, 0x9b, 0x98, 0x95, 0xf2, 0xe2, 0x7a, 0x33, - 0xbd, 0xee, 0x38, 0x4d, 0x62, 0x1e, 0x22, 0x6e, 0xf2, 0x29, 0xf1, 0x1a, 0xbb, 0xbe, 0x98, 0x55, - 0x2c, 0xbe, 0x6b, 0xa1, 0x42, 0x01, 0xa9, 0xfa, 0x08, 0x2c, 0xa5, 0x87, 0x06, 0xb4, 0x00, 0x30, - 0xc3, 0x3e, 0x65, 0x25, 0x45, 0xb8, 0x3d, 0x3f, 0x7e, 0x55, 0x45, 0x3d, 0x1e, 0xcf, 0xcb, 0x48, - 0xc4, 0x50, 0x0f, 0xb5, 0x7a, 0x06, 0xcc, 0x5d, 0xa3, 0x8e, 0xef, 0xca, 0x33, 0xc2, 0x75, 0x90, - 0xb7, 0x8d, 0x56, 0x38, 0x7d, 0xa2, 0x89, 0xb8, 0x6d, 0xb4, 0x30, 0x12, 0x1a, 0xf5, 0x7b, 0x05, - 0xcc, 0x6f, 0x92, 0x16, 0xf1, 0x10, 0x66, 0xae, 0x63, 0x33, 0x0c, 0x2f, 0x26, 0x26, 0xd6, 0xf1, - 0xd4, 0xc4, 0x3a, 0x92, 0x00, 0xf7, 0xcc, 0xaa, 0xcf, 0xc1, 0xf4, 0x43, 0x1f, 0xfb, 0xc4, 0xb6, - 0xe4, 0xbc, 0xbe, 0x90, 0x15, 0xe0, 0xad, 0x00, 0x9e, 0xa8, 0x36, 0x7d, 0x96, 0x8f, 0x00, 0xa9, - 0x41, 0x21, 0xa3, 0xfa, 0x77, 0x0e, 0x1c, 0x17, 0x8e, 0x71, 0x7d, 0x78, 0x15, 0xc3, 0x7b, 0xa0, - 0x64, 0x3b, 0x2d, 0x62, 0x1b, 0x5c, 0x6e, 0xfa, 0x94, 0xd7, 0xff, 0xe1, 0x6e, 0xc3, 0xa0, 0x98, - 0x89, 0x68, 0x0a, 0xfa, 0xba, 0x8c, 0xa6, 0xb4, 0x3d, 0x04, 0x87, 0x86, 0x32, 0xc0, 0x07, 0x60, - 0xbe, 0xd9, 0x1b, 0xbb, 0x0c, 0xf3, 0x74, 0x56, 0x98, 0x89, 0x84, 0xe9, 0x2b, 0xf2, 0x04, 0xc9, - 0xa4, 0xa3, 0x24, 0x35, 0x7c, 0x07, 0x2c, 0x36, 0xb1, 0x5d, 0x37, 0x6a, 0x4d, 0xbc, 0x83, 0xa9, - 0x89, 0x6d, 0x4f, 0xb4, 0x48, 0x41, 0x5f, 0xee, 0x76, 0x2a, 0x8b, 0x9b, 0x49, 0x15, 0x4a, 0x63, - 0xe1, 0x4d, 0xb0, 0x52, 0x73, 0x28, 0x75, 0x0e, 0x88, 0x6d, 0x09, 0x3f, 0x21, 0x49, 0x5e, 0x90, - 0xfc, 0xa7, 0xdb, 0xa9, 0xac, 0xe8, 0x83, 0x00, 0x68, 0xb0, 0x9d, 0x7a, 0x00, 0x56, 0xb6, 0xf9, - 0x4c, 0x61, 0x8e, 0x4f, 0x4d, 0x1c, 0x37, 0x04, 0xac, 0x80, 0x42, 0x1b, 0xd3, 0x5a, 0x50, 0xd4, - 0x45, 0xbd, 0xc8, 0xdb, 0xe1, 0x13, 0x2e, 0x40, 0x81, 0x9c, 0x47, 0x62, 0xc7, 0x96, 0x77, 0xd0, - 0x26, 0x2b, 0x4d, 0x09, 0xa8, 0x88, 0x64, 0x3b, 0xa9, 0x42, 0x69, 0xac, 0xda, 0xc9, 0x81, 0xd5, - 0x21, 0xfd, 0x07, 0xef, 0x80, 0x19, 0x26, 0xff, 0x96, 0x3d, 0x75, 0x22, 0xeb, 0x2e, 0xa4, 0x6d, - 0x3c, 0xfd, 0x43, 0x32, 0x14, 0x51, 0x41, 0x07, 0xcc, 0x53, 0x79, 0x04, 0xe1, 0x53, 0xbe, 0x02, - 0xe7, 0xb2, 0xb8, 0xfb, 0xb3, 0x13, 0x5f, 0x36, 0xea, 0x25, 0x44, 0x49, 0x7e, 0xf8, 0x08, 0x2c, - 0xf5, 0x84, 0x1d, 0xf8, 0x9c, 0x14, 0x3e, 0x2f, 0x66, 0xf9, 0x1c, 0x78, 0x29, 0x7a, 0x49, 0xba, - 0x5d, 0xda, 0x4e, 0xd1, 0xa2, 0x3e, 0x47, 0xea, 0x2f, 0x39, 0x30, 0xe2, 0x61, 0x78, 0x05, 0x4b, - 0xde, 0xfd, 0xc4, 0x92, 0xf7, 0xee, 0x8b, 0xbf, 0x78, 0x43, 0x97, 0xbe, 0x46, 0x6a, 0xe9, 0x7b, - 0xff, 0x25, 0x7c, 0x8c, 0x5e, 0x02, 0xff, 0xcc, 0x81, 0xff, 0x0e, 0x37, 0x8e, 0x97, 0xc2, 0x1b, - 0x89, 0x11, 0x7b, 0x29, 0x35, 0x62, 0x4f, 0x8c, 0x41, 0xf1, 0xef, 0x92, 0x98, 0x5a, 0x12, 0x7f, - 0x55, 0x40, 0x79, 0x78, 0xde, 0x5e, 0xc1, 0xd2, 0xf8, 0x45, 0x72, 0x69, 0x7c, 0xeb, 0xc5, 0x8b, - 0x6c, 0xc8, 0x12, 0x79, 0x6d, 0x54, 0x6d, 0x45, 0xeb, 0xde, 0x18, 0x4f, 0xfe, 0xcf, 0x23, 0x53, - 0x25, 0xb6, 0xd3, 0x8c, 0x5f, 0x2d, 0x09, 0xeb, 0x0f, 0x6c, 0xfe, 0xf4, 0xb4, 0xf8, 0xeb, 0x11, - 0x14, 0x64, 0x03, 0x4c, 0x37, 0x83, 0xb7, 0x5a, 0x36, 0xf5, 0x95, 0xb1, 0x9e, 0xc8, 0x51, 0x4f, - 0x7b, 0xb0, 0x16, 0x48, 0x18, 0x0a, 0xe9, 0xd5, 0xef, 0x14, 0xb0, 0x9e, 0xd5, 0xac, 0xf0, 0x60, - 0xc0, 0xf2, 0xf5, 0x12, 0x8b, 0xf5, 0xf8, 0xcb, 0xd8, 0x8f, 0x0a, 0x38, 0x3a, 0x68, 0xc7, 0xe1, - 0xe5, 0xcf, 0x17, 0x9b, 0x68, 0x2b, 0x89, 0xca, 0xff, 0x96, 0x90, 0x22, 0xa9, 0x85, 0xa7, 0xc0, - 0x4c, 0xc3, 0xb0, 0xeb, 0xbb, 0xe4, 0xcb, 0x70, 0xdf, 0x8e, 0x0a, 0xf0, 0x23, 0x29, 0x47, 0x11, - 0x02, 0x5e, 0x05, 0x4b, 0xc2, 0x6e, 0x13, 0xdb, 0x96, 0xd7, 0x10, 0xb9, 0x92, 0x4b, 0x43, 0xf4, - 0x1e, 0xdc, 0x4a, 0xe9, 0x51, 0x9f, 0x85, 0xfa, 0x97, 0x02, 0xe0, 0x8b, 0xbc, 0xf3, 0x27, 0x41, - 0xd1, 0x70, 0x89, 0x58, 0x3e, 0x83, 0x16, 0x28, 0xea, 0xf3, 0xdd, 0x4e, 0xa5, 0x78, 0x65, 0xe7, - 0x7a, 0x20, 0x44, 0xb1, 0x9e, 0x83, 0xc3, 0x27, 0x30, 0x78, 0xea, 0x24, 0x38, 0x74, 0xcc, 0x50, - 0xac, 0x87, 0x97, 0xc1, 0x9c, 0xd9, 0xf4, 0x99, 0x87, 0xe9, 0xae, 0xe9, 0xb8, 0x58, 0x8c, 0x8c, - 0x19, 0xfd, 0xa8, 0x8c, 0x69, 0x6e, 0xa3, 0x47, 0x87, 0x12, 0x48, 0xa8, 0x01, 0xc0, 0x0b, 0x9e, - 0xb9, 0x06, 0xf7, 0x53, 0x10, 0x7e, 0x16, 0xf8, 0x85, 0x6d, 0x47, 0x52, 0xd4, 0x83, 0x50, 0x1f, - 0x80, 0x95, 0x5d, 0x4c, 0xdb, 0xc4, 0xc4, 0x57, 0x4c, 0xd3, 0xf1, 0x6d, 0x2f, 0x5c, 0xa3, 0xab, - 0xa0, 0x18, 0xc1, 0x64, 0x4f, 0x1c, 0x91, 0xfe, 0x8b, 0x11, 0x17, 0x8a, 0x31, 0x51, 0x13, 0xe6, - 0x86, 0x37, 0x61, 0x0e, 0x4c, 0xc7, 0xf4, 0xf9, 0x7d, 0x62, 0xd7, 0x25, 0xf3, 0xb1, 0x10, 0x7d, - 0x83, 0xd8, 0xf5, 0xe7, 0x9d, 0xca, 0xac, 0x84, 0xf1, 0x4f, 0x24, 0x80, 0xf0, 0x3a, 0xc8, 0xfb, - 0x0c, 0x53, 0xd9, 0x5e, 0x27, 0xb3, 0x8a, 0xf9, 0x0e, 0xc3, 0x34, 0xdc, 0x7c, 0x66, 0x38, 0x33, - 0x17, 0x20, 0x41, 0x01, 0xb7, 0x40, 0xc1, 0xe2, 0x97, 0x22, 0xa7, 0xfe, 0xa9, 0x2c, 0xae, 0xde, - 0x9f, 0x17, 0x41, 0x19, 0x08, 0x09, 0x0a, 0x58, 0xe0, 0x43, 0xb0, 0xc0, 0x12, 0x29, 0x14, 0xd7, - 0x35, 0xc6, 0x26, 0x33, 0x30, 0xf1, 0x3a, 0xec, 0x76, 0x2a, 0x0b, 0x49, 0x15, 0x4a, 0x39, 0x50, - 0xab, 0x60, 0xb6, 0x27, 0xc0, 0xec, 0xf9, 0xa7, 0x5f, 0x7d, 0xfc, 0xac, 0x3c, 0xf1, 0xe4, 0x59, - 0x79, 0xe2, 0xe9, 0xb3, 0xf2, 0xc4, 0x57, 0xdd, 0xb2, 0xf2, 0xb8, 0x5b, 0x56, 0x9e, 0x74, 0xcb, - 0xca, 0xd3, 0x6e, 0x59, 0xf9, 0xad, 0x5b, 0x56, 0xbe, 0xf9, 0xbd, 0x3c, 0x71, 0xb7, 0x3c, 0xfa, - 0xff, 0x8c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x98, 0x4a, 0x24, 0x86, 0xa1, 0x14, 0x00, 0x00, + // 1604 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcb, 0x73, 0xdb, 0x54, + 0x17, 0x8f, 0x1c, 0x3b, 0x89, 0x4f, 0x9e, 0xbd, 0x69, 0x26, 0xfe, 0xd2, 0x6f, 0xec, 0x54, 0xdf, + 0xcc, 0x57, 0xa0, 0xad, 0xdc, 0x27, 0x2d, 0x30, 0x3c, 0xaa, 0xb4, 0x94, 0xd2, 0x24, 0x4d, 0x6f, + 0x5a, 0xe8, 0x94, 0xce, 0x50, 0x59, 0xbe, 0xb1, 0xd5, 0x58, 0x8f, 0xea, 0x4a, 0x0e, 0xa1, 0x1b, + 0x86, 0xbf, 0x80, 0x35, 0x2c, 0x59, 0xb0, 0x62, 0xc3, 0x96, 0x05, 0x4b, 0x3a, 0xac, 0xba, 0xec, + 0xca, 0x50, 0xb3, 0xe2, 0x3f, 0x80, 0xce, 0x30, 0xc3, 0xdc, 0xab, 0x2b, 0xc9, 0xf2, 0x4b, 0x9e, + 0x74, 0xa6, 0x2b, 0x76, 0xd1, 0x79, 0xfc, 0xce, 0xbd, 0xe7, 0x9e, 0xc7, 0xcf, 0x81, 0xab, 0xbb, + 0x17, 0xa9, 0x62, 0xd8, 0xe5, 0x5d, 0xbf, 0x42, 0x5c, 0x8b, 0x78, 0x84, 0x96, 0x9b, 0xc4, 0xaa, + 0xda, 0x6e, 0x59, 0x28, 0x34, 0xc7, 0x28, 0xef, 0x34, 0xec, 0x3d, 0xdd, 0xb6, 0x3c, 0xd7, 0x6e, + 0x94, 0x9b, 0xa7, 0x2b, 0xc4, 0xd3, 0xce, 0x96, 0x6b, 0xc4, 0x22, 0xae, 0xe6, 0x91, 0xaa, 0xe2, + 0xb8, 0xb6, 0x67, 0xa3, 0x62, 0x60, 0xaf, 0x68, 0x8e, 0xa1, 0x74, 0xd8, 0x2b, 0xc2, 0x7e, 0xe5, + 0x64, 0xcd, 0xf0, 0xea, 0x7e, 0x45, 0xd1, 0x6d, 0xb3, 0x5c, 0xb3, 0x6b, 0x76, 0x99, 0xbb, 0x55, + 0xfc, 0x1d, 0xfe, 0xc5, 0x3f, 0xf8, 0x5f, 0x01, 0xdc, 0xca, 0xb9, 0x38, 0xbc, 0xa9, 0xe9, 0x75, + 0xc3, 0x22, 0xee, 0x7e, 0xd9, 0xd9, 0xad, 0x31, 0x01, 0x2d, 0x9b, 0xc4, 0xd3, 0xca, 0xcd, 0xd3, + 0xdd, 0x87, 0x58, 0x29, 0x0f, 0xf2, 0x72, 0x7d, 0xcb, 0x33, 0x4c, 0xd2, 0xe3, 0xf0, 0x7a, 0x9a, + 0x03, 0xd5, 0xeb, 0xc4, 0xd4, 0xba, 0xfd, 0xe4, 0x1f, 0x25, 0x58, 0xbd, 0xf2, 0x19, 0x31, 0x1d, + 0x6f, 0xcb, 0x35, 0x6c, 0xd7, 0xf0, 0xf6, 0xd7, 0x49, 0x93, 0x34, 0xd6, 0x6c, 0x6b, 0xc7, 0xa8, + 0xf9, 0xae, 0xe6, 0x19, 0xb6, 0x85, 0xee, 0x40, 0xc1, 0xb2, 0x4d, 0xc3, 0xd2, 0x98, 0x5c, 0xf7, + 0x5d, 0x97, 0x58, 0xfa, 0xfe, 0x76, 0x5d, 0x73, 0x09, 0x2d, 0x48, 0xab, 0xd2, 0x2b, 0x39, 0xf5, + 0xbf, 0xed, 0x56, 0xa9, 0xb0, 0x39, 0xc0, 0x06, 0x0f, 0xf4, 0x46, 0x6f, 0xc3, 0x7c, 0x83, 0x58, + 0x55, 0xad, 0xd2, 0x20, 0x5b, 0xc4, 0xd5, 0x89, 0xe5, 0x15, 0x32, 0x1c, 0x70, 0xb1, 0xdd, 0x2a, + 0xcd, 0xaf, 0x27, 0x55, 0xb8, 0xdb, 0x56, 0xbe, 0x0b, 0xcb, 0xef, 0x37, 0xec, 0xbd, 0xcb, 0x06, + 0xf5, 0x0c, 0xab, 0xe6, 0x1b, 0xb4, 0x4e, 0xdc, 0x0d, 0xe2, 0xd5, 0xed, 0x2a, 0x7a, 0x17, 0xb2, + 0xde, 0xbe, 0x43, 0xf8, 0xf9, 0xf2, 0xea, 0xf1, 0xc7, 0xad, 0xd2, 0x58, 0xbb, 0x55, 0xca, 0xde, + 0xda, 0x77, 0xc8, 0xf3, 0x56, 0xe9, 0xc8, 0x00, 0x37, 0xa6, 0xc6, 0xdc, 0x51, 0xfe, 0x3a, 0x03, + 0xc0, 0xac, 0xb6, 0x79, 0xe2, 0xd0, 0x7d, 0x98, 0x62, 0x8f, 0x55, 0xd5, 0x3c, 0x8d, 0x63, 0x4e, + 0x9f, 0x39, 0xa5, 0xc4, 0x95, 0x12, 0xe5, 0x5c, 0x71, 0x76, 0x6b, 0x4c, 0x40, 0x15, 0x66, 0xad, + 0x34, 0x4f, 0x2b, 0x37, 0x2a, 0x0f, 0x88, 0xee, 0x6d, 0x10, 0x4f, 0x53, 0x91, 0x38, 0x05, 0xc4, + 0x32, 0x1c, 0xa1, 0xa2, 0x2d, 0xc8, 0x52, 0x87, 0xe8, 0x3c, 0x01, 0xd3, 0x67, 0x14, 0x65, 0x78, + 0x1d, 0x2a, 0xf1, 0xd9, 0xb6, 0x1d, 0xa2, 0xab, 0x33, 0xe1, 0x0d, 0xd9, 0x17, 0xe6, 0x48, 0xe8, + 0x0e, 0x4c, 0x50, 0x4f, 0xf3, 0x7c, 0x5a, 0x18, 0xef, 0x39, 0x71, 0x1a, 0x26, 0xf7, 0x53, 0xe7, + 0x04, 0xea, 0x44, 0xf0, 0x8d, 0x05, 0x9e, 0xfc, 0x34, 0x03, 0x8b, 0xb1, 0xf1, 0x9a, 0x6d, 0x55, + 0x0d, 0x5e, 0x29, 0x6f, 0x25, 0xb2, 0x7e, 0xac, 0x2b, 0xeb, 0xcb, 0x7d, 0x5c, 0xe2, 0x8c, 0xa3, + 0x37, 0xa2, 0xe3, 0x66, 0xb8, 0xfb, 0xd1, 0x64, 0xf0, 0xe7, 0xad, 0xd2, 0x7c, 0xe4, 0x96, 0x3c, + 0x0f, 0x6a, 0x02, 0x6a, 0x68, 0xd4, 0xbb, 0xe5, 0x6a, 0x16, 0x0d, 0x60, 0x0d, 0x93, 0x88, 0x5b, + 0xbf, 0x36, 0xda, 0x3b, 0x31, 0x0f, 0x75, 0x45, 0x84, 0x44, 0xeb, 0x3d, 0x68, 0xb8, 0x4f, 0x04, + 0xf4, 0x7f, 0x98, 0x70, 0x89, 0x46, 0x6d, 0xab, 0x90, 0xe5, 0x47, 0x8e, 0xf2, 0x85, 0xb9, 0x14, + 0x0b, 0x2d, 0x7a, 0x15, 0x26, 0x4d, 0x42, 0xa9, 0x56, 0x23, 0x85, 0x1c, 0x37, 0x9c, 0x17, 0x86, + 0x93, 0x1b, 0x81, 0x18, 0x87, 0x7a, 0xf9, 0x27, 0x09, 0xe6, 0xe2, 0x3c, 0xad, 0x1b, 0xd4, 0x43, + 0xf7, 0x7a, 0x6a, 0x4f, 0x19, 0xed, 0x4e, 0xcc, 0x9b, 0x57, 0xde, 0x82, 0x08, 0x37, 0x15, 0x4a, + 0x3a, 0xea, 0xee, 0x06, 0xe4, 0x0c, 0x8f, 0x98, 0x2c, 0xeb, 0xe3, 0x5d, 0xe9, 0x4a, 0x29, 0x12, + 0x75, 0x56, 0xc0, 0xe6, 0xae, 0x31, 0x00, 0x1c, 0xe0, 0xc8, 0x7f, 0x8c, 0x77, 0xde, 0x80, 0xd5, + 0x23, 0xfa, 0x4e, 0x82, 0x15, 0x67, 0xe0, 0x80, 0x11, 0x97, 0x5a, 0x4b, 0x8b, 0x3c, 0x78, 0x44, + 0x61, 0xb2, 0x43, 0xd8, 0x5c, 0x21, 0xaa, 0x2c, 0x8e, 0xb4, 0x32, 0xc4, 0x78, 0xc8, 0x51, 0xd0, + 0x87, 0x80, 0x4c, 0xcd, 0x63, 0x19, 0xad, 0x6d, 0xb9, 0x44, 0x27, 0x55, 0x86, 0x2a, 0x86, 0x52, + 0x54, 0x1d, 0x1b, 0x3d, 0x16, 0xb8, 0x8f, 0x17, 0xfa, 0x52, 0x82, 0xc5, 0x6a, 0xef, 0x90, 0x11, + 0x75, 0x79, 0x61, 0x94, 0x44, 0xf7, 0x99, 0x51, 0xea, 0x72, 0xbb, 0x55, 0x5a, 0xec, 0xa3, 0xc0, + 0xfd, 0x82, 0xa1, 0x7b, 0x90, 0x73, 0xfd, 0x06, 0xa1, 0x85, 0x2c, 0x7f, 0xde, 0xd4, 0xa8, 0x5b, + 0x76, 0xc3, 0xd0, 0xf7, 0x31, 0x73, 0xf9, 0xd8, 0xf0, 0xea, 0xdb, 0x3e, 0x9f, 0x55, 0x34, 0x7e, + 0x6b, 0xae, 0xc2, 0x01, 0xa8, 0xfc, 0x08, 0x16, 0xba, 0x87, 0x06, 0xaa, 0x01, 0xe8, 0x61, 0x9f, + 0xb2, 0x05, 0xc1, 0xc2, 0x9e, 0x1d, 0xbd, 0xaa, 0xa2, 0x1e, 0x8f, 0xe7, 0x65, 0x24, 0xa2, 0xb8, + 0x03, 0x5a, 0x3e, 0x05, 0x33, 0x57, 0x5d, 0xdb, 0x77, 0xc4, 0x19, 0xd1, 0x2a, 0x64, 0x2d, 0xcd, + 0x0c, 0xa7, 0x4f, 0x34, 0x11, 0x37, 0x35, 0x93, 0x60, 0xae, 0x91, 0xbf, 0x95, 0x60, 0x76, 0xdd, + 0x30, 0x0d, 0x0f, 0x13, 0xea, 0xd8, 0x16, 0x25, 0xe8, 0x7c, 0x62, 0x62, 0x1d, 0xed, 0x9a, 0x58, + 0x87, 0x12, 0xc6, 0x1d, 0xb3, 0xea, 0x13, 0x98, 0x7c, 0xe8, 0x13, 0xdf, 0xb0, 0x6a, 0x62, 0x5e, + 0x9f, 0x4b, 0xbb, 0xe0, 0xcd, 0xc0, 0x3c, 0x51, 0x6d, 0xea, 0x34, 0x1b, 0x01, 0x42, 0x83, 0x43, + 0x44, 0xf9, 0xef, 0x0c, 0x1c, 0xe5, 0x81, 0x49, 0x75, 0xc8, 0x56, 0xbe, 0x97, 0xba, 0x95, 0x57, + 0xc5, 0x6d, 0x0e, 0xb2, 0x99, 0x1f, 0xc0, 0x6c, 0xa3, 0xf3, 0xee, 0xe2, 0x9a, 0x27, 0xd3, 0xae, + 0x99, 0x48, 0x98, 0xba, 0x24, 0x4e, 0x90, 0x4c, 0x3a, 0x4e, 0x42, 0xf7, 0x63, 0x01, 0xe3, 0xa3, + 0xb3, 0x00, 0x74, 0x03, 0x96, 0x2a, 0xb6, 0xeb, 0xda, 0x7b, 0x86, 0x55, 0xe3, 0x71, 0x42, 0x90, + 0x2c, 0x07, 0xf9, 0x4f, 0xbb, 0x55, 0x5a, 0x52, 0xfb, 0x19, 0xe0, 0xfe, 0x7e, 0xf2, 0x1e, 0x2c, + 0x6d, 0xb2, 0x99, 0x42, 0x6d, 0xdf, 0xd5, 0x49, 0xdc, 0x10, 0xa8, 0x04, 0xb9, 0x26, 0x71, 0x2b, + 0x41, 0x51, 0xe7, 0xd5, 0x3c, 0x6b, 0x87, 0x8f, 0x98, 0x00, 0x07, 0x72, 0x76, 0x13, 0x2b, 0xf6, + 0xbc, 0x8d, 0xd7, 0x69, 0x61, 0x82, 0x9b, 0xf2, 0x9b, 0x6c, 0x26, 0x55, 0xb8, 0xdb, 0x56, 0x6e, + 0x65, 0x60, 0x79, 0x40, 0xff, 0xa1, 0xdb, 0x30, 0x45, 0xc5, 0xdf, 0xa2, 0xa7, 0x8e, 0xa5, 0xbd, + 0x85, 0xf0, 0x8d, 0xa7, 0x7f, 0x08, 0x86, 0x23, 0x28, 0x64, 0xc3, 0xac, 0x2b, 0x8e, 0xc0, 0x63, + 0x8a, 0x2d, 0x70, 0x26, 0x0d, 0xbb, 0x37, 0x3b, 0xf1, 0x63, 0xe3, 0x4e, 0x40, 0x9c, 0xc4, 0x47, + 0x8f, 0x60, 0xa1, 0xe3, 0xda, 0x41, 0xcc, 0x71, 0x1e, 0xf3, 0x7c, 0x5a, 0xcc, 0xbe, 0x8f, 0xa2, + 0x16, 0x44, 0xd8, 0x85, 0xcd, 0x2e, 0x58, 0xdc, 0x13, 0x48, 0xfe, 0x25, 0x03, 0x43, 0x16, 0xc3, + 0x4b, 0x20, 0x79, 0xf7, 0x13, 0x24, 0xef, 0x9d, 0x83, 0x6f, 0xbc, 0x81, 0xa4, 0xaf, 0xde, 0x45, + 0xfa, 0xde, 0x7b, 0x81, 0x18, 0xc3, 0x49, 0xe0, 0x9f, 0x19, 0xf8, 0xdf, 0x60, 0xe7, 0x98, 0x14, + 0x5e, 0x4f, 0x8c, 0xd8, 0x0b, 0x5d, 0x23, 0xf6, 0xd8, 0x08, 0x10, 0xff, 0x92, 0xc4, 0x2e, 0x92, + 0xf8, 0xab, 0x04, 0xc5, 0xc1, 0x79, 0x7b, 0x09, 0xa4, 0xf1, 0xd3, 0x24, 0x69, 0x7c, 0xf3, 0xe0, + 0x45, 0x36, 0x80, 0x44, 0x5e, 0x1d, 0x56, 0x5b, 0x11, 0xdd, 0x1b, 0x61, 0xe5, 0x7f, 0x9f, 0x19, + 0x96, 0x2a, 0xce, 0x4e, 0x53, 0x7e, 0xb5, 0x24, 0xbc, 0xaf, 0x58, 0x6c, 0xf5, 0x98, 0x6c, 0x7b, + 0x04, 0x05, 0x59, 0x87, 0xc9, 0x46, 0xb0, 0xab, 0x45, 0x53, 0x5f, 0x1a, 0x69, 0x45, 0x0e, 0x5b, + 0xed, 0x01, 0x2d, 0x10, 0x66, 0x38, 0x84, 0x47, 0x55, 0x98, 0x20, 0xfc, 0xa7, 0xfa, 0xa8, 0x9d, + 0x9d, 0xf6, 0xc3, 0x5e, 0x05, 0x56, 0x85, 0x81, 0x15, 0x16, 0xd8, 0xf2, 0x37, 0x12, 0xac, 0xa6, + 0x8d, 0x04, 0xb4, 0xd7, 0x87, 0xe2, 0xbd, 0x00, 0x7d, 0x1f, 0x9d, 0xf2, 0xfd, 0x20, 0xc1, 0xe1, + 0x7e, 0x4c, 0x8a, 0x35, 0x19, 0xa3, 0x4f, 0x11, 0xf7, 0x89, 0x9a, 0xec, 0x26, 0x97, 0x62, 0xa1, + 0x45, 0x27, 0x60, 0xaa, 0xae, 0x59, 0xd5, 0x6d, 0xe3, 0xf3, 0x90, 0xd5, 0x47, 0x65, 0xfe, 0x81, + 0x90, 0xe3, 0xc8, 0x02, 0x5d, 0x86, 0x05, 0xee, 0xb7, 0x4e, 0xac, 0x9a, 0x57, 0xe7, 0x2f, 0x22, + 0xa8, 0x49, 0xb4, 0x75, 0x6e, 0x76, 0xe9, 0x71, 0x8f, 0x87, 0xfc, 0x97, 0x04, 0xe8, 0x20, 0x6c, + 0xe2, 0x38, 0xe4, 0x35, 0xc7, 0xe0, 0x14, 0x37, 0x68, 0xb4, 0xbc, 0x3a, 0xdb, 0x6e, 0x95, 0xf2, + 0x97, 0xb6, 0xae, 0x05, 0x42, 0x1c, 0xeb, 0x99, 0x71, 0xb8, 0x68, 0x83, 0x85, 0x2a, 0x8c, 0xc3, + 0xc0, 0x14, 0xc7, 0x7a, 0x74, 0x11, 0x66, 0xf4, 0x86, 0x4f, 0x3d, 0xe2, 0x6e, 0xeb, 0xb6, 0x43, + 0xf8, 0x60, 0x9a, 0x52, 0x0f, 0x8b, 0x3b, 0xcd, 0xac, 0x75, 0xe8, 0x70, 0xc2, 0x12, 0x29, 0x00, + 0xac, 0xad, 0xa8, 0xa3, 0xb1, 0x38, 0x39, 0x1e, 0x67, 0x8e, 0x3d, 0xd8, 0x66, 0x24, 0xc5, 0x1d, + 0x16, 0xf2, 0x03, 0x58, 0xda, 0x26, 0x6e, 0xd3, 0xd0, 0xc9, 0x25, 0x5d, 0xb7, 0x7d, 0xcb, 0x0b, + 0xc9, 0x7a, 0x19, 0xf2, 0x91, 0x99, 0xe8, 0xbc, 0x43, 0x22, 0x7e, 0x3e, 0xc2, 0xc2, 0xb1, 0x4d, + 0xd4, 0xea, 0x99, 0x81, 0xad, 0xfe, 0x73, 0x06, 0x26, 0x63, 0xf8, 0xec, 0xae, 0x61, 0x55, 0x05, + 0xf2, 0x91, 0xd0, 0xfa, 0xba, 0x61, 0x55, 0x9f, 0xb7, 0x4a, 0xd3, 0xc2, 0x8c, 0x7d, 0x62, 0x6e, + 0x88, 0xae, 0x41, 0xd6, 0xa7, 0xc4, 0x15, 0x4d, 0x7c, 0x3c, 0xad, 0x98, 0x6f, 0x53, 0xe2, 0x86, + 0xfc, 0x6a, 0x8a, 0x21, 0x33, 0x01, 0xe6, 0x10, 0x68, 0x03, 0x72, 0x35, 0xf6, 0x28, 0xa2, 0x4f, + 0x4f, 0xa4, 0x61, 0x75, 0xfe, 0x88, 0x09, 0xca, 0x80, 0x4b, 0x70, 0x80, 0x82, 0x1e, 0xc2, 0x1c, + 0x4d, 0xa4, 0x90, 0x3f, 0xd7, 0x08, 0x7c, 0xa9, 0x6f, 0xe2, 0x55, 0xd4, 0x6e, 0x95, 0xe6, 0x92, + 0x2a, 0xdc, 0x15, 0x40, 0x2e, 0xc3, 0x74, 0xc7, 0x05, 0xd3, 0xa7, 0xac, 0x7a, 0xf9, 0xf1, 0xb3, + 0xe2, 0xd8, 0x93, 0x67, 0xc5, 0xb1, 0xa7, 0xcf, 0x8a, 0x63, 0x5f, 0xb4, 0x8b, 0xd2, 0xe3, 0x76, + 0x51, 0x7a, 0xd2, 0x2e, 0x4a, 0x4f, 0xdb, 0x45, 0xe9, 0xb7, 0x76, 0x51, 0xfa, 0xea, 0xf7, 0xe2, + 0xd8, 0xdd, 0xe2, 0xf0, 0xff, 0xc5, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xc5, 0x22, 0x46, + 0xc5, 0x15, 0x00, 0x00, +} + +func (m *ExemptPriorityLevelConfiguration) 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 *ExemptPriorityLevelConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExemptPriorityLevelConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.LendablePercent != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.LendablePercent)) + i-- + dAtA[i] = 0x10 + } + if m.NominalConcurrencyShares != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.NominalConcurrencyShares)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *FlowDistinguisherMethod) Marshal() (dAtA []byte, err error) { @@ -1490,6 +1556,18 @@ func (m *PriorityLevelConfigurationSpec) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l + if m.Exempt != nil { + { + size, err := m.Exempt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if m.Limited != nil { { size, err := m.Limited.MarshalToSizedBuffer(dAtA[:i]) @@ -1782,6 +1860,21 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *ExemptPriorityLevelConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NominalConcurrencyShares != nil { + n += 1 + sovGenerated(uint64(*m.NominalConcurrencyShares)) + } + if m.LendablePercent != nil { + n += 1 + sovGenerated(uint64(*m.LendablePercent)) + } + return n +} + func (m *FlowDistinguisherMethod) Size() (n int) { if m == nil { return 0 @@ -2047,6 +2140,10 @@ func (m *PriorityLevelConfigurationSpec) Size() (n int) { l = m.Limited.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Exempt != nil { + l = m.Exempt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2164,6 +2261,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *ExemptPriorityLevelConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExemptPriorityLevelConfiguration{`, + `NominalConcurrencyShares:` + valueToStringGenerated(this.NominalConcurrencyShares) + `,`, + `LendablePercent:` + valueToStringGenerated(this.LendablePercent) + `,`, + `}`, + }, "") + return s +} func (this *FlowDistinguisherMethod) String() string { if this == nil { return "nil" @@ -2380,6 +2488,7 @@ func (this *PriorityLevelConfigurationSpec) String() string { s := strings.Join([]string{`&PriorityLevelConfigurationSpec{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Limited:` + strings.Replace(this.Limited.String(), "LimitedPriorityLevelConfiguration", "LimitedPriorityLevelConfiguration", 1) + `,`, + `Exempt:` + strings.Replace(this.Exempt.String(), "ExemptPriorityLevelConfiguration", "ExemptPriorityLevelConfiguration", 1) + `,`, `}`, }, "") return s @@ -2467,6 +2576,96 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *ExemptPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExemptPriorityLevelConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NominalConcurrencyShares", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NominalConcurrencyShares = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LendablePercent", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.LendablePercent = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4546,6 +4745,42 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exempt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exempt == nil { + m.Exempt = &ExemptPriorityLevelConfiguration{} + } + if err := m.Exempt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto index adf9e8682..eda0f7829 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto @@ -28,6 +28,40 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/flowcontrol/v1beta3"; +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +message ExemptPriorityLevelConfiguration { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + optional int32 nominalConcurrencyShares = 1; + + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + optional int32 lendablePercent = 2; +} + // FlowDistinguisherMethod specifies the method of a flow distinguisher. message FlowDistinguisherMethod { // `type` is the type of flow distinguisher method @@ -168,10 +202,10 @@ message LimitedPriorityLevelConfiguration { // Limited priority levels in proportion to their NCS values: // // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) - // sum_ncs = sum[limited priority level k] NCS(k) + // sum_ncs = sum[priority level k] NCS(k) // // Bigger numbers mean a larger nominal concurrency limit, - // at the expense of every other Limited priority level. + // at the expense of every other priority level. // This field has a default value of 30. // +optional optional int32 nominalConcurrencyShares = 1; @@ -334,6 +368,14 @@ message PriorityLevelConfigurationSpec { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional optional LimitedPriorityLevelConfiguration limited = 2; + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + optional ExemptPriorityLevelConfiguration exempt = 3; } // PriorityLevelConfigurationStatus represents the current state of a "request-priority". diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types.go index 2baf2dc39..810941557 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types.go @@ -77,7 +77,9 @@ const ( // is a boolean false or has an invalid boolean representation // (if the cluster operator sets it to 'false' it will be stomped) // - any changes to the spec made by the cluster operator will be - // stomped. + // stomped, except for changes to the `nominalConcurrencyShares` + // and `lendablePercent` fields of the PriorityLevelConfiguration + // named "exempt". // // The kube-apiserver will apply updates on the suggested configuration if: // - the cluster operator has enabled auto-update by setting the annotation @@ -433,6 +435,14 @@ type PriorityLevelConfigurationSpec struct { // This field must be non-empty if and only if `type` is `"Limited"`. // +optional Limited *LimitedPriorityLevelConfiguration `json:"limited,omitempty" protobuf:"bytes,2,opt,name=limited"` + + // `exempt` specifies how requests are handled for an exempt priority level. + // This field MUST be empty if `type` is `"Limited"`. + // This field MAY be non-empty if `type` is `"Exempt"`. + // If empty and `type` is `"Exempt"` then the default values + // for `ExemptPriorityLevelConfiguration` apply. + // +optional + Exempt *ExemptPriorityLevelConfiguration `json:"exempt,omitempty" protobuf:"bytes,3,opt,name=exempt"` } // PriorityLevelEnablement indicates whether limits on execution are enabled for the priority level @@ -462,10 +472,10 @@ type LimitedPriorityLevelConfiguration struct { // Limited priority levels in proportion to their NCS values: // // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) - // sum_ncs = sum[limited priority level k] NCS(k) + // sum_ncs = sum[priority level k] NCS(k) // // Bigger numbers mean a larger nominal concurrency limit, - // at the expense of every other Limited priority level. + // at the expense of every other priority level. // This field has a default value of 30. // +optional NominalConcurrencyShares int32 `json:"nominalConcurrencyShares" protobuf:"varint,1,opt,name=nominalConcurrencyShares"` @@ -503,6 +513,43 @@ type LimitedPriorityLevelConfiguration struct { BorrowingLimitPercent *int32 `json:"borrowingLimitPercent,omitempty" protobuf:"varint,4,opt,name=borrowingLimitPercent"` } +// ExemptPriorityLevelConfiguration describes the configurable aspects +// of the handling of exempt requests. +// In the mandatory exempt configuration object the values in the fields +// here can be modified by authorized users, unlike the rest of the `spec`. +type ExemptPriorityLevelConfiguration struct { + // `nominalConcurrencyShares` (NCS) contributes to the computation of the + // NominalConcurrencyLimit (NominalCL) of this level. + // This is the number of execution seats nominally reserved for this priority level. + // This DOES NOT limit the dispatching from this priority level + // but affects the other priority levels through the borrowing mechanism. + // The server's concurrency limit (ServerCL) is divided among all the + // priority levels in proportion to their NCS values: + // + // NominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) + // sum_ncs = sum[priority level k] NCS(k) + // + // Bigger numbers mean a larger nominal concurrency limit, + // at the expense of every other priority level. + // This field has a default value of zero. + // +optional + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty" protobuf:"varint,1,opt,name=nominalConcurrencyShares"` + // `lendablePercent` prescribes the fraction of the level's NominalCL that + // can be borrowed by other priority levels. This value of this + // field must be between 0 and 100, inclusive, and it defaults to 0. + // The number of seats that other levels can borrow from this level, known + // as this level's LendableConcurrencyLimit (LendableCL), is defined as follows. + // + // LendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 ) + // + // +optional + LendablePercent *int32 `json:"lendablePercent,omitempty" protobuf:"varint,2,opt,name=lendablePercent"` + // The `BorrowingCL` of an Exempt priority level is implicitly `ServerCL`. + // In other words, an exempt priority level + // has no meaningful limit on how much it borrows. + // There is no explicit representation of that here. +} + // LimitResponse defines how to handle requests that can not be executed right now. // +union type LimitResponse struct { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go index 728252c0c..fa76112a7 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go @@ -27,6 +27,16 @@ package v1beta3 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ExemptPriorityLevelConfiguration = map[string]string{ + "": "ExemptPriorityLevelConfiguration describes the configurable aspects of the handling of exempt requests. In the mandatory exempt configuration object the values in the fields here can be modified by authorized users, unlike the rest of the `spec`.", + "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats nominally reserved for this priority level. This DOES NOT limit the dispatching from this priority level but affects the other priority levels through the borrowing mechanism. The server's concurrency limit (ServerCL) is divided among all the priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other priority level. This field has a default value of zero.", + "lendablePercent": "`lendablePercent` prescribes the fraction of the level's NominalCL that can be borrowed by other priority levels. This value of this field must be between 0 and 100, inclusive, and it defaults to 0. The number of seats that other levels can borrow from this level, known as this level's LendableConcurrencyLimit (LendableCL), is defined as follows.\n\nLendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 )", +} + +func (ExemptPriorityLevelConfiguration) SwaggerDoc() map[string]string { + return map_ExemptPriorityLevelConfiguration +} + var map_FlowDistinguisherMethod = map[string]string{ "": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "type": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", @@ -112,7 +122,7 @@ func (LimitResponse) SwaggerDoc() map[string]string { var map_LimitedPriorityLevelConfiguration = map[string]string{ "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n - How are requests for this priority level limited?\n - What should be done with requests that exceed the limit?", - "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats available at this priority level. This is used both for requests dispatched from this priority level as well as requests dispatched from other priority levels borrowing seats from this level. The server's concurrency limit (ServerCL) is divided among the Limited priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[limited priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other Limited priority level. This field has a default value of 30.", + "nominalConcurrencyShares": "`nominalConcurrencyShares` (NCS) contributes to the computation of the NominalConcurrencyLimit (NominalCL) of this level. This is the number of execution seats available at this priority level. This is used both for requests dispatched from this priority level as well as requests dispatched from other priority levels borrowing seats from this level. The server's concurrency limit (ServerCL) is divided among the Limited priority levels in proportion to their NCS values:\n\nNominalCL(i) = ceil( ServerCL * NCS(i) / sum_ncs ) sum_ncs = sum[priority level k] NCS(k)\n\nBigger numbers mean a larger nominal concurrency limit, at the expense of every other priority level. This field has a default value of 30.", "limitResponse": "`limitResponse` indicates what to do with requests that can not be executed right now", "lendablePercent": "`lendablePercent` prescribes the fraction of the level's NominalCL that can be borrowed by other priority levels. The value of this field must be between 0 and 100, inclusive, and it defaults to 0. The number of seats that other levels can borrow from this level, known as this level's LendableConcurrencyLimit (LendableCL), is defined as follows.\n\nLendableCL(i) = round( NominalCL(i) * lendablePercent(i)/100.0 )", "borrowingLimitPercent": "`borrowingLimitPercent`, if present, configures a limit on how many seats this priority level can borrow from other priority levels. The limit is known as this level's BorrowingConcurrencyLimit (BorrowingCL) and is a limit on the total number of seats that this level may borrow at any one time. This field holds the ratio of that limit to the level's nominal concurrency limit. When this field is non-nil, it must hold a non-negative integer and the limit is calculated as follows.\n\nBorrowingCL(i) = round( NominalCL(i) * borrowingLimitPercent(i)/100.0 )\n\nThe value of this field can be more than 100, implying that this priority level can borrow a number of seats that is greater than its own nominal concurrency limit (NominalCL). When this field is left `nil`, the limit is effectively infinite.", @@ -190,6 +200,7 @@ var map_PriorityLevelConfigurationSpec = map[string]string{ "": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", "type": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", "limited": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`.", + "exempt": "`exempt` specifies how requests are handled for an exempt priority level. This field MUST be empty if `type` is `\"Limited\"`. This field MAY be non-empty if `type` is `\"Exempt\"`. If empty and `type` is `\"Exempt\"` then the default values for `ExemptPriorityLevelConfiguration` apply.", } func (PriorityLevelConfigurationSpec) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go index ec02d2a9c..09fefa20a 100644 --- a/tools/vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go @@ -25,6 +25,32 @@ import ( 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 *ExemptPriorityLevelConfiguration) DeepCopyInto(out *ExemptPriorityLevelConfiguration) { + *out = *in + if in.NominalConcurrencyShares != nil { + in, out := &in.NominalConcurrencyShares, &out.NominalConcurrencyShares + *out = new(int32) + **out = **in + } + if in.LendablePercent != nil { + in, out := &in.LendablePercent, &out.LendablePercent + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExemptPriorityLevelConfiguration. +func (in *ExemptPriorityLevelConfiguration) DeepCopy() *ExemptPriorityLevelConfiguration { + if in == nil { + return nil + } + out := new(ExemptPriorityLevelConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlowDistinguisherMethod) DeepCopyInto(out *FlowDistinguisherMethod) { *out = *in @@ -400,6 +426,11 @@ func (in *PriorityLevelConfigurationSpec) DeepCopyInto(out *PriorityLevelConfigu *out = new(LimitedPriorityLevelConfiguration) (*in).DeepCopyInto(*out) } + if in.Exempt != nil { + in, out := &in.Exempt, &out.Exempt + *out = new(ExemptPriorityLevelConfiguration) + (*in).DeepCopyInto(*out) + } return } diff --git a/tools/vendor/k8s.io/api/networking/v1/generated.pb.go b/tools/vendor/k8s.io/api/networking/v1/generated.pb.go index e9566d57e..daeaea5dc 100644 --- a/tools/vendor/k8s.io/api/networking/v1/generated.pb.go +++ b/tools/vendor/k8s.io/api/networking/v1/generated.pb.go @@ -776,38 +776,10 @@ func (m *NetworkPolicySpec) XXX_DiscardUnknown() { var xxx_messageInfo_NetworkPolicySpec proto.InternalMessageInfo -func (m *NetworkPolicyStatus) Reset() { *m = NetworkPolicyStatus{} } -func (*NetworkPolicyStatus) ProtoMessage() {} -func (*NetworkPolicyStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{26} -} -func (m *NetworkPolicyStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NetworkPolicyStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *NetworkPolicyStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkPolicyStatus.Merge(m, src) -} -func (m *NetworkPolicyStatus) XXX_Size() int { - return m.Size() -} -func (m *NetworkPolicyStatus) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkPolicyStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkPolicyStatus proto.InternalMessageInfo - func (m *ServiceBackendPort) Reset() { *m = ServiceBackendPort{} } func (*ServiceBackendPort) ProtoMessage() {} func (*ServiceBackendPort) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{27} + return fileDescriptor_1c72867a70a7cc90, []int{26} } func (m *ServiceBackendPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -859,7 +831,6 @@ func init() { proto.RegisterType((*NetworkPolicyPeer)(nil), "k8s.io.api.networking.v1.NetworkPolicyPeer") proto.RegisterType((*NetworkPolicyPort)(nil), "k8s.io.api.networking.v1.NetworkPolicyPort") proto.RegisterType((*NetworkPolicySpec)(nil), "k8s.io.api.networking.v1.NetworkPolicySpec") - proto.RegisterType((*NetworkPolicyStatus)(nil), "k8s.io.api.networking.v1.NetworkPolicyStatus") proto.RegisterType((*ServiceBackendPort)(nil), "k8s.io.api.networking.v1.ServiceBackendPort") } @@ -868,115 +839,112 @@ func init() { } var fileDescriptor_1c72867a70a7cc90 = []byte{ - // 1715 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4b, 0x6f, 0x1b, 0x47, - 0x12, 0xd6, 0x50, 0xa2, 0x48, 0x35, 0x25, 0x59, 0x6a, 0xdb, 0x58, 0xae, 0x16, 0x4b, 0x6a, 0x07, - 0x6b, 0x5b, 0xbb, 0xb6, 0xc9, 0xb5, 0x6c, 0x2c, 0x76, 0x2f, 0x49, 0x3c, 0xb2, 0x2c, 0x2b, 0x96, - 0x29, 0xa2, 0xc9, 0x38, 0x48, 0x90, 0x87, 0x47, 0xc3, 0x16, 0x35, 0xe6, 0x70, 0x7a, 0xd0, 0xd3, - 0x54, 0xac, 0x20, 0x08, 0x72, 0xc9, 0x21, 0xb7, 0xdc, 0x72, 0x0e, 0xf2, 0x0b, 0x82, 0xe4, 0x10, - 0x20, 0x48, 0x8c, 0x5c, 0x02, 0x1f, 0x0d, 0xe4, 0xe2, 0x4b, 0x88, 0x98, 0xf9, 0x17, 0x3a, 0x05, - 0xfd, 0x98, 0x17, 0x1f, 0x22, 0x63, 0x18, 0x3a, 0x49, 0x5d, 0x55, 0xfd, 0x75, 0xbd, 0xab, 0x86, - 0xe0, 0x66, 0xeb, 0x7f, 0x7e, 0xc9, 0x26, 0xe5, 0x56, 0x67, 0x0f, 0x53, 0x17, 0x33, 0xec, 0x97, - 0x0f, 0xb1, 0xdb, 0x20, 0xb4, 0xac, 0x18, 0xa6, 0x67, 0x97, 0x5d, 0xcc, 0x3e, 0x20, 0xb4, 0x65, - 0xbb, 0xcd, 0xf2, 0xe1, 0xb5, 0x72, 0x13, 0xbb, 0x98, 0x9a, 0x0c, 0x37, 0x4a, 0x1e, 0x25, 0x8c, - 0xc0, 0xbc, 0x94, 0x2c, 0x99, 0x9e, 0x5d, 0x8a, 0x24, 0x4b, 0x87, 0xd7, 0x56, 0xae, 0x36, 0x6d, - 0x76, 0xd0, 0xd9, 0x2b, 0x59, 0xa4, 0x5d, 0x6e, 0x92, 0x26, 0x29, 0x8b, 0x0b, 0x7b, 0x9d, 0x7d, - 0x71, 0x12, 0x07, 0xf1, 0x9f, 0x04, 0x5a, 0xd1, 0x63, 0x4f, 0x5a, 0x84, 0xe2, 0x21, 0x8f, 0xad, - 0xdc, 0x88, 0x64, 0xda, 0xa6, 0x75, 0x60, 0xbb, 0x98, 0x1e, 0x95, 0xbd, 0x56, 0x93, 0x13, 0xfc, - 0x72, 0x1b, 0x33, 0x73, 0xd8, 0xad, 0xf2, 0xa8, 0x5b, 0xb4, 0xe3, 0x32, 0xbb, 0x8d, 0x07, 0x2e, - 0xfc, 0x77, 0xdc, 0x05, 0xdf, 0x3a, 0xc0, 0x6d, 0x73, 0xe0, 0xde, 0xf5, 0x51, 0xf7, 0x3a, 0xcc, - 0x76, 0xca, 0xb6, 0xcb, 0x7c, 0x46, 0xfb, 0x2f, 0xe9, 0x3f, 0x6a, 0xe0, 0xcc, 0x9d, 0x7a, 0xbd, - 0xba, 0xed, 0x36, 0x29, 0xf6, 0xfd, 0xaa, 0xc9, 0x0e, 0xe0, 0x2a, 0x98, 0xf1, 0x4c, 0x76, 0x90, - 0xd7, 0x56, 0xb5, 0xb5, 0x39, 0x63, 0xfe, 0x49, 0xb7, 0x38, 0xd5, 0xeb, 0x16, 0x67, 0x38, 0x0f, - 0x09, 0x0e, 0xbc, 0x01, 0xb2, 0xfc, 0x6f, 0xfd, 0xc8, 0xc3, 0xf9, 0x69, 0x21, 0x95, 0xef, 0x75, - 0x8b, 0xd9, 0xaa, 0xa2, 0x1d, 0xc7, 0xfe, 0x47, 0xa1, 0x24, 0xac, 0x81, 0xcc, 0x9e, 0x69, 0xb5, - 0xb0, 0xdb, 0xc8, 0xa7, 0x56, 0xb5, 0xb5, 0xdc, 0xfa, 0x5a, 0x69, 0x54, 0xf8, 0x4a, 0x4a, 0x1f, - 0x43, 0xca, 0x1b, 0x67, 0x94, 0x12, 0x19, 0x45, 0x40, 0x01, 0x92, 0xbe, 0x0f, 0xce, 0xc5, 0xf4, - 0x47, 0x1d, 0x07, 0xdf, 0x37, 0x9d, 0x0e, 0x86, 0x15, 0x90, 0xe6, 0x0f, 0xfb, 0x79, 0x6d, 0x75, - 0x7a, 0x2d, 0xb7, 0xfe, 0xaf, 0xd1, 0x4f, 0xf5, 0x99, 0x6f, 0x2c, 0xa8, 0xb7, 0xd2, 0xfc, 0xe4, - 0x23, 0x09, 0xa3, 0xef, 0x82, 0xcc, 0x76, 0xd5, 0x70, 0x88, 0xd5, 0xe2, 0xfe, 0xb1, 0xec, 0x06, - 0xed, 0xf7, 0xcf, 0xc6, 0xf6, 0x2d, 0x84, 0x04, 0x07, 0xea, 0x60, 0x16, 0x3f, 0xb2, 0xb0, 0xc7, - 0xf2, 0xa9, 0xd5, 0xe9, 0xb5, 0x39, 0x03, 0xf4, 0xba, 0xc5, 0xd9, 0x4d, 0x41, 0x41, 0x8a, 0xa3, - 0x7f, 0x9a, 0x02, 0x19, 0xf5, 0x2c, 0x7c, 0x00, 0xb2, 0x3c, 0x7d, 0x1a, 0x26, 0x33, 0x05, 0x6a, - 0x6e, 0xfd, 0x3f, 0x31, 0x7d, 0xc3, 0x68, 0x96, 0xbc, 0x56, 0x93, 0x13, 0xfc, 0x12, 0x97, 0xe6, - 0xba, 0xef, 0xee, 0x3d, 0xc4, 0x16, 0xbb, 0x87, 0x99, 0x69, 0x40, 0xa5, 0x07, 0x88, 0x68, 0x28, - 0x44, 0x85, 0x5b, 0x60, 0xc6, 0xf7, 0xb0, 0xa5, 0x1c, 0x7f, 0x61, 0xac, 0xe3, 0x6b, 0x1e, 0xb6, - 0x22, 0xd3, 0xf8, 0x09, 0x09, 0x00, 0xb8, 0x0b, 0x66, 0x7d, 0x66, 0xb2, 0x8e, 0x2f, 0x02, 0x9f, - 0x5b, 0xbf, 0x34, 0x1e, 0x4a, 0x88, 0x1b, 0x8b, 0x0a, 0x6c, 0x56, 0x9e, 0x91, 0x82, 0xd1, 0x7f, - 0xd2, 0xc0, 0x62, 0x32, 0xda, 0xf0, 0x3e, 0xc8, 0xf8, 0x98, 0x1e, 0xda, 0x16, 0xce, 0xcf, 0x88, - 0x47, 0xca, 0xe3, 0x1f, 0x91, 0xf2, 0x41, 0xbe, 0xe4, 0x78, 0xae, 0x28, 0x1a, 0x0a, 0xc0, 0xe0, - 0x9b, 0x20, 0x4b, 0xb1, 0x4f, 0x3a, 0xd4, 0xc2, 0x4a, 0xfb, 0xab, 0x71, 0x60, 0x5e, 0xf7, 0x1c, - 0x92, 0x27, 0x6b, 0x63, 0x87, 0x58, 0xa6, 0x23, 0x5d, 0x89, 0xf0, 0x3e, 0xa6, 0xd8, 0xb5, 0xb0, - 0x31, 0xcf, 0xb3, 0x1c, 0x29, 0x08, 0x14, 0x82, 0xf1, 0x2a, 0x9a, 0x57, 0x8a, 0x6c, 0x38, 0xe6, - 0xa9, 0x04, 0x74, 0x27, 0x11, 0xd0, 0x7f, 0x8f, 0x75, 0x90, 0xd0, 0x6b, 0x54, 0x54, 0xf5, 0x1f, - 0x34, 0xb0, 0x14, 0x17, 0xdc, 0xb1, 0x7d, 0x06, 0xdf, 0x19, 0x30, 0xa2, 0x34, 0x99, 0x11, 0xfc, - 0xb6, 0x30, 0x61, 0x49, 0x3d, 0x95, 0x0d, 0x28, 0x31, 0x03, 0xee, 0x82, 0xb4, 0xcd, 0x70, 0xdb, - 0x17, 0x25, 0x92, 0x5b, 0xbf, 0x38, 0x99, 0x05, 0x51, 0x75, 0x6e, 0xf3, 0xcb, 0x48, 0x62, 0xe8, - 0xbf, 0x6a, 0xa0, 0x18, 0x17, 0xab, 0x9a, 0xd4, 0x6c, 0x63, 0x86, 0xa9, 0x1f, 0x06, 0x0f, 0xae, - 0x81, 0xac, 0x59, 0xdd, 0xde, 0xa2, 0xa4, 0xe3, 0x05, 0xa5, 0xcb, 0x55, 0xbb, 0xa9, 0x68, 0x28, - 0xe4, 0xf2, 0x02, 0x6f, 0xd9, 0xaa, 0x4b, 0xc5, 0x0a, 0xfc, 0xae, 0xed, 0x36, 0x90, 0xe0, 0x70, - 0x09, 0xd7, 0x6c, 0x07, 0xcd, 0x2f, 0x94, 0xa8, 0x98, 0x6d, 0x8c, 0x04, 0x07, 0x16, 0x41, 0xda, - 0xb7, 0x88, 0x27, 0x33, 0x78, 0xce, 0x98, 0xe3, 0x2a, 0xd7, 0x38, 0x01, 0x49, 0x3a, 0xbc, 0x0c, - 0xe6, 0xb8, 0xa0, 0xef, 0x99, 0x16, 0xce, 0xa7, 0x85, 0xd0, 0x42, 0xaf, 0x5b, 0x9c, 0xab, 0x04, - 0x44, 0x14, 0xf1, 0xf5, 0xaf, 0xfb, 0xe2, 0xc3, 0x43, 0x07, 0xd7, 0x01, 0xb0, 0x88, 0xcb, 0x28, - 0x71, 0x1c, 0x1c, 0x74, 0xa3, 0x30, 0x69, 0x36, 0x42, 0x0e, 0x8a, 0x49, 0x41, 0x1b, 0x00, 0x2f, - 0xf4, 0x8d, 0x4a, 0x9e, 0xff, 0x4f, 0xe6, 0xfa, 0x21, 0x3e, 0x35, 0x16, 0xf9, 0x53, 0x31, 0x46, - 0x0c, 0x5c, 0xff, 0x46, 0x03, 0x39, 0x75, 0xff, 0x14, 0xd2, 0xe9, 0x76, 0x32, 0x9d, 0xfe, 0x31, - 0x7e, 0xb4, 0x0c, 0xcf, 0xa4, 0xef, 0x34, 0xb0, 0x12, 0x68, 0x4d, 0xcc, 0x86, 0x61, 0x3a, 0xa6, - 0x6b, 0x61, 0x1a, 0x74, 0xea, 0x15, 0x90, 0xb2, 0x83, 0xf4, 0x01, 0x0a, 0x20, 0xb5, 0x5d, 0x45, - 0x29, 0xdb, 0x83, 0x57, 0x40, 0xf6, 0x80, 0xf8, 0x4c, 0x24, 0x86, 0x4c, 0x9d, 0x50, 0xe1, 0x3b, - 0x8a, 0x8e, 0x42, 0x09, 0x58, 0x05, 0x69, 0x8f, 0x50, 0xe6, 0xe7, 0x67, 0x84, 0xc2, 0x97, 0xc7, - 0x2a, 0x5c, 0x25, 0x94, 0xa9, 0x5e, 0x1a, 0x8d, 0x28, 0x8e, 0x80, 0x24, 0x90, 0xfe, 0x11, 0xf8, - 0xeb, 0x10, 0xcd, 0xe5, 0x15, 0xf8, 0x3e, 0xc8, 0xd8, 0x92, 0xa9, 0x26, 0xe2, 0x8d, 0xb1, 0x0f, - 0x0e, 0xb1, 0x3f, 0x1a, 0xc4, 0xc1, 0xc0, 0x0d, 0x50, 0xf5, 0xaf, 0x34, 0xb0, 0x3c, 0xa0, 0xa9, - 0xd8, 0x25, 0x08, 0x65, 0xc2, 0x63, 0xe9, 0xd8, 0x2e, 0x41, 0x28, 0x43, 0x82, 0x03, 0xef, 0x82, - 0xac, 0x58, 0x45, 0x2c, 0xe2, 0x28, 0xaf, 0x95, 0x03, 0xaf, 0x55, 0x15, 0xfd, 0xb8, 0x5b, 0xfc, - 0xdb, 0xe0, 0x7e, 0x56, 0x0a, 0xd8, 0x28, 0x04, 0xe0, 0x55, 0x87, 0x29, 0x25, 0x54, 0x15, 0xa6, - 0xa8, 0xba, 0x4d, 0x4e, 0x40, 0x92, 0xae, 0x7f, 0x19, 0x25, 0x25, 0xdf, 0x15, 0xb8, 0x7e, 0x3c, - 0x22, 0xfd, 0xb3, 0x9c, 0xc7, 0x0b, 0x09, 0x0e, 0xf4, 0xc0, 0x92, 0xdd, 0xb7, 0x5c, 0x4c, 0xdc, - 0x74, 0xc3, 0x1b, 0x46, 0x5e, 0x21, 0x2f, 0xf5, 0x73, 0xd0, 0x00, 0xba, 0xfe, 0x00, 0x0c, 0x48, - 0xf1, 0x76, 0x7f, 0xc0, 0x98, 0x37, 0xa4, 0x70, 0x46, 0x6f, 0x33, 0xd1, 0xeb, 0x59, 0x61, 0x53, - 0xbd, 0x5e, 0x45, 0x02, 0x45, 0xff, 0x4c, 0x03, 0xe7, 0x87, 0x0e, 0xce, 0xb0, 0xb1, 0x69, 0x23, - 0x1b, 0x5b, 0x45, 0x45, 0x54, 0xfa, 0xe0, 0xca, 0x68, 0x4d, 0x92, 0xc8, 0x3c, 0xe2, 0xc3, 0xe2, - 0xaf, 0xff, 0x9c, 0x0a, 0x23, 0x22, 0xba, 0xda, 0x6b, 0xa1, 0xbf, 0x45, 0xd7, 0xe1, 0x2f, 0xab, - 0x1e, 0x7a, 0x2e, 0xe6, 0xbf, 0x90, 0x87, 0x06, 0xa4, 0x61, 0x03, 0x2c, 0x36, 0xf0, 0xbe, 0xd9, - 0x71, 0x98, 0x7a, 0x5b, 0x79, 0x6d, 0xf2, 0x75, 0x13, 0xf6, 0xba, 0xc5, 0xc5, 0x5b, 0x09, 0x0c, - 0xd4, 0x87, 0x09, 0x37, 0xc0, 0x34, 0x73, 0x82, 0x76, 0xf3, 0xcf, 0xb1, 0xd0, 0xf5, 0x9d, 0x9a, - 0x91, 0x53, 0xe6, 0x4f, 0xd7, 0x77, 0x6a, 0x88, 0xdf, 0x86, 0xaf, 0x83, 0x34, 0xed, 0x38, 0x98, - 0x2f, 0x53, 0xd3, 0x13, 0xed, 0x65, 0x3c, 0xa6, 0x51, 0xf9, 0xf3, 0x93, 0x8f, 0x24, 0x84, 0xfe, - 0x31, 0x58, 0x48, 0x6c, 0x5c, 0xb0, 0x0d, 0xe6, 0x9d, 0x58, 0x09, 0x2b, 0x2f, 0x5c, 0xff, 0x53, - 0x75, 0xaf, 0x1a, 0xce, 0x39, 0xf5, 0xe2, 0x7c, 0x9c, 0x87, 0x12, 0xf0, 0xba, 0x09, 0x40, 0x64, - 0x2b, 0xaf, 0x44, 0x5e, 0x3e, 0xb2, 0xdb, 0xa8, 0x4a, 0xe4, 0x55, 0xe5, 0x23, 0x49, 0xe7, 0xd3, - 0xcb, 0xc7, 0x16, 0xc5, 0xac, 0x12, 0xf5, 0xcb, 0x70, 0x7a, 0xd5, 0x42, 0x0e, 0x8a, 0x49, 0xe9, - 0x5f, 0xa4, 0xc0, 0x42, 0x45, 0xaa, 0x5c, 0x25, 0x8e, 0x6d, 0x1d, 0x9d, 0xc2, 0xa2, 0x75, 0x2f, - 0xb1, 0x68, 0x9d, 0xd0, 0xa6, 0x13, 0x8a, 0x8d, 0xdc, 0x9f, 0xdf, 0xe8, 0xdb, 0x9f, 0xaf, 0x4e, - 0x0a, 0x78, 0xf2, 0x16, 0xfd, 0xad, 0x06, 0xfe, 0x92, 0x90, 0xdf, 0x8c, 0x7a, 0x5c, 0x38, 0x69, - 0xb4, 0x71, 0x93, 0x26, 0x81, 0x20, 0x2a, 0x76, 0xe8, 0xa4, 0x81, 0x5b, 0x20, 0xc5, 0x88, 0x4a, - 0xfd, 0x89, 0xe1, 0x30, 0xa6, 0xd1, 0xc8, 0xac, 0x13, 0x94, 0x62, 0x44, 0xff, 0x5e, 0x03, 0xf9, - 0x84, 0x54, 0xbc, 0x37, 0xbf, 0x7c, 0xbd, 0xef, 0x81, 0x99, 0x7d, 0x4a, 0xda, 0x2f, 0xa2, 0x79, - 0x18, 0xcb, 0xdb, 0x94, 0xb4, 0x91, 0x80, 0xd1, 0x1f, 0x6b, 0x60, 0x39, 0x21, 0x79, 0x0a, 0x7b, - 0xce, 0x4e, 0x72, 0xcf, 0xb9, 0x34, 0xa1, 0x0d, 0x23, 0xb6, 0x9d, 0xc7, 0xa9, 0x3e, 0x0b, 0xb8, - 0xad, 0x70, 0x1f, 0xe4, 0x3c, 0xd2, 0xa8, 0x61, 0x07, 0x5b, 0x8c, 0x0c, 0xeb, 0x1b, 0x27, 0x19, - 0x61, 0xee, 0x61, 0x27, 0xb8, 0x6a, 0x9c, 0xe9, 0x75, 0x8b, 0xb9, 0x6a, 0x84, 0x85, 0xe2, 0xc0, - 0xf0, 0x11, 0x58, 0x0e, 0x57, 0xdc, 0xf0, 0xb5, 0xd4, 0x8b, 0xbf, 0x76, 0xbe, 0xd7, 0x2d, 0x2e, - 0x57, 0xfa, 0x11, 0xd1, 0xe0, 0x23, 0xf0, 0x0e, 0xc8, 0xd8, 0x9e, 0xf8, 0x9a, 0x57, 0x65, 0x78, - 0xd2, 0xbe, 0x28, 0x3f, 0xfb, 0xe5, 0x37, 0xa5, 0x3a, 0xa0, 0xe0, 0xba, 0xfe, 0x4b, 0x7f, 0x0e, - 0xf0, 0x84, 0x83, 0x5b, 0xb1, 0xa5, 0x46, 0x8e, 0xd2, 0xcb, 0x2f, 0xb6, 0xd0, 0x24, 0xa7, 0xed, - 0xe8, 0xde, 0xd6, 0x61, 0xb6, 0x53, 0x92, 0xbf, 0xf1, 0x94, 0xb6, 0x5d, 0xb6, 0x4b, 0x6b, 0x8c, - 0xda, 0x6e, 0x53, 0x4e, 0xfe, 0xd8, 0xb6, 0x75, 0x01, 0x64, 0xd4, 0x30, 0x16, 0x86, 0xa7, 0xa5, - 0x55, 0x9b, 0x92, 0x84, 0x02, 0x9e, 0x7e, 0xdc, 0x9f, 0x17, 0x62, 0x34, 0x3f, 0x7c, 0x69, 0x79, - 0x71, 0x56, 0x65, 0xe3, 0xe8, 0xdc, 0x78, 0x37, 0xda, 0x57, 0x65, 0xa6, 0xaf, 0x4f, 0x98, 0xe9, - 0xf1, 0x41, 0x39, 0x72, 0x5b, 0x85, 0x6f, 0x81, 0x59, 0x2c, 0xd1, 0xe5, 0xe4, 0xbd, 0x36, 0x21, - 0x7a, 0xd4, 0x56, 0xa3, 0x56, 0xac, 0x68, 0x0a, 0x10, 0xbe, 0xca, 0xbd, 0xc4, 0x65, 0xeb, 0x47, - 0x1e, 0x96, 0xeb, 0xfd, 0x9c, 0xf1, 0x77, 0x69, 0x6c, 0x48, 0x3e, 0xe6, 0xdf, 0x4d, 0xe1, 0x11, - 0xc5, 0x6f, 0xe8, 0x1f, 0x82, 0xb3, 0x43, 0x5a, 0x3f, 0xb4, 0xc4, 0xe7, 0x5e, 0xc3, 0x66, 0x36, - 0x71, 0x83, 0x9e, 0x58, 0x9e, 0xcc, 0xf9, 0x1b, 0xc1, 0xbd, 0xc4, 0xf7, 0xa1, 0x82, 0x42, 0x31, - 0x58, 0xfd, 0x3d, 0x00, 0x07, 0xf7, 0xb6, 0x09, 0xb6, 0xc2, 0x8b, 0x60, 0xd6, 0xed, 0xb4, 0xf7, - 0xb0, 0xac, 0xdf, 0x74, 0xe4, 0x9c, 0x8a, 0xa0, 0x22, 0xc5, 0x35, 0x5e, 0x79, 0xf2, 0xbc, 0x30, - 0xf5, 0xf4, 0x79, 0x61, 0xea, 0xd9, 0xf3, 0xc2, 0xd4, 0x27, 0xbd, 0x82, 0xf6, 0xa4, 0x57, 0xd0, - 0x9e, 0xf6, 0x0a, 0xda, 0xb3, 0x5e, 0x41, 0xfb, 0xad, 0x57, 0xd0, 0x3e, 0xff, 0xbd, 0x30, 0xf5, - 0x76, 0x7e, 0xd4, 0x0f, 0xc0, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x61, 0x0f, 0x0a, 0xd7, 0x34, - 0x16, 0x00, 0x00, + // 1671 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0xd5, + 0x1a, 0xcf, 0x38, 0x71, 0xec, 0x1c, 0x27, 0x69, 0x72, 0x6e, 0xab, 0xeb, 0x9b, 0xab, 0x6b, 0xe7, + 0x8e, 0x68, 0x1b, 0x68, 0x6b, 0xd3, 0xb4, 0x42, 0xb0, 0x01, 0x3a, 0x69, 0x9a, 0x86, 0xa6, 0x8e, + 0x75, 0x6c, 0x15, 0x81, 0x78, 0x74, 0x32, 0x3e, 0xb1, 0xa7, 0x1e, 0xcf, 0x19, 0x9d, 0x39, 0x0e, + 0xad, 0x84, 0x10, 0x1b, 0x16, 0xec, 0xf8, 0x17, 0x10, 0x7f, 0x01, 0x82, 0x05, 0x12, 0x82, 0xc2, + 0x06, 0x75, 0x59, 0x89, 0x4d, 0x37, 0x58, 0xd4, 0xfc, 0x17, 0x59, 0xa1, 0xf3, 0x98, 0x97, 0x1f, + 0xb5, 0xa9, 0xaa, 0xac, 0x92, 0xf3, 0x7d, 0xdf, 0xf9, 0x7d, 0x8f, 0xf3, 0xbd, 0xc6, 0xe0, 0x5a, + 0xfb, 0x75, 0xbf, 0x64, 0x93, 0x72, 0xbb, 0x7b, 0x80, 0xa9, 0x8b, 0x19, 0xf6, 0xcb, 0x47, 0xd8, + 0x6d, 0x10, 0x5a, 0x56, 0x0c, 0xd3, 0xb3, 0xcb, 0x2e, 0x66, 0x9f, 0x10, 0xda, 0xb6, 0xdd, 0x66, + 0xf9, 0xe8, 0x72, 0xb9, 0x89, 0x5d, 0x4c, 0x4d, 0x86, 0x1b, 0x25, 0x8f, 0x12, 0x46, 0x60, 0x5e, + 0x4a, 0x96, 0x4c, 0xcf, 0x2e, 0x45, 0x92, 0xa5, 0xa3, 0xcb, 0x6b, 0x97, 0x9a, 0x36, 0x6b, 0x75, + 0x0f, 0x4a, 0x16, 0xe9, 0x94, 0x9b, 0xa4, 0x49, 0xca, 0xe2, 0xc2, 0x41, 0xf7, 0x50, 0x9c, 0xc4, + 0x41, 0xfc, 0x27, 0x81, 0xd6, 0xf4, 0x98, 0x4a, 0x8b, 0x50, 0x3c, 0x42, 0xd9, 0xda, 0xd5, 0x48, + 0xa6, 0x63, 0x5a, 0x2d, 0xdb, 0xc5, 0xf4, 0x41, 0xd9, 0x6b, 0x37, 0x39, 0xc1, 0x2f, 0x77, 0x30, + 0x33, 0x47, 0xdd, 0x2a, 0x8f, 0xbb, 0x45, 0xbb, 0x2e, 0xb3, 0x3b, 0x78, 0xe8, 0xc2, 0x6b, 0x93, + 0x2e, 0xf8, 0x56, 0x0b, 0x77, 0xcc, 0xa1, 0x7b, 0x57, 0xc6, 0xdd, 0xeb, 0x32, 0xdb, 0x29, 0xdb, + 0x2e, 0xf3, 0x19, 0x1d, 0xbc, 0xa4, 0xff, 0xac, 0x81, 0x53, 0x37, 0xeb, 0xf5, 0xea, 0xae, 0xdb, + 0xa4, 0xd8, 0xf7, 0xab, 0x26, 0x6b, 0xc1, 0x75, 0x30, 0xe7, 0x99, 0xac, 0x95, 0xd7, 0xd6, 0xb5, + 0x8d, 0x05, 0x63, 0xf1, 0x51, 0xaf, 0x38, 0xd3, 0xef, 0x15, 0xe7, 0x38, 0x0f, 0x09, 0x0e, 0xbc, + 0x0a, 0xb2, 0xfc, 0x6f, 0xfd, 0x81, 0x87, 0xf3, 0xb3, 0x42, 0x2a, 0xdf, 0xef, 0x15, 0xb3, 0x55, + 0x45, 0x3b, 0x8e, 0xfd, 0x8f, 0x42, 0x49, 0x58, 0x03, 0x99, 0x03, 0xd3, 0x6a, 0x63, 0xb7, 0x91, + 0x4f, 0xad, 0x6b, 0x1b, 0xb9, 0xcd, 0x8d, 0xd2, 0xb8, 0xe7, 0x2b, 0x29, 0x7b, 0x0c, 0x29, 0x6f, + 0x9c, 0x52, 0x46, 0x64, 0x14, 0x01, 0x05, 0x48, 0xfa, 0x21, 0x38, 0x1d, 0xb3, 0x1f, 0x75, 0x1d, + 0x7c, 0xc7, 0x74, 0xba, 0x18, 0x56, 0x40, 0x9a, 0x2b, 0xf6, 0xf3, 0xda, 0xfa, 0xec, 0x46, 0x6e, + 0xf3, 0xe5, 0xf1, 0xaa, 0x06, 0xdc, 0x37, 0x96, 0x94, 0xae, 0x34, 0x3f, 0xf9, 0x48, 0xc2, 0xe8, + 0xfb, 0x20, 0xb3, 0x5b, 0x35, 0x1c, 0x62, 0xb5, 0x79, 0x7c, 0x2c, 0xbb, 0x41, 0x07, 0xe3, 0xb3, + 0xb5, 0x7b, 0x1d, 0x21, 0xc1, 0x81, 0x3a, 0x98, 0xc7, 0xf7, 0x2d, 0xec, 0xb1, 0x7c, 0x6a, 0x7d, + 0x76, 0x63, 0xc1, 0x00, 0xfd, 0x5e, 0x71, 0x7e, 0x5b, 0x50, 0x90, 0xe2, 0xe8, 0x5f, 0xa4, 0x40, + 0x46, 0xa9, 0x85, 0x77, 0x41, 0x96, 0xa7, 0x4f, 0xc3, 0x64, 0xa6, 0x40, 0xcd, 0x6d, 0xbe, 0x1a, + 0xb3, 0x37, 0x7c, 0xcd, 0x92, 0xd7, 0x6e, 0x72, 0x82, 0x5f, 0xe2, 0xd2, 0xdc, 0xf6, 0xfd, 0x83, + 0x7b, 0xd8, 0x62, 0xb7, 0x31, 0x33, 0x0d, 0xa8, 0xec, 0x00, 0x11, 0x0d, 0x85, 0xa8, 0x70, 0x07, + 0xcc, 0xf9, 0x1e, 0xb6, 0x54, 0xe0, 0xcf, 0x4e, 0x0c, 0x7c, 0xcd, 0xc3, 0x56, 0xe4, 0x1a, 0x3f, + 0x21, 0x01, 0x00, 0xf7, 0xc1, 0xbc, 0xcf, 0x4c, 0xd6, 0xf5, 0xc5, 0xc3, 0xe7, 0x36, 0xcf, 0x4f, + 0x86, 0x12, 0xe2, 0xc6, 0xb2, 0x02, 0x9b, 0x97, 0x67, 0xa4, 0x60, 0xf4, 0x5f, 0x35, 0xb0, 0x9c, + 0x7c, 0x6d, 0x78, 0x07, 0x64, 0x7c, 0x4c, 0x8f, 0x6c, 0x0b, 0xe7, 0xe7, 0x84, 0x92, 0xf2, 0x64, + 0x25, 0x52, 0x3e, 0xc8, 0x97, 0x1c, 0xcf, 0x15, 0x45, 0x43, 0x01, 0x18, 0x7c, 0x17, 0x64, 0x29, + 0xf6, 0x49, 0x97, 0x5a, 0x58, 0x59, 0x7f, 0x29, 0x0e, 0xcc, 0xeb, 0x9e, 0x43, 0xf2, 0x64, 0x6d, + 0xec, 0x11, 0xcb, 0x74, 0x64, 0x28, 0x11, 0x3e, 0xc4, 0x14, 0xbb, 0x16, 0x36, 0x16, 0x79, 0x96, + 0x23, 0x05, 0x81, 0x42, 0x30, 0x5e, 0x45, 0x8b, 0xca, 0x90, 0x2d, 0xc7, 0x3c, 0x91, 0x07, 0xdd, + 0x4b, 0x3c, 0xe8, 0x2b, 0x13, 0x03, 0x24, 0xec, 0x1a, 0xf7, 0xaa, 0xfa, 0x4f, 0x1a, 0x58, 0x89, + 0x0b, 0xee, 0xd9, 0x3e, 0x83, 0x1f, 0x0c, 0x39, 0x51, 0x9a, 0xce, 0x09, 0x7e, 0x5b, 0xb8, 0xb0, + 0xa2, 0x54, 0x65, 0x03, 0x4a, 0xcc, 0x81, 0x5b, 0x20, 0x6d, 0x33, 0xdc, 0xf1, 0x45, 0x89, 0xe4, + 0x36, 0xcf, 0x4d, 0xe7, 0x41, 0x54, 0x9d, 0xbb, 0xfc, 0x32, 0x92, 0x18, 0xfa, 0x1f, 0x1a, 0x28, + 0xc6, 0xc5, 0xaa, 0x26, 0x35, 0x3b, 0x98, 0x61, 0xea, 0x87, 0x8f, 0x07, 0x37, 0x40, 0xd6, 0xac, + 0xee, 0xee, 0x50, 0xd2, 0xf5, 0x82, 0xd2, 0xe5, 0xa6, 0x5d, 0x53, 0x34, 0x14, 0x72, 0x79, 0x81, + 0xb7, 0x6d, 0xd5, 0xa5, 0x62, 0x05, 0x7e, 0xcb, 0x76, 0x1b, 0x48, 0x70, 0xb8, 0x84, 0x6b, 0x76, + 0x82, 0xe6, 0x17, 0x4a, 0x54, 0xcc, 0x0e, 0x46, 0x82, 0x03, 0x8b, 0x20, 0xed, 0x5b, 0xc4, 0x93, + 0x19, 0xbc, 0x60, 0x2c, 0x70, 0x93, 0x6b, 0x9c, 0x80, 0x24, 0x1d, 0x5e, 0x00, 0x0b, 0x5c, 0xd0, + 0xf7, 0x4c, 0x0b, 0xe7, 0xd3, 0x42, 0x68, 0xa9, 0xdf, 0x2b, 0x2e, 0x54, 0x02, 0x22, 0x8a, 0xf8, + 0xfa, 0xb7, 0x03, 0xef, 0xc3, 0x9f, 0x0e, 0x6e, 0x02, 0x60, 0x11, 0x97, 0x51, 0xe2, 0x38, 0x38, + 0xe8, 0x46, 0x61, 0xd2, 0x6c, 0x85, 0x1c, 0x14, 0x93, 0x82, 0x36, 0x00, 0x5e, 0x18, 0x1b, 0x95, + 0x3c, 0x6f, 0x4c, 0x17, 0xfa, 0x11, 0x31, 0x35, 0x96, 0xb9, 0xaa, 0x18, 0x23, 0x06, 0xae, 0x7f, + 0xa7, 0x81, 0x9c, 0xba, 0x7f, 0x02, 0xe9, 0x74, 0x23, 0x99, 0x4e, 0xff, 0x9f, 0x3c, 0x5a, 0x46, + 0x67, 0xd2, 0x0f, 0x1a, 0x58, 0x0b, 0xac, 0x26, 0x66, 0xc3, 0x30, 0x1d, 0xd3, 0xb5, 0x30, 0x0d, + 0x3a, 0xf5, 0x1a, 0x48, 0xd9, 0x41, 0xfa, 0x00, 0x05, 0x90, 0xda, 0xad, 0xa2, 0x94, 0xed, 0xc1, + 0x8b, 0x20, 0xdb, 0x22, 0x3e, 0x13, 0x89, 0x21, 0x53, 0x27, 0x34, 0xf8, 0xa6, 0xa2, 0xa3, 0x50, + 0x02, 0x56, 0x41, 0xda, 0x23, 0x94, 0xf9, 0xf9, 0x39, 0x61, 0xf0, 0x85, 0x89, 0x06, 0x57, 0x09, + 0x65, 0xaa, 0x97, 0x46, 0x23, 0x8a, 0x23, 0x20, 0x09, 0xa4, 0x7f, 0x0a, 0xfe, 0x33, 0xc2, 0x72, + 0x79, 0x05, 0x7e, 0x0c, 0x32, 0xb6, 0x64, 0xaa, 0x89, 0x78, 0x75, 0xa2, 0xc2, 0x11, 0xfe, 0x47, + 0x83, 0x38, 0x18, 0xb8, 0x01, 0xaa, 0xfe, 0x8d, 0x06, 0x56, 0x87, 0x2c, 0x15, 0xbb, 0x04, 0xa1, + 0x4c, 0x44, 0x2c, 0x1d, 0xdb, 0x25, 0x08, 0x65, 0x48, 0x70, 0xe0, 0x2d, 0x90, 0x15, 0xab, 0x88, + 0x45, 0x1c, 0x15, 0xb5, 0x72, 0x10, 0xb5, 0xaa, 0xa2, 0x1f, 0xf7, 0x8a, 0xff, 0x1d, 0xde, 0xcf, + 0x4a, 0x01, 0x1b, 0x85, 0x00, 0xbc, 0xea, 0x30, 0xa5, 0x84, 0xaa, 0xc2, 0x14, 0x55, 0xb7, 0xcd, + 0x09, 0x48, 0xd2, 0xf5, 0xaf, 0xa3, 0xa4, 0xe4, 0xbb, 0x02, 0xb7, 0x8f, 0xbf, 0xc8, 0xe0, 0x2c, + 0xe7, 0xef, 0x85, 0x04, 0x07, 0x7a, 0x60, 0xc5, 0x1e, 0x58, 0x2e, 0xa6, 0x6e, 0xba, 0xe1, 0x0d, + 0x23, 0xaf, 0x90, 0x57, 0x06, 0x39, 0x68, 0x08, 0x5d, 0xbf, 0x0b, 0x86, 0xa4, 0x78, 0xbb, 0x6f, + 0x31, 0xe6, 0x8d, 0x28, 0x9c, 0xf1, 0xdb, 0x4c, 0xa4, 0x3d, 0x2b, 0x7c, 0xaa, 0xd7, 0xab, 0x48, + 0xa0, 0xe8, 0x5f, 0x6a, 0xe0, 0xcc, 0xc8, 0xc1, 0x19, 0x36, 0x36, 0x6d, 0x6c, 0x63, 0xab, 0xa8, + 0x17, 0x95, 0x31, 0xb8, 0x38, 0xde, 0x92, 0x24, 0x32, 0x7f, 0xf1, 0x51, 0xef, 0xaf, 0xff, 0x96, + 0x0a, 0x5f, 0x44, 0x74, 0xb5, 0xb7, 0xc3, 0x78, 0x8b, 0xae, 0xc3, 0x35, 0xab, 0x1e, 0x7a, 0x3a, + 0x16, 0xbf, 0x90, 0x87, 0x86, 0xa4, 0x61, 0x03, 0x2c, 0x37, 0xf0, 0xa1, 0xd9, 0x75, 0x98, 0xd2, + 0xad, 0xa2, 0x36, 0xfd, 0xba, 0x09, 0xfb, 0xbd, 0xe2, 0xf2, 0xf5, 0x04, 0x06, 0x1a, 0xc0, 0x84, + 0x5b, 0x60, 0x96, 0x39, 0x41, 0xbb, 0x79, 0x69, 0x22, 0x74, 0x7d, 0xaf, 0x66, 0xe4, 0x94, 0xfb, + 0xb3, 0xf5, 0xbd, 0x1a, 0xe2, 0xb7, 0xe1, 0x3b, 0x20, 0x4d, 0xbb, 0x0e, 0xe6, 0xcb, 0xd4, 0xec, + 0x54, 0x7b, 0x19, 0x7f, 0xd3, 0xa8, 0xfc, 0xf9, 0xc9, 0x47, 0x12, 0x42, 0xff, 0x0c, 0x2c, 0x25, + 0x36, 0x2e, 0xd8, 0x01, 0x8b, 0x4e, 0xac, 0x84, 0x55, 0x14, 0xae, 0xfc, 0xa3, 0xba, 0x57, 0x0d, + 0xe7, 0xb4, 0xd2, 0xb8, 0x18, 0xe7, 0xa1, 0x04, 0xbc, 0x6e, 0x02, 0x10, 0xf9, 0xca, 0x2b, 0x91, + 0x97, 0x8f, 0xec, 0x36, 0xaa, 0x12, 0x79, 0x55, 0xf9, 0x48, 0xd2, 0xf9, 0xf4, 0xf2, 0xb1, 0x45, + 0x31, 0xab, 0x44, 0xfd, 0x32, 0x9c, 0x5e, 0xb5, 0x90, 0x83, 0x62, 0x52, 0xfa, 0x2f, 0x1a, 0x58, + 0xaa, 0x48, 0x93, 0xab, 0xc4, 0xb1, 0xad, 0x07, 0x27, 0xb0, 0x68, 0xdd, 0x4e, 0x2c, 0x5a, 0xcf, + 0x68, 0xd3, 0x09, 0xc3, 0xc6, 0x6e, 0x5a, 0xdf, 0x6b, 0xe0, 0xdf, 0x09, 0xc9, 0xed, 0xa8, 0x19, + 0x85, 0x23, 0x41, 0x9b, 0x34, 0x12, 0x12, 0x08, 0xa2, 0xb4, 0x46, 0x8e, 0x04, 0xb8, 0x03, 0x52, + 0x8c, 0xa8, 0x1c, 0x9d, 0x1a, 0x0e, 0x63, 0x1a, 0xcd, 0xb6, 0x3a, 0x41, 0x29, 0x46, 0xf4, 0x1f, + 0x35, 0x90, 0x4f, 0x48, 0xc5, 0x9b, 0xe8, 0x8b, 0xb7, 0xfb, 0x36, 0x98, 0x3b, 0xa4, 0xa4, 0xf3, + 0x3c, 0x96, 0x87, 0x41, 0xbf, 0x41, 0x49, 0x07, 0x09, 0x18, 0xfd, 0xa1, 0x06, 0x56, 0x13, 0x92, + 0x27, 0xb0, 0x90, 0xec, 0x25, 0x17, 0x92, 0xf3, 0x53, 0xfa, 0x30, 0x66, 0x2d, 0x79, 0x98, 0x1a, + 0xf0, 0x80, 0xfb, 0x0a, 0x0f, 0x41, 0xce, 0x23, 0x8d, 0x1a, 0x76, 0xb0, 0xc5, 0xc8, 0xa8, 0x02, + 0x7f, 0x96, 0x13, 0xe6, 0x01, 0x76, 0x82, 0xab, 0xc6, 0xa9, 0x7e, 0xaf, 0x98, 0xab, 0x46, 0x58, + 0x28, 0x0e, 0x0c, 0xef, 0x83, 0xd5, 0x70, 0x17, 0x0d, 0xb5, 0xa5, 0x9e, 0x5f, 0xdb, 0x99, 0x7e, + 0xaf, 0xb8, 0x5a, 0x19, 0x44, 0x44, 0xc3, 0x4a, 0xe0, 0x4d, 0x90, 0xb1, 0x3d, 0xf1, 0xd9, 0xad, + 0xbe, 0xd8, 0x9e, 0xb5, 0xd8, 0xc9, 0xef, 0x73, 0xf9, 0xf1, 0xa7, 0x0e, 0x28, 0xb8, 0xae, 0xff, + 0x3e, 0x98, 0x03, 0x3c, 0xe1, 0xe0, 0x4e, 0x6c, 0xfb, 0x90, 0x33, 0xef, 0xc2, 0xf3, 0x6d, 0x1e, + 0xc9, 0xb1, 0x38, 0xbe, 0x09, 0x75, 0x99, 0xed, 0x94, 0xe4, 0x8f, 0x31, 0xa5, 0x5d, 0x97, 0xed, + 0xd3, 0x1a, 0xa3, 0xb6, 0xdb, 0x94, 0x23, 0x3a, 0xb6, 0x16, 0x9d, 0x05, 0x19, 0x35, 0x35, 0x85, + 0xe3, 0x69, 0xe9, 0xd5, 0xb6, 0x24, 0xa1, 0x80, 0xa7, 0x1f, 0x0f, 0xe6, 0x85, 0x98, 0xa1, 0xf7, + 0x5e, 0x58, 0x5e, 0xfc, 0x4b, 0x65, 0xe3, 0xf8, 0xdc, 0xf8, 0x30, 0x5a, 0x2c, 0x65, 0xa6, 0x6f, + 0x4e, 0x99, 0xe9, 0xf1, 0x89, 0x36, 0x76, 0xad, 0x84, 0xef, 0x81, 0x79, 0x2c, 0xd1, 0xe5, 0x88, + 0xbc, 0x3c, 0x25, 0x7a, 0xd4, 0x56, 0xa3, 0x5f, 0x1e, 0x14, 0x4d, 0x01, 0xc2, 0xb7, 0x78, 0x94, + 0xb8, 0x2c, 0xff, 0xe0, 0x97, 0x7b, 0xf8, 0x82, 0xf1, 0x3f, 0xe9, 0x6c, 0x48, 0x3e, 0xe6, 0x1f, + 0x38, 0xe1, 0x11, 0xc5, 0x6f, 0xe8, 0x1f, 0x01, 0x38, 0xbc, 0xe4, 0x4c, 0xb1, 0x42, 0x9d, 0x03, + 0xf3, 0x6e, 0xb7, 0x73, 0x80, 0x65, 0x0d, 0xa5, 0x23, 0x03, 0x2b, 0x82, 0x8a, 0x14, 0xd7, 0x78, + 0xf3, 0xd1, 0xd3, 0xc2, 0xcc, 0xe3, 0xa7, 0x85, 0x99, 0x27, 0x4f, 0x0b, 0x33, 0x9f, 0xf7, 0x0b, + 0xda, 0xa3, 0x7e, 0x41, 0x7b, 0xdc, 0x2f, 0x68, 0x4f, 0xfa, 0x05, 0xed, 0xcf, 0x7e, 0x41, 0xfb, + 0xea, 0xaf, 0xc2, 0xcc, 0xfb, 0xf9, 0x71, 0xbf, 0x96, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xd4, + 0x46, 0x40, 0xf2, 0x61, 0x15, 0x00, 0x00, } func (m *HTTPIngressPath) Marshal() (dAtA []byte, err error) { @@ -1822,16 +1790,6 @@ func (m *NetworkPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a { size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -2180,43 +2138,6 @@ func (m *NetworkPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NetworkPolicyStatus) 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 *NetworkPolicyStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NetworkPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *ServiceBackendPort) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2583,8 +2504,6 @@ func (m *NetworkPolicy) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) return n } @@ -2717,21 +2636,6 @@ func (m *NetworkPolicySpec) Size() (n int) { return n } -func (m *NetworkPolicyStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - func (m *ServiceBackendPort) Size() (n int) { if m == nil { return 0 @@ -3006,7 +2910,6 @@ func (this *NetworkPolicy) String() string { s := strings.Join([]string{`&NetworkPolicy{`, `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "NetworkPolicySpec", "NetworkPolicySpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "NetworkPolicyStatus", "NetworkPolicyStatus", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -3116,21 +3019,6 @@ func (this *NetworkPolicySpec) String() string { }, "") return s } -func (this *NetworkPolicyStatus) String() string { - if this == nil { - return "nil" - } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&NetworkPolicyStatus{`, - `Conditions:` + repeatedStringForConditions + `,`, - `}`, - }, "") - return s -} func (this *ServiceBackendPort) String() string { if this == nil { return "nil" @@ -5609,39 +5497,6 @@ func (m *NetworkPolicy) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -6496,90 +6351,6 @@ func (m *NetworkPolicySpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *NetworkPolicyStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NetworkPolicyStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NetworkPolicyStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Conditions = append(m.Conditions, v1.Condition{}) - if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ServiceBackendPort) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/tools/vendor/k8s.io/api/networking/v1/generated.proto b/tools/vendor/k8s.io/api/networking/v1/generated.proto index ed194a89d..b50dd491e 100644 --- a/tools/vendor/k8s.io/api/networking/v1/generated.proto +++ b/tools/vendor/k8s.io/api/networking/v1/generated.proto @@ -384,11 +384,6 @@ message NetworkPolicy { // spec represents the specification of the desired behavior for this NetworkPolicy. // +optional optional NetworkPolicySpec spec = 2; - - // status represents the current state of the NetworkPolicy. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional NetworkPolicyStatus status = 3; } // NetworkPolicyEgressRule describes a particular set of traffic that is allowed out of pods @@ -536,18 +531,6 @@ message NetworkPolicySpec { repeated string policyTypes = 4; } -// NetworkPolicyStatus describes the current state of the NetworkPolicy. -message NetworkPolicyStatus { - // conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - repeated k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; -} - // ServiceBackendPort is the service port being referenced. message ServiceBackendPort { // name is the name of the port on the Service. diff --git a/tools/vendor/k8s.io/api/networking/v1/types.go b/tools/vendor/k8s.io/api/networking/v1/types.go index fa7cf1bd7..a17e2cb5b 100644 --- a/tools/vendor/k8s.io/api/networking/v1/types.go +++ b/tools/vendor/k8s.io/api/networking/v1/types.go @@ -38,10 +38,10 @@ type NetworkPolicy struct { // +optional Spec NetworkPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - // status represents the current state of the NetworkPolicy. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Status NetworkPolicyStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` + // Status is tombstoned to show why 3 is a reserved protobuf tag. + // This commented field should remain, so in the future if we decide to reimplement + // NetworkPolicyStatus a different protobuf name and tag SHOULD be used! + // Status NetworkPolicyStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // PolicyType string describes the NetworkPolicy type @@ -205,48 +205,6 @@ type NetworkPolicyPeer struct { IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } -// NetworkPolicyConditionType is the type for status conditions on -// a NetworkPolicy. This type should be used with the -// NetworkPolicyStatus.Conditions field. -type NetworkPolicyConditionType string - -const ( - // NetworkPolicyConditionStatusAccepted represents status of a Network Policy that could be properly parsed by - // the Network Policy provider and will be implemented in the cluster - NetworkPolicyConditionStatusAccepted NetworkPolicyConditionType = "Accepted" - - // NetworkPolicyConditionStatusPartialFailure represents status of a Network Policy that could be partially - // parsed by the Network Policy provider and may not be completely implemented due to a lack of a feature or some - // other condition - NetworkPolicyConditionStatusPartialFailure NetworkPolicyConditionType = "PartialFailure" - - // NetworkPolicyConditionStatusFailure represents status of a Network Policy that could not be parsed by the - // Network Policy provider and will not be implemented in the cluster - NetworkPolicyConditionStatusFailure NetworkPolicyConditionType = "Failure" -) - -// NetworkPolicyConditionReason defines the set of reasons that explain why a -// particular NetworkPolicy condition type has been raised. -type NetworkPolicyConditionReason string - -const ( - // NetworkPolicyConditionReasonFeatureNotSupported represents a reason where the Network Policy may not have been - // implemented in the cluster due to a lack of some feature not supported by the Network Policy provider - NetworkPolicyConditionReasonFeatureNotSupported NetworkPolicyConditionReason = "FeatureNotSupported" -) - -// NetworkPolicyStatus describes the current state of the NetworkPolicy. -type NetworkPolicyStatus struct { - // conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` -} - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // NetworkPolicyList is a list of NetworkPolicy objects. diff --git a/tools/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index 91161d5ca..ff080540d 100644 --- a/tools/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -224,7 +224,6 @@ var map_NetworkPolicy = map[string]string{ "": "NetworkPolicy describes what network traffic is allowed for a set of Pods", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "spec": "spec represents the specification of the desired behavior for this NetworkPolicy.", - "status": "status represents the current state of the NetworkPolicy. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", } func (NetworkPolicy) SwaggerDoc() map[string]string { @@ -295,15 +294,6 @@ func (NetworkPolicySpec) SwaggerDoc() map[string]string { return map_NetworkPolicySpec } -var map_NetworkPolicyStatus = map[string]string{ - "": "NetworkPolicyStatus describes the current state of the NetworkPolicy.", - "conditions": "conditions holds an array of metav1.Condition that describe the state of the NetworkPolicy. Current service state", -} - -func (NetworkPolicyStatus) SwaggerDoc() map[string]string { - return map_NetworkPolicyStatus -} - var map_ServiceBackendPort = map[string]string{ "": "ServiceBackendPort is the service port being referenced.", "name": "name is the name of the port on the Service. This is a mutually exclusive setting with \"Number\".", diff --git a/tools/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go index c95653c91..540873833 100644 --- a/tools/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go @@ -499,7 +499,6 @@ func (in *NetworkPolicy) DeepCopyInto(out *NetworkPolicy) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) return } @@ -712,29 +711,6 @@ func (in *NetworkPolicySpec) DeepCopy() *NetworkPolicySpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkPolicyStatus) DeepCopyInto(out *NetworkPolicyStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]metav1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPolicyStatus. -func (in *NetworkPolicyStatus) DeepCopy() *NetworkPolicyStatus { - if in == nil { - return nil - } - out := new(NetworkPolicyStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServiceBackendPort) DeepCopyInto(out *ServiceBackendPort) { *out = *in diff --git a/tools/vendor/k8s.io/api/rbac/v1/generated.proto b/tools/vendor/k8s.io/api/rbac/v1/generated.proto index 222f2b905..13ff60ea7 100644 --- a/tools/vendor/k8s.io/api/rbac/v1/generated.proto +++ b/tools/vendor/k8s.io/api/rbac/v1/generated.proto @@ -66,6 +66,7 @@ message ClusterRoleBinding { // RoleRef can only reference a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. + // This field is immutable. optional RoleRef roleRef = 3; } @@ -140,6 +141,7 @@ message RoleBinding { // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. + // This field is immutable. optional RoleRef roleRef = 3; } diff --git a/tools/vendor/k8s.io/api/rbac/v1/types.go b/tools/vendor/k8s.io/api/rbac/v1/types.go index 5a8e4a85c..ce845d69b 100644 --- a/tools/vendor/k8s.io/api/rbac/v1/types.go +++ b/tools/vendor/k8s.io/api/rbac/v1/types.go @@ -132,6 +132,7 @@ type RoleBinding struct { // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. + // This field is immutable. RoleRef RoleRef `json:"roleRef" protobuf:"bytes,3,opt,name=roleRef"` } @@ -209,6 +210,7 @@ type ClusterRoleBinding struct { // RoleRef can only reference a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. + // This field is immutable. RoleRef RoleRef `json:"roleRef" protobuf:"bytes,3,opt,name=roleRef"` } diff --git a/tools/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go b/tools/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go index 370398198..0471a5594 100644 --- a/tools/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go +++ b/tools/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go @@ -51,7 +51,7 @@ var map_ClusterRoleBinding = map[string]string{ "": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.", "metadata": "Standard object's metadata.", "subjects": "Subjects holds references to the objects the role applies to.", - "roleRef": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", + "roleRef": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. This field is immutable.", } func (ClusterRoleBinding) SwaggerDoc() map[string]string { @@ -105,7 +105,7 @@ var map_RoleBinding = map[string]string{ "": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.", "metadata": "Standard object's metadata.", "subjects": "Subjects holds references to the objects the role applies to.", - "roleRef": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", + "roleRef": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. This field is immutable.", } func (RoleBinding) SwaggerDoc() map[string]string { diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go index 2bd5d5293..52c65ccbe 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go @@ -291,9 +291,11 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { } if in.XValidations != nil { - in, out := &in.XValidations, &out.XValidations - *out = make([]ValidationRule, len(*in)) - copy(*out, *in) + inValidations, outValidations := &in.XValidations, &out.XValidations + *outValidations = make([]ValidationRule, len(*inValidations)) + for i := range *inValidations { + in.XValidations[i].DeepCopyInto(&out.XValidations[i]) + } } return out diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go index 04ce206bb..cc1c7437f 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go @@ -16,6 +16,26 @@ limitations under the License. package apiextensions +// FieldValueErrorReason is a machine-readable value providing more detail about why a field failed the validation. +// +enum +type FieldValueErrorReason string + +const ( + // FieldValueRequired is used to report required values that are not + // provided (e.g. empty strings, null values, or empty arrays). + FieldValueRequired FieldValueErrorReason = "FieldValueRequired" + // FieldValueDuplicate is used to report collisions of values that must be + // unique (e.g. unique IDs). + FieldValueDuplicate FieldValueErrorReason = "FieldValueDuplicate" + // FieldValueInvalid is used to report malformed values (e.g. failed regex + // match, too long, out of bounds). + FieldValueInvalid FieldValueErrorReason = "FieldValueInvalid" + // FieldValueForbidden is used to report valid (as per formatting rules) + // values which would be accepted under some conditions, but which are not + // permitted by the current conditions (such as security policy). + FieldValueForbidden FieldValueErrorReason = "FieldValueForbidden" +) + // JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/). type JSONSchemaProps struct { ID string @@ -208,6 +228,24 @@ type ValidationRule struct { // "x must be less than max ("+string(self.max)+")" // +optional MessageExpression string + // reason provides a machine-readable validation failure reason that is returned to the caller when a request fails this validation rule. + // The HTTP status code returned to the caller will match the reason of the reason of the first failed validation rule. + // The currently supported reasons are: "FieldValueInvalid", "FieldValueForbidden", "FieldValueRequired", "FieldValueDuplicate". + // If not set, default to use "FieldValueInvalid". + // All future added reasons must be accepted by clients when reading this value and unknown reasons should be treated as FieldValueInvalid. + // +optional + Reason *FieldValueErrorReason + // fieldPath represents the field path returned when the validation fails. + // It must be a relative JSON path (i.e. with array notation) scoped to the location of this x-kubernetes-validations extension in the schema and refer to an existing field. + // e.g. when validation checks if a specific attribute `foo` under a map `testMap`, the fieldPath could be set to `.testMap.foo` + // If the validation checks two lists must have unique attributes, the fieldPath could be set to either of the list: e.g. `.testList` + // It does not support list numeric index. + // It supports child operation to refer to an existing field currently. Refer to [JSONPath support in Kubernetes](https://kubernetes.io/docs/reference/kubectl/jsonpath/) for more info. + // Numeric index of array is not supported. + // For field name which contains special characters, use `['specialName']` to refer the field name. + // e.g. for attribute `foo.34$` appears in a list `testList`, the fieldPath could be set to `.testList['foo.34$']` + // +optional + FieldPath string } // JSON represents any valid JSON value. diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/deepcopy.go index 28dfb99f1..c548e642d 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/deepcopy.go @@ -251,9 +251,11 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { } if in.XValidations != nil { - in, out := &in.XValidations, &out.XValidations - *out = make([]ValidationRule, len(*in)) - copy(*out, *in) + inValidations, outValidations := &in.XValidations, &out.XValidations + *outValidations = make([]ValidationRule, len(*inValidations)) + for i := range *inValidations { + in.XValidations[i].DeepCopyInto(&out.XValidations[i]) + } } return out diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go index 5dbb38c8b..75a573a2d 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go @@ -814,199 +814,202 @@ func init() { } var fileDescriptor_f5a35c9667703937 = []byte{ - // 3072 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdf, 0x6f, 0x24, 0x47, - 0xf1, 0xbf, 0x59, 0xff, 0x5a, 0xb7, 0xed, 0xb3, 0xdd, 0x77, 0xf6, 0x77, 0xce, 0xb9, 0xf3, 0xfa, - 0x36, 0xdf, 0x1c, 0x4e, 0x72, 0x59, 0x27, 0x26, 0x21, 0x47, 0x84, 0x40, 0x5e, 0xdb, 0x97, 0x38, - 0x67, 0x9f, 0xad, 0xde, 0xbb, 0x8b, 0x93, 0x20, 0x92, 0xf1, 0x4e, 0x7b, 0x3d, 0xf1, 0xfc, 0xba, - 0xee, 0x99, 0xb5, 0x2d, 0x81, 0x14, 0x81, 0x22, 0x20, 0x12, 0x84, 0x07, 0x14, 0x9e, 0x10, 0x42, - 0x28, 0x48, 0xf0, 0x00, 0x6f, 0xf0, 0x2f, 0xe4, 0x05, 0x29, 0x4f, 0x28, 0x12, 0xd2, 0x8a, 0x2c, - 0xff, 0x00, 0x12, 0x20, 0x84, 0x1f, 0x10, 0xea, 0x1f, 0xd3, 0xd3, 0x3b, 0xbb, 0x7b, 0x77, 0xb2, - 0xd7, 0xc9, 0xdb, 0x6e, 0x55, 0x75, 0x7d, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0x07, 0x58, 0xfb, - 0x37, 0x68, 0xc9, 0x09, 0x16, 0xf6, 0xe3, 0x1d, 0x4c, 0x7c, 0x1c, 0x61, 0xba, 0x50, 0xc7, 0xbe, - 0x1d, 0x90, 0x05, 0xc9, 0xb0, 0x42, 0x07, 0x1f, 0x46, 0xd8, 0xa7, 0x4e, 0xe0, 0xd3, 0x67, 0xac, - 0xd0, 0xa1, 0x98, 0xd4, 0x31, 0x59, 0x08, 0xf7, 0x6b, 0x8c, 0x47, 0x5b, 0x05, 0x16, 0xea, 0xcf, - 0x2d, 0xd4, 0xb0, 0x8f, 0x89, 0x15, 0x61, 0xbb, 0x14, 0x92, 0x20, 0x0a, 0xe0, 0x0d, 0xa1, 0xa9, - 0xd4, 0x22, 0xf8, 0x96, 0xd2, 0x54, 0x0a, 0xf7, 0x6b, 0x8c, 0x47, 0x5b, 0x05, 0x4a, 0xf5, 0xe7, - 0x66, 0x9e, 0xa9, 0x39, 0xd1, 0x5e, 0xbc, 0x53, 0xaa, 0x06, 0xde, 0x42, 0x2d, 0xa8, 0x05, 0x0b, - 0x5c, 0xe1, 0x4e, 0xbc, 0xcb, 0xff, 0xf1, 0x3f, 0xfc, 0x97, 0x00, 0x9a, 0x79, 0x3e, 0x35, 0xd9, - 0xb3, 0xaa, 0x7b, 0x8e, 0x8f, 0xc9, 0x51, 0x6a, 0xa7, 0x87, 0x23, 0xab, 0x83, 0x79, 0x33, 0x0b, - 0xdd, 0x46, 0x91, 0xd8, 0x8f, 0x1c, 0x0f, 0xb7, 0x0d, 0xf8, 0xca, 0xc3, 0x06, 0xd0, 0xea, 0x1e, - 0xf6, 0xac, 0xec, 0xb8, 0xe2, 0xb1, 0x01, 0x26, 0x97, 0x03, 0xbf, 0x8e, 0x09, 0x9b, 0x20, 0xc2, - 0xf7, 0x63, 0x4c, 0x23, 0x58, 0x06, 0x7d, 0xb1, 0x63, 0x9b, 0xc6, 0x9c, 0x31, 0x3f, 0x5c, 0x7e, - 0xf6, 0xe3, 0x46, 0xe1, 0x5c, 0xb3, 0x51, 0xe8, 0xbb, 0xbb, 0xb6, 0x72, 0xdc, 0x28, 0x5c, 0xed, - 0x86, 0x14, 0x1d, 0x85, 0x98, 0x96, 0xee, 0xae, 0xad, 0x20, 0x36, 0x18, 0xbe, 0x0c, 0x26, 0x6d, - 0x4c, 0x1d, 0x82, 0xed, 0xa5, 0xad, 0xb5, 0x7b, 0x42, 0xbf, 0x99, 0xe3, 0x1a, 0x2f, 0x49, 0x8d, - 0x93, 0x2b, 0x59, 0x01, 0xd4, 0x3e, 0x06, 0x6e, 0x83, 0xa1, 0x60, 0xe7, 0x1d, 0x5c, 0x8d, 0xa8, - 0xd9, 0x37, 0xd7, 0x37, 0x3f, 0xb2, 0xf8, 0x4c, 0x29, 0x5d, 0x3c, 0x65, 0x02, 0x5f, 0x31, 0x39, - 0xd9, 0x12, 0xb2, 0x0e, 0x56, 0x93, 0x45, 0x2b, 0x8f, 0x4b, 0xb4, 0xa1, 0x4d, 0xa1, 0x05, 0x25, - 0xea, 0x8a, 0xbf, 0xca, 0x01, 0xa8, 0x4f, 0x9e, 0x86, 0x81, 0x4f, 0x71, 0x4f, 0x66, 0x4f, 0xc1, - 0x44, 0x95, 0x6b, 0x8e, 0xb0, 0x2d, 0x71, 0xcd, 0xdc, 0x49, 0xac, 0x37, 0x25, 0xfe, 0xc4, 0x72, - 0x46, 0x1d, 0x6a, 0x03, 0x80, 0x77, 0xc0, 0x20, 0xc1, 0x34, 0x76, 0x23, 0xb3, 0x6f, 0xce, 0x98, - 0x1f, 0x59, 0xbc, 0xde, 0x15, 0x8a, 0x87, 0x36, 0x0b, 0xbe, 0x52, 0xfd, 0xb9, 0x52, 0x25, 0xb2, - 0xa2, 0x98, 0x96, 0xcf, 0x4b, 0xa4, 0x41, 0xc4, 0x75, 0x20, 0xa9, 0xab, 0xf8, 0x5f, 0x03, 0x4c, - 0xe8, 0x5e, 0xaa, 0x3b, 0xf8, 0x00, 0x12, 0x30, 0x44, 0x44, 0xb0, 0x70, 0x3f, 0x8d, 0x2c, 0xde, - 0x2a, 0x9d, 0x74, 0x47, 0x95, 0xda, 0xe2, 0xaf, 0x3c, 0xc2, 0x96, 0x4b, 0xfe, 0x41, 0x09, 0x10, - 0xac, 0x83, 0x3c, 0x91, 0x6b, 0xc4, 0x03, 0x69, 0x64, 0x71, 0xbd, 0x37, 0xa0, 0x42, 0x67, 0x79, - 0xb4, 0xd9, 0x28, 0xe4, 0x93, 0x7f, 0x48, 0x61, 0x15, 0x7f, 0x91, 0x03, 0xb3, 0xcb, 0x31, 0x8d, - 0x02, 0x0f, 0x61, 0x1a, 0xc4, 0xa4, 0x8a, 0x97, 0x03, 0x37, 0xf6, 0xfc, 0x15, 0xbc, 0xeb, 0xf8, - 0x4e, 0xc4, 0x62, 0x74, 0x0e, 0xf4, 0xfb, 0x96, 0x87, 0x65, 0xcc, 0x8c, 0x4a, 0x4f, 0xf6, 0xdf, - 0xb6, 0x3c, 0x8c, 0x38, 0x87, 0x49, 0xb0, 0x10, 0x91, 0x3b, 0x40, 0x49, 0xdc, 0x39, 0x0a, 0x31, - 0xe2, 0x1c, 0x78, 0x0d, 0x0c, 0xee, 0x06, 0xc4, 0xb3, 0xc4, 0xea, 0x0d, 0xa7, 0xeb, 0x71, 0x93, - 0x53, 0x91, 0xe4, 0xc2, 0x17, 0xc0, 0x88, 0x8d, 0x69, 0x95, 0x38, 0x21, 0x83, 0x36, 0xfb, 0xb9, - 0xf0, 0x05, 0x29, 0x3c, 0xb2, 0x92, 0xb2, 0x90, 0x2e, 0x07, 0xaf, 0x83, 0x7c, 0x48, 0x9c, 0x80, - 0x38, 0xd1, 0x91, 0x39, 0x30, 0x67, 0xcc, 0x0f, 0x94, 0x27, 0xe4, 0x98, 0xfc, 0x96, 0xa4, 0x23, - 0x25, 0xc1, 0xa4, 0xdf, 0xa1, 0x81, 0xbf, 0x65, 0x45, 0x7b, 0xe6, 0x20, 0x47, 0x50, 0xd2, 0xaf, - 0x56, 0x36, 0x6f, 0x33, 0x3a, 0x52, 0x12, 0xc5, 0x3f, 0x1b, 0xc0, 0xcc, 0x7a, 0x28, 0x71, 0x2f, - 0xbc, 0x09, 0xf2, 0x34, 0x62, 0x39, 0xa7, 0x76, 0x24, 0xfd, 0xf3, 0x54, 0xa2, 0xaa, 0x22, 0xe9, - 0xc7, 0x8d, 0xc2, 0x74, 0x3a, 0x22, 0xa1, 0x72, 0xdf, 0xa8, 0xb1, 0x2c, 0xe4, 0x0e, 0xf0, 0xce, - 0x5e, 0x10, 0xec, 0xcb, 0xd5, 0x3f, 0x45, 0xc8, 0xbd, 0x26, 0x14, 0xa5, 0x98, 0x22, 0xe4, 0x24, - 0x19, 0x25, 0x40, 0xc5, 0xff, 0xe4, 0xb2, 0x13, 0xd3, 0x16, 0xfd, 0x6d, 0x90, 0x67, 0x5b, 0xc8, - 0xb6, 0x22, 0x4b, 0x6e, 0x82, 0x67, 0x1f, 0x6d, 0xc3, 0x89, 0xfd, 0xba, 0x81, 0x23, 0xab, 0x0c, - 0xa5, 0x2b, 0x40, 0x4a, 0x43, 0x4a, 0x2b, 0x3c, 0x04, 0xfd, 0x34, 0xc4, 0x55, 0x39, 0xdf, 0x7b, - 0xa7, 0x88, 0xf6, 0x2e, 0x73, 0xa8, 0x84, 0xb8, 0x9a, 0x06, 0x23, 0xfb, 0x87, 0x38, 0x22, 0x7c, - 0xd7, 0x00, 0x83, 0x94, 0xe7, 0x05, 0x99, 0x4b, 0xb6, 0xcf, 0x00, 0x3c, 0x93, 0x77, 0xc4, 0x7f, - 0x24, 0x71, 0x8b, 0xff, 0xcc, 0x81, 0xab, 0xdd, 0x86, 0x2e, 0x07, 0xbe, 0x2d, 0x16, 0x61, 0x4d, - 0xee, 0x2b, 0x11, 0x59, 0x2f, 0xe8, 0xfb, 0xea, 0xb8, 0x51, 0x78, 0xe2, 0xa1, 0x0a, 0xb4, 0x0d, - 0xf8, 0x55, 0x35, 0x65, 0xb1, 0x49, 0xaf, 0xb6, 0x1a, 0x76, 0xdc, 0x28, 0x8c, 0xab, 0x61, 0xad, - 0xb6, 0xc2, 0x3a, 0x80, 0xae, 0x45, 0xa3, 0x3b, 0xc4, 0xf2, 0xa9, 0x50, 0xeb, 0x78, 0x58, 0x7a, - 0xee, 0xa9, 0x47, 0x0b, 0x0a, 0x36, 0xa2, 0x3c, 0x23, 0x21, 0xe1, 0x7a, 0x9b, 0x36, 0xd4, 0x01, - 0x81, 0xe5, 0x0c, 0x82, 0x2d, 0xaa, 0xd2, 0x80, 0x96, 0xc3, 0x19, 0x15, 0x49, 0x2e, 0x7c, 0x12, - 0x0c, 0x79, 0x98, 0x52, 0xab, 0x86, 0xf9, 0xde, 0x1f, 0x4e, 0x0f, 0xc5, 0x0d, 0x41, 0x46, 0x09, - 0xbf, 0xf8, 0x2f, 0x03, 0x5c, 0xee, 0xe6, 0xb5, 0x75, 0x87, 0x46, 0xf0, 0x9b, 0x6d, 0x61, 0x5f, - 0x7a, 0xb4, 0x19, 0xb2, 0xd1, 0x3c, 0xe8, 0x55, 0x2a, 0x49, 0x28, 0x5a, 0xc8, 0x1f, 0x80, 0x01, - 0x27, 0xc2, 0x5e, 0x72, 0x5a, 0xa2, 0xde, 0x87, 0x5d, 0x79, 0x4c, 0xc2, 0x0f, 0xac, 0x31, 0x20, - 0x24, 0xf0, 0x8a, 0x1f, 0xe5, 0xc0, 0x95, 0x6e, 0x43, 0x58, 0x1e, 0xa7, 0xcc, 0xd9, 0xa1, 0x1b, - 0x13, 0xcb, 0x95, 0xc1, 0xa6, 0x9c, 0xbd, 0xc5, 0xa9, 0x48, 0x72, 0x59, 0xee, 0xa4, 0x8e, 0x5f, - 0x8b, 0x5d, 0x8b, 0xc8, 0x48, 0x52, 0x13, 0xae, 0x48, 0x3a, 0x52, 0x12, 0xb0, 0x04, 0x00, 0xdd, - 0x0b, 0x48, 0xc4, 0x31, 0x78, 0x85, 0x33, 0x5c, 0x3e, 0xcf, 0x32, 0x42, 0x45, 0x51, 0x91, 0x26, - 0xc1, 0x0e, 0x92, 0x7d, 0xc7, 0xb7, 0xe5, 0x82, 0xab, 0xbd, 0x7b, 0xcb, 0xf1, 0x6d, 0xc4, 0x39, - 0x0c, 0xdf, 0x75, 0x68, 0xc4, 0x28, 0x72, 0xb5, 0x5b, 0x1c, 0xce, 0x25, 0x95, 0x04, 0xc3, 0xaf, - 0xb2, 0x04, 0x1b, 0x10, 0x07, 0x53, 0x73, 0x30, 0xc5, 0x5f, 0x56, 0x54, 0xa4, 0x49, 0x14, 0xff, - 0xd2, 0xdf, 0x3d, 0x3e, 0x58, 0x02, 0x81, 0x8f, 0x83, 0x81, 0x1a, 0x09, 0xe2, 0x50, 0x7a, 0x49, - 0x79, 0xfb, 0x65, 0x46, 0x44, 0x82, 0x07, 0xbf, 0x0d, 0x06, 0x7c, 0x39, 0x61, 0x16, 0x41, 0xaf, - 0xf5, 0x7e, 0x99, 0xb9, 0xb7, 0x52, 0x74, 0xe1, 0x48, 0x01, 0x0a, 0x9f, 0x07, 0x03, 0xb4, 0x1a, - 0x84, 0x58, 0x3a, 0x71, 0x36, 0x11, 0xaa, 0x30, 0xe2, 0x71, 0xa3, 0x30, 0x96, 0xa8, 0xe3, 0x04, - 0x24, 0x84, 0xe1, 0xf7, 0x0d, 0x90, 0x97, 0xc7, 0x05, 0x35, 0x87, 0x78, 0x78, 0xbe, 0xde, 0x7b, - 0xbb, 0x65, 0xd9, 0x9b, 0xae, 0x99, 0x24, 0x50, 0xa4, 0xc0, 0xe1, 0x77, 0x0d, 0x00, 0xaa, 0xea, - 0xec, 0x32, 0x87, 0xb9, 0x0f, 0x7b, 0xb6, 0x55, 0xb4, 0x53, 0x51, 0x04, 0x42, 0x5a, 0x2a, 0x69, - 0xa8, 0xb0, 0x02, 0xa6, 0x42, 0x82, 0xb9, 0xee, 0xbb, 0xfe, 0xbe, 0x1f, 0x1c, 0xf8, 0x37, 0x1d, - 0xec, 0xda, 0xd4, 0x04, 0x73, 0xc6, 0x7c, 0xbe, 0x7c, 0x45, 0xda, 0x3f, 0xb5, 0xd5, 0x49, 0x08, - 0x75, 0x1e, 0x5b, 0x7c, 0xaf, 0x2f, 0x5b, 0x6b, 0x65, 0xcf, 0x0b, 0xf8, 0x81, 0x98, 0xbc, 0xc8, - 0xc3, 0xd4, 0x34, 0xf8, 0x42, 0xbc, 0xd9, 0xfb, 0x85, 0x50, 0xb9, 0x3e, 0x3d, 0xa4, 0x15, 0x89, - 0x22, 0xcd, 0x04, 0xf8, 0x53, 0x03, 0x8c, 0x59, 0xd5, 0x2a, 0x0e, 0x23, 0x6c, 0x8b, 0x6d, 0x9c, - 0x3b, 0xdb, 0xa8, 0x9e, 0x92, 0x06, 0x8d, 0x2d, 0xe9, 0xa8, 0xa8, 0xd5, 0x08, 0xf8, 0x12, 0x38, - 0x4f, 0xa3, 0x80, 0x60, 0x3b, 0x89, 0x20, 0x99, 0x5d, 0x60, 0xb3, 0x51, 0x38, 0x5f, 0x69, 0xe1, - 0xa0, 0x8c, 0x64, 0xf1, 0x93, 0x01, 0x50, 0x78, 0x48, 0x84, 0x3e, 0x42, 0xd1, 0x7b, 0x0d, 0x0c, - 0xf2, 0x99, 0xda, 0xdc, 0x21, 0x79, 0xed, 0xa8, 0xe7, 0x54, 0x24, 0xb9, 0xec, 0x78, 0x62, 0xf8, - 0xec, 0x78, 0xea, 0xe3, 0x82, 0xea, 0x78, 0xaa, 0x08, 0x32, 0x4a, 0xf8, 0x70, 0x11, 0x00, 0x1b, - 0x87, 0x04, 0xb3, 0x8c, 0x64, 0x9b, 0x43, 0x5c, 0x5a, 0xad, 0xcf, 0x8a, 0xe2, 0x20, 0x4d, 0x0a, - 0xde, 0x04, 0x30, 0xf9, 0xe7, 0x04, 0xfe, 0x6b, 0x16, 0xf1, 0x1d, 0xbf, 0x66, 0xe6, 0xb9, 0xd9, - 0xd3, 0xec, 0xb4, 0x5d, 0x69, 0xe3, 0xa2, 0x0e, 0x23, 0x60, 0x1d, 0x0c, 0x8a, 0x6b, 0x34, 0xcf, - 0x1b, 0x3d, 0xdc, 0x71, 0xf7, 0x2c, 0xd7, 0xb1, 0x39, 0x54, 0x19, 0x70, 0xf7, 0x70, 0x14, 0x24, - 0xd1, 0xe0, 0xfb, 0x06, 0x18, 0xa5, 0xf1, 0x0e, 0x91, 0xd2, 0x94, 0x67, 0xf5, 0x91, 0xc5, 0x3b, - 0xbd, 0x82, 0xaf, 0x68, 0xba, 0xcb, 0x13, 0xcd, 0x46, 0x61, 0x54, 0xa7, 0xa0, 0x16, 0x6c, 0xf8, - 0x07, 0x03, 0x98, 0x96, 0x2d, 0x42, 0xdf, 0x72, 0xb7, 0x88, 0xe3, 0x47, 0x98, 0x88, 0x0b, 0x91, - 0x38, 0x3e, 0x7a, 0x58, 0x2b, 0x66, 0xef, 0x59, 0xe5, 0x39, 0xb9, 0xd2, 0xe6, 0x52, 0x17, 0x0b, - 0x50, 0x57, 0xdb, 0x8a, 0xff, 0x36, 0xb2, 0xa9, 0x45, 0x9b, 0x65, 0xa5, 0x6a, 0xb9, 0x18, 0xae, - 0x80, 0x09, 0x56, 0xfd, 0x22, 0x1c, 0xba, 0x4e, 0xd5, 0xa2, 0xfc, 0xf6, 0x23, 0xa2, 0x5b, 0x5d, - 0xc3, 0x2b, 0x19, 0x3e, 0x6a, 0x1b, 0x01, 0x5f, 0x05, 0x50, 0x94, 0x85, 0x2d, 0x7a, 0x44, 0x25, - 0xa0, 0x0a, 0xbc, 0x4a, 0x9b, 0x04, 0xea, 0x30, 0x0a, 0x2e, 0x83, 0x49, 0xd7, 0xda, 0xc1, 0x6e, - 0x05, 0xbb, 0xb8, 0x1a, 0x05, 0x84, 0xab, 0x12, 0xf7, 0xc3, 0xa9, 0x66, 0xa3, 0x30, 0xb9, 0x9e, - 0x65, 0xa2, 0x76, 0xf9, 0xe2, 0xd5, 0xec, 0x5e, 0xd6, 0x27, 0x2e, 0x8a, 0xed, 0x0f, 0x73, 0x60, - 0xa6, 0x7b, 0x50, 0xc0, 0xef, 0xa8, 0xd2, 0x58, 0x54, 0x7c, 0xaf, 0x9f, 0x41, 0xe8, 0xc9, 0xeb, - 0x00, 0x68, 0xbf, 0x0a, 0xc0, 0x23, 0x76, 0x5e, 0x5b, 0x6e, 0x72, 0xed, 0xdf, 0x3e, 0x0b, 0x74, - 0xa6, 0xbf, 0x3c, 0x2c, 0xaa, 0x00, 0xcb, 0xe5, 0x87, 0xbe, 0xe5, 0xe2, 0xe2, 0x47, 0x6d, 0x57, - 0xdb, 0x74, 0xb3, 0xc2, 0x1f, 0x18, 0x60, 0x3c, 0x08, 0xb1, 0xbf, 0xb4, 0xb5, 0x76, 0xef, 0xcb, - 0x62, 0xd3, 0x4a, 0x07, 0xad, 0x9d, 0xdc, 0x44, 0x76, 0xbf, 0x16, 0xba, 0xb6, 0x48, 0x10, 0xd2, - 0xf2, 0x85, 0x66, 0xa3, 0x30, 0xbe, 0xd9, 0x8a, 0x82, 0xb2, 0xb0, 0x45, 0x0f, 0x4c, 0xad, 0x1e, - 0x46, 0x98, 0xf8, 0x96, 0xbb, 0x12, 0x54, 0x63, 0x0f, 0xfb, 0x91, 0xb0, 0x31, 0xd3, 0x2e, 0x30, - 0x1e, 0xb1, 0x5d, 0x70, 0x05, 0xf4, 0xc5, 0xc4, 0x95, 0x51, 0x3b, 0xa2, 0x9a, 0x60, 0x68, 0x1d, - 0x31, 0x7a, 0xf1, 0x2a, 0xe8, 0x67, 0x76, 0xc2, 0x4b, 0xa0, 0x8f, 0x58, 0x07, 0x5c, 0xeb, 0x68, - 0x79, 0x88, 0x89, 0x20, 0xeb, 0x00, 0x31, 0x5a, 0xf1, 0xef, 0x73, 0x60, 0x3c, 0x33, 0x17, 0x38, - 0x03, 0x72, 0xaa, 0xb3, 0x06, 0xa4, 0xd2, 0xdc, 0xda, 0x0a, 0xca, 0x39, 0x36, 0x7c, 0x51, 0x65, - 0x57, 0x01, 0x5a, 0x50, 0x87, 0x05, 0xa7, 0xb2, 0xb2, 0x2c, 0x55, 0xc7, 0x0c, 0x49, 0xd2, 0x23, - 0xb3, 0x01, 0xef, 0xca, 0x5d, 0x21, 0x6c, 0xc0, 0xbb, 0x88, 0xd1, 0x4e, 0xda, 0x2b, 0x49, 0x9a, - 0x35, 0x03, 0x8f, 0xd0, 0xac, 0x19, 0x7c, 0x60, 0xb3, 0xe6, 0x71, 0x30, 0x10, 0x39, 0x91, 0x8b, - 0xf9, 0x49, 0xa5, 0x15, 0xc3, 0x77, 0x18, 0x11, 0x09, 0x1e, 0xc4, 0x60, 0xc8, 0xc6, 0xbb, 0x56, - 0xec, 0x46, 0xfc, 0x50, 0x1a, 0x59, 0xfc, 0xfa, 0xe9, 0xa2, 0x47, 0x34, 0x33, 0x56, 0x84, 0x4a, - 0x94, 0xe8, 0x86, 0x4f, 0x80, 0x21, 0xcf, 0x3a, 0x74, 0xbc, 0xd8, 0xe3, 0x15, 0xa3, 0x21, 0xc4, - 0x36, 0x04, 0x09, 0x25, 0x3c, 0x96, 0x04, 0xf1, 0x61, 0xd5, 0x8d, 0xa9, 0x53, 0xc7, 0x92, 0x29, - 0x4b, 0x3a, 0x95, 0x04, 0x57, 0x33, 0x7c, 0xd4, 0x36, 0x82, 0x83, 0x39, 0x3e, 0x1f, 0x3c, 0xa2, - 0x81, 0x09, 0x12, 0x4a, 0x78, 0xad, 0x60, 0x52, 0x7e, 0xb4, 0x1b, 0x98, 0x1c, 0xdc, 0x36, 0x02, - 0x3e, 0x0d, 0x86, 0x3d, 0xeb, 0x70, 0x1d, 0xfb, 0xb5, 0x68, 0xcf, 0x1c, 0x9b, 0x33, 0xe6, 0xfb, - 0xca, 0x63, 0xcd, 0x46, 0x61, 0x78, 0x23, 0x21, 0xa2, 0x94, 0xcf, 0x85, 0x1d, 0x5f, 0x0a, 0x9f, - 0xd7, 0x84, 0x13, 0x22, 0x4a, 0xf9, 0xac, 0x32, 0x09, 0xad, 0x88, 0xed, 0x2b, 0x73, 0xbc, 0xf5, - 0xe2, 0xbc, 0x25, 0xc8, 0x28, 0xe1, 0xc3, 0x79, 0x90, 0xf7, 0xac, 0x43, 0x7e, 0xa7, 0x34, 0x27, - 0xb8, 0x5a, 0xde, 0x50, 0xdc, 0x90, 0x34, 0xa4, 0xb8, 0x5c, 0xd2, 0xf1, 0x85, 0xe4, 0xa4, 0x26, - 0x29, 0x69, 0x48, 0x71, 0x59, 0xfc, 0xc6, 0xbe, 0x73, 0x3f, 0xc6, 0x42, 0x18, 0x72, 0xcf, 0xa8, - 0xf8, 0xbd, 0x9b, 0xb2, 0x90, 0x2e, 0xc7, 0xee, 0x74, 0x5e, 0xec, 0x46, 0x4e, 0xe8, 0xe2, 0xcd, - 0x5d, 0xf3, 0x02, 0xf7, 0x3f, 0x2f, 0xe5, 0x37, 0x14, 0x15, 0x69, 0x12, 0xf0, 0x6d, 0xd0, 0x8f, - 0xfd, 0xd8, 0x33, 0x2f, 0xf2, 0xe3, 0xfb, 0xb4, 0xd1, 0xa7, 0xf6, 0xcb, 0xaa, 0x1f, 0x7b, 0x88, - 0x6b, 0x86, 0x2f, 0x82, 0x31, 0xcf, 0x3a, 0x64, 0x49, 0x00, 0x93, 0x88, 0x5d, 0x34, 0xa7, 0xf8, - 0xbc, 0x27, 0x59, 0x11, 0xbb, 0xa1, 0x33, 0x50, 0xab, 0x1c, 0x1f, 0xe8, 0xf8, 0xda, 0xc0, 0x69, - 0x6d, 0xa0, 0xce, 0x40, 0xad, 0x72, 0xcc, 0xc9, 0x04, 0xdf, 0x8f, 0x1d, 0x82, 0x6d, 0xf3, 0xff, - 0x78, 0xdd, 0x2b, 0xfb, 0xbb, 0x82, 0x86, 0x14, 0x17, 0xde, 0x4f, 0x5a, 0x0e, 0x26, 0xdf, 0x7c, - 0x5b, 0x3d, 0x4b, 0xdd, 0x9b, 0x64, 0x89, 0x10, 0xeb, 0x48, 0x9c, 0x2a, 0x7a, 0xb3, 0x01, 0xfa, - 0x60, 0xc0, 0x72, 0xdd, 0xcd, 0x5d, 0xf3, 0x12, 0xf7, 0x78, 0x0f, 0x4f, 0x0b, 0x95, 0x61, 0x96, - 0x98, 0x7e, 0x24, 0x60, 0x18, 0x5e, 0xe0, 0xb3, 0x58, 0x98, 0x39, 0x33, 0xbc, 0x4d, 0xa6, 0x1f, - 0x09, 0x18, 0x3e, 0x3f, 0xff, 0x68, 0x73, 0xd7, 0x7c, 0xec, 0xec, 0xe6, 0xc7, 0xf4, 0x23, 0x01, - 0x03, 0x6d, 0xd0, 0xe7, 0x07, 0x91, 0x79, 0xb9, 0xd7, 0x67, 0x2f, 0x3f, 0x4d, 0x6e, 0x07, 0x11, - 0x62, 0xea, 0xe1, 0x8f, 0x0c, 0x00, 0xc2, 0x34, 0x12, 0xaf, 0x9c, 0xb6, 0x05, 0x90, 0x41, 0x2b, - 0xa5, 0xd1, 0xbb, 0xea, 0x47, 0xe4, 0x28, 0xbd, 0xd7, 0x68, 0x51, 0xae, 0x19, 0x00, 0x7f, 0x6e, - 0x80, 0x8b, 0x7a, 0xb9, 0xab, 0x2c, 0x9b, 0xe5, 0x7e, 0xd8, 0xec, 0x61, 0x20, 0x97, 0x83, 0xc0, - 0x2d, 0x9b, 0xcd, 0x46, 0xe1, 0xe2, 0x52, 0x07, 0x40, 0xd4, 0xd1, 0x0c, 0xf8, 0x1b, 0x03, 0x4c, - 0xca, 0xec, 0xa8, 0x19, 0x57, 0xe0, 0x6e, 0x7b, 0xbb, 0x87, 0x6e, 0xcb, 0x42, 0x08, 0xef, 0xa9, - 0x57, 0xc6, 0x36, 0x3e, 0x6a, 0xb7, 0x0a, 0xfe, 0xde, 0x00, 0xa3, 0x36, 0x0e, 0xb1, 0x6f, 0x63, - 0xbf, 0xca, 0xcc, 0x9c, 0x3b, 0x6d, 0x5f, 0x21, 0x6b, 0xe6, 0x8a, 0xa6, 0x5d, 0x58, 0x58, 0x92, - 0x16, 0x8e, 0xea, 0xac, 0xe3, 0x46, 0x61, 0x3a, 0x1d, 0xaa, 0x73, 0x50, 0x8b, 0x81, 0xf0, 0xc7, - 0x06, 0x18, 0x4f, 0xdd, 0x2e, 0x0e, 0x88, 0xab, 0x67, 0xb3, 0xf0, 0xbc, 0x04, 0x5d, 0x6a, 0xc5, - 0x42, 0x59, 0x70, 0xf8, 0x5b, 0x83, 0x55, 0x5b, 0xc9, 0x5d, 0x8d, 0x9a, 0x45, 0xee, 0xc1, 0x37, - 0x7a, 0xe9, 0x41, 0xa5, 0x5c, 0x38, 0xf0, 0x7a, 0x5a, 0xc9, 0x29, 0xce, 0x71, 0xa3, 0x30, 0xa5, - 0xfb, 0x4f, 0x31, 0x90, 0x6e, 0x1c, 0x7c, 0xcf, 0x00, 0xa3, 0x38, 0x2d, 0x98, 0xa9, 0xf9, 0xf8, - 0x69, 0x5d, 0xd7, 0xb1, 0xfc, 0x16, 0xd7, 0x69, 0x8d, 0x45, 0x51, 0x0b, 0x2c, 0xab, 0xfd, 0xf0, - 0xa1, 0xe5, 0x85, 0x2e, 0x36, 0xff, 0xbf, 0x77, 0xb5, 0xdf, 0xaa, 0x50, 0x89, 0x12, 0xdd, 0xf0, - 0x3a, 0xc8, 0xfb, 0xb1, 0xeb, 0x5a, 0x3b, 0x2e, 0x36, 0x9f, 0xe0, 0x55, 0x84, 0xea, 0x2f, 0xde, - 0x96, 0x74, 0xa4, 0x24, 0xe0, 0x2e, 0x98, 0x3b, 0xbc, 0xa5, 0x3e, 0xbe, 0xe8, 0xd8, 0xc0, 0x33, - 0xaf, 0x71, 0x2d, 0x33, 0xcd, 0x46, 0x61, 0x7a, 0xbb, 0x73, 0x8b, 0xef, 0xa1, 0x3a, 0xe0, 0x9b, - 0xe0, 0x31, 0x4d, 0x66, 0xd5, 0xdb, 0xc1, 0xb6, 0x8d, 0xed, 0xe4, 0xa2, 0x65, 0x7e, 0x89, 0x43, - 0xa8, 0x7d, 0xbc, 0x9d, 0x15, 0x40, 0x0f, 0x1a, 0x0d, 0xd7, 0xc1, 0xb4, 0xc6, 0x5e, 0xf3, 0xa3, - 0x4d, 0x52, 0x89, 0x88, 0xe3, 0xd7, 0xcc, 0x79, 0xae, 0xf7, 0x62, 0xb2, 0xfb, 0xb6, 0x35, 0x1e, - 0xea, 0x32, 0x06, 0xbe, 0xd2, 0xa2, 0x8d, 0x3f, 0x5c, 0x58, 0xe1, 0x2d, 0x7c, 0x44, 0xcd, 0x27, - 0x79, 0x71, 0xc1, 0xd7, 0x79, 0x5b, 0xa3, 0xa3, 0x2e, 0xf2, 0xf0, 0x1b, 0xe0, 0x42, 0x86, 0xc3, - 0xee, 0x15, 0xe6, 0x53, 0xe2, 0x82, 0xc0, 0x2a, 0xd1, 0xed, 0x84, 0x88, 0x3a, 0x49, 0xc2, 0xaf, - 0x01, 0xa8, 0x91, 0x37, 0xac, 0x90, 0x8f, 0x7f, 0x5a, 0xdc, 0x55, 0xd8, 0x8a, 0x6e, 0x4b, 0x1a, - 0xea, 0x20, 0x07, 0x3f, 0x34, 0x5a, 0x66, 0x92, 0xde, 0x66, 0xa9, 0x79, 0x9d, 0x6f, 0xd8, 0x57, - 0x4e, 0x1e, 0x80, 0xa9, 0x32, 0x14, 0xbb, 0x58, 0xf3, 0xb0, 0x86, 0x82, 0xba, 0xa0, 0xcf, 0xb0, - 0xcb, 0x74, 0x26, 0x87, 0xc3, 0x09, 0xd0, 0xb7, 0x8f, 0xe5, 0xb3, 0x31, 0x62, 0x3f, 0xe1, 0x5b, - 0x60, 0xa0, 0x6e, 0xb9, 0x71, 0xd2, 0x0a, 0xe8, 0xdd, 0x59, 0x8f, 0x84, 0xde, 0x97, 0x72, 0x37, - 0x8c, 0x99, 0x0f, 0x0c, 0x30, 0xdd, 0xf9, 0x54, 0xf9, 0xa2, 0x2c, 0xfa, 0x99, 0x01, 0x26, 0xdb, - 0x0e, 0x90, 0x0e, 0xc6, 0xb8, 0xad, 0xc6, 0xdc, 0xeb, 0xe1, 0x49, 0x20, 0x36, 0x02, 0xaf, 0x68, - 0x75, 0xcb, 0x7e, 0x68, 0x80, 0x89, 0x6c, 0x62, 0xfe, 0x82, 0xbc, 0x54, 0x7c, 0x3f, 0x07, 0xa6, - 0x3b, 0xd7, 0xe0, 0xd0, 0x53, 0xdd, 0x85, 0x9e, 0x37, 0x68, 0x3a, 0xb5, 0x6c, 0xdf, 0x35, 0xc0, - 0xc8, 0x3b, 0x4a, 0x2e, 0x79, 0xcd, 0xec, 0x65, 0x57, 0x28, 0x39, 0xfa, 0x52, 0x06, 0x45, 0x3a, - 0x64, 0xf1, 0x77, 0x06, 0x98, 0xea, 0x78, 0x9c, 0xc3, 0x6b, 0x60, 0xd0, 0x72, 0xdd, 0xe0, 0x40, - 0x74, 0xf3, 0xb4, 0xb6, 0xfc, 0x12, 0xa7, 0x22, 0xc9, 0xd5, 0x7c, 0x96, 0xfb, 0x1c, 0x7c, 0x56, - 0xfc, 0xa3, 0x01, 0x2e, 0x3f, 0x28, 0xea, 0x3e, 0xef, 0x35, 0x9c, 0x07, 0x79, 0x59, 0x6c, 0x1f, - 0xf1, 0xf5, 0x93, 0xd9, 0x55, 0x66, 0x04, 0xfe, 0xb5, 0x8c, 0xf8, 0x55, 0xfc, 0xa5, 0x01, 0x26, - 0x2a, 0x98, 0xd4, 0x9d, 0x2a, 0x46, 0x78, 0x17, 0x13, 0xec, 0x57, 0x31, 0x5c, 0x00, 0xc3, 0xfc, - 0xb5, 0x31, 0xb4, 0xaa, 0xc9, 0x1b, 0xc9, 0xa4, 0x74, 0xf4, 0xf0, 0xed, 0x84, 0x81, 0x52, 0x19, - 0xf5, 0x9e, 0x92, 0xeb, 0xfa, 0x9e, 0x72, 0x19, 0xf4, 0x87, 0x69, 0x03, 0x38, 0xcf, 0xb8, 0xbc, - 0xe7, 0xcb, 0xa9, 0x9c, 0x1b, 0x90, 0x88, 0x77, 0xb9, 0x06, 0x24, 0x37, 0x20, 0x11, 0xe2, 0xd4, - 0xe2, 0xaf, 0x0d, 0x70, 0xbe, 0x35, 0x3f, 0x33, 0x40, 0x12, 0xbb, 0x6d, 0x0f, 0x38, 0x8c, 0x87, - 0x38, 0x47, 0xff, 0x6e, 0x20, 0xf7, 0xe0, 0xef, 0x06, 0xe0, 0xcb, 0x60, 0x52, 0xfe, 0x5c, 0x3d, - 0x0c, 0x09, 0xa6, 0xfc, 0x65, 0xb2, 0xaf, 0xf5, 0x7b, 0xbf, 0x8d, 0xac, 0x00, 0x6a, 0x1f, 0x53, - 0xfc, 0x93, 0x01, 0x2e, 0x24, 0xdf, 0xe7, 0xb8, 0x0e, 0xf6, 0xa3, 0xe5, 0xc0, 0xdf, 0x75, 0x6a, - 0xf0, 0x92, 0xe8, 0x48, 0x6a, 0x6d, 0xbe, 0xa4, 0x1b, 0x09, 0xef, 0x83, 0x21, 0x2a, 0xdc, 0x2f, - 0x23, 0xe3, 0xd5, 0x93, 0x47, 0x46, 0x76, 0x1d, 0x45, 0x41, 0x95, 0x50, 0x13, 0x1c, 0x16, 0x1c, - 0x55, 0xab, 0x1c, 0xfb, 0xb6, 0xec, 0x4a, 0x8f, 0x8a, 0xe0, 0x58, 0x5e, 0x12, 0x34, 0xa4, 0xb8, - 0xc5, 0x7f, 0x18, 0x60, 0xb2, 0xed, 0x7b, 0x23, 0xf8, 0x3d, 0x03, 0x8c, 0x56, 0xb5, 0xe9, 0xc9, - 0x2d, 0xb6, 0x71, 0xfa, 0x6f, 0x9a, 0x34, 0xa5, 0xa2, 0x2a, 0xd1, 0x29, 0xa8, 0x05, 0x14, 0x6e, - 0x03, 0xb3, 0x9a, 0xf9, 0xb4, 0x2f, 0xf3, 0x58, 0x78, 0xb9, 0xd9, 0x28, 0x98, 0xcb, 0x5d, 0x64, - 0x50, 0xd7, 0xd1, 0xe5, 0x6f, 0x7d, 0xfc, 0xd9, 0xec, 0xb9, 0x4f, 0x3e, 0x9b, 0x3d, 0xf7, 0xe9, - 0x67, 0xb3, 0xe7, 0xde, 0x6d, 0xce, 0x1a, 0x1f, 0x37, 0x67, 0x8d, 0x4f, 0x9a, 0xb3, 0xc6, 0xa7, - 0xcd, 0x59, 0xe3, 0xaf, 0xcd, 0x59, 0xe3, 0x27, 0x7f, 0x9b, 0x3d, 0xf7, 0xc6, 0x8d, 0x93, 0x7e, - 0xd0, 0xfb, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x41, 0x66, 0xfd, 0x82, 0x24, 0x2c, 0x00, 0x00, + // 3111 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdd, 0x6f, 0x5c, 0x47, + 0x15, 0xcf, 0x5d, 0x7b, 0xed, 0xf5, 0xd8, 0x89, 0xed, 0x49, 0x6c, 0x6e, 0xdc, 0xc4, 0xeb, 0x6c, + 0x68, 0x70, 0xdb, 0x74, 0xdd, 0x9a, 0x96, 0x86, 0x82, 0x40, 0x5e, 0xdb, 0x69, 0xdd, 0xd8, 0xb1, + 0x35, 0x9b, 0xa4, 0x6e, 0x8b, 0x68, 0xaf, 0xf7, 0x8e, 0xd7, 0xb7, 0xbe, 0x5f, 0x99, 0xb9, 0xd7, + 0x1f, 0x12, 0x48, 0x15, 0xa8, 0x02, 0x2a, 0x41, 0x79, 0xa8, 0xca, 0x13, 0x42, 0x08, 0xf5, 0x01, + 0x1e, 0xe0, 0x0d, 0xfe, 0x85, 0xbe, 0x20, 0xf5, 0x09, 0x55, 0x42, 0x5a, 0xd1, 0xe5, 0x1f, 0x40, + 0x02, 0x84, 0xf0, 0x03, 0x42, 0xf3, 0x71, 0xe7, 0xce, 0xde, 0xdd, 0x4d, 0x22, 0x7b, 0xdd, 0xbe, + 0xed, 0x9e, 0x73, 0xe6, 0xfc, 0xce, 0x9c, 0x39, 0x73, 0xe6, 0xcc, 0xb9, 0x03, 0xac, 0xdd, 0x1b, + 0xb4, 0xec, 0x04, 0x73, 0xbb, 0xf1, 0x16, 0x26, 0x3e, 0x8e, 0x30, 0x9d, 0xdb, 0xc3, 0xbe, 0x1d, + 0x90, 0x39, 0xc9, 0xb0, 0x42, 0x07, 0x1f, 0x44, 0xd8, 0xa7, 0x4e, 0xe0, 0xd3, 0xa7, 0xad, 0xd0, + 0xa1, 0x98, 0xec, 0x61, 0x32, 0x17, 0xee, 0xd6, 0x19, 0x8f, 0xb6, 0x0a, 0xcc, 0xed, 0x3d, 0x3b, + 0x57, 0xc7, 0x3e, 0x26, 0x56, 0x84, 0xed, 0x72, 0x48, 0x82, 0x28, 0x80, 0x37, 0x84, 0xa6, 0x72, + 0x8b, 0xe0, 0x9b, 0x4a, 0x53, 0x39, 0xdc, 0xad, 0x33, 0x1e, 0x6d, 0x15, 0x28, 0xef, 0x3d, 0x3b, + 0xf5, 0x74, 0xdd, 0x89, 0x76, 0xe2, 0xad, 0x72, 0x2d, 0xf0, 0xe6, 0xea, 0x41, 0x3d, 0x98, 0xe3, + 0x0a, 0xb7, 0xe2, 0x6d, 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x04, 0xd0, 0xd4, 0x73, 0xa9, 0xc9, 0x9e, + 0x55, 0xdb, 0x71, 0x7c, 0x4c, 0x0e, 0x53, 0x3b, 0x3d, 0x1c, 0x59, 0x1d, 0xcc, 0x9b, 0x9a, 0xeb, + 0x36, 0x8a, 0xc4, 0x7e, 0xe4, 0x78, 0xb8, 0x6d, 0xc0, 0xd7, 0x1e, 0x36, 0x80, 0xd6, 0x76, 0xb0, + 0x67, 0x65, 0xc7, 0x95, 0x8e, 0x0c, 0x30, 0xbe, 0x18, 0xf8, 0x7b, 0x98, 0xb0, 0x09, 0x22, 0x7c, + 0x3f, 0xc6, 0x34, 0x82, 0x15, 0xd0, 0x17, 0x3b, 0xb6, 0x69, 0xcc, 0x18, 0xb3, 0x43, 0x95, 0x67, + 0x3e, 0x6e, 0x14, 0xcf, 0x34, 0x1b, 0xc5, 0xbe, 0xbb, 0x2b, 0x4b, 0x47, 0x8d, 0xe2, 0x95, 0x6e, + 0x48, 0xd1, 0x61, 0x88, 0x69, 0xf9, 0xee, 0xca, 0x12, 0x62, 0x83, 0xe1, 0x4b, 0x60, 0xdc, 0xc6, + 0xd4, 0x21, 0xd8, 0x5e, 0xd8, 0x58, 0xb9, 0x27, 0xf4, 0x9b, 0x39, 0xae, 0xf1, 0xa2, 0xd4, 0x38, + 0xbe, 0x94, 0x15, 0x40, 0xed, 0x63, 0xe0, 0x26, 0x18, 0x0c, 0xb6, 0xde, 0xc6, 0xb5, 0x88, 0x9a, + 0x7d, 0x33, 0x7d, 0xb3, 0xc3, 0xf3, 0x4f, 0x97, 0xd3, 0xc5, 0x53, 0x26, 0xf0, 0x15, 0x93, 0x93, + 0x2d, 0x23, 0x6b, 0x7f, 0x39, 0x59, 0xb4, 0xca, 0xa8, 0x44, 0x1b, 0x5c, 0x17, 0x5a, 0x50, 0xa2, + 0xae, 0xf4, 0x9b, 0x1c, 0x80, 0xfa, 0xe4, 0x69, 0x18, 0xf8, 0x14, 0xf7, 0x64, 0xf6, 0x14, 0x8c, + 0xd5, 0xb8, 0xe6, 0x08, 0xdb, 0x12, 0xd7, 0xcc, 0x1d, 0xc7, 0x7a, 0x53, 0xe2, 0x8f, 0x2d, 0x66, + 0xd4, 0xa1, 0x36, 0x00, 0x78, 0x07, 0x0c, 0x10, 0x4c, 0x63, 0x37, 0x32, 0xfb, 0x66, 0x8c, 0xd9, + 0xe1, 0xf9, 0xeb, 0x5d, 0xa1, 0x78, 0x68, 0xb3, 0xe0, 0x2b, 0xef, 0x3d, 0x5b, 0xae, 0x46, 0x56, + 0x14, 0xd3, 0xca, 0x39, 0x89, 0x34, 0x80, 0xb8, 0x0e, 0x24, 0x75, 0x95, 0xfe, 0x67, 0x80, 0x31, + 0xdd, 0x4b, 0x7b, 0x0e, 0xde, 0x87, 0x04, 0x0c, 0x12, 0x11, 0x2c, 0xdc, 0x4f, 0xc3, 0xf3, 0xb7, + 0xca, 0xc7, 0xdd, 0x51, 0xe5, 0xb6, 0xf8, 0xab, 0x0c, 0xb3, 0xe5, 0x92, 0x7f, 0x50, 0x02, 0x04, + 0xf7, 0x40, 0x81, 0xc8, 0x35, 0xe2, 0x81, 0x34, 0x3c, 0xbf, 0xda, 0x1b, 0x50, 0xa1, 0xb3, 0x32, + 0xd2, 0x6c, 0x14, 0x0b, 0xc9, 0x3f, 0xa4, 0xb0, 0x4a, 0xbf, 0xca, 0x81, 0xe9, 0xc5, 0x98, 0x46, + 0x81, 0x87, 0x30, 0x0d, 0x62, 0x52, 0xc3, 0x8b, 0x81, 0x1b, 0x7b, 0xfe, 0x12, 0xde, 0x76, 0x7c, + 0x27, 0x62, 0x31, 0x3a, 0x03, 0xfa, 0x7d, 0xcb, 0xc3, 0x32, 0x66, 0x46, 0xa4, 0x27, 0xfb, 0x6f, + 0x5b, 0x1e, 0x46, 0x9c, 0xc3, 0x24, 0x58, 0x88, 0xc8, 0x1d, 0xa0, 0x24, 0xee, 0x1c, 0x86, 0x18, + 0x71, 0x0e, 0xbc, 0x06, 0x06, 0xb6, 0x03, 0xe2, 0x59, 0x62, 0xf5, 0x86, 0xd2, 0xf5, 0xb8, 0xc9, + 0xa9, 0x48, 0x72, 0xe1, 0xf3, 0x60, 0xd8, 0xc6, 0xb4, 0x46, 0x9c, 0x90, 0x41, 0x9b, 0xfd, 0x5c, + 0xf8, 0xbc, 0x14, 0x1e, 0x5e, 0x4a, 0x59, 0x48, 0x97, 0x83, 0xd7, 0x41, 0x21, 0x24, 0x4e, 0x40, + 0x9c, 0xe8, 0xd0, 0xcc, 0xcf, 0x18, 0xb3, 0xf9, 0xca, 0x98, 0x1c, 0x53, 0xd8, 0x90, 0x74, 0xa4, + 0x24, 0x98, 0xf4, 0xdb, 0x34, 0xf0, 0x37, 0xac, 0x68, 0xc7, 0x1c, 0xe0, 0x08, 0x4a, 0xfa, 0x95, + 0xea, 0xfa, 0x6d, 0x46, 0x47, 0x4a, 0xa2, 0xf4, 0x17, 0x03, 0x98, 0x59, 0x0f, 0x25, 0xee, 0x85, + 0x37, 0x41, 0x81, 0x46, 0x2c, 0xe7, 0xd4, 0x0f, 0xa5, 0x7f, 0x9e, 0x4c, 0x54, 0x55, 0x25, 0xfd, + 0xa8, 0x51, 0x9c, 0x4c, 0x47, 0x24, 0x54, 0xee, 0x1b, 0x35, 0x96, 0x85, 0xdc, 0x3e, 0xde, 0xda, + 0x09, 0x82, 0x5d, 0xb9, 0xfa, 0x27, 0x08, 0xb9, 0x57, 0x85, 0xa2, 0x14, 0x53, 0x84, 0x9c, 0x24, + 0xa3, 0x04, 0xa8, 0xf4, 0xdf, 0x5c, 0x76, 0x62, 0xda, 0xa2, 0xbf, 0x05, 0x0a, 0x6c, 0x0b, 0xd9, + 0x56, 0x64, 0xc9, 0x4d, 0xf0, 0xcc, 0xa3, 0x6d, 0x38, 0xb1, 0x5f, 0xd7, 0x70, 0x64, 0x55, 0xa0, + 0x74, 0x05, 0x48, 0x69, 0x48, 0x69, 0x85, 0x07, 0xa0, 0x9f, 0x86, 0xb8, 0x26, 0xe7, 0x7b, 0xef, + 0x04, 0xd1, 0xde, 0x65, 0x0e, 0xd5, 0x10, 0xd7, 0xd2, 0x60, 0x64, 0xff, 0x10, 0x47, 0x84, 0xef, + 0x18, 0x60, 0x80, 0xf2, 0xbc, 0x20, 0x73, 0xc9, 0xe6, 0x29, 0x80, 0x67, 0xf2, 0x8e, 0xf8, 0x8f, + 0x24, 0x6e, 0xe9, 0x5f, 0x39, 0x70, 0xa5, 0xdb, 0xd0, 0xc5, 0xc0, 0xb7, 0xc5, 0x22, 0xac, 0xc8, + 0x7d, 0x25, 0x22, 0xeb, 0x79, 0x7d, 0x5f, 0x1d, 0x35, 0x8a, 0x8f, 0x3f, 0x54, 0x81, 0xb6, 0x01, + 0xbf, 0xae, 0xa6, 0x2c, 0x36, 0xe9, 0x95, 0x56, 0xc3, 0x8e, 0x1a, 0xc5, 0x51, 0x35, 0xac, 0xd5, + 0x56, 0xb8, 0x07, 0xa0, 0x6b, 0xd1, 0xe8, 0x0e, 0xb1, 0x7c, 0x2a, 0xd4, 0x3a, 0x1e, 0x96, 0x9e, + 0x7b, 0xf2, 0xd1, 0x82, 0x82, 0x8d, 0xa8, 0x4c, 0x49, 0x48, 0xb8, 0xda, 0xa6, 0x0d, 0x75, 0x40, + 0x60, 0x39, 0x83, 0x60, 0x8b, 0xaa, 0x34, 0xa0, 0xe5, 0x70, 0x46, 0x45, 0x92, 0x0b, 0x9f, 0x00, + 0x83, 0x1e, 0xa6, 0xd4, 0xaa, 0x63, 0xbe, 0xf7, 0x87, 0xd2, 0x43, 0x71, 0x4d, 0x90, 0x51, 0xc2, + 0x2f, 0xfd, 0xdb, 0x00, 0x97, 0xba, 0x79, 0x6d, 0xd5, 0xa1, 0x11, 0xfc, 0x4e, 0x5b, 0xd8, 0x97, + 0x1f, 0x6d, 0x86, 0x6c, 0x34, 0x0f, 0x7a, 0x95, 0x4a, 0x12, 0x8a, 0x16, 0xf2, 0xfb, 0x20, 0xef, + 0x44, 0xd8, 0x4b, 0x4e, 0x4b, 0xd4, 0xfb, 0xb0, 0xab, 0x9c, 0x95, 0xf0, 0xf9, 0x15, 0x06, 0x84, + 0x04, 0x5e, 0xe9, 0xa3, 0x1c, 0xb8, 0xdc, 0x6d, 0x08, 0xcb, 0xe3, 0x94, 0x39, 0x3b, 0x74, 0x63, + 0x62, 0xb9, 0x32, 0xd8, 0x94, 0xb3, 0x37, 0x38, 0x15, 0x49, 0x2e, 0xcb, 0x9d, 0xd4, 0xf1, 0xeb, + 0xb1, 0x6b, 0x11, 0x19, 0x49, 0x6a, 0xc2, 0x55, 0x49, 0x47, 0x4a, 0x02, 0x96, 0x01, 0xa0, 0x3b, + 0x01, 0x89, 0x38, 0x06, 0xaf, 0x70, 0x86, 0x2a, 0xe7, 0x58, 0x46, 0xa8, 0x2a, 0x2a, 0xd2, 0x24, + 0xd8, 0x41, 0xb2, 0xeb, 0xf8, 0xb6, 0x5c, 0x70, 0xb5, 0x77, 0x6f, 0x39, 0xbe, 0x8d, 0x38, 0x87, + 0xe1, 0xbb, 0x0e, 0x8d, 0x18, 0x45, 0xae, 0x76, 0x8b, 0xc3, 0xb9, 0xa4, 0x92, 0x60, 0xf8, 0x35, + 0x96, 0x60, 0x03, 0xe2, 0x60, 0x6a, 0x0e, 0xa4, 0xf8, 0x8b, 0x8a, 0x8a, 0x34, 0x89, 0xd2, 0x5f, + 0xfb, 0xbb, 0xc7, 0x07, 0x4b, 0x20, 0xf0, 0x2a, 0xc8, 0xd7, 0x49, 0x10, 0x87, 0xd2, 0x4b, 0xca, + 0xdb, 0x2f, 0x31, 0x22, 0x12, 0x3c, 0xf8, 0x3d, 0x90, 0xf7, 0xe5, 0x84, 0x59, 0x04, 0xbd, 0xda, + 0xfb, 0x65, 0xe6, 0xde, 0x4a, 0xd1, 0x85, 0x23, 0x05, 0x28, 0x7c, 0x0e, 0xe4, 0x69, 0x2d, 0x08, + 0xb1, 0x74, 0xe2, 0x74, 0x22, 0x54, 0x65, 0xc4, 0xa3, 0x46, 0xf1, 0x6c, 0xa2, 0x8e, 0x13, 0x90, + 0x10, 0x86, 0x3f, 0x32, 0x40, 0x41, 0x1e, 0x17, 0xd4, 0x1c, 0xe4, 0xe1, 0xf9, 0x5a, 0xef, 0xed, + 0x96, 0x65, 0x6f, 0xba, 0x66, 0x92, 0x40, 0x91, 0x02, 0x87, 0x3f, 0x30, 0x00, 0xa8, 0xa9, 0xb3, + 0xcb, 0x1c, 0xe2, 0x3e, 0xec, 0xd9, 0x56, 0xd1, 0x4e, 0x45, 0x11, 0x08, 0x69, 0xa9, 0xa4, 0xa1, + 0xc2, 0x2a, 0x98, 0x08, 0x09, 0xe6, 0xba, 0xef, 0xfa, 0xbb, 0x7e, 0xb0, 0xef, 0xdf, 0x74, 0xb0, + 0x6b, 0x53, 0x13, 0xcc, 0x18, 0xb3, 0x85, 0xca, 0x65, 0x69, 0xff, 0xc4, 0x46, 0x27, 0x21, 0xd4, + 0x79, 0x6c, 0xe9, 0xdd, 0xbe, 0x6c, 0xad, 0x95, 0x3d, 0x2f, 0xe0, 0xfb, 0x62, 0xf2, 0x22, 0x0f, + 0x53, 0xd3, 0xe0, 0x0b, 0xf1, 0x46, 0xef, 0x17, 0x42, 0xe5, 0xfa, 0xf4, 0x90, 0x56, 0x24, 0x8a, + 0x34, 0x13, 0xe0, 0x07, 0x06, 0x38, 0x6b, 0xd5, 0x6a, 0x38, 0x8c, 0xb0, 0x2d, 0xb6, 0x71, 0xee, + 0x74, 0xa3, 0x7a, 0x42, 0x1a, 0x74, 0x76, 0x41, 0x47, 0x45, 0xad, 0x46, 0xc0, 0x17, 0xc1, 0x39, + 0x1a, 0x05, 0x04, 0xdb, 0x49, 0x04, 0xc9, 0xec, 0x02, 0x9b, 0x8d, 0xe2, 0xb9, 0x6a, 0x0b, 0x07, + 0x65, 0x24, 0x4b, 0x9f, 0xe4, 0x41, 0xf1, 0x21, 0x11, 0xfa, 0x08, 0x45, 0xef, 0x35, 0x30, 0xc0, + 0x67, 0x6a, 0x73, 0x87, 0x14, 0xb4, 0xa3, 0x9e, 0x53, 0x91, 0xe4, 0xb2, 0xe3, 0x89, 0xe1, 0xb3, + 0xe3, 0xa9, 0x8f, 0x0b, 0xaa, 0xe3, 0xa9, 0x2a, 0xc8, 0x28, 0xe1, 0xc3, 0x79, 0x00, 0x6c, 0x1c, + 0x12, 0xcc, 0x32, 0x92, 0x6d, 0x0e, 0x72, 0x69, 0xb5, 0x3e, 0x4b, 0x8a, 0x83, 0x34, 0x29, 0x78, + 0x13, 0xc0, 0xe4, 0x9f, 0x13, 0xf8, 0xaf, 0x5a, 0xc4, 0x77, 0xfc, 0xba, 0x59, 0xe0, 0x66, 0x4f, + 0xb2, 0xd3, 0x76, 0xa9, 0x8d, 0x8b, 0x3a, 0x8c, 0x80, 0x7b, 0x60, 0x40, 0x5c, 0xa3, 0x79, 0xde, + 0xe8, 0xe1, 0x8e, 0xbb, 0x67, 0xb9, 0x8e, 0xcd, 0xa1, 0x2a, 0x80, 0xbb, 0x87, 0xa3, 0x20, 0x89, + 0x06, 0xdf, 0x33, 0xc0, 0x08, 0x8d, 0xb7, 0x88, 0x94, 0xa6, 0x3c, 0xab, 0x0f, 0xcf, 0xdf, 0xe9, + 0x15, 0x7c, 0x55, 0xd3, 0x5d, 0x19, 0x6b, 0x36, 0x8a, 0x23, 0x3a, 0x05, 0xb5, 0x60, 0xc3, 0x3f, + 0x1a, 0xc0, 0xb4, 0x6c, 0x11, 0xfa, 0x96, 0xbb, 0x41, 0x1c, 0x3f, 0xc2, 0x44, 0x5c, 0x88, 0xc4, + 0xf1, 0xd1, 0xc3, 0x5a, 0x31, 0x7b, 0xcf, 0xaa, 0xcc, 0xc8, 0x95, 0x36, 0x17, 0xba, 0x58, 0x80, + 0xba, 0xda, 0x56, 0xfa, 0x8f, 0x91, 0x4d, 0x2d, 0xda, 0x2c, 0xab, 0x35, 0xcb, 0xc5, 0x70, 0x09, + 0x8c, 0xb1, 0xea, 0x17, 0xe1, 0xd0, 0x75, 0x6a, 0x16, 0xe5, 0xb7, 0x1f, 0x11, 0xdd, 0xea, 0x1a, + 0x5e, 0xcd, 0xf0, 0x51, 0xdb, 0x08, 0xf8, 0x0a, 0x80, 0xa2, 0x2c, 0x6c, 0xd1, 0x23, 0x2a, 0x01, + 0x55, 0xe0, 0x55, 0xdb, 0x24, 0x50, 0x87, 0x51, 0x70, 0x11, 0x8c, 0xbb, 0xd6, 0x16, 0x76, 0xab, + 0xd8, 0xc5, 0xb5, 0x28, 0x20, 0x5c, 0x95, 0xb8, 0x1f, 0x4e, 0x34, 0x1b, 0xc5, 0xf1, 0xd5, 0x2c, + 0x13, 0xb5, 0xcb, 0x97, 0xae, 0x64, 0xf7, 0xb2, 0x3e, 0x71, 0x51, 0x6c, 0x7f, 0x98, 0x03, 0x53, + 0xdd, 0x83, 0x02, 0x7e, 0x5f, 0x95, 0xc6, 0xa2, 0xe2, 0x7b, 0xed, 0x14, 0x42, 0x4f, 0x5e, 0x07, + 0x40, 0xfb, 0x55, 0x00, 0x1e, 0xb2, 0xf3, 0xda, 0x72, 0x93, 0x6b, 0xff, 0xe6, 0x69, 0xa0, 0x33, + 0xfd, 0x95, 0x21, 0x51, 0x05, 0x58, 0x2e, 0x3f, 0xf4, 0x2d, 0x17, 0x97, 0x3e, 0x6a, 0xbb, 0xda, + 0xa6, 0x9b, 0x15, 0xfe, 0xd8, 0x00, 0xa3, 0x41, 0x88, 0xfd, 0x85, 0x8d, 0x95, 0x7b, 0x5f, 0x15, + 0x9b, 0x56, 0x3a, 0x68, 0xe5, 0xf8, 0x26, 0xb2, 0xfb, 0xb5, 0xd0, 0xb5, 0x41, 0x82, 0x90, 0x56, + 0xce, 0x37, 0x1b, 0xc5, 0xd1, 0xf5, 0x56, 0x14, 0x94, 0x85, 0x2d, 0x79, 0x60, 0x62, 0xf9, 0x20, + 0xc2, 0xc4, 0xb7, 0xdc, 0xa5, 0xa0, 0x16, 0x7b, 0xd8, 0x8f, 0x84, 0x8d, 0x99, 0x76, 0x81, 0xf1, + 0x88, 0xed, 0x82, 0xcb, 0xa0, 0x2f, 0x26, 0xae, 0x8c, 0xda, 0x61, 0xd5, 0x04, 0x43, 0xab, 0x88, + 0xd1, 0x4b, 0x57, 0x40, 0x3f, 0xb3, 0x13, 0x5e, 0x04, 0x7d, 0xc4, 0xda, 0xe7, 0x5a, 0x47, 0x2a, + 0x83, 0x4c, 0x04, 0x59, 0xfb, 0x88, 0xd1, 0x4a, 0xff, 0x98, 0x01, 0xa3, 0x99, 0xb9, 0xc0, 0x29, + 0x90, 0x53, 0x9d, 0x35, 0x20, 0x95, 0xe6, 0x56, 0x96, 0x50, 0xce, 0xb1, 0xe1, 0x0b, 0x2a, 0xbb, + 0x0a, 0xd0, 0xa2, 0x3a, 0x2c, 0x38, 0x95, 0x95, 0x65, 0xa9, 0x3a, 0x66, 0x48, 0x92, 0x1e, 0x99, + 0x0d, 0x78, 0x5b, 0xee, 0x0a, 0x61, 0x03, 0xde, 0x46, 0x8c, 0x76, 0xdc, 0x5e, 0x49, 0xd2, 0xac, + 0xc9, 0x3f, 0x42, 0xb3, 0x66, 0xe0, 0x81, 0xcd, 0x9a, 0xab, 0x20, 0x1f, 0x39, 0x91, 0x8b, 0xf9, + 0x49, 0xa5, 0x15, 0xc3, 0x77, 0x18, 0x11, 0x09, 0x1e, 0xc4, 0x60, 0xd0, 0xc6, 0xdb, 0x56, 0xec, + 0x46, 0xfc, 0x50, 0x1a, 0x9e, 0xff, 0xd6, 0xc9, 0xa2, 0x47, 0x34, 0x33, 0x96, 0x84, 0x4a, 0x94, + 0xe8, 0x86, 0x8f, 0x83, 0x41, 0xcf, 0x3a, 0x70, 0xbc, 0xd8, 0xe3, 0x15, 0xa3, 0x21, 0xc4, 0xd6, + 0x04, 0x09, 0x25, 0x3c, 0x96, 0x04, 0xf1, 0x41, 0xcd, 0x8d, 0xa9, 0xb3, 0x87, 0x25, 0x53, 0x96, + 0x74, 0x2a, 0x09, 0x2e, 0x67, 0xf8, 0xa8, 0x6d, 0x04, 0x07, 0x73, 0x7c, 0x3e, 0x78, 0x58, 0x03, + 0x13, 0x24, 0x94, 0xf0, 0x5a, 0xc1, 0xa4, 0xfc, 0x48, 0x37, 0x30, 0x39, 0xb8, 0x6d, 0x04, 0x7c, + 0x0a, 0x0c, 0x79, 0xd6, 0xc1, 0x2a, 0xf6, 0xeb, 0xd1, 0x8e, 0x79, 0x76, 0xc6, 0x98, 0xed, 0xab, + 0x9c, 0x6d, 0x36, 0x8a, 0x43, 0x6b, 0x09, 0x11, 0xa5, 0x7c, 0x2e, 0xec, 0xf8, 0x52, 0xf8, 0x9c, + 0x26, 0x9c, 0x10, 0x51, 0xca, 0x67, 0x95, 0x49, 0x68, 0x45, 0x6c, 0x5f, 0x99, 0xa3, 0xad, 0x17, + 0xe7, 0x0d, 0x41, 0x46, 0x09, 0x1f, 0xce, 0x82, 0x82, 0x67, 0x1d, 0xf0, 0x3b, 0xa5, 0x39, 0xc6, + 0xd5, 0xf2, 0x86, 0xe2, 0x9a, 0xa4, 0x21, 0xc5, 0xe5, 0x92, 0x8e, 0x2f, 0x24, 0xc7, 0x35, 0x49, + 0x49, 0x43, 0x8a, 0xcb, 0xe2, 0x37, 0xf6, 0x9d, 0xfb, 0x31, 0x16, 0xc2, 0x90, 0x7b, 0x46, 0xc5, + 0xef, 0xdd, 0x94, 0x85, 0x74, 0x39, 0x76, 0xa7, 0xf3, 0x62, 0x37, 0x72, 0x42, 0x17, 0xaf, 0x6f, + 0x9b, 0xe7, 0xb9, 0xff, 0x79, 0x29, 0xbf, 0xa6, 0xa8, 0x48, 0x93, 0x80, 0x6f, 0x81, 0x7e, 0xec, + 0xc7, 0x9e, 0x79, 0x81, 0x1f, 0xdf, 0x27, 0x8d, 0x3e, 0xb5, 0x5f, 0x96, 0xfd, 0xd8, 0x43, 0x5c, + 0x33, 0x7c, 0x01, 0x9c, 0xf5, 0xac, 0x03, 0x96, 0x04, 0x30, 0x89, 0xd8, 0x45, 0x73, 0x82, 0xcf, + 0x7b, 0x9c, 0x15, 0xb1, 0x6b, 0x3a, 0x03, 0xb5, 0xca, 0xf1, 0x81, 0x8e, 0xaf, 0x0d, 0x9c, 0xd4, + 0x06, 0xea, 0x0c, 0xd4, 0x2a, 0xc7, 0x9c, 0x4c, 0xf0, 0xfd, 0xd8, 0x21, 0xd8, 0x36, 0xbf, 0xc4, + 0xeb, 0x5e, 0xd9, 0xdf, 0x15, 0x34, 0xa4, 0xb8, 0xf0, 0x7e, 0xd2, 0x72, 0x30, 0xf9, 0xe6, 0xdb, + 0xe8, 0x59, 0xea, 0x5e, 0x27, 0x0b, 0x84, 0x58, 0x87, 0xe2, 0x54, 0xd1, 0x9b, 0x0d, 0xd0, 0x07, + 0x79, 0xcb, 0x75, 0xd7, 0xb7, 0xcd, 0x8b, 0xdc, 0xe3, 0x3d, 0x3c, 0x2d, 0x54, 0x86, 0x59, 0x60, + 0xfa, 0x91, 0x80, 0x61, 0x78, 0x81, 0xcf, 0x62, 0x61, 0xea, 0xd4, 0xf0, 0xd6, 0x99, 0x7e, 0x24, + 0x60, 0xf8, 0xfc, 0xfc, 0xc3, 0xf5, 0x6d, 0xf3, 0xb1, 0xd3, 0x9b, 0x1f, 0xd3, 0x8f, 0x04, 0x0c, + 0xb4, 0x41, 0x9f, 0x1f, 0x44, 0xe6, 0xa5, 0x5e, 0x9f, 0xbd, 0xfc, 0x34, 0xb9, 0x1d, 0x44, 0x88, + 0xa9, 0x87, 0x3f, 0x35, 0x00, 0x08, 0xd3, 0x48, 0xbc, 0x7c, 0xd2, 0x16, 0x40, 0x06, 0xad, 0x9c, + 0x46, 0xef, 0xb2, 0x1f, 0x91, 0xc3, 0xf4, 0x5e, 0xa3, 0x45, 0xb9, 0x66, 0x00, 0xfc, 0xa5, 0x01, + 0x2e, 0xe8, 0xe5, 0xae, 0xb2, 0x6c, 0x9a, 0xfb, 0x61, 0xbd, 0x87, 0x81, 0x5c, 0x09, 0x02, 0xb7, + 0x62, 0x36, 0x1b, 0xc5, 0x0b, 0x0b, 0x1d, 0x00, 0x51, 0x47, 0x33, 0xe0, 0x6f, 0x0d, 0x30, 0x2e, + 0xb3, 0xa3, 0x66, 0x5c, 0x91, 0xbb, 0xed, 0xad, 0x1e, 0xba, 0x2d, 0x0b, 0x21, 0xbc, 0xa7, 0xbe, + 0x32, 0xb6, 0xf1, 0x51, 0xbb, 0x55, 0xf0, 0x0f, 0x06, 0x18, 0xb1, 0x71, 0x88, 0x7d, 0x1b, 0xfb, + 0x35, 0x66, 0xe6, 0xcc, 0x49, 0xfb, 0x0a, 0x59, 0x33, 0x97, 0x34, 0xed, 0xc2, 0xc2, 0xb2, 0xb4, + 0x70, 0x44, 0x67, 0x1d, 0x35, 0x8a, 0x93, 0xe9, 0x50, 0x9d, 0x83, 0x5a, 0x0c, 0x84, 0x3f, 0x33, + 0xc0, 0x68, 0xea, 0x76, 0x71, 0x40, 0x5c, 0x39, 0x9d, 0x85, 0xe7, 0x25, 0xe8, 0x42, 0x2b, 0x16, + 0xca, 0x82, 0xc3, 0xdf, 0x19, 0xac, 0xda, 0x4a, 0xee, 0x6a, 0xd4, 0x2c, 0x71, 0x0f, 0xbe, 0xde, + 0x4b, 0x0f, 0x2a, 0xe5, 0xc2, 0x81, 0xd7, 0xd3, 0x4a, 0x4e, 0x71, 0x8e, 0x1a, 0xc5, 0x09, 0xdd, + 0x7f, 0x8a, 0x81, 0x74, 0xe3, 0xe0, 0xbb, 0x06, 0x18, 0xc1, 0x69, 0xc1, 0x4c, 0xcd, 0xab, 0x27, + 0x75, 0x5d, 0xc7, 0xf2, 0x5b, 0x5c, 0xa7, 0x35, 0x16, 0x45, 0x2d, 0xb0, 0xac, 0xf6, 0xc3, 0x07, + 0x96, 0x17, 0xba, 0xd8, 0xfc, 0x72, 0xef, 0x6a, 0xbf, 0x65, 0xa1, 0x12, 0x25, 0xba, 0xe1, 0x75, + 0x50, 0xf0, 0x63, 0xd7, 0xb5, 0xb6, 0x5c, 0x6c, 0x3e, 0xce, 0xab, 0x08, 0xd5, 0x5f, 0xbc, 0x2d, + 0xe9, 0x48, 0x49, 0xc0, 0x6d, 0x30, 0x73, 0x70, 0x4b, 0x3d, 0xbe, 0xe8, 0xd8, 0xc0, 0x33, 0xaf, + 0x71, 0x2d, 0x53, 0xcd, 0x46, 0x71, 0x72, 0xb3, 0x73, 0x8b, 0xef, 0xa1, 0x3a, 0xe0, 0x1b, 0xe0, + 0x31, 0x4d, 0x66, 0xd9, 0xdb, 0xc2, 0xb6, 0x8d, 0xed, 0xe4, 0xa2, 0x65, 0x7e, 0x85, 0x43, 0xa8, + 0x7d, 0xbc, 0x99, 0x15, 0x40, 0x0f, 0x1a, 0x0d, 0x57, 0xc1, 0xa4, 0xc6, 0x5e, 0xf1, 0xa3, 0x75, + 0x52, 0x8d, 0x88, 0xe3, 0xd7, 0xcd, 0x59, 0xae, 0xf7, 0x42, 0xb2, 0xfb, 0x36, 0x35, 0x1e, 0xea, + 0x32, 0x06, 0xbe, 0xdc, 0xa2, 0x8d, 0x7f, 0xb8, 0xb0, 0xc2, 0x5b, 0xf8, 0x90, 0x9a, 0x4f, 0xf0, + 0xe2, 0x82, 0xaf, 0xf3, 0xa6, 0x46, 0x47, 0x5d, 0xe4, 0xe1, 0xb7, 0xc1, 0xf9, 0x0c, 0x87, 0xdd, + 0x2b, 0xcc, 0x27, 0xc5, 0x05, 0x81, 0x55, 0xa2, 0x9b, 0x09, 0x11, 0x75, 0x92, 0x84, 0xdf, 0x04, + 0x50, 0x23, 0xaf, 0x59, 0x21, 0x1f, 0xff, 0x94, 0xb8, 0xab, 0xb0, 0x15, 0xdd, 0x94, 0x34, 0xd4, + 0x41, 0x0e, 0x7e, 0x68, 0xb4, 0xcc, 0x24, 0xbd, 0xcd, 0x52, 0xf3, 0x3a, 0xdf, 0xb0, 0x2f, 0x1f, + 0x3f, 0x00, 0x53, 0x65, 0x28, 0x76, 0xb1, 0xe6, 0x61, 0x0d, 0x05, 0x75, 0x41, 0x9f, 0x62, 0x97, + 0xe9, 0x4c, 0x0e, 0x87, 0x63, 0xa0, 0x6f, 0x17, 0xcb, 0xcf, 0xc6, 0x88, 0xfd, 0x84, 0x6f, 0x82, + 0xfc, 0x9e, 0xe5, 0xc6, 0x49, 0x2b, 0xa0, 0x77, 0x67, 0x3d, 0x12, 0x7a, 0x5f, 0xcc, 0xdd, 0x30, + 0xa6, 0xde, 0x37, 0xc0, 0x64, 0xe7, 0x53, 0xe5, 0x8b, 0xb2, 0xe8, 0x17, 0x06, 0x18, 0x6f, 0x3b, + 0x40, 0x3a, 0x18, 0xe3, 0xb6, 0x1a, 0x73, 0xaf, 0x87, 0x27, 0x81, 0xd8, 0x08, 0xbc, 0xa2, 0xd5, + 0x2d, 0xfb, 0x89, 0x01, 0xc6, 0xb2, 0x89, 0xf9, 0x0b, 0xf2, 0x52, 0xe9, 0xbd, 0x1c, 0x98, 0xec, + 0x5c, 0x83, 0x43, 0x4f, 0x75, 0x17, 0x7a, 0xde, 0xa0, 0xe9, 0xd4, 0xb2, 0x7d, 0xc7, 0x00, 0xc3, + 0x6f, 0x2b, 0xb9, 0xe4, 0x6b, 0x66, 0x2f, 0xbb, 0x42, 0xc9, 0xd1, 0x97, 0x32, 0x28, 0xd2, 0x21, + 0x4b, 0xbf, 0x37, 0xc0, 0x44, 0xc7, 0xe3, 0x1c, 0x5e, 0x03, 0x03, 0x96, 0xeb, 0x06, 0xfb, 0xa2, + 0x9b, 0xa7, 0xb5, 0xe5, 0x17, 0x38, 0x15, 0x49, 0xae, 0xe6, 0xb3, 0xdc, 0xe7, 0xe0, 0xb3, 0xd2, + 0x9f, 0x0c, 0x70, 0xe9, 0x41, 0x51, 0xf7, 0x79, 0xaf, 0xe1, 0x2c, 0x28, 0xc8, 0x62, 0xfb, 0x90, + 0xaf, 0x9f, 0xcc, 0xae, 0x32, 0x23, 0xf0, 0xd7, 0x32, 0xe2, 0x57, 0xe9, 0xd7, 0x06, 0x18, 0xab, + 0x62, 0xb2, 0xe7, 0xd4, 0x30, 0xc2, 0xdb, 0x98, 0x60, 0xbf, 0x86, 0xe1, 0x1c, 0x18, 0xe2, 0x5f, + 0x1b, 0x43, 0xab, 0x96, 0x7c, 0x23, 0x19, 0x97, 0x8e, 0x1e, 0xba, 0x9d, 0x30, 0x50, 0x2a, 0xa3, + 0xbe, 0xa7, 0xe4, 0xba, 0x7e, 0x4f, 0xb9, 0x04, 0xfa, 0xc3, 0xb4, 0x01, 0x5c, 0x60, 0x5c, 0xde, + 0xf3, 0xe5, 0x54, 0xce, 0x0d, 0x48, 0xc4, 0xbb, 0x5c, 0x79, 0xc9, 0x0d, 0x48, 0x84, 0x38, 0xb5, + 0xf4, 0x41, 0x0e, 0x9c, 0x6b, 0xcd, 0xcf, 0x0c, 0x90, 0xc4, 0x6e, 0xdb, 0x07, 0x1c, 0xc6, 0x43, + 0x9c, 0xa3, 0xbf, 0x1b, 0xc8, 0x3d, 0xf8, 0xdd, 0x00, 0x7c, 0x09, 0x8c, 0xcb, 0x9f, 0xcb, 0x07, + 0x21, 0xc1, 0x94, 0x7f, 0x99, 0xec, 0x6b, 0x7d, 0xef, 0xb7, 0x96, 0x15, 0x40, 0xed, 0x63, 0xe0, + 0x37, 0x32, 0x6f, 0x1a, 0xae, 0xa6, 0xef, 0x19, 0x58, 0x6d, 0xc7, 0x4b, 0x87, 0x7b, 0x6c, 0xcb, + 0x2f, 0x13, 0x12, 0x90, 0xcc, 0x43, 0x87, 0x39, 0x30, 0xb4, 0xcd, 0x04, 0x78, 0x9f, 0x3c, 0xdf, + 0xea, 0xf4, 0x9b, 0x09, 0x03, 0xa5, 0x32, 0xa5, 0x3f, 0x1b, 0xe0, 0x7c, 0xf2, 0x1a, 0xc8, 0x75, + 0xb0, 0x1f, 0x2d, 0x06, 0xfe, 0xb6, 0x53, 0x87, 0x17, 0x45, 0xff, 0x53, 0x6b, 0x2a, 0x26, 0xbd, + 0x4f, 0x78, 0x1f, 0x0c, 0x52, 0xb1, 0xd8, 0x32, 0x0e, 0x5f, 0x39, 0x7e, 0x1c, 0x66, 0xa3, 0x46, + 0x94, 0x6f, 0x09, 0x35, 0xc1, 0x61, 0xa1, 0x58, 0xb3, 0x2a, 0xb1, 0x6f, 0xcb, 0x1e, 0xf8, 0x88, + 0x08, 0xc5, 0xc5, 0x05, 0x41, 0x43, 0x8a, 0x5b, 0xfa, 0xa7, 0x01, 0xc6, 0xdb, 0x5e, 0x37, 0xc1, + 0x1f, 0x1a, 0x60, 0xa4, 0xa6, 0x4d, 0x4f, 0x6e, 0xe8, 0xb5, 0x93, 0xbf, 0xa0, 0xd2, 0x94, 0x8a, + 0x1a, 0x48, 0xa7, 0xa0, 0x16, 0x50, 0xb8, 0x09, 0xcc, 0x5a, 0xe6, 0x21, 0x61, 0xe6, 0xd3, 0xe4, + 0xa5, 0x66, 0xa3, 0x68, 0x2e, 0x76, 0x91, 0x41, 0x5d, 0x47, 0x57, 0xbe, 0xfb, 0xf1, 0x67, 0xd3, + 0x67, 0x3e, 0xf9, 0x6c, 0xfa, 0xcc, 0xa7, 0x9f, 0x4d, 0x9f, 0x79, 0xa7, 0x39, 0x6d, 0x7c, 0xdc, + 0x9c, 0x36, 0x3e, 0x69, 0x4e, 0x1b, 0x9f, 0x36, 0xa7, 0x8d, 0xbf, 0x35, 0xa7, 0x8d, 0x9f, 0xff, + 0x7d, 0xfa, 0xcc, 0xeb, 0x37, 0x8e, 0xfb, 0x7c, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1d, + 0x01, 0xc1, 0x04, 0x92, 0x2c, 0x00, 0x00, } func (m *ConversionRequest) Marshal() (dAtA []byte, err error) { @@ -2630,6 +2633,18 @@ func (m *ValidationRule) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.FieldPath) + copy(dAtA[i:], m.FieldPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.FieldPath))) + i-- + dAtA[i] = 0x2a + if m.Reason != nil { + i -= len(*m.Reason) + copy(dAtA[i:], *m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + i-- + dAtA[i] = 0x22 + } i -= len(m.MessageExpression) copy(dAtA[i:], m.MessageExpression) i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) @@ -3346,6 +3361,12 @@ func (m *ValidationRule) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.MessageExpression) n += 1 + l + sovGenerated(uint64(l)) + if m.Reason != nil { + l = len(*m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.FieldPath) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -3822,6 +3843,8 @@ func (this *ValidationRule) String() string { `Rule:` + fmt.Sprintf("%v", this.Rule) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + `Reason:` + valueToStringGenerated(this.Reason) + `,`, + `FieldPath:` + fmt.Sprintf("%v", this.FieldPath) + `,`, `}`, }, "") return s @@ -8920,6 +8943,71 @@ func (m *ValidationRule) Unmarshal(dAtA []byte) error { } m.MessageExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FieldValueErrorReason(dAtA[iNdEx:postIndex]) + m.Reason = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto index 4632a83e5..578d018a7 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto @@ -678,6 +678,26 @@ message ValidationRule { // "x must be less than max ("+string(self.max)+")" // +optional optional string messageExpression = 3; + + // reason provides a machine-readable validation failure reason that is returned to the caller when a request fails this validation rule. + // The HTTP status code returned to the caller will match the reason of the reason of the first failed validation rule. + // The currently supported reasons are: "FieldValueInvalid", "FieldValueForbidden", "FieldValueRequired", "FieldValueDuplicate". + // If not set, default to use "FieldValueInvalid". + // All future added reasons must be accepted by clients when reading this value and unknown reasons should be treated as FieldValueInvalid. + // +optional + optional string reason = 4; + + // fieldPath represents the field path returned when the validation fails. + // It must be a relative JSON path (i.e. with array notation) scoped to the location of this x-kubernetes-validations extension in the schema and refer to an existing field. + // e.g. when validation checks if a specific attribute `foo` under a map `testMap`, the fieldPath could be set to `.testMap.foo` + // If the validation checks two lists must have unique attributes, the fieldPath could be set to either of the list: e.g. `.testList` + // It does not support list numeric index. + // It supports child operation to refer to an existing field currently. Refer to [JSONPath support in Kubernetes](https://kubernetes.io/docs/reference/kubectl/jsonpath/) for more info. + // Numeric index of array is not supported. + // For field name which contains special characters, use `['specialName']` to refer the field name. + // e.g. for attribute `foo.34$` appears in a list `testList`, the fieldPath could be set to `.testList['foo.34$']` + // +optional + optional string fieldPath = 5; } // WebhookClientConfig contains the information to make a TLS connection with the webhook. diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go index b348d0d19..1c90d464a 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go @@ -16,6 +16,26 @@ limitations under the License. package v1 +// FieldValueErrorReason is a machine-readable value providing more detail about why a field failed the validation. +// +enum +type FieldValueErrorReason string + +const ( + // FieldValueRequired is used to report required values that are not + // provided (e.g. empty strings, null values, or empty arrays). + FieldValueRequired FieldValueErrorReason = "FieldValueRequired" + // FieldValueDuplicate is used to report collisions of values that must be + // unique (e.g. unique IDs). + FieldValueDuplicate FieldValueErrorReason = "FieldValueDuplicate" + // FieldValueInvalid is used to report malformed values (e.g. failed regex + // match, too long, out of bounds). + FieldValueInvalid FieldValueErrorReason = "FieldValueInvalid" + // FieldValueForbidden is used to report valid (as per formatting rules) + // values which would be accepted under some conditions, but which are not + // permitted by the current conditions (such as security policy). + FieldValueForbidden FieldValueErrorReason = "FieldValueForbidden" +) + // JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/). type JSONSchemaProps struct { ID string `json:"id,omitempty" protobuf:"bytes,1,opt,name=id"` @@ -247,6 +267,24 @@ type ValidationRule struct { // "x must be less than max ("+string(self.max)+")" // +optional MessageExpression string `json:"messageExpression,omitempty" protobuf:"bytes,3,opt,name=messageExpression"` + // reason provides a machine-readable validation failure reason that is returned to the caller when a request fails this validation rule. + // The HTTP status code returned to the caller will match the reason of the reason of the first failed validation rule. + // The currently supported reasons are: "FieldValueInvalid", "FieldValueForbidden", "FieldValueRequired", "FieldValueDuplicate". + // If not set, default to use "FieldValueInvalid". + // All future added reasons must be accepted by clients when reading this value and unknown reasons should be treated as FieldValueInvalid. + // +optional + Reason *FieldValueErrorReason `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"` + // fieldPath represents the field path returned when the validation fails. + // It must be a relative JSON path (i.e. with array notation) scoped to the location of this x-kubernetes-validations extension in the schema and refer to an existing field. + // e.g. when validation checks if a specific attribute `foo` under a map `testMap`, the fieldPath could be set to `.testMap.foo` + // If the validation checks two lists must have unique attributes, the fieldPath could be set to either of the list: e.g. `.testList` + // It does not support list numeric index. + // It supports child operation to refer to an existing field currently. Refer to [JSONPath support in Kubernetes](https://kubernetes.io/docs/reference/kubectl/jsonpath/) for more info. + // Numeric index of array is not supported. + // For field name which contains special characters, use `['specialName']` to refer the field name. + // e.g. for attribute `foo.34$` appears in a list `testList`, the fieldPath could be set to `.testList['foo.34$']` + // +optional + FieldPath string `json:"fieldPath,omitempty" protobuf:"bytes,5,opt,name=fieldPath"` } // JSON represents any valid JSON value. diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go index cde5275ce..0a82e4d8c 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go @@ -1259,6 +1259,8 @@ func autoConvert_v1_ValidationRule_To_apiextensions_ValidationRule(in *Validatio out.Rule = in.Rule out.Message = in.Message out.MessageExpression = in.MessageExpression + out.Reason = (*apiextensions.FieldValueErrorReason)(unsafe.Pointer(in.Reason)) + out.FieldPath = in.FieldPath return nil } @@ -1271,6 +1273,8 @@ func autoConvert_apiextensions_ValidationRule_To_v1_ValidationRule(in *apiextens out.Rule = in.Rule out.Message = in.Message out.MessageExpression = in.MessageExpression + out.Reason = (*FieldValueErrorReason)(unsafe.Pointer(in.Reason)) + out.FieldPath = in.FieldPath return nil } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.deepcopy.go index e27daa9a3..b4347b8db 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.deepcopy.go @@ -614,6 +614,11 @@ func (in *ServiceReference) DeepCopy() *ServiceReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValidationRule) DeepCopyInto(out *ValidationRule) { *out = *in + if in.Reason != nil { + in, out := &in.Reason, &out.Reason + *out = new(FieldValueErrorReason) + **out = **in + } return } @@ -632,7 +637,9 @@ func (in ValidationRules) DeepCopyInto(out *ValidationRules) { { in := &in *out = make(ValidationRules, len(*in)) - copy(*out, *in) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } return } } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go index 9f64585da..3a2ee6807 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go @@ -267,9 +267,11 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { } if in.XValidations != nil { - in, out := &in.XValidations, &out.XValidations - *out = make([]ValidationRule, len(*in)) - copy(*out, *in) + inValidations, outValidations := &in.XValidations, &out.XValidations + *outValidations = make([]ValidationRule, len(*inValidations)) + for i := range *inValidations { + in.XValidations[i].DeepCopyInto(&out.XValidations[i]) + } } return out diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go index 011bd72dc..981f6adbd 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go @@ -785,202 +785,204 @@ func init() { } var fileDescriptor_98a4cc6918394e53 = []byte{ - // 3105 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0x23, 0x47, - 0xd9, 0xdf, 0x91, 0x2c, 0x5b, 0x6e, 0x7b, 0x77, 0xed, 0xde, 0xb5, 0x33, 0xeb, 0x6c, 0x2c, 0x5b, - 0x79, 0xb3, 0xaf, 0x93, 0x6c, 0xe4, 0xc4, 0x6f, 0xf2, 0x26, 0xa4, 0x48, 0x51, 0x96, 0xed, 0x0d, - 0x4e, 0xd6, 0x1f, 0xb4, 0x76, 0x13, 0x43, 0x3e, 0xc7, 0x9a, 0xb6, 0x3c, 0xf1, 0x68, 0x66, 0xb6, - 0x7b, 0x46, 0xb6, 0x2b, 0x40, 0xf1, 0x51, 0x29, 0x28, 0x0a, 0x08, 0x45, 0x72, 0xa1, 0x80, 0x43, - 0xa0, 0xe0, 0xc0, 0x01, 0x0e, 0x70, 0x83, 0x3f, 0x20, 0xc7, 0x14, 0xc5, 0x21, 0x07, 0x4a, 0x10, - 0x71, 0xe5, 0x48, 0x15, 0x55, 0x3e, 0x51, 0xfd, 0x31, 0x3d, 0xad, 0x91, 0xb4, 0xbb, 0x15, 0x4b, - 0x59, 0x6e, 0xd2, 0xf3, 0xf5, 0x7b, 0xe6, 0xe9, 0xa7, 0x9f, 0x7e, 0xfa, 0x99, 0x01, 0x7b, 0x07, - 0xcf, 0xd0, 0x92, 0xe3, 0x2f, 0x1e, 0x44, 0xbb, 0x98, 0x78, 0x38, 0xc4, 0x74, 0xb1, 0x81, 0x3d, - 0xdb, 0x27, 0x8b, 0x92, 0x61, 0x05, 0x0e, 0x3e, 0x0a, 0xb1, 0x47, 0x1d, 0xdf, 0xa3, 0x8f, 0x59, - 0x81, 0x43, 0x31, 0x69, 0x60, 0xb2, 0x18, 0x1c, 0xd4, 0x18, 0x8f, 0xb6, 0x0b, 0x2c, 0x36, 0x9e, - 0xd8, 0xc5, 0xa1, 0xf5, 0xc4, 0x62, 0x0d, 0x7b, 0x98, 0x58, 0x21, 0xb6, 0x4b, 0x01, 0xf1, 0x43, - 0x1f, 0x3e, 0x27, 0xcc, 0x95, 0xda, 0xa4, 0xdf, 0x50, 0xe6, 0x4a, 0xc1, 0x41, 0x8d, 0xf1, 0x68, - 0xbb, 0x40, 0x49, 0x9a, 0x9b, 0x79, 0xac, 0xe6, 0x84, 0xfb, 0xd1, 0x6e, 0xa9, 0xea, 0xd7, 0x17, - 0x6b, 0x7e, 0xcd, 0x5f, 0xe4, 0x56, 0x77, 0xa3, 0x3d, 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x04, 0xda, - 0xcc, 0x93, 0x89, 0xf3, 0x75, 0xab, 0xba, 0xef, 0x78, 0x98, 0x1c, 0x27, 0x1e, 0xd7, 0x71, 0x68, - 0x2d, 0x36, 0x3a, 0x7c, 0x9c, 0x59, 0xec, 0xa5, 0x45, 0x22, 0x2f, 0x74, 0xea, 0xb8, 0x43, 0xe1, - 0xff, 0xef, 0xa4, 0x40, 0xab, 0xfb, 0xb8, 0x6e, 0xa5, 0xf5, 0x8a, 0x27, 0x06, 0x98, 0x5c, 0xf1, - 0xbd, 0x06, 0x26, 0xec, 0x29, 0x11, 0xbe, 0x15, 0x61, 0x1a, 0xc2, 0x32, 0xc8, 0x46, 0x8e, 0x6d, - 0x1a, 0x73, 0xc6, 0xc2, 0x68, 0xf9, 0xf1, 0x0f, 0x9b, 0x85, 0x33, 0xad, 0x66, 0x21, 0x7b, 0x73, - 0x7d, 0xf5, 0xa4, 0x59, 0x98, 0xef, 0x85, 0x14, 0x1e, 0x07, 0x98, 0x96, 0x6e, 0xae, 0xaf, 0x22, - 0xa6, 0x0c, 0x9f, 0x07, 0x93, 0x36, 0xa6, 0x0e, 0xc1, 0xf6, 0xf2, 0xf6, 0xfa, 0x4b, 0xc2, 0xbe, - 0x99, 0xe1, 0x16, 0x2f, 0x49, 0x8b, 0x93, 0xab, 0x69, 0x01, 0xd4, 0xa9, 0x03, 0x77, 0xc0, 0x88, - 0xbf, 0xfb, 0x16, 0xae, 0x86, 0xd4, 0xcc, 0xce, 0x65, 0x17, 0xc6, 0x96, 0x1e, 0x2b, 0x25, 0x2b, - 0xa8, 0x5c, 0xe0, 0xcb, 0x26, 0x1f, 0xb6, 0x84, 0xac, 0xc3, 0xb5, 0x78, 0xe5, 0xca, 0xe7, 0x25, - 0xda, 0xc8, 0x96, 0xb0, 0x82, 0x62, 0x73, 0xc5, 0x5f, 0x66, 0x00, 0xd4, 0x1f, 0x9e, 0x06, 0xbe, - 0x47, 0x71, 0x5f, 0x9e, 0x9e, 0x82, 0x89, 0x2a, 0xb7, 0x1c, 0x62, 0x5b, 0xe2, 0x9a, 0x99, 0x4f, - 0xe3, 0xbd, 0x29, 0xf1, 0x27, 0x56, 0x52, 0xe6, 0x50, 0x07, 0x00, 0xbc, 0x01, 0x86, 0x09, 0xa6, - 0x91, 0x1b, 0x9a, 0xd9, 0x39, 0x63, 0x61, 0x6c, 0xe9, 0x6a, 0x4f, 0x28, 0x9e, 0xdf, 0x2c, 0xf9, - 0x4a, 0x8d, 0x27, 0x4a, 0x95, 0xd0, 0x0a, 0x23, 0x5a, 0x3e, 0x27, 0x91, 0x86, 0x11, 0xb7, 0x81, - 0xa4, 0xad, 0xe2, 0x77, 0x33, 0x60, 0x42, 0x8f, 0x52, 0xc3, 0xc1, 0x87, 0xf0, 0x10, 0x8c, 0x10, - 0x91, 0x2c, 0x3c, 0x4e, 0x63, 0x4b, 0xdb, 0xa5, 0x53, 0x6d, 0xab, 0x52, 0x47, 0x12, 0x96, 0xc7, - 0xd8, 0x9a, 0xc9, 0x3f, 0x28, 0x46, 0x83, 0x6f, 0x83, 0x3c, 0x91, 0x0b, 0xc5, 0xb3, 0x69, 0x6c, - 0xe9, 0x4b, 0x7d, 0x44, 0x16, 0x86, 0xcb, 0xe3, 0xad, 0x66, 0x21, 0x1f, 0xff, 0x43, 0x0a, 0xb0, - 0xf8, 0x5e, 0x06, 0xcc, 0xae, 0x44, 0x34, 0xf4, 0xeb, 0x08, 0x53, 0x3f, 0x22, 0x55, 0xbc, 0xe2, - 0xbb, 0x51, 0xdd, 0x5b, 0xc5, 0x7b, 0x8e, 0xe7, 0x84, 0x2c, 0x5b, 0xe7, 0xc0, 0x90, 0x67, 0xd5, - 0xb1, 0xcc, 0x9e, 0x71, 0x19, 0xd3, 0xa1, 0x4d, 0xab, 0x8e, 0x11, 0xe7, 0x30, 0x09, 0x96, 0x2c, - 0x72, 0x2f, 0x28, 0x89, 0x1b, 0xc7, 0x01, 0x46, 0x9c, 0x03, 0xaf, 0x80, 0xe1, 0x3d, 0x9f, 0xd4, - 0x2d, 0xb1, 0x8e, 0xa3, 0xc9, 0xca, 0x5c, 0xe3, 0x54, 0x24, 0xb9, 0xf0, 0x29, 0x30, 0x66, 0x63, - 0x5a, 0x25, 0x4e, 0xc0, 0xa0, 0xcd, 0x21, 0x2e, 0x7c, 0x41, 0x0a, 0x8f, 0xad, 0x26, 0x2c, 0xa4, - 0xcb, 0xc1, 0xab, 0x20, 0x1f, 0x10, 0xc7, 0x27, 0x4e, 0x78, 0x6c, 0xe6, 0xe6, 0x8c, 0x85, 0x5c, - 0x79, 0x42, 0xea, 0xe4, 0xb7, 0x25, 0x1d, 0x29, 0x09, 0x38, 0x07, 0xf2, 0x2f, 0x54, 0xb6, 0x36, - 0xb7, 0xad, 0x70, 0xdf, 0x1c, 0xe6, 0x08, 0x43, 0x4c, 0x1a, 0x29, 0x6a, 0xf1, 0xaf, 0x19, 0x60, - 0xa6, 0xa3, 0x12, 0x87, 0x14, 0x5e, 0x03, 0x79, 0x1a, 0xb2, 0x8a, 0x53, 0x3b, 0x96, 0x31, 0x79, - 0x24, 0x06, 0xab, 0x48, 0xfa, 0x49, 0xb3, 0x30, 0x9d, 0x68, 0xc4, 0x54, 0x1e, 0x0f, 0xa5, 0x0b, - 0x7f, 0x6e, 0x80, 0x0b, 0x87, 0x78, 0x77, 0xdf, 0xf7, 0x0f, 0x56, 0x5c, 0x07, 0x7b, 0xe1, 0x8a, - 0xef, 0xed, 0x39, 0x35, 0x99, 0x03, 0xe8, 0x94, 0x39, 0xf0, 0x72, 0xa7, 0xe5, 0xf2, 0x7d, 0xad, - 0x66, 0xe1, 0x42, 0x17, 0x06, 0xea, 0xe6, 0x07, 0xdc, 0x01, 0x66, 0x35, 0xb5, 0x49, 0x64, 0x01, - 0x13, 0x65, 0x6b, 0xb4, 0x7c, 0xb9, 0xd5, 0x2c, 0x98, 0x2b, 0x3d, 0x64, 0x50, 0x4f, 0xed, 0xe2, - 0xb7, 0xb3, 0xe9, 0xf0, 0x6a, 0xe9, 0xf6, 0x26, 0xc8, 0xb3, 0x6d, 0x6c, 0x5b, 0xa1, 0x25, 0x37, - 0xe2, 0xe3, 0x77, 0xb7, 0xe9, 0x45, 0xcd, 0xd8, 0xc0, 0xa1, 0x55, 0x86, 0x72, 0x41, 0x40, 0x42, - 0x43, 0xca, 0x2a, 0xfc, 0x1a, 0x18, 0xa2, 0x01, 0xae, 0xca, 0x40, 0xbf, 0x72, 0xda, 0xcd, 0xd6, - 0xe3, 0x41, 0x2a, 0x01, 0xae, 0x26, 0x7b, 0x81, 0xfd, 0x43, 0x1c, 0x16, 0xbe, 0x63, 0x80, 0x61, - 0xca, 0x0b, 0x94, 0x2c, 0x6a, 0xaf, 0x0d, 0xca, 0x83, 0x54, 0x15, 0x14, 0xff, 0x91, 0x04, 0x2f, - 0xfe, 0x2b, 0x03, 0xe6, 0x7b, 0xa9, 0xae, 0xf8, 0x9e, 0x2d, 0x96, 0x63, 0x5d, 0xee, 0x6d, 0x91, - 0xe9, 0x4f, 0xe9, 0x7b, 0xfb, 0xa4, 0x59, 0x78, 0xe8, 0x8e, 0x06, 0xb4, 0x22, 0xf0, 0x39, 0xf5, - 0xdc, 0xa2, 0x50, 0xcc, 0xb7, 0x3b, 0x76, 0xd2, 0x2c, 0x9c, 0x57, 0x6a, 0xed, 0xbe, 0xc2, 0x06, - 0x80, 0xae, 0x45, 0xc3, 0x1b, 0xc4, 0xf2, 0xa8, 0x30, 0xeb, 0xd4, 0xb1, 0x0c, 0xdf, 0x23, 0x77, - 0x97, 0x1e, 0x4c, 0xa3, 0x3c, 0x23, 0x21, 0xe1, 0xf5, 0x0e, 0x6b, 0xa8, 0x0b, 0x02, 0xab, 0x5b, - 0x04, 0x5b, 0x54, 0x95, 0x22, 0xed, 0x44, 0x61, 0x54, 0x24, 0xb9, 0xf0, 0x61, 0x30, 0x52, 0xc7, - 0x94, 0x5a, 0x35, 0xcc, 0xeb, 0xcf, 0x68, 0x72, 0x44, 0x6f, 0x08, 0x32, 0x8a, 0xf9, 0xac, 0x3f, - 0xb9, 0xdc, 0x2b, 0x6a, 0xd7, 0x1d, 0x1a, 0xc2, 0x57, 0x3b, 0x36, 0x40, 0xe9, 0xee, 0x9e, 0x90, - 0x69, 0xf3, 0xf4, 0x57, 0xc5, 0x2f, 0xa6, 0x68, 0xc9, 0xff, 0x55, 0x90, 0x73, 0x42, 0x5c, 0x8f, - 0xcf, 0xee, 0x97, 0x07, 0x94, 0x7b, 0xe5, 0xb3, 0xd2, 0x87, 0xdc, 0x3a, 0x43, 0x43, 0x02, 0xb4, - 0xf8, 0xab, 0x0c, 0x78, 0xa0, 0x97, 0x0a, 0x3b, 0x50, 0x28, 0x8b, 0x78, 0xe0, 0x46, 0xc4, 0x72, - 0x65, 0xc6, 0xa9, 0x88, 0x6f, 0x73, 0x2a, 0x92, 0x5c, 0x56, 0xf2, 0xa9, 0xe3, 0xd5, 0x22, 0xd7, - 0x22, 0x32, 0x9d, 0xd4, 0x53, 0x57, 0x24, 0x1d, 0x29, 0x09, 0x58, 0x02, 0x80, 0xee, 0xfb, 0x24, - 0xe4, 0x18, 0xb2, 0x7a, 0x9d, 0x63, 0x05, 0xa2, 0xa2, 0xa8, 0x48, 0x93, 0x60, 0x27, 0xda, 0x81, - 0xe3, 0xd9, 0x72, 0xd5, 0xd5, 0x2e, 0x7e, 0xd1, 0xf1, 0x6c, 0xc4, 0x39, 0x0c, 0xdf, 0x75, 0x68, - 0xc8, 0x28, 0x72, 0xc9, 0xdb, 0xa2, 0xce, 0x25, 0x95, 0x04, 0xc3, 0xaf, 0xb2, 0xaa, 0xef, 0x13, - 0x07, 0x53, 0x73, 0x38, 0xc1, 0x5f, 0x51, 0x54, 0xa4, 0x49, 0x14, 0xff, 0x99, 0xef, 0x9d, 0x24, - 0xac, 0x94, 0xc0, 0x07, 0x41, 0xae, 0x46, 0xfc, 0x28, 0x90, 0x51, 0x52, 0xd1, 0x7e, 0x9e, 0x11, - 0x91, 0xe0, 0xb1, 0xac, 0x6c, 0xb4, 0xb5, 0xa9, 0x2a, 0x2b, 0xe3, 0xe6, 0x34, 0xe6, 0xc3, 0x6f, - 0x1a, 0x20, 0xe7, 0xc9, 0xe0, 0xb0, 0x94, 0x7b, 0x75, 0x40, 0x79, 0xc1, 0xc3, 0x9b, 0xb8, 0x2b, - 0x22, 0x2f, 0x90, 0xe1, 0x93, 0x20, 0x47, 0xab, 0x7e, 0x80, 0x65, 0xd4, 0x67, 0x63, 0xa1, 0x0a, - 0x23, 0x9e, 0x34, 0x0b, 0x67, 0x63, 0x73, 0x9c, 0x80, 0x84, 0x30, 0xfc, 0x8e, 0x01, 0x40, 0xc3, - 0x72, 0x1d, 0xdb, 0xe2, 0x2d, 0x43, 0x8e, 0xbb, 0xdf, 0xdf, 0xb4, 0x7e, 0x49, 0x99, 0x17, 0x8b, - 0x96, 0xfc, 0x47, 0x1a, 0x34, 0x7c, 0xd7, 0x00, 0xe3, 0x34, 0xda, 0x25, 0x52, 0x8b, 0xf2, 0xe6, - 0x62, 0x6c, 0xe9, 0xcb, 0x7d, 0xf5, 0xa5, 0xa2, 0x01, 0x94, 0x27, 0x5a, 0xcd, 0xc2, 0xb8, 0x4e, - 0x41, 0x6d, 0x0e, 0xc0, 0xef, 0x1b, 0x20, 0xdf, 0x88, 0xcf, 0xec, 0x11, 0xbe, 0xe1, 0x5f, 0x1f, - 0xd0, 0xc2, 0xca, 0x8c, 0x4a, 0x76, 0x81, 0xea, 0x03, 0x94, 0x07, 0xf0, 0x8f, 0x06, 0x30, 0x2d, - 0x5b, 0x14, 0x78, 0xcb, 0xdd, 0x26, 0x8e, 0x17, 0x62, 0x22, 0xfa, 0x4d, 0x6a, 0xe6, 0xb9, 0x7b, - 0xfd, 0x3d, 0x0b, 0xd3, 0xbd, 0x6c, 0x79, 0x4e, 0x7a, 0x67, 0x2e, 0xf7, 0x70, 0x03, 0xf5, 0x74, - 0x90, 0x27, 0x5a, 0xd2, 0xd2, 0x98, 0xa3, 0x03, 0x48, 0xb4, 0xa4, 0x97, 0x92, 0xd5, 0x21, 0xe9, - 0xa0, 0x34, 0x68, 0xb8, 0x05, 0xa6, 0x02, 0x82, 0x39, 0xc0, 0x4d, 0xef, 0xc0, 0xf3, 0x0f, 0xbd, - 0x6b, 0x0e, 0x76, 0x6d, 0x6a, 0x82, 0x39, 0x63, 0x21, 0x5f, 0xbe, 0xd4, 0x6a, 0x16, 0xa6, 0xb6, - 0xbb, 0x09, 0xa0, 0xee, 0x7a, 0xc5, 0x77, 0xb3, 0xe9, 0x5b, 0x40, 0xba, 0x8b, 0x80, 0xef, 0x8b, - 0xa7, 0x17, 0xb1, 0xa1, 0xa6, 0xc1, 0x57, 0xeb, 0xcd, 0x01, 0x25, 0x93, 0x6a, 0x03, 0x92, 0x4e, - 0x4e, 0x91, 0x28, 0xd2, 0xfc, 0x80, 0x3f, 0x31, 0xc0, 0x59, 0xab, 0x5a, 0xc5, 0x41, 0x88, 0x6d, - 0x51, 0xdc, 0x33, 0x9f, 0x41, 0xfd, 0x9a, 0x92, 0x5e, 0x9d, 0x5d, 0xd6, 0xa1, 0x51, 0xbb, 0x27, - 0xf0, 0x59, 0x70, 0x8e, 0x86, 0x3e, 0xc1, 0x76, 0xaa, 0x6d, 0x86, 0xad, 0x66, 0xe1, 0x5c, 0xa5, - 0x8d, 0x83, 0x52, 0x92, 0xc5, 0xbf, 0xe5, 0x40, 0xe1, 0x0e, 0x5b, 0xed, 0x2e, 0x2e, 0x66, 0x57, - 0xc0, 0x30, 0x7f, 0x5c, 0x9b, 0x47, 0x25, 0xaf, 0xb5, 0x82, 0x9c, 0x8a, 0x24, 0x97, 0x1d, 0x14, - 0x0c, 0x9f, 0xb5, 0x2f, 0x59, 0x2e, 0xa8, 0x0e, 0x8a, 0x8a, 0x20, 0xa3, 0x98, 0x0f, 0x97, 0x00, - 0xb0, 0x71, 0x40, 0x30, 0x3b, 0xac, 0x6c, 0x73, 0x84, 0x4b, 0xab, 0x45, 0x5a, 0x55, 0x1c, 0xa4, - 0x49, 0xc1, 0x6b, 0x00, 0xc6, 0xff, 0x1c, 0xdf, 0x7b, 0xd9, 0x22, 0x9e, 0xe3, 0xd5, 0xcc, 0x3c, - 0x77, 0x7b, 0x9a, 0x75, 0x63, 0xab, 0x1d, 0x5c, 0xd4, 0x45, 0x03, 0xbe, 0x0d, 0x86, 0xc5, 0xd0, - 0x87, 0x9f, 0x10, 0x03, 0xac, 0xf2, 0x80, 0xc7, 0x88, 0x43, 0x21, 0x09, 0xd9, 0x59, 0xdd, 0x73, - 0xf7, 0xba, 0xba, 0xdf, 0xb6, 0x9c, 0x0e, 0xff, 0x97, 0x97, 0xd3, 0xe2, 0xbf, 0x8d, 0x74, 0xcd, - 0xd1, 0x1e, 0xb5, 0x52, 0xb5, 0x5c, 0x0c, 0x57, 0xc1, 0x04, 0xbb, 0x31, 0x21, 0x1c, 0xb8, 0x4e, - 0xd5, 0xa2, 0xfc, 0xc2, 0x2e, 0x92, 0x5d, 0xcd, 0x90, 0x2a, 0x29, 0x3e, 0xea, 0xd0, 0x80, 0x2f, - 0x00, 0x28, 0x6e, 0x11, 0x6d, 0x76, 0x44, 0x43, 0xa4, 0xee, 0x03, 0x95, 0x0e, 0x09, 0xd4, 0x45, - 0x0b, 0xae, 0x80, 0x49, 0xd7, 0xda, 0xc5, 0x6e, 0x05, 0xbb, 0xb8, 0x1a, 0xfa, 0x84, 0x9b, 0x12, - 0x23, 0x8d, 0xa9, 0x56, 0xb3, 0x30, 0x79, 0x3d, 0xcd, 0x44, 0x9d, 0xf2, 0xc5, 0xf9, 0xf4, 0xd6, - 0xd6, 0x1f, 0x5c, 0xdc, 0xcd, 0x3e, 0xc8, 0x80, 0x99, 0xde, 0x99, 0x01, 0xbf, 0x95, 0x5c, 0x21, - 0xc5, 0x0d, 0xe1, 0xf5, 0x41, 0x65, 0xa1, 0xbc, 0x43, 0x82, 0xce, 0xfb, 0x23, 0xfc, 0x3a, 0x6b, - 0xd7, 0x2c, 0x37, 0x1e, 0x5a, 0xbd, 0x36, 0x30, 0x17, 0x18, 0x48, 0x79, 0x54, 0x74, 0x82, 0x96, - 0xcb, 0x1b, 0x3f, 0xcb, 0xc5, 0xc5, 0xdf, 0x18, 0xe9, 0x29, 0x42, 0xb2, 0x83, 0xe1, 0x0f, 0x0c, - 0x70, 0xde, 0x0f, 0xb0, 0xb7, 0xbc, 0xbd, 0xfe, 0xd2, 0xff, 0x89, 0x9d, 0x2c, 0x43, 0xb5, 0x79, - 0x4a, 0x3f, 0x5f, 0xa8, 0x6c, 0x6d, 0x0a, 0x83, 0xdb, 0xc4, 0x0f, 0x68, 0xf9, 0x42, 0xab, 0x59, - 0x38, 0xbf, 0xd5, 0x0e, 0x85, 0xd2, 0xd8, 0xc5, 0x3a, 0x98, 0x5a, 0x3b, 0x0a, 0x31, 0xf1, 0x2c, - 0x77, 0xd5, 0xaf, 0x46, 0x75, 0xec, 0x85, 0xc2, 0xd1, 0xd4, 0xc4, 0xcb, 0xb8, 0xcb, 0x89, 0xd7, - 0x03, 0x20, 0x1b, 0x11, 0x57, 0x66, 0xf1, 0x98, 0x9a, 0xe8, 0xa2, 0xeb, 0x88, 0xd1, 0x8b, 0xf3, - 0x60, 0x88, 0xf9, 0x09, 0x2f, 0x81, 0x2c, 0xb1, 0x0e, 0xb9, 0xd5, 0xf1, 0xf2, 0x08, 0x13, 0x41, - 0xd6, 0x21, 0x62, 0xb4, 0xe2, 0x5f, 0xe6, 0xc1, 0xf9, 0xd4, 0xb3, 0xc0, 0x19, 0x90, 0x51, 0x63, - 0x62, 0x20, 0x8d, 0x66, 0xd6, 0x57, 0x51, 0xc6, 0xb1, 0xe1, 0xd3, 0xaa, 0xf8, 0x0a, 0xd0, 0x82, - 0x3a, 0x4b, 0x38, 0x95, 0xf5, 0xe7, 0x89, 0x39, 0xe6, 0x48, 0x5c, 0x38, 0x99, 0x0f, 0x78, 0x4f, - 0xee, 0x12, 0xe1, 0x03, 0xde, 0x43, 0x8c, 0xf6, 0x69, 0xc7, 0x7d, 0xf1, 0xbc, 0x31, 0x77, 0x17, - 0xf3, 0xc6, 0xe1, 0xdb, 0xce, 0x1b, 0x1f, 0x04, 0xb9, 0xd0, 0x09, 0x5d, 0xcc, 0x0f, 0x32, 0xed, - 0x1a, 0x75, 0x83, 0x11, 0x91, 0xe0, 0xc1, 0xb7, 0xc0, 0x88, 0x8d, 0xf7, 0xac, 0xc8, 0x0d, 0xf9, - 0x99, 0x35, 0xb6, 0xb4, 0xd2, 0x87, 0x14, 0x12, 0xc3, 0xe0, 0x55, 0x61, 0x17, 0xc5, 0x00, 0xf0, - 0x21, 0x30, 0x52, 0xb7, 0x8e, 0x9c, 0x7a, 0x54, 0xe7, 0x0d, 0xa6, 0x21, 0xc4, 0x36, 0x04, 0x09, - 0xc5, 0x3c, 0x56, 0x19, 0xf1, 0x51, 0xd5, 0x8d, 0xa8, 0xd3, 0xc0, 0x92, 0x29, 0x9b, 0x3f, 0x55, - 0x19, 0xd7, 0x52, 0x7c, 0xd4, 0xa1, 0xc1, 0xc1, 0x1c, 0x8f, 0x2b, 0x8f, 0x69, 0x60, 0x82, 0x84, - 0x62, 0x5e, 0x3b, 0x98, 0x94, 0x1f, 0xef, 0x05, 0x26, 0x95, 0x3b, 0x34, 0xe0, 0xa3, 0x60, 0xb4, - 0x6e, 0x1d, 0x5d, 0xc7, 0x5e, 0x2d, 0xdc, 0x37, 0xcf, 0xce, 0x19, 0x0b, 0xd9, 0xf2, 0xd9, 0x56, - 0xb3, 0x30, 0xba, 0x11, 0x13, 0x51, 0xc2, 0xe7, 0xc2, 0x8e, 0x27, 0x85, 0xcf, 0x69, 0xc2, 0x31, - 0x11, 0x25, 0x7c, 0xd6, 0xbd, 0x04, 0x56, 0xc8, 0x36, 0x97, 0x79, 0xbe, 0xfd, 0x9a, 0xbb, 0x2d, - 0xc8, 0x28, 0xe6, 0xc3, 0x05, 0x90, 0xaf, 0x5b, 0x47, 0x7c, 0x24, 0x61, 0x4e, 0x70, 0xb3, 0x7c, - 0x30, 0xbe, 0x21, 0x69, 0x48, 0x71, 0xb9, 0xa4, 0xe3, 0x09, 0xc9, 0x49, 0x4d, 0x52, 0xd2, 0x90, - 0xe2, 0xb2, 0x24, 0x8e, 0x3c, 0xe7, 0x56, 0x84, 0x85, 0x30, 0xe4, 0x91, 0x51, 0x49, 0x7c, 0x33, - 0x61, 0x21, 0x5d, 0x0e, 0x96, 0x00, 0xa8, 0x47, 0x6e, 0xe8, 0x04, 0x2e, 0xde, 0xda, 0x33, 0x2f, - 0xf0, 0xf8, 0xf3, 0xa6, 0x7f, 0x43, 0x51, 0x91, 0x26, 0x01, 0x31, 0x18, 0xc2, 0x5e, 0x54, 0x37, - 0x2f, 0xf2, 0x83, 0xbd, 0x2f, 0x29, 0xa8, 0x76, 0xce, 0x9a, 0x17, 0xd5, 0x11, 0x37, 0x0f, 0x9f, - 0x06, 0x67, 0xeb, 0xd6, 0x11, 0x2b, 0x07, 0x98, 0x84, 0x0e, 0xa6, 0xe6, 0x14, 0x7f, 0xf8, 0x49, - 0xd6, 0xed, 0x6e, 0xe8, 0x0c, 0xd4, 0x2e, 0xc7, 0x15, 0x1d, 0x4f, 0x53, 0x9c, 0xd6, 0x14, 0x75, - 0x06, 0x6a, 0x97, 0x63, 0x91, 0x26, 0xf8, 0x56, 0xe4, 0x10, 0x6c, 0x9b, 0xf7, 0xf1, 0x06, 0x59, - 0xbe, 0xac, 0x10, 0x34, 0xa4, 0xb8, 0xb0, 0x11, 0xcf, 0xae, 0x4c, 0xbe, 0x0d, 0x6f, 0xf6, 0xb7, - 0x92, 0x6f, 0x91, 0x65, 0x42, 0xac, 0x63, 0x71, 0xd2, 0xe8, 0x53, 0x2b, 0x48, 0x41, 0xce, 0x72, - 0xdd, 0xad, 0x3d, 0xf3, 0x12, 0x8f, 0x7d, 0xbf, 0x4f, 0x10, 0x55, 0x75, 0x96, 0x19, 0x08, 0x12, - 0x58, 0x0c, 0xd4, 0xf7, 0x58, 0x6a, 0xcc, 0x0c, 0x16, 0x74, 0x8b, 0x81, 0x20, 0x81, 0xc5, 0x9f, - 0xd4, 0x3b, 0xde, 0xda, 0x33, 0xef, 0x1f, 0xf0, 0x93, 0x32, 0x10, 0x24, 0xb0, 0xa0, 0x03, 0xb2, - 0x9e, 0x1f, 0x9a, 0x97, 0x07, 0x72, 0x3c, 0xf3, 0x03, 0x67, 0xd3, 0x0f, 0x11, 0xc3, 0x80, 0x3f, - 0x36, 0x00, 0x08, 0x92, 0x14, 0x7d, 0xa0, 0x2f, 0x23, 0x91, 0x14, 0x64, 0x29, 0xc9, 0xed, 0x35, - 0x2f, 0x24, 0xc7, 0xc9, 0xf5, 0x48, 0xdb, 0x03, 0x9a, 0x17, 0xf0, 0x17, 0x06, 0xb8, 0xa8, 0xb7, - 0xc9, 0xca, 0xbd, 0x59, 0x1e, 0x91, 0x1b, 0xfd, 0x4e, 0xf3, 0xb2, 0xef, 0xbb, 0x65, 0xb3, 0xd5, - 0x2c, 0x5c, 0x5c, 0xee, 0x82, 0x8a, 0xba, 0xfa, 0x02, 0x7f, 0x6b, 0x80, 0x49, 0x59, 0x45, 0x35, - 0x0f, 0x0b, 0x3c, 0x80, 0xb8, 0xdf, 0x01, 0x4c, 0xe3, 0x88, 0x38, 0xaa, 0x97, 0xec, 0x1d, 0x7c, - 0xd4, 0xe9, 0x1a, 0xfc, 0x83, 0x01, 0xc6, 0x6d, 0x1c, 0x60, 0xcf, 0xc6, 0x5e, 0x95, 0xf9, 0x3a, - 0xd7, 0x97, 0x91, 0x45, 0xda, 0xd7, 0x55, 0x0d, 0x42, 0xb8, 0x59, 0x92, 0x6e, 0x8e, 0xeb, 0xac, - 0x93, 0x66, 0x61, 0x3a, 0x51, 0xd5, 0x39, 0xa8, 0xcd, 0x4b, 0xf8, 0x9e, 0x01, 0xce, 0x27, 0x0b, - 0x20, 0x8e, 0x94, 0xf9, 0x01, 0xe6, 0x01, 0x6f, 0x5f, 0x97, 0xdb, 0x01, 0x51, 0xda, 0x03, 0xf8, - 0x3b, 0x83, 0x75, 0x6a, 0xf1, 0xbd, 0x8f, 0x9a, 0x45, 0x1e, 0xcb, 0x37, 0xfa, 0x1e, 0x4b, 0x85, - 0x20, 0x42, 0x79, 0x35, 0x69, 0x05, 0x15, 0xe7, 0xa4, 0x59, 0x98, 0xd2, 0x23, 0xa9, 0x18, 0x48, - 0xf7, 0x10, 0x7e, 0xcf, 0x00, 0xe3, 0x38, 0xe9, 0xb8, 0xa9, 0xf9, 0x60, 0x5f, 0x82, 0xd8, 0xb5, - 0x89, 0x17, 0x37, 0x75, 0x8d, 0x45, 0x51, 0x1b, 0x36, 0xeb, 0x20, 0xf1, 0x91, 0x55, 0x0f, 0x5c, - 0x6c, 0xfe, 0x4f, 0x9f, 0x3b, 0xc8, 0x35, 0x61, 0x17, 0xc5, 0x00, 0xf0, 0x2a, 0xc8, 0x7b, 0x91, - 0xeb, 0x5a, 0xbb, 0x2e, 0x36, 0x1f, 0xe2, 0xbd, 0x88, 0x1a, 0xc9, 0x6e, 0x4a, 0x3a, 0x52, 0x12, - 0x70, 0x0f, 0xcc, 0x1d, 0xbd, 0xa8, 0x3e, 0x4f, 0xea, 0x3a, 0x34, 0x34, 0xaf, 0x70, 0x2b, 0x33, - 0xad, 0x66, 0x61, 0x7a, 0xa7, 0xfb, 0x58, 0xf1, 0x8e, 0x36, 0xe0, 0x2b, 0xe0, 0x7e, 0x4d, 0x66, - 0xad, 0xbe, 0x8b, 0x6d, 0x1b, 0xdb, 0xf1, 0xc5, 0xcd, 0xfc, 0x5f, 0x31, 0xb8, 0x8c, 0x37, 0xf8, - 0x4e, 0x5a, 0x00, 0xdd, 0x4e, 0x1b, 0x5e, 0x07, 0xd3, 0x1a, 0x7b, 0xdd, 0x0b, 0xb7, 0x48, 0x25, - 0x24, 0x8e, 0x57, 0x33, 0x17, 0xb8, 0xdd, 0x8b, 0xf1, 0x8e, 0xdc, 0xd1, 0x78, 0xa8, 0x87, 0x0e, - 0xfc, 0x62, 0x9b, 0x35, 0xfe, 0x0a, 0xcd, 0x0a, 0x5e, 0xc4, 0xc7, 0xd4, 0x7c, 0x98, 0x77, 0x27, - 0x7c, 0xb1, 0x77, 0x34, 0x3a, 0xea, 0x21, 0x0f, 0xbf, 0x00, 0x2e, 0xa4, 0x38, 0xec, 0x8a, 0x62, - 0x3e, 0x22, 0xee, 0x1a, 0xac, 0x9f, 0xdd, 0x89, 0x89, 0xa8, 0x9b, 0x24, 0xfc, 0x3c, 0x80, 0x1a, - 0x79, 0xc3, 0x0a, 0xb8, 0xfe, 0xa3, 0xe2, 0xda, 0xc3, 0x56, 0x74, 0x47, 0xd2, 0x50, 0x17, 0x39, - 0xf8, 0x53, 0xa3, 0xed, 0x49, 0x92, 0xdb, 0x31, 0x35, 0xaf, 0xf2, 0xfd, 0xbb, 0x71, 0xca, 0x2c, - 0xd4, 0xde, 0x83, 0x44, 0x2e, 0xd6, 0xc2, 0xac, 0x41, 0xa1, 0x1e, 0x2e, 0xcc, 0xb0, 0x1b, 0x7a, - 0xaa, 0xc2, 0xc3, 0x09, 0x90, 0x3d, 0xc0, 0xf2, 0xab, 0x0a, 0xc4, 0x7e, 0x42, 0x1b, 0xe4, 0x1a, - 0x96, 0x1b, 0xc5, 0x43, 0x86, 0x3e, 0x77, 0x07, 0x48, 0x18, 0x7f, 0x36, 0xf3, 0x8c, 0x31, 0xf3, - 0xbe, 0x01, 0xa6, 0xbb, 0x1f, 0x3c, 0xf7, 0xd4, 0xad, 0x9f, 0x19, 0x60, 0xb2, 0xe3, 0x8c, 0xe9, - 0xe2, 0xd1, 0xad, 0x76, 0x8f, 0x5e, 0xe9, 0xf7, 0x61, 0x21, 0x36, 0x07, 0xef, 0x90, 0x75, 0xf7, - 0x7e, 0x68, 0x80, 0x89, 0x74, 0xd9, 0xbe, 0x97, 0xf1, 0x2a, 0xbe, 0x9f, 0x01, 0xd3, 0xdd, 0x1b, - 0x7b, 0x48, 0xd4, 0x04, 0x63, 0x30, 0x93, 0xa0, 0x6e, 0x53, 0xe3, 0x77, 0x0c, 0x30, 0xf6, 0x96, - 0x92, 0x8b, 0xdf, 0xba, 0xf7, 0x7d, 0x06, 0x15, 0x9f, 0x93, 0x09, 0x83, 0x22, 0x1d, 0xb7, 0xf8, - 0x7b, 0x03, 0x4c, 0x75, 0x6d, 0x00, 0xe0, 0x15, 0x30, 0x6c, 0xb9, 0xae, 0x7f, 0x28, 0x46, 0x89, - 0xda, 0x3b, 0x82, 0x65, 0x4e, 0x45, 0x92, 0xab, 0x45, 0x2f, 0xf3, 0x59, 0x45, 0xaf, 0xf8, 0x27, - 0x03, 0x5c, 0xbe, 0x5d, 0x26, 0xde, 0x93, 0x25, 0x5d, 0x00, 0x79, 0xd9, 0xbc, 0x1f, 0xf3, 0xe5, - 0x94, 0xa5, 0x58, 0x16, 0x0d, 0xfe, 0xa1, 0x99, 0xf8, 0x55, 0xfc, 0xc0, 0x00, 0x13, 0x15, 0x4c, - 0x1a, 0x4e, 0x15, 0x23, 0xbc, 0x87, 0x09, 0xf6, 0xaa, 0x18, 0x2e, 0x82, 0x51, 0xfe, 0xba, 0x3b, - 0xb0, 0xaa, 0xf1, 0xab, 0x9b, 0x49, 0x19, 0xf2, 0xd1, 0xcd, 0x98, 0x81, 0x12, 0x19, 0xf5, 0x9a, - 0x27, 0xd3, 0xf3, 0x35, 0xcf, 0x65, 0x30, 0x14, 0x24, 0x83, 0xe8, 0x3c, 0xe3, 0xf2, 0xd9, 0x33, - 0xa7, 0x72, 0xae, 0x4f, 0x42, 0x3e, 0x5d, 0xcb, 0x49, 0xae, 0x4f, 0x42, 0xc4, 0xa9, 0xc5, 0x5f, - 0x1b, 0xe0, 0x5c, 0x7b, 0x1d, 0x67, 0x80, 0x24, 0x72, 0x3b, 0xde, 0x2b, 0x31, 0x1e, 0xe2, 0x1c, - 0xfd, 0x73, 0x97, 0xcc, 0xed, 0x3f, 0x77, 0x81, 0xcf, 0x83, 0x49, 0xf9, 0x73, 0xed, 0x28, 0x20, - 0x98, 0xf2, 0x77, 0xa7, 0xd9, 0xf6, 0x8f, 0x66, 0x37, 0xd2, 0x02, 0xa8, 0x53, 0xa7, 0xf8, 0x67, - 0x03, 0x74, 0xfb, 0x76, 0x0d, 0x5e, 0x12, 0x93, 0x50, 0x6d, 0xbc, 0x18, 0x4f, 0x41, 0x61, 0x03, - 0x8c, 0x50, 0x11, 0x7e, 0x99, 0x1e, 0x5b, 0xa7, 0x4c, 0x8f, 0xf4, 0x62, 0x8a, 0x16, 0x2c, 0xa6, - 0xc6, 0x60, 0x2c, 0x43, 0xaa, 0x56, 0x39, 0xf2, 0x6c, 0x39, 0x1c, 0x1f, 0x17, 0x19, 0xb2, 0xb2, - 0x2c, 0x68, 0x48, 0x71, 0xcb, 0xd5, 0x0f, 0x3f, 0x99, 0x3d, 0xf3, 0xd1, 0x27, 0xb3, 0x67, 0x3e, - 0xfe, 0x64, 0xf6, 0xcc, 0x37, 0x5a, 0xb3, 0xc6, 0x87, 0xad, 0x59, 0xe3, 0xa3, 0xd6, 0xac, 0xf1, - 0x71, 0x6b, 0xd6, 0xf8, 0x7b, 0x6b, 0xd6, 0xf8, 0xd1, 0x3f, 0x66, 0xcf, 0x7c, 0xe5, 0xb9, 0x53, - 0x7d, 0x2e, 0xfe, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x11, 0x77, 0x12, 0x7e, 0x87, 0x2e, 0x00, - 0x00, + // 3144 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0x1c, 0x47, + 0xd9, 0xf7, 0xec, 0x6a, 0xa5, 0x55, 0x4b, 0xb6, 0xa5, 0xb6, 0xa5, 0x8c, 0x15, 0x47, 0x2b, 0xaf, + 0xdf, 0xf8, 0x55, 0x12, 0x67, 0x95, 0xf8, 0x4d, 0xde, 0x84, 0x40, 0x8a, 0xd2, 0x4a, 0x72, 0x50, + 0x62, 0x59, 0xa2, 0xd7, 0x76, 0x04, 0xf9, 0x1c, 0xed, 0xf4, 0xae, 0x26, 0x9a, 0x9d, 0x19, 0x77, + 0xcf, 0xac, 0xa4, 0x0a, 0x50, 0x7c, 0x54, 0x0a, 0x8a, 0x02, 0x42, 0x91, 0x5c, 0x28, 0xe0, 0x10, + 0x28, 0x2e, 0x1c, 0xe0, 0x00, 0x37, 0xf8, 0x03, 0x72, 0x4c, 0x51, 0x1c, 0x72, 0xa0, 0x16, 0xb2, + 0x5c, 0x39, 0x52, 0x45, 0x95, 0x4e, 0x54, 0x7f, 0x4c, 0x4f, 0xef, 0xec, 0xae, 0xed, 0x8a, 0x76, + 0x63, 0x6e, 0xbb, 0xcf, 0xd7, 0xef, 0x99, 0xa7, 0x9f, 0x7e, 0xfa, 0xe9, 0x67, 0x06, 0xd4, 0xf6, + 0x9e, 0xa5, 0x25, 0xc7, 0x5f, 0xda, 0x8b, 0x76, 0x30, 0xf1, 0x70, 0x88, 0xe9, 0x52, 0x13, 0x7b, + 0xb6, 0x4f, 0x96, 0x24, 0xc3, 0x0a, 0x1c, 0x7c, 0x10, 0x62, 0x8f, 0x3a, 0xbe, 0x47, 0x1f, 0xb7, + 0x02, 0x87, 0x62, 0xd2, 0xc4, 0x64, 0x29, 0xd8, 0xab, 0x33, 0x1e, 0xed, 0x14, 0x58, 0x6a, 0x3e, + 0xb9, 0x83, 0x43, 0xeb, 0xc9, 0xa5, 0x3a, 0xf6, 0x30, 0xb1, 0x42, 0x6c, 0x97, 0x02, 0xe2, 0x87, + 0x3e, 0x7c, 0x5e, 0x98, 0x2b, 0x75, 0x48, 0xbf, 0xa1, 0xcc, 0x95, 0x82, 0xbd, 0x3a, 0xe3, 0xd1, + 0x4e, 0x81, 0x92, 0x34, 0x37, 0xf7, 0x78, 0xdd, 0x09, 0x77, 0xa3, 0x9d, 0x52, 0xd5, 0x6f, 0x2c, + 0xd5, 0xfd, 0xba, 0xbf, 0xc4, 0xad, 0xee, 0x44, 0x35, 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x04, 0xda, + 0xdc, 0x53, 0x89, 0xf3, 0x0d, 0xab, 0xba, 0xeb, 0x78, 0x98, 0x1c, 0x26, 0x1e, 0x37, 0x70, 0x68, + 0x2d, 0x35, 0xbb, 0x7c, 0x9c, 0x5b, 0xea, 0xa7, 0x45, 0x22, 0x2f, 0x74, 0x1a, 0xb8, 0x4b, 0xe1, + 0xff, 0xef, 0xa6, 0x40, 0xab, 0xbb, 0xb8, 0x61, 0xa5, 0xf5, 0x8a, 0x47, 0x06, 0x98, 0x5e, 0xf1, + 0xbd, 0x26, 0x26, 0xec, 0x29, 0x11, 0xbe, 0x1d, 0x61, 0x1a, 0xc2, 0x32, 0xc8, 0x46, 0x8e, 0x6d, + 0x1a, 0x0b, 0xc6, 0xe2, 0x78, 0xf9, 0x89, 0x0f, 0x5b, 0x85, 0x13, 0xed, 0x56, 0x21, 0x7b, 0x73, + 0x7d, 0xf5, 0xa8, 0x55, 0xb8, 0xd0, 0x0f, 0x29, 0x3c, 0x0c, 0x30, 0x2d, 0xdd, 0x5c, 0x5f, 0x45, + 0x4c, 0x19, 0xbe, 0x00, 0xa6, 0x6d, 0x4c, 0x1d, 0x82, 0xed, 0xe5, 0xad, 0xf5, 0x5b, 0xc2, 0xbe, + 0x99, 0xe1, 0x16, 0xcf, 0x49, 0x8b, 0xd3, 0xab, 0x69, 0x01, 0xd4, 0xad, 0x03, 0xb7, 0xc1, 0x98, + 0xbf, 0xf3, 0x16, 0xae, 0x86, 0xd4, 0xcc, 0x2e, 0x64, 0x17, 0x27, 0xae, 0x3c, 0x5e, 0x4a, 0x56, + 0x50, 0xb9, 0xc0, 0x97, 0x4d, 0x3e, 0x6c, 0x09, 0x59, 0xfb, 0x6b, 0xf1, 0xca, 0x95, 0x4f, 0x4b, + 0xb4, 0xb1, 0x4d, 0x61, 0x05, 0xc5, 0xe6, 0x8a, 0xbf, 0xca, 0x00, 0xa8, 0x3f, 0x3c, 0x0d, 0x7c, + 0x8f, 0xe2, 0x81, 0x3c, 0x3d, 0x05, 0x53, 0x55, 0x6e, 0x39, 0xc4, 0xb6, 0xc4, 0x35, 0x33, 0x9f, + 0xc6, 0x7b, 0x53, 0xe2, 0x4f, 0xad, 0xa4, 0xcc, 0xa1, 0x2e, 0x00, 0x78, 0x03, 0x8c, 0x12, 0x4c, + 0x23, 0x37, 0x34, 0xb3, 0x0b, 0xc6, 0xe2, 0xc4, 0x95, 0xcb, 0x7d, 0xa1, 0x78, 0x7e, 0xb3, 0xe4, + 0x2b, 0x35, 0x9f, 0x2c, 0x55, 0x42, 0x2b, 0x8c, 0x68, 0xf9, 0x94, 0x44, 0x1a, 0x45, 0xdc, 0x06, + 0x92, 0xb6, 0x8a, 0xdf, 0xcb, 0x80, 0x29, 0x3d, 0x4a, 0x4d, 0x07, 0xef, 0xc3, 0x7d, 0x30, 0x46, + 0x44, 0xb2, 0xf0, 0x38, 0x4d, 0x5c, 0xd9, 0x2a, 0x1d, 0x6b, 0x5b, 0x95, 0xba, 0x92, 0xb0, 0x3c, + 0xc1, 0xd6, 0x4c, 0xfe, 0x41, 0x31, 0x1a, 0x7c, 0x1b, 0xe4, 0x89, 0x5c, 0x28, 0x9e, 0x4d, 0x13, + 0x57, 0xbe, 0x3c, 0x40, 0x64, 0x61, 0xb8, 0x3c, 0xd9, 0x6e, 0x15, 0xf2, 0xf1, 0x3f, 0xa4, 0x00, + 0x8b, 0xef, 0x65, 0xc0, 0xfc, 0x4a, 0x44, 0x43, 0xbf, 0x81, 0x30, 0xf5, 0x23, 0x52, 0xc5, 0x2b, + 0xbe, 0x1b, 0x35, 0xbc, 0x55, 0x5c, 0x73, 0x3c, 0x27, 0x64, 0xd9, 0xba, 0x00, 0x46, 0x3c, 0xab, + 0x81, 0x65, 0xf6, 0x4c, 0xca, 0x98, 0x8e, 0x5c, 0xb7, 0x1a, 0x18, 0x71, 0x0e, 0x93, 0x60, 0xc9, + 0x22, 0xf7, 0x82, 0x92, 0xb8, 0x71, 0x18, 0x60, 0xc4, 0x39, 0xf0, 0x12, 0x18, 0xad, 0xf9, 0xa4, + 0x61, 0x89, 0x75, 0x1c, 0x4f, 0x56, 0xe6, 0x2a, 0xa7, 0x22, 0xc9, 0x85, 0x4f, 0x83, 0x09, 0x1b, + 0xd3, 0x2a, 0x71, 0x02, 0x06, 0x6d, 0x8e, 0x70, 0xe1, 0x33, 0x52, 0x78, 0x62, 0x35, 0x61, 0x21, + 0x5d, 0x0e, 0x5e, 0x06, 0xf9, 0x80, 0x38, 0x3e, 0x71, 0xc2, 0x43, 0x33, 0xb7, 0x60, 0x2c, 0xe6, + 0xca, 0x53, 0x52, 0x27, 0xbf, 0x25, 0xe9, 0x48, 0x49, 0xc0, 0x05, 0x90, 0x7f, 0xb1, 0xb2, 0x79, + 0x7d, 0xcb, 0x0a, 0x77, 0xcd, 0x51, 0x8e, 0x30, 0xc2, 0xa4, 0x91, 0xa2, 0x16, 0xff, 0x9a, 0x01, + 0x66, 0x3a, 0x2a, 0x71, 0x48, 0xe1, 0x55, 0x90, 0xa7, 0x21, 0xab, 0x38, 0xf5, 0x43, 0x19, 0x93, + 0x47, 0x63, 0xb0, 0x8a, 0xa4, 0x1f, 0xb5, 0x0a, 0xb3, 0x89, 0x46, 0x4c, 0xe5, 0xf1, 0x50, 0xba, + 0xf0, 0x17, 0x06, 0x38, 0xb3, 0x8f, 0x77, 0x76, 0x7d, 0x7f, 0x6f, 0xc5, 0x75, 0xb0, 0x17, 0xae, + 0xf8, 0x5e, 0xcd, 0xa9, 0xcb, 0x1c, 0x40, 0xc7, 0xcc, 0x81, 0x97, 0xbb, 0x2d, 0x97, 0x1f, 0x68, + 0xb7, 0x0a, 0x67, 0x7a, 0x30, 0x50, 0x2f, 0x3f, 0xe0, 0x36, 0x30, 0xab, 0xa9, 0x4d, 0x22, 0x0b, + 0x98, 0x28, 0x5b, 0xe3, 0xe5, 0xf3, 0xed, 0x56, 0xc1, 0x5c, 0xe9, 0x23, 0x83, 0xfa, 0x6a, 0x17, + 0xbf, 0x93, 0x4d, 0x87, 0x57, 0x4b, 0xb7, 0x37, 0x41, 0x9e, 0x6d, 0x63, 0xdb, 0x0a, 0x2d, 0xb9, + 0x11, 0x9f, 0xb8, 0xb7, 0x4d, 0x2f, 0x6a, 0xc6, 0x06, 0x0e, 0xad, 0x32, 0x94, 0x0b, 0x02, 0x12, + 0x1a, 0x52, 0x56, 0xe1, 0xd7, 0xc1, 0x08, 0x0d, 0x70, 0x55, 0x06, 0xfa, 0x95, 0xe3, 0x6e, 0xb6, + 0x3e, 0x0f, 0x52, 0x09, 0x70, 0x35, 0xd9, 0x0b, 0xec, 0x1f, 0xe2, 0xb0, 0xf0, 0x1d, 0x03, 0x8c, + 0x52, 0x5e, 0xa0, 0x64, 0x51, 0x7b, 0x6d, 0x58, 0x1e, 0xa4, 0xaa, 0xa0, 0xf8, 0x8f, 0x24, 0x78, + 0xf1, 0x5f, 0x19, 0x70, 0xa1, 0x9f, 0xea, 0x8a, 0xef, 0xd9, 0x62, 0x39, 0xd6, 0xe5, 0xde, 0x16, + 0x99, 0xfe, 0xb4, 0xbe, 0xb7, 0x8f, 0x5a, 0x85, 0x87, 0xef, 0x6a, 0x40, 0x2b, 0x02, 0x9f, 0x53, + 0xcf, 0x2d, 0x0a, 0xc5, 0x85, 0x4e, 0xc7, 0x8e, 0x5a, 0x85, 0xd3, 0x4a, 0xad, 0xd3, 0x57, 0xd8, + 0x04, 0xd0, 0xb5, 0x68, 0x78, 0x83, 0x58, 0x1e, 0x15, 0x66, 0x9d, 0x06, 0x96, 0xe1, 0x7b, 0xf4, + 0xde, 0xd2, 0x83, 0x69, 0x94, 0xe7, 0x24, 0x24, 0xbc, 0xd6, 0x65, 0x0d, 0xf5, 0x40, 0x60, 0x75, + 0x8b, 0x60, 0x8b, 0xaa, 0x52, 0xa4, 0x9d, 0x28, 0x8c, 0x8a, 0x24, 0x17, 0x3e, 0x02, 0xc6, 0x1a, + 0x98, 0x52, 0xab, 0x8e, 0x79, 0xfd, 0x19, 0x4f, 0x8e, 0xe8, 0x0d, 0x41, 0x46, 0x31, 0x9f, 0xf5, + 0x27, 0xe7, 0xfb, 0x45, 0xed, 0x9a, 0x43, 0x43, 0xf8, 0x6a, 0xd7, 0x06, 0x28, 0xdd, 0xdb, 0x13, + 0x32, 0x6d, 0x9e, 0xfe, 0xaa, 0xf8, 0xc5, 0x14, 0x2d, 0xf9, 0xbf, 0x06, 0x72, 0x4e, 0x88, 0x1b, + 0xf1, 0xd9, 0xfd, 0xf2, 0x90, 0x72, 0xaf, 0x7c, 0x52, 0xfa, 0x90, 0x5b, 0x67, 0x68, 0x48, 0x80, + 0x16, 0x7f, 0x9d, 0x01, 0x0f, 0xf5, 0x53, 0x61, 0x07, 0x0a, 0x65, 0x11, 0x0f, 0xdc, 0x88, 0x58, + 0xae, 0xcc, 0x38, 0x15, 0xf1, 0x2d, 0x4e, 0x45, 0x92, 0xcb, 0x4a, 0x3e, 0x75, 0xbc, 0x7a, 0xe4, + 0x5a, 0x44, 0xa6, 0x93, 0x7a, 0xea, 0x8a, 0xa4, 0x23, 0x25, 0x01, 0x4b, 0x00, 0xd0, 0x5d, 0x9f, + 0x84, 0x1c, 0x43, 0x56, 0xaf, 0x53, 0xac, 0x40, 0x54, 0x14, 0x15, 0x69, 0x12, 0xec, 0x44, 0xdb, + 0x73, 0x3c, 0x5b, 0xae, 0xba, 0xda, 0xc5, 0x2f, 0x39, 0x9e, 0x8d, 0x38, 0x87, 0xe1, 0xbb, 0x0e, + 0x0d, 0x19, 0x45, 0x2e, 0x79, 0x47, 0xd4, 0xb9, 0xa4, 0x92, 0x60, 0xf8, 0x55, 0x56, 0xf5, 0x7d, + 0xe2, 0x60, 0x6a, 0x8e, 0x26, 0xf8, 0x2b, 0x8a, 0x8a, 0x34, 0x89, 0xe2, 0x3f, 0xf3, 0xfd, 0x93, + 0x84, 0x95, 0x12, 0x78, 0x11, 0xe4, 0xea, 0xc4, 0x8f, 0x02, 0x19, 0x25, 0x15, 0xed, 0x17, 0x18, + 0x11, 0x09, 0x1e, 0xcb, 0xca, 0x66, 0x47, 0x9b, 0xaa, 0xb2, 0x32, 0x6e, 0x4e, 0x63, 0x3e, 0xfc, + 0x96, 0x01, 0x72, 0x9e, 0x0c, 0x0e, 0x4b, 0xb9, 0x57, 0x87, 0x94, 0x17, 0x3c, 0xbc, 0x89, 0xbb, + 0x22, 0xf2, 0x02, 0x19, 0x3e, 0x05, 0x72, 0xb4, 0xea, 0x07, 0x58, 0x46, 0x7d, 0x3e, 0x16, 0xaa, + 0x30, 0xe2, 0x51, 0xab, 0x70, 0x32, 0x36, 0xc7, 0x09, 0x48, 0x08, 0xc3, 0xef, 0x1a, 0x00, 0x34, + 0x2d, 0xd7, 0xb1, 0x2d, 0xde, 0x32, 0xe4, 0xb8, 0xfb, 0x83, 0x4d, 0xeb, 0x5b, 0xca, 0xbc, 0x58, + 0xb4, 0xe4, 0x3f, 0xd2, 0xa0, 0xe1, 0xbb, 0x06, 0x98, 0xa4, 0xd1, 0x0e, 0x91, 0x5a, 0x94, 0x37, + 0x17, 0x13, 0x57, 0xbe, 0x32, 0x50, 0x5f, 0x2a, 0x1a, 0x40, 0x79, 0xaa, 0xdd, 0x2a, 0x4c, 0xea, + 0x14, 0xd4, 0xe1, 0x00, 0xfc, 0x81, 0x01, 0xf2, 0xcd, 0xf8, 0xcc, 0x1e, 0xe3, 0x1b, 0xfe, 0xf5, + 0x21, 0x2d, 0xac, 0xcc, 0xa8, 0x64, 0x17, 0xa8, 0x3e, 0x40, 0x79, 0x00, 0xff, 0x68, 0x00, 0xd3, + 0xb2, 0x45, 0x81, 0xb7, 0xdc, 0x2d, 0xe2, 0x78, 0x21, 0x26, 0xa2, 0xdf, 0xa4, 0x66, 0x9e, 0xbb, + 0x37, 0xd8, 0xb3, 0x30, 0xdd, 0xcb, 0x96, 0x17, 0xa4, 0x77, 0xe6, 0x72, 0x1f, 0x37, 0x50, 0x5f, + 0x07, 0x79, 0xa2, 0x25, 0x2d, 0x8d, 0x39, 0x3e, 0x84, 0x44, 0x4b, 0x7a, 0x29, 0x59, 0x1d, 0x92, + 0x0e, 0x4a, 0x83, 0x86, 0x9b, 0x60, 0x26, 0x20, 0x98, 0x03, 0xdc, 0xf4, 0xf6, 0x3c, 0x7f, 0xdf, + 0xbb, 0xea, 0x60, 0xd7, 0xa6, 0x26, 0x58, 0x30, 0x16, 0xf3, 0xe5, 0x73, 0xed, 0x56, 0x61, 0x66, + 0xab, 0x97, 0x00, 0xea, 0xad, 0x57, 0x7c, 0x37, 0x9b, 0xbe, 0x05, 0xa4, 0xbb, 0x08, 0xf8, 0xbe, + 0x78, 0x7a, 0x11, 0x1b, 0x6a, 0x1a, 0x7c, 0xb5, 0xde, 0x1c, 0x52, 0x32, 0xa9, 0x36, 0x20, 0xe9, + 0xe4, 0x14, 0x89, 0x22, 0xcd, 0x0f, 0xf8, 0x53, 0x03, 0x9c, 0xb4, 0xaa, 0x55, 0x1c, 0x84, 0xd8, + 0x16, 0xc5, 0x3d, 0xf3, 0x19, 0xd4, 0xaf, 0x19, 0xe9, 0xd5, 0xc9, 0x65, 0x1d, 0x1a, 0x75, 0x7a, + 0x02, 0x9f, 0x03, 0xa7, 0x68, 0xe8, 0x13, 0x6c, 0xa7, 0xda, 0x66, 0xd8, 0x6e, 0x15, 0x4e, 0x55, + 0x3a, 0x38, 0x28, 0x25, 0x59, 0xfc, 0x5b, 0x0e, 0x14, 0xee, 0xb2, 0xd5, 0xee, 0xe1, 0x62, 0x76, + 0x09, 0x8c, 0xf2, 0xc7, 0xb5, 0x79, 0x54, 0xf2, 0x5a, 0x2b, 0xc8, 0xa9, 0x48, 0x72, 0xd9, 0x41, + 0xc1, 0xf0, 0x59, 0xfb, 0x92, 0xe5, 0x82, 0xea, 0xa0, 0xa8, 0x08, 0x32, 0x8a, 0xf9, 0xf0, 0x0a, + 0x00, 0x36, 0x0e, 0x08, 0x66, 0x87, 0x95, 0x6d, 0x8e, 0x71, 0x69, 0xb5, 0x48, 0xab, 0x8a, 0x83, + 0x34, 0x29, 0x78, 0x15, 0xc0, 0xf8, 0x9f, 0xe3, 0x7b, 0x2f, 0x5b, 0xc4, 0x73, 0xbc, 0xba, 0x99, + 0xe7, 0x6e, 0xcf, 0xb2, 0x6e, 0x6c, 0xb5, 0x8b, 0x8b, 0x7a, 0x68, 0xc0, 0xb7, 0xc1, 0xa8, 0x18, + 0xfa, 0xf0, 0x13, 0x62, 0x88, 0x55, 0x1e, 0xf0, 0x18, 0x71, 0x28, 0x24, 0x21, 0xbb, 0xab, 0x7b, + 0xee, 0x7e, 0x57, 0xf7, 0x3b, 0x96, 0xd3, 0xd1, 0xff, 0xf2, 0x72, 0x5a, 0xfc, 0xb7, 0x91, 0xae, + 0x39, 0xda, 0xa3, 0x56, 0xaa, 0x96, 0x8b, 0xe1, 0x2a, 0x98, 0x62, 0x37, 0x26, 0x84, 0x03, 0xd7, + 0xa9, 0x5a, 0x94, 0x5f, 0xd8, 0x45, 0xb2, 0xab, 0x19, 0x52, 0x25, 0xc5, 0x47, 0x5d, 0x1a, 0xf0, + 0x45, 0x00, 0xc5, 0x2d, 0xa2, 0xc3, 0x8e, 0x68, 0x88, 0xd4, 0x7d, 0xa0, 0xd2, 0x25, 0x81, 0x7a, + 0x68, 0xc1, 0x15, 0x30, 0xed, 0x5a, 0x3b, 0xd8, 0xad, 0x60, 0x17, 0x57, 0x43, 0x9f, 0x70, 0x53, + 0x62, 0xa4, 0x31, 0xd3, 0x6e, 0x15, 0xa6, 0xaf, 0xa5, 0x99, 0xa8, 0x5b, 0xbe, 0x78, 0x21, 0xbd, + 0xb5, 0xf5, 0x07, 0x17, 0x77, 0xb3, 0x0f, 0x32, 0x60, 0xae, 0x7f, 0x66, 0xc0, 0x6f, 0x27, 0x57, + 0x48, 0x71, 0x43, 0x78, 0x7d, 0x58, 0x59, 0x28, 0xef, 0x90, 0xa0, 0xfb, 0xfe, 0x08, 0xbf, 0xc1, + 0xda, 0x35, 0xcb, 0x8d, 0x87, 0x56, 0xaf, 0x0d, 0xcd, 0x05, 0x06, 0x52, 0x1e, 0x17, 0x9d, 0xa0, + 0xe5, 0xf2, 0xc6, 0xcf, 0x72, 0x71, 0xf1, 0x37, 0x46, 0x7a, 0x8a, 0x90, 0xec, 0x60, 0xf8, 0x43, + 0x03, 0x9c, 0xf6, 0x03, 0xec, 0x2d, 0x6f, 0xad, 0xdf, 0xfa, 0x3f, 0xb1, 0x93, 0x65, 0xa8, 0xae, + 0x1f, 0xd3, 0xcf, 0x17, 0x2b, 0x9b, 0xd7, 0x85, 0xc1, 0x2d, 0xe2, 0x07, 0xb4, 0x7c, 0xa6, 0xdd, + 0x2a, 0x9c, 0xde, 0xec, 0x84, 0x42, 0x69, 0xec, 0x62, 0x03, 0xcc, 0xac, 0x1d, 0x84, 0x98, 0x78, + 0x96, 0xbb, 0xea, 0x57, 0xa3, 0x06, 0xf6, 0x42, 0xe1, 0x68, 0x6a, 0xe2, 0x65, 0xdc, 0xe3, 0xc4, + 0xeb, 0x21, 0x90, 0x8d, 0x88, 0x2b, 0xb3, 0x78, 0x42, 0x4d, 0x74, 0xd1, 0x35, 0xc4, 0xe8, 0xc5, + 0x0b, 0x60, 0x84, 0xf9, 0x09, 0xcf, 0x81, 0x2c, 0xb1, 0xf6, 0xb9, 0xd5, 0xc9, 0xf2, 0x18, 0x13, + 0x41, 0xd6, 0x3e, 0x62, 0xb4, 0xe2, 0x5f, 0x2e, 0x80, 0xd3, 0xa9, 0x67, 0x81, 0x73, 0x20, 0xa3, + 0xc6, 0xc4, 0x40, 0x1a, 0xcd, 0xac, 0xaf, 0xa2, 0x8c, 0x63, 0xc3, 0x67, 0x54, 0xf1, 0x15, 0xa0, + 0x05, 0x75, 0x96, 0x70, 0x2a, 0xeb, 0xcf, 0x13, 0x73, 0xcc, 0x91, 0xb8, 0x70, 0x32, 0x1f, 0x70, + 0x4d, 0xee, 0x12, 0xe1, 0x03, 0xae, 0x21, 0x46, 0xfb, 0xb4, 0xe3, 0xbe, 0x78, 0xde, 0x98, 0xbb, + 0x87, 0x79, 0xe3, 0xe8, 0x1d, 0xe7, 0x8d, 0x17, 0x41, 0x2e, 0x74, 0x42, 0x17, 0xf3, 0x83, 0x4c, + 0xbb, 0x46, 0xdd, 0x60, 0x44, 0x24, 0x78, 0xf0, 0x2d, 0x30, 0x66, 0xe3, 0x9a, 0x15, 0xb9, 0x21, + 0x3f, 0xb3, 0x26, 0xae, 0xac, 0x0c, 0x20, 0x85, 0xc4, 0x30, 0x78, 0x55, 0xd8, 0x45, 0x31, 0x00, + 0x7c, 0x18, 0x8c, 0x35, 0xac, 0x03, 0xa7, 0x11, 0x35, 0x78, 0x83, 0x69, 0x08, 0xb1, 0x0d, 0x41, + 0x42, 0x31, 0x8f, 0x55, 0x46, 0x7c, 0x50, 0x75, 0x23, 0xea, 0x34, 0xb1, 0x64, 0xca, 0xe6, 0x4f, + 0x55, 0xc6, 0xb5, 0x14, 0x1f, 0x75, 0x69, 0x70, 0x30, 0xc7, 0xe3, 0xca, 0x13, 0x1a, 0x98, 0x20, + 0xa1, 0x98, 0xd7, 0x09, 0x26, 0xe5, 0x27, 0xfb, 0x81, 0x49, 0xe5, 0x2e, 0x0d, 0xf8, 0x18, 0x18, + 0x6f, 0x58, 0x07, 0xd7, 0xb0, 0x57, 0x0f, 0x77, 0xcd, 0x93, 0x0b, 0xc6, 0x62, 0xb6, 0x7c, 0xb2, + 0xdd, 0x2a, 0x8c, 0x6f, 0xc4, 0x44, 0x94, 0xf0, 0xb9, 0xb0, 0xe3, 0x49, 0xe1, 0x53, 0x9a, 0x70, + 0x4c, 0x44, 0x09, 0x9f, 0x75, 0x2f, 0x81, 0x15, 0xb2, 0xcd, 0x65, 0x9e, 0xee, 0xbc, 0xe6, 0x6e, + 0x09, 0x32, 0x8a, 0xf9, 0x70, 0x11, 0xe4, 0x1b, 0xd6, 0x01, 0x1f, 0x49, 0x98, 0x53, 0xdc, 0x2c, + 0x1f, 0x8c, 0x6f, 0x48, 0x1a, 0x52, 0x5c, 0x2e, 0xe9, 0x78, 0x42, 0x72, 0x5a, 0x93, 0x94, 0x34, + 0xa4, 0xb8, 0x2c, 0x89, 0x23, 0xcf, 0xb9, 0x1d, 0x61, 0x21, 0x0c, 0x79, 0x64, 0x54, 0x12, 0xdf, + 0x4c, 0x58, 0x48, 0x97, 0x83, 0x25, 0x00, 0x1a, 0x91, 0x1b, 0x3a, 0x81, 0x8b, 0x37, 0x6b, 0xe6, + 0x19, 0x1e, 0x7f, 0xde, 0xf4, 0x6f, 0x28, 0x2a, 0xd2, 0x24, 0x20, 0x06, 0x23, 0xd8, 0x8b, 0x1a, + 0xe6, 0x59, 0x7e, 0xb0, 0x0f, 0x24, 0x05, 0xd5, 0xce, 0x59, 0xf3, 0xa2, 0x06, 0xe2, 0xe6, 0xe1, + 0x33, 0xe0, 0x64, 0xc3, 0x3a, 0x60, 0xe5, 0x00, 0x93, 0xd0, 0xc1, 0xd4, 0x9c, 0xe1, 0x0f, 0x3f, + 0xcd, 0xba, 0xdd, 0x0d, 0x9d, 0x81, 0x3a, 0xe5, 0xb8, 0xa2, 0xe3, 0x69, 0x8a, 0xb3, 0x9a, 0xa2, + 0xce, 0x40, 0x9d, 0x72, 0x2c, 0xd2, 0x04, 0xdf, 0x8e, 0x1c, 0x82, 0x6d, 0xf3, 0x01, 0xde, 0x20, + 0xcb, 0x97, 0x15, 0x82, 0x86, 0x14, 0x17, 0x36, 0xe3, 0xd9, 0x95, 0xc9, 0xb7, 0xe1, 0xcd, 0xc1, + 0x56, 0xf2, 0x4d, 0xb2, 0x4c, 0x88, 0x75, 0x28, 0x4e, 0x1a, 0x7d, 0x6a, 0x05, 0x29, 0xc8, 0x59, + 0xae, 0xbb, 0x59, 0x33, 0xcf, 0xf1, 0xd8, 0x0f, 0xfa, 0x04, 0x51, 0x55, 0x67, 0x99, 0x81, 0x20, + 0x81, 0xc5, 0x40, 0x7d, 0x8f, 0xa5, 0xc6, 0xdc, 0x70, 0x41, 0x37, 0x19, 0x08, 0x12, 0x58, 0xfc, + 0x49, 0xbd, 0xc3, 0xcd, 0x9a, 0xf9, 0xe0, 0x90, 0x9f, 0x94, 0x81, 0x20, 0x81, 0x05, 0x1d, 0x90, + 0xf5, 0xfc, 0xd0, 0x3c, 0x3f, 0x94, 0xe3, 0x99, 0x1f, 0x38, 0xd7, 0xfd, 0x10, 0x31, 0x0c, 0xf8, + 0x13, 0x03, 0x80, 0x20, 0x49, 0xd1, 0x87, 0x06, 0x32, 0x12, 0x49, 0x41, 0x96, 0x92, 0xdc, 0x5e, + 0xf3, 0x42, 0x72, 0x98, 0x5c, 0x8f, 0xb4, 0x3d, 0xa0, 0x79, 0x01, 0x7f, 0x69, 0x80, 0xb3, 0x7a, + 0x9b, 0xac, 0xdc, 0x9b, 0xe7, 0x11, 0xb9, 0x31, 0xe8, 0x34, 0x2f, 0xfb, 0xbe, 0x5b, 0x36, 0xdb, + 0xad, 0xc2, 0xd9, 0xe5, 0x1e, 0xa8, 0xa8, 0xa7, 0x2f, 0xf0, 0xb7, 0x06, 0x98, 0x96, 0x55, 0x54, + 0xf3, 0xb0, 0xc0, 0x03, 0x88, 0x07, 0x1d, 0xc0, 0x34, 0x8e, 0x88, 0xa3, 0x7a, 0xc9, 0xde, 0xc5, + 0x47, 0xdd, 0xae, 0xc1, 0x3f, 0x18, 0x60, 0xd2, 0xc6, 0x01, 0xf6, 0x6c, 0xec, 0x55, 0x99, 0xaf, + 0x0b, 0x03, 0x19, 0x59, 0xa4, 0x7d, 0x5d, 0xd5, 0x20, 0x84, 0x9b, 0x25, 0xe9, 0xe6, 0xa4, 0xce, + 0x3a, 0x6a, 0x15, 0x66, 0x13, 0x55, 0x9d, 0x83, 0x3a, 0xbc, 0x84, 0xef, 0x19, 0xe0, 0x74, 0xb2, + 0x00, 0xe2, 0x48, 0xb9, 0x30, 0xc4, 0x3c, 0xe0, 0xed, 0xeb, 0x72, 0x27, 0x20, 0x4a, 0x7b, 0x00, + 0x7f, 0x67, 0xb0, 0x4e, 0x2d, 0xbe, 0xf7, 0x51, 0xb3, 0xc8, 0x63, 0xf9, 0xc6, 0xc0, 0x63, 0xa9, + 0x10, 0x44, 0x28, 0x2f, 0x27, 0xad, 0xa0, 0xe2, 0x1c, 0xb5, 0x0a, 0x33, 0x7a, 0x24, 0x15, 0x03, + 0xe9, 0x1e, 0xc2, 0xef, 0x1b, 0x60, 0x12, 0x27, 0x1d, 0x37, 0x35, 0x2f, 0x0e, 0x24, 0x88, 0x3d, + 0x9b, 0x78, 0x71, 0x53, 0xd7, 0x58, 0x14, 0x75, 0x60, 0xb3, 0x0e, 0x12, 0x1f, 0x58, 0x8d, 0xc0, + 0xc5, 0xe6, 0xff, 0x0c, 0xb8, 0x83, 0x5c, 0x13, 0x76, 0x51, 0x0c, 0x00, 0x2f, 0x83, 0xbc, 0x17, + 0xb9, 0xae, 0xb5, 0xe3, 0x62, 0xf3, 0x61, 0xde, 0x8b, 0xa8, 0x91, 0xec, 0x75, 0x49, 0x47, 0x4a, + 0x02, 0xd6, 0xc0, 0xc2, 0xc1, 0x4b, 0xea, 0xf3, 0xa4, 0x9e, 0x43, 0x43, 0xf3, 0x12, 0xb7, 0x32, + 0xd7, 0x6e, 0x15, 0x66, 0xb7, 0x7b, 0x8f, 0x15, 0xef, 0x6a, 0x03, 0xbe, 0x02, 0x1e, 0xd4, 0x64, + 0xd6, 0x1a, 0x3b, 0xd8, 0xb6, 0xb1, 0x1d, 0x5f, 0xdc, 0xcc, 0xff, 0x15, 0x83, 0xcb, 0x78, 0x83, + 0x6f, 0xa7, 0x05, 0xd0, 0x9d, 0xb4, 0xe1, 0x35, 0x30, 0xab, 0xb1, 0xd7, 0xbd, 0x70, 0x93, 0x54, + 0x42, 0xe2, 0x78, 0x75, 0x73, 0x91, 0xdb, 0x3d, 0x1b, 0xef, 0xc8, 0x6d, 0x8d, 0x87, 0xfa, 0xe8, + 0xc0, 0x2f, 0x75, 0x58, 0xe3, 0xaf, 0xd0, 0xac, 0xe0, 0x25, 0x7c, 0x48, 0xcd, 0x47, 0x78, 0x77, + 0xc2, 0x17, 0x7b, 0x5b, 0xa3, 0xa3, 0x3e, 0xf2, 0xf0, 0x8b, 0xe0, 0x4c, 0x8a, 0xc3, 0xae, 0x28, + 0xe6, 0xa3, 0xe2, 0xae, 0xc1, 0xfa, 0xd9, 0xed, 0x98, 0x88, 0x7a, 0x49, 0xc2, 0x2f, 0x00, 0xa8, + 0x91, 0x37, 0xac, 0x80, 0xeb, 0x3f, 0x26, 0xae, 0x3d, 0x6c, 0x45, 0xb7, 0x25, 0x0d, 0xf5, 0x90, + 0x83, 0x3f, 0x33, 0x3a, 0x9e, 0x24, 0xb9, 0x1d, 0x53, 0xf3, 0x32, 0xdf, 0xbf, 0x1b, 0xc7, 0xcc, + 0x42, 0xed, 0x3d, 0x48, 0xe4, 0x62, 0x2d, 0xcc, 0x1a, 0x14, 0xea, 0xe3, 0xc2, 0x1c, 0xbb, 0xa1, + 0xa7, 0x2a, 0x3c, 0x9c, 0x02, 0xd9, 0x3d, 0x2c, 0xbf, 0xaa, 0x40, 0xec, 0x27, 0xb4, 0x41, 0xae, + 0x69, 0xb9, 0x51, 0x3c, 0x64, 0x18, 0x70, 0x77, 0x80, 0x84, 0xf1, 0xe7, 0x32, 0xcf, 0x1a, 0x73, + 0xef, 0x1b, 0x60, 0xb6, 0xf7, 0xc1, 0x73, 0x5f, 0xdd, 0xfa, 0xb9, 0x01, 0xa6, 0xbb, 0xce, 0x98, + 0x1e, 0x1e, 0xdd, 0xee, 0xf4, 0xe8, 0x95, 0x41, 0x1f, 0x16, 0x62, 0x73, 0xf0, 0x0e, 0x59, 0x77, + 0xef, 0x47, 0x06, 0x98, 0x4a, 0x97, 0xed, 0xfb, 0x19, 0xaf, 0xe2, 0xfb, 0x19, 0x30, 0xdb, 0xbb, + 0xb1, 0x87, 0x44, 0x4d, 0x30, 0x86, 0x33, 0x09, 0xea, 0x35, 0x35, 0x7e, 0xc7, 0x00, 0x13, 0x6f, + 0x29, 0xb9, 0xf8, 0xad, 0xfb, 0xc0, 0x67, 0x50, 0xf1, 0x39, 0x99, 0x30, 0x28, 0xd2, 0x71, 0x8b, + 0xbf, 0x37, 0xc0, 0x4c, 0xcf, 0x06, 0x00, 0x5e, 0x02, 0xa3, 0x96, 0xeb, 0xfa, 0xfb, 0x62, 0x94, + 0xa8, 0xbd, 0x23, 0x58, 0xe6, 0x54, 0x24, 0xb9, 0x5a, 0xf4, 0x32, 0x9f, 0x55, 0xf4, 0x8a, 0x7f, + 0x32, 0xc0, 0xf9, 0x3b, 0x65, 0xe2, 0x7d, 0x59, 0xd2, 0x45, 0x90, 0x97, 0xcd, 0xfb, 0x21, 0x5f, + 0x4e, 0x59, 0x8a, 0x65, 0xd1, 0xe0, 0x1f, 0x9a, 0x89, 0x5f, 0xc5, 0x0f, 0x0c, 0x30, 0x55, 0xc1, + 0xa4, 0xe9, 0x54, 0x31, 0xc2, 0x35, 0x4c, 0xb0, 0x57, 0xc5, 0x70, 0x09, 0x8c, 0xf3, 0xd7, 0xdd, + 0x81, 0x55, 0x8d, 0x5f, 0xdd, 0x4c, 0xcb, 0x90, 0x8f, 0x5f, 0x8f, 0x19, 0x28, 0x91, 0x51, 0xaf, + 0x79, 0x32, 0x7d, 0x5f, 0xf3, 0x9c, 0x07, 0x23, 0x41, 0x32, 0x88, 0xce, 0x33, 0x2e, 0x9f, 0x3d, + 0x73, 0x2a, 0xe7, 0xfa, 0x24, 0xe4, 0xd3, 0xb5, 0x9c, 0xe4, 0xfa, 0x24, 0x44, 0x9c, 0xca, 0xf6, + 0xcb, 0xa9, 0xce, 0x3a, 0xce, 0x00, 0x49, 0xe4, 0x76, 0xbd, 0x57, 0x62, 0x3c, 0xc4, 0x39, 0xfa, + 0xe7, 0x2e, 0x99, 0x3b, 0x7f, 0xee, 0x02, 0x5f, 0x00, 0xd3, 0xf2, 0xe7, 0xda, 0x41, 0x40, 0x30, + 0xe5, 0xef, 0x4e, 0xb3, 0x9d, 0x1f, 0xcd, 0x6e, 0xa4, 0x05, 0x50, 0xb7, 0x0e, 0xfc, 0x7c, 0xea, + 0x53, 0x9c, 0x8b, 0xc9, 0x67, 0x38, 0xac, 0x25, 0xe4, 0x7d, 0xc6, 0x2d, 0x56, 0x06, 0xd6, 0x08, + 0xf1, 0x49, 0xea, 0xfb, 0x9c, 0x25, 0x30, 0x5e, 0x63, 0x02, 0x7c, 0x5e, 0x9f, 0xeb, 0x0c, 0xfa, + 0xd5, 0x98, 0x81, 0x12, 0x99, 0xe2, 0x9f, 0x0d, 0xd0, 0xeb, 0x4b, 0x39, 0x78, 0x4e, 0xcc, 0x5d, + 0xb5, 0x61, 0x66, 0x3c, 0x73, 0x85, 0x4d, 0x30, 0x46, 0xc5, 0x62, 0xcb, 0x64, 0xdc, 0x3c, 0x66, + 0x32, 0xa6, 0x53, 0x47, 0x34, 0x7c, 0x31, 0x35, 0x06, 0x63, 0xf9, 0x58, 0xb5, 0xca, 0x91, 0x67, + 0xcb, 0x51, 0xfc, 0xa4, 0xc8, 0xc7, 0x95, 0x65, 0x41, 0x43, 0x8a, 0x5b, 0xae, 0x7e, 0xf8, 0xc9, + 0xfc, 0x89, 0x8f, 0x3e, 0x99, 0x3f, 0xf1, 0xf1, 0x27, 0xf3, 0x27, 0xbe, 0xd9, 0x9e, 0x37, 0x3e, + 0x6c, 0xcf, 0x1b, 0x1f, 0xb5, 0xe7, 0x8d, 0x8f, 0xdb, 0xf3, 0xc6, 0xdf, 0xdb, 0xf3, 0xc6, 0x8f, + 0xff, 0x31, 0x7f, 0xe2, 0xab, 0xcf, 0x1f, 0xeb, 0xe3, 0xf4, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, + 0xde, 0xe9, 0x15, 0xbf, 0xf5, 0x2e, 0x00, 0x00, } func (m *ConversionRequest) Marshal() (dAtA []byte, err error) { @@ -2658,6 +2660,18 @@ func (m *ValidationRule) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.FieldPath) + copy(dAtA[i:], m.FieldPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.FieldPath))) + i-- + dAtA[i] = 0x2a + if m.Reason != nil { + i -= len(*m.Reason) + copy(dAtA[i:], *m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + i-- + dAtA[i] = 0x22 + } i -= len(m.MessageExpression) copy(dAtA[i:], m.MessageExpression) i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) @@ -3354,6 +3368,12 @@ func (m *ValidationRule) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.MessageExpression) n += 1 + l + sovGenerated(uint64(l)) + if m.Reason != nil { + l = len(*m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.FieldPath) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -3821,6 +3841,8 @@ func (this *ValidationRule) String() string { `Rule:` + fmt.Sprintf("%v", this.Rule) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + `Reason:` + valueToStringGenerated(this.Reason) + `,`, + `FieldPath:` + fmt.Sprintf("%v", this.FieldPath) + `,`, `}`, }, "") return s @@ -9079,6 +9101,71 @@ func (m *ValidationRule) Unmarshal(dAtA []byte) error { } m.MessageExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FieldValueErrorReason(dAtA[iNdEx:postIndex]) + m.Reason = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto index feb9fd9d1..7cfb9c4dd 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto @@ -730,6 +730,26 @@ message ValidationRule { // "x must be less than max ("+string(self.max)+")" // +optional optional string messageExpression = 3; + + // reason provides a machine-readable validation failure reason that is returned to the caller when a request fails this validation rule. + // The HTTP status code returned to the caller will match the reason of the reason of the first failed validation rule. + // The currently supported reasons are: "FieldValueInvalid", "FieldValueForbidden", "FieldValueRequired", "FieldValueDuplicate". + // If not set, default to use "FieldValueInvalid". + // All future added reasons must be accepted by clients when reading this value and unknown reasons should be treated as FieldValueInvalid. + // +optional + optional string reason = 4; + + // fieldPath represents the field path returned when the validation fails. + // It must be a relative JSON path (i.e. with array notation) scoped to the location of this x-kubernetes-validations extension in the schema and refer to an existing field. + // e.g. when validation checks if a specific attribute `foo` under a map `testMap`, the fieldPath could be set to `.testMap.foo` + // If the validation checks two lists must have unique attributes, the fieldPath could be set to either of the list: e.g. `.testList` + // It does not support list numeric index. + // It supports child operation to refer to an existing field currently. Refer to [JSONPath support in Kubernetes](https://kubernetes.io/docs/reference/kubectl/jsonpath/) for more info. + // Numeric index of array is not supported. + // For field name which contains special characters, use `['specialName']` to refer the field name. + // e.g. for attribute `foo.34$` appears in a list `testList`, the fieldPath could be set to `.testList['foo.34$']` + // +optional + optional string fieldPath = 5; } // WebhookClientConfig contains the information to make a TLS connection with the webhook. diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go index ab0169f93..59a093227 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go @@ -16,6 +16,26 @@ limitations under the License. package v1beta1 +// FieldValueErrorReason is a machine-readable value providing more detail about why a field failed the validation. +// +enum +type FieldValueErrorReason string + +const ( + // FieldValueRequired is used to report required values that are not + // provided (e.g. empty strings, null values, or empty arrays). + FieldValueRequired FieldValueErrorReason = "FieldValueRequired" + // FieldValueDuplicate is used to report collisions of values that must be + // unique (e.g. unique IDs). + FieldValueDuplicate FieldValueErrorReason = "FieldValueDuplicate" + // FieldValueInvalid is used to report malformed values (e.g. failed regex + // match, too long, out of bounds). + FieldValueInvalid FieldValueErrorReason = "FieldValueInvalid" + // FieldValueForbidden is used to report valid (as per formatting rules) + // values which would be accepted under some conditions, but which are not + // permitted by the current conditions (such as security policy). + FieldValueForbidden FieldValueErrorReason = "FieldValueForbidden" +) + // JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/). type JSONSchemaProps struct { ID string `json:"id,omitempty" protobuf:"bytes,1,opt,name=id"` @@ -247,6 +267,24 @@ type ValidationRule struct { // "x must be less than max ("+string(self.max)+")" // +optional MessageExpression string `json:"messageExpression,omitempty" protobuf:"bytes,3,opt,name=messageExpression"` + // reason provides a machine-readable validation failure reason that is returned to the caller when a request fails this validation rule. + // The HTTP status code returned to the caller will match the reason of the reason of the first failed validation rule. + // The currently supported reasons are: "FieldValueInvalid", "FieldValueForbidden", "FieldValueRequired", "FieldValueDuplicate". + // If not set, default to use "FieldValueInvalid". + // All future added reasons must be accepted by clients when reading this value and unknown reasons should be treated as FieldValueInvalid. + // +optional + Reason *FieldValueErrorReason `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"` + // fieldPath represents the field path returned when the validation fails. + // It must be a relative JSON path (i.e. with array notation) scoped to the location of this x-kubernetes-validations extension in the schema and refer to an existing field. + // e.g. when validation checks if a specific attribute `foo` under a map `testMap`, the fieldPath could be set to `.testMap.foo` + // If the validation checks two lists must have unique attributes, the fieldPath could be set to either of the list: e.g. `.testList` + // It does not support list numeric index. + // It supports child operation to refer to an existing field currently. Refer to [JSONPath support in Kubernetes](https://kubernetes.io/docs/reference/kubectl/jsonpath/) for more info. + // Numeric index of array is not supported. + // For field name which contains special characters, use `['specialName']` to refer the field name. + // e.g. for attribute `foo.34$` appears in a list `testList`, the fieldPath could be set to `.testList['foo.34$']` + // +optional + FieldPath string `json:"fieldPath,omitempty" protobuf:"bytes,5,opt,name=fieldPath"` } // JSON represents any valid JSON value. diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go index ef5bc5e33..65c023f06 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go @@ -1307,6 +1307,8 @@ func autoConvert_v1beta1_ValidationRule_To_apiextensions_ValidationRule(in *Vali out.Rule = in.Rule out.Message = in.Message out.MessageExpression = in.MessageExpression + out.Reason = (*apiextensions.FieldValueErrorReason)(unsafe.Pointer(in.Reason)) + out.FieldPath = in.FieldPath return nil } @@ -1319,6 +1321,8 @@ func autoConvert_apiextensions_ValidationRule_To_v1beta1_ValidationRule(in *apie out.Rule = in.Rule out.Message = in.Message out.MessageExpression = in.MessageExpression + out.Reason = (*FieldValueErrorReason)(unsafe.Pointer(in.Reason)) + out.FieldPath = in.FieldPath return nil } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go index 26a9d4db9..9eeef6ca4 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go @@ -639,6 +639,11 @@ func (in *ServiceReference) DeepCopy() *ServiceReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValidationRule) DeepCopyInto(out *ValidationRule) { *out = *in + if in.Reason != nil { + in, out := &in.Reason, &out.Reason + *out = new(FieldValueErrorReason) + **out = **in + } return } @@ -657,7 +662,9 @@ func (in ValidationRules) DeepCopyInto(out *ValidationRules) { { in := &in *out = make(ValidationRules, len(*in)) - copy(*out, *in) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } return } } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index e47a30d3a..875b3e6de 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -27,9 +27,16 @@ import ( "unicode" "unicode/utf8" + celgo "github.com/google/cel-go/cel" + "k8s.io/apiextensions-apiserver/pkg/apihelpers" + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel" structuraldefaulting "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting" + apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" apiequality "k8s.io/apimachinery/pkg/api/equality" genericvalidation "k8s.io/apimachinery/pkg/api/validation" "k8s.io/apimachinery/pkg/util/sets" @@ -37,13 +44,8 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" celconfig "k8s.io/apiserver/pkg/apis/cel" apiservercel "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/environment" "k8s.io/apiserver/pkg/util/webhook" - - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" - apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" ) var ( @@ -59,6 +61,13 @@ const ( StaticEstimatedCRDCostLimit = 100000000 ) +var supportedValidationReason = sets.NewString( + string(apiextensions.FieldValueRequired), + string(apiextensions.FieldValueForbidden), + string(apiextensions.FieldValueInvalid), + string(apiextensions.FieldValueDuplicate), +) + // ValidateCustomResourceDefinition statically validates // context is passed for supporting context cancellation during cel validation when validating defaults func ValidateCustomResourceDefinition(ctx context.Context, obj *apiextensions.CustomResourceDefinition) field.ErrorList { @@ -81,6 +90,7 @@ func ValidateCustomResourceDefinition(ctx context.Context, obj *apiextensions.Cu requirePrunedDefaults: true, requireAtomicSetType: true, requireMapListKeysMapSetValidation: true, + celEnvironmentSet: environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion()), } allErrs := genericvalidation.ValidateObjectMeta(&obj.ObjectMeta, false, nameValidationFn, field.NewPath("metadata")) @@ -116,6 +126,54 @@ type validationOptions struct { // 1. For x-kubernetes-list-type=map list, key fields are not nullable, and are required or have a default // 2. For x-kubernetes-list-type=map or x-kubernetes-list-type=set list, the whole item must not be nullable. requireMapListKeysMapSetValidation bool + // preexistingExpressions tracks which CEL expressions existed in an object before an update. May be nil for create. + preexistingExpressions preexistingExpressions + + celEnvironmentSet *environment.EnvSet +} + +type preexistingExpressions struct { + rules sets.Set[string] + messageExpressions sets.Set[string] +} + +func (pe preexistingExpressions) RuleEnv(envSet *environment.EnvSet, expression string) *celgo.Env { + if pe.rules.Has(expression) { + return envSet.StoredExpressionsEnv() + } + return envSet.NewExpressionsEnv() +} + +func (pe preexistingExpressions) MessageExpressionEnv(envSet *environment.EnvSet, expression string) *celgo.Env { + if pe.messageExpressions.Has(expression) { + return envSet.StoredExpressionsEnv() + } + return envSet.NewExpressionsEnv() +} + +func findPreexistingExpressions(spec *apiextensions.CustomResourceDefinitionSpec) preexistingExpressions { + expressions := preexistingExpressions{rules: sets.New[string](), messageExpressions: sets.New[string]()} + if spec.Validation != nil && spec.Validation.OpenAPIV3Schema != nil { + findPreexistingExpressionsInSchema(spec.Validation.OpenAPIV3Schema, expressions) + } + for _, v := range spec.Versions { + if v.Schema != nil && v.Schema.OpenAPIV3Schema != nil { + findPreexistingExpressionsInSchema(v.Schema.OpenAPIV3Schema, expressions) + } + } + return expressions +} + +func findPreexistingExpressionsInSchema(schema *apiextensions.JSONSchemaProps, expressions preexistingExpressions) { + SchemaHas(schema, func(s *apiextensions.JSONSchemaProps) bool { + for _, v := range s.XValidations { + expressions.rules.Insert(v.Rule) + if len(v.MessageExpression) > 0 { + expressions.messageExpressions.Insert(v.Rule) + } + } + return false + }) } // ValidateCustomResourceDefinitionUpdate statically validates @@ -131,8 +189,13 @@ func ValidateCustomResourceDefinitionUpdate(ctx context.Context, obj, oldObj *ap requirePrunedDefaults: requirePrunedDefaults(&oldObj.Spec), requireAtomicSetType: requireAtomicSetType(&oldObj.Spec), requireMapListKeysMapSetValidation: requireMapListKeysMapSetValidation(&oldObj.Spec), + preexistingExpressions: findPreexistingExpressions(&oldObj.Spec), + celEnvironmentSet: environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion()), } + return validateCustomResourceDefinitionUpdate(ctx, obj, oldObj, opts) +} +func validateCustomResourceDefinitionUpdate(ctx context.Context, obj, oldObj *apiextensions.CustomResourceDefinition, opts validationOptions) field.ErrorList { allErrs := genericvalidation.ValidateObjectMetaUpdate(&obj.ObjectMeta, &oldObj.ObjectMeta, field.NewPath("metadata")) allErrs = append(allErrs, validateCustomResourceDefinitionSpecUpdate(ctx, &obj.Spec, &oldObj.Spec, opts, field.NewPath("spec"))...) allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...) @@ -155,7 +218,7 @@ func ValidateCustomResourceDefinitionStoredVersions(storedVersions []string, ver for _, v := range versions { _, ok := storedVersionsMap[v.Name] if v.Storage && !ok { - allErrs = append(allErrs, field.Invalid(fldPath, v, "must have the storage version "+v.Name)) + allErrs = append(allErrs, field.Invalid(fldPath, storedVersions, "must have the storage version "+v.Name)) } if ok { delete(storedVersionsMap, v.Name) @@ -768,7 +831,7 @@ func validateCustomResourceDefinitionValidation(ctx context.Context, customResou // if validation passed otherwise, make sure we can actually construct a schema validator from this custom resource validation. if len(allErrs) == 0 { - if _, _, err := apiservervalidation.NewSchemaValidator(customResourceValidation); err != nil { + if _, _, err := apiservervalidation.NewSchemaValidator(customResourceValidation.OpenAPIV3Schema); err != nil { allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error building validator: %v", err))) } } @@ -1000,7 +1063,6 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch if opts.requireMapListKeysMapSetValidation { allErrs.SchemaErrors = append(allErrs.SchemaErrors, validateMapListKeysMapSet(schema, fldPath)...) } - if len(schema.XValidations) > 0 { for i, rule := range schema.XValidations { trimmedRule := strings.TrimSpace(rule.Rule) @@ -1018,6 +1080,22 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch if len(rule.MessageExpression) > 0 && len(trimmedMsgExpr) == 0 { allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("messageExpression"), "messageExpression must be non-empty if specified")) } + if rule.Reason != nil && !supportedValidationReason.Has(string(*rule.Reason)) { + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.NotSupported(fldPath.Child("x-kubernetes-validations").Index(i).Child("reason"), *rule.Reason, supportedValidationReason.List())) + } + trimmedFieldPath := strings.TrimSpace(rule.FieldPath) + if len(rule.FieldPath) > 0 && len(trimmedFieldPath) == 0 { + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("fieldPath"), rule.FieldPath, "fieldPath must be non-empty if specified")) + } + if hasNewlines(rule.FieldPath) { + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("fieldPath"), rule.FieldPath, "fieldPath must not contain line breaks")) + } + if len(rule.FieldPath) > 0 { + if !pathValid(schema, rule.FieldPath) { + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("fieldPath"), rule.FieldPath, "fieldPath must be a valid path")) + } + + } } // If any schema related validation errors have been found at this level or deeper, skip CEL expression validation. @@ -1031,7 +1109,7 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } else if typeInfo == nil { allErrs.CELErrors = append(allErrs.CELErrors, field.InternalError(fldPath.Child("x-kubernetes-validations"), fmt.Errorf("internal error: failed to retrieve type information for x-kubernetes-validations"))) } else { - compResults, err := cel.Compile(typeInfo.Schema, typeInfo.DeclType, celconfig.PerCallLimit) + compResults, err := cel.Compile(typeInfo.Schema, typeInfo.DeclType, celconfig.PerCallLimit, opts.celEnvironmentSet, opts.preexistingExpressions) if err != nil { allErrs.CELErrors = append(allErrs.CELErrors, field.InternalError(fldPath.Child("x-kubernetes-validations"), err)) } else { @@ -1078,6 +1156,15 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch return allErrs } +func pathValid(schema *apiextensions.JSONSchemaProps, path string) bool { + // To avoid duplicated code and better maintain, using ValidaFieldPath func to check if the path is valid + if ss, err := structuralschema.NewStructural(schema); err == nil { + _, err := cel.ValidFieldPath(path, ss) + return err == nil + } + return true +} + // multiplyWithOverflowGuard returns the product of baseCost and cardinality unless that product // would exceed math.MaxUint, in which case math.MaxUint is returned. func multiplyWithOverflowGuard(baseCost, cardinality uint64) uint64 { diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go index 998c9dbe2..f8a5ffbfb 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go @@ -531,6 +531,11 @@ func (in *ServiceReference) DeepCopy() *ServiceReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ValidationRule) DeepCopyInto(out *ValidationRule) { *out = *in + if in.Reason != nil { + in, out := &in.Reason, &out.Reason + *out = new(FieldValueErrorReason) + **out = **in + } return } @@ -549,7 +554,9 @@ func (in ValidationRules) DeepCopyInto(out *ValidationRules) { { in := &in *out = make(ValidationRules, len(*in)) - copy(*out, *in) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } return } } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go index 35d5d6043..270c73c7f 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go @@ -19,7 +19,6 @@ package cel import ( "fmt" "strings" - "sync" "time" "github.com/google/cel-go/cel" @@ -27,8 +26,10 @@ import ( apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" + "k8s.io/apimachinery/pkg/util/version" celconfig "k8s.io/apiserver/pkg/apis/cel" apiservercel "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/environment" "k8s.io/apiserver/pkg/cel/library" "k8s.io/apiserver/pkg/cel/metrics" ) @@ -64,29 +65,45 @@ type CompilationResult struct { // MessageExpressionMaxCost represents the worst-case cost of the compiled MessageExpression in terms of CEL's cost units, // as used by cel.EstimateCost. MessageExpressionMaxCost uint64 + // NormalizedRuleFieldPath represents the relative fieldPath specified by user after normalization. + NormalizedRuleFieldPath string } -var ( - initEnvOnce sync.Once - initEnv *cel.Env - initEnvErr error -) +// EnvLoader delegates the decision of which CEL environment to use for each expression. +// Callers should return the appropriate CEL environment based on the guidelines from +// environment.NewExpressions and environment.StoredExpressions. +type EnvLoader interface { + // RuleEnv returns the appropriate environment from the EnvSet for the given CEL rule. + RuleEnv(envSet *environment.EnvSet, expression string) *cel.Env + // MessageExpressionEnv returns the appropriate environment from the EnvSet for the given + // CEL messageExpressions. + MessageExpressionEnv(envSet *environment.EnvSet, expression string) *cel.Env +} + +// NewExpressionsEnvLoader creates an EnvLoader that always uses the NewExpressions environment type. +func NewExpressionsEnvLoader() EnvLoader { + return alwaysNewEnvLoader{loadFn: func(envSet *environment.EnvSet) *cel.Env { + return envSet.NewExpressionsEnv() + }} +} + +// StoredExpressionsEnvLoader creates an EnvLoader that always uses the StoredExpressions environment type. +func StoredExpressionsEnvLoader() EnvLoader { + return alwaysNewEnvLoader{loadFn: func(envSet *environment.EnvSet) *cel.Env { + return envSet.StoredExpressionsEnv() + }} +} + +type alwaysNewEnvLoader struct { + loadFn func(envSet *environment.EnvSet) *cel.Env +} + +func (pe alwaysNewEnvLoader) RuleEnv(envSet *environment.EnvSet, _ string) *cel.Env { + return pe.loadFn(envSet) +} -// This func is duplicated in k8s.io/apiserver/pkg/admission/plugin/cel/validator.go -// If any changes are made here, consider to make the same changes there as well. -func getBaseEnv() (*cel.Env, error) { - initEnvOnce.Do(func() { - var opts []cel.EnvOption - opts = append(opts, cel.HomogeneousAggregateLiterals()) - // Validate function declarations once during base env initialization, - // so they don't need to be evaluated each time a CEL rule is compiled. - // This is a relatively expensive operation. - opts = append(opts, cel.EagerlyValidateDeclarations(true), cel.DefaultUTCTimeZone(true)) - opts = append(opts, library.ExtensionLibs...) - - initEnv, initEnvErr = cel.NewEnv(opts...) - }) - return initEnv, initEnvErr +func (pe alwaysNewEnvLoader) MessageExpressionEnv(envSet *environment.EnvSet, _ string) *cel.Env { + return pe.loadFn(envSet) } // Compile compiles all the XValidations rules (without recursing into the schema) and returns a slice containing a @@ -98,7 +115,8 @@ func getBaseEnv() (*cel.Env, error) { // - nil Program, nil Error: The provided rule was empty so compilation was not attempted // // perCallLimit was added for testing purpose only. Callers should always use const PerCallLimit from k8s.io/apiserver/pkg/apis/cel/config.go as input. -func Compile(s *schema.Structural, declType *apiservercel.DeclType, perCallLimit uint64) ([]CompilationResult, error) { +// baseEnv is used as the base CEL environment, see common.BaseEnvironment. +func Compile(s *schema.Structural, declType *apiservercel.DeclType, perCallLimit uint64, baseEnvSet *environment.EnvSet, envLoader EnvLoader) ([]CompilationResult, error) { t := time.Now() defer func() { metrics.Metrics.ObserveCompilation(time.Since(t)) @@ -109,58 +127,52 @@ func Compile(s *schema.Structural, declType *apiservercel.DeclType, perCallLimit } celRules := s.Extensions.XValidations - var propDecls []cel.EnvOption - var root *apiservercel.DeclType - var ok bool - baseEnv, err := getBaseEnv() - if err != nil { - return nil, err - } - reg := apiservercel.NewRegistry(baseEnv) - scopedTypeName := generateUniqueSelfTypeName() - rt, err := apiservercel.NewRuleTypes(scopedTypeName, declType, reg) - if err != nil { - return nil, err - } - if rt == nil { - return nil, nil - } - opts, err := rt.EnvOptions(baseEnv.TypeProvider()) - if err != nil { - return nil, err - } - root, ok = rt.FindDeclType(scopedTypeName) - if !ok { - if declType == nil { - return nil, fmt.Errorf("rule declared on schema that does not support validation rules type: '%s' x-kubernetes-preserve-unknown-fields: '%t'", s.Type, s.XPreserveUnknownFields) - } - root = declType.MaybeAssignTypeName(scopedTypeName) - } - propDecls = append(propDecls, cel.Variable(ScopedVarName, root.CelType())) - propDecls = append(propDecls, cel.Variable(OldScopedVarName, root.CelType())) - opts = append(opts, propDecls...) - env, err := baseEnv.Extend(opts...) + envSet, err := prepareEnvSet(baseEnvSet, declType) if err != nil { return nil, err } - estimator := newCostEstimator(root) + estimator := newCostEstimator(declType) // compResults is the return value which saves a list of compilation results in the same order as x-kubernetes-validations rules. compResults := make([]CompilationResult, len(celRules)) - maxCardinality := maxCardinality(root.MinSerializedSize) + maxCardinality := maxCardinality(declType.MinSerializedSize) for i, rule := range celRules { - compResults[i] = compileRule(rule, env, perCallLimit, estimator, maxCardinality) + compResults[i] = compileRule(s, rule, envSet, envLoader, estimator, maxCardinality, perCallLimit) } return compResults, nil } -func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit uint64, estimator *library.CostEstimator, maxCardinality uint64) (compilationResult CompilationResult) { +func prepareEnvSet(baseEnvSet *environment.EnvSet, declType *apiservercel.DeclType) (*environment.EnvSet, error) { + scopedType := declType.MaybeAssignTypeName(generateUniqueSelfTypeName()) + return baseEnvSet.Extend( + environment.VersionedOptions{ + // Feature epoch was actually 1.23, but we artificially set it to 1.0 because these + // options should always be present. + IntroducedVersion: version.MajorMinor(1, 0), + EnvOptions: []cel.EnvOption{ + cel.Variable(ScopedVarName, scopedType.CelType()), + }, + DeclTypes: []*apiservercel.DeclType{ + scopedType, + }, + }, + environment.VersionedOptions{ + IntroducedVersion: version.MajorMinor(1, 24), + EnvOptions: []cel.EnvOption{ + cel.Variable(OldScopedVarName, scopedType.CelType()), + }, + }, + ) +} + +func compileRule(s *schema.Structural, rule apiextensions.ValidationRule, envSet *environment.EnvSet, envLoader EnvLoader, estimator *library.CostEstimator, maxCardinality uint64, perCallLimit uint64) (compilationResult CompilationResult) { if len(strings.TrimSpace(rule.Rule)) == 0 { // include a compilation result, but leave both program and error nil per documented return semantics of this // function return } - ast, issues := env.Compile(rule.Rule) + ruleEnv := envLoader.RuleEnv(envSet, rule.Rule) + ast, issues := ruleEnv.Compile(rule.Rule) if issues != nil { compilationResult.Error = &apiservercel.Error{Type: apiservercel.ErrorTypeInvalid, Detail: "compilation failed: " + issues.String()} return @@ -184,18 +196,16 @@ func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit u } // TODO: Ideally we could configure the per expression limit at validation time and set it to the remaining overall budget, but we would either need a way to pass in a limit at evaluation time or move program creation to validation time - prog, err := env.Program(ast, - cel.EvalOptions(cel.OptOptimize, cel.OptTrackCost), + prog, err := ruleEnv.Program(ast, cel.CostLimit(perCallLimit), cel.CostTracking(estimator), - cel.OptimizeRegex(library.ExtensionLibRegexOptimizations...), cel.InterruptCheckFrequency(celconfig.CheckFrequency), ) if err != nil { compilationResult.Error = &apiservercel.Error{Type: apiservercel.ErrorTypeInvalid, Detail: "program instantiation failed: " + err.Error()} return } - costEst, err := env.EstimateCost(ast, estimator) + costEst, err := ruleEnv.EstimateCost(ast, estimator) if err != nil { compilationResult.Error = &apiservercel.Error{Type: apiservercel.ErrorTypeInternal, Detail: "cost estimation failed: " + err.Error()} return @@ -204,7 +214,8 @@ func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit u compilationResult.MaxCardinality = maxCardinality compilationResult.Program = prog if rule.MessageExpression != "" { - ast, issues := env.Compile(rule.MessageExpression) + messageEnv := envLoader.MessageExpressionEnv(envSet, rule.MessageExpression) + ast, issues := messageEnv.Compile(rule.MessageExpression) if issues != nil { compilationResult.MessageExpressionError = &apiservercel.Error{Type: apiservercel.ErrorTypeInvalid, Detail: "messageExpression compilation failed: " + issues.String()} return @@ -220,18 +231,16 @@ func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit u return } - msgProg, err := env.Program(ast, - cel.EvalOptions(cel.OptOptimize, cel.OptTrackCost), + msgProg, err := messageEnv.Program(ast, cel.CostLimit(perCallLimit), cel.CostTracking(estimator), - cel.OptimizeRegex(library.ExtensionLibRegexOptimizations...), cel.InterruptCheckFrequency(celconfig.CheckFrequency), ) if err != nil { compilationResult.MessageExpressionError = &apiservercel.Error{Type: apiservercel.ErrorTypeInvalid, Detail: "messageExpression instantiation failed: " + err.Error()} return } - costEst, err := env.EstimateCost(ast, estimator) + costEst, err := messageEnv.EstimateCost(ast, estimator) if err != nil { compilationResult.MessageExpressionError = &apiservercel.Error{Type: apiservercel.ErrorTypeInternal, Detail: "cost estimation failed for messageExpression: " + err.Error()} return @@ -239,6 +248,12 @@ func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit u compilationResult.MessageExpression = msgProg compilationResult.MessageExpressionMaxCost = costEst.Max } + if rule.FieldPath != "" { + validFieldPath, err := ValidFieldPath(rule.FieldPath, s) + if err == nil { + compilationResult.NormalizedRuleFieldPath = validFieldPath.String() + } + } return } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go index 2b630e977..3f3905bf8 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go @@ -17,6 +17,7 @@ limitations under the License. package cel import ( + "bufio" "context" "fmt" "math" @@ -30,13 +31,15 @@ import ( "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" + "k8s.io/klog/v2" + apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/model" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/environment" "k8s.io/apiserver/pkg/cel/metrics" - "k8s.io/klog/v2" celconfig "k8s.io/apiserver/pkg/apis/cel" ) @@ -82,7 +85,7 @@ func NewValidator(s *schema.Structural, isResourceRoot bool, perCallLimit uint64 // exist. declType is expected to be a CEL DeclType corresponding to the structural schema. // perCallLimit was added for testing purpose only. Callers should always use const PerCallLimit from k8s.io/apiserver/pkg/apis/cel/config.go as input. func validator(s *schema.Structural, isResourceRoot bool, declType *cel.DeclType, perCallLimit uint64) *Validator { - compiledRules, err := Compile(s, declType, perCallLimit) + compiledRules, err := Compile(s, declType, perCallLimit, environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion()), StoredExpressionsEnvLoader()) var itemsValidator, additionalPropertiesValidator *Validator var propertiesValidators map[string]Validator if s.Items != nil { @@ -257,6 +260,9 @@ func (s *Validator) validateExpressions(ctx context.Context, fldPath *field.Path continue } if evalResult != types.True { + if len(compiled.NormalizedRuleFieldPath) > 0 { + fldPath = fldPath.Child(compiled.NormalizedRuleFieldPath) + } if compiled.MessageExpression != nil { messageExpression, newRemainingBudget, msgErr := evalMessageExpression(ctx, compiled.MessageExpression, rule.MessageExpression, activation, remainingBudget) if msgErr != nil { @@ -268,21 +274,184 @@ func (s *Validator) validateExpressions(ctx context.Context, fldPath *field.Path return errs, -1 } else { klog.V(2).ErrorS(msgErr, "messageExpression evaluation failed") - errs = append(errs, field.Invalid(fldPath, sts.Type, ruleMessageOrDefault(rule))) + errs = append(errs, fieldErrorForReason(fldPath, sts.Type, ruleMessageOrDefault(rule), rule.Reason)) remainingBudget = newRemainingBudget } } else { - errs = append(errs, field.Invalid(fldPath, sts.Type, messageExpression)) + errs = append(errs, fieldErrorForReason(fldPath, sts.Type, messageExpression, rule.Reason)) remainingBudget = newRemainingBudget } } else { - errs = append(errs, field.Invalid(fldPath, sts.Type, ruleMessageOrDefault(rule))) + errs = append(errs, fieldErrorForReason(fldPath, sts.Type, ruleMessageOrDefault(rule), rule.Reason)) } } } return errs, remainingBudget } +var unescapeMatcher = regexp.MustCompile(`\\.`) + +func unescapeSingleQuote(s string) (string, error) { + var err error + unescaped := unescapeMatcher.ReplaceAllStringFunc(s, func(matchStr string) string { + directive := matchStr[1] + switch directive { + case 'a': + return "\a" + case 'b': + return "\b" + case 'f': + return "\f" + case 'n': + return "\n" + case 'r': + return "\r" + case 't': + return "\t" + case 'v': + return "\v" + case '\'': + return "'" + case '\\': + return "\\" + default: + err = fmt.Errorf("invalid escape char %s", matchStr) + return "" + } + }) + return unescaped, err +} + +// ValidFieldPath validates that jsonPath is a valid JSON Path containing only field and map accessors +// that are valid for the given schema, and returns a field.Path representation of the validated jsonPath or an error. +func ValidFieldPath(jsonPath string, schema *schema.Structural) (validFieldPath *field.Path, err error) { + appendToPath := func(name string, isNamed bool) error { + if !isNamed { + validFieldPath = validFieldPath.Key(name) + schema = schema.AdditionalProperties.Structural + } else { + validFieldPath = validFieldPath.Child(name) + val, ok := schema.Properties[name] + if !ok { + return fmt.Errorf("does not refer to a valid field") + } + schema = &val + } + return nil + } + + validFieldPath = nil + + scanner := bufio.NewScanner(strings.NewReader(jsonPath)) + + // configure the scanner to split the string into tokens. + // The three delimiters ('.', '[', ']') will be returned as single char tokens. + // All other text between delimiters is returned as string tokens. + scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { + if len(data) > 0 { + for i := 0; i < len(data); i++ { + // If in a single quoted string, look for the end of string + // ignoring delimiters. + if data[0] == '\'' { + if i > 0 && data[i] == '\'' && data[i-1] != '\\' { + // Return quoted string + return i + 1, data[:i+1], nil + } + continue + } + switch data[i] { + case '.', '[', ']': // delimiters + if i == 0 { + // Return the delimiter. + return 1, data[:1], nil + } else { + // Return identifier leading up to the delimiter. + // The next call to split will return the delimiter. + return i, data[:i], nil + } + } + } + if atEOF { + // Return the string. + return len(data), data, nil + } + } + return 0, nil, nil + }) + + var tok string + var isNamed bool + for scanner.Scan() { + tok = scanner.Text() + switch tok { + case "[": + if !scanner.Scan() { + return nil, fmt.Errorf("unexpected end of JSON path") + } + tok = scanner.Text() + if len(tok) < 2 || tok[0] != '\'' || tok[len(tok)-1] != '\'' { + return nil, fmt.Errorf("expected single quoted string but got %s", tok) + } + unescaped, err := unescapeSingleQuote(tok[1 : len(tok)-1]) + if err != nil { + return nil, fmt.Errorf("invalid string literal: %v", err) + } + + if schema.Properties != nil { + isNamed = true + } else if schema.AdditionalProperties != nil { + isNamed = false + } else { + return nil, fmt.Errorf("does not refer to a valid field") + } + if err := appendToPath(unescaped, isNamed); err != nil { + return nil, err + } + if !scanner.Scan() { + return nil, fmt.Errorf("unexpected end of JSON path") + } + tok = scanner.Text() + if tok != "]" { + return nil, fmt.Errorf("expected ] but got %s", tok) + } + case ".": + if !scanner.Scan() { + return nil, fmt.Errorf("unexpected end of JSON path") + } + tok = scanner.Text() + if schema.Properties != nil { + isNamed = true + } else if schema.AdditionalProperties != nil { + isNamed = false + } else { + return nil, fmt.Errorf("does not refer to a valid field") + } + if err := appendToPath(tok, isNamed); err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("expected [ or . but got: %s", tok) + } + } + return validFieldPath, nil +} + +func fieldErrorForReason(fldPath *field.Path, value interface{}, detail string, reason *apiextensions.FieldValueErrorReason) *field.Error { + if reason == nil { + return field.Invalid(fldPath, value, detail) + } + switch *reason { + case apiextensions.FieldValueForbidden: + return field.Forbidden(fldPath, detail) + case apiextensions.FieldValueRequired: + return field.Required(fldPath, detail) + case apiextensions.FieldValueDuplicate: + return field.Duplicate(fldPath, value) + default: + return field.Invalid(fldPath, value, detail) + } +} + // evalMessageExpression evaluates the given message expression and returns the evaluated string form and the remaining budget, or an error if one // occurred during evaluation. func evalMessageExpression(ctx context.Context, expr celgo.Program, exprSrc string, activation interpreter.Activation, remainingBudget int64) (string, int64, *cel.Error) { diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go index 271b7b038..b764e13e7 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go @@ -46,7 +46,9 @@ func (in *Extensions) DeepCopyInto(out *Extensions) { if in.XValidations != nil { in, out := &in.XValidations, &out.XValidations *out = make(v1.ValidationRules, len(*in)) - copy(*out, *in) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/ratcheting.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/ratcheting.go new file mode 100644 index 000000000..6565d83ee --- /dev/null +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/ratcheting.go @@ -0,0 +1,412 @@ +/* +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 validation + +import ( + "reflect" + + "k8s.io/apiserver/pkg/cel/common" + celopenapi "k8s.io/apiserver/pkg/cel/openapi" + "k8s.io/kube-openapi/pkg/validation/spec" + "k8s.io/kube-openapi/pkg/validation/strfmt" + "k8s.io/kube-openapi/pkg/validation/validate" +) + +// schemaArgs are the arguments to constructor for OpenAPI schema validator, +// NewSchemaValidator +type schemaArgs struct { + schema *spec.Schema + root interface{} + path string + knownFormats strfmt.Registry + options []validate.Option +} + +// RatchetingSchemaValidator wraps kube-openapis SchemaValidator to provide a +// ValidateUpdate function which allows ratcheting +type RatchetingSchemaValidator struct { + schemaArgs +} + +func NewRatchetingSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, options ...validate.Option) *RatchetingSchemaValidator { + return &RatchetingSchemaValidator{ + schemaArgs: schemaArgs{ + schema: schema, + root: rootSchema, + path: root, + knownFormats: formats, + options: options, + }, + } +} + +func (r *RatchetingSchemaValidator) Validate(new interface{}) *validate.Result { + sv := validate.NewSchemaValidator(r.schema, r.root, r.path, r.knownFormats, r.options...) + return sv.Validate(new) +} + +func (r *RatchetingSchemaValidator) ValidateUpdate(new, old interface{}) *validate.Result { + return newRatchetingValueValidator(new, old, r.schemaArgs).Validate() +} + +// ratchetingValueValidator represents an invocation of SchemaValidator.ValidateUpdate +// for specific arguments for `old` and `new` +// +// It follows the openapi SchemaValidator down its traversal of the new value +// by injecting validate.Option into each recursive invocation. +// +// A ratchetingValueValidator will be constructed and added to the tree for +// each explored sub-index and sub-property during validation. +// +// It's main job is to keep the old/new values correlated as the traversal +// continues, and postprocess errors according to our ratcheting policy. +// +// ratchetingValueValidator is not thread safe. +type ratchetingValueValidator struct { + // schemaArgs provides the arguments to use in the temporary SchemaValidator + // that is created during a call to Validate. + schemaArgs + + // Currently correlated old value during traversal of the schema/object + oldValue interface{} + + // Value being validated + value interface{} + + // Scratch space below, may change during validation + + // Cached comparison result of DeepEqual of `value` and `thunk.oldValue` + comparisonResult *bool + + // Cached map representation of a map-type list, or nil if not map-type list + mapList common.MapList + + // Children spawned by a call to `Validate` on this object + // key is either a string or an index, depending upon whether `value` is + // a map or a list, respectively. + // + // The list of children may be incomplete depending upon if the internal + // logic of kube-openapi's SchemaValidator short-circuited before + // reaching all of the children. + // + // It should be expected to have an entry for either all of the children, or + // none of them. + children map[interface{}]*ratchetingValueValidator +} + +func newRatchetingValueValidator(newValue, oldValue interface{}, args schemaArgs) *ratchetingValueValidator { + return &ratchetingValueValidator{ + oldValue: oldValue, + value: newValue, + schemaArgs: args, + children: map[interface{}]*ratchetingValueValidator{}, + } +} + +// getValidateOption provides a kube-openapi validate.Option for SchemaValidator +// that injects a ratchetingValueValidator to be used for all subkeys and subindices +func (r *ratchetingValueValidator) getValidateOption() validate.Option { + return func(svo *validate.SchemaValidatorOptions) { + svo.NewValidatorForField = func(field string, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...validate.Option) validate.ValueValidator { + return r.SubPropertyValidator(field, schema, rootSchema, root, formats, opts...) + } + svo.NewValidatorForIndex = func(index int, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...validate.Option) validate.ValueValidator { + return r.SubIndexValidator(index, schema, rootSchema, root, formats, opts...) + } + } +} + +// Validate validates the update from r.oldValue to r.value +// +// During evaluation, a temporary tree of ratchetingValueValidator is built for all +// traversed field paths. It is necessary to build the tree to take advantage of +// DeepEqual checks performed by lower levels of the object during validation without +// greatly modifying `kube-openapi`'s implementation. +// +// The tree, and all cache storage/scratch space for the validation of a single +// call to `Validate` is thrown away at the end of the top-level call +// to `Validate`. +// +// `Validate` will create a node in the tree to for each of the explored children. +// The node's main purpose is to store a lazily computed DeepEqual check between +// the oldValue and the currently passed value. If the check is performed, it +// will be stored in the node to be re-used by a parent node during a DeepEqual +// comparison, if necessary. +// +// This call has a side-effect of populating it's `children` variable with +// the explored nodes of the object tree. +func (r *ratchetingValueValidator) Validate() *validate.Result { + opts := append([]validate.Option{ + r.getValidateOption(), + }, r.options...) + + s := validate.NewSchemaValidator(r.schema, r.root, r.path, r.knownFormats, opts...) + + res := s.Validate(r.value) + + if res.IsValid() { + return res + } + + // Current ratcheting rule is to ratchet errors if DeepEqual(old, new) is true. + if r.CachedDeepEqual() { + newRes := &validate.Result{} + newRes.MergeAsWarnings(res) + return newRes + } + + return res +} + +// SubPropertyValidator overrides the standard validator constructor for sub-properties by +// returning our special ratcheting variant. +// +// If we can correlate an old value, we return a ratcheting validator to +// use for the child. +// +// If the old value cannot be correlated, then default validation is used. +func (r *ratchetingValueValidator) SubPropertyValidator(field string, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, options ...validate.Option) validate.ValueValidator { + // Find correlated old value + asMap, ok := r.oldValue.(map[string]interface{}) + if !ok { + return validate.NewSchemaValidator(schema, rootSchema, root, formats, options...) + } + + oldValueForField, ok := asMap[field] + if !ok { + return validate.NewSchemaValidator(schema, rootSchema, root, formats, options...) + } + + return inlineValidator(func(new interface{}) *validate.Result { + childNode := newRatchetingValueValidator(new, oldValueForField, schemaArgs{ + schema: schema, + root: rootSchema, + path: root, + knownFormats: formats, + options: options, + }) + + r.children[field] = childNode + return childNode.Validate() + }) + +} + +// SubIndexValidator overrides the standard validator constructor for sub-indicies by +// returning our special ratcheting variant. +// +// If we can correlate an old value, we return a ratcheting validator to +// use for the child. +// +// If the old value cannot be correlated, then default validation is used. +func (r *ratchetingValueValidator) SubIndexValidator(index int, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, options ...validate.Option) validate.ValueValidator { + oldValueForIndex := r.correlateOldValueForChildAtNewIndex(index) + if oldValueForIndex == nil { + // If correlation fails, default to non-ratcheting logic + return validate.NewSchemaValidator(schema, rootSchema, root, formats, options...) + } + + return inlineValidator(func(new interface{}) *validate.Result { + childNode := newRatchetingValueValidator(new, oldValueForIndex, schemaArgs{ + schema: schema, + root: rootSchema, + path: root, + knownFormats: formats, + options: options, + }) + + r.children[index] = childNode + return childNode.Validate() + }) +} + +// If oldValue is not a list, returns nil +// If oldValue is a list takes mapType into account and attempts to find the +// old value with the same index or key, depending upon the mapType. +// +// If listType is map, creates a map representation of the list using the designated +// map-keys and caches it for future calls. +func (r *ratchetingValueValidator) correlateOldValueForChildAtNewIndex(index int) any { + oldAsList, ok := r.oldValue.([]interface{}) + if !ok { + return nil + } + + asList, ok := r.value.([]interface{}) + if !ok { + return nil + } else if len(asList) <= index { + // Cannot correlate out of bounds index + return nil + } + + listType, _ := r.schema.Extensions.GetString("x-kubernetes-list-type") + switch listType { + case "map": + // Look up keys for this index in current object + currentElement := asList[index] + + oldList := r.mapList + if oldList == nil { + oldList = celopenapi.MakeMapList(r.schema, oldAsList) + r.mapList = oldList + } + return oldList.Get(currentElement) + + case "set": + // Are sets correlatable? Only if the old value equals the current value. + // We might be able to support this, but do not currently see a lot + // of value + // (would allow you to add/remove items from sets with ratcheting but not change them) + return nil + case "atomic": + // Atomic lists are not correlatable by item + // Ratcheting is not available on a per-index basis + return nil + default: + // Correlate by-index by default. + // + // Cannot correlate an out-of-bounds index + if len(oldAsList) <= index { + return nil + } + + return oldAsList[index] + } +} + +// CachedDeepEqual is equivalent to reflect.DeepEqual, but caches the +// results in the tree of ratchetInvocationScratch objects on the way: +// +// For objects and arrays, this function will make a best effort to make +// use of past DeepEqual checks performed by this Node's children, if available. +// +// If a lazy computation could not be found for all children possibly due +// to validation logic short circuiting and skipping the children, then +// this function simply defers to reflect.DeepEqual. +func (r *ratchetingValueValidator) CachedDeepEqual() (res bool) { + if r.comparisonResult != nil { + return *r.comparisonResult + } + + defer func() { + r.comparisonResult = &res + }() + + if r.value == nil && r.oldValue == nil { + return true + } else if r.value == nil || r.oldValue == nil { + return false + } + + oldAsArray, oldIsArray := r.oldValue.([]interface{}) + newAsArray, newIsArray := r.value.([]interface{}) + + if oldIsArray != newIsArray { + return false + } else if oldIsArray { + if len(oldAsArray) != len(newAsArray) { + return false + } else if len(r.children) != len(oldAsArray) { + // kube-openapi validator is written to always visit all + // children of a slice, so this case is only possible if + // one of the children could not be correlated. In that case, + // we know the objects are not equal. + // + return false + } + + // Correctly considers map-type lists due to fact that index here + // is only used for numbering. The correlation is stored in the + // childInvocation itself + // + // NOTE: This does not consider sets, since we don't correlate them. + for i := range newAsArray { + // Query for child + child, ok := r.children[i] + if !ok { + // This should not happen + return false + } else if !child.CachedDeepEqual() { + // If one child is not equal the entire object is not equal + return false + } + } + + return true + } + + oldAsMap, oldIsMap := r.oldValue.(map[string]interface{}) + newAsMap, newIsMap := r.value.(map[string]interface{}) + + if oldIsMap != newIsMap { + return false + } else if oldIsMap { + if len(oldAsMap) != len(newAsMap) { + return false + } else if len(oldAsMap) == 0 && len(newAsMap) == 0 { + // Both empty + return true + } else if len(r.children) != len(oldAsMap) { + // If we are missing a key it is because the old value could not + // be correlated to the new, so the objects are not equal. + // + return false + } + + for k := range oldAsMap { + // Check to see if this child was explored during validation + child, ok := r.children[k] + if !ok { + // Child from old missing in new due to key change + // Objects are not equal. + return false + } else if !child.CachedDeepEqual() { + // If one child is not equal the entire object is not equal + return false + } + } + + return true + } + + return reflect.DeepEqual(r.oldValue, r.value) +} + +// A validator which just calls a validate function, and advertises that it +// validates anything +// +// In the future kube-openapi's ValueValidator interface can be simplified +// to be closer to `currentValidator.Options.NewValidator(value, ...).Validate()` +// so that a tree of "validation nodes" can be more formally encoded in the API. +// In that case this class would not be necessary. +type inlineValidator func(new interface{}) *validate.Result + +var _ validate.ValueValidator = inlineValidator(nil) + +func (f inlineValidator) Validate(new interface{}) *validate.Result { + return f(new) +} + +func (f inlineValidator) SetPath(path string) { + // Do nothing + // Unused by kube-openapi +} + +func (f inlineValidator) Applies(source interface{}, valueKind reflect.Kind) bool { + return true +} diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go index fad044d1c..e0042356a 100644 --- a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go @@ -22,29 +22,83 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" openapierrors "k8s.io/kube-openapi/pkg/validation/errors" "k8s.io/kube-openapi/pkg/validation/spec" "k8s.io/kube-openapi/pkg/validation/strfmt" "k8s.io/kube-openapi/pkg/validation/validate" ) +type SchemaValidator interface { + SchemaCreateValidator + ValidateUpdate(new, old interface{}) *validate.Result +} + +type SchemaCreateValidator interface { + Validate(value interface{}) *validate.Result +} + +// basicSchemaValidator wraps a kube-openapi SchemaCreateValidator to +// support ValidateUpdate. It implements ValidateUpdate by simply validating +// the new value via kube-openapi, ignoring the old value. +type basicSchemaValidator struct { + *validate.SchemaValidator +} + +func (s basicSchemaValidator) ValidateUpdate(new, old interface{}) *validate.Result { + return s.Validate(new) +} + // NewSchemaValidator creates an openapi schema validator for the given CRD validation. -func NewSchemaValidator(customResourceValidation *apiextensions.CustomResourceValidation) (*validate.SchemaValidator, *spec.Schema, error) { +// +// If feature `CRDValidationRatcheting` is disabled, this returns validator which +// validates all `Update`s and `Create`s as a `Create` - without considering old value. +// +// If feature `CRDValidationRatcheting` is enabled - the validator returned +// will support ratcheting unchanged correlatable fields across an update. +func NewSchemaValidator(customResourceValidation *apiextensions.JSONSchemaProps) (SchemaValidator, *spec.Schema, error) { // Convert CRD schema to openapi schema openapiSchema := &spec.Schema{} if customResourceValidation != nil { // TODO: replace with NewStructural(...).ToGoOpenAPI - if err := ConvertJSONSchemaPropsWithPostProcess(customResourceValidation.OpenAPIV3Schema, openapiSchema, StripUnsupportedFormatsPostProcess); err != nil { + if err := ConvertJSONSchemaPropsWithPostProcess(customResourceValidation, openapiSchema, StripUnsupportedFormatsPostProcess); err != nil { return nil, nil, err } } - return validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default), openapiSchema, nil + + if utilfeature.DefaultFeatureGate.Enabled(features.CRDValidationRatcheting) { + return NewRatchetingSchemaValidator(openapiSchema, nil, "", strfmt.Default), openapiSchema, nil + } + return basicSchemaValidator{validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default)}, openapiSchema, nil +} + +// ValidateCustomResourceUpdate validates the transition of Custom Resource from +// `old` to `new` against the schema in the CustomResourceDefinition. +// Both customResource and old represent a JSON data structures. +// +// If feature `CRDValidationRatcheting` is disabled, this behaves identically to +// ValidateCustomResource(customResource). +func ValidateCustomResourceUpdate(fldPath *field.Path, customResource, old interface{}, validator SchemaValidator) field.ErrorList { + // Additional feature gate check for sanity + if !utilfeature.DefaultFeatureGate.Enabled(features.CRDValidationRatcheting) { + return ValidateCustomResource(nil, customResource, validator) + } else if validator == nil { + return nil + } + + result := validator.ValidateUpdate(customResource, old) + if result.IsValid() { + return nil + } + + return kubeOpenAPIResultToFieldErrors(fldPath, result) } // ValidateCustomResource validates the Custom Resource against the schema in the CustomResourceDefinition. // CustomResource is a JSON data structure. -func ValidateCustomResource(fldPath *field.Path, customResource interface{}, validator *validate.SchemaValidator) field.ErrorList { +func ValidateCustomResource(fldPath *field.Path, customResource interface{}, validator SchemaCreateValidator) field.ErrorList { if validator == nil { return nil } @@ -53,6 +107,11 @@ func ValidateCustomResource(fldPath *field.Path, customResource interface{}, val if result.IsValid() { return nil } + + return kubeOpenAPIResultToFieldErrors(fldPath, result) +} + +func kubeOpenAPIResultToFieldErrors(fldPath *field.Path, result *validate.Result) field.ErrorList { var allErrs field.ErrorList for _, err := range result.Errors { switch err := err.(type) { @@ -287,7 +346,7 @@ func ConvertJSONSchemaPropsWithPostProcess(in *apiextensions.JSONSchemaProps, ou out.VendorExtensible.AddExtension("x-kubernetes-embedded-resource", true) } if len(in.XListMapKeys) != 0 { - out.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", in.XListMapKeys) + out.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", convertSliceToInterfaceSlice(in.XListMapKeys)) } if in.XListType != nil { out.VendorExtensible.AddExtension("x-kubernetes-list-type", *in.XListType) @@ -300,11 +359,19 @@ func ConvertJSONSchemaPropsWithPostProcess(in *apiextensions.JSONSchemaProps, ou if err := apiextensionsv1.Convert_apiextensions_ValidationRules_To_v1_ValidationRules(&in.XValidations, &serializationValidationRules, nil); err != nil { return err } - out.VendorExtensible.AddExtension("x-kubernetes-validations", serializationValidationRules) + out.VendorExtensible.AddExtension("x-kubernetes-validations", convertSliceToInterfaceSlice(serializationValidationRules)) } return nil } +func convertSliceToInterfaceSlice[T any](in []T) []interface{} { + var res []interface{} + for _, v := range in { + res = append(res, v) + } + return res +} + func convertSliceOfJSONSchemaProps(in *[]apiextensions.JSONSchemaProps, out *[]spec.Schema, postProcess PostProcessFunc) error { if in != nil { for _, jsonSchemaProps := range *in { diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS new file mode 100644 index 000000000..3e1dd9f08 --- /dev/null +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + - feature-approvers diff --git a/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go new file mode 100644 index 000000000..1844ed8d1 --- /dev/null +++ b/tools/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go @@ -0,0 +1,48 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package features + +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/component-base/featuregate" +) + +const ( + // Every feature gate should add method here following this template: + // + // // owner: @username + // // alpha: v1.4 + // MyFeature() bool + + // owner: @alexzielenski + // alpha: v1.28 + // + // Ignores errors raised on unchanged fields of Custom Resources + // across UPDATE/PATCH requests. + CRDValidationRatcheting featuregate.Feature = "CRDValidationRatcheting" +) + +func init() { + utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates) +} + +// defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys. +// To add a new feature, define a key for it above and add it here. The features will be +// available throughout Kubernetes binaries. +var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{ + CRDValidationRatcheting: {Default: false, PreRelease: featuregate.Alpha}, +} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS b/tools/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS index 155648acb..1a9f5e770 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS +++ b/tools/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS @@ -2,7 +2,6 @@ reviewers: - thockin - - lavalamp - smarterclayton - wojtek-t - deads2k diff --git a/tools/vendor/k8s.io/apimachinery/pkg/api/meta/help.go b/tools/vendor/k8s.io/apimachinery/pkg/api/meta/help.go index 1bf6b06d4..1fdd32c4b 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/api/meta/help.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/api/meta/help.go @@ -112,8 +112,27 @@ func getItemsPtr(list runtime.Object) (interface{}, error) { // EachListItem invokes fn on each runtime.Object in the list. Any error immediately terminates // the loop. +// +// If items passed to fn are retained for different durations, and you want to avoid +// retaining all items in obj as long as any item is referenced, use EachListItemWithAlloc instead. func EachListItem(obj runtime.Object, fn func(runtime.Object) error) error { + return eachListItem(obj, fn, false) +} + +// EachListItemWithAlloc works like EachListItem, but avoids retaining references to the items slice in obj. +// It does this by making a shallow copy of non-pointer items in obj. +// +// If the items passed to fn are not retained, or are retained for the same duration, use EachListItem instead for memory efficiency. +func EachListItemWithAlloc(obj runtime.Object, fn func(runtime.Object) error) error { + return eachListItem(obj, fn, true) +} + +// allocNew: Whether shallow copy is required when the elements in Object.Items are struct +func eachListItem(obj runtime.Object, fn func(runtime.Object) error, allocNew bool) error { if unstructured, ok := obj.(runtime.Unstructured); ok { + if allocNew { + return unstructured.EachListItemWithAlloc(fn) + } return unstructured.EachListItem(fn) } // TODO: Change to an interface call? @@ -140,8 +159,19 @@ func EachListItem(obj runtime.Object, fn func(runtime.Object) error) error { for i := 0; i < len; i++ { raw := items.Index(i) if takeAddr { - raw = raw.Addr() + if allocNew { + // shallow copy to avoid retaining a reference to the original list item + itemCopy := reflect.New(raw.Type()) + // assign to itemCopy and type-assert + itemCopy.Elem().Set(raw) + // reflect.New will guarantee that itemCopy must be a pointer. + raw = itemCopy + } else { + raw = raw.Addr() + } } + // raw must be a pointer or an interface + // allocate a pointer is cheap switch item := raw.Interface().(type) { case *runtime.RawExtension: if err := fn(item.Object); err != nil { @@ -166,7 +196,23 @@ func EachListItem(obj runtime.Object, fn func(runtime.Object) error) error { // ExtractList returns obj's Items element as an array of runtime.Objects. // Returns an error if obj is not a List type (does not have an Items member). +// +// If items in the returned list are retained for different durations, and you want to avoid +// retaining all items in obj as long as any item is referenced, use ExtractListWithAlloc instead. func ExtractList(obj runtime.Object) ([]runtime.Object, error) { + return extractList(obj, false) +} + +// ExtractListWithAlloc works like ExtractList, but avoids retaining references to the items slice in obj. +// It does this by making a shallow copy of non-pointer items in obj. +// +// If the items in the returned list are not retained, or are retained for the same duration, use ExtractList instead for memory efficiency. +func ExtractListWithAlloc(obj runtime.Object) ([]runtime.Object, error) { + return extractList(obj, true) +} + +// allocNew: Whether shallow copy is required when the elements in Object.Items are struct +func extractList(obj runtime.Object, allocNew bool) ([]runtime.Object, error) { itemsPtr, err := GetItemsPtr(obj) if err != nil { return nil, err @@ -176,10 +222,17 @@ func ExtractList(obj runtime.Object) ([]runtime.Object, error) { return nil, err } list := make([]runtime.Object, items.Len()) + if len(list) == 0 { + return list, nil + } + elemType := items.Type().Elem() + isRawExtension := elemType == rawExtensionObjectType + implementsObject := elemType.Implements(objectType) for i := range list { raw := items.Index(i) - switch item := raw.Interface().(type) { - case runtime.RawExtension: + switch { + case isRawExtension: + item := raw.Interface().(runtime.RawExtension) switch { case item.Object != nil: list[i] = item.Object @@ -189,8 +242,18 @@ func ExtractList(obj runtime.Object) ([]runtime.Object, error) { default: list[i] = nil } - case runtime.Object: - list[i] = item + case implementsObject: + list[i] = raw.Interface().(runtime.Object) + case allocNew: + // shallow copy to avoid retaining a reference to the original list item + itemCopy := reflect.New(raw.Type()) + // assign to itemCopy and type-assert + itemCopy.Elem().Set(raw) + var ok bool + // reflect.New will guarantee that itemCopy must be a pointer. + if list[i], ok = itemCopy.Interface().(runtime.Object); !ok { + return nil, fmt.Errorf("%v: item[%v]: Expected object, got %#v(%s)", obj, i, raw.Interface(), raw.Kind()) + } default: var found bool if list[i], found = raw.Addr().Interface().(runtime.Object); !found { @@ -201,8 +264,12 @@ func ExtractList(obj runtime.Object) ([]runtime.Object, error) { return list, nil } -// objectSliceType is the type of a slice of Objects -var objectSliceType = reflect.TypeOf([]runtime.Object{}) +var ( + // objectSliceType is the type of a slice of Objects + objectSliceType = reflect.TypeOf([]runtime.Object{}) + objectType = reflect.TypeOf((*runtime.Object)(nil)).Elem() + rawExtensionObjectType = reflect.TypeOf(runtime.RawExtension{}) +) // LenList returns the length of this list or 0 if it is not a list. func LenList(list runtime.Object) int { @@ -237,7 +304,7 @@ func SetList(list runtime.Object, objects []runtime.Object) error { slice := reflect.MakeSlice(items.Type(), len(objects), len(objects)) for i := range objects { dest := slice.Index(i) - if dest.Type() == reflect.TypeOf(runtime.RawExtension{}) { + if dest.Type() == rawExtensionObjectType { dest = dest.FieldByName("Object") } diff --git a/tools/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS b/tools/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS index d1c9f5307..063fd285d 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS +++ b/tools/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS @@ -2,7 +2,6 @@ reviewers: - thockin - - lavalamp - smarterclayton - wojtek-t - derekwaynecarr diff --git a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index 48955dca8..a2cd8015f 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -425,8 +425,6 @@ message LabelSelector { // relates the key and values. message LabelSelectorRequirement { // key is the label key that the selector applies to. - // +patchMergeKey=key - // +patchStrategy=merge optional string key = 1; // operator represents a key's relationship to a set of values. diff --git a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 352d58ebc..8a8ff7018 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -995,6 +995,24 @@ const ( // CauseTypeFieldValueNotSupported is used to report valid (as per formatting rules) // values that can not be handled (e.g. an enumerated string). CauseTypeFieldValueNotSupported CauseType = "FieldValueNotSupported" + // CauseTypeForbidden is used to report valid (as per formatting rules) + // values which would be accepted under some conditions, but which are not + // permitted by the current conditions (such as security policy). See + // Forbidden(). + CauseTypeForbidden CauseType = "FieldValueForbidden" + // CauseTypeTooLong is used to report that the given value is too long. + // This is similar to ErrorTypeInvalid, but the error will not include the + // too-long value. See TooLong(). + CauseTypeTooLong CauseType = "FieldValueTooLong" + // CauseTypeTooMany is used to report "too many". This is used to + // report that a given list has too many items. This is similar to FieldValueTooLong, + // but the error indicates quantity instead of length. + CauseTypeTooMany CauseType = "FieldValueTooMany" + // CauseTypeInternal is used to report other errors that are not related + // to user input. See InternalError(). + CauseTypeInternal CauseType = "InternalError" + // CauseTypeTypeInvalid is for the value did not match the schema type for that field + CauseTypeTypeInvalid CauseType = "FieldValueTypeInvalid" // CauseTypeUnexpectedServerResponse is used to report when the server responded to the client // without the expected return type. The presence of this cause indicates the error may be // due to an intervening proxy or the server software malfunctioning. @@ -1207,9 +1225,7 @@ type LabelSelector struct { // relates the key and values. type LabelSelectorRequirement struct { // key is the label key that the selector applies to. - // +patchMergeKey=key - // +patchStrategy=merge - Key string `json:"key" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,1,opt,name=key"` + Key string `json:"key" protobuf:"bytes,1,opt,name=key"` // operator represents a key's relationship to a set of values. // Valid operators are In, NotIn, Exists and DoesNotExist. Operator LabelSelectorOperator `json:"operator" protobuf:"bytes,2,opt,name=operator,casttype=LabelSelectorOperator"` diff --git a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index a499eee8e..40d289f37 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -101,6 +101,11 @@ func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error { return nil } +func (obj *Unstructured) EachListItemWithAlloc(fn func(runtime.Object) error) error { + // EachListItem has allocated a new Object for the user, we can use it directly. + return obj.EachListItem(fn) +} + func (obj *Unstructured) UnstructuredContent() map[string]interface{} { if obj.Object == nil { return make(map[string]interface{}) diff --git a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go index 5028f5fb5..82beda2a2 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go @@ -52,6 +52,15 @@ func (u *UnstructuredList) EachListItem(fn func(runtime.Object) error) error { return nil } +func (u *UnstructuredList) EachListItemWithAlloc(fn func(runtime.Object) error) error { + for i := range u.Items { + if err := fn(&Unstructured{Object: u.Items[i].Object}); err != nil { + return err + } + } + return nil +} + // NewEmptyInstance returns a new instance of the concrete type containing only kind/apiVersion and no other data. // This should be called instead of reflect.New() for unstructured types because the go type alone does not preserve kind/apiVersion info. func (u *UnstructuredList) NewEmptyInstance() runtime.Unstructured { diff --git a/tools/vendor/k8s.io/apimachinery/pkg/runtime/codec.go b/tools/vendor/k8s.io/apimachinery/pkg/runtime/codec.go index 7fc513dd0..73f85286c 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/runtime/codec.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/runtime/codec.go @@ -45,7 +45,6 @@ func NewCodec(e Encoder, d Decoder) Codec { // Encode is a convenience wrapper for encoding to a []byte from an Encoder func Encode(e Encoder, obj Object) ([]byte, error) { - // TODO: reuse buffer buf := &bytes.Buffer{} if err := e.Encode(obj, buf); err != nil { return nil, err diff --git a/tools/vendor/k8s.io/apimachinery/pkg/runtime/converter.go b/tools/vendor/k8s.io/apimachinery/pkg/runtime/converter.go index 90bf487e3..62eb27afc 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/runtime/converter.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/runtime/converter.go @@ -231,7 +231,7 @@ func (c *fromUnstructuredContext) pushKey(key string) { } -// FromUnstructuredWIthValidation converts an object from map[string]interface{} representation into a concrete type. +// FromUnstructuredWithValidation converts an object from map[string]interface{} representation into a concrete type. // It uses encoding/json/Unmarshaler if object implements it or reflection if not. // It takes a validationDirective that indicates how to behave when it encounters unknown fields. func (c *unstructuredConverter) FromUnstructuredWithValidation(u map[string]interface{}, obj interface{}, returnUnknownFields bool) error { @@ -465,7 +465,7 @@ func sliceFromUnstructured(sv, dv reflect.Value, ctx *fromUnstructuredContext) e } dv.SetBytes(data) } else { - dv.Set(reflect.Zero(dt)) + dv.Set(reflect.MakeSlice(dt, 0, 0)) } return nil } diff --git a/tools/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go b/tools/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go index 710a97795..e89ea8939 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go @@ -365,4 +365,9 @@ type Unstructured interface { // error should terminate the iteration. If IsList() returns false, this method should return an error // instead of calling the provided function. EachListItem(func(Object) error) error + // EachListItemWithAlloc works like EachListItem, but avoids retaining references to a slice of items. + // It does this by making a shallow copy of non-pointer items before passing them to fn. + // + // If the items passed to fn are not retained, or are retained for the same duration, use EachListItem instead for memory efficiency. + EachListItemWithAlloc(func(Object) error) error } diff --git a/tools/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go b/tools/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go index 54ccb7a74..d1c37c942 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go @@ -39,7 +39,7 @@ func ParseResourceArg(arg string) (*GroupVersionResource, GroupResource) { // ParseKindArg takes the common style of string which may be either `Kind.group.com` or `Kind.version.group.com` // and parses it out into both possibilities. This code takes no responsibility for knowing which representation was intended // but with a knowledge of all GroupKinds, calling code can take a very good guess. If there are only two segments, then -// `*GroupVersionResource` is nil. +// `*GroupVersionKind` is nil. // `Kind.group.com` -> `group=com, version=group, kind=Kind` and `group=group.com, kind=Kind` func ParseKindArg(arg string) (*GroupVersionKind, GroupKind) { var gvk *GroupVersionKind diff --git a/tools/vendor/k8s.io/apimachinery/pkg/runtime/splice.go b/tools/vendor/k8s.io/apimachinery/pkg/runtime/splice.go new file mode 100644 index 000000000..2badb7b97 --- /dev/null +++ b/tools/vendor/k8s.io/apimachinery/pkg/runtime/splice.go @@ -0,0 +1,76 @@ +/* +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 runtime + +import ( + "bytes" + "io" +) + +// Splice is the interface that wraps the Splice method. +// +// Splice moves data from given slice without copying the underlying data for +// efficiency purpose. Therefore, the caller should make sure the underlying +// data is not changed later. +type Splice interface { + Splice([]byte) + io.Writer + Reset() + Bytes() []byte +} + +// A spliceBuffer implements Splice and io.Writer interfaces. +type spliceBuffer struct { + raw []byte + buf *bytes.Buffer +} + +func NewSpliceBuffer() Splice { + return &spliceBuffer{} +} + +// Splice implements the Splice interface. +func (sb *spliceBuffer) Splice(raw []byte) { + sb.raw = raw +} + +// Write implements the io.Writer interface. +func (sb *spliceBuffer) Write(p []byte) (n int, err error) { + if sb.buf == nil { + sb.buf = &bytes.Buffer{} + } + return sb.buf.Write(p) +} + +// Reset resets the buffer to be empty. +func (sb *spliceBuffer) Reset() { + if sb.buf != nil { + sb.buf.Reset() + } + sb.raw = nil +} + +// Bytes returns the data held by the buffer. +func (sb *spliceBuffer) Bytes() []byte { + if sb.buf != nil && len(sb.buf.Bytes()) > 0 { + return sb.buf.Bytes() + } + if sb.raw != nil { + return sb.raw + } + return []byte{} +} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go b/tools/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go index 29fb4f950..db18ce1ce 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go @@ -41,7 +41,8 @@ func (n NamespacedName) String() string { // MarshalLog emits a struct containing required key/value pair func (n NamespacedName) MarshalLog() interface{} { return struct { - Name, Namespace string + Name string `json:"name"` + Namespace string `json:"namespace,omitempty"` }{ Name: n.Name, Namespace: n.Namespace, diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/cache/expiring.go b/tools/vendor/k8s.io/apimachinery/pkg/util/cache/expiring.go index 0d2f153bf..1396274c7 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/cache/expiring.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/cache/expiring.go @@ -40,6 +40,13 @@ func NewExpiringWithClock(clock clock.Clock) *Expiring { // Expiring is a map whose entries expire after a per-entry timeout. type Expiring struct { + // AllowExpiredGet causes the expiration check to be skipped on Get. + // It should only be used when a key always corresponds to the exact same value. + // Thus when this field is true, expired keys are considered valid + // until the next call to Set (which causes the GC to run). + // It may not be changed concurrently with calls to Get. + AllowExpiredGet bool + clock clock.Clock // mu protects the below fields @@ -70,7 +77,10 @@ func (c *Expiring) Get(key interface{}) (val interface{}, ok bool) { c.mu.RLock() defer c.mu.RUnlock() e, ok := c.cache[key] - if !ok || !c.clock.Now().Before(e.expiry) { + if !ok { + return nil, false + } + if !c.AllowExpiredGet && !c.clock.Now().Before(e.expiry) { return nil, false } return e.val, true diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go b/tools/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go index ec4002e38..fc0301844 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go @@ -23,34 +23,20 @@ import ( "strings" "text/tabwriter" - "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" + "k8s.io/apimachinery/pkg/util/dump" ) -// StringDiff diffs a and b and returns a human readable diff. -func StringDiff(a, b string) string { - ba := []byte(a) - bb := []byte(b) - out := []byte{} - i := 0 - for ; i < len(ba) && i < len(bb); i++ { - if ba[i] != bb[i] { - break - } - out = append(out, ba[i]) - } - out = append(out, []byte("\n\nA: ")...) - out = append(out, ba[i:]...) - out = append(out, []byte("\n\nB: ")...) - out = append(out, bb[i:]...) - out = append(out, []byte("\n\n")...) - return string(out) -} - func legacyDiff(a, b interface{}) string { return cmp.Diff(a, b) } +// StringDiff diffs a and b and returns a human readable diff. +// DEPRECATED: use github.com/google/go-cmp/cmp.Diff +func StringDiff(a, b string) string { + return legacyDiff(a, b) +} + // ObjectDiff prints the diff of two go objects and fails if the objects // contain unhandled unexported fields. // DEPRECATED: use github.com/google/go-cmp/cmp.Diff @@ -75,13 +61,8 @@ func ObjectReflectDiff(a, b interface{}) string { // ObjectGoPrintSideBySide prints a and b as textual dumps side by side, // enabling easy visual scanning for mismatches. func ObjectGoPrintSideBySide(a, b interface{}) string { - s := spew.ConfigState{ - Indent: " ", - // Extra deep spew. - DisableMethods: true, - } - sA := s.Sdump(a) - sB := s.Sdump(b) + sA := dump.Pretty(a) + sB := dump.Pretty(b) linesA := strings.Split(sA, "\n") linesB := strings.Split(sB, "\n") diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/dump/dump.go b/tools/vendor/k8s.io/apimachinery/pkg/util/dump/dump.go new file mode 100644 index 000000000..cf61ef76a --- /dev/null +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/dump/dump.go @@ -0,0 +1,54 @@ +/* +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 dump + +import ( + "github.com/davecgh/go-spew/spew" +) + +var prettyPrintConfig = &spew.ConfigState{ + Indent: " ", + DisableMethods: true, + DisablePointerAddresses: true, + DisableCapacities: true, +} + +// The config MUST NOT be changed because that could change the result of a hash operation +var prettyPrintConfigForHash = &spew.ConfigState{ + Indent: " ", + SortKeys: true, + DisableMethods: true, + SpewKeys: true, + DisablePointerAddresses: true, + DisableCapacities: true, +} + +// Pretty wrap the spew.Sdump with Indent, and disabled methods like error() and String() +// The output may change over time, so for guaranteed output please take more direct control +func Pretty(a interface{}) string { + return prettyPrintConfig.Sdump(a) +} + +// ForHash keeps the original Spew.Sprintf format to ensure the same checksum +func ForHash(a interface{}) string { + return prettyPrintConfigForHash.Sprintf("%#v", a) +} + +// OneLine outputs the object in one line +func OneLine(a interface{}) string { + return prettyPrintConfig.Sprintf("%#v", a) +} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go b/tools/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go index 27c3d2d56..7fe52ee56 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go @@ -23,7 +23,7 @@ import ( "encoding/base64" "errors" "fmt" - "io/ioutil" + "io" "net" "net/http" "net/http/httputil" @@ -337,7 +337,7 @@ func (s *SpdyRoundTripper) NewConnection(resp *http.Response) (httpstream.Connec if (resp.StatusCode != http.StatusSwitchingProtocols) || !strings.Contains(connectionHeader, strings.ToLower(httpstream.HeaderUpgrade)) || !strings.Contains(upgradeHeader, strings.ToLower(HeaderSpdy31)) { defer resp.Body.Close() responseError := "" - responseErrorBytes, err := ioutil.ReadAll(resp.Body) + responseErrorBytes, err := io.ReadAll(resp.Body) if err != nil { responseError = "unable to read error from server response" } else { diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go b/tools/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go index 5e8009704..0ea88156b 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go @@ -54,7 +54,7 @@ const ( // FromInt creates an IntOrString object with an int32 value. It is // your responsibility not to call this method with a value greater // than int32. -// TODO: convert to (val int32) +// Deprecated: use FromInt32 instead. func FromInt(val int) IntOrString { if val > math.MaxInt32 || val < math.MinInt32 { klog.Errorf("value: %d overflows int32\n%s\n", val, debug.Stack()) @@ -62,6 +62,11 @@ func FromInt(val int) IntOrString { return IntOrString{Type: Int, IntVal: int32(val)} } +// FromInt32 creates an IntOrString object with an int32 value. +func FromInt32(val int32) IntOrString { + return IntOrString{Type: Int, IntVal: val} +} + // FromString creates an IntOrString object with a string value. func FromString(val string) IntOrString { return IntOrString{Type: String, StrVal: val} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go index f3111d4bc..eca04a711 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go @@ -56,17 +56,20 @@ func NewFieldManager(f Manager, subresource string) *FieldManager { // newDefaultFieldManager is a helper function which wraps a Manager with certain default logic. func NewDefaultFieldManager(f Manager, typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectCreater runtime.ObjectCreater, kind schema.GroupVersionKind, subresource string) *FieldManager { return NewFieldManager( - NewLastAppliedUpdater( - NewLastAppliedManager( - NewProbabilisticSkipNonAppliedManager( - NewCapManagersManager( - NewBuildManagerInfoManager( - NewManagedFieldsUpdater( - NewStripMetaManager(f), - ), kind.GroupVersion(), subresource, - ), DefaultMaxUpdateManagers, - ), objectCreater, kind, DefaultTrackOnCreateProbability, - ), typeConverter, objectConverter, kind.GroupVersion()), + NewVersionCheckManager( + NewLastAppliedUpdater( + NewLastAppliedManager( + NewProbabilisticSkipNonAppliedManager( + NewCapManagersManager( + NewBuildManagerInfoManager( + NewManagedFieldsUpdater( + NewStripMetaManager(f), + ), kind.GroupVersion(), subresource, + ), DefaultMaxUpdateManagers, + ), objectCreater, DefaultTrackOnCreateProbability, + ), typeConverter, objectConverter, kind.GroupVersion(), + ), + ), kind, ), subresource, ) } diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go index 6b281ec1e..f24c040ed 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go @@ -22,13 +22,11 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" ) type skipNonAppliedManager struct { fieldManager Manager objectCreater runtime.ObjectCreater - gvk schema.GroupVersionKind beforeApplyManagerName string probability float32 } @@ -36,17 +34,16 @@ type skipNonAppliedManager struct { var _ Manager = &skipNonAppliedManager{} // NewSkipNonAppliedManager creates a new wrapped FieldManager that only starts tracking managers after the first apply. -func NewSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, gvk schema.GroupVersionKind) Manager { - return NewProbabilisticSkipNonAppliedManager(fieldManager, objectCreater, gvk, 0.0) +func NewSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater) Manager { + return NewProbabilisticSkipNonAppliedManager(fieldManager, objectCreater, 0.0) } // NewProbabilisticSkipNonAppliedManager creates a new wrapped FieldManager that starts tracking managers after the first apply, // or starts tracking on create with p probability. -func NewProbabilisticSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, gvk schema.GroupVersionKind, p float32) Manager { +func NewProbabilisticSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, p float32) Manager { return &skipNonAppliedManager{ fieldManager: fieldManager, objectCreater: objectCreater, - gvk: gvk, beforeApplyManagerName: "before-first-apply", probability: p, } @@ -78,9 +75,10 @@ func (f *skipNonAppliedManager) Update(liveObj, newObj runtime.Object, managed M // Apply implements Manager. func (f *skipNonAppliedManager) Apply(liveObj, appliedObj runtime.Object, managed Managed, fieldManager string, force bool) (runtime.Object, Managed, error) { if len(managed.Fields()) == 0 { - emptyObj, err := f.objectCreater.New(f.gvk) + gvk := appliedObj.GetObjectKind().GroupVersionKind() + emptyObj, err := f.objectCreater.New(gvk) if err != nil { - return nil, nil, fmt.Errorf("failed to create empty object of type %v: %v", f.gvk, err) + return nil, nil, fmt.Errorf("failed to create empty object of type %v: %v", gvk, err) } liveObj, managed, err = f.fieldManager.Update(emptyObj, liveObj, managed, f.beforeApplyManagerName) if err != nil { diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go index eb5598ac3..2112c9ab7 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go @@ -41,6 +41,9 @@ var _ Manager = &structuredMergeManager{} // NewStructuredMergeManager creates a new Manager that merges apply requests // and update managed fields for other types of requests. func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion, resetFields map[fieldpath.APIVersion]*fieldpath.Set) (Manager, error) { + if typeConverter == nil { + return nil, fmt.Errorf("typeconverter must not be nil") + } return &structuredMergeManager{ typeConverter: typeConverter, objectConverter: objectConverter, diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versioncheck.go b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versioncheck.go new file mode 100644 index 000000000..ee1e2bca7 --- /dev/null +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versioncheck.go @@ -0,0 +1,52 @@ +/* +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 ( + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type versionCheckManager struct { + fieldManager Manager + gvk schema.GroupVersionKind +} + +var _ Manager = &versionCheckManager{} + +// NewVersionCheckManager creates a manager that makes sure that the +// applied object is in the proper version. +func NewVersionCheckManager(fieldManager Manager, gvk schema.GroupVersionKind) Manager { + return &versionCheckManager{fieldManager: fieldManager, gvk: gvk} +} + +// Update implements Manager. +func (f *versionCheckManager) Update(liveObj, newObj runtime.Object, managed Managed, manager string) (runtime.Object, Managed, error) { + // Nothing to do for updates, this is checked in many other places. + return f.fieldManager.Update(liveObj, newObj, managed, manager) +} + +// Apply implements Manager. +func (f *versionCheckManager) Apply(liveObj, appliedObj runtime.Object, managed Managed, fieldManager string, force bool) (runtime.Object, Managed, error) { + if gvk := appliedObj.GetObjectKind().GroupVersionKind(); gvk != f.gvk { + return nil, nil, errors.NewBadRequest(fmt.Sprintf("invalid object type: %v", gvk)) + } + return f.fieldManager.Apply(liveObj, appliedObj, managed, fieldManager, force) +} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go b/tools/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go index a20efd187..25626cf3a 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go @@ -20,7 +20,7 @@ import ( "fmt" "reflect" - "github.com/davecgh/go-spew/spew" + "k8s.io/apimachinery/pkg/util/dump" "sigs.k8s.io/yaml" ) @@ -76,7 +76,7 @@ func ToYAMLOrError(v interface{}) string { func toYAML(v interface{}) (string, error) { y, err := yaml.Marshal(v) if err != nil { - return "", fmt.Errorf("yaml marshal failed:%v\n%v\n", err, spew.Sdump(v)) + return "", fmt.Errorf("yaml marshal failed:%v\n%v\n", err, dump.Pretty(v)) } return string(y), nil diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/net/util.go b/tools/vendor/k8s.io/apimachinery/pkg/util/net/util.go index 1c2aba55f..1635e69a5 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/net/util.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/net/util.go @@ -20,6 +20,7 @@ import ( "errors" "net" "reflect" + "strings" "syscall" ) @@ -47,6 +48,11 @@ func IsConnectionReset(err error) bool { return false } +// Returns if the given err is "http2: client connection lost" error. +func IsHTTP2ConnectionLost(err error) bool { + return err != nil && strings.Contains(err.Error(), "http2: client connection lost") +} + // Returns if the given err is "connection refused" error func IsConnectionRefused(err error) bool { var errno syscall.Errno diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/tools/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 3ee683b99..920c113bb 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -1182,7 +1182,13 @@ func mergePatchIntoOriginal(original, patch map[string]interface{}, schema Looku merged = originalFieldValue case !foundOriginal && foundPatch: // list was added - merged = patchFieldValue + v, keep := removeDirectives(patchFieldValue) + if !keep { + // Shouldn't be possible since patchFieldValue is a slice + continue + } + + merged = v.([]interface{}) case foundOriginal && foundPatch: merged, err = mergeSliceHandler(originalList, patchList, subschema, patchStrategy, patchMeta.GetPatchMergeKey(), false, mergeOptions) @@ -1270,6 +1276,42 @@ func partitionMapsByPresentInList(original, partitionBy []interface{}, mergeKey return patch, serverOnly, nil } +// Removes directives from an object and returns value to use instead and whether +// or not the field/index should even be kept +// May modify input +func removeDirectives(obj interface{}) (interface{}, bool) { + if obj == nil { + return obj, true + } else if typedV, ok := obj.(map[string]interface{}); ok { + if _, hasDirective := typedV[directiveMarker]; hasDirective { + return nil, false + } + + for k, v := range typedV { + var keep bool + typedV[k], keep = removeDirectives(v) + if !keep { + delete(typedV, k) + } + } + return typedV, true + } else if typedV, ok := obj.([]interface{}); ok { + var res []interface{} + if typedV != nil { + // Make sure res is non-nil if patch is non-nil + res = []interface{}{} + } + for _, v := range typedV { + if newV, keep := removeDirectives(v); keep { + res = append(res, newV) + } + } + return res, true + } else { + return obj, true + } +} + // Merge fields from a patch map into the original map. Note: This may modify // both the original map and the patch because getting a deep copy of a map in // golang is highly non-trivial. @@ -1333,7 +1375,10 @@ func mergeMap(original, patch map[string]interface{}, schema LookupPatchMeta, me if mergeOptions.IgnoreUnmatchedNulls { discardNullValuesFromPatch(patchV) } - original[k] = patchV + original[k], ok = removeDirectives(patchV) + if !ok { + delete(original, k) + } } continue } @@ -1345,7 +1390,10 @@ func mergeMap(original, patch map[string]interface{}, schema LookupPatchMeta, me if mergeOptions.IgnoreUnmatchedNulls { discardNullValuesFromPatch(patchV) } - original[k] = patchV + original[k], ok = removeDirectives(patchV) + if !ok { + delete(original, k) + } } continue } @@ -1372,7 +1420,11 @@ func mergeMap(original, patch map[string]interface{}, schema LookupPatchMeta, me } original[k], err = mergeSliceHandler(original[k], patchV, subschema, patchStrategy, patchMeta.GetPatchMergeKey(), isDeleteList, mergeOptions) default: - original[k] = patchV + original[k], ok = removeDirectives(patchV) + if !ok { + // if patchV itself is a directive, then don't keep it + delete(original, k) + } } if err != nil { return nil, err @@ -1425,7 +1477,8 @@ func mergeSliceHandler(original, patch interface{}, schema LookupPatchMeta, return nil, err } - if fieldPatchStrategy == mergeDirective { + // Delete lists are handled the same way regardless of what the field's patch strategy is + if fieldPatchStrategy == mergeDirective || isDeleteList { return mergeSlice(typedOriginal, typedPatch, schema, fieldPatchMergeKey, mergeOptions, isDeleteList) } else { return typedPatch, nil diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go b/tools/vendor/k8s.io/apimachinery/pkg/util/version/doc.go similarity index 51% rename from tools/vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go rename to tools/vendor/k8s.io/apimachinery/pkg/util/version/doc.go index 8c25cbb2a..5b2b22b6d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/version/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright 2016 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,24 +14,5 @@ See the License for the specific language governing permissions and limitations under the License. */ -package resmap - -import ( - "sort" - - "sigs.k8s.io/kustomize/kyaml/resid" -) - -// IdSlice implements the sort interface. -type IdSlice []resid.ResId - -var _ sort.Interface = IdSlice{} - -func (a IdSlice) Len() int { return len(a) } -func (a IdSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a IdSlice) Less(i, j int) bool { - if !a[i].Gvk.Equals(a[j].Gvk) { - return a[i].Gvk.IsLessThan(a[j].Gvk) - } - return a[i].LegacySortString() < a[j].LegacySortString() -} +// Package version provides utilities for version number comparisons +package version // import "k8s.io/apimachinery/pkg/util/version" diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/version/version.go b/tools/vendor/k8s.io/apimachinery/pkg/util/version/version.go new file mode 100644 index 000000000..4c6195695 --- /dev/null +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/version/version.go @@ -0,0 +1,330 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package version + +import ( + "bytes" + "fmt" + "regexp" + "strconv" + "strings" +) + +// Version is an opaque representation of a version number +type Version struct { + components []uint + semver bool + preRelease string + buildMetadata string +} + +var ( + // versionMatchRE splits a version string into numeric and "extra" parts + versionMatchRE = regexp.MustCompile(`^\s*v?([0-9]+(?:\.[0-9]+)*)(.*)*$`) + // extraMatchRE splits the "extra" part of versionMatchRE into semver pre-release and build metadata; it does not validate the "no leading zeroes" constraint for pre-release + extraMatchRE = regexp.MustCompile(`^(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?\s*$`) +) + +func parse(str string, semver bool) (*Version, error) { + parts := versionMatchRE.FindStringSubmatch(str) + if parts == nil { + return nil, fmt.Errorf("could not parse %q as version", str) + } + numbers, extra := parts[1], parts[2] + + components := strings.Split(numbers, ".") + if (semver && len(components) != 3) || (!semver && len(components) < 2) { + return nil, fmt.Errorf("illegal version string %q", str) + } + + v := &Version{ + components: make([]uint, len(components)), + semver: semver, + } + for i, comp := range components { + if (i == 0 || semver) && strings.HasPrefix(comp, "0") && comp != "0" { + return nil, fmt.Errorf("illegal zero-prefixed version component %q in %q", comp, str) + } + num, err := strconv.ParseUint(comp, 10, 0) + if err != nil { + return nil, fmt.Errorf("illegal non-numeric version component %q in %q: %v", comp, str, err) + } + v.components[i] = uint(num) + } + + if semver && extra != "" { + extraParts := extraMatchRE.FindStringSubmatch(extra) + if extraParts == nil { + return nil, fmt.Errorf("could not parse pre-release/metadata (%s) in version %q", extra, str) + } + v.preRelease, v.buildMetadata = extraParts[1], extraParts[2] + + for _, comp := range strings.Split(v.preRelease, ".") { + if _, err := strconv.ParseUint(comp, 10, 0); err == nil { + if strings.HasPrefix(comp, "0") && comp != "0" { + return nil, fmt.Errorf("illegal zero-prefixed version component %q in %q", comp, str) + } + } + } + } + + return v, nil +} + +// ParseGeneric parses a "generic" version string. The version string must consist of two +// or more dot-separated numeric fields (the first of which can't have leading zeroes), +// followed by arbitrary uninterpreted data (which need not be separated from the final +// numeric field by punctuation). For convenience, leading and trailing whitespace is +// ignored, and the version can be preceded by the letter "v". See also ParseSemantic. +func ParseGeneric(str string) (*Version, error) { + return parse(str, false) +} + +// MustParseGeneric is like ParseGeneric except that it panics on error +func MustParseGeneric(str string) *Version { + v, err := ParseGeneric(str) + if err != nil { + panic(err) + } + return v +} + +// ParseSemantic parses a version string that exactly obeys the syntax and semantics of +// the "Semantic Versioning" specification (http://semver.org/) (although it ignores +// leading and trailing whitespace, and allows the version to be preceded by "v"). For +// version strings that are not guaranteed to obey the Semantic Versioning syntax, use +// ParseGeneric. +func ParseSemantic(str string) (*Version, error) { + return parse(str, true) +} + +// MustParseSemantic is like ParseSemantic except that it panics on error +func MustParseSemantic(str string) *Version { + v, err := ParseSemantic(str) + if err != nil { + panic(err) + } + return v +} + +// MajorMinor returns a version with the provided major and minor version. +func MajorMinor(major, minor uint) *Version { + return &Version{components: []uint{major, minor}} +} + +// Major returns the major release number +func (v *Version) Major() uint { + return v.components[0] +} + +// Minor returns the minor release number +func (v *Version) Minor() uint { + return v.components[1] +} + +// Patch returns the patch release number if v is a Semantic Version, or 0 +func (v *Version) Patch() uint { + if len(v.components) < 3 { + return 0 + } + return v.components[2] +} + +// BuildMetadata returns the build metadata, if v is a Semantic Version, or "" +func (v *Version) BuildMetadata() string { + return v.buildMetadata +} + +// PreRelease returns the prerelease metadata, if v is a Semantic Version, or "" +func (v *Version) PreRelease() string { + return v.preRelease +} + +// Components returns the version number components +func (v *Version) Components() []uint { + return v.components +} + +// WithMajor returns copy of the version object with requested major number +func (v *Version) WithMajor(major uint) *Version { + result := *v + result.components = []uint{major, v.Minor(), v.Patch()} + return &result +} + +// WithMinor returns copy of the version object with requested minor number +func (v *Version) WithMinor(minor uint) *Version { + result := *v + result.components = []uint{v.Major(), minor, v.Patch()} + return &result +} + +// WithPatch returns copy of the version object with requested patch number +func (v *Version) WithPatch(patch uint) *Version { + result := *v + result.components = []uint{v.Major(), v.Minor(), patch} + return &result +} + +// WithPreRelease returns copy of the version object with requested prerelease +func (v *Version) WithPreRelease(preRelease string) *Version { + result := *v + result.components = []uint{v.Major(), v.Minor(), v.Patch()} + result.preRelease = preRelease + return &result +} + +// WithBuildMetadata returns copy of the version object with requested buildMetadata +func (v *Version) WithBuildMetadata(buildMetadata string) *Version { + result := *v + result.components = []uint{v.Major(), v.Minor(), v.Patch()} + result.buildMetadata = buildMetadata + return &result +} + +// String converts a Version back to a string; note that for versions parsed with +// ParseGeneric, this will not include the trailing uninterpreted portion of the version +// number. +func (v *Version) String() string { + if v == nil { + return "" + } + var buffer bytes.Buffer + + for i, comp := range v.components { + if i > 0 { + buffer.WriteString(".") + } + buffer.WriteString(fmt.Sprintf("%d", comp)) + } + if v.preRelease != "" { + buffer.WriteString("-") + buffer.WriteString(v.preRelease) + } + if v.buildMetadata != "" { + buffer.WriteString("+") + buffer.WriteString(v.buildMetadata) + } + + return buffer.String() +} + +// compareInternal returns -1 if v is less than other, 1 if it is greater than other, or 0 +// if they are equal +func (v *Version) compareInternal(other *Version) int { + + vLen := len(v.components) + oLen := len(other.components) + for i := 0; i < vLen && i < oLen; i++ { + switch { + case other.components[i] < v.components[i]: + return 1 + case other.components[i] > v.components[i]: + return -1 + } + } + + // If components are common but one has more items and they are not zeros, it is bigger + switch { + case oLen < vLen && !onlyZeros(v.components[oLen:]): + return 1 + case oLen > vLen && !onlyZeros(other.components[vLen:]): + return -1 + } + + if !v.semver || !other.semver { + return 0 + } + + switch { + case v.preRelease == "" && other.preRelease != "": + return 1 + case v.preRelease != "" && other.preRelease == "": + return -1 + case v.preRelease == other.preRelease: // includes case where both are "" + return 0 + } + + vPR := strings.Split(v.preRelease, ".") + oPR := strings.Split(other.preRelease, ".") + for i := 0; i < len(vPR) && i < len(oPR); i++ { + vNum, err := strconv.ParseUint(vPR[i], 10, 0) + if err == nil { + oNum, err := strconv.ParseUint(oPR[i], 10, 0) + if err == nil { + switch { + case oNum < vNum: + return 1 + case oNum > vNum: + return -1 + default: + continue + } + } + } + if oPR[i] < vPR[i] { + return 1 + } else if oPR[i] > vPR[i] { + return -1 + } + } + + switch { + case len(oPR) < len(vPR): + return 1 + case len(oPR) > len(vPR): + return -1 + } + + return 0 +} + +// returns false if array contain any non-zero element +func onlyZeros(array []uint) bool { + for _, num := range array { + if num != 0 { + return false + } + } + return true +} + +// AtLeast tests if a version is at least equal to a given minimum version. If both +// Versions are Semantic Versions, this will use the Semantic Version comparison +// algorithm. Otherwise, it will compare only the numeric components, with non-present +// components being considered "0" (ie, "1.4" is equal to "1.4.0"). +func (v *Version) AtLeast(min *Version) bool { + return v.compareInternal(min) != -1 +} + +// LessThan tests if a version is less than a given version. (It is exactly the opposite +// of AtLeast, for situations where asking "is v too old?" makes more sense than asking +// "is v new enough?".) +func (v *Version) LessThan(other *Version) bool { + return v.compareInternal(other) == -1 +} + +// Compare compares v against a version string (which will be parsed as either Semantic +// or non-Semantic depending on v). On success it returns -1 if v is less than other, 1 if +// it is greater than other, or 0 if they are equal. +func (v *Version) Compare(other string) (int, error) { + ov, err := parse(other, v.semver) + if err != nil { + return 0, err + } + return v.compareInternal(ov), nil +} diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go b/tools/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go index 51864d70f..0dd13c626 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go @@ -27,9 +27,11 @@ import ( // the provided timer until the provided context is cancelled, the condition returns // true, or the condition returns an error. If sliding is true, the period is computed // after condition runs. If it is false then period includes the runtime for condition. -// If immediate is false the first delay happens before any call to condition. The -// returned error is the error returned by the last condition or the context error if -// the context was terminated. +// If immediate is false the first delay happens before any call to condition, if +// immediate is true the condition will be invoked before waiting and guarantees that +// the condition is invoked at least once, regardless of whether the context has been +// cancelled. The returned error is the error returned by the last condition or the +// context error if the context was terminated. // // This is the common loop construct for all polling in the wait package. func loopConditionUntilContext(ctx context.Context, t Timer, immediate, sliding bool, condition ConditionWithContextFunc) error { @@ -38,8 +40,17 @@ func loopConditionUntilContext(ctx context.Context, t Timer, immediate, sliding var timeCh <-chan time.Time doneCh := ctx.Done() + // if immediate is true the condition is + // guaranteed to be executed at least once, // if we haven't requested immediate execution, delay once - if !immediate { + if immediate { + if ok, err := func() (bool, error) { + defer runtime.HandleCrash() + return condition(ctx) + }(); err != nil || ok { + return err + } + } else { timeCh = t.C() select { case <-doneCh: diff --git a/tools/vendor/k8s.io/apimachinery/pkg/util/wait/poll.go b/tools/vendor/k8s.io/apimachinery/pkg/util/wait/poll.go index 32e8688ca..231d4c384 100644 --- a/tools/vendor/k8s.io/apimachinery/pkg/util/wait/poll.go +++ b/tools/vendor/k8s.io/apimachinery/pkg/util/wait/poll.go @@ -38,10 +38,10 @@ func PollUntilContextCancel(ctx context.Context, interval time.Duration, immedia // a deadline and is equivalent to: // // deadlineCtx, deadlineCancel := context.WithTimeout(ctx, timeout) -// err := PollUntilContextCancel(ctx, interval, immediate, condition) +// err := PollUntilContextCancel(deadlineCtx, interval, immediate, condition) // // The deadline context will be cancelled if the Poll succeeds before the timeout, simplifying -// inline usage. All other behavior is identical to PollWithContextTimeout. +// inline usage. All other behavior is identical to PollUntilContextCancel. func PollUntilContextTimeout(ctx context.Context, interval, timeout time.Duration, immediate bool, condition ConditionWithContextFunc) error { deadlineCtx, deadlineCancel := context.WithTimeout(ctx, timeout) defer deadlineCancel() @@ -59,7 +59,7 @@ func PollUntilContextTimeout(ctx context.Context, interval, timeout time.Duratio // // If you want to Poll something forever, see PollInfinite. // -// Deprecated: This method does not return errors from context, use PollWithContextTimeout. +// Deprecated: This method does not return errors from context, use PollUntilContextTimeout. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func Poll(interval, timeout time.Duration, condition ConditionFunc) error { @@ -78,7 +78,7 @@ func Poll(interval, timeout time.Duration, condition ConditionFunc) error { // // If you want to Poll something forever, see PollInfinite. // -// Deprecated: This method does not return errors from context, use PollWithContextTimeout. +// Deprecated: This method does not return errors from context, use PollUntilContextTimeout. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollWithContext(ctx context.Context, interval, timeout time.Duration, condition ConditionWithContextFunc) error { @@ -91,7 +91,7 @@ func PollWithContext(ctx context.Context, interval, timeout time.Duration, condi // PollUntil always waits interval before the first run of 'condition'. // 'condition' will always be invoked at least once. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { @@ -104,7 +104,7 @@ func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan st // PollUntilWithContext always waits interval before the first run of 'condition'. // 'condition' will always be invoked at least once. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollUntilWithContext(ctx context.Context, interval time.Duration, condition ConditionWithContextFunc) error { @@ -118,7 +118,7 @@ func PollUntilWithContext(ctx context.Context, interval time.Duration, condition // Some intervals may be missed if the condition takes too long or the time // window is too short. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollInfinite(interval time.Duration, condition ConditionFunc) error { @@ -132,7 +132,7 @@ func PollInfinite(interval time.Duration, condition ConditionFunc) error { // Some intervals may be missed if the condition takes too long or the time // window is too short. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollInfiniteWithContext(ctx context.Context, interval time.Duration, condition ConditionWithContextFunc) error { @@ -150,7 +150,7 @@ func PollInfiniteWithContext(ctx context.Context, interval time.Duration, condit // // If you want to immediately Poll something forever, see PollImmediateInfinite. // -// Deprecated: This method does not return errors from context, use PollWithContextTimeout. +// Deprecated: This method does not return errors from context, use PollUntilContextTimeout. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediate(interval, timeout time.Duration, condition ConditionFunc) error { @@ -168,7 +168,7 @@ func PollImmediate(interval, timeout time.Duration, condition ConditionFunc) err // // If you want to immediately Poll something forever, see PollImmediateInfinite. // -// Deprecated: This method does not return errors from context, use PollWithContextTimeout. +// Deprecated: This method does not return errors from context, use PollUntilContextTimeout. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediateWithContext(ctx context.Context, interval, timeout time.Duration, condition ConditionWithContextFunc) error { @@ -180,7 +180,7 @@ func PollImmediateWithContext(ctx context.Context, interval, timeout time.Durati // PollImmediateUntil runs the 'condition' before waiting for the interval. // 'condition' will always be invoked at least once. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { @@ -193,7 +193,7 @@ func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh // PollImmediateUntilWithContext runs the 'condition' before waiting for the interval. // 'condition' will always be invoked at least once. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediateUntilWithContext(ctx context.Context, interval time.Duration, condition ConditionWithContextFunc) error { @@ -207,7 +207,7 @@ func PollImmediateUntilWithContext(ctx context.Context, interval time.Duration, // Some intervals may be missed if the condition takes too long or the time // window is too short. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) error { @@ -222,7 +222,7 @@ func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) erro // Some intervals may be missed if the condition takes too long or the time // window is too short. // -// Deprecated: This method does not return errors from context, use PollWithContextCancel. +// Deprecated: This method does not return errors from context, use PollUntilContextCancel. // Note that the new method will no longer return ErrWaitTimeout and instead return errors // defined by the context package. Will be removed in a future release. func PollImmediateInfiniteWithContext(ctx context.Context, interval time.Duration, condition ConditionWithContextFunc) error { diff --git a/tools/vendor/k8s.io/apiserver/pkg/audit/context.go b/tools/vendor/k8s.io/apiserver/pkg/audit/context.go index 95a18bcd5..964858737 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/audit/context.go +++ b/tools/vendor/k8s.io/apiserver/pkg/audit/context.go @@ -39,21 +39,18 @@ type AuditContext struct { RequestAuditConfig RequestAuditConfig // Event is the audit Event object that is being captured to be written in - // the API audit log. It is set to nil when the request is not being audited. - Event *auditinternal.Event + // the API audit log. + Event auditinternal.Event - // annotations holds audit annotations that are recorded before the event has been initialized. - // This is represented as a slice rather than a map to preserve order. - annotations []annotation - // annotationMutex guards annotations AND event.Annotations + // annotationMutex guards event.Annotations annotationMutex sync.Mutex - - // auditID is the Audit ID associated with this request. - auditID types.UID } -type annotation struct { - key, value string +// Enabled checks whether auditing is enabled for this audit context. +func (ac *AuditContext) Enabled() bool { + // Note: An unset Level should be considered Enabled, so that request data (e.g. annotations) + // can still be captured before the audit policy is evaluated. + return ac != nil && ac.RequestAuditConfig.Level != auditinternal.LevelNone } // AddAuditAnnotation sets the audit annotation for the given key, value pair. @@ -65,8 +62,7 @@ type annotation struct { // prefer AddAuditAnnotation over LogAnnotation to avoid dropping annotations. func AddAuditAnnotation(ctx context.Context, key, value string) { ac := AuditContextFrom(ctx) - if ac == nil { - // auditing is not enabled + if !ac.Enabled() { return } @@ -81,8 +77,7 @@ func AddAuditAnnotation(ctx context.Context, key, value string) { // keysAndValues are the key-value pairs to add, and must have an even number of items. func AddAuditAnnotations(ctx context.Context, keysAndValues ...string) { ac := AuditContextFrom(ctx) - if ac == nil { - // auditing is not enabled + if !ac.Enabled() { return } @@ -101,8 +96,7 @@ func AddAuditAnnotations(ctx context.Context, keysAndValues ...string) { // restrictions on when this can be called. func AddAuditAnnotationsMap(ctx context.Context, annotations map[string]string) { ac := AuditContextFrom(ctx) - if ac == nil { - // auditing is not enabled + if !ac.Enabled() { return } @@ -114,38 +108,10 @@ func AddAuditAnnotationsMap(ctx context.Context, annotations map[string]string) } } -// addAuditAnnotationLocked is the shared code for recording an audit annotation. This method should -// only be called while the auditAnnotationsMutex is locked. +// addAuditAnnotationLocked records the audit annotation on the event. func addAuditAnnotationLocked(ac *AuditContext, key, value string) { - if ac.Event != nil { - logAnnotation(ac.Event, key, value) - } else { - ac.annotations = append(ac.annotations, annotation{key: key, value: value}) - } -} - -// This is private to prevent reads/write to the slice from outside of this package. -// The audit event should be directly read to get access to the annotations. -func addAuditAnnotationsFrom(ctx context.Context, ev *auditinternal.Event) { - ac := AuditContextFrom(ctx) - if ac == nil { - // auditing is not enabled - return - } - - ac.annotationMutex.Lock() - defer ac.annotationMutex.Unlock() + ae := &ac.Event - for _, kv := range ac.annotations { - logAnnotation(ev, kv.key, kv.value) - } -} - -// LogAnnotation fills in the Annotations according to the key value pair. -func logAnnotation(ae *auditinternal.Event, key, value string) { - if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) { - return - } if ae.Annotations == nil { ae.Annotations = make(map[string]string) } @@ -167,8 +133,8 @@ func WithAuditContext(parent context.Context) context.Context { // AuditEventFrom returns the audit event struct on the ctx func AuditEventFrom(ctx context.Context) *auditinternal.Event { - if o := AuditContextFrom(ctx); o != nil { - return o.Event + if ac := AuditContextFrom(ctx); ac.Enabled() { + return &ac.Event } return nil } @@ -187,20 +153,16 @@ func WithAuditID(ctx context.Context, auditID types.UID) { if auditID == "" { return } - ac := AuditContextFrom(ctx) - if ac == nil { - return - } - ac.auditID = auditID - if ac.Event != nil { + if ac := AuditContextFrom(ctx); ac != nil { ac.Event.AuditID = auditID } } -// AuditIDFrom returns the value of the audit ID from the request context. +// AuditIDFrom returns the value of the audit ID from the request context, along with whether +// auditing is enabled. func AuditIDFrom(ctx context.Context) (types.UID, bool) { if ac := AuditContextFrom(ctx); ac != nil { - return ac.auditID, ac.auditID != "" + return ac.Event.AuditID, true } return "", false } diff --git a/tools/vendor/k8s.io/apiserver/pkg/audit/request.go b/tools/vendor/k8s.io/apiserver/pkg/audit/request.go index 972669536..9185278f0 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/audit/request.go +++ b/tools/vendor/k8s.io/apiserver/pkg/audit/request.go @@ -28,14 +28,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" utilnet "k8s.io/apimachinery/pkg/util/net" auditinternal "k8s.io/apiserver/pkg/apis/audit" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/klog/v2" - - "github.com/google/uuid" ) const ( @@ -43,20 +40,18 @@ const ( userAgentTruncateSuffix = "...TRUNCATED" ) -func NewEventFromRequest(req *http.Request, requestReceivedTimestamp time.Time, level auditinternal.Level, attribs authorizer.Attributes) (*auditinternal.Event, error) { - ev := &auditinternal.Event{ - RequestReceivedTimestamp: metav1.NewMicroTime(requestReceivedTimestamp), - Verb: attribs.GetVerb(), - RequestURI: req.URL.RequestURI(), - UserAgent: maybeTruncateUserAgent(req), - Level: level, +func LogRequestMetadata(ctx context.Context, req *http.Request, requestReceivedTimestamp time.Time, level auditinternal.Level, attribs authorizer.Attributes) { + ac := AuditContextFrom(ctx) + if !ac.Enabled() { + return } + ev := &ac.Event - auditID, found := AuditIDFrom(req.Context()) - if !found { - auditID = types.UID(uuid.New().String()) - } - ev.AuditID = auditID + ev.RequestReceivedTimestamp = metav1.NewMicroTime(requestReceivedTimestamp) + ev.Verb = attribs.GetVerb() + ev.RequestURI = req.URL.RequestURI() + ev.UserAgent = maybeTruncateUserAgent(req) + ev.Level = level ips := utilnet.SourceIPs(req) ev.SourceIPs = make([]string, len(ips)) @@ -84,10 +79,6 @@ func NewEventFromRequest(req *http.Request, requestReceivedTimestamp time.Time, APIVersion: attribs.GetAPIVersion(), } } - - addAuditAnnotationsFrom(req.Context(), ev) - - return ev, nil } // LogImpersonatedUser fills in the impersonated user attributes into an audit event. diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/common/values.go b/tools/vendor/k8s.io/apiserver/pkg/cel/common/values.go index e6d7b9975..d9034a80f 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/common/values.go +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/common/values.go @@ -26,9 +26,10 @@ import ( "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" + "k8s.io/kube-openapi/pkg/validation/strfmt" + "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apiserver/pkg/cel" - "k8s.io/kube-openapi/pkg/validation/strfmt" ) // UnstructuredToVal converts a Kubernetes unstructured data element to a CEL Val. @@ -425,7 +426,22 @@ var _ = traits.Lister(&unstructuredList{}) func (t *unstructuredList) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { switch typeDesc.Kind() { case reflect.Slice: - return t.elements, nil + switch t.itemsSchema.Type() { + // Workaround for https://github.com/kubernetes/kubernetes/issues/117590 until we + // resolve the desired behavior in cel-go via https://github.com/google/cel-go/issues/688 + case "string": + var result []string + for _, e := range t.elements { + s, ok := e.(string) + if !ok { + return nil, fmt.Errorf("expected all elements to be of type string, but got %T", e) + } + result = append(result, s) + } + return result, nil + default: + return t.elements, nil + } } return nil, fmt.Errorf("type conversion error from '%s' to '%s'", t.Type(), typeDesc) } diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/composited.go b/tools/vendor/k8s.io/apiserver/pkg/cel/composited.go deleted file mode 100644 index 9e5e634d0..000000000 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/composited.go +++ /dev/null @@ -1,119 +0,0 @@ -/* -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 cel - -import ( - "github.com/google/cel-go/common/types/ref" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" -) - -var _ ref.TypeProvider = (*CompositedTypeProvider)(nil) -var _ ref.TypeAdapter = (*CompositedTypeAdapter)(nil) - -// CompositedTypeProvider is the provider that tries each of the underlying -// providers in order, and returns result of the first successful attempt. -type CompositedTypeProvider struct { - // Providers contains the underlying type providers. - // If Providers is empty, the CompositedTypeProvider becomes no-op provider. - Providers []ref.TypeProvider -} - -// EnumValue finds out the numeric value of the given enum name. -// The result comes from first provider that returns non-nil. -func (c *CompositedTypeProvider) EnumValue(enumName string) ref.Val { - for _, p := range c.Providers { - val := p.EnumValue(enumName) - if val != nil { - return val - } - } - return nil -} - -// FindIdent takes a qualified identifier name and returns a Value if one -// exists. The result comes from first provider that returns non-nil. -func (c *CompositedTypeProvider) FindIdent(identName string) (ref.Val, bool) { - for _, p := range c.Providers { - val, ok := p.FindIdent(identName) - if ok { - return val, ok - } - } - return nil, false -} - -// FindType finds the Type given a qualified type name, or return false -// if none of the providers finds the type. -// If any of the providers find the type, the first provider that returns true -// will be the result. -func (c *CompositedTypeProvider) FindType(typeName string) (*exprpb.Type, bool) { - for _, p := range c.Providers { - typ, ok := p.FindType(typeName) - if ok { - return typ, ok - } - } - return nil, false -} - -// FindFieldType returns the field type for a checked type value. Returns -// false if none of the providers can find the type. -// If multiple providers can find the field, the result is taken from -// the first that does. -func (c *CompositedTypeProvider) FindFieldType(messageType string, fieldName string) (*ref.FieldType, bool) { - for _, p := range c.Providers { - ft, ok := p.FindFieldType(messageType, fieldName) - if ok { - return ft, ok - } - } - return nil, false -} - -// NewValue creates a new type value from a qualified name and map of field -// name to value. -// If multiple providers can create the new type, the first that returns -// non-nil will decide the result. -func (c *CompositedTypeProvider) NewValue(typeName string, fields map[string]ref.Val) ref.Val { - for _, p := range c.Providers { - v := p.NewValue(typeName, fields) - if v != nil { - return v - } - } - return nil -} - -// CompositedTypeAdapter is the adapter that tries each of the underlying -// type adapter in order until the first successfully conversion. -type CompositedTypeAdapter struct { - // Adapters contains underlying type adapters. - // If Adapters is empty, the CompositedTypeAdapter becomes a no-op adapter. - Adapters []ref.TypeAdapter -} - -// NativeToValue takes the value and convert it into a ref.Val -// The result comes from the first TypeAdapter that returns non-nil. -func (c *CompositedTypeAdapter) NativeToValue(value interface{}) ref.Val { - for _, a := range c.Adapters { - v := a.NativeToValue(value) - if v != nil { - return v - } - } - return nil -} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/environment/base.go b/tools/vendor/k8s.io/apiserver/pkg/cel/environment/base.go new file mode 100644 index 000000000..ed0d34041 --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/environment/base.go @@ -0,0 +1,119 @@ +/* +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 environment + +import ( + "fmt" + "strconv" + "sync" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/ext" + "golang.org/x/sync/singleflight" + + "k8s.io/apimachinery/pkg/util/version" + celconfig "k8s.io/apiserver/pkg/apis/cel" + "k8s.io/apiserver/pkg/cel/library" +) + +// DefaultCompatibilityVersion returns a default compatibility version for use with EnvSet +// that guarantees compatibility with CEL features/libraries/parameters understood by +// an n-1 version +// +// This default will be set to no more than n-1 the current Kubernetes major.minor version. +// +// Note that a default version number less than n-1 indicates a wider range of version +// compatibility than strictly required for rollback. A wide range of compatibility is +// desirable because it means that CEL expressions are portable across a wider range +// of Kubernetes versions. +func DefaultCompatibilityVersion() *version.Version { + return version.MajorMinor(1, 27) +} + +var baseOpts = []VersionedOptions{ + { + // CEL epoch was actually 1.23, but we artificially set it to 1.0 because these + // options should always be present. + IntroducedVersion: version.MajorMinor(1, 0), + EnvOptions: []cel.EnvOption{ + cel.HomogeneousAggregateLiterals(), + // Validate function declarations once during base env initialization, + // so they don't need to be evaluated each time a CEL rule is compiled. + // This is a relatively expensive operation. + cel.EagerlyValidateDeclarations(true), + cel.DefaultUTCTimeZone(true), + + ext.Strings(ext.StringsVersion(0)), + library.URLs(), + library.Regex(), + library.Lists(), + }, + ProgramOptions: []cel.ProgramOption{ + cel.EvalOptions(cel.OptOptimize, cel.OptTrackCost), + cel.CostLimit(celconfig.PerCallLimit), + }, + }, + { + IntroducedVersion: version.MajorMinor(1, 27), + EnvOptions: []cel.EnvOption{ + library.Authz(), + }, + }, + { + IntroducedVersion: version.MajorMinor(1, 28), + EnvOptions: []cel.EnvOption{ + cel.CrossTypeNumericComparisons(true), + cel.OptionalTypes(), + library.Quantity(), + }, + }, + // TODO: switch to ext.Strings version 2 once format() is fixed to work with HomogeneousAggregateLiterals. +} + +// MustBaseEnvSet returns the common CEL base environments for Kubernetes for Version, or panics +// if the version is nil, or does not have major and minor components. +// +// The returned environment contains function libraries, language settings, optimizations and +// runtime cost limits appropriate CEL as it is used in Kubernetes. +// +// The returned environment contains no CEL variable definitions or custom type declarations and +// should be extended to construct environments with the appropriate variable definitions, +// type declarations and any other needed configuration. +func MustBaseEnvSet(ver *version.Version) *EnvSet { + if ver == nil { + panic("version must be non-nil") + } + if len(ver.Components()) < 2 { + panic(fmt.Sprintf("version must contain an major and minor component, but got: %s", ver.String())) + } + key := strconv.FormatUint(uint64(ver.Major()), 10) + "." + strconv.FormatUint(uint64(ver.Minor()), 10) + if entry, ok := baseEnvs.Load(key); ok { + return entry.(*EnvSet) + } + + entry, _, _ := baseEnvsSingleflight.Do(key, func() (interface{}, error) { + entry := mustNewEnvSet(ver, baseOpts) + baseEnvs.Store(key, entry) + return entry, nil + }) + return entry.(*EnvSet) +} + +var ( + baseEnvs = sync.Map{} + baseEnvsSingleflight = &singleflight.Group{} +) diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/environment/environment.go b/tools/vendor/k8s.io/apiserver/pkg/cel/environment/environment.go new file mode 100644 index 000000000..b47bc8e98 --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/environment/environment.go @@ -0,0 +1,274 @@ +/* +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 environment + +import ( + "fmt" + "math" + + "github.com/google/cel-go/cel" + + "k8s.io/apimachinery/pkg/util/version" + apiservercel "k8s.io/apiserver/pkg/cel" +) + +// Type defines the different types of CEL environments used in Kubernetes. +// CEL environments are used to compile and evaluate CEL expressions. +// Environments include: +// - Function libraries +// - Variables +// - Types (both core CEL types and Kubernetes types) +// - Other CEL environment and program options +type Type string + +const ( + // NewExpressions is used to validate new or modified expressions in + // requests that write expressions to API resources. + // + // This environment type is compatible with a specific Kubernetes + // major/minor version. To ensure safe rollback, this environment type + // may not include all the function libraries, variables, type declarations, and CEL + // language settings available in the StoredExpressions environment type. + // + // NewExpressions must be used to validate (parse, compile, type check) + // all new or modified CEL expressions before they are written to storage. + NewExpressions Type = "NewExpressions" + + // StoredExpressions is used to compile and run CEL expressions that have been + // persisted to storage. + // + // This environment type is compatible with CEL expressions that have been + // persisted to storage by all known versions of Kubernetes. This is the most + // permissive environment available. + // + // StoredExpressions is appropriate for use with CEL expressions in + // configuration files. + StoredExpressions Type = "StoredExpressions" +) + +// EnvSet manages the creation and extension of CEL environments. Each EnvSet contains +// both an NewExpressions and StoredExpressions environment. EnvSets are created +// and extended using VersionedOptions so that the EnvSet can prepare environments according +// to what options were introduced at which versions. +// +// Each EnvSet is given a compatibility version when it is created, and prepares the +// NewExpressions environment to be compatible with that version. The EnvSet also +// prepares StoredExpressions to be compatible with all known versions of Kubernetes. +type EnvSet struct { + // compatibilityVersion is the version that all configuration in + // the NewExpressions environment is compatible with. + compatibilityVersion *version.Version + + // newExpressions is an environment containing only configuration + // in this EnvSet that is enabled at this compatibilityVersion. + newExpressions *cel.Env + + // storedExpressions is an environment containing the latest configuration + // in this EnvSet. + storedExpressions *cel.Env +} + +func newEnvSet(compatibilityVersion *version.Version, opts []VersionedOptions) (*EnvSet, error) { + base, err := cel.NewEnv() + if err != nil { + return nil, err + } + baseSet := EnvSet{compatibilityVersion: compatibilityVersion, newExpressions: base, storedExpressions: base} + return baseSet.Extend(opts...) +} + +func mustNewEnvSet(ver *version.Version, opts []VersionedOptions) *EnvSet { + envSet, err := newEnvSet(ver, opts) + if err != nil { + panic(fmt.Sprintf("Default environment misconfigured: %v", err)) + } + return envSet +} + +// NewExpressionsEnv returns the NewExpressions environment Type for this EnvSet. +// See NewExpressions for details. +func (e *EnvSet) NewExpressionsEnv() *cel.Env { + return e.newExpressions +} + +// StoredExpressionsEnv returns the StoredExpressions environment Type for this EnvSet. +// See StoredExpressions for details. +func (e *EnvSet) StoredExpressionsEnv() *cel.Env { + return e.storedExpressions +} + +// Env returns the CEL environment for the given Type. +func (e *EnvSet) Env(envType Type) (*cel.Env, error) { + switch envType { + case NewExpressions: + return e.newExpressions, nil + case StoredExpressions: + return e.storedExpressions, nil + default: + return nil, fmt.Errorf("unsupported environment type: %v", envType) + } +} + +// VersionedOptions provides a set of CEL configuration options as well as the version the +// options were introduced and, optionally, the version the options were removed. +type VersionedOptions struct { + // IntroducedVersion is the version at which these options were introduced. + // The NewExpressions environment will only include options introduced at or before the + // compatibility version of the EnvSet. + // + // For example, to configure a CEL environment with an "object" variable bound to a + // resource kind, first create a DeclType from the groupVersionKind of the resource and then + // populate a VersionedOptions with the variable and the type: + // + // schema := schemaResolver.ResolveSchema(groupVersionKind) + // objectType := apiservercel.SchemaDeclType(schema, true) + // ... + // VersionOptions{ + // IntroducedVersion: version.MajorMinor(1, 26), + // DeclTypes: []*apiservercel.DeclType{ objectType }, + // EnvOptions: []cel.EnvOption{ cel.Variable("object", objectType.CelType()) }, + // }, + // + // To create an DeclType from a CRD, use a structural schema. For example: + // + // schema := structuralschema.NewStructural(crdJSONProps) + // objectType := apiservercel.SchemaDeclType(schema, true) + // + // Required. + IntroducedVersion *version.Version + // RemovedVersion is the version at which these options were removed. + // The NewExpressions environment will not include options removed at or before the + // compatibility version of the EnvSet. + // + // All option removals must be backward compatible; the removal must either be paired + // with a compatible replacement introduced at the same version, or the removal must be non-breaking. + // The StoredExpressions environment will not include removed options. + // + // A function library may be upgraded by setting the RemovedVersion of the old library + // to the same value as the IntroducedVersion of the new library. The new library must + // be backward compatible with the old library. + // + // For example: + // + // VersionOptions{ + // IntroducedVersion: version.MajorMinor(1, 26), RemovedVersion: version.MajorMinor(1, 27), + // EnvOptions: []cel.EnvOption{ libraries.Example(libraries.ExampleVersion(1)) }, + // }, + // VersionOptions{ + // IntroducedVersion: version.MajorMinor(1, 27), + // EnvOptions: []EnvOptions{ libraries.Example(libraries.ExampleVersion(2)) }, + // }, + // + // Optional. + RemovedVersion *version.Version + + // EnvOptions provides CEL EnvOptions. This may be used to add a cel.Variable, a + // cel.Library, or to enable other CEL EnvOptions such as language settings. + // + // If an added cel.Variable has an OpenAPI type, the type must be included in DeclTypes. + EnvOptions []cel.EnvOption + // ProgramOptions provides CEL ProgramOptions. This may be used to set a cel.CostLimit, + // enable optimizations, and set other program level options that should be enabled + // for all programs using this environment. + ProgramOptions []cel.ProgramOption + // DeclTypes provides OpenAPI type declarations to register with the environment. + // + // If cel.Variables added to EnvOptions refer to a OpenAPI type, the type must be included in + // DeclTypes. + DeclTypes []*apiservercel.DeclType +} + +// Extend returns an EnvSet based on this EnvSet but extended with given VersionedOptions. +// This EnvSet is not mutated. +// The returned EnvSet has the same compatibility version as the EnvSet that was extended. +// +// Extend is an expensive operation and each call to Extend that adds DeclTypes increases +// the depth of a chain of resolvers. For these reasons, calls to Extend should be kept +// to a minimum. +// +// Some best practices: +// +// - Minimize calls Extend when handling API requests. Where possible, call Extend +// when initializing components. +// - If an EnvSets returned by Extend can be used to compile multiple CEL programs, +// call Extend once and reuse the returned EnvSets. +// - Prefer a single call to Extend with a full list of VersionedOptions over +// making multiple calls to Extend. +func (e *EnvSet) Extend(options ...VersionedOptions) (*EnvSet, error) { + if len(options) > 0 { + newExprOpts, err := e.filterAndBuildOpts(e.newExpressions, e.compatibilityVersion, options) + if err != nil { + return nil, err + } + p, err := e.newExpressions.Extend(newExprOpts) + if err != nil { + return nil, err + } + storedExprOpt, err := e.filterAndBuildOpts(e.storedExpressions, version.MajorMinor(math.MaxUint, math.MaxUint), options) + if err != nil { + return nil, err + } + s, err := e.storedExpressions.Extend(storedExprOpt) + if err != nil { + return nil, err + } + return &EnvSet{compatibilityVersion: e.compatibilityVersion, newExpressions: p, storedExpressions: s}, nil + } + return e, nil +} + +func (e *EnvSet) filterAndBuildOpts(base *cel.Env, compatVer *version.Version, opts []VersionedOptions) (cel.EnvOption, error) { + var envOpts []cel.EnvOption + var progOpts []cel.ProgramOption + var declTypes []*apiservercel.DeclType + + for _, opt := range opts { + if compatVer.AtLeast(opt.IntroducedVersion) && (opt.RemovedVersion == nil || compatVer.LessThan(opt.RemovedVersion)) { + envOpts = append(envOpts, opt.EnvOptions...) + progOpts = append(progOpts, opt.ProgramOptions...) + declTypes = append(declTypes, opt.DeclTypes...) + } + } + + if len(declTypes) > 0 { + provider := apiservercel.NewDeclTypeProvider(declTypes...) + providerOpts, err := provider.EnvOptions(base.TypeProvider()) + if err != nil { + return nil, err + } + envOpts = append(envOpts, providerOpts...) + } + + combined := cel.Lib(&envLoader{ + envOpts: envOpts, + progOpts: progOpts, + }) + return combined, nil +} + +type envLoader struct { + envOpts []cel.EnvOption + progOpts []cel.ProgramOption +} + +func (e *envLoader) CompileOptions() []cel.EnvOption { + return e.envOpts +} + +func (e *envLoader) ProgramOptions() []cel.ProgramOption { + return e.progOpts +} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/authz.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/authz.go index 606e5769a..00f0200e8 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/library/authz.go +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/library/authz.go @@ -174,6 +174,26 @@ import ( // Examples: // // authorizer.path('/healthz').check('GET').reason() +// +// errored +// +// Returns true if the authorization check resulted in an error. +// +// .errored() +// +// Examples: +// +// authorizer.group('').resource('pods').namespace('default').check('create').errored() // Returns true if the authorization check resulted in an error +// +// error +// +// If the authorization check resulted in an error, returns the error. Otherwise, returns the empty string. +// +// .error() +// +// Examples: +// +// authorizer.group('').resource('pods').namespace('default').check('create').error() func Authz() cel.EnvOption { return cel.Lib(authzLib) } @@ -209,6 +229,12 @@ var authzLibraryDecls = map[string][]cel.FunctionOpt{ cel.BinaryBinding(pathCheckCheck)), cel.MemberOverload("resourcecheck_check", []*cel.Type{ResourceCheckType, cel.StringType}, DecisionType, cel.BinaryBinding(resourceCheckCheck))}, + "errored": { + cel.MemberOverload("decision_errored", []*cel.Type{DecisionType}, cel.BoolType, + cel.UnaryBinding(decisionErrored))}, + "error": { + cel.MemberOverload("decision_error", []*cel.Type{DecisionType}, cel.StringType, + cel.UnaryBinding(decisionError))}, "allowed": { cel.MemberOverload("decision_allowed", []*cel.Type{DecisionType}, cel.BoolType, cel.UnaryBinding(decisionAllowed))}, @@ -384,6 +410,27 @@ func resourceCheckCheck(arg1, arg2 ref.Val) ref.Val { return resourceCheck.Authorize(context.TODO(), apiVerb) } +func decisionErrored(arg ref.Val) ref.Val { + decision, ok := arg.(decisionVal) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + return types.Bool(decision.err != nil) +} + +func decisionError(arg ref.Val) ref.Val { + decision, ok := arg.(decisionVal) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + if decision.err == nil { + return types.String("") + } + return types.String(decision.err.Error()) +} + func decisionAllowed(arg ref.Val) ref.Val { decision, ok := arg.(decisionVal) if !ok { @@ -478,10 +525,7 @@ func (a pathCheckVal) Authorize(ctx context.Context, verb string) ref.Val { } decision, reason, err := a.authorizer.authAuthorizer.Authorize(ctx, attr) - if err != nil { - return types.NewErr("error in authorization check: %v", err) - } - return newDecision(decision, reason) + return newDecision(decision, err, reason) } type groupCheckVal struct { @@ -516,18 +560,16 @@ func (a resourceCheckVal) Authorize(ctx context.Context, verb string) ref.Val { User: a.groupCheck.authorizer.userInfo, } decision, reason, err := a.groupCheck.authorizer.authAuthorizer.Authorize(ctx, attr) - if err != nil { - return types.NewErr("error in authorization check: %v", err) - } - return newDecision(decision, reason) + return newDecision(decision, err, reason) } -func newDecision(authDecision authorizer.Decision, reason string) decisionVal { - return decisionVal{receiverOnlyObjectVal: receiverOnlyVal(DecisionType), authDecision: authDecision, reason: reason} +func newDecision(authDecision authorizer.Decision, err error, reason string) decisionVal { + return decisionVal{receiverOnlyObjectVal: receiverOnlyVal(DecisionType), authDecision: authDecision, err: err, reason: reason} } type decisionVal struct { receiverOnlyObjectVal + err error authDecision authorizer.Decision reason string } diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/cost.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/cost.go index 6cc629032..5201d187b 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/library/cost.go +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/library/cost.go @@ -41,7 +41,7 @@ func (l *CostEstimator) CallCost(function, overloadId string, args []ref.Val, re // This cost is set to allow for only two authorization checks per expression cost := uint64(350000) return &cost - case "serviceAccount", "path", "group", "resource", "subresource", "namespace", "name", "allowed", "denied", "reason": + case "serviceAccount", "path", "group", "resource", "subresource", "namespace", "name", "allowed", "reason", "error", "errored": // All authorization builder and accessor functions have a nominal cost cost := uint64(1) return &cost @@ -91,7 +91,7 @@ func (l *CostEstimator) EstimateCallCost(function, overloadId string, target *ch // An authorization check has a fixed cost // This cost is set to allow for only two authorization checks per expression return &checker.CallEstimate{CostEstimate: checker.CostEstimate{Min: 350000, Max: 350000}} - case "serviceAccount", "path", "group", "resource", "subresource", "namespace", "name", "allowed", "denied", "reason": + case "serviceAccount", "path", "group", "resource", "subresource", "namespace", "name", "allowed", "reason", "error", "errored": // All authorization builder and accessor functions have a nominal cost return &checker.CallEstimate{CostEstimate: checker.CostEstimate{Min: 1, Max: 1}} case "isSorted", "sum", "max", "min", "indexOf", "lastIndexOf": diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/libraries.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/libraries.go deleted file mode 100644 index e2e8fc29b..000000000 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/library/libraries.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -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 library - -import ( - "github.com/google/cel-go/cel" - "github.com/google/cel-go/ext" - "github.com/google/cel-go/interpreter" -) - -// ExtensionLibs declares the set of CEL extension libraries available everywhere CEL is used in Kubernetes. -var ExtensionLibs = append(k8sExtensionLibs, ext.Strings()) - -var k8sExtensionLibs = []cel.EnvOption{ - URLs(), - Regex(), - Lists(), - Authz(), -} - -var ExtensionLibRegexOptimizations = []*interpreter.RegexOptimization{FindRegexOptimization, FindAllRegexOptimization} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/quantity.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/quantity.go new file mode 100644 index 000000000..49e3dae7c --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/library/quantity.go @@ -0,0 +1,375 @@ +/* +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 library + +import ( + "errors" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "k8s.io/apimachinery/pkg/api/resource" + apiservercel "k8s.io/apiserver/pkg/cel" +) + +// Quantity provides a CEL function library extension of Kubernetes +// resource.Quantity parsing functions. See `resource.Quantity` +// documentation for more detailed information about the format itself: +// https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity +// +// quantity +// +// Converts a string to a Quantity or results in an error if the string is not a valid Quantity. Refer +// to resource.Quantity documentation for information on accepted patterns. +// +// quantity() +// +// Examples: +// +// quantity('1.5G') // returns a Quantity +// quantity('200k') // returns a Quantity +// quantity('200K') // error +// quantity('Three') // error +// quantity('Mi') // error +// +// isQuantity +// +// Returns true if a string is a valid Quantity. isQuantity returns true if and +// only if quantity does not result in error. +// +// isQuantity( ) +// +// Examples: +// +// isQuantity('1.3G') // returns true +// isQuantity('1.3Gi') // returns true +// isQuantity('1,3G') // returns false +// isQuantity('10000k') // returns true +// isQuantity('200K') // returns false +// isQuantity('Three') // returns false +// isQuantity('Mi') // returns false +// +// Conversion to Scalars: +// +// - isInteger: returns true if and only if asInteger is safe to call without an error +// +// - asInteger: returns a representation of the current value as an int64 if +// possible or results in an error if conversion would result in overflow +// or loss of precision. +// +// - asApproximateFloat: returns a float64 representation of the quantity which may +// lose precision. If the value of the quantity is outside the range of a float64 +// +Inf/-Inf will be returned. +// +// .isInteger() +// .asInteger() +// .asApproximateFloat() +// +// Examples: +// +// quantity("50000000G").isInteger() // returns true +// quantity("50k").isInteger() // returns true +// quantity("9999999999999999999999999999999999999G").asInteger() // error: cannot convert value to integer +// quantity("9999999999999999999999999999999999999G").isInteger() // returns false +// quantity("50k").asInteger() == 50000 // returns true +// quantity("50k").sub(20000).asApproximateFloat() == 30000 // returns true +// +// Arithmetic +// +// - sign: Returns `1` if the quantity is positive, `-1` if it is negative. `0` if it is zero +// +// - add: Returns sum of two quantities or a quantity and an integer +// +// - sub: Returns difference between two quantities or a quantity and an integer +// +// .sign() +// .add() +// .add() +// .sub() +// .sub() +// +// Examples: +// +// quantity("50k").add("20k") == quantity("70k") // returns true +// quantity("50k").add(20) == quantity("50020") // returns true +// quantity("50k").sub("20k") == quantity("30k") // returns true +// quantity("50k").sub(20000) == quantity("30k") // returns true +// quantity("50k").add(20).sub(quantity("100k")).sub(-50000) == quantity("20") // returns true +// +// Comparisons +// +// - isGreaterThan: Returns true if and only if the receiver is greater than the operand +// +// - isLessThan: Returns true if and only if the receiver is less than the operand +// +// - compareTo: Compares receiver to operand and returns 0 if they are equal, 1 if the receiver is greater, or -1 if the receiver is less than the operand +// +// +// .isLessThan() +// .isGreaterThan() +// .compareTo() +// +// Examples: +// +// quantity("200M").compareTo(quantity("0.2G")) // returns 0 +// quantity("50M").compareTo(quantity("50Mi")) // returns -1 +// quantity("50Mi").compareTo(quantity("50M")) // returns 1 +// quantity("150Mi").isGreaterThan(quantity("100Mi")) // returns true +// quantity("50Mi").isGreaterThan(quantity("100Mi")) // returns false +// quantity("50M").isLessThan(quantity("100M")) // returns true +// quantity("100M").isLessThan(quantity("50M")) // returns false + +func Quantity() cel.EnvOption { + return cel.Lib(quantityLib) +} + +var quantityLib = &quantity{} + +type quantity struct{} + +var quantityLibraryDecls = map[string][]cel.FunctionOpt{ + "quantity": { + cel.Overload("string_to_quantity", []*cel.Type{cel.StringType}, apiservercel.QuantityType, cel.UnaryBinding((stringToQuantity))), + }, + "isQuantity": { + cel.Overload("is_quantity_string", []*cel.Type{cel.StringType}, cel.BoolType, cel.UnaryBinding(isQuantity)), + }, + "sign": { + cel.Overload("quantity_sign", []*cel.Type{apiservercel.QuantityType}, cel.IntType, cel.UnaryBinding(quantityGetSign)), + }, + "isGreaterThan": { + cel.MemberOverload("quantity_is_greater_than", []*cel.Type{apiservercel.QuantityType, apiservercel.QuantityType}, cel.BoolType, cel.BinaryBinding(quantityIsGreaterThan)), + }, + "isLessThan": { + cel.MemberOverload("quantity_is_less_than", []*cel.Type{apiservercel.QuantityType, apiservercel.QuantityType}, cel.BoolType, cel.BinaryBinding(quantityIsLessThan)), + }, + "compareTo": { + cel.MemberOverload("quantity_compare_to", []*cel.Type{apiservercel.QuantityType, apiservercel.QuantityType}, cel.IntType, cel.BinaryBinding(quantityCompareTo)), + }, + "asApproximateFloat": { + cel.MemberOverload("quantity_get_float", []*cel.Type{apiservercel.QuantityType}, cel.DoubleType, cel.UnaryBinding(quantityGetApproximateFloat)), + }, + "asInteger": { + cel.MemberOverload("quantity_get_int", []*cel.Type{apiservercel.QuantityType}, cel.IntType, cel.UnaryBinding(quantityGetValue)), + }, + "isInteger": { + cel.MemberOverload("quantity_is_integer", []*cel.Type{apiservercel.QuantityType}, cel.BoolType, cel.UnaryBinding(quantityCanValue)), + }, + "add": { + cel.MemberOverload("quantity_add", []*cel.Type{apiservercel.QuantityType, apiservercel.QuantityType}, apiservercel.QuantityType, cel.BinaryBinding(quantityAdd)), + cel.MemberOverload("quantity_add_int", []*cel.Type{apiservercel.QuantityType, cel.IntType}, apiservercel.QuantityType, cel.BinaryBinding(quantityAddInt)), + }, + "sub": { + cel.MemberOverload("quantity_sub", []*cel.Type{apiservercel.QuantityType, apiservercel.QuantityType}, apiservercel.QuantityType, cel.BinaryBinding(quantitySub)), + cel.MemberOverload("quantity_sub_int", []*cel.Type{apiservercel.QuantityType, cel.IntType}, apiservercel.QuantityType, cel.BinaryBinding(quantitySubInt)), + }, +} + +func (*quantity) CompileOptions() []cel.EnvOption { + options := make([]cel.EnvOption, 0, len(quantityLibraryDecls)) + for name, overloads := range quantityLibraryDecls { + options = append(options, cel.Function(name, overloads...)) + } + return options +} + +func (*quantity) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +func isQuantity(arg ref.Val) ref.Val { + str, ok := arg.Value().(string) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + _, err := resource.ParseQuantity(str) + if err != nil { + return types.Bool(false) + } + + return types.Bool(true) +} + +func stringToQuantity(arg ref.Val) ref.Val { + str, ok := arg.Value().(string) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q, err := resource.ParseQuantity(str) + if err != nil { + return types.WrapErr(err) + } + + return apiservercel.Quantity{Quantity: &q} +} + +func quantityGetApproximateFloat(arg ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + return types.Double(q.AsApproximateFloat64()) +} + +func quantityCanValue(arg ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + _, success := q.AsInt64() + return types.Bool(success) +} + +func quantityGetValue(arg ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + v, success := q.AsInt64() + if !success { + return types.WrapErr(errors.New("cannot convert value to integer")) + } + return types.Int(v) +} + +func quantityGetSign(arg ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + return types.Int(q.Sign()) +} + +func quantityIsGreaterThan(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + return types.Bool(q.Cmp(*q2) == 1) +} + +func quantityIsLessThan(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + return types.Bool(q.Cmp(*q2) == -1) +} + +func quantityCompareTo(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + return types.Int(q.Cmp(*q2)) +} + +func quantityAdd(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + copy := *q + copy.Add(*q2) + return &apiservercel.Quantity{ + Quantity: ©, + } +} + +func quantityAddInt(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(int64) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2Converted := *resource.NewQuantity(q2, resource.DecimalExponent) + + copy := *q + copy.Add(q2Converted) + return &apiservercel.Quantity{ + Quantity: ©, + } +} + +func quantitySub(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + copy := *q + copy.Sub(*q2) + return &apiservercel.Quantity{ + Quantity: ©, + } +} + +func quantitySubInt(arg ref.Val, other ref.Val) ref.Val { + q, ok := arg.Value().(*resource.Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2, ok := other.Value().(int64) + if !ok { + return types.MaybeNoSuchOverloadErr(arg) + } + + q2Converted := *resource.NewQuantity(q2, resource.DecimalExponent) + + copy := *q + copy.Sub(q2Converted) + return &apiservercel.Quantity{ + Quantity: ©, + } +} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/regex.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/regex.go index 6db5ef195..17fb3d44c 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/library/regex.go +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/library/regex.go @@ -77,7 +77,9 @@ func (*regex) CompileOptions() []cel.EnvOption { } func (*regex) ProgramOptions() []cel.ProgramOption { - return []cel.ProgramOption{} + return []cel.ProgramOption{ + cel.OptimizeRegex(FindRegexOptimization, FindAllRegexOptimization), + } } func find(strVal ref.Val, regexVal ref.Val) ref.Val { diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/library/test.go b/tools/vendor/k8s.io/apiserver/pkg/cel/library/test.go new file mode 100644 index 000000000..95446f63c --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/library/test.go @@ -0,0 +1,79 @@ +/* +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 library + +import ( + "math" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" +) + +// Test provides a test() function that returns true. +func Test(options ...TestOption) cel.EnvOption { + t := &testLib{version: math.MaxUint32} + for _, o := range options { + t = o(t) + } + return cel.Lib(t) +} + +type testLib struct { + version uint32 +} + +type TestOption func(*testLib) *testLib + +func TestVersion(version uint32) func(lib *testLib) *testLib { + return func(sl *testLib) *testLib { + sl.version = version + return sl + } +} + +func (t *testLib) CompileOptions() []cel.EnvOption { + var options []cel.EnvOption + + if t.version == 0 { + options = append(options, cel.Function("test", + cel.Overload("test", []*cel.Type{}, cel.BoolType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + return types.True + })))) + } + + if t.version >= 1 { + options = append(options, cel.Function("test", + cel.Overload("test", []*cel.Type{}, cel.BoolType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + // Return false here so tests can observe which version of the function is registered + // Actual function libraries must not break backward compatibility + return types.False + })))) + options = append(options, cel.Function("testV1", + cel.Overload("testV1", []*cel.Type{}, cel.BoolType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + return types.True + })))) + } + return options +} + +func (*testLib) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/adaptor.go b/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/adaptor.go new file mode 100644 index 000000000..0e2cc6e2b --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/adaptor.go @@ -0,0 +1,147 @@ +/* +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 openapi + +import ( + "github.com/google/cel-go/common/types/ref" + + apiservercel "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/common" + "k8s.io/kube-openapi/pkg/validation/spec" +) + +var _ common.Schema = (*Schema)(nil) +var _ common.SchemaOrBool = (*SchemaOrBool)(nil) + +type Schema struct { + Schema *spec.Schema +} + +type SchemaOrBool struct { + SchemaOrBool *spec.SchemaOrBool +} + +func (sb *SchemaOrBool) Schema() common.Schema { + return &Schema{Schema: sb.SchemaOrBool.Schema} +} + +func (sb *SchemaOrBool) Allows() bool { + return sb.SchemaOrBool.Allows +} + +func (s *Schema) Type() string { + if len(s.Schema.Type) == 0 { + return "" + } + return s.Schema.Type[0] +} + +func (s *Schema) Format() string { + return s.Schema.Format +} + +func (s *Schema) Items() common.Schema { + if s.Schema.Items == nil || s.Schema.Items.Schema == nil { + return nil + } + return &Schema{Schema: s.Schema.Items.Schema} +} + +func (s *Schema) Properties() map[string]common.Schema { + if s.Schema.Properties == nil { + return nil + } + res := make(map[string]common.Schema, len(s.Schema.Properties)) + for n, prop := range s.Schema.Properties { + // map value is unaddressable, create a shallow copy + // this is a shallow non-recursive copy + s := prop + res[n] = &Schema{Schema: &s} + } + return res +} + +func (s *Schema) AdditionalProperties() common.SchemaOrBool { + if s.Schema.AdditionalProperties == nil { + return nil + } + return &SchemaOrBool{SchemaOrBool: s.Schema.AdditionalProperties} +} + +func (s *Schema) Default() any { + return s.Schema.Default +} + +func (s *Schema) MaxItems() *int64 { + return s.Schema.MaxItems +} + +func (s *Schema) MaxLength() *int64 { + return s.Schema.MaxLength +} + +func (s *Schema) MaxProperties() *int64 { + return s.Schema.MaxProperties +} + +func (s *Schema) Required() []string { + return s.Schema.Required +} + +func (s *Schema) Enum() []any { + return s.Schema.Enum +} + +func (s *Schema) Nullable() bool { + return s.Schema.Nullable +} + +func (s *Schema) IsXIntOrString() bool { + return isXIntOrString(s.Schema) +} + +func (s *Schema) IsXEmbeddedResource() bool { + return isXEmbeddedResource(s.Schema) +} + +func (s *Schema) IsXPreserveUnknownFields() bool { + return isXPreserveUnknownFields(s.Schema) +} + +func (s *Schema) XListType() string { + return getXListType(s.Schema) +} + +func (s *Schema) XListMapKeys() []string { + return getXListMapKeys(s.Schema) +} + +func (s *Schema) WithTypeAndObjectMeta() common.Schema { + return &Schema{common.WithTypeAndObjectMeta(s.Schema)} +} + +func UnstructuredToVal(unstructured any, schema *spec.Schema) ref.Val { + return common.UnstructuredToVal(unstructured, &Schema{schema}) +} + +func SchemaDeclType(s *spec.Schema, isResourceRoot bool) *apiservercel.DeclType { + return common.SchemaDeclType(&Schema{Schema: s}, isResourceRoot) +} + +func MakeMapList(sts *spec.Schema, items []interface{}) (rv common.MapList) { + return common.MakeMapList(&Schema{Schema: sts}, items) +} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/extensions.go b/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/extensions.go new file mode 100644 index 000000000..6a2f83032 --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/openapi/extensions.go @@ -0,0 +1,62 @@ +/* +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 openapi + +import ( + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kube-openapi/pkg/validation/spec" +) + +var intOrStringFormat = intstr.IntOrString{}.OpenAPISchemaFormat() + +func isExtension(schema *spec.Schema, key string) bool { + v, ok := schema.Extensions.GetBool(key) + return v && ok +} + +func isXIntOrString(schema *spec.Schema) bool { + // built-in types have the Format while CRDs use extension + // both are valid, checking both + return schema.Format == intOrStringFormat || isExtension(schema, extIntOrString) +} + +func isXEmbeddedResource(schema *spec.Schema) bool { + return isExtension(schema, extEmbeddedResource) +} + +func isXPreserveUnknownFields(schema *spec.Schema) bool { + return isExtension(schema, extPreserveUnknownFields) +} + +func getXListType(schema *spec.Schema) string { + s, _ := schema.Extensions.GetString(extListType) + return s +} + +func getXListMapKeys(schema *spec.Schema) []string { + mapKeys, ok := schema.Extensions.GetStringSlice(extListMapKeys) + if !ok { + return nil + } + return mapKeys +} + +const extIntOrString = "x-kubernetes-int-or-string" +const extEmbeddedResource = "x-kubernetes-embedded-resource" +const extPreserveUnknownFields = "x-kubernetes-preserve-unknown-fields" +const extListType = "x-kubernetes-list-type" +const extListMapKeys = "x-kubernetes-list-map-keys" diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/quantity.go b/tools/vendor/k8s.io/apiserver/pkg/cel/quantity.go new file mode 100644 index 000000000..1057e33fe --- /dev/null +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/quantity.go @@ -0,0 +1,76 @@ +/* +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 cel + +import ( + "fmt" + "reflect" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/checker/decls" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "k8s.io/apimachinery/pkg/api/resource" +) + +var ( + QuantityObject = decls.NewObjectType("kubernetes.Quantity") + quantityTypeValue = types.NewTypeValue("kubernetes.Quantity") + QuantityType = cel.ObjectType("kubernetes.Quantity") +) + +// Quantity provdes a CEL representation of a resource.Quantity +type Quantity struct { + *resource.Quantity +} + +func (d Quantity) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { + if reflect.TypeOf(d.Quantity).AssignableTo(typeDesc) { + return d.Quantity, nil + } + if reflect.TypeOf("").AssignableTo(typeDesc) { + return d.Quantity.String(), nil + } + return nil, fmt.Errorf("type conversion error from 'Quantity' to '%v'", typeDesc) +} + +func (d Quantity) ConvertToType(typeVal ref.Type) ref.Val { + switch typeVal { + case typeValue: + return d + case types.TypeType: + return quantityTypeValue + default: + return types.NewErr("type conversion error from '%s' to '%s'", quantityTypeValue, typeVal) + } +} + +func (d Quantity) Equal(other ref.Val) ref.Val { + otherDur, ok := other.(Quantity) + if !ok { + return types.MaybeNoSuchOverloadErr(other) + } + return types.Bool(d.Quantity.Equal(*otherDur.Quantity)) +} + +func (d Quantity) Type() ref.Type { + return quantityTypeValue +} + +func (d Quantity) Value() interface{} { + return d.Quantity +} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/registry.go b/tools/vendor/k8s.io/apiserver/pkg/cel/registry.go deleted file mode 100644 index 1aee3a127..000000000 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/registry.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -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 cel - -import ( - "sync" - - "github.com/google/cel-go/cel" -) - -// Resolver declares methods to find policy templates and related configuration objects. -type Resolver interface { - // FindType returns a DeclType instance corresponding to the given fully-qualified name, if - // present. - FindType(name string) (*DeclType, bool) -} - -// NewRegistry create a registry for keeping track of environments and types -// from a base cel.Env expression environment. -func NewRegistry(stdExprEnv *cel.Env) *Registry { - return &Registry{ - exprEnvs: map[string]*cel.Env{"": stdExprEnv}, - types: map[string]*DeclType{ - BoolType.TypeName(): BoolType, - BytesType.TypeName(): BytesType, - DoubleType.TypeName(): DoubleType, - DurationType.TypeName(): DurationType, - IntType.TypeName(): IntType, - NullType.TypeName(): NullType, - StringType.TypeName(): StringType, - TimestampType.TypeName(): TimestampType, - UintType.TypeName(): UintType, - ListType.TypeName(): ListType, - MapType.TypeName(): MapType, - }, - } -} - -// Registry defines a repository of environment, schema, template, and type definitions. -// -// Registry instances are concurrency-safe. -type Registry struct { - rwMux sync.RWMutex - exprEnvs map[string]*cel.Env - types map[string]*DeclType -} - -// FindType implements the Resolver interface method. -func (r *Registry) FindType(name string) (*DeclType, bool) { - r.rwMux.RLock() - defer r.rwMux.RUnlock() - typ, found := r.types[name] - if found { - return typ, true - } - return typ, found -} - -// SetType registers a DeclType descriptor by its fully qualified name. -func (r *Registry) SetType(name string, declType *DeclType) error { - r.rwMux.Lock() - defer r.rwMux.Unlock() - r.types[name] = declType - return nil -} diff --git a/tools/vendor/k8s.io/apiserver/pkg/cel/types.go b/tools/vendor/k8s.io/apiserver/pkg/cel/types.go index b2cc92d59..bd14e1697 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/cel/types.go +++ b/tools/vendor/k8s.io/apiserver/pkg/cel/types.go @@ -319,44 +319,53 @@ func (f *DeclField) EnumValues() []ref.Val { return ev } -// NewRuleTypes returns an Open API Schema-based type-system which is CEL compatible. -func NewRuleTypes(kind string, - declType *DeclType, - res Resolver) (*RuleTypes, error) { +func allTypesForDecl(declTypes []*DeclType) map[string]*DeclType { + if declTypes == nil { + return nil + } + allTypes := map[string]*DeclType{} + for _, declType := range declTypes { + for k, t := range FieldTypeMap(declType.TypeName(), declType) { + allTypes[k] = t + } + } + + return allTypes +} + +// NewDeclTypeProvider returns an Open API Schema-based type-system which is CEL compatible. +func NewDeclTypeProvider(rootTypes ...*DeclType) *DeclTypeProvider { // Note, if the schema indicates that it's actually based on another proto // then prefer the proto definition. For expressions in the proto, a new field // annotation will be needed to indicate the expected environment and type of // the expression. - schemaTypes, err := newSchemaTypeProvider(kind, declType) - if err != nil { - return nil, err + allTypes := allTypesForDecl(rootTypes) + return &DeclTypeProvider{ + registeredTypes: allTypes, } - if schemaTypes == nil { - return nil, nil - } - return &RuleTypes{ - ruleSchemaDeclTypes: schemaTypes, - resolver: res, - }, nil } -// RuleTypes extends the CEL ref.TypeProvider interface and provides an Open API Schema-based +// DeclTypeProvider extends the CEL ref.TypeProvider interface and provides an Open API Schema-based // type-system. -type RuleTypes struct { - ref.TypeProvider - ruleSchemaDeclTypes *schemaTypeProvider - typeAdapter ref.TypeAdapter - resolver Resolver +type DeclTypeProvider struct { + registeredTypes map[string]*DeclType + typeProvider ref.TypeProvider + typeAdapter ref.TypeAdapter +} + +func (rt *DeclTypeProvider) EnumValue(enumName string) ref.Val { + return rt.typeProvider.EnumValue(enumName) +} + +func (rt *DeclTypeProvider) FindIdent(identName string) (ref.Val, bool) { + return rt.typeProvider.FindIdent(identName) } // EnvOptions returns a set of cel.EnvOption values which includes the declaration set // as well as a custom ref.TypeProvider. // -// Note, the standard declaration set includes 'rule' which is defined as the top-level rule-schema -// type if one is configured. -// -// If the RuleTypes value is nil, an empty []cel.EnvOption set is returned. -func (rt *RuleTypes) EnvOptions(tp ref.TypeProvider) ([]cel.EnvOption, error) { +// If the DeclTypeProvider value is nil, an empty []cel.EnvOption set is returned. +func (rt *DeclTypeProvider) EnvOptions(tp ref.TypeProvider) ([]cel.EnvOption, error) { if rt == nil { return []cel.EnvOption{}, nil } @@ -367,13 +376,12 @@ func (rt *RuleTypes) EnvOptions(tp ref.TypeProvider) ([]cel.EnvOption, error) { return []cel.EnvOption{ cel.CustomTypeProvider(rtWithTypes), cel.CustomTypeAdapter(rtWithTypes), - cel.Variable("rule", rt.ruleSchemaDeclTypes.root.CelType()), }, nil } -// WithTypeProvider returns a new RuleTypes that sets the given TypeProvider -// If the original RuleTypes is nil, the returned RuleTypes is still nil. -func (rt *RuleTypes) WithTypeProvider(tp ref.TypeProvider) (*RuleTypes, error) { +// WithTypeProvider returns a new DeclTypeProvider that sets the given TypeProvider +// If the original DeclTypeProvider is nil, the returned DeclTypeProvider is still nil. +func (rt *DeclTypeProvider) WithTypeProvider(tp ref.TypeProvider) (*DeclTypeProvider, error) { if rt == nil { return nil, nil } @@ -382,13 +390,12 @@ func (rt *RuleTypes) WithTypeProvider(tp ref.TypeProvider) (*RuleTypes, error) { if ok { ta = tpa } - rtWithTypes := &RuleTypes{ - TypeProvider: tp, - typeAdapter: ta, - ruleSchemaDeclTypes: rt.ruleSchemaDeclTypes, - resolver: rt.resolver, + rtWithTypes := &DeclTypeProvider{ + typeProvider: tp, + typeAdapter: ta, + registeredTypes: rt.registeredTypes, } - for name, declType := range rt.ruleSchemaDeclTypes.types { + for name, declType := range rt.registeredTypes { tpType, found := tp.FindType(name) expT, err := declType.ExprType() if err != nil { @@ -396,7 +403,7 @@ func (rt *RuleTypes) WithTypeProvider(tp ref.TypeProvider) (*RuleTypes, error) { } if found && !proto.Equal(tpType, expT) { return nil, fmt.Errorf( - "type %s definition differs between CEL environment and rule", name) + "type %s definition differs between CEL environment and type provider", name) } } return rtWithTypes, nil @@ -409,7 +416,7 @@ func (rt *RuleTypes) WithTypeProvider(tp ref.TypeProvider) (*RuleTypes, error) { // // Note, when the type name is based on the Open API Schema, the name will reflect the object path // where the type definition appears. -func (rt *RuleTypes) FindType(typeName string) (*exprpb.Type, bool) { +func (rt *DeclTypeProvider) FindType(typeName string) (*exprpb.Type, bool) { if rt == nil { return nil, false } @@ -421,11 +428,11 @@ func (rt *RuleTypes) FindType(typeName string) (*exprpb.Type, bool) { } return expT, found } - return rt.TypeProvider.FindType(typeName) + return rt.typeProvider.FindType(typeName) } // FindDeclType returns the CPT type description which can be mapped to a CEL type. -func (rt *RuleTypes) FindDeclType(typeName string) (*DeclType, bool) { +func (rt *DeclTypeProvider) FindDeclType(typeName string) (*DeclType, bool) { if rt == nil { return nil, false } @@ -438,10 +445,10 @@ func (rt *RuleTypes) FindDeclType(typeName string) (*DeclType, bool) { // If, in the future an object instance rather than a type name were provided, the field // resolution might more accurately reflect the expected type model. However, in this case // concessions were made to align with the existing CEL interfaces. -func (rt *RuleTypes) FindFieldType(typeName, fieldName string) (*ref.FieldType, bool) { +func (rt *DeclTypeProvider) FindFieldType(typeName, fieldName string) (*ref.FieldType, bool) { st, found := rt.findDeclType(typeName) if !found { - return rt.TypeProvider.FindFieldType(typeName, fieldName) + return rt.typeProvider.FindFieldType(typeName, fieldName) } f, found := st.Fields[fieldName] @@ -471,48 +478,63 @@ func (rt *RuleTypes) FindFieldType(typeName, fieldName string) (*ref.FieldType, // NativeToValue is an implementation of the ref.TypeAdapater interface which supports conversion // of rule values to CEL ref.Val instances. -func (rt *RuleTypes) NativeToValue(val interface{}) ref.Val { +func (rt *DeclTypeProvider) NativeToValue(val interface{}) ref.Val { return rt.typeAdapter.NativeToValue(val) } -// TypeNames returns the list of type names declared within the RuleTypes object. -func (rt *RuleTypes) TypeNames() []string { - typeNames := make([]string, len(rt.ruleSchemaDeclTypes.types)) +func (rt *DeclTypeProvider) NewValue(typeName string, fields map[string]ref.Val) ref.Val { + // TODO: implement for OpenAPI types to enable CEL object instantiation, which is needed + // for mutating admission. + return rt.typeProvider.NewValue(typeName, fields) +} + +// TypeNames returns the list of type names declared within the DeclTypeProvider object. +func (rt *DeclTypeProvider) TypeNames() []string { + typeNames := make([]string, len(rt.registeredTypes)) i := 0 - for name := range rt.ruleSchemaDeclTypes.types { + for name := range rt.registeredTypes { typeNames[i] = name i++ } return typeNames } -func (rt *RuleTypes) findDeclType(typeName string) (*DeclType, bool) { - declType, found := rt.ruleSchemaDeclTypes.types[typeName] +func (rt *DeclTypeProvider) findDeclType(typeName string) (*DeclType, bool) { + declType, found := rt.registeredTypes[typeName] if found { return declType, true } - declType, found = rt.resolver.FindType(typeName) - if found { - return declType, true + declType = findScalar(typeName) + return declType, declType != nil +} + +func findScalar(typename string) *DeclType { + switch typename { + case BoolType.TypeName(): + return BoolType + case BytesType.TypeName(): + return BytesType + case DoubleType.TypeName(): + return DoubleType + case DurationType.TypeName(): + return DurationType + case IntType.TypeName(): + return IntType + case NullType.TypeName(): + return NullType + case StringType.TypeName(): + return StringType + case TimestampType.TypeName(): + return TimestampType + case UintType.TypeName(): + return UintType + case ListType.TypeName(): + return ListType + case MapType.TypeName(): + return MapType + default: + return nil } - return nil, false -} - -func newSchemaTypeProvider(kind string, declType *DeclType) (*schemaTypeProvider, error) { - if declType == nil { - return nil, nil - } - root := declType.MaybeAssignTypeName(kind) - types := FieldTypeMap(kind, root) - return &schemaTypeProvider{ - root: root, - types: types, - }, nil -} - -type schemaTypeProvider struct { - root *DeclType - types map[string]*DeclType } var ( diff --git a/tools/vendor/k8s.io/apiserver/pkg/features/kube_features.go b/tools/vendor/k8s.io/apiserver/pkg/features/kube_features.go index 72cd49375..f1d1879ec 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/features/kube_features.go +++ b/tools/vendor/k8s.io/apiserver/pkg/features/kube_features.go @@ -37,6 +37,7 @@ const ( // owner: @ivelichkovich, @tallclair // alpha: v1.27 + // beta: v1.28 // kep: https://kep.k8s.io/3716 // // Enables usage of MatchConditions fields to use CEL expressions for matching on admission webhooks @@ -87,16 +88,6 @@ const ( // Add support for distributed tracing in the API Server APIServerTracing featuregate.Feature = "APIServerTracing" - // owner: @tallclair - // alpha: v1.7 - // beta: v1.8 - // GA: v1.12 - // - // AdvancedAuditing enables a much more general API auditing pipeline, which includes support for - // pluggable output backends and an audit policy specifying how different requests should be - // audited. - AdvancedAuditing featuregate.Feature = "AdvancedAuditing" - // owner: @cici37 @jpbetz // kep: http://kep.k8s.io/3488 // alpha: v1.26 @@ -112,17 +103,6 @@ const ( // Enables expression validation for Custom Resource CustomResourceValidationExpressions featuregate.Feature = "CustomResourceValidationExpressions" - // owner: @apelisse - // alpha: v1.12 - // beta: v1.13 - // stable: v1.18 - // - // Allow requests to be processed but not stored, so that - // validation, merging, mutation can be tested without - // committing. - DryRun featuregate.Feature = "DryRun" - - // owner: @wojtek-t // alpha: v1.20 // beta: v1.21 // GA: v1.24 @@ -130,6 +110,13 @@ const ( // Allows for updating watchcache resource version with progress notify events. EfficientWatchResumption featuregate.Feature = "EfficientWatchResumption" + // owner: @aramase + // kep: https://kep.k8s.io/3299 + // deprecated: v1.28 + // + // Enables KMS v1 API for encryption at rest. + KMSv1 featuregate.Feature = "KMSv1" + // owner: @aramase // kep: https://kep.k8s.io/3299 // alpha: v1.25 @@ -138,6 +125,13 @@ const ( // Enables KMS v2 API for encryption at rest. KMSv2 featuregate.Feature = "KMSv2" + // owner: @enj + // kep: https://kep.k8s.io/3299 + // beta: v1.28 + // + // Enables the use of derived encryption keys with KMS v2. + KMSv2KDF featuregate.Feature = "KMSv2KDF" + // owner: @jiahuif // kep: https://kep.k8s.io/2887 // alpha: v1.23 @@ -222,6 +216,13 @@ const ( // // Allow the API server to stream individual items instead of chunking WatchList featuregate.Feature = "WatchList" + + // owner: @serathius + // kep: http://kep.k8s.io/2340 + // alpha: v1.28 + // + // Allow the API server to serve consistent lists from cache + ConsistentListFromCache featuregate.Feature = "ConsistentListFromCache" ) func init() { @@ -235,7 +236,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS AggregatedDiscoveryEndpoint: {Default: true, PreRelease: featuregate.Beta}, - AdmissionWebhookMatchConditions: {Default: false, PreRelease: featuregate.Alpha}, + AdmissionWebhookMatchConditions: {Default: true, PreRelease: featuregate.Beta}, APIListChunking: {Default: true, PreRelease: featuregate.Beta}, @@ -247,18 +248,18 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS APIServerTracing: {Default: true, PreRelease: featuregate.Beta}, - AdvancedAuditing: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.28 - - ValidatingAdmissionPolicy: {Default: false, PreRelease: featuregate.Alpha}, + ValidatingAdmissionPolicy: {Default: false, PreRelease: featuregate.Beta}, CustomResourceValidationExpressions: {Default: true, PreRelease: featuregate.Beta}, - DryRun: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.28 - EfficientWatchResumption: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + KMSv1: {Default: true, PreRelease: featuregate.Deprecated}, + KMSv2: {Default: true, PreRelease: featuregate.Beta}, + KMSv2KDF: {Default: false, PreRelease: featuregate.Beta}, // default and lock to true in 1.29, remove in 1.31 + OpenAPIEnums: {Default: true, PreRelease: featuregate.Beta}, OpenAPIV3: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.29 @@ -280,4 +281,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS InPlacePodVerticalScaling: {Default: false, PreRelease: featuregate.Alpha}, WatchList: {Default: false, PreRelease: featuregate.Alpha}, + + ConsistentListFromCache: {Default: false, PreRelease: featuregate.Alpha}, } diff --git a/tools/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go b/tools/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go index a69506de6..95e4060bd 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go +++ b/tools/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go @@ -243,6 +243,7 @@ func restConfigFromKubeconfig(configAuthInfo *clientcmdapi.AuthInfo) (*rest.Conf if len(configAuthInfo.Impersonate) > 0 { config.Impersonate = rest.ImpersonationConfig{ UserName: configAuthInfo.Impersonate, + UID: configAuthInfo.ImpersonateUID, Groups: configAuthInfo.ImpersonateGroups, Extra: configAuthInfo.ImpersonateUserExtra, } diff --git a/tools/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go b/tools/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go index 45143bf6e..b03640ae8 100644 --- a/tools/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go +++ b/tools/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go @@ -62,7 +62,7 @@ type GenericWebhook struct { // Otherwise it returns false for an immediate fail. func DefaultShouldRetry(err error) bool { // these errors indicate a transient error that should be retried. - if utilnet.IsConnectionReset(err) || apierrors.IsInternalError(err) || apierrors.IsTimeout(err) || apierrors.IsTooManyRequests(err) { + if utilnet.IsConnectionReset(err) || utilnet.IsHTTP2ConnectionLost(err) || apierrors.IsInternalError(err) || apierrors.IsTimeout(err) || apierrors.IsTooManyRequests(err) { return true } // if the error sends the Retry-After header, we respect it as an explicit confirmation we should retry. diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go index 1102f65f3..0951cae8a 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go @@ -18,11 +18,18 @@ limitations under the License. package v1alpha1 +import ( + v1alpha1 "k8s.io/api/admissionregistration/v1alpha1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + // ParamRefApplyConfiguration represents an declarative configuration of the ParamRef type for use // with apply. type ParamRefApplyConfiguration struct { - Name *string `json:"name,omitempty"` - Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + ParameterNotFoundAction *v1alpha1.ParameterNotFoundActionType `json:"parameterNotFoundAction,omitempty"` } // ParamRefApplyConfiguration constructs an declarative configuration of the ParamRef type for use with @@ -46,3 +53,19 @@ func (b *ParamRefApplyConfiguration) WithNamespace(value string) *ParamRefApplyC b.Namespace = &value return b } + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ParamRefApplyConfiguration { + b.Selector = value + return b +} + +// WithParameterNotFoundAction sets the ParameterNotFoundAction field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ParameterNotFoundAction field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithParameterNotFoundAction(value v1alpha1.ParameterNotFoundActionType) *ParamRefApplyConfiguration { + b.ParameterNotFoundAction = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go index f674b5b1e..7ee320e42 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go @@ -31,6 +31,7 @@ type ValidatingAdmissionPolicySpecApplyConfiguration struct { FailurePolicy *admissionregistrationv1alpha1.FailurePolicyType `json:"failurePolicy,omitempty"` AuditAnnotations []AuditAnnotationApplyConfiguration `json:"auditAnnotations,omitempty"` MatchConditions []MatchConditionApplyConfiguration `json:"matchConditions,omitempty"` + Variables []VariableApplyConfiguration `json:"variables,omitempty"` } // ValidatingAdmissionPolicySpecApplyConfiguration constructs an declarative configuration of the ValidatingAdmissionPolicySpec type for use with @@ -101,3 +102,16 @@ func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithMatchConditions(va } return b } + +// WithVariables adds the given value to the Variables field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Variables field. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithVariables(values ...*VariableApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVariables") + } + b.Variables = append(b.Variables, *values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/variable.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/variable.go new file mode 100644 index 000000000..2c70a8cfb --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/variable.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// VariableApplyConfiguration represents an declarative configuration of the Variable type for use +// with apply. +type VariableApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Expression *string `json:"expression,omitempty"` +} + +// VariableApplyConfiguration constructs an declarative configuration of the Variable type for use with +// apply. +func Variable() *VariableApplyConfiguration { + return &VariableApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VariableApplyConfiguration) WithName(value string) *VariableApplyConfiguration { + b.Name = &value + return b +} + +// WithExpression sets the Expression field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Expression field is set to the value of the last call. +func (b *VariableApplyConfiguration) WithExpression(value string) *VariableApplyConfiguration { + b.Expression = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/auditannotation.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/auditannotation.go new file mode 100644 index 000000000..e92fba0dd --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/auditannotation.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AuditAnnotationApplyConfiguration represents an declarative configuration of the AuditAnnotation type for use +// with apply. +type AuditAnnotationApplyConfiguration struct { + Key *string `json:"key,omitempty"` + ValueExpression *string `json:"valueExpression,omitempty"` +} + +// AuditAnnotationApplyConfiguration constructs an declarative configuration of the AuditAnnotation type for use with +// apply. +func AuditAnnotation() *AuditAnnotationApplyConfiguration { + return &AuditAnnotationApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *AuditAnnotationApplyConfiguration) WithKey(value string) *AuditAnnotationApplyConfiguration { + b.Key = &value + return b +} + +// WithValueExpression sets the ValueExpression field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ValueExpression field is set to the value of the last call. +func (b *AuditAnnotationApplyConfiguration) WithValueExpression(value string) *AuditAnnotationApplyConfiguration { + b.ValueExpression = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/expressionwarning.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/expressionwarning.go new file mode 100644 index 000000000..059c1b94b --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/expressionwarning.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ExpressionWarningApplyConfiguration represents an declarative configuration of the ExpressionWarning type for use +// with apply. +type ExpressionWarningApplyConfiguration struct { + FieldRef *string `json:"fieldRef,omitempty"` + Warning *string `json:"warning,omitempty"` +} + +// ExpressionWarningApplyConfiguration constructs an declarative configuration of the ExpressionWarning type for use with +// apply. +func ExpressionWarning() *ExpressionWarningApplyConfiguration { + return &ExpressionWarningApplyConfiguration{} +} + +// WithFieldRef sets the FieldRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldRef field is set to the value of the last call. +func (b *ExpressionWarningApplyConfiguration) WithFieldRef(value string) *ExpressionWarningApplyConfiguration { + b.FieldRef = &value + return b +} + +// WithWarning sets the Warning field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Warning field is set to the value of the last call. +func (b *ExpressionWarningApplyConfiguration) WithWarning(value string) *ExpressionWarningApplyConfiguration { + b.Warning = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/matchresources.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/matchresources.go new file mode 100644 index 000000000..25d4139db --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/matchresources.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MatchResourcesApplyConfiguration represents an declarative configuration of the MatchResources type for use +// with apply. +type MatchResourcesApplyConfiguration struct { + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + ObjectSelector *v1.LabelSelectorApplyConfiguration `json:"objectSelector,omitempty"` + ResourceRules []NamedRuleWithOperationsApplyConfiguration `json:"resourceRules,omitempty"` + ExcludeResourceRules []NamedRuleWithOperationsApplyConfiguration `json:"excludeResourceRules,omitempty"` + MatchPolicy *admissionregistrationv1beta1.MatchPolicyType `json:"matchPolicy,omitempty"` +} + +// MatchResourcesApplyConfiguration constructs an declarative configuration of the MatchResources type for use with +// apply. +func MatchResources() *MatchResourcesApplyConfiguration { + return &MatchResourcesApplyConfiguration{} +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *MatchResourcesApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *MatchResourcesApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithObjectSelector sets the ObjectSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObjectSelector field is set to the value of the last call. +func (b *MatchResourcesApplyConfiguration) WithObjectSelector(value *v1.LabelSelectorApplyConfiguration) *MatchResourcesApplyConfiguration { + b.ObjectSelector = value + return b +} + +// WithResourceRules adds the given value to the ResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceRules field. +func (b *MatchResourcesApplyConfiguration) WithResourceRules(values ...*NamedRuleWithOperationsApplyConfiguration) *MatchResourcesApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithResourceRules") + } + b.ResourceRules = append(b.ResourceRules, *values[i]) + } + return b +} + +// WithExcludeResourceRules adds the given value to the ExcludeResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ExcludeResourceRules field. +func (b *MatchResourcesApplyConfiguration) WithExcludeResourceRules(values ...*NamedRuleWithOperationsApplyConfiguration) *MatchResourcesApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithExcludeResourceRules") + } + b.ExcludeResourceRules = append(b.ExcludeResourceRules, *values[i]) + } + return b +} + +// WithMatchPolicy sets the MatchPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchPolicy field is set to the value of the last call. +func (b *MatchResourcesApplyConfiguration) WithMatchPolicy(value admissionregistrationv1beta1.MatchPolicyType) *MatchResourcesApplyConfiguration { + b.MatchPolicy = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/namedrulewithoperations.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/namedrulewithoperations.go new file mode 100644 index 000000000..fa346c4a5 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/namedrulewithoperations.go @@ -0,0 +1,95 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" + v1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1" +) + +// NamedRuleWithOperationsApplyConfiguration represents an declarative configuration of the NamedRuleWithOperations type for use +// with apply. +type NamedRuleWithOperationsApplyConfiguration struct { + ResourceNames []string `json:"resourceNames,omitempty"` + v1.RuleWithOperationsApplyConfiguration `json:",inline"` +} + +// NamedRuleWithOperationsApplyConfiguration constructs an declarative configuration of the NamedRuleWithOperations type for use with +// apply. +func NamedRuleWithOperations() *NamedRuleWithOperationsApplyConfiguration { + return &NamedRuleWithOperationsApplyConfiguration{} +} + +// WithResourceNames adds the given value to the ResourceNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceNames field. +func (b *NamedRuleWithOperationsApplyConfiguration) WithResourceNames(values ...string) *NamedRuleWithOperationsApplyConfiguration { + for i := range values { + b.ResourceNames = append(b.ResourceNames, values[i]) + } + return b +} + +// WithOperations adds the given value to the Operations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Operations field. +func (b *NamedRuleWithOperationsApplyConfiguration) WithOperations(values ...admissionregistrationv1.OperationType) *NamedRuleWithOperationsApplyConfiguration { + for i := range values { + b.Operations = append(b.Operations, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *NamedRuleWithOperationsApplyConfiguration) WithAPIGroups(values ...string) *NamedRuleWithOperationsApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithAPIVersions adds the given value to the APIVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIVersions field. +func (b *NamedRuleWithOperationsApplyConfiguration) WithAPIVersions(values ...string) *NamedRuleWithOperationsApplyConfiguration { + for i := range values { + b.APIVersions = append(b.APIVersions, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *NamedRuleWithOperationsApplyConfiguration) WithResources(values ...string) *NamedRuleWithOperationsApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *NamedRuleWithOperationsApplyConfiguration) WithScope(value admissionregistrationv1.ScopeType) *NamedRuleWithOperationsApplyConfiguration { + b.Scope = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramkind.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramkind.go new file mode 100644 index 000000000..6050e6025 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramkind.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ParamKindApplyConfiguration represents an declarative configuration of the ParamKind type for use +// with apply. +type ParamKindApplyConfiguration struct { + APIVersion *string `json:"apiVersion,omitempty"` + Kind *string `json:"kind,omitempty"` +} + +// ParamKindApplyConfiguration constructs an declarative configuration of the ParamKind type for use with +// apply. +func ParamKind() *ParamKindApplyConfiguration { + return &ParamKindApplyConfiguration{} +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ParamKindApplyConfiguration) WithAPIVersion(value string) *ParamKindApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ParamKindApplyConfiguration) WithKind(value string) *ParamKindApplyConfiguration { + b.Kind = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramref.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramref.go new file mode 100644 index 000000000..2be98dbc5 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/paramref.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ParamRefApplyConfiguration represents an declarative configuration of the ParamRef type for use +// with apply. +type ParamRefApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + ParameterNotFoundAction *v1beta1.ParameterNotFoundActionType `json:"parameterNotFoundAction,omitempty"` +} + +// ParamRefApplyConfiguration constructs an declarative configuration of the ParamRef type for use with +// apply. +func ParamRef() *ParamRefApplyConfiguration { + return &ParamRefApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithName(value string) *ParamRefApplyConfiguration { + b.Name = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithNamespace(value string) *ParamRefApplyConfiguration { + b.Namespace = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ParamRefApplyConfiguration { + b.Selector = value + return b +} + +// WithParameterNotFoundAction sets the ParameterNotFoundAction field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ParameterNotFoundAction field is set to the value of the last call. +func (b *ParamRefApplyConfiguration) WithParameterNotFoundAction(value v1beta1.ParameterNotFoundActionType) *ParamRefApplyConfiguration { + b.ParameterNotFoundAction = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/typechecking.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/typechecking.go new file mode 100644 index 000000000..07baf334c --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/typechecking.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// TypeCheckingApplyConfiguration represents an declarative configuration of the TypeChecking type for use +// with apply. +type TypeCheckingApplyConfiguration struct { + ExpressionWarnings []ExpressionWarningApplyConfiguration `json:"expressionWarnings,omitempty"` +} + +// TypeCheckingApplyConfiguration constructs an declarative configuration of the TypeChecking type for use with +// apply. +func TypeChecking() *TypeCheckingApplyConfiguration { + return &TypeCheckingApplyConfiguration{} +} + +// WithExpressionWarnings adds the given value to the ExpressionWarnings field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ExpressionWarnings field. +func (b *TypeCheckingApplyConfiguration) WithExpressionWarnings(values ...*ExpressionWarningApplyConfiguration) *TypeCheckingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithExpressionWarnings") + } + b.ExpressionWarnings = append(b.ExpressionWarnings, *values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicy.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicy.go new file mode 100644 index 000000000..e144bc9f7 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicy.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingAdmissionPolicyApplyConfiguration represents an declarative configuration of the ValidatingAdmissionPolicy type for use +// with apply. +type ValidatingAdmissionPolicyApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ValidatingAdmissionPolicySpecApplyConfiguration `json:"spec,omitempty"` + Status *ValidatingAdmissionPolicyStatusApplyConfiguration `json:"status,omitempty"` +} + +// ValidatingAdmissionPolicy constructs an declarative configuration of the ValidatingAdmissionPolicy type for use with +// apply. +func ValidatingAdmissionPolicy(name string) *ValidatingAdmissionPolicyApplyConfiguration { + b := &ValidatingAdmissionPolicyApplyConfiguration{} + b.WithName(name) + b.WithKind("ValidatingAdmissionPolicy") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b +} + +// ExtractValidatingAdmissionPolicy extracts the applied configuration owned by fieldManager from +// validatingAdmissionPolicy. If no managedFields are found in validatingAdmissionPolicy for fieldManager, a +// ValidatingAdmissionPolicyApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. It is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// validatingAdmissionPolicy must be a unmodified ValidatingAdmissionPolicy API object that was retrieved from the Kubernetes API. +// ExtractValidatingAdmissionPolicy provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractValidatingAdmissionPolicy(validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicy, fieldManager string) (*ValidatingAdmissionPolicyApplyConfiguration, error) { + return extractValidatingAdmissionPolicy(validatingAdmissionPolicy, fieldManager, "") +} + +// ExtractValidatingAdmissionPolicyStatus is the same as ExtractValidatingAdmissionPolicy except +// that it extracts the status subresource applied configuration. +// Experimental! +func ExtractValidatingAdmissionPolicyStatus(validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicy, fieldManager string) (*ValidatingAdmissionPolicyApplyConfiguration, error) { + return extractValidatingAdmissionPolicy(validatingAdmissionPolicy, fieldManager, "status") +} + +func extractValidatingAdmissionPolicy(validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicy, fieldManager string, subresource string) (*ValidatingAdmissionPolicyApplyConfiguration, error) { + b := &ValidatingAdmissionPolicyApplyConfiguration{} + err := managedfields.ExtractInto(validatingAdmissionPolicy, internal.Parser().Type("io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicy"), fieldManager, b, subresource) + if err != nil { + return nil, err + } + b.WithName(validatingAdmissionPolicy.Name) + + b.WithKind("ValidatingAdmissionPolicy") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithKind(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithAPIVersion(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithName(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithGenerateName(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithNamespace(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithUID(value types.UID) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithResourceVersion(value string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithGeneration(value int64) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithLabels(entries map[string]string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithAnnotations(entries map[string]string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithFinalizers(values ...string) *ValidatingAdmissionPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +func (b *ValidatingAdmissionPolicyApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithSpec(value *ValidatingAdmissionPolicySpecApplyConfiguration) *ValidatingAdmissionPolicyApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyApplyConfiguration) WithStatus(value *ValidatingAdmissionPolicyStatusApplyConfiguration) *ValidatingAdmissionPolicyApplyConfiguration { + b.Status = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybinding.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybinding.go new file mode 100644 index 000000000..0dc06aede --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybinding.go @@ -0,0 +1,247 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingAdmissionPolicyBindingApplyConfiguration represents an declarative configuration of the ValidatingAdmissionPolicyBinding type for use +// with apply. +type ValidatingAdmissionPolicyBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ValidatingAdmissionPolicyBindingSpecApplyConfiguration `json:"spec,omitempty"` +} + +// ValidatingAdmissionPolicyBinding constructs an declarative configuration of the ValidatingAdmissionPolicyBinding type for use with +// apply. +func ValidatingAdmissionPolicyBinding(name string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b := &ValidatingAdmissionPolicyBindingApplyConfiguration{} + b.WithName(name) + b.WithKind("ValidatingAdmissionPolicyBinding") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b +} + +// ExtractValidatingAdmissionPolicyBinding extracts the applied configuration owned by fieldManager from +// validatingAdmissionPolicyBinding. If no managedFields are found in validatingAdmissionPolicyBinding for fieldManager, a +// ValidatingAdmissionPolicyBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. It is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// validatingAdmissionPolicyBinding must be a unmodified ValidatingAdmissionPolicyBinding API object that was retrieved from the Kubernetes API. +// ExtractValidatingAdmissionPolicyBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractValidatingAdmissionPolicyBinding(validatingAdmissionPolicyBinding *admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding, fieldManager string) (*ValidatingAdmissionPolicyBindingApplyConfiguration, error) { + return extractValidatingAdmissionPolicyBinding(validatingAdmissionPolicyBinding, fieldManager, "") +} + +// ExtractValidatingAdmissionPolicyBindingStatus is the same as ExtractValidatingAdmissionPolicyBinding except +// that it extracts the status subresource applied configuration. +// Experimental! +func ExtractValidatingAdmissionPolicyBindingStatus(validatingAdmissionPolicyBinding *admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding, fieldManager string) (*ValidatingAdmissionPolicyBindingApplyConfiguration, error) { + return extractValidatingAdmissionPolicyBinding(validatingAdmissionPolicyBinding, fieldManager, "status") +} + +func extractValidatingAdmissionPolicyBinding(validatingAdmissionPolicyBinding *admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding, fieldManager string, subresource string) (*ValidatingAdmissionPolicyBindingApplyConfiguration, error) { + b := &ValidatingAdmissionPolicyBindingApplyConfiguration{} + err := managedfields.ExtractInto(validatingAdmissionPolicyBinding, internal.Parser().Type("io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding"), fieldManager, b, subresource) + if err != nil { + return nil, err + } + b.WithName(validatingAdmissionPolicyBinding.Name) + + b.WithKind("ValidatingAdmissionPolicyBinding") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithKind(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithAPIVersion(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithName(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithGenerateName(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithNamespace(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithUID(value types.UID) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithResourceVersion(value string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithGeneration(value int64) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithLabels(entries map[string]string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithAnnotations(entries map[string]string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithFinalizers(values ...string) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingApplyConfiguration) WithSpec(value *ValidatingAdmissionPolicyBindingSpecApplyConfiguration) *ValidatingAdmissionPolicyBindingApplyConfiguration { + b.Spec = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybindingspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybindingspec.go new file mode 100644 index 000000000..d20a78eff --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicybindingspec.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" +) + +// ValidatingAdmissionPolicyBindingSpecApplyConfiguration represents an declarative configuration of the ValidatingAdmissionPolicyBindingSpec type for use +// with apply. +type ValidatingAdmissionPolicyBindingSpecApplyConfiguration struct { + PolicyName *string `json:"policyName,omitempty"` + ParamRef *ParamRefApplyConfiguration `json:"paramRef,omitempty"` + MatchResources *MatchResourcesApplyConfiguration `json:"matchResources,omitempty"` + ValidationActions []admissionregistrationv1beta1.ValidationAction `json:"validationActions,omitempty"` +} + +// ValidatingAdmissionPolicyBindingSpecApplyConfiguration constructs an declarative configuration of the ValidatingAdmissionPolicyBindingSpec type for use with +// apply. +func ValidatingAdmissionPolicyBindingSpec() *ValidatingAdmissionPolicyBindingSpecApplyConfiguration { + return &ValidatingAdmissionPolicyBindingSpecApplyConfiguration{} +} + +// WithPolicyName sets the PolicyName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PolicyName field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingSpecApplyConfiguration) WithPolicyName(value string) *ValidatingAdmissionPolicyBindingSpecApplyConfiguration { + b.PolicyName = &value + return b +} + +// WithParamRef sets the ParamRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ParamRef field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingSpecApplyConfiguration) WithParamRef(value *ParamRefApplyConfiguration) *ValidatingAdmissionPolicyBindingSpecApplyConfiguration { + b.ParamRef = value + return b +} + +// WithMatchResources sets the MatchResources field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchResources field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyBindingSpecApplyConfiguration) WithMatchResources(value *MatchResourcesApplyConfiguration) *ValidatingAdmissionPolicyBindingSpecApplyConfiguration { + b.MatchResources = value + return b +} + +// WithValidationActions adds the given value to the ValidationActions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ValidationActions field. +func (b *ValidatingAdmissionPolicyBindingSpecApplyConfiguration) WithValidationActions(values ...admissionregistrationv1beta1.ValidationAction) *ValidatingAdmissionPolicyBindingSpecApplyConfiguration { + for i := range values { + b.ValidationActions = append(b.ValidationActions, values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicyspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicyspec.go new file mode 100644 index 000000000..c6e938910 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicyspec.go @@ -0,0 +1,117 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" +) + +// ValidatingAdmissionPolicySpecApplyConfiguration represents an declarative configuration of the ValidatingAdmissionPolicySpec type for use +// with apply. +type ValidatingAdmissionPolicySpecApplyConfiguration struct { + ParamKind *ParamKindApplyConfiguration `json:"paramKind,omitempty"` + MatchConstraints *MatchResourcesApplyConfiguration `json:"matchConstraints,omitempty"` + Validations []ValidationApplyConfiguration `json:"validations,omitempty"` + FailurePolicy *admissionregistrationv1beta1.FailurePolicyType `json:"failurePolicy,omitempty"` + AuditAnnotations []AuditAnnotationApplyConfiguration `json:"auditAnnotations,omitempty"` + MatchConditions []MatchConditionApplyConfiguration `json:"matchConditions,omitempty"` + Variables []VariableApplyConfiguration `json:"variables,omitempty"` +} + +// ValidatingAdmissionPolicySpecApplyConfiguration constructs an declarative configuration of the ValidatingAdmissionPolicySpec type for use with +// apply. +func ValidatingAdmissionPolicySpec() *ValidatingAdmissionPolicySpecApplyConfiguration { + return &ValidatingAdmissionPolicySpecApplyConfiguration{} +} + +// WithParamKind sets the ParamKind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ParamKind field is set to the value of the last call. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithParamKind(value *ParamKindApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + b.ParamKind = value + return b +} + +// WithMatchConstraints sets the MatchConstraints field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchConstraints field is set to the value of the last call. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithMatchConstraints(value *MatchResourcesApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + b.MatchConstraints = value + return b +} + +// WithValidations adds the given value to the Validations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Validations field. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithValidations(values ...*ValidationApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithValidations") + } + b.Validations = append(b.Validations, *values[i]) + } + return b +} + +// WithFailurePolicy sets the FailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailurePolicy field is set to the value of the last call. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithFailurePolicy(value admissionregistrationv1beta1.FailurePolicyType) *ValidatingAdmissionPolicySpecApplyConfiguration { + b.FailurePolicy = &value + return b +} + +// WithAuditAnnotations adds the given value to the AuditAnnotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AuditAnnotations field. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithAuditAnnotations(values ...*AuditAnnotationApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAuditAnnotations") + } + b.AuditAnnotations = append(b.AuditAnnotations, *values[i]) + } + return b +} + +// WithMatchConditions adds the given value to the MatchConditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchConditions field. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithMatchConditions(values ...*MatchConditionApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchConditions") + } + b.MatchConditions = append(b.MatchConditions, *values[i]) + } + return b +} + +// WithVariables adds the given value to the Variables field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Variables field. +func (b *ValidatingAdmissionPolicySpecApplyConfiguration) WithVariables(values ...*VariableApplyConfiguration) *ValidatingAdmissionPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVariables") + } + b.Variables = append(b.Variables, *values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicystatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicystatus.go new file mode 100644 index 000000000..e3e6d417e --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingadmissionpolicystatus.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingAdmissionPolicyStatusApplyConfiguration represents an declarative configuration of the ValidatingAdmissionPolicyStatus type for use +// with apply. +type ValidatingAdmissionPolicyStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + TypeChecking *TypeCheckingApplyConfiguration `json:"typeChecking,omitempty"` + Conditions []v1.ConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ValidatingAdmissionPolicyStatusApplyConfiguration constructs an declarative configuration of the ValidatingAdmissionPolicyStatus type for use with +// apply. +func ValidatingAdmissionPolicyStatus() *ValidatingAdmissionPolicyStatusApplyConfiguration { + return &ValidatingAdmissionPolicyStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyStatusApplyConfiguration) WithObservedGeneration(value int64) *ValidatingAdmissionPolicyStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithTypeChecking sets the TypeChecking field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TypeChecking field is set to the value of the last call. +func (b *ValidatingAdmissionPolicyStatusApplyConfiguration) WithTypeChecking(value *TypeCheckingApplyConfiguration) *ValidatingAdmissionPolicyStatusApplyConfiguration { + b.TypeChecking = value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ValidatingAdmissionPolicyStatusApplyConfiguration) WithConditions(values ...*v1.ConditionApplyConfiguration) *ValidatingAdmissionPolicyStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validation.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validation.go new file mode 100644 index 000000000..ed9ff1ac0 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validation.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ValidationApplyConfiguration represents an declarative configuration of the Validation type for use +// with apply. +type ValidationApplyConfiguration struct { + Expression *string `json:"expression,omitempty"` + Message *string `json:"message,omitempty"` + Reason *v1.StatusReason `json:"reason,omitempty"` + MessageExpression *string `json:"messageExpression,omitempty"` +} + +// ValidationApplyConfiguration constructs an declarative configuration of the Validation type for use with +// apply. +func Validation() *ValidationApplyConfiguration { + return &ValidationApplyConfiguration{} +} + +// WithExpression sets the Expression field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Expression field is set to the value of the last call. +func (b *ValidationApplyConfiguration) WithExpression(value string) *ValidationApplyConfiguration { + b.Expression = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ValidationApplyConfiguration) WithMessage(value string) *ValidationApplyConfiguration { + b.Message = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ValidationApplyConfiguration) WithReason(value v1.StatusReason) *ValidationApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessageExpression sets the MessageExpression field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MessageExpression field is set to the value of the last call. +func (b *ValidationApplyConfiguration) WithMessageExpression(value string) *ValidationApplyConfiguration { + b.MessageExpression = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/variable.go b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/variable.go new file mode 100644 index 000000000..0fc294c65 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/variable.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// VariableApplyConfiguration represents an declarative configuration of the Variable type for use +// with apply. +type VariableApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Expression *string `json:"expression,omitempty"` +} + +// VariableApplyConfiguration constructs an declarative configuration of the Variable type for use with +// apply. +func Variable() *VariableApplyConfiguration { + return &VariableApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VariableApplyConfiguration) WithName(value string) *VariableApplyConfiguration { + b.Name = &value + return b +} + +// WithExpression sets the Expression field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Expression field is set to the value of the last call. +func (b *VariableApplyConfiguration) WithExpression(value string) *VariableApplyConfiguration { + b.Expression = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go b/tools/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go index d36f7603c..81c56330b 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go @@ -24,6 +24,7 @@ type ServerStorageVersionApplyConfiguration struct { APIServerID *string `json:"apiServerID,omitempty"` EncodingVersion *string `json:"encodingVersion,omitempty"` DecodableVersions []string `json:"decodableVersions,omitempty"` + ServedVersions []string `json:"servedVersions,omitempty"` } // ServerStorageVersionApplyConfiguration constructs an declarative configuration of the ServerStorageVersion type for use with @@ -57,3 +58,13 @@ func (b *ServerStorageVersionApplyConfiguration) WithDecodableVersions(values .. } return b } + +// WithServedVersions adds the given value to the ServedVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ServedVersions field. +func (b *ServerStorageVersionApplyConfiguration) WithServedVersions(values ...string) *ServerStorageVersionApplyConfiguration { + for i := range values { + b.ServedVersions = append(b.ServedVersions, values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go index 839d88b64..3d46a3ecf 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go @@ -32,12 +32,15 @@ type JobSpecApplyConfiguration struct { ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"` PodFailurePolicy *PodFailurePolicyApplyConfiguration `json:"podFailurePolicy,omitempty"` BackoffLimit *int32 `json:"backoffLimit,omitempty"` + BackoffLimitPerIndex *int32 `json:"backoffLimitPerIndex,omitempty"` + MaxFailedIndexes *int32 `json:"maxFailedIndexes,omitempty"` Selector *metav1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` ManualSelector *bool `json:"manualSelector,omitempty"` Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty"` CompletionMode *batchv1.CompletionMode `json:"completionMode,omitempty"` Suspend *bool `json:"suspend,omitempty"` + PodReplacementPolicy *batchv1.PodReplacementPolicy `json:"podReplacementPolicy,omitempty"` } // JobSpecApplyConfiguration constructs an declarative configuration of the JobSpec type for use with @@ -86,6 +89,22 @@ func (b *JobSpecApplyConfiguration) WithBackoffLimit(value int32) *JobSpecApplyC return b } +// WithBackoffLimitPerIndex sets the BackoffLimitPerIndex field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BackoffLimitPerIndex field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithBackoffLimitPerIndex(value int32) *JobSpecApplyConfiguration { + b.BackoffLimitPerIndex = &value + return b +} + +// WithMaxFailedIndexes sets the MaxFailedIndexes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxFailedIndexes field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithMaxFailedIndexes(value int32) *JobSpecApplyConfiguration { + b.MaxFailedIndexes = &value + return b +} + // WithSelector sets the Selector field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Selector field is set to the value of the last call. @@ -133,3 +152,11 @@ func (b *JobSpecApplyConfiguration) WithSuspend(value bool) *JobSpecApplyConfigu b.Suspend = &value return b } + +// WithPodReplacementPolicy sets the PodReplacementPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodReplacementPolicy field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithPodReplacementPolicy(value batchv1.PodReplacementPolicy) *JobSpecApplyConfiguration { + b.PodReplacementPolicy = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go index a36d5d0ae..e8e472f8f 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go @@ -31,7 +31,9 @@ type JobStatusApplyConfiguration struct { Active *int32 `json:"active,omitempty"` Succeeded *int32 `json:"succeeded,omitempty"` Failed *int32 `json:"failed,omitempty"` + Terminating *int32 `json:"terminating,omitempty"` CompletedIndexes *string `json:"completedIndexes,omitempty"` + FailedIndexes *string `json:"failedIndexes,omitempty"` UncountedTerminatedPods *UncountedTerminatedPodsApplyConfiguration `json:"uncountedTerminatedPods,omitempty"` Ready *int32 `json:"ready,omitempty"` } @@ -95,6 +97,14 @@ func (b *JobStatusApplyConfiguration) WithFailed(value int32) *JobStatusApplyCon return b } +// WithTerminating sets the Terminating field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Terminating field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithTerminating(value int32) *JobStatusApplyConfiguration { + b.Terminating = &value + return b +} + // WithCompletedIndexes sets the CompletedIndexes field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the CompletedIndexes field is set to the value of the last call. @@ -103,6 +113,14 @@ func (b *JobStatusApplyConfiguration) WithCompletedIndexes(value string) *JobSta return b } +// WithFailedIndexes sets the FailedIndexes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailedIndexes field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithFailedIndexes(value string) *JobStatusApplyConfiguration { + b.FailedIndexes = &value + return b +} + // WithUncountedTerminatedPods sets the UncountedTerminatedPods field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the UncountedTerminatedPods field is set to the value of the last call. diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go index 9ada59ee2..32d715606 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go @@ -35,6 +35,7 @@ type ContainerApplyConfiguration struct { Env []EnvVarApplyConfiguration `json:"env,omitempty"` Resources *ResourceRequirementsApplyConfiguration `json:"resources,omitempty"` ResizePolicy []ContainerResizePolicyApplyConfiguration `json:"resizePolicy,omitempty"` + RestartPolicy *corev1.ContainerRestartPolicy `json:"restartPolicy,omitempty"` VolumeMounts []VolumeMountApplyConfiguration `json:"volumeMounts,omitempty"` VolumeDevices []VolumeDeviceApplyConfiguration `json:"volumeDevices,omitempty"` LivenessProbe *ProbeApplyConfiguration `json:"livenessProbe,omitempty"` @@ -160,6 +161,14 @@ func (b *ContainerApplyConfiguration) WithResizePolicy(values ...*ContainerResiz return b } +// WithRestartPolicy sets the RestartPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RestartPolicy field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithRestartPolicy(value corev1.ContainerRestartPolicy) *ContainerApplyConfiguration { + b.RestartPolicy = &value + return b +} + // WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the VolumeMounts field. diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go index c51049ba1..5fa79a246 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go @@ -139,6 +139,14 @@ func (b *EphemeralContainerApplyConfiguration) WithResizePolicy(values ...*Conta return b } +// WithRestartPolicy sets the RestartPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RestartPolicy field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithRestartPolicy(value corev1.ContainerRestartPolicy) *EphemeralContainerApplyConfiguration { + b.RestartPolicy = &value + return b +} + // WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the VolumeMounts field. diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go index 764b830e0..8cded29a9 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go @@ -35,6 +35,7 @@ type EphemeralContainerCommonApplyConfiguration struct { Env []EnvVarApplyConfiguration `json:"env,omitempty"` Resources *ResourceRequirementsApplyConfiguration `json:"resources,omitempty"` ResizePolicy []ContainerResizePolicyApplyConfiguration `json:"resizePolicy,omitempty"` + RestartPolicy *corev1.ContainerRestartPolicy `json:"restartPolicy,omitempty"` VolumeMounts []VolumeMountApplyConfiguration `json:"volumeMounts,omitempty"` VolumeDevices []VolumeDeviceApplyConfiguration `json:"volumeDevices,omitempty"` LivenessProbe *ProbeApplyConfiguration `json:"livenessProbe,omitempty"` @@ -160,6 +161,14 @@ func (b *EphemeralContainerCommonApplyConfiguration) WithResizePolicy(values ... return b } +// WithRestartPolicy sets the RestartPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RestartPolicy field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithRestartPolicy(value corev1.ContainerRestartPolicy) *EphemeralContainerCommonApplyConfiguration { + b.RestartPolicy = &value + return b +} + // WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the VolumeMounts field. diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostip.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostip.go new file mode 100644 index 000000000..c2a42cf74 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostip.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HostIPApplyConfiguration represents an declarative configuration of the HostIP type for use +// with apply. +type HostIPApplyConfiguration struct { + IP *string `json:"ip,omitempty"` +} + +// HostIPApplyConfiguration constructs an declarative configuration of the HostIP type for use with +// apply. +func HostIP() *HostIPApplyConfiguration { + return &HostIPApplyConfiguration{} +} + +// WithIP sets the IP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IP field is set to the value of the last call. +func (b *HostIPApplyConfiguration) WithIP(value string) *HostIPApplyConfiguration { + b.IP = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go index 4c38d89f5..c29b2a9a1 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go @@ -25,12 +25,12 @@ import ( // PersistentVolumeClaimStatusApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimStatus type for use // with apply. type PersistentVolumeClaimStatusApplyConfiguration struct { - Phase *v1.PersistentVolumeClaimPhase `json:"phase,omitempty"` - AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` - Capacity *v1.ResourceList `json:"capacity,omitempty"` - Conditions []PersistentVolumeClaimConditionApplyConfiguration `json:"conditions,omitempty"` - AllocatedResources *v1.ResourceList `json:"allocatedResources,omitempty"` - ResizeStatus *v1.PersistentVolumeClaimResizeStatus `json:"resizeStatus,omitempty"` + Phase *v1.PersistentVolumeClaimPhase `json:"phase,omitempty"` + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + Capacity *v1.ResourceList `json:"capacity,omitempty"` + Conditions []PersistentVolumeClaimConditionApplyConfiguration `json:"conditions,omitempty"` + AllocatedResources *v1.ResourceList `json:"allocatedResources,omitempty"` + AllocatedResourceStatuses map[v1.ResourceName]v1.ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty"` } // PersistentVolumeClaimStatusApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimStatus type for use with @@ -86,10 +86,16 @@ func (b *PersistentVolumeClaimStatusApplyConfiguration) WithAllocatedResources(v return b } -// WithResizeStatus sets the ResizeStatus field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ResizeStatus field is set to the value of the last call. -func (b *PersistentVolumeClaimStatusApplyConfiguration) WithResizeStatus(value v1.PersistentVolumeClaimResizeStatus) *PersistentVolumeClaimStatusApplyConfiguration { - b.ResizeStatus = &value +// WithAllocatedResourceStatuses puts the entries into the AllocatedResourceStatuses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the AllocatedResourceStatuses field, +// overwriting an existing map entries in AllocatedResourceStatuses field with the same key. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithAllocatedResourceStatuses(entries map[v1.ResourceName]v1.ClaimResourceStatus) *PersistentVolumeClaimStatusApplyConfiguration { + if b.AllocatedResourceStatuses == nil && len(entries) > 0 { + b.AllocatedResourceStatuses = make(map[v1.ResourceName]v1.ClaimResourceStatus, len(entries)) + } + for k, v := range entries { + b.AllocatedResourceStatuses[k] = v + } return b } diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go index f7048dec4..a473c0e92 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go @@ -20,14 +20,16 @@ package v1 import ( v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // PersistentVolumeStatusApplyConfiguration represents an declarative configuration of the PersistentVolumeStatus type for use // with apply. type PersistentVolumeStatusApplyConfiguration struct { - Phase *v1.PersistentVolumePhase `json:"phase,omitempty"` - Message *string `json:"message,omitempty"` - Reason *string `json:"reason,omitempty"` + Phase *v1.PersistentVolumePhase `json:"phase,omitempty"` + Message *string `json:"message,omitempty"` + Reason *string `json:"reason,omitempty"` + LastPhaseTransitionTime *metav1.Time `json:"lastPhaseTransitionTime,omitempty"` } // PersistentVolumeStatusApplyConfiguration constructs an declarative configuration of the PersistentVolumeStatus type for use with @@ -59,3 +61,11 @@ func (b *PersistentVolumeStatusApplyConfiguration) WithReason(value string) *Per b.Reason = &value return b } + +// WithLastPhaseTransitionTime sets the LastPhaseTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastPhaseTransitionTime field is set to the value of the last call. +func (b *PersistentVolumeStatusApplyConfiguration) WithLastPhaseTransitionTime(value metav1.Time) *PersistentVolumeStatusApplyConfiguration { + b.LastPhaseTransitionTime = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaimstatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaimstatus.go new file mode 100644 index 000000000..ae79ca01b --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaimstatus.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodResourceClaimStatusApplyConfiguration represents an declarative configuration of the PodResourceClaimStatus type for use +// with apply. +type PodResourceClaimStatusApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ResourceClaimName *string `json:"resourceClaimName,omitempty"` +} + +// PodResourceClaimStatusApplyConfiguration constructs an declarative configuration of the PodResourceClaimStatus type for use with +// apply. +func PodResourceClaimStatus() *PodResourceClaimStatusApplyConfiguration { + return &PodResourceClaimStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodResourceClaimStatusApplyConfiguration) WithName(value string) *PodResourceClaimStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithResourceClaimName sets the ResourceClaimName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceClaimName field is set to the value of the last call. +func (b *PodResourceClaimStatusApplyConfiguration) WithResourceClaimName(value string) *PodResourceClaimStatusApplyConfiguration { + b.ResourceClaimName = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go index e9d8e5b28..1a58ab6be 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go @@ -26,20 +26,22 @@ import ( // PodStatusApplyConfiguration represents an declarative configuration of the PodStatus type for use // with apply. type PodStatusApplyConfiguration struct { - Phase *v1.PodPhase `json:"phase,omitempty"` - Conditions []PodConditionApplyConfiguration `json:"conditions,omitempty"` - Message *string `json:"message,omitempty"` - Reason *string `json:"reason,omitempty"` - NominatedNodeName *string `json:"nominatedNodeName,omitempty"` - HostIP *string `json:"hostIP,omitempty"` - PodIP *string `json:"podIP,omitempty"` - PodIPs []PodIPApplyConfiguration `json:"podIPs,omitempty"` - StartTime *metav1.Time `json:"startTime,omitempty"` - InitContainerStatuses []ContainerStatusApplyConfiguration `json:"initContainerStatuses,omitempty"` - ContainerStatuses []ContainerStatusApplyConfiguration `json:"containerStatuses,omitempty"` - QOSClass *v1.PodQOSClass `json:"qosClass,omitempty"` - EphemeralContainerStatuses []ContainerStatusApplyConfiguration `json:"ephemeralContainerStatuses,omitempty"` - Resize *v1.PodResizeStatus `json:"resize,omitempty"` + Phase *v1.PodPhase `json:"phase,omitempty"` + Conditions []PodConditionApplyConfiguration `json:"conditions,omitempty"` + Message *string `json:"message,omitempty"` + Reason *string `json:"reason,omitempty"` + NominatedNodeName *string `json:"nominatedNodeName,omitempty"` + HostIP *string `json:"hostIP,omitempty"` + HostIPs []HostIPApplyConfiguration `json:"hostIPs,omitempty"` + PodIP *string `json:"podIP,omitempty"` + PodIPs []PodIPApplyConfiguration `json:"podIPs,omitempty"` + StartTime *metav1.Time `json:"startTime,omitempty"` + InitContainerStatuses []ContainerStatusApplyConfiguration `json:"initContainerStatuses,omitempty"` + ContainerStatuses []ContainerStatusApplyConfiguration `json:"containerStatuses,omitempty"` + QOSClass *v1.PodQOSClass `json:"qosClass,omitempty"` + EphemeralContainerStatuses []ContainerStatusApplyConfiguration `json:"ephemeralContainerStatuses,omitempty"` + Resize *v1.PodResizeStatus `json:"resize,omitempty"` + ResourceClaimStatuses []PodResourceClaimStatusApplyConfiguration `json:"resourceClaimStatuses,omitempty"` } // PodStatusApplyConfiguration constructs an declarative configuration of the PodStatus type for use with @@ -101,6 +103,19 @@ func (b *PodStatusApplyConfiguration) WithHostIP(value string) *PodStatusApplyCo return b } +// WithHostIPs adds the given value to the HostIPs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the HostIPs field. +func (b *PodStatusApplyConfiguration) WithHostIPs(values ...*HostIPApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithHostIPs") + } + b.HostIPs = append(b.HostIPs, *values[i]) + } + return b +} + // WithPodIP sets the PodIP field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the PodIP field is set to the value of the last call. @@ -184,3 +199,16 @@ func (b *PodStatusApplyConfiguration) WithResize(value v1.PodResizeStatus) *PodS b.Resize = &value return b } + +// WithResourceClaimStatuses adds the given value to the ResourceClaimStatuses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceClaimStatuses field. +func (b *PodStatusApplyConfiguration) WithResourceClaimStatuses(values ...*PodResourceClaimStatusApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithResourceClaimStatuses") + } + b.ResourceClaimStatuses = append(b.ResourceClaimStatuses, *values[i]) + } + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go b/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go index 81c84d2d4..27ea5d9dd 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go @@ -32,8 +32,7 @@ import ( type NetworkPolicyApplyConfiguration struct { v1.TypeMetaApplyConfiguration `json:",inline"` *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` - Status *NetworkPolicyStatusApplyConfiguration `json:"status,omitempty"` + Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` } // NetworkPolicy constructs an declarative configuration of the NetworkPolicy type for use with @@ -248,11 +247,3 @@ func (b *NetworkPolicyApplyConfiguration) WithSpec(value *NetworkPolicySpecApply b.Spec = value return b } - -// WithStatus sets the Status field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Status field is set to the value of the last call. -func (b *NetworkPolicyApplyConfiguration) WithStatus(value *NetworkPolicyStatusApplyConfiguration) *NetworkPolicyApplyConfiguration { - b.Status = value - return b -} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go deleted file mode 100644 index 99c89b09b..000000000 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1 "k8s.io/client-go/applyconfigurations/meta/v1" -) - -// NetworkPolicyStatusApplyConfiguration represents an declarative configuration of the NetworkPolicyStatus type for use -// with apply. -type NetworkPolicyStatusApplyConfiguration struct { - Conditions []v1.ConditionApplyConfiguration `json:"conditions,omitempty"` -} - -// NetworkPolicyStatusApplyConfiguration constructs an declarative configuration of the NetworkPolicyStatus type for use with -// apply. -func NetworkPolicyStatus() *NetworkPolicyStatusApplyConfiguration { - return &NetworkPolicyStatusApplyConfiguration{} -} - -// WithConditions adds the given value to the Conditions field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Conditions field. -func (b *NetworkPolicyStatusApplyConfiguration) WithConditions(values ...*v1.ConditionApplyConfiguration) *NetworkPolicyStatusApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithConditions") - } - b.Conditions = append(b.Conditions, *values[i]) - } - return b -} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/exemptprioritylevelconfiguration.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/exemptprioritylevelconfiguration.go new file mode 100644 index 000000000..3535d7478 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/exemptprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// ExemptPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the ExemptPriorityLevelConfiguration type for use +// with apply. +type ExemptPriorityLevelConfigurationApplyConfiguration struct { + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty"` + LendablePercent *int32 `json:"lendablePercent,omitempty"` +} + +// ExemptPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the ExemptPriorityLevelConfiguration type for use with +// apply. +func ExemptPriorityLevelConfiguration() *ExemptPriorityLevelConfigurationApplyConfiguration { + return &ExemptPriorityLevelConfigurationApplyConfiguration{} +} + +// WithNominalConcurrencyShares sets the NominalConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NominalConcurrencyShares field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithNominalConcurrencyShares(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.NominalConcurrencyShares = &value + return b +} + +// WithLendablePercent sets the LendablePercent field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LendablePercent field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithLendablePercent(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.LendablePercent = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go index 3949dee46..ade920a75 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go @@ -27,6 +27,7 @@ import ( type PriorityLevelConfigurationSpecApplyConfiguration struct { Type *v1alpha1.PriorityLevelEnablement `json:"type,omitempty"` Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` + Exempt *ExemptPriorityLevelConfigurationApplyConfiguration `json:"exempt,omitempty"` } // PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with @@ -50,3 +51,11 @@ func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *Li b.Limited = value return b } + +// WithExempt sets the Exempt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exempt field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithExempt(value *ExemptPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Exempt = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/exemptprioritylevelconfiguration.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/exemptprioritylevelconfiguration.go new file mode 100644 index 000000000..071048090 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/exemptprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ExemptPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the ExemptPriorityLevelConfiguration type for use +// with apply. +type ExemptPriorityLevelConfigurationApplyConfiguration struct { + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty"` + LendablePercent *int32 `json:"lendablePercent,omitempty"` +} + +// ExemptPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the ExemptPriorityLevelConfiguration type for use with +// apply. +func ExemptPriorityLevelConfiguration() *ExemptPriorityLevelConfigurationApplyConfiguration { + return &ExemptPriorityLevelConfigurationApplyConfiguration{} +} + +// WithNominalConcurrencyShares sets the NominalConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NominalConcurrencyShares field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithNominalConcurrencyShares(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.NominalConcurrencyShares = &value + return b +} + +// WithLendablePercent sets the LendablePercent field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LendablePercent field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithLendablePercent(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.LendablePercent = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go index 8ed4e399f..19146d9f6 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go @@ -27,6 +27,7 @@ import ( type PriorityLevelConfigurationSpecApplyConfiguration struct { Type *v1beta1.PriorityLevelEnablement `json:"type,omitempty"` Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` + Exempt *ExemptPriorityLevelConfigurationApplyConfiguration `json:"exempt,omitempty"` } // PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with @@ -50,3 +51,11 @@ func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *Li b.Limited = value return b } + +// WithExempt sets the Exempt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exempt field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithExempt(value *ExemptPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Exempt = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/exemptprioritylevelconfiguration.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/exemptprioritylevelconfiguration.go new file mode 100644 index 000000000..d6bc330fe --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/exemptprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// ExemptPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the ExemptPriorityLevelConfiguration type for use +// with apply. +type ExemptPriorityLevelConfigurationApplyConfiguration struct { + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty"` + LendablePercent *int32 `json:"lendablePercent,omitempty"` +} + +// ExemptPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the ExemptPriorityLevelConfiguration type for use with +// apply. +func ExemptPriorityLevelConfiguration() *ExemptPriorityLevelConfigurationApplyConfiguration { + return &ExemptPriorityLevelConfigurationApplyConfiguration{} +} + +// WithNominalConcurrencyShares sets the NominalConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NominalConcurrencyShares field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithNominalConcurrencyShares(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.NominalConcurrencyShares = &value + return b +} + +// WithLendablePercent sets the LendablePercent field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LendablePercent field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithLendablePercent(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.LendablePercent = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/prioritylevelconfigurationspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/prioritylevelconfigurationspec.go index 5560ed9e5..994a8a16a 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/prioritylevelconfigurationspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2/prioritylevelconfigurationspec.go @@ -27,6 +27,7 @@ import ( type PriorityLevelConfigurationSpecApplyConfiguration struct { Type *v1beta2.PriorityLevelEnablement `json:"type,omitempty"` Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` + Exempt *ExemptPriorityLevelConfigurationApplyConfiguration `json:"exempt,omitempty"` } // PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with @@ -50,3 +51,11 @@ func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *Li b.Limited = value return b } + +// WithExempt sets the Exempt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exempt field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithExempt(value *ExemptPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Exempt = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/exemptprioritylevelconfiguration.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/exemptprioritylevelconfiguration.go new file mode 100644 index 000000000..b03c11d0d --- /dev/null +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/exemptprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta3 + +// ExemptPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the ExemptPriorityLevelConfiguration type for use +// with apply. +type ExemptPriorityLevelConfigurationApplyConfiguration struct { + NominalConcurrencyShares *int32 `json:"nominalConcurrencyShares,omitempty"` + LendablePercent *int32 `json:"lendablePercent,omitempty"` +} + +// ExemptPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the ExemptPriorityLevelConfiguration type for use with +// apply. +func ExemptPriorityLevelConfiguration() *ExemptPriorityLevelConfigurationApplyConfiguration { + return &ExemptPriorityLevelConfigurationApplyConfiguration{} +} + +// WithNominalConcurrencyShares sets the NominalConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NominalConcurrencyShares field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithNominalConcurrencyShares(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.NominalConcurrencyShares = &value + return b +} + +// WithLendablePercent sets the LendablePercent field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LendablePercent field is set to the value of the last call. +func (b *ExemptPriorityLevelConfigurationApplyConfiguration) WithLendablePercent(value int32) *ExemptPriorityLevelConfigurationApplyConfiguration { + b.LendablePercent = &value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go index f67f39445..5b0680d91 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go @@ -27,6 +27,7 @@ import ( type PriorityLevelConfigurationSpecApplyConfiguration struct { Type *v1beta3.PriorityLevelEnablement `json:"type,omitempty"` Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` + Exempt *ExemptPriorityLevelConfigurationApplyConfiguration `json:"exempt,omitempty"` } // PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with @@ -50,3 +51,11 @@ func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *Li b.Limited = value return b } + +// WithExempt sets the Exempt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exempt field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithExempt(value *ExemptPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Exempt = value + return b +} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go b/tools/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go index 361b2f4e8..3ed553662 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -366,6 +366,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: namespace type: scalar: string + - name: parameterNotFoundAction + type: + scalar: string + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector elementRelationship: atomic - name: io.k8s.api.admissionregistration.v1alpha1.TypeChecking map: @@ -464,6 +470,14 @@ var schemaYAML = typed.YAMLObject(`types: elementType: namedType: io.k8s.api.admissionregistration.v1alpha1.Validation elementRelationship: atomic + - name: variables + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1alpha1.Variable + elementRelationship: associative + keys: + - name - name: io.k8s.api.admissionregistration.v1alpha1.ValidatingAdmissionPolicyStatus map: fields: @@ -497,6 +511,39 @@ var schemaYAML = typed.YAMLObject(`types: - name: reason type: scalar: string +- name: io.k8s.api.admissionregistration.v1alpha1.Variable + map: + fields: + - name: expression + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.admissionregistration.v1beta1.AuditAnnotation + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: valueExpression + type: + scalar: string + default: "" +- name: io.k8s.api.admissionregistration.v1beta1.ExpressionWarning + map: + fields: + - name: fieldRef + type: + scalar: string + default: "" + - name: warning + type: + scalar: string + default: "" - name: io.k8s.api.admissionregistration.v1beta1.MatchCondition map: fields: @@ -508,6 +555,31 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.admissionregistration.v1beta1.MatchResources + map: + fields: + - name: excludeResourceRules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.NamedRuleWithOperations + elementRelationship: atomic + - name: matchPolicy + type: + scalar: string + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: objectSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: resourceRules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.NamedRuleWithOperations + elementRelationship: atomic + elementRelationship: atomic - name: io.k8s.api.admissionregistration.v1beta1.MutatingWebhook map: fields: @@ -581,6 +653,69 @@ var schemaYAML = typed.YAMLObject(`types: elementRelationship: associative keys: - name +- name: io.k8s.api.admissionregistration.v1beta1.NamedRuleWithOperations + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: apiVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: operations + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resourceNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: scope + type: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.admissionregistration.v1beta1.ParamKind + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.admissionregistration.v1beta1.ParamRef + map: + fields: + - name: name + type: + scalar: string + - name: namespace + type: + scalar: string + - name: parameterNotFoundAction + type: + scalar: string + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + elementRelationship: atomic - name: io.k8s.api.admissionregistration.v1beta1.ServiceReference map: fields: @@ -598,6 +733,128 @@ var schemaYAML = typed.YAMLObject(`types: - name: port type: scalar: numeric +- name: io.k8s.api.admissionregistration.v1beta1.TypeChecking + map: + fields: + - name: expressionWarnings + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.ExpressionWarning + elementRelationship: atomic +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicy + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicySpec + default: {} + - name: status + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyStatus + default: {} +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingSpec + default: {} +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingSpec + map: + fields: + - name: matchResources + type: + namedType: io.k8s.api.admissionregistration.v1beta1.MatchResources + - name: paramRef + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ParamRef + - name: policyName + type: + scalar: string + - name: validationActions + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicySpec + map: + fields: + - name: auditAnnotations + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.AuditAnnotation + elementRelationship: atomic + - name: failurePolicy + type: + scalar: string + - name: matchConditions + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.MatchCondition + elementRelationship: associative + keys: + - name + - name: matchConstraints + type: + namedType: io.k8s.api.admissionregistration.v1beta1.MatchResources + - name: paramKind + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ParamKind + - name: validations + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.Validation + elementRelationship: atomic + - name: variables + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.Variable + elementRelationship: associative + keys: + - name +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingAdmissionPolicyStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition + elementRelationship: associative + keys: + - type + - name: observedGeneration + type: + scalar: numeric + - name: typeChecking + type: + namedType: io.k8s.api.admissionregistration.v1beta1.TypeChecking - name: io.k8s.api.admissionregistration.v1beta1.ValidatingWebhook map: fields: @@ -668,6 +925,34 @@ var schemaYAML = typed.YAMLObject(`types: elementRelationship: associative keys: - name +- name: io.k8s.api.admissionregistration.v1beta1.Validation + map: + fields: + - name: expression + type: + scalar: string + default: "" + - name: message + type: + scalar: string + - name: messageExpression + type: + scalar: string + - name: reason + type: + scalar: string +- name: io.k8s.api.admissionregistration.v1beta1.Variable + map: + fields: + - name: expression + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + elementRelationship: atomic - name: io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig map: fields: @@ -695,6 +980,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: encodingVersion type: scalar: string + - name: servedVersions + type: + list: + elementType: + scalar: string + elementRelationship: associative - name: io.k8s.api.apiserverinternal.v1alpha1.StorageVersion map: fields: @@ -3328,6 +3619,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: backoffLimit type: scalar: numeric + - name: backoffLimitPerIndex + type: + scalar: numeric - name: completionMode type: scalar: string @@ -3337,12 +3631,18 @@ var schemaYAML = typed.YAMLObject(`types: - name: manualSelector type: scalar: boolean + - name: maxFailedIndexes + type: + scalar: numeric - name: parallelism type: scalar: numeric - name: podFailurePolicy type: namedType: io.k8s.api.batch.v1.PodFailurePolicy + - name: podReplacementPolicy + type: + scalar: string - name: selector type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector @@ -3377,6 +3677,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: failed type: scalar: numeric + - name: failedIndexes + type: + scalar: string - name: ready type: scalar: numeric @@ -3386,6 +3689,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: succeeded type: scalar: numeric + - name: terminating + type: + scalar: numeric - name: uncountedTerminatedPods type: namedType: io.k8s.api.batch.v1.UncountedTerminatedPods @@ -4306,6 +4612,9 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.core.v1.ResourceRequirements default: {} + - name: restartPolicy + type: + scalar: string - name: securityContext type: namedType: io.k8s.api.core.v1.SecurityContext @@ -4723,6 +5032,9 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.core.v1.ResourceRequirements default: {} + - name: restartPolicy + type: + scalar: string - name: securityContext type: namedType: io.k8s.api.core.v1.SecurityContext @@ -5053,6 +5365,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: ip type: scalar: string +- name: io.k8s.api.core.v1.HostIP + map: + fields: + - name: ip + type: + scalar: string - name: io.k8s.api.core.v1.HostPathVolumeSource map: fields: @@ -5777,6 +6095,12 @@ var schemaYAML = typed.YAMLObject(`types: elementType: scalar: string elementRelationship: atomic + - name: allocatedResourceStatuses + type: + map: + elementType: + scalar: string + elementRelationship: separable - name: allocatedResources type: map: @@ -5798,9 +6122,6 @@ var schemaYAML = typed.YAMLObject(`types: - name: phase type: scalar: string - - name: resizeStatus - type: - scalar: string - name: io.k8s.api.core.v1.PersistentVolumeClaimTemplate map: fields: @@ -5927,6 +6248,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.core.v1.PersistentVolumeStatus map: fields: + - name: lastPhaseTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time - name: message type: scalar: string @@ -6102,6 +6426,16 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.core.v1.ClaimSource default: {} +- name: io.k8s.api.core.v1.PodResourceClaimStatus + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: resourceClaimName + type: + scalar: string - name: io.k8s.api.core.v1.PodSchedulingGate map: fields: @@ -6351,6 +6685,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: hostIP type: scalar: string + - name: hostIPs + type: + list: + elementType: + namedType: io.k8s.api.core.v1.HostIP + elementRelationship: atomic - name: initContainerStatuses type: list: @@ -6386,6 +6726,14 @@ var schemaYAML = typed.YAMLObject(`types: - name: resize type: scalar: string + - name: resourceClaimStatuses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodResourceClaimStatus + elementRelationship: associative + keys: + - name - name: startTime type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time @@ -8343,10 +8691,6 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.extensions.v1beta1.NetworkPolicySpec default: {} - - name: status - type: - namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyStatus - default: {} - name: io.k8s.api.extensions.v1beta1.NetworkPolicyEgressRule map: fields: @@ -8426,17 +8770,6 @@ var schemaYAML = typed.YAMLObject(`types: elementType: scalar: string elementRelationship: atomic -- name: io.k8s.api.extensions.v1beta1.NetworkPolicyStatus - map: - fields: - - name: conditions - type: - list: - elementType: - namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition - elementRelationship: associative - keys: - - type - name: io.k8s.api.extensions.v1beta1.ReplicaSet map: fields: @@ -8546,6 +8879,15 @@ var schemaYAML = typed.YAMLObject(`types: - name: maxUnavailable type: namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.flowcontrol.v1alpha1.ExemptPriorityLevelConfiguration + map: + fields: + - name: lendablePercent + type: + scalar: numeric + - name: nominalConcurrencyShares + type: + scalar: numeric - name: io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod map: fields: @@ -8749,6 +9091,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec map: fields: + - name: exempt + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.ExemptPriorityLevelConfiguration - name: limited type: namedType: io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration @@ -8759,6 +9104,8 @@ var schemaYAML = typed.YAMLObject(`types: unions: - discriminator: type fields: + - fieldName: exempt + discriminatorValue: Exempt - fieldName: limited discriminatorValue: Limited - name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus @@ -8860,6 +9207,15 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.flowcontrol.v1beta1.ExemptPriorityLevelConfiguration + map: + fields: + - name: lendablePercent + type: + scalar: numeric + - name: nominalConcurrencyShares + type: + scalar: numeric - name: io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod map: fields: @@ -9063,6 +9419,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec map: fields: + - name: exempt + type: + namedType: io.k8s.api.flowcontrol.v1beta1.ExemptPriorityLevelConfiguration - name: limited type: namedType: io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration @@ -9073,6 +9432,8 @@ var schemaYAML = typed.YAMLObject(`types: unions: - discriminator: type fields: + - fieldName: exempt + discriminatorValue: Exempt - fieldName: limited discriminatorValue: Limited - name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus @@ -9174,6 +9535,15 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.flowcontrol.v1beta2.ExemptPriorityLevelConfiguration + map: + fields: + - name: lendablePercent + type: + scalar: numeric + - name: nominalConcurrencyShares + type: + scalar: numeric - name: io.k8s.api.flowcontrol.v1beta2.FlowDistinguisherMethod map: fields: @@ -9377,6 +9747,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.flowcontrol.v1beta2.PriorityLevelConfigurationSpec map: fields: + - name: exempt + type: + namedType: io.k8s.api.flowcontrol.v1beta2.ExemptPriorityLevelConfiguration - name: limited type: namedType: io.k8s.api.flowcontrol.v1beta2.LimitedPriorityLevelConfiguration @@ -9387,6 +9760,8 @@ var schemaYAML = typed.YAMLObject(`types: unions: - discriminator: type fields: + - fieldName: exempt + discriminatorValue: Exempt - fieldName: limited discriminatorValue: Limited - name: io.k8s.api.flowcontrol.v1beta2.PriorityLevelConfigurationStatus @@ -9488,6 +9863,15 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.flowcontrol.v1beta3.ExemptPriorityLevelConfiguration + map: + fields: + - name: lendablePercent + type: + scalar: numeric + - name: nominalConcurrencyShares + type: + scalar: numeric - name: io.k8s.api.flowcontrol.v1beta3.FlowDistinguisherMethod map: fields: @@ -9691,6 +10075,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.flowcontrol.v1beta3.PriorityLevelConfigurationSpec map: fields: + - name: exempt + type: + namedType: io.k8s.api.flowcontrol.v1beta3.ExemptPriorityLevelConfiguration - name: limited type: namedType: io.k8s.api.flowcontrol.v1beta3.LimitedPriorityLevelConfiguration @@ -9701,6 +10088,8 @@ var schemaYAML = typed.YAMLObject(`types: unions: - discriminator: type fields: + - fieldName: exempt + discriminatorValue: Exempt - fieldName: limited discriminatorValue: Limited - name: io.k8s.api.flowcontrol.v1beta3.PriorityLevelConfigurationStatus @@ -10087,10 +10476,6 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.networking.v1.NetworkPolicySpec default: {} - - name: status - type: - namedType: io.k8s.api.networking.v1.NetworkPolicyStatus - default: {} - name: io.k8s.api.networking.v1.NetworkPolicyEgressRule map: fields: @@ -10170,17 +10555,6 @@ var schemaYAML = typed.YAMLObject(`types: elementType: scalar: string elementRelationship: atomic -- name: io.k8s.api.networking.v1.NetworkPolicyStatus - map: - fields: - - name: conditions - type: - list: - elementType: - namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition - elementRelationship: associative - keys: - - type - name: io.k8s.api.networking.v1.ServiceBackendPort map: fields: diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go b/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go index 101510e45..409507310 100644 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go +++ b/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go @@ -32,8 +32,7 @@ import ( type NetworkPolicyApplyConfiguration struct { v1.TypeMetaApplyConfiguration `json:",inline"` *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` - Status *NetworkPolicyStatusApplyConfiguration `json:"status,omitempty"` + Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` } // NetworkPolicy constructs an declarative configuration of the NetworkPolicy type for use with @@ -248,11 +247,3 @@ func (b *NetworkPolicyApplyConfiguration) WithSpec(value *NetworkPolicySpecApply b.Spec = value return b } - -// WithStatus sets the Status field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Status field is set to the value of the last call. -func (b *NetworkPolicyApplyConfiguration) WithStatus(value *NetworkPolicyStatusApplyConfiguration) *NetworkPolicyApplyConfiguration { - b.Status = value - return b -} diff --git a/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go b/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go deleted file mode 100644 index 032de18ed..000000000 --- a/tools/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1 - -import ( - v1 "k8s.io/client-go/applyconfigurations/meta/v1" -) - -// NetworkPolicyStatusApplyConfiguration represents an declarative configuration of the NetworkPolicyStatus type for use -// with apply. -type NetworkPolicyStatusApplyConfiguration struct { - Conditions []v1.ConditionApplyConfiguration `json:"conditions,omitempty"` -} - -// NetworkPolicyStatusApplyConfiguration constructs an declarative configuration of the NetworkPolicyStatus type for use with -// apply. -func NetworkPolicyStatus() *NetworkPolicyStatusApplyConfiguration { - return &NetworkPolicyStatusApplyConfiguration{} -} - -// WithConditions adds the given value to the Conditions field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Conditions field. -func (b *NetworkPolicyStatusApplyConfiguration) WithConditions(values ...*v1.ConditionApplyConfiguration) *NetworkPolicyStatusApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithConditions") - } - b.Conditions = append(b.Conditions, *values[i]) - } - return b -} diff --git a/tools/vendor/k8s.io/client-go/discovery/aggregated_discovery.go b/tools/vendor/k8s.io/client-go/discovery/aggregated_discovery.go index 7470259dc..f72c42051 100644 --- a/tools/vendor/k8s.io/client-go/discovery/aggregated_discovery.go +++ b/tools/vendor/k8s.io/client-go/discovery/aggregated_discovery.go @@ -111,6 +111,8 @@ func convertAPIGroup(g apidiscovery.APIGroupDiscovery) ( return group, gvResources, failedGVs } +var emptyKind = metav1.GroupVersionKind{} + // convertAPIResource tranforms a APIResourceDiscovery to an APIResource. We are // resilient to missing GVK, since this resource might be the parent resource // for a subresource. If the parent is missing a GVK, it is not returned in @@ -125,7 +127,7 @@ func convertAPIResource(in apidiscovery.APIResourceDiscovery) (metav1.APIResourc Categories: in.Categories, } var err error - if in.ResponseKind != nil { + if in.ResponseKind != nil && (*in.ResponseKind) != emptyKind { result.Group = in.ResponseKind.Group result.Version = in.ResponseKind.Version result.Kind = in.ResponseKind.Kind @@ -140,7 +142,7 @@ func convertAPIResource(in apidiscovery.APIResourceDiscovery) (metav1.APIResourc // convertAPISubresource tranforms a APISubresourceDiscovery to an APIResource. func convertAPISubresource(parent metav1.APIResource, in apidiscovery.APISubresourceDiscovery) (metav1.APIResource, error) { result := metav1.APIResource{} - if in.ResponseKind == nil { + if in.ResponseKind == nil || (*in.ResponseKind) == emptyKind { return result, fmt.Errorf("subresource %s/%s missing GVK", parent.Name, in.Subresource) } result.Name = fmt.Sprintf("%s/%s", parent.Name, in.Subresource) diff --git a/tools/vendor/k8s.io/client-go/discovery/cached/disk/cached_discovery.go b/tools/vendor/k8s.io/client-go/discovery/cached/disk/cached_discovery.go index 82137a8ee..158810ee5 100644 --- a/tools/vendor/k8s.io/client-go/discovery/cached/disk/cached_discovery.go +++ b/tools/vendor/k8s.io/client-go/discovery/cached/disk/cached_discovery.go @@ -25,7 +25,7 @@ import ( "sync" "time" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" "k8s.io/klog/v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/tools/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go b/tools/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go index 9143ce00a..3829b3cc0 100644 --- a/tools/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go +++ b/tools/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go @@ -22,7 +22,7 @@ import ( "sync" "syscall" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" errorsutil "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/tools/vendor/k8s.io/client-go/discovery/discovery_client.go b/tools/vendor/k8s.io/client-go/discovery/discovery_client.go index 641568008..a4f083a1a 100644 --- a/tools/vendor/k8s.io/client-go/discovery/discovery_client.go +++ b/tools/vendor/k8s.io/client-go/discovery/discovery_client.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "mime" "net/http" "net/url" "sort" @@ -29,7 +30,7 @@ import ( //nolint:staticcheck // SA1019 Keep using module since it's still being maintained and the api of google.golang.org/protobuf/proto differs "github.com/golang/protobuf/proto" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" apidiscovery "k8s.io/api/apidiscovery/v2beta1" "k8s.io/apimachinery/pkg/api/errors" @@ -58,8 +59,9 @@ const ( defaultBurst = 300 AcceptV1 = runtime.ContentTypeJSON - // Aggregated discovery content-type (currently v2beta1). NOTE: Currently, we are assuming the order - // for "g", "v", and "as" from the server. We can only compare this string if we can make that assumption. + // Aggregated discovery content-type (v2beta1). NOTE: content-type parameters + // MUST be ordered (g, v, as) for server in "Accept" header (BUT we are resilient + // to ordering when comparing returned values in "Content-Type" header). AcceptV2Beta1 = runtime.ContentTypeJSON + ";" + "g=apidiscovery.k8s.io;v=v2beta1;as=APIGroupDiscoveryList" // Prioritize aggregated discovery by placing first in the order of discovery accept types. acceptDiscoveryFormats = AcceptV2Beta1 + "," + AcceptV1 @@ -259,8 +261,16 @@ func (d *DiscoveryClient) downloadLegacy() ( var resourcesByGV map[schema.GroupVersion]*metav1.APIResourceList // Switch on content-type server responded with: aggregated or unaggregated. - switch responseContentType { - case AcceptV1: + switch { + case isV2Beta1ContentType(responseContentType): + var aggregatedDiscovery apidiscovery.APIGroupDiscoveryList + err = json.Unmarshal(body, &aggregatedDiscovery) + if err != nil { + return nil, nil, nil, err + } + apiGroupList, resourcesByGV, failedGVs = SplitGroupsAndResources(aggregatedDiscovery) + default: + // Default is unaggregated discovery v1. var v metav1.APIVersions err = json.Unmarshal(body, &v) if err != nil { @@ -271,15 +281,6 @@ func (d *DiscoveryClient) downloadLegacy() ( apiGroup = apiVersionsToAPIGroup(&v) } apiGroupList.Groups = []metav1.APIGroup{apiGroup} - case AcceptV2Beta1: - var aggregatedDiscovery apidiscovery.APIGroupDiscoveryList - err = json.Unmarshal(body, &aggregatedDiscovery) - if err != nil { - return nil, nil, nil, err - } - apiGroupList, resourcesByGV, failedGVs = SplitGroupsAndResources(aggregatedDiscovery) - default: - return nil, nil, nil, fmt.Errorf("Unknown discovery response content-type: %s", responseContentType) } return apiGroupList, resourcesByGV, failedGVs, nil @@ -313,13 +314,8 @@ func (d *DiscoveryClient) downloadAPIs() ( failedGVs := map[schema.GroupVersion]error{} var resourcesByGV map[schema.GroupVersion]*metav1.APIResourceList // Switch on content-type server responded with: aggregated or unaggregated. - switch responseContentType { - case AcceptV1: - err = json.Unmarshal(body, apiGroupList) - if err != nil { - return nil, nil, nil, err - } - case AcceptV2Beta1: + switch { + case isV2Beta1ContentType(responseContentType): var aggregatedDiscovery apidiscovery.APIGroupDiscoveryList err = json.Unmarshal(body, &aggregatedDiscovery) if err != nil { @@ -327,12 +323,38 @@ func (d *DiscoveryClient) downloadAPIs() ( } apiGroupList, resourcesByGV, failedGVs = SplitGroupsAndResources(aggregatedDiscovery) default: - return nil, nil, nil, fmt.Errorf("Unknown discovery response content-type: %s", responseContentType) + // Default is unaggregated discovery v1. + err = json.Unmarshal(body, apiGroupList) + if err != nil { + return nil, nil, nil, err + } } return apiGroupList, resourcesByGV, failedGVs, nil } +// isV2Beta1ContentType checks of the content-type string is both +// "application/json" and contains the v2beta1 content-type params. +// NOTE: This function is resilient to the ordering of the +// content-type parameters, as well as parameters added by +// intermediaries such as proxies or gateways. Examples: +// +// "application/json; g=apidiscovery.k8s.io;v=v2beta1;as=APIGroupDiscoveryList" = true +// "application/json; as=APIGroupDiscoveryList;v=v2beta1;g=apidiscovery.k8s.io" = true +// "application/json; as=APIGroupDiscoveryList;v=v2beta1;g=apidiscovery.k8s.io;charset=utf-8" = true +// "application/json" = false +// "application/json; charset=UTF-8" = false +func isV2Beta1ContentType(contentType string) bool { + base, params, err := mime.ParseMediaType(contentType) + if err != nil { + return false + } + return runtime.ContentTypeJSON == base && + params["g"] == "apidiscovery.k8s.io" && + params["v"] == "v2beta1" && + params["as"] == "APIGroupDiscoveryList" +} + // ServerGroups returns the supported groups, with information like supported versions and the // preferred version. func (d *DiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go index 8fda84b1d..5a0a17d9b 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go @@ -29,6 +29,8 @@ import ( type AdmissionregistrationV1beta1Interface interface { RESTClient() rest.Interface MutatingWebhookConfigurationsGetter + ValidatingAdmissionPoliciesGetter + ValidatingAdmissionPolicyBindingsGetter ValidatingWebhookConfigurationsGetter } @@ -41,6 +43,14 @@ func (c *AdmissionregistrationV1beta1Client) MutatingWebhookConfigurations() Mut return newMutatingWebhookConfigurations(c) } +func (c *AdmissionregistrationV1beta1Client) ValidatingAdmissionPolicies() ValidatingAdmissionPolicyInterface { + return newValidatingAdmissionPolicies(c) +} + +func (c *AdmissionregistrationV1beta1Client) ValidatingAdmissionPolicyBindings() ValidatingAdmissionPolicyBindingInterface { + return newValidatingAdmissionPolicyBindings(c) +} + func (c *AdmissionregistrationV1beta1Client) ValidatingWebhookConfigurations() ValidatingWebhookConfigurationInterface { return newValidatingWebhookConfigurations(c) } diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go index 2aeb9c98a..56ad611f4 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go @@ -20,4 +20,8 @@ package v1beta1 type MutatingWebhookConfigurationExpansion interface{} +type ValidatingAdmissionPolicyExpansion interface{} + +type ValidatingAdmissionPolicyBindingExpansion interface{} + type ValidatingWebhookConfigurationExpansion interface{} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicy.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicy.go new file mode 100644 index 000000000..bea51b587 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicy.go @@ -0,0 +1,243 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// ValidatingAdmissionPoliciesGetter has a method to return a ValidatingAdmissionPolicyInterface. +// A group's client should implement this interface. +type ValidatingAdmissionPoliciesGetter interface { + ValidatingAdmissionPolicies() ValidatingAdmissionPolicyInterface +} + +// ValidatingAdmissionPolicyInterface has methods to work with ValidatingAdmissionPolicy resources. +type ValidatingAdmissionPolicyInterface interface { + Create(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.CreateOptions) (*v1beta1.ValidatingAdmissionPolicy, error) + Update(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.UpdateOptions) (*v1beta1.ValidatingAdmissionPolicy, error) + UpdateStatus(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.UpdateOptions) (*v1beta1.ValidatingAdmissionPolicy, 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) (*v1beta1.ValidatingAdmissionPolicy, error) + List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ValidatingAdmissionPolicyList, 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 *v1beta1.ValidatingAdmissionPolicy, err error) + Apply(ctx context.Context, validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) + ApplyStatus(ctx context.Context, validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) + ValidatingAdmissionPolicyExpansion +} + +// validatingAdmissionPolicies implements ValidatingAdmissionPolicyInterface +type validatingAdmissionPolicies struct { + client rest.Interface +} + +// newValidatingAdmissionPolicies returns a ValidatingAdmissionPolicies +func newValidatingAdmissionPolicies(c *AdmissionregistrationV1beta1Client) *validatingAdmissionPolicies { + return &validatingAdmissionPolicies{ + client: c.RESTClient(), + } +} + +// Get takes name of the validatingAdmissionPolicy, and returns the corresponding validatingAdmissionPolicy object, and an error if there is any. +func (c *validatingAdmissionPolicies) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Get(). + Resource("validatingadmissionpolicies"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ValidatingAdmissionPolicies that match those selectors. +func (c *validatingAdmissionPolicies) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.ValidatingAdmissionPolicyList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.ValidatingAdmissionPolicyList{} + err = c.client.Get(). + Resource("validatingadmissionpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested validatingAdmissionPolicies. +func (c *validatingAdmissionPolicies) 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(). + Resource("validatingadmissionpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a validatingAdmissionPolicy and creates it. Returns the server's representation of the validatingAdmissionPolicy, and an error, if there is any. +func (c *validatingAdmissionPolicies) Create(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.CreateOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Post(). + Resource("validatingadmissionpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(validatingAdmissionPolicy). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a validatingAdmissionPolicy and updates it. Returns the server's representation of the validatingAdmissionPolicy, and an error, if there is any. +func (c *validatingAdmissionPolicies) Update(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.UpdateOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Put(). + Resource("validatingadmissionpolicies"). + Name(validatingAdmissionPolicy.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(validatingAdmissionPolicy). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *validatingAdmissionPolicies) UpdateStatus(ctx context.Context, validatingAdmissionPolicy *v1beta1.ValidatingAdmissionPolicy, opts v1.UpdateOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Put(). + Resource("validatingadmissionpolicies"). + Name(validatingAdmissionPolicy.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(validatingAdmissionPolicy). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the validatingAdmissionPolicy and deletes it. Returns an error if one occurs. +func (c *validatingAdmissionPolicies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Resource("validatingadmissionpolicies"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *validatingAdmissionPolicies) 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(). + Resource("validatingadmissionpolicies"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched validatingAdmissionPolicy. +func (c *validatingAdmissionPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Patch(pt). + Resource("validatingadmissionpolicies"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingAdmissionPolicy. +func (c *validatingAdmissionPolicies) Apply(ctx context.Context, validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + if validatingAdmissionPolicy == nil { + return nil, fmt.Errorf("validatingAdmissionPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(validatingAdmissionPolicy) + if err != nil { + return nil, err + } + name := validatingAdmissionPolicy.Name + if name == nil { + return nil, fmt.Errorf("validatingAdmissionPolicy.Name must be provided to Apply") + } + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Resource("validatingadmissionpolicies"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *validatingAdmissionPolicies) ApplyStatus(ctx context.Context, validatingAdmissionPolicy *admissionregistrationv1beta1.ValidatingAdmissionPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicy, err error) { + if validatingAdmissionPolicy == nil { + return nil, fmt.Errorf("validatingAdmissionPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(validatingAdmissionPolicy) + if err != nil { + return nil, err + } + + name := validatingAdmissionPolicy.Name + if name == nil { + return nil, fmt.Errorf("validatingAdmissionPolicy.Name must be provided to Apply") + } + + result = &v1beta1.ValidatingAdmissionPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Resource("validatingadmissionpolicies"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicybinding.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicybinding.go new file mode 100644 index 000000000..bba37bb04 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingadmissionpolicybinding.go @@ -0,0 +1,197 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// ValidatingAdmissionPolicyBindingsGetter has a method to return a ValidatingAdmissionPolicyBindingInterface. +// A group's client should implement this interface. +type ValidatingAdmissionPolicyBindingsGetter interface { + ValidatingAdmissionPolicyBindings() ValidatingAdmissionPolicyBindingInterface +} + +// ValidatingAdmissionPolicyBindingInterface has methods to work with ValidatingAdmissionPolicyBinding resources. +type ValidatingAdmissionPolicyBindingInterface interface { + Create(ctx context.Context, validatingAdmissionPolicyBinding *v1beta1.ValidatingAdmissionPolicyBinding, opts v1.CreateOptions) (*v1beta1.ValidatingAdmissionPolicyBinding, error) + Update(ctx context.Context, validatingAdmissionPolicyBinding *v1beta1.ValidatingAdmissionPolicyBinding, opts v1.UpdateOptions) (*v1beta1.ValidatingAdmissionPolicyBinding, 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) (*v1beta1.ValidatingAdmissionPolicyBinding, error) + List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ValidatingAdmissionPolicyBindingList, 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 *v1beta1.ValidatingAdmissionPolicyBinding, err error) + Apply(ctx context.Context, validatingAdmissionPolicyBinding *admissionregistrationv1beta1.ValidatingAdmissionPolicyBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) + ValidatingAdmissionPolicyBindingExpansion +} + +// validatingAdmissionPolicyBindings implements ValidatingAdmissionPolicyBindingInterface +type validatingAdmissionPolicyBindings struct { + client rest.Interface +} + +// newValidatingAdmissionPolicyBindings returns a ValidatingAdmissionPolicyBindings +func newValidatingAdmissionPolicyBindings(c *AdmissionregistrationV1beta1Client) *validatingAdmissionPolicyBindings { + return &validatingAdmissionPolicyBindings{ + client: c.RESTClient(), + } +} + +// Get takes name of the validatingAdmissionPolicyBinding, and returns the corresponding validatingAdmissionPolicyBinding object, and an error if there is any. +func (c *validatingAdmissionPolicyBindings) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) { + result = &v1beta1.ValidatingAdmissionPolicyBinding{} + err = c.client.Get(). + Resource("validatingadmissionpolicybindings"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ValidatingAdmissionPolicyBindings that match those selectors. +func (c *validatingAdmissionPolicyBindings) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.ValidatingAdmissionPolicyBindingList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.ValidatingAdmissionPolicyBindingList{} + err = c.client.Get(). + Resource("validatingadmissionpolicybindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested validatingAdmissionPolicyBindings. +func (c *validatingAdmissionPolicyBindings) 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(). + Resource("validatingadmissionpolicybindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a validatingAdmissionPolicyBinding and creates it. Returns the server's representation of the validatingAdmissionPolicyBinding, and an error, if there is any. +func (c *validatingAdmissionPolicyBindings) Create(ctx context.Context, validatingAdmissionPolicyBinding *v1beta1.ValidatingAdmissionPolicyBinding, opts v1.CreateOptions) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) { + result = &v1beta1.ValidatingAdmissionPolicyBinding{} + err = c.client.Post(). + Resource("validatingadmissionpolicybindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(validatingAdmissionPolicyBinding). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a validatingAdmissionPolicyBinding and updates it. Returns the server's representation of the validatingAdmissionPolicyBinding, and an error, if there is any. +func (c *validatingAdmissionPolicyBindings) Update(ctx context.Context, validatingAdmissionPolicyBinding *v1beta1.ValidatingAdmissionPolicyBinding, opts v1.UpdateOptions) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) { + result = &v1beta1.ValidatingAdmissionPolicyBinding{} + err = c.client.Put(). + Resource("validatingadmissionpolicybindings"). + Name(validatingAdmissionPolicyBinding.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(validatingAdmissionPolicyBinding). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the validatingAdmissionPolicyBinding and deletes it. Returns an error if one occurs. +func (c *validatingAdmissionPolicyBindings) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Resource("validatingadmissionpolicybindings"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *validatingAdmissionPolicyBindings) 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(). + Resource("validatingadmissionpolicybindings"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched validatingAdmissionPolicyBinding. +func (c *validatingAdmissionPolicyBindings) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) { + result = &v1beta1.ValidatingAdmissionPolicyBinding{} + err = c.client.Patch(pt). + Resource("validatingadmissionpolicybindings"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingAdmissionPolicyBinding. +func (c *validatingAdmissionPolicyBindings) Apply(ctx context.Context, validatingAdmissionPolicyBinding *admissionregistrationv1beta1.ValidatingAdmissionPolicyBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingAdmissionPolicyBinding, err error) { + if validatingAdmissionPolicyBinding == nil { + return nil, fmt.Errorf("validatingAdmissionPolicyBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(validatingAdmissionPolicyBinding) + if err != nil { + return nil, err + } + name := validatingAdmissionPolicyBinding.Name + if name == nil { + return nil, fmt.Errorf("validatingAdmissionPolicyBinding.Name must be provided to Apply") + } + result = &v1beta1.ValidatingAdmissionPolicyBinding{} + err = c.client.Patch(types.ApplyPatchType). + Resource("validatingadmissionpolicybindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go index aea9d0e13..81be8b2e0 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go @@ -28,6 +28,7 @@ import ( type AuthenticationV1Interface interface { RESTClient() rest.Interface + SelfSubjectReviewsGetter TokenReviewsGetter } @@ -36,6 +37,10 @@ type AuthenticationV1Client struct { restClient rest.Interface } +func (c *AuthenticationV1Client) SelfSubjectReviews() SelfSubjectReviewInterface { + return newSelfSubjectReviews(c) +} + func (c *AuthenticationV1Client) TokenReviews() TokenReviewInterface { return newTokenReviews(c) } diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go index 0413fb2b6..35f2c22b4 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go @@ -18,4 +18,6 @@ limitations under the License. package v1 +type SelfSubjectReviewExpansion interface{} + type TokenReviewExpansion interface{} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/selfsubjectreview.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/selfsubjectreview.go new file mode 100644 index 000000000..bfb9603d6 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/selfsubjectreview.go @@ -0,0 +1,64 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + + v1 "k8s.io/api/authentication/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// SelfSubjectReviewsGetter has a method to return a SelfSubjectReviewInterface. +// A group's client should implement this interface. +type SelfSubjectReviewsGetter interface { + SelfSubjectReviews() SelfSubjectReviewInterface +} + +// SelfSubjectReviewInterface has methods to work with SelfSubjectReview resources. +type SelfSubjectReviewInterface interface { + Create(ctx context.Context, selfSubjectReview *v1.SelfSubjectReview, opts metav1.CreateOptions) (*v1.SelfSubjectReview, error) + SelfSubjectReviewExpansion +} + +// selfSubjectReviews implements SelfSubjectReviewInterface +type selfSubjectReviews struct { + client rest.Interface +} + +// newSelfSubjectReviews returns a SelfSubjectReviews +func newSelfSubjectReviews(c *AuthenticationV1Client) *selfSubjectReviews { + return &selfSubjectReviews{ + client: c.RESTClient(), + } +} + +// Create takes the representation of a selfSubjectReview and creates it. Returns the server's representation of the selfSubjectReview, and an error, if there is any. +func (c *selfSubjectReviews) Create(ctx context.Context, selfSubjectReview *v1.SelfSubjectReview, opts metav1.CreateOptions) (result *v1.SelfSubjectReview, err error) { + result = &v1.SelfSubjectReview{} + err = c.client.Post(). + Resource("selfsubjectreviews"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(selfSubjectReview). + Do(ctx). + Into(result) + return +} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go index f24099b90..978b26db0 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go @@ -43,7 +43,6 @@ type NetworkPoliciesGetter interface { type NetworkPolicyInterface interface { Create(ctx context.Context, networkPolicy *v1beta1.NetworkPolicy, opts v1.CreateOptions) (*v1beta1.NetworkPolicy, error) Update(ctx context.Context, networkPolicy *v1beta1.NetworkPolicy, opts v1.UpdateOptions) (*v1beta1.NetworkPolicy, error) - UpdateStatus(ctx context.Context, networkPolicy *v1beta1.NetworkPolicy, opts v1.UpdateOptions) (*v1beta1.NetworkPolicy, 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) (*v1beta1.NetworkPolicy, error) @@ -51,7 +50,6 @@ type NetworkPolicyInterface interface { 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 *v1beta1.NetworkPolicy, err error) Apply(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) - ApplyStatus(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) NetworkPolicyExpansion } @@ -141,22 +139,6 @@ func (c *networkPolicies) Update(ctx context.Context, networkPolicy *v1beta1.Net return } -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *networkPolicies) UpdateStatus(ctx context.Context, networkPolicy *v1beta1.NetworkPolicy, opts v1.UpdateOptions) (result *v1beta1.NetworkPolicy, err error) { - result = &v1beta1.NetworkPolicy{} - err = c.client.Put(). - Namespace(c.ns). - Resource("networkpolicies"). - Name(networkPolicy.Name). - SubResource("status"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(networkPolicy). - Do(ctx). - Into(result) - return -} - // Delete takes name of the networkPolicy and deletes it. Returns an error if one occurs. func (c *networkPolicies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { return c.client.Delete(). @@ -224,33 +206,3 @@ func (c *networkPolicies) Apply(ctx context.Context, networkPolicy *extensionsv1 Into(result) return } - -// ApplyStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). -func (c *networkPolicies) ApplyStatus(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) { - if networkPolicy == nil { - return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") - } - patchOpts := opts.ToPatchOptions() - data, err := json.Marshal(networkPolicy) - if err != nil { - return nil, err - } - - name := networkPolicy.Name - if name == nil { - return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") - } - - result = &v1beta1.NetworkPolicy{} - err = c.client.Patch(types.ApplyPatchType). - Namespace(c.ns). - Resource("networkpolicies"). - Name(*name). - SubResource("status"). - VersionedParams(&patchOpts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/tools/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go b/tools/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go index 97afd6278..d7454ce14 100644 --- a/tools/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go +++ b/tools/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go @@ -43,7 +43,6 @@ type NetworkPoliciesGetter interface { type NetworkPolicyInterface interface { Create(ctx context.Context, networkPolicy *v1.NetworkPolicy, opts metav1.CreateOptions) (*v1.NetworkPolicy, error) Update(ctx context.Context, networkPolicy *v1.NetworkPolicy, opts metav1.UpdateOptions) (*v1.NetworkPolicy, error) - UpdateStatus(ctx context.Context, networkPolicy *v1.NetworkPolicy, opts metav1.UpdateOptions) (*v1.NetworkPolicy, error) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.NetworkPolicy, error) @@ -51,7 +50,6 @@ type NetworkPolicyInterface interface { Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.NetworkPolicy, err error) Apply(ctx context.Context, networkPolicy *networkingv1.NetworkPolicyApplyConfiguration, opts metav1.ApplyOptions) (result *v1.NetworkPolicy, err error) - ApplyStatus(ctx context.Context, networkPolicy *networkingv1.NetworkPolicyApplyConfiguration, opts metav1.ApplyOptions) (result *v1.NetworkPolicy, err error) NetworkPolicyExpansion } @@ -141,22 +139,6 @@ func (c *networkPolicies) Update(ctx context.Context, networkPolicy *v1.NetworkP return } -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *networkPolicies) UpdateStatus(ctx context.Context, networkPolicy *v1.NetworkPolicy, opts metav1.UpdateOptions) (result *v1.NetworkPolicy, err error) { - result = &v1.NetworkPolicy{} - err = c.client.Put(). - Namespace(c.ns). - Resource("networkpolicies"). - Name(networkPolicy.Name). - SubResource("status"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(networkPolicy). - Do(ctx). - Into(result) - return -} - // Delete takes name of the networkPolicy and deletes it. Returns an error if one occurs. func (c *networkPolicies) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { return c.client.Delete(). @@ -224,33 +206,3 @@ func (c *networkPolicies) Apply(ctx context.Context, networkPolicy *networkingv1 Into(result) return } - -// ApplyStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). -func (c *networkPolicies) ApplyStatus(ctx context.Context, networkPolicy *networkingv1.NetworkPolicyApplyConfiguration, opts metav1.ApplyOptions) (result *v1.NetworkPolicy, err error) { - if networkPolicy == nil { - return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") - } - patchOpts := opts.ToPatchOptions() - data, err := json.Marshal(networkPolicy) - if err != nil { - return nil, err - } - - name := networkPolicy.Name - if name == nil { - return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") - } - - result = &v1.NetworkPolicy{} - err = c.client.Patch(types.ApplyPatchType). - Namespace(c.ns). - Resource("networkpolicies"). - Name(*name). - SubResource("status"). - VersionedParams(&patchOpts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/tools/vendor/k8s.io/client-go/openapi/client.go b/tools/vendor/k8s.io/client-go/openapi/client.go index 7b58762ac..6a4305718 100644 --- a/tools/vendor/k8s.io/client-go/openapi/client.go +++ b/tools/vendor/k8s.io/client-go/openapi/client.go @@ -19,6 +19,7 @@ package openapi import ( "context" "encoding/json" + "strings" "k8s.io/client-go/rest" "k8s.io/kube-openapi/pkg/handler3" @@ -58,7 +59,11 @@ func (c *client) Paths() (map[string]GroupVersion, error) { // Create GroupVersions for each element of the result result := map[string]GroupVersion{} for k, v := range discoMap.Paths { - result[k] = newGroupVersion(c, v) + // If the server returned a URL rooted at /openapi/v3, preserve any additional client-side prefix. + // If the server returned a URL not rooted at /openapi/v3, treat it as an actual server-relative URL. + // See https://github.com/kubernetes/kubernetes/issues/117463 for details + useClientPrefix := strings.HasPrefix(v.ServerRelativeURL, "/openapi/v3") + result[k] = newGroupVersion(c, v, useClientPrefix) } return result, nil } diff --git a/tools/vendor/k8s.io/client-go/openapi/groupversion.go b/tools/vendor/k8s.io/client-go/openapi/groupversion.go index 32133a29b..601dcbe3c 100644 --- a/tools/vendor/k8s.io/client-go/openapi/groupversion.go +++ b/tools/vendor/k8s.io/client-go/openapi/groupversion.go @@ -18,6 +18,7 @@ package openapi import ( "context" + "net/url" "k8s.io/kube-openapi/pkg/handler3" ) @@ -29,18 +30,41 @@ type GroupVersion interface { } type groupversion struct { - client *client - item handler3.OpenAPIV3DiscoveryGroupVersion + client *client + item handler3.OpenAPIV3DiscoveryGroupVersion + useClientPrefix bool } -func newGroupVersion(client *client, item handler3.OpenAPIV3DiscoveryGroupVersion) *groupversion { - return &groupversion{client: client, item: item} +func newGroupVersion(client *client, item handler3.OpenAPIV3DiscoveryGroupVersion, useClientPrefix bool) *groupversion { + return &groupversion{client: client, item: item, useClientPrefix: useClientPrefix} } func (g *groupversion) Schema(contentType string) ([]byte, error) { - return g.client.restClient.Get(). - RequestURI(g.item.ServerRelativeURL). - SetHeader("Accept", contentType). - Do(context.TODO()). - Raw() + if !g.useClientPrefix { + return g.client.restClient.Get(). + RequestURI(g.item.ServerRelativeURL). + SetHeader("Accept", contentType). + Do(context.TODO()). + Raw() + } + + locator, err := url.Parse(g.item.ServerRelativeURL) + if err != nil { + return nil, err + } + + path := g.client.restClient.Get(). + AbsPath(locator.Path). + SetHeader("Accept", contentType) + + // Other than root endpoints(openapiv3/apis), resources have hash query parameter to support etags. + // However, absPath does not support handling query parameters internally, + // so that hash query parameter is added manually + for k, value := range locator.Query() { + for _, v := range value { + path.Param(k, v) + } + } + + return path.Do(context.TODO()).Raw() } diff --git a/tools/vendor/k8s.io/client-go/openapi/typeconverter.go b/tools/vendor/k8s.io/client-go/openapi/typeconverter.go new file mode 100644 index 000000000..4b91e66d4 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/openapi/typeconverter.go @@ -0,0 +1,48 @@ +/* +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 openapi + +import ( + "encoding/json" + "fmt" + + "k8s.io/apimachinery/pkg/util/managedfields" + "k8s.io/kube-openapi/pkg/spec3" + "k8s.io/kube-openapi/pkg/validation/spec" +) + +func NewTypeConverter(client Client, preserveUnknownFields bool) (managedfields.TypeConverter, error) { + spec := map[string]*spec.Schema{} + paths, err := client.Paths() + if err != nil { + return nil, fmt.Errorf("failed to list paths: %w", err) + } + for _, gv := range paths { + s, err := gv.Schema("application/json") + if err != nil { + return nil, fmt.Errorf("failed to download schema: %w", err) + } + var openapi spec3.OpenAPI + if err := json.Unmarshal(s, &openapi); err != nil { + return nil, fmt.Errorf("failed to parse schema: %w", err) + } + for k, v := range openapi.Components.Schemas { + spec[k] = v + } + } + return managedfields.NewTypeConverter(spec, preserveUnknownFields) +} diff --git a/tools/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go b/tools/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go index 5331b237a..b471f5cc6 100644 --- a/tools/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go +++ b/tools/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go @@ -32,12 +32,12 @@ import ( "sync" "time" - "github.com/davecgh/go-spew/spew" "golang.org/x/term" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/dump" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/pkg/apis/clientauthentication/install" @@ -81,8 +81,6 @@ func newCache() *cache { return &cache{m: make(map[string]*Authenticator)} } -var spewConfig = &spew.ConfigState{DisableMethods: true, Indent: " "} - func cacheKey(conf *api.ExecConfig, cluster *clientauthentication.Cluster) string { key := struct { conf *api.ExecConfig @@ -91,7 +89,7 @@ func cacheKey(conf *api.ExecConfig, cluster *clientauthentication.Cluster) strin conf: conf, cluster: cluster, } - return spewConfig.Sprint(key) + return dump.Pretty(key) } type cache struct { diff --git a/tools/vendor/k8s.io/client-go/rest/config.go b/tools/vendor/k8s.io/client-go/rest/config.go index 81e3cbd68..f8ff7e928 100644 --- a/tools/vendor/k8s.io/client-go/rest/config.go +++ b/tools/vendor/k8s.io/client-go/rest/config.go @@ -316,7 +316,7 @@ func RESTClientFor(config *Config) (*RESTClient, error) { // Validate config.Host before constructing the transport/client so we can fail fast. // ServerURL will be obtained later in RESTClientForConfigAndClient() - _, _, err := defaultServerUrlFor(config) + _, _, err := DefaultServerUrlFor(config) if err != nil { return nil, err } @@ -343,7 +343,7 @@ func RESTClientForConfigAndClient(config *Config, httpClient *http.Client) (*RES return nil, fmt.Errorf("NegotiatedSerializer is required when initializing a RESTClient") } - baseURL, versionedAPIPath, err := defaultServerUrlFor(config) + baseURL, versionedAPIPath, err := DefaultServerUrlFor(config) if err != nil { return nil, err } @@ -390,7 +390,7 @@ func UnversionedRESTClientFor(config *Config) (*RESTClient, error) { // Validate config.Host before constructing the transport/client so we can fail fast. // ServerURL will be obtained later in UnversionedRESTClientForConfigAndClient() - _, _, err := defaultServerUrlFor(config) + _, _, err := DefaultServerUrlFor(config) if err != nil { return nil, err } @@ -410,7 +410,7 @@ func UnversionedRESTClientForConfigAndClient(config *Config, httpClient *http.Cl return nil, fmt.Errorf("NegotiatedSerializer is required when initializing a RESTClient") } - baseURL, versionedAPIPath, err := defaultServerUrlFor(config) + baseURL, versionedAPIPath, err := DefaultServerUrlFor(config) if err != nil { return nil, err } @@ -548,7 +548,7 @@ func InClusterConfig() (*Config, error) { // Note: the Insecure flag is ignored when testing for this value, so MITM attacks are // still possible. func IsConfigTransportTLS(config Config) bool { - baseURL, _, err := defaultServerUrlFor(&config) + baseURL, _, err := DefaultServerUrlFor(&config) if err != nil { return false } diff --git a/tools/vendor/k8s.io/client-go/rest/request.go b/tools/vendor/k8s.io/client-go/rest/request.go index bb6fb4dec..850e57dae 100644 --- a/tools/vendor/k8s.io/client-go/rest/request.go +++ b/tools/vendor/k8s.io/client-go/rest/request.go @@ -24,6 +24,7 @@ import ( "io" "mime" "net/http" + "net/http/httptrace" "net/url" "os" "path" @@ -925,15 +926,38 @@ func (r *Request) newHTTPRequest(ctx context.Context) (*http.Request, error) { } url := r.URL().String() - req, err := http.NewRequest(r.verb, url, body) + req, err := http.NewRequestWithContext(httptrace.WithClientTrace(ctx, newDNSMetricsTrace(ctx)), r.verb, url, body) if err != nil { return nil, err } - req = req.WithContext(ctx) req.Header = r.headers return req, nil } +// newDNSMetricsTrace returns an HTTP trace that tracks time spent on DNS lookups per host. +// This metric is available in client as "rest_client_dns_resolution_duration_seconds". +func newDNSMetricsTrace(ctx context.Context) *httptrace.ClientTrace { + type dnsMetric struct { + start time.Time + host string + sync.Mutex + } + dns := &dnsMetric{} + return &httptrace.ClientTrace{ + DNSStart: func(info httptrace.DNSStartInfo) { + dns.Lock() + defer dns.Unlock() + dns.start = time.Now() + dns.host = info.Host + }, + DNSDone: func(info httptrace.DNSDoneInfo) { + dns.Lock() + defer dns.Unlock() + metrics.ResolverLatency.Observe(ctx, dns.host, time.Since(dns.start)) + }, + } +} + // request connects to the server and invokes the provided function when a server response is // received. It handles retry behavior and up front validation of requests. It will invoke // fn at most once. It will return an error if a problem occurred prior to connecting to the diff --git a/tools/vendor/k8s.io/client-go/rest/url_utils.go b/tools/vendor/k8s.io/client-go/rest/url_utils.go index a56d1838d..c4ce6e3b8 100644 --- a/tools/vendor/k8s.io/client-go/rest/url_utils.go +++ b/tools/vendor/k8s.io/client-go/rest/url_utils.go @@ -77,9 +77,9 @@ func DefaultVersionedAPIPath(apiPath string, groupVersion schema.GroupVersion) s return versionedAPIPath } -// defaultServerUrlFor is shared between IsConfigTransportTLS and RESTClientFor. It +// DefaultServerUrlFor is shared between IsConfigTransportTLS and RESTClientFor. It // requires Host and Version to be set prior to being called. -func defaultServerUrlFor(config *Config) (*url.URL, string, error) { +func DefaultServerUrlFor(config *Config) (*url.URL, string, error) { // TODO: move the default to secure when the apiserver supports TLS by default // config.Insecure is taken to mean "I want HTTPS but don't bother checking the certs against a CA." hasCA := len(config.CAFile) != 0 || len(config.CAData) != 0 diff --git a/tools/vendor/k8s.io/client-go/tools/cache/OWNERS b/tools/vendor/k8s.io/client-go/tools/cache/OWNERS index 726205b3d..921ac2fa0 100644 --- a/tools/vendor/k8s.io/client-go/tools/cache/OWNERS +++ b/tools/vendor/k8s.io/client-go/tools/cache/OWNERS @@ -2,7 +2,6 @@ approvers: - thockin - - lavalamp - smarterclayton - wojtek-t - deads2k @@ -11,7 +10,6 @@ approvers: - ncdc reviewers: - thockin - - lavalamp - smarterclayton - wojtek-t - deads2k @@ -26,3 +24,5 @@ reviewers: - dims - ingvagabund - ncdc +emeritus_approvers: + - lavalamp diff --git a/tools/vendor/k8s.io/client-go/tools/cache/controller.go b/tools/vendor/k8s.io/client-go/tools/cache/controller.go index f437f2861..8a1104bde 100644 --- a/tools/vendor/k8s.io/client-go/tools/cache/controller.go +++ b/tools/vendor/k8s.io/client-go/tools/cache/controller.go @@ -18,7 +18,6 @@ package cache import ( "errors" - "os" "sync" "time" @@ -148,9 +147,6 @@ func (c *controller) Run(stopCh <-chan struct{}) { if c.config.WatchErrorHandler != nil { r.watchErrorHandler = c.config.WatchErrorHandler } - if s := os.Getenv("ENABLE_CLIENT_GO_WATCH_LIST_ALPHA"); len(s) > 0 { - r.UseWatchList = true - } c.reflectorMutex.Lock() c.reflector = r diff --git a/tools/vendor/k8s.io/client-go/tools/cache/object-names.go b/tools/vendor/k8s.io/client-go/tools/cache/object-names.go new file mode 100644 index 000000000..aa8dbb199 --- /dev/null +++ b/tools/vendor/k8s.io/client-go/tools/cache/object-names.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 cache + +import ( + "k8s.io/apimachinery/pkg/types" +) + +// ObjectName is a reference to an object of some implicit kind +type ObjectName struct { + Namespace string + Name string +} + +// NewObjectName constructs a new one +func NewObjectName(namespace, name string) ObjectName { + return ObjectName{Namespace: namespace, Name: name} +} + +// Parts is the inverse of the constructor +func (objName ObjectName) Parts() (namespace, name string) { + return objName.Namespace, objName.Name +} + +// String returns the standard string encoding, +// which is designed to match the historical behavior of MetaNamespaceKeyFunc. +// Note this behavior is different from the String method of types.NamespacedName. +func (objName ObjectName) String() string { + if len(objName.Namespace) > 0 { + return objName.Namespace + "/" + objName.Name + } + return objName.Name +} + +// ParseObjectName tries to parse the standard encoding +func ParseObjectName(str string) (ObjectName, error) { + var objName ObjectName + var err error + objName.Namespace, objName.Name, err = SplitMetaNamespaceKey(str) + return objName, err +} + +// NamespacedNameAsObjectName rebrands the given NamespacedName as an ObjectName +func NamespacedNameAsObjectName(nn types.NamespacedName) ObjectName { + return NewObjectName(nn.Namespace, nn.Name) +} + +// AsNamespacedName rebrands as a NamespacedName +func (objName ObjectName) AsNamespacedName() types.NamespacedName { + return types.NamespacedName{Namespace: objName.Namespace, Name: objName.Name} +} diff --git a/tools/vendor/k8s.io/client-go/tools/cache/reflector.go b/tools/vendor/k8s.io/client-go/tools/cache/reflector.go index 2b335c104..45eaff528 100644 --- a/tools/vendor/k8s.io/client-go/tools/cache/reflector.go +++ b/tools/vendor/k8s.io/client-go/tools/cache/reflector.go @@ -22,6 +22,7 @@ import ( "fmt" "io" "math/rand" + "os" "reflect" "strings" "sync" @@ -69,9 +70,7 @@ type Reflector struct { listerWatcher ListerWatcher // backoff manages backoff of ListWatch backoffManager wait.BackoffManager - // initConnBackoffManager manages backoff the initial connection with the Watch call of ListAndWatch. - initConnBackoffManager wait.BackoffManager - resyncPeriod time.Duration + resyncPeriod time.Duration // clock allows tests to manipulate time clock clock.Clock // paginatedResult defines whether pagination should be forced for list calls. @@ -220,11 +219,10 @@ func NewReflectorWithOptions(lw ListerWatcher, expectedType interface{}, store S // We used to make the call every 1sec (1 QPS), the goal here is to achieve ~98% traffic reduction when // API server is not healthy. With these parameters, backoff will stop at [30,60) sec interval which is // 0.22 QPS. If we don't backoff for 2min, assume API server is healthy and we reset the backoff. - backoffManager: wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, reflectorClock), - initConnBackoffManager: wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, reflectorClock), - clock: reflectorClock, - watchErrorHandler: WatchErrorHandler(DefaultWatchErrorHandler), - expectedType: reflect.TypeOf(expectedType), + backoffManager: wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, reflectorClock), + clock: reflectorClock, + watchErrorHandler: WatchErrorHandler(DefaultWatchErrorHandler), + expectedType: reflect.TypeOf(expectedType), } if r.name == "" { @@ -239,6 +237,10 @@ func NewReflectorWithOptions(lw ListerWatcher, expectedType interface{}, store S r.expectedGVK = getExpectedGVKFromObject(expectedType) } + if s := os.Getenv("ENABLE_CLIENT_GO_WATCH_LIST_ALPHA"); len(s) > 0 { + r.UseWatchList = true + } + return r } @@ -420,7 +422,7 @@ func (r *Reflector) watch(w watch.Interface, stopCh <-chan struct{}, resyncerrc select { case <-stopCh: return nil - case <-r.initConnBackoffManager.Backoff().C(): + case <-r.backoffManager.Backoff().C(): continue } } @@ -446,7 +448,7 @@ func (r *Reflector) watch(w watch.Interface, stopCh <-chan struct{}, resyncerrc select { case <-stopCh: return nil - case <-r.initConnBackoffManager.Backoff().C(): + case <-r.backoffManager.Backoff().C(): continue } case apierrors.IsInternalError(err) && retry.ShouldRetry(): @@ -508,7 +510,7 @@ func (r *Reflector) list(stopCh <-chan struct{}) error { pager.PageSize = 0 } - list, paginatedResult, err = pager.List(context.Background(), options) + list, paginatedResult, err = pager.ListWithAlloc(context.Background(), options) if isExpiredError(err) || isTooLargeResourceVersionError(err) { r.setIsLastSyncResourceVersionUnavailable(true) // Retry immediately if the resource version used to list is unavailable. @@ -517,7 +519,7 @@ func (r *Reflector) list(stopCh <-chan struct{}) error { // resource version it is listing at is expired or the cache may not yet be synced to the provided // resource version. So we need to fallback to resourceVersion="" in all to recover and ensure // the reflector makes forward progress. - list, paginatedResult, err = pager.List(context.Background(), metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}) + list, paginatedResult, err = pager.ListWithAlloc(context.Background(), metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}) } close(listCh) }() @@ -555,7 +557,7 @@ func (r *Reflector) list(stopCh <-chan struct{}) error { } resourceVersion = listMetaInterface.GetResourceVersion() initTrace.Step("Resource version extracted") - items, err := meta.ExtractList(list) + items, err := meta.ExtractListWithAlloc(list) if err != nil { return fmt.Errorf("unable to understand list result %#v (%v)", list, err) } @@ -599,7 +601,7 @@ func (r *Reflector) watchList(stopCh <-chan struct{}) (watch.Interface, error) { isErrorRetriableWithSideEffectsFn := func(err error) bool { if canRetry := isWatchErrorRetriable(err); canRetry { klog.V(2).Infof("%s: watch-list of %v returned %v - backing off", r.name, r.typeDescription, err) - <-r.initConnBackoffManager.Backoff().C() + <-r.backoffManager.Backoff().C() return true } if isExpiredError(err) || isTooLargeResourceVersionError(err) { diff --git a/tools/vendor/k8s.io/client-go/tools/cache/shared_informer.go b/tools/vendor/k8s.io/client-go/tools/cache/shared_informer.go index a889fdbc3..be8694ddb 100644 --- a/tools/vendor/k8s.io/client-go/tools/cache/shared_informer.go +++ b/tools/vendor/k8s.io/client-go/tools/cache/shared_informer.go @@ -459,29 +459,30 @@ func (s *sharedIndexInformer) Run(stopCh <-chan struct{}) { klog.Warningf("The sharedIndexInformer has started, run more than once is not allowed") return } - fifo := NewDeltaFIFOWithOptions(DeltaFIFOOptions{ - KnownObjects: s.indexer, - EmitDeltaTypeReplaced: true, - Transformer: s.transform, - }) - - cfg := &Config{ - Queue: fifo, - ListerWatcher: s.listerWatcher, - ObjectType: s.objectType, - ObjectDescription: s.objectDescription, - FullResyncPeriod: s.resyncCheckPeriod, - RetryOnError: false, - ShouldResync: s.processor.shouldResync, - - Process: s.HandleDeltas, - WatchErrorHandler: s.watchErrorHandler, - } func() { s.startedLock.Lock() defer s.startedLock.Unlock() + fifo := NewDeltaFIFOWithOptions(DeltaFIFOOptions{ + KnownObjects: s.indexer, + EmitDeltaTypeReplaced: true, + Transformer: s.transform, + }) + + cfg := &Config{ + Queue: fifo, + ListerWatcher: s.listerWatcher, + ObjectType: s.objectType, + ObjectDescription: s.objectDescription, + FullResyncPeriod: s.resyncCheckPeriod, + RetryOnError: false, + ShouldResync: s.processor.shouldResync, + + Process: s.HandleDeltas, + WatchErrorHandler: s.watchErrorHandler, + } + s.controller = New(cfg) s.controller.(*controller).clock = s.clock s.started = true diff --git a/tools/vendor/k8s.io/client-go/tools/cache/store.go b/tools/vendor/k8s.io/client-go/tools/cache/store.go index 5308ea748..5cc3f42ec 100644 --- a/tools/vendor/k8s.io/client-go/tools/cache/store.go +++ b/tools/vendor/k8s.io/client-go/tools/cache/store.go @@ -21,6 +21,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // Store is a generic object storage and processing interface. A @@ -99,20 +100,38 @@ type ExplicitKey string // The key uses the format / unless is empty, then // it's just . // -// TODO: replace key-as-string with a key-as-struct so that this -// packing/unpacking won't be necessary. +// Clients that want a structured alternative can use ObjectToName or MetaObjectToName. +// Note: this would not be a client that wants a key for a Store because those are +// necessarily strings. +// +// TODO maybe some day?: change Store to be keyed differently func MetaNamespaceKeyFunc(obj interface{}) (string, error) { if key, ok := obj.(ExplicitKey); ok { return string(key), nil } + objName, err := ObjectToName(obj) + if err != nil { + return "", err + } + return objName.String(), nil +} + +// ObjectToName returns the structured name for the given object, +// if indeed it can be viewed as a metav1.Object. +func ObjectToName(obj interface{}) (ObjectName, error) { meta, err := meta.Accessor(obj) if err != nil { - return "", fmt.Errorf("object has no meta: %v", err) + return ObjectName{}, fmt.Errorf("object has no meta: %v", err) } - if len(meta.GetNamespace()) > 0 { - return meta.GetNamespace() + "/" + meta.GetName(), nil + return MetaObjectToName(meta), nil +} + +// MetaObjectToName returns the structured name for the given object +func MetaObjectToName(obj metav1.Object) ObjectName { + if len(obj.GetNamespace()) > 0 { + return ObjectName{Namespace: obj.GetNamespace(), Name: obj.GetName()} } - return meta.GetName(), nil + return ObjectName{Namespace: "", Name: obj.GetName()} } // SplitMetaNamespaceKey returns the namespace and name that diff --git a/tools/vendor/k8s.io/client-go/tools/clientcmd/api/types.go b/tools/vendor/k8s.io/client-go/tools/clientcmd/api/types.go index 71fb821b1..ae8b8c703 100644 --- a/tools/vendor/k8s.io/client-go/tools/clientcmd/api/types.go +++ b/tools/vendor/k8s.io/client-go/tools/clientcmd/api/types.go @@ -67,7 +67,7 @@ type Preferences struct { type Cluster struct { // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized. // +k8s:conversion-gen=false - LocationOfOrigin string + LocationOfOrigin string `json:"-"` // Server is the address of the kubernetes cluster (https://hostname:port). Server string `json:"server"` // TLSServerName is used to check server certificate. If TLSServerName is empty, the hostname used to contact the server is used. @@ -107,7 +107,7 @@ type Cluster struct { type AuthInfo struct { // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized. // +k8s:conversion-gen=false - LocationOfOrigin string + LocationOfOrigin string `json:"-"` // ClientCertificate is the path to a client cert file for TLS. // +optional ClientCertificate string `json:"client-certificate,omitempty"` @@ -159,7 +159,7 @@ type AuthInfo struct { type Context struct { // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized. // +k8s:conversion-gen=false - LocationOfOrigin string + LocationOfOrigin string `json:"-"` // Cluster is the name of the cluster for this context Cluster string `json:"cluster"` // AuthInfo is the name of the authInfo for this context @@ -252,7 +252,7 @@ type ExecConfig struct { // recommended as one of the prime benefits of exec plugins is that no secrets need // to be stored directly in the kubeconfig. // +k8s:conversion-gen=false - Config runtime.Object + Config runtime.Object `json:"-"` // InteractiveMode determines this plugin's relationship with standard input. Valid // values are "Never" (this exec plugin never uses standard input), "IfAvailable" (this @@ -264,7 +264,7 @@ type ExecConfig struct { // client.authentication.k8s.io/v1beta1, then this field is optional and defaults // to "IfAvailable" when unset. Otherwise, this field is required. // +optional - InteractiveMode ExecInteractiveMode + InteractiveMode ExecInteractiveMode `json:"interactiveMode,omitempty"` // StdinUnavailable indicates whether the exec authenticator can pass standard // input through to this exec plugin. For example, a higher level entity might be using @@ -272,14 +272,14 @@ type ExecConfig struct { // plugin to use standard input. This is kept here in order to keep all of the exec configuration // together, but it is never serialized. // +k8s:conversion-gen=false - StdinUnavailable bool + StdinUnavailable bool `json:"-"` // StdinUnavailableMessage is an optional message to be displayed when the exec authenticator // cannot successfully run this exec plugin because it needs to use standard input and // StdinUnavailable is true. For example, a process that is already using standard input to // read user instructions might set this to "used by my-program to read user instructions". // +k8s:conversion-gen=false - StdinUnavailableMessage string + StdinUnavailableMessage string `json:"-"` } var _ fmt.Stringer = new(ExecConfig) diff --git a/tools/vendor/k8s.io/client-go/tools/clientcmd/loader.go b/tools/vendor/k8s.io/client-go/tools/clientcmd/loader.go index 44de1d41d..b75737f1c 100644 --- a/tools/vendor/k8s.io/client-go/tools/clientcmd/loader.go +++ b/tools/vendor/k8s.io/client-go/tools/clientcmd/loader.go @@ -128,6 +128,28 @@ type ClientConfigLoadingRules struct { // WarnIfAllMissing indicates whether the configuration files pointed by KUBECONFIG environment variable are present or not. // In case of missing files, it warns the user about the missing files. WarnIfAllMissing bool + + // Warner is the warning log callback to use in case of missing files. + Warner WarningHandler +} + +// WarningHandler allows to set the logging function to use +type WarningHandler func(error) + +func (handler WarningHandler) Warn(err error) { + if handler == nil { + klog.V(1).Info(err) + } else { + handler(err) + } +} + +type MissingConfigError struct { + Missing []string +} + +func (c MissingConfigError) Error() string { + return fmt.Sprintf("Config not found: %s", strings.Join(c.Missing, ", ")) } // ClientConfigLoadingRules implements the ClientConfigLoader interface. @@ -219,7 +241,7 @@ func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) { } if rules.WarnIfAllMissing && len(missingList) > 0 && len(kubeconfigs) == 0 { - klog.Warningf("Config not found: %s", strings.Join(missingList, ", ")) + rules.Warner.Warn(MissingConfigError{Missing: missingList}) } // first merge all of our maps diff --git a/tools/vendor/k8s.io/client-go/tools/metrics/metrics.go b/tools/vendor/k8s.io/client-go/tools/metrics/metrics.go index f36430dc3..99d3d8e23 100644 --- a/tools/vendor/k8s.io/client-go/tools/metrics/metrics.go +++ b/tools/vendor/k8s.io/client-go/tools/metrics/metrics.go @@ -42,6 +42,10 @@ type LatencyMetric interface { Observe(ctx context.Context, verb string, u url.URL, latency time.Duration) } +type ResolverLatencyMetric interface { + Observe(ctx context.Context, host string, latency time.Duration) +} + // SizeMetric observes client response size partitioned by verb and host. type SizeMetric interface { Observe(ctx context.Context, verb string, host string, size float64) @@ -64,6 +68,17 @@ type RetryMetric interface { IncrementRetry(ctx context.Context, code string, method string, host string) } +// TransportCacheMetric shows the number of entries in the internal transport cache +type TransportCacheMetric interface { + Observe(value int) +} + +// TransportCreateCallsMetric counts the number of times a transport is created +// partitioned by the result of the cache: hit, miss, uncacheable +type TransportCreateCallsMetric interface { + Increment(result string) +} + var ( // ClientCertExpiry is the expiry time of a client certificate ClientCertExpiry ExpiryMetric = noopExpiry{} @@ -71,6 +86,8 @@ var ( ClientCertRotationAge DurationMetric = noopDuration{} // RequestLatency is the latency metric that rest clients will update. RequestLatency LatencyMetric = noopLatency{} + // ResolverLatency is the latency metric that DNS resolver will update + ResolverLatency ResolverLatencyMetric = noopResolverLatency{} // RequestSize is the request size metric that rest clients will update. RequestSize SizeMetric = noopSize{} // ResponseSize is the response size metric that rest clients will update. @@ -85,6 +102,12 @@ var ( // RequestRetry is the retry metric that tracks the number of // retries sent to the server. RequestRetry RetryMetric = noopRetry{} + // TransportCacheEntries is the metric that tracks the number of entries in the + // internal transport cache. + TransportCacheEntries TransportCacheMetric = noopTransportCache{} + // TransportCreateCalls is the metric that counts the number of times a new transport + // is created + TransportCreateCalls TransportCreateCallsMetric = noopTransportCreateCalls{} ) // RegisterOpts contains all the metrics to register. Metrics may be nil. @@ -92,12 +115,15 @@ type RegisterOpts struct { ClientCertExpiry ExpiryMetric ClientCertRotationAge DurationMetric RequestLatency LatencyMetric + ResolverLatency ResolverLatencyMetric RequestSize SizeMetric ResponseSize SizeMetric RateLimiterLatency LatencyMetric RequestResult ResultMetric ExecPluginCalls CallsMetric RequestRetry RetryMetric + TransportCacheEntries TransportCacheMetric + TransportCreateCalls TransportCreateCallsMetric } // Register registers metrics for the rest client to use. This can @@ -113,6 +139,9 @@ func Register(opts RegisterOpts) { if opts.RequestLatency != nil { RequestLatency = opts.RequestLatency } + if opts.ResolverLatency != nil { + ResolverLatency = opts.ResolverLatency + } if opts.RequestSize != nil { RequestSize = opts.RequestSize } @@ -131,6 +160,12 @@ func Register(opts RegisterOpts) { if opts.RequestRetry != nil { RequestRetry = opts.RequestRetry } + if opts.TransportCacheEntries != nil { + TransportCacheEntries = opts.TransportCacheEntries + } + if opts.TransportCreateCalls != nil { + TransportCreateCalls = opts.TransportCreateCalls + } }) } @@ -146,6 +181,11 @@ type noopLatency struct{} func (noopLatency) Observe(context.Context, string, url.URL, time.Duration) {} +type noopResolverLatency struct{} + +func (n noopResolverLatency) Observe(ctx context.Context, host string, latency time.Duration) { +} + type noopSize struct{} func (noopSize) Observe(context.Context, string, string, float64) {} @@ -161,3 +201,11 @@ func (noopCalls) Increment(int, string) {} type noopRetry struct{} func (noopRetry) IncrementRetry(context.Context, string, string, string) {} + +type noopTransportCache struct{} + +func (noopTransportCache) Observe(int) {} + +type noopTransportCreateCalls struct{} + +func (noopTransportCreateCalls) Increment(string) {} diff --git a/tools/vendor/k8s.io/client-go/tools/pager/pager.go b/tools/vendor/k8s.io/client-go/tools/pager/pager.go index 9ba988f68..3c77cc37f 100644 --- a/tools/vendor/k8s.io/client-go/tools/pager/pager.go +++ b/tools/vendor/k8s.io/client-go/tools/pager/pager.go @@ -73,7 +73,23 @@ func New(fn ListPageFunc) *ListPager { // List returns a single list object, but attempts to retrieve smaller chunks from the // server to reduce the impact on the server. If the chunk attempt fails, it will load // the full list instead. The Limit field on options, if unset, will default to the page size. +// +// If items in the returned list are retained for different durations, and you want to avoid +// retaining the whole slice returned by p.PageFn as long as any item is referenced, +// use ListWithAlloc instead. func (p *ListPager) List(ctx context.Context, options metav1.ListOptions) (runtime.Object, bool, error) { + return p.list(ctx, options, false) +} + +// ListWithAlloc works like List, but avoids retaining references to the items slice returned by p.PageFn. +// It does this by making a shallow copy of non-pointer items in the slice returned by p.PageFn. +// +// If the items in the returned list are not retained, or are retained for the same duration, use List instead for memory efficiency. +func (p *ListPager) ListWithAlloc(ctx context.Context, options metav1.ListOptions) (runtime.Object, bool, error) { + return p.list(ctx, options, true) +} + +func (p *ListPager) list(ctx context.Context, options metav1.ListOptions, allocNew bool) (runtime.Object, bool, error) { if options.Limit == 0 { options.Limit = p.PageSize } @@ -123,7 +139,11 @@ func (p *ListPager) List(ctx context.Context, options metav1.ListOptions) (runti list.ResourceVersion = m.GetResourceVersion() list.SelfLink = m.GetSelfLink() } - if err := meta.EachListItem(obj, func(obj runtime.Object) error { + eachListItemFunc := meta.EachListItem + if allocNew { + eachListItemFunc = meta.EachListItemWithAlloc + } + if err := eachListItemFunc(obj, func(obj runtime.Object) error { list.Items = append(list.Items, obj) return nil }); err != nil { @@ -156,12 +176,26 @@ func (p *ListPager) List(ctx context.Context, options metav1.ListOptions) (runti // // Items are retrieved in chunks from the server to reduce the impact on the server with up to // ListPager.PageBufferSize chunks buffered concurrently in the background. +// +// If items passed to fn are retained for different durations, and you want to avoid +// retaining the whole slice returned by p.PageFn as long as any item is referenced, +// use EachListItemWithAlloc instead. func (p *ListPager) EachListItem(ctx context.Context, options metav1.ListOptions, fn func(obj runtime.Object) error) error { return p.eachListChunkBuffered(ctx, options, func(obj runtime.Object) error { return meta.EachListItem(obj, fn) }) } +// EachListItemWithAlloc works like EachListItem, but avoids retaining references to the items slice returned by p.PageFn. +// It does this by making a shallow copy of non-pointer items in the slice returned by p.PageFn. +// +// If the items passed to fn are not retained, or are retained for the same duration, use EachListItem instead for memory efficiency. +func (p *ListPager) EachListItemWithAlloc(ctx context.Context, options metav1.ListOptions, fn func(obj runtime.Object) error) error { + return p.eachListChunkBuffered(ctx, options, func(obj runtime.Object) error { + return meta.EachListItemWithAlloc(obj, fn) + }) +} + // eachListChunkBuffered fetches runtimeObject list chunks using this ListPager and invokes fn on // each list chunk. If fn returns an error, processing stops and that error is returned. If fn does // not return an error, any error encountered while retrieving the list from the server is diff --git a/tools/vendor/k8s.io/client-go/tools/record/event.go b/tools/vendor/k8s.io/client-go/tools/record/event.go index 4899b362d..f176167dc 100644 --- a/tools/vendor/k8s.io/client-go/tools/record/event.go +++ b/tools/vendor/k8s.io/client-go/tools/record/event.go @@ -274,7 +274,7 @@ func recordEvent(sink EventSink, event *v1.Event, patch []byte, updateExistingEv klog.Errorf("Unable to construct event '%#v': '%v' (will not retry!)", event, err) return true case *errors.StatusError: - if errors.IsAlreadyExists(err) { + if errors.IsAlreadyExists(err) || errors.HasStatusCause(err, v1.NamespaceTerminatingCause) { klog.V(5).Infof("Server rejected event '%#v': '%v' (will not retry!)", event, err) } else { klog.Errorf("Server rejected event '%#v': '%v' (will not retry!)", event, err) @@ -357,6 +357,9 @@ func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations m event := recorder.makeEvent(ref, annotations, eventtype, reason, message) event.Source = recorder.source + event.ReportingInstance = recorder.source.Host + event.ReportingController = recorder.source.Component + // NOTE: events should be a non-blocking operation, but we also need to not // put this in a goroutine, otherwise we'll race to write to a closed channel // when we go to shut down this broadcaster. Just drop events if we get overloaded, diff --git a/tools/vendor/k8s.io/client-go/tools/watch/retrywatcher.go b/tools/vendor/k8s.io/client-go/tools/watch/retrywatcher.go index e4806d2ea..d81dc4357 100644 --- a/tools/vendor/k8s.io/client-go/tools/watch/retrywatcher.go +++ b/tools/vendor/k8s.io/client-go/tools/watch/retrywatcher.go @@ -24,10 +24,9 @@ import ( "net/http" "time" - "github.com/davecgh/go-spew/spew" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/dump" "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" @@ -191,7 +190,7 @@ func (rw *RetryWatcher) doReceive() (bool, time.Duration) { errObject := apierrors.FromObject(event.Object) statusErr, ok := errObject.(*apierrors.StatusError) if !ok { - klog.Error(spew.Sprintf("Received an error which is not *metav1.Status but %#+v", event.Object)) + klog.Error(fmt.Sprintf("Received an error which is not *metav1.Status but %s", dump.Pretty(event.Object))) // Retry unknown errors return false, 0 } @@ -220,7 +219,7 @@ func (rw *RetryWatcher) doReceive() (bool, time.Duration) { // Log here so we have a record of hitting the unexpected error // and we can whitelist some error codes if we missed any that are expected. - klog.V(5).Info(spew.Sprintf("Retrying after unexpected error: %#+v", event.Object)) + klog.V(5).Info(fmt.Sprintf("Retrying after unexpected error: %s", dump.Pretty(event.Object))) // Retry return false, statusDelay diff --git a/tools/vendor/k8s.io/client-go/transport/cache.go b/tools/vendor/k8s.io/client-go/transport/cache.go index edcc6d1d4..7c7f1b330 100644 --- a/tools/vendor/k8s.io/client-go/transport/cache.go +++ b/tools/vendor/k8s.io/client-go/transport/cache.go @@ -27,6 +27,7 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/tools/metrics" ) // TlsTransportCache caches TLS http.RoundTrippers different configurations. The @@ -80,11 +81,16 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { // Ensure we only create a single transport for the given TLS options c.mu.Lock() defer c.mu.Unlock() + defer metrics.TransportCacheEntries.Observe(len(c.transports)) // See if we already have a custom transport for this config if t, ok := c.transports[key]; ok { + metrics.TransportCreateCalls.Increment("hit") return t, nil } + metrics.TransportCreateCalls.Increment("miss") + } else { + metrics.TransportCreateCalls.Increment("uncacheable") } // Get the TLS options for this client config diff --git a/tools/vendor/k8s.io/client-go/util/cert/cert.go b/tools/vendor/k8s.io/client-go/util/cert/cert.go index 4be1dfe49..91e171271 100644 --- a/tools/vendor/k8s.io/client-go/util/cert/cert.go +++ b/tools/vendor/k8s.io/client-go/util/cert/cert.go @@ -25,6 +25,7 @@ import ( "crypto/x509/pkix" "encoding/pem" "fmt" + "math" "math/big" "net" "os" @@ -44,6 +45,7 @@ type Config struct { Organization []string AltNames AltNames Usages []x509.ExtKeyUsage + NotBefore time.Time } // AltNames contains the domain names and IP addresses that will be added @@ -57,14 +59,24 @@ type AltNames struct { // NewSelfSignedCACert creates a CA certificate func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) { now := time.Now() + // returns a uniform random value in [0, max-1), then add 1 to serial to make it a uniform random value in [1, max). + serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64-1)) + if err != nil { + return nil, err + } + serial = new(big.Int).Add(serial, big.NewInt(1)) + notBefore := now.UTC() + if !cfg.NotBefore.IsZero() { + notBefore = cfg.NotBefore.UTC() + } tmpl := x509.Certificate{ - SerialNumber: new(big.Int).SetInt64(0), + SerialNumber: serial, Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: cfg.Organization, }, DNSNames: []string{cfg.CommonName}, - NotBefore: now.UTC(), + NotBefore: notBefore, NotAfter: now.Add(duration365d * 10).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, @@ -116,9 +128,14 @@ func GenerateSelfSignedCertKeyWithFixtures(host string, alternateIPs []net.IP, a if err != nil { return nil, nil, err } - + // returns a uniform random value in [0, max-1), then add 1 to serial to make it a uniform random value in [1, max). + serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64-1)) + if err != nil { + return nil, nil, err + } + serial = new(big.Int).Add(serial, big.NewInt(1)) caTemplate := x509.Certificate{ - SerialNumber: big.NewInt(1), + SerialNumber: serial, Subject: pkix.Name{ CommonName: fmt.Sprintf("%s-ca@%d", host, time.Now().Unix()), }, @@ -144,9 +161,14 @@ func GenerateSelfSignedCertKeyWithFixtures(host string, alternateIPs []net.IP, a if err != nil { return nil, nil, err } - + // returns a uniform random value in [0, max-1), then add 1 to serial to make it a uniform random value in [1, max). + serial, err = cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64-1)) + if err != nil { + return nil, nil, err + } + serial = new(big.Int).Add(serial, big.NewInt(1)) template := x509.Certificate{ - SerialNumber: big.NewInt(2), + SerialNumber: serial, Subject: pkix.Name{ CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()), }, diff --git a/tools/vendor/k8s.io/component-base/metrics/http.go b/tools/vendor/k8s.io/component-base/metrics/http.go index 3394a8f71..2a0d249c2 100644 --- a/tools/vendor/k8s.io/component-base/metrics/http.go +++ b/tools/vendor/k8s.io/component-base/metrics/http.go @@ -19,19 +19,28 @@ package metrics import ( "io" "net/http" + "time" "github.com/prometheus/client_golang/prometheus/promhttp" ) +var ( + processStartedAt time.Time +) + +func init() { + processStartedAt = time.Now() +} + // These constants cause handlers serving metrics to behave as described if // errors are encountered. const ( - // Serve an HTTP status code 500 upon the first error + // HTTPErrorOnError serve an HTTP status code 500 upon the first error // encountered. Report the error message in the body. HTTPErrorOnError promhttp.HandlerErrorHandling = iota - // Ignore errors and try to serve as many metrics as possible. However, - // if no metrics can be served, serve an HTTP status code 500 and the + // ContinueOnError ignore errors and try to serve as many metrics as possible. + // However, if no metrics can be served, serve an HTTP status code 500 and the // last error message in the body. Only use this in deliberate "best // effort" metrics collection scenarios. In this case, it is highly // recommended to provide other means of detecting errors: By setting an @@ -41,7 +50,7 @@ const ( // alerts. ContinueOnError - // Panic upon the first error encountered (useful for "crash only" apps). + // PanicOnError panics upon the first error encountered (useful for "crash only" apps). PanicOnError ) @@ -50,6 +59,7 @@ const ( type HandlerOpts promhttp.HandlerOpts func (ho *HandlerOpts) toPromhttpHandlerOpts() promhttp.HandlerOpts { + ho.ProcessStartTime = processStartedAt return promhttp.HandlerOpts(*ho) } diff --git a/tools/vendor/k8s.io/component-base/metrics/legacyregistry/registry.go b/tools/vendor/k8s.io/component-base/metrics/legacyregistry/registry.go index 79c806d8b..64a430b79 100644 --- a/tools/vendor/k8s.io/component-base/metrics/legacyregistry/registry.go +++ b/tools/vendor/k8s.io/component-base/metrics/legacyregistry/registry.go @@ -18,6 +18,7 @@ package legacyregistry import ( "net/http" + "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" @@ -45,19 +46,22 @@ var ( // Registerer exposes the global registerer Registerer = defaultRegistry.Registerer + + processStart time.Time ) func init() { RawMustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) RawMustRegister(collectors.NewGoCollector(collectors.WithGoCollectorRuntimeMetrics(collectors.MetricsAll))) defaultRegistry.RegisterMetaMetrics() + processStart = time.Now() } // Handler returns an HTTP handler for the DefaultGatherer. It is // already instrumented with InstrumentHandler (using "prometheus" as handler // name). func Handler() http.Handler { - return promhttp.InstrumentMetricHandler(prometheus.DefaultRegisterer, promhttp.HandlerFor(defaultRegistry, promhttp.HandlerOpts{})) + return promhttp.InstrumentMetricHandler(prometheus.DefaultRegisterer, promhttp.HandlerFor(defaultRegistry, promhttp.HandlerOpts{ProcessStartTime: processStart})) } // HandlerWithReset returns an HTTP handler for the DefaultGatherer but invokes @@ -65,7 +69,7 @@ func Handler() http.Handler { func HandlerWithReset() http.Handler { return promhttp.InstrumentMetricHandler( prometheus.DefaultRegisterer, - metrics.HandlerWithReset(defaultRegistry, metrics.HandlerOpts{})) + metrics.HandlerWithReset(defaultRegistry, metrics.HandlerOpts{ProcessStartTime: processStart})) } // CustomRegister registers a custom collector but uses the global registry. diff --git a/tools/vendor/k8s.io/component-base/metrics/prometheus/feature/metrics.go b/tools/vendor/k8s.io/component-base/metrics/prometheus/feature/metrics.go index d19357fde..416e5eda2 100644 --- a/tools/vendor/k8s.io/component-base/metrics/prometheus/feature/metrics.go +++ b/tools/vendor/k8s.io/component-base/metrics/prometheus/feature/metrics.go @@ -30,7 +30,7 @@ var ( Namespace: "kubernetes", Name: "feature_enabled", Help: "This metric records the data about the stage and enablement of a k8s feature.", - StabilityLevel: k8smetrics.ALPHA, + StabilityLevel: k8smetrics.BETA, }, []string{"name", "stage"}, ) diff --git a/tools/vendor/k8s.io/component-base/metrics/registry.go b/tools/vendor/k8s.io/component-base/metrics/registry.go index 9a7138c11..1942f9958 100644 --- a/tools/vendor/k8s.io/component-base/metrics/registry.go +++ b/tools/vendor/k8s.io/component-base/metrics/registry.go @@ -39,26 +39,26 @@ var ( registeredMetrics = NewCounterVec( &CounterOpts{ - Name: "registered_metric_total", + Name: "registered_metrics_total", Help: "The count of registered metrics broken by stability level and deprecation version.", - StabilityLevel: ALPHA, + StabilityLevel: BETA, }, []string{"stability_level", "deprecated_version"}, ) disabledMetricsTotal = NewCounter( &CounterOpts{ - Name: "disabled_metric_total", + Name: "disabled_metrics_total", Help: "The count of disabled metrics.", - StabilityLevel: ALPHA, + StabilityLevel: BETA, }, ) hiddenMetricsTotal = NewCounter( &CounterOpts{ - Name: "hidden_metric_total", + Name: "hidden_metrics_total", Help: "The count of hidden metrics.", - StabilityLevel: ALPHA, + StabilityLevel: BETA, }, ) ) diff --git a/tools/vendor/k8s.io/component-base/version/dynamic.go b/tools/vendor/k8s.io/component-base/version/dynamic.go new file mode 100644 index 000000000..46ade9f5e --- /dev/null +++ b/tools/vendor/k8s.io/component-base/version/dynamic.go @@ -0,0 +1,77 @@ +/* +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 version + +import ( + "fmt" + "sync/atomic" + + utilversion "k8s.io/apimachinery/pkg/util/version" +) + +var dynamicGitVersion atomic.Value + +func init() { + // initialize to static gitVersion + dynamicGitVersion.Store(gitVersion) +} + +// SetDynamicVersion overrides the version returned as the GitVersion from Get(). +// The specified version must be non-empty, a valid semantic version, and must +// match the major/minor/patch version of the default gitVersion. +func SetDynamicVersion(dynamicVersion string) error { + if err := ValidateDynamicVersion(dynamicVersion); err != nil { + return err + } + dynamicGitVersion.Store(dynamicVersion) + return nil +} + +// ValidateDynamicVersion ensures the given version is non-empty, a valid semantic version, +// and matched the major/minor/patch version of the default gitVersion. +func ValidateDynamicVersion(dynamicVersion string) error { + return validateDynamicVersion(dynamicVersion, gitVersion) +} + +func validateDynamicVersion(dynamicVersion, defaultVersion string) error { + if len(dynamicVersion) == 0 { + return fmt.Errorf("version must not be empty") + } + if dynamicVersion == defaultVersion { + // allow no-op + return nil + } + vRuntime, err := utilversion.ParseSemantic(dynamicVersion) + if err != nil { + return err + } + // must match major/minor/patch of default version + var vDefault *utilversion.Version + if defaultVersion == "v0.0.0-master+$Format:%H$" { + // special-case the placeholder value which doesn't parse as a semantic version + vDefault, err = utilversion.ParseSemantic("v0.0.0-master") + } else { + vDefault, err = utilversion.ParseSemantic(defaultVersion) + } + if err != nil { + return err + } + if vRuntime.Major() != vDefault.Major() || vRuntime.Minor() != vDefault.Minor() || vRuntime.Patch() != vDefault.Patch() { + return fmt.Errorf("version %q must match major/minor/patch of default version %q", dynamicVersion, defaultVersion) + } + return nil +} diff --git a/tools/vendor/k8s.io/component-base/version/version.go b/tools/vendor/k8s.io/component-base/version/version.go index d1e76dc00..1d268d4c6 100644 --- a/tools/vendor/k8s.io/component-base/version/version.go +++ b/tools/vendor/k8s.io/component-base/version/version.go @@ -31,7 +31,7 @@ func Get() apimachineryversion.Info { return apimachineryversion.Info{ Major: gitMajor, Minor: gitMinor, - GitVersion: gitVersion, + GitVersion: dynamicGitVersion.Load().(string), GitCommit: gitCommit, GitTreeState: gitTreeState, BuildDate: buildDate, diff --git a/tools/vendor/k8s.io/klog/v2/format.go b/tools/vendor/k8s.io/klog/v2/format.go new file mode 100644 index 000000000..63995ca6d --- /dev/null +++ b/tools/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/tools/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go b/tools/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go index 1dc81a15f..bcdf5f8ee 100644 --- a/tools/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go +++ b/tools/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go @@ -18,6 +18,7 @@ package serialize import ( "bytes" + "encoding/json" "fmt" "strconv" @@ -196,11 +197,11 @@ func (f Formatter) 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 @@ -215,9 +216,9 @@ func (f Formatter) 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, f.AnyToString(value)) + f.formatAny(b, value) } case []byte: // In https://github.com/kubernetes/klog/pull/237 it was decided @@ -234,7 +235,7 @@ func (f Formatter) KVFormat(b *bytes.Buffer, k, v interface{}) { b.WriteByte('=') b.WriteString(fmt.Sprintf("%+q", v)) default: - writeStringValue(b, false, f.AnyToString(v)) + f.formatAny(b, v) } } @@ -242,12 +243,25 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) { Formatter{}.KVFormat(b, k, v) } -// AnyToString is the historic fallback formatter. -func (f Formatter) AnyToString(v interface{}) string { +// 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 { - return f.AnyToStringHook(v) + 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(`""`, err)) + return } - return fmt.Sprintf("%+v", v) + // Remove trailing newline. + b.Truncate(b.Len() - 1) } // StringerToString converts a Stringer to a string, @@ -287,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, `""`, err) @@ -296,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/tools/vendor/k8s.io/klog/v2/k8s_references.go b/tools/vendor/k8s.io/klog/v2/k8s_references.go index ecd3f8b69..786af74bf 100644 --- a/tools/vendor/k8s.io/klog/v2/k8s_references.go +++ b/tools/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("") +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, "", item) + fmt.Fprintf(out, `""`, item) return } } diff --git a/tools/vendor/k8s.io/klog/v2/klog.go b/tools/vendor/k8s.io/klog/v2/klog.go index 466eeaf26..152f8a6bd 100644 --- a/tools/vendor/k8s.io/klog/v2/klog.go +++ b/tools/vendor/k8s.io/klog/v2/klog.go @@ -1228,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 diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/cached/cache.go b/tools/vendor/k8s.io/kube-openapi/pkg/cached/cache.go index 16e34853a..76415b783 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/cached/cache.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/cached/cache.go @@ -19,6 +19,8 @@ limitations under the License. // operations are not repeated unnecessarily. The operations can be // created as a tree, and replaced dynamically as needed. // +// All the operations in this module are thread-safe. +// // # Dependencies and types of caches // // This package uses a source/transform/sink model of caches to build @@ -34,12 +36,6 @@ limitations under the License. // 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 @@ -54,6 +50,7 @@ package cached import ( "fmt" + "sync" "sync/atomic" ) @@ -100,14 +97,6 @@ type Data[T any] interface { 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. @@ -125,27 +114,89 @@ type merger[K comparable, T, V any] struct { // 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. +// +// Also note that Golang map iteration is not stable. If the mergeFn +// depends on the order iteration to be stable, it will need to +// implement its own sorting or iteration order. 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]{ + listCaches := make([]Data[T], 0, len(caches)) + // maps from index to key + indexes := make(map[int]K, len(caches)) + i := 0 + for k := range caches { + listCaches = append(listCaches, caches[k]) + indexes[i] = k + i++ + } + + return NewListMerger(func(results []Result[T]) Result[V] { + if len(results) != len(indexes) { + panic(fmt.Errorf("invalid result length %d, expected %d", len(results), len(indexes))) + } + m := make(map[K]Result[T], len(results)) + for i := range results { + m[indexes[i]] = results[i] + } + return mergeFn(m) + }, listCaches) +} + +type listMerger[T, V any] struct { + lock sync.Mutex + mergeFn func([]Result[T]) Result[V] + caches []Data[T] + cacheResults []Result[T] + result Result[V] +} + +// NewListMerger creates a new merge cache that merges the results of +// other caches in list form. The function only gets called if any of +// the dependency has changed. +// +// The benefit of ListMerger over the basic Merger is that caches are +// stored in an ordered list so the order of the cache will be +// preserved in the order of the results passed to the mergeFn. +// +// 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. +// +// 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 NewListMerger[T, V any](mergeFn func(results []Result[T]) Result[V], caches []Data[T]) Data[V] { + return &listMerger[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() +func (c *listMerger[T, V]) prepareResultsLocked() []Result[T] { + cacheResults := make([]Result[T], len(c.caches)) + ch := make(chan struct { + int + Result[T] + }, len(c.caches)) + for i := range c.caches { + go func(index int) { + ch <- struct { + int + Result[T] + }{ + index, + c.caches[index].Get(), + } + }(i) + } + for i := 0; i < len(c.caches); i++ { + res := <-ch + cacheResults[res.int] = res.Result } 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 { +func (c *listMerger[T, V]) needsRunningLocked(results []Result[T]) bool { if c.cacheResults == nil { return true } @@ -155,12 +206,8 @@ func (c *merger[K, T, V]) needsRunning(results map[K]Result[T]) bool { 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)) - } - + for i, oldResult := range c.cacheResults { + newResult := results[i] if newResult.Etag != oldResult.Etag || newResult.Err != nil || oldResult.Err != nil { return true } @@ -168,17 +215,17 @@ func (c *merger[K, T, V]) needsRunning(results map[K]Result[T]) bool { return false } -func (c *merger[K, T, V]) Get() Result[V] { - cacheResults := c.prepareResults() - if c.needsRunning(cacheResults) { +func (c *listMerger[T, V]) Get() Result[V] { + c.lock.Lock() + defer c.lock.Unlock() + cacheResults := c.prepareResultsLocked() + if c.needsRunningLocked(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 @@ -188,20 +235,17 @@ type transformerCacheKeyType struct{} // 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 { + return NewListMerger(func(caches []Result[T]) Result[V] { + if len(caches) != 1 { panic(fmt.Errorf("invalid cache for transformer cache: %v", caches)) } - return transformerFn(cache) - }, map[transformerCacheKeyType]Data[T]{ - {}: source, - }) + return transformerFn(caches[0]) + }, []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. +// if it needs to be updated or not. sourceFn MUST be thread-safe. func NewSource[T any](sourceFn func() Result[T]) Data[T] { c := source[T](sourceFn) return &c @@ -222,25 +266,24 @@ func NewStaticSource[T any](staticFn func() Result[T]) Data[T] { } type static[T any] struct { + once sync.Once fn func() Result[T] - result *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 + c.once.Do(func() { + c.result = c.fn() + }) + 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 +// Replaceable is a cache that carries the result even when the cache is +// replaced. This is the type that should typically be stored in // structs. type Replaceable[T any] struct { cache atomic.Pointer[Data[T]] - result *Result[T] + result atomic.Pointer[Result[T]] } // Get retrieves the data from the underlying source. [Replaceable] @@ -251,14 +294,19 @@ type Replaceable[T any] struct { // 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 + + for { + cResult := c.result.Load() + if result.Err != nil && cResult != nil && cResult.Err == nil { + return *cResult + } + if c.result.CompareAndSwap(cResult, &result) { + return result + } } - c.result = &result - return *c.result } -// Replace changes the cache in a thread-safe way. +// Replace changes the cache. func (c *Replaceable[T]) Replace(cache Data[T]) { c.cache.Swap(&cache) } diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go b/tools/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go index 66b7a68da..2263e2f32 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/handler3/handler.go @@ -30,7 +30,7 @@ import ( "time" "github.com/golang/protobuf/proto" - openapi_v3 "github.com/google/gnostic/openapiv3" + openapi_v3 "github.com/google/gnostic-models/openapiv3" "github.com/google/uuid" "github.com/munnerz/goautoneg" "k8s.io/klog/v2" diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document.go b/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document.go index 763923dff..5789e67ab 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document.go @@ -21,7 +21,7 @@ import ( "sort" "strings" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" "gopkg.in/yaml.v2" ) diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go b/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go index 519dcf2eb..d9f2896e3 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go @@ -21,7 +21,7 @@ import ( "reflect" "strings" - openapi_v3 "github.com/google/gnostic/openapiv3" + openapi_v3 "github.com/google/gnostic-models/openapiv3" "gopkg.in/yaml.v3" ) diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go index 406a09d9d..6a77f2ac8 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go @@ -21,7 +21,7 @@ import ( "strconv" "github.com/go-openapi/jsonreference" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" ) // Interfaces diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/strfmt/format.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/strfmt/format.go index 75c50053b..c85067a26 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/strfmt/format.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/strfmt/format.go @@ -16,13 +16,10 @@ package strfmt import ( "encoding" - "fmt" "reflect" "strings" "sync" - "time" - "github.com/mitchellh/mapstructure" "k8s.io/kube-openapi/pkg/validation/errors" ) @@ -50,7 +47,6 @@ type Registry interface { ContainsName(string) bool Validates(string, string) bool Parse(string, string) (interface{}, error) - MapStructureHookFunc() mapstructure.DecodeHookFunc } type knownFormat struct { @@ -92,83 +88,6 @@ func NewSeededFormats(seeds []knownFormat, normalizer NameNormalizer) Registry { } } -// MapStructureHookFunc is a decode hook function for mapstructure -func (f *defaultFormats) MapStructureHookFunc() mapstructure.DecodeHookFunc { - return func(from reflect.Type, to reflect.Type, data interface{}) (interface{}, error) { - if from.Kind() != reflect.String { - return data, nil - } - for _, v := range f.data { - tpe, _ := f.GetType(v.Name) - if to == tpe { - switch v.Name { - case "date": - d, err := time.Parse(RFC3339FullDate, data.(string)) - if err != nil { - return nil, err - } - return Date(d), nil - case "datetime": - input := data.(string) - if len(input) == 0 { - return nil, fmt.Errorf("empty string is an invalid datetime format") - } - return ParseDateTime(input) - case "duration": - dur, err := ParseDuration(data.(string)) - if err != nil { - return nil, err - } - return Duration(dur), nil - case "uri": - return URI(data.(string)), nil - case "email": - return Email(data.(string)), nil - case "uuid": - return UUID(data.(string)), nil - case "uuid3": - return UUID3(data.(string)), nil - case "uuid4": - return UUID4(data.(string)), nil - case "uuid5": - return UUID5(data.(string)), nil - case "hostname": - return Hostname(data.(string)), nil - case "ipv4": - return IPv4(data.(string)), nil - case "ipv6": - return IPv6(data.(string)), nil - case "cidr": - return CIDR(data.(string)), nil - case "mac": - return MAC(data.(string)), nil - case "isbn": - return ISBN(data.(string)), nil - case "isbn10": - return ISBN10(data.(string)), nil - case "isbn13": - return ISBN13(data.(string)), nil - case "creditcard": - return CreditCard(data.(string)), nil - case "ssn": - return SSN(data.(string)), nil - case "hexcolor": - return HexColor(data.(string)), nil - case "rgbcolor": - return RGBColor(data.(string)), nil - case "byte": - return Base64(data.(string)), nil - case "password": - return Password(data.(string)), nil - default: - return nil, errors.InvalidTypeName(v.Name) - } - } - } - return data, nil - } -} - // Add adds a new format, return true if this was a new item instead of a replacement func (f *defaultFormats) Add(name string, strfmt Format, validator Validator) bool { f.Lock() diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/object_validator.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/object_validator.go index f0417beb0..632700b51 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/object_validator.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/object_validator.go @@ -55,15 +55,15 @@ func (o *objectValidator) Validate(data interface{}) *Result { // TODO: guard against nil data numKeys := int64(len(val)) + res := new(Result) + if o.MinProperties != nil && numKeys < *o.MinProperties { - return errorHelp.sErr(errors.TooFewProperties(o.Path, o.In, *o.MinProperties, numKeys)) + res.AddErrors(errors.TooFewProperties(o.Path, o.In, *o.MinProperties, numKeys)) } if o.MaxProperties != nil && numKeys > *o.MaxProperties { - return errorHelp.sErr(errors.TooManyProperties(o.Path, o.In, *o.MaxProperties, numKeys)) + res.AddErrors(errors.TooManyProperties(o.Path, o.In, *o.MaxProperties, numKeys)) } - res := new(Result) - // check validity of field names if o.AdditionalProperties != nil && !o.AdditionalProperties.Allows { // Case: additionalProperties: false @@ -99,7 +99,7 @@ func (o *objectValidator) Validate(data interface{}) *Result { // Cases: properties which are not regular properties and have not been matched by the PatternProperties validator if o.AdditionalProperties != nil && o.AdditionalProperties.Schema != nil { // AdditionalProperties as Schema - res.Merge(NewSchemaValidator(o.AdditionalProperties.Schema, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...).Validate(value)) + res.Merge(o.Options.NewValidatorForField(key, o.AdditionalProperties.Schema, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...).Validate(value)) } else if regularProperty && !(matched || succeededOnce) { // TODO: this is dead code since regularProperty=false here res.AddErrors(errors.FailedAllPatternProperties(o.Path, o.In, key)) @@ -121,7 +121,7 @@ func (o *objectValidator) Validate(data interface{}) *Result { // Recursively validates each property against its schema if v, ok := val[pName]; ok { - r := NewSchemaValidator(&pSchema, o.Root, rName, o.KnownFormats, o.Options.Options()...).Validate(v) + r := o.Options.NewValidatorForField(pName, &pSchema, o.Root, rName, o.KnownFormats, o.Options.Options()...).Validate(v) res.Merge(r) } } @@ -144,7 +144,7 @@ func (o *objectValidator) Validate(data interface{}) *Result { if !regularProperty && (matched /*|| succeededOnce*/) { for _, pName := range patterns { if v, ok := o.PatternProperties[pName]; ok { - res.Merge(NewSchemaValidator(&v, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...).Validate(value)) + res.Merge(o.Options.NewValidatorForField(key, &v, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...).Validate(value)) } } } @@ -163,7 +163,7 @@ func (o *objectValidator) validatePatternProperty(key string, value interface{}, if match, _ := regexp.MatchString(k, key); match { patterns = append(patterns, k) matched = true - validator := NewSchemaValidator(&sch, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...) + validator := o.Options.NewValidatorForField(key, &sch, o.Root, o.Path+"."+key, o.KnownFormats, o.Options.Options()...) res := validator.Validate(value) result.Merge(res) diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema.go index 778c01948..511eee1d0 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema.go @@ -35,7 +35,7 @@ type SchemaValidator struct { Path string in string Schema *spec.Schema - validators []valueValidator + validators []ValueValidator Root interface{} KnownFormats strfmt.Registry Options SchemaValidatorOptions @@ -78,7 +78,15 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string for _, o := range options { o(&s.Options) } - s.validators = []valueValidator{ + + if s.Options.NewValidatorForIndex == nil { + s.Options.NewValidatorForIndex = s.NewValidatorForIndex + } + if s.Options.NewValidatorForField == nil { + s.Options.NewValidatorForField = s.NewValidatorForField + } + + s.validators = []ValueValidator{ s.typeValidator(), s.schemaPropsValidator(), s.stringValidator(), @@ -91,6 +99,14 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string return &s } +func (s *SchemaValidator) NewValidatorForField(field string, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...Option) ValueValidator { + return NewSchemaValidator(schema, rootSchema, root, formats, opts...) +} + +func (s *SchemaValidator) NewValidatorForIndex(index int, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...Option) ValueValidator { + return NewSchemaValidator(schema, rootSchema, root, formats, opts...) +} + // SetPath sets the path for this schema validator func (s *SchemaValidator) SetPath(path string) { s.Path = path @@ -174,11 +190,11 @@ func (s *SchemaValidator) Validate(data interface{}) *Result { return result } -func (s *SchemaValidator) typeValidator() valueValidator { +func (s *SchemaValidator) typeValidator() ValueValidator { return &typeValidator{Type: s.Schema.Type, Nullable: s.Schema.Nullable, Format: s.Schema.Format, In: s.in, Path: s.Path} } -func (s *SchemaValidator) commonValidator() valueValidator { +func (s *SchemaValidator) commonValidator() ValueValidator { return &basicCommonValidator{ Path: s.Path, In: s.in, @@ -186,7 +202,7 @@ func (s *SchemaValidator) commonValidator() valueValidator { } } -func (s *SchemaValidator) sliceValidator() valueValidator { +func (s *SchemaValidator) sliceValidator() ValueValidator { return &schemaSliceValidator{ Path: s.Path, In: s.in, @@ -201,7 +217,7 @@ func (s *SchemaValidator) sliceValidator() valueValidator { } } -func (s *SchemaValidator) numberValidator() valueValidator { +func (s *SchemaValidator) numberValidator() ValueValidator { return &numberValidator{ Path: s.Path, In: s.in, @@ -214,7 +230,7 @@ func (s *SchemaValidator) numberValidator() valueValidator { } } -func (s *SchemaValidator) stringValidator() valueValidator { +func (s *SchemaValidator) stringValidator() ValueValidator { return &stringValidator{ Path: s.Path, In: s.in, @@ -224,7 +240,7 @@ func (s *SchemaValidator) stringValidator() valueValidator { } } -func (s *SchemaValidator) formatValidator() valueValidator { +func (s *SchemaValidator) formatValidator() ValueValidator { return &formatValidator{ Path: s.Path, In: s.in, @@ -233,12 +249,12 @@ func (s *SchemaValidator) formatValidator() valueValidator { } } -func (s *SchemaValidator) schemaPropsValidator() valueValidator { +func (s *SchemaValidator) schemaPropsValidator() ValueValidator { sch := s.Schema return newSchemaPropsValidator(s.Path, s.in, sch.AllOf, sch.OneOf, sch.AnyOf, sch.Not, sch.Dependencies, s.Root, s.KnownFormats, s.Options.Options()...) } -func (s *SchemaValidator) objectValidator() valueValidator { +func (s *SchemaValidator) objectValidator() ValueValidator { return &objectValidator{ Path: s.Path, In: s.in, diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema_option.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema_option.go index 34991102b..f3637bcfd 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema_option.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/schema_option.go @@ -14,9 +14,16 @@ package validate +import ( + "k8s.io/kube-openapi/pkg/validation/spec" + "k8s.io/kube-openapi/pkg/validation/strfmt" +) + // SchemaValidatorOptions defines optional rules for schema validation type SchemaValidatorOptions struct { validationRulesEnabled bool + NewValidatorForIndex func(index int, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...Option) ValueValidator + NewValidatorForField func(field string, schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts ...Option) ValueValidator } // Option sets optional rules for schema validation diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/slice_validator.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/slice_validator.go index 3d1fc7218..38083f7ca 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/slice_validator.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/slice_validator.go @@ -54,9 +54,8 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { size := val.Len() if s.Items != nil && s.Items.Schema != nil { - validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats, s.Options.Options()...) for i := 0; i < size; i++ { - validator.SetPath(fmt.Sprintf("%s[%d]", s.Path, i)) + validator := s.Options.NewValidatorForIndex(i, s.Items.Schema, s.Root, fmt.Sprintf("%s[%d]", s.Path, i), s.KnownFormats, s.Options.Options()...) value := val.Index(i) result.Merge(validator.Validate(value.Interface())) } @@ -66,7 +65,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { if s.Items != nil && len(s.Items.Schemas) > 0 { itemsSize = len(s.Items.Schemas) for i := 0; i < itemsSize; i++ { - validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s[%d]", s.Path, i), s.KnownFormats, s.Options.Options()...) + validator := s.Options.NewValidatorForIndex(i, &s.Items.Schemas[i], s.Root, fmt.Sprintf("%s[%d]", s.Path, i), s.KnownFormats, s.Options.Options()...) if val.Len() <= i { break } @@ -79,7 +78,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { } if s.AdditionalItems.Schema != nil { for i := itemsSize; i < size-itemsSize+1; i++ { - validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s[%d]", s.Path, i), s.KnownFormats, s.Options.Options()...) + validator := s.Options.NewValidatorForIndex(i, s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s[%d]", s.Path, i), s.KnownFormats, s.Options.Options()...) result.Merge(validator.Validate(val.Index(i).Interface())) } } diff --git a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/validator.go b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/validator.go index 38a6b31c3..abfc30f6b 100644 --- a/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/validator.go +++ b/tools/vendor/k8s.io/kube-openapi/pkg/validation/validate/validator.go @@ -21,8 +21,8 @@ import ( "k8s.io/kube-openapi/pkg/validation/spec" ) -// valueValidator validates the values it applies to. -type valueValidator interface { +// ValueValidator validates the values it applies to. +type ValueValidator interface { // SetPath sets the exact path of the validator prior to calling Validate. // The exact path contains the map keys and array indices to locate the // value to be validated from the root data element. diff --git a/tools/vendor/k8s.io/utils/set/OWNERS b/tools/vendor/k8s.io/utils/set/OWNERS new file mode 100644 index 000000000..9d2d33e7b --- /dev/null +++ b/tools/vendor/k8s.io/utils/set/OWNERS @@ -0,0 +1,8 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +reviewers: + - logicalhan + - thockin +approvers: + - logicalhan + - thockin diff --git a/tools/vendor/k8s.io/utils/set/ordered.go b/tools/vendor/k8s.io/utils/set/ordered.go new file mode 100644 index 000000000..2b2c11fc7 --- /dev/null +++ b/tools/vendor/k8s.io/utils/set/ordered.go @@ -0,0 +1,53 @@ +/* +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 set + +// ordered is a constraint that permits any ordered type: any type +// that supports the operators < <= >= >. +// If future releases of Go add new ordered types, +// this constraint will be modified to include them. +type ordered interface { + integer | float | ~string +} + +// integer is a constraint that permits any integer type. +// If future releases of Go add new predeclared integer types, +// this constraint will be modified to include them. +type integer interface { + signed | unsigned +} + +// float is a constraint that permits any floating-point type. +// If future releases of Go add new predeclared floating-point types, +// this constraint will be modified to include them. +type float interface { + ~float32 | ~float64 +} + +// signed is a constraint that permits any signed integer type. +// If future releases of Go add new predeclared signed integer types, +// this constraint will be modified to include them. +type signed interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 +} + +// unsigned is a constraint that permits any unsigned integer type. +// If future releases of Go add new predeclared unsigned integer types, +// this constraint will be modified to include them. +type unsigned interface { + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr +} diff --git a/tools/vendor/k8s.io/utils/set/set.go b/tools/vendor/k8s.io/utils/set/set.go new file mode 100644 index 000000000..563bb43c2 --- /dev/null +++ b/tools/vendor/k8s.io/utils/set/set.go @@ -0,0 +1,229 @@ +/* +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 set + +import ( + "sort" +) + +// Empty is public since it is used by some internal API objects for conversions between external +// string arrays and internal sets, and conversion logic requires public types today. +type Empty struct{} + +// Set is a set of the same type elements, implemented via map[ordered]struct{} for minimal memory consumption. +type Set[E ordered] map[E]Empty + +// New creates a new set. +func New[E ordered](items ...E) Set[E] { + ss := Set[E]{} + ss.Insert(items...) + return ss +} + +// KeySet creates a Set[E] from a keys of a map[E](? extends interface{}). +func KeySet[E ordered, A any](theMap map[E]A) Set[E] { + ret := Set[E]{} + for key := range theMap { + ret.Insert(key) + } + return ret +} + +// Insert adds items to the set. +func (s Set[E]) Insert(items ...E) Set[E] { + for _, item := range items { + s[item] = Empty{} + } + return s +} + +// Delete removes all items from the set. +func (s Set[E]) Delete(items ...E) Set[E] { + for _, item := range items { + delete(s, item) + } + return s +} + +// Has returns true if and only if item is contained in the set. +func (s Set[E]) Has(item E) bool { + _, contained := s[item] + return contained +} + +// HasAll returns true if and only if all items are contained in the set. +func (s Set[E]) HasAll(items ...E) bool { + for _, item := range items { + if !s.Has(item) { + return false + } + } + return true +} + +// HasAny returns true if any items are contained in the set. +func (s Set[E]) HasAny(items ...E) bool { + for _, item := range items { + if s.Has(item) { + return true + } + } + return false +} + +// Union returns a new set which includes items in either s1 or s2. +// For example: +// s1 = {a1, a2} +// s2 = {a3, a4} +// s1.Union(s2) = {a1, a2, a3, a4} +// s2.Union(s1) = {a1, a2, a3, a4} +func (s Set[E]) Union(s2 Set[E]) Set[E] { + result := Set[E]{} + result.Insert(s.UnsortedList()...) + result.Insert(s2.UnsortedList()...) + return result +} + +// Len returns the number of elements in the set. +func (s Set[E]) Len() int { + return len(s) +} + +// Intersection returns a new set which includes the item in BOTH s1 and s2 +// For example: +// s1 = {a1, a2} +// s2 = {a2, a3} +// s1.Intersection(s2) = {a2} +func (s Set[E]) Intersection(s2 Set[E]) Set[E] { + var walk, other Set[E] + result := Set[E]{} + if s.Len() < s2.Len() { + walk = s + other = s2 + } else { + walk = s2 + other = s + } + for key := range walk { + if other.Has(key) { + result.Insert(key) + } + } + return result +} + +// IsSuperset returns true if and only if s1 is a superset of s2. +func (s Set[E]) IsSuperset(s2 Set[E]) bool { + for item := range s2 { + if !s.Has(item) { + return false + } + } + return true +} + +// Difference returns a set of objects that are not in s2 +// For example: +// s1 = {a1, a2, a3} +// s2 = {a1, a2, a4, a5} +// s1.Difference(s2) = {a3} +// s2.Difference(s1) = {a4, a5} +func (s Set[E]) Difference(s2 Set[E]) Set[E] { + result := Set[E]{} + for key := range s { + if !s2.Has(key) { + result.Insert(key) + } + } + return result +} + +// Equal returns true if and only if s1 is equal (as a set) to s2. +// Two sets are equal if their membership is identical. +func (s Set[E]) Equal(s2 Set[E]) bool { + return s.Len() == s2.Len() && s.IsSuperset(s2) +} + +type sortableSlice[E ordered] []E + +func (s sortableSlice[E]) Len() int { + return len(s) +} +func (s sortableSlice[E]) Less(i, j int) bool { return s[i] < s[j] } +func (s sortableSlice[E]) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// SortedList returns the contents as a sorted slice. +func (s Set[E]) SortedList() []E { + res := make(sortableSlice[E], 0, s.Len()) + for key := range s { + res = append(res, key) + } + sort.Sort(res) + return res +} + +// UnsortedList returns the slice with contents in random order. +func (s Set[E]) UnsortedList() []E { + res := make([]E, 0, len(s)) + for key := range s { + res = append(res, key) + } + return res +} + +// PopAny returns a single element from the set. +func (s Set[E]) PopAny() (E, bool) { + for key := range s { + s.Delete(key) + return key, true + } + var zeroValue E + return zeroValue, false +} + +// Clone returns a new set which is a copy of the current set. +func (s Set[T]) Clone() Set[T] { + result := make(Set[T], len(s)) + for key := range s { + result.Insert(key) + } + return result +} + +// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection. +// For example: +// s1 = {a1, a2, a3} +// s2 = {a1, a2, a4, a5} +// s1.SymmetricDifference(s2) = {a3, a4, a5} +// s2.SymmetricDifference(s1) = {a3, a4, a5} +func (s Set[T]) SymmetricDifference(s2 Set[T]) Set[T] { + return s.Difference(s2).Union(s2.Difference(s)) +} + +// Clear empties the set. +// It is preferable to replace the set with a newly constructed set, +// but not all callers can do that (when there are other references to the map). +// In some cases the set *won't* be fully cleared, e.g. a Set[float32] containing NaN +// can't be cleared because NaN can't be removed. +// For sets containing items of a type that is reflexive for ==, +// this is optimized to a single call to runtime.mapclear(). +func (s Set[T]) Clear() Set[T] { + for key := range s { + delete(s, key) + } + return s +} diff --git a/tools/vendor/k8s.io/utils/trace/trace.go b/tools/vendor/k8s.io/utils/trace/trace.go index a0b07a6d7..187eb5d8c 100644 --- a/tools/vendor/k8s.io/utils/trace/trace.go +++ b/tools/vendor/k8s.io/utils/trace/trace.go @@ -65,6 +65,11 @@ func durationToMilliseconds(timeDuration time.Duration) int64 { } type traceItem interface { + // rLock must be called before invoking time or writeItem. + rLock() + // rUnlock must be called after processing the item is complete. + rUnlock() + // time returns when the trace was recorded as completed. time() time.Time // writeItem outputs the traceItem to the buffer. If stepThreshold is non-nil, only output the @@ -79,6 +84,10 @@ type traceStep struct { fields []Field } +// rLock doesn't need to do anything because traceStep instances are immutable. +func (s traceStep) rLock() {} +func (s traceStep) rUnlock() {} + func (s traceStep) time() time.Time { return s.stepTime } @@ -106,6 +115,14 @@ type Trace struct { traceItems []traceItem } +func (t *Trace) rLock() { + t.lock.RLock() +} + +func (t *Trace) rUnlock() { + t.lock.RUnlock() +} + func (t *Trace) time() time.Time { if t.endTime != nil { return *t.endTime @@ -231,8 +248,10 @@ func (t *Trace) logTrace() { func (t *Trace) writeTraceSteps(b *bytes.Buffer, formatter string, stepThreshold *time.Duration) { lastStepTime := t.startTime for _, stepOrTrace := range t.traceItems { + stepOrTrace.rLock() stepOrTrace.writeItem(b, formatter, lastStepTime, stepThreshold) lastStepTime = stepOrTrace.time() + stepOrTrace.rUnlock() } } diff --git a/tools/vendor/modules.txt b/tools/vendor/modules.txt index 5ba5e9d28..bd30072ce 100644 --- a/tools/vendor/modules.txt +++ b/tools/vendor/modules.txt @@ -1,8 +1,11 @@ -# github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 +# github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 +## explicit; go 1.18 +github.com/AdaLogics/go-fuzz-headers +# 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/BurntSushi/toml v1.2.0 +# github.com/BurntSushi/toml v1.2.1 ## explicit; go 1.16 github.com/BurntSushi/toml github.com/BurntSushi/toml/internal @@ -12,25 +15,27 @@ github.com/MakeNowJust/heredoc # github.com/Masterminds/goutils v1.1.1 ## explicit github.com/Masterminds/goutils -# github.com/Masterminds/semver/v3 v3.1.1 -## explicit; go 1.12 +# github.com/Masterminds/semver/v3 v3.2.0 +## explicit; go 1.18 github.com/Masterminds/semver/v3 -# github.com/Masterminds/sprig/v3 v3.2.2 +# github.com/Masterminds/sprig/v3 v3.2.3 ## explicit; go 1.13 github.com/Masterminds/sprig/v3 # github.com/Masterminds/squirrel v1.5.3 ## explicit; go 1.14 github.com/Masterminds/squirrel -# 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/backuptar +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/tools/mkwinsyscall github.com/Microsoft/go-winio/vhd -# github.com/Microsoft/hcsshim v0.9.4 -## explicit; go 1.13 +# github.com/Microsoft/hcsshim v0.10.0-rc.7 +## explicit; go 1.18 github.com/Microsoft/hcsshim github.com/Microsoft/hcsshim/computestorage github.com/Microsoft/hcsshim/internal/cow @@ -44,10 +49,13 @@ 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/memory github.com/Microsoft/hcsshim/internal/mergemaps github.com/Microsoft/hcsshim/internal/oc +github.com/Microsoft/hcsshim/internal/protocol/guestrequest github.com/Microsoft/hcsshim/internal/queue github.com/Microsoft/hcsshim/internal/safefile +github.com/Microsoft/hcsshim/internal/security github.com/Microsoft/hcsshim/internal/timeout github.com/Microsoft/hcsshim/internal/vmcompute github.com/Microsoft/hcsshim/internal/wclayer @@ -58,10 +66,10 @@ github.com/Microsoft/hcsshim/pkg/ociwclayer ## explicit; go 1.14 github.com/adrg/xdg github.com/adrg/xdg/internal/pathutil -# github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 -## explicit; go 1.16 -github.com/antlr/antlr4/runtime/Go/antlr -# github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d +# github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df +## explicit; go 1.18 +github.com/antlr/antlr4/runtime/Go/antlr/v4 +# github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 ## explicit; go 1.13 github.com/asaskevich/govalidator # github.com/beorn7/perks v1.0.1 @@ -70,10 +78,10 @@ github.com/beorn7/perks/quantile # github.com/blang/semver/v4 v4.0.0 ## explicit; go 1.14 github.com/blang/semver/v4 -# github.com/cenkalti/backoff/v4 v4.1.3 -## explicit; go 1.13 +# github.com/cenkalti/backoff/v4 v4.2.1 +## explicit; go 1.18 github.com/cenkalti/backoff/v4 -# github.com/cespare/xxhash/v2 v2.1.2 +# github.com/cespare/xxhash/v2 v2.2.0 ## explicit; go 1.11 github.com/cespare/xxhash/v2 # github.com/chai2010/gettext-go v1.0.2 @@ -82,17 +90,22 @@ github.com/chai2010/gettext-go github.com/chai2010/gettext-go/mo github.com/chai2010/gettext-go/plural github.com/chai2010/gettext-go/po -# github.com/containerd/cgroups v1.0.4 +# github.com/containerd/cgroups v1.1.0 ## explicit; go 1.17 github.com/containerd/cgroups/stats/v1 -# github.com/containerd/containerd v1.6.8 -## explicit; go 1.17 +# github.com/containerd/containerd v1.7.0 +## explicit; go 1.19 +github.com/containerd/containerd/api/events +github.com/containerd/containerd/api/runtime/sandbox/v1 +github.com/containerd/containerd/api/types github.com/containerd/containerd/archive github.com/containerd/containerd/archive/compression +github.com/containerd/containerd/archive/tarheader github.com/containerd/containerd/containers github.com/containerd/containerd/content github.com/containerd/containerd/content/local github.com/containerd/containerd/errdefs +github.com/containerd/containerd/events github.com/containerd/containerd/filters github.com/containerd/containerd/gc github.com/containerd/containerd/identifiers @@ -104,41 +117,53 @@ github.com/containerd/containerd/metadata github.com/containerd/containerd/metadata/boltutil github.com/containerd/containerd/mount github.com/containerd/containerd/namespaces +github.com/containerd/containerd/pkg/cleanup +github.com/containerd/containerd/pkg/epoch +github.com/containerd/containerd/pkg/randutil github.com/containerd/containerd/pkg/userns github.com/containerd/containerd/platforms +github.com/containerd/containerd/protobuf +github.com/containerd/containerd/protobuf/plugin +github.com/containerd/containerd/protobuf/proto +github.com/containerd/containerd/protobuf/types github.com/containerd/containerd/reference +github.com/containerd/containerd/reference/docker github.com/containerd/containerd/remotes github.com/containerd/containerd/remotes/docker github.com/containerd/containerd/remotes/docker/auth github.com/containerd/containerd/remotes/docker/schema1 github.com/containerd/containerd/remotes/errors +github.com/containerd/containerd/sandbox github.com/containerd/containerd/snapshots -github.com/containerd/containerd/sys +github.com/containerd/containerd/tracing github.com/containerd/containerd/version -# github.com/containerd/continuity v0.2.2 -## explicit; go 1.13 +# github.com/containerd/continuity v0.3.0 +## explicit; go 1.17 github.com/containerd/continuity/fs github.com/containerd/continuity/sysx -# github.com/containerd/stargz-snapshotter/estargz v0.10.1 +# github.com/containerd/stargz-snapshotter/estargz v0.12.1 ## explicit; go 1.16 github.com/containerd/stargz-snapshotter/estargz github.com/containerd/stargz-snapshotter/estargz/errorutil -# github.com/containerd/ttrpc v1.1.0 +# github.com/containerd/ttrpc v1.2.1 ## explicit; go 1.13 github.com/containerd/ttrpc +# github.com/containerd/typeurl/v2 v2.1.0 +## explicit; go 1.13 +github.com/containerd/typeurl/v2 # github.com/cyphar/filepath-securejoin v0.2.3 ## explicit; go 1.13 github.com/cyphar/filepath-securejoin # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/docker/cli v20.10.19+incompatible +# github.com/docker/cli v20.10.21+incompatible ## explicit github.com/docker/cli/cli/config github.com/docker/cli/cli/config/configfile github.com/docker/cli/cli/config/credentials github.com/docker/cli/cli/config/types -# github.com/docker/distribution v2.8.1+incompatible +# github.com/docker/distribution v2.8.2+incompatible ## explicit github.com/docker/distribution github.com/docker/distribution/digestset @@ -152,7 +177,7 @@ github.com/docker/distribution/registry/client/auth/challenge github.com/docker/distribution/registry/client/transport github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory -# github.com/docker/docker v20.10.19+incompatible +# github.com/docker/docker v20.10.24+incompatible ## explicit github.com/docker/docker/api/types github.com/docker/docker/api/types/blkiodev @@ -187,7 +212,7 @@ github.com/docker/go-metrics # github.com/docker/go-units v0.5.0 ## explicit github.com/docker/go-units -# github.com/emicklei/go-restful/v3 v3.9.0 +# github.com/emicklei/go-restful/v3 v3.10.1 ## explicit; go 1.13 github.com/emicklei/go-restful/v3 github.com/emicklei/go-restful/v3/log @@ -232,23 +257,23 @@ github.com/go-git/go-billy/v5 github.com/go-git/go-git/v5/plumbing/format/config github.com/go-git/go-git/v5/plumbing/format/gitignore github.com/go-git/go-git/v5/utils/ioutil -# github.com/go-gorp/gorp/v3 v3.0.2 -## explicit; go 1.13 +# github.com/go-gorp/gorp/v3 v3.0.5 +## explicit; go 1.18 github.com/go-gorp/gorp/v3 -# 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-logr/logr/funcr # github.com/go-logr/stdr v1.2.2 ## explicit; go 1.16 github.com/go-logr/stdr -# github.com/go-logr/zapr v1.2.3 +# github.com/go-logr/zapr v1.2.4 ## explicit; go 1.16 github.com/go-logr/zapr # github.com/go-openapi/jsonpointer v0.19.6 ## explicit; go 1.13 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.20.1 +# github.com/go-openapi/jsonreference v0.20.2 ## explicit; go 1.13 github.com/go-openapi/jsonreference github.com/go-openapi/jsonreference/internal @@ -277,11 +302,11 @@ 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-migrate/migrate/v4 v4.6.2 -## explicit +# github.com/golang-migrate/migrate/v4 v4.16.1 +## explicit; go 1.18 github.com/golang-migrate/migrate/v4/source github.com/golang-migrate/migrate/v4/source/file +github.com/golang-migrate/migrate/v4/source/iofs # github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da ## explicit github.com/golang/groupcache/lru @@ -296,8 +321,8 @@ github.com/golang/protobuf/ptypes/timestamp # github.com/google/btree v1.1.2 ## explicit; go 1.18 github.com/google/btree -# github.com/google/cel-go v0.12.6 -## explicit; go 1.17 +# github.com/google/cel-go v0.16.0 +## explicit; go 1.18 github.com/google/cel-go/cel github.com/google/cel-go/checker github.com/google/cel-go/checker/decls @@ -322,7 +347,13 @@ github.com/google/gnostic/compiler github.com/google/gnostic/extensions github.com/google/gnostic/jsonschema github.com/google/gnostic/openapiv2 -github.com/google/gnostic/openapiv3 +# github.com/google/gnostic-models v0.6.8 +## explicit; go 1.18 +github.com/google/gnostic-models/compiler +github.com/google/gnostic-models/extensions +github.com/google/gnostic-models/jsonschema +github.com/google/gnostic-models/openapiv2 +github.com/google/gnostic-models/openapiv3 # github.com/google/go-cmp v0.5.9 ## explicit; go 1.13 github.com/google/go-cmp/cmp @@ -330,9 +361,10 @@ 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.8.0 -## explicit; go 1.14 +# github.com/google/go-containerregistry v0.13.0 +## explicit; go 1.18 github.com/google/go-containerregistry/internal/and +github.com/google/go-containerregistry/internal/compression github.com/google/go-containerregistry/internal/estargz github.com/google/go-containerregistry/internal/gzip github.com/google/go-containerregistry/internal/legacy @@ -341,7 +373,9 @@ github.com/google/go-containerregistry/internal/retry github.com/google/go-containerregistry/internal/retry/wait github.com/google/go-containerregistry/internal/verify github.com/google/go-containerregistry/internal/windows +github.com/google/go-containerregistry/internal/zstd github.com/google/go-containerregistry/pkg/authn +github.com/google/go-containerregistry/pkg/compression github.com/google/go-containerregistry/pkg/crane github.com/google/go-containerregistry/pkg/legacy github.com/google/go-containerregistry/pkg/legacy/tarball @@ -393,6 +427,12 @@ github.com/h2non/filetype/types # github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c ## explicit github.com/h2non/go-is-svg +# github.com/hashicorp/errwrap v1.1.0 +## explicit +github.com/hashicorp/errwrap +# github.com/hashicorp/go-multierror v1.1.1 +## explicit; go 1.13 +github.com/hashicorp/go-multierror # github.com/hashicorp/hcl v1.0.0 ## explicit github.com/hashicorp/hcl @@ -405,7 +445,7 @@ github.com/hashicorp/hcl/hcl/token github.com/hashicorp/hcl/json/parser github.com/hashicorp/hcl/json/scanner github.com/hashicorp/hcl/json/token -# github.com/huandu/xstrings v1.3.2 +# github.com/huandu/xstrings v1.4.0 ## explicit; go 1.12 github.com/huandu/xstrings # github.com/iancoleman/strcase v0.2.0 @@ -436,11 +476,12 @@ github.com/josharian/intern # github.com/json-iterator/go v1.1.12 ## explicit; go 1.12 github.com/json-iterator/go -# github.com/klauspost/compress v1.14.1 -## explicit; go 1.15 +# github.com/klauspost/compress v1.16.5 +## explicit; go 1.18 github.com/klauspost/compress github.com/klauspost/compress/fse github.com/klauspost/compress/huff0 +github.com/klauspost/compress/internal/cpuinfo github.com/klauspost/compress/internal/snapref github.com/klauspost/compress/zstd github.com/klauspost/compress/zstd/internal/xxhash @@ -481,10 +522,10 @@ github.com/mattn/go-isatty # github.com/mattn/go-runewidth v0.0.14 ## explicit; go 1.9 github.com/mattn/go-runewidth -# github.com/mattn/go-sqlite3 v1.14.14 -## explicit; go 1.12 +# github.com/mattn/go-sqlite3 v1.14.16 +## explicit; go 1.16 github.com/mattn/go-sqlite3 -# github.com/matttproud/golang_protobuf_extensions v1.0.2 +# github.com/matttproud/golang_protobuf_extensions v1.0.4 ## explicit; go 1.9 github.com/matttproud/golang_protobuf_extensions/pbutil # github.com/mitchellh/copystructure v1.2.0 @@ -509,10 +550,13 @@ github.com/moby/locker ## explicit; go 1.13 github.com/moby/spdystream github.com/moby/spdystream/spdy -# github.com/moby/sys/mountinfo v0.5.0 +# 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 @@ -531,21 +575,35 @@ github.com/morikuni/aec # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 ## explicit github.com/munnerz/goautoneg -# github.com/olekukonko/tablewriter v0.0.5 -## explicit; go 1.12 -github.com/olekukonko/tablewriter -# github.com/onsi/gomega v1.27.6 +# github.com/onsi/gomega v1.27.10 ## explicit; go 1.18 github.com/onsi/gomega/gstruct/errors github.com/onsi/gomega/types # 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 +# github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b ## explicit; go 1.17 github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 -# github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42 +# github.com/operator-framework/ansible-operator-plugins v1.32.0 +## explicit; go 1.19 +github.com/operator-framework/ansible-operator-plugins/internal/version +github.com/operator-framework/ansible-operator-plugins/pkg/plugins +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1 +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/constants +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/crd +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/rbac +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/playbooks +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/ansible/v1/scaffolds/internal/templates/roles +github.com/operator-framework/ansible-operator-plugins/pkg/plugins/util +# github.com/operator-framework/api v0.17.5 ## explicit; go 1.19 github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3 github.com/operator-framework/api/pkg/constraints @@ -585,7 +643,7 @@ github.com/operator-framework/operator-manifest-tools/pkg/image github.com/operator-framework/operator-manifest-tools/pkg/imagename github.com/operator-framework/operator-manifest-tools/pkg/imageresolver github.com/operator-framework/operator-manifest-tools/pkg/pullspec -# github.com/operator-framework/operator-registry v1.26.5-0.20230307160312-3bfcb23fa7d0 +# github.com/operator-framework/operator-registry v1.28.0 ## explicit; go 1.19 github.com/operator-framework/operator-registry/alpha/action github.com/operator-framework/operator-registry/alpha/declcfg @@ -602,7 +660,7 @@ github.com/operator-framework/operator-registry/pkg/lib/validation github.com/operator-framework/operator-registry/pkg/registry github.com/operator-framework/operator-registry/pkg/sqlite github.com/operator-framework/operator-registry/pkg/sqlite/migrations -# github.com/operator-framework/operator-sdk v1.29.0 +# github.com/operator-framework/operator-sdk v1.32.0 ## explicit; go 1.19 github.com/operator-framework/operator-sdk/cmd/operator-sdk github.com/operator-framework/operator-sdk/internal/annotations/metrics @@ -647,18 +705,6 @@ github.com/operator-framework/operator-sdk/internal/olm/operator/registry/config github.com/operator-framework/operator-sdk/internal/olm/operator/registry/fbcindex github.com/operator-framework/operator-sdk/internal/olm/operator/registry/index github.com/operator-framework/operator-sdk/internal/plugins -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1 -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/constants -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/crd -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/testing/pullpolicy -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mkind -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/playbooks -github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/roles github.com/operator-framework/operator-sdk/internal/plugins/envtest/v1 github.com/operator-framework/operator-sdk/internal/plugins/helm/v1 github.com/operator-framework/operator-sdk/internal/plugins/helm/v1/chartutil @@ -694,29 +740,29 @@ github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib -# github.com/prometheus/client_golang v1.14.0 +# github.com/prometheus/client_golang v1.16.0 ## explicit; go 1.17 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/collectors 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.37.0 -## explicit; go 1.16 +# 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.8.0 -## explicit; go 1.17 +# 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 # github.com/rivo/uniseg v0.4.2 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rubenv/sql-migrate v1.2.0 +# github.com/rubenv/sql-migrate v1.3.1 ## explicit; go 1.16 github.com/rubenv/sql-migrate github.com/rubenv/sql-migrate/sqlparse @@ -726,7 +772,7 @@ github.com/russross/blackfriday/v2 # github.com/shopspring/decimal v1.3.1 ## explicit; go 1.13 github.com/shopspring/decimal -# github.com/sirupsen/logrus v1.9.0 +# github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus # github.com/spf13/afero v1.9.3 @@ -757,7 +803,7 @@ github.com/spf13/viper/internal/encoding/yaml # github.com/stoewer/go-strcase v1.2.0 ## explicit; go 1.11 github.com/stoewer/go-strcase -# github.com/stretchr/testify v1.8.1 +# github.com/stretchr/testify v1.8.2 ## explicit; go 1.13 github.com/stretchr/testify/assert github.com/stretchr/testify/require @@ -779,16 +825,13 @@ github.com/xeipuuv/gojsonreference # github.com/xeipuuv/gojsonschema v1.2.0 ## explicit github.com/xeipuuv/gojsonschema -# github.com/xlab/treeprint v1.1.0 +# github.com/xlab/treeprint v1.2.0 ## explicit; go 1.13 github.com/xlab/treeprint -# go.etcd.io/bbolt v1.3.6 -## explicit; go 1.12 -go.etcd.io/bbolt -# go.etcd.io/etcd/api/v3 v3.5.7 +# go.etcd.io/bbolt v1.3.7 ## explicit; go 1.17 -go.etcd.io/etcd/api/v3/v3rpc/rpctypes -# go.opencensus.io v0.23.0 +go.etcd.io/bbolt +# go.opencensus.io v0.24.0 ## explicit; go 1.13 go.opencensus.io go.opencensus.io/internal @@ -798,7 +841,7 @@ go.opencensus.io/trace/tracestate # go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 ## explicit; go 1.17 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp -# go.opentelemetry.io/otel v1.11.0 +# go.opentelemetry.io/otel v1.14.0 ## explicit; go 1.18 go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute @@ -807,41 +850,43 @@ go.opentelemetry.io/otel/codes go.opentelemetry.io/otel/exporters/otlp/internal go.opentelemetry.io/otel/exporters/otlp/internal/envconfig go.opentelemetry.io/otel/internal +go.opentelemetry.io/otel/internal/attribute go.opentelemetry.io/otel/internal/baggage go.opentelemetry.io/otel/internal/global go.opentelemetry.io/otel/propagation go.opentelemetry.io/otel/semconv/internal +go.opentelemetry.io/otel/semconv/internal/v2 go.opentelemetry.io/otel/semconv/v1.12.0 -# go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 -## explicit; go 1.17 +go.opentelemetry.io/otel/semconv/v1.17.0 +go.opentelemetry.io/otel/semconv/v1.17.0/httpconv +# go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 +## explicit; go 1.18 go.opentelemetry.io/otel/exporters/otlp/internal/retry -# go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 -## explicit; go 1.17 +# go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 +## explicit; go 1.18 go.opentelemetry.io/otel/exporters/otlp/otlptrace go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform -# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 -## explicit; go 1.17 +# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 +## explicit; go 1.18 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc -# go.opentelemetry.io/otel/metric v0.31.0 -## explicit; go 1.17 +# go.opentelemetry.io/otel/metric v1.21.0 => go.opentelemetry.io/otel/metric v0.35.0 +## explicit; go 1.18 go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/global go.opentelemetry.io/otel/metric/instrument -go.opentelemetry.io/otel/metric/instrument/asyncfloat64 -go.opentelemetry.io/otel/metric/instrument/asyncint64 go.opentelemetry.io/otel/metric/instrument/syncfloat64 go.opentelemetry.io/otel/metric/instrument/syncint64 go.opentelemetry.io/otel/metric/internal/global go.opentelemetry.io/otel/metric/unit -# go.opentelemetry.io/otel/sdk v1.11.0 +# go.opentelemetry.io/otel/sdk v1.14.0 ## explicit; go 1.18 go.opentelemetry.io/otel/sdk/instrumentation go.opentelemetry.io/otel/sdk/internal go.opentelemetry.io/otel/sdk/internal/env go.opentelemetry.io/otel/sdk/resource go.opentelemetry.io/otel/sdk/trace -# go.opentelemetry.io/otel/trace v1.11.0 +# go.opentelemetry.io/otel/trace v1.14.0 ## explicit; go 1.18 go.opentelemetry.io/otel/trace # go.opentelemetry.io/proto/otlp v0.19.0 @@ -858,13 +903,10 @@ go.starlark.net/resolve go.starlark.net/starlark go.starlark.net/starlarkstruct go.starlark.net/syntax -# go.uber.org/atomic v1.10.0 -## explicit; go 1.18 -go.uber.org/atomic -# go.uber.org/multierr v1.8.0 -## explicit; go 1.14 +# go.uber.org/multierr v1.11.0 +## explicit; go 1.19 go.uber.org/multierr -# go.uber.org/zap v1.24.0 +# go.uber.org/zap v1.26.0 ## explicit; go 1.19 go.uber.org/zap go.uber.org/zap/buffer @@ -872,8 +914,10 @@ go.uber.org/zap/internal go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit +go.uber.org/zap/internal/pool +go.uber.org/zap/internal/stacktrace go.uber.org/zap/zapcore -# golang.org/x/crypto v0.1.0 +# golang.org/x/crypto v0.14.0 ## explicit; go 1.17 golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish @@ -887,16 +931,19 @@ golang.org/x/crypto/openpgp/packet golang.org/x/crypto/openpgp/s2k golang.org/x/crypto/pbkdf2 golang.org/x/crypto/scrypt -# golang.org/x/mod v0.10.0 -## explicit; go 1.17 +# golang.org/x/exp v0.0.0-20231006140011-7918f672742d +## explicit; go 1.20 +golang.org/x/exp/constraints +golang.org/x/exp/slices +# golang.org/x/mod v0.13.0 +## explicit; go 1.18 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.9.0 +# golang.org/x/net v0.16.0 ## explicit; go 1.17 golang.org/x/net/context -golang.org/x/net/context/ctxhttp golang.org/x/net/http/httpguts golang.org/x/net/http2 golang.org/x/net/http2/hpack @@ -905,38 +952,45 @@ 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.0.0-20221014153046-6fdb5e3db783 +# golang.org/x/oauth2 v0.8.0 ## explicit; go 1.17 golang.org/x/oauth2 golang.org/x/oauth2/internal -# golang.org/x/sync v0.1.0 -## explicit +# golang.org/x/sync v0.4.0 +## explicit; go 1.17 golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.7.0 +golang.org/x/sync/singleflight +# golang.org/x/sys v0.13.0 ## explicit; go 1.17 golang.org/x/sys/execabs -golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry -# golang.org/x/term v0.7.0 +# golang.org/x/term v0.13.0 ## explicit; go 1.17 golang.org/x/term -# golang.org/x/text v0.9.0 +# golang.org/x/text v0.13.0 ## explicit; go 1.17 golang.org/x/text/cases golang.org/x/text/encoding golang.org/x/text/encoding/internal golang.org/x/text/encoding/internal/identifier golang.org/x/text/encoding/unicode +golang.org/x/text/feature/plural golang.org/x/text/internal +golang.org/x/text/internal/catmsg +golang.org/x/text/internal/format golang.org/x/text/internal/language golang.org/x/text/internal/language/compact +golang.org/x/text/internal/number +golang.org/x/text/internal/stringset golang.org/x/text/internal/tag golang.org/x/text/internal/utf8internal golang.org/x/text/language +golang.org/x/text/message +golang.org/x/text/message/catalog golang.org/x/text/runes golang.org/x/text/secure/bidirule golang.org/x/text/transform @@ -946,7 +1000,7 @@ golang.org/x/text/width # golang.org/x/time v0.3.0 ## explicit golang.org/x/time/rate -# golang.org/x/tools v0.8.0 +# golang.org/x/tools v0.14.0 ## explicit; go 1.18 golang.org/x/tools/cmd/stringer golang.org/x/tools/go/ast/astutil @@ -959,6 +1013,7 @@ golang.org/x/tools/internal/event golang.org/x/tools/internal/event/core golang.org/x/tools/internal/event/keys golang.org/x/tools/internal/event/label +golang.org/x/tools/internal/event/tag golang.org/x/tools/internal/fastwalk golang.org/x/tools/internal/gcimporter golang.org/x/tools/internal/gocommand @@ -978,14 +1033,18 @@ google.golang.org/appengine/internal/log 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-20221014173430-6e2ab493f96b +# google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 +## explicit; go 1.19 +google.golang.org/genproto/protobuf/field_mask +# google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 ## 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-20230525234030-28d5490b6b19 +## explicit; go 1.19 google.golang.org/genproto/googleapis/rpc/errdetails google.golang.org/genproto/googleapis/rpc/status -google.golang.org/genproto/protobuf/field_mask -# google.golang.org/grpc v1.51.0 +# google.golang.org/grpc v1.54.0 ## explicit; go 1.17 google.golang.org/grpc google.golang.org/grpc/attributes @@ -1085,6 +1144,9 @@ google.golang.org/protobuf/types/known/structpb google.golang.org/protobuf/types/known/timestamppb google.golang.org/protobuf/types/known/wrapperspb google.golang.org/protobuf/types/pluginpb +# gopkg.in/evanphx/json-patch.v5 v5.6.0 +## explicit +gopkg.in/evanphx/json-patch.v5 # gopkg.in/inf.v0 v0.9.1 ## explicit gopkg.in/inf.v0 @@ -1100,8 +1162,8 @@ gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# helm.sh/helm/v3 v3.10.3 -## explicit; go 1.18 +# helm.sh/helm/v3 v3.11.3 +## explicit; go 1.17 helm.sh/helm/v3/internal/fileutil helm.sh/helm/v3/internal/ignore helm.sh/helm/v3/internal/resolver @@ -1138,7 +1200,7 @@ helm.sh/helm/v3/pkg/storage helm.sh/helm/v3/pkg/storage/driver helm.sh/helm/v3/pkg/time helm.sh/helm/v3/pkg/uploader -# k8s.io/api v0.27.1 +# k8s.io/api v0.28.0 ## explicit; go 1.20 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -1195,7 +1257,7 @@ 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.27.1 +# k8s.io/apiextensions-apiserver v0.28.0 ## explicit; go 1.20 k8s.io/apiextensions-apiserver/pkg/apihelpers k8s.io/apiextensions-apiserver/pkg/apis/apiextensions @@ -1210,7 +1272,8 @@ k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning k8s.io/apiextensions-apiserver/pkg/apiserver/validation -# k8s.io/apimachinery v0.27.1 +k8s.io/apiextensions-apiserver/pkg/features +# k8s.io/apimachinery v0.28.0 ## explicit; go 1.20 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -1242,6 +1305,7 @@ k8s.io/apimachinery/pkg/selection k8s.io/apimachinery/pkg/types k8s.io/apimachinery/pkg/util/cache k8s.io/apimachinery/pkg/util/diff +k8s.io/apimachinery/pkg/util/dump k8s.io/apimachinery/pkg/util/duration k8s.io/apimachinery/pkg/util/errors k8s.io/apimachinery/pkg/util/framer @@ -1261,6 +1325,7 @@ k8s.io/apimachinery/pkg/util/sets k8s.io/apimachinery/pkg/util/strategicpatch k8s.io/apimachinery/pkg/util/validation k8s.io/apimachinery/pkg/util/validation/field +k8s.io/apimachinery/pkg/util/version k8s.io/apimachinery/pkg/util/wait k8s.io/apimachinery/pkg/util/yaml k8s.io/apimachinery/pkg/version @@ -1268,7 +1333,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/apiserver v0.27.1 +# k8s.io/apiserver v0.28.0 ## explicit; go 1.20 k8s.io/apiserver/pkg/apis/apiserver k8s.io/apiserver/pkg/apis/apiserver/install @@ -1284,8 +1349,10 @@ k8s.io/apiserver/pkg/authentication/user k8s.io/apiserver/pkg/authorization/authorizer k8s.io/apiserver/pkg/cel k8s.io/apiserver/pkg/cel/common +k8s.io/apiserver/pkg/cel/environment k8s.io/apiserver/pkg/cel/library k8s.io/apiserver/pkg/cel/metrics +k8s.io/apiserver/pkg/cel/openapi k8s.io/apiserver/pkg/endpoints/deprecation k8s.io/apiserver/pkg/endpoints/request k8s.io/apiserver/pkg/features @@ -1299,7 +1366,7 @@ k8s.io/apiserver/pkg/util/x509metrics k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.27.1 +# k8s.io/client-go v0.28.0 ## explicit; go 1.20 k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1 @@ -1456,7 +1523,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/component-base v0.27.1 +# k8s.io/component-base v0.28.0 ## explicit; go 1.20 k8s.io/component-base/featuregate k8s.io/component-base/metrics @@ -1466,7 +1533,7 @@ k8s.io/component-base/metrics/prometheusextension k8s.io/component-base/tracing k8s.io/component-base/tracing/api/v1 k8s.io/component-base/version -# k8s.io/klog/v2 v2.90.1 +# k8s.io/klog/v2 v2.100.1 ## explicit; go 1.13 k8s.io/klog/v2 k8s.io/klog/v2/internal/buffer @@ -1474,8 +1541,8 @@ 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-20230308215209-15aac26d736a -## explicit; go 1.18 +# k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 +## explicit; go 1.19 k8s.io/kube-openapi/pkg/builder3/util k8s.io/kube-openapi/pkg/cached k8s.io/kube-openapi/pkg/common @@ -1506,7 +1573,7 @@ k8s.io/kubectl/pkg/util/slice k8s.io/kubectl/pkg/util/templates k8s.io/kubectl/pkg/util/term k8s.io/kubectl/pkg/validation -# k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 +# k8s.io/utils v0.0.0-20230711102312-30195339c3c7 ## explicit; go 1.18 k8s.io/utils/buffer k8s.io/utils/clock @@ -1519,10 +1586,11 @@ k8s.io/utils/lru k8s.io/utils/net k8s.io/utils/path k8s.io/utils/pointer +k8s.io/utils/set k8s.io/utils/strings/slices k8s.io/utils/trace -# oras.land/oras-go v1.2.0 -## explicit; go 1.17 +# oras.land/oras-go v1.2.2 +## explicit; go 1.18 oras.land/oras-go/pkg/artifact oras.land/oras-go/pkg/auth oras.land/oras-go/pkg/auth/docker @@ -1537,13 +1605,13 @@ oras.land/oras-go/pkg/registry/remote/internal/syncutil oras.land/oras-go/pkg/target # rsc.io/letsencrypt v0.0.3 ## explicit -# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 +# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 ## explicit; go 1.17 sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/common/metrics sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client -# sigs.k8s.io/controller-runtime v0.14.5 +# sigs.k8s.io/controller-runtime v0.14.6 ## explicit; go 1.19 sigs.k8s.io/controller-runtime/pkg/client sigs.k8s.io/controller-runtime/pkg/client/apiutil @@ -1553,7 +1621,7 @@ sigs.k8s.io/controller-runtime/pkg/internal/log sigs.k8s.io/controller-runtime/pkg/internal/objectutil sigs.k8s.io/controller-runtime/pkg/log sigs.k8s.io/controller-runtime/pkg/scheme -# sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230620070423-a784ee78d04b +# sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20231212104454-76b5567314a8 ## explicit; go 1.20 sigs.k8s.io/controller-runtime/tools/setup-envtest sigs.k8s.io/controller-runtime/tools/setup-envtest/env @@ -1561,7 +1629,7 @@ sigs.k8s.io/controller-runtime/tools/setup-envtest/remote sigs.k8s.io/controller-runtime/tools/setup-envtest/store sigs.k8s.io/controller-runtime/tools/setup-envtest/versions sigs.k8s.io/controller-runtime/tools/setup-envtest/workflows -# sigs.k8s.io/controller-tools v0.12.1 +# sigs.k8s.io/controller-tools v0.13.0 ## explicit; go 1.20 sigs.k8s.io/controller-tools/cmd/controller-gen sigs.k8s.io/controller-tools/pkg/crd @@ -1659,8 +1727,8 @@ sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v4/scaffolds/internal/templates/ha sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates -# sigs.k8s.io/kustomize/api v0.12.1 -## explicit; go 1.18 +# sigs.k8s.io/kustomize/api v0.16.0 +## explicit; go 1.20 sigs.k8s.io/kustomize/api/filters/annotations sigs.k8s.io/kustomize/api/filters/fieldspec sigs.k8s.io/kustomize/api/filters/filtersutil @@ -1680,12 +1748,15 @@ sigs.k8s.io/kustomize/api/filters/suffix sigs.k8s.io/kustomize/api/filters/valueadd sigs.k8s.io/kustomize/api/hasher sigs.k8s.io/kustomize/api/ifc -sigs.k8s.io/kustomize/api/image sigs.k8s.io/kustomize/api/internal/accumulator sigs.k8s.io/kustomize/api/internal/builtins sigs.k8s.io/kustomize/api/internal/generators sigs.k8s.io/kustomize/api/internal/git +sigs.k8s.io/kustomize/api/internal/image +sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts sigs.k8s.io/kustomize/api/internal/kusterr +sigs.k8s.io/kustomize/api/internal/loader +sigs.k8s.io/kustomize/api/internal/localizer sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers sigs.k8s.io/kustomize/api/internal/plugins/execplugin @@ -1696,17 +1767,17 @@ sigs.k8s.io/kustomize/api/internal/target sigs.k8s.io/kustomize/api/internal/utils sigs.k8s.io/kustomize/api/internal/validate sigs.k8s.io/kustomize/api/konfig -sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts sigs.k8s.io/kustomize/api/krusty +sigs.k8s.io/kustomize/api/krusty/localizer sigs.k8s.io/kustomize/api/kv -sigs.k8s.io/kustomize/api/loader +sigs.k8s.io/kustomize/api/pkg/loader sigs.k8s.io/kustomize/api/provenance sigs.k8s.io/kustomize/api/provider sigs.k8s.io/kustomize/api/resmap sigs.k8s.io/kustomize/api/resource sigs.k8s.io/kustomize/api/types -# sigs.k8s.io/kustomize/cmd/config v0.10.9 -## explicit; go 1.18 +# sigs.k8s.io/kustomize/cmd/config v0.13.0 +## explicit; go 1.20 sigs.k8s.io/kustomize/cmd/config/completion sigs.k8s.io/kustomize/cmd/config/configcobra sigs.k8s.io/kustomize/cmd/config/ext @@ -1716,26 +1787,27 @@ sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/tutorials sigs.k8s.io/kustomize/cmd/config/runner -# sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 -## explicit; go 1.18 -sigs.k8s.io/kustomize/kustomize/v4 -sigs.k8s.io/kustomize/kustomize/v4/commands -sigs.k8s.io/kustomize/kustomize/v4/commands/build -sigs.k8s.io/kustomize/kustomize/v4/commands/create -sigs.k8s.io/kustomize/kustomize/v4/commands/edit -sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add -sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix -sigs.k8s.io/kustomize/kustomize/v4/commands/edit/listbuiltin -sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove -sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set -sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile -sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util -sigs.k8s.io/kustomize/kustomize/v4/commands/openapi -sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch -sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info -sigs.k8s.io/kustomize/kustomize/v4/commands/version -# sigs.k8s.io/kustomize/kyaml v0.13.9 -## explicit; go 1.18 +# sigs.k8s.io/kustomize/kustomize/v5 v5.3.0 +## explicit; go 1.20 +sigs.k8s.io/kustomize/kustomize/v5 +sigs.k8s.io/kustomize/kustomize/v5/commands +sigs.k8s.io/kustomize/kustomize/v5/commands/build +sigs.k8s.io/kustomize/kustomize/v5/commands/create +sigs.k8s.io/kustomize/kustomize/v5/commands/edit +sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add +sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix +sigs.k8s.io/kustomize/kustomize/v5/commands/edit/listbuiltin +sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove +sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set +sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile +sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util +sigs.k8s.io/kustomize/kustomize/v5/commands/localize +sigs.k8s.io/kustomize/kustomize/v5/commands/openapi +sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/fetch +sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/info +sigs.k8s.io/kustomize/kustomize/v5/commands/version +# sigs.k8s.io/kustomize/kyaml v0.16.0 +## explicit; go 1.20 sigs.k8s.io/kustomize/kyaml/comments sigs.k8s.io/kustomize/kyaml/errors sigs.k8s.io/kustomize/kyaml/ext @@ -1745,23 +1817,19 @@ sigs.k8s.io/kustomize/kyaml/fn/runtime/container sigs.k8s.io/kustomize/kyaml/fn/runtime/exec sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark -sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util sigs.k8s.io/kustomize/kyaml/kio sigs.k8s.io/kustomize/kyaml/kio/filters sigs.k8s.io/kustomize/kyaml/kio/kioutil -sigs.k8s.io/kustomize/kyaml/krmfile sigs.k8s.io/kustomize/kyaml/openapi sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi -sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212 +sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2 sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi sigs.k8s.io/kustomize/kyaml/order sigs.k8s.io/kustomize/kyaml/pathutil sigs.k8s.io/kustomize/kyaml/resid sigs.k8s.io/kustomize/kyaml/runfn sigs.k8s.io/kustomize/kyaml/sets -sigs.k8s.io/kustomize/kyaml/setters2 -sigs.k8s.io/kustomize/kyaml/setters2/settersutil sigs.k8s.io/kustomize/kyaml/sliceutil sigs.k8s.io/kustomize/kyaml/utils sigs.k8s.io/kustomize/kyaml/yaml @@ -1782,6 +1850,8 @@ sigs.k8s.io/structured-merge-diff/v4/merge sigs.k8s.io/structured-merge-diff/v4/schema sigs.k8s.io/structured-merge-diff/v4/typed sigs.k8s.io/structured-merge-diff/v4/value -# sigs.k8s.io/yaml v1.3.0 +# sigs.k8s.io/yaml v1.4.0 ## explicit; go 1.12 sigs.k8s.io/yaml +sigs.k8s.io/yaml/goyaml.v2 +sigs.k8s.io/yaml/goyaml.v3 diff --git a/tools/vendor/oras.land/oras-go/pkg/content/oci.go b/tools/vendor/oras.land/oras-go/pkg/content/oci.go index b643f61f4..c5849ad76 100644 --- a/tools/vendor/oras.land/oras-go/pkg/content/oci.go +++ b/tools/vendor/oras.land/oras-go/pkg/content/oci.go @@ -251,11 +251,10 @@ func (s *OCI) validateOCILayoutFile() error { return nil } -// TODO: implement (needed to create a content.Store) -// TODO: do not return empty content.Info +// Info will return metadata about content available in the content store. // Abort completely cancels the ingest operation targeted by ref. func (s *OCI) Info(ctx context.Context, dgst digest.Digest) (content.Info, error) { - return content.Info{}, nil + return s.Store.Info(ctx, dgst) } // TODO: implement (needed to create a content.Store) diff --git a/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go b/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go index 68a3ebf12..541e6a5aa 100644 --- a/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go +++ b/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go @@ -132,6 +132,11 @@ type grpcTunnel struct { // serving. done chan struct{} + // started is an atomic bool represented as a 0 or 1, and set to true when a single-use tunnel has been started (dialed). + // started should only be accessed through atomic methods. + // TODO: switch this to an atomic.Bool once the client is exclusively buit with go1.19+ + started uint32 + // closing is an atomic bool represented as a 0 or 1, and set to true when the tunnel is being closed. // closing should only be accessed through atomic methods. // TODO: switch this to an atomic.Bool once the client is exclusively buit with go1.19+ @@ -197,6 +202,7 @@ func newUnstartedTunnel(stream client.ProxyService_ProxyClient, c clientConn) *g conns: connectionManager{conns: make(map[int64]*conn)}, readTimeoutSeconds: 10, done: make(chan struct{}), + started: 0, } s := metrics.ClientConnectionStatusCreated t.prevStatus.Store(s) @@ -393,6 +399,11 @@ func (t *grpcTunnel) DialContext(requestCtx context.Context, protocol, address s } func (t *grpcTunnel) dialContext(requestCtx context.Context, protocol, address string) (net.Conn, error) { + prevStarted := atomic.SwapUint32(&t.started, 1) + if prevStarted != 0 { + return nil, &dialFailure{"single-use dialer already dialed", metrics.DialFailureAlreadyStarted} + } + select { case <-t.done: return nil, errors.New("tunnel is closed") @@ -515,11 +526,11 @@ func (t *grpcTunnel) Recv() (*client.Packet, error) { const segment = commonmetrics.SegmentToClient pkt, err := t.stream.Recv() - if err != nil && err != io.EOF { - metrics.Metrics.ObserveStreamErrorNoPacket(segment, err) - } if err != nil { - return pkt, err + if err != io.EOF { + metrics.Metrics.ObserveStreamErrorNoPacket(segment, err) + } + return nil, err } metrics.Metrics.ObservePacket(segment, pkt.Type) return pkt, nil diff --git a/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics/metrics.go b/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics/metrics.go index 03e9d94da..ce942e3eb 100644 --- a/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics/metrics.go +++ b/tools/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/metrics/metrics.go @@ -62,6 +62,8 @@ const ( // DialFailureTunnelClosed indicates that the client connection was closed before the dial could // complete. DialFailureTunnelClosed DialFailureReason = "tunnelclosed" + // DialFailureAlreadyStarted indicates that a single-use tunnel dialer was already used once. + DialFailureAlreadyStarted DialFailureReason = "tunnelstarted" ) type ClientConnectionStatus string diff --git a/tools/vendor/sigs.k8s.io/controller-runtime/tools/setup-envtest/README.md b/tools/vendor/sigs.k8s.io/controller-runtime/tools/setup-envtest/README.md index 40379c9b8..1bdeebbc5 100644 --- a/tools/vendor/sigs.k8s.io/controller-runtime/tools/setup-envtest/README.md +++ b/tools/vendor/sigs.k8s.io/controller-runtime/tools/setup-envtest/README.md @@ -4,7 +4,7 @@ This is a small tool that manages binaries for envtest. It can be used to download new binaries, list currently installed and available ones, and clean up versions. -To use it, just go-install it on 1.16+ (it's a separate, self-contained +To use it, just go-install it on 1.19+ (it's a separate, self-contained module): ```shell @@ -45,7 +45,7 @@ setup-envtest sideload 1.16.2 < downloaded-envtest.tar.gz ## Where does it put all those binaries? By default, binaries are stored in a subdirectory of an OS-specific data -directory, as per the OS's conventions. +directory, as per the OS's conventions. On Linux, this is `$XDG_DATA_HOME`; on Windows, `%LocalAppData`; and on OSX, `~/Library/Application Support`. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/markers/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/markers/zz_generated.markerhelp.go index fbd681aa6..d8a910824 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/markers/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/markers/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/zz_generated.markerhelp.go index 15f2a85c3..68b7619ad 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/crd/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/gen.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/gen.go index 7e674a80a..c1d3b708c 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/gen.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/gen.go @@ -176,7 +176,6 @@ type ObjectGenCtx struct { func writeHeader(pkg *loader.Package, out io.Writer, packageName string, imports *importsList, headerText string) { // NB(directxman12): blank line after build tags to distinguish them from comments _, err := fmt.Fprintf(out, `//go:build !ignore_autogenerated -// +build !ignore_autogenerated %[3]s diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/traverse.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/traverse.go index 9658e1052..863408873 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/traverse.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/traverse.go @@ -374,7 +374,8 @@ func (c *copyMethodMaker) genMapDeepCopy(actualName *namingInfo, mapType *types. c.IfElse("val == nil", func() { c.Line("(*out)[key] = nil") }, func() { - c.Line("in, out := &val, &outVal") + c.Line("inVal := (*in)[key]") + c.Line("in, out := &inVal, &outVal") c.genDeepCopyIntoBlock(&namingInfo{typeInfo: mapType.Elem()}, mapType.Elem()) }) c.Line("(*out)[key] = outVal") diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/zz_generated.markerhelp.go index 913bc1fb7..55df3bfab 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/deepcopy/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/genall/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/genall/zz_generated.markerhelp.go index 6428f0ce2..6f58013b2 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/genall/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/genall/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/rbac/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/rbac/zz_generated.markerhelp.go index 5b6d9c487..5a83941c3 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/rbac/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/rbac/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/schemapatcher/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/schemapatcher/zz_generated.markerhelp.go index db9745d76..6e1d5a18c 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/schemapatcher/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/schemapatcher/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go index 1075f8425..26d072920 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go @@ -19,7 +19,7 @@ limitations under the License. // // The markers take the form: // -// +kubebuilder:webhook:webhookVersions=<[]string>,failurePolicy=,matchPolicy=,groups=<[]string>,resources=<[]string>,verbs=<[]string>,versions=<[]string>,name=,path=,mutating=,sideEffects=,admissionReviewVersions=<[]string>,reinvocationPolicy= +// +kubebuilder:webhook:webhookVersions=<[]string>,failurePolicy=,matchPolicy=,groups=<[]string>,resources=<[]string>,verbs=<[]string>,versions=<[]string>,name=,path=,mutating=,sideEffects=,timeoutSeconds=,admissionReviewVersions=<[]string>,reinvocationPolicy= package webhook import ( @@ -81,6 +81,11 @@ type Config struct { // If the value is "NoneOnDryRun", then the webhook is responsible for inspecting the "dryRun" property of the // AdmissionReview sent in the request, and avoiding side effects if that value is "true." SideEffects string `marker:",optional"` + // TimeoutSeconds allows configuring how long the API server should wait for a webhook to respond before treating the call as a failure. + // If the timeout expires before the webhook responds, the webhook call will be ignored or the API call will be rejected based on the failure policy. + // The timeout value must be between 1 and 30 seconds. + // The timeout for an admission webhook defaults to 10 seconds. + TimeoutSeconds int `marker:",optional"` // Groups specifies the API groups that this webhook receives requests for. Groups []string @@ -103,7 +108,7 @@ type Config struct { // are substituted for hyphens. For example, a validating webhook path for type // batch.tutorial.kubebuilder.io/v1,Kind=CronJob would be // /validate-batch-tutorial-kubebuilder-io-v1-cronjob - Path string + Path string `marker:"path,optional"` // WebhookVersions specifies the target API versions of the {Mutating,Validating}WebhookConfiguration objects // itself to generate. The only supported value is v1. Defaults to v1. @@ -120,6 +125,14 @@ type Config struct { // an object, and mutating webhooks can specify a reinvocationPolicy to control // whether they are reinvoked as well. ReinvocationPolicy string `marker:"reinvocationPolicy,optional"` + + // URL allows mutating webhooks configuration to specify an external URL when generating + // the manifests, instead of using the internal service communication. Should be in format of + // https://address:port/path + // When this option is specified, the serviceConfig.Service is removed from webhook the manifest. + // The URL configuration should be between quotes. + // `url` cannot be specified when `path` is specified. + URL string `marker:"url,optional"` } // verbToAPIVariant converts a marker's verb to the proper value for the API. @@ -152,13 +165,19 @@ func (c Config) ToMutatingWebhook() (admissionregv1.MutatingWebhook, error) { return admissionregv1.MutatingWebhook{}, err } + clientConfig, err := c.clientConfig() + if err != nil { + return admissionregv1.MutatingWebhook{}, err + } + return admissionregv1.MutatingWebhook{ Name: c.Name, Rules: c.rules(), FailurePolicy: c.failurePolicy(), MatchPolicy: matchPolicy, - ClientConfig: c.clientConfig(), + ClientConfig: clientConfig, SideEffects: c.sideEffects(), + TimeoutSeconds: c.timeoutSeconds(), AdmissionReviewVersions: c.AdmissionReviewVersions, ReinvocationPolicy: c.reinvocationPolicy(), }, nil @@ -175,13 +194,19 @@ func (c Config) ToValidatingWebhook() (admissionregv1.ValidatingWebhook, error) return admissionregv1.ValidatingWebhook{}, err } + clientConfig, err := c.clientConfig() + if err != nil { + return admissionregv1.ValidatingWebhook{}, err + } + return admissionregv1.ValidatingWebhook{ Name: c.Name, Rules: c.rules(), FailurePolicy: c.failurePolicy(), MatchPolicy: matchPolicy, - ClientConfig: c.clientConfig(), + ClientConfig: clientConfig, SideEffects: c.sideEffects(), + TimeoutSeconds: c.timeoutSeconds(), AdmissionReviewVersions: c.AdmissionReviewVersions, }, nil } @@ -244,15 +269,27 @@ func (c Config) matchPolicy() (*admissionregv1.MatchPolicyType, error) { } // clientConfig returns the client config for a webhook. -func (c Config) clientConfig() admissionregv1.WebhookClientConfig { +func (c Config) clientConfig() (admissionregv1.WebhookClientConfig, error) { + if (c.Path != "" && c.URL != "") || (c.Path == "" && c.URL == "") { + return admissionregv1.WebhookClientConfig{}, fmt.Errorf("`url` or `path` markers are required and mutually exclusive") + } + path := c.Path - return admissionregv1.WebhookClientConfig{ - Service: &admissionregv1.ServiceReference{ - Name: "webhook-service", - Namespace: "system", - Path: &path, - }, + if path != "" { + return admissionregv1.WebhookClientConfig{ + Service: &admissionregv1.ServiceReference{ + Name: "webhook-service", + Namespace: "system", + Path: &path, + }, + }, nil } + + url := c.URL + return admissionregv1.WebhookClientConfig{ + URL: &url, + }, nil + } // sideEffects returns the sideEffects config for a webhook. @@ -273,6 +310,15 @@ func (c Config) sideEffects() *admissionregv1.SideEffectClass { return &sideEffects } +// timeoutSeconds returns the timeoutSeconds config for a webhook. +func (c Config) timeoutSeconds() *int32 { + if c.TimeoutSeconds != 0 { + timeoutSeconds := int32(c.TimeoutSeconds) + return &timeoutSeconds + } + return nil +} + // reinvocationPolicy returns the reinvocationPolicy config for a mutating webhook. func (c Config) reinvocationPolicy() *admissionregv1.ReinvocationPolicyType { var reinvocationPolicy admissionregv1.ReinvocationPolicyType @@ -381,6 +427,11 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error { if err := checkSideEffectsForV1(objRaw.Webhooks[i].SideEffects); err != nil { return err } + // TimeoutSeconds must be nil or between 1 and 30 seconds, otherwise, + // return an error + if err := checkTimeoutSeconds(objRaw.Webhooks[i].TimeoutSeconds); err != nil { + return err + } // AdmissionReviewVersions is required in admissionregistration/v1, if this is not set, // return an error if len(objRaw.Webhooks[i].AdmissionReviewVersions) == 0 { @@ -407,6 +458,11 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error { if err := checkSideEffectsForV1(objRaw.Webhooks[i].SideEffects); err != nil { return err } + // TimeoutSeconds must be nil or between 1 and 30 seconds, otherwise, + // return an error + if err := checkTimeoutSeconds(objRaw.Webhooks[i].TimeoutSeconds); err != nil { + return err + } // AdmissionReviewVersions is required in admissionregistration/v1, if this is not set, // return an error if len(objRaw.Webhooks[i].AdmissionReviewVersions) == 0 { @@ -451,3 +507,10 @@ func checkSideEffectsForV1(sideEffects *admissionregv1.SideEffectClass) error { } return nil } + +func checkTimeoutSeconds(timeoutSeconds *int32) error { + if timeoutSeconds != nil && (*timeoutSeconds < 1 || *timeoutSeconds > 30) { + return fmt.Errorf("TimeoutSeconds must be between 1 and 30 seconds") + } + return nil +} diff --git a/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/zz_generated.markerhelp.go b/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/zz_generated.markerhelp.go index 8e1ef419d..4dae86046 100644 --- a/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/zz_generated.markerhelp.go +++ b/tools/vendor/sigs.k8s.io/controller-tools/pkg/webhook/zz_generated.markerhelp.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright2019 The Kubernetes Authors. @@ -49,6 +48,10 @@ func (Config) Help() *markers.DefinitionHelp { Summary: "specify whether calling the webhook will have side effects. This has an impact on dry runs and `kubectl diff`: if the sideEffect is \"Unknown\" (the default) or \"Some\", then the API server will not call the webhook on a dry-run request and fails instead. If the value is \"None\", then the webhook has no side effects and the API server will call it on dry-run. If the value is \"NoneOnDryRun\", then the webhook is responsible for inspecting the \"dryRun\" property of the AdmissionReview sent in the request, and avoiding side effects if that value is \"true.\"", Details: "", }, + "TimeoutSeconds": { + Summary: "allows configuring how long the API server should wait for a webhook to respond before treating the call as a failure. If the timeout expires before the webhook responds, the webhook call will be ignored or the API call will be rejected based on the failure policy. The timeout value must be between 1 and 30 seconds. The timeout for an admission webhook defaults to 10 seconds.", + Details: "", + }, "Groups": { Summary: "specifies the API groups that this webhook receives requests for.", Details: "", diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go b/tools/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go index d2a728498..58297d441 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go @@ -6,7 +6,7 @@ package imagetag import ( "sigs.k8s.io/kustomize/api/filters/filtersutil" - "sigs.k8s.io/kustomize/api/image" + "sigs.k8s.io/kustomize/api/internal/image" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/yaml" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go b/tools/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go index 7549ab700..4815f10a2 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go @@ -7,11 +7,11 @@ import ( "fmt" "strings" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/filters/fieldspec" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/resid" "sigs.k8s.io/kustomize/kyaml/yaml" @@ -64,7 +64,7 @@ func (f Filter) run(node *yaml.RNode) (*yaml.RNode, error) { FieldSpec: f.NameFieldToUpdate, SetValue: f.set, }); err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "updating name reference in '%s' field of '%s'", f.NameFieldToUpdate.Path, f.Referrer.CurId().String()) } @@ -104,7 +104,7 @@ func (f Filter) setMapping(node *yaml.RNode) error { } nameNode, err := node.Pipe(yaml.FieldMatcher{Name: "name"}) if err != nil { - return errors.Wrap(err, "trying to match 'name' field") + return errors.WrapPrefixf(err, "trying to match 'name' field") } if nameNode == nil { // This is a _configuration_ error; the field path @@ -153,7 +153,7 @@ func (f Filter) filterMapCandidatesByNamespace( node *yaml.RNode) ([]*resource.Resource, error) { namespaceNode, err := node.Pipe(yaml.FieldMatcher{Name: "namespace"}) if err != nil { - return nil, errors.Wrap(err, "trying to match 'namespace' field") + return nil, errors.WrapPrefixf(err, "trying to match 'namespace' field") } if namespaceNode == nil { return f.ReferralCandidates.Resources(), nil diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go b/tools/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go index 5173a9554..9279abb9d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go @@ -56,9 +56,11 @@ func (ns Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { // Run runs the filter on a single node rather than a slice func (ns Filter) run(node *yaml.RNode) (*yaml.RNode, error) { - // Special handling for metadata.namespace -- :( + // Special handling for metadata.namespace and metadata.name -- :( // never let SetEntry handle metadata.namespace--it will incorrectly include cluster-scoped resources - ns.FsSlice = ns.removeMetaNamespaceFieldSpecs(ns.FsSlice) + // only update metadata.name if api version is expected one--so-as it leaves other resources of kind namespace alone + apiVersion := node.GetApiVersion() + ns.FsSlice = ns.removeUnneededMetaFieldSpecs(apiVersion, ns.FsSlice) gvk := resid.GvkFromNode(node) if err := ns.metaNamespaceHack(node, gvk); err != nil { return nil, err @@ -79,7 +81,11 @@ func (ns Filter) run(node *yaml.RNode) (*yaml.RNode, error) { CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode CreateTag: yaml.NodeTagString, }) - return node, err + invalidKindErr := &yaml.InvalidNodeKindError{} + if err != nil && errors.As(err, &invalidKindErr) && invalidKindErr.ActualNodeKind() != yaml.ScalarNode { + return nil, errors.WrapPrefixf(err, "namespace field specs must target scalar nodes") + } + return node, errors.WrapPrefixf(err, "namespace transformation failed") } // metaNamespaceHack is a hack for implementing the namespace transform @@ -174,8 +180,7 @@ func setNamespaceField(node *yaml.RNode, setter filtersutil.SetFn) error { func (ns Filter) removeRoleBindingSubjectFieldSpecs(fs types.FsSlice) types.FsSlice { var val types.FsSlice for i := range fs { - if isRoleBinding(fs[i].Kind) && - (fs[i].Path == subjectsNamespacePath || fs[i].Path == subjectsField) { + if isRoleBinding(fs[i].Kind) && fs[i].Path == subjectsNamespacePath { continue } val = append(val, fs[i]) @@ -183,12 +188,15 @@ func (ns Filter) removeRoleBindingSubjectFieldSpecs(fs types.FsSlice) types.FsSl return val } -func (ns Filter) removeMetaNamespaceFieldSpecs(fs types.FsSlice) types.FsSlice { +func (ns Filter) removeUnneededMetaFieldSpecs(apiVersion string, fs types.FsSlice) types.FsSlice { var val types.FsSlice for i := range fs { if fs[i].Path == types.MetadataNamespacePath { continue } + if apiVersion != types.MetadataNamespaceApiVersion && fs[i].Path == types.MetadataNamePath { + continue + } val = append(val, fs[i]) } return val diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go b/tools/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go index 5749d6ddf..d41859465 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go @@ -6,7 +6,7 @@ package patchjson6902 import ( "strings" - jsonpatch "github.com/evanphx/json-patch" + jsonpatch "gopkg.in/evanphx/json-patch.v5" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" k8syaml "sigs.k8s.io/yaml" diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go b/tools/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go index a9330fa14..bea5690c4 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go @@ -4,13 +4,13 @@ package replacement import ( - "errors" "fmt" "strings" "sigs.k8s.io/kustomize/api/internal/utils" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/resid" kyaml_utils "sigs.k8s.io/kustomize/kyaml/utils" "sigs.k8s.io/kustomize/kyaml/yaml" @@ -105,7 +105,7 @@ func getRefinedValue(options *types.FieldOptions, rn *yaml.RNode) (*yaml.RNode, func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targetSelectors []*types.TargetSelector) ([]*yaml.RNode, error) { for _, selector := range targetSelectors { if selector.Select == nil { - return nil, errors.New("target must specify resources to select") + return nil, errors.Errorf("target must specify resources to select") } if len(selector.FieldPaths) == 0 { selector.FieldPaths = []string{types.DefaultReplacementFieldPath} @@ -126,8 +126,8 @@ func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targetSelectors [] } // filter targets by matching resource IDs - for i, id := range ids { - if id.IsSelectedBy(selector.Select.ResId) && !rejectId(selector.Reject, &ids[i]) { + for _, id := range ids { + if id.IsSelectedBy(selector.Select.ResId) && !containsRejectId(selector.Reject, ids) { err := copyValueToTarget(possibleTarget, value, selector) if err != nil { return nil, err @@ -168,10 +168,15 @@ func matchesAnnoAndLabelSelector(n *yaml.RNode, selector *types.Selector) (bool, return annoMatch && labelMatch, nil } -func rejectId(rejects []*types.Selector, id *resid.ResId) bool { +func containsRejectId(rejects []*types.Selector, ids []resid.ResId) bool { for _, r := range rejects { - if !r.ResId.IsEmpty() && id.IsSelectedBy(r.ResId) { - return true + if r.ResId.IsEmpty() { + continue + } + for _, id := range ids { + if id.IsSelectedBy(r.ResId) { + return true + } } } return false @@ -179,29 +184,22 @@ func rejectId(rejects []*types.Selector, id *resid.ResId) bool { func copyValueToTarget(target *yaml.RNode, value *yaml.RNode, selector *types.TargetSelector) error { for _, fp := range selector.FieldPaths { - fieldPath := kyaml_utils.SmarterPathSplitter(fp, ".") - create, err := shouldCreateField(selector.Options, fieldPath) + createKind := yaml.Kind(0) // do not create + if selector.Options != nil && selector.Options.Create { + createKind = value.YNode().Kind + } + targetFieldList, err := target.Pipe(&yaml.PathMatcher{ + Path: kyaml_utils.SmarterPathSplitter(fp, "."), + Create: createKind}) if err != nil { - return err + return errors.WrapPrefixf(err, fieldRetrievalError(fp, createKind != 0)) } - - var targetFields []*yaml.RNode - if create { - createdField, createErr := target.Pipe(yaml.LookupCreate(value.YNode().Kind, fieldPath...)) - if createErr != nil { - return fmt.Errorf("error creating replacement node: %w", createErr) - } - targetFields = append(targetFields, createdField) - } else { - // may return multiple fields, always wrapped in a sequence node - foundFieldSequence, lookupErr := target.Pipe(&yaml.PathMatcher{Path: fieldPath}) - if lookupErr != nil { - return fmt.Errorf("error finding field in replacement target: %w", lookupErr) - } - targetFields, err = foundFieldSequence.Elements() - if err != nil { - return fmt.Errorf("error fetching elements in replacement target: %w", err) - } + targetFields, err := targetFieldList.Elements() + if err != nil { + return errors.WrapPrefixf(err, fieldRetrievalError(fp, createKind != 0)) + } + if len(targetFields) == 0 { + return errors.Errorf(fieldRetrievalError(fp, createKind != 0)) } for _, t := range targetFields { @@ -209,11 +207,17 @@ func copyValueToTarget(target *yaml.RNode, value *yaml.RNode, selector *types.Ta return err } } - } return nil } +func fieldRetrievalError(fieldPath string, isCreate bool) string { + if isCreate { + return fmt.Sprintf("unable to find or create field %q in replacement target", fieldPath) + } + return fmt.Sprintf("unable to find field %q in replacement target", fieldPath) +} + func setFieldValue(options *types.FieldOptions, targetField *yaml.RNode, value *yaml.RNode) error { value = value.Copy() if options != nil && options.Delimiter != "" { @@ -243,16 +247,3 @@ func setFieldValue(options *types.FieldOptions, targetField *yaml.RNode, value * return nil } - -func shouldCreateField(options *types.FieldOptions, fieldPath []string) (bool, error) { - if options == nil || !options.Create { - return false, nil - } - // create option is not supported in a wildcard matching - for _, f := range fieldPath { - if f == "*" { - return false, fmt.Errorf("cannot support create option in a multi-value target") - } - } - return true, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go b/tools/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go index 9fd297478..4cd62dd59 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go @@ -28,12 +28,20 @@ type KvLoader interface { // Loader interface exposes methods to read bytes. type Loader interface { + + // Repo returns the repo location if this Loader was created from a url + // or the empty string otherwise. + Repo() string + // Root returns the root location for this Loader. Root() string + // New returns Loader located at newRoot. New(newRoot string) (Loader, error) + // Load returns the bytes read from the location or an error. Load(location string) ([]byte, error) + // Cleanup cleans the loader Cleanup() error } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go index cac47c0de..afe6da2e7 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go @@ -7,11 +7,11 @@ import ( "encoding/json" "strings" - "github.com/pkg/errors" "k8s.io/kube-openapi/pkg/validation/spec" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/resid" "sigs.k8s.io/yaml" @@ -39,7 +39,7 @@ func LoadConfigFromCRDs( } m, err := makeNameToApiMap(content) if err != nil { - return nil, errors.Wrapf(err, "unable to parse open API definition from '%s'", path) + return nil, errors.WrapPrefixf(err, "unable to parse open API definition from '%s'", path) } otherTc, err := makeConfigFromApiMap(m) if err != nil { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go index 2c1fc71b5..0f4008c97 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go @@ -170,9 +170,10 @@ func (ra *ResAccumulator) FixBackReferences() (err error) { // Intersection drops the resources which "other" does not have. func (ra *ResAccumulator) Intersection(other resmap.ResMap) error { + otherIds := other.AllIds() for _, curId := range ra.resMap.AllIds() { toDelete := true - for _, otherId := range other.AllIds() { + for _, otherId := range otherIds { if otherId == curId { toDelete = false break diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/AnnotationsTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/AnnotationsTransformer.go index 7064fa80c..0910c472b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/AnnotationsTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/AnnotationsTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on AnnotationsTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ConfigMapGenerator.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ConfigMapGenerator.go index d853a1cfd..dc18bce85 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ConfigMapGenerator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ConfigMapGenerator.go @@ -1,5 +1,5 @@ // Code generated by pluginator on ConfigMapGenerator; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HashTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HashTransformer.go index 54586beeb..ec2331265 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HashTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HashTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on HashTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go index 2a654ad1f..d0380f0c5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go @@ -1,12 +1,11 @@ // Code generated by pluginator on HelmChartInflationGenerator; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins import ( "bytes" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -14,14 +13,14 @@ import ( "strings" "github.com/imdario/mergo" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/yaml" ) -// HelmChartInflationGeneratorPlugin is a plugin to generate resources -// from a remote or local helm chart. +// Generate resources from a remote or local helm chart. type HelmChartInflationGeneratorPlugin struct { h *resmap.PluginHelpers types.HelmGlobals @@ -29,8 +28,6 @@ type HelmChartInflationGeneratorPlugin struct { tmpDir string } -var KustomizePlugin HelmChartInflationGeneratorPlugin - const ( valuesMergeOptionMerge = "merge" valuesMergeOptionOverride = "override" @@ -56,6 +53,15 @@ func (p *HelmChartInflationGeneratorPlugin) Config( if h.GeneralConfig().HelmConfig.Command == "" { return fmt.Errorf("must specify --helm-command") } + + // CLI args takes precedence + if h.GeneralConfig().HelmConfig.KubeVersion != "" { + p.HelmChart.KubeVersion = h.GeneralConfig().HelmConfig.KubeVersion + } + if len(h.GeneralConfig().HelmConfig.ApiVersions) != 0 { + p.HelmChart.ApiVersions = h.GeneralConfig().HelmConfig.ApiVersions + } + p.h = h if err = yaml.Unmarshal(config, p); err != nil { return @@ -73,7 +79,7 @@ func (p *HelmChartInflationGeneratorPlugin) establishTmpDir() (err error) { // already done. return nil } - p.tmpDir, err = ioutil.TempDir("", "kustomize-helm-") + p.tmpDir, err = os.MkdirTemp("", "kustomize-helm-") return err } @@ -87,14 +93,22 @@ func (p *HelmChartInflationGeneratorPlugin) validateArgs() (err error) { // the loader root (unless root restrictions are // disabled, in which case this can be an absolute path). if p.ChartHome == "" { - p.ChartHome = "charts" + p.ChartHome = types.HelmDefaultHome } - // The ValuesFile may be consulted by the plugin, so it must + // The ValuesFile(s) may be consulted by the plugin, so it must // be under the loader root (unless root restrictions are // disabled). if p.ValuesFile == "" { - p.ValuesFile = filepath.Join(p.ChartHome, p.Name, "values.yaml") + p.ValuesFile = filepath.Join(p.absChartHome(), p.Name, "values.yaml") + } + for i, file := range p.AdditionalValuesFiles { + // use Load() to enforce root restrictions + if _, err := p.h.Loader().Load(file); err != nil { + return errors.WrapPrefixf(err, "could not load additionalValuesFile") + } + // the additional values filepaths must be relative to the kust root + p.AdditionalValuesFiles[i] = filepath.Join(p.h.Loader().Root(), file) } if err = p.errIfIllegalValuesMerge(); err != nil { @@ -104,7 +118,7 @@ func (p *HelmChartInflationGeneratorPlugin) validateArgs() (err error) { // ConfigHome is not loaded by the plugin, and can be located anywhere. if p.ConfigHome == "" { if err = p.establishTmpDir(); err != nil { - return errors.Wrap( + return errors.WrapPrefixf( err, "unable to create tmp dir for HELM_CONFIG_HOME") } p.ConfigHome = filepath.Join(p.tmpDir, "helm") @@ -127,10 +141,17 @@ func (p *HelmChartInflationGeneratorPlugin) errIfIllegalValuesMerge() error { } func (p *HelmChartInflationGeneratorPlugin) absChartHome() string { + var chartHome string if filepath.IsAbs(p.ChartHome) { - return p.ChartHome + chartHome = p.ChartHome + } else { + chartHome = filepath.Join(p.h.Loader().Root(), p.ChartHome) + } + + if p.Version != "" && p.Repo != "" { + return filepath.Join(chartHome, fmt.Sprintf("%s-%s", p.Name, p.Version)) } - return filepath.Join(p.h.Loader().Root(), p.ChartHome) + return chartHome } func (p *HelmChartInflationGeneratorPlugin) runHelmCommand( @@ -148,10 +169,10 @@ func (p *HelmChartInflationGeneratorPlugin) runHelmCommand( err := cmd.Run() if err != nil { helm := p.h.GeneralConfig().HelmConfig.Command - err = errors.Wrap( + err = errors.WrapPrefixf( fmt.Errorf( - "unable to run: '%s %s' with env=%s (is '%s' installed?)", - helm, strings.Join(args, " "), env, helm), + "unable to run: '%s %s' with env=%s (is '%s' installed?): %w", + helm, strings.Join(args, " "), env, helm, err), stderr.String(), ) } @@ -211,7 +232,7 @@ func (p *HelmChartInflationGeneratorPlugin) writeValuesBytes( return "", fmt.Errorf("cannot create tmp dir to write helm values") } path := filepath.Join(p.tmpDir, p.Name+"-kustomize-values.yaml") - return path, ioutil.WriteFile(path, b, 0644) + return path, errors.WrapPrefixf(os.WriteFile(path, b, 0644), "failed to write values file") } func (p *HelmChartInflationGeneratorPlugin) cleanup() { @@ -244,46 +265,31 @@ func (p *HelmChartInflationGeneratorPlugin) Generate() (rm resmap.ResMap, err er return nil, err } var stdout []byte - stdout, err = p.runHelmCommand(p.templateCommand()) + stdout, err = p.runHelmCommand(p.AsHelmArgs(p.absChartHome())) if err != nil { return nil, err } - rm, err = p.h.ResmapFactory().NewResMapFromBytes(stdout) - if err == nil { + rm, resMapErr := p.h.ResmapFactory().NewResMapFromBytes(stdout) + if resMapErr == nil { return rm, nil } // try to remove the contents before first "---" because // helm may produce messages to stdout before it - stdoutStr := string(stdout) - if idx := strings.Index(stdoutStr, "---"); idx != -1 { - return p.h.ResmapFactory().NewResMapFromBytes([]byte(stdoutStr[idx:])) + r := &kio.ByteReader{Reader: bytes.NewBufferString(string(stdout)), OmitReaderAnnotations: true} + nodes, err := r.Read() + if err != nil { + return nil, fmt.Errorf("error reading helm output: %w", err) } - return nil, err -} -func (p *HelmChartInflationGeneratorPlugin) templateCommand() []string { - args := []string{"template"} - if p.ReleaseName != "" { - args = append(args, p.ReleaseName) - } - if p.Namespace != "" { - args = append(args, "--namespace", p.Namespace) - } - args = append(args, filepath.Join(p.absChartHome(), p.Name)) - if p.ValuesFile != "" { - args = append(args, "--values", p.ValuesFile) - } - if p.ReleaseName == "" { - // AFAICT, this doesn't work as intended due to a bug in helm. - // See https://github.com/helm/helm/issues/6019 - // I've tried placing the flag before and after the name argument. - args = append(args, "--generate-name") - } - if p.IncludeCRDs { - args = append(args, "--include-crds") + if len(nodes) != 0 { + rm, err = p.h.ResmapFactory().NewResMapFromRNodeSlice(nodes) + if err != nil { + return nil, fmt.Errorf("could not parse rnode slice into resource map: %w", err) + } + return rm, nil } - return args + return nil, fmt.Errorf("could not parse bytes into resource map: %w", resMapErr) } func (p *HelmChartInflationGeneratorPlugin) pullCommand() []string { @@ -291,8 +297,18 @@ func (p *HelmChartInflationGeneratorPlugin) pullCommand() []string { "pull", "--untar", "--untardir", p.absChartHome(), - "--repo", p.Repo, - p.Name} + } + + switch { + case strings.HasPrefix(p.Repo, "oci://"): + args = append(args, strings.TrimSuffix(p.Repo, "/")+"/"+p.Name) + case p.Repo != "": + args = append(args, "--repo", p.Repo) + fallthrough + default: + args = append(args, p.Name) + } + if p.Version != "" { args = append(args, "--version", p.Version) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/IAMPolicyGenerator.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/IAMPolicyGenerator.go index 82a2dd603..cfb1fa81b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/IAMPolicyGenerator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/IAMPolicyGenerator.go @@ -1,5 +1,5 @@ // Code generated by pluginator on IAMPolicyGenerator; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ImageTagTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ImageTagTransformer.go index 52a44d385..ffde73a7a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ImageTagTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ImageTagTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on ImageTagTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LabelTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LabelTransformer.go index af601da5b..c45731b54 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LabelTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LabelTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on LabelTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LegacyOrderTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LegacyOrderTransformer.go deleted file mode 100644 index 322cea93a..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/LegacyOrderTransformer.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by pluginator on LegacyOrderTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } - -package builtins - -import ( - "sort" - - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/resource" -) - -// Sort the resources using an ordering defined in the Gvk class. -// This puts cluster-wide basic resources with no -// dependencies (like Namespace, StorageClass, etc.) -// first, and resources with a high number of dependencies -// (like ValidatingWebhookConfiguration) last. -type LegacyOrderTransformerPlugin struct{} - -// Nothing needed for configuration. -func (p *LegacyOrderTransformerPlugin) Config( - _ *resmap.PluginHelpers, _ []byte) (err error) { - return nil -} - -func (p *LegacyOrderTransformerPlugin) Transform(m resmap.ResMap) (err error) { - resources := make([]*resource.Resource, m.Size()) - ids := m.AllIds() - sort.Sort(resmap.IdSlice(ids)) - for i, id := range ids { - resources[i], err = m.GetByCurrentId(id) - if err != nil { - return errors.Wrap(err, "expected match for sorting") - } - } - m.Clear() - for _, r := range resources { - m.Append(r) - } - return nil -} - -func NewLegacyOrderTransformerPlugin() resmap.TransformerPlugin { - return &LegacyOrderTransformerPlugin{} -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go index 71b162a79..30a88340f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on NamespaceTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchJson6902Transformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchJson6902Transformer.go index cb02c4241..d704dff0f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchJson6902Transformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchJson6902Transformer.go @@ -1,17 +1,17 @@ // Code generated by pluginator on PatchJson6902Transformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins import ( "fmt" - jsonpatch "github.com/evanphx/json-patch" - "github.com/pkg/errors" + jsonpatch "gopkg.in/evanphx/json-patch.v5" "sigs.k8s.io/kustomize/api/filters/patchjson6902" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) @@ -61,7 +61,7 @@ func (p *PatchJson6902TransformerPlugin) Config( } p.decodedPatch, err = jsonpatch.DecodePatch([]byte(p.JsonOp)) if err != nil { - return errors.Wrapf(err, "decoding %s", p.JsonOp) + return errors.WrapPrefixf(err, "decoding %s", p.JsonOp) } if len(p.decodedPatch) == 0 { return fmt.Errorf( diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchStrategicMergeTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchStrategicMergeTransformer.go index f93d1266d..d68f2425e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchStrategicMergeTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchStrategicMergeTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on PatchStrategicMergeTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchTransformer.go index dc51748c8..86ee28728 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PatchTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on PatchTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins @@ -7,104 +7,123 @@ import ( "fmt" "strings" - jsonpatch "github.com/evanphx/json-patch" + jsonpatch "gopkg.in/evanphx/json-patch.v5" "sigs.k8s.io/kustomize/api/filters/patchjson6902" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) type PatchTransformerPlugin struct { - loadedPatch *resource.Resource - decodedPatch jsonpatch.Patch - Path string `json:"path,omitempty" yaml:"path,omitempty"` - Patch string `json:"patch,omitempty" yaml:"patch,omitempty"` - Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` - Options map[string]bool `json:"options,omitempty" yaml:"options,omitempty"` + smPatches []*resource.Resource // strategic-merge patches + jsonPatches jsonpatch.Patch // json6902 patch + // patchText is pure patch text created by Path or Patch + patchText string + // patchSource is patch source message + patchSource string + Path string `json:"path,omitempty" yaml:"path,omitempty"` + Patch string `json:"patch,omitempty" yaml:"patch,omitempty"` + Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` + Options map[string]bool `json:"options,omitempty" yaml:"options,omitempty"` } -func (p *PatchTransformerPlugin) Config( - h *resmap.PluginHelpers, c []byte) error { - err := yaml.Unmarshal(c, p) - if err != nil { +func (p *PatchTransformerPlugin) Config(h *resmap.PluginHelpers, c []byte) error { + if err := yaml.Unmarshal(c, p); err != nil { return err } + p.Patch = strings.TrimSpace(p.Patch) - if p.Patch == "" && p.Path == "" { - return fmt.Errorf( - "must specify one of patch and path in\n%s", string(c)) - } - if p.Patch != "" && p.Path != "" { - return fmt.Errorf( - "patch and path can't be set at the same time\n%s", string(c)) - } - if p.Path != "" { - loaded, loadErr := h.Loader().Load(p.Path) - if loadErr != nil { - return loadErr + switch { + case p.Patch == "" && p.Path == "": + return fmt.Errorf("must specify one of patch and path in\n%s", string(c)) + case p.Patch != "" && p.Path != "": + return fmt.Errorf("patch and path can't be set at the same time\n%s", string(c)) + case p.Patch != "": + p.patchText = p.Patch + p.patchSource = fmt.Sprintf("[patch: %q]", p.patchText) + case p.Path != "": + loaded, err := h.Loader().Load(p.Path) + if err != nil { + return fmt.Errorf("failed to get the patch file from path(%s): %w", p.Path, err) } - p.Patch = string(loaded) + p.patchText = string(loaded) + p.patchSource = fmt.Sprintf("[path: %q]", p.Path) } - patchSM, errSM := h.ResmapFactory().RF().FromBytes([]byte(p.Patch)) - patchJson, errJson := jsonPatchFromBytes([]byte(p.Patch)) + patchesSM, errSM := h.ResmapFactory().RF().SliceFromBytes([]byte(p.patchText)) + patchesJson, errJson := jsonPatchFromBytes([]byte(p.patchText)) + if (errSM == nil && errJson == nil) || - (patchSM != nil && patchJson != nil) { + (patchesSM != nil && patchesJson != nil) { return fmt.Errorf( - "illegally qualifies as both an SM and JSON patch: [%v]", - p.Patch) + "illegally qualifies as both an SM and JSON patch: %s", + p.patchSource) } if errSM != nil && errJson != nil { return fmt.Errorf( - "unable to parse SM or JSON patch from [%v]", p.Patch) + "unable to parse SM or JSON patch from %s", p.patchSource) } if errSM == nil { - p.loadedPatch = patchSM - if p.Options["allowNameChange"] { - p.loadedPatch.AllowNameChange() - } - if p.Options["allowKindChange"] { - p.loadedPatch.AllowKindChange() + p.smPatches = patchesSM + for _, loadedPatch := range p.smPatches { + if p.Options["allowNameChange"] { + loadedPatch.AllowNameChange() + } + if p.Options["allowKindChange"] { + loadedPatch.AllowKindChange() + } } } else { - p.decodedPatch = patchJson + p.jsonPatches = patchesJson } return nil } func (p *PatchTransformerPlugin) Transform(m resmap.ResMap) error { - if p.loadedPatch == nil { - return p.transformJson6902(m, p.decodedPatch) + if p.smPatches != nil { + return p.transformStrategicMerge(m) } - // The patch was a strategic merge patch - return p.transformStrategicMerge(m, p.loadedPatch) + return p.transformJson6902(m) } -// transformStrategicMerge applies the provided strategic merge patch -// to all the resources in the ResMap that match either the Target or -// the identifier of the patch. -func (p *PatchTransformerPlugin) transformStrategicMerge(m resmap.ResMap, patch *resource.Resource) error { - if p.Target == nil { - target, err := m.GetById(patch.OrgId()) +// transformStrategicMerge applies each loaded strategic merge patch +// to the resource in the ResMap that matches the identifier of the patch. +// If only one patch is specified, the Target can be used instead. +func (p *PatchTransformerPlugin) transformStrategicMerge(m resmap.ResMap) error { + if p.Target != nil { + if len(p.smPatches) > 1 { + // detail: https://github.com/kubernetes-sigs/kustomize/issues/5049#issuecomment-1440604403 + return fmt.Errorf("Multiple Strategic-Merge Patches in one `patches` entry is not allowed to set `patches.target` field: %s", p.patchSource) + } + + // single patch + patch := p.smPatches[0] + selected, err := m.Select(*p.Target) if err != nil { - return err + return fmt.Errorf("unable to find patch target %q in `resources`: %w", p.Target, err) } - return target.ApplySmPatch(patch) + return errors.Wrap(m.ApplySmPatch(resource.MakeIdSet(selected), patch)) } - selected, err := m.Select(*p.Target) - if err != nil { - return err + + for _, patch := range p.smPatches { + target, err := m.GetById(patch.OrgId()) + if err != nil { + return fmt.Errorf("no resource matches strategic merge patch %q: %w", patch.OrgId(), err) + } + if err := target.ApplySmPatch(patch); err != nil { + return errors.Wrap(err) + } } - return m.ApplySmPatch(resource.MakeIdSet(selected), patch) + return nil } -// transformJson6902 applies the provided json6902 patch -// to all the resources in the ResMap that match the Target. -func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap, patch jsonpatch.Patch) error { +// transformJson6902 applies json6902 Patch to all the resources in the ResMap that match Target. +func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap) error { if p.Target == nil { - return fmt.Errorf("must specify a target for patch %s", p.Patch) + return fmt.Errorf("must specify a target for JSON patch %s", p.patchSource) } resources, err := m.Select(*p.Target) if err != nil { @@ -114,7 +133,7 @@ func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap, patch jsonpa res.StorePreviousId() internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode) err = res.ApplyFilter(patchjson6902.Filter{ - Patch: p.Patch, + Patch: p.patchText, }) if err != nil { return err @@ -129,16 +148,17 @@ func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap, patch jsonpa return nil } -// jsonPatchFromBytes loads a Json 6902 patch from -// a bytes input -func jsonPatchFromBytes( - in []byte) (jsonpatch.Patch, error) { +// jsonPatchFromBytes loads a Json 6902 patch from a bytes input +func jsonPatchFromBytes(in []byte) (jsonpatch.Patch, error) { ops := string(in) if ops == "" { return nil, fmt.Errorf("empty json patch operations") } if ops[0] != '[' { + // TODO(5049): + // In the case of multiple yaml documents, return error instead of ignoring all but first. + // Details: https://github.com/kubernetes-sigs/kustomize/pull/5194#discussion_r1256686728 jsonOps, err := yaml.YAMLToJSON(in) if err != nil { return nil, err diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PrefixTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PrefixTransformer.go index 03040ce0f..33700bb4b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PrefixTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/PrefixTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on PrefixTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplacementTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplacementTransformer.go index 7accb64bf..02cb1927a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplacementTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplacementTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on ReplacementTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplicaCountTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplicaCountTransformer.go index 120fab340..c87d64251 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplicaCountTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ReplicaCountTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on ReplicaCountTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SecretGenerator.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SecretGenerator.go index 5e8581eb9..2a4ef1c90 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SecretGenerator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SecretGenerator.go @@ -1,5 +1,5 @@ // Code generated by pluginator on SecretGenerator; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go new file mode 100644 index 000000000..687f21a60 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go @@ -0,0 +1,244 @@ +// Code generated by pluginator on SortOrderTransformer; DO NOT EDIT. +// pluginator {(devel) unknown } + +package builtins + +import ( + "sort" + "strings" + + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/resid" + "sigs.k8s.io/yaml" +) + +// Sort the resources using a customizable ordering based of Kind. +// Defaults to the ordering of the GVK struct, which puts cluster-wide basic +// resources with no dependencies (like Namespace, StorageClass, etc.) first, +// and resources with a high number of dependencies +// (like ValidatingWebhookConfiguration) last. +type SortOrderTransformerPlugin struct { + SortOptions *types.SortOptions `json:"sortOptions,omitempty" yaml:"sortOptions,omitempty"` +} + +func (p *SortOrderTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) error { + return errors.WrapPrefixf(yaml.Unmarshal(c, p), "Failed to unmarshal SortOrderTransformer config") +} + +func (p *SortOrderTransformerPlugin) applyDefaults() { + // Default to FIFO sort, aka no-op. + if p.SortOptions == nil { + p.SortOptions = &types.SortOptions{ + Order: types.FIFOSortOrder, + } + } + + // If legacy sort is selected and no options are given, default to + // hardcoded order. + if p.SortOptions.Order == types.LegacySortOrder && p.SortOptions.LegacySortOptions == nil { + p.SortOptions.LegacySortOptions = &types.LegacySortOptions{ + OrderFirst: defaultOrderFirst, + OrderLast: defaultOrderLast, + } + } +} + +func (p *SortOrderTransformerPlugin) validate() error { + // Check valid values for SortOrder + if p.SortOptions.Order != types.FIFOSortOrder && p.SortOptions.Order != types.LegacySortOrder { + return errors.Errorf("the field 'sortOptions.order' must be one of [%s, %s]", + types.FIFOSortOrder, types.LegacySortOrder) + } + + // Validate that the only options set are the ones corresponding to the + // selected sort order. + if p.SortOptions.Order == types.FIFOSortOrder && + p.SortOptions.LegacySortOptions != nil { + return errors.Errorf("the field 'sortOptions.legacySortOptions' is"+ + " set but the selected sort order is '%v', not 'legacy'", + p.SortOptions.Order) + } + return nil +} + +func (p *SortOrderTransformerPlugin) Transform(m resmap.ResMap) (err error) { + p.applyDefaults() + err = p.validate() + if err != nil { + return err + } + + // Sort + if p.SortOptions.Order == types.LegacySortOrder { + s := newLegacyIDSorter(m.AllIds(), p.SortOptions.LegacySortOptions) + sort.Sort(s) + err = applyOrdering(m, s.resids) + if err != nil { + return err + } + } + return nil +} + +// applyOrdering takes resources (given in ResMap) and a desired ordering given +// as a sequence of ResIds, and updates the ResMap's resources to match the +// ordering. +func applyOrdering(m resmap.ResMap, ordering []resid.ResId) error { + var err error + resources := make([]*resource.Resource, m.Size()) + // Clear and refill with the correct order + for i, id := range ordering { + resources[i], err = m.GetByCurrentId(id) + if err != nil { + return errors.WrapPrefixf(err, "expected match for sorting") + } + } + m.Clear() + for _, r := range resources { + err = m.Append(r) + if err != nil { + return errors.WrapPrefixf(err, "SortOrderTransformer: Failed to append to resources") + } + } + return nil +} + +// Code for legacy sorting. +// Legacy sorting is a "fixed" order sorting maintained for backwards +// compatibility. + +// legacyIDSorter sorts resources based on two priority lists: +// - orderFirst: Resources that should be placed in the start, in the given order. +// - orderLast: Resources that should be placed in the end, in the given order. +type legacyIDSorter struct { + // resids only stores the metadata of the object. This is an optimization as + // it's expensive to compute these again and again during ordering. + resids []resid.ResId + typeOrders map[string]int +} + +func newLegacyIDSorter( + resids []resid.ResId, + options *types.LegacySortOptions) *legacyIDSorter { + // Precalculate a resource ranking based on the priority lists. + var typeOrders = func() map[string]int { + m := map[string]int{} + for i, n := range options.OrderFirst { + m[n] = -len(options.OrderFirst) + i + } + for i, n := range options.OrderLast { + m[n] = 1 + i + } + return m + }() + return &legacyIDSorter{ + resids: resids, + typeOrders: typeOrders, + } +} + +var _ sort.Interface = legacyIDSorter{} + +func (a legacyIDSorter) Len() int { return len(a.resids) } +func (a legacyIDSorter) Swap(i, j int) { + a.resids[i], a.resids[j] = a.resids[j], a.resids[i] +} +func (a legacyIDSorter) Less(i, j int) bool { + if !a.resids[i].Gvk.Equals(a.resids[j].Gvk) { + return gvkLessThan(a.resids[i].Gvk, a.resids[j].Gvk, a.typeOrders) + } + return legacyResIDSortString(a.resids[i]) < legacyResIDSortString(a.resids[j]) +} + +func gvkLessThan(gvk1, gvk2 resid.Gvk, typeOrders map[string]int) bool { + index1 := typeOrders[gvk1.Kind] + index2 := typeOrders[gvk2.Kind] + if index1 != index2 { + return index1 < index2 + } + return legacyGVKSortString(gvk1) < legacyGVKSortString(gvk2) +} + +// legacyGVKSortString returns a string representation of given GVK used for +// stable sorting. +func legacyGVKSortString(x resid.Gvk) string { + legacyNoGroup := "~G" + legacyNoVersion := "~V" + legacyNoKind := "~K" + legacyFieldSeparator := "_" + + g := x.Group + if g == "" { + g = legacyNoGroup + } + v := x.Version + if v == "" { + v = legacyNoVersion + } + k := x.Kind + if k == "" { + k = legacyNoKind + } + return strings.Join([]string{g, v, k}, legacyFieldSeparator) +} + +// legacyResIDSortString returns a string representation of given ResID used for +// stable sorting. +func legacyResIDSortString(id resid.ResId) string { + legacyNoNamespace := "~X" + legacyNoName := "~N" + legacySeparator := "|" + + ns := id.Namespace + if ns == "" { + ns = legacyNoNamespace + } + nm := id.Name + if nm == "" { + nm = legacyNoName + } + return strings.Join( + []string{id.Gvk.String(), ns, nm}, legacySeparator) +} + +// DO NOT CHANGE! +// Final legacy ordering provided as a default by kustomize. +// Originally an attempt to apply resources in the correct order, an effort +// which later proved impossible as not all types are known beforehand. +// See: https://github.com/kubernetes-sigs/kustomize/issues/3913 +var defaultOrderFirst = []string{ //nolint:gochecknoglobals + "Namespace", + "ResourceQuota", + "StorageClass", + "CustomResourceDefinition", + "ServiceAccount", + "PodSecurityPolicy", + "Role", + "ClusterRole", + "RoleBinding", + "ClusterRoleBinding", + "ConfigMap", + "Secret", + "Endpoints", + "Service", + "LimitRange", + "PriorityClass", + "PersistentVolume", + "PersistentVolumeClaim", + "Deployment", + "StatefulSet", + "CronJob", + "PodDisruptionBudget", +} +var defaultOrderLast = []string{ //nolint:gochecknoglobals + "MutatingWebhookConfiguration", + "ValidatingWebhookConfiguration", +} + +func NewSortOrderTransformerPlugin() resmap.TransformerPlugin { + return &SortOrderTransformerPlugin{} +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SuffixTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SuffixTransformer.go index 2b389d8e5..31b5b8fea 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SuffixTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/SuffixTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on SuffixTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ValueAddTransformer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ValueAddTransformer.go index c2c460ab9..1d70c98c2 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ValueAddTransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/builtins/ValueAddTransformer.go @@ -1,5 +1,5 @@ // Code generated by pluginator on ValueAddTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } +// pluginator {(devel) unknown } package builtins diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go index d6ea5fbf0..b570c7e91 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go @@ -5,6 +5,8 @@ package generators import ( "fmt" + "path" + "strings" "github.com/go-errors/errors" "sigs.k8s.io/kustomize/api/ifc" @@ -95,3 +97,28 @@ func setImmutable( return nil } + +// ParseFileSource parses the source given. +// +// Acceptable formats include: +// 1. source-path: the basename will become the key name +// 2. source-name=source-path: the source-name will become the key name and +// source-path is the path to the key file. +// +// Key names cannot include '='. +func ParseFileSource(source string) (keyName, filePath string, err error) { + numSeparators := strings.Count(source, "=") + switch { + case numSeparators == 0: + return path.Base(source), source, nil + case numSeparators == 1 && strings.HasPrefix(source, "="): + return "", "", errors.Errorf("missing key name for file path %q in source %q", strings.TrimPrefix(source, "="), source) + case numSeparators == 1 && strings.HasSuffix(source, "="): + return "", "", errors.Errorf("missing file path for key name %q in source %q", strings.TrimSuffix(source, "="), source) + case numSeparators > 1: + return "", "", errors.Errorf("source %q key name or file path contains '='", source) + default: + components := strings.Split(source, "=") + return components[0], components[1], nil + } +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go index 78f4f32cb..2098cdd31 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go @@ -22,15 +22,17 @@ func ClonerUsingGitExec(repoSpec *RepoSpec) error { if err = r.run("init"); err != nil { return err } - if err = r.run( - "remote", "add", "origin", repoSpec.CloneSpec()); err != nil { + // git relative submodule need origin, see https://github.com/kubernetes-sigs/kustomize/issues/5131 + if err = r.run("remote", "add", "origin", repoSpec.CloneSpec()); err != nil { return err } ref := "HEAD" if repoSpec.Ref != "" { ref = repoSpec.Ref } - if err = r.run("fetch", "--depth=1", "origin", ref); err != nil { + // we use repoSpec.CloneSpec() instead of origin because on error, + // the prior prints the actual repo url for the user. + if err = r.run("fetch", "--depth=1", repoSpec.CloneSpec(), ref); err != nil { return err } if err = r.run("checkout", "FETCH_HEAD"); err != nil { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go index fcc7130cd..134eb41c5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go @@ -7,8 +7,8 @@ import ( "os/exec" "time" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/internal/utils" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -24,7 +24,7 @@ type gitRunner struct { func newCmdRunner(timeout time.Duration) (*gitRunner, error) { gitProgram, err := exec.LookPath("git") if err != nil { - return nil, errors.Wrap(err, "no 'git' program on path") + return nil, errors.WrapPrefixf(err, "no 'git' program on path") } dir, err := filesys.NewTmpConfirmedDir() if err != nil { @@ -46,9 +46,9 @@ func (r gitRunner) run(args ...string) error { cmd.String(), r.duration, func() error { - _, err := cmd.CombinedOutput() + out, err := cmd.CombinedOutput() if err != nil { - return errors.Wrapf(err, "git cmd = '%s'", cmd.String()) + return errors.WrapPrefixf(err, "failed to run '%s': %s", cmd.String(), string(out)) } return err }) diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go index 996f0cf23..ba6156cc5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go @@ -5,12 +5,15 @@ package git import ( "fmt" + "log" "net/url" "path/filepath" + "regexp" "strconv" "strings" "time" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -27,26 +30,23 @@ type RepoSpec struct { // TODO(monopole): Drop raw, use processed fields instead. raw string - // Host, e.g. github.com + // Host, e.g. https://github.com/ Host string - // orgRepo name (organization/repoName), + // RepoPath name (Path to repository), // e.g. kubernetes-sigs/kustomize - OrgRepo string + RepoPath string - // Dir where the orgRepo is cloned to. + // Dir is where the repository is cloned to. Dir filesys.ConfirmedDir // Relative path in the repository, and in the cloneDir, // to a Kustomization. - Path string + KustRootPath string // Branch or tag reference. Ref string - // e.g. .git or empty in case of _git is present - GitSuffix string - // Submodules indicates whether or not to clone git submodules. Submodules bool @@ -56,10 +56,7 @@ type RepoSpec struct { // CloneSpec returns a string suitable for "git clone {spec}". func (x *RepoSpec) CloneSpec() string { - if isAzureHost(x.Host) || isAWSHost(x.Host) { - return x.Host + x.OrgRepo - } - return x.Host + x.OrgRepo + x.GitSuffix + return x.Host + x.RepoPath } func (x *RepoSpec) CloneDir() filesys.ConfirmedDir { @@ -71,81 +68,140 @@ func (x *RepoSpec) Raw() string { } func (x *RepoSpec) AbsPath() string { - return x.Dir.Join(x.Path) + return x.Dir.Join(x.KustRootPath) } func (x *RepoSpec) Cleaner(fSys filesys.FileSystem) func() error { return func() error { return fSys.RemoveAll(x.Dir.String()) } } +const ( + refQuery = "?ref=" + gitSuffix = ".git" + gitRootDelimiter = "_git/" + pathSeparator = "/" // do not use filepath.Separator, as this is a URL +) + // NewRepoSpecFromURL parses git-like urls. // From strings like git@github.com:someOrg/someRepo.git or // https://github.com/someOrg/someRepo?ref=someHash, extract -// the parts. +// the different parts of URL, set into a RepoSpec object and return RepoSpec object. +// It MUST return an error if the input is not a git-like URL, as this is used by some code paths +// to distinguish between local and remote paths. +// +// In particular, NewRepoSpecFromURL separates the URL used to clone the repo from the +// elements Kustomize uses for other purposes (e.g. query params that turn into args, and +// the path to the kustomization root within the repo). func NewRepoSpecFromURL(n string) (*RepoSpec, error) { + repoSpec := &RepoSpec{raw: n, Dir: notCloned, Timeout: defaultTimeout, Submodules: defaultSubmodules} if filepath.IsAbs(n) { return nil, fmt.Errorf("uri looks like abs path: %s", n) } - host, orgRepo, path, gitRef, gitSubmodules, suffix, gitTimeout := parseGitURL(n) - if orgRepo == "" { - return nil, fmt.Errorf("url lacks orgRepo: %s", n) + + // Parse the query first. This is safe because according to rfc3986 "?" is only allowed in the + // query and is not recognized %-encoded. + // Note that parseQuery returns default values for empty parameters. + n, query, _ := strings.Cut(n, "?") + repoSpec.Ref, repoSpec.Timeout, repoSpec.Submodules = parseQuery(query) + + var err error + + // Parse the host (e.g. scheme, username, domain) segment. + repoSpec.Host, n, err = extractHost(n) + if err != nil { + return nil, err } - if host == "" { - return nil, fmt.Errorf("url lacks host: %s", n) + + // In some cases, we're given a path to a git repo + a path to the kustomization root within + // that repo. We need to split them so that we can ultimately give the repo only to the cloner. + repoSpec.RepoPath, repoSpec.KustRootPath, err = parsePathParts(n, defaultRepoPathLength(repoSpec.Host)) + if err != nil { + return nil, err } - return &RepoSpec{ - raw: n, Host: host, OrgRepo: orgRepo, - Dir: notCloned, Path: path, Ref: gitRef, GitSuffix: suffix, - Submodules: gitSubmodules, Timeout: gitTimeout}, nil + + return repoSpec, nil } -const ( - refQuery = "?ref=" - gitSuffix = ".git" - gitDelimiter = "_git/" -) +const allSegments = -999999 +const orgRepoSegments = 2 -// From strings like git@github.com:someOrg/someRepo.git or -// https://github.com/someOrg/someRepo?ref=someHash, extract -// the parts. -func parseGitURL(n string) ( - host string, orgRepo string, path string, gitRef string, gitSubmodules bool, gitSuff string, gitTimeout time.Duration) { - if strings.Contains(n, gitDelimiter) { - index := strings.Index(n, gitDelimiter) - // Adding _git/ to host - host = normalizeGitHostSpec(n[:index+len(gitDelimiter)]) - orgRepo = strings.Split(strings.Split(n[index+len(gitDelimiter):], "/")[0], "?")[0] - path, gitRef, gitTimeout, gitSubmodules = peelQuery(n[index+len(gitDelimiter)+len(orgRepo):]) - return +func defaultRepoPathLength(host string) int { + if strings.HasPrefix(host, fileScheme) { + return allSegments } - host, n = parseHostSpec(n) - gitSuff = gitSuffix - if strings.Contains(n, gitSuffix) { - index := strings.Index(n, gitSuffix) - orgRepo = n[0:index] - n = n[index+len(gitSuffix):] - if len(n) > 0 && n[0] == '/' { - n = n[1:] - } - path, gitRef, gitTimeout, gitSubmodules = peelQuery(n) - return + return orgRepoSegments +} + +// parsePathParts splits the repo path that will ultimately be passed to git to clone the +// repo from the kustomization root path, which Kustomize will execute the build in after the repo +// is cloned. +// +// We first try to do this based on explicit markers in the URL (e.g. _git, .git or //). +// If none are present, we try to apply a historical default repo path length that is derived from +// Github URLs. If there aren't enough segments, we have historically considered the URL invalid. +func parsePathParts(n string, defaultSegmentLength int) (string, string, error) { + repoPath, kustRootPath, success := tryExplicitMarkerSplit(n) + if !success { + repoPath, kustRootPath, success = tryDefaultLengthSplit(n, defaultSegmentLength) + } + + // Validate the result + if !success || len(repoPath) == 0 { + return "", "", fmt.Errorf("failed to parse repo path segment") } + if kustRootPathExitsRepo(kustRootPath) { + return "", "", fmt.Errorf("url path exits repo: %s", n) + } + + return repoPath, strings.TrimPrefix(kustRootPath, pathSeparator), nil +} - i := strings.Index(n, "/") - if i < 1 { - path, gitRef, gitTimeout, gitSubmodules = peelQuery(n) - return +func tryExplicitMarkerSplit(n string) (string, string, bool) { + // Look for the _git delimiter, which by convention is expected to be ONE directory above the repo root. + // If found, split on the NEXT path element, which is the repo root. + // Example: https://username@dev.azure.com/org/project/_git/repo/path/to/kustomization/root + if gitRootIdx := strings.Index(n, gitRootDelimiter); gitRootIdx >= 0 { + gitRootPath := n[:gitRootIdx+len(gitRootDelimiter)] + subpathSegments := strings.Split(n[gitRootIdx+len(gitRootDelimiter):], pathSeparator) + return gitRootPath + subpathSegments[0], strings.Join(subpathSegments[1:], pathSeparator), true + + // Look for a double-slash in the path, which if present separates the repo root from the kust path. + // It is a convention, not a real path element, so do not preserve it in the returned value. + // Example: https://github.com/org/repo//path/to/kustomozation/root + } else if repoRootIdx := strings.Index(n, "//"); repoRootIdx >= 0 { + return n[:repoRootIdx], n[repoRootIdx+2:], true + + // Look for .git in the path, which if present is part of the directory name of the git repo. + // This means we want to grab everything up to and including that suffix + // Example: https://github.com/org/repo.git/path/to/kustomozation/root + } else if gitSuffixIdx := strings.Index(n, gitSuffix); gitSuffixIdx >= 0 { + upToGitSuffix := n[:gitSuffixIdx+len(gitSuffix)] + afterGitSuffix := n[gitSuffixIdx+len(gitSuffix):] + return upToGitSuffix, afterGitSuffix, true } - j := strings.Index(n[i+1:], "/") - if j >= 0 { - j += i + 1 - orgRepo = n[:j] - path, gitRef, gitTimeout, gitSubmodules = peelQuery(n[j+1:]) - return + return "", "", false +} + +func tryDefaultLengthSplit(n string, defaultSegmentLength int) (string, string, bool) { + // If the default is to take all segments, do so. + if defaultSegmentLength == allSegments { + return n, "", true + + // If the default is N segments, make sure we have at least that many and take them if so. + // If we have less than N, we have historically considered the URL invalid. + } else if segments := strings.Split(n, pathSeparator); len(segments) >= defaultSegmentLength { + firstNSegments := strings.Join(segments[:defaultSegmentLength], pathSeparator) + rest := strings.Join(segments[defaultSegmentLength:], pathSeparator) + return firstNSegments, rest, true } - path = "" - orgRepo, gitRef, gitTimeout, gitSubmodules = peelQuery(n) - return host, orgRepo, path, gitRef, gitSubmodules, gitSuff, gitTimeout + return "", "", false +} + +func kustRootPathExitsRepo(kustRootPath string) bool { + cleanedPath := filepath.Clean(strings.TrimPrefix(kustRootPath, string(filepath.Separator))) + pathElements := strings.Split(cleanedPath, string(filepath.Separator)) + return len(pathElements) > 0 && + pathElements[0] == filesys.ParentDir } // Clone git submodules by default. @@ -154,14 +210,12 @@ const defaultSubmodules = true // Arbitrary, but non-infinite, timeout for running commands. const defaultTimeout = 27 * time.Second -func peelQuery(arg string) (string, string, time.Duration, bool) { - // Parse the given arg into a URL. In the event of a parse failure, return - // our defaults. - parsed, err := url.Parse(arg) +func parseQuery(query string) (string, time.Duration, bool) { + values, err := url.ParseQuery(query) + // in event of parse failure, return defaults if err != nil { - return arg, "", defaultTimeout, defaultSubmodules + return "", defaultTimeout, defaultSubmodules } - values := parsed.Query() // ref is the desired git ref to target. Can be specified by in a git URL // with ?ref= or ?version=, although ref takes precedence. @@ -192,76 +246,142 @@ func peelQuery(arg string) (string, string, time.Duration, bool) { } } - return parsed.Path, ref, duration, submodules + return ref, duration, submodules } -func parseHostSpec(n string) (string, string) { - var host string - // Start accumulating the host part. - for _, p := range []string{ - // Order matters here. - "git::", "gh:", "ssh://", "https://", "http://", - "git@", "github.com:", "github.com/"} { - if len(p) < len(n) && strings.ToLower(n[:len(p)]) == p { - n = n[len(p):] - host += p - } +func extractHost(n string) (string, string, error) { + n = ignoreForcedGitProtocol(n) + scheme, n := extractScheme(n) + username, n := extractUsername(n) + stdGithub := isStandardGithubHost(n) + acceptSCP := acceptSCPStyle(scheme, username, stdGithub) + + // Validate the username and scheme before attempting host/path parsing, because if the parsing + // so far has not succeeded, we will not be able to extract the host and path correctly. + if err := validateScheme(scheme, acceptSCP); err != nil { + return "", "", err } - if host == "git@" { - i := strings.Index(n, "/") - if i > -1 { - host += n[:i+1] - n = n[i+1:] - } else { - i = strings.Index(n, ":") - if i > -1 { - host += n[:i+1] - n = n[i+1:] - } - } - return host, n + + // Now that we have extracted a valid scheme+username, we can parse host itself. + + // The file protocol specifies an absolute path to a local git repo. + // Everything after the scheme (including any 'username' we found) is actually part of that path. + if scheme == fileScheme { + return scheme, username + n, nil + } + var host, rest = n, "" + if sepIndex := findPathSeparator(n, acceptSCP); sepIndex >= 0 { + host, rest = n[:sepIndex+1], n[sepIndex+1:] } - // If host is a http(s) or ssh URL, grab the domain part. - for _, p := range []string{ - "ssh://", "https://", "http://"} { - if strings.HasSuffix(host, p) { - i := strings.Index(n, "/") - if i > -1 { - host += n[0 : i+1] - n = n[i+1:] - } - break - } + // Github URLs are strictly normalized in a way that may discard scheme and username components. + if stdGithub { + scheme, username, host = normalizeGithubHostParts(scheme, username) + } + + // Host is required, so do not concat the scheme and username if we didn't find one. + if host == "" { + return "", "", errors.Errorf("failed to parse host segment") } + return scheme + username + host, rest, nil +} + +// ignoreForcedGitProtocol strips the "git::" prefix from URLs. +// We used to use go-getter to handle our urls: https://github.com/hashicorp/go-getter. +// The git:: prefix signaled go-getter to use the git protocol to fetch the url's contents. +// We silently strip this prefix to allow these go-getter-style urls to continue to work, +// although the git protocol (which is insecure and unsupported on many platforms, including Github) +// will not actually be used as intended. +func ignoreForcedGitProtocol(n string) string { + n, found := trimPrefixIgnoreCase(n, "git::") + if found { + log.Println("Warning: Forcing the git protocol using the 'git::' URL prefix is not supported. " + + "Kustomize currently strips this invalid prefix, but will stop doing so in a future release. " + + "Please remove the 'git::' prefix from your configuration.") + } + return n +} + +// acceptSCPStyle returns true if the scheme and username indicate potential use of an SCP-style URL. +// With this style, the scheme is not explicit and the path is delimited by a colon. +// Strictly speaking the username is optional in SCP-like syntax, but Kustomize has always +// required it for non-Github URLs. +// Example: user@host.xz:path/to/repo.git/ +func acceptSCPStyle(scheme, username string, isGithubURL bool) bool { + return scheme == "" && (username != "" || isGithubURL) +} - return normalizeGitHostSpec(host), n +func validateScheme(scheme string, acceptSCPStyle bool) error { + // see https://git-scm.com/docs/git-fetch#_git_urls for info relevant to these validations + switch scheme { + case "": + // Empty scheme is only ok if it's a Github URL or if it looks like SCP-style syntax + if !acceptSCPStyle { + return fmt.Errorf("failed to parse scheme") + } + case sshScheme, fileScheme, httpsScheme, httpScheme: + // These are all supported schemes + default: + // At time of writing, we should never end up here because we do not parse out + // unsupported schemes to begin with. + return fmt.Errorf("unsupported scheme %q", scheme) + } + return nil } -func normalizeGitHostSpec(host string) string { - s := strings.ToLower(host) - if strings.Contains(s, "github.com") { - if strings.Contains(s, "git@") || strings.Contains(s, "ssh:") { - host = "git@github.com:" - } else { - host = "https://github.com/" +const fileScheme = "file://" +const httpScheme = "http://" +const httpsScheme = "https://" +const sshScheme = "ssh://" + +func extractScheme(s string) (string, string) { + for _, prefix := range []string{sshScheme, httpsScheme, httpScheme, fileScheme} { + if rest, found := trimPrefixIgnoreCase(s, prefix); found { + return prefix, rest } } - if strings.HasPrefix(s, "git::") { - host = strings.TrimPrefix(s, "git::") + return "", s +} + +func extractUsername(s string) (string, string) { + var userRegexp = regexp.MustCompile(`^([a-zA-Z][a-zA-Z0-9-]*)@`) + if m := userRegexp.FindStringSubmatch(s); m != nil { + username := m[1] + "@" + return username, s[len(username):] + } + return "", s +} + +func isStandardGithubHost(s string) bool { + lowerCased := strings.ToLower(s) + return strings.HasPrefix(lowerCased, "github.com/") || + strings.HasPrefix(lowerCased, "github.com:") +} + +// trimPrefixIgnoreCase returns the rest of s and true if prefix, ignoring case, prefixes s. +// Otherwise, trimPrefixIgnoreCase returns s and false. +func trimPrefixIgnoreCase(s, prefix string) (string, bool) { + if len(prefix) <= len(s) && strings.ToLower(s[:len(prefix)]) == prefix { + return s[len(prefix):], true } - return host + return s, false } -// The format of Azure repo URL is documented -// https://docs.microsoft.com/en-us/azure/devops/repos/git/clone?view=vsts&tabs=visual-studio#clone_url -func isAzureHost(host string) bool { - return strings.Contains(host, "dev.azure.com") || - strings.Contains(host, "visualstudio.com") +func findPathSeparator(hostPath string, acceptSCP bool) int { + sepIndex := strings.Index(hostPath, pathSeparator) + if acceptSCP { + colonIndex := strings.Index(hostPath, ":") + // The colon acts as a delimiter in scp-style ssh URLs only if not prefixed by '/'. + if sepIndex == -1 || (colonIndex > 0 && colonIndex < sepIndex) { + sepIndex = colonIndex + } + } + return sepIndex } -// The format of AWS repo URL is documented -// https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html -func isAWSHost(host string) bool { - return strings.Contains(host, "amazonaws.com") +func normalizeGithubHostParts(scheme, username string) (string, string, string) { + if strings.HasPrefix(scheme, sshScheme) || username != "" { + return "", username, "github.com:" + } + return httpsScheme, "", "github.com/" } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/image/image.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/image/image.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/image/image.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/image/image.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/commonannotations.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/commonannotations.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/commonlabels.go similarity index 78% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/commonlabels.go index 7775a544f..b2a78f568 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/commonlabels.go @@ -5,9 +5,6 @@ package builtinpluginconsts const commonLabelFieldSpecs = ` commonLabels: -- path: metadata/labels - create: true - - path: spec/selector create: true version: v1 @@ -17,20 +14,10 @@ commonLabels: create: true version: v1 kind: ReplicationController - -- path: spec/template/metadata/labels - create: true - version: v1 - kind: ReplicationController - - path: spec/selector/matchLabels create: true kind: Deployment -- path: spec/template/metadata/labels - create: true - kind: Deployment - - path: spec/template/spec/affinity/podAffinity/preferredDuringSchedulingIgnoredDuringExecution/podAffinityTerm/labelSelector/matchLabels create: false group: apps @@ -60,28 +47,15 @@ commonLabels: create: true kind: ReplicaSet -- path: spec/template/metadata/labels - create: true - kind: ReplicaSet - - path: spec/selector/matchLabels create: true kind: DaemonSet -- path: spec/template/metadata/labels - create: true - kind: DaemonSet - - path: spec/selector/matchLabels create: true group: apps kind: StatefulSet -- path: spec/template/metadata/labels - create: true - group: apps - kind: StatefulSet - - path: spec/template/spec/affinity/podAffinity/preferredDuringSchedulingIgnoredDuringExecution/podAffinityTerm/labelSelector/matchLabels create: false group: apps @@ -107,36 +81,16 @@ commonLabels: group: apps kind: StatefulSet -- path: spec/volumeClaimTemplates[]/metadata/labels - create: true - group: apps - kind: StatefulSet - - path: spec/selector/matchLabels create: false group: batch kind: Job -- path: spec/template/metadata/labels - create: true - group: batch - kind: Job - - path: spec/jobTemplate/spec/selector/matchLabels create: false group: batch kind: CronJob -- path: spec/jobTemplate/metadata/labels - create: true - group: batch - kind: CronJob - -- path: spec/jobTemplate/spec/template/metadata/labels - create: true - group: batch - kind: CronJob - - path: spec/selector/matchLabels create: false group: policy @@ -156,4 +110,4 @@ commonLabels: create: false group: networking.k8s.io kind: NetworkPolicy -` +` + metadataLabelsFieldSpecs diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/defaultconfig.go similarity index 93% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/defaultconfig.go index 29673d76a..2f220cb29 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/defaultconfig.go @@ -13,6 +13,7 @@ func GetDefaultFieldSpecs() []byte { []byte(namePrefixFieldSpecs), []byte(nameSuffixFieldSpecs), []byte(commonLabelFieldSpecs), + []byte(templateLabelFieldSpecs), []byte(commonAnnotationFieldSpecs), []byte(namespaceFieldSpecs), []byte(varReferenceFieldSpecs), @@ -30,6 +31,7 @@ func GetDefaultFieldSpecsAsMap() map[string]string { result["nameprefix"] = namePrefixFieldSpecs result["namesuffix"] = nameSuffixFieldSpecs result["commonlabels"] = commonLabelFieldSpecs + result["templatelabels"] = templateLabelFieldSpecs result["commonannotations"] = commonAnnotationFieldSpecs result["namespace"] = namespaceFieldSpecs result["varreference"] = varReferenceFieldSpecs diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/doc.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/doc.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/images.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/images.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/metadatalabels.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/metadatalabels.go new file mode 100644 index 000000000..d070cca4b --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/metadatalabels.go @@ -0,0 +1,51 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const metadataLabelsFieldSpecs = ` +- path: metadata/labels + create: true + +- path: spec/template/metadata/labels + create: true + version: v1 + kind: ReplicationController + +- path: spec/template/metadata/labels + create: true + kind: Deployment + +- path: spec/template/metadata/labels + create: true + kind: ReplicaSet + +- path: spec/template/metadata/labels + create: true + kind: DaemonSet + +- path: spec/template/metadata/labels + create: true + group: apps + kind: StatefulSet + +- path: spec/volumeClaimTemplates[]/metadata/labels + create: true + group: apps + kind: StatefulSet + +- path: spec/template/metadata/labels + create: true + group: batch + kind: Job + +- path: spec/jobTemplate/metadata/labels + create: true + group: batch + kind: CronJob + +- path: spec/jobTemplate/spec/template/metadata/labels + create: true + group: batch + kind: CronJob +` diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/nameprefix.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/nameprefix.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namereference.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namereference.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namespace.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namespace.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namesuffix.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namesuffix.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namesuffix.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/namesuffix.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/replicas.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/replicas.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/templatelabels.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/templatelabels.go new file mode 100644 index 000000000..5d3c9c195 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/templatelabels.go @@ -0,0 +1,8 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const templateLabelFieldSpecs = ` +templateLabels: +` + metadataLabelsFieldSpecs diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/varreference.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts/varreference.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/loader/errors.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/errors.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/loader/errors.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/errors.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/fileloader.go similarity index 64% rename from tools/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/fileloader.go index 3201e8509..6ecc9fcef 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/fileloader.go @@ -5,7 +5,7 @@ package loader import ( "fmt" - "io/ioutil" + "io" "log" "net/http" "net/url" @@ -18,7 +18,14 @@ import ( "sigs.k8s.io/kustomize/kyaml/filesys" ) -// fileLoader is a kustomization's interface to files. +// IsRemoteFile returns whether path has a url scheme that kustomize allows for +// remote files. See https://github.com/kubernetes-sigs/kustomize/blob/master/examples/remoteBuild.md +func IsRemoteFile(path string) bool { + u, err := url.Parse(path) + return err == nil && (u.Scheme == "http" || u.Scheme == "https") +} + +// FileLoader is a kustomization's interface to files. // // The directory in which a kustomization file sits // is referred to below as the kustomization's _root_. @@ -31,49 +38,48 @@ import ( // // * supplemental data paths // -// `Load` is used to visit these paths. +// `Load` is used to visit these paths. // -// These paths refer to resources, patches, -// data for ConfigMaps and Secrets, etc. +// These paths refer to resources, patches, +// data for ConfigMaps and Secrets, etc. // -// The loadRestrictor may disallow certain paths -// or classes of paths. +// The loadRestrictor may disallow certain paths +// or classes of paths. // // * bases (other kustomizations) // -// `New` is used to load bases. +// `New` is used to load bases. // -// A base can be either a remote git repo URL, or -// a directory specified relative to the current -// root. In the former case, the repo is locally -// cloned, and the new loader is rooted on a path -// in that clone. +// A base can be either a remote git repo URL, or +// a directory specified relative to the current +// root. In the former case, the repo is locally +// cloned, and the new loader is rooted on a path +// in that clone. // -// As loaders create new loaders, a root history -// is established, and used to disallow: +// As loaders create new loaders, a root history +// is established, and used to disallow: // -// - A base that is a repository that, in turn, -// specifies a base repository seen previously -// in the loading stack (a cycle). +// - A base that is a repository that, in turn, +// specifies a base repository seen previously +// in the loading stack (a cycle). // -// - An overlay depending on a base positioned at -// or above it. I.e. '../foo' is OK, but '.', -// '..', '../..', etc. are disallowed. Allowing -// such a base has no advantages and encourages -// cycles, particularly if some future change -// were to introduce globbing to file -// specifications in the kustomization file. +// - An overlay depending on a base positioned at +// or above it. I.e. '../foo' is OK, but '.', +// '..', '../..', etc. are disallowed. Allowing +// such a base has no advantages and encourages +// cycles, particularly if some future change +// were to introduce globbing to file +// specifications in the kustomization file. // // These restrictions assure that kustomizations // are self-contained and relocatable, and impose // some safety when relying on remote kustomizations, // e.g. a remotely loaded ConfigMap generator specified // to read from /etc/passwd will fail. -// -type fileLoader struct { +type FileLoader struct { // Loader that spawned this loader. // Used to avoid cycles. - referrer *fileLoader + referrer *FileLoader // An absolute, cleaned path to a directory. // The Load function will read non-absolute @@ -100,29 +106,24 @@ type fileLoader struct { cleaner func() error } -// NewFileLoaderAtCwd returns a loader that loads from PWD. -// A convenience for kustomize edit commands. -func NewFileLoaderAtCwd(fSys filesys.FileSystem) *fileLoader { - return newLoaderOrDie( - RestrictionRootOnly, fSys, filesys.SelfDir) -} - -// NewFileLoaderAtRoot returns a loader that loads from "/". -// A convenience for tests. -func NewFileLoaderAtRoot(fSys filesys.FileSystem) *fileLoader { - return newLoaderOrDie( - RestrictionRootOnly, fSys, filesys.Separator) +// Repo returns the absolute path to the repo that contains Root if this fileLoader was created from a url +// or the empty string otherwise. +func (fl *FileLoader) Repo() string { + if fl.repoSpec != nil { + return fl.repoSpec.Dir.String() + } + return "" } // Root returns the absolute path that is prepended to any // relative paths used in Load. -func (fl *fileLoader) Root() string { +func (fl *FileLoader) Root() string { return fl.root.String() } -func newLoaderOrDie( +func NewLoaderOrDie( lr LoadRestrictorFunc, - fSys filesys.FileSystem, path string) *fileLoader { + fSys filesys.FileSystem, path string) *FileLoader { root, err := filesys.ConfirmDir(fSys, path) if err != nil { log.Fatalf("unable to make loader at '%s'; %v", path, err) @@ -131,12 +132,12 @@ func newLoaderOrDie( lr, root, fSys, nil, git.ClonerUsingGitExec) } -// newLoaderAtConfirmedDir returns a new fileLoader with given root. +// newLoaderAtConfirmedDir returns a new FileLoader with given root. func newLoaderAtConfirmedDir( lr LoadRestrictorFunc, root filesys.ConfirmedDir, fSys filesys.FileSystem, - referrer *fileLoader, cloner git.Cloner) *fileLoader { - return &fileLoader{ + referrer *FileLoader, cloner git.Cloner) *FileLoader { + return &FileLoader{ loadRestrictor: lr, root: root, referrer: referrer, @@ -148,7 +149,7 @@ func newLoaderAtConfirmedDir( // New returns a new Loader, rooted relative to current loader, // or rooted in a temp directory holding a git repo clone. -func (fl *fileLoader) New(path string) (ifc.Loader, error) { +func (fl *FileLoader) New(path string) (ifc.Loader, error) { if path == "" { return nil, errors.Errorf("new root cannot be empty") } @@ -184,7 +185,7 @@ func (fl *fileLoader) New(path string) (ifc.Loader, error) { // directory holding a cloned git repo. func newLoaderAtGitClone( repoSpec *git.RepoSpec, fSys filesys.FileSystem, - referrer *fileLoader, cloner git.Cloner) (ifc.Loader, error) { + referrer *FileLoader, cloner git.Cloner) (ifc.Loader, error) { cleaner := repoSpec.Cleaner(fSys) err := cloner(repoSpec) if err != nil { @@ -206,7 +207,14 @@ func newLoaderAtGitClone( "'%s' refers to file '%s'; expecting directory", repoSpec.AbsPath(), f) } - return &fileLoader{ + // Path in repo can contain symlinks that exit repo. We can only + // check for this after cloning repo. + if !root.HasPrefix(repoSpec.CloneDir()) { + _ = cleaner() + return nil, fmt.Errorf("%q refers to directory outside of repo %q", repoSpec.AbsPath(), + repoSpec.CloneDir()) + } + return &FileLoader{ // Clones never allowed to escape root. loadRestrictor: RestrictionRootOnly, root: root, @@ -218,7 +226,7 @@ func newLoaderAtGitClone( }, nil } -func (fl *fileLoader) errIfGitContainmentViolation( +func (fl *FileLoader) errIfGitContainmentViolation( base filesys.ConfirmedDir) error { containingRepo := fl.containingRepo() if containingRepo == nil { @@ -236,7 +244,7 @@ func (fl *fileLoader) errIfGitContainmentViolation( // Looks back through referrers for a git repo, returning nil // if none found. -func (fl *fileLoader) containingRepo() *git.RepoSpec { +func (fl *FileLoader) containingRepo() *git.RepoSpec { if fl.repoSpec != nil { return fl.repoSpec } @@ -248,7 +256,7 @@ func (fl *fileLoader) containingRepo() *git.RepoSpec { // errIfArgEqualOrHigher tests whether the argument, // is equal to or above the root of any ancestor. -func (fl *fileLoader) errIfArgEqualOrHigher( +func (fl *FileLoader) errIfArgEqualOrHigher( candidateRoot filesys.ConfirmedDir) error { if fl.root.HasPrefix(candidateRoot) { return fmt.Errorf( @@ -265,7 +273,7 @@ func (fl *fileLoader) errIfArgEqualOrHigher( // I.e. Allow a distinction between git URI with // path foo and tag bar and a git URI with the same // path but a different tag? -func (fl *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { +func (fl *FileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { // TODO(monopole): Use parsed data instead of Raw(). if fl.repoSpec != nil && strings.HasPrefix(fl.repoSpec.Raw(), newRepoSpec.Raw()) { @@ -282,31 +290,9 @@ func (fl *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { // Load returns the content of file at the given path, // else an error. Relative paths are taken relative // to the root. -func (fl *fileLoader) Load(path string) ([]byte, error) { - if u, err := url.Parse(path); err == nil && (u.Scheme == "http" || u.Scheme == "https") { - var hc *http.Client - if fl.http != nil { - hc = fl.http - } else { - hc = &http.Client{} - } - resp, err := hc.Get(path) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode < 200 || resp.StatusCode > 299 { - _, err := git.NewRepoSpecFromURL(path) - if err == nil { - return nil, errors.Errorf("URL is a git repository") - } - return nil, fmt.Errorf("%w: status code %d (%s)", ErrHTTP, resp.StatusCode, http.StatusText(resp.StatusCode)) - } - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - return body, nil +func (fl *FileLoader) Load(path string) ([]byte, error) { + if IsRemoteFile(path) { + return fl.httpClientGetContent(path) } if !filepath.IsAbs(path) { path = fl.root.Join(path) @@ -318,7 +304,31 @@ func (fl *fileLoader) Load(path string) ([]byte, error) { return fl.fSys.ReadFile(path) } +func (fl *FileLoader) httpClientGetContent(path string) ([]byte, error) { + var hc *http.Client + if fl.http != nil { + hc = fl.http + } else { + hc = &http.Client{} + } + resp, err := hc.Get(path) + if err != nil { + return nil, errors.Wrap(err) + } + defer resp.Body.Close() + // response unsuccessful + if resp.StatusCode < 200 || resp.StatusCode > 299 { + _, err = git.NewRepoSpecFromURL(path) + if err == nil { + return nil, errors.Errorf("URL is a git repository") + } + return nil, fmt.Errorf("%w: status code %d (%s)", ErrHTTP, resp.StatusCode, http.StatusText(resp.StatusCode)) + } + content, err := io.ReadAll(resp.Body) + return content, errors.Wrap(err) +} + // Cleanup runs the cleaner. -func (fl *fileLoader) Cleanup() error { +func (fl *FileLoader) Cleanup() error { return fl.cleaner() } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/loader/loader.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/loader.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/loader/loader.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/loader.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/loadrestrictions.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go rename to tools/vendor/sigs.k8s.io/kustomize/api/internal/loader/loadrestrictions.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/builtinplugins.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/builtinplugins.go new file mode 100644 index 000000000..c9f48c7c3 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/builtinplugins.go @@ -0,0 +1,152 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import ( + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/filters/fsslice" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/resid" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// localizeBuiltinPlugins localizes built-in plugins with file paths. +// Note that this excludes helm, which needs a repo. +type localizeBuiltinPlugins struct { + lc *localizer + + // locPathFn is used by localizeNode to set the localized path on the plugin. + locPathFn func(string) (string, error) +} + +var _ kio.Filter = &localizeBuiltinPlugins{} + +// Filter localizes the built-in plugins with file paths. +func (lbp *localizeBuiltinPlugins) Filter(plugins []*yaml.RNode) ([]*yaml.RNode, error) { + for _, singlePlugin := range plugins { + err := singlePlugin.PipeE(fsslice.Filter{ + FsSlice: types.FsSlice{ + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.ConfigMapGenerator.String()}, + Path: "env", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.ConfigMapGenerator.String()}, + Path: "envs", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.SecretGenerator.String()}, + Path: "env", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.SecretGenerator.String()}, + Path: "envs", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.HelmChartInflationGenerator.String()}, + Path: "valuesFile", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.HelmChartInflationGenerator.String()}, + Path: "additionalValuesFiles", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.PatchTransformer.String()}, + Path: "path", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.PatchJson6902Transformer.String()}, + Path: "path", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.ReplacementTransformer.String()}, + Path: "replacements/path", + }, + }, + SetValue: func(node *yaml.RNode) error { + lbp.locPathFn = lbp.lc.localizeFile + return lbp.localizeAll(node) + }, + }, + fsslice.Filter{ + FsSlice: types.FsSlice{ + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.ConfigMapGenerator.String()}, + Path: "files", + }, + types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.SecretGenerator.String()}, + Path: "files", + }, + }, + SetValue: func(node *yaml.RNode) error { + lbp.locPathFn = lbp.lc.localizeFileSource + return lbp.localizeAll(node) + }, + }, + yaml.FilterFunc(func(node *yaml.RNode) (*yaml.RNode, error) { + isHelm := node.GetApiVersion() == konfig.BuiltinPluginApiVersion && + node.GetKind() == builtinhelpers.HelmChartInflationGenerator.String() + if !isHelm { + return node, nil + } + home, err := node.Pipe(yaml.Lookup("chartHome")) + if err != nil { + return nil, errors.Wrap(err) + } + if home == nil { + _, err = lbp.lc.copyChartHomeEntry("") + } else { + lbp.locPathFn = lbp.lc.copyChartHomeEntry + err = lbp.localizeScalar(home) + } + return node, errors.WrapPrefixf(err, "plugin %s", resid.FromRNode(node)) + }), + fieldspec.Filter{ + FieldSpec: types.FieldSpec{ + Gvk: resid.Gvk{Version: konfig.BuiltinPluginApiVersion, Kind: builtinhelpers.PatchStrategicMergeTransformer.String()}, + Path: "paths", + }, + SetValue: func(node *yaml.RNode) error { + lbp.locPathFn = lbp.lc.localizeK8sResource + return lbp.localizeAll(node) + }, + }) + if err != nil { + return nil, errors.Wrap(err) + } + } + return plugins, nil +} + +// localizeAll sets each entry in node to its value localized by locPathFn. +// Node is a sequence or scalar value. +func (lbp *localizeBuiltinPlugins) localizeAll(node *yaml.RNode) error { + // We rely on the build command to throw errors for nodes in + // built-in plugins that are sequences when expected to be scalar, + // and vice versa. + //nolint: exhaustive + switch node.YNode().Kind { + case yaml.SequenceNode: + return errors.Wrap(node.VisitElements(lbp.localizeScalar)) + case yaml.ScalarNode: + return lbp.localizeScalar(node) + default: + return errors.Errorf("expected sequence or scalar node") + } +} + +// localizeScalar sets the scalar node to its value localized by locPathFn. +func (lbp *localizeBuiltinPlugins) localizeScalar(node *yaml.RNode) error { + localizedPath, err := lbp.locPathFn(node.YNode().Value) + if err != nil { + return err + } + return filtersutil.SetScalar(localizedPath)(node) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/doc.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/doc.go new file mode 100644 index 000000000..b7995adfd --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/doc.go @@ -0,0 +1,7 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package localizer contains utilities for the command kustomize localize, which is +// documented under proposals/localize-command or at +// https://github.com/kubernetes-sigs/kustomize/blob/master/proposals/22-04-localize-command.md +package localizer diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/errors.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/errors.go new file mode 100644 index 000000000..90437b420 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/errors.go @@ -0,0 +1,27 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import "fmt" + +type ResourceLoadError struct { + InlineError error + FileError error +} + +func (rle ResourceLoadError) Error() string { + return fmt.Sprintf(`when parsing as inline received error: %s +when parsing as filepath received error: %s`, rle.InlineError, rle.FileError) +} + +type PathLocalizeError struct { + Path string + FileError error + RootError error +} + +func (ple PathLocalizeError) Error() string { + return fmt.Sprintf(`could not localize path %q as file: %s; could not localize path %q as directory: %s`, + ple.Path, ple.FileError, ple.Path, ple.RootError) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/localizer.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/localizer.go new file mode 100644 index 000000000..71de9dd6f --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/localizer.go @@ -0,0 +1,613 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import ( + "io/fs" + "log" + "os" + "path/filepath" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/generators" + "sigs.k8s.io/kustomize/api/internal/loader" + "sigs.k8s.io/kustomize/api/internal/target" + "sigs.k8s.io/kustomize/api/provider" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" + "sigs.k8s.io/yaml" +) + +// localizer encapsulates all state needed to localize the root at ldr. +type localizer struct { + fSys filesys.FileSystem + + // underlying type is Loader + ldr ifc.Loader + + // root is at ldr.Root() + root filesys.ConfirmedDir + + rFactory *resmap.Factory + + // destination directory in newDir that mirrors root + dst string +} + +// Run attempts to localize the kustomization root at target with the given localize arguments +// and returns the path to the created newDir. +func Run(target, scope, newDir string, fSys filesys.FileSystem) (string, error) { + ldr, args, err := NewLoader(target, scope, newDir, fSys) + if err != nil { + return "", errors.Wrap(err) + } + defer func() { _ = ldr.Cleanup() }() + + toDst, err := filepath.Rel(args.Scope.String(), args.Target.String()) + if err != nil { + log.Panicf("cannot find path from %q to child directory %q: %s", args.Scope, args.Target, err) + } + dst := args.NewDir.Join(toDst) + if err = fSys.MkdirAll(dst); err != nil { + return "", errors.WrapPrefixf(err, "unable to create directory in localize destination") + } + + err = (&localizer{ + fSys: fSys, + ldr: ldr, + root: args.Target, + rFactory: resmap.NewFactory(provider.NewDepProvider().GetResourceFactory()), + dst: dst, + }).localize() + if err != nil { + errCleanup := fSys.RemoveAll(args.NewDir.String()) + if errCleanup != nil { + log.Printf("unable to clean localize destination: %s", errCleanup) + } + return "", errors.WrapPrefixf(err, "unable to localize target %q", target) + } + return args.NewDir.String(), nil +} + +// localize localizes the root that lc is at +func (lc *localizer) localize() error { + kustomization, kustFileName, err := lc.load() + if err != nil { + return err + } + err = lc.localizeNativeFields(kustomization) + if err != nil { + return err + } + err = lc.localizeBuiltinPlugins(kustomization) + if err != nil { + return err + } + + content, err := yaml.Marshal(kustomization) + if err != nil { + return errors.WrapPrefixf(err, "unable to serialize localized kustomization file") + } + if err = lc.fSys.WriteFile(filepath.Join(lc.dst, kustFileName), content); err != nil { + return errors.WrapPrefixf(err, "unable to write localized kustomization file") + } + return nil +} + +// load returns the kustomization at lc.root and the file name under which it was found +func (lc *localizer) load() (*types.Kustomization, string, error) { + content, kustFileName, err := target.LoadKustFile(lc.ldr) + if err != nil { + return nil, "", errors.Wrap(err) + } + + var kust types.Kustomization + err = (&kust).Unmarshal(content) + if err != nil { + return nil, "", errors.Wrap(err) + } + + // Localize intentionally does not replace legacy fields to return a localized kustomization + // with as much resemblance to the original as possible. + // Localize also intentionally does not enforce fields, as localize does not wish to unnecessarily + // repeat the responsibilities of kustomize build. + + return &kust, kustFileName, nil +} + +// localizeNativeFields localizes paths on kustomize-native fields, like configMapGenerator, that kustomize has a +// built-in understanding of. This excludes helm-related fields, such as `helmGlobals` and `helmCharts`. +func (lc *localizer) localizeNativeFields(kust *types.Kustomization) error { + if path, exists := kust.OpenAPI["path"]; exists { + locPath, err := lc.localizeFile(path) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize openapi path") + } + kust.OpenAPI["path"] = locPath + } + + for fieldName, field := range map[string]struct { + paths []string + locFn func(string) (string, error) + }{ + "bases": { + // Allow use of deprecated field + //nolint:staticcheck + kust.Bases, + lc.localizeRoot, + }, + "components": { + kust.Components, + lc.localizeRoot, + }, + "configurations": { + kust.Configurations, + lc.localizeFile, + }, + "crds": { + kust.Crds, + lc.localizeFile, + }, + "resources": { + kust.Resources, + lc.localizeResource, + }, + } { + for i, path := range field.paths { + locPath, err := field.locFn(path) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize %s entry", fieldName) + } + field.paths[i] = locPath + } + } + + for i := range kust.ConfigMapGenerator { + if err := lc.localizeGenerator(&kust.ConfigMapGenerator[i].GeneratorArgs); err != nil { + return errors.WrapPrefixf(err, "unable to localize configMapGenerator") + } + } + for i := range kust.SecretGenerator { + if err := lc.localizeGenerator(&kust.SecretGenerator[i].GeneratorArgs); err != nil { + return errors.WrapPrefixf(err, "unable to localize secretGenerator") + } + } + if err := lc.localizeHelmInflationGenerator(kust); err != nil { + return err + } + if err := lc.localizeHelmCharts(kust); err != nil { + return err + } + if err := lc.localizePatches(kust.Patches); err != nil { + return errors.WrapPrefixf(err, "unable to localize patches") + } + //nolint:staticcheck + if err := lc.localizePatches(kust.PatchesJson6902); err != nil { + return errors.WrapPrefixf(err, "unable to localize patchesJson6902") + } + //nolint:staticcheck + for i, patch := range kust.PatchesStrategicMerge { + locPath, err := lc.localizeK8sResource(string(patch)) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize patchesStrategicMerge entry") + } + kust.PatchesStrategicMerge[i] = types.PatchStrategicMerge(locPath) + } + for i, replacement := range kust.Replacements { + locPath, err := lc.localizeFile(replacement.Path) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize replacements entry") + } + kust.Replacements[i].Path = locPath + } + return nil +} + +// localizeGenerator localizes the file paths on generator. +func (lc *localizer) localizeGenerator(generator *types.GeneratorArgs) error { + locEnvSrc, err := lc.localizeFile(generator.EnvSource) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize generator env file") + } + locEnvs := make([]string, len(generator.EnvSources)) + for i, env := range generator.EnvSources { + locEnvs[i], err = lc.localizeFile(env) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize generator envs file") + } + } + locFiles := make([]string, len(generator.FileSources)) + for i, file := range generator.FileSources { + locFiles[i], err = lc.localizeFileSource(file) + if err != nil { + return err + } + } + generator.EnvSource = locEnvSrc + generator.EnvSources = locEnvs + generator.FileSources = locFiles + return nil +} + +// localizeFileSource returns the localized file source found in configMap and +// secretGenerators. +func (lc *localizer) localizeFileSource(source string) (string, error) { + key, file, err := generators.ParseFileSource(source) + if err != nil { + return "", errors.Wrap(err) + } + locFile, err := lc.localizeFile(file) + if err != nil { + return "", errors.WrapPrefixf(err, "invalid file source %q", source) + } + var locSource string + if source == file { + locSource = locFile + } else { + locSource = key + "=" + locFile + } + return locSource, nil +} + +// localizeHelmInflationGenerator localizes helmChartInflationGenerator on kust. +// localizeHelmInflationGenerator localizes values files and copies local chart homes. +func (lc *localizer) localizeHelmInflationGenerator(kust *types.Kustomization) error { + for i, chart := range kust.HelmChartInflationGenerator { + locFile, err := lc.localizeFile(chart.Values) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize helmChartInflationGenerator entry %d values", i) + } + kust.HelmChartInflationGenerator[i].Values = locFile + + locDir, err := lc.copyChartHomeEntry(chart.ChartHome) + if err != nil { + return errors.WrapPrefixf(err, "unable to copy helmChartInflationGenerator entry %d", i) + } + kust.HelmChartInflationGenerator[i].ChartHome = locDir + } + return nil +} + +// localizeHelmCharts localizes helmCharts and helmGlobals on kust. +// localizeHelmCharts localizes values files and copies a local chart home. +func (lc *localizer) localizeHelmCharts(kust *types.Kustomization) error { + for i, chart := range kust.HelmCharts { + locFile, err := lc.localizeFile(chart.ValuesFile) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize helmCharts entry %d valuesFile", i) + } + kust.HelmCharts[i].ValuesFile = locFile + + for j, valuesFile := range chart.AdditionalValuesFiles { + locFile, err = lc.localizeFile(valuesFile) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize helmCharts entry %d additionalValuesFiles", i) + } + kust.HelmCharts[i].AdditionalValuesFiles[j] = locFile + } + } + if kust.HelmGlobals != nil { + locDir, err := lc.copyChartHomeEntry(kust.HelmGlobals.ChartHome) + if err != nil { + return errors.WrapPrefixf(err, "unable to copy helmGlobals") + } + kust.HelmGlobals.ChartHome = locDir + } else if len(kust.HelmCharts) > 0 { + _, err := lc.copyChartHomeEntry("") + if err != nil { + return errors.WrapPrefixf(err, "unable to copy default chart home") + } + } + return nil +} + +// localizePatches localizes the file paths on patches if they are non-empty +func (lc *localizer) localizePatches(patches []types.Patch) error { + for i := range patches { + locPath, err := lc.localizeFile(patches[i].Path) + if err != nil { + return err + } + patches[i].Path = locPath + } + return nil +} + +// localizeResource localizes resource path, a file or root, and returns the +// localized path +func (lc *localizer) localizeResource(path string) (string, error) { + var locPath string + + content, fileErr := lc.ldr.Load(path) + // The following check catches the case where path is a repo root. + // Load on a repo will successfully return its README in HTML. + // Because HTML does not follow resource formatting, we then correctly try + // to localize path as a root. + if fileErr == nil { + _, resErr := lc.rFactory.NewResMapFromBytes(content) + if resErr != nil { + fileErr = errors.WrapPrefixf(resErr, "invalid resource at file %q", path) + } else { + locPath, fileErr = lc.localizeFileWithContent(path, content) + } + } + if fileErr != nil { + var rootErr error + locPath, rootErr = lc.localizeRoot(path) + if rootErr != nil { + err := PathLocalizeError{ + Path: path, + FileError: fileErr, + RootError: rootErr, + } + return "", err + } + } + return locPath, nil +} + +// localizeFile localizes file path if set and returns the localized path +func (lc *localizer) localizeFile(path string) (string, error) { + // Some localizable fields can be empty, for example, replacements.path. + // We rely on the build command to throw errors for the ones that cannot. + if path == "" { + return "", nil + } + content, err := lc.ldr.Load(path) + if err != nil { + return "", errors.Wrap(err) + } + return lc.localizeFileWithContent(path, content) +} + +// localizeFileWithContent writes content to the localized file path and returns the localized path. +func (lc *localizer) localizeFileWithContent(path string, content []byte) (string, error) { + var locPath string + if loader.IsRemoteFile(path) { + if lc.fSys.Exists(lc.root.Join(LocalizeDir)) { + return "", errors.Errorf("%s already contains %s needed to store file %q", lc.root, LocalizeDir, path) + } + locPath = locFilePath(path) + } else { + // ldr has checked that path must be relative; this is subject to change in beta. + + // We must clean path to: + // 1. avoid symlinks. A `kustomize build` run will fail if we write files to + // symlink paths outside the current root, given that we don't want to recreate + // the symlinks. Even worse, we could be writing files outside the localize destination. + // 2. avoid paths that temporarily traverse outside the current root, + // i.e. ../../../scope/target/current-root. The localized file will be surrounded by + // different directories than its source, and so an uncleaned path may no longer be valid. + locPath = cleanFilePath(lc.fSys, lc.root, path) + } + absPath := filepath.Join(lc.dst, locPath) + if err := lc.fSys.MkdirAll(filepath.Dir(absPath)); err != nil { + return "", errors.WrapPrefixf(err, "unable to create directories to localize file %q", path) + } + if err := lc.fSys.WriteFile(absPath, content); err != nil { + return "", errors.WrapPrefixf(err, "unable to localize file %q", path) + } + return locPath, nil +} + +// localizeRoot localizes root path if set and returns the localized path +func (lc *localizer) localizeRoot(path string) (string, error) { + if path == "" { + return "", nil + } + ldr, err := lc.ldr.New(path) + if err != nil { + return "", errors.Wrap(err) + } + defer func() { _ = ldr.Cleanup() }() + + root, err := filesys.ConfirmDir(lc.fSys, ldr.Root()) + if err != nil { + log.Panicf("unable to establish validated root reference %q: %s", path, err) + } + var locPath string + if repo := ldr.Repo(); repo != "" { + if lc.fSys.Exists(lc.root.Join(LocalizeDir)) { + return "", errors.Errorf("%s already contains %s needed to store root %q", lc.root, LocalizeDir, path) + } + locPath, err = locRootPath(path, repo, root, lc.fSys) + if err != nil { + return "", err + } + } else { + locPath, err = filepath.Rel(lc.root.String(), root.String()) + if err != nil { + log.Panicf("cannot find relative path between scoped localize roots %q and %q: %s", lc.root, root, err) + } + } + newDst := filepath.Join(lc.dst, locPath) + if err = lc.fSys.MkdirAll(newDst); err != nil { + return "", errors.WrapPrefixf(err, "unable to create root %q in localize destination", path) + } + err = (&localizer{ + fSys: lc.fSys, + ldr: ldr, + root: root, + rFactory: lc.rFactory, + dst: newDst, + }).localize() + if err != nil { + return "", errors.WrapPrefixf(err, "unable to localize root %q", path) + } + return locPath, nil +} + +// copyChartHomeEntry copies the helm chart home entry to lc dst +// at the same location relative to the root and returns said relative path. +// If entry is empty, copyChartHomeEntry returns the empty string. +// If entry does not exist, copyChartHome returns entry. +// +// copyChartHomeEntry copies the default home to the same location at dst, +// without following symlinks. An empty entry also indicates the default home. +func (lc *localizer) copyChartHomeEntry(entry string) (string, error) { + path := entry + if entry == "" { + path = types.HelmDefaultHome + } + if filepath.IsAbs(path) { + return "", errors.Errorf("absolute path %q not handled in alpha", path) + } + isDefault := lc.root.Join(path) == lc.root.Join(types.HelmDefaultHome) + locPath, err := lc.copyChartHome(path, !isDefault) + if err != nil { + return "", errors.WrapPrefixf(err, "unable to copy home %q", entry) + } + if entry == "" { + return "", nil + } + return locPath, nil +} + +// copyChartHome copies path relative to lc root to dst and returns the +// copied location relative to dst. If clean is true, copyChartHome uses path's +// delinked location as the copy destination. +// +// If path does not exist, copyChartHome returns path. +func (lc *localizer) copyChartHome(path string, clean bool) (string, error) { + path, err := filepath.Rel(lc.root.String(), lc.root.Join(path)) + if err != nil { + return "", errors.WrapPrefixf(err, "no path to chart home %q", path) + } + // Chart home may serve as untar destination. + // Note that we don't check if path is in scope. + if !lc.fSys.Exists(lc.root.Join(path)) { + return path, nil + } + // Perform localize directory checks. + ldr, err := lc.ldr.New(path) + if err != nil { + return "", errors.WrapPrefixf(err, "invalid chart home") + } + cleaned, err := filesys.ConfirmDir(lc.fSys, ldr.Root()) + if err != nil { + log.Panicf("unable to confirm validated directory %q: %s", ldr.Root(), err) + } + toDst := path + if clean { + toDst, err = filepath.Rel(lc.root.String(), cleaned.String()) + if err != nil { + log.Panicf("no path between scoped directories %q and %q: %s", lc.root, cleaned, err) + } + } + // Note this check does not guarantee that we copied the entire directory. + if dst := filepath.Join(lc.dst, toDst); !lc.fSys.Exists(dst) { + err = lc.copyDir(cleaned, filepath.Join(lc.dst, toDst)) + if err != nil { + return "", errors.WrapPrefixf(err, "unable to copy chart home %q", path) + } + } + return toDst, nil +} + +// copyDir copies src to dst. copyDir does not follow symlinks. +func (lc *localizer) copyDir(src filesys.ConfirmedDir, dst string) error { + err := lc.fSys.Walk(src.String(), + func(path string, info fs.FileInfo, err error) error { + if err != nil { + return err + } + pathToCreate, err := filepath.Rel(src.String(), path) + if err != nil { + log.Panicf("no path from %q to child file %q: %s", src, path, err) + } + pathInDst := filepath.Join(dst, pathToCreate) + if info.Mode()&os.ModeSymlink == os.ModeSymlink { + return nil + } + if info.IsDir() { + err = lc.fSys.MkdirAll(pathInDst) + } else { + var content []byte + content, err = lc.fSys.ReadFile(path) + if err != nil { + return errors.Wrap(err) + } + err = lc.fSys.WriteFile(pathInDst, content) + } + return errors.Wrap(err) + }) + if err != nil { + return errors.WrapPrefixf(err, "unable to copy directory %q", src) + } + return nil +} + +// localizeBuiltinPlugins localizes built-in plugins on kust that can contain file paths. The built-in plugins +// can be inline or in a file. This excludes the HelmChartInflationGenerator. +// +// Note that the localization in this function has not been implemented yet. +func (lc *localizer) localizeBuiltinPlugins(kust *types.Kustomization) error { + for fieldName, entries := range map[string][]string{ + "generators": kust.Generators, + "transformers": kust.Transformers, + "validators": kust.Validators, + } { + for i, entry := range entries { + rm, isPath, err := lc.loadK8sResource(entry) + if err != nil { + return errors.WrapPrefixf(err, "unable to load %s entry", fieldName) + } + err = rm.ApplyFilter(&localizeBuiltinPlugins{lc: lc}) + if err != nil { + return errors.Wrap(err) + } + localizedPlugin, err := rm.AsYaml() + if err != nil { + return errors.WrapPrefixf(err, "unable to serialize localized %s entry %q", fieldName, entry) + } + var localizedEntry string + if isPath { + localizedEntry, err = lc.localizeFileWithContent(entry, localizedPlugin) + if err != nil { + return errors.WrapPrefixf(err, "unable to localize %s entry", fieldName) + } + } else { + localizedEntry = string(localizedPlugin) + } + entries[i] = localizedEntry + } + } + return nil +} + +// localizeK8sResource returns the localized resourceEntry if it is a file +// containing a kubernetes resource. +// localizeK8sResource returns resourceEntry if it is an inline resource. +func (lc *localizer) localizeK8sResource(resourceEntry string) (string, error) { + _, isFile, err := lc.loadK8sResource(resourceEntry) + if err != nil { + return "", err + } + if isFile { + return lc.localizeFile(resourceEntry) + } + return resourceEntry, nil +} + +// loadK8sResource tries to load resourceEntry as a file path or inline +// kubernetes resource. +// On success, loadK8sResource returns the loaded resource map and whether +// resourceEntry is a file path. +func (lc *localizer) loadK8sResource(resourceEntry string) (resmap.ResMap, bool, error) { + rm, inlineErr := lc.rFactory.NewResMapFromBytes([]byte(resourceEntry)) + if inlineErr != nil { + var fileErr error + rm, fileErr = lc.rFactory.FromFile(lc.ldr, resourceEntry) + if fileErr != nil { + err := ResourceLoadError{ + InlineError: inlineErr, + FileError: fileErr, + } + return nil, false, errors.WrapPrefixf(err, "unable to load resource entry %q", resourceEntry) + } + } + return rm, inlineErr != nil, nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/locloader.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/locloader.go new file mode 100644 index 000000000..1d1072bd1 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/locloader.go @@ -0,0 +1,135 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import ( + "path/filepath" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/git" + "sigs.k8s.io/kustomize/api/internal/loader" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +// Args holds localize arguments +type Args struct { + // target; local copy if remote + Target filesys.ConfirmedDir + + // directory that bounds target's local references + // repo directory of local copy if target is remote + Scope filesys.ConfirmedDir + + // localize destination + NewDir filesys.ConfirmedDir +} + +// Loader is an ifc.Loader that enforces additional constraints specific to kustomize localize. +type Loader struct { + fSys filesys.FileSystem + + args *Args + + // loader at Loader's current directory + ifc.Loader + + // whether Loader and all its ancestors are the result of local references + local bool +} + +var _ ifc.Loader = &Loader{} + +// NewLoader is the factory method for Loader, under localize constraints, at rawTarget. For invalid localize arguments, +// NewLoader returns an error. +func NewLoader(rawTarget string, rawScope string, rawNewDir string, fSys filesys.FileSystem) (*Loader, Args, error) { + // check earlier to avoid cleanup + repoSpec, err := git.NewRepoSpecFromURL(rawTarget) + if err == nil && repoSpec.Ref == "" { + return nil, Args{}, errors.Errorf("localize remote root %q missing ref query string parameter", rawTarget) + } + + // for security, should enforce load restrictions + ldr, err := loader.NewLoader(loader.RestrictionRootOnly, rawTarget, fSys) + if err != nil { + return nil, Args{}, errors.WrapPrefixf(err, "unable to establish localize target %q", rawTarget) + } + + scope, err := establishScope(rawScope, rawTarget, ldr, fSys) + if err != nil { + _ = ldr.Cleanup() + return nil, Args{}, errors.WrapPrefixf(err, "invalid localize scope %q", rawScope) + } + + newDir, err := createNewDir(rawNewDir, ldr, repoSpec, fSys) + if err != nil { + _ = ldr.Cleanup() + return nil, Args{}, errors.WrapPrefixf(err, "invalid localize destination %q", rawNewDir) + } + + args := Args{ + Target: filesys.ConfirmedDir(ldr.Root()), + Scope: scope, + NewDir: newDir, + } + return &Loader{ + fSys: fSys, + args: &args, + Loader: ldr, + local: scope != "", + }, args, nil +} + +// Load returns the contents of path if path is a valid localize file. +// Otherwise, Load returns an error. +func (ll *Loader) Load(path string) ([]byte, error) { + // checks in root, and thus in scope + content, err := ll.Loader.Load(path) + if err != nil { + return nil, errors.WrapPrefixf(err, "invalid file reference") + } + if filepath.IsAbs(path) { + return nil, errors.Errorf("absolute paths not yet supported in alpha: file path %q is absolute", path) + } + if !loader.IsRemoteFile(path) && ll.local { + cleanPath := cleanFilePath(ll.fSys, filesys.ConfirmedDir(ll.Root()), path) + cleanAbs := filepath.Join(ll.Root(), cleanPath) + dir := filesys.ConfirmedDir(filepath.Dir(cleanAbs)) + // target cannot reference newDir, as this load would've failed prior to localize; + // not a problem if remote because then reference could only be in newDir if repo copy, + // which will be cleaned, is inside newDir + if dir.HasPrefix(ll.args.NewDir) { + return nil, errors.Errorf("file %q at %q enters localize destination %q", path, cleanAbs, ll.args.NewDir) + } + } + return content, nil +} + +// New returns a Loader at path if path is a valid localize root. +// Otherwise, New returns an error. +func (ll *Loader) New(path string) (ifc.Loader, error) { + ldr, err := ll.Loader.New(path) + if err != nil { + return nil, errors.WrapPrefixf(err, "invalid root reference") + } + + if repo := ldr.Repo(); repo == "" { + if ll.local && !filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.Scope) { + return nil, errors.Errorf("root %q outside localize scope %q", ldr.Root(), ll.args.Scope) + } + if ll.local && filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.NewDir) { + return nil, errors.Errorf( + "root %q references into localize destination %q", ldr.Root(), ll.args.NewDir) + } + } else if !hasRef(path) { + return nil, errors.Errorf("localize remote root %q missing ref query string parameter", path) + } + + return &Loader{ + fSys: ll.fSys, + args: ll.args, + Loader: ldr, + local: ll.local && ldr.Repo() == "", + }, nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/util.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/util.go new file mode 100644 index 000000000..1a5151118 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/localizer/util.go @@ -0,0 +1,218 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import ( + "log" + "net/url" + "path/filepath" + "strings" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/git" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +const ( + // DstPrefix prefixes the target and ref, if target is remote, in the default localize destination directory name + DstPrefix = "localized" + + // LocalizeDir is the name of the localize directories used to store remote content in the localize destination + LocalizeDir = "localized-files" + + // FileSchemeDir is the name of the directory immediately inside LocalizeDir used to store file-schemed repos + FileSchemeDir = "file-schemed" +) + +// establishScope returns the effective scope given localize arguments and targetLdr at rawTarget. For remote rawTarget, +// the effective scope is the downloaded repo. +func establishScope(rawScope string, rawTarget string, targetLdr ifc.Loader, fSys filesys.FileSystem) (filesys.ConfirmedDir, error) { + if repo := targetLdr.Repo(); repo != "" { + if rawScope != "" { + return "", errors.Errorf("scope %q specified for remote localize target %q", rawScope, rawTarget) + } + return filesys.ConfirmedDir(repo), nil + } + // default scope + if rawScope == "" { + return filesys.ConfirmedDir(targetLdr.Root()), nil + } + scope, err := filesys.ConfirmDir(fSys, rawScope) + if err != nil { + return "", errors.WrapPrefixf(err, "unable to establish localize scope") + } + if !filesys.ConfirmedDir(targetLdr.Root()).HasPrefix(scope) { + return scope, errors.Errorf("localize scope %q does not contain target %q at %q", rawScope, rawTarget, + targetLdr.Root()) + } + return scope, nil +} + +// createNewDir returns the localize destination directory or error. Note that spec is nil if targetLdr is at local +// target. +func createNewDir(rawNewDir string, targetLdr ifc.Loader, spec *git.RepoSpec, fSys filesys.FileSystem) (filesys.ConfirmedDir, error) { + if rawNewDir == "" { + rawNewDir = defaultNewDir(targetLdr, spec) + } + if fSys.Exists(rawNewDir) { + return "", errors.Errorf("localize destination %q already exists", rawNewDir) + } + // destination directory must sit in an existing directory + if err := fSys.Mkdir(rawNewDir); err != nil { + return "", errors.WrapPrefixf(err, "unable to create localize destination directory") + } + newDir, err := filesys.ConfirmDir(fSys, rawNewDir) + if err != nil { + if errCleanup := fSys.RemoveAll(newDir.String()); errCleanup != nil { + log.Printf("%s", errors.WrapPrefixf(errCleanup, "unable to clean localize destination")) + } + return "", errors.WrapPrefixf(err, "unable to establish localize destination") + } + + return newDir, nil +} + +// defaultNewDir calculates the default localize destination directory name from targetLdr at the localize target +// and spec of target, which is nil if target is local +func defaultNewDir(targetLdr ifc.Loader, spec *git.RepoSpec) string { + targetDir := filepath.Base(targetLdr.Root()) + if repo := targetLdr.Repo(); repo != "" { + // kustomize doesn't download repo into repo-named folder + // must find repo folder name from url + if repo == targetLdr.Root() { + targetDir = urlBase(spec.RepoPath) + } + return strings.Join([]string{DstPrefix, targetDir, strings.ReplaceAll(spec.Ref, "/", "-")}, "-") + } + // special case for local target directory since destination directory cannot have "/" in name + if targetDir == string(filepath.Separator) { + return DstPrefix + } + return strings.Join([]string{DstPrefix, targetDir}, "-") +} + +// urlBase is the url equivalent of filepath.Base +func urlBase(url string) string { + cleaned := strings.TrimRight(url, "/") + i := strings.LastIndex(cleaned, "/") + if i < 0 { + return cleaned + } + return cleaned[i+1:] +} + +// hasRef checks if repoURL has ref query string parameter +func hasRef(repoURL string) bool { + repoSpec, err := git.NewRepoSpecFromURL(repoURL) + if err != nil { + log.Fatalf("unable to parse validated root url: %s", err) + } + return repoSpec.Ref != "" +} + +// cleanFilePath returns file cleaned, where file is a relative path to root on fSys +func cleanFilePath(fSys filesys.FileSystem, root filesys.ConfirmedDir, file string) string { + abs := root.Join(file) + dir, f, err := fSys.CleanedAbs(abs) + if err != nil { + log.Fatalf("cannot clean validated file path %q: %s", abs, err) + } + locPath, err := filepath.Rel(root.String(), dir.Join(f)) + if err != nil { + log.Fatalf("cannot find path from parent %q to file %q: %s", root, dir.Join(f), err) + } + return locPath +} + +// locFilePath converts a URL to its localized form, e.g. +// https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/api/krusty/testdata/localize/simple/service.yaml -> +// localized-files/raw.githubusercontent.com/kubernetes-sigs/kustomize/master/api/krusty/testdata/localize/simple/service.yaml. +// +// fileURL must be a validated file URL. +func locFilePath(fileURL string) string { + // File urls must have http or https scheme, so it is safe to use url.Parse. + u, err := url.Parse(fileURL) + if err != nil { + log.Panicf("cannot parse validated file url %q: %s", fileURL, err) + } + + // HTTP requests use the escaped path, so we use it here. Escaped paths also help us + // preserve percent-encoding in the original path, in the absence of illegal characters, + // in case they have special meaning to the host. + // Extraneous '..' parent directory dot-segments should be removed. + path := filepath.Join(string(filepath.Separator), filepath.FromSlash(u.EscapedPath())) + + // We intentionally exclude userinfo and port. + // Raw github urls are the only type of file urls kustomize officially accepts. + // In this case, the path already consists of org, repo, version, and path in repo, in order, + // so we can use it as is. + return filepath.Join(LocalizeDir, u.Hostname(), path) +} + +// locRootPath returns the relative localized path of the validated root url rootURL, where the local copy of its repo +// is at repoDir and the copy of its root is at root on fSys. +func locRootPath(rootURL, repoDir string, root filesys.ConfirmedDir, fSys filesys.FileSystem) (string, error) { + repoSpec, err := git.NewRepoSpecFromURL(rootURL) + if err != nil { + log.Panicf("cannot parse validated repo url %q: %s", rootURL, err) + } + host, err := parseHost(repoSpec) + if err != nil { + return "", errors.WrapPrefixf(err, "unable to parse host of remote root %q", rootURL) + } + repo, err := filesys.ConfirmDir(fSys, repoDir) + if err != nil { + log.Panicf("unable to establish validated repo download location %q: %s", repoDir, err) + } + // calculate from copy instead of url to straighten symlinks + inRepo, err := filepath.Rel(repo.String(), root.String()) + if err != nil { + log.Panicf("cannot find path from %q to child directory %q: %s", repo, root, err) + } + // the git-server-side directory name conventionally (but not universally) ends in .git, which + // is conventionally stripped from the client-side directory name used for the clone. + localRepoPath := strings.TrimSuffix(repoSpec.RepoPath, ".git") + + // We do not need to escape RepoPath, a path on the git server. + // However, like git, we clean dot-segments from RepoPath. + // Git does not allow ref value to contain dot-segments. + return filepath.Join(LocalizeDir, + host, + filepath.Join(string(filepath.Separator), filepath.FromSlash(localRepoPath)), + filepath.FromSlash(repoSpec.Ref), + inRepo), nil +} + +// parseHost returns the localize directory path corresponding to repoSpec.Host +func parseHost(repoSpec *git.RepoSpec) (string, error) { + var target string + switch scheme, _, _ := strings.Cut(repoSpec.Host, "://"); scheme { + case "gh:": + // 'gh' was meant to be a local github.com shorthand, in which case + // the .gitconfig file could map it to any host. See origin here: + // https://github.com/kubernetes-sigs/kustomize/blob/kustomize/v4.5.7/api/internal/git/repospec.go#L203 + // We give it a special host directory here under the assumption + // that we are unlikely to have another host simply named 'gh'. + return "gh", nil + case "file": + // We put file-scheme repos under a special directory to avoid + // colluding local absolute paths with hosts. + return FileSchemeDir, nil + case "https", "http", "ssh": + target = repoSpec.Host + default: + // We must have relative ssh url; in other words, the url has scp-like syntax. + // We attach a scheme to avoid url.Parse errors. + target = "ssh://" + repoSpec.Host + } + // url.Parse will not recognize ':' delimiter that both RepoSpec and git accept. + target = strings.TrimSuffix(target, ":") + u, err := url.Parse(target) + if err != nil { + return "", errors.Wrap(err) + } + // strip scheme, userinfo, port, and any trailing slashes. + return u.Hostname(), nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go index 354f70e51..eb0f30733 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go @@ -22,7 +22,7 @@ import ( // contains a Pod; Deployment, Job, StatefulSet, etc. // The ConfigMap is the ReferralTarget, the others are Referrers. // -// If the the name of a ConfigMap instance changed from 'alice' to 'bob', +// If the name of a ConfigMap instance changed from 'alice' to 'bob', // one must // - visit all objects that could refer to the ConfigMap (the Referrers) // - see if they mention 'alice', @@ -47,6 +47,8 @@ type NameBackReferences struct { // TODO: rename json 'fieldSpecs' to 'referrers' for clarity. // This will, however, break anyone using a custom config. Referrers types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` + + // Note: If any new pointer based members are added, DeepCopy needs to be updated } func (n NameBackReferences) String() string { @@ -66,6 +68,17 @@ func (s nbrSlice) Less(i, j int) bool { return s[i].Gvk.IsLessThan(s[j].Gvk) } +// DeepCopy returns a new copy of nbrSlice +func (s nbrSlice) DeepCopy() nbrSlice { + ret := make(nbrSlice, len(s)) + copy(ret, s) + for i, slice := range ret { + ret[i].Referrers = slice.Referrers.DeepCopy() + } + + return ret +} + func (s nbrSlice) mergeAll(o nbrSlice) (result nbrSlice, err error) { result = s for _, r := range o { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go index a28627a13..ab847eb6e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go @@ -6,18 +6,22 @@ package builtinconfig import ( "log" "sort" + "sync" "sigs.k8s.io/kustomize/api/ifc" - "sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts" + "sigs.k8s.io/kustomize/api/internal/konfig/builtinpluginconsts" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" ) // TransformerConfig holds the data needed to perform transformations. type TransformerConfig struct { + // if any fields are added, update the DeepCopy implementation NamePrefix types.FsSlice `json:"namePrefix,omitempty" yaml:"namePrefix,omitempty"` NameSuffix types.FsSlice `json:"nameSuffix,omitempty" yaml:"nameSuffix,omitempty"` NameSpace types.FsSlice `json:"namespace,omitempty" yaml:"namespace,omitempty"` CommonLabels types.FsSlice `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"` + TemplateLabels types.FsSlice `json:"templateLabels,omitempty" yaml:"templateLabels,omitempty"` CommonAnnotations types.FsSlice `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` NameReference nbrSlice `json:"nameReference,omitempty" yaml:"nameReference,omitempty"` VarReference types.FsSlice `json:"varReference,omitempty" yaml:"varReference,omitempty"` @@ -30,14 +34,43 @@ func MakeEmptyConfig() *TransformerConfig { return &TransformerConfig{} } +// DeepCopy returns a new copy of TransformerConfig +func (t *TransformerConfig) DeepCopy() *TransformerConfig { + return &TransformerConfig{ + NamePrefix: t.NamePrefix.DeepCopy(), + NameSuffix: t.NameSuffix.DeepCopy(), + NameSpace: t.NameSpace.DeepCopy(), + CommonLabels: t.CommonLabels.DeepCopy(), + TemplateLabels: t.TemplateLabels.DeepCopy(), + CommonAnnotations: t.CommonAnnotations.DeepCopy(), + NameReference: t.NameReference.DeepCopy(), + VarReference: t.VarReference.DeepCopy(), + Images: t.Images.DeepCopy(), + Replicas: t.Replicas.DeepCopy(), + } +} + +// the default transformer config is initialized by MakeDefaultConfig, +// and must only be accessed via that function. +var ( + initDefaultConfig sync.Once //nolint:gochecknoglobals + defaultConfig *TransformerConfig //nolint:gochecknoglobals +) + // MakeDefaultConfig returns a default TransformerConfig. func MakeDefaultConfig() *TransformerConfig { - c, err := makeTransformerConfigFromBytes( - builtinpluginconsts.GetDefaultFieldSpecs()) - if err != nil { - log.Fatalf("Unable to make default transformconfig: %v", err) - } - return c + // parsing is expensive when having a large tree with many kustomization modules, so only do it once + initDefaultConfig.Do(func() { + var err error + defaultConfig, err = makeTransformerConfigFromBytes( + builtinpluginconsts.GetDefaultFieldSpecs()) + if err != nil { + log.Fatalf("Unable to make default transformconfig: %v", err) + } + }) + + // return a copy to avoid any mutations to protect the reference copy + return defaultConfig.DeepCopy() } // MakeTransformerConfig returns a merger of custom config, @@ -58,8 +91,10 @@ func MakeTransformerConfig( // sortFields provides determinism in logging, tests, etc. func (t *TransformerConfig) sortFields() { sort.Sort(t.NamePrefix) + sort.Sort(t.NameSuffix) sort.Sort(t.NameSpace) sort.Sort(t.CommonLabels) + sort.Sort(t.TemplateLabels) sort.Sort(t.CommonAnnotations) sort.Sort(t.NameReference) sort.Sort(t.VarReference) @@ -108,40 +143,44 @@ func (t *TransformerConfig) Merge(input *TransformerConfig) ( merged = &TransformerConfig{} merged.NamePrefix, err = t.NamePrefix.MergeAll(input.NamePrefix) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge NamePrefix fieldSpec") } merged.NameSuffix, err = t.NameSuffix.MergeAll(input.NameSuffix) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge NameSuffix fieldSpec") } merged.NameSpace, err = t.NameSpace.MergeAll(input.NameSpace) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge NameSpace fieldSpec") } merged.CommonAnnotations, err = t.CommonAnnotations.MergeAll( input.CommonAnnotations) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge CommonAnnotations fieldSpec") } merged.CommonLabels, err = t.CommonLabels.MergeAll(input.CommonLabels) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge CommonLabels fieldSpec") + } + merged.TemplateLabels, err = t.TemplateLabels.MergeAll(input.TemplateLabels) + if err != nil { + return nil, errors.WrapPrefixf(err, "failed to merge TemplateLabels fieldSpec") } merged.VarReference, err = t.VarReference.MergeAll(input.VarReference) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge VarReference fieldSpec") } merged.NameReference, err = t.NameReference.mergeAll(input.NameReference) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge NameReference fieldSpec") } merged.Images, err = t.Images.MergeAll(input.Images) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge Images fieldSpec") } merged.Replicas, err = t.Replicas.MergeAll(input.Replicas) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, "failed to merge Replicas fieldSpec") } merged.sortFields() return merged, nil diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go index 1b347cbc8..ddcfcc190 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go @@ -15,24 +15,23 @@ func _() { _ = x[HashTransformer-4] _ = x[ImageTagTransformer-5] _ = x[LabelTransformer-6] - _ = x[LegacyOrderTransformer-7] - _ = x[NamespaceTransformer-8] - _ = x[PatchJson6902Transformer-9] - _ = x[PatchStrategicMergeTransformer-10] - _ = x[PatchTransformer-11] - _ = x[PrefixSuffixTransformer-12] - _ = x[PrefixTransformer-13] - _ = x[SuffixTransformer-14] - _ = x[ReplicaCountTransformer-15] - _ = x[SecretGenerator-16] - _ = x[ValueAddTransformer-17] - _ = x[HelmChartInflationGenerator-18] - _ = x[ReplacementTransformer-19] + _ = x[NamespaceTransformer-7] + _ = x[PatchJson6902Transformer-8] + _ = x[PatchStrategicMergeTransformer-9] + _ = x[PatchTransformer-10] + _ = x[PrefixSuffixTransformer-11] + _ = x[PrefixTransformer-12] + _ = x[SuffixTransformer-13] + _ = x[ReplicaCountTransformer-14] + _ = x[SecretGenerator-15] + _ = x[ValueAddTransformer-16] + _ = x[HelmChartInflationGenerator-17] + _ = x[ReplacementTransformer-18] } -const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorIAMPolicyGeneratorHashTransformerImageTagTransformerLabelTransformerLegacyOrderTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerPrefixTransformerSuffixTransformerReplicaCountTransformerSecretGeneratorValueAddTransformerHelmChartInflationGeneratorReplacementTransformer" +const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorIAMPolicyGeneratorHashTransformerImageTagTransformerLabelTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerPrefixTransformerSuffixTransformerReplicaCountTransformerSecretGeneratorValueAddTransformerHelmChartInflationGeneratorReplacementTransformer" -var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 65, 80, 99, 115, 137, 157, 181, 211, 227, 250, 267, 284, 307, 322, 341, 368, 390} +var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 65, 80, 99, 115, 135, 159, 189, 205, 228, 245, 262, 285, 300, 319, 346, 368} func (i BuiltinPluginType) String() string { if i < 0 || i >= BuiltinPluginType(len(_BuiltinPluginType_index)-1) { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go index b1c987a52..a98a23d39 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go @@ -19,7 +19,6 @@ const ( HashTransformer ImageTagTransformer LabelTransformer - LegacyOrderTransformer NamespaceTransformer PatchJson6902Transformer PatchStrategicMergeTransformer @@ -100,7 +99,6 @@ var TransformerFactories = map[BuiltinPluginType]func() resmap.TransformerPlugin HashTransformer: builtins.NewHashTransformerPlugin, ImageTagTransformer: builtins.NewImageTagTransformerPlugin, LabelTransformer: builtins.NewLabelTransformerPlugin, - LegacyOrderTransformer: builtins.NewLegacyOrderTransformerPlugin, NamespaceTransformer: builtins.NewNamespaceTransformerPlugin, PatchJson6902Transformer: builtins.NewPatchJson6902TransformerPlugin, PatchStrategicMergeTransformer: builtins.NewPatchStrategicMergeTransformerPlugin, @@ -111,4 +109,7 @@ var TransformerFactories = map[BuiltinPluginType]func() resmap.TransformerPlugin ReplacementTransformer: builtins.NewReplacementTransformerPlugin, ReplicaCountTransformer: builtins.NewReplicaCountTransformerPlugin, ValueAddTransformer: builtins.NewValueAddTransformerPlugin, + // Do not wired SortOrderTransformer as a builtin plugin. + // We only want it to be available in the top-level kustomization. + // See: https://github.com/kubernetes-sigs/kustomize/issues/3913 } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go index 9380558cb..001731f78 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go @@ -6,7 +6,6 @@ package execplugin import ( "bytes" "fmt" - "io/ioutil" "os" "os/exec" "runtime" @@ -14,9 +13,9 @@ import ( "github.com/google/shlex" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/internal/plugins/utils" "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/yaml" ) @@ -150,19 +149,19 @@ func (p *ExecPlugin) Transform(rm resmap.ResMap) error { // passes the full temp file path as the first arg to a process // running the plugin binary. Process output is returned. func (p *ExecPlugin) invokePlugin(input []byte) ([]byte, error) { - f, err := ioutil.TempFile("", tmpConfigFilePrefix) + f, err := os.CreateTemp("", tmpConfigFilePrefix) if err != nil { - return nil, errors.Wrap( + return nil, errors.WrapPrefixf( err, "creating tmp plugin config file") } _, err = f.Write(p.cfg) if err != nil { - return nil, errors.Wrap( + return nil, errors.WrapPrefixf( err, "writing plugin config to "+f.Name()) } err = f.Close() if err != nil { - return nil, errors.Wrap( + return nil, errors.WrapPrefixf( err, "closing plugin config file "+f.Name()) } //nolint:gosec @@ -176,7 +175,7 @@ func (p *ExecPlugin) invokePlugin(input []byte) ([]byte, error) { } result, err := cmd.Output() if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "failure in plugin configured via %s; %v", f.Name(), err.Error()) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go index 84bc0ac05..3a033d727 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go @@ -7,7 +7,7 @@ import ( "bytes" "fmt" - "github.com/pkg/errors" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/api/internal/plugins/utils" "sigs.k8s.io/kustomize/api/resmap" @@ -51,13 +51,16 @@ func resourceToRNode(res *resource.Resource) (*yaml.RNode, error) { } // GetFunctionSpec return function spec is there is. Otherwise return nil -func GetFunctionSpec(res *resource.Resource) *runtimeutil.FunctionSpec { +func GetFunctionSpec(res *resource.Resource) (*runtimeutil.FunctionSpec, error) { rnode, err := resourceToRNode(res) if err != nil { - return nil + return nil, fmt.Errorf("could not convert resource to RNode: %w", err) } - - return runtimeutil.GetFunctionSpec(rnode) + functionSpec, err := runtimeutil.GetFunctionSpec(rnode) + if err != nil { + return nil, fmt.Errorf("failed to get FunctionSpec: %w", err) + } + return functionSpec, nil } func toStorageMounts(mounts []string) []runtimeutil.StorageMount { @@ -191,7 +194,7 @@ func (p *FnPlugin) invokePlugin(input []byte) ([]byte, error) { err = p.runFns.Execute() if err != nil { - return nil, errors.Wrap( + return nil, errors.WrapPrefixf( err, "couldn't execute function") } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go index 82cb93965..1758e5cf6 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go @@ -12,7 +12,6 @@ import ( "reflect" "strings" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" "sigs.k8s.io/kustomize/api/internal/plugins/execplugin" @@ -22,6 +21,7 @@ import ( "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/resid" ) @@ -42,27 +42,35 @@ func NewLoader( return &Loader{pc: pc, rf: rf, fs: fs} } +// LoaderWithWorkingDir returns loader after setting its working directory. +// NOTE: This is not really a new loader since some of the Loader struct fields are pointers. +func (l *Loader) LoaderWithWorkingDir(wd string) *Loader { + lpc := &types.PluginConfig{ + PluginRestrictions: l.pc.PluginRestrictions, + BpLoadingOptions: l.pc.BpLoadingOptions, + FnpLoadingOptions: l.pc.FnpLoadingOptions, + HelmConfig: l.pc.HelmConfig, + } + lpc.FnpLoadingOptions.WorkingDir = wd + return &Loader{pc: lpc, rf: l.rf, fs: l.fs} +} + // Config provides the global (not plugin specific) PluginConfig data. func (l *Loader) Config() *types.PluginConfig { return l.pc } -// SetWorkDir sets the working directory for this loader's plugins -func (l *Loader) SetWorkDir(wd string) { - l.pc.FnpLoadingOptions.WorkingDir = wd -} - func (l *Loader) LoadGenerators( ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) ( result []*resmap.GeneratorWithProperties, err error) { for _, res := range rm.Resources() { g, err := l.LoadGenerator(ldr, v, res) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to load generator: %w", err) } generatorOrigin, err := resource.OriginFromCustomPlugin(res) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to get origin from CustomPlugin: %w", err) } result = append(result, &resmap.GeneratorWithProperties{Generator: g, Origin: generatorOrigin}) } @@ -130,15 +138,19 @@ func (l *Loader) AbsolutePluginPath(id resid.ResId) (string, error) { // absPluginHome is the home of kustomize Exec and Go plugins. // Kustomize plugin configuration files are k8s-style objects // containing the fields 'apiVersion' and 'kind', e.g. -// apiVersion: apps/v1 -// kind: Deployment +// +// apiVersion: apps/v1 +// kind: Deployment +// // kustomize reads plugin configuration data from a file path // specified in the 'generators:' or 'transformers:' field of a // kustomization file. For Exec and Go plugins, kustomize // uses this data to both locate the plugin and configure it. // Each Exec or Go plugin (its code, its tests, its supporting data // files, etc.) must be housed in its own directory at -// ${absPluginHome}/${pluginApiVersion}/LOWERCASE(${pluginKind}) +// +// ${absPluginHome}/${pluginApiVersion}/LOWERCASE(${pluginKind}) +// // where // - ${absPluginHome} is an absolute path, defined below. // - ${pluginApiVersion} is taken from the plugin config file. @@ -204,11 +216,11 @@ func (l *Loader) loadAndConfigurePlugin( } yaml, err := res.AsYAML() if err != nil { - return nil, errors.Wrapf(err, "marshalling yaml from res %s", res.OrgId()) + return nil, errors.WrapPrefixf(err, "marshalling yaml from res %s", res.OrgId()) } err = c.Config(resmap.NewPluginHelpers(ldr, v, l.rf, l.pc), yaml) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "plugin %s fails configuration", res.OrgId()) } return c, nil @@ -226,17 +238,20 @@ func (l *Loader) makeBuiltinPlugin(r resid.Gvk) (resmap.Configurable, error) { } func (l *Loader) loadPlugin(res *resource.Resource) (resmap.Configurable, error) { - spec := fnplugin.GetFunctionSpec(res) + spec, err := fnplugin.GetFunctionSpec(res) + if err != nil { + return nil, fmt.Errorf("loader: %w", err) + } if spec != nil { // validation check that function mounts are under the current kustomization directory for _, mount := range spec.Container.StorageMounts { if filepath.IsAbs(mount.Src) { - return nil, errors.New(fmt.Sprintf("plugin %s with mount path '%s' is not permitted; "+ - "mount paths must be relative to the current kustomization directory", res.OrgId(), mount.Src)) + return nil, errors.Errorf("plugin %s with mount path '%s' is not permitted; "+ + "mount paths must be relative to the current kustomization directory", res.OrgId(), mount.Src) } if strings.HasPrefix(filepath.Clean(mount.Src), "../") { - return nil, errors.New(fmt.Sprintf("plugin %s with mount path '%s' is not permitted; "+ - "mount paths must be under the current kustomization directory", res.OrgId(), mount.Src)) + return nil, errors.Errorf("plugin %s with mount path '%s' is not permitted; "+ + "mount paths must be under the current kustomization directory", res.OrgId(), mount.Src) } } return fnplugin.NewFnPlugin(&l.pc.FnpLoadingOptions), nil @@ -292,11 +307,11 @@ func (l *Loader) loadGoPlugin(id resid.ResId, absPath string) (resmap.Configurab log.Printf("Attempting plugin load from '%s'", absPath) p, err := plugin.Open(absPath) if err != nil { - return nil, errors.Wrapf(err, "plugin %s fails to load", absPath) + return nil, errors.WrapPrefixf(err, "plugin %s fails to load", absPath) } symbol, err := p.Lookup(konfig.PluginSymbol) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "plugin %s doesn't have symbol %s", regId, konfig.PluginSymbol) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go index 45e489593..8b939db1e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go @@ -7,8 +7,8 @@ import ( "fmt" "strings" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/kyaml/errors" ) type errMissingKustomization struct { @@ -23,12 +23,8 @@ func (e *errMissingKustomization) Error() string { } func IsMissingKustomizationFileError(err error) bool { - _, ok := err.(*errMissingKustomization) - if ok { - return true - } - _, ok = errors.Cause(err).(*errMissingKustomization) - return ok + e := &errMissingKustomization{} + return errors.As(err, &e) } func NewErrMissingKustomization(p string) *errMissingKustomization { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go index 4bbf7e98a..eefa1ac63 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go @@ -6,23 +6,23 @@ package target import ( "encoding/json" "fmt" + "os" "strings" - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/accumulator" "sigs.k8s.io/kustomize/api/internal/builtins" "sigs.k8s.io/kustomize/api/internal/kusterr" + load "sigs.k8s.io/kustomize/api/internal/loader" "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" "sigs.k8s.io/kustomize/api/internal/plugins/loader" "sigs.k8s.io/kustomize/api/internal/utils" "sigs.k8s.io/kustomize/api/konfig" - load "sigs.k8s.io/kustomize/api/loader" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/openapi" "sigs.k8s.io/yaml" ) @@ -44,32 +44,40 @@ func NewKustTarget( validator ifc.Validator, rFactory *resmap.Factory, pLdr *loader.Loader) *KustTarget { - pLdrCopy := *pLdr - pLdrCopy.SetWorkDir(ldr.Root()) return &KustTarget{ ldr: ldr, validator: validator, rFactory: rFactory, - pLdr: &pLdrCopy, + pLdr: pLdr.LoaderWithWorkingDir(ldr.Root()), } } // Load attempts to load the target's kustomization file. func (kt *KustTarget) Load() error { - content, kustFileName, err := loadKustFile(kt.ldr) + content, kustFileName, err := LoadKustFile(kt.ldr) if err != nil { return err } - content, err = types.FixKustomizationPreUnmarshalling(content) - if err != nil { + + var k types.Kustomization + if err := k.Unmarshal(content); err != nil { return err } - var k types.Kustomization - err = k.Unmarshal(content) - if err != nil { + + // show warning message when using deprecated fields. + if warningMessages := k.CheckDeprecatedFields(); warningMessages != nil { + for _, msg := range *warningMessages { + fmt.Fprintf(os.Stderr, "%v\n", msg) + } + } + + k.FixKustomization() + + // check that Kustomization is empty + if err := k.CheckEmpty(); err != nil { return err } - k.FixKustomizationPostUnmarshalling() + errs := k.EnforceFields() if len(errs) > 0 { return fmt.Errorf( @@ -89,7 +97,7 @@ func (kt *KustTarget) Kustomization() types.Kustomization { return result } -func loadKustFile(ldr ifc.Loader) ([]byte, string, error) { +func LoadKustFile(ldr ifc.Loader) ([]byte, string, error) { var content []byte match := 0 var kustFileName string @@ -150,6 +158,11 @@ func (kt *KustTarget) makeCustomizedResMap() (resmap.ResMap, error) { return nil, err } + err = kt.IgnoreLocal(ra) + if err != nil { + return nil, err + } + return ra.ResMap(), nil } @@ -187,11 +200,7 @@ func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator) ( resRa *accumulator.ResAccumulator, err error) { ra, err = kt.accumulateResources(ra, kt.kustomization.Resources) if err != nil { - return nil, errors.Wrap(err, "accumulating resources") - } - ra, err = kt.accumulateComponents(ra, kt.kustomization.Components) - if err != nil { - return nil, errors.Wrap(err, "accumulating components") + return nil, errors.WrapPrefixf(err, "accumulating resources") } tConfig, err := builtinconfig.MakeTransformerConfig( kt.ldr, kt.kustomization.Configurations) @@ -200,23 +209,31 @@ func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator) ( } err = ra.MergeConfig(tConfig) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "merging config %v", tConfig) } crdTc, err := accumulator.LoadConfigFromCRDs(kt.ldr, kt.kustomization.Crds) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "loading CRDs %v", kt.kustomization.Crds) } err = ra.MergeConfig(crdTc) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "merging CRDs %v", crdTc) } err = kt.runGenerators(ra) if err != nil { return nil, err } + + // components are expected to execute after reading resources and adding generators ,before applying transformers and validation. + // https://github.com/kubernetes-sigs/kustomize/pull/5170#discussion_r1212101287 + ra, err = kt.accumulateComponents(ra, kt.kustomization.Components) + if err != nil { + return nil, errors.WrapPrefixf(err, "accumulating components") + } + err = kt.runTransformers(ra) if err != nil { return nil, err @@ -227,13 +244,9 @@ func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator) ( } err = ra.MergeVars(kt.kustomization.Vars) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "merging vars %v", kt.kustomization.Vars) } - err = kt.IgnoreLocal(ra) - if err != nil { - return nil, err - } return ra, nil } @@ -261,7 +274,7 @@ func (kt *KustTarget) runGenerators( gs, err = kt.configureExternalGenerators() if err != nil { - return errors.Wrap(err, "loading generator plugins") + return errors.WrapPrefixf(err, "loading generator plugins") } generators = append(generators, gs...) for i, g := range generators { @@ -272,12 +285,12 @@ func (kt *KustTarget) runGenerators( if resMap != nil { err = resMap.AddOriginAnnotation(generators[i].Origin) if err != nil { - return errors.Wrapf(err, "adding origin annotations for generator %v", g) + return errors.WrapPrefixf(err, "adding origin annotations for generator %v", g) } } err = ra.AbsorbAll(resMap) if err != nil { - return errors.Wrapf(err, "merging from generator %v", g) + return errors.WrapPrefixf(err, "merging from generator %v", g) } } return nil @@ -304,7 +317,7 @@ func (kt *KustTarget) configureExternalGenerators() ( } } if err = ra.AppendAll(rm); err != nil { - return nil, errors.Wrapf(err, "configuring external generator") + return nil, errors.WrapPrefixf(err, "configuring external generator") } } ra, err := kt.accumulateResources(ra, generatorPaths) @@ -351,7 +364,7 @@ func (kt *KustTarget) configureExternalTransformers(transformers []string) ([]*r } if err = ra.AppendAll(rm); err != nil { - return nil, errors.Wrapf(err, "configuring external transformer") + return nil, errors.WrapPrefixf(err, "configuring external transformer") } } ra, err := kt.accumulateResources(ra, transformerPaths) @@ -415,7 +428,7 @@ func (kt *KustTarget) accumulateResources( if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file return nil, errF } - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "accumulation err='%s'", errF.Error()) } // store the origin, we'll need it later @@ -432,7 +445,7 @@ func (kt *KustTarget) accumulateResources( if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file return nil, errF } - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "accumulation err='%s'", errF.Error()) } } @@ -474,7 +487,7 @@ func (kt *KustTarget) accumulateDirectory( subKt := NewKustTarget(ldr, kt.validator, kt.rFactory, kt.pLdr) err := subKt.Load() if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "couldn't make target for path '%s'", ldr.Root()) } subKt.kustomization.BuildMetadata = kt.kustomization.BuildMetadata @@ -509,12 +522,12 @@ func (kt *KustTarget) accumulateDirectory( subRa, err = subKt.AccumulateTarget() } if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "recursed accumulation of path '%s'", ldr.Root()) } err = ra.MergeAccumulator(subRa) if err != nil { - return nil, errors.Wrapf( + return nil, errors.WrapPrefixf( err, "recursed merging from path '%s'", ldr.Root()) } return ra, nil @@ -524,21 +537,21 @@ func (kt *KustTarget) accumulateFile( ra *accumulator.ResAccumulator, path string) error { resources, err := kt.rFactory.FromFile(kt.ldr, path) if err != nil { - return errors.Wrapf(err, "accumulating resources from '%s'", path) + return errors.WrapPrefixf(err, "accumulating resources from '%s'", path) } if kt.origin != nil { originAnno, err := kt.origin.Append(path).String() if err != nil { - return errors.Wrapf(err, "cannot add path annotation for '%s'", path) + return errors.WrapPrefixf(err, "cannot add path annotation for '%s'", path) } err = resources.AnnotateAll(utils.OriginAnnotationKey, originAnno) if err != nil || originAnno == "" { - return errors.Wrapf(err, "cannot add path annotation for '%s'", path) + return errors.WrapPrefixf(err, "cannot add path annotation for '%s'", path) } } err = ra.AppendAll(resources) if err != nil { - return errors.Wrapf(err, "merging resources from '%s'", path) + return errors.WrapPrefixf(err, "merging resources from '%s'", path) } return nil } @@ -549,7 +562,7 @@ func (kt *KustTarget) configureBuiltinPlugin( if c != nil { y, err = yaml.Marshal(c) if err != nil { - return errors.Wrapf( + return errors.WrapPrefixf( err, "builtin %s marshal", bpt) } } @@ -558,7 +571,7 @@ func (kt *KustTarget) configureBuiltinPlugin( kt.ldr, kt.validator, kt.rFactory, kt.pLdr.Config()), y) if err != nil { - return errors.Wrapf( + return errors.WrapPrefixf( err, "trouble configuring builtin %s with config: `\n%s`", bpt, string(y)) } return nil diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go index 0991c5fac..b589961e5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go @@ -7,12 +7,12 @@ import ( "fmt" "path/filepath" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -286,11 +286,11 @@ var transformerConfigurators = map[builtinhelpers.BuiltinPluginType]func( if label.IncludeSelectors { fss, err = fss.MergeAll(tc.CommonLabels) } else { - // merge spec/template/metadata fieldSpec if includeTemplate flag is true + // merge spec/template/metadata fieldSpecs if includeTemplate flag is true if label.IncludeTemplates { - fss, err = fss.MergeOne(types.FieldSpec{Path: "spec/template/metadata/labels", CreateIfNotPresent: false}) + fss, err = fss.MergeAll(tc.TemplateLabels) if err != nil { - return nil, errors.Wrap(err, "failed to merge template fieldSpec") + return nil, errors.WrapPrefixf(err, "failed to merge template fieldSpec") } } // only add to metadata by default diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go index 24b8abe66..c1761d2c6 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "github.com/pkg/errors" + "sigs.k8s.io/kustomize/kyaml/errors" ) type errTimeOut struct { @@ -24,13 +24,6 @@ func (e errTimeOut) Error() string { } func IsErrTimeout(err error) bool { - if err == nil { - return false - } - _, ok := err.(errTimeOut) - if ok { - return true - } - _, ok = errors.Cause(err).(errTimeOut) - return ok + e := &errTimeOut{} + return errors.As(err, &e) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/makeResIds.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/makeResIds.go index 61fbe1314..ec7320c40 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/makeResIds.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/makeResIds.go @@ -35,7 +35,10 @@ func PrevIds(n *yaml.RNode) ([]resid.ResId, error) { var ids []resid.ResId // TODO: merge previous names and namespaces into one list of // pairs on one annotation so there is no chance of error - annotations := n.GetAnnotations() + annotations := n.GetAnnotations( + BuildAnnotationPreviousNames, + BuildAnnotationPreviousNamespaces, + BuildAnnotationPreviousKinds) if _, ok := annotations[BuildAnnotationPreviousNames]; !ok { return nil, nil } @@ -49,12 +52,10 @@ func PrevIds(n *yaml.RNode) ([]resid.ResId, error) { "number of previous namespaces, " + "number of previous kinds not equal") } + apiVersion := n.GetApiVersion() + group, version := resid.ParseGroupVersion(apiVersion) + ids = make([]resid.ResId, 0, len(names)) for i := range names { - meta, err := n.GetMeta() - if err != nil { - return nil, err - } - group, version := resid.ParseGroupVersion(meta.APIVersion) gvk := resid.Gvk{ Group: group, Version: version, diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go index 0afadd0c3..cda53f864 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go @@ -10,7 +10,7 @@ import ( // TimedCall runs fn, failing if it doesn't complete in the given duration. // The description is used in the timeout error message. func TimedCall(description string, d time.Duration, fn func() error) error { - done := make(chan error) + done := make(chan error, 1) timer := time.NewTimer(d) defer timer.Stop() go func() { done <- fn() }() diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go index 5f1f27ff2..999cbf453 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go @@ -5,17 +5,19 @@ package krusty import ( "fmt" + "log" "sigs.k8s.io/kustomize/api/internal/builtins" + fLdr "sigs.k8s.io/kustomize/api/internal/loader" pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader" "sigs.k8s.io/kustomize/api/internal/target" "sigs.k8s.io/kustomize/api/internal/utils" "sigs.k8s.io/kustomize/api/konfig" - fLdr "sigs.k8s.io/kustomize/api/loader" "sigs.k8s.io/kustomize/api/provenance" "sigs.k8s.io/kustomize/api/provider" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/openapi" ) @@ -89,11 +91,9 @@ func (b *Kustomizer) Run( if err != nil { return nil, err } - if b.options.DoLegacyResourceSort { - err = builtins.NewLegacyOrderTransformerPlugin().Transform(m) - if err != nil { - return nil, err - } + err = b.applySortOrder(m, kt) + if err != nil { + return nil, err } if b.options.AddManagedbyLabel || utils.StringSliceContains(kt.Kustomization().BuildMetadata, types.ManagedByLabelOption) { t := builtins.LabelTransformerPlugin{ @@ -112,10 +112,52 @@ func (b *Kustomizer) Run( } m.RemoveBuildAnnotations() if !utils.StringSliceContains(kt.Kustomization().BuildMetadata, types.OriginAnnotations) { - m.RemoveOriginAnnotations() + err = m.RemoveOriginAnnotations() + if err != nil { + return nil, errors.WrapPrefixf(err, "failed to clean up origin tracking annotations") + } } if !utils.StringSliceContains(kt.Kustomization().BuildMetadata, types.TransformerAnnotations) { - m.RemoveTransformerAnnotations() + err = m.RemoveTransformerAnnotations() + if err != nil { + return nil, errors.WrapPrefixf(err, "failed to clean up transformer annotations") + } } return m, nil } + +func (b *Kustomizer) applySortOrder(m resmap.ResMap, kt *target.KustTarget) error { + // Sort order can be defined in two places: + // - (new) kustomization file + // - (old) CLI flag + // + // We want the kustomization file to take precedence over the CLI flag. + // Eventually, we may want to move away from having a CLI flag altogether: + // https://github.com/kubernetes-sigs/kustomize/issues/3947 + + // Case 1: Sort order set in kustomization file. + if kt.Kustomization().SortOptions != nil { + // If set in CLI flag too, warn the user. + if b.options.Reorder != ReorderOptionUnspecified { + log.Println("Warning: Sorting order is set both in 'kustomization.yaml'" + + " ('sortOptions') and in a CLI flag ('--reorder'). Using the" + + " kustomization file over the CLI flag.") + } + pl := &builtins.SortOrderTransformerPlugin{ + SortOptions: kt.Kustomization().SortOptions, + } + err := pl.Transform(m) + if err != nil { + return errors.Wrap(err) + } + } else if b.options.Reorder == ReorderOptionLegacy || b.options.Reorder == ReorderOptionUnspecified { + // Case 2: Sort order set in CLI flag only or not at all. + pl := &builtins.SortOrderTransformerPlugin{ + SortOptions: &types.SortOptions{ + Order: types.LegacySortOrder, + }, + } + return errors.Wrap(pl.Transform(m)) + } + return nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/krusty/localizer/runner.go b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/localizer/runner.go new file mode 100644 index 000000000..44d2a02c2 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/localizer/runner.go @@ -0,0 +1,17 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localizer + +import ( + "sigs.k8s.io/kustomize/api/internal/localizer" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +// Run executes `kustomize localize` on fSys given the `localize` arguments and +// returns the path to the created newDir. +func Run(fSys filesys.FileSystem, target, scope, newDir string) (string, error) { + dst, err := localizer.Run(target, scope, newDir, fSys) + return dst, errors.Wrap(err) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/krusty/options.go b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/options.go index 438f6c102..086242c8e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/krusty/options.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/krusty/options.go @@ -8,6 +8,14 @@ import ( "sigs.k8s.io/kustomize/api/types" ) +type ReorderOption string + +const ( + ReorderOptionLegacy ReorderOption = "legacy" + ReorderOptionNone ReorderOption = "none" + ReorderOptionUnspecified ReorderOption = "unspecified" +) + // Options holds high-level kustomize configuration options, // e.g. are plugins enabled, should the loader be restricted // to the kustomization root, etc. @@ -16,7 +24,15 @@ type Options struct { // per a particular sort order. When false, don't do the // sort, and instead respect the depth-first resource input // order as specified by the kustomization file(s). - DoLegacyResourceSort bool + + // Sort the resources before emitting them. Possible values: + // - "legacy": Use a fixed order that kustomize provides for backwards + // compatibility. + // - "none": Respect the depth-first resource input order as specified by the + // kustomization file. + // - "unspecified": The user didn't specify any preference. Kustomize will + // select the appropriate default. + Reorder ReorderOption // When true, a label // app.kubernetes.io/managed-by: kustomize- @@ -27,9 +43,6 @@ type Options struct { // See type definition. LoadRestrictions types.LoadRestrictions - // Create an inventory object for pruning. - DoPrune bool - // Options related to kustomize plugins. PluginConfig *types.PluginConfig } @@ -37,11 +50,10 @@ type Options struct { // MakeDefaultOptions returns a default instance of Options. func MakeDefaultOptions() *Options { return &Options{ - DoLegacyResourceSort: false, - AddManagedbyLabel: false, - LoadRestrictions: types.LoadRestrictionsRootOnly, - DoPrune: false, - PluginConfig: types.DisabledPluginConfig(), + Reorder: ReorderOptionNone, + AddManagedbyLabel: false, + LoadRestrictions: types.LoadRestrictionsRootOnly, + PluginConfig: types.DisabledPluginConfig(), } } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/kv/kv.go b/tools/vendor/sigs.k8s.io/kustomize/api/kv/kv.go index 303aede86..61a0463c3 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/kv/kv.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/kv/kv.go @@ -7,15 +7,14 @@ import ( "bufio" "bytes" "fmt" - "os" - "path" "strings" "unicode" "unicode/utf8" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/generators" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" ) var utf8bom = []byte{0xEF, 0xBB, 0xBF} @@ -41,23 +40,23 @@ func (kvl *loader) Load( args types.KvPairSources) (all []types.Pair, err error) { pairs, err := kvl.keyValuesFromEnvFiles(args.EnvSources) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( + return nil, errors.WrapPrefixf(err, "env source files: %v", - args.EnvSources)) + args.EnvSources) } all = append(all, pairs...) pairs, err = keyValuesFromLiteralSources(args.LiteralSources) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "literal sources %v", args.LiteralSources)) + return nil, errors.WrapPrefixf(err, + "literal sources %v", args.LiteralSources) } all = append(all, pairs...) pairs, err = kvl.keyValuesFromFileSources(args.FileSources) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "file sources: %v", args.FileSources)) + return nil, errors.WrapPrefixf(err, + "file sources: %v", args.FileSources) } return append(all, pairs...), nil } @@ -77,7 +76,7 @@ func keyValuesFromLiteralSources(sources []string) ([]types.Pair, error) { func (kvl *loader) keyValuesFromFileSources(sources []string) ([]types.Pair, error) { var kvs []types.Pair for _, s := range sources { - k, fPath, err := parseFileSource(s) + k, fPath, err := generators.ParseFileSource(s) if err != nil { return nil, err } @@ -162,44 +161,13 @@ func (kvl *loader) keyValuesFromLine(line []byte, currentLine int) (types.Pair, if len(data) == 2 { kv.Value = data[1] } else { - // No value (no `=` in the line) is a signal to obtain the value - // from the environment. This behaviour was accidentally imported from kubectl code, and - // will be removed in the next major release of Kustomize. - _, _ = fmt.Fprintln(os.Stderr, "WARNING: "+ - "This Kustomization is relying on a bug that loads values from the environment "+ - "when they are omitted from an env file. "+ - "This behaviour will be removed in the next major release of Kustomize.") - kv.Value = os.Getenv(key) + // If there is no value (no `=` in the line), we set the value to an empty string + kv.Value = "" } kv.Key = key return kv, nil } -// ParseFileSource parses the source given. -// -// Acceptable formats include: -// 1. source-path: the basename will become the key name -// 2. source-name=source-path: the source-name will become the key name and -// source-path is the path to the key file. -// -// Key names cannot include '='. -func parseFileSource(source string) (keyName, filePath string, err error) { - numSeparators := strings.Count(source, "=") - switch { - case numSeparators == 0: - return path.Base(source), source, nil - case numSeparators == 1 && strings.HasPrefix(source, "="): - return "", "", fmt.Errorf("key name for file path %v missing", strings.TrimPrefix(source, "=")) - case numSeparators == 1 && strings.HasSuffix(source, "="): - return "", "", fmt.Errorf("file path for key name %v missing", strings.TrimSuffix(source, "=")) - case numSeparators > 1: - return "", "", errors.New("key names or file paths cannot contain '='") - default: - components := strings.Split(source, "=") - return components[0], components[1], nil - } -} - // ParseLiteralSource parses the source key=val pair into its component pieces. // This functionality is distinguished from strings.SplitN(source, "=", 2) since // it returns an error in the case of empty keys, values, or a missing equals sign. @@ -219,7 +187,7 @@ func parseLiteralSource(source string) (keyName, value string, err error) { // removeQuotes removes the surrounding quotes from the provided string only if it is surrounded on both sides // rather than blindly trimming all quotation marks on either side. func removeQuotes(str string) string { - if len(str) == 0 || str[0] != str[len(str)-1] { + if len(str) < 2 || str[0] != str[len(str)-1] { return str } if str[0] == '"' || str[0] == '\'' { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/pkg/loader/loader.go b/tools/vendor/sigs.k8s.io/kustomize/api/pkg/loader/loader.go new file mode 100644 index 000000000..90fd6fb4e --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/pkg/loader/loader.go @@ -0,0 +1,24 @@ +// Copyright 2023 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package pkg has all the helpers to interact with the api. +package loader + +import ( + "sigs.k8s.io/kustomize/api/internal/loader" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +// NewFileLoaderAtCwd returns a loader that loads from PWD. +// A convenience for kustomize edit commands. +func NewFileLoaderAtCwd(fSys filesys.FileSystem) *loader.FileLoader { + return loader.NewLoaderOrDie( + loader.RestrictionRootOnly, fSys, filesys.SelfDir) +} + +// NewFileLoaderAtRoot returns a loader that loads from "/". +// A convenience for tests. +func NewFileLoaderAtRoot(fSys filesys.FileSystem) *loader.FileLoader { + return loader.NewLoaderOrDie( + loader.RestrictionRootOnly, fSys, filesys.Separator) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go b/tools/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go index 4ad40395a..0e24fc36c 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go @@ -6,47 +6,63 @@ package provenance import ( "fmt" "runtime" + "runtime/debug" "strings" ) +// These variables are set at build time using ldflags. +// +//nolint:gochecknoglobals var ( - version = "unknown" - // sha1 from git, output of $(git rev-parse HEAD) - gitCommit = "$Format:%H$" + // During a release, this will be set to the release tag, e.g. "kustomize/v4.5.7" + version = developmentVersion // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') - buildDate = "1970-01-01T00:00:00Z" - goos = runtime.GOOS - goarch = runtime.GOARCH + buildDate = "unknown" ) +// This default value, (devel), matches +// the value debug.BuildInfo uses for an unset main module version. +const developmentVersion = "(devel)" + // Provenance holds information about the build of an executable. type Provenance struct { // Version of the kustomize binary. - Version string `json:"version,omitempty"` + Version string `json:"version,omitempty" yaml:"version,omitempty"` // GitCommit is a git commit - GitCommit string `json:"gitCommit,omitempty"` + GitCommit string `json:"gitCommit,omitempty" yaml:"gitCommit,omitempty"` // BuildDate is date of the build. - BuildDate string `json:"buildDate,omitempty"` + BuildDate string `json:"buildDate,omitempty" yaml:"buildDate,omitempty"` // GoOs holds OS name. - GoOs string `json:"goOs,omitempty"` + GoOs string `json:"goOs,omitempty" yaml:"goOs,omitempty"` // GoArch holds architecture name. - GoArch string `json:"goArch,omitempty"` + GoArch string `json:"goArch,omitempty" yaml:"goArch,omitempty"` + // GoVersion holds Go version. + GoVersion string `json:"goVersion,omitempty" yaml:"goVersion,omitempty"` } // GetProvenance returns an instance of Provenance. func GetProvenance() Provenance { - return Provenance{ - version, - gitCommit, - buildDate, - goos, - goarch, + p := Provenance{ + BuildDate: buildDate, + Version: version, + GitCommit: "unknown", + GoOs: runtime.GOOS, + GoArch: runtime.GOARCH, + GoVersion: runtime.Version(), + } + info, ok := debug.ReadBuildInfo() + if !ok { + return p } -} -// Full returns the full provenance stamp. -func (v Provenance) Full() string { - return fmt.Sprintf("%+v", v) + for _, setting := range info.Settings { + // For now, the git commit is the only information of interest. + // We could consider adding other info such as the commit date in the future. + if setting.Key == "vcs.revision" { + p.GitCommit = setting.Value + } + } + return p } // Short returns the shortened provenance stamp. diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go b/tools/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go index ee6c68f10..9cc860749 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go @@ -4,11 +4,11 @@ package resmap import ( - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/kusterr" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -81,7 +81,7 @@ func (rmF *Factory) NewResMapFromConfigMapArgs( for i := range argList { res, err := rmF.resF.MakeConfigMap(kvLdr, &argList[i]) if err != nil { - return nil, errors.Wrap(err, "NewResMapFromConfigMapArgs") + return nil, errors.WrapPrefixf(err, "NewResMapFromConfigMapArgs") } resources = append(resources, res) } @@ -106,7 +106,7 @@ func (rmF *Factory) NewResMapFromSecretArgs( for i := range argsList { res, err := rmF.resF.MakeSecret(kvLdr, &argsList[i]) if err != nil { - return nil, errors.Wrap(err, "NewResMapFromSecretArgs") + return nil, errors.WrapPrefixf(err, "NewResMapFromSecretArgs") } resources = append(resources, res) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go b/tools/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go index e80299448..2e34fae6a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go @@ -8,10 +8,10 @@ import ( "fmt" "reflect" - "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/filters/annotations" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/resid" kyaml "sigs.k8s.io/kustomize/kyaml/yaml" @@ -108,7 +108,7 @@ func (m *resWrangler) Replace(res *resource.Resource) (int, error) { id := res.CurId() i, err := m.GetIndexOfCurrentId(id) if err != nil { - return -1, errors.Wrap(err, "in Replace") + return -1, errors.WrapPrefixf(err, "in Replace") } if i < 0 { return -1, fmt.Errorf("cannot find resource with id %s to replace", id) @@ -286,7 +286,7 @@ func (m *resWrangler) AsYaml() ([]byte, error) { out, err := res.AsYAML() if err != nil { m, _ := res.Map() - return nil, errors.Wrapf(err, "%#v", m) + return nil, errors.WrapPrefixf(err, "%#v", m) } if firstObj { firstObj = false @@ -696,8 +696,7 @@ func (m *resWrangler) DeAnchor() (err error) { } // ApplySmPatch applies the patch, and errors on Id collisions. -func (m *resWrangler) ApplySmPatch( - selectedSet *resource.IdSet, patch *resource.Resource) error { +func (m *resWrangler) ApplySmPatch(selectedSet *resource.IdSet, patch *resource.Resource) error { var list []*resource.Resource for _, res := range m.rList { if selectedSet.Contains(res.CurId()) { diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resource/factory.go b/tools/vendor/sigs.k8s.io/kustomize/api/resource/factory.go index cbda87237..f67fbf360 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resource/factory.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/resource/factory.go @@ -42,7 +42,12 @@ func (rf *Factory) Hasher() ifc.KustHasher { // FromMap returns a new instance of Resource. func (rf *Factory) FromMap(m map[string]interface{}) *Resource { - return rf.FromMapAndOption(m, nil) + res, err := rf.FromMapAndOption(m, nil) + if err != nil { + // TODO: return err instead of log. + log.Fatalf("failed to create resource from map: %v", err) + } + return res } // FromMapWithName returns a new instance with the given "original" name. @@ -52,19 +57,22 @@ func (rf *Factory) FromMapWithName(n string, m map[string]interface{}) *Resource // FromMapWithNamespaceAndName returns a new instance with the given "original" namespace. func (rf *Factory) FromMapWithNamespaceAndName(ns string, n string, m map[string]interface{}) *Resource { - r := rf.FromMapAndOption(m, nil) + r, err := rf.FromMapAndOption(m, nil) + if err != nil { + // TODO: return err instead of log. + log.Fatalf("failed to create resource from map: %v", err) + } return r.setPreviousId(ns, n, r.GetKind()) } // FromMapAndOption returns a new instance of Resource with given options. func (rf *Factory) FromMapAndOption( - m map[string]interface{}, args *types.GeneratorArgs) *Resource { + m map[string]interface{}, args *types.GeneratorArgs) (*Resource, error) { n, err := yaml.FromMap(m) if err != nil { - // TODO: return err instead of log. - log.Fatal(err) + return nil, fmt.Errorf("failed to convert map to YAML node: %w", err) } - return rf.makeOne(n, args) + return rf.makeOne(n, args), nil } // makeOne returns a new instance of Resource. diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resource/origin.go b/tools/vendor/sigs.k8s.io/kustomize/api/resource/origin.go index 3f4cfe340..f0a4ae75d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resource/origin.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/resource/origin.go @@ -52,7 +52,7 @@ func (origin *Origin) Append(path string) *Origin { originCopy := origin.Copy() repoSpec, err := git.NewRepoSpecFromURL(path) if err == nil { - originCopy.Repo = repoSpec.Host + repoSpec.OrgRepo + originCopy.Repo = repoSpec.CloneSpec() absPath := repoSpec.AbsPath() path = absPath[strings.Index(absPath[1:], "/")+1:][1:] originCopy.Path = "" diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/resource/resource.go b/tools/vendor/sigs.k8s.io/kustomize/api/resource/resource.go index a88ce31d2..ae1a98be0 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/resource/resource.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/resource/resource.go @@ -164,10 +164,17 @@ func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) error { mergeStringMaps(other.GetLabels(), r.GetLabels())); err != nil { return fmt.Errorf("copyMerge cannot set labels - %w", err) } - if err := r.SetAnnotations( - mergeStringMapsWithBuildAnnotations(other.GetAnnotations(), r.GetAnnotations())); err != nil { + + ra := r.GetAnnotations() + _, enableNameSuffixHash := ra[utils.BuildAnnotationsGenAddHashSuffix] + merged := mergeStringMapsWithBuildAnnotations(other.GetAnnotations(), ra) + if !enableNameSuffixHash { + delete(merged, utils.BuildAnnotationsGenAddHashSuffix) + } + if err := r.SetAnnotations(merged); err != nil { return fmt.Errorf("copyMerge cannot set annotations - %w", err) } + if err := r.SetName(other.GetName()); err != nil { return fmt.Errorf("copyMerge cannot set name - %w", err) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go index 73ee95fd7..9e6ffacff 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go @@ -6,7 +6,7 @@ package types import ( "fmt" - "github.com/pkg/errors" + "sigs.k8s.io/kustomize/kyaml/errors" ) type errOnlyBuiltinPluginsAllowed struct { @@ -24,10 +24,6 @@ func NewErrOnlyBuiltinPluginsAllowed(n string) *errOnlyBuiltinPluginsAllowed { } func IsErrOnlyBuiltinPluginsAllowed(err error) bool { - _, ok := err.(*errOnlyBuiltinPluginsAllowed) - if ok { - return true - } - _, ok = errors.Cause(err).(*errOnlyBuiltinPluginsAllowed) - return ok + e := &errOnlyBuiltinPluginsAllowed{} + return errors.As(err, &e) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go index f95b8edd5..b91bb68ff 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "github.com/pkg/errors" + "sigs.k8s.io/kustomize/kyaml/errors" ) type errUnableToFind struct { @@ -31,10 +31,6 @@ func NewErrUnableToFind(w string, a []Pair) *errUnableToFind { } func IsErrUnableToFind(err error) bool { - _, ok := err.(*errUnableToFind) - if ok { - return true - } - _, ok = errors.Cause(err).(*errUnableToFind) - return ok + e := &errUnableToFind{} + return errors.As(err, &e) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go index 8d3579544..8b78889ea 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go @@ -30,6 +30,8 @@ type FieldSpec struct { resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` Path string `json:"path,omitempty" yaml:"path,omitempty"` CreateIfNotPresent bool `json:"create,omitempty" yaml:"create,omitempty"` + + // Note: If any new pointer based members are added, FsSlice.DeepCopy needs to be updated } func (fs FieldSpec) String() string { @@ -50,6 +52,13 @@ func (s FsSlice) Less(i, j int) bool { return s[i].Gvk.IsLessThan(s[j].Gvk) } +// DeepCopy returns a new copy of FsSlice +func (s FsSlice) DeepCopy() FsSlice { + ret := make(FsSlice, len(s)) + copy(ret, s) + return ret +} + // MergeAll merges the argument into this, returning the result. // Items already present are ignored. // Items that conflict (primary key matches, but remain data differs) diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/fix.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/fix.go deleted file mode 100644 index de70467ed..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/fix.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package types - -import ( - "regexp" - - "sigs.k8s.io/yaml" -) - -// FixKustomizationPreUnmarshalling modifies the raw data -// before marshalling - e.g. changes old field names to -// new field names. -func FixKustomizationPreUnmarshalling(data []byte) ([]byte, error) { - deprecatedFieldsMap := map[string]string{ - "imageTags:": "images:", - } - for oldname, newname := range deprecatedFieldsMap { - pattern := regexp.MustCompile(oldname) - data = pattern.ReplaceAll(data, []byte(newname)) - } - doLegacy, err := useLegacyPatch(data) - if err != nil { - return nil, err - } - if doLegacy { - pattern := regexp.MustCompile("patches:") - data = pattern.ReplaceAll(data, []byte("patchesStrategicMerge:")) - } - return data, nil -} - -func useLegacyPatch(data []byte) (bool, error) { - found := false - var object map[string]interface{} - err := yaml.Unmarshal(data, &object) - if err != nil { - return false, err - } - if rawPatches, ok := object["patches"]; ok { - patches, ok := rawPatches.([]interface{}) - if !ok { - return false, err - } - for _, p := range patches { - _, ok := p.(string) - if ok { - found = true - } - } - } - return found, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go index a4145db3d..eae221bed 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go @@ -5,7 +5,7 @@ package types // GeneratorArgs contains arguments common to ConfigMap and Secret generators. type GeneratorArgs struct { - // Namespace for the configmap, optional + // Namespace for the resource, optional Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` // Name - actually the partial name - of the generated resource. diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go index 05d540462..1ed89c01c 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go @@ -3,6 +3,10 @@ package types +import "path/filepath" + +const HelmDefaultHome = "charts" + type HelmGlobals struct { // ChartHome is a file path, relative to the kustomization root, // to a directory containing a subdirectory for each chart to be @@ -55,7 +59,11 @@ type HelmChart struct { // in the helm template Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` - // ValuesFile is local file path to a values file to use _instead of_ + // AdditionalValuesFiles are local file paths to values files to be used in + // addition to either the default values file or the values specified in ValuesFile. + AdditionalValuesFiles []string `json:"additionalValuesFiles,omitempty" yaml:"additionalValuesFiles,omitempty"` + + // ValuesFile is a local file path to a values file to use _instead of_ // the default values that accompanied the chart. // The default values are in '{ChartHome}/{Name}/values.yaml'. ValuesFile string `json:"valuesFile,omitempty" yaml:"valuesFile,omitempty"` @@ -71,7 +79,23 @@ type HelmChart struct { // IncludeCRDs specifies if Helm should also generate CustomResourceDefinitions. // Defaults to 'false'. - IncludeCRDs bool `json:"includeCRDs,omitempty" yaml:"includeCRDs,omitempty"` // nolint: tagliatelle + IncludeCRDs bool `json:"includeCRDs,omitempty" yaml:"includeCRDs,omitempty"` //nolint: tagliatelle + + // SkipHooks sets the --no-hooks flag when calling helm template. This prevents + // helm from erroneously rendering test templates. + SkipHooks bool `json:"skipHooks,omitempty" yaml:"skipHooks,omitempty"` + + // ApiVersions is the kubernetes apiversions used for Capabilities.APIVersions + ApiVersions []string `json:"apiVersions,omitempty" yaml:"apiVersions,omitempty"` + + // KubeVersion is the kubernetes version used by Helm for Capabilities.KubeVersion" + KubeVersion string `json:"kubeVersion,omitempty" yaml:"kubeVersion,omitempty"` + + // NameTemplate is for specifying the name template used to name the release. + NameTemplate string `json:"nameTemplate,omitempty" yaml:"nameTemplate,omitempty"` + + // SkipTests skips tests from templated output. + SkipTests bool `json:"skipTests,omitempty" yaml:"skipTests,omitempty"` } // HelmChartArgs contains arguments to helm. @@ -120,3 +144,49 @@ func makeHelmChartFromHca(old *HelmChartArgs) (c HelmChart) { c.ReleaseName = old.ReleaseName return } + +func (h HelmChart) AsHelmArgs(absChartHome string) []string { + args := []string{"template"} + if h.ReleaseName != "" { + args = append(args, h.ReleaseName) + } else { + // AFAICT, this doesn't work as intended due to a bug in helm. + // See https://github.com/helm/helm/issues/6019 + // I've tried placing the flag before and after the name argument. + args = append(args, "--generate-name") + } + if h.Name != "" { + args = append(args, filepath.Join(absChartHome, h.Name)) + } + if h.Namespace != "" { + args = append(args, "--namespace", h.Namespace) + } + if h.NameTemplate != "" { + args = append(args, "--name-template", h.NameTemplate) + } + + if h.ValuesFile != "" { + args = append(args, "-f", h.ValuesFile) + } + for _, valuesFile := range h.AdditionalValuesFiles { + args = append(args, "-f", valuesFile) + } + + for _, apiVer := range h.ApiVersions { + args = append(args, "--api-versions", apiVer) + } + if h.KubeVersion != "" { + args = append(args, "--kube-version", h.KubeVersion) + } + + if h.IncludeCRDs { + args = append(args, "--include-crds") + } + if h.SkipTests { + args = append(args, "--skip-tests") + } + if h.SkipHooks { + args = append(args, "--no-hooks") + } + return args +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/inventory.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/inventory.go deleted file mode 100644 index 544deb5e5..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/inventory.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package types - -// Inventory records all objects touched in a build operation. -type Inventory struct { - Type string `json:"type,omitempty" yaml:"type,omitempty"` - ConfigMap NameArgs `json:"configMap,omitempty" yaml:"configMap,omitempty"` -} - -// NameArgs holds both namespace and name. -type NameArgs struct { - Name string `json:"name,omitempty" yaml:"name,omitempty"` - Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go index c194dcc3c..f86ec0b9e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go @@ -7,16 +7,21 @@ import ( "bytes" "encoding/json" "fmt" + "reflect" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/yaml" ) const ( - KustomizationVersion = "kustomize.config.k8s.io/v1beta1" - KustomizationKind = "Kustomization" - ComponentVersion = "kustomize.config.k8s.io/v1alpha1" - ComponentKind = "Component" - MetadataNamespacePath = "metadata/namespace" + KustomizationVersion = "kustomize.config.k8s.io/v1beta1" + KustomizationKind = "Kustomization" + ComponentVersion = "kustomize.config.k8s.io/v1alpha1" + ComponentKind = "Component" + MetadataNamespacePath = "metadata/namespace" + MetadataNamespaceApiVersion = "v1" + MetadataNamePath = "metadata/name" OriginAnnotations = "originAnnotations" TransformerAnnotations = "transformerAnnotations" @@ -59,12 +64,14 @@ type Kustomization struct { // CommonAnnotations to add to all objects. CommonAnnotations map[string]string `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` + // Deprecated: Use the Patches field instead, which provides a superset of the functionality of PatchesStrategicMerge. // PatchesStrategicMerge specifies the relative path to a file // containing a strategic merge patch. Format documented at // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md // URLs and globs are not supported. PatchesStrategicMerge []PatchStrategicMerge `json:"patchesStrategicMerge,omitempty" yaml:"patchesStrategicMerge,omitempty"` + // Deprecated: Use the Patches field instead, which provides a superset of the functionality of JSONPatches. // JSONPatches is a list of JSONPatch for applying JSON patch. // Format documented at https://tools.ietf.org/html/rfc6902 // and http://jsonpatch.com @@ -80,6 +87,9 @@ type Kustomization struct { // patch, but this operator is simpler to specify. Images []Image `json:"images,omitempty" yaml:"images,omitempty"` + // Deprecated: Use the Images field instead. + ImageTags []Image `json:"imageTags,omitempty" yaml:"imageTags,omitempty"` + // Replacements is a list of replacements, which will copy nodes from a // specified source to N specified targets. Replacements []ReplacementField `json:"replacements,omitempty" yaml:"replacements,omitempty"` @@ -88,6 +98,7 @@ type Kustomization struct { // specification. This can also be done with a patch. Replicas []Replica `json:"replicas,omitempty" yaml:"replicas,omitempty"` + // Deprecated: Vars will be removed in future release. Migrate to Replacements instead. // Vars allow things modified by kustomize to be injected into a // kubernetes object specification. A var is a name (e.g. FOO) associated // with a field in a specific resource instance. The field must @@ -97,6 +108,9 @@ type Kustomization struct { // value of the specified field has been determined. Vars []Var `json:"vars,omitempty" yaml:"vars,omitempty"` + // SortOptions change the order that kustomize outputs resources. + SortOptions *SortOptions `json:"sortOptions,omitempty" yaml:"sortOptions,omitempty"` + // // Operands - what kustomize operates on. // @@ -116,9 +130,7 @@ type Kustomization struct { // CRDs themselves are not modified. Crds []string `json:"crds,omitempty" yaml:"crds,omitempty"` - // Deprecated. - // Anything that would have been specified here should - // be specified in the Resources field instead. + // Deprecated: Anything that would have been specified here should be specified in the Resources field instead. Bases []string `json:"bases,omitempty" yaml:"bases,omitempty"` // @@ -164,19 +176,50 @@ type Kustomization struct { // Validators is a list of files containing validators Validators []string `json:"validators,omitempty" yaml:"validators,omitempty"` - // Inventory appends an object that contains the record - // of all other objects, which can be used in apply, prune and delete - Inventory *Inventory `json:"inventory,omitempty" yaml:"inventory,omitempty"` - // BuildMetadata is a list of strings used to toggle different build options BuildMetadata []string `json:"buildMetadata,omitempty" yaml:"buildMetadata,omitempty"` } -// FixKustomizationPostUnmarshalling fixes things +const ( + deprecatedWarningToRunEditFix = "Run 'kustomize edit fix' to update your Kustomization automatically." + deprecatedWarningToRunEditFixExperimential = "[EXPERIMENTAL] Run 'kustomize edit fix' to update your Kustomization automatically." + deprecatedBaseWarningMessage = "# Warning: 'bases' is deprecated. Please use 'resources' instead." + " " + deprecatedWarningToRunEditFix + deprecatedImageTagsWarningMessage = "# Warning: 'imageTags' is deprecated. Please use 'images' instead." + " " + deprecatedWarningToRunEditFix + deprecatedPatchesJson6902Message = "# Warning: 'patchesJson6902' is deprecated. Please use 'patches' instead." + " " + deprecatedWarningToRunEditFix + deprecatedPatchesStrategicMergeMessage = "# Warning: 'patchesStrategicMerge' is deprecated. Please use 'patches' instead." + " " + deprecatedWarningToRunEditFix + deprecatedVarsMessage = "# Warning: 'vars' is deprecated. Please use 'replacements' instead." + " " + deprecatedWarningToRunEditFixExperimential + deprecatedCommonLabelsWarningMessage = "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead." + " " + deprecatedWarningToRunEditFix +) + +// CheckDeprecatedFields check deprecated field is used or not. +func (k *Kustomization) CheckDeprecatedFields() *[]string { + var warningMessages []string + if k.Bases != nil { + warningMessages = append(warningMessages, deprecatedBaseWarningMessage) + } + if k.CommonLabels != nil { + warningMessages = append(warningMessages, deprecatedCommonLabelsWarningMessage) + } + if k.ImageTags != nil { + warningMessages = append(warningMessages, deprecatedImageTagsWarningMessage) + } + if k.PatchesJson6902 != nil { + warningMessages = append(warningMessages, deprecatedPatchesJson6902Message) + } + if k.PatchesStrategicMerge != nil { + warningMessages = append(warningMessages, deprecatedPatchesStrategicMergeMessage) + } + if k.Vars != nil { + warningMessages = append(warningMessages, deprecatedVarsMessage) + } + return &warningMessages +} + +// FixKustomization fixes things // like empty fields that should not be empty, or // moving content of deprecated fields to newer // fields. -func (k *Kustomization) FixKustomizationPostUnmarshalling() { +func (k *Kustomization) FixKustomization() { if k.Kind == "" { k.Kind = KustomizationKind } @@ -187,8 +230,15 @@ func (k *Kustomization) FixKustomizationPostUnmarshalling() { k.APIVersion = KustomizationVersion } } + + // 'bases' field was deprecated in favor of the 'resources' field. k.Resources = append(k.Resources, k.Bases...) k.Bases = nil + + // 'imageTags' field was deprecated in favor of the 'images' field. + k.Images = append(k.Images, k.ImageTags...) + k.ImageTags = nil + for i, g := range k.ConfigMapGenerator { if g.EnvSource != "" { k.ConfigMapGenerator[i].EnvSources = @@ -217,11 +267,25 @@ func (k *Kustomization) FixKustomizationPostUnmarshalling() { // FixKustomizationPreMarshalling fixes things // that should occur after the kustomization file // has been processed. -func (k *Kustomization) FixKustomizationPreMarshalling() error { +func (k *Kustomization) FixKustomizationPreMarshalling(fSys filesys.FileSystem) error { // PatchesJson6902 should be under the Patches field. k.Patches = append(k.Patches, k.PatchesJson6902...) k.PatchesJson6902 = nil + if k.PatchesStrategicMerge != nil { + for _, patchStrategicMerge := range k.PatchesStrategicMerge { + // check this patch is file path select. + if _, err := fSys.ReadFile(string(patchStrategicMerge)); err == nil { + // path patch + k.Patches = append(k.Patches, Patch{Path: string(patchStrategicMerge)}) + } else { + // inline string patch + k.Patches = append(k.Patches, Patch{Patch: string(patchStrategicMerge)}) + } + } + k.PatchesStrategicMerge = nil + } + // this fix is not in FixKustomizationPostUnmarshalling because // it will break some commands like `create` and `add`. those // commands depend on 'commonLabels' field @@ -241,6 +305,20 @@ func (k *Kustomization) FixKustomizationPreMarshalling() error { return nil } +func (k *Kustomization) CheckEmpty() error { + // generate empty Kustomization + emptyKustomization := &Kustomization{} + + // k.TypeMeta is metadata. It Isn't related to whether empty or not. + emptyKustomization.TypeMeta = k.TypeMeta + + if reflect.DeepEqual(k, emptyKustomization) { + return fmt.Errorf("kustomization.yaml is empty") + } + + return nil +} + func (k *Kustomization) EnforceFields() []string { var errs []string if k.Kind != "" && k.Kind != KustomizationKind && k.Kind != ComponentKind { @@ -258,16 +336,19 @@ func (k *Kustomization) EnforceFields() []string { // Unmarshal replace k with the content in YAML input y func (k *Kustomization) Unmarshal(y []byte) error { + // TODO: switch to strict decoding to catch duplicate keys. + // We can't do so until there is a yaml decoder that supports anchors AND case-insensitive keys. + // See https://github.com/kubernetes-sigs/kustomize/issues/5061 j, err := yaml.YAMLToJSON(y) if err != nil { - return err + return errors.WrapPrefixf(err, "invalid Kustomization") } dec := json.NewDecoder(bytes.NewReader(j)) dec.DisallowUnknownFields() var nk Kustomization err = dec.Decode(&nk) if err != nil { - return err + return errors.WrapPrefixf(err, "invalid Kustomization") } *k = nk return nil diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go index 741e5debc..aa511ae79 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go @@ -4,8 +4,10 @@ package types type HelmConfig struct { - Enabled bool - Command string + Enabled bool + Command string + ApiVersions []string + KubeVersion string } // PluginConfig holds plugin configuration. diff --git a/tools/vendor/sigs.k8s.io/kustomize/api/types/sortoptions.go b/tools/vendor/sigs.k8s.io/kustomize/api/types/sortoptions.go new file mode 100644 index 000000000..64dd48808 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/api/types/sortoptions.go @@ -0,0 +1,28 @@ +// Copyright 2021 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// SortOptions defines the order that kustomize outputs resources. +type SortOptions struct { + // Order selects the ordering strategy. + Order SortOrder `json:"order,omitempty" yaml:"order,omitempty"` + // LegacySortOptions tweaks the sorting for the "legacy" sort ordering + // strategy. + LegacySortOptions *LegacySortOptions `json:"legacySortOptions,omitempty" yaml:"legacySortOptions,omitempty"` +} + +// SortOrder defines different ordering strategies. +type SortOrder string + +const LegacySortOrder SortOrder = "legacy" +const FIFOSortOrder SortOrder = "fifo" + +// LegacySortOptions define various options for tweaking the "legacy" ordering +// strategy. +type LegacySortOptions struct { + // OrderFirst selects the resource kinds to order first. + OrderFirst []string `json:"orderFirst" yaml:"orderFirst"` + // OrderLast selects the resource kinds to order last. + OrderLast []string `json:"orderLast" yaml:"orderLast"` +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cfg.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cfg.go index a979f3fa6..83a3276e3 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cfg.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cfg.go @@ -11,21 +11,12 @@ import ( func GetCfg(name string) *cobra.Command { cmd := &cobra.Command{ Use: "cfg", - Short: "Commands for reading and writing configuration.", + Short: "Commands for reading and writing configuration", } - cmd.AddCommand(commands.AnnotateCommand(name)) cmd.AddCommand(commands.CatCommand(name)) cmd.AddCommand(commands.CountCommand(name)) - cmd.AddCommand(commands.CreateSetterCommand(name)) - cmd.AddCommand(commands.CreateSubstitutionCommand(name)) - cmd.AddCommand(commands.FmtCommand(name)) cmd.AddCommand(commands.GrepCommand(name)) - cmd.AddCommand(commands.InitCommand(name)) - cmd.AddCommand(commands.ListSettersCommand(name)) - cmd.AddCommand(commands.MergeCommand(name)) - cmd.AddCommand(commands.Merge3Command(name)) - cmd.AddCommand(commands.SetCommand(name)) cmd.AddCommand(commands.TreeCommand(name)) return cmd diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cmds.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cmds.go index 0a46b03c7..dd56a0b69 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cmds.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/cmds.go @@ -14,27 +14,14 @@ import ( ) // Export commands publicly for composition +// +//nolint:gochecknoglobals var ( - Annotate = commands.AnnotateCommand - Cat = commands.CatCommand - Count = commands.CountCommand - CreateSetter = commands.CreateSetterCommand - CreateSubstitution = commands.CreateSubstitutionCommand - DeleteSetter = commands.DeleteSetterCommand - DeleteSubstitution = commands.DeleteSubstitutionCommand - Fmt = commands.FmtCommand - Grep = commands.GrepCommand - Init = commands.InitCommand - ListSetters = commands.ListSettersCommand - Merge = commands.MergeCommand - Merge3 = commands.Merge3Command - RunFn = commands.RunCommand - Set = commands.SetCommand - Sink = commands.SinkCommand - Source = commands.SourceCommand - Tree = commands.TreeCommand - Wrap = commands.WrapCommand - XArgs = commands.XArgsCommand + Cat = commands.CatCommand + Count = commands.CountCommand + Grep = commands.GrepCommand + RunFn = commands.RunCommand + Tree = commands.TreeCommand StackOnError = &runner.StackOnError ExitOnError = &runner.ExitOnError diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/fn.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/fn.go index f6f7b68af..89c0d90fa 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/fn.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/configcobra/fn.go @@ -11,14 +11,9 @@ import ( func GetFn(name string) *cobra.Command { cmd := &cobra.Command{ Use: "fn", - Short: "Commands for running functions against configuration.", + Short: "Commands for running functions against configuration", } cmd.AddCommand(commands.RunCommand(name)) - cmd.AddCommand(commands.SinkCommand(name)) - cmd.AddCommand(commands.SourceCommand(name)) - cmd.AddCommand(commands.WrapCommand()) - cmd.AddCommand(commands.XArgsCommand()) - return cmd } diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/annotate.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/annotate.go deleted file mode 100644 index 43da1eb92..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/annotate.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "strings" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// NewAnnotateRunner returns a command runner. -func NewAnnotateRunner(parent string) *AnnotateRunner { - r := &AnnotateRunner{} - c := &cobra.Command{ - Use: "annotate [DIR]", - Args: cobra.MaximumNArgs(1), - Short: commands.AnnotateShort, - Long: commands.AnnotateLong, - Example: commands.AnnotateExamples, - RunE: r.runE, - Deprecated: "use the `commonAnnotations` field in your kustomization file.", - } - runner.FixDocs(parent, c) - r.Command = c - c.Flags().StringVar(&r.Kind, "kind", "", "Resource kind to annotate") - c.Flags().StringVar(&r.ApiVersion, "apiVersion", "", "Resource apiVersion to annotate") - c.Flags().StringVar(&r.Name, "name", "", "Resource name to annotate") - c.Flags().StringVar(&r.Namespace, "namespace", "", "Resource namespace to annotate") - c.Flags().StringSliceVar(&r.Values, "kv", []string{}, "annotation as KEY=VALUE") - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "add annotations recursively in all the nested subpackages") - return r -} - -func AnnotateCommand(parent string) *cobra.Command { - return NewAnnotateRunner(parent).Command -} - -type AnnotateRunner struct { - Command *cobra.Command - Values []string - Kind string - Name string - ApiVersion string - Namespace string - Path string - RecurseSubPackages bool -} - -func (r *AnnotateRunner) runE(c *cobra.Command, args []string) error { - var input []kio.Reader - var output []kio.Writer - if len(args) == 0 { - rw := &kio.ByteReadWriter{Reader: c.InOrStdin(), Writer: c.OutOrStdout()} - input = []kio.Reader{rw} - output = []kio.Writer{rw} - - return runner.HandleError(c, kio.Pipeline{ - Inputs: input, - Filters: []kio.Filter{r}, - Outputs: output, - }.Execute()) - } - - e := runner.ExecuteCmdOnPkgs{ - Writer: c.OutOrStdout(), - NeedOpenAPI: false, - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - RootPkgPath: args[0], - } - - err := e.Execute() - if err != nil { - return err - } - return nil -} - -func (r *AnnotateRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - rw := &kio.LocalPackageReadWriter{ - PackagePath: pkgPath, - NoDeleteFiles: true, - PackageFileName: ext.KRMFileName(), - } - input := []kio.Reader{rw} - output := []kio.Writer{rw} - err := kio.Pipeline{ - Inputs: input, - Filters: []kio.Filter{r}, - Outputs: output, - }.Execute() - if err != nil { - // return err if there is only package - if !r.RecurseSubPackages { - return err - } - // print error message and continue if there are multiple packages to annotate - _, _ = fmt.Fprintf(w, "%s\n", err.Error()) - } else { - _, _ = fmt.Fprint(w, "added annotations in the package\n") - } - return nil -} - -func (r *AnnotateRunner) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { - for i := range nodes { - n := nodes[i] - m, err := n.GetMeta() - if err != nil { - return nil, err - } - if r.Kind != "" && r.Kind != m.Kind { - continue - } - if r.ApiVersion != "" && r.ApiVersion != m.APIVersion { - continue - } - if r.Namespace != "" && r.Namespace != m.Namespace { - continue - } - if r.Name != "" && r.Name != m.Name { - continue - } - - for i := range r.Values { - // split key, value pairs - kv := strings.SplitN(r.Values[i], "=", 2) - if len(kv) != 2 { - return nil, errors.Errorf("must specify --kv as KEY=VALUE: %s", r.Values[i]) - } - if err := n.PipeE(yaml.SetAnnotation(kv[0], kv[1])); err != nil { - return nil, err - } - } - } - return nodes, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesetter.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesetter.go deleted file mode 100644 index 59318d95b..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesetter.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2/settersutil" -) - -// NewCreateSetterRunner returns a command runner. -func NewCreateSetterRunner(parent string) *CreateSetterRunner { - r := &CreateSetterRunner{} - set := &cobra.Command{ - Use: "create-setter DIR NAME VALUE", - Args: cobra.RangeArgs(2, 3), - Short: commands.CreateSetterShort, - Long: commands.CreateSetterLong, - Example: commands.CreateSetterExamples, - PreRunE: r.preRunE, - RunE: r.runE, - Deprecated: "setter commands will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - set.Flags().StringVar(&r.FieldValue, "value", "", - "optional flag, alternative to specifying the value as an argument. e.g. used to specify values that start with '-'") - set.Flags().StringVar(&r.SetBy, "set-by", "", - "record who the field was default by.") - set.Flags().StringVar(&r.Description, "description", "", - "record a description for the current setter value.") - set.Flags().StringVar(&r.FieldName, "field", "", - "name of the field to set, a suffix of the path to the field, or the full"+ - " path to the field. Default is to match all fields.") - set.Flags().StringVar(&r.Type, "type", "", - "OpenAPI field type for the setter -- e.g. integer,boolean,string.") - set.Flags().BoolVar(&r.Required, "required", false, - "indicates that this setter must be set by package consumer before live apply/preview") - set.Flags().StringVar(&r.SchemaPath, "schema-path", "", - `openAPI schema file path for setter constraints -- file content `+ - `e.g. {"type": "string", "maxLength": 15, "enum": ["allowedValue1", "allowedValue2"]}`) - set.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "creates setter recursively in all the nested subpackages") - set.Flags().MarkHidden("version") - runner.FixDocs(parent, set) - r.Command = set - return r -} - -func CreateSetterCommand(parent string) *cobra.Command { - return NewCreateSetterRunner(parent).Command -} - -type CreateSetterRunner struct { - Command *cobra.Command - CreateSetter settersutil.SetterCreator - OpenAPIFile string - SchemaPath string - FieldValue string - SetBy string - Description string - SetterName string - Type string - FieldName string - Schema string - Required bool - RecurseSubPackages bool -} - -func (r *CreateSetterRunner) runE(c *cobra.Command, args []string) error { - return runner.HandleError(c, r.createSetter(c, args)) -} - -func (r *CreateSetterRunner) preRunE(c *cobra.Command, args []string) error { - var err error - r.SetterName = args[1] - if len(args) > 2 { - r.FieldValue = args[2] - } - r.FieldName, err = c.Flags().GetString("field") - if err != nil { - return err - } - - if r.Type != "array" && !c.Flag("value").Changed && len(args) < 3 { - return errors.Errorf("setter name and value must be provided, " + - "value can either be an argument or can be passed as a flag --value") - } - - err = r.processSchema() - if err != nil { - return err - } - - if r.Type == "array" { - if !c.Flag("field").Changed { - return errors.Errorf("field flag must be set for array type setters") - } - } - return nil -} - -func (r *CreateSetterRunner) processSchema() error { - sc, err := schemaFromFile(r.SchemaPath) - if err != nil { - return err - } - - flagType := r.Type - var schemaType string - switch { - // json schema allows more than one type to be specified, but openapi - // only allows one. So we follow the openapi convention. - case len(sc.Type) > 1: - return errors.Errorf("only one type is supported: %s", - strings.Join(sc.Type, ", ")) - case len(sc.Type) == 1: - schemaType = sc.Type[0] - } - - // Since type can be set both through the schema file and through the - // --type flag, we make sure the same value is set in both places. If they - // are both set with different values, we return an error. - switch { - case flagType == "" && schemaType != "": - r.Type = schemaType - case flagType != "" && schemaType == "": - sc.Type = []string{flagType} - case flagType != "" && schemaType != "": - if flagType != schemaType { - return errors.Errorf("type provided in type flag (%s) and in schema (%s) doesn't match", - r.Type, sc.Type[0]) - } - } - - // Only marshal the properties in SchemaProps. This means any fields in - // the schema file that isn't recognized will be dropped. - // TODO: Consider if we should return an error here instead of just dropping - // the unknown fields. - b, err := json.Marshal(sc.SchemaProps) - if err != nil { - return errors.Errorf("error marshalling schema: %v", err) - } - r.Schema = string(b) - return nil -} - -func (r *CreateSetterRunner) createSetter(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - } - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - return nil -} - -func (r *CreateSetterRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - sc, err := openapi.SchemaFromFile(filepath.Join(pkgPath, ext.KRMFileName())) - if err != nil { - return err - } - r.CreateSetter = settersutil.SetterCreator{ - Name: r.SetterName, - SetBy: r.SetBy, - Description: r.Description, - Type: r.Type, - Schema: r.Schema, - FieldName: r.FieldName, - FieldValue: r.FieldValue, - Required: r.Required, - RecurseSubPackages: r.RecurseSubPackages, - OpenAPIFileName: ext.KRMFileName(), - OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), - ResourcesPath: pkgPath, - SettersSchema: sc, - } - - err = r.CreateSetter.Create() - if err != nil { - // return err if RecurseSubPackages is false - if !r.CreateSetter.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprintf(w, "created setter %q\n", r.CreateSetter.Name) - } - return nil -} - -// schemaFromFile reads the contents from schemaPath and returns schema -func schemaFromFile(schemaPath string) (*spec.Schema, error) { - sc := &spec.Schema{} - if schemaPath == "" { - return sc, nil - } - sch, err := ioutil.ReadFile(schemaPath) - if err != nil { - return sc, err - } - - if len(sch) == 0 { - return sc, nil - } - - err = sc.UnmarshalJSON(sch) - if err != nil { - return sc, errors.Errorf("unable to parse schema: %v", err) - } - return sc, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesubstitution.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesubstitution.go deleted file mode 100644 index bd03ea9c0..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdcreatesubstitution.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "path/filepath" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2/settersutil" -) - -// NewCreateSubstitutionRunner returns a command runner. -func NewCreateSubstitutionRunner(parent string) *CreateSubstitutionRunner { - r := &CreateSubstitutionRunner{} - cs := &cobra.Command{ - Use: "create-subst DIR NAME", - Args: cobra.ExactArgs(2), - PreRun: r.preRun, - RunE: r.runE, - Deprecated: "imperative substitutions will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - cs.Flags().StringVar(&r.CreateSubstitution.FieldName, "field", "", - "name of the field to set -- e.g. --field image") - cs.Flags().StringVar(&r.CreateSubstitution.FieldValue, "field-value", "", - "value of the field to create substitution for -- e.g. --field-value nginx:0.1.0") - cs.Flags().StringVar(&r.CreateSubstitution.Pattern, "pattern", "", - `substitution pattern -- e.g. --pattern \${my-image-setter}:\${my-tag-setter}`) - cs.Flags().BoolVarP(&r.CreateSubstitution.RecurseSubPackages, "recurse-subpackages", "R", false, - "creates substitution recursively in all the nested subpackages") - _ = cs.MarkFlagRequired("pattern") - _ = cs.MarkFlagRequired("field-value") - runner.FixDocs(parent, cs) - r.Command = cs - return r -} - -func CreateSubstitutionCommand(parent string) *cobra.Command { - return NewCreateSubstitutionRunner(parent).Command -} - -type CreateSubstitutionRunner struct { - Command *cobra.Command - CreateSubstitution settersutil.SubstitutionCreator - OpenAPIFile string - Values []string -} - -func (r *CreateSubstitutionRunner) runE(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.CreateSubstitution.RecurseSubPackages, - CmdRunner: r, - } - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - - return nil -} - -func (r *CreateSubstitutionRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - sc, err := openapi.SchemaFromFile(filepath.Join(pkgPath, ext.KRMFileName())) - if err != nil { - return err - } - r.CreateSubstitution = settersutil.SubstitutionCreator{ - Name: r.CreateSubstitution.Name, - FieldName: r.CreateSubstitution.FieldName, - FieldValue: r.CreateSubstitution.FieldValue, - RecurseSubPackages: r.CreateSubstitution.RecurseSubPackages, - Pattern: r.CreateSubstitution.Pattern, - OpenAPIFileName: ext.KRMFileName(), - OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), - ResourcesPath: pkgPath, - SettersSchema: sc, - } - - err = r.CreateSubstitution.Create() - if err != nil { - // return err if RecurseSubPackages is false - if !r.CreateSubstitution.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprintf(w, "created substitution %q\n", r.CreateSubstitution.Name) - } - return nil -} - -func (r *CreateSubstitutionRunner) preRun(c *cobra.Command, args []string) { - r.CreateSubstitution.Name = args[1] -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesetter.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesetter.go deleted file mode 100644 index 222c1557a..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesetter.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "path/filepath" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2/settersutil" -) - -// NewDeleteRunner returns a command runner. -func NewDeleteSetterRunner(parent string) *DeleteSetterRunner { - r := &DeleteSetterRunner{} - c := &cobra.Command{ - Use: "delete-setter DIR NAME", - Args: cobra.ExactArgs(2), - Short: commands.DeleteSetterShort, - Long: commands.DeleteSetterLong, - Example: commands.DeleteSetterExamples, - PreRunE: r.preRunE, - RunE: r.runE, - } - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "deletes setter recursively in all the nested subpackages") - runner.FixDocs(parent, c) - r.Command = c - - return r -} - -func DeleteSetterCommand(parent string) *cobra.Command { - return NewDeleteSetterRunner(parent).Command -} - -type DeleteSetterRunner struct { - Command *cobra.Command - DeleteSetter settersutil.DeleterCreator - OpenAPIFile string - RecurseSubPackages bool -} - -func (r *DeleteSetterRunner) preRunE(c *cobra.Command, args []string) error { - r.DeleteSetter.Name = args[1] - r.DeleteSetter.DefinitionPrefix = fieldmeta.SetterDefinitionPrefix - - r.OpenAPIFile = filepath.Join(args[0], ext.KRMFileName()) - - return nil -} - -func (r *DeleteSetterRunner) runE(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - } - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - return nil -} - -func (r *DeleteSetterRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - sc, err := openapi.SchemaFromFile(filepath.Join(pkgPath, ext.KRMFileName())) - if err != nil { - return err - } - r.DeleteSetter = settersutil.DeleterCreator{ - Name: r.DeleteSetter.Name, - DefinitionPrefix: fieldmeta.SetterDefinitionPrefix, - RecurseSubPackages: r.RecurseSubPackages, - OpenAPIFileName: ext.KRMFileName(), - OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), - ResourcesPath: pkgPath, - SettersSchema: sc, - } - - err = r.DeleteSetter.Delete() - if err != nil { - // return err if RecurseSubPackages is false - if !r.DeleteSetter.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprintf(w, "deleted setter %q\n", r.DeleteSetter.Name) - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesubstitution.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesubstitution.go deleted file mode 100644 index 3ea178d65..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmddeletesubstitution.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "path/filepath" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2/settersutil" -) - -// NewDeleteRunner returns a command runner. -func NewDeleteSubstitutionRunner(parent string) *DeleteSubstitutionRunner { - r := &DeleteSubstitutionRunner{} - c := &cobra.Command{ - Use: "delete-subst DIR NAME", - Args: cobra.ExactArgs(2), - PreRunE: r.preRunE, - RunE: r.runE, - } - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "deletes substitution recursively in all the nested subpackages") - runner.FixDocs(parent, c) - r.Command = c - - return r -} - -func DeleteSubstitutionCommand(parent string) *cobra.Command { - return NewDeleteSubstitutionRunner(parent).Command -} - -type DeleteSubstitutionRunner struct { - Command *cobra.Command - DeleteSubstitution settersutil.DeleterCreator - OpenAPIFile string - RecurseSubPackages bool -} - -func (r *DeleteSubstitutionRunner) preRunE(c *cobra.Command, args []string) error { - r.DeleteSubstitution.Name = args[1] - r.DeleteSubstitution.DefinitionPrefix = fieldmeta.SubstitutionDefinitionPrefix - - r.OpenAPIFile = filepath.Join(args[0], ext.KRMFileName()) - - return nil -} - -func (r *DeleteSubstitutionRunner) runE(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - } - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - return nil -} - -func (r *DeleteSubstitutionRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - sc, err := openapi.SchemaFromFile(filepath.Join(pkgPath, ext.KRMFileName())) - if err != nil { - return err - } - r.DeleteSubstitution = settersutil.DeleterCreator{ - Name: r.DeleteSubstitution.Name, - DefinitionPrefix: fieldmeta.SubstitutionDefinitionPrefix, - RecurseSubPackages: r.RecurseSubPackages, - OpenAPIFileName: ext.KRMFileName(), - OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), - ResourcesPath: pkgPath, - SettersSchema: sc, - } - - err = r.DeleteSubstitution.Delete() - if err != nil { - // return err if RecurseSubPackages is false - if !r.DeleteSubstitution.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprintf(w, "deleted substitution %q\n", r.DeleteSubstitution.Name) - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdinit.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdinit.go deleted file mode 100644 index a1d79bc32..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdinit.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/krmfile" -) - -// GetInitRunner returns a command InitRunner. -func GetInitRunner(name string) *InitRunner { - r := &InitRunner{} - c := &cobra.Command{ - Use: "init DIR...", - Args: cobra.RangeArgs(0, 1), - Short: commands.InitShort, - Long: commands.InitLong, - Example: commands.InitExamples, - RunE: r.runE, - Deprecated: "setter commands and substitutions will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - runner.FixDocs(name, c) - r.Command = c - return r -} - -func InitCommand(name string) *cobra.Command { - return GetInitRunner(name).Command -} - -// InitRunner contains the init function -type InitRunner struct { - Command *cobra.Command -} - -func (r *InitRunner) runE(c *cobra.Command, args []string) error { - var dir string - if len(args) == 0 { - dir = "." - } else { - dir = args[0] - } - filename := filepath.Join(dir, krmfile.KrmfileName) - - if _, err := os.Stat(filename); err == nil || !os.IsNotExist(err) { - return errors.Errorf("directory already initialized with a Krmfile") - } - - return ioutil.WriteFile(filename, []byte(strings.TrimSpace(` -apiVersion: config.k8s.io/v1alpha1 -kind: Krmfile -`)), 0600) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdlistsetters.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdlistsetters.go deleted file mode 100644 index 623374c2a..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdlistsetters.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "github.com/olekukonko/tablewriter" - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2" -) - -// NewListSettersRunner returns a command runner. -func NewListSettersRunner(parent string) *ListSettersRunner { - r := &ListSettersRunner{} - c := &cobra.Command{ - Use: "list-setters DIR [NAME]", - Args: cobra.RangeArgs(1, 2), - Short: commands.ListSettersShort, - Long: commands.ListSettersLong, - Example: commands.ListSettersExamples, - PreRunE: r.preRunE, - RunE: r.runE, - Deprecated: "setter commands will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - c.Flags().BoolVar(&r.Markdown, "markdown", false, - "output as github markdown") - c.Flags().BoolVar(&r.IncludeSubst, "include-subst", false, - "include substitutions in the output") - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "list setters recursively in all the nested subpackages") - runner.FixDocs(parent, c) - r.Command = c - return r -} - -func ListSettersCommand(parent string) *cobra.Command { - return NewListSettersRunner(parent).Command -} - -type ListSettersRunner struct { - Command *cobra.Command - List setters2.List - Markdown bool - IncludeSubst bool - RecurseSubPackages bool - Name string -} - -func (r *ListSettersRunner) preRunE(c *cobra.Command, args []string) error { - if len(args) > 1 { - r.Name = args[1] - } - - return nil -} - -func (r *ListSettersRunner) runE(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - } - - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - return nil -} - -func (r *ListSettersRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - sc, err := openapi.SchemaFromFile(filepath.Join(pkgPath, ext.KRMFileName())) - if err != nil { - return err - } - r.List = setters2.List{ - Name: r.Name, - OpenAPIFileName: ext.KRMFileName(), - SettersSchema: sc, - } - openAPIPath := filepath.Join(pkgPath, ext.KRMFileName()) - if err := r.ListSetters(w, openAPIPath, pkgPath); err != nil { - return err - } - if r.IncludeSubst { - if err := r.ListSubstitutions(w, openAPIPath); err != nil { - return err - } - } - return nil -} - -func (r *ListSettersRunner) ListSetters(w io.Writer, openAPIPath, resourcePath string) error { - // use setters v2 - if err := r.List.ListSetters(openAPIPath, resourcePath); err != nil { - return err - } - table := newTable(w, r.Markdown) - table.SetHeader([]string{"NAME", "VALUE", "SET BY", "DESCRIPTION", "COUNT", "REQUIRED", "IS SET"}) - for i := range r.List.Setters { - s := r.List.Setters[i] - v := s.Value - - // if the setter is for a list, populate the values - if len(s.ListValues) > 0 { - v = strings.Join(s.ListValues, ",") - v = fmt.Sprintf("[%s]", v) - } - required := "No" - if s.Required { - required = "Yes" - } - isSet := "No" - if s.IsSet { - isSet = "Yes" - } - - table.Append([]string{ - s.Name, v, s.SetBy, s.Description, fmt.Sprintf("%d", s.Count), required, isSet}) - } - table.Render() - - if len(r.List.Setters) == 0 { - // exit non-0 if no matching setters are found - if runner.ExitOnError { - os.Exit(1) - } - } - return nil -} - -func (r *ListSettersRunner) ListSubstitutions(w io.Writer, openAPIPath string) error { - // use setters v2 - if err := r.List.ListSubst(openAPIPath); err != nil { - return err - } - table := newTable(w, r.Markdown) - b := tablewriter.Border{Top: true} - table.SetBorders(b) - - table.SetHeader([]string{"SUBSTITUTION", "PATTERN", "REFERENCES"}) - for i := range r.List.Substitutions { - s := r.List.Substitutions[i] - refs := "" - for _, value := range s.Values { - // trim setter and substitution prefixes - ref := strings.TrimPrefix( - strings.TrimPrefix(value.Ref, fieldmeta.DefinitionsPrefix+fieldmeta.SetterDefinitionPrefix), - fieldmeta.DefinitionsPrefix+fieldmeta.SubstitutionDefinitionPrefix) - refs = refs + "," + ref - } - refs = fmt.Sprintf("[%s]", strings.TrimPrefix(refs, ",")) - table.Append([]string{ - s.Name, s.Pattern, refs}) - } - if len(r.List.Substitutions) == 0 { - return nil - } - table.Render() - - return nil -} - -func newTable(o io.Writer, m bool) *tablewriter.Table { - table := tablewriter.NewWriter(o) - table.SetRowLine(false) - if m { - // markdown format - table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false}) - table.SetCenterSeparator("|") - } else { - table.SetBorder(false) - table.SetHeaderLine(false) - table.SetColumnSeparator(" ") - table.SetCenterSeparator(" ") - } - table.SetAlignment(tablewriter.ALIGN_LEFT) - return table -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdset.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdset.go deleted file mode 100644 index 1d033f02f..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdset.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - "path/filepath" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/setters2/settersutil" -) - -// NewSetRunner returns a command runner. -func NewSetRunner(parent string) *SetRunner { - r := &SetRunner{} - c := &cobra.Command{ - Use: "set DIR NAME --values [VALUE]", - Args: cobra.MinimumNArgs(2), - Short: commands.SetShort, - Long: commands.SetLong, - Example: commands.SetExamples, - PreRunE: r.preRunE, - RunE: r.runE, - Deprecated: "setter commands will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - runner.FixDocs(parent, c) - r.Command = c - c.Flags().StringArrayVar(&r.Values, "values", []string{}, - "optional flag, the values of the setter to be set to") - c.Flags().StringVar(&r.SetBy, "set-by", "", - "annotate the field with who set it") - c.Flags().StringVar(&r.Description, "description", "", - "annotate the field with a description of its value") - c.Flags().StringVar(&setterVersion, "version", "", - "use this version of the setter format") - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "sets recursively in all the nested subpackages") - c.Flags().MarkHidden("version") - - return r -} - -var setterVersion string - -func SetCommand(parent string) *cobra.Command { - return NewSetRunner(parent).Command -} - -type SetRunner struct { - Command *cobra.Command - Set settersutil.FieldSetter - OpenAPIFile string - Values []string - SetBy string - Description string - Name string - Value string - ListValues []string - RecurseSubPackages bool -} - -func (r *SetRunner) preRunE(c *cobra.Command, args []string) error { - valueFlagSet := c.Flag("values").Changed - - if valueFlagSet && len(args) > 2 { - return errors.Errorf("value should set either from flag or arg") - } - - // make sure that the value is provided either through values flag or as an arg - if !valueFlagSet && len(args) < 3 { - return errors.Errorf("value must be provided either from flag or arg") - } - - r.Name = args[1] - if valueFlagSet { - r.Value = r.Values[0] - } else { - r.Value = args[2] - } - - // set remaining values as list values - if valueFlagSet && len(r.Values) > 1 { - r.ListValues = r.Values[1:] - } else if !valueFlagSet && len(args) > 3 { - r.ListValues = args[3:] - } - - r.OpenAPIFile = filepath.Join(args[0], ext.KRMFileName()) - return nil -} - -func (r *SetRunner) runE(c *cobra.Command, args []string) error { - e := runner.ExecuteCmdOnPkgs{ - NeedOpenAPI: true, - Writer: c.OutOrStdout(), - RootPkgPath: args[0], - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - } - err := e.Execute() - if err != nil { - return runner.HandleError(c, err) - } - return nil -} - -func (r *SetRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - r.Set = settersutil.FieldSetter{ - Name: r.Name, - Value: r.Value, - ListValues: r.ListValues, - Description: r.Description, - SetBy: r.SetBy, - Count: 0, - OpenAPIPath: filepath.Join(pkgPath, ext.KRMFileName()), - OpenAPIFileName: ext.KRMFileName(), - ResourcesPath: pkgPath, - RecurseSubPackages: r.RecurseSubPackages, - IsSet: true, - } - count, err := r.Set.Set() - if err != nil { - // return err if RecurseSubPackages is false - if !r.Set.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprintf(w, "set %d field(s) of setter %q to value %q\n", count, r.Set.Name, r.Set.Value) - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdwrap.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdwrap.go deleted file mode 100644 index 8727446d9..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdwrap.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/kio/filters" -) - -// GetWrapRunner returns a command runner. -func GetWrapRunner() *WrapRunner { - r := &WrapRunner{} - c := &cobra.Command{ - Use: "wrap CMD...", - Short: "Wrap an executable so it implements the config fn interface", - Long: `Wrap an executable so it implements the config fn interface - -wrap simplifies writing config functions by: - -- invoking an executable command converting an input ResourceList into environment -- merging the output onto the original input as a set of patches -- setting filenames on any Resources missing them - -config function authors may use wrap by using it to invoke a command from a container image - -The following are equivalent: - - kyaml wrap -- CMD - - kyaml xargs -- CMD | kyaml merge | kyaml fmt --set-filenames - -Environment Variables: - - KUST_OVERRIDE_DIR: - - Path to a directory containing patches to apply to after merging. -`, - Example: ` - -`, - RunE: r.runE, - PreRunE: r.preRunE, - SilenceUsage: true, - FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, - Args: cobra.MinimumNArgs(1), - } - r.Command = c - r.XArgs = GetXArgsRunner() - c.Flags().BoolVar(&r.XArgs.EnvOnly, - "env-only", true, "only set env vars, not arguments.") - c.Flags().StringVar(&r.XArgs.WrapKind, - "wrap-kind", "List", "wrap the input xargs give to the command in this type.") - c.Flags().StringVar(&r.XArgs.WrapVersion, - "wrap-version", "v1", "wrap the input xargs give to the command in this type.") - return r -} - -// WrapRunner contains the run function -type WrapRunner struct { - Command *cobra.Command - XArgs *XArgsRunner - getEnv func(key string) string -} - -const ( - KustMergeEnv = "KUST_MERGE" - KustOverrideDirEnv = "KUST_OVERRIDE_DIR" -) - -func WrapCommand() *cobra.Command { - return GetWrapRunner().Command -} - -func (r *WrapRunner) preRunE(_ *cobra.Command, _ []string) error { - _, err := fmt.Fprintln(os.Stderr, `Command "wrap" is deprecated, this will no longer be available in kustomize v5. -See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.`) - return err -} - -func (r *WrapRunner) runE(c *cobra.Command, args []string) error { - if r.getEnv == nil { - r.getEnv = os.Getenv - } - xargsIn := &bytes.Buffer{} - if _, err := io.Copy(xargsIn, c.InOrStdin()); err != nil { - return err - } - mergeInput := bytes.NewBuffer(xargsIn.Bytes()) - // Run the command - xargsOut := &bytes.Buffer{} - r.XArgs.Command.SetArgs(args) - r.XArgs.Command.SetIn(xargsIn) - r.XArgs.Command.SetOut(xargsOut) - r.XArgs.Command.SetErr(os.Stderr) - if err := r.XArgs.Command.Execute(); err != nil { - return err - } - - // merge the results - buff := &kio.PackageBuffer{} - - var fltrs []kio.Filter - var inputs []kio.Reader - if r.getEnv(KustMergeEnv) == "" || r.getEnv(KustMergeEnv) == "true" || r.getEnv(KustMergeEnv) == "1" { - inputs = append(inputs, &kio.ByteReader{Reader: mergeInput}) - fltrs = append(fltrs, &filters.MergeFilter{}) - } - inputs = append(inputs, &kio.ByteReader{Reader: xargsOut}) - - if err := (kio.Pipeline{Inputs: inputs, Filters: fltrs, Outputs: []kio.Writer{buff}}). - Execute(); err != nil { - return err - } - - inputs, fltrs = []kio.Reader{buff}, nil - if r.getEnv(KustOverrideDirEnv) != "" { - // merge the overrides on top of the output - fltrs = append(fltrs, filters.MergeFilter{}) - inputs = append(inputs, - kio.LocalPackageReader{ - OmitReaderAnnotations: true, // don't set path annotations, as they would override - PackagePath: r.getEnv(KustOverrideDirEnv)}) - } - fltrs = append(fltrs, - &filters.FileSetter{ - FilenamePattern: filepath.Join("config", filters.DefaultFilenamePattern)}, - &filters.FormatFilter{}) - - err := kio.Pipeline{ - Inputs: inputs, - Filters: fltrs, - Outputs: []kio.Writer{kio.ByteWriter{ - Sort: true, - KeepReaderAnnotations: true, - Writer: c.OutOrStdout(), - WrappingKind: kio.ResourceListKind, - WrappingAPIVersion: kio.ResourceListAPIVersion}}}.Execute() - return runner.HandleError(c, err) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdxargs.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdxargs.go deleted file mode 100644 index 31d9a5f1d..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/cmdxargs.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "os" - "os/exec" - "strings" - "unicode" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// GetXArgsRunner returns a command runner. -func GetXArgsRunner() *XArgsRunner { - r := &XArgsRunner{} - c := &cobra.Command{ - Use: "xargs -- CMD...", - Short: "Convert functionConfig to commandline flags and envs", - Long: `Convert functionConfig to commandline flags and envs. - -xargs reads a ResourceList from stdin and parses the functionConfig field. xargs then -reads each of the fields under .spec and parses them as flags. If the fields have non-scalar -values, then xargs encoded the values as yaml strings. - - CMD: - The command to run and pass the functionConfig as arguments. -`, - Example: ` -# given this example functionConfig in config.yaml -kind: Foo -spec: - flag1: value1 - flag2: value2 -items: -- 2 -- 1 - -# this command: -$ kyaml cat pkg/ --function-config config.yaml --wrap-kind ResourceList | kyaml run xargs -- app - -# is equivalent to this command: -$ kyaml cat pkg/ --function-config config.yaml --wrap-kind ResourceList | app --flag1=value1 --flag2=value2 2 1 - -# echo: prints the app arguments -$ kyaml cat pkg/ --function-config config.yaml --wrap-kind ResourceList | kyaml reconcile xargs -- echo ---flag1=value1 --flag2=value2 2 1 - -# env: prints the app env -$ kyaml cat pkg/ --function-config config.yaml --wrap-kind ResourceList | kyaml reconcile xargs -- env - -# cat: prints the app stdin -- prints the package contents and functionConfig wrapped in a -# ResourceList -$ kyaml cat pkg/ --function-config config.yaml --wrap-kind ResourceList | kyaml reconcile xargs --no-flags -- env - -`, - RunE: r.runE, - PreRunE: r.preRunE, - SilenceUsage: true, - FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, - Args: cobra.MinimumNArgs(1), - } - r.Command = c - r.Command.Flags().BoolVar(&r.EnvOnly, "env-only", false, "only add env vars, not flags") - c.Flags().StringVar(&r.WrapKind, "wrap-kind", "List", "wrap the input xargs give to the command in this type.") - c.Flags().StringVar(&r.WrapVersion, "wrap-version", "v1", "wrap the input xargs give to the command in this type.") - return r -} - -// Runner contains the run function -type XArgsRunner struct { - Command *cobra.Command - Args []string - EnvOnly bool - WrapKind string - WrapVersion string -} - -func XArgsCommand() *cobra.Command { - return GetXArgsRunner().Command -} - -func (r *XArgsRunner) preRunE(_ *cobra.Command, _ []string) error { - _, err := fmt.Fprintln(os.Stderr, `Command "xargs" is deprecated, this will no longer be available in kustomize v5. -See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.`) - return err -} - -func (r *XArgsRunner) runE(c *cobra.Command, _ []string) error { - if len(r.Args) == 0 { - r.Args = os.Args - } - cmdIndex := -1 - for i := range r.Args { - if r.Args[i] == "--" { - cmdIndex = i + 1 - break - } - } - if cmdIndex < 0 { - return fmt.Errorf("must specify -- before command") - } - r.Args = r.Args[cmdIndex:] - run := exec.Command(r.Args[0]) // nolint: gosec - - if len(r.Args) > 1 { - r.Args = r.Args[cmdIndex+1:] - } else { - r.Args = []string{} - } - run.Stdout = c.OutOrStdout() - run.Stderr = c.ErrOrStderr() - - rw := &kio.ByteReadWriter{ - Reader: c.InOrStdin(), - } - nodes, err := rw.Read() - if err != nil { - return err - } - - env := os.Environ() - - // append the config to the flags - if err = func() error { - if rw.FunctionConfig == nil { - return nil - } - str, err := rw.FunctionConfig.String() - if err != nil { - return err - } - // add the API object to the env - env = append(env, fmt.Sprintf("KUST_FUNCTION_CONFIG=%s", str)) - - // parse the fields - meta := rw.FunctionConfig.Field("metadata") - if meta != nil { - err = meta.Value.VisitFields(func(node *yaml.MapNode) error { - if !r.EnvOnly { - r.Args = append(r.Args, fmt.Sprintf("--%s=%s", - node.Key.YNode().Value, parseYNode(node.Value.YNode()))) - } - env = append(env, fmt.Sprintf("%s=%s", strings.ToUpper(node.Key.YNode().Value), - node.Value.YNode().Value)) - return nil - }) - if err != nil { - return err - } - } - - spec := rw.FunctionConfig.Field("spec") - if spec != nil { - err = spec.Value.VisitFields(func(node *yaml.MapNode) error { - if !r.EnvOnly { - r.Args = append(r.Args, fmt.Sprintf("--%s=%s", - node.Key.YNode().Value, parseYNode(node.Value.YNode()))) - } - env = append(env, fmt.Sprintf("%s=%s", strings.ToUpper(node.Key.YNode().Value), - node.Value.YNode().Value)) - return nil - }) - if err != nil { - return err - } - } - - if !r.EnvOnly { - items := rw.FunctionConfig.Field("items") - if items != nil { - err = items.Value.VisitElements(func(node *yaml.RNode) error { - r.Args = append(r.Args, parseYNode(node.YNode())) - return nil - }) - if err != nil { - return err - } - } - } - - if r.WrapKind != "" { - if kind := rw.FunctionConfig.Field("kind"); !kind.IsNilOrEmpty() { - kind.Value.YNode().Value = r.WrapKind - } - rw.WrappingKind = r.WrapKind - } - if r.WrapVersion != "" { - if version := rw.FunctionConfig.Field("apiVersion"); !version.IsNilOrEmpty() { - version.Value.YNode().Value = r.WrapVersion - } - rw.WrappingAPIVersion = r.WrapVersion - } - return nil - }(); err != nil { - return err - } - run.Args = append(run.Args, r.Args...) - run.Env = append(run.Env, env...) - - // write ResourceList to stdin - if err = func() error { - in, err := run.StdinPipe() - if err != nil { - return err - } - defer in.Close() - rw.Writer = in - if r.WrapKind != kio.ResourceListKind { - rw.FunctionConfig = nil - } - return rw.Write(nodes) - }(); err != nil { - return err - } - - return runner.HandleError(c, run.Run()) -} - -func parseYNode(node *yaml.Node) string { - node.Value = strings.TrimSpace(node.Value) - for _, b := range node.Value { - if unicode.IsSpace(b) { - // wrap in '' -- contains whitespace - return fmt.Sprintf("'%s'", node.Value) - } - } - return node.Value -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/fmt.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/fmt.go deleted file mode 100644 index e658cf2b2..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/fmt.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/ext" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/kio/filters" -) - -// FmtCmd returns a command FmtRunner. -func GetFmtRunner(name string) *FmtRunner { - r := &FmtRunner{} - c := &cobra.Command{ - Use: "fmt DIR...", - Short: commands.FmtShort, - Long: commands.FmtLong, - Example: commands.FmtExamples, - RunE: r.runE, - PreRunE: r.preRunE, - Deprecated: "imperative formatting will no longer be available in kustomize v5.\n" + - "Declare a formatting transformer in your kustomization instead.", - } - runner.FixDocs(name, c) - c.Flags().StringVar(&r.FilenamePattern, "pattern", filters.DefaultFilenamePattern, - `pattern to use for generating filenames for resources -- may contain the following -formatting substitution verbs {'%n': 'metadata.name', '%s': 'metadata.namespace', '%k': 'kind'}`) - c.Flags().BoolVar(&r.SetFilenames, "set-filenames", false, - `if true, set default filenames on Resources without them`) - c.Flags().BoolVar(&r.KeepAnnotations, "keep-annotations", false, - `if true, keep index and filename annotations set on Resources.`) - c.Flags().BoolVar(&r.Override, "override", false, - `if true, override existing filepath annotations.`) - c.Flags().BoolVar(&r.UseSchema, "use-schema", false, - `if true, uses openapi resource schema to format resources.`) - c.Flags().BoolVarP(&r.RecurseSubPackages, "recurse-subpackages", "R", false, - "formats resource files recursively in all the nested subpackages") - r.Command = c - return r -} - -func FmtCommand(name string) *cobra.Command { - return GetFmtRunner(name).Command -} - -// FmtRunner contains the run function -type FmtRunner struct { - Command *cobra.Command - FilenamePattern string - SetFilenames bool - KeepAnnotations bool - Override bool - UseSchema bool - RecurseSubPackages bool -} - -func (r *FmtRunner) preRunE(c *cobra.Command, args []string) error { - if r.SetFilenames { - r.KeepAnnotations = true - } - return nil -} - -func (r *FmtRunner) runE(c *cobra.Command, args []string) error { - // format stdin if there are no args - if len(args) == 0 { - rw := &kio.ByteReadWriter{ - Reader: c.InOrStdin(), - Writer: c.OutOrStdout(), - KeepReaderAnnotations: r.KeepAnnotations, - } - return runner.HandleError(c, kio.Pipeline{ - Inputs: []kio.Reader{rw}, Filters: r.fmtFilters(), Outputs: []kio.Writer{rw}}.Execute()) - } - - for _, rootPkgPath := range args { - e := runner.ExecuteCmdOnPkgs{ - Writer: c.OutOrStdout(), - NeedOpenAPI: false, - RecurseSubPackages: r.RecurseSubPackages, - CmdRunner: r, - RootPkgPath: rootPkgPath, - } - - err := e.Execute() - if err != nil { - return err - } - } - return nil -} - -func (r *FmtRunner) ExecuteCmd(w io.Writer, pkgPath string) error { - rw := &kio.LocalPackageReadWriter{ - NoDeleteFiles: true, - PackagePath: pkgPath, - KeepReaderAnnotations: r.KeepAnnotations, PackageFileName: ext.KRMFileName()} - err := kio.Pipeline{ - Inputs: []kio.Reader{rw}, Filters: r.fmtFilters(), Outputs: []kio.Writer{rw}}.Execute() - - if err != nil { - // return err if RecurseSubPackages is false - if !r.RecurseSubPackages { - return err - } - // print error message and continue if RecurseSubPackages is true - fmt.Fprintf(w, "%s\n", err.Error()) - } else { - fmt.Fprint(w, "formatted resource files in the package\n") - } - return nil -} - -func (r *FmtRunner) fmtFilters() []kio.Filter { - fmtFilters := []kio.Filter{filters.FormatFilter{ - UseSchema: r.UseSchema, - }} - - // format with file names - if r.SetFilenames { - fmtFilters = append(fmtFilters, &filters.FileSetter{ - FilenamePattern: r.FilenamePattern, - Override: r.Override, - }) - } - return fmtFilters -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/grep.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/grep.go index 82846ac7b..54659f510 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/grep.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/grep.go @@ -1,6 +1,5 @@ // Copyright 2019 The Kubernetes Authors. // SPDX-License-Identifier: Apache-2.0 -// package commands import ( @@ -100,7 +99,7 @@ func (r *GrepRunner) preRunE(c *cobra.Command, args []string) error { r.Value = last[1] } - r.Path = append(parts[:len(parts)-1], last[0]) // nolint:gocritic + r.Path = append(parts[:len(parts)-1], last[0]) //nolint:gocritic return nil } diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge.go deleted file mode 100644 index 37cc07ca3..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/kio/filters" -) - -func GetMergeRunner(name string) *MergeRunner { - r := &MergeRunner{} - c := &cobra.Command{ - Use: "merge [SOURCE_DIR...] [DESTINATION_DIR]", - Short: commands.MergeShort, - Long: commands.MergeLong, - Example: commands.MergeExamples, - RunE: r.runE, - Deprecated: "this will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - runner.FixDocs(name, c) - r.Command = c - r.Command.Flags().BoolVar(&r.InvertOrder, "invert-order", false, - "if true, merge Resources in the reverse order") - return r -} - -func MergeCommand(name string) *cobra.Command { - return GetMergeRunner(name).Command -} - -// MergeRunner contains the run function -type MergeRunner struct { - Command *cobra.Command - InvertOrder bool -} - -func (r *MergeRunner) runE(c *cobra.Command, args []string) error { - var inputs []kio.Reader - // add the packages in reverse order -- the arg list should be highest precedence first - // e.g. merge from -> to, but the MergeFilter is highest precedence last - for i := len(args) - 1; i >= 0; i-- { - inputs = append(inputs, kio.LocalPackageReader{PackagePath: args[i]}) - } - // if there is no "from" package, read from stdin - rw := &kio.ByteReadWriter{ - Reader: c.InOrStdin(), - Writer: c.OutOrStdout(), - KeepReaderAnnotations: true, - } - if len(inputs) < 2 { - inputs = append(inputs, rw) - } - - // write to the "to" package if specified - var outputs []kio.Writer - if len(args) != 0 { - outputs = append(outputs, kio.LocalPackageWriter{PackagePath: args[len(args)-1]}) - } - // if there is no "to" package, write to stdout - if len(outputs) == 0 { - outputs = append(outputs, rw) - } - - filters := []kio.Filter{filters.MergeFilter{}, filters.FormatFilter{}} - return runner.HandleError(c, kio.Pipeline{Inputs: inputs, Filters: filters, Outputs: outputs}.Execute()) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge3.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge3.go deleted file mode 100644 index a01bd9812..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/merge3.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio/filters" -) - -func GetMerge3Runner(name string) *Merge3Runner { - r := &Merge3Runner{} - c := &cobra.Command{ - Use: "merge3 --ancestor [ORIGINAL_DIR] --from [UPDATED_DIR] --to [DESTINATION_DIR]", - Short: commands.Merge3Short, - Long: commands.Merge3Long, - Example: commands.Merge3Examples, - RunE: r.runE, - Deprecated: "this will no longer be available in kustomize v5.\n" + - "See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.", - } - runner.FixDocs(name, c) - c.Flags().StringVar(&r.ancestor, "ancestor", "", - "Path to original package") - c.Flags().StringVar(&r.fromDir, "from", "", - "Path to updated package") - c.Flags().StringVar(&r.toDir, "to", "", - "Path to destination package") - c.Flags().BoolVar(&r.path, "path-merge-key", false, - "Use the path as part of the merge key when merging resources") - - r.Command = c - return r -} - -func Merge3Command(name string) *cobra.Command { - return GetMerge3Runner(name).Command -} - -// Merge3Runner contains the run function -type Merge3Runner struct { - Command *cobra.Command - ancestor string - fromDir string - toDir string - path bool -} - -func (r *Merge3Runner) runE(_ *cobra.Command, _ []string) error { - matcher := filters.DefaultGVKNNMatcher{MergeOnPath: r.path} - err := filters.Merge3{ - OriginalPath: r.ancestor, - UpdatedPath: r.fromDir, - DestPath: r.toDir, - Matcher: &matcher, - }.Merge() - if err != nil { - return err - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/sink.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/sink.go deleted file mode 100644 index 653c05302..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/sink.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "os" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/kio/kioutil" -) - -// GetSinkRunner returns a command for Sink. -func GetSinkRunner(name string) *SinkRunner { - r := &SinkRunner{} - c := &cobra.Command{ - Use: "sink DIR", - Short: commands.SinkShort, - Long: commands.SinkLong, - Example: commands.SinkExamples, - RunE: r.runE, - PreRunE: r.preRunE, - Args: cobra.MaximumNArgs(1), - } - runner.FixDocs(name, c) - r.Command = c - return r -} - -func SinkCommand(name string) *cobra.Command { - return GetSinkRunner(name).Command -} - -// SinkRunner contains the run function -type SinkRunner struct { - Command *cobra.Command -} - -func (r *SinkRunner) preRunE(c *cobra.Command, args []string) error { - _, err := fmt.Fprintln(os.Stderr, `Command "sink" is deprecated, this will no longer be available in kustomize v5. -See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.`) - return err -} - -func (r *SinkRunner) runE(c *cobra.Command, args []string) error { - var outputs []kio.Writer - if len(args) == 1 { - outputs = []kio.Writer{&kio.LocalPackageWriter{PackagePath: args[0]}} - } else { - outputs = []kio.Writer{&kio.ByteWriter{ - Writer: c.OutOrStdout(), - ClearAnnotations: []string{kioutil.PathAnnotation, kioutil.LegacyPathAnnotation}}, - } - } - - err := kio.Pipeline{ - Inputs: []kio.Reader{&kio.ByteReader{Reader: c.InOrStdin()}}, - Outputs: outputs}.Execute() - return runner.HandleError(c, err) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/source.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/source.go deleted file mode 100644 index bce021dea..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/commands/source.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package commands - -import ( - "fmt" - "os" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands" - "sigs.k8s.io/kustomize/cmd/config/runner" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// GetSourceRunner returns a command for Source. -func GetSourceRunner(name string) *SourceRunner { - r := &SourceRunner{} - c := &cobra.Command{ - Use: "source DIR", - Short: commands.SourceShort, - Long: commands.SourceLong, - Example: commands.SourceExamples, - RunE: r.runE, - PreRunE: r.preRunE, - } - runner.FixDocs(name, c) - c.Flags().StringVar(&r.WrapKind, "wrap-kind", kio.ResourceListKind, - "output using this format.") - c.Flags().StringVar(&r.WrapApiVersion, "wrap-version", kio.ResourceListAPIVersion, - "output using this format.") - c.Flags().StringVar(&r.FunctionConfig, "function-config", "", - "path to function config.") - r.Command = c - _ = c.MarkFlagFilename("function-config", "yaml", "json", "yml") - return r -} - -func SourceCommand(name string) *cobra.Command { - return GetSourceRunner(name).Command -} - -// SourceRunner contains the run function -type SourceRunner struct { - WrapKind string - WrapApiVersion string - FunctionConfig string - Command *cobra.Command -} - -func (r *SourceRunner) preRunE(c *cobra.Command, args []string) error { - _, err := fmt.Fprintln(os.Stderr, `Command "source" is deprecated, this will no longer be available in kustomize v5. -See discussion in https://github.com/kubernetes-sigs/kustomize/issues/3953.`) - return err -} - -func (r *SourceRunner) runE(c *cobra.Command, args []string) error { - // if there is a function-config specified, emit it - var functionConfig *yaml.RNode - if r.FunctionConfig != "" { - configs, err := kio.LocalPackageReader{PackagePath: r.FunctionConfig}.Read() - if err != nil { - return err - } - if len(configs) != 1 { - return fmt.Errorf("expected exactly 1 functionConfig, found %d", len(configs)) - } - functionConfig = configs[0] - } - - var outputs []kio.Writer - outputs = append(outputs, kio.ByteWriter{ - Writer: c.OutOrStdout(), - KeepReaderAnnotations: true, - WrappingKind: r.WrapKind, - WrappingAPIVersion: r.WrapApiVersion, - FunctionConfig: functionConfig, - }) - - var inputs []kio.Reader - for _, a := range args { - inputs = append(inputs, kio.LocalPackageReader{PackagePath: a, MatchFilesGlob: kio.MatchAll}) - } - if len(inputs) == 0 { - inputs = []kio.Reader{&kio.ByteReader{Reader: c.InOrStdin()}} - } - - err := kio.Pipeline{Inputs: inputs, Outputs: outputs}.Execute() - return runner.HandleError(c, err) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go index 70de9fb4b..412bf6d24 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go @@ -144,7 +144,7 @@ The script wraps itself using ` + "`" + `config run wrap -- $0` + "`" + ` which ` + "`" + `Dockerfile` + "`" + ` installs ` + "`" + `kustomize fn` + "`" + ` and copies the script into the container image. - FROM golang:1.18-stretch + FROM golang:1.20-bullseye RUN go get sigs.k8s.io/kustomize/cmd/config RUN mv /go/bin/config /usr/bin/config COPY nginx-template.sh /usr/bin/nginx-template.sh @@ -255,7 +255,7 @@ interpreted as described in [RFC 2119][2]. - Pre-commit / delivery validation and linting of configuration - - e.g. Fail if any containers don't have PodSecurityPolicy or CPU / Memory limits + - e.g. Fail if any containers don't have CPU / Memory limits - Implementation of abstractions as client actuated APIs (e.g. templating) - e.g. Create a client-side _"CRD"_ for generating configuration checked into git - Aspect Orient configuration / Injection of cross-cutting configuration diff --git a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/runner/runner.go b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/runner/runner.go index 6e4adb0e1..5cde3ac61 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/cmd/config/runner/runner.go +++ b/tools/vendor/sigs.k8s.io/kustomize/cmd/config/runner/runner.go @@ -1,6 +1,5 @@ // Copyright 2019 The Kubernetes Authors. // SPDX-License-Identifier: Apache-2.0 -// package runner import ( diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput.go deleted file mode 100644 index c0495bedc..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package build - -import ( - "fmt" - - "github.com/spf13/pflag" -) - -//go:generate stringer -type=reorderOutput -type reorderOutput int - -const ( - unspecified reorderOutput = iota - none - legacy -) - -const flagReorderOutputName = "reorder" - -func AddFlagReorderOutput(set *pflag.FlagSet) { - set.StringVar( - &theFlags.reorderOutput, flagReorderOutputName, - legacy.String(), - "Reorder the resources just before output. "+ - "Use '"+legacy.String()+"' to apply a legacy reordering "+ - "(Namespaces first, Webhooks last, etc). "+ - "Use '"+none.String()+"' to suppress a final reordering.") -} - -func validateFlagReorderOutput() error { - switch theFlags.reorderOutput { - case none.String(), legacy.String(): - return nil - default: - return fmt.Errorf( - "illegal flag value --%s %s; legal values: %v", - flagReorderOutputName, theFlags.reorderOutput, - []string{legacy.String(), none.String()}) - } -} - -func getFlagReorderOutput() reorderOutput { - switch theFlags.reorderOutput { - case none.String(): - return none - case legacy.String(): - return legacy - default: - return unspecified - } -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput_string.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput_string.go deleted file mode 100644 index 1fa60051e..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/reorderoutput_string.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by "stringer -type=reorderOutput"; DO NOT EDIT. - -package build - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[unspecified-0] - _ = x[none-1] - _ = x[legacy-2] -} - -const _reorderOutput_name = "unspecifiednonelegacy" - -var _reorderOutput_index = [...]uint8{0, 11, 15, 21} - -func (i reorderOutput) String() string { - if i < 0 || i >= reorderOutput(len(_reorderOutput_index)-1) { - return "reorderOutput(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _reorderOutput_name[_reorderOutput_index[i]:_reorderOutput_index[i+1]] -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/flagsandargs.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/flagsandargs.go deleted file mode 100644 index 58b7b3007..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/flagsandargs.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package add - -import ( - "fmt" - "strings" - - "sigs.k8s.io/kustomize/api/types" - - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" - "sigs.k8s.io/kustomize/kyaml/filesys" -) - -// flagsAndArgs encapsulates the options for add secret/configmap commands. -type flagsAndArgs struct { - // Name of configMap/Secret (required) - Name string - // FileSources to derive the configMap/Secret from (optional) - FileSources []string - // LiteralSources to derive the configMap/Secret from (optional) - LiteralSources []string - // EnvFileSource to derive the configMap/Secret from (optional) - // TODO: Rationalize this name with Generic.EnvSource - EnvFileSource string - // Resource generation behavior (optional) - Behavior string - // Type of secret to create - Type string - // Namespace of secret - Namespace string - // Disable name suffix - DisableNameSuffixHash bool -} - -// Validate validates required fields are set to support structured generation. -func (a *flagsAndArgs) Validate(args []string) error { - if len(args) != 1 { - return fmt.Errorf("name must be specified once") - } - a.Name = args[0] - if len(a.EnvFileSource) == 0 && len(a.FileSources) == 0 && len(a.LiteralSources) == 0 { - return fmt.Errorf("at least from-env-file, or from-file or from-literal must be set") - } - if len(a.EnvFileSource) > 0 && (len(a.FileSources) > 0 || len(a.LiteralSources) > 0) { - return fmt.Errorf("from-env-file cannot be combined with from-file or from-literal") - } - if len(a.Behavior) > 0 && types.NewGenerationBehavior(a.Behavior) == types.BehaviorUnspecified { - return fmt.Errorf(`invalid behavior: must be one of "%s", "%s", or "%s"`, - types.BehaviorCreate, types.BehaviorMerge, types.BehaviorReplace) - } - // TODO: Should we check if the path exists? if it's valid, if it's within the same (sub-)directory? - return nil -} - -// ExpandFileSource normalizes a string list, possibly -// containing globs, into a validated, globless list. -// For example, this list: -// some/path -// some/dir/a* -// bfile=some/dir/b* -// becomes: -// some/path -// some/dir/airplane -// some/dir/ant -// some/dir/apple -// bfile=some/dir/banana -// i.e. everything is converted to a key=value pair, -// where the value is always a relative file path, -// and the key, if missing, is the same as the value. -// In the case where the key is explicitly declared, -// the globbing, if present, must have exactly one match. -func (a *flagsAndArgs) ExpandFileSource(fSys filesys.FileSystem) error { - var results []string - for _, pattern := range a.FileSources { - var patterns []string - key := "" - // check if the pattern is in `--from-file=[key=]source` format - // and if so split it to send only the file-pattern to glob function - s := strings.Split(pattern, "=") - if len(s) == 2 { - patterns = append(patterns, s[1]) - key = s[0] - } else { - patterns = append(patterns, s[0]) - } - result, err := util.GlobPatterns(fSys, patterns) - if err != nil { - return err - } - // if the format is `--from-file=[key=]source` accept only one result - // and extend it with the `key=` prefix - if key != "" { - if len(result) != 1 { - return fmt.Errorf( - "'pattern '%s' catches files %v, should catch only one", pattern, result) - } - fileSource := fmt.Sprintf("%s=%s", key, result[0]) - results = append(results, fileSource) - } else { - results = append(results, result...) - } - } - a.FileSources = results - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/version/version.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/version/version.go deleted file mode 100644 index dac2aa827..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/version/version.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package version - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/api/provenance" -) - -// NewCmdVersion makes a new version command. -func NewCmdVersion(w io.Writer) *cobra.Command { - var short bool - - versionCmd := cobra.Command{ - Use: "version", - Short: "Prints the kustomize version", - Example: `kustomize version`, - Run: func(cmd *cobra.Command, args []string) { - if short { - fmt.Fprintln(w, provenance.GetProvenance().Short()) - } else { - fmt.Fprintln(w, provenance.GetProvenance().Full()) - } - }, - } - - versionCmd.Flags().BoolVar(&short, "short", false, "short form") - return &versionCmd -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/LICENSE b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/LICENSE similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/LICENSE rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/LICENSE diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/build.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go similarity index 79% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/build.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go index 22ca0bb8d..5914f8959 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/build.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go @@ -6,8 +6,10 @@ package build import ( "fmt" "io" + "log" "github.com/spf13/cobra" + flag "github.com/spf13/pflag" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/krusty" "sigs.k8s.io/kustomize/api/types" @@ -25,10 +27,12 @@ var theFlags struct { managedByLabel bool helm bool } - helmCommand string - loadRestrictor string - reorderOutput string - fnOptions types.FnPluginLoadingOptions + helmCommand string + helmApiVersions []string + helmKubeVersion string + loadRestrictor string + reorderOutput string + fnOptions types.FnPluginLoadingOptions } type Help struct { @@ -42,7 +46,7 @@ func MakeHelp(pgmName, cmdName string) *Help { fN := konfig.DefaultKustomizationFileName() return &Help{ Use: cmdName + " DIR", - Short: "Build a kustomization target from a directory or URL.", + Short: "Build a kustomization target from a directory or URL", Long: fmt.Sprintf(`Build a set of KRM resources using a '%s' file. The DIR argument must be a path to a directory containing '%s', or a git repository URL with a path suffix @@ -75,7 +79,7 @@ func NewCmdBuild( return err } k := krusty.MakeKustomizer( - HonorKustomizeFlags(krusty.MakeDefaultOptions()), + HonorKustomizeFlags(krusty.MakeDefaultOptions(), cmd.Flags()), ) m, err := k.Run(fSys, theArgs.kustomizationPath) if err != nil { @@ -104,8 +108,18 @@ func NewCmdBuild( AddFlagEnablePlugins(cmd.Flags()) AddFlagReorderOutput(cmd.Flags()) AddFlagEnableManagedbyLabel(cmd.Flags()) - cmd.Flags().MarkDeprecated(managedByFlag, + msg := "Error marking flag '%s' as deprecated: %v" + err := cmd.Flags().MarkDeprecated(flagReorderOutputName, + "use the new 'sortOptions' field in kustomization.yaml instead.") + if err != nil { + log.Fatalf(msg, flagReorderOutputName, err) + } + err = cmd.Flags().MarkDeprecated(managedByFlag, "The flag `enable-managedby-label` has been deprecated. Use the `managedByLabel` option in the `buildMetadata` field instead.") + if err != nil { + log.Fatalf(msg, managedByFlag, err) + } + AddFlagEnableHelm(cmd.Flags()) return cmd } @@ -130,8 +144,8 @@ func Validate(args []string) error { // HonorKustomizeFlags feeds command line data to the krusty options. // Flags and such are held in private package variables. -func HonorKustomizeFlags(kOpts *krusty.Options) *krusty.Options { - kOpts.DoLegacyResourceSort = getFlagReorderOutput() == legacy +func HonorKustomizeFlags(kOpts *krusty.Options, flags *flag.FlagSet) *krusty.Options { + kOpts.Reorder = getFlagReorderOutput(flags) kOpts.LoadRestrictions = getFlagLoadRestrictorValue() if theFlags.enable.plugins { c := types.EnabledPluginConfig(types.BploUseStaticallyLinked) @@ -141,6 +155,8 @@ func HonorKustomizeFlags(kOpts *krusty.Options) *krusty.Options { kOpts.PluginConfig.HelmConfig.Enabled = theFlags.enable.helm } kOpts.PluginConfig.HelmConfig.Command = theFlags.helmCommand + kOpts.PluginConfig.HelmConfig.ApiVersions = theFlags.helmApiVersions + kOpts.PluginConfig.HelmConfig.KubeVersion = theFlags.helmKubeVersion kOpts.AddManagedbyLabel = isManagedByLabelEnabled() return kOpts } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagaddmanagedby.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagaddmanagedby.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagaddmanagedby.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagaddmanagedby.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagenablehelm.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go similarity index 63% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagenablehelm.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go index 1a328ce67..a379d180a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagenablehelm.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go @@ -21,4 +21,14 @@ func AddFlagEnableHelm(set *pflag.FlagSet) { "helm-command", "helm", // default "helm command (path to executable)") + set.StringArrayVar( + &theFlags.helmApiVersions, + "helm-api-versions", + []string{}, // default + "Kubernetes api versions used by Helm for Capabilities.APIVersions") + set.StringVar( + &theFlags.helmKubeVersion, + "helm-kube-version", + "", // default + "Kubernetes version used by Helm for Capabilities.KubeVersion") } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagenableplugins.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenableplugins.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagenableplugins.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenableplugins.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagloadrestrictor.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagloadrestrictor.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagloadrestrictor.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagloadrestrictor.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagoutputpath.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagoutputpath.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagoutputpath.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagoutputpath.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagsforfunctions.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/flagsforfunctions.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/reorderoutput.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/reorderoutput.go new file mode 100644 index 000000000..f98a1ecf5 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/reorderoutput.go @@ -0,0 +1,50 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package build + +import ( + "fmt" + + "github.com/spf13/pflag" + flag "github.com/spf13/pflag" + "sigs.k8s.io/kustomize/api/krusty" +) + +const flagReorderOutputName = "reorder" + +func AddFlagReorderOutput(set *pflag.FlagSet) { + set.StringVar( + &theFlags.reorderOutput, flagReorderOutputName, + string(krusty.ReorderOptionLegacy), + "Reorder the resources just before output. Use '"+string(krusty.ReorderOptionLegacy)+"' to"+ + " apply a legacy reordering (Namespaces first, Webhooks last, etc)."+ + " Use '"+string(krusty.ReorderOptionNone)+"' to suppress a final reordering.") +} + +func validateFlagReorderOutput() error { + switch theFlags.reorderOutput { + case string(krusty.ReorderOptionNone), string(krusty.ReorderOptionLegacy): + return nil + default: + return fmt.Errorf( + "illegal flag value --%s %s; legal values: %v", + flagReorderOutputName, theFlags.reorderOutput, + []string{string(krusty.ReorderOptionLegacy), string(krusty.ReorderOptionNone)}) + } +} + +func getFlagReorderOutput(flags *flag.FlagSet) krusty.ReorderOption { + isReorderSet := flags.Changed(flagReorderOutputName) + if !isReorderSet { + return krusty.ReorderOptionUnspecified + } + switch theFlags.reorderOutput { + case string(krusty.ReorderOptionNone): + return krusty.ReorderOptionNone + case string(krusty.ReorderOptionLegacy): + return krusty.ReorderOptionLegacy + default: + return krusty.ReorderOptionUnspecified + } +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/writer.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/writer.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/build/writer.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/writer.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/commands.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/commands.go similarity index 82% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/commands.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/commands.go index 3f5e197cd..ba81114e8 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/commands.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/commands.go @@ -14,11 +14,12 @@ import ( "sigs.k8s.io/kustomize/api/provider" "sigs.k8s.io/kustomize/cmd/config/completion" "sigs.k8s.io/kustomize/cmd/config/configcobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/build" - "sigs.k8s.io/kustomize/kustomize/v4/commands/create" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit" - "sigs.k8s.io/kustomize/kustomize/v4/commands/openapi" - "sigs.k8s.io/kustomize/kustomize/v4/commands/version" + "sigs.k8s.io/kustomize/kustomize/v5/commands/build" + "sigs.k8s.io/kustomize/kustomize/v5/commands/create" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit" + "sigs.k8s.io/kustomize/kustomize/v5/commands/localize" + "sigs.k8s.io/kustomize/kustomize/v5/commands/openapi" + "sigs.k8s.io/kustomize/kustomize/v5/commands/version" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -53,6 +54,7 @@ See https://sigs.k8s.io/kustomize create.NewCmdCreate(fSys, pvd.GetResourceFactory()), version.NewCmdVersion(stdOut), openapi.NewCmdOpenAPI(stdOut), + localize.NewCmdLocalize(fSys), ) configcobra.AddCommands(c, konfig.ProgramName) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/create/create.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/create/create.go similarity index 92% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/create/create.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/create/create.go index ad0b8e891..81a05dbab 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/create/create.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/create/create.go @@ -11,10 +11,10 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" - "sigs.k8s.io/kustomize/api/loader" + ldrhelper "sigs.k8s.io/kustomize/api/pkg/loader" "sigs.k8s.io/kustomize/api/resource" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -61,7 +61,7 @@ func NewCmdCreate(fSys filesys.FileSystem, rf *resource.Factory) *cobra.Command &opts.namespace, "namespace", "", - "Set the value of the namespace field in the customization file.") + "Set the value of the namespace field in the kustomization file.") c.Flags().StringVar( &opts.annotations, "annotations", @@ -99,7 +99,7 @@ func runCreate(opts createFlags, fSys filesys.FileSystem, rf *resource.Factory) var resources []string var err error if opts.resources != "" { - resources, err = util.GlobPatternsWithLoader(fSys, loader.NewFileLoaderAtCwd(fSys), strings.Split(opts.resources, ",")) + resources, err = util.GlobPatternsWithLoader(fSys, ldrhelper.NewFileLoaderAtCwd(fSys), strings.Split(opts.resources, ","), false) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbase.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbase.go similarity index 96% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbase.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbase.go index d5835813a..01a422e5a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbase.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbase.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbuildmetadata.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbuildmetadata.go similarity index 94% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbuildmetadata.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbuildmetadata.go index b37623842..e4aa86ca3 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addbuildmetadata.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addbuildmetadata.go @@ -7,8 +7,8 @@ import ( "fmt" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addcomponent.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addcomponent.go similarity index 87% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addcomponent.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addcomponent.go index 1aff39332..c0f728f71 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addcomponent.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addcomponent.go @@ -8,9 +8,9 @@ import ( "log" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/api/loader" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/api/pkg/loader" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -24,7 +24,7 @@ func newCmdAddComponent(fSys filesys.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "component", - Short: "Add the name of a file containing a component to the kustomization file.", + Short: "Add the name of a file containing a component to the kustomization file", Example: ` add component {filepath}`, RunE: func(cmd *cobra.Command, args []string) error { @@ -49,7 +49,7 @@ func (o *addComponentOptions) Validate(args []string) error { // RunAddComponent runs addComponent command (do real work). func (o *addComponentOptions) RunAddComponent(fSys filesys.FileSystem) error { - components, err := util.GlobPatternsWithLoader(fSys, loader.NewFileLoaderAtCwd(fSys), o.componentFilePaths) + components, err := util.GlobPatternsWithLoader(fSys, loader.NewFileLoaderAtCwd(fSys), o.componentFilePaths, false) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/configmap.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addconfigmap.go similarity index 54% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/configmap.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addconfigmap.go index c538a7959..1566753bc 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/configmap.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addconfigmap.go @@ -4,11 +4,14 @@ package add import ( + "fmt" + "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -16,11 +19,12 @@ import ( func newCmdAddConfigMap( fSys filesys.FileSystem, ldr ifc.KvLoader, - rf *resource.Factory) *cobra.Command { - var flags flagsAndArgs + rf *resource.Factory, +) *cobra.Command { + var flags util.ConfigMapSecretFlagsAndArgs cmd := &cobra.Command{ - Use: "configmap NAME [--behavior={create|merge|replace}] [--from-file=[key=]source] [--from-literal=key1=value1]", - Short: "Adds a configmap to the kustomization file.", + Use: "configmap NAME [--namespace=namespace-name] [--behavior={create|merge|replace}] [--from-file=[key=]source] [--from-literal=key1=value1]", + Short: "Adds a configmap to the kustomization file", Long: "", Example: ` # Adds a configmap to the kustomization file (with a specified key) @@ -33,83 +37,108 @@ func newCmdAddConfigMap( kustomize edit add configmap my-configmap --from-env-file=env/path.env # Adds a configmap from env-file with behavior merge - kustomize edit add configmap my-configmap --behavior=merge --from-env-file=env/path.env + kustomize edit add configmap my-configmap --behavior=merge --from-env-file=env/path.env + + # Adds a configmap to the kustomization file with a specific namespace + kustomize edit add configmap my-configmap --namespace test-ns --from-literal=my-key=my-value `, RunE: func(_ *cobra.Command, args []string) error { - err := flags.ExpandFileSource(fSys) - if err != nil { - return err - } - - err = flags.Validate(args) - if err != nil { - return err - } - - // Load the kustomization file. - mf, err := kustfile.NewKustomizationFile(fSys) - if err != nil { - return err - } - - kustomization, err := mf.Read() - if err != nil { - return err - } - - // Add the flagsAndArgs map to the kustomization file. - err = addConfigMap(ldr, kustomization, flags, rf) - if err != nil { - return err - } - - // Write out the kustomization file with added configmap. - return mf.Write(kustomization) + return runEditAddConfigMap(flags, fSys, args, ldr, rf) }, } cmd.Flags().StringSliceVar( &flags.FileSources, - "from-file", + util.FromFileFlag, []string{}, "Key file can be specified using its file path, in which case file basename will be used as configmap "+ "key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+ "directory will iterate each named file in the directory whose basename is a valid configmap key.") cmd.Flags().StringArrayVar( &flags.LiteralSources, - "from-literal", + util.FromLiteralFlag, []string{}, "Specify a key and literal value to insert in configmap (i.e. mykey=somevalue)") cmd.Flags().StringVar( &flags.EnvFileSource, - "from-env-file", + util.FromEnvFileFlag, "", "Specify the path to a file to read lines of key=val pairs to create a configmap (i.e. a Docker .env file).") cmd.Flags().BoolVar( &flags.DisableNameSuffixHash, - "disableNameSuffixHash", + util.DisableNameSuffixHashFlag, false, "Disable the name suffix for the configmap") cmd.Flags().StringVar( &flags.Behavior, - "behavior", + util.BehaviorFlag, "", "Specify the behavior for config map generation, i.e whether to create a new configmap (the default), "+ "to merge with a previously defined one, or to replace an existing one. Merge and replace should be used only "+ " when overriding an existing configmap defined in a base") + cmd.Flags().StringVar( + &flags.Namespace, + util.NamespaceFlag, + "", + "Specify the namespace of the ConfigMap") return cmd } +func runEditAddConfigMap( + flags util.ConfigMapSecretFlagsAndArgs, + fSys filesys.FileSystem, + args []string, + ldr ifc.KvLoader, + rf *resource.Factory, +) error { + err := flags.ExpandFileSource(fSys) + if err != nil { + return fmt.Errorf("failed to expand file source: %w", err) + } + + err = flags.ValidateAdd(args) + if err != nil { + return fmt.Errorf("failed to validate flags: %w", err) + } + + // Load the kustomization file. + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("failed to load kustomization file: %w", err) + } + + kustomization, err := mf.Read() + if err != nil { + return fmt.Errorf("failed to read kustomization file: %w", err) + } + + // Add the configmapSecretFlagsAndArgs map to the kustomization file. + err = addConfigMap(ldr, kustomization, flags, rf) + if err != nil { + return fmt.Errorf("failed to create configmap: %w", err) + } + + // Write out the kustomization file with added configmap. + err = mf.Write(kustomization) + if err != nil { + return fmt.Errorf("failed to write kustomization file: %w", err) + } + + return nil +} + // addConfigMap adds a configmap to a kustomization file. // Note: error may leave kustomization file in an undefined state. // Suggest passing a copy of kustomization file. func addConfigMap( ldr ifc.KvLoader, k *types.Kustomization, - flags flagsAndArgs, rf *resource.Factory) error { - args := findOrMakeConfigMapArgs(k, flags.Name) - mergeFlagsIntoCmArgs(args, flags) + flags util.ConfigMapSecretFlagsAndArgs, + rf *resource.Factory, +) error { + args := findOrMakeConfigMapArgs(k, flags.Name, flags.Namespace) + util.MergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags) // Validate by trying to create corev1.configmap. args.Options = types.MergeGlobalOptionsIntoLocal( args.Options, k.GeneratorOptions) @@ -117,37 +146,16 @@ func addConfigMap( return err } -func findOrMakeConfigMapArgs(m *types.Kustomization, name string) *types.ConfigMapArgs { +func findOrMakeConfigMapArgs(m *types.Kustomization, name, namespace string) *types.ConfigMapArgs { for i, v := range m.ConfigMapGenerator { - if name == v.Name { + if name == v.Name && util.NamespaceEqual(v.Namespace, namespace) { return &m.ConfigMapGenerator[i] } } // config map not found, create new one and add it to the kustomization file. - cm := &types.ConfigMapArgs{GeneratorArgs: types.GeneratorArgs{Name: name}} + cm := &types.ConfigMapArgs{ + GeneratorArgs: types.GeneratorArgs{Name: name, Namespace: namespace}, + } m.ConfigMapGenerator = append(m.ConfigMapGenerator, *cm) return &m.ConfigMapGenerator[len(m.ConfigMapGenerator)-1] } - -func mergeFlagsIntoCmArgs(args *types.ConfigMapArgs, flags flagsAndArgs) { - if len(flags.LiteralSources) > 0 { - args.LiteralSources = append( - args.LiteralSources, flags.LiteralSources...) - } - if len(flags.FileSources) > 0 { - args.FileSources = append( - args.FileSources, flags.FileSources...) - } - if flags.EnvFileSource != "" { - args.EnvSources = append( - args.EnvSources, flags.EnvFileSource) - } - if flags.DisableNameSuffixHash { - args.Options = &types.GeneratorOptions{ - DisableNameSuffixHash: true, - } - } - if flags.Behavior != "" { - args.Behavior = flags.Behavior - } -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addgenerator.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addgenerator.go similarity index 91% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addgenerator.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addgenerator.go index 4029c56c9..ee475d1b4 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addgenerator.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addgenerator.go @@ -8,8 +8,8 @@ import ( "log" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -23,7 +23,7 @@ func newCmdAddGenerator(fSys filesys.FileSystem) *cobra.Command { var o addGeneratorOptions cmd := &cobra.Command{ Use: "generator", - Short: "Add the name of a file containing a generator configuration to the kustomization file.", + Short: "Add the name of a file containing a generator configuration to the kustomization file", Example: ` add generator {filepath}`, RunE: func(cmd *cobra.Command, args []string) error { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addmetadata.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addmetadata.go similarity index 84% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addmetadata.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addmetadata.go index a7483b48d..eda017b76 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addmetadata.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addmetadata.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -34,10 +34,11 @@ func (k kindOfAdd) String() string { } type addMetadataOptions struct { - force bool - metadata map[string]string - mapValidator func(map[string]string) error - kind kindOfAdd + force bool + metadata map[string]string + mapValidator func(map[string]string) error + kind kindOfAdd + labelsWithoutSelector bool } // newCmdAddAnnotation adds one or more commonAnnotations to the kustomization file. @@ -79,6 +80,9 @@ func newCmdAddLabel(fSys filesys.FileSystem, v func(map[string]string) error) *c cmd.Flags().BoolVarP(&o.force, "force", "f", false, "overwrite commonLabel if it already exists", ) + cmd.Flags().BoolVar(&o.labelsWithoutSelector, "without-selector", false, + "using add labels without selector option", + ) return cmd } @@ -127,6 +131,10 @@ func (o *addMetadataOptions) addAnnotations(m *types.Kustomization) error { } func (o *addMetadataOptions) addLabels(m *types.Kustomization) error { + if o.labelsWithoutSelector { + m.Labels = append(m.Labels, types.Label{Pairs: make(map[string]string), IncludeSelectors: false}) + return o.writeToMap(m.Labels[len(m.Labels)-1].Pairs, label) + } if m.CommonLabels == nil { m.CommonLabels = make(map[string]string) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addpatch.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addpatch.go similarity index 96% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addpatch.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addpatch.go index f0622ef8f..119040114 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addpatch.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addpatch.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -24,7 +24,7 @@ func newCmdAddPatch(fSys filesys.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "patch", - Short: "Add an item to patches field.", + Short: "Add an item to patches field", Long: `This command will add an item to patches field in the kustomization file. Each item may: diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addresource.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addresource.go similarity index 79% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addresource.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addresource.go index ff570f606..529f2b119 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addresource.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addresource.go @@ -8,14 +8,15 @@ import ( "log" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/api/loader" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + ldrhelper "sigs.k8s.io/kustomize/api/pkg/loader" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) type addResourceOptions struct { resourceFilePaths []string + noVerify bool } // newCmdAddResource adds the name of a file containing a resource to the kustomization file. @@ -24,7 +25,7 @@ func newCmdAddResource(fSys filesys.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "resource", - Short: "Add the name of a file containing a resource to the kustomization file.", + Short: "Add the name of a file containing a resource to the kustomization file", Example: ` add resource {filepath}`, RunE: func(cmd *cobra.Command, args []string) error { @@ -35,6 +36,9 @@ func newCmdAddResource(fSys filesys.FileSystem) *cobra.Command { return o.RunAddResource(fSys) }, } + cmd.Flags().BoolVar(&o.noVerify, "no-verify", false, + "skip validation for resources", + ) return cmd } @@ -49,7 +53,7 @@ func (o *addResourceOptions) Validate(args []string) error { // RunAddResource runs addResource command (do real work). func (o *addResourceOptions) RunAddResource(fSys filesys.FileSystem) error { - resources, err := util.GlobPatternsWithLoader(fSys, loader.NewFileLoaderAtCwd(fSys), o.resourceFilePaths) + resources, err := util.GlobPatternsWithLoader(fSys, ldrhelper.NewFileLoaderAtCwd(fSys), o.resourceFilePaths, o.noVerify) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/secret.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addsecret.go similarity index 65% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/secret.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addsecret.go index 95cb258aa..982a9c5c3 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/secret.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addsecret.go @@ -4,11 +4,14 @@ package add import ( + "fmt" + "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -16,8 +19,9 @@ import ( func newCmdAddSecret( fSys filesys.FileSystem, ldr ifc.KvLoader, - rf *resource.Factory) *cobra.Command { - var flags flagsAndArgs + rf *resource.Factory, +) *cobra.Command { + var flags util.ConfigMapSecretFlagsAndArgs cmd := &cobra.Command{ Use: "secret NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--type=Opaque|kubernetes.io/tls]", Short: "Adds a secret to the kustomization file.", @@ -33,53 +37,25 @@ func newCmdAddSecret( kustomize edit add secret my-secret --from-env-file=env/path.env `, RunE: func(_ *cobra.Command, args []string) error { - err := flags.ExpandFileSource(fSys) - if err != nil { - return err - } - - err = flags.Validate(args) - if err != nil { - return err - } - - // Load the kustomization file. - mf, err := kustfile.NewKustomizationFile(fSys) - if err != nil { - return err - } - - kustomization, err := mf.Read() - if err != nil { - return err - } - - // Add the flagsAndArgs map to the kustomization file. - err = addSecret(ldr, kustomization, flags, rf) - if err != nil { - return err - } - - // Write out the kustomization file with added secret. - return mf.Write(kustomization) + return runEditAddSecret(flags, fSys, args, ldr, rf) }, } cmd.Flags().StringSliceVar( &flags.FileSources, - "from-file", + util.FromFileFlag, []string{}, "Key file can be specified using its file path, in which case file basename will be used as secret "+ "key, or optionally with a key and file path, in which case the given key will be used. Specifying a "+ "directory will iterate each named file in the directory whose basename is a valid secret key.") cmd.Flags().StringArrayVar( &flags.LiteralSources, - "from-literal", + util.FromLiteralFlag, []string{}, "Specify a key and literal value to insert in secret (i.e. mykey=somevalue)") cmd.Flags().StringVar( &flags.EnvFileSource, - "from-env-file", + util.FromEnvFileFlag, "", "Specify the path to a file to read lines of key=val pairs to create a secret (i.e. a Docker .env file).") cmd.Flags().StringVar( @@ -89,27 +65,72 @@ func newCmdAddSecret( "Specify the secret type this can be 'Opaque' (default), or 'kubernetes.io/tls'") cmd.Flags().StringVar( &flags.Namespace, - "namespace", + util.NamespaceFlag, "", "Specify the namespace of the secret") cmd.Flags().BoolVar( &flags.DisableNameSuffixHash, - "disableNameSuffixHash", + util.DisableNameSuffixHashFlag, false, "Disable the name suffix for the secret") return cmd } +func runEditAddSecret( + flags util.ConfigMapSecretFlagsAndArgs, + fSys filesys.FileSystem, + args []string, + ldr ifc.KvLoader, + rf *resource.Factory, +) error { + err := flags.ExpandFileSource(fSys) + if err != nil { + return fmt.Errorf("failed to expand file source: %w", err) + } + + err = flags.ValidateAdd(args) + if err != nil { + return fmt.Errorf("failed to validate flags: %w", err) + } + + // Load the kustomization file. + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("failed to load kustomization file: %w", err) + } + + kustomization, err := mf.Read() + if err != nil { + return fmt.Errorf("failed to read kustomization file: %w", err) + } + + // Add the configmapSecretFlagsAndArgs map to the kustomization file. + err = addSecret(ldr, kustomization, flags, rf) + if err != nil { + return fmt.Errorf("failed to create secret: %w", err) + } + + // Write out the kustomization file with added secret. + err = mf.Write(kustomization) + if err != nil { + return fmt.Errorf("failed to write kustomization file: %w", err) + } + + return nil +} + // addSecret adds a secret to a kustomization file. // Note: error may leave kustomization file in an undefined state. // Suggest passing a copy of kustomization file. func addSecret( ldr ifc.KvLoader, k *types.Kustomization, - flags flagsAndArgs, rf *resource.Factory) error { + flags util.ConfigMapSecretFlagsAndArgs, + rf *resource.Factory, +) error { args := findOrMakeSecretArgs(k, flags.Name, flags.Namespace, flags.Type) - mergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags) + util.MergeFlagsIntoGeneratorArgs(&args.GeneratorArgs, flags) // Validate by trying to create corev1.secret. args.Options = types.MergeGlobalOptionsIntoLocal( args.Options, k.GeneratorOptions) @@ -119,7 +140,7 @@ func addSecret( func findOrMakeSecretArgs(m *types.Kustomization, name, namespace, secretType string) *types.SecretArgs { for i, v := range m.SecretGenerator { - if name == v.Name && namespace == v.Namespace { + if name == v.Name && util.NamespaceEqual(v.Namespace, namespace) { return &m.SecretGenerator[i] } } @@ -131,26 +152,3 @@ func findOrMakeSecretArgs(m *types.Kustomization, name, namespace, secretType st m.SecretGenerator = append(m.SecretGenerator, *secret) return &m.SecretGenerator[len(m.SecretGenerator)-1] } - -func mergeFlagsIntoGeneratorArgs(args *types.GeneratorArgs, flags flagsAndArgs) { - if len(flags.LiteralSources) > 0 { - args.LiteralSources = append( - args.LiteralSources, flags.LiteralSources...) - } - if len(flags.FileSources) > 0 { - args.FileSources = append( - args.FileSources, flags.FileSources...) - } - if flags.EnvFileSource != "" { - args.EnvSources = append( - args.EnvSources, flags.EnvFileSource) - } - if flags.DisableNameSuffixHash { - args.Options = &types.GeneratorOptions{ - DisableNameSuffixHash: true, - } - } - if flags.Behavior != "" { - args.Behavior = flags.Behavior - } -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addtransformer.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addtransformer.go similarity index 91% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addtransformer.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addtransformer.go index f4ee7e0a7..288ee3f3e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/addtransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/addtransformer.go @@ -8,8 +8,8 @@ import ( "log" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -23,7 +23,7 @@ func newCmdAddTransformer(fSys filesys.FileSystem) *cobra.Command { var o addTransformerOptions cmd := &cobra.Command{ Use: "transformer", - Short: "Add the name of a file containing a transformer configuration to the kustomization file.", + Short: "Add the name of a file containing a transformer configuration to the kustomization file", Example: ` add transformer {filepath}`, RunE: func(cmd *cobra.Command, args []string) error { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/all.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/all.go similarity index 97% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/all.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/all.go index d9605444c..01dded508 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add/all.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add/all.go @@ -17,7 +17,7 @@ func NewCmdAdd( rf *resource.Factory) *cobra.Command { c := &cobra.Command{ Use: "add", - Short: "Adds an item to the kustomization file.", + Short: "Adds an item to the kustomization file", Long: "", Example: ` # Adds a secret to the kustomization file diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/all.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/all.go similarity index 68% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/all.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/all.go index 56c4ebe67..ee30dbfb1 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/all.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/all.go @@ -9,13 +9,13 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/kv" - "sigs.k8s.io/kustomize/api/loader" + ldrhelper "sigs.k8s.io/kustomize/api/pkg/loader" "sigs.k8s.io/kustomize/api/resource" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit/add" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit/listbuiltin" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove" - "sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit/add" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit/listbuiltin" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove" + "sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -43,12 +43,13 @@ func NewCmdEdit( c.AddCommand( add.NewCmdAdd( fSys, - kv.NewLoader(loader.NewFileLoaderAtCwd(fSys), v), + kv.NewLoader(ldrhelper.NewFileLoaderAtCwd(fSys), v), rf), set.NewCmdSet( fSys, - kv.NewLoader(loader.NewFileLoaderAtCwd(fSys), v), - v), + kv.NewLoader(ldrhelper.NewFileLoaderAtCwd(fSys), v), + v, + rf), fix.NewCmdFix(fSys, w), remove.NewCmdRemove(fSys, v), listbuiltin.NewCmdListBuiltinPlugin(), diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/convert.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/convert.go similarity index 98% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/convert.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/convert.go index 43aeadf17..f6c450803 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/convert.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/convert.go @@ -134,7 +134,7 @@ func getNodesFromFile(fileName string, fSys filesys.FileSystem) ([]*kyaml.RNode, } out := &bytes.Buffer{} r := kio.ByteReadWriter{ - Reader: bytes.NewBufferString(string(b)), + Reader: bytes.NewBuffer(b), Writer: out, KeepReaderAnnotations: true, OmitReaderAnnotations: true, @@ -284,7 +284,11 @@ func constructTargets(file string, node *kyaml.RNode, fieldPaths []string, func writePatchTargets(patch types.Patch, node *kyaml.RNode, fieldPaths []string, options []*types.FieldOptions) ([]*types.TargetSelector, error) { var result []*types.TargetSelector - selector := patch.Target.Copy() + + selector := types.Selector{} + if patch.Target != nil { + selector = patch.Target.Copy() + } for i := range fieldPaths { target := &types.TargetSelector{ diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/fix.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/fix.go similarity index 89% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/fix.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/fix.go index eb1e260fb..c261f20d9 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/fix/fix.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/fix/fix.go @@ -11,8 +11,8 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" "sigs.k8s.io/kustomize/api/konfig" - "sigs.k8s.io/kustomize/kustomize/v4/commands/build" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/build" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -55,8 +55,7 @@ func RunFix(fSys filesys.FileSystem, w io.Writer) error { return err } - err = m.FixKustomizationPreMarshalling() - if err != nil { + if err := m.FixKustomizationPreMarshalling(fSys); err != nil { return err } @@ -68,12 +67,14 @@ func RunFix(fSys filesys.FileSystem, w io.Writer) error { fmt.Fprintln(w, ` Fixed fields: patchesJson6902 -> patches + patchesStrategicMerge -> patches commonLabels -> labels vars -> replacements`) } else { fmt.Fprintln(w, ` Fixed fields: patchesJson6902 -> patches + patchesStrategicMerge -> patches commonLabels -> labels To convert vars -> replacements, run the command `+"`kustomize edit fix --vars`"+` @@ -89,7 +90,7 @@ We recommend doing this in a clean git repository where the change is easy to un fixedBuildCmd := build.NewCmdBuild(fSys, build.MakeHelp(konfig.ProgramName, "build"), &fixedOutput) err = fixedBuildCmd.RunE(fixedBuildCmd, nil) if err != nil { - fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces the error when running `kustomize build`: %s", err.Error()) + fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces the error when running `kustomize build`: %s\n", err.Error()) } else if fixedOutput.String() != oldOutput.String() { fmt.Fprintf(w, "Warning: 'Fixed' kustomization now produces different output when running `kustomize build`:\n...%s...\n", fixedOutput.String()) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/listbuiltin/listbuiltin.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/listbuiltin/listbuiltin.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/listbuiltin/listbuiltin.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/listbuiltin/listbuiltin.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/all.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/all.go similarity index 80% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/all.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/all.go index 14db55ea1..12c1ea94c 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/all.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/all.go @@ -15,13 +15,19 @@ func NewCmdRemove( v ifc.Validator) *cobra.Command { c := &cobra.Command{ Use: "remove", - Short: "Removes items from the kustomization file.", + Short: "Removes items from the kustomization file", Long: "", Example: ` # Removes resources from the kustomization file kustomize edit remove resource {filepath} {filepath} kustomize edit remove resource {pattern} + # Removes one or more configmap from the kustomization file + kustomize edit remove configmap {name1},{name2} + + # Removes one or more secret from the kustomization file + kustomize edit remove secret {name1},{name2} + # Removes one or more patches from the kustomization file kustomize edit remove patch --path {filepath} --group {target group name} --version {target version} @@ -37,6 +43,8 @@ func NewCmdRemove( Args: cobra.MinimumNArgs(1), } c.AddCommand( + newCmdRemoveConfigMap(fSys), + newCmdRemoveSecret(fSys), newCmdRemoveResource(fSys), newCmdRemoveLabel(fSys, v.MakeLabelNameValidator()), newCmdRemoveAnnotation(fSys, v.MakeAnnotationNameValidator()), diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removebuildmetadata.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removebuildmetadata.go similarity index 94% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removebuildmetadata.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removebuildmetadata.go index be918044d..de27de0a1 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removebuildmetadata.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removebuildmetadata.go @@ -5,8 +5,8 @@ package remove import ( "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeconfigmap.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeconfigmap.go new file mode 100644 index 000000000..7eeedb7d0 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeconfigmap.go @@ -0,0 +1,117 @@ +// Copyright 2023 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package remove + +import ( + "errors" + "fmt" + "log" + "strings" + + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +type removeConfigMapOptions struct { + configMapNamesToRemove []string + namespace string +} + +// newCmdRemoveConfigMap removes configMapGenerator(s) with the specified name(s). +func newCmdRemoveConfigMap(fSys filesys.FileSystem) *cobra.Command { + var flags removeConfigMapOptions + + cmd := &cobra.Command{ + Use: "configmap NAME [,NAME] [--namespace=namespace-name]", + Short: "Removes the specified configmap(s) from " + + konfig.DefaultKustomizationFileName(), + Long: `Removes the specified configmap(s) from the ` + konfig.DefaultKustomizationFileName() + ` file in the specified namespace. +If multiple configmap names are specified, the command will not fail on secret names that were not found in the file, +but will issue a warning for each name that wasn't found.`, + Example: ` + # Removes a single configmap named 'my-configmap' in the default namespace from the ` + konfig.DefaultKustomizationFileName() + ` file + kustomize edit remove configmap my-configmap + + # Removes configmaps named 'my-configmap' and 'other-configmap' in namespace 'test-namespace' from the ` + konfig.DefaultKustomizationFileName() + ` file + kustomize edit remove configmap my-configmap,other-configmap --namespace=test-namespace +`, + RunE: func(cmd *cobra.Command, args []string) error { + err := flags.Validate(args) + if err != nil { + return err + } + return flags.RunRemoveConfigMap(fSys) + }, + } + + cmd.Flags().StringVar( + &flags.namespace, + util.NamespaceFlag, + "", + "Namespace to remove ConfigMap(s) from", + ) + + return cmd +} + +// Validate validates removeConfigMap command. +func (o *removeConfigMapOptions) Validate(args []string) error { + switch { + case len(args) == 0: + return errors.New("at least one configmap name must be specified") + case len(args) > 1: + return fmt.Errorf("too many arguments: %s; to provide multiple configmaps to remove, please separate configmap names by commas", args) + } + + o.configMapNamesToRemove = strings.Split(args[0], ",") + return nil +} + +// RunRemoveConfigMap runs ConfigMap command (do real work). +func (o *removeConfigMapOptions) RunRemoveConfigMap(fSys filesys.FileSystem) error { + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("could not read kustomization file: %w", err) + } + + m, err := mf.Read() + if err != nil { + return fmt.Errorf("could not read kustomization file contents: %w", err) + } + + foundConfigMaps := make(map[string]struct{}) + remainingConfigMaps := make([]types.ConfigMapArgs, 0, len(m.ConfigMapGenerator)) + + for _, currentConfigMap := range m.ConfigMapGenerator { + if kustfile.StringInSlice(currentConfigMap.Name, o.configMapNamesToRemove) && + util.NamespaceEqual(currentConfigMap.Namespace, o.namespace) { + foundConfigMaps[currentConfigMap.Name] = struct{}{} + continue + } + + remainingConfigMaps = append(remainingConfigMaps, currentConfigMap) + } + + if len(foundConfigMaps) == 0 { + return fmt.Errorf("no specified configmap(s) were found in the %s file", + konfig.DefaultKustomizationFileName()) + } + + for _, name := range o.configMapNamesToRemove { + if _, found := foundConfigMaps[name]; !found { + log.Printf("configmap %s doesn't exist in kustomization file", name) + } + } + + m.ConfigMapGenerator = remainingConfigMaps + err = mf.Write(m) + if err != nil { + return fmt.Errorf("failed to write kustomization file: %w", err) + } + return nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removemetadata.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removemetadata.go similarity index 98% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removemetadata.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removemetadata.go index 6e1f6617a..3c34916fc 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removemetadata.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removemetadata.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removepatch.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removepatch.go similarity index 94% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removepatch.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removepatch.go index 103cb3463..2919efd67 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removepatch.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removepatch.go @@ -6,11 +6,11 @@ package remove import ( "log" - "github.com/pkg/errors" "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -55,7 +55,7 @@ exactly match the patch item to successfully remote the item.`, // Validate validates removePatch command. func (o *removePatchOptions) Validate() error { if o.Patch.Patch != "" && o.Patch.Path != "" { - return errors.New("patch and path can't be set at the same time") + return errors.Errorf("patch and path can't be set at the same time") } return nil } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removeresource.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeresource.go similarity index 97% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removeresource.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeresource.go index 4a85356ef..fc76943d0 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removeresource.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removeresource.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removesecret.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removesecret.go new file mode 100644 index 000000000..89a8af230 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removesecret.go @@ -0,0 +1,117 @@ +// Copyright 2023 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package remove + +import ( + "errors" + "fmt" + "log" + "strings" + + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +type removeSecretOptions struct { + secretNamesToRemove []string + namespace string +} + +// newCmdRemoveSecret removes secretGenerator(s) with the specified name(s). +func newCmdRemoveSecret(fSys filesys.FileSystem) *cobra.Command { + var flags removeSecretOptions + + cmd := &cobra.Command{ + Use: "secret NAME [,NAME] [--namespace=namespace-name]", + Short: "Removes the specified secret(s) from " + + konfig.DefaultKustomizationFileName(), + Long: `Removes the specified secret(s) from the ` + konfig.DefaultKustomizationFileName() + ` file in the specified namespace. +If multiple secret names are specified, the command will not fail on secret names that were not found in the file, +but will issue a warning for each name that wasn't found.`, + Example: ` + # Removes a single secret named 'my-secret' in the default namespace from the ` + konfig.DefaultKustomizationFileName() + ` file + kustomize edit remove secret my-secret + + # Removes secrets named 'my-secret' and 'other-secret' in namespace 'test-namespace' from the ` + konfig.DefaultKustomizationFileName() + ` file + kustomize edit remove secret my-secret,other-secret --namespace=test-namespace +`, + + RunE: func(cmd *cobra.Command, args []string) error { + err := flags.Validate(args) + if err != nil { + return err + } + return flags.RunRemoveSecret(fSys) + }, + } + + cmd.Flags().StringVar( + &flags.namespace, + util.NamespaceFlag, + "", + "Namespace to remove Secret(s) from", + ) + + return cmd +} + +// Validate validates removeSecret command. +func (o *removeSecretOptions) Validate(args []string) error { + switch { + case len(args) == 0: + return errors.New("at least one secret name must be specified") + case len(args) > 1: + return fmt.Errorf("too many arguments: %s; to provide multiple secrets to remove, please separate secret names by commas", args) + } + + o.secretNamesToRemove = strings.Split(args[0], ",") + return nil +} + +// RunRemoveSecret runs Secret command (do real work). +func (o *removeSecretOptions) RunRemoveSecret(fSys filesys.FileSystem) error { + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("could not read kustomization file: %w", err) + } + + m, err := mf.Read() + if err != nil { + return fmt.Errorf("could not read kustomization file contents: %w", err) + } + + foundSecrets := make(map[string]struct{}) + remainingSecrets := make([]types.SecretArgs, 0, len(m.SecretGenerator)) + + for _, currentSecret := range m.SecretGenerator { + if kustfile.StringInSlice(currentSecret.Name, o.secretNamesToRemove) && + util.NamespaceEqual(currentSecret.Namespace, o.namespace) { + foundSecrets[currentSecret.Name] = struct{}{} + continue + } + remainingSecrets = append(remainingSecrets, currentSecret) + } + + if len(foundSecrets) == 0 { + return fmt.Errorf("no specified secret(s) were found in the %s file", + konfig.DefaultKustomizationFileName()) + } + + for _, name := range o.secretNamesToRemove { + if _, found := foundSecrets[name]; !found { + log.Printf("secret %s doesn't exist in kustomization file", name) + } + } + + m.SecretGenerator = remainingSecrets + err = mf.Write(m) + if err != nil { + return fmt.Errorf("failed to write kustomization file: %w", err) + } + return nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removetransformer.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removetransformer.go similarity index 96% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removetransformer.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removetransformer.go index 9f63dbd87..c8e188cec 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/remove/removetransformer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/remove/removetransformer.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/all.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/all.go similarity index 81% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/all.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/all.go index 1f62d62a3..0c716c91b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/all.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/all.go @@ -6,14 +6,20 @@ package set import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/kyaml/filesys" ) // NewCmdSet returns an instance of 'set' subcommand. -func NewCmdSet(fSys filesys.FileSystem, ldr ifc.KvLoader, v ifc.Validator) *cobra.Command { +func NewCmdSet( + fSys filesys.FileSystem, + ldr ifc.KvLoader, + v ifc.Validator, + rf *resource.Factory, +) *cobra.Command { c := &cobra.Command{ Use: "set", - Short: "Sets the value of different fields in kustomization file.", + Short: "Sets the value of different fields in kustomization file", Long: "", Example: ` # Sets the nameprefix field @@ -26,6 +32,7 @@ func NewCmdSet(fSys filesys.FileSystem, ldr ifc.KvLoader, v ifc.Validator) *cobr } c.AddCommand( + newCmdSetConfigMap(fSys, ldr, rf), newCmdSetNamePrefix(fSys), newCmdSetNameSuffix(fSys), newCmdSetNamespace(fSys, v), diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_prefix.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_prefix.go similarity index 95% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_prefix.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_prefix.go index 268ce133b..e04a5f6f0 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_prefix.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_prefix.go @@ -7,7 +7,7 @@ import ( "errors" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -21,7 +21,7 @@ func newCmdSetNamePrefix(fSys filesys.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "nameprefix", - Short: "Sets the value of the namePrefix field in the kustomization file.", + Short: "Sets the value of the namePrefix field in the kustomization file", Example: ` The command set nameprefix acme- diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_suffix.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_suffix.go similarity index 95% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_suffix.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_suffix.go index 1eb00e2b9..8d1173583 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/set_name_suffix.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/set_name_suffix.go @@ -7,7 +7,7 @@ import ( "errors" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -21,7 +21,7 @@ func newCmdSetNameSuffix(fSys filesys.FileSystem) *cobra.Command { cmd := &cobra.Command{ Use: "namesuffix", - Short: "Sets the value of the nameSuffix field in the kustomization file.", + Short: "Sets the value of the nameSuffix field in the kustomization file", Example: ` The command set namesuffix -- -acme diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setannotation.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setannotation.go similarity index 95% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setannotation.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setannotation.go index bd23edf52..3e4d36baf 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setannotation.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setannotation.go @@ -11,8 +11,8 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setbuildmetadata.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setbuildmetadata.go similarity index 94% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setbuildmetadata.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setbuildmetadata.go index 43a7cc1ea..c016bb26a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setbuildmetadata.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setbuildmetadata.go @@ -5,8 +5,8 @@ package set import ( "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setconfigmap.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setconfigmap.go new file mode 100644 index 000000000..71aae88da --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setconfigmap.go @@ -0,0 +1,151 @@ +// Copyright 2023 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package set + +import ( + "fmt" + + "github.com/spf13/cobra" + "golang.org/x/exp/slices" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +func newCmdSetConfigMap( + fSys filesys.FileSystem, + ldr ifc.KvLoader, + rf *resource.Factory, +) *cobra.Command { + var flags util.ConfigMapSecretFlagsAndArgs + cmd := &cobra.Command{ + Use: "configmap NAME [--from-literal=key1=value1] [--namespace=namespace-name] [--new-namespace=new-namespace-name]", + Short: "Edits the value for an existing key for a configmap in the kustomization file", + Long: `Edits the value for an existing key in an existing configmap in the kustomization file. +Both configmap name and key name must exist for this command to succeed.`, + Example: ` + # Edits an existing configmap in the kustomization file, changing value of key1 to 2 + kustomize edit set configmap my-configmap --from-literal=key1=2 + + # Edits an existing configmap in the kustomization file, changing namespace to 'new-namespace' + kustomize edit set configmap my-configmap --namespace=current-namespace --new-namespace=new-namespace +`, + RunE: func(_ *cobra.Command, args []string) error { + return runEditSetConfigMap(flags, fSys, args, ldr, rf) + }, + } + + cmd.Flags().StringArrayVar( + &flags.LiteralSources, + util.FromLiteralFlag, + []string{}, + "Specify an existing key and a new value to update a ConfigMap (i.e. mykey=newvalue)") + cmd.Flags().StringVar( + &flags.Namespace, + util.NamespaceFlag, + "", + "Current namespace of the target ConfigMap") + cmd.Flags().StringVar( + &flags.NewNamespace, + util.NewNamespaceFlag, + "", + "New namespace value for the target ConfigMap") + + return cmd +} + +func runEditSetConfigMap( + flags util.ConfigMapSecretFlagsAndArgs, + fSys filesys.FileSystem, + args []string, + ldr ifc.KvLoader, + rf *resource.Factory, +) error { + err := flags.ExpandFileSource(fSys) + if err != nil { + return fmt.Errorf("failed to expand file source: %w", err) + } + + err = flags.ValidateSet(args) + if err != nil { + return fmt.Errorf("failed to validate flags: %w", err) + } + + // Load the kustomization file. + mf, err := kustfile.NewKustomizationFile(fSys) + if err != nil { + return fmt.Errorf("failed to load kustomization file: %w", err) + } + + kustomization, err := mf.Read() + if err != nil { + return fmt.Errorf("failed to read kustomization file: %w", err) + } + + // Updates the existing ConfigMap + err = setConfigMap(ldr, kustomization, flags, rf) + if err != nil { + return fmt.Errorf("failed to create configmap: %w", err) + } + + // Write out the kustomization file with added configmap. + err = mf.Write(kustomization) + if err != nil { + return fmt.Errorf("failed to write kustomization file: %w", err) + } + + return nil +} + +func setConfigMap( + ldr ifc.KvLoader, + k *types.Kustomization, + flags util.ConfigMapSecretFlagsAndArgs, + rf *resource.Factory, +) error { + args, err := findConfigMapArgs(k, flags.Name, flags.Namespace) + if err != nil { + return fmt.Errorf("could not set new ConfigMap value: %w", err) + } + + if len(flags.LiteralSources) > 0 { + err := util.UpdateLiteralSources(&args.GeneratorArgs, flags) + if err != nil { + return fmt.Errorf("failed to update literal sources: %w", err) + } + } + + // update namespace to new one + if flags.NewNamespace != "" { + args.Namespace = flags.NewNamespace + } + + // Validate by trying to create corev1.configmap. + args.Options = types.MergeGlobalOptionsIntoLocal( + args.Options, k.GeneratorOptions) + + _, err = rf.MakeConfigMap(ldr, args) + if err != nil { + return fmt.Errorf("failed to validate ConfigMap structure: %w", err) + } + + return nil +} + +// findConfigMapArgs finds the generator arguments corresponding to the specified +// ConfigMap name. ConfigMap must exist for this command to be successful. +func findConfigMapArgs(m *types.Kustomization, name, namespace string) (*types.ConfigMapArgs, error) { + cmIndex := slices.IndexFunc(m.ConfigMapGenerator, func(cmArgs types.ConfigMapArgs) bool { + return name == cmArgs.Name && util.NamespaceEqual(namespace, cmArgs.Namespace) + }) + + if cmIndex == -1 { + return nil, fmt.Errorf("unable to find ConfigMap with name '%q'", name) + } + + return &m.ConfigMapGenerator[cmIndex], nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setimage.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setimage.go similarity index 98% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setimage.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setimage.go index e68d7b191..f03501dcf 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setimage.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setimage.go @@ -12,7 +12,7 @@ import ( "sigs.k8s.io/kustomize/api/types" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setlabel.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setlabel.go similarity index 94% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setlabel.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setlabel.go index 3fa41ee66..0d2c6c2c8 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setlabel.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setlabel.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setnamespace.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setnamespace.go similarity index 96% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setnamespace.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setnamespace.go index 0da231429..80f1dd33e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setnamespace.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setnamespace.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/ifc" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setreplicas.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setreplicas.go similarity index 97% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setreplicas.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setreplicas.go index 695f19ad2..fc2019b10 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/edit/set/setreplicas.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/edit/set/setreplicas.go @@ -11,7 +11,7 @@ import ( "github.com/spf13/cobra" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" "sigs.k8s.io/kustomize/kyaml/filesys" ) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile/kustomizationfile.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile/kustomizationfile.go similarity index 93% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile/kustomizationfile.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile/kustomizationfile.go index 967e8312f..4804b5691 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile/kustomizationfile.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile/kustomizationfile.go @@ -65,7 +65,6 @@ func determineFieldOrder() []string { "Configurations", "Generators", "Transformers", - "Inventory", "Components", "OpenAPI", "BuildMetadata", @@ -165,21 +164,18 @@ func (mf *kustomizationFile) Read() (*types.Kustomization, error) { if err != nil { return nil, err } - data, err = types.FixKustomizationPreUnmarshalling(data) - if err != nil { - return nil, err - } + var k types.Kustomization - err = k.Unmarshal(data) - if err != nil { + if err := k.Unmarshal(data); err != nil { return nil, err } - k.FixKustomizationPostUnmarshalling() - err = mf.parseCommentedFields(data) - if err != nil { + + k.FixKustomization() + + if err := mf.parseCommentedFields(data); err != nil { return nil, err } - return &k, err + return &k, nil } func (mf *kustomizationFile) Write(kustomization *types.Kustomization) error { @@ -264,12 +260,13 @@ func (mf *kustomizationFile) hasField(name string) bool { } /* - isCommentOrBlankLine determines if a line is a comment or blank line - Return true for following lines - # This line is a comment - # This line is also a comment with several leading white spaces +isCommentOrBlankLine determines if a line is a comment or blank line +Return true for following lines +# This line is a comment + + # This line is also a comment with several leading white spaces - (The line above is a blank line) +(The line above is a blank line) */ func isCommentOrBlankLine(line []byte) bool { s := bytes.TrimRight(bytes.TrimLeft(line, " "), "\n") diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/configmapSecretFlagsAndArgs.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/configmapSecretFlagsAndArgs.go new file mode 100644 index 000000000..0a4ef5a63 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/configmapSecretFlagsAndArgs.go @@ -0,0 +1,217 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package util + +import ( + "fmt" + "strings" + + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +const ( + FromFileFlag = "from-file" + FromLiteralFlag = "from-literal" + FromEnvFileFlag = "from-env-file" + DisableNameSuffixHashFlag = "disableNameSuffixHash" + BehaviorFlag = "behavior" + NamespaceFlag = "namespace" + NewNamespaceFlag = "new-namespace" + FlagFormat = "--%s=%s" +) + +// ConfigMapSecretFlagsAndArgs encapsulates the options for add secret/configmap commands. +type ConfigMapSecretFlagsAndArgs struct { + // Name of ConfigMap/Secret (required) + Name string + // FileSources to derive the ConfigMap/Secret from (optional) + FileSources []string + // LiteralSources to derive the ConfigMap/Secret from (optional) + LiteralSources []string + // EnvFileSource to derive the ConfigMap/Secret from (optional) + // TODO: Rationalize this name with Generic.EnvSource + EnvFileSource string + // Resource generation behavior (optional) + Behavior string + // Type of secret to create + Type string + // Namespace of ConfigMap/Secret (optional) -- if unspecified, default is assumed + Namespace string + // Disable name suffix + DisableNameSuffixHash bool + // NewNamespace for ConfigMap/Secret (optional) -- only for 'edit set' command + NewNamespace string +} + +// ValidateAdd validates required fields are set to support structured generation for the +// edit add command. +func (a *ConfigMapSecretFlagsAndArgs) ValidateAdd(args []string) error { + if len(args) != 1 { + return fmt.Errorf("name must be specified once") + } + a.Name = args[0] + + if len(a.EnvFileSource) == 0 && len(a.FileSources) == 0 && len(a.LiteralSources) == 0 { + return fmt.Errorf("at least from-env-file, or from-file or from-literal must be set") + } + if len(a.EnvFileSource) > 0 && (len(a.FileSources) > 0 || len(a.LiteralSources) > 0) { + return fmt.Errorf("from-env-file cannot be combined with from-file or from-literal") + } + if len(a.Behavior) > 0 && types.NewGenerationBehavior(a.Behavior) == types.BehaviorUnspecified { + return fmt.Errorf(`invalid behavior: must be one of "%s", "%s", or "%s"`, + types.BehaviorCreate, types.BehaviorMerge, types.BehaviorReplace) + } + // TODO: Should we check if the path exists? if it's valid, if it's within the same (sub-)directory? + return nil +} + +// ValidateSet validates required fields are set to support structured generation for the +// edit set command. +func (a *ConfigMapSecretFlagsAndArgs) ValidateSet(args []string) error { + if len(args) != 1 { + return fmt.Errorf("name must be specified once") + } + a.Name = args[0] + + if len(a.LiteralSources) == 0 && a.NewNamespace == "" { + return fmt.Errorf("at least one of [--from-literal, --new-namespace] must be specified") + } + + return nil +} + +// ExpandFileSource normalizes a string list, possibly +// containing globs, into a validated, globless list. +// For example, this list: +// - some/path +// - some/dir/a* +// - bfile=some/dir/b* +// becomes: +// - some/path +// - some/dir/airplane +// - some/dir/ant +// - some/dir/apple +// - bfile=some/dir/banana +// i.e. everything is converted to a key=value pair, +// where the value is always a relative file path, +// and the key, if missing, is the same as the value. +// In the case where the key is explicitly declared, +// the globbing, if present, must have exactly one match. +func (a *ConfigMapSecretFlagsAndArgs) ExpandFileSource(fSys filesys.FileSystem) error { + const numberComponentsWithKey = 2 + + var results []string + for _, pattern := range a.FileSources { + var patterns []string + key := "" + // check if the pattern is in `--from-file=[key=]source` format + // and if so split it to send only the file-pattern to glob function + s := strings.Split(pattern, "=") + if len(s) == numberComponentsWithKey { + patterns = append(patterns, s[1]) + key = s[0] + } else { + patterns = append(patterns, s[0]) + } + result, err := GlobPatterns(fSys, patterns) + if err != nil { + return err + } + // if the format is `--from-file=[key=]source` accept only one result + // and extend it with the `key=` prefix + if key != "" { + if len(result) != 1 { + return fmt.Errorf( + "'pattern '%s' catches files %v, should catch only one", pattern, result) + } + fileSource := fmt.Sprintf("%s=%s", key, result[0]) + results = append(results, fileSource) + } else { + results = append(results, result...) + } + } + a.FileSources = results + return nil +} + +// UpdateLiteralSources looks for literal sources that already exist and tries +// to replace their values with new values. +// The key specified must exist in the target resource (ConfigMap or Secret). +func UpdateLiteralSources( + args *types.GeneratorArgs, + flags ConfigMapSecretFlagsAndArgs, +) error { + sources := make(map[string]any) + + for _, val := range args.LiteralSources { + key, value, err := validateAndExtractLiteralSource(val) + if err != nil { + return fmt.Errorf("failed to update resource: %w", err) + } + sources[key] = value + } + + for _, val := range flags.LiteralSources { + key, value, err := validateAndExtractLiteralSource(val) + if err != nil { + return fmt.Errorf("failed to update resource: %w", err) + } + + if _, ok := sources[key]; !ok { + return fmt.Errorf("key '%s' not found in resource", key) + } + + sources[key] = value + } + + // re-assemble key-pairs + newLiteralSources := make([]string, 0) + for key, val := range sources { + newLiteralSources = append(newLiteralSources, fmt.Sprintf("%s=%s", key, val)) + } + + args.LiteralSources = newLiteralSources + + return nil +} + +func validateAndExtractLiteralSource(val string) (string, string, error) { + // This is the separator to be used as a boundary for the key/value pair + const keyValueSeparator = "=" + // Maximum number of times the separator can appear in the string + const maximumSeparatorNumber = 1 + + count := strings.Count(val, keyValueSeparator) + if count <= 0 || count > maximumSeparatorNumber { + return "", "", fmt.Errorf("invalid format: literal values must be specified in the key=value format") + } + + key, value, _ := strings.Cut(val, keyValueSeparator) // we don't need the value of found because of prior validation + + return key, value, nil +} + +func MergeFlagsIntoGeneratorArgs(args *types.GeneratorArgs, flags ConfigMapSecretFlagsAndArgs) { + if len(flags.LiteralSources) > 0 { + args.LiteralSources = append( + args.LiteralSources, flags.LiteralSources...) + } + if len(flags.FileSources) > 0 { + args.FileSources = append( + args.FileSources, flags.FileSources...) + } + if flags.EnvFileSource != "" { + args.EnvSources = append( + args.EnvSources, flags.EnvFileSource) + } + if flags.DisableNameSuffixHash { + args.Options = &types.GeneratorOptions{ + DisableNameSuffixHash: true, + } + } + if flags.Behavior != "" { + args.Behavior = flags.Behavior + } +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/util.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/util.go similarity index 55% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/util.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/util.go index c084909cd..2c9be9eab 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/util.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/util.go @@ -12,6 +12,9 @@ import ( "sigs.k8s.io/kustomize/kyaml/filesys" ) +// DefaultNamespace is the default namespace name in Kubernetes. +const DefaultNamespace = "default" + // GlobPatterns accepts a slice of glob strings and returns the set of // matching file paths. func GlobPatterns(fSys filesys.FileSystem, patterns []string) ([]string, error) { @@ -30,28 +33,40 @@ func GlobPatterns(fSys filesys.FileSystem, patterns []string) ([]string, error) return result, nil } -// GlobPatterns accepts a slice of glob strings and returns the set of -// matching file paths. If files are not found, will try load from remote. -func GlobPatternsWithLoader(fSys filesys.FileSystem, ldr ifc.Loader, patterns []string) ([]string, error) { +// GlobPatternsWithLoader accepts a slice of glob strings and returns the set of matching file paths. +// If validation is skipped, then it will return the patterns as provided. +// Otherwise, It will try to load the files from the filesystem. +// If files are not found in the filesystem, it will try to load from remote. +// It returns an error if validation is not skipped and there are no matching files or it can't load from remote. +func GlobPatternsWithLoader(fSys filesys.FileSystem, ldr ifc.Loader, patterns []string, skipValidation bool) ([]string, error) { var result []string for _, pattern := range patterns { + if skipValidation { + result = append(result, pattern) + continue + } + files, err := fSys.Glob(pattern) if err != nil { - return nil, err + return nil, fmt.Errorf("error checking the filesystem: %w", err) } - if len(files) == 0 { - loader, err := ldr.New(pattern) - if err != nil { - log.Printf("%s has no match", pattern) - } else { - result = append(result, pattern) - if loader != nil { - loader.Cleanup() - } - } + + if len(files) != 0 { + result = append(result, files...) continue } - result = append(result, files...) + + loader, err := ldr.New(pattern) + if err != nil { + return nil, fmt.Errorf("%s has no match: %w", pattern, err) + } + + result = append(result, pattern) + if loader != nil { + if err = loader.Cleanup(); err != nil { + return nil, fmt.Errorf("error cleaning up loader: %w", err) + } + } } return result, nil } @@ -97,3 +112,18 @@ func trimQuotes(s string) string { } return s } + +// NamespaceEqual checks if two namespaces are the same. It considers the empty namespace and the default namespace to +// be the same. As such, when one namespace is the empty string ('""') and the other namespace is "default", this function +// will return true. +func NamespaceEqual(namespace string, otherNamespace string) bool { + if "" == namespace { + namespace = DefaultNamespace + } + + if "" == otherNamespace { + otherNamespace = DefaultNamespace + } + + return namespace == otherNamespace +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/validate.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/validate.go similarity index 92% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/validate.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/validate.go index 2c4538167..bf041b50f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/internal/util/validate.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/internal/util/validate.go @@ -9,7 +9,7 @@ import ( "strings" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kustomize/v4/commands/internal/kustfile" + "sigs.k8s.io/kustomize/kustomize/v5/commands/internal/kustfile" ) type BuildMetadataValidator struct{} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/localize/localize.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/localize/localize.go new file mode 100644 index 000000000..d557ebceb --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/localize/localize.go @@ -0,0 +1,94 @@ +// Copyright 2022 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package localize + +import ( + "log" + + "github.com/spf13/cobra" + lclzr "sigs.k8s.io/kustomize/api/krusty/localizer" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +const numArgs = 2 + +type arguments struct { + target string + dest string +} + +type flags struct { + scope string +} + +// NewCmdLocalize returns a new localize command. +func NewCmdLocalize(fs filesys.FileSystem) *cobra.Command { + var f flags + cmd := &cobra.Command{ + Use: "localize [target [destination]]", + Short: "[Alpha] Creates localized copy of target kustomization root at destination", + Long: `[Alpha] Creates copy of target kustomization directory or +versioned URL at destination, where remote references in the original +are replaced by local references to the downloaded remote content. + +If target is not specified, the current working directory will be used. +Destination is a path to a new directory in an existing directory. If +destination is not specified, a new directory will be created in the current +working directory. + +For details, see: https://kubectl.docs.kubernetes.io/references/kustomize/cmd/ + +Disclaimer: +This command does not yet localize helm or KRM plugin fields. This command also +alphabetizes kustomization fields in the localized copy. +`, + Example: ` +# Localize the current working directory, with default scope and destination +kustomize localize + +# Localize some local directory, with scope and default destination +kustomize localize /home/path/scope/target --scope /home/path/scope + +# Localize remote at set destination relative to working directory +kustomize localize https://github.com/kubernetes-sigs/kustomize//api/krusty/testdata/localize/simple?ref=v4.5.7 path/non-existing-dir +`, + SilenceUsage: true, + Args: cobra.MaximumNArgs(numArgs), + RunE: func(cmd *cobra.Command, rawArgs []string) error { + args := matchArgs(rawArgs) + dst, err := lclzr.Run(fs, args.target, f.scope, args.dest) + if err != nil { + return errors.Wrap(err) + } + log.Printf("SUCCESS: localized %q to directory %s\n", args.target, dst) + return nil + }, + } + // no shorthand to avoid conflation with other flags + cmd.Flags().StringVar(&f.scope, + "scope", + "", + `Path to directory inside of which localize is limited to running. +Cannot specify for remote targets, as scope is by default the containing repo. +If not specified for local target, scope defaults to target. +`) + return cmd +} + +// matchArgs matches user-entered userArgs, which cannot exceed max length, with +// arguments. +func matchArgs(rawArgs []string) arguments { + var args arguments + switch len(rawArgs) { + case numArgs: + args.dest = rawArgs[1] + fallthrough + case 1: + args.target = rawArgs[0] + case 0: + args.target = filesys.SelfDir + } + return args +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch/fetch.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/fetch/fetch.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch/fetch.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/fetch/fetch.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info/info.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/info/info.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info/info.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/info/info.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/openapi.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/openapi.go similarity index 81% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/openapi.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/openapi.go index 4fdcad882..5c8209dd5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/openapi.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/openapi.go @@ -7,8 +7,8 @@ import ( "io" "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch" - "sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info" + "sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/fetch" + "sigs.k8s.io/kustomize/kustomize/v5/commands/openapi/info" ) // NewCmdOpenAPI makes a new openapi command. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/version/version.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/version/version.go new file mode 100644 index 000000000..61cd92169 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/version/version.go @@ -0,0 +1,86 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package version + +import ( + "encoding/json" + "fmt" + "io" + "os" + + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/api/provenance" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type Options struct { + Short bool + Output string + Writer io.Writer +} + +// NewCmdVersion makes a new version command. +func NewCmdVersion(w io.Writer) *cobra.Command { + o := NewOptions(w) + versionCmd := cobra.Command{ + Use: "version", + Short: "Prints the kustomize version", + Example: `kustomize version`, + RunE: func(cmd *cobra.Command, args []string) error { + if err := o.Validate(args); err != nil { + return err + } + if err := o.Run(); err != nil { + return err + } + return nil + }, + } + + versionCmd.Flags().BoolVar(&o.Short, "short", false, "short form") + _ = versionCmd.Flags().MarkDeprecated("short", "and will be removed in the future.") + versionCmd.Flags().StringVarP(&o.Output, "output", "o", o.Output, "One of 'yaml' or 'json'.") + return &versionCmd +} + +func NewOptions(w io.Writer) *Options { + if w == nil { + w = io.Writer(os.Stdout) + } + return &Options{Writer: w} +} + +func (o *Options) Validate(_ []string) error { + if o.Short { + if o.Output != "" { + return fmt.Errorf("--short and --output are mutually exclusive") + } + } + return nil +} + +func (o *Options) Run() error { + switch o.Output { + case "": + if o.Short { + fmt.Fprintln(o.Writer, provenance.GetProvenance().Short()) + } else { + fmt.Fprintln(o.Writer, provenance.GetProvenance().Semver()) + } + case "yaml": + marshalled, err := yaml.Marshal(provenance.GetProvenance()) + if err != nil { + return errors.WrapPrefixf(err, "marshalling provenance to yaml") + } + fmt.Fprintln(o.Writer, string(marshalled)) + case "json": + marshalled, err := json.MarshalIndent(provenance.GetProvenance(), "", " ") + if err != nil { + return errors.WrapPrefixf(err, "marshalling provenance to json") + } + fmt.Fprintln(o.Writer, string(marshalled)) + } + return nil +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/main.go b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/main.go similarity index 83% rename from tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/main.go rename to tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/main.go index 059fd2fbd..b10388573 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kustomize/v4/main.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kustomize/v5/main.go @@ -7,7 +7,7 @@ package main import ( "os" - "sigs.k8s.io/kustomize/kustomize/v4/commands" + "sigs.k8s.io/kustomize/kustomize/v5/commands" ) func main() { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go index f072c3c97..c292d7c68 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go @@ -31,6 +31,16 @@ func Errorf(msg string, args ...interface{}) error { return goerrors.Wrap(fmt.Errorf(msg, args...), 1) } +// As finds the targeted error in any wrapped error. +func As(err error, target interface{}) bool { + return goerrors.As(err, target) +} + +// Is detects whether the error is equal to a given error. +func Is(err error, target error) bool { + return goerrors.Is(err, target) +} + // GetStack returns a stack trace for the error if it has one func GetStack(err error) string { if e, ok := err.(*goerrors.Error); ok { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/confirmeddir.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/confirmeddir.go index 4b0008427..ea6eff90b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/confirmeddir.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/confirmeddir.go @@ -4,7 +4,7 @@ package filesys import ( - "io/ioutil" + "os" "path/filepath" "strings" ) @@ -17,12 +17,12 @@ type ConfirmedDir string // The directory is cleaned, no symlinks, etc. so it's // returned as a ConfirmedDir. func NewTmpConfirmedDir() (ConfirmedDir, error) { - n, err := ioutil.TempDir("", "kustomize-") + n, err := os.MkdirTemp("", "kustomize-") if err != nil { return "", err } - // In MacOs `ioutil.TempDir` creates a directory + // In MacOs `os.MkdirTemp` creates a directory // with root in the `/var` folder, which is in turn // a symlinked path to `/private/var`. // Function `filepath.EvalSymlinks`is used to diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/fsondisk.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/fsondisk.go index 4808f8d2e..10ce83f12 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/fsondisk.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/fsondisk.go @@ -5,7 +5,6 @@ package filesys import ( "fmt" - "io/ioutil" "log" "os" "path/filepath" @@ -125,12 +124,15 @@ func (fsOnDisk) ReadDir(name string) ([]string, error) { return result, nil } -// ReadFile delegates to ioutil.ReadFile. -func (fsOnDisk) ReadFile(name string) ([]byte, error) { return ioutil.ReadFile(name) } +// ReadFile delegates to os.ReadFile. +func (fsOnDisk) ReadFile(name string) ([]byte, error) { + content, err := os.ReadFile(name) + return content, errors.Wrap(err) +} -// WriteFile delegates to ioutil.WriteFile with read/write permissions. +// WriteFile delegates to os.WriteFile with read/write permissions. func (fsOnDisk) WriteFile(name string, c []byte) error { - return errors.Wrap(ioutil.WriteFile(name, c, 0666)) //nolint:gosec + return errors.Wrap(os.WriteFile(name, c, 0666)) //nolint:gosec } // Walk delegates to filepath.Walk. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/util.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/util.go index fdbe5e2c7..0713ffe2c 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/util.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/filesys/util.go @@ -74,30 +74,30 @@ func PathJoin(incoming []string) string { // // E.g. if part == 'PEACH' // -// OLD : NEW : POS -// -------------------------------------------------------- -// {empty} : PEACH : irrelevant -// / : /PEACH : irrelevant -// pie : PEACH/pie : 0 (or negative) -// /pie : /PEACH/pie : 0 (or negative) -// raw : raw/PEACH : 1 (or larger) -// /raw : /raw/PEACH : 1 (or larger) -// a/nice/warm/pie : a/nice/warm/PEACH/pie : 3 -// /a/nice/warm/pie : /a/nice/warm/PEACH/pie : 3 +// OLD : NEW : POS +// -------------------------------------------------------- +// {empty} : PEACH : irrelevant +// / : /PEACH : irrelevant +// pie : PEACH/pie : 0 (or negative) +// /pie : /PEACH/pie : 0 (or negative) +// raw : raw/PEACH : 1 (or larger) +// /raw : /raw/PEACH : 1 (or larger) +// a/nice/warm/pie : a/nice/warm/PEACH/pie : 3 +// /a/nice/warm/pie : /a/nice/warm/PEACH/pie : 3 // // * An empty part results in no change. // -// * Absolute paths get their leading '/' stripped, treated like -// relative paths, and the leading '/' is re-added on output. -// The meaning of pos is intentionally the same in either absolute or -// relative paths; if it weren't, this function could convert absolute -// paths to relative paths, which is not desirable. +// - Absolute paths get their leading '/' stripped, treated like +// relative paths, and the leading '/' is re-added on output. +// The meaning of pos is intentionally the same in either absolute or +// relative paths; if it weren't, this function could convert absolute +// paths to relative paths, which is not desirable. // -// * For robustness (liberal input, conservative output) Pos values that -// that are too small (large) to index the split filepath result in a -// prefix (postfix) rather than an error. Use extreme position values -// to assure a prefix or postfix (e.g. 0 will always prefix, and -// 9999 will presumably always postfix). +// - For robustness (liberal input, conservative output) Pos values +// that are too small (large) to index the split filepath result in a +// prefix (postfix) rather than an error. Use extreme position values +// to assure a prefix or postfix (e.g. 0 will always prefix, and +// 9999 will presumably always postfix). func InsertPathPart(path string, pos int, part string) string { if part == "" { return path @@ -121,7 +121,7 @@ func InsertPathPart(path string, pos int, part string) string { result := make([]string, len(parts)+1) copy(result, parts[0:pos]) result[pos] = part - return PathJoin(append(result, parts[pos:]...)) // nolint: makezero + return PathJoin(append(result, parts[pos:]...)) //nolint: makezero } func IsHiddenFilePath(pattern string) bool { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go index e9546820f..8bb3fe12e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go @@ -34,7 +34,7 @@ func (c *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { } func (c *Filter) Run(reader io.Reader, writer io.Writer) error { - cmd := exec.Command(c.Path, c.Args...) // nolint:gosec + cmd := exec.Command(c.Path, c.Args...) //nolint:gosec cmd.Stdin = reader cmd.Stdout = writer cmd.Stderr = os.Stderr diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go index 39cb24195..f0448ea28 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go @@ -10,6 +10,7 @@ import ( "strings" "sigs.k8s.io/kustomize/kyaml/yaml" + k8syaml "sigs.k8s.io/yaml" ) const ( @@ -200,50 +201,57 @@ func (s *StorageMount) String() string { // // The FunctionSpec is read from the resource metadata.annotation // "config.kubernetes.io/function" -func GetFunctionSpec(n *yaml.RNode) *FunctionSpec { +func GetFunctionSpec(n *yaml.RNode) (*FunctionSpec, error) { meta, err := n.GetMeta() if err != nil { - return nil + return nil, fmt.Errorf("failed to get ResourceMeta: %w", err) } - if fn := getFunctionSpecFromAnnotation(n, meta); fn != nil { - return fn + + fn, err := getFunctionSpecFromAnnotation(n, meta) + if err != nil { + return nil, err + } + if fn != nil { + return fn, nil } // legacy function specification for backwards compatibility container := meta.Annotations["config.kubernetes.io/container"] if container != "" { - return &FunctionSpec{Container: ContainerSpec{Image: container}} + return &FunctionSpec{Container: ContainerSpec{Image: container}}, nil } - return nil + return nil, nil } // getFunctionSpecFromAnnotation parses the config function from an annotation // if it is found -func getFunctionSpecFromAnnotation(n *yaml.RNode, meta yaml.ResourceMeta) *FunctionSpec { +func getFunctionSpecFromAnnotation(n *yaml.RNode, meta yaml.ResourceMeta) (*FunctionSpec, error) { var fs FunctionSpec for _, s := range functionAnnotationKeys { fn := meta.Annotations[s] if fn != "" { - err := yaml.Unmarshal([]byte(fn), &fs) - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) + if err := k8syaml.UnmarshalStrict([]byte(fn), &fs); err != nil { + return nil, fmt.Errorf("%s unmarshal error: %w", s, err) } - return &fs + return &fs, nil } } n, err := n.Pipe(yaml.Lookup("metadata", "configFn")) - if err != nil || yaml.IsMissingOrNull(n) { - return nil + if err != nil { + return nil, fmt.Errorf("failed to look up metadata.configFn: %w", err) + } + if yaml.IsMissingOrNull(n) { + return nil, nil } s, err := n.String() if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) + fmt.Fprintf(os.Stderr, "configFn parse error: %v\n", err) + return nil, fmt.Errorf("configFn parse error: %w", err) } - err = yaml.Unmarshal([]byte(s), &fs) - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) + if err := k8syaml.UnmarshalStrict([]byte(s), &fs); err != nil { + return nil, fmt.Errorf("%s unmarshal error: %w", "configFn", err) } - return &fs + return &fs, nil } func StringToStorageMount(s string) StorageMount { @@ -288,7 +296,11 @@ type IsReconcilerFilter struct { func (c *IsReconcilerFilter) Filter(inputs []*yaml.RNode) ([]*yaml.RNode, error) { var out []*yaml.RNode for i := range inputs { - isFnResource := GetFunctionSpec(inputs[i]) != nil + functionSpec, err := GetFunctionSpec(inputs[i]) + if err != nil { + return nil, err + } + isFnResource := functionSpec != nil if isFnResource && !c.ExcludeReconcilers { out = append(out, inputs[i]) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go index ae6fd93ba..6a06b81c3 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go @@ -7,7 +7,7 @@ import ( "bytes" "fmt" "io" - "io/ioutil" + "os" "path" "strings" @@ -268,7 +268,7 @@ func (c *FunctionFilter) doResults(r *kio.ByteReader) error { if err != nil { return err } - err = ioutil.WriteFile(c.ResultsFile, []byte(results), 0600) + err = os.WriteFile(c.ResultsFile, []byte(results), 0600) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go index 9d7450a48..aeeeb81ed 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go @@ -7,8 +7,8 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "net/http" + "os" "go.starlark.net/starlark" "sigs.k8s.io/kustomize/kyaml/errors" @@ -57,7 +57,7 @@ func (sf *Filter) setup() error { // read the program from a file if sf.Path != "" { - b, err := ioutil.ReadFile(sf.Path) + b, err := os.ReadFile(sf.Path) if err != nil { return err } @@ -72,7 +72,7 @@ func (sf *Filter) setup() error { return err } defer resp.Body.Close() - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go index 96b4a9aea..6bc4fba0f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go @@ -25,9 +25,9 @@ package util import ( "fmt" - "github.com/pkg/errors" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" + "sigs.k8s.io/kustomize/kyaml/errors" ) // // asString unquotes a starlark string value @@ -44,6 +44,7 @@ func IsEmptyString(s starlark.String) bool { } // Unmarshal decodes a starlark.Value into it's golang counterpart +// //nolint:nakedret func Unmarshal(x starlark.Value) (val interface{}, err error) { switch v := x.(type) { @@ -161,7 +162,7 @@ func Unmarshal(x starlark.Value) (val interface{}, err error) { if _var, ok := v.Constructor().(Unmarshaler); ok { err = _var.UnmarshalStarlark(x) if err != nil { - err = errors.Wrapf(err, "failed marshal %q to Starlark object", v.Constructor().Type()) + err = errors.WrapPrefixf(err, "failed marshal %q to Starlark object", v.Constructor().Type()) return } val = _var @@ -176,6 +177,7 @@ func Unmarshal(x starlark.Value) (val interface{}, err error) { } // Marshal turns go values into starlark types +// //nolint:nakedret func Marshal(data interface{}) (v starlark.Value, err error) { switch x := data.(type) { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go index 7785c9d44..ec4cafe30 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go @@ -45,7 +45,7 @@ type ByteWriter struct { // WrappingAPIVersion is the apiVersion for WrappingKind WrappingAPIVersion string - // Sort if set, will cause ByteWriter to sort the the nodes before writing them. + // Sort if set, will cause ByteWriter to sort the nodes before writing them. Sort bool } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/doc.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/doc.go deleted file mode 100644 index 1c87e0b06..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// Package krmfile provides functionality for working with Krmfiles. -// -// Example Krmfile -// -// apiVersion: config.k8s.io/v1alpha1 -// kind: Krmfile -// openAPI: -// definitions: -// io.k8s.cli.setters.replicas: -// x-k8s-cli: -// setter: -// name: replicas -// value: "3" -// setBy: me -// description: "hello world" -package krmfile diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/krmfile.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/krmfile.go deleted file mode 100644 index dbf5a9999..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/krmfile/krmfile.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package krmfile - -// KRMFileName is the file where Krm metadata is stored -const ( - // KrmfileName is the name of the file that KRM metadata is written to - KrmfileName = "Krmfile" -) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile index 8de66aa29..c616a6c6d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile @@ -5,8 +5,8 @@ MYGOBIN = $(shell go env GOBIN) ifeq ($(MYGOBIN),) MYGOBIN = $(shell go env GOPATH)/bin endif -API_VERSION := "v1.21.2" KIND_VERSION := "v0.11.1" +API_VERSION ?= "v1.21.2" .PHONY: all all: \ @@ -28,7 +28,7 @@ nuke: clean rm -r kubernetesapi/* $(MYGOBIN)/go-bindata: - go install github.com/go-bindata/go-bindata/v3/go-bindata + go install github.com/go-bindata/go-bindata/v3/go-bindata@latest $(MYGOBIN)/kind: ( \ @@ -40,22 +40,22 @@ $(MYGOBIN)/kind: rm -rf $$d; \ ) +.PHONY: kubernetesapi/openapiinfo.go +kubernetesapi/openapiinfo.go: + ./scripts/makeOpenApiInfoDotGo.sh + kustomizationapi/swagger.go: $(MYGOBIN)/go-bindata kustomizationapi/swagger.json $(MYGOBIN)/go-bindata \ --pkg kustomizationapi \ -o kustomizationapi/swagger.go \ kustomizationapi/swagger.json -.PHONY: kubernetesapi/openapiinfo.go -kubernetesapi/openapiinfo.go: - ./scripts/makeOpenApiInfoDotGo.sh - -.PHONY: kubernetesapi/swagger.json -kubernetesapi/swagger.json: $(MYGOBIN)/kind $(MYGOBIN)/kustomize +.PHONY: kubernetesapi/swagger.pb +kubernetesapi/swagger.pb: $(MYGOBIN)/kind $(MYGOBIN)/kustomize ./scripts/fetchSchemaFromCluster.sh $(API_VERSION) .PHONY: kubernetesapi/swagger.go -kubernetesapi/swagger.go: $(MYGOBIN)/go-bindata kubernetesapi/swagger.json +kubernetesapi/swagger.go: $(MYGOBIN)/go-bindata kubernetesapi/swagger.pb ./scripts/generateSwaggerDotGo.sh $(API_VERSION) $(MYGOBIN)/kustomize: diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md index fbe8103c3..3bffb952c 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md @@ -22,22 +22,31 @@ make nuke The compiled-in schema version should maximize API availability with respect to all actively supported Kubernetes versions. For example, while 1.20, 1.21 and 1.22 are the actively supported versions, 1.21 is the best choice. This is because 1.21 introduces at least one new API and does not remove any, while 1.22 removes a large set of long-deprecated APIs that are still supported in 1.20/1.21. -### Update the built-in schema to a new version +### Generating additional schema -In the Makefile in this directory, update the `API_VERSION` to your desired version. +If you'd like to change the default schema version, then in the Makefile in this directory, update the `API_VERSION` to your desired version. You may need to update the version of Kind these scripts use by changing `KIND_VERSION` in the Makefile in this directory. You can find compatibility information in the [kind release notes](https://github.com/kubernetes-sigs/kind/releases). -In this directory, fetch the openapi schema and generate the -corresponding swagger.go for the kubernetes api: +In this directory, fetch the openapi schema, generate the +corresponding swagger.go for the kubernetes api, and update `kubernetesapi/openapiinfo.go`: ``` make all ``` -The above command will update the [OpenAPI schema] and the [Kustomization schema]. It will -create a directory kubernetesapi/v1212 and store the resulting -swagger.json and swagger.go files there. +If you want to run the steps individually instead of using `make all`, you can run +the following commands: + +``` +make kustomizationapi/swagger.go +make kubernetesapi/swagger.go +make kubernetesapi/openapiinfo.go +``` + +You can optionally delete the old `swagger.pb` and `swagger.go` files if we no longer need to support that kubernetes version of +openapi data. Make sure you rerun `make kubernetesapi/openapiinfo.go` after deleting any old schemas. + #### Precomputations @@ -55,25 +64,6 @@ make prow-presubmit-check >& /tmp/k.txt; echo $? The exit code should be zero; if not, examine `/tmp/k.txt`. -## Generating additional schemas - -Instead of replacing the default version, you can specify a desired version as part of the make invocation: - -``` -rm kubernetesapi/swagger.go -make kubernetesapi/swagger.go API_VERSION=v1.21.2 -``` - -While the above commands generate the swagger.go files, they -do not make them available for use nor do they update the -info field reported by `kustomize openapi info`. To make the -newly fetched schema and swagger.go available: - -``` -rm kubernetesapi/openapiinfo.go -make kubernetesapi/openapiinfo.go -``` - ## Partial regeneration You can also regenerate the kubernetes api schemas specifically with: @@ -87,8 +77,8 @@ To fetch the schema without generating the swagger.go, you can run: ``` -rm kubernetesapi/swagger.json -make kubernetesapi/swagger.json +rm kubernetesapi/swagger.pb +make kubernetesapi/swagger.pb ``` Note that generating the swagger.go will re-fetch the schema. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go index c4e1c287a..e8b3d8360 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go @@ -6,13 +6,13 @@ package kubernetesapi import ( - "sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212" + "sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2" ) const Info = "{title:Kubernetes,version:v1.21.2}" var OpenAPIMustAsset = map[string]func(string) []byte{ - "v1212": v1212.MustAsset, + "v1.21.2": v1_21_2.MustAsset, } -const DefaultOpenAPI = "v1212" +const DefaultOpenAPI = "v1.21.2" diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.go deleted file mode 100644 index 681dc97fa..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.go +++ /dev/null @@ -1,249 +0,0 @@ -// Code generated by go-bindata. (@generated) DO NOT EDIT. - - //Package v1212 generated by go-bindata.// sources: -// kubernetesapi/v1212/swagger.pb -package v1212 - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -// Name return file name -func (fi bindataFileInfo) Name() string { - return fi.name -} - -// Size return file size -func (fi bindataFileInfo) Size() int64 { - return fi.size -} - -// Mode return file mode -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} - -// ModTime return file modify time -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} - -// IsDir return file whether a directory -func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 -} - -// Sys return file is sys mode -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _kubernetesapiV1212SwaggerPb = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x7c\x24\xd7\x59\xe0\x8d\x7f\x5a\xd2\x78\x66\x9e\x4c\x12\xfb\xd8\x8e\xe3\xf6\xad\xdc\x63\x8f\xa4\x1e\xa9\x35\xad\xb9\x6b\xae\x6a\x69\x66\xac\x1e\x79\x46\x1e\xd9\xb2\x63\xc6\x1e\x97\xba\x8e\x5a\x35\xd3\xaa\xea\x54\x55\x6b\xac\x2c\xfe\xed\x8f\x84\x6c\x92\x4f\x96\xdd\x2c\x97\x6c\x16\xf6\x0d\x10\x76\xb3\xc9\x12\x12\xc2\x2d\x2c\x81\x6c\x16\xde\x80\x21\x60\x08\x09\x6f\x58\xb2\x04\x02\x01\xc2\x35\x01\xc2\x06\x78\x61\xf3\x7e\xce\xa5\x2e\xdd\x5d\xd5\xd5\x6a\x75\xb7\x5a\xa3\xe7\x9f\xb1\xdc\x55\x75\xea\xd4\xb9\x3c\xe7\x39\xdf\xe7\x39\xcf\x03\xfd\xe3\x99\x03\xe4\x6e\x80\x8b\x95\x45\x6a\x19\xd4\xa1\x36\xd9\xb9\x9a\xcd\x8c\x67\x33\xe3\xb9\xdf\xfd\xca\xfb\x12\xe4\x5d\x69\x78\x62\x4c\x2d\xeb\xf6\x98\xa6\xdb\x05\x73\x95\x5a\x6b\x99\x1b\xc7\xec\x8c\x6e\x8e\xad\x66\x17\xa9\xa3\x66\xc7\x6e\xaa\x4e\x61\x79\xcc\x50\x57\xa8\x5d\x56\x0b\xd4\x1e\xfb\x17\xde\xdf\x2f\x8d\x51\x43\x2b\x9b\xba\xe1\xd8\x25\xdd\xbb\xf4\x12\xf9\x99\x61\xf2\xae\x1d\x70\x87\x57\xe4\x35\x59\x56\xf2\x27\x12\xbc\x34\xa5\xb0\xac\x1a\x45\x6a\x2b\x8e\xa9\xa8\x86\x62\x2e\x5e\xa7\x05\x47\x31\x97\x94\x1b\xba\xa1\x29\xe7\x64\x99\xf3\xac\xcc\x8c\xa2\xd1\xb2\x45\x0b\xaa\x43\xb5\x09\xa5\x62\x53\xc5\x59\xa6\xca\x20\x2f\x66\x50\x29\xab\x96\xba\x42\x1d\x6a\x29\x37\x75\x67\x59\x51\x95\x92\x6e\x3b\x8a\x59\xa6\x96\xea\xe8\xa6\xa1\xe8\x86\xed\x50\x55\x1b\x51\x96\xf4\x92\x43\x2d\xaa\xf1\x37\x2a\xb6\x6e\x14\x4b\x54\xd1\x1d\xba\x22\x1e\xe4\x65\x2e\xe9\xb4\xa4\xcd\xd3\x12\x2d\x38\xa6\x15\x28\x3b\x93\x1e\xe1\xaf\x9b\x76\x3f\x67\x41\x7c\xcd\x25\xb7\x19\xb4\xaa\x1a\x8f\xdf\xae\x96\xcb\x25\xbd\xc0\x6b\x30\x76\xdd\x36\x8d\xea\x5f\xd6\xd4\x95\xd2\xf8\xde\xe0\x2f\xab\x86\x96\xb9\xe1\xf5\x50\xa6\x6c\x99\x8e\xb9\x58\x59\x1a\x7f\xa0\xb6\xa0\x13\xb6\x63\x51\x75\xe5\x14\xaf\xce\xf8\x81\x26\xca\xa8\x7a\x62\xa2\x3f\x3d\x96\xce\xdf\x80\x39\xe8\x1f\x3f\x70\x80\xcc\xc0\x05\xe8\xbb\x7c\x91\x4c\xc2\x19\x38\xb5\x77\x4c\xa3\x4b\xba\xa1\xb3\xc2\xec\x31\xdd\xe4\xa3\x40\x2d\xeb\x2b\x6a\x61\x59\x37\xd8\xb0\x28\xdf\x28\xb2\x1f\xec\xcc\x0a\x75\xd4\xcc\x6a\x36\xf3\x34\x2b\xf3\xdc\x2a\x35\x1c\xb8\x07\xfa\x0f\x1d\xc8\x92\xdb\xe1\x35\xb0\xe7\x29\x43\xad\x38\xcb\xa6\xa5\xbf\x89\x6a\x57\x76\x2c\x3b\x4e\xd9\xbe\xfe\x10\xdc\xf9\xe2\xa8\x5f\xbd\x51\xb5\xc0\xde\x43\x76\x91\xdb\x78\xc5\xe0\xfa\x22\x3c\x54\x75\x43\xd1\x32\x2b\xe5\xd1\x55\x6a\xd9\xba\x69\x8c\xb2\x61\x41\xce\x90\x53\xfc\xd7\x09\xa5\x76\xa8\x02\xbb\x3e\x51\x3d\x6e\x40\x3e\x3b\xa1\xc8\xb1\x07\xf9\x37\x0f\xc0\x37\xfb\xc9\x3f\xf5\x27\xff\xa1\x9f\xec\x78\x63\x85\x5a\x6b\xc9\x57\xfa\xd5\x52\xc9\xbc\xc9\xbf\x24\x67\x9a\x37\x56\x54\xeb\x86\xad\x58\xf4\x8d\x15\x6a\x3b\xb6\x22\x06\x2b\x65\x9f\x68\xcb\x81\xb2\x56\xa6\x4a\x2a\x77\xf9\xf2\xc5\xc7\x27\xaf\x5c\x4c\x65\x94\x79\x6a\xb1\x37\x29\xce\xb2\xea\x28\x9a\xa9\x18\xa6\xa3\xe8\x2b\xe5\x12\x5d\xa1\x86\xa3\x2c\x7a\x65\xae\xa8\x6b\x8a\x5e\x34\x4c\x8b\x0d\x60\xdd\x56\x96\x4a\x6a\x51\x51\x0d\x2d\x70\x8b\x6a\x51\xc5\x66\x4f\xa9\x0e\x1f\x90\x36\x2f\x7a\xd0\xe6\xdf\x6b\x51\xd6\x62\x19\x65\xaa\xa4\xf3\xda\xd8\xcb\x66\xa5\xa4\xf1\xd7\xa9\xb6\x5d\x59\xa1\x35\x05\x59\xd4\xa9\x58\x06\xd5\x58\x61\xaa\xb1\xa6\xd8\x65\x5a\xd0\x97\xf4\x82\xa2\x1b\x0e\xb5\x56\xd5\xd2\x88\x62\x98\x16\xaf\x96\xb3\x4c\xd7\xdc\x42\xfc\xf7\x2a\x37\xf5\x52\x89\xd5\x47\xe3\xcf\xbb\x9f\x2c\x5a\x43\xd1\x2a\x96\x6e\x14\xd9\x54\xa2\xb6\xcd\x2b\x36\xb3\x24\x3e\x4c\xb7\x45\xa5\x44\xe3\x8d\xc8\xaf\x65\x53\x8b\x5d\x12\x4d\xa0\xc9\xdb\xa9\xb2\x44\x55\xa7\x62\x51\xa5\xa8\x3a\x54\xa9\xe9\x06\x59\x12\x35\xd4\xc5\x12\xd5\x14\xdd\x50\xd8\xf0\xe3\x95\x8b\x2a\x36\x75\x67\x48\x7f\x8e\xef\x5c\x34\xcd\x12\x55\x8d\x1f\x48\x24\xf2\x5f\xdd\x0d\x7f\xb1\x9b\xfc\xe9\xee\xe4\x1f\xef\x76\x07\xc1\x2f\xed\x7e\x72\x99\x2a\x05\xd3\x70\x74\xa3\x42\x15\xb3\xcc\x45\x87\x6c\xe0\x45\xd6\x1e\x8e\x72\x73\x99\x1a\xac\x4d\x2d\x9d\xae\xb2\x0f\x5f\x31\x79\x1b\xdb\x95\x92\x63\x2b\x4b\x96\xb9\x12\x68\xb9\x8c\x32\xaf\x1b\x05\xd9\xcf\xab\x6a\xa9\x42\x59\x15\x65\xab\xf2\x59\x46\xb5\x11\xa5\x20\x3b\x92\xf5\x80\x69\x94\xd6\x3c\xd9\xe6\x55\x44\x3c\xca\x0b\x57\x95\xb2\x45\x57\x75\xb3\x62\x2b\xbc\xce\xf2\xd5\x62\x4c\xea\x1a\x35\x1c\xbd\xa0\x96\xe4\x35\x4f\x70\xd9\xca\x10\x7d\xb1\x40\xcb\x8e\xb2\x64\x5a\xbc\x6c\x51\xa4\xb9\xe4\xbd\x64\x98\x8f\xc1\x40\xaf\xb3\xea\x58\x94\xcb\x63\xb5\xb6\x2a\x3a\x1b\xe1\x54\xf4\x8a\x45\x0b\x66\xd1\xd0\xdf\x44\xbd\xae\x94\x23\x8c\x6a\x75\x8f\xb1\x27\x94\x92\x69\x14\xa9\xc5\x7e\xd2\x35\xd6\x9c\xce\x32\x6b\x8d\x0a\x65\x12\x99\xbe\x58\xd6\xa5\xc4\x1e\x2a\x52\x83\x5a\x6a\xa9\xb4\xa6\x2c\xe9\xab\xfc\xea\x92\xbe\xe4\x50\x6a\x28\x2b\xba\x51\x71\xa8\x3d\xac\x98\x96\xa8\xdb\x92\x5e\xac\xc8\xc7\xc4\x82\xa2\x98\x46\xe0\x5b\x46\xea\x46\xb3\x45\xed\xb2\x69\x68\xee\x62\x71\x28\x7b\x40\xb9\x42\x6d\xb3\x62\x15\xe8\x39\x56\x05\xaa\x29\xd4\xb2\x58\x5b\x99\x45\x51\x41\x79\xa7\xf7\x45\x8e\x79\x83\x1a\xde\x27\x8b\x3e\x54\x0c\x4a\x35\x5b\xdc\x65\xeb\xb6\xc3\x7e\x62\xeb\xd0\x08\x6b\xb0\x95\x8a\xcd\x1a\xcb\x76\x54\x8b\xcf\x6a\xdd\x12\x6b\x14\x2b\xd8\xac\x38\xd5\x3d\xce\xc7\x73\x46\xb9\xcc\x5e\x7d\x53\xb7\xe9\x48\xf0\x2d\xac\x67\xe4\x74\x34\x79\xdd\x78\x39\x52\x56\xf9\xcb\x18\xaf\x21\xeb\x1e\xaa\xaf\x52\xcd\xff\x9d\x7d\x2c\xff\xb8\xd8\x66\xe1\xe5\xf2\x0a\xb3\x91\xee\x0d\x6e\x83\xbe\xe8\x28\x37\xe8\xda\x88\xb2\x58\x71\xfc\x9f\x4b\xaa\xc3\xde\x6f\x1b\x6a\xd9\x5e\x36\x9d\x11\xe5\xe6\xb2\x5e\x58\xe6\x93\xd2\x08\x34\x88\x77\xbf\x37\x90\x65\xf5\xc5\x14\x1a\x95\x4a\x80\x14\xa4\x4c\x82\x15\x2c\xca\x16\xfd\x11\x65\xc5\xd4\xf8\xb8\x1a\x61\x1d\xaf\xd1\x12\x75\x98\x58\x5b\x62\xab\x3e\x17\x21\xba\x65\x3b\xb5\x8d\x51\x2a\xb1\x99\xab\x1b\x85\x52\x45\x13\xb2\x83\xdd\x2a\x3e\x94\xb5\xab\x6a\xf3\x01\xc9\xfe\x2b\x3a\xe5\x06\x5d\x13\x82\xd3\x2f\x38\xe5\x7e\x71\x2a\x03\xf0\x64\x95\xbc\x61\x33\xc0\xae\x94\xcb\xa6\xc5\xea\xc2\x85\x83\x58\x2b\x74\x5b\x71\xac\x0a\xf5\xe5\x34\xef\x35\xde\xf9\x52\x22\x06\x5b\x4e\x34\x00\x1f\x7f\x0b\x62\xb9\x92\x53\xc6\x93\xde\x8b\x6b\xc1\xde\x62\x73\x95\xbd\x7a\x45\xb7\x6d\x2e\x95\x45\xd3\x08\x15\xc0\xce\xa4\x76\xb9\x23\x69\xfc\x36\xdb\x61\x02\x9a\x49\xbc\xb7\x25\xe0\xdb\x13\xe4\xdb\x12\xc9\x7f\xe9\x0a\xbc\xab\x93\x8a\x2d\xd5\x1c\x36\xbf\xd8\xe8\xb4\xf4\x82\x18\x8b\x42\x81\x5a\xf2\x6b\xe0\xf6\x8b\xa8\x89\x6e\x89\x46\xb0\x33\xca\x34\x5d\x52\x79\xdf\xb1\x09\xcc\x56\x63\x67\x59\x37\x8a\x99\xd4\xab\xab\xf4\xa8\x4e\xd6\xa4\xa4\x2e\xd2\x52\xa3\x9a\xf0\x1b\xc2\x6a\xf2\x8f\x00\xdf\x00\xf2\x75\x48\xfe\x35\xb8\x55\xf9\x1c\x94\xf4\x15\xdd\x61\x3d\xa8\x2a\x2b\xea\x8b\xfa\x4a\x65\x45\x31\x2a\x2b\x8b\xd4\x12\xb5\x10\x43\xc7\x16\xf5\x64\x55\xe2\x52\x55\x4e\x97\x82\x5a\x2a\x71\xb1\xc0\x17\x06\xa6\x58\xda\x0a\x7d\x91\x0b\x81\xfa\x25\x55\x7c\xdf\x0b\x6e\x67\xbd\x20\xc7\x95\x14\x5e\xbc\x3c\xa6\x63\x69\xaa\xa3\x0a\x7d\x55\x0c\x0a\x3e\x33\x0a\xaa\xc1\x46\x76\xc5\x0e\xce\x6d\x5b\x5d\x61\x83\x5d\x77\x74\x6f\x11\x10\xb5\x64\xcb\x15\xf5\x67\x2f\x7b\xb5\xf8\x16\xd6\x5c\x4c\x79\x71\x1c\xb1\x8c\x8b\x6f\x17\xc2\x5f\x7c\x1b\xbd\xc9\xa7\x81\xea\xce\x1c\x3e\xb3\xd8\xc4\x5b\x31\x2b\x06\x2f\x46\x7c\xe5\x50\xa5\xcc\x5e\xf6\x26\x6a\x99\xe2\x97\x61\x77\xb6\x09\x4d\x41\xe5\x02\xc6\x7d\xda\xed\x43\x36\xd3\x3c\x9d\x9c\xc9\x41\x36\xb4\x0b\xd5\xba\x4d\xd5\xaa\x58\xb6\xa8\x4d\xd9\xaa\x6a\x2e\x85\xc8\x4c\x56\x03\x8d\x2d\x79\x2b\xba\x41\xbd\xd5\xa5\x6a\x91\xe6\x73\x7b\x55\xd5\x4b\x4c\x9b\xf0\xf5\x36\xf6\xc9\x85\x65\xd3\xb4\x29\x9f\x59\x8e\xe9\xce\x6b\xd9\x17\xac\x59\x54\xab\x58\xe1\xea\x9c\xca\x85\x24\xff\x20\xde\x48\xec\xdb\x64\x7d\xbc\xa2\xfd\xd6\x9d\x59\x52\xbc\x21\xe5\x2f\x8e\xee\x7a\x5b\xf3\x01\xba\xad\xd0\x95\xb2\xb3\x56\xad\x18\x78\x5a\x99\xea\xb0\x35\xb4\xd1\x07\x35\x12\x50\xfa\x52\x8d\x78\x62\xf2\xcc\x1b\x95\xc5\x8a\x6a\xa9\x86\x43\xa9\x14\xbe\xac\x76\x6e\x3f\x79\x93\x8f\xcb\xb8\x0a\xdb\x38\xf9\x35\xf7\xc4\xac\xa7\x80\x38\xa6\xa2\xdb\x76\x45\xaa\x86\x62\x97\xe5\xcd\x0f\x6f\xcd\x73\x87\xdb\xa8\x78\x9f\x6e\x33\x5d\xd4\x7b\xe5\xfa\xe4\xbe\x2b\xf2\xb9\xe6\x69\x57\xa8\x16\x2a\xfc\xb9\x06\x5c\x59\xb4\xd9\xcd\x86\xe3\x7d\x81\xe6\xa9\xfa\xb2\xfd\x58\x4f\x99\x2b\xd4\xd1\x57\x28\xfb\xf6\x25\x6a\xb9\x7b\xc6\x9a\xf5\xdd\x5f\xee\x58\x7f\x52\xc3\xae\x58\x6e\xf3\xa9\xee\x82\x2d\x3f\x4e\xb6\x9a\xf8\x64\x3e\x2d\xf9\xd2\xac\xd8\x2b\x6a\xa9\x44\x2d\xa5\xb0\x5c\x31\x6e\xd8\x6c\x1c\xa9\x0a\x13\x5e\x4a\x49\xb5\x8a\x6e\x37\xf3\xf9\x2e\x8a\x17\x7a\xba\x4d\x29\x1f\x76\x65\xd3\xb6\x75\x36\xdc\x64\xb3\xf1\xe1\x16\x9c\x5d\x95\xb2\xc6\x9a\xd1\xd7\xd4\xf9\x7b\xa8\x26\xfa\x83\x2b\x83\x72\xc9\x91\x23\x58\xee\xc2\x79\xad\x6f\xaa\xb6\x9c\x71\xde\x6e\x84\xb5\x49\xfd\x7a\x2b\xb4\x50\xd5\x66\x1d\x5c\xa8\x94\xf8\x1b\x75\x7f\xd8\x64\x52\x3b\xf8\x77\x8f\xef\x64\xdb\x8e\x22\xb5\x98\xf0\x9d\x80\x63\xe4\x48\xea\xd0\xae\x04\x19\x28\xab\xce\x72\xf2\x5e\x83\x89\x2f\x59\x8b\xaa\x4d\x5c\x6a\x80\x5d\x4a\x4b\xc1\xfd\x9e\x44\x22\xff\x02\x3c\x4f\xae\xa6\x9e\xf5\x9e\x9d\x90\xb5\xe6\x45\xb0\xae\x60\x7b\x4f\xc5\x2e\x98\x65\x3a\xa2\xd8\x95\xc2\x32\xeb\x39\xae\xfd\x52\x75\xc5\xe6\x77\x94\x2d\x93\xb7\x52\x6a\xb7\xc7\x31\x82\x6f\xb8\x0c\x8f\x93\x8b\xc9\x19\x77\x59\x18\x9d\x59\x52\x06\xd9\x9c\x19\xe4\x92\x5c\x48\x36\xb3\xe2\x94\x2b\xbc\x6f\xcb\x16\x75\x9c\x35\xa5\x6c\xb1\xef\xd3\x32\xa9\xdb\xc4\x0f\xc1\xb5\xe6\xff\x4d\xc0\xdf\x27\xc8\xdf\x25\x92\x7f\x93\x70\x0b\xfd\xd5\x44\xed\xb2\x6f\x53\xc7\x1d\x61\x8e\xa5\xea\x4c\xc0\x1a\xca\x4d\xd6\x15\xee\x9d\x6e\x77\xb1\xdb\xdc\x41\xcf\x44\xc4\xa2\x9c\xc7\x1a\x57\x2c\x98\x60\xa3\x0a\xdf\x74\x4f\x8c\x8d\x05\x80\x80\x6e\x8e\x69\x66\xc1\x1e\xe3\x83\x9a\x09\xd2\x31\x3e\x2c\x47\xd5\xb2\x3e\xa6\x96\xf5\xd1\x82\x69\xb0\x9d\x82\x3d\xb6\xd7\x7d\xe1\xa8\xf7\xc2\x25\x3e\xff\x1c\x55\x2f\xd9\x19\x80\xe0\x6a\x5b\x31\x6c\xea\xa4\x5e\x5b\xf3\x35\xc1\xaf\xff\x9d\x3e\xf8\x7c\x1f\xf9\x5c\x5f\xf2\x33\x7d\xee\xd7\xbf\xbf\xaf\xe6\xfe\xc7\xb9\x6c\xf2\xe4\xb7\xad\x2c\x9b\x37\xeb\x14\x23\xb6\x2e\x97\xcb\x25\x5d\xcc\x47\x4f\xa8\xb0\x81\xcf\x7b\x62\x59\x2f\x2e\x97\xd6\xf8\xbe\x64\x65\x85\x1a\x6c\xe2\x3b\xc1\xf6\xab\x7a\x97\xdc\xd5\xb1\x0f\xf3\x4b\x62\x32\x4e\xc8\xd7\xda\x17\xb3\x7b\x37\xa1\x5d\xef\x0a\xab\x7b\xb0\x71\xdf\x9b\x80\xef\x4b\x90\xf7\x24\x92\xdf\xe3\x0d\xad\xf2\x93\xfa\x0a\x65\x42\xd6\xdd\xf2\xb1\xef\x1b\x93\xd4\x8d\x2b\x29\x5c\xd0\xf1\x59\xc9\x75\x5f\x26\x20\xc4\x1e\xca\x5d\x59\xd5\x52\x69\x44\xb1\x68\x51\xb5\xb4\x12\xb5\x85\x64\x32\xd6\x14\xb5\xe0\xe8\xab\xba\xb3\xc6\xa4\xb1\x6e\xb8\xff\x97\x49\xbd\xc6\x11\x6f\x9c\xa7\x05\xd3\xd0\xec\xaa\xa9\xfe\xd1\x04\x7c\x38\x41\x7e\x38\x91\xfc\x80\x57\xc1\x77\x26\x9e\x16\x6a\xb0\x69\x05\x31\x20\xaf\x09\xb5\x0b\x96\xbe\xc8\xc5\xb2\xf8\x70\x31\x63\xe5\x6a\xeb\x2c\xd3\x15\x21\x88\x05\xd4\xe2\x15\xd3\xb4\x11\x29\xea\x46\xe4\xbd\x2b\xe6\x2a\x5f\xcb\x03\x8a\xb1\x32\xcf\x97\xdf\xb5\xda\xbe\xcd\xa4\x76\x08\x94\x16\x20\x04\xe4\x43\xc3\x30\x25\x90\xe8\x52\xc9\xbc\xc9\x96\x0a\xcb\x2c\x65\x3c\xf4\x10\x8e\x47\xd9\xad\x76\x61\x99\xae\xa8\x1e\x04\xfd\xf2\x10\xf9\xfe\x1d\x70\x7f\xa0\x90\x49\xb7\x0c\x8f\x87\x7e\xb4\x19\x1e\x7a\xbe\x64\xde\x9c\xe7\x65\xf7\x04\x0c\x4d\xf3\xd7\x9d\x0f\xf9\x2c\xc9\x45\xfd\xfa\x22\x0a\x6d\x01\x85\xde\x88\x47\xa1\x8f\x91\xf3\x12\x85\x36\x1a\xa2\x12\x8b\xfa\xdd\x81\x4c\x14\x99\x28\x32\x51\x64\xa2\xc8\x44\x91\x89\x22\x13\x45\x26\x8a\x4c\x14\x99\x28\x32\x51\x64\xa2\xc8\x44\x37\x9d\x89\x1e\x85\xc3\xe4\x60\x2a\xeb\x71\xcd\xd7\x05\x99\xa8\xbf\x83\xab\x07\xa2\x88\x2b\x11\x57\x22\xae\xdc\xc6\xb8\xf2\xb3\x43\x30\x2a\x70\xa5\xed\x98\x96\x5a\xa4\x3e\xa0\x94\x6c\xb2\x60\xeb\x86\xa9\xf9\xde\x99\x3f\x38\x44\x7e\x6f\x00\x40\xde\x7e\x6d\x35\x9b\xfc\x70\x33\x18\x72\x6a\x7e\xe6\x92\xa9\xf5\x86\x43\xe6\xdd\xfc\x75\xf3\xe2\x0b\x16\xb2\xb2\x6a\x88\x1b\x5b\xc0\x8d\x4f\xc5\xe3\xc6\x71\x72\x40\xe2\xc6\xea\x21\x26\x01\xa3\x6c\xfd\x20\x5d\x44\xb0\x88\x60\x11\xc1\x22\x82\x45\x04\x8b\x08\x16\x11\x2c\x22\x58\x44\xb0\x88\x60\x11\xc1\x22\x82\x45\x04\x8b\xdd\x06\x8b\x87\x60\x9c\x1c\x48\x65\x3c\xb0\x78\x67\x10\x2c\xca\x9d\x1b\x52\x45\xa4\x8a\x48\x15\x91\x2a\x06\xa8\xe2\xc7\x5e\x05\x27\x04\x55\x74\x91\x12\x2f\xa5\xd6\xf9\xd1\xa6\xa5\x25\xbb\xc2\x65\x99\x5a\x28\x50\xdb\x66\xfb\x0d\x7a\xd3\x26\xdf\x80\xd4\x9f\xee\x80\xbb\xab\x1e\xf6\xbc\x1e\xe5\xaa\xa3\xa8\xca\x3c\x2d\x2d\xcd\x8b\xe7\x27\xf9\xf3\x57\xf8\xf3\xe9\xac\xb8\x63\x32\xf8\xb8\xf4\x2e\x8c\x78\xa4\x6d\xec\x8f\xa3\xba\xdc\x55\x78\x16\x9e\x21\x03\x8b\xa6\xb6\x96\xe4\xff\x2a\x89\xf4\x63\x70\x3e\x8a\xd5\x65\xaa\x5b\x49\x7e\x68\x26\xa2\xae\xf9\x9f\xec\x83\x37\x08\x12\x78\x05\xe6\x38\x09\xcc\x43\xdb\x4a\x87\xe7\x59\xd1\x59\xf2\x34\x3c\x05\x3b\xa7\xc4\xfa\xde\xd6\xf2\xaf\xb1\xf2\xc7\xc9\x33\xb0\x00\xbb\xd8\x85\x72\xbb\x5f\x10\xc7\x34\x1f\x0c\x67\x9a\x3b\xc9\x8e\xb2\x69\x3b\x70\xbd\x1c\x8f\x34\x1f\x27\x17\x25\xd2\x0c\x1b\xdf\x12\x6c\x46\xd5\xaf\xde\x8d\xf2\xbd\x7d\xf0\x7d\x7d\xe4\x3d\x7d\xc9\xef\xf1\x04\xfc\xdf\x27\x9e\x66\x2b\xa5\x5c\xd8\x47\x14\xdd\xd0\xd8\xc8\x73\x15\x97\xaa\xcd\x64\x10\x30\x2e\x52\xa5\xcc\xca\x67\x1a\x7c\x46\x99\x34\x14\xdd\x10\x18\xc7\xb4\x94\x8a\xe1\x91\x20\x4d\xd1\xac\xb5\x2b\x15\x43\xd1\x74\x8b\x32\x31\x44\x3d\xbc\xc0\xb4\x04\xae\x86\x49\xbe\xe2\xee\xa6\xe4\x8e\x56\x59\xaa\x58\x5c\x63\x2f\x5b\x26\xfb\x28\xa6\xb0\x48\xa9\x27\x97\xd4\x8c\xb2\xc0\xdf\xc8\x77\x42\x5c\xc1\x99\x50\x46\x95\xc9\x52\x69\x82\x6b\x43\x9a\xb5\xa6\x58\x15\x83\xed\xb4\x99\xdc\x72\x55\x40\x59\x1c\xd5\x52\xb7\x89\xaa\x05\x85\xf4\xbb\xfb\xe0\xbb\xfa\xc8\xbb\xfa\x92\xdf\xe1\x35\xd0\x9f\x25\xb8\x02\xfd\xb8\x6a\xa8\x45\x6a\x89\xad\xa0\x38\xc6\x61\xdb\x66\x41\xe7\xda\x8d\xb7\xe9\x52\xf9\xae\xd5\xb4\x14\xa6\xfc\x3a\x6b\x9e\xba\xb7\xa2\xde\x60\xf5\x77\x96\xa9\x4d\x5d\x49\xca\xa4\xbb\x8b\xc3\x38\x11\x5a\xa4\x0a\x97\xe1\x7c\x83\x65\x5a\x4a\x76\xfc\x18\xbb\xd7\x52\x0b\x9c\xdb\x95\x4c\xa3\x28\xe4\x26\xdf\x04\x31\x7d\x55\xd5\x0d\xa1\xce\xf0\x4d\x86\x7f\x2f\x67\x19\x92\x2a\xb2\xad\xb1\xbb\x16\x16\xcd\x92\x6a\x14\x33\xa6\x55\x1c\x2b\xdf\x28\x8e\x55\x0c\xbd\x60\x6a\x74\x6c\xef\x8c\x3d\xc7\x4a\xc9\xa4\xf6\x04\xbf\x35\xd8\x30\xed\xd6\xb4\xc8\xd7\x06\x21\x25\x24\xf7\x22\xb7\xfe\x54\xfb\xa9\x17\x2c\xd3\xb8\x6e\x2e\xda\xe4\x97\x07\xc9\xcf\x0d\xc0\xab\xf9\x3d\x9e\x60\xb6\xe5\xc6\xc5\xd0\xf4\x55\x5d\xab\xa8\xa5\x2a\x8b\x90\x07\x09\xa6\x2c\xd3\xc8\x9b\x8b\x6d\xb1\x04\xb9\xc1\x35\x72\xec\x1f\x29\xe2\x65\xf9\xb3\xba\xed\x9c\x37\xad\xc9\x52\xc9\x8b\xb4\x61\xf7\xbe\x89\x27\x4a\x78\xb5\xdf\xf6\xe3\x8a\xc3\x27\xe2\xc5\x5d\x86\x8c\x48\x71\xc7\x3b\xdc\x35\xdc\x88\x76\xae\x97\x67\xd7\xf7\x86\x4b\xd8\x3d\x04\xf8\xb7\xb2\xae\x44\x13\x0f\x9a\x78\xd0\xc4\x83\x26\x1e\x34\xf1\xa0\x89\x07\x4d\x3c\x68\xe2\x41\x13\x0f\x9a\x78\xd0\xc4\x83\x26\x1e\x34\xf1\x74\xdb\xc4\x83\xc6\x1a\x34\xd6\xa0\xb1\x66\x1b\x1b\x6b\xde\x3f\x04\x07\x9b\x0a\xe2\x5b\x1d\xad\x97\xfc\xd5\x20\xf9\x83\x81\xb0\x30\xbd\x6b\xcd\x71\xc0\xf6\x07\xea\xcd\xa4\x8f\x84\x86\xda\xad\x7a\xd3\xd6\xe4\x82\xdd\x77\xfd\xee\x42\x4c\x5d\x04\x85\x08\x0a\x11\x14\x22\x28\x44\x50\x88\xa0\x10\x41\x21\x82\x42\x04\x85\x08\x0a\x11\x14\x22\x28\x44\x50\x88\xa0\x10\x41\x21\x82\x42\x04\x85\x3d\x05\x0a\xff\x39\x01\xb7\x8f\x99\x65\x6a\xe8\xda\xd8\x6a\x76\xec\xfa\xcd\x1b\xf6\x18\xf9\x4a\x82\xfc\x51\x02\x6e\x13\x3f\x27\xaf\x16\xa9\xc3\x67\x9d\x5e\xa0\x8a\x5a\x28\x70\x9d\x83\x0b\x78\x4b\xb9\x5c\xa6\xc6\xcc\xb4\x92\x9f\xbf\x7c\x49\x79\x9a\x2e\x2a\x17\xe9\x1a\xd3\x64\x94\x21\xe9\x32\x69\x2b\xe5\xca\x62\x49\x2f\xc8\xad\xd0\x2a\xb5\xbc\x8a\x72\x35\x7f\x38\xbd\xb7\x48\x9d\x79\x51\xf8\xa4\x28\x7b\x86\x17\x2d\x4a\xbe\x48\xd7\x6c\xea\x8c\xbf\xbe\x8a\xc0\xdd\xbc\x31\x6a\x53\x67\xff\x75\xdb\x34\xf2\x47\xe1\x7e\x41\xd1\xee\x86\x3b\x39\x45\x7b\x35\xbc\xea\xc7\x12\xbb\x40\x8e\x9b\x38\x22\x46\x7e\x7f\x10\x1e\x94\x5e\xed\xe5\xb2\xed\x47\xc8\xd0\x54\xba\xc2\x74\x4c\xc7\x26\x3f\x37\x48\x3e\x3a\x00\x3b\xd9\xf5\x6b\xab\xd9\x64\xa5\x39\x12\x3a\xcd\x0b\x98\xa7\x4e\x9b\x28\xe8\x10\x7f\x60\xb2\x5c\xb6\x17\xb2\x5e\xd9\xc8\x3d\x9b\xe3\x9e\x8f\xc7\x73\xcf\x34\x19\x72\xdd\xbf\xcb\x65\x5b\xb2\x4e\xaf\xa1\xab\x22\x59\x20\xe2\x44\xc4\x89\x88\x13\x11\x27\x22\x4e\x44\x9c\x88\x38\x11\x71\x22\xe2\x44\xc4\x89\x88\x13\x11\x27\x22\x4e\x44\x9c\x88\x38\x11\x71\x22\xe2\xec\x29\xc4\xf9\xf6\x61\x38\x2c\x10\x5f\xd9\x2c\xe9\x85\xb5\x1a\x0f\xc8\xb2\xa9\xd9\xb4\x50\xb1\x74\x67\x8d\x5f\xd7\xfd\xb0\xb8\xaf\x0c\x91\x37\xef\x80\xd7\x88\xc7\x3c\x57\xc8\x9f\x6e\x26\x34\xee\x9c\xa9\xcd\xcb\x52\xe7\xf8\xe3\x3d\x11\x24\x77\x2f\x7f\x9d\xa8\x90\xf4\xa3\xac\xab\x28\xf2\xc3\x7a\x7e\x78\x35\x9e\x1f\x1e\x27\x47\x25\x3f\x14\xc3\x45\x12\xc4\xba\xe6\x0d\xf1\x98\x8c\x0b\xc8\x8b\x28\x11\x51\x22\xa2\x44\x44\x89\x88\x12\x11\x25\x22\x4a\x44\x94\x88\x28\x11\x51\x22\xa2\x44\x44\x89\x88\x12\xbb\x8c\x12\x4f\xc3\x49\x32\x91\x3a\xe6\x45\xce\x7d\x20\x18\x39\xb7\x6e\xa7\x87\x31\x74\x11\x45\x22\x8a\x44\x14\x19\x40\x91\xff\x6b\x3f\x5c\x08\x45\x91\x86\xe7\xbe\x27\xd8\x23\xff\xfb\xa5\xb1\xb2\xa9\x69\xba\x6d\x55\xf8\xc6\x7e\xb1\xa2\x15\xa9\xe3\xc1\xc9\x77\xed\x27\xff\xa5\xbf\x0e\x4e\xee\xb3\xa8\xaa\xd5\xec\x6a\xe7\x4c\x6d\xda\x2b\x25\xc7\x4b\x49\x67\xd8\x7d\x55\x20\xd0\xf3\x20\xd4\x42\xee\x6f\x6f\x2c\xdd\xbc\x0e\x97\x04\xc3\xbb\x00\xe7\x38\xc3\x3b\x03\xa7\xe0\x44\x64\xac\x58\xf1\x8d\x5e\x90\xd8\x90\xfa\xc5\x12\xbc\xe7\xe3\x09\xde\x09\x72\xbc\x8e\xcd\x45\x20\xbd\xba\xd7\x5f\x7f\x20\x9c\xe1\xdd\x46\x06\xd8\xe5\xe4\xbb\x76\xd7\xf5\xd4\xb0\x45\xcb\x25\xb5\x40\x9b\xe8\xac\xac\xbc\x75\xb3\xfa\x2b\xf7\x04\xb0\xa5\xab\x3a\xf6\xf1\xc6\x3a\x2c\x87\xf1\x71\x1b\xc7\xc7\xcd\x61\x7c\xdc\x88\xf8\xb8\x9f\x48\xb4\x5d\x7a\xcc\x8b\xf8\xd8\xb3\x90\xf7\xe3\x63\x77\x5c\x24\x45\x8b\x8c\x72\xc5\x81\x26\x25\x56\xb3\x02\xaa\x4e\xb2\xa5\x7f\xec\xf6\x3a\x91\x74\xbf\xd8\xab\x28\x6a\xa8\x14\x3a\x20\xae\x6e\x9a\x10\x7a\x12\xae\xc0\x5c\x50\x08\xa5\x73\x70\xb6\x05\xbb\xcf\x34\xff\x8c\xcb\xbc\xa2\x36\xca\xa1\x38\x39\xf4\xe5\x3e\xf8\x52\x1f\xf9\x62\x5f\xf2\x0b\x5e\x03\x7d\xb4\xef\xc9\xa0\x72\xa7\xb3\x3d\x06\x57\xd0\x94\x45\xba\x24\x0c\x45\xde\xae\xcc\xb7\x46\xc8\x8d\x30\xaf\x62\x40\xce\x18\xa6\x31\x6a\xd0\xa2\xca\x1b\x42\xea\x77\x41\x79\x24\xf8\x8c\xd7\x05\x72\x88\xea\x2b\x2b\x54\x63\x12\xaf\xb4\xe6\x5b\x70\x7c\x6a\xaf\x97\x46\xa4\xda\xc7\x15\x5f\xa5\x68\xb1\x95\xb6\x4c\x2d\xdd\xd4\x3c\xf5\xd5\x5f\x74\xb9\x71\xcc\x6d\x8d\x8a\xcd\x2a\x19\x54\x99\x55\xf6\xa4\xfb\x41\xf2\x25\x4b\x82\x54\xb8\x45\x64\x44\x3d\x57\xa8\x6a\x84\xd6\x31\x45\x78\x15\xe6\x78\x0d\x42\xd4\xd9\xdc\x67\xfa\xe0\x95\x3e\xf2\xe9\xbe\xe4\xcb\x5e\x33\xff\x40\xdf\x74\xc0\x64\x5c\x2e\x51\xd5\xa6\x1e\x56\x9a\xb3\xcc\xb2\x5a\xe4\x1d\x20\x66\x64\x95\x65\xc9\xfd\x16\xdf\xe6\xcc\x7a\x29\x9b\x39\x9a\x51\xe6\x45\x87\x88\xd6\x29\xb3\xdd\x0c\xdb\x11\xba\x84\x92\x2a\xa6\x55\x5e\x56\x0d\xd7\xd2\x65\x55\xe8\xd8\x92\x5a\x72\x89\x7e\x4a\x5c\x4d\x29\x4b\xba\xa1\x96\xf4\x37\xb9\x68\x70\x91\x32\x75\x99\xef\x9f\xc6\x84\x9a\xac\xf9\xb8\x58\x14\x3e\x68\xfb\x0f\x09\x86\x9e\x51\xce\xe9\x7c\x38\x07\x2a\x6e\x5a\xf5\x5f\xe6\xef\x45\x1d\x81\xf0\xf9\x64\x33\x9d\xe5\x4c\xea\x76\x51\x9f\x69\xf7\x43\xaa\x4c\x66\xb9\xb7\x0f\xc0\x5b\x07\xc8\x9b\x07\x92\xdf\xf4\xec\xa6\x9f\xef\x7f\x5a\x32\x36\x36\xa5\xd8\x66\xb0\xa8\x5a\x8b\x6a\x91\x2a\x05\xb3\x54\xa2\x5c\x04\xfb\xf3\x82\x5a\x4b\xa6\xb5\xc2\xda\x22\xb4\xa6\x97\x6b\x5e\x1e\x5d\x51\x3e\x9e\xdd\xc1\x28\xa4\x2e\x1b\xa7\x1a\x2d\xe8\x9a\x0f\xcb\x39\x77\xe5\xa6\x0b\xaf\x75\xd9\xf6\x50\x52\x49\x97\xac\x66\x02\xcd\xe8\x32\x39\x6f\x03\xe8\x59\x4b\xab\x5f\x96\x51\x44\x5a\x06\xbe\x38\x07\x85\xc3\xa0\xf8\x86\x41\x65\x54\x76\x7c\xf5\xc0\xb0\x4f\x28\x83\x39\xb5\x70\x83\x2d\x33\x86\xc6\xee\xe2\x66\x4a\x7e\x53\x4d\xc3\x09\x10\x2e\x87\x7e\x75\x21\xee\x17\x2c\x7a\x25\x9d\x50\x06\xcf\x9b\x16\x0d\x14\xab\x14\x54\xbb\xa0\x6a\xec\xeb\x65\xfb\x08\xc3\x34\x2f\xcf\x16\xd2\xab\xae\xc0\x25\xaf\x8c\x4c\xea\x8e\x72\xed\xb8\x09\x2a\x0d\x1f\x4f\xc0\xac\x50\x1a\xce\xc1\x14\x57\x1a\x4e\xc1\x09\x38\xde\xc2\xf2\x31\xef\xa8\x4e\xc5\x86\x2b\x22\xe5\xc5\x45\x98\x09\xa4\xbc\xd8\x60\x99\x71\x1a\x83\x12\xae\x31\xec\x26\x3b\x45\x33\x75\x5c\x69\xc8\xbd\x7f\x4f\x9d\xd2\x30\x5e\x56\x2d\x47\xe7\x76\x4f\xb1\x59\x6e\x62\x43\x33\x56\xae\xf3\x43\xe9\x92\x26\x71\x5f\x6d\x41\xa3\xbc\x2a\xfc\x30\xe1\xc4\xfd\xc1\x8b\x2b\xd4\x2a\xd2\xe0\xd5\x7d\xc1\xab\xb6\x63\xa9\x0e\x2d\xea\x85\xd1\xba\xfb\xaa\x4a\x61\x7f\xaf\xc9\xab\xac\x96\xb9\x4b\x30\x0b\xf9\x9a\xad\xd4\x04\x1c\x6b\x61\xd0\xcc\x71\x5f\x01\xd4\x5f\x62\xf4\x97\x8f\xf4\xc3\x87\xfa\xc9\x07\xfb\x93\xef\xf7\x16\x81\xb7\xf4\x6f\x9f\x7d\x54\x8d\x79\x85\xb5\x33\x77\x17\xe0\x26\x40\x36\x38\x7d\xa7\xa1\xa1\x88\x81\x3b\xcc\xd7\x32\xe1\x5d\xa2\x96\xf8\x93\x4c\x69\x13\x4f\xf3\x3b\xb8\x02\x65\x2b\x43\x79\xdb\x34\xe6\x84\xf7\xcc\xe3\x6c\x5a\xc8\xbf\xe7\xdd\xc9\xe2\xff\x38\x1c\xbd\xc1\xcb\xbd\x92\x80\x4f\x27\xc8\xcb\x89\xe4\xa7\x3c\xb2\xf7\x81\xc4\x79\xd3\x2a\x70\xdd\xae\x68\xf2\x66\x37\x95\xd4\x12\xfb\x29\xa5\x4c\x56\x7d\x05\x67\xb6\x42\x0d\xab\xd8\xbe\x9f\xc0\xa8\x5a\xe0\x1f\xce\xbd\x2f\x4a\x7a\x41\x2e\xb3\xb4\xa4\xd9\x8a\x79\x53\xb6\xa9\xf0\x4e\x28\x53\xb3\x5c\xa2\x19\x45\xbc\x91\xbb\x3b\xb9\x7d\xc9\xd9\x69\x68\x03\x78\xaf\x4f\xed\xe0\xd5\xaa\x72\xdd\xe9\x3e\xee\x8a\x76\x29\x2b\x8b\x1c\xef\x1d\x5e\x28\xf2\x67\xe1\x34\x39\x99\x9a\xf0\x4c\x25\x0f\xd5\x98\x4a\x6a\x8b\xa8\x37\x96\xbc\x00\xcf\x93\xab\xa9\x67\xbd\x12\x26\xa4\xfe\x2d\x26\xaa\xa1\xf1\x34\x4d\x8a\x5d\x30\xcb\x74\x44\xb1\x2b\x85\x65\x36\x41\xb8\x6a\x4f\xd5\x15\xa1\x19\x95\x2d\x93\xab\xb5\xa9\xdd\x1e\x53\xed\xa4\x39\x86\xfc\xd2\x20\x8c\xc6\x44\xdd\xac\x89\xb7\xf9\x3d\x83\xe4\x1d\xa1\xf1\x36\xf7\x0b\x27\x02\x4b\x9a\x3f\x5d\xfd\xdc\x75\x2f\xad\x0a\xc2\x98\xce\xb2\x9b\x1b\x06\xc8\xdc\x6a\x87\xc4\xaf\xc3\x65\x31\x63\x1e\x83\xf3\x7c\xc6\x9c\x85\xd3\x70\x32\x72\xc6\xf8\xcd\xed\x4e\x9a\xba\xf0\xa0\x1b\x48\x21\xc6\xcf\x73\x37\x19\x3b\xb3\xa9\x18\x99\x51\x01\x36\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\x1d\x3d\xd1\xd1\x13\xcf\x8c\xa3\xa3\x26\x3a\x6a\xa2\xa3\x66\xb7\x1c\x35\x3f\x32\x08\xc3\x82\xe4\x19\xd4\xb9\x69\x5a\x37\x98\xb6\x56\x83\xf2\x74\xa3\x68\x51\xdb\xa6\x36\xf9\xb6\x41\xf2\x77\xfd\x40\xfc\x5b\x3d\x8c\xf7\x68\x63\x8c\x37\x23\x8a\x48\x8f\xb0\xdb\x2e\x79\x8f\x4b\x82\x27\xaf\x6e\x35\x76\x47\xa3\x13\x5e\xe7\x05\xd4\x9b\x82\x49\x0e\xf5\x4e\xc0\x71\x38\x1a\x09\xf5\x02\x2d\xef\x52\x3d\xd9\x22\xb3\xba\xed\x34\x8b\xed\x9e\x8b\xc7\x76\x13\xe4\x98\x24\x72\x75\x9d\x2d\x99\xb7\x7c\x6f\x08\xe7\x46\x62\x87\xc4\x0e\x89\x1d\x12\x3b\x24\x76\x48\xec\x90\xd8\x21\xb1\x43\x62\x87\xc4\x0e\x89\x1d\x12\x3b\x24\x76\x48\xec\x90\xd8\x21\xb1\x43\x62\xd7\x25\x62\xf7\x5b\xfb\x21\x27\x88\x9d\xb5\xa8\x16\x32\x2e\x74\xe2\x45\xd5\x92\xbb\x42\xa9\x62\x3b\x6c\xdf\x52\xa2\x8b\xba\xa1\xe9\x46\xd1\x3b\x55\xfd\x6f\xf6\x93\x4f\xf6\xc3\xbd\xac\x8c\xc9\x60\x11\x3e\xd1\x0b\x39\x60\x3d\x25\xca\xbb\x62\x96\x68\x4e\x94\x27\xce\x57\x5f\xa9\x2d\x45\x82\xbd\xfa\xfb\xdb\x7c\xbe\x7a\x09\x2e\x0a\xd2\x36\x0d\x39\x4e\xda\x4e\x42\x03\x1f\xf3\x0c\x6f\x31\x97\xb1\xd5\x57\x6e\x03\x27\x19\xf9\xd9\xe8\x72\x3c\x82\x7b\x9c\x5c\x14\xa4\x2d\xe4\xed\x51\xee\x73\x91\xfd\x0c\xc9\x1f\xda\xdd\xa8\x0b\x87\xc2\x4f\x5e\x87\xf4\xa2\x7b\xf0\x7a\xb3\x3a\x72\xbd\xa7\x05\xe2\x7a\x12\x4f\x0b\xe0\xa9\xeb\x16\x4f\x5d\xff\x74\xa2\xbd\x32\x65\x4e\x1c\xb9\x9e\x81\x0b\xfe\x91\xeb\xcd\x92\x52\xfc\xbc\x75\xd7\xa5\x54\xfa\x95\xdb\x1b\x49\xa9\xfb\xbc\xc3\xd8\x21\x82\x49\x9e\xc5\xde\x34\xb9\x84\x67\xb1\xf1\x2c\x36\x9e\xc5\xc6\xb3\xd8\x78\x16\x1b\xcf\x62\xe3\x59\xec\xf0\xb3\xd8\xcd\x29\x14\xb1\x6a\x42\xf3\x1a\x47\xee\xbf\xef\x69\xa4\x50\x64\x63\x0e\x6a\x87\xa8\x19\xe2\x9c\xf6\x66\x68\x19\x78\x4e\x7b\xbb\xe9\x36\x78\x4e\x1b\xcf\x69\x6f\xf2\x39\xed\x2e\x63\xb3\xd8\x43\xda\x5d\x5f\x41\xf2\x67\xe0\x14\x39\x91\x3a\xee\x1d\xba\x7e\x30\x78\x6c\xbb\xbe\x84\xce\x87\xb8\x25\x7f\xd1\x07\x77\x09\xae\xbb\xc8\xd3\xf5\xb8\x0c\x97\x7c\xb6\x8f\xfc\x46\x1f\xbc\x9a\xff\xea\xad\x71\xf7\x14\xa9\x53\x6d\x36\x15\x40\x3a\x7d\x5f\x91\x3a\x39\x76\xab\x5c\xbb\x26\xe7\x66\x5c\x2f\x9d\xf6\x39\x54\x4e\xd4\x15\x34\x51\x57\xd0\x44\x33\x05\xe5\xcb\xf0\x94\x18\x89\x6c\x19\x62\x23\xf1\x3c\x4c\x43\xae\x85\xc5\x27\xf0\x9d\xcd\x9c\x82\x26\x3f\x3e\x0c\x47\xab\xf3\xa1\x47\x84\x26\xb5\x28\xff\x0a\x3b\x10\x91\xf4\x1b\x43\xe4\x4f\xfa\xfc\x44\xe9\x0f\x84\x90\xf2\x2b\xe2\xa9\x79\xea\xa4\x1f\x64\x97\x45\x3e\x73\x3f\xf6\x8b\x7f\xbd\xcd\x44\xfc\x0d\x70\x5a\x34\xe8\x51\x38\xcc\x1b\x74\x0c\x46\x61\x7f\xe4\xd4\x66\xdf\xc0\x9a\xcf\xaf\xcf\x46\x21\xf8\xa5\xf8\xb9\xbc\x9f\x0c\xd7\xa7\x20\x0f\xd4\x20\x98\x83\x3c\xf9\xa3\xbb\xfc\x96\x56\xc2\x81\x76\xa0\xb1\x1f\x96\x77\x74\xab\xbd\x73\x3c\x29\x53\x8d\xfa\xb4\xbe\x06\x47\x8d\x09\x59\x75\x8b\xac\xfa\xbd\x89\x68\x17\xf4\x8d\x8a\x81\x29\xc1\xad\x99\x66\xe0\x71\xeb\xf5\x16\xe2\x8a\x8c\x36\xcb\x84\x18\xc2\x9d\x7e\xf3\xed\xbe\xc8\xb8\xd3\xa3\xcb\x01\x29\x21\x77\xf8\x5d\x13\x12\x48\x91\x91\x22\x23\x45\x46\x8a\x8c\x14\x19\x29\x72\x2b\x14\x39\x72\x91\xef\x79\xbc\xdc\x29\x0d\x20\x96\x4a\xe7\xfe\xf8\x55\xbe\x12\x30\x1c\x43\x84\x03\xaa\xc1\x43\x1c\x49\x74\x43\x33\x40\xf2\xbb\xdd\xf4\x11\x24\xbf\x48\x7e\x37\x99\xfc\x76\x1e\x0f\xb5\x5b\xd2\xc7\xc1\xe3\xfc\x51\x38\x4c\x0e\xa6\xb2\x1e\xca\x7d\x5d\x10\xe5\xfa\xa5\xde\x12\x81\x37\x7f\x36\x0d\x0b\x92\x5a\x56\x1c\xd3\x2e\xa8\x25\xdd\x28\x8e\xad\x8e\x2f\x52\x47\x1d\x97\x79\xde\x23\x38\x26\xef\x26\x36\xab\x4b\x65\x53\x73\x9f\xa6\x96\x07\x35\xbf\x34\x4c\x7e\x64\x07\xdc\x19\x28\xf7\x9a\x2c\x37\xf9\x89\x66\x12\xc1\x3f\xe6\x95\x3f\x67\x6a\x93\x5e\xf9\x3d\x91\x0e\xfe\x18\x7f\xdd\xa4\xff\x69\x0b\xe2\xcb\xfc\x05\x3e\xa2\xf6\xbd\x1e\x82\x60\x33\x72\xc4\xc7\x65\x71\xbf\x5e\x8c\x97\x00\xd3\x24\xe7\x4f\x72\xd1\x17\xae\x1f\x61\x60\x00\x4a\xc9\x10\xd1\x37\x18\x93\x00\x63\x12\x60\x4c\x02\x8c\x49\x80\x31\x09\x30\x26\x01\xc6\x24\xc0\x98\x04\x18\x93\x00\x63\x12\x60\x4c\x02\x8c\x49\x80\x31\x09\xba\x1d\x93\x60\x1a\x72\xe4\x6c\xea\xb4\x07\x52\xf6\x06\x09\x4c\xc4\xee\xed\x56\xc0\x31\x18\x3b\x01\x63\x27\x60\xec\x84\x2d\x14\x3b\xe1\xef\x86\xe0\xb0\x8c\x76\x6a\x6a\xb4\x36\x5a\x82\xc0\xa7\x56\xc5\x60\x5f\x5d\x28\xa9\xb6\x4d\x3d\x3a\xfa\xf1\x21\xf2\xf5\x01\xd8\xc3\x1e\xf3\x7c\x70\x7f\xbc\x19\x2c\x7a\x45\x14\x37\xc5\x8a\xeb\x09\x16\x7a\x3f\x7f\xdd\x25\x53\xa3\xd2\x43\x38\x58\x43\xe4\x9d\x2d\xf0\xce\xab\xf1\xbc\xf3\x38\x39\x2a\xad\x1c\x81\xc6\x8e\x3c\x4a\x1d\x18\x9c\x08\x39\x11\x72\x22\xe4\x44\xc8\x89\x90\x13\x21\x27\x42\x4e\x84\x9c\x08\x39\x11\x72\x22\xe4\x44\xc8\x89\x90\xb3\xdb\x90\xf3\x38\x1c\x25\x87\x53\x07\x3d\x3c\xf9\xfa\x2a\x37\xb3\xc0\xb6\xae\xf3\x67\x85\x91\x3b\x22\x77\x44\xee\xb8\x85\xb8\xe3\xbb\x87\xe1\x94\x7b\xd8\x5c\xb7\x68\x51\xe7\x3e\xfb\x21\x01\x5b\x05\x82\x94\xc0\x40\x2f\xf8\xfc\xf1\x73\x43\xe4\xdf\xee\x80\x7b\x6a\x1e\xf7\x50\xe4\x47\x9b\x41\x91\x93\x73\x33\xf3\xa2\xd8\x9e\x00\x91\x8f\x0a\xa7\xcc\xea\x2f\xf2\xa3\x16\xc8\xaa\x22\x91\xac\x27\x92\x34\x1e\x38\xe6\xc8\x59\xcf\xc5\x3a\x6c\xc4\xd5\xb3\x47\xc1\x27\xfd\x86\x6f\xe4\x79\x2d\xc0\x27\xa2\x49\x44\x93\x88\x26\x11\x4d\x22\x9a\x44\x34\x89\x68\x12\xd1\x24\xa2\x49\x44\x93\x88\x26\x11\x4d\x22\x9a\xec\x32\x9a\x6c\x78\x02\xd6\xdf\xd1\x21\x98\x44\x30\x89\x60\x12\xc1\x64\x10\x4c\x5e\x83\xb3\x02\x4c\x8a\xc8\x35\x1e\x88\x8c\x38\x44\x5e\x36\x35\x4d\xb7\xad\x0a\xdf\xd1\x2f\x56\xb4\x22\x75\x6c\xf2\x99\xe7\xc9\x27\xf7\xc1\x6b\x44\x09\x7e\x14\xee\xc6\x19\xe1\xe7\x4c\x6d\xda\x2b\x29\xc7\x4b\x4a\x67\xd8\x23\x22\x00\x8e\xe4\x80\xfe\x01\xed\x90\xfb\x7b\x1c\x0d\xe6\x10\x8f\x21\x1e\xcb\x21\x1e\x43\x3c\x86\x78\x0c\xf1\xd8\xb6\xc1\x63\xb9\x9e\xc1\x63\x6d\xaf\x49\xcb\x78\x2c\x87\x78\x0c\xf1\x18\xe2\x31\xc4\x63\x88\xc7\xba\x8f\xc7\x72\xdb\x1a\x4a\xe5\x10\x4a\x75\x0e\x4a\xe5\x7a\x1d\x4a\xe5\xb6\x20\x94\xca\xaf\x44\xc7\x3b\xbe\x22\x7c\xad\x2e\xc2\x0c\xf7\xb5\x9a\x82\x49\x38\x13\x19\xbc\x52\xc6\x8f\x76\x13\x17\x85\x10\xa4\x59\xdd\xf6\x72\x14\x3c\x1f\xef\x54\x75\x82\x1c\x97\x4e\x55\xa2\x68\xe9\x33\x15\x52\x70\xbd\x7b\xd5\xf5\x07\xc3\xbd\xa9\x76\x92\x1d\x6c\x80\x40\xea\x7f\xee\xae\x43\x68\xf7\x8b\xa5\x49\x51\x43\x69\xd9\x01\x71\x75\x13\x78\x99\xc0\x5b\x4f\xc0\x65\x78\xbc\x26\x7c\xf0\x29\x38\xb1\x81\xee\xc0\x08\xc2\x98\x09\xa5\xc5\x4c\x28\xdf\xdd\x17\x2d\x34\x2e\x09\xa1\x71\x01\xce\x71\xa1\x71\x06\x36\x36\x4a\x61\x5e\x64\x46\x99\x85\xbc\x9f\x19\x65\xc3\x85\x3e\x29\x62\xaf\x3f\x0e\x17\x03\xb1\xd7\x37\x5a\xaa\x2b\xdb\xa2\x65\x4f\xd9\xb4\x1d\xe8\xb4\xec\x4b\xff\xd3\x48\x9d\x6c\x1b\x92\xe1\xf6\x03\xb9\x0b\xcc\xa5\x50\x39\x37\x21\xee\xac\x92\x73\x53\xde\x53\xdd\x94\x78\x9d\x49\xe3\x82\x84\x18\x09\x31\x12\x62\x24\xc4\xdb\x87\x10\xa3\x9a\x17\xa3\xe6\xf5\x0e\x42\xc7\x14\x5a\x5d\x49\xa1\x85\x96\x0a\xb4\x54\xa0\xa5\x02\x2d\x15\x68\xa9\xd8\xd6\x96\x0a\xcc\xa4\x88\x99\x14\x31\x93\x62\xa7\x32\x29\xa2\x21\x10\x0d\x81\xdb\xd5\x10\x98\x2f\xb6\x39\x57\x68\x5c\x8c\x82\x74\x38\x72\xbe\x93\xdc\x21\x66\xb3\x2f\x69\x9b\xc5\xcf\xeb\x00\xce\xd5\xa4\x7a\x0b\x46\x16\x27\x5f\x18\x82\xa3\x6e\xc4\x90\xb2\x3d\xb6\x9a\x6d\x9c\xdc\xcd\x76\x54\x87\x2e\x55\x4a\x4c\x78\x91\xef\x1f\x22\x1f\x1d\xf0\x93\x9f\xde\x94\x0a\xae\xa1\xe9\xab\xba\x56\x51\x4b\x55\x51\x42\xbc\xcd\xe4\xbc\x2c\x62\x9e\x3a\x6d\x09\x0f\x92\x49\x3f\x72\x33\x2c\x95\x6a\xe0\x3d\xb3\xba\xdd\xeb\x4e\xfc\x9b\x12\xdf\xe3\x72\xfc\x7c\x18\x21\xe9\xfa\x14\x8a\x81\xa6\xad\xce\xa1\xb8\x37\x7c\x32\xee\x21\xc0\xbf\x94\x1b\xa0\x31\x9a\x07\x1e\x57\xc0\x68\x1e\x68\x8c\x42\x63\x14\x1a\xa3\xb6\x91\x31\x0a\xa3\x79\x60\x34\x0f\x34\x02\xa0\x11\x00\x8d\x00\x68\x04\xe8\x09\x23\xc0\x16\xa4\x15\x18\xf6\x03\xc1\x2a\x86\xfd\xd8\x3a\x27\x2c\xc8\x4f\x3e\x07\xd9\x6a\xba\xd8\x0c\x57\xfc\xe6\x55\xf2\xed\xfb\x7c\xae\x38\xdc\x38\xc0\x47\x00\x46\xa5\x1f\x62\xb7\x36\x00\x81\x3d\x0e\x01\x31\x92\x07\xa2\x31\x8c\xe4\x81\x68\x0c\xd1\x18\xa2\xb1\x6d\x84\xc6\x7a\xc8\x0d\xb9\x67\xd0\x18\xfa\xc7\x22\x1a\x43\x34\x86\x68\x0c\xd1\x18\x46\xf2\x40\x07\xbe\x5b\x87\x33\xf5\xbc\x03\xdf\x96\x8c\xe4\xf1\x3c\x4c\x09\xe7\xa9\x93\x30\xc1\x9d\xa7\x0e\xc1\x38\x1c\x88\x3c\xd0\xae\x96\xcb\xb6\xeb\x62\x18\x70\x11\x8b\xf5\x97\x8a\x09\xad\xd1\x76\x7f\xaa\xd4\xd7\x76\xf9\x18\xec\x2e\x2f\x48\x47\x90\x78\x3d\x2c\x7e\xed\x06\xf3\x12\x88\x2a\x07\x67\xe1\x74\x4d\x34\x8e\x0c\x8c\xac\xa7\xad\xf1\x5c\x26\x86\xdf\x68\x31\xfc\xc6\x9f\x24\xe0\x8c\x98\xe9\xc7\xe0\x08\x9f\xe9\x07\x60\x9d\xa3\x0f\xa6\x45\x58\x8d\x53\x70\xc2\x0f\xab\xb1\xfe\x52\xce\x89\x38\x1a\xa7\xe1\x64\x20\x8e\xc6\xfa\x8b\x69\x5d\xe4\x88\x88\x1a\xcd\x89\x9c\xa0\x50\x69\x2c\x7e\xd2\xbf\x3e\xe2\x8b\x1c\x25\x34\x76\x46\x50\xfc\xec\x17\x77\x08\xf1\x13\x16\x2c\xa3\x73\x82\x08\x83\x64\x20\x7c\x45\xf8\x8a\xf0\x15\xe1\x2b\x06\xc9\xc0\x20\x19\x18\x24\x03\x83\x64\xa0\x11\x00\x8d\x00\x68\x04\x40\x23\x00\x1a\x01\xda\x62\x04\xc0\x20\x19\x18\x24\x03\x83\x64\x60\x90\x0c\xb4\xb1\xa1\x8d\x6d\x1b\x05\xc9\x68\xb7\x11\x6b\x0b\x9e\x33\x21\x5f\xed\x83\xfb\xa5\xdf\x7a\x85\x95\xe0\x48\xda\xc1\x7b\x44\x37\xc7\x08\x57\x0c\xe0\x35\xd5\x57\x93\xc9\x22\x5f\x1b\xd8\x0a\xe5\x0d\x1d\x55\xe1\x4d\x95\xbe\xb7\x48\x9d\xc9\xaa\xdb\x27\xe7\x66\x2e\xb0\x4b\xed\xe3\xe2\x75\x05\x4d\xd4\x15\x34\xd1\x4c\x41\x79\x7d\x5d\xb1\xcc\x1b\x8c\x4f\xf7\x1b\xe3\x46\x28\x79\xf7\x20\x3c\x22\x5a\xdc\xa0\xce\x4d\xd3\xba\xc1\x76\xc6\xb2\xb5\x57\xb3\x63\xba\x51\xb4\xa8\x6d\x53\x9b\xfc\xe5\x3e\xf2\xa5\x7e\x78\xb5\x7f\xd7\xb5\xd5\x6c\xf2\xd1\xc6\x47\x04\x66\xc4\xd3\xe9\x41\x76\xdb\x25\xef\xc9\x85\xac\xbc\x70\xde\xb4\x26\x4b\x25\xcf\x68\x61\xf7\xf8\x31\x81\xfc\x0b\xc2\xfa\x74\x80\x5b\x9f\x58\xf7\x1c\x81\x43\x30\x1e\x69\x77\x0a\xb4\xe8\x6a\x36\x23\xbf\xb9\x29\x83\xf7\x33\xf1\xb2\xe0\x30\x39\x28\x65\x41\x5d\xc7\x49\xc1\x20\x5f\x58\x1d\x29\x24\xc6\x94\x8e\x41\x42\xf0\x24\x04\x06\x09\x41\x63\x1c\x1a\xe3\xd0\x18\xb7\x8d\x8c\x71\x18\x24\x04\x83\x84\xa0\x11\x04\x8d\x20\x68\x04\x41\x23\x48\x4f\x18\x41\x30\x84\x07\x86\xf0\xd8\x2a\xd8\x17\x43\x78\x74\x22\x84\xc7\xd7\x9e\x83\x4c\x34\x98\xe3\x61\x90\x5d\x3a\x57\x28\xa9\x1c\xd1\xfd\xdc\x73\xe4\xa3\xfb\x80\x54\x21\x3a\x91\x8c\x2f\xdd\x14\xa7\x9b\x62\xe5\xa4\x1f\xae\x85\x75\xbc\x88\xe0\x2d\x3d\x8e\xe9\x30\x9a\x07\x32\x2c\x8c\xe6\x81\x0c\x0b\x19\x16\x32\xac\x6d\xc4\xb0\x7a\xc8\x5f\xba\x67\x18\x16\x3a\xf2\x22\xc3\x42\x86\x85\x0c\x0b\x19\x16\x46\xf3\x40\x4f\xc3\x5b\x07\x39\xf5\xbc\xa7\xe1\x96\x8c\xe6\x71\x1d\x2e\x0b\xf7\xa6\xc7\xe0\x3c\x77\x6f\x3a\x0b\xa7\xe1\x64\x73\xee\x4d\x1c\x12\x65\x82\x94\xa8\x2d\x91\x3d\x16\xe3\x1d\xa1\xce\x90\x53\xcd\x39\x42\xf1\x5a\xd5\xe7\x12\x4b\xfd\xfc\xee\x50\x66\xf6\x3a\x37\xee\x87\x51\xcd\xc7\xf6\x8a\xdf\xbb\x43\xc8\x04\xd0\xba\x04\xb3\x90\xaf\x89\xfd\x31\x01\xc7\x5a\xed\x19\x3c\x7a\x8a\x71\x40\x5a\x8c\x03\xf2\xce\x3e\x78\x42\x04\xe0\xc8\xc3\x63\x81\x00\x1c\x27\x61\x03\xe3\x31\x52\x4a\xc0\x45\x21\x8f\xa6\x21\xc7\xe5\xd1\xc6\xde\x32\x27\xe2\x8f\xcc\xc0\x05\x3f\xfe\xc8\x86\x4a\x6c\x36\x56\x48\x17\x84\x58\xfa\x6b\x23\xa1\x42\xec\xe1\xd0\x48\x22\x55\xf2\x6c\x54\xdc\x52\x27\xcf\xfc\xa8\x22\x1d\x94\x6c\x18\x4c\x04\xd9\x2f\xb2\x5f\x64\xbf\xc8\x7e\x31\x98\x08\x06\x13\xc1\x60\x22\x18\x4c\x04\x6d\x10\x68\x83\x40\x1b\x04\xda\x20\xd0\x06\xd1\x16\x1b\x04\x06\x13\xc1\x60\x22\x18\x4c\x04\x83\x89\xa0\x89\x0f\x4d\x7c\x5b\x3c\x98\x48\x17\x30\xf2\x7a\x02\x96\xb4\x3f\xfa\xc7\x3b\x92\x70\x82\x8d\xab\x06\xf9\x2a\xdd\x41\xf3\xc6\x8a\xe9\xa8\xf2\x92\xc8\x62\x59\xb1\xc9\x2f\xdf\x4b\xbe\xad\x1f\x76\x16\x4c\x8b\x5e\x5b\xcd\x26\xd3\x16\x55\x35\x45\x5c\x73\xfb\xdf\x57\x8d\x5d\x26\xf8\x04\x2b\x29\x3d\xc8\xee\x9d\x32\x2d\x1a\x0c\xe6\x5f\x75\x8b\xe8\xa4\xf6\xe2\xef\xfc\x55\x98\x14\x43\x68\x02\x8e\xf1\x21\x34\x0e\x07\x20\x13\x69\x8f\x60\x5f\xc6\x06\x4c\x55\xc5\x62\xc7\xcd\x03\xe1\x7d\x7a\x1b\x19\x28\xd2\xf5\x26\x4f\x48\xa5\xe4\x38\xaa\xae\x42\x30\xc4\x44\xf2\x37\x76\xf9\x7d\x30\x6a\xd1\x72\x49\x2d\xd0\x26\xbb\x21\x2d\x6f\xef\x7a\x4f\xe4\xa6\x21\x07\x67\x6b\x4c\xac\xeb\xee\x0a\xc4\x70\x68\x58\x6d\xd1\xb0\xfa\x9f\x12\xed\x10\x05\xe7\x85\x89\xf3\x0c\x9c\xf2\x4d\x9c\x9d\x10\x29\xed\x96\x19\x0d\x64\x54\xb9\xe2\x40\xee\xff\xbf\xc7\x17\x29\x47\xca\xaa\xe5\xe8\xdc\x78\x24\xb6\x9d\x4d\xca\x96\xa1\x32\xd3\x13\xba\x2a\x59\xee\xab\x2d\x68\x94\xd7\x61\x3f\x0f\x11\x75\x7f\xf0\xe2\x0a\xb5\x8a\x34\x78\x75\x5f\xf0\x2a\x53\x9b\x1d\x5a\xd4\x0b\xa3\x75\xf7\x55\x95\xc2\xfe\x5e\x93\x57\x59\x2d\xd7\xeb\x38\xd2\x40\x47\x99\xe3\x27\x6d\x50\xbe\xc5\xc8\xb7\x8f\xf4\xc3\x87\xfa\xc9\x07\xfb\x93\xef\xf7\xb6\xc6\x6f\xe9\xdf\x3e\xf2\xad\x06\x0c\xb2\x76\xe6\x06\x57\x0e\xaf\xd9\xe0\xf4\x8f\xdc\x0d\x45\x0c\xdc\x61\xbe\xc3\x17\xf6\x79\xb5\xc4\x9f\x34\x4c\x63\x54\x3c\xcd\xef\xe0\xd6\x05\x5b\x19\xca\xdb\xa6\x31\x27\xce\x9e\x3d\xce\xa6\x85\xfc\x7b\xde\x9d\x2c\xfe\x8f\xc3\xd1\x82\x37\xf7\x4a\x02\x3e\x9d\x20\x2f\x27\x92\x9f\xf2\xb6\x19\x1f\x48\x9c\x37\xd9\xa6\x54\xb7\x95\xa2\xc9\x9b\xdd\x54\x52\x4b\xec\xa7\x94\x32\x59\xf5\x15\x7c\x7f\x26\x6c\x14\x15\xdb\xb7\xb4\x8e\xaa\x05\xfe\xe1\xdc\x7e\x5d\xd2\x0b\x12\x3e\xd0\x92\x66\x2b\xe6\x4d\xd9\xa6\xc2\xbe\x5b\xa6\x66\xb9\x44\x33\x8a\x78\x23\x3f\x2c\xe8\xf6\x25\xdf\x27\x85\x36\x80\xf7\xfa\xd4\x0e\x5e\xad\x2a\x2f\xbe\xae\xe8\x94\x0f\x85\xcb\xeb\x5d\xe4\x36\x5e\xc3\x0d\xe4\xc7\x89\x58\x2d\xf2\x13\x70\x8c\x1c\x49\x1d\xf2\xa2\x19\xde\xcb\xe7\x90\x9c\xd0\x55\xf7\xa6\x06\xd8\xa5\x60\x9c\xc2\x2d\x18\x09\xf1\x9d\x43\x6e\x06\x7f\xdb\x31\x2d\xb5\x48\x6b\xcf\xfe\xf2\x5d\xaf\x7b\xd1\x3d\x01\xfc\x5b\x83\xe4\x97\x07\xe0\xb5\xf2\x57\xcf\x0b\xe8\x45\x09\xe4\x0d\x4d\x5f\xd5\xb5\x8a\x5a\x0a\xfa\x9f\xaa\x9e\xf1\x6b\x5e\x3c\xc6\xf7\x86\x99\x00\xe3\x9c\xf0\xe8\xe8\x20\x2f\x68\xd0\xf7\x3e\xa9\x72\x27\x30\xcb\xd4\xb3\x60\xda\x0e\x55\xb5\x4c\x7a\x2f\x7f\x40\x16\x2c\x1d\x8b\x82\xaf\x99\xd5\xed\xf6\xe5\x27\xea\x50\xd4\xbf\x1b\xc2\x73\xec\x00\xf7\x1c\x63\x13\x6a\x12\xce\xc0\xa9\x16\xd6\x50\xee\xfe\x7b\x6e\x95\x1a\xf1\x7e\xb1\xd7\xe2\xa7\xcf\x49\x32\x21\xa7\x4c\xf5\x08\xf1\xc2\x82\xfa\xad\x1c\xb2\xd1\xdf\x1b\x3e\x81\xf7\x10\xe0\x5f\x8e\xc1\x00\xf1\x20\x35\x06\x03\x44\x67\x3a\x74\xa6\x43\x67\xba\xed\xe6\x4c\x87\xc1\x00\x31\x18\x20\x3a\x31\xa1\x13\x13\x3a\x31\xa1\x13\x53\x4f\x38\x31\x61\x30\x40\x0c\x06\xb8\x55\xdc\x36\x30\x18\x60\x27\x82\x01\xfe\xab\x21\x18\x8b\xa0\x81\x12\x04\xae\x9a\xa5\xca\x0a\x55\x1d\x47\x2d\x2c\xb3\x95\xd7\x26\xbf\x39\x48\x7e\x71\x00\xc0\x67\x81\xc9\x6f\x6d\x0e\x03\x2e\xf0\xa2\x26\xbd\xa2\xda\x84\x02\x53\xd5\x28\xb0\xf6\x2d\x5b\x83\x04\x46\x9e\x54\x6d\x3b\x22\x74\x49\xe0\xf3\xf1\x24\xf0\x04\x39\xde\x88\x04\xd6\xb6\x74\xb5\xe5\x15\x41\x20\x82\x40\x04\x81\x08\x02\x11\x04\x22\x08\x44\x10\x88\x20\x10\x41\x20\x82\x40\x04\x81\x08\x02\x11\x04\x22\x08\x44\x10\x88\x20\x10\x41\x60\x2f\x81\xc0\x1f\x1c\x84\x94\x00\x81\xf4\x45\x87\x1a\xbc\xab\x6a\xd3\x81\x50\x9b\xfc\xe3\x3e\xf2\x57\xfd\x40\xfc\x7b\x3c\x57\xc0\x26\x33\xf6\x8e\xb0\xdb\xce\x79\x8f\x57\x87\x38\xdc\x6a\x69\x7b\x29\xe4\x05\x9d\x9b\x82\x49\x4e\xe7\x4e\xc0\x71\x38\x1a\xe9\x11\xeb\xb7\x5a\x6d\xd4\xb7\xb6\x84\xb4\x5c\x88\x07\x7a\x07\x49\x56\x02\x3d\xbf\x2e\xd1\x49\x7d\x85\x47\x1f\x32\x3a\x64\x74\xc8\xe8\x90\xd1\x21\xa3\x43\x46\x87\x8c\x0e\x19\x1d\x32\x3a\x64\x74\xc8\xe8\x90\xd1\x21\xa3\x43\x46\x87\x8c\x0e\x19\x1d\x32\xba\x6e\x31\xba\x8f\x8d\xc2\xe3\x82\xd1\x2d\x95\xcc\x9b\x4c\x18\x5b\x66\x29\xe3\x6d\xee\x6b\x0f\xf2\x96\x2d\xdd\xb4\x74\x67\xad\x44\x57\x69\xa9\x6a\xdb\xe7\xc6\x37\x22\x7f\x34\x42\xbe\xd6\x0f\xf7\x07\x8a\x9b\x74\x4b\xf3\xc0\xde\x28\x8f\x76\x54\xbd\x53\x9d\x93\x45\xcf\xb2\xa2\xa7\x82\x45\xa7\x8f\xb3\xdb\xcf\x87\x14\x28\x51\x5f\xf4\xa3\x6d\x0e\x81\x54\x81\x67\x05\x9c\x9b\x87\x27\x38\x9c\xbb\x08\x33\x70\x21\x12\xce\x05\x9b\xd4\xa5\x73\xd1\x75\x8d\x85\x75\xff\x22\x1e\xc6\x3d\x43\x16\x24\x8c\x6b\xd4\x9d\x12\xcf\x35\xa8\x4a\xfd\x19\xdc\xc6\x81\x99\x92\x7f\xbd\x3b\xa6\xcb\x0f\xb8\xc1\x95\x9a\xee\xf5\x93\xf2\x89\x1e\xe8\xf8\xdc\x73\xf0\x2d\xf0\x86\x9a\xd8\x24\xed\xeb\x79\x0c\x55\x82\xa1\x98\x5a\x0c\xc5\xf4\xff\x24\xe0\x9a\x88\xa3\xf4\x0c\x2c\xf8\x71\x94\xba\x22\x97\x3a\x29\x0c\x7b\x5c\xe6\x95\x2b\x0e\xa4\xbf\x7a\x7b\x8c\xcc\xdb\x2b\x23\xa1\xaa\x8d\xc4\xdc\x09\x71\x53\x2f\x48\xb9\xce\x24\xb8\x41\xe1\x16\x23\xdc\x30\xc9\x42\x57\x92\x2c\x60\x74\x6d\x8c\xae\x8d\xd1\xb5\x3b\x15\x5d\x3b\xff\xf1\x44\x9b\x43\x0c\x5f\x11\xb9\xfb\x98\x56\xe1\xe7\xee\xeb\x70\xd8\x62\x25\x7c\xc5\xdf\x4d\x76\x8a\x66\x82\x4d\x55\x48\x72\x5f\xdd\x13\xa3\x71\x1c\xaf\x8b\x37\xd9\xf4\x76\x6b\x82\x07\x43\xdb\x64\x35\x04\x83\x50\x6e\x37\xe5\x07\x83\x50\x62\x10\xca\x4d\x0e\x42\xb9\xb9\x54\x2f\x36\x3a\xe5\x66\xae\x38\xf9\x0b\x70\x8e\x4c\xa5\x26\xbd\x68\x94\xfb\x82\x91\x2c\xa3\x4b\xaa\x0f\x6b\xd9\xf6\xa0\x93\xdf\xb8\x0a\xfb\xa2\x8e\x99\xd7\x44\x9a\xfc\xd5\xab\xe4\xdf\xed\xab\x3a\x5d\x9e\x6e\xec\x59\x1a\x8c\x47\x98\xbe\x97\xdd\xeb\x1d\x05\x0f\x5e\xea\x71\x5f\xd2\x1c\x7a\x59\xa2\x97\x25\xe6\x17\x46\x2f\x4b\xf4\xb2\x44\x2f\xcb\xed\xe3\x65\xd9\x43\xe9\x73\x7b\xc6\xcb\x12\xf3\xba\xa2\x97\x25\x7a\x59\xa2\x97\x25\x7a\x59\x6e\x46\x5e\xd7\x6d\xed\x14\x89\x89\x27\xb7\x73\xe2\xc9\xdc\x16\x74\x8a\xcc\x2f\xc2\x05\x01\x04\xcf\xc2\x69\x0e\x04\x8f\xc1\x11\x38\x14\x09\x04\x5d\xfe\xc4\xcd\x4c\xd5\xe9\x42\x36\x7c\x00\xf7\xd9\x78\xf8\x77\x94\x1c\x6e\x25\xb7\x06\xa4\xde\xb1\xbb\x8a\x89\xdd\x2d\xd6\x21\x45\xad\xc6\x5f\xf7\x89\x9f\x3b\x0b\xc0\x04\xaf\x3a\x0f\xd3\x90\xab\x31\xbe\x8c\xc3\x81\xf5\x36\x3c\x1a\x5d\xd0\x9d\xae\x45\x77\xba\xbf\x4d\xc0\x94\x98\xfa\x27\x61\x82\x4f\xfd\x43\xd0\xc2\x08\x84\xc7\x84\x4f\xde\x24\x9c\xf1\x7d\xf2\x5a\x2b\x69\x46\x58\xc1\x73\x70\x36\x60\x05\x6f\xad\xa8\x38\x59\xd4\x41\x59\xd3\x40\xce\x95\x4d\xdb\x81\xf4\x6f\x8f\x54\xc9\xa2\x87\xa5\x97\x43\xc0\x65\xa4\x26\xe7\x53\xfa\x51\x71\x8b\x27\x97\xa6\xbc\x5b\x3b\x28\xa1\x3a\xe3\x21\x87\x88\x16\x11\x2d\x22\x5a\x44\xb4\xdb\x07\xd1\xa2\x86\x16\xa3\xa1\xf5\x0e\xc3\x46\xef\xe4\xae\x78\x27\xa3\xa9\x00\x4d\x05\x68\x2a\x40\x53\x01\x9a\x0a\xb6\xb5\xa9\x00\x0f\xa9\xe0\x21\x15\x3c\xa4\xd2\xa9\x43\x2a\x68\x89\x43\x4b\xdc\x76\xb5\xc4\xe5\x8b\x6d\x3e\x9f\x15\x87\x93\xd3\xe1\xc8\xf7\x4e\x72\x87\x98\xcd\xbe\xa4\xed\xa8\x99\xab\xfd\x9e\xe7\xdf\x39\x04\x19\xe1\x79\xae\xe9\x76\xc1\x64\x7a\x49\x5d\x8a\x33\x6a\x68\x65\x53\x37\x1c\xbb\xa4\x17\xa8\x4d\x7e\x6f\x90\x7c\x76\x00\xf6\x78\xf7\x5f\x5b\xcd\x26\xd7\x9a\xcb\x70\x76\x4e\x96\x34\xcf\x4a\x6a\x53\x7a\xb3\x2c\x7f\x60\xda\xad\xcd\x42\xb6\xea\x25\xb3\xba\xed\x6c\xb5\xb0\xc9\x37\xda\x9f\xd4\x2c\x76\x80\x3f\x17\x3f\x68\x27\xc8\x31\x39\x68\x6b\x87\x8a\x1c\xb6\x55\x0d\x8f\xc9\xce\xd0\xc5\x1f\x03\x29\xa3\xfd\x08\xed\x47\x68\x3f\x42\xfb\x11\x06\x52\xc6\x40\xca\xc8\xed\x91\xdb\x23\xb7\x47\x6e\xdf\xeb\xdc\x1e\x03\x29\x63\x20\xe5\xad\x42\x2a\x31\x90\x72\x27\x02\x29\xff\xfa\x10\x1c\x60\x5d\xe7\x23\x40\xc3\x83\x67\x22\x34\x32\xff\xfb\xa5\x31\xde\x86\x16\xff\x02\xf2\xbd\x43\xe4\x43\x03\xb0\xb3\x60\x5a\xdc\xeb\x75\xb5\x39\x22\x38\xcb\x4a\xb8\xc2\x2e\xb4\x09\x07\xee\xe5\x0f\x4c\x99\x16\x5d\xc8\x7a\xc8\x4f\xf3\x5f\x33\xab\xdb\x0e\x02\xc0\x7a\x00\xd8\x0c\xa1\xbb\x3e\x1b\x4f\x09\x87\xc9\xa0\xa4\x84\xa9\x94\xe4\x82\x7e\xe3\x57\xc3\x6c\xe4\x7d\xc8\xfb\x90\xf7\x21\xef\x43\xde\x87\xbc\x0f\x79\x1f\xf2\x3e\xe4\x7d\xc8\xfb\x90\xf7\x21\xef\x43\xde\xd7\x5d\xde\xf7\x02\x3c\x4f\xae\xa6\x9e\xf5\xe2\x62\x4e\xc8\x37\x8b\x23\xd3\x4c\xc1\xa9\x38\xcb\x8a\x5d\x30\xcb\x74\x44\xb1\x2b\x85\x65\xd6\xfa\x5c\x83\xa5\xea\x8a\xe0\x13\x65\xcb\xe4\x5f\x9a\xda\xed\xd1\x81\x4e\x06\xcc\x44\xa2\x88\x44\x11\x89\xe2\x16\x22\x8a\xff\x66\x08\xb2\xc2\xcd\x50\x65\xdb\xba\xa2\xce\x83\x9a\xb3\xbb\x6b\x9d\x0d\x25\x52\xe0\x9e\x86\xbf\x3d\x48\x7e\x75\x00\x48\xcd\x23\xeb\xa0\x8b\x93\x73\x33\xf3\xa2\xb0\x36\xd1\xc5\x47\xf8\x03\x93\xd5\x15\x5a\xc8\xfa\xef\x41\xbc\x18\x8e\x17\x5f\x88\x27\x87\xa7\xc8\x09\x49\x0e\xc3\xc7\x48\x15\x3c\x14\x64\xd1\x6f\x77\x74\x31\x44\xe4\x88\xc8\x11\x91\x23\x22\x47\x44\x8e\x88\x1c\x11\x39\x22\x72\x44\xe4\x88\xc8\x11\x91\x23\x22\xc7\x9e\x44\x8e\x08\x04\x11\x08\x22\x10\xdc\xc6\x40\xf0\xe7\xf7\xc0\xbc\x04\x82\x92\x15\xd5\xe0\x40\x9e\xb3\x2b\xd2\xef\xd0\x2c\xa8\x25\xbb\xc2\xa5\x95\x5a\x28\x50\xdb\x66\x3b\x0a\x7a\xd3\x26\x7f\xf6\xaa\xd4\x3f\xee\x80\xbb\xab\x0a\xf5\x32\x4a\x3e\xec\x45\x05\x9e\x65\x05\xcc\x8b\x02\x26\x79\x01\x57\x78\x01\xe9\x93\xe2\x96\xc9\xe0\xf3\x32\x67\x64\xc0\x9b\x30\xe2\xe9\x4d\x4e\xd4\x5f\xdd\x92\x6e\x3a\xb7\xa8\xca\xe6\x7f\xba\x6f\x7d\xb9\xe2\xd6\x57\x7c\x0b\xa9\xdc\xd7\xf9\x82\x17\x44\x34\xd9\x37\xc0\xd3\x81\x68\xb2\x6d\x7d\x43\x1c\xd4\x7c\x63\x3c\xd4\xbc\x44\x66\xeb\x12\xd1\xb9\x94\x33\x64\xe0\xbb\x1e\x93\x51\x35\x8a\x8b\x3d\x9b\xc7\x60\x84\x8d\x83\x11\xe6\x31\x5c\x74\x44\xb8\xe8\xad\x67\x05\x26\x3f\x9f\x86\xb3\x62\x11\xa1\x2f\x3a\xd4\xe0\xeb\x7d\xdc\xd2\xa1\x1b\x45\x8b\x0d\x0e\xf9\xeb\x4b\xe4\x9f\x87\xc9\xdb\xfa\x81\xf8\x25\x78\xcb\x45\xd2\xa2\xaa\x56\xc3\x35\x67\xc4\xe3\xe9\x7d\xec\xda\x39\xef\x99\xba\x25\x42\xde\xd7\xde\x15\x21\xaf\xc2\x79\x21\xb1\xcf\xc0\x29\x2e\xb1\x8f\xc2\x61\x38\x18\x29\xee\xfc\x6f\xf2\x64\x9d\xac\x57\xac\x68\x7b\x20\x5c\xce\xdc\x46\x06\x8a\xd4\x81\xeb\x0b\xf1\x92\xef\x20\xc9\x4a\x41\xe7\x57\x43\x8a\x37\xb7\x12\x75\x92\x31\xf9\xfb\xbb\x42\x7b\xe2\x01\x8b\x96\x4b\x6a\xa1\x36\x03\xb4\xdb\x19\xc3\xf2\x72\xb7\xfb\x23\x37\x03\x17\xe0\x5c\xcd\x0a\xdd\x5a\x87\x60\x14\x59\x8c\xf3\xdf\xa2\xe0\xfe\x70\xa2\x6d\x52\xe1\xa2\xd0\xd9\xa6\x21\xe7\xeb\x6c\x9b\x20\x62\xca\x95\xce\x89\x98\xf4\xf7\xdd\x1e\x2a\x62\x64\x20\x27\x36\xe6\x5d\xb1\x32\x24\x7e\xea\xba\x54\xe9\x4c\x60\x7e\x14\x30\x31\x02\x06\x83\x43\x77\x25\x38\x34\x46\x05\xc5\xa8\xa0\x18\x15\xb4\x53\x51\x41\xf3\x1f\x4f\xc0\x15\x01\x46\x2e\xc2\x4c\x00\x8c\x74\x28\x40\x62\x7b\xe3\x30\xba\xaa\x81\x12\xae\x1a\xec\x26\x3b\x45\x33\x35\xab\x1d\xc4\xe8\x02\xf5\xca\x43\xee\x5f\xed\x09\xd5\x0e\xf6\x95\x55\xcb\xd1\xb9\x4b\x8a\xe0\xa0\x11\x3b\x91\xc1\x32\x77\x89\xeb\xa2\xc6\x70\x5f\x6d\x41\xa3\xbc\x0a\xfb\xd9\x9f\x13\xf7\x07\x2f\xae\x50\xab\x48\x83\x57\xf7\x05\xaf\x72\x67\x3b\x5a\xd4\x0b\xa3\x75\xf7\x55\x95\xc2\xfe\x5e\x93\x57\x59\x2d\x73\x97\x60\x16\xf2\x35\x7b\xa0\x09\x38\xd6\xc2\x18\x98\xe3\x2e\x5b\xa8\xa7\xc4\xe8\x29\x1f\xe9\x87\x0f\xf5\x93\x0f\xf6\x27\xdf\xef\x09\xfb\xb7\xf4\x6f\x9f\x8d\x50\x8d\x95\x9b\xb5\x33\xf7\xda\xe2\x9e\x18\x6c\x70\xfa\xbe\x9b\x43\x11\x03\x77\x98\xaf\x59\xc2\xc9\x4f\x2d\xf1\x27\x99\x72\x26\x9e\xe6\x77\x70\x45\xc9\x56\x86\xf2\xb6\x69\xcc\x09\x27\xc6\xc7\xd9\xb4\x90\x7f\xcf\xbb\x93\xc5\xff\x71\x38\x7a\x87\x96\x7b\x25\x01\x9f\x4e\x90\x97\x13\xc9\x4f\x79\x06\x9a\x0f\x24\xce\x9b\x56\x81\xeb\x70\x45\x93\x37\xbb\xa9\xa4\x96\xd8\x4f\x29\x65\xb2\xea\x2b\xb8\xe9\x4d\xa8\x5b\x15\xdb\x77\xd7\x1a\x55\x0b\xfc\xc3\xb9\x13\x5c\x49\x2f\xc8\xe5\x94\x96\x34\x5b\x31\x6f\xca\x36\x15\x4e\x62\x65\x6a\x96\x4b\x34\xa3\x88\x37\x72\xaf\x53\xb7\x2f\xb9\x09\x2c\xb4\x01\xbc\xd7\xa7\x76\xf0\x6a\x55\x79\x50\x76\x8f\x43\x3d\x14\xbe\x12\xec\x22\xb7\xf1\x6a\x76\x6c\x9b\x98\x3f\x04\xe3\xe4\x40\x2a\xe3\xe1\xd0\x3b\xf9\x7c\x92\x93\x5b\x3e\x96\x1a\x60\x3f\x06\x11\xe7\x16\x84\xa8\x5f\x24\x70\xd4\x0d\xf6\x11\xc1\x4c\xcb\xa6\xe6\xe2\xd2\xb1\xb2\x65\xbe\xb8\x36\xf6\x2f\xd8\xd7\xbd\x44\xde\x47\xc8\xf7\xf5\xf9\x31\x3f\x1e\x29\x98\x86\xc1\x3e\xf7\xc2\xb9\x27\xfd\x59\xe8\x98\x0a\x7f\x88\x35\xde\x9c\xa9\xa5\xd3\xf2\x2e\x11\xa3\xe3\x02\x75\xfc\xd5\x71\xce\xd4\xe6\xd8\xad\x4f\xeb\xce\xf2\x9c\xea\x2c\x8f\xb3\xfd\xb0\x40\x9f\x47\xe1\x7e\x31\xe4\xee\x86\x3b\xf9\x90\x7b\x35\xbc\xea\xc7\x12\xbb\x40\x7e\x49\xec\x40\x7a\x38\x7c\x20\x01\xd9\x25\xab\x03\xd7\x9f\x88\x1f\x4a\x19\x32\x52\x1b\xdd\xc2\xad\xb3\xdc\x67\x57\x79\xa9\x27\x43\x5b\x67\xee\xa9\xa6\x5b\x67\xae\x72\x0b\xb7\x4e\xea\xff\x0a\xb4\xce\xa3\x5e\xeb\x5c\x9e\x6f\xd0\x3c\xfb\xab\x9b\xc7\xb4\x6f\xe1\xf6\x49\xff\x60\xa0\x7d\x06\xdd\xf6\x99\x3e\x37\x7b\xee\xc9\x73\xd1\x2d\x34\x5a\xd5\x42\x82\x01\x6d\xad\x36\x0a\xb6\x41\x5c\x7b\x8d\xff\x50\xa0\x8d\x86\xdc\x36\xba\x3c\xf7\xe4\xcc\xe5\x4b\xf3\xd1\x8d\x94\xa9\x6a\x24\x59\x58\x57\x5a\xa9\xfd\x4d\xd0\x44\xc3\x4f\x84\xce\xb4\xc7\xce\x4d\x4e\x37\x3b\xd3\x1e\xa3\xaa\xb6\xb5\x46\xd1\x7a\x66\x5a\xee\xfb\x03\xed\xb3\xcf\x93\x44\x93\x4f\x4e\x3d\x16\xdd\x40\x23\xd5\xa2\x88\xa9\x23\x3d\x34\x82\xd6\xf3\xf9\x4d\x34\x7a\xfe\x24\x4c\x90\x63\xa9\x23\x9e\x66\x73\x5f\x50\x1f\xaa\x29\x7c\x33\xf4\xa2\xc3\x70\x90\x64\x53\x63\xde\x1b\xee\x62\xff\xba\x3e\x4f\x2e\x35\x4a\xf1\x6b\xc1\xc7\x54\xb8\x46\x9e\x4b\x7e\x8b\xab\x4e\x4d\xb2\xbe\xe2\x2e\xb2\xcb\x54\x79\xea\xca\xac\xe2\x96\x52\xb1\xa9\x87\x53\x0b\x15\xcb\xa2\x86\x23\x47\x83\xeb\x26\xc8\x86\x87\xa9\x65\xc4\x2b\x82\x0a\xd6\x6f\xdd\x0b\xa7\xdc\xb3\x8f\x65\xbb\x81\x9a\xa5\xa9\x74\x85\x6d\x2e\x1d\x4f\xd9\xb2\x39\x15\x21\xdf\x75\x2f\xf9\xdb\x3e\xd8\xc9\x1e\xe7\x03\x94\xdb\xa5\xc5\x35\xb7\x07\x7c\x14\x31\xcd\x4b\x99\xa7\x4e\x7a\x2f\xbb\x6f\xb2\x5c\xb6\x83\x91\xd0\xbc\xcb\x82\xb8\xb4\xd9\x40\xfd\x0c\x9c\x12\x63\xfb\x08\x1c\xe2\x63\x3b\x03\x23\x90\x8e\xf6\xc7\x29\x97\x6d\x6e\xa9\x70\x2b\xb5\x51\xbb\xf4\xe3\xf1\x73\x23\x4d\x86\x42\xa4\x2b\xab\x89\x9c\x29\x7e\x65\x92\x3f\xb3\xcb\x6f\x75\xd7\xc8\xdc\x44\xc3\xef\x93\xb7\x76\xb5\xed\x73\x67\xe1\x34\x9c\xac\x01\x31\xeb\x6a\x7c\x44\x2f\x68\x83\x6e\xd1\x06\xfd\x1f\x13\x1b\x9d\xf8\x39\x61\x7a\x3e\x01\xc7\x7d\xd3\x73\xf7\x84\x07\xb7\x38\x37\x27\x3c\x1a\x09\x8c\x2a\x9d\xe2\x6f\x5e\xe5\x0b\x8f\xf1\x3a\x7e\x1c\x2f\x45\x1e\x29\x8b\xb3\xe6\x5d\x92\x21\x08\x92\xb7\x9b\x34\x43\x90\x8c\x20\x79\x93\x41\x72\xc7\xf5\xc5\x58\x7e\xdc\x5e\xa1\x9f\x3f\x02\x87\xc8\x78\xea\x80\xb7\x0d\xb9\x3b\xb8\x4d\xf2\x9e\xb9\x25\xc0\xf1\xcf\x0e\xc3\x65\xef\x08\x87\x69\x17\xd4\x92\x6e\x14\xc7\x56\xc7\x85\xfb\x6d\xc3\xb8\xd1\xbc\x93\xd8\x94\x2e\x95\x4d\xcd\x7d\x9a\x5a\x36\xf9\xca\x10\xf9\xc7\x01\xb8\x33\x50\xe0\x35\x59\x60\xf2\x2d\x89\xe6\x62\xbe\x3c\xe6\x95\x3d\x67\x6a\x93\x5e\xd9\x6d\x0a\x00\x73\x52\x04\x80\xf1\xeb\xb7\x30\x5e\x63\xe1\x8d\x78\xff\xd6\x08\x0c\x13\x69\xe6\x6f\x7b\xc4\x98\x75\xc5\x9d\x2e\xc6\x4f\xd2\x69\x92\xf3\xcf\x55\xb8\x9d\x23\xe7\x6a\x44\x97\x04\x66\xee\xb8\xb4\xfa\x60\x7c\x18\x8c\x0f\x83\xf1\x61\x30\x3e\x0c\xc6\x87\xc1\xf8\x30\x18\x1f\x06\xe3\xc3\x60\x7c\x18\x8c\x0f\x83\xf1\x61\x30\x3e\x0c\xc6\x87\xe9\x6e\x7c\x98\xad\x87\x43\x30\x02\x0d\x46\xa0\xc1\x08\x34\x5b\x28\x02\xcd\x5b\x87\xe1\x9c\xc0\x97\x9a\x6e\x17\x4c\x26\x56\xeb\x82\x51\x47\xe0\x4b\x6a\x68\x65\x53\x37\x1c\xbb\xc4\xc3\x54\x7f\x7c\x88\xfc\xda\x00\xec\xf1\x8a\xb9\xb6\x9a\x4d\xae\x35\x07\x2b\xcf\xc9\x92\xe6\x4b\xed\x8b\x51\xbd\x9f\x3f\x30\xed\xd6\x26\x68\x3c\xac\x7a\xdd\xd6\x20\x92\x3d\x9a\x09\xef\xb9\x78\x22\x39\x41\x8e\x49\x22\x59\x3b\xc0\x24\x96\xac\xea\x0d\x4c\x8d\x87\x1c\x12\x39\x24\x72\x48\xe4\x90\xc8\x21\x91\x43\x22\x87\x44\x0e\x89\x1c\x12\x39\x24\x72\x48\xe4\x90\xc8\x21\x91\x43\x22\x87\x44\x0e\x79\x8b\x72\xc8\x97\x87\x61\x52\x06\x31\xe5\xf0\xa6\x69\x08\xc9\xef\x76\xa3\x98\xbe\x79\x98\xfc\xfe\x00\xec\x16\x3f\x5e\x5b\xcd\x26\x3f\x24\xdd\x25\x83\xd8\xd1\x70\x05\xa7\xb9\xa4\xdc\xd0\x0d\x4d\xe1\x40\xac\x2d\xd8\x71\xc4\x57\x91\xb8\x1a\x28\x17\x54\xa6\x65\xf9\xba\xdf\x60\x95\xba\x1d\x28\x3b\x93\xbe\xff\xa6\x07\xe8\xaa\x8e\x3b\xf0\x5f\x90\x52\xae\xc7\xb1\xf9\xa6\x70\x6c\xbe\x12\x4f\x28\xc7\xc8\xa8\x1b\x18\x23\x38\xf4\x5c\x3c\xc9\xeb\x81\x58\x12\xb1\x24\x62\x49\xc4\x92\x88\x25\x11\x4b\x22\x96\x44\x2c\x89\x58\x12\xb1\x24\x62\x49\xc4\x92\x88\x25\x37\x11\x4b\x8e\xc3\x01\x92\x49\x8d\x78\x58\xf2\x8e\xe0\x29\x53\xbe\x6f\xbb\x15\x4e\x98\x22\xca\x44\x94\x89\x28\x73\x0b\xa1\xcc\x7f\x1c\x84\xa1\x70\x94\x19\x3c\x13\x2e\xae\x91\x5f\x1b\x24\xff\x63\x00\x5e\xe3\x11\x4b\x71\xca\xfb\x8d\x4d\xfa\x4d\xb6\x0d\x5c\xba\xfe\x92\x2e\x7a\xe4\xd5\xe0\xff\x33\xab\xdb\xce\x79\xd3\x9a\x2c\x95\x3c\x1c\xd9\xbe\x70\x2b\xb7\x10\x89\x6c\xca\x5f\xf2\xe9\x78\x1a\x79\x88\x8c\xaf\x87\x46\xe2\x89\x6d\x44\x92\x88\x24\x11\x49\x22\x92\x44\x24\x89\x48\x12\x91\x24\x22\x49\x44\x92\x88\x24\x11\x49\x22\x92\xdc\x14\x24\x89\xf0\x0f\xe1\x1f\xc2\xbf\x6d\x0c\xff\x7e\xa8\x1f\xf6\xcb\x70\x90\x1a\x53\x65\x75\xd3\xb0\x68\x51\xe7\xe1\x80\xd9\x33\x35\x2c\x90\xfc\x6d\x1f\xf9\x5a\x1f\x3c\x10\x7a\xb3\x87\x03\xef\x29\x52\xa7\x7a\x15\x16\xdf\x97\xde\x5f\xa4\xce\x64\xd8\xa3\x92\xe0\x4d\xce\xcd\xb8\x9b\xc0\x36\xc6\x48\xae\x2b\x68\xa2\xae\xa0\x89\x66\x0a\xca\x97\xe1\x29\xc1\xe9\x2e\xc1\x2c\xe7\x74\xe7\x61\x1a\x72\x2d\x70\xba\xc0\x77\xce\xea\x76\x2c\xac\x23\x9f\x1b\x76\x53\xe6\x2f\x72\x18\x5b\x8d\x66\x23\x5c\x4d\x0b\x96\x69\x5c\x37\x17\x3d\x67\xd3\x7f\x3b\x4c\xfe\x7c\x00\x5e\xcd\x4b\xf0\xba\xea\xc3\xcd\x38\x9c\x4e\x59\xa6\x91\x37\x17\x7b\xc2\xe5\x34\xc5\x5f\x97\x63\xff\xd4\xa5\x69\x94\xf5\xec\x7d\xdc\xdb\xfd\x80\x9d\xeb\x4a\x3f\xc2\x87\x88\x24\xb8\xb2\x4d\xeb\x19\x6e\xac\x2f\x2b\x42\x5e\x84\xbc\x08\x79\x11\xf2\x22\xe4\x45\xc8\x8b\x90\x17\x21\x2f\x42\x5e\x84\xbc\x08\x79\x11\xf2\x22\xe4\xed\x32\xe4\x6d\x98\x14\x5b\xee\xef\xd0\xf3\x14\xe1\x33\xc2\x67\x84\xcf\x5d\x85\xcf\x1f\xbb\x03\x1e\xf6\x92\xd8\x9b\x1a\x0d\x4f\x57\xff\xef\xee\x20\xdf\x1d\x96\x08\x39\x32\x5d\xfd\x25\x53\xa3\xe9\x87\xeb\xf2\xd5\x9b\x1a\xed\x54\x72\xdf\x75\x9d\xda\xf6\x92\xfb\x7a\x35\x6a\x31\xbb\x6f\x32\xb4\x59\x22\xf3\xd4\x87\x34\xcb\x5c\xa5\xa3\xcd\xd2\x44\x56\xe8\xe6\x5a\xae\x51\x62\xed\xba\x56\x4c\xbd\x3b\x34\x2d\x74\x64\x82\x7a\xde\x2e\xa9\xfa\x0c\xf5\x5b\xa1\x61\xd6\x35\xa4\xd2\xdf\x1b\x96\x75\xbd\x51\x66\x7a\xde\x34\x8f\x84\xa5\xa6\xbf\xe5\x26\xd3\xf8\x7f\x0c\x34\xce\x70\x53\x29\xe9\x79\xeb\x3c\x1a\x9a\x93\xfe\x96\x6b\x9e\x89\xd0\x49\x15\x9d\x8b\x3e\x64\x52\xf1\x64\xf4\xb7\xdc\xa4\xca\xbd\x27\xd0\x30\x83\x4d\x24\xa1\xe7\x2d\xb3\x37\x24\x0b\xfd\x2d\xd7\x34\xf9\x53\x70\x82\x1c\x4f\x1d\xf5\xb6\x10\xf7\x07\x37\x1e\xb5\x8f\xd6\xef\x40\x5a\x4c\x0e\xbf\x08\x2f\x90\xe7\x93\x57\x5d\x2d\x28\xb7\xa1\xe4\xf0\x4c\x2d\x09\xc9\x0e\xff\xb6\x41\xb8\x3f\xcc\x20\xeb\xda\x5c\xc9\x1f\xef\x23\xbf\xd3\x5f\x6b\x6c\x7d\x54\x20\x36\x4b\xc2\x01\x77\xf7\x58\x63\x66\x4d\x0f\xb2\xdb\x82\x16\x4e\x79\x61\xab\x1d\x6b\x79\x01\xce\x89\x51\x7b\x1a\x4e\xf2\x51\x7b\x04\x0e\xc1\x78\x64\x9a\x50\xde\x56\x19\xd9\x56\x19\xf9\xcd\xcd\x98\xc7\xaf\x3f\x18\x3e\xbc\x77\x92\x1d\xe2\x18\x4b\x73\xc6\xcf\x3a\x0b\x67\x03\x6b\x28\xda\x36\xd1\xb6\x89\xb6\x4d\xb4\x6d\xa2\x6d\x13\x6d\x9b\x68\xdb\x44\xdb\x26\xda\x36\xd1\xb6\x89\xb6\x4d\xb4\x6d\xa2\x6d\x13\x0f\xb0\xa0\x0d\x11\x6d\x88\x68\x43\xec\x96\x0d\xf1\xc7\x87\xe1\x09\x41\xe2\xac\x45\xb5\x90\x71\xe1\x50\xe8\xe9\x95\x86\xc7\x25\x2c\xb3\x44\x17\x75\x43\xd3\x8d\xa2\x4d\x7e\x77\x88\x7c\x75\x00\xee\x65\x45\x4e\x06\x4b\xf4\x50\xde\xcd\xe6\x22\xde\x5c\x31\x4b\x34\x27\x0a\x6d\x53\xdc\x9b\x23\xfc\x81\x2b\xb5\x15\xab\x3b\x0b\x11\x78\x33\xa6\x0c\xdc\x40\x08\x1c\x3d\x9e\x1d\x9e\x27\xd3\x82\x0e\x06\xda\xbc\xfe\xbc\x84\xa4\x89\x91\xa3\x14\x99\x22\x32\x45\x64\x8a\xc8\x14\x91\x29\x22\x53\x44\xa6\x88\x4c\x11\x99\x22\x32\x45\x64\x8a\xc8\x14\x91\x29\x62\xfa\x40\xa4\x96\x48\x2d\x91\x5a\xde\x42\xd4\xf2\xdf\x0f\x43\xbe\x6d\xd4\xd2\x26\x2f\x0f\x91\xdf\x69\x88\x2b\xcb\xcd\xe3\xca\x36\x71\xca\xb1\x75\x70\x4a\x04\x94\xe1\x80\x72\x31\x9e\x3d\x9e\x21\xa7\x62\xc1\xa2\x0f\x27\x43\xa2\xb8\x34\x03\x41\x91\x4c\x22\x99\x44\x32\x89\x64\x12\xc9\x24\x92\x49\x24\x93\x48\x26\x91\x4c\x22\x99\x44\x32\x89\x64\x12\xc9\x24\x92\x49\x24\x93\x48\x26\x91\x4c\xde\x3a\x64\xf2\xcb\x83\xf0\x90\x1b\x93\x45\x90\xc7\x32\xbb\x9b\xcb\xee\x55\xb3\x54\x59\xa1\x36\xf9\xe4\x20\xf9\x89\x01\xff\xd4\xfb\xb7\x36\x07\x17\xe7\xbc\x72\x16\x78\x39\x6d\x02\x8d\x0f\xf1\x07\xe4\x41\xfa\x9a\x57\x6c\x0d\xb0\xd8\xfd\x68\xd0\x1b\x8f\xba\x52\xdb\xd2\x08\x12\x11\x24\x22\x48\x44\x90\x88\x20\x11\x41\x22\x82\x44\x04\x89\x08\x12\x11\x24\x22\x48\x44\x90\x88\x20\xb1\x27\x41\x22\x62\x3e\xc4\x7c\x88\xf9\xb6\x31\xe6\xfb\x52\x1a\xce\x0b\x07\xc4\x82\x69\x5a\x9a\x6e\x84\xba\x1e\x46\x38\x1d\x96\xa8\x6a\x7b\xc1\x9a\xc9\xbb\xd3\xe4\xdf\xf4\xc3\x5d\xc1\x72\x3c\xbf\xc3\xd7\x5b\x54\xd5\x6a\xb6\xa6\xb3\xec\xe9\xf4\x3e\x76\x65\x2a\xf0\x4c\x9d\x67\x20\xbf\xaf\x7d\x59\x00\x39\x6c\x53\xe1\xbc\x60\x6a\x67\xe0\x14\x67\x6a\x47\xe1\x30\x1c\x8c\x0c\x49\x58\xd5\x36\x6e\x64\x42\x5e\xaf\x58\xdf\xbd\x07\xc2\x71\xd8\x6d\x64\xa0\x48\x1d\xb8\xfe\x5c\x3c\x81\x9b\x20\xc7\x24\x75\x0b\xe9\x22\x89\xe1\x44\x5d\xea\xbc\xfa\x92\x7f\xb2\x2b\xa2\x43\xee\xb3\x68\xb9\xa4\x16\x68\x68\x9f\x0c\xcb\x8b\xdd\xee\x96\xdc\x0c\x5c\x80\x73\x64\x60\xd1\xd4\xd6\x92\xfc\x5f\x25\x91\x6e\xad\x5f\x72\xef\xed\x83\xef\xeb\x23\xef\xe9\x4b\x7e\x8f\x27\x8a\xff\x3e\xf1\x34\x5b\xd3\xe4\x62\x3a\xc2\x41\x75\x81\x6d\x99\x85\xec\xac\xda\xc0\x05\xa1\xde\x22\x55\x5c\xf6\xad\x65\x94\x49\x43\xd1\x0d\x81\x4e\x4c\x4b\xa9\x18\x1e\x7d\xd1\x14\xcd\x5a\xbb\x52\x31\x14\x4d\xb7\x28\x13\x18\xd4\xdb\xd2\xb3\x95\x99\xab\x3e\x92\x69\xb8\x3b\x18\xb9\x8b\x54\x96\x2a\x16\xd7\x92\xcb\x96\x59\xa0\x36\xd7\x51\xa4\x7c\x92\x8b\x5f\x46\x59\xe0\x6f\xe4\xbb\x0f\xae\x54\x4c\x28\xa3\xca\x64\xa9\x34\xc1\x35\x10\xcd\x5a\x53\xac\x8a\xc1\x76\xb7\x4c\xc2\xb8\x6a\x97\x2c\x8e\x6a\xa9\xdb\x44\xd5\x02\xe2\x34\xf7\xee\x3e\xf8\xae\x3e\xf2\xae\xbe\xe4\x77\x78\x0d\xf4\x67\x09\xae\xb4\x3e\xae\x1a\x6a\x91\x5a\x62\xfb\x25\x4c\x8a\xb6\x6d\x16\x74\xae\x51\x78\x1b\x1d\x95\xef\x14\x4d\x4b\x61\x0a\xa7\xb3\xe6\xa9\x58\x2b\xea\x0d\x56\x7f\x67\x99\xda\xd4\x95\x79\x4c\x0e\xbb\x08\x8a\x53\x98\x45\xaa\x70\x69\xcb\x37\x35\xa6\xa5\x64\xc7\x8f\xb1\x7b\x2d\xb5\xc0\x59\x59\xc9\x34\x8a\x42\xc2\xf1\x8d\x07\xd3\x11\x55\xdd\x10\x8a\x07\x57\xec\xfd\x7b\x39\x3f\x90\x24\x8f\x6d\x47\xdd\x55\xab\x68\x96\x54\xa3\x98\x31\xad\xe2\x58\xf9\x46\x71\xac\x62\xe8\x05\x53\xa3\x63\x7b\x67\xec\x39\x56\x4a\x26\xb5\x27\xf8\xad\xc1\x75\xe6\xc3\x89\xb6\x09\x87\x8b\xac\x9c\x2c\x99\x86\x1c\xec\x9c\x12\xba\xf4\x66\x48\x9a\x72\xa5\xe3\x92\x26\xfd\x83\xb7\x47\x48\x9a\xd7\x88\xed\x82\xa2\x4a\xe1\x32\x24\xfe\xbf\xeb\xb2\xe5\x49\xb8\x02\x73\x41\xd9\x92\xce\xc1\xd9\x16\xac\x28\x22\xf0\xb9\x0c\x56\x8c\x62\x26\x4e\xcc\x7c\xb9\x0f\xbe\xd4\x47\xbe\xd8\x97\xfc\x82\xd7\x40\x1f\xed\x7b\x32\xa8\x89\xe9\x6c\x43\xc0\xb5\x29\x65\x91\x2e\x09\xab\x8c\xb7\x05\xf2\xd1\xbf\xdc\x75\xf2\x2a\x06\xc4\x88\x61\x1a\xa3\x06\x2d\xaa\xbc\x21\xa4\x32\x16\x14\x37\x02\x86\x78\x5d\x20\x07\xa3\xbe\xb2\x42\x35\x26\xd0\x4a\x6b\xbe\xb9\xc4\x47\xe4\x7a\x69\x44\xea\x68\x5c\x4b\x55\x8a\x16\x5b\x2a\xcb\xd4\xd2\x4d\xcd\xd3\x35\xfd\x55\x93\x5b\xa2\xdc\xd6\xa8\xd8\xac\x92\x41\xfd\x56\x65\x4f\xba\x1f\x24\x5f\xb2\x24\xb0\x80\x5b\x44\x46\xd4\x73\x85\xaa\x46\x68\x1d\x53\x84\x57\x61\x8e\xd7\x20\x44\xf7\xcc\x7d\xa6\x0f\x5e\xe9\x23\x9f\xee\x4b\xbe\xec\x35\xf3\x0f\xf4\x4d\x07\xec\xaa\x65\xae\xac\x79\x0c\x67\xce\x32\xcb\x6a\x91\x77\xc0\x9c\x59\xd2\x0b\x6b\x55\x66\x1c\xf7\x5b\x7c\xc3\x2c\xeb\xa5\x6c\xe6\x68\x46\x99\x17\x1d\x22\x5a\xa7\xcc\xb6\x1e\x6c\xfb\xe6\xe2\x40\xaa\x98\x56\x79\x59\x35\x5c\xb3\x92\x55\xa1\x63\x4b\x6a\xc9\xc5\xe7\x29\x71\x35\xa5\x2c\xe9\x86\x5a\xd2\xdf\xe4\x72\xb8\x45\xca\x74\x5b\xbe\xd9\x19\x13\x3a\xad\xe6\xb3\x59\x51\xf8\xa0\xed\x3f\x24\x80\x75\x46\x39\xa7\xf3\xe1\x1c\xa8\xb8\x69\xd5\x7f\x99\xbf\x71\x74\x04\x2f\xe7\x93\xcd\x74\x96\x33\xa9\xdb\x45\x7d\xa6\xdd\x0f\xa9\xb2\x4f\xe5\xde\x3e\x00\x6f\x1d\x20\x6f\x1e\x48\x7e\xd3\x33\x52\x7e\xbe\xff\x69\x09\xb4\xd8\x94\x62\x3b\xb7\xa2\x6a\x2d\xaa\x45\xaa\x14\xcc\x52\x89\x72\x89\xeb\xcf\x0b\x6a\x2d\x99\xd6\x0a\x6b\x8b\xd0\x9a\x5e\xae\x79\x79\x74\x45\xf9\x78\x76\x07\x63\x59\x7c\x95\xce\x06\x4a\x41\xd7\x7c\x32\xcd\x21\x27\xb7\x13\x78\xad\xcb\xf6\x72\x12\x01\xba\x18\x33\x13\x68\x46\x17\x80\x79\xbb\x35\xcf\x34\x59\xfd\xb2\x8c\x32\x59\x60\x1b\x3b\xbe\xf6\x06\x85\xc3\xa0\xf8\x86\x41\x65\x54\x76\x7c\xf5\xc0\xb0\x4f\x28\x83\x39\xb5\x70\x83\xad\x2a\x86\xc6\xee\xe2\x36\x41\x7e\x53\x4d\xc3\x09\xea\x2c\x87\x7e\x75\x21\xee\x17\x2c\x7a\x25\x9d\x50\x06\xcf\x9b\x16\x0d\x14\xab\x14\x54\xbb\xa0\x6a\xec\xeb\x65\xfb\x08\x2b\x30\x2f\xcf\x16\xd2\xab\xae\xc0\x25\xaf\x8c\x4c\xea\x8e\x72\xed\xb8\x09\xea\x04\x1f\x4f\xc0\x15\xb6\x96\x8f\x93\x8b\x30\x03\xbb\x44\x6b\x50\x8d\x9c\x82\x13\x70\xbc\x85\x45\x64\xde\x51\x9d\x8a\x1d\x6d\xf1\x9f\x15\x0a\xc8\x39\x98\xe2\x0a\xc8\xc6\x5e\xe3\x2a\x08\x4a\xb8\x82\xb0\x9b\xec\x14\xcd\xd4\x69\x1d\x21\xf7\x1d\x7b\x22\x74\x84\x47\xca\xaa\xe5\xe8\xdc\xd2\x28\xb6\xb7\xa1\xdb\x92\xc1\xb2\xf0\xf0\xe8\x9e\xe2\x70\x5f\x6d\x41\xa3\xbc\x0a\xfb\x79\xf2\xf8\xfb\x83\x17\x57\xa8\x55\xa4\xc1\xab\xfb\x82\x57\x79\x7a\x7b\x5a\xd4\x0b\xa3\x75\xf7\x55\x95\xc2\xfe\x5e\x93\x57\x59\x2d\x73\x97\x60\x16\xf2\x35\x1b\xa2\x09\x38\xd6\xc2\x50\xe0\xb9\x25\x50\x5d\x89\x53\x57\x3e\xd2\x0f\x1f\xea\x27\x1f\xec\x4f\xbe\xdf\x93\xf9\x6f\xe9\xdf\x3e\xbb\xa2\x1a\xd3\x05\x6b\x67\x6e\x8a\xe7\xe6\x35\x36\x38\x7d\x87\x9c\xa1\x88\x81\x3b\xcc\x97\x2e\xe1\xb9\xa1\x96\xf8\x93\x4c\x47\x13\x4f\xf3\x3b\xb8\xbe\x64\x2b\x43\x79\xdb\x34\xe6\x84\x67\xca\xe3\x6c\x5a\xc8\xbf\xe7\xdd\xc9\xe2\xff\x38\x1c\xbd\x5d\xcb\xbd\x92\x80\x4f\x27\xc8\xcb\x89\xe4\xa7\x3c\xea\xf6\x81\xc4\x79\xd3\x2a\x70\x55\xae\x68\xf2\x66\x37\x95\xd4\x12\xfb\x29\xa5\x4c\x56\x7d\x05\xe7\xa9\x42\xeb\xaa\xd8\xbe\x0d\x7e\x54\x2d\xf0\x0f\xe7\x9e\x0d\x25\xbd\x20\x57\x55\x5a\xd2\x6c\xc5\xbc\x29\xdb\x54\x58\xfe\xcb\xd4\x2c\x97\x68\x46\x11\x6f\xe4\xae\x44\x6e\x5f\x72\xae\x19\xda\x00\xde\xeb\x53\x3b\x78\xb5\xaa\xdc\x62\xba\xc7\xa6\xa2\x33\xf7\xf3\x6a\x76\x7a\x3d\xc8\x8f\xc3\x01\x92\x49\x8d\x78\x6e\xcc\x77\x04\xf3\xc2\xf0\x87\x6e\x85\x74\x94\xe4\x8b\xf7\xc1\x25\xc1\x58\x85\x6a\x12\x87\x55\xcb\xa6\xa6\xe9\xb6\x55\xe1\x53\x68\xb1\xa2\x15\xa9\xe3\x65\xc4\xb3\xf9\x8a\x4e\xde\x79\x1f\xf9\x58\x3f\xbc\x46\x94\xe7\x2d\xa3\x07\x38\x65\x15\xb7\xb8\xcd\xe8\x2f\xa2\x73\xa6\x36\xed\x15\x9b\xe3\xc5\xa6\x0f\xb1\x27\x84\xba\x53\xb7\x96\x86\xdc\x2f\xf4\x89\x36\xb3\x58\x3d\x5a\x0d\xba\x24\x26\xc2\x05\x38\xc7\x27\x02\x9b\x10\x27\x22\x27\x82\x54\x55\xdd\x29\x10\x52\xfd\x26\x99\xec\xf3\xf1\xa3\xfe\x04\x39\x2e\x47\xbd\x78\xab\xeb\x0d\x59\xff\xce\x10\x28\xfb\x03\xbb\xeb\x7a\xee\xa0\x8b\x63\xd7\xd3\x79\x47\xe5\x43\x9b\xdb\x7f\xb9\x27\x80\xcd\x98\x6a\x1d\x65\x63\xfd\x84\x6a\x0a\xc2\xdb\x16\xe1\xed\x27\x12\xed\x16\x1a\x30\x2f\x20\xee\x2c\xe4\x7d\x88\xbb\xe1\x42\x37\x08\x73\x3b\x2c\xa2\x72\x3f\xb5\xa7\x4e\x44\x9d\xac\xdb\xa3\xad\x47\x56\x1d\xe6\x1a\xc5\xe6\x49\x2a\xdc\xc9\x6d\x37\x11\x89\x3b\x39\xdc\xc9\x6d\xf2\x4e\x4e\x6f\xfb\x5a\xb4\xe1\x1d\x5d\x87\x17\x8e\xfc\x59\x38\x4d\x4e\xa6\x26\xbc\xed\xd9\x43\xc1\x2d\x5d\x48\x11\xb7\xc4\x06\xef\x7d\xaa\x1b\xc5\x4b\xd5\x56\x74\x7e\x08\xc7\xa2\x45\x9d\xaf\x15\x21\xde\x34\x5c\xb8\xaa\x6c\x24\xde\xa4\x8b\xcb\xa6\x79\xa3\xea\xfc\x84\x4d\x3e\xfb\x02\x79\xff\x20\x3c\x10\x5a\x96\xbf\x1c\x37\xce\x21\xba\xe0\xbd\xe3\x69\xf1\x8e\xa9\xe0\x3b\xd2\xa7\xd9\xd3\x93\x61\x2f\x90\x8b\x73\xe3\xe7\x7b\xfc\x2c\x5d\x0e\x8f\x97\xe1\xf1\xb2\x1c\x1e\x2f\xc3\xe3\x65\x78\xbc\x0c\x8f\x97\x6d\x9b\xe3\x65\xb9\x9e\x39\x5e\xd6\xf6\x9a\xb4\x7c\xbc\x2c\x87\xc7\xcb\xf0\x78\x19\x1e\x2f\xc3\xe3\x65\x78\xbc\xac\xfb\xc7\xcb\x72\xdb\xfa\x34\x58\x0e\x4f\x83\x75\xee\x34\x58\xae\xd7\x4f\x83\xe5\xb6\xe0\x69\xb0\xfc\xdb\x12\x50\x12\xc4\x92\x42\x81\x13\xcb\xe7\xe0\x5b\xe0\x0d\x91\xc4\x32\x1c\x77\xb9\x00\xb3\x31\x43\x9a\xd5\xed\x78\x9e\xf9\x60\x38\xcf\xdc\x49\x76\x88\xac\x8c\xff\x32\x1e\x67\x5e\x25\xcf\x4a\x9c\xd9\x08\xce\x49\xc8\xd9\xb8\xca\xf5\xbc\x33\xf5\xaf\x5f\x15\x07\xea\x06\xc5\x2a\xa7\xa8\x71\x4c\xee\xac\xb8\xb1\x07\xa8\x9c\x80\x68\x37\x40\x87\x62\x8d\xc5\xea\x69\x78\xaa\x23\x83\x01\xcd\x59\x68\xf1\x6f\xd1\xe2\xff\x07\x7d\xb0\x22\x2c\xf4\x4b\xa0\xf9\x16\xfa\x37\x40\xa7\xc6\x2a\x18\xc2\x13\xbc\x08\x34\xe0\x09\xde\xc1\xf7\x45\xba\x47\x2d\x0b\x59\xad\xc2\x35\x2e\xab\x3b\x57\x05\x57\x1c\x37\x27\x6e\xa3\x52\xde\x6e\x5c\xfe\x36\x58\x0f\xca\xa6\xed\x40\xfa\x97\x46\xe3\xc4\xf1\x41\x79\xc4\x20\x70\x5e\xc3\x5c\x8a\x13\xcd\x79\xf1\x50\x23\xd1\x3c\xe5\x95\xd7\x55\x21\xdd\x99\x53\x6d\x88\xce\x11\x9d\x23\x3a\x47\x74\xbe\x7d\xd0\x39\xea\x9f\x31\xfa\x67\xef\xd8\x16\xf0\x44\x71\x57\x4e\x14\xa3\x09\x07\x4d\x38\x68\xc2\x41\x13\x0e\x9a\x70\xb6\xb5\x09\x07\x03\x4b\x60\x60\x09\x0c\x2c\xd1\xa9\xc0\x12\x68\x21\x45\x0b\xe9\x76\xb5\x90\xe6\x8b\xed\x0d\x73\x12\x6b\x4c\x4c\x87\xc3\xe3\x3b\xc9\x1d\x62\x36\xfb\x92\x76\xf3\x0d\x8b\xed\x3f\xa4\xf0\x73\xa3\x4d\x1e\x52\x18\x5b\xa9\x38\xd1\xa7\x13\xdc\x68\x9f\x7f\x35\x42\xbe\xd6\x0f\xaf\x8f\x82\xed\xc9\xb1\x90\x88\x9f\x8f\xcb\x82\x43\x19\xfb\x51\xf6\x40\x04\x61\x6f\xf4\x60\x9b\x4f\xa3\x7f\x2b\xa8\x62\x50\x3e\x0b\xcf\xf0\x41\x79\x05\xe6\xe0\xd2\xba\xad\x2a\x99\x46\x55\xde\x68\xd0\xd0\x17\xe3\x07\xe7\x53\x64\xbe\xf9\xc1\xd9\xb0\xae\xc1\xec\x3f\xc9\x6f\xee\x6e\xd0\xe5\xe3\xe1\x31\x45\x1b\xf6\xfa\x84\x7c\x66\xd3\x3b\x3e\xa7\xc1\x22\xbc\x50\x63\xee\x6e\x7b\xcf\x23\x67\x44\x3b\x77\x8b\x76\xee\x2f\x27\xba\x21\x99\x96\x84\x29\xfd\x1a\x3c\xe7\x9b\xd2\x7b\x4b\x02\xf2\xf3\xef\x9b\x26\x01\xd3\x5f\xb9\xbd\x81\x04\x7c\xd4\x8b\x75\xda\x50\xe8\x1d\x6f\x68\x4e\xee\xa2\xcc\xc3\x98\xa8\x18\x13\xf5\xd6\xb5\x60\x20\xba\x42\x74\x85\xe8\xaa\x93\x31\x51\xdb\xbb\x7f\xef\x66\x84\xd5\xe6\x63\xa2\x6e\x9a\xaa\x91\xfb\xea\x9e\x06\xaa\xc6\x89\x98\x90\xa9\x0d\x15\x90\x63\x3c\x1a\xc4\xa6\xea\x1f\x18\x90\x67\xbb\x69\x3d\x18\x90\x07\x03\xf2\x6c\x72\x40\x9e\x6f\x8d\xf6\xa5\xee\xfc\xde\xda\x5d\x72\x36\x6d\x41\x89\x8d\x0e\x94\x9f\x81\x0b\xe4\x5c\x6a\xca\x8b\xbd\x33\x14\x8c\xde\xd3\xe8\x3d\xf5\x61\x7c\xda\xce\xaf\xbf\x3e\x0c\x73\xcd\xf1\x6b\x91\xae\xbe\x29\x8a\xfd\xfd\xc3\xe4\xe5\x1d\x0d\x56\xd9\x5f\x48\x48\xe3\x48\x20\x91\xbd\xe1\x6e\x5b\xdc\x58\x3b\x8d\x1a\xa6\x2d\xc9\xed\x47\x7c\xef\x1b\xbe\x75\x92\xbe\x1a\xba\x43\x57\x7c\xf1\x38\x58\xe5\x30\x17\x28\x3b\x93\x3e\x76\x73\xb3\x97\xfb\x5b\x28\x67\x7e\xf4\x24\xba\x29\x42\x6c\x35\x37\xbf\x43\x92\xea\x6f\x74\xae\x63\x56\x7d\x0c\x7b\x84\x59\xf5\xf1\xec\x06\x9e\xdd\xc0\xb3\x1b\xdb\xe8\xec\x06\x66\xd5\xc7\xac\xfa\xe8\x33\x8f\x3e\xf3\xe8\x33\x8f\x3e\xf3\x3d\xe1\x33\xdf\xcb\x18\x05\x13\xf4\xa3\xc3\x31\x26\xe8\xdf\x3a\x21\x99\xc8\x07\xd2\xf0\x84\xc4\x9e\x15\xc7\xb4\x0b\x6a\x49\x37\x8a\x3e\xe5\x8c\x48\x21\xc5\x29\x98\x69\x38\x6a\xa9\x6c\x6a\xee\x83\xd4\xf2\xb8\xe7\x6f\x0e\x93\xf7\xee\x80\xd7\x04\x8a\xbc\xb6\x9a\x4d\x7e\xa2\x19\xda\xf9\x98\x57\xf4\x9c\xa9\x4d\x7a\x45\xf7\x04\xe8\x3c\x28\x40\xa7\xff\x55\x0b\x81\x2c\x23\x11\x15\xef\x7d\xc6\xd9\x76\x94\xb9\x81\x34\x02\x92\x71\x2e\xc6\x33\xce\x33\xe4\x94\x60\x96\x11\xed\x0e\x61\x04\xd4\xef\x39\xa4\x99\x48\x33\x91\x66\x22\xcd\x44\x9a\x89\x34\x13\x69\x26\xd2\x4c\xa4\x99\x48\x33\x91\x66\x22\xcd\x44\x9a\xd9\x6d\x9a\x39\x0d\x39\x72\x36\x75\xda\xa3\x99\x7b\x83\x34\x33\x62\x73\x77\x2b\xa4\x75\x43\x54\x8a\xa8\x14\x51\xe9\x16\x42\xa5\x6f\xef\x87\x94\x40\xa5\x05\xd3\xb4\x34\xdd\xa8\x71\x0c\x15\xd9\x17\x09\x3f\x7a\x07\x77\x05\xef\xf1\xa2\x03\xdf\x53\xa4\x4e\xb5\x6e\x20\xbe\x26\x9d\x2a\x52\x67\x2a\xf0\x84\x8c\xfa\x3b\x39\x37\xe3\xee\x48\xdb\x98\xac\xb8\xae\xa0\x89\xba\x82\x26\x9a\x29\x28\x5f\x86\xa7\x04\x3b\xbc\x04\xb3\x9c\x1d\x9e\x87\x69\xc8\xb5\xc0\x0e\x03\xdf\xd9\x4c\xdc\x7e\xf2\xd1\xab\xb0\x97\x75\xc5\xd8\x6a\x36\x0a\x51\x97\x4d\xcd\x26\xef\xb8\x4a\xfe\xe0\x51\xd8\x59\x30\x2d\x7a\x6d\x35\x9b\x7c\xb8\x71\x52\xcb\x39\x53\x4b\xdf\xc3\x6e\x99\x32\x2d\xba\x50\x9d\x40\xba\xc7\x31\x2e\xa6\xa4\x44\x9a\x89\x29\x29\x91\x66\x22\xcd\x44\x9a\xb9\x8d\x68\x66\x0f\x85\x8d\xee\x19\x9a\x89\xf1\x8c\x91\x66\x22\xcd\x44\x9a\x89\x34\x13\x53\x52\x62\xc0\xd5\x5b\x07\xea\xf5\x7c\xc0\xd5\x2d\x99\x92\x72\x21\xfa\x88\xef\x09\xc1\xb6\x0e\xc1\x38\x67\x5b\x23\x90\x86\xa1\xc8\x23\xfb\x05\xd3\xa2\x3c\x58\x87\xa9\xcd\xea\xb6\xd3\x6c\x82\xc9\x73\xf1\x8e\x6e\x29\xa2\x48\xf7\xb5\x54\x4a\x1e\xd3\x9d\x33\xb5\x2a\xf7\xb6\xd4\x4f\xed\xf2\x21\xd7\x1e\x2f\x21\xe4\x9c\xa9\xa5\xef\x15\xff\xd7\x49\xa2\x25\x00\xd4\x04\x1c\x83\x23\x35\xf1\x4e\xf6\xc1\x23\xcd\x34\x18\xc6\x36\xc1\xa8\x95\x2d\x46\xad\xfc\xf5\x04\x1c\x15\xd3\xf4\x00\x64\xf8\x34\x1d\x82\x26\x47\x1d\x9c\x14\xb1\x28\x0f\xc3\x41\x3f\x16\x65\xf3\x4f\x9f\x12\xd1\xa4\x8e\xc0\xa1\x40\x34\xa9\xe6\x1f\x6f\x3d\x33\x2d\xcf\x44\xd8\x26\xc1\x91\xfe\xc9\x11\x5f\x70\xbc\x3e\x34\x75\x21\x13\x22\x7b\xc5\x15\x21\x44\xfc\x4c\x84\x9d\x14\x27\x98\x78\x10\x01\x29\x02\x52\x04\xa4\x08\x48\x31\xf1\x20\x26\x1e\xc4\xb0\xbd\x98\x78\x10\x41\x3d\x82\x7a\x04\xf5\x08\xea\x11\xd4\xb7\x05\xd4\x63\xf4\x76\x8c\xde\x8e\xd1\xdb\x31\xf1\x20\xda\xc1\xd0\x0e\xb6\xc5\x13\x0f\xb6\x87\x05\xaf\x27\x7f\xe1\x16\x3c\x6e\x43\xfe\xe8\x5e\x38\x2d\x23\x9d\x94\xcb\x76\x03\xcf\x71\x8d\x96\x4b\xe6\x1a\x53\xb5\xdd\x78\x26\x63\x36\xef\x08\xf2\xbe\x7b\xc9\x37\xfa\x60\x27\x7b\xfe\xda\x6a\x36\x39\xc8\x73\x10\x8a\x6b\xee\x38\xf2\x55\xec\x69\xaf\x98\xf4\x23\x3c\xf7\x60\xb9\x6c\x07\x4d\x70\xfe\x75\xd1\xcd\x6d\x4e\x34\xf8\x06\x38\x2d\x06\xe1\x51\x38\xcc\x07\xe1\x18\x8c\xc2\xfe\xe8\x90\xe3\xe5\xb2\x2d\x78\xb9\x5b\xab\x8d\x66\x11\xbc\x14\x3f\x2a\xf7\x93\x61\x37\x32\x47\xb9\x6c\xcb\x71\x19\xa8\x41\x55\x6e\xc0\x4f\xee\xf2\x5b\x3e\xed\xa6\x02\x6c\xa2\xf1\x07\xdd\x14\x80\x5d\x6d\xff\x1c\x0f\xa3\x52\x63\x0f\x5d\x5f\x07\x20\xbb\x43\xb3\x68\x8b\x66\xd1\xf7\x26\x60\x4a\x58\x37\x4f\xc2\x84\x6f\xdd\x6c\x9b\x08\xd8\xa8\x6c\x69\x32\x0d\x5f\x73\x22\xa4\xa1\xd8\x08\xca\x97\xdc\xff\x7e\x95\x2f\x42\x0e\xd6\x25\xb8\x69\x42\x96\x3c\x2a\x12\xdb\x74\x4d\x92\x60\x16\x9b\xed\x26\xd2\x30\x8b\x0d\x66\xb1\xd9\xe4\x2c\x36\x9d\xd7\x1c\xe3\x12\xc5\xb4\x5b\x77\xcc\x1f\x85\xc3\xe4\x60\x2a\xeb\x6d\x57\x5e\x17\x8c\x31\xe0\x3f\x74\x2b\x84\x15\x20\x6f\xee\x17\x67\x63\xed\xb1\xa5\x92\x79\x93\x4d\x52\xcb\x2c\x65\xbc\xd3\x85\xee\x79\x65\xf2\x3b\x7d\xe4\xf3\x7d\x70\x57\xe0\xa6\x49\xf7\x9e\x64\xb2\xc8\x31\xd8\x92\x69\xad\x78\xbb\x64\x55\xec\x20\xd3\x0f\x15\xa9\x73\x3e\xe4\xa1\xc9\xb9\x99\x0b\xec\x86\x1e\x3c\xa7\xac\xc3\x25\x31\xa2\x2f\xc0\x39\x3e\xa2\xcf\xc0\x29\x38\xd1\xda\x39\x65\xfe\x8d\xb1\x07\x94\x3f\xd3\x07\x44\x74\x82\x61\x6a\xd4\x6b\xf3\x9f\xe9\x23\x1f\xeb\x83\x01\xf6\x5b\xc3\x36\x7e\x6d\x91\x3a\x97\x4c\x8d\x62\x9b\x06\xda\xf4\x0b\xc3\x90\x15\x6d\x6a\x17\x96\xa9\x56\x29\xe9\x46\x31\x90\x96\xa9\x6c\xe9\xa6\xa5\x3b\x6b\x85\x92\x6a\xdb\xd4\x0b\x45\xfa\x9f\x87\xc9\xdb\xfb\xe1\xd5\xfe\x23\x4c\xf9\x53\xf8\xce\xbd\x5a\xcd\x9b\x93\xcf\x4f\xb1\xe7\xd3\x0f\xb0\x3b\xe6\xbd\x87\x16\xb2\x55\x97\xdb\xbc\x57\x5f\x84\x0b\xa2\x2d\xcf\xc2\x69\xde\x96\xc7\xe0\x08\x1c\x8a\x94\xb8\x81\xcf\x67\x8a\x55\xb0\x62\x1b\xdd\xb4\x3f\x1f\x2f\x78\x4f\x90\xe3\x52\xf0\xd6\x75\x83\x4b\x96\xaa\x6a\x54\xb5\x89\xff\xc3\x5d\xb5\x5d\xb1\x37\x3c\xab\x7f\x75\x6f\x28\xf2\xa6\x2e\x75\x48\x2e\x0f\x8f\xc1\xf9\x1a\xb5\xb7\xc5\x1e\x41\x95\x17\x77\xf1\x2d\xee\xe2\x7f\x34\x11\xbd\x01\x6f\x9b\xc0\x98\x15\x9c\xe0\x1c\x4c\xf9\x9c\xa0\xe5\xd2\x9a\xdc\xd7\x77\x58\xca\xa4\xbf\xf7\xf6\x5a\x29\xf3\x3a\x2f\x73\x7e\xb5\x60\x79\x48\xfc\xde\x2d\xb9\x82\x09\xf1\x31\x21\xfe\xad\xeb\x59\x87\x2e\x15\xe8\x52\x81\x2e\x15\x9d\x4c\x88\xdf\xcd\x14\xf6\xed\x35\x62\x37\x9f\x10\xbf\xc3\xca\x41\xee\x6d\x7b\x6a\x95\x83\x91\x98\x5c\xf7\xd5\x2a\xc3\x83\x9c\x51\x75\x41\x63\x40\xf8\xbf\xdd\xf4\x14\x84\xff\x08\xff\x37\x19\xfe\x77\x11\x45\x75\x58\xd0\xc7\xa7\xa3\x9f\x80\x63\xe4\x48\xea\x90\x07\xf7\xef\x0d\x5a\x05\xaa\x0a\xee\x42\xfe\xf9\xef\x1e\x86\x13\x92\x6e\x3a\xa6\xa5\x16\x69\x6d\x60\x51\x91\x90\x69\xd5\x2c\x55\x56\xa8\xea\x38\x6a\x61\x39\xe8\xa2\x44\x3e\x37\x44\xde\xb1\x03\x5e\x2b\x1f\xf6\x22\x8e\x7e\xac\x99\x9c\x4b\x0b\xbc\xd0\x49\xaf\xd0\x9e\x48\xb6\xb4\x97\xbf\x6e\x5e\x7c\x8f\x8c\x87\x5a\x5b\xd1\x1e\x8f\xca\xd9\x9b\xc9\x95\x0a\xf1\xf3\xee\x2c\x39\x2d\xa6\x57\x6d\x83\x07\x67\x18\xef\x11\xd7\xc1\xa2\x7a\xd0\x62\x76\x25\x8c\x47\x8a\xd9\x95\xf0\xb8\x3d\x1e\xb7\xc7\xe3\xf6\xdb\xe9\xb8\x3d\x66\x57\xc2\xec\x4a\x78\xcc\x19\x8f\x39\xe3\x31\x67\x3c\xe6\xdc\x13\xc7\x9c\xf3\xa7\xe0\x04\x39\x9e\x3a\xea\x31\x8e\xfb\x83\x8c\xa3\x76\x77\x87\xf9\xe1\x31\xe9\xd1\x96\x3d\x17\x8a\x49\x8f\x3a\x91\xf4\xe8\xcf\xf7\x09\x47\xd6\xb1\xd5\xec\x98\xd8\x05\xae\xa8\x65\x9b\x7c\x6e\x1f\x79\xb9\xdf\x0f\x1d\x38\xd8\x38\xb1\xce\x14\x7f\xf0\x71\xb5\x9c\xde\xeb\xa7\xd7\xf1\x7e\x3c\x6f\x5a\x93\xa5\x92\x77\x9c\xa6\x7d\x16\xb4\x0e\x41\xbd\xab\x30\x29\xa0\xde\x04\x1c\xe3\x50\x6f\x1c\x0e\x40\x26\x36\xea\xa3\xf7\xbd\xcd\x64\x38\x8a\x0d\x1c\x7b\x31\x1e\xe2\x0d\x91\x7d\xb5\x67\x7e\xbd\x3a\x54\xbb\xc7\x23\xac\x43\x58\x87\xb0\x0e\x61\x1d\xc2\x3a\x84\x75\x08\xeb\x10\xd6\x21\xac\x43\x58\x87\xb0\x0e\x61\x1d\xc2\xba\xee\xc2\x3a\xa4\x6d\x48\xdb\x90\xb6\x6d\x63\xda\xf6\x47\x69\x18\x77\x63\x94\xe9\x16\x2d\xea\xdc\x77\xbb\x2a\xcb\xf8\x98\xdc\xea\xeb\x05\xff\x8c\xf3\x87\xd3\xe4\x3f\xf7\x03\xa9\x79\xe6\xda\x6a\x36\xf9\x40\xc8\x41\xe7\xc9\xb9\x99\x79\x51\x40\xfa\x21\x11\x98\xac\xea\xb1\x85\xac\x7f\x43\x9b\xcf\x39\xaf\xc1\xf3\x82\x9c\x3d\x0d\x4f\x71\x72\x76\x19\x1e\x87\x8b\xa1\xe4\x8c\x95\x31\xaa\x16\x8b\x6c\x2c\x38\xa6\xe5\x7b\xc4\xd5\x36\x8c\x38\x41\x2e\xeb\xbb\xd1\xe3\xcf\x2f\xc4\x53\xb5\x53\xe4\x84\x17\x77\x22\xac\x8b\xaa\xc8\x9a\xa0\x6e\x81\xfa\x25\x3f\xbc\x3b\xb4\x9f\x94\xf0\x53\xd0\x81\xae\x4a\x79\x61\xcc\xba\xd4\x5b\x39\x15\xae\xc1\x73\x35\xee\xff\xed\xed\x2e\x3c\x11\x80\x67\xa3\x5b\x3c\x1b\xfd\xc5\x44\xc7\x65\x49\x41\x9c\x8c\xbe\x0a\xcf\xfa\x27\xa3\x7b\x48\x60\xf1\x93\xd4\x1d\x17\x58\xe9\x1f\xbc\x3d\x54\x60\xdd\xe5\x1e\xa8\x36\x82\x42\xea\x61\xf1\x6b\xf7\x64\x14\x1e\xa8\xc6\x03\xd5\x78\xa0\x1a\x0f\x54\xe3\x81\x6a\x3c\x50\xdd\xca\x81\xea\xf6\x06\xea\xee\xe6\xf1\xec\xe6\x0f\x54\x37\xa7\x23\x34\xd4\x02\x1a\x2b\x10\xb9\xff\xb4\x27\x54\x47\x18\x8e\x39\x57\x1d\x50\x1c\x14\x19\x58\xb5\x0b\x7a\x03\x1e\xab\xde\x6e\xda\x0a\x1e\xab\xc6\x63\xd5\x9b\x7c\xac\x7a\xf3\xc9\x57\xc7\x77\x8a\xf1\xe7\xad\x1b\x46\x61\xf5\x4b\xea\xc2\x61\xeb\xef\x19\x74\x63\xa4\x16\x4c\xd3\xd2\x74\xa3\x16\xb2\x72\xbd\xda\x26\x7f\xb9\x8f\x7c\xa9\x1f\x5e\x1b\xbc\x89\xc7\x2c\x6c\xec\xee\x38\xcb\x1e\x4e\x0f\x0a\x57\x47\xff\xc9\x85\x2c\xbf\xb0\xd5\xdc\x1d\x5f\x88\x8e\x10\x73\x4e\x8c\xe9\xd3\x70\x92\x8f\xe9\x23\x70\x08\xc6\x1b\xf8\x41\x06\x5a\x7a\x35\x9b\xe1\x8d\xb1\x9e\x5c\xf9\xcf\xc4\x8f\xe0\xc3\xe4\xa0\x1c\xc1\x21\xfd\x2a\x87\x2c\x7f\x2f\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\xa2\xff\x23\xfa\x3f\x6e\x8a\xff\xe3\x77\x0e\x41\xa6\x11\x97\x0b\x46\x42\x94\x88\xee\xf7\x06\xc9\x67\x07\xe0\xae\x1a\x44\x27\x82\x1f\xbe\x51\xae\x6d\x86\xa6\xaf\xea\x5a\x45\x2d\x55\x85\x41\xf4\xf4\x48\x4e\x84\xda\x12\xf3\x30\x93\xce\xf2\x07\xaa\xb1\x1f\xaf\x8c\x87\xbb\xb6\x1a\xff\xdb\x8c\x18\x86\x7b\xc3\x51\xe0\x1e\x02\xbc\x62\x82\x07\x3e\x17\xcf\x03\x27\xc8\xb1\xa8\x80\x85\x71\x80\x10\xa1\x20\x42\x41\x84\x82\x08\x05\x11\x0a\x22\x14\x44\x28\x88\x50\x10\xa1\x20\x42\x41\x84\x82\x08\x05\x11\x0a\x22\x14\x44\x28\x88\x50\x10\xa1\x60\xb7\xa0\xe0\xe7\x9f\x87\xf3\x02\x0a\x5a\x8b\x6a\x21\xe3\xd2\xa2\x5a\x97\x3d\x2f\xbb\xba\x3c\x16\xcd\xff\x7e\x69\xcc\x32\x4b\x74\x51\x37\x34\xdd\x28\xda\xe4\x5f\x3f\x4f\x7e\x7c\x1f\xdc\xc5\xca\x99\x0c\x16\xc3\xbd\xd5\x1b\x3b\xf5\x5d\x31\x4b\x34\x27\xca\x49\x8f\xb0\x5b\xaf\xd4\x16\xb2\x90\xf5\xa0\x9e\x16\xb8\xbb\xc7\xf9\x5e\x0e\x39\x17\x72\xae\x1c\x72\x2e\xe4\x5c\xc8\xb9\x90\x73\x6d\x1b\xce\x95\xeb\x19\xce\xd5\xf6\x9a\xb4\xcc\xb9\x72\xc8\xb9\x90\x73\x21\xe7\x42\xce\x85\x9c\xab\xfb\x9c\x2b\xb7\xad\xb1\x54\x0e\xb1\x54\xe7\xb0\x54\xae\xd7\xb1\x54\x6e\x0b\x62\xa9\xfc\xf3\x30\x25\xfc\xa2\x4e\xc2\x04\xf7\x8b\x3a\x04\xe3\x70\x20\xf2\xf8\x23\x67\x57\xab\xd9\x4c\x80\x0c\xb5\x25\x11\x84\x16\xef\x05\x35\x49\xce\x04\x8f\x3b\x4a\x07\xa8\x48\x98\x26\xdd\xa0\x02\x15\x85\xd4\xf7\xef\x8e\xa0\x66\x77\x89\x75\x49\x51\xab\x00\x59\x46\xfc\xda\x75\x44\x26\x88\x56\x0e\xce\xc2\xe9\x9a\x00\x0b\x19\x18\x59\x4f\xd7\x60\x50\x05\x8c\x4c\xd7\x62\x64\xba\x3f\x49\xc0\x19\x21\x18\x8e\xc1\x11\x2e\x18\x0e\xc0\x3a\x47\x1f\x4c\x8b\xd0\x73\xa7\xe0\x84\x1f\x7a\x6e\xfd\xa5\x9c\x13\xe1\x68\x4e\xc3\xc9\x40\x38\x9a\xf5\x17\xd3\xba\x84\x2a\x9b\xcd\x4b\xa8\x16\xa4\x52\x50\xa8\xa5\xff\xcf\x48\x84\x84\x72\xc3\x0f\x05\x62\x39\x99\x4b\x55\xd2\xea\x98\xb8\x23\x44\x5a\x4d\x79\xcf\x74\x43\x6e\x75\x26\x98\x1d\xa2\x5d\x44\xbb\x88\x76\x11\xed\x6e\x1f\xb4\x8b\xba\x5b\x8c\xee\xd6\x3b\xec\x1b\x03\x89\x76\x25\x90\x28\x9a\x18\xd0\xc4\x80\x26\x06\x34\x31\xa0\x89\x61\x5b\x9b\x18\x30\x9e\x34\xc6\x93\xc6\x78\xd2\x9d\x8a\x27\x8d\x16\x3c\xb4\xe0\x6d\x57\x0b\x5e\xbe\xd8\xe6\x50\xea\x71\xd0\xb9\x2b\x50\xf9\x7a\x3a\x1c\x6d\xdf\x49\xee\x10\x32\xc3\x97\xe7\x90\x7f\x01\x9e\x27\x57\x53\xcf\x7a\xd1\x6d\x27\xe4\xb2\x2e\x2c\x20\x86\xa6\xb0\x0a\x28\x76\xc1\x2c\xd3\x11\xc5\xae\x14\x96\x99\x6a\xc3\xfb\x8e\xaa\x2b\x42\xca\x96\x2d\x93\x2f\x91\xa9\xdd\x9e\x03\x7b\x47\xc3\xe0\x7e\x72\x08\x86\x85\x67\xbd\xed\x98\x96\x5a\xa4\x01\x77\xfa\x82\xad\x6b\x96\xce\x5a\xc3\xcd\x32\xf6\x9d\x43\xe4\x2f\xfa\x00\xe4\xad\xd7\x56\xb3\xc9\xfb\x43\xb2\x8b\x4d\xcd\xcf\x4c\xf3\xe7\xd2\xaf\x63\x57\xe7\xc5\xdd\x0b\x59\xef\xf7\x36\xe7\x14\xfb\x96\xe8\xf0\xb4\x67\xc5\x88\x3c\x0e\x47\xf9\x88\xcc\xc2\x18\x8c\x46\x5a\x3e\xdc\x16\x58\xcd\x66\xbc\xaa\x36\x99\x35\xec\xe9\xf8\xb1\x78\x88\x8c\xcb\xb1\x58\xdd\xd2\x6e\x5e\x7e\xf7\x8d\x55\xc3\x2f\xf9\xdf\x76\x55\x35\xf7\x43\xe1\x49\xc2\xfc\x16\xbf\x57\xde\xd0\xe9\x46\xcf\x4d\xc1\x24\x9c\xa9\xb1\xb0\xae\xb7\x71\x11\xd3\xa1\x89\xb5\x45\x13\xeb\xfb\x12\x1b\x9f\xdb\xc2\x3a\x9a\xe5\xd6\x51\xcf\xc6\xda\x42\x31\x1b\x4c\xe0\xd5\x29\xd9\x91\xfe\xcb\xd7\x56\xc9\x0e\xe2\xe6\xeb\x0a\x88\x8b\xd7\x8b\xdf\x3a\x2e\x2d\x30\x49\x17\x26\xe9\xba\x75\xd9\x3a\x42\x15\x84\x2a\x08\x55\x3a\x96\xa4\xeb\x87\xda\xb1\xd6\x9f\x17\x9e\x50\x67\xe0\x54\xc0\x13\xaa\x03\x8b\x7d\x7c\x32\xae\x4e\xad\xf7\xb9\x3f\x7f\x55\xd5\x7a\x3f\x14\x93\x7b\xcb\xd7\x02\xee\xe1\xd9\x59\x3a\xa9\x04\x60\xc6\xad\xed\xa6\x7a\x60\xc6\x2d\xcc\xb8\xb5\xc9\x19\xb7\xbe\xa5\x0d\xcb\x46\x9c\xb8\x8f\xcb\x78\xd5\x31\x69\x9f\x3f\x02\x87\xc8\x78\xea\x80\x07\x1b\xef\x0e\xa6\xd2\xf2\x9e\xe9\x42\x26\xad\x5f\xdb\x07\x7b\xc6\xd4\xb2\x3e\xb6\x9a\x1d\x2b\x9b\x9a\x4d\x7e\x76\x1f\xf9\xd1\x7e\xd8\x59\x30\x2d\xbe\x0e\x3d\xdc\x38\xaa\xc6\x9c\xa9\xa5\x1f\x10\x89\xb2\x2c\xba\x90\x9d\x33\xb5\xad\x16\x1e\x77\x01\x4e\x88\x71\x76\x08\xc6\xf9\x38\x1b\x81\x34\x0c\x35\xc8\x82\x65\xf1\x41\x36\x67\x6a\x4d\x1d\xff\x38\x17\x3f\x82\x52\x44\x91\x23\x28\x95\x92\xa3\x66\xce\xd4\xaa\x41\x76\xcc\x29\x12\x0c\x76\x8b\x41\x40\x30\xd8\x2d\x7a\x8a\xa3\xa7\x38\x7a\x8a\x6f\x23\x4f\x71\x0c\x76\x8b\xc1\x6e\xd1\x43\x17\x3d\x74\xd1\x43\x17\x3d\x74\x7b\xc2\x43\x17\x83\xdd\x62\xb0\xdb\xad\xe2\x93\x88\xc1\x6e\x3b\x11\xec\xf6\xd3\xc3\x70\x4a\xb8\xe4\xa9\xe5\xb2\x3d\xb6\xea\x66\xbb\x8a\x8a\x6e\x4b\x39\xb3\x62\x13\xd8\x75\xd3\x7b\xc7\x30\xf9\x83\x01\xd8\xc9\x1e\xbf\xb6\x9a\x4d\x7e\x34\x21\x9b\x3f\x90\xf9\xca\x70\x05\x9a\x17\xdc\x56\x14\x33\x4f\x9d\xb6\xa4\xc1\x1a\xf1\xf5\x17\xae\xa3\xc9\xd5\x8e\xa9\x40\xbe\x62\x36\x58\xa5\x0b\x07\xca\xce\xa4\x1f\xe2\xaf\x9b\x2c\x97\xed\xaa\x80\x21\x5e\x25\x7b\x9d\x09\x6e\x46\xca\xac\x68\x16\x7d\x53\xb0\xe8\x4b\xf1\x24\x71\x3f\x19\x96\x24\x91\x8d\x1e\xd7\x39\xd6\x6b\x76\x4c\x9a\x8f\xc8\x10\x91\x21\x22\x43\x44\x86\x88\x0c\x11\x19\x22\x32\x44\x64\x88\xc8\x10\x91\x21\x22\x43\x44\x86\x9b\x89\x0c\x8f\xc2\x61\x72\x30\x95\xf5\x5c\x81\x5e\x17\x74\x05\xf2\x37\x6f\xf5\xbe\x40\x5b\xef\xc0\x22\xd2\x4c\xa4\x99\x48\x33\xb7\x10\xcd\xfc\xd9\x34\x2c\x48\x9a\x59\x71\x4c\xbb\xa0\x96\x74\xa3\x38\xb6\x3a\x1e\xcc\xe3\x1f\x41\x36\x39\xde\x32\x0d\x47\x2d\x95\x4d\xcd\x7d\x3a\x70\x1a\xf9\x4b\xc3\xe4\x47\x76\xc0\x9d\x81\x72\xaf\xc9\x72\x93\x9f\x68\x06\x79\x3e\xe6\x95\x3f\x67\x6a\x93\x5e\xf9\x3d\xc1\x3f\x8f\x09\xfe\xe9\x7f\xda\x82\xf8\x32\x9f\x85\x46\xd4\x1e\xc1\x68\x0b\x60\xb4\x18\x0f\x46\xa7\x49\xce\x05\xa3\x7e\xa7\x48\x3e\x1a\xd1\x15\x01\x58\x2a\x3a\x0f\x89\x29\x12\x53\x24\xa6\x48\x4c\x91\x98\x22\x31\x45\x62\x8a\xc4\x14\x89\x29\x12\x53\x24\xa6\x48\x4c\x91\x98\x76\x9b\x98\x4e\x43\x8e\x9c\x4d\x9d\xf6\xc0\xe7\xde\x20\x31\x8d\xd8\xce\x21\x3e\x45\x7c\x8a\xf8\x14\xf1\x69\x57\xf1\xe9\x97\xfa\xe0\x6e\x81\x4f\x0d\x53\x0b\x06\x67\x24\xbf\xd4\x47\xfe\xef\x3e\xd8\xc9\x7e\xbe\xb6\x9a\x4d\xde\x53\xa4\x4e\xb5\x06\x20\xea\x9c\xbe\xbb\x48\x9d\x4b\xa6\x46\x17\xb2\x93\x73\x33\xee\x56\xb3\x7d\x67\xaa\x27\xea\x0a\x9a\xa8\x2b\x68\xa2\x99\x82\xf2\x65\x78\x4a\x90\xc1\x4b\x30\xcb\xc9\xe0\x79\x98\x86\x5c\x0b\x64\x30\xf0\x9d\xcd\x1c\xb0\x26\xff\x63\x10\xc6\x44\x1b\x47\x46\x09\x65\x2d\x6e\x99\x25\xba\x28\x42\x84\xda\xe4\x3b\x06\xc9\xb7\x0d\x44\xa4\x9b\x1a\x6e\x7c\xe0\x3d\x98\x77\x6a\x9c\xdd\x1a\x92\x75\x2a\x70\xcf\x56\x3b\x0d\xdf\xa5\xa4\x88\xdd\x89\xfe\x8a\x87\xe6\x91\xe7\x22\xcf\x45\x9e\x8b\x3c\x17\x79\x2e\xf2\x5c\xe4\xb9\xc8\x73\x91\xe7\x22\xcf\x45\x9e\x8b\x3c\xb7\xb7\x78\x2e\x72\x52\xe4\xa4\xc8\x49\xb7\x31\x27\xfd\xc6\x20\x8c\x44\xe5\xb1\x11\x4e\xa6\xf2\xf7\x42\x49\xb5\x6d\x6a\x93\x5f\x1c\x24\x3f\x33\x50\x15\x2f\xf9\x45\xb9\x9e\x19\x9a\xbe\xaa\x6b\x15\xb5\x54\xe5\x3d\xea\xe9\x8e\x32\x4c\xf2\x14\x2b\xa7\x2d\xae\xa2\x99\xf4\x83\x37\xab\xe2\x2f\x07\xdf\x30\xab\xdb\x78\xd6\x3d\x04\xff\xed\x0d\x07\x73\x7b\x08\xf0\x8a\x71\x3a\x77\xfd\xd9\x78\x46\x78\x94\x1c\x6e\x14\x7b\x35\xd8\x15\x78\xf6\x1d\xc9\x1f\x92\x3f\x24\x7f\x48\xfe\x90\xfc\x21\xf9\x43\xf2\x87\xe4\x0f\xc9\x1f\x92\x3f\x24\x7f\x48\xfe\x90\xfc\x21\xf9\x43\xf2\x87\xe4\x6f\x53\xc8\xdf\x1f\x8e\xc2\xac\x3c\x60\xae\x31\x55\x56\x37\x0d\x8b\x16\x75\x9e\x29\xac\xda\x81\x8f\xef\x16\x55\xa6\xa3\xdc\xa4\x8b\xcb\xa6\x79\xa3\x6a\xd7\xe7\x27\xb9\x1e\x25\x7f\xdf\x0f\xaf\x0f\x2d\xed\xda\x6a\x36\x99\x0d\x49\x79\xbd\xe0\x15\xfd\xb4\x28\x7a\x2a\x58\x74\xfa\x38\x7b\x64\x32\xac\xc0\x85\x6c\xe3\x47\xdb\x9c\x2a\xfb\xff\x07\x05\x81\xea\xae\xc2\xb3\x1c\xd5\xf1\xc4\xac\x91\xce\x79\xe1\x2d\xba\x9a\xcd\x34\xae\xf4\x06\x32\xe2\xf2\x6c\xda\x6f\x8a\xe7\x76\x4f\x93\xa7\x04\xa1\x8b\xa9\x49\x90\xd9\xb9\xe7\xb7\x1b\x0c\x13\x48\xbe\x13\x1a\x74\xfd\xa1\xf0\xf4\xdb\x31\xbd\x7f\x52\x3e\xd5\x03\x03\x20\xb7\x04\x1a\x2c\xd6\xe4\xc1\xeb\xc0\x08\xc0\xfc\x78\x98\xd9\xbb\xc5\xcc\xde\x5f\x49\x74\x47\x46\x2d\x8b\xe4\xdf\x2a\x5c\xf3\x93\x7f\x6f\x8e\x34\x6c\x4e\xdc\x35\x23\xbd\xd6\x2d\x12\x63\x72\x93\xa7\xff\xea\xf6\x06\xd2\x70\xd0\x4b\x28\x1e\x23\x00\x4f\x88\x1b\x7b\x41\xfe\x61\x22\x72\x4c\x44\x8e\x89\xc8\x31\x11\x39\x26\x22\xc7\x44\xe4\xeb\x4e\x44\xfe\xf1\x44\xe4\x5a\x0e\xb3\x42\x67\x39\x07\x53\x5c\x67\x39\x05\x27\xe0\x78\x0b\xeb\xca\xbc\xa3\x3a\x15\x1b\xae\x88\x6c\xe5\x17\x61\x26\x90\xad\x7c\x63\x65\x36\x9f\xa0\x7c\x13\xf5\x91\xdc\x37\xf6\x34\x50\x38\x4e\xc5\x64\x34\x8f\x51\x43\x26\x78\x4a\xde\x4d\xd6\x42\x30\x13\xfa\x76\xd3\x7d\x30\x13\x3a\x66\x42\xdf\xe4\x4c\xe8\x3d\x82\xfd\x62\x93\xa5\x6f\xe2\xca\x93\xbf\x08\x33\xe4\x42\xea\x9c\x17\xcc\x23\x1d\x0c\x09\xd2\xb8\xa0\x2e\x24\x59\xff\x87\x3e\x78\x40\x50\xee\x02\xb5\x24\x2b\xa7\x76\x30\x1e\x00\x37\xdb\xc0\x6b\x83\x97\x1b\xc6\x05\x78\xa0\x48\x9d\xa9\xc0\xcd\x18\x1f\x20\x2a\x3e\xc0\xaf\x3c\x0f\x93\x32\x06\x03\x75\x6e\x9a\x16\x13\xbb\x81\x96\x8f\x88\x5e\x2b\xef\xe5\x7a\xa8\x4e\x6d\xf2\xed\xcf\x93\x1f\xde\x07\xaf\xf6\x8b\x60\xbd\xb3\xbf\x71\xa8\x80\x4b\xe2\x66\xa1\x89\xa6\x07\xd9\xcd\x97\xbc\xe7\x83\x89\xb1\xaa\x6e\xec\x71\x7f\xe1\x1c\xba\xce\xa2\xeb\x6c\x0e\x5d\x67\xd1\x75\x16\x5d\x67\xd1\x75\x76\xdb\xb8\xce\xe6\x7a\xc6\x75\xb6\xed\x35\x69\xd9\x75\x36\x87\xae\xb3\xe8\x3a\x8b\xae\xb3\xe8\x3a\x8b\xae\xb3\xdd\x77\x9d\xcd\x6d\x6b\x4f\xd7\x1c\x7a\xba\x76\xce\xd3\x35\xd7\xeb\x9e\xae\xb9\x2d\xe8\xe9\x9a\x5f\x82\x8b\x02\x80\x4d\x43\x8e\x03\xb0\x93\xd0\xc0\x70\x93\x09\xc0\xaa\xd5\x6c\xa6\x8a\x10\x35\x15\x61\xf1\xf9\x78\x18\x7b\x82\x1c\x97\x30\xb6\x8e\x8c\x49\x02\x5b\xf5\xda\x75\xc5\x56\x4c\x7d\x64\x77\x2d\x2d\x7b\x9d\x58\x92\x14\xb5\x06\x8c\x0d\x8b\xdf\xbb\x89\xc6\x04\xc9\xca\xc3\x63\x70\xbe\xc6\x96\x76\x04\x0e\xb5\xd2\x25\x68\x47\x43\x8f\xc9\x16\x3d\x26\xbf\x99\x80\x0b\x42\x30\x9c\x85\xd3\x5c\x30\x1c\x83\x16\x47\xa1\x70\x63\xc8\x72\x37\x06\xcf\x2b\xb2\xf5\xd2\x1e\x17\x6e\x0c\xe7\x61\x3a\xe0\xc6\xd0\x7a\x71\xed\x91\x58\x71\x82\x29\x52\xa2\x35\x90\x58\x65\xd3\x76\x20\xfd\x57\x23\xb5\x12\x2b\x25\x5d\x59\x02\x7e\x41\xe6\x52\x8d\xf4\x3a\x28\xee\x09\x4a\xaf\x29\xef\xf6\xee\xc8\xb1\xce\x78\x45\x22\xe2\x45\xc4\x8b\x88\x17\x11\xef\xf6\x41\xbc\xa8\xc3\xc5\xe8\x70\xbd\xc3\xc0\xd1\x23\xbd\x2b\x1e\xe9\x68\x6a\x40\x53\x03\x9a\x1a\xd0\xd4\x80\xa6\x86\x6d\x6d\x6a\xc0\x83\x49\x78\x30\x09\x0f\x26\x75\xea\x60\x12\x5a\xf2\xd0\x92\xb7\x5d\x2d\x79\xf9\x62\x9b\x8f\xde\xc5\x41\xe6\x74\x38\x04\xbe\x93\xdc\x21\x66\xb3\x2f\x69\xa1\xd3\x26\xb4\x2d\x98\x80\x94\xbc\xef\x5e\x18\x64\xa3\x76\x6c\x35\x3b\xe6\x02\x0e\xc3\x59\x35\x4b\x95\x15\xd7\x81\xfe\xa5\x31\x9b\x77\x05\xf9\xdf\xaf\x27\x6f\xe9\x87\x9d\x05\xd3\xe2\x01\xba\x47\x79\xe0\x1d\x71\xcd\x1d\x49\xbe\x92\x3d\xe7\x15\xb6\xc0\x0b\x4b\x2b\xec\xf6\x29\xd3\xa2\x0b\xd9\xda\x6b\xa2\xab\xdb\x1c\x5b\xe7\x1a\x4c\x8b\x81\xc8\x06\x20\x1b\x88\x87\xe1\x20\x64\x23\x0d\x1d\xec\xab\xf8\x29\xba\x9a\xba\x6d\x34\x78\xce\x95\xf8\x31\x37\x46\x46\xe5\x98\x4b\xa5\xe4\x20\xab\xab\x45\x70\x9c\x25\x7f\x7b\x97\xdf\x0b\x07\xdc\x18\x38\x4d\x77\xc4\x5e\xf9\x44\xf7\xfa\x22\x77\x01\xce\xc1\x54\x8d\x61\xb6\x95\xce\x40\xa2\x87\x56\xd9\x16\xad\xb2\xff\x35\xd1\x26\x79\x30\x23\x4c\xb2\x39\x38\xeb\x9b\x64\x3b\x24\x5a\x3a\x20\x3b\x62\x22\xcc\xe4\xde\xbc\xc7\x17\x2d\xc7\xeb\xce\x77\x37\x2d\x63\x1e\xe6\x27\x08\xbb\x23\x61\xf0\x08\xf7\x76\x13\x72\x78\x84\x1b\x8f\x70\x6f\xf2\x11\xee\x6e\x69\x97\xb1\x67\xb4\x9b\x5b\x23\x9a\x58\x19\xfc\x65\x24\x7f\x0a\x4e\x90\xe3\xa9\xa3\xde\x3e\xe6\xfe\xe0\xd9\xeb\xda\x42\xba\x70\xda\xfa\xbf\x0c\xc2\x83\x51\x9b\x94\x42\x49\xd5\x57\x6c\xf2\xed\x83\xe4\xef\x03\x7b\x93\x83\x8d\x0f\xf2\xd6\x7e\xc3\x14\x2b\x24\x3d\xc6\x1e\x0a\x5f\xb3\xf8\x0d\x5b\x2d\xf5\xf7\xb2\x70\xf8\x3a\xc0\x1d\xbe\xd8\x18\x3d\x0d\x27\x61\x62\xdd\x63\x94\x7f\x7b\x53\x2e\xaa\x4f\xc7\x8f\xc5\x43\x64\x3c\x4e\x5f\xe1\xef\xc3\xbc\xdf\x78\x84\x19\xb3\xff\xa0\x7f\x1b\xfa\xb7\xa1\x7f\x1b\xfa\xb7\x61\xf6\x1f\xcc\xfe\x83\x7e\x45\xe8\x57\x84\x7e\x45\xe8\x57\xd4\xc3\x7e\x45\x98\xfd\x07\xb3\xff\x6c\x15\x4f\x0a\xcc\xfe\xd3\x89\xec\x3f\xff\x7d\x3f\x1c\x95\xd9\x7f\xd8\xa6\x2b\x2c\xef\xcf\x22\x75\xd4\xec\x98\xdc\xef\xeb\x5e\x98\xbe\x97\xc8\x5b\xf6\x93\xff\xd6\x0f\xf7\xd4\x3c\x78\x4d\x3e\x91\x7c\x20\x24\xcf\xcf\xe4\xdc\xcc\xbc\x28\x25\xfd\x08\xcf\xe9\x53\xfd\xec\x82\x78\xd4\xbf\x6b\xf3\xd2\xf7\xb0\x32\x46\xd5\x62\x91\x0d\x0d\xc7\xb4\x7c\xd3\x4f\x6d\x3b\xc9\xcf\xcd\xf8\x95\xde\xa8\x07\x02\x8d\xa7\x72\x39\x72\xd6\x8d\xe2\x19\xda\x6d\x41\x1a\xc7\xab\x27\xd1\x5d\xa0\x92\xc9\x5f\xdd\x1d\xdd\x77\x4a\x78\xa2\x9e\x40\xf7\x0d\xba\x49\x79\xba\xda\x83\xeb\xca\xbf\xb3\x81\x2e\x44\x93\x1e\xfa\x2d\x74\x21\xff\xce\x46\x84\xcc\xfa\xf2\xef\x74\x52\x9c\x75\x47\x5e\xc5\xa5\xda\xf9\xd1\xdb\xa3\xc5\xd9\x5d\x6e\xa6\x1d\x23\x28\xc2\xf6\xc9\xb4\x3a\xdd\x95\x60\x98\x41\x07\x33\xe8\xdc\xba\xe7\x15\xf1\xa0\x0a\x1e\x54\xc1\x83\x2a\x9d\xcc\xa0\xd3\xf3\x89\x72\x62\xf5\x85\xf8\x0c\x3a\xdd\xd1\x28\x72\x3f\xbd\x27\x5a\x65\x18\x8e\xc9\x95\x13\xd0\x23\x1e\x15\x79\x71\xba\xa6\x46\xa0\xff\xe4\x76\x53\x5e\xd0\x7f\x12\xfd\x27\xb7\x4e\x0a\x9c\x4e\xee\x35\x63\xdd\x2b\xbb\xb3\x74\xe4\x8f\xc2\x61\x72\x30\x95\xf5\x3c\x2e\x5f\x17\xf4\xb8\xf4\x6f\xec\x82\xaf\xe5\xd7\x9f\x87\x13\x82\xe0\x5a\x8b\x6a\x21\xe3\x36\x59\x28\xc4\x2d\x94\x2a\xb6\xc3\xc4\x5a\x89\x2e\x32\x89\x6a\x14\x6d\xf2\x13\xcf\x93\xff\xb9\x0f\xee\x65\x0f\x4f\x06\x9f\xf5\x56\xc2\x03\x8d\x5d\x33\xa7\x44\x99\x57\xcc\x12\xcd\x89\x32\xd3\x19\xf6\xc4\x95\xda\x02\xe5\x8a\x58\x7f\x7f\x8f\xbb\x65\x62\xbe\x15\x74\x56\xc4\x7c\x2b\xe8\xac\x88\xce\x8a\xe8\xac\xb8\x8d\x9c\x15\x7b\x28\xd6\x5c\xcf\x38\x2b\x62\x10\x34\x74\x56\x44\x67\x45\x74\x56\x44\x67\x45\xcc\xb7\x82\x51\x9a\x6e\x1d\xdf\xc2\x9e\x8f\xd2\xb4\x25\xf3\xad\x5c\x87\xcb\x02\x19\x3e\x06\xe7\x39\x32\x3c\x0b\xa7\xe1\x64\xe4\x71\x56\x8e\xaf\x5c\x24\x58\x4f\x89\x9a\x3a\xd0\x1a\x73\xee\xf4\x7a\x39\x9e\x0e\x3e\x4e\x2e\xd6\xf1\x3f\x89\x0b\x23\x01\x9b\x04\x84\xf5\x95\x86\xd4\x9f\xee\x6e\xc4\xd6\xee\xf3\x32\xb2\x84\x60\xb4\x03\xe2\xe2\x26\x80\x34\xc1\xbd\xd6\x69\xe6\x89\xeb\x40\x34\xf3\xa0\x4f\x5d\x8b\x3e\x75\xef\xec\x83\x27\x84\xa1\x3a\x0f\x8f\x05\x0c\xd5\x8d\x13\x38\xc5\x8c\xc7\x48\x61\xb2\xbe\x34\x51\x71\x6f\x99\x13\x7e\x7a\x33\x70\xc1\xf7\xd3\xdb\x50\x89\xf1\xb2\x8e\x67\x53\x69\x52\xd6\x45\x4a\xae\xf5\x0b\xc1\xf4\x7b\x46\x1b\xc9\xba\xc1\xd0\x5c\x2e\x21\x72\x6f\x42\xdc\x18\x29\xf7\xbc\xe7\x3b\x2e\x01\x31\xaf\x0b\xa2\x64\x44\xc9\x88\x92\x11\x25\x63\x5e\x17\xcc\xeb\x82\x7e\xd2\x98\xd7\x05\x4d\x1a\x68\xd2\x40\x93\x06\x9a\x34\xd0\xa4\xd1\x16\x93\x06\x1e\x97\xc1\xe3\x32\x78\x5c\x06\xf3\xba\xa0\xc5\x10\x2d\x86\x5b\x3c\xaf\x4b\x73\xb8\xb9\x75\x4b\x5a\x1d\x8f\x5e\x4f\x26\x99\xf6\xbb\xdd\xff\xf2\x55\x48\x09\xb7\x7b\xdb\x31\x2d\xb5\x48\x7d\x5f\xfb\xb1\x82\xad\x6b\x96\xce\x2a\x4c\xde\x77\x95\xbc\x75\x1f\x80\xbc\xe7\xda\x6a\x36\x39\x18\xe3\x4e\x3f\x3f\x33\xcd\x9f\x4d\xbf\x8e\xdd\x38\x2f\x1e\x5c\xc8\x7a\xbf\xa3\xb7\x3c\x7a\xcb\xa3\xb7\x3c\x9a\x38\xd0\xc4\x81\x26\x0e\x34\x71\xf4\x8c\x89\xa3\x77\x08\x3e\xa2\x65\x44\xcb\x88\x96\x11\x2d\x23\x5a\xde\xd6\x68\x19\xd9\x17\xb2\xaf\x6d\xca\xbe\xb6\xa4\xb7\xfc\x3a\x13\x94\xb9\xd4\x69\x35\x9b\xf1\xd0\x50\x5b\x5c\xe4\xd7\x95\x13\xaa\x9a\x7d\xb9\xf0\xce\xad\x4f\x55\x4e\xa8\xd4\xd7\x77\x55\x71\x30\xe2\xbb\xbe\x7b\xc8\xeb\xf5\xe2\xb7\x0e\x42\x2f\xc1\xa8\xa6\x60\x12\xce\xd4\x78\xb6\x8f\xc1\xe8\xba\x1a\x1b\x9d\x9a\xd0\x9d\xbd\x45\x77\xf6\x3f\x4b\xc0\x59\x31\xd7\x8f\xc3\x51\x3e\xd7\xb3\xb0\xde\xe1\x07\xe7\x84\x5f\xf9\x69\x38\xe9\xfb\x95\xb7\x50\xcc\x79\xe1\x57\x7f\x06\x4e\x05\xfc\xea\x5b\x28\xa7\x75\xb1\x23\xbc\xd5\x3b\x25\x76\xd2\xbf\x3e\x52\x25\x76\x1e\x0c\xf7\x42\xf7\x44\x50\x4a\x5c\xf7\x45\x90\xef\x6d\xde\x21\x61\x84\x4e\xe6\x48\x60\x91\xc0\x22\x81\x45\x02\x8b\x4e\xe6\xe8\x64\x8e\x4e\xe6\xe8\x64\x8e\x96\x00\xb4\x04\xa0\x25\x00\x2d\x01\x68\x09\x40\x27\x73\x74\x32\x47\x27\x73\x74\x32\x47\x43\x1b\x1a\xda\x7a\xd0\xd0\xd6\x75\x27\xf3\x75\xb8\x7c\x77\x8c\x28\xb7\xdf\x97\xfc\x37\xae\xc2\xa3\x6c\x30\x8d\xad\x66\xc7\x0c\x75\x85\xda\x65\xd5\x4b\xb3\xc9\xff\x7e\x69\x4c\x78\x47\x93\xf7\x5f\x25\x7f\xf6\x28\xec\x2c\x98\x16\x87\xd9\x7b\x1b\xfb\x92\x9f\x63\x0f\xa5\xef\x65\x37\x4d\x99\x16\x5d\xc8\x5e\x72\x0b\xd4\xf8\x25\x74\x25\x47\x57\x72\x74\x25\x47\x43\x06\x1a\x32\xd0\x90\x81\x86\x8c\x9e\x31\x64\xf4\x0e\xa7\x47\x80\x8c\x00\x19\x01\x32\x02\x64\x04\xc8\xdb\x1a\x20\x23\xe1\x42\xc2\xb5\x4d\x09\xd7\x96\x74\x25\x7f\x26\x3a\xb4\xf1\x29\x81\xeb\x8e\xc0\x21\x8e\xeb\x32\x30\x02\xe9\x48\x47\xcf\x82\x69\x71\x2f\x4f\x0e\x8b\x66\x75\xdb\x69\xd6\x87\xfc\x42\x3c\x7a\x7b\x84\xa4\x24\x7a\x4b\xa5\x24\x6e\xe3\xaf\xa9\xf6\x19\xff\xd4\x2e\x1f\x76\xbd\xd6\x75\x18\x37\x24\xd8\x92\xc1\xd3\x3b\x8b\xb6\x04\x89\xe2\x01\x9b\x6b\x1c\xc6\x87\x60\x5f\x73\x2d\x87\x9e\x49\xe8\x29\xde\xa2\xa7\xf8\x6f\x25\xe0\xb8\x98\xb1\xe3\x70\x80\xcf\xd8\x34\x34\x3d\xee\xe0\xb4\x70\x11\x3f\x0a\x87\x7d\x17\xf1\xf5\x3c\x7f\x46\xf8\x86\x1f\x83\x23\x01\xdf\xf0\xf5\x14\xb0\x51\xa7\xf0\x76\xc9\x91\xf4\xc7\x47\x7c\x39\x92\x0c\xf5\x00\x17\x22\xe5\x51\x71\x4d\x88\x14\xdf\xf5\xbb\xb3\xc2\x05\x1d\xc0\x91\x9b\x22\x37\x45\x6e\x8a\xdc\x14\x1d\xc0\xd1\x01\x1c\x1d\xc0\xd1\x01\x1c\xf9\x3d\xf2\x7b\xe4\xf7\xc8\xef\x91\xdf\xa3\x03\x38\x3a\x80\xa3\x03\x38\x3a\x80\xa3\x79\x0c\xcd\x63\x3d\x68\x1e\xeb\xba\x03\x78\xbb\x88\xf0\xba\x82\x87\xbf\x00\xcf\x93\xab\xa9\x67\x77\x25\xc8\x40\x59\x75\x96\x93\x13\x72\xe5\x16\xf6\x08\x43\x53\x58\x3d\x15\xbb\x60\x96\xe9\x88\x62\x57\x0a\xcb\x4c\x7b\xe1\xdd\x43\xd5\x15\x21\x48\xcb\x96\xc9\x57\xc1\xd4\x6e\xcf\xa9\x3b\x2d\xfb\xf9\x3d\x89\x44\xfb\x5d\xca\x7f\x6b\x18\x66\x44\x78\xf2\x02\xb5\xa4\x21\x91\xda\x7e\x8c\x72\x1e\x42\x5d\x8c\x9a\xaa\x3b\xf4\xa2\xa1\x1b\x45\x57\x49\x13\x2e\xe8\x2f\x91\xb7\x0d\x93\x1f\xdf\x01\x77\x05\x6f\xf4\xd2\x7a\x7e\x32\x21\xc7\x9e\x6f\x09\x55\x0d\x57\xb7\xf1\xa2\x9a\xfb\x4f\xce\x8b\x57\x5c\x71\x29\x87\x16\xd0\x43\x5c\x05\x64\x90\x17\x39\xe8\x03\xde\x2a\x62\x67\x96\xa9\x07\x09\x6c\x87\xaa\xda\x88\xbf\xb3\xe1\xbb\x37\xa9\x07\xb3\xcd\x91\xbf\x65\x1b\xac\x82\x11\x81\xb2\x33\xe9\x2c\x7f\x5d\xa0\x8e\xb6\x9b\x6a\x34\xaa\xda\x3d\xee\x39\x9f\xbf\x21\xd2\xce\x1e\xe0\x69\x67\xd9\xb4\x9c\x84\x33\x70\xaa\x85\x69\xc9\x2d\xdd\xcd\x19\x73\xde\x18\x3f\x35\x2f\x91\x59\x79\xb2\x22\xaa\x61\x23\xd3\xce\x86\x0c\x63\xb8\xfe\x50\xf8\x24\xde\x45\x6e\xe3\x6d\x01\x79\x3c\x41\x80\x27\x08\xf2\x68\x09\x43\x4b\x18\x5a\xc2\xd0\x12\xb6\x6d\x2c\x61\xf9\x9e\x31\xf4\xb4\xbd\x26\x2d\x5b\x20\xf2\x68\x81\x40\x0b\x04\x5a\x20\xd0\x02\x81\x16\x88\xee\x5b\x20\xf2\xe7\x61\x9a\xe4\x52\x67\x3d\x82\xf2\x28\x47\x27\xb2\x16\x91\x9b\xc1\xd4\x00\xbb\xad\x93\x9c\x24\xbf\xad\xd9\x6d\x1e\xd9\x6d\xe7\xd8\x6d\xbe\xe7\xd9\xed\x16\x3c\xda\x40\xbe\xfa\x1c\x4c\x48\xae\x69\x9a\x96\xa6\x1b\xc1\xe4\x91\x0d\xe2\x67\x70\x03\xa7\x4d\x7e\xf4\x39\xf2\x5d\xfb\xe0\xb5\xc1\x67\x9b\x88\xa3\x31\xcb\x1e\x4e\x3f\x2c\xe2\x68\xf8\x4f\x06\x0f\x1d\xf0\x5b\x7a\x9c\x0a\x62\x3c\x0d\xa4\x61\x18\x4f\x03\x69\x18\xd2\x30\xa4\x61\xdb\x88\x86\xf5\x90\xdb\x73\xcf\xd0\x30\xf4\xc7\x45\x1a\x86\x34\x0c\x69\x18\xd2\x30\x8c\xa7\x81\x0e\x83\xb7\x0e\x74\xea\x79\x87\xc1\x2d\x19\x4f\xe3\x05\x91\x6c\xed\x00\x4f\xb6\xd6\x77\xf9\x22\x0f\x9f\x31\xde\xe0\x0c\x7c\x80\x4c\xad\x66\x33\x9c\x0d\x35\x95\x9b\xf1\x99\x78\x17\xaa\xc3\xe4\xa0\xeb\x11\x55\x0f\xc0\xa4\xbb\x23\x7f\x61\xb5\xbb\x63\x4c\xc4\x8e\xd4\x5b\x77\xd7\x53\xb1\xd7\x78\x19\x1a\x05\x00\xdb\xeb\xc6\xdb\xe8\x06\x02\x13\xc4\x6a\x1a\x72\x70\xb6\x26\xee\xc6\x01\xc8\xac\xaf\xe9\xf1\x60\x28\xc6\xdf\x68\x31\xfe\xc6\x5f\x26\xe0\x82\x08\x82\x71\x16\x4e\x07\x82\x60\x8c\xc3\xba\x47\x61\x74\x4c\x9e\x49\x21\x5c\x26\xe0\x18\x17\x2e\xad\x94\x7d\x5e\x44\xfa\x38\x03\xa7\xfc\x48\x1f\x2d\x94\xd3\x6c\x5c\x8e\x8e\xc9\xa9\xf4\xff\x1a\xa9\x97\x43\xe1\x01\x3b\x84\x4c\x1a\x75\x03\x76\x04\x65\x52\x58\xe0\x8e\x4e\x48\x27\x0c\xdc\x81\x80\x16\x01\x2d\x02\x5a\x04\xb4\x18\xb8\x03\x03\x77\x60\xe0\x0e\x0c\xdc\x81\x86\x02\x34\x14\xa0\xa1\x00\x0d\x05\x68\x28\x68\x8b\xa1\x00\x03\x77\x60\xe0\x0e\x0c\xdc\x81\x81\x3b\xd0\x0e\x87\x76\xb8\x2d\x1e\xb8\x63\x3d\x99\x1b\x9b\xc3\xcb\x41\x6e\xdc\x24\x6a\xde\x8a\x91\x3c\x3e\x3b\x04\x87\x85\xc7\xbb\x5a\x2e\xdb\x63\xab\x6e\xd4\x8e\x08\x47\x77\x4d\xa5\x2b\x6c\xf7\xe5\xd8\xe4\x3f\x0c\x91\x1f\x1e\x80\x9d\xec\xb1\x6b\xab\xd9\x64\x45\x2a\xb6\x86\xa6\xaf\xea\x5a\x45\x2d\x55\x85\xec\xf0\x36\x91\xd3\xbc\x80\x79\xda\x9e\xd0\x1c\x99\x74\x8a\x3f\x30\x59\x2e\xdb\x41\x63\xa1\xf7\x96\x59\x1d\xa3\x69\x84\xcd\x97\xbd\xe1\xf3\x65\x0f\x01\x5e\x31\x91\x67\xe1\xf1\xf8\x89\x92\x26\x43\x72\x72\xb0\x71\x20\x67\x83\xd7\xfa\xd5\x89\x4d\xf1\x7c\x00\x9e\x0f\xc0\x68\x19\x68\x7e\x42\xf3\x13\x9a\x9f\xb6\x8f\xf9\x09\xa3\x65\x60\xb4\x0c\xc4\xfe\x88\xfd\x11\xfb\x23\xf6\xef\x09\xec\xbf\x05\x29\x05\xc6\xd1\x40\x94\x8a\x71\x34\xb6\xce\x91\x06\xf2\x3b\xfb\xe0\x4e\x41\x15\x17\x39\x4d\x5c\xcd\x8e\x5d\x37\x17\x6d\xf2\xf3\xfb\xc8\x4f\xf5\xc3\x2e\xfe\xe3\xb5\xd5\x6c\xf2\xe1\xc6\x91\x31\xf2\xe6\x62\xfa\x41\x76\x4b\x8e\x5d\x5e\xc8\xe6\xcd\xc5\xf3\xa6\x35\x59\x2a\x79\xa4\xcf\xee\x75\xb8\xf7\x34\x9c\x14\x70\xef\x30\x1c\xe4\x70\x6f\x14\xf6\xc3\x70\xa4\xdf\x34\x6f\x99\xcc\x6a\x36\x93\x37\x17\x9b\x3a\xd3\x11\x97\x2b\xf5\xb1\x78\x86\xf7\x28\xd9\x1b\x02\xbb\x79\x4d\x24\xd0\xcb\x9b\x8b\x88\xef\x10\xdf\x21\xbe\x43\x7c\x87\xf8\x0e\xf1\x1d\xe2\x3b\xc4\x77\x88\xef\x10\xdf\x21\xbe\x43\x7c\x87\xf8\xae\xdb\xf8\x0e\xe1\x1a\xc2\x35\x84\x6b\xdb\x18\xae\x7d\xf0\x00\x0c\xb2\xae\x6b\x10\x8f\x96\x4d\x38\xbd\x40\x6d\xf2\xcf\x63\xe4\x6f\x1e\x85\x9d\x05\xd3\xa2\xd7\x56\xb3\xc9\x47\x1b\xf3\xb6\x79\xf1\x58\xfa\x3e\x11\x8b\xd6\xa2\x41\x9f\x3a\x79\xb1\xc7\x81\x1b\x46\xa1\x45\x4c\x85\x51\x68\x11\x53\x21\xa6\x42\x4c\xb5\x8d\x30\x55\x0f\x9d\xe1\xef\x19\x4c\x85\x87\xcb\x11\x53\x21\xa6\x42\x4c\x85\x98\x0a\xa3\xd0\xe2\xe9\xd7\x5b\x87\x2a\xf5\xfc\xe9\xd7\x2d\x19\x85\xf6\x59\x38\x23\x1c\x95\x8e\xc1\x11\xee\xa8\x74\x00\x32\x30\xd2\x20\xc0\xa3\x45\xf9\xf9\x5c\x41\x85\xda\xe2\xab\x34\x13\xef\xab\xb4\x8f\x3c\x52\x9b\x7d\x5f\xd6\xa0\xea\xac\x61\xea\x37\x77\xf9\xd0\xeb\x76\x2f\xd0\xac\xcb\xb7\x1e\x70\x43\xcd\x76\x96\x70\x09\x20\x75\x1a\x4e\xc2\x44\x4d\x90\xd9\x34\x0c\x35\xdb\xb2\x18\xbe\x0c\xc3\xcb\xb6\x18\x5e\xf6\x0b\x09\x38\x21\xe6\xf4\x21\x18\xe7\x73\x7a\x04\xd6\x31\xf2\xe0\xac\x08\xfb\x7a\x1c\x8e\xfa\x61\x5f\xd7\x57\xc2\xa4\x88\x6e\x3b\x01\xc7\x02\xd1\x6d\xd7\x57\x44\xeb\x42\x45\x04\x93\x6d\x4e\xa8\x84\x38\x40\xd6\x09\x98\x2d\xe8\x38\x4f\x7e\xb7\x0f\x5e\x5b\xe3\x88\x4b\x7e\xb9\x8f\xfc\x62\x5f\xc0\x09\xf7\x9e\x22\x75\xaa\x77\x36\x62\x11\x4a\xbf\xae\x48\x5d\xcf\xdb\xc9\xb9\x19\x97\xa1\xb5\xcf\xe5\x76\xa2\xae\xa0\x89\xba\x82\x26\x9a\x29\x28\x5f\x86\xa7\xc4\x40\xbf\x04\xb3\x7c\xa0\x9f\x87\x69\xc8\xb5\x70\x84\x3e\xf0\x9d\xcd\x2c\x69\xe4\x0f\x87\xe0\x78\x75\xfb\x2e\x52\x47\x8d\x09\xa2\x50\xb0\x4c\x83\xbb\x43\xff\xe7\x21\xf2\xb1\x01\x78\xb5\xdb\x13\xfc\xd1\xa4\xdd\x5c\x20\x85\x29\xcb\x34\xf2\xe6\x62\x9b\xc2\x28\xec\xe3\x0f\xc8\xce\xe6\xf5\xf0\x97\x45\xf9\x26\x0c\xa5\x10\x2e\x80\x9e\x88\x17\x30\x19\x32\x22\x44\x89\x6c\xca\xa0\xae\xc2\x1b\xbb\xda\xe9\xba\xa9\xe8\x0c\xe8\x8f\x8d\x86\x2e\xf4\xc7\x46\x43\x17\x1a\xba\xd0\xd0\xb5\x8d\x0c\x5d\xe8\x8f\x8d\xfe\xd8\x68\xe8\x42\x43\x17\x1a\xba\xd0\xd0\xd5\x13\x86\xae\x2d\x48\x85\xd0\xe3\x1b\x6d\x73\xe8\xf1\xbd\x75\x6c\x73\xe4\x5d\x43\x90\x11\x94\xd1\x5a\x54\x0b\x19\x97\x41\x05\x03\xd1\xfa\x91\x5b\x2d\xb3\x44\x6d\xf2\xbb\x83\xe4\x33\x03\x70\x17\xbb\x7f\x32\x78\xfb\xb5\xd5\x6c\xb2\xdc\x1c\x61\xbc\x62\xb2\x85\xb8\x2d\x78\xf1\x00\x7f\xe0\x4a\x6d\x65\x16\xb2\xec\x1d\xb3\xba\xed\x6c\xb5\xb0\x0e\x37\xa2\xf3\xed\xb5\x9d\x40\xae\x2b\x66\xeb\x73\xf1\x34\x72\x82\x1c\x93\xb8\x31\x72\x34\x49\xcb\x07\xeb\x1d\x8c\xe1\x8a\xd0\x11\xa1\x23\x42\x47\x84\x8e\x08\x1d\x11\x3a\x22\x74\x44\xe8\x88\xd0\x11\xa1\x23\x42\x47\x84\x8e\x9b\x09\x1d\x11\x09\x22\x12\x44\x24\xb8\x8d\x91\xe0\xf7\x3e\x07\xe9\x98\x20\x10\xbc\xf5\x2c\x5e\x77\xf2\xe7\x57\xc9\xff\x09\xc4\x81\x18\x6a\x1c\x07\x62\x96\x3d\x79\x85\x3d\x29\xc2\xaf\xd6\x3a\xca\xfb\xd7\x7b\x9c\xd3\x61\x34\x08\xe4\x55\x18\x0d\x02\x79\x15\xf2\x2a\xe4\x55\xdb\x88\x57\x61\x34\x08\x8c\x06\x81\xbc\x0a\x79\x15\xf2\x2a\xe4\x55\x3d\xc1\xab\x30\x1a\x04\xe2\x25\x8c\x06\xb1\x75\xf0\x52\xfe\xb9\x68\xff\xa6\x9c\xf0\x6f\x3a\x01\xc7\xb9\x7f\xd3\x41\xc8\xc2\x58\xec\x69\x6e\x9f\x18\xcd\xea\xb6\xd3\x6c\x40\x88\xd9\x78\x67\xa6\x61\x32\x58\x7b\x5e\xdb\x7f\x57\x75\x4c\x88\x3f\x09\xc4\x84\xb8\xd3\x8b\x09\x11\x60\x5d\x4a\x78\x58\x88\x0e\xd0\x2e\x01\xa7\xb8\x6b\x58\x4d\x64\x88\x51\xd8\xbf\x8e\xc6\xc4\xe0\x10\x18\x1c\xa2\xc5\xe0\x10\x5f\x4e\xc0\x69\x31\x93\x8f\xc2\x61\x3e\x93\xc7\x60\x7d\x83\x0f\xa6\x44\x7c\x88\x93\x30\xe1\xc7\x87\x58\x77\x21\xd3\x22\x44\xc4\x29\x38\x11\x08\x11\xb1\xee\x52\x36\x1a\x25\xa2\x39\x49\xd3\x50\xbe\xf8\x62\x28\xfd\x2b\x23\xbe\xa4\x79\x48\x68\xb1\x4a\xc1\x2c\xb1\x3d\xa9\x5c\x63\x02\x52\x27\x2d\x6e\x10\x52\x67\xca\xbb\xab\x0b\xf2\xe7\x49\xb8\x02\x73\x41\xf9\x93\xce\xc1\xd9\x16\x5c\x55\xa7\xf9\x07\x5c\xe6\x0c\xd5\x46\xda\x8a\xb4\x15\x69\x2b\xd2\xd6\x6d\x44\x5b\x51\x09\x8b\x51\xc2\x7a\x07\x47\x7f\xb9\x0f\xbe\xd4\x47\xbe\xd8\x97\xfc\x82\xd7\x55\x1f\xed\x7b\x32\xb8\x01\xd4\x0d\xc5\x16\x9b\x38\x65\x91\x2e\x09\xdb\xad\x07\x4a\xfc\x25\x4b\xce\x12\xde\x58\x01\x75\xcf\x30\x8d\x51\x83\x16\x55\xde\x25\x72\x0f\x18\x54\x0b\x05\x32\xf5\x06\x83\xd4\x0d\xf4\x95\x15\xaa\x31\xc5\xb3\xb4\xe6\x1b\x55\x7d\xd1\xae\x97\x46\xe4\xd6\x90\x7f\xae\x52\xb4\xd4\x02\x1f\x27\xba\xa9\x79\x0b\x8f\xbf\x38\x70\x7b\xb5\xdb\x2f\x15\x9b\x55\x32\xd8\x50\x2a\x7b\xd2\xfd\x20\xf9\x92\x25\x31\xdf\xdc\x22\x32\xa2\x9e\x2b\x54\x35\x42\xeb\x98\x22\xbc\x0a\x73\xbc\x06\x61\x5b\x5e\xa4\xfe\x48\xfd\x91\xfa\x23\xf5\x47\xea\xbf\xad\xa9\xff\x67\xfa\xe0\x95\x3e\xf2\xe9\xbe\xe4\xcb\xde\x6a\xfb\x03\x7d\xd3\x81\x03\xa5\xe5\x12\x55\x6d\xea\x4d\xfd\x39\xcb\x2c\xab\x45\xbe\x0e\xcf\x99\x25\xbd\xb0\x56\xe5\xf3\xe3\x76\xb7\x7f\x22\x95\x75\x78\x36\x73\x34\xa3\xcc\x0b\x39\x22\x16\xc9\x32\x35\xd8\x30\xf5\x57\x11\xaa\x98\x56\x79\x59\x35\x5c\x1f\x24\xab\x42\xc7\x96\xd4\x92\xab\xfd\xa7\xc4\xd5\x94\xb2\xa4\x1b\x6a\x49\x7f\x93\x2b\xbe\x17\xa9\xa2\x6a\x1c\xa1\x9b\x63\x82\xa8\x6a\xbe\x6a\x29\x0a\x1f\xb4\xfd\x87\x84\xbe\x9d\x51\xce\xe9\x5c\x24\x05\x2a\x6e\x5a\xf5\x5f\xe6\x9b\x2d\x1c\xa1\xee\x73\xed\xcf\x74\x96\x33\xa9\xdb\x45\x7d\xa6\xdd\x0f\xa9\x76\x66\x7a\xfb\x00\xbc\x75\x80\xbc\x79\x20\xf9\x4d\xcf\xa3\xed\xf3\xfd\x4f\x4b\x39\xc8\x86\xe8\xb2\x79\x53\x29\xaa\xd6\xa2\x5a\xac\x82\x0e\x9e\xa2\x46\xad\x25\xd3\x5a\x61\x6d\x11\x5a\xd3\xcb\x35\x2f\x8f\xae\x28\x57\x6b\x5c\x9d\xa4\x2c\xbe\x4a\x67\xfa\x42\x41\xd7\x7c\xc5\x9a\xaf\x8d\x7c\x9b\xe3\xb5\x2e\x5b\x9c\xe4\xca\xe1\xae\x7e\x99\x40\x33\xba\x72\xd3\xb3\x15\x78\x7e\x6c\xd5\x2f\xcb\x28\x82\x17\x71\x59\x1c\xd4\x56\x07\xc5\x37\x0c\xb2\x3d\x0f\xff\xab\x7a\x60\xd8\x27\x94\xc1\x9c\x5a\xb8\x51\xb4\xcc\x8a\xa1\xb1\xbb\xb8\x03\x19\xbf\xa9\xa6\xe1\x84\xb2\x22\x35\xa0\xea\x42\xdc\x2f\x58\xf4\x4a\x3a\xa1\x0c\x9e\x37\x2d\x1a\x28\x56\x29\xa8\x76\x41\xd5\xd8\xd7\xcb\xf6\x11\x2e\x83\xbc\x3c\x5b\xa8\xd3\x75\x05\x2e\x79\x65\x64\x52\x77\x94\x6b\xc7\x4d\x50\xb7\x41\xa3\x1a\x1a\xd5\xb6\xa9\x51\x2d\x5f\x84\x59\x41\xaf\xcf\xc1\x14\xa7\xd7\xa7\xe0\x04\x1c\x6f\x01\x5e\xce\x3b\xaa\x53\xb1\x63\x01\x72\x3a\x1c\x20\xdf\x49\xee\x10\xb3\xd9\x97\xb4\x6d\x36\x5b\x6d\xc1\xf8\x32\xe4\xaf\xf7\xc3\x95\xf8\x78\x15\x22\x52\x6e\x84\xf3\xba\x65\x96\xe8\x22\xdb\x28\x1b\x45\x79\xe1\x25\xf2\xbd\xfb\xc9\x87\xfb\xe1\xde\xb0\x98\x16\x22\x74\xee\x83\x16\x55\xb5\x9a\xdd\xf0\x15\xb3\x44\x73\xa2\xa0\x74\x96\x5d\x0f\x89\x42\x51\x13\xf0\x36\xf0\x48\x7b\x89\x7b\xfe\x9a\x30\x77\x1c\xe0\xa3\x95\x8d\xda\xc3\x70\x10\xb2\x91\x86\x0e\xde\x7a\xf2\xe3\x32\x81\x5a\xc5\x8e\x56\x3d\x7e\x04\x9e\x27\xd3\xeb\x88\x02\xe1\xbe\xb8\x2e\x70\xed\xf5\x07\xc2\x27\xc6\x6d\x64\xa0\x48\x1d\x48\xbe\x65\x77\xa3\x0e\x7b\xd8\xa2\xe5\x92\x5a\xa0\x0d\xfa\xec\x90\xbc\x65\x13\xbb\x2d\x77\x01\xce\xc1\x54\x8d\xa1\xb6\x95\x7e\x43\x52\x88\xe6\xda\x16\xcd\xb5\xff\x35\xd1\x26\xd1\x31\x23\x8c\xb6\x39\x38\xeb\x1b\x6d\x3b\x24\x85\xa2\x45\x43\xb9\xe2\x40\x17\x85\x54\xfa\x17\x6e\x6f\x24\x85\xee\x92\x0a\xbe\x5a\x25\x78\x0e\x8a\x5f\x37\x53\xee\x74\xc6\x40\x8b\x42\x28\x46\x08\xa1\x91\xa0\x2b\x46\x02\xa4\x43\x48\x87\x90\x0e\x75\x8a\x0e\xe5\x3f\x9e\x68\xf3\x16\xf9\x8a\xf0\xd4\xba\x08\x33\x01\x4f\xad\x0e\x6f\xbb\x95\x70\x15\x62\x37\xd9\x29\x9a\xa9\x59\x2d\xa2\x09\x25\x21\x56\xd1\xc8\xfd\xc8\x9e\x46\x5a\x44\xba\xac\x5a\x8e\xce\xfd\x6a\x04\x91\x6f\xb0\xa9\x19\x2f\x47\xc4\x43\xec\x86\x6a\x71\x5f\x6d\x41\xa3\xbc\x36\xfb\x79\x02\x9e\xfb\x83\x17\x57\xa8\x55\xa4\xc1\xab\xfb\x82\x57\x6d\xc7\x52\x1d\x5a\xd4\x0b\xa3\x75\xf7\x55\x95\xc2\xfe\x5e\x93\x57\x59\x2d\x73\x97\x60\x16\xf2\x35\xdb\xa9\x09\x38\xd6\xc2\x28\x9a\xe3\x87\x7e\x51\xa1\x89\x51\x68\x3e\xd2\x0f\x1f\xea\x27\x1f\xec\x4f\xbe\xdf\x5b\x15\xde\xd2\xbf\x7d\x76\x55\x35\x16\x53\xd6\xce\xdc\x13\x8d\x5b\xf5\xd9\xe0\xf4\x4f\xff\x0f\x45\x0c\xdc\x61\xbe\xb8\x09\xc7\x45\xb5\xc4\x9f\x64\x5a\x9c\x78\x9a\xdf\xc1\x35\x2a\x5b\x19\xca\xdb\xa6\x31\x27\x8e\xc1\x3f\xce\xa6\x85\xfc\x7b\xde\x9d\x2c\xfe\x8f\xc3\xd1\xdb\xbd\xdc\x2b\x09\xf8\x74\x82\xbc\x9c\x48\x7e\xca\xe3\xaf\x1f\x48\x9c\x37\xad\x02\x57\xf6\x8a\x26\x6f\x76\x53\x49\x2d\xb1\x9f\x52\xca\x64\xd5\x57\x70\x70\x2d\xf4\xb2\x8a\xed\xbb\xa0\x8d\xaa\x05\xfe\xe1\xdc\xb1\xaf\xa4\x17\xe4\xba\x4b\x4b\x9a\xad\x98\x37\x65\x9b\x0a\xc7\xb7\x32\x35\xcb\x25\x9a\x51\xc4\x1b\x79\xdc\x02\xb7\x2f\x39\x40\x0e\x6d\x00\xef\xf5\xa9\x1d\xbc\x5a\x55\x07\x0a\x7a\x8b\x7c\xb5\x63\x39\xb8\xfe\x50\xf8\xda\xb4\x8b\xdc\xc6\xdb\x03\xf2\xc7\xe0\x08\x39\x94\x1a\xf7\xc8\xed\x3d\x7c\x82\xc9\xd9\x1e\x78\x79\x6a\x80\x5d\x08\x12\xd9\x2d\xc8\x7c\xbf\xfb\x39\x18\x14\xcc\xd7\x76\x4c\x4b\x2d\xd2\x5a\xd0\x5b\xb0\x75\xcd\xd2\x59\x3b\x93\xaf\x5c\x25\xff\x61\x1f\xbc\x56\xde\xe8\xad\xa0\x83\x8d\xa3\x92\x4c\xcd\xcf\x4c\xf3\x02\xd2\xf7\xb1\x1b\xe7\xc5\xd3\x72\xcd\xf4\x2e\x62\x44\x12\x8c\x48\x82\x11\x49\xd0\x47\x1e\x7d\xe4\xd1\x47\x1e\x7d\xe4\x7b\xc6\x47\xbe\x77\x5c\xc0\xd1\x37\x19\x7d\x93\xd1\x37\x19\x7d\x93\xd1\x37\x79\x5b\xfb\x26\xa3\xf3\x24\x3a\x4f\x6e\x53\xe7\xc9\x2d\x19\x91\x44\x13\x9e\x2b\x07\xb8\xe7\x4a\xdf\xe5\x8b\x64\x02\x8e\xc1\x91\x48\x80\xe8\x42\x28\x97\x21\x7a\x7c\xa8\x99\xb4\xfe\xd7\xaf\xc6\x53\xc4\xe3\xe4\xa8\x44\x84\xd5\xbc\x4b\xfa\xa3\x78\xef\x0b\x71\x99\x8b\x09\x7b\x92\xfa\xf7\xbb\xeb\xd9\x18\xf1\x02\x96\xf8\x18\xec\x01\xf1\x5b\xa7\x41\x98\xe0\x56\x8f\xc1\x79\x98\xae\x31\xda\x1c\x82\xf1\xf5\x77\x00\x9a\x6b\xd0\x09\xae\x45\x27\xb8\x7f\x48\xc0\x39\x21\x04\x4e\xc3\x49\x2e\x04\x8e\x40\x4b\x63\x10\xf2\xc2\x0b\x6e\x0a\x26\x7d\x2f\xb8\x56\xcb\xba\x28\xec\xe2\xd3\x90\x0b\xd8\xc5\x5b\x2d\xac\x57\x25\x13\x0f\x93\x92\xfe\xe2\x48\xbd\x64\x7a\x30\x34\xc0\x89\x2f\xa5\x06\xc5\xf5\x1a\x29\xe5\xdd\xdc\x29\x79\x85\xc1\x4d\x10\xdc\x22\xb8\x45\x70\x8b\xe0\x16\x83\x9b\x60\x70\x13\xf4\x5b\xc6\xe0\x26\x68\x40\x40\x03\x02\x1a\x10\xd0\x80\x80\x06\x84\xb6\x18\x10\xf0\xf8\x0a\x1e\x5f\xc1\xe3\x2b\x18\xdc\x04\xed\x73\x68\x9f\xdb\x46\xc1\x4d\x9a\x03\xd0\x51\xee\xf4\x31\x44\xba\xfd\x6e\xe9\x6f\x19\x82\x31\xe1\x96\x6e\x50\xe7\xa6\x69\xdd\x60\x5b\x2a\xcf\x33\x5d\xf4\xf0\x98\x6e\x14\x2d\x6a\xdb\x85\x92\x6a\xdb\xd4\x26\xbf\x3e\x48\x7e\x61\x00\x5e\xed\x3f\x70\x6d\x35\x9b\x7c\x51\xaa\x9e\x86\xa6\xaf\xea\x5a\x45\x2d\x05\xcd\xa4\xaa\xb7\xcd\x9b\x11\x45\x4d\xb1\xa2\x32\x81\xd5\x7c\xc2\xd3\x03\x06\x79\x41\x83\x3e\x67\xad\x02\x67\x66\x99\x7a\x7b\x75\xdb\xa1\xaa\x96\x49\x3f\xcc\x1f\xb8\xe4\xd5\x66\x21\x1b\x7c\xc9\xac\x6e\x3b\x3d\xee\xf3\x9e\xbf\x11\x9d\x4d\x62\x4e\x0c\xf4\x19\xb8\xc0\x07\x3a\x4f\x89\xd0\xc2\x40\xe7\xc6\xeb\x73\x6c\xa7\xe6\x8e\xe9\xe7\xe2\xc7\xe9\x04\x39\x26\x87\x65\xdd\xd8\x90\x23\x33\xd8\xd0\x55\x51\x79\xae\xef\x0d\x9f\x32\x7b\x08\xf0\xef\xe6\x86\xdc\x3c\xfa\xfa\xa3\xaf\x7f\x1e\x4d\x46\x68\x32\x42\x93\x11\x9a\x8c\xb6\x8d\xc9\x28\xdf\x33\x16\x91\xb6\xd7\xa4\x65\x54\x9f\x47\x54\x8f\xa8\x1e\x51\x3d\xa2\x7a\x44\xf5\xdd\x47\xf5\x6d\xa7\x0a\xf9\x6d\x0d\x27\xf3\x08\x27\x3b\x07\x27\xf3\x3d\x0f\x27\xb7\xe0\xe1\x01\xf2\xf5\x61\x98\x15\x14\xb0\x60\x9a\x96\xa6\x1b\xa1\xa1\x88\x05\x0c\x8c\x08\x48\xcc\x8d\x79\x5e\x28\xe2\x1f\x1a\x26\xdf\xb6\x03\xee\x0a\x96\xe6\x39\xc4\x7e\x28\x21\xbb\x26\xc0\x07\x0d\x57\xd8\xb9\xc1\x2c\x66\x59\x71\x6d\x01\x84\x23\xbe\x5a\xc3\x55\x37\xb9\x08\x32\xcd\xc8\xd7\xd7\x06\xab\x54\xe4\x40\xd9\x99\xb4\x78\xdd\x54\xe0\x4b\xea\xc2\x50\xf1\xca\x22\x64\xac\x87\x8c\xd1\x21\x60\x78\xc5\xa0\x49\x0a\x29\x03\x80\xb3\x56\x8e\x0c\x44\x13\x32\x70\x11\x30\x22\x60\x44\xc0\x88\x80\x11\x01\x23\x02\x46\x04\x8c\x08\x18\x11\x30\x22\x60\x44\xc0\x88\x80\x11\x01\x63\xb7\x01\xe3\x38\x1c\x20\x99\xd4\x88\x17\xaf\xf3\x8e\x60\xa4\x4f\xbe\xaf\xbb\x15\x62\x7c\x22\xf6\x44\xec\x89\xd8\x73\x0b\x61\xcf\x37\x8f\xc2\x9c\xc0\x9e\x6a\xc5\x31\xed\x82\x5a\xd2\x8d\xe2\xd8\xea\xf8\x22\x75\xd4\xf1\x28\xd0\xc9\xa1\x99\x69\x38\x6a\xa9\x6c\x6a\xee\x73\xd4\xf2\xd0\xe7\x8f\x8c\x90\x4f\xf7\xc3\x9d\x81\x12\xaf\xc9\x12\x93\xe9\x90\xfc\x6b\x8f\x79\xc5\xcd\x99\xda\xa4\x57\x5c\xfa\x28\xbb\x77\xd2\x2f\x64\x41\x94\xe1\x43\xc7\x88\x07\xdb\x9c\x91\x2d\x3a\xe2\x02\x3c\x2d\xa8\xe1\x1c\x5c\xe2\xd4\x90\x07\x40\x89\x8c\xe8\x10\x68\x8e\x8c\x6c\x8e\x4c\xc4\x17\xc4\xa7\x47\x2a\x52\x07\xae\x17\xe3\xd1\xe1\x34\xc9\x49\x3a\x18\x78\xbd\x74\x5d\x8c\x78\x79\x80\x2f\x8a\x5a\x42\xf2\x17\x77\x87\xf7\xe6\x68\x78\x72\xb6\xa8\x0e\x9d\x90\xb7\x6f\x7a\x9f\xe6\x9e\x85\x67\x60\xa1\x26\x54\x4d\x9b\xfa\x0e\x8f\x43\x63\xf0\x9a\x16\x83\xd7\xfc\x46\xa2\x63\x12\x05\xae\x8a\x70\x36\x4f\xc1\xbc\x1f\xce\xa6\x7d\xa5\x6f\x30\xcf\x5b\xb7\x04\x59\xfa\xd7\x6e\x0f\x17\x64\x8a\x97\xdf\x2d\x4a\x76\x1d\x17\x77\x6c\xbe\xe8\xc2\x8c\x6f\x98\xf1\xed\xd6\x8d\x9c\x80\x47\x66\xf1\xc8\x2c\x1e\x99\xc5\x8c\x6f\x1b\xcb\xf8\xd6\x9c\x3e\xb1\x4e\xe5\x21\x44\xfd\xc8\xfd\xca\x9e\x70\x7d\xe2\x48\x4c\xa6\xb7\x28\x2d\xe3\x18\xcf\x0b\xb4\xa9\x4a\x06\xe6\x7e\xdb\x6e\xaa\x0d\xe6\x7e\xc3\xdc\x6f\x9b\x9c\xfb\xcd\xea\xdc\xc6\x37\x6e\x35\xe9\xd6\xde\x33\x3e\x19\xdc\x34\xe4\xc8\xd9\xd4\x69\xcf\xdc\xb3\x37\x68\x22\x8a\x78\xcf\xad\x60\x34\x22\x7f\x33\x04\x93\xb1\x27\xf0\x23\x58\xb4\x3c\x98\x4f\x6d\xf2\xa1\x21\xf2\x89\xba\x33\xf9\xf6\xba\xce\xe4\xb7\xe9\x38\xfe\xbe\xba\xe3\xf8\xfe\xfa\x2d\xdf\xb4\x35\xce\xe4\xb7\xdd\x2b\x36\x76\x36\x36\x73\x68\xfe\xfa\x33\xf1\x53\xf6\x30\x39\x18\x3c\x8c\xdf\xdc\x21\x7e\xf4\x96\x45\x6f\x59\xf4\x96\x45\x6f\x59\xf4\x96\x45\x6f\x59\xf4\x96\x45\x6f\x59\xf4\x96\x45\x6f\x59\xf4\x96\x45\x6f\x59\xf4\x96\xed\xb6\xb7\xec\xd6\x83\x18\xe8\xf9\x8a\x9e\xaf\xe8\xf9\xba\x85\x3c\x5f\x5f\x19\x85\x29\xe9\xf9\x5a\xd6\xe9\x8b\x0e\x35\x78\x6f\xd5\x9e\xf8\x2f\x54\x6c\xc7\x5c\x71\x0b\x0c\xa2\x2f\xe9\xec\xfa\xaf\x46\xc9\xdf\xf4\xc3\xdd\x55\x85\x78\x07\xfd\xf7\x87\xb8\xbb\x4e\xf1\x12\xdd\x4d\xe5\xb4\x57\x62\xfa\x00\xf7\x77\x0d\x96\xe3\xa6\xc2\x8a\x78\xa2\xcd\x8e\xae\xdf\x99\x80\x9b\x02\xf8\x95\xc1\xe0\xc0\x6f\x19\x96\x40\x8b\x02\x7e\x7e\x35\x47\x3d\xe8\xe2\xb3\xbf\xea\x46\xf5\xb2\x98\x45\x7c\x49\x2c\x17\x7c\x63\x3c\xf2\xbb\x44\x66\x65\xb0\xd8\xa8\x97\x44\x1d\x9c\x0f\x1b\x00\x10\xe3\x7c\x9b\xfc\x10\x44\x75\x7a\x26\xdc\x2b\x36\xb2\xdf\x0f\xba\x6e\xb1\x9b\xd6\xf5\xb9\x37\xc1\x8b\xb0\x5a\x63\x73\xed\x52\xd7\xa3\x7d\x16\xfd\x65\x5b\xf4\x97\x7d\x57\xdf\xe6\x09\xac\x6f\x15\xfe\xb4\x15\xb0\x7d\x7f\xda\xde\x11\x97\x31\xfe\xb6\xcd\x49\xd3\x46\xd2\x71\xbd\x92\x36\xfd\xd9\xdb\xa3\xc4\xe5\xc3\x9e\xef\x6d\xa4\x84\x1c\x97\xce\xb7\x9b\x27\x20\xd1\xeb\x16\xbd\x6e\xd1\xeb\x16\xbd\x6e\xd1\xeb\x16\xbd\x6e\xd1\xeb\x36\xdc\xeb\xb6\x39\xad\x62\x5d\x9b\xb0\x18\x35\x23\xf7\xd7\x7b\xa2\xb4\x8a\xa3\x31\x1e\xb8\x91\xba\x46\x56\xb8\xe0\x6e\x8a\xaa\x81\xbe\xb7\xdb\x4d\xc1\x41\xdf\x5b\xf4\xbd\xdd\x64\xdf\xdb\x5e\xc6\x7e\x71\x3e\xb3\x9b\xb0\x93\xcd\x9f\x83\x29\x32\x99\x3a\xe3\xd9\xa6\x1e\x09\xba\xe9\x46\x95\x53\xef\xa7\xdb\x76\x2f\xda\xcf\x0f\xc2\x3d\x63\x6a\x59\xf7\x5d\x66\xa9\xa1\x95\x4d\xdd\x70\x6c\xf2\xf1\x41\xf2\x91\x01\xd8\x59\x30\x2d\x7a\x6d\x35\x9b\xac\x34\xe7\x15\x7b\xce\x7d\xbe\x4d\x7e\xb1\x43\x32\x8e\xac\x45\x17\xb2\x5e\xd9\xb3\xba\xed\x9c\x37\xad\xc9\x52\xc9\x73\x92\xb5\x7b\xdf\x33\xb6\xfb\x81\x64\x9b\xf2\x8c\xbd\x18\x3f\x1d\x86\xc8\x3e\x39\x1d\x52\x29\x39\xf8\xbd\xbe\xa8\x4a\x60\x85\xce\xb0\xe8\x0c\x8b\xce\xb0\xe8\x0c\x8b\xce\xb0\xe8\x0c\x8b\xce\xb0\xe8\x0c\x8b\xce\xb0\xe8\x0c\x8b\xce\xb0\xe8\x0c\x8b\xce\xb0\x98\x9b\x0a\x5d\x55\xd1\x55\x15\x5d\x55\xbb\xe5\xaa\xfa\x5f\x87\x61\xbc\x9a\xec\x45\x1c\x86\x17\xe4\xc5\xf5\x4c\xfd\xdb\x21\xf2\x99\x00\xf4\x6b\x2a\xe9\x14\x47\x4e\x3d\x91\x74\x2a\x19\x80\x85\xfe\xf1\x79\x5e\xbf\xde\xc7\x83\xdd\x3f\x38\x1f\x9b\x67\xea\x42\x3c\x1a\x7c\x84\xa4\x24\x10\xe4\xaf\x0c\x39\x40\x9f\x4a\x21\x16\x44\x2c\x88\x58\x10\xb1\x20\x62\x41\xc4\x82\x88\x05\x11\x0b\x22\x16\x44\x2c\x88\x58\x10\xb1\x20\x62\xc1\x9e\xca\x28\xc5\x77\x70\xb7\x42\x70\x40\x84\x95\x08\x2b\x11\x56\x6e\x21\x58\xf9\x4f\x43\x70\xa2\x29\x58\xe9\x7a\x73\x1b\xce\xaa\x59\xaa\xac\xd0\x42\x49\xfd\xff\xd8\xfb\xfb\x38\x37\xae\xfb\xbe\x17\x7f\x01\xbb\x94\xc8\xaf\x68\x8b\x3a\xb2\x2c\x13\xa2\x24\x08\x94\x16\xbb\xe0\x2e\x96\x58\x3e\x2c\xb9\x7c\x5c\xec\x03\xb9\xe0\x8a\x5c\x71\x25\xea\xc1\xa2\xe8\x59\x60\x16\x04\x85\xc5\xc0\x18\xec\x32\x74\x7e\x6a\x6d\xcb\x4e\xdd\xa6\xfe\xb5\x71\x93\xb8\x69\x1d\x5f\xdb\x75\x5d\xab\x55\xec\xd8\x6e\x7a\x93\xa8\xad\xdd\x36\xb2\xd5\xaa\x55\x6d\xa7\xb5\x9b\x38\x71\xe3\x46\x49\x9a\xdc\x1b\xc7\x49\x6e\xed\x24\xb5\xaf\xee\x6b\xce\x99\x47\x60\x06\x83\xc5\x0e\xb0\x58\xe2\xf3\x0f\x5f\x4b\xcc\xcc\x99\x33\x67\xce\x7c\xcf\xf7\xbc\xbf\x4f\x85\x15\x95\xfd\xcb\x41\xf6\x9a\x8d\x5a\xbe\x27\xd4\x9c\xaf\xe2\x82\xd9\xda\x25\xde\xda\x94\xd6\x5a\x40\x7e\x8b\x49\x57\x14\xe9\x7a\x47\xe4\xf5\xdc\x40\x5e\xcf\xc7\xfd\x11\xe5\x41\x36\x56\xeb\xbd\xe8\xfa\x1e\xe0\xc9\x08\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\x09\x64\xb9\x99\xc8\x12\xf8\x11\xf8\x11\xf8\x11\xf8\xb1\x1b\xf0\x63\x45\x36\xd9\x99\xb6\x28\x54\x14\x4d\x24\xb7\x8c\x1f\x2f\x5a\xad\x4d\x99\xad\xb5\x15\x3f\xba\xde\x11\xf8\xb1\xe3\xf8\xd1\xf5\x3d\x00\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\x02\x3f\xde\xa4\xf8\xf1\x27\x9f\xa1\x83\xa2\xaa\x50\x65\x49\xca\x26\x0d\x12\xc5\x9b\xaa\x2b\x2d\x54\x5c\x55\xab\xda\xce\xa8\x28\xab\xec\xeb\x97\xd9\xbf\x1a\xa0\xdd\xda\x55\x93\xf6\x8b\xcc\x84\xc6\x43\x42\x2d\xad\xe8\x0b\xaa\x21\x71\x8d\xc0\xed\x29\xd1\xd8\x45\xa5\x28\x27\xe2\xda\xa9\x17\x6b\x5b\x32\xb2\x18\x5b\x27\x76\x39\x29\x4c\x83\x9b\x81\x9b\xa5\xc1\xcd\xc0\xcd\xc0\xcd\xc0\xcd\x7a\x86\x9b\xa5\xbb\x86\x9b\x05\xde\x93\x96\xb9\x59\x1a\xdc\x0c\xdc\x0c\xdc\x0c\xdc\x0c\xdc\xac\xf3\xdc\x2c\xdd\xd3\x10\x2a\x0d\x08\xd5\x3e\x08\x95\xee\x76\x08\x95\xde\x82\x10\x2a\x93\xa5\xb3\xc2\xc3\x6a\x92\x4e\x71\x0f\xab\xa3\x34\x4e\x87\xbc\x3c\xac\x92\x9c\x54\x99\xa5\x5a\x2c\x3c\x34\x5f\x50\xfd\x3d\xab\xee\x73\xf7\xac\xba\x95\x6d\x13\x4e\x55\x05\x7f\xa7\xaa\x59\x36\xad\x3b\x55\x79\x32\x33\xa3\x4a\x8b\xd5\xb9\xfa\xc2\x2c\xb1\x5f\xde\xd1\x88\x9f\xbd\x45\x2c\x53\x51\xc9\x81\xca\x86\xc4\xaf\x9d\x84\x65\x82\x6d\x9d\xa1\x19\x9a\xaa\xa9\xb4\x75\x80\x52\xeb\x7e\x49\x28\xb1\x85\xf2\xc9\x2d\x96\x4f\xfe\x7e\x88\xa6\x85\x9c\x38\x41\xc7\xb8\x9c\x38\x44\xad\x4c\x41\x9a\x13\xb5\x90\xd3\x74\xda\xaa\x85\xdc\x62\x53\x19\x51\xd9\x70\x8a\x26\x6d\x95\x0d\x5b\x6c\xab\x75\xd1\x55\x56\x3a\x2b\xba\x12\xcf\x8f\x34\x12\x5d\x46\x61\x4b\x5b\x95\x50\x65\xd9\x21\xc6\x0e\x88\x33\x3c\xc5\x98\x79\x61\xfb\x04\x5a\x7b\x2a\x24\x83\xfe\x82\xfe\x82\xfe\x82\xfe\xf6\x0e\xfd\x85\x3e\xe7\xa3\xcf\x75\x0f\x1e\x47\x75\xfa\x8e\x54\xa7\x87\x15\x02\x56\x08\x58\x21\x60\x85\x80\x15\xa2\xa7\xad\x10\x5f\x0b\xd3\x6b\x61\xf6\x6a\x38\xf2\x8a\xb9\xda\x7e\x2c\x3c\x6d\x0b\xb0\x2d\x17\x65\x49\x95\xcd\x4f\x7f\xa1\xa2\x94\xa5\x3c\x5f\x87\x17\x94\x62\x21\x7b\xc3\xe1\x83\x64\xbc\x6e\x2b\x42\x57\x7b\xe1\xa9\xe4\x78\x32\xba\x28\xe4\x88\x58\x24\xcb\x72\x49\x9b\xa6\xd6\x2a\x22\x47\x95\x4a\xf9\xaa\x54\x32\x7c\xa2\x2a\xab\xf2\xe8\xb2\x54\x34\xb4\xff\x98\x38\x1a\x8b\x2e\x17\x4a\x52\xb1\xf0\x2e\x43\x7c\x2f\xc9\x51\x29\xc7\x91\xbe\x32\x2a\x08\x6f\xce\x52\x2d\x45\xe3\x71\xd5\xba\x48\xe8\xdb\xc9\xe8\x4c\x81\x8b\x24\x5b\xc7\x95\x4a\xfd\x93\x59\x66\x94\xaa\x50\xf7\xb9\xf6\xa7\x54\xaf\x26\x63\xbb\x44\x7f\xa6\x8d\x07\x71\x3a\x57\x7d\xa0\x9f\xde\xdf\xcf\xde\xdb\x1f\x79\xc3\xf4\xb0\xfb\x66\xdf\xe3\xba\x1c\xd4\xa6\xe8\x55\xe5\x7a\x34\x2f\x55\x96\xa4\xbc\x03\x3f\x98\x8a\x9a\x5c\x59\x56\x2a\x2b\xda\x58\xb8\xf6\xf4\x42\xcd\xcd\xbd\x3b\xca\xd5\x1a\x43\x27\x29\x8b\xa7\x2a\x68\xfa\x42\xb6\x90\xb3\x14\x6b\xbe\x36\x8a\xe2\xe8\xc6\xe8\x6a\x8b\x93\xbe\x72\x18\xab\x5f\xd2\x36\x8c\x86\xdc\x34\x6d\x17\xa6\x5f\x9d\xf3\x66\xc9\xa8\xc0\x4d\x5c\x16\xdb\xb5\xd5\xb8\x78\x86\xb8\xb6\xe7\xe1\x7f\x39\x27\x86\x7a\x2c\x1a\x4f\x4b\xd9\x67\xf3\x15\x65\xb5\x94\xd3\xce\xe2\x0e\x6d\xfc\xa4\x9a\x81\x13\xca\x8a\xae\x01\x39\x1b\x31\x9e\x60\xc9\x6c\xe9\x58\x34\x3e\xab\x54\x64\x5b\xb3\xd1\xac\xa4\x66\xa5\x9c\xf6\xf4\xfa\xf8\x08\x17\x46\xde\x9e\x2a\xd4\xe9\xba\x06\x97\xcd\x36\x92\xb1\x3b\xca\xb5\xf3\xc6\xae\xdb\xc0\xc8\x07\x23\x5f\x8f\x1a\xf9\x32\x79\x9a\x17\x20\x7c\x86\xa6\x38\x08\x3f\x41\xc7\xe8\x68\x0b\xf0\x72\xb1\x2a\x55\x57\x55\x5f\xf2\x9c\x70\x27\xcf\x77\xb2\x3b\xc4\xd7\x6c\x49\xda\x4e\x52\xe8\xc0\xa3\x57\xd8\x37\x07\xe8\xcd\x46\x32\x0e\xe1\x94\xcd\x7e\x6d\x80\xfd\x72\x9f\x95\x5f\x63\x6f\x63\xaf\x76\x9e\xdd\x21\x71\xbf\x76\x92\xc8\x7f\xc1\x7f\x98\x55\x2a\x93\xc5\xa2\x99\x0a\x43\xed\x72\x3f\xf6\xcc\x13\x74\x42\x4c\xaf\xc3\x74\x90\x4f\xaf\x24\x0d\x53\xc2\xd3\xa0\xa1\x8d\x8d\x36\x99\xf8\xb3\x06\x62\x84\x6d\xae\xf6\x57\x6d\x66\x8b\xfa\x2a\x60\xc8\x64\x01\x8f\x7c\x64\xb2\x80\x4d\x06\x36\x19\xd8\x64\x7a\xc8\x26\x83\x4c\x16\xc8\x64\x01\x16\x0e\x16\x0e\x16\x0e\x16\xde\x15\x2c\x1c\x79\x26\x90\x67\x62\xab\xd0\x3f\xe4\x99\x68\x47\x9e\x89\x3f\xdc\x4d\x27\x44\x9e\x09\xa9\x5c\x56\x47\xd7\x52\x3e\x69\x6e\xb5\x4f\x57\xfc\xfe\xdc\xa8\x9a\x95\x8a\x32\xfb\x27\xbb\xd9\x5f\x86\xe9\x56\xed\xf2\x2b\x6b\xa9\xc8\x40\x45\x96\x72\x51\x7e\xc8\x18\x63\x6b\xc1\xd5\x73\x9c\x2e\xca\xd5\xc4\x5e\xed\xbc\xc9\x72\x59\x75\xc9\x45\xbb\x28\x57\x17\xb5\x06\x82\xf5\x2c\xcd\xbc\x9d\x4e\x0b\x7c\x76\x94\xc6\x39\x3e\x4b\xd1\x28\x8d\x78\xe2\x33\x69\xb5\xaa\x68\xcf\xa1\xe9\xaf\x6b\xa9\x24\xef\x91\x2f\x41\xbb\xd7\x9d\xa0\xdd\xc2\xfa\xf3\x72\x95\xae\x2d\xf8\x03\xb4\x11\xb6\xcf\xa5\x60\xbe\xad\x33\x3a\x55\x13\xfd\x89\x7c\x79\xbb\x35\xf6\x43\xda\x4b\x92\xb2\x72\x13\xc3\x3f\xa0\x9f\xda\xd1\x37\x90\x9e\xa2\x49\x3a\x55\x13\xac\xb0\xde\x57\x00\xc7\x36\x04\x2a\xb4\x18\xa8\xf0\x89\x50\x00\x12\x60\x46\x04\x29\x9c\xa4\xe3\x56\x90\x42\x1b\x04\x49\x73\x92\xc2\x47\x3a\xd8\x05\x49\x03\xd1\x54\x5e\xad\x52\xfa\x2f\x6e\xb3\x04\xc9\x58\x59\xaa\x68\x1b\x58\x6d\xd3\xc7\x97\x9b\x26\x24\xca\x83\x65\x6d\x71\xe9\x98\x3c\xb9\xa7\xb6\xa1\x11\x7e\xff\x7d\xda\x9f\x13\x7b\xec\x07\x57\xe4\x4a\x5e\xb6\x1f\x1d\xb0\x1f\xd5\x34\xd0\xaa\x9c\x2f\x64\x47\xea\xce\x73\xb4\xa2\xfd\x7d\x43\x3f\xaa\xf5\x32\x7d\x9e\xe6\x29\x53\x23\xcb\x26\xe8\x48\x0b\xc6\xbe\x05\x8e\xc8\x21\xd6\x7c\xc4\xda\x67\xfb\xe8\xc5\x3e\xf6\x42\x5f\xe4\x53\xa6\xcd\xe8\xf9\xbe\xde\x11\x6b\x35\x54\x41\x1b\x67\x4e\xc9\x39\xf9\xd2\x26\xa7\x65\x2b\x1b\xf4\x98\xb8\x43\x1c\x17\x0b\xa3\x8a\x54\xe4\x57\x96\x94\xd2\x88\xb8\x9a\x9f\xc1\x8d\x6a\x6a\x74\x30\xa3\x2a\xa5\x05\x61\x34\x7a\x58\xfb\x2c\xf4\xbf\x17\x8d\x8f\xc5\xfa\x71\xc8\x5b\xde\xa6\x5f\x0b\xd1\xab\x21\xf6\x4a\x28\xf2\xb2\xa9\x10\x7f\x3a\x34\xab\x68\xfb\xbb\x82\x1a\xcd\x2b\x7c\xd8\x95\x68\x6c\x59\xfb\x29\x16\x9d\x74\x3c\x05\xdf\xea\x08\x67\xdf\x55\xd5\xc2\xe3\x23\x52\x96\x3f\x38\x37\x3a\x14\x0b\x59\xdd\x8b\x47\x2e\xe6\xd4\xa8\x72\x5d\x1f\x53\x01\xe5\xcb\xb2\x52\x2e\xca\xc9\xa8\xb8\x23\xb7\xf2\x19\xef\x92\x6f\x39\x5c\x07\xc0\xbc\x7d\x6c\x1b\xef\x96\xc3\x62\xd5\x09\x0d\x32\x78\xc1\x7f\xbf\xbb\xe0\xdf\xce\x6e\xe1\x8f\x4c\x8d\x2b\x80\xf3\x06\x6f\x86\x0a\xe0\xec\xab\x43\x74\xd2\xb9\xd7\x69\x58\xd8\x43\xad\x4a\x55\x79\x79\xb5\x68\xdb\xf2\xb0\x0f\x0e\xb1\xdf\xeb\xb7\xd6\xc9\xcf\xeb\x55\x3d\xec\xa5\x3c\x4a\x06\xbd\x31\x7c\x0f\x16\xf5\x76\x16\xe5\x6a\x20\x85\x3c\x86\x2d\x5a\xcb\x89\xb4\xce\xf6\x0a\x55\x79\xc5\x12\x76\x71\x07\xf9\xb7\xb5\x9d\x4c\x08\xfe\x58\xbb\x50\xdb\x7a\xd9\xed\x6e\x10\x9b\x51\xf8\xc3\xfb\x1b\xe2\x1d\xa3\x6b\x17\xfc\x3f\xdb\x61\x96\x30\x3e\xdb\x72\x59\x35\xbe\x57\x6b\xdc\xe1\x22\x01\x17\x09\xb8\x48\xc0\x45\x02\x2e\x12\x70\x91\x80\x8b\x04\x5c\x24\xe0\x22\x01\x17\x09\xb8\x48\xc0\x45\x02\x2e\x12\x9b\xe9\x22\x71\x84\x0e\xb3\x83\xb1\x31\x13\x74\xdc\xed\x80\x23\xd6\xee\xed\x66\x40\x24\x70\xdf\x80\xfb\x06\xdc\x37\xb6\x90\xfb\xc6\x5f\x0c\xd0\x6e\x27\xd2\xcc\xc9\xe5\xa2\x72\x63\x85\xc7\x48\xfd\xe6\x00\x7b\xad\xcf\xa2\x95\x83\x8d\x63\xa4\xa6\xcd\x2b\x13\x0f\x6a\x67\x0a\x42\x68\xfd\xba\xd5\xa2\xa5\x2e\x53\x5a\x60\xc2\x63\x74\x94\x63\xc2\x03\x94\xa2\x51\x6f\x58\x5f\x2e\xab\x22\x6f\x98\xf1\xc0\x81\x84\x4c\x9d\xf7\xe7\x82\xfb\xd8\x90\x60\x81\xd6\xad\xc9\xcd\x05\xa4\x5c\x56\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x81\x05\x11\x39\x05\xf4\x06\xf4\x06\xf4\xd6\x31\xf4\xf6\xd5\x38\xbd\xd5\xc8\x49\x24\xfc\x08\xb5\xef\xab\x90\x95\x55\xf6\x4b\x71\xf6\x42\xbf\x95\x9b\x48\xd5\x97\xad\x52\xae\xb0\x56\xc8\xad\x4a\x45\x87\xbf\xa0\xa9\x22\x2e\x8a\xcb\x03\xf1\x11\x4c\x26\x06\xf8\x05\x22\xd9\x91\xde\xf2\x7c\x41\xdd\x72\x10\x6f\x33\x7c\xfd\xe6\xfc\x91\xdd\x00\x7b\xb0\x36\xcb\x91\x3e\xc8\x4e\xd7\xdb\xbd\xee\x74\x70\x27\x23\xfe\x8c\x1c\x11\x02\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x01\xe9\x75\x0a\xe9\x7d\xf4\x19\x3a\xd2\x54\x32\x24\x4d\x4e\x57\x14\x4d\x4a\x6a\x9b\x06\xfe\x4a\xd9\x77\x2e\xb3\x8f\x0d\x58\xce\x76\xfb\x1b\x3b\xdb\x4d\x99\x2d\x5c\xd4\x5b\x48\x0c\x58\x4e\x77\x56\x58\x6e\xfd\x79\x5d\x4e\xec\xd2\xa0\x59\xa0\x59\x28\xb7\x0a\x9a\x05\x9a\x05\x9a\xd5\x3b\x34\xab\x8b\xaa\x89\x76\x0d\xcd\x42\x99\x4b\xd0\x2c\xd0\x2c\xd0\x2c\xd0\xac\xcd\x28\x73\xd9\xd3\xf0\x09\x75\xf8\x7a\xb9\x0e\x5f\x7a\x0b\xc2\xa7\x8c\x4c\x19\xe1\xe9\x34\x45\x93\xdc\xd3\xe9\x18\x1d\xa5\x71\xdf\x70\xc5\x7a\x40\x14\x48\xd8\xe2\x25\x7f\x1f\xa8\x03\x2c\x55\x9f\xce\xac\xbe\x3b\x0e\x87\xa8\xd8\xc7\x77\x58\x88\xec\x1e\xb1\x06\x45\x25\x37\x1a\x36\x28\x0e\x76\x90\x87\x09\x7c\x35\x47\x67\x68\xa6\x26\xad\xeb\x21\x3a\xd0\xc2\x7b\x40\x46\x57\x24\xaa\x6e\x31\x51\xf5\x0f\x43\x9e\x1f\x30\xcd\x0a\x29\x71\x8a\x4e\x70\x29\x31\x4e\xad\xcd\x4e\x3a\x27\xf2\x58\x4f\x53\xda\xca\x63\xdd\x72\x63\xbc\xec\xe9\x18\x2f\x7b\xba\x5d\xd4\x3f\xde\x40\x6b\xfe\x32\xaa\xac\xb4\x51\x46\x25\x5e\x1f\xb6\x64\x54\x5c\x2f\xb3\x6c\xab\x59\xad\x2c\xbb\xc9\xab\x31\x71\xa2\x90\x57\x53\xe6\xd9\x1d\x94\x5c\x8f\xd2\x45\x5a\xb0\x4b\xae\x44\x9a\x4e\xb7\xe0\x29\x3b\xcd\x1f\xe4\x02\xe7\xb3\x2a\x48\x2e\x48\x2e\x48\x2e\x48\x6e\x0f\x91\x5c\xa8\x6d\x3e\x6a\x5b\xf7\xa0\xee\xd7\xc3\xf4\x9d\x30\xfb\x76\x38\xf2\x2d\xf3\x55\x7d\x2e\xfc\xa8\x7d\x73\x59\x28\x45\x55\xb1\x41\x8c\x2e\xc9\xcb\xc2\x2e\x6c\x42\x18\x6b\xc9\xd2\xbf\x12\x3e\x58\x36\x05\xb1\xa4\x94\x46\x4a\x72\x5e\xe2\xaf\x44\xdf\x5f\xda\x15\x49\x81\x63\xcd\xc9\xa0\xeb\x0a\x85\x95\x15\x39\xa7\xa9\xaa\xc5\x1b\x96\xc1\xd6\x12\xed\x85\xe2\xb0\xbe\xed\xe4\x8f\x1b\xcd\x57\xa4\x2c\x9f\x27\x05\x25\x67\x2e\x3c\xd6\xe2\xc0\x6d\xe1\xc6\x7b\x59\x55\xb5\x4e\xda\x07\x4a\xd2\xae\x34\x1e\x48\xbf\xc9\xb2\xf8\xde\x8c\x26\x92\xa2\x9f\x22\x97\xbe\x4b\x1f\x63\x8c\x77\x61\x81\xf7\xc0\x6d\x3b\x0d\x8b\x02\x2c\x0a\xb0\x28\xc0\xa2\x00\x8b\x42\x4f\x5b\x14\xbe\x16\xa6\xd7\xc2\xec\xd5\x70\xe4\x15\x73\xb5\xfd\x58\x78\xda\x16\xac\x5a\x2e\xca\x92\x2a\x9b\x9f\xfe\x42\x45\x29\x4b\x79\xbe\x0e\x2f\x28\xc5\x42\xf6\x86\xc3\x9f\xc8\x78\xdd\x56\xb4\xab\xf6\xc2\x53\xc9\xf1\x64\x74\x51\xc8\x11\xb1\x48\x96\xe5\x92\x36\x4d\xad\x55\x44\x8e\x2a\x95\xf2\x55\xa9\x64\xf8\x37\x55\x56\xe5\xd1\x65\xa9\x68\x68\xff\x31\x71\x34\x16\x5d\x2e\x94\xa4\x62\xe1\x5d\x86\xf8\x5e\x92\xa3\x52\x8e\xe3\x79\x65\x54\xd0\xda\x9c\xa5\x5a\x8a\xc6\xe3\xaa\x75\x91\xd0\xb7\x93\xd1\x99\x02\x17\x49\xb6\x8e\x2b\x95\xfa\x27\xb3\x4c\x22\x55\xa1\xee\x73\xed\x4f\xa9\x5e\x4d\xc6\x76\x89\xfe\x4c\x1b\x0f\xe2\x74\x94\xfa\x40\x3f\xbd\xbf\x9f\xbd\xb7\x3f\xf2\x86\xe9\x2d\xf7\xcd\xbe\xc7\x75\x39\xa8\x4d\xd1\xab\xca\xf5\x68\x5e\xaa\x2c\x49\x79\x07\x84\x30\x15\x35\xb9\xb2\xac\x54\x56\xb4\xb1\x70\xed\xe9\x85\x9a\x9b\x7b\x77\x94\xab\x35\x86\x4e\x52\x16\x4f\x55\xd0\xf4\x85\x6c\x21\x67\x29\xd6\x7c\x6d\x14\x25\x77\x8c\xd1\xd5\x16\x27\x7d\xe5\x30\x56\xbf\xa4\x6d\x18\x0d\xb9\x69\xda\x21\x4c\x1f\x39\xe7\xcd\x92\x51\x01\x8e\xb8\x2c\xb6\x6b\xab\x71\xf1\x0c\x71\x6d\xcf\xc3\xff\x72\x4e\x0c\xf5\x58\x34\x9e\x96\xb2\xcf\xe6\x2b\xca\x6a\x29\xa7\x9d\xc5\x9d\xd3\xf8\x49\x35\x03\x27\x94\x15\x5d\x03\x72\x36\x62\x3c\xc1\x92\xd9\xd2\xb1\x68\x7c\x56\xa9\xc8\xb6\x66\xa3\x59\x49\xcd\x4a\x39\xed\xe9\xf5\xf1\x11\xee\x88\xbc\x3d\x55\xa8\xd3\x75\x0d\x2e\x9b\x6d\x24\x63\x77\x94\x6b\xe7\x8d\x5d\xb7\x81\xc1\x0e\x06\xbb\x1e\x35\xd8\x65\xf2\x82\x20\xef\xe7\x04\x39\x7c\xe1\x1c\x3b\x41\xc7\xe8\x68\x0b\xf0\x72\xb1\x2a\x55\x57\x55\x5f\xf3\x57\x9b\xd0\xf1\xb5\x84\x3b\xb2\xbe\x93\xdd\x21\xa4\x84\x25\xc1\x69\x0b\xa6\x87\x66\xbf\x15\xa7\x7b\x85\x83\xfc\x12\xcf\x78\x61\xa6\xbe\xc8\x56\x94\xd2\x35\x65\x49\x65\xbf\x1a\x67\x9f\xe9\xa7\xed\xfc\xf0\x3a\x72\x5f\x4c\x55\x94\x52\x46\x59\x0a\x28\xf7\x85\xb8\x20\xad\xfd\x73\x29\xa5\x37\x8d\xe4\x17\xcd\x25\xbf\x98\xf7\xff\x32\x86\x58\x5c\xff\x32\xf8\x6b\x36\x3e\x0d\x31\xce\xc8\x7f\x81\x88\x01\xe4\xbf\x80\x9d\x09\x76\x26\xd8\x99\x60\x67\x42\xfe\x0b\xe4\xbf\x00\xdf\x07\xdf\x07\xdf\x07\xdf\xef\x76\xbe\x8f\xfc\x17\xc8\x7f\xb1\x55\x88\x26\xf2\x5f\xb4\x23\xff\xc5\x0f\x23\x34\x2d\xf0\xde\x72\x51\xb9\xae\x27\xb9\x48\x9a\x9b\x7b\x0e\x9a\x0a\xca\xe8\x5a\x6a\x49\xae\x4a\x29\x7e\x92\x9a\xbd\x2a\xaf\x48\x46\x7d\x7c\x5e\x33\x7f\x55\x65\x5f\x88\xb0\x2f\xf5\xd1\x1e\x5b\x2b\x93\x46\x23\x57\xf4\xab\x23\xf1\x8a\x2c\xe5\xa2\xe2\x02\xe3\x05\x58\xab\xf1\x6c\x51\xb9\xbe\xc8\xdb\x4e\x8c\x6a\x27\xce\xba\x34\x75\x49\xb4\x64\x9d\x2a\xe0\x6f\xb0\x6e\xb5\xeb\x8d\xcb\xb0\x8f\x9c\xfe\xa8\x49\xab\x87\xbe\xf8\xed\x59\x7f\xfc\x76\x96\xcd\xea\xf8\xad\xd1\x5b\xd2\xa9\x9c\xed\xd6\x36\x30\xc7\xbb\x45\xd7\xee\x75\xa7\x73\xb7\xb0\xfe\xbc\x5c\xa5\xc8\xc7\x77\xf8\xbc\xc2\x44\x45\x2e\x17\xa5\xac\xdc\xcc\x5b\x1c\xd3\xcf\xdd\xb4\x17\x99\x7e\x98\xce\xd1\x5c\x4d\x64\x47\xeb\x6f\x12\x6e\x82\x88\xee\x68\x31\xba\xe3\x5f\x84\x02\x15\x29\x17\x44\x20\xc7\x59\x9a\xb5\x02\x39\xda\x2a\xa3\xbc\xc5\x46\x79\xb5\x4a\x1d\x15\x61\xe9\x2f\xee\xf4\x91\x51\x07\xca\x52\x45\xdb\x7e\x6b\x5b\x56\xbe\x58\x36\x23\xac\xf6\x97\xb5\xb5\x71\x53\x44\xd5\x3d\xb5\x0d\x8d\xf0\xbe\xec\xd3\xfe\x9c\xd8\x63\x3f\xb8\x22\x57\xf2\xb2\xfd\xe8\x80\xfd\xa8\xa6\x4c\x57\xe5\x7c\x21\x3b\x52\x77\x9e\xa3\x15\xed\xef\x1b\xfa\x51\xad\x97\xe9\xf3\x34\x4f\x99\x1a\x31\x39\x41\x47\x5a\xb0\x3a\x2d\x70\xda\x0f\x39\xe9\x23\x27\x3f\xdb\x47\x2f\xf6\xb1\x17\xfa\x22\x9f\x32\xcd\x5f\xcf\xf7\xf5\x8e\x9c\xac\x01\x24\xda\x38\x73\xe0\xcf\x21\x9e\x36\x39\x2d\xb3\xdf\xa0\xc7\xc4\x1d\xe2\xe4\x5b\xd8\x87\xa4\x22\xbf\xb2\xa4\x94\x46\xc4\xd5\xfc\x0c\x6e\x1f\x54\xa3\x83\x19\x55\x29\x2d\x08\xfb\xd7\xc3\xda\x67\xa1\xff\xbd\x68\x7c\x2c\xd6\x8f\x43\xde\x02\x3c\xfd\x5a\x88\x5e\x0d\xb1\x57\x42\x91\x97\x4d\xdd\xfe\xd3\xa1\x59\x45\xdb\xaa\x16\xd4\x68\x5e\xe1\xc3\xae\x44\x63\xcb\xda\x4f\xb1\xe8\xa4\xe3\x29\xf8\xae\x4d\xf8\x62\xaf\xaa\x16\xe9\x1f\x91\xb2\xfc\xc1\xb9\xfd\xa4\x58\xc8\xea\x4e\x56\x72\x31\xa7\x46\x95\xeb\xfa\x98\x0a\xfb\x42\x59\x56\xca\x45\x39\x19\x15\x77\xe4\x06\x4b\xe3\x5d\xf2\xdd\x93\xeb\x00\x98\xb7\x8f\x6d\xe3\xdd\xda\x48\xec\xf1\x06\xd7\x8f\xfb\xdd\xd7\x8f\xed\xec\x16\xde\xd5\xce\xae\x20\x99\x71\x3a\xc4\x0e\xc4\x52\xa6\x1b\xc6\x5b\xed\xf5\xbd\xad\x2b\xeb\xcb\x7b\x07\xee\x5d\xf1\x9e\x21\x23\xfd\xa0\x5a\x55\x2a\x52\x5e\xae\xdd\x70\xe9\x65\x46\xc4\xc1\x6c\x51\x52\x55\x23\x2f\xe1\x73\xec\xd7\x06\xd9\x8f\xfa\xe9\x76\xfd\xa0\xb9\xfc\x7d\x21\xa4\x6f\x80\x6d\x5e\x17\x25\x03\x29\x19\xc9\x08\x17\xc5\x45\x53\x5a\x8b\x81\xb8\x60\x0c\x5b\x0c\x99\x73\x72\x9d\x38\x16\xaa\xf2\x8a\x25\xb7\xe2\x0e\x7b\x84\xad\xed\x64\xe2\x7e\x7e\x3b\xbd\x5b\xfa\x92\x6b\xef\x24\x1c\x37\xea\xbf\xaa\x2b\xfe\x1f\xcd\x71\x36\xa1\x7f\x34\xce\x09\x66\x54\x30\xb1\x8d\xb0\xcb\x6e\xd1\xfb\xb3\xe5\x4f\x0e\x3f\x0e\xf8\x71\xc0\x8f\x03\x7e\x1c\xf0\xe3\x80\x1f\x07\xfc\x38\xe0\xc7\x01\x3f\x0e\xf8\x71\xc0\x8f\x03\x7e\x1c\xf0\xe3\xe8\xb4\x1f\xc7\x51\x1a\x67\x87\x62\x07\x4c\xa2\xf1\x36\x3b\xd1\xb0\x6f\xf2\xda\xcf\x34\xe0\x02\x02\x17\x10\xb8\x80\x6c\x21\x17\x90\x2f\xc5\x89\x39\xab\x1a\x97\x95\x9c\xca\x5e\x88\xb3\x9f\xb7\x55\x34\x56\x9a\x8b\xea\x5a\x50\x72\x01\x45\x74\xc5\x6c\xd5\x8c\x17\x94\x1c\x82\xb9\x9a\x63\x82\x33\xfe\x4c\x30\xc6\xa2\xb5\x95\x8c\x17\x94\x1c\xa2\xb8\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\x40\xff\xba\x9e\xfe\x01\xe1\x01\xe1\x01\xe1\xf5\x30\xc2\xfb\x85\x9d\x94\x32\x10\x9e\x47\xfd\xe2\xb2\x92\x33\x43\xb6\xa4\x6a\x55\xca\x5e\x65\x3f\xb8\x8d\xfd\x6c\xd8\x22\x7c\x0f\x65\x95\x52\x49\x13\x58\x67\x66\x1e\xb5\x88\x8d\x26\xaa\xf9\xe9\x3a\xdd\x4b\xec\xd5\x4f\x13\x64\xee\x8c\x5c\xb5\xea\x1d\x2c\x28\xb9\x49\x7e\xee\x58\x5f\x62\x34\x21\x18\xd8\x38\xed\x11\x0c\xec\x2e\xba\x93\x33\xb0\x37\xd1\x6d\x9f\x0f\x6d\x27\x7d\x4a\xf8\xf2\xac\x07\xdc\x41\x14\xb1\xed\x7a\x3f\xe8\xda\x45\x7f\xe4\x35\xca\x46\x5c\x90\x97\xe8\xac\x5e\xf6\xc0\x59\xb4\xe6\xef\xdb\x06\x66\xc0\x18\x98\x85\x0b\x8b\x8d\x46\xe6\x41\xc7\xc8\x2c\x28\xaa\xef\xd0\x78\x56\xfc\x68\x38\x66\x9b\x3b\x34\x99\x8f\x84\xe8\xe7\x42\xec\x67\x43\x91\xbf\x67\x7e\x20\x55\x83\xf7\x48\x85\x92\xac\x7d\x6a\xfa\x9e\x95\x93\x08\x39\xbb\x5a\x35\x40\xcc\xca\x8a\x54\xaa\xc9\x66\x6d\xf7\x32\xd7\xae\xe5\x5f\x74\x85\x43\x0e\x7e\x48\x29\xd5\x34\xcd\x95\x57\x25\x97\x8c\xed\x30\x7f\xb6\x0b\x98\x13\x74\x8c\x1d\x8d\x8d\x9b\xa6\xb0\x3d\x76\x53\x58\xed\x93\xd5\x9b\xc3\xda\x9f\xa2\xed\xf9\x10\xbd\x3b\xc4\xfe\x5a\xe4\xff\x67\x8c\xde\x95\xc5\x6a\x4e\xae\x88\x47\xaf\xac\xca\xb5\xb1\x11\xaa\x7e\x94\x8f\xd6\x92\x26\xec\x45\x90\x83\x6c\xa5\x0e\xd7\xe7\xa1\x10\x96\xf6\xc1\xe5\xba\x69\xec\x16\xd1\x84\x03\xdb\xbd\x27\x44\x7f\x9d\x3d\x17\xf9\x71\x7b\x27\x0a\x25\xa3\x0f\xc3\xe6\x5d\x84\xc0\x55\xab\x52\x29\x27\x55\x34\xd5\x4f\xd3\x22\x2c\x61\xa6\xbf\x0c\xbd\x27\x05\xd5\xa5\x0f\x3c\x51\x6b\x32\xb6\x4d\xd5\x6e\xe0\xe8\x83\xeb\x48\x68\x0b\x81\xf7\x48\x28\x42\x87\xd9\xc8\x48\x28\xab\x55\x47\x2f\xbe\x17\xa2\x3f\x0e\xb1\x3f\x0a\x45\xfe\xc0\xa6\xec\x3c\xfa\xe8\x93\x5e\xbd\x90\xa2\x9a\xfa\x64\x26\x98\x2d\x16\x15\x91\xca\xd6\xb5\x0b\x86\x12\x5c\x96\x54\x95\x2f\xef\x15\x65\x35\x7f\xd5\xdc\xaf\x88\x49\x5d\x59\x2d\x71\x65\x50\x15\x6b\x8a\xd6\x7c\x41\xb5\xb5\xac\xef\x63\xaf\x2b\x95\x67\xe5\x4a\xb4\xa4\xe4\x64\x03\x63\xd4\xb5\xe1\x3a\xf4\x7d\x9a\x7a\x67\x5f\x2f\xde\xd7\x47\x7b\xf5\xaa\xf7\xb9\x95\x02\xe7\xcd\x15\x39\x5f\xe0\x01\x44\xda\x1a\xa3\x3b\xa1\xb3\xdf\x0a\xb3\xdf\x08\xd3\x5d\xae\x27\x45\x22\x79\x9e\x05\x76\x59\xa9\xac\x98\x8b\xb1\x24\x2c\x0b\x89\x68\x5e\xae\x4e\xba\x5d\x35\xb9\x30\x77\x46\x3b\x23\xb8\xe8\xa9\xba\x86\x26\xea\x1a\x9a\x68\xa6\xa1\x4c\x81\xce\x0b\xa9\x7b\x86\x66\xb8\xd4\x3d\x45\x27\xe8\x58\x0b\xd6\x1a\xe3\x19\xfd\xd6\x36\xf6\x85\x21\x1a\xd7\x5f\x43\xb9\xac\x36\x58\xbc\x73\x72\xb9\xa8\xdc\xd0\x76\xcc\xa6\xf3\xff\x0f\x06\xd9\x1f\x84\xad\xa2\x45\xf7\xf2\xd0\x6a\x27\x35\x9e\x36\xaf\x4a\xdc\xa7\x1d\xae\x2d\xac\x66\x1d\x0f\x38\x7e\xfa\x49\xef\x85\xed\xa4\x18\xe2\x71\x3a\xc4\x87\x78\x94\x46\x68\x9f\x6f\xbd\x28\xab\xa3\xfe\xf1\x88\x79\xb9\x4a\xd7\xce\xfb\x2f\x7b\xfb\xd8\x50\x7d\xae\x4f\xeb\x46\x8e\x25\x2f\xf2\x8b\xdb\xad\x91\x8e\x1a\x11\xd0\x9e\x83\xfd\x80\x7e\x46\xa7\xc6\x3b\xcd\xcd\x8a\x35\xf1\x7b\xeb\x1b\x57\x84\xec\x21\xb4\xb9\xc5\xd0\xe6\x8f\x86\x36\xfa\x51\xd3\x94\x08\x67\x3e\x4e\x13\x56\x38\xf3\xba\x1b\xf1\xdb\x48\x04\x2c\x13\x7c\x42\xa2\x13\xef\xdd\x65\x89\x8c\x3b\xf5\xfc\xe3\x92\x5d\x4a\x44\xed\xd5\xe3\x3a\x20\x24\xda\x53\x2b\x0e\x72\xc3\x47\x6e\xa0\x5e\x51\x47\xea\x15\xa1\x50\x05\x0a\x55\xa0\x50\x45\xbb\x0a\x55\x64\x5e\x0a\x05\x9c\xad\xff\xa2\xa8\x1e\x7b\x8e\xe6\x6c\xd5\x63\xdb\x5c\x01\x20\xea\xbe\x62\xef\x60\xb7\x8a\x61\x6a\x76\xdf\x60\x57\x03\x1a\xea\x0b\xe9\xdf\xbf\xcd\x52\x02\x86\xea\xb2\x92\x78\x6e\x20\xee\xe7\x41\xf1\x9d\xd0\x0c\x90\x7a\xa4\xd7\xf4\x11\xa4\x1e\x41\xea\x91\x4d\x4e\x3d\xf2\xe4\x86\x37\x8c\x1b\x4e\x37\x12\xf0\x66\xb0\x71\x46\x11\xeb\xa2\xcd\x30\x37\x04\x9e\xb3\xe4\x8d\x30\xdd\xaf\x53\xcb\x55\xad\x85\xaa\xfe\x8d\x58\xa9\x4b\x46\xd9\xb7\xc2\xec\xbf\x85\xe9\x0e\xe7\x09\xda\x2a\x78\x77\x5e\xae\x3a\x5d\x7b\x84\xd1\x34\x71\x7f\x5e\xae\x4e\x3a\x4e\xbf\x94\x9a\x5c\x98\x33\xbc\x49\x03\x4c\xb7\x15\x18\x30\x2e\xd3\x63\x62\x1e\x6b\x8b\x98\x36\x8f\x67\x69\x9a\xd2\xad\x01\x63\xe3\x39\xe7\x0b\xaa\xef\xf4\x66\xff\x62\x88\x46\xc5\x1b\x28\x29\xb9\xba\x94\x31\xba\x25\xa0\x26\x59\xcc\x7b\x87\xd8\xbb\xfb\x68\xa7\x76\x81\x99\x29\xe6\x7e\x17\x68\x7c\x51\x5c\xcd\x83\xc5\x12\xf7\x68\x27\x9c\x57\x72\x46\x42\x16\xfb\xc1\x80\x99\xf1\x3b\x68\x46\x0c\xe6\x49\x3a\xce\x07\xf3\x30\x1d\xa4\x31\x4f\xa1\xc0\x1f\xdc\x48\x44\x64\xef\xd6\x06\x52\xd9\x71\x74\xfc\xb4\xbf\x64\x38\xca\xc6\x75\xc9\x60\x1b\x7e\x5d\x40\x38\xba\x52\x97\x50\x25\xf2\xcd\xed\x35\xaf\x20\xe6\x4e\x93\x1d\x6f\xe1\x3e\xfd\x9c\x8e\xbc\x88\xf4\x59\x9a\xa5\xe9\x1a\x8d\xac\xa5\x37\x01\x5d\x0c\x4c\xb9\x45\xa6\xfc\x62\x28\x28\x69\x90\x11\x68\x79\x8a\x26\x2d\xb4\xdc\x79\xc9\xc2\x93\x64\x36\x27\x59\xea\x64\x46\x73\xa2\x26\xf1\xd3\xbb\x6a\x24\xcb\x5d\x26\x74\x76\x08\x93\x7b\xc5\xcf\x9d\x91\x25\x60\xce\x60\xce\x60\xce\x60\xce\x60\xce\x60\xce\x60\xce\xee\xcc\xb9\x39\xb5\xa0\x99\xdd\x85\x8b\xa6\x90\x7e\xe3\xb6\x1a\xb5\x60\x9f\x0f\x86\x76\x28\x0b\x7b\x38\x2e\x69\xbb\xae\x00\x0a\xdd\x6b\x1a\x0a\x28\x34\x28\xf4\x26\x53\xe8\x8e\x01\xa7\xb6\xee\xfb\x7c\x51\x77\xe3\xd4\x50\xf6\xb6\x3a\x90\xee\xfa\x83\x83\x94\x14\xe0\x52\x28\x0c\x35\x69\xae\xcb\x4a\x4e\x95\xb3\xab\x95\x42\xf5\x06\x3f\x5e\x90\x55\xf6\x9b\x71\xf6\x5a\x3f\xbd\x59\x9c\x6f\xae\x62\xcf\x35\x9d\x8d\x66\x51\x6f\x70\x41\x57\xaa\x02\xac\x36\x2e\x9a\xd4\x57\xc6\xba\x5b\xcd\x17\xd4\xe0\x0c\xb5\x6d\x4b\x50\xe3\xe9\xa8\x1b\x78\xe6\x1a\xe3\x73\x68\x26\xb3\xcc\x06\xbf\x19\x31\x59\xac\x60\x16\xe7\x8b\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x1a\xe4\xad\x41\xde\x9a\x8e\xe5\xad\x79\x6f\x88\x6e\x1f\x2d\x2a\x79\x75\xf4\xc7\x8b\x4a\xbe\x2c\x55\xaf\x3e\xc7\x14\x76\x84\xfa\xb5\xdf\x12\x6f\x2e\x2a\xf9\xd9\x42\x51\x3e\x2b\x95\x72\x45\xb9\x92\xd9\xed\x87\x5a\x33\x07\x28\xc5\x46\x63\x23\x26\xeb\xbc\x5d\xfb\xd7\x78\xe4\xa2\x92\x8f\xdd\xaa\xdf\xc6\x46\x39\xd9\xf7\x06\xe8\x4e\x23\x79\x0e\x7f\x57\x15\x3e\x52\xec\xbf\x0d\xb0\xff\xd8\x67\x65\x81\x19\x14\x6a\x68\x45\x5f\x40\x0d\x09\x6b\x14\xd4\x9b\xd7\xae\xbc\xa8\x5d\x99\x78\x50\x3b\x53\x24\x81\xb1\x7e\xdd\x6a\xb9\xab\x2f\x53\x5a\x10\xc0\x63\x74\x94\x13\xc0\x03\x94\xa2\x51\x4f\x3c\xae\x8d\x52\x72\x2d\x95\xb4\x1e\xb8\x19\x4f\xd6\x6b\xf7\xb9\xc3\xc0\x5b\xd9\x36\xc1\x01\xe7\xfd\x39\xe0\x10\x8b\xd7\xe6\xaf\xb1\x3a\xe1\xf4\xd2\x06\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\x03\xf7\xeb\x10\xf7\xfb\xc3\x3d\xf4\xb8\x19\x42\xae\xa8\x59\xa9\x58\x28\xe5\x47\xd7\xc6\x96\xe4\xaa\x34\xe6\x95\x04\x93\xa3\x23\xa5\x54\x95\x8a\x65\x25\x67\x5c\x27\x57\xcc\xac\xd6\x2a\xf7\xc8\x67\x1f\xdc\xc3\xbe\xd5\x47\x77\xda\x1a\xbe\xa2\x37\x1c\x39\xc8\xe3\x9d\xc5\x79\xc6\xab\xb0\xd6\xe5\xb3\x66\xfb\x0b\x4a\x6e\xd2\x6c\x3f\x71\x82\xe7\xce\xb4\x9a\xbb\x24\x5a\xb3\x12\xb3\x78\x5c\x28\x22\x04\x02\x0e\x93\xae\x78\x7b\xec\x3d\x2e\x78\xdd\x02\x9d\xe7\xbc\x8e\xc7\xf1\x7a\x27\x55\xb0\x9e\x27\xa9\x0f\x4f\xd2\xe3\x39\x9a\x0c\x9c\xce\xfb\xa3\xba\x69\x96\x36\x52\x2a\x58\xb7\xd7\x99\x9d\xc7\xcd\x6d\x00\x4f\xf4\x92\x22\xdf\xd8\xe1\xfe\x76\xc7\x8d\x50\xea\xf5\xbe\xe0\xd3\x46\xbe\xce\xee\x78\xc7\xe9\xa7\xe8\x09\xba\x54\x13\x8d\x10\xd0\xbb\x44\x64\x02\x62\xb2\x5b\x8c\xc9\xfe\x6a\xa8\x6d\x12\x86\x9e\x16\x51\xda\x8f\xd1\xa2\x15\xa5\x1d\x5c\xeb\x1b\x8c\xdb\x6e\x4e\xb0\xad\x53\x8a\xb9\xc8\xc1\xf4\x6f\xee\x74\x17\x6c\xa7\xeb\x42\xb6\xd6\x2b\xe1\x4e\x8a\x84\x62\x9b\x2f\xdf\x10\xe9\xd5\x6b\xf2\x14\x91\x5e\x88\xf4\xda\xe4\x48\xaf\x4a\xfb\x16\xae\x0d\x27\x22\xeb\x94\xd6\x9c\x99\xa6\x34\x3b\x1d\x3b\x69\xba\x46\xec\xb5\x87\x81\x79\x34\x73\x53\xa4\x2b\xfb\xf0\x20\xed\xd7\x93\x65\xc9\xd5\xeb\x4a\x45\x13\x1b\xb6\x54\x65\x22\xf2\x4c\x3f\x64\x46\x9d\xfd\x8f\x38\xfb\x46\x3f\xbd\xc9\xba\xe2\xca\x5a\x2a\x72\xa3\xb9\xa0\xb3\xf3\xe2\xa2\x40\x03\xce\xc6\xf8\x05\xe7\xcd\xee\x5c\x4a\x39\xee\x82\xe2\xe8\xcd\x15\x47\x6f\x2a\xf6\xec\x19\xff\x4f\xf2\x18\x3b\x6a\x84\x67\xd6\xce\x29\xfd\xc3\x74\xbc\x1e\x78\xa1\xc0\x0b\x05\x5e\x28\xf0\x42\x81\x17\x0a\xbc\x50\xe0\x85\x02\x2f\x14\x78\xa1\xc0\x0b\x05\x5e\x28\xf0\x42\x81\x17\x0a\xbc\x50\xe0\x85\x02\x2f\x14\x78\xa1\x6c\x8a\x17\xca\x67\xe3\xf4\x60\x4d\x36\xaa\xd1\xb2\x92\xcb\x15\xd4\xca\x2a\xdf\x7c\x2f\xad\xe6\xf2\x72\x55\x65\x3f\x11\x67\x7f\xd5\x47\x3b\xcc\x1c\x54\x91\x54\xe3\x58\xb0\x05\x25\x37\x6d\x36\x92\xe6\x8d\x24\x46\xb5\x4b\x8c\x8c\x51\x2e\x27\x6c\x35\x7c\x77\x95\x1e\x16\xf8\x6e\x96\xa6\x39\xbe\x3b\x49\xc7\x69\xc2\x13\xaa\xeb\x39\x4d\xd7\x52\x49\x97\x67\x0f\x24\x54\xec\x49\x7f\x6c\x77\x98\x1d\x74\xa9\xdd\x54\x9b\x2d\xaa\xb6\x77\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x20\x76\x1d\x23\x76\xbf\x19\xa7\x83\x82\xd8\x55\x96\xa4\x6c\xd2\x80\x44\x35\xe5\x47\xf5\x32\x98\x4a\x51\x5e\x2a\x94\x72\x85\x52\x5e\x65\x1f\x8f\xb3\x9f\xe9\xa7\xdd\xda\x55\x93\xf6\x8b\xcc\x84\xf2\x43\x8d\x89\xde\x45\xa5\x28\xa7\x45\x63\x89\x71\xed\xd4\x8b\xb5\x2d\x19\x05\x52\xac\x13\xb7\x1a\xd1\xcb\xd2\x59\x41\xf4\x26\xe9\x14\x27\x7a\x47\x69\x9c\x0e\x79\x12\x3d\xfe\x06\xcc\x82\x08\xd6\x63\x07\x02\xf3\x0a\xfe\x30\x6f\x96\x4d\xeb\x00\xcf\x73\x2e\x18\x05\x13\xac\xce\xd5\x17\xcd\x01\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\x03\xdc\xeb\x14\xdc\xfb\x44\x82\x1e\x13\x70\x4f\xad\x2a\x15\x29\x2f\xd7\x12\x3d\x3d\x54\xd7\x3d\x3b\x54\x56\x93\xc1\xfc\xb2\xac\x54\x96\xb2\x85\x6a\xc1\x38\xe1\x39\xf6\xca\x10\xfb\xb9\x6d\x74\xbb\x7e\xdc\x64\x7e\xbf\x12\xd2\x5f\x8f\x2d\x8a\xb7\x64\x08\x3c\x83\xfc\x4d\x2d\xce\x2d\x8a\xeb\xa6\x44\xbb\xc1\x84\xf4\x0e\x5b\x7a\x0e\xd7\xe5\xf4\x55\x51\x53\x95\x2c\x05\x2e\xee\xd0\x99\x6d\x6d\x27\x13\x62\x30\xf4\x9e\xe9\xec\xd1\xca\xe6\x51\xdf\xe9\x6e\x87\x8f\x9b\x11\x0d\xec\x1d\x9c\x7f\x5d\x04\xe7\xcb\xfe\x14\x32\xcd\x4e\x7b\x55\xa1\x74\xce\x62\x9d\x45\xd6\xbf\x19\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\x48\x10\xc8\x4e\x13\xc8\x53\x74\x82\x1d\x8b\x1d\x35\x93\x9b\xdd\x67\x4f\x91\x56\xbf\x71\xbb\x19\xb2\xa3\x01\x92\x02\x92\x02\x92\x6e\x21\x48\xfa\xe1\xdb\x68\xdc\xcc\x9c\xef\xed\xfc\xa8\xae\x72\xc9\x23\x65\xb3\xb2\xaa\x6a\x1b\x1b\xf9\xba\xca\xbe\x45\xb1\xff\xb4\x8d\xee\x92\x5c\x1d\x20\xf7\x88\xe5\x2d\x2a\x45\x17\xc5\xb5\x93\xfc\xda\x8b\xfc\xda\xc4\x88\x38\xea\xe6\xf1\xe8\x72\x7a\xc0\xf9\xd0\x9f\xa0\x4b\xf4\x68\x4d\xce\xde\x69\x4a\x37\x4a\xe0\x69\x1b\x19\xc3\x45\xd1\xa5\x9f\x99\x17\xc2\xf4\x98\xc0\x8e\xe7\x69\x9e\x63\xc7\x59\x0a\xa4\x65\x7a\x4a\x64\xb4\x5e\xa4\x47\xac\x8c\xd6\x41\xb5\xfd\x76\xad\xed\x31\xf6\x28\x5d\xa4\xed\xda\x81\x72\x90\x8d\xb7\xee\xb9\x59\x56\xd4\x2a\x5d\x2b\xfa\x33\xd3\x39\x76\xc6\x4a\x68\xea\xe5\xb4\xe9\xd6\xb7\x7a\xe7\x4d\xa4\x5f\x6e\x9c\x7e\x39\x83\x74\xf6\x1e\xe9\xec\x03\xcf\x33\xfb\x77\x6e\xa3\xc3\x0d\x25\xf3\xa8\x2a\x17\x97\x5d\x05\xf3\x7f\xa1\xd8\x97\xb7\xd1\xae\x5a\xc1\x1c\x89\x5a\x32\x59\x2e\x2e\xbb\xc9\xe5\x61\x57\xb9\xec\x71\x76\xc0\x62\xf9\x71\x7a\x8c\x16\x6b\xc4\xf2\x14\x4d\x36\x2d\x83\x92\x1e\xdd\xcc\x7c\x2a\xec\x5d\xe4\xe4\x51\x21\xae\x1f\xa6\x73\x5c\x5c\xcf\x50\x10\x77\xa4\x27\x85\xb4\xbe\x48\x0b\x96\xb4\x0e\xa8\xe9\xa7\x84\xb0\xd6\x16\x02\x4b\x58\x07\xd3\xb6\x21\x92\x9f\xf5\x17\xb9\x67\xd9\xac\x2e\x56\x3d\xba\xe9\x92\x17\xc3\x55\x38\xfb\xc9\x7f\x48\x64\x48\xe4\x6e\x91\xc8\xff\x3d\x4c\xac\xbe\xca\x14\x7b\x25\xcc\x5e\x0e\xd3\x6d\xb6\xdf\x22\x91\xbc\xac\x4d\x94\x65\xa5\xb2\x62\xee\x36\xa4\x28\xff\x0e\x12\x6f\xcd\xcb\x55\x5b\xe5\x8c\xc9\x85\xb9\x33\xda\xef\xc1\x09\xd3\xba\x86\x26\xea\x1a\x9a\x68\xa6\xa1\x4c\x81\xce\x0b\xe9\x78\x86\x66\xb8\x74\x3c\x45\x27\xe8\x58\x0b\x36\x74\xe3\x19\xfd\x94\x41\xf6\xff\x86\x29\xe2\x55\xc7\x2b\x35\xca\xfe\x7b\x98\xfd\x56\xd8\xad\xa6\x49\x2a\x72\xb7\x36\xe2\x0e\x36\x29\xb6\x54\x89\x07\x9c\xc3\x2d\x0a\x95\xa4\x26\x17\xe6\x0c\x83\x58\x80\xd5\x48\x02\x1b\xf9\xf2\xba\xb6\x11\x8d\x47\xde\x78\xce\x66\xe2\xa8\xd8\x07\x2e\x53\x52\xbc\x80\x25\xee\x1c\xb3\x96\xf2\xf4\x8f\xa9\x28\xa5\x6b\xca\x92\xca\xfe\xeb\xd3\xec\x2f\x1e\xa2\xed\xfc\x7c\x4d\xc9\x78\xa8\x71\xe4\xdb\x54\x45\x29\x65\x94\xa5\xc4\x1e\xed\xb4\xb4\x76\xca\x25\xbb\xa3\x89\x38\xda\xe5\xde\x25\x69\x78\x58\xc0\xc3\x22\x0d\x0f\x0b\x78\x58\xc0\xc3\x02\x1e\x16\x3d\xe3\x61\x91\xee\x1a\x0f\x8b\xc0\x7b\xd2\xb2\x87\x45\x1a\x1e\x16\xf0\xb0\x80\x87\x05\x3c\x2c\xe0\x61\xd1\x79\x0f\x8b\x74\x4f\x7b\x1b\xa4\xe1\x6d\xd0\x3e\x6f\x83\x74\xb7\x7b\x1b\xa4\xb7\xa0\xb7\x41\xe6\xed\x74\x5a\x70\xad\xa3\x34\xce\xb9\x56\x8a\x46\x69\xc4\xd3\x70\xc1\x99\x52\x72\x2d\x95\xd4\xb1\x50\x53\xa9\x80\xe6\xfd\xad\x17\x43\x2c\xae\xdb\x24\xf8\x1d\x8c\x50\x1a\x71\x13\x87\xe9\xc2\x2f\xb1\x50\xec\x5b\xdb\x6d\xe8\x6b\x97\x69\x5f\x33\x28\xd7\x7d\xe2\x97\xb6\x73\x2e\x81\xa5\x38\x9f\xad\xb1\xa0\xed\xa3\xa1\xa6\xc7\x17\xd5\x87\x51\xcd\xbd\x45\x63\xcb\xb7\x43\x74\x5c\x7c\xda\x87\xe8\x00\xff\xb4\x47\x68\x3d\x53\x8f\x26\x85\xc9\x74\x82\x8e\x58\x26\xd3\x75\x36\x91\x16\xa6\xd1\x63\x74\xd4\x66\x1a\x5d\x67\x1b\xdd\x22\x5d\xb8\xf1\x33\xf1\xe5\x61\x9b\x74\xd9\x23\x14\xd7\x68\x56\x29\x6a\xdb\x50\x7d\x59\x31\x24\xcd\xa0\x38\xaa\x4b\x9a\x29\xf3\x9c\x76\xcb\x9c\x47\xe9\x22\x2d\xd8\x65\x4e\x22\x4d\xa7\x5b\xb0\x54\x4c\xf3\xee\x5f\xe0\xc4\x54\x05\x5b\x05\x5b\x05\x5b\x05\x5b\xed\x21\xb6\x0a\xd5\xcb\x47\xf5\xea\x1e\xf8\xfc\x7a\x98\xbe\x13\x66\xdf\x0e\x47\xbe\x65\xbe\xaa\xcf\x85\x1f\xb5\x6f\xf7\x0a\xa5\xa8\x2a\xb6\x6c\xd1\x25\x79\x59\x58\x6a\x4d\x2c\x62\x2d\x59\xfa\x57\xc2\x07\xcb\xa6\xe4\x95\x94\xd2\x48\x49\xce\x4b\xfc\x95\xe8\x3b\x3e\xbb\x32\x28\x00\xa9\x39\x19\x74\xb5\xa0\xb0\xb2\x22\xe7\x34\x75\xb3\x78\xc3\x32\xa1\x5a\xa2\xbd\x50\x1c\xd6\x37\x82\xfc\x71\xa3\xf9\x8a\x94\xe5\xf3\xa4\xa0\xe4\xcc\x85\xc7\x5a\x1c\xb8\x75\xda\x78\x2f\xab\xaa\xd6\x49\xfb\x40\x49\xda\x95\xc6\x03\xe9\x37\x59\x16\xdf\x9b\xd1\x44\x52\xf4\x73\x45\x96\x4a\xae\x7d\x8c\x31\xde\x85\x05\xde\x03\xb7\x0d\x2e\x18\x3f\x18\x3f\x18\x3f\x18\x3f\x18\x7f\x4f\x33\xfe\xaf\x85\xe9\xb5\x30\x7b\x35\x1c\x79\xc5\x5c\x6d\x3f\x16\x9e\xb6\x65\x4c\x2a\x17\x65\x49\x95\xcd\x4f\x7f\xa1\xa2\x94\xa5\x3c\x5f\x87\x45\x79\x44\x87\x87\x8f\xf1\xba\xad\x94\x4b\xda\x0b\x4f\x25\xc7\x93\xd1\x45\x21\x47\xc4\x22\x59\x96\x4b\xda\x34\xb5\x56\x11\x39\xaa\x54\xca\x57\xa5\x92\xe1\x71\x54\x59\x95\x47\x97\xa5\xa2\xa1\xfd\xc7\xc4\xd1\x58\x74\xb9\x50\x92\x8a\x85\x77\x19\xe2\x7b\x49\x8e\x4a\x39\x0e\xcc\x95\x51\xc1\x4f\x73\x96\x6a\x29\x1a\x8f\xab\xd6\x45\x42\xdf\x4e\x46\x67\x0a\x5c\x24\xd9\x3a\xae\x54\xea\x9f\xcc\x32\x52\x54\x85\xba\xcf\xb5\x3f\xa5\x7a\x35\x19\xdb\x25\xfa\x33\x6d\x3c\x88\xd3\x75\xe9\x03\xfd\xf4\xfe\x7e\xf6\xde\xfe\xc8\x1b\xa6\xff\xda\x37\xfb\x1e\xd7\xe5\xa0\x36\x45\xaf\x2a\xd7\xa3\x79\xa9\xb2\x24\xe5\x1d\xbc\xc1\x54\xd4\xe4\xca\xb2\x52\x59\xd1\xc6\xc2\xb5\xa7\x17\x6a\x6e\xee\xdd\x51\xae\xd6\x18\x3a\x89\xa8\x9c\xa8\xcd\x88\x9c\x9c\x2d\xe4\x2c\xc5\x9a\xaf\x8d\x7c\x9b\x63\x8e\xae\xca\x3d\x6c\xf9\x51\x63\xf5\x4b\xda\x86\xd1\x90\x9b\xa6\x65\xc0\xf4\x5a\x73\xde\x2c\x19\x15\xa4\x88\xcb\x62\xbb\xb6\x1a\x17\xcf\x10\xd7\xf6\x3c\xfc\x2f\xe7\xc4\x50\x8f\x45\xe3\x69\x29\xfb\x6c\xbe\xa2\xac\x96\x72\xda\x59\xdc\x5d\x8c\x9f\x54\x33\x70\x42\x59\xd1\x35\x20\x67\x23\xc6\x13\x2c\x99\x2d\x1d\x8b\xc6\x67\x95\x8a\x6c\x6b\x36\x9a\x95\xd4\xac\x94\xd3\x9e\x5e\x1f\x1f\xe1\x20\xc8\xdb\x53\x85\x3a\x5d\xd7\xe0\xb2\xd9\x46\x32\x76\x47\xb9\x76\xde\xd8\x75\x1b\x98\xd0\x60\x42\xeb\x51\x13\x5a\x26\x4f\xf3\x82\x59\xcf\xd0\x14\x67\xd6\x27\xe8\x18\x1d\x6d\x01\x5e\x2e\x56\xa5\xea\xaa\xea\x0b\x8f\x13\xee\xb8\xf7\x4e\x76\x87\xf8\x9a\x2d\x49\x4b\x4d\x82\x66\x6f\xb6\xec\x40\xd0\x5b\x30\x93\x00\xfb\x9e\x19\x0b\x90\x2b\xa8\x59\x45\xd3\x75\x6c\xb1\x6f\xec\x6b\x61\xf6\x5a\x98\x76\x9a\xc7\xae\xac\x35\x08\x02\x88\xe4\xe5\xea\xb4\x71\xe6\x25\x78\xff\x7b\x78\xff\xbf\xf0\x8c\x11\x72\xd8\xa8\x1c\xce\x68\xb6\xb8\xaa\x56\xe5\x8a\xa3\x20\xce\x77\x2f\xb3\x97\x07\xe8\x2d\x6e\x05\x71\x22\xfb\x7d\x22\x02\x44\x73\xf6\x92\x38\x43\x1e\x25\x71\xea\x4f\x45\xa4\x00\x22\x05\x10\x29\x00\x6b\x16\xac\x59\xb0\x66\xc1\x9a\xd5\x35\xd6\xac\xee\x31\xd6\xc0\x8a\x00\x2b\x02\xac\x08\xb0\x22\xc0\x8a\xd0\xd3\x56\x04\x60\x4e\x60\xce\x1e\xc5\x9c\x5b\x32\x52\x40\xa6\x8c\x60\x60\x53\x34\xc9\x19\xd8\x31\x3a\x4a\xe3\x7e\xc5\x83\x93\xf5\x80\x28\x90\xf2\xc1\xcd\x65\x44\x6a\xb2\x7c\x70\x7d\x1f\x1d\xe0\x36\xf6\xe5\x1d\x1e\x1c\xed\x1e\x2b\xbc\xa0\x1e\x99\xed\x13\x07\x3b\x0b\xcd\x04\xe3\x9a\xa3\x33\x34\x53\x13\x76\x70\x88\x0e\xb4\xf0\xb2\xe0\x05\x87\x00\x84\x16\x03\x10\x7e\x18\xa2\x59\x21\x31\x4e\xd1\x09\x2e\x31\xc6\xa9\xb5\x49\x48\xe7\x44\x28\xc2\x34\xa5\xad\x50\x84\x96\x1b\x9b\x17\x41\x09\x33\x34\x65\x0b\x4a\x68\xb9\xb5\x8d\x66\xd3\xec\xa4\x20\x4b\xfc\xcd\x11\x0f\x41\x16\x77\x8f\x64\xa8\x17\x6a\x87\xc4\x89\x6e\x42\xcd\xbc\xb4\xed\xe2\x0d\x11\x0e\x60\xc2\x60\xc2\x60\xc2\x60\xc2\x88\x70\x40\x84\x03\x22\x1c\x10\xe1\x00\xdb\x04\x6c\x13\xb0\x4d\xc0\x36\x01\xdb\x04\x22\x1c\x10\xe1\x80\x08\x07\x44\x38\xc0\xf4\x07\xd3\x5f\x17\x9a\xfe\xba\x3a\xc2\xa1\x93\x2c\x3a\xf8\xf0\x84\x6f\xc6\x29\x25\x7c\xe5\x9d\x75\xf9\xcd\x92\x69\x59\x4d\x35\xe2\x47\xb2\xa2\xc0\x63\x41\x56\xd9\xc7\xe3\xec\x67\xfa\xe9\x76\xfd\x80\x59\x2c\xcd\xcf\x43\xbe\xae\x56\x64\xe2\xa0\x76\x85\xfe\xa3\x5e\x38\xad\xfe\xac\x59\xa5\x32\x59\x2c\x9a\x19\x80\x82\x8b\x75\x68\x8f\xb3\x7c\x66\xc5\xbb\x4e\xcf\x45\x31\x8d\xcf\xd1\x1c\x9f\xc6\x53\x34\x49\xa7\x3c\x0d\x28\xc6\x1b\x31\xea\x92\xd5\x8f\xcc\x7c\x41\xad\x36\x6b\xfc\x95\xfd\xe7\x69\x9a\x9d\xd6\xe7\xa9\x73\x32\x18\x93\xb3\xee\xfe\x2e\xa5\xc7\x10\x29\x80\x48\x81\x0c\xac\x42\xb0\x0a\xc1\x2a\x04\xab\x50\xcf\x58\x85\x32\x5d\x63\xf4\x08\xbc\x27\x2d\xd3\xf8\x0c\x68\x3c\x68\x3c\x68\x3c\x68\x3c\x68\x7c\xe7\x69\x7c\xe0\xa4\x20\xd3\xd3\xfc\x31\x03\xfe\xd8\x3e\xfe\x98\xe9\x7a\xfe\xb8\x05\x43\x0f\xd8\xa7\xfa\x29\xaa\xbd\x3a\x9e\xea\x42\x59\x29\x2b\x25\x6d\xc1\xe3\xfc\xd3\xa8\x81\xf9\x1c\x7b\x4f\x3f\xfb\x93\x30\xdd\x9a\x55\x2a\xf2\x95\xb5\x54\x24\x56\x91\xa5\x5c\xcd\x3e\x73\xca\xb8\x56\xb0\xd3\xc4\x6e\xed\x9c\x29\xa5\x22\x5f\x4a\xd5\x1c\x0a\xd6\x61\x35\xf3\x0c\x4d\x09\x5a\x76\x9c\x26\x38\x2d\x3b\x48\x63\xb4\xdf\x93\x96\x69\xcf\xc0\xdd\x8d\x9d\x9d\xf2\x65\xbd\x8f\xf8\x73\xb1\x24\x1b\xd6\x09\x58\x4d\xdb\x2e\x99\x6a\x62\x31\xba\x76\xaf\x3b\x8a\xbb\x85\xf5\xe7\xe5\x2a\x65\x8e\xd3\x04\x3b\x12\x3b\x6c\x66\xb1\xb9\x87\xbb\xb9\xeb\xd3\xb6\xe6\x16\xb1\x7e\xed\x60\x5b\x33\xd4\xfc\x70\x0f\x3d\x2a\x10\xf0\x72\x51\xb9\xae\xad\xda\x15\xa5\x98\x34\x29\x50\x2d\x10\x2e\x57\x0a\x4a\xa5\x50\xbd\x51\x94\xd7\xe4\xa2\x83\x0f\x18\xb3\x6a\x54\xcc\x32\xf6\x8f\xf6\xb0\x77\xf7\xd3\x1e\x5b\xab\x93\x46\xa3\x26\x32\x1e\xe7\x33\x4e\x5c\x60\x0c\x81\x35\xf7\x16\xf4\x7b\xcd\x6b\xf7\x9a\xb2\xdf\x2b\x71\x4a\xbb\x70\xd6\xa5\x69\x1d\x23\x7b\x5f\xda\x96\xc9\xba\x2a\x2a\x9a\xef\xe7\x15\xcd\xb5\xc9\x7a\x8e\xe6\xe8\x8c\xe7\x64\xb5\x8f\xb4\x81\x77\xbd\x7b\xec\x3b\x87\x7f\xdc\x7f\x0e\x3f\xc1\x2e\xe9\x33\xb4\xd1\x5b\xd6\x49\x6f\x83\xae\xd4\x11\x5f\x9f\xd9\x1e\x79\x0f\xf9\x4c\x81\x89\x8a\x5c\x2e\x4a\x59\xb9\x95\x59\x90\xd6\xaf\xed\x9a\x89\x90\xbe\x4c\x6f\xa7\x27\x6b\xa2\x88\x82\x9b\x09\xf0\x3e\x45\x64\x51\x8b\x91\x45\xdf\x08\xb5\x55\x44\x5d\x11\xd1\x46\x4f\xd0\x25\x2b\xda\xa8\xa3\x32\xd0\x5b\x0c\x95\x57\xab\xb4\xa9\x22\x32\xfd\xc6\x4e\x1f\x19\x38\x55\x96\x2a\xd5\x02\x07\xf2\x42\x0b\x6c\x45\x18\x9e\x2e\x6b\x4a\x60\x57\x88\xc2\x7b\x6a\x1b\x1a\xe1\x7d\xdb\xc7\xf3\xc9\xed\xb1\x1f\x5c\x91\x2b\x79\xd9\x7e\x74\xc0\x7e\x54\xdb\x45\x56\xe5\x7c\x21\x3b\x52\x77\x9e\xa3\x15\xed\xef\x1b\xfa\x51\xad\x97\xe9\xf3\x34\x4f\x99\x1a\x31\x3c\x41\x47\x5a\x70\x19\x58\xe0\x66\x2e\xc8\x5d\x1f\xb9\xfb\xd9\x3e\x7a\xb1\x8f\xbd\xd0\x17\xf9\x94\x69\xf7\x7d\xbe\xaf\x77\xe4\x6e\x0d\x19\xd4\xc6\x99\x5b\xba\x38\xbd\xd6\x26\xa7\x65\xef\x1e\xf4\x98\xb8\x43\xdc\xe4\x23\x0c\xa3\x52\x91\x5f\x59\x52\x4a\x23\xe2\x6a\x7e\x06\x37\x8c\xab\xd1\xc1\x8c\xaa\x94\x16\x84\xe1\xf7\x61\xed\xb3\xd0\xff\x5e\x34\x3e\x16\xeb\xc7\x21\xef\x05\x21\xfd\x5a\x88\x5e\x0d\xb1\x57\x42\x91\x97\xcd\x4d\xed\xa7\x43\xb3\x4a\x25\xcb\x8d\x89\x79\x85\x0f\xbb\x12\x8d\x2d\x6b\x3f\xc5\xa2\x93\x8e\xa7\xe0\xb8\x42\x84\x0c\xac\xaa\x96\x89\x6b\x44\xca\xf2\x07\xe7\x86\xc3\x62\x21\xab\xfb\x02\xca\xc5\x9c\x1a\x55\xae\xeb\x63\x2a\x0c\x6b\x65\x59\x29\x17\xe5\x64\x54\xdc\x91\x5b\xea\x8d\x77\xc9\xb1\x81\xeb\x00\x98\xb7\x8f\x6d\xe3\xdd\x72\x58\x9d\x37\x57\x07\xbf\xdf\x7d\xfd\xd9\xce\x6e\xe1\x5d\xdf\xdc\x15\x28\x73\x86\x66\xd8\x54\x6c\xd2\xdc\x73\x0e\xd8\xf7\x9c\xde\x2d\x75\x60\xfb\xf9\x13\x43\x34\x2b\xb6\x9f\x25\xb9\x7a\x5d\xa9\x68\x9f\x7b\xed\x9e\x93\xd3\x8d\x51\x33\x61\xab\xbe\xd1\xe4\x7f\x3f\x37\x5a\x28\xe5\x2b\x9a\x58\x52\xd9\x4b\x83\xec\x3f\xf5\x13\xb3\xda\x31\xd7\x57\x55\x27\xf3\xa5\x5c\x61\xad\x90\x5b\x95\x8a\x76\x66\x23\x99\x56\xb0\x39\xd1\x54\xd2\xe6\x75\x3c\x61\x1a\x47\xe2\xbc\x8d\xb8\x65\xf9\x77\x98\x72\x95\xb2\x6c\xc6\x14\xa9\x55\x59\xca\x25\x13\xfb\xf8\x05\xe7\xcd\xde\xe8\xab\xb0\x55\xca\x4c\xbf\xdd\x7c\x41\xad\x76\xbb\x4f\xd3\xb3\xb4\x20\xbe\xad\x39\x3a\xc3\xbf\xad\x49\x3a\x45\x27\x5a\x58\x4e\x39\x35\x9b\x59\x93\x4b\xfe\xe9\x2c\x2e\xfb\x7f\x30\x13\xec\x88\xfe\xc1\xd4\x4d\x1e\xfd\x2b\xd1\xc7\xd8\x65\xdf\xba\xd7\xfd\x83\xdd\xc9\x88\x3f\x37\xf7\x9a\x82\x3b\x13\xdc\x99\xe0\xce\x04\x77\x26\xb8\x33\xc1\x9d\x09\xee\x4c\x70\x67\x82\x3b\x13\xdc\x99\xe0\xce\x04\x77\x26\xb8\x33\x75\xd8\x9d\x69\xeb\x55\x7e\x81\xc3\x14\x1c\xa6\xe0\x30\xb5\x85\x1c\xa6\x7e\x69\x90\x0e\x08\x10\x29\xad\x56\x15\x35\x2b\x15\x0b\xa5\xfc\xe8\x9a\x41\x1f\x39\x9c\x52\x4a\x55\xa9\x58\x56\x72\xc6\x19\x72\x45\x65\x3f\x8a\xb3\x3f\xed\xa7\x37\xdb\x2e\xba\xb2\x96\x8a\x3c\x1f\x6a\x0e\x39\x9e\x35\x9b\x5d\x50\x72\x93\x66\xb3\x01\x21\x48\x81\xf0\x26\xad\xae\x5d\x4a\x79\xdc\x70\xbe\xa0\x56\xb7\x5a\xa0\xe5\x66\x40\xc9\x66\xa8\xe1\xb5\x25\x7f\x72\x79\x8a\x9d\xd0\xc9\xa5\x6d\xe2\xe8\xcc\xd2\xe3\x15\x39\x43\x81\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x41\x26\x3b\x4b\x26\xc1\x0d\xc1\x0d\xc1\x0d\x7b\x98\x1b\xbe\x34\x48\xf7\x1b\x81\x96\xee\x8e\x8a\xcf\xb1\x0f\x0f\xb2\x5f\xef\xb7\xe2\x2c\x7f\x51\x87\x83\x76\x22\x58\x32\x44\x96\x91\x2e\xcd\xe4\x70\x81\xb0\xc0\x61\x4b\x41\xe1\x4a\x98\xbe\x9c\x69\x3a\x8e\xa5\x79\xc5\x1d\xca\xae\xad\xed\x64\xe2\x2d\xfc\x76\x22\xee\xd3\xec\x59\xf7\x03\x42\xcf\x4c\x6c\x81\x93\x43\x7f\x3f\xe0\xeb\xc2\x0f\xf8\x9c\x3f\x1c\x1c\x64\x03\x56\x38\xa9\x60\x82\xe6\x98\x83\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x82\x02\x6e\x26\x05\x3c\x4c\x07\xd9\x58\x6c\xbf\xe9\x9f\x78\x97\x3d\xbe\xd2\xdc\xbb\xb5\x3f\x9c\x12\xf4\x10\xf4\x10\xf4\x70\x0b\xd1\xc3\x3f\x0f\xd3\x3d\xde\xe1\xcf\xa3\xec\xd7\xc3\xec\xab\x61\x7a\x93\x23\xa6\x39\x72\x77\x5e\xae\x3a\x57\x67\xd1\xff\xc4\x3d\x79\xb9\x6a\x0f\x38\x9e\x5c\x98\x33\x36\x83\x01\x66\xf7\xa8\x6b\x68\xa2\xae\xa1\x89\x66\x1a\xca\x94\xe9\x31\x81\xe1\xce\xd3\x3c\xc7\x70\xb3\x34\x4d\xe9\x16\x30\x9c\xed\x39\x9b\xa9\x94\xcf\xbe\x7b\x99\x4e\x89\x51\xf7\xac\xc8\xa1\x8d\xbe\x47\xc4\x79\x45\x29\xca\x2a\xfb\xa7\x97\xd9\x87\x07\x3c\x4a\x43\xc7\x1a\x57\xc2\xb8\xa8\x14\xe5\xc4\x43\xda\x39\x2e\x35\xa1\xad\xf8\x70\xed\xb4\x2e\x47\xac\x69\x00\x48\x00\x48\x54\x01\x07\x80\x04\x80\x04\x80\xec\x1d\x00\xd9\x45\x45\xae\xbb\x06\x40\xa2\xfa\x32\x00\x24\x00\x24\x00\x24\x00\xe4\x66\x54\x5f\xee\x69\xee\x87\xf2\xb0\xbd\x5c\x1e\x36\xbd\x05\xb9\x5f\xe6\x71\x3a\x2e\xd0\xd7\x21\x3a\xc0\xd1\xd7\x08\xed\xa3\x21\xcf\x64\x95\x1c\x53\xad\xa5\x92\x17\x95\x62\x53\x84\xcb\xb7\x1c\xe8\xba\x92\xeb\xf9\x95\xad\xd5\x7a\xe5\xf0\x4b\x8b\x7d\x77\xbb\x07\x19\x7b\x93\x58\x89\xa2\x92\x80\x60\x71\xf1\xdf\xce\x61\x30\x41\xad\x8e\xd1\x51\x1a\xaf\x49\x0f\x1c\xa7\x87\x9a\x1a\x7e\xe4\x02\x46\x0e\xf6\x16\x73\xb0\x7f\x3d\x44\x47\xc4\x57\x9f\xa2\x51\xfe\xd5\x0f\x51\xb3\xd3\x8e\x4e\x88\x0c\xeb\x87\xe9\xa0\x95\x61\x7d\x1d\x97\x9f\xd4\x2e\x1f\x63\xe3\x74\x88\xb6\x8b\x52\xfa\xeb\xbb\xbe\x75\x81\x53\x56\xda\x2f\x70\x12\x7f\x38\xec\x21\x70\x76\xeb\x05\xfd\xad\x9a\xdd\xda\x07\xc0\x85\x4f\x4a\x1c\x72\x11\x3e\x53\xe6\xc9\x6d\x15\x43\x8f\xd2\x45\x5a\xb0\x8b\xa1\x44\x9a\x4e\xb7\x60\xfe\x98\xe6\xcf\x71\x81\x33\x56\x15\x34\x16\x34\x16\x34\x16\x34\xb6\x87\x68\x2c\x34\x32\x1f\x8d\xac\x7b\x70\xf5\xeb\x61\xfa\x4e\x98\x7d\x3b\x1c\xf9\x96\xf9\xaa\x3e\x17\x7e\xd4\xbe\x41\x2c\x94\xa2\xaa\xd8\xe4\x45\x97\xe4\x65\x61\xdb\x35\x41\x8a\xb5\x64\xe9\x5f\x09\x1f\x2c\x9b\xee\x57\x52\x4a\x23\x25\x39\x2f\xf1\x57\xa2\xef\x11\xed\x3a\xa2\x40\xaa\xe6\x64\xd0\x95\x83\xc2\xca\x8a\x9c\xd3\xb4\xd0\xe2\x0d\xcb\xe8\x6a\x89\xf6\x42\x71\x58\xdf\x3a\xf2\xc7\x8d\xe6\x2b\x52\x96\xcf\x93\x82\x92\x33\x17\x1e\x6b\x71\xe0\xf6\x6c\xe3\xbd\xac\xaa\x5a\x27\xed\x03\x25\x69\x57\x1a\x0f\xa4\xdf\x64\x59\x7c\x6f\x46\x13\x49\xd1\x4f\x51\x60\xc1\xa5\x8f\x31\xc6\xbb\xb0\xc0\x7b\xe0\xb6\x25\x86\x55\x00\x56\x01\x58\x05\x60\x15\x80\x55\xa0\xa7\xad\x02\x5f\x0b\xd3\x6b\x61\xf6\x6a\x38\xf2\x8a\xb9\xda\x7e\x2c\x3c\x6d\x8b\x26\x2e\x17\x65\x49\x95\xcd\x4f\x7f\xa1\xa2\x94\xa5\x3c\x5f\x87\x17\x94\x62\x21\x7b\xc3\xe1\x13\x64\xbc\x6e\x2b\x1c\x59\x7b\xe1\xa9\xe4\x78\x32\xba\x28\xe4\x88\x58\x24\xcb\x72\x49\x9b\xa6\xd6\x2a\x22\x47\x95\x4a\xf9\xaa\x54\x32\x7c\x94\x2a\xab\xf2\xe8\xb2\x54\x34\xb4\xff\x98\x38\x1a\x8b\x2e\x17\x4a\x52\xb1\xf0\x2e\x43\x7c\x2f\xc9\x51\x29\xc7\x11\xbb\x32\x2a\x88\x6b\xce\x52\x2d\x45\xe3\x71\xd5\xba\x48\xe8\xdb\xc9\xe8\x4c\x81\x8b\x24\x5b\xc7\x95\x4a\xfd\x93\x59\x66\x8d\xaa\x50\xf7\xb9\xf6\xa7\x54\xaf\x26\x63\xbb\x44\x7f\xa6\x8d\x07\x71\x3a\x3b\x7d\xa0\x9f\xde\xdf\xcf\xde\xdb\x1f\x79\xc3\xf4\x78\xfb\x66\xdf\xe3\xba\x1c\xd4\xa6\xe8\x55\xe5\x7a\x34\x2f\x55\x96\xa4\xbc\x83\x3a\x98\x8a\x9a\x5c\x59\x56\x2a\x2b\xda\x58\xb8\xf6\xf4\x42\xcd\xcd\xbd\x3b\xca\xd5\x1a\x43\x27\x29\x8b\xa7\x2a\x68\xfa\x42\xb6\x90\xb3\x14\x6b\xbe\x36\x8a\x3a\x4c\xc6\xe8\x6a\x8b\x93\xbe\x72\x18\xab\x5f\xd2\x36\x8c\x86\xdc\x34\x6d\x09\xa6\x9f\x9b\xf3\x66\xc9\xa8\x00\x49\x5c\x16\xdb\xb5\xd5\xb8\x78\x86\xb8\xb6\xe7\xe1\x7f\x39\x27\x86\x7a\x2c\x1a\x4f\x4b\xd9\x67\xf3\x15\x65\xb5\x94\xd3\xce\xe2\x0e\x66\xfc\xa4\x9a\x81\x13\xca\x8a\xae\x01\x39\x1b\x31\x9e\x60\xc9\x6c\xe9\x58\x34\x3e\xab\x54\x64\x5b\xb3\xd1\xac\xa4\x66\xa5\x9c\xf6\xf4\xfa\xf8\x08\x97\x42\xde\x9e\x2a\xd4\xe9\xba\x06\x97\xcd\x36\x92\xb1\x3b\xca\xb5\xf3\xc6\xae\xdb\xc0\xe8\x06\xa3\x5b\x8f\x1a\xdd\x32\x79\x9a\x17\x28\x7b\x86\xa6\x38\xca\x3e\x41\xc7\xe8\x68\x0b\xf0\xb2\xc9\x3a\xdd\x09\x77\xbe\x7c\x27\xbb\x43\x7c\xcd\x96\xa4\x6d\x37\x6b\xde\x82\xc9\xc8\xd9\x4f\x27\x68\xb1\x09\x87\xf7\x86\x85\xd6\x2a\x4a\x51\x5e\xd2\xb6\xce\xa5\xbc\x99\xd8\xe4\x5f\x0e\xb1\x9f\xde\xe6\x41\xde\x3f\xdf\x4c\x96\x13\x6e\x51\x13\x8d\x76\x45\x9e\x93\x11\x7e\x3b\x5f\x7b\xa4\xde\xe5\x2e\xf7\xce\xdf\x94\x0c\xc9\xbe\x09\x50\x72\xfe\x5f\xe7\x24\x3b\xb5\x8e\xaf\x53\x7f\x19\xc8\x8c\x82\xc0\x04\x64\x46\x81\x29\x0c\xa6\x30\x98\xc2\x7a\xd5\x14\x86\xcc\x28\xc8\x8c\x02\x13\x04\x4c\x10\x30\x41\xc0\x04\xd1\x15\x26\x88\xcc\x11\x3a\xcc\x0e\xc6\xc6\x4c\x58\x72\xb7\x3d\x33\x8a\x6d\xf7\x56\x9f\x1b\x65\xeb\x61\x16\x64\x5f\x01\x10\x46\xf6\x95\xad\x13\x85\xc1\x7e\xfb\x69\xda\x6d\xe4\x6e\x36\xdc\xbe\x4a\xd5\x35\xa5\xb8\xba\x22\xab\xec\x8b\x4f\xb3\xbf\x3d\x60\x65\x6d\x4e\x36\x4e\xea\xb1\x60\x5e\x7f\x89\x5f\x9f\x88\x68\xe7\x8b\x8c\xc9\xb5\xc7\xba\x9c\x1b\x22\xab\x07\xe0\x19\xb2\x7a\x00\x9e\x01\x9e\x01\x9e\xf5\x10\x3c\xeb\x22\x37\xe9\xae\x81\x67\xf0\xdf\x05\x3c\x03\x3c\x03\x3c\x03\x3c\x43\x56\x0f\x38\x18\xde\x3c\x3c\xa9\xeb\x1d\x0c\xb7\x64\x56\x8f\x2c\x9d\x15\xfe\x56\x93\x74\x8a\xfb\x5b\x1d\xa5\x71\x3a\xe4\x19\x60\x9f\x55\x2a\x72\x72\x2d\x95\xac\xc5\x43\x4d\x65\xf8\xb8\xe8\xef\x46\x35\xca\x46\x6a\xeb\x48\xd5\xde\xca\xe1\x34\xe5\x97\x35\x24\xf6\x37\x76\x58\x38\x6c\xb7\x99\xc9\xa3\x8e\x7c\xed\x11\x87\xda\xcc\xbe\x04\xaa\x3a\x43\x33\x34\x55\x93\xca\xe3\x00\xa5\xd6\x3d\xe6\x08\x22\x45\x5a\x8f\x16\xd3\x7a\x7c\x3f\x44\xd3\xe2\xb3\x3f\x41\xc7\xf8\x67\x7f\x88\x5a\x99\x82\x34\x27\x52\x7c\xa4\xe9\xb4\x95\xe2\xa3\xc5\xa6\x32\x22\xdd\xc7\x14\x4d\xda\xd2\x7d\xb4\xd8\xd6\x46\x53\x7f\xb4\x41\x52\x25\xbe\x3e\x6c\x49\xa2\x87\x5c\x53\x7c\xd4\x49\xa5\x01\x71\x9a\x90\x4a\x56\x86\x8f\x36\xcb\x27\xe4\xf8\x00\x9b\x05\x9b\x05\x9b\x05\x9b\x45\x8e\x0f\xe4\xf8\x40\x8e\x0f\xe4\xf8\x80\x8d\x00\x36\x02\xd8\x08\x60\x23\x80\x8d\x20\x10\x1b\x01\x72\x7c\x20\xc7\x07\x72\x7c\x20\xc7\x07\x4c\x70\x30\xc1\x05\x9e\xe3\xc3\x0b\xfd\x06\x9b\xfc\xa3\x95\x1c\x1f\x6d\x80\xca\xc1\xa7\xdd\xf8\x3f\x13\x74\x48\xa4\xdd\x50\xab\x4a\x45\xca\xcb\x56\xae\x8d\x25\xb9\x2a\xa5\x46\x85\xab\xb9\x54\xad\x4a\xd9\xab\x9a\x4e\x6c\x26\xd6\xf8\xd1\x10\xfb\x48\x1f\xdd\xae\x5f\x76\x45\x3f\x3f\xb2\xb7\x22\x4b\xb9\x9a\xad\xa8\x78\x92\x49\xb3\x8d\x44\x4c\x3b\x69\x51\x5c\x79\x49\x5c\x58\x7b\x4e\xb0\x90\x7b\x9d\xc9\x60\x92\xc6\x60\xe8\x4f\x95\xac\xed\x9d\xaf\xc5\xe1\x5e\xf7\x89\x72\x0b\xeb\xcf\xcb\x55\xba\x96\xf5\x9f\x1b\xa7\xd9\x49\x7d\x6e\x38\xdf\x8c\x3e\x4f\xea\x7a\x64\x9b\x27\xbc\xcf\x14\x79\xcf\x8e\xfa\xd7\x33\x50\x91\xcb\x45\x29\x2b\xfb\xbd\xa1\x87\xf4\xf3\x3a\xf9\x92\xd2\x17\xe8\x61\x3a\x57\x63\x29\xdd\xc8\x5b\x02\x92\x83\xc5\xb4\x45\x8b\xe9\xaf\x86\x02\x16\x18\x8f\x08\xcb\x69\x86\xce\x5a\x96\xd3\x36\xcb\xa0\xe6\x84\x4c\xb3\xe2\xc4\x5d\x18\x35\x10\x74\xe5\xd5\x2a\x25\x5e\xd8\x55\x2f\x83\x8c\x82\x07\x52\xbd\xd8\x79\x50\x1c\xea\xa8\xd4\x69\x8f\xfd\x13\xa2\xc7\x47\xf4\x80\xc1\x77\x84\xc1\x03\xbe\x00\xbe\x00\xbe\xb4\x0b\xbe\x64\x5e\x0a\x5a\x4f\xb8\x28\xdc\xa2\xce\xd1\x9c\xcd\x2d\xaa\xcd\x8a\x42\xd4\x7d\x0d\xdf\xc1\x6e\x15\xc3\xd4\x99\xfd\x4a\xfa\x1f\xee\xac\xd7\x15\x46\xcb\x52\xa5\x5a\xe0\x6e\x2a\x02\x70\xfb\x6d\x5c\xf6\x96\xa5\x6a\xf6\x6a\xa7\x14\x88\x7b\x6a\x1b\x1a\xe1\xb7\xdf\xa7\xfd\x39\xb1\xc7\x7e\x70\x45\xae\xe4\x65\xfb\xd1\x01\xfb\x51\xb5\x5a\x91\xaa\x72\xbe\x90\x1d\xa9\x3b\xcf\xd1\x8a\xf6\xf7\x0d\xfd\xa8\xd6\xcb\xf4\x79\x9a\xa7\x4c\xcd\x96\x69\x82\x8e\xb4\xa0\xbe\x2c\xf0\x38\x5b\xa8\x2d\x3e\x6a\xcb\x67\xfb\xe8\xc5\x3e\xf6\x42\x5f\xe4\x53\xa6\xec\x7f\xbe\xaf\x77\x76\x4c\x35\x66\x47\x6d\x9c\xb9\x3b\x17\x37\x8d\x6b\x93\xd3\x0a\xb8\x1f\xf4\x98\xb8\x43\x7c\x09\x13\xde\x7f\x52\x91\x5f\xa9\xe9\x6a\xe2\x6a\x7e\x06\xd7\x9b\xd4\xe8\x60\x46\x55\x4a\x0b\x22\xf2\xfc\x61\xed\xb3\xd0\xff\x5e\x34\x3e\x16\xeb\xc7\x21\xef\xad\x5c\xfa\xb5\x10\xbd\x1a\x62\xaf\x84\x22\x2f\x9b\x10\xf3\xd3\xa1\x59\xa5\x92\xe5\x2a\x5d\x5e\xe1\xc3\xae\x44\x63\xcb\xda\x4f\xb1\xe8\xa4\xe3\x29\x38\xfd\x15\xda\xd7\xaa\x6a\xf9\x71\x8d\x48\x59\xfe\xe0\xdc\x3b\xae\x58\xc8\xea\xab\xab\x5c\xcc\xa9\x51\xe5\xba\x3e\xa6\xc2\x7b\xac\x2c\x2b\xe5\xa2\x9c\x8c\x8a\x3b\xf2\x54\x01\xc6\xbb\xe4\x14\xd6\x75\x00\xcc\xdb\xc7\xb6\xf1\x6e\x39\x7c\xf8\x3b\xcd\xb2\xbc\xf3\xa5\x96\x45\xbe\xd4\x4e\xac\x0e\x99\x13\x74\x8c\x1d\x8d\x8d\x9b\xc9\x76\xf6\xd8\xd3\xf4\xd4\x5e\x5f\x9f\xab\x27\x70\x72\xfa\x7f\x87\xe9\x1e\x41\x4e\xa5\x72\x41\xfe\xb1\xaa\x5c\xe2\xd0\xdd\xe0\xa7\xec\x3f\x86\xd9\xbf\x0f\xd3\x9b\x1c\x07\x23\x91\x3c\xd7\xbb\x34\xed\xcf\x64\xe2\x52\x94\x8f\x4c\xe2\x6d\x79\xb9\x3a\x69\x3f\x7b\x72\x61\xee\x8c\x76\x24\xb8\xe5\xaa\xae\xa1\x89\xba\x86\x26\x9a\x69\x28\x53\xa0\xf3\x62\x0a\x9e\xa1\x19\x3e\x05\x4f\xd1\x09\x3a\xd6\xc2\xaa\x63\x3c\xa3\xdf\x24\x64\x5f\xb9\x4c\x23\x46\x22\x14\xaf\xf4\xcf\xba\xb2\xfa\xce\x55\xa5\x2a\xa9\xec\x67\x2e\xb3\xbf\x65\x4b\x8e\xb2\xaf\x71\x72\x14\xc3\x3f\xf5\x11\xed\xe2\xc4\x03\x56\x66\x14\x5b\x5a\x65\xfb\x29\x48\x90\x82\x04\x29\x48\x90\x02\x27\x7c\x38\xe1\xc3\x09\x1f\x4e\xf8\x5d\xe3\x84\xdf\x3d\x3e\xe6\x70\x7e\x86\xf3\x33\x9c\x9f\xe1\xfc\x0c\xe7\xe7\x9e\x76\x7e\x86\x77\x26\xbc\x33\x7b\xd4\x3b\x73\x4b\x26\x48\x79\x07\xcd\x08\xb2\x75\x92\x8e\x73\xb2\x75\x98\x0e\xd2\x98\x6f\x4a\x02\x07\x1b\x6a\x2a\x3b\x8a\x4f\x26\x93\x6b\x17\xfc\xa1\xea\x30\x4b\xd8\xbd\x43\x6b\x5d\x49\x1d\x7d\xa2\xd8\x0f\xb7\x5b\x30\xec\xad\x66\x6a\x14\x27\xf7\xda\x6b\xcf\x8b\xd2\x6e\xf2\x25\x40\xd5\x34\xa5\xe9\x74\x8d\x05\x6b\x3f\x25\xd7\x37\xe2\xb0\x5b\xc1\xd3\xaf\x45\x4f\xbf\x3f\x0e\xd1\xa4\xf8\xe2\x27\xe8\x08\xff\xe2\xc7\x68\xdd\xf3\x8f\x66\x85\x7b\xdf\x29\x3a\x61\xb9\xf7\xb5\xd2\xce\x19\x61\xfe\x3f\x4d\x27\x6d\xe6\xff\x56\x1a\xda\x68\x4a\x94\xa0\xc5\x4f\xe2\xd7\x6d\xf9\x50\x62\xae\xf9\x50\x9c\xa2\x68\xc4\x3d\x19\x4a\x67\x84\x12\x72\xa2\x00\xc7\x02\xc7\x02\xc7\x02\xc7\x22\x27\x0a\x72\xa2\xc0\x1f\x1b\x39\x51\x60\x16\x80\x59\x00\x66\x01\x98\x05\x60\x16\x08\xc4\x2c\x80\xb0\x1c\x84\xe5\x20\x2c\x07\x39\x51\x60\x75\x83\xd5\xad\x87\x72\xa2\x34\x47\x95\x1b\x93\x64\x47\x42\x94\xad\x57\x82\x97\x7d\x69\x88\xa6\x1b\x04\x0e\xac\xa5\xc4\xcc\x19\xcd\xae\xaa\x55\x65\xc5\x98\x8e\xf6\x97\xa4\x67\x60\xf9\xc1\x20\xfb\xe4\x36\xda\xe5\x68\xe5\xca\x5a\x2a\xf2\xc5\x90\x3e\xf5\x2c\xfb\xaa\x54\x32\x54\x1b\xc3\xdf\x7d\x8a\xb7\x6e\x8c\xec\xb4\xd9\x7a\xd2\xa6\x44\x4c\x98\xea\x47\x9c\xb7\x18\xb7\xf0\xae\x83\xd7\x29\x65\xd9\x44\x04\x6a\x55\x96\x72\xc3\xd6\xbe\x86\xef\xdd\x74\x2d\x58\xdb\x1a\x59\x1b\xb6\xb8\x03\x45\xd8\xda\x4e\x26\x86\xf9\xed\x1c\xc1\x10\x97\x52\x5e\x3d\xee\x72\x4f\xfc\xcc\xb3\xb4\x20\x3e\xbb\x39\x3a\xc3\x3f\xbb\x49\x3a\x45\x27\x5a\xf8\xec\xb8\xe5\x7c\x66\x6d\x63\x21\x3b\xd7\x45\xc8\x4e\xd1\xff\x43\x9c\x63\x67\xc4\xe7\xe7\x35\xf0\xe4\x62\xfd\x71\x9b\xd2\x94\x41\x30\x02\x82\x11\x32\xb0\x7e\xc1\xfa\x05\xeb\x17\xac\x5f\x3d\x63\xfd\xca\x74\x8d\x71\x27\xf0\x9e\xb4\x6c\x75\xc8\xc0\xea\x00\xab\x03\xac\x0e\xb0\x3a\xc0\xea\xd0\x79\xab\x43\x66\x86\xa6\xd8\x64\xec\x94\x49\x4b\x1e\xb4\xe7\x50\xf0\xda\xe6\xb5\x3f\x97\x42\xa6\xa7\x71\x6d\x06\xb8\xb6\x7d\xb8\x36\xd3\xf5\xb8\x76\x0b\x06\x49\xb0\xaf\x0c\xd2\xb0\x4f\x32\x0e\x81\x6e\x0c\x54\xf9\xb3\x83\xec\x6b\x61\xcb\xff\xf7\x6d\x2e\x49\xa2\x39\xd8\x4a\xec\xd6\x8e\xd4\x86\x1f\xf0\x43\x01\x27\x84\x7e\x94\x8e\x0a\x2a\x37\x46\xfb\x39\x95\x4b\xd0\x20\x0d\xf8\x3a\x59\x37\x87\xdf\x7c\xb2\x3f\x9f\xf1\x87\x6f\x0f\xb2\x58\x2d\x05\x17\xb7\xb6\x33\xb7\xc8\xdf\xb5\x85\x74\xdc\xe3\x9e\xd9\x59\x0c\xeb\x1e\xfd\x60\x07\x46\x36\x7d\x9c\x26\xe8\x48\x4d\x40\x47\xd3\x43\x0b\x8f\x41\x04\x72\xb4\x18\xc8\xf1\xd3\x21\x6f\xc3\xd7\x06\xbe\xf5\x93\x22\xb2\x63\x9c\x0e\x59\x91\x1d\xeb\xb8\xde\x5f\x24\x94\x57\x03\x14\x09\x89\x3f\xbb\xdd\x12\x09\xb7\x1b\x89\x96\x4b\xba\x18\xb8\xc7\x1e\x53\xd1\x5e\x29\x80\xac\xca\xc8\xaa\x7c\xf3\x7a\xf1\xc2\x7d\x0b\xee\x5b\x70\xdf\xea\x96\xac\xca\xbe\xae\x2a\x2d\x64\x55\xf6\x6f\x73\xe3\x59\x95\x83\x5a\xf4\xd3\x5f\xbd\xcd\x5a\xf4\x1f\xf4\xc9\x98\x2c\x34\x81\x08\x4f\xdd\xd9\x66\x45\x00\xd9\x91\x7b\x4d\xfd\x40\x76\x64\x64\x47\xde\xe4\xec\xc8\x6d\x05\x3b\xcd\x49\x6c\x2f\x39\x6d\x49\x72\xdf\x9c\xca\x99\x31\xda\xcf\x92\xb1\x61\x13\xd5\xdf\x61\x47\xf5\xbc\xe9\x7a\x2e\xbf\x05\x9d\x21\x3f\x34\x44\xfb\x7d\x48\xa2\x70\x37\x59\x91\xca\x26\x4d\xfc\xed\x41\xf6\x1d\x1b\x4d\xdc\xe3\x42\x13\xa7\xf8\x45\x0f\x4b\xe5\xc4\xbd\x6e\x44\xd1\x3c\x1c\x30\x55\x7c\x82\x4e\x88\xc9\x77\x98\x0e\xf2\xc9\x97\xa4\x61\x4a\xf8\x4e\x3e\xb3\x3b\x1b\x25\x8b\xe7\xfc\xe7\xe7\x20\x1b\xa8\xd5\x28\xac\xdb\x3b\xe8\xe2\xa7\x6d\x74\xf1\x7e\x77\xba\x68\x0d\x73\xd4\x83\x30\xb6\x69\xa4\xd3\xa7\xe9\x24\x1d\xaf\x59\xda\xd7\x35\xd4\x58\xcc\x41\x1a\x5b\x24\x8d\x1f\x09\x6d\xf4\x33\x4f\x0b\xa8\x78\x8c\x8e\x5a\x50\xb1\x73\xa2\x82\x13\xc7\x20\x45\x45\xe2\x47\x36\xea\xc8\xcc\xf2\x6e\x96\x74\xb8\xdf\x1d\x3c\xb6\x4b\x38\x00\x3e\x02\x3e\x02\x3e\x02\x3e\x02\x3e\x02\x3e\x02\x3e\xba\xc3\xc7\x20\xd7\xff\xf4\xef\xd8\x00\xe4\xa0\x0f\x80\xb4\xb4\x82\xfb\x5c\x21\x64\x1b\x94\x02\x80\xc8\x5e\x53\x45\x00\x22\x01\x22\x37\x19\x44\xb6\x9d\x05\xf9\xd6\x65\x0b\x52\xc4\x67\x0e\xd3\x41\x36\x16\xdb\x6f\xc2\xc5\xbb\x1c\xbe\xc3\xc6\x35\x37\x05\x94\xfc\x8f\x71\xba\xcb\x80\x92\x22\x16\x5b\x95\xb3\x15\xb9\xaa\xb2\xcf\xc7\xd9\xa7\xfa\xad\xa5\xae\xa2\xfb\xf6\x97\x72\x85\xb5\x42\x6e\x55\x2a\x3a\x62\xae\xcd\x38\x9a\x45\x7e\x75\x20\x91\xd5\xc9\xc4\x43\xd7\xad\x45\x53\x34\x3c\x5f\x50\xab\xb3\x4a\x65\xb2\x58\x34\x17\x51\x15\x41\xd1\xf5\xdf\xcb\x5e\xf7\xef\x65\x27\x23\xde\x31\x91\x76\xfb\xac\xff\x37\xf3\x10\xdb\x5b\xfb\xcd\x88\x17\xe1\xfc\x60\x10\xf4\x8c\xa0\x67\x04\x3d\x23\xe8\x19\x41\xcf\x08\x7a\x46\xd0\x33\x82\x9e\x11\xf4\x8c\xa0\x67\x04\x3d\x23\xe8\x19\x41\xcf\x9d\x0d\x7a\x46\xb4\x32\xa2\x95\x11\xad\xdc\xc3\xd1\xca\xef\xbb\x42\xe3\x22\xe1\x62\x56\xae\xe8\xad\xc8\xf6\x7c\x8b\xf6\x9f\x0b\xf9\x52\xa1\x94\x37\xe4\x34\x7b\xe5\x19\xf6\x1b\x03\x74\xbb\xfd\x8c\x2b\x6b\xa9\xc8\xb8\xd0\x16\x2b\xfa\x3a\x67\x08\x42\x33\xb9\xa2\x75\xfa\xa2\x68\xf0\xa2\x68\x30\xb1\x4f\xbb\xd0\x76\x58\xbd\x94\xf2\x3c\xb9\xcb\x19\x5e\x1a\x80\x0b\x80\x0b\x35\xad\x00\xb8\x00\xb8\x00\xb8\x7a\x07\x70\x75\x51\xc9\xa6\xae\x01\x5c\xa8\x25\x04\xc0\x05\xc0\x05\xc0\x05\xc0\xb5\x19\xb5\x84\x7a\x9a\x47\xa1\xd8\x49\x2f\x17\x3b\x49\x6f\x41\x1e\x95\xa9\xd2\x93\xc2\xf7\xe9\x22\x2d\x70\xdf\xa7\x0c\x9d\xa5\x59\x6f\xc7\x40\x3b\xb4\x5a\x4b\x25\x3d\x79\xd1\x7c\x41\xf5\x77\x82\x5a\x57\xe1\x07\xaf\x3b\xb9\x45\x35\xbb\xb0\x35\x6a\x50\x65\x9c\x7b\x5b\xc5\xfe\x06\xd5\xb3\xb5\x98\x58\xb0\xa2\x52\x03\x8c\x36\x22\xce\xe9\x34\x48\x13\xdc\xeb\x09\xba\x44\x8f\xd6\x38\x73\x4f\x53\x7a\xe3\x2f\x10\x6e\xdd\x08\x49\x6d\x31\x24\xf5\x85\x30\x3d\x26\x84\xca\x79\x9a\xe7\x42\x65\x96\x02\x99\x93\xf4\x94\x08\x55\x5d\xa4\x47\xac\x50\xd5\xa0\xda\x7e\xbb\x88\x8c\x79\x94\x2e\xda\x22\x63\x82\x6a\xdc\x4f\x12\x7a\xcb\xa6\xb2\xa2\x56\x9b\x2d\x91\xd3\x40\xfa\xad\x47\x88\x26\xfe\xff\x23\xf5\x92\x30\xa9\x87\x48\xd9\xe2\xcd\x94\xe5\x06\x52\x71\x5c\x8f\xb2\x75\x4a\x45\xf3\xe2\x4e\xc9\xc7\xf6\x44\xdf\x02\x34\x03\x34\x03\x34\x03\x34\xf7\x0e\x68\x86\x36\xe8\xa3\x0d\x76\x0f\x89\x47\xe6\x83\x8e\x64\x3e\x80\xc1\x03\x06\x0f\x18\x3c\x60\xf0\x80\xc1\xa3\xa7\x0d\x1e\x48\x80\x83\x04\x38\x48\x80\xd3\xae\x04\x38\xb0\x27\xc2\x9e\xd8\xab\xf6\xc4\x4c\x3e\xe0\xdc\x4f\x7e\x10\x3a\xe1\x0e\xa1\xef\x64\x77\x88\xaf\xd9\x92\xb4\x1d\x06\xd2\xc1\x67\xd5\xf8\x5e\x98\x22\xc2\x0d\xbf\xa4\xe4\x64\xcb\xfd\x7e\x49\xae\x4a\xa9\x51\xf6\xb5\x30\x7b\x2d\x4c\x3b\xb5\x63\x57\xf4\x1f\x23\x77\xe7\xe5\xaa\x53\x31\x16\x46\xdb\x44\x24\x2f\x57\xcf\x2b\x39\xf9\x92\x38\x71\x72\x61\xce\xc0\x81\xc1\x65\xbe\x98\xa8\x6b\x68\xa2\xae\xa1\x89\x66\x1a\xca\x78\xa7\x72\x59\x97\xd1\xa6\xc1\x6c\xb3\x0d\xc0\x7c\x41\x35\x8a\x0e\xb1\x9f\xbc\x4c\x43\x4d\x67\x57\x66\xbf\xfd\x34\xfb\xab\x87\xac\xe4\x26\x71\x9f\x18\x07\x2b\xc3\x32\x8f\x69\x68\x7b\x16\x2f\x44\x31\x20\x8a\x01\x51\x0c\x30\x2e\xc1\xb8\x04\xe3\x12\x8c\x4b\x88\x62\x00\xd4\x07\xd4\x07\xd4\x07\xd4\x07\xd4\xbf\x29\xa0\x3e\xa8\x23\xa8\x63\x8f\x52\xc7\x2d\x19\xc5\xf0\x34\x4d\x0a\x76\x35\x41\x47\x38\xbb\x1a\xa3\xfd\x94\x6c\x3e\xbd\x71\x53\xd1\x0a\x3e\xf1\x03\x81\x66\x38\x8e\xfd\x8e\xad\xde\x15\xb3\x82\x10\xac\x22\x36\x7a\xd0\x01\x2a\x5c\xdd\x2c\x0e\x64\x08\x27\xf0\x08\x27\xf8\x4e\x57\x54\xb8\x9a\x12\xe1\x01\xc7\x69\xc2\x16\x1e\x10\x74\x16\x75\xbf\x30\x80\x40\xeb\x64\x7d\x65\xd8\x12\x31\xf7\xb9\x7b\xf7\x9b\xe2\x66\xc8\x5e\x33\xcb\xf2\xe2\xdf\xaa\xd5\xb3\x80\x58\x81\x58\x81\x58\x81\x58\x7b\x07\xb1\x42\xfd\x82\xff\x3e\xfc\xf7\xe1\xbf\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xff\x7d\xf8\xef\xc3\x7f\x1f\xfe\xfb\xb0\xa4\xc1\x92\xd6\x2e\xff\x7d\x4f\x57\xeb\x40\x1d\xfb\x5b\xf1\xdf\x0f\xb4\x1c\xe7\x16\x2c\xab\xf9\xc5\x41\x3a\xd1\x30\x0f\xbf\xa8\xb5\xd9\x20\x1b\xff\x8f\xe2\xec\x4f\xfb\xeb\xf3\xe4\xbc\x3f\xd4\x5c\x1d\x4e\xcf\xc8\x87\x80\x4a\x73\xee\x17\xa5\x39\x9b\x4b\x4a\x36\x5f\xe8\xfa\x0c\xff\xdd\x5b\xa5\xb3\xb3\xa1\x30\x08\x11\x40\x88\x00\x2a\x79\xc2\x7e\x05\xfb\x15\xec\x57\xbd\x63\xbf\x42\x25\x4f\x54\xf2\x84\xdd\x00\x76\x03\xd8\x0d\x60\x37\xe8\x0a\xbb\x01\x2a\x79\xa2\x92\xe7\x56\x21\xa5\xa8\xe4\xd9\x8e\x4a\x9e\x3f\x35\x44\xc7\x05\x41\xac\x2c\x49\xd9\xa4\x01\x8f\x78\x53\xf5\x1c\xb1\xb8\xaa\x56\xb5\x8d\x4b\xd1\x48\x79\xf1\x1c\xfb\xea\x20\xfb\x5b\xdb\xe8\x2d\xda\xd5\x93\xf6\x8b\xaf\xac\xa5\x22\x9f\xd7\x29\xa2\x1d\x1d\x96\x0c\xe1\x66\x66\xbd\x10\x8d\x5e\x54\xb4\x95\x33\x00\x68\x38\x6c\x29\x33\x5c\x61\xd3\x97\x3e\x4d\x1f\xb2\xb4\xb4\xb8\x43\x31\xb6\xb5\x9d\x4c\xec\xe5\xb7\xbb\x58\xfb\x3c\x97\x52\xb6\x8e\x82\x32\xd6\x53\xc6\xfb\xdd\x29\xe3\x76\x76\x0b\xef\x18\x5d\xcb\xf9\x13\xc6\x49\x76\x4a\xc7\x88\xd6\x58\xbb\x55\xc6\xf0\x9c\xab\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x9d\x26\x8b\x47\xe8\x30\x3b\x18\x1b\x33\xbd\xa9\xee\xe6\x6e\x54\x7a\x2f\x6c\xdb\xbb\x58\xbf\x76\xa0\x9d\x5e\x52\x60\x92\x60\x92\x60\x92\x5b\x88\x49\x7e\x6b\x90\x0e\x18\x39\x76\x05\x78\xf4\xc8\xb4\x6b\x34\xf6\xce\x55\xa5\x2a\xa9\xec\x1f\x0d\xb2\x5f\xea\xb7\xb2\x01\xdc\x68\xce\x85\xd1\xd8\x1b\x3e\xa2\x35\x12\x90\xdb\xe2\x80\x70\x5b\xac\x49\x6b\xe2\xb8\xd3\xd6\x70\x56\xf4\x74\xfd\x0d\x9c\x2f\xae\xcb\x59\xf1\x82\x3f\x4a\x1c\x66\x09\x17\x70\x68\xfa\x00\x3b\xde\x05\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x21\xa8\x61\xa7\xa9\xe1\xd6\x8b\xc1\x04\x5d\x04\x5d\x04\x5d\xdc\x42\x74\xf1\xf7\x76\xd3\x49\xe1\xf1\x28\x95\xcb\x6a\x83\x3a\x5e\x15\x99\x33\x33\xed\xd3\xd5\x9d\x1d\x47\x55\x1e\xa9\xce\x3e\xb1\x9b\xfd\x20\x4c\xb7\x6a\xd7\xf3\xb2\x5e\x15\x59\xca\x45\xc5\x31\x63\x94\xad\x45\xfd\xa2\x68\x66\x51\xae\x26\x1e\xd4\x4e\x9c\x2c\x97\x55\x27\x15\x34\x8e\x8b\x38\xf8\x60\x53\x8f\x66\x9e\xa4\x93\x02\xd5\x8d\xd3\x21\x8e\xea\x46\x69\x84\xf6\x79\x66\x7b\xd5\x9e\x29\xb9\x96\x4a\x5a\xbd\xf2\x75\xfc\xbb\xd7\x9d\xd8\xdd\xc2\xfa\xf3\x72\x95\xae\x9d\xf7\x67\x75\xfb\xd8\x90\xce\xe7\xb4\xdb\x9b\x84\xce\xec\x81\x1d\xe4\x45\xbe\xb4\xdd\x1a\xf9\x84\xf6\x8e\xa4\xac\xdc\xcc\xe0\xc7\xf5\x73\x3b\x3b\xfe\x69\x4e\x46\x6b\x72\x4e\xaf\xef\x05\x20\xeb\x21\x92\x4e\xb7\x98\x74\xfa\xa3\xa1\x0d\x7f\xfd\x53\x22\xeb\xf4\x71\x9a\xb0\xb2\x4e\x07\x2e\x42\x9a\x93\x11\x0d\xe5\x82\x5d\x80\x34\x10\x49\xe5\xd5\x2a\xa5\xbf\x7f\x9b\x25\x42\x0e\x94\xa5\x8a\xb6\x37\xd6\xf6\x93\x7c\x9d\x69\x46\x96\x3c\x54\xd6\x96\x95\xce\x49\x92\x7b\x6a\x1b\x1a\xe1\x1d\xd8\xc7\x4b\x68\xee\xb1\x1f\x5c\x91\x2b\x79\xd9\x7e\x74\xc0\x7e\x54\x53\x3e\xab\x72\xbe\x90\x1d\xa9\x3b\xcf\xd1\x8a\xf6\xf7\x0d\xfd\xa8\xd6\xcb\xf4\x79\x9a\xa7\x4c\x8d\x14\x9b\xa0\x23\x2d\x58\x7c\x16\x38\x7f\x87\x48\xf3\x11\x69\x9f\xed\xa3\x17\xfb\xd8\x0b\x7d\x91\x4f\x99\x06\xa9\xe7\xfb\x7a\x47\xa4\xd5\x20\x0b\x6d\x9c\x39\x82\xe7\x58\x4d\x9b\x9c\x96\x21\x6e\xd0\x63\xe2\x0e\x71\x16\x2d\x2c\x36\x52\x91\x5f\x59\x52\x4a\x23\xe2\x6a\x7e\x06\xb7\xd8\xa9\xd1\xc1\x8c\xaa\x94\x16\x84\x45\xea\x61\xed\xb3\xd0\xff\x5e\x34\x3e\x16\xeb\xc7\x21\x6f\x59\x9b\x7e\x2d\x44\xaf\x86\xd8\x2b\xa1\xc8\xcb\xa6\x2e\xfc\xe9\xd0\xac\xa2\x6d\xed\x0a\x6a\x34\xaf\xf0\x61\x57\xa2\xb1\x65\xed\xa7\x58\x74\xd2\xf1\x14\x7c\x97\x23\xb2\xc0\xae\xaa\x16\x7b\x1f\x91\xb2\xfc\xc1\xb9\x45\xa3\x58\xc8\xea\xe9\xdd\xe4\x62\x4e\x8d\x2a\xd7\xf5\x31\x15\xc4\xbf\x2c\x2b\xe5\xa2\x9c\x8c\x8a\x3b\x72\x13\xa2\xf1\x2e\xf9\x6e\xc3\x75\x00\xcc\xdb\xc7\xb6\xf1\x6e\x39\xcc\x61\xed\xd7\x1c\xbd\x43\x46\xca\x22\x64\x24\x60\xdd\x31\x33\x4e\x87\xd8\x81\x58\xca\xc4\x0b\x6f\xb5\x3b\x25\x59\x17\xd5\xfb\x24\x6d\x3d\x2e\xc1\x7e\x38\x44\xf3\x62\x9f\x93\x2b\xa8\x59\x65\x4d\x93\xc6\xb5\x01\x5d\x1e\x3b\x1f\xb9\x94\x2b\x2b\x85\x52\x55\x2d\x16\xb2\x56\xa4\xd7\x3f\x1b\x62\xef\xd9\x46\x3b\xcd\xd6\xb4\xd5\xf3\x9f\x37\x13\xe1\x35\xa3\x37\xb7\xa8\x35\xd7\x15\x31\x5e\xe2\x76\xd3\xc6\x93\xd8\x17\x71\x47\x67\xbb\xdf\x41\xa3\x0b\xe3\xbc\x2e\xfb\x7f\xb4\x13\xec\x88\xf8\x50\x1d\xa3\xed\xa6\xcf\xd5\xce\x5d\xb8\x6a\xc0\x55\x03\xae\x1a\x70\xd5\x80\xab\x06\x5c\x35\xe0\xaa\x01\x57\x0d\xb8\x6a\xc0\x55\x03\xae\x1a\x70\xd5\x80\xab\x46\xa7\x5d\x35\x26\xe8\x08\x3b\x1c\x3b\x68\x22\x91\xdd\x76\x96\xe2\xd8\xd7\xdd\x0c\x38\x05\x6e\x1e\x70\xf3\x80\x9b\xc7\x16\x72\xf3\xf8\xdf\x09\x23\x35\x7e\xc3\xc4\x56\xb6\x94\x56\x4b\x85\x52\xae\x50\xca\x9b\xbc\xf3\x57\x12\xec\xc5\x3e\x8f\xcc\x56\x0f\x71\x97\x0f\xe7\x7e\xd9\x16\xd4\x9a\x16\x4d\x25\x86\xb4\xd3\x1a\xa7\x92\xd2\x4f\x0d\xd8\xeb\x43\xa2\x59\x01\x06\x4f\xd1\x09\x0e\x06\xc7\xe9\x10\x1d\xf0\x64\xf7\x7c\x88\xd6\x52\xc9\xfa\x7e\xf9\xe2\xc0\x67\xfd\x69\xdf\x59\x36\xeb\x9b\xb7\xa9\x2e\xed\x93\x71\x7f\x3b\x13\xf4\x71\x35\x89\xbc\x7f\x87\xc7\xeb\x1a\x34\xfc\x44\x7c\xdf\xd8\xb0\x7e\xe6\x26\xbc\xb4\xf4\x1c\x9d\xa1\x99\x1a\x23\x6b\x6b\x6f\x0d\xf6\x55\xb8\x8c\xb4\xe8\x32\xf2\x99\x50\x60\xa2\xe3\x9c\x70\x1d\x99\xa6\xb4\xe5\x3a\xd2\x36\x39\xd4\xd8\xe5\xa3\xa3\x62\x2a\xf1\xc5\x5d\x1e\x72\xe8\x1e\xbd\xc0\x95\xe4\x26\x7a\xf6\x89\x83\x9b\x21\x79\xda\x53\x9f\x1c\x42\xc8\x47\x08\xa1\x46\x6e\x47\x6a\xe4\xa2\x38\x22\x8a\x23\xa2\x38\x62\xbb\x8a\x23\x66\x5e\x0a\x05\x5b\x08\x8e\x2e\x6a\xad\x8d\xb1\x73\x34\x47\xdb\xc5\xd8\xca\xb9\x8d\xb6\xe9\xa7\x3e\x44\xdd\xd5\x87\x1d\xec\x56\x31\x4c\x9d\xd5\x20\xd2\xff\x6c\xa7\x87\x06\x91\xaa\x73\x57\xf5\xdd\xd2\x24\xca\xfe\x09\x8d\x03\x57\x2b\xe0\xb1\xda\x6b\xca\x0c\x3c\x56\xe1\xb1\xba\xc9\x1e\xab\xdd\x46\xbd\xd6\x95\xb9\xdc\x73\x61\xf0\x75\x93\xcd\x9c\xa2\x13\xec\x58\xec\xa8\x69\x4e\xb9\xcf\x23\xd7\x9e\xde\x62\xfb\x53\xee\xb1\x8f\x0c\xd2\xa1\x96\xca\x0a\xb0\xff\x11\x67\xdf\xe8\xf7\x58\xfc\xae\x37\x59\x94\x34\xe0\x8a\x02\x86\xbf\x68\xe3\x25\x74\x6b\x24\xf4\xea\xd2\xea\xa3\xcd\xd5\x06\x58\xff\x37\x84\xaa\xa3\x70\x1d\x85\xeb\x28\x5c\x47\xe1\x3a\x0a\xd7\x51\xb8\x8e\xc2\x75\x14\xae\xa3\x70\x1d\x85\xeb\x28\x5c\x47\xe1\x3a\xba\x99\xae\xa3\x70\xce\x84\x73\x26\x9c\x33\x7b\xd8\x39\xf3\xf9\x21\x9a\x69\x1a\x0f\x7a\xa5\xe7\xe2\xb8\xf0\x57\x06\xd9\xab\x5e\xb8\xb0\xdc\x64\x01\x80\xe0\x38\x61\xc2\x8b\x13\xda\x92\xc4\x00\x15\x6e\x0c\x15\x36\x17\x5e\xde\x02\x7a\xe7\xbc\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x8c\x10\x95\x00\x40\x21\x41\x21\x41\x21\x6f\x1e\x0a\xf9\xef\x86\x68\xbc\xa9\x3a\xa3\x7c\x0c\x2b\xfc\x09\x8c\xe0\xf0\xbf\x31\xc4\x7e\xc7\x56\x6b\xf4\x73\xcd\xe4\xc1\x9c\xd7\x9a\xb9\xa8\x9d\xd0\x15\x49\x30\xef\x77\x2d\x52\x6a\x75\x12\x84\xb2\x85\xe4\x97\xf3\xfe\x74\x72\x88\xc5\x6b\xab\x91\x5a\x83\x0e\x87\x45\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\x48\xc0\xc8\xcd\x84\x91\x0d\xeb\x86\x58\x9b\x37\x24\xba\x04\xc5\x04\xc5\x04\xc5\xec\x28\xc5\x7c\x83\x68\xcc\xa0\x98\x1e\xfc\xb2\xac\xe4\xcc\x12\xa6\x7a\x96\x4b\xf6\x0a\xc5\x3e\x61\x03\x98\x77\x8b\x35\x2c\xaa\x1f\x16\xb2\x7d\x41\xc9\x25\xf4\xc5\xad\x16\x13\x2e\x28\xb9\xf6\xa4\x22\x3b\x49\xc7\x69\xa2\x26\x6f\x47\x82\x06\x3d\x83\xf8\xb5\x07\x48\xae\xa5\x92\x7a\x6f\x32\xdf\x0a\xd1\x31\x81\x05\x0f\xd2\x18\xc7\x82\xc3\xb4\x8e\xeb\xe9\xb4\x48\x5a\x77\x94\xc6\xad\xa4\x75\xeb\x6b\x61\x52\xa4\xaf\x99\xa0\x23\xb6\xf4\x35\xeb\x6b\xc2\x0f\x43\xde\xe7\x8e\x21\x6f\x65\xdb\xca\x8a\x5a\xa5\x6b\x73\xfe\x14\x72\x80\x3d\x58\x4b\x21\xdd\x32\xd1\x64\x90\xf7\xa4\x71\xde\x93\x0c\x32\x49\x7a\x64\x92\x3c\x48\x63\x6c\x7f\x2c\x69\xea\x3e\x77\xda\x95\x26\xcf\x54\x14\x5b\x4f\x63\x62\xff\x65\x88\xe6\x8c\x8a\xd2\x05\xf9\xc7\xaa\x72\x89\xaf\x97\x96\x23\xfb\x92\x5c\x95\xcc\x64\x17\xab\x6a\x55\x59\x31\x04\xbb\x5d\x1e\xe8\x96\xa5\x9f\x18\x62\x5f\xd8\x46\x77\x39\x9a\xba\xa2\xb7\x11\xf9\x62\x33\x76\xa6\x29\x7e\x0b\x03\x13\x4e\x9b\xb7\xe8\x0a\xab\x53\xea\xba\x28\x9d\x6a\x7b\xba\x4b\xe2\xe1\xbc\xba\x0d\x3b\x54\x0b\x76\xa8\x77\xfa\xaf\x00\xe7\xd9\xbc\x59\x39\xb1\x7e\xda\x1a\xb9\x34\x3c\x5e\x8a\x7d\x91\xe0\x6f\x0f\xc6\x2a\x18\xab\x60\xac\x82\xb1\x0a\xc6\x2a\x18\xab\x60\xac\x82\xb1\x0a\xc6\x2a\x18\xab\x60\xac\x82\xb1\x0a\xc6\xaa\x4e\x1b\xab\x66\x68\x8a\x4d\xc6\x4e\x99\x04\xe5\x41\x47\x36\x50\x8f\xfd\x5c\xfb\x73\x82\xc2\xb0\x04\xc3\x12\x0c\x4b\x5b\xc8\xb0\xf4\xf5\x2b\x34\xad\x63\xcd\xd5\xaa\xa2\x66\xa5\x62\xa1\x94\x6f\x60\x65\xe2\x88\x4a\x29\x55\xa5\x62\x59\xc9\x19\x97\xc8\x15\x95\xfd\xcd\x2b\xec\xab\x03\xf4\x66\x5b\x2b\x57\xd6\x52\x91\x43\x42\x01\xad\xe8\x4b\xa7\x21\x5b\x0d\x88\x79\xd6\x6c\x6d\x41\xc9\x4d\x9a\xad\x25\xc6\xb4\xcb\x26\xad\xa6\xec\x46\x29\x8f\x6b\xba\x1c\x20\xa6\x01\xce\x00\xce\xd2\x00\x67\x00\x67\x00\x67\x00\x67\x3d\x03\xce\xd2\x5d\x03\xce\x02\xef\x49\xcb\xe0\x2c\x0d\x70\x06\x70\x06\x70\x06\x70\x06\x70\xd6\x79\x70\x96\xee\x69\x40\x95\x06\xa0\x6a\x1f\xa0\x4a\x77\x3b\xa0\x4a\x6f\x41\x40\x95\x79\x27\x5d\x12\x8e\x57\x17\xe8\x61\xee\x78\x75\x86\x66\x68\xca\xd3\xc9\xd6\xc6\x9f\x92\x6b\xa9\xa4\x07\x2c\x9a\x2f\xa8\xfe\xee\x57\xde\xfe\xb7\x22\x47\xe9\x92\xbf\xf7\xd5\x29\x76\xc2\xf0\xbe\xb2\xfa\xa5\x3b\x5d\x79\x74\xcd\xe1\x98\x1b\xfb\x5f\x3b\xea\x90\x9a\xbe\x44\x45\x25\x4f\x7a\x76\x50\x9c\xb1\x49\xfc\x4c\xe0\xae\xc7\x68\x91\x1e\xa9\xf1\xf0\x9e\xa4\x53\x1b\x7c\x6f\x28\xd0\x88\x92\xf7\x2d\x3a\x2a\x7f\x2c\x2c\x4a\xce\xee\xe7\x25\x67\x35\x41\x32\x45\x1b\x9f\x90\xf4\xb8\x88\x24\x58\xa0\xf3\x56\x24\x41\x20\x0d\x3f\x21\x02\x0c\x1e\xa1\x0b\xb6\x00\x83\x40\x5a\xf6\x93\x7b\xcd\xc9\x35\x97\xdc\xcb\xcd\xcb\x38\xbf\xd8\x86\xc4\x07\x46\xea\xe4\xde\xb0\x5e\x1a\xd9\x56\x67\x5a\x59\xf6\x94\x81\x27\xc5\xd9\x0e\x19\x38\x65\x5e\xd9\x69\x69\xd8\x9e\xd2\xfb\xa0\xc9\xa0\xc9\xa0\xc9\xa0\xc9\xbd\x43\x93\xa1\xfe\xf9\xa8\x7f\xdd\x83\xdb\x5f\x0f\xd3\x77\xc2\xec\xdb\xe1\xc8\xb7\xcc\x57\xf5\xb9\xf0\xa3\xf6\x0d\x6e\xa1\x14\x55\xc5\x26\x35\xba\x24\x2f\x0b\xdb\xb4\x09\x82\xac\x25\x4b\xff\x4a\xf8\x60\xd9\x14\xcd\x92\x52\x1a\x29\xc9\x79\x89\xbf\x12\x7d\x8f\x6b\x57\x48\x05\x12\x36\x27\x83\xae\x3c\x14\x56\x56\xe4\x9c\xa6\xf2\x16\x6f\x58\x46\x63\x4b\xb4\x17\x8a\xc3\xfa\xd6\x97\x3f\x6e\x34\x5f\x91\xb2\x7c\x9e\x14\x94\x9c\xb9\xf0\x58\x8b\x03\xb7\xc7\x1b\xef\x65\x55\xd5\x3a\x69\x1f\x28\x49\xbb\xd2\x78\x20\xfd\x26\xcb\xe2\x7b\x33\x9a\x48\x8a\x7e\x8a\x12\xdb\x2e\x7d\x8c\x31\xde\x85\x05\xde\x03\xb7\x2d\x3d\xac\x1a\xb0\x6a\xc0\xaa\x01\xab\x06\xac\x1a\x3d\x6d\xd5\xf8\x5a\x98\x5e\x0b\xb3\x57\xc3\x91\x57\xcc\xd5\xf6\x63\xe1\x69\x5b\x20\x70\xb9\x28\x4b\xaa\x6c\x7e\xfa\x0b\x15\xa5\x2c\xe5\xf9\x3a\xbc\xa0\x14\x0b\xd9\x1b\x0e\x9f\x26\xe3\x75\x5b\x91\xc4\xda\x0b\x4f\x25\xc7\x93\xd1\x45\x21\x47\xc4\x22\x59\x96\x4b\xda\x34\xb5\x56\x11\x39\xaa\x54\xca\x57\xa5\x92\xe1\x63\x55\x59\x95\x47\x97\xa5\xa2\xa1\xfd\xc7\xc4\xd1\x58\x74\xb9\x50\x92\x8a\x85\x77\x19\xe2\x7b\x49\x8e\x4a\x39\x6e\x22\x50\x46\x05\x31\xce\x59\xaa\xa5\x68\x3c\xae\x5a\x17\x09\x7d\x3b\x19\x9d\x29\x70\x91\x64\xeb\xb8\x52\xa9\x7f\x32\xcb\x2c\x53\x15\xea\x3e\xd7\xfe\x94\xea\xd5\x64\x6c\x97\xe8\xcf\xb4\xf1\x20\x4e\x67\xad\x0f\xf4\xd3\xfb\xfb\xd9\x7b\xfb\x23\x6f\x98\x1e\x7b\xdf\xec\x7b\x5c\x97\x83\xda\x14\xbd\xaa\x5c\x8f\xe6\xa5\xca\x92\x94\x77\x50\x09\x53\x51\x93\x2b\xcb\x4a\x65\x45\x1b\x0b\xd7\x9e\x5e\xa8\xb9\xb9\x77\x47\xb9\x5a\x63\xe8\x24\x65\xf1\x54\x05\x4d\x5f\xc8\x16\x72\x96\x62\xcd\xd7\x46\xbe\xcd\x31\x47\x57\x5b\x9c\xf4\x95\xc3\x58\xfd\x92\xb6\x61\x34\xe4\xa6\x69\x0b\x31\xfd\xf4\x9c\x37\x4b\x46\x05\x81\xe2\xb2\xd8\xae\xad\xc6\xc5\x33\xc4\xb5\x3d\x0f\xff\xcb\x39\x31\xd4\x63\xd1\x78\x5a\xca\x3e\x9b\xaf\x28\xab\xa5\x9c\x76\x16\x77\x90\xe3\x27\xd5\x0c\x9c\x50\x56\x74\x0d\xc8\xd9\x88\xf1\x04\x4b\x66\x4b\xc7\xa2\xf1\x59\xa5\x22\xdb\x9a\x8d\x66\x25\x35\x2b\xf1\xa4\x26\xfa\xf8\x08\x97\x48\xde\x9e\x2a\xd4\xe9\xba\x06\x97\xcd\x36\x92\xb1\x3b\xca\xb5\xf3\xc6\xae\xdb\xc0\x68\x08\xa3\x61\x8f\x1a\x0d\x33\x79\x9a\x17\xdc\x7c\x86\xa6\x38\x37\x3f\x41\xc7\xe8\x68\x0b\xf0\x72\xb1\x2a\x55\x57\xd5\x80\xf0\x73\xf3\x36\x34\x17\x38\x7d\x2d\xe1\x8e\x9f\xef\x64\x77\x08\x89\x61\x49\x73\xda\x8a\xb9\x4a\xfe\x24\x4c\x77\x09\xa7\x7e\x21\x0c\xcd\xec\x24\xec\xbf\x86\xd9\xd7\xc3\xf4\x66\xf1\xb3\x99\x70\xe4\xee\xbc\x5c\x75\x6a\xdb\xc2\xdc\x9b\xd8\x93\x97\xab\x42\x1a\xea\xe9\x3b\x26\x17\xe6\x0c\xca\xa8\x06\xc7\xc8\xeb\x1a\x9a\xa8\x6b\x68\xa2\x99\x86\x32\x65\xcf\xd9\x45\x8f\x89\x49\x7c\x9e\xe6\xf9\x24\x9e\xa5\x69\x4a\xb7\x30\x89\x6d\x03\x30\x5f\x50\xab\xfa\xa4\x65\xff\x78\x88\x52\x3e\xf9\xb9\x5c\xea\x0b\xfc\xc9\x20\xfb\xbd\xb0\x95\x9e\xeb\xde\x8a\x2c\xe5\x6a\x10\x83\x95\x77\x30\x71\x9f\x76\xb8\x03\x99\xfc\x45\xc2\x93\x27\xe9\xa4\x18\xb1\x71\x3a\xc4\x47\x6c\x94\x46\x68\x9f\x6f\x72\x2b\x5b\x92\x7b\xbf\x0f\xfd\x5e\xf7\x8f\xf0\x16\xd6\x9f\x97\xab\x01\x27\xd9\x8f\x7c\x66\xbb\x35\xce\xd1\x8a\x5c\x2e\x4a\x59\xd9\x7b\xa8\x1f\xd0\xcf\xe8\xd4\x68\xa7\x79\x36\x99\x1a\x73\xf9\xfa\x86\x1b\x6c\x14\xa6\xf1\x16\x4d\xe3\x1f\x0d\x6d\xf8\x5b\x9f\x12\x66\xf0\xe3\x34\x61\x99\xc1\x03\x17\x18\x81\x4a\x84\x06\xe2\xa7\xbc\x5a\xa5\xc4\xbb\x77\x59\x02\xe3\x4e\x7d\x5f\x22\xd9\x65\x84\xbe\xb9\xe8\x98\x88\x68\x8f\x0d\x19\x52\xc3\x47\x6a\xc0\x8e\xd1\x11\x3b\x06\x00\x16\x00\x16\x00\x56\xbb\x00\x56\xe6\xa5\x50\xc0\xbb\xf8\x8b\xc2\x3d\xed\x1c\xcd\xd9\xdc\xd3\xda\x4c\x06\xa2\xee\x2b\xf6\x0e\x76\xab\x18\xa6\x66\xf7\x0c\x0d\xf5\x02\x4b\x7d\x48\xbf\x7e\x9b\xa5\x02\x0c\x95\xa5\x4a\xb5\xc0\x7d\x79\x84\x15\xc0\x7b\xf3\x70\x7f\xb9\x43\x25\xd7\x26\xee\xa9\x6d\x68\x84\xdf\x7a\x1f\xdf\x42\xef\xb1\x1f\x5c\x91\x2b\x79\xd9\x7e\x74\xc0\x7e\x54\xad\x56\xa4\xaa\x9c\x2f\x64\x47\xea\xce\x73\xb4\xa2\xfd\x7d\x43\x3f\xaa\xf5\x32\xad\xed\xa6\x33\x35\xdb\x96\x09\x3a\xd2\xc2\x14\x58\xe0\x41\xd3\xd0\x46\x7c\xb4\x91\xcf\xf6\xd1\x8b\x7d\xec\x85\xbe\xc8\xa7\x4c\x91\xfe\x7c\x5f\xef\xec\x61\x6a\x2c\xb2\xda\x38\x73\x4f\x37\xee\x35\xa0\x4d\x4e\x2b\x7b\xc2\xa0\xc7\xc4\x1d\xe2\x2b\x93\x70\x8c\x94\x8a\xfc\x4a\x4d\x05\x13\x57\xf3\x33\xb8\x3a\xa4\x46\x07\x33\xaa\x52\x5a\x10\x69\x04\x1e\xd6\x3e\x0b\xfd\xef\x45\xe3\x63\xb1\x7e\x1c\xf2\xde\x5c\xa5\x5f\x0b\xd1\xab\x21\xf6\x4a\x28\xf2\xb2\xc9\x77\x3f\x1d\x9a\x55\x2a\x59\xae\xa9\xe5\x15\x3e\xec\x4a\x34\xb6\xac\xfd\x14\x8b\x4e\x3a\x9e\x82\x83\x71\xa1\x54\xad\xaa\x96\x8b\xdb\x88\x94\xe5\x0f\xce\x1d\x07\x8b\x85\xac\xbe\x68\xca\xc5\x9c\x1a\x55\xae\xeb\x63\x2a\x1c\xeb\xca\xb2\x52\x2e\xca\xc9\xa8\xb8\x23\xcf\xfb\x60\xbc\x4b\x0e\xa8\x5d\x07\xc0\xbc\x7d\x6c\x1b\xef\x96\x23\x20\xa3\xfd\x60\xc8\x3b\xef\x6d\xb9\x1d\xf5\x17\x7b\xa8\xee\x07\xfb\xf9\x77\x98\x59\xac\xed\xe9\x5e\xc6\x96\xe4\xaa\x34\xb6\xee\x9c\x2f\xff\xf9\x0a\x7b\x7d\x80\xee\x74\x38\x6a\x8b\xa6\x5a\x4d\xfc\x32\x5e\x9b\xf8\x45\x34\x87\xec\x2f\xc8\xfe\x82\xec\x2f\xf0\xd7\x87\xbf\x3e\xfc\xf5\xe1\xaf\xbf\x75\xfc\xf5\xbb\xc7\x1d\x1d\x7e\xd2\xf0\x93\x86\x9f\x34\xfc\xa4\xe1\x27\xdd\xd3\x7e\xd2\x70\xe4\x84\x23\x67\x8f\x3a\x72\x6e\xc9\xec\x2f\x6b\xf4\x76\x01\x1b\x1f\xa5\x8b\x1c\x36\xce\x53\x86\xce\x36\x97\x01\x41\xa0\xa3\xb6\xa6\x80\xc9\xfb\x83\xc8\x69\x96\xde\x40\x0a\x18\xf1\x0c\x14\xfb\xfb\xe4\x8e\xd9\xfc\x93\xc1\x1c\xad\x4f\x06\xd3\x69\xa6\x26\x10\xd8\x53\xf4\x04\x5d\xaa\xb1\x15\xcd\xd2\x74\x10\xef\x12\x76\x23\xf8\xbe\xb5\xe8\xfb\xf6\xd9\xb0\x48\xe1\xb2\x9f\xa7\x70\xd1\x24\xcc\x59\x0a\x68\x56\xd2\xd3\xc2\x29\xee\x31\x5a\xb4\x9c\xe2\x82\x6b\xfd\xb2\xb0\xc0\x5f\xa2\x47\x6d\x16\xf8\xe0\x9a\xdf\x68\x75\xda\x4e\x89\xc6\xc4\x87\x47\xdc\x45\xe3\xfa\xf2\xc5\x4c\xd5\xe7\x8b\x11\xed\x20\x69\x0c\x20\x34\x20\x34\x20\x34\x20\xf4\x56\x85\xd0\x50\x0e\x91\x34\x06\xce\xd6\x48\x1a\x03\x63\x08\x8c\x21\x30\x86\xc0\x18\x02\x63\x08\x62\x6e\x10\x73\x83\x98\x1b\x24\x8d\x81\xad\x11\xb6\xc6\x9b\x23\x69\xcc\x3a\x12\xba\x74\x8c\x4c\x6f\xc5\xf8\x80\x5f\x1e\xa4\xe3\x22\x3e\xa0\xb2\x24\x65\x93\xc6\x40\xf3\x79\xc2\xdf\x56\x41\x19\x5d\x4b\x89\x69\x35\x9a\x2d\xae\xaa\x55\xb9\x52\x51\x8a\xf2\x92\xb6\x69\x2e\xe5\x55\xf6\x83\x38\xfb\xbf\xfa\xe9\x2d\xda\xd5\x93\xf6\x8b\xaf\xac\xa5\x22\x7f\x4d\xd7\x7d\x4b\xb9\xc2\x5a\x21\xb7\x2a\x15\xed\x36\x67\xc9\xdc\x67\x4e\x89\x66\x2f\x2a\x45\x39\x2d\x9a\x4d\xda\x94\x8a\x09\x53\x1d\x89\xf3\xe6\xe2\x16\xee\x75\xf0\x3b\xa5\x2c\x9b\xc8\x40\xad\xca\x52\x2e\x99\x48\xf2\x0b\x2e\xd6\x76\xed\x52\xaa\xfe\x8e\xf3\x05\xb5\xda\xe5\x31\x05\x99\x67\x69\x41\x7c\x63\x73\x74\x86\x7f\x63\x3c\x89\x48\x0b\xdf\x18\xf7\x01\x98\xd1\x36\x89\xbe\xdf\xd9\x5e\xf7\xef\x6c\x27\x23\xde\x31\x61\x15\x7f\xd6\xff\x03\x3b\xcb\x66\xf5\x0f\xcc\x73\x9e\xe9\x9f\x5b\xfd\xbb\x71\x46\xef\x20\xb2\x02\x91\x15\x19\x18\xb5\x60\xd4\x82\x51\x0b\x46\xad\x9e\x31\x6a\x65\xba\xc6\x66\x13\x78\x4f\x5a\x36\x26\x64\x60\x4c\x80\x31\x01\xc6\x04\x18\x13\x60\x4c\xe8\xbc\x31\x21\x70\x14\x91\xe9\x69\x7c\x9a\x01\x3e\x6d\x1f\x3e\xcd\x74\x3d\x3e\xdd\x82\xa1\x1a\xec\x57\x9f\xa1\x7d\x7a\x6a\x11\x6d\xd3\x95\x2f\xf0\xac\x52\x4e\x6e\xa8\x6f\xf5\x0b\x59\x59\x65\x7f\xeb\x19\xf6\xaf\x07\x88\xd5\x9c\x7c\x65\x2d\x15\x19\x6c\x9c\x3b\x64\x72\x61\x6e\x51\x34\x92\xb8\x9f\xa7\x0b\x71\xb6\x70\x29\x65\x9d\xd0\xe5\x08\x0f\x69\x41\x00\xaf\x90\x16\x04\xf0\x0a\xf0\x0a\xf0\xaa\x87\xe0\x55\x17\x39\x1c\x77\x0d\xbc\x82\x27\x2c\xe0\x15\xe0\x15\xe0\x15\xe0\x15\xd2\x82\xc0\x55\xef\xe6\x61\x4d\x5d\xef\xaa\xb7\x25\xd3\x82\x3c\x47\x4b\xc2\xf5\xe9\xed\xf4\x24\x77\x7d\x5a\xa4\x47\xe8\x82\xab\xeb\x93\x36\x0f\x46\xa4\x7c\x5e\x1b\xac\xaa\x52\xb1\xbc\x9f\x6a\x29\x95\x28\xee\xa5\x83\xa3\x40\xb2\x83\xbc\xc3\xdf\x0f\xea\x04\x3b\x66\xf7\x66\x12\x2e\x4f\x56\x37\xcc\xe2\x75\xae\x44\x8d\x62\x1f\x20\x57\x80\xf6\x16\x23\x2b\x48\xc9\x0e\xcb\x1e\xd0\x33\x81\x74\x00\x97\x09\xba\x25\xd1\x15\xba\x5c\x93\xf1\xe3\x61\x3a\x17\xe0\x6b\x42\x6c\x27\x12\x7f\xb4\x98\xf8\xe3\xd7\xc2\x94\x13\x19\x34\x2e\xd3\xdb\x6d\x19\x34\x2e\x50\xb0\x53\xd4\xbb\x22\xe1\x33\x42\x84\x3d\x4e\x8f\x71\x11\x16\xf8\x8d\xb3\x22\xfd\xc8\xd3\xf4\x94\x95\x7e\x24\xe8\x9b\x34\x9b\x0d\xa4\x39\x51\xd8\x58\xda\x35\x14\x94\x89\x3f\x1a\x76\x15\x85\xf7\xbb\x66\x01\xb1\x49\xc5\x7d\x7a\xe2\x8f\x5a\xa9\x68\xe5\xfd\x68\x9b\x7c\x44\x82\x0f\xe0\x64\xe0\x64\xe0\x64\xe0\x64\x24\xf8\x40\x82\x0f\x24\xf8\x40\x82\x0f\x98\x35\x60\xd6\x80\x59\x03\x66\x0d\x98\x35\x02\x31\x6b\x20\xc1\x07\x12\x7c\x20\xc1\x07\x12\x7c\xc0\x6a\x08\xab\x61\x0f\x25\xf8\x68\xbb\xdd\x2d\xf8\xbc\x1b\xef\xdd\x47\x69\xe1\x3c\x2f\x04\xd5\xe8\x5a\xca\xab\x1a\x67\x59\xc9\xe5\x0a\x6a\x65\x95\x43\xdc\xa5\xd5\x5c\x5e\xae\xea\x27\x3c\xc7\x5e\x4a\xb0\xbf\xd7\x47\x3b\x44\x1b\x57\xd6\x52\x91\x81\x8a\x2c\xe5\x6a\xf6\xa7\x0b\x4a\x6e\xda\x6c\x20\xcd\x1b\x48\x0c\x69\xe7\x09\x09\x67\x2f\x5a\xed\x72\x6a\xb0\x0c\x3c\x93\xa3\x39\x31\x8f\xd2\x74\x9a\xcf\xa3\x09\x3a\x42\x87\x3d\x33\x98\xeb\x2b\xcf\x5a\x2a\xe9\xd2\x35\xdf\x49\xf4\xa4\xff\xc4\x38\xcc\x0e\xea\xef\x5e\xdc\x4a\x9f\x1a\x6e\x77\xb3\x4f\xa0\x6b\xf7\xba\xcf\xcf\x5b\x58\xbf\x76\x6a\xe4\xcf\xb6\xdb\xdf\xca\x50\x45\x2e\x17\xa5\x6c\x6d\x0d\x71\xb7\x17\x33\xac\x9f\xba\x09\xef\x26\xcd\x6b\x6d\xd4\xd8\x6f\x5b\x7e\x39\xa0\x74\x30\xd5\xb6\x68\xaa\xfd\xe7\x21\x6f\x23\x6a\x80\xd2\xe3\xbc\xb0\x97\x9e\xa1\x19\xcb\x5e\xba\x81\xf6\x0c\xa1\xe3\x2d\x19\xca\xab\x55\x6a\xa3\x4c\x4a\xfc\xa3\x5d\x76\xa1\xb3\x47\x57\xa3\x25\x57\x39\xa3\x9b\x41\x37\x43\xcc\xb4\xc7\x0c\x0a\x71\xe3\x23\x6e\x80\xe2\x3b\x82\xe2\xc1\x60\xc0\x60\xc0\x60\xda\xc5\x60\x32\x2f\x85\x02\xde\x88\x5e\x14\x4e\x61\xe7\x68\xce\xe6\x14\xd6\xe6\xcd\x6d\xd4\x5d\x45\xd8\xc1\x6e\x15\xc3\xd4\x4e\x2d\x21\xfd\xa1\x9d\x76\x2d\x61\xac\x2c\x55\xaa\x05\xee\x9d\x22\xb8\x76\x13\x7b\x94\x44\x59\xaa\x66\xaf\x76\x58\x75\xb8\xa7\xb6\xa1\x11\xde\x8b\x7d\xda\x9f\x13\x7b\xec\x07\x57\xe4\x4a\x5e\xb6\x1f\x1d\xb0\x1f\xe5\x7b\x7b\x39\x5f\xc8\x8e\xd4\x9d\xe7\x68\x45\xfb\xfb\x86\x7e\x54\xeb\x65\xfa\x3c\xcd\x53\xa6\x66\x77\x34\x41\x47\x5a\x98\x25\x0b\x3c\x36\x18\x0a\x8b\x8f\xc2\xf2\xd9\x3e\x7a\xb1\x8f\xbd\xd0\x17\xf9\x94\x29\xf5\x9f\xef\xeb\x9d\xfd\x51\x8d\xdd\x51\x1b\x67\xee\xcf\xc5\x6d\xe3\xda\xe4\xb4\x92\x04\x0c\x7a\x4c\xdc\x21\xbe\x78\x09\xf7\x3f\xa9\xc8\xaf\xd4\xb4\x34\x71\x35\x3f\x83\x6b\x4c\x6a\x74\x30\xa3\x2a\xa5\x05\x11\x2d\xff\xb0\xf6\x59\xe8\x7f\x2f\x1a\x1f\x8b\xf5\xe3\x90\xf7\xc6\x2d\xfd\x5a\x88\x5e\x0d\xb1\x57\x42\x91\x97\x4d\x8a\xf9\xe9\xd0\xac\x52\xc9\x72\x65\x2e\xaf\xf0\x61\x57\xa2\xb1\x65\xed\xa7\x58\x74\xd2\xf1\x14\x1c\xff\x0a\xbd\x6b\x55\xb5\x1c\xb9\x46\xa4\x2c\x7f\x70\xee\x1e\x57\x2c\x64\xf5\x75\x55\x2e\xe6\xd4\xa8\x72\x5d\x1f\x53\xe1\x3e\x56\x96\x95\x72\x51\x4e\x46\xc5\x1d\x79\x7a\x03\xe3\x5d\x72\x0c\xeb\x3a\x00\xe6\xed\x63\xdb\x78\xb7\x1c\x71\x07\x1d\xa5\x55\xf7\xbb\xaf\x0a\xdb\xd9\x2d\xbc\xa7\xed\x5c\x14\x32\xa7\xe9\x24\x3b\x1e\x9b\x30\x53\x17\xdf\xcf\xbf\x2a\xfd\x13\x77\xb9\x3a\xd6\xaf\x9d\x60\x4f\x4d\xbc\x05\x93\x1f\xff\xec\x20\xc5\x05\x84\x55\xab\x4a\x45\xca\xcb\xb6\xcc\x25\x59\xb5\x50\x52\x72\xb2\x49\x5a\xff\x28\xce\x5e\x0f\x13\xe9\x27\x6a\x2b\x67\xc4\x05\xb5\x4e\x2d\xce\x9d\x57\x72\x72\xe2\x2d\xda\xb1\x45\x71\xee\xa5\x94\xfe\x6b\xc0\x24\xf5\x49\x3a\x29\xe6\xe6\x38\x1d\xe2\x73\x73\x94\x46\x68\x9f\xe7\xdc\x34\x1e\x71\x2d\x95\xd4\xfb\xe3\x3b\x21\x1f\xf3\x9f\x6f\x63\x6c\xbf\x3e\xdf\x9c\x43\x68\x24\xf3\xd5\xef\xb4\x1e\x74\xfa\x0b\xdb\x1d\xc3\x7c\xaf\x3b\x3b\x35\x46\xfa\x6e\xfd\x70\x7b\x07\x3b\xcd\x53\x2d\xd7\x2c\xfe\xeb\x1b\x6d\xac\xf7\xe0\xa1\x2d\xf2\xd0\x8f\x86\x36\xfc\xa9\x4f\x09\xd6\x79\x9c\x26\x2c\xd6\x19\xb8\xbc\xf0\x21\x9f\xed\x11\x27\x89\xdf\xbd\xdd\x21\x2f\x76\x99\xd8\xd3\x10\x11\x6f\x15\xbf\xb4\x59\x42\x80\x6a\x82\x6a\x82\x6a\x82\x6a\x82\x6a\x82\x6a\xae\x9b\x6a\xfe\x1f\x1b\x5f\xe1\xa7\x05\xc7\x3c\x41\xc7\x6c\x1c\x33\xf0\x25\xde\x9f\x5c\xb6\x67\x95\x4f\xff\xee\x6d\x8e\x55\x7e\xc0\x07\x5b\x1a\x6b\xff\x5d\x7c\xeb\xdc\xbe\xa5\x1f\x54\xb2\xd7\x14\x0e\x50\x49\x50\xc9\x4d\xa6\x92\xed\x27\x3f\xbe\x28\xb2\x3d\x52\x3e\x73\x90\xc6\xd8\xfe\x58\xd2\x84\x88\x77\xda\x31\xa4\x7e\x45\x3d\x7a\x0c\x1c\x0c\xfe\xc1\x20\x8d\x79\x80\xc1\x25\xb9\x2a\x99\xf5\xd0\x6a\x18\xe1\x2f\x0e\xb2\xef\xf6\xd3\xed\xd6\x32\xc5\x4f\x8e\x7c\x26\xa4\x3b\xed\xda\x8a\x9f\x95\x0c\x7d\xdd\x48\x72\xac\x3f\x5c\x20\x95\xcf\x86\xad\x00\x30\xbe\x3d\xd0\xc3\x85\x0a\x55\x79\xc5\x92\x43\x71\x47\xcc\xa6\xad\xed\x64\x22\x72\xdd\xb1\x68\xf2\xa7\x08\x7a\xe5\xbc\x89\x6a\xa4\x79\x7f\x2c\xd7\xc5\xc7\xf2\x94\xff\xc7\x32\xce\x0e\xad\xf3\x63\xe1\x6f\x05\xe5\xd0\x90\x51\x1a\xe5\xd0\x90\x02\x04\x29\x40\xfc\x86\x05\x29\x40\x6e\xa6\x14\x20\x28\x87\x86\x72\x68\x48\xbd\x80\xd4\x0b\x48\xbd\x80\xd4\x0b\x5d\x91\x7a\xa1\x4b\xc8\x05\x8a\xa8\x21\x44\x1d\x45\xd4\xb6\x4e\x62\x6b\xf6\x73\x49\xba\xa0\x17\x51\xcb\x69\x0a\x70\x41\x29\xb9\x97\x52\x13\xdc\x71\x65\xb5\x2a\x69\xca\xcd\x75\x79\xe9\xaa\xa2\x3c\xeb\xd8\x2e\x9a\x18\xf2\xe5\x11\xf6\xfe\x7e\xba\xd7\xb5\x41\x13\x4a\x8e\xba\x78\x2f\x3e\xac\xb7\xfe\xb8\x68\x7d\xca\xde\x7a\xe2\xb8\x76\xc1\xa4\x5b\x9b\x3a\x21\x6c\x74\x75\xc0\xae\x8f\xef\x09\xd1\xb2\xc0\x7c\x57\xe8\x32\xc7\x7c\x8f\xd3\x63\xb4\xe8\x49\xc0\xdd\xc7\x56\x1f\x8a\x64\xa3\x8e\xfb\xc2\xbf\xe7\xfc\xd9\xde\x53\xec\x09\x23\xbd\x40\x83\x77\xac\x93\xbe\x86\x9d\xa9\xc3\x7f\x7e\xbe\x94\x3f\x4f\x7e\xf3\x60\xcc\xdd\xbd\xb2\xe1\x54\x38\xa5\x5f\xd3\x1d\xb3\x21\x5d\xa0\x3c\xc9\x35\x26\xd0\xf6\xcc\x06\x58\x47\xe1\xc3\xd9\xa2\x0f\xe7\x77\x3b\x27\xb2\x9e\x15\xbe\x9e\x39\x5a\xb2\x7c\x3d\x21\x1f\xdd\x5c\x52\x13\x3f\xd8\xe5\x27\x1f\x1f\x32\xdd\x49\x1b\x8a\xc4\x93\x7a\x56\xf1\xee\x90\x88\xf0\x45\x85\x2f\x2a\x7c\x51\xe1\x8b\x0a\x5f\x54\xf8\xa2\xb6\x12\x61\xef\x99\x7d\xa7\xeb\x43\xef\xd7\xa7\x76\xd4\xe9\x0b\x01\xe9\x21\xfe\x6e\xb2\xe9\xf7\xbd\xc9\x4f\xf3\x38\xe6\xe3\xe2\xda\x50\x1f\x39\xc1\xfd\xb4\x36\x5f\x1d\x81\x7f\x6c\xaf\x29\x41\xf0\x8f\x85\x7f\xec\x26\xfb\xc7\x6e\x39\x3c\xd8\xb6\x75\xc8\xcf\x8f\x37\x33\x47\x67\xd8\x4c\x6c\xca\x34\x5b\x0d\xda\xcd\x56\x8d\xda\xee\x80\x17\xee\xaf\xed\xa3\x73\x82\x8d\xe7\x0a\x6a\x56\x59\xd3\xa4\x72\x0d\x0f\xf7\x48\x99\x2a\x97\x72\x65\xa5\x50\xaa\xaa\xc5\x42\xd6\x72\xcf\xfd\x7f\x12\xec\x13\x7d\x74\x87\xd9\x98\xb9\xd2\x46\x5d\x58\xf8\x8c\xde\xc4\x62\x91\x17\x0d\xd3\xce\x98\x36\x2e\xd4\x57\x50\x2b\xf1\x8d\xe3\xe4\x80\x59\xf7\x32\x9d\x13\x73\x79\x9a\xd2\x7c\x2e\x1f\xa7\x06\xeb\x57\xd2\x1a\x2a\x63\xfe\x3a\x3a\xb7\x81\x18\xde\xbc\x5c\xa5\x6b\x4b\xfe\xf3\xf9\x14\x3b\xa1\x4f\xdf\xda\xd7\xa6\x4f\x59\x67\x87\xea\xe6\x7e\xe4\xfd\x3b\xdc\x5e\xd2\x5e\x77\x50\xed\x7c\x4f\x49\xfd\xa4\x4d\x79\x55\xeb\xd5\x35\xfc\xde\x15\x74\x0d\xd0\xe6\x16\x69\xf3\x2f\x87\x82\x95\x1a\x0b\x02\x29\xcf\xd1\x19\x0b\x29\x6f\x96\x1c\xe2\xb9\x04\x3a\x20\x87\x12\x9f\xdb\xe5\x26\x87\xee\x36\x80\x70\xa9\x46\xf6\x8c\x88\x03\x9b\x23\x7a\x40\x7c\x41\x7c\x41\x7c\x41\x7c\x41\x7c\x41\x7c\x5b\x21\xbe\x9d\xcc\x82\x1a\x2c\x45\x6e\x3e\x33\x41\x07\x74\x86\xf4\xc7\x77\xba\xe9\x0c\xc3\x3e\x28\xd7\xa9\x48\x0c\xf3\xbd\x79\xc7\xf5\x08\xa0\xda\x5e\xd3\x5e\x80\x6a\x81\x6a\x37\x19\xd5\x76\x98\x6e\x75\x60\x09\xf0\x67\xae\x13\x74\x84\x1d\x8e\x1d\x34\x99\xeb\x6e\x3b\x73\x75\xb4\x7e\x53\x64\x59\xfd\xe1\x10\x2d\x0a\x8c\xbb\x5c\x54\xae\x6b\x1f\x72\x45\x29\x26\xcd\xa8\x67\xf7\xd4\x0a\xe5\x4a\x41\xa9\x14\xaa\x37\x8a\xf2\x9a\x5c\x74\x77\x73\xfe\xe4\x10\xfb\xcf\xdb\x68\x8f\xad\xd1\x49\xa3\x4d\x73\xe1\xfd\x37\xcd\xa4\x5e\x58\xd0\xef\x35\xaf\xdd\xcb\x01\xb9\xbb\x22\x1b\xc3\x04\xbf\xdd\xac\xcb\x63\xea\x9a\x81\x77\xff\x91\xad\xa1\x85\x6c\x0d\x3f\xee\x2f\x23\x9e\x60\x97\x74\x19\xd1\x68\x4a\x1b\xb9\x97\x3d\x5f\x0f\xd2\x39\x20\x9d\x03\xd2\x39\x20\x9d\x03\xd2\x39\x20\x9d\x03\xd2\x39\x20\x9d\x03\xd2\x39\x20\x9d\x03\xd2\x39\x20\x9d\x03\xd2\x39\x6c\x7a\x3a\x87\x33\x34\xc3\xa6\x62\x93\x26\x67\x19\x70\xd4\xc3\xf1\xdc\xd1\x21\xc3\x03\x32\x3c\x20\xc3\x03\x32\x3c\xd8\x32\x3c\x7c\x3f\x4e\x09\xed\xd5\x35\xae\xf0\x6f\x52\xcd\xaf\xc4\xd9\xbf\x0f\xd3\xad\x59\xa5\xc2\xf3\x9c\xbf\xd5\xbd\x9e\x7f\xe2\x6e\xed\xf7\x29\xa5\x22\xd7\xd4\x5f\x0c\xd8\xf9\xf4\x22\x8d\x0b\x40\xb7\x9f\x92\x1c\xd0\x0d\xd2\x00\x3d\xe8\x89\xe7\xb5\x5e\xeb\xd5\xcf\x36\xea\x68\x3a\xe3\x4f\xe1\x62\x2c\xaa\x53\xb8\x58\xcc\xaa\x73\xe6\x48\x28\x1c\x79\xdf\x76\x6b\x2c\x77\x7b\x56\xe1\x4f\x44\xf4\x43\x6d\x1f\xd1\x34\x2f\x20\x57\x63\xe4\x6c\x72\x48\x61\xd0\x84\x3f\x68\x8b\xfe\xa0\x7f\x37\x44\xc7\x85\x0b\xe7\x21\x3a\x60\xb9\x70\x6e\xfc\x6b\x6e\x59\x3e\x34\xe9\xe7\xd9\x9c\x18\xb0\x7f\xf2\x6e\x22\x21\xf1\x6f\x6e\xb7\xc4\xc0\x4e\x7b\x5d\xfc\xc4\x6e\xf1\xbf\xf6\x7f\xf8\xf0\xd0\x84\x87\x26\x3c\x34\xe1\xa1\x09\x0f\x4d\x78\x68\xae\xdb\x43\xf3\xa7\x42\xad\x2b\xe2\x27\x84\x6b\xe7\x61\x3a\x68\x73\xed\x0c\x4e\x8f\xf7\xf7\xbb\x0c\x46\x95\x4f\xbf\x72\x9b\xb5\x86\xc7\xfc\xab\xd6\x27\xde\xc6\xdd\x6d\xda\xba\xb0\xc3\x65\xb2\xd7\xd4\x09\xb8\x4c\xc2\x65\x72\x93\x5d\x26\xdb\xc8\x64\x7c\xcb\x3e\x05\x23\xca\x33\xfb\x29\xc9\x86\x63\x09\x93\xae\xdf\x5e\x53\x6d\xfe\xa6\xf0\x7b\xfc\x50\x9c\xde\x62\x82\x3f\x7b\x99\xa8\xbf\x1c\x60\xff\xce\x86\xf8\xee\x76\x41\x7c\xbc\x76\xe1\x9b\x6d\x8c\x2f\xf8\xf2\xf1\x8b\x74\x44\x4c\xa3\x14\x8d\xf2\x69\x34\x44\x71\x7a\xc8\x77\x1a\x6d\xb0\x10\x34\x67\x7b\xb3\xfe\xb3\x68\x2f\x7b\xa0\x76\x16\xd5\x55\x0b\x8b\xbc\xdb\x06\xf7\x22\xee\x70\x8f\x0f\xe4\x1d\x4e\xba\x17\x7c\xed\xe7\x63\x74\x94\xc6\x6b\x96\xe1\x66\x07\x13\x6b\x2e\xa8\x5e\x8b\x54\xef\x43\xa1\x0d\x7c\xc3\x27\x04\x0f\xd4\xb6\x05\x26\x0f\xec\x88\x08\xe0\x5c\x2f\x20\x11\x90\x78\xdd\x06\xf6\xde\x64\x82\x3d\xfe\xd5\xef\x72\x90\x3d\x14\x7c\xbf\x49\xa4\x01\x80\x1e\x80\x1e\x80\x1e\x80\xde\xd6\x06\x7a\x2f\x85\xba\x3f\x97\x66\x00\xe8\x2f\xa0\x65\x3e\xfd\x6f\x6d\xec\x6f\xaf\x0f\xfb\xe3\x8b\xff\xed\x76\xf8\x87\x8a\xef\x60\x7e\x60\x7e\x60\x7e\x5b\x97\xf9\xb5\x13\xd6\xf8\x42\xbf\x80\x84\x78\x26\x45\xa3\x6c\x24\xb6\xcf\x64\x78\xbb\xec\xd4\xaf\x43\x95\xdd\xff\x70\x37\x9d\xd0\xeb\x2d\x95\xcb\x6a\x03\x9f\xbc\x9c\x5c\x2e\x2a\x37\x56\xb4\xd5\x5d\xe7\x76\xa3\x6a\x56\x2a\xca\xec\x9f\xec\x66\x7f\x19\xa6\x5b\xb5\xcb\xb5\xd5\x68\x80\xd3\x3b\x7e\xc8\x78\x14\x6b\x29\x9a\x36\x1b\x49\xec\xe5\xe5\x93\xca\x65\xd5\x6e\x8c\xb2\x8e\x2f\x6a\x0d\x04\x4c\xf8\xde\x4e\xa7\xc5\xa4\x39\x4a\xe3\x7c\xd2\x68\x93\x67\xc4\x3b\x0b\xea\x6a\x55\xd1\x9e\xa3\x50\xca\x73\x1d\x40\xeb\xd1\x46\x49\xdf\x82\xff\xd4\x19\x61\xfb\x8c\x6c\xa7\x56\x07\xf4\x39\x24\xfa\xe0\x60\x7e\x5f\xde\x6e\x8d\xfd\x90\xc1\xfc\xfc\x87\x7f\xc0\x28\x59\xd4\xc9\x37\x90\x9e\xa2\x49\x3a\x55\xb3\x54\xaf\xf7\x15\x60\x7d\x06\x1f\x6c\x91\x0f\x7e\x22\x14\x80\x04\x98\x11\x9c\xf0\x24\x1d\xb7\x38\x61\x1b\x04\x49\xe0\x92\xc2\x87\x40\xa6\xff\xe2\x36\x4b\x90\x8c\xd5\x6d\x29\xfc\x25\xca\x83\x22\xc3\x7e\xa7\xe4\x09\xb6\x1d\xbd\x26\xd6\xb0\xed\xc0\xb6\x63\x93\xb7\x1d\x6f\xf7\xf6\xfb\xde\xf0\xc2\xd2\xf4\xf6\x23\xf0\x95\x21\x33\x46\xfb\x59\x32\x36\x6c\x6e\x44\xee\xb0\x6f\x44\xf8\xf9\x37\x85\x03\xc2\x6f\x0c\xd2\x84\xd8\xeb\x88\xec\x30\x56\xa6\x25\x3d\xc9\x92\x57\xf6\x7c\x7e\x36\xfb\x07\x83\xec\xc5\x7e\xda\x21\xfe\xa7\xad\x92\xef\xd4\xe3\x73\x4b\xb9\xc2\x5a\x21\xb7\x2a\x15\x1d\x69\x95\xcc\x58\x78\x9e\x86\x27\x90\xcc\x49\xc9\x84\x08\x09\xe6\x2d\x3a\x96\x59\xfe\xcb\x7c\x41\xad\x22\xc3\x51\xbd\x2a\x75\xd1\xff\x83\x19\x65\x23\xfa\x07\xe3\x98\x1a\x46\x86\x33\x7e\x1b\x87\x32\xb5\xd7\xfd\x2b\xdd\xc9\x88\x3f\xac\xf6\xfe\x90\xbc\x08\xc9\x8b\x90\xbc\x08\xc9\x8b\x90\xbc\x08\xc9\x8b\x90\xbc\x08\xc9\x8b\x90\xbc\x08\xc9\x8b\x90\xbc\x08\xc9\x8b\x90\xbc\xa8\xd3\xc9\x8b\xb6\x1e\xab\x40\x56\x23\x64\x35\x42\x56\xa3\x2d\x94\xd5\xe8\x97\x12\x74\x58\xb0\x45\x35\x7b\x55\xce\xad\x72\xb4\x5b\x93\xc9\xdd\xc8\xe1\x9e\x2d\x4a\xaa\x6a\x85\x3f\xfd\xd5\x10\xfb\x48\x1f\x31\xeb\xba\x86\x75\x38\x8d\x5c\x6b\x53\x5a\x23\x89\x98\x76\xc6\xa2\x79\x65\x4d\x02\x74\x7e\x4e\xc0\x4e\x14\xf9\x75\xf9\x69\x26\x6d\xa3\x61\x54\x28\x70\xf4\xce\x17\xde\x65\xfd\xe1\xdd\x69\x76\x52\x87\x77\x75\x63\x5f\x93\x72\x5c\xdc\xb2\xbe\x44\x41\x63\xaf\x8d\xc8\x7b\x76\xb8\xbe\x1e\x8f\x0a\x9c\xce\x37\xf4\x90\x7e\x52\x27\x5f\x52\xfa\x02\x3d\x4c\xe7\x6a\x6c\x93\x1b\x79\x4b\x30\x4e\xc2\xe7\xa2\x45\x9f\x8b\x5f\x5d\x9f\x63\xb7\xbf\xc0\x78\x44\xf8\x5f\x64\xe8\xac\xe5\x7f\xd1\x66\x19\xe4\x13\xbb\xd5\x09\x11\x95\x78\x61\x97\xab\x0c\x7a\xab\x95\xbc\xc9\x21\x76\x1e\x14\xbf\x77\x54\xea\x20\x00\x0c\x01\x60\x08\x00\x43\x00\x18\x02\xc0\x10\x00\x86\x00\x30\xf7\x00\xb0\x4e\xe8\x0a\xe9\x7f\xb8\xd3\x55\x57\xf0\xab\xba\xe9\xd4\x20\xf6\x72\x77\xa3\x4e\x29\x10\x70\xe7\xec\x35\xb5\x05\xee\x9c\x70\xe7\xdc\x64\x77\xce\x4e\xb3\x2c\x5f\xd7\xce\x4e\xac\x0e\x8d\xcb\x6d\x3a\x2e\xee\x40\xfc\xd9\x1b\xfb\xe8\x82\xce\x4d\xab\x4a\x45\xca\xcb\xb5\xd0\xd4\xc3\x27\x33\xab\x89\x43\x7e\x41\x56\x2a\x4b\xd9\x42\xb5\x60\x01\xd5\x7f\xb6\x8f\x7d\xa6\x8f\x6e\xd7\x8f\x9b\xcb\xdf\x43\x2e\x34\x75\x6a\x71\x6e\x51\x9c\x36\x25\x9a\xb9\x91\x48\x72\xa4\x2a\x7e\xac\x2b\x35\x5d\x7f\x7e\xc0\x78\xb5\xe0\xed\x61\x7c\x5e\xcc\xd5\x33\x34\xc3\xe7\xea\x29\x3a\x41\xc7\xbc\xe7\xaa\x3e\x9a\xc6\x44\xad\xef\x78\x93\x11\x6b\xb2\xff\x94\x4c\xb3\xd3\x75\xb3\xcc\x98\xa3\x8e\x97\xaa\x4f\xd0\xfa\xbe\x50\xe4\xc3\x3b\xea\x5f\xd8\xa0\x3b\x5f\x75\x79\x67\x29\x03\xb2\x6e\xd2\x6b\x4b\x3f\x42\xda\x97\xe1\xd4\x1e\x36\xf6\x7a\xa0\x40\x00\xb9\xb6\x88\x5c\xff\x75\x88\x16\x05\x24\x9d\xa7\x8c\x05\x49\x37\x2a\x30\xba\x48\x32\x71\xec\xda\x9c\x64\xf2\x14\x39\x4d\x8a\xac\xc4\xaf\xec\xaa\x97\x4c\xf7\x98\xd4\xd5\x45\x18\xed\xd7\xd1\xeb\x66\xc9\x22\x60\x58\x60\x58\x60\x58\x60\x58\x60\x58\x60\x58\x60\x58\x77\x0c\xdb\x9c\xee\xb0\xce\x4d\x4c\x3d\x88\xfd\x85\x9d\xf5\xba\x43\xca\x87\xc2\xba\x68\x14\xa3\x02\xc5\x6e\x82\x42\x01\x2c\xdb\x6b\x6a\x0c\xb0\x2c\xb0\xec\x26\x63\xd9\x42\xd0\x1b\x4a\xdf\x05\xa3\x33\xcb\x81\x2f\xff\xcd\x9c\xa2\x13\xec\x58\xec\xa8\x89\x66\xef\xb3\xa3\xd9\xfa\x5b\xdc\x14\x51\xf9\xaf\x0c\xd1\x41\x9f\x7a\xa0\x86\xd6\xf6\xce\x55\xa5\x2a\x99\x98\xf7\xef\x0c\xb1\x3f\xb5\x95\x0d\x70\x73\x96\x35\x62\x2d\x1f\xd1\x2e\x4c\x3c\xe0\x56\x23\xd4\x71\x4a\xc0\x30\xf7\x69\x9a\x14\x13\x79\x82\x8e\xf0\x89\x3c\x46\xfb\x29\xe9\x9b\xa5\xce\xd1\xa5\x8d\x66\x1c\xbb\xe0\x3f\xb5\x87\x59\x42\x4c\x62\xe7\x8d\xdd\x8b\x08\x46\xbe\x64\x2b\x32\xe0\xe1\x01\xeb\x1c\xf6\x07\x3d\x6a\x89\xb6\x71\xe4\xd3\xd3\x94\xa6\xd3\x35\x6a\xc3\xba\x87\x1e\xca\x02\x10\x6c\x8b\x08\xf6\x93\xa1\x20\x3e\xfd\x59\x41\x71\xb5\xe5\xcf\xa4\xb8\xed\x10\x21\x41\xcb\x08\x1f\x72\x9b\xf8\x73\x5b\x91\x02\xcb\x81\xd5\x29\x35\xf6\xba\xd7\x21\x6d\xa7\xd0\x00\x38\x05\x38\x05\x38\x05\x38\x05\x38\x05\x38\x5d\x37\x38\xfd\xc7\x81\xac\xf8\x67\x04\x2d\x3d\x4d\x27\x6d\xb4\xb4\x1d\x4b\xbe\x3f\x22\x6d\x4e\x29\xa8\xcd\x72\xed\xad\x1e\xa4\xbf\x67\xab\x59\xe0\xe7\x8a\xea\xd4\x05\x62\xae\x95\x4b\xdb\xa4\x0a\x00\x79\xf6\x9a\x02\x02\xe4\x09\xe4\xb9\xc9\xc8\xb3\x23\xa4\x28\x68\x89\xee\xcf\x33\x1b\xba\x9a\x3a\x1a\xbe\x29\x50\xe6\xcf\xef\xa1\x8c\x70\x66\xcd\xca\x15\x3d\x95\x80\xac\xd6\x7a\xb4\xda\x8f\x15\xf2\xa5\x42\x29\x6f\x4c\x0d\xb3\xb0\x02\x37\x73\xb2\xd7\xee\x61\xaf\xf7\xd1\x5b\xec\xe7\x9b\x56\xc4\xc3\xa2\xcc\x02\x3f\xb1\x3e\x2d\xf7\x94\x75\xc9\xa2\xb8\xc5\x45\x71\x8b\x04\xbf\xce\x76\x58\xd5\xcd\x89\x9e\x57\x08\x93\x6b\xc0\x60\x74\x95\x9e\x12\xd3\x7d\x91\x1e\xe1\xd3\xfd\x1c\xcd\xd1\x19\xef\xe9\x6e\x1f\x4d\x13\xf3\x7b\xf5\x78\xa3\xc4\xf4\x9d\xfe\x9f\xc9\x79\x36\xaf\x7f\x26\x2e\x2f\xda\xb0\x08\x78\xf6\xaf\xce\x30\x10\xf9\xbd\x1d\x1e\xaf\xf9\xa8\x59\xd1\x61\xdd\x6f\xda\xb8\x74\xb3\x5f\x76\xfa\x32\xbd\x9d\x9e\xac\xd1\x67\x82\x7b\xdb\x50\x6f\x00\x69\x5b\x84\xb4\xdf\x08\xb5\x55\x0c\x5d\x11\xf4\xf6\x09\xba\x64\xd1\xdb\x2e\x91\x73\xdc\x7f\xb6\xf3\x72\x2e\xfd\xbb\x3b\x3d\xe4\x5c\xba\xbe\xe0\xc4\xba\x05\xde\xb8\xd8\x25\x6e\xa2\xb8\xc3\xd6\xb1\xd7\x64\x2b\xb6\x8e\xd8\x3a\x6e\xf2\xd6\x71\x73\x75\x69\xdf\x90\xc6\xce\xaf\x32\x99\x59\x9a\x66\xe9\xd8\x69\x73\xe7\xf8\x90\xc3\x8b\xc6\xab\xa1\x4e\x04\x3b\xc6\x29\x21\xf6\x87\x25\xb9\x7a\x5d\xa9\x3c\xeb\x48\x12\xa7\x17\xa1\xe0\xfb\x41\x55\x95\x55\xf6\xd5\x38\xfb\xb5\x7e\x7a\x93\x75\xee\x95\xb5\x54\x44\x6d\xae\xe8\xc4\x9c\x68\x25\xa0\xb2\x13\xc3\xfc\x82\xf3\x66\x47\x2e\xa5\xf4\xf6\xe7\x0b\x6a\x75\x56\xa9\x4c\x16\x8b\x26\x97\x0d\x6e\x3d\xbd\x89\x4a\x50\x34\x53\x2e\xe2\xda\x13\xfe\x9f\xca\x21\x76\x40\x7c\x0f\xfa\xf8\xbb\x19\xe0\xeb\xe6\x16\x0a\x51\xa0\x10\x05\x0a\x51\xa0\x10\x05\x0a\x51\xf8\x0d\x0b\x0a\x51\xa0\x10\x05\x0a\x51\xa0\x10\x05\x0a\x51\xa0\x10\x05\x0a\x51\xa0\x10\x45\xd0\x85\x28\x50\x26\x02\x65\x22\x50\x26\xa2\x87\xcb\x44\xfc\xee\x10\x9d\xf5\x25\x80\x1e\x51\x70\x26\x18\x34\x02\xe0\x7e\x76\x88\xfd\x59\x1d\x1f\xfc\x4c\x48\x7f\x1f\x36\x2a\x58\x32\x24\x9c\xb2\x1c\x7d\xb6\x50\xca\x05\x4a\x07\x87\x2d\x6d\x86\x6b\x6c\xfa\xda\xa7\x29\x44\x96\x9a\x16\x77\x68\xc6\xb6\xb6\x93\x89\x58\x1d\x5b\xb4\x5c\x3c\xf5\x7e\x82\x28\xae\x07\xbc\x5f\x17\xe0\xbd\x39\x9a\xe8\xc9\x0c\xbd\x31\x23\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x22\x68\x62\x87\x69\xe2\x41\x1a\x63\xfb\x63\x49\xd3\xcf\xe9\x4e\xbb\x9f\x93\xbe\x73\xbb\x19\xe2\x6a\x40\x39\x41\x39\x41\x39\xb7\x10\xe5\xfc\xfc\xdb\x28\xea\x95\xd2\xcb\x8c\x6e\xfb\xe0\xdb\xd8\x1f\xd8\xd2\x77\x0d\x34\x0c\x68\x33\x91\x60\x62\xb7\x4b\x12\xaf\xb6\xc4\xa8\x3d\x41\x27\x04\xd4\x3b\x4c\x07\x39\xd4\x4b\xd2\x30\x25\x7c\x43\x32\xcd\x4e\x6d\x34\x0c\xed\x9c\x3f\xbf\x1b\x64\x03\xb5\xd1\x9a\xd6\xed\xed\xc8\x2e\xf2\x19\x5b\xd2\xae\x21\xbf\x98\x32\x6b\xb0\xf7\xb8\xa7\xee\x6a\x4b\x98\xd8\x69\x3a\x49\xc7\x6b\x62\x17\xd6\x35\xe0\x88\x56\x40\x24\x58\x8b\x91\x60\x1f\x09\x6d\xf4\x63\x4f\x8b\x60\xaf\x63\x74\xd4\x0a\xf6\x0a\x5a\x60\x34\x27\x11\x1a\xc9\x81\xa6\x53\x74\xa5\x7f\xdf\x96\xac\x63\xac\xe9\xe0\x2c\x4b\x72\x44\xdc\x52\x76\x20\xde\x0a\xf1\x56\x88\xb7\x42\xbc\xd5\x96\x8e\xb7\x6a\xbb\x5e\xe8\x1b\x52\x15\xa4\x66\x98\x39\x4c\x07\xd9\x58\x6c\xbf\x89\x03\xee\xb2\x43\x04\xf3\x9a\x0e\x04\x47\xbd\x38\x44\xe3\xc2\x35\x62\x89\x7b\x41\xf8\xb9\x43\x5c\x53\x96\x4c\x4f\x88\xef\x0d\xb2\xaf\xf6\xd3\x76\x7e\xa1\xb6\x62\xfd\xd3\x66\x9c\x20\x32\xca\x52\x57\x38\x40\xec\xe6\xb7\x4b\x6b\xff\xd8\x7d\x1f\x32\xca\x52\xf7\xfb\x3d\x78\x96\x84\x0a\xdc\x21\xa2\x69\xbf\x87\xb3\xfe\x5f\xc7\x43\x6c\xaf\xfe\x75\xf0\x19\xa3\x7f\x20\x19\x65\x09\x7e\x0e\xf0\x73\x80\x9f\x03\xfc\x1c\xe0\xe7\x00\x3f\x07\xf8\x39\xc0\xcf\x01\x7e\x0e\xf0\x73\x80\x9f\x03\xfc\x1c\xe0\xe7\xb0\x99\x7e\x0e\xfb\x29\xc9\x86\x63\x09\x13\x51\xdc\x6e\x47\x14\x19\x65\x09\x3e\x0e\xf0\x71\x80\x8f\x03\x7c\x1c\x3a\xea\xe3\xf0\x83\x08\x9d\xf7\x8e\xe4\x12\x99\x7e\x9b\x0c\xe4\x32\x3c\x22\x3e\x19\x61\x1f\xed\x23\xe6\x88\xe7\x12\xe9\x11\x1f\x6c\xe8\x1c\xa1\xbb\x7a\x25\x86\xb5\xb3\xec\x81\x54\x35\x85\x42\xf5\xf3\xda\xe2\x2d\xa1\x17\x2b\xda\xcf\x8b\x15\x85\x2f\x9c\x63\xe3\x74\x88\x0e\x78\x52\x71\xdb\x98\x19\x39\xc8\x8c\x50\x23\x3f\x3c\x7e\xd9\x9f\xef\x4d\xb0\x23\xeb\x8f\x6b\xd2\x6b\xf4\x35\xf6\xca\x88\xfc\x60\xbb\xeb\x0b\x8a\xfb\xf9\x54\x18\xef\x68\x54\x3f\x71\x73\x5e\x53\x7a\x8e\xce\xd0\x4c\x8d\xc1\xb2\xb5\xf7\x04\x5b\x25\xbc\x2d\x5a\xf4\xb6\xf8\x4c\x28\x30\x61\x71\x4e\xb8\x5d\x4c\x53\xda\x72\xbb\xd8\x64\xc9\xe3\x23\x60\x3c\x05\x93\x9f\x47\xc6\xcf\xef\x74\x95\x3c\xfb\x9b\x76\xce\x30\x44\x90\xb0\x03\x77\x5e\x00\xc1\x5b\xa3\xd7\x24\x20\xbc\x35\xe0\xad\xb1\xc9\xde\x1a\x9d\xd3\x4b\x7d\xdd\x36\xda\xab\xb8\xf6\x4c\x34\x08\xfb\x7e\x9c\xf6\x89\x9d\x97\xb3\x12\xb7\xb9\xed\x12\x6e\x23\x59\xb5\x50\x52\x72\xb2\xca\xbe\x1c\x67\xbf\xda\x4f\xb7\xeb\x27\x9b\x0b\x67\x93\x89\x74\xa7\x16\xe7\xce\x2b\x39\x39\xa0\x44\xba\xf7\xf1\x0b\xf4\x32\xde\x46\x7a\x7a\x71\x87\xf9\x82\x5a\xed\x7e\x87\x8f\x2e\x4d\x9d\xfb\x94\xff\xb7\x35\xce\x0e\xf9\x14\x70\xd7\xde\x82\xcb\x87\x05\x37\x10\xb8\x81\xc0\x0d\x04\x6e\x20\x70\x03\x81\x1b\x08\xdc\x40\xe0\x06\x02\x37\x10\xb8\x81\xc0\x0d\x04\x6e\x20\x70\x03\xe9\xac\x1b\x08\x5c\x2e\xe0\x72\x01\x97\x8b\x1e\x76\xb9\xf8\xa9\x3e\x7a\x48\x80\x3f\x49\xdb\x74\xe5\x0b\xdc\x12\xa4\x9d\x5d\x03\x00\xd9\x1f\x84\xd9\xeb\x61\xba\xbb\xe6\x34\x13\xfd\xdd\x9d\x97\xab\xce\x95\x57\x3c\x53\xe2\xa1\xbc\x5c\x9d\x74\x5e\xa4\x43\xba\xc9\x85\x39\x63\xcb\x17\xa0\x49\xac\xae\xa1\x89\xba\x86\x26\x9a\x69\x28\x53\xf6\x8e\xc4\x7a\x4c\x10\xbb\xf3\x34\xcf\x89\xdd\x2c\x4d\x53\xba\x05\x62\x67\x1b\x80\xf9\x82\x6a\x84\x63\xb1\x3f\xbd\x4c\xc7\x1a\x24\x34\xf6\xf3\x80\x61\x9f\xbb\xcc\xfe\xde\x40\x6d\x0e\xe3\x87\x84\x0e\x5f\xd1\xb5\x0f\x63\x79\xaa\xc9\x5e\x9c\x78\x40\x3b\x6d\x2b\x27\x0e\x4e\x03\x2d\x02\x2d\xa6\x81\x16\x81\x16\x81\x16\x81\x16\x7b\x06\x2d\xa6\xbb\x06\x2d\x06\xde\x93\x96\xd1\x62\x1a\x68\x11\x68\x11\x68\x11\x68\x11\x68\xb1\xf3\x68\x31\xdd\xd3\x24\x30\x0d\x12\xd8\x3e\x12\x98\xee\x76\x12\x98\xde\x82\x24\x30\xf3\x0e\x9a\x11\x54\xeb\x24\x1d\xe7\x54\xeb\x30\x1d\xa4\xb1\xe6\xbc\x3a\x93\xb6\xd2\xf5\xbe\xce\x67\xcd\x15\x51\x6a\xaa\x08\xbb\xd3\x7f\xf3\xda\x7d\xee\x6e\x6d\xb7\xb2\x6d\xdc\xa3\x2d\xf6\x13\x3b\x6a\xa9\xd8\x1d\x62\x19\x8a\x4a\x25\x93\x80\xed\x15\x3f\x75\x86\x81\x09\x64\x35\x4d\x69\x3a\x5d\xe3\x44\xbf\x9f\x92\xeb\x1b\x7b\xb8\xce\x23\x78\xa8\xc5\xe0\xa1\x3f\x0e\x79\xa3\xee\x49\x21\x14\x26\xe8\x08\x17\x0a\x63\xb4\xee\x89\x29\xbc\xc5\x53\xdc\x5b\xdc\x0c\x28\x6a\xa5\x9d\x33\x5a\x3b\x63\xec\x34\x9d\xa4\xed\x93\x59\x6d\x79\x69\xad\xa1\xf5\x09\xa2\x16\xaa\xb9\x35\x10\x44\x65\x45\xad\x52\xe2\xb7\x86\x6b\x05\xd1\x1e\xa1\xf9\x46\xb3\x4a\x51\xdb\xc7\xea\xeb\x92\x19\x5e\x24\x8e\xda\x65\xd2\x94\x79\x62\xbb\xa5\xd3\xa3\x74\x91\x16\xec\xd2\x29\x91\xa6\xd3\x2d\x58\x3b\xa6\xf9\x33\x5c\xe0\xdc\x55\x05\xa1\x05\xa1\x05\xa1\x05\xa1\xed\x21\x42\x0b\xfd\xcc\x47\x3f\xeb\x1e\x84\xfd\x7a\x98\xbe\x13\x66\xdf\x0e\x47\xbe\x65\xbe\xaa\xcf\x85\x1f\xb5\x6f\x1a\x0b\xa5\xa8\x2a\x36\x7e\xd1\x25\x79\x59\xd8\x7b\x4d\xb8\x62\x2d\x59\xfa\x57\xc2\x07\xcb\xa6\x09\x96\x94\xd2\x48\x49\xce\x4b\xfc\x95\xe8\xfb\x46\xbb\xc6\x28\x30\xab\x39\x19\x74\xdd\xa0\xb0\xb2\x22\xe7\x34\x9d\xb4\x78\xc3\x32\xc4\x5a\xa2\xbd\x50\x1c\xd6\xb7\x93\xfc\x71\xa3\xf9\x8a\x94\xe5\xf3\xa4\xa0\xe4\xcc\x85\xc7\x5a\x1c\xb8\x8d\xdb\x78\x2f\xab\xaa\xd6\x49\xfb\x40\x49\xda\x95\xc6\x03\xe9\x37\x59\x16\xdf\x9b\xd1\x44\x52\xf4\x53\x44\x27\xba\xf4\x31\xc6\x78\x17\x16\x78\x0f\xdc\xb6\xc9\xb0\x14\xc0\x52\x00\x4b\x01\x2c\x05\xb0\x14\xf4\xb4\xa5\xe0\x6b\x61\x7a\x2d\xcc\x5e\x0d\x47\x5e\x31\x57\xdb\x8f\x85\xa7\x6d\xa1\xc1\xe5\xa2\x2c\xa9\xb2\xf9\xe9\x2f\x54\x94\xb2\x94\xe7\xeb\xf0\x82\x52\x2c\x64\x6f\x38\xfc\x84\x8c\xd7\x6d\xc5\x16\x6b\x2f\x3c\x95\x1c\x4f\x46\x17\x85\x1c\x11\x8b\x64\x59\x2e\x69\xd3\xd4\x5a\x45\xe4\xa8\x52\x29\x5f\x95\x4a\x86\xdf\x52\x65\x55\x1e\x5d\x96\x8a\x86\xf6\x1f\x13\x47\x63\xd1\xe5\x42\x49\x2a\x16\xde\x65\x88\xef\x25\x39\x2a\xe5\x38\x76\x57\x46\x05\x85\xcd\x59\xaa\xa5\x68\x3c\xae\x5a\x17\x09\x7d\x3b\x19\x9d\x29\x70\x91\x64\xeb\xb8\x52\xa9\x7f\x32\xcb\xd4\x51\x15\xea\x3e\xd7\xfe\x94\xea\xd5\x64\x6c\x97\xe8\xcf\xb4\xf1\x20\x4e\x07\xa8\x0f\xf4\xd3\xfb\xfb\xd9\x7b\xfb\x23\x6f\x98\x5e\x70\xdf\xec\x7b\x5c\x97\x83\xda\x14\xbd\xaa\x5c\x8f\xe6\xa5\xca\x92\x94\x77\x40\x07\x53\x51\x93\x2b\xcb\x4a\x65\x45\x1b\x0b\xd7\x9e\x5e\xa8\xb9\xb9\x77\x47\xb9\x5a\x63\xe8\x24\x65\xf1\x54\x05\x4d\x5f\xc8\x16\x72\x96\x62\xcd\xd7\x46\x91\xc4\xc0\x18\x5d\x6d\x71\xd2\x57\x0e\x63\xf5\x4b\xda\x86\xd1\x90\x9b\xa6\x7d\xc1\xf4\x7d\x73\xde\x2c\x19\x15\xac\x88\xcb\x62\xbb\xb6\x1a\x17\xcf\x10\xd7\xf6\x3c\xfc\x2f\xe7\xc4\x50\x8f\x45\xe3\x69\x29\xfb\x6c\xbe\xa2\xac\x96\x72\xda\x59\xdc\xe9\x8c\x9f\x54\x33\x70\x42\x59\xd1\x35\x20\x67\x23\xc6\x13\x2c\x99\x2d\x1d\x8b\xc6\x67\x95\x8a\x6c\x6b\x36\x9a\x95\xd4\xac\x94\xd3\x9e\x5e\x1f\x1f\xe1\x66\xc8\xdb\x53\x85\x3a\x5d\xd7\xe0\xb2\xd9\x46\x32\x76\x47\xb9\x76\xde\xd8\x75\x1b\x18\xe2\x60\x88\xeb\x51\x43\x5c\x26\x4f\xf3\x82\x5f\xcf\xd0\x14\xe7\xd7\x27\xe8\x18\x1d\x6d\x01\x5e\x8a\xc4\x4d\xbe\xb6\xad\x84\x3b\xf8\xbd\x93\xdd\x21\xbe\x66\x4b\xd2\x52\xfb\xec\x60\x5b\x31\x01\xc9\x0f\x13\x74\x76\xfd\x3e\xef\xfa\xb9\x5c\x6a\x16\xcc\xdc\x8f\xec\xb3\x09\xf6\xa1\xbe\x5a\xc2\x1e\xe5\xf9\x1e\x9d\x7b\x60\x1d\xa8\x0b\x99\x99\x88\xd7\xe6\x7a\xb4\xc8\xba\xe3\xc4\x80\xd3\x3c\x2e\x09\xc3\xc6\x7e\x6e\xd8\xd0\xe6\xe8\x11\x3a\x4c\x07\x9b\x34\x69\x38\x3a\xe6\x3b\x3d\x9f\xf1\x9f\x72\xc7\xd8\x51\x9f\x69\xe6\xbc\xa5\xc3\xee\xe1\x93\xe8\xf1\x8f\xb7\xd7\xbe\x94\xbd\x46\x8e\xc7\x46\xef\x25\xe1\x92\xdf\xb1\x23\xaf\x26\x9d\xa1\xb3\x34\x5b\x63\x98\x6d\xf1\xdd\x00\xff\xc1\x3c\xdb\xa2\x79\xf6\x17\x43\xc1\x49\x88\x79\x61\x8b\xd5\x96\x43\xd3\x16\xdb\x3e\x79\xd3\x38\xfd\x62\xbb\xc5\x51\xe2\x93\xbb\x6a\xe5\xcd\x5b\x75\x25\x5d\xaa\x11\x31\x43\xf5\x06\xd6\xce\x48\x98\xf6\x18\x57\x21\x6b\x7c\x64\x0d\x00\x7f\x47\x00\x3f\xc8\x0e\xc8\x0e\xc8\x4e\xbb\xc8\x4e\xe6\xa5\x06\x7e\x5b\xc1\xee\x7b\x2f\x0a\xd7\xab\x73\x34\x67\x73\xbd\xda\x58\x9b\x86\x8e\x10\x75\xd7\x11\x76\xb0\x5b\xc5\x30\xb5\x5d\x4d\x48\xff\xd4\xce\x5a\x35\x61\xb8\x2e\x01\x74\xa3\xfd\xc9\x60\x5d\xf2\xe7\xb6\xeb\x0e\xc8\xfb\xdc\x6b\x1a\x0b\xf2\x3e\x23\xef\xf3\x26\xe7\x7d\xee\x20\xa8\xf2\x4d\xfc\xdc\xe6\x35\x21\x33\x41\x47\xd8\xe1\xd8\x41\x13\xa1\xee\x76\x94\xf0\xb6\x5f\x77\x53\xe4\x7f\xfe\x9b\x7d\xb4\x57\xe0\xd7\xca\x92\x94\x4d\x1a\x2f\xa4\x26\x13\xcc\x28\xe3\x9b\x26\x7a\x8b\x76\xd2\xa4\xfd\x1c\x6d\xd1\xf4\xcc\x00\x13\xcb\xcb\xd5\x8b\xb5\x57\x5c\xea\xfe\xf4\x2f\xed\xc9\xf2\xe2\x37\xf7\xd9\x27\xae\xd0\x39\xff\x77\xd1\xb0\x1a\x52\x45\x29\xca\x4b\xda\x7a\x59\xca\xab\xec\xeb\xcf\xb0\xaf\x0c\xd0\x6e\xb7\x77\x26\x52\xf7\x0c\x35\x4e\x0d\x73\x51\x29\xca\x69\xd1\x58\x22\xa5\x9d\xea\xf2\x2e\x6b\xaa\x5d\xd8\x2e\x41\xba\x18\xa4\x8b\x41\xba\x18\x04\x23\x20\x18\x01\xc1\x08\x08\x46\xe8\x9a\x60\x84\xee\xf1\xb5\x87\x13\x38\x9c\xc0\xe1\x04\x0e\x27\x70\x38\x81\xf7\xb4\x13\x38\xbc\x54\xe1\xa5\xda\xa3\x5e\xaa\x5b\x32\x5d\x4c\x96\xce\x0a\x3c\x36\x49\xa7\x38\x1e\x3b\x4a\xe3\x74\xc8\x13\x06\x73\x94\x65\x94\xff\xb3\xe1\xa1\xa6\x32\xc6\x14\xfc\x61\xef\x2c\x9b\xd6\x61\xaf\x27\x34\xd3\xa1\xaf\xed\xe6\x2e\xa5\xaa\xfd\x52\xc8\xfc\xdb\x1d\x8d\x48\xda\x5b\x8c\x74\x32\x0e\x68\x76\x40\xfc\xba\x39\xd8\x4c\x50\xae\x33\x34\x43\x53\x35\xe6\xba\x03\x94\x5a\xf7\xeb\x82\x9d\x0e\x5e\x8c\x2d\x7a\x31\x7e\x3f\x44\xd3\x42\x62\x9c\xa0\x63\x5c\x62\x1c\xa2\x56\xa6\x20\xcd\x09\x17\xc6\x34\x9d\xb6\x5c\x18\x5b\x6c\x2a\x23\xdc\x1a\xa6\x68\xd2\xe6\xd6\xd0\x62\x5b\x7e\x42\xcc\x27\x27\x4c\x07\x85\x5c\xe2\x83\x23\x8d\x84\x58\xd4\x35\x15\x8d\x5d\xa0\x9d\x10\x67\x78\x09\x34\xb7\xd4\x34\xed\x13\x6d\x48\x4f\x03\x22\x0c\x22\x0c\x22\x0c\x22\x8c\xf4\x34\x48\x4f\x03\xef\x75\xa4\xa7\x81\x65\x02\x96\x09\x58\x26\x60\x99\x80\x65\x22\x10\xcb\x04\x82\x98\x10\xc4\x84\x20\x26\xa4\xa7\x81\xe1\x0f\x86\xbf\xc0\xd3\xd3\x74\x26\x7e\xaf\x95\xf4\x34\x9d\xe3\xd1\x5b\x31\x60\xe2\x7f\xed\xa6\x53\x46\xdd\xdc\xb2\xda\x20\x45\x8d\x5a\x95\xaa\xf2\xf2\x6a\x51\x93\x60\x7a\x7e\x1a\xfe\xdb\xaa\xca\x3e\xb7\x9b\xfd\xef\x30\xdd\xaa\x35\x70\x65\x2d\x15\x19\xe4\x09\x6a\xc4\x31\x63\xb2\x59\x7a\xf8\xa2\xde\xce\xa2\x5c\x4d\x3c\xa4\x9d\x39\x59\x2e\xab\xf6\x48\x43\xdb\x09\xe2\xa5\x07\x9c\xa6\xe6\x29\x3a\x25\xa6\xe4\x11\x3a\xcc\xa7\xe4\x7e\x4a\xd2\xb0\xa7\x9d\x44\x7b\x2a\x63\x02\xea\xdd\xda\x40\xba\x88\xbc\x5c\xa5\x6b\x17\xfc\x67\xe4\x30\x4b\xe8\x33\x52\xbb\xbf\x3e\xf9\xec\x5d\xb0\x07\xf9\x44\xbe\xbc\xdd\x1a\xfd\x7d\x46\x26\x9a\x66\x5e\xc0\xa0\x7e\x72\x87\xdf\x41\x3a\x4d\xa7\xe9\x64\x8d\x19\x77\x9d\x2f\x01\x9c\x0f\x16\xdc\x16\x2d\xb8\x1f\x0b\x6d\x5c\x04\x4c\x0b\xe3\xad\xb6\x9c\x99\xc6\xdb\x4e\x0a\x12\x9e\x77\x26\x68\x41\x92\xfe\xab\xdb\x2c\x41\x72\xb0\x2e\x76\xbc\x19\x89\x32\xc0\xe3\x1a\x3b\x28\x4f\x10\x41\xde\x6b\x72\x0d\x11\xe4\x88\x20\xdf\xe4\x08\xf2\x0e\xe8\x90\xbe\x91\xe3\x41\x0b\xff\xcc\x11\x3a\xcc\x0e\xc6\xc6\xcc\xdd\xcb\xdd\xf6\x50\x71\xdb\x55\x37\x45\xa0\xf8\xff\x8c\xd3\x1e\x6d\xdf\xa3\xed\x78\xf8\xae\x79\xd4\xd8\x84\xbf\x73\x55\xa9\x4a\x2a\xfb\x4a\x9c\xbd\xd4\x4f\xb7\x66\x95\x8a\xac\xad\x86\x37\x74\x90\x5f\xca\x15\xd6\x0a\xb9\x55\xa9\x68\xf7\x66\x95\x4c\xa3\x99\xe1\x5e\xf1\x88\xd6\x48\xd2\x06\x47\x27\x4c\xac\x1a\xe7\x2d\xc5\x2d\xb7\x15\x87\x1f\x82\x52\x96\x4d\xd3\xa7\x5a\x95\xa5\x5c\x32\x31\xcc\x2f\x98\x52\x2a\xf2\xa5\x94\xa3\xfd\xf9\x82\x5a\x9d\x55\x2a\x93\xc5\xa2\xb9\xd2\x06\xb7\xb0\xb6\x27\x4c\x39\xf3\x2c\x2d\x88\x2f\x67\x8e\xce\xf0\x2f\x67\x92\x4e\xd1\x89\x16\x16\x4b\xee\x56\x3c\xb3\x26\x97\xfc\x3f\xa5\x75\x7d\x29\xb1\x98\xb1\xd5\xb7\x0f\xb5\x33\x3d\xe8\x5e\xf7\x6f\x73\x27\x23\xfe\xa4\xdc\xc3\x36\x83\x80\x6c\x04\x64\x67\xe0\x7e\x07\xf7\x3b\xb8\xdf\xc1\xfd\xae\x67\xdc\xef\x32\x5d\xe3\x5d\x16\x78\x4f\x5a\x76\x7b\xca\xc0\xed\x09\x6e\x4f\x70\x7b\x82\xdb\x13\xdc\x9e\x3a\xef\xf6\x14\x38\x3a\xc8\xf4\xb4\xa3\x47\x06\x8e\x1e\xed\x73\xf4\xc8\x74\xbd\xa3\xc7\x16\x8c\xf0\x66\xff\x7e\x90\x8e\xe8\x2e\x0e\xab\x55\x45\xcd\x4a\xc5\x42\x29\x3f\xba\x36\xb6\x24\x57\xa5\x31\x1d\xfe\x71\x62\xa4\x94\xaa\x52\xb1\xac\xe4\x8c\xd3\xe4\x8a\xca\xfe\xf6\x20\x7b\xf7\x36\xba\xd3\x76\xe5\x15\xfd\xca\xc8\xf3\xa1\xe6\x98\xe0\x59\xb3\xed\x05\x25\x37\x69\xb6\x1d\x10\x1d\x4c\xf3\x0b\x26\xad\xfe\x5d\x12\xdd\xf3\xb8\xeb\xd6\x64\x86\x9e\xde\x45\x81\xc3\x44\x83\x19\xe6\xfd\x99\xe1\x34\x4b\x0b\x52\xe8\x31\xd4\x36\x66\x28\x5e\x89\x51\xf7\xca\x36\x99\xc0\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xc1\x12\xbb\x8b\x25\x7e\xe1\x32\x25\x04\x4b\x54\xb3\x57\xe5\xdc\x6a\xd1\x59\xde\xbb\x5c\x29\x28\x95\x42\xf5\x46\xb6\x28\xa9\xaa\xac\xb2\xf7\x5d\x66\x1f\x1f\xa0\x37\x59\xe7\xf2\x08\x9d\xc6\x65\x4a\x16\xf4\x36\xa6\xb4\x36\x12\xf7\x6a\x27\x2f\x9a\xd7\x5f\x4a\x39\x0e\x77\x39\xb9\x43\x51\x12\x70\x2b\x14\x25\x01\xb7\x02\xb7\x02\xb7\xea\x21\x6e\xd5\x45\x19\xd6\xba\x86\x5b\x21\xf5\x17\xb8\x15\xb8\x15\xb8\x15\xb8\x15\x8a\x92\x20\x37\xd1\xcd\x83\x99\xba\x3e\x37\xd1\x96\x2c\x4a\xb2\x4c\xe7\x84\x63\xd3\x34\xa5\xb9\x63\xd3\x71\x6a\x90\x52\x20\x69\x63\x51\x6b\xa9\xa4\x83\x10\x35\x55\x97\x64\x5d\x45\xa8\xeb\xc0\x97\x1e\x2f\xe9\xb8\xad\x33\x5e\xd2\xaf\x18\xc9\x3f\xde\x51\xcb\xc8\xde\x6a\x16\x20\x71\xe2\xb0\xfb\xc5\xef\xed\x07\x62\x82\x5f\x65\xe8\x2c\xcd\xd6\xe4\x76\x68\x54\x2a\xbc\xc1\x8b\x40\x5e\x07\xe4\xab\x69\x31\x5f\xcd\x1b\xa1\xf5\x15\xac\x6f\x30\x0b\x45\x3a\xb6\x14\x4f\xc7\x66\xe6\xad\x69\xbd\xb5\x87\x45\xdd\x91\x59\x9a\xb6\xd5\x1d\x69\xbd\xb9\x8d\x96\x1e\x69\xb3\x1c\x4b\xbc\x3e\x5c\x2b\xa7\x62\xae\x35\x46\x9c\x32\x6b\x48\x9c\x63\x97\x59\x56\x65\x91\x76\x4a\x2f\x54\x14\x01\xce\x05\xce\x05\xce\x05\xce\x45\x45\x11\x54\x14\x41\x45\x11\x54\x14\x81\x59\x01\x66\x05\x98\x15\x60\x56\x80\x59\x21\x10\xb3\x02\x2a\x8a\xa0\xa2\x08\x2a\x8a\xa0\xa2\x08\xac\x76\xb0\xda\x05\x5e\x51\x24\xd0\xc2\x21\xbe\x68\x79\x3d\x15\x45\xda\x8c\x99\x83\x4f\x76\xfb\x47\x61\x7a\x9b\xee\xb5\x5e\x55\x2a\x52\x5e\xb6\xb9\xac\xb3\xff\x14\x66\xff\x21\x4c\xa4\x1f\xb9\xb2\x96\x8a\xdc\x9d\x97\xab\x4e\x35\x58\x18\x42\x13\x6f\xcb\xcb\xd5\x45\x71\xde\xa5\xd4\xe4\xc2\x9c\x81\xfe\x02\x04\xd7\x75\x0d\x4d\xd4\x35\x34\xd1\x4c\x43\x99\xb2\x77\xd2\x88\xc7\xc4\xcc\x3a\x4f\xf3\x7c\x66\xcd\xd2\x34\xa5\x5b\x98\x59\xb6\x01\x98\x2f\xa8\x46\xe6\x08\x6d\x30\xb7\xf1\xcc\xc2\xec\x4b\x61\xf6\xaf\xc2\xd4\x9f\x55\x2a\x72\x24\xe2\x1c\xd3\xc9\x85\x39\x53\x2c\x27\x58\x5e\xae\x4e\x29\x15\x79\x72\x61\x4e\xff\x5e\xbb\x71\x40\x8b\xf4\x88\x18\xb7\x0c\x9d\xe5\xe3\xc6\x8b\x78\xb4\x36\x6e\xc6\x63\xfa\x7d\x96\xec\x43\x09\x7a\x5c\xcf\xdd\x92\x5b\x29\x70\xbf\xf7\x8a\x9c\x2f\xf0\x64\xfd\x56\x71\x9e\x51\xbd\x02\x8f\x9e\xcc\x85\x13\x35\x49\x53\x4a\xae\xcb\x4b\x57\x15\xe5\x59\x07\xe9\x36\xaa\xd7\xb0\x7f\x31\xc4\x7e\x7b\x1b\xdd\xeb\xda\xb0\x59\x44\xfe\x65\x3d\xc9\x8b\x3d\xb3\x4b\xc9\xd0\xb0\x8d\x90\x8d\x4b\xe6\x0d\x1f\x17\x37\x9c\xb2\xdf\x30\x90\x44\x2f\xc3\xd6\x26\x9b\x83\x04\x7d\x4b\xa6\xed\xd3\x2d\x7a\x10\x77\x70\x31\x5b\xdb\xc9\xc4\x29\x91\x26\xc6\xed\x59\xf5\x6a\xf7\x8d\x1f\xa2\xcb\x23\x4d\x36\x25\xaf\xb4\x77\x8a\xf6\xeb\x22\x45\xfb\x5f\xf7\x5f\x28\x9e\x66\x4f\x19\x59\x61\x1a\x4c\x70\x7d\xcd\x68\xfc\x8a\x5c\x0a\x52\x21\xfe\x06\xf1\x37\xc8\x1b\x03\x83\x2d\x0c\xb6\x30\xd8\xf6\x8e\xc1\x16\x79\x63\x90\x37\x06\x86\x32\x18\xca\x60\x28\x83\xa1\xac\x2b\x0c\x65\x99\x73\x34\xc7\xce\xc4\x66\xcc\x02\x59\x09\x7b\x69\xad\xc6\xbb\xba\xfa\x6a\x5b\x48\x42\x83\x24\x34\x5b\xc4\xce\x80\x24\x34\xed\x48\x42\xf3\xc5\x41\x3a\x61\xd4\xec\x2e\xc8\x3f\x56\x95\x4b\xfc\x6d\xd9\xa0\xbe\xe0\xa0\xd9\x55\xb5\xaa\xac\x18\x2d\xda\x48\x18\xfb\x51\x9c\xfd\x69\x3f\xed\x72\x5c\x7e\x65\x2d\x15\x79\x5f\x93\x29\xad\xa7\x78\xcb\xc6\x46\x72\xda\x6c\x39\xa0\x9c\xd6\xfb\x05\xac\xb4\xf7\xee\x52\xca\xeb\x9e\xf3\x05\xb5\x0a\x3a\x59\x4f\x27\x9b\x49\x2c\x7d\xad\xe8\x4f\x28\xe7\xd8\x19\xb3\x88\x64\xfd\x6c\xd3\xc9\xa4\xd7\xcb\x71\x1a\xb6\x80\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x3b\x8b\x23\x41\x10\x41\x10\x41\x10\x7b\x98\x20\xfe\xf9\x80\xe1\x10\x2c\x95\xcb\xea\xe8\x5a\x6a\x34\x27\xc9\x2b\x9a\x76\x55\x55\xd9\x37\x06\xd8\x7f\xe8\xa3\x5b\xb5\x23\x57\xd6\x52\x91\x78\xe3\x74\xd5\xd3\xfc\xc2\x45\xb9\x9a\xd8\xab\x9d\x38\x59\x2e\xab\x97\x52\xe6\x8f\x5b\xad\xd4\xdc\xd3\x34\x29\x40\xdd\x04\x1d\xe1\xa0\x6e\x8c\xf6\x53\xd2\x33\x99\x89\x36\x46\x3c\x43\x86\xf1\xbc\x4d\xa5\x5b\x7a\xd8\x1f\xba\x25\xd8\xa0\x9d\x9c\x99\x00\xae\xac\xea\xc0\xcd\xbc\xa3\x6f\x76\x25\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\x37\x50\xb7\x4e\x51\xb7\x7f\x3d\x44\x87\x79\x64\xb8\xe9\xa1\x57\x32\xc1\x98\x08\x4a\xe6\x7f\x3f\x37\x2a\xf6\x78\x2b\x52\xd9\x8c\x55\x7e\x7e\x88\xfd\x76\x3f\xdd\x9a\x55\x2a\x3c\x42\xff\x17\x9b\x89\x4a\x16\x6e\xc4\x0f\x4b\xe5\xae\x08\x40\xbe\x8f\xdf\x6e\x4a\xa9\xc8\x97\x52\x26\x0f\xcc\x99\x7d\xec\x76\x30\xd8\x95\xf1\xc5\xe7\xfc\x41\xe2\x20\x1b\xd0\xe1\x61\x2c\x66\xf8\xea\x19\x63\x0e\xe7\x3c\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\x42\x60\xc2\xcd\xc4\x84\x87\xe9\x20\x1b\x8b\xed\x37\x63\x85\xef\xb2\xc7\x0a\x9b\x7b\xb7\xfa\xb0\xe0\x77\xd0\x33\xec\xe9\xd8\x53\xe6\x75\x13\x7a\x8f\x45\xbd\x24\x4d\x31\x5a\xad\x5e\x8d\xaa\x59\xa5\x2c\x0f\x47\xd5\xd5\xec\x55\xed\xad\x71\xcd\x57\x96\x56\x04\x0e\x29\x57\x14\x3e\x42\xb1\x1d\x26\x8c\x40\xe0\x31\x00\x26\x00\x26\x00\x26\x07\x98\xbf\x3f\x44\x13\xc2\x6d\x70\x49\x24\x5a\xd4\xd3\x2e\x7a\x61\xcc\x8a\x52\xba\xa6\x2c\x99\x10\xf3\x9f\x0c\xb1\x3f\x0f\xd3\x9b\xf8\xb5\x66\x82\xc5\x48\x45\x96\x72\x35\x3b\xe4\xa9\x8a\x52\xca\x28\x4b\x89\x07\xb4\x63\x69\xed\x74\x3d\x47\xa1\x0d\x1c\x8a\x53\x82\xad\x98\xb5\x5e\xf7\x3f\xfe\x24\x49\xfd\x49\x92\x7a\x97\x7c\xb1\xde\xbd\xee\x58\xef\x16\xd6\x9f\x97\xab\x74\xed\x11\x7f\xa8\x97\x64\xc3\x3a\xd4\xe3\x3d\x30\xb8\x9e\x7e\xff\xba\x34\x80\x91\x7f\xbb\xbd\x76\xd4\xef\xad\xc8\xe5\xa2\x94\x95\x3d\x06\xfe\x41\xfd\x70\x07\xc7\x3e\x3d\x4d\x69\x3a\x5d\x53\x6b\x71\xdd\x83\x8f\x5a\x3d\xa8\xb2\xd8\x62\x95\xc5\x4f\x86\xbc\x33\x06\x07\x20\x15\x66\x45\xe1\xc5\x53\x74\xc2\x2a\xbc\xd8\x42\x3b\xfe\x42\xa4\xbc\xda\x16\x21\x92\xf8\xc9\x5d\xb5\x42\x64\x97\x9e\x38\x5f\x32\xe5\xc6\x5e\xf1\x4b\x27\xc5\x46\x7b\x8a\x1c\x42\x8c\xf8\x88\x11\x14\xda\xea\x48\xa1\x2d\x54\x58\x41\x85\x15\x54\x58\x69\x57\x85\x95\xcc\x4b\xa1\x80\xcb\x4c\x5c\x14\x05\x91\xcf\xd1\x9c\xad\x20\x72\x9b\x4b\x57\x44\xdd\x55\x81\x1d\xec\x56\x31\x4c\xcd\x6a\x03\x3e\x0a\x80\x43\x59\x48\xff\xd9\x6d\xb5\xda\xc0\x40\x59\xaa\x54\x0b\xdc\x34\x29\x76\x9d\x1e\x7b\x8b\x58\x99\x9b\x9f\x3b\xa3\x22\xdc\x53\xdb\xd0\x08\xbf\xfb\x3e\x5e\x08\x61\x8f\xfd\xe0\x8a\x5c\xc9\xcb\xf6\xa3\x03\xf6\xa3\x3c\x1f\xbb\x9c\x2f\x64\x47\xea\xce\x73\xb4\xa2\xfd\x7d\x43\x3f\xaa\xf5\x32\x7d\x9e\xe6\x29\x53\xb3\xab\x69\x50\xca\xbf\xc1\x6c\x58\xe0\xc3\x06\xc5\xc4\x47\x31\xf9\x6c\x1f\xbd\xd8\xc7\x5e\xe8\x8b\x7c\xca\x94\xee\xcf\xf7\xf5\xce\xfe\xa6\xc6\xd0\xa1\x8d\x33\x37\xdc\x73\x63\x9c\x36\x39\x2d\xf7\x9d\x41\x8f\x89\x3b\xc4\x17\x29\xe1\xe7\x21\x15\xf9\x95\x9a\x36\x26\xae\xe6\x67\x70\xcd\x48\x8d\x0e\x66\x54\xa5\xb4\x20\xfc\x58\x1e\xd6\x3e\x0b\xfd\xef\x45\xe3\x63\xb1\x7e\x1c\xf2\xde\x78\xa5\x5f\x0b\xd1\xab\x21\xf6\x4a\x28\xf2\xb2\x49\xc2\x3e\x1d\x9a\x55\x2a\x59\xae\xb4\xe5\x15\x3e\xec\x4a\x34\xb6\xac\xfd\x14\x8b\x4e\x3a\x9e\x82\x33\x4e\xa1\x5f\xad\xaa\x96\xc5\x7e\x44\xca\xf2\x07\xe7\x7e\x10\xc5\x42\x56\x5f\x3f\xe5\x62\x4e\x8d\x2a\xd7\xf5\x31\x15\x7e\x02\x65\x59\x29\x17\xe5\x64\x54\xdc\x91\x3b\x1e\x19\xef\x92\xb3\x46\xd7\x01\x30\x6f\x1f\xdb\xc6\xbb\xe5\x70\xa2\xe9\x08\x45\x0a\x7e\x87\xd7\xc0\xdf\x8c\x3f\x34\x65\x0e\xd2\x18\xdb\x1f\x4b\x9a\x26\x86\x3b\x1d\xa6\x09\xd1\xee\xcd\x60\x98\x60\x3f\x73\x99\x06\x05\xe8\x2c\x29\x39\xb9\xb6\xca\x4c\x65\xb5\x54\x2d\xac\xc8\xd9\xa2\xa4\xaa\xb2\xca\xfe\xe7\xd3\xec\xe7\x06\x68\xa7\x76\xa6\xb9\x18\x26\x1a\x07\x4d\x5f\x14\x2d\xf0\xda\x4f\x89\x7b\xb4\x73\xcf\x2b\x39\x59\x5f\x0e\xed\x07\xbb\xdc\x2d\x32\x0d\xa7\x41\x38\x0d\xa6\xe1\x34\x08\xa7\x41\x38\x0d\xc2\x69\xb0\x67\x9c\x06\x03\xaf\x7f\xdf\xb2\xd3\x20\x2a\xf1\xc3\x69\x10\x4e\x83\x70\x1a\x84\xd3\x60\x4f\x3b\x0d\xa2\x54\x38\x3c\xe9\x7a\xb5\x54\x78\x7a\x0b\x7a\xd2\x65\x72\x34\x27\x10\x61\x9a\x4e\x73\x44\x38\x41\x47\xe8\xb0\x27\x22\xe4\x14\xca\x20\x84\x76\x3e\xd4\x54\xbe\x39\x9f\x04\x71\xd7\x9e\xf6\x47\x89\x47\xd9\xb8\x8e\x12\x6d\x40\x4c\x07\x8a\xf6\xfe\xd4\x53\xc5\xd8\x87\x77\xd4\xb0\xb1\xbb\xc4\x6a\x14\x95\x9c\x18\xec\x5e\xf1\x73\xbb\x41\x98\xe0\x56\x67\x69\x96\xa6\x6b\xcc\x32\x07\x69\x6c\xfd\x2f\x00\x06\x19\x38\x9c\xb5\xe8\x70\xf6\x97\x21\x3a\x27\xcc\xc5\xd3\x94\xb6\x99\x8b\x0f\x53\x4b\x33\xd1\xdb\x7b\x6d\x46\x88\x9a\x93\x74\x9c\x8b\x9a\x56\xdb\xcf\x08\x0f\xb6\x29\x9a\xb4\x3c\xd8\x5a\x6c\xcb\x5f\x32\x95\x95\xe6\x25\x53\x33\x62\xc8\x45\x7a\x25\xbe\x3d\x5c\x23\x99\x1e\xd0\xfd\x14\x6c\x4e\x1f\xca\xb2\x53\x4a\xc5\xc5\x29\x36\x29\x35\x65\x9e\xdc\x46\x79\xd5\x1e\x2f\x37\x80\x5b\x80\x5b\x80\x5b\x80\xdb\xde\x01\xb7\xd0\xd6\x7c\xb4\xb5\xee\x21\xdb\xf0\x30\xee\x88\x87\x31\x0c\x08\x30\x20\xc0\x80\x00\x03\x02\x0c\x08\x3d\x6d\x40\x40\xa0\x09\x02\x4d\x10\x68\xd2\xae\x40\x13\xd8\xe7\x60\x9f\xeb\x55\xfb\x5c\x26\x1f\x70\x8c\x95\x9f\xb9\x2b\xe1\x0e\x95\xef\x64\x77\x88\xaf\xd9\x92\xb4\x6d\x36\x7d\x05\xef\x97\xfe\xfa\x10\x8d\x09\xbf\x74\xb5\xaa\x54\xa4\x7c\x9d\x6b\xba\xfe\xb3\xee\x9a\x6e\x24\xde\xf8\x85\x21\xf6\xb7\xfb\xe8\x76\xfd\xa0\x89\xbb\xef\x77\x49\xbd\xb1\x28\xce\x11\xb0\xfb\x3e\xed\x04\xfd\x17\x9d\x76\xdb\x8f\x07\x9c\x7c\x23\x4b\x67\xc5\x3c\x99\xa4\x53\x7c\x9e\x1c\xa5\x71\x3a\xe4\x69\x5c\x30\x46\xc0\xb0\x2f\xd8\x7b\xb6\xd1\x1c\x1c\x57\xfc\xa7\xc5\x71\x36\xa1\x4f\x0b\xe7\xab\xd0\x67\x86\xa3\x37\xf5\x19\x39\xfe\x70\x7b\xfd\xeb\x88\xb9\xe7\xe4\x70\xbc\x91\x07\xf4\x73\x3a\xf5\x52\xd2\xe7\x68\x8e\xce\xd4\x18\x4a\x5b\x7d\x2b\xa0\x6f\xb0\x95\xb6\x68\x2b\xfd\x7c\x28\x40\xe1\xf0\xb0\x30\x64\xce\xd2\xb4\x65\xc8\xdc\x14\x59\xc3\x53\x75\xb4\x5b\xd6\x24\x7e\x66\x57\xbd\xac\xb9\xcb\x4c\xdd\xe1\x10\x2f\xba\xbe\xdb\x31\xe9\x82\xe4\x1d\x48\xde\x71\xf3\xa2\x75\x30\x15\x30\x15\x30\x95\xb6\x25\xef\xf8\x42\x90\x3a\xc1\x79\xe1\x89\x75\x86\x66\x6c\x9e\x58\x6d\x54\x0a\xda\xbd\xea\xfb\x67\x05\x49\xff\xe4\xce\x7a\xbd\x60\x9f\x4f\x12\x0f\x87\xb6\x70\x3f\x0f\x0b\xef\x84\xb2\x80\x34\x1e\xbd\xa6\xa2\x20\x8d\x07\xd2\x78\x6c\x72\x1a\x8f\x4e\xf2\x28\xbf\xd4\x1b\x6d\x5f\x2f\x32\x47\x69\x9c\x1d\x8a\x1d\x30\xb3\x74\xbc\xcd\x9e\xdb\xc3\x7e\x6d\x7d\x82\x8f\xe0\x31\xe7\x1e\x9a\x11\x98\x53\x2a\x17\xe4\x1f\xab\xca\x25\xce\xca\x2d\xd8\x39\x9a\x5d\x55\xab\xca\x8a\xa1\x22\xd9\xdf\x88\x40\x9e\xa3\x2a\x67\xc5\xec\x1f\xec\x61\xdf\xed\xa3\x5d\x8e\x66\xae\xac\xa5\x22\x87\x38\xfa\x14\x27\x19\x0f\x69\x4b\x55\xc5\x5b\x37\xbc\x21\xa7\xcd\xd6\x13\x29\xed\xb2\x49\x7b\x63\x97\x52\x5e\x27\x0b\x5a\x1d\x30\x23\xfd\x60\x88\x2a\x62\x52\x3e\x4b\x85\xff\x8f\xbd\x77\x8f\x73\x23\x2b\xef\xbc\x3f\xad\xee\x19\xdb\x0f\x86\xf1\x9c\x19\x18\x46\x73\xd3\xc8\x33\x7d\x91\xbb\xd5\x56\xfb\xde\x1e\x5f\xa4\xbe\xd8\x2d\xf7\xd8\x3d\xdd\x9e\x1e\x18\xc6\x98\x6a\xa9\x5a\x96\x2d\xab\x44\x95\xba\x8d\x79\x5f\xf6\x93\x85\x9d\x0d\xd9\x7d\x21\x2c\xd9\x4d\xb2\x9b\x2c\x10\x48\xb8\x85\x40\x20\x24\xd9\xec\x64\x21\xfb\x66\x81\xd9\x4c\x32\x21\xb7\x97\x6c\x20\x04\x12\xb2\x04\x48\xb2\xc9\x9b\xcd\x42\x60\xdf\xf0\x7e\xce\x39\x75\x93\x54\xa5\x52\xab\x25\xb5\xda\xfa\xfd\x03\x9e\x56\xd5\xa9\xaa\x73\x4e\x3d\x75\xce\xf7\xf9\x3d\xcf\x23\x26\x65\x86\x14\xba\xec\x37\x29\x9d\xfb\x1c\xb3\xf3\x3c\x38\x9f\xa4\xca\xce\x5d\x4f\xc4\xfd\x1e\x65\xb3\x38\xb5\x10\x3c\x79\xe7\xd8\x19\x73\xf2\x7a\x0d\xb9\x95\xba\xc6\xef\xfe\xdc\x85\xcc\xc2\xef\x22\x8f\x01\x3f\x6a\xc1\xd5\x0d\x8f\xf9\x41\xf3\xcc\x2d\x1c\xf6\xd4\x1a\x19\xf4\xfa\xaa\xe5\x47\xfb\x87\x1d\xab\x14\xf0\xda\x26\x79\xed\x3f\x0f\xd1\x0d\x49\x59\x4b\x54\x74\x28\xeb\x96\x1a\xab\xad\xb0\x9c\x96\x81\xec\xa8\x05\x0c\x20\xce\xa9\xbf\xda\xed\x61\x20\x93\x35\x3b\xbf\x0d\x5b\xca\x09\xb1\x56\xd9\x22\x3b\x89\x2d\x62\xaf\x19\x5f\x6c\x11\xb1\x45\xdc\xe2\x2d\x62\x97\x2e\xc7\x03\x77\x93\x8d\x7d\x8e\x36\xf0\xc9\xa9\xf7\xe5\x4a\xcf\xd0\x14\x4b\x46\x4f\xd9\x5b\xcb\x47\x2a\xd2\x46\xfa\x34\xdf\x81\x6d\xe6\x9f\x10\xed\x37\xb7\x99\x6b\xbc\x85\xb2\xf9\x8a\x54\x8b\x6a\x44\x14\x99\xae\xae\xe7\xd5\x1b\x06\xfb\x30\x45\x7f\xf2\x36\x7a\x45\xe5\x19\x36\x3f\xbd\xdb\x8e\x6d\xbf\xc8\x4f\x5a\x14\x27\xc5\x06\xe5\x5f\x93\x15\xe7\x98\xc0\xd4\x75\x5c\x8b\x37\x0d\x4f\x10\xef\xb1\xca\x0f\xd2\x09\x3a\xee\x0b\x30\xaa\x3a\xc1\xe2\x18\xae\x1b\x4c\xff\xeb\x90\x04\xe5\xfb\x05\x28\xe7\xf3\xfd\x14\x6d\xae\x49\x5a\x92\xcb\xc4\x79\x4a\x3b\xcb\xc4\x4d\x37\x7a\x51\xd2\xfc\xc7\xe9\x9c\x8b\xe6\x6f\xba\xd5\xe6\xf3\x2c\xc8\x68\x66\x35\xf8\xad\x4b\xb1\xd3\xd6\xab\xe4\x35\x25\xcd\x55\xa0\xfb\xa6\x6a\x49\x0e\x16\x0e\xf5\x17\x0e\x69\xec\xda\x7c\x76\x6d\x2d\xb7\xb0\x5f\xbd\x44\xc7\xa4\x85\x95\x09\x5f\xab\x2d\xab\x4f\xe1\x30\x79\x30\x7b\xdf\x25\xf6\xc3\x83\xf4\x32\xf9\x5f\xb6\x89\xdd\x5b\x3f\xb5\xae\x28\xad\x1f\x13\xce\x68\xf1\x4f\xa3\x26\xc9\xbc\xf8\x33\x12\xeb\x22\xb1\x2e\x12\xeb\x22\x3f\x03\xf2\x33\x20\x3f\x03\xf2\x33\x74\x4d\x7e\x86\xee\x49\x3f\x80\xb8\x78\xc4\xc5\x23\x2e\x1e\x71\xf1\x88\x8b\xef\xe9\xb8\x78\x04\xee\x22\x70\xb7\x47\x03\x77\xb7\x65\x62\xdd\xcb\x34\x2d\x01\xf5\x09\x3a\x2e\x00\xf5\x21\x3a\x40\x09\x5f\xea\x6b\x62\x29\x8b\xf6\x0a\x34\xd4\x92\x9c\xba\x4f\x05\xb3\xde\x83\x6c\x42\xe2\x5c\x71\x55\xdf\x94\x95\x15\xe4\x8c\xa2\xdf\xdf\x59\x43\xc4\xee\xb0\x9c\x0e\x45\x93\x7e\x45\xe5\x1f\x3a\xc2\xbf\x24\xae\x9a\xa2\x24\x9d\xaa\xf2\x35\x8c\xd3\xd8\x86\xfa\x1d\x1e\x6f\xc8\x8d\x9a\x04\xd7\xdf\xec\xa3\xd3\xf2\xb5\x3f\x46\x47\xc4\x6b\x9f\xa0\x8d\x4e\x3f\x99\x26\x37\x21\xd2\xe4\xda\x9e\xa8\x26\x9a\x99\x95\xbe\xa7\x53\x74\xc2\xe5\x7b\x6a\xa2\x9d\x20\x0b\xd4\x98\x85\xf1\x34\x22\x75\xcd\x4e\x90\x1b\x2b\xf6\xdf\x46\x6b\x2c\x50\xd8\x33\x71\xae\x34\x46\xa3\xf2\xb7\x0a\x63\xe4\xe4\xcc\x6d\xaf\x59\x42\xda\x5c\x60\x59\x60\x59\x60\x59\x60\x59\xa4\xcd\x45\xda\x5c\xc4\xf6\x23\x6d\x2e\xdc\x03\x70\x0f\xc0\x3d\x00\xf7\x00\xdc\x03\x2d\x71\x0f\x20\xc5\x0b\x52\xbc\x20\xc5\x0b\xd2\xe6\xc2\xfb\x06\xef\x5b\xcb\xd3\xe6\xfa\x06\xb2\xb6\x34\x9f\x6e\xdb\x79\xf2\x06\xf2\xf1\xa6\x5f\x47\xaf\x65\xcf\x44\x9f\xb6\x43\x85\x26\xcd\x2f\xb9\x74\x69\x14\xb3\x22\x2c\x22\x62\x64\xb4\x92\x3a\x1a\x31\xd6\x32\x57\xf8\x6a\x46\x0c\x97\xaa\x5c\x97\x86\xb5\xa4\x6b\xe2\xab\x18\xdd\x65\x2b\xca\xdb\x1a\x45\xf4\xa5\x10\xdd\x69\x6a\xdc\xed\xd0\xa7\x71\xf6\xd9\x10\xfb\xf5\x10\x91\xf3\xa7\x70\x38\x27\x3e\x0a\xfc\xd3\x64\xcf\x19\x25\x22\xfa\x33\xf6\xf2\x9c\x5a\x9e\xb1\x0f\x4d\x2e\xcc\x9d\xe1\x7f\x6e\x1d\x0c\xaf\x69\x68\xb2\xa6\xa1\xc9\x46\x1a\x4a\xe7\x37\x14\xff\x53\x67\xee\x59\xcf\x18\xe4\xe6\x60\xef\x8c\xd1\xac\xec\x5e\x7d\x45\xc9\xc4\xad\x03\xaa\x02\xb5\xfc\x22\x09\x74\xad\xe0\xa4\x41\xfe\xdc\x08\xfb\xc7\x10\xdd\xcd\xdb\x49\xba\x9b\xb9\xbc\x9e\x08\xdf\xe3\x91\x0b\x79\x51\x2b\xa8\xb1\x47\xf9\x0f\x8b\xd5\xa7\x2c\xbb\xfc\xa9\xfc\xb0\x16\xa7\xf9\x58\xf2\x7f\xf7\x8f\xca\xfe\x4f\xd0\xb8\xe8\xff\x11\x1a\xa2\x47\x7d\x1d\x4b\xa2\xcb\xd6\x13\x71\x7e\x8b\x0d\xe6\xea\xb8\x14\x6c\x06\x26\xd9\x51\xd3\x0c\xf8\x0e\x89\x95\x1f\x5b\x2b\xa8\x95\xc9\x39\x9e\xdb\xe9\x33\x00\x61\xef\xec\xc7\x62\x0c\x86\xcd\xdf\x3a\x3c\x0c\xa9\xe3\x74\x8c\x8e\x54\x79\xb5\x1b\xed\x6e\x30\x53\x78\xb3\x9b\xf4\x66\xbf\xb3\xaf\xf9\xb7\x9c\x4e\x48\x2f\xf6\x61\x3a\xe8\x78\xb1\x37\x70\xfa\x26\x93\x19\x37\x66\x3d\x3c\x22\x87\x1b\xb2\x24\xb1\x77\xef\xf1\xb1\x1e\x2f\xb5\xf3\x19\x0b\x83\x61\x56\x69\xed\xb4\xbd\x40\x3a\x63\xa4\x33\xbe\x75\x5d\x1e\x60\x5d\x60\x5d\x60\x5d\x6d\x4b\x67\xfc\x5c\x5f\x8b\xeb\xe4\x2c\x4a\x21\xda\x39\x9a\x73\x09\xd1\xda\x5c\x7b\x27\x30\xeb\x70\x9b\x57\x08\xa9\xff\xef\x25\x3e\x2b\x84\xbd\x01\x99\x8d\xc5\xba\x61\x50\xe4\x47\xe9\xe0\xb2\x01\x59\xab\x7a\x6d\xb1\x82\xac\x55\xc8\x5a\xb5\xc5\x59\xab\x96\x36\xb1\xbd\x0c\xfa\x00\xb4\x17\x1f\x05\x66\xb6\x4a\x27\x68\x9c\x8d\x45\xf7\xd9\x00\x79\x8f\x3b\xd7\x14\x6f\xaf\x36\xaf\xd4\x36\x64\xce\x7f\x35\x4c\x07\x7c\xea\xc0\x49\x7f\x85\x4f\x21\xb8\x5f\x1c\x66\x7f\x3d\x40\xe4\x64\xfd\x0f\xff\x42\x9f\xe9\xdf\x70\x82\x79\xb8\x69\x90\x3d\x60\xe5\x54\x71\xa7\x7f\x8e\xbb\x56\xec\x93\xf6\x5a\x7f\x48\xb4\x32\xe4\xe8\x86\x2b\x84\xa0\x5a\x49\xb5\x37\x62\x46\x59\x55\xb2\xa3\x8e\x60\x46\x6c\x5e\x4c\x79\x45\xbe\xac\x5e\x77\x2c\xdd\x50\x85\xc6\xcd\xd5\x76\x3c\x16\xbe\x51\x51\x79\xa0\x2d\x45\x07\xda\x93\xd8\x25\x7d\x8d\x16\xe4\xcb\x37\x47\x67\xc4\xcb\x97\xa4\x53\x74\xa2\x89\xef\xad\x08\xc4\x6a\x2c\x54\xc0\xff\xad\xb9\x21\xf3\xc1\x3d\x1d\xfc\xd6\x1e\x61\x87\x9a\xc9\x2e\x4e\x69\x64\xb2\x41\x26\x9b\x34\x42\x26\x10\x32\x81\x90\x09\x84\x4c\xf4\x4c\xc8\x44\xba\x6b\x22\x02\x5a\x7e\x27\x4d\x4b\xd5\xd3\x90\xaa\x43\xaa\x0e\xa9\x3a\xa4\xea\x90\xaa\x77\x5e\xaa\xde\x4d\x05\x9e\xd2\x3d\xad\xeb\x4d\x43\xd7\xdb\x3e\x5d\x6f\xba\xeb\x75\xbd\xdb\x30\xab\x0e\xfb\xc2\x08\x1d\xe7\x43\xe7\xf0\x45\x1f\xbd\x25\x7f\xed\xf2\x19\x55\xc9\x64\xf8\x72\xc5\xe6\x8e\x3f\x36\xc2\xfe\x72\x80\x76\x64\x34\x5d\x40\xc7\x5f\x6c\x08\x3a\xca\xa6\x92\xb2\xa9\xae\xc0\x8e\x7b\xc5\xe5\xa6\x34\x5d\x75\x7b\x04\x2b\x6f\x14\xfc\xb1\x96\x3f\x2e\x04\xe3\xc5\x31\xb6\xcf\xc4\x8b\xd1\xa8\x85\x14\x2b\xfa\xb5\x51\x3f\x80\x24\x9a\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\x1d\xa6\x8e\xc7\xe9\x18\x3b\x12\x3d\x64\x53\xc7\x70\x05\x75\xac\xd8\xe1\xdd\x0a\xca\x2c\x90\x4d\x90\x4d\x90\xcd\x6d\x44\x36\x3f\x30\x44\x0f\x5a\x64\x53\x57\x6d\xa0\xc6\x3f\x1a\xba\xc6\x4d\xb6\xc1\xfe\xd9\x10\xfb\x4e\xbf\x03\x2f\x0f\xd4\xaf\x3f\xb7\xe8\x34\x32\x65\x37\x12\x1b\xe7\x27\x49\x70\xe8\x79\xc0\xac\xa6\x27\x0b\x05\x9b\x29\x76\xbd\x8a\xf1\x0a\x3d\x2e\x29\xe2\x2c\x4d\x0b\x8a\x78\x92\x1e\xa3\x49\x5f\x09\x31\xef\x3b\x21\x21\xf6\x7a\xf6\x0e\xe6\x5b\xaf\x46\x8c\x9e\xf7\x03\xf9\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\x22\x40\xe2\x56\x82\x44\x90\x3a\x90\x3a\x90\xba\x1e\x26\x75\x7f\x37\x42\x33\x32\xe6\x59\x29\x95\x8c\x40\x25\xa2\x43\xf0\xf8\xd6\x41\x66\xe5\x34\xd5\x88\x1f\x1a\x61\xdf\x1d\xa0\x1d\xbc\x99\xcb\xeb\x89\xf0\xaf\x34\xa2\x46\x74\xf0\xd0\xa2\xd9\x5c\x57\x28\x12\xe5\xe5\x92\xa5\x92\xe1\x56\x24\xd6\xde\x6c\xb7\xf3\xc4\xae\x8c\x8a\x5e\x0e\x66\x8a\x07\x58\xc2\x64\x8a\x7c\x36\x99\x54\xb1\xb6\xfb\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\x81\x14\xb7\x12\x29\x9e\xa2\x13\xec\x78\xf4\x98\x2d\x2f\x7c\xd0\xad\x4d\xac\xdd\xc4\x41\x9f\x08\xea\x09\xea\x09\xea\xd9\x51\xea\xf9\xe7\x31\x3a\x23\xa9\x67\x51\x2d\xdf\xd0\xf4\x6b\x7c\x41\x69\x27\x7b\x14\x15\x96\xfc\x08\x68\xbe\x98\xd3\x55\x77\xf6\xc7\x7f\x1b\x63\x6f\xef\x27\xe6\x34\xe4\xd4\xef\xf7\xa8\x7e\x33\x27\x4f\x8f\x0d\xf2\xdf\xce\xdb\xe7\x98\x15\xfc\x1d\xd8\x68\x1e\xd7\xe2\x0a\x38\x0a\xcd\x4a\x20\x78\x8a\x4e\x08\x20\x78\x84\x0e\xd1\x01\x5f\x81\xa1\xab\x73\xcc\x67\x8a\x9b\xf7\xb5\x89\x8a\x16\x1b\xaf\x87\x53\x33\x46\x26\x11\xb4\xee\xa5\xa6\x38\x56\xf8\xeb\x3b\x3d\x07\xe4\x01\xef\x6a\x38\xd6\x98\x8c\x98\x3f\x77\x7a\x58\x52\x73\x74\x86\x66\xaa\xd2\x45\x37\x37\x2e\xc8\x14\x8d\xfa\x38\x4d\xd6\xc7\xf9\x68\x5f\xcb\x8c\xc3\x39\x59\x2d\x67\x9a\x52\x4e\xb5\x9c\x2d\xb0\x34\x1b\xa8\x9d\xd3\xac\xa5\x89\xbd\x77\x8f\xa7\xa5\xb9\xd3\xaa\x9c\x53\xb4\xad\xcb\xb0\xfc\x53\xc7\x8d\x0b\xca\xe7\xa0\x7c\x0e\xca\xe7\xa0\x7c\x0e\xca\xe7\xa0\x7c\x0e\xca\xe7\x6c\xa6\x7c\x4e\xb3\x8b\x84\xd4\xdb\x76\x7b\x2e\x12\x06\x03\x8a\xe7\x58\x2b\x87\x21\x51\x85\xa1\x93\x0b\x07\x14\xd0\xe9\xb5\xe5\x0a\x0a\xe8\xa0\x80\xce\x16\x17\xd0\xe9\x1c\x9c\x0a\xaa\x77\xd3\xe6\xef\x41\xfa\x20\x4d\xb0\xfd\xd1\xb8\xed\xe1\xb8\xcb\xed\x22\x31\x4f\xbb\x15\xfc\x22\xec\x67\x46\x28\x19\x5c\x66\x5c\xf2\x56\xa9\x3b\xcd\x14\xd6\x8c\x32\x37\x8b\xae\x0a\xe3\x7f\x32\xcc\xfe\xed\x6d\x74\xaf\x57\x01\x3a\xf9\x21\xfd\x44\x43\x5a\x53\xd9\xf2\xa2\xc6\x67\x6d\x17\x88\x4c\x87\x6f\xf8\x54\xc5\x13\xcf\xe4\xba\x5b\xa8\x4c\x9b\x50\x99\xe6\x83\xdf\xe0\x59\x36\xdd\x60\xc5\x2c\xd7\x60\x78\xbc\xcd\x10\x9e\x42\x78\x0a\xe1\x29\x84\xa7\x10\x9e\x42\x78\x0a\xe1\x29\x84\xa7\x10\x9e\x42\x78\x0a\xe1\x29\x84\xa7\x10\x9e\x76\x56\x78\x7a\x94\x0e\xb3\x83\xd1\x09\x9b\x8f\xdc\x53\x21\x3c\x75\xb6\x70\xa8\xc4\x03\x3d\x28\xf4\xa0\xd0\x83\xba\xf4\xa0\x9f\xbc\x9b\x0e\x5a\xf9\x2a\xeb\xd7\xe0\xb1\xa0\xe4\x78\x49\xd7\xde\x70\x93\x7d\xef\x2e\xf6\xee\x90\x93\xc5\x72\x38\xa3\x15\x8b\xdc\xda\x9d\x99\xb9\xe8\xe0\x9e\xb2\x16\x11\x47\xf3\x9b\x37\x93\xf3\xc6\x06\xcd\x23\x65\xf6\xca\x33\x6a\xb9\xa6\xf2\xcd\x02\x3f\x65\xa2\x3f\x36\x1e\x93\x98\xed\x88\x2f\x14\xa3\xfb\x25\x7f\x7b\x39\xdd\x25\xf8\xdb\x4b\xe9\x25\x9f\xe8\xdb\x49\xe6\xa4\xb1\x90\xd9\xc3\xde\xc8\x8c\xd8\x4e\xf3\x56\xe8\xea\x93\xc1\xd0\x6c\x82\xed\xf7\xa9\x28\x23\xee\xd7\x94\x07\x55\x44\x66\x87\x3d\x7b\x68\xe1\xc9\x0d\xf5\xd0\xc2\x5a\x23\x3d\x54\xb7\x23\x02\xa1\xe2\x96\xf5\x50\xf4\xa7\x5c\x3d\x34\x62\xf7\xd0\x85\xa5\x80\x2e\x1a\xaa\xec\x22\xcd\xb8\x85\xfb\x28\xf6\x33\xae\x3e\xda\x67\xf5\xd1\xf4\xcc\xfc\xcc\xc5\x99\xfa\xbd\x34\x52\xd1\x4b\x52\xc6\x76\xeb\xf6\xd3\xc4\x07\x5c\xfd\x34\x6a\xf5\xd3\x85\x85\x8b\x73\x17\xce\x2f\xd5\xef\xa8\x58\x45\x47\x99\x8d\xdf\xba\x3d\x35\xe9\xf9\xd6\x9d\x9d\x49\x4e\x6f\xe4\xad\x3b\xab\x2a\xd9\xb6\xdb\xee\xf6\x74\x40\x03\x5d\x9f\x7a\x9f\xab\x8f\x62\xb6\x65\x4a\x5e\x9c\x3a\x5b\xbf\x93\x86\x2b\x4d\x93\x10\xb0\xdc\xb2\x33\x29\x7d\x9a\x4e\xb2\xc7\xa2\x93\xf6\xd6\xe3\x21\x8f\x7c\xfc\xee\xb3\xb7\xc2\xb9\xfb\xf9\x10\xfd\x56\x88\xfd\x46\x28\xfc\x39\x7b\x55\xfe\x91\xd0\x82\x52\x96\xbb\xf7\x2b\x6a\xa4\xa4\xe8\x82\xbf\x3c\xb9\x38\x6f\x6e\x39\xcd\xad\x6e\xc4\x5c\xfb\x44\xd4\x62\xb6\xa4\xe5\x8b\x65\x83\xdf\xc2\xea\x6a\xfe\x0d\xaa\x21\x57\x60\x2e\xd7\x00\x5f\xc9\x1a\xaa\xbd\x14\xcd\xac\xe9\x3a\xdf\xed\xc9\x09\x62\x6d\x62\xca\x9a\xd5\xa6\x10\x10\x44\xd4\x37\x28\xd7\x4b\x05\x93\x4b\xdf\xb8\xa2\x15\x6c\x32\xc4\xef\x46\x2c\xf5\xcb\xe5\xd2\xe4\xf8\x78\x41\xcb\x28\x85\x2b\x9a\x51\xf6\x58\xad\xf1\x61\x1d\x33\x6e\x1a\x65\xf5\xba\xb3\x5a\x53\x0b\x8a\x51\xce\x67\x0c\x55\xd1\x33\x57\xc6\x0a\x5a\x2e\x97\x2f\xe6\xc6\x2f\xcb\xff\x3e\xf5\xfa\x13\x6b\x86\xaa\x4f\x5e\xcb\x5f\xcf\x5c\xb9\x19\x8f\x58\xbd\xe1\xfd\x73\x54\x8c\x8c\xdb\xbd\xfd\xeb\xf7\xd1\x49\x2b\x79\x52\x5e\x57\x73\x79\xa1\x77\xf2\xf0\x6d\x9b\x0e\x26\xf7\xfa\xd1\x10\xda\x35\xf6\x03\xf7\xb1\xff\xda\x4f\xf7\x54\x9d\x6f\x7b\xb6\x87\x44\x08\x91\x3c\xd6\x9a\x4f\x0e\xf3\x49\x2e\xcc\xd9\xb6\x9b\x1f\x98\xac\x6c\xc5\x74\x25\x3b\x47\x49\xbd\x5c\x8b\x63\x8a\xfe\x09\x65\xe4\x5b\xfb\x0c\x3d\x2d\xde\x5a\x21\x38\xf7\x74\xff\x8a\x11\x52\x72\x39\xbe\xd1\x28\x6b\xba\xe3\x01\xae\xee\x3e\x4b\xd0\xe1\xdc\x7a\xe0\xcb\xaf\x06\xbf\xd9\x29\x76\xda\x4e\x2b\xe4\x35\x5c\xb5\xbe\x5d\xf9\xfa\xbb\xee\x22\x20\xae\x29\xfc\xa5\x5d\xfe\x63\x19\xb3\xa2\x8f\x1a\x18\xce\x31\xf3\xd8\xad\x18\xd1\xd4\x2a\x65\x69\xa5\x4a\x7c\xd7\x86\x21\x85\x28\x0f\xb1\x4a\x4d\xc6\x2a\xfd\x45\x5f\x67\x8c\xce\x15\x19\xc8\xa4\xd0\x65\x27\x90\x69\x6b\xcc\x5b\x40\x94\x53\x67\xac\x5f\xea\xf9\xdd\xfe\xe6\xed\x40\x8d\x9a\xb9\x01\x3b\xb7\xaf\x24\x33\xed\x75\xd6\xca\x41\xde\xdc\x6b\x96\x14\xf2\x66\xc8\x9b\xb7\x58\xde\xdc\x5b\xeb\xe4\x20\x89\x75\xfa\x08\x1d\x62\x07\xa2\x09\x7b\xc3\xfb\x0a\xf7\x96\xd9\x69\xa9\xfd\xce\x3a\xf6\xc2\x08\x9d\xd8\x40\x0a\xdc\xac\x5a\x2a\x68\x37\xaf\xab\xae\x42\xfc\x3f\x34\xc2\xfe\xd4\x95\xfa\xf6\xe3\x8d\xc8\x91\xa7\xed\x66\xba\x42\x8d\xfc\x90\x67\xca\x5b\xe7\x26\x21\x42\x6e\x42\x84\x7c\x3e\xf8\x5d\xdb\xc7\x46\x6a\x53\xdd\x3a\xdd\x8e\x14\xb7\x50\x1a\x43\x69\x0c\xa5\x31\x94\xc6\x50\x1a\x43\x69\x0c\xa5\x31\x94\xc6\x50\x1a\x43\x69\x0c\xa5\x31\x94\xc6\x5b\xa9\x34\xae\xcb\x2e\x9c\xcd\xdb\xad\x10\xc2\x0d\x29\x33\xa4\xcc\x90\x32\x6f\x23\x29\xf3\x6f\x0e\xd1\xbd\x92\x66\xae\x08\x8a\x69\xe3\xcc\xab\xda\x8a\xc1\x3e\x3a\xc4\xde\x3b\x40\x3b\xc5\x4f\x97\xd7\x13\x61\xcd\xfc\xaa\x16\xb3\xf9\xf5\x7c\x76\x4d\x29\x54\x40\x4b\x7b\x05\x9b\xd6\x56\x5a\x42\x29\xe3\xb1\xbd\xe2\x84\x14\xff\x9f\xe5\x44\x5a\x5b\x99\xcf\x1b\xe5\xed\x56\xa6\x7f\x2b\x58\xe3\x5e\x6f\xd6\xb8\x9b\x91\xb8\x31\x59\xae\xff\x6c\x30\x6f\x7c\x94\xed\x35\x79\xa3\x98\x03\x26\x70\x4c\x6b\x2b\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x20\x8d\x5b\x49\x1a\x81\xf3\x80\xf3\x80\xf3\x7a\x18\xe7\xfd\xda\x08\x1d\xf7\xc4\x79\x7e\x05\xfa\x75\xad\x78\x55\x5b\xb1\xa5\x89\x3f\x30\xc2\xbe\xe4\x06\x7e\x1f\x6d\x28\x55\xaa\xae\x15\x5b\x85\xfc\x36\x2b\x4c\x7c\xc0\x0d\x0c\x5d\xc5\xf8\xe5\x2d\x02\x15\x36\x21\x4b\x9c\x0f\xc6\x84\x23\x6c\xc8\x03\x13\x9a\x9d\x0e\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\xb8\x95\xa8\xb0\x6e\x51\x19\x73\xe7\x06\x45\x22\x10\x26\x10\x26\x10\x66\x47\x11\xe6\x37\x46\x68\x56\x22\x4c\xf5\x0d\x65\xb5\x28\x86\xaa\xaa\xea\x53\xa3\xb5\xf6\xdf\x35\xc2\xbe\x3b\x40\xcc\x69\xc7\xce\x3e\xd2\x10\xd7\x34\x4b\x6b\x75\x05\xd7\x94\x97\x9b\xb1\x9f\xa4\xed\x45\x1d\x6f\x21\xc2\xb9\x1c\x0c\x30\x0f\xb0\x44\x4d\x96\x02\x93\x68\x3a\xb3\xa7\xaa\x50\x5b\x20\x39\x05\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\x04\xeb\xec\x26\xd6\x79\x0b\x15\xd0\x06\xeb\x04\xeb\x04\xeb\xdc\x46\xac\xf3\xcd\x23\x74\x34\xa0\x22\x80\x89\x3c\x6b\x4b\x02\xb0\xcf\x0c\xb3\x1f\xb8\x8d\x58\x6d\x82\xe5\xc6\x32\x4a\x3a\x49\x33\xbb\x02\x70\x46\x6e\x78\xa6\x76\x76\xee\x12\x64\xb3\x96\x6c\xbe\x2e\x98\x6c\x9e\x60\xc7\x1b\xce\xce\xba\xa1\xc4\xac\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\x60\x9c\xdd\x97\x64\xb2\x93\x05\x32\x00\x21\x01\x21\x01\x21\xb7\x11\x84\xfc\xda\x10\x3d\xe4\x55\xd0\x46\x57\x05\x06\xe3\x6f\x2a\xfb\xb5\x21\xf6\x49\x57\xc9\x9a\xf5\xc6\xf2\x40\x2e\xca\x16\x96\xd4\xd6\x14\xad\x89\xc7\x46\x5c\x65\x67\x9c\xc6\x91\x14\xb2\x31\x5a\xd8\x6c\x7d\x19\xa7\xa7\x2b\xeb\x41\x37\x92\x64\x12\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\x7c\x10\xa9\x21\x81\xf9\x80\xf9\x80\xf9\x3a\xa6\x35\x1c\xa3\x05\x13\xf3\xad\x95\x35\x23\xa3\x14\xf2\xc5\xdc\xf8\xfa\x84\x0c\xac\xf6\x09\xa9\x16\x04\x49\x2b\x96\x95\x42\x49\xcb\x5a\xe7\xa9\xba\xad\x41\xfc\xb9\x51\xf6\x42\x3f\xdd\xe5\x6a\xf1\xb2\xd9\x62\x38\xa6\xab\x4a\xb6\x6a\x8f\x7a\xd6\x6e\x6e\x41\xcb\x26\xed\xe6\x62\x47\xf8\xb1\x49\xa7\x91\xe5\x89\xaa\xe8\x66\x9f\x13\x5b\x46\xf9\x24\x94\xd3\xe9\x29\x09\xe5\x16\xe8\xbc\x80\x72\x67\x69\x96\xa6\xfd\xa0\x5c\xdc\xf5\xd4\x71\xf3\xa9\xe3\x3e\x37\x1a\xc8\xe6\x1e\xf0\x66\x69\xb7\xb3\x81\x9c\x5a\xa6\xab\xb9\x60\x74\x37\xcd\x52\x12\xd7\xf9\xdd\x82\xc3\xee\x26\x2a\x02\x9c\x5d\x8f\x41\xe1\xcf\xee\xf2\x1e\xcd\x31\x5d\x2d\x15\x94\x8c\xda\xe0\x80\x4e\x9a\x87\x6f\xf9\x98\xa6\x9e\xa6\x57\xd1\x32\x1b\x58\xd1\xb2\x37\xc3\xe2\x7f\x23\x7d\xb1\x16\x0d\x6a\xea\x5d\x21\xfa\x89\x10\xfb\xf1\x50\xf8\xdf\xd8\x1f\x81\xef\xf4\x3d\xc5\xbf\xa6\xe6\x67\x7c\x54\x20\xf2\x0c\xdf\xac\x4b\xab\x5d\xb1\x75\x74\xe3\xc4\x15\x35\x52\xe2\xe3\xc3\xd7\xeb\xf1\x48\xb2\x18\xc9\x17\x25\xb4\xd1\xf4\xc8\x5a\xd1\xe6\x3e\xd9\x48\x56\xbf\xb9\xb8\x56\x8c\x64\xf3\xba\xca\x4d\x95\x6a\xc3\x04\xbe\x26\x10\x8b\x2e\x93\xa6\x58\x7b\x27\x73\xff\x1a\x59\x5d\xd3\xc5\xfa\xbc\xa4\x6b\x19\xd5\x10\xab\x23\xd3\x32\x9a\x9f\xdd\x78\x64\x59\x5c\x51\xec\x7b\xc4\x72\x66\x32\x32\x16\x49\x16\x0a\x93\x62\xed\x93\xd5\x6f\x46\xf4\xb5\x22\xdf\x57\x73\xdb\x66\x2d\xf8\xcc\xe6\xd4\x6c\xf4\x76\x79\x6b\x2e\x43\x9e\xfa\xd1\x10\xfd\x48\x88\xbd\x23\x14\x7e\x9b\xdd\x41\xdf\xec\x13\xcb\xe5\xc7\x95\xa2\x92\x53\x75\xb9\xf1\x93\x11\x15\x86\xa1\x65\xf2\x62\x2d\x63\x6f\xb1\x14\xb1\x47\xd5\xf4\x08\x5f\xea\x96\x6f\xda\x8b\xbb\xeb\xca\x35\x7e\xff\xe5\x2b\xaa\xa1\x5a\xd6\x96\x7f\x01\x2c\xf8\x25\xf8\xcf\x8a\x1a\x11\x76\x5e\x6c\xa7\x34\x3d\x92\x98\x38\xca\x8f\xd5\x95\x8c\xa0\x74\x05\xad\x98\x93\xb6\x55\x6c\x79\xf8\xea\x54\xc9\x17\xe5\x92\x47\x6c\x29\x9c\x63\x05\xb9\x30\x19\x22\xdf\x08\x5b\xdf\xcb\x9c\x56\x50\x8a\xb9\xb8\xa6\xe7\xc6\x4b\xd7\x72\xe3\x6b\xc5\x7c\x46\xcb\xaa\xe3\x7b\xe7\x8c\x05\xde\x4a\x3c\xba\xdb\xfd\xac\xee\x2f\xdc\xe7\xfb\xda\x67\x6a\x9e\xe1\x0d\x27\xd8\x93\xb4\x44\x3b\xa6\xe4\xb2\xbe\x2b\x0c\x59\x69\xad\x61\x43\xe6\x61\x99\x36\x68\xdb\x62\xbf\xb5\xc7\xdb\x90\x99\x7b\x9a\x88\xe2\x6b\xbb\x8e\xc9\x23\xb6\xde\x74\x5d\xa4\x45\x5a\x70\x9b\xae\x58\x8a\x4e\x37\xe1\x22\x9a\x16\xcf\x73\x41\x10\x76\x03\x46\x2b\xc8\x68\x7d\x2d\x44\x5f\x0d\xb1\x2f\x87\xc2\x5f\xb4\x3b\xe8\xe3\xa1\x8b\xee\x15\x65\x9e\x6f\x6c\xc4\xaa\x30\xb2\xa2\xae\x4a\xef\x92\xbd\x95\x73\x5c\x18\xe6\xee\x59\xdc\xa2\xcb\x28\x15\xb5\xe2\x58\x51\xcd\x29\xa2\x23\xcc\x45\xa5\xdb\x78\x49\xa8\x63\x0f\x81\x39\x5f\xf3\xd7\xaf\xab\x59\x6e\x1e\x0b\x37\x1d\xb7\x8f\x83\xfa\xf3\x85\x51\x73\xad\x29\x56\xdb\x91\x9c\xce\x3f\xd6\x25\x55\xcf\x6b\x59\x7b\xcd\xec\x7c\xb7\x85\x47\xcd\xea\x8d\x35\x83\xdf\xa4\x7b\x9d\xae\xf0\x33\xad\x07\x32\x2f\xb2\x2a\xf1\x86\xd5\x44\x5c\xde\xe7\x75\x55\x29\x7a\xde\x63\x94\x89\x5b\x58\x10\x77\xe0\xb1\x86\x4e\xfd\x4e\x88\x5e\x0c\xb1\x17\x42\xe1\xe7\xed\x6e\x7e\x4f\x68\xda\xe5\x25\x2e\x15\x54\xc5\x50\x6d\x16\xb5\xa0\x6b\x25\x25\x27\x06\x60\x41\x2b\xe4\x33\x37\x2b\xdc\x51\xd6\xb3\x38\x6e\x66\x3e\x4a\x89\xf8\x91\x78\x64\x49\x0e\x88\xec\x9d\x12\xdf\x42\xf1\x6d\xa8\x85\x35\xd5\x88\xa6\x97\xae\x28\x45\xcb\x3d\xa6\xaf\xa9\xe3\xab\x4a\xc1\x72\x03\x44\xe5\xaf\xd1\xc8\x6a\xbe\xa8\x14\xf2\x6f\xb4\x78\xe2\x8a\xca\xd7\xe8\x62\xd3\x36\x2e\xd7\xe6\x59\x87\x31\xcb\xc6\x87\x0c\xe7\x24\x09\xde\xe3\x91\x99\xbc\x98\xce\xae\x1b\xd7\xf4\xda\x27\x73\x36\xc0\x65\xc9\xfd\xc5\xcb\xa6\x95\xaf\xc4\xa3\x7b\xe4\xfd\x4c\x5b\x0f\x52\xe1\x67\x4b\xbd\x75\x80\x9e\x1d\x60\x6f\x1e\x08\x7f\xdf\x76\xb6\x7e\xa1\xff\x29\x13\xcc\xf1\x57\x8a\xef\x40\x73\x8a\xbe\xa2\xe4\xd4\x48\x46\x2b\x14\x54\x61\x9d\x9d\xf7\x42\xd5\x57\x35\xfd\x3a\xef\x0b\xcf\x3b\xbd\x50\x75\x71\xff\x1b\x15\xf3\xd9\x9a\x8c\x25\xf9\x54\x79\x3e\x51\x32\xf9\xac\x43\xd8\x05\xac\x15\xfe\x0e\xbb\x77\xf9\x9e\xd4\x44\x99\x16\x8e\x8d\xbb\xba\xd1\x02\x79\xf6\xae\xd3\x76\xb1\x56\x5e\x2c\x1e\x49\x66\xf8\x06\x55\x7c\xc9\xdd\xc6\x61\x48\x3e\xc3\x50\x64\xcc\x1c\xf8\xca\x89\x61\x1c\x8f\x0c\xa5\x94\xcc\x35\xfe\x05\x2a\x66\xf9\x51\xc2\xb7\x29\x0e\xaa\xea\x38\x49\xcf\xcd\xa9\x5f\xd9\x88\xf5\x04\x2b\x76\x4b\xc7\x23\x43\xb3\x9a\xae\xba\x9a\x8d\x64\x14\x23\xa3\x64\xf9\xd3\x9b\xfd\x23\xbd\xd9\xa2\x3d\x43\x5a\xaf\x9a\x06\x57\xed\x36\xe2\xd1\x3b\x4b\xd5\xf3\xc6\xbd\xc2\x78\xae\x8f\x16\xf9\x42\x60\x82\x9d\xa3\x39\xda\x29\x7b\x43\xcd\xb2\x13\x74\x9c\x8e\x35\xf1\x11\x59\x2a\x2b\xe5\x35\xc3\xf7\xf3\x4f\xf3\x72\x39\x33\x43\x53\x62\x39\xb3\xb9\xcb\x58\x8b\x89\x88\xf7\x62\x62\x17\xdb\x21\xbb\xa9\x73\xeb\x89\xd4\x6f\xec\xf6\x5e\x4f\x1c\x2e\x29\x7a\x39\x2f\x5c\xa7\x72\xbf\xde\xe0\x0e\xe9\x68\x49\x48\x59\xb6\x72\x91\x71\x5f\x75\x43\x63\xe2\x9e\xf6\xf1\x7f\x4e\xde\xef\xfe\xf1\xba\xaa\xe7\x54\xf7\xaf\x83\xee\x5f\x45\x44\x99\x9a\xcb\x67\xc6\x6a\x8e\xab\x68\x85\xff\xfb\xa6\xf9\x2b\xbf\xcb\xd4\x79\x9a\xa7\x74\xd5\xde\x6c\x92\x8e\x36\x31\x6d\x16\x84\xf6\x00\x4b\x9b\x80\xa5\xcd\xc7\xfa\xe9\x23\xfd\xec\x43\xfd\xe1\xf7\xdb\xdf\x87\xb7\xf4\xf7\xce\x7e\xac\xca\x5d\xc3\xfb\x59\xc8\x0f\x84\x4b\x91\x4f\x4e\x47\x84\x34\xec\x33\x71\x47\xc4\x67\x4e\xaa\x55\x94\x82\x38\x93\xaf\xe7\xe4\xd9\xe2\x08\xb1\xb6\x32\x22\xc3\x69\x43\x2b\x2e\x48\x35\xce\xe3\xfc\xb5\x30\xff\xbd\x64\xbd\x2c\xce\x1f\x47\xfc\x37\x8a\xa9\x17\xfb\xe8\x85\x3e\xf6\x7c\x5f\xf8\x33\x36\x69\xfc\x60\xdf\xac\xa6\x67\xc4\xb2\x2f\xa7\x89\x6e\xd7\x22\xd1\x55\xfe\xa7\x68\x24\x59\xf1\x14\x82\x21\xcb\x15\xda\x9a\xe1\xe8\x0e\xc6\x94\x8c\x78\x70\xa1\xe6\x28\xe4\x33\xe6\x17\x58\x2d\x64\x8d\x88\x76\xc3\xec\x53\xa9\x76\x28\xa9\x5a\xa9\xa0\xc6\x23\xf2\x8a\x42\x3e\x65\x8d\xa5\x60\xb9\x9e\x1d\x60\x5f\x3e\x7a\x9b\xb8\xad\x0a\x29\xd0\x16\x32\x36\xff\x58\xd6\x92\xac\x74\xd2\xd8\xc7\xa4\x11\x8e\x56\xff\xeb\x92\x9e\xa6\x14\x3b\x1d\x3d\x69\x8b\xb5\xf7\xba\xc5\xda\x3e\x67\xdd\x0a\x09\x2a\xd8\x6f\x0f\xd3\xc1\x66\xea\x13\xb1\x1f\x1d\x66\x1f\x74\x17\x26\x32\x1a\x53\xa0\xb6\xb2\x34\x51\x3c\xf6\x70\xdd\xe2\x42\xf3\x79\xa3\x0c\xd9\x69\x93\xb5\xc8\x1b\x2b\x32\xe4\x96\x9f\xd6\x29\x38\x04\xd1\x29\x44\xa7\x10\x9d\x42\x74\x0a\xd1\x29\x44\xa7\x10\x9d\x42\x74\x0a\xd1\x29\x44\xa7\x10\x9d\x42\x74\x0a\xd1\x69\x87\x45\xa7\xdb\x8f\x50\x40\xd6\x0a\x59\x2b\x64\xad\xdb\x48\xd6\xfa\xe9\x61\xda\xbf\x11\xa2\x28\x68\xe2\xbf\x18\x66\x3f\xe9\xa6\x89\x5a\x63\x34\xb1\x75\x24\xd1\xa7\x4c\xf9\xb6\xa1\x88\xbe\x6e\xe0\x96\xe3\xc5\x0d\x51\xc4\xb3\xc1\x14\xf1\x51\xb6\xd7\x83\x1c\xa2\x4c\x39\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\x22\x08\xe2\xad\x4b\x10\xff\x74\x1f\x9d\x94\x04\x31\xa3\xea\x66\x2b\xaa\xe1\xaa\xc0\xe3\xfe\x73\x3e\x57\x14\x65\xc6\xe5\x97\xc0\x0a\x83\x7f\xf7\x3e\xf6\x6b\xfd\x74\x87\xfb\xc0\xcb\xeb\x89\xf0\xa8\x47\x08\xfc\x94\x73\xcc\x92\x6c\x6c\x51\x36\x16\xdb\xc7\x8f\x76\xfd\x6c\x2c\x27\x7c\x0f\x6e\x71\xe0\x7b\x89\x9e\x94\xdc\xee\x3c\xcd\x0b\x6e\x37\x4b\xd3\x94\xf2\x15\xe5\x56\xf4\xd3\x7a\x22\xee\x7b\x9b\x81\xda\xc0\x42\x30\xb0\x9b\x63\x67\x4c\x75\x9f\xef\x55\x3c\x64\x81\x1e\x43\x49\x01\x41\xf6\xe1\x5f\xde\x55\x3b\x84\xe3\xde\x71\xef\xfe\xa3\x18\x37\x4f\xd8\x92\x81\x4c\xbd\x8a\x96\xe9\x62\x55\x44\x45\x4b\x46\x12\xb1\x15\x88\x75\x6f\x32\xd6\xfd\x37\xfb\xe8\x69\x19\x92\xbe\x44\x4f\x38\x21\xe9\xed\x36\x31\x6d\x32\x69\x0d\xc6\xb9\x37\x66\xd8\xea\x18\xab\x8d\xd8\xbc\xd8\x7f\xd9\x53\x6b\xb9\xa2\x76\xa0\xbb\xbf\xb1\x1a\x93\xc7\x6c\x8d\xad\x42\x78\x3b\xc2\xdb\x11\xde\x8e\xf0\x76\x84\xb7\x23\xbc\xbd\x99\xf0\xf6\xce\x84\xa2\xb7\x23\x8a\xbe\xf1\xf0\xf6\x8e\x2e\x23\x52\x9f\xde\x5d\xbb\x8c\x38\x1a\x10\xdf\xee\xbf\xb8\x18\x15\x51\x95\x1d\x5f\x5b\x20\xaa\xbd\xd7\x56\x34\x88\x6a\x47\x54\xfb\x16\x47\xb5\x97\xb6\x6a\x1b\xda\xd1\x0f\x44\x60\x04\x7d\x7a\x96\xa6\x59\x2a\x7a\xda\x76\xd7\x3c\xea\x0e\x6c\xf7\xbd\x48\xfb\x8b\x92\xb1\xef\x85\xe8\x5e\x09\x79\xd5\x37\x94\xd5\xa2\xe0\xf1\xe3\xeb\x09\x99\xfc\x94\xfd\x71\x88\xfd\x51\x88\x98\xf3\xd3\x65\xf3\xa7\xf0\x3d\x39\xb5\x5c\xe9\xaf\x95\x9c\x3a\x16\xc9\xa9\xe5\x19\xfb\xf8\x65\x79\x78\x72\x61\xce\xd2\x08\xb5\xae\x02\xd1\x64\x4d\x43\x93\x35\x0d\x4d\x36\xd2\xd0\x06\x31\x6f\x9d\x0f\x93\xeb\x39\xe7\xf3\xc1\x98\x97\xfd\xf2\x10\x8d\xc9\xde\xd7\x57\x94\x4c\xdc\x3a\xa0\xaa\xd4\xbd\x1c\x0c\x5d\x2b\xa8\x06\x7b\x76\x88\xfd\x43\x3f\xdd\xcb\x0f\x4f\xba\x8f\xb6\x07\x26\x2a\x25\x1f\xba\xe9\xac\xb6\x36\x3c\x56\x75\xfb\x45\xad\xa0\xc6\xf6\xf3\x63\x16\xab\x9b\x30\xc7\x8a\x1f\xb1\xdd\xaa\x46\x3d\x43\x49\x39\x80\x93\x74\x54\x0c\xe0\x04\xed\xa7\xb8\xaf\x35\x11\x9d\x6d\x76\x58\x9c\x3f\x6f\x23\x83\x75\x75\x25\xd8\xa4\x9c\x62\x27\x4c\x93\xe2\x3b\x9e\x56\xed\x28\xad\xa0\xba\x6d\x88\xcc\x98\x71\xf5\x41\x6f\x43\xb2\x83\xdd\x86\xaa\x51\x90\xdf\x42\x7e\x0b\xf9\x2d\xe4\xb7\x90\xdf\x42\x7e\x0b\xf9\x2d\xe4\xb7\x90\xdf\x42\x7e\x0b\xf9\x2d\xe4\xb7\xa8\x1a\x05\x71\x2c\xc4\xb1\x10\xc7\x76\x54\x1c\xfb\xaf\xfb\x69\xd0\xac\x1a\x95\xe5\x4b\xd9\xbc\x56\xd4\xd5\x5c\x5e\x38\xc7\x2a\xe0\xdd\x38\xfb\x46\x88\xfd\xf7\x10\xbd\xd2\xf3\xb8\xcb\xeb\x75\x50\xea\x60\x4e\x2d\x27\xbd\xce\x5a\x06\x50\xf5\x01\xaa\x3f\xf7\x3a\x9a\x95\xc3\xb2\x5a\xd0\x6e\xf0\x6f\xa4\xae\x15\xe2\x36\x73\xa9\x66\xaa\x25\x3d\xaf\xe9\xf9\xf2\xcd\x82\xba\xae\x16\x2a\x76\xe3\x06\xfb\xd3\xcb\xec\x87\x86\xe8\x7e\x57\x3b\x49\xab\x19\x1b\xb6\x1e\xad\x0f\x5b\x17\xcc\xe6\xe7\x79\xf3\x53\xee\xe6\x63\xc7\xf8\x99\xb3\x1e\x6d\x9b\x14\xd6\xff\xd4\x2e\x67\xb1\x29\x20\x4a\x20\xca\x14\x10\x25\x10\x25\x10\x25\x10\x65\xcf\x20\xca\x54\xd7\x20\xca\x96\xdf\x49\xd3\x88\x32\x05\x44\x09\x44\x09\x44\x09\x44\x09\x44\xd9\x79\x44\x99\xea\x69\xa2\x98\x02\x51\x6c\x1f\x51\x4c\x75\x3b\x51\x4c\x6d\x43\xa2\x98\xbe\x49\xaf\x95\xcc\xec\x29\x7a\x52\x30\xb3\x0b\xf4\x38\x9d\xf3\xd5\xb0\xb9\xf9\x96\x25\x65\xf3\x87\x46\x0d\x09\xdc\x02\xc4\x67\x57\xff\x8f\x60\x01\xdc\xab\xd8\x72\x8d\xa8\xcd\x54\xc4\xd5\x03\x72\xa6\x28\xce\xff\xfe\x29\xfa\x59\x0a\x60\x71\x7b\xe5\x17\x2d\xa2\xd4\xc3\x6e\xc7\xe5\x41\x5b\x0b\xde\x24\x27\xbb\x44\xaf\xa1\x57\x57\x85\x43\xcc\xd1\x99\x16\x0d\x38\xa2\x23\x10\x97\xde\x64\x5c\xfa\x7f\x08\xc9\xb8\xf4\xfd\x22\x2e\x9d\x5b\xa2\x73\xd4\xba\x89\x49\x97\x65\xcc\xfb\xab\x68\xd9\x89\x79\x6f\xe9\x05\x5e\x27\x03\xd3\x5e\x4d\x4f\xb9\x02\xd3\x5a\x7a\x85\xe6\x0d\x69\x49\x6b\xdc\x90\xb6\xc4\x6e\xd6\x58\xe3\xd8\xaf\x8c\x05\x18\xd2\x71\x33\xb6\xd1\x15\x28\xaa\xad\xd6\x33\xaa\x33\xf2\x84\x3a\x46\x75\xca\x6e\xaa\x63\xe6\xb5\x3d\x51\xf4\xe0\xda\xe0\xda\xe0\xda\xe0\xda\xbd\xc3\xb5\xb1\x8e\x0c\x58\x47\x76\x0f\xf8\x47\x06\x93\x8e\x64\x30\x81\x7f\x05\xfe\x15\xf8\x57\xe0\x5f\x81\x7f\xa5\xa7\xfd\x2b\x48\x64\x85\x44\x56\x48\x64\xd5\xae\x44\x56\x70\x5f\xc2\x7d\xd9\xab\xee\xcb\x74\xae\x43\x39\xdc\x2c\x5e\x1d\xf3\xe6\xd5\x77\xb1\x3b\xe5\xdb\xec\x58\xda\xad\x65\xd7\xad\x4f\x7f\xf3\xe6\x7e\x8a\xc8\x78\x01\x23\x73\x45\xcd\xae\x15\xf8\x8e\xab\x2a\x48\xc0\xca\x82\xe3\x1c\xd1\x58\x16\x9c\x25\xfb\xf8\xed\x92\x05\xa7\x25\xb9\x9a\x1a\x8f\xe6\xb0\x82\x36\xbe\x64\x67\xc1\x51\xd6\xca\x9a\x91\x51\x78\x9f\x8d\xaf\x27\xc6\xc5\xe5\xb5\x62\x59\x29\x94\xb4\xac\xf5\x9b\xaa\x1b\xec\xc3\x43\xec\x5d\x03\xf4\x32\xd7\xe1\x97\xd7\x13\xe1\x43\xf5\xa3\x31\xce\xda\xad\x2d\x68\xd9\xa4\xdd\x5a\x4c\x04\x71\x24\x9d\xa6\x96\x13\x3e\x47\x6e\xb7\xac\x38\xaf\xa7\x65\x39\x6e\x17\xe8\x71\x31\x6e\x67\x68\x86\xa6\x7c\x9d\x60\xae\xde\xe4\x83\xe5\xd3\x09\xad\x4f\x95\xe3\xba\xae\x69\x13\x7c\x2e\x5d\x99\x73\x0b\xa9\x72\x10\x87\x82\x54\x39\xf0\xd7\xc1\x5f\x07\x7f\x1d\xfc\x75\x48\x95\x83\x54\x39\xf0\x93\xc0\x4f\x02\x3f\x09\xfc\x24\x5d\xe5\x27\x41\xaa\x1c\xa4\xca\xd9\x2e\x64\x18\xa9\x72\xda\x91\x2a\xe7\x17\x86\x69\x84\x0f\xdd\xf8\x7a\x42\xf6\xdb\xb8\x5d\x6f\xd6\x2c\x14\x29\xfe\xfd\xa6\xf1\x92\x96\x35\xd8\xb3\xc3\xec\xc7\x06\x68\x47\x46\xd3\xd5\xcb\xeb\x89\xb0\x66\x7e\xc9\x8a\xd9\xfc\x7a\x3e\xbb\xa6\x14\xdc\xcf\xa8\xd8\xab\xc6\x05\x2d\x1b\x77\xf9\x4e\x27\xed\x85\xc4\x90\x38\x7f\xc8\xd9\x25\x57\x6c\x7b\xb4\x92\x6a\x2b\xa3\x8c\xb2\xaa\x64\xe3\xb1\xfb\xc5\x09\x53\x9a\xae\x2e\x27\x6c\xd4\x97\x5d\xd0\xb2\xf3\xf9\x16\x56\xe3\x68\x13\xf1\xbb\x46\x0b\x92\xf8\xcd\xd1\x19\x41\xfc\x92\x74\x8a\x4e\x34\x41\x6a\xc5\x94\x9a\xe1\x2b\xba\x40\xd6\xb7\xd7\x9b\xc3\xed\x66\x24\x6e\x4c\x86\x0e\xcd\x04\x03\xc1\x28\x8b\x98\x40\x30\x1a\xb5\x7c\x03\x5a\xb6\x82\xf9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x81\xe9\x75\x98\xe9\xbd\x8e\x5e\xcb\x9e\x89\x3e\x6d\x97\x33\x9b\x34\xaf\x2c\x83\xe5\xf9\x02\x67\xad\x7c\x25\x62\x64\xb4\x92\x3a\x1a\x31\xd6\x32\x57\x78\xef\x8b\x15\xac\xaa\x5c\x97\x0c\xa2\xa4\x6b\xe2\x49\xa3\xbb\x6c\x02\xd0\xce\x42\x67\xa0\x86\xa0\x86\xa0\x86\xdb\x88\x1a\xfe\xd0\x30\x3d\x52\x49\x0d\x75\xd5\x46\x62\xa6\xa6\x54\x68\x01\xbf\x32\xc4\x7e\xdf\x05\x0c\xff\x69\x5f\x63\xc4\x70\xd1\x69\x6d\xca\x6e\xad\x45\x0c\xf1\xa0\x8b\x21\x7a\x5e\x67\x3e\x6f\x94\xb7\x9b\x9a\xf0\x9a\xbf\x3c\xb4\xe5\xd0\xd1\x62\x8b\x4f\x05\x63\xc3\x83\x6c\xc2\xac\xa8\xe7\xd5\xd1\x15\xf8\xd0\xc1\x8b\x0d\x41\x4b\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\xd0\x46\x28\x08\xc1\x02\xc1\x02\xc1\x02\x3b\xc5\x02\xff\x7e\x88\x26\x3c\x02\x84\x27\x56\xd4\xb2\x32\xe1\x1f\x25\xfc\xa9\x21\xf6\x89\x01\xba\xab\x22\x4a\x58\x9e\xd3\x6c\xa8\xf0\x89\xea\x50\x61\xd9\xdc\x2d\x12\x2f\xbc\x4e\xaf\x91\x20\xef\x22\x2d\x0a\x90\x37\x4f\x69\x3a\xdb\x58\xbc\xb0\xec\x88\x4d\x05\x0d\x07\xa5\x1f\xcf\x05\xc3\xc0\x69\x96\x6a\x34\x82\x58\xde\x30\x79\xc4\x20\x83\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x81\xfb\x75\x8a\xfb\xbd\x7b\x84\xe6\x25\xf7\xd3\x57\x94\x4c\xdc\x42\x46\xa2\x29\x27\x4b\x63\xfd\xa0\x62\x5d\x2b\xa8\x2b\xf9\x62\x36\x5f\xcc\x19\xec\xc5\x61\xf6\x95\x01\xba\x9b\xb7\x96\x74\x37\x76\x79\x3d\x11\xbe\xd1\xa0\x6e\x50\x2b\xa8\x29\xd9\x5e\x8b\xd4\x82\x09\x71\xc2\x62\xf5\x3d\xb9\xc3\x8f\x5d\x17\x45\x18\xb2\x37\x3d\xcc\x06\xd3\xc1\x24\x3b\x65\xe2\x3e\xdf\xe9\x64\x06\x1e\xbb\xfa\xbb\x32\xe9\x20\x74\x83\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\xe0\x87\x5d\xc8\x0f\x11\xa5\x0c\x42\x09\x42\x09\x42\xd9\x46\x42\xf9\x6c\x8c\x9e\x08\x26\x94\xb2\x8e\x4c\x20\xa6\x34\xff\xf2\x26\xf6\xb1\x11\xf6\xf6\xdb\xe8\x5e\x2f\x4c\x29\xeb\xce\xfc\xac\x19\xe4\xec\x26\x94\x45\xcb\xb0\x5a\x22\xc6\x45\x8d\x7f\xae\x5b\x80\x28\x47\x9d\x15\x94\x58\x25\x9a\xdf\x5b\xbe\x08\x73\x96\x86\x43\x15\xab\x71\x57\xdb\xf1\xd8\x3e\x3f\xc0\x29\x1e\xa6\x92\x72\x02\x6d\xd6\xa2\xcd\x87\xbc\xa1\xe3\x4e\x76\xbb\xb8\x31\xda\x58\xb9\x95\x46\xd8\xa7\x47\xe9\x25\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\x4d\x40\xcd\xce\x42\xcd\x04\x8d\xb3\xb1\xe8\x3e\x1b\x6a\xee\x11\x34\xd3\xbc\x0b\xbe\x77\x8b\x0e\xf0\xbf\xb8\x29\x25\x38\x28\x38\x28\x38\x28\x38\x68\x1b\x39\xe8\x37\x87\x68\xd8\xac\xa3\x5d\xd6\x74\x25\xa7\xd6\xc8\x33\x33\x46\x3e\xab\xe7\xf9\x30\xb2\xff\x34\xc4\x3e\x3e\x40\x64\x1e\x79\x79\x3d\x11\x5e\x6b\x4c\x7b\x39\xb5\x34\x37\x2d\xda\x68\x91\xf2\xf2\x3e\x71\xc2\x92\xbc\x8f\xe5\x84\xdd\xfc\xf6\xd0\x58\x76\x3e\x1d\x63\x43\xa5\x5e\x1a\xcb\xd9\x68\xc2\xc8\xca\xd9\x62\x12\x48\x7b\x1c\x50\xfc\x05\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x12\x04\x72\x2b\x09\x24\x60\x1f\x60\x1f\x60\x5f\x0f\xc3\xbe\xff\x15\xa3\xc7\xac\xd2\x2c\x7e\x72\x46\xcf\x5a\x2d\x96\xbe\xf1\x17\x63\xec\x5f\xf5\x3b\x25\x5b\x86\x75\x55\xc9\x56\xed\x41\x3d\xab\x79\xc4\x46\xf8\x91\xd5\xb5\x99\x3d\x0f\x6d\x19\xbe\x93\xb4\x2d\xeb\x4f\xdb\xe6\x24\x6d\x4b\xd1\x69\x41\xdb\x26\xe9\x28\x1d\xf6\xcd\x99\xc8\x1f\x39\xbe\x9e\x88\x7b\xde\xb3\x85\xd9\x1e\xf0\xc6\x6c\xb7\xb3\x81\x9c\xba\x51\xc0\x66\xd7\x52\x0e\x2e\x8f\x12\xfe\x9b\x9d\xce\x98\xec\xe3\x23\xa8\x64\xd4\x86\x86\x65\xd4\x3c\x78\x0b\x46\x26\x25\x72\x54\xb2\x81\x15\x2d\x7b\x33\x2c\xfe\x37\xd2\x17\x6b\x7a\x04\x52\xef\x0a\xd1\x4f\x84\xd8\x8f\x87\xc2\xff\xc6\x36\xc6\xdf\xe9\x7b\x8a\x7f\xd5\xcc\xcf\xe9\xa8\x80\xd4\x19\xbe\x69\x96\xd6\xb3\x62\x0b\xe7\xc6\x7a\x2b\x6a\xa4\xc4\x7b\x97\xaf\x9b\xe3\x91\x64\x31\x92\x2f\x4a\x78\xa2\xe9\x91\xb5\xa2\xcd\x5f\xb2\x91\xac\x7e\x73\x71\xad\x18\xc9\xe6\x75\x95\x9b\x0c\xd5\xde\xd4\xf3\x6f\xb3\x58\xfc\x98\x54\xc3\xda\xc3\x98\xfb\xc8\xc8\xea\x9a\x2e\xd6\xc9\x25\x5d\xcb\xa8\x86\x58\xa5\x98\x16\xca\xfc\xfc\xc5\x23\xcb\xe2\x8a\x62\xff\x21\x96\x15\x93\x91\xb1\x48\xb2\x50\x98\x14\x6b\x90\xac\x7e\x33\xa2\xaf\x15\xf9\xfe\x96\xdb\x18\x6b\xe1\x65\x36\xa7\x66\xa3\xb7\xcb\x5b\x73\x19\xd4\xd4\x8f\x86\xe8\x47\x42\xec\x1d\xa1\xf0\xdb\xec\x0e\xfa\x66\x9f\x58\xb6\x3e\xae\x14\x95\x9c\xaa\xcb\x0d\x98\x74\x2d\x1a\x86\x96\xc9\x8b\x35\x85\xbd\xd5\x51\xc4\x5e\x51\xd3\x23\x7c\xc9\x59\xbe\x69\x2f\xb2\xae\x2b\xd7\xf8\xfd\x97\xaf\xa8\x86\x6a\x59\x3d\x6e\x89\x2d\x08\x25\x38\xcc\x8a\x1a\x11\xf6\x56\x6c\x6b\x34\x3d\x92\x98\x38\xca\x8f\xd5\x95\x8c\xa0\x65\x05\xad\x98\x93\x36\x4e\x6c\x3d\xb8\xe1\x51\xf2\x45\xb9\xf4\x10\x4b\x7b\xe7\x58\x41\x10\x4c\x96\xc7\x37\xa4\xd6\x77\x2b\xa7\x15\x94\x62\x2e\xae\xe9\xb9\xf1\xd2\xb5\xdc\xf8\x5a\x31\x9f\xd1\xb2\xea\xf8\xde\x39\x63\x81\xb7\x12\x8f\xee\x76\x3f\xab\xfb\x4b\xf3\xc9\xbe\x16\x5a\x02\x3a\xcf\x9b\x4a\xb0\x33\x34\x43\x3b\xa6\xe4\x82\x7a\x53\xed\x05\x49\x8c\xfd\x4d\x4e\x69\xad\x8d\x26\x27\xf6\x53\x7b\x1c\x93\xf3\xa0\xdc\x23\x44\x14\x1f\x2b\xb3\x4f\xfe\xbe\x15\x46\xe6\x22\x2d\xd2\x82\xdb\xc8\xc4\x52\x74\xba\x09\x97\xca\xb4\x78\x82\x0b\x82\x50\x1b\x30\x36\x41\xc6\xe6\x6b\x21\xfa\x6a\x88\x7d\x39\x14\xfe\xa2\xdd\x41\x1f\x0f\x5d\x74\xaf\xc8\xf2\x7c\x63\x20\x56\x55\x91\x15\x75\x55\x7a\x67\xec\xad\x90\xe3\x02\x30\x77\x9f\xe2\x16\x5d\xc6\xa4\xa8\x15\xc7\x8a\x6a\x4e\x11\x1d\x61\x2e\xca\xdc\x46\x47\x42\x11\x7b\x08\xcc\xf9\x99\xbf\x7e\x5d\xcd\x72\xb3\x56\xb8\xe9\xb8\x4d\x1c\x54\x9e\x2f\x8c\x9a\x6b\x35\xb1\x5a\x8d\xe4\x74\xfe\x19\x2d\xa9\x7a\x5e\xcb\xda\x6b\x4e\xe7\x8b\x2a\x3c\x52\x56\x6f\xac\x19\xfc\x26\xdd\xeb\x5c\x85\x9f\x69\x3d\x90\x79\x91\x55\x89\x07\xac\x26\xe2\xf2\x3e\xaf\xab\x4a\xd1\xf3\x1e\xa3\x4c\xdc\xc2\x82\xb8\x03\x8f\x35\x68\xea\x77\x42\xf4\x62\x88\xbd\x10\x0a\x3f\x6f\x77\xf3\x7b\x42\xd3\x2e\x07\x6b\xa9\xa0\x2a\x86\x6a\xb3\x9c\x05\x5d\x2b\x29\x39\x31\x00\x0b\x5a\x21\x9f\xb9\x59\xe1\xce\xb1\x9e\xc5\xf1\xd0\xf2\x51\x4a\xc4\x8f\xc4\x23\x4b\x72\x40\x64\xef\x94\xf8\x16\x84\x6f\xe3\x2c\x2c\xa8\x46\x34\xbd\x74\x45\x29\x5a\xee\x25\x7d\x4d\x1d\x5f\x55\x0a\x16\x46\x8f\xca\x5f\xa3\x91\xd5\x7c\x51\x29\xe4\xdf\x68\xf1\xb8\x15\x95\xaf\x71\xc5\xa6\x67\x5c\xae\x6d\xb3\x0e\xa3\x95\x8d\x0f\x19\xce\x49\x12\x5c\xc7\x23\x33\x79\x31\x9d\x5d\x37\xae\xe9\xb5\x4f\xe6\x6c\x20\xcb\x92\x9b\x8b\x97\x4d\x2b\x5f\x89\x47\xf7\xc8\xfb\x99\xb6\x1e\xa4\xc2\x4f\x95\x7a\xeb\x00\x3d\x3b\xc0\xde\x3c\x10\xfe\xbe\xed\xac\xfc\x42\xff\x53\x26\xd8\xe2\xaf\x14\xdf\xc1\xe5\x14\x7d\x45\xc9\xa9\x91\x0c\xb7\x59\xc2\xe2\x3a\xef\x85\xaa\xaf\x6a\xfa\x75\xde\x17\x9e\x77\x7a\xa1\xea\xe2\xfe\x37\x2a\xe6\xb3\x35\x19\x4b\xf2\xa9\xf2\x7c\xa2\x64\xf2\x59\x87\x50\x0b\xd8\x29\xfc\x05\x76\xef\xf2\x3d\x9d\x89\x02\x2d\x9c\x19\x77\x75\xa3\x05\xc2\xec\x5d\x9b\xed\xa2\xac\xbc\x58\x3c\x92\xcc\xf0\x0d\x9e\xf8\x02\xbb\x8d\xc3\x90\x7c\x86\xa1\xc8\x98\x39\xf0\x95\x13\xc3\x38\x1e\x19\x4a\x29\x99\x6b\xfc\xab\x52\xcc\xf2\xa3\x84\x6f\x50\x1c\x54\xd5\x71\x92\x3e\x9b\x53\xbf\xb2\x11\xeb\x09\x56\xec\x96\x8e\x47\x86\x66\x35\x5d\x75\x35\x1b\xc9\x28\x46\x46\xc9\xf2\xa7\x37\xfb\x47\x7a\x83\x45\x7b\x86\xb4\x5e\x35\x0d\xae\xda\x6d\xc4\xa3\x77\x96\xaa\xe7\x8d\x7b\x65\xf0\x5c\x1f\xcd\xcb\x95\xc1\x0c\x4d\x89\x95\xc1\x09\x3a\x4e\xc7\x9a\xf8\x7c\x2c\x95\x95\xf2\x9a\x41\x8b\xbc\xb5\x09\x76\x8e\xe6\x68\xa7\xec\x5b\x35\xbb\xd9\x36\x83\x16\x08\x6d\xab\xc4\x18\xf1\x5e\x79\xec\x62\x3b\x64\xff\x53\xea\x1d\xbb\x9d\x35\xc2\xc1\x92\xa2\x97\xf3\xc2\xbd\x28\xf7\xb4\x0d\xed\x4f\x62\x25\xa7\x1e\x67\xc7\x16\x0e\xf7\x55\x37\x34\x26\xee\x62\x1f\xff\xe7\xe4\xfd\xee\x1f\xaf\xab\x7a\x4e\x75\xff\x3a\xe8\xfe\xd5\x28\xeb\x4a\x59\xcd\xe5\x33\x63\x35\xc7\x55\xb4\xc2\xff\x7d\xd3\xfc\x95\xdf\x65\xea\x3c\xcd\x53\xba\x6a\x67\x34\x49\x47\x9b\x98\x23\x0b\xc2\x1f\x8f\xe5\x4a\xc0\x72\xe5\x63\xfd\xf4\x91\x7e\xf6\xa1\xfe\xf0\xfb\x6d\x9b\xff\x96\xfe\xde\xd9\x1b\x55\xb9\x30\x78\x3f\x0b\x97\xbc\x70\xb3\xf1\xc9\xe9\x08\x73\x86\x7d\x26\xee\x88\xf8\x74\x49\x05\x87\x52\x10\x67\xf2\x35\x9a\x3c\x5b\x1c\x21\xd6\x4b\x46\x64\x38\x6d\x68\xc5\x05\xa9\x50\x79\x9c\xbf\x16\xe6\xbf\x97\xac\x97\xc5\xf9\xe3\x88\xff\xa6\x2d\xf5\x62\x1f\xbd\xd0\xc7\x9e\xef\x0b\x7f\xc6\xa6\x6f\x1f\xec\x9b\xd5\xf4\x8c\x58\xca\xe5\x34\xd1\xed\x5a\x24\xba\xca\xff\x14\x8d\x24\x2b\x9e\x42\x70\x55\xb9\xea\x5a\x33\x1c\x5f\xfc\x98\x92\x11\x0f\x2e\x14\x0e\x85\x7c\xc6\xfc\xaa\xaa\x85\xac\x11\xd1\x6e\x98\x7d\x2a\x15\x00\x25\x55\x2b\x15\xd4\x78\x44\x5e\x51\x48\x8a\xac\xb1\x14\x7c\xd3\xb3\x03\xec\xcb\x47\x6f\x13\xb7\x55\x21\x8f\x69\x25\x8e\xda\x44\x5c\x6a\x49\xc6\xa5\xb6\x6b\xdb\x98\x4e\xd1\x69\x76\x32\xfa\x98\xad\x68\x7e\xb8\x42\x04\xed\x75\xfe\xad\xa0\x8a\x66\xbf\x77\x89\x0e\x48\x95\xe5\x8a\xd0\x54\x5a\x91\xe5\x3e\x10\x36\xa3\x6b\xc5\xab\xda\x8a\xc1\x7e\xe2\x12\xfb\xbf\x06\xe9\xa5\xe2\x24\x3b\x86\xfc\xd1\xfa\x25\x70\xa6\x74\xad\x98\xd6\x56\x62\x0f\xf3\xc3\x52\xfc\x90\x9a\x78\x6d\xf3\x90\x2e\x57\x4a\xa6\xa0\x1b\x84\x6e\x30\x05\xdd\x20\x74\x83\xd0\x0d\x42\x37\xd8\x33\xba\xc1\x54\xd7\xe8\x06\x5b\x7e\x27\x4d\xeb\x06\x53\xd0\x0d\x42\x37\x08\xdd\x20\x74\x83\xd0\x0d\x76\x5e\x37\x98\xea\x69\x99\x5f\x0a\x32\xbf\xf6\xc9\xfc\x52\xdd\x2e\xf3\x4b\x6d\x43\x99\x5f\xfa\x75\x34\x23\x59\xe2\x49\x7a\x4c\xb0\xc4\xc3\x74\x90\x26\x7c\x59\xa2\xa0\x4b\x71\x93\x2e\xc5\x4d\x36\xd4\x50\xe1\xdf\x27\x82\x31\x61\x9c\x8d\x9a\x98\x50\x5c\xc6\x0a\x14\x95\x17\xa9\xcd\x56\x17\x54\x4b\x38\xfa\x8f\x3b\xab\x71\xd8\x1e\xf9\xfd\x89\x28\x36\xf9\xda\x2b\xff\xd2\x19\xf6\x25\x51\xd5\x34\xa5\xe8\x74\x95\xcb\x66\x3f\xc5\x37\xd6\xe7\x70\xd4\x40\xc4\xd6\xa4\x88\xed\xaf\xfa\x28\x29\xdf\xf9\x49\x3a\x2a\xde\xf9\x09\xda\xf0\xfc\xa3\x59\x29\x5e\x3b\x45\x27\x1c\xf1\x5a\x33\xed\x9c\x91\x7e\xee\xd3\x74\xd2\xe5\xe7\x6e\xa6\xa1\xae\x32\x40\x25\xcd\x28\x53\xec\x0f\x46\xab\x0d\xd0\xfd\xa6\x7e\xc1\x25\x06\xd1\x56\x6d\x63\x34\x26\x7f\x75\x1b\xa3\x29\xfb\xc0\x76\x9b\xa5\xf6\xc8\xdf\x80\x64\x81\x64\x81\x64\x81\x64\x7b\x07\xc9\x62\x61\x16\xb0\x30\xeb\x1e\x66\x0d\xe9\x71\x47\xa4\xc7\x70\x0d\xc0\x35\x00\xd7\x00\x5c\x03\x70\x0d\xf4\xb4\x6b\x00\x11\x28\x88\x40\x41\x04\x4a\xbb\x22\x50\xe0\x79\x83\xe7\xad\x57\x3d\x6f\xe9\x5c\x8b\x83\xaf\x82\x58\x72\xcc\x1b\xfc\xde\xc5\xee\x94\x6f\xb3\x63\x69\xa9\x0d\xdc\x79\x3b\xaa\xda\x9f\x7b\x2d\x9d\x92\xaa\xf6\x6c\xde\xc8\x68\x7c\xc1\xe3\xca\x1e\xec\xa3\x6d\x57\x8b\xd9\x92\x96\x2f\x96\x8d\x42\x3e\xa3\x1a\xec\xdb\x97\xd8\x07\x06\x69\xb7\xdd\x80\x48\x61\x51\x5f\xe0\x3e\x63\xb6\xb0\xc4\x5b\x88\x0d\xf2\x83\xa7\xad\xd3\xdd\x61\x62\x15\xc7\x41\xeb\x0e\xad\x3b\xb4\xee\x70\xac\xc0\xb1\x02\xc7\x0a\x1c\x2b\x5d\xe3\x58\xe9\x1e\xbf\x01\x80\x36\x80\x36\x80\x36\x80\x36\x80\x76\x4f\x03\x6d\x10\x37\x10\xb7\x1e\x25\x6e\xdb\x52\xeb\xae\xfa\xe7\x77\x4d\x4b\x7c\x38\x45\x49\x81\x0f\x8f\xd3\x31\x3a\xe2\xab\x3f\x75\x08\xd6\x7a\x22\x5e\x41\x8e\xe6\xf3\x86\x5d\x47\x29\x40\x9d\x7e\xf5\x52\x30\x17\x9c\x64\x47\x25\x0a\xac\xb8\x88\x57\x92\xa5\x6a\xa8\x46\xd1\x0f\xed\xaa\x22\x65\xf7\x58\xda\xf7\x62\x15\x15\x1b\x96\x3f\x74\x90\x8b\x49\x8c\x35\x47\x67\x68\xa6\x4a\x07\x7f\x88\x0e\x34\xd1\xed\xd0\x5c\x41\x0c\xdf\xa4\x18\xfe\x7f\x9b\x79\xdb\x26\x84\xeb\xc0\x51\xa0\x1f\xa1\xe6\xa6\xa2\xbf\x89\x99\x95\x26\xe6\x14\x9d\x10\x26\xa6\xe9\x0b\x9c\x93\xc2\xfb\x69\x4a\x39\xc2\xfb\x66\x1b\xb3\x6c\x55\x63\xb6\xc8\xcf\xd6\x04\xd9\xa8\x40\x9d\xfc\xb7\x46\xab\x6c\x55\xd4\x53\x26\x5f\x69\xb6\x26\xe4\x31\x2e\xb3\xe5\xa5\x95\x6f\xa7\x01\x83\x62\x1e\x60\x17\x60\x17\x60\x17\x60\x17\x8a\x79\x28\xe6\xa1\x98\x87\x62\x1e\x0e\x06\x38\x18\xe0\x60\x80\x83\x01\x0e\x06\x28\xe6\xa1\x98\x87\x62\x1e\x8a\x79\xf8\xef\xe0\xbf\xeb\x42\xff\x5d\x57\x2b\xe6\xdb\x4b\xa3\xb7\xa3\x7a\xfe\x17\x86\xe9\x88\x54\xcf\x1b\x65\x4d\x57\x72\xaa\xa3\x9d\x97\xc9\xe1\xc5\x34\x1a\xcf\xf0\x45\x97\xf8\x3d\xa3\x94\x94\x4c\xbe\x9c\x57\x0d\xf6\xed\x21\xf6\xad\x01\xba\xc3\xfc\xc1\xce\x44\xf3\x4f\xcc\x75\x6e\x31\x9b\x5f\xcf\x67\xd7\x94\x82\xdb\x67\xab\xd8\x7b\xca\xa9\xa5\xb9\x25\x79\xe6\x94\x6c\xf2\x66\xdc\xb5\x80\x98\xb4\x97\x1e\x43\xa2\xb9\x21\x07\xed\x56\xb0\x3a\xad\xa4\xda\x78\xc0\x28\xab\x4a\x36\x1e\x3b\x26\x4e\x30\xdb\xb6\x92\xdd\xd4\x5c\x6c\x3e\x6f\x94\x67\x35\x3d\x59\x28\xd8\x48\xdf\xe8\x72\x79\x7e\xfa\x1a\x2d\xc8\x57\x6b\x8e\xce\x88\x57\x2b\x49\xa7\xe8\x44\x13\xaf\x96\x70\xa7\xcf\xf0\xbd\x61\xe0\xeb\xb5\xd7\xfb\xf5\xda\xcd\x48\xdc\x98\xf4\x38\xab\xc1\xef\x55\x8a\x9d\xae\x09\x37\x31\x5f\xb4\xca\x99\x67\xc5\xa8\xd4\x8c\x18\xa5\x11\x9e\x80\xf0\x84\x34\xbc\x58\xf0\x62\xc1\x8b\x05\x2f\x56\xcf\x78\xb1\xd2\x5d\xe3\xa4\x69\xf9\x9d\x34\xed\x3d\x48\xc3\x7b\x00\xef\x01\xbc\x07\xf0\x1e\xc0\x7b\xd0\x79\xef\x41\xcb\x29\x44\xba\xa7\x79\x69\x1a\xbc\xb4\x7d\xbc\x34\xdd\xf5\xbc\x74\x1b\xc6\x3b\xb0\xbf\x1e\xa4\x7b\x2a\x2b\x49\x3a\xd5\x22\x7f\x77\x90\x7d\xb6\x9f\x76\x5a\xd9\xa9\x1b\x2d\x14\x19\x75\x15\x8a\x34\xff\xb6\xdd\xf0\xdc\x6b\xe8\xb4\xc4\x73\xc7\xe8\x88\xc0\x73\x09\x1a\xa7\xb1\xc0\x64\xe3\x1b\x2a\x76\x10\x14\xfb\x31\x1f\x4c\xe2\x46\xd8\x90\x47\x9c\x87\x57\x7e\x18\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\xb7\x4e\x01\xb7\xe7\x87\xe8\x95\x7c\xe8\xc6\xd7\x2d\x45\x9e\x93\xd8\x96\xfd\xec\x10\x7b\xf7\x00\xed\xc8\x68\xba\x7a\x79\x3d\x11\x5e\x6b\x4c\x7f\x67\x73\xb5\x16\xc9\xee\x5e\x29\x4e\x98\xd2\x74\xd5\x95\xe6\x63\x3e\x6f\x94\xbb\x1d\xdb\x75\xad\xaa\xee\x5c\x30\xcb\x1b\x66\x83\x26\xbf\x8b\x46\x4d\x78\x67\xf7\x7d\xa5\x36\x15\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\x0f\x28\xaf\x43\x28\xef\x83\x31\x7a\x95\xd4\xce\xe9\x2b\x4a\x26\x6e\xb1\x21\xd1\x94\x77\xf0\xad\x4f\x0d\x2b\x5d\x2b\xa8\x2b\xf9\x62\x36\x5f\xcc\x99\x3f\xbc\x89\xbd\x30\xc2\xde\x77\x1b\xdd\xcb\x5b\x4e\xba\x1b\xb6\x83\x73\x3f\xd1\x67\x8e\x95\x0b\x09\x16\x2d\xeb\x67\x69\xf2\x16\xb5\x82\x9a\x92\x2d\xb7\x04\x0e\x8e\x3a\xab\x1d\xb1\xa2\x33\xbf\x8d\x7c\xc1\xe4\x2c\xe3\x86\x2a\x56\xce\xae\xb6\xe3\xb1\x09\x71\xb9\xc5\xea\x87\x32\x63\x7b\x9d\x94\x9c\xae\xfb\x06\x74\xac\x85\x8e\xf9\x60\x9e\x38\xcb\xa6\x4d\x9e\xe8\x3b\x39\x4d\xcc\xe8\xea\xeb\xda\x3a\x72\x57\x1f\xf2\xe6\x9b\x3b\xd9\xed\xa2\x0f\x80\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x81\x23\x3b\x8d\x23\x8f\xd2\x61\x76\x30\x3a\x61\xa7\x2c\xbb\x47\xe4\x2a\x33\xef\xc2\xb5\xc7\x8b\x0e\xf0\x1f\xdc\xa9\xc8\xb6\x5f\xb2\x33\xa0\x52\xa0\x52\xa0\xd2\x6d\x84\x4a\xff\x78\x98\xc6\x7d\x92\x13\x3a\x79\x09\xb3\x7a\x9e\x0f\xa3\x45\x40\x3f\x34\xcc\xfe\x7c\x80\xc8\x49\x4a\x18\xfe\xf9\x46\x90\xe7\xd4\xd2\xdc\xb4\x68\xa8\x2b\x80\xe7\x3d\x95\x29\x0c\xed\x9b\x03\xd5\xac\xa5\x9a\x4f\x05\x53\xcd\x83\x6c\x22\x20\xd5\xa0\xec\xde\xca\xda\x52\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x60\x98\x5d\xc6\x30\x0f\xd3\x41\x36\x11\xdd\x6f\x93\xc8\x97\xbb\x19\xa6\xbd\xb9\xab\x25\x98\xe0\x8b\xe0\x8b\xe0\x8b\x3d\xcc\x17\x7f\x3e\x4c\x29\x2b\xaa\xda\x4f\x64\xa9\xda\x1c\x8c\x1b\x79\x5d\xe3\x26\xd6\x82\x8d\xe3\x46\x46\x29\xa8\xec\x1b\xf7\xb2\x1f\xee\x77\xe2\xaf\x13\xba\xaa\x64\x23\xe2\x27\xab\xa3\x9d\xaf\xf5\xa2\xd3\xde\x94\xdd\x5e\x2c\xce\x4f\xa9\x0a\x9d\xce\x7a\x1e\xba\xc4\x9b\x6d\x6d\xb5\xf1\x8d\xe6\x2d\x54\xd6\xca\x1a\x7f\x3a\xbe\x24\x5e\x4f\xc4\xc5\x1d\x05\x52\xba\x85\x60\x4a\x37\xc6\xf6\x99\x94\xce\x75\x05\x13\xd1\xc9\x8b\x54\xe0\xb9\x07\xbc\xf1\xdc\xed\x6c\x20\xa7\x96\x29\xfc\xa5\x9d\xce\x88\x1c\xe4\xa3\xa8\x64\xd4\x8d\x0d\x4a\xc2\x3c\x6b\xab\xc6\x25\x35\x45\x49\x3a\xe5\xae\x02\x1f\xe9\x8b\x6d\x74\x60\x50\x02\x39\xa8\x04\xf2\x8f\x86\xe8\x47\x42\xec\x1d\xa1\xf0\xdb\xec\x0e\xfa\x66\x9f\x58\xf7\x3e\xae\x14\x95\x9c\xaa\xcb\x1d\x9c\x74\x6b\x1a\x86\x96\xc9\x8b\x45\x89\xbd\x57\x52\xc4\x66\x53\xd3\x23\x7c\xcd\x5a\xbe\x69\xaf\xd2\xae\x2b\xd7\xf8\xfd\x97\xaf\xa8\x86\x6a\x99\x3f\x77\xc1\x61\xab\x30\xb1\x30\xbc\x62\x5f\xa4\xe9\x91\xc4\xc4\x51\x7e\xac\xae\x64\x04\x6e\x2b\x68\xc5\x9c\x34\x76\x62\xef\xc2\x2d\x90\x92\x2f\xca\x35\x88\xd8\x1b\x38\xc7\x0a\x04\x61\xc2\x40\xbe\xa3\xb5\x3e\x60\x39\xad\xa0\x14\x73\x71\x4d\xcf\x8d\x97\xae\xe5\xc6\xd7\x8a\xf9\x8c\x96\x55\xc7\xf7\xce\x19\x0b\xbc\x95\x78\x74\xb7\xfb\x59\xdd\x9f\x9c\xf7\xf6\xf9\xbe\xd5\x2d\x30\x18\x33\xbc\x85\x04\x3b\x49\x8f\xd1\x8e\x29\xb9\x42\x6f\xa2\x19\xcb\xbc\xf8\x1b\x83\xd2\x5a\x99\x5a\x6f\x7d\x52\x6f\xdf\xed\x98\x97\x13\x25\x45\xe7\x3b\x65\xbe\xbb\x14\xdf\xa7\x8d\xd9\x99\xf1\x92\x47\xe2\x8c\x8e\x58\x99\xfb\xaa\x1b\x1a\x13\xb7\xb2\x8f\xff\x73\xf2\x7e\xf7\x8f\xd7\x55\x3d\xa7\xba\x7f\x1d\x74\xff\xca\x17\xb2\x65\x35\x97\xcf\x8c\xd5\x1c\x57\xd1\x0a\xff\xf7\x4d\xf3\x57\x7e\x97\xa9\xf3\x34\x4f\xe9\x2a\x0b\x37\x49\x47\x9b\x70\x18\x2d\x08\x42\x0f\x63\x17\x60\xec\x3e\xd6\x4f\x1f\xe9\x67\x1f\xea\x0f\xbf\xdf\x76\x59\xbd\xa5\xbf\x77\x8c\x5d\x15\xd4\xe0\xfd\x2c\x20\xbd\x00\x6f\x7c\x72\x3a\xae\xba\x61\x9f\x89\x3b\x22\x68\xb5\xf4\xe9\x28\x05\x71\x66\x51\x2b\x8e\xc9\xb3\xc5\x11\xc2\xa7\x67\x44\x86\xd3\x86\x56\x5c\x90\x3e\xab\xc7\xf9\x6b\x61\xfe\x7b\xc9\x7a\x59\x9c\x3f\x8e\xf8\x5b\xe1\xd4\x8b\x7d\xf4\x42\x1f\x7b\xbe\x2f\xfc\x19\x7b\x5d\xfd\xc1\xbe\x59\x8d\x6f\x13\xf3\x46\x24\xa7\x89\x6e\xd7\x22\xd1\x55\xfe\xa7\x68\x24\x59\xf1\x14\x62\xc7\x24\x8b\xc5\xaf\x19\x0e\x9d\x1f\x53\x32\xe2\xc1\x85\xcf\xa3\x90\xcf\x98\x55\x60\xd5\x42\xd6\x88\x68\x37\xcc\x3e\x95\x3e\x81\x92\xaa\x95\x0a\x6a\x3c\x22\xaf\x28\x9c\x8c\xd6\x58\x8a\x9d\x8b\x67\x07\xd8\x97\x8f\xde\x26\x6e\xab\xc2\x61\xd6\x89\xd5\xa6\xbf\xeb\x56\xdc\x60\xa3\x1f\x04\x8f\x34\xd9\x7e\x1f\x87\xf4\x04\xed\x67\xf1\xe8\xa8\x0d\x21\xee\x74\x43\x08\x71\xcc\xad\x20\xa1\x62\xff\x73\x94\x4e\x4a\x49\x86\x52\xca\xab\x6f\x28\xab\x45\xb1\xc1\x75\x09\x33\x32\x6b\x46\x59\xbb\x6e\x6d\xbf\xdc\xa3\x6a\x2a\x34\x3e\x3e\xca\xbe\xdc\x4f\x7b\x2a\xce\xe7\x9f\xd1\x7d\x62\xdf\x54\xf9\xc5\x9c\x12\x8d\x59\x3e\xb5\x69\xbb\xb1\x98\x38\x38\xe9\x6e\x62\x39\xe1\x77\x70\x8b\xb7\x4b\x6f\xab\xb3\x2e\xd2\xe5\xd4\xbe\x46\x79\x31\xb5\x33\xa4\xd0\x65\xbf\xa9\xed\xdc\xfa\x98\xed\x87\x76\x3e\x6c\x95\xdd\xbb\x9e\x88\xfb\x3d\x9d\x35\xe7\x0b\xc1\x53\x7a\x8e\x9d\x31\x15\x0f\x3e\x6d\x91\xd7\x8c\xf7\x18\xe7\xc0\xdd\xd7\xdb\xc9\x63\x80\xe3\xd6\x36\xac\xc1\x31\xb6\x8e\xdf\x92\x61\x4e\xad\x91\x41\xaf\xaf\x5a\x9b\xb4\x7f\x34\xb1\x84\xc1\x7e\xad\xc9\xfd\xda\x3f\x0f\x6d\x85\xf9\xa1\x1b\x72\x23\x57\xa2\xa2\xb3\x91\xeb\xc8\x85\x83\x16\x01\x8d\x19\xc4\x7a\x56\x6e\x03\xc6\x32\x60\x07\x1a\xfb\x2f\x7b\x3c\x0c\xe2\xc3\x66\xfd\x7a\xc5\xdf\x06\x8e\xc9\x43\xb6\xc6\x04\x5e\xa4\x45\x5a\x70\x9b\xc0\x58\x8a\x4e\x37\xb1\x39\x9b\x16\xcf\x70\x41\xac\x99\x0d\x58\xb8\x20\x0b\xf7\xb5\x10\x7d\x35\xc4\xbe\x1c\x0a\x7f\xd1\xee\xa0\x8f\x87\x2e\xba\xf9\x7d\xbe\x18\x31\x24\x83\x8f\xac\xa8\xab\x52\x03\x68\x3b\xdc\x1c\xa1\x99\xe9\xe3\x14\xb7\xe8\xb2\x60\x7c\xb9\x5e\x54\x73\x8a\xe8\x08\x13\xe1\xbb\x2d\x9d\x74\xbd\xdb\x43\x60\x4e\xd2\xfc\xf5\xeb\x6a\x96\xdb\xd2\xc2\x4d\x47\x9c\xe7\x08\xb2\xf2\x85\x51\x93\xec\x0b\xdf\x46\x24\xa7\xf3\x2f\x7d\x49\xd5\xf3\x5a\xd6\xf6\x50\x38\x1f\x7d\xa1\x7b\xb4\x7a\x63\xcd\xe0\x37\xe9\xf6\x8a\x28\xfc\x4c\xeb\x81\xcc\x8b\xac\x4a\x27\xb4\xd5\x44\x5c\xde\xa7\xdc\xdd\x78\xdc\x63\x94\x89\x5b\x58\x10\x77\xe0\xe1\xb1\x48\xfd\x4e\x88\x5e\x0c\xb1\x17\x42\xe1\xe7\xed\x6e\x7e\x4f\x68\xda\x25\xfe\x2d\x15\x54\xc5\x50\x6d\xc5\xc0\x82\xae\x95\x94\x9c\x18\x80\x05\xad\x90\xcf\xdc\xac\x10\x0d\x5a\xcf\xe2\xa8\x87\xf9\x28\x25\xe2\x47\xe2\x91\x25\x39\x20\xb2\x77\x4a\x6a\x31\xab\x16\xcb\x8e\xf8\x44\x8d\x68\x7a\xe9\x8a\x52\xb4\x44\x8c\xfa\x9a\x3a\xbe\xaa\x14\x2c\xb1\x56\x54\xfe\x1a\x8d\xac\xe6\x8b\x4a\x21\xff\x46\x6b\x17\xb7\xa2\x46\x94\xac\x70\x7d\x69\xe3\xd2\x13\x92\x75\x94\x40\xb2\xf1\x21\xc3\x39\x49\xca\xa3\xe2\x91\x99\xbc\x98\xce\xae\x1b\xd7\xf4\xda\x27\x73\xdc\x8d\x65\xa9\xce\x12\x2f\x9b\x56\xbe\x12\x8f\xee\x91\xf7\x33\x6d\x3d\x48\x85\x1a\x32\xf5\xd6\x01\x7a\x76\x80\xbd\x79\x20\xfc\x7d\x9b\x2f\x7c\xa1\xff\x29\x53\x3e\xc1\x5f\xa9\x2b\xda\x8d\x48\x4e\xd1\x57\x94\x1c\xdf\x7d\x5a\x95\xf9\x9d\xf7\x42\xd5\x57\x35\xfd\x3a\xef\x0b\xcf\x3b\xbd\x50\x75\x71\xff\x1b\x15\xf3\xd9\x9a\x8c\x25\xf9\x54\x79\x3e\x51\x32\xf9\xac\xa3\x83\x12\x92\x1a\xb9\xfb\xb5\x7a\x97\x6f\x6a\x4d\xc1\x89\x25\x9a\x89\xbb\xba\xd1\x92\x5b\xd8\x3e\x3e\x5b\x08\x5b\x79\xb1\x78\x24\x99\xc9\xa8\x25\xf9\xd9\x77\x1b\x87\x21\xf9\x0c\x43\x91\x31\x73\xe0\x2b\x27\x86\x71\x3c\x32\x94\x52\x32\xd7\xf8\x77\xa9\x98\xe5\x47\x09\x05\xaa\x38\xa8\xaa\xe3\xa4\xc6\xc9\x9c\xfa\x95\x8d\x58\x4f\xb0\x62\xb7\x74\x3c\x32\x34\xab\xe9\xaa\xab\xd9\x48\x46\x31\x32\x4a\x96\x3f\xbd\xd9\x3f\x52\x73\x2c\xda\x33\xa4\xf5\xaa\x69\x70\xd5\x6e\x23\x1e\xbd\xb3\x54\x3d\x6f\xdc\xcb\x91\xe7\xfa\x68\x5e\x2e\x47\x66\x68\x4a\x2c\x47\x4e\xd0\x71\x3a\xd6\xc4\xe7\x63\xa9\xac\x94\xd7\x0c\x5a\xe4\xad\x4d\xb0\x73\x34\x47\x3b\x65\xdf\xaa\xd9\xcd\xb6\x19\xb4\x86\x88\x78\x7f\xd5\x77\xb1\x1d\xb2\x9b\xa8\xb3\xab\x8c\xd4\x1f\xef\xf6\x58\x46\x1c\xa9\xe1\xcf\x0d\x6e\xb0\x46\x05\x0d\xe9\xf8\xda\x02\xd8\xb9\xd7\x56\x34\xc0\xce\xc0\xce\x5b\x8c\x9d\xbb\x94\xda\x05\x92\xea\x8e\x62\xbd\xf4\x0c\x4d\xb1\x64\xf4\x94\x4d\xa4\x1f\xa9\x90\xd2\xf9\x34\xdf\x7e\x65\x1d\xfb\xdb\x41\xba\xd7\x52\xea\x64\xb4\xeb\x25\xad\xc8\x17\x25\xe2\x1b\xae\x1a\xec\xf7\x06\xd9\xe7\x5c\x02\x9c\x47\xa4\xd2\xbb\xba\xd0\xa8\x75\x9a\xfc\xf4\xc7\xee\xe5\x47\x49\xaf\x6b\xd5\x4f\xdd\x1e\x65\xb7\x42\x67\xe4\x84\x3d\x4d\x27\xc5\x84\x3d\x4a\x87\xe9\xa0\xaf\x07\x85\x77\x8b\x98\x8a\x95\x4f\xd9\x92\x72\xa3\x4f\x04\xcf\xce\x38\x1b\xad\x2e\x51\x50\x75\x27\x28\x54\x80\xa8\x3a\x44\xd5\x21\xaa\x0e\x51\x75\x88\xaa\x43\x54\x1d\xa2\xea\x10\x55\x87\xa8\x3a\x44\xd5\x21\xaa\x0e\x51\x75\x5b\x19\x55\x87\xe8\x38\x44\xc7\x21\x3a\xae\x87\xa3\xe3\xbe\x34\xe4\x30\x37\x99\x6d\x4b\x74\x96\x2e\x6e\x95\x7d\x6a\x88\x7d\xc2\x55\x74\x74\xbd\xb1\xa2\xa3\xf3\xbc\x85\x45\xfe\x43\x8b\xaa\x8e\x8e\xb8\xaa\x8e\x3a\x8d\xcf\xe7\x8d\xf2\xac\xa6\x27\x0b\x05\x3b\xa0\xa2\xeb\xa9\xde\x56\xe4\xce\x9a\x0f\xc6\x77\x23\x6c\xc8\x83\x1e\xdb\x28\xcf\xe9\x73\x6a\xa8\xa8\x29\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x5e\xa7\xf0\xde\xff\x08\xd1\xcb\xcd\x48\x6e\x27\xa6\x7d\x7c\x3d\x31\xce\xfe\x20\xc4\x7e\x37\x44\x2f\x73\xfd\xf9\xf2\x7a\x22\x7c\x4f\x4e\x2d\x57\x7e\x60\xe5\xad\xc7\xee\xcf\xa9\xe5\xa4\x73\xec\x72\x22\xb9\x30\x67\x6d\xe8\x5a\x47\xdd\x26\x6b\x1a\x9a\xac\x69\x68\xb2\x91\x86\xd2\x25\x7f\x21\xe8\x93\x92\xc0\x9d\xa7\x79\x41\xe0\x66\x69\x9a\x52\x4d\x10\x38\x57\x07\xcc\xe7\x8d\xb2\x49\xdb\xd8\xbb\x46\x68\x22\x20\xdd\x58\x49\xcb\x96\xd5\xeb\x25\xb1\x9d\xb3\xe2\xe5\xbf\x3e\xcc\xbe\x11\x72\x48\xeb\x83\x1e\x61\xf2\x0b\x5a\xf6\xa2\x79\x5a\xec\x21\xaf\x5c\x62\xae\x03\x5a\x1c\x0d\xff\x34\x9d\x92\x9d\x76\x94\x0e\x8b\x4e\xdb\x4f\x71\x1a\x0d\x14\x23\xba\x6e\x28\x90\x52\xd6\x8f\x35\xbf\xfa\x78\x30\xc4\x8c\xb1\xe1\x6a\x70\xe9\xbe\x01\x37\xe0\x0c\x7f\xd2\x95\x38\xec\x61\xef\x88\x75\x77\x77\x47\x7d\xb2\x84\xb5\xad\xc7\x53\x29\x3a\x4d\x27\xab\xa2\x17\x36\xd8\xe5\x88\x58\x40\x94\x79\x93\x51\xe6\xef\xe9\xdb\xfc\x0b\x3f\x2d\x43\xc6\x4f\xd0\x71\x27\x64\xbc\xf5\x66\xa3\x31\xbb\x50\xcf\xb9\xe1\xbe\x5a\x50\x80\xf7\x37\xee\x70\xcc\xc6\xdd\x76\x5c\xb7\xdb\x52\x98\xd1\xde\x9d\x33\x14\x08\xdf\x46\xf8\x36\xc2\xb7\x11\xbe\x8d\xf0\x6d\x84\x6f\x6f\x38\x7c\xfb\xa7\xea\xc4\xcb\x6d\x7a\x01\x30\x23\x43\xb9\x4f\xd2\x63\xae\x50\xee\x0d\x37\xd3\x78\x90\x76\x6b\xb7\x08\xa9\xbf\x78\x89\xf3\xad\x8f\x05\x04\x5f\xbb\x57\x00\x11\xcf\x4c\x9f\x6d\x59\x00\x20\xc6\xba\xd7\x96\x1d\x88\xb1\x46\x8c\xf5\x16\xc7\x58\x77\x80\x05\xb5\x78\x53\x17\x14\x7e\x5d\xbf\x3e\xb2\xab\xa9\x5b\x22\xb9\xe7\xbf\x7f\x1d\xcd\x79\x20\xe1\x89\x15\xb5\xac\xf8\x22\x4b\x31\x40\xfc\x85\x2e\x94\xb4\xac\x75\x9e\xaa\x1b\xec\xb7\x2f\xb3\xaf\x0d\xd2\x5d\x15\x18\x59\x36\x15\x3e\x24\x65\x05\xba\xe9\x10\xad\x0e\xd5\x3e\x6b\x37\xb9\xa0\x65\x93\x76\x93\xb1\x23\xfc\x34\x37\x6a\x96\xcd\x39\x9f\x52\x9f\x13\xbb\x5c\xfa\x99\x82\x26\x12\x9a\xc8\x14\x34\x91\xd0\x44\x42\x13\x09\x4d\x64\xcf\x68\x22\x53\x5d\xa3\x89\x6c\xf9\x9d\x34\xad\x89\x4c\x41\x13\x09\x4d\x24\x34\x91\xd0\x44\x42\x13\xd9\x79\x4d\x64\xaa\xa7\x25\x8c\x29\x48\x18\xdb\x27\x61\x4c\x75\xbb\x84\x31\xb5\x0d\x25\x8c\xe9\x75\x7a\x8d\xe4\x8d\x17\x69\x51\xf0\xc6\x79\x4a\xd3\xd9\xc6\x4a\x09\x49\x74\x14\xf7\x21\x46\x2d\x49\x8e\x97\x0b\x66\x95\xd3\x2c\xe5\x5b\x58\xc8\xe7\xd6\x5c\xae\x28\xf9\x0c\x14\xfd\x71\xf2\xc6\x6c\xe6\x17\x2b\xa2\xf8\x12\xb5\x63\xf2\x88\xad\x64\x6a\x12\x81\x3d\x4d\xaf\xa2\xe5\x2a\x77\xd1\x2c\x4d\xb7\x62\x2c\xe1\x3a\x82\xd8\xad\x49\xb1\xdb\xc7\x42\xf4\x94\xb4\x30\x0b\x74\x5e\x58\x98\xb3\xd4\xa2\x59\x49\xcf\x48\x11\xdc\x93\xb4\xe4\x88\xe0\x5a\xd7\xfa\x25\xe9\x61\x5f\xa6\x8b\x2e\x0f\x7b\xeb\x9a\x6f\xde\x34\x96\xb4\x4e\x9a\xc6\xd8\x8f\x8d\x79\x9b\xc6\x51\x53\x77\xe1\x12\xb1\x68\xab\xbe\x66\x72\xca\xac\xc2\x52\x63\x26\xa7\xec\xd3\x3b\x6d\x30\xdb\x23\xee\x03\x84\x06\x84\x06\x84\x06\x84\xee\x1d\x08\x8d\xc5\x61\xc0\xe2\xb0\x7b\x28\x3d\x84\xd5\x1d\x11\x56\xc3\x19\x02\x67\x08\x9c\x21\x70\x86\xc0\x19\xd2\xd3\xce\x10\xc4\xd7\x20\xbe\x06\xf1\x35\xed\x8a\xaf\x81\xaf\x11\xbe\xc6\x5e\xf5\x35\xa6\x73\x2d\xae\x0c\x1a\x44\xa3\x1b\xa3\xcd\x35\xf0\x78\xc3\xf8\xf9\x6a\xcc\x1b\x7b\xdf\xc5\xee\x94\x66\xc3\x31\xe9\xb4\x1d\xe3\x03\xbe\x11\xa2\xb0\x8c\x0f\xc8\xa8\xba\xe9\xb5\x55\xad\xe2\x71\xe3\xec\x37\x42\xec\x73\x21\xda\xed\xfe\x2d\x1c\xce\x89\xef\x05\xff\x6a\xd9\xd3\x49\x89\x88\x9e\x8d\xdd\x93\x53\xcb\x53\xae\x83\x93\x0b\x73\x67\xf8\x0f\x5d\x98\x33\x26\xef\x1f\x0c\x79\x5e\x4e\xe5\x33\x34\x23\xa6\xf2\x29\x3a\x41\xc7\x9b\xcb\x19\x23\x1e\xde\x4a\x16\xf3\xfc\x08\x9d\x95\x7d\xad\xaf\x28\x99\xb8\x75\x41\x71\x9b\x56\x8f\xaf\x27\x64\x64\x86\xcc\xce\x9d\x29\xac\x19\x65\x55\xd7\xb5\x82\xba\x92\x2f\xf2\x0f\x97\x9d\x42\xe6\x7b\xc3\xec\xa3\xb7\xd1\xbd\xbc\xa5\xa4\xbb\xa1\xcb\x66\x0b\xe1\x5f\xe9\x33\x6d\x81\x2b\x69\x77\xd1\x5a\x6b\xda\x15\xf4\xe4\x05\x16\xb5\x82\x9a\x92\x17\x68\x49\x12\xef\x51\x67\x8b\x29\xb6\xd1\xe6\x86\x84\xef\x52\x9d\xbd\xf3\x50\x05\x15\x72\xb5\x1d\x8f\xc9\xc7\x5f\xac\x7e\xb6\x65\xf9\x68\xb5\x37\xdd\xe5\xd1\x20\x5b\x92\x08\xdc\x3f\x0e\xea\x86\x2c\x43\x59\x0a\x36\xa1\x8f\xb3\x73\xa6\xc5\xf4\x9d\xb1\x56\xfd\xbf\x9a\x31\x71\xc7\xd7\x4a\xe3\x8b\x44\xe1\x08\x8a\x41\xa2\x70\xf8\x23\xe1\x8f\x84\x3f\xb2\x87\xfc\x91\x48\x14\x8e\x44\xe1\xf0\x03\xc1\x0f\x04\x3f\x10\xfc\x40\x5d\xe1\x07\x4a\x9f\xa2\x13\xec\x78\xf4\x98\xcd\xa9\x1e\x74\x67\xc0\xa8\xdd\xc9\xd5\x26\xc2\x40\xa6\x71\x64\x1a\xdf\x26\xe8\x1c\x99\xc6\xdb\x91\x69\xfc\xfb\x83\xf4\x0a\x2b\xef\xb5\x75\xfc\xeb\xd7\xb4\xb2\x62\xb0\xaf\x0d\xb2\x3f\xec\x77\x92\xa9\xed\xab\x9f\x17\xc6\xda\xfd\x3d\xc1\x4f\x8e\x0d\xf1\x83\x65\x32\xb5\x8a\x1f\xb6\x5b\xe1\xbf\xd7\xf9\xb3\xe5\x19\x09\x02\x4f\xd2\x63\x02\x04\x1e\xa6\x83\x34\x11\x98\x4e\xa9\xa2\x33\x5c\xf9\xc7\x03\xe3\x95\x2e\x04\x33\xbe\x51\x16\xab\x97\x5b\xa9\xe2\xd2\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\x40\x78\xa8\xf5\x07\x02\x07\x02\x07\x02\xd7\x31\x02\xf7\xc1\x51\x3a\xe7\x59\xeb\x6f\x83\x39\x9d\x2d\x3d\xe1\x1f\xee\x63\xbf\xdc\x5f\x53\x21\x30\xe6\x51\x99\xce\x2f\xa3\xc2\x04\x3f\xb6\xa2\x6a\x60\x87\x13\x28\xa4\xaf\xd3\xa2\xa4\x6b\xe7\x68\x4e\xd0\xb5\x29\x4a\xd2\xa9\xc6\xb2\x63\x34\x9f\x18\x23\xa0\x96\xdd\x4a\x30\x82\x3b\xc5\x4e\x6c\x22\x2f\x46\x82\xc2\x1f\xdc\x55\x33\x72\x63\xde\x75\xee\xfc\x06\xef\x90\x79\xf8\x56\x8e\x5f\xea\x49\x5a\xa2\x27\xaa\x32\x06\x6d\x7e\x00\x11\x0f\x8e\x64\x41\x4d\x26\x0b\xfa\x6c\x9f\x4c\x16\x94\x10\xc9\x82\xec\x9c\x3e\x6d\x35\x2b\xed\xb0\x61\x96\xa9\xea\x80\x2d\x0a\x2a\xaa\xf7\xa9\x3d\x35\xa6\x2a\x62\xd7\xd6\xf3\xb3\x4e\x07\x6b\x93\xf5\x74\xdc\x38\xa1\xf4\x1e\x4a\xef\xdd\xba\x19\x22\x10\x1a\x8c\xd0\x60\x84\x06\xb7\xad\xf4\xde\x73\x7d\x2d\x8e\x8f\x5c\x94\xc9\x00\xf9\x22\xc1\x49\x06\xd8\xe6\x98\xcb\xe0\xa2\x7c\x1d\x58\x5f\xa4\x7e\x69\x77\xcd\x02\xe2\x70\x40\xc1\x3e\xbf\x65\xc5\x01\x51\x11\x6a\xab\x56\x15\xa8\xe7\xd7\x6b\x6b\x19\xd4\xf3\x43\x3d\xbf\x2d\xae\xe7\xb7\x35\x88\xac\x13\xfb\xce\xc0\xba\x7f\xd3\x94\x62\xa7\xa3\x27\x6d\xd5\xf3\x5e\xb7\xea\xd9\xe7\x12\xb7\x44\x0d\xc0\xbf\x0b\xd1\x7d\x12\x15\x1b\x99\x2b\x6a\x76\x4d\x8c\xa6\x1d\x6f\x3e\xce\x7e\x2f\xc4\x3e\x1f\xa2\x97\x3a\x3f\xf2\x6f\xea\x3d\x39\xb5\x5c\xe9\x90\x95\xa8\x3b\x76\x5f\x4e\x2d\x2f\xd9\x87\x2e\x27\x92\x0b\x73\x96\xfe\xa7\x75\xba\xcc\xd6\x85\xf9\x97\xe8\x49\x39\xe1\xf9\xd7\x8e\x4f\xf8\x59\x9a\xa6\x54\x73\xd1\xfc\xd6\x73\x36\x92\x4a\x9e\xfd\x56\x1f\xed\x1a\x37\x67\xe8\x38\xfb\x74\x1f\xfb\xd5\x3e\xda\x61\xfe\x77\xf8\xee\x9c\x6a\xc9\x96\xb2\xb6\xcf\x2c\xf6\xb2\x9c\x5a\x9e\xd2\xb2\xb6\x83\x2a\xa0\x13\xf8\x5f\xd2\xaf\xdb\x90\xa2\xb4\xf2\xf9\xcc\xeb\xc6\xe7\x8a\xab\x5a\xe0\xf3\x7c\xe8\x5e\x3a\x64\x49\x7e\x7d\x7c\x0c\x86\xaa\xaf\xe7\xed\x3f\xbe\x69\xdc\x10\xeb\x4a\xf6\x3f\x5e\xc9\xbe\x11\x72\x14\xc1\x8f\x08\x9f\x82\xfc\xcd\x7a\xfd\x9c\xb5\xda\x92\x6c\x23\xf6\x30\x3f\xaa\xba\xae\xb2\xf9\xa3\x5c\xaf\xb6\xd8\x79\xb0\x4c\xc7\x65\x47\x1e\xa4\x09\xd1\x91\xa3\x14\xa3\xe1\x40\x69\xae\x79\x4b\x81\x26\x70\x2e\xd8\x04\x0e\xb2\x47\xaa\xd5\xb7\x56\xeb\x0d\x12\xb6\x9c\x5a\xa6\xf0\x47\x76\x3a\x7d\x3d\x64\x79\x01\x82\xba\xfb\x11\xf3\xc0\x0e\xf6\x78\x8a\xcf\xd8\xc9\xaa\xf5\xe7\x06\xba\x1c\xeb\x4d\x70\xfd\x26\xb9\xfe\x8f\xf7\x6d\xee\x65\x3f\x2d\x9d\x02\xc7\xe8\x88\xe3\x14\x68\xad\xb9\xa8\x4f\xd1\x1b\xb4\x26\xf5\x74\xfd\xd6\x8d\x54\x54\xbe\xdf\x5f\xb3\x91\x0e\xb2\x1b\x51\xcf\xfa\xf7\x6d\xb2\x1a\xd8\x31\xf7\x9a\x05\xc3\x8e\x19\x3b\xe6\x2d\xde\x31\xb7\x79\x5d\x18\xb4\x6d\x6d\xe1\xc2\x31\x7d\x90\x26\xd8\xfe\x68\xdc\xde\xbb\xde\xe5\xde\x01\x9b\x67\xdc\x12\x3b\xde\xef\x84\xe9\x98\x29\x8e\x2a\xe5\x75\x35\x97\x17\x16\xbf\x22\xcd\xda\xb8\x19\x07\xe5\xb1\x5f\xf9\x8f\x61\xf6\x8b\xfd\xc4\xaa\x4e\x35\x97\xd3\x75\xb6\x2e\xc9\x85\x39\xeb\xb3\xf8\xa8\xd0\x42\x55\x36\x20\xb6\xca\xed\xdc\xc1\xdc\xa4\xd7\xca\x99\xfa\x14\x3d\x29\x66\xea\x05\x7a\x9c\xce\x79\xce\x54\xde\xc6\x98\x92\xcb\xe9\x6a\x4e\x29\x6b\xba\xf3\x7d\xaa\xee\x2f\xb9\xf1\xdd\xfc\xaa\x45\x48\xa1\x5e\x17\x3c\x95\x4f\xb0\xe3\x16\x06\xf2\x1c\xb9\x8a\x09\x2d\xa7\xba\xeb\xfe\xc2\x9f\xda\xe5\x39\x6e\xb1\xa0\x6d\x90\x6b\xe8\x86\x2d\x25\x54\x67\x47\x2f\xa5\xd0\x65\xba\x54\xb5\xb6\x68\xed\xf0\x61\xb9\x81\x0d\x53\x93\x1b\xa6\x2f\xf7\xb5\xdd\xb6\x64\xe4\x9e\xea\x19\x7a\xda\xd9\x53\x75\x91\x01\x13\xdb\xae\xb6\x1b\xb0\xd4\x27\x77\x7b\x1a\xb0\x03\x0d\x6f\xcc\x5c\x96\x6c\x50\xba\x37\x3b\x67\xc7\xb0\x3f\xeb\x35\x83\x89\xfd\x19\xf6\x67\x5b\xbc\x3f\xdb\xfa\x55\x6f\xdb\xbf\x0a\xc1\xbe\xcd\x23\x74\x88\x1d\x88\x26\xec\x3d\xda\x2b\xdc\x3b\x3b\xa7\xa5\xf6\x67\x72\x62\xff\xec\x5e\x3a\x2a\xb7\x5e\x2b\x22\x85\xb5\xbf\xb7\xe8\xaa\xb6\x52\xbd\xf3\xfa\xdc\x2b\xd9\x9f\x84\x68\xa7\x38\x53\x28\x83\xeb\xee\xb7\xd2\xda\x4a\xec\x41\x7e\x44\x8a\x1f\xef\xe6\x8f\x69\x6d\xa5\x2d\x3b\xac\x25\x7f\xd5\xf6\x51\x39\x09\x13\x34\x2e\x26\xe1\x08\x0d\xd1\xa3\xbe\x90\x40\x3c\x20\x9f\x65\x69\x6d\xa5\xc1\xbd\xd3\xd9\xe0\x49\xf6\x28\xdb\x6b\x4e\x32\xd1\xbe\x39\x8f\xd2\xda\x4a\x65\xb0\xc8\x4f\xee\x74\xf5\xf0\xde\xa0\x9d\x11\xef\xe4\x87\xcd\x83\x3a\xd5\xcf\xa9\xe3\x74\x8c\x8e\x54\x7d\xc7\x1b\xed\x4f\x7c\xb4\xb1\xcb\x69\x72\x97\xf3\xce\xbe\xe6\x5f\x63\x3a\x21\xf7\x2f\x87\xe9\xa0\xb3\x7f\xd9\xc0\xe9\x41\x1f\x99\x96\xbd\xff\x01\x7b\x9c\xd4\x97\x5f\xe2\x32\x0f\xa3\x0d\xef\x3b\xb8\x9d\x78\x48\x7c\x8d\x3a\x61\x25\xb0\xd3\xe8\x35\xa3\x85\x9d\x06\x76\x1a\x5b\xbc\xd3\x68\xe7\xea\x2f\xd0\x0d\xd4\x32\xfb\x9f\xde\x4f\x71\x36\x1a\x8d\xd9\x7b\x85\x3b\xdc\x7b\x85\xb4\xb6\x72\x4b\x78\x80\xbe\x1e\xa2\x7b\xe4\x36\x44\x66\x1e\x74\xeb\x1d\x5f\x08\xb1\xe7\x43\xb4\x4b\xfe\x50\x57\xeb\xc8\x7f\x10\xd5\x56\x0c\xe8\x1c\xfd\x74\x81\x3f\xb8\x8f\x4e\xc8\x9e\x5e\x2d\x68\x37\xb8\xed\xd3\xb5\x42\xdc\xce\x32\x58\x5d\xd8\x88\x1f\x64\x64\xae\xa8\xd7\x15\x3b\xf5\xc0\x67\x62\xec\xe7\xfb\xe9\x7e\xd7\xe9\x49\xeb\x6c\xbb\x9a\xd1\x03\x1e\x89\x08\x66\x0b\xda\x8d\x25\xd1\x54\x6c\x84\xff\x3c\xeb\xd1\x80\x59\x32\xc8\x39\xb4\xc5\x3b\x42\x7f\x3a\x40\x69\x39\x1e\x53\x94\x14\xe3\x21\xf6\x34\xbe\x36\xc1\xdd\x77\xe6\x33\xc7\x9d\x9b\x6e\x70\x8f\x78\x2d\xd8\x46\x9c\x65\xb3\xa6\x8d\xa8\x37\x5a\xa6\xe9\x70\x6e\xa0\xb6\x98\x4f\xf8\x5f\xed\x0a\x18\xb2\x88\x77\x06\x02\xd7\xa8\x8d\x9a\x47\x6c\xc1\xc0\xa5\x1e\xa7\x73\x34\x57\xb5\x80\x6b\x7e\x80\xb0\x7e\xc3\xa6\xb3\xc9\x4d\xe7\x2f\xf5\xb5\xd2\x52\xd0\x05\xb9\x0d\x3d\x4b\xb3\xce\x36\x74\x53\x0d\x6e\xd2\x65\xd6\x49\x9b\x14\xfb\xf4\x9e\x00\x9b\x74\x97\x9d\x6a\xc0\x65\x86\xf6\xc9\x3f\x6e\x85\x15\x42\x52\x01\x24\x15\x40\x52\x01\x24\x15\x40\x52\x01\x24\x15\x40\x52\x01\xef\xa4\x02\x8d\xad\x20\x82\x57\x07\x8d\xac\x31\x52\x1f\xdb\x1d\xb0\x82\x18\x09\xc8\x35\xe0\x5a\x57\xc4\x04\xba\xe9\xf0\xb2\x02\x64\xbc\xd7\x16\x33\x20\xe3\x20\xe3\x5b\x4c\xc6\xd5\x96\x6e\x61\x83\x3e\x19\x9d\xdc\x52\x6e\x52\x7a\xe3\x34\xdd\x01\xe9\xcd\x37\x07\xe9\x4e\x2b\x42\x5b\x2d\x66\x4b\x5a\xbe\x58\x36\xd8\xef\x0f\xb2\xe7\x5d\xf5\x98\x86\xea\xd7\x63\x9a\xb1\xce\x8b\xed\x75\x6a\x31\xd9\x7f\xdc\x6e\x75\x98\x9e\xf1\xa7\xb3\x49\x39\x61\x27\xe9\xa8\x98\xb0\x13\xb4\x9f\xe2\x81\x41\x3d\x76\x47\xb8\x6b\x30\x9d\x0b\x9e\x8e\xc3\x6c\xb0\x3a\x40\xc7\x6e\xaa\xd2\x39\x1f\x50\xd0\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x50\x7f\x09\xf5\x97\x22\x1d\xaa\xbf\xf4\xfe\x11\x3a\x6f\x26\xd5\x2c\x6b\xba\x92\x53\xab\x85\x8e\xe2\x14\xbf\xd8\xb7\x0c\xb7\xc1\xe2\xb4\x8c\x52\x52\x32\xf9\x72\x5e\x35\xd8\xef\x0d\xb3\x3f\x1f\xa0\x3b\xcc\x1f\x6c\x8f\xd3\x3f\x31\x3f\x7b\xc5\x6c\x7e\x3d\x9f\x5d\x53\x0a\xee\x0e\x51\xec\x25\xe6\xd4\xd2\xdc\x92\x3c\x73\x4a\x36\x79\x33\xee\x72\x95\x4f\xda\x8b\x90\x21\xd1\xdc\x90\xb3\xc3\xae\xd8\x32\x69\x25\xd5\x56\x40\x18\x65\x55\xc9\xc6\x63\x07\xc4\x09\x66\xdb\xa6\xe7\xca\x09\xee\xa8\xbd\xec\x7c\xde\x28\x77\x3b\x18\xbc\x46\x0b\x92\xff\xcd\xd1\x19\xc1\xff\x92\x74\x8a\x4e\x34\xe1\xa3\x12\xb3\x54\x48\x84\x03\xb1\xf5\x5e\x6f\xb4\xb7\x9b\x91\xb8\x31\x59\xb0\x5d\x0d\x86\x89\x29\x76\x5a\x22\xc4\xda\xae\xf7\x75\x7a\x56\xce\x51\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\x44\x60\xc4\x4e\x63\xc4\xed\x17\x59\x0b\x50\x09\x50\x09\x50\xb9\x8d\x40\xe5\x27\x47\xe8\xa0\xa5\x0a\xac\xcb\x24\xab\xb2\x21\xb3\xef\x0d\xb3\x2f\x0c\x38\xc2\xc1\x8f\xf6\x99\xbd\xee\x82\x8f\x45\xcb\x52\x5a\xf2\x41\x33\xcf\x58\x4b\xc8\xe3\xa8\xb3\x2a\x12\x2b\x3f\xf3\x1b\xca\x17\x56\xce\x72\x6f\xa8\x62\x85\xed\x6a\x3b\x1e\xbb\xff\x46\x9d\xd2\x04\x00\x94\x6d\x2d\x51\xe3\xaf\x9a\xbd\x21\x55\xb3\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x00\x90\x9d\x05\x90\xbd\x52\x12\x0a\xd8\x12\xd8\x12\xd8\x72\x1b\x61\xcb\xb7\xf6\x53\x54\xea\x2b\x33\xaa\x6e\xb6\xa2\x1a\xd5\x22\x4b\x26\xd2\x38\xd1\xdd\xee\x63\x6c\xe1\xa4\x6f\x5a\xcf\x68\x4e\x2d\x4f\xb9\xce\x30\x45\x8d\xc8\xf0\xe9\x9d\xe1\xf3\x3d\x23\xb4\xbf\x21\x82\x5c\xd2\xb2\x36\x3d\xfe\xd6\x30\x7b\xc1\x45\x8f\x3f\xdc\x08\x3d\x5e\xd0\xb2\x5d\x41\x8e\x5f\xe9\x49\x8e\x17\xb4\x2c\xa8\xf1\x46\x0a\x58\x4a\xd4\x7b\x75\x26\x18\x2b\x47\x59\xa4\x1a\x2b\x2f\x68\xd9\xca\xb4\xc5\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x20\xc6\x9d\x25\xc6\x75\xcb\xc7\x2c\x68\x59\xd0\x62\xd0\x62\xd0\x62\xd0\xe2\x8e\xd2\xe2\x8f\x3d\x40\x69\x49\x8b\x95\x52\x5e\x7d\x43\x59\x2d\x8a\xd1\xaa\xc6\xc5\x99\x35\xa3\xac\x5d\xb7\x1a\x74\x53\xb1\xca\x3a\xb4\x5f\xb9\x9f\xbd\x79\x80\x5e\x5e\xd1\x96\x8d\x95\x0f\xd5\x2d\x4a\x3b\x25\x2e\x61\xed\x4b\xa7\xed\x4b\xc4\x0e\xf3\xd3\x92\xee\x16\x4d\xec\xec\x77\x46\x5b\x2a\xd8\xbe\xb3\x8f\x6e\x48\x44\x58\xa2\xa2\x40\x84\x57\x68\x95\xb2\x7e\x88\xd0\xb9\xd9\x31\x27\x79\xaa\xbb\x6c\xb2\xab\xaf\xad\x4c\xae\x7e\xcf\xb3\x89\x4a\x22\xa2\xba\xd1\xeb\x83\x39\xe2\x79\x36\xef\x94\x59\xae\x99\x06\x26\x59\xf4\xbd\xbf\xda\x1a\x47\xbf\x4a\x7e\x93\xe0\x68\x50\xdd\x5c\xdf\x79\x70\xcc\x3c\x73\xab\xa7\x42\xea\x8d\xf4\x06\x5a\xaf\x4a\xd4\xdd\xa1\xa9\x80\xa4\xde\x28\x97\xd4\x64\xb9\xa4\x77\x84\xb6\xce\x80\xfd\x9f\xb2\xb6\xd2\x1a\x19\x4e\x6d\xa5\xee\x31\x9f\x9d\xb7\x8f\x41\xa5\x84\xff\xe9\x4b\xfd\xcc\x67\xb2\xe1\xba\xc2\xbe\x76\xf4\x88\xc8\xbf\xbd\x95\x56\x14\xa5\x16\x7a\xcd\x2a\xa3\xd4\x02\x4a\x2d\x6c\x71\xa9\x85\x6e\x5e\xc0\x07\x16\x31\xee\xfc\x27\x2a\x3d\x43\x53\x2c\x19\x3d\x65\xc3\xa7\x47\xdc\xb8\xca\xaf\x9d\x0e\x14\x6b\xf8\xb3\x10\xbd\x52\xee\x58\x8b\x6a\xf9\x86\xa6\x73\x03\x60\x6d\x57\xd9\x67\x43\xec\xd7\x43\x44\xce\x2f\xe1\x70\x4e\x14\xcd\x5a\xd5\xf4\xeb\xf6\xc6\x5f\x91\xa2\x89\xd8\xcb\x73\x6a\xf9\xbc\x7d\x68\x72\x61\xee\x0c\xff\x73\x17\x2a\x98\xf2\x74\x5e\x4e\xdd\x33\x34\x23\xa6\xee\x29\x3a\x41\xc7\x9b\x53\x30\x89\x67\x0c\x94\x2e\xfd\xc8\x7d\x34\x27\x7b\x59\x16\xe0\x1a\x5f\x4f\xd4\x11\x2f\x65\xf3\x86\xbe\x26\x4c\xd3\xca\x5a\x36\xa7\x96\xab\xb1\xc0\x67\xc2\xec\x7d\xfd\xb4\x4b\x36\x75\x79\x3d\x11\xde\x5f\x17\x05\x2c\x68\xd9\x69\xbb\xc5\x94\x68\x31\x36\xce\xcf\x90\xa5\xbc\xaa\xb4\x45\xd5\x87\xb6\x65\xfb\x9f\xa5\x39\x39\x02\x29\x3a\x2d\x46\x60\x92\x8e\xd2\x61\xdf\xba\x17\x66\xa1\x35\xbe\x40\xa8\xbd\xc1\x40\x73\xf0\xea\xe0\xb7\xfd\x30\x3b\x68\xbe\xed\xf2\x52\x8e\xf8\xa7\xe6\x6a\x15\xf1\xa5\xf5\x51\x41\xf8\xcd\xbb\xdc\xa3\x74\x20\x68\xaf\xee\x35\x50\x13\xe6\x49\x5b\x36\x56\xa9\x79\x4a\xd3\xd9\xaa\xd5\x5d\xd3\x83\x85\xb5\x1d\x76\xdc\x4d\xee\xb8\x3f\xd9\xd7\x4a\xa3\x71\x5e\xee\xa1\xf9\x17\xc0\xde\x43\xb7\xd3\x08\x05\x94\x27\x6e\xcc\x46\xb9\x6d\x4f\xa3\xf6\x2a\xf5\xde\xdd\x6e\x23\xf4\x58\xc3\x3b\x5e\x2f\x6b\xb4\x5f\x2c\xa0\xb6\xc4\x16\x61\x97\xdb\x6b\x96\x10\xbb\x5c\xec\x72\xb7\x78\x97\xdb\xd1\x75\x6a\xe0\xb6\xb5\x7d\x0b\xd9\xf4\x69\x3a\xc9\x1e\x8b\x4e\xda\xdb\xd3\x87\xaa\xd4\x14\xd5\x67\xdf\x0a\xea\x0a\xf6\xf9\x18\x1d\x97\xbb\x32\x7d\x45\xc9\xc4\xad\x11\x11\xaf\x51\x8d\xcb\xb6\xb0\x66\x94\xb9\x6d\x2c\x38\x99\x89\xde\x11\x63\x3f\xdd\x4f\xf7\xf2\x93\x93\xee\x73\x6d\xbc\xfc\xa0\xd8\x97\x55\x81\x64\xd9\xd0\xa2\x56\x50\x63\x43\xfc\xf7\xc5\xea\xd3\x2d\x7c\xec\x1c\xd8\xe2\xdd\xd7\x65\x9a\x96\xb3\xfa\x04\x1d\x17\xb3\xfa\x10\x1d\xa0\x84\xef\xac\x16\x9d\x63\x43\x19\xe7\xae\x36\xeb\x48\xcd\x07\x4f\xe7\x59\x36\xed\x97\x4a\xdc\x77\xc8\x2c\x36\xe3\xba\xd1\xf0\x3f\xec\xac\x37\x4c\x0f\x5b\x1b\x33\xff\x91\x8a\x99\x87\x74\x7c\xb0\x52\x7c\x85\x3a\x55\xb5\xec\x68\x66\xb4\xb0\xde\xc0\xce\xab\xc9\x9d\xd7\x87\xfb\x5a\x64\x30\xe6\xe4\xa6\x8b\x7f\x4c\xed\x4d\x57\xc7\x6d\x8f\xd8\x6f\x35\x66\x7b\x9a\x30\x35\x35\xe6\x2a\xf6\x2b\x7b\xea\xd9\x9e\xbb\xcd\xaa\xfe\x4a\x85\xb9\x19\x91\x7f\xed\xbc\xb5\xb9\x48\x8b\xb4\xe0\xb6\x36\xb1\x14\x9d\x6e\x62\x8b\x33\x2d\xee\xff\x82\x58\x31\x18\x30\x3d\x41\xa6\xe7\x6b\x21\x12\x11\xc4\xe1\x2f\xda\x1d\xf4\xf1\xd0\x45\xb7\xc0\x2e\x5f\x8c\x18\x52\x24\x17\x59\x51\x57\x65\x00\xa0\xad\xb6\x75\xa2\xcc\x4c\x81\xb3\xb8\x45\x97\x69\xe1\x8b\xde\xa2\x9a\x53\x44\x47\x98\x1a\x3b\xb7\x09\x92\xba\x7b\x7b\x08\xcc\x39\x99\xbf\x7e\x5d\xcd\x72\x23\x57\xb8\xe9\x44\xe6\x39\xd1\x58\xf9\xc2\xa8\x29\xbd\x13\xe2\xc3\x48\x4e\xe7\xdf\xd0\x92\xaa\xe7\xb5\xac\x2d\x21\x74\x3e\xa7\x22\xe8\xd1\xea\x8d\x35\x83\xdf\xa4\x5b\xb6\xa8\xf0\x33\xad\x07\x32\x2f\xb2\x2a\x15\xe8\x56\x13\x71\x79\x9f\x72\x8f\xe0\x71\x8f\x51\x26\x6e\x61\x41\xdc\x81\x87\xa4\x30\xf5\x3b\x21\x7a\x31\xc4\x5e\x08\x85\x9f\xb7\xbb\xf9\x3d\xa1\x69\x57\xa0\x6f\xa9\xa0\x2a\x86\x6a\x87\x0b\x2c\xe8\x5a\x49\xc9\x89\x01\x90\xcc\xa3\x22\x62\xd0\x7a\x16\x27\x52\x98\x8f\x52\x22\x7e\x24\x1e\x59\x92\x03\x22\x7b\xa7\xa4\x16\xb3\x6a\xb1\xec\x44\x9e\xa8\x11\x4d\x2f\x5d\x51\x8a\x56\x04\xa3\xbe\xa6\x8e\xaf\x2a\x05\x2b\x52\x2b\x2a\x7f\x8d\x46\x56\xf3\x45\xa5\x90\x7f\xa3\xb5\x17\x5a\x51\x23\x4a\x56\x68\x53\xb5\x71\x29\x55\xcc\x3a\x61\x40\xb2\xf1\x21\xc3\x39\x49\xc6\x46\xc5\x23\x33\x79\x31\x9d\x5d\x37\xae\xe9\xb5\x4f\xe6\xe8\x81\xcb\x32\x34\x4b\xbc\x6c\x5a\xf9\x4a\x3c\xba\x47\xde\xcf\xb4\xf5\x20\x15\xa1\x90\xa9\xb7\x0e\xd0\xb3\x03\xec\xcd\x03\xe1\xef\xdb\xbb\xf4\x2f\xf4\x3f\x65\xc6\x4e\xf0\x57\xea\x8a\x76\x23\x92\x53\xf4\x15\x25\xc7\xf7\x70\x85\x82\x2a\x2c\xb1\xf3\x5e\xa8\xfa\xaa\xa6\x5f\xe7\x7d\xe1\x79\xa7\x17\xaa\x2e\xee\x7f\xa3\x62\x3e\x5b\x93\x51\x6e\x7f\xf8\x3c\xcd\xaa\x99\x7c\xd6\x09\x82\x12\xf1\x34\x72\x0f\x69\xf5\xae\x21\x7c\x5a\xe2\x57\x2b\x62\x26\xee\xea\x46\x2b\xd6\xc2\x16\xe1\xda\x51\xb0\x95\x17\x8b\x47\x92\x99\x8c\x5a\x92\xdf\x63\xb7\x71\x18\x92\xcf\x30\x14\x19\x33\x07\xbe\x72\x62\x18\xc7\x23\x43\x29\x25\x73\x8d\x7f\x6d\x8a\x59\x7e\x94\x08\x3f\x15\x07\x55\x75\x9c\x0c\x70\x32\xa7\x7e\x65\x23\xd6\x13\xac\xd8\x2d\x1d\x8f\x0c\xcd\x6a\xba\xea\x6a\x36\x92\x51\x8c\x8c\x92\xe5\x4f\x6f\xf6\x8f\x0c\x38\x16\xed\x19\xd2\x7a\xd5\x34\xb8\x6a\xb7\x11\x8f\xde\x59\xaa\x9e\x37\xee\x75\xc2\x73\x7d\x34\x2f\xd7\x09\x33\x34\x25\xd6\x09\x7c\xbd\x70\xac\x89\xcf\x87\x84\x87\xb4\xc8\x5b\x9b\x60\xe7\x68\x8e\x76\xca\xbe\x55\xb3\x9b\x6d\x33\x68\xe1\xd0\xd8\xca\xa0\x81\x0f\x7f\xe0\xe2\xe1\x6a\xc4\x7b\x8d\xb2\x8b\xed\x90\x23\x42\xa9\xf7\xed\xae\xb7\x76\x88\xd5\xb0\x5c\xff\x0d\xcc\xb0\x60\x08\x1d\x5d\x50\x80\xd8\xf6\xda\x32\x06\xc4\x16\xc4\x76\x8b\x89\x6d\xa7\xd8\x56\x20\xac\xed\xdc\x0e\x33\x7d\x94\x0e\xb3\x83\xd1\x09\x1b\xbd\xde\x53\xa1\x2d\x72\x4e\xed\x80\x9c\xe8\x87\x47\x68\xdc\xca\xd1\xe3\x23\x70\x51\x8b\xd9\x92\x96\x2f\xda\xaa\x16\xf6\xc5\x61\xf6\xd5\x90\x93\xa2\xe7\x7e\x0f\x68\x3a\x63\x9d\x13\x7b\x80\xff\x5a\x9d\x12\xc7\xfe\xb9\xc5\xa0\xf4\x55\x74\x42\x4e\xa6\xc3\x74\x50\x4c\xa6\x38\x8d\x52\xcc\x77\x32\xf1\x27\xe0\x5f\x0b\xfb\x76\x36\x4b\x48\xcf\x05\xcf\xa1\x61\x36\x28\xa7\x88\x73\x51\x0f\x2f\x71\x34\x4a\xe1\x0f\xee\x74\xfa\xf8\x21\x6f\xe2\xe9\x74\x73\xc4\x3c\xa0\x43\x3d\x9d\x3a\x4d\x27\xe9\xb1\xaa\x4f\xf5\x86\xba\x1a\x1f\x67\xe0\xcd\x26\xf1\xe6\x4f\xf6\x6d\xf6\x35\x4f\x49\xae\x79\x9c\x8e\x39\x5c\xb3\x73\xa6\x42\x00\xcd\xc6\x4c\x45\x75\x76\x2b\x6f\xa3\x11\xfb\xde\x1d\x8e\xa9\xd8\x63\xee\x36\x1d\xdb\xf0\x90\xfc\x4b\xa7\x4c\x03\x90\x24\x90\x24\x90\x24\x90\x24\x90\x24\x90\x64\x6f\x22\xc9\x40\x4e\xd8\xd2\xaf\x7f\xea\x2b\x2f\x71\xbe\xfe\xc3\x01\x88\xd1\x59\x15\x3c\x58\xf2\x4a\x56\xda\x86\x45\x01\xb0\x62\xaf\x2d\x45\x80\x15\x81\x15\xb7\x18\x2b\xb6\x9d\x04\x05\xf2\xc4\x56\x9a\xf8\xf4\x61\x3a\xc8\x26\xa2\xfb\x6d\x62\xf8\x72\x37\x31\xb4\xcf\xb9\x25\x44\x9e\x3f\x1a\x93\x44\xd2\x15\x7a\x27\x15\x9d\x25\x2d\x6b\xa8\x99\x35\x3d\x5f\xbe\x29\x7e\xc9\x3b\xc2\xce\x3f\x1d\x61\xff\xa6\x9f\x5e\x66\x47\x4d\x48\x77\xdb\x23\x1e\x60\x72\x41\xac\xea\x45\x23\x72\xf1\x11\x8b\xba\x23\xeb\xc4\x89\x35\xc7\xb4\x98\x52\xe6\x36\xb4\xc4\x71\x44\xca\x12\x7a\xd7\xdc\xdd\x66\xa1\xe5\x33\xc1\x13\xf5\x18\x3b\xe2\xa3\x52\xae\xba\x95\xda\x54\x38\xdf\xdd\x59\x33\x2e\x43\xde\x30\xb3\x76\x68\x1e\xad\x8a\xa5\xeb\xc4\xe8\xa4\x2e\xd0\xe3\x74\xae\x6a\xb5\xb0\x99\xe1\xc1\x72\x01\xa0\xb3\x49\xd0\xf9\x1f\x37\xb6\x19\x0a\xb6\x14\x4f\x48\xee\x99\xa6\xb3\x0e\xf7\xdc\x32\xe3\x23\x30\x68\x63\xc6\xc7\x4f\xab\x11\x60\x8d\x62\xef\xdd\x53\x63\x7c\xc2\xb6\x7e\xb3\xd6\xde\x3c\x22\x7f\xeb\xa8\xb9\x01\x2d\x05\x2d\x05\x2d\x05\x2d\x05\x2d\x05\x2d\x6d\x37\x2d\x0d\xfe\x9a\x6f\x9c\x96\x6e\x7e\x85\x10\x4c\x4b\xdb\xba\x43\x49\xfd\xeb\xdd\x35\x8b\x84\xfd\x01\x14\xb5\x76\xe9\xb0\xb7\x22\xd0\xbe\xdd\x2b\x07\x20\xd5\x5e\x5b\xaf\x00\xa9\x02\xa9\x6e\x31\x52\xcd\xf9\x5a\xf2\xd6\x7e\x84\xac\xef\x42\x5b\xad\x7e\x20\xbf\x4d\x9f\xa4\xc7\xd8\x64\xf4\xa8\x8d\x4e\x1f\xa8\x8a\xb0\xaf\xbc\x42\x07\xa4\x9a\x7f\x3b\x42\xf3\xc1\xd1\xef\xf5\x2b\x2d\x56\x84\xc3\xbf\x67\x84\x7d\x7f\x80\xee\xf6\x8a\x57\x08\xff\x6c\x23\x75\x17\x17\x35\x3e\xc3\xba\xa0\xf0\xe2\xe0\x0d\x9f\x60\x09\xc7\xb1\xd9\xd2\x50\x89\x5e\x2a\xc3\x78\x29\xf8\x35\x9c\x64\x47\x1b\xd4\x45\x57\x0b\xa2\x51\x9e\x11\xe5\x19\x51\x9e\x11\xe5\x19\x51\x9e\x31\xa8\x5b\x50\x9e\x11\xe5\x19\x51\x9e\x11\xe5\x19\x51\x9e\x11\xe5\x19\x51\x9e\x11\xe5\x19\x5b\x5d\x9e\x31\x41\xe3\x6c\x2c\xba\xcf\xc6\x1d\x7b\xdc\xb8\xc3\x3b\x18\x75\xfb\x89\xcb\x50\x9f\x11\xf5\x19\x51\x9f\x71\x1b\xd5\x67\x7c\x7e\x84\x8e\x5a\xe1\xe9\x75\xc1\x66\x49\xcb\x96\xd5\xeb\x25\xb1\xef\xb1\xf8\xe6\xbf\x1c\x61\x7f\x36\xe0\x84\x46\x7c\xa2\x11\xa4\xb9\xa0\x65\x2f\x9a\xed\x74\x05\xd9\x94\x4b\x84\xea\x28\x0d\xd7\x5d\x82\x69\x36\xc1\x34\x1f\x0f\x66\x9a\x31\x36\x5c\xad\xcd\x76\xf5\x3a\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\x26\x18\xe6\x56\x32\xcc\xba\x79\xf5\x5c\xbb\x37\xa0\x4c\xa0\x4c\xa0\x4c\xa0\xcc\x8e\xa2\xcc\xef\x87\xe8\x21\x29\xdf\xcc\xe6\x8d\x8c\xc6\x0d\x72\x75\xcd\x22\xf6\xc5\x10\xfb\xc3\x10\xdd\x69\x1f\x60\x07\x24\xdc\x93\x53\xcb\x95\x2b\x01\xf9\x1c\xb1\x87\x72\x6a\x79\xda\x3a\xdc\x0c\x3c\x48\x2e\xcc\x59\x9b\xcf\x16\xa6\x71\x69\x59\x35\xdf\x12\x3d\x29\x89\xe0\x79\x9a\x17\x44\x70\x96\xa6\x29\xd5\x5c\x35\x5f\xeb\x39\xe7\xf3\x46\x20\x16\x64\x7f\x19\xa3\x73\x8d\x96\x8f\x6a\x44\x3f\xfb\x93\x31\xf6\xce\xba\xe5\xa4\xee\xf1\x48\x40\x60\x55\x27\xf2\xaf\x23\xd5\x26\xcd\x6a\x53\x19\x52\x2b\xd2\xed\xb6\xa2\x86\xd4\x4a\x30\x79\x3d\xc5\x4e\x34\xa9\x26\x35\x53\x0e\xfc\xb7\xba\xc5\xa3\xc2\xde\xd9\x07\xc4\xb8\x8c\x05\x54\x8d\x6a\xe7\xd0\x6c\x38\xa5\x6a\xcd\xd8\x20\x8a\x06\x99\x06\x3a\x94\x52\xb5\xd6\x2e\x6c\x3c\xa5\x6a\x2b\x6d\x8b\xc8\x25\xd0\x98\x6d\x69\xb6\x3e\x9d\xb8\xc3\xd8\x47\xeb\x16\x87\x7a\xa9\x9d\x5c\x40\x98\x93\xd1\xfa\x55\xa1\xda\x6a\x4d\x90\x57\x00\x79\x05\x90\x57\x00\x79\x05\x90\x57\x00\x79\x05\x7a\x33\x0b\x6b\x63\xcb\x81\x7a\x3b\x89\x56\x54\x84\xfa\x57\x75\x2b\x42\xed\x0d\x48\x34\x20\x96\x11\xfb\xea\x96\x82\x6a\xd7\x2a\x02\x39\x06\x7a\x6d\xed\x82\x1c\x03\xc8\x31\xb0\xbd\xd2\xb6\x6e\x7c\x0b\x19\x98\xb6\xb5\x03\x80\xaa\x37\xb4\xf6\xec\xff\xbe\x44\xfb\x24\x6e\x35\xca\x9a\xae\xe4\xd4\x6a\xc6\x6a\xfe\x39\x53\x50\x0c\x43\x35\xd8\x3b\x2f\xb1\x9f\x19\xa4\x3b\xcc\xbf\x3a\x45\x13\xa5\x5c\x43\x37\x1d\xcd\xd6\xda\xdb\x12\xec\x2e\xc9\xc3\xa7\x78\x23\xb1\x07\xf9\xb1\xe6\x5f\xcc\xcf\xa3\xfb\xf7\x2e\xd7\xca\xa6\xa0\x23\x85\x8e\x34\x05\x1d\x29\x74\xa4\xd0\x91\x42\x47\xda\x33\x3a\xd2\x54\xd7\xe8\x48\x5b\x7e\x27\x4d\xeb\x48\x53\xd0\x91\x42\x47\x0a\x1d\x29\x74\xa4\xd0\x91\x76\x5e\x47\x9a\xea\x69\x69\x65\x0a\xd2\xca\xf6\x49\x2b\x53\xdd\x2e\xad\x4c\x6d\x43\x69\xe5\x46\x0b\xea\x58\x38\xca\x02\x87\x6e\x44\xd4\x88\x90\xf0\xea\x83\xde\x10\x71\x07\xbb\x8d\x0f\x1d\x5d\xbd\x1c\xcc\x10\x1f\x63\x93\x26\x43\xac\x84\x63\x26\x38\x74\xdf\x52\x2d\x40\x8c\x7e\x64\x57\x2d\x27\x7b\xb9\xfc\x2c\x45\x94\x4a\x24\x66\x7e\xad\x3a\x00\xc5\x24\xc3\x3a\x47\x73\x74\xa6\xca\x6b\x73\x84\x0e\x35\x35\x18\x70\xd9\x40\xd0\xd6\xa4\xa0\xed\xcd\x21\x3a\x2b\x6d\x42\x92\x4e\x09\x9b\x70\x8c\x9a\x9d\x86\xf4\xb8\xd4\xb6\xcd\xd2\xb4\xa3\x6d\xdb\x44\x73\xe7\xa5\x33\xfc\x0c\xcd\xb8\x9c\xe1\x9b\x68\x2f\xc8\x5c\xb5\xdb\x1c\xd5\xb1\x87\x25\xcd\x28\x53\xec\xeb\xa3\xb5\xe6\xea\x61\x53\xfb\xe0\x12\x92\x68\xab\x95\xa6\x2b\x26\x0f\xa9\x34\x5d\x53\xf6\xf1\x6d\x34\x62\xed\x11\xcf\x81\xec\x82\xec\x82\xec\x82\xec\xf6\x0e\xd9\xc5\xfa\x2d\x60\xfd\xd6\x3d\xe8\x1b\xc2\xe5\x8e\x08\x97\xe1\x61\x80\x87\x01\x1e\x06\x78\x18\xe0\x61\xe8\x69\x0f\x03\xe2\x57\x10\xbf\x82\xf8\x95\x76\xc5\xaf\xc0\x81\x07\x07\x5e\xaf\x3a\xf0\x36\xe8\x0c\xdb\x7c\x98\x55\xdb\xe9\x72\xcc\x9b\x2e\xdf\xc5\xee\x94\xe6\xc2\x31\xe5\xd4\x7a\x11\xfb\xa7\x5f\x4b\x87\xac\x04\xd4\x7e\x39\x41\x54\x9b\x2a\xf3\x45\x95\xce\x6f\x47\x37\xd8\xb3\xaf\x65\x1f\x1e\x74\xb2\x4f\x1f\xa8\x2f\x63\x5f\x74\x1a\x99\xb2\x1b\x89\x8d\xf0\x93\xaa\x93\x3f\x7b\x1e\x0a\x69\x3b\xa4\xed\x90\xb6\xc3\x01\x02\x07\x08\x1c\x20\x70\x80\x74\x8d\x03\xa4\x7b\xf8\x3e\xc0\x33\xc0\x33\xc0\x33\xc0\x33\xc0\x73\x4f\x83\x67\x90\x31\x90\xb1\x1e\x25\x63\xdb\x52\xda\x7e\x45\x8a\x4f\xf7\x0b\xf1\x69\xe8\xc2\x39\x76\x92\x1e\xa3\x49\x5f\x9d\x68\x46\xd3\xd5\xf8\x7a\x22\xee\xc9\x88\x5a\xa2\x6d\x7f\x2a\x18\xf7\x1d\x64\x13\xd5\xa5\xb3\x3c\xef\xa7\xa2\x88\x56\xf4\x93\xbb\x1c\x58\xf6\xa0\xad\x65\xf7\xe6\x62\xfb\xe4\xef\x9d\x25\x63\x12\x64\xcd\x53\x9a\xce\x56\xe9\xdb\x8f\xd2\xe1\xe6\x46\x04\x02\x29\x08\xdc\x9b\x14\xb8\x3f\x1b\xa2\x39\x69\x19\x52\x74\x5a\x58\x86\x49\x6a\x7a\x1e\x4a\x49\x7a\x42\x48\xd2\x6d\x85\xfb\x66\xda\xbb\x20\x25\xee\x67\x69\xd6\x25\x71\xdf\x4c\x83\x41\x66\xab\x5d\x66\x29\x50\xdb\xfe\xad\x51\xc7\x6c\xc5\x3c\x35\xed\xde\x26\xec\x90\x3c\x56\x9a\x30\x47\xd4\xde\x59\x63\x06\x9d\x3b\x30\x2f\x30\x2f\x30\x2f\x30\x2f\x74\xee\xd0\xb9\x43\xe7\x0e\x9d\x3b\xdc\x0d\x70\x37\xc0\xdd\x00\x77\x03\xdc\x0d\xd0\xb9\x43\xe7\x0e\x9d\x3b\x74\xee\xf0\xe6\xc1\x9b\xd7\x85\xde\xbc\x8e\xeb\xdc\x1b\x23\xcc\x6e\x76\xdc\x18\x6d\xde\x90\xbe\x7d\x1b\xa6\x81\xff\xce\x30\x9d\x92\x69\xe0\xd5\x37\x94\xd5\xa2\x98\x9e\x76\x0a\x78\x31\x79\xfc\x84\xf5\xf9\x62\x4e\x57\x45\x6a\xf8\x4f\x0e\xb3\xcf\x0e\x10\x73\x1a\xb0\xd3\xc8\x18\xe6\x62\xb7\x98\xcd\xaf\xe7\xb3\x6b\x4a\xc1\xed\xc6\x55\xec\x8d\xe5\x9c\x6c\x2a\xee\x5a\x3a\x4c\xda\x8b\x8e\x21\xd1\xc6\x90\x03\x75\x2b\x28\x9d\x56\x52\x6d\x30\x60\x94\x55\x25\x1b\x8f\xed\x13\x27\xcc\xd8\x77\x53\x53\x89\xc5\xbc\xdc\x7c\xde\x28\x77\xb9\x30\x3f\x7d\x8d\x16\xe4\x6b\x34\x47\x67\xc4\x6b\x94\xa4\x53\x74\xa2\x89\xd7\x48\x38\xd2\x67\xf8\x3e\x30\xf0\x55\xda\xeb\x3d\xe3\x77\x33\x12\x37\x26\x1d\xcd\xcb\xc1\xef\xdb\x01\x96\x30\xdf\x31\x67\x66\x98\xef\x9a\x39\x02\x1e\xc5\x17\x10\x89\x80\x48\x84\x34\x5c\x54\x70\x51\xc1\x45\x05\x17\x55\xcf\xb8\xa8\xd2\x5d\xe3\x81\x69\xf9\x9d\x34\xed\x1a\x48\xc3\x35\x00\xd7\x00\x5c\x03\x70\x0d\xc0\x35\xd0\x79\xd7\xc0\x36\x44\x19\xe9\x9e\xc6\xad\x69\xe0\xd6\xf6\xe1\xd6\x74\xd7\xe3\xd6\x6d\x18\x3c\xc1\x9e\x1b\x96\x15\x28\xc7\xd7\x03\x48\xa3\x64\x3b\xec\x5f\x0e\xb3\x7f\x3f\xe0\xc8\x79\x5f\xdf\x18\x5b\x14\xcc\xab\x45\x64\xf1\x41\x71\x42\x75\x5c\x83\xb8\x02\x60\xa2\x37\x4c\x3c\x13\xcc\x09\x1f\x61\xd1\x6a\x16\x2f\xdb\xae\x50\x7a\x37\x42\x25\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x41\x0f\x6f\x1d\x7a\xf8\xed\x61\x3a\x27\x85\x8b\x4a\x96\x2f\x96\xf3\x5a\x51\x57\x73\x79\xfe\x5e\x0a\x8c\x22\x73\x18\x3b\x6c\x51\xec\x4a\x15\xbe\x16\xba\xa1\xae\x5c\xd1\xb4\x6b\x15\xbb\x4b\x83\x7d\x60\x98\xfd\xc4\x6d\xf4\x4a\xcf\xc6\x2e\xaf\x27\xc2\xff\xa2\xaf\x31\xde\xb8\x6c\x5f\xe7\x29\x79\x9d\x29\xf7\x75\x5a\x04\x22\x4f\x8a\x13\x92\x5e\xf7\xba\x9c\xa8\x7f\x07\x00\x95\xde\xa0\xf2\x8d\xc1\xa0\xf2\x29\xf6\xa4\xc4\x93\xf5\x7b\x98\x3c\x54\xc6\xf5\xe6\x28\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x26\xd8\x66\x57\xb2\x4d\x90\x47\x90\x47\x90\xc7\x1e\x26\x8f\xef\x1d\xa6\xc3\x26\x79\xe4\x9b\x2e\x2f\xe6\xe8\x0e\x9f\x36\x77\xfd\xf9\x8c\x6a\xb0\xaf\x0f\xb1\x2f\x0e\xd0\x3d\x55\xe7\xd9\xe1\xd2\xeb\x8d\x21\xc6\xe4\xc2\xdc\x92\x6c\xb1\x45\x38\x71\x44\xe2\xc4\xca\xbb\x32\xc3\xa6\x9d\x8b\x81\x1c\x6e\x22\x5e\x5a\x0d\xc6\x8b\x29\x76\xda\xa2\x85\x9e\xf3\xaa\x36\x5a\x5a\xd2\x48\x67\x84\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x3b\x06\x09\x7f\xf7\x3e\x9a\x91\x90\x30\xa3\xea\x66\x2b\xaa\xe1\x52\x25\xba\xff\x9c\xcf\x15\x45\x36\x45\x69\xa7\x65\xec\xf3\x9b\xc6\x0d\x91\xf9\x92\xbd\xf5\x3e\xf6\xf9\x7e\xba\xc3\x7d\xfc\xe5\xf5\x44\xf8\xb0\xae\x2a\xd9\x88\x3c\xc6\xea\x74\xe7\x0b\x3c\xe5\x1c\xbd\x24\x5b\x5f\x94\xad\xc7\x12\xfc\x3c\xd7\xcf\xc6\x72\xc2\xf7\x60\x99\x7b\xb3\xb5\x55\x8d\xd2\x25\x5f\xa0\x46\x4f\x4a\x76\x77\x9e\xe6\x05\xbb\x9b\xa5\x69\x4a\xf9\x57\xa4\x72\xf7\xeb\x7a\x22\xee\xfb\x14\x16\xa7\x2b\x04\x23\xb8\x39\x76\xc6\x44\x70\x1e\xa3\x66\xe2\x36\xdf\xeb\x54\xc6\x2b\x3f\xe0\x4d\x05\x6f\x67\x03\x39\xb5\x4c\xe1\xcf\xed\xaa\x1d\xd2\x63\xba\x5a\x2a\x28\x19\xb5\x89\x51\x3d\x68\x9e\xba\x85\x03\x9b\x7a\x15\x2d\xd3\xc5\xaa\xda\x7b\x2d\x19\x40\x14\x70\x41\x1d\xbe\x26\xeb\xf0\xfd\x66\x5f\x9b\x8c\x0a\x3d\x2d\x6b\xf2\x2d\xd1\x13\x4e\x4d\xbe\x56\xb5\x1d\xe4\x71\xf0\xb7\x2d\xa5\xb5\x32\x35\x68\xe8\x36\x62\xcd\xea\x18\xc5\xd4\x6f\xef\xae\xb5\x64\xa9\x92\xa2\xf3\x8d\x3a\xdf\xdc\x8a\xcf\x6a\x13\x26\x6d\xa2\x24\x92\x6d\x6c\x8d\x41\xbb\xaf\xba\xa1\x31\x71\x37\xfb\xf8\x3f\x27\xef\x77\xff\x78\x5d\xd5\x73\xaa\xfb\xd7\x41\xf7\xaf\xc2\x85\xa3\xe6\xf2\x99\xb1\x9a\xe3\x2a\x5a\xe1\xff\xbe\x69\xfe\xca\xef\x32\xc5\xa7\x6b\xba\xca\x98\x4e\xd2\xd1\x26\x3c\x59\x0b\xc2\x51\x00\x13\x1a\x60\x42\x3f\xd6\x4f\x1f\xe9\x67\x1f\xea\x0f\xbf\xdf\xf6\x9c\xbd\xa5\xbf\x77\x4c\x68\x15\x5b\xe1\xfd\x2c\x7c\x05\x82\xff\xf1\xc9\xe9\x78\x0c\x87\x7d\x26\xee\x88\x80\xe6\xd2\xb5\xa4\x14\xc4\x99\x45\xad\x38\x26\xcf\x16\x47\x08\xd7\xa2\x11\x19\x4e\x1b\x5a\x71\x41\xba\xce\x1e\xe7\xaf\x85\xf9\xef\x25\xeb\x65\x71\xfe\x38\xe2\x6f\xdb\x53\x2f\xf6\xd1\x0b\x7d\xec\xf9\xbe\xf0\x67\xec\x6d\xc1\x07\xfb\x66\x35\xbe\xcb\xcd\x1b\x91\x9c\x26\xba\x5d\x8b\x44\x57\xf9\x9f\xa2\x91\x64\xc5\x53\x88\x0d\x9f\x2c\xa0\xb5\x66\x38\x4e\x82\x31\x25\x23\x1e\x5c\xb8\x5e\x0a\xf9\x8c\x59\x19\x43\x2d\x64\x8d\x88\x76\xc3\xec\x53\xe9\x9a\x28\xa9\x5a\xa9\xa0\xc6\x23\xf2\x8a\xc2\xd7\x69\x8d\xa5\xd8\x78\x79\x76\x80\x7d\xf9\xe8\x6d\xe2\xb6\x2a\xfc\x76\xa5\x76\x7d\xab\x82\xbe\x27\x0f\x79\x7f\x4f\x76\xb2\xdb\xc5\x5d\x37\xfa\x45\x69\xf0\x8b\x11\xf4\xe1\x49\xcf\xd2\x34\x4b\x45\x4f\xdb\xd1\xa3\x8f\x8a\x97\xce\xb4\x00\xbe\xe7\x45\x07\xf8\x61\x6d\x4d\x96\xff\xbe\x18\x1d\x92\x9b\xba\xa2\x5a\xbe\xa1\xe9\xfc\xcd\xae\x16\x7d\x98\x69\xf1\x33\x05\xc5\x30\xac\x3c\x56\x6f\x62\xdf\x18\x61\x3f\xde\x4f\xcc\x39\xcd\xd6\x7c\x3c\x24\xf6\x71\x95\x1f\x45\x33\x3d\xfa\x14\x6f\x23\xf6\x30\x3f\xe0\xbc\x7d\xa2\x29\xcb\x70\x1f\xd2\xe2\x0d\xda\x2a\x9d\x93\xd3\x70\x9a\x52\x62\x1a\x3e\x46\x75\xbe\x3c\x71\x57\x57\x98\xcf\x14\x77\xdf\xdc\x26\x16\x33\x7c\xa3\x74\x75\x25\x78\xea\x9d\x62\x27\x2a\xd2\xca\xcb\xeb\xd6\xa8\x25\xcc\x29\x59\x33\x74\x14\xfe\xde\x4e\xcf\xa1\x89\x5a\xfb\xb1\x3a\xa3\xf3\x88\x79\x4c\x07\x07\x68\xa3\x6b\x83\xa0\x11\xc2\xda\x00\xdb\xab\x26\xb7\x57\xff\xa1\x4f\xea\xad\x12\x42\x6f\x65\xef\x83\xda\x63\x30\x5a\x6a\x96\x2c\xeb\xd3\x98\x79\x69\xdc\x96\x78\x18\xa2\x80\xed\x5a\xec\x03\x7b\x3c\xad\xcf\x2b\xcc\xb2\x56\x4a\xb1\xd2\xe2\xec\x95\x7f\xef\xa4\xc1\x69\x4f\x21\x72\x98\x9d\x00\xb3\x83\x62\xb8\x1d\x29\x86\x8b\x2a\x88\xa8\x82\x88\x2a\x88\xed\xaa\x82\x98\x7e\xae\xaf\xc5\xa5\xe0\x16\x79\x6b\x13\xec\x1c\xcd\xd1\x4e\xd9\xb7\x6a\xb6\xdd\xe5\xe5\x3a\xb1\x4c\x88\x78\x2f\x13\x76\xb1\x1d\x72\x28\x28\xf5\x63\xbb\x3d\x57\x0a\xfb\x6a\x68\x6b\x9d\x0d\x4b\x54\x6c\xe9\x3b\xb4\x7a\x00\x46\xed\xb5\x35\x0b\x30\x2a\x30\xea\x16\x63\xd4\x0e\xf3\xab\x40\x78\xda\x81\x6f\x47\xfa\x18\x1d\x61\x87\xa2\x07\x6c\x64\xfa\x4a\x37\x32\x75\x1f\xda\x01\x4a\xfa\xed\x11\x7a\x3c\x88\x92\x36\x56\x59\xd4\xa2\xa7\x3f\x33\xc2\xfe\xe9\x6d\x9e\x9f\xbe\x8f\x9a\x59\xb9\xdc\x71\x72\x45\x6b\xbf\xa0\xad\x46\x78\x5f\xb5\xb4\xbc\xe8\xa8\x23\xe9\x15\xdb\x13\x53\x00\x9a\x2f\xab\xd7\x1d\x23\x36\x54\x21\x0f\x77\xb5\x1d\x8f\xc9\xcb\xd5\x7c\x7e\x6b\x8a\x93\x22\xd0\xae\xf6\x4d\xbb\x14\xfc\x22\x4d\xb2\xa3\x8d\xbd\x37\xb5\x78\xb8\xce\x8b\x2c\x9e\x1b\xc1\x75\x08\xae\x43\x70\x1d\x82\xeb\x10\x5c\x87\xe0\x3a\x04\xd7\x21\xb8\x0e\xc1\x75\x08\xae\x43\x70\x1d\x82\xeb\x10\x5c\xd7\xe9\xe0\xba\x83\x34\xc1\xf6\x47\xe3\x36\xec\xb8\xcb\x03\x76\xd4\x72\x0e\xd4\x24\x40\xd0\x1f\x82\xfe\x10\xf4\xd7\xc6\xa0\xbf\x9f\x1e\xa6\x03\x92\x7c\xea\x2b\x4a\x26\x6e\x11\xac\x3a\xc9\xc1\x74\xad\xa0\x1a\xec\x2f\x87\xd8\x57\x06\xe8\x5e\x7e\x52\xd2\x7d\x8e\x8d\x39\x4b\x8d\x25\x06\x5b\xd4\x0a\xad\x4a\x09\x76\x48\x9c\xb0\x58\x7d\x47\x26\xae\xe4\x17\x9a\xcf\x1b\xe5\x59\x4d\x4f\x16\x0a\x36\xbc\x04\xb5\x6c\x36\x3d\x58\x63\x3e\x02\x13\x6d\xfa\x4e\x2e\x13\x71\xf2\xd1\xa9\xe5\x9b\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc0\x97\xc8\x0d\x06\x4c\x08\x4c\x08\x4c\xd8\x29\x4c\xf8\xdf\x87\x29\xc2\x87\x6e\x7c\x3d\x31\x6e\x49\xc0\x8b\xe5\x75\xad\xb0\x76\xdd\xd1\x3c\xfe\xe7\x61\xf6\x77\x21\xda\x91\xd1\x74\xf5\xf2\x7a\x22\xbc\xd7\x23\x4c\x7c\xc1\x3e\x77\x59\x9c\x1b\x0b\x8b\xdc\x5e\x9a\xae\x2e\x27\xaa\x7f\x6b\x71\x8c\xf8\x65\x9a\x96\x20\xed\x04\x1d\x17\x20\xed\x10\x1d\xa0\x84\x7f\xaa\x02\x4d\x57\x85\x88\xbe\xea\xae\x02\xe1\xd9\x62\x30\x17\x1b\x67\x63\x12\x7b\xd5\x34\xee\x91\x8f\x20\x1a\x0d\xcc\xcc\xf5\xfc\x4e\xa7\xd7\x07\xbd\x23\xc0\x6b\x3a\xfe\x01\x2b\xfd\x56\x07\xfa\x3e\x75\x86\x66\x68\xaa\x2a\xa6\xa1\x99\xce\x47\x30\x03\xe2\xbe\x9b\x8c\xfb\xfe\x70\x5f\x8b\xde\xff\x39\x19\x3d\x9e\xa2\xd3\x4e\xf4\xf8\x96\x9a\x12\xc7\x4e\x34\x60\x54\x82\x22\xbb\xbf\x73\x87\x63\x4a\xee\xb5\xc2\xb9\x6b\xad\xc7\xfd\xf2\xa7\x8e\x18\x0f\x84\x72\x23\x94\x1b\xa1\xdc\x08\xe5\x46\x28\x37\x42\xb9\x37\x1c\xca\xfd\xb3\xad\xfa\xec\xa7\x65\x08\xf7\x14\x25\x5d\x21\xdc\x6d\xfa\xee\x07\x86\x55\x37\xb8\x32\xf0\xde\x4d\xf8\xac\x12\x52\xff\xef\x4b\x9c\x4f\xff\x78\x40\x7c\x76\xcd\x82\xe0\x3e\x99\xfa\xb2\xcd\xeb\x01\x04\x67\xf7\xda\x2a\x04\xc1\xd9\x08\xce\xde\xe2\xe0\xec\x4e\x81\xa3\xc0\xa8\xec\x36\x6c\x07\xd3\x27\xe8\x38\x3b\x16\x3d\x62\x4b\x8c\xef\x77\x0b\x93\xab\x4f\xed\x40\x24\xf6\x67\x47\xe8\xa8\x55\xa9\xb4\x64\x8c\xaf\x27\xfc\x22\xae\x8d\xb2\x52\x56\x57\xd7\x0a\x86\x6a\x97\x1f\x60\x3f\x34\xc2\xbe\x15\xa2\x1d\xfc\x4c\xfe\x11\x7b\xd0\x03\x40\x2e\x99\xa7\x2d\xa9\xe5\x98\xc8\x63\x99\x2c\x95\x8c\x65\x57\x30\xb3\xeb\x80\x16\x03\xc8\xa7\xe9\x94\x9c\x47\x47\xe9\xb0\x98\x47\xfb\x29\x4e\xa3\xbe\xf3\x88\x3f\x85\x95\xee\xc5\xbc\xa1\xcd\x26\xa6\xbc\x10\x3c\x81\x46\x59\xcc\xae\xe8\x59\x32\xcc\x29\xe4\xbe\x05\xf7\xec\x09\xff\xd2\x4e\xa7\xb7\x1f\xf6\x06\x8f\xee\x0e\xb7\xb2\x53\x76\xac\xcf\x53\x29\x3a\x4d\x27\xab\xbe\xd7\x1b\xec\x74\x7c\xa3\xc1\x1c\x9b\x64\x8e\xef\xe9\xdb\xfc\x2b\x3f\x2d\x71\x23\xff\xf6\xd8\xb8\xb1\x93\x86\x43\xa4\xe7\x6f\xb5\xe1\x88\x3d\xbb\xc7\x31\x1c\x77\xdb\x98\xd1\x6d\x2b\x1e\x96\x7f\xed\x9c\xa9\x00\x66\x04\x66\x04\x66\x04\x66\x04\x66\x04\x66\x6c\x26\x63\x64\x27\x73\x3c\xb6\x36\x3d\xa5\xb5\x08\x68\xf5\x57\xbe\x81\xf4\x90\xdf\x7c\x89\xb3\x0e\x88\x05\x30\x47\xf7\xea\x40\xee\xdb\x3b\xb2\x38\x00\x73\xec\xb5\x25\x09\x98\x23\x98\xe3\x16\x33\xc7\x0e\xb0\xa2\xc6\xac\xbd\x87\x0b\xc9\xc7\xf2\x07\xf2\xcb\xf4\x51\x3a\xcc\x0e\x46\x27\x6c\xd6\x78\x8f\x9b\x35\xba\x9a\xba\x15\x12\x21\xb0\x37\xf7\x4b\xc5\xa4\xc1\xff\x47\x57\x73\x79\x61\xff\x2b\xa2\xaa\xc7\xd9\x1f\x87\xd8\x1f\x85\x88\x55\x1d\xc1\x3f\x86\xf7\xe4\xd4\x72\x65\x84\x82\xd4\x7e\xc6\x22\x39\xb5\x9c\xac\x3c\x7e\x39\x91\x5c\x98\xb3\xa2\xe2\x5a\x98\x0a\xb9\xa6\xa1\xc9\x9a\x86\x26\x1b\x69\x68\x83\x55\xa2\xea\x7c\xc0\x5c\xcf\x39\x9f\x0f\xae\x12\xc5\xbe\xfc\x0c\x0d\x5a\xb2\x55\x3f\x8e\xac\x66\x74\xb5\x6c\xb0\x5f\x78\x86\xfd\xf5\xa3\x8e\x03\xf4\x11\x19\xcb\xa4\x9b\x51\x18\xd6\x06\xc6\xca\xcf\xb9\x24\xce\x8a\x85\xf9\x51\xd2\xe9\xe9\x5a\x85\x88\xdf\xba\x3c\xae\x3c\x85\xd0\x6a\x84\x56\xa7\x10\x5a\x8d\xd0\x6a\x84\x56\x23\xb4\xba\x67\x42\xab\x53\x5d\x13\x5a\xdd\xf2\x3b\x69\x3a\xb4\x3a\x85\xd0\x6a\x84\x56\x23\xb4\x1a\xa1\xd5\x08\xad\xee\x7c\x68\x75\xaa\xa7\x23\xa1\x53\x88\x84\x6e\x5f\x24\x74\xaa\xdb\x23\xa1\x53\xdb\x30\x12\x3a\xfd\x6a\x7f\xa7\xdc\x49\x09\xb9\x8e\xd0\x21\x01\xb9\xc6\x69\x8c\xf6\x05\xca\x44\x25\x2d\x9a\xcf\x1b\x65\x0b\xcc\x3e\xe8\xcd\x51\x77\xb0\xdb\x64\xe2\xbd\xb3\xc1\xe0\xf6\x51\xb6\xb7\x5a\x06\x2a\xaf\x53\xe1\x9f\x8b\xbe\xe0\x8a\x1b\xbe\x43\x7e\x69\x22\x8a\xc5\xb6\xee\x97\x7f\x68\x33\xdd\x92\x30\x4a\xf8\x2f\xab\x5c\x5c\x23\x34\xd4\x60\xe7\xc1\xa3\x05\x85\x5e\x93\x0a\xbd\x3f\xec\xa3\x49\xf9\xd6\x1e\xa0\x84\x78\x6b\xf7\x51\xe3\x13\x4f\x3a\x69\x12\xc2\x49\x63\x8b\xf3\x36\xd4\xc0\x69\x29\x1a\x38\x46\x47\x5c\xa2\x81\x0d\xb5\x10\xe4\xe6\xf1\xb7\x26\x25\xad\x71\x6b\x52\x2f\x92\xc8\xbc\x91\xd8\xa7\x46\x1d\x6b\x72\x9f\x29\xd4\x70\xa9\x5e\xb4\x55\xcb\xb2\x0c\xba\x83\x87\xa7\xec\x23\xda\x6c\x63\xda\xa3\xef\x03\x41\x05\x41\x05\x41\x05\x41\xed\x1d\x82\x8a\xc5\x56\xc0\x62\xab\x7b\x10\x33\xb4\xd5\x1d\xd1\x56\x83\xe4\x83\xe4\x83\xe4\x83\xe4\x83\xe4\xf7\x34\xc9\x47\x88\x0d\x42\x6c\x10\x62\xd3\xae\x10\x1b\x38\xca\xe0\x28\xeb\x55\x47\x59\x3a\xd7\xda\x80\xaf\x40\x68\xdc\x32\x17\xd3\xd5\x98\x37\x7e\xbe\x8b\xdd\x29\xed\x82\x63\xb3\x69\x3b\xaa\xfc\xbf\x71\x3f\x3d\x65\xaa\xfc\xd7\xca\x9a\x91\x51\x0a\xf9\x62\x6e\x7c\x7d\x42\x16\x4c\xf3\x91\x9c\x8b\xce\xd6\x8a\x65\xa5\x50\xd2\xb2\xd6\x79\xaa\x6e\xa5\x31\x11\xa9\x4d\xd6\x0c\xf6\xb6\xfb\xd9\x17\xfb\xe9\x2e\x57\xc3\x97\xcd\x86\xc3\x07\x45\x66\x13\x79\x9c\x35\xdf\x9c\xa5\xf8\x59\xbb\xfd\x05\x2d\x9b\xb4\xdb\x8f\x9d\x10\xf9\x4e\x9c\xe6\x96\x65\x6b\x0e\x77\xf7\x39\x51\x4e\x9a\x16\x67\x43\xd1\xe9\x29\x39\xa5\x17\xe8\xbc\x98\xd2\x67\x69\x96\xa6\xfd\x23\x5c\x9c\xdb\x8e\x9b\xbd\x10\xf7\xb9\xdd\xc0\xd9\x9d\x0b\x9e\xdd\xd3\x2c\x65\x45\xbb\x38\x17\x36\xa7\xb9\xdf\x65\x9d\x79\x2f\xef\x2f\x30\x6d\xf3\xff\xb3\xcb\x7b\x74\x8f\x58\x99\x54\x36\x3a\xc0\xa7\xad\xfc\x2a\xdd\x31\xc6\xa9\xa7\xe9\x55\xb4\x5c\xe5\xd6\x6d\xd1\x20\x03\x43\xc2\xe7\xdb\xa4\xcf\xf7\xf3\x7d\xed\x33\x3d\xcf\x48\x87\xf0\x93\xb4\xe4\x38\x84\x3b\x67\xd8\x02\xb2\xb8\x74\xca\xee\xa5\xfe\x68\xb7\xb7\x61\x3b\x5d\x13\xe1\xbd\x51\x0b\x77\x52\xc6\x7d\x6f\xbd\x7d\x43\x54\x78\xaf\xd9\x53\x44\x85\x23\x2a\x7c\x8b\xa3\xc2\xb7\x70\xcd\x1c\x98\x9c\xb2\x53\x1f\x97\xf4\x34\xa5\xd8\xe9\xe8\x49\x7b\x97\xb8\xd7\x1d\x45\xee\xd3\xcc\x2d\x11\x51\xfe\x0f\x21\x2b\xa2\xdc\xbf\x54\x37\xfb\xfd\x10\xfb\x9d\x10\xdd\x59\x53\x97\x3b\x1c\xce\x09\x0e\xb9\xaa\xe9\xd7\x6d\x4c\xa1\x44\xc4\x78\xc4\xee\xcf\xa9\xe5\x9a\xba\xd9\xc9\x85\xb9\x33\xfc\xd7\x2e\x8c\x27\xcf\xd3\x79\xf9\x1e\x9c\xa1\x19\xf1\x1e\x9c\xa2\x13\x74\xbc\xb9\x78\x72\xf1\x8c\x81\x81\xe4\xff\x6b\x84\x0e\x07\x97\x49\x1f\xcf\x14\xd6\x8c\x32\xff\x64\x15\x9c\xaa\x48\xcf\x8d\xb0\x77\xf4\xd3\xdd\x5e\x95\xd2\x3d\x33\x94\x4e\xc9\x36\x16\xb5\x82\x1a\x8b\xf2\xdf\x3d\x2a\x9a\xbb\x8e\xd9\xda\x24\xa5\xa2\x37\xd6\x13\x71\xd7\x0d\x6d\x36\x49\x69\x36\xd8\x90\x24\xd9\xa9\x06\xeb\x8a\xbb\xef\xab\x22\x73\xe9\x17\x77\xfa\x0c\x89\x4f\x1a\x53\xf7\xa8\x3c\x6a\x1e\xd2\xc9\x81\xd9\x70\x26\x53\x8f\x91\xc1\x1a\x0f\x7b\xe6\x0e\x65\x32\xf5\xb2\x0b\x1b\xcf\x64\xda\x5a\xeb\x22\xf6\xc0\x1d\xb1\x2e\xb1\x0f\xef\xf1\xb1\x2e\x4e\xae\x53\xb7\x41\x79\x44\xfe\xb5\xa3\xf6\x04\xe9\x4e\x91\xee\xf4\xd6\x95\xe4\x41\x8b\x01\x2d\x06\xb4\x18\x48\x77\x5a\x2f\xdd\x69\x47\x96\x02\x0d\xe4\x40\xfd\xe1\xdd\x3e\x8b\x85\xa0\x84\xa8\xee\x25\xc4\x5e\x81\x61\x3a\xb5\x82\x00\xfd\xee\xb5\x75\x0b\xe8\x37\xe8\xf7\x96\xe7\x44\xf5\xfd\x3e\x6c\x76\x6f\xda\x30\xe5\xee\xc8\x37\xa3\x7e\xa2\x54\xd7\x59\x1d\xa8\xc7\xf4\xc9\x11\x9a\x6a\x00\x7c\x0a\x61\x9c\x1b\x7f\xae\x70\x73\x59\xcc\xd9\x14\xf4\x2f\x87\xd9\xbb\x6f\xf3\xf9\xce\xfd\x4a\x9f\xa9\xab\x73\xf2\x3d\xf0\xf7\x5c\x6e\x10\xac\x8c\x9b\x6e\x8e\x25\xdb\x8e\xbb\xd6\xe3\x93\xf6\x4a\x7e\x48\xb4\x35\xe4\x44\xad\x56\x84\x21\x6a\x25\xd5\xde\x66\x19\x65\x55\xc9\x8e\x3a\xe1\x1a\x62\x6b\x62\x8a\xfb\xf3\x65\xf5\xba\x63\xbc\x86\x2a\x22\xac\x5c\x6d\xc7\x63\xb1\x1b\xc1\xdf\x5d\xf3\x7e\xbb\x3c\x23\x68\xfa\x1a\x2d\xc8\xd7\x68\x8e\xce\x88\xd7\x28\x49\xa7\xe8\x44\x13\x9f\x54\x91\xc1\x63\x66\x5d\x2d\x06\x47\xa7\xfb\xbf\x70\x37\xe4\x0b\x77\x2d\xf8\x85\x3b\xcb\x66\x37\xfe\xc2\x99\x63\x52\xf9\xde\x21\x27\x2a\x72\xa2\xa6\x11\xd1\x8f\x88\x7e\x44\xf4\x23\xa2\xbf\x67\x22\xfa\xd3\x5d\x13\xb0\xde\xf2\x3b\x69\x3a\x92\x3a\x8d\x48\x6a\x44\x52\x23\x92\x1a\x91\xd4\x88\xa4\xee\x7c\x24\x75\xfa\x14\x9d\x60\xc7\xa3\xc7\x6c\xfe\xf1\xa0\x0f\xff\x30\x37\x71\xed\xc7\x20\xe9\x9e\x0e\x3e\x4d\x23\xf8\xb4\x7d\xc1\xa7\xe9\xae\x0f\x3e\xdd\x86\x59\x5a\xd9\x5b\x2f\xd1\x70\x40\xe1\x1f\xb5\x98\x2d\x69\xf9\x62\xd9\x60\x5f\x7c\x86\x7d\xd7\x55\xfa\x67\xa8\x7e\xe9\x9f\x19\xeb\xbc\xd8\x03\x5e\xd5\x7f\xec\x9f\xbb\x1c\xf7\xa1\x00\x10\x60\x17\x0a\x00\x01\x76\x01\x76\x01\x76\xf5\x10\xec\xea\xa2\xec\x8c\x5d\x03\xbb\x90\x36\x10\xb0\x0b\xb0\x0b\xb0\x0b\xb0\x0b\x05\x80\x90\xd7\xec\xd6\x41\x4b\x5d\x9f\xd7\x6c\x5b\x16\x00\x7a\x86\x92\x52\x26\x35\x49\x47\x85\x4c\x6a\x82\xf6\x53\x3c\xb0\x5c\x87\xcd\x85\x1a\x29\x5c\x7d\xf5\x5c\xb0\xec\x69\x98\x0d\x56\x27\x60\xb3\xaf\x51\x29\x41\x0f\x28\x28\x14\xfd\xb2\xab\x0c\xd0\x1e\xb3\x0c\x90\x43\xb9\x1e\xf2\xae\x03\xd4\x7a\xce\x25\xb1\xd4\x69\x3a\x49\x8f\x55\x29\xbb\x47\x29\xd6\x78\xff\x42\xcb\x8d\x28\xd7\x26\xa3\x5c\xbf\xda\x47\x27\xe4\xbb\x7d\x98\x0e\x8a\x77\x3b\x4e\x1b\x9a\x7b\x94\x92\x31\xae\xc7\xe9\x98\x13\xe3\xba\xd1\x36\xa6\x64\x64\xcd\x63\x34\xe9\x8a\xac\xd9\x68\x23\x9b\x2d\x0b\xd4\x4a\x03\x14\xfb\x9c\xab\x32\xd0\x83\x9e\x95\x81\x1c\x73\x33\x12\x54\x1c\xa8\x5d\x86\x07\xf5\x81\x00\x58\x01\x58\x01\x58\x01\x58\x51\x1f\x08\xf5\x81\x90\x8c\x00\xf5\x81\x00\xfa\x01\xfa\x01\xfa\x01\xfa\x01\xfa\x5b\x02\xfa\x91\x93\x06\x39\x69\x90\x93\x06\xf5\x81\xe0\x47\x83\x1f\x6d\x9b\xd7\x07\xda\x40\x55\x9f\x06\x49\x72\x3d\x7e\xec\x50\xe6\xed\x98\xb6\xf9\x6f\xee\xa5\x93\x66\x89\xa0\x52\xc9\xa8\x23\x48\x37\xca\x4a\x59\x5d\x5d\x2b\x70\x1b\x65\x97\x02\xca\x28\x05\x95\xfd\xdc\xbd\xec\x7b\x21\xda\xc1\xcf\x17\x02\x75\x59\xfd\x87\xff\x54\x5b\x39\x61\xc9\x6c\x65\x49\x2d\xc7\x1e\x11\x05\x7f\x4a\x25\xc3\xed\xb8\x73\x1d\xb0\xc4\x9b\x68\x71\x02\xe1\xd7\xd0\x69\x39\x15\x8f\xd1\x11\x31\x15\x13\x34\x4e\x63\x8d\xe5\x28\x4f\xc4\xc5\x1d\x05\x4e\xbf\x85\xe0\x29\x35\xc6\xf6\xf9\xe6\x1a\x97\x17\xa9\x70\x91\x06\x54\xea\x79\x7e\xa7\xd3\xfb\x31\xbb\x3a\x4f\xf0\x00\x0c\x59\x05\x79\x3a\x3a\x06\xa9\x29\x4a\xd2\xa9\x2a\x1f\xea\x46\x07\x01\x1c\x0f\x6e\xd4\x26\xdd\xa8\xef\xed\xa3\x19\xe9\x07\x3d\x49\x8f\x39\x7e\xd0\x16\x1a\x82\xcd\xdb\x98\x06\xd3\x05\x37\x66\x69\x3c\x3e\x56\x7e\x56\x27\xf5\xdd\x97\x38\xa6\xe4\x40\x6d\x3d\x9c\x60\x9b\xf2\xa8\x2c\x81\xd3\x31\x8b\x82\x5c\x7f\xbd\x66\xd8\x90\xeb\x0f\xb9\xfe\xb6\x38\xd7\x5f\x27\x56\x91\x81\xc9\xfe\x5a\xbe\xcc\x4c\x4f\xd0\x7e\x16\x8f\x8e\xda\xdb\x97\x3b\xdd\x81\xed\xe2\xf8\x5b\xa2\x52\xcd\x67\x47\xe8\xb1\xca\x2d\x8f\xcc\x0f\xe8\xb3\xf1\xc9\x2a\xea\x75\x6e\xf3\xec\x6d\x0f\x7b\x76\x84\xfd\xc9\x80\xf3\x9d\xfc\xf9\x46\x12\x04\x4e\x8b\x56\x96\xd4\x72\x57\xe4\x05\x7c\xf0\x86\xd7\x57\xda\xbe\xc7\x2e\x0f\x0e\xee\xce\x5c\x80\x8f\x07\xbf\x8f\x31\x36\x6c\xbd\x8f\xa5\x92\x61\xbe\x88\x76\xaf\x23\xdb\x1f\x02\xa0\x91\xed\x0f\xfa\x3c\xe8\xf3\xa0\xcf\xeb\x55\x7d\x1e\xb2\xfd\x21\xdb\x1f\x74\x51\xd0\x45\x41\x17\x05\x5d\x54\x57\xe8\xa2\xd2\x87\xe9\x20\x9b\x88\xee\xb7\x01\xc7\xcb\xdd\x50\xc4\xde\xbb\xdd\x0a\x60\x04\x69\x04\xa1\x51\x41\x1a\xc1\xed\x13\xeb\xcd\xfe\x65\x3f\xed\x35\x41\xa6\x77\xe1\x13\x51\x93\x7c\x9c\xfd\x59\x88\x7d\x25\x44\x2f\x57\xaa\x2a\x9b\x88\x5f\xc3\xf7\xe4\xd4\x72\xe5\x7a\x40\x3e\x4f\x6c\x6f\x4e\x2d\x57\x55\x0d\x11\x67\x24\x17\xe6\xac\x6d\x68\x0b\x83\x1c\x5b\x56\x7d\xbb\x44\x4f\x4a\x36\x78\x9e\xe6\x05\x1b\x9c\xa5\x69\x4a\x35\x57\x7d\xdb\x7a\xce\x46\x82\xe2\xd9\xc7\x5e\x42\x93\x0d\x8c\x86\xa1\x16\x56\x8d\x35\xf1\x2d\xd0\xd7\x0a\xaa\xc1\x37\x98\xea\x0d\x83\xfd\x0d\x45\xff\xf4\x36\xbf\x41\x32\xa3\xdc\x23\x4a\x64\x49\x2d\xac\x2e\xc9\xd3\x17\xf9\xe9\x8b\xe2\xf4\xd8\x7e\x79\x80\xd7\x78\x79\x9f\xd1\x62\x4d\xc7\x6b\xe8\xd5\xf4\x54\x95\x17\xf4\x0c\xcd\xd4\x73\x89\xb8\xba\xc8\x7c\xcc\xb8\xf7\xad\xa6\x3f\x11\xa2\x57\xc9\x31\x7d\x82\x2e\x88\x31\x9d\xa3\x56\x35\x4e\x97\xa4\x16\x60\x99\x2e\x3a\x5a\x80\x16\x36\xff\x5a\x19\x2e\xfd\x14\x3d\xe9\x0a\x97\x6e\x61\xfb\x9b\x8d\xa4\xd6\x82\xa9\xf5\x3c\x4b\x3b\x5e\x24\xbf\xe2\x35\x3e\xb7\xe7\x42\xda\xe2\x31\x28\x0d\xff\x76\x7d\xff\x76\x1a\xc2\x1d\x1f\xe1\x4e\xcb\x1d\x81\xbf\x3a\x42\x17\x6c\x8b\x6d\xb9\x47\xc7\xd7\x27\xf8\x4c\x9d\xa8\xef\x14\x14\xaf\x01\x7f\xfa\x42\x49\xcb\x5a\x67\xab\xba\xc1\xfe\x62\x98\x7d\x77\x80\xee\x72\x35\x78\xd9\x6c\x30\xfc\x16\xd3\x4f\xc8\xa7\xf7\x7a\x3e\xbb\xa6\x14\x2a\x5c\x86\x36\x42\x3a\x6b\xb7\xbd\xa0\x65\x93\x76\xdb\x2d\x71\x1c\xc6\x63\x8f\x49\xd7\x9f\x73\x7f\xcb\xf2\xf6\x1c\x37\xa0\xcf\xf5\xf9\x47\x10\x8e\xc1\x5a\x0b\x9b\x0b\xb6\xa0\xd3\x2c\x25\xad\xa4\x4f\xd7\xba\xcc\xa4\x1c\x0c\x2f\x9d\xd6\xd5\xbd\xde\xa6\x7c\x37\x23\xd1\x03\x22\x5b\x0e\xdc\x86\x70\x1b\xc2\x6d\x08\xb7\x21\xdc\x86\x70\x1b\xc2\x6d\x08\xb7\x21\xdc\x86\x70\x1b\xc2\x6d\x08\xb7\x21\xdc\x86\x1d\x76\x1b\xc2\xfd\x07\xf7\x1f\xdc\x7f\x70\xff\xb5\xd1\xfd\xf7\xfe\x4b\xb4\xbf\xa1\xd0\x6d\x5d\x15\x2c\x8d\xbf\xba\xec\x6f\x9f\x61\x3f\x30\xe8\xc4\x2e\x0c\xd7\xaf\x26\xb6\x28\xcf\x5c\x52\xcb\xb1\x07\xf9\x91\xd5\x11\x03\xce\xef\x5d\x4e\x06\x51\x4f\x0c\x5c\x0c\xf5\xc4\xc0\xc5\xc0\xc5\xc0\xc5\x7a\x88\x8b\x75\x51\x36\xd7\xae\xe1\x62\x48\x33\x0a\x2e\x06\x2e\x06\x2e\x06\x2e\x86\x7a\x62\xc8\x83\x78\xeb\x40\xa6\xae\xcf\x83\xb8\x2d\xeb\x89\x5d\x92\x45\x83\xf6\x8b\xa2\x41\xa1\x0b\xe7\xd8\x01\x4a\xd0\xb8\xbf\x76\xb5\x54\x32\xe2\xeb\x89\xb8\x03\x86\x1a\x2a\x28\x76\x3e\x58\x43\xb5\x8f\x8d\xd4\xe6\x4e\x70\x2e\xb3\xb1\x9a\x62\xdf\x70\x65\xcc\xbb\xcb\xd6\x56\xbb\x68\x97\xf9\x21\xea\x00\xef\x92\x78\x4a\xe8\xd4\xaa\xf4\xd3\x63\xb4\x6f\x03\xfd\x8c\xc4\x51\xc8\x88\xd7\xa4\xb0\xf6\x6b\x7d\xfe\xa9\xec\x4e\xca\xb7\xff\x08\x1d\x12\x6f\xff\x38\x6d\x6c\x56\xca\x72\x61\x09\x51\x2e\xcc\x96\xd7\x6f\xb8\x91\x69\x29\xa2\x3f\x41\xc7\x5d\x22\xfa\x8d\xb6\xd2\xa8\x22\xbe\x31\x5b\xe4\x95\x54\xcf\xd3\x2e\xc5\x7e\x73\xd4\xb1\x35\x0f\x79\x96\x17\x73\xd9\x9d\x98\x3c\x40\xda\x1d\xaf\xfa\x62\x6d\xb3\x40\x28\x30\x06\xe2\x0a\xe2\x0a\xe2\x0a\xe2\x8a\x02\x63\x28\x30\x86\x02\x63\x28\x30\x06\xf2\x0f\xf2\x0f\xf2\x0f\xf2\x0f\xf2\xdf\x12\xf2\x8f\x02\x63\x28\x30\x86\x02\x63\x28\x30\x06\xc7\x1a\x1c\x6b\x3d\x54\x60\xac\xc5\x38\x79\x1b\x06\x96\xb0\x7f\xbc\x44\xe3\x52\xa8\x6e\x64\xae\xa8\xd9\x35\x51\x08\xa1\x2a\x2d\x52\x49\xcf\x6b\x7a\xbe\x7c\x33\x53\x50\x0c\x43\x35\xd8\x6f\x5c\x62\xbf\x38\x48\xcc\x39\xc1\xce\x85\xb4\xaf\xbe\x64\x7d\xc1\x6c\x68\x8a\x37\x14\x8b\xf2\x83\x97\xec\x46\xcc\x94\x48\x15\xc7\x40\xb9\x0e\xe5\x3a\x94\xeb\xf0\xa3\xc0\x8f\x02\x3f\x0a\xfc\x28\x5d\xe3\x47\xe9\x1e\x37\x01\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x75\x4f\xf3\x6b\x00\x36\x00\xb6\x1e\x05\x6c\xdb\x52\xb9\xbe\xb1\x5c\xa0\x71\x17\x9a\xb2\x52\x2e\x57\x60\xa2\x86\x74\xec\x01\xba\xf3\xab\x99\x60\x18\x78\x9a\x9d\xac\x49\x9a\x6c\x12\xc1\x1a\x7a\x66\xe2\xc1\x8a\xfb\xa4\xe8\xf3\xbb\x3c\xb9\xd9\x2b\x6c\x9d\x7b\x25\x22\x7b\x44\xfe\xbd\x43\x90\x4c\x32\xad\x0b\xf4\x38\x9d\xab\x92\xbb\xd7\x21\xb6\x81\x83\x03\xd5\x15\xc4\xef\x4d\x8a\xdf\xdf\x1e\xda\x90\xf3\x20\x70\x2a\xd2\x13\x52\xf1\x9e\xa6\xb3\x8e\xe2\x7d\x93\x4d\x2e\x4a\xfd\xfb\x39\x9a\x73\xe9\xdf\x37\xd9\xe6\x66\x13\xc7\x77\xc2\x94\xc5\xfe\x6e\xd4\xd3\x94\x45\x3d\x65\xf4\x95\x66\x2d\x2e\x8f\xa9\x31\x6b\x8e\xa8\xbe\x9d\x06\x0e\x6a\x7a\x50\x60\x50\x60\x50\x60\x50\x60\xa8\xe9\xa1\xa6\x87\x9a\x1e\x6a\x7a\x78\x23\xe0\x8d\x80\x37\x02\xde\x08\x78\x23\xa0\xa6\x87\x9a\x1e\x6a\x7a\xa8\xe9\xe1\xec\x83\xb3\xaf\x0b\x9d\x7d\x5d\xad\xa6\x6f\x8c\x3a\x6f\x08\x32\xd7\x96\x28\x6d\xb9\x00\xfe\x9b\x31\x9a\x95\x02\xf8\x6c\xde\xc8\x68\x7c\x81\xe2\xe8\xdf\xfd\xb2\xb6\xab\xc5\x6c\x49\xcb\x17\xcb\x46\x21\x6f\xff\xf4\x26\xf6\xee\x18\x7b\x7b\x3f\xed\xb6\xdb\xb9\xbc\x9e\x08\x47\x74\x55\xc9\x56\xed\x54\x67\xcc\xb3\x97\xf8\xd9\xb1\x41\x7e\xc4\xb4\x75\x8e\x3b\xa3\x55\xc5\x71\xad\x85\xe0\x69\x85\x66\xe5\x44\x3a\x45\x27\xc4\x44\x3a\x42\x87\xe8\x80\xaf\xcb\xc2\xe9\x9b\xf5\x44\xbc\xe2\xbe\x02\xa7\xd0\xa5\xe0\x69\x31\xc9\x8e\x9a\xd3\xa2\x7a\x0c\xcc\x59\x51\x79\xc5\x8a\x74\x62\x0f\x78\xcf\xd0\xdb\xd9\x40\x4e\x2d\x53\xf8\xeb\x3b\xab\x06\x64\xaf\xae\x96\x0a\x4a\x46\xad\x3b\x26\x23\xe6\x41\x9d\x1e\x96\x94\xa8\x3e\x5c\xe5\x7c\x6d\x6e\x5c\x80\xe7\xe0\x76\x6d\xd2\xed\xfa\xd1\xbe\x96\x19\x87\x73\xd2\xe1\x3a\x4d\x29\xc7\xe1\x7a\xeb\x59\x9a\xd2\x5a\x99\x62\xef\xdd\x53\x65\x69\xee\x31\x17\xd0\x4a\xb1\xca\xba\x0c\xcb\x1f\x3a\x6e\x5c\xda\xe3\xf8\x84\x9d\x09\xb0\x33\x80\xef\x1d\x81\xef\xa0\x2e\xa0\x2e\xa0\x2e\xed\xa2\x2e\xe9\xe7\xfa\x5a\xbc\xf5\xdc\xb8\x70\x6a\xf3\xdb\xd9\x88\xf7\x27\x7c\x17\xdb\x21\xbb\x89\x1a\x5c\x43\x04\xad\x15\xfc\xd6\x18\xa9\xb7\xed\xae\x5a\x24\x8c\x96\x14\xbd\x9c\x17\xb2\x14\x09\xb4\xeb\xee\x4b\x86\x4a\x4a\x39\x73\xa5\x93\x0b\x87\xfb\xaa\x1b\x1a\x13\xb7\xb0\x8f\xff\x73\xf2\x7e\xf7\x8f\xd7\x55\x3d\xa7\xba\x7f\x1d\x74\xff\x6a\x94\x75\xa5\xac\xe6\xf2\x99\xb1\x9a\xe3\x2a\x5a\xe1\xff\xbe\x69\xfe\xca\xef\x32\x75\x9e\xe6\x29\x5d\xb5\x23\x9a\xa4\xa3\x4d\xcc\x91\x05\x11\xc2\x8b\xe5\x4a\xc0\x72\xe5\x63\xfd\xf4\x91\x7e\xf6\xa1\xfe\xf0\xfb\x6d\x9b\xff\x96\xfe\xde\xd9\x16\x55\xf9\x19\x79\x3f\x0b\xfd\x96\xf0\x85\xf3\xc9\xe9\xc4\xf2\x0f\xfb\x4c\xdc\x11\xf1\xe9\x92\x72\x3f\xa5\x20\xce\xe4\x6b\x34\x79\xb6\x38\x42\xac\x97\x8c\xc8\x70\xda\xd0\x8a\x0b\x32\xa8\xfd\x71\xfe\x5a\x98\xff\x5e\xb2\x5e\x16\xe7\x8f\x23\xfe\xfb\xb5\xd4\x8b\x7d\xf4\x42\x1f\x7b\xbe\x2f\xfc\x19\x9b\x5a\x7e\xb0\x6f\x56\xd3\x33\x62\x29\x97\xd3\x44\xb7\x6b\x91\xe8\x2a\xff\x53\x34\x92\xac\x78\x0a\x81\x7b\xe5\xaa\x6b\xcd\x70\x84\x5b\x63\x4a\x46\x3c\xb8\x90\xc3\x15\xf2\x19\xf3\xab\xaa\x16\xb2\x46\x44\xbb\x61\xf6\xa9\x94\x8b\x95\x54\xad\x54\x50\xe3\x11\x79\x45\x91\x85\xc0\x1a\x4b\x81\x5d\x3d\x3b\xc0\xbe\x7c\xf4\x36\x71\x5b\x15\xe1\x01\x8a\x7f\xce\xeb\x16\x6d\x4c\xad\x0f\xc2\x43\xde\x1f\x84\x9d\xec\x76\x71\x9b\x8d\x7e\x0f\x9a\xdd\x53\xa6\x27\xe9\x28\x3b\x1c\x3d\x68\x67\x0c\xb9\x57\xbc\x56\xe6\x3b\x5e\x71\x5e\x74\x80\xff\xe4\xce\x05\xb2\x0d\xb3\x8d\x3c\x3b\x42\x33\x12\xb6\x66\x34\x4d\xcf\xe6\x8b\xe2\xdd\xa9\xce\x37\x22\xe0\xba\x1f\x7a\x15\x8b\x78\x83\x3d\x37\xcc\x7e\x6b\x80\xee\x76\x37\x63\x4b\x90\x5f\x6f\x6a\x01\x8a\xd9\xfc\x7a\x3e\xbb\xa6\x14\xdc\x41\x30\x8a\xad\xbb\x99\xe7\x2d\xc5\x5d\x2b\xfc\x49\x7b\x6f\x30\x24\x5a\x18\x72\x14\xaf\x15\x12\x46\xad\xa4\xda\x1b\x37\xa3\xac\x2a\xd9\x78\x6c\x9f\x38\x61\xca\x75\x37\xa6\xa4\xd9\xf9\x40\x8b\xcb\xcd\xe7\x8d\x6e\x2f\xc7\x99\xbe\xe6\xff\xf6\x6d\x24\x6a\xa7\xce\x97\x58\x44\x27\xcd\xac\xab\xc5\x72\x53\xe8\xc6\x63\xee\x98\x6f\x9a\xe8\xe3\x5a\xaf\xc1\xd5\xbd\xde\xaf\xf9\x6e\x46\xe2\xb9\x45\x00\x50\x1a\xc9\x5c\x90\xcc\x25\x0d\x19\x3f\x64\xfc\x90\xf1\x43\xc6\xdf\x33\x32\xfe\x74\xd7\xa8\xd4\x5b\x7e\x27\x4d\xcb\xa7\xd3\x90\x4f\x43\x3e\x0d\xf9\x34\xe4\xd3\x90\x4f\x77\x5e\x3e\xbd\x0d\xb9\x46\xba\xa7\x25\xa9\x69\x48\x52\xdb\x27\x49\x4d\x77\xbd\x24\x75\x1b\xe6\x9f\x61\xdf\x1e\xa4\x07\x24\x87\x94\xf0\xc6\xa5\xf8\x94\x7f\x60\x7f\x30\xc8\xfe\x6b\x3f\xed\x92\xff\x25\x74\x83\xf5\x53\x1b\x0b\x9a\x15\x7b\x98\x1f\x24\xfe\x69\x2c\x27\xc4\xff\xcf\x6a\x7a\xb2\x50\xb0\x29\x60\xb7\x67\x34\x4e\x3f\x4d\xa7\x24\xe3\x3b\x4a\x87\x05\xe3\xdb\x4f\x71\x1a\xf5\x25\xec\x66\xf7\xad\x27\xe2\xe2\x69\x5b\x92\x88\x67\x31\x98\x05\x8e\xb3\x31\x93\x05\x56\x8c\x9f\xc5\xdb\xf9\xdf\x2a\x39\x3b\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x1e\xd8\x5e\x67\xd9\x1e\xc8\x1b\xc8\x1b\xc8\x5b\x0f\x93\xb7\x7f\x31\x42\x67\x24\x79\x2b\xaa\xe5\x1b\x9a\x7e\xad\xa2\xde\x58\x7d\xe9\x9f\x79\x86\x88\x6e\xc8\xab\x06\xfb\xd4\x30\xfb\xfc\x00\xbd\xd4\x69\xe8\xf2\x7a\x22\x7c\xb3\x31\xf1\xdf\x79\x79\xd2\x82\x19\xdc\xd1\x12\x11\xe0\xa8\x38\xe1\xbc\x7d\x3b\x6e\x79\x7e\xc5\xf5\xb6\x87\x0a\xb0\xe5\x62\xbf\x40\x32\xd8\x88\x4c\xef\xea\x6b\x83\xf1\xe0\x71\x76\xcc\xc4\x83\x35\x93\xcc\x44\x84\x15\xc3\x01\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x54\x08\x19\x20\x60\x24\x60\x24\x60\xe4\x2d\x0a\x23\x7f\xf5\xb5\x74\xda\x1f\x46\xca\x60\x64\x1f\x16\x99\x2f\xe6\x74\xd5\x30\x54\x83\x7d\xfb\x12\xfb\xc0\x20\xb1\x0a\x0a\x29\xe3\x90\x1f\xad\x2f\x19\x9c\x93\x4d\xc4\x06\xf9\x61\x6e\x6a\x58\x15\x38\x6c\x1e\xd7\xe5\xc0\x30\x05\x6e\x06\x6e\x86\x2a\x58\xe0\x66\xe0\x66\xe0\x66\xbd\xc3\xcd\xba\xa8\xc8\x53\xd7\x70\x33\x54\x1f\x02\x37\x03\x37\x03\x37\x03\x37\xdb\x8a\xea\x43\x3d\x0d\xa1\x50\x1e\xa5\x97\xcb\xa3\xa4\xb6\x21\x84\x4a\xab\x94\x96\x42\xab\x29\x4a\x0a\xa1\xd5\x71\x3a\x46\x47\x7c\x23\x2e\x5d\xa4\xca\x2a\x1e\x6e\x02\xa2\x86\x82\x2f\x37\x94\x68\xcd\x4f\x3d\x65\x5e\xd0\x23\xd1\x5a\x40\x6c\x67\xf4\x43\xbb\x3c\x49\xd9\x9d\xf2\xab\x14\x51\x8a\x36\x15\x1b\x96\x7f\xea\x20\x17\x6b\xae\x02\x87\xff\x78\x20\xd5\x2c\x2a\x70\x34\x59\x81\xe3\x7f\x6f\xb0\x02\x87\xff\x24\x6c\xa2\x02\x47\x9d\xc6\xe6\x65\xce\xee\x19\x9a\x72\xe5\xec\x6e\xba\xb5\xae\xb5\x55\x25\xcd\x28\x53\xec\x5b\xa3\x9e\xb6\xea\x7e\x33\x43\xbb\x2b\xdd\xbd\xb6\x6a\x9b\xad\x09\xf9\x6b\x8d\xd9\x9a\xb2\x8f\x6e\xb7\x01\x6b\x4f\x95\x0f\x80\x5d\x80\x5d\x80\x5d\x80\xdd\xde\x01\xbb\x58\xbd\x05\xac\xde\xba\x87\x7c\xa3\xc2\x52\x47\x2a\x2c\xc1\xc1\x00\x07\x03\x1c\x0c\x70\x30\xc0\xc1\xd0\xd3\x0e\x06\x14\xda\x43\xa1\x3d\x14\xda\x6b\x57\xa1\x3d\xf8\xef\xe0\xbf\xeb\x55\xff\x5d\x3a\xd7\xe2\x1a\x93\x41\x84\x39\xe6\x8d\x80\xef\x62\x77\xca\xb7\xd9\xb1\xb4\x1b\xac\x04\xb6\x61\x1a\xbd\x0d\xc3\x5d\xd8\x0f\xbe\x84\x0e\x49\xf9\xbc\xd5\xb3\x55\xe5\xbc\xc6\x0d\xb5\xb0\x6a\xac\x89\x07\xd1\xd7\x0a\xaa\xa1\xab\xeb\x79\xf5\x86\xc1\x7e\x8b\xa2\x9f\xbe\x8d\xf6\x54\x9c\x76\x79\x3d\x11\x7e\xc8\xf2\x03\x46\x96\xd4\xc2\xea\x92\x3c\x73\x91\x9f\xb9\x28\xce\x8c\xed\x93\x07\x24\xdd\x27\x2e\x27\xbc\x0f\x6e\x31\x57\x5f\xa6\x8b\xb4\x58\xe5\x18\xac\x43\xd6\xe3\x95\x7d\xc2\xe7\xa4\xe7\x5d\xa6\xdf\x17\xa2\x25\x39\xe9\xe7\x29\x2d\x26\xfd\x34\xb5\xa0\x5d\x7a\x95\x74\xfc\x3c\x41\x17\x1c\xc7\x4f\x6b\x5a\x7e\xb5\xf4\x02\x2d\xd2\x82\xcb\x0b\xd4\x9a\xa6\x9b\xcf\x1d\x2c\x7c\x36\x57\xaf\x06\xbf\xa4\x67\xd8\x8c\x7c\x17\x7d\x6e\xc1\xa3\x8e\xab\xd7\xf4\xa6\x34\x00\x61\x7d\x40\x98\x86\x7b\xd7\xc7\xbd\xdb\x72\x4b\xfc\x9d\x41\xba\xd7\xb4\xc4\xa5\x92\xc1\x2d\xaf\xae\x0a\xb3\xc6\xd7\x89\xec\x8f\x06\xd9\x8b\xfd\xb4\x83\xff\xc4\x8d\xec\x70\xfd\xb0\xa4\x45\x79\xe6\x92\x5a\x8e\x3d\xc2\x8f\x4c\x96\x4a\xc6\x72\xc2\xf9\xeb\x76\xcb\x68\x7e\x89\x52\xd2\xbc\x1e\xa7\x63\xc2\xbc\x1e\xa0\x04\x8d\xfb\x5b\xaa\x52\x49\xe4\x33\x77\x1e\xb8\x25\x49\xcd\xcf\x07\x1b\xa6\x7d\x6c\xc4\xb2\x37\xa5\x92\x61\x2e\x18\x9c\xdb\x40\x96\x22\x44\x5b\x21\x4b\x11\x9c\xf2\x70\xca\xc3\x29\xdf\xab\x4e\x79\x64\x29\x42\x96\x22\x38\x43\xe1\x0c\x85\x33\x14\xce\xd0\xae\x70\x86\x22\x87\x10\x72\x08\x6d\x17\xf7\x0f\x72\x08\xb5\x23\x87\xd0\xb7\x86\x68\xc4\xcc\x21\xa4\x65\xd5\x9a\x54\xe6\xfa\x5a\x91\x3f\x70\xa6\xa0\x88\x64\x41\xff\x69\x88\x7d\x7c\x80\x76\xf0\x43\x2f\xaf\x27\xc2\x6f\x68\x2c\x59\xf9\xa2\x6c\x64\x8a\x37\xd2\xa2\x5c\xe5\xf7\xc9\x5c\xe5\x5a\x56\x5d\x4e\xb8\x9b\x47\x6a\x72\x6f\xbe\xf7\x54\x30\xbf\x3b\xc8\x26\x2c\xef\x9f\x33\x13\x2c\x8c\xe7\xea\xe2\x0a\x90\xd7\x50\xce\x73\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\x3e\xd0\xbe\x4e\xd1\xbe\xe7\x6d\xda\x27\x43\x3f\xec\x34\xe1\x25\x2d\x9b\xcd\x1b\xfa\x9a\xd8\x81\xaf\xac\x65\x73\x6a\xd9\x60\xff\x6e\x88\xbd\x7d\x80\x5e\x26\x0f\xb5\x13\x88\x24\xea\xeb\xef\x16\xb4\xec\xb4\xdd\x52\x4a\xb4\x14\x3b\xc8\x4f\x91\xa1\x22\x66\x3e\x11\x8f\xa3\xb6\x9b\x30\xef\x3a\x2d\x4a\x8c\x77\x8e\xe6\x04\xc6\x9b\xa2\x24\x9d\xf2\x15\xe6\x99\xe1\x41\x56\x12\x19\x8f\x0e\x68\x48\xa8\xb7\xa1\xf2\x81\xf2\x9a\x26\xc3\xf3\xb8\xe2\xc6\x33\x60\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x01\xe5\x75\x0a\xe5\xfd\xf1\x88\xcc\x5e\x30\xbe\xee\x5b\xe4\x8f\xbf\x70\xf9\x8c\xaa\x64\x32\x7c\xb5\x61\xfe\xf6\x26\xf6\xbe\x11\xf6\xf7\x21\xda\x91\xd1\x74\x21\xe2\x7b\x58\x57\x95\x6c\xd5\xe6\x73\x49\x9e\x99\x94\x67\xc6\xa2\xfc\x90\x29\x4d\x57\x97\x5d\xf9\xcb\x2b\x8f\x69\x6d\xb6\x82\xf4\x25\x5f\x10\xb6\xb1\x70\x58\xfe\x90\x32\x5e\xdf\x7d\xb3\x16\x4c\x7b\xc0\x1b\x76\xdd\xce\x06\x72\x6a\x99\xae\x2e\x04\xb3\xb6\x31\xb6\xcf\x64\x6d\xd1\x28\x59\x71\xf9\xee\x4b\x55\xa8\xe5\xc2\x9f\xdd\xe9\xf4\xfb\x23\xba\x5a\x2a\x28\x19\xb5\x7e\xd7\x3f\x6a\x1e\xd5\xc9\xde\x4f\xcd\xd0\x14\x25\xab\x72\x45\x6c\xbc\x97\x91\x82\x14\x09\xe4\x9b\xcc\x30\xf0\xfe\xbe\x56\xbc\xe6\x74\x46\xe6\x10\x39\x4d\x27\x9d\x1c\x22\x4d\x35\x14\x44\xe5\x5b\x6e\x29\xea\x98\xa6\xd2\x5a\x99\x62\xdf\xb9\xc3\x31\x24\xf7\x98\xa9\xc0\x94\x6a\xdb\xf1\x88\xfc\xa1\xa3\xa6\xa3\x3d\xe9\xdb\x61\x49\x02\x2c\x09\x52\x08\x77\x24\x85\x30\x72\x47\x22\x77\x24\x72\x47\xb6\x2b\x77\x64\xfa\x03\xad\xf9\xec\x9f\x95\x09\xbe\x92\x74\xca\x95\xe0\xab\x2d\xdf\xfd\x88\xf7\x57\x7a\x17\xdb\x21\xbb\xa4\xd1\x3d\x84\x47\xd2\x2e\xbf\x55\x42\xea\x7f\xbe\xc4\xf9\xf4\x8f\x95\x14\xbd\x9c\x17\x8e\x3e\xb9\xbb\xac\xbf\x99\xd8\x5b\xe2\xdb\xc8\x4e\xad\x07\xee\xab\x6e\x68\x4c\x5c\x7e\x1f\xff\xe7\xe4\xfd\xee\x1f\xaf\xab\x7a\x4e\x75\xff\x3a\xe8\xfe\xd5\x28\xeb\x4a\x59\xcd\xe5\x33\x63\x35\xc7\x55\xb4\xc2\xff\x7d\xd3\xfc\x95\xdf\x65\xea\x3c\xcd\x53\xba\x6a\x1b\x33\x49\x47\x9b\x58\x8d\x2c\x08\x5f\x38\x56\x21\x01\xab\x90\x8f\xf5\xd3\x47\xfa\xd9\x87\xfa\xc3\xef\xb7\x4d\xf9\x5b\xfa\x7b\x67\x3f\x53\xe5\x3e\xe0\xfd\x2c\xdc\xe1\xc2\xc5\xc5\x27\xa7\x23\x8a\x19\xf6\x99\xb8\x23\xe2\x8b\x24\xd5\x13\x4a\x41\x9c\xc9\x97\x5e\xf2\x6c\x71\x84\x58\x06\x19\x91\xe1\xb4\xa1\x15\x17\xa4\x3a\xe4\x71\xfe\x5a\x98\xff\x5e\xb2\x5e\x16\xe7\x8f\x23\xfe\x1b\xad\xd4\x8b\x7d\xf4\x42\x1f\x7b\xbe\x2f\xfc\x19\x9b\x7c\x7d\xb0\x6f\x56\xd3\x33\x62\x85\x96\xd3\x44\xb7\x6b\x91\xe8\x2a\xff\x53\x34\x92\xac\x78\x0a\xc1\x34\xe5\x62\x6a\xcd\x70\xfc\xe0\x63\x4a\x46\x3c\xb8\x50\x17\x14\xf2\x19\xf3\x63\xa9\x16\xb2\x46\x44\xbb\x61\xf6\xa9\xf4\xbe\x97\x54\xad\x54\x50\xe3\x11\x79\x45\x21\xe7\xb1\xc6\x52\xb0\x45\xcf\x0e\xb0\x2f\x1f\xbd\x4d\xdc\x56\x85\x34\x65\x83\xe9\xd2\x9a\xb4\xfb\x0f\x79\xdb\xfd\x9d\xec\x76\x71\x8b\x6d\x30\xfb\xe9\xe3\x74\x8c\x1d\x89\x1e\xb2\x13\xac\x86\xc5\x5b\x64\xbe\xd2\x95\x07\x47\x07\xf8\x6f\xee\xdc\xa9\xdb\x30\x3b\xeb\xfb\x2f\xd1\xfe\xca\x9c\x80\x3e\x94\x33\xab\x96\x0a\xda\xcd\xeb\x7c\xc5\xc1\xfe\xf6\x19\xf6\x03\x83\x0d\xa7\x0a\x9c\xb6\xcf\x8c\x3d\xe8\xa4\x0a\x74\x3e\x8c\xce\xef\x5d\xae\x45\x4c\x41\x95\x07\x55\x1e\x6a\xdc\x41\x95\x07\x55\x1e\x54\x79\xbd\xa3\xca\xeb\xa2\x12\x6e\x5d\xa3\xca\x43\x6d\x31\xa8\xf2\xa0\xca\x83\x2a\x0f\xaa\xbc\xad\xa8\x2d\xd6\xd3\x22\x3a\x14\x3f\xea\xe5\xe2\x47\xa9\x6d\x28\xa2\x6b\xb6\xb8\x82\x03\x86\xb6\xb4\xb8\x82\x73\x1b\x15\xda\x91\xe8\x37\x76\x3a\x08\xec\x2e\xbb\x24\x91\x8b\x76\x99\x1f\xa2\x0e\xf0\x2e\x89\xa7\x44\x82\xbb\x2a\x47\xcc\x18\xed\xdb\x40\x3f\xc3\xf7\x02\x2d\x59\x93\x5a\xb2\xaf\xf5\xd1\x49\xf9\x92\x1f\xa1\x43\xe2\x25\x1f\xa7\x8d\x4d\x3e\x9a\x92\x3a\xb2\xc7\x68\xd2\xd1\x91\x6d\xb8\x91\x69\xe9\x95\x3e\x41\xc7\x5d\x5e\xe9\x0d\xb7\xb2\xd9\x0a\x53\x2d\xb6\x35\xb1\xdf\x1c\x75\x6c\xcd\x43\xa6\xae\xc0\x25\xd2\xd0\x56\xdd\x76\x27\x26\x0f\x90\x76\x67\xca\x3e\xaa\x03\x16\xa8\x3d\xb2\x34\x10\x57\x10\x57\x10\x57\x10\xd7\xde\x21\xae\x58\x86\x05\x2c\xc3\xba\x07\x49\x43\x12\xdc\x11\x49\x30\xc8\x3f\xc8\x3f\xc8\x3f\xc8\x3f\xc8\x7f\x4f\x93\x7f\x44\x86\x20\x32\x04\x91\x21\xed\x8a\x0c\x81\x63\x0d\x8e\xb5\x5e\x75\xac\xa5\x73\x34\x2f\xf9\xf5\x0c\x4d\x09\x7e\x7d\x82\x8e\xd3\xb1\x26\xe0\xe5\x52\x59\x29\xaf\x19\x81\x08\x39\xe6\x8d\x90\xef\x62\x77\xca\xb7\xd9\xb1\xb4\x8d\xe2\x64\x0f\x9d\xbb\x37\x5a\xde\x8e\x42\xf5\xbf\x1f\xa2\x09\x53\xa8\xbe\x56\xd6\x8c\x8c\x52\xc8\x17\x73\xe3\xeb\x13\x32\xb1\xae\xe8\x5b\xad\x58\x56\x0a\x25\x2d\x6b\x1d\xa0\xea\x06\xfb\xd4\x10\xfb\xc4\x00\xdd\xe5\x3a\xe7\xb2\x79\x4e\xf8\x50\x7d\xd9\xfa\x59\xbb\xc9\x05\x2d\x9b\xb4\x9b\x8c\x9d\x10\x1a\x76\xa7\xbd\x65\xd9\x9c\xcf\xe1\xdb\x2d\xdd\xee\x3a\xbd\x46\xbe\x05\x17\x69\x51\xbc\x05\xf3\x94\xa6\xb3\xfe\xae\x13\xa7\x1f\xe2\x66\xbf\xc6\x7d\x7a\xa2\x25\x3e\xdc\x5c\xf0\x8b\x30\xcd\x52\xd6\xe4\x77\x6e\xce\x7c\x07\x7c\x6e\xcd\xe5\x6b\x91\xcf\x80\x04\xbc\x90\xfa\x23\x01\x2f\x1c\x4f\x70\x3c\xc1\xf1\xd4\x4b\x8e\x27\x24\xe0\x45\x02\x5e\x00\x7f\x00\x7f\x00\x7f\x00\xff\xae\x00\xfe\x48\xc0\x8b\x04\xbc\xdb\x05\x71\x22\x01\x6f\x3b\x12\xf0\xfe\xe7\x11\x9a\x96\xdc\x2f\xa3\xea\x66\x2b\xaa\x51\x53\x41\xdf\xfd\x63\x3e\x57\xcc\x17\x73\x96\xb5\xb6\xf2\xf1\x7e\x67\x98\xfd\xf4\x6d\x74\x87\xfb\xc0\xcb\xeb\x89\xf0\xaf\xf5\x99\xa3\xe1\x2a\xa9\x5f\xb4\xec\x9b\xc5\x02\xa7\x9c\x93\x96\x64\xeb\x8b\x96\xb4\xa9\x05\x75\xf6\x47\x9d\xd5\x8d\x58\xc1\x99\xdf\x42\xbe\x40\x72\x96\x6d\x43\x15\x2b\x65\x57\xdb\xf1\xd8\xa8\xb8\x9c\xeb\x1e\x8d\xe5\x84\xef\x1d\x77\x3b\x80\xdc\x8a\xb2\xfd\xfe\x79\x66\x6e\xc8\x3c\x33\x85\x60\xec\x38\xc7\xce\x98\xd8\xd1\x63\x9e\x9a\xf8\xd1\x77\x50\x2a\xc4\xde\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x60\x8f\x1d\x66\x8f\xb3\x34\xcd\x52\xd1\xd3\xb6\x4a\xea\x51\x77\x2e\x50\xdf\xbd\x5c\x6d\x5a\x50\x30\x4c\x30\x4c\x30\xcc\x1e\x66\x98\x2f\xc4\xe8\x54\x43\x49\x76\xb9\xbd\xd7\x35\x6e\x6d\xf9\xe6\x43\x0c\xa9\x85\x2f\x7f\x30\xc6\x7e\xb0\xdf\x49\x02\xf0\xa8\x47\x39\xb1\x29\xfb\xec\x45\xf3\xec\xd8\x20\x3f\xac\x3a\x01\x49\xed\x71\x2d\x2e\x2b\xa6\xd0\xac\x64\x78\xa7\xe8\x84\x60\x78\x47\xe8\x10\x1d\x08\xcc\xbf\x50\x7b\x5f\x81\xe4\x2e\xa0\xb4\xd8\x72\x30\xb7\x3b\xc0\x12\xf5\x75\xb3\x1e\x77\x15\xfe\x8a\x2b\xf5\xcb\xb0\x77\x81\x31\x8f\xc1\x18\x31\x8f\xec\xf4\x78\xa4\xe6\xe8\x0c\xcd\x54\x25\x86\x69\x6e\x40\x10\x99\x8c\x04\x31\x4d\x26\x88\xf9\x68\x5f\xcb\xac\xc2\x39\x99\x28\x66\x9a\x52\x4e\xa2\x98\x2d\x30\x31\xa5\xb5\xf6\x99\x98\xd8\xbf\xdb\xe3\x98\x98\xfb\xec\xd2\x63\x1e\x56\x65\xd8\x9d\xed\xa5\x83\x46\x05\x25\xc8\x50\x82\xec\xd6\xcd\x37\x80\x40\x53\x04\x9a\x22\xd0\xb4\x6d\x25\xc8\x9e\xeb\xf3\xaf\x3c\xdc\xda\x30\xbc\x45\x99\x0f\xee\x1c\xcd\xb9\xf2\xc1\x6d\xae\xcd\xc6\xcb\x92\x35\xb6\x38\x68\x68\x41\xe0\x5e\x41\xa4\xfe\xf9\x6e\x67\x71\x90\x08\x28\x4e\xe6\xb1\x64\xf8\xff\xd9\x7b\xf7\xf8\x36\xae\xf3\xce\xfb\x43\x90\xb2\xa4\xc7\x4e\x6c\x1d\xc7\x8d\x0d\x4b\x36\x0c\x59\x22\x09\x91\x20\xa1\xbb\x48\xdd\x08\x52\x94\x08\x53\x12\x23\xca\x54\x2e\xb6\xe5\x21\x30\x84\x46\x02\x31\xc8\x0c\x00\x59\xd9\xcd\x6e\x1a\xd7\x69\xb2\x6d\xb3\xe9\x2d\xe9\xf6\xf6\xba\xdd\x36\x9b\xb4\x6e\xb3\x49\xdc\x37\x7d\x9b\x6e\xbb\xbd\x64\xeb\xc6\xa9\xbb\xe9\x2d\x6d\xd3\xf5\x1b\xb7\x69\x37\xed\x6e\xb7\xdd\xed\xb6\xd9\xe4\x4d\x9b\xf7\x33\xe7\xcc\x15\x18\x60\x40\x10\x00\x41\xe1\xf7\x8f\x4d\x61\x66\xce\x9c\x39\x73\xe6\x39\xe7\x7c\x9f\xe7\xf9\x9d\x41\xbe\x7d\x4e\x27\x67\x0c\xd8\xa4\xac\xd7\xe6\x29\xd8\xa4\x0c\x9b\x94\x6d\xf0\x26\x65\x52\xed\x31\xa6\x45\x2b\x51\x6b\x24\x68\xd3\x22\x30\x70\x03\xb4\xd4\x29\x3a\xc1\x26\xa3\xc7\x6c\x17\xc5\x43\x1e\x17\x45\x55\x89\xb7\xc5\x96\x65\xef\x7b\x90\xa6\xc7\xa4\x82\x52\x87\xa3\x5a\xf6\x34\x5f\x2c\xab\xb9\xd2\xaa\x9c\xce\x49\xca\xaa\x85\x52\xc7\x74\x3e\x8a\xb3\x5f\x09\xb3\x1f\xeb\x77\x36\xf9\xdc\xcf\x89\xaa\x38\x66\xb5\xa0\x33\x8a\x2e\xd8\x25\x2e\xf1\x12\xa7\x8d\x12\x63\x63\xc6\x35\x95\x1b\x7d\xfa\x9e\x2a\x66\x0e\x2d\xe6\xac\x19\x9a\x13\xfd\x38\x49\xa7\x79\x3f\x9e\xa0\xa3\x74\x38\x70\x17\x3e\xdf\x0a\x06\x72\x90\x2b\xc1\x7d\xfc\x20\xdb\x5f\x6f\xaf\x3d\xff\xfb\x06\x30\xdc\xf0\xbb\xb6\x3b\xef\xe8\x90\xc5\x5a\xd7\xf6\x9a\xf6\x9b\x97\x6d\xd8\x9b\x4a\xf2\x2c\xfa\x8a\xe9\x47\xd3\xaf\x0a\x93\x0f\x40\xd8\x26\x21\xec\x8b\x75\xd6\x5d\x2d\xb4\x25\x17\x04\xa0\x3d\x4b\x67\x1c\x40\xbb\x8e\xf2\x1a\x44\xb1\x8d\x59\xa8\x7a\xb6\xc8\xdf\x7a\x25\x9f\xbf\xcb\x31\x41\x27\xab\x96\x5b\x6b\xb3\x45\xe3\xbe\x9b\x43\x77\xc4\x12\x61\x11\xd6\x6b\x76\x10\x8b\x30\x2c\xc2\x36\x78\x11\xd6\xd1\x39\x6a\xe0\x86\xd1\x8d\x0d\x11\x8d\x4d\x5c\x3d\x39\x3b\x49\x3a\xcd\x4e\x46\x8f\xdb\xeb\xa8\x47\xdc\x0b\x31\xdf\xeb\x6f\x8b\xb5\xd8\x87\x86\x69\x56\x44\xb6\x08\x4a\x3c\x56\x4e\x08\x41\x2e\x91\x95\x57\x6b\x79\xa6\x66\x32\x8a\xae\x95\xf8\x57\xb5\x5c\xca\x64\xe5\xa2\xce\x3e\x37\xc4\x5e\x1d\xa0\xd7\x8b\x72\xae\x9a\xe5\x84\xff\xa5\x19\x0f\x9a\xcf\x28\x65\x25\x53\x92\x72\x9e\x44\x3d\x3b\xf6\x7a\x41\xcd\xcc\xd8\x25\x26\x79\x89\x2d\x49\xcd\x8b\xc7\x0e\xf0\x0b\x04\xc1\x5e\x12\x95\x72\x0d\xdb\xd5\xb7\x9d\x57\x90\x63\xe7\xf7\x69\x3e\x15\xfc\xe5\x4d\xb2\x63\xe6\x97\x27\x3a\x81\xf5\xf5\x55\x37\xb2\xfb\xdb\x13\x82\x5d\xd7\x77\xfb\x7f\xfa\x77\x31\xe2\x0f\xce\xe5\xc3\x90\x59\x87\xcc\x3a\x64\xd6\x21\xb3\x0e\x99\x75\xc8\xac\x43\x66\x1d\x32\xeb\x90\x59\x87\xcc\x3a\x64\xd6\x21\xb3\x0e\x99\x75\x1d\xce\xac\xdb\x7c\xa4\x03\x39\x77\xc8\xb9\x43\xce\xdd\x26\xca\xb9\xfb\xa1\x21\x3a\x24\xc8\xa4\x9e\xbe\x26\x67\x4a\x5c\xa2\xde\x56\x0d\x73\x43\xca\x82\xa6\xa8\x9a\x52\xbc\x95\xce\x49\xba\x2e\xeb\xec\xb5\x41\xf6\xfb\x03\xc4\x9c\xcb\x6c\x18\x79\xab\x41\x18\x69\x16\x38\x6d\x14\xd8\x22\x0c\x29\x2e\x58\xb4\xeb\x64\xa2\x48\xcf\xad\x80\x1e\xfd\xd1\x63\x23\x68\xf0\x7a\x3a\x98\x4f\x9e\x66\x27\x4d\x3e\x59\xd5\xa5\x2c\x54\xe9\x7e\x1d\xd5\x90\x12\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xfc\x11\xbb\x0a\x80\x0e\x82\x0e\x82\x0e\x76\x8a\x0e\xbe\x38\x46\xac\x3a\x87\x8c\xfd\xc8\x18\xfb\xdb\x3d\x4e\xac\xff\x60\xfd\x1d\x42\xed\x38\xc0\xd8\xbd\xc6\x89\x15\x31\xfd\x5d\x4e\xe2\x92\x60\x51\x60\x51\x49\xb0\x28\xb0\x28\xb0\x28\xb0\xa8\x9e\x61\x51\xc9\xae\x61\x51\x2d\xaf\x49\xd3\x2c\x2a\x09\x16\x05\x16\x05\x16\x05\x16\x05\x16\xd5\x79\x16\x95\xec\x69\x74\x94\x04\x3a\x6a\x1f\x3a\x4a\x76\x3b\x3a\x4a\x6e\x42\x74\x94\x7a\x82\xa6\x44\x04\xd3\x04\x1d\xe5\x11\x4c\xfb\x69\x9c\xe2\x81\x09\xcd\x36\x17\x9a\x57\xf4\xe0\x90\xa5\x87\xfc\x43\x96\xb6\xb2\x2d\x22\x5a\xe9\xb1\xe0\x68\xa5\x21\xb6\xb7\x32\x8f\xd9\xae\x83\x27\x77\x39\xfa\x07\xdb\x1c\xe4\xc5\xc4\x78\x13\x91\x5c\x74\xeb\x3e\xf1\x5b\xbb\xf8\x96\xc0\x51\xa7\xe9\x24\x1d\xaf\xd0\x86\x18\xa1\x58\xe3\xed\x0a\x35\x08\xa8\xe2\x34\xa9\x8a\xf3\x5a\x1f\x9d\x10\xdf\xf4\x61\x3a\xc8\xbf\xe9\x38\xad\xa9\xef\x51\x52\x08\xde\x4c\xd2\x31\x47\xf0\x66\xad\x65\x4c\x0b\xa5\xd2\xe3\x34\xe1\x52\x2a\x5d\x6b\x21\x41\x86\xa5\x95\x86\xa3\x8e\x95\x2a\xa8\x7a\x91\x5a\x2f\x37\xf0\x52\x88\xee\x10\x41\xbd\xec\x3f\x84\xd8\x2f\x84\x68\xc0\xf8\x47\x38\x9c\x95\x8b\xae\x25\xc7\xd4\xc2\x9c\x3d\x1b\x8a\xbd\x3e\x2b\x17\xa7\x16\xe6\x4c\x8b\xde\x42\x35\x9d\xaa\x82\x26\xaa\x0a\x9a\x68\xa4\xa0\xd4\xaa\xd0\xa8\x1d\xe7\x1a\xb5\x46\xe7\x9b\xa6\x29\x3a\xd5\x44\x48\xec\xd4\xc2\xdc\x59\xe3\xc5\x35\x32\xc2\xb0\x4f\x11\xed\x33\xf7\x24\x29\x19\x2f\xa3\x68\x56\xd3\xb5\xb3\x32\x67\x67\x9a\x5c\x56\xe4\x9b\x3a\xfb\x76\x8a\x7e\x6d\x80\x76\x78\x4f\x36\x46\x8c\x37\xd8\x23\xc6\x65\xe3\xfc\x4b\xfc\xfc\xd8\x23\xe2\xd7\x29\xcf\xe9\x4b\x09\xd7\x29\x1b\xac\xb0\x56\xf1\xd4\xe5\x44\xdc\x55\xb7\xd4\x73\xa1\xb5\xc9\x96\xd4\x2d\xad\x09\x39\xac\xfa\xe5\x5d\x14\x96\xe2\x1c\xcd\xba\x2c\xc5\x7a\x0a\x6c\x7e\x3a\xc2\x3f\xf4\xeb\x4f\x07\x5b\x95\x13\x6c\xd2\xd2\xbc\xf4\xeb\x6f\xa6\xa1\x71\x57\xca\xa3\xaf\x82\xc1\xbd\xfe\xe0\x9e\xc2\xe0\x5e\x63\x70\x6f\xf9\x20\xf4\x42\x98\xe6\x84\xe5\xcc\xcb\xc5\x9b\xaa\x76\xc3\x93\x59\x52\x4b\xf3\x86\xef\x48\xaf\xeb\x72\xa5\x0a\xe9\xab\x0f\xb0\x7f\xd5\x4f\xaf\x73\x8a\x32\x6c\xea\xa3\x75\xb5\x48\xe7\x44\x51\xb1\x41\xe3\xac\x0b\xf6\x85\x6e\x3d\x39\xf3\x94\xb6\xa8\x8e\xae\x71\x01\xe4\x6a\xa4\x72\x22\x6e\x56\x6c\xbd\x1b\x3b\xbd\x39\xd8\xe0\x1c\x62\x07\x4c\x83\x53\xf5\x9a\x4c\x63\x63\xd5\xc5\x6d\x68\xc2\x7f\xb4\xad\xf2\x65\x0c\x06\x89\x8e\x5a\xef\x23\x66\x9e\xd8\xf1\x57\x92\x9c\xa1\x24\x9d\xae\x18\xfc\xd6\xfc\x4e\xb0\x80\xc2\x02\xaa\x49\x1b\xfb\x13\x7d\xad\xb0\x09\xb3\x62\x9a\x74\x8a\x4e\x38\xd3\xa4\x76\xd8\x96\xc6\x8c\x47\x6d\x1b\x51\xd3\xac\x04\x08\x94\x26\xdf\x77\x57\xa5\x6d\x19\x6f\x58\x4d\xd4\x32\x32\x43\x5c\xc9\xae\xa3\x26\x06\xba\xa1\xbd\x66\xe8\xa0\x1b\x0a\xdd\xd0\x0d\xd6\x0d\xed\xc8\x2c\x33\x50\x2f\xb4\x6d\xf3\xcc\xd4\x41\xda\xcf\xc6\xa3\x71\x5b\x02\xe3\x5e\xb7\x60\xa8\x79\xc5\x6d\x21\x11\xfa\xa5\x41\x0a\x5b\xa1\xb6\x66\xc2\xbd\x9a\x29\xca\xab\x05\x1e\x2a\xc5\x7e\x65\x90\xfd\xdc\x80\xe3\x7f\xb8\xd9\xb0\xde\xe7\x65\xb3\x88\x16\x25\xd8\xc7\x6e\x3a\xba\xdc\xae\xd2\xe7\x15\xbd\x38\xab\x6a\x53\xb9\x9c\x3d\xcc\xb6\x6e\x64\xed\xb5\x1c\xfb\xf3\xc1\x5f\x53\x8c\x0d\x55\xa9\xef\x3a\x6f\xc3\xfb\x09\x21\x82\x19\x11\xcc\xc8\xa6\x47\x04\x33\x22\x98\x11\xc1\xdc\x3b\x11\xcc\xc8\xa6\x47\x36\x3d\x22\x98\x11\xc1\x8c\x08\x66\x44\x30\x77\x45\x04\x33\xb2\xe9\x91\x4d\xbf\x59\x42\xa2\x91\x4d\xdf\x8e\x6c\xfa\xdf\xbe\x4a\xc7\x45\x44\x44\x5a\xd6\xcc\x52\x64\xbd\x52\x6d\xd3\x7d\x4c\xc9\xe6\x79\x40\x84\x30\xd6\xec\xfd\x57\xd9\x5f\xef\xa5\x37\xb8\xcf\xb0\x45\x37\x8f\xd4\x4f\xc2\x9f\x76\xae\x59\x14\xa5\x5e\x12\xa5\xc6\xc6\x79\x52\xbe\xab\x48\x53\x33\xb3\xe6\x15\x5d\xce\xf5\x90\xb1\x0f\xde\x85\x8c\x7d\xf0\x2e\xf0\x2e\xf0\xae\x1e\xe2\x5d\xc8\xd8\x47\xc6\x3e\x78\x17\x78\x17\x78\x17\x78\x57\x57\xf0\x2e\x64\xec\x03\x4f\x21\x63\x7f\xf3\xe0\xa9\xd4\x2d\x7a\x4a\xc4\x43\x5d\xa1\xc7\x79\x3c\xd4\x45\x3a\x4f\x8f\xd5\x4e\xaa\x75\x33\x2c\x93\x42\xc5\x6b\x42\xa3\x96\xa4\xf3\xbf\x3d\x38\x30\xea\x02\x9b\x37\x03\xa3\x7c\x18\x9b\x19\x29\x55\xb3\x92\xd5\x5b\x91\x44\x7f\x8a\x6a\xf0\xb6\xa8\x9d\xcf\x59\x1b\xad\xed\x37\x15\x01\x36\x02\xae\x09\x16\xf6\x24\xbd\x8d\xde\x52\x11\x12\x3e\x47\x67\x5b\xf4\x52\x11\x21\x8e\x54\x98\x26\x53\x61\x7e\x3e\x54\xd3\x1a\xd0\x5b\x85\x19\x5a\xa4\x37\x71\x33\xf4\x18\xb5\xae\xc7\xd2\x55\x91\x3c\xf3\x66\x5a\x72\x92\x67\x5a\x7a\x83\xa7\x45\xd2\xf1\x5b\xe8\x8a\x2b\xe9\xb8\x95\x77\xb0\x8c\x65\xe7\x8d\x61\x50\x7e\x73\xec\x47\x46\x6b\x18\xcb\xb8\x98\xd6\x47\xd2\x6a\xce\x58\xa4\x9b\x83\x6e\x6d\xc3\x79\x5c\x9c\xef\x67\x38\xed\x12\x3a\x65\x42\x2f\xd3\x25\x5a\x70\x9b\xd0\x58\x92\x4e\x37\x11\x25\x3c\xc3\x1f\xe9\x22\xa7\xce\x3a\xf8\x34\xf8\x34\xf8\x34\xf8\x74\x0f\xf1\x69\xcc\x15\x03\xe6\x8a\xdd\x03\xf0\xbf\x1c\xa2\xd7\x42\xec\xd5\x50\xf8\x8b\xf6\xab\xfa\x78\xe8\xb2\x7b\xc9\xac\xe4\x23\xba\x58\xf6\x46\x96\xe5\x15\xe1\xed\xb6\xd1\x92\x33\x64\x99\x5f\x09\x6f\x2c\xd7\xac\x34\xaf\xe6\x47\xf3\x72\x56\xe2\xaf\xc4\x5c\x35\xbb\x67\xaf\x02\x32\xdb\x9d\xc1\x9c\x3c\x28\xab\xab\x72\xc6\x98\x1f\xe7\x6e\x39\x6e\x68\xc7\xb4\x2b\xb9\x11\x73\x31\xcd\x1f\x37\x92\xd5\xa4\x34\xef\x27\x8a\x9a\xb1\x07\x1e\x67\x70\xe0\x1e\x7e\xeb\xbd\x94\x74\xa3\x92\xee\x86\x92\x8c\x2b\xad\x07\x32\x6f\xb2\x22\xbe\x37\xab\x88\xb8\xa8\xa7\x48\x08\xf4\xa9\x63\x94\xf1\x2a\x2c\xf0\x1a\xf8\x41\x02\xf8\x49\xe0\x27\x81\x9f\x04\x7e\x12\xf8\x49\x7a\xda\x4f\xf2\xf9\x10\xbd\x12\x62\x2f\x87\xc2\x2f\xd9\xa3\xed\xf3\xa1\x19\x57\xb2\x6e\x21\x27\x4b\xba\x6c\x7f\xfa\x0b\x9a\x5a\x90\xb2\x7c\x1c\x5e\x50\x73\x4a\xfa\x96\x27\x4a\xca\x7a\xdd\x4e\xb6\xaf\xf1\xc2\x13\xf1\x23\xf1\xc8\xa2\xb0\x23\x62\x90\x2c\xc8\x79\xa3\x9b\x3a\xa3\x88\x1c\x51\xb5\xc2\x35\x29\x6f\x45\x6d\x69\x25\x79\x6c\x45\xca\x59\xb3\xff\xa8\x38\x1a\x8d\xac\x28\x79\x29\xa7\xbc\xc3\x32\xdf\xcb\x72\x44\xca\x70\xa7\x83\x3a\x26\x18\x74\xc6\x99\x5a\x8a\xc2\x07\x75\xe7\x22\x31\xdf\x8e\x47\xce\x28\xdc\x24\xb9\x2a\xae\x6a\xd5\x4f\xe6\x38\x7a\x8a\x62\xba\xcf\x67\x7f\x6a\xf1\x5a\x3c\x7a\x8f\xa8\xcf\x8c\xf5\x20\xde\xf0\xaf\xf7\x0e\xd0\x73\x03\xec\xdd\x03\xe1\x6f\xda\x31\x80\x5f\xe8\xbf\x62\xda\x41\xa3\x8b\x5e\x53\x6f\x46\xb2\x92\xb6\x2c\x65\x3d\x54\xc2\x9e\xa8\xc9\xda\x8a\xaa\xad\x1a\x6d\xe1\x5b\xd3\x8b\x15\x37\xaf\x5d\x51\x3e\xad\xb1\xe6\x24\x05\xf1\x54\x8a\x31\x5f\x48\x2b\x19\x67\x62\xcd\xc7\x46\xa1\x1b\x60\xb5\xae\x31\x38\x99\x23\x87\x35\xfa\xc5\x5d\xcd\x68\xd9\x4d\xdb\xbb\x62\x47\xfe\x79\x6f\x16\x8f\x08\x0a\xc5\x6d\xb1\x7b\xb6\x3a\x28\x9e\x61\xd0\x58\xf3\xf0\xbf\xbc\x1d\x43\x9f\x8c\x0c\x26\xa5\xf4\x8d\xac\xa6\x96\xf2\x19\xe3\x2c\x1e\x72\xc7\x4f\xaa\x68\x38\x31\x59\x31\x67\x40\xde\x42\xac\x27\x58\xb6\x4b\x9a\x8c\x0c\xce\xaa\x9a\xec\x2a\x36\x92\x96\xf4\xb4\x94\x31\x9e\xde\x6c\x1f\x11\x64\xc9\xcb\xd3\xc5\x74\xba\xaa\xc0\x15\xbb\x8c\x78\x74\x47\xa1\xb2\xdf\xb8\xe7\x36\x70\x43\xc2\x0d\xd9\xa3\x6e\xc8\x54\x96\xe6\x05\x4b\x3f\x43\xd3\x9c\xa5\x9f\xa0\x49\x3a\xd6\x04\xbc\x14\x5a\x49\x81\x0e\xbc\x98\x3f\x20\xbe\x97\xed\x10\x5f\xb3\x63\x69\x37\xc2\x99\xd7\x7a\xd1\x8e\xdf\x1d\xa2\x64\x70\x44\xbf\x90\xf3\xa8\x13\xd7\xff\x9d\x43\xec\x5d\x5b\x6a\xa0\xf3\xe7\xfa\x1a\x93\xfa\xa8\xd9\x0e\x2d\x12\xfe\x38\x24\x84\x3f\xd6\xe0\xca\x9c\x57\xba\x3e\x57\xa0\x7b\x35\x40\x36\xe0\xeb\x40\xde\x04\xf2\x26\xa0\x13\x02\xbf\x14\xfc\x52\xf0\x4b\xf5\x8e\x5f\x0a\x3a\x21\xd0\x09\x81\x3f\x00\xfe\x00\xf8\x03\xe0\x0f\xe8\x0a\x7f\x00\x74\x42\xa0\x13\xb2\x59\x08\x28\x74\x42\xda\xa1\x13\xf2\x0f\xc3\x74\x5a\x50\x45\x81\x56\x2a\x79\x62\x8d\xad\x53\xc4\xc9\xe6\xbe\x29\xec\xe3\xc3\xec\x1f\x42\xf4\x7a\xf1\xa3\x4d\x13\xef\xe7\x3b\xa6\x78\x97\xa3\x9c\x5a\xc5\x22\xc6\x11\xfe\xa7\x05\xf6\x1c\xc1\x7c\xfe\x73\x8b\xb7\x47\x79\x1b\x9d\x16\xe4\xed\x18\x1d\xe1\xe4\x2d\x41\x63\x34\x5a\x33\x46\xda\x6c\x09\x2b\x3a\xba\x31\xd2\x16\xb0\x3b\xca\x95\x60\xc6\x76\x90\xed\x37\x19\x9b\xe7\x55\x98\x74\x4d\xd4\xa2\x8a\xa4\x85\x7f\x6d\x5b\x55\xc3\x3f\x68\xed\x8e\xe2\xd7\xf6\xbb\xcd\x83\x9d\x6b\xfe\x24\xdf\x3c\xad\x22\x31\x64\xad\xed\x8f\x90\x3e\xa4\x7f\x34\x99\xfe\xf1\xe3\x7d\x2d\xf8\xfc\xcf\x88\x5c\x8e\x93\x74\xdc\xc9\xe5\xe8\xa8\x15\x29\x94\xda\x68\x45\x62\x1f\xb8\xa7\xca\x8a\xdc\x6d\x3a\xd9\xa5\xbc\x69\x39\xa2\xe2\x87\x0e\x1a\x8e\xf6\xa4\x43\xc0\x92\x04\x58\x12\x84\xe4\x76\x24\x24\x17\xb1\x58\x88\xc5\x42\x2c\x56\xbb\x62\xb1\x52\x9f\xee\xab\x9d\xf5\xd9\xda\x48\x95\x4b\x22\x0d\xf3\x31\x9a\x73\xa5\x61\xae\xaf\x4c\x6b\x3e\x10\xf1\x9f\x0f\x6c\x67\x5b\x45\x33\xb5\x6f\x4a\x90\xfc\xfb\x3b\xab\xa6\x04\x8f\x56\x6d\x8d\xe6\xb7\xc2\x78\xa4\x60\xc7\x27\xb4\x7d\x9a\x80\x7d\xd0\x7a\x6d\x72\x82\x7d\xd0\xb0\x0f\xda\x06\xef\x83\xd6\x09\x9c\x14\xb8\x0d\x5a\xbb\xec\x7e\x6a\x3f\x8d\xb3\x78\x74\xc4\xde\xcf\x6c\x87\x7b\x17\x34\x7e\xd1\x6d\xb1\x07\xda\x57\x06\x29\x62\x6e\xb6\x5f\x28\xe8\xce\x4e\x68\x7a\x51\x2a\xca\x2b\xa5\x9c\x2e\x17\x75\xf6\x6b\x83\xec\x53\x03\xb4\xd5\x38\x63\x0d\x3b\xa1\x2d\x9a\x45\x2c\xca\xad\x0a\x88\x14\x3b\xa1\x4d\x15\x0a\xfa\x52\xc2\x55\x3a\x76\x42\x6b\x61\x14\xe4\xc5\xe0\x0f\x6a\x84\xc5\xac\x0d\xf3\x0b\x05\xdd\xfc\x8e\x5c\xef\x03\x7b\xa1\x21\xc6\x11\x31\x8e\x88\x71\x44\x8c\x23\x62\x1c\x11\xe3\x88\x18\x47\xc4\x38\x22\xc6\x11\x31\x8e\x88\x71\x44\x8c\x23\x62\x1c\x11\xe3\x88\x18\x47\xc4\x38\x6e\x48\x8c\xe3\x87\x9e\xa4\x31\x2f\xea\xab\x11\xd5\x98\x91\xe4\x55\x63\xd2\x55\xd4\xd9\x9f\x3d\xc1\xbe\xb1\xc7\x21\x7f\x83\xf5\x77\x3c\x9b\xe1\x17\x2e\xca\xc5\xd8\x2e\xe3\x44\x01\xea\x1c\xa7\x97\x7d\xb8\xcb\xe1\x1c\xb6\x33\x03\xb2\xc2\x76\x66\x40\x56\x40\x56\x40\x56\x3d\x84\xac\xba\x48\x0d\xb5\x6b\x90\x15\x64\x3a\x81\xac\x80\xac\x80\xac\x80\xac\xb0\x9d\x19\x74\x04\x6f\x1f\xc2\xd4\xf5\x3a\x82\x9b\x72\x3b\xb3\x27\x68\x4a\x04\x35\x4d\xd0\x51\x1e\xd4\xb4\x9f\xc6\x29\x5e\x33\x22\x50\x2a\x14\x74\x9e\x97\x64\x71\xa1\x86\x76\x2c\x3b\x1f\x1c\xa0\x14\x63\x43\xd5\x01\x4a\xf6\x5d\x3c\xe1\x49\x41\x1b\xa0\x45\xff\x74\x9b\x83\xbf\x98\xbd\x01\x99\x43\xba\x1e\x16\xbf\xb5\x9f\x75\x09\x34\x75\x9a\x4e\xd2\xf1\x8a\x40\xeb\x11\x8a\x35\xde\xc6\x08\xad\x46\x06\x69\x93\x19\xa4\xaf\xf5\xd1\x09\xf1\x7d\x1f\xa6\x83\xfc\xfb\x8e\xd3\x9a\xfa\x1e\x25\x45\xfa\xe8\x24\x1d\x73\xd2\x47\xd7\x5a\xc6\xb4\x48\x33\x39\x4e\x13\xae\x34\x93\xb5\x16\xd2\xfc\xb6\x88\x7c\xdb\xad\x16\x1b\xa1\xd8\x6f\x8e\x38\x46\xe6\x21\xdf\x8d\xbb\x1c\x83\x33\x2c\x8e\x0b\x83\xe3\xec\xcd\xd5\x7e\xd3\x83\x5d\xb9\x80\x59\x81\x59\x81\x59\x81\x59\xb1\x2b\x17\x76\xe5\x82\x04\x00\x76\xe5\x02\xee\x07\xee\x07\xee\x07\xee\x07\xee\x6f\x09\xee\x87\x12\x0c\x94\x60\xa0\x04\x83\x5d\xb9\xe0\x4d\x83\x37\xad\x87\x76\xe5\x6a\x2d\x4b\xde\x8c\x22\x14\xcf\x0f\xd3\xe1\x35\x46\xa6\x5b\x9a\xbb\x7f\x3e\xc4\xfe\x2c\xe4\xc0\xf3\x9d\x3e\x62\xbb\xae\xa8\x74\xe3\x68\x87\x3c\x75\xa9\x37\xaf\xd7\x59\xb2\x4e\xa9\xdd\xd6\x76\xab\xf0\x4f\xb9\xfc\xa0\x0f\xfb\x2b\xeb\x3a\x0d\x1d\x31\x4f\x80\x57\xf4\xb6\x81\x72\xf0\x8a\xd6\xf0\x8a\xfe\x70\x57\x78\x45\xd7\xa9\xa8\xdb\x62\x7f\xe6\x37\xef\x76\x05\x4d\x58\x02\xba\xee\xa0\x09\xb7\x0f\x73\xb3\x7a\x2e\x61\x32\x20\xa0\xdb\x0d\xf4\x1c\xd8\x04\xd8\x04\xd8\xa4\x9d\x02\xba\x5d\xaf\x93\x1b\x38\xfc\x07\x0b\xe8\xb6\x76\x06\x90\xfc\xd3\x3b\x9d\x19\xc0\x50\x80\x5e\xae\x33\x2f\x78\xa8\xe0\x08\xfc\xb5\x75\x5a\x00\xc1\xdc\x5e\x9b\x8c\x40\x30\x17\x82\xb9\x1b\x2c\x98\xdb\x76\x22\xd4\x98\x0d\x77\xdb\xe9\x7a\xf6\x3c\x50\x7c\x37\x75\x98\x0e\xb2\xfd\xd1\x71\x1b\x35\xde\xe7\xd6\xc8\xb5\x0b\xba\x2d\x74\x72\xbf\x30\x54\x89\x28\x85\x4e\x6e\x0d\x50\xa9\xc9\xfc\x13\xe2\x1a\x1a\x3f\x3c\xc4\x7e\xd6\xa5\x9e\x5b\x6e\x4c\x3d\xf7\x92\x28\xa1\x75\xe2\xb9\xbb\x6f\xfa\x8d\xad\xce\x6d\xe6\x15\xbd\xdb\x85\x39\xba\x57\x35\xf7\x42\xf0\x97\xb7\x8f\x0d\x57\x7f\x6d\x4e\xf3\x43\x34\x17\x0a\x24\x10\xcd\x45\x68\x3c\x42\xe3\x11\x1a\xdf\xab\xa1\xf1\x10\xcd\x85\x68\x2e\x42\x92\x11\x92\x8c\x90\x64\x84\x24\x77\x45\x48\xf2\x26\x24\x15\x90\xe5\x45\x98\x27\x64\x79\x37\x8f\x68\x0a\xfb\x37\xc3\x94\x12\x64\x31\xa3\xe8\x69\xd5\x30\xab\xe6\x0e\x65\x63\xe6\x66\x64\xf5\x51\xa3\x9c\xcf\x14\x54\x25\x5f\xd4\x73\x4a\x5a\xd6\xd9\x67\x87\xd8\x9f\x0c\xd0\x0e\xbb\x2c\x7b\xd7\xca\x5b\x8d\x71\xc7\x33\x66\x71\x8b\x46\x71\x2d\x42\x8f\xe3\xfc\x82\x19\xab\x4a\xd5\xbb\x61\xba\xef\x09\x0e\xb9\x0e\x0e\xb9\x1c\xcc\x21\x4f\xb1\x13\x26\x87\xac\xec\x6f\xd6\x8e\x78\xee\xb7\xe1\xb3\x33\x1e\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\x24\xd8\xe4\x6d\xc3\x26\xff\x66\x88\xe6\xcc\xa8\xc7\x8c\x31\x59\x56\xd4\xbc\x26\x67\x15\x1e\xf5\x6e\x5c\x63\x73\x4a\x13\x51\xae\x96\x8a\x92\x31\x13\xba\x29\x2f\x5f\x53\xd5\x1b\x9e\xb5\xa5\xce\x7e\x6c\x88\x7d\xff\x16\xba\xdf\xb7\xa8\xab\xe5\x44\xf8\xbd\x7d\x8d\x21\xca\xf3\xe6\x5d\xae\x88\xbb\x4c\xbb\xef\xd2\x22\x62\x79\x5c\x04\x4b\xfa\xd5\x74\x29\x51\xef\xfe\xa0\x97\xeb\xa0\x97\xcf\x04\xd3\xcb\xc7\xd9\xa2\x5f\xfc\x72\x9d\xde\x69\x52\xcd\x7a\x2f\x0d\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\x13\x4c\xb3\xd3\x4c\x13\xc4\x11\xc4\x11\xc4\xb1\x87\x89\xe3\x57\x76\xd0\xb8\xf1\xea\xea\x88\x40\x16\xd4\x8c\x25\xff\x38\x56\xd0\xd4\x67\x6e\xb1\x4f\xee\x60\xdf\x1b\xa2\xad\x69\x55\x93\xaf\x96\x13\xe1\x47\xd3\x6a\x3e\x6f\xd8\xab\xb3\x67\x2e\x3b\xc0\xa6\xa8\x46\xf8\xd9\x46\xc5\x17\xd4\x4c\x2c\x6a\x9e\x35\xad\x6a\xf2\x52\xe2\xac\x5c\x74\xe2\x11\x17\xd4\xcc\x82\x71\xea\xfe\xfe\xd8\x58\x4c\x30\xb3\x23\xb4\x53\x30\xb3\xfb\xe8\x5e\xce\xcc\x5e\x47\x77\x7e\xa2\x6f\x1b\x99\xfd\x21\x90\x7f\xbd\x29\x18\x6d\xc5\xd9\x88\x0f\xda\x8a\x46\x4d\x80\x65\x55\xca\x94\x1f\xa3\xeb\x8f\xf8\x23\x35\x62\xdb\xcc\x27\xa3\xb0\x6f\xab\x2c\x3c\xde\x70\xab\x2c\x94\xda\xdb\x2a\xc1\x8f\xd0\x60\xc3\x05\x35\x96\xbb\x61\xa3\xdf\xef\x6a\x95\x3d\x76\xab\x5c\x5c\xac\xd3\x2c\xbb\xbd\xcd\xa2\xea\x41\xed\x52\xeb\xc9\xeb\x37\xd8\x86\xb6\x4b\xec\xdf\xb8\xda\x65\xd0\x6a\x97\x99\x33\xf3\x67\x2e\x9f\xa9\xdd\x32\x7b\x3c\x2d\x23\x14\xf2\xba\xe0\x4b\x5a\xcb\x83\x37\xd0\xdc\xfb\x7f\xc8\xd5\x36\x43\x56\xdb\x5c\x5c\xb8\x3c\x77\xf1\xc2\x62\xed\xc6\xd9\xeb\x69\x1c\xf3\xde\xb7\xdf\x17\x35\xe1\xfb\x45\x9d\x3b\x33\x35\xd3\xe8\x17\x75\x4e\x96\x32\xb7\x5f\xaf\x49\x7e\xc8\xd5\x2e\x7b\x6d\x4b\x33\x75\x79\xfa\x5c\xed\x86\x79\xd4\x6b\x6a\x8c\x11\xb2\xad\xb6\x66\x43\x5a\x26\x75\x9c\x26\xd8\xd1\xe8\x61\x3b\x78\xe1\x41\xb7\x74\x4c\x45\xe1\x1b\x21\x20\x23\xd1\x55\xf6\x64\xf8\x6d\xd6\xbc\x69\x6a\x41\x2a\x8a\x25\xf2\x35\x39\xf2\xf8\xa5\xf9\x88\x71\x5b\x3e\x57\xd4\x65\x7b\xb2\x97\x2e\x69\x9a\xb1\x2a\x12\xaf\xd3\x5a\x26\x18\xef\x57\xcd\xc4\xa3\xbc\xa6\x6e\x49\x99\x3f\x1c\xa4\xfb\xad\xa9\x8e\x70\x9f\x0a\x6e\xbd\x2a\x15\x74\xf6\xe9\x41\xf6\xb1\x01\xa7\xf3\x94\x1a\xf3\x8c\x0a\xaf\xd6\x79\xa9\xd0\x22\x37\xe8\x10\xbf\x40\xf4\x44\xbb\xec\x79\x45\x2f\xce\xaa\xda\x54\x2e\x67\xf7\x4b\x1d\x2e\xcf\x26\x5d\x9e\x8f\x05\x7f\x7d\x43\x6c\x6f\xe5\xd7\x67\xbf\x0b\xa8\xc6\xc0\x8b\x09\x2f\x26\xbc\x98\xf0\x62\xc2\x8b\x09\x2f\x26\xbc\x98\xf0\x62\xc2\x8b\x09\x2f\x26\xbc\x98\xf0\x62\xc2\x8b\x09\x2f\x26\xbc\x98\xf0\x62\x6e\x88\x17\xf3\x1f\x9e\xa0\x3d\x22\x6f\x42\x2f\xaa\x9a\x94\x95\x2b\x15\x5d\xd2\xba\x92\x57\x33\xb2\xce\x3e\xf7\x04\xfb\xee\xbd\x74\xb7\x79\x9a\x2d\xd6\xb2\x47\xcc\x0d\x35\x73\x54\xb3\xcc\x9e\xba\x12\xb9\xa1\xe4\x33\x91\xe9\xc5\xb9\x0b\x6a\x46\x8e\x3d\x60\x9c\xb6\x28\xae\x35\x55\x55\xcc\x43\x5d\x0e\xe4\x92\x40\x55\x40\x55\x49\xa0\x2a\xa0\x2a\xa0\x2a\xa0\xaa\x9e\x41\x55\xc9\xae\x41\x55\x2d\xaf\x49\xd3\xa8\x2a\x09\x54\x05\x54\x05\x54\x05\x54\x05\x54\xd5\x79\x54\x95\xec\x69\xb2\x94\x04\x59\x6a\x1f\x59\x4a\x76\x3b\x59\x4a\x6e\x42\xb2\x94\x5a\xa6\xb3\x22\x90\xe9\x34\x9d\xe4\x81\x4c\x47\xe9\x30\x1d\xac\xb9\x87\x9c\x85\x9f\x4c\xae\x14\x37\xe9\xd0\xbc\xa2\x07\xc7\x2f\xbd\x35\x38\x34\xe9\x08\x3b\x64\x06\x24\x89\x72\xab\xd5\x62\xcd\xc8\x25\x2f\x06\xa3\xeb\x0f\xf9\xc7\x46\x6d\x65\x5b\x78\x58\x54\xf4\x7d\xdb\xab\x99\xd8\x3d\x62\x30\x8a\x48\x36\xfe\x7a\x50\xfc\xd2\x5e\x00\x26\x78\xd5\x2c\xcd\x50\xb2\x62\xbf\xce\xfd\x34\xbe\xd6\x86\xc7\x3e\x9d\x41\xfb\x74\x7e\x30\x44\xdf\x1b\x62\x1f\x08\x85\xbf\xcb\x6e\xa0\xbf\xea\xeb\x9d\x7d\x3a\x6b\x6e\x87\x99\xfa\xbb\x3e\x9a\x16\x9f\xfe\x71\x9a\xe0\x9f\xfe\x41\x6a\xa2\x07\xd2\x39\xa3\x90\x04\x0f\x80\xdc\x3a\x2d\xa6\x77\x4d\x96\x34\x27\x36\x32\x4e\xd2\x69\xd7\x46\xc6\xcd\x15\x15\x64\x8b\x6a\xdb\x8b\x82\xaa\x17\xa9\x41\x5b\xe5\x6f\x8c\x02\x2c\x58\xec\x0f\x47\xaa\x6d\xd1\x4e\x73\xb7\x6a\xd7\xd6\xdf\xea\x8a\x6d\x97\xf6\x88\xa3\x15\x76\xc9\x3e\xb5\x3d\x16\xea\x32\x5d\xa2\x05\xb7\x85\x8a\x25\xe9\x74\x13\x11\xae\x22\x85\xc3\x0c\xbd\x06\xa2\x05\xa2\x05\xa2\x05\xa2\xed\x21\x44\x8b\x19\x5a\xc0\x0c\xad\x7b\x18\xf6\x97\x43\xf4\x5a\x88\xbd\x1a\x0a\x7f\xd1\x7e\x55\x1f\x0f\x5d\x76\xaf\x1a\x95\x7c\x44\x17\x2b\xbf\xc8\xb2\xbc\x22\x1c\xbe\x36\x5d\x71\x86\x2c\xf3\x2b\xe1\x8d\xe5\x9a\x0b\xe6\xd5\xfc\x68\x5e\xce\x4a\xfc\x95\x98\x0b\x47\xf7\x9c\x51\x70\x56\xbb\x33\x98\x73\x02\x65\x75\x55\xce\x18\xb3\xd2\xdc\x2d\xc7\x13\xeb\x98\x76\x25\x37\x62\xae\x27\xf9\xe3\x46\xb2\x9a\x94\xe6\xfd\x44\x51\x33\xf6\xc0\xe3\x0c\x0e\xdc\xc9\x6d\xbd\x97\x92\x6e\x54\xd2\xdd\x50\x92\x71\xa5\xf5\x40\xe6\x4d\x56\xc4\xf7\x66\x15\x11\x17\xf5\x14\x9b\xa1\xfb\xd4\x31\xca\x78\x15\x16\x78\x0d\xfc\xd6\xc9\x70\x15\xc0\x55\x00\x57\x01\x5c\x05\x70\x15\xf4\xb4\xab\xe0\xf3\x21\x7a\x25\xc4\x5e\x0e\x85\x5f\xb2\x47\xdb\xe7\x43\x33\xae\x34\xd3\x42\x4e\x96\x74\xd9\xfe\xf4\x17\x34\xb5\x20\x65\xf9\x38\xbc\xa0\xe6\x94\xf4\x2d\x4f\xa0\x90\xf5\xba\x9d\x3c\x55\xe3\x85\x27\xe2\x47\xe2\x91\x45\x61\x47\xc4\x20\x59\x90\xf3\x46\x37\x75\x46\x11\x39\xa2\x6a\x85\x6b\x52\xde\x0a\x5c\xd2\x4a\xf2\xd8\x8a\x94\xb3\x66\xff\x51\x71\x34\x1a\x59\x51\xf2\x52\x4e\x79\x87\x65\xbe\x97\xe5\x88\x94\xe1\xdc\x5d\x1d\x13\x18\x36\xe3\x4c\x2d\x45\xe1\x83\xba\x73\x91\x98\x6f\xc7\x23\x67\x14\x6e\x92\x5c\x15\x57\xb5\xea\x27\x73\x7c\x1d\x45\x31\xdd\xe7\xb3\x3f\xb5\x78\x2d\x1e\xbd\x47\xd4\x67\xc6\x7a\x10\x6f\x04\xd4\x7b\x07\xe8\xb9\x01\xf6\xee\x81\xf0\x37\xed\x30\xb8\x2f\xf4\x5f\x31\xed\xa0\xd1\x45\xaf\xa9\x37\x23\x59\x49\x5b\x96\xb2\x1e\xd8\x60\x4f\xd4\x64\x6d\x45\xd5\x56\x8d\xb6\xf0\xad\xe9\xc5\x8a\x9b\xd7\xae\x28\x9f\xd6\x58\x73\x92\x82\x78\x2a\xc5\x98\x2f\xa4\x95\x8c\x33\xb1\xe6\x63\x23\x5f\xe6\xd8\xad\x6b\x0c\x4e\xe6\xc8\x61\x8d\x7e\x71\x57\x33\x5a\x76\xd3\x76\x30\xd8\xc1\x6f\xde\x9b\xc5\x23\x02\x21\x71\x5b\xec\x9e\xad\x0e\x8a\x67\x18\x34\xd6\x3c\xfc\x2f\x6f\xc7\xd0\x27\x23\x83\x49\x29\x7d\x23\xab\xa9\xa5\x7c\xc6\x38\x8b\x47\x9d\xf1\x93\x2a\x1a\x4e\x4c\x56\xcc\x19\x90\xb7\x10\xeb\x09\x96\xed\x92\x26\x23\x83\xb3\xaa\x26\xbb\x8a\x8d\xa4\x25\x3d\x2d\x65\x8c\xa7\x37\xdb\x47\xc4\x19\xf2\xf2\x74\x31\x9d\xae\x2a\x70\xc5\x2e\x23\x1e\xdd\x51\xa8\xec\x37\xee\xb9\x0d\x3c\x71\xf0\xc4\xf5\xa8\x27\x2e\x95\xa5\x79\x81\xb6\xcf\xd0\x34\x47\xdb\x27\x68\x92\x8e\x35\x01\x2f\x17\x8b\x52\xb1\xa4\xb7\xc8\xb5\xd5\xa0\x33\xcb\xcb\x8f\xaf\xc7\xfc\x51\xf5\xbd\x6c\x87\xb0\x14\x8e\x15\xa7\x96\x27\x8a\xb0\xbf\x8d\xd1\xf1\x20\xf9\x2c\x93\x48\xe4\x8b\x65\x35\x57\x5a\x95\xd3\x39\x49\x59\xb5\x04\xb5\xd8\xc7\x62\xec\xbb\xfb\x5d\x52\x37\x9a\x2c\x65\x2a\x56\xa4\x0b\x76\x01\x4b\xbc\x80\x69\xa3\x80\xd8\xb0\x71\xa6\x50\x8a\x70\xc9\x95\xf8\x9d\xda\x5a\xee\x9d\xca\x08\x3f\xc4\x38\xf7\x43\x18\x7d\x67\x82\x8e\xd2\xe1\x9a\x1e\x08\xe3\xc9\x8c\x9e\xe2\x5b\xb5\xc0\x8e\xb3\xcb\xff\xe5\xde\xc1\x06\xb2\x72\x91\xae\x5f\x09\xee\x57\x07\xd9\xfe\x2a\x2d\x15\xdf\xaa\xb8\x95\x1d\xc2\x7f\xbb\xcd\x79\x27\xfb\x34\xb9\x90\x93\xd2\x72\x43\xaf\x65\xc4\x3c\x79\x03\xde\x4c\x72\x9e\x52\x74\xae\xc2\x67\xda\xf4\xab\x01\x97\x83\xe7\xb4\x49\xcf\xe9\x8b\x7d\xad\x34\x11\x17\x84\xff\xf4\x2c\x9d\x71\xfc\xa7\xed\x34\x39\x8d\xd9\x94\xba\xca\x81\xbe\xf7\xad\x63\xcb\x0a\xa5\x22\xc5\x7e\xe8\x1e\xc7\xe4\x3c\x64\x4e\x9a\xa5\x1a\x56\x66\x9f\x38\xbe\x11\x46\xa6\x3d\x6e\x4f\x18\x9b\x00\x63\x03\xf4\xde\x11\xf4\x0e\xe6\x02\xe6\x02\xe6\xd2\x2e\xe6\x92\xfa\xb9\x96\xce\x0c\x2e\x8a\x78\xa8\x73\x34\xeb\x8a\x87\x6a\xe7\xd4\x20\xe2\x3f\x82\x6f\x67\x5b\x45\x03\xb5\x6f\x41\x92\xfc\xc0\x5d\xce\xec\xe0\x60\x41\xd2\x8a\x0a\x8f\x41\x11\xf4\xba\xa1\x95\x49\xac\xe0\x68\x0b\x76\x6c\xca\xf0\x60\x65\x41\xa3\xbc\x16\xfb\x8c\x3f\x27\x76\xba\x0f\xae\xca\x5a\x56\x76\x1f\xdd\xeb\x3e\xca\xf7\x18\x93\xb3\x4a\x7a\xb4\xea\x3c\x4f\x29\xc6\xdf\xb7\xcc\xa3\x46\x2d\x93\x17\x68\x9e\x52\x15\x6b\xa2\x09\x3a\xda\xc4\x84\x85\x2b\x83\x62\xa2\x12\x34\x51\xf9\x58\x3f\xbd\xd0\xcf\x3e\xda\x1f\xfe\xb0\x6d\xed\x9f\xed\xef\x9d\x55\x51\x85\x7f\xd1\x68\x67\x1e\xb7\xc5\x7d\xe0\x46\xe7\x74\x12\xec\x87\x6a\x74\xdc\x61\x3e\x68\x89\x30\x3f\x29\xc7\xaf\x34\x66\x67\xe2\x6a\x7e\x06\x9f\x29\xe9\x91\xa1\x94\xae\xe6\x17\x44\xa6\xf9\x79\xe3\xb3\x30\xff\x5e\xb4\x3e\x16\xe7\xc7\xe1\xda\xcb\xb5\xe4\x2b\x7d\xf4\x72\x1f\x7b\xa9\x2f\xfc\x19\x9b\x56\x7e\xa4\x6f\x56\xd5\xd2\x7c\x12\x97\x55\x79\xb3\xab\x91\xe8\x8a\xf1\x53\x34\x32\xe5\x79\x0a\x8e\x79\xc5\x7c\xab\xa4\x3b\x01\x5b\xa3\x52\x9a\x3f\x38\x0f\x83\xcb\x29\x69\x73\x3c\x95\x73\x19\x3d\xa2\xde\x34\xdb\x54\x84\x89\x15\x64\xb5\x90\x93\xe3\x11\x71\x47\x2e\x0d\x60\xbd\x4b\x8e\x5b\x7d\x1b\xc0\xbe\x7d\x74\x0b\xaf\x96\x27\x66\xbf\xa3\x84\xaa\x5d\x16\xff\xfa\xc3\xfe\x83\xcd\x36\x76\x07\x6f\x02\x4a\x25\xe9\x34\x3b\x19\x3d\x6e\x8b\xf2\x3e\xe2\x91\xf4\xf5\xbb\xc1\x46\x08\xfb\xb6\x1c\xb9\xbe\xbf\x9f\x1e\x35\xf7\x48\x2d\x19\x25\x14\xcd\x4f\xa8\x52\xf2\x83\xfd\x79\x88\xfd\x69\x88\xbe\xc5\x7b\x96\x1d\x51\xfc\xc6\xac\x5c\xf4\x46\x23\x88\x1c\x93\xd8\xa3\x59\xb9\x38\xe5\xb9\xc6\x0c\x28\x9e\x5a\x98\xb3\xa2\x31\x5b\xa7\xbf\x3b\x51\x55\xd0\x44\x55\x41\x13\x8d\x14\x94\x2a\xd0\xe3\xa2\xd7\x1b\x43\x9e\xd1\xeb\x79\x0a\x45\x13\x03\x9d\xeb\x39\x1b\xc9\x5b\x61\xdf\xd1\x4f\xbb\xcd\x17\x52\x50\xe4\x67\x8a\x72\x9e\xbb\x51\xaa\xde\xc7\x9f\x85\xd8\x97\x42\x74\x9f\xe7\xa4\xe0\xd7\xb1\xdb\x78\x1d\xee\x4b\x36\xcb\xdb\xa8\xa9\x12\xde\x9e\xd7\x64\xbd\x8d\x2f\x84\xe8\x0d\xe2\x6d\x08\xe9\x16\xeb\x35\xb0\x5f\x0a\xb1\x4f\x87\xe8\x0e\xf1\x6b\x38\x9c\xe5\x4b\x1a\x63\x61\x65\x7b\x99\xa4\x08\x37\x53\xb1\x1d\x59\xb9\xc8\x25\x97\xf5\xa9\x85\xb9\xb3\xc6\x4f\x5d\xd8\xc0\x8a\x00\x83\xe3\x1c\x0c\x1a\xed\x78\x8a\x4e\xd0\x64\x73\xed\xc8\x9f\x31\xb0\x9f\xff\xfc\x90\xf0\xf5\xe8\x63\x2b\x39\xf5\xa6\x31\x79\xd0\xd4\x5c\xdc\x96\x65\xa9\xec\xef\x42\x62\xdc\x38\x55\x4f\x5f\x93\x57\x25\x9d\x7d\x75\x90\xfd\xb7\x01\xda\xe9\xba\x7a\xca\xba\xd8\xfe\x0e\xca\x8d\x09\x8f\xcf\xe6\xd4\x9b\x8b\xbc\xd8\x16\x29\x8f\xc7\xf9\x05\xb3\x3e\x55\x33\xbf\x37\xe7\x8e\xd8\x72\xd9\x7f\x26\x70\x23\x78\x26\x70\x8e\xcd\x9a\x33\x81\x7a\x5d\xc8\x9c\x23\x38\x2d\x5e\x9d\x24\xd3\x90\xd8\x39\xf4\xc9\x21\xfa\x04\x7d\x72\x64\x14\x21\xa3\x08\x19\x45\x3d\x94\x51\x04\x7d\x72\xe8\x93\x23\x93\x03\x99\x1c\xc8\xe4\x40\x26\x47\x57\x64\x72\x40\x9f\x1c\xfa\xe4\x9b\x25\x76\x1d\xfa\xe4\xed\xd0\x27\xff\x93\xbd\x74\xb7\x15\x26\xae\xcb\x69\x4d\x2e\xea\xec\xa5\xbd\xec\x17\x5d\x91\xdf\x8f\xd6\x57\x20\x5f\xe4\x57\xc5\x78\xd3\x0b\x1f\xbe\xf8\x65\xb3\x6d\x0c\xf8\x16\x3a\x29\xc0\xdc\x11\x3a\xc4\xc1\xdc\x18\x8d\xd2\xbe\x40\xdf\x9c\x78\xd8\x86\x64\xb4\xce\x05\x63\xb8\x3d\x6c\x77\xa5\x43\x4e\xdc\xc0\xeb\x81\x0b\x10\xcd\x02\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\x03\x5e\xeb\x14\x5e\xfb\xb6\x21\x1a\xb4\x22\x50\x0b\xfa\x58\xd9\x0a\xbe\x33\x03\xac\x72\x86\xd5\x2d\x2b\xfc\x0d\xb2\x3f\x1c\x64\x9f\x1b\xa0\xad\xc6\x89\x57\xcb\x89\xf0\xbf\x68\x2c\xde\x6e\xda\x2e\xe9\x92\x59\x52\x8b\xe2\xee\x12\xfc\x82\xa9\x42\x41\x5f\x4a\x54\xdf\x64\x5e\xd1\x37\x1d\xe1\xbb\x51\x3b\xf2\xb5\xe5\x31\x79\x16\xf3\x5b\x0a\x66\x7e\x07\x58\xc2\x27\x67\xdb\xe8\x06\x96\xa0\x48\x55\xeb\x23\xca\x0e\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\x10\x18\xb0\xbb\x30\xe0\xf3\x4f\xd1\x31\x33\xf5\xd9\xce\x16\xb7\xd3\x71\x6b\xa8\xb3\x2a\xf9\xac\x26\xeb\xba\xac\xb3\x3f\x7d\x92\x3d\xbf\x97\x98\x4f\x6e\xfa\x9e\xfa\xa1\x79\x73\xa2\x88\xd8\x5e\xe3\xb4\x33\x95\x79\xea\x8e\xd4\x8e\x79\x5e\x97\xf3\xbb\x24\x70\x16\x70\x16\xb6\xa1\x03\xce\x02\xce\x02\xce\xea\x1d\x9c\xd5\x45\xbb\xac\x75\x0d\xce\xc2\xf6\x5f\xc0\x59\xc0\x59\xc0\x59\xc0\x59\x1b\xb1\xfd\x57\x4f\xd3\x27\xec\x4f\xd4\xcb\xfb\x13\x25\x37\x21\x7d\x4a\xd5\xde\x54\x9f\x52\x22\xee\x69\x9a\xa6\x78\xdc\xd3\x24\x1d\xa3\x23\x35\x53\x1e\x5d\x0a\x8a\xd6\xae\xfd\x26\x39\x72\xc9\xfc\x05\xe5\x26\x36\x18\x11\x65\x46\x41\x39\xb7\x34\x63\xa1\xcc\x1b\x56\xeb\x8e\x45\x7f\x7c\xbb\x2f\x22\xdb\x21\x86\xa3\x88\x94\xb7\x71\xd8\x90\xf8\xa9\x83\x40\x4c\xf0\xab\x39\x3a\x4b\x67\x2a\x14\x9f\x0f\xd1\x81\x26\xda\x1b\x62\xcf\xd8\x02\xa7\xc9\x2d\x70\xbe\xd1\x47\xb3\xe2\xa3\x3f\x45\x27\xf8\x47\x7f\x84\x9a\xeb\x84\xf4\x98\xd8\xff\x66\x86\x92\xce\xfe\x37\x4d\x17\x36\x2f\x24\xf3\xcf\xd0\xb4\x4b\x32\xbf\xe9\xd2\x82\x52\xb1\x6b\x1b\xa9\x82\xda\x46\x23\x15\xfb\xf2\x88\xaf\x91\xda\x69\x6e\x8b\xe0\xda\x63\x42\x5d\xb1\xed\xd5\x7e\x71\xb4\xca\x5e\x4d\xdb\x67\xb7\xdb\x72\xb5\x67\x6b\x1d\xa0\x5c\xa0\x5c\xa0\x5c\xa0\xdc\xde\x41\xb9\x98\xb6\x05\x4c\xdb\xba\x87\x75\x63\x5b\xb3\x8e\x6c\x6b\x06\x97\x02\x5c\x0a\x70\x29\xc0\xa5\x00\x97\x42\x4f\xbb\x14\xb0\xbb\x25\x76\xb7\xc4\xee\x96\xed\xda\xdd\x12\x1e\x3b\x78\xec\x7a\xd5\x63\x97\xca\x0a\xb4\x3c\xce\xd1\x72\xe8\xe2\x63\xec\x04\x4d\xd2\xb1\x26\xe0\xe5\x62\x51\x2a\x96\x82\xd1\x72\xcc\x1f\x2d\xdf\xcb\x76\x88\xaf\xd9\xb1\xb4\x6d\xc3\xcc\x9b\x71\xf3\xbc\xd7\x86\x68\x5c\x84\xc8\xe7\xd5\x8c\xec\x6c\x59\x65\x0a\x66\x68\xa5\xbc\xf1\x8e\xd3\x39\x49\xd7\xad\x40\xf9\x77\xb2\x17\x86\xd8\x9f\x0f\xd0\x56\xe3\x8a\xab\xe5\x44\xf8\x93\x7d\x66\x27\x73\x09\x65\xe4\xad\x49\x8c\x15\x14\x7f\x49\x94\x34\x6d\x94\xd4\x12\xa9\x8c\x11\x67\xd5\xc2\x57\x66\xe6\x1c\xd7\x58\xf8\x38\xcb\xb1\x41\x0f\x68\x70\x95\x1d\x8f\xbd\x91\xdf\xee\x82\x9a\x91\x97\x12\xee\xca\x75\x79\x38\xfe\x86\xec\x64\x55\x7b\xeb\x49\x5e\xb1\x35\x6e\x73\xec\xea\x69\xe6\x27\xe5\x6e\x7f\x8f\xe4\x2e\xb4\x34\x90\x7c\x00\x2d\x0d\x78\xac\xe0\xb1\x82\xc7\xaa\x87\x3c\x56\xd0\xd2\x80\x96\x06\x3c\x05\xf0\x14\xc0\x53\x00\x4f\x41\x57\x78\x0a\x52\xc7\xe8\x08\x3b\x14\x3d\x60\xa3\x8d\xfb\x39\xd3\x30\x6b\xe1\x5e\xbe\x45\x07\x8c\x23\xed\x64\x16\x90\xe1\x00\x56\x85\x0c\xc7\xe6\x49\x84\x60\x7f\x1c\xa2\xd7\x7b\xd5\x78\xd9\x6f\x84\xd8\xaf\x87\x1c\xd1\xdd\x37\x66\xe5\xa2\x77\x34\x16\x95\x8d\xdd\x97\x95\x8b\x42\x0b\x77\x6a\x61\xce\x5a\xf6\xb5\x30\xcc\xb6\xaa\xa0\x89\xaa\x82\x26\x1a\x29\x28\x55\xa0\xc7\x05\x95\xbb\x40\xf3\x9c\xca\xcd\xd2\x0c\x25\x9b\xa0\x72\xae\xe7\x6c\x64\x77\x2b\xf6\x6b\x43\x34\x6a\xed\x24\x26\x98\x6d\x0d\x61\x13\xc3\xa6\x29\x69\x59\x67\xdf\x3d\xc4\xfe\xed\x80\xb3\xcf\x98\xde\x98\xe0\xf1\xa2\xb8\xbc\x45\x2a\xc7\x62\x6a\x23\xf6\x2d\x73\xa2\xa8\xcd\x7b\x18\xcf\x0d\x0a\x5b\x4d\x61\x1b\x11\x1f\xbe\x3e\x17\x4c\x62\xf7\xb2\x47\xad\x3d\xce\x78\x7b\x93\x8f\x0e\x72\x34\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\x0a\xf6\xda\x69\xf6\xba\xf9\xc2\xca\x80\x68\x81\x68\x81\x68\x37\x11\xa2\x7d\x75\x88\xf6\x7a\x29\xa2\x95\xe5\x9a\x2f\x96\xd5\x5c\x69\xd5\x09\xfe\xfc\xe4\x10\xfb\x8a\x0b\x1f\x7e\xaa\x91\xe0\xcf\x05\xbb\xb0\x25\x5e\x58\x57\x04\x80\x3e\xe8\x62\x90\x95\x15\x04\x7e\x6c\x22\x08\xf4\x52\x30\x7a\x1c\x63\xa3\x0e\x60\x14\x10\xb2\xb2\xe9\x11\xff\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\x09\x06\xb9\x91\x0c\xf2\x04\x4d\xb2\x63\xd1\x23\x36\x83\xdc\xe9\x8e\xff\xac\x5c\xc2\x21\x06\x14\x80\x11\x80\x11\x80\xd1\x05\x18\xff\x57\x88\x76\x59\x31\xa0\x8a\x26\x67\x15\xe3\x8b\xe4\x74\xc4\x4c\x39\x67\xff\x39\xc4\x7e\x2b\x44\x77\x57\x1c\x0e\x87\xb3\x5c\x8c\x64\x45\xd5\x56\xed\x06\x95\x22\x1c\x22\xc5\xc2\x3c\x3a\xd4\x73\xfe\xd4\xc2\xdc\x59\xe3\x58\x17\x86\x88\x2a\x74\x41\x30\xbb\xb3\x74\x86\x33\xbb\x53\x74\x82\x26\x9b\x0b\x11\xe5\xcf\x18\x18\x1b\xfa\xa5\x61\x3a\x2b\x1a\x3d\xad\xaa\x5a\x46\xc9\x7b\x5a\x3c\x28\x60\x94\x4b\xff\xd8\xd8\xf7\xfb\x86\xd9\xff\x1a\xa0\xbb\xdd\x05\x5d\x2d\x27\xc2\x2f\x34\x82\x7f\xe7\x8d\x92\xba\x82\xf9\x46\x4d\xe6\xeb\x3c\x84\x3b\xfe\x94\xd7\x13\xe8\xb7\x09\xf4\xfb\xe6\x60\xf4\x7b\x88\x1d\x30\xd1\xaf\x4f\x67\x34\x59\x30\x7f\x01\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x1b\x09\x80\xf7\xd3\x38\x8b\x47\x47\x6c\x00\xbc\xc3\x0d\x80\xf9\xba\xad\x9a\xfa\x22\x70\x15\x5c\x19\x5c\x19\x5c\xb9\x8d\x5c\xf9\xe5\xa7\x68\x52\x20\x4e\x21\xe0\x3c\x56\x4e\xd4\xe2\x99\x05\x35\x93\x51\x74\xad\xc4\x49\xc1\x72\x29\x93\x95\x8b\x3a\xfb\x8e\xa7\xd8\x0b\x7b\x69\xbb\xb8\xf8\x6a\x39\x11\x4e\x88\x19\xac\x66\x8e\xbd\x96\x71\xb6\x23\x59\xd5\xcc\x8c\x5d\x48\x92\x17\x12\x1b\x36\x2e\x11\xea\xcf\x6e\x9a\xe8\x73\x6a\x97\xb3\xc5\x24\x60\x1b\x60\x1b\xf6\x87\x03\x6c\x03\x6c\x03\x6c\xeb\x1d\xd8\xd6\x45\xdb\x9f\x75\x0d\x6c\xc3\xbe\x5c\x80\x6d\x80\x6d\x80\x6d\x80\x6d\x1b\xb1\x2f\x57\x4f\x53\x28\x6c\x1c\xd4\xcb\x1b\x07\x25\x37\x21\x85\x4a\x5d\xa3\xf3\x22\x26\x6b\x96\x66\x78\x4c\xd6\x49\x3a\x4e\x13\x35\x77\xd0\x37\xb7\x47\x2b\x27\xe2\x3e\x8c\xa8\x11\xd5\xc7\x3a\x1b\xe9\x0b\x15\xc0\xb7\x04\xc7\x63\x1d\x66\x07\x7d\x74\xff\x44\xd5\xac\xd4\xdc\xea\xda\x51\xf4\xff\xde\xee\xc6\x65\x3b\xc5\x58\x14\x91\x7c\xc9\xd8\x3e\x71\xb4\xb3\x6c\x4c\xa0\xac\x79\x4a\xd1\x39\xf7\xde\xf9\x91\xbe\xd8\x51\x3a\xdc\xdc\x3b\xc1\x0e\xd2\x41\x3b\x48\x7f\x30\x44\xdf\x1b\x62\x1f\x08\x85\xbf\xcb\x6e\xa0\xbf\xea\xe3\x73\xad\xf3\x52\x5e\xca\xca\x9a\x58\x35\x08\xcf\x8f\xae\xab\x69\x85\x0f\x84\xf6\xfc\x5c\xe2\x0b\x1c\x55\x8b\x18\xf3\xa4\xe2\x2d\x7b\x66\xb0\x2a\xdd\x30\xea\x5f\xbc\x26\xeb\xb2\xf5\xed\xbb\xf7\x6b\xb6\xf6\x75\xe6\x56\x87\xcf\xc5\x55\x2d\x92\xd8\x7f\xd4\x38\x57\x93\xd2\x1c\xf1\x18\xcb\x58\xf1\xa5\xf3\xf9\xb2\x31\xb5\x91\x94\xbc\x70\x03\xf1\xf9\xa8\x73\x2e\x5f\xf6\x9a\x00\xca\x58\x45\x59\xd6\x3b\xab\xe6\xa4\x7c\x36\xae\x6a\xd9\xb1\xc2\x8d\xec\x58\x29\xaf\xa4\xd5\x8c\x3c\xb6\x7b\x4e\x5f\x30\x4a\x89\x47\xef\x72\x3f\xab\x9b\xfa\x3f\x17\xa2\x39\x61\x1b\x92\x74\x9a\xdb\x86\x09\x6a\xba\x1f\x8a\x08\xe2\x04\x8f\x20\xde\x3a\x2d\x66\x81\xeb\x2a\xef\xa2\x51\xde\x7e\x76\x8e\x66\x69\x9b\xd8\xac\x71\x9d\x05\x36\x6f\xb8\x0a\x6a\xe3\x86\xab\x51\x63\xe5\x36\x70\xb1\xbf\x1e\x71\x1b\xae\x21\x73\xd3\x48\xd7\x0e\x9c\xea\x8a\xaf\x11\x3b\x24\xce\xb4\x8c\xd8\xb4\x7d\x41\x27\xcd\xd9\x65\xba\x44\x0b\x6e\x73\x16\x4b\xd2\xe9\x26\x82\x7e\x67\xf8\xb3\x5c\xe4\x15\xd5\x81\x7a\x81\x7a\x81\x7a\x81\x7a\x7b\x08\xf5\x62\x22\x17\x30\x91\xeb\x1e\x16\xfe\xe5\x10\xbd\x16\x62\xaf\x86\xc2\x5f\xb4\x5f\xd5\xc7\x43\x97\xdd\xab\x4f\x25\x1f\xd1\xc5\x0a\x32\xb2\x2c\xaf\x08\xc7\xb1\x4d\x69\x9c\x21\xcb\xfc\x4a\x78\x63\xb9\xa6\x8c\x79\x35\x3f\x9a\x97\xb3\x12\x7f\x25\xe6\x02\xd4\x3d\xb5\x14\xbc\xd6\xee\x0c\xe6\x7c\x41\x59\x5d\x95\x33\xc6\xe4\x35\x77\xcb\xf1\xe8\x3a\xa6\x5d\xc9\x8d\x98\xeb\x52\xb1\x13\x76\x56\x93\xd2\xbc\x9f\x28\x6a\xc6\x1e\x78\x9c\xc1\x81\x3b\xcb\xad\xf7\x52\xd2\x8d\x4a\xba\x1b\x4a\x32\xae\xb4\x1e\xc8\xbc\xc9\x8a\xf8\xde\xac\x22\xe2\xa2\x9e\xab\xb2\x94\xf7\xad\x63\x94\xf1\x2a\x2c\xf0\x1a\xf8\xad\xb7\xe1\x72\x80\xcb\x01\x2e\x07\xb8\x1c\xe0\x72\xe8\x69\x97\xc3\xe7\x43\xf4\x4a\x88\xbd\x1c\x0a\xbf\x64\x8f\xb6\xcf\x87\x66\x5c\x19\xbb\x05\x9e\x0f\x6c\x7f\xfa\x0b\x9a\x5a\x90\xb2\x7c\x1c\x16\x2b\x63\x4f\xc0\x91\xf5\xba\x9d\x94\x5f\xe3\x85\x27\xe2\x47\xe2\x91\x45\x61\x47\xc4\x20\x59\x90\xf3\x46\x37\x75\x46\x11\x39\xa2\x6a\x85\x6b\x52\xde\x0a\x80\xd2\x4a\xf2\xd8\x8a\x94\xb3\x66\xff\x51\x71\x34\x1a\x59\x51\xf2\x52\x4e\x79\x87\x65\xbe\x97\xe5\x88\x94\xe1\xfc\x5e\x1d\x13\x38\x37\xe3\x4c\x2d\x45\xe1\x83\xba\x73\x91\x98\x6f\xc7\x23\x67\x14\x6e\x92\x5c\x15\x57\xb5\xea\x27\x73\x7c\x26\x45\x31\xdd\xe7\xb3\x3f\xb5\x78\x2d\x1e\xbd\x47\xd4\x67\xc6\x7a\x10\x6f\x24\xd5\x7b\x07\xe8\xb9\x01\xf6\xee\x81\xf0\x37\xed\x70\xba\x2f\xf4\x5f\x31\xed\xa0\xd1\x45\xaf\xa9\x37\x23\x59\x49\x5b\x96\xb2\x1e\x10\x61\x4f\xd4\x64\x6d\x45\xd5\x56\x8d\xb6\xf0\xad\xe9\xc5\x8a\x9b\xd7\xae\x28\x9f\xd6\x58\x73\x12\x01\x41\x8c\x1e\x91\x91\xd3\x4a\xc6\x99\x58\xf3\xb1\x91\x2f\x73\xec\xd6\xd5\x79\xf6\x3d\x3f\x6a\x8d\x7e\x71\x57\x33\x5a\x76\xd3\x76\x54\xd8\x41\x74\xde\x9b\xc5\x23\x82\x2e\x71\x5b\xec\x9e\xad\x0e\x8a\x67\x18\x34\xd6\x3c\xfc\x2f\x6f\xc7\xd0\x27\x23\x83\x49\x29\x7d\x23\xab\xa9\xa5\x7c\xc6\x38\x8b\x47\xaf\xf1\x93\x2a\x1a\x4e\x4c\x56\xcc\x19\x90\xb7\x10\xeb\x09\x96\xed\x92\x26\x23\x83\xb3\xaa\x26\xbb\x8a\x8d\xa4\x25\x3d\x2d\x65\x8c\xa7\x37\xdb\x47\xc4\x2b\xf2\xf2\x74\x31\x9d\xae\x2a\x70\xc5\x2e\x23\x1e\xdd\x51\xa8\xec\x37\xee\xb9\x0d\x3c\x7a\xf0\xe8\xf5\xa8\x47\x2f\x95\xa5\x79\x41\xc0\xcf\xd0\x34\x27\xe0\x27\x68\x92\x8e\x35\x01\x2f\x17\x8b\x52\xb1\xa4\x07\x32\xe6\xf6\x31\xe4\xeb\x31\x7f\x7c\x7d\x2f\xdb\x21\x0c\x85\x63\xc4\x69\x13\x66\xbf\xb0\x8f\x0d\xd3\x81\x06\x37\x93\x4b\x6b\x72\xd1\x16\x07\xf9\xea\x10\xfb\x3d\x97\x26\xf4\xcf\x34\x22\x0a\xb2\xc8\x8b\xe8\x0a\x55\x90\x07\x6b\xec\x46\x67\x54\xb0\xcb\x43\xf6\x53\x37\x6a\x7e\x0e\xad\xd7\x09\xb1\x3e\xb0\x73\xc1\x1f\xd8\x1e\xb6\xbb\x52\xe8\x59\xb4\xa7\xf7\x7b\x0a\x12\x16\x81\xfc\x07\x32\x12\x20\xff\x01\x37\x15\xdc\x54\x70\x53\xf5\x90\x9b\x0a\xf2\x1f\x90\xff\x80\x7b\x00\xee\x01\xb8\x07\xe0\x1e\xe8\x0a\xf7\x40\xea\x00\x25\xd8\x58\x74\xd4\x86\x19\xcc\x2d\xff\x21\x56\x76\xd0\xff\xd8\xec\x9c\x16\xfa\x1f\xd0\xff\xd8\x5c\x99\x17\xec\xb5\xa7\xe9\xb8\xad\x2b\x2d\x3f\x53\x94\xf3\xfc\x6d\x39\x1a\xc7\xcb\x72\x51\x4a\x8c\xa5\x4b\x7a\x51\x5d\xb5\x0a\x74\x21\x30\xf6\xfc\xd3\xec\x3b\x06\xe9\x3e\xcf\xd5\x57\xcd\xcb\xc2\x87\xeb\x8b\x81\x4c\xf3\x52\xad\xd5\xe8\x8c\x5d\x6a\x6c\xdc\xb8\x6e\xca\x5d\xe4\x92\x28\xb1\xd6\x15\x5d\x4e\x19\x21\x0c\x02\x0c\x07\x61\x10\x60\x38\x60\x38\x60\xb8\x1e\xc2\x70\x5d\x14\x0c\xdd\x35\x18\x0e\x51\xba\xc0\x70\xc0\x70\xc0\x70\xc0\x70\x10\x06\x41\x18\xe1\xed\x83\xa7\xba\x3e\x8c\x70\x53\x0a\x83\x7c\xb0\x8f\xfe\x99\x88\xc2\x2a\x92\xc6\xa3\xb0\x72\x74\x9d\xae\xd5\x8a\xc2\x72\x78\xd1\xa8\xbd\x5e\x77\x02\xb2\xbc\x84\xcb\x64\x54\xf1\x5a\x48\xa9\x25\x3a\x22\x6f\x0f\x8e\xf4\xba\xc0\xe6\xcd\x48\x2f\x3f\x02\x67\xc6\x7e\xd5\xaa\xa4\x3b\x1a\x8c\x3f\x0e\x45\x7f\xf4\xce\x5a\x34\xee\x11\x5b\x6b\xa4\x26\x78\xdb\x2f\x4e\xd9\x10\xf4\x26\x48\xd9\x3b\xe8\x19\x2a\x57\xe8\x8e\xac\x50\xa6\x13\x6f\x1c\xc9\xad\x50\x29\x69\x52\xa5\xe4\x5f\xf7\xd3\x3f\x17\xd2\x22\x25\xd2\x1d\x69\x91\x6b\xd4\xa1\xae\x4b\xef\x14\x42\x24\x65\x2a\xba\x84\x48\x3a\x77\xfb\x9a\x31\xb4\x37\x85\xf5\x2e\x50\x9e\x5b\xef\x8e\xd5\xc8\x32\xd0\x9d\x37\xc0\x41\x12\x2d\xb1\x1f\x19\xad\x65\xa0\x47\x7d\x35\x55\x6a\x1a\xeb\xe3\xe2\x74\x5f\x63\x6d\x97\xd0\x21\xb3\x0d\x7d\x15\x10\x73\x10\x73\x10\x73\x10\x73\xe8\xab\x40\x5f\x05\xfa\x2a\xd0\x57\x81\xe7\x06\x9e\x1b\x78\x6e\xe0\xb9\x81\xe7\xa6\x25\x9e\x1b\xe8\xab\x40\x5f\x05\xfa\x2a\xd0\x57\x81\x63\x14\x8e\xd1\x4d\xae\xaf\xd2\x18\x93\xae\x02\xcb\xeb\x80\xd4\x6b\xd2\x5d\x69\xb9\x2a\xca\x4f\xef\xa4\x79\x91\x63\x90\x96\x35\xd3\x15\x2c\x57\xa7\x18\xb8\x8e\x29\xd9\xbc\x92\xcf\x5a\xd3\x2c\x53\x25\x65\x4c\x2a\x14\x34\xb5\x2c\xe5\xd8\x1f\x3f\xc8\xbe\xd2\x4f\x6f\x70\x5f\x61\x33\xf4\xa3\x9a\x2c\x65\x22\xd6\xa9\x56\x77\x71\x66\xd2\xd3\xce\x45\x8b\xe2\x36\x97\xc4\x6d\x62\xfc\x4a\xd7\x61\x9b\xa5\xd7\xba\x62\xca\xbc\x49\x6b\x51\x7a\xaa\x44\x6f\x15\xdd\x71\x91\xde\xc4\xbb\xe3\x63\x34\x47\x67\x6b\xea\xc9\x7b\xda\xd4\x76\x8b\xd4\xaa\x73\x8b\x3a\xa7\xd9\x17\x7d\xde\xa7\xd5\x15\x6b\x56\xa0\xda\x61\xb2\xcb\xbf\x73\xde\xc1\x06\xb2\x72\x91\xc2\x7f\xb9\xbd\xc6\xab\x9e\xd4\xe4\x42\x4e\x4a\xcb\x4d\xbd\x6d\xeb\xe2\x8d\x7f\xe1\xc9\x27\xe9\x6d\xf4\x96\x0a\x97\x77\xeb\xde\x38\x90\x22\xbc\xda\x4d\x7a\xb5\xff\xa0\xaf\xad\xa6\xe8\xaa\xf0\x98\xbf\x99\x96\x1c\x8f\x79\x47\x6d\x5d\x6d\xc3\x53\x28\x35\x1c\xbc\x53\x6b\x9c\x6e\xc6\x36\x26\xff\xeb\x5d\x35\x6c\xdd\x4c\x41\xd2\x8a\x0a\xf7\xb4\x89\x35\x7a\x53\x46\xef\x58\x81\x0b\x75\x6d\xa8\xc9\x7b\xb0\xb2\xa0\x51\x5e\xa9\x7d\xc6\x9f\x13\x3b\xdd\x07\x57\x65\x2d\x2b\xbb\x8f\xee\x75\x1f\x35\x96\x20\x45\x39\xab\xa4\x47\xab\xce\xf3\x94\x62\xfc\x7d\xcb\x3c\x6a\xd4\x32\x79\x81\xe6\x29\x55\x61\x6e\x27\xe8\x68\x13\xf3\xbd\x05\x9e\xeb\x05\xfb\x1a\x60\x5f\x3f\xd6\x4f\x2f\xf4\xb3\x8f\xf6\x87\x3f\x6c\x63\x86\x67\xfb\x7b\xc7\xbe\x56\x40\x56\xa3\x9d\xb9\xf3\x9a\x3b\x02\x8c\xce\xe9\x24\x7d\x0e\xd5\xe8\xb8\xc3\x9c\x96\x88\x58\x07\x29\xc7\xaf\xcc\xab\xf9\x51\x71\x35\x3f\x83\x7b\x6a\xf4\xc8\x50\x4a\x57\xf3\x0b\x22\xfb\xf1\xbc\xf1\x59\x98\x7f\x2f\x5a\x1f\x8b\xf3\xe3\x70\x6d\xc3\x9f\x7c\xa5\x8f\x5e\xee\x63\x2f\xf5\x85\x3f\x63\x2f\xd9\x3e\xd2\x37\xab\x1a\x0b\x7c\x45\x8f\x64\x55\xde\xec\x6a\x24\xba\x62\xfc\x14\x8d\x4c\x79\x9e\x82\xaf\x75\x85\xbf\xa7\xa4\x3b\x5e\xeb\x51\x29\xcd\x1f\x9c\xc7\x02\xe4\x94\xb4\x09\x72\xe4\x5c\x46\x8f\xa8\x37\xcd\x36\x15\xbe\xf2\x82\xac\x16\x72\x72\x3c\x22\xee\xc8\xd3\x55\xad\x77\xc9\xd7\x9c\xbe\x0d\x60\xdf\x3e\xba\x85\x57\xcb\x13\x47\xda\x73\x73\xea\xda\xc2\x80\x05\x21\x0c\x38\x4b\x33\x2c\x19\x3d\x6d\x6b\x4b\xec\x71\x0b\x52\xd4\xbc\x53\xb5\x46\x45\xcb\x57\x8b\x7f\x31\x48\xbb\xc5\x6a\x51\x24\x3f\x3b\xeb\x44\x53\x52\x53\xfc\xcc\x7e\x69\x90\x7d\x62\x80\xb6\x8b\x7f\x5d\x2d\x27\xc2\x6f\x37\xbd\x15\xf9\x8c\x52\x56\x32\x25\x29\xe7\xd1\xcf\xb4\x3d\x83\x5c\x89\xb1\x25\xb2\x99\xf1\xd8\xde\x9b\xb6\xb6\xa3\xbe\x94\xe0\xff\x9f\x57\xf4\xe2\xac\xaa\x4d\xe5\x72\xb6\x12\xa6\xde\xe5\xd9\xe9\x1b\xa2\x81\x79\x29\xf8\x9b\x18\x63\xa3\xe6\x37\xe1\xe9\x09\xe6\xd7\xc0\x4b\xf3\xaa\x61\xee\xf6\xef\xf4\x77\x31\xe2\x0f\xcb\x43\xb2\xa1\x88\x89\x54\x7c\x28\x62\x22\xb0\x10\x81\x85\x08\x2c\xec\xa1\xc0\x42\x28\x62\x42\x11\x13\x01\x5d\x08\xe8\x42\x40\x17\x02\xba\xba\x22\xa0\x0b\xd2\x93\x90\x9e\xdc\x2c\x21\x2c\x90\x9e\x6c\x87\xf4\xe4\x27\x9e\xa4\x61\x01\xfa\xf4\xa2\xaa\x49\x59\xd9\x45\xfa\xca\x6a\xae\xb4\x2a\x4b\xc5\xa2\x94\xbe\xb6\xca\x71\xdf\xb7\x3d\xc9\x7e\x6c\x2f\x91\x79\xea\xd5\x72\x22\x1c\xaf\x2f\x2e\xb9\xc4\x8b\x98\xb2\x8b\x88\xed\x32\xce\x5f\x14\xd7\x2f\x25\x2a\x0f\x77\x39\xa3\x83\x82\x24\xb0\x15\x14\x24\x81\xad\x80\xad\x80\xad\x7a\x08\x5b\x75\x51\xba\x67\xd7\x60\x2b\xe4\x21\x02\x5b\x01\x5b\x01\x5b\x01\x5b\x41\x41\x12\x89\x52\xb7\x0f\x65\xea\xfa\x44\xa9\x4d\xa9\x20\xb9\x42\x8f\x89\x10\xa6\x19\x4a\xf2\x10\xa6\xe3\x54\x27\xd8\x37\x6e\xa1\xa8\x72\x22\x5e\x49\x88\x5a\x22\x08\xf9\x54\x70\xd8\xd3\x24\x3b\x66\x86\x3d\x79\xb9\x98\x19\xf7\x54\x59\x2d\x4f\x08\x54\xf4\x27\xb7\x7b\x18\xd9\x03\xb6\xe4\x63\x15\x0e\x7b\x58\x1c\x6a\x3f\x10\x13\xfc\x2a\x45\xe7\x68\xb6\x22\xea\xfa\x30\x1d\x6c\xe6\x45\x20\xe2\x1a\x19\x2d\x4d\x66\xb4\x7c\xb3\x8f\xce\x0a\x73\x70\x9a\x4e\x72\x73\x70\x94\x9a\xec\x85\x22\x69\x34\xc1\x93\x46\xed\xf4\x95\xe6\x4b\x3b\x2f\x04\x1c\x67\x69\xc6\x25\xe0\xd8\x7c\x71\xcd\xdb\x29\x2e\x52\xd8\x6e\x3b\x15\xfb\xf2\x88\xc7\x4e\xed\xf1\x55\x3e\xac\xb2\x59\xc3\xe2\x34\xdb\x66\x39\x32\x87\x6d\xb6\x5e\x90\x37\x04\xce\x05\xce\x05\xce\x05\xce\x85\xbc\x21\xe4\x0d\x21\x6f\x08\x79\x43\xb8\x15\xe0\x56\x80\x5b\x01\x6e\x05\xb8\x15\x5a\xe2\x56\x80\xbc\x21\xe4\x0d\x21\x6f\x08\x79\x43\x78\xed\xe0\xb5\xdb\xe4\xf2\x86\x8d\xa1\x63\x37\x0d\x5e\x13\x46\xde\x58\x2d\xc3\xff\xe7\x69\x9a\x16\x41\xeb\x52\x66\x55\xe1\xd1\xc3\x9a\x9c\x55\xb8\x18\x91\xa2\xe6\x5d\x21\xec\xab\xa5\xa2\x64\x58\xf3\x9b\xf2\xf2\x35\x55\xbd\xe1\x41\x84\x3a\xfb\x9f\x57\xd9\xbf\x1a\xa4\xfb\x7d\x0b\xb9\x5a\x4e\x84\x27\xea\x07\xb7\x9f\x37\x0b\xbf\x22\x0a\x9f\x76\x17\x1e\x3b\x62\x5c\x3b\xe5\x57\xf2\x52\xa2\xde\x85\x08\x81\x47\x08\x3c\x42\xe0\xe1\x33\x81\xcf\x04\x3e\x13\xf8\x4c\xba\xc6\x67\xd2\x3d\x2e\x01\xb0\x6a\xb0\x6a\xb0\x6a\xb0\x6a\xb0\xea\x9e\x66\xd5\x80\x69\x80\x69\x3d\x0a\xd3\x36\x65\x08\xfc\xbb\xfa\x48\x16\x04\xf0\x29\x7a\x82\x13\xc0\x25\xba\x4c\x97\x6a\xc6\x95\xfa\x93\xad\x72\x22\x5e\x0f\x1e\xb5\x24\x3a\xfe\x99\x60\x74\xf8\x38\x5b\xb4\x36\x42\xa9\x03\xe0\x4c\x78\x58\xaf\xc2\xde\xb8\xf9\x2f\x52\x1d\x18\xb7\xc7\x8e\xa2\xaf\xcb\xdd\x8e\x89\xd3\x36\x92\xbc\x09\x50\x96\xa1\x65\x7a\xba\x22\xd6\x7e\x81\x2e\xb4\xf6\x85\x23\x96\x0b\x51\xf8\x4d\x46\xe1\xff\x56\x88\x24\x61\x90\xde\x4a\x6f\xe6\x06\xe9\x12\xb5\xbc\x7f\xd2\x8a\x88\xcf\xbf\x4a\x4f\x3a\xf1\xf9\xed\xb8\x4f\x56\x44\xee\x3f\x4d\x4f\xb9\x22\xf7\xdb\x71\xa3\xf5\xc6\xf4\x6f\x98\x75\x8d\x7d\x62\xb4\x8e\x75\x4d\xf8\xc6\xfe\xd7\xb5\xb4\xd3\xe2\x92\x1a\x96\xd6\xc9\x0a\xe8\xa0\xcd\x45\x86\x00\x68\x37\x68\x37\x68\x37\x68\x37\x32\x04\x90\x21\x80\x0c\x01\x64\x08\xc0\xeb\x02\xaf\x0b\xbc\x2e\xf0\xba\xc0\xeb\x82\x0c\x01\x64\x08\x20\x43\x00\x19\x02\x70\x6a\xc2\xa9\xd9\x85\x4e\xcd\x8e\x67\x08\x6c\x18\x88\xde\xd8\xdc\x81\x9f\x1d\xa4\x21\x91\x3b\x90\x56\x55\x2d\xa3\xe4\x2b\x52\x06\xf8\xd6\x9d\x63\x7c\x14\xd7\xd9\xb7\x0e\xb2\xbf\xef\xa7\x37\xb8\xcf\xb4\x37\x83\xde\x5d\x3f\x39\x60\xde\x28\x21\x36\x62\x9c\x34\xed\xba\xdc\xdc\xea\x99\x1f\xdd\x6c\x3b\x54\xca\x94\x12\x3d\x74\x9a\xa6\x78\x0f\x9d\xa4\x63\x74\xa4\xf6\xfe\xad\xee\xf6\xb5\xf6\x6f\xe5\x0f\xde\x12\x37\xf5\x93\xc1\xfd\x77\x82\x1d\xb5\xf6\x73\xad\x7e\xd7\x66\xb7\xe5\x15\xaa\xde\xbb\x15\x3b\x54\x22\xcf\x01\x3b\x54\xc2\xf3\x03\xcf\x0f\x3c\x3f\x3d\xe4\xf9\xc1\x0e\x95\xd8\xa1\x12\xc4\x1d\xc4\x1d\xc4\x1d\xc4\xbd\x2b\x88\x3b\x76\xa8\xc4\x0e\x95\x9b\x85\x31\x62\x87\xca\x76\xec\x50\xf9\x4f\x43\x74\xc4\xdc\xa1\x32\x7d\x4d\xce\x94\x72\xc6\x6c\xcd\x51\xf8\xe0\x17\x8c\x15\x34\x45\xd5\x94\xe2\xad\x74\x4e\xd2\x75\x59\x1f\xfb\x67\x79\x69\x55\x7e\x27\xfb\xd5\x21\xf6\xf5\x01\x7a\x9d\x73\xe1\xd5\x72\x22\xfc\x62\x9f\xd9\xfc\xce\xd3\x4a\x79\xcb\xa0\x59\xf8\x6e\xc1\x2c\x70\xda\x28\x30\xee\xf2\xd0\x4d\xd8\x93\x8c\x41\x5e\xcc\xa0\xb3\x82\xf6\x2c\x89\xd4\x82\x6c\xc7\xdf\xe8\x45\x59\xca\x8c\x38\x53\x18\x3e\x4d\x33\x07\x3c\x63\x16\xe4\xcc\xcd\x06\x3d\xd3\x61\x57\xd9\xf1\xd8\x43\xfc\x76\x8b\xf6\xa3\x2c\x25\x3c\x75\xec\x76\x78\x78\x83\x16\x04\x3c\x9c\xa3\xb3\x1c\x1e\x4e\xd1\x29\x3a\xd1\x04\xde\xe6\xdd\xf5\x4c\xb9\x11\x7d\xf5\x87\xfd\x11\xe2\x36\x76\x07\xaf\xd8\x5a\x05\xd6\x2b\xbb\x9f\x49\x10\x3d\xaf\xc1\x43\xba\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x3b\x0c\x11\x27\xe8\x28\x3b\x1c\x3d\xb8\xad\x8f\x0d\x14\xa4\xe2\xb5\xf0\x03\x3c\xdd\xdb\xac\x85\x67\xfd\x16\x1d\x30\x0e\xc5\x4c\xc3\xfd\x03\x00\x90\x00\x90\x00\x90\xbd\x0d\x20\x7f\x77\x98\xc6\x4d\x00\xe9\xd1\x46\x1e\x2b\x27\xc6\xca\x5c\x18\x59\xb2\x85\x91\x6d\xf2\xf8\xa3\xc3\xec\xbd\xfd\x9e\xdd\xf5\x76\x6b\xb2\x94\xa9\x58\xb6\x56\xed\xad\xb7\xcb\x38\xa9\x43\xbb\x81\xa6\x96\x5b\xb7\x0d\x63\x6b\xe4\xa8\x9b\xde\xc9\xf0\xfa\x2e\x7f\xd2\x77\x07\x1b\xc8\xca\x45\x0a\xff\xd9\x36\xcf\xab\xd8\xab\xc9\x85\x9c\x94\x96\x83\xde\x46\xc4\x3c\x0f\xdb\xb3\xde\x86\x29\xbc\x10\x86\xa9\x21\x0c\xf3\xef\xbb\x76\x7b\xd6\xee\xb5\x32\x85\x52\x91\x62\x1f\xb8\xc7\xbb\xed\xb3\x99\x65\xe3\xb7\xed\x73\xc5\x16\xaa\x9b\x72\xe3\x54\x58\x98\x00\x0b\x83\xd4\xfc\x8e\xa4\xe6\x23\x27\x13\x39\x99\xc8\xc9\x6c\x57\x4e\xa6\xb1\x64\x6b\xd9\x74\xa0\xc3\xfb\xab\x47\xfc\xc7\xeb\xed\x6c\xab\x68\x9c\xb6\xef\xb0\x9e\xfc\xf6\xbb\x3c\x53\x82\xb1\x82\xa4\x15\x15\xee\x6a\x14\x6b\xd4\xa0\x15\xc8\x43\x05\x1e\xf4\xd1\xfe\x79\xc2\x83\x95\x05\x8d\xf2\x3b\xef\x33\xfe\x9c\xd8\xe9\x3e\xb8\x2a\x6b\x59\xd9\x7d\x74\xaf\xfb\x28\xcf\x0d\x94\xb3\x4a\x7a\xb4\xea\x3c\x4f\x29\xc6\xdf\xb7\xcc\xa3\x46\x2d\x93\x17\x68\x9e\x52\x15\x6b\x9f\x09\x3a\xda\xc4\x2c\x65\x81\xbb\xe2\x31\x3b\x09\x98\x9d\x7c\xac\x9f\x5e\xe8\x67\x1f\xed\x0f\x7f\xd8\x36\xf1\xcf\xf6\xf7\xce\xfa\xa7\xc2\x7b\x61\xb4\x33\xf7\xc6\x73\x0f\x9b\xd1\x39\x9d\x98\x9c\xa1\x1a\x1d\x77\x98\x8f\x54\x22\x78\x43\xca\xf1\x2b\x8d\x29\x99\xb8\x9a\x9f\xc1\xa7\x47\x7a\x64\x28\xa5\xab\xf9\x05\x11\x9c\x72\xde\xf8\x2c\xcc\xbf\x17\xad\x8f\xc5\xf9\x71\xb8\xf6\xc2\x2c\xf9\x4a\x1f\xbd\xdc\xc7\x5e\xea\x0b\x7f\xc6\x86\x67\x1f\xe9\x9b\x55\xb5\x34\x9f\xb9\x65\x55\xde\xec\x6a\x24\xba\x62\xfc\x14\x8d\x4c\x79\x9e\x82\x63\x51\x31\xc9\x2a\xe9\x8e\x1b\x7e\x54\x4a\xf3\x07\xe7\xc1\x0d\x39\x25\x6d\x0e\xa2\x72\x2e\xa3\x47\xd4\x9b\x66\x9b\x0a\xe7\x7f\x41\x56\x0b\x39\x39\x1e\x11\x77\xe4\xd1\x44\xd6\xbb\xe4\x78\xd2\xb7\x01\xec\xdb\x47\xb7\xf0\x6a\x79\x22\x63\x3a\x08\xa0\x6a\x87\x82\x15\x9a\x09\x05\x5b\xf3\x48\x90\x3a\x41\x93\xec\x58\xf4\x88\xed\x82\xd8\xe9\x76\x41\x54\x5e\xda\x7e\x2f\x04\xfb\xa7\x41\x1a\xad\x41\x35\x45\x0a\xb4\x08\xac\x4c\xeb\x4a\x46\x53\x8c\x27\x61\x9f\x1b\x64\xff\x71\x80\xee\x76\x86\x33\x91\x07\x5d\x32\xfd\x7c\xf9\x8c\x52\x56\x32\x25\x29\xe7\x09\xac\xb4\x7d\xea\xd3\x8b\x73\x33\xbc\xa0\x96\x04\x53\xc6\x63\xc2\xbd\x68\x8f\x8c\xbc\x2e\xf6\x3d\xe6\x15\xbd\x75\x63\xe3\x6d\x14\x10\xb9\xdb\xff\x2b\xb8\x8b\x11\xaf\x98\x48\xac\x7e\x22\xf8\x4b\x38\xc6\x8e\x54\x65\x4c\xd7\xfb\x34\xec\x17\x83\x90\x48\x84\x44\x22\x24\x12\x21\x91\x08\x89\x44\x48\x24\x42\x22\x11\x12\x89\x90\x48\x84\x44\x22\x24\x12\x21\x91\x08\x89\x44\x5e\x35\xc2\x1a\x11\xd6\x88\xb0\xc6\x8e\x85\x35\x7e\x75\x88\x4e\x0a\x00\x28\x15\x0a\xba\x93\x4a\x9d\xb7\xf5\x08\x45\x2c\x23\xff\xfb\x9d\x63\x86\xb5\xd6\x54\xc3\x56\x1a\x4b\x07\xfe\x62\xd9\x8b\x43\xec\x3f\x0d\xd0\x56\xe3\xfa\xab\xe5\x44\xf8\x5f\x34\x48\x02\xed\x92\x2e\x99\x25\xb5\x08\x09\xee\xe3\x17\x4c\x15\x0a\xfa\x52\xc2\x56\x55\xcc\x54\xdf\x0e\x74\x70\x1d\x74\x70\x29\x98\x0e\x1e\x60\x09\x4b\x36\xb4\x50\xd0\x2d\x04\x58\xf5\x1a\x90\x2a\x0d\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\x08\x2e\xb8\x91\x5c\xf0\x69\x7a\x8a\x3d\x11\x7d\xab\x1d\xa7\x34\x61\xde\x59\xc4\x01\x1a\x13\x9c\x52\xf1\x5a\x44\x4f\xab\x05\x79\x24\xa2\x97\xd2\xd7\x8c\xd6\xe7\x33\x58\x59\x5a\x15\x1c\xa3\xa0\xa9\xfc\x49\xa3\xdb\x6d\x7e\x80\x84\x6a\x90\x47\x90\x47\x90\x47\x4e\x1e\x3f\x30\x48\x51\x41\x1e\x05\xbc\xa9\x8c\x3c\x14\xbf\xb2\xbf\xdc\xcb\xfe\x4b\x3f\xbd\x5e\xfc\xab\xd1\x6d\x57\x38\xe9\x8a\xed\x35\x4e\xe2\x7f\xea\x66\x68\x20\xff\xc7\x66\xdb\x70\xe5\x2a\xcd\x08\x08\x78\x82\x26\x39\x04\x3c\x44\x07\x28\x51\x33\x3e\xd6\x6c\x4d\x6b\xab\x15\xfe\xc8\x2d\xd9\x6a\xe5\x4a\x30\xf3\x3b\xc8\xf6\x9b\xcc\xcf\xf3\x4e\x4d\xf8\x27\xf8\x23\x36\x59\x01\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\x03\xf4\xdb\x68\xe8\x07\x24\x07\x24\x07\x24\xd7\xc3\x48\xee\x8f\x86\x44\x36\xf0\x58\x39\x51\x2b\x00\x50\x97\xd3\x9a\xec\x08\x1c\xfe\xbb\x21\xf6\xfb\x21\xda\x9a\x56\x35\x21\x76\xe5\xa3\x6e\xb8\xc8\xaf\x88\x85\x8d\x43\xd3\xaa\x26\xbb\xa3\xf2\xc4\xb1\x16\x0b\x1a\x3e\x5e\x93\x74\xd1\x84\x00\x69\x07\x28\xc1\x41\xda\x3e\x1a\xa6\xc1\x3a\x3b\x17\x6b\x3c\xcb\x5c\x54\xd2\xa2\x64\xe7\x82\x29\xd8\x1e\xb6\xdb\xa4\x60\xd1\xa8\x89\xbe\x44\x19\x6b\x52\x2b\xfc\xe0\x36\xa7\x5d\x77\xfa\x4b\x15\x9a\x4d\xbb\xcb\x3c\xda\x89\xd6\x4d\xf2\xfd\xc8\x2b\x14\x3a\x1a\x6f\x45\x08\x72\x40\x90\xb0\x49\x41\xc2\x0f\xf6\xb5\xe5\xbb\xa6\x53\x42\x9c\xf0\x28\x1d\x76\xc4\x09\x9b\x31\x0c\xf5\x65\x01\x5b\x67\x37\x62\xff\xfb\x6e\xc7\x30\xdc\x6d\xab\x0b\x9a\xb6\x60\xa7\xf8\xa1\x23\xa6\x00\x82\x82\x10\x14\x84\xa0\x20\x04\x05\x21\x28\x08\x41\xc1\x35\x0b\x0a\x7e\xba\x4f\xc8\x02\x8f\x73\x59\x60\x63\xd4\xe6\x33\xcb\x26\x86\x8f\xc5\xa2\x54\x2c\xe9\x74\x49\xa8\x0a\x3e\x46\x73\x2e\x55\xc1\x75\x96\xb9\x7e\x69\xc1\x96\x0d\xfb\xc9\xdf\xbb\xd3\x19\xf6\xf7\x04\x28\x08\x9a\x93\x81\x07\xb9\xaa\x55\xbb\xe7\x02\x10\x0d\xec\xb5\x19\x08\x44\x03\x21\x1a\xb8\xc1\xa2\x81\x8f\xaf\x6b\xcd\x17\x64\xd7\x5b\x07\x79\x82\x14\x07\x53\x07\x28\xc1\xc6\xa2\xa3\x76\xa4\x2d\x73\x2b\x02\x8a\x12\xab\x75\x00\x37\x5f\x78\x2e\xfb\xfa\x30\x25\x2d\xb6\x58\x37\xc5\x58\x93\xed\x2f\xc6\xc9\x36\xb6\x81\xe3\x27\x87\xd9\xb7\x6e\x71\x06\xc2\x5f\x6c\x64\x17\xe7\x4b\x4e\x89\x4e\xfe\x69\x57\xec\xe6\x1c\xbb\xe9\x37\x40\xfb\xd6\xb7\xdb\xa3\x14\xbb\x72\x67\xe7\x35\x85\x2c\xda\xdf\xb1\x6f\xfb\x23\x4f\x19\x21\x8b\x08\x59\x44\xc8\x22\x42\x16\x11\xb2\x88\x90\x45\x84\x2c\x22\x64\x11\x21\x8b\x08\x59\x44\xc8\x22\x42\x16\x37\x32\x64\x31\x49\xa7\xd9\xc9\xe8\x71\x1b\x84\x3c\xe2\xa6\x27\xbe\xeb\xb8\xdb\x01\xa6\x20\xb0\x12\x81\x95\x08\xac\xdc\x44\x81\x95\xff\x7d\x90\x76\x79\xe1\xa7\xf1\x7d\x29\x69\x59\x4a\xa7\x8d\x29\x90\xce\x3e\x3b\xc8\x7e\x69\xc0\xe1\x9a\xef\x68\x4c\x44\x71\x51\x94\x32\x25\x4a\x69\x91\x80\xe2\xa8\x0b\x4a\x7a\x6f\x30\xaf\xe8\x9b\x2e\x7b\xba\x6b\x25\x14\x17\x82\xd9\xe4\x28\xdb\x57\xed\x63\x70\xbf\x10\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\x40\x49\xe4\x51\x03\xf7\x01\xf7\x01\xf7\x6d\x08\xee\xfb\xce\x61\x3a\x24\xa4\x0d\x97\x39\xec\xab\x9d\x4e\x9d\xd6\xd4\xfc\x75\x75\xd9\x0e\x6f\xfc\x9d\x21\xf6\xff\x86\x68\x1b\xbf\xec\x6a\x39\x11\x0e\xfb\x24\x54\x4f\x6b\x6a\x3e\xa5\x2e\xc7\x76\x1a\xc7\x92\xc6\x99\x9e\x8d\x4e\xc4\xd1\x16\xe7\x54\x5f\xa9\x9d\x7b\x79\x5c\xe0\xb5\x43\x74\x80\xe3\xb5\x51\xda\x47\xc3\x35\xe3\x70\xf9\x83\xc5\xcb\x89\xb8\x59\xcd\xe0\xe4\xc9\xac\x5c\xa4\xeb\xf3\xc1\xac\x6c\x98\x0d\x9a\x5b\x8c\x88\x92\x3d\x68\xcc\xa4\x68\xfc\xee\x14\xfe\x89\x6d\xae\x16\xde\xe5\x9f\x5a\x6d\x35\xf2\xc3\xe6\xe1\xce\xb4\x73\xf2\x14\x9d\xa0\xc9\x8a\x54\x86\xb5\xb4\x27\x72\x17\x90\x5f\xdd\x64\x7e\xf5\x0f\xf6\xad\xef\x53\xa6\x29\x91\x48\x3d\x41\x47\x9d\x44\xea\x35\x16\x11\x04\xd6\x03\x72\xac\x1b\x33\x13\x1e\x63\x50\xdb\x66\xc4\xbe\x71\xb7\xcb\x4c\xdc\x63\x27\x5a\x5b\x96\xe1\x21\xf1\x4b\x87\x0c\x03\x72\xad\x91\x6b\x8d\x5c\x6b\xe4\x5a\x23\xd7\x1a\xb9\xd6\xc8\xb5\xf6\xcf\xb5\x6e\xe9\xf0\x9f\x7c\xf5\x4e\xd7\xf0\xbf\x37\x20\xe1\xda\x9a\x14\xec\xe2\x59\x7d\xed\x9f\x13\x20\xe7\xba\xd7\x66\x22\xc8\xb9\x46\xce\xf5\x06\xe7\x5c\x5f\x59\xe7\x02\x31\xc8\xc2\xb7\xd4\x7e\x07\x67\x5e\x1f\xa4\xfd\x6c\x3c\x1a\xb7\xe3\x7e\xef\x75\xc7\x0e\x9b\x45\xde\x0e\xd1\xc2\xec\x6b\x43\x74\x58\xe0\xc8\xbc\x5c\xbc\xa9\x6a\xc6\x07\xef\xec\xb6\x62\x06\x24\x2a\xf9\xac\x26\xeb\x7a\x3a\x27\xe9\xba\x6c\xf3\xc8\x5f\x1a\x62\x5f\x1d\xa0\xd7\x39\xd7\x19\x83\xe1\x27\x1b\x49\xba\x9e\x13\xe5\x4d\x1b\xe5\x75\x45\xae\xf5\x2e\x7e\xbb\x0b\xf6\x93\x2c\x25\xdc\x55\x44\x18\x63\x13\xe9\xd5\x4f\x06\x7f\xb0\x13\xec\xa8\xf9\xc1\x56\xf5\x3d\xf3\xe3\x75\xbf\x05\xc4\x33\x22\x9e\x11\xf1\x8c\x88\x67\x44\x3c\x23\xe2\x19\x11\xcf\x88\x78\x46\xc4\x33\x22\x9e\x11\xf1\x8c\x88\x67\x44\x3c\xe3\x46\xc6\x33\x1e\xa3\x23\xec\x50\xf4\x80\x8d\x3c\xee\x77\x83\x12\xf7\xf2\xad\x9a\x96\x20\x14\x12\xa1\x90\x08\x85\xec\xe1\x50\xc8\xef\x1a\xa6\xc9\xda\xec\x51\xec\xf4\x5c\x0f\x40\xfe\xd6\x10\x7b\xcf\x16\x62\x1e\x00\x29\xb6\x80\xde\x9c\x14\x32\x5a\x45\x21\xf9\xd3\x6c\x2e\x14\x59\x33\x16\xb4\xe5\x8c\xd2\x42\x91\xcb\xc1\xa4\xf1\x14\x3b\xd1\x24\x69\x14\xdb\x50\x07\xe2\x4e\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\x48\xf0\xc8\x4d\xc0\x23\xbf\xfa\x00\x1d\x11\x3c\x52\x2f\xaa\x9a\x94\x95\x5d\x81\x90\x65\x35\x57\x5a\x95\xa5\x62\x51\x4a\x5f\x33\x86\x6b\x0b\x42\x8e\xe9\x3c\x43\x81\x7d\xfa\x01\xf6\x03\xfd\x44\xe6\x85\x57\xcb\x89\xf0\x28\x4f\xcf\x16\x87\xad\x16\x76\x46\xea\x25\x5e\xde\x94\x5d\x5e\x6c\xb7\x71\xfa\xa2\xb8\x7c\x29\x51\x79\x58\xe4\x41\xb4\x38\x71\x7b\x99\xce\x0a\x26\x77\x9a\x4e\x72\x26\x77\x94\x0e\xd3\xc1\x9a\x31\xbb\x56\xa3\x94\x13\xf1\xca\xea\xad\x23\x39\x93\xe7\x70\x3f\x15\x8c\xf0\x26\xd9\x31\x41\xea\xaa\xee\xed\x93\xcc\xed\x7d\x7f\x14\xfe\xbb\x6d\x9e\x57\x33\x6e\xe5\x75\x37\xfc\x76\xf6\x9a\x57\x74\xf4\x05\x25\x53\x74\x8e\x66\x2b\x12\x29\x9a\x7c\x43\x48\xa2\x40\xf2\x77\x93\xc9\xdf\xff\xbe\xaf\x75\x76\x62\x5e\xe4\x81\x9f\xa1\x69\x27\x0f\xbc\x7d\x56\xa7\x31\xb3\xe2\x6f\x33\x1a\x30\x36\x01\x29\xe7\xc9\x0f\xdd\xe5\xb1\x3a\xc7\xaa\xf2\xc4\x1a\x36\x3f\x8f\xf2\xb4\x84\x8e\x19\x1f\x64\x90\xf5\x9a\xf1\x43\x06\x19\x32\xc8\x36\x38\x83\xac\x83\xb3\xd1\xa0\xf4\xaf\x76\x0f\x1c\xa9\x13\x34\xc9\x8e\x45\x8f\xd8\x94\x62\xa7\x9b\x52\x54\x5e\xda\x7e\x52\xc1\x7e\x7c\x88\xc2\x15\x1b\x70\xaa\x19\x27\xd0\xe2\xd9\x21\xf6\xeb\x2e\x01\xfa\x9f\x6e\x24\xba\xe2\x82\x9a\x91\xbb\x22\xaa\xe2\x6e\xf7\x3e\x9a\x6a\x46\xee\xfe\x10\x8a\x2e\xcc\xe6\x9a\x0d\xfe\x20\x76\xb3\x47\x7c\x56\x62\xb6\x38\xbd\xd1\xf4\x08\x93\x40\x98\x04\xc2\x24\x10\x26\x81\x30\x09\x84\x49\x20\x4c\x02\x61\x12\x08\x93\x40\x98\x04\xc2\x24\x10\x26\x81\x30\x89\x4e\x87\x49\x24\x68\x8c\x8d\x46\xf7\xd9\x00\xe2\x1e\x37\x80\x30\x96\x6a\x08\x8f\x40\x78\x04\xc2\x23\x10\x1e\xe1\x0a\x8f\x78\x57\x8c\xce\x89\xf0\x08\xa1\x43\xe9\x82\x85\xfe\x02\xf6\x05\x35\x93\x51\x74\xad\xc4\x17\xf3\xcb\xa5\x4c\x56\xb6\xc3\x26\xd8\x27\x87\xd9\xb3\x5b\x68\xbb\x28\xe9\x6a\x39\x11\xfe\x85\x46\xa0\xe2\x82\x9a\x99\xb1\x4b\x4c\xf2\x12\xbb\x82\x31\xc6\xf8\xed\x84\xb8\xa6\x5b\xdb\xd1\xa7\xbe\xc0\x8f\x4d\xe0\xc7\xb7\x04\xe3\xc7\xc3\xec\xa0\x89\x1c\x45\x9f\x32\xb1\xa3\xcf\x1b\x80\x90\x14\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\x24\x88\xe4\x46\x12\xc9\xd3\x74\x92\x1d\x8f\x4e\xd8\x44\xf2\x61\x37\x91\xf4\x59\xc5\xdd\x0e\xea\xdb\x40\xa0\x40\xa0\x40\xa0\x9b\x08\x81\xfe\xe9\x20\xed\xad\x95\x21\x26\x50\x68\x5a\x57\x78\xe8\x24\xfb\xd4\x20\xfb\xe9\x01\x4f\xfc\xbf\x6e\x8e\xb6\xf9\x8c\x52\x56\x32\x25\x29\xe7\x61\x9d\xf6\xcc\x76\x7a\x71\xae\x65\xb1\x93\xf1\xd8\x03\x37\x3d\x99\x03\x66\xe1\xf3\x8a\xbe\x09\x40\x64\xe7\xa5\xa4\x76\xfb\x83\xc8\xbb\x18\xf1\x8a\x19\x8d\x4c\xd7\x1f\x0f\x86\x91\xfb\xd9\x78\xbd\xe0\x60\xf3\x2d\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x6e\x24\x88\x04\xe4\x03\xe4\x03\xe4\xeb\x61\xc8\xf7\xee\x7e\x8a\x04\xc9\xd2\xb3\xff\x12\x62\x7f\x1c\xf2\xd5\x9e\x7f\x63\x56\x2e\x7a\xc7\x5b\xf1\x24\xb1\x48\x56\x2e\x56\x89\xbb\x4f\x2d\xcc\x59\x6b\xbc\x16\x0a\x78\x54\x15\x34\x51\x55\xd0\x44\x23\x05\xa5\x0a\xf4\xb8\x60\x6d\x17\x68\x9e\xb3\xb6\x59\x9a\xa1\x64\x13\xac\xcd\xf5\x9c\xf3\x8a\x1e\x18\x12\xc8\x3e\xf7\x04\xc5\xc4\x4b\xe0\x9b\xb9\x8e\x95\x13\xb5\xa2\x4c\xaf\xab\xcb\x3a\xfb\x91\x27\xd8\x57\xf6\xb8\xf6\xe4\x7e\x44\x4c\xcf\x35\x73\x62\x61\x8d\x3c\x56\x1c\x69\x4a\x5d\x8e\xdd\x6f\x9c\x52\xb5\x1b\x77\x2b\x77\xe2\x6e\x0f\x18\x4d\x02\x14\x02\x14\x26\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x7b\x06\x14\x26\xbb\x06\x14\xb6\xbc\x26\x4d\x83\xc2\x24\x40\x21\x40\x21\x40\x21\x40\x21\x40\x61\xe7\x41\x61\xb2\xa7\xb9\x5e\x12\x5c\xaf\x7d\x5c\x2f\xd9\xed\x5c\x2f\xb9\x09\xb9\x5e\xea\x0a\x1d\x17\x2c\xeb\x10\x1d\xe0\x2c\x6b\x94\xf6\xd1\x70\x4d\x81\x49\xce\x92\xe2\xe5\x44\x3c\xa5\x2e\x37\x82\xac\xae\x3f\xe4\x1f\x3c\xb6\x95\x6d\x11\x71\x63\xe7\x82\xe3\xc6\xf6\xb0\xdd\x66\xdc\x18\xbf\xbb\x19\x2e\x96\x52\x97\x3d\xa1\x62\xd1\x5f\xde\xe6\x42\x5d\x77\x89\x81\x26\x22\x71\xaa\x15\x16\xff\x6a\x2b\xd7\x12\x18\x6a\x92\x8e\xd1\x91\x0a\x8d\xde\x41\xda\xd3\x50\x7b\x42\x90\x17\x6a\xe4\x4d\xaa\x91\xff\x4e\x1f\x9d\x10\x22\xe2\x87\xe9\xa0\x23\x22\x3e\x4c\x8d\xf6\x3d\x3a\x69\x5c\xbe\x9f\x1d\xa1\x43\xb4\x6d\x2a\x6d\x18\xf1\xb5\x5d\x5f\x33\x2c\xf5\xa8\x30\x2f\x09\x1a\xe3\xe6\xa5\xf1\x22\x83\x2d\x48\x41\x6d\xa9\x05\x89\xfd\xc2\x88\xcb\x82\xdc\x2f\x26\xa5\x91\xb4\x9a\x33\x96\x98\xe6\x90\x61\x58\x93\x47\xc5\x11\xd3\x9a\x4c\xdb\xc7\xdb\x69\x57\x2e\xd3\x25\x5a\x70\xdb\x95\x58\x92\x4e\x37\xe1\x71\x98\xe1\x55\xbf\xc8\x29\xa8\x0e\x5e\x0a\x5e\x0a\x5e\x0a\x5e\xda\x43\xbc\x14\x53\xac\x80\x29\x56\xf7\x00\xe5\x2f\x87\xe8\xb5\x10\x7b\x35\x14\xfe\xa2\xfd\xaa\x3e\x1e\xba\xec\x5e\xc2\x29\xf9\x88\x2e\x96\x61\x91\x65\x79\x45\x78\x5f\x6d\xd4\xe1\x0c\x59\xe6\x57\xc2\x1b\xcb\x35\x99\xcb\xab\xf9\xd1\xbc\x9c\x95\xf8\x2b\x31\x57\x71\xee\x49\x9f\x80\x9e\x76\x67\x30\xa7\x03\xca\xea\xaa\x9c\x31\xa6\x95\xb9\x5b\x8e\x5b\xd4\x31\xed\x4a\x6e\xc4\x5c\xdc\xf1\xc7\x8d\x64\x35\x29\xcd\xfb\x89\xa2\x66\xec\x81\xc7\x19\x1c\xb8\xc7\xd9\x7a\x2f\x25\xdd\xa8\xa4\xbb\xa1\x24\xe3\x4a\xeb\x81\xcc\x9b\xac\x88\xef\xcd\x2a\x22\x2e\xea\x29\xb6\x2d\xf0\xa9\x63\x94\xf1\x2a\x2c\xf0\x1a\xf8\x2d\x5a\xc1\xed\xc1\xed\xc1\xed\xc1\xed\xc1\xed\x7b\x9a\xdb\x7f\x3e\x44\xaf\x84\xd8\xcb\xa1\xf0\x4b\xf6\x68\xfb\x7c\x68\xc6\x95\x6c\x5b\xc8\xc9\x92\x2e\xdb\x9f\xfe\x82\xa6\x16\xa4\x2c\x1f\x87\x85\xc2\x9f\x27\x6a\xc7\x7a\xdd\x4e\xb6\xae\xf1\xc2\x13\xf1\x23\xf1\xc8\xa2\xb0\x23\x62\x90\x2c\xc8\x79\xa3\x9b\x3a\xa3\x88\x1c\x51\xb5\xc2\x35\x29\x6f\x45\x11\x69\x25\x79\x6c\x45\xca\x59\xb3\xff\xa8\x38\x1a\x8d\xac\x28\x79\x29\xa7\xbc\xc3\x32\xdf\xcb\x72\x44\xca\x70\x08\xae\x8e\x09\x26\x9a\x71\xa6\x96\xa2\xf0\x41\xdd\xb9\x48\xcc\xb7\xe3\x91\x33\x0a\x37\x49\xae\x8a\xab\x5a\xf5\x93\x39\x8e\x87\xa2\x98\xee\xf3\xd9\x9f\x5a\xbc\x16\x8f\xde\x23\xea\x33\x63\x3d\x88\x37\x1c\xe9\xbd\x03\xf4\xdc\x00\x7b\xf7\x40\xf8\x9b\x76\x4c\xda\x17\xfa\xaf\x98\x76\xd0\xe8\xa2\xd7\xd4\x9b\x91\xac\xa4\x2d\x4b\x59\x0f\x67\xb0\x27\x6a\xb2\xb6\xa2\x6a\xab\x46\x5b\xf8\xd6\xf4\x62\xc5\xcd\x6b\x57\x94\x4f\x6b\xac\x39\x89\x90\x02\x34\x7a\x44\x46\x4e\x2b\x19\x67\x62\xcd\xc7\x46\xb1\xbb\x91\xd5\xba\xc6\xe0\x64\x8e\x1c\xd6\xe8\x17\x77\x35\xa3\x65\x37\x6d\xda\x6f\x47\xa2\x79\x6f\x16\x8f\x08\xa6\xc4\x6d\xb1\x7b\xb6\x3a\x28\x9e\x61\xd0\x58\xf3\xf0\xbf\xbc\x1d\x43\x9f\x8c\x0c\x26\xa5\xf4\x8d\xac\xa6\x96\xf2\x19\xe3\x2c\x1e\x02\xc6\x4f\xaa\x68\x38\x31\x59\x31\x67\x40\xde\x42\xac\x27\x58\xb6\x4b\x9a\x8c\x0c\xce\xaa\x9a\xec\x2a\x36\x92\x96\xf4\xb4\x94\x31\x9e\xde\x6c\x1f\x11\xf4\xc7\xcb\xd3\xc5\x74\xba\xaa\xc0\x15\xbb\x8c\x78\x74\x47\xa1\xb2\xdf\xb8\xe7\x36\x70\x8b\xc1\x2d\xd6\xa3\x6e\xb1\x54\x56\x6c\x70\x39\xce\x37\xb8\x0c\x5d\x7c\x8c\x9d\xa0\x49\x3a\xd6\x04\xbc\x14\x3b\x3a\x06\xba\x9c\x62\xfe\xc0\xf8\x5e\xb6\x43\x7c\xcd\x8e\xa5\x6d\x21\x3c\xde\x84\x42\x3b\xec\xc5\x41\xba\xd7\x67\x83\x33\xf6\xc3\x83\xec\x03\xae\x9d\xcd\x0a\x8d\x49\x74\xb4\x50\x9f\xe3\xde\x8a\xdd\xc9\x36\x87\x32\x47\xe7\x25\x82\x1b\x52\xe6\x68\x6c\x97\x32\xdf\x9d\xc9\x20\xc5\x81\x08\x7b\x48\x71\xc0\x63\x04\x8f\x11\x3c\x46\x3d\xea\x31\x82\x14\x07\xa4\x38\x40\xea\x41\xea\x41\xea\x41\xea\xbb\x82\xd4\x43\x8a\x03\x52\x1c\x9b\x85\x4d\x42\x8a\xa3\x1d\x52\x1c\x1f\x18\xb2\x54\x20\x2a\xb7\x1c\xf3\xdb\x5b\x8c\xbd\x36\xc8\x7e\x7f\xc0\xbd\xa9\xd8\xbf\x6c\x8c\xe7\xb5\x6b\x5b\xb1\x78\xec\xa0\x67\x63\x30\x9f\xfb\xcc\x2b\x7a\x71\x56\xd5\xa6\x72\x39\x3b\xa6\xb6\x75\x3a\x20\xb7\x11\xff\x6b\x6c\x07\x30\x37\xc5\x6b\x74\x37\xb0\x86\xd0\x22\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x20\x90\x60\xa7\x90\xe0\xf7\xc5\xe8\x7c\x05\x12\x14\x92\xbc\x66\x58\x9f\xbf\x48\xac\x1f\x2e\x14\x27\xbc\x93\xfd\xea\x30\xfb\x9e\x2d\xf4\x7a\x9b\x1a\x0a\x19\xdf\x5f\xe8\x33\xdf\x8a\x0b\x18\xe6\x2d\x3b\x67\xe9\xc8\xb6\x0b\x1c\x8e\x38\xf3\x1b\x3e\x87\x33\x47\x43\x63\x8a\xe4\x4c\xdc\x06\x3d\x73\x65\x57\xd9\xf1\xd8\x98\x07\x3b\xf2\x07\x72\x52\xf6\x7d\x2a\x0d\xe2\x58\x4d\x1c\x9f\x0a\x26\x8e\x93\xec\x58\xa3\x94\xd1\x45\x26\xf9\xeb\xa0\xeb\x0f\xfb\x63\xc7\x6d\xec\x0e\xfe\xe0\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x40\x8e\x9d\x46\x8e\xa7\xe9\x24\x3b\x1e\x9d\xb0\xd3\x1d\x1f\xe6\x79\x8e\x66\x2d\x7c\xd6\x7a\xd1\x01\xe3\x04\x77\x3a\xe3\xe6\x4b\x98\x04\x16\x05\x16\x05\x16\xdd\x44\x58\xf4\x4f\x86\x69\x56\x60\x51\x81\x7f\x2a\x37\x2c\xab\x4b\x47\xc5\x25\x16\x0f\xfd\xee\x61\xf6\x37\x03\xf4\x7a\xf1\xa3\xcd\x43\x5f\x68\x84\x87\x72\xb2\xd6\x15\x04\xf4\x91\x9b\x36\xe9\xd3\xab\x08\x28\xff\x19\xcc\xb3\x9a\x79\x06\x31\xc9\xeb\x57\x82\xa1\xe8\x41\xb6\xdf\x84\xa2\x9e\x9e\x68\xb2\x51\x51\x8f\x2a\x1a\x0a\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\x09\xd8\xd9\x61\xd8\xb9\x9f\xc6\x59\x3c\x3a\x62\xa3\xca\x1d\x6e\xd8\xc9\x17\x6f\xc0\x9b\xc0\x9b\xc0\x9b\xc0\x9b\x1d\xc5\x9b\x5f\x1e\xa4\x87\x05\xde\x94\x0a\x05\xdd\x49\x03\xcf\xc8\x85\x9c\x7a\xcb\x18\xff\x75\xf6\x1f\x07\xd9\x8b\x03\xb4\xd5\x38\xe1\x6a\x39\x11\x2e\x37\x96\xfb\x3d\x63\x97\xd0\xa2\x94\xef\x61\x7e\xc1\x54\xa1\xa0\x2f\x25\x9c\xc2\x91\xe7\xdd\x18\x81\xbc\x10\x0c\x18\xf7\xb1\x61\xc1\x12\x9d\xd6\x25\x9f\xc4\x6f\xa3\x1f\x20\xb9\x1b\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\x11\xf0\xb1\x2b\xe1\x23\x30\x1f\x30\x1f\x30\x5f\x0f\x63\xbe\xaf\x85\x68\x97\xc0\x7c\x69\x55\xd5\x32\x4a\x9e\x17\xe2\xc4\x32\x8e\x31\xde\xa1\xe9\x6e\xf7\xe1\xab\xe5\x44\xf8\x8d\x59\xb9\xe8\x1d\x69\xc5\x33\xc4\x76\x65\xe5\xe2\xb4\xeb\xe4\xa5\xc4\xd4\xc2\x9c\xb5\xb4\x6b\x1d\x81\x9b\xa8\x2a\x68\xa2\xaa\xa0\x89\x46\x0a\x4a\x15\xe8\x71\x01\xdd\x2e\xd0\x3c\x87\x6e\xb3\x34\x43\xc9\x26\xa0\x9b\xeb\x39\xe7\x15\x3d\x90\xbc\xb1\xf7\x5c\xa5\x19\xd1\xf6\x19\x45\x4f\xab\xc6\x80\x53\x19\x44\x5a\x2b\x7c\x34\x9f\x29\xa8\x4a\xbe\xa8\xe7\x94\xb4\xac\xb3\xff\xf0\x14\xfb\xf4\x5e\xda\x61\x97\x62\x87\x90\xee\x13\x13\x77\xcd\x9c\x72\x58\x63\x92\x1d\x3c\x6a\x16\xb3\x68\x14\x13\xe3\x27\xcf\x58\x65\x54\x87\x70\xba\x4f\xee\x72\x90\x9a\x04\x5f\x04\x5f\x4c\x82\x2f\x82\x2f\x82\x2f\x82\x2f\xf6\x0c\x5f\xec\xa2\x0d\xf6\xbb\x86\x2f\x62\xe7\x77\xf0\x45\xf0\x45\xf0\x45\xf0\xc5\x8d\xd8\xf9\xbd\xa7\x71\x20\xb6\xa6\xee\xe5\xad\xa9\x93\x9b\x10\x07\xa6\xae\xd7\x84\x56\x74\x51\x40\xb2\x73\x34\xcb\x21\xd9\x69\x3a\x49\xc7\x6b\x41\xb2\xb8\x03\xb4\x4c\x14\x15\xf7\xe0\xa3\x79\x45\x2f\x5a\xf1\x67\x0f\xf9\xc7\x8b\x6d\x65\x5b\xc4\x16\xc3\xcb\xc1\xf1\x69\xa7\xd8\x89\xaa\xfc\x56\x33\x26\xad\x92\xac\x59\x49\xb1\xee\xda\x50\xf4\x73\xdb\xfd\xe8\xd9\x1b\xc5\xf0\x14\x91\xf2\x15\xa4\x6c\x54\x1c\xe8\x34\x2b\x13\x68\xeb\x02\xcd\x53\x8a\x0d\x2c\xab\x99\x5b\x61\xfe\xdf\x48\x5f\x6c\x82\x8e\x36\xfb\x2a\x92\x3f\x1a\xa2\x1f\x0a\xb1\x1f\x08\x85\xbf\xdf\x36\x52\xff\xa7\xef\x8a\x31\x05\x30\x47\x85\x11\x1e\xd1\x99\x36\xd6\x7e\xc2\xaa\x78\x56\x22\x6e\x3a\xb5\x2c\x47\x0a\xc6\x7b\x30\xa6\x7f\xf1\xc8\x54\x3e\xa2\xe4\x05\x03\x50\xb5\x48\x29\x6f\x63\x84\x4c\x24\xa3\xdd\xba\x54\xca\x47\x32\x8a\x26\x1b\x9f\x92\x6c\xaf\x4d\x8d\x21\x86\x8f\xe1\xe6\xe2\xdc\x9a\x8a\x9b\xcb\xa1\xc8\x4a\x49\xe3\xd3\xbd\x82\xa6\xa6\x65\x9d\x0f\xb6\xe6\x97\x6b\x0e\x0b\xf1\xc8\x12\xbf\x23\x9f\x46\xf3\xd1\x71\x22\x32\x1a\x99\xca\xe5\x26\xf8\x50\x9a\xd1\x6e\x45\xb4\x52\xde\x58\xa6\x19\xdf\x9e\x35\x7f\x30\x8b\x93\x33\xd1\x3b\x44\xd5\xdc\x86\xe6\x83\x21\xfa\xde\x10\xfb\x40\x28\xfc\x5d\x76\x03\xfd\x55\x1f\x9f\x7d\x9d\x97\xf2\x52\x56\xd6\xc4\x3a\x42\xc4\xde\xeb\xba\x9a\x56\xf8\xd0\x68\xcf\xd8\x25\xbe\xe4\x51\xb5\x88\x31\x73\x2a\xde\xb2\xe7\x0a\xab\xd2\x0d\xa3\xfe\xc5\x6b\xb2\x2e\x5b\xd6\xc0\xb0\x50\x16\x4b\xe1\x38\x61\x59\x8e\x70\x3b\xc4\x67\xe7\xaa\x16\x49\xec\x3f\x6a\x9c\xab\x49\x69\x0e\x7d\x8c\x85\xad\xf8\xf6\xf9\x0c\xda\x98\xec\x48\x4a\x5e\x78\xe8\xf8\x0c\xd5\x39\x97\x2f\x84\x4d\x24\x65\xac\xab\x2c\x7b\x9e\x55\x73\x52\x3e\x1b\x57\xb5\xec\x58\xe1\x46\x76\xac\x94\x57\xd2\x6a\x46\x1e\xdb\x3d\xa7\x2f\x18\xa5\xc4\xa3\x77\xb9\x9f\xd5\xed\x90\xf9\x8e\x10\x3d\x26\x8c\xc2\x0c\x25\xb9\x51\x38\x4e\xeb\xe8\x89\x22\xf6\x35\xc1\x63\x5f\xb7\x4e\x8b\x99\xe1\x3a\x4b\x7c\x93\x51\xe2\x7e\x96\xa2\x73\xb4\x6d\x2a\x6d\x8c\x45\xeb\x2e\x32\x28\x9c\xb6\xb6\x39\x2b\xa8\x8d\x9b\xb3\xb5\x58\xaf\x2a\xd3\x17\xfb\xfa\x88\x9f\x39\x8b\x8a\x79\x75\x24\xad\xe6\x8c\x55\xb2\x39\xea\x79\x2d\xdb\x11\x71\x4e\xa5\x65\x9b\xb6\x2f\xe9\x8c\x8d\xbb\x4c\x97\x68\xc1\x6d\xe3\x62\x49\x3a\xdd\x84\x47\x66\x86\x3f\xcd\x45\x4e\x79\x75\xf0\x60\xf0\x60\xf0\x60\xf0\xe0\x1e\xe2\xc1\x98\xdb\x05\xcc\xed\xba\x07\x98\x7f\x39\x44\xaf\x85\xd8\xab\xa1\xf0\x17\xed\x57\xf5\xf1\xd0\x65\xf7\x12\x55\xc9\x47\x74\xb1\xcc\x8c\x2c\xcb\x2b\xc2\xbb\x6c\xa3\x1c\x67\xc8\x32\xbf\x12\xde\x58\xae\x59\x64\x5e\xcd\x8f\xe6\xe5\xac\xc4\x5f\x89\xb9\x4a\x75\xcf\x36\x05\xd4\xb5\x3b\x83\x39\x57\x50\x56\x57\xe5\x8c\x31\x9f\xcd\xdd\x72\xdc\xbe\x8e\x69\x57\x72\x23\xe6\xe2\x95\x3f\x6e\x24\xab\x49\x69\xde\x4f\x14\x35\x63\x0f\x3c\xce\xe0\xc0\x3d\xea\xd6\x7b\x29\xe9\x46\x25\xdd\x0d\x25\x19\x57\x5a\x0f\x64\xde\x64\x45\x7c\x6f\x56\x11\x71\x51\xcf\x55\x59\xca\xfb\xd6\x31\xca\x78\x15\x16\x78\x0d\xfc\x16\xe5\xf0\x4b\xc0\x2f\x01\xbf\x04\xfc\x12\xf0\x4b\xf4\xb4\x5f\xe2\xf3\x21\x7a\x25\xc4\x5e\x0e\x85\x5f\xb2\x47\xdb\xe7\x43\x33\xae\x64\xe4\x42\x4e\x96\x74\xd9\xfe\xf4\x17\x34\xb5\x20\x65\xf9\x38\x2c\xf6\x78\xf1\x44\x25\x59\xaf\xdb\xc9\x66\x36\x5e\x78\x22\x7e\x24\x1e\x59\x14\x76\x44\x0c\x92\x05\x39\x6f\x74\x53\x67\x14\x91\x23\xaa\x56\xb8\x26\xe5\xad\x28\x29\xad\x24\x8f\xad\x48\x39\x6b\xf6\x1f\x15\x47\xa3\x91\x15\x25\x2f\xe5\x94\x77\x58\xe6\x7b\x59\x8e\x48\x19\x0e\xf9\xd5\x31\xc1\x7c\x33\xce\xd4\x52\x14\x3e\xa8\x3b\x17\x89\xf9\x76\x3c\x72\x46\xe1\x26\xc9\x55\x71\x55\xab\x7e\x32\xc7\xb1\x52\x14\xd3\x7d\x3e\xfb\x53\x8b\xd7\xe2\xd1\x7b\x44\x7d\x66\xac\x07\xf1\x86\x5b\xbd\x77\x80\x9e\x1b\x60\xef\x1e\x08\x7f\xd3\x8e\xb9\xfb\x42\xff\x15\xd3\x0e\x1a\x5d\xf4\x9a\x7a\x33\x92\x95\xb4\x65\x29\xeb\x81\x10\xf6\x44\x4d\xd6\x56\x54\x6d\xd5\x68\x0b\xdf\x9a\x5e\xac\xb8\x79\xed\x8a\xf2\x69\x8d\x35\x27\x11\x1b\xc5\x18\x3d\x22\x23\xa7\x95\x8c\x33\xb1\xe6\x63\x23\x5f\xe6\xd8\xad\x6b\x0c\x4e\xe6\xc8\x61\x8d\x7e\x71\x57\x33\x5a\x76\xd3\xf6\x66\xd8\x91\x76\xde\x9b\xc5\x23\x02\x36\x71\x5b\xec\x9e\xad\x0e\x8a\x67\x18\x34\xd6\x3c\xfc\x2f\x6f\xc7\xd0\x27\x23\x83\x49\x29\x7d\x23\xab\xa9\xa5\x7c\xc6\x38\x8b\x87\xb8\xf1\x93\x2a\x1a\x4e\x4c\x56\xcc\x19\x90\xb7\x10\xeb\x09\x96\xed\x92\x26\x23\x83\xb3\xaa\x26\xbb\x8a\x8d\xa4\x25\x3d\x2d\x65\x8c\xa7\x37\xdb\x47\x04\x35\xf2\xf2\x74\x31\x9d\xae\x2a\x70\xc5\x2e\x23\x1e\xdd\x51\xa8\xec\x37\xee\xb9\x0d\xdc\x7e\x70\xfb\xf5\xa8\xdb\x2f\x95\xa5\x79\x01\xc5\xcf\xd0\x34\x87\xe2\x27\x68\x92\x8e\x35\x01\x2f\x17\x8b\x52\xb1\xa4\x07\x02\xe7\x98\x3f\x70\xbe\x97\xed\x10\x5f\xb3\x63\x69\x3b\x02\x9f\x37\xa1\x36\x11\xfb\xb3\x10\xdd\x2f\x02\xf1\xf5\xf4\x35\x39\x53\xca\x19\x4b\x37\x33\x12\x9f\xfd\xa7\x10\xfb\xb5\x10\x91\x73\x24\x1c\xce\xf2\x61\xc2\x18\xac\xec\x5e\x24\x45\x78\xab\xc5\xee\xcb\xca\xc5\x45\xfb\xd4\xa9\x85\xb9\xb3\xc6\xcf\x5d\x98\xf5\xa0\xd0\x05\xd1\x4d\xcf\xd2\x19\xde\x4d\x4f\xd1\x09\x9a\x6c\x2e\xeb\x81\x3f\x63\x60\xba\xc3\xfb\x1e\xa4\x69\xa3\x95\xc7\xca\x35\xf3\x1a\x34\xd9\xae\xb8\x31\x3f\xd6\x8c\xae\xab\x59\x32\xd9\x63\x3a\xff\x20\xd8\xaf\x84\xd9\x8f\xf5\xd3\xd6\xb4\xaa\xc9\x57\xcb\x89\xf0\x7e\x4d\x96\x32\x11\x71\xcc\xfa\x9e\x9d\xa5\xce\x25\xa7\xc4\x69\xbb\xc4\xd8\x98\x71\xcd\xb4\xaa\xc9\x4b\x2e\xa7\xad\xef\xa9\xe2\x23\x6c\xad\x7b\x23\x95\xa9\xed\x65\x9f\x13\x2f\x25\x49\xa7\xf9\x4b\x99\xa0\xa3\x74\xb8\xa6\xaf\xca\x68\x02\xe3\x15\xf8\xd6\xdc\xb2\x0f\xbb\xfc\xed\xc3\x1d\x6c\x20\x2b\x17\xd7\xa8\x2f\x1d\x8d\x9a\x46\xc0\xf7\x8e\x1e\x4d\x98\xf0\xbb\xb6\x3b\xef\xe8\x90\xf1\x62\xa5\xb4\xbc\xc6\xd7\xb4\xdf\xbc\x6c\xc3\xde\x54\x72\x9e\x52\x74\xae\xc2\xd9\xde\xf4\x1b\x01\x8e\x85\xab\xbd\x49\x57\xfb\x8b\x7d\x2d\xb4\x0c\xc2\xf2\x27\xb8\xe5\xb7\x1d\xed\xeb\x29\x2f\x68\x8a\x52\xdb\x04\x15\x4a\x6d\x34\x41\xc9\xe7\xef\x72\x4c\xd0\xc9\x82\xa4\x15\x15\xee\x5c\x14\x58\x62\x8d\xb6\x68\xbc\x60\xcc\x27\x37\xc4\x12\x3d\x58\x59\xd0\x28\xaf\xcb\x3e\x3e\xfc\xef\x74\x1f\x5c\x95\xb5\xac\xec\x3e\xba\xd7\x7d\xd4\x58\x66\x15\xe5\xac\x92\x1e\xad\x3a\xcf\x53\x8a\xf1\xf7\x2d\xf3\xa8\x51\xcb\xb5\x86\x1c\xd5\x99\x2c\x2c\xf0\x6c\x2d\xd8\xc1\x00\x3b\xf8\xb1\x7e\x7a\xa1\x9f\x7d\xb4\x3f\xfc\x61\x1b\xa5\x3c\xdb\xdf\x3b\x76\xb0\x02\x24\x1b\xed\xcc\x1d\xf4\xdc\xd9\x61\x74\x4e\x27\x6d\x73\xa8\x46\xc7\x1d\xe6\x44\x48\xc4\x73\x48\x39\x7e\x65\x5e\xcd\x8f\x8a\xab\xf9\x19\xdc\x1b\xa5\x47\x86\x52\xba\x9a\x5f\x10\xf9\x8b\xe7\x8d\xcf\xc2\xfc\x7b\xd1\xfa\x58\x9c\x1f\x87\x6b\x1b\xe8\xe4\x2b\x7d\xf4\x72\x1f\x7b\xa9\x2f\xfc\x19\x7b\x59\xfa\x91\xbe\x59\x55\x4b\x73\x47\x59\x56\xe5\xcd\xae\x46\xa2\x2b\xc6\x4f\xd1\xc8\x94\xe7\x29\xf8\x7a\x5e\xf8\xb4\x4a\xba\xe3\x99\x1f\x95\xd2\xfc\xc1\x79\xbc\x43\x4e\x49\x9b\xb0\x4a\xce\x65\xf4\x88\x7a\xd3\x6c\x53\x11\x0f\x50\x90\xd5\x42\x4e\x8e\x47\xc4\x1d\x79\xc2\xa9\xf5\x2e\xf9\xba\xda\xb7\x01\xec\xdb\x47\xb7\xf0\x6a\x79\x22\x41\x5b\x39\x15\x5d\xc7\x2e\x28\x85\x26\x76\x41\x59\xc3\x10\x91\x4a\xd2\x69\x76\x32\x7a\xdc\x5e\xad\x3e\xe2\x56\xdf\xf5\xbd\xfe\x76\x50\xe3\x65\x5f\x1f\xa6\xa4\xb5\x16\xab\xbf\x8d\xbb\x69\x5c\xf3\xc5\xb2\x9a\x2b\xad\xca\xe9\x9c\xa4\xac\xda\x1b\x17\x7d\x72\x98\x7d\xeb\x16\x67\x8c\xfd\xc5\x86\x76\x70\xb7\x4b\x5c\xe2\x25\x4e\x1b\x25\x76\xc5\x0e\x46\xb1\x9b\x7e\x43\xbc\x6f\x7d\xbb\x3c\xff\xfd\x36\xd8\xca\xc8\xfe\x88\x7d\xdb\xdf\xfb\x11\x23\xdb\x1f\xd9\xfe\x50\x13\x45\x74\x27\xa2\x3b\x11\xdd\xd9\x3b\xd1\x9d\x50\x13\x85\x9a\x28\xa2\xea\x10\x55\x87\xa8\x3a\x44\xd5\x75\x45\x54\x5d\x7d\x98\xe2\xbb\x8e\xbb\x1d\x60\x0a\x34\x4f\x11\xed\x04\xcd\xd3\xcd\x23\x72\xc0\x5e\x1c\xa4\x98\x08\xf7\xc9\xcb\xc5\x9b\xaa\x76\xc3\x15\xee\x53\x4e\x58\x3f\xf2\xb8\x48\x45\xd6\xd9\x73\x83\xec\x6b\xfd\xf4\x3a\xe7\xdc\xab\xe5\x40\x65\xcd\x0b\xe2\x64\x11\x19\x19\x1b\x35\x4e\xbe\x60\x5f\xbf\x94\xf0\x1c\xde\x6c\x9b\x14\xad\xd4\x8e\x5e\x59\x53\x3a\xb8\xab\xf1\xcb\x89\xb8\xa7\x49\xd6\xa2\x0f\xf1\x54\x30\x55\x9c\x64\xc7\x4c\xaa\x58\xf5\xc2\x4d\xc8\xe8\xb9\x3b\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\x22\xe0\xe2\x46\xc2\x45\x60\x3b\x60\x3b\x60\xbb\x1e\xc6\x76\xef\xdf\x4a\x87\x03\xf2\xc7\x0a\x6a\xc6\xce\x16\x33\x06\xb1\x15\x55\xbb\x29\x69\x19\xf6\xbb\x77\xb0\x9f\x0c\x39\x71\x8a\xb1\xb4\x9a\xcf\x1b\x56\xeb\xec\x99\xcb\x0e\xb6\x29\xaa\x11\xd7\x35\xc6\x43\x2c\xa8\x99\xd8\x90\x79\xae\x08\x0b\x3c\x2b\x17\x5d\x91\x81\x6a\x66\xc1\xb9\x60\x7f\x7f\x6c\x2c\x26\x08\xd9\x11\xda\x29\x40\xd8\x7d\x74\x2f\x07\x61\xaf\xa3\x3b\x3f\xd1\xb7\x8d\xcc\x1e\x12\x18\x49\xd7\x64\xa0\x9c\xa8\xce\xac\xa8\x8e\x29\x7a\xe7\x61\x59\xd7\x1f\xf1\x67\x69\xc4\xb6\x99\x4f\x49\xd1\x7f\xe7\x6a\xa7\x7d\x56\x3b\x2d\x5c\x5c\x0c\x6c\xa8\x61\x4f\x43\x2d\xa8\xfa\x6d\xde\x52\x01\xde\x2e\xbf\x5b\x6c\x84\xb7\xeb\x2d\x74\x85\x3d\x1e\x5e\xb4\xbe\xf2\x23\xf3\xe6\xfa\xc8\x78\x83\xfc\x55\x5a\xaf\xf1\x92\x15\x65\xef\x9a\xb3\x5d\x91\x97\x17\xd5\xf4\x0d\xb9\xa8\x47\xb7\xf0\x0b\xdc\x46\x84\xbd\x6f\x88\x1e\xf5\x06\x11\xfb\x47\x0b\xb3\x2f\x0d\xb2\xdf\x1b\x70\xba\xd5\xb7\x9a\x61\xc2\x4a\x3e\xa3\x94\x95\x4c\x49\xca\x79\x22\x86\xed\x25\x5c\xfb\x22\x85\xe3\xb1\x83\xae\x58\x5f\xdf\xfb\x18\xed\xb4\xd9\xc8\xfc\x46\x44\xfd\x36\xb2\xdd\x3f\x22\x7f\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x01\xe7\x37\x3d\x9c\xff\xef\x21\x7a\x50\xc4\xd4\x5a\x88\x88\x97\x62\xab\xe8\x7d\x2e\xc4\x7e\x33\x44\xaf\xf3\x1c\xac\x2b\xa4\x77\x7f\x56\x2e\x4e\xb9\xcf\x86\x96\x9e\x4b\x4b\xef\xb3\x4f\xd0\x6e\x33\x84\x59\xcd\xc8\xae\xe0\x65\xad\x94\x37\x7a\x56\x3a\x27\xe9\xba\xac\xb3\x1f\x7f\x82\x3d\xb7\x97\xb6\x1a\x27\x71\xc7\x47\xfd\xa8\xe5\x4b\xe2\xe2\x69\xe3\xe2\xd8\xb7\xf0\xa0\x65\x35\x23\x2f\x25\xdc\xbf\x77\x39\x03\xc5\xce\xff\x20\x82\xd8\xf9\x1f\x44\x10\x44\x10\x44\xb0\x87\x88\x60\x17\x6d\x64\xd4\x35\x44\x10\x3b\xec\x80\x08\x82\x08\x82\x08\x82\x08\x62\xe7\x7f\x6c\x01\x72\xfb\x00\xbc\xae\xdf\x02\x64\x53\xee\xfc\x7f\x95\x66\x04\xc3\x3a\x41\x93\x9c\x61\x1d\xa2\x03\x94\xa8\x9d\xbc\xad\x66\x84\xde\xab\x0b\x0d\xcd\x2b\x7a\x70\xbc\xd8\x9a\x42\xc1\x5c\x70\xcb\x92\x74\x75\xdd\xcf\x1b\xb1\x19\x90\x27\x1e\xfd\xdf\xdb\x1c\x0e\x76\x9f\xb5\xb3\xbf\x17\x79\xdd\x2f\x7e\x6e\x23\xf4\x12\x8c\x6a\x9a\xa6\xe8\x54\x85\x9e\xf6\x18\x8d\xae\xa9\xb1\x21\xa2\x8d\xcd\x04\x9a\xdc\x4c\xe0\xaf\xfa\xe8\xb4\xf8\xd6\x8f\xd1\x11\xfe\xad\x27\x68\xad\xdd\x8f\xce\x88\x3d\x04\x4e\xd2\x71\x67\x0f\x81\x26\x8a\x99\x15\x3b\xf4\x9f\xa2\x13\xae\x1d\xfa\x9b\x28\x67\xbd\xdb\xf2\xb7\xcb\x2c\xc5\x7e\x7b\xc4\x31\x3b\x8f\xf8\xee\xc0\xef\x31\x41\xe6\x26\xfd\xc2\x04\x39\xdb\xee\xb7\xd1\x18\x61\xaf\x7d\x10\x58\x10\x58\x10\x58\x10\x58\xec\xb5\x8f\xbd\xf6\xb1\xd7\x3e\xf6\xda\x87\x27\x00\x9e\x00\x78\x02\xe0\x09\x80\x27\xa0\x25\x9e\x00\xec\xb5\x8f\xbd\xf6\xb1\xd7\x3e\xf6\xda\x87\xa3\x0d\x8e\xb6\x1e\xda\x6b\xbf\x5d\x44\xb9\xf5\x9b\x01\xfe\xe7\x10\xbd\x4e\x04\x93\x0b\xfb\x34\xc6\x7e\x29\xc4\x3e\x1d\xa2\x3b\xc4\x3f\xeb\x86\xe9\xef\xc8\xca\x45\x61\x93\x10\x9f\xef\x8a\xcf\xff\x99\x3b\xe9\xc0\x1a\xb4\x8a\xe4\xb2\x22\x7a\xd2\xdf\x53\xf4\x15\x97\x52\x8a\xe9\x90\x8c\x58\xc7\x45\xcb\x2f\xa8\x99\xd8\x23\xe2\x48\xd5\x66\x85\x6a\xe6\x8c\x79\x6e\x8b\xdd\x04\xb3\x34\x43\xc9\x0a\x9f\xe5\x7e\x1a\xaf\xe9\xa5\x31\x47\xe7\x72\x62\x59\x2e\x4a\x89\xb8\x55\xab\xd4\xdf\xf5\xd1\xb4\x78\x19\xc7\x69\x82\xbf\x8c\x83\xd4\x44\x39\x74\x4e\xf8\x9f\xa6\xe8\x94\xe3\x7f\x6a\xae\xa4\x39\xe1\x82\x4a\xd2\x69\x97\x0b\xaa\xb9\xa2\x82\xec\xc7\x62\xb0\x4d\x18\x67\x71\x61\x00\xec\x42\x5d\x1f\x3f\xbf\x1d\x99\x36\x43\x54\xa2\x9e\xe3\x9b\xbb\xb6\x52\x00\x93\xf5\xc1\x64\x0a\x8e\xe2\x1a\x8e\xe2\x43\x74\x80\x25\xa2\x63\xb6\x3a\xd5\x1b\xdc\x0a\x57\x56\xff\xbc\x1d\xb6\x70\x61\xdf\x36\x48\x6f\xb4\xec\xb5\x31\xdd\x55\xd2\xb2\x94\x4e\xab\xa5\x7c\x51\x67\x5f\xd9\xcb\xfe\xa4\xdf\xb1\xc9\x23\xf5\x73\xa8\x16\xc5\xd5\x53\xe2\xea\xd8\x90\x71\xb6\xb0\xd2\xde\x23\x9b\x4d\x5b\x4a\x12\xae\xfa\x71\x3e\x76\x1a\x66\xfb\x08\x1d\xa2\x03\x81\xfb\x41\x7b\x1f\xba\xa1\x08\xa1\x85\x60\x23\x39\xca\xf6\x55\x8a\x45\x79\x6f\xb4\xa6\xd0\x20\xa8\x48\x21\x67\x0c\x2a\x52\x88\x58\x40\xc4\x02\x22\x16\x7a\x28\x62\x01\x2a\x52\x50\x91\x82\xa7\x18\x9e\x62\x78\x8a\xe1\x29\xee\x0a\x4f\x31\x54\xa4\xa0\x22\xb5\x59\x7c\x63\x50\x91\x6a\x87\x8a\xd4\xb7\x49\x74\xce\x54\x91\xca\x18\x53\x59\x45\xcd\x6b\x72\x56\x31\xbe\x4b\xb7\x9a\x94\x09\xc2\xc7\x56\x4b\x45\xc9\x98\xa6\xdc\x94\x97\xaf\xa9\xea\x0d\xcf\xc2\x4f\x67\x9f\x7a\x9a\xfd\xe8\x20\xed\xf2\x2d\xe9\xaa\x59\x44\x78\xa2\x3e\xcd\x3b\x6f\xde\xe1\x8a\xb8\xc3\xb4\xfb\x0e\xb1\xe3\xc6\xb5\x53\x7e\xc5\x2f\x89\xd2\xeb\x5d\xdd\xe5\xbc\x0f\x3a\x4a\x60\x62\xd0\x51\x02\x13\x03\x13\x03\x13\xeb\x21\x26\xd6\x45\x49\x2a\x5d\xc3\xc4\x90\x3d\x01\x26\x06\x26\x06\x26\x06\x26\x06\x1d\x25\x84\x77\xdf\x3e\x08\xab\xeb\xc3\xbb\x37\xa5\x8e\xd2\x73\x7d\x74\x5d\x04\x4a\xa5\x49\xe2\x81\x52\x6f\xa3\xb7\xd0\x95\x9a\x81\x52\xfe\xa0\xcb\x8a\x2c\xad\x47\x90\x1a\x0a\xa6\x0a\x08\x7d\xba\xfe\xce\xe0\x60\xab\xb7\xb2\x37\x9b\xc1\x56\xf5\xa0\x9c\x19\x86\x55\xaf\xc2\xd5\x91\xac\xd1\x7f\xa2\x20\x40\xb7\xc7\x96\x6a\xaa\xcb\xe2\x4e\x8a\xd3\x36\x9c\xc6\x09\x78\xa6\x50\x96\xe4\x8a\x60\xe9\xc7\x69\xb1\x0d\x9d\x00\xb2\x03\x90\x81\x6a\x32\xba\xf7\x4f\x42\x35\xad\x07\xad\x08\x13\x76\x95\x9e\xe4\x26\xec\x0a\xb5\xa7\xf7\xd2\x0d\x11\xc5\x9f\xa1\x65\x27\x8a\xbf\x6d\x37\xcb\x89\x40\x7f\x99\xd2\xae\x40\xff\x76\xdd\xcd\x32\xc0\x1b\x6b\x60\x83\x92\x03\x62\xbf\x32\x1a\x64\x80\x13\xbe\xa2\x55\x75\x8d\xf1\x39\x71\x49\x3d\x63\xec\x48\x5b\x75\xd0\x2c\x43\xea\x0a\x90\x1c\x90\x1c\x90\x1c\x90\x1c\x52\x57\x90\xba\x82\xd4\x15\xa4\xae\xe0\xac\x81\xb3\x06\xce\x1a\x38\x6b\xe0\xac\x69\x89\xb3\x06\x52\x57\x90\xba\x82\xd4\x15\xa4\xae\xe0\x0b\x85\x2f\xb4\x87\xa4\xae\x36\x96\x71\xb7\x5e\x0d\xe4\x6f\x88\xf6\xd7\xd9\xcc\xba\x9c\x18\xd3\x4b\x7c\x38\x94\xd2\x69\x59\xd7\x35\xb9\xac\xc8\x37\x75\xf6\xf3\x14\xfd\xa9\x2d\x74\x8f\xe7\x9a\xab\xe5\x44\x78\xa7\xed\xc2\x5c\x14\x97\x4d\xf1\xcb\x2e\xf1\xcb\x62\x43\xa6\xe7\xd2\x7d\xd5\x52\xc2\xe7\xcc\x16\xc3\xf0\x45\x7a\x13\x5d\xac\xf0\x51\x9e\xa2\x13\xb5\x5d\x21\x9e\xa6\x30\x3a\x52\x75\x15\x53\x3f\x18\xa2\x05\xd1\x4d\xe7\xe8\x2c\xef\xa6\x53\xb4\xde\x42\xe9\x71\xe1\x24\xba\x40\xf3\x8e\x93\xa8\x05\xc5\x2e\x09\x77\xd0\x45\x3a\xef\x72\x07\xb5\xa0\xdc\xf5\x6e\x45\x92\x0d\xfe\x9a\x66\x58\xd2\xfa\x9a\x7c\x3a\xa8\xa5\x88\xe2\x53\x37\x8f\x90\x1c\x30\x1e\x84\xa1\x9a\x73\x1d\xb7\xdc\xe2\x7e\x31\x4c\x67\x85\xc5\x95\x9f\x29\xca\x79\x3e\xa8\xdb\x69\x5e\x35\x04\xf4\x94\x7c\x56\x33\x5e\x9d\xad\xa2\xa7\xf3\x91\x8d\xfd\xeb\x30\xfb\x50\x3f\x31\xa7\x20\xdb\x95\xf9\xa8\x26\x4b\x99\x88\x38\xcd\xea\x3d\x0e\xbe\x98\x13\xe5\xc5\x46\x8c\xb3\xce\xd8\x57\x9b\x0e\x4b\x47\x63\xcf\x3c\x4f\x8c\xa3\xad\x35\xca\x6b\x55\x59\x72\x9e\xd1\xf6\x49\x9b\xb5\x0b\xb4\x42\xbb\xfc\xad\xd0\x1d\x6c\x20\x2b\x17\xe9\xfa\x52\xb0\x11\x3a\xc0\x12\xa6\x11\x72\xaa\x61\x9a\x1e\xab\x12\x55\x63\x75\xf8\x6f\xb7\xf9\xbe\x99\x41\x4d\x2e\xe4\xa4\xb4\x1c\xf8\x72\xc6\xcc\x13\x37\xe6\xfd\x24\x8d\x51\xed\x4c\xc5\xa0\xd9\xdc\x0b\x82\x13\x05\x81\x3b\x4d\x5a\xdf\x9f\xed\x6b\x99\x95\x78\x4c\x4c\xad\x66\x28\xe9\x4c\xad\x36\xc0\xe4\x14\x4a\xed\x33\x39\xc9\x0f\xde\xe5\x6b\x72\xc6\x0b\x92\x56\x54\x78\x58\x80\x00\x8a\x81\xb6\x67\xb4\x60\xac\xfd\x3a\x6f\x79\x1e\xac\x2c\x48\x54\x64\x1f\x97\xc4\xdd\xe9\x3e\xb8\x2a\x6b\x59\xd9\x7d\x74\xaf\xfb\x28\x5f\x6c\xc9\x59\x25\x3d\x5a\x75\x9e\xa7\x14\xe3\xef\x5b\xe6\x51\xa3\x96\x49\x63\xe6\x9d\xaa\xb0\x7a\x13\x74\xb4\x89\xc5\xe7\x02\xcf\x35\x85\xe9\x0b\x30\x7d\x1f\xeb\xa7\x17\xfa\xd9\x47\xfb\xc3\x1f\xb6\x99\xe7\xb3\xfd\xbd\x63\xfa\x2a\x3c\x3e\x46\x3b\xf3\x48\x1a\xee\x95\x34\x3a\xa7\x93\x74\x3e\x54\xa3\xe3\x0e\x73\x74\x2b\x02\xaf\xa4\x1c\xbf\x32\xaf\xe6\x47\xc5\xd5\xfc\x0c\xee\x36\xd6\x23\x43\x29\x5d\xcd\x2f\x88\xec\xeb\xf3\xc6\x67\x61\xfe\xbd\x68\x7d\x2c\xce\x8f\xc3\xb5\x6d\x72\xf2\x95\x3e\x7a\xb9\x8f\xbd\xd4\x17\xfe\x8c\xcd\x8f\x3e\xd2\x37\xab\x6a\x69\xee\xd1\xce\xaa\xbc\xd9\xd5\x48\x74\xc5\xf8\x29\x1a\x99\xf2\x3c\x05\x07\x6f\xc2\xf9\x5c\xd2\x9d\x10\x9a\x51\x29\xcd\x1f\x9c\x07\x26\xe5\x94\xb4\x49\x95\xe5\x5c\x46\x8f\xa8\x37\xcd\x36\x15\x81\x3b\x05\x59\x2d\xe4\xe4\x78\x44\xdc\x91\xa7\xcb\x5b\xef\x92\x03\x30\xdf\x06\xb0\x6f\x1f\xdd\xc2\xab\xe5\x89\x63\xef\xdc\x4c\xb4\x31\xbb\x1f\x60\xe5\xab\x87\x85\xeb\x0f\xfb\x0f\x37\xdb\xd8\x1d\xfc\xf1\x29\x75\x90\xf6\xb3\xf1\x68\xdc\xd6\xa9\xbd\xd7\x2d\x6f\x6b\xde\xe9\xb6\x50\xb7\xfd\xc7\x27\x29\x2e\x56\x57\x7a\x51\xd5\xa4\xac\x5c\x29\xa4\x51\x56\x73\xa5\x55\x59\x2a\x16\xa5\xf4\xb5\x55\x39\x5f\xd4\xd9\x67\x9f\x64\x3f\xb7\x97\xee\x36\xcf\xb7\x07\xcd\x78\x7d\xb9\x8c\x25\x5e\xce\x94\x5d\x4e\x2c\x6a\x9c\xbf\x28\x0a\x31\x87\xcb\xca\x73\x20\x84\x01\x21\x0c\x08\x61\x20\xc6\x17\x31\xbe\x88\xf1\x45\x8c\x6f\xd7\xc4\xf8\x76\x4f\x08\x2b\x62\x2b\x11\x5b\x89\xd8\x4a\xc4\x56\x22\xb6\xb2\xa7\x63\x2b\x11\xfc\x85\xe0\xaf\x1e\x0d\xfe\xda\x94\x42\x18\x37\xd6\x16\x09\x64\x91\x29\x8b\x1e\x56\x62\xa2\x86\xd4\x2e\xd2\xc1\x28\xf1\x34\x3b\x69\xb2\x42\x2f\x0b\x33\xdd\x48\x95\xb7\x5d\x53\x4a\x35\x97\xd4\x88\xbe\xb4\xbd\x9a\x9b\x3d\x60\x87\x80\x55\x21\xb2\x47\xc5\xa1\x0e\x41\x32\xc1\xb4\x2e\xd2\x79\x7a\xac\xc2\xa1\x53\x27\x9a\x30\xf0\xe5\xc0\xa3\x03\x67\x76\x93\xce\xec\xf7\x87\xd6\x14\xd8\x1a\xd8\x15\xe9\x4d\xc2\xa5\x9d\xa2\x73\x8e\x4b\x7b\x9d\x45\x5e\x12\x91\x82\x8f\xd1\x9c\x2b\x52\x70\x9d\x65\xae\x37\x4a\xb0\x13\xa6\x2e\xf6\x77\x23\xd5\xa6\x6c\x8f\xaf\x1e\x44\x95\x59\x8b\x8b\xd3\xbc\x66\xcd\x51\x7d\x68\xb3\x81\x83\xd2\x03\x28\x30\x28\x30\x28\x30\x28\x30\x94\x1e\xa0\xf4\x00\xa5\x07\x28\x3d\xc0\x1b\x01\x6f\x04\xbc\x11\xf0\x46\xc0\x1b\x01\xa5\x07\x28\x3d\x40\xe9\x01\x4a\x0f\x70\xf6\xc1\xd9\xd7\x85\xce\xbe\xae\x56\x7a\x68\x8c\x3a\xd7\x8a\xce\x6f\x0c\x43\xb7\x3e\xfe\xfd\x1c\xdd\x31\x96\x53\xb3\xfa\x18\x3b\xc9\x8e\xd3\x80\xf1\x67\x8c\xe5\xd4\xec\xac\x92\x93\xe7\x15\xbd\x78\x4e\xca\x67\x72\xb2\x96\x7a\x20\xa8\xad\xd8\x47\x9f\xa4\x7d\x46\x17\x1d\x2b\xd7\x4c\x4b\x2e\xa8\x99\xa2\xbc\x5a\xe0\x68\x8b\x7d\xed\x09\xf6\xee\xbd\xb4\x35\xad\x6a\xf2\xd5\x72\x22\x3c\x5c\x3f\x7c\x7e\x41\xcd\x5c\x36\x2f\x8d\x3d\x6c\x9c\x3a\xad\x6a\xf2\x92\x2b\xc1\xcc\x75\x02\xc2\xe6\x11\x36\x8f\xb0\x79\x38\x4c\xe0\x30\x81\xc3\x04\x0e\x93\xae\x71\x98\x74\x8f\x3f\x00\xa0\x1a\xa0\x1a\xa0\x1a\xa0\x1a\xa0\xba\xa7\x41\x35\x48\x1a\x48\x5a\x8f\x92\xb4\x4d\x19\x36\xff\x14\x4d\x0b\xfa\x77\x9c\x26\x38\xfd\x3b\x48\xfb\x69\xbc\x66\x9c\x69\x5a\xd5\x64\x2e\xac\xe3\x90\xa1\x96\xec\x0b\x79\x3e\x18\xf4\xc5\xd8\x90\xc9\xf5\xa2\x51\x93\xe5\xb9\x6a\xe1\x91\x9a\x8c\xfe\x8f\x6d\x0e\x04\x7b\x83\x1d\x0b\xef\xe6\x5d\x8f\x88\x5f\x3b\x41\xbc\x04\xa0\x4a\xd2\x69\x3a\x59\x11\x03\x1f\xa7\x91\xb5\xb4\x34\xc2\xa3\x10\xf6\xde\x64\xd8\xfb\x7f\xed\xa3\x53\xe2\x3b\x3f\x4a\x87\xf9\x77\x3e\x4e\x6b\xec\x7d\x34\x23\x22\xdd\x4f\xd0\xa4\x13\xe9\xbe\xf6\x52\xce\x88\xe0\xf6\x93\x74\xdc\x15\xdc\xbe\xf6\x62\xd6\x1b\xcf\xde\x5a\x83\x13\xfb\xad\x11\xc7\xe0\x44\x7c\x23\xd6\xdd\xc6\x67\x9f\x38\x43\x18\x1f\x27\x48\xbd\x13\x66\x08\x91\xea\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x88\x54\x47\xa4\x3a\x22\xd5\x11\xa9\x0e\x07\x00\x1c\x00\x70\x00\xc0\x01\x00\x07\x00\x22\xd5\x11\xa9\x8e\x48\x75\x44\xaa\xc3\xbf\x06\xff\x5a\x17\xfa\xd7\x3a\x1e\xa9\xde\x5a\x46\xbc\x96\xc0\xf7\xcd\xa8\xfa\xfe\xb5\x10\xed\xaa\xab\xfa\xce\xf8\xa7\x5b\xad\xf0\xf2\xc6\xac\x5c\xf4\xce\xb0\x85\x37\x34\xb6\x2b\x2b\x57\x88\xb9\x4f\x2d\xcc\x59\x68\xb1\x85\x1b\x9e\x54\x15\x34\x51\x55\xd0\x44\x23\x05\xa5\x0a\x62\xef\xc0\x71\xbe\x77\xa0\xd1\x41\x67\x69\x86\x92\x4d\x74\x50\xd7\x73\x36\xe2\x5e\x65\x3f\xf9\x24\x0d\x8b\xb6\xcf\xcb\xc5\x9b\xaa\x76\xc3\x58\x21\x3b\xdb\x47\x9a\x5b\x97\xa5\x73\x92\xae\xcb\x3a\xfb\xea\x13\xec\x47\xf6\xd2\xeb\x9c\x53\xaf\x96\x13\xe1\x58\xfd\x5c\x01\x73\x7f\x82\x69\xa3\x88\xd8\x4e\xe3\xdc\x0b\xf6\xe5\x4b\x09\xf7\x51\x64\x0a\x20\x53\x00\x99\x02\x70\x58\xc1\x61\x05\x87\x15\x1c\x56\x5d\xe3\xb0\xea\x1e\x7f\x0c\x1c\x05\x70\x14\xc0\x51\x00\x47\x01\x1c\x05\x3d\xed\x28\x00\xc9\x04\xc9\xec\x51\x92\xb9\x29\x33\x05\x64\x4a\x09\xb8\x35\x4d\x53\x1c\x6e\x4d\xd2\x31\x3a\x52\x33\x68\xd7\x05\xa2\xca\xf6\xe6\x9c\x1c\x10\xb5\x24\x61\xe0\xc9\x60\x36\x3b\xc1\x8e\x7a\x76\xf1\xe4\x37\xf7\x20\x59\x13\xdd\x56\x31\x33\x8a\xfe\x5f\xdb\x2b\xf9\xd8\xb7\x58\x69\x04\x79\x2f\x0b\x7b\x48\xfc\xde\x76\x1a\xd6\xdc\x86\xf0\xb5\xdf\x02\x22\xd8\x90\x4c\xd0\x64\x32\xc1\x37\xd6\xb8\x21\x7c\xed\x4e\xd8\xc4\x86\xf0\x75\x0a\x9b\x17\xa9\x05\x67\x68\xda\x95\x5a\xd0\x74\x69\x41\x16\xaa\x31\x0b\xd4\x90\xb9\xf1\x31\x53\x41\x09\x0c\xb1\xd7\x46\x2a\x2d\xd4\x23\xbe\x79\x07\x1e\x63\x35\x24\x4e\x71\x1b\x2b\x27\xfd\xa0\x8d\x66\x0b\x59\x07\x80\xb8\x80\xb8\x80\xb8\x80\xb8\xc8\x3a\x40\xd6\x01\xb2\x0e\x90\x75\x00\x67\x02\x9c\x09\x70\x26\xc0\x99\x00\x67\x02\xb2\x0e\x90\x75\x80\xac\x03\x64\x1d\xc0\x57\x07\x5f\x5d\x17\xfa\xea\xba\x5a\x1f\xbf\x31\x06\xbd\x16\xee\xec\xe6\xd5\xad\xcf\x11\xf8\xd0\x10\x1d\xac\x1d\xa7\x2e\xd2\x04\xf8\x7b\xae\x0c\x59\x7f\x75\x90\xfd\xce\x00\x31\x0f\xf0\x16\xd9\x03\xcf\x98\xb3\xd0\x7c\x46\x29\x2b\x99\x92\x94\x73\x7b\x4f\x25\x7b\xc5\xe7\x7e\xc8\xb8\x6b\x60\x9f\xb0\xa7\x04\x83\xbc\xa0\x41\x07\xb9\x7a\x18\x9a\x5a\x90\xed\x65\xbb\x5e\x94\xa5\x4c\x3c\xb6\x97\x5f\xe0\x66\xe9\xbc\x46\x95\xae\xce\x2e\x8f\x87\x5f\xe3\xc6\xe9\x75\xfa\x37\xf7\x5f\x9f\x29\x37\xb2\xdb\xf0\x72\x70\xbf\x3d\xc5\x4e\x34\xd9\x6f\xcd\x7d\xd3\x77\xfb\x7f\x47\x77\x31\xe2\x0f\xcf\xdd\xc8\x29\x24\x03\x20\x19\x20\x05\x3f\x12\xfc\x48\xf0\x23\xc1\x8f\xd4\x33\x7e\xa4\x54\xd7\xb8\x49\x5a\x5e\x93\xa6\xf9\x7d\x0a\xfc\x1e\xfc\x1e\xfc\x1e\xfc\x1e\xfc\xbe\xf3\xfc\xbe\xe5\xa4\x21\xd5\xd3\xc4\x32\x05\x62\xd9\x3e\x62\x99\xea\x7a\x62\xb9\x09\xb3\x0b\xd8\x17\x86\xe8\xb0\x20\x83\x52\xa1\xa0\x8f\x95\x2d\x0e\x58\x63\xd7\xcb\x8c\x5c\xc8\xa9\xb7\x8c\x01\x58\x67\x3f\x3c\xc4\x7e\x76\x80\xb6\x1a\xd7\x5d\x2d\x27\xc2\xe5\xc6\x80\xe0\x8c\x5d\x42\x8b\x70\xe0\x6e\x7e\xc1\x54\xa1\xa0\xbb\x37\x14\x70\x6e\x03\x16\xe8\xcf\x02\x1b\xe1\x74\xd7\x2f\x04\x03\xc3\x7d\x6c\xd8\x04\x86\x46\x4f\x30\x19\xa1\xd3\xfc\x5e\xb2\x0d\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\x07\xee\xd7\x59\xee\xb7\xf9\x74\x4e\x41\x16\x41\x16\x41\x16\x37\x11\x59\xfc\xe0\xd3\x74\xc4\x22\x8b\x8a\xfc\x4c\x51\xce\xf3\xb7\xe5\x92\xc7\x4d\x97\xf4\xa2\xba\x6a\x95\xe5\x62\x5d\xec\x8f\xaf\xb2\xaf\xee\xa5\x7b\x3c\x17\x5e\x2d\x27\xc2\x87\xeb\x8b\xe5\x4e\xf3\x02\xad\xe5\xe4\x8c\x5d\x60\x6c\x9f\x71\xdd\x94\xbb\xb4\xa5\x44\xad\x93\xbb\x9c\x15\x42\x47\x17\x08\x0d\x3a\xba\x40\x68\x40\x68\x40\x68\x3d\x84\xd0\xba\x48\x61\xa0\x6b\x10\x1a\x52\xdf\x81\xd0\x80\xd0\x80\xd0\x80\xd0\xa0\xa3\x8b\xdc\xdc\xdb\x87\x47\x75\x7d\x6e\xee\xa6\xd4\xd1\xfd\xee\x3e\x2a\x8b\x20\x2b\x95\x56\x79\x90\x55\x96\x64\x4a\xd7\x0a\xb2\x72\x50\xd1\xa8\xbd\x5e\x77\xe2\xad\xbc\x48\xab\x9c\x88\xd7\xa2\x49\x2d\x11\xdd\xcd\x05\x47\x61\xcd\xb1\xb3\x3e\x92\x97\x7e\xe4\xcd\x8c\xd0\xaa\x55\x61\x8a\xfe\x7f\xe4\x43\xde\x1e\xb1\x64\x78\x6b\x43\xb6\x51\x71\x4a\xa7\x31\x9b\xa0\x62\x25\xd2\xe9\xed\x15\x02\xbd\x12\x5d\x6d\xf3\xdb\x85\x30\x1c\xc4\x7c\x9b\x14\xf3\x7d\x57\x3f\x3d\x23\x74\x73\xdf\x4e\xaa\x4b\x37\x37\x4d\xed\xef\xb6\x35\x0d\x12\x69\xc2\x42\xde\x20\x85\x5b\xc8\x8e\x54\xe6\xa6\xd0\x22\x2e\x50\xde\xd1\x22\xee\xc4\x8d\x83\xad\x2f\x57\xfc\x6d\xd0\xfa\xae\xc3\xe2\xba\x0d\x77\xec\xfd\xa3\x3e\xd6\x77\xd4\x57\x62\xb8\xa6\x25\x3e\x22\x4e\xaf\xb4\xc4\xf6\xc5\x1d\xb2\xc9\x50\x1f\x06\xfa\x06\xfa\x06\xfa\x06\xfa\x86\xfa\x30\xd4\x87\xa1\x3e\x0c\xf5\x61\xb8\x60\xe0\x82\x81\x0b\x06\x2e\x18\xb8\x60\x5a\xe2\x82\x81\xfa\x30\xd4\x87\xa1\x3e\x0c\xf5\x61\x78\x38\xe1\xe1\xec\x21\xf5\xe1\x8e\x02\xe9\xd6\x8b\x11\x7f\x29\x44\xf7\x88\xc4\x00\x61\xb4\xc6\xca\x89\x31\xf6\x72\x88\xbd\x14\xa2\xed\xe2\x97\xab\xe5\x44\xf8\x8d\x59\xb9\xe8\x9d\x0b\x0b\xcf\x71\xcc\x38\x20\x6c\xd5\x52\x62\x6a\x61\xce\xaa\x7e\x0b\xb7\xce\xab\x2a\x68\xa2\xaa\xa0\x89\x46\x0a\x4a\x15\xe8\x71\xd1\x89\x2e\xd0\x3c\xef\x44\xb3\x34\x43\xc9\x26\x3a\x91\xeb\x39\x1b\x71\x28\xb3\xef\x19\xa6\xe3\xa2\x89\xf5\xf4\x35\x39\x53\xca\xd5\xd4\x7b\x2e\x68\x8a\xaa\x29\xc5\x5b\xa6\xe0\xb3\x10\x7b\x79\x27\xfb\xfc\x10\x7b\xdf\x16\x62\xce\xd5\xb6\xee\xf3\x8b\x7d\xe6\x27\xe9\x12\x77\xc9\x5b\x53\x3e\x2b\x11\x63\xc1\x2c\xb5\x75\xb2\xcf\x23\xce\x22\x8f\x2f\x64\xcd\x25\x81\xb1\x4e\x74\x56\xaf\x83\x1e\x2e\xe3\x2a\xdb\x52\x89\x59\xb4\x9f\xc7\x14\x8d\xf6\x54\xb4\xcb\x33\x3f\x36\x44\x25\xe6\x61\x7f\xbb\xb4\x8d\xdd\xc1\x2b\x46\xd7\xd3\xc1\xc6\xe8\x34\x3b\x69\x1a\xa3\xaa\xde\x68\x5a\x22\xcf\x6b\xa8\xd6\x94\x86\x6c\x0c\x72\x5e\x20\x1b\x03\xc7\x1f\x1c\x7f\x70\xfc\xf5\x90\xe3\x0f\xb2\x31\x90\x8d\x81\xc3\x05\x0e\x17\x38\x5c\xe0\x70\xe9\x0a\x87\x4b\x6a\x82\x8e\xb2\xc3\xd1\x83\xb6\x6c\xcc\x03\x3c\x6e\xd7\xac\x85\x67\x11\x17\x1d\x30\x0e\x41\x10\x06\x82\x30\x9b\x10\x4f\x43\x10\xa6\x1d\x82\x30\x9f\xbc\x4a\xe7\x4c\x28\x59\x54\x35\x29\x2b\x57\x12\xc9\x1a\x9a\xd3\x69\xc3\x72\xf3\x0b\xd2\x52\x41\x4a\x2b\x45\x45\xd6\xd9\x5f\x3c\xc5\x7e\x63\x2f\xdd\x6d\x1e\xb0\xe9\xe4\x78\x80\x40\xcc\xe2\xdc\xa2\xb8\x62\x5a\x14\x75\x2b\x16\x37\xae\x30\x7f\x34\xa1\xa0\xa3\x22\x5d\x7d\x7e\x97\x33\x42\xa8\xc3\x80\x94\x41\x1d\x06\xa4\x0c\xa4\x0c\xa4\xac\x87\x48\x59\x17\x45\x80\x77\x0d\x29\x43\x68\x32\x48\x19\x48\x19\x48\x19\x48\x19\xd4\x61\x10\x3b\x79\xfb\xc0\xa9\xae\x8f\x9d\xdc\x94\xea\x30\xab\x74\x49\xc4\x56\x3d\x46\x73\x3c\xb6\x6a\x9a\xa6\xe8\x54\xad\xd8\xaa\xb8\x45\xb0\x4c\xee\x14\xaf\x06\x45\x0d\x09\xbf\xc8\xc1\xc1\x53\x49\x76\xda\x0a\x9e\xf2\x50\x33\x2b\x86\xb3\xea\xc6\x3e\x5b\xf2\x07\xe8\xcb\x44\xbf\xb4\xbd\x9a\xa4\x3d\xe8\x08\xbe\x54\x43\xb3\x71\x71\x70\x03\xb0\x99\xa0\x5c\x6f\xa2\x8b\x74\xbe\x42\xed\xe5\x04\x4d\xae\xe3\x75\x21\xc9\x16\x4a\x2e\x4d\x2a\xb9\x7c\x5f\xa8\xb6\x9e\xca\x05\x61\x54\xce\xd2\x19\x6e\x54\x4e\xd1\xfa\x7a\x29\x2d\x0a\xad\x94\x79\x4a\x39\x5a\x29\xeb\x2e\xf4\xb2\xd0\xa1\x39\x4f\x8f\xb9\x74\x68\xd6\x5b\x6a\xa3\xea\x2a\x9d\x31\x81\xb1\x67\x47\xab\x4d\xdc\xa0\xbf\xaa\x4a\xb5\xb9\x9b\x10\x27\x7a\xcd\x9d\x23\xa7\xd2\x41\xc3\x07\x49\x15\xf0\x62\xf0\x62\xf0\x62\xf0\x62\x48\xaa\x40\x52\x05\x92\x2a\x90\x54\x81\xdf\x02\x7e\x0b\xf8\x2d\xe0\xb7\x80\xdf\xa2\x25\x7e\x0b\x48\xaa\x40\x52\x05\x92\x2a\x90\x54\x81\x5b\x10\x6e\xc1\x1e\x92\x54\xe9\x0c\x85\xde\x84\xdb\x2e\xb3\x17\x89\x06\x8d\xce\x3b\x56\xae\x19\xa0\xbf\x6c\xac\x8e\xf3\x59\x9d\xbd\x97\xa2\x3f\x30\x40\x5b\xd3\xaa\x26\x5f\x2d\x27\xc2\xf7\xd8\x2e\xc4\xa4\x38\x23\xb6\x4b\xfc\x32\xad\x6a\xf2\x92\xcb\x5f\x68\x1e\x6e\x31\x2b\x3f\x49\xc7\x69\xa2\xc2\x49\x18\xa3\xa1\x9a\x3e\x0d\xa3\xda\x46\xf7\x32\x6b\x93\xfa\x62\x1f\x4d\x8a\x0e\x7b\x90\xf6\xf3\x0e\x3b\x42\x6b\xb8\x9e\x4e\x0b\x5f\xcd\x31\x3a\xe2\xf8\x6a\xd6\x56\xc2\x94\x70\xcc\x4c\xd0\x51\x97\x63\x66\x6d\x45\x04\x7d\x24\x73\xc1\x1d\x7f\x2f\x7b\xd4\xec\xf8\xd1\xa8\xd9\xd9\xad\xd2\xdd\x42\x41\x41\x9e\x9e\x14\x98\x5b\x7d\xe6\x96\x82\x87\xb5\x86\x87\x75\x13\x9a\xcd\xaf\x0f\xd1\x48\xdd\x64\xa7\xb4\xae\xe4\xd5\x8c\xa3\xb8\xf4\x9b\x43\xec\xff\x84\xaa\x7d\x94\x61\x4d\x96\x32\x15\xb4\x70\x7a\x71\xee\x82\x9a\x91\x63\x0f\x18\xc7\x2a\x9c\x92\xe2\x50\x6b\x2d\x69\xea\x29\x9a\x16\x86\xf0\x38\x4d\x70\x43\x68\x18\xc4\xf1\xb5\x38\x87\x8d\x4a\x05\xda\xa2\x5d\xfe\x06\xe4\x0e\x36\x90\x95\x8b\x74\xfd\xad\xc1\xa6\xea\x08\x3b\x14\x30\x46\xf3\x8a\x54\x0d\xcc\xe1\x97\xb7\x55\x37\xfd\x2e\x4d\x2e\xe4\xa4\xb4\x5c\xa3\xf5\x77\x9a\x87\x3b\xf0\x02\x92\x5c\x37\xac\x62\x28\x6b\xe2\x0d\xc0\xed\x81\x20\x97\x26\x4d\xf0\x47\xfa\x5a\x63\x03\xce\x89\x49\xd1\x14\x9d\x72\x26\x45\x9d\xb6\x26\x85\x52\x7b\xad\x49\xec\x1b\x77\x57\x5b\x93\x7b\x4c\x24\x21\xd9\x06\xe4\x41\xdf\xa8\x92\xb6\xd8\x8f\xf6\x84\x8d\xc0\x9a\x04\x58\x13\xb8\x2e\x3b\xe2\xba\x04\xb3\x06\xb3\x06\xb3\x6e\x17\xb3\x4e\x7d\xb4\x45\x43\xff\x9c\xa0\x19\x49\x3a\xed\xa2\x19\xed\x19\xfb\x23\xfe\x63\xff\x76\xb6\x55\x34\x4a\x5b\x87\xff\xe4\x57\xef\xac\x1e\xfe\xf7\x16\x24\xad\xa8\xf0\x10\x3e\xe1\xfc\xab\xb1\xaa\x08\x17\xb8\x4e\x6d\x7b\xe7\x04\x0f\x56\x16\x34\xca\xef\xba\x8f\x6b\x1d\xef\x74\x1f\x5c\x95\xb5\xac\xec\x3e\xba\xd7\x7d\x54\x2f\x6a\x52\x51\xce\x2a\xe9\xd1\xaa\xf3\x3c\xa5\x18\x7f\xdf\x32\x8f\x1a\xb5\x4c\x5e\xa0\x79\x4a\x55\xac\x67\x26\xe8\x68\x13\x33\x92\x05\xae\x82\x80\x99\x48\xc0\x4c\xe4\x63\xfd\xf4\x42\x3f\xfb\x68\x7f\xf8\xc3\xb6\x39\x7f\xb6\xbf\x77\xd6\x35\x15\x01\x18\x46\x3b\xf3\xc0\x56\x1e\x24\x64\x74\x4e\x47\x0e\x65\xa8\x46\xc7\x1d\xe6\xa3\x92\x88\x83\x96\x72\xfc\x4a\x63\xfa\x25\xae\xe6\x67\xf0\xa9\x90\x1e\x19\x4a\xe9\x6a\x7e\x41\xe8\x82\x9c\x37\x3e\x0b\xf3\xef\x45\xeb\x63\x71\x7e\x1c\xae\xbd\xe0\x4a\xbe\xd2\x47\x2f\xf7\xb1\x97\xfa\xc2\x9f\xb1\xdd\x39\x1f\xe9\x9b\x55\xb5\x34\x9f\xa5\x65\x55\xde\xec\x6a\x24\xba\x62\xfc\x14\x8d\x4c\x79\x9e\x82\xfb\xc1\xc4\x84\xaa\xa4\x3b\x11\xad\xa3\x52\x9a\x3f\x38\x8f\x13\xce\x29\x69\x73\xc0\x94\x73\x19\x3d\xa2\xde\x34\xdb\x54\xc4\xd1\x16\x64\xb5\x90\x93\xe3\x11\x71\x47\x2e\xe4\x62\xbd\x4b\xee\x8f\xf2\x6d\x00\xfb\xf6\xd1\x2d\xbc\x5a\x9e\x0c\xab\xa7\x6a\x67\x49\xb4\x62\x78\x09\x16\xac\x2e\x08\xc1\xea\x36\x5a\xfe\xd4\x41\xda\xcf\xc6\xa3\x71\x1b\x54\xde\xeb\xd6\x47\x33\x2f\x6b\xbf\x32\x1a\xfb\x83\x27\x29\x1e\xe0\xb3\xd1\x65\xad\xac\xa4\x65\x29\x9d\x56\x4b\xf9\xa2\xce\xfe\xed\x93\xec\xfd\x7b\x1d\xd7\xcd\x48\x7d\x1d\xa5\x45\x71\xf5\x94\xb8\x3a\x16\x35\xce\xae\x74\xea\x78\xcf\x81\x6e\x12\x74\x93\xa0\x9b\x84\x3c\x18\xe4\xc1\x20\x0f\x06\x79\x30\x5d\x93\x07\xd3\x3d\x69\x1e\xc8\x3f\x40\xfe\x01\xf2\x0f\x90\x7f\x80\xfc\x83\x9e\xce\x3f\x40\x80\x34\x02\xa4\x7b\x34\x40\x7a\x53\xea\x26\x49\xb5\xa9\xde\xac\xa0\x7a\xa7\xe8\x04\xa7\x7a\x47\xe8\x10\x1d\x08\x8c\x5b\xf5\x52\xa3\x79\x45\x2f\x5a\x60\x6f\x21\x98\xdb\x8d\xb2\x7d\x95\x91\xaa\xde\xf2\x1a\x0d\x58\x15\xb2\x48\xcf\x6e\x77\x80\xd8\x1b\xed\x58\xe6\x0a\xf6\xf5\xa8\x7f\x48\x73\x9b\xe8\x97\x80\x55\x67\x68\x9a\xa6\x2a\xdc\x27\x09\x1a\x5b\x63\xe3\xc2\x6b\x82\x68\xb0\x26\xa3\xc1\xfe\xb6\xaf\xf6\x67\x9f\x14\x9f\xfd\x24\x1d\xe3\x9f\xfd\x01\x5a\x7b\xcf\xa4\xb3\x22\x4a\xec\x34\x9d\x74\xa2\xc4\x9a\x2a\xe8\x9c\xf0\x39\x4f\xd1\x29\x97\xcf\xb9\x99\x92\x1a\x95\x33\x6a\xb9\x95\x8a\xfd\xc1\x88\x63\x85\x76\xfb\x2a\x16\x55\x58\xa4\xb8\x38\x49\x58\x24\x3f\x95\xa2\xb6\xda\x26\x28\x14\x81\xcc\x82\xcc\x82\xcc\x82\xcc\x42\xa1\x08\x0a\x45\x08\xf3\x85\x42\x11\x3c\x04\xf0\x10\xc0\x43\x00\x0f\x01\x3c\x04\x2d\xf1\x10\x20\xdb\x03\xd9\x1e\xc8\xf6\x80\x42\x11\x1c\x70\x70\xc0\xf5\x90\x42\x51\x63\x60\x39\x10\x27\x3b\xe4\x79\x33\xaa\x6a\xfc\xdd\x9d\x34\xb9\xb6\xc0\x76\x53\x5e\x63\x8c\xf3\x35\xf6\xc9\x3b\xa3\xef\xdd\xe2\xe0\x74\x73\xb2\x68\xc2\x37\x3e\x85\xaa\x60\xe9\xc3\x8d\x78\xf7\x2e\x1b\x97\xb7\x18\xa3\x9f\xa7\xc7\x68\xae\xc2\xc5\x77\x8c\x8e\xd4\xf4\x5a\x18\xef\x4a\x4c\xa3\x79\x28\x78\x39\x11\xe7\xb5\xba\x24\x4c\x6f\xea\xbd\x21\x4a\x89\xae\x3d\x4d\x53\xbc\x6b\x4f\x52\xf3\xc5\xd1\x45\xe1\x9f\x39\x47\xb3\x8e\x7f\x66\x5d\x05\x2e\x08\x3f\xcd\x1c\x9d\x75\xf9\x69\xd6\x55\x62\xd0\xb7\x17\xe4\xc8\x91\x82\xbf\xb7\x93\xec\xb8\xf9\x39\x55\xd4\xc5\x93\x2d\xe2\xa9\x95\xfb\x53\x84\x20\x12\x04\x91\x9a\xf4\xbf\x1e\xa3\x23\xec\x50\xf4\x80\x6d\xba\xef\x77\xe7\x19\xb9\x3b\x5c\x75\xb2\xd1\x26\xb4\xfa\x7f\x3d\x44\xa7\x84\x96\x92\xc8\xb6\xa9\x94\x52\xe2\xd3\x85\x5a\xe3\x81\xb8\x84\x7d\x74\x88\x7d\x7a\x80\x5e\x2f\xfe\x65\x67\xe5\xbe\xdd\xe4\x1a\xf9\x8c\x52\x56\x32\x25\x29\xe7\x0e\xb2\x91\x6c\x86\x78\xc6\xb8\x2a\xee\x5a\x23\x4e\xd8\xab\xcb\x41\x5e\xc2\xa0\xe3\xbd\xf3\xb8\x63\xd4\x82\x6c\x13\x60\xbd\x28\x4b\x99\x78\x6c\x0f\xbf\x80\x97\xa8\x57\x6d\x9c\xc5\x7f\x9e\x57\xf4\x6e\x4f\x97\x4a\xdd\x10\x16\x7b\x9c\x5b\x6c\x63\x38\x99\xa2\x53\x74\xa2\x89\x99\xd2\x15\xbb\x35\x02\x2d\xf6\x6e\x7f\x8b\x7d\x17\x23\x5e\x31\x1e\xb3\x73\xfd\x4a\xb0\xd9\x3e\xc8\xf6\x9b\x66\xdb\xd3\x9d\x4c\x73\x2d\xea\x52\x9d\xda\x87\x04\x31\x24\x88\xa5\x10\x86\x80\x30\x04\x84\x21\x20\x0c\xa1\x67\xc2\x10\x52\x5d\xe3\x65\x6f\x79\x4d\x9a\x76\xff\xa6\xe0\xfe\x85\xfb\x17\xee\x5f\xb8\x7f\xe1\xfe\xed\xbc\xfb\x77\x13\xf2\x8b\x54\x4f\xbb\xd4\x52\x70\xa9\xb5\xcf\xa5\x96\xea\x7a\x97\xda\x26\xcc\x69\x63\x3f\xfd\x04\x45\x6a\x68\xb7\xdb\xb2\xed\xec\x3d\x4f\xb0\x7f\xdc\x43\xe4\xe8\xfc\x85\xf7\xd4\xd7\x4c\xb2\x14\xfe\xde\x60\x9c\x66\x0b\xfc\xb5\x5a\xdb\x0f\xf2\x48\xa0\x5f\x90\x47\x02\xfd\x02\xfd\x02\xfd\x02\xfd\x5a\x6f\x12\x4e\xd7\xd0\x2f\x24\x3f\x80\x7e\x81\x7e\x81\x7e\x81\x7e\xf5\x34\xfd\x42\x74\x36\x50\x52\xaf\x46\x67\x6f\x4a\x79\xa4\x27\xd7\x26\x87\xe2\x68\x9b\x5b\xb2\xe6\xf3\xca\xba\x62\x59\x45\x50\xd4\xe3\xc1\x41\x51\xfb\xd9\xf8\x1a\x25\xcf\x29\xfa\x17\xdb\x3c\xfc\xcb\xd9\xee\xd5\x42\x5d\xdf\x22\x7e\x69\x1b\xec\x12\x6c\x8a\x87\x9e\x55\x84\x4a\x8f\xd2\xbe\x35\x34\x32\x92\xed\xa1\x84\xd4\x64\x24\xee\x97\xfb\xe8\xa4\xf8\xc2\x8f\xd0\x21\xfe\x85\x8f\xd1\xda\x3a\x9f\xd8\xfd\x20\xc1\x77\x3f\xb0\x83\xe9\xd7\x5c\xc8\x8c\x08\xa0\x3f\x41\x93\xae\x00\xfa\x35\x97\x12\x64\x68\x1a\x33\x24\x3e\xf9\x26\x75\x8d\x4a\x50\x2c\x7e\xec\x37\x47\x3c\x86\x66\xa7\xaf\x0a\x92\x65\x74\x22\x15\xdb\xea\x39\x0a\x48\x9b\x69\x6f\x3d\xb0\x56\xb0\x56\xb0\x56\xb0\xd6\xde\x61\xad\x98\x83\x41\xf0\x08\x82\x47\x10\x3c\x02\xf3\x07\xf3\x07\xf3\x07\xf3\x07\xf3\x87\xe0\x11\x04\x8f\x20\x78\x04\xc1\x23\xb8\xd4\xe0\x52\xbb\x3d\x04\x8f\xda\xe3\x88\x5a\x8b\x8e\x52\xeb\xd5\x29\x7e\x70\x88\x0e\xd6\x88\x16\x77\xcb\x53\x94\xd5\x5c\x69\x55\x96\x8a\x45\x29\x7d\x6d\x95\x4b\x52\xbc\x36\xc8\x7e\x7f\xa0\x7a\xa7\xf8\x7f\xde\x98\x26\xc5\x12\x2f\x6f\xca\x2e\xaf\x45\xf2\x14\xe2\x02\xef\xfe\xf3\x95\xb7\x82\x40\xc5\x3a\x04\x2a\xd2\xc1\x9f\xc0\x69\x76\xb2\xde\x27\x50\xf9\x3a\x20\x56\x81\x70\x7d\x88\x55\xc0\x85\x04\x17\x12\x5c\x48\x3d\xed\x42\x82\x58\x05\xc4\x2a\x80\xee\x81\xee\x81\xee\x81\xee\xbb\x02\xdd\x43\x4a\x02\x52\x12\x9b\x05\x56\x42\x4a\xa2\x1d\x52\x12\xbf\xfc\x14\x1d\x0a\x10\x2c\xb7\x22\x95\xf2\x45\x81\x08\xd3\x39\x49\x59\xd5\xd9\x73\x4f\xb1\x9f\xda\xeb\x48\x95\x1f\xa8\x2f\x2e\xb1\x60\x17\x22\xe8\xd0\xb4\x51\x48\x6c\xd8\xb8\xa8\x52\xbb\xdc\xf7\xd4\x2e\xc7\x79\xd0\x9f\x00\xd0\x82\xfe\x04\x80\x16\x80\x16\x80\x56\x0f\x01\xad\x2e\x0a\xf9\xed\x1a\xa0\x85\x58\x54\x00\x2d\x00\x2d\x00\x2d\x00\x2d\xe8\x4f\x20\x58\xee\xf6\xe1\x4f\x5d\x1f\x2c\xb7\x29\xf5\x27\xae\xd1\x79\x11\x06\x35\x4b\x33\x3c\x0c\xea\x24\x1d\xa7\x89\x9a\x29\xe1\x69\x55\xe3\xf9\xe0\xbe\x8c\xa8\x21\x29\x8a\x35\xed\xbf\x13\x8d\x9a\x21\x4d\xbe\xf7\xf3\xc6\xf8\x05\x68\x5c\x44\x5f\xdc\xee\xc0\xb2\x87\x6c\x25\x0a\x7f\x2e\xb6\xcf\x7f\x57\xbf\xf6\x92\x31\x01\xb2\xe6\x29\x45\xe7\x2a\xc4\x2a\x8e\xd2\xe1\xe6\xde\x08\x72\x26\xa1\x5b\xd1\xa4\x6e\xc5\x73\x21\xba\x20\x74\x27\xce\xd2\x19\x47\x77\x62\x82\x9a\xee\x8c\x62\x53\xc8\xfd\x7c\x53\x48\x47\x82\x62\x3d\x05\xd6\xb2\x35\x34\x27\x6c\x5a\x92\x4e\x73\x9b\xb6\x8e\x7b\x6c\xa0\xd9\x12\xd2\x16\xff\x6d\xc4\x31\x5b\x31\x5f\x5d\x0b\x7f\x13\x76\x48\x9c\x2b\x4c\x98\x23\x71\xd1\x59\x63\x06\xe9\x0b\x60\x5e\x60\x5e\x60\x5e\x60\x5e\x48\x5f\x40\xfa\x02\xd2\x17\x90\xbe\x80\xbb\x01\xee\x06\xb8\x1b\xe0\x6e\x80\xbb\xa1\x25\xee\x06\x48\x5f\x40\xfa\x02\xd2\x17\x90\xbe\x80\x37\x0f\xde\xbc\x96\x4b\x5f\xd4\xc4\xcb\x2d\xd5\xc4\xb0\x08\xf3\x1a\x34\x2a\xda\x46\xa3\x37\xe1\xe6\xa9\xec\x77\x87\x28\x29\xe4\x35\xa4\x82\x22\x3f\x53\x94\xf3\xbc\x87\xfa\x8b\x6c\xa4\x4b\x7a\x51\x5d\xb5\xfa\xa6\xeb\x8d\xb1\xef\x1c\x62\xef\xda\x42\xf7\x79\xca\xb0\x25\x37\xbe\xad\xaf\x31\xcd\x8d\x69\x5e\xbc\xc5\x23\x67\xec\xe2\x5b\xa4\xbd\x71\x88\x5f\x30\xe5\xae\xa2\xa9\xc0\x51\xeb\xc6\x50\xe2\x58\x87\x12\xc7\xdb\x83\xbf\xb2\x0b\x6c\xde\xfc\xca\xfc\x3a\x9f\x25\x49\x53\xe3\xe5\x40\x97\x03\x69\x0c\xd0\xe5\x80\x7f\x0b\xfe\x2d\xf8\xb7\x7a\xda\xbf\x05\x5d\x0e\xe8\x72\xc0\xaf\x00\xbf\x02\xfc\x0a\xf0\x2b\x74\x85\x5f\x01\xba\x1c\xd0\xe5\xd8\x2c\x24\x15\xba\x1c\xed\xd0\xe5\x78\x6e\x88\x86\x04\x55\x74\xa8\x4e\x05\x4b\x54\xf2\x59\x4d\xd6\x75\x59\x67\x7f\x38\xc8\x3e\x37\x40\xcc\x07\x1c\xea\x8d\x71\xc3\x39\x51\x54\x8b\x30\x61\x82\x5f\x70\xa6\x92\x11\x9a\x37\x99\x57\xf4\xe2\xac\xaa\x4d\xe5\x72\x76\x2c\xb0\x0e\x44\x58\x8d\x08\x97\x82\xe9\xdf\x01\x96\x30\xe9\x9f\xf3\xea\x4d\xe6\x67\x36\x76\x35\xe2\x6b\x08\x3d\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x82\x03\x76\x8a\x03\xfe\xc4\x30\xc5\xeb\x6e\xde\x95\xd6\x95\x8c\xa6\x18\x6f\x51\x88\xf6\xbe\x93\xfd\xcf\x21\xf6\xae\xfe\xea\x6d\xbb\x76\x6a\xb2\x94\xa9\x58\x7d\x4e\x2f\xce\xcd\xf0\x8b\x63\x0f\x1a\x47\xbd\xbb\x6a\xd9\x07\x5b\x9b\x94\x9f\x7a\xba\x76\x60\xeb\x19\x41\xd9\x4e\xd2\x71\x4e\xd9\x0e\xd3\x41\xda\x5f\x53\x37\xc1\x6a\x10\xf3\x01\xe3\x76\x7d\x2d\x82\xb6\xcb\x9f\x74\xdd\xc1\x06\xb2\x72\x91\xae\x3f\x11\x0c\xd8\x8e\xb1\x23\x01\x7b\xbd\x89\x3b\x56\x63\xb6\xf0\x17\xb6\x55\xbf\x82\x87\x35\xb9\x90\x93\xd2\x72\xcd\xb7\xf0\x90\x79\x42\x47\x5e\x44\xf2\x1c\xcd\xd2\x4c\x85\xd4\x4b\x53\x0d\x8e\xfc\x60\xc8\xbc\x34\x29\xf3\xf2\x42\x5f\x8b\x3e\x7a\x4a\x09\xb5\x98\x69\x9a\x72\xd4\x62\x9a\x2d\x2b\x88\xcd\xd7\xb6\x2c\x85\x52\xbb\x2d\x4b\xec\x3d\xf7\x54\x5b\x16\x66\x66\xf0\x48\x2e\x63\xb2\x4b\xfc\xd6\x19\x5b\xd2\x1e\xa5\x15\xd8\x95\x00\xbb\x82\x6c\xff\x8e\x64\xfb\x23\xcd\x13\x69\x9e\x48\xf3\x6c\x57\x9a\x67\xea\x67\xfa\xda\xbd\x24\xa0\xc7\x84\xf6\xdb\x0c\x25\x5d\xda\x6f\xeb\x5c\x5f\x44\xfc\x67\x01\xdb\xd9\x56\xd1\x30\x6d\x9e\x08\x24\xbf\x79\x67\xf5\x44\x60\xa8\x20\x69\x45\x85\xfb\x04\xc5\x42\xb4\xe6\x5a\x63\x67\xa1\x7a\x23\xe5\x36\xcc\x0e\x1e\xac\x2c\x68\x94\xdf\x77\x9f\xf1\xe7\xc4\x4e\xf7\xc1\x55\x59\xcb\xca\xee\xa3\x7b\xdd\x47\xf5\xa2\x26\x15\xe5\xac\x92\x1e\xad\x3a\xcf\x53\x8a\xf1\xf7\x2d\xf3\xa8\x51\xcb\xe4\x05\x9a\xa7\x54\xc5\x2a\x67\x82\x8e\x36\x31\x37\x59\xe0\xae\x72\xcc\x49\x02\xe6\x24\x1f\xeb\xa7\x17\xfa\xd9\x47\xfb\xc3\x1f\xb6\x0d\xfb\xb3\xfd\xbd\xb3\xd6\xa9\xf0\x2e\x18\xed\xcc\xbd\xe5\xdc\x03\x66\x74\x4e\x27\x66\x66\xa8\x46\xc7\x1d\xe6\xe3\x93\x08\xae\x90\x72\xfc\x4a\x63\x22\x26\xae\xe6\x67\xf0\x49\x91\x1e\x19\x4a\xe9\x6a\x7e\x41\x04\x8f\x9c\x37\x3e\x0b\xf3\xef\x45\xeb\x63\x71\x7e\x1c\xae\xbd\x08\x4b\xbe\xd2\x47\x2f\xf7\xb1\x97\xfa\xc2\x9f\xb1\xc1\xd8\x47\xfa\x66\x55\x2d\xcd\xe7\x6b\x59\x95\x37\xbb\x1a\x89\xae\x18\x3f\x45\x23\x53\x9e\xa7\xe0\xc8\x53\x4c\xad\x4a\xba\xe3\x26\x1f\x95\xd2\xfc\xc1\x79\xf0\x41\x4e\x49\x9b\x43\xa7\x9c\xcb\xe8\x11\xf5\xa6\xd9\xa6\xc2\x39\x5f\x90\xd5\x42\x4e\x8e\x47\xc4\x1d\x79\xb4\x8f\xf5\x2e\x39\x7a\xf4\x6d\x00\xfb\xf6\xd1\x2d\xbc\x5a\x9e\xc8\x95\xa7\x5b\x35\x6c\x04\x2d\x04\x1f\xf6\x1f\x02\xb6\xb1\x3b\x78\x2d\x1b\x1d\x01\xaa\x6c\x7b\x63\x43\x42\xea\x30\x1d\x64\xfb\xa3\xe3\x76\xba\xf4\x7d\xfc\xa3\x32\xbf\x70\xfb\xbc\xe8\x80\xf1\x73\x5b\x93\xa0\xbf\x7e\xaf\xc0\x94\xf5\xb6\x11\x53\x33\x16\xa2\x1c\xcb\xa9\x59\xf6\x1b\xf7\xb2\x5f\x0f\x39\xda\xa2\xbb\x38\x9e\xcc\xa9\xb6\x81\x72\xc6\xac\x05\x35\x13\x0b\x1b\x87\xab\xf4\x90\xd5\xcc\xbc\x9a\xdd\x4f\x45\xf9\x99\xe2\x58\x21\x27\x29\xf9\x16\xa3\xca\x23\xb5\xe7\x25\x3b\x45\x07\xbb\x8f\xee\xe5\x1d\xec\x75\x74\xe7\x27\xfa\xb6\x91\xd9\x24\x0d\x12\xc8\x33\xc1\x9d\x23\xca\x22\x55\x69\xf4\x6a\xc6\x9b\x34\xff\x81\x3e\xfa\xae\x3e\xf6\xaf\xfa\xc2\xdf\x6e\x7f\xbe\xd7\xac\x30\x2d\xc9\x18\xcb\xf8\x07\x24\x62\x4d\x8a\xaa\xc5\xab\x73\x6a\xb6\x22\x1e\xc0\x6d\x12\x0d\x2b\xcd\xdf\x83\xc6\x6d\x80\x9a\x77\x17\x67\x4e\xf0\x0a\x6a\x26\x1e\xdd\x6e\xff\xec\x9e\xd1\x5d\xa1\xc7\xd9\x62\xf8\x4d\x56\x75\x0e\xce\xaa\xf6\xcc\xd4\x78\xc5\x0e\x32\xb7\xca\xf1\x54\x84\xaf\x69\xe2\xd1\x3b\x56\xf8\x55\x9e\x2f\xfb\x3b\xb7\xd0\xfb\xb6\xb0\xf7\x6c\x09\x3f\xbb\xc5\x2a\xfc\xb7\x07\x94\xbc\x2e\xa7\x4b\x9a\xbc\x78\x43\x29\x5c\x9e\x5f\x5c\x92\x35\x65\xe5\x96\x31\x33\x96\xf3\x99\xca\xc1\x98\x8f\x30\x56\x6c\x9c\x7b\x30\xe6\x41\x52\xda\xaa\x15\xfb\xa5\x64\xb8\x77\x61\xc5\x8e\x49\xe0\xee\x5c\x59\x33\x49\xbe\xfd\x95\x2d\x5b\xb7\xe1\x9f\x4a\x5a\xcd\xe7\x65\x61\xeb\x8a\x6a\x3c\x22\xc6\x02\x6e\x11\x57\xa5\x1b\x62\x2e\x76\xee\xf2\xe5\x85\x45\xfb\x44\x35\x1f\x59\x96\x8b\x37\x65\xf3\xa3\x73\x6a\x66\x2d\x1e\xec\xf2\xcd\x67\x34\xc7\x17\x61\x70\xbd\x97\xa4\xa5\xbc\xf1\x20\x65\xfe\xf8\x76\x5b\xf3\xd0\x08\x51\x3b\xe1\x4e\xe5\x0f\x62\xd8\x09\x7b\x0d\xa8\xc9\x52\x2e\x62\xf4\xc3\x9c\x5c\x8c\x47\xac\x88\x2d\xf3\x07\xf3\xb1\x78\x00\x99\x70\x77\xb9\x6e\x60\xdf\x7c\x50\x8f\x5c\x9e\x5f\x8c\xa4\x35\x99\x3b\xb8\xa5\x9c\x3e\xe2\x89\x81\x33\xea\x6b\xf9\xf2\xad\x07\x37\x1d\x2d\xee\xbb\x1b\x37\x2b\x97\x72\x79\x59\xe3\xa3\x31\x5f\xde\xaf\x4a\x79\x7b\x95\xa5\x64\x32\x39\x39\x22\x15\x8b\x52\xfa\x46\x64\x48\x8e\x67\xe3\xc6\xdc\x47\xfc\xdb\x68\x01\xfb\x6d\xf2\xd0\x4d\x1e\xcf\x67\x4e\x29\x4a\x52\xce\x69\x8e\xb4\xba\xea\x89\xd7\x72\x57\x61\x38\x1e\xdd\x59\xaf\x43\x79\xba\xe3\xbb\x42\xf4\x8f\x7d\xec\xeb\x7d\xe1\xaf\xda\x9f\xde\xef\xf7\xcd\xad\x88\x45\x26\x8f\x25\xb1\xa3\x62\x96\x6f\x15\xad\x88\x18\x29\x53\x19\x07\x69\xb3\x19\xee\x74\x94\x8a\xe6\x44\x47\xd8\x43\x6e\x88\xad\xf7\x2e\xdd\xe2\xcf\x97\x51\xf4\x42\x4e\xba\xc5\xbd\xb4\xab\x05\xbe\xac\xe3\x2b\xcf\x48\x4e\xc9\xf3\xbe\x99\x53\xb3\x59\xc5\x9a\xec\xb8\x82\x55\xf4\x9c\x92\xbd\x56\xcc\xdd\x12\x01\x12\xaa\xe6\xfc\xe0\xcc\x9b\xbc\xe6\x97\x7b\xe7\xe2\x51\x11\xf3\x93\x34\x9e\xc2\xe3\x55\x1b\xa7\x38\x1b\x89\xc6\xec\x31\xe8\x6e\xf7\x18\xb4\xa0\x66\xaa\x47\x9f\xcd\x27\xf2\x91\x5a\xa6\xa7\xd9\x53\xe1\x27\xac\x02\x4f\x5c\x12\x8d\x69\x07\xe8\x59\xef\xcd\x8c\xe8\x14\x66\xb2\xda\xc2\x9a\x86\x6d\x9b\x75\x9d\xa7\x2f\xfd\x56\x88\x3e\x1b\x62\xbf\x11\x0a\xff\xba\x0b\x32\x4d\x45\x34\x39\x27\xf0\x1b\x8f\x2a\xf0\xc7\x79\xe9\x92\xa6\xf1\x30\x0a\xc5\xfa\xac\x1d\x6b\x7f\x4d\xbd\x69\xd6\xc4\x4b\xe2\x0a\x86\x35\xc8\xc8\xba\x13\xb1\x20\x19\x96\x98\x47\x28\xf0\x28\x3c\x1e\x4d\x62\x0c\x09\xc6\xd5\x11\xdd\x8c\xd3\xe5\xe6\xda\x0c\xd3\xb3\x96\x03\x76\x08\x43\x35\xec\xb3\x58\x40\xa9\x58\xd2\xe4\x11\x11\xdc\x9a\xd5\x7d\xae\xbc\x68\xdc\x49\x15\x7d\x97\xdf\xcb\xe4\x70\xbc\x8b\x1a\xff\xbe\x6c\x54\xd1\x62\x38\x36\xd9\x8b\xde\xe5\x3e\xd9\xd3\x31\x5f\xea\xa3\xcf\xf4\xb1\x5f\xed\x0b\xff\xb2\xfd\x6d\xfe\x68\x8d\x6f\x33\xc7\x1d\xfd\xf6\x37\x69\xd8\x5b\xb3\x03\xf3\xda\x9a\xcd\xc8\x1f\xcf\x03\x16\x47\xc4\x71\x1e\x8d\x7e\x4d\xbd\x99\x77\x8a\xe0\x91\x39\x6e\x3f\xb6\xdd\x2b\xac\xe7\xf1\x7b\xbe\xe8\xf6\xa2\xa4\xe4\xe6\x8d\xda\x78\x1e\xe5\x87\xfa\xe8\x07\xfa\xd8\xf7\xf7\x85\xbf\xc7\x7e\x94\xb7\x9b\x00\x70\x24\x22\x65\x32\x86\x11\xbc\x34\x3b\x7d\xe0\xc0\x81\x63\x46\x79\xe6\x9f\x17\xa4\xbc\xca\xdf\xac\x5e\x94\x56\x0b\x56\x70\xca\xb2\x9c\x55\xf2\x79\x73\x25\x28\x8b\x28\x1a\xc7\x66\xd8\xd6\xc6\xa7\xdb\x92\x5d\x96\xa7\xe3\xb2\xe7\x07\xe9\x11\x4b\x01\xa7\xa0\x1b\x53\x40\xe3\x69\x35\x35\x97\x93\x35\xa3\xa3\xf3\xf8\x02\xf6\xf5\xbd\xec\x7f\xf4\xd3\x56\xe3\x14\x63\xbe\x37\x5e\x7f\xbf\xd8\x69\xbb\x84\x4b\x66\x09\xb1\x11\xe3\x8a\xa9\x42\x41\x5f\x4a\x54\x1f\xdd\x6c\x19\x25\xb2\xf0\x57\x8d\x73\x7f\x95\x31\x81\x9c\xa4\x63\x74\xa4\xe6\x0a\xc5\x68\xb5\x78\x39\x11\xaf\x7e\xf0\x86\x36\x3d\x59\x53\x2e\x89\x71\x2f\x6b\xa9\x51\x75\xbb\x35\xed\x79\x82\x34\x12\xa4\x91\x20\x8d\x04\x69\x24\x48\x23\x41\x1a\x09\xd2\x48\x90\x46\x82\x34\x12\xa4\x91\x20\x8d\x04\x69\x24\x48\x23\x41\x1a\x09\xd2\x48\x90\x46\x82\x34\x92\x4e\xa5\x91\x7c\x7b\x8c\xa6\x04\xa2\x4b\xab\xaa\x96\xe1\x2e\x06\x35\xef\xe4\x92\xd4\x72\xda\xf2\xb0\x46\x3b\xb3\xe4\x57\x86\xd9\xd7\x43\x74\xb7\xbb\x88\xab\xe5\x44\xf8\x7e\x9f\xcc\x92\x79\xe3\xc2\xd8\x23\xc2\x6b\xeb\x9c\xee\xf6\xde\xf2\x53\x5a\xec\xb0\x7d\xa2\xb6\xc3\x76\x4a\xf0\xb6\x09\x3a\xca\x79\xdb\x7e\x1a\xa7\x78\x9d\x3d\x39\x5d\xad\x54\x4e\xc4\x79\x5d\x1b\xf4\xea\xbe\x39\x18\xb6\x1d\x62\x07\x04\x60\xe3\xe5\x7a\x98\x9a\x09\xe1\x7c\x5e\x13\x85\x7f\x73\x5b\x75\xe3\x3f\xe8\x9f\x53\x22\xda\xff\x51\xf3\x60\x07\x5f\x41\x72\x86\x92\x74\xba\x22\xde\x6a\xcd\x4d\x8d\x28\x2b\x64\x94\x34\x99\x51\xf2\x13\x7d\x34\x2b\x52\x41\x4e\xd1\x09\x27\x15\xa4\x89\xef\x7d\x63\x6d\x09\xcf\x24\x69\xcc\x96\xd4\xb1\x19\xb5\xcc\x4c\xec\x7b\xee\xa9\xb6\x25\xaf\xb7\xb3\x48\x84\xf9\xd8\x6d\xed\xe1\xdb\x39\xeb\x81\x3c\x12\xe4\x91\x20\x8f\x04\x79\x24\xc8\x23\x41\x1e\xc9\x9a\xf3\x48\x3e\x5d\x27\x8f\xa4\xa5\x7b\x26\xd1\x25\x91\x4e\xf2\x18\xcd\xb9\xd2\x49\x5a\xb3\x0f\x53\x63\x43\x7e\x83\x4b\x06\xf7\xf0\x1f\x9c\xaf\x92\xfc\xda\x9d\xd5\x93\x82\x47\x03\x32\x4a\xc4\x54\x21\xca\xe3\x9d\x3b\x34\x53\x40\x4e\x49\xaf\xcd\x4f\x90\x53\x82\x9c\x92\x0d\xce\x29\x79\xa2\x05\xab\xbe\xc0\x40\xad\xb6\xad\xf7\x02\x33\x55\x52\xfb\x69\x9c\xc5\xa3\x23\x76\x54\xee\x0e\x77\x1c\x2f\x2f\xf0\x76\x88\xe4\x65\x3f\x3b\x68\x09\x6b\x67\x14\x3d\xad\x96\x0d\xab\xec\x60\x50\x39\x9f\x29\xa8\x4a\xbe\xa8\xe7\x94\xb4\xac\xb3\x6f\x1d\x64\x7f\xdf\x4f\x77\xd9\x67\x1a\xe3\xe1\xbe\xfa\x81\x8b\x67\xcc\x12\x16\x8d\x12\x44\xcc\xe2\x8c\x75\xf9\x52\xc2\x73\xf4\x36\x8f\x59\x74\xda\xb7\x9c\x88\x7b\x1e\xbc\xa1\x98\xc5\x80\xd8\xc2\xeb\x4f\x06\x7f\x2a\x13\xec\xa8\xf9\xa9\x54\xbe\x6b\xf3\x3b\xf1\xd4\xca\x9b\x54\x83\xd0\x45\x84\x2e\x22\x74\x11\xa1\x8b\x08\x5d\x44\xe8\x22\x42\x17\x11\xba\x88\xd0\x45\x84\x2e\x22\x74\x11\xa1\x8b\x08\x5d\x44\xe8\x22\x42\x17\x11\xba\x88\xd0\xc5\x0e\x85\x2e\x7e\x6e\xc8\x0a\x5d\xd4\x96\xa5\x74\xdc\x02\x45\x15\x01\x8c\xee\x8d\xf1\xd2\xb9\x92\x5e\x34\x56\x2f\x39\x79\x59\xc9\x67\x94\x7c\x56\x67\xef\x19\x62\x5f\x1f\xa0\x07\x8c\x22\xa6\xdc\x25\xd8\xc2\x69\xff\xa2\xb1\x9d\xf2\xa6\x45\xd9\x97\xd4\x9c\x9c\x14\x65\xb7\x68\xd3\xbc\x03\xfc\x82\x4b\x95\xf5\xb3\x84\xd9\xaa\x6e\x3b\xaf\xe8\xc5\x6e\x07\x86\x1b\xb1\x6d\x5e\x23\xdb\xdb\x5d\x2f\x04\xb3\xc3\xf3\xec\x31\x33\x07\xba\xaa\xe9\xab\xa5\xf8\x4c\xca\x58\xb3\x83\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x02\x27\x76\x0c\x27\x7e\x36\x44\x77\xba\xc4\x0a\xd9\x2f\x84\xd8\xa7\x42\x34\x60\xfc\x23\x1c\xce\xf2\x44\x8c\x15\x55\x5b\xb5\xdb\x4c\x12\xfa\xcb\xb1\xbb\xb3\x32\x17\x1f\x9c\x5a\x98\x3b\x6b\xfc\xd0\xba\x68\xf6\xaa\x82\x26\xaa\x0a\x9a\x68\xa4\xa0\x94\x42\x17\x04\x6e\x3b\x4b\x67\x38\x6e\x3b\x45\x27\x68\xb2\x09\xdc\x66\x3d\x63\x10\x6c\x63\xff\xb8\x97\xc2\x5e\xe5\x47\xbd\x28\x15\xe5\x95\x52\xce\xb0\x78\xec\xd5\xbd\xec\x77\x5c\x92\x8f\xc3\xf5\x23\x27\x17\xcd\x4b\x17\xe5\x62\x6c\x8f\xa3\xf5\xe8\xfa\x79\xb3\x05\x4c\x3e\x45\xd3\xe2\x85\x1c\xa7\x09\xfe\x42\x0e\xd2\x7e\x1a\x0f\x14\x79\x74\x3d\x71\x43\x91\x92\x17\x83\x69\xe6\x08\x8b\xf9\x64\x8c\xb8\x94\x1e\x5d\xf7\x84\xac\x23\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x26\x60\x66\xd7\xc0\xcc\x6f\x84\xe8\x21\x93\xbf\xf9\x87\x45\x8e\xb1\x3f\x0a\xb1\x3f\x08\xd1\x3d\x52\x45\xd0\x63\xf8\x8d\x59\xb9\xe8\x1d\x6b\xc5\x53\xc4\x1e\xca\xca\xc5\x8a\x10\xc4\xa9\x85\x39\x6b\x75\xd7\x3a\xe6\xd6\x3a\xee\x59\x9b\x53\xd2\xe3\x82\xbf\x5d\xa0\x79\xce\xdf\x66\x69\x86\x92\xcd\x01\x51\xab\x01\xe6\x15\xbd\x68\xe1\xcf\x1f\xbc\x8b\x2e\xd4\x6f\xfe\x5a\xb2\x9a\x6a\x5a\xca\xe9\x25\x3e\x4e\x48\xe9\xb4\xac\xeb\xc6\x5a\x4e\xbe\xa9\xb3\xdf\xb8\x33\xfa\x85\x2d\x3e\xaf\xeb\x11\x31\x98\x47\xa4\xc8\xbc\x71\xed\xa2\xb8\x76\x8a\x5f\x7b\x89\x5f\x1b\x3b\x22\x4e\xa9\x78\x77\x2e\x11\x96\x1a\x17\xb6\x58\xc1\xed\xcd\xb4\x44\x97\x2b\xb4\x51\xea\xb4\x7a\x45\xbc\x64\x39\x11\xaf\x55\xcf\xd4\x47\x43\xf4\x36\xa1\xbb\x73\x99\x2e\xb9\x74\x77\xea\xbe\xd5\xc6\xcb\x6f\x4d\x2f\x5a\xc3\xfd\xde\x2a\x64\x0a\x17\xe9\x4d\x8e\x4c\x61\x8b\xca\x0e\x4e\xa2\x2f\xa8\x7a\x91\xae\xe7\x82\xd1\xf1\x1c\x3b\x6b\xe1\x62\xbf\xc8\x56\x53\x70\xa2\xd6\x33\x7a\x72\xea\x21\x73\x53\x5f\xe6\x26\x05\x51\xcf\x1a\xa2\x9e\x9b\x50\x68\xe4\x2f\xef\xa7\xc4\x1a\xb6\xc4\xd5\xb9\x08\x18\xfb\xe4\xfd\xec\x8f\x5c\xbb\xe2\x8a\xcd\x22\xc5\x31\xff\x8d\x71\x77\xd5\xd8\x18\x57\x88\x8a\xb5\x58\x5e\xf9\x12\x1d\x11\xa6\x70\x9c\xe2\xdc\x14\x0e\xd1\x5e\x7a\xb4\x8e\x06\x8e\x26\x73\x91\x2b\x35\x13\xe8\xc4\x6a\xcd\x5e\xb8\x01\xda\xcc\xe1\xef\xdb\xe6\xb4\xed\x6e\x4b\x39\xb9\x5e\xf3\x46\x6c\x05\xe5\x8e\xb4\x70\x72\x82\x8e\xd2\xe1\x8a\xd1\xb3\xc1\x26\x86\x8a\x18\x34\x93\x9b\x34\xaf\x1f\xe8\x6b\xfe\xc3\x3e\x2e\x66\x31\x87\xe8\x80\x33\x8b\x69\x9d\x59\xf8\xff\xd9\x7b\xfb\xf0\x48\xae\xea\x4e\xf8\xe9\x1e\x8d\x67\xe6\x8e\x8d\xed\xb2\xbd\x60\xf9\xab\x5c\xb6\x47\x52\x5b\x2a\x8d\xc6\x63\xcf\x8c\xc6\xe3\x19\xb5\xa4\xb1\x25\xcf\x87\x90\xc6\x33\xc6\x9f\x53\xea\xbe\x6a\x95\xa7\x55\xd5\x54\x55\x4b\x96\x79\x78\x93\xd8\xcb\x86\xcd\x42\x42\x42\x48\x88\xe1\xe5\x21\xd9\x7c\x60\x42\x80\xb0\x79\xd9\x24\x04\x42\x36\x21\x7c\x98\x38\x80\xb3\x21\x09\x24\x01\x16\x36\x21\xe4\xcd\x1b\x92\x6c\x02\x24\xbb\xbc\xcf\x3d\xf7\xa3\x6e\xf5\xb7\xa4\x6e\x49\x33\x3a\xfc\x61\x34\x5d\x55\xb7\x6e\x9d\xba\x75\xee\x39\xbf\x73\xce\xef\x34\xe1\x47\x6e\x8f\xd6\xc8\xfe\xc9\xee\x58\x2d\xf4\x57\xf1\x1d\x36\xd2\x0f\x37\x0b\xde\xc3\x8e\x6b\x07\xe4\x3c\xdc\x6a\xda\x0a\x39\x0f\x91\xf3\x70\x83\x39\x0f\x37\xbf\xbd\xd7\x94\xd6\x70\x2b\xb4\x27\x37\x9e\xeb\x53\x40\x54\x7e\xc1\x85\x3c\xa2\x80\x16\x5c\xd0\xf5\x75\xcb\xa4\x17\xca\x11\x34\x9a\x5f\xa2\xb3\xf3\xbe\x7f\x21\x91\x06\x12\x1a\x1f\xec\x35\x7e\x7e\x3b\xb9\xa9\xe6\x78\xaa\x68\xfa\x8d\xa9\xd6\xaa\xa6\x4f\x8a\x5b\x9d\xe3\xb7\x1a\xd5\x6f\xd5\xa6\xfa\xe9\x11\xb8\x60\xa4\xd6\x74\x45\x0d\x75\xa3\x49\x60\x35\x75\xed\xaf\xf4\xf5\xcd\xbf\xd2\x47\x8c\x87\x25\x3e\xd4\x60\xed\x89\xef\xb7\xd1\x3b\xa8\x2e\xab\x6e\xa9\x98\x1b\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\x31\x1b\x11\xb3\x11\xd7\x2b\x1b\xf1\xc7\xba\x25\x53\xe3\x2c\x00\x8c\x12\x6e\xac\x93\xfd\x90\x0b\x7c\xef\x29\x7f\xb6\x32\x03\xe2\xd3\xd7\x1b\xcf\x6d\x23\x57\xc0\x10\x0a\x68\xbc\xbd\x61\x1e\xc4\x68\xe0\x7b\x93\xfe\x6c\xa6\x87\x9d\x95\x65\x17\x0a\xc8\x2f\x8e\xc8\x89\x53\x3a\x92\x15\xd1\xae\xa6\xd3\xf0\xc8\xb6\x78\x64\x5b\xcc\xb8\xc5\xa6\xd3\xaf\x6e\x0e\xd4\xd9\x46\xbf\x00\xea\xe0\x46\x02\x91\x13\xb7\xa9\x06\xdf\xba\xbf\xb0\xb3\xf2\x2d\xf4\x34\xcb\x98\x90\x2f\x22\x23\x4e\x5c\xf7\x77\xb1\xe2\xee\xd3\x35\x65\x8e\xb1\x49\xcc\xa4\x58\x7d\xf7\xe9\xb5\x7f\xf3\xab\x68\x60\x5d\x7b\x9c\x35\x66\x57\xb4\xa6\x54\x9a\xe8\x91\x84\xce\xc9\x3e\x7b\x79\xa5\x52\xd9\xdb\x72\xbe\x85\xd4\x2e\xbd\x10\xda\x5b\x57\xdd\x82\xd9\x17\x5b\x4d\xc3\x61\xf6\x05\x66\x5f\x6c\x78\xc7\xc9\x75\xb0\x2b\x9b\x25\x50\x74\xc0\xb2\x9c\xdc\x4f\xf6\x19\x7b\x2d\x5b\x65\x58\x5c\xa3\xe7\x64\x88\xcb\x2e\x89\xbc\x8c\xff\xd3\x43\xfa\xb8\x47\x54\xa3\x57\xe7\xe0\xa2\xcc\xc4\x80\xa6\xef\xa1\xf1\xb9\x1e\xe3\xf7\xba\xaa\x1b\x30\xbf\xb6\xb5\x1c\x0b\x68\xd1\xd9\xa6\x64\x8a\xfe\x25\xa7\xaa\x9b\x33\x8c\x7f\xc2\x0d\x2f\x3a\x16\xa6\x8d\xc8\x9b\xe8\x5c\x1f\x57\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xc0\x94\x08\x4c\x89\xd8\x4c\x29\x11\x3f\x94\x91\x85\x59\x1e\x8d\x96\xfc\xe0\x02\xb3\xd6\x2a\xe1\xbf\x3a\xf9\x11\xe2\x8a\x92\x5f\x74\x73\xae\x3c\xf6\x7a\xe3\xfd\x7d\xc6\xbf\xdf\x4e\xae\x88\xc7\x7b\x72\x71\xa8\xfb\xd7\x44\x21\x96\x8e\x0c\x7a\x52\xcf\x49\x82\xf5\x53\xfc\x92\x29\x36\xe0\x72\x5b\x90\xc2\xfe\xd8\xb2\x01\xeb\x4d\xec\x83\xcc\x38\x8a\x4d\xb6\x9e\x84\x95\xac\x8d\x6d\x67\x7a\xe1\x76\xa7\xd4\xa3\xe8\x35\xd4\x89\xd9\x22\xc6\x58\x8d\x31\xd6\x47\xee\x97\x38\x72\xff\x44\x73\x10\xf2\xb0\x71\x88\x23\x8d\x09\x69\x93\x1a\x5c\xf1\x55\xeb\x17\x51\x46\x44\x19\x11\x65\x44\x94\x11\x51\x46\x44\x19\x11\x65\x44\x94\x11\x51\x46\x44\x19\x11\x65\x44\x94\x11\x51\xc6\xf5\x46\x19\x87\xc9\x41\xe3\x1e\x6b\xbf\x4a\x8c\xba\x5e\x4f\xa7\x4a\x38\x76\x97\x42\x52\x15\x62\xa0\x88\x81\x22\x06\x7a\x11\x61\xa0\xef\xea\x21\xbd\x1c\x03\x0d\x66\x9d\x9c\x5d\x8f\x2a\x3d\xf0\x8b\x34\x34\xbe\xbd\xc7\xf8\xc6\x36\x72\x2d\x3b\x73\xa4\x92\x03\xdd\x6a\xdc\x3f\x72\xda\x2f\xd2\xcc\x9d\xec\x9c\xe9\xca\xab\xcf\x0e\xb1\x83\x17\x5b\xe2\xe2\x39\xce\xad\xb9\x17\xb8\x35\xd3\xa7\x1f\x34\x06\xc8\x9d\xa4\xaf\x6e\x9a\x2f\x48\x77\x71\xc8\x66\x8f\xda\x52\xdf\xc8\xc7\x9b\xe3\x83\xc3\xc6\x41\x8e\x0f\xb2\x41\x6b\xc1\x82\x75\x5f\x29\x76\x91\x44\xf8\x10\xe1\x43\x84\x0f\x11\x3e\x44\xf8\x10\xe1\x43\x84\x0f\x11\x3e\x44\xf8\x10\xe1\x43\x84\x0f\x11\x3e\xdc\x6c\xf0\x21\x02\x74\x08\xd0\x21\x40\xb7\x85\x01\xba\xf7\xf5\x92\xbb\x5b\x00\xe8\x78\xb2\x62\xe0\x17\xe9\xac\xeb\xe5\x5d\xaf\x10\x1a\xff\xd0\x63\xfc\xcf\xae\x3a\x68\xdd\x52\x6b\x65\xcb\xd3\x7e\x91\x66\xf9\x78\x6d\x2a\x5e\x3e\x00\x17\xd4\xc1\x00\xc5\xad\xb0\x8e\xb9\xb5\x1c\xc3\x56\xaa\x8d\x9f\xca\x37\xc7\x11\x47\x8c\xa3\x4d\x01\xc3\x18\x68\x14\x2f\x29\xd9\x3c\x10\xe1\x42\x84\x0b\x11\x2e\x44\xb8\x10\xe1\x42\x84\x0b\x11\x2e\x44\xb8\x10\xe1\x42\x84\x0b\x11\x2e\x44\xb8\x10\xe1\x42\x84\x0b\x11\x2e\x44\xb8\x10\xe1\xc2\x75\x82\x0b\xff\xb6\x97\xd8\x4d\x1a\xdb\xb3\x0f\xce\xcd\xc5\x35\xcb\xbf\xd1\x9b\xe8\x6a\xdf\x0d\x6c\xee\x49\xaf\x73\x86\x5f\x92\xb9\xa1\x56\x3f\x7b\x71\xb0\xcd\xbc\xed\x67\xc9\x61\x0e\xa8\xed\x27\xfb\x00\x50\xeb\x27\x19\xd2\xdb\xb4\xbb\xa9\x98\xcc\x1a\xc8\x95\x81\xb1\x7d\xa2\x39\x6a\xb6\xc7\xb8\xbd\xb2\x01\xaa\xbc\xb9\x0e\x8d\x75\xbf\x53\xeb\x6a\x7f\x93\xe4\x68\xaf\x2d\xde\x9b\xeb\xf4\xb3\xef\x88\x84\xb3\xf7\x91\x7b\xc9\x70\x05\x6b\xf1\x0a\x44\x8c\x2c\xc5\xc8\xc3\xbe\x4a\x1e\xf6\xb7\xa7\xc8\x31\x4e\xa2\x7e\x88\x1c\x88\x49\xd4\xdb\xf3\x85\xaf\x49\x6f\xb4\xc8\xbd\xde\x3e\xf5\x90\xf9\x97\x2b\x63\xf5\x70\x15\xb7\xc4\x4d\x47\x69\x84\x9b\xf8\x2f\xeb\xa3\x10\xce\x90\x69\x32\xa5\x2b\x84\x4c\x96\x1c\x5b\x45\x08\x63\x0c\xe6\x7c\x1a\xb0\xde\x10\xd5\x44\x33\x35\xf1\xf5\x34\xf9\x6a\xda\xf8\x8b\x74\xf7\x97\x94\x80\x7e\x35\x7d\x46\xb7\x6d\x5c\x66\x62\x83\x7d\x62\xce\xd2\x39\x1e\xe7\x50\x4e\x45\x0c\xa6\x0b\x3f\x0e\xa6\xa8\xa9\x01\xcf\xf7\x06\x3c\x5a\x70\x40\x10\xc2\xbc\xd1\xd5\x05\x87\x17\xd4\x2b\x10\x6b\xd0\x5d\x58\xa0\x79\xa6\x90\x8a\xcb\x71\x00\x22\x06\x9d\xdd\x62\xbf\xb0\x7a\xc0\xee\x33\x0b\x01\xdb\xd6\x4a\x34\x70\xfd\xbc\xb2\xde\xe2\x1d\x0e\x62\x3b\x52\x1a\xe5\x90\x4d\x52\xb7\x18\x1d\x76\xa5\x7c\x20\x71\x93\x39\xee\x68\xcb\x21\x6c\x3e\x4f\xce\x02\x5e\x63\x8e\x96\x01\x53\x98\x82\x19\xd4\xb0\xe6\xb2\x9f\x4f\x93\x97\xd2\xc6\x8b\xe9\xee\x4f\x29\x31\xbf\x3b\x3d\xa6\xc5\x34\x4b\xc0\xf4\xac\x50\x91\xa9\xc0\x2f\x39\x05\x78\x01\xbc\x3e\x2b\x11\x18\x91\xcf\x12\x07\x45\xd9\x5b\x1a\xb2\x0f\xd8\xe6\x0c\x7f\x21\x5c\x3a\x25\x66\xcc\x33\x87\x48\x02\x6c\xd4\xf4\x83\xd2\xbc\xe3\xc9\x40\x4d\x50\xa6\x83\x73\x4e\x51\x02\xd2\x16\x3f\x6a\x99\x73\xae\xe7\x14\xdd\x67\x24\xb2\x35\x4b\x99\xb5\x08\xee\xc3\x20\xb7\x12\xf3\x31\xda\xc9\x07\xef\x09\xe3\x8b\x38\x04\x6c\x9b\xe3\x2e\x2c\x67\x6d\xe2\x7e\x50\xfd\x64\xb1\x2b\x16\x71\x04\x1a\x3e\x36\x3f\x9a\xb7\xad\xab\xf8\x7c\xc6\xe4\x83\x24\x22\x3e\xd9\x37\x76\x91\x37\x74\x19\xcf\x76\x75\x7f\x5f\x85\xfd\xbe\xb8\xed\x9c\x80\x88\xd8\x27\xc5\x7c\xa1\x82\x13\xcc\x3a\x05\x6a\xe6\xfc\x62\x91\x82\x1e\x8d\xbf\x0b\x1a\xcc\xf9\xc1\x02\x93\x45\xcd\x99\x9e\xae\xb8\x79\xfd\x89\xc2\x7a\x96\x8b\xb1\xc4\x9f\xca\x65\x0b\x25\xe7\xe6\x63\xac\x17\x60\x43\xce\x12\x2f\xa5\xcb\xbc\x23\x01\xaa\x49\x60\xd0\xd6\xc4\x28\x21\x25\xe5\xff\xa8\x60\x5f\xf2\x66\xb6\x39\x92\x63\xae\x12\xec\x9d\xba\x72\xe8\xe1\xcf\xd0\x63\x0e\x88\x17\x9f\x5c\x18\xe1\x61\xb3\x27\xeb\xe4\x2e\xb0\xbd\xc2\xcb\xb3\xb3\x20\xca\x06\x27\x55\x08\x8e\xe3\xb8\x62\xe9\x27\x07\x91\x4f\x30\xab\x46\x3a\x6c\xf6\x1c\xf7\x03\xaa\x0d\x6b\xe6\x9c\x30\xe7\xe4\xd9\xd3\x0b\xf9\xf0\xb8\x2a\x8c\x17\x72\xed\x55\x35\xe0\x9c\x1a\xc3\xb6\xae\x2e\x55\xae\x1b\x7d\x4f\xff\x48\xaa\xfe\x8e\x7c\x82\xef\xc8\xe3\x64\x14\x76\xe4\x23\xe4\x30\x39\xb4\x8a\x7d\x85\xf7\x0d\x21\xd3\x6c\xb4\x7d\xc6\x83\x64\x82\xec\xe4\x42\xa7\xf9\x35\x8e\x29\xb7\xfd\xf6\xed\xeb\x4f\x99\xb5\x2d\x88\x5d\xc6\x0e\x2e\x71\x92\xfd\x93\xdd\xf1\xce\xbf\xa7\xaa\xcf\x4a\x6d\x0f\xe1\xc6\x12\xe7\x7e\xef\xb0\x39\x80\x1d\x55\xb6\x9a\x11\x82\x1d\x55\xb0\xa3\xca\x06\x77\x54\xe9\x30\xe2\xd3\x46\xdd\xde\xac\x2d\x4b\xe3\x1e\x2a\x62\xc8\x4b\xa1\xdc\xdf\xf8\x0f\x4f\x92\xbd\x3c\x3b\xd1\x29\xb9\x01\x2d\xb8\xa0\xf1\x13\xa9\x89\xbc\xcd\xa4\x48\x2f\x72\x73\x34\x34\x3e\xff\x84\xf1\xf2\x1e\xf2\xca\x8a\x2b\x54\xcf\xb1\xde\xc6\x95\xc4\x23\x53\x13\x72\x37\xbc\x9d\x9d\x39\x92\x1c\x46\x34\x1d\x8b\xcf\xda\xe4\x99\x83\x59\x4c\x9d\xc3\xd4\xb9\x2c\xa6\xce\x61\xea\x1c\xa6\xce\x61\xea\xdc\x96\x49\x9d\xcb\x6e\x9a\xd4\xb9\xb6\xcf\x64\xd5\xa9\x73\x59\x4c\x9d\xc3\xd4\x39\x4c\x9d\xc3\xd4\x39\x4c\x9d\x5b\xff\xd4\xb9\xec\x96\xce\x74\xcb\x62\xa6\x5b\xe7\x32\xdd\xb2\x9b\x3d\xd3\x2d\x7b\x11\x66\xba\x4d\x3e\x9b\x22\x05\x8e\x17\x9e\x27\x4f\x00\x5e\xf8\x30\x39\x4b\xce\xd4\xc4\x0b\xd9\x42\x18\x70\x0a\x05\x26\xad\xc8\x0f\xe2\x28\x41\x25\x6a\x25\xfb\x30\xc7\xf0\x51\x4b\x64\x6d\x4d\xd8\xd4\x9e\xa2\xcd\xb1\xc7\xac\x71\x4c\x60\x8f\xb5\x91\xb4\xea\x4e\xcd\x1c\xa0\x8c\x67\x4a\xac\x5f\x26\xf5\x51\xb5\x6b\xf9\x06\x66\x3a\x9e\x8e\xa0\xed\xe1\xbf\xae\x1b\x86\xc6\x21\xaf\x39\x92\x27\xb3\x15\xd1\x9d\x69\x32\xd5\xee\x57\x87\x51\x1f\xcc\x50\x5b\x65\x86\xda\xcb\xe9\xfa\xd1\xec\x1c\xd7\x3a\x8f\x91\x47\x40\xeb\x40\xd6\x54\xbb\x97\x2e\x99\xe7\xf9\x71\x0e\x79\x32\xce\x8f\xeb\xcc\x9d\x5c\x1e\x4e\x9f\x25\xe7\xb5\x70\x7a\x47\x6e\x25\xb5\x65\x6b\xda\xb0\xb9\xbe\x6b\xac\x2f\x1b\x28\xe5\x92\x1f\x46\x24\xf3\xdd\xfe\xfa\xda\xf2\x16\x91\x66\xa1\xe5\xac\xf8\x73\xba\xe2\xdc\xcb\x4f\xa8\xad\x38\x47\xd5\x55\x1d\x53\xa1\x9d\xc9\xd5\x43\x18\x1a\x61\x68\x84\xa1\x11\x86\xde\x3a\x30\x34\x9a\x88\x4d\x4c\xc4\xcd\x83\xd3\x63\x9e\xf4\xba\xe4\x49\x63\x38\x04\xc3\x21\x18\x0e\xc1\x70\x08\x86\x43\xb6\x74\x38\x04\xcb\x65\xb0\x5c\x06\xcb\x65\x3a\x55\x2e\x83\xd1\x46\x8c\x36\x6e\xd5\x68\xe3\x64\xa1\xcd\x05\x61\xcd\xa2\x73\x99\xda\x40\xf0\x35\xc6\xd5\xfc\x6b\x8e\x35\xed\x7a\x45\xea\xda\x9f\x88\xff\xce\x3e\x72\x98\x27\xe2\xf3\xbc\x70\x8d\x1a\xb8\x0e\x0d\x08\x3f\x4f\x92\x80\x7c\xb9\xd7\xf8\x5a\x9a\xec\xe2\x3f\x3e\xb9\x38\xd4\xfd\xaa\x1a\x34\x20\x40\x4b\xcb\x49\x40\xe0\xcf\x50\x2f\x42\x83\x5f\x36\x96\x04\x44\x3c\xfa\xe2\x90\xdd\x1a\x81\xee\x74\xf3\x97\x3d\x68\x0c\x88\x97\x9d\x90\xab\x78\xa5\xfc\x36\x89\xda\x90\xc6\xc4\x22\xdd\xbf\xb0\x53\x17\xf2\x0d\xb5\xf9\x40\xb8\x9c\x25\x1b\xc8\xba\x88\x7a\xc5\x6c\x20\x15\xb2\x46\x20\x0d\x63\xad\xeb\xc9\x06\xd2\xea\xa7\xbe\x26\x05\xd2\x22\x1b\x48\x6b\x6a\xa4\x46\x7f\xbe\xfa\x2a\x25\xf3\x43\x57\xe9\x7a\xe2\x4a\x49\x0c\xe2\x09\xdd\x20\x78\x41\xd6\x47\x35\x20\x2f\x08\xf2\x82\x5c\xba\x78\x37\x02\x1d\x08\x74\x20\xd0\x81\xbc\x20\x8d\x78\x41\x3a\xb0\xc3\xb7\x40\x10\xf2\xd5\xdd\xba\x0d\x70\x7b\x13\x8a\x10\x6e\x18\x70\x82\x90\x8e\xdb\x05\x48\x10\xb2\xd5\xac\x11\x24\x08\x41\x82\x90\x8b\x8b\x20\x64\xa5\x68\x50\x33\x56\x8f\x4e\xc0\x45\x93\xfb\xc8\x5e\xc3\xb6\xfa\x15\xe7\xc7\xd5\x3a\x53\x08\x9c\x7f\x49\xf0\x84\xbc\x7d\x1b\xe9\x6d\xde\xc5\x8c\x53\x85\x18\xdf\x4a\x1b\x7f\x9d\x26\xd7\xd7\x6a\x5c\xc6\xb3\x73\x5f\x59\xa0\x51\x32\x96\xcf\xab\x50\x32\x3d\x05\x1a\xd5\xe8\x2d\x26\xab\x19\x64\x3a\x63\xfb\xba\x89\x0d\x57\x0d\x34\x5c\x35\xd0\x70\x2b\x03\x4d\x96\xc8\x43\x7c\x71\xb3\x9d\x8d\x2d\xee\xe3\x64\x8c\x64\x57\xb1\x9f\x69\xcf\xd9\x4a\xed\x8a\xf1\xdb\xbd\xa4\x5f\x32\x46\xf3\x2e\x72\x75\x79\xa3\x73\x01\x8d\x42\xe3\x47\x7b\x8d\x77\x77\xc5\xd4\x65\x41\x6b\xad\xe4\x66\xe0\xea\x36\x75\x91\xbb\x65\xa9\x36\x0d\x1a\xbb\x05\x7b\xe8\x4d\xce\xf9\xb2\x79\xbb\xc5\x3d\xd0\x5c\xc5\xdd\x61\xdc\x56\x4d\x92\xc4\x04\x8f\x1d\xe1\x90\xd6\x06\x3b\xc2\x61\x3d\x01\xd6\x13\x60\x3d\xc1\x56\xad\x27\xc0\x8e\x70\xd8\x11\x0e\xf3\xb8\x31\x8f\x1b\xf3\xb8\x31\x8f\x7b\x53\xe4\x71\x5f\x84\x60\x11\xf6\x9c\xc3\xdc\x58\xec\x39\x77\xf1\x30\xf1\x18\x5f\xe8\x23\xc3\x2d\x21\x88\x72\xb0\xd7\x96\xfd\xc8\x51\xa9\xa7\x6f\xed\x33\xbe\xa9\xe1\x89\xbf\x96\x12\xb2\xd7\x50\x44\x4f\xea\x4b\x49\x02\x2d\x1d\xc9\x57\xb3\x91\xda\x02\x2a\xf6\xc7\x16\x12\x58\x81\x62\x3f\x65\x46\x56\x6c\xfa\xf5\x24\xac\x6d\x6d\x6c\x3b\x63\xd5\x84\x24\x13\xf3\x44\x54\xb2\x1a\x95\x3c\xdd\x1c\x70\xec\x37\x32\x95\x80\x63\x42\xac\xad\x72\xb3\x2f\x71\x6e\x76\x04\x26\x11\x98\x44\x60\x12\x81\x49\x04\x26\x11\x98\x44\x60\x12\x81\x49\x04\x26\x11\x98\x44\x60\x12\x81\x49\x04\x26\xd7\x17\x98\x1c\x26\x07\x8d\x7b\xac\xfd\x0a\x98\xbc\x5e\xcf\x7c\x4b\x38\x78\x97\x42\x06\x1c\x82\x9a\x08\x6a\x22\xa8\x79\x11\x81\x9a\x5f\xb9\x81\xdc\xcf\x33\x56\x73\x34\x10\xa3\x50\xbd\xac\x5e\xff\xd9\x2d\x78\xae\x57\x90\xbb\x88\x00\x36\x07\x9d\x52\x29\xf0\x17\x9d\xa2\xf1\x93\x37\x18\x7f\xb4\x8d\x5c\xa9\x5f\xf1\xe4\xe2\x50\xf7\x41\x28\xb1\x97\x67\x49\xc1\xc7\x36\xc2\x68\x7c\xfe\x0c\xbf\xc3\x34\xbf\x43\xe6\x2e\x76\xa5\x76\x38\x3c\x3b\x54\xf7\xe4\x11\x31\x7e\x9b\x4b\xf3\x4b\xf5\xcb\x7a\x56\x92\xc8\x6a\x27\xa4\xbb\x38\x64\xd7\x7d\x8e\xe6\xc5\xb8\x05\x1a\x91\xa7\x8a\xcd\x01\xc5\x09\xe3\x7e\x01\x28\xd6\x78\xb5\x02\x61\xac\x3b\x8d\x04\xda\xd8\xfd\xe2\xae\xea\xd7\x7a\x58\x16\xf5\xaf\xe6\xcd\xde\x23\x2e\xde\xd0\x97\x9b\x05\x26\xfd\x8a\xea\x9a\xb6\xbc\x44\xac\xb3\x41\x9a\x80\x55\xd2\x04\x7c\x36\xd5\x21\xc5\x42\x1e\xe1\xec\x03\x33\xe4\xd5\x31\xfb\x40\xbb\xc6\x6e\x16\xff\x68\x42\x2d\xb0\xae\xda\x2c\xfb\xf2\xe5\xd5\xda\x6c\xac\xaa\xec\x70\x35\x6a\x6d\x3f\xef\x5b\xbe\x51\x4a\x0d\xcb\x15\xb7\x9a\x1a\xc5\x72\x45\x2c\x57\xdc\xe0\x72\xc5\x95\x55\x74\xb5\x71\x4f\x59\xd7\x4d\xa3\x79\x33\xf4\xe3\x64\xcc\xc8\x5a\xc7\x14\x58\x73\x87\x0e\xf4\xd4\xbd\x49\x35\xe8\xd3\xf6\xa2\xc4\xb7\xf6\x92\x41\xee\xe2\x79\x34\x5a\xf2\x03\xf6\x65\x57\x16\x23\xf2\x7c\x16\x70\xee\xc2\x90\x86\xc6\x5f\xf6\x18\x2f\x77\x11\x23\xbe\x40\x15\x25\x86\xad\xd5\xc1\x4d\xf0\xa1\xda\x54\x08\x37\x04\x17\x9c\x52\xb3\x11\xb5\x8e\xe2\x26\x27\xdc\x30\x3a\xee\x07\x23\xc5\xa2\xca\x48\x69\x5f\xe9\xe3\x25\x94\x84\xf2\x78\xf3\x0f\x66\xd8\x38\xc8\xbf\x0a\x21\xda\x6a\x92\x3f\xf1\x3d\x55\x2d\x25\xd2\x52\xe5\x1d\xa6\xa5\x60\x5a\x0a\xa6\xa5\x60\x5a\x0a\xa6\xa5\x60\x5a\x0a\xa6\xa5\x60\x5a\x0a\xa6\xa5\x60\x5a\x0a\xa6\xa5\x60\x5a\x0a\xa6\xa5\xac\x73\x5a\x0a\x26\x7e\x60\xe2\x07\x26\x7e\x6c\xe1\xc4\x8f\x3f\x4a\x93\x9d\xb2\x9a\xcd\xf8\x64\xda\xf8\xbd\x74\x5c\x9b\x56\x97\x78\xec\xba\x02\x8d\x78\xed\x17\xd2\x8c\xd5\xa6\x19\x7b\x53\x9a\x58\x83\xf6\x12\x2d\x16\x07\x2e\x78\xfe\x92\x37\xe8\x97\xa8\xe7\xe6\x07\x12\x9e\xf2\xa0\xf1\x8d\x94\xf1\xb5\x14\xd9\x75\x8e\x16\x8b\x0f\xb2\xd3\xba\xcf\x31\x91\x87\xbc\x6f\x86\xe9\xe4\x72\x60\xdf\xc1\x66\x1a\x98\xa7\x4b\xd4\x9b\x18\x4b\x3a\xdb\xfd\xa6\x53\x0c\x7d\x13\xee\x21\x1c\x28\xb3\xe7\xf4\xc4\xd8\x28\x00\x55\x3e\xec\x61\x79\x3f\xd7\x93\xc9\x14\x68\x24\xfa\x71\x8c\xf0\x61\x27\x60\x54\x3e\xe8\xa8\x3e\x66\xf5\x7b\x9c\x3c\x40\x6e\xe4\x72\xbc\x8e\x5c\x03\x72\xbc\x82\xec\xfe\x50\x6a\x27\x11\x5f\x67\x53\x71\xfc\xe6\x13\xe4\xa8\x48\x2f\xf2\xfd\x20\xef\x7a\x35\xa9\xf0\xea\xd4\x51\x02\x21\x75\x68\xfc\xf3\xe3\xc6\x2f\xed\x21\xd7\xea\x03\x28\x34\xfa\x36\xee\xa0\x04\xc2\xb4\x92\x7b\xaf\xac\x9f\x3c\xc1\x46\xc8\xec\x61\x27\x8d\x6a\x97\x0b\xf8\x38\xae\x5f\x84\xf3\x36\x39\x64\x9c\x45\xe8\x14\xa1\x53\x6c\x5d\x8e\xd0\x29\x42\xa7\x08\x9d\x6e\x1d\xe8\x74\x13\x75\xe6\xde\x34\xd0\x29\xb6\x8c\x46\xe8\x14\xa1\x53\x84\x4e\x11\x3a\xdd\x88\x96\xd1\x5b\x1a\xe9\xc4\x9e\xb6\x5b\xb9\xa7\x6d\xf6\x22\x44\x3a\x27\x69\xfd\x12\xae\x49\x0e\x6e\x8d\x92\x11\x00\xb7\x0e\x93\x43\xe4\x40\xfd\xcc\x55\x1d\xc1\x12\x00\x94\x0d\xc8\xd1\x09\x37\xae\xdb\xba\xb9\x76\x16\xdc\x0e\x63\x3b\xa7\x9e\x6f\x2d\x09\x4f\x66\xad\x56\x83\x66\x22\x6b\x15\xee\x5b\x9d\x9d\x67\xbd\x67\x57\x1d\xa4\xec\x15\x7c\x5f\x32\x1d\x01\x8a\xf5\xf2\x7f\xaf\x23\x2c\xc6\x51\xac\x09\x72\x3f\x19\xaf\x28\x11\xb8\x9b\xdc\xb5\x0a\xa9\x63\x75\x00\x16\x59\xad\xb2\xc8\xea\xdf\x52\xe4\x38\xff\xf4\x8f\x92\x23\xf0\xe9\x1f\x20\xab\x5b\x84\xe4\x41\x5e\x55\x35\x46\xb2\x71\x55\xd5\xaa\x07\x3b\xc1\x7b\xbb\x8d\x93\x51\xad\xb7\xdb\xaa\x47\x6b\x96\x0f\x5c\x5f\x55\x95\xfc\xce\xab\xaa\xcc\xb7\xfa\xeb\xa8\xaa\x6e\xd1\xe4\x4f\xeb\x98\xe8\xcf\x09\xb5\xb5\x8f\x1f\xab\xa1\xb6\x46\xd5\xd9\x9d\x55\x60\x9d\x69\x13\x8b\xb8\x2e\xe2\xba\x88\xeb\x22\xae\xbb\x75\x70\x5d\xb4\xde\x9a\x58\x6f\x9b\x07\xf8\xc6\x16\xdd\xeb\xd2\xa2\x1b\xe3\x0b\x18\x5f\xc0\xf8\x02\xc6\x17\x30\xbe\xb0\xa5\xe3\x0b\x9f\x4f\x93\x97\xd2\xc6\x8b\xe9\xee\x4f\xa9\xdd\xf6\xdd\xe9\x31\xad\x8c\xba\x04\x89\x71\xea\xd3\x9f\xaa\xec\x4b\x9f\xc8\x2e\x92\xaf\x3b\xae\xc3\x66\x2f\x7c\xc8\x3e\x60\x9b\x33\x5c\x8f\x44\x7a\x2f\xfd\x78\x17\xa1\xa2\x61\xbf\xcc\x76\x0a\xca\x74\x70\xce\x29\x4a\xeb\xdf\xe2\x47\x2d\x73\xce\xf5\x9c\xa2\xfb\x8c\x54\xdf\xb3\xd4\x74\xf2\x00\xd6\xfb\x83\x1c\xbb\xcd\xc7\xa6\x25\x1f\xbc\x27\x8c\x2f\xe2\xf6\xb6\x6d\x8e\xbb\xa0\x92\xb4\x89\xfb\x41\xf5\x93\xc5\x01\x92\x88\x9b\xfb\x60\xfd\xf9\xd1\xbc\x6d\x5d\xc5\xe7\x33\xa6\x7a\xf8\x27\xd2\xa6\xde\xd8\x45\xde\xd0\x65\x3c\xdb\xd5\xfd\x7d\x95\x3b\xf7\xc5\x6d\xe7\x84\x1e\x64\x4b\x74\xde\x5f\x32\x0b\x4e\x30\xeb\x14\x12\xb8\x83\x32\xd4\x68\x30\xe7\x07\x0b\x4c\x16\x35\x67\x7a\xba\xe2\xe6\xf5\x27\x0a\x66\x8d\xb4\x49\x4a\xfc\xa9\x5c\x66\x2f\xe4\xdc\x7c\x6c\x58\xc3\xde\xc8\x59\x1c\xa4\x74\xd9\xe6\x24\x76\x0e\xb9\xfb\xd9\x9a\x18\xa5\xde\x54\x51\x09\x95\x31\x97\xbc\x99\x6d\x72\x60\x09\x74\xb1\x6e\xad\xf6\xf0\x67\xe8\x61\x3e\x0f\xfc\x95\x5c\x18\xe1\x61\xb3\x27\xeb\xe4\x2e\x14\x02\xbf\xec\xe5\xd9\x59\x90\xaa\x06\x27\x55\x08\x8e\x1b\x2b\xc2\x02\x4a\x0e\x22\x9f\x60\x56\x8d\x74\xd8\xec\x39\xee\x07\x54\x1b\xd6\xcc\x39\x61\xce\xc9\xb3\xa7\x17\xf2\xe1\xc9\x89\x30\x5e\xc8\xcd\xe9\xaa\x01\xe7\xd4\x18\xb6\x75\x75\xa9\x72\xdd\xe8\xb6\x0d\x86\xef\x30\x7c\xb7\x45\xc3\x77\x93\x05\x8e\x30\xef\x05\x84\x39\x7d\xfa\x41\xe3\x08\x39\x4c\x0e\xad\x02\xbc\x9c\x89\x9c\xa8\x1c\xb6\x89\x71\x62\xb5\x08\xf2\x53\x99\xda\x00\xf6\x35\xc6\xd5\x5c\x59\xc4\x8a\x9c\x5c\x84\x5c\xba\xc6\xa7\xfb\xc8\xde\xfa\xc4\x2d\x92\xad\x25\x57\x74\xc2\x90\xaa\x36\x43\x3f\xd9\x67\xfc\xfb\x6d\xe4\x8a\x04\x73\x4b\xf7\x2d\x40\xc1\x99\x74\x78\x05\xc3\xc7\x28\xbb\x3c\x73\x23\x3b\x41\xe7\x57\xd1\x8f\xb6\x99\x52\xd3\x59\x59\xec\x45\x7b\xf6\xc5\x21\x5b\x9f\xd7\x1a\x58\xe7\x80\x43\xb3\xb5\xd5\xa9\xb3\x00\xd5\x25\x3f\x49\x90\xa6\xf0\xc9\x75\xff\xf9\xce\xca\xd7\x60\x49\xca\xcc\x06\x6f\xe2\x16\x71\xce\xfa\xbc\x8c\x15\x87\x63\xeb\xbf\x0d\x04\xf4\x30\x1c\xbb\xca\x70\xec\xfb\x57\x18\x8e\x6d\xa0\x12\x56\x1e\x8e\x5d\x83\x7e\x59\xd1\xf6\xd6\x92\xd2\x48\x50\x8e\x35\x26\xcd\xcc\xbc\xfd\xaa\x4a\xfd\xf2\xef\x84\xcd\xed\x78\x49\x9d\x72\x33\xff\x7d\x9d\x54\x4a\x67\x02\xa4\xa8\x5d\x9a\x68\x17\x04\xe9\xd7\x05\xa4\x47\x74\x06\xd1\x19\x44\x67\x3a\x85\xce\x4c\x7e\x24\xd5\x66\x17\x75\x9a\xa7\x54\x3d\x48\x26\xb4\x94\xaa\x0e\xbb\xbd\x66\xed\x8d\x7b\x97\xb1\x83\x8b\x69\x85\xa9\x55\x2b\xb6\x1c\xb2\xcf\x5d\x5e\x69\x1a\xdc\x59\xc5\x6f\xdd\xc0\x07\xb9\xa9\x54\x49\xb7\xd9\x19\x73\x01\xf9\xaa\xb7\x9a\x91\x82\x7c\xd5\xc8\x57\xbd\xc1\x7c\xd5\xeb\x07\x3f\x35\xa3\x8c\xee\xf0\x2e\x30\x79\x88\x1c\x30\xee\xb6\xee\x52\x90\xe7\xab\x74\x46\x6a\xfd\xb2\x75\x20\xa1\xfe\x78\x2f\x19\xe2\x58\xe6\x2c\x50\x4d\x2f\xd6\x65\xfd\x78\xca\x9f\x55\x60\xe6\x8f\xf4\x1a\x7f\x98\x26\x3b\xe1\x12\x70\x70\x6b\xe0\x98\x93\xfe\x6c\xe6\x55\xec\xf7\x2c\x3b\x4b\xef\x4a\x3e\xe9\xcf\xb6\x19\xba\x9c\x21\x07\xf9\xda\x19\x22\x83\xb0\x76\xfa\x48\x0f\xb9\xa3\xee\xda\x81\x79\xb3\x65\x33\xe9\xcf\xae\x15\xac\x7c\xa0\xf9\x5a\xb9\xc3\xb8\x4d\xac\x15\xb8\xb1\x58\x1f\xec\xde\x89\x66\x3e\x6f\xda\xa9\x49\xf4\xfa\xda\x90\x24\x13\xea\x0d\xe2\x50\xe7\xe5\x9a\x85\xc2\x9b\x8a\x7d\xb8\x55\xc1\xe2\xa6\x8b\xb8\xe3\x2a\x71\xc7\x9f\x48\xad\xe1\x7b\x3e\xc2\x91\xc6\x7b\xc8\xfe\x18\x69\x6c\xa3\x3a\x68\xdb\xf7\xde\x0c\x46\xfc\xfb\x2b\x35\x75\x70\xb9\x44\x10\x41\x03\x88\x42\x8c\x75\x50\x00\x88\x19\x22\x66\x88\x98\x21\x62\x86\x88\x19\x22\x66\xb8\x35\x31\xc3\xd6\xf6\xfb\xda\x5b\x7c\xc2\x0a\x68\x8e\x3e\x66\x5f\xda\xad\x6d\xf9\x56\x13\x64\x90\x19\x02\xd7\x83\xc3\xda\x59\x3b\x00\xc1\xc0\xad\x66\x7d\x20\x18\x88\x60\xe0\x06\x83\x81\x33\xf5\xb9\x41\x56\xed\x19\xb6\x0c\xff\xb5\xcd\xc5\x9b\xdc\x4b\x6c\xa3\xdf\xca\x28\xa4\xef\x4a\x1d\xe9\x9b\xf4\x67\xab\x01\xbe\x8b\x30\x1d\xf2\xa3\x4f\x90\x7b\x38\x84\x38\x57\xf4\x97\xd8\x17\x19\xf8\x45\x5b\x71\xaa\x56\x92\x0a\xb3\x93\xc2\xdc\x3c\x5d\x70\x42\xe3\xd9\x27\x8c\x4f\xef\x21\x37\x6a\xd7\x8d\xc8\xcb\x14\xeb\x40\x6f\x63\x2a\xe1\xe3\x45\x7f\x69\x06\x86\xcb\xf4\xb1\x33\x8f\xd7\x18\x4b\x30\x11\xc4\xa7\x22\xa5\x30\x52\x0a\x23\xa5\x30\x52\x4f\x20\xf5\x04\x52\x4f\x20\xf5\xc4\xa6\xa1\x9e\xd8\x3c\xcc\x0a\x58\xf2\x8f\x25\xff\x58\xf2\x8f\x25\xff\x58\xf2\xbf\xa5\x4b\xfe\xb1\x26\x19\x6b\x92\xb7\x68\x4d\xf2\x45\x49\x29\xec\x92\x53\x1c\x1d\xbc\x9f\x8c\x03\x3a\x78\x94\x1c\x21\x87\xeb\xa2\x83\x3a\x5e\x25\x29\x3a\x63\x90\xa8\x95\xbe\x62\x4f\x5d\x68\x8e\x15\x3e\x60\x1c\x17\x58\x61\x23\x7c\x4c\x40\x88\xf1\xed\x6b\xd4\x55\x37\xe1\x30\xb6\xfe\x78\x57\x13\x2c\xed\x1a\x45\x36\xac\xc1\x66\x77\xf2\x1f\xd7\x17\x38\xe3\x38\xd7\x49\xf2\x20\x99\xa8\x08\xed\x34\xa2\x7a\x6e\xfc\xc2\x30\xb2\x83\x19\x67\xab\xcc\x38\x7b\x63\x7a\x65\x9c\xe3\x8d\x17\x22\x39\xcd\x73\xd0\x1e\x20\xc7\xe3\x1c\xb4\x35\x0d\x38\xc5\x23\xdf\x13\xe4\x7e\x2d\xf2\xbd\xa6\x11\xd7\x4a\x42\xbc\x9e\x8a\x2f\xf3\x1f\x07\x9a\x28\xb6\x5b\x6a\x52\x13\x6b\x4a\xee\x6e\x7e\x42\x03\x25\x17\xf3\x14\x77\x4c\xdd\x21\x45\x31\xe2\xc4\x88\x13\x23\x4e\x8c\x38\x31\x52\x14\x23\x45\x31\x66\x32\x23\x45\x31\xc6\x2b\x30\x5e\x81\xf1\x0a\x8c\x57\x60\xbc\xa2\x2d\xf1\x0a\x2c\x68\xc1\x82\x16\x2c\x68\x41\x8a\x62\x0c\x07\x62\x38\xf0\x22\xa7\x28\x5e\x01\x87\x70\x8b\x58\x74\x15\xac\xbc\x2a\x70\xba\xfd\xf9\xf3\x5f\x7b\x25\xb9\x81\x2d\x30\xe0\xde\xf0\xf3\x8a\x32\x78\x30\x04\x49\x19\xff\xed\x95\xc6\xcb\x69\xb2\x23\xe7\x07\xf4\xc9\xc5\xa1\xee\x5b\x81\x6b\x83\x1f\x93\x2f\x3a\xb6\x81\x4f\xf9\x79\x9a\xb9\x96\x9d\x32\xea\x07\xf4\xec\x10\xfb\x37\x97\x78\xdb\x29\x37\xda\x53\xa1\xc1\x1e\x8b\x2d\x0b\x36\xd1\x16\x29\x37\x8e\x37\x7f\xdd\xb7\x19\xb7\xd6\x28\xc4\xb3\x2c\xf1\x3e\xd9\xcd\x48\xf7\x5b\x76\xc6\x52\xbd\x5d\xf2\x6d\x34\x14\xec\x2b\xc5\x59\x9d\x95\xed\x8a\x69\x37\x74\x19\x22\x38\x86\x41\xd0\x75\xa2\xdd\xd0\x97\xdd\x2a\x68\x37\x12\x97\xaf\x9e\x85\xa7\x54\x6e\x59\x25\xd4\x54\x03\x09\x82\xbe\x2f\xec\x8e\x55\xc2\x40\x55\x01\x6e\x43\xdd\x70\x1d\x54\x8f\x75\x4e\x33\x60\x1d\xee\x56\x53\x54\x58\x87\x8b\x75\xb8\x1b\x5e\x87\xbb\xfa\x1d\x61\xcd\x34\x7c\x6d\x52\xea\x93\x43\x64\xd0\x18\xb0\xee\x54\x35\xb5\x57\xe9\x55\xb8\xec\xf4\x75\xe0\xd9\xfb\xad\x7e\x32\xca\x8b\x64\x73\x34\x10\xf9\x8d\x34\xac\xac\x8d\xd5\x8f\xb9\x05\x0f\x3a\x89\xf0\xb7\x23\x99\xf7\xfe\xe9\x4e\xe3\x8f\xb6\x91\x6b\xf5\x13\x55\x12\x4c\x7f\x0d\x16\xbe\xd1\xf8\xc4\x19\x3e\xe2\x34\x1f\x31\xb3\x17\x9c\x04\x6d\x1c\x99\x07\x53\xef\x8a\x36\x3b\x10\x65\xf2\x08\x5f\x5a\x33\xe4\xd5\xb0\xb4\x1e\x24\x13\xe4\xfe\xfa\x4b\x4b\x17\x9b\xcc\x67\xaa\x3b\xd7\xa6\x8b\xef\xb5\xcd\xd7\xd6\x29\xe3\x84\xec\x80\x53\xfd\xca\xc4\x62\xab\x3f\x81\xea\xec\xcd\xc6\x5e\x4d\xf7\x7f\xdf\x55\xe7\xb5\x0e\xd6\xa6\x02\xac\xff\x66\xef\x92\x5e\xca\x86\xbd\xdc\xec\xe3\xe4\x51\xf2\x9a\x0a\x5b\xa1\x7d\x6f\x17\x4d\x07\xf4\x71\x56\xe9\xe3\xfc\x71\xaa\xa3\x6a\xe7\x49\xee\x05\x3d\x4c\xce\xc6\x5e\xd0\xd6\xd5\x6b\xc0\x63\xf8\xf2\x55\x75\xf4\x9a\xa5\x38\x0d\xeb\xab\xb2\x7d\xfc\x9c\x0d\xd4\x64\xc8\x80\x88\x0c\x88\x97\x6e\xde\x10\x06\x8c\x31\x60\x8c\x01\xe3\x4e\x32\x20\xae\x27\x67\x61\x7b\x43\x74\xad\x77\x4d\x59\x7f\xa3\x23\xfb\xf2\xe5\x75\xac\x8a\x83\x4d\x68\x13\xeb\xdb\x1a\x43\x1c\xc0\xdd\x10\x53\x03\xc1\xdd\xad\x66\xe0\x20\xb8\x8b\xe0\xee\x06\x83\xbb\x1b\x8b\xc0\x35\x85\x7f\xd7\x7f\x57\x99\x3c\x4e\xc6\x8c\xac\x75\x4c\x21\xc5\x77\xe8\x48\x71\xdd\x81\xd6\x01\x3e\x7e\xd7\x8d\x64\x9a\xc3\xc7\x4e\x39\xf2\xc3\x9c\x53\x74\xbd\x42\x83\x66\x2d\x20\x6b\xf6\xd9\x16\x4b\x7e\x5e\x5e\x42\x83\xca\xd4\x92\x4f\xde\x60\x7c\x72\x1b\x79\x85\x36\xe6\x93\x8b\x43\xdd\xfb\x1b\x66\x98\x3c\xa0\x86\x9e\xf2\xf3\x23\x6a\xe8\xcc\x41\x76\xd5\x48\x3c\x92\x4e\x48\x5c\xe7\x9a\x8e\x24\xa6\x2c\x70\x93\x6b\x2f\xac\x66\xb6\xaa\x47\xc9\x08\x39\x5a\x77\x55\x6b\xcf\xce\x76\xaf\x3a\x33\x6d\xba\x9a\x67\x9b\x2f\xd6\xa3\xc6\x11\xb1\x58\xb5\x7b\x8a\x45\x5a\xef\xb6\x2d\x36\x8c\x00\x00\xf9\xd7\x77\x55\xbd\xc9\x03\xcd\xb2\x5a\xea\xbd\xcc\xc3\xe2\xc2\x8d\x7f\x9f\xd9\x87\xc8\x0c\x79\x75\x85\x65\xb2\xf6\x17\x8a\x06\x0a\x42\xc8\xab\x84\x90\x7f\x3f\x55\xdf\x01\xeb\x84\xea\x39\xc7\x31\xe5\x29\x72\x2a\xc6\x94\xdb\x31\xf0\xe6\x50\x5d\xa5\x72\x44\xb2\xbf\x7f\x79\x95\xea\x3a\xd6\x72\xf6\x4d\x3d\x1d\x76\x08\xec\x88\x8d\xd5\x60\xe8\xd7\x6d\x35\xb5\x89\x7e\x1d\xfa\x75\x1b\xec\xd7\x6d\x8c\x05\xdc\xd4\x9f\x6b\x6d\x9f\xa9\x91\xb6\xdd\xfa\x9e\x33\x39\x46\xb2\xc6\x31\xeb\x3e\xe5\xc0\xdd\xa6\x3b\x70\x75\xae\xba\x24\x48\xf8\xbf\xdc\x4b\x32\xdc\x41\xf4\xfc\x3c\x8d\xf3\x8a\x06\x83\xb2\x17\xb9\x0b\x34\x57\x74\xc2\x50\x95\x16\x18\xbf\xd2\x6b\xfc\x6d\x9a\xec\x60\xe7\xb2\xcd\xf6\x96\x1a\x99\x43\xd3\xfc\x42\xde\x79\x1a\x1a\x7c\x9e\xf2\xf3\xf4\xec\x90\xfe\x7b\x9b\x5d\xb7\x47\xc9\x31\xbe\x70\x0f\x91\x03\xb0\x70\x87\xc8\x20\x19\xa8\xdf\x02\x96\x3d\xe9\xe2\x90\xad\xcf\x68\xad\xed\x3c\xcf\x35\x5f\xa4\xfb\x8d\x7d\x7c\x15\x26\xee\x5b\x63\xdd\x6a\x6f\x82\x74\xff\xc6\xce\x58\xdc\x56\xed\x8c\x9e\x84\xc4\x65\x03\xd0\x4e\x0b\x3d\x0b\xca\xa1\xc2\x42\x58\xa9\xd4\xd1\x2c\x40\x6f\x6a\x95\xde\xd4\xcf\xa5\xda\xf0\xd1\x8f\x73\x17\xe9\x3e\x72\x6f\xec\x22\xad\xab\xee\x80\x22\x84\xd6\x74\x47\x0d\xe5\xd0\x44\x9d\x64\xde\x70\x55\xac\x3b\xae\x53\x59\x33\x09\x75\xf1\x2a\xfe\x73\xc7\xb5\x05\xa6\xc3\x60\x3a\x0c\xa6\xc3\x60\x3a\x0c\xa6\xc3\x60\x3a\xcc\xd6\x6c\x08\xda\x3c\x1d\xa6\x53\x76\x40\xf6\x5b\xbb\x63\x3b\xe0\xce\x26\x79\x2e\x09\xeb\xe0\x95\xe0\x82\x77\xd2\x38\x40\xa0\x73\xab\x99\x24\x08\x74\x22\xd0\xb9\xc1\x40\xe7\xa3\xf5\x03\x71\x6b\xf6\x29\x5b\x86\x35\x3b\xa5\xed\x27\x0f\x91\x03\xc6\xdd\xd6\x5d\x0a\x85\x7c\x95\x8e\x65\xea\x97\xad\x43\xfe\xc9\x6f\x3c\x41\xc6\x38\xbc\x18\xcc\x3a\x39\x5b\x0a\x1a\x96\x74\x65\x11\x63\x9d\x94\x94\xc0\x2f\xd2\xd0\xf8\xfb\xc7\x8d\x5f\xde\x43\xae\x67\xa3\x8c\xe8\x83\xc4\x55\x21\x8d\xdb\x7d\x4e\xfb\x45\x9a\xc9\xb0\x73\xa6\x2b\x87\x10\xd9\x9a\x71\x8c\x8f\x9d\x8b\x9d\x3e\xb1\xd3\x27\x76\xfa\x44\x06\x77\x64\x70\x47\x06\x77\x64\x70\xdf\x34\x0c\xee\x9b\x87\xa0\x1c\x99\xb3\x91\x39\x1b\x99\xb3\x91\x39\x1b\x99\xb3\xb7\x34\x73\x36\x52\xfb\x22\xb5\xef\x16\xa5\xf6\xbd\x28\x3b\x7d\x3e\x46\x46\x38\xc2\x37\x4c\x0e\x02\xc2\xb7\x8f\xec\x25\x76\x5d\x84\x0f\x50\x2b\x59\xb3\x36\xed\x17\x69\x4b\xcd\x3d\x57\x94\x19\x5f\x17\x18\x93\x40\x9f\x5f\xa4\xab\xe8\xe9\xf9\xe3\xbb\x1a\xa1\x65\x57\xa8\x86\x9e\x00\x8c\xf5\xf3\x7f\xae\x33\x34\xc6\x91\xac\x63\xe4\x3e\x72\x6f\x45\x00\xa6\x9f\x64\x5a\x7f\x25\x18\x72\xc1\x24\xb2\x55\x26\x91\x7d\x35\xc5\xf9\x67\xf7\x02\xff\x2c\x53\x07\x36\x59\xd1\xda\x23\x59\x9e\x41\x76\x98\x1c\x8a\x33\xc8\x56\x3a\xc6\x28\x8f\x46\xdf\x4b\x86\xb5\x68\xf4\x4a\x07\x59\x6b\x5f\xce\x75\xd0\x59\x99\xef\xf4\x37\xd2\x49\xd7\xd7\xec\xc5\x09\xfa\xe9\x1e\x7e\xa8\x9e\x7e\x8a\x5b\x70\x76\x54\x53\x61\x1b\x4e\x04\x71\x11\xc4\x45\x10\x17\x41\x5c\x6c\xc3\x89\x6d\x38\x31\x7f\x18\xdb\x70\x62\x30\x01\x83\x09\x18\x4c\xc0\x60\x02\x06\x13\xda\x12\x4c\xc0\x32\x12\x2c\x23\xc1\x32\x12\x6c\xc3\x89\xb1\x3a\x8c\xd5\x5d\xe4\x6d\x38\xd7\x23\x04\xb6\x82\x56\x9f\x17\x23\x35\xc7\x5f\xf6\x92\xfd\xb2\xbf\x27\x2c\x9b\x7a\x19\xf2\x4c\xeb\xb8\x39\xea\xe4\x72\xcc\x01\x09\x8d\x5f\xec\x35\x7e\xbd\x2b\xee\x47\xf7\x8c\xb0\x70\xbd\xbc\xbb\xe8\xe6\xcb\x4e\x51\x8f\xcc\x3a\xca\x9b\x9c\xe1\xa3\x8c\xf0\x51\x6c\xcd\x6c\x18\x56\x06\x47\x0f\x0c\xd5\x13\x03\xba\x09\x84\xce\x2f\x51\x05\x0a\x84\x11\x75\xf2\x76\x86\x5f\x20\x9a\xdb\x29\x6c\x3e\x79\xab\x13\x6e\x1b\x19\x91\x3b\x93\x6e\x3f\x79\xa1\x7e\xc5\xc8\x14\xff\xae\x26\xc8\xfd\xf0\x5d\x8d\x90\xa3\xe4\xc8\x2a\xbe\x2b\x88\x9b\x8f\x33\xc7\x50\x7e\x42\x53\xcd\x3f\xa1\x01\xe3\xce\xca\x36\x56\x49\xd9\x26\xd9\xd4\x6e\xab\xfd\xc1\x5c\x6e\x10\x78\x54\x08\x1c\x4f\x62\x65\x01\x56\x16\x4c\x62\x50\x0a\x83\x52\x18\x94\xc2\xa0\xd4\x96\x09\x4a\x4d\x6e\x9a\x98\x4b\xdb\x67\xb2\xea\x60\xc0\x24\x06\x03\x30\x18\x80\xc1\x00\x0c\x06\x60\x30\x60\xfd\x83\x01\x17\x21\x62\x31\xb9\xa5\x01\xd6\x49\x04\x58\x3b\x07\xb0\x4e\x6e\x7a\x80\xf5\x22\x2c\x86\x30\x3e\xda\x47\xee\x6e\x09\x61\xa4\x5e\xbe\xe4\xbb\x5e\xdc\x4e\xfc\xb9\x3e\xe3\xcf\x35\x88\xf1\x83\x29\x21\x76\x0d\x58\xf4\xa4\xaa\x94\x14\x1c\xe3\x72\x90\xb6\x60\x8b\xfd\xb1\x61\x04\xc6\x9f\xd8\x46\x99\x6d\x15\x5b\x7c\x3d\x09\x23\x5b\x1b\xdb\xce\xdc\x5c\x13\x99\x54\x73\xdc\xfc\x80\x64\xdb\x71\xc7\xa6\x98\xfe\x83\xcd\x01\xc9\x5e\x63\x4f\x25\x20\xa9\x44\x9a\xc4\x22\xeb\xf3\xe3\xc0\x53\x22\x0e\x89\x38\x24\xe2\x90\x88\x43\x22\x0e\x89\x38\x24\xe2\x90\x88\x43\x22\x0e\x89\x38\x24\xe2\x90\x88\x43\x22\x0e\xb9\xde\x38\xe4\x3d\x64\xbf\xb1\xcf\xda\xab\x70\xc8\xeb\x74\x3a\x51\xe5\xdc\x5d\x0a\xcd\x90\x10\xbf\x44\xfc\x12\xf1\xcb\x8b\x08\xbf\xfc\x4f\x7d\x64\x4a\x74\xb7\xce\x33\x23\xdb\xf5\xbd\x80\x16\x5c\xe0\x82\xaf\x41\x30\xcc\x21\x4e\x70\x69\x1d\x66\x48\x2d\xd1\xd9\x79\xdf\xbf\x90\x70\x4d\x43\xe3\xc3\xbd\xc6\x7b\xb7\x93\x9b\x6a\x8e\xa8\xb8\x0a\x7e\x24\xd5\x5a\x52\xe5\x59\x75\xb3\x73\xfc\x66\xa3\xfa\xcd\xda\x94\x64\x39\x0a\x17\x8c\xd4\x9a\xb0\x20\x48\x68\x3c\x8d\x8b\x23\x01\x73\xfd\xf1\xce\x56\xd2\x25\x9f\xfa\x81\xe6\xa0\xe8\x63\xc6\x23\xb2\x23\x61\x83\x65\x2a\xe0\xd2\xc6\xaf\xaa\x46\xef\x79\xc4\x49\x11\x27\x45\x9c\x14\x71\x52\xc4\x49\x11\x27\x45\x9c\x14\x71\x52\xc4\x49\x11\x27\x45\x9c\x14\x71\x52\xc4\x49\xd7\x17\x27\x45\x34\x12\xd1\x48\x44\x23\xb7\x30\x1a\xf9\x9e\x3e\x32\x29\xd0\xc8\x72\xe4\x87\x39\xa7\xe8\x7a\x85\xa6\xa9\x95\x80\x39\xf9\x5e\xe4\x14\x4b\x7e\x5e\x5e\x48\x83\xd0\xf8\xd3\x5e\xe3\x5b\x5d\xe4\x15\xda\x58\x4f\x2e\x0e\x75\x3f\xd7\x22\xf0\xf8\x80\x1a\x76\xca\xcf\x8f\xa8\x61\xdb\x84\x38\x1e\xe0\x88\x63\x3c\x35\x3d\x87\xb2\xce\xad\x11\x65\x5c\x03\xca\xb8\x22\x3a\x05\x6d\xc9\x08\x50\xb1\xce\x2b\x49\xf6\x0d\x44\x20\x11\x81\x44\x04\x12\x11\x48\x44\x20\x11\x81\x44\x04\x12\x11\x48\x44\x20\x11\x81\x44\x04\x12\x11\x48\x44\x20\x71\x7d\x81\x44\x4c\x9c\x44\xa8\x12\xa1\x4a\x84\x2a\x3b\x08\x55\x7e\xbb\x97\x1c\xe3\x50\x65\xce\xf7\x83\xbc\xeb\x55\xe4\x4b\x36\x86\x2c\x81\x84\x3a\x34\xde\xd7\x6b\x7c\xac\x8b\x5c\xa9\x8f\xf0\xe4\xe2\x50\xf7\x6b\x5b\x03\x28\x4f\xb0\x41\xda\x04\x47\xee\x11\xb5\xdc\xf1\x44\x74\x3c\x12\xee\x84\xe8\xe3\x1a\xd0\xc7\x87\x9b\xa3\x8f\x77\x1b\x77\x09\xf4\xb1\xc6\x8a\x12\x28\x24\xbc\x08\xc4\x1c\x11\x73\x44\xcc\x11\x31\x47\xc4\x1c\x11\x73\x44\xcc\x11\x31\x47\xc4\x1c\x11\x73\x44\xcc\x11\x31\x47\xc4\x1c\x11\x73\x44\xcc\x11\x31\x47\xc4\x1c\x2f\x51\xcc\xf1\x83\xbd\x64\x98\x63\x8e\x75\xdb\xfd\x54\x54\x6a\xe7\x8a\xe5\x30\x62\xfe\x51\x91\x86\xc6\xb7\x7b\x8c\x6f\x74\x35\x6a\x1f\xbf\xd4\x1a\xee\x38\xca\x07\x9d\xf6\x8b\xed\x42\x1f\xfb\xe1\x82\xba\xbd\xe9\xe3\xfb\x21\x06\x59\x1b\x83\x74\x9b\xc3\x8b\xc7\x8d\xb1\x16\x7b\x45\x69\xf2\xae\xd1\x32\x0a\x3b\xe0\x20\x28\x89\xa0\x24\x82\x92\x08\x4a\x22\x28\x89\xa0\x24\x82\x92\x08\x4a\x22\x28\x89\xa0\x24\x82\x92\x08\x4a\x6e\x42\x50\x12\x21\x43\x84\x0c\x11\x32\xdc\xc2\x90\xe1\xff\xda\x43\xae\x95\xfd\x69\x4a\x7e\x3e\xa2\x0b\x25\xf0\x22\x8c\x2f\xef\x31\x3e\xb7\x2d\x6e\x3f\xd3\xc7\x4d\xc0\x40\x6c\x5e\x52\xbb\xc9\xc6\x33\x53\x7e\xfe\x8c\xb8\x34\x73\x07\x3b\x95\x77\x7d\xd1\x7e\x3e\xee\x07\x23\xc5\xa2\x4a\x19\xdc\xf4\xdd\x5f\x9e\x20\xa3\x1c\xa5\xbb\x97\x0c\x03\x4a\xb7\x9f\xec\x23\x7b\xeb\xa1\x74\x36\x93\x93\xbd\x38\x64\x6b\x4f\x7c\xc2\x0d\x9b\x03\x73\x37\xd7\x46\xcb\x76\x18\xdb\x79\x5e\xe0\xc9\xe6\xc0\x5d\xc6\xe8\xe5\xb8\x9c\x76\xef\x44\x0a\x60\xdc\x2e\x06\x71\x37\xc4\xdd\x10\x77\x43\xdc\x0d\x71\x37\xc4\xdd\x10\x77\x43\xdc\x0d\x71\x37\xc4\xdd\x10\x77\x43\xdc\x0d\x71\x37\xc4\xdd\x10\x77\x43\xdc\x0d\x71\xb7\xf5\xc2\xdd\x3e\xdd\x4b\x0e\xd6\x60\x32\xdc\xa7\x27\xe7\xd5\xe5\x2d\x7c\x53\xaf\xf1\x83\xdb\xc9\x35\x09\xde\x42\x7e\xe5\x26\x21\x2f\xcc\x56\x91\x17\xf2\xe9\x35\xe0\x2d\xbc\xd8\xf0\xc1\x4d\x5b\x49\x5c\x68\x8e\x18\x8e\x19\xd9\x35\xf0\x18\xee\xc3\xae\x28\x88\x25\x22\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\x88\x58\x22\x62\x89\xeb\x8b\x25\xfe\xf4\x9d\xe4\x64\xf3\xb2\xdf\x7a\x54\x83\x81\x5f\xa4\xb3\xae\x97\x77\xbd\x82\x38\xf0\x7a\xe3\x13\x19\xe3\xf9\x6d\xe4\xda\x5a\x95\xc0\xdd\x37\x07\xd4\xc9\x57\x78\xa8\xd3\x7e\x91\x66\xf9\x18\x99\x7e\x76\xbc\x46\xa9\x6e\xcc\x16\xa8\x9d\xdd\x36\x94\x8f\x83\x72\x8f\x90\xa3\x1c\x94\x3b\x48\xee\x01\x50\x6e\x2f\xb1\x49\x7f\xdd\xa4\x3d\x10\xd7\xe2\x90\xad\x4d\xa8\x29\x06\x97\x6f\x0e\xaf\x8d\x18\x47\x6b\xa4\xdf\x35\xab\xaa\xd5\x27\xf1\xd4\x4d\xb5\x91\xbe\xcb\x8c\xae\x02\x8d\x48\xf7\x37\x76\xd6\x79\x39\xb7\x06\xb4\x54\x74\x72\xb4\xc1\xfb\x19\x14\xa7\x6c\xcc\x2b\xca\x66\xc9\x31\x72\x9f\xd1\x35\xeb\xe7\x97\xbb\xe1\xbf\x66\x2a\xb3\xc2\x77\x94\x7d\x57\x9a\xbc\x23\x6d\xbc\x3d\xdd\xfd\x36\xa5\xa2\xbf\x93\x3a\xc7\xf6\x3a\xb1\xc9\xf6\x03\xfe\x9d\x63\xae\x34\xd7\xa9\x09\xc7\x4e\x07\xfb\x66\xa9\x59\x62\xef\x8a\x59\xd3\xb6\x39\xe2\x99\xae\xc7\x21\x15\x3f\x30\xcb\x9e\x42\x65\xf2\x66\x3e\x58\x9e\x2e\x7b\x66\xde\x0d\x28\x53\x24\x54\xb9\xfa\x6c\xc7\x06\x93\x48\x60\x1d\xd2\xb3\x11\xde\xa5\x39\x57\x0e\xc0\x7a\x2e\x05\x7e\x8e\x86\x60\xbb\x08\xbd\x25\x36\x45\x9b\x37\xa4\xe6\x5e\x09\x18\x1b\xc3\xe6\x80\x39\x52\x2c\x0e\x83\x65\x92\x0f\x96\xcd\xa0\xec\x31\xaf\x97\x69\x1e\x69\x8e\x89\xe1\x68\xde\xba\x8c\x4f\x4d\x53\xb3\xd9\x9f\x4a\x93\xb7\xa6\x8d\xb7\xa4\xbb\xdf\xac\x04\xf4\x37\x29\x30\x66\x4f\x3a\x9e\x53\xa0\x01\x77\xcb\x38\xf5\x48\x18\xfa\x39\x17\x2c\x0d\xe5\x00\x39\xe0\x41\xfa\x81\xc9\x0c\xd1\x68\x59\x99\x5e\x0b\xce\x05\x36\xff\x68\x9e\x86\x54\xea\x42\xa6\x9f\x25\x34\x05\xe8\xcc\x2c\x35\x41\x0b\x83\xb3\xe3\x07\xe6\xd0\xbe\x83\xec\xdc\xc0\xc9\x01\x86\x56\xf4\xbd\x02\xd7\x7c\xe0\x90\x30\xdb\xd1\x71\x3d\x6e\x90\x80\xc1\x1f\x9f\x0b\xb8\x82\x40\xf8\x98\x9b\x2a\x77\xb3\x82\x5f\x74\xbc\x82\xed\x07\x85\xc1\xd2\x85\xc2\x60\xd9\x73\x73\x7e\x9e\x0e\xde\x36\x11\x4e\xb1\x51\x6c\xeb\x72\xfd\x59\xf5\xfd\xe7\xdd\xa9\xba\x1f\xf8\xda\x55\xc7\x18\x1b\x60\xc8\x38\x42\x0e\x93\x1d\xa3\xdc\xea\x5e\xf9\x28\x52\xcf\xd4\xd7\x00\xa5\x72\x44\x5a\x54\x43\xab\x50\x3d\xba\xe6\xca\xfc\xda\x55\x75\xf4\xcc\xb5\xdc\x7f\x30\x9d\x84\x6a\xb1\xf9\xaf\x1b\xa4\x59\xce\x90\x69\x32\xa5\x6b\x96\x4c\x96\x1c\x5b\x45\x40\x66\x0c\x1e\xe2\x34\xc0\xd6\x21\xea\x9a\x66\xba\xe6\xeb\x69\xf2\xd5\xb4\xf1\x17\xe9\xee\x2f\x29\x01\xfd\x6a\xfa\x8c\x6e\xa6\xb9\xcc\x5b\x00\x53\xcb\x9c\xa5\x73\x3c\x64\xa3\xfc\xa3\x38\x2e\x20\x5c\x52\x98\xa2\xa6\x4b\x3c\xdf\x1b\xf0\x68\xc1\x01\x41\x08\x4b\x4d\xd7\x39\x1c\x29\x51\xaf\x40\x2c\x4c\x77\x61\x81\xe6\x99\x56\x2b\x2e\xc7\xb1\x94\x18\x3f\x77\x8b\xfd\xc2\x80\x03\x13\xd6\x2c\x04\x6c\xd3\x2c\xd1\xc0\xf5\xf3\xca\x10\x8d\xf7\x4f\x08\x53\x49\x69\x94\x43\x36\x49\xdd\xf8\x75\xd8\x95\xf2\x81\xc4\x4d\xe6\x38\x66\x20\x87\xb0\xf9\x3c\x17\xa8\xe3\xd5\x9c\xa3\x65\xc0\x14\xa6\x60\x06\x35\x0c\xd3\xec\xe7\xd3\xe4\xa5\xb4\xf1\x62\xba\xfb\x53\x4a\xcc\xef\x4e\x8f\x69\xc1\xda\x12\x70\x46\x2b\x80\x67\x2a\xf0\x4b\x4e\x01\x5e\xc0\x94\x5f\x74\x73\xcb\x89\x18\x8f\x7c\x96\x38\xda\xcb\xde\xd2\x90\x7d\xc0\x36\x67\xf8\x0b\xe1\xd2\x29\x31\xbf\x84\xf9\x76\x12\x2b\xa4\xa6\x1f\x94\xe6\x1d\x4f\xc6\x9c\x82\x32\x1d\x9c\x73\x8a\x12\x5b\xb7\xf8\x51\xcb\x9c\x73\x3d\xa7\xe8\x3e\x23\x41\xba\x59\xca\x0c\x5f\xf0\x84\x06\xb9\xc1\x9b\x8f\x81\x5b\x3e\x78\x4f\x18\x5f\xc4\xd1\x6c\xdb\x1c\x77\x61\x39\x6b\x13\xf7\x83\xea\x27\x8b\xbd\xca\x88\x83\xe9\xf0\xb1\xf9\xd1\xbc\x6d\x5d\xc5\xe7\x33\x26\x1f\x24\x11\xbc\xca\xbe\xb1\x8b\xbc\xa1\xcb\x78\xb6\xab\xfb\xfb\x2a\x82\xf9\xc5\x6d\xe7\x04\xda\xc5\x3e\x29\xe6\xd6\x15\x9c\x60\xd6\x29\x50\x33\xe7\x17\x8b\x14\x94\x70\xfc\x5d\xd0\x60\xce\x0f\x16\x98\x2c\x6a\xce\xf4\x74\xc5\xcd\xeb\x4f\x14\xd6\xb3\x5c\x8c\x25\xfe\x54\x2e\x5b\x28\x39\x37\x1f\xc3\xd6\x80\x80\x42\x10\x41\x49\x97\x39\x7a\x02\x1f\x94\x18\xa7\xad\x89\x51\xa2\x63\xca\x95\x53\x71\xcb\xe4\xcd\x6c\x73\x24\xc7\xbc\x3e\xd8\x80\x75\xe5\xd0\xc3\x9f\xa1\xc7\x1c\x10\x2f\x3e\xb9\x30\xc2\xc3\x66\x4f\xd6\xc9\x5d\x60\x1b\x8d\x97\x67\x67\x41\xc0\x10\x4e\xaa\x10\x1c\x87\xa4\xc5\xd2\x4f\x0e\x22\x9f\x60\x56\x8d\x74\xd8\xec\x39\xee\x07\x54\x1b\xd6\xcc\x39\x61\xce\x61\xdb\x86\x94\x0f\x0f\x11\xc3\x78\x21\xd7\x5e\x55\x03\xce\xa9\x31\x6c\xeb\xea\x52\xe5\xba\xd1\x0d\x83\x8f\xa4\xc8\x34\xdb\xbe\xf7\x19\x0f\x92\x09\xb2\x93\x4b\x83\xe6\x61\x33\x3f\xb4\x8a\x4d\x64\x26\x72\xa2\x72\x58\xdf\xd8\x38\xc1\x8d\x8d\x71\x32\x0a\xc6\xc6\xda\x6e\x23\x6d\x06\xb3\xb6\xcd\xb0\xcb\xd8\xc1\xc5\xb4\x4e\x66\x43\xf6\x67\x2e\xaf\x63\x36\x64\x4a\x4e\x10\xb9\x10\x8d\xe4\x2e\x70\x03\x3f\x65\xa0\x54\x87\xf3\xa9\xc3\xb6\xc4\x0d\x95\x03\xf1\x89\xdc\xc9\xfe\x1c\xbe\x51\x3f\xb8\x40\x83\x02\xd5\x8f\xee\xd1\x8f\x86\x51\xe0\x44\xb4\xe0\xe6\x06\xaa\xce\x4b\x8c\xc2\xfe\x5e\x16\x47\xd9\x2c\xb3\xa7\xc8\x09\x32\x59\xe1\x21\x0d\x93\x83\xab\x58\x1d\x53\x10\xb7\x47\x0b\xa6\x89\x05\xf3\x81\x6d\xe4\x7d\xdb\x8c\x17\xb6\x75\xff\xa2\xda\x06\x9e\xdb\xb6\x75\xbc\xa5\x8a\x50\x07\x93\x33\x84\xee\x21\x1c\xc7\x16\x67\x9c\xc0\xd3\x5b\x67\xe1\xf6\xc1\x6e\xc6\x33\x3d\x9c\x22\x5c\xc9\xcc\x36\x7e\x35\x9c\x01\x26\x54\x68\xf6\x4e\x86\xbe\x37\xc5\x33\x59\x4e\xb2\xcf\x42\xfc\x3d\x23\x3f\x96\xf8\xc7\xbe\xfa\x6e\x5c\xf6\xa5\x14\x79\x31\x65\x7c\x2a\xd5\xfd\x09\x85\xd2\xbd\x27\x75\xdc\x0f\x72\x60\xdd\x15\x7c\x10\xbb\x6f\x5a\x73\xec\x27\xcb\x1c\x49\x3c\x05\xe0\xaf\xdc\x10\x2b\x87\x71\xcc\x7e\xc0\xc9\xc1\x83\x43\x26\x44\xd1\xcd\x89\x8d\x96\x16\xf3\xa1\xe9\x2f\x09\x99\xf2\x4c\x81\x12\xf5\x4b\x45\x6a\x9b\xfc\x8e\x90\x7a\x24\xdf\x25\xe0\xa0\x35\x05\xa0\x6e\x6f\x6d\x87\x69\x25\xd2\x68\xd6\x01\xb8\xba\xa5\xf6\xe6\xb0\xd3\xb8\x0c\xe6\xb7\x4e\x7b\xc3\xe4\x41\x72\x8f\xb1\xdf\xda\xa7\x68\x50\x5f\x09\x9f\x95\xf8\xc6\xb5\xab\xac\x2e\x76\x40\xa7\x37\xbd\xf8\x08\x54\x8d\x4f\xf5\xc4\xd5\xd5\x3c\xa7\x93\x27\xbf\x19\x1f\xe8\x31\xfe\x73\x57\x5c\x5d\xdd\x62\x43\x17\xc8\x12\x6c\x53\x8a\xe6\xed\xa2\xa1\x4b\x40\xcf\x0e\xc1\xb8\x98\x84\xd9\xc6\x24\xcc\xfb\x9b\x7f\x4b\xb7\x1b\x56\x5c\x98\xcd\x3f\x1a\x3e\x01\xec\xde\x82\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\x89\x49\x96\x98\x64\xb9\x11\x49\x96\x2f\xf6\x92\xc1\x24\x94\x57\x27\x9f\x92\xfb\x78\x0b\x4e\x29\x34\x7e\xba\xd7\x78\x41\x43\xf9\xca\x2d\xb6\x4f\x81\x01\x4e\x3a\xa5\x36\x21\x7d\x96\x86\xf4\xc5\xb1\x33\x75\x17\x6c\x99\xb2\x06\x9c\xef\xc1\xe6\x38\x5f\xaf\xb1\xa7\x12\xe7\x53\xb2\x47\xac\x0f\xb1\x3e\xc4\xfa\x10\xeb\x43\xac\x0f\xb1\x3e\xc4\xfa\x10\xeb\x43\xac\x0f\xb1\x3e\xc4\xfa\x10\xeb\x43\xac\x6f\x23\xb1\xbe\x8b\x2f\xd1\x08\xd1\x44\x44\x13\x11\x4d\xbc\x88\xd0\xc4\x9f\xdd\x46\xee\xe4\x25\xdb\x73\x45\x7f\x89\xa9\xfb\xc0\x2f\xda\x0a\x3e\xa8\x6c\xd6\x6c\x7c\x3b\x6d\xfc\x5d\x9a\xdc\xa8\x9d\x3c\x22\xcf\x55\xdd\x99\x5f\x59\xa0\x51\x72\x9b\xe7\x8f\x97\xc9\x14\x68\x74\xbc\xc6\x95\xa2\x7d\xf2\xc8\xd4\x84\x74\x32\xdb\x97\xf0\x37\x5c\x35\xd0\x70\xd5\x40\xc3\xad\x0c\x34\x59\x22\x0f\x71\xec\xef\x14\x39\x01\xd8\xdf\x71\x32\x46\xb2\xab\xc0\xfe\xb4\xe7\x6c\xa5\x35\x8b\xf1\xfd\x1e\x62\xf3\x77\xe4\xf9\x79\x5a\xbb\x7f\x76\x50\xf6\xd8\xca\xcc\x15\x9d\x30\xa4\xa1\xf1\xd9\x1e\xe3\xe3\x5d\xe4\x72\x76\xbe\x7a\x2d\x4f\xb7\x86\xfa\x4e\xf3\x91\x46\xd9\x48\x6d\x02\x7e\xb9\x4d\x75\xca\xcf\x53\xf1\xa6\xf5\x7b\x20\xec\xbb\x06\xd8\xf7\xb1\xe6\xb0\xef\x21\xe3\x80\x80\x7d\xb5\xd5\x23\x93\xa3\xb5\xf7\x50\xdd\x41\x1b\x71\x60\xc4\x81\x11\x07\x46\x1c\x18\x71\x60\xc4\x81\x11\x07\x46\x1c\x18\x71\x60\xc4\x81\x11\x07\x46\x1c\x18\x71\x60\xcc\xf9\x44\x94\x16\x51\x5a\x44\x69\xd7\x0b\xa5\xfd\xea\x1e\x72\x95\xcc\xf9\x64\x5f\x96\x9b\xa3\xa1\xf1\xd9\x3d\xc6\xc7\xb5\xc6\xd8\x77\x34\x6e\x8c\x3d\xc3\x2f\xcb\xdc\x1a\x37\xc5\x16\x3f\x5d\x6c\xb5\xd6\x2b\xa4\x28\x90\x0d\xb1\xc5\xd3\xb6\xa5\x19\xf6\x44\x73\xd8\x6d\x8f\x71\x3b\xc7\xd8\xc4\x7d\xb1\x11\x36\x62\x6c\x88\xb1\x21\xc6\x86\x18\x1b\x62\x6c\x88\xb1\x21\xc6\x86\x18\x1b\x62\x6c\x88\xb1\x21\xc6\x86\x18\x1b\x62\x6c\x88\xb1\x21\xc6\x86\x18\xdb\x06\x63\x6c\x5f\x49\x93\x57\xf2\x2c\xbb\xbc\x1b\xe6\x7c\xa6\xf4\x64\xaa\x9d\xf1\x7b\x69\xe3\x77\xd2\x64\x97\x3a\xd0\xdd\x5d\x00\xba\xeb\x39\x3f\x58\x50\x42\x74\x4c\x80\x75\x32\xd7\x16\x68\x34\x26\xcf\x1c\x99\x9a\xb8\x9f\xfd\xba\x09\xf3\x19\x5d\x72\x8a\xe3\x68\xf7\x93\x71\xc0\xd1\x8e\x92\x23\xe4\xf0\xea\xf2\x19\xe1\x19\x9b\x26\x32\x7e\xb7\x97\x9c\x58\x41\xb2\x29\xcf\x6c\x2c\x05\xae\x1f\xb8\xd1\x72\x91\x2e\xd2\x62\xc2\xbf\x0e\x8d\xf7\xf4\x1a\xef\xdc\xde\x24\x1b\xf5\x3f\xb4\xd8\x88\x7c\x4a\xdc\xe7\x04\xbb\xcf\xa8\x7e\x9f\x36\x65\x41\xde\x07\x17\x34\xc8\x7f\xad\x3f\x03\xcc\x91\x5c\x43\x8e\xe4\xeb\x9a\x83\xb5\x0f\x1b\x67\x05\x24\xdb\x68\x61\x8a\xa4\xc9\xfa\xaf\x09\x53\x28\x11\xde\x45\x78\x17\xe1\x5d\x84\x77\x11\xde\x45\x78\x17\xe1\x5d\x84\x77\x11\xde\x45\x78\x17\xe1\x5d\x84\x77\x11\xde\x45\x78\x17\xe1\x5d\x84\x77\x37\x0e\xde\xfd\x78\x2f\x19\x6e\xde\x9b\x3c\x51\x52\xad\xf5\x23\x37\x7e\xa8\xd7\xf8\x5f\x5d\xe4\xfa\x5a\xcd\xe4\x38\xcc\xb8\xd4\x62\x75\x75\xdc\x58\xa8\x4d\xb0\xe2\xbd\x4b\x75\xda\xd3\xf1\x4a\xeb\xf8\x7e\xd8\x57\xa7\x8d\xa0\xa2\xdb\x1c\x54\x3c\x6e\x8c\xad\xad\x47\x15\x42\x88\x08\x21\x22\x84\x88\x10\x22\x42\x88\x08\x21\x22\x84\x88\x10\x22\x42\x88\x08\x21\x22\x84\x88\x10\x22\x42\x88\x08\x21\x22\x84\x88\x10\x22\x42\x88\xeb\x0b\x21\xfe\x59\x9a\x5c\xc7\x21\xc4\x30\xf2\x03\xa7\xa0\xa8\x18\x8d\x8f\xa7\x8d\x8f\xa6\xc9\x0e\xf1\x73\xc3\xec\x50\xa3\x40\xa3\x19\x7e\x1e\xe6\x86\x6a\xb9\xa1\x5f\xdd\x1d\xb7\x35\xaa\xd3\xd0\xa8\xe4\xe7\xc5\x0f\xaf\x1f\xa4\x4f\xd3\x9c\xf1\x2b\xbb\x8d\xb7\xa4\xe3\x0a\xf8\xdb\x72\xbe\xe7\xb1\xbd\xe0\xfe\xf1\x33\x31\x18\x06\x7e\x3a\xcd\x41\x8a\xa7\x9f\xcf\xdc\x2a\x4e\xe2\x25\xf0\xf7\xd3\x28\xee\x44\x34\xe5\xe7\xc7\x9f\xa6\xb9\x7d\xdb\x32\x83\x19\x0e\x3f\x1e\x20\x37\x72\x31\x5c\x47\xae\x01\x31\x5c\x41\x76\x7f\x28\xb5\x93\x88\x2f\xad\x29\x94\x78\x6b\x6d\x28\x91\x18\x3b\xc5\x2c\xc8\x53\x53\xcd\x81\xc4\x01\xe3\xce\xca\xc6\x3d\x62\xaa\xa7\x01\xf3\x49\x50\x37\x12\xeb\x27\x34\x91\xdc\x2e\x45\x32\x75\x7a\xa6\xbe\x4c\xac\x84\x4c\xa6\xfc\xf0\xe2\x10\x4a\x53\x51\x68\x65\xf6\x65\x12\x1a\xaf\xed\xf6\xa5\xae\x99\x1e\xf5\x17\x16\x98\x56\x70\x43\xe1\x27\x2c\xf8\x11\x33\x6e\xf9\xaf\x42\x3e\xe5\x88\xda\xcc\x8a\x5e\x34\x9d\x20\x70\x96\x6d\xf3\x94\x1f\xc9\x03\xdc\x8d\x61\x36\x9a\x19\xce\xd3\x62\xd1\xb6\x76\x88\xab\x75\x3d\xfc\xf6\x14\x79\x5b\xca\xf8\x89\x54\xf7\x8f\xc5\x7a\x78\xd4\xf7\x22\x87\x7d\x2e\xcc\xc2\xe3\xa8\x43\x7c\x3f\x61\x63\xc3\x40\x49\x0f\x11\xdc\x8a\x5c\x7c\x2d\xe8\xe4\x00\x60\x2a\x38\xe4\x7b\x54\x3f\xcc\xed\x91\x92\x9f\xb7\xad\x5d\xea\x67\x7d\x6a\x87\xc9\x21\xe3\x80\x75\xb7\x22\x17\xef\x06\x56\x71\xa1\xea\x93\x42\xb5\xba\xd8\x31\x9d\x37\xbc\xf3\xcc\xe4\xaf\x25\xbe\xb1\xd0\x7d\x41\x4a\xed\xd4\x34\xcd\xbb\x01\x15\x3e\x76\x18\x39\x5e\xde\x09\x24\xec\x15\x6b\x7d\xf1\xcc\x62\x8f\x73\x43\xb1\xb3\xe9\x72\x04\x47\xc2\xba\x2c\x8c\xf2\x34\x08\x12\x18\x6b\xc5\x2d\x4f\xd7\xbe\xa5\xeb\x31\x0b\x6f\x45\xb7\x9c\x73\x8a\x21\xb5\xad\xed\x61\x94\x77\xbd\xc4\x2d\x03\x52\x32\xbc\xee\x62\x93\x5b\x0a\xab\x72\x95\x8f\xe9\x97\xa3\xc4\x3d\x9f\x26\x8b\x46\xd4\x1d\xc8\x7b\x3e\x7c\xe6\xcc\x6b\x60\x35\x05\x65\x0a\xe1\xab\x9c\x13\xc5\x3e\x01\xb3\x61\xa5\x67\xe2\x14\x8b\x3e\x44\xab\x94\x09\x01\x4a\xa4\xee\xf3\x6e\x63\xf6\xae\xbe\x81\xfe\x60\x1f\xb9\xa7\xe6\x06\xaa\x5a\xd9\x2d\xfa\xc5\xf2\x02\x75\xa2\xc8\xc9\xcd\x33\xd7\x55\xea\x7b\xe3\x13\xbd\xc6\xf7\xba\x08\x11\xd7\x31\xd5\xf6\x5f\x45\x5e\xbf\x1e\x66\xf3\xa4\x37\x20\x59\x4f\xce\xc2\x78\x23\x6a\xbc\xb6\xc4\xdc\xfa\x63\x08\x00\x60\x0e\xe1\x30\xba\x11\x5d\x88\xb1\x8d\x9e\x04\x9c\xa4\x8d\x6d\x67\x6e\x86\xdb\x09\x23\xe0\xec\x50\xe5\x1c\x31\x26\x57\xbd\x67\x3c\xd1\x7c\x43\x38\x6c\x1c\x12\xfa\x3e\xb9\xb8\xc4\x8e\x59\x29\xe5\xc4\x46\xf1\xd4\x2d\xb5\xf7\xa4\x9d\xc6\x65\xf0\xe0\x18\x84\xc3\x20\x1c\x06\xe1\x30\x08\x87\x41\x38\x0c\xc2\x61\x10\x0e\x83\x70\x18\x84\xc3\x20\x1c\x06\xe1\x30\x08\x87\x41\xb8\xf5\x0e\xc2\x1d\x21\x87\x8d\x43\xd6\x01\x05\x3c\xdd\xa8\xa3\x56\x95\x3e\x5e\x35\x6e\x85\x31\x3c\x8c\xe1\x61\x0c\x6f\x0b\xc7\xf0\xbe\x78\x9e\x8c\x73\x08\xd2\xc9\x33\x4b\xd8\xf5\xbd\x80\x16\x5c\xf6\x5d\x26\x2b\x01\x06\xc1\xd9\x74\x98\x89\xb3\x44\x67\xe7\x7d\xff\x42\x05\xf7\xc8\x9b\xcf\x1b\x3f\xd1\x43\x5e\x55\x73\x98\x27\x17\x87\xba\xef\x6d\xcc\xc7\x7c\x56\x0d\x7f\x8e\x0f\x9f\x60\x92\xc8\x1c\x62\x57\x8f\xd4\x1a\xfb\xec\x50\xe3\x4b\x37\x39\x7c\x98\x45\x24\x0d\x91\xb4\x2c\x22\x69\x88\xa4\x21\x92\x86\x48\xda\x96\x41\xd2\xb2\x9b\x06\x49\x6b\xfb\x4c\x56\x8d\xa4\x65\x11\x49\x43\x24\x0d\x91\x34\x44\xd2\x10\x49\x5b\x7f\x24\x2d\xbb\xa5\x91\xab\x2c\x22\x57\x9d\x43\xae\xb2\x9b\x1d\xb9\xca\x5e\x84\xc8\xd5\xe4\xb3\x29\x52\xe0\x79\x57\xe7\xc9\x13\x90\x77\xf5\x30\x39\x4b\xce\xd4\xed\x7b\x55\x1b\xdf\x5a\x1c\xb2\x1b\xc3\x47\x6d\xe9\x8f\xf5\x4c\xf3\x74\xad\x73\xc6\x43\x22\x5d\xab\x11\x10\x27\x93\xb7\x1a\x4e\x39\x99\xfe\xfc\x4d\xd2\x00\x94\xeb\xe1\xdb\x9a\xe9\x34\xc3\xdf\x0e\xf3\x13\x37\x16\x81\xe3\x80\xd9\x1c\xc9\x93\x59\xa3\x6b\xd6\xcf\x2f\x77\xc3\x7f\xcd\x54\x66\x9a\x4c\xb5\xfb\xc5\x67\xdf\x95\x26\xef\x48\x1b\x6f\x4f\x77\xbf\x4d\xa9\xc4\xef\xa4\xce\x31\x83\x43\xec\x41\xfd\x95\xe9\xa1\x09\xbf\x47\xc7\xc2\x66\xa9\x59\x62\xef\x84\x19\x9b\xb6\x39\xe2\x99\xae\xc7\x11\x07\x3f\x30\xcb\x9e\x02\x2d\xf2\x66\x3e\x58\x9e\x2e\x7b\x26\x4f\x7a\x65\xdb\xb1\xf4\x84\xd9\x86\x06\x16\x83\x80\x02\xa4\xe1\x2f\x9c\x2f\x73\xae\x1c\x80\x71\x59\x0a\xfc\x1c\x0d\x61\x6b\x17\x7a\x42\x6c\x42\x36\x7f\xc3\xdc\x68\x87\xbd\x78\xd8\x1c\x30\x47\x8a\xc5\x61\xd8\xb8\xf3\xc1\xb2\x19\x94\x3d\xe6\x14\xb2\x2f\x5d\x5a\x2b\x62\x38\x9a\xb7\x2e\xe3\x53\xd3\xd5\xda\x4f\xa5\xc9\x5b\xd3\xc6\x5b\xd2\xdd\x6f\x56\x02\xfa\x9b\x14\xd8\x7a\x27\x1d\xcf\x29\xd0\x80\x7b\x2d\x3c\x07\x3a\x0c\xfd\x9c\xeb\x44\xba\x7f\xe0\x80\x83\xe5\x07\x26\xb3\xd3\xa2\x65\x65\x99\x2c\x38\x17\xd8\xfc\xa3\x79\x1a\x52\xa9\x7b\x98\x3e\x94\xc8\x0d\x80\x17\xb3\xd4\x04\xad\x07\xbe\x80\x1f\x98\x43\xfb\x0e\xb2\x73\x03\x27\x07\x10\x13\x73\xa3\xb9\xa6\xd1\xf3\xc4\x79\xe8\x0a\xec\xe1\xf8\x5c\x70\xbb\x05\x00\xc6\xbc\x38\xb9\x7b\x14\xfc\xa2\xe3\x15\x6c\x3f\x28\x0c\x96\x2e\x14\x06\xcb\x9e\x9b\xf3\xf3\x74\xf0\xb6\x89\x70\x8a\x8d\x62\x5b\x97\xeb\xcf\xaa\x47\x2a\x5e\x4e\x93\x1c\x57\x4d\x8f\x91\x47\x40\x35\x9d\x21\x1d\x58\xa1\x64\x9e\xdd\x64\xc8\x70\xc8\x93\x64\xc7\x28\xb7\x4f\x3b\x74\x27\x97\xdd\x69\x9f\x31\x4b\xce\x93\x9d\x23\x39\xb6\x53\x76\xec\x56\xab\xd7\xb5\x25\x7f\x83\x75\x6d\xe6\xd7\x07\x1a\xe8\xda\xbb\xb8\xb3\x60\xe6\xfc\x22\x73\xfd\xc5\x56\xde\x44\xef\x8e\xf3\x8b\xea\xe8\xdd\x51\x35\xd4\xba\x6a\x60\x78\xf1\xba\x06\xce\x64\xc9\xb1\x55\x24\x3c\x8f\xc1\xb3\x89\xa2\x0a\xc4\xc0\x11\x03\x47\x0c\x1c\x31\xf0\x2d\x84\x81\xa3\x85\xd9\xc4\xc2\xdc\x3c\x41\x82\xaf\xa7\xc9\x57\xd3\xc6\x5f\xa4\xbb\xbf\xa4\x5e\xd5\xaf\xa6\xcf\xe8\x6e\xb9\xeb\x99\x21\x77\xad\xcd\x59\x3a\xc7\x23\xea\x0a\xbe\x8a\xb7\x2c\xf1\x95\x80\xb0\x34\x5b\xd6\xf3\xbd\x01\x8f\x16\x1c\x78\x25\xc2\x33\xd7\x6d\x5e\x0e\x64\xab\xc5\x20\x4c\x09\x77\x61\x81\xe6\x99\x55\x5d\x5c\x8e\x43\xdd\xb1\x6a\x77\x8b\xfd\xc2\x61\x87\xc7\x35\x0b\x81\x93\x83\x75\xe2\xfa\x71\xcd\x5a\xbc\x39\x40\x16\x81\x7c\x2f\xe5\x90\x56\x14\x5c\x3a\xec\x4a\xf9\x40\xe2\x26\x73\xfc\x7b\x93\x43\xd8\x7c\x9e\x0b\xd4\xf1\x6a\xce\xd1\x32\x60\x0a\x53\x30\x83\x5a\x40\x04\xc6\x62\x30\x16\x83\xb1\x18\x8c\xc5\x60\x2c\x66\x4b\xc7\x62\x3e\x9f\x26\x2f\xa5\x8d\x17\xd3\xdd\x9f\x52\xbb\xed\xbb\xd3\x63\x5a\xa5\x72\xa9\x48\x9d\x90\xaa\x4f\x7f\x2a\xf0\x4b\x4e\x01\xf6\xe1\x29\xbf\xe8\xe6\x96\x13\x99\x58\xf2\x75\xc7\xa5\xce\xec\x85\x0f\xd9\x07\x6c\x73\x86\xeb\x11\xbe\x49\x96\xa8\xc7\x96\x69\xbc\x8b\x50\xd3\x0f\x4a\xf3\x8e\x27\x33\xc3\x82\x32\x1d\x84\x5a\x6e\xae\xb2\x2d\x7e\xd4\x32\xe7\x5c\xcf\x29\xba\xcf\x48\xf5\x3d\x4b\x4d\x27\x0f\x81\x0d\x7f\x90\xe3\xdc\xf9\xd8\xb4\xe4\x83\xf7\x84\xf1\x45\xdc\xde\xb6\xcd\x71\x17\x54\x92\x36\x71\x3f\xa8\x7e\xb2\x38\x98\x14\x71\x73\x1f\xac\x3f\x3f\x9a\xb7\xad\xab\xf8\x7c\xc6\xe4\x83\x24\x53\xcc\xde\xd8\x45\xde\xd0\x65\x3c\xdb\xd5\xfd\x7d\x95\x67\xf8\xc5\x6d\xe7\x84\x1e\x64\x4b\x74\xde\x5f\x32\x0b\x4e\x30\xeb\x14\x12\x18\x85\x32\xd4\x68\x30\xe7\x07\x0b\x4c\x16\x35\x67\x7a\xba\xe2\xe6\xf5\x27\x0a\x66\x8d\xb4\x49\x4a\xfc\xa9\x5c\x66\x2f\xe4\xdc\x7c\x6c\x58\xc3\xde\x08\x6e\x8e\x92\x6e\x08\x34\x32\x70\x54\xee\x7e\xb6\x26\x46\xa9\x37\x55\x04\x47\x65\x17\x26\x6f\x66\x9b\x1c\xc2\x02\x5d\xac\x5b\xab\x3d\xfc\x19\x7a\x98\xcf\x03\x7f\x25\x17\x46\x78\xd8\xec\xc9\x3a\xb9\x0b\x85\xc0\x2f\x7b\x79\x76\x16\xa4\xf5\xc1\x49\x15\x82\xe3\xc6\x8a\xb0\x80\x92\x83\xc8\x27\x98\x55\x23\x1d\x36\x7b\x8e\xfb\x01\xd5\x86\x35\x73\x4e\x98\x73\xf2\xec\xe9\x85\x7c\x78\x22\x27\x8c\x17\x72\x73\xba\x6a\xc0\x39\x35\x86\x6d\x5d\x5d\xaa\x5c\x37\xba\x6d\x83\xa1\x4e\x0c\x75\x6e\xd1\x50\xe7\x64\x81\x9c\xe0\xd0\xfc\x38\x19\x05\x68\xfe\x08\x39\x4c\x0e\xad\x02\xbc\x9c\x89\x9c\xa8\x1c\x36\x85\xab\x33\xb5\xe1\xea\x6b\x8c\xab\xf9\xd7\x1c\x6b\xda\x0d\x85\xae\xdb\x5e\x09\x64\xfc\xb6\x4d\x5e\xdd\x52\x65\x01\xef\x31\xd0\xa4\xbc\x40\xf2\x9e\x7c\x73\xc0\x78\x73\x17\xb9\xa9\x1e\xc8\xce\x7b\x0f\x0c\x05\xd4\xc9\x57\x38\xb7\x4d\x70\xf6\xfb\xd8\x25\x75\x50\x76\x18\x74\x3d\x01\xf6\xc9\xe7\x52\x3c\xb6\xb3\x17\x62\x3b\x6c\x95\xbe\x86\x9c\x23\x0f\xad\x38\xd6\x02\x33\x5f\x6b\xc0\xe5\xa6\xda\x2b\xf8\x32\xa3\xab\x40\x23\xf2\xd4\x0f\x34\x5f\xb4\x8f\x19\x8f\x74\x62\xd1\xf2\x7e\x00\xdd\x2f\x90\x66\xeb\x61\x7f\x40\x4b\x45\x27\x47\x57\xb6\x24\x46\xc4\x55\x9b\x65\x55\x64\x2f\x10\x97\x14\x2a\x02\xdf\x9d\x5a\x15\x88\x4d\x62\xf4\x7b\x95\xd1\xef\x7f\x48\x91\x05\x1e\x98\x9e\x23\xf9\x38\x30\xbd\x01\x1a\x6c\xfd\x94\x68\x73\x5d\x59\x2a\x6f\x02\x5d\x99\xf9\xdf\x57\x35\xd3\x95\x3d\xc2\x69\x69\x9a\x11\x74\xac\x61\x64\x7a\xfd\xb5\x63\x67\x82\xd2\xa8\x06\x9b\xa8\x41\x0c\x8c\xac\x4b\x60\x04\x11\x31\x44\xc4\x10\x11\xeb\x14\x22\x36\xf9\x91\x54\x9b\x61\x81\x69\x9e\x30\xf7\x20\x99\xd0\x12\xe6\x3a\x0c\x35\x98\xb5\x8d\x8f\x5d\xc6\x0e\x2e\xa6\x56\xed\x8f\x2a\xb3\xa1\x6d\x06\x49\xf6\x4d\x57\x34\xb3\x3f\x8e\x94\x9c\x20\x72\x21\xcb\x88\xc7\x27\x56\xe6\xb4\x1d\x2d\x39\x51\x6e\x7e\x33\x18\x25\x37\x54\x0e\x34\x00\x53\xbb\x13\x68\xc8\x6f\xd4\x0f\x2e\xd0\xa0\x40\xf5\xa3\x7b\xf4\xa3\x30\x7d\x5a\x70\x73\x03\x55\xe7\x25\x46\x61\x7f\x2f\x8b\xa3\x6c\x96\xd9\x53\xe4\x04\x99\xac\x70\x17\x87\xc9\xc1\x55\xac\xbf\x29\x28\x5c\x47\x53\xa8\x89\x29\xf4\x81\x6d\xe4\x7d\xdb\x8c\x17\xb6\x75\xff\xa2\xda\x4f\x9e\xdb\xb6\x75\x3c\xc2\x8a\xf8\x32\x93\x33\xe4\xed\x41\x0e\x04\x5b\x9c\x31\x83\x45\x6f\x9d\x85\xdb\x07\xdb\x22\x4f\xf3\x74\x8a\x70\x25\xb3\xff\xf8\xd5\x70\x06\xd8\x62\xa1\xd9\x3b\x19\xfa\xde\x14\xa7\x72\x38\xc9\x3e\x0b\xf1\xf7\x8c\xfc\x58\xe2\x1f\xfb\xea\xbb\xaa\xd9\x97\x52\xe4\xc5\x94\xf1\xa9\x54\xf7\x27\x14\x5a\xfd\x9e\xd4\x71\x3f\xc8\x81\x99\x58\xf0\x41\xec\xbe\x69\xcd\xb1\x9f\x2c\x73\x24\xf1\x14\x00\xf3\x73\x8b\xae\x1c\xc6\x09\x7b\x03\x4e\x0e\x1e\x1c\xd2\x20\x8b\x6e\x4e\xec\xd8\xb4\x98\x0f\x4d\x7f\x49\xc8\x94\xa7\x09\x96\xa8\x5f\x2a\x52\xdb\xe4\x77\x04\xee\x0d\xf9\x2e\x01\x6e\xaf\x29\x00\x75\x7b\x6b\x3b\x4c\x2b\x51\x14\xb3\xa9\x80\xc3\xfa\x24\xc2\xf0\x24\x1b\xef\x0e\x4f\x3e\x48\x26\x8c\xfb\xad\x71\xc5\x9e\x95\x49\xb0\x67\x35\x1c\xad\xf3\x5c\x5a\xc6\xff\x49\x93\x6e\x81\xa0\x97\x23\x3f\xcc\x39\x45\xd7\x2b\x0c\x2e\xee\x63\x93\xdf\x37\x68\xfc\x65\xda\xf8\x72\x9a\x5c\xa3\x1d\x7b\x52\x1c\xeb\x7e\x65\x81\x46\xc9\x7c\x13\x5e\xa6\x95\xb9\xb5\x40\xa3\x91\xf8\x82\xb3\xfc\xfc\x91\xa9\x09\x99\x6c\xdb\xbe\x0e\xb8\xed\x6b\xbe\x51\x22\x0f\xf1\x35\xcd\x76\x34\xb6\xa6\x8f\x93\x31\x92\x5d\x5d\xf3\x0d\xf9\x9c\xad\x94\x75\x19\xdf\x54\x2f\x20\xe7\xfb\x41\xde\xf5\x12\x91\x0b\xe3\x33\x69\xe3\x93\x69\x72\xb9\x7e\xac\x61\xab\x13\xf6\x56\x46\xb5\x93\x37\x75\xbf\x93\xba\x98\x5a\x9b\x1b\xa1\x48\x59\x7f\xa6\x97\xd8\xb2\xdf\x09\xe7\xbe\xaf\xd3\xf5\x84\x7a\xf9\x92\xef\x7a\x51\x68\xfc\x74\xaf\xf1\x42\x57\xdc\xdb\xa3\xdc\x5a\xc7\xe9\x71\x79\x7d\x9b\xfa\x4d\x5b\x70\x01\x6f\x15\x12\xb7\x09\x51\x77\x61\x0b\x6d\x93\x53\x50\x6d\xde\xae\xd2\x0f\x36\xdf\x20\x7a\x8d\x3d\x95\xcd\x60\x94\xec\x93\x11\x4e\x24\xda\x42\xa2\x2d\xa4\xac\xc7\x22\x23\x2c\x32\xc2\x22\xa3\xad\x53\x64\x84\x94\xf5\x48\x59\x8f\xc5\x1d\x58\xdc\x81\xc5\x1d\x58\xdc\xb1\x29\x8a\x3b\xd6\xa1\x57\x22\xb2\xda\x23\xab\xfd\x45\x92\x30\x8f\xac\xf6\x9d\x60\xb5\xff\xbd\xeb\xc9\xbd\x1c\xb8\x9d\xe5\x6d\x34\xeb\xf6\x50\xce\x05\xbe\xf7\x94\x3f\xab\xfa\x28\x87\x10\x6a\x37\x9e\xbb\xde\xf8\xff\xd2\x64\x27\x5c\x0d\x7d\x83\x21\xa3\x9c\x1f\x94\x42\x8e\xf7\xf4\xd1\xc0\xf7\x26\xfd\xd9\x8c\xc5\xce\xca\xb2\x6b\x74\x28\x50\x1c\xe5\x41\xfc\x36\x27\x8a\x9f\x23\xf7\x72\xe4\xee\x6e\x72\x17\x20\x77\x03\xe4\x4e\xd2\x57\x37\xdc\x03\xcf\x63\x2f\x0e\xd9\x62\x4e\x4d\x51\xba\x13\xcd\x01\xb8\x3e\xa3\x47\x00\x70\x30\xba\xc0\xe0\xe4\x0d\x12\x5d\x25\x1b\x67\x92\x77\xff\xda\x4e\x4d\xe2\x3d\x32\x67\xbb\x99\xd0\xef\x10\x27\xae\xa7\xdc\xb3\x80\x7a\x57\xc4\xd6\x57\x22\x78\x0c\xa6\x63\x7a\xf5\x2a\xd3\xab\x9f\x4f\xd5\x8f\xcd\xac\x4d\x19\x8c\xf0\xac\xed\x61\x72\x30\xce\xda\x5e\xd9\x10\x2d\xa6\x41\xb7\xa6\x55\x6a\x74\x2e\xaf\xa5\x61\xb2\x7f\xb7\x5b\x53\x1b\x7b\xab\xd2\x87\x9a\xe9\x8f\xdb\x20\x18\xbd\x5e\xda\x03\xb3\x82\xb6\x9a\x22\xc3\xac\x20\xcc\x0a\xda\xe0\xac\xa0\x4e\x5b\x89\x4d\x13\x7d\xda\x6a\x46\x4e\xee\x27\xfb\x8c\xbd\x96\xad\x00\x84\x6b\xf4\xac\x1d\x71\x45\x75\x7a\xce\xc5\x07\x3b\x18\xff\x9c\x26\x37\x72\x37\x86\xc7\xa0\x2b\x6b\x66\x8d\xff\x9e\x36\xbe\x90\x26\xaf\xe0\x47\x55\x0a\x6d\xdd\xec\x9f\x1b\x0b\x34\x82\xe8\x7c\x28\x72\x61\x31\xf1\xa7\x76\xe2\xcf\x37\x76\x11\x4b\x26\xa3\x54\x3a\x8e\xaf\x1f\x94\x09\xf6\xc6\xc7\x76\x75\x7f\x67\x5b\x9c\x80\x72\xa7\x74\x59\xe4\x09\xd5\x46\x87\xb2\x2f\x32\x37\x8b\x93\x2b\x12\x47\x8e\x8b\x4b\xdb\xec\xaf\x1c\x23\xf7\x91\x7b\x2b\x76\xfd\x7e\x92\xa9\xab\x02\xd8\x23\x31\xc1\xa9\x79\x4d\xbe\x33\x45\x8e\xf0\x97\x71\x0f\xd9\x0f\x2f\xc3\x26\x2b\x1a\x81\x64\xb9\x79\x79\x98\x1c\x8a\xcd\xcb\x95\x8e\xb1\xfa\x5a\x65\x30\x3c\x5b\xcb\x27\xe1\xaa\x27\xbe\x69\x0d\x43\xd4\xb2\xc8\x24\x5a\x3e\x8d\x2d\x9f\x49\x74\xe1\xea\xb8\x70\xf7\x90\xfd\xc6\x3e\x6b\xaf\xda\x8a\xae\xd3\x37\x30\xb5\xee\xd6\x23\xc3\xb4\x8f\x4c\xb7\xd6\xfd\x91\xa7\xe4\xb5\x48\xd2\xf0\x4b\x7d\xc6\x4b\xdb\x1b\x30\x21\x7f\x22\x25\xc0\x4c\x2d\x3f\xcf\x93\x01\x88\xd6\x1a\x42\xb6\x25\x79\xaf\x3f\x8e\x41\x42\x9c\x55\x44\xac\xdc\x88\x2e\xc4\xab\xb0\x27\x11\xcf\xd6\xc6\xb6\x33\xc3\x4b\x0d\x8a\x4d\x2e\xea\xae\x94\x1b\x92\x12\x58\xdf\x8c\x5c\xe2\x66\xe4\x46\xf2\xa3\x60\xf6\x20\x66\x0f\x62\xf6\x20\x66\x0f\x62\xf6\x20\x66\x0f\x62\xf6\x20\x66\x0f\x62\xf6\x20\x66\x0f\x62\xf6\x20\x66\x0f\x62\xf6\xe0\xfa\x66\x0f\x6e\xea\x92\x5d\x4c\x14\xc4\x44\x41\x4c\x14\xbc\x88\x12\x05\xdf\x98\x21\x0f\xad\x80\xa4\x96\xa3\xa0\x0b\xe5\xa8\x39\x06\xfa\xfe\x3e\xe3\x8b\xdb\x9b\x91\xdd\xfc\x6e\x2b\x40\xe8\x49\x71\xbb\x4d\x0b\x83\x1e\x69\x04\x83\xc2\x83\x36\x7a\x04\x44\x42\xab\x91\xd0\xd7\x37\x07\x3a\x1f\x31\x1e\x5e\x03\x4f\x53\xa3\x17\x42\x9a\x02\xb1\x08\x86\x22\x18\x8a\x60\x28\x82\xa1\x08\x86\x22\x18\x8a\x60\x28\x82\xa1\x08\x86\x22\x18\x8a\x60\x28\x82\xa1\x08\x86\xae\x33\x18\x3a\x41\xee\x37\xc6\xad\x51\x05\x86\xf6\xea\x60\x68\x23\x1f\x0f\xa1\x50\x84\x42\x11\x0a\x45\x28\x54\x83\x42\xff\x2d\x4d\x6e\x16\x50\x68\xc9\xa5\x4f\x47\xd4\x83\xb7\xa5\xe5\x80\x1a\x7f\x9a\x36\xfe\x38\x4d\xae\x4a\x1c\x7f\x72\xb1\x41\xc1\xc1\xcd\x05\x1a\x8d\xe8\x67\x9f\xc5\x92\x83\x3a\x25\x07\x3f\xf5\x38\xd9\x5f\xbb\xd6\xa3\x2e\x11\x26\x9c\x67\xfc\xf9\x63\xc6\xbf\xde\x41\x76\xa9\x1a\x90\xee\xdb\xb8\xb9\x1f\x08\x43\x45\xee\x64\x12\x4e\x06\x04\x32\x73\x03\x3b\x49\xd6\x82\x68\xb4\x95\xec\x97\x4d\x8e\xc8\x66\x11\x7d\x44\xf4\x31\x8b\xe8\x23\xa2\x8f\x88\x3e\x22\xfa\xb8\x65\xd0\xc7\xec\xa6\x41\x1f\xdb\x3e\x93\x55\xa3\x8f\x59\x44\x1f\x11\x7d\x44\xf4\x11\xd1\x47\x44\x1f\xd7\x1f\x7d\xcc\x6e\x69\x84\x2f\x8b\x08\x5f\xe7\x10\xbe\xec\x66\x47\xf8\xb2\x17\x21\xc2\x37\xf9\x08\x39\xca\xb1\xad\x83\xe4\x1e\xc0\xb6\xf6\x12\x9b\xf4\xd7\x65\x5f\x10\x38\xd4\xe2\x90\x0d\xa8\x50\x2b\x28\xd6\x53\x37\xd7\xce\x1c\xdb\x61\x6c\xe7\x0d\x3d\xa6\x9b\x27\xb6\x0d\x1a\x03\x22\x8f\x2d\x01\x84\xc9\xde\x1e\x90\x3f\xa7\x57\xe6\x5a\x5f\xde\xa9\xa3\x5f\x57\xf2\x6d\xc7\x74\x3c\x81\x74\xdd\xc4\x7f\xe8\x34\xd6\xc5\xa1\xa9\xfb\xc8\xbd\x64\xb8\x82\x67\x23\x43\x7a\x5b\x95\x31\xb2\x69\x21\x2d\xe0\x2a\x39\x25\xbe\x94\x22\x87\xf9\xd7\xbd\x9f\xec\x83\xaf\xbb\x9f\xac\x60\xe5\x91\x63\x9c\x9d\xe5\x10\x39\x10\xb3\xb3\xac\x6c\x84\x11\xde\xf2\x74\x98\x1c\xd4\x5a\x9e\xae\x6c\x88\xd5\xab\x97\x92\xdf\x21\xf5\x92\xf9\x4c\xbf\xae\x5e\xba\x45\x07\x5b\xad\x1d\xb0\x3f\x27\x34\x8d\x68\x9d\x2e\x35\xcd\xa8\x3a\xa5\xb3\x3a\xa7\x33\x8d\xcf\x11\x5f\x45\x7c\x15\xf1\x55\xc4\x57\xb7\x0e\xbe\x8a\xb6\x57\x13\xdb\x6b\xf3\x00\xd0\x5f\x4f\x93\xaf\xa6\x8d\xbf\x48\x77\x7f\x49\xbd\xaa\x5f\x4d\x9f\xd1\x5d\x3e\xd7\x33\x43\xee\xb6\x99\xb3\x74\x8e\x47\x6b\x15\x34\x12\x6f\x59\xe2\x2b\x01\x61\x69\x56\x9e\xe7\x7b\x03\x1e\x2d\x38\xf0\x4a\x84\xd7\xa7\x5b\x83\x1c\x24\x55\x8b\x41\xd8\x04\xee\xc2\x02\xcd\x33\x7b\xb3\xb8\x1c\x87\x51\x63\xd5\xee\x16\xfb\x85\x33\xc8\x5b\xef\x17\x02\x27\x07\xeb\xc4\xf5\xf3\x6a\xe3\x89\x37\x07\x88\x50\xcb\xf7\x52\x0e\xd9\x24\x75\x41\x39\xec\x4a\xf9\x40\xe2\x26\x73\xfc\x7b\x93\x43\xd8\x7c\x9e\x9c\x8c\xb4\xc6\x1c\x2d\x03\xa6\x30\x05\x33\xa8\xe5\xe4\x22\xce\x8f\x38\x3f\xe2\xfc\x88\xf3\x23\xce\xbf\xa5\x71\xfe\xcf\xa7\xc9\x4b\x69\xe3\xc5\x74\xf7\xa7\xd4\x6e\xfb\xee\xf4\x98\x56\x77\x5c\x2a\x52\x27\xa4\xea\xd3\x9f\x0a\xfc\x92\x53\x80\x7d\x78\xca\x2f\xba\xb9\xe5\x44\x96\x8f\x7c\xdd\x71\xe1\x32\x7b\xe1\x43\xf6\x01\xdb\x9c\xe1\x7a\x84\x6f\x92\x25\xea\xb1\x65\x1a\xef\x22\xd4\xf4\x83\xd2\xbc\xe3\xc9\xac\xa3\xa0\x4c\x07\xe7\x9c\xa2\xb4\xfe\x2d\x7e\xd4\x52\xec\xbb\x81\xba\x95\x93\x07\xd0\xdc\x1f\xe4\x18\x6a\x3e\x36\x2d\xf9\xe0\x3d\x61\x7c\x11\xb7\xb7\x6d\x73\xdc\x05\x95\xa4\x4d\xdc\x0f\xaa\x9f\x2c\x0e\x54\x44\xdc\xdc\x07\xeb\xcf\x8f\xe6\x6d\xeb\x2a\x3e\x9f\x31\xf9\x20\xc9\xf4\xa5\x37\x76\x91\x37\x74\x19\xcf\x76\x75\x7f\x5f\xe5\xb0\x7d\x71\xdb\x39\xa1\x07\xd9\x12\x9d\xf7\x97\xcc\x82\x13\xcc\x3a\x85\x04\xd8\xa0\x0c\x35\x1a\xcc\xf9\xc1\x02\x93\x45\xcd\x99\x9e\xae\xb8\x79\xfd\x89\x82\x59\x23\x6d\x92\x12\x7f\x2a\x97\xd9\x0b\x39\x37\x1f\x1b\xd6\xb0\x37\x72\xce\x72\x29\xdd\x10\x3a\x9d\xc3\x51\xb9\xfb\xd9\x9a\x18\xa5\xde\x54\xd1\x01\x95\xb9\x96\xbc\x99\x6d\x72\xb0\x08\x74\xb1\x6e\xad\xf6\xf0\x67\xe8\x61\x3e\x0f\xfc\x95\x5c\x18\xe1\x61\xb3\x27\xeb\xe4\x2e\x14\x02\xbf\xec\xe5\xd9\x59\x90\x32\x06\x27\x55\x08\x8e\x1b\x2b\xc2\x02\x4a\x0e\x22\x9f\x60\x56\x8d\x74\xd8\xec\x39\xee\x07\x54\x1b\xd6\xcc\x39\x61\xce\xc9\xb3\xa7\x17\xf2\xe1\x49\x82\x30\x5e\xc8\xcd\xe9\xaa\x01\xe7\xd4\x18\xb6\x75\x75\xa9\x72\xdd\xe8\xb6\x0d\x86\xd1\x30\x8c\xb6\x45\xc3\x68\x93\x05\x72\x82\x83\xd6\xe3\x64\x14\x40\xeb\x23\xe4\x30\x39\xb4\x0a\xf0\x92\xf7\x69\x69\x0a\x20\x67\x6a\x03\xc8\xd7\x18\x57\xf3\xaf\x39\xd6\xb4\xad\x82\xc9\x35\xc8\xc1\xeb\x03\xcb\x17\x63\x13\x82\xff\x94\x21\x59\x9e\x98\xee\xd1\x68\xc9\x0f\x2e\x30\x57\xad\x69\x72\xba\xeb\x15\x02\x1a\x86\x8a\x34\xdf\xf8\xbd\x3e\xe3\x7b\x69\x72\x45\x3c\x06\xa0\xe9\xd0\x56\x2d\xe9\xf7\x4e\xf0\x2b\x33\xb7\xb2\x63\xa7\xd4\xe9\x7a\xe4\x4e\x9c\xd2\xe6\x5e\x6a\x8f\xf1\x08\xc6\x5e\x88\x60\xb0\xb5\xb8\x8f\xec\x25\x76\xdd\xd8\x85\x26\x8d\xc5\x21\x5b\x4c\x69\x0d\x04\xf5\x05\x1a\x91\xa7\x1e\x6e\xbe\xe6\xee\x36\xee\x12\xeb\xac\xea\x7d\x88\xb5\x26\xe7\xa2\x2f\xcd\xee\x4f\xef\xac\x14\xfe\x4d\xb2\x5d\x41\x6d\xf9\xdf\x2e\x0e\xaf\xe3\x2b\xc8\x8e\x91\x2c\x39\x56\x11\x3e\x5d\xf1\x3b\x40\x20\x0f\x83\xa8\xab\x0c\xa2\xfe\x7c\xaa\x1d\x3a\xe0\x38\x0f\xa5\x1e\x25\x47\xe2\x50\xea\xfa\xea\x12\x68\x76\xd1\x9a\x2e\xa9\xb1\x7f\x35\xd3\x2b\x99\xb7\x5e\x55\xa9\x4b\xc4\xf6\xc9\x96\xb9\xd4\x1f\xb7\xf1\x9f\xd6\x53\x7d\x74\x26\x12\x8a\xea\xa4\x89\x3a\x41\x34\x7e\x5d\xd0\x78\x84\x61\x10\x86\x41\x18\xa6\x53\x30\xcc\xe4\x47\x52\x64\x9a\x67\x30\x3d\x48\x26\xb4\x0c\xa6\x0e\x79\xa4\xed\x75\x7c\xa5\x49\xd0\x31\xff\xe1\x29\xb3\xb6\xb1\xb1\xcb\xd8\xc1\x5f\x00\xc9\x7e\x77\x77\xa5\x55\xb0\xa7\xaa\x19\x6b\x6d\x57\xc3\x82\x36\x81\xeb\x64\x29\x60\x07\xd6\xad\x66\x9f\x60\x07\x56\xec\xc0\xba\xc1\x1d\x58\xd7\x05\x5b\x6a\xda\x86\xb5\x63\xbb\x43\xe3\x96\xac\xe2\x8a\x4b\xa2\x25\xeb\x0f\xf6\x91\x01\x8e\x86\x86\x91\x1f\x38\x05\xaa\x41\xa1\xe2\x97\x5c\xd1\xd1\x81\xcf\x97\x7a\x8d\xef\xa4\x09\x11\x07\xd9\xb6\x78\x4b\x0d\xd4\x73\x86\x1f\x1e\x65\xd7\x66\xae\x67\x27\x88\x5f\xce\x0e\xe9\x87\xda\x0c\x79\x3e\x41\x46\xf9\xb2\xbc\x97\x0c\xc3\xb2\xdc\x4f\xf6\x91\xbd\x75\x97\xa5\x7c\x64\x30\x3b\xe2\x49\xad\x15\xf4\x7c\xa4\xf9\xb2\x3c\x60\xdc\x2d\x96\x65\x52\xec\x62\x4d\x26\x66\x93\x80\x3d\x5f\xdc\x99\x10\xbd\x55\x1b\xf3\x4c\x48\xff\x46\x71\xce\x3a\xbc\x80\x2c\xb0\xcb\x54\xd8\x02\xab\x78\x03\x68\x03\x20\xe4\xb9\x4a\xc8\xf3\x3d\xa9\xf6\xe8\x80\x07\x38\xe8\x39\x42\x8e\xc6\xa0\x67\x67\xb4\x49\x07\xd5\x45\x13\x48\x35\xf3\x6f\x57\x26\xb4\xc9\x75\x12\xf5\x4c\x2a\x90\x1b\xf8\xcf\xeb\xa1\x3f\x10\xf1\x44\xc4\x13\x11\x4f\x44\x3c\x11\xf1\x44\xc4\x73\xc5\x88\xe7\x0b\x6d\xda\xfa\x27\x38\x6c\x9a\x25\xc7\x34\xd8\xb4\x33\x7b\x7f\x53\x14\xb2\x93\xd6\x41\xf6\x5f\x76\x27\xb6\xff\x3b\x9b\xc0\x9b\x09\xa3\xa0\x1b\x7c\xf0\x0e\xdb\x04\x88\x6d\x6e\x35\x4b\x04\xb1\x4d\xc4\x36\x37\x18\xdb\x5c\x27\x10\xa9\x29\xba\xd9\x41\xcd\x3f\x79\x88\x1c\x30\xee\xb6\xee\x52\x48\xe5\xab\x74\x7c\x53\xbf\xac\xf3\xc4\xea\xc6\xcb\xbd\x64\x68\xd0\x29\xb9\x83\x8b\xb2\x21\x5d\x9d\x1c\xcc\x92\x9f\x8f\xe8\x42\x09\x0a\x8f\x8d\xff\xbb\xd7\xf8\x40\x17\xd9\x91\xf3\x03\xd8\xbb\x96\x44\x7d\x91\x97\x77\x17\xdd\x7c\xd9\x29\x26\x7a\xd0\xa9\x5a\xbe\x29\x3f\x7f\x46\x0c\xd1\x96\x56\x73\x76\xe6\x76\xb8\x60\xd4\x0f\xa8\x1e\xe5\xd3\xee\x73\xc2\x0d\x37\x3b\x03\xf1\xe4\x85\xfa\x61\xdd\xb6\x37\x8b\x93\xeb\xff\xb6\xda\xeb\xff\x72\x83\xc0\xc4\x38\xbf\xce\xc9\xe6\xdf\x40\xc6\xe8\xe5\xab\x5d\x93\x39\xa9\x91\x05\x66\x59\xd8\xe7\x0d\x99\x96\xb1\xcf\x1b\x32\x81\x20\x13\x08\x32\x81\x6c\x25\x26\x10\xec\xf3\x86\x7d\xde\x90\x81\x01\x19\x18\x90\x81\x01\x19\x18\x36\x05\x03\xc3\x45\x98\x28\x85\xed\xdf\xb0\xaa\x1d\xdb\xbf\x5d\x3c\xe4\xd0\xc6\x73\x7d\x64\x84\x27\x36\xf2\x50\x63\x2b\xe8\x62\xde\x0d\x83\x32\xf8\xfe\xb3\xe5\x7c\x81\x46\xa1\xf1\xd1\x5e\xe3\x0f\xbb\xc8\x2e\x3e\xc4\x93\x8b\x43\xdd\x3f\xd0\x32\xce\x38\xa6\x06\xcb\xc2\x60\x6d\xc2\x1b\x6d\xb8\x80\x07\x3f\x2b\x10\xc7\xca\x3b\x5e\x1c\xc8\x63\xdb\x01\xc6\xa6\xc8\x7b\x4b\xc8\xe3\x6b\x9a\x23\x8f\xf7\x18\xfb\x05\xb6\xc8\xd7\x07\x51\x38\x64\xe5\x9b\x48\x82\xef\x88\x42\x22\x0a\x89\x28\x24\xa2\x90\x88\x42\x22\x0a\x89\x28\x24\xa2\x90\x88\x42\x22\x0a\x89\x28\x24\xa2\x90\x88\x42\x22\x0a\x89\x28\x24\xa2\x90\x88\x42\x5e\x32\x28\xe4\x0b\x8f\x92\x2b\x64\x6e\xa3\xe7\xe7\x69\x68\xfc\xf4\xa3\xc6\x97\xef\x88\xf3\x16\x2d\x6e\x5d\x06\x62\x5f\x94\x8a\xd3\x9f\x33\x2f\xb8\x5e\xde\x3c\xe5\xe7\x69\xe6\x15\xec\x1c\x91\x61\xe8\xe7\xe9\x26\x87\xf4\xb2\x08\x6f\x21\xbc\x85\xed\xb6\x10\xde\x42\x78\x0b\xe1\xad\xad\x03\x6f\x6d\xa2\x6e\x52\x9b\x06\xde\xc2\x36\x47\x08\x6f\x21\xbc\x85\xf0\x16\xc2\x5b\x1b\xd1\xe6\x68\x4b\x63\x45\xd8\x87\x65\x2b\xf7\x61\xc9\x5e\x84\x58\xd1\xe4\x39\x72\x2f\x4f\x85\xba\x9b\xdc\x05\xa9\x50\x03\xe4\x4e\xd2\x57\xb7\xee\x38\xe7\x07\x50\x74\x7c\xca\xcf\x43\x8d\x69\xd3\xb4\xa7\xe3\xcd\x33\x9a\x6e\x33\x6e\x8d\xab\x25\x79\x36\x13\x1b\x3e\xc9\x29\x55\xbf\x69\x39\x64\x4e\x59\xff\x65\x67\x0c\x6f\x5d\xc1\x77\x19\xd3\xe1\x48\xd6\x55\xfc\x9f\x1d\xc0\xb2\x38\xf4\x74\x98\x1c\x22\x07\x2a\xe8\x1a\x7a\xc8\x1d\x2d\xc9\x10\xb9\x19\x90\x73\x6e\x95\x9c\x73\x5f\x48\x91\x83\xfc\xd3\x1d\x22\x83\xf0\xe9\xf6\x91\x56\x97\x1d\x39\xc2\x89\xe6\xee\x21\xfb\x63\xa2\xb9\x15\x5c\x7e\x1f\x27\xab\x39\x40\xee\xd6\xc8\x6a\x56\x70\xfd\xc6\x6b\x8d\x92\x1f\x46\x24\xf3\xfe\xfe\x58\x6b\x5c\x2f\x18\x86\x34\xba\x26\x7f\x8e\x6b\x90\x6e\x7e\x88\x6b\x90\x51\x75\xbc\x03\xba\xa4\x33\x54\x74\x88\x8b\x22\x2e\x8a\xb8\x28\xe2\xa2\x5b\x07\x17\x45\xb3\xaa\x89\x59\xb5\x79\x80\x63\xa4\x01\x5d\x17\x1a\x50\xc4\xe7\x11\x9f\x47\x7c\x1e\xf1\x79\xc4\xe7\xb7\x34\x3e\x8f\x6c\xd0\xc8\x06\x8d\x6c\xd0\x9d\x62\x83\xc6\xf0\x17\x86\xbf\xb6\x6a\xf8\x6b\xb2\xb0\xce\x6d\x1a\x33\xb5\xc1\xdd\x6b\x0c\xd1\x47\x39\xd6\xb4\xa4\x5d\x80\x72\xfb\x79\x68\x7f\xe7\x2a\xd2\x9d\xc8\xd5\x16\x1d\xaf\x06\x4b\x81\xff\xf4\xb2\xf1\x73\x57\x19\x6f\x4a\xc7\x18\xf5\x1d\x39\xdf\xf3\x98\xa1\x70\xff\xf8\x99\x38\x93\x39\xf2\x4d\x38\x5b\xe1\xd5\xd7\x8b\xd3\x38\x60\x7d\x3f\x8d\xd8\xaf\x53\xec\x94\x7d\xdb\x32\x83\x19\x4e\x82\x70\x80\xdc\xc8\xdf\xca\x75\xe4\x1a\x78\x2b\x57\x90\xdd\x1f\x4a\xed\x24\x62\x72\x4d\x31\xfa\xe9\xe6\x22\x1d\x34\x06\x6a\x89\x14\x66\x22\xb0\xe9\x24\x5e\x7f\x6b\xed\x57\x4a\x8c\x9d\xe2\x89\x48\x77\x4d\x71\x4c\x3d\xd4\xba\x38\xa6\xca\x1d\x11\x47\xf3\xa9\x77\x42\x62\xd6\x8f\x6a\xe2\xd8\xa3\xc4\x71\x7a\xa6\x91\x3c\xba\x93\xf2\xf0\xc3\x0d\x5c\x1f\xb5\x39\x73\xeb\x3c\x79\x0b\x42\xce\xfc\x84\x26\x90\x5e\x29\x90\xb1\xf1\x13\xe3\x67\xc6\x1b\x88\xe4\xc6\x84\x48\x78\xf4\xe4\xd2\xf9\x68\xf6\xfd\xa4\x26\x94\x3e\x29\x94\xd3\x53\x67\x26\x4e\x9f\x9a\x69\x20\x95\x9b\x12\x52\x11\x37\xbf\x74\xc4\x32\x5c\xf3\xe3\x79\x60\x7c\x64\xac\xe5\x8f\xe7\x01\xea\xe4\x2f\x1d\x6d\x92\x7d\x8b\x26\x90\x1e\xa5\x4d\x46\xce\x8c\x3e\xd0\x40\x22\x37\x24\xd5\x09\x74\x21\xde\xb0\x35\xd2\xc2\x53\xc6\x22\x69\x41\xcc\x93\x47\xc8\x61\xe3\x90\x75\x40\xd5\x6b\xde\xa8\x93\xd6\x57\xde\xa7\x9a\xb8\x7e\x96\x9c\x37\x9e\xe8\x7e\x4c\x1a\x0c\xd9\x29\x27\xe2\x48\xd0\x3c\x35\x1f\x9a\x3e\x61\xb2\x31\xc1\x08\x0c\xa9\xb2\xe2\x72\xe5\x20\x60\xde\x32\x17\xb3\xb4\xff\x23\xdf\x64\x06\x82\x6d\xc1\x3c\x74\x1b\xe2\xe7\x7b\xc9\x60\x05\xeb\xd4\x2c\x8d\x1c\x49\x3d\x55\x93\x63\xea\xef\x7b\x8c\xaf\x77\x91\x57\x28\x8e\x29\xb8\x60\xe3\x89\xa6\x0e\x25\x88\xa6\x60\x52\x75\x38\xa6\x8e\xfb\xc1\x48\xb1\xa8\xa8\xa8\xda\xd7\xff\xe5\x12\xe2\x9c\x7a\xa2\xf9\x27\x73\xd8\x38\xb4\x0a\x3a\x29\x78\x31\xa4\x25\x4e\x2b\x24\x9e\xc2\xca\x3c\x24\x9e\xc2\x0c\x14\xcc\x40\xc1\x0c\x94\x2d\x94\x81\x82\xc4\x53\x48\x3c\x85\x91\x7f\x8c\xfc\x63\xe4\x1f\x23\xff\x9b\x22\xf2\x8f\xb4\x50\x48\x0b\x75\xb1\xc4\x3a\x91\x16\xaa\x13\xb4\x50\x1f\x7f\x5c\xc2\x84\xc1\xac\x93\xb3\x25\x5c\x04\x43\x89\x16\x9e\x83\x8b\x43\x83\xb9\x62\x39\x8c\x98\xcb\x52\xa4\xa1\xf1\xa6\xc7\x8d\x17\xf6\x90\x6b\xd9\x05\x23\xfa\xf9\x10\x48\x68\xcc\x22\x35\xca\xc7\x99\xf6\x8b\x34\x03\x84\x53\xd3\x95\x83\x9c\x1d\xd2\xce\xd9\xe4\xf8\x1d\x12\x4c\x21\x8c\x85\x04\x53\x08\x63\x21\x8c\x85\x30\xd6\x16\x82\xb1\x36\x51\x9d\xd0\xa6\x81\xb1\xb0\x80\x05\x61\x2c\x84\xb1\x10\xc6\x42\x18\x0b\x09\xa6\x30\xc3\xfe\xd2\x41\x9d\x36\x7d\x86\xfd\x45\x49\x30\xf5\x04\x19\xe5\x79\x4f\xf7\x92\x61\xc8\x7b\xda\x4f\xf6\x91\xbd\x75\x69\x62\x00\x9a\x5a\x1c\xb2\x35\x64\xa8\x25\x9e\xa9\x26\xfc\x50\x4f\xe5\x9b\xa7\x42\x8d\x18\x47\x45\x2a\x54\x5d\x7c\x4c\x64\x47\x69\x93\x4b\x66\x63\xbf\x6d\x57\x1d\xac\xec\x5a\x45\x49\xa5\xc3\x62\xb7\xf3\x5f\xd7\x09\x18\xe3\x38\x56\x96\x1c\x23\xf7\x55\xb0\x55\xd9\xa4\x7f\x25\x2f\x04\xd9\x15\x90\xb4\x6a\x95\xa4\x55\x7f\x95\xaa\x5f\x24\x74\x94\xeb\x89\x83\xe4\x1e\xd0\x13\x7b\xc9\x0a\x97\x25\x19\xe3\xa4\x56\x47\xc8\xe1\x98\xd4\x6a\xe5\xa3\x8c\x73\x6e\xab\xfb\xc8\xbd\x1a\xb7\xd5\x8a\x87\x69\xae\x97\x80\x81\xaa\x45\xbd\x54\x23\x7d\x79\x25\x3a\x2a\xf3\x4f\xfd\x75\xf4\x92\x59\x93\xf4\x4a\xd7\x51\x36\x3f\xa3\x96\x8e\x52\xd7\x74\x4e\x5b\x21\x1f\x16\xc2\xb8\x08\xe3\x22\x8c\x8b\x30\x2e\xf2\x61\x21\x1f\x16\xf2\x61\x21\x1f\x16\x86\x13\x30\x9c\x80\xe1\x04\x0c\x27\x60\x38\xa1\x2d\xe1\x04\xe4\xc3\x42\x3e\x2c\xe4\xc3\x42\x3e\x2c\x8c\xd6\x61\xb4\xae\xed\x7c\x58\x6d\xa5\xbd\x6a\x1a\x02\x5b\x09\x1f\x56\x6b\xb0\x73\xe3\x68\x57\x53\x20\xba\xfd\x6c\x59\xdf\xee\x21\xd7\x2b\xb6\x2c\x45\xfd\x20\x28\xb3\x8c\x97\x7b\x8c\x2f\x6a\x04\x26\x37\x06\xd4\xc9\x57\x38\x9e\x8a\x2f\x22\x73\x0d\x3b\x2a\x7a\xc2\xc8\x1f\xdb\x0b\x5e\x4f\x3e\xcc\xdb\x6c\xec\x85\x36\x1b\x6c\x01\xd8\xa4\x9f\x64\x9a\x77\xc8\x90\xd3\x69\xfa\xc6\x1f\x6c\xfe\x16\x7b\x8d\x3d\x0d\x29\x96\xd4\xbd\x9e\xba\xa9\xf6\xf2\xb9\xcc\xe8\x2a\xd0\x88\x74\xbf\x4b\x6b\xb0\x73\x4b\x40\x4b\x45\x27\x47\xeb\x0a\xf7\xdf\x89\x13\x3a\x2a\xdf\xec\x31\x72\x1f\xb9\xb7\x22\x94\xb9\x22\x01\x23\x2c\x86\x81\xcc\x55\x06\x32\xdf\x99\x5a\xeb\xc7\x9d\xe5\xd1\xca\xc3\xe4\x50\x1c\xad\xdc\x18\x05\x51\x5f\x29\x24\x08\xb5\xea\x2b\x88\x52\x39\x22\x99\x7f\xbc\x32\x56\x10\x86\xb0\x47\x1d\x4d\x27\x5c\xa7\x37\xd1\xe9\x94\x4a\xe8\x4c\xbc\x10\xd5\x44\x13\x35\x81\x98\xf5\xba\x60\xd6\x08\x56\x20\x58\x81\x60\x45\xa7\xc0\x8a\xc9\x8f\xa4\xda\xec\xb1\x4d\xf3\x54\xa2\x07\xc9\x84\x96\x4a\xd4\x61\x2f\xd0\xac\xbd\x4b\xef\x32\x76\x70\x31\x91\xb6\x1a\x05\xd9\x3f\xde\xad\xd1\xad\x96\x9c\x20\x72\x21\x6d\x83\x03\xbe\x75\xfd\x83\x6b\x4b\xcc\x27\xef\x98\x29\x70\x43\xe5\x40\x03\x70\xbf\x3b\xd9\x9f\xc3\x37\xea\x07\x17\x68\x50\xa0\xfa\xd1\x3d\xfa\xd1\x30\x0a\x9c\x88\x16\xdc\xdc\x40\xd5\x79\x89\x51\xd8\xdf\xcb\xe2\x28\x9b\x65\xf6\x14\x39\x41\x26\x2b\x3c\x93\x61\x72\x70\x15\x6f\x1d\xe8\x34\xd1\x00\x69\x66\x80\x7c\x60\x1b\x79\xdf\x36\xe3\x85\x6d\xdd\xbf\xa8\xb4\xf8\x73\xdb\xb6\x8e\x9f\x52\x11\x70\x63\x72\x86\x44\x26\x08\x0a\xb3\xc5\x19\x57\xa5\xf7\xd6\x59\xb8\x7d\xb0\x19\xf1\xbc\x37\xa7\x08\x57\x32\xab\x8b\x5f\x0d\x67\x80\x05\x14\x9a\xbd\x93\xa1\xef\x4d\xf1\xf2\xec\x93\xec\xb3\x10\x7f\xcf\xc8\x8f\x25\xfe\xb1\xaf\xbe\x03\x95\x7d\x29\x45\x5e\x4c\x19\x9f\x4a\x75\x7f\x42\xc1\x77\xef\x49\x1d\xf7\x83\x1c\x18\x67\x05\x1f\xc4\xee\x9b\xd6\x1c\xfb\xc9\x32\x47\x12\x4f\x01\xb8\x27\xb7\xa3\xca\x61\x9c\xc1\x34\xe0\xe4\xe0\xc1\x21\x2f\xac\xe8\xe6\xc4\x3e\x49\x8b\xf9\xd0\xf4\x97\x84\x4c\x79\xde\x54\x89\xfa\xa5\x22\xb5\x4d\x7e\x47\xa8\xa7\x97\xef\x12\xf0\xc7\x9a\x02\x50\xb7\xb7\xb6\xc3\xb4\x12\x89\xee\x1d\x47\x7b\x6e\xa9\xad\xd9\x77\x1a\x97\xc1\xec\xda\xab\xd8\x27\xef\x21\xfb\x8d\x7d\xd6\x5e\xc5\x7b\x7b\x5d\x82\xf7\x56\x5e\x53\x4d\x78\xdb\x76\xcc\xef\x87\x7b\xc9\x5e\x4e\x5b\x11\xe6\xe6\x69\xbe\x5c\x74\xbd\x82\x46\x57\x21\x38\x6e\x03\xd7\x0f\xdc\x68\x39\x57\x74\xc2\x90\x86\xc6\x17\x7a\x8c\xdf\xef\x22\x57\xc4\x57\xb0\xfd\x69\xb9\x45\x76\x5b\x31\xd6\x28\x1b\xab\x4d\xbc\xb6\x16\x5c\x30\xa3\xa6\x73\x76\x28\x71\x97\x13\x6e\x18\x6d\x72\x02\x8c\x0d\x21\xb0\x6d\x85\x60\x76\x65\x2c\xb7\x55\x6b\x48\x12\xde\xea\xaf\x23\xf9\x25\x20\xf3\x07\x32\x7f\x20\x81\x2d\xa6\x8c\x63\xca\x38\xa6\x8c\x6f\x9d\x94\x71\x24\xb0\x45\x02\x5b\x4c\xd5\xc5\x54\x5d\x4c\xd5\xc5\x54\xdd\x4d\x91\xaa\x8b\x04\xb6\x48\x60\x7b\xb1\x24\x27\x22\x81\x6d\x27\x08\x6c\xbf\xf6\x38\xe9\xad\xd9\xe7\xaa\xe4\xe7\x43\x9a\x2b\x07\x6e\xb4\x0c\x47\x5c\x1a\x1a\xff\xcf\xe3\xc6\xfb\xf7\x54\x35\xb8\x1a\x6c\xcc\x59\x3b\x05\x71\x77\x18\x88\x87\x07\x39\x73\x6d\x65\x3f\xaa\xe4\x39\x9b\x1c\xb8\x43\xe6\x5a\xc4\xaf\x90\xb9\x16\xf1\x2b\xc4\xaf\x10\xbf\xda\x42\xf8\xd5\x26\xaa\xe8\xdf\x34\xf8\x15\x96\x9a\x23\x7e\x85\xf8\x15\xe2\x57\x88\x5f\x21\x73\x2d\xd6\xc2\x5e\x3a\x70\xd3\xa6\xaf\x85\xbd\x28\x99\x6b\x57\x96\xf0\x64\x8b\x24\x7a\x81\x34\xd9\x55\x30\x51\x5b\x68\x6c\x1f\x6b\x9e\xeb\x74\xc8\x38\x50\xd5\xa9\xbb\x4e\x8b\xef\xe4\x04\x89\xf5\x3b\xbb\xaa\x00\xb3\x6e\x45\x5c\x5b\x8d\x8d\x09\xfa\xda\x75\x42\xc7\x38\x98\x75\x9a\x9c\x24\x0f\x56\x64\x56\x37\xc8\xa7\x6f\xfa\x56\x30\xb5\x1a\x4b\x40\x57\x59\x02\xfa\xa3\x69\xf2\x6a\x5e\xc3\x39\x49\x1e\x88\x6b\x38\x1b\xd6\x77\x34\x5d\x8f\xab\xa8\x19\x69\x3e\x66\x5d\xca\xdd\x95\x94\xbb\x34\xbd\x8d\xd4\x61\x1d\xd5\x51\xcd\x08\x75\x33\x7f\xdb\x5f\xa5\xc3\xf6\xd4\x24\xb9\xad\xd6\x67\x82\xea\x36\xa1\xcf\x62\x92\xdb\x4e\x6b\x36\xa4\xba\x45\xdc\x17\x71\x5f\xc4\x7d\x11\xf7\x45\xaa\x5b\xa4\xba\x45\xda\x00\xa4\xba\xc5\xf8\x03\xc6\x1f\x30\xfe\x80\xf1\x07\x8c\x3f\xb4\x25\xfe\x80\xec\x31\xc8\x1e\x83\xec\x31\x48\x75\x8b\xe1\x3d\x0c\xef\x6d\x21\xaa\xdb\x8e\xc2\xd1\xed\xa7\xbb\xf8\x83\x34\xb9\x9c\x27\xb9\xcf\x02\xb3\x85\xf1\x5b\x69\xe3\x37\xd2\x64\x3b\xfc\xab\xbb\xbb\x00\xda\x9a\xed\x19\xea\x65\x3a\x26\xcc\x35\x73\x55\x81\x46\x59\x76\xd6\xc8\xd4\xc4\xfd\xec\x97\xf6\x01\xd4\x55\x03\x0d\x57\x0d\x34\xdc\xca\x40\x93\x2e\x39\xc5\x17\xca\xfd\x64\x1c\x16\xca\x51\x72\x84\x1c\x5e\xc5\x42\x91\xcf\xd8\x6c\xa9\x18\xef\xbd\x8e\x1c\xae\x47\x19\x0c\x7f\xbf\x7e\x90\xe9\x55\x37\xe6\x11\x1e\x2c\x05\xfe\xd3\xcb\x83\xaf\x2b\x39\xd1\xfc\xeb\x8d\xbf\xb9\xd6\xf8\x25\x8d\x54\xb8\x37\xe7\x7b\x1e\xb3\xd7\xee\x1f\x3f\x13\x27\xcc\x47\xbe\x09\x17\xb1\xd7\x31\xc3\x47\xcb\xd8\xe2\x4c\xce\x72\x75\x3f\x8d\x14\x69\x4a\x5e\x9c\x32\xc5\x2e\x39\xe7\x46\xf3\x53\x4e\x34\xbf\x6f\x5b\x66\x30\xc3\x99\x36\x0e\x90\x1b\xb9\x90\xae\x23\xd7\x80\x90\xae\x20\xbb\x3f\x94\xda\x49\xc4\x2a\x69\xfa\x75\xdc\x5a\xfb\xeb\x20\xc6\x4e\x31\x25\xf2\xd4\x43\xcd\x3f\x8a\x7d\xc6\x5e\xbe\xea\xf5\xd9\x8a\xb0\x42\x2d\x1e\x68\xcb\x22\xdd\x35\x25\x35\xf5\xd0\x8a\x24\x35\x55\xbe\x08\x25\x55\x49\xaa\xd3\x4c\x66\xd6\x0b\x9a\xa4\xfa\x94\xa4\x4e\xcf\x34\x11\xd5\x60\x52\x54\x7e\xb8\x7e\xb2\xea\x8c\x20\x5a\x78\x05\x99\x5f\xd1\x64\x75\xa7\x94\xd5\xd8\xf8\x89\xf1\x33\xe3\x8d\xa5\x35\x94\x90\x16\x0f\x8c\x5d\xfa\xf2\xda\xf7\x01\x4d\x5e\xfd\x52\x5e\xa7\xa7\xce\x4c\x9c\x3e\x35\xd3\x58\x60\xfb\x12\x02\x13\xf7\x5f\x81\xc4\xea\x06\x9a\x1b\x8a\x72\x65\x12\x5b\xa9\x52\x6a\x41\x62\xc3\x35\xbf\xc6\x07\xc6\x47\xc6\x56\xf2\x35\x3e\x40\x9d\xfc\xa5\xbf\xba\xb2\xbf\xac\xc9\x2a\xa3\x34\xd7\xc8\x99\xd1\x07\x1a\x0b\x6b\x6f\x52\x75\x31\x43\xe5\xd2\xd7\xf3\x93\xc7\xc8\x7d\xc6\xbd\xd6\xb0\xa2\x51\xbb\x45\xa7\x51\xab\x71\x75\x35\xa1\xda\x79\xf2\x84\xf1\x98\xf5\x88\x1a\x61\x58\x00\x46\x3c\xe1\xc6\xcb\x9b\xec\x71\xcd\x30\xe7\x97\x68\xbf\x19\x96\x73\xf3\xa6\xc3\x5d\x8e\x88\x3a\x0b\xdc\x7f\x2f\x05\x3e\x80\x2f\xd6\x2e\x65\xf5\xe8\x77\xb8\x9b\xdc\x65\x0c\x59\x83\xea\x0e\xd7\xb2\xff\xca\x5c\x3c\xe9\x9b\x58\x70\x4c\xbf\xec\x73\x69\xf2\x07\x69\xe3\x33\xe9\xee\x4f\x2a\x97\xef\x7d\x69\xf6\xe2\x00\xee\x9c\xa7\x66\xc9\x09\x00\xb0\x7e\x68\xfa\x84\xc0\xe8\x04\x36\x68\x0a\x8b\xcb\xa4\x5e\xbe\xe4\xbb\x5e\x14\xb2\x99\xcf\xcd\xb9\x4f\xd3\x90\x23\x7b\x5a\x4c\x9f\xb9\x49\x21\x55\x7e\x4e\xae\x1c\x04\xd4\x8b\xc4\xfa\x92\x1e\x72\xe4\xcb\x31\x81\xd2\xcf\xa4\x4f\x3b\x0b\xa5\xa2\x80\x94\x96\xe6\xfd\xa2\x82\xd2\xd9\x6c\xc0\x8f\x8c\xa2\xd2\xf0\xe0\x60\xd1\xcf\x39\xc5\x79\x3f\x8c\x6a\xd8\x88\x6c\x35\x0c\x84\xcb\x61\x44\x17\x62\x1b\x91\x16\x9d\x30\x72\x73\x21\x75\x82\xdc\xfc\x40\xd1\x2f\x14\x5c\xaf\x30\xf8\x24\xff\xf7\xd1\xd7\x1e\x29\x87\x34\x18\xbe\xe0\x2e\xe4\xe6\x97\x6d\x53\x4a\xa3\xf6\x61\x2e\xd2\x44\x7f\x8b\x5e\xb2\x5f\x70\xdd\x45\x7e\xe0\x14\x68\x4c\x74\xc7\x2b\x5d\x39\xdb\x5d\x2e\x74\xf3\x81\xcb\xd6\x99\x6c\x7d\xf1\xeb\xbd\xc6\x3f\x75\x91\x2b\xc5\x55\x2a\xf3\xe5\x83\x29\xe1\x11\x6a\x3c\x77\x9e\x44\x1c\x65\xd1\xeb\xe8\xcc\xc4\x18\x8c\xd6\x16\xae\xbb\xfe\x38\xbe\x00\x31\x14\x81\x46\xbb\x11\x5d\x88\x03\x27\x3d\x89\x90\xa0\x36\xb6\x9d\xb9\x91\x33\xe5\xf1\x07\x91\x49\x38\x72\x86\x9b\xbc\xd4\x76\x43\x38\xf2\xea\xd3\x42\x2e\x71\x5a\xc8\xd6\x1c\x60\xc9\x8f\x97\x58\x77\xb2\x97\xb8\x94\x3f\xa9\x72\x93\x91\x1d\x0f\xab\x8b\x91\x1d\x0f\xb3\xcc\x30\xcb\x0c\xb3\xcc\xb6\x50\x96\x19\xb2\xe3\x21\x3b\x1e\x66\xf7\x60\x76\x0f\x66\xf7\x60\x76\xcf\xa6\xc8\xee\x69\xcc\xd7\xaf\x1c\xb8\xce\xf3\xf5\x23\xab\x1e\xe6\x41\x20\xab\xde\x45\x54\xe6\xfc\xd1\x7f\xd9\x4b\xbe\x92\x26\x77\x68\x95\x7e\x79\x37\xcc\xf9\x4c\x6b\xda\x8b\x43\xf6\xb8\xc0\x68\x1f\x70\xbd\x28\x34\x3e\x9c\xb6\x1e\x4c\xfc\x62\x96\x02\x7f\xd1\xcd\xb3\x55\x0c\xff\x14\x0f\xc5\xb4\x23\x5b\xd6\xa0\x68\xf9\xe9\x9a\xf3\xcf\xbe\xfb\xf2\x02\xcd\xdb\x00\xe2\x73\x1d\xf9\x99\xd4\x9f\xa5\xc8\x17\x53\x64\xe7\x9c\x1f\x3c\xe2\x7b\x34\x34\x3e\x93\xb2\xf2\xf2\x1f\x89\x9a\x0d\x6a\x3e\xe3\x7b\xb4\x37\xec\xe3\x68\x40\x83\x1b\x80\x59\xeb\x0b\xb4\xc3\x8c\xfc\x92\x5f\xf4\x0b\xcb\xa6\xb3\x04\x68\x8e\x5f\x66\x86\x9a\xfd\xa1\xd4\x0e\xb2\xdd\x09\x02\x67\xf9\x37\x53\x43\x64\x90\x0c\xd4\x2d\x81\x4c\x08\xe6\x38\x9f\xda\xf7\x52\xb7\x91\x7f\x97\x00\xd8\xd8\x12\x1c\x88\x96\x4b\xd4\xd8\x65\xec\x70\x22\x7f\xc1\xcd\x11\xf2\xd1\xcb\xc9\x80\x36\x12\x7d\x3a\xa2\x1e\x7c\x16\xaa\xa0\xf2\x81\x33\x67\xa6\x26\xbc\x42\x40\xc3\x70\xca\x89\xe6\x8d\xff\x74\xb9\xe5\x57\xfc\x16\x17\xd8\xb2\x65\x01\x30\xbd\x70\x2f\x67\x9d\xdc\x05\xea\xe5\x6d\x73\xc2\xcb\xf9\x0b\x4c\xfa\xe5\xa0\xc8\xcc\x9d\x28\x37\x2f\xca\x6c\xf9\xf9\x60\x23\xfa\xc1\x92\x13\xf0\x64\x4a\x95\x36\xc7\xae\x7e\x3e\xb5\x43\xfc\x99\x78\x31\x3f\xb4\x9b\xfc\x7c\x8a\xc8\x43\xc6\xdb\x53\x64\xb8\xae\x88\x6a\x3c\x98\x78\x80\x2c\xbf\xdc\x7a\x44\xfc\x21\x50\x9b\x50\x98\xc2\x42\x9f\xe4\xab\x82\x03\x6c\x92\xdc\xfd\x85\x1d\x33\x70\xe6\xe6\xdc\x9c\x32\x48\xf4\x67\xb1\xc9\xbb\xd2\x04\xb6\x3f\xe3\x6d\x69\xeb\x87\x55\x30\x02\xa4\xc0\xcc\x9c\x82\xe3\x7a\x62\x9f\x06\x61\xc0\xa7\x0e\x2e\x35\x88\x4c\xd5\xdc\x8c\xf2\x20\x43\x71\xd9\x74\xb9\xb1\x20\x2b\x8b\xb5\xda\xe3\xbc\x1b\x02\x2c\xa6\xe7\xa1\xe6\x7c\x8f\x99\xe7\xbc\x85\x92\xc5\x6e\x61\xa9\x28\x88\x03\x91\x87\x64\x11\xf2\xf4\xf1\x51\xf3\xae\x43\x07\xef\xe1\x91\x82\x50\x16\xae\x14\x5c\x4f\xbe\xd7\x9e\xc1\x1e\xdb\x84\xea\xa5\xb2\xa7\xcc\xdd\x7e\x6e\xac\xc0\x25\x70\xef\xca\x27\xe0\xc6\x8a\x78\x6c\x5b\x8f\x94\x7d\x78\x07\xd9\xc9\x2e\x3c\xc3\x96\xe7\x0b\x3b\xac\x77\xec\x98\x12\xff\xd2\x37\x24\xf6\x2c\x00\x69\xb2\xed\x3d\xa1\x2d\x41\xa4\x72\x55\xf1\x69\xc3\xc5\xc2\x83\xf2\x3d\x65\x73\xcc\xf9\x4c\x3a\x6c\x52\x3c\x1b\x74\xd8\xcc\x98\xe3\x4f\x3b\xb9\x68\xd8\x04\xc5\x2e\x6e\xc3\x84\x02\xef\x82\xb2\x63\xc5\x65\xdb\xcc\x98\x53\x01\x9d\x73\x9f\x8e\xcf\x9b\x75\x98\x63\xe6\x7b\x42\x86\x70\x7a\x09\xce\x31\xc3\x52\xd1\x8d\x98\x28\x41\x50\x27\xe5\x72\x77\x43\x62\x9a\x79\x98\x8d\x27\xbf\x14\x2a\xe1\xe3\xe5\xf8\x4f\x27\x74\x43\xdb\x1c\x49\x9e\x00\x6b\x31\x14\x51\x2c\x62\x2a\x9f\x99\x7b\xc6\xd2\x11\x83\x4b\xd4\xed\x21\xaa\x31\xd8\x63\x86\xb4\xe4\x04\x4e\xe4\x07\x6c\x54\xcd\x8c\x76\x88\xc9\xc5\x06\x1b\x01\x7f\x02\xe6\x41\x80\x67\xcd\xfe\x0c\x41\x55\xf2\x19\x0c\x2c\xb9\x21\x95\x4f\xe8\xcf\x99\x25\x21\x53\x62\xaa\x21\xd9\x08\xb6\x79\xca\x8f\x84\x1f\xe3\xce\xc5\xe8\x87\x7c\x0e\xf1\x22\x4a\xe2\x2b\x70\xc0\x58\xe7\xcb\xc0\x94\x07\x13\x17\xb8\x5e\x62\x7c\x80\xda\x14\xf2\xcc\x67\xdf\x4b\xed\x82\x6d\x0e\xce\xf9\xfe\xe0\xac\x13\xc8\x87\xa2\xa1\xfa\x69\x70\xd6\x79\x86\x83\x59\x0a\xd5\xe4\x57\xca\x13\x66\x9d\x67\xfa\x6c\x92\x31\x27\x24\x9e\x0f\xeb\x6b\x46\x20\xe9\xc3\xe6\x44\xf3\x75\x07\xf6\x3f\x73\x90\x89\x09\x07\x85\x82\x11\x0d\x9b\x92\x03\x87\xb0\x34\xd9\x06\x1a\xf1\xdd\x82\xef\xa8\xfc\x35\x51\xb5\x80\x99\x44\x02\x71\x1a\x7b\x6a\xe9\x7c\x15\x61\xff\x98\x12\xaf\x22\xe0\x2b\x98\x8b\x14\xda\xa1\xd9\xa4\xf2\x76\x3c\x4e\x20\x1a\xb0\x69\x9e\xaf\xfc\x64\xc5\x75\x09\x7c\xa5\xb6\x2c\x12\x1f\xee\x57\x76\x91\x63\x9a\x9a\x9d\x2b\xfa\x4b\x4c\x29\x05\x7e\x51\xe9\xd9\x13\xcc\xc8\xa1\x79\xd9\xca\xe8\x04\x5d\xa4\xc5\x51\x1d\xd0\x35\xde\xb1\xcb\xfa\xeb\x54\xd3\xd3\x94\x5f\xcd\x2d\xd3\xc8\x37\xe7\x1d\x2f\x1f\x87\x50\x35\x38\x31\x2c\x0b\xff\xc6\x17\x26\x16\x98\xa7\x4e\x3e\xcf\xde\x07\xfb\xc2\x97\xb8\xef\x4a\xc3\x61\x62\x66\xcc\x07\x98\x45\x10\x68\x03\x71\xab\x0d\x1c\x0b\x3e\x1b\xb3\xc8\xa6\xc3\x07\xa3\xf9\xa3\xec\xa2\x73\xec\x66\x5a\xad\x1f\xfb\xaa\x41\x3b\x26\xa7\x43\x9f\xce\x51\x9a\x8f\x01\x86\xa3\x89\x2d\xec\x67\x77\x90\x7f\xde\x4e\x5e\xc5\x5c\xff\x80\xe6\x47\x7d\x8f\xc7\x91\x73\xcb\x33\xf3\x4e\x40\x43\xe3\x4f\xb7\x1b\xdb\x5d\x2f\xba\x6b\x9f\xf5\xbb\xdb\xcf\xd7\x3b\xeb\xbc\xd9\x3b\x32\x3a\xd3\xa7\x50\x72\xa1\xc2\xe8\xd3\x34\x57\x06\xc1\xc1\x8d\x35\xb0\x56\xfa\xe4\x02\x84\xd2\x81\x2f\x31\x75\x7f\xae\xe6\xf3\xf3\xba\x54\xee\xee\xd0\xa7\x69\x99\xb7\xb2\x03\x3f\xb8\xe0\x2e\x32\xb7\xcc\x5d\xa0\xb6\x69\x8e\x8c\xce\xa8\x6a\x47\x87\xb9\xaf\x2e\xd4\x3a\xf2\x1b\xf1\x9a\x00\x15\xf0\xca\xc5\x8f\x23\xa6\xd5\x3b\x33\x7a\xa2\x0f\xaa\x04\xdc\x45\xa8\x12\x70\x16\x7c\x61\x2b\x68\x27\x0f\x88\x75\x56\xa4\xf9\x8a\x69\x82\x2e\x2c\x05\x3e\x5b\xdf\xec\xf1\xb9\x35\xe1\x06\xa6\x10\x60\xe2\x96\x21\x88\x50\xd8\xe3\xa5\xc0\xcf\x97\x73\x42\x7e\xb5\xce\xe6\xe0\x5c\xef\xc8\xe8\xd9\x3e\x73\x60\x60\xa0\x9e\xf8\x2a\xe4\x94\x2b\xc7\x72\x02\xd7\x9a\x5d\xca\xd6\x18\x75\x72\xf3\x3c\x39\x22\xf9\x04\xc3\x84\x98\xda\xff\x46\x46\xcf\xf6\x16\xfb\xcc\x23\x66\x8e\xba\xc5\x5e\x73\x66\xf4\x84\x99\x61\x32\x66\x3f\x0e\x9a\xbd\x66\x58\x5e\x78\xb4\x52\x04\x17\x1e\x87\x33\x2e\xf4\x99\x7d\x66\x1f\x21\xb3\x6e\xa1\x40\x03\x31\x57\x78\xbf\xf0\x8e\xa8\xe3\x29\xa0\x89\xbb\xaf\xea\x69\x23\xbd\x39\x63\x24\x56\x54\x89\x7a\x21\x6c\xa5\x7c\x83\xe0\xb1\x89\xa9\x13\x7d\x09\x48\x6a\x1e\x74\x99\xac\xc3\x50\x61\xa8\xbb\xf6\xda\x1f\x4a\xed\x22\xd2\x31\x21\xbf\x90\x22\x57\xc0\x0b\x9f\x16\x70\xab\xf1\xd6\x46\x16\x5c\x5d\xd5\x22\x2f\xb7\x1e\x3a\x9f\x18\xee\xbc\x66\x9c\x83\x0f\x1f\xf9\x66\xde\xaf\xf5\x8d\x32\x55\x2c\x0a\xab\xf9\xdb\x62\xbe\x8f\x5b\x98\x8f\x4c\xcf\x5f\x22\xff\x7b\x17\xb9\x73\x05\x7c\x23\xc6\x1f\xec\xb2\xde\x9e\xaa\xfa\xd9\x2c\x30\x0b\xdd\x13\x4b\x6b\xd6\x2d\x02\xe9\x8c\x6f\x2e\x38\x17\xaa\x34\xd8\xdc\x1c\x15\xb8\xb8\x1c\xc3\x1c\xf5\xbd\x88\x3e\x2d\x11\x1b\x59\x79\x14\x7b\xe2\xec\x2b\xe3\x78\xa3\xb0\x09\xd9\x77\x36\x56\x51\x04\xb5\x6f\x28\xe9\xd9\x7c\x6c\x07\xf9\x58\x9a\x10\xa7\xe4\x0a\x4f\xcc\xf8\x40\xda\xfa\xd9\xf4\xc8\xd4\x84\xf4\xba\x75\x5b\x58\x38\xcc\xcc\x14\xce\xcd\xd3\x05\x47\x29\x89\x80\x0a\xf8\x28\xce\xfd\x96\xd9\x1c\x31\xf6\x2a\x34\x25\x98\xa2\x81\x16\x52\x94\xa3\x29\xf7\x53\xc4\x98\xc0\xce\x63\xf6\x2a\xac\x1f\xee\x55\x6a\xf1\xca\x44\x9d\x3b\xb7\xe4\x6c\xf3\x24\xe0\xf1\xde\x9c\x3f\x1c\xf3\xe8\xb8\x91\x4c\x56\xc9\xf9\x0b\x0b\x65\xcf\x8d\x96\x07\x61\x19\xb9\xb3\xe5\xc8\x0f\xc2\xc1\x3c\xfb\x5e\x06\x43\xb7\x30\xe0\x04\xb9\x79\x37\xa2\xb9\xa8\x1c\x50\x89\x1a\x08\xbb\x39\xb4\x17\xf2\x0a\x3a\x08\xf5\x0d\xf0\x37\xd2\xa4\x0b\x92\x15\x3e\x98\xb6\x7e\x2e\xfd\xa0\xeb\xe5\x85\x51\x03\x87\x55\x88\x47\x48\x48\xfa\x3c\xd3\xe3\x90\x52\x2b\x30\x25\x90\xa2\x80\xe4\xd4\xa9\x61\x12\xb7\x76\xbd\x39\x55\x86\x25\xed\xfa\xd8\x15\x89\x23\x87\x61\x79\x16\x30\x05\x2d\xe9\xcd\x36\x47\x1d\x4f\xac\x6f\x81\x14\x32\x87\xcc\x1c\x75\x16\x68\x71\xd4\x09\x69\xc7\x25\x07\xb6\x05\xe4\x74\x24\x64\xf7\x85\x14\xd9\x29\x83\x1f\xc6\x27\x52\xab\x4a\x49\x39\x0d\x62\x3b\x49\x23\xc7\x7a\x2e\x35\x13\x39\x5e\xde\x09\xf2\x71\xe5\x9d\xaa\x1d\xeb\xf4\x23\xca\x1b\x91\xa7\x48\x17\x33\x54\x8c\xd9\x35\x90\xb2\x31\x53\xcb\xba\x95\x0d\x93\xf8\x02\x45\x7d\x18\xf5\xa0\xcd\x6b\xde\xfe\x5e\x6a\xb6\x79\x12\xcd\x51\xe3\xc8\x80\x99\x2c\x1b\x31\xcd\x7a\x85\x23\xa6\x59\x95\x4a\x43\x5e\xba\x96\xf4\x68\x73\x97\xa9\x38\x72\xf2\x22\x27\x0a\xac\x5c\xe3\xe7\xae\xb5\xfe\x47\x4a\xff\x45\xa1\x49\x2a\xf7\x4e\xa6\x2b\xf0\x80\x1a\x74\x46\x65\x2a\x43\x0c\x0b\x3f\x73\x43\x65\x4a\x70\x5c\x78\xd1\x59\xbf\x58\x5e\xa0\xa1\xf4\xe6\xf2\xcb\x9e\xb3\x20\xac\x60\x80\x79\xb8\x5a\xb2\x09\xd1\xef\xcc\x0b\xfd\x38\xd9\x82\x4a\xe8\x3c\xcc\x77\x6c\x0d\x83\x96\xf7\xe5\x13\x71\x72\x39\x3f\xc8\x8b\x26\xbf\x34\xca\xf1\x84\x13\xcf\x8c\x57\x19\x74\xc6\xb5\x9f\x4f\xed\x8e\xef\x1c\x24\x94\xea\x7f\xbd\x9a\xfc\x78\x8a\x90\xf8\x49\x8d\x67\x53\x16\x9d\x8a\x1f\x7c\xde\x2f\xe6\x6b\x4a\x83\x87\xbe\xd4\xa8\x5c\xd7\x4b\xbd\xc9\xf9\xee\x16\x85\x24\xa4\xea\x4d\xcc\xde\x7e\x6f\x2a\x99\x80\xaa\xcd\x8b\x7c\x27\x45\xae\xe6\x57\x67\xd9\xb6\xe8\x15\x4e\xfa\x79\x6a\x7c\x2d\x65\xfd\x51\xea\x6c\xe5\xcf\xda\xc6\xc9\x2c\xed\xca\x17\x31\x5a\x74\xdc\x85\x50\xb3\x7d\xb5\x97\x20\xd2\x9c\xca\x5e\xde\x36\x15\x40\x40\xa3\x7e\x33\x71\x93\x09\xc9\x13\xc1\x43\x26\x4c\x1f\x25\x43\x5a\x10\x0e\x9c\xf7\x21\xd1\x87\xf9\xb1\xa1\x9e\x79\x25\x61\xb3\x79\x2a\x46\x8d\x1b\xd8\xca\x1c\xa3\x84\x8f\x82\x7b\xdc\x1a\xf7\xb8\x4b\x52\x4f\xff\x6d\x8a\x5c\x0e\xe1\x6d\x91\xe2\x6c\x7c\x29\x65\x7d\x2c\x35\x56\x5b\xb7\xd4\x50\x46\x35\x3f\x41\x3d\x99\x45\x85\xec\x43\x6a\xea\x37\xea\x37\x01\xac\x78\xd4\x0a\x7c\xab\xdf\xb4\x42\x7f\x2e\xb2\x1e\x07\xd0\x84\x27\x4c\xc1\xb5\x03\xa6\x0a\xbd\x03\xce\x70\x56\xb0\xe8\x84\xee\x42\xa9\xb8\x6c\xce\x39\x6e\xd1\x74\xe7\x00\xd8\x02\x0d\x05\x57\x26\x20\xe3\x8a\x5c\xf4\x53\x44\xd7\x58\xc6\x51\x6b\xdf\x94\xa6\x6a\x92\x30\x36\x24\x3e\x4a\x98\x26\x3e\x2b\xf1\x51\xfd\x74\x8a\x5c\x11\xd0\x1c\x53\x05\xc2\xee\x7d\x43\xca\x7a\xba\x03\xe2\x83\x8f\x4f\xbb\x4f\x12\xa2\xe0\xd5\x33\x89\x99\x79\xe4\x5a\x40\x40\xf9\x9d\xc6\x9f\x2e\x39\x00\xfc\x1a\x67\xad\x07\x46\x6a\xfc\xce\xbe\xda\xa5\x50\xe5\x11\xd4\xd8\x13\xa0\xf0\x9b\xeb\x4e\xe6\x02\x39\x5e\x1e\xfc\x18\x11\xac\x20\x3f\xb2\x8d\x5c\x2d\x20\xd7\x33\x1c\xc9\x77\x69\x68\xfc\x53\xda\xfa\xe5\xf4\xb4\x9e\xe3\xe2\x31\xcd\x1a\xa9\x33\x44\x9c\x6b\xb1\xb5\xbd\xcd\x1c\x67\xae\xa2\x98\x44\xa9\x58\x2e\xb8\xb1\xe2\x62\xe6\x9e\xbf\xe4\x69\x39\x00\x2a\xa2\x20\x33\x41\x65\x04\x66\xc4\xe3\x99\x07\xa6\x98\xe9\xb2\x4c\x98\x39\x43\x83\x05\x99\x8d\xe2\x70\x2f\x25\x90\xd9\x7c\x6a\x34\x99\xb2\x03\x39\xa0\x6d\x57\xd8\xf1\xd2\x3d\x44\x0e\x90\xbb\x9b\xb6\xa8\xaf\xf5\x08\x68\x8e\xaf\xde\x1c\xff\x5e\x8a\x36\xb7\x26\xb3\xc6\x31\x65\x4d\x56\x24\x65\x4b\xab\x52\x37\xc2\x6a\x1a\x94\x6f\xdb\x4f\x0e\x6a\xef\xd3\xc9\x2f\xb8\x90\x57\x1c\xd0\x82\x1b\x46\x1c\xec\x53\xe6\xe5\xc9\x32\xdb\x72\xbd\xc2\x39\x3a\x3b\xef\xfb\x17\x8c\x3f\xb9\xcb\x7a\xa2\xe2\x37\xcd\xc6\x74\x3c\x53\x0d\x67\x2e\x89\xc3\x95\x5c\x11\x3c\x9c\xa9\x4a\x04\xd8\x07\x24\x5c\x69\x78\x3d\xcf\xa7\x20\x1b\xe1\xf9\xd4\xe5\xfc\x1d\x72\x10\x32\x61\xe3\xbd\xbc\x8f\xbc\x2b\x45\x12\xc7\x8d\x37\xa7\xc8\x64\xdd\x35\xdb\xf8\x19\xc5\x73\x8c\x6a\xc3\x59\x47\xf5\x7f\xa9\x4f\x5d\x00\x9f\x62\x05\x30\x8d\x1d\x27\x86\xb1\x21\x6c\x73\x5a\x60\xbc\xe4\xfd\x29\x72\x05\xdb\x26\xca\x81\xa0\x0e\x35\xde\x99\xb2\x7e\x34\x75\x5c\xff\x29\x31\x6e\xc2\xdc\x80\xec\x51\x6d\x6d\xc7\x52\x55\xab\x9c\xe9\x6a\x8e\xc0\xe6\x25\x3d\x06\xd5\x19\xe1\xcc\x09\x9e\x02\xef\x07\x26\xbb\x69\x05\xb4\x0c\xc7\x12\x7a\xfb\x2d\x3b\x89\x11\x50\xd7\x5b\xf4\x73\x1a\x97\x85\xf1\xdd\x1d\xd6\xb7\x76\x54\xff\x9e\x00\x77\x68\xcc\x51\x22\x5f\xba\x16\x74\x75\x00\x23\x5c\x28\x17\x23\xb7\x54\xe4\xc9\x2d\x80\xb7\xc7\x21\x30\x91\xbd\xa4\x3d\x24\x7b\x0c\xfe\x92\xcc\x91\xea\x27\xb3\x4e\xd1\x45\x1a\x58\xb0\x8e\xac\x89\xb9\x53\x94\xe6\x69\xde\xb2\x09\x81\xdf\x87\x79\x79\x8f\x98\x08\x6c\xdb\xe2\x73\x97\x53\xe1\x95\x01\xcc\x82\xf4\x72\x14\x72\x96\x1a\x4e\x81\x10\x79\x8f\x1a\x43\xc7\xc3\x3a\x91\x59\xa4\x4e\x18\x81\x55\xe0\xe4\xf3\xae\x88\xf8\x01\xe4\xa8\x3d\x6f\xc5\xfb\x54\xf7\x91\xd1\x1a\xa1\xfa\x66\x29\x80\x96\xf9\x05\x37\x12\x99\x3e\x32\x49\x8b\x29\x78\x0e\xfd\xc5\xc3\xf0\x3d\x29\xd4\x72\xb6\x64\x8e\xa2\x9c\x2d\xcf\x7b\x10\x6b\x5d\xec\x0c\xa1\xc8\x08\xe0\x2a\x97\x27\xe3\x67\x16\xca\x61\x94\x11\xb9\x66\x0b\x25\x3f\x02\x72\x44\x11\x29\x97\x1c\x82\x5a\x0a\x31\x5d\x56\x79\xc6\xc5\x65\x35\x5f\x1e\x85\x1a\x36\x33\x15\x18\xad\x26\x97\x78\x49\xa9\xfa\x03\x95\x1e\x07\xa0\x1a\xe0\x81\x10\xfe\x63\x22\xb5\xcd\x0c\x93\x50\x9d\x01\x62\x56\x45\x49\x9e\x98\xe4\x6f\x14\x96\x3f\x9f\x76\xbf\x14\x8a\xf4\x51\x6b\xdc\x99\x0d\x7e\x41\x46\x87\xd9\xbd\x97\x12\x92\xe3\xb9\x92\xb1\xd4\x04\xda\x1c\x50\x3f\xc8\xcb\x32\xa7\x05\xd7\x73\x17\xdc\x67\x68\x4b\x22\x60\xb7\x88\x7c\x65\x82\x6a\x15\x59\xfc\x95\x3a\xc5\xa2\xb9\x50\xd6\xc3\x49\xda\x94\x73\xfe\x42\x89\x19\x62\xfd\x30\x2f\x47\x8e\x22\x17\x50\x52\x1f\x8b\x92\xac\x8a\x64\x1b\xf1\x4d\x25\x54\xc2\x3b\xd3\xa4\x22\xaf\xc5\xf8\x8f\x69\x19\x11\xf9\xc7\xd4\x99\xc4\x21\x2d\x3e\x24\x73\xd8\xe2\x0c\x9c\x58\x33\xd8\xe6\x88\x5a\xa2\xf2\x9c\x12\xe0\x05\xfd\x89\x8f\x4b\x64\x31\x8a\xfc\x42\x5e\x73\x62\x0a\x2f\x7d\x64\x6a\x42\x3b\x0e\xc6\xb8\x0a\x06\x43\x90\x99\x2b\x59\xc5\x41\x74\x46\xbb\x57\x92\x46\x7c\x96\x46\x4b\x94\x7a\xe6\x10\xe8\x92\xbb\xf6\x4a\x5e\x49\xa5\x2d\x99\x68\xb4\x9f\x13\x08\xfa\x07\xbb\xc8\x2b\x95\x78\xa7\xe9\xa2\x4b\x97\x84\x53\x1b\x1a\x3f\xd9\x65\xfd\xcb\xb6\x91\xda\x07\x45\x58\x57\xae\x14\x19\x48\x2e\xa9\x24\xc8\xf3\x15\x17\x9e\x8f\xd3\xde\xd8\xe3\xc9\x7d\x97\x3e\x5d\xe2\xe9\x88\x4c\x1e\x7a\xda\x73\xc4\x93\x92\xa1\x40\x12\x32\x08\x65\xfa\xa1\xab\xa5\x3d\x8b\x70\x94\xca\x5d\xe5\x69\x8d\x9e\x16\xab\x57\x37\x8d\x33\x6a\x61\x00\x57\x14\x14\xc4\x06\xef\xec\xb2\x36\x87\x7e\xb5\xfc\x24\xa5\x15\xbc\x21\xb5\x10\xa4\xdb\x3e\x31\xc7\x79\x2e\x39\x93\x6a\xfc\xe2\xeb\x04\x1d\xd5\x0e\xa7\x32\x00\xbd\x7c\x1c\x4d\x96\x35\xa4\x8e\xb7\x1c\x9f\x71\xc1\x63\x76\xb9\xf8\xf4\xd9\x04\x67\xc4\x04\x79\xa6\x9b\x38\x90\x50\xe7\x30\x55\x00\x51\x12\x61\xcc\x5a\xab\x4a\x5b\x21\xe7\x1f\xed\x11\xc6\x44\xcf\xe3\xe7\x1b\xb9\x81\x7f\x95\x22\x60\xdd\x18\x7f\x91\xb2\x3e\x97\x3a\x53\x01\x86\x55\x7d\xab\xb6\x79\x8a\x1d\x8e\x37\xd3\xb9\x32\xf3\x4c\x5e\x5b\x76\x8a\x22\xe5\x83\xf9\xb2\xfd\xa6\xbb\xe0\x14\xa8\x98\x57\x22\x2d\xaf\x5f\xb8\x39\x96\x76\x86\x25\x2b\x71\xf5\x5b\x8b\x1b\x72\x10\x24\x31\x44\xad\xb3\xfd\xa0\xe0\x78\xee\x33\x62\x87\x96\x36\x4f\x42\x77\xfc\xf9\x2e\x72\xb5\x02\xfe\xa4\x8f\x60\x7c\x72\xd7\xaa\xd8\xcb\x4f\xe8\xc5\x05\xd6\xb3\xbb\x4e\x55\x0e\x2c\x18\xcd\x34\x63\xc4\x07\x06\x5c\xfd\xfd\xfa\x9e\xa6\x54\x95\xbe\xd0\x1d\x4f\x35\x5f\xb1\x58\x1d\x49\x50\xa7\xf2\x19\x78\x81\x01\xbf\xa7\x2a\x4d\x12\xe7\xb8\x51\x48\x8b\x73\x71\xdf\x03\x18\x89\x2b\x35\x3d\x45\x41\x91\xbb\xb1\xbb\x8b\x6f\x41\xc1\x2f\xb2\xcc\xa2\x62\xe4\x50\x15\x22\xe5\x8a\xe5\x90\xa9\x4f\xa8\xec\x8e\x53\x04\x21\x29\xc3\x63\x1a\xdc\x0c\x2f\xb8\xa5\x50\x7f\x70\x9b\x90\x64\xf1\x73\x1d\xd1\x2c\xab\x4d\x7d\x69\x1e\x72\xf4\x95\x34\x64\xb6\x47\x45\x1f\x07\x2b\x28\x7b\x10\xee\xb4\xd8\xba\xb0\xf6\x5a\x4c\x3f\x5b\x43\xd6\x61\xd3\x5c\xf6\xcb\xc9\x0a\x0c\x55\x7a\x02\x65\xe8\xec\x53\x0e\x87\x4d\xab\x6a\x81\x58\xc3\xe6\xeb\x88\x69\x5a\x20\xb0\xf1\xa7\x99\xf3\x07\x9f\xb2\x35\x6c\x3e\x0a\x31\xd9\xd7\x89\xc8\xac\x75\x81\x2e\x5b\xc3\xda\x14\xfa\xe5\x01\xee\x58\xc0\x50\xd6\x29\x3f\x9a\xf0\xe2\x43\xdc\x84\x54\x63\xc1\x6f\x7b\xd5\x61\x93\xcd\x5d\xfc\xfd\x38\xfc\xff\xeb\x09\xfb\xeb\xf5\xcc\xfe\x93\xbb\x26\x7f\x32\x87\xe7\x9f\x81\xd7\xbd\x72\x59\xd6\xea\x87\x61\x51\x6f\xd1\x0d\x7c\x6f\x81\x7a\x11\x17\x67\x29\xf0\xf3\x5c\xa2\x61\xe4\x14\x5c\xaf\x60\x1d\x5e\x3f\xb1\xea\xb3\xa9\x29\xd9\x66\x62\x85\xd9\x6b\x92\x95\xcf\x50\x5b\xbe\x4d\xd2\x8a\x55\xfa\xb0\xbf\x48\x03\xb6\x21\x0e\x2e\xf9\xc1\x05\xd7\x2b\x0c\x30\xf9\x0d\x08\x51\x0f\xf2\x8f\x67\x10\x3e\x5e\xb0\xf1\xc5\x92\x0f\x55\x9a\x96\x92\x97\x96\x6a\x2c\xd5\x3b\x07\x66\x12\x9a\x46\xe6\x6c\xc8\xaf\x5f\x2b\x78\x22\xdf\xdc\x4e\x5e\xc1\x6f\xac\x94\xdb\x1f\x6f\x6f\x83\x72\xfb\xf1\xed\xa7\x13\xa3\xb6\xa2\xd9\x94\x32\x4b\x7a\x10\xf3\x8e\x96\xea\x29\x35\x4b\x72\xce\x50\x0b\xc3\x3d\x10\x2d\x13\x72\xd6\x17\xab\xd2\x2f\xe6\x4f\x0b\x23\xd4\xcb\x9b\x1e\x5d\x3a\xad\x17\x2e\xc4\x45\xbb\x5e\x54\xb1\x99\xf2\x7d\xc4\x0d\x79\x1d\x47\x6c\x11\xf3\xca\x98\x39\x93\x72\x5a\xcb\x86\xda\x75\xc4\xf4\xca\xc5\xa2\x3c\xa7\x37\x9e\x8b\xb0\x62\x72\x0e\xcf\x85\xe0\x80\x25\x54\xae\xc4\x33\xac\x38\x87\x97\xb4\xf0\x72\x56\x2f\x51\x7e\x91\xe3\x60\xd0\xbc\xb3\x48\x65\x2a\x5f\x6f\xd1\xbd\xc0\xac\xe8\x31\x5a\x2a\xfa\xcb\xec\x1b\x98\xf6\x8b\xc5\x59\x27\x77\x81\x97\xc3\x4e\xf9\x79\x9d\x9c\x43\x0c\xd7\x27\xd5\x64\x8d\x47\xb6\xcd\x87\xc2\x24\x49\xb9\x94\x3f\xa8\x10\x37\xb1\x07\x9b\xdc\xab\x18\x70\xbd\x7e\x73\x96\xe6\x1c\x66\xc6\x51\x2f\xcf\xcc\x39\x81\x7e\x31\x15\x5f\xdb\x60\xe0\xd8\x5f\xa4\x90\xb5\x8a\xb2\xbd\x55\xae\xf5\xbf\xeb\x22\xdb\x83\x72\x91\x86\xc6\xd7\xbb\xac\x1f\xee\x9a\x66\x7f\x6a\xa8\x0f\x64\x77\x68\x78\x4e\x65\xd1\x46\x38\x18\x96\x67\x63\xf4\x27\x69\xe5\x07\xcc\xb4\x9b\xf5\xcb\x11\x37\xd3\x6b\x1c\x80\x37\x16\x13\x4a\xcc\x41\xa9\xaf\x98\xe5\x93\x8e\xb7\xfc\xa4\xc9\x26\x64\x9b\x0f\xf8\x4b\x14\xac\x3b\x57\xd8\xd6\xdc\x5f\xe5\xa5\x71\x67\x95\x47\xa4\x6c\x6b\xe5\x0a\xb3\xa5\x2a\x31\xad\xea\xa3\x80\xc1\x94\xca\xb1\x4c\xe5\x16\xcc\x71\x83\x08\x40\x20\x10\x5d\x4e\xe1\x8a\x01\x85\x84\x70\x99\x04\x2c\x8b\xb1\xa4\x9b\x56\x5c\x86\x3c\xe1\xd9\xa2\xca\xc1\x06\xef\xbd\x7f\x0d\xb3\x04\x3f\x16\xf6\x7f\x81\x46\xf8\x3a\x14\x97\xc8\xac\x8b\x6f\x22\x81\xaf\x84\xc5\xad\xdf\xa7\xe6\x09\xb2\x0a\x4a\x37\x73\x4f\x92\x07\xc9\xc4\x2a\xe1\x37\xf6\xf6\xce\xb9\xd1\xfc\x69\xb5\x82\xc8\x9f\x6c\x23\xbb\xd9\x37\x34\x0e\xa9\x38\xa1\xf1\xa9\x6d\xd6\x6f\x6e\x9b\x89\x7f\xe0\x62\xaf\x03\x3d\x31\xb5\xc7\x2e\x36\x29\x3f\xb9\x2e\x07\xed\x43\x1e\x38\x08\xfd\xe6\x29\xdf\xa3\xfd\xe6\x8c\xbf\x40\xf9\xdf\xa7\xbd\x31\xde\xba\x41\x89\x17\xf6\x69\x7d\x50\xf3\xe4\x43\x33\x67\x34\xf6\x09\x07\xde\xb9\x97\x73\x8b\xae\x70\x5c\x80\x21\xa6\xdf\x0c\x81\x9f\xa0\xaa\x5a\x89\xc7\x18\xb9\xeb\xe4\x98\x73\x65\x60\x66\x08\x23\x5a\x92\x9a\x2b\x7e\x79\xb9\x79\xc7\xf5\x62\xee\x00\x7d\x12\x10\x26\x80\x06\x08\x5e\x8c\x5c\x94\xbd\x3c\xc0\x25\xd3\x8a\x5a\x43\x1a\x19\xa2\x21\x85\x13\x71\xd4\x3a\xae\x2a\x74\xca\x91\x3f\xa0\xa6\xc4\xd5\xd1\xb2\xd0\xd6\x8e\xe6\x20\x09\x21\xc8\xb7\x70\xe4\x88\x94\x21\x53\x8c\x4c\x7e\x49\x94\x51\x1c\x4c\x06\xae\x76\x90\xdd\x30\xb0\xc0\x17\x7f\x78\x87\xf5\xdd\xcb\xb4\x1f\x92\x58\x2b\xb3\x8c\x40\xf3\x58\xdc\xe5\x14\xf1\x6a\x6d\x2f\xa9\xcc\x71\xaf\x0d\x18\x42\x82\x2e\xb7\xa6\xc6\x5f\x5b\x76\x17\x9d\x22\xb3\x6c\x6c\x42\x06\x64\xf6\xb9\x7c\x58\xf9\x9e\xa4\x62\x76\x23\x05\x42\x49\xa5\xe3\x68\x0e\x71\x00\xaa\x27\x61\x5f\xbb\x6c\xbb\x91\x3b\x87\x8a\x2c\x29\xf0\x6e\xd1\x75\x4c\xa7\x54\x0a\x07\x17\x87\xfa\xe5\x1f\xf0\x21\x88\xfa\x46\x55\x29\x11\xff\x3e\x5b\x8e\x94\x18\xf8\xbc\x64\xbd\xe5\x79\xa7\xe4\x02\xe3\x65\x38\xfc\xa8\xc5\x06\xb3\x1e\x67\x83\xca\x60\x3b\xfb\x75\x71\x88\xfd\xa6\xd4\xef\xb0\xf9\xa8\xa5\x4d\xcf\x7a\xfc\x7c\xbf\xf6\xd4\x91\x9f\x98\x12\x34\x68\xab\x9a\x90\xd8\xf9\x85\xae\xab\xb1\xfb\x73\xb9\x2a\x39\x57\x0b\xd7\x9d\x93\xf2\xe0\x85\x7c\x22\xf2\x53\xe4\x48\x80\xeb\x81\x58\xc3\x7e\x28\x6b\xe6\x02\x13\xee\x0f\x73\xe2\x21\xfc\xc1\x66\x26\xfc\xfc\x8e\x8b\x1f\x60\xe6\x4d\x27\xfe\x59\x2a\x33\x1d\x44\x0a\x22\xbf\x10\x66\x5b\xfb\x9d\x24\xe0\x3e\xfe\x45\xe8\x5f\xe6\xff\xbc\x2c\x91\x68\xc9\x74\x42\x98\x73\xd8\x1e\x65\x2f\xee\x63\x77\xde\x67\x9f\xa4\x51\xe0\xe6\xce\x38\x41\x81\x46\xc6\x87\x2f\xb3\x1c\xfd\x87\x44\x26\x47\xc4\x7f\x92\x99\x15\x8b\x14\x22\xba\xe2\x9f\xcc\x8a\x12\xbf\x94\x23\xb7\x28\x80\x04\x11\x0b\x90\xe4\x39\x0b\x30\xf4\xf3\xa9\xae\x68\xb9\x44\x13\xe1\x9f\x8f\x6e\x27\x3f\x93\x26\x86\x18\xe2\xa1\x78\x04\xe3\x59\x85\x4e\xfe\x6d\xaa\xfa\xb0\x44\x32\xf4\xb9\xc5\x35\xe5\x7c\x3e\xaa\xcf\x8e\x58\x92\x7c\x16\xa6\x93\x0b\x7c\x1e\x8b\x36\x03\x5a\xa4\x8b\xcc\x01\x2c\xf9\xf9\xb0\x3f\x8e\x50\x32\xfb\x39\xe4\x88\x56\x8e\x7a\x51\x62\x30\x59\x92\x9f\xb8\xa5\xba\x87\x4a\x3e\xf2\xf3\xa1\x5e\x65\x04\x6b\x8d\x93\xb8\xb0\x53\xa6\x2b\xe6\x24\xc3\xa5\x20\x1e\x0d\x96\xfc\x70\x8a\x5c\x2e\x1e\x07\x1a\xdf\x18\xbf\x90\x5a\x01\x99\xae\x2d\xa7\x65\xbf\xba\xec\x40\x6f\x46\x6b\x4e\x1f\x6d\x05\x42\x6c\x22\x3b\xb3\x17\xe4\xf5\x5a\x71\x9b\x3e\x92\x23\xf0\xae\x8d\x47\xad\x53\x90\x02\x11\x07\x7f\x13\x28\x8d\x18\x16\x4e\x71\x43\x53\x7b\xc1\xfd\xbc\xd3\x0f\x2c\xb0\x11\x6d\xce\xfa\x2a\xff\xc1\x14\xd9\x0e\x93\x36\x96\xd6\x26\x95\x83\x8b\xcd\xc4\x21\x26\x5a\xf1\x98\x36\x79\x76\x27\x39\xa2\x07\xd4\x69\x20\xca\x34\x69\x5c\x1d\x37\x1a\xff\x38\xe3\x16\x3c\xd7\x2b\x88\xed\xfc\x84\x1b\x46\xc6\xc7\x77\x3c\x9f\xda\x0e\x0c\x10\x89\x0f\xe3\x97\x2f\xc3\x64\xab\xb5\x26\x5b\x39\x84\x0b\xd6\x78\x58\xb7\x6f\x1f\x24\x13\xe4\xfe\xfa\x29\x11\x2b\x7a\x83\x98\x24\xb1\x86\x9c\xe5\x09\x2d\x15\x6e\x75\x1c\xe1\xec\x03\x3a\x49\x23\xe7\x7b\xa9\xd7\x35\xcf\xb7\x78\xd8\x38\xab\xf2\x2d\x12\x6f\xb9\x22\xe9\xa2\xe1\xe7\x5a\x33\x0b\xe3\x1f\x77\x92\x9b\xf5\x02\x59\x20\xbe\x83\xca\x6a\xf6\x17\x7c\xe5\x9f\xdb\x69\xdd\xa1\xfe\x25\x0b\x87\x78\xac\x08\x7e\x56\x9e\x58\x4d\x65\xf0\x5f\xb0\xba\x60\xcd\xca\x60\x4e\x2a\x83\xc7\x2d\x8b\x53\xf0\x24\xde\x82\x14\x55\x0d\x87\xb8\x9f\x64\x48\x6f\xfd\x72\xe8\xe4\xdb\x46\x8d\xb0\x06\x8d\xf0\xa2\x9e\x1d\xfb\xb1\x95\x98\x3a\xd5\x3a\xc1\xfa\x01\x95\x1a\x9b\xa0\x86\x5a\xb7\xb4\xd8\xef\xa5\x5a\xe3\xe5\x54\x4a\x49\xac\xa4\x0a\x75\xa4\xb4\x46\x52\xf5\x10\xf2\x5c\x17\xd9\xd7\x32\xdf\xc0\x74\xb9\x28\x2c\xc8\xcf\x6e\xb3\xfe\x73\xba\xd6\x91\xe4\xf7\xc0\x24\x13\x43\xec\x26\x2c\x2b\x91\xcc\x2f\x58\x02\x42\x58\x33\xbc\x98\x0d\xfc\xb5\x61\x49\xb9\x7b\xef\xbc\x1f\x46\xf7\x0d\xde\x5b\x72\xa2\xf9\xfb\x8e\xde\xcb\xa9\x71\x4b\x4e\x10\xdd\x67\x0e\xdc\x27\x2f\x17\xd1\x4c\xfe\x5f\x76\x30\x94\xb6\x56\x39\x28\x9a\x39\x3f\x90\xf4\x7a\x91\xaf\xaa\xe8\xfb\xa5\x1e\x13\xdf\x89\xde\x75\x31\xc6\x11\x24\xf4\x1d\xc3\x9e\x5a\x2a\x0d\x94\x43\xf7\x0c\xf6\x88\xc0\xb0\xea\x38\xc9\x83\xeb\x3d\x47\x7b\x98\xc1\xd9\x73\x5b\x0f\x53\xc4\x50\x7f\x9f\x50\xc4\x3f\x96\x22\x6f\x4a\x11\x7e\xc0\x78\x36\x65\xed\x1f\xa9\xe8\x39\xcd\x4b\xf6\x45\xd1\x62\x29\xc1\x97\xad\xc4\xa6\xeb\x96\x86\xdd\x31\x5a\xe0\x90\x20\x9f\xd8\x45\x06\x1b\x94\x94\xf0\x24\xd1\x91\x28\x72\x72\xf3\x0b\x72\x33\xfa\xf1\x5d\xd6\x48\xad\x03\x7c\x05\x24\x1f\xa8\xf2\xbc\xc6\x1b\xd5\x27\x71\xa3\x5a\xf3\x46\xf5\x3a\xb9\x51\x05\xd6\x9e\x09\xb9\x51\x45\x1a\xb3\x5f\xe5\x2b\x09\xf5\x05\xd5\xb8\xc3\x7b\xb3\xe5\x81\xbb\xd7\x1a\x76\xaf\xcf\xe8\xbb\xd7\x47\xd7\xb8\x7b\xfd\x5f\xb5\x77\xaf\xf5\xdb\xbc\x16\x9a\x6f\x5e\x93\xc6\x03\x03\x62\x97\xaa\xa5\x4e\x6a\xd9\xca\x66\x9d\x8c\x67\xf2\x86\x2b\xc8\x3d\x4d\x10\xab\x07\xfc\xc0\x7d\xc6\xf7\x22\xa7\x38\xe5\xe7\x47\xc4\x09\x34\x30\x3e\x73\xb9\xf5\x52\xaa\xce\x41\xf9\xed\x24\x33\x91\x78\xc1\xdc\xbc\xba\x84\x57\xfc\xaa\x8b\x64\xfc\x8c\xfd\xb2\xe0\x48\x96\x88\x05\xc7\x83\x16\xcc\x1c\xef\x01\xf2\x70\x33\x27\x2b\x4b\x1c\x2f\xe6\x62\x8a\x43\x09\xf2\xfb\x80\x61\x4d\x2d\x72\x96\xcc\x71\xe3\xe0\x82\x96\x9b\x95\xac\x2d\xfe\xde\x2e\x54\xaa\x58\x5b\xbc\x71\x7a\xed\x2b\xba\x5e\x7b\x79\xcd\x35\x6b\x3f\x9e\x52\xca\x4c\x7c\x9c\x61\xb2\x86\x6d\x03\x2a\xd8\xfe\x7d\x5a\x94\x1a\xff\x6b\x8a\x3c\x50\x3f\xf6\xd9\xba\x52\x82\xb2\xe3\xf7\xa7\xa0\xee\x58\x3e\xa5\x5e\x40\xa4\x80\xe2\x59\x3a\xef\x2c\xba\x7e\x39\x50\xc0\xab\x1a\xa3\xe3\x8f\xcf\x66\x34\xe0\x78\xf9\x81\x10\x9a\xf2\xd9\xe4\x2d\x29\xf6\xd2\xd9\xdf\xc6\x1b\x1a\xd6\x60\xac\x40\x10\x30\x9c\x75\x80\x0f\xab\xd4\xb1\xe0\xc5\xd0\x1b\xdd\xf1\x04\x81\x0a\x11\xac\x74\x1f\xaa\x33\x8b\xc4\x56\xc4\x27\x1c\x6f\x45\xda\xd3\x10\xf2\xf7\x69\x72\x6b\x8d\x0a\x29\x5e\x42\x32\x31\x25\x2a\x54\x3e\x93\xb6\x5e\x9d\xfc\x49\x47\xb8\xab\x36\x1c\x70\x6d\xf8\xf9\xe6\xc4\x94\x50\xfe\xa2\x05\x80\xe9\xcc\x81\x8c\x97\x93\x4a\xff\xaf\x53\xe4\x1b\xa9\xaa\x94\xed\x2f\xa4\x64\x50\xe4\xb7\x52\x51\xa3\x94\x6d\xd9\x53\x5f\xdd\x77\x62\x8a\xa3\xec\xf2\xae\x61\xe4\xe6\x2e\x2c\x0b\x96\x99\xb8\x61\xbe\x4c\xa6\xbe\x6f\xaf\xb9\x67\x8f\x79\xef\x91\x83\xf7\xec\xdf\xbb\xb7\x97\x2d\xd6\x21\x33\xef\x2c\xf7\x99\xae\xea\xf7\x33\x22\xe6\x6d\x1e\x39\x62\x5a\xf2\x26\x56\x9c\x9f\xa2\x30\xf5\xa1\xbd\x07\xc5\x18\x77\x99\xf3\x7e\x39\x08\xfb\x92\xb9\xd7\x5f\xd9\x55\x53\xe4\x9c\x91\xc4\xf1\x0a\x14\x9c\x96\xdf\xdc\x65\x0d\x24\x7f\x4a\x3a\xac\xf1\x31\xce\xa7\x5c\xdb\x41\x79\xc7\x4e\xdc\x4b\xd7\xba\x97\x7e\x3a\x25\x3d\x94\xdf\x4e\x59\x3f\x98\x9a\xa8\x06\xd3\xb4\x77\xa1\x78\x76\x6b\xcc\xb4\x51\x7a\x60\xe2\xfb\x19\xe4\xb6\xd7\x80\x9a\xce\x80\xa2\x66\x09\x07\x75\xef\x67\x90\x0c\x90\x3b\x9b\x96\x3b\xc6\xd3\x43\xbb\x60\x0d\x76\xc1\x1f\xea\x76\xc1\x7f\x5b\xa3\xbf\xf3\x6c\x6a\x83\xe0\x3a\xed\xe1\xbe\x97\x3a\xdb\x7c\xb3\xb9\xcb\x18\x92\x9b\x4d\x52\x1d\x55\xe0\x73\x6a\x7b\xb1\xac\x2a\xac\xce\xa3\x91\xc8\x7a\x45\xac\xee\x52\xc1\xea\x1a\xbf\x53\xc0\xea\xfe\xdf\x14\x39\x1d\x5f\x11\x83\x7b\x03\xaa\x41\x4f\xfc\x81\x24\x4e\x60\x5f\xca\xe4\xcc\xe9\x53\x33\xb0\x6f\x4c\x05\x7e\x29\x3c\x1d\x8c\xb0\x59\x19\x3f\x93\xb2\x7e\x2a\x55\xfb\x98\x6e\x92\x54\x35\x43\x10\x59\xbb\xc0\x2a\x57\x71\xb9\xc8\xac\x85\xa7\x66\x72\xaa\x38\x6c\x9b\x27\x1d\x17\x6a\xd4\x29\x67\x9a\x35\x43\x1a\xb8\x8e\xca\xcc\x28\x95\x83\x92\x1f\xd2\xd0\x26\xbf\x7a\x39\x19\x6e\x68\x35\x0e\x35\x32\x9f\x8d\x7f\xd8\x6d\x3d\xd9\xe0\x78\x05\x1f\x4e\x9e\x86\x40\xc8\x38\x57\xf6\x72\xbc\x24\x0f\xa8\x9d\xf9\x32\xad\x33\x8c\xfd\x7c\xea\x15\xf0\x17\xcf\x7a\x99\xa6\x73\xcf\xa7\x76\x2f\x38\x4f\x4f\x73\xf7\x3e\xb9\x9e\xfe\x07\x21\x1f\xee\x22\x3b\x84\xb3\x6e\xbc\xb7\xcb\xfa\xcb\x6d\xd2\x73\x17\xdb\x51\x0d\x43\x3f\xd4\x68\x78\x44\x1d\x57\xe4\xc7\xb4\xef\x89\xa9\x27\x51\x85\x5e\x5e\x6d\xc2\x3b\x6a\x24\x0f\x69\x69\x18\x72\x06\xfa\xe7\xd5\x67\x9b\x60\xd2\xd5\x1e\xd7\x4d\xb0\xce\x8b\x5a\xde\x65\xb9\xb5\xc1\x86\xab\x6a\xe9\xaa\xd2\x21\x54\x1b\x06\x61\xc0\xf3\x5f\x05\x3d\xaa\xfc\x31\xae\x8f\xe4\x69\x30\xe6\x78\x50\xf0\xfb\xd5\x54\x41\x03\x80\xa1\x99\xa7\xb9\x80\x3a\x21\x15\xfd\x64\x00\x86\x51\x93\x74\x3d\x7e\x30\xcf\x2d\x21\x66\x72\x82\x26\x76\x6c\x13\xb8\xcb\x79\x61\x2c\x10\x1b\x96\x9d\x62\x8d\x4c\x9a\x30\xae\x1e\xa8\xf6\x33\xe6\xfd\x25\xce\x19\x28\x19\x3a\xc4\xf5\xb2\xf1\x10\x53\x67\x89\xaf\xff\x30\x39\x44\x0e\xac\xc0\x23\x1a\x12\x19\x56\x6c\xa9\x92\x7f\x48\x93\xdd\x0b\xae\x27\xd7\x95\xf1\x35\x95\xdc\xf4\xd9\xb4\xf6\xbb\x42\x7a\xfd\x25\x68\x54\xb4\xe0\xc6\xb4\xe7\x3a\x37\xa2\x38\x3b\x41\x9b\x1c\x3b\x4d\xf0\x7d\x73\xc8\x29\xef\x2f\x79\xb6\x69\x4e\x44\x92\x43\x10\x2e\x1a\x62\x82\xb6\x4d\xb3\xe2\xce\xb2\x2a\x8f\xa7\x9e\xee\x95\xa9\xec\x4e\xb1\x34\xef\x24\x3b\x8e\x3d\x30\x35\x32\x03\x9f\x8d\xff\x08\xf4\x2f\x09\x55\xb7\x31\x68\x57\xa9\x17\x4f\x8b\x1c\x7e\x20\x56\x15\xe6\xad\x90\x34\xaf\x28\xe0\x34\x9b\x6c\x36\x33\x5c\x7c\x30\x93\x1c\x90\x5c\x6a\xdd\x86\x12\x63\x8a\x01\x94\x83\x11\xb7\xf3\x48\xf8\x15\xff\x21\x4d\x2a\xbe\x6e\xe3\x1f\x57\xe6\xde\x0f\xd9\xa3\xec\x43\x13\xae\x01\x7f\x94\x69\xc9\x63\x6d\xfd\x62\x2a\x39\x3a\xdf\x78\x95\x55\x2f\xbe\x9b\xd8\x4c\xf4\xf9\x4b\x51\xf5\x14\x72\x27\x94\xf9\x62\x9a\xa6\x50\x88\xa0\xc6\x77\x0e\x5b\x17\x7c\x0d\xa1\xb9\x44\x8b\x45\x93\xaf\x00\x27\x17\x95\x01\x9f\x14\xbd\xbc\xaa\xe0\x49\x9b\xbc\x90\x22\xba\x56\x33\x7e\x46\x79\x91\xcf\xa5\xb4\xdf\xe5\xea\x2b\x97\x4a\xed\x59\x7d\xe5\x12\x90\xc5\xc6\xb9\xf4\xc0\xbe\xcf\x37\xdc\x78\xe9\x25\x5f\xda\x5f\x5d\x49\x6e\xac\xe5\x7f\xc3\x4a\x39\xe9\x94\x8c\xdf\xbf\xd2\x3a\xa0\xfe\x25\x18\xc0\x92\xe8\x2e\x40\x4b\x40\xc2\xcc\x84\x0a\x1c\x0f\xc0\x15\x9f\x74\xb0\xdf\xfb\x0a\xf4\x04\xd7\xea\x09\xbe\x7d\x1b\x21\xb3\xae\xe7\x04\xcb\x63\xcc\x07\xf8\x8f\xdb\xac\x6f\xa4\xb3\xea\xdf\xc9\x5d\x91\x9f\x67\x72\x9b\x1e\x28\x78\x2e\xd0\x65\xae\x6e\x45\x83\x18\x10\x1e\x53\x36\x5e\x79\x81\xb2\x0f\x3c\xe6\x62\xef\x37\x7b\x06\x7a\xfa\xcd\x9e\x27\xb9\xc9\x67\xf7\xd8\xa6\x7e\x1f\x8d\xbf\x7d\x76\x39\xa2\x26\x6f\x58\x93\xa3\x1a\x8f\x31\x2f\x2c\x86\x99\x3c\x74\xe6\xf8\xc0\x41\x33\x60\x5f\x0b\x87\x3e\xa0\x89\x59\x18\x41\x59\xba\xeb\xe9\x23\xc3\xf4\xd8\xa5\xfe\x22\x0d\x8a\x4e\x29\xce\xbf\x17\x2d\x0b\xe0\x6f\x38\x15\xf8\x7b\xfa\x55\x33\x47\xc9\x2c\x28\x1b\xc9\x68\x75\xd4\x82\x77\xc1\x36\x1f\x0a\xf9\xae\xab\xd8\x7f\x44\x93\x24\x28\xc1\x35\x87\xec\xa1\xbd\x77\xc6\xbd\x1b\x55\x35\x6f\x91\x46\xf6\x7b\x53\xd7\x90\xab\x8d\x2e\xf6\xb0\x75\x48\xea\xfe\x30\x4d\xba\xc0\x31\xfb\xfd\xb4\xf5\x9e\x74\xf5\xeb\xa8\xfe\x64\xda\xf2\x56\xce\xf2\x44\x7d\x10\x93\xe7\x7b\x03\x5c\xd6\x15\x2f\x05\x86\x97\x1d\xaa\x34\x69\x8b\x3e\x7e\x35\x5e\x49\x93\x97\x01\x67\x8b\x97\x51\x39\xde\x8a\x5e\x49\x23\xda\xbf\xbf\x4e\x91\x5d\xee\xc2\x42\x19\x8a\x4f\x8c\x3f\x4b\x59\x2f\xa6\x26\xe4\x3f\x21\x55\x1d\x0a\x39\x7d\xe8\x14\xd5\x9f\xec\x6d\x04\x1a\x29\x7e\x1a\x36\xcd\x58\x85\xe5\x2a\xbd\x7b\xb3\x17\xb2\x85\x2b\xc0\xf0\xca\xec\xf7\x3e\x51\xe3\x1f\x25\xef\xcb\xfd\x23\xb6\x98\x2a\xb3\xe5\x45\x47\x53\x8e\xf8\x09\x90\x8e\x6f\x40\x9e\x5b\xb4\x13\x3c\x5c\x88\x8a\x20\x13\x6b\x32\x1a\xfc\xea\xe6\xc0\x88\x6d\xf4\x0f\x68\x98\x87\x4a\xa7\x94\x0b\xbd\x32\x7f\xe9\xed\x97\x91\x4c\x8d\x9d\xfe\x94\x9f\x57\xb5\xce\x82\x8d\x60\x81\x7a\x91\xf1\xcd\xed\xd6\xd2\x08\x67\x7e\x53\x15\x97\x41\x7c\x5c\x2c\x50\xd5\x15\x11\xfc\x5c\xa9\xf0\xf8\x1e\xd9\x6f\x3a\xbc\x11\x27\x18\xa9\xb2\x10\x51\x9e\x1c\xd0\xa2\x62\xed\x63\x3a\x10\x7c\x0e\xbe\xb7\x3e\x9f\xda\x76\x81\x2e\x3f\x9f\xda\x29\xaf\x48\x18\x12\x9f\xeb\x22\x47\x09\x3b\xc1\x38\x68\xdd\x79\x46\x16\x6a\xc2\x18\xaa\x2f\x5c\x5c\xdb\x1d\x93\x63\xe9\x8b\xe6\x47\x53\x44\x0d\x6e\xfc\x50\xca\x8a\xa6\x75\xd7\xfd\x02\x5d\xee\x09\xf9\x04\xd9\x9b\x99\x77\x4b\xa2\xf3\x36\xef\x4b\x28\x2d\x00\x28\x06\x54\x4f\x25\x88\xa3\xa0\x24\x2e\x62\xff\x37\xfe\xb4\x1b\x46\x61\xbf\x39\xe6\xd3\xf0\x94\x1f\xc1\x3f\x6d\xf3\x7e\xd1\x8b\xed\x44\x94\x98\xd0\xbf\xa6\xc9\x65\x7c\x5c\xe3\xef\xd3\xd6\xcb\xe9\x11\x0d\x0f\xd0\xb5\x80\xc6\x6f\x20\xa5\xe9\x86\xec\x3b\xf4\x03\x79\xdf\x68\x5e\x2b\xd5\x63\x43\xc8\x18\x03\xdb\x1f\xa0\x7a\xb5\xe6\x18\x7c\xba\x6c\x1c\x7d\xc2\x0d\x86\xab\x3f\xd4\xfd\xe0\x7f\x9c\xa8\x7b\x31\x14\x0c\x2b\xde\x28\xd1\x2b\x43\x26\x01\xc4\x7d\xf1\x44\xd7\x0a\x51\x1c\xe2\x99\xc2\x64\x15\xfc\x7d\x7c\x3c\x6e\x11\x16\x9d\x9c\xde\x42\x0e\xca\x24\x69\x01\x0a\x61\x82\x02\xf4\xeb\xc8\xcd\x37\xa2\x16\x79\xf3\x2b\xc8\x89\x55\x03\x45\x35\x28\xd0\x8c\xdf\xba\xc2\x3a\x57\xe3\xf7\xa4\x49\xa0\x3b\xc9\x92\x4e\xdd\x31\xcf\x9c\x98\x61\xa7\x79\x02\x37\x53\x7b\xae\xac\x45\x4a\x7c\x0b\x7f\x74\x39\xf9\xdd\x14\xd9\x99\x73\xb2\x65\x2f\x5f\xa4\xc6\x87\x53\xdc\x48\xb1\x7e\x2e\x25\x7f\xe3\x1f\xea\xd4\xf8\x49\x93\x7a\x39\x3f\x4f\xf3\xe6\xe8\x88\x39\xcb\x0f\x25\x25\x2e\xfd\x23\xc5\xa3\xa4\xdd\xb6\x47\x75\x86\xd6\x52\xb9\xe1\xe5\x27\xba\xe8\xf0\xca\x4d\xb6\x35\x32\xaf\xde\xf7\xa3\x50\xe6\x5c\x68\x76\x55\xc0\x6f\x95\x58\xff\x3f\x95\x26\x3b\x44\x9b\x22\xe3\x47\xd2\xe4\x5c\x3d\x25\xbe\xc2\x77\x23\x42\x67\xb1\x0f\xf9\xfe\x94\x6c\x86\xe4\xf2\xf2\x39\x71\x40\x3a\x04\xf2\x68\x35\xf5\xd2\x38\x07\xf0\xe4\x09\x7e\x00\x58\xac\xfc\x18\xe2\x54\x12\x60\xbc\xa8\x28\x49\x0f\xca\x9e\xc7\x96\x26\x7b\x99\xb2\xba\x9e\x57\x42\x8b\x9e\x80\xcb\x7e\x59\x3a\x2d\xcc\x4e\x3b\x2f\xee\x72\xde\x26\xff\xb0\x93\x6c\x2b\x07\x45\xe3\x6f\x76\x5a\x5f\xde\xc9\xee\x58\x70\x17\xa9\x44\x2d\x72\x89\x8e\x2e\x8a\x3f\xc0\xf5\xe2\x10\xff\x43\xd3\x27\xd8\xc3\x2c\x98\xbd\xe7\xc1\xf7\xa1\xc3\x83\x83\xf3\x7e\x18\x0d\x97\xfc\x20\x1a\x2c\x39\xd1\xfc\xf9\x3e\x9b\x17\x72\x72\xae\x30\x36\xda\xf9\x72\x50\x3c\xcf\x1e\x51\x4d\xa4\xe6\x83\x32\xe5\x7b\x9e\x0d\x76\x5e\xef\xf3\x0e\x32\x95\x0a\x93\x0b\x4b\x3e\x7f\xf2\xd9\x0f\x2b\x9b\x34\xbe\x8d\x60\xe5\x14\x34\x5b\x60\x9a\xb2\x1b\x98\x0b\xd0\xd3\x60\x96\x57\x7e\x15\x17\x45\x31\x22\x95\x10\xc7\xd8\xa9\x19\x78\x6a\x7f\x41\x5b\x69\x21\xef\xad\xd3\x6f\x9e\x67\x1b\x69\xbc\x5e\xce\x4b\x13\x50\x8c\x65\xba\xde\x80\x2c\x4c\x67\x03\x39\x61\x05\x49\x83\x63\x16\x9d\x65\xca\x95\xb0\xeb\xf3\x5d\xa1\xcf\x96\x8f\x0e\x0d\x50\x8b\x21\x80\x38\x8e\x67\x4e\x4c\xc9\x6e\x2d\x36\x21\x53\x45\x80\xdb\x3c\xd5\x55\x88\x37\xd9\x3c\xcf\x5e\x5d\x91\x5f\xce\xa4\x3c\xb4\xef\x80\xbd\xd7\xde\x6b\x0f\x9d\xe7\x75\x70\x62\x64\xb6\x72\xdc\xf0\xc2\xb2\x59\xf6\xc0\x93\x67\xab\x24\x62\x5a\xa2\x00\x5d\x75\x72\xec\x4b\x52\x94\x16\x5a\x15\xb7\xcf\x5b\xbe\xb2\x41\x42\xf1\x8d\xb3\x73\x1c\xad\x33\xbd\xc4\x3d\x78\xab\x08\x2a\x43\x04\x17\xa8\xce\xef\xa4\x2f\xff\x99\x32\x54\x0c\x87\x11\x1c\x66\x77\x2e\xba\x17\x28\x6f\xe6\x23\xf6\x16\xb6\xa2\x84\x71\x6e\x53\xbb\x9f\x77\xc5\x77\x42\x38\x05\xfa\xef\x95\x4b\xbc\xf0\xdf\xa3\x4b\x72\x0d\xc8\x16\xaf\xb0\x34\xd5\x22\xb3\xc0\xb8\xb2\x38\xe5\x39\x5b\xc1\x95\x6d\xbc\x2c\x69\x7d\x59\x36\x21\x23\xaa\x21\x13\x27\x94\x73\x8a\x02\xf2\x99\x53\xcd\x41\x45\xe5\x38\xf4\x57\xe5\xbb\x69\x89\x06\x50\x24\x3e\x5b\x14\x2c\x86\x0f\x4d\x9f\xb0\xcd\xd7\xf8\x65\x38\x57\xb5\xf3\x85\xf6\x42\x3e\xb0\xac\x71\x8c\x7e\xd6\x8d\x02\xe6\x57\x8b\x61\x2a\xa9\x3b\xe6\xf4\x72\x5a\x27\xe6\x3b\x80\xee\x47\x73\x2e\x3c\xf0\x48\x14\xb1\xbd\x53\x5c\xce\x59\xe7\xca\x21\x0d\xd8\x52\x98\x75\x42\x37\x67\x3a\xe5\x68\x9e\x53\x2d\x5b\xec\xc0\x30\xbb\xfd\x92\x1f\xe4\x8f\x59\x8a\x4f\x88\x63\x87\xb6\x79\x3c\x70\x0a\xbc\x5a\xb7\xd7\xba\xcd\xb6\x6d\x8b\xb7\xca\xaf\x6e\xb1\x6f\x1d\x15\x47\x85\x73\x2e\x46\xe8\x17\x91\x89\x84\x36\xfe\xec\x2e\xf2\xd8\x6a\x75\xae\xc0\xf1\xca\x61\xe4\x2f\xc8\xb2\xcb\x31\xa5\xcb\x79\x7a\x8a\xf1\xad\x9d\xd6\x74\xe3\x53\x2a\x78\x9d\x39\x57\x84\x6c\xbe\x5a\xe7\xca\xc4\xd6\xf8\xc6\x9d\xe4\xbb\x29\x72\x85\x03\xfc\x05\x34\x0f\xb4\x57\xc6\x5f\xa5\x88\xdb\x9e\xad\xa5\xf1\x63\xc2\xdd\xac\x67\x12\x37\x07\xc9\x47\x92\x2a\x2b\x46\x4a\x14\xa0\xc8\x59\x2b\xe5\x2e\x0c\x13\x30\xe3\xfe\x88\x4c\x17\x2e\xcb\x85\x9c\x77\xe7\x60\xe3\x8a\xe2\xd6\xd7\x7c\x54\x97\xd3\xbe\xd9\xe4\xbd\x69\x42\x72\xbe\xc7\xe9\x12\x43\xe3\x1d\x69\xeb\x54\xfc\x4f\x25\x5c\x21\x57\xde\x41\x2d\x88\xdc\x5c\xb9\xe8\x04\xa6\x13\x02\x39\x1e\x2f\x2a\xae\x2f\xec\xd8\x9c\x7a\x2d\xf1\xc9\xc2\x7a\xc8\x75\x54\x3e\xc2\xf7\x52\x3d\xa4\xbb\xba\x47\xe4\x82\x53\x1a\xb8\x40\x97\x43\x63\x97\xb1\x63\x00\x42\x0d\xe4\x7b\x29\xb3\x6e\x37\xc9\xcb\x8c\xae\x05\xa7\x44\xc8\x97\xb7\x91\x57\x70\xb8\x40\x91\x10\x7e\x7a\x9b\xf5\xbe\x6d\xc9\xdf\x20\xfe\xcb\xa3\x40\x8a\x26\xcf\x9f\xab\x10\x90\xdc\x3b\x68\x00\x9d\xc5\x83\x98\xa5\xcf\x36\xcf\x04\x4e\xee\x82\xf0\xde\x43\xbd\x1f\x2f\x90\x4f\x99\x0e\x53\xc7\x02\x20\x02\xc5\x03\xb1\x3e\x8e\x62\xa8\x73\x5d\x0f\x9a\x3b\xf0\xad\x51\x71\x58\x0b\x58\xc4\x0c\xfd\xc4\x28\xaa\xcf\x14\x47\x89\x99\x14\xc3\xf9\xc4\x19\x6c\x9b\x16\xfc\x00\x92\xe8\xb0\x17\xa0\x14\x36\x4d\xcf\x37\xfd\x62\xb2\x19\x7a\x91\xce\x45\xdc\xbe\x80\x74\xe2\xbe\x7e\x19\xa1\xf2\x64\xe3\x54\x51\x9e\x1d\x55\x31\x21\x0a\xc4\x41\x30\x20\xda\xa6\x12\x2b\x5b\xd3\x8a\xfc\x85\x8d\x21\xa8\x5f\xce\xc3\x4a\x96\xd7\x9f\x67\x5b\x56\x51\xb4\x97\x86\x9e\xf5\x09\x46\xc5\x46\xe6\xfd\xb7\x53\x64\x66\x6d\xeb\x51\xc6\x52\xc6\xfc\x5c\x59\x75\x95\x33\x7e\x26\x65\xbd\xa6\xe6\x11\xf9\x46\xa5\x79\x09\x6e\x89\x17\x9b\x2b\x89\xf2\x75\xb8\x1d\xb3\xcb\xf3\xfa\x10\x49\x3b\x7f\x2f\xe9\x26\xbb\xff\x7f\xf6\xde\x05\x4c\x92\xac\x2a\x17\xfd\x22\xab\xba\xab\x7a\xcf\x30\x33\xc4\x41\xbc\x22\x62\x18\x5c\x9d\xaa\x31\x33\xfb\x39\xaf\x1e\x66\xc6\xea\xaa\xea\xa6\x98\xee\xea\x9a\xaa\xea\x19\x1e\x72\x98\x5d\x99\x3b\x2b\x83\x8e\x8c\xc8\x89\x88\xac\xea\x1c\x0e\x2a\x0c\xa2\x1c\x79\xbf\x6d\x45\x1e\x07\x10\x87\x51\x0f\xca\x43\x11\x8e\x1e\x14\xf0\x05\x28\x7a\x51\xb8\x82\xfa\xc9\xcb\x37\x1e\xe1\x72\xe9\xab\x9e\xfb\xed\xb5\xd6\xde\xb1\x77\x64\x64\x56\x55\xd7\xcc\x80\x7e\x75\xbe\x23\xd3\x15\x19\xb1\xdf\x7b\xed\xb5\xd7\xe3\xff\xd1\xff\x0a\x47\x9c\x6b\xf5\xcf\x45\x15\xd1\x7a\xf6\xe0\x15\x16\xbb\xdd\x30\x18\x99\x22\x48\xb5\xcd\x6e\xf7\x25\xe6\x3f\xdf\x19\x09\x68\x63\xfb\x84\x6d\x23\x27\xd8\xe6\x9b\x25\x40\x4b\x28\xfa\x40\x36\x7a\x60\x55\xd0\x30\x59\x48\x73\xaf\xfd\x2a\x64\xd7\xb7\x86\xe2\x93\x93\xec\xdf\x1c\x36\xa9\x20\x65\xdd\x7f\x72\xfc\x05\x8d\x35\x63\x85\x69\x6c\x9a\xf0\x3f\x70\x07\x01\xec\x95\x01\x76\xe0\x1c\x7e\xc9\x5a\x44\xf3\x6c\x96\xcd\xec\x18\x97\xa7\x38\xa0\x52\x50\x3d\xde\x12\x3f\x70\x1b\xad\xc1\xcd\x54\xca\x2a\x77\xc2\xdd\x27\x65\x37\x93\x6f\x7e\x67\xc9\x9b\x74\x9b\xed\xbb\x93\xee\x7e\xf8\x8a\xed\x39\x52\xf6\xc2\xd3\xbf\x79\x06\xd7\x3f\x34\x0d\xae\xbf\xb5\x6b\x83\xeb\xf3\x8b\x06\x57\x6d\x6e\xbd\xe5\x91\x32\xb7\xd6\x2f\x39\x3f\xb4\xb5\xbd\xf5\x19\xee\xd3\x6a\xe5\x11\x67\xe5\xb2\xa0\x90\x57\x3a\x4a\x8c\x32\xf6\xd9\x71\xf6\x24\xdb\x35\x0e\xd9\x32\x36\xda\xd7\x8a\x08\x5b\x2b\x08\xac\x3b\xd3\x68\x88\x34\x45\x88\x63\x08\xde\xf9\xe9\x71\xff\xed\xce\x88\x17\x70\x7d\x1b\x47\x88\x8e\x7f\x87\x17\x73\xa6\xe6\xa2\x2d\x40\x29\x36\x33\x66\x93\x66\x14\x0c\x16\x4a\xd0\xc5\x38\xda\xea\x35\x6d\x3f\x10\x99\x25\xce\x3f\x5f\x61\xbf\xe8\xb0\x6f\x8b\x8c\x12\xf4\x47\xee\x6b\x1c\x36\x37\x2a\x7c\xa0\x64\x8c\x16\xcb\x0a\xf2\xcf\x94\x3e\x36\x4e\x2f\xd3\x16\x87\xd9\x4a\xf2\x46\xab\xf7\xba\x3d\x48\xb2\xc5\x6e\x32\xd8\xdc\xd7\x3b\xa3\x0e\x8c\xd2\xe6\x96\xb4\x75\x65\xab\xa1\x1c\xd5\xea\x61\x2d\xfe\xda\x38\x7b\x62\x89\xf1\x1f\xd3\xc8\x96\x92\xf8\xd9\x68\x6e\x74\x3f\x36\xee\x3f\x39\xff\xd3\x62\x03\xed\xe2\x63\xd1\xf4\x38\x44\x89\xc0\x45\x1c\x55\xc7\x1c\xcd\x9a\x68\x5e\x40\x74\x58\xf3\xfc\xd5\x31\x76\x1f\xbb\xa2\x19\x6f\x46\x9b\x3c\x69\xce\x2c\x2d\xb8\xe7\xd9\x0d\x5b\x46\x0e\xcf\xe5\xef\xe7\xad\xf2\x0f\x97\xa7\x31\x18\x85\xa3\x07\x10\x31\xf7\xc1\x99\x78\x9e\xed\x4f\x45\x23\x11\x99\xcb\xd9\xe1\x2d\xab\x5d\x81\x57\x8d\x1a\xab\xe5\x35\x62\x91\x03\x95\xbd\xd2\x61\xff\x89\x2c\x5a\x33\x0d\x88\x09\x59\x8d\xcf\x8b\xc8\x7d\x0e\xbb\x6d\x1b\x55\x0f\x7c\x67\xb4\xe3\xe6\x61\xed\x18\xf8\x68\xa0\x51\x19\x3b\xd0\xd0\x41\x1d\xeb\xec\xd8\x96\x2d\xd1\x8e\x24\xa3\xfe\x83\xe5\xf5\xeb\x82\x07\x6a\x7d\xfb\xa3\x4b\x73\x0d\xec\x5e\xba\x3f\xf2\x68\xff\xfd\x8e\xfd\xcc\x5b\x93\xe7\x8e\x97\xc5\xeb\x80\x5e\x74\xdc\xbb\x8e\xa0\xa1\xab\x5e\x2f\x6a\x8a\x24\xcd\xe2\x18\x10\x00\x01\xda\x13\x35\x8d\xae\x48\xda\xbc\x9b\xca\xa7\x5d\x91\x04\xdd\xb6\x48\x78\x48\x36\xe9\x14\x6d\x33\x3c\x22\x5b\x4c\xd6\x87\x12\xbb\x49\x10\x35\x82\x2e\x0f\xf3\x48\x4d\xc4\xf4\x6b\x23\x5d\x75\xa6\x62\xac\x68\x2f\x8a\x26\x7c\x46\x9e\x20\x9c\x7f\x7b\xa1\xff\xdf\x57\xb1\xdf\x02\x63\x36\xfc\xe4\xfe\x4a\xc5\x7f\x93\x83\xeb\x69\x20\xb1\x98\xde\x29\x04\x82\x81\x01\x40\x76\x21\x6e\xe6\x96\xe3\x5e\x1e\xba\x60\x8f\xd3\x2e\x03\xfd\xb1\x09\xa6\xda\x7b\x8c\x1d\x61\x87\xb6\x5c\x1c\x85\xd8\xac\x3d\x2d\xf7\x5b\x51\xcb\xfd\x13\x87\x3d\x1e\x72\x6a\xe5\x42\x29\x11\x2c\xee\x7b\x1d\xff\x67\x9d\x99\x11\x6f\x94\x50\xd5\x58\xcb\x12\x4c\xe5\x41\xaa\x0d\xfd\x9c\x36\x2f\x8d\x28\x3a\xfa\x22\x80\x1e\xcc\xa0\xbc\x42\x8a\xaf\x7c\x59\xea\xb5\xb3\xb8\xef\xe2\x0d\x91\x24\x41\xb3\x29\x5f\xcc\x74\x84\x2a\x80\x94\xdb\x01\x13\x5f\x18\x63\xd7\x00\x2c\xff\x52\x2f\x0c\x69\x77\xb9\x7f\x30\xe6\xff\xd8\xd8\x42\xe1\xa9\x7d\x25\xd4\xfe\x9e\x14\x4d\x6c\xf4\x0a\x5a\xd0\x52\xde\x31\xd1\xc6\x15\x0b\x44\x9c\x78\xdd\x5e\x18\xe2\x1d\xbe\x8f\x7c\x01\xc8\xd3\x0d\xe1\x6e\xe8\xcb\xd6\x6e\xa4\xb2\x1d\x3a\xd0\x26\x9e\x80\x65\x2f\x0b\xa2\x46\x86\x17\x03\xf5\x8b\x02\x2d\x56\x7f\xeb\xa0\x12\x18\x28\xd5\xd2\x6e\xdc\x44\x64\xcb\xd2\x92\x21\x9a\x05\xcf\x7f\x94\x24\xe0\x62\xa7\x48\xa6\xcb\x10\x17\x2a\xf1\x07\x7b\x7e\xf0\x89\xc4\x7c\x13\x44\xeb\x35\xa4\x46\xe8\x85\x21\x0d\x65\x2d\x8e\x6a\xbc\xd6\x8d\x9b\x3b\xe7\x44\x3b\x1d\x37\x78\x58\x10\x2b\x7b\xf7\xb4\xbd\xc0\x98\x42\x60\xcc\x76\x33\x86\x86\xa5\x06\x69\xaa\x37\x6b\x8f\x32\xf6\xba\x31\xe6\x97\x31\xf5\xcd\x2e\xad\xc4\x8d\xf3\x22\x9b\x41\xfd\xf8\x2b\x15\xff\xd6\xc2\xb3\x02\x87\x1b\x3e\xd3\x78\x03\x71\x57\x44\x14\x95\x00\xdf\x5c\x74\xc6\xa5\xaa\x6c\x27\x49\x56\xd8\x47\x1d\x06\xcf\xdd\xff\xb1\xed\x89\xea\x65\x41\x58\x0f\xa2\x2c\xcd\x92\xfa\x42\x94\x9d\x4d\x56\x60\xde\xfd\xe7\x2e\x52\xec\x70\x62\xf1\x8e\xc8\xd2\x31\x7e\x19\x49\xa8\x22\xa5\xb9\x29\xca\x75\xfa\x4c\x5d\xd4\x48\xd4\x40\xd8\xa6\x77\x58\x7e\x79\xc3\xf5\xd7\x1f\xbd\x9e\x68\x55\xd4\x5b\x3c\xf2\x16\x66\x16\x67\x9e\xb5\x72\xd7\xec\xb3\x16\x67\xce\xcc\xd7\xd9\x59\x36\xde\x8e\xd3\xcc\x3d\xe5\x1f\x3f\x4b\xee\xb8\xe3\xde\x93\xe3\x34\xc3\xd6\x60\x78\x70\x84\xdc\x30\x55\x2b\x4c\x5e\xc9\xfb\x85\x25\xcb\x19\xf5\xee\x03\xec\xdc\x65\x07\x00\x0c\x73\x24\x40\x8a\xeb\x67\x26\xfd\x3b\x46\xbd\x60\x9f\x1d\xc3\xde\x1c\x8d\xd0\xf3\xaf\x7b\xb8\x92\xbb\xd6\x63\x7e\x49\x27\xc0\xbe\xc3\xf1\x6f\x40\x30\x39\x84\xb4\xce\xd3\x51\xb6\x9a\x1d\xf3\x40\x6a\x30\xce\x9e\xf5\x10\x45\x98\x0c\xab\x77\xef\xe8\xfa\x16\x41\xaa\xdc\xd8\xfa\xc0\x58\x71\xef\xd4\x91\x94\xf6\x04\x17\xa1\x2a\x47\x08\x8b\x62\xb8\xe5\xbb\x8f\xb1\xa3\x97\xe1\x2f\x70\xff\xe5\x9b\xc4\x12\x7a\xd1\x31\x69\x03\x2e\x3a\xc3\xe8\xd9\x2c\xe9\xf6\x89\x23\xec\x6b\x05\xbe\x81\x2f\x8c\xf9\x7f\xf2\xd0\xf3\x0d\x20\xcd\x80\x45\x30\x30\xa5\xfd\x3b\x8a\x76\x79\x23\xe0\x0a\xf8\x28\x8f\xca\x51\x3c\x8d\x2b\x71\x07\xa2\xb6\x08\x58\x7f\xba\xbe\xc7\x50\xb0\x63\x86\x02\x8b\xe0\xb0\x40\x46\xf0\xe2\x09\xff\xdf\xf6\xc8\x08\xf6\xc8\x08\xf6\xc8\x08\x1e\x61\x32\x82\x7c\x1b\xec\x71\x08\xee\x71\x08\xee\x71\x08\xee\x71\x08\xee\x71\x08\xee\x71\x08\xee\x71\x08\xfe\xc7\xe1\x10\x7c\xf9\x24\x73\x13\x91\x13\x9e\x93\xc6\xfd\x8d\x09\xff\x6f\x27\x06\x9f\x97\xf8\x6c\xac\x3b\x97\x81\x71\x40\x9c\xfe\x08\x49\x82\x3c\xdf\xa9\x49\xb7\x3f\x9a\xdb\xbf\x54\x41\x47\x2a\x74\x54\xb5\x14\xf5\xbf\xd4\xcf\xe1\xf9\x71\x6b\x9c\x41\x92\x92\xf2\xa9\x9a\x82\x90\x43\x72\x8d\xc8\x8b\x15\xd2\x04\x8e\x68\x82\x3c\x1a\xb0\x8e\x92\xa2\xf3\x62\x2d\x34\x0b\x83\x43\x5e\x76\xd8\xec\xaf\x3d\xa7\x79\x3d\x85\x8d\x8d\x81\xda\x8a\xae\x1f\xe2\x6f\x95\x56\xba\xd6\xa7\x90\x88\xbc\x18\x24\x28\x4c\x0d\x9c\x25\x90\x4f\x3c\xb4\xf8\xda\x8d\xeb\x28\xec\x0b\x75\x6d\x35\x89\xf2\xaf\xeb\xf4\xd2\xec\x3a\x30\xce\x36\x45\xa7\x1b\x67\x90\x36\x07\x77\x65\x74\xb9\xa3\x65\x97\x4e\x3e\xb8\xe5\x75\x13\xb1\x11\xc4\xbd\x34\xec\xeb\xf6\xd6\xbd\xc5\x38\x13\xc7\xbd\xeb\x0a\x40\x13\xe5\xdc\xfa\x6a\x57\x0d\x90\xfc\x8b\x3c\x4c\xa8\xee\x5d\x27\x47\x68\x48\x01\x89\x48\xe5\xd2\x0f\x22\xaf\xd5\x4b\x60\x6c\x70\xb4\xd4\xef\xb4\x27\xb0\xd9\x55\x23\x6a\x93\x12\x15\x06\x6a\x96\x85\x9f\x57\xe2\x52\xd6\xbd\x69\x8d\x1c\xe6\x6e\xe4\xa3\xa6\xef\xe4\x8a\x34\x5e\x4a\x85\x20\x0a\x3a\xc1\x7d\x62\x5b\x43\x20\xab\x30\xd3\xe2\x72\x09\x86\x53\x0a\xb0\x40\xbd\x8c\xba\x23\x9b\x6d\x34\x59\xf1\x56\x56\x29\xd1\x63\x43\x33\x48\x96\x48\x0f\x95\xf7\x54\x50\xf1\x71\x4f\x59\xb7\xef\xbf\xd6\xb4\xa2\x7f\xbe\x47\x2b\xba\x47\x2b\x5a\xc2\xa2\xf2\x64\x76\x72\x54\xf0\xdc\x30\x73\x64\x09\xa3\xe8\x6b\xc7\xd9\x30\x63\xa0\x7b\x69\xcc\xff\xec\xd8\x4c\xf9\x8f\x78\x6f\xf2\xd4\xb6\x53\x7e\x94\x2e\x78\xcb\xe5\x93\x7b\x0a\x1f\xde\x93\x27\x0b\xc8\x29\x50\xd6\x4f\x71\xa1\x4b\xb6\xc1\xa5\x05\x95\x85\x0a\x02\x3e\x4b\xfa\xda\x4b\x0f\x10\x75\x2a\x85\x81\xb4\x0f\xa8\x11\x17\x42\x90\xa9\x20\xb5\x94\x70\x1c\x22\x31\x90\xa1\x90\x5b\x83\xcc\xcc\x02\x23\xba\x6d\xad\x6f\xb4\xa1\x6a\x02\x5a\x40\x7b\x5a\x3c\x08\xf3\xcc\x51\xe5\x9d\x59\x68\x21\xb3\x1d\x66\x81\xe4\xdb\xc9\x9a\xc1\x1c\x4d\x56\x05\x03\xe5\xd9\x21\x51\xd3\x6b\xc6\x22\x25\x48\x15\xb0\x58\xc0\x15\x47\xbf\x81\x46\x3a\x92\xa3\xb2\x81\x2b\xd4\x40\x23\x97\xaf\x70\x36\x42\x53\x11\xe6\xcf\x4b\x7b\xa4\x8f\xe1\x7b\xf2\xa7\x5e\x22\xbc\x2e\x68\x13\xa3\xf2\x2a\x7e\xd2\x61\x96\x09\xd9\xfd\x71\x87\xcd\xef\x7c\xc9\x95\x24\x4a\xfb\xb7\x5b\x69\xd3\x96\x29\x31\xf6\xc8\xed\x00\x09\x4c\xfa\x06\x87\x69\x8a\x84\x60\xd0\x64\x0f\x3a\xec\x51\xd4\x13\x52\x97\x2e\x3a\xfe\x8b\x9d\x93\xe6\x23\xab\x5c\xcb\xdb\x25\x92\x24\x4e\x0c\x87\x8a\xa1\x14\x28\xd7\x8a\xdc\xde\x6d\x1e\x35\xe5\xce\xae\xe5\xb3\x96\xab\x42\x0b\xeb\x91\xd4\x66\xe2\xc4\x93\x95\xda\xec\xae\xf0\xc4\x1c\xca\x2f\x39\x0c\x8c\xf2\xee\xe7\x1c\xff\x0f\x9c\x55\x32\x86\x0c\xea\x24\x3a\x1f\x13\xbc\xb0\xb9\x2a\xd7\xea\x85\x61\xdf\xbb\xb7\xc7\x43\xca\xc4\xc6\xcc\x57\x8c\xcf\xc0\x89\xb4\x2e\x76\x55\x02\x97\xf4\x8d\x37\x7c\x15\x9f\x66\x56\x6d\x5d\x28\xac\x22\xca\xde\x8e\x93\x75\x1e\xa9\x18\x57\x3d\x19\xb6\xdd\xb8\x32\x80\xb2\xfc\x22\x8d\xce\xf6\xcf\xce\xea\x28\x94\x65\xfa\xae\x24\x3b\x7b\x46\x2b\x57\xea\x9d\x2e\x4f\x53\x91\x56\x0b\x67\x5b\x18\xe6\x00\x03\x30\x3f\x4d\x8f\x10\xb7\xe4\xbe\xc9\x7f\x87\xfd\x61\x91\x06\x14\xb6\x05\x1c\x8d\xaa\x2e\x1b\xcb\x59\x81\xf9\xa1\x09\xef\xe8\x21\x05\x0e\x6d\x5d\x03\x0e\xe7\x8f\x2d\x3c\xae\xbf\xbb\x66\x9b\x4c\xa2\x94\x49\xf9\x81\x6b\xfc\xdb\xcc\x07\x85\x8c\x9c\x90\xa7\x59\x2d\x11\xbc\x99\x67\x50\x6a\x8d\x1a\x41\xcf\xea\x65\x34\xa1\x5f\xbc\x9a\xfd\xde\x18\x7b\xb4\x8e\x0e\x50\x2e\x2f\xf7\x3d\x63\x3b\x84\x29\x9f\x2d\x16\x61\x36\xd6\xff\x62\x45\x57\x91\x5b\x8f\xe1\x7c\x40\xac\xb5\x01\x32\xd1\xa9\xb4\xd7\x68\x63\xd8\x59\x9c\x0a\x5b\x62\xeb\x23\x55\x0e\x3b\xc0\xa9\xa5\xd3\xb9\x6c\xbc\x43\xaf\x5d\x35\x44\x14\x96\x81\x83\x91\xb7\x23\x88\x10\xa8\xb0\x1b\xeb\x78\x2b\x05\xb4\x88\x30\x6b\x04\x34\x07\xc9\xe5\xde\xec\xd2\x39\xb9\x82\x3a\xa2\x13\x27\xfd\x69\xca\x93\x56\x70\x72\x52\x0c\xac\xf5\x02\xd4\x7e\xad\x36\xe0\x7e\x82\x5b\x2f\xf4\x81\x87\x1e\x8d\x1c\xa9\xad\x18\xa1\x11\x77\x71\x67\xc9\xbe\x6a\xd4\x3d\x80\x10\x8a\x93\x0e\x0f\xe5\xb1\x52\x93\xed\xcc\xa1\x1e\x95\xfe\xe2\x77\xe3\x66\xea\x13\x3c\x63\x9d\x7d\xb5\xc2\x26\x55\xfa\x99\xfb\xa5\xca\xe8\x38\xf5\x81\x49\x54\x49\x6e\xd6\xdc\xbd\xb9\x62\xe4\xb3\xe5\x33\xb6\x1e\xc6\x6b\x39\xe8\x20\x68\xe4\x43\xec\x97\xf2\x0c\x33\x66\x45\x9f\x97\x99\x4e\x88\xcc\x9b\x62\xd8\x58\x8c\x08\x64\x72\x19\x81\x98\x96\x9a\x5c\x1c\x81\xab\x40\x45\x27\xc6\xbd\x0c\x1c\x6a\x71\x4b\x6b\x88\x53\x46\x82\xb6\x17\x8a\x68\x3d\x6b\xcb\x9f\xef\xed\x89\x1e\x5c\x37\x1b\x61\xdc\x93\xc3\x99\xa6\x60\x2f\x53\x81\x8d\x60\xdd\xb8\x73\x69\x05\xab\x0a\x63\xde\x5c\xe3\x21\x8f\x1a\x72\xd9\x0e\xad\x6c\xba\xce\x3e\xe4\xa8\x3d\xe5\xbe\xcf\x61\xb7\xef\x68\xd0\x75\xec\x55\x3e\xe4\x99\x8e\x05\xc8\xc7\x9b\x06\xba\x6c\x4d\x9f\x2f\x0e\xae\xd5\xfd\xaa\xd7\x0e\xb2\xb4\x26\x97\x10\x4a\x22\xb2\xd0\x13\x82\xae\x32\xab\xd4\xd9\x6b\x2a\x6c\x5c\xae\x26\xf7\xc5\x95\xe1\xb1\x49\xa5\x5d\x58\x8a\x9b\xa9\xd5\x81\xdf\x75\x30\x7c\x74\x64\xfb\xb7\xb7\xfb\xac\x9e\x64\x09\x8f\x52\x0c\xbd\x4a\x6b\x74\x11\x16\x4d\xa3\x6f\x0a\xa2\x75\x43\xe1\xa5\x91\x6b\x14\x99\x6e\x9b\x3a\xce\x5c\xc1\x1e\xe3\x15\x5f\xae\x29\x9e\xe4\xa8\x91\x26\x34\x6b\x9d\xfd\xe4\x18\x9b\x54\xf2\xc9\x7d\xf1\xd8\x0e\xf7\x54\xa9\x3c\xfc\x48\xe5\x9b\x22\x05\xff\xe3\xc9\xbb\xb7\x55\x88\x10\xf9\xa7\x2b\xfe\x4b\x2b\x8a\xef\x18\xe6\xd0\xc6\x9f\xa5\x0f\x00\xb3\x55\xad\x0a\xba\x1b\xf8\x03\x67\x97\x5f\xf5\x7c\x25\x0b\xe5\xbf\x71\x8b\xca\x7f\x2d\x41\xed\x71\xe2\xf9\xc6\xbb\x30\xac\x39\x5a\xb7\x5a\xf0\xca\x24\xac\xb0\x4e\xcc\x54\x57\xb2\xcd\x94\x54\xad\x49\x9b\xf3\x71\x41\xf7\x19\xa9\x27\x88\x17\x5b\x53\x78\xb1\xba\x80\x33\x34\x54\x39\x68\xac\xa5\xc2\x4f\xb2\xc3\xc6\x42\x25\xe5\x46\x65\x27\x2d\xc5\xcd\xb9\x20\x4d\x7a\x30\x43\x27\x7a\xcd\x75\x81\x84\x76\x7f\x35\xe1\xff\xc0\x90\xdf\xca\x38\xed\x4a\x5e\x1d\x12\x2d\xf7\xc6\xfd\x7b\x71\x53\xdf\x12\x71\x53\x7b\x41\x8b\xbb\x0d\x5a\x3c\xa7\x62\x16\x4f\x6f\x1f\xd3\x7e\xeb\xed\x77\xc9\x69\x6f\x1d\xcf\x36\xef\xce\xea\x78\x36\x2c\x52\x47\xb0\x0d\xd9\xb5\xa5\x34\xcb\xff\x7b\x92\x5d\x3f\xec\x10\x1b\x8d\x24\xff\xe1\x49\xbf\x66\xd3\x2f\xc1\xbd\x63\x28\x01\xdc\x8e\x70\xe1\xbf\x3c\xc1\x5e\x52\x00\x58\xfe\x21\x75\x7f\x0c\x46\x63\x29\xe7\x19\x1b\x14\x4d\x92\x8a\x4c\x25\x48\xe4\xad\xb9\xc5\x30\x1b\xa6\x1d\x0e\xf0\x19\xe0\x93\x38\x33\x0c\x44\x79\x0f\x6e\xfc\x5b\x06\x6e\x7c\x76\x7b\x4a\xd8\x68\xa4\xf1\x77\x3a\x16\x30\x1c\xd4\x92\x07\x7b\xdc\x32\x7c\x21\xa3\x0a\x11\x0a\x9e\xd8\x8a\x94\x3e\x99\x10\x1a\xbb\xab\xcd\xba\x56\x34\x81\xe2\x0f\x28\x2c\x58\x48\x72\x84\xa1\xcb\x52\x18\x46\x8b\xda\xb0\xce\xfe\xc4\x61\x4f\x40\x1d\x6d\x76\xe9\xdc\xb9\x2c\x50\xcc\x10\x4b\x22\x69\x48\xe1\xbb\x2e\xdc\x77\x6b\x04\xf2\x9f\x71\x48\x9d\x23\xd5\x17\x14\xba\x5e\xfe\x91\x37\xa5\xa5\x36\x01\x2f\x4a\xa5\x8b\xca\xc1\xe5\x09\xe7\xa0\x68\xca\x2f\xa7\x21\x65\x0b\x3c\x20\x14\xbd\x9f\xde\x22\x17\x16\xc0\xe4\x6a\xad\x14\xfb\x86\xa6\x0f\xf3\x4e\x87\xb2\xc9\xc2\x1f\xb4\xa7\xf8\x63\x93\xa5\xe0\xe4\x39\xcd\xfb\x83\x93\xfe\x13\x86\xd0\xbc\x13\xbb\x73\xa9\x9a\xf1\xe6\x3d\xda\xdc\x5d\x9f\x6f\x4b\xea\x7c\x3b\xe5\x5f\x75\xda\x1a\x73\xf3\xbc\xbb\x8e\x4d\xb1\xef\xdb\x32\xf7\x6b\x8f\xc9\x7d\x8f\x1b\x6a\x80\x1b\xea\xf2\x21\x90\x87\x52\xb8\xff\xed\x04\xbb\x75\x34\x85\x10\x19\x3f\x66\x43\x9e\xa6\x4b\x1a\x3d\x4f\x9f\x0c\xee\xcf\x4d\xf8\xcf\xdd\xe2\x9d\x1c\xec\x2f\x55\xb9\xaf\x4a\x26\x00\x70\x2d\xa9\x1e\x1a\xe7\x8d\x1c\xfd\x39\x58\x20\x25\x6e\x41\x04\x59\xad\x10\x68\x58\xbf\xe8\xc0\x1e\xa1\x18\x7e\x4b\xaa\xbd\x64\x3f\xfb\x8c\xc3\x26\x55\x28\xab\xfb\x31\xc7\xff\x75\x67\x66\x69\x01\xfe\x52\xba\x07\x06\xdd\x2a\xad\x23\xe7\xc7\x15\x18\x7b\x4d\x7d\x68\x82\xdb\xca\xfc\xd6\x92\xe8\x68\x55\xcf\x05\x3c\xec\xd5\x42\xe2\x98\xdc\xdb\x79\x98\x2f\xc6\xf6\x42\x60\x9e\x8a\x48\x49\x9a\xb5\x2e\x4f\xb2\x3e\x82\x45\x54\xad\xda\x92\x32\xcf\xc1\x2c\x89\x87\x5b\xfc\xba\x12\x0e\xe6\x85\x7e\x78\x5f\x0a\x85\x80\x9f\xe5\x16\xbf\x0e\x2e\x94\x82\x13\x63\x7b\x85\x7c\xc8\x61\x07\xf4\x14\xb9\xef\x76\xfc\xb7\x3b\x8b\x66\x84\xa1\x1d\xcc\x4a\xbe\x91\x11\x63\xbd\x9a\x53\x12\x18\x9d\xc7\xcb\x3d\x2c\x00\x0f\x72\xac\x33\x8c\x06\x50\x05\x63\x94\x8d\x1a\xf6\x5e\x24\x5f\x28\xff\x64\x16\x57\x96\x1d\x42\xf0\x39\x87\xed\x83\x37\xdd\x3f\x76\xfc\x8f\x38\x2b\xf0\x91\x41\x61\x15\xe8\x53\x2e\x37\x44\x95\x2d\xd1\x62\x2c\x2c\x75\x87\xc2\x2e\x8a\x4d\xf0\xa6\x48\x13\x80\x60\x30\xa3\x33\x75\xef\xa4\x09\xa3\xaf\x34\x4e\xb0\x14\x9b\x3b\x4e\x7f\xd1\x84\xbd\x97\x5a\xaa\xab\xd5\xc1\x9f\x38\x60\x61\x9e\xe4\x5c\xec\xf5\xd9\x95\x85\xb9\x24\xd8\x10\x09\x5a\x33\x26\xfd\xa3\xd6\x93\x32\x1b\x86\x7e\x61\x74\xba\xdf\x2f\x4f\xec\x1d\x63\x7b\x94\xee\x48\x72\xbc\xa7\x62\xee\x52\xc5\x5c\x57\x2a\xe6\x7f\xf6\x9f\x10\x28\xd6\x53\x13\x40\x45\x6f\x4a\x53\xe5\x3c\xcc\x0e\xb2\xda\x50\x95\xb3\x4c\x0a\x5c\x72\xf8\xd6\xba\xc6\x6d\xee\x93\x86\x64\x95\x17\xa8\xf5\x75\xb2\xa0\x29\x52\x18\x7b\xcd\x55\xec\xd0\xb6\xd6\x6f\xbe\x44\x52\xf7\x2f\x1e\xe5\xbf\xc4\x31\x1e\x10\x04\xa9\x15\xb5\x92\x03\xc9\xaa\x7b\x32\xe4\x18\xc0\x75\x9f\x64\x00\x2c\x00\x05\x25\xab\xbd\xdd\x3c\xf3\xe4\x54\xa8\xc8\x53\x1a\xdb\x24\x8e\x33\x84\x1f\xa5\x73\x2b\x14\xeb\xbc\xd1\xf7\x36\x0e\xcb\x8f\xea\x17\x9d\x49\x55\xf3\x45\xe7\x71\x18\x09\x33\x83\x78\xd7\x27\xfa\x14\xb4\xb1\x30\xb7\x6c\x4b\xc5\xdf\xbc\x62\x4f\x2a\xee\x42\x2a\x7e\x79\x1f\x1b\x31\xd2\xee\xef\xec\xf3\xff\x7a\x9c\x03\xa7\x26\x38\x1f\xa1\x7f\xf2\x27\x0d\x23\x9c\x28\x48\x72\xed\x8f\x05\xbf\xa6\x42\x14\x22\x0d\x6d\x95\x78\x7b\xb2\xd8\x6b\x8b\xb0\xab\xd7\x4e\x02\x7e\x0c\x85\xa9\x4e\xea\x5d\x07\x32\xfa\x51\x81\xae\x89\x56\x2b\x68\x40\xb5\x9b\xbc\xef\x75\x63\xc4\xd5\xae\x13\x15\x36\xaa\xbc\x0a\x52\x9b\x77\xbb\x49\xdc\x4d\x02\x40\x1f\xb6\x1b\xc7\x21\x3b\x07\xde\xc2\xe6\x13\x9d\x47\x5f\x45\x71\x2f\x44\x3a\xa2\x5c\x07\x2d\x53\xdc\x61\x55\x37\xd7\xc0\xd1\x47\x63\x5b\xb4\x8e\xa9\x99\xe4\x76\x91\x45\x63\xf8\x06\x55\x9f\x88\xac\x97\x80\x03\x2a\xec\x93\xef\x09\x06\x96\x06\x4b\x36\x21\x88\x54\x74\xa9\xb1\x84\x64\xaf\xa8\x61\x46\x82\xcf\x71\xca\x38\x02\x3d\x89\x08\xa6\x00\xfd\x9c\x18\x2c\x40\xf0\x2e\x2c\x61\x0f\x65\x95\x55\x65\x89\xa3\x62\x61\xb8\x75\x34\x3e\xb4\x10\xcd\x3f\x76\x01\x6a\xd9\x7b\x21\x46\x1b\x66\xde\x53\x6b\x27\xe3\x64\x93\x27\x4d\xd1\x94\xff\xf2\xda\x82\x37\x51\x57\x7b\x6a\x6d\x59\xf0\xb0\xb6\xd0\x35\x9e\x29\xc0\xbf\x65\xd1\x89\x33\x21\x17\x96\x37\x15\x10\xe2\x1b\x84\xec\x4d\xcb\x85\xb0\x2e\xac\x2e\x03\x34\x43\x2e\x6a\x97\xd8\x22\x3b\x7d\x19\x47\xf4\xca\xb0\xc5\xcc\x9e\xc6\xb4\x78\x71\xcf\xf8\x87\xf3\x20\xb8\x44\xad\x9e\x60\x94\xe4\x1b\x15\xad\xb6\x77\x1c\xef\xee\x38\xbe\xe4\xac\x6c\x7d\x4a\x1e\x72\xeb\x65\x37\x72\xe3\x08\x2b\xde\xc9\x7f\xe6\x0a\xf6\x04\xd3\x4a\xdb\xed\x22\x73\x47\xc6\x33\xd1\xea\x85\x2b\x22\x73\xff\x3f\xe6\xbf\xb1\x62\x3c\xb0\x89\x76\x09\x8b\x0d\x4c\xa5\x70\x5b\x20\x22\x35\x20\x29\x42\xac\xb7\x00\x78\x73\xf4\xbf\x11\x7f\x09\xe6\xbb\xe9\xf1\xf4\x38\xf3\x6a\xde\x22\x8a\xb2\xe3\xde\x8c\x8a\x9e\x48\x31\x0b\x1d\x18\x21\xa2\x26\xb0\x29\xc8\x3b\x4f\x5d\xbe\xbd\x82\x47\xfe\x71\x6f\x46\x9e\x3a\x51\xdf\x43\x20\xc5\xd9\x90\x07\x1d\x90\x63\xda\x4a\x5a\x07\x7e\x03\xb3\xf1\x3a\x38\x5c\x2d\x60\xa0\xf4\x88\x94\x30\xcd\xf1\xe9\x40\x78\xf0\x70\x93\xf7\x53\x10\xee\x8a\xa2\x04\x22\xff\xb0\x01\xfa\x65\x1b\x23\xf9\x7f\x4d\xb0\x5f\x74\xe4\xbc\x41\x88\xd8\x5b\x1d\x76\x64\xb8\x55\x7c\x70\xbc\x29\x16\x41\x03\xf1\xa7\x76\x4c\x00\x3e\x45\xb7\x6e\xaa\x23\x65\x8d\xef\xe9\x24\x01\x5d\x9b\x6e\x81\x71\x0f\xe6\x08\xc2\xe7\xd7\xfa\xc8\xd3\xb1\x19\x44\xcd\x78\x13\xb6\x56\x20\x87\x75\x6f\x7f\xee\x81\x1a\x7f\xd3\x54\xac\x3b\x8c\x7b\xe7\xed\xbb\x84\xca\x62\x19\x1b\x4f\xbb\xa2\xe1\x86\x23\x80\x14\xcb\xf6\x5d\x57\x34\xfc\x9b\x88\x6a\x3b\x5f\xec\xca\x2b\x94\xcb\x32\x2d\xee\xd4\xe6\x4b\x45\x56\xbf\xe4\x9c\xdb\x5a\x3c\x1f\x71\x0f\x29\x32\x7d\xa3\xe2\x61\x4c\xfa\xb2\x8d\x8c\xfd\x01\x63\xf5\x2d\x62\x99\xc8\x61\x18\x44\xeb\x90\x88\xe2\xbe\x81\xf9\xaf\x1e\x2b\x3c\xcc\xbd\x81\xa4\xda\xa8\xc0\x3e\xd1\xe6\x1b\x41\x9c\x80\x4d\x32\x8e\x84\xd7\x0c\x12\x34\xbb\x80\x92\x96\x0a\x0f\x3f\x87\x73\x1e\x40\x4c\x9a\x94\x77\xa3\x58\xb5\x65\x29\x73\x38\x48\xda\xdf\x09\x0b\x53\x45\x09\x29\x6b\xe7\x93\x97\x66\x88\x46\x43\xaa\x6e\xe8\x7f\x35\x9b\xb2\x21\xc2\xb8\x21\x25\xaf\x14\x51\x1a\xe4\xce\xb3\xdc\x55\x70\x94\xe8\x32\x54\x2e\x4b\x2b\xe4\xdd\x2e\xf4\xc6\xfa\x32\x43\xe6\x92\xb5\xdc\xbb\x86\x42\xaf\xea\xa5\x71\xae\x4e\x96\xb8\x7e\x95\xc1\x55\x64\xc8\xb9\x13\x65\xa0\x27\x62\x7a\x10\x59\x5f\x79\x4b\x0a\x27\xdc\xd5\x7a\x1f\x96\xd5\x06\xae\x58\xa9\xd6\x16\x48\x05\xbe\xbe\x9f\xbd\xa2\xc2\x26\x55\xb7\xdc\x17\x54\xfc\x5f\x76\xd4\x5f\xb6\x33\x0d\x73\xcd\xcc\xa8\x2d\x78\x4f\xa4\x79\x9e\x8d\xb6\x69\x13\x0d\x9b\x5a\x23\xde\x8c\xe9\xdb\x25\x97\xdf\x00\x9b\x54\x15\xed\xc2\x9b\x01\x69\xed\xc5\xc5\xa3\x7c\x84\xf2\x12\x0b\x1a\xae\x3c\x64\x83\x08\x32\x30\x4c\x9d\x6f\x86\x8d\xd8\xbd\x5b\xac\x5d\x4c\x0a\x60\xaf\x70\xd8\x95\x98\x1f\x4a\x89\x03\x3f\xe2\xf8\xa9\xf9\xc0\x04\x2f\x51\xd6\x7b\x1c\x06\xea\x5d\x1e\x96\x0f\x2e\x4d\x83\x37\xb4\x6a\xf9\x42\x71\xee\xce\xf0\x0b\x58\x2e\xa6\x82\xaa\xd2\x6d\x42\x9e\x31\xf6\x38\x6b\x6a\xef\x86\x99\x55\x01\xf4\x3f\x3f\xa6\xdc\xbb\xaf\x1b\x5b\x19\xfa\x9a\xb6\x4c\xeb\xf5\x46\x11\xe8\x06\x11\x76\x97\xa7\x78\x22\x76\x3a\x22\x6a\x52\xf6\x98\xc9\x8a\xad\x73\x6b\x91\x8d\x43\x2d\x07\x04\xf2\x50\x7f\x61\x5c\xc2\x88\x96\xa8\xf9\x07\x22\x2b\x15\x5e\x21\xef\x50\xf7\xf6\x78\x28\xc7\xf5\x3e\x91\xc4\x18\xc1\x48\xb7\x56\xfb\xe7\xa3\x37\x1c\x3a\xe4\x4d\xc9\x05\xd5\x8e\x7b\xc9\xb4\x3d\xc4\xea\xe6\x67\x0d\x73\x7a\xdc\xab\xc1\x35\x4d\x51\x65\x1f\xf7\x0e\x79\x53\x41\x5d\xd4\xbd\x28\x2e\x6c\x1b\xa9\xbc\xc4\x91\x98\xae\x5b\x9f\xc8\x4e\x1d\xf7\x8e\x1e\x52\x9f\x8d\xda\x6e\xf2\x2d\x35\xb8\xf2\x02\x3a\x6d\xfb\xb5\x3f\x70\x15\x9b\x2a\x71\x83\x92\xf4\xca\x90\xe8\x86\x98\x5b\xdc\x97\x5d\xe5\x9f\x2d\xfd\xc5\x54\x83\xb3\x52\xf6\x0d\x25\x50\x32\x9b\x0c\xc6\x16\x03\x9f\xb8\x72\x4f\x73\xd8\x85\xe6\xf0\xe7\x15\x43\x75\xf8\xe4\x88\x08\xe9\xed\xc1\x6c\xbe\xbc\x42\xd8\x23\xa7\x31\x19\x1e\xa6\xb1\x7c\xfa\xe5\x89\x08\x99\xe4\x55\x34\x92\xd0\xad\x26\xe7\x19\x5e\x13\xf9\x85\x81\xe3\x1a\x59\x8a\x9b\x53\xe9\x74\x7e\xf6\x94\x2f\x10\x79\xa7\xe1\xeb\xf2\xa4\xfb\x16\xc0\xfc\x64\x2f\xae\x90\x3e\x75\x7f\x85\x1d\xdf\x32\x96\xa0\x74\xac\x40\xb5\xfa\x2d\x67\x40\xb7\x1a\x08\x52\x33\x15\x2e\xad\x99\x68\x07\x5e\xe9\x66\x7a\xb8\xc7\x41\xb6\xb1\xc6\xa3\x66\x0d\x6f\x5e\xec\x73\x15\x7d\xb3\xfb\xa3\x0a\x7b\xd2\x65\x0e\x08\xde\xf1\x5e\x59\xb1\x2f\x79\x60\xd5\x4b\x44\x43\x44\x90\xda\xbd\x06\xf6\xa7\xa6\x71\xe7\x1b\x35\x0e\x97\x73\xeb\xf3\x96\xe2\xae\xd4\xe1\x72\xa0\x62\x84\x56\xab\x7b\xcb\x82\x37\x6b\x71\x14\xf6\x1f\xf1\x01\xde\xbb\x88\xee\xd6\x50\xf4\xcc\xad\x6f\x22\xc7\xdd\x9b\xca\x0c\x45\xa5\x8b\xb5\x68\x32\xfa\xf4\x3e\x76\xc2\x58\xe8\xad\x30\xde\xa4\x75\x98\x87\xce\x26\x41\x9c\x04\x59\xff\xb4\xec\x89\x95\x2c\xad\x29\xe4\xdc\x57\xee\xf3\x4f\x6f\xe3\x3d\x6b\xc2\x35\x87\x1e\x66\x32\xe3\xc7\x1a\xa1\xdc\x38\x55\xdf\x33\xce\x7e\xc1\x61\x6e\xc8\xd3\x6c\x35\xe1\x51\x0a\x1f\xad\x06\x1d\xe1\xbe\xce\x61\x37\x5e\xc6\x19\x21\xbf\xf5\x7f\xf0\x9e\xc1\x02\xef\xd1\x5e\x31\xa9\xbb\x01\xa4\x85\xdd\xd2\x4c\xbf\xae\xb2\xdf\xa5\xe2\x44\x7b\x3a\x27\x80\xab\xb3\x75\x36\x81\x99\x4f\xc2\xfd\x41\xff\xec\x3d\xf4\xef\x7b\x50\x17\x68\xf7\x3a\x3c\x82\x54\x42\x30\x8b\xd1\x8f\x0a\x6c\x04\xb4\x3e\x91\xf1\x20\x54\x10\x01\xd8\x1a\x5d\xb5\xa5\xce\x86\x6c\x7f\x22\x78\x1a\x47\xee\x9a\x7f\xee\x1e\xfc\x27\x55\xd3\x8b\x82\x7b\xe5\xda\x8e\x23\x51\xdb\x8c\x93\x66\x35\x3f\xe1\x3d\x7c\x51\x5f\xe7\x74\x0f\xaf\x4d\x47\xd6\xd6\xd2\xf2\x52\xf6\x0a\xff\xa9\x07\xcd\x16\x6d\xba\x48\x0d\x49\xbf\x0a\x2c\xff\x27\x79\x98\x8a\xaa\xc2\x43\x1c\x92\xd9\x3a\x4b\x29\x27\xb7\xf8\xf5\x7b\xe4\x3f\xee\x29\x46\xa8\x14\x6a\x28\x2d\xe4\x93\x8f\x62\xd3\xdb\x0a\x51\x82\x40\xeb\xb7\x3e\xca\xbf\xc5\xf8\xbb\x90\xfc\xa9\x32\xb9\xe4\xbf\x81\x60\x74\x33\x48\xdb\x08\x7d\x0f\x04\x7a\xf6\x8a\xfd\xd3\x2b\xd9\xfb\x2b\x6c\x62\x8d\x37\xce\x8b\xa8\xe9\xfe\xc2\xa8\xc3\x76\x78\xb3\x4e\xe0\xe7\xfe\x3f\x3a\x33\x5a\x01\xa7\x22\xbd\x06\xef\x62\xde\x4a\x8b\xf2\xea\x4c\xbc\x47\xd4\x49\x9a\x71\x74\x6d\xa6\x60\x06\xa3\x3e\xc1\x32\x5a\x57\xc8\xb8\xe5\x5d\x4b\x25\x5e\x2b\x2f\x05\xd7\x02\x0e\xc6\xb5\x25\x0c\xc5\x85\xb8\x1a\xc5\x0e\x9b\x7b\x47\xd1\x3f\x64\x24\xf3\x19\x2a\x10\x40\x3f\x41\xfb\x01\xbe\x29\x5e\x0f\x1a\x76\xb8\x16\x25\x3a\xd2\x4b\x75\xf6\xee\x7d\xec\x9a\xa0\x10\xa8\xe2\xbe\x71\x9f\xff\x8a\x7d\xc5\xf0\x95\xb2\xcc\x69\xf3\x1d\x1d\x66\x63\x86\xd4\x08\x33\x7f\xd2\x7a\x5b\xc9\x27\xba\x8a\xe7\x5d\x80\x4b\x73\x8e\x62\x6a\x06\x21\xd1\xd8\x10\x77\xba\x32\x34\x75\x13\x81\x94\x27\xf7\xd8\x28\x60\xd4\xad\x7a\x43\xd6\x77\x8f\x07\x8a\x38\xe5\x78\x9f\x04\xd2\xda\xc6\xf9\x4d\x9e\x34\x53\x4c\x98\xcb\x02\x79\x27\x92\x6a\x29\x65\x27\xf1\xcc\xf8\x84\xe2\x92\x00\x31\x4f\x5f\x03\xc1\x00\x2e\x6b\x17\x4d\x08\xa1\x23\x3f\xb5\x9a\x3d\xec\xbf\xa5\x9f\xf6\x3d\xd1\x09\x32\x8f\x7b\x9b\x3c\x41\x6e\x69\x1c\x47\x9c\x6d\x88\x53\xcf\xab\x84\xbc\xb3\x9c\x33\x55\x33\xe9\xab\xa1\x51\x28\x29\x74\x78\x03\xc6\x03\x9e\xcd\x98\x24\xae\xc6\x5b\xa4\x1a\x38\x84\x7b\x30\x18\xe6\x6a\x9b\x89\xec\x79\xc9\xb3\xf6\x50\x1d\xea\xf0\xe4\x3c\x1a\x2e\x68\xcd\x54\x4b\xac\x27\xe0\xb2\xcd\x80\xaa\xcb\x34\x12\xe8\x8c\x77\x1a\x8f\x93\x0a\x63\xcd\x48\x87\xad\xe6\xd4\xdb\x03\x2b\xaa\x84\x5b\x92\x04\xce\x9f\x3a\x0a\x49\xe6\xe3\x8e\x7f\xbf\x33\xa3\x6d\x3e\xc0\xbb\x0d\xbf\xe8\x96\x69\x13\x9e\x59\xc1\x20\x0b\x7c\x9c\xc8\x3b\xb5\xfc\x34\xf7\xce\x42\x88\x78\xc2\x5b\x2d\x4c\x0d\x30\x31\xcb\x0a\x62\xc2\xf2\xe1\xdd\xc2\x6e\x1e\x7e\x5a\x8e\x10\x43\xcb\xbd\x50\xb0\x17\x8e\xb1\xb1\x2c\x4c\xdd\x7f\xab\xf8\xef\xae\x10\xaf\x7e\x7e\xc0\xd7\xbd\x59\x74\x69\x84\x7d\x4b\x5a\x82\x1b\x58\x81\x85\xe4\xc9\xb4\xf2\x7b\xf9\xa8\xea\x1d\x3b\x76\x14\xfa\x9c\xbb\xa0\x45\x67\x4d\xea\x73\x6a\xfd\x20\x6a\x08\x09\x8a\x7c\xd9\x01\x1f\x37\xdd\xd5\x94\x3d\x4b\x95\x71\x21\x07\x1a\x80\xeb\x1a\xa0\xf5\xf3\x46\x23\x4e\x9a\x06\xcd\xb4\xf2\x41\x59\xb1\xf5\x49\xdc\x5b\xc7\x1c\x91\x95\xc5\x05\x68\xa6\x86\x1a\xd5\xae\x65\xda\xc0\xe6\x16\x6a\xf5\xc2\x56\x10\x6a\xbc\x1b\xf5\x86\xee\xf8\xca\xe2\x82\x35\x13\xc7\xd9\x4d\x23\x08\xbb\x86\xcf\xc4\xea\xe9\x15\xf6\xa5\x0a\xfb\x6e\xe3\xe5\x64\x8d\x37\x72\x06\xb4\x38\x14\xcb\xa2\xe5\xfe\x66\xc5\xbf\x9d\xfe\xad\x92\xf1\x6d\x82\x33\x90\x23\x60\x2a\xd0\x7a\x71\x12\x87\xc2\xa0\x4d\xbe\xe8\xe8\xe0\xd7\x11\x61\xb2\x9f\x71\xd8\x92\x11\x25\x3b\xe7\xdf\x78\x99\x31\xb2\xe6\x2e\x3a\x41\x06\x94\xe3\x7e\x6d\x47\xb1\xa9\x85\x32\x20\x34\xf5\xb8\x5f\xdb\x51\x68\xaa\x59\xc6\x9f\x4d\xb2\x6a\x79\xb4\x13\x7a\x28\x67\xb2\x8c\x37\xda\x52\x12\x10\x7e\xc4\x3b\x27\xfd\xd9\xf2\x9f\x06\x35\x24\xee\x15\xdf\xd4\x51\x04\x72\xe8\xe1\x29\x35\x47\x0d\xf6\xef\x4f\xb0\x2f\x3a\xec\x0a\xfc\x6d\x3e\x49\xe2\xc4\xfd\x94\xc3\x0e\x6e\x27\x3c\x0b\xeb\x82\x6f\xfc\xb7\x00\x24\x0a\x28\x79\x00\xcd\xe2\x89\x08\x78\x3b\xc0\x12\x49\x06\x67\xac\x23\xc7\xa5\x82\xc5\xcf\xa3\xbe\xa5\x06\xc0\x89\x03\x3b\xdc\xce\xfe\x22\x97\x2b\xc1\x41\xa9\x4d\x51\x52\xa4\xb2\xfc\x29\xec\x83\x1a\x75\x3b\xa9\xb3\x77\x39\x4c\x0f\x82\xfb\x56\xc7\x7f\x8d\xb3\x60\x71\x98\x13\x37\x9e\x94\x7e\x3d\x20\xe1\x40\xd0\x16\xf5\xc9\x23\xd5\x4e\x8b\x48\xe9\x37\x2b\xcc\xe5\x7a\x3a\xcf\x28\x3b\xd6\x83\x15\xff\xa5\x95\x73\xdd\x38\x32\x9a\x4a\xb5\x54\x8d\x73\x08\xf0\x74\xf5\x05\x5e\x83\x3a\x98\xbb\x16\x83\x5f\xf2\xeb\x7d\xb1\xa9\x44\x31\x48\x8a\x00\x80\xb6\x34\xe5\x45\x37\xf6\xd2\xde\x5a\x2a\x57\x57\x94\x79\x77\xf3\x20\x3b\x19\x27\x33\xf4\x6d\xe2\x9d\x01\x96\x29\x80\x37\x7a\xa4\x86\xed\x81\x42\x3c\x89\xb1\xcc\x61\x89\xcb\xdb\xcf\xc3\xbd\xc4\xb1\x8e\x87\x74\x89\x97\x14\x39\x62\x89\x7f\xf6\x6a\xf6\x7f\x96\x76\x85\x68\xdb\x55\xc8\xa3\xfb\xee\xab\xfd\x5f\x1d\xcf\x63\xa6\x1b\xbc\x9b\x81\xe7\x6f\x90\x3f\x90\x7b\x3a\x55\x5d\x85\x55\x78\x0b\xb2\xdb\x2d\xde\x10\xde\xd4\xec\xca\xc2\xb4\xda\x39\x4d\x2c\x0c\x61\xb7\xf3\x03\x93\xb4\xe5\xba\x37\xbb\xb2\x40\xef\x48\x85\x07\x1c\x02\x0a\x39\x1f\x41\x4a\x31\xb4\xac\x10\xc9\x4d\x0e\xc7\xb0\x5f\xf7\x16\x08\x64\x38\x53\x54\xfb\xca\x95\x40\x55\xd4\xb0\xf4\x9a\x42\xb0\x4a\x00\x30\xbf\xc1\x13\x93\x47\xe7\x6e\xa9\xf4\xea\x36\xe2\xa6\x30\x9a\x06\x64\x0c\x16\x0b\x1a\xb6\x2d\xc5\xb7\xec\xa6\x0d\xd8\xdc\xb1\x8c\xba\x89\xe3\x40\xab\x98\x26\xd2\x38\xe1\x7b\xa9\x48\x2d\xb3\x7c\x16\xcb\xb7\x44\xd2\x09\x22\xa1\xb1\x41\xe9\x73\x33\xe9\x02\x4a\x0f\x45\xb6\xcd\x12\x10\x38\x22\x9f\x57\x39\xe6\x29\xd9\x9f\x69\x43\xc7\x11\x52\x98\xd5\x07\xe3\xe8\x09\xe7\x31\xaa\xe9\x84\x82\x66\xfd\xa2\x03\x06\x5f\x9b\x48\xe7\xc0\x9e\x61\x6e\x2f\x42\xe4\x9b\xe7\xe7\xf9\xc9\x71\xc3\xcf\xf3\xe2\xf1\xdd\xfa\x79\x7e\x77\x6c\x18\xed\x75\x3d\xff\x17\xaa\x81\x96\x12\x61\xda\x0c\x0c\xa1\x42\x0e\x1d\x73\x6a\x28\x6b\xe7\x16\x29\x70\x80\xcf\xc4\x74\x07\x41\x31\xc5\xb3\x59\x96\x77\x4a\x64\x4b\x00\x7d\x29\xeb\x9e\x9a\x46\x48\x34\x0d\xc7\xaf\xc4\xcf\xaa\x16\x45\x58\x92\x3a\xbf\x6f\x38\xea\x35\xda\x3c\xe1\x8d\x0c\xee\x43\x09\xb8\x6f\xab\xde\x9a\x58\x0f\x88\x30\x32\x6a\xca\x95\x10\x28\xfe\x60\x1e\x61\x02\x7a\xd4\xeb\x88\x24\x68\xe4\x5f\x7b\x53\xcf\xe0\xb5\xfb\x0e\xd5\x6e\x9e\xa9\x3d\xfd\x99\xd3\xf8\x72\x93\x83\xf9\x6a\xaa\x36\x5d\xf5\x9a\x71\x96\x7a\x53\xf5\x69\xdc\x6c\x66\x19\xa9\x02\x60\x7b\xe4\x3c\x54\x6b\xe4\xa0\x7a\xfa\x88\x1b\xd2\xd0\xb3\x12\x7c\x53\xde\x4a\x99\x27\x4a\x4e\x08\xbe\x54\xbf\xe4\xac\x6d\x6d\x54\xbf\xdd\xbd\xb5\xb6\xdd\xac\x84\x52\xc8\x87\xcf\x4c\xb2\x9b\xb6\xa6\x21\x1f\x42\x41\xfe\x86\x49\xff\x2d\xce\xbf\x33\xfa\xf1\xbf\xde\xcf\x3e\xe2\xb0\x7d\xe2\x42\x96\x70\xf7\x03\x8e\xff\x32\x67\x5e\xfe\xb3\x88\xda\xa3\x2c\xa8\xf5\x85\xa8\x15\xd7\x4f\x89\x0c\xde\x9a\x9a\x96\x5b\xb5\x1d\x37\x0d\xa0\xc8\x9c\x39\x38\x4e\xea\x9e\xb7\x12\x20\x2b\x28\x46\xdd\x07\x51\xb7\xa7\xcd\x1e\x9a\x52\x38\x41\xf2\x08\x79\x68\x72\xb9\x6f\x55\xd6\x59\x5b\x24\xa2\xfe\x80\xf3\x78\xf6\xb8\xe1\x51\xcd\xa6\x16\x7a\x86\xed\x5b\xa7\x2b\xed\x14\x92\x99\x58\x17\xda\xd4\xeb\xc7\xbd\x6b\x13\xe1\xc9\x23\x0b\xf0\x87\xe2\x64\x54\xbc\xf4\x1e\x2d\xfb\xc3\x4f\xcb\x7e\x1b\x1b\xeb\x05\x4d\xf7\x46\xff\xba\x73\x0b\x73\x25\xca\x31\xda\x1f\xe0\x5d\x32\x72\x24\x96\xf1\xee\x01\x87\x8d\xcb\x87\xee\x9b\x1d\xff\x55\xce\xb9\x54\x24\x6a\xca\xc1\xde\x5f\x32\xe1\xde\x42\x0b\x68\x2c\x94\x79\xca\x97\x1f\xf9\xc0\x4c\x24\x4f\x5d\x1f\x16\x8e\x0f\x56\x2a\x30\xd5\x06\xa4\xdd\x74\x13\x41\x80\x10\xfe\xdd\xb0\x9a\x5b\x1e\x54\xb7\x29\x08\xa6\x9b\x93\x19\x0c\x55\xaa\x3e\xad\x39\xb3\xb1\x7f\xeb\x58\x91\xde\x56\xf2\xff\x0a\xa2\xa8\xfd\xb6\xe3\x9b\x7f\x97\x1b\x82\x88\xc7\x1b\x22\xef\x6c\x17\xc6\x8b\x1c\x76\x92\x1d\xd0\x48\x80\xee\xcd\x7e\x75\x56\xfd\x41\xb8\xcf\x1a\x50\x05\x03\xf7\x82\xd4\x5b\x17\x91\xbc\xfb\x14\xfc\x30\xb7\x13\x8d\xe5\x8d\xfe\x75\x8b\x71\x53\x9d\xbb\xd1\xf6\x0b\xf8\xe2\xbe\xd2\x18\x9f\x53\x78\x93\x68\xa5\x78\xf7\xa3\x7e\xff\xea\x3e\xff\x27\x9c\x65\x33\xaa\x5d\xbf\x87\x8a\x33\x8a\x10\x79\x3b\x54\x19\x70\x2d\x01\xae\x3e\x30\xcb\x00\xde\x4b\xfe\x05\x5e\x97\xf4\x1d\x88\x4c\x7a\x5e\xbc\x19\x89\x24\x6d\x07\x5d\x0a\xef\x00\x03\x4e\x9c\x78\x2b\xf3\xa7\x83\xa8\x77\xc1\x4b\x04\xd0\x15\x04\xd1\x7a\xfd\xa2\x73\x40\xe9\x6b\xe9\x45\x67\xbc\xcb\xb3\xb6\x3d\xd0\xe3\xec\x9d\x0e\xcb\xdf\x71\xdf\x00\xa2\x53\xfd\x69\x9a\xaf\xb4\xde\x87\xf4\x9f\xa0\x45\x90\xa3\x30\x6f\x71\x16\x77\xe3\x30\x5e\x2f\xf7\xf5\x2b\x1a\x11\x75\x6e\x53\xf7\x0e\xae\xab\xcf\x0f\x2e\xcf\xcf\xcc\x9d\x99\x97\x47\x32\xde\xa5\x14\x07\x71\x3e\x1b\xf7\x3b\x0c\x7a\xe1\x3e\xc7\x8f\x96\x78\xa6\xb3\xdd\x8a\x83\x06\x99\x6f\x0f\x5b\x2b\x3e\xe9\xb0\xc9\x44\xf0\xe6\xd9\x28\xec\xbb\x1f\x76\xfc\xf7\x3a\xcb\xf4\x17\x08\x7b\x82\x9e\x8d\x51\xcd\x2e\x69\x1c\xde\xa9\x14\x19\x34\xe8\x44\x89\x0a\x93\xf0\xba\xf2\x5a\x86\xbc\x32\x36\xd8\x70\x8b\x87\x43\xd4\xe6\xcb\xef\x93\x61\x42\x7a\x47\xc5\x4a\xb3\x56\x0b\x5d\xee\x1a\x74\xa8\xd3\x1a\xff\x91\x8a\xdf\x2b\x3e\x34\x71\xaf\x09\x8a\x4f\xae\xe8\x48\xee\xb8\x82\xb1\xde\xd4\x0b\xd2\xde\x1a\xda\x3a\xa6\xc4\x85\x46\xd8\x03\x75\x52\x29\x63\xd3\xfa\xac\x87\x4b\x65\x50\xf0\xcb\x3f\x87\xf5\xa5\x84\x90\x45\x9f\xe1\x5d\x37\xdc\x46\x44\xd1\xac\x7a\xbb\xd8\x7a\x3f\xff\x09\xf5\x1b\x0b\x35\x88\x7b\xf2\xfd\x6b\x53\x4f\xbf\xc4\x5e\x3c\x3e\x74\xa8\x14\x0f\xc8\xaa\x48\x3a\xee\xe7\xc7\xfc\xb7\x39\x8a\x7f\x25\x21\xba\x10\x18\x14\x4d\x5c\x22\x2f\xe1\x1a\x73\x3f\x8a\x75\x56\x3a\xa8\xe6\x74\x93\x47\xe2\x34\x54\xb4\x3a\x70\xcf\x9e\x59\x9c\x13\xe4\x4d\x5b\xa5\x2d\x67\x56\x4c\x18\x83\xca\x2d\x06\x93\xd2\x5b\xa3\x04\x1b\xb9\x22\x8b\x2d\xb5\xc7\xf6\xe7\x2b\xec\xb5\x0e\xbb\xa6\xc8\x72\xe4\x3e\xcf\xf1\x6f\xc8\xfd\x4a\x76\x3f\xac\xa6\xae\x61\x2f\xc1\x9f\x0f\xc4\x29\xa6\x7a\xf2\x24\x76\x9c\xdd\xb4\xe5\x64\x99\x2d\x5c\xce\xcb\x66\xaf\x70\x88\xae\x10\x50\x06\x2e\xab\x4d\xb0\xe4\x1e\xca\x36\xbd\xf2\x7a\x76\x6d\xc9\xeb\x4b\x84\x15\x1f\x65\x74\x46\x48\xe5\xfa\x8b\xc7\xfc\x99\xb2\x1f\xb4\x95\x7e\x10\x6e\xad\xab\x5f\x27\xf9\x61\xcf\xd6\xab\x8f\xb1\xb7\x3b\x6c\x02\x82\x5b\x17\xce\xba\x17\x1d\x76\xdb\x96\x3d\x59\xc1\x97\x07\x1a\x82\xdb\xe1\xa9\xf4\xb3\x9d\x9f\xa5\x1e\x0e\x34\x47\x5b\xbe\xd1\x5e\x42\x52\x2d\x8e\x4c\xe3\x96\x1c\xfa\xb4\xce\x9e\x57\x61\x07\xe8\x42\x13\xa7\xee\x3f\x3b\xc3\x89\x9e\xf2\xa6\xe2\xeb\x67\x57\x86\x34\xf6\x17\x1c\xfd\x46\xa1\xbd\xfa\xb1\x92\xba\xa4\xbd\xeb\xe6\x92\x02\x4f\x94\xfa\xd7\xa6\xe8\x2a\xa5\x7b\xbf\xd5\x19\x30\x64\x67\xc4\x6b\xbd\x03\x01\xac\xfb\x9a\x0b\x60\xf6\x01\x87\x5d\x81\xea\xe3\x19\x39\x28\xee\x83\xf2\xc8\x9d\xc9\x1f\xe4\xca\x12\xa0\x98\xf3\xbe\xe5\x75\xd0\xf4\x89\xd0\xb0\xd2\xd3\x60\x14\xf3\x17\x35\xe8\x60\x3e\x89\x35\x6a\xeb\x13\xb1\x4d\xb5\x8e\x6c\xc3\x88\xeb\xc4\xcf\x39\xec\x00\xbf\xaf\x97\x88\x93\x41\x28\xdc\x9f\xda\xce\x14\xce\xa8\xd7\x87\x4c\xe1\xdd\xfa\x05\x6b\x06\x23\x0f\x9e\x7b\xf0\x03\xf1\xbc\x93\x16\x45\x16\x63\x98\x2f\x60\x3f\x08\xd4\x64\x19\x04\xe4\x75\x29\xc5\xf6\x37\x44\xb7\xdd\x4a\xdd\x9f\x18\xc1\xc7\x9e\x9f\x10\xa2\xdb\x3e\x39\x6c\xa1\x3d\x05\x7f\xb5\x17\x99\x7c\xe6\x9d\x5c\x29\x69\x16\xb2\xff\xb4\x91\x6c\x45\x36\x47\x4a\x43\xd2\xf6\xd8\x7f\x61\xfb\xc2\xb8\xc1\x43\x37\x1d\x91\xd2\xa7\x5a\x75\x5a\xbe\x69\x35\xe5\x56\x78\x64\xb6\x44\xd9\xbe\x6b\x7a\x71\xab\xcc\x42\xd0\x2e\x40\x2e\xf2\x16\x54\xd3\x67\x7f\xe4\xb0\xb1\x64\xad\xe9\xfe\x9e\xb3\x9d\x38\xdc\x13\x73\x43\x06\xe4\xc5\xce\xf2\x89\x39\x7b\x38\x96\x79\x33\x4e\xbd\x13\x61\xdc\x38\xef\xcd\x89\x21\x13\x36\x6a\x64\x76\xa4\xde\x24\x6b\x4d\x63\x5f\x7d\x46\x4e\x76\x10\x35\x45\xe2\x7e\x62\x5b\x93\x0d\xef\x0e\xe9\xdb\x4b\x1c\xfc\xd9\xee\x1e\x16\xbf\x95\xd8\x23\x79\x62\x8b\x93\x6d\x75\xac\xd3\x4f\xef\x0d\x6b\x58\x4b\xad\x6b\x76\xee\x6b\x15\x36\x29\x8b\x93\x3a\xaf\xfb\xe5\x0a\xbb\x7e\xcb\xee\x3d\x99\xde\xb6\x85\x65\x45\x3d\xb6\x3b\x86\xcb\x27\x4e\xfa\xe6\x44\xd5\xbd\xa5\x24\xde\x08\xc8\xfe\x0e\x14\xc8\x60\x53\x8b\xbb\x18\x56\x25\xaf\xa3\x3a\x5e\x18\xb3\x5d\x5a\x3d\x34\x32\x62\xac\x45\x0d\x96\x1d\x7d\x83\x04\xcc\x51\x53\xdf\x62\xa5\xb2\xfb\x3d\xde\xd9\xa8\x06\xc3\xa4\x13\x61\x53\xf3\xae\x83\x50\xd8\xf2\x1a\xba\xc9\xfb\xf0\xf5\xdd\x0b\xa7\x4f\x7b\x8b\x67\x57\xbd\xbb\xcf\x2e\xdf\x81\x44\x41\x10\x7b\x81\x75\x69\x17\xd2\x65\x8a\x45\x25\x0b\x65\x93\xe4\x0d\x82\xbd\xcd\x61\x57\xc9\x86\x6c\xc6\xc9\x05\x1c\x49\xf7\x95\xce\x36\x46\x7f\xc9\xfa\x86\x46\xff\x69\xf6\x53\x7b\x0a\x54\x2d\x97\xb5\xba\xd8\x57\x1c\x36\xd9\xe0\x5d\xde\x08\xb2\xbe\xfb\x57\x8e\xff\x2a\x08\xdb\x1b\xb0\xd2\x0d\x9c\xdd\xd7\xa6\x05\xb6\x71\x55\xc8\x43\x79\xb2\xa8\x32\x1f\x18\x0d\x9b\x3b\x60\x70\xaf\xeb\x28\xb7\x3b\x7b\x1c\xbc\x9e\xa6\x99\xec\x47\x2b\xec\x80\xbe\xe0\xb8\x5f\xdf\xce\x41\xa4\x2f\x62\x43\x76\xfd\x2f\x39\xf9\x55\x2d\x29\xbf\xc5\x8f\xd0\x25\x78\x7e\x1e\x89\x0b\xdd\x38\xcd\x35\x0c\xb8\xd7\x17\x37\x13\xb2\x48\x95\x5b\xb7\x77\x70\xa1\x63\x1f\x77\xd8\x63\xba\xed\x38\x03\xa0\x50\xea\xd5\x5c\x90\x9e\x77\xdf\x33\xca\x5e\xa6\x17\x6a\xc9\x97\xd6\x98\x74\xcb\xde\xb0\x47\x07\xdf\x30\x32\x5a\x8c\x65\xd6\x94\x6f\xef\x6c\x2d\xbf\xd6\x61\x63\x8d\x34\x70\x5f\xba\x9d\xe3\x69\x76\x65\x61\xc8\x64\x2e\xcd\xae\x2c\x98\xed\x54\x12\x46\x4d\x9d\x22\xfd\xc1\xb9\xd0\x1c\x18\x86\x33\x66\xea\x84\xc8\x34\xa4\xee\x74\x9d\xfd\x5f\x0e\xdb\x17\xa4\xb2\x69\xbf\xe7\x6c\x23\x61\x63\x61\x65\x78\xe3\xfe\xab\x03\xbf\x16\xf4\x1d\x7c\x46\x03\xac\xfd\x74\x65\x2b\x6d\x84\xce\x0a\x16\xbf\x9d\x2c\x40\xf6\x0e\x87\x5d\x43\xa3\x93\x47\xbc\xbe\xca\xf1\x7f\x14\xd0\xf0\xa4\xec\x58\x31\x7e\x35\xf1\x8c\x91\x87\xb9\x70\x1d\x58\x13\x61\x1c\xad\xa7\x75\x6f\x1e\xee\xbb\x44\xaa\x23\x78\x94\x1a\xee\x2d\x15\x0a\xa0\x08\xb1\xf0\x23\x0c\x63\xef\x5b\xf5\x59\xd6\xb8\x77\x55\xd8\x63\xf8\x66\x3a\x1f\xf2\x34\x0b\x1a\xa0\x68\xc8\x77\x85\xfb\xfa\x51\x5c\x28\x5a\x11\xbd\x7b\x65\xe0\x4b\x6b\x5a\x3e\xe9\x94\xbd\x52\xd4\x4a\xef\x5e\x79\xd8\xe6\x68\x97\xe7\x16\xdf\x4c\x05\xb6\x7e\x4d\xb6\x5e\xfe\x2c\xd8\xa7\x2a\x6c\xb2\x11\xf2\xa0\xb3\x2c\x5a\xee\xef\x54\x46\x24\xb3\xab\x71\x2a\xe2\x28\xbf\xba\x32\x4b\xdf\x43\xa4\x90\x66\x15\x5d\x0b\x6a\x3a\xcb\x9b\x87\xa0\x85\x63\x2a\x38\x12\x27\x15\xd7\x3e\x74\xbd\xf8\x10\x4a\xae\x7b\xf3\x40\x0e\xa7\xf3\xdd\xc8\xe6\x83\x91\xc7\x6b\x71\x2f\x6a\xd6\x3d\xe8\x03\xc5\xda\x98\x96\x49\x32\xfd\x67\x1c\xd0\xa8\xe1\x2a\xa0\x5b\x70\x17\xd6\x79\xd7\xec\x43\x79\x9e\x51\x3f\xd9\xe7\x1d\x76\xa5\x54\x3b\x66\x48\xb1\x76\xff\xc8\x61\x47\xb7\x1c\x5c\xea\x80\xf1\x9d\xff\x53\x8e\xf9\xa7\x0e\x80\x68\xc4\x51\x9a\x25\x1c\x23\x25\xc1\x6e\x0c\xa9\xee\xc0\x00\x09\x17\x6a\x6b\x2b\xd1\xcd\x10\xaf\x71\x94\x21\x62\x87\xce\x47\xad\xb0\x27\xe7\x53\x25\xee\xb7\x45\xb3\x87\xd4\x1d\x26\xa4\xba\xe6\xdd\x24\x63\x03\xfb\xc0\x18\xfb\xae\x6e\x61\xd6\x96\x05\xcc\x86\xa2\x64\x1b\xf3\x5f\x3c\x06\xee\x84\x36\xef\x76\x45\x44\x28\x93\x83\xa2\x01\xa6\x33\x11\xa1\xe0\xaa\x85\x00\x86\x8d\x33\x8b\xf4\x89\x9a\x47\x84\x27\xc2\x5b\x16\xf2\x26\xac\xb1\x26\x91\x92\x9a\x47\x3d\x23\xde\x66\x70\x45\xa5\xd3\x55\x6f\x0e\x88\x8a\xed\x0f\x9b\xfd\x88\x77\x28\x56\xa7\x6b\xc8\xc2\xb2\xef\xe5\xaa\x59\x16\x8d\x7e\x23\x84\x42\x54\x40\xfd\x74\x5d\x3f\xd5\x9e\x48\x93\x55\xd0\xb8\xa8\x23\xf1\xa4\xd7\x93\xba\x7c\xd8\xd7\x18\x5d\xc5\xca\x1e\xca\x75\x99\xe0\xa4\x28\x77\x22\x89\xcc\xdf\x71\x18\xc3\x37\xce\xc4\x4d\xe1\xbe\xdf\xf1\x1f\x74\xf2\xbf\xf5\x62\x0b\xe4\x86\xce\x43\x1b\x83\x28\x13\x51\x53\xef\x47\x88\x1c\xa7\x18\x28\xf4\xe0\xc8\x1e\xb7\x82\x50\x60\x9e\x1f\xdc\x07\x62\x2f\x11\x1d\x39\x5f\x41\xe4\x25\x7c\xd3\x03\x19\x84\x84\x65\x30\xb9\x3d\x38\x4b\x4e\xe6\x1f\xc9\x7a\x3a\x08\x05\x01\x2b\xc3\x60\x46\x04\xc5\x3f\xed\x8a\x46\xd1\x4f\x56\x69\x35\xdc\xff\x36\x2a\x2e\x4f\xed\xb3\x93\xb3\xb6\x1e\x73\x72\xd6\xd6\x5a\x4e\x06\x6b\x89\xf0\x66\xdb\x3c\x8a\x44\xf8\x30\xc8\x72\xf6\xf7\x0e\x9b\x68\xc9\x21\x10\x89\xfb\x97\x0e\x3b\xb6\x75\x8b\xf1\x65\xab\xd9\xef\x70\xe8\x69\xa1\xf1\xf4\xb0\x78\x59\xd8\xaa\xb1\x83\xed\x84\xad\x21\x37\x61\x2f\xe5\xeb\x2a\x9f\xa4\x29\xba\x22\x6a\xa6\xea\x36\xa8\x6a\xa3\xa0\x34\xc5\xa6\xa5\x22\x98\x91\x39\x8b\xfd\x4f\x87\x8d\x45\xad\xd4\xfd\x55\x67\x1b\x47\xcc\xe2\xc9\x15\xab\x9f\x2f\x70\x16\x0b\xb6\x95\xc8\x5b\x2c\x33\xac\xec\x4c\x91\xde\xc9\xe1\x19\xb5\x52\xf6\x32\x87\x4d\xdc\xdb\x8b\xd7\xfa\x99\x70\xef\xdf\xce\x9c\xdd\x89\x2f\x5b\x7d\xb9\x83\x1e\xda\x53\xa6\x1e\xee\xd0\x54\xf4\xa0\xc3\x1e\xb5\x91\x76\xdb\x42\xa9\x2a\xee\xc5\x51\x0c\x64\xfa\x94\xa1\x4f\x82\x24\xeb\xf1\x70\x40\xab\xbf\xfb\x2e\xb3\x48\xbb\xa1\x1b\x2b\xf0\xd3\xe5\x5d\x44\x7f\x5a\x99\x07\xe1\x0a\xf2\x52\x67\x44\x24\x8d\x65\x1e\x1c\x68\xe1\xaa\x7e\x5c\x6a\x14\x9c\xe3\x19\x47\x2d\x6c\x47\x16\xc1\xf7\x3a\x8c\xb5\x42\xa1\xee\xf2\x3f\x3b\x02\x9a\xd6\xd8\x96\xe2\xc2\x10\x35\xbe\x7d\x52\x97\x65\x8f\x21\xf8\x92\x83\x86\x1a\xc3\x01\xe9\x62\x9c\x3f\x07\xf5\x00\x6b\x78\x40\x71\x41\x34\x88\x29\x0f\x8f\x91\x3a\xfb\x07\x87\x5d\x09\xdd\x21\xb6\x7c\xf7\xb3\x8e\xff\x1b\x46\x96\x0f\x8d\x02\xfe\x88\xb4\xa1\xde\x33\xfc\x24\xf6\xab\x9e\x9f\xc6\xad\xcc\x7f\x26\x70\x52\x69\xf6\xeb\xa6\x57\xa3\x6f\x90\xba\x42\xca\xe1\x3e\xd2\x65\x06\x2d\x70\xce\x05\x1a\x98\xe5\x21\x3c\xa3\x0e\x3e\x11\x2a\xad\x51\x43\x47\xd8\x99\x3f\x58\x61\x8f\x5e\x6f\x88\xc2\x9d\xf6\x67\x2b\xdb\xf0\x6e\x9c\x9a\x9d\x1f\x71\xa1\xfd\xbc\x33\xf0\x7b\xe1\xb2\x3f\x3b\xff\x88\xdf\xc1\x76\x2b\xbb\xd6\x1b\x22\x1f\x6c\x79\xe7\x96\x97\xba\xef\x2d\x35\x4c\x35\xe7\x16\x57\xd0\x95\x89\x4b\xc9\xfd\x61\xff\xe6\xc1\xa7\x5a\x2f\x98\x5b\x5c\x81\x81\x08\x21\xd6\xb7\xab\x33\xec\x30\x5a\xc1\xf2\x44\xdd\xc0\x9e\x40\xa9\x2f\x8f\xf5\x0f\x94\x66\xc5\x3e\x86\xed\x83\xeb\xa0\x6b\x4d\xf5\x3b\x0f\xb0\xef\x2a\xf3\xfc\x88\x46\x42\x44\x65\x2f\x3a\xe0\x7f\x77\xfe\xa7\x8d\x69\x84\xcf\xcb\x61\xbc\xff\x65\x8f\x20\x64\xd7\xc1\xc6\x0f\x38\x0a\xbe\xf9\x4d\x8e\xdf\x5a\x50\xf8\xcd\xf9\x04\xa4\x30\x01\xb9\xe7\x7a\x87\x4b\xd9\x8a\x0f\x38\x88\x85\x99\x72\xe1\xfb\xd9\x34\xbb\x76\x6b\x37\x21\x7c\xb7\x17\x19\xbd\xc7\x3d\x62\x72\x8f\x2c\x6f\x1d\x6b\x7b\xd0\xad\x95\x01\x58\xe4\xd2\xa6\x88\x5a\xf1\xc7\xe3\x96\xb7\xbf\x04\x00\x30\x87\xa6\x78\xc7\xb8\x7f\xa6\xec\x87\x42\x82\xbf\xc9\xe9\x4c\x6f\x43\xf2\x30\xa4\x27\x8b\x04\xee\xc0\xb0\xb4\x14\xc9\xf3\x45\x87\xa0\x10\x2c\x69\xf7\xfe\x31\x76\x52\x23\x32\x3c\xc9\x3f\x88\x21\x24\x97\x85\xb5\x70\x5a\x63\x2d\x9c\xf0\xaf\x5f\x29\xc7\x56\xa8\xaa\xd8\xde\x52\x6c\x05\xb3\xb4\xa3\x84\xa8\xf0\xfd\xfe\x13\x56\x29\x93\xd2\xec\x67\x8e\xa5\x60\x7e\xf4\x8a\x72\xd8\x8d\xe7\x5c\x3e\xea\xc6\x0f\x9c\xde\x2d\xb2\xc6\xd3\x72\x64\x8d\x45\x7f\x66\x06\xc1\x34\xbc\xed\x83\x69\x40\x2e\x69\xf9\x88\xff\xda\xb8\xc5\xe0\x69\x04\x20\x9b\x01\xad\xab\xf1\x79\x11\x19\xb1\xda\x3f\x3a\xee\xcf\x17\x9e\x0d\x0d\xd1\xce\xe4\x7b\x9e\x5d\xb0\x0e\xd8\xb6\x16\xd2\x2f\x8e\xb1\x7f\xae\xb0\x03\xbc\xd7\x0c\xc0\x5e\xe4\x7e\xa1\xe2\xff\x76\x65\x46\xfd\x69\x8b\x7f\xc8\x3a\x56\x54\x39\x49\x6a\x62\x52\x91\x40\x25\xf4\xeb\x9c\x8e\x4c\x93\xfd\x63\x93\x4c\xa2\x9d\xb4\xee\xa9\x7a\x6a\x7c\x13\xe0\xa2\x8b\xcd\x8e\x13\xc2\x11\xdc\x10\x49\xd0\xea\xe7\x15\xe2\x9b\x9b\xdc\xb0\x5e\x40\x8c\x69\x01\x75\x02\x6d\x86\xba\x2f\x51\x9e\xec\x4d\xf8\x73\xc6\xaf\xb2\x01\xa0\xab\x37\x15\x5b\x8e\xfa\x0d\x9b\xd0\xcc\x99\xe0\xad\x1f\xa9\x1a\x33\xbd\xab\x1b\xe0\x38\x8c\x8a\xd5\xbe\x91\xed\x83\x4e\xb8\x75\xff\x7b\x56\x71\x6c\x50\x42\xc4\x5d\x7e\x6f\x4f\x5e\xb8\x79\x02\xc8\x00\xe7\x85\xbd\x7a\xde\xcf\xd8\x93\x46\x02\x24\x0e\x27\x7a\xc4\x6d\xfe\x8d\x03\xfe\xd3\x47\xbe\x51\x10\x59\x83\x30\xc2\xa3\x79\x21\xaf\xa6\x0f\x14\xb2\xe7\x45\xe7\xea\xa6\x8d\xf5\x79\xd1\x61\x7a\x47\xda\x72\xed\xb3\x93\xec\x5f\x1c\x66\xfc\xea\xfe\xbd\xe3\xbf\xd8\xc9\xff\xd6\xc1\x53\x18\xe1\x66\xfc\xa0\x39\x78\x34\xf0\x82\x41\xf2\xa7\x28\x01\xc1\xfc\x81\x74\x7a\xa8\x86\xe5\xa9\x3a\x2a\x37\x0e\xa0\x10\x32\x42\x95\x37\xca\x97\xeb\xa3\x23\x32\x6b\x4e\xef\x64\x67\xd9\x99\x1d\x60\x57\x0e\x9d\x1a\x7d\x5c\xb0\x07\x1d\x76\x15\x0d\x20\xf1\x00\xbb\x3f\xe9\xf8\x67\xec\x47\x16\x7e\x90\x94\x49\xf9\xb9\x02\x98\x60\x9a\x6b\x59\xd9\x2a\xad\xd1\xb0\xba\x70\x2b\xbb\x85\xdd\xbc\xa3\x2e\x98\xf4\xd7\xec\xa2\xc3\x8a\xf3\xed\xbe\x50\x53\x17\xde\x5b\xf8\x09\x70\x4d\x69\x39\x95\x60\xa8\x2a\xe3\x34\x06\x3b\x97\x35\xbd\x0a\x14\x94\xb2\xd7\xa9\x10\xd1\x20\x11\xa8\x0d\xda\xf8\x56\x87\x15\x97\x9e\xfb\x72\xdd\xb8\xe7\x14\x7e\x52\x83\x3a\xc8\xe9\x78\x59\x0d\x54\x58\xb7\x46\x22\xf5\x90\x66\xfe\x83\xc3\x1e\x25\x3f\x41\x06\x4f\x79\xf2\xfd\xd9\x2e\x00\xa7\xde\xe4\x58\x65\x95\x43\x4d\x0d\x59\x86\x8a\x37\x33\x1b\xe0\x60\xad\x1a\x8b\x49\x14\x76\x96\xb2\x15\xb6\x01\x25\x2e\x23\x7a\xeb\x02\x25\x26\x20\xda\xf2\x68\x5d\x34\xeb\xec\x02\x73\x15\x50\xdd\x29\x8c\xc4\x97\x1a\xd4\x1a\x4c\xcc\x0d\xc7\xfc\x33\x83\x3f\x96\xa0\xdd\xa9\x20\x7e\x38\xf6\x14\xec\x5d\xe9\x62\x37\x86\xfa\x6d\x07\x4c\x4a\x17\x1b\x03\xa3\x4e\x80\xf2\xe8\xe9\x98\xd7\xa0\x24\xee\x57\x26\xfd\x3f\x70\x86\xfc\x68\xc8\x4a\x0e\xee\xb2\x40\x4e\x7a\xa2\xe4\x93\xc2\x4f\xd1\x66\x05\x62\x74\x25\x9c\x3d\x5a\x4c\x19\x58\x1a\x20\xec\xc6\xaa\x46\x9e\xf1\xd7\xa6\xf2\x2d\x15\x8b\x8a\x81\xc0\xaa\x54\x70\x4c\x20\xf2\xd2\x5a\x9c\xb5\x3d\xc2\x3f\x89\x9a\x70\xf7\x00\xf3\xae\xa2\x20\x97\x5b\xb7\x06\xa0\x67\xf2\x18\x3c\x5c\xbf\xc9\x12\xbb\x2f\x9d\x60\xbf\x38\xc6\xf6\xc1\xf7\xee\xdb\xc6\xfc\x4f\x57\x14\x3f\x64\x13\x42\x78\x70\x94\xb1\x78\x00\x7d\xee\x65\xeb\x31\x5c\xa9\xb0\x25\x75\x6f\x1e\x32\x92\xc1\xd2\x6f\x9c\xb2\x48\x29\xdb\x59\x03\xd8\x7e\xb2\x79\x21\x30\x13\x0f\xbd\xb3\xcb\x70\x08\xdb\xd8\x04\x18\x38\x1d\x27\x1e\x04\xc6\x47\xeb\x84\x5d\x60\x22\xd3\x40\xb0\x24\xb6\x65\x4a\x8d\x84\x94\xd8\x89\x90\x27\x64\x83\x36\x9c\x7c\x61\xba\xa4\x02\x52\x4d\x30\x02\x46\x87\x5f\x9a\x7a\x83\xec\x05\x65\xd3\xe4\x75\xc3\xc4\xa5\x7a\xe4\x21\x7c\x9f\x90\x5a\xf4\x6c\xa8\xe6\xd9\xe8\xc9\x49\xa6\x08\x58\x42\x04\xf0\xda\x6e\x2c\xf2\x88\xc5\xb9\x14\x27\x19\xfb\xf4\x18\xab\x64\xb1\xfb\xc9\x31\xff\x85\x63\x25\xd3\x55\x3e\x53\x7a\xd5\x61\xe8\xb4\x79\x5c\x22\x70\x17\xdd\xfa\xcd\x49\x94\x27\xdf\x88\x59\xcc\x91\x08\x76\x31\x9f\x56\xc3\x47\x4c\xab\xf1\xde\xee\x66\x77\xb7\x13\x9b\xaf\x75\x48\x1d\x78\x08\xe7\x56\x88\x84\xbd\xe4\xaa\x11\x44\x78\x8b\x71\x53\x10\x68\xc3\x17\x1e\xe5\x3f\xd3\x7a\xe2\xb5\xe3\xb0\x59\x06\xda\x50\x1a\x71\x2e\x3b\x62\xe2\x1c\x44\x69\xc6\xc3\x10\x8d\xfe\x1c\x1c\xcf\x04\xc7\x73\xd1\xd9\x2f\xff\x5a\x98\xb3\xc4\xc6\x97\xae\x64\xef\x73\xd8\x15\x72\x08\x1b\x1c\xb8\x37\xdc\x9f\x1d\x71\x72\x0d\xe2\x68\xc8\x76\xab\x24\xbd\xd4\x0f\x8d\x82\x8a\x48\xc9\x05\xeb\x3a\xa9\xa1\x10\x09\x38\xc8\x29\x83\x81\x89\xda\xe9\x5d\x44\x95\x93\xb2\xb0\x0e\x89\x78\x60\xc1\x84\x44\x3c\xcd\xa4\x74\x39\x09\xdb\x54\xc1\x43\x9c\xb2\x6d\x2a\xfd\xbf\x32\xce\x68\x02\xdc\x9f\x1f\xf7\xdf\x38\x8e\xff\x56\x8d\x84\x61\xd0\xc6\x29\x6a\x2e\x1a\xa8\xe2\x96\x27\x6f\x8b\xd6\x10\x20\x51\x63\x6a\x5e\x59\xe0\x14\x07\x73\x8c\x54\x86\xf1\xd6\xa6\xa2\xa8\xd0\x83\xab\xd1\xfe\x30\x68\xb3\xad\xe8\x7d\xb0\xa3\x71\x47\x44\x8d\x10\x59\x1d\x5b\xa0\x41\x37\x45\x6a\x91\x2c\x55\xcd\xea\xd0\xf8\x49\xc8\x67\x9a\x4d\x05\x22\x97\x53\xcf\x97\xff\x38\xec\x57\x21\xc3\x11\x6d\x26\x66\x43\xec\x8f\x8d\x26\x18\x5f\xcf\xf8\x04\xea\x61\xd4\x19\xa4\x69\x4f\x20\x4b\x64\xa7\x83\x67\x64\x59\xe9\xb2\x41\x88\xaf\xc1\x8d\x1c\x2e\xae\xf7\x0e\x54\x04\x50\x78\x39\x45\x96\x1e\x59\xf0\x8b\x1b\x2d\x8b\x74\x1e\x22\x8a\x4d\x00\x2d\x9b\xcb\xaf\xb1\x85\xba\xe1\x9e\x09\x61\x04\x69\xc6\xa3\x26\xf9\x76\xa8\x47\x8a\x4b\x40\x4e\x29\x0d\xd1\x30\x1a\x52\x9b\xf9\x74\x1f\xbb\x52\x25\xeb\xdd\x21\xfa\xa9\xfb\xae\x7d\xfe\xab\xf7\x99\x4f\x8a\x1c\x7d\xe7\xe5\xb3\x81\x60\x07\x05\x24\x00\xe3\xca\xb5\xc8\x90\xb2\x26\xc8\x02\x1e\x82\xf5\x1a\xe4\x06\x85\xe6\xc2\x20\xd1\x8d\xda\x60\xfd\x51\x35\x63\x35\x8a\xb0\x2b\xef\x75\xea\x4d\x61\xb7\x01\x99\x30\xea\xd7\x1b\x71\xe7\xe0\x7d\x71\x24\xfc\xaa\xfd\x2c\x11\xeb\x41\x1c\xf9\xd3\xdb\x69\x92\x9e\x34\xdd\x1e\xbd\x70\xec\xf6\x70\x88\x4d\x83\xf5\xaf\x2c\xf1\x0a\x5a\x05\x66\x07\x3d\x3d\xf2\xeb\x74\xe0\x53\x95\x03\x25\xab\x94\xf7\xcc\x78\x93\x16\xb5\xf2\x1f\x14\x97\x24\x84\xc4\xe9\x42\xd0\x06\xa2\xdd\x85\x70\x58\x16\x97\x19\x4c\x51\x01\xd2\x25\x68\xb4\x55\xc5\x41\xa6\x7c\x13\x89\xbc\xa4\x89\x0d\x43\x2c\x18\x2d\x81\xe3\xb1\xcb\xd3\x14\x00\xfc\x34\xa8\x1f\x4d\xf0\x02\xba\x2d\x89\x12\x0e\xe3\x69\x34\x22\x1e\x05\x23\xc5\xd0\xa4\xfc\xb1\x35\x12\x36\x6b\x32\x6a\x00\x41\x4b\x63\x01\xa9\x38\x40\x95\xe4\xaa\x33\x49\x47\x58\x4b\xde\x77\x80\x99\x07\x09\xb2\x36\xe4\xd0\xc1\x52\x41\x6e\xf4\x92\x20\xeb\xe3\x19\x0a\x9e\xa4\xfb\x0f\xf8\xb7\x96\xfe\x62\x1b\xb5\x06\x5e\x19\x4d\x17\xfb\x5b\x7b\x7e\xa6\x5d\xfb\x99\x36\x95\x9b\x29\xf2\xfd\xa0\xc4\xcb\x44\x43\x45\xd3\xb0\x7d\x6b\xc5\x56\xcb\x62\xcf\x67\xb4\x0b\x9f\xd1\xef\x99\x3e\xa3\xff\xb1\x4b\x9f\xd1\x0f\x7f\x93\x5c\x46\xaa\xa2\x4b\x4e\x6b\x6b\x7f\xd1\xac\x3b\xa3\xfd\x45\xb8\xb4\xb4\xcf\xa8\x54\xae\x94\xe2\xb3\xbc\xfe\x4a\x76\xdd\x30\x20\x4d\x62\xd8\x5e\x8e\x43\x71\x02\x03\x4d\xdd\xbf\xbe\xc2\x7f\x5d\x65\xf0\x79\x9e\xa7\x0c\xa9\x68\xf9\xef\x55\x8d\x03\x41\xd7\x1d\x2f\xc8\xea\x9e\x94\xe1\x0d\x70\x57\xa8\xec\x66\xeb\x23\x75\x6f\x21\x3c\x64\x0d\xe3\x45\xc8\x3c\xcd\x66\xea\x6d\xb6\x63\xeb\x12\xb1\x11\x70\x8f\x80\x62\xea\xde\x5c\x0e\x3b\x1c\x44\xde\xc6\xe1\xfa\xe1\x1b\xe5\x3f\x5a\x7c\x03\xa9\x17\xa0\x93\x36\x4c\x87\xca\x6e\x38\xec\x0d\x76\x0e\xab\x85\xe3\x35\x8a\x91\xfd\x33\x41\xe4\x17\xb0\xe9\x60\x15\x47\x8e\xd4\x2f\x3a\x13\x09\xc2\x8d\x5a\x12\xf9\x83\x93\x7b\x12\x79\x0f\x66\xec\x9b\x27\x18\xdb\x86\x5c\xfc\xc1\xdd\x82\x8c\x7d\xe7\x08\xfa\x16\xf6\x51\x87\xa9\x1d\xe0\xfe\x9a\x33\x82\x32\xbb\x0c\xae\xd7\x7f\x91\xa3\xc1\x7a\xe5\xca\x8e\xc2\xfe\x4e\xe5\x03\x19\x5c\x84\x67\x14\x44\x33\x42\x71\x43\xe4\x39\x9b\xc9\x81\x92\xc0\x46\x99\xf3\xe9\x02\x50\x66\x9d\xbd\xc8\x61\x93\x29\x8a\x93\xd4\x7d\xae\x7f\x2b\x89\x96\x94\xcc\x17\x86\xb4\xa3\xfd\xa4\xa0\x07\x33\x85\x21\x8c\xc4\x72\xb0\x30\xb6\x4f\x25\x6e\x8d\x0b\xd5\x79\xc9\xd9\xd8\xfa\x28\x58\x71\xef\xd4\x47\xc1\x50\xe9\x96\x23\x76\x0d\x88\xb8\xd2\xa3\xe1\x97\xf6\x6f\x1b\xf9\x17\xf1\x38\x9e\xb7\xdf\xff\xac\x53\xfe\x5b\x21\xae\xd3\x48\x5d\xcb\xa9\xc0\x72\xd8\xda\xe5\x60\xbd\x2d\x4f\x8d\x4d\x5c\x06\x3a\x44\x8e\xa2\xe2\x75\x82\x81\x0a\x82\x93\xd2\x5f\xa7\x4d\x29\x6c\xd1\x2a\xc8\xfc\x1e\xdc\xf9\x37\x11\x32\x1d\x31\xfa\x79\x98\xca\xc3\x23\x94\xd7\x13\x05\x6c\x03\x61\x0d\xcd\xd4\x06\x05\x21\xf8\x21\xaa\x2d\x15\x05\xdf\xf4\x2b\xc7\xd9\x6f\x8c\xb1\x6b\xb0\x24\x03\x58\xe1\x9d\x63\xdb\x49\xcb\x2c\x41\x5e\xf0\xff\xa9\x52\x2c\xcc\x4e\xc1\x07\x07\xb7\x85\x8b\xd9\x10\x69\xca\x93\xbe\x65\x16\x18\x4c\x76\x50\xcc\xb4\x60\xc2\xc7\xa8\x5e\xea\xbf\x19\x8f\x58\xbc\xae\xe7\x38\xbc\x30\x0b\x2a\x70\x63\x76\x65\xe1\x4c\xb0\x4e\x9e\x0d\x4a\x49\x83\x5b\x99\x6e\x2a\xc4\x15\xe0\x97\x88\x70\x81\xc2\x74\x44\xd5\x68\xc3\x28\x1b\x93\x32\xe3\x18\x39\x0a\x38\x9e\x02\xd0\xb8\x76\x1c\xc5\x09\xf6\x50\xd1\x8a\xc3\xea\x42\x5b\x52\x73\x78\xc3\xd9\x19\xf6\x98\x62\x4a\x09\x64\x9d\x5d\xef\x4f\x2d\x1a\x86\xb6\xc1\x41\xd5\x43\x6e\x99\x33\xee\xb7\x89\xd8\x4a\x30\xfa\x0c\xf3\xe8\xa7\xbe\xa9\xe6\xd1\x3f\xbd\x92\xbd\xa3\x60\x1e\x7d\xfd\xa8\x6c\xc2\x62\x5f\xca\x6c\xa4\x4f\x7d\xb8\x6c\xa4\x7b\xf6\xd0\x3d\x7b\xe8\x9e\x3d\x74\xcf\x1e\xba\x67\x0f\xfd\xf7\x60\x0f\x7d\xc3\x04\x3b\x7e\x59\xa8\xaf\x18\x02\xf6\xb9\xfd\xfe\x77\x0c\xfd\xf5\xa2\x33\x41\x61\x0a\xd6\x69\xf6\xc0\x7e\xf6\xfc\x0a\xdb\xdf\x14\x51\x20\x9a\xee\xd7\x1d\xff\xcb\xce\x1c\xfc\xdb\x24\x6a\xaa\x43\x84\xa8\x72\xa0\x72\x44\x45\xdd\x54\x0a\x28\x7e\x6b\x12\x07\x13\xd0\xdd\x42\x0b\x03\x18\x54\x78\x84\xdc\xc4\xf2\x17\x98\x98\xa6\xae\xa5\x85\x71\xa7\xe4\x9a\xb7\xf0\x58\xdb\x1c\x31\xd5\xba\x41\x04\x87\x77\xa4\xe3\xb9\xa4\xb4\x52\xef\x19\xad\xaa\x7b\xd4\x7a\x29\x3e\xe9\x12\x93\x51\xdb\x67\xf2\x66\xc8\x47\x36\xff\xc2\xe7\x2a\xec\x6a\x21\xf7\x02\x0c\x36\xb2\x07\xfc\x6e\xc5\xff\x40\x65\xde\x7e\x08\x17\xe8\x48\x07\x88\x2a\xde\x04\xa0\x54\x44\xba\x80\xb8\x01\xb1\x50\x9a\x2b\xc0\xec\x12\x71\x35\xb6\x45\xe3\xbc\x5a\x81\xf2\x26\x9a\x88\xb0\x9f\x2f\xc5\x2c\xf6\xd6\x45\xa6\xaf\x55\x98\x0d\x25\x3c\x4e\xbf\x49\x7d\x31\x88\x7a\xc2\xd8\x1d\x76\xf1\x14\xd1\x07\xe9\x97\x01\x86\x8f\x05\x19\x9e\x52\xc8\x61\xdd\x10\x55\x6f\xf9\xc4\xcc\xac\xc6\xa2\x42\x27\xbe\xc7\xe1\x0e\x86\x27\x92\x88\x80\xcd\x46\x3e\xc0\x20\xb9\x34\x93\x82\xc1\xf4\xc4\x43\x56\x37\x1e\x06\x10\xa2\x3c\x80\x94\x6a\x09\xe8\x67\xea\xc0\xe6\x15\xff\xe4\x32\x7e\x61\x2d\x31\x18\x0f\x23\x6e\xaf\x0f\x38\x7e\x50\x10\x84\x84\xea\x20\x9b\x84\xd6\x8e\x55\x7c\x83\xa9\xe5\xed\x3e\xd5\x7f\x8a\x31\xd5\x39\x98\xfe\xa8\x35\x4c\xdf\x56\x69\x81\xea\xa5\x6c\x2f\x92\xbf\x65\x56\x9c\xd1\xb6\xc0\xd8\xdc\xf7\x32\x7f\x6e\xe4\x1b\x05\x18\x99\x5c\x63\x56\x80\x6d\x78\x40\x5f\x74\x26\xd6\x79\x26\x36\x79\xff\xa2\xb3\x1f\x8f\xd2\x8b\xce\x01\x4c\xb7\x28\x1a\xcf\x3e\x74\x80\xb5\xd8\x35\xdd\x24\xce\x30\xb7\x7f\x2e\xee\xf0\x20\x72\x97\xfd\xf9\xd5\x82\xe6\xa7\xea\x58\xd2\xef\x7a\xf8\xb2\x19\x71\x8e\x5c\x53\x1a\x92\xaa\x5e\x30\x20\xe7\x8d\x70\x3f\xb8\x9d\xd4\xd1\x15\xf5\x3a\xa1\x13\xfc\xb8\xa3\x9f\x94\xd8\x08\x28\x3b\x45\x36\x47\x35\x16\x30\x75\xe5\x12\x84\x79\xf2\x52\x01\xf1\xd8\x1b\xd6\x2d\x2f\x0f\x23\x21\x44\xa2\x3c\x0a\xf8\x74\xbc\x1e\x44\x06\xf3\x09\xa2\x7d\xf2\x20\xac\xb3\x7b\x18\x4b\xd3\x70\x1e\xaf\x3f\xee\xb2\x3f\x77\x32\xe4\x00\x6a\x81\xda\xe4\xc1\x66\x90\xc2\x3e\x5c\x59\x39\x6d\xa8\x92\x58\x48\xd6\xf6\x4e\xe1\x04\x55\x75\x58\x31\x2c\x27\x6b\x0d\xbd\xd2\x61\x57\xd0\x38\x42\x3a\xf7\xf3\x1d\xbf\xb7\x30\x10\xae\x6a\xaa\x4d\x88\x5c\x4c\x5a\x5a\x7e\xef\x5f\x6d\x07\x8d\xf3\x66\x3a\x5a\x9c\xc8\x67\x91\xf1\x48\xc3\x8f\xca\x31\x28\xfe\x66\x4e\xe2\x33\x74\x9b\x96\xe2\x38\x74\x4f\xfb\xb7\xaf\x1a\x6b\x43\xb1\x81\xc8\xdf\x4c\xf2\x3b\x1d\x05\x9e\x2f\x34\xaf\x09\x8b\xc7\x2a\xfc\x2c\xa3\xe5\xea\xce\xfb\x37\x15\xd7\x5f\x41\x37\xe4\xa9\xb9\xde\x82\x48\xb5\xc1\x2a\xf0\x79\x3a\x21\x1e\xae\x9c\xa9\xdf\x32\x4b\xd5\x43\xc5\xc3\x44\xf0\x66\x0e\x33\x40\xe6\x2f\xd5\x2b\xa5\x09\xab\x18\xbe\x81\x7e\xe5\xc8\x0c\x04\x62\x64\xb6\xe1\x4d\x0e\xdb\xdf\x4a\x57\xfb\x5d\xe1\xbe\xc6\xf1\x7f\xcc\x31\x92\xe2\x21\x38\x2f\x8b\x15\xd1\xc6\x19\xc2\x19\xe0\x66\xb6\x3d\xbc\x33\xa0\x7c\x42\x1a\x22\xad\xcb\x68\x5d\x33\xf0\xce\x5f\xa8\x7b\xbe\xb8\x90\x1d\x93\xba\xe1\x85\x56\x2a\xff\x13\x65\xad\xd4\xb7\xe6\x17\x7e\x31\x9b\x38\xc7\x94\xc0\x70\x6f\xf6\xab\xab\x3a\xb9\xb6\xd9\x44\x7a\x35\x5b\x00\xcc\x2c\x2d\xa8\xe5\x6b\x75\xf4\x82\x81\x94\x1b\xfa\xff\x79\x00\xcf\xd6\x9b\x92\x3f\x1f\xdc\x4c\x82\x4c\x4c\x23\x5b\xf0\x50\x1c\x5d\xfd\x63\x2a\x32\xe8\x61\x10\x91\x3d\x03\x78\x84\x52\x5b\xda\x7e\xe8\x00\xfb\xbe\xed\x05\x57\xb9\xaf\x3b\xe0\x2f\x58\x4f\x8c\x00\x4e\x44\xdb\xc0\x1f\x4d\xe6\x3b\x75\x9e\xe0\xf6\x22\xb5\x7d\x29\x6e\xda\x8e\xe1\x4f\x4d\xc8\xe5\x86\xac\x02\xfd\xcb\x0b\xfd\x02\x1b\xd5\xad\xa5\xbc\x02\x03\x0c\xd7\x3a\x6c\xcf\x2a\xa1\xbe\xe7\x0a\xd9\x73\x85\x7c\xf3\x5c\x21\x9f\x34\x7d\xc4\x1f\x1e\x01\xcd\xb8\x3d\x67\xc8\xfd\xce\xb7\x00\x99\xfd\x25\xa7\xb9\xb5\x7f\x60\xc6\xbd\xbd\x66\xe5\x0e\x7a\xca\x5b\x60\x6c\xf7\x82\x97\xc0\xda\xb8\x8c\xfd\xc3\x24\xf3\x4a\x92\x0d\xe7\xb8\xe8\xc4\xd1\x0a\x65\x47\xff\xce\xa4\x5f\xb3\x9e\xe0\xda\x6c\xc4\xa1\xa2\xa0\x00\xf6\x76\xf9\x82\x14\x54\x43\x62\x58\x7e\x6e\x62\x6f\x95\xef\x45\x42\x10\x13\xce\xde\x81\xb1\xcb\x03\xe3\x07\x55\x34\xd3\x8a\xff\xd8\x1c\xa5\xc3\xdc\x84\xa6\x21\xa7\xce\xaa\xec\xba\xe1\xf9\x56\xc5\x5d\x7f\xc9\xb9\x7b\x6b\xe9\x73\xcc\x3d\x32\x44\xfa\xc8\xf2\xb4\xc0\xb1\x04\x07\x63\x1f\xa9\x58\x5a\x93\x8d\x08\x07\x98\xeb\x2a\xeb\xc4\xfd\xa9\x8a\x7f\x7b\xc9\x73\x4a\x22\x40\xac\x16\xbd\x64\x94\x57\xca\x5e\x06\x17\x9d\x03\xf0\x74\xa9\x48\x4c\xf1\xeb\x0e\x5b\x61\xf9\x6f\xee\x49\xff\x66\x40\xad\x8d\x4d\x76\x68\xe0\x58\x96\x75\x29\xdd\x3c\xa7\xd3\x95\xea\x28\xf5\xbd\x6e\xbb\xe5\xcd\x65\xfd\x74\xff\x8c\x5a\xd1\xea\x3e\x81\x4b\x58\xfe\xf3\xa4\xaa\x5c\xca\x40\xa9\x9f\x66\x02\x90\xad\x32\x91\x74\xa4\xfa\xab\x6f\x69\xb0\x44\xfd\x8d\xc3\xbe\x55\xd3\x57\xae\x60\x37\x18\x03\xd9\x0a\xe3\x4d\x4a\x89\x32\x42\xd1\xa4\x90\x5f\xee\x85\x22\xbd\x3b\xc8\xda\xca\xdd\xed\xbe\xe7\x0a\xff\x35\x63\x43\x7e\x04\x13\x8a\xce\x2d\x82\x2d\x81\x6e\x1c\xed\xf9\x36\xec\x1e\x90\xba\x6c\x64\x9e\x62\x9e\x90\xfc\xa5\x11\x47\x69\xd0\x44\x87\x1d\xf0\x30\x20\x75\x19\x3f\xaf\x84\x3a\x15\x51\x55\x5b\x7c\x4d\xd3\xd5\xc2\x73\x79\x0f\x26\xa0\x13\x43\xf4\xc7\x08\x40\x27\xaf\x24\xbd\xae\xbc\x43\x83\x89\x73\x58\x4f\x74\x06\x85\x6e\x2f\xb0\x60\x36\x75\xba\x05\x58\xff\xa6\xf8\xb4\x9d\x63\x91\xd3\xd3\xa4\xc5\x92\x8c\x86\x43\x41\x53\x6b\x43\xbf\x55\x8d\x86\x66\x61\x7a\xa7\xa6\x30\xc2\x67\x25\x85\xd6\x2f\x3a\x3a\x40\xc1\x5a\xae\xf7\x4f\xb2\x37\x55\xd8\x35\xc5\x32\xdc\x9f\xa8\xf8\x2f\x73\xee\x29\x3e\xbe\xc7\x8e\x6c\x34\xc8\x93\x8c\xa1\xa2\x9b\x25\xa6\x46\xf7\xb1\x35\x16\xcf\x7e\x91\x55\x3a\x48\x70\x9e\xd4\xb4\x60\x42\xab\x4d\xb4\x74\x6e\xf9\xb4\x25\x77\x4e\xb2\x39\x76\x62\xa8\xdc\x29\x5b\xb3\xa5\x8d\xbd\xe4\x3c\x91\x3d\xd6\x92\x47\xb2\x6f\x35\xc8\xf9\x3f\xe0\x4e\xf0\x2c\xee\x04\x0d\xc6\x3e\x5d\x61\x8f\xb2\xc6\xdd\xfd\x68\xc5\xff\xb8\x73\x4f\x52\x32\x38\x69\x18\x34\x2c\xe2\xb0\x87\x61\x68\x72\x12\xfd\x99\x42\x8a\x78\xb1\x49\xf2\xc3\x92\x69\x6c\xf3\xd4\xc0\xab\x04\x1b\xbe\x35\xbc\xb3\x6c\x66\x04\x54\x57\xd9\xf0\x5e\xf6\xd8\x3e\x6f\xcc\x88\x9d\xf9\x6a\xc5\x7f\x61\x45\xef\x8e\x82\xe3\x2a\x8a\x93\x0e\x0f\xc1\x08\x56\x55\x48\x6e\x72\xc0\x7a\x51\x06\x94\xef\xc8\x9a\x9d\xfb\x71\x21\x21\xaa\x81\xe0\x64\x6b\x71\x2f\x03\x29\x92\xe4\x00\x88\x65\x1b\x4c\x65\x8a\xc1\x2c\xd6\xbd\x19\x9a\x4e\x9c\x37\x04\xf8\x4b\x71\x7b\x83\xf8\x01\x43\xc5\x71\x23\xc5\x9f\xd0\xc6\xe8\x87\x5e\x64\xff\x04\xf6\x3b\xe2\x42\x53\xbb\x54\x6c\x88\xa4\x9f\xd3\xcf\x19\xe8\x43\xf9\x74\xdc\xc4\x6e\x18\x81\xe8\x56\x36\x1d\x3a\x1a\x68\x5b\x73\xf0\x52\xc6\xbe\x73\x18\x6d\x48\x57\x34\xdc\x7f\x38\xe0\xdf\xa6\xfe\x28\xa4\xd3\xf3\x9c\x7f\x0c\xc5\x39\x7a\xa2\x82\x54\x9b\x9f\x36\x83\xac\x6d\x47\xc2\xbc\xf1\x00\xfb\x94\xc3\xae\x6c\x98\xe4\x3c\x1f\x76\xd8\xe1\x6d\xf1\x98\x58\xfc\x37\x2f\x73\x16\x5a\x9e\x41\xfc\x0f\x93\xa2\x65\x3a\x4a\x91\x22\x93\x0f\x6a\xee\xf2\x40\x99\x43\x5c\x4d\xf2\x00\x62\xc1\x2a\xd2\xc3\x5b\xe7\x59\xbe\x54\x54\x5c\x88\xb2\x0d\x2b\xa7\x21\x79\xca\x72\x1f\x31\x7b\xa1\xc3\x98\x8a\x2d\x5a\x98\x73\x2f\xf8\xe7\xf3\xf0\x52\x04\x32\xe3\x61\x98\x43\xd0\x21\x86\x99\xc8\x8c\x22\xe4\x1a\xe8\xc4\x1b\x4a\x57\xe0\xad\x4c\x24\xde\xe1\xfa\xe1\xa3\x75\x2f\x15\x22\xd7\x04\xd1\xe3\xad\x94\xc1\x1b\x0e\xdf\x7c\xc3\x0d\xe6\x31\x7e\x27\x9b\xe8\xc6\xcd\xd9\x85\xb9\x65\xd0\x41\xf0\x9f\xc5\x18\x8b\x6e\xdc\xf4\x16\x96\xbc\x84\x47\xeb\xc2\xe3\x69\x1a\xac\x47\x39\xee\x97\x1c\x3a\x4b\x33\x78\xb0\xc2\x26\xa9\xcc\xd4\x7d\x63\xc5\xff\x53\x47\xfd\x55\x2c\x57\x95\x99\x96\x16\x0a\xc3\x08\xa8\x8d\xde\x5a\x1f\x4c\x4f\x9e\xf2\x27\x41\x9d\x83\x89\x90\x85\x29\x3e\x94\xb5\x3d\x11\x65\x49\xdf\xcc\x19\xa6\xfe\x40\x37\x69\x20\x17\x32\x50\xb1\x55\x2c\x31\xcf\x30\xe3\xfa\x30\x5d\x08\x65\x33\x04\x90\x4f\xb7\xbc\x85\xa5\x8d\x63\xb0\x75\x17\x96\x36\x6e\x18\xe1\xab\xbc\xe4\x5c\xcb\xbe\xd3\xda\x51\x5d\x59\x7b\x2d\xcd\x12\x9e\x89\xf5\xbe\x3b\xe9\xee\xef\x88\x64\x5d\x30\x30\xd7\x92\xf1\x3d\x59\x98\x73\x53\xbf\x55\x88\xe9\xd0\x63\x43\x66\xd0\x46\x18\xf7\x9a\xca\x5e\x9f\x28\xdd\x10\x2d\xfb\xc7\xbd\x27\x2d\xd1\x0f\x8b\xbc\x23\x6e\x3b\x7e\xf0\xa0\x7e\xa0\x4c\x6c\x8b\x10\x36\x72\x9b\xed\x1e\xda\x9f\x01\x0e\xaf\xfb\x34\xdf\x1b\xdc\x2b\x44\x2c\x84\xaf\x58\xbd\xbe\x8e\x4d\xb1\xef\xdb\x72\x43\xae\xca\x0f\xd9\x27\x1c\xf6\xa8\x5e\x44\xd1\x37\x10\x18\xf4\x41\xc7\xff\x05\xe7\x9c\xf9\x48\xa5\xd5\xa7\x44\x75\xa4\x7e\x09\xc2\x20\xeb\x83\x74\x17\x9b\x14\x53\x77\xa2\xaf\x14\xd4\xaa\x16\x26\x46\x49\x3b\xc6\xe9\x02\xa7\x36\xfc\xef\xc1\x27\x22\x06\x2f\x70\x2e\xd4\x00\xc0\x0e\x68\xb4\x65\xff\x2c\x13\xec\x4f\x8f\x59\x34\xe3\xb6\x03\xe7\x0e\xa1\x39\xab\xdc\x7f\xae\xf8\xd5\x81\xa7\xf9\x45\xc2\x3b\x2f\xfa\x68\x9b\xd7\x60\x6f\x63\xe7\x45\xdf\x92\x86\xff\xbd\xc2\xee\x62\xf2\xa9\x7b\xd6\x3f\x21\xc5\x12\x7d\x63\xf8\x80\xf2\xfb\x02\x62\x23\x1b\xb6\x75\xc0\x39\x54\xef\x9d\x17\xb6\x0d\xfb\x05\x2a\x08\xea\xbf\xf8\xb1\x19\x9d\x46\xce\xa6\x6c\xc7\x43\x19\x6f\xc8\x63\x57\x6c\x1e\x24\x23\x50\x4d\x0a\xf7\x1a\x45\xb3\x1e\x84\xc8\xda\x83\x4f\x84\xff\xd8\x8e\x90\x49\xe5\xee\x74\x67\xfd\xeb\x57\x88\xf9\xd1\xf4\xf9\xac\x10\x14\x1b\x22\xba\xca\x11\x50\xa2\x97\x82\x11\xad\xe9\xf9\x99\x6f\x67\x27\x69\x7a\x64\x6b\x6b\x7c\x7d\x3d\x11\xeb\xc0\x78\xaa\x4d\x13\xbc\x1b\x28\x96\x74\x2b\x8c\x60\x66\x69\x81\x28\x79\xe0\x68\xfb\xa3\xc7\xfa\xff\xcd\xb1\x9f\x0d\x27\x7d\x84\x58\x35\xc5\x22\x6c\xb8\xc1\x34\x99\xb0\xa7\xee\x2b\xe8\x0a\x90\x23\x0a\xab\x57\x39\x3c\xe4\xae\x03\xff\x72\x3f\xee\x61\x00\x1b\x39\xb7\x95\x7f\xad\x21\x92\x0c\xad\xe5\x02\x51\x82\x14\x8e\xd2\x45\xe7\x31\xa0\x38\x2c\x25\x41\x9c\x04\x59\xff\x4c\x10\x05\x9d\x5e\xe7\xa2\x73\x35\xdd\x16\xd5\x0f\xd6\xda\xfa\xda\x63\xd8\xbb\xf6\xb1\xd2\x2f\xdd\xd7\xef\x53\xd0\x21\xcf\xdf\x77\xaa\xf8\x42\xd4\xeb\x28\xf5\xab\x4b\x8f\x51\x24\xa3\x92\x45\xc6\x8f\x36\xdf\xc8\xd5\xa8\xba\xf7\xe4\x60\x1d\xe8\xd8\xd5\x07\x16\x74\x3e\x91\xc0\x52\x5a\x7b\x4b\x24\x14\x7f\x89\x16\xb3\xd4\x93\x4b\xcb\x0b\xe3\x4d\xb3\x80\x38\x12\x29\x1c\x9a\xa4\x81\xa1\xdb\x93\x3a\x9c\x6a\x7b\x0d\x16\xdc\x81\x28\x60\x45\x2b\x2a\x36\x44\xe4\xb5\xb1\x41\xa5\xbd\x43\x1b\x8b\x97\xf6\xe0\xe8\xa0\x26\x6e\xb6\xe3\x50\x35\x74\x5d\xc0\x0e\x6e\xdb\x9d\xc2\xab\x68\x37\x09\x3a\x3c\xe9\x7b\x29\xe0\x21\xa4\x04\x79\x1a\x47\x83\x55\x75\x7a\x1d\xa9\x9c\x36\x85\xec\x2e\x94\x95\x6a\xb0\x98\x2c\x86\x0e\xa7\x99\x37\x75\xe4\x90\xb7\x26\x5a\x72\x33\x1e\x3e\x34\x8d\x75\xa4\xa2\x11\x47\xcd\xd2\x5a\x40\xf1\x0a\xbb\x6d\xbe\x26\x80\xc3\xdf\x83\xc0\xa9\x24\x48\x73\x7b\x80\xe9\x6b\x54\xa6\x2b\x6f\x6a\xe3\x70\x7d\x8d\x27\xaa\xaa\x8d\xc3\xf5\x56\x1c\x4f\x7b\x77\x8b\x6b\x9b\x60\xc0\xea\x74\x84\x54\x5e\xe3\x8e\xc8\xe0\x5e\x12\x06\xe7\xc5\x71\xef\x3a\xd2\x31\x80\xec\x50\x74\x33\x88\x9d\x8e\x60\x0a\xe0\x96\x7a\xf8\xa6\x43\x87\x0e\x21\x5c\x3d\xe7\x2b\x22\xf5\xa6\xce\x76\x45\xb4\xd2\x0e\x5a\x59\xd5\x9b\x13\x81\x7c\x0b\xb8\x08\xa8\x02\x8d\xcd\x4d\x07\xdc\x91\x43\x87\x0e\xa5\x16\xae\xc9\xc7\x1c\xf6\x6d\x41\x94\x8a\x46\x2f\x11\x2b\xe7\x83\xee\xea\xe9\x95\xbb\x00\x32\xcb\xfd\x65\xc7\x7f\xab\xb3\x50\xf6\x93\xda\x42\xa9\xb7\x7a\x7a\x65\xe8\x3e\x42\xb8\xee\x92\xad\x8b\x5a\xbf\xb6\x36\xa0\xfb\x3c\xcd\x92\x38\x5a\x0f\xa1\xec\x46\xdc\x4b\xf8\xba\x54\xe2\xbc\xa7\xc5\x3d\xb5\x03\x50\xfb\x13\xde\xec\xcc\x89\x5e\xd4\x84\x5c\x03\x08\xe3\xb3\x3d\x7a\xdf\xa8\xb0\x09\xba\xb0\xb8\x7f\x5f\x61\x77\x95\x9e\xab\x3b\x96\x64\x24\xb2\xf2\x78\x82\x57\x56\x14\xd9\xd8\x20\x19\x24\x9e\x26\xf8\xab\x76\xb6\xcd\x2c\x2d\xe8\x3e\x83\xb2\xd4\x03\x0b\x4b\x1e\x29\x4a\x30\x29\xde\xb1\x63\x47\x75\xb6\x84\x51\x47\x14\x84\x55\xdc\x3c\x6a\xab\x0b\x64\x27\x21\xb2\x5f\xcc\x9e\x58\x5a\xc0\x1d\x45\xfb\xd6\xa4\x30\x01\x2e\xb1\x90\xc8\x9b\xac\x09\x10\x18\x35\x6b\x62\xfc\x36\x45\x28\x40\x2b\xd7\xaa\x24\xdc\x07\xb1\xac\xc4\x6b\xb4\xa5\x8e\x87\x2b\xab\xd5\x0b\x5b\x41\x18\x8a\x66\x9d\x3d\x95\x4d\x50\xc5\xee\x19\xff\x07\xee\xca\xdb\xa0\xda\xa6\x9a\x65\x34\x00\x1c\xc6\x69\xdd\xb3\x23\x5c\xfd\x8d\xc3\x96\x9f\xf9\xf3\x13\xac\x28\x7c\xdd\x3f\x98\x50\x42\xf5\xfd\x13\x77\xd9\xbf\xe5\x1a\x10\xec\x49\x29\x12\x88\xc2\x40\xcf\x85\x1e\x21\xb0\x71\x61\x00\x13\x89\x37\xe3\xd0\x5f\x87\x8b\x15\x44\x13\x47\xde\x7d\x22\x89\xb7\x90\x49\x85\x76\x0c\x8a\xa3\xe1\x72\x08\xd9\xc3\x83\x0c\xc2\xf0\x55\x9b\x38\xb6\x88\x34\xc8\x9e\x95\xf4\xd0\xe1\x61\x58\x95\x2a\xec\x1a\x5f\x0b\xfb\x6a\x87\x1f\x3e\x94\x82\xaf\xa3\xc1\x53\x28\x41\xdc\xdb\xe3\xa1\xee\x2d\x89\xd6\x40\xa4\x55\xd3\x2e\xaf\x9c\x37\xb0\x04\x14\x92\x3f\x46\x32\x77\x7b\x99\xc8\x47\x51\x35\x8d\xab\x91\xa2\x85\x5a\x28\x27\x48\x3d\x1f\xf6\x98\x94\x6a\x3e\x04\x5f\xe2\xea\x92\xe3\xc5\xd7\xe4\x8d\x2b\x8a\x23\xf3\x9d\x42\x09\x69\x95\xc2\x31\xa5\x34\x53\x63\x18\x8a\x0b\x41\x23\x5e\x4f\x78\xb7\x8d\x0c\x0d\x75\xcf\xbf\x63\xa0\x04\x29\x4a\x78\x92\x29\x2d\xc1\xdf\x50\x04\xd7\x1c\x22\xaa\xc9\x23\x0f\xf9\x16\x34\xa0\x53\xb2\x07\x1d\xfe\xec\x58\x9f\x77\xd3\xf4\x89\x52\xa5\xc2\x3e\x05\x92\x40\xef\x7c\x38\x0f\x7c\xa9\x41\xf9\x52\x3c\xf8\x98\xfc\x88\xf8\x8f\x76\xa1\x41\x64\x14\x0a\x6b\x27\x15\x18\xea\x86\x41\x19\xad\x20\x91\x0b\xad\xef\x9d\x9a\xf1\x6e\x83\x0c\x0a\xef\x36\x3c\x6e\xbc\xa9\x4d\xb0\xa0\x9c\x9a\x41\x09\xa3\xc6\x87\xa8\xfa\xbc\xb4\xd7\x6a\x05\x17\xf0\x4c\xe5\x98\x7c\x21\x1b\x04\xdf\x4e\x57\x73\x80\x69\x79\xec\xe3\x89\x15\xad\xdb\x9d\xa4\x3e\x5a\x6d\xac\x7b\x33\x91\xda\x85\xaa\x8d\xca\x26\xa4\xc6\xf7\xb8\xb7\x71\xf8\x50\xd5\xdb\x38\x52\xf5\x36\x0e\xcb\xff\x03\x19\x09\x7f\x1d\x92\xff\x3a\x5a\xf5\x36\x8e\x82\xd8\x94\x8f\x8e\x40\x8b\xf0\x3d\xf8\xe7\x91\xaa\xd7\x8a\xe3\xc3\xf8\xbf\x87\x6c\x90\xad\xbf\x03\x86\x32\x14\xef\xee\x9f\x3b\xee\xf8\x5a\x3f\x13\xfe\xdb\x9c\x5c\xe4\x03\x95\xd4\xfc\x19\x4f\x44\x8d\x58\x9e\x6e\xb3\x33\xde\x1a\xfe\x84\xeb\xa5\xb8\x82\x15\x94\x39\x39\x1a\x48\xe8\x5c\x8b\xd2\x47\x0e\x89\x71\x7a\xc1\x6a\xee\x45\xc6\xbd\x4d\x45\xd2\x24\x90\x8a\x16\xc7\x99\x66\x3b\xd0\xf6\x72\x98\x4d\x59\x5b\xdd\xba\xb9\x6e\xcb\x16\x34\xab\x48\xfc\x8f\xfb\xb5\x53\x4a\x63\xb3\xe4\xb8\x22\xd2\x2e\x88\x4b\x53\x34\x7e\xd4\xb1\x00\x7f\x2c\xdc\x3d\x8a\x1b\x04\xed\xfb\x8d\x8e\x7f\x5c\xff\x35\xdc\xb2\x84\x00\xb3\x80\x78\x98\xf6\xd6\xb4\xf5\xd3\x52\x75\xcf\xb1\x15\x36\xa9\xa0\xed\xdc\x53\x4a\x0c\x1f\x19\xc4\xbf\x53\xc1\xa0\xa9\x3e\xa2\x08\x27\x8e\xf4\x24\x6b\xf6\x7f\x64\x9c\x8d\x46\x10\x3c\x52\x5f\x8a\x9b\xa9\x89\x22\xe8\xfe\xfe\x98\x7f\xd1\x29\x3e\x35\x62\x3c\x33\x03\x86\x72\x43\xb1\x8b\x70\xc2\x39\x54\xa3\x20\xd7\x01\x18\x27\xba\xb1\x0e\xe1\xd2\xd8\x95\x30\x14\x64\x0c\x9e\x6a\x99\x87\x14\x24\x53\x61\x94\x67\x5a\xeb\x26\x31\x72\xea\xd4\xba\x22\xa9\xa1\x42\x39\x5d\xbf\xe8\xec\xc7\xaa\x2e\x3a\x13\x54\xa2\x35\x92\x2f\xa9\xb0\xfb\x1d\x46\xef\xb8\xfd\x11\x8c\x94\x65\xa3\x81\x7d\x5e\xd0\xb8\xaa\xfe\x4d\xd4\x2f\x03\x2c\xd5\x30\x65\xd3\x8f\x6b\x7d\x5c\x55\x60\x3c\xa5\x6b\xb4\xbc\xbe\xaa\x06\xba\xfd\x11\xf0\xf9\xc3\x9b\x01\xdc\x2d\x38\xfe\xfe\x8d\x6a\xf4\xf2\xc4\xb3\x81\x79\x50\x0b\x02\x53\x56\xb0\x6d\xec\xd5\x63\xa5\x80\xf4\x8b\x2a\x8f\x34\x47\x4d\xfe\x9b\x8a\x7f\xeb\xe0\xe3\xbc\x42\x1b\x53\x57\x83\x5c\xe6\x19\xa9\x23\x51\x92\x5f\x5c\x79\x88\xd1\x8d\x9f\x44\xe8\xc6\xc7\xfc\x6b\x15\xba\xb1\x6e\x8a\xd2\x56\x42\x64\x4f\x29\x81\x39\x3e\x5b\x8a\x72\x7c\xf3\x65\x43\x3d\xb2\xc7\xe6\x18\xc5\x56\x76\xc0\xb7\xe9\x08\x6a\xeb\xf1\xfb\xaf\x60\x4f\x18\x4c\x86\x35\x51\x08\xdc\xd7\x5d\xe1\xff\xb8\x63\x65\x02\xa7\x79\x02\x8b\x07\x69\x81\x55\x0d\xfd\x06\xb2\x8d\x34\xb2\x01\x9f\x0d\xe9\x37\x5a\xa5\x6e\xca\xf3\x8d\x7b\xbd\x28\xc8\xf0\xd8\x36\xd1\x0d\xe2\xa4\x24\x67\xd6\x96\x56\x2f\x3f\xb0\x17\xb3\xf2\xef\x22\x49\xfd\x39\x6c\x5f\x02\x1e\xbf\xc4\x3f\x86\xeb\x01\x73\x2e\x55\x7e\xad\xb9\x52\xf4\xbd\xca\x98\x7d\xd3\xa6\x7a\x90\xd5\xd8\xf7\x6f\x95\xcd\x6d\x38\xd7\xd9\xcf\x55\xd8\xd5\xea\x46\x18\xc4\x11\xc0\x77\xbe\x66\x14\x0f\x9e\x2a\x63\xc6\xfe\xc8\xff\x0b\xa7\xf0\x84\xd2\x39\x94\x2e\xa9\xe2\x12\x20\x07\x50\x9f\xc2\xed\x78\x13\xee\x53\xbd\x20\x44\xf7\xe3\xf0\x6e\x82\x9a\x52\x52\x47\x2a\x32\x23\xc3\x05\xbf\x47\x00\x46\x2d\x5d\x14\xfa\x2c\x24\xc7\x00\x29\x1f\x41\xab\x82\x8b\x12\x3f\x51\x1a\x54\x9a\xc5\x9d\xae\x61\x30\xd7\xa5\xec\x45\x8a\xee\x36\xf0\xe7\x92\xf3\xec\xad\x43\x73\x4e\xb9\xf3\x97\x07\x1c\x50\xe4\x22\x78\x2f\x63\xdf\x53\x12\x28\x44\xe0\xc5\x2b\x22\x03\xf5\xf0\xe5\xcc\x3f\x66\x3f\xd2\x80\xd9\xc5\xa8\x62\xee\xe5\x2f\x42\xb4\x03\x29\x11\x96\xd4\xfd\x8d\x03\xec\xfe\x0a\xbb\xba\x13\x44\xcb\x82\x37\xfb\x2b\xa0\x10\xa5\xee\x3f\x6a\x10\xe5\x4f\x3b\x64\xb3\x33\xd4\x45\x54\x9b\x70\xd9\xd3\xfd\xcf\x8b\xc4\xa6\xc1\xe3\x27\x35\xb4\x3c\x3f\x01\x83\xef\xe5\x95\x48\x1e\xf2\x3c\xea\xab\x7b\x3c\xa9\x01\xf2\x40\x4d\x78\xda\x86\x0c\x40\xe4\x30\x23\xab\x85\x8a\x6d\x91\x9b\x41\x25\x36\xeb\x50\x77\x58\x56\x87\xbc\x29\x59\x99\xda\x0e\x65\x1f\xc8\x83\x29\x8d\xe3\x48\xfe\x37\xc8\x30\x13\x88\x37\xfb\xd3\x96\x56\xfb\xe6\x8a\xa1\x2b\xbf\xba\xa2\xba\xff\x6f\x4e\x11\x3d\x3a\x1f\x06\xa5\x47\xab\xcf\x72\x2b\x19\xc7\x64\x64\x34\x68\x36\x03\x20\xc9\xee\x05\x69\x5b\x93\x59\x8a\x0b\xf2\x93\x20\x03\x63\x05\xac\x7f\xe3\x42\x63\x77\xf0\xf0\x8e\x5d\x12\x9b\x71\x72\x3e\x8c\x79\x33\x3d\x98\x4b\x83\xf4\x20\xb5\x52\xae\x8e\xfc\xf1\xc1\x27\x6e\xb6\x79\x56\x0b\xd2\x1a\xaf\x95\xbe\x60\x8d\xd1\xbf\x56\x98\x5e\x45\xee\x57\x2a\xc3\x59\x9a\x47\xc5\x45\xf2\x35\x11\x2a\xb7\x90\xff\xce\x8a\xf6\x10\x61\x1c\x8d\xfc\xd5\xbb\xb7\x27\x92\x3e\x9a\xbf\x73\x2e\x4b\x5a\x4e\xb9\x67\x93\xda\xeb\x35\x30\xb9\x02\x0a\xa6\xc4\xd4\x48\xc9\x0d\x32\xc5\xe5\x2e\xd1\x20\x22\x0b\x89\x5e\x5f\xd8\xd1\x1c\x59\x5a\x15\x9b\x8a\xac\xae\x2d\x80\x96\x3f\xd5\xcb\x44\xa7\x2b\x45\xd9\xb5\x2a\x01\xf6\x21\xf6\x1a\x61\xa1\x07\x9f\x08\xff\xad\xa9\x11\x4f\xd9\xab\x2a\x6c\x52\xd5\xed\xbe\x70\x3b\xec\xaf\x4b\x71\x73\x95\x3e\x80\xdc\x83\x3f\x74\xd4\x9f\x9a\x8d\x00\x55\xa5\xc2\x39\xa7\x7b\x2a\x1f\xeb\xbd\xa5\xb2\x67\xe0\xc2\xd8\x6b\xb5\x82\x06\xa8\x49\x1a\x3d\x5d\x1e\x63\x4d\x91\x01\xec\xf0\xc3\xb9\x6a\x9f\xd8\x8d\x9b\x35\x35\x10\xec\x95\x07\x8a\x6c\x1b\x03\x88\xf6\x5a\xb5\xc9\x6f\xa4\x7f\x36\xe9\xbf\xd4\x19\x7c\x7e\x39\x77\x52\xa4\x0f\xa3\x14\x67\x1a\x4f\xfb\x0a\xda\x0e\xb2\xd4\xb8\x70\x42\x8a\x76\xe4\x2d\x44\xeb\x98\x7e\x03\x9f\xc0\x2d\x14\xaf\x80\x17\x1d\x86\xb5\x2c\x02\xf4\xc4\x95\xd4\x0a\xb8\xba\x59\xd2\xfb\x75\x13\xec\x7d\x0e\xbb\x92\x6f\x88\x84\xaf\x0b\xf8\xdd\x7d\xfb\x4e\xe2\x95\x07\x69\xd9\xfd\x75\xb3\x34\xb5\x4a\x06\xc6\x01\xcc\x11\xf8\xa2\x4d\x4a\xe0\xf1\x46\x12\xa7\xa8\x0d\x26\x22\x14\x1b\x3c\xca\x70\x17\x4f\xc1\xfd\xe0\x5e\xaa\x67\x9a\xbd\xcc\x61\x56\xcf\xdc\x1f\xde\x5d\xc3\x7f\xc0\x2c\x6c\x64\xc3\xa9\xa5\x85\x06\xd5\xd9\x69\x66\x8c\xbb\x7b\x9b\x7f\x38\xff\xab\x0c\x2a\x43\xdd\xe2\x23\x0f\xae\x07\xc5\xdb\xe0\xd7\x4d\x69\xf9\x37\x0f\x85\xb4\x7c\x5b\x25\x35\xa4\x65\x6e\xea\xac\x29\x33\x5b\x2b\x4e\x3a\x9a\x7b\x08\x15\x78\x63\x69\xa2\x70\xd5\x45\x94\xdd\xec\x31\x63\x3f\x15\x3a\x0c\xd7\xda\x21\x30\xe0\x55\x3a\x43\xbb\x1c\xa8\x89\x79\x8a\xcc\x77\x78\x1d\xe6\xa1\xd7\xe5\x09\xef\x88\x2c\xc7\x84\x50\x64\x15\x64\x19\x03\xde\x5f\x29\x1a\x34\xc0\x84\x7e\xa1\x11\x77\x01\xcd\x19\x1a\xd1\x8b\x40\x53\x7e\x76\x2f\xcd\x8c\x62\x60\x2e\x8a\xd6\xc3\x75\x0e\x26\x5d\x2a\xa7\xce\x7e\xc4\x61\xb4\x93\xdc\x0d\xf6\xe4\x1d\x71\x5f\xcc\xca\xc5\x4b\x1a\x72\x91\x3a\xfb\x3a\x32\xd0\xe4\x34\x12\x20\x2d\x9b\x26\xc2\x01\xa9\xc6\xec\x8b\x13\xec\xa6\xa1\x39\x61\xb4\xf1\x81\x12\x7d\x49\x0d\x57\xaa\x2b\x72\x7f\x6e\xc2\x7f\xee\x16\xef\x58\x44\x3b\x68\x33\x55\x5a\xb9\x89\x45\xa0\x46\x48\xf9\x80\xf3\xab\x7e\x9c\xe4\x96\x8d\x9a\x1c\x79\x50\x64\x68\x4f\x5d\x74\xe0\x1e\x4e\xe0\x37\xb6\x29\x6c\x3f\x9b\xa5\x10\x8a\x5b\xfc\x7a\xd9\xd6\xd0\x57\x71\x15\x65\xac\x0c\x04\x36\x4a\x87\xc3\x0e\xe8\x06\xb8\xef\x76\xfc\xb7\x3b\xda\x4e\x64\x96\x88\x0f\x74\x94\xc6\xb0\xa2\x87\x00\x83\xa0\x73\x13\xba\x47\x77\x2f\x08\xf0\xd6\x35\xa1\x4f\x40\x05\x56\xc0\x92\x1b\xf2\x09\x69\xee\x76\x60\xf8\xe7\x1c\xb6\x0f\xde\x74\xff\xd8\xf1\x3f\xe2\xac\xc0\x47\x46\xe0\x57\xa0\x6f\x51\x04\x9c\x33\x64\x02\xbc\xe2\x04\x60\x77\xe4\x9d\x08\x71\xb3\xac\x26\x68\x2a\xec\x69\xf0\x6d\xe4\x9d\xa9\x63\xa0\xbb\x06\xa2\xa0\x10\x3d\xf0\x45\x98\xeb\x49\x7f\xd1\x84\x95\x95\x5a\x11\x7e\x56\x07\x3f\xe3\xb0\x49\xde\x0d\xc0\xea\xed\x7e\xcc\xf1\x7f\xdd\x99\x59\x5a\xb0\x6c\xe0\x68\xff\x56\xb2\x64\xc4\x04\xc9\xdb\xb0\xf1\x2d\x00\x62\x14\xc2\x14\x75\xc8\x3f\x98\x7e\xd4\xac\x28\x4b\xaf\x94\x19\xda\xe2\x8e\x20\x06\x70\x95\xa0\x88\x99\x20\x69\xd6\xba\x3c\xc9\xfa\x90\x51\x9b\x56\xad\xda\x4a\x81\x62\x66\xc9\xda\x74\x8b\x5f\x57\xb6\x26\x30\xc3\x92\xe1\x6f\x7b\xeb\xf8\xcd\x63\x56\x56\x97\x52\xbc\xe6\xa3\x8d\x93\x49\xdc\xa1\x50\xce\x7f\xa9\xf8\xc7\xad\x27\xc5\xe8\x40\xaa\x09\x45\x37\xe6\x9f\x62\xf0\xe5\x19\xde\xb5\x4d\x9e\xef\xaa\xb0\x86\x0a\x14\x3d\xc3\xbb\xcb\xa2\xe5\xae\x6c\x83\xa9\x5e\x97\x36\x1f\x6d\x50\xa4\xe8\xe3\x57\xdb\x22\xaf\xa5\x10\x51\xc5\x22\xb6\xbf\x9b\x88\x56\x70\xc1\x6d\xfa\x77\xcf\x18\x76\x91\x9c\x1f\x4c\x7e\xd2\x4d\x80\x5e\x1a\xf2\xe2\x79\xa3\x0d\x71\x4a\x34\x61\xba\x68\x33\xf1\x79\xf6\x59\x0b\x73\xf3\x8b\xab\x0b\x27\x17\xe6\x97\xad\x71\x7c\xba\x89\x1d\x70\x66\xdb\xd0\x01\x79\x77\xbe\x63\x35\x0f\x9a\x2a\xf4\xe5\x1d\x33\x6c\xa7\x26\x30\xf7\xab\x3f\xe0\x87\xf9\x9f\x72\x6d\x28\x0b\x18\x45\xf5\x86\xa1\x06\x68\x68\x1a\x90\x5c\xb0\x6a\xdb\x7c\x43\x28\xd7\xa8\x8e\x91\x96\x5f\x28\x94\xc3\x5e\x0a\xb6\x48\x08\x2e\x00\xad\xda\xb6\x85\x7e\xfd\x76\xf6\xb9\x09\xc6\x5a\x41\x04\x98\x3e\x49\xea\x7e\x62\xc2\xff\xf1\x09\x35\x8c\x88\x30\x43\x5e\x69\x43\x89\x07\xb6\xef\x50\x64\x8a\xf9\x0e\x77\x24\xc4\x49\xf4\x89\xc1\x05\x63\x44\x09\xb9\x24\x9f\x49\x63\xff\x76\xe5\x0d\x1a\xc3\x13\x3b\xdd\x38\x02\xb0\x1b\x7d\x0b\x48\x30\x0e\x17\x0d\xa6\xb2\x24\x5d\x8f\xe6\x5c\xc3\xa3\x31\x14\xca\xfe\x9d\x66\xbc\xd3\xb5\xe3\x6e\x70\xff\x47\x35\x08\x96\x90\xe5\x04\x05\xf2\xb6\x1c\xc0\x12\xac\x07\xb2\xce\xa6\x14\x6e\x6a\x38\x94\x64\xd4\xde\x1c\x10\xe3\xf4\xa2\x2c\x09\x04\x83\xbc\xe7\xd5\x3d\xef\x2c\x7a\xc4\x53\x6f\xf1\xec\xaa\x27\x22\xc8\x41\x6f\x7a\x6b\xa2\xc1\x7b\xa9\x00\x65\x46\xde\x2b\x9a\x3d\x39\x7b\x69\xb0\x1e\x81\x11\x45\x5e\x6b\x82\xf4\x3c\xd2\x1b\xf6\x1a\xe7\xbd\x7c\x2e\xea\xc6\xbf\xc9\x3e\xdd\xe6\x89\x4a\x8a\xaa\x42\xdd\x1c\x34\x2c\x10\xbc\x5d\x91\x00\xaa\x4a\x1c\x11\x62\x2f\x79\xe8\xf3\xd1\xd2\xc5\x69\x4a\x9d\xbc\x5f\xea\xbe\x6a\xf2\xd5\xc8\x62\x42\xc1\x89\xba\x38\x0d\xb2\x1e\x51\x28\x45\xb4\xe4\x50\x5c\xaa\xd9\x33\xe7\x54\xcd\x33\x3a\xb4\xf3\x8a\x0d\x02\x1b\x48\x91\xe2\x41\xa6\x02\x56\x38\x0c\x0a\x0f\xbd\x29\x3c\x5d\xc9\x66\xa7\xd1\x22\xd1\xf9\x0a\xe9\x06\x20\x8a\xa7\x65\xeb\xe5\x68\x92\xf7\x7e\x78\x43\xb8\xd9\x73\x88\xdf\x30\x9a\x51\x95\xaf\xf7\x42\x85\x0d\xc0\xbd\xa6\xe0\xcd\x30\x6e\x9c\xaf\x7b\x77\x93\x21\x49\xcf\xa5\x8e\x1c\x31\x26\x06\xc2\x08\x12\x01\xa1\x31\x38\xe2\xbc\x13\x47\xeb\xa8\x4c\x76\x52\x11\x6e\x08\x34\x14\xc8\x17\xe5\x61\xb4\xd1\x0b\x23\x91\xa8\xe8\x43\x5d\xa4\x32\xbc\x0e\xa3\xf8\xb9\xec\x58\xe8\xe7\x57\xd8\x7e\xbc\xe8\xbb\x5f\x77\xfc\x4f\x3b\x52\x06\xc3\x6a\x83\x6a\x4b\xed\x18\x05\xa5\x2e\x4e\xd6\x79\x14\xdc\x87\x2e\x42\x79\x67\x5d\x47\x0c\xa4\x29\x54\x5e\x72\xc7\xe1\xb4\x41\xe8\xcb\x29\xc9\x46\xdf\x03\x52\x83\x00\x4d\xfb\xe6\xe8\xfa\x4d\x65\x40\x74\xd3\xa0\x91\xa3\xfc\x42\x2f\x45\x5b\x6d\xbd\x17\x34\x05\xd9\x31\x1e\x28\x8c\x91\x21\xe9\xd8\xd7\x2a\xa4\x4b\xfe\x5d\xc5\xff\x5c\x05\xb4\xc9\x5c\x19\x0b\xee\xed\x21\x32\x1f\xcc\xbf\x09\x52\x5b\x54\xf0\x40\x86\xe2\x21\x4d\x72\xb8\xea\xf1\x90\x02\x4b\x01\x90\xc9\x10\xd0\x39\x8c\xa9\xf2\xf3\x00\x70\x11\xa5\xd9\x49\x95\xc6\xe0\x1d\x6b\x61\xd6\x5d\x37\x89\xbb\x49\xc0\x33\xd2\x72\xe5\xcd\xa1\xc3\x33\x15\xde\xa2\xb4\x60\x8c\x37\x0a\x20\xca\xc7\x20\xad\xc4\xd6\xc5\x20\x70\x3b\xdd\x38\x43\x3c\x5e\x24\x30\x32\x92\x30\xf2\xf3\xae\xd4\xc9\xb4\xd3\xc1\x37\x78\x3c\x07\xe3\x8f\xdf\x32\x66\x6a\xdf\xaf\x1e\xf3\x5f\x38\x96\x6b\xdf\xa6\x63\x00\x9f\xd0\x24\xa0\x74\x81\x73\x3e\x1a\x9c\x2a\x0c\x4a\x81\xa3\x29\x32\x35\x79\x39\x53\x1b\x3c\x14\x39\x7d\xbf\x4f\xfa\xab\x6f\x22\x93\xaf\xf5\x32\xe3\x07\x75\x7d\xe7\x51\x1c\x81\x2f\xd2\x76\x44\xe4\x79\x23\xea\x44\xc5\x78\x4a\x5a\x14\x68\xdc\x23\xa5\x1a\xa4\x64\xde\xa2\x1a\x3a\x3c\x72\x7b\x80\xbe\x37\xa0\x70\x8c\xd3\x1c\x8c\x58\x5d\x34\x31\x1d\x8c\xb1\x5c\x8f\x99\x5b\x5c\x79\xd6\xe9\x99\x13\xf3\xa7\x1f\x92\xb9\xd2\xad\xb3\x26\xe9\xff\x1d\x63\x57\xc7\x9b\x91\x48\xf4\xad\x2f\x75\x3f\x3f\xe6\x7f\x40\x73\xb7\xa9\x66\x36\x41\x07\x33\x6c\x98\xea\x2a\x28\x75\xee\xd3\xa7\xf5\x7b\xa6\x94\x87\x40\xe5\x35\x21\x22\xa5\x32\x54\x2d\xd7\xa9\xea\xf9\x3a\x4f\xd6\xf8\xba\x50\x00\x04\xa4\xc8\x9b\x6f\x06\x16\x5b\x22\x37\xc4\x87\x0a\xe8\x8a\x94\xd6\x61\x9e\xf0\x50\x01\x79\x5c\x63\x3a\xd7\x8c\x2f\x35\xa0\x90\xe1\x16\xc3\x59\xa2\xdb\x10\xe0\xb6\x51\xfa\x5a\x8e\x52\xdd\x41\x8d\x08\xb4\x07\x81\xed\x02\x21\x9e\x7b\xc5\x4c\xd9\x3d\xcf\x66\xd9\xcc\xe5\x78\x4a\xad\x49\xd9\xbe\xcc\xbf\xe4\x7c\x1f\x7b\x7c\xc9\x9b\xf0\x6b\xed\xbc\xe8\xbb\xfb\xdd\xf1\x5e\xd0\x64\xec\x6f\x1c\xb0\x1d\xb5\x4e\x07\xd1\x79\xf7\xb3\x8e\xff\x09\x67\x85\xfe\x42\x8d\xe3\xdc\xf2\xe9\xa2\x23\xdc\x98\xf6\x25\x8d\x3b\x4c\x5e\x41\x05\x1f\xb4\x2c\x78\xb3\x26\xf5\xaa\x3a\x63\x73\xf3\x4b\xcb\xf3\xb3\x33\xab\xf3\x73\xa6\xfd\x02\xe3\xff\xb2\xb8\x2b\x4f\xf1\x2e\x5f\xe7\x79\xe9\x74\xb9\x8e\xbc\xc3\xf5\x23\x87\xc0\xb6\xc7\x09\xc0\x2f\x4f\xe3\x96\x42\x30\xe4\x51\xa4\xf7\xa0\xa1\x93\x1d\xae\x1f\x39\xac\x3e\xb3\x54\xff\x37\x54\xd8\x15\x74\x2b\x06\xc3\xdb\x4b\x2a\xfe\xff\x76\x8a\xe8\x50\xea\xda\x9c\x6b\x38\xb4\xfe\xd6\x44\x28\xcf\xf5\x1c\x95\x36\x48\xf5\x09\x69\xba\x5e\xf2\x13\x00\xc1\x5e\x35\x5e\xad\xec\x81\x21\xb0\x22\x03\xe5\x91\x2a\x4d\x8b\xe6\x05\xb8\xbc\x02\x30\x5f\x1f\xc3\xff\x12\x8d\xb7\x0d\x2a\x85\x8e\x3a\x0b\x52\x8f\xd8\xf9\x62\x2f\x58\x8f\x40\x2c\x40\x6e\x34\x99\xd8\x50\xf9\x97\xba\x13\xca\x8e\x52\xbc\xbc\xf7\x4e\xb0\x2b\xe9\x4c\x42\x98\xab\xb7\x4d\xf8\xaf\x9b\x38\x65\x3c\x29\xfa\xae\xf1\xe6\x66\x53\x7a\x62\x8b\xaa\x98\x05\x88\x9f\x62\xb8\x86\x3c\x65\x61\x20\xce\x2e\x9e\x7e\x9a\xb7\x70\x12\xde\x86\x52\xb1\xbf\x88\xbc\x98\xa1\xb0\x50\xd0\x69\x25\x19\x69\xb2\xb2\x6a\x6e\x09\xd2\x30\xc0\x24\xf4\xe9\xac\x55\x82\xc5\x80\xd2\x94\xdb\x55\x7f\x86\x66\x45\x1a\x70\x94\xd2\xf0\x09\x60\x8e\xaf\x19\x3c\x85\x14\x38\x4a\x1d\xc0\x38\x4b\x15\xf6\x8b\x6d\xa4\xcf\x21\xb3\x57\x81\x9f\x52\xa0\x21\xd0\x65\xa3\xeb\x3d\x2d\xf4\x37\x77\x47\x23\x60\x64\xd4\x30\x77\x52\x28\xa2\xf5\x1c\xbb\x80\xa2\x3b\xcd\x73\xa7\xc3\xcf\x0b\xe3\x84\xa1\xe6\x51\x38\x22\x05\x73\x33\x36\x3c\x9d\x4f\x6f\x28\x35\x49\xb8\x38\x3d\x71\x21\x48\x33\x0a\x07\xa6\xc5\x05\xe3\x22\x2f\x35\x0a\x7d\xdf\x3b\x76\xe8\x66\xaf\xa6\x02\xee\xf3\x78\x5e\x11\x80\x8d\x84\x5e\x3b\x72\xe8\xb0\x37\x4b\xae\x9c\x38\xf1\xae\x3f\x74\x08\xc7\x92\x90\x18\xd1\xa9\x2f\x6f\x6e\x52\xc7\x36\xe8\xcf\xed\xc5\xd2\x00\x6f\x1c\x89\xdd\x16\xe0\x3f\x2a\xb2\xc4\xa0\x83\x28\x8a\x99\x05\x2d\xa0\x62\x6a\x72\xb8\xd6\xbe\x37\x65\x44\xee\x62\x56\xa7\x2e\x40\xf9\x61\x74\xb1\xcb\xf2\x8b\xda\x0c\xbc\xd5\x16\xbc\x29\x92\xe9\x3a\x63\x33\x80\x95\x90\xe3\x0c\xa8\xdd\x60\x99\x97\x1e\xf6\xe8\x81\x5c\xb1\xeb\x9b\x1b\xf7\x1f\xc6\xd8\xa3\x95\xf2\xa7\xaf\xc2\xee\x9f\x8e\x5d\x3e\xf7\xef\x4f\x8f\xcd\x16\xcb\xc3\x03\x21\xd3\x7f\x0e\xc4\x47\xd1\x6a\x81\x51\xdd\xd4\x97\x48\x75\xce\x73\x9d\x96\xac\x60\x48\xe5\xd0\xad\xf7\x78\xc2\xa3\x4c\xe4\xba\x14\xca\xab\x36\xef\x76\x45\x94\xd6\xc8\xf6\x40\x17\x2b\xf4\xf8\xa4\xa2\xcb\x41\xaa\x68\x38\xc5\xb4\xee\xcd\x52\x2e\x93\x02\x61\xd5\x89\xbd\xb0\x3d\x54\x95\xba\xcd\x38\xdd\xcb\x27\x67\x8f\x1e\x3d\x7a\x33\xba\x33\x08\xa4\x3e\x88\xbc\x73\xab\xb3\x75\xc6\xb6\x71\xb8\x79\x8b\x3d\x82\x17\x97\xaa\xc6\xc3\x1f\x3c\xa2\xa1\x76\xbe\xe2\xb0\xc7\x29\xdb\xc7\xa9\x84\x37\xc4\x92\x48\x02\x60\x12\x82\xa8\x8a\x3f\x74\x14\x03\xf2\xaf\x39\x8b\x03\xd1\x14\x26\x0a\x9d\x39\x45\x52\x60\xcb\xb2\x5a\x3d\x08\x70\x07\xa0\x57\x39\xcc\x34\x07\x41\x2e\x53\xd5\x61\xab\x8d\x32\x6a\x68\x14\xd2\x1e\xce\xff\xa0\x75\x06\x30\xf0\xd2\x18\x7d\xde\xf2\x8a\xa8\x6c\x2f\x69\x3b\x4e\x32\x01\xf8\x91\xf9\xf0\xda\x14\xdc\x57\xb0\x47\x0f\x14\xe8\xbe\xf4\x8a\xcb\x5f\xe3\x9f\x64\x73\x65\x0d\x5c\x3e\x39\xeb\xc1\xaa\xa0\x38\xf1\x26\x09\x9a\x4c\xab\x04\xb0\x90\xc8\x92\xaa\x8f\x19\x54\x6e\x8b\x07\xb8\x1c\x0b\xeb\x5c\xc4\x91\xe1\x7a\xa4\xf5\x20\x29\xeb\x31\x00\xa5\xa8\x6f\x10\x70\x81\x56\xa6\x5c\xd6\x18\xa5\x45\x70\x86\x60\x43\x40\x5d\x18\x56\x3f\x9e\x4a\xba\x69\xf2\x4a\x74\xa1\x8b\xdc\xbc\xb8\xb9\x94\xd1\x6e\x2a\x67\x47\xda\x08\xc8\x4e\x22\xa7\x52\x7f\x1a\xe2\x19\x00\x1a\x0b\x30\xe7\xf2\x46\x5b\xd5\x26\xa5\xf2\xf4\xa0\x14\x35\xce\x99\xaa\x17\x47\x04\xbf\x68\x18\x4a\x94\xcd\x07\xef\x38\xde\x4c\x0a\x4d\x50\xe7\x62\xf1\xc5\x3c\x11\x34\x13\x9d\xb4\x6a\x0d\xd3\x5a\x18\x37\xce\xcb\xb1\x3e\xab\xaa\x29\x5d\x69\x14\x00\xa7\x8f\x77\x03\x9f\x19\x1d\x30\x71\xa2\x24\x4e\xab\x97\xc0\xc9\x15\x44\xa4\x44\x20\x1b\x89\x71\xb9\x0f\x32\xed\x25\x51\x4b\xd5\x2b\xfa\x22\xe8\x05\x35\xca\x90\x5c\xa3\x2f\x1d\x72\x98\x0a\xb8\xfd\x1c\x51\x29\x30\x22\x4d\x99\x05\x00\xc8\x01\x02\xcf\x73\x23\x6b\x10\x79\x47\x0f\xa9\xfd\x8b\xb3\x6c\x61\xa7\xcb\xf9\xc9\x90\x51\x03\xc3\x60\x8d\xf5\xa5\xf6\x31\x24\xd3\xa0\x81\x4d\x29\x4a\x2a\x28\x4a\x5f\xd8\xba\x71\xb3\xee\xcd\xd0\xcc\xf2\xcc\xa8\x14\xf5\x01\xab\x52\x59\x97\xc7\xbd\x36\x4f\x9a\x65\x95\x4c\xad\x2c\x9c\xba\x63\xe1\xf4\xe9\xe9\x81\xea\x50\x75\x85\x5a\x1a\xa1\xe0\x51\xaf\x5b\x35\xed\xbd\xb2\xef\x5a\xb0\xcc\x2c\x2d\x40\xd8\x2b\xfc\x00\xa2\x1b\xbd\x17\x0a\x5c\x13\x88\xd2\x61\xe3\xdb\xd7\x4a\x39\xa6\x08\x1f\x0d\xfa\x8c\x5e\xae\x34\x11\xb0\x46\xaa\x5e\x2f\xca\x82\x10\xdd\xca\x3a\x1f\x3d\x06\x8f\x19\x19\x5e\x60\x16\xc1\x44\x0a\x36\xb1\x1c\xfe\x3a\x2b\x6c\xb4\x82\xcc\x44\xb5\x95\xce\xa1\x6a\xc9\x66\xb7\xcd\xd4\x96\xe6\xab\x85\xc0\xf0\x33\x68\x7b\x42\xc4\x3a\xa9\x1e\xa9\x93\xe9\x15\xfb\xd8\xd5\x6a\x60\x54\x40\xe8\xbf\x8e\xfb\xff\x38\x0e\xae\x1d\x2e\xd5\x3a\xdc\x8d\xb0\xc0\x0a\xde\xa9\x3c\x5e\xd3\x44\xd8\x32\x4e\xa8\xa2\x71\xd2\x48\x62\x2e\x60\xf7\x8b\x48\x5b\x23\xc0\x02\x81\xe6\xd5\x26\x9e\x3a\xea\x73\xe0\x35\xef\x66\x41\x47\x5e\xdf\x20\xf9\x1c\xc3\x38\x1a\xfd\x2a\x7d\x40\x61\x46\x10\xdb\xaf\x14\xcc\x4d\x30\x6b\xe6\x58\xce\xc0\x83\xa0\x17\x43\xac\x29\xfb\xf5\x45\xd0\xd0\x4e\x20\xc8\x40\xaa\x41\x1e\x12\x1d\x90\xd5\x95\xa7\x6a\x70\x14\x81\x80\x68\x7a\xbd\xa8\x13\x37\x51\x57\x37\xd9\x04\x8c\x44\xcd\x3e\xac\x73\x75\x86\x22\x1e\x01\x1a\xbc\x61\x5f\x34\x7a\x21\x4f\x46\xb7\x6c\x7b\x6a\x0e\x46\xba\x28\x2b\x5c\x46\x3a\x7d\xde\x68\x63\x1a\x64\xfb\x1f\xf6\xd5\x66\x4c\x54\x8d\x4c\x2e\x35\x1e\x35\x6b\x10\x94\x99\x0e\xa8\xc7\xbf\x5c\x61\x63\xbd\xa0\xe9\xbe\xb3\xe2\xbf\xa1\x72\x6e\x61\x4e\x19\xfd\xe8\x9a\x21\x85\x5f\xa0\x12\x60\xe0\x6e\x6e\x66\xa4\x98\x56\x2e\x0c\xc9\xe8\x77\xd1\x1e\x6b\xdc\x9c\xec\x23\x5e\x0a\xc1\x1e\xb0\x21\xc8\xbd\xa9\xad\xb2\xe0\x74\xd5\xb3\x61\x1c\xea\x4a\x21\xcb\x62\xb5\xea\xe2\xc8\x5b\x3a\xb7\x6a\x2a\xb8\xdb\x9b\xa8\xdd\xd8\x6e\x7b\x81\x1d\xe8\xff\x1b\x15\x76\x05\xd8\xbb\xb0\x05\xee\x7f\xaf\xf8\xaf\xac\xcc\xe4\x0f\xc8\x16\xd0\x8b\xd2\x2c\xe9\xc1\x54\x35\xc1\x2b\xab\x0e\xdb\x2e\x00\x6d\xe7\x17\x68\x23\x73\x82\x67\x66\xc8\xc1\x5a\x3f\x77\xf2\x64\x31\x64\xe9\xc6\xf8\x2d\x79\xdb\x88\x70\x83\x27\x6b\x41\x96\xf0\xa4\x6f\x60\x5b\xc2\x26\x50\x9e\x15\x08\xe7\xc4\x40\xdc\xc8\x0c\x0b\x06\x19\x03\x0c\x90\x20\x17\x60\x57\xf5\x21\x5b\x44\x7b\x2b\x76\x38\x6e\xc6\xb8\x8c\xf2\x3a\xbc\xd2\x61\x2c\x37\xf2\xbb\xf7\x6b\xb5\x3c\x9a\xf1\x52\x29\xa6\xe5\x69\x46\x71\xbe\xd6\x75\xca\x60\xc5\xb1\x9d\x04\x99\x81\xe0\x0c\x49\x4c\xdb\x32\xc2\x59\x8a\xf4\xfd\xe3\xec\x51\x64\x48\x85\x28\x8e\xd4\xfd\xa7\x31\xff\xf5\x63\x67\xcc\x47\x72\xfa\x52\x4f\x9e\xb0\xad\x30\xde\xac\x05\x68\x2d\xd0\xe9\xda\x4a\x10\x81\x30\x21\xe2\x30\x4d\x0c\x65\x18\x69\xd1\x9f\x4b\xa5\xe4\x56\xb3\x4e\x9c\x66\x44\x53\xa6\x25\x7e\x3b\xee\xa5\xe2\xbc\x10\x5d\x4d\xe3\x89\xae\xeb\x7c\xb7\xe1\x7c\x46\xd7\x66\x5e\x44\xd7\x45\xd2\xe1\x72\x86\x1b\x0b\xca\x69\x46\xd7\xac\x8e\x0c\xa5\x51\x5f\x9b\x82\x12\x5b\xb5\x8c\xc8\xfa\x21\x69\x75\x39\xb6\xbb\x9e\x0a\xde\xed\x86\x7d\xaf\xcb\xb3\x36\xc0\x33\x78\x7e\x23\xa8\x35\x9a\xbe\xc2\x8c\x30\x47\x03\x2e\x3a\x9b\xbc\xaf\x55\xab\x3c\xd5\x5d\xe1\x5d\xa8\xc6\xc1\x49\x54\x58\x98\xb9\x6e\x60\xd9\x91\x17\xd8\x29\x36\x7f\x19\xd7\x1d\x6b\x6e\xe7\xa3\x2c\xe9\xb3\x97\x4c\x96\x66\x01\xcc\x89\x6e\x18\xf7\x3b\x22\x42\x94\xe0\x2f\x4d\xf8\x53\xf6\x23\x1b\x86\x30\xff\x6d\x08\x40\xf0\xef\xed\xdf\xcb\x0e\xd9\x2d\x2c\x6c\x5b\xc1\xc2\x3e\xcb\xff\x9e\x05\x45\x72\x9d\x19\xe8\x7c\xe6\x2c\x6c\x3f\xe9\x69\x70\xca\xf7\xf2\xe2\x76\x91\x17\xb7\x66\xe4\xc5\xdd\xb5\x3b\x24\xe7\x6f\x1f\x82\xe4\x7c\xc9\x79\xea\xd6\x79\x42\xd7\xbb\x47\x6b\xe5\xa0\xbd\xd6\x3e\x2e\x66\x05\x7d\x6c\x92\x1d\x1d\xc1\x03\x55\x4a\x01\xd5\x15\x0d\xf7\x35\x93\xfe\x5b\x9c\x21\x3f\xe2\xe2\xc1\xf0\xd5\xae\x79\x82\x71\x78\x31\x47\x5e\xb4\xb8\x3c\x0d\xfc\xce\x19\xb3\x15\x33\x79\x52\xba\xdc\xa9\x06\xa8\xe8\xb0\xd7\x94\xc2\x9a\x0a\x3b\xcb\xfa\x2f\xf7\xb3\x45\xb6\x1f\xc1\x20\xdd\x39\x7f\xea\x14\xc2\x42\x9a\x81\x86\xa9\xd7\x8f\x7b\xd7\x26\x88\x7c\x4b\x11\x2a\xa3\x68\xb4\x1e\x70\xd8\xb7\x19\x58\x9f\x79\x23\xdc\x97\x3b\x23\xe0\x3c\x07\x86\x79\xb1\xac\x0c\xff\x4c\xe9\x63\x23\x8d\xa2\x88\x96\xc5\x6d\x08\x57\x7b\xbc\x65\x63\xdd\x64\xb0\xa5\xaf\x1a\x45\x29\x39\xd0\xd2\x92\x66\xae\x6c\x35\x21\xa3\x1a\x3c\xac\xb1\xb7\xa1\xee\x7e\xa3\x7f\x1d\x68\xee\xa5\x7c\x9b\xf4\xae\x9c\x27\x79\xbe\x5b\x4e\xad\x77\x3a\x6c\x5c\x3e\x74\xdf\xe2\xf8\xaf\x76\xce\xa5\x42\xc7\xb4\x83\xf1\xa5\x64\x9a\xe5\xd5\xbd\x1f\xf7\x74\x2c\xb3\x2f\x3f\xf2\x35\x3d\xba\x8f\xcb\x45\xc1\x88\x04\x29\x85\x76\x89\xa4\x9b\x08\xba\x17\xf9\x77\x03\x6a\x69\xcb\x83\xfa\x36\x05\x29\xa8\xdc\x00\x13\xe6\x51\x9f\x96\x9a\xd9\xda\x8f\x38\x6c\x9f\xb8\x90\x25\xdc\xfd\x80\xe3\xbf\xcc\x99\x97\xff\xf4\x1a\x71\x82\x21\x4d\x4d\x7d\x84\x41\x37\x17\xa2\x56\x5c\x3f\x25\x32\x78\x6b\x6a\x5a\x0a\x8a\xb6\x69\x3c\x31\x10\x50\x65\xb7\x08\x52\x46\xb1\xcf\x04\x51\xb7\xa7\x23\x25\x0c\x02\xb4\x00\x15\x2c\x82\x31\x52\x6c\x00\x6d\x91\x88\xfa\x03\xce\xe3\xd9\xe3\x86\xef\x02\x53\xf5\xfd\xed\x71\x0b\x13\x7c\x4d\xde\x99\x73\x6e\xd5\x24\x8e\x9e\x12\xaf\x51\x86\xcc\x1b\xc6\xfd\x9b\xad\x27\x45\xb3\x80\xc6\x5e\x50\x59\xfb\xdc\x6b\x24\x71\xe4\x3d\x3b\x5e\xb3\xc3\x19\xff\x68\x8c\xbd\xd9\x61\xfb\x79\x23\x0b\x36\x84\xfb\x5a\xc7\xaf\xe5\x30\xea\x94\x28\x87\x8c\x9c\x58\x60\xd8\xf7\x92\x5e\x14\xc9\x79\x7f\x76\xbc\x66\x9f\x9d\xc7\xd8\x91\x6d\xc4\x86\x16\x22\xf7\xb7\x89\xf3\xf1\x5a\x87\x5d\x13\xf2\x34\x5b\x41\x64\x45\x01\xd9\xfb\xcf\x73\x2e\xdf\x92\x7d\x72\xc1\xd8\x16\xa0\x4a\x6e\x92\x59\x55\x56\x83\xb7\x5b\xf9\xd7\xb3\xe3\x35\xf8\x25\xbf\x9d\x4a\xbd\x9a\x5a\xd1\xac\xb3\x57\x39\x08\x2c\xb0\xa2\x7f\x87\xa6\x3d\xf7\xf2\x5b\x76\x62\x07\x2d\xb3\x5a\xd5\x88\x3b\x5d\xb4\xa8\xb3\x9f\x79\x82\x95\xe2\x60\x20\xb4\x80\xfe\x32\x9b\xff\xbd\x12\xac\xcb\xd9\x5c\x46\x71\x00\xe7\xd3\x5f\x7e\x97\x7f\xfb\xc8\x37\x0a\x98\x14\x06\x78\x59\x0e\xe0\x3d\x41\xff\xbc\xe8\x30\x80\x0d\x85\xf0\x01\x6b\xe5\x5d\x7a\x3c\x7b\xc1\x7e\xb6\x1f\x90\x55\x53\xf7\x1b\xfb\xfc\xf7\xee\xc3\x7f\x6b\xe7\xa0\x41\xd4\x29\x6f\xc9\xf4\x6b\x6e\xf1\xa7\x7b\x02\x40\xcb\x36\x2d\x18\x1a\xc6\x96\x95\xfe\x23\x45\x25\x60\xac\xa1\x7e\x64\x0e\x85\x71\x53\xa2\x42\x8f\x7b\x7e\x33\x58\x0f\x32\x1e\xa2\x4d\x56\x2a\x34\x7e\xd5\xf3\x65\xf5\x22\x6a\x04\xdd\xb6\x48\xa4\x3a\x00\xf4\x9f\x58\xa0\x14\x03\x7e\x59\x85\x25\xf0\x38\xe5\x35\x96\x15\x5e\xda\x0a\x05\x97\x43\x35\xde\x05\xc6\x2b\x65\x0e\x4b\xc4\x71\xe6\xf9\x29\x4e\xd6\xd0\x22\xe4\xcc\x21\xaa\x48\xa7\x13\x64\x58\x1b\x2b\x6f\x82\x7c\xc6\xd7\x13\x21\x74\x9b\x78\xc6\x0b\x6f\x31\xcf\x97\xdd\x83\x3a\xa0\xf8\x24\xd4\xff\x56\x6f\x82\xb1\x0d\xbe\x17\x85\x07\x3c\xea\x43\x11\x66\xbf\x0a\x03\x0b\x35\x00\x04\x6b\xde\x31\xd1\xe1\x41\x68\xb0\x99\xc1\xd0\x1c\xec\xc8\xbd\x23\x5f\x0f\xba\xa9\x68\x78\x42\xe3\x5a\xcb\x9f\xf1\x59\xd6\x8b\x22\x11\xe6\x7f\xcb\x13\x01\x3e\xd1\xf6\x6d\xaa\x21\x6e\xa4\x5d\xb3\xc6\x4e\xd0\x48\xe2\x34\x6e\x65\x5e\xba\xde\x00\x5e\x2f\x91\xa5\x0d\xde\x15\xf0\xf7\xa8\x90\xd3\x6d\x09\xb7\xb7\x3a\x6c\x52\xb6\x05\xa2\x2d\x5f\xe7\xf8\x2f\x72\xd4\x5f\xf6\x4e\x33\x63\x6e\xe0\x24\x46\xe3\x2e\xd9\x16\x21\xae\x7f\xd8\xb6\x2d\xb1\x79\xe4\x58\x4e\x5e\x1c\xe5\x26\x37\x30\xb2\x75\x3a\x3d\x70\x95\x59\x6a\xc1\x87\xf5\x41\xfb\x6b\x8e\xff\x52\x47\xd0\x41\x4b\x0d\xc4\x3f\x6d\x18\xa4\x47\xb0\xa1\x3b\x38\x67\x3f\xeb\x68\x4d\xf6\x93\x52\x63\x20\xed\x55\xf7\x84\x00\x3a\x41\xed\x48\xdb\x41\xf7\x11\x1f\xf2\x5d\x2e\xa7\xff\xe5\x30\x25\x7d\xdd\x2f\x2a\x04\xb0\x07\x1d\xe5\x2f\xcb\x49\xf7\x23\xef\xc2\xf5\x87\x6e\xb6\x04\x38\x2d\x7a\xed\x5c\x53\xd9\x8b\x10\xe6\xeb\xcf\xce\x2f\xaf\x2e\x9c\x5c\x98\x9d\x59\x9d\xf7\x96\xe7\xef\x3c\x37\xbf\xb2\xea\x03\x96\xd8\x1a\x45\x7f\x63\x86\x62\xa2\xe8\x8e\x79\xea\x3d\x65\xe5\xec\xa2\x17\x27\xde\xd3\x66\xce\x9c\x46\x8f\x18\x88\x11\x79\xcd\xd1\x79\x89\x61\x1f\xe0\xff\x6e\x38\xa6\x92\x25\x2f\x03\x08\xec\xe5\x57\x33\xe3\xa0\x71\x9f\x77\xb5\xff\xcf\x57\xe5\x7f\x17\x52\x87\xf3\x23\x04\x5f\xd1\xfe\x62\x48\x39\x0d\xd1\x81\x20\x77\x5b\x9d\x31\x79\xf3\x3b\x88\xfe\x8b\xc4\x14\xf1\x43\xe7\x1d\xfd\x5e\xad\x20\xcc\x70\x9a\x8d\x60\xa2\x1e\x11\xb8\xfa\xf2\x84\xab\xe7\xcd\xbb\x75\x71\xe6\xcc\xbc\x8f\x2f\xa9\x8c\xd2\x3a\x63\x77\x8b\x30\xac\x01\x10\x92\x19\x06\x88\x9f\x29\x89\x7f\xb8\x8e\x18\x80\xb9\xe1\x15\x91\x39\x55\x98\x5b\x0d\xa5\xa9\x7f\x5c\x71\x8e\x97\x9e\x83\x25\x11\xec\x26\x17\x80\xfc\xdb\x2e\xb6\xce\x3c\xcf\x3a\xf1\x10\x60\x0d\x9a\x86\xc6\x65\x41\x22\x3d\xae\x41\x88\xf6\x06\xee\x02\x28\x25\xb7\x20\xd6\xd0\xf2\x99\x54\x55\xed\x74\x96\xd3\x7e\xf1\x1b\x69\xa2\xc4\xb0\x19\x6d\x1a\x44\xc3\x0a\xaa\x33\xef\xc8\xf6\x46\xa4\x46\xa8\xf6\xdb\x18\x19\x8d\x7f\x0f\xf8\xa9\xbb\x1a\x1a\xea\xe6\xc0\xb8\xa8\xde\xe2\xb3\xed\xf7\xb7\x4a\x09\x06\x0f\xd5\xe0\x1d\x2d\x1d\xbc\x50\x64\x35\x52\x67\x7c\x35\x5a\xe5\xea\x4d\xd9\x70\xc1\xb0\x80\x4a\xa4\x0c\x56\x1a\x9b\xd2\x1e\x39\xe8\x47\x23\x8e\x22\x0a\xad\x41\xdc\xdc\xb0\xff\x90\x2f\xb6\x87\x74\xcc\x18\x18\xcf\x34\x58\x5a\x22\x4c\x74\x93\x2c\xc7\x57\xb8\x29\x77\x8b\xe8\x7c\xc5\x83\x78\x73\xaf\xc9\x15\x15\xc1\xff\xde\x77\xd0\x18\xd0\x1a\xb5\xa5\xa6\x24\xcf\xc1\x27\x1a\x72\x90\x04\x01\x63\xb3\xbd\x34\x8b\x3b\x5e\x2e\x4f\x50\x04\xa9\xb0\x4c\x23\xd6\x0e\xac\xee\x38\x6e\x64\x44\x46\x11\xb2\x0a\xf0\x8c\xcd\x20\xc5\xd3\x1b\x4c\x5c\x80\xa7\x04\xcf\xa7\x34\x44\x24\x81\x23\xeb\x17\xe5\x5d\x43\x6e\xb8\x25\x91\x74\x82\x0c\x04\x2a\xd1\xa1\x1c\x27\x42\x6c\x62\xcc\x24\xef\x7b\x33\x48\x95\xe7\x4e\x91\x21\x59\xee\x77\x58\x80\x8a\x54\xa4\x8a\xf9\x59\x18\xaa\x88\x49\xf1\x6b\x41\xb3\x29\xe8\xd8\xca\x71\x9d\xd5\x45\x40\x1d\x5a\x53\x98\xd7\x07\x70\xac\x84\xda\x4e\xb5\xcd\x84\x19\x8e\x0f\x4c\x93\x62\x93\xa6\x20\x25\x4c\x4d\x4d\x84\xec\x1b\x42\x12\x82\x9f\x9a\xda\x8b\x7a\xf6\xf4\x56\xdd\xd2\xad\x2a\x76\xec\xd8\x76\x3a\x66\x5c\x73\x0e\x62\x51\x4d\x72\x11\xe2\xd3\x3a\xf3\xae\xaf\x7b\xf3\x17\xba\x01\xfa\xb7\xcc\xc5\xe2\x85\x41\x4b\x48\x4d\xf6\xb8\xee\x35\xa2\x01\xb4\x82\x0b\x86\xa7\x8b\x0e\x3c\x9d\xdf\x42\x21\x4a\x60\xd1\x68\x76\x82\xa8\xce\xbc\x1b\xe0\x24\x87\x12\x80\xb1\x29\x2b\x9c\x7c\x33\xf6\xa6\x37\xc6\xd2\xd2\x17\x7f\xd2\x41\x3b\xd4\x2b\x1c\xff\x7e\xa7\x17\x34\x6d\x65\x56\x3e\xf8\xe6\xe9\xb2\x3f\x76\x35\x7b\x7c\x69\x6a\x30\x09\x28\xf7\x8b\x57\xf9\xff\x5a\xd1\x7f\x96\x31\x3d\x6a\x61\x46\xe6\x21\x79\xf9\xee\x08\xb2\xc6\xf3\x46\xd6\x93\x77\x2f\xcc\xcf\x92\x53\x06\x01\x4c\xc7\x99\x07\x61\xb0\xc7\x3d\xbf\xd3\x4f\x37\x1a\xf2\xf6\xe1\xad\xf4\xd6\x52\x21\x77\xcc\x33\x98\xe7\x79\xde\x73\xe0\x7f\x3d\x6f\x06\x19\x80\x85\xfc\xe1\x39\x7e\xd0\xf5\x8f\x7b\xfe\xe1\x43\x75\xf9\xff\xeb\x87\xfd\xe7\x56\x3d\xfb\xe1\x91\xfa\x11\xff\xb9\xcf\xac\xd2\xc7\x4b\x71\x92\xe1\x87\x52\x8d\x91\x6f\x71\x79\x6f\xe9\xc6\x89\x3c\xf0\x6e\xba\xe1\xc6\xeb\xa1\x00\xf5\xe3\x9a\xf1\xe3\xd1\x43\x37\x3f\xf7\x99\x50\xcc\x73\xab\xdb\x6c\xd0\xd1\xfa\xd1\x6d\xd7\x7d\xf3\xd1\xa1\x35\xdf\x78\x83\x51\xf1\x33\x6d\xe6\xaf\x2b\xd8\x2f\x8c\xb3\x89\x14\x87\xca\x7d\xcb\xb8\xff\xe7\x63\x86\x0b\x91\x87\xa1\x31\x1f\x79\xac\x02\x39\xbe\xc2\xd0\xa3\x2f\xeb\x79\x2f\x60\xdd\x76\x43\xde\x00\xf5\x56\x1e\x37\xf8\xca\x00\xad\x95\xb7\xb0\x04\x05\xf6\x31\x99\x14\x78\x96\x82\x68\x5d\x8a\x77\x22\x69\x06\x77\x7d\xa7\x17\x66\x41\x37\x14\x80\x41\x9e\x56\x31\xb7\x2d\x6e\x19\x28\xcc\x88\xb5\xc5\x09\xb4\xde\xfe\x4d\xee\xb2\x29\x95\xf8\x0a\x95\x35\xe4\x3b\x60\x98\x34\x92\x1e\x74\xfc\xd9\xb4\x0a\x63\x4b\x81\x58\x9a\x20\x75\xa9\x3d\x98\x15\xdf\x0c\xd2\x6e\xc8\xfb\xa8\xbd\xe7\x65\xa8\x6e\xaa\x7c\xd3\xfc\x17\x68\x78\xdd\x5b\x8c\x8d\x8e\x85\xa1\xc7\xbb\x5d\xc1\xe1\x0c\x04\x2a\x29\x63\x00\xc1\xa7\x90\x01\x3a\x59\xfe\x54\x91\x04\x4a\xb5\x1b\xeb\xaa\x7b\x2b\xb2\x42\x39\x13\xd6\xb7\x50\x1f\x6d\xfc\xb8\xd3\x4d\x82\x54\x10\x29\x45\xd0\xb0\xef\x41\x47\xd9\x61\x76\x70\x4b\xd3\xa2\xda\xae\xb8\xa1\xf6\xbc\xa8\x7b\x6c\xcc\x7b\x6c\xcc\x0f\x2d\x1b\xf3\x9d\x5b\x3b\x53\xeb\x6e\xb5\x46\xee\x53\x7d\x7c\x16\x3c\xa7\x9a\x21\xd5\xf7\x19\x7b\xef\x01\x76\x9d\xb1\x97\xd3\x2c\x4e\xf8\x3a\x6c\x67\xe4\x9c\x9f\xc9\x32\xde\x68\xeb\xf0\x8a\x1f\x3b\xe0\xcf\x94\xfd\x50\x76\x42\x17\xdf\xd3\xc1\x4b\xa5\x71\x17\x1f\x9a\x60\x1b\x2a\x6c\xa0\xe3\x7f\x5f\x69\xd8\x40\xb1\xc4\x74\xfb\xbc\x77\x23\x3a\xb6\xb7\xd1\x76\xb1\xd1\x7e\xd7\xdc\x68\x1f\xdc\x25\x21\xf4\x0f\x95\x87\x11\xec\xf1\x41\xff\x3b\x39\xb2\x2e\x39\xed\xad\x25\xd4\xbc\x3b\xab\xc3\x3d\xd4\xae\x2c\x60\xc1\x96\x49\x98\x62\xf8\xc7\x57\x2a\xec\xce\x7c\x75\xe5\xb7\x51\xc3\x12\x64\x92\xe2\xe4\x2f\x80\x07\x0e\xae\xec\xca\xf9\x7f\x97\xce\x7c\x74\x2f\x56\xfc\x33\xc3\x7e\xb4\x03\xc9\x8c\x74\x49\xf4\x62\xd3\xed\xcc\xfa\x38\xb5\xbd\xbd\x1f\x70\xd8\xaf\x3a\xec\xea\xb8\x2b\x22\xb9\xac\x8e\xae\xc0\x64\xbb\x6f\x73\x86\xb0\xfc\xec\xbc\x63\x4f\x59\x39\xbb\x88\xa5\x2e\x25\x71\x37\xf5\xef\x28\xd4\xa5\x24\xea\x59\x7c\xec\x6d\x1c\xd5\x64\xd0\xc8\x4e\x29\xfb\x60\x74\x0d\xf4\xc4\xa4\x27\xaf\x7f\x75\xf6\xea\x6f\x67\x33\x3b\xe7\x1f\x2a\x92\xa8\x7d\xfc\x3f\x34\x89\xda\x57\x1e\xf3\x1f\x8e\x90\xea\xab\x06\x21\xd5\x97\x2b\xec\xce\xdd\x12\x52\xed\x71\x51\xed\x71\x51\xed\x71\x51\xed\x71\x51\xed\x71\x51\xed\x71\x51\x7d\xab\x71\x51\xed\x11\xa0\xee\x11\xa0\xfe\x7b\x23\x40\x7d\xfd\x04\xbb\x7e\xa7\x81\xf0\x18\xc7\xfa\xb9\xfd\xfe\x77\x0c\xfd\xf5\xa2\x33\x41\x6e\x25\x4b\xc1\x7d\x60\x3f\x6b\x30\xf5\x8b\xfb\x54\xff\x29\x33\x74\x08\x98\x58\xb2\x40\x27\x85\x18\xbf\xe0\x8c\x01\x59\xab\x92\xdb\xb4\xe3\xaf\xc5\x43\x79\xac\xca\x65\xba\x19\x00\xf2\x91\xa1\x75\x3e\xbf\xc2\xf6\x37\x45\x14\x88\xa6\xfb\x75\xc7\xff\xb2\x33\x07\xff\x96\xb5\xa8\x73\x64\x74\x2d\xf8\x6d\x35\x2f\x1e\xab\x03\xb1\x04\x86\x74\x9e\xb7\x1b\x1b\x02\x9c\x32\xba\x96\x16\x52\x61\x69\x3a\x1a\x23\xde\x18\x93\x9f\xbd\xb8\x1b\x44\x94\x4d\xab\xd9\xa9\xe3\xfc\x3d\xa3\x55\x75\x8f\x5a\x6f\x24\xf4\x67\xd4\x76\x63\xf8\x00\xb8\xcb\x1a\x84\xcf\x55\xd8\xd5\x42\xee\x3d\x98\xcc\xf9\x24\x89\x13\xf7\x77\x2b\xfe\x07\x2a\xf3\xf6\x43\x05\x5b\x4a\x90\x34\x2a\x6b\x0b\xfc\x1c\x02\x5e\x88\x1b\x10\x42\xdc\xf4\x9a\xbd\x44\x59\xb0\xac\x95\xe2\x35\xda\xa2\x71\x5e\xa5\x8c\xca\x8b\x7e\x22\xc2\xbe\xd7\x8d\x53\x84\x5b\x00\x70\xa4\x0c\x20\xcb\xa0\x40\x74\xc4\xea\xeb\x94\xd4\x11\x83\xa8\x27\x8c\x94\x66\xbb\xf8\x54\x91\x08\x78\x69\x37\xc8\x48\x47\x44\x78\x01\xc5\xb1\x57\xf5\x96\x4f\xcc\xcc\x2a\x95\x0c\xa0\x41\x21\x5e\x27\x89\x43\x42\xc1\x13\x11\xdc\xe5\xe4\x03\x74\x20\x61\xc6\x3c\x59\x5c\xb0\x4d\x00\xb8\x03\xb8\x85\x00\xda\x33\x10\x73\x6f\x39\x22\x9f\xa9\xe9\xc2\x56\xfc\x93\x04\xf3\x63\x2d\x31\x18\x0f\x1d\xbd\xb4\xd9\xee\xc3\xfd\x04\x1d\xdd\x9b\x3c\x87\x26\x89\x13\x5a\x3b\x56\xf1\xcf\x1b\x67\xc7\x2f\x1f\x56\xdd\xfd\xd0\x98\xbf\x36\xe2\x77\x23\xfa\x0f\xc7\xc5\xbc\x3d\x4b\x71\x29\x32\xb8\xf6\x52\xce\x6c\x9f\x46\x81\x4e\x93\xed\x40\x9a\xff\xcf\x0a\xbb\xc1\x32\x89\x4d\xf9\xdf\x69\xea\xfb\x05\x8a\x78\xb3\xeb\xaf\x77\xc8\xa8\xfa\x32\xc7\x7f\x9e\x03\x46\xd5\xc2\xdb\xb7\x3c\x82\x26\x4b\xeb\xfe\x13\x12\xb2\x66\xd3\xbf\xbb\x8c\xe8\x7e\xa0\x5d\xbb\x03\x94\xfc\xca\x35\xec\xd8\xe5\x04\x83\xbb\xef\xbb\xc6\x7f\x70\xdf\xd0\x9f\x35\x58\x00\x61\x7a\x41\xaa\x46\xa3\xcd\xa3\x20\xed\x00\x04\xea\x9a\x5c\x1a\x03\x21\x86\x29\x80\x6e\x80\x81\x99\xf2\x76\x47\xc4\x1f\xa2\xe6\xdb\xe6\xa0\xdb\x05\x99\xc7\xd3\x7e\xd4\x68\x27\x71\x14\xf7\xd2\xb0\xef\xe9\x60\x1f\x0c\xdf\x4b\x7b\x80\x00\x71\x87\x15\x7f\xa4\x6e\x88\xba\x45\x18\xf1\x52\x1a\xec\xb5\x55\x68\x97\x37\xa5\xb1\x0f\x77\x14\x62\x66\x84\xe6\x4c\x63\xc0\x4c\x69\xf4\x94\x8a\x1c\xcf\x3d\xd9\xdb\x8b\x8f\x1a\xdd\x2c\x2b\x78\xcb\x6a\x08\x5b\x55\x83\x53\x88\xfd\xd3\xa1\xa2\x8f\xc0\x20\x59\x6d\xc2\x54\x62\xbd\x76\xec\xd1\x49\xe2\x8e\xd7\xc0\x50\xa7\x28\x8e\x6a\x83\x21\x91\x52\x90\x48\x85\xd2\x92\x20\xff\x7a\x60\xcf\xaa\xbe\xe7\x08\xfe\xe6\xf9\xa7\xee\x30\xdc\x53\xb7\xef\xd2\x0d\xcc\xde\x59\x61\xb0\xc2\xdd\xb7\x54\xd8\xc9\xe1\xf1\x10\x3b\x49\xf7\xf1\xff\xc4\x49\xb7\x93\xd3\xa3\x63\xa4\x75\x40\x95\x02\x24\xa2\x68\x2b\xb2\x80\x1b\x8a\x4e\xd5\xd8\xda\x0a\xa0\x00\x62\xdb\x28\xe3\x5f\x99\xbe\x44\x66\x46\x6d\xd5\xbd\xb3\xa0\xca\xd2\x4b\x48\x5c\x95\x04\x14\xd3\x69\xec\x7a\x8a\xe2\xd4\xf0\xb2\x0a\xf8\xa5\x8f\x38\x08\x75\xd0\xe0\x89\x80\xf6\xeb\xce\x08\xb2\x99\xed\x8f\x17\x72\xf3\x3e\xe0\x90\x2e\x59\xea\x35\x40\x7d\x4f\x2b\xe4\x46\x5c\xa2\xdc\x33\xea\xc4\xd2\xea\x9a\x81\xc2\x68\x0c\xba\x1d\x96\xaa\x82\xf6\x14\x42\x3c\x0f\xc2\x5e\x62\x90\xe8\x9a\x50\x90\x14\xde\x49\xef\xd4\x2f\x39\xc9\xd6\x1e\xb1\xb3\xee\x19\xe5\xb3\x1f\xda\xf7\x61\x3e\x7c\x6b\xf0\xc8\x8d\xc6\x5e\x70\xb5\xa5\x76\xee\x70\x80\xdd\x0f\x5f\xe5\xbf\xd4\xd9\xe2\xa5\x7c\xf0\xf5\x30\xe4\xe0\xb2\x4a\x61\xd6\xe3\x7d\x10\x07\xfb\xa0\x1c\x16\xc2\x01\xc9\xc9\x88\xad\x15\x3e\x24\xa3\xcc\x3a\x53\xde\xf6\x28\xf6\x5f\xaf\x60\x57\x18\xbf\xbb\x97\x18\x99\xb7\x7e\x83\xd9\xf3\xe8\x75\x75\xb0\x22\xda\x30\xa3\x92\xe2\xed\x89\xa6\x8d\xc5\x23\x6f\x46\x2d\x17\x63\xaa\x53\x75\xdb\x28\x03\xce\xdb\x08\x38\x14\x74\x90\x7a\x68\x12\x90\x23\xf6\x9b\x6e\x4e\xb5\x00\x73\x9a\x07\x4a\x12\x06\xaa\x18\x99\x19\x02\x58\x6b\xb4\x80\x8d\xe6\xc9\x21\xed\x77\x85\xe7\xe3\x85\xd3\xa7\x4c\x0f\x0d\x9e\xaa\x6b\x4c\x44\x07\x6f\x0e\x88\x6d\x47\x35\xe6\x61\xf2\x72\x5b\xc3\x40\x15\x5b\x32\xa4\xbe\x93\x30\xb3\xdb\xad\x8f\xb2\xe7\x08\x6d\x16\xad\x06\x10\xd0\x41\xda\xa1\xd1\x71\x72\xed\xc0\x62\xc3\x6c\x7b\x22\xc9\xd2\x89\x2f\x29\xea\x74\x33\x61\x68\x3c\xcb\xd9\x46\x50\x15\x32\x72\x67\x7c\xa4\xfb\xaa\xea\x52\xa3\x98\x60\x53\xd3\x7c\x0d\x2a\x93\x28\xc4\x05\x78\x3a\x31\x9f\x7b\x27\xe6\x97\x35\xa9\xd8\xcc\xca\x62\xfd\xb0\xb9\x67\x3d\x8d\x2c\xe4\xf1\xd4\xa0\xc1\x92\xb7\x5e\x0a\x8c\x39\x06\x70\x01\x27\x67\xaf\x3f\x72\xd3\x21\x0c\xb8\x5e\x8c\xa3\x9a\x6c\xb8\x4a\x0e\x04\x18\x7e\x0c\xfa\xd3\x60\xa2\x06\x7a\xa1\xdd\x15\xa3\xc7\x74\x40\xf4\x22\x65\xa6\x6d\x56\x99\x07\x0a\x23\x60\xfa\x23\xed\x5e\x37\xe4\x11\xcf\xe2\xa4\xef\x65\xe2\x42\x36\xb4\x95\xd7\xd7\x8f\x50\x3b\x6f\x3c\x76\xc3\x4d\xb8\x24\x6d\x04\x71\x5d\xb1\xb1\x25\xf2\xe1\xcb\x45\x7d\x61\x97\xcb\xdd\x6f\x67\xdf\x78\xcd\x58\x20\xaa\x94\x16\x1b\xda\x66\x83\x7e\x15\xb2\xeb\xab\xca\xca\x45\x04\xd6\x0d\x11\x8f\xf7\xf6\xe4\x30\xd2\xa8\xe4\xa0\x4a\x06\x0a\x18\x68\x7e\x1d\xd1\x04\xde\x02\x3b\x9a\x1a\x1c\xde\x06\xe2\xaa\xbc\x11\xb4\x79\xd4\x4c\xdb\xfc\x3c\xc0\x8f\xad\x0e\x9c\x15\x66\x9a\x96\x1c\x16\x3c\x8c\xea\x8c\x3d\x54\x09\x59\x55\x2f\x8d\xe5\xfd\x8b\xd0\xc2\xa4\xe4\x3c\xce\x20\x54\x17\xdf\x9b\x82\x7f\xd7\xe4\xff\x3b\x31\x7f\x6a\x61\xd1\x33\x96\x08\x3c\x85\xdf\xeb\xf5\x7a\xfe\xde\xfc\xe2\x5c\xf9\x5b\xd3\x3b\xb7\xbc\xbf\xa6\xc2\x58\x7e\x0a\xb8\x2f\xac\xf8\xcf\x30\x0e\x05\x4e\x38\xc4\xa4\x7b\x6b\x08\x8d\x3b\x20\xb3\xca\x7c\x31\x11\x9e\xaf\x44\xae\x5f\xd5\x32\x0c\x67\x56\x49\x18\x2b\x30\xf5\x2c\x3b\xc3\xee\xd8\xbd\x62\xa1\xd9\xf7\x2f\x39\xd7\xb2\xc7\x0d\x76\xb8\xc3\xbb\xb5\xf3\xa2\x9f\xca\x4e\xd7\x40\xe0\xb1\x4b\x8e\x37\x74\x68\xf6\xbb\xe3\x1d\xde\x65\xec\xf3\xe3\xec\xda\xad\x98\xee\x4e\xf0\xc6\x79\x11\x35\xdd\x5f\x19\xf7\xe7\xec\x47\x06\xf6\x84\x1d\x5f\x8d\xe8\x13\xc8\x4d\xa8\x3c\xe3\x2a\x9e\xd7\x3e\x28\xff\x6a\x8c\xbd\x0b\xc8\x7b\xf1\x08\x72\xdf\x5a\x61\xc7\xb7\x0c\xe3\x5d\xed\x77\x45\xf3\x74\xdc\xe0\x61\x91\xe5\xef\x0b\xce\xb2\x01\x20\xc9\x23\x4f\xbf\x00\x52\x86\x5c\x76\x86\x8a\x98\xe3\x4d\xe6\x30\xe6\x16\x6b\x9d\xcd\xf3\x09\xc7\x90\x89\x51\x69\x38\x8f\xf2\xc0\xe4\x45\x85\x4c\xaf\x1e\x2c\xc5\x09\x45\x00\x90\x2e\x6a\x65\xdc\x28\xda\xe1\x4e\x2f\xeb\xc1\xd6\x12\x17\x1a\x61\x2f\x0d\x36\x40\xf3\xcd\x43\x28\x7c\x0a\x0f\xf0\xeb\xec\x41\x27\x0f\x78\x78\xd3\x28\x88\x91\xd2\x19\xa5\x72\x68\x16\xfd\x7b\x54\xd8\x81\x8e\x6a\x90\xad\x51\x0f\x81\x67\x93\x5e\xdd\x51\x6b\xd5\x4c\xf8\x75\xf6\xd7\x15\x56\xc4\x3d\x21\xf3\x00\x39\x00\x56\xe3\xf3\x22\xb2\x55\xbc\xf7\x54\xfc\x63\x83\x8f\x95\x74\xa5\xb0\x76\x70\x99\x67\xf2\x2d\x03\x59\x60\x1f\x3c\xb8\xe8\xfc\x27\xa1\xd3\x60\x34\x86\xad\xb5\xf8\x3e\xe9\xb0\xd7\x3a\xac\xec\x35\xf7\x87\x2f\x1f\x9e\x61\x6e\x7e\xb0\x3c\x4d\x4f\x17\xa0\x31\x2f\xaf\x32\x3f\x7c\x34\xe2\xfe\x79\x11\xd5\xd9\x8d\x0c\xbb\xe1\xd6\xfd\xef\x81\x61\xd0\x9c\xbf\x04\x0f\x29\x78\x02\xe6\x7c\xf9\xb6\x79\x9d\xfc\xa9\xfd\xec\x49\x23\x0d\xba\x47\xea\xb3\x2a\x49\x40\x4d\x91\x45\xae\xfb\x99\x7d\xfe\xbf\x54\x46\xbe\xb2\x35\xcf\x6e\x0e\xdf\x8b\xcc\xa4\x98\xa3\x9a\xc5\xc6\xd6\xab\x02\xb3\xb7\x46\xce\x0f\xa2\xfc\xb2\x2e\xb7\x4e\x18\xc8\x0b\x7c\xd5\xa6\xea\xa5\xac\x8a\x1c\xf5\x36\x88\x90\xd1\x06\xb0\x7d\x23\x1b\xd8\xa4\xc1\x43\xe1\x11\xeb\xe7\x94\xa8\xaf\xd7\xbd\xd9\xa5\x73\xa0\x9b\x89\x4e\x9c\xf4\xa7\xeb\x9e\xb7\xd2\x6b\xb4\x35\x83\xa9\x14\xee\x6b\xbd\x80\x92\x25\x0a\x4d\x8d\xc8\x39\x0a\x0d\xe6\xa1\x47\x43\x4a\x66\x78\x74\x13\xc7\x94\x08\x1e\xa7\x66\x86\x5f\x16\xab\x68\x9a\xae\x48\x6a\xb2\xa1\xaa\x42\x4c\xf6\x05\x85\xa9\x1b\x37\x53\xdf\xcb\xad\xdd\x11\x70\x07\x4f\x50\x5f\x2e\x3a\x07\x74\x97\xad\x05\xfc\x8b\x15\xb6\xc6\xf2\xdf\xdc\x73\xfe\x93\x67\xf3\xb1\x19\xc4\x04\xb0\x06\x2e\x43\x5c\x60\x7d\xc9\x51\x5d\xc2\x21\x33\x97\xd4\x0b\x1c\xa6\x9a\xe2\xf6\xd9\x6d\x3b\xe0\x64\x3d\x52\xc7\x75\x03\x60\xa7\x74\x39\xbe\x51\xcd\x90\x6d\x50\xb0\x16\x51\x19\xbd\x2d\x3b\x41\x46\xf1\xe3\x7e\x6d\x18\xab\xaf\x29\xce\x4b\x79\x7d\xbf\x30\xce\xa6\x86\x42\xe8\x3c\x25\x5e\x33\x09\xb7\xe5\x89\x77\x67\xe1\x59\x81\x66\x1b\x34\x23\xee\x3d\x25\x5e\xb3\x5c\xe8\x39\xaf\x95\x02\x74\xe7\x9a\x77\xdc\x9a\xc0\x4f\x8d\xb1\x6f\x98\xe1\xc9\x7f\xb7\xeb\x3c\x80\x07\x46\xe4\x01\xa8\x51\x7a\x76\xbc\x96\xda\xcd\x43\x10\x67\x6a\xe1\x23\x07\x6c\xfc\x27\x0e\x59\xab\x3e\xee\xb0\xe9\xa1\xcb\x4a\x4d\x92\x9c\x1f\x30\x48\xbd\xc9\x59\x21\xf8\xc8\x52\x0c\x4f\x9d\x7c\x99\x77\xf7\x61\xef\x92\xec\x05\xc0\xe5\xe2\xb5\x9a\xbd\x69\x9c\x7d\x6f\x29\x93\x27\xf1\xe9\x69\x7d\xce\xfd\x7f\xc6\xfc\x83\x0b\xa5\x08\x5c\xd6\x1d\xd6\xe0\xe2\x93\x02\x42\x6a\x71\x17\x1d\x32\x5e\x59\x4b\xea\xed\x63\x2c\x65\x13\x1d\x91\xa6\x7c\x5d\xb8\x6d\xff\x19\x67\xf0\x9f\xa5\x05\xa3\xa2\x96\x97\x6c\x47\xe5\x0d\x1a\xad\xb8\xbc\x86\x86\x59\x9b\x5c\xb1\xe6\xce\xba\x4f\x9b\xd2\xba\xbe\x3a\x27\x72\xb1\x33\xac\x3e\x0b\xa2\x46\xfe\xea\x3f\x19\x2a\xe8\xfb\xc7\x3d\x7f\x35\xe9\x01\x26\xcd\x49\x1e\xa6\xf2\x1f\xf2\xe7\x73\x11\x9c\x25\x36\x95\xef\x22\x83\x01\x71\x4f\xfa\x37\xaf\x12\x01\xec\xf6\xea\x3c\x9e\xd7\x67\x96\xd7\x60\xfb\xc0\x85\xec\x3e\xdd\x3f\xa3\x67\x8a\xbc\xca\x00\x36\x33\x7a\xdc\xec\x51\x32\xbe\xb3\x1a\xfd\x8d\x49\x56\x35\x96\x48\x37\x0e\x83\x46\x9f\x78\xff\xe7\x82\x34\xe9\xc1\xd1\x72\xa2\xd7\x5c\x17\x08\xbb\xf4\xdb\x93\xfe\x89\x21\xbf\x95\xa2\x02\x72\xaf\xe4\x6d\x5b\xfd\xfe\xda\x04\xfb\x4a\x85\x5d\xd5\xe1\x17\xce\x45\xfa\xc8\x72\x3f\x5b\xd9\xae\x14\xea\x65\x41\x58\x97\x2a\x7f\x96\xd4\x17\xa2\xec\x6c\xb2\x02\x7d\xf3\x7f\xaa\x32\x13\x79\x62\x03\xb3\xa4\x11\xb8\x95\x62\x08\x5a\x1e\xcf\x00\xac\xd6\xf3\xed\x5a\x7d\x3c\x8c\x90\xd9\x10\x2d\x9b\xbe\xa2\x39\xf4\x31\xea\x2a\x32\xf2\xe6\xb5\xb1\x41\xd5\x52\xf5\x82\xba\xa8\x63\x9c\x50\x20\xd7\xab\xc6\xb5\xd7\x6f\x89\x26\xa2\xf1\x5b\x93\x15\x47\xc0\x41\x26\xaf\xd4\x1b\xe0\xa1\x0f\x43\x6f\x23\x0e\x7b\x51\xc6\x93\xbe\x2e\x1d\x9d\x92\x18\x8b\x24\x0f\xc9\x43\x3b\x52\x85\x3b\x41\x34\xa3\xfb\x59\x67\x1f\xad\xb0\x2b\xcd\x47\xee\x7b\x77\x3d\xe0\x5f\x75\x46\x0e\x38\x04\x74\x15\xda\x31\x72\xbc\x89\x4a\x8c\xa2\xeb\x76\x30\xee\x10\xb5\x31\x62\xec\xbd\x95\x98\xec\x3c\x18\x74\xd8\x8f\x7b\x97\x31\xfc\xfe\xe1\x43\x87\xbe\xd7\xaf\xb3\xf7\x98\x34\xfd\xef\x78\x28\x68\xfa\xdf\xe7\xc0\xdf\x88\x7b\x8d\x41\x6c\x30\x4e\x9b\xa0\xd6\xe5\xed\x19\x40\x65\x06\xd0\x03\xda\x6a\xde\x1a\xee\x35\x6f\xc6\x8b\x7a\xa1\x41\xdb\x0f\xc3\x8a\x14\x9e\x51\x0c\x05\x43\xe0\x2b\xa0\x6b\x13\xfd\xe2\xd4\x73\x9e\x3b\x5d\xf8\x80\xe8\x90\x81\xb5\x18\xda\x82\x8c\x8e\xd6\x7d\xb5\x7e\xc9\x99\x1e\xcd\x64\xc7\xdc\xc9\x44\x40\x3a\x33\x63\xf7\x4f\xb0\xa7\x5c\x76\x06\xc7\xdd\x62\xad\x1d\xc7\xe7\x67\xc1\x89\x09\x0e\xd3\x77\xef\xf7\x9f\x34\xf0\xd4\x50\x95\x00\x29\x22\xc6\xb0\x73\x4e\xde\x4f\x8c\x6e\xc5\x8f\x2e\x3a\xff\x47\xfe\x10\x23\xbc\xc8\xf7\x6a\x9f\x6d\xbf\xbf\x8f\x7d\xd8\x61\x57\xa2\x93\x0f\x29\xaa\xdd\x77\x3b\xec\xe9\x0f\x51\x6a\x8a\xea\x82\x51\xbc\x7f\x97\x59\x99\xb6\xed\x11\x3e\x3b\xac\x04\xb9\x9a\xcd\x0e\x42\xdc\x21\x96\x04\x64\x71\x34\xfe\xf2\xdb\x7b\xa8\x86\x7b\xea\xec\x79\xe3\x6c\x68\x9f\xdd\xcf\x8f\xf9\x1f\x1d\x1b\xf6\xab\xe2\x8b\x53\x51\xd2\x0a\x8b\x51\x87\xcd\xdc\x33\x5b\xf8\xf2\x9e\x3c\xc4\x52\x36\x8e\x1a\x41\x44\x36\xc4\x7d\x62\x00\x24\xc0\x9a\x53\x89\x17\x68\xd9\xcc\xa3\xe7\xf3\x6c\x47\x62\xc8\xce\x54\x26\x4b\x4a\xfc\x1c\x91\xde\xf8\x79\x84\xb6\x79\xcd\xcb\x69\x24\x21\x3c\x4a\xa5\xc1\xc8\x5d\x94\x37\xa2\x6a\xad\x12\xd9\xa0\x16\x0f\x42\x7d\x2f\x20\x2f\x7f\xee\xb9\x58\x90\xc7\x5d\x4e\xe9\xad\xba\x68\x93\xb4\x1a\xb0\x81\x0a\xb3\x43\xb5\x10\x22\xeb\x72\x2b\x2f\xb0\x7e\x03\x9c\xa8\x7e\x43\x5f\x61\x55\xc0\xee\x8a\x6a\x28\x0f\x43\xed\xb7\x57\x13\xaf\x9b\x3c\x0a\xe0\xf6\x33\x0e\xfb\xfe\x32\x0d\x00\x6f\x23\x14\x76\x77\x32\x14\x17\x30\xdb\xcc\x7d\xc0\xf1\x4f\x0f\x3c\x35\x81\x3d\xf5\x0d\x59\xfe\xbc\x81\x3f\x2b\x68\x52\x83\x10\x81\x02\x39\xea\x17\x9d\xfd\xcd\x24\xd8\x28\x5c\x2a\xe7\xd9\x2c\xa3\xe7\xee\xcd\x7e\x15\xff\x55\x76\xd9\x32\x2a\xc1\x97\x2c\xf5\xe6\x1f\xbf\x9b\xd5\x4a\xb3\x5b\x29\xa8\x6c\x65\x61\x05\x1f\xcd\xf2\x2e\x6f\x04\x59\xdf\xfd\xe0\x77\xfb\x9f\x9b\x18\x7c\x8e\xb4\x05\x45\xb3\x8f\x5c\x66\xb3\x2b\x0b\xde\x29\x91\xe9\x17\xe5\x4c\xe0\xe9\xae\x8c\x8f\xaa\xa8\x90\xa7\x8a\xcc\xc6\xbe\xc0\xe5\x27\x5b\x43\x95\x02\x48\x66\x06\xd7\x47\x16\x77\xe3\x30\x5e\xef\x7b\xa9\x58\xef\x80\xb2\x87\x47\xbf\x19\x12\x43\x59\x4f\x90\x2c\x91\x10\xac\x4c\x22\xd0\xd1\x98\x66\x3c\xca\x90\x7e\x58\x6c\x7a\x4b\xb4\x46\xa3\x0c\xa7\x2f\xad\x33\x66\xe8\x23\x39\x49\xb8\xb8\xd0\x05\xc3\x23\x44\xee\xa6\x14\xba\x5b\xb3\x7a\xe4\xf9\x29\xdd\xf5\x7c\x88\xf8\xf4\x0f\x1f\x39\x7a\xcc\x3b\x15\x9c\xf0\x8d\x7e\x05\x91\xe7\xab\x2e\xd4\xed\x70\x9b\xfb\xe2\x48\xdc\xda\x4b\x6b\x52\x39\x38\xec\x0f\x14\x0e\x19\x44\x69\xaa\x0b\x3f\x54\x56\xb4\x5d\x62\x3b\x4e\x33\xb9\x44\x6e\x3d\x1f\xc5\x4d\x51\xe3\x6b\x8d\xc3\x47\x8e\xfa\xe8\x91\xc0\x5c\x0c\x34\x79\x24\x42\x40\xc6\x0a\x1a\x8e\x31\x07\x09\x16\x6a\x14\x1b\x13\x91\x1a\x75\x91\xc6\x2d\x12\x8c\xfb\x01\x22\x49\x8e\x38\x44\x35\x08\x75\xc5\xc0\x11\x64\x5a\x24\x96\xd0\x5e\x90\x91\x09\x86\x66\x10\x6c\xb2\xd8\x47\xaf\x01\x9d\x84\xf5\x5c\xa3\xb4\x8a\xc8\x2e\x05\x03\x3a\x41\xdc\x18\x4d\x42\x9a\xab\x1d\x7d\x72\x9f\x48\x62\x1c\x03\x62\x57\x57\x57\x53\x83\xad\x18\xa9\x90\x1a\x41\x53\x65\x36\x80\x63\x9a\x4b\x09\x9b\xa2\x5f\x4b\x75\x07\x1d\x3c\xc8\xd0\x21\x97\x5c\xaf\x93\xab\x20\x10\x40\xa5\xc0\x67\x13\x15\x78\x5c\xb2\xa7\x20\x7f\xa4\x25\x00\xf6\xd3\x5b\xd7\x4e\x22\x59\x3e\xb8\xc7\x88\x27\x84\xc3\x1e\x23\x11\x10\x77\x81\x86\x38\xcb\xa7\xa8\xc6\x37\x41\x86\x63\x85\x5a\xdf\x9d\x5d\x59\x98\x43\x81\x50\xa8\xb6\x7e\xd1\xb9\x26\x35\xd6\xd8\x00\xe4\xeb\xef\x3f\x96\xbd\x61\xdc\xb0\x87\xbc\x7c\x7c\xb7\xf6\x90\x8f\x8f\x8d\xc2\x45\xd0\x44\xb5\x14\x30\x6d\x6c\xfb\x8e\xe0\x90\x53\xaa\x93\xf7\xd6\x84\x66\x8f\xf6\xd2\xde\x5a\x33\xee\xc8\x95\x38\xd5\x8c\xb3\x34\x0f\x18\x3f\x72\xfd\x51\xaf\xd1\xe6\x09\x6f\x64\x22\x49\xa7\xeb\xde\x6a\xec\x89\x28\xed\x25\x42\x27\x25\x24\x82\xf0\x5c\xe0\x74\x0a\x83\x86\x5a\xaf\xe8\x9c\xc8\x07\x5c\x27\x9f\x10\x93\x6d\x95\x44\x20\x85\xdd\xeb\x8c\x5f\xca\x8b\x6d\xa4\x41\xda\xa8\x3d\xa9\xd7\x0b\x9a\xb7\xc9\x3b\xa8\xcd\x41\x0a\xb7\x67\xee\x49\x2d\x3b\x49\x45\x8d\x5a\x0f\x7d\x27\x66\xf0\x88\x34\x4b\xa8\x85\x68\x7c\x8c\xd9\x27\xb4\xc3\xb3\x06\x65\xb7\x56\x3e\x9b\x0a\xe4\xec\x11\xb0\x19\xc9\xcb\x93\x14\x2e\xab\xb4\xa9\xe5\xe5\x69\xf7\x6a\xff\x3f\x39\x8b\x46\x99\x3a\xe2\x0f\x87\x46\x56\x47\x94\x57\x04\xa4\xae\xb2\x3e\x49\x96\xb4\x62\xc5\x6d\xac\xb7\xfd\x26\x87\x90\x40\x50\x6d\x6c\xe2\x32\xf3\x43\x45\x56\x04\xa5\xe6\x9c\x81\x52\xf1\x90\x95\x6a\x9b\x36\x2e\x00\x28\x07\x6e\x09\x03\xa5\x0c\x94\x10\x86\xd8\xec\x62\x0c\x88\x11\xc4\xf1\xc7\x15\x36\xb0\x1b\xdd\x5f\xaf\xf8\xef\xaa\x14\xf9\x9b\xad\x73\x41\x27\xd7\xa8\xee\xe5\x9d\x46\x47\x2a\x46\xdb\xa9\x6d\xd3\x11\x02\x5f\x4f\x91\x58\x38\x8f\xa4\x50\x34\x85\x39\x2b\x8c\x55\x0f\x09\xd6\xa9\x28\x8e\x6a\xd4\x69\x6b\xeb\x4d\x53\x4c\x08\x57\x81\xc6\x5e\xce\xc0\x68\x12\xee\x96\x48\xbf\x9c\xfd\x3c\x5e\x4b\xe3\x50\x64\x45\x76\x23\x45\xc6\xb9\xd6\x87\x34\x51\xb0\x95\xc6\xc9\xf0\xb1\x34\x15\x9f\xbd\x60\xd2\x5d\x06\x93\x7e\x72\x8c\x4d\xaa\x25\xe5\x7e\x78\x6c\x07\x80\x1d\x75\x7d\x21\xb8\xb3\x27\x95\xae\xac\xef\xff\xe8\xd8\xac\x71\x12\x67\x9a\xdb\x59\x2f\x5e\x3a\x39\x0d\x49\x17\x44\x30\xe9\x86\x66\xb9\x0c\x4c\x01\xa9\xd2\x42\xac\x5f\x28\xd1\x02\x04\xa7\xa9\x67\x74\x79\xc2\x3b\x02\xd1\xf1\x91\x9c\x2b\x23\xee\xf3\x6e\x22\x36\x82\xb8\xa7\xa2\x1c\x29\x60\x23\x15\x1d\xd9\x64\x30\xe5\xe5\x58\xfa\x53\xb2\x5d\x10\x7e\x79\xb8\x7e\x64\x9a\x16\x4f\xd3\xe3\xe9\x71\x38\xbb\x06\xd5\xd7\x2a\xc0\x70\xf5\xc1\x6b\xa5\x1c\x3b\x24\x26\xca\x40\x5c\x21\x34\x1f\xd6\xe5\x06\xa9\xa3\x05\x59\x25\x2f\x0f\x86\x19\xd8\x6a\x9c\x65\x90\x8b\x9a\x3a\x7c\x05\x88\x9c\xa4\xd2\xa3\x5b\x55\xdf\x8b\x10\xde\x45\x84\xf0\x7b\xc7\xd9\xa3\x3b\xfc\x42\xd0\xe9\x75\xf0\xd2\xb0\x12\xdc\x27\xdc\x37\x8d\xef\x6e\x67\xfc\xc5\xd8\x99\x62\x99\xdf\xd2\x5b\x04\xad\xad\x6a\x07\xa4\x90\x3e\x6f\xec\x8e\x63\xf5\x43\x9e\xa6\x41\x48\xd6\x65\x8d\x29\xe6\xb8\xe5\xcc\x78\xb0\xea\xe1\x7e\x87\x1c\xea\xd8\x73\x85\x1a\xa9\x16\xeb\xb3\x12\x1e\xad\x8b\xba\x4a\x15\x7c\x16\xec\x26\x92\xfa\x52\xf9\x45\xda\x7f\x4e\x3b\x26\xd7\x99\x52\xa4\xc0\xd7\x7d\x82\xd6\xc4\x29\x9c\xe2\x83\xe3\x41\x48\x0c\x9a\x86\x24\xdf\x05\x74\xe8\x1b\x51\x2a\x33\x4b\x0b\xc0\xa2\x4c\x73\xb8\x6c\x1c\xa2\x75\x8d\x7b\x0b\xfd\xa2\x36\x35\x42\x1e\x74\xea\x97\x9c\xf3\x5b\x87\xf6\x3e\xd9\x3d\xb9\x15\xd8\xcd\xe0\x09\x6a\xc7\xfa\xc2\x8d\x9e\xb1\x2f\x8f\xb3\x85\xcb\xb6\xbd\x15\x11\x37\xdc\x8b\xe3\xfe\x2d\xc5\x87\x5e\x3b\x0e\x9b\x03\xf8\x1b\xf4\x56\x3d\x14\xeb\xbc\xf1\xff\xb3\xf7\x2e\x60\x96\x5d\x55\x9d\xf8\x77\x6e\xf5\x73\x27\x9d\x84\x23\x83\xf3\x1f\xc7\xcf\x33\x27\x8c\xd5\x15\x6f\xdd\xea\x4e\x42\x1e\x4d\x12\xa8\x54\x55\x93\x4a\xba\xab\x6b\xaa\x2a\x09\x0f\x81\xde\x75\xef\xbe\xf7\x1e\xfb\xdc\x73\x6e\xce\x39\xb7\xaa\x2f\x0c\x0a\x84\xa7\xbc\x11\x19\x28\xe5\x25\x28\x18\x51\x04\x91\xe1\xa9\xa3\x80\x82\x08\x22\xf2\xe7\x21\xa2\x28\x3a\x28\x7f\x05\x5f\xa3\x4e\x23\xe3\xff\xdb\x6b\xad\xfd\x3a\xf7\x51\xd5\xdd\x49\x88\x4e\xc1\xf7\xa5\xeb\x9e\xc7\x3e\xfb\xb9\xf6\xda\xeb\xf1\xfb\xf5\xa9\xf2\x5b\xde\x41\xad\x9e\x0e\xcb\x1b\xfb\xc0\x04\xbb\x85\xfc\xc9\xd7\x85\x53\xc9\x08\x7f\xb2\x86\xe7\x54\xc8\xac\xf6\xb2\x3c\xc9\xcc\x27\xfc\xc7\x86\xd7\x98\xd8\x21\xab\x24\x27\x98\x68\x6c\x71\x4f\x60\x7b\xba\xbc\x68\xfb\xff\x25\x9c\x07\x3a\x3c\x32\xf3\x51\x9e\x5f\x70\xe7\xca\x09\xa4\xc9\xb3\x48\xb3\x4b\xf6\xa6\x75\xf2\xf0\xd7\x8b\x52\x92\xdf\xa7\x3c\xb6\x47\xae\x65\xff\xa3\x9e\xca\x11\x7f\x87\xd7\xa5\x2c\x64\xfb\x23\x2a\x58\x0b\xee\xed\xf0\x43\xc1\x69\xf9\xf4\x69\x4b\x7b\xe2\x44\x9b\x0a\xa5\x28\x7c\x84\xa3\xd3\xd7\x3d\xea\x51\xd7\x3c\xaa\x8a\xd6\xb5\x3c\xda\x10\x53\xb5\x60\x5e\x34\x79\x2f\x46\xa6\xd9\x6b\xaf\xbd\x06\x84\xc7\x3a\xaf\x9f\xd9\x94\xe7\x35\x48\x82\x2e\xa2\xf5\x28\x96\x3b\x88\x93\x50\xfc\x4b\x0f\x67\x4f\xbe\xd0\xa9\x46\xf6\x27\x07\x05\x69\x5e\x4b\x51\xa5\xb6\xfd\xee\x77\x85\x37\x6d\xf3\x8c\x1d\xfe\xa6\x2d\xa4\x80\xb0\xb4\x32\x6f\x82\x38\xf6\x21\x4d\xe6\x96\xb7\x9f\x56\x97\x33\x0d\xbf\xee\xb3\x3f\xf0\x18\x6b\xc8\xdd\xac\x2e\x77\x1c\xff\x93\x5e\xf8\x2b\x9e\xf9\xed\xc4\xda\x44\x79\x39\xaf\xb1\x64\x08\x55\x92\xc2\xbc\xaf\x31\xf7\x91\x96\x28\x93\x8a\x9f\x7c\xc8\xda\xf7\xdc\x82\x33\x51\x17\x91\x3c\xe9\x04\x9b\x3c\x83\x80\x6e\x8c\x3c\xd6\xb0\x9d\x68\x24\xce\x48\xde\xbb\x63\x88\x09\xcc\x4e\x82\xf0\x2f\x56\x98\xaf\xaa\x13\xa5\xc9\xdd\x58\xa8\xff\xda\x4a\xf8\xa2\xca\xe0\x75\xf0\xb8\x64\x51\x43\xc5\x57\x60\xd9\xba\x2a\x56\x94\x14\xa6\xa5\x21\xd8\x40\x89\xf7\x5e\x71\xe5\x9f\x36\xdd\x70\x5a\x67\x2f\x83\xd8\x2d\x97\x3b\xa2\x93\x9d\x9e\x24\xe2\x54\x3a\x7d\x63\xf2\xa0\x4a\xce\x17\x90\xf5\x4f\x84\xa8\xd6\x10\x21\x1a\x4b\x9a\x69\x60\x99\xbc\xe0\x38\x9f\xab\x41\x84\x46\x4c\x3c\xaa\x38\xcb\xf5\x83\x1e\x49\xa6\x5f\xf2\xc2\x9f\xf6\x6c\xd9\xa4\x8a\xc6\x13\x3d\x04\x35\xfd\xc9\x33\x7f\x72\xe3\xe8\x9f\x3c\xf3\x75\x55\xf8\x0b\x53\x76\xe1\xa7\x28\xea\xb4\xc7\xb8\x73\x84\xd2\x92\xb1\xae\xc0\xf3\xe9\x36\x9a\x17\xc1\x69\xa9\x9c\xe4\x33\x37\xc1\xb6\x70\xcb\xcc\x4d\x74\xeb\x96\x99\x5a\xad\x76\x5a\x56\xfc\x34\xbe\x7e\xda\xca\x09\x37\xd5\xbf\x77\x82\xed\xc3\x13\x88\xff\x4f\x15\xd6\xb8\x7f\x9c\x33\xc3\x56\xad\x89\xd0\x0f\x5f\x56\xa1\x13\x94\x6b\xde\xa5\x8b\x9a\x98\x7a\x38\x6e\x98\x3e\x76\x8d\x5f\x5c\xb5\x60\x2d\xed\x4e\xc7\x52\x9b\xc3\xb7\x45\x36\xad\x61\x6c\xe8\xc4\x05\x6e\xc1\x01\x77\x30\xe0\x9f\x0f\x3c\xab\x03\x42\x39\x8a\x54\x5a\xa3\x98\xaa\x5b\x57\xe7\xb4\x3c\x38\x5c\xe8\xcf\x5a\xf5\xa7\xa6\x19\xa9\x4b\xca\x0d\xc0\x63\x4d\xd5\x58\x9b\x91\xe4\xf1\x9f\x12\x2e\xd3\x68\x83\xc6\xdd\x8c\x79\x0b\x4d\x7d\x51\xd2\x9a\x41\x54\x2f\xd4\xb7\xad\x1e\x00\xdd\x19\x51\x82\xd5\xac\x8e\x38\xaa\xe3\xb3\xcb\x8b\xb9\xb3\xc2\xef\xf3\x98\x92\x6d\xfe\xeb\xbd\xf0\x65\x9e\xb6\x4b\x0c\x5f\x55\xa5\x2a\xc3\x52\x25\xd7\x0d\x64\xbc\x96\xa7\x2b\x31\x17\x4b\xc5\x44\xce\xe7\xcc\xb0\x66\x0b\x8b\xe2\xd0\x01\xcc\xa1\xe7\x6f\x1e\xc4\x2b\x78\xee\x04\xbb\xd4\xca\x79\xc9\xfd\xbf\xaf\xb0\xe6\x03\x37\x45\x57\xad\x4f\x85\x2f\xac\xd8\x5f\xd6\xd0\x26\x9b\x00\x84\x60\xdf\x19\x36\x19\x95\xe2\x5b\x96\xf8\x6d\xbe\x31\x7e\x66\xda\x05\xef\x68\x7a\xda\x2f\x5c\xc0\x1c\x75\xdb\x38\x6a\x7a\xfe\xcd\x1e\xf6\xef\x4d\x3e\xc1\x72\x06\xc6\x89\x39\xa9\xbd\x26\xb9\xff\xd9\x3d\xe1\xe7\x26\x46\xdd\xb5\xdd\x78\xfa\x91\xa0\x4e\x37\xf5\x0e\x11\x25\xc1\x1a\x9c\x4c\xd3\x5e\xd1\xed\x81\xd9\x44\x18\xae\x85\xc1\x64\x79\x43\xb9\x00\x71\x99\x72\xc0\xd5\x11\xad\x2e\xba\x45\x3e\x73\x25\xee\x8c\xc8\xb6\x40\xed\x9b\xe6\xf9\x74\x81\xa8\x78\x4d\x48\xd8\x03\x8e\x87\x71\xc3\xa1\xea\xb9\x93\x91\x50\xcf\x5e\xc0\x20\xa8\x57\x47\xf5\x3f\x9e\xf2\x03\xf3\x42\x9a\x8d\xac\xa6\x1b\xe3\xae\x42\x70\xe5\x7d\x85\x20\xae\xe1\x3a\x5a\x62\x94\x62\x12\xe5\x0a\x35\xc9\xb8\x43\x13\x16\xb3\x1f\x7a\xe0\xd6\x1e\xce\x17\xa3\xb6\xb1\xd7\x31\x07\xe7\xa0\x0c\x43\x83\x65\x0c\x41\x9b\xf1\xff\xf4\x60\xb8\x3c\xe4\x3a\xc6\x77\xe5\x3a\x95\x93\xb8\x10\x38\xf2\x15\xc0\xae\x9f\xf6\xba\x18\xde\x22\xb2\x66\x9a\x75\xa4\xb2\x4d\x80\x2b\xc3\x52\xd1\x9f\x7f\xe0\xfe\xcd\x06\x7e\x91\x8a\xaf\x7c\xb6\x37\x26\x1b\x78\xc7\xfd\x00\xc1\x97\x37\x40\xbc\x19\x1e\xc4\xc6\x32\x87\xd2\xf6\x41\xe0\x30\xa2\xc1\xde\xee\xe9\x10\xc1\x37\x8d\xcb\xb6\xdd\x79\x7d\x30\xa0\xf8\x4e\x93\x1a\x80\xc8\x84\x68\x02\xb3\xb5\x55\x48\x3c\xb3\x30\x52\x86\xa7\xde\x1a\xa0\x94\x24\xdd\x45\x87\xdf\x05\x05\xf8\xce\x99\xfc\x76\x9e\x94\xad\x58\xa9\x9d\x35\x53\xb2\xdf\x0c\x59\x3a\x43\x0d\x38\xef\x73\x83\x96\x9d\x70\xfe\xa3\xb5\xd5\x3a\x8f\x29\x86\xdf\x7f\xd9\x9e\x70\xd6\xfa\x3d\x8e\x5c\x16\xc3\x80\x39\xe5\x63\xd8\xe9\xc6\x5b\x1e\x04\xa4\x45\x75\xee\x46\x79\xbd\x6b\x82\x3d\x91\xe9\x5b\xfe\x92\x32\x59\xdc\x48\x9c\x29\x64\x51\x48\x9b\x41\xba\xae\x14\x5b\xc2\x67\x72\x92\x19\x44\xc3\xf0\xfd\x5b\xb6\x83\xdf\xb3\x63\x06\x7f\xa3\x12\xbe\xb7\x12\x0f\x8d\xf8\x43\x7c\x2a\x5c\x9b\xc6\x32\xa9\xaa\x15\xd4\xd3\x9e\xce\xb0\x8e\x72\x34\xfe\x69\xfb\xa3\x2c\x4f\xc7\xf0\xad\xf7\x34\xff\x06\x4d\x7d\x94\x9a\x90\x92\xb6\x91\x46\xc0\x2e\x92\xa5\x52\x50\x63\xf0\x60\xdf\x9c\x6b\xd7\xcc\x4b\xca\xf2\x62\xd3\x67\x50\x41\xf4\x5d\x68\xc1\x34\x58\x20\x83\xbc\x9f\x14\xfc\xac\x35\x7d\x49\x40\xbb\x75\xcb\x77\x08\x1f\x04\x6f\xe5\x57\xc2\x3f\xd3\xfa\x65\x27\x96\x89\xb1\xef\x1d\x96\xaa\x97\xc6\x02\xa3\xaf\xfc\xf7\xb2\xf0\x25\xde\x1a\x26\x9d\xe0\x6a\x35\x37\x41\x30\x00\x98\x36\xa5\x61\xe2\x1d\xc8\x76\xed\x07\x05\xc7\x95\xac\x4c\xc4\x24\x75\x8b\x0c\xd8\x54\x6e\x3a\x23\xfa\x55\x14\x85\xa2\xd9\x14\xf5\xe2\x16\x2b\xb3\x06\x9e\xc7\x44\x1d\x59\x60\x9a\x05\x37\xa9\xbf\x6e\x71\x43\xa1\x5f\x7b\x90\xbd\xd7\x63\xfb\xb0\x08\xff\xe7\xbd\xf0\x0d\xde\x02\xfc\x5d\xca\x76\xc2\xca\xe0\x63\xb2\xaa\xf0\x85\x5a\xb0\x00\xc1\x9b\x88\x90\x88\xb3\x05\x62\x01\xad\x87\x73\x65\x8a\xb1\xd4\x29\x87\x3a\x0a\x94\xad\xa5\x54\x31\x18\x57\x83\x65\xd0\x49\xcd\x15\xe2\x53\x59\x38\x2b\xea\xbd\xc2\x3d\x73\xff\x9e\xc7\x26\xce\x88\xbe\xff\x09\x2f\xfc\x90\x77\x87\xd0\xce\x2e\xac\xc0\x19\xd1\x37\x6e\xdb\xc2\xf4\xba\xed\xaf\x1d\xd7\x80\x33\xa2\x9f\xeb\x0c\xfc\x33\x58\x3a\xb9\x64\x75\xbf\xaa\x33\xd9\x02\xd8\x33\x1e\x4d\x81\x4c\x26\x4e\x47\xa1\x47\xa6\x56\xe9\xaa\xdd\x49\x03\x7e\xc2\x67\xec\x56\xfd\x83\xc7\x0e\xa8\x0f\xf8\x7f\xe1\x85\x5f\xf2\x4e\xa9\xcf\x39\x51\x6f\x67\x44\x7f\x52\x0a\xa1\x18\xbe\x04\x94\x9c\xb4\x65\xc2\x17\x54\xc8\xbf\x2a\x0a\x7b\x1a\x2b\x0a\x1f\x5f\xb8\xa7\xc7\x63\xd7\x92\x45\x97\xe8\x21\xd9\xde\x7b\x7a\xd1\x06\x8f\x81\xbf\x29\x95\x8b\xb1\x51\xe7\x99\xb6\x2a\xc8\x7d\x38\x4f\xb1\x93\x39\xcc\x70\xa9\xf5\xa9\x69\x6c\xba\x92\x84\xa1\x15\x67\x22\x67\x56\x2b\xcd\xfa\x4e\xc3\xbf\x56\x61\x0f\x33\xe3\xb4\x0a\xc8\x91\xb9\xff\xbb\x15\x10\x85\xd7\x5d\x1b\x7e\xa0\xb2\x56\xbe\x5b\x96\xc1\x5d\x91\x45\x29\x22\x9a\x29\x42\x68\x6b\xe4\x0f\xa3\x65\x57\x0d\x5a\xda\x54\x33\x5a\x4f\x2f\x1b\x97\xb0\x84\x03\xd1\x4a\xd2\x4c\x34\xa6\xac\x55\xaa\xa7\x5a\x2d\xb8\xb5\xaf\xac\x6b\x55\xa2\x17\xd3\xde\x44\xfa\x26\xcd\x03\xea\x1a\x33\x4b\x9b\x29\x44\xa7\x04\x87\x1b\x29\xbc\x03\xc1\xd6\x53\xb5\xe0\x89\x22\x4b\x61\x98\x12\xd1\xe2\x45\xb4\x21\xd4\xbc\x51\x12\xd1\x4a\x9b\x3f\x12\x1c\x86\xd7\x82\xa8\x43\xc9\xf3\x71\x7f\x4a\x2b\x83\x00\xef\xea\xee\x06\x3f\xe5\xb1\xbd\x50\x9c\xff\x1a\x2f\xfc\x51\xef\x2e\xf4\xc0\xd8\x8b\x07\xf5\x94\x52\xff\x69\x39\x94\xea\x75\xa1\x57\x42\x94\xd3\xb4\xa9\x5a\xce\x34\x73\x10\x53\x0b\x47\xf7\xee\x0f\xc9\x41\xe0\x41\x26\x5a\x30\x21\x70\x0a\xb8\x7c\xfb\x97\xb2\xbb\x1e\x18\x73\xb7\xff\xe9\x4b\xc2\xe7\x56\x46\xdd\x75\x57\x99\xa5\x94\x99\x9d\x11\xac\x30\xdd\xd4\x02\x32\x2d\x21\x9f\x53\x8c\xdd\xc9\x3b\x57\xd7\xac\xdd\x8b\x36\xae\x9b\x6a\x00\xb5\x20\x9f\xb8\xa5\x46\x3f\xd0\xe8\x28\x57\xa3\x65\x03\x0f\x36\x8e\xd6\x8e\x5e\x57\x0d\xba\x31\x4f\x12\x32\xe6\x41\x90\x06\x8f\xe9\xee\xd5\x57\xd7\x82\x3b\x73\x40\xea\xb5\xda\x4f\x6a\xda\xc6\xd1\x60\x64\x1b\x15\xa2\xfc\xb0\x03\xd9\x7b\x0f\xec\x1e\x03\x76\x8f\x01\xff\x46\xb0\xc1\x7e\x41\x59\x03\x7e\xda\x63\xed\x07\xce\xec\x62\x96\x16\xd8\x0b\x6e\xcc\xdd\xb4\x59\x48\x95\x50\x9c\x8e\x9b\x5c\x6d\x57\x8e\xb9\x17\xb1\x65\xd8\xfb\x8d\xc1\xe0\x1d\xde\x03\x69\x29\xb2\xaa\x8c\x26\x85\xd9\x7c\x58\xa2\xbb\xe2\x6c\x2c\x78\xa1\xed\x5c\xa3\x0a\x3a\xe7\x6d\x6e\x7f\x82\x5b\xf3\x57\xcc\x09\x6e\x88\xdc\x32\x1e\xf8\x11\x5f\x19\x7a\x8c\x7b\xee\x41\xf6\x48\x47\x15\x07\xb2\x42\x8d\xb5\x70\x42\xf0\x5c\x00\x55\xd6\x1f\x1c\x08\xff\xb3\xfe\xe5\x72\xc7\xc0\xe5\xf1\x74\x58\xef\xdb\xbf\x2b\x1b\x2f\x56\x36\xc6\x8a\x4f\xac\x1e\x86\x9a\x4f\xcc\x8c\x82\xea\x2a\x1a\x06\xdb\x76\x7a\x35\x3b\xc2\x6a\x63\x90\x52\x86\x8c\xf9\xae\x24\xbe\x08\x49\xfc\x09\x3b\x4d\xff\x57\x2e\x92\x45\xec\x47\x86\xb3\x88\x3d\x88\x3c\x7d\xeb\xdb\x0b\xa7\xc7\xf8\x37\x2b\xcc\x3f\x2d\x24\x46\x62\xfc\xd9\xf3\x4d\x61\xfc\xfd\xd4\x8d\xec\xff\x19\x62\x12\xa0\x64\xa6\xe7\xdc\x18\x3e\x69\x58\x06\x93\xd4\x05\x1b\x2a\x8e\x09\x73\x71\xc0\x5e\x60\xa2\xb8\x30\xd6\x99\x48\x3d\x92\xfe\x50\x54\x8b\xda\xb0\x98\x9f\x57\xdc\xc0\x5e\xec\xb1\x7d\x75\xd1\x6d\x37\x73\xff\x59\x1e\xbb\x66\x5b\xa8\xa1\x39\xd1\x6d\x1f\x5f\xa5\x08\x39\x84\xb3\xb9\x1d\xaf\xb9\xb5\x96\xd7\x82\xe3\xab\x41\x27\xed\x25\x85\xd2\x84\xdb\x69\x5e\x28\x65\x99\x67\x10\x26\xd2\x4d\x1b\x93\xb9\x26\x62\x66\xaf\xf7\xd8\x25\x8d\x74\x33\xd9\xe4\x59\x63\x76\x79\xd1\x7f\xa9\xc7\x6e\xd8\xb6\x4e\xf3\xe6\x05\xa7\x62\x2b\xd6\x0d\xbb\x76\xea\x03\xa0\x99\x1b\x33\xbd\xee\x56\x12\xae\x0a\xf7\x8f\xbc\x8f\x50\x32\xfb\x9c\xc7\x0e\xc0\x81\x65\x3e\xca\xfc\x8f\x7b\xec\x51\xdb\x73\xac\xd2\xd3\x4e\xd5\x5e\xe6\xa9\xcb\x6e\xb7\x15\xa2\xd3\x4d\x33\x9e\xf5\x83\x46\x94\x81\x51\xa9\x3f\xb6\xc3\x86\xae\x90\x21\xa6\x2b\xed\xb4\x23\x47\xf0\x0c\x45\xb7\x5e\x09\x6d\x69\x44\x19\x7b\xad\xc7\x0e\xd2\xcd\x34\xf7\x5f\xe4\xb1\xeb\xb6\x6d\x19\xc5\xc0\x9d\x72\xa7\xc3\x7f\xd1\x97\xdd\xa6\x99\xcb\x34\x97\xb5\x7d\x0b\x36\x23\x39\x4f\xf0\xcc\x64\xc5\xf9\x61\xc4\x3e\x7b\x67\x85\x3d\x9c\x6f\xe6\x0b\x31\xcf\x8b\xa8\x7e\x6b\x9c\xd6\xcf\xc8\xd2\x84\xff\x9a\x0a\x9b\xdd\xb6\x9a\xb3\x77\xaf\x0e\xbc\xe9\xd4\xf8\x33\xde\xb0\x47\x9c\xda\x27\xc1\xec\xdd\xab\xc1\x7c\x94\x9f\x29\x9d\xfa\x4a\x76\x3a\xae\xb8\xfc\x27\x73\x9c\xed\x24\xfd\x0c\x1f\x8d\x3a\x1c\xd2\xfe\x0c\x39\xe0\x17\x39\x86\x7c\x33\x17\x58\x7b\x04\xd0\x93\xb5\x67\x1f\x38\xc8\x0e\x8a\x6e\x5b\x74\x44\xc6\x63\xff\xe7\x0f\xee\x60\x3c\x17\xd4\xe3\x4e\xef\xfc\xed\x01\x7d\xdd\x1d\xd0\x52\x3e\xa5\xe2\xd9\x02\x66\x21\x4a\xd0\xd0\xa1\xd6\x94\x0f\x09\xe6\x5b\x7c\x8f\x26\x71\xbd\x5f\x47\x5a\x9b\x22\x72\x3a\x05\x8b\x55\x0a\x53\x54\x04\xd3\x9a\x44\x69\x5d\x68\xac\x16\x02\x5b\x54\xef\x00\xf1\x11\xa1\x13\x35\xe4\x28\xa8\x68\x0a\xf5\x00\xa8\x57\x90\xc9\x50\x63\xec\x4e\x65\xc8\x89\x9a\xc7\x02\x3e\x85\x5a\x19\x89\xd9\x1c\x83\xa7\x12\x21\x1a\x50\x46\x14\x9b\xaf\x64\xbd\x24\xaf\x06\xeb\x53\x2a\x5d\x0c\x4c\x58\x04\x69\x44\x43\x82\x11\xdf\x99\x90\xcd\x07\xfb\xb6\xdc\xf5\xf3\x84\x77\xf3\x76\x5a\x04\x69\xa6\xe3\xc0\x59\x10\x04\x45\xc6\xeb\x67\x00\xcf\x29\x13\xf4\xc5\x2a\xab\x4f\x39\xa1\xea\x26\xe9\xd4\xa4\x0e\x17\xed\x0c\x28\x04\xb8\x9b\xc2\x47\xcd\x1f\xfa\xbe\xca\x4c\x0e\x1a\xfd\x84\x77\xa2\xba\x6a\xaf\x8e\x7a\xa7\x6c\x44\x59\xae\xac\x1a\x1f\x48\xcf\x9c\x8b\x79\xd4\x09\x0e\xe7\x42\x04\x43\xa7\x0b\x18\x22\x3a\x72\x02\x06\x81\xe3\x0e\x55\xa9\x5b\x08\xc6\x0e\x66\x7d\x51\x6c\x0a\x91\xd8\xe2\x15\x81\xfa\xe4\x87\x93\xc6\xf0\x4f\x4f\xd1\xc0\x0d\xaf\x57\x9a\x05\x4e\xba\x75\xd2\x48\xb3\x69\xea\xb1\x3a\x04\xea\xa0\x7d\x92\x46\x09\xe6\x18\x45\xda\x10\x77\x21\x64\xcb\x00\x62\x26\xe6\x75\xab\x19\x8a\x6a\xb8\x3c\xfe\x6c\x44\x0d\x79\xe8\x91\x0b\x17\xab\x32\xb7\xba\x88\x2f\x47\xad\x76\x31\xbd\x29\x80\xa6\x07\x72\x45\x03\xbd\x00\xf5\x27\x4d\x06\xa2\x35\xa6\x1d\xc1\xd1\x8a\xaa\x13\x11\x64\xc5\x36\x79\x3f\x98\x0e\x64\x4f\x43\xb8\x4b\x5a\xef\x75\xec\x53\x01\x5c\xc4\x22\x54\x9f\xdb\x1d\x5e\x63\x6c\x56\xdb\x5d\x7b\xb9\x40\x06\x15\x50\xe6\xc0\xba\x39\x50\x33\x0a\xcc\xa0\x5e\x35\x97\xad\x64\x25\xd8\x71\x4c\xe8\x39\x77\xb3\x26\x65\x01\xb0\x6a\x4c\x12\x84\x5e\x7c\x8f\x13\x89\xc8\xa2\x7a\x69\xca\x8c\x4a\xb8\xac\xb1\xb7\x57\xd8\xbf\xeb\x0e\x1b\x62\xff\x95\x15\x76\xeb\xb6\x92\x6c\xe8\xec\x70\xa4\xda\x27\xbc\x6d\x9f\x29\x1b\xfb\xac\x08\xeb\x51\xeb\xc2\x76\x45\x19\x24\x8a\x0b\x95\xef\xa6\x03\xa6\x95\xa8\x37\x97\xf0\x0a\xc4\xb5\xe7\xec\x65\x1e\xdb\x7f\x4f\x2f\x5d\xef\x17\xc2\xbf\xd7\x1b\xc3\xa9\xac\x3a\xe8\xbf\xe0\xc3\x4e\x97\xdc\x41\x17\xdd\x76\xab\x8b\xe7\xa9\xc8\xfd\xa4\xc7\xf6\x83\xcf\x71\xf1\x94\xff\xf2\x9d\xd4\x68\x15\x1f\x76\x6a\xf4\x78\xba\x58\x52\x24\xe8\xe2\xc0\x64\x3d\x0f\x8d\xe2\x0d\x1e\x3b\xc8\x9f\xd6\xcb\xc4\xf1\x28\x16\xfe\x2b\x76\xa2\xed\xcc\xaa\xc7\x9d\x2a\xde\xad\x2f\x97\xf5\x05\x79\x3d\x80\x1b\x0a\x39\x72\xb0\x0b\x81\xfd\x26\x52\x95\xb5\x75\x02\xf6\x96\x0a\x7b\x58\xab\x2e\xcc\x3c\x93\xca\x87\xff\xd2\xca\x18\xb8\x39\x55\xd3\xc7\xcd\x2d\xb8\xaf\x95\x66\xfe\xc0\x7d\xb7\x7f\x1f\x37\xb7\xf0\x50\xd5\x74\x5a\x75\x61\x46\xbd\x11\xe5\x67\xd8\x0b\x3c\xc0\xfb\x6b\x46\xad\x93\xbc\xeb\x3f\x7d\x07\xe3\x38\xa7\x9e\x76\x7a\x65\x56\x5f\x76\x3b\x43\x97\xbd\xfd\xd1\xe0\xe3\x15\xb6\xbf\x15\x15\x2b\xa2\x9b\xfa\x1f\xaa\xec\x60\xca\x3f\x0e\x1f\x76\xea\xf1\x9c\x0a\x5d\x75\xab\xd1\x8a\xc0\xba\x90\xe6\x11\x1c\x09\xd0\xa9\x66\x7c\x66\x99\xc0\xed\xbb\x16\xcc\x2f\x2c\xaf\x2c\xcc\xcd\xae\x2d\xcc\x1f\x0b\x54\x49\xa5\xf8\xf7\x35\x3b\xcb\x8d\x5b\xa7\x45\x62\x8c\x54\xdf\xaa\xd2\xac\xe4\x49\xa0\x0f\x2b\x90\xed\xce\x93\x60\x31\x89\x0a\x83\xac\x88\x89\x74\x71\x9a\x68\x54\x8a\x6e\x4a\x3e\xe7\x56\x54\x28\x9e\x45\x9c\xe2\x6d\x51\x2a\x4d\x5e\x59\x06\xe1\xa1\x6b\x52\x63\x7f\xe5\xb1\xbd\x51\x5e\xcf\x23\xff\xab\x1e\xbb\x7a\xdb\x9e\x5c\x5c\x9d\x5b\x75\xcf\x7e\x6f\xf7\xe0\x5a\x69\x51\xe2\xb5\x07\x71\x72\x13\x8a\x85\xf1\xbb\xe0\x44\x9e\x81\xb6\xcd\xac\x2c\xcc\xce\x9f\x5c\xa8\x75\x1a\xec\x53\x1e\x7b\x78\xb7\x9d\x16\x69\x52\x5a\xf0\xbf\xec\xed\xe0\x84\xb3\x3c\xe4\x4d\xa7\x37\xba\xc3\x9e\x70\x67\x18\x3e\x31\x87\xbc\xb1\xb1\xc8\x6c\xf1\x2a\x57\xda\x48\xe1\x7a\x46\x91\x07\xd9\x1d\xc5\x3e\xed\xb1\x7d\xf5\x28\x69\x88\xcc\xff\xe8\x8e\xec\x0a\xf0\xac\x53\xe9\x97\x78\x78\xb1\xb4\x20\xf1\xda\x36\x12\x7f\x68\xa5\x76\x34\x42\x9d\x7e\x7e\x4f\x3c\x8d\x5f\x99\xee\x36\xac\x31\xba\xcf\x63\x95\x66\xdd\x7f\xb3\xc7\x66\xb6\x6d\xce\xf1\x39\xb7\xff\x8f\xcf\xb9\xad\x38\x1e\xad\x67\x22\x98\x6b\xf3\x24\x11\xf1\x03\x30\x17\xd9\xdb\x3d\xc6\x9a\x06\x29\xe7\x75\x1e\x3b\xba\x7d\xa5\xf5\xf3\x54\xed\xf6\x28\x54\x9d\x16\xaa\x73\x6a\x14\x06\xea\xaf\xe5\x8b\x68\xcc\xe8\xb6\xa0\x40\x00\x24\x17\x51\x27\xae\xc7\x6e\xdc\x6b\x45\x49\x8d\xbd\x6a\x82\x1d\x90\x8d\x5b\xe6\x45\xdb\x7f\xfe\xc4\x0e\xcc\x2a\xb7\xd1\xd3\x4e\x85\x3f\x59\x51\x97\xdd\xfa\x76\x33\x31\x0d\x79\x25\x70\x18\x93\x7b\x72\x9a\x59\x16\x16\x7b\x4b\x56\xbd\xab\x9a\x82\x4f\x41\x4c\xb2\xd3\xcb\x46\x58\xe9\x90\x27\x04\x98\x88\xe3\xbe\xc9\xaf\x20\x02\x55\xde\x42\x0a\xd0\x8c\x30\x2d\xba\x59\xb4\x11\xc5\xa2\x05\xaa\x3e\xc0\xd9\x60\xa0\x44\x26\x6c\x58\x22\xa5\xfa\x97\xe7\xb0\x61\x57\x10\x19\x39\xfd\x97\x4e\xad\xc1\xd1\x11\x36\xa4\x8b\xde\x66\xe5\x07\xbb\xbc\x68\xb3\x9f\xf6\xd8\x65\xf2\xc0\xb8\x99\x66\x6a\x26\xbd\x72\x27\x36\xaf\x65\xe7\x1d\x1a\x9c\x27\xb8\x57\x4b\x23\x44\xf7\x2e\x68\x61\xb3\x17\x79\xec\x60\x37\x4b\x7f\x08\x90\xfb\xfc\x1f\xde\x81\x16\xb0\xac\x9e\x76\xaa\x38\x8f\x3e\x07\x48\xd9\x8d\xc1\x91\x2e\x8f\x93\x56\xf4\xbe\xa8\x67\xa2\xc8\xab\xa4\x16\x74\x78\x57\x1d\xb7\x2d\x93\xa2\xd4\x7d\x51\xb9\x44\x95\x6d\xc7\xca\xe5\x80\xd8\x5e\xd3\x97\x87\x2a\x97\xf3\xbc\xe0\xb8\x99\x9d\x97\x66\xf9\x7e\x8f\x4d\xc8\x9d\xf5\x5d\x1e\x3b\xb2\xbd\x5c\x2e\xed\xab\x3f\x2c\x37\xd0\xc3\x66\xeb\x27\xab\x5e\xb0\x98\x14\x22\x6b\xf2\xba\x98\xb2\xab\x6a\x4e\x99\x4e\xce\xbd\x6b\x2d\x52\x18\x46\xe2\x2c\xf9\xa8\x6c\xc4\x97\xc3\xb7\x5a\x47\xcc\xa9\x1a\xfb\x98\xc7\xf6\x37\xe3\xb4\x7e\x46\x64\xfe\x07\x77\x72\xae\x38\x8e\x0f\x3b\x8d\xb8\xd7\xa3\xab\x25\xa1\x4c\x17\xcb\x53\x70\x8c\x10\xa6\xc5\xdf\x10\x5d\x48\x81\xa3\x11\x50\x05\x11\x0b\xbb\xce\x22\xc5\x00\xf0\xac\x97\x24\x51\xd2\x62\x5f\xf0\xd8\xc1\x16\xda\xc9\x9a\xb9\xff\x5b\x3b\x99\x26\x8f\x53\x8f\x97\x8c\xc9\xfa\x7a\x49\x93\xd7\x97\xcf\xef\xf4\x76\x5e\xaa\x8c\x6e\x82\xb5\x55\xfe\x82\x4a\xd8\xfb\x69\x2f\xfc\x6f\xde\x5d\xca\xe0\x07\x90\x39\x9a\x5b\x1e\x90\x83\x9e\x7a\x62\xf6\xd6\x85\x13\x48\x75\x85\x10\x3b\x16\x98\xe3\x85\x1c\x19\xd2\x0d\xd9\xd9\x62\x73\x86\x60\xfe\xa7\x65\x79\xd3\xe4\x31\x9c\x81\x43\xf9\xcc\x20\xe3\xe3\x47\x3c\x36\x91\x34\x73\x39\xa5\xb6\x5f\x13\x4b\x25\x07\xc8\xf3\xbd\xa5\x92\xfb\x23\x09\x96\xce\xdb\xf7\x71\xb1\x42\x3b\x69\xe6\xec\xe3\x1e\x9b\xc8\xd6\x1b\xfe\xaf\xed\xa4\x19\x2b\xb7\xce\x3b\xcd\x78\xb1\xb7\x72\xeb\xbc\x3b\x81\x56\x78\x23\xcd\x03\xb0\x89\x07\xf3\x62\xc4\x21\xf6\x7e\x9b\x49\xd9\xba\xad\x6e\x7d\xd4\x63\xfb\x50\xde\xfa\xef\xdf\x89\x06\xb9\x0a\xcf\x3a\x2d\x7a\xb6\x87\x17\x4b\x90\x80\x78\x6d\xbb\xf3\xdc\x45\xef\xa2\xf8\x1d\xa9\x89\x1d\xda\xc8\xbb\x6d\xa1\xbc\x0e\xfe\x96\xc7\x1e\xb3\x6d\x73\xee\xa2\x57\xa2\xac\xe8\xf1\x78\x60\x6b\xb8\xfb\x2e\xbb\xc8\x92\x61\x7e\x15\x6e\x5d\xd8\x56\xfa\xee\xfd\xec\xfb\xac\xea\x64\xeb\xbc\x5e\x4e\x39\xf1\x5f\xbe\x3f\xfc\x0d\x8f\x7e\x18\xd4\xfa\x92\x8d\xac\xd0\xc4\xdc\x52\xef\x81\xe8\x16\x4c\xd0\x2a\x20\x53\x0d\x18\x81\x61\x8b\x02\xad\xd0\x0a\xbc\x35\x68\x82\x22\x02\x6d\xa9\x9d\xc6\x8d\x80\x93\x26\x06\x4e\x3b\xed\x6f\xa7\xef\x11\x98\x97\xc1\xca\x4f\xd2\x44\xad\x79\x02\xa6\xcb\xb1\x0a\xb2\x0f\x0c\xb3\x7c\x3e\x8e\x49\xf7\xbe\xbd\xec\xc3\x1e\x3b\xc0\xbb\x11\x90\x9e\xfb\xef\xf1\xc2\xb7\x79\xb3\xcb\x8b\xc8\x54\x8f\x09\x3f\x85\x43\x56\xef\xb2\xd2\xd6\x05\x90\x1b\x61\xe0\x86\x1d\x4a\x1b\x86\x50\x47\x32\x0b\xcd\xd6\x21\x72\x5e\x3d\x9a\x97\x9e\x85\x01\x18\x96\xcd\x80\x85\xdc\xa9\x1a\x85\xb5\xd2\x85\xd8\xc2\xed\x2b\x8a\xd7\xf7\xf3\x5e\xf8\x71\xcd\xeb\x4b\x7d\x48\x7b\x92\xae\x32\xc4\x06\xf7\x84\x01\x16\x59\xef\x1b\x4a\x58\x6c\x26\xb0\xfe\xc8\x0f\x87\xd5\x20\x84\xef\x2a\xc2\x1f\xb7\x49\xa1\x0e\x05\x9d\x35\x4c\xdc\x1a\x54\xd4\x8a\x38\x81\x28\x6a\x59\x2d\x8a\x4e\x29\xbd\x42\x8b\x14\xe1\x57\x34\x9d\xb5\xd3\xc4\x1b\x69\xbf\x39\x1a\x3e\x72\x69\x80\x18\x7e\xb0\x8d\xf6\xab\x1f\xf6\x6c\xd8\x8a\x5f\xf6\xc2\xb7\x7a\x4b\x65\x9c\x0a\x6b\x44\x35\xd7\xfc\xa2\xf3\x89\x33\x14\x3c\x22\x27\x9e\x2e\xad\xaa\xe7\x1e\x76\x17\x00\xb6\xdb\x1d\x86\xe2\x46\x85\xd8\x42\x8c\x2f\x44\x9d\x9f\x7f\x07\xfc\x8f\x0a\xfb\x4f\xc3\x8d\x5d\xa8\xa8\x2d\x76\x78\x4b\xf8\x5b\x95\xf0\x3f\xcc\x53\xe4\x99\x63\xfa\x89\xe4\xed\x2d\x6f\xaf\xd9\x18\xd5\x2a\xf8\x9a\xc7\xde\xe4\x31\xbc\xe1\xff\x37\x2f\x7c\x3a\x74\x8e\x9c\x15\x0a\x0b\x03\x80\xbf\x08\x76\x0d\x40\x61\x6b\x98\x88\xff\xa4\x50\xd6\xa6\x55\xcf\x00\x08\xb3\xdf\x15\x99\x94\x38\xc7\x36\x8e\xd6\x8e\xd4\xae\x97\x53\xa7\x01\x5a\x52\xbb\xb7\x2e\x1f\x68\xa5\x69\x2b\x16\x4f\x35\x07\x9b\xc1\x57\x9e\x3c\x06\x3a\x76\x96\x1d\xcc\xa3\xa7\x89\x5b\xfb\x85\xc8\xfd\x6b\x55\x58\xf8\xf7\x41\xba\x48\xf4\x34\x3d\x90\x54\x51\x42\x84\x72\x23\x9f\x3f\x77\xd0\xa1\xc2\x18\x19\x5d\x00\x26\xe3\x9f\x3d\x18\x3e\x7e\xe8\x1d\x5b\x14\x97\xc8\xbd\x09\x28\x07\xc2\x7d\x23\x43\xdb\xa2\xe2\x8a\xba\x69\x03\x63\xca\xb7\x3c\x00\x3e\x71\x83\xcb\x0e\xb0\x0f\x4c\xb0\x3d\x9d\xb4\x21\xfc\x77\x4d\xa8\x0c\xa0\x9f\x9c\x38\x45\x48\x25\xc7\x02\x79\x2b\x58\x8f\x0a\xc3\xe9\x98\x0b\xf0\x6e\x01\x2b\xbb\xe2\x64\xc1\xc0\xf5\x58\x54\x0d\x3f\x5e\x12\xa4\xf5\x42\x85\x86\x69\xaf\xdc\x91\x23\x47\x8e\xc0\x1c\x3d\x72\xfd\xf5\xd7\xa3\x78\x6d\x88\x7a\xd4\x19\x7c\x10\x9e\x7a\xd4\xd1\xa3\x35\x60\x48\x83\x68\x94\x6e\x91\xa3\xbf\x09\x4b\x46\x7f\xac\xf5\x72\x5e\x45\x56\x35\x82\x14\xca\x4b\x77\xc9\xa1\x45\xed\x31\x08\x5c\x26\x51\xc4\xf2\xd5\x52\x70\xfd\x49\xf9\xb8\xf2\x0f\x43\x66\x2d\xee\x23\x1d\x70\xc7\x61\xa0\xb5\xc2\x97\xb4\xe1\x25\x15\x61\x0d\x1e\xc0\x29\x8b\x45\x8d\x90\xac\x43\x15\x9d\xb9\xcd\x1c\x16\xae\xe1\xcb\x23\xe8\x5d\xc2\x0f\xc3\xc2\xcc\x18\xe4\xa2\x94\x65\xf5\x87\x1e\xc1\xd9\xfc\xbf\x5e\xf8\x9b\x9e\xc2\xbb\x39\x16\x2c\x13\xb4\x0d\x95\x19\x63\x40\x3f\x00\xdb\xd8\xc0\x3b\x50\x1d\xf4\x10\x92\xf3\x9b\x14\x69\x8a\x0d\xe3\xeb\x79\x1a\xf7\x0a\x30\x6c\x28\x92\x44\xf9\xde\x64\xad\x36\x09\xa5\x19\xbd\xbb\x57\x34\xa7\x6f\x50\x04\x78\xe8\x92\x47\x50\xeb\xa8\x10\x1d\x23\xf1\xec\x9a\xe8\x84\x6b\xf0\xb0\x63\xf7\xc9\x92\xed\x15\xf8\x0d\x8f\x5d\xa1\x4e\xca\xc7\xe5\x34\x5e\x11\x4d\xff\x8b\x3b\x39\xd5\xac\xd8\x6f\x69\x04\xca\xd7\x7b\xf8\xa7\x13\x69\x5f\xe6\xed\x39\x86\x1e\x47\x73\x42\x47\x9a\x24\x82\x26\xa1\x28\xba\xc3\x78\xb1\x56\xef\xf6\xaa\xf4\x40\x0d\x39\x8f\xaa\xfa\x21\x79\xd3\x79\x8b\x9e\x98\x42\x58\x59\x0d\xf1\xa6\xe1\xb9\x6b\xec\x67\x3c\x76\xa0\xa9\x1a\xfa\xda\x9d\x9c\x45\x31\xf6\xd8\x6d\x26\x37\x53\xc1\xb4\x17\x53\x4b\xa8\xb1\xdd\xb4\x41\xcd\x84\x48\x40\x4c\xe9\xa9\x62\xe2\x5a\x5e\xc5\x59\x02\xd9\x20\x7a\xd7\x72\x70\xc4\x6b\xec\xb5\xfb\x86\xc6\x9d\x2d\x24\x1b\x77\xf1\xcc\xff\xd6\xde\x70\x16\xff\x2c\x1d\x61\x44\xb2\x11\x65\x69\xd2\x41\x16\xa2\x2c\x02\x8f\x2e\x3d\x40\xa0\x61\xda\x06\x36\x4c\x7f\xfa\xa9\xbd\x6c\x89\xb6\xe5\xe3\xe1\x8d\xf6\xb6\x3c\xac\x64\xfb\x5c\x38\xf7\xd4\xc5\xf9\x85\xa5\xb5\xc5\xe3\x8b\x0b\x2b\xce\x2e\xf7\x81\x09\x95\x9c\xf2\xce\x89\xf0\xcd\x13\x77\xa9\x5a\x59\x44\x6d\x8f\x3c\x7c\xd7\xec\xca\x53\x97\x66\x4f\x2e\xe0\xd0\x89\xb3\x5d\x9e\x34\xb4\xf9\xb1\xb0\xc1\xd4\x94\x8a\x33\xac\x3e\xb9\xc6\x1a\xd5\x9b\x24\xa4\x65\x25\x7d\x7d\x9c\x1f\xfa\x1a\x41\xaf\xeb\x0e\x33\x7c\xcb\x72\x92\xc6\x1b\x4a\x7a\x19\x5d\x99\xbe\x13\x25\xdd\x5e\x51\xce\x6d\xec\x25\xf5\x36\x4f\x5a\x6a\x9d\xda\x8d\xc3\x84\x46\x25\x7f\x44\x5e\xe7\x5d\xcd\x98\x1b\x34\xd2\x9e\xfc\xf8\x23\x1f\x59\x0d\x22\x71\x2c\x78\xa4\xf5\x62\x2d\x58\xa0\x67\xad\x5e\x83\xef\x25\x90\x6d\xb4\x6e\xfa\x4c\x2e\x8f\x16\xcf\x1a\x31\x10\xfe\x35\x9d\x3c\x71\xdd\x40\x42\x98\xc6\x24\xf1\xb2\xa2\xeb\x8c\xde\x2b\x3c\x76\x10\x46\xef\x78\x96\x76\xfc\x7b\x3d\x36\xbd\x7d\x48\x12\x4c\x4c\x15\xcf\x67\x85\x98\x8c\x9a\x46\x93\xb9\x4a\x71\xb3\xe2\x66\x73\xe4\xfd\x18\x54\xb4\x6a\xec\x1b\x97\xb0\x70\xd4\x71\x67\x19\xf0\xe7\x57\x7a\xb1\xf0\x7f\xf3\x92\xf0\x4d\x9e\xf9\x3d\x24\xdd\x9f\xe2\x95\x0c\x00\x16\xa2\xd7\x07\x19\x64\x2e\xae\xf7\x0a\xa3\xf9\x2a\xf9\x3c\x8c\x03\x9b\x18\x37\x21\xb9\x51\x9f\x89\x02\x0d\xa7\x6b\xd6\xf8\x90\xc7\x6a\x5b\xde\xde\x0d\x91\xad\xbb\x0a\xdc\x8b\x19\xfb\xe0\x04\xbb\x3c\x49\x13\x25\x67\xef\x5c\x39\x91\xfb\x6f\x9b\x08\x5f\x34\xb1\xe4\x5e\xa4\xe8\x67\x81\xfc\x09\x3c\x2b\x22\x1e\x07\xbd\x2c\x56\xbb\x23\x1e\xa1\x6c\x62\x2f\x0d\xff\x5b\x0b\x82\xab\x72\xdb\x80\x8d\x6d\x46\xb1\x85\xe7\xa4\x66\x2f\x8e\xab\x41\x33\x02\x5c\xb5\x42\x74\x75\x74\xaa\xdc\x61\x56\x01\xbe\x50\x6a\xcf\x5a\xd6\x43\x8d\x10\x19\xba\xb0\xa0\x95\xcb\x2c\xcc\xf8\x89\x2e\x64\x21\x2b\x60\xf4\x39\xb4\x49\xad\xa4\x31\x50\x5a\x6a\xe5\x9d\xa8\xc7\xac\xdb\xb7\xe2\x01\xb4\x16\xc8\x61\x75\x4e\x9d\xb2\xc8\xbe\xc2\xd5\x32\x1b\xcc\x61\xad\xd2\x23\x47\x9d\x54\xe9\xc9\x2c\x1c\x4e\x05\x74\xf4\xb4\xdb\x00\xed\xb3\xdf\x9b\xe1\xdd\x28\x9c\xaa\x06\xd0\x41\x30\x45\xd3\xa2\x3d\x8e\x16\xe1\x6d\x1e\x3b\xa4\x4a\x04\xed\xdb\x7f\xb5\x17\x3e\x6d\xc5\xbe\x52\xc6\xad\xdb\x6c\x47\x85\xd0\x61\xf3\xd0\x79\x16\x4e\x71\x69\xda\x04\xc1\xac\x22\x5b\x91\x63\x4f\xf9\x88\xf2\x69\x29\x10\xfa\xe0\xa1\xb0\xf0\x20\xc6\x55\xf5\x6f\x3d\x76\xd0\x40\x09\xfd\x29\xaa\x3a\xaa\xeb\x9c\x50\xfe\x12\xb8\xcf\x60\x9d\x26\xaf\x9a\x74\x36\xa4\x38\xb6\xde\x51\x81\x36\x3a\x18\x4e\x9d\xd2\xf3\x5a\x30\x79\xd5\x4c\x33\x4d\x27\xcb\xf9\x9f\x56\xa6\x7d\x30\x09\x0f\x28\x33\xff\x8e\x8a\x1d\xd3\xe8\x77\x7b\x0c\xd7\x9d\x7f\x9f\x17\xbe\xc4\xbb\x4b\xfe\xe9\x36\x16\x2f\xe1\x22\xd2\xd3\xea\xc4\x09\x4c\x27\xa0\xaf\xcb\x73\x39\x2a\x2e\xb3\x05\xc6\xb2\x8b\x15\x21\xbf\x40\xb4\x2a\x6a\x1f\x32\x9c\x21\xb2\xcf\x6a\x01\x14\x3e\x1b\xc7\xe5\xce\x82\x88\xfd\x71\xd5\xfe\x3b\x8f\x1d\xd4\xed\xf3\xff\xcc\x0b\x3f\xa6\xad\x1b\xf9\x30\xec\x47\x6d\xfa\x40\x77\xbf\x4d\x56\xa8\x7b\x10\xcf\xc5\x9d\x5e\x5c\x40\x2a\xba\xb6\x19\x0c\x02\xe7\x24\x7d\x02\x7e\xb1\x68\xa6\x79\x4b\x96\x58\xd8\x31\x7c\x22\xe9\x75\x08\xb5\xdd\x19\x26\xf9\xbe\xb1\x48\xa8\xed\x72\x07\x33\xf4\xc3\x1e\x5b\xba\x60\x50\x4e\x79\x68\x59\x85\x1c\x94\xe5\x2c\xed\xe6\xa7\xb2\x5b\xd3\x34\xf6\xef\x09\xd3\xa1\x37\xec\x11\x29\x3d\x80\x07\x2a\xc2\xe0\x52\x3b\x96\xbd\x75\x16\x99\xc5\xfa\xa8\x9e\xeb\x66\x69\x57\x64\x72\xdb\x7a\xe1\x1e\x76\x64\x5b\x84\x18\x4b\xba\xc3\x26\xf6\xd9\x89\xf0\x44\xe9\xda\x4e\x36\x32\x58\x9a\xaa\x2a\xb6\x74\x1b\xba\xdd\x7c\xb3\xc2\x3e\xe1\x0d\x6e\x37\xff\xdd\x0b\xb7\xbc\x87\xcc\x76\x53\x0b\x82\xf0\xaa\x90\x24\x1d\x8f\xc7\x92\xd2\xbc\x5e\xaf\xee\x57\x79\xe1\x59\xb9\xd8\xdc\xb5\x7d\xc6\x0e\x2e\xb3\x44\xbf\x9c\x9d\xf0\x5e\x95\xb8\x4a\x5a\xa2\xa8\x06\xdd\x34\x97\xff\xed\x15\x55\x8a\x50\xae\x06\x40\x4b\x55\x05\x54\xc9\xaa\x3a\x8e\x9e\x4f\x05\x9f\x7b\x29\xbb\x71\xa7\x68\x41\xb0\xcb\xd9\x60\x41\x52\xb3\xf9\x5a\x65\xd4\xdd\x81\x55\xae\x39\x86\x33\xdc\x2e\x81\xf5\x90\x0c\xb6\xc0\xed\x47\xea\x68\x94\xd4\xd3\x4e\x17\x80\xe4\xd1\x37\x06\x90\x13\x0a\x30\x13\xcb\xd0\xf6\x2d\x92\xcf\x88\x4c\x04\x20\x09\x48\x52\xa4\xd5\x59\xd2\xbb\xc1\xea\x95\x03\x4d\x53\x16\xe1\x86\xde\xe8\x65\x16\xa6\x12\x44\x40\xdd\x2a\xea\xbc\x97\x0b\x17\x01\x86\xea\x0b\x13\x06\x30\xd2\x36\x04\x00\x4e\x72\xbd\xf1\x08\x9e\x11\x64\x30\x0c\x6c\x54\x4c\xe6\x41\xce\x9b\x18\xee\x99\xe7\x3d\x82\x0c\x20\x03\x2b\xf0\x63\xa8\xf0\x61\x32\xb0\x54\x89\xf3\x8d\x30\xf8\x63\xca\x21\x34\x5d\x51\xdb\xf2\xf4\x3e\x0e\x5d\xbd\xe5\x5d\x91\xb8\xeb\x31\xdf\xf2\x98\x79\xc1\x59\x58\xaf\x3f\xc0\xbe\xec\x31\xeb\xae\xff\x29\x2f\xfc\x55\x6f\xd1\xf4\x34\x61\x4f\x9a\xa8\x5b\x6c\xb4\x46\x80\x53\x96\x5c\xa4\x1d\xcb\xec\x51\x32\x41\x0c\x1d\x0c\x2f\xe8\x74\x60\x2d\x89\x04\x2c\xb9\x40\xac\x05\xc5\xf2\xc4\x1a\x38\x63\xdf\xe4\x96\xfb\xd6\xbe\x2f\x75\xde\x64\x52\x53\x62\x51\x8d\xac\xe1\x72\xb0\x08\x7f\xa2\xc2\x06\x3a\xc4\x7f\x5e\x25\x7c\xb7\x57\x12\x5b\x7a\x7f\x52\x8b\x90\xd7\x0b\x4d\xe7\xa5\x86\xc8\xe5\x78\x52\x80\x63\x69\xe2\x2c\x53\x82\x94\xc1\x72\x32\x22\x2b\x8a\xb0\xce\x51\x2b\x01\x4e\xd5\xa4\xa8\x42\xaa\x95\xd2\xdb\x1b\x3d\x50\x36\x35\x11\x72\x37\x05\xa6\x89\xbe\x3b\xf1\x9d\x25\x7b\x2b\x7b\xec\x78\x9e\xe0\xed\xc5\x37\x7b\x69\x85\xb9\xd3\xc7\xff\x67\x2f\xfc\x79\xef\xfe\xeb\x97\x07\xb9\x4f\x1e\xc3\x6e\x1e\x9d\x35\x38\xa2\x4f\x9c\x0e\x79\x71\x85\x5d\x6e\xa6\xd2\x02\x10\x94\xfe\x93\x17\x7e\xdd\x5b\x70\x2f\x82\x50\xc2\x25\x1e\xb8\x5c\x49\x28\x5f\xa0\xe7\x80\xa0\xc3\xa4\x37\x2b\x23\x7b\x90\xd6\xc1\xf8\xa3\x45\x0d\xc8\x0b\xf3\x55\x67\x09\x98\x99\x4f\xbb\xe8\x90\xd9\xef\xbc\x8b\xb6\x44\x5e\x04\xee\x20\xf2\xa4\x31\x93\x66\xc1\xc0\xa4\xa7\x7c\x3f\xa7\x3f\xcd\x3e\xf0\xb2\x9b\xd9\x7f\x1c\xe7\x02\xf0\xbf\x71\x53\x38\x3b\xab\x00\x0b\xe9\xc4\x54\x20\xb8\xa1\x13\xc9\xd9\x4f\x7b\x90\x88\x2e\xa7\x47\xd6\x4b\x94\x47\x9e\x8f\xcc\x23\xfc\xf1\x9b\xd8\xb3\x2b\xec\x50\x1c\x6d\x88\x44\xe4\xf9\x72\x96\xae\x0b\xff\xaf\x3d\xf6\xfd\x3b\x09\xc3\x59\x17\xe1\x47\xbd\x65\x00\x67\x89\xea\x52\xc5\x59\x57\x7c\xb5\x54\x27\x55\x6c\xcd\xd8\x9b\xb4\xc2\x97\x09\xb0\x48\xe2\xf9\x1e\x6d\x3b\xf2\xfd\x26\xa2\x4e\x0e\x49\x9d\x3d\x4f\x9f\xee\x66\x9a\x9d\x89\x53\xde\xc8\x67\xe4\x69\x4f\xfe\x67\x5a\xe7\x84\x5c\xa9\xab\x38\x0d\x5f\xcd\xd9\xab\xf6\xb2\xbd\x90\x5f\xe3\xff\xe8\xde\xf0\x47\x27\x4e\x28\x26\x42\x48\xb9\x29\x52\x0a\x21\x33\x39\xc0\x56\x0c\xd9\x82\xbc\x85\xa4\xee\x30\x55\xc0\x81\xdb\x8a\x36\x14\x6e\x2f\xc5\x91\x19\x7c\xcf\xe1\x50\x83\x89\x28\x64\x95\xad\x34\x9b\xdc\xf1\xf3\xf4\x72\x41\x9c\x5c\x10\xa5\x17\x75\x78\x16\xc5\x7d\xbb\x30\x1e\xd7\x82\x25\x6d\x6c\xef\x97\xab\x34\x7f\x6a\x61\x15\xa2\xcd\x14\x3f\x29\x6e\x82\xf2\xbe\x05\x91\x4b\xb1\x72\xb5\x60\x36\xe9\xe3\x4d\x22\x47\x44\xa2\x43\x91\x58\xea\x80\x82\x9e\x0e\x8f\xd4\xe0\xff\xa1\x6c\x25\x30\xbd\x45\x40\x1f\x57\x0a\x51\x26\x45\xbf\x44\xef\x63\xb5\x7d\xd8\xb0\x9f\x4f\xa2\x78\x69\xd5\x2c\xa7\x59\x71\xce\x7b\x34\xfb\x0f\x4e\x7a\xb0\x6c\xc5\x74\x87\x77\xa7\xcf\x88\x7e\xee\x7f\xaf\xff\x3d\xd3\xa6\x92\xf2\x0d\x36\x2d\x67\x62\x91\xd6\xd3\x98\x9d\xf3\x02\xf6\x88\xc1\xb7\x81\xa0\x79\x9f\xbf\xa7\xc3\xbb\xec\x9c\x77\x84\xfd\xc7\x21\x5c\xa5\x1d\x91\xb5\x84\xfc\x86\x7f\x85\x7f\x99\xfb\x81\x73\xde\xe4\x78\x7a\xd3\x03\xfe\x3e\x78\x9d\xb1\x37\x55\xd8\x65\x99\xe0\x8d\xc8\x2c\xce\x97\x56\x76\xbc\x38\xbf\x3a\x76\x71\x2a\x5b\xa8\x2e\x7f\xf8\x2a\x45\xf6\x20\x4c\x83\xd3\xd6\x53\x4c\x80\xcf\x1f\x12\x4b\xf7\xe5\x15\x76\x79\x2e\xea\xbd\x2c\x2a\xfa\xb2\x01\xe2\x6c\xe1\xff\xf3\x4e\xa2\x68\x56\xdd\x97\xc2\xdf\xf4\xd4\x15\xcb\xb5\x44\xe9\x89\xe4\xc6\x25\x91\x7a\xde\x2d\x42\x8b\xe2\x8c\xaa\xe6\x74\x1d\x3f\x39\xb3\xc3\x72\x0a\x9e\x9f\x81\xd2\x50\xb9\x9e\x96\x3d\xa2\xfb\x61\xb0\x54\xf6\x77\x1e\x3b\x84\x3e\x36\x0c\xfd\xc9\xfd\x3f\xf6\xc2\xc7\x39\x57\xca\xea\x06\xe4\x9f\x06\x0d\xba\x69\x25\xb4\x11\xe0\x94\x11\x78\xf6\x8a\x3c\xca\x66\x76\x60\x0a\xbe\xcb\xfa\xf0\x39\x6f\x7a\x9b\xf5\x72\xc8\xbf\x04\xab\xb1\xcc\x8b\xf6\xf9\x2c\x96\xcf\x4d\xb0\xfd\x22\xd9\x00\x13\xf5\x6f\x4d\x84\x2f\xd0\x52\xdc\x82\x63\xd1\xe1\x42\x3b\x73\x1c\xa0\x3a\x25\x25\x85\xf6\x38\xe8\x2d\x95\x0e\x8b\x9d\xe1\xbe\x8f\x60\x16\xa2\x50\x91\x3d\x02\x0a\x30\x4b\x8a\xb8\x68\x48\xf9\x06\x59\xac\x15\x7f\xcb\xb1\x9f\xa3\xcf\x0e\x6c\x9c\x00\xb7\x07\xe8\x70\xca\x6a\x1f\x25\xc6\x58\x43\x0d\xb4\x41\xba\x78\x9e\xa7\xf5\x08\xac\x2f\x9a\xd5\x25\xe6\x79\xa1\xaa\x0d\xb5\x29\xf8\x19\xf0\xa9\xd4\x45\x43\x1e\xca\x86\x05\x90\xf0\x24\x58\x48\x36\xb4\x73\x42\xe9\x8a\x50\x93\xe1\x65\xdc\x1f\x32\x7c\x01\x87\x11\xbd\x06\xec\x25\x15\xb6\x17\xdc\xff\xfe\xbd\x95\xf0\x7f\x79\xf3\x18\xa2\x89\x01\x01\x14\x98\x78\x7e\xcb\xd1\x0a\x55\x80\x52\xf2\x12\x1b\x9a\x36\xc6\xca\x13\xa4\x54\xb8\x83\x76\xd4\x6a\x4b\x85\x86\x10\xa9\x81\x41\x19\x39\xb3\x3b\x04\xa3\xa7\x36\x43\xa9\x78\x12\xf1\x43\x39\x4a\x03\x06\x4d\x09\x37\x15\x62\x1a\xcb\x53\x34\xf8\xa9\xe7\x45\x37\x4e\xfb\xc4\x27\x97\x34\x02\x79\x90\x17\xcd\x5e\xbc\x2a\x4a\x51\x41\x6f\xf3\xd8\x41\x2d\x10\xfd\x2d\x8f\x5d\xb5\x6d\x87\x9e\x50\x8f\x87\xf1\x6c\xdd\x72\x9b\x17\x6d\x61\xb7\x83\x94\x15\x12\x77\x30\xb4\x51\xa2\x09\x32\x20\x12\xc2\x52\xee\x54\x86\x2d\x4c\xe1\xa1\x92\x9f\xfd\xb8\x0a\x27\x7d\xb1\x17\xfe\x88\xed\x48\xb4\xf6\x21\x63\xb2\xcd\xed\xc8\xd2\x5a\xb0\xc0\xeb\x6d\x17\x12\x03\x11\x34\x60\xc9\xa1\x55\x49\x85\x9e\x82\xb5\xf3\xb0\x7e\x77\x6a\xf8\x34\x34\x5d\xf8\x3b\x1e\xdb\x9b\x17\x8d\x28\xf1\x3f\xea\x85\xef\xf1\xee\xd6\xee\xb1\x28\xb7\xab\x86\xfd\x20\xa7\x40\x1d\x89\x92\xd6\x7b\xcd\x26\xa5\xed\xc2\xeb\x83\xae\xc6\xac\x97\x60\xf8\xe4\x22\xa1\x02\xd9\xb0\x81\x72\xaf\x25\x24\x99\x11\xaf\xc3\x9a\xe2\xf1\x26\xef\xe7\xca\x6a\x13\x25\xc1\xc2\xa9\xe3\xda\xc8\x08\xe0\xd0\x83\xe4\x24\xff\xc3\x63\x8c\x02\x67\xe7\xa3\xcc\x7f\xa7\x17\xbe\xd9\xd3\xfb\xf9\x64\x1e\xd0\x3d\x93\x3b\x31\x2a\x38\x63\xa0\x29\x93\xb9\x21\x19\xb1\xa2\x34\x34\x08\xa2\x0a\xd3\xb0\x8c\x3f\x03\xcd\x82\xf9\xbf\xdd\xa0\x7c\x6b\x0f\xdb\x5f\x4f\x3b\x1d\x9e\x34\xfc\x6f\xee\x09\x3f\xb3\x67\x21\x29\xb2\x3e\x62\xed\x80\xf8\x40\xfd\x56\x20\xaa\xa3\x2d\x8a\xdb\x22\x8e\x89\x0e\xc5\x12\x0e\x93\x79\xb0\xb0\xb4\xb6\xf2\x84\xe5\x53\x8b\x4b\x6b\x0a\xb6\x1d\x75\x16\x33\x2e\x90\xf0\xd2\xc0\xe8\xb9\x0b\xf2\x49\xd7\xad\x4e\xb6\x76\x95\xff\xdb\xbd\xc9\x17\xac\x06\xa2\xb2\x13\x25\xf2\x80\x3a\xdd\xe0\x05\x9f\xb6\x0e\xbc\x28\xe7\xc4\x34\x4d\x93\x69\x9e\xb5\x20\xb7\xde\x52\x87\xae\xa4\x28\xfd\x69\xae\x9f\x8a\x92\x69\x3e\x0d\x93\x64\x8c\x31\xf6\xf9\x15\x76\x39\x4c\x9b\xe5\x5e\x1c\xa3\xc3\xd8\xff\x3b\x2f\xfc\x33\x0f\x02\xf0\x82\x6e\x2f\x8e\xc9\x33\x5c\x0b\x4e\xa1\x9b\x63\x16\xd6\x69\x35\x58\x12\x40\x9f\xbe\xd8\x5c\x4a\x8b\x65\xf4\x1b\xb8\x3e\x01\x7c\x50\x4e\xbd\x63\x04\xeb\x55\xf0\x96\x83\x09\x01\x71\xb0\x76\x01\x06\x55\xf3\xfe\x50\xa9\x07\x76\xbc\x2b\xa1\x24\xd9\x4d\xf8\xdb\xee\x89\xcf\xef\x61\x07\x41\x3c\x9d\x4a\xea\xc2\xff\xf8\x9e\xf0\xfd\x7b\xee\xb6\x46\x7c\x40\x40\x68\x4c\xb3\x38\x25\xaa\x7d\x14\x6e\x75\x4a\x92\xe3\xcd\x42\x2e\x49\x34\xbd\xae\x0b\x91\x04\x69\x57\x28\xfd\x42\x5b\x35\x20\xd6\x59\x01\x0b\xa3\x70\x24\xab\xa8\x29\x31\x2f\x32\xc1\x3b\x38\x4b\x33\x01\xbc\xbf\xb2\xa8\x80\xd7\xb3\x34\xcf\x8d\x42\x84\x85\x05\xb9\xc0\xf8\x39\x58\x8b\xba\x45\xd0\xef\x36\x89\x94\xfe\x1a\x55\xcb\xb1\xab\x80\x0e\x56\xd5\x30\xc1\x81\x6c\x72\x4c\x81\x5d\x59\x5e\x28\x00\x30\x0a\xd5\x26\x8a\x97\x46\xa4\x4d\x44\x22\xa1\x9a\xe6\x54\xd5\xa4\xa1\x03\xed\xe4\xec\xb6\x0a\xa4\xa2\x1a\x51\x4e\x46\x80\xbc\x6a\x31\x97\x41\x47\xab\x9a\x42\x57\x2b\x1e\x27\x2c\x9d\x2e\x59\xc5\xd9\xaa\xa4\x36\xb7\x98\x8d\x09\xd8\x73\xd4\x66\x52\x75\x0e\xeb\xdd\x2c\x05\x60\x2a\xd2\x12\x06\xb6\x2d\x4b\x4c\x68\x92\xad\x11\xbb\x94\xb3\x49\x3d\xcb\x63\x13\x45\xd1\xf7\x9f\x16\xc6\x3b\xde\x72\xd7\xd6\x9e\x00\xfb\x6d\x54\xe4\x22\x6e\x56\x03\x1e\xe7\xa9\x09\x3f\x9c\x84\x0a\x4d\xd2\x89\x05\x69\xb1\xc6\x6f\x94\x7f\xe3\xb1\x4b\xf1\x28\x74\x32\xed\x25\x45\xee\x7f\xc5\x0b\x6f\x5b\x4e\x1b\x06\x5b\x24\xa5\x54\x09\x9d\xe4\x6c\x8b\xf8\x66\x14\x0b\x42\xdf\xdd\x46\xd5\x3d\xc2\x6a\xac\xba\xc3\xc3\x11\x54\xe5\x9c\x57\xdd\xe6\x6c\x74\xa9\xcf\xa0\x6a\xe7\x7b\x34\xfa\xa3\x3d\x6c\x0f\xcf\x5a\xb9\xff\xb9\x3d\xe1\xfb\xf6\xcc\x92\xd0\xd4\x50\x83\x42\xef\xb3\x43\x37\xd1\xb9\x93\xf3\xbb\xbb\xe7\xee\xee\x39\x76\xf7\xfc\x13\x27\x7c\xe4\xb3\x3b\x49\x35\x1d\xc6\x01\x1a\x6e\x79\x73\x69\xa7\xdb\x2b\x4c\x74\x45\xae\x16\xbb\xe5\x06\x33\xe7\xf3\xfb\x65\x6b\x04\xb5\x15\x7b\x08\x0f\x43\x16\x2d\x92\xb5\x73\xb2\x8f\x4e\xb0\x47\x14\x22\xeb\x90\x0f\xe2\xa4\xc8\x73\xa9\x2f\xf0\xa2\xed\xdf\x37\xe1\x84\x74\x2f\x0f\xd0\x5b\xaa\x30\x60\x73\xc5\x9e\xfa\x56\xa9\x41\x07\x8b\xd5\xb3\x77\x33\x8b\x8a\x42\x24\xe8\xe2\xc3\x1c\xa0\x6d\x25\xd3\x49\x55\x86\x79\x37\x4a\x0a\x01\x8b\x0f\x45\xe5\x7a\x16\x89\xa6\x76\xb2\xf3\xa2\x97\xbb\x0e\x91\x3c\x17\x19\x54\xa7\xc9\xa3\xb8\x97\x09\x55\xad\x5a\x70\xb7\xc6\x2a\xef\x25\x08\x6a\x4d\x36\x22\xe4\x79\x6f\x6a\x86\x40\x00\x63\xba\xf6\xc8\x8d\xd7\x51\xcc\x3e\x2c\xbe\x22\x2d\x78\xac\xdb\x18\x8b\xa4\x25\x7b\x0a\xf7\x6f\x1e\xc7\x03\xf9\xd1\xeb\x02\x03\x7f\xb1\xe2\x47\xaf\x3e\xb3\xee\xaa\x56\x33\x0d\xb1\x31\x63\x75\xdf\x74\x9c\xb6\xb6\x3b\x68\xfc\xcf\x09\xf6\xef\x87\x8c\x23\xea\x7c\x1f\x9f\x08\x3f\x30\xb1\x48\xee\x24\x8d\xf1\x3b\x6c\x80\x0c\x6e\xb8\x32\x2b\x35\x6a\x88\x1b\x03\x35\xef\x91\x32\x04\x66\x39\xc2\xcb\x1f\x3e\x7b\x1c\xcb\x54\xe9\x74\x8c\xde\x7c\xf5\xc9\x34\xc1\xe8\xfc\xbc\x87\xf1\x14\x52\x01\xa0\x01\xaa\x05\xc7\x79\x1c\xaf\xf3\xfa\x99\xb5\xf4\x44\xda\xca\x4f\x91\x0b\xcd\xa9\x0b\x98\x80\xea\xed\x5e\x72\xa6\xe4\xa9\x49\x5b\xc4\x2e\xa6\x6c\xba\xc3\x1a\x0c\x73\x58\x6b\x42\x2a\x9c\xde\x94\x22\xce\x46\x85\x71\xfd\x53\xae\x0b\x7a\x24\xad\xf2\x73\x7b\x40\xaf\x3e\x72\xed\x0d\x38\x3d\xa4\xec\xbb\xe1\x48\x10\x47\x89\xc8\xe9\x6c\x29\x14\x72\x5a\x87\xc7\xb1\x5c\xed\xf6\xc0\xcb\x8e\xde\x6e\xa0\xff\xc8\x63\x13\x22\xd9\xf0\x3f\xef\x85\x8b\xca\x1a\x38\xdc\xf2\x47\x49\x17\x83\x06\xc0\xf1\x7b\xfc\x0f\xb0\x29\x36\xb9\xc3\x58\xd8\x9d\xef\xd7\xf2\xc9\xf1\x8a\xc0\x7e\x1f\xf2\x7a\x18\xfb\xec\x1e\x76\x29\x68\x76\xbd\x2e\xfa\x07\x3e\xbc\x67\xc7\xfe\x81\xd7\xec\x59\xb5\xde\x74\x10\xa2\xc9\x34\x24\xd5\x22\xa9\xb4\xd3\x74\x6b\xf6\x62\x70\x39\x45\x45\xc4\xe3\xe8\x69\xa4\x4c\x5a\x67\x98\x24\xd5\x30\x09\xe9\x3a\x45\x6d\xe8\xe3\xba\xd2\x4c\x91\x4c\x03\xbc\xa0\x6e\xc9\x46\x35\xb5\x1c\x0a\x55\x5d\x91\x01\xcf\x61\x95\xf8\x06\xb4\x1f\xc2\x71\x63\xc2\xeb\x3a\x99\x64\x18\x59\x7c\x43\x04\x8d\xa8\x09\xbb\x77\x41\x9f\xb4\x39\xaf\xb1\x0b\xd6\x45\x2b\x4a\x14\xb5\x26\x27\xbc\x1b\x6d\xfb\xaa\xa2\xe5\x36\x2a\xc8\x0c\x02\x26\x33\x0e\x68\x74\x44\x56\x91\x06\x60\xed\x03\x55\x5f\xae\x46\x9e\x75\xa4\xaa\x2d\x0f\x0b\x55\x94\x90\xe4\x9e\x06\xe8\xfe\xfe\x34\x41\x72\x77\x89\x9e\xc1\x54\xff\x41\x75\xaa\xbc\x8e\xb1\x1f\x7c\x20\x09\xec\xfc\x0f\x1e\x0c\xef\x18\xff\x88\x4d\x8e\xa8\x48\xfa\xc0\xee\x86\xd1\x46\xe0\x60\xec\x66\x11\xa0\x3b\x1b\x8e\xe2\x3d\x45\xbf\x2b\xb6\xbc\x03\xb7\xaf\x9e\x5a\x5a\x2e\xa7\x62\xfd\xe6\x01\xf6\x92\x0a\x3b\xd0\xcd\xa2\x34\x8b\x8a\xbe\xff\xcc\x8a\x4a\xc7\xfa\xba\xa7\x2e\x52\x3c\x2e\x25\xff\xa0\x29\x5c\x29\xab\x3a\xb5\x26\xea\x74\xd3\x0c\x68\x9a\x34\xf8\x37\xd5\x10\x98\x9e\x33\x9c\x64\xb0\x14\xf2\x5a\x70\x22\xdd\x14\x19\x71\x3d\xe1\x9a\xa8\xa7\xe0\x20\x95\xcf\x91\x65\x59\x7d\xbe\x16\x28\x6e\x48\x1b\x27\x38\xed\xc8\x6d\x1c\xec\x6a\x4a\x76\x62\x2c\x79\x5e\x17\x09\xcf\xa2\xd4\xa6\x47\x6c\xc9\x55\x00\xd0\x29\xd4\x22\x67\x3f\x3e\xe2\x26\x37\xbd\xc3\x63\xd0\x65\xfe\xcf\x78\xe1\x6b\x3c\xf9\x17\x75\xc0\xa9\xae\x48\x66\x97\x17\x01\x77\x30\x30\xe2\x84\xc2\x09\x75\x83\x5d\x32\xca\x56\x54\xb4\x7b\xeb\xb5\x7a\xda\x99\x39\x35\xbb\x38\x43\x65\x4c\xaf\x12\x8e\x23\xaa\x58\xeb\x71\xba\x3e\xd3\xe1\x79\x21\xb2\x19\x82\x60\xce\x67\xae\xae\x1d\xa9\x75\x1a\x57\x82\xc6\x8a\x50\x87\x36\x0b\xa5\x2d\xd3\xef\xf3\x98\x1e\x5d\xff\x75\x5e\xf8\x32\x4f\xfd\xa2\xa8\xc4\x48\xca\x16\xcc\x52\x83\x00\xf5\xc3\x51\x4d\xd4\x68\x53\x92\x52\x3b\x50\xa9\x38\x53\xc6\xb7\xad\xa9\xfd\x74\x24\xab\x00\xe3\x73\x89\xfa\x11\x25\x47\xa3\x47\x51\xfc\x26\x6b\xd9\xee\x11\xbb\xb2\x77\xb3\x4b\x30\x20\x13\x34\x43\xff\xb6\xf0\xd1\xd6\x4f\xac\x6f\xbb\xd7\xe1\x09\x1c\xb1\xe1\x20\x60\xdf\x77\xe7\x96\x53\xf0\x7b\x2b\x6c\x1f\x7a\xfe\xfd\x9f\xaf\x84\x6f\xa8\x10\x0b\x49\x29\x98\x7c\xc7\x83\x28\xf7\xe8\x49\xb9\x82\x26\x03\xab\x24\x08\xea\x36\xe8\x44\x10\x74\xd0\xa7\x5c\xf0\x66\x04\x30\x19\x30\xe9\x31\xd0\x0e\xa2\xe6\x12\x45\xf8\xa5\x1e\x83\x38\x04\x7a\x2e\x72\x63\x8e\xc9\x79\xf3\x60\x4f\xa0\x5b\xc9\x25\x71\x2c\x9c\x56\x84\xd4\x03\xa3\x90\x10\x25\x19\x69\x03\x03\xdd\xff\x02\xc6\xc6\x85\x3c\x0d\xa5\xde\xfc\xec\x83\x44\xbd\xf9\xcf\xfb\xd9\x5b\x0d\xdd\xc4\x4f\x7a\x6c\x6e\xc7\xa1\x5a\xbb\xd4\x94\xff\xea\x78\x17\x76\x99\x10\x1e\x22\x9c\x34\xcf\x55\x9c\x34\xcf\x18\x83\xfb\xb7\xa3\x05\x77\x51\xdc\xb4\xe7\xbc\xce\xf6\x84\x08\xb7\xfb\xb7\xdd\x4f\x7c\x9b\x8c\x7d\x6d\x0f\x3b\x3a\x8a\x6a\x13\x38\xfc\xaf\x36\xbd\x94\x45\x75\x0a\x5e\x7f\xe7\x9e\xf0\xa5\xde\xe0\xf5\x12\x4d\x8d\x62\xdf\xc4\x59\x0c\x0a\x78\x07\x9e\x56\x69\x0e\x18\xe4\x66\x05\xf2\xd3\x2c\x3e\x2c\x65\x37\xa1\xd5\x54\x83\x76\x54\xe4\xd3\x5d\x91\x4d\xe7\x40\x30\x17\x00\x67\x7e\xb0\x98\xb4\x20\x58\x0d\x5f\x99\xaa\x6d\x79\xfb\xb0\xf0\x2d\x6f\x3f\x7d\x78\xcb\xbb\x5c\xe5\x53\x34\xb0\xb2\x8e\xa4\xfd\xcb\x0a\x7b\x8e\xc7\xd4\xc3\x7e\x7f\x7c\xa0\xf0\x40\xb7\x60\xc3\x21\xe6\x82\x84\xec\xf5\xaa\xc1\x4e\xf4\xbe\xdb\x0b\x6a\x57\x42\x35\x0f\x6b\xcc\x9e\xcc\xca\x15\xf5\x6f\x1f\xcf\x4b\x3c\x50\x9b\xb9\x2c\xcd\x73\x92\xbb\x58\xc4\x8a\xb2\x6c\xb2\x7b\x3d\x46\x7d\xe3\xf7\x47\xaf\x93\x31\x8d\x5c\xd4\x3a\x43\x78\x03\x8d\xa0\x56\x23\x14\x43\x5d\xd6\x82\x14\x36\xb8\xb9\xde\x37\xd9\xd1\x8a\xa4\x93\xfd\xe1\x5e\x16\x58\x5f\xa3\xb0\x03\x79\xbe\x96\x7f\xad\x8a\x2c\x12\xb9\xff\xbe\xbd\xe1\x9f\x57\xac\x0b\x43\x73\x36\xe5\xe9\x02\xef\xa6\x4d\x0a\x5f\xa8\x06\xa0\x26\x62\xca\x1c\xa1\x78\xe7\x33\x80\x77\xd6\xed\x62\xd8\xa3\x2c\x29\x4a\x7a\x69\x2f\x8f\xfb\x78\x14\x49\x15\xb4\x76\x70\x5b\xba\x19\xa4\xcd\x42\x80\x32\x84\x42\x0e\x9a\x65\xd7\x24\xca\x83\x9e\xa6\x73\xc4\xb8\x1f\x0a\x06\xca\xc8\x38\xa6\xfc\xec\xee\x4d\xb9\xd3\x86\x4a\x14\x82\x94\x9d\x6e\xa5\x33\x45\x9a\xc6\xf9\x0c\x56\x1e\xff\x79\xea\x7a\x96\xf2\x46\x1d\x14\xa3\x5a\x2b\x0d\xe5\x9e\xb7\xa9\x68\xaa\x20\x9c\x28\xeb\x61\x14\x39\x49\x61\xd9\x0f\x6d\xc1\xb3\x62\x5d\x70\x0a\x3a\x91\x6a\x06\x10\xa5\x92\xee\x0b\xfb\x9b\xa9\x88\x5c\x4f\x1a\xcb\x1c\xd8\x94\x20\xcb\x60\xcb\xbb\x22\xe6\x79\x71\x8a\x48\x6c\xd7\xa2\x52\x98\xf1\x5b\x2a\x2c\x61\xf8\xa8\x2f\xd4\x99\x6b\x19\xd1\x73\x54\xbe\x9a\xa1\xc2\xc5\xb8\xed\x44\xa7\xf5\x81\xbf\x0e\x7a\xd0\x74\x1f\x18\xb2\x74\xdd\x71\x10\x9c\x83\xcd\x3b\x3d\x36\x50\x27\xa9\x0c\xdd\x74\x01\x52\xfe\x64\x54\xcf\x52\x59\x40\xf8\x83\xe5\x22\x35\xc1\xa2\xfc\x1b\x6c\x01\x50\x33\x18\x76\xb3\x51\x52\xf5\x37\xb9\x6c\x89\x48\x14\xfb\x81\xdb\x88\x1a\x7b\x29\x63\x57\x59\x13\x9c\xc2\x62\x89\xb4\x78\x09\x7f\xa1\x95\x72\x59\x88\xcc\xff\xa3\x83\x61\x3c\x70\xd5\xcd\x64\x96\x17\x74\x10\x53\x91\xf1\x66\x33\xaa\x07\x45\x3a\x23\x6b\x56\x0b\x4e\x25\xb1\x01\xf1\xb3\x82\xeb\x61\x59\x40\x34\x94\x93\xa9\xe5\x0c\xe9\x9f\x1c\x60\x9f\x9d\x60\x97\x74\x53\x0d\x88\xe0\x7f\x64\x82\x3d\xf6\x42\xb8\x84\xf8\xba\x88\x35\xaa\xc2\xbf\x54\x0c\x48\x7d\x89\x7d\x18\x4f\x6b\x39\x61\x2d\x2c\xa7\x8d\xbc\x66\x07\x6e\x35\x53\x59\x4d\x88\x9a\x23\x46\x22\xf7\xf5\x5c\x74\x78\x52\x44\xf5\xfc\xd1\x41\xd4\xd4\x70\x08\xeb\xbd\x42\xf1\x58\x46\x85\x2e\x9c\x83\xb3\xbf\x91\xd7\x18\x5b\x6c\x06\x1a\x55\x48\xd5\x12\x15\xd9\x3c\xc5\xa8\x9e\x42\x05\xef\x0d\x0e\x06\x84\x34\x6d\xb6\xd3\x58\xe8\xa2\xc9\x9c\x95\x1b\x42\xdf\x65\xd3\x87\xca\x00\xa9\xbf\x98\xd3\x7b\x68\x65\x1f\xa8\x48\x2d\x38\xa5\xc9\x37\xad\xea\xef\xe8\x1b\x18\xcc\x30\x99\x07\xe9\x66\x62\x4a\xae\xb1\x9f\xf3\xd8\xfe\xa8\x0b\xd0\x71\xfe\x1b\xbc\x31\xd1\x7a\xee\xfc\x5c\x5c\x86\x57\xc2\x0e\xfd\xa1\x75\x77\x4a\xa7\x07\xc8\x6a\x0b\xf9\x9a\x1e\xb3\xfc\xd1\x2a\xfc\x0e\x9c\xf3\xb2\x4f\x13\x4a\xe8\x56\x98\x50\xf0\x83\xe6\x25\x1a\xf4\x6a\xec\xf7\x27\xd8\xc3\x92\x72\xb7\xdc\x5f\x53\x51\xe1\x7a\x58\xc3\x81\xae\x4b\x62\x49\x99\xce\xeb\x69\x57\xd0\x4c\x7b\x60\x67\xa3\x6e\x23\xcd\x49\x67\x40\x1f\xda\xb3\x51\x56\x1f\xbe\x71\xbe\xc5\xb1\x2f\x5d\x3a\x5a\x20\xa2\x99\x91\x94\xb8\xb9\x98\xe7\xb9\xff\xf6\x4b\xc3\xbf\xab\xd8\x57\x06\xd8\xdc\xe1\x22\x4d\x27\x7a\xb0\x6a\xc3\x0c\xd0\x81\x56\xa9\x86\x52\x09\xc7\x9d\xf9\x74\x84\x97\xa0\x84\x9a\x6b\x68\x8d\xf2\x69\xda\xb8\xa7\xe1\xf6\x69\x0b\xee\xa5\x6c\x78\x56\xfa\x2d\x25\xca\x6a\x2d\x14\xab\x6b\x8c\x78\x96\x85\x90\xca\xd6\x41\xc0\x14\x30\x53\x6a\x27\x1d\xe5\x30\xbb\x11\xcc\x40\xba\x0a\x4e\xb0\x4b\x22\x36\x75\xf3\x4c\x5e\xf6\x66\x54\xb4\xe5\xc1\x82\x53\x17\x99\xa0\x4c\x9d\xb7\x91\xe7\x51\x2b\x21\x9c\x62\xad\xa8\x60\x77\x38\x1b\xc3\x07\x0f\xb0\xaf\xa9\xa3\xd0\x1f\x8e\xd9\x6f\xb7\x1b\x4d\x38\x06\xbd\xce\x83\x73\x10\x6d\xb2\x0d\x91\x83\x1f\xd8\xa1\xad\xb4\xdf\x79\xc0\x0f\x92\xb2\x55\xd3\x3c\x69\x4c\xa3\x75\x65\xd7\x7c\xb1\x6b\xbe\xf8\xce\x99\x2f\x3e\x63\x13\x39\x7e\xd4\xbb\x48\x03\x46\x78\xaf\xa7\xb9\x1c\xb1\x33\x27\xf3\xef\x04\x9f\x63\x7b\x7b\xf3\xc5\x82\x3f\xa7\xf8\x1c\xed\xd5\x3f\x8c\x42\x56\xf3\x3a\x5a\xd2\x46\xb1\x3a\xfe\xc1\x7e\x07\x41\x88\x77\xbb\x39\x92\xe3\xe9\xb8\x7b\xe0\x96\xfd\xe5\xfd\xe1\x91\xd2\x35\x9c\xa3\xf5\x34\x8e\x89\x11\x2b\x6d\xba\xe1\xfa\x43\x69\x66\x5f\xbe\x6f\x57\x5e\x5c\xac\xbc\x38\xae\x68\x66\x6f\xde\x79\xa8\xdd\x90\x81\xdd\x95\x3b\x17\x21\x77\x16\x2d\xb1\x33\x26\x11\x7c\x07\xf4\xb1\xe7\xbc\x27\x6c\xbf\xda\xaf\xf3\xaf\xb5\xa8\xa5\xbb\xb9\x31\x4e\xba\x8b\xb2\x6c\x98\xfc\x83\x4b\xd8\x35\x63\x4d\xaf\x22\x6e\x0e\xf3\xd3\xbc\xe5\x92\xf0\x1f\xbc\x11\x37\x87\x38\x6b\x6c\x0b\x1d\xb8\x6c\x86\x7b\x6a\x02\xc8\x5d\x68\x46\x71\x0c\x39\xf9\xa0\xc8\x49\xed\xd2\xe0\x82\x21\x64\x48\x28\x6f\x39\xfa\x7e\x58\x0b\x02\x59\x1d\x9a\xa0\x52\x33\xe3\x71\x50\xe7\xb9\xa8\x06\xeb\x04\x99\x21\x3f\x9c\x9b\xe0\x59\x88\x36\x07\x6c\x49\x0c\x3a\x43\x84\x0f\xcb\x23\xd3\x1f\x5e\xcb\x61\xee\xa4\x37\x1d\xd8\x75\x27\xfd\xdf\x23\x5f\x77\xe5\xe2\x43\xc4\x9d\x74\x9f\x3a\x43\xbd\xc9\x63\x0b\xe7\xb1\xe2\x86\xcb\x2d\x38\x4c\x3d\xfe\x42\x7d\x4a\xb5\xa0\x04\xc1\x9e\xeb\xb4\x57\x30\x56\x9c\xf3\xee\xd9\x5e\x8c\x2f\xf9\x27\x94\xd2\x36\xa2\x92\xa3\x28\xb9\x87\x7a\xa8\xd8\x9b\x0f\xb2\x63\xdb\xf8\x1e\x6e\x93\x6f\xa5\x49\xc1\xe3\xe5\xb4\x31\x4b\x0f\x88\x0c\xb4\xba\x3f\x3d\x10\xde\x31\xe6\xbe\x8b\x14\xd5\xd6\x0f\x42\x02\x22\xd7\x8f\x6a\x42\xfb\xa1\x0a\xdf\x8b\xf7\xef\x0a\xa4\x8b\x15\x48\xaf\xf1\x94\xc6\xf7\x52\x2f\xbc\x1e\xfe\x2a\xe7\xae\x6f\x3f\x3a\xb6\xae\x78\x1b\x3b\xce\xe6\xcf\xcb\x85\x35\x62\x9a\xec\xca\xca\x8b\x90\x95\x99\x25\x2b\x9b\x17\xa5\x43\x86\x93\xaa\x20\x35\x2f\x8c\xc9\x55\x4e\x10\x7d\x84\x3d\x5f\x29\x35\x46\x3a\x38\x92\x0a\x67\x89\x23\xae\xd4\x14\x62\xec\x7d\x87\xd8\x95\xa3\x50\x6a\x2d\x14\x53\xff\x15\x87\xc2\xb7\x4d\x58\x17\xec\xb4\x12\x64\xdc\x18\x05\x45\x0b\x8c\x06\x88\x66\x6e\xb2\x61\x78\x20\xcb\x1a\xce\x6a\x8b\x08\x86\x16\x92\xaa\x7a\xac\x15\xa7\xeb\x3c\xb6\xe9\x6f\x17\x8b\x80\x37\x1a\x39\xa0\xdb\xda\x3b\xc6\x46\xc4\x55\x68\x40\x5e\x42\xb0\xb6\x1f\xd3\x54\x03\xd6\xed\xc2\x00\x18\xd4\x82\xc0\x6a\x31\x61\xb8\xa1\x5b\xdb\xaa\x6c\x12\xf7\x31\xd9\x5b\x20\xc4\x7b\x44\x40\x87\x56\x35\xe7\x35\x47\xa6\xbc\xbb\x71\xb4\x76\xf4\x7a\xf9\x47\x93\x6f\xa4\xe0\x3c\x18\xc9\xc4\x31\xb3\x71\xd4\xae\x02\x4a\x41\xcc\xe2\x49\x15\xa5\xf4\x3a\x29\xa4\xaa\xec\xab\xaf\xae\x6d\x79\xfb\xe5\x88\xac\x88\xa6\x23\xee\xbf\x74\x80\xfd\x99\xc7\xd4\x2d\xff\x8b\xe3\x60\x92\x07\x26\xc2\x8a\x68\x86\x6f\xf5\xe8\xaf\xb1\xa3\xa9\x0e\x1b\x17\x34\xa0\x68\x33\xb5\x3e\x33\x34\xad\xca\x62\xb0\x80\x8d\x1e\x81\xe8\x4c\x4c\x3f\x7b\xa1\xc7\x0e\x28\xc6\x12\xff\x19\xe1\xcd\x7a\x32\xa0\x76\x61\x4d\x5e\x87\x4f\x86\xe2\xff\x52\x17\x31\x76\xe7\x88\x22\xc3\x38\x6d\x76\xb7\xd8\x5d\x9d\xff\x3b\xb7\x8f\xb5\xad\x7d\xec\x07\x2f\xd6\x02\xfb\x3d\x63\x0c\xb0\xe7\xbc\x74\xfb\xdd\xeb\x84\x7f\xbb\xda\xbd\x2c\xb1\x36\xd6\x2e\x3a\x52\x36\x32\xf6\xf7\xdf\xcd\xfe\xfd\xb0\x6c\x16\xd9\x2d\xfe\xe7\xbf\x3b\x7c\xe1\x04\x86\x39\x44\x48\xf4\x00\x68\x61\xb8\x72\x30\x7e\x25\x4f\x3b\x62\x13\xb0\xc7\x94\xe4\x42\x11\x55\x0b\x30\x3e\x22\x57\x20\x1e\x2a\xa6\x3d\x13\x05\xf6\x38\x86\x53\x40\x82\x51\x16\xb5\x5a\x10\x36\x2f\x17\x0f\xe6\x21\xe1\x6c\x12\x1b\x52\x60\x11\xba\x0d\xc4\xe0\x50\xd4\x45\x3d\x4d\xf2\x5e\xc7\x5a\xb0\xc8\x59\x14\x6b\xb6\xd0\x22\xea\xa8\x7c\x0e\x8d\xbf\xa3\x08\x94\xe5\xe6\xb3\x22\x78\x0e\xa0\x8a\x4d\x30\xef\x42\x88\x19\xf8\xe3\x90\x53\xb7\x97\x34\x44\x16\x43\x5c\x33\xd5\xae\xaa\xed\x40\x18\x21\x24\x1a\xb8\xc9\x09\x4a\x10\xc0\x20\x1d\x05\xc4\x03\xa0\x81\xf2\x0b\xa6\x1f\x8c\xdf\xaf\x40\x8a\x10\x48\x6a\x51\x3b\xe9\x06\x18\x7a\xf2\x62\x5a\x34\x9b\x69\x56\x54\x01\x95\x90\xe2\x70\x62\xc8\x2c\xa9\x6d\x79\x7a\x1a\x6e\x79\x97\x45\x09\xf4\xcd\xb0\x90\xb5\x4f\x7f\x17\xbb\x5d\x45\xe2\xcc\xaa\x48\x9c\xea\x9a\x13\x80\x23\x7b\x93\xbc\x88\xd8\x3b\x6d\x9e\x6b\x34\x45\x37\xca\xa6\xc7\x0e\xc2\x23\x10\x5d\xd3\xbe\xc8\xe0\x9a\xc3\x6b\x3a\x88\x06\x3e\x8e\xc3\xb9\xc9\x73\x4a\xb5\x4f\x29\xee\x06\x08\x3c\x2e\x83\x6b\xf2\x8d\xbc\xe0\x9d\xae\xff\x63\x1e\xbb\xfe\x02\xbe\x0e\x1f\x7e\xfc\x9a\x8a\xe0\x71\x52\x36\x45\xe9\xfb\x52\x5c\x67\x90\xec\x8c\x35\x4d\x9b\xca\x54\x05\x49\xf0\x5d\x02\x8d\x0d\xd6\xfa\x5d\x21\xd7\x73\x6d\x8a\xfd\xb8\xc7\x0e\xc5\xdc\xae\xe7\xbd\x17\x51\xcf\xdb\x86\xd7\x13\x80\x5f\x65\x15\x92\xc2\x0a\x9e\xd2\x7b\x9b\x69\x86\x6e\x00\xbb\x93\xed\xa7\xc5\xe4\xdf\x1e\xde\x3c\x8b\xe1\xef\xd3\xa3\x93\x10\x84\x4a\x44\x54\x85\x9a\x04\x25\x5b\x1a\xde\xc9\x1e\x86\x72\x20\x4a\x5a\x8b\x49\x0e\x19\x32\xfe\x63\xc3\x6b\x16\xe7\x6d\xdc\x1f\xa2\xa9\x8e\xe8\x81\x2a\x92\x4e\x9d\x26\x56\xbb\xe9\xb3\xfd\xa7\x35\x4f\x3b\xc5\xbe\x14\x08\x05\x21\xbc\xef\x5e\x6f\x07\x39\xf5\x56\xd0\x5d\xb8\x0a\x5c\xab\xc6\xc4\x81\x93\x8a\x02\xb2\xac\xfe\xb1\x22\x05\xd2\x2c\x48\xa2\x38\x88\x9a\x88\x25\xac\x3c\xee\x45\x9a\xe0\xdb\xb5\x5d\x95\xe3\x62\x55\x8e\x1f\x62\x25\x21\xe5\x3f\x7e\x07\x88\x7d\xa5\xb0\xd4\xf0\x91\x6b\x86\xc6\x8d\x72\x16\xf5\x78\xca\x4d\x49\x0e\x7a\x6d\x57\xbd\xb9\x08\xf5\xe6\xb5\x1e\xdb\x97\xc1\x66\xe5\xbf\xd4\x0b\x9f\xe9\x41\x80\x93\xd9\xad\xb8\xfc\x3b\x03\x40\x61\xe4\xde\x86\xbd\x11\xcf\xdf\x52\x8e\x50\x17\xc3\xd8\x18\x48\x54\x2c\x50\x07\x32\x17\x19\x4f\x72\xcc\x4b\xd2\x79\xed\x5a\xff\x51\x87\x1d\x14\x3f\xb5\x7f\xeb\xee\x6f\xf6\x32\x29\xea\x60\xce\xf9\xcf\xd9\xb9\xa8\x23\xd2\xe9\x35\x10\xb0\x9d\x6e\x9a\x98\xf0\x61\xec\x7f\xb5\x2c\x6a\xc1\x6a\x79\xf0\xc6\x8f\x5d\x8d\xdd\xc5\xf6\xa1\x73\xc8\x3f\x11\x3e\xe6\x6e\x88\x5a\x42\x9f\xb7\xdc\x51\x0a\x7e\x46\x24\x33\x98\x69\x4b\x30\x17\xf0\x41\x1c\xc5\x15\x7d\x81\xe4\x9a\x6b\x01\xda\x0f\xf9\x94\xa2\xe1\xb7\x2e\x60\xed\x5f\xa3\xc0\x16\x02\x0c\xea\xe7\x59\x5f\x2d\x50\xe4\xa0\xcb\x04\xa5\x19\x9f\x55\x58\xda\x35\xd6\x65\xbe\xee\x95\x39\xd5\x51\xfe\x13\xc3\x93\x65\x68\x3a\xda\xa2\x90\x4a\x85\x92\x2f\x8d\x4e\x62\xef\x58\x26\x0c\x8c\xf6\x2f\x77\xeb\xe2\x94\x5e\xf9\x84\xf0\x84\x54\x0b\x4a\x9b\xf2\xe1\x25\xa9\xe1\xc5\xd5\xe0\x6e\x9e\x25\x51\xd2\x9a\xc2\xf8\x2c\xcc\x5f\xab\xeb\x81\x6a\x34\x0c\xa6\x5a\xb3\x27\xe7\x90\xf5\x89\x73\xde\xc9\xed\x0f\x06\x57\xf9\x87\xb5\x0f\x35\x0c\xb5\x07\x15\x5a\x53\xf6\x9b\xfe\xf5\xe5\x4e\x98\x3d\xc0\x11\x6d\xc8\xd5\x03\x99\xec\x28\xcf\xfc\x4f\x5c\x1e\x1e\x57\x3f\x4a\x24\xbd\x18\x9e\x16\xa7\xad\xa8\xce\xe3\x20\x5c\xe7\xf5\x33\x22\x69\x84\x26\x78\x1c\x35\x6a\x42\x93\xad\x6d\x79\x07\x09\x36\xb8\xc4\x5f\xf9\xe7\x97\xb1\x57\x79\x8c\xc9\xc1\xc5\x69\xe1\x3f\xd7\x63\x37\x8c\x9c\x28\x43\xeb\x39\xa7\x5f\x0e\x17\x4d\x41\x26\xbd\x62\xb8\x1b\xc4\x15\x3a\x86\xd0\x04\xcb\xac\xb1\x5f\x99\x60\x7e\x43\xdb\x9c\xd6\xd2\x6e\x1a\xa7\xad\xbe\xff\xd6\x89\xf0\x85\x13\x83\xd7\xad\x64\x0e\x75\xc5\xfe\x6c\x97\xe3\xb1\x09\x94\x05\x3c\x9d\x05\xb3\xcb\x8b\xb5\x12\x26\xa5\x29\xd7\xb2\x52\x59\x08\xbd\x1a\x41\xd4\x2a\x03\x81\x9f\xf0\xfe\xe1\x24\x0d\xf2\x34\x4d\x54\x1e\xb0\x95\x33\xb3\x71\xb4\x76\xf5\xb5\x53\xb5\x20\xb8\xbb\x0d\x20\x25\xe6\xbb\x75\x9e\x20\x87\xaf\xe2\x7e\x8c\x0a\x85\xfc\xb3\x99\x45\x05\xba\x97\xdb\x59\xda\x6b\xb5\xe9\xdb\xf2\xb3\x55\xcd\xfb\xc0\x8b\x42\x74\xba\x88\xd7\x20\x5f\x00\x67\x74\x64\x70\x04\xf3\x28\x46\x72\xbe\xa8\x95\xa4\x19\x24\xeb\x0f\xeb\x22\x8a\xa1\x6c\xa6\xbd\x44\xaf\x83\xa7\xa5\x09\x91\xe7\xa5\x0d\x60\x52\x52\x81\xc1\x52\xad\x14\xbc\x51\xbb\xaf\x04\x51\x63\xcd\x2d\x29\x65\xf7\xb6\xa3\xa4\x80\x29\x35\x9a\xa0\x7a\xe8\x94\xba\x4d\xbe\x17\x2e\xc1\xeb\x23\x26\x52\x09\x7b\xb5\x9d\x6e\x22\x2b\x1f\x2d\x17\x37\xca\xb3\xd7\x91\x0a\xf9\xa7\x2a\xec\x40\x3b\xcd\x0b\xc8\x4c\xfd\xb5\x4a\xf8\x4b\x15\xf5\xcb\x88\x0c\x35\xff\xec\x99\x41\x09\xe2\x0a\xaa\xd7\x9c\x7d\x01\xe9\x42\xe1\x34\x17\x69\xd0\x88\x72\xb9\xf0\x7a\x51\xde\xb6\x6e\x80\xa2\x02\xa9\xce\x18\x5c\x7d\x18\x04\x5b\x94\x04\xf3\x4b\xab\x68\x37\x9c\xaa\x05\x27\x15\xac\x9a\x79\x0f\x0f\x1f\x0a\x55\x04\xec\xcb\xba\xbe\x43\x83\x58\x9b\xbd\xa4\x05\xa0\xdf\xf8\x05\xc3\x33\xa4\x88\x43\xf1\x9b\x53\x86\x4c\x30\x4e\x37\x45\x56\xe7\x39\x8e\x72\x97\xe7\x39\x54\x0a\x42\xb4\x83\xc3\x2b\xc7\xe7\x82\xa3\x47\xaf\xbe\x66\x2a\x00\x88\xdd\xc1\xa3\xc8\xef\x7b\xec\x80\x9a\x1a\xfe\x27\xbd\xf0\x57\x3d\x3d\x51\x4a\x41\xc1\x36\x53\xd2\x52\xda\xc0\x96\x98\x6d\xd3\xed\xf5\x52\x38\x6f\x43\x20\x4e\x8a\xdd\x37\x71\x5a\x27\xe8\x58\x28\xce\x19\x2e\x85\x33\x95\xc8\xa5\x63\x41\xf3\xaa\xc9\xb5\x1a\x47\x75\xb1\xa4\x67\xb4\xe0\x52\xd8\x07\x2d\x5e\x22\x0c\x78\xb9\xc7\x0e\x62\xc2\xd4\x8a\x68\xfa\xcf\xde\x09\xda\x75\x79\xff\x5c\xd2\xef\x2b\xfb\x8d\xc5\x00\xce\x83\x3b\x06\x52\xea\x08\x09\xce\xea\x3a\xbb\x77\xd8\xed\x6c\x8f\x5c\x92\xfe\xad\xe1\xa3\x60\x69\x0e\xa1\xa1\x7a\xa2\xbc\xee\xbc\x66\xf9\x02\x1c\x42\xd2\x0a\x33\x7b\x82\xff\x95\x4a\xf8\xc6\x8a\xfe\x39\x74\x39\x94\x40\x76\x4c\x7f\x23\x57\x4a\x21\xb2\x6e\x26\xc0\xac\x52\x97\x27\x60\x4b\x45\xa9\xa7\x19\xc2\xdb\xc2\x45\x67\x18\x14\x9a\x3d\xec\xdb\x50\x1c\x20\xa4\xd3\xfa\x22\x10\xda\xa4\x11\xdb\x28\x22\xb8\x73\xcb\xb3\x9c\xae\xaf\x05\x29\x23\xce\x2a\x49\x1f\x65\x90\x75\x51\xe7\x5d\xbe\x1e\xc5\x40\xac\xae\x58\x6f\x7b\xb9\x71\xee\xf0\x22\x88\x05\x27\x5e\x2d\x05\xae\x8f\xe4\x73\xa8\xe1\x80\x28\x3f\x7a\xe4\xc8\x18\x96\xa1\x6d\x40\xec\x73\x51\x30\xf6\x75\xe6\x10\x28\x13\xcc\xe5\xc6\xd1\xda\x72\xda\x98\x8f\xf2\xac\x07\xba\xd6\xad\xbd\x46\x4b\x14\xfe\x87\x58\xd8\x1e\x72\x5d\x61\x0f\xd0\x6c\x49\xe9\x14\x8c\x16\x0a\x7e\x56\x0a\x20\x7a\x9e\x68\xc8\x70\x29\x40\xfc\x52\x03\x27\x9d\x1b\x50\xd9\x4d\x1b\x79\x39\xe5\x68\xf7\xe0\xbd\x6b\xeb\xdf\x8d\xb7\xbe\x3f\x0f\x9c\xcf\x57\x71\x46\x3f\xc2\x8e\x8d\xdc\x44\xc6\x0a\x04\x88\x2d\x9a\x75\x20\x3a\x94\xc4\x57\x09\x1b\xeb\xa2\xcd\x37\xa2\x54\x67\x72\x0d\x29\xa5\x06\x49\xc6\x14\x65\xd8\x1f\x93\x36\x32\xbe\x2e\x18\x5d\x78\xe3\x49\x63\x12\x8d\xfb\xda\x70\x5c\x52\xe8\x87\xd5\xe2\x9c\xf7\xd4\xed\x4f\x53\x37\xf9\xc7\xf4\x69\x0a\xab\xa3\x4f\x54\x43\xca\x2c\x9f\xaf\x7e\x62\x0f\xbb\x7a\x58\x7b\xc8\x17\xdc\x4b\x66\xf3\x3b\x73\x91\xad\x12\x2c\x18\x9e\x73\x73\xff\x4f\x27\xc2\xa7\x8e\xba\xe9\x08\x3e\x85\x27\x86\xa8\x2f\x4a\x15\x57\x94\x16\x4a\xda\x5a\x94\xf6\xea\x85\xda\x96\xb7\x27\xeb\xc5\x6e\xea\xee\x5f\x55\xd8\x19\x06\x97\xfd\x7a\x78\x17\xf0\x20\x45\xe5\xef\x40\xb6\xb4\x54\xe9\x1b\x51\xbd\x50\xa5\x42\x64\x26\x9c\x10\x74\xad\x95\xae\x67\x43\x1b\x21\xdd\xba\x59\x64\xdf\xf6\xd8\xbe\x8c\x27\x2d\x91\xfb\x7f\xeb\x85\xef\xf0\xf0\x6f\xd8\xc8\x75\xa9\xa2\x11\xd0\xe5\xb4\x19\xf4\xa2\x86\x5b\x22\x52\xc8\x2f\x36\x91\x0d\x09\xc4\x38\xe0\xeb\x17\x69\xd0\x4c\x33\x70\xa7\xd3\x19\xb5\x17\x11\x42\x2f\x38\x54\x2c\x30\x62\x28\xdd\x68\x67\xa0\xdf\x22\x81\xba\xec\x4e\x91\x34\x6a\x81\x22\xff\x06\x6b\x83\xd4\x59\xa1\x95\xce\x3e\x7c\x0d\x3b\xca\x66\xb6\x9f\xc7\x94\xfa\x34\xbf\x22\x3f\xca\xde\x7a\x19\xbb\xce\x8e\x47\x6a\x10\x47\x5d\x26\x5a\x11\xf4\x38\x05\xfa\xad\xf4\x62\x71\x77\x54\xb4\x4f\x29\x43\x7c\xee\xff\xe5\xa1\xf0\xd9\xde\xe0\x75\x14\xf0\x45\x4f\xaa\xdb\x69\x33\xb0\x6e\xc8\xc6\xac\x18\xea\xb0\xc5\x02\x0f\x8c\x52\xb8\x68\xa8\xc8\x0e\x3f\x23\x82\xbc\x97\xa9\x8c\xb5\x18\xc1\x85\xb1\x38\x80\x38\xcd\xb1\xac\x4c\xa0\x2a\xee\x66\x83\x7d\xe1\x52\xf6\x6e\x87\xad\xf4\x67\xbc\xf0\x85\x83\x6c\xa5\x16\xdd\xa8\x8d\x10\x94\x07\xeb\x02\xb1\xd4\xd2\x1a\xd0\xca\x62\xc4\x2f\x3d\x0a\x83\x4c\x57\x69\x17\xc2\xf0\x05\x42\x95\x54\x9e\x0b\x50\xe6\x54\xc0\x62\x9a\x08\x33\x78\xe3\xc8\x19\x3f\xe8\xb1\x4b\x8c\xaa\x91\xfb\x6f\xf7\xc2\x97\x79\x46\xd7\x70\xaa\xae\x50\x88\x76\x54\x79\xf5\xf0\x03\x5b\xfd\x37\x56\x18\x4b\xcd\xdc\x78\x45\x25\xfc\x7b\xcf\x9d\x13\x60\x67\x35\x57\x60\x75\xa9\xd9\x16\xb4\xd3\xf4\x4c\x50\xe7\x99\x20\x33\x7a\x30\x1d\xcc\xad\x2c\xcc\xae\x2d\x54\x83\x3b\x97\xe7\xe1\xdf\xf9\x85\x13\x0b\xf2\xdf\xb9\x53\x4b\x4b\x0b\x73\x6b\x41\x9a\x05\x57\x69\x66\x5e\xa8\x7c\x9a\x3b\x5f\x50\xa2\x08\x4d\x58\xd6\xc7\x9c\x5a\xc8\x49\x96\x91\xd1\xeb\x81\xed\xa2\x57\xef\xb1\x31\x6b\x5f\xb0\x27\xfc\xff\x26\x2e\x8c\xf2\x98\xb1\xe3\x06\x6e\xe4\x58\x30\x29\x35\xd7\x49\x8a\xe7\x87\x2c\x72\xbc\x34\x13\xa7\xad\x49\x4d\xd2\x8c\xa0\x98\x36\xb7\x31\xe9\xbc\x38\x59\x34\x81\xa8\xf9\x78\x55\xf3\x4e\x5b\x6f\xe9\xc2\x9d\x77\xec\x07\xec\x72\x67\x20\x86\xcd\x79\x52\x5e\x28\x17\x78\xd5\xcc\xf0\x1a\x28\xcc\xcf\x28\x73\xdf\x80\x8c\xe4\xcd\x28\x6e\xd4\xa5\x36\x53\x1e\x2c\x73\x42\xc7\x9e\x83\xad\x42\x24\x20\x54\x4c\xd1\x8d\x14\x9a\x96\x6e\x88\x2c\xe6\x5d\x14\xbe\xc6\x32\x51\x63\x6c\xbe\x4c\x47\x2a\x92\x7a\x8c\xd4\x6b\x28\x6d\xaa\x6e\xb3\x11\x91\x91\x14\x49\xc5\x2f\xbc\xa3\x89\xf1\xe6\x09\xb6\x17\x32\xbb\xfd\xd7\x4e\x84\x2f\x9a\x80\x3f\x2d\x38\x42\x98\x72\x70\x4d\x1f\x29\x80\xcf\xf9\x2e\x20\xfb\xa1\x3d\x4e\xce\xe1\x90\x62\xb2\xc2\x6a\x10\xea\xec\xe6\x46\x88\xa7\x83\xf0\xaa\xd0\x3c\x60\x53\x77\x43\xc4\x5b\x29\xc1\xdc\xce\xd4\x8d\x63\x4c\xd6\xb6\x3f\xad\x4b\x07\x71\xa4\x82\xad\x00\x6a\xd0\x29\xa8\xe6\x54\x64\xe0\xab\x86\xab\x7d\xdb\x2f\x1a\x92\x5b\x85\x16\x2a\x17\x2d\x70\xbe\x53\xe7\x64\x16\x07\x76\x2d\x58\x75\x86\x86\x4a\x73\xfa\x51\xce\xaa\x2e\xcf\xd0\x75\x81\x4f\x3a\x58\xee\xe1\x55\xa1\xa3\x29\x3c\x67\xdf\x50\xd6\xc4\x3b\x44\x7f\x2d\x05\x70\xc0\xaf\xee\x0d\xab\x27\x79\xd7\x3a\xde\x9c\x11\x7d\x3c\x69\x02\x30\xa0\xe6\x0f\x41\xe4\xf7\xda\x96\x37\x71\x46\xf4\xb7\xbc\x3d\xdd\x32\x70\xe4\x6b\xf7\xb2\x49\x26\x6f\xfa\x41\xf8\x5d\x44\x09\x45\x60\x80\x03\x7e\x8d\x0f\x4c\xb0\x3d\x9d\xb4\x21\xfc\x77\x4d\xa8\xf8\x0a\x1b\x19\x5a\xde\x0a\xd6\xe5\x91\x47\x69\x62\xb9\xb0\xb9\x68\x73\x9c\xdd\x98\x17\x23\x8c\x39\x4c\x9e\x51\xeb\x85\x3a\x60\x06\xeb\xa2\xd8\x14\x22\x09\x8e\x1c\x39\x72\x04\xa6\xd3\x91\xeb\xaf\xbf\x1e\x03\x01\x1b\xa2\x1e\x75\x06\x1f\x84\xa7\x1e\x75\xf4\x68\x2d\x78\xc2\xec\xc9\x13\x9a\x83\x00\xe0\x84\xb1\x64\xf9\x80\xf3\x72\x5e\x45\x18\x45\x8d\xb6\xef\xde\x25\x47\x0b\xb5\x67\x14\x9f\x0c\x76\xae\xca\x18\x3f\x29\x1f\xb7\x69\x64\x94\xd9\x43\xb1\xc8\x00\x12\x49\xd2\x8c\xa3\x3a\x45\xe5\xa0\x61\xd2\x30\xb2\xc9\xfd\x01\x23\x41\x0b\x05\xab\x2d\xeb\x80\x5c\xcd\x41\x33\x07\xc5\x42\xb3\x2f\x28\x12\x1d\xb2\x36\x60\x61\x66\x0c\x50\xfb\x2c\xe1\x61\xca\xe1\x47\x3c\xcc\x35\x1b\xf4\x13\xe6\x0c\xed\x38\x0a\xcd\xbb\xc3\xbb\xf0\x1b\xe7\x43\x2d\x38\x89\xf0\x92\x34\x60\x7c\x3d\x4f\xe3\x5e\xa1\x98\xab\xd5\x4d\x65\xdd\x29\x88\xd3\x3a\x10\xe8\x17\x09\x26\x6b\xb5\x49\xf3\x18\x2a\x9c\x46\x09\xc5\x29\x0c\xcf\xd8\xf3\xed\xdc\x01\xf6\x3d\x43\x96\xc1\x52\xda\x10\x90\xe8\xf0\xfb\x07\xc2\x53\xea\x87\xda\xf6\x11\x03\x42\x53\xcd\xc6\x31\x58\x2a\x95\x59\x17\xa2\xb2\x80\xa7\x03\x95\x4e\xa1\xf9\x9c\x11\x74\x71\x78\xb2\xc3\x1b\xf6\xef\x1a\x17\x2e\xc2\xb8\xf0\x3b\xb6\x71\xe1\xd7\xbd\x8b\x0b\x89\x7f\xb6\x31\x2d\xb8\x31\xf0\x0f\x62\xe3\x76\x6d\x75\x17\x6b\xab\x5b\x52\x99\x2f\x0b\xe1\x21\x85\x5e\x9e\xc8\x75\x6a\xab\x2e\x53\x6c\x92\xfd\xe7\x6d\xad\xff\x72\x79\x9f\xf3\x96\xb7\x37\x6d\x4c\xfb\x3f\x30\xcc\x51\xac\x04\x48\xd9\x96\xf1\xce\x4b\x58\x75\x28\xb5\x83\xe6\x9c\x98\xd3\xde\xf4\xd5\xae\xa8\xfb\xcf\xbc\x24\xbc\x63\xe4\x5d\x6d\x59\x28\xdb\x92\x20\xbc\xd4\x21\x3d\xc6\x97\xdc\xb3\xe6\x5b\x18\xfb\x50\x85\x1d\x28\x44\xa7\x2b\x47\xda\xff\xc5\xca\x0e\xfc\x22\xcb\x69\x63\x8d\x5e\x00\x43\xd6\xb7\x3c\xf5\x53\x9f\x91\x2c\xff\x87\x01\xd7\x2a\x88\x1a\xd4\x18\x3f\xd6\x05\x19\x55\x80\x25\x25\x4a\xf2\x5e\xb3\x19\xd5\x23\x0a\xc5\x90\xb5\x47\x8d\xac\x21\x0a\xc0\xbc\xa1\x9d\xaf\xe0\x67\x44\x6e\x31\x28\x82\x06\x1c\xf0\x40\x55\x63\x45\x34\x2f\x02\xec\xdb\x62\x19\x9c\xb1\xfa\xd0\x5c\xbe\xb2\x9b\x36\xa6\x55\x97\xb1\x7b\x2b\xec\xf2\x4e\x94\xac\x08\xde\xe8\xaf\x42\x5c\x45\xee\x7f\xd3\x53\x7a\xcc\x17\xbd\x93\x51\x12\x75\x7a\x1d\x2b\x58\x14\xa3\x2f\x50\x17\xc0\xed\x83\x07\x89\xd8\x94\x2a\x2c\x75\x86\x45\xa0\xba\x8e\x74\xb3\x7d\x83\x37\x93\xf4\x65\x21\x51\x61\x73\x00\xd5\x33\x9e\xb7\x21\x1d\x03\x79\x7f\x88\xb1\xc2\xf2\x26\xf2\x0d\x1e\xc5\x7c\x3d\x16\x2e\x25\xc0\x91\xe0\x70\xd7\x02\x8a\x1f\xf6\x42\xc0\x73\x70\x83\x43\x80\x2d\xd9\x3b\x78\xa3\x3f\xe5\x28\x01\x6f\xac\xb0\x03\x6a\xc8\xfc\x1f\xd3\x20\xe1\xdf\xf6\x56\xd4\x38\x0e\x80\xd6\x29\x4b\xa7\x7a\xcd\xd0\xf2\xf3\x00\xf6\x25\x04\x62\xb3\xbd\xb0\x4a\x33\x13\x67\xe5\x2b\x51\x11\x3c\x4d\x64\x29\x08\xa3\x5e\xa2\x75\x28\xb7\x81\x47\x1f\xd0\x99\xb0\xd9\xe6\xc5\x74\x94\x4f\xf3\xe9\xa1\xf7\x9d\x2e\x7a\xef\x04\x3b\xa0\xb0\xac\xfc\x9f\x9b\x08\x5f\x32\xe1\xa0\x51\x11\xda\xd5\x3d\x3d\x91\xf5\x71\x42\xcb\x13\x28\x2e\x16\x9a\x0b\xe6\x0c\xa0\x7b\x15\xc2\x92\x41\x8f\xb4\x0b\x33\x78\x58\x06\x78\xc8\xa0\x52\x23\xf4\x96\x06\xd0\xa2\xa3\xe1\xb2\x5c\x99\x34\xa9\x6b\xe4\x33\x06\x16\x56\xd9\xbd\x8e\x15\x52\xaa\xd7\x58\x95\x28\x41\xce\x7c\x33\xdd\xb0\xe1\x86\x77\x66\xb8\x10\xaa\xca\xe5\x8e\x94\x18\x4e\xed\xa8\x66\x69\x52\xaa\xcd\x79\x8e\xa0\xec\xbd\x8d\x48\x6c\xce\x10\x7c\xc9\xb4\x5c\x3b\xd3\x74\xc4\x9b\xc1\x8f\xcc\x5c\x09\xff\x4e\xab\x11\xc9\xc7\x05\x3f\xfc\xf1\x15\xec\xfb\x2d\x41\x28\xf7\xc8\x46\x2f\x26\x14\xb7\x65\x02\x8d\x47\x40\xad\xf7\x5c\x11\x3e\xdd\xb9\xa2\x77\xed\x0e\xef\x76\xa5\x02\x07\xfa\x97\x85\x35\x8f\xf0\x51\xe0\xf5\x35\xb0\xe1\x04\xac\x4f\x90\xfa\xd0\xfd\xe8\xb5\x45\x8d\x90\x74\x73\x29\x0b\x90\x2f\x97\x9e\x94\x7a\x26\x3c\xe1\x48\xf9\x0f\x5c\xf6\x6f\xd3\x11\xf3\x9c\x0a\xbb\xa2\x9b\x09\x39\x91\xa2\x34\x21\x32\x9a\x6f\x7a\xe1\x1f\x7b\xcb\xa5\xab\x4a\xfa\xd0\x2f\x29\x24\xd5\x8b\x49\x0b\x17\x1a\x68\xeb\x10\x41\x61\x31\x0b\x10\x6b\x21\xb1\x15\x52\xa9\x40\x4e\xb0\xac\x9f\xb1\xa5\xcd\xb0\x27\xe4\x5c\xef\x25\xf2\xd8\x54\x8a\x4f\x5a\x17\x05\x9f\x06\x7e\xdc\x2a\xc4\x2b\x68\x2c\xb5\xa5\x34\x59\xd6\xb5\xd3\xc5\x50\x68\xc3\xf4\x40\x68\xc3\xdb\x3c\x86\x83\xee\xbf\x5e\xef\x3b\x2f\xf0\xcc\x64\x49\x35\x45\x88\x3d\xe3\x8c\xb8\x05\x33\x66\xbd\xe8\xf1\xd8\x3c\x42\x4c\xf7\x90\x98\x86\x6c\x75\x2a\x5a\x8a\x52\x0b\xdd\x48\x05\xe0\xd7\xe3\xb9\x72\xdd\x47\x19\x6e\x61\x5d\x51\x77\xcf\x8a\xbb\x0a\xee\x45\x2a\xb8\x2f\xf2\x5c\x7a\x84\xff\x1a\xa6\x65\x7a\x84\x24\xe0\xd9\x7a\x54\x64\x3c\xeb\x3b\xd1\xc4\xbd\xbc\xc7\xe3\xb8\xaf\x88\x5c\x72\x04\xad\x05\xf2\x20\x29\x71\x4d\x12\x49\x49\x32\x19\x45\x04\x8c\x0f\x76\x6d\x7e\x66\x82\x1d\xc2\x8c\x49\x5a\x04\xfe\xab\x26\xc2\xe7\x4e\x38\x97\x2c\x2b\xe0\xa6\x4d\x60\xe8\x0a\xc9\xa1\x11\x50\x5c\x61\xd8\x61\x41\xba\x5e\xb0\x7c\xf5\xe6\x48\x56\x50\x4c\x8c\x4a\xfa\x03\xd3\x1c\x20\x5b\xd3\x44\x94\xbe\x48\x22\xb4\xc3\xb3\x33\xf8\xa9\xd3\x4e\xb5\x4f\x03\x40\x31\xae\xfb\xa8\x69\x85\x8e\x0c\x94\x24\x72\x15\x93\xa3\x0c\x0f\x51\x56\x2e\x8c\x16\xbd\x03\x2b\x08\x6a\x3b\xd0\x34\xe5\x16\x5c\x37\x10\x8a\x51\x16\xaa\x6a\x78\xf9\x73\xb6\x31\x68\x54\x27\xb9\x0c\x8e\xbb\x66\x86\x0b\x36\x33\x9c\xf3\x1a\xdb\x9f\x01\x67\xfd\xc7\xe8\x33\xa0\xa5\x1d\x94\xa0\xe1\x9d\x71\x2c\x9f\x0b\x3f\xf3\x30\xf6\x03\xa3\x74\x0c\xf4\x77\xba\x8a\xc6\x4f\x3d\x2c\xfc\x63\x6f\x7e\x61\x79\x65\x61\x6e\x76\x6d\x61\x3e\x98\x46\x79\x8e\xd4\x17\x54\xb2\x9c\x50\xee\xac\x77\xc2\x62\xe5\x7e\x33\x50\xdb\x99\x8d\xa3\x33\xce\x3b\xb5\xe0\x21\xa8\xcf\xec\x6e\x24\xbb\x1b\xc9\xee\x46\xb2\xbb\x91\xfc\x2b\xda\x48\x76\xcf\x60\xbb\x67\xb0\x87\xc0\x19\xec\x9c\x17\x6d\xaf\xcf\x1c\xf7\xe7\x2f\x4e\x9f\x41\xc8\x04\xb6\x75\x05\x3b\xb2\xa3\x79\x3d\xbb\xbc\xa8\x02\x49\xfc\x3f\xbb\x3c\xbc\xdd\xfa\x5d\x0a\x23\x50\x0d\xe6\x46\xa0\x40\x72\x0f\x6d\x09\x94\x6e\xa3\xbd\xf2\x86\xe7\xf0\xd2\x3c\x4a\x5a\xbd\x98\x67\x4b\xf0\x93\x99\x67\xb6\x3c\x90\x69\x52\xd7\x10\xd9\xba\xeb\xa3\xfb\xc2\x65\xec\x19\x8c\x49\x75\xa9\x95\x42\x3a\x75\x1a\xae\x9a\x5f\x6e\xcc\x0b\x00\xc8\xc8\x4e\x73\x82\x01\x48\xd7\xa0\xba\x62\x80\x13\x4c\x54\xcc\xeb\x98\xe4\x71\x3c\x39\x35\x26\xb4\xe2\x66\x22\x5f\x7b\x54\x78\x58\x91\xaf\x81\x52\x15\xf7\x32\x42\xaa\x51\xdf\xd6\x31\x00\xf6\xeb\xaf\xaf\x30\xa7\xe5\xfe\x4b\x2a\xe1\xbf\x78\xf6\x15\xed\x43\xa0\x6b\xc3\xcb\x0c\x70\xae\x72\xc4\xe8\x57\x94\x75\x45\xaa\x22\xfa\xa9\x3e\x40\x3f\xa3\x0a\x4a\xbb\xfc\x9e\x9e\x88\xfb\xa8\xea\x95\xbf\x49\x09\x87\x59\xa6\x32\x10\x4d\xfa\xa5\x8a\x3a\xb5\xc0\xdb\xa3\x42\x74\xa0\x74\x64\xf3\x55\x9f\x80\x4c\x17\xfa\xb4\xe1\xdd\x30\x9b\x86\x9c\xe7\xf5\x22\x0e\xe6\x4e\x2c\xa2\x6e\xd6\xe4\xa5\x0e\xfa\x39\xb9\x74\xe5\xb8\xfb\x6f\xf2\xc2\xe7\x78\xf0\xa7\x3b\xae\x79\xaf\x0b\x6c\x2e\x0d\x28\x2d\xc0\x27\x0e\x23\xa9\x7b\x52\x8f\x7b\xa0\x03\x89\xa2\x0a\x2f\x54\x83\x4d\x5e\xd4\xdb\x55\x32\xe6\x57\x69\x0f\xaa\x06\x5d\xbc\xdc\x10\xb1\x90\x3f\xf1\x5f\x13\xbf\x8f\xaa\x62\x37\x4b\xcf\xf6\xc7\xcd\x86\xdf\xf4\xd8\x5e\x98\x63\xfe\x87\xbc\xf0\x1d\x1e\xaa\xfb\x6a\x4a\x40\x46\x8a\x54\x78\xf0\xf2\xe0\x10\x2e\x80\xcd\x35\xea\x50\x1c\x96\x9a\xaf\x76\x1e\x27\x47\xf2\x4e\x3d\x61\x65\x9b\x6a\xc1\xf1\xd4\x8d\x5f\xaa\xe2\xb4\x96\x5b\x35\x21\x92\x98\x8c\x0e\xd2\x7c\x9b\x76\x80\xd7\x6a\x9d\xc7\xc2\x0d\x46\x69\x90\x26\xf1\x83\xe1\xa9\x33\xa4\x47\xc0\x80\xc9\xbf\x55\xa2\xb3\xae\x05\xad\x95\xe3\x69\x3a\x39\xf0\xa0\x25\x09\x26\x9b\x69\x2a\x17\x93\xf9\xca\x1a\xb3\x16\xba\x7f\x3c\xbc\xc1\x0a\xd8\x31\x50\xa9\x91\x23\x4f\x1c\x01\xa2\x08\xe6\x1d\x35\xa8\xcd\x18\x64\x02\x43\x64\x90\xff\xc4\xf0\x16\xf3\xab\x3c\x75\x5a\x2d\x91\x03\xfb\x28\x64\x0e\x43\xb9\x43\xd6\xeb\xc8\xf1\xfe\xed\x09\xe6\xe7\x45\x9a\xf1\x96\xa0\xc3\xcd\x6d\x3c\x6f\xfb\xbf\x3c\x11\xbe\x75\x42\x2e\xaa\x36\xcf\xdb\xf6\x1e\x23\x02\x7a\x5a\x49\xe3\xaa\x7d\x08\x2a\x09\x23\x24\x86\x97\x07\x1b\xb4\xbf\xc3\xfe\xa2\x08\xd0\xe9\x5c\x03\x30\x71\xb2\x4c\x0c\xd7\xea\x99\xa8\x41\x0b\x78\x05\x17\x3a\xa4\xd3\xa1\x60\x20\x6d\x59\xdc\xd3\xe3\x31\x6c\x77\x40\xf2\x1a\xe5\xc8\x24\x55\xe8\x7d\x31\xca\x29\x04\xd6\x38\x7f\x92\x80\xc7\xdd\x36\xd7\xa9\x5c\xea\x04\x55\x6f\x43\x88\x71\x9a\xd9\x39\x9c\x4e\x8a\x2f\x8a\x19\xbd\xb7\x6b\x8a\x71\xb5\xa7\x6b\x26\x5e\x0c\xdd\x22\x0a\xe4\xd5\x81\xde\x75\xb2\xc8\xc0\x9f\x82\xc9\x67\x8e\xf2\x00\xba\x73\x26\x3a\x3c\xb2\xd8\x43\xc5\x86\x48\x10\x05\x23\x68\x65\xbc\xd1\x93\x93\xcb\x99\xf4\x2f\xac\xb0\xfd\x34\x16\xfe\xb7\xbd\xf0\x9b\x9e\x1a\x98\x81\x25\x6c\x1d\xe1\xb7\x5d\xc4\xa5\x67\x47\x2d\xe3\x8b\x5e\xc5\x1b\x47\x83\xc3\x9b\x90\xf1\x1a\xc1\xd9\x2a\xe0\x3a\x77\x76\xa0\x0a\x56\xa4\xe2\x24\x99\x25\xa6\x5c\x01\xf0\xdc\x43\x6e\xdc\xf6\x00\x8e\xe4\xd1\x51\x38\x92\xfe\x6f\x5d\x1a\x7e\xca\x1b\x71\x53\x75\x65\x3d\x4d\x9a\x51\xab\x87\x61\xb2\x24\x28\x46\xe2\x5e\x56\x95\x27\xb6\x57\xa4\x1d\x5e\x44\x75\x38\xe1\x76\x78\x02\xe0\x49\x38\x00\xe0\xc9\x42\x8f\x1b\x1a\x0b\xfa\xd6\x4a\xb2\x33\xb5\x31\x4a\xaf\x14\x24\x1a\xac\xf3\x1c\xf9\xc3\x20\xbd\x0b\x48\xdb\x2c\xd6\x10\xd7\x2f\x7f\xee\xe0\xae\x85\x63\x37\x6f\xeb\x3b\x77\x54\xfd\x8a\x7d\x54\xfd\xbd\x8b\x3e\xaa\xbe\xc2\x1b\x09\x38\x4a\x9d\xfb\x1d\x39\xb8\x62\x16\xd7\xb7\xbc\xf3\xa2\x7d\x1c\x29\x94\x20\x16\xe6\x17\xbc\x7c\x64\x54\x8e\x52\x6a\x28\xb5\xab\xa7\x73\xbb\x8c\x18\x7a\xb0\xd9\x78\x6a\xec\xe5\x26\x85\xec\xb9\x1e\xbb\xfd\x7e\xe9\x08\x62\xe6\xcc\x35\x5e\x7d\x61\x21\x44\x0c\xc7\x8f\xb0\xba\xe0\x42\xe8\x58\x35\x7a\x6c\x30\x1e\x89\x76\x10\x85\xf6\x28\x63\x5f\xf4\xd8\xf7\x0e\x09\x73\xba\x6d\x6d\x6d\xf9\x36\xc1\x1b\x22\xf3\xff\xbb\x17\xde\x62\x7e\x3a\x7c\x81\xc4\x77\xde\xc6\x3b\x18\x07\x01\xe6\xb4\x28\x09\xe4\x2b\x52\xa3\x5f\x17\xb9\x3e\x85\x0e\x31\x67\x3f\x91\x5d\x45\x47\xbc\x30\xfc\x77\xa0\xd3\x61\x61\xa8\x67\xc8\x1b\xf6\xd2\xac\x2a\x43\xc3\x95\xe1\x23\x06\x1e\x36\x85\xd3\xd3\xaf\xab\xb0\xff\x34\xa4\x6d\x27\xa2\x4e\x54\x40\xf6\x14\x84\x98\xfd\xa3\x17\x2e\xb9\x97\xf4\xfe\xc2\x83\x4e\x94\xcc\x74\xf8\xd9\xa0\x97\x4b\xad\x12\x80\x07\xe9\xb4\x66\x4e\xb8\x5c\x45\x84\xa4\x09\x0c\x40\x6d\xcb\xdb\x07\x4f\xba\x87\xe9\x97\x79\xec\xc5\x1e\xa3\x3b\xfe\xb3\xbc\xf0\x31\xf0\xd5\x01\x78\x6a\x53\x97\x45\x79\xea\x33\x48\xa8\x94\xe9\x22\x12\x48\x4b\x6b\x9c\x47\xee\xd8\x60\xcb\x65\xd1\xec\x1b\x3f\xe0\xa4\x71\x93\xee\xac\x5d\x2e\x73\xab\x8b\xf3\x59\xb4\x41\x91\x78\xbf\xf6\x03\xe1\xd5\xce\x95\x31\xd1\x77\xfa\x39\x77\x63\xff\x3f\x57\xb1\x8f\xef\x65\x97\xf1\xa2\xe0\xf5\xb6\x4a\xac\xf0\xdf\xb3\x37\x7c\xeb\x5e\xf7\x9a\x43\xeb\x1b\xe5\xb2\x3c\x1d\x17\x0e\xe5\x9a\x10\x73\xa9\x31\xc3\xbb\x26\x2b\x28\x38\xac\x68\x2e\xa2\xc2\xe8\x26\x58\x59\x59\x92\x09\x22\x5c\xee\xad\xc7\x51\xde\xbe\x0b\x8a\x3e\x3c\x25\x05\x71\x3b\x6d\x4c\xa9\x68\x70\xcc\x53\xb0\xb1\x0d\xe8\x53\x0d\x01\xff\x58\xc8\x3f\x4a\x8f\x50\xf9\x6e\xf4\x20\x55\x5a\x9f\xbd\x49\xd1\x22\x56\x10\x13\xee\x8e\x8f\x77\x2c\x10\x19\x30\xeb\x70\x88\xfb\x4f\x8a\x28\xb6\x43\xe3\x23\x55\x0f\xc8\x94\x05\x66\xd0\x6e\x96\xd6\x85\x50\x40\x05\x1d\xa9\xa5\x49\x59\x05\x47\x02\xd9\x64\x71\x16\xd5\x96\x69\x7a\x31\x0b\xea\x29\x00\x1b\x20\x57\x46\x54\xb4\x87\xf4\x31\x84\x96\xc1\xc6\x3c\xbe\xaa\x1a\x4a\x66\x60\x20\xe0\x88\x25\x07\xa0\x30\x58\xc2\x7a\x6e\xac\x60\x86\x62\x7f\xd4\x81\x43\x87\xe4\xeb\xc3\x92\x61\x99\x2b\xd2\xa0\xc9\xe3\x9c\xec\xff\x03\xdf\xd5\x78\x31\x67\xa2\x2e\x64\xb1\x18\x9e\xc1\xb1\xcf\xcb\xe1\x13\x8d\x1a\x63\xae\x9d\x34\xea\x74\x7a\x00\x5e\xe3\x9e\x83\xbf\x54\x61\x87\x28\x7f\x80\x4c\xbf\x1f\xaf\x84\x1f\xa8\xcc\x93\xf0\xa0\x13\x96\x05\xff\x49\xdd\x4b\x16\x95\x1c\x0f\x75\x90\x8f\xb4\x99\x88\x2c\x6f\x47\x5d\x34\x83\xe8\xe4\x0e\x8d\xf3\x83\x2f\xd2\x60\x23\xdb\x02\x0c\x32\x66\x28\x35\x51\xf8\xda\x8b\x31\x38\xbe\x6a\x55\xcc\x4e\xc0\xe0\x0d\x44\x35\x02\xcf\x48\xc1\xa3\x12\x0f\x25\x58\xb9\xba\x6d\x6d\x17\xe6\xa8\x39\x22\xac\x76\x0a\xa8\x3b\xe0\x39\x25\x1d\x10\x11\xaf\x12\x42\xf6\x81\xd1\xc5\xd5\xe4\x7e\xdf\x41\x26\x19\xd7\xbd\x46\x78\xff\xec\x25\xec\xb2\x6e\xda\x58\x4c\x9a\xe9\xa9\xe4\x24\x00\x90\xbe\xfa\x92\xf0\xf9\x97\x2c\x36\x5d\x07\x90\xfb\xcc\xf9\x48\x0e\xd3\x11\xf2\x38\x64\x6f\xcd\x87\x21\x37\xa4\x9b\x36\x96\x78\x07\x3f\x71\xe7\xe2\x7c\x35\x10\x45\xbd\x36\x15\x34\x7a\x99\xee\x7f\x2b\x15\x11\x26\x38\xd5\x8c\xe6\x66\xb9\x58\x42\x0a\x07\x8d\xb7\xcb\x73\x3a\x11\x75\x30\x8a\xd1\xca\x5c\x82\xd7\xcd\xe2\xa5\x8a\x1b\x4b\x70\xa9\xc9\x3c\xd7\xa0\x50\xf4\x68\x43\x74\xe3\xb4\xdf\x11\x14\x1d\x89\x1d\x75\x07\xe2\x8d\x61\x2d\x00\x1f\xa7\x5c\x3f\x9e\x07\x38\x78\x73\x04\x3e\x42\x06\x06\x59\x89\xa5\xb4\x21\xca\xe2\x52\x2e\x97\x7c\xa0\x9e\x68\x63\xe9\xa6\x49\x0e\x00\x3e\xe0\xea\xe0\x19\xe4\xdd\x51\x34\x25\x64\xf7\xd1\x91\xc3\x85\xb6\xca\x49\x79\x28\xd7\x84\x8c\x1b\xc0\x91\x2a\xdf\xd4\x37\x65\x2d\xd5\xea\x55\xaf\x37\x07\xe6\x44\x6e\x4f\x19\x9a\xee\x98\xe8\x00\x69\x44\xad\x2c\xdd\xc4\x64\x49\x65\x85\x88\xce\x96\x92\x8e\xc2\x7a\x6e\x36\x48\xd2\x47\xbb\x69\x03\xe8\x98\xc2\x63\xf2\x83\x35\xb0\xec\x8e\x7b\x0e\x4c\x6a\xd6\xc3\x98\x80\x37\xea\x8d\x5e\xd4\x08\x8f\xd1\x79\xed\xb0\xbc\x70\xe7\xe2\xfc\xd4\xd0\xa7\x45\xb7\x2d\x3a\x22\xe3\x71\x78\x2c\x08\x65\x0b\x43\x25\x7b\xac\x0d\x23\x09\xf4\x63\x41\x94\xc4\x51\xa2\xee\xb2\x60\x9b\xff\xa1\x32\x04\xab\x9e\x9b\xf5\x8d\x18\x82\x55\xcc\x90\x02\xc9\x1a\xc2\xb4\x0d\x19\x1b\x5f\x47\x3c\x87\x26\x62\x53\x0b\x85\x28\xb1\xb7\xd8\xa3\xb5\xa3\xd7\xa9\xdc\x72\x90\x3a\x99\x9d\x39\x8f\x73\x4c\x65\x1e\x91\x24\x45\xab\xb8\x6c\x70\xb8\x2c\x15\x5c\xc0\x5d\x0e\x31\x6b\x72\xc1\x7c\x18\x2b\x7e\x22\x6a\x8a\x7a\xbf\x1e\x8b\x93\x00\xb6\x04\x3b\x83\x2e\xb6\xce\x93\x20\x16\x7c\x43\xe8\xb5\x11\x34\xa2\x5c\x6f\x47\x33\x69\x46\xd0\x63\x16\x68\x50\x2d\x98\xcd\x4b\x0d\x78\x14\xf0\x2e\x24\x93\x85\xae\xa1\x79\xbc\xea\x7c\x0c\x5a\xa8\x1e\x4a\x13\xcc\x4d\xc3\x1d\x15\x17\x31\xca\x08\xf0\x67\x73\x95\x9c\xa9\x77\x46\xb3\xce\x0d\xb2\x94\xea\x1b\x28\x08\xc4\x73\x94\x3b\x96\x2c\x60\x63\xe0\x72\x63\xee\xc8\x72\x60\x2a\x74\x79\xc6\x3b\xb2\x04\x8d\xc4\x81\xea\xdb\x0e\x77\xc2\x7f\x99\x60\x0f\x53\x72\x75\x45\x74\x51\x4c\xf8\x7f\x31\x11\xfe\xfe\xc4\x4a\xf9\xb2\x23\xa1\x1d\xc1\xb1\xc9\xa5\x96\x76\x7a\x40\xd2\x9c\xa6\x1d\xaf\x2b\xb2\x28\x6d\x90\x75\x0a\xb7\x6a\xb9\xa6\x09\x77\x1b\xa3\x16\xd2\x1c\xa5\x0e\xd9\x4b\x49\x80\xd1\x5e\xa9\x12\x37\xed\xfd\xae\x61\x39\x4f\x51\xee\x32\xb6\x94\x16\xe2\x58\x30\xdb\x84\xae\x96\x7d\x5f\x17\x79\xde\xec\xc9\x85\x13\x15\x11\x8f\x07\x85\x21\x54\x07\xf2\x89\x73\x71\x4f\x0f\x50\xc5\xa5\x6c\x94\x85\x0e\x3e\x4b\xba\x22\x0c\xbd\x45\xfd\xef\x42\x52\x09\x5d\xd9\x25\xb1\x49\x9b\x8d\x02\x53\xb3\xb6\x11\xa4\x87\x97\x2b\x33\xeb\x25\x60\xf4\xd4\x79\x11\x6a\xf0\x60\xbd\x49\x8d\xde\x31\x2a\xc3\xd7\x4d\x9a\x83\xd6\xe1\xe6\x56\x17\x57\x11\x69\x71\xb6\x0e\xd6\xbe\xb5\xf4\x8c\x48\xcc\x5a\x35\xf6\x60\x67\x06\x3c\x73\x1f\xbb\x9c\x96\xfc\x1c\xef\xf2\x7a\x54\xf4\xfd\xbf\xdc\x1b\x7e\x79\x6f\x79\xbb\x2e\x3d\xe4\xcc\x06\xd2\xb7\x07\xf7\x6c\x9c\x19\xe0\xd1\xd5\xfe\x58\x00\x25\xa1\x28\x17\xc7\xf4\x5f\x57\x45\xeb\x02\x07\x76\x45\x65\xbf\x46\xe1\x41\xa9\x27\xb2\x4c\xd9\xfa\x52\x05\xd5\xf9\x0b\x94\xe4\xba\xa9\xb6\xde\xb6\xa0\x9f\x05\x71\xe6\x95\x00\xdb\xa2\x4e\x47\x34\x22\x5e\x88\xb8\x6f\x2f\x6a\x44\xb4\xa4\x35\x16\x2c\x6a\x84\x2b\x50\x1a\xb2\x74\x23\x92\xca\x9f\x7c\x48\x8a\x49\xec\x0a\x15\x1f\x20\x67\xcb\x3a\x71\xbe\xd0\x4e\x0e\x84\x7e\xfa\x90\x30\xd8\xd8\xb6\x54\x10\x70\x06\x8a\x06\xa0\xec\x07\x79\x8f\xd0\x18\x47\x36\xb8\xc6\xd8\x6c\x0c\x87\x86\x22\xda\x10\x71\xbf\x6a\x17\x4e\xad\xd4\x12\x4a\x27\x9d\xe2\x9a\x82\x60\x83\x20\xcd\x70\x41\xa1\x0a\xa9\x53\x6a\x9b\x31\xe8\xe4\xd0\x92\x0c\x3b\x65\x60\xe4\x6c\xa5\x40\xd6\x1e\x92\x4b\x75\x13\xc6\x48\xa5\xc1\x29\x8f\xb0\x6e\xdb\x4c\xf8\x52\x0f\x0c\x99\xec\xa0\x7f\x34\xca\x2a\x9a\xb3\x04\xbe\xbe\x8f\x1d\x2a\xe4\x62\x59\x21\x1b\xa7\xff\x85\x7d\xe1\x5f\xec\x5d\xb3\x2f\x8d\x16\x7e\x89\x10\x0d\x44\x7f\x98\x54\x50\xa7\x80\x3e\x27\xd7\x3d\x94\xaa\xf2\x8f\xd4\xe1\x4e\x2d\x11\x30\xac\xa5\x10\xbf\x25\xa4\x9c\xe2\x59\x1f\x18\xd0\x44\x52\xd0\x99\xbc\x36\x44\xf5\x93\x5f\x57\xc5\x26\xe7\xa1\xf5\x8d\xd0\xf9\x48\xa4\x49\x3d\x4f\xd8\x5a\x1e\x4a\xb6\x21\x7a\x9b\xfc\xd0\xb1\xa1\xda\x4c\xee\x48\x9f\x1a\x56\x32\x3c\x16\x3c\x9d\x05\x41\x78\x13\xef\x35\x22\x91\xd4\xc5\x2d\x74\x25\x08\x42\x78\x22\x3c\x16\xdc\x04\x7f\xdc\x52\xc5\xab\xe2\x6c\x37\x42\xcd\x5c\x63\xe9\xcb\x67\xcc\x65\xa4\x2d\x90\xd7\x65\x83\x57\x8e\xcf\x5d\x73\xcd\x35\x37\xc2\xdb\xcf\x90\xff\xa9\xd5\x6a\xec\x19\x7a\x2b\xa0\xaf\xca\x27\x01\x63\xc2\x1e\x54\x2b\xea\xce\x38\x90\x00\xbb\xa4\x40\xa8\x7d\x80\x31\x04\x29\xaa\xb2\x93\x14\x58\x72\xb0\x96\xea\xf0\x16\xd4\x89\xf0\x39\x0e\x5b\x0f\xd4\xb5\x5f\x0d\x06\xb7\xd0\x12\xaa\x24\xd1\x4a\x0c\x19\x2d\x7b\xcb\x7c\xe0\xf7\x03\x63\x8e\xba\x91\x5d\xcf\x1e\x35\xd2\x1c\x55\x36\x34\xd9\xbd\x79\xce\xbb\x72\x24\xfc\xe0\x41\x7f\x3f\x2f\xd2\x4e\x54\x67\xec\x97\xf6\xb1\x87\x6f\x0c\xea\x73\xb9\xbf\xb5\x2f\xfc\xf6\xde\x21\x9a\x9e\x09\xdd\xdd\x94\xb2\x16\xfc\xe7\x69\x53\x0b\xd7\x11\x87\x45\x75\x54\x2f\xad\xff\xa6\x31\xd8\xe9\x21\x8d\x72\x47\xfb\x54\x3e\x35\x32\x92\xa1\xfd\xd0\x52\xa5\xd5\x0a\x73\xad\x67\x20\x2a\x95\xc5\x0a\x8f\x42\x96\x66\x29\x15\x37\x2c\xac\xc7\xe3\x60\xf9\xae\x99\xe5\xbb\xe6\x82\x8e\x90\xba\x4e\x94\x77\xb0\x8e\x16\x62\x81\xac\x91\x51\x7f\x69\x9f\x01\x09\xd2\x10\x55\xdd\x72\x4c\x31\xc5\x7a\xd1\xc1\x80\xfc\x9b\x2a\x65\x15\x8c\xfa\xca\x46\x64\x6b\xff\x16\xbc\x4b\xac\xfa\x1a\x1a\x1c\x59\xf9\x76\xfa\x06\xa8\x35\x18\xd4\x55\x0b\x66\x55\x0f\xb7\xd1\xc5\xb6\x2e\x02\xbe\x29\xab\xa2\xbc\x77\xb6\x09\x8f\x0e\x02\xad\x94\xb6\xfd\x96\x28\x08\x2c\x75\x50\x36\x81\x3c\x24\x75\x59\x69\x50\xc7\x15\xc0\xf7\xa0\xf9\xbd\xe4\xba\xd4\xbd\x93\x0b\x31\x24\xdb\x6e\x5a\xca\xab\x56\x54\xb4\x7b\xeb\x3a\xf1\x4e\x9f\x6c\xa6\x01\xc8\x75\x9a\xfa\xb5\xd6\x2e\x3a\xb1\x69\xa6\x5c\xb1\xb6\x9a\xaf\x6a\x84\xba\x5e\x8e\x7a\x3f\xb1\xd6\xc8\xeb\xf8\x93\x10\xca\x86\x00\x7a\x8f\xd5\xcc\x47\xc6\x53\x7c\xde\x63\xb7\x9a\x75\x28\xce\x16\x02\xd1\xb8\xa6\x75\x70\x80\xf1\x64\x39\x0f\xe8\xa5\x7a\xfb\xea\xa9\x25\xff\xe5\x5e\xf8\x12\x8f\x90\x3e\x0c\x92\xb7\x0e\x5f\x87\x3b\x26\xca\x3d\x17\x04\x73\x2a\x87\x57\x47\x13\x1d\x0b\xe4\xbe\x59\x0d\xa2\xa4\xb8\xee\xda\x6a\xd0\x8c\x53\x0e\x7f\x60\x4d\xab\xc1\x93\x9e\xac\x8d\xa6\x4f\x7f\x46\x35\xe8\xf0\xee\x93\xf0\x96\x7d\x1d\x01\x9d\xa3\xb8\xc6\x5e\xb7\x97\x1d\xa7\x96\xc9\xe1\x9a\xe6\xad\x56\x26\x5a\xbc\x48\xdd\x16\x95\x51\xd1\x66\x97\x95\x74\xd3\xc8\xdf\xfe\x67\xf6\x84\x4b\x43\xae\x97\x72\xb9\x73\x00\xae\x43\xa7\xb2\x79\x5a\xca\x7c\x0e\xd6\x98\xa8\x0e\x11\x5a\xa0\xb2\x6f\x79\x00\xea\xbe\xe5\x91\xb3\xc9\x31\x8a\x7f\x75\x82\x5d\x4f\xa0\xef\x33\x61\x08\xe0\xb1\x24\x33\x0a\x0d\x00\x0f\x87\x03\xac\x86\x63\x23\x7b\x85\xc7\x7c\xa0\x8b\xd1\x94\x08\x40\xac\xf3\xf4\x0b\xa7\x8c\x79\xec\x09\x9e\x17\xc8\x19\xe3\x7c\xd6\x62\x5d\x50\x01\x66\x72\x1a\x93\x05\xb8\x48\x03\x9e\x10\xee\xd2\xe3\x0d\x55\xcc\xc9\xf0\xb1\xb7\xb9\x44\x31\x74\x47\xa9\x41\x72\xd1\x91\x11\x92\xd6\x63\x0c\x9f\xd7\xdf\x72\x5a\xfb\x14\xcd\x2d\xb1\x16\x3e\xee\xce\x24\xba\x47\x9e\x27\xd2\x44\x4c\x6f\xa6\x59\xa3\x6a\xfc\xc6\x65\xc2\x08\xdd\x88\xc9\x7c\x6c\xf9\x4f\xd4\xce\xc0\xe5\x70\x6e\xd5\xf1\xdf\xb9\x40\x90\x66\x30\x82\x39\xdc\x89\xd7\xe0\x6c\x73\x1c\xcd\x7e\x77\x26\x67\x92\x74\xb3\x04\x51\xbc\xdf\xe1\x75\x54\x0e\x99\xe3\xb1\x38\x6b\x4b\x54\xff\x37\xf6\x87\x6d\x73\xd1\x45\xca\x6f\x89\x44\x64\x51\x5d\x6d\x51\x96\x9f\x1e\x0e\xf9\xe6\xe4\x20\x1a\x33\xda\x41\xd0\x23\xc3\x5b\x20\xce\x8a\x3a\x85\x61\x74\xe3\x5e\x2b\x4a\x6a\x5b\xde\x3e\x94\x4e\xce\x7c\xfc\xc8\x3e\x76\x8a\xd1\x0d\x7f\x21\xbc\x61\x5e\x5b\xf5\x8a\x12\x3e\x33\x89\xb6\x22\x05\x60\x6f\xec\xed\x28\x57\x52\xd7\x6e\xfd\x47\x3c\xb6\xaf\x09\xc0\xc8\xfe\xfb\xbc\xf0\xe7\xbc\xe3\x51\x2c\xf2\x7e\x5e\x88\x0e\x4e\x72\xe5\xb3\xb0\xe0\x8b\x00\x32\xc7\x7e\xc6\xc4\x21\xd2\xee\xd9\x06\xdd\x0a\xed\xaf\x49\x2b\xc0\x67\x6b\xc1\xc2\xd9\x9a\xd4\xfe\x8a\x6b\xc3\x6a\x10\x9e\x6d\xe6\xf2\x9f\xa4\x68\xe6\xa1\xbb\x87\x5b\xc5\x37\x00\x28\x0c\x02\x2e\xad\xae\xc7\x74\x10\xa7\x19\xa7\xd8\x7e\xc2\x15\xf2\xe7\xc3\x49\x83\xd1\xb4\x70\xb6\xc8\x8c\x41\x45\x41\x0f\x45\x10\x25\x33\x16\x57\xfe\xd9\x1e\x3b\x20\xd7\xc6\xa9\x24\xee\xfb\x1b\x61\xdb\x14\x39\x5f\x36\x4b\x04\x87\xe5\x83\x33\x80\x8a\x3f\x55\x0b\x56\xe8\xad\x00\x70\xb4\x40\xaf\x47\xb0\x4a\x08\xe3\x50\x37\x73\x51\x14\x44\x1f\x8f\xad\x02\x7b\x68\xee\x9e\x5b\x7e\xaf\xc2\x0e\xe6\xa2\x9e\x21\x38\xf8\x47\x2b\x63\x14\x37\xed\x47\x94\x3b\x5d\x19\x21\xfc\x45\x15\x53\xfd\x55\x55\x1e\x5a\x83\x2d\xa8\x70\x58\x4d\x70\x57\x45\x3f\x58\x01\x5b\xb9\x80\x75\xb9\xe1\xee\xd4\x45\x4a\x67\x96\x54\xc5\xfe\xb6\xa2\x84\xc6\x47\xc3\x60\xe3\x4e\x49\xaa\x58\x13\x50\xc5\x9c\xaf\xd8\xee\x23\xed\x8b\x1a\x5a\x91\xbc\x94\xa6\x82\x0f\x55\x11\xfd\x0e\xfe\xc6\xad\x8c\xcc\xcd\xc3\x6b\xc5\x7e\xe6\x90\xc3\x8a\x91\x88\x82\xf2\xf1\x65\xff\x2d\x26\xad\x4c\xe4\xb9\xff\xac\x43\xe1\x33\x2b\xf4\x03\xf5\x72\x17\xd2\x3a\xeb\xc5\xca\x30\x02\xb1\xbd\x41\x94\xac\x03\xa9\x41\x3d\x4d\x12\x7c\x2c\x47\x13\x18\x57\x1c\x64\x1a\x56\xde\x31\xdb\x12\xa9\x46\x2d\x98\x4d\x02\xf5\x3d\x05\xa8\x4d\x91\x62\xd8\x94\x96\xec\x7c\x3a\x82\xe5\xda\x6d\x18\xf7\xa7\xe1\x13\x20\xc3\x7b\x59\x9c\x57\x83\x38\xe5\x8d\x60\x9d\xc7\x1c\xc6\x35\xe3\xcd\x66\x54\xaf\x06\x68\x83\x94\x3b\xe3\xea\xea\x89\x6a\x90\xca\xe3\x10\xca\x0c\x94\x3c\x1b\x51\x06\x61\xfe\x0a\x32\x5f\x14\x75\xd7\x45\xfc\x52\xb6\x1b\xfb\xb5\x1b\xfb\xb5\x9b\xa6\x74\xbf\x46\x7b\x7d\x41\x61\x76\xff\x8e\xc7\xae\x1e\x29\xdc\x87\x8a\x28\x88\xeb\x7a\x8d\x67\xc7\x7b\x28\xe8\x1a\xad\x01\xcb\x8b\xf4\xf8\x83\x1d\xc2\xc5\xfe\xd0\x44\x70\xfd\x9e\xc7\xae\x3d\xcf\xc6\x61\xac\xd6\x96\xb7\x3a\x34\x58\xeb\xa1\xd0\xc0\x73\xde\x53\xb6\x8f\x07\x7b\xb4\x7f\xa3\x8e\x07\xb3\x1a\x5a\x4a\x58\xa2\x16\x94\x53\xaf\xbf\x74\x90\x85\xa3\x61\xa6\x17\x36\x10\x91\xd3\x7f\xf7\xc1\xf0\x33\x9e\xfa\x15\x08\xf9\x07\x62\x15\xd1\x69\x40\x2e\xf0\x24\x6d\x40\xd4\xaf\x62\x74\xa8\x8b\x0c\x80\x0b\xa1\xcc\x88\x8e\xb7\x39\x6f\x8a\x02\x99\x67\x8a\x8c\x47\x49\xe1\x60\x1f\x95\xf0\x6d\x97\xd3\x46\x2d\x08\x66\x95\xe8\x80\x42\xc1\x2c\x80\x27\x7c\xaa\x88\x0a\x35\xa1\x90\xfc\xf5\x7e\xb0\x7c\x6a\x75\x8d\x8c\x05\xb5\x5a\x6d\x06\x00\x6f\x6f\x92\x75\x95\x7b\xd1\x2d\x33\xea\xad\xdc\xdd\x7c\xfe\x7e\x1f\x7b\xa6\xbd\xfe\x8b\x8b\x5d\xfe\xd7\x98\xbf\x47\x41\x81\x81\xa9\x03\xb6\x42\x59\x27\xd1\xd8\x25\x8b\xbc\xe8\xfd\x2f\x63\x87\x30\xbf\x48\x41\xe1\x73\xf6\xd8\x0b\x18\xc7\x79\xbb\x8c\xf0\x7b\x9d\x9f\x4a\xdf\xa4\x2c\xf0\xc6\xee\x9e\x7b\x31\x18\x13\x4f\xd8\x5e\xc4\x5d\xe7\x5f\x3b\x8a\x42\x41\x09\xa5\xa1\x39\x98\x7f\xed\x39\xe0\x55\x36\xbe\xe1\x3c\x17\x9d\x34\x51\x14\x3e\xb9\xff\x51\x2f\x3c\x3e\xe4\x3a\x98\x79\xf3\x00\x23\xb6\xd2\xae\x20\x9d\xba\x01\x4f\xe5\xda\xed\x4a\xa9\x0d\xc0\xe0\xe4\x08\x95\x94\x75\xd8\xe5\xc4\xf5\xa7\xe9\xf0\x9e\xb8\x83\x60\x4d\xb7\x1e\xe1\xa4\xa6\xcf\x03\x98\x81\xa8\xde\xd6\x6e\x1d\x8a\x66\x11\x09\x10\x30\x7e\x63\x82\x3d\xc6\x2e\x4e\x64\x05\x1a\x98\x85\x31\xe3\xcd\x99\x8b\xab\x51\x4b\xbe\x47\xe6\x77\xdc\x09\xfd\xfb\x26\x9c\x36\xfc\xc4\x04\x7b\x8d\xc7\x2e\xb1\x8a\xf2\x5f\xe0\xf9\x7b\xd6\xfb\x85\x08\x4f\x2d\x36\xb5\x78\xde\xe4\x79\xc0\xbb\x72\x51\x28\x34\x5f\x2b\x44\x12\x9d\x4f\x31\xa7\x43\x6a\x94\xe7\x3d\xd1\x08\xac\x32\xe1\x2c\x5b\x73\x66\xc6\x8e\x7c\x01\xdf\x76\x59\xff\xbe\xe1\x85\xb7\x18\x1e\x3f\xc2\x5d\xd7\xe7\x34\xaa\x6a\x95\x76\x10\x55\x5f\x1e\x07\x69\x16\x34\x44\x12\xf1\xd8\xb1\xa0\xae\xb1\x15\xb6\x3c\x7a\xac\xce\xab\x73\x75\xad\xce\x79\x93\xec\x3f\x0c\x36\xac\xc3\xbb\xd3\x67\x44\x3f\x97\x8d\x9b\x06\xab\x07\xdb\x86\x8d\xa9\xc3\xbb\x8c\x7d\x99\x0d\x9d\xe3\x90\x75\xb8\x78\xca\x31\x2f\xbd\x8b\x85\xc7\x86\x5c\x77\xed\x4c\x5d\xed\xc5\x08\xe8\x59\xb2\xe9\x6c\x79\xfb\x5b\xbc\x10\x9b\xbc\xbf\xe5\xed\x43\xe3\xc9\x96\x67\x6c\x07\xce\x94\xf9\xd8\x41\x76\x9a\xb1\x3c\x8f\x17\xd0\x3d\xe4\xaf\x84\xf3\xc7\x63\x0e\x5b\x32\x7a\x8c\x66\x28\xb2\x46\x1e\x15\x03\x92\x2d\x75\x15\x28\x57\xb4\x83\xc7\xe1\xa7\xaa\xc6\x64\xc3\xe3\x5c\x38\xa6\x8b\x67\x79\x8c\x61\xd5\x20\xb9\x37\x0f\x9b\x6b\x4e\x92\x34\x59\xca\x78\x8c\x28\x92\x1a\x6e\x13\xd7\xaa\x6a\x9c\xb2\x32\xd1\x76\x5c\xa6\xe3\xb3\x8c\x5a\xc1\x90\x14\xe3\x79\xa6\x3a\xc5\xbf\x11\x99\xd1\xc1\x30\xa5\xd8\xb7\x48\x7d\x54\xdf\x9a\x5d\x5e\x54\x0d\x73\x4a\xf9\xb4\x67\x1b\x61\x7e\xdd\xbb\x50\x23\xcc\x0b\x3c\x63\x7a\xd1\x76\x97\xbc\x64\x78\x69\xa6\x99\xae\x50\x2f\xa7\x78\x22\x74\x1c\x0d\xb5\xc0\x90\xbd\x04\x75\x34\xb9\x83\xa8\x6d\xaf\x1a\x9c\x48\x5b\x51\x52\x8e\xa4\x6d\xf2\x28\xae\xb1\xb3\x96\x6d\x2b\x0e\x9f\xf2\x20\x5a\xb4\x5e\xe9\xb1\x4b\xc8\xc7\x78\x32\x6d\x08\xff\xd9\x5e\xd8\x5b\xd4\x8e\x77\x83\x9f\x62\x62\x46\x30\x41\x6e\xc3\x89\xcf\x59\x17\x52\x2f\xad\x9f\x59\x36\x66\x55\x29\x23\xd6\xda\x51\x62\x5d\x72\x02\x37\xcb\xf7\xec\x11\x7e\x92\xae\xd3\x72\x9a\xc6\xfe\x89\xf0\x31\x6b\xd6\xbc\xa0\x10\x84\x40\xde\x1b\x32\x03\x41\xd3\x28\xc8\x30\xd4\x48\x3b\xbc\xc4\x80\x77\x8a\xd1\x7a\xf4\x17\xc2\x1b\xd6\x4a\x76\x5a\xd5\x48\x9a\xe7\x00\x9c\xa9\x6d\x3e\x51\xa2\xea\xe0\x14\xf8\x26\x63\xb1\x7d\xb5\x17\xbe\xe0\x3b\x65\xb1\xb5\xe1\xfc\xe5\x1d\xa7\x8e\x4d\x76\x85\xe9\x95\x79\xe8\x14\x7f\x25\x5c\x28\x37\x5f\x75\xf1\xb2\xe9\x41\x7c\xd8\x76\x10\xa8\xee\x50\xae\x69\xfb\x3b\x6f\xd8\xc7\x6e\xde\x19\x9e\x36\x5f\x17\xb1\x82\x22\x25\xaf\x7d\x47\x24\x85\xff\xe5\xbd\xe1\xd9\x59\xc2\x38\x55\x98\x9b\x2a\xae\xb1\xa3\xd8\xc7\xcd\x1d\x8c\x06\x52\xd6\x48\x05\xad\xcf\x83\x33\xa2\xaf\xb8\x52\xa9\x1b\xd5\xc3\xc8\x8c\x4c\xa9\xe1\xa2\x6f\xc1\x96\x6a\x96\x82\x03\xea\x0d\x47\x4c\x7f\x78\x0f\x7b\x65\x85\xed\xc3\x67\xfd\xe7\x57\xc2\xaf\x7b\x8a\x60\x93\x40\x90\x32\x0e\x90\xbb\xb6\x22\x9b\x6b\x03\xaa\xae\x45\x94\x4b\x55\x32\xcd\x82\xa5\xb4\x58\x4c\xaa\x26\x6e\x3f\xa7\x22\x54\xde\x74\x92\x26\xd3\x60\xa5\x1d\x5a\xc6\x02\x42\x00\xa5\x59\x30\x9f\x8a\x7c\x29\x2d\xe0\xc2\x98\xe2\xa8\x28\x44\x67\x80\x3b\x84\xbb\x0a\xd9\xeb\x14\xaa\xcd\x15\xf7\x54\x54\x0f\x3a\x22\x6b\x09\x84\x23\x18\xe7\x29\xdd\xf2\x90\xbf\xe1\x95\x5e\x78\xb5\xec\x50\x95\xa3\xa3\x90\x61\x4d\x70\x99\x1e\x35\x8b\xe0\xc5\xd1\x61\x26\xd9\xf7\x38\x1b\x38\x7c\x7b\x5a\xb1\x61\xf9\x07\xfc\x7d\x50\x27\x76\xce\xfb\x7e\xf6\x1f\x87\x3c\x09\x77\xa5\x5e\x20\x37\xfc\x33\xa2\xcf\xd8\x4b\x3d\xa6\x47\xd3\x7f\x96\x17\x16\xba\x0b\x9d\x7d\xfc\x8c\xe8\x4f\xe6\xc4\x47\x90\x26\x90\x5e\x00\x64\x16\x10\x9c\xd5\xd4\x43\x89\x34\x24\xaa\x08\xb4\x6d\xcb\x21\xa4\x91\xa4\x21\x91\x33\xca\x1e\x13\x67\x85\xfc\x86\x4b\x51\xa6\x76\xa8\xd9\xa7\xf5\x32\x21\x25\x87\x89\x8b\x70\xb4\x91\x97\xed\x09\xef\xd6\xcf\xb8\xbe\xe4\x00\xae\x07\x70\x43\xf9\x56\x29\xe2\x3e\x31\xb2\x04\x10\x31\x22\xf0\x99\x63\x9c\x94\x3a\x5b\xd7\xb6\x3c\x86\x9b\x1d\xe2\x9d\x1c\xcc\xdb\x3c\x03\x25\xc1\xb5\x36\x4f\x7c\x07\x77\xa9\xa7\x30\xab\x8a\xfe\x72\x38\x67\xfb\xd7\x68\xa7\x76\x25\x01\xf6\x89\xda\x2a\x28\x1e\x07\xb8\x5c\xa0\x27\xee\x10\xfd\x12\xc8\xd9\xe5\xe6\x03\x10\x6c\xee\x9f\x0d\xcf\xa8\xaf\x60\xf4\x79\xea\x38\x42\xce\xf7\x73\x76\x44\x5c\xa1\x88\xcf\xb8\x42\x3a\x6a\xd8\xb5\x79\x24\x33\x63\xe0\x7f\x77\xc8\x56\xe5\x8f\x60\xa9\x94\xdf\xf7\xbf\x0f\x0e\xcd\x46\x34\x79\x6b\xfe\xe7\x0f\x86\xa7\xcc\x4f\xd9\xd3\x16\xa4\x83\x95\xa5\x87\xc9\x2e\xe0\x17\x51\xb1\x3e\x26\x5f\x3d\x09\xb8\xa1\xc0\x71\x8f\x6b\x3f\xb5\x4b\x1a\xba\xeb\x80\xd8\x75\x40\xdc\xbf\x0e\x88\x4f\x2a\x07\xc4\x47\xbc\xf3\xca\x52\x05\xef\xc3\xcb\x3d\x27\x27\x17\x83\xca\x60\x3c\x75\x26\xec\x83\x6e\x94\x5f\xd9\xde\x62\x35\xe3\x4f\x0f\x63\xc6\x30\x8d\x1b\xc0\x40\xf5\x6c\x35\xf3\xfc\x82\xb3\x1e\xb2\x71\x59\x9f\x39\xc4\xa6\xac\x21\x1e\x12\x51\x66\x39\x9a\xfc\xb7\x1c\x0a\x1f\x6d\xfd\x2e\xd9\xcc\x95\xe3\x1a\x43\x20\xc1\xa2\x94\xb7\xf1\x70\x2b\x8c\x4a\x62\x31\x49\xbe\xbf\xc2\xf6\x93\xe7\xdb\xff\x85\xca\x18\xbe\xda\xd1\xd5\xba\x15\x5f\x0f\xbf\xe9\xcd\xea\xcd\x8e\x8a\x44\x36\xee\x98\xb6\x6b\xa9\xa2\x20\xe6\x8c\x92\x31\x88\xaa\x99\x4c\xaa\xec\x70\x80\x4c\x01\x2e\xb4\x59\x9b\xa6\x3b\x6d\x06\x93\x54\xe2\xa4\x54\x7c\x27\xc1\xe9\x3f\xa9\x35\x5c\x2b\x6a\xc1\x8d\xf8\xd3\xb8\x3b\x52\xa9\x83\xe8\x00\x58\x1a\x29\x6f\x90\x5b\x3e\xb3\xad\x6f\x60\xdd\x82\xfa\xcb\x5a\xc6\xa9\xd4\x85\x8b\x94\x4a\xef\x07\xbc\x84\x96\x59\x63\xef\xde\xcb\xae\x88\xb0\x13\x00\xe2\x0e\x36\xee\x37\xec\x0d\x5f\xb1\x77\xb1\x74\x75\x58\x6c\x90\xfd\x8c\x4e\x5b\x32\x30\x3e\xf2\x8c\x66\x9d\x72\x9d\xa7\x4d\x9c\x6e\xe4\xe6\x58\x83\xb6\xa5\x03\x36\xc9\x9a\x67\x4a\x34\x8a\xbf\xf2\x53\x6a\xa8\xdf\xd3\x2e\x61\x02\x35\xab\x06\x88\x81\xa7\x03\xd8\x08\xc8\xd0\x71\x3c\xcd\x60\x7c\x37\x79\xd6\xc0\xe4\x65\x5e\x44\x40\xb9\xde\xaf\xaa\xa0\x68\x5e\x58\xaf\x50\x72\x21\xf0\x4d\xa8\x21\x6b\x45\x1b\x22\x19\xa0\x68\xb1\x33\xc6\xd6\x5c\xd3\xa8\xdc\xcc\x44\x27\x2a\x02\x1e\x6c\xf2\x0c\xec\xc9\x51\xd3\x4a\xa8\xc0\x33\x9f\xfe\x24\xc0\x15\x95\xc0\x8a\xe4\x99\x4c\x75\x0d\x71\x63\x2a\x5d\x64\x76\x79\x51\xa9\x1a\x94\xbc\x46\xfd\x4d\x49\x25\x40\xac\xa2\x60\x6a\xcd\x6c\x33\xa1\x22\x38\x2e\x7a\x6b\x26\xdf\x87\xc1\x7c\xa5\x39\xa3\x42\x9e\x4b\xd1\xe9\x39\x44\xeb\xaa\xc5\x83\x9b\xbf\x0e\x16\xa3\xfe\x18\x16\xa1\x5b\x45\x03\x96\xd2\x81\xdc\x39\x92\xd6\x7b\xba\xa5\xce\x51\xe4\x0b\x1e\xdb\x0b\x2b\xc8\xff\x94\x17\xde\xeb\xcd\x6a\x58\x05\x38\x30\x60\x40\x8d\xe6\x34\x56\xe7\x7e\xd7\xc3\xbb\xd8\xb4\x19\x55\xaa\x88\x81\x86\x54\x94\xb0\x92\xe1\x30\x1e\xc7\x2a\xea\x05\x67\x80\x39\x7e\x94\xc4\x84\x73\xca\x7c\x34\xbb\x71\x74\x6c\xe6\x18\x31\xb4\xd2\x8b\x05\x7b\xde\x04\x9b\x28\xe2\xdc\xff\x3f\x95\xf0\xdd\x95\xb5\x13\xab\x2e\xc8\x53\x2d\x98\x43\xbf\x75\xdc\x77\xa4\xa5\x9d\x61\x98\x1b\x44\x41\xf9\xbe\xbc\x54\x0d\xae\xbd\xf6\x1a\x68\x73\x47\xca\x86\x2e\x04\x69\x76\xd6\xa5\x8a\xa5\xe6\x0f\xf4\xa0\x12\x14\x66\xda\xc9\x0e\x05\x10\x2d\xd1\xd7\xc9\xb2\xaa\x8c\xb3\x06\xec\x09\xce\x04\x10\xf7\xcc\xeb\x75\xc0\x1c\x68\xa9\x9e\x92\x25\x80\xd0\xb0\x12\xfb\xdb\x59\xda\x6b\xa1\xc9\x6b\x75\x69\x11\xaa\xa9\xbb\xa5\xaa\x56\x45\xa4\x42\x98\xcc\x12\x6a\xf6\xe2\x66\x14\xc7\x26\xad\x18\x9f\xd0\x0d\x5f\x5d\x5a\x74\x46\xe2\x18\xbb\x81\x5d\x77\x01\x23\xb1\x76\x62\x95\xfd\x75\x85\xd9\x0f\x37\xe3\x74\x93\x6a\xa2\x9f\x3e\x1e\xa7\x9b\xab\xa0\xc4\x93\x47\xe5\x83\x95\xf0\x96\xf2\x45\x7b\x9b\x1e\x1a\x78\xc0\x03\xf3\x8a\xbb\xbb\xfd\x95\xc7\xbe\xee\xba\x3d\xbe\xe4\x85\x8f\x3e\x6d\x7e\x9f\x1e\x44\xe7\x74\x8a\x87\xe1\x75\x4a\x37\x7d\x33\xcf\x6e\x1d\xed\x31\xdd\xa6\xb9\x96\x8f\x63\x5b\xcf\xc5\xce\xdd\x20\xec\x17\x0e\x38\x51\x0a\xd9\x3a\xaf\x4b\xb5\x87\xf8\x50\x57\xd2\x18\xc9\x0b\x9f\x7f\x20\x9c\x29\x5d\x1b\x16\x57\x67\x3d\x92\x0f\x25\x27\xfc\xd4\xbe\xdd\x43\xcc\x45\x1c\x62\x9a\xd6\x19\xe6\x89\x17\x47\x4d\xf8\x3d\x63\xce\x2f\xbb\x27\xf5\x8b\x3d\xa9\xb7\x14\x65\xe0\x53\xc2\xef\x5b\x94\x7f\xb8\x52\xc3\x5e\x27\xb6\x80\x38\xc2\x6a\xac\x3a\x52\x40\x0c\x59\x9c\xe7\xbc\x64\xfb\x13\xd3\x1d\xfe\xa2\x3e\x31\x41\x19\xbc\x57\x00\x66\x21\xee\x6f\xa5\x70\xa6\xd2\x32\x2f\x9f\xa6\x5e\x78\x99\x83\xfd\xc4\xbb\xdd\x1c\x83\x3a\x54\x5a\x2c\x1c\x38\xbe\x7a\x28\x5c\x72\x2f\x8d\x44\x35\xb2\x43\xdf\x08\xc4\x4c\x67\xcb\x9b\x22\x6a\x5b\x9e\xe6\x39\xdb\xf2\x34\xb7\xa0\x23\x5c\xbe\x71\x29\x7b\xe3\x04\xfb\xee\x6e\x96\xc2\x8e\x32\x2f\x78\x23\x8e\x12\xa1\xf8\xf3\x9e\xa3\x79\x80\xbf\x51\x91\x7a\x62\x87\x9f\x05\x0e\x3d\x48\xca\x88\x12\x87\x41\x8f\xdb\x79\xbe\x8a\x7d\x5f\x15\xac\xf0\x62\x30\x85\xca\x62\x04\xc0\x7c\xab\x26\x8f\xac\xcc\x56\x5d\x4a\x59\xe1\x96\xbf\xa3\xa4\x27\x88\xbf\xb8\x2e\x0b\xc6\x57\xad\xb7\x88\xac\xdd\xca\x17\x01\xc7\x15\x0f\x96\x4b\x8d\x5c\x38\x5b\x17\xa2\x01\x10\xd1\x90\xa3\xa1\x91\x7a\x7a\x70\x74\xd4\xbe\x59\xab\x42\x04\xd6\x16\x2c\xa5\x05\xe5\x3a\xe8\x06\xda\x99\xf0\x22\x2f\xa2\x0e\x68\xfb\x64\xf5\x87\x14\x1a\xd9\x67\x4e\x27\x45\x39\x66\x4c\x97\x98\xf2\xae\x3b\x72\x24\x77\xd9\x9a\x5e\xe9\x59\xa4\x7e\xcf\xd5\xb8\xe6\xdd\xa5\x01\x0e\x3f\x24\x4b\xbf\x08\xfe\x3e\x87\x05\xb9\xcc\xe0\xe7\x54\xea\xc3\x1e\x7b\x78\x26\xd0\xbf\x78\x5b\x94\x17\x69\xd6\x07\x83\x82\x7f\x9f\xae\xe0\xab\x00\x78\xdd\x30\x0d\xa6\x71\x43\x31\xe6\xad\x8a\x82\xc2\xc5\x91\x4f\x58\x9d\x1b\xe5\x70\x4b\x6d\xf5\x01\x6b\xc4\x11\xb7\x15\xff\xe0\x59\x64\x80\x7f\xe1\x5d\x50\x74\x96\xe3\x6b\x0b\xdf\xe2\x9d\x70\x9d\x6b\x8a\xdc\xa2\x86\xfe\x0b\x39\x1f\xec\x4e\xd8\x6c\xa7\xb9\x40\x78\x79\xb0\x7e\xc0\x6b\x16\x73\x9f\x9a\x96\xe0\x9f\x02\x24\x38\xa0\x90\xb6\x9e\x70\x20\x76\x1c\x5e\x40\x1d\xde\x47\x6b\x1f\xb2\x8e\xd6\x45\x9c\xd7\xd8\xfb\x64\xc3\x95\xe3\xe7\xed\x1e\xbb\x66\x34\xe2\xe0\xa0\xbc\xa2\xf7\xc2\xe3\x6b\xe5\xf5\x81\x37\x54\x22\x0e\x0c\x30\xc6\xd9\x08\xd5\x76\x43\x30\x90\x88\x4d\x68\x51\xed\x9c\x57\x1d\xef\x98\x3a\xe4\x5f\x82\x13\xe5\x0e\xd1\xcf\x19\xbb\xc7\x62\x4a\x15\x17\x40\x94\x7a\x54\xf3\xa4\x0e\x44\x42\xe6\x43\x59\x51\x6b\xbb\xec\xa2\xb0\x5a\x1e\xcb\xf6\xa1\xc4\xf2\xaf\x0b\x0f\x2f\x0e\xc2\x65\x0c\x15\x6e\x8e\xa7\xe9\x0f\x18\x9b\x76\xd1\x2c\x6d\x74\x80\x52\x16\xf6\x46\x24\x36\xfd\xfb\x58\xf8\x56\xcf\xba\x10\xf0\x42\x0e\x3e\x36\xcc\x7a\x5f\x0a\x57\x4c\x59\x07\xcf\x22\xe4\xbd\x81\x6d\x0e\xc5\xf5\xb1\xc0\x2e\x43\x6b\xae\x64\x40\xa8\x13\x84\x1d\x9e\x57\x37\xc5\x7a\x3b\x4d\xcf\xa8\x0c\x78\xf3\x0d\xb9\x92\x31\xb9\x86\xf6\x06\x4c\xf0\xd4\x46\xd1\x2d\x0f\x6c\xcb\xce\x16\xfb\xcf\xfb\xd9\xcf\x9a\xc8\xf0\xd7\x7b\x6c\x76\x1c\xb6\xe7\x36\xbd\x41\x61\xe2\x4f\x30\x51\xe2\xf2\xa4\x89\x7b\x15\x55\x9e\x90\xb5\x21\x7d\x7b\x68\xa0\x89\x8a\x90\x53\x5c\x4f\x56\x17\xee\x86\xfc\xee\x7a\x9c\xbe\x93\x87\xb5\x3b\xac\xc3\xda\x63\x2e\xd2\xdf\xc4\xee\x55\x9e\x9e\xa7\xb3\xc7\x5c\xcc\x92\x93\x3b\xc6\x0d\xa0\x8f\xb7\xd3\xb8\x91\x8f\x00\xce\x55\xab\x4a\x45\xd0\xf3\xb8\x27\xfb\xf5\x9c\x77\x66\xfb\xd3\xc6\x6d\xfe\x71\x1b\x44\xd7\xae\x50\xe9\xa4\x61\xd5\x6b\x68\x8c\xf1\x9b\xf7\x0e\x75\x5a\x2f\xa7\x99\x0a\xa7\x7d\xd6\xde\x2d\x6f\x4f\x37\xcd\x8a\x2d\xef\x40\x37\x4b\x8b\xb4\x9e\xc6\x8e\xbc\xfa\xca\x1e\xf6\xc5\x0a\xdb\x2b\xb2\x2c\xcd\xfc\xdf\xa9\x84\xbf\x56\x59\x90\x7f\xc2\x61\x04\x20\x42\xd2\xac\xa1\xc2\xc0\xd6\x63\xd1\x31\x71\x61\x0a\x2b\x06\x2c\x6c\x08\x92\x27\xfb\x49\x9d\x4c\xa0\xc4\x20\x6f\x73\xd0\xe4\x3b\xdd\xb8\x6f\x81\xf5\x68\x58\x16\x30\x8b\x1e\x0b\xa6\x83\xf5\x5e\x14\x17\xd3\x51\x42\xef\x51\xc8\x0d\xbe\x6e\xfb\x22\x50\x14\xa3\x24\x54\x30\x10\x52\xa3\xc2\x27\x7b\xb9\x60\x81\x95\x8f\x0d\xe1\x06\x6c\x3a\xa8\xc7\x69\xaf\xa1\x82\x07\x33\x83\x55\xe9\x7c\x0c\x34\x29\xb0\x70\x23\x5d\x04\xc5\x24\x38\x55\x67\x81\x6a\x66\x33\x4d\x6b\x84\x6b\x56\xab\xa7\x9d\x19\xb3\x9a\xec\x29\x1e\x31\xe8\x7d\x9f\x2b\xdd\xe1\x84\x1c\x1c\x4d\x3b\x00\xdc\x14\x5a\x87\x18\xe8\xd5\xb4\xa9\xe0\xe6\xf4\x06\x80\x23\x22\x1a\x10\x06\xe2\xec\xd6\xaf\xf6\x98\x1e\x62\xff\x85\x5e\xf8\x5f\x97\xe9\x87\x21\x39\xa0\xdf\x17\xf2\x29\xa4\x92\xd1\x71\x75\x3a\x24\x4a\x1c\x0b\xc2\xb5\xb9\xe5\xb0\x1a\x84\x77\xce\xc3\x3f\xab\x73\x6b\xcb\xa1\xdd\x07\xcf\xdb\xbf\x43\x36\x22\x9c\xb3\x73\x52\x8f\xf0\x7f\x77\x5f\x78\xd6\xfa\x6d\x58\xef\x46\xc0\x69\xf0\x24\x90\x4b\x80\x76\x4a\x79\x4c\xec\x65\xa2\x4a\x44\x31\x80\x4e\xc6\x73\x41\x88\xb1\xda\xde\x0c\xc3\x9f\x13\xb6\x31\x04\x99\x48\x2d\xc9\xb5\x77\x7e\x6c\x2f\x7b\xcf\x04\xdb\x0b\xee\x02\xff\xed\x13\xe1\xeb\x27\x0c\xdb\x45\x89\x24\x02\x67\x4c\x9b\xe7\x98\x2a\xd4\xc0\x89\x0a\x1f\xa9\x4a\x45\x4b\x4e\x2b\xd0\x3a\xa4\x80\x06\x9f\x68\x2e\xb2\x88\xc7\xca\xce\x10\x9c\x04\x41\x0f\xd4\x36\x41\x23\xc5\x28\xa3\x6e\x9a\x17\xcd\xe8\x6c\xa0\x7d\x30\x52\x19\x4c\x90\xdc\x84\x17\x28\x8d\xe5\xe6\x37\x9b\x65\xbc\x8f\x6d\x91\x27\xa3\xe9\x28\x69\x88\xb3\x52\xd2\x07\xc7\x65\x5d\x71\x17\xe1\xdd\xae\xe0\x99\x93\x66\x4c\x51\x29\x56\xc0\x1d\x54\x3e\x0f\x1a\x78\xf2\x6e\xe2\xdb\x6d\xbe\x01\xd8\xa3\x6e\xd7\xd5\x02\x95\x79\x5d\x63\x6c\x01\x57\x43\x7e\x8c\x05\x41\x08\xf0\x94\xc1\xb4\xe5\x4a\xa2\x4b\x64\x9c\x57\x26\x61\xd5\x77\xf2\x1d\x30\x08\x3d\xe9\xc8\x93\x6b\xdb\xbd\xdc\x8c\xb2\xbc\xa0\x0a\x8b\xa4\xc8\x64\xaf\xd1\xeb\xce\xcc\xfb\x11\x83\x08\x51\x84\xad\xd9\xa0\xed\x62\x42\xd8\xcc\x8b\xca\x52\x0d\x93\xcd\x16\x61\x8a\x81\x09\xeb\xa1\xb3\x6f\x60\x8f\x06\x27\xd4\x34\x8a\x4a\x0e\x1a\xb4\x02\x9e\x36\x91\x50\x0a\x39\xe2\x99\x5e\x98\xcf\x06\x34\xfb\xcf\xbb\x0e\x2a\x0c\x5a\x23\x12\x63\xbe\x79\x01\x4b\x13\x62\xa3\xdd\x35\xa1\x0f\x06\x76\x6d\x7e\x6c\x82\xfd\xe7\x1d\x9d\xf4\xfc\xbf\xa8\x84\xb7\x0d\x5e\xb6\xce\x4f\xed\x74\x73\xa7\xc7\x3d\x67\x35\xbd\xbc\xc2\xde\xec\xb1\x43\xf2\xdc\x1f\x25\xad\x3b\x41\x1b\xf1\x5f\xe1\xb1\x1b\xb6\x3d\x8f\xae\xd8\xaf\x98\xba\x85\x77\xd2\x0d\x05\x68\x88\xae\x29\xc4\x95\x04\x12\x55\x45\xb7\x8f\xd4\x33\x83\xad\x02\xe0\x93\x9b\x03\xa7\xfc\x1a\x6b\x13\x32\xca\xe9\x70\x75\x8d\xd0\x50\xec\x83\x37\xa1\x6f\x84\x2b\x02\x8f\x77\x61\x90\x66\x41\xe8\x94\xe1\x06\x11\xbb\xc5\x3b\xd4\x52\xcc\xc1\x42\x1f\x50\x51\x9c\xe3\xd1\xd6\xbf\xf2\xe3\xd1\xdf\xec\xdf\x3d\x72\xec\x1e\x39\xfe\x8d\x1c\x39\x7e\x98\x4e\x1c\x1b\x63\x02\x7c\xc6\x2e\xe7\x8b\x3b\x6c\xb0\xb7\x18\x43\xc3\x6b\x3d\x76\xd3\x05\xd6\xe1\x81\xb6\x31\x9c\xf3\x9a\xdb\x9f\x89\xe6\xfc\xd9\x8b\x3d\x13\x31\xf6\xfe\x43\xce\xfe\xe6\x64\xde\x3b\xae\x74\xff\xe5\xbb\xf0\x27\x25\xf8\x93\xd7\x30\xf6\x65\x75\x82\xfe\xac\x37\x26\x54\x64\x74\xaf\x3e\xd4\x11\x1b\xbe\x6a\x96\xcb\x17\x3c\x76\xe3\x85\xb4\xf0\xa1\x0f\xdb\xb0\xbb\xbd\xee\x6e\xaf\xbb\x31\xe4\xf7\x67\x0c\xf9\x39\xaf\xbe\xfd\xfe\xf5\x58\xff\x96\xe9\x71\x68\x27\x68\xb0\x0b\x46\x63\xa5\xb0\xbf\xba\xc4\x81\xed\x5a\x87\x3c\x31\x9d\xd8\x9d\xa5\xc9\xed\xe9\xba\xff\xb1\x4b\xc2\x63\xf4\xf7\x40\x08\x97\xc3\xbb\x08\x21\x5c\x14\x70\x57\xcf\xd2\x24\xf8\xa1\x74\xdd\x15\xf8\x6f\xde\xc5\xbb\xda\x15\x15\xbb\xa2\xe2\xfe\x4d\x37\xf9\x96\x52\xa1\xfe\x76\x1c\xde\xd5\xd0\xb5\x0d\xda\xd3\x07\x40\x7b\xda\x51\xf4\x0f\xd7\xeb\xda\xb6\x72\x82\xba\x8e\x4c\x05\x0f\xfc\xc8\x96\x55\x8f\x4f\x1b\x05\xeb\xa3\xe3\x20\xb1\x86\xb7\x1f\x75\xab\x17\x7b\x73\x96\x36\x85\xc8\xa7\xa6\xa9\x0f\x7e\xbe\xcd\xdd\xdb\xcb\xfe\x6b\xfd\xab\xa7\xc7\xc8\x7a\x68\xad\x09\x1e\xc3\xd6\x32\xf6\x77\x57\x38\x71\xa5\xda\x18\x07\xd8\x2b\xab\x42\x39\x70\x7e\xfb\x8a\xf0\x96\xd2\xb5\x71\xc1\xbb\xaa\xc3\x10\x24\x26\xc8\x45\x51\xdb\xf2\x1e\x41\x4f\x60\x00\xd1\x2a\x4d\x8f\xc6\x96\xe7\xa3\xef\xe1\x64\x94\xe7\xe6\xe2\x23\x68\xb6\x0d\x3c\x7d\x09\x3e\x0d\x41\x11\xce\x56\xf2\xb6\xcb\xd9\xff\x72\x43\x82\xff\xa7\x17\x9e\x58\x71\x6b\x49\xa2\xdd\x44\x20\xa4\xeb\xf2\xb8\x63\x32\x06\x78\xa0\xdb\x39\x99\xbb\x3a\xb5\x13\x23\x7c\x3d\x7b\xd4\x4e\xc2\x57\x54\x59\x0e\xf4\xc9\xf8\x2c\xe7\xfd\xfe\x5e\x82\x3e\xd9\x69\xe6\x34\xfb\x2d\x8f\x5d\x8e\xdd\x32\xab\x1a\xe6\xbf\x47\x07\x8a\xbc\xb1\x14\x11\x95\x00\xb6\x36\x1c\x2b\xad\x48\x10\xc2\xf1\x81\x85\x8e\xc3\x06\x24\xc9\x49\x03\x9d\x51\x83\xa0\xdd\xf6\x63\xea\x6d\x88\x82\xd3\x7d\x7b\x18\xc3\x4b\x20\x50\x4f\xa5\xfc\xc8\xa9\x5d\x2b\x05\xb5\xb8\xf1\x1e\x5f\xf6\xd8\x90\x19\xe1\xff\x86\x6e\xcf\x2f\x8e\x6e\x0f\xcf\x46\xb5\x04\xf9\xad\xe4\x7d\x08\xd4\xea\x75\xbb\x29\x65\x41\x64\xbd\xa4\xf4\xec\xd0\xf5\xed\xa6\xd0\x00\xf4\x79\x3d\x4d\xea\xa2\x5b\xe4\x33\x52\x8b\x92\x27\xe2\x7c\xc6\x44\x0f\xe6\x33\x04\x91\x24\x8a\x19\xa7\x7d\xaf\xf1\x98\x3d\x87\xfd\x17\xe8\x86\xe5\x0f\xea\x38\xc1\xe0\xb8\x81\x69\x7f\xea\xb1\xcb\xea\x69\x1c\x43\x7c\xdd\x1c\x70\xce\xfd\xae\xae\xdd\x07\xbc\x39\xc5\x7e\x0d\xbc\xf3\xfa\xc1\x5c\x03\x49\xe8\xe9\x8e\x51\x95\xfa\xa7\x1d\x54\x09\x5e\x1d\x93\xfb\x02\x10\x44\xa6\xac\x80\x6f\xa4\x51\x03\xac\x0a\x1a\xd8\x1f\xdd\x65\x51\x41\x1c\x21\x45\x4a\xc1\x4c\x26\xe9\x4a\x7d\x3f\x11\x9b\x72\x75\x1b\x82\xcb\x15\x8a\x15\x74\x9b\xf9\x55\x8f\x8d\x10\x46\xfe\xc7\x74\x73\xdf\xb5\xb3\x59\xa6\x27\xf6\xd1\xf2\x70\xe8\xb4\xc2\xef\xd0\x3c\xfb\x7b\x8f\x8d\x10\xa2\xfe\x17\x75\x2b\x3f\x0c\xad\x2c\xd2\x82\xc7\x17\x38\xf3\x0e\x9b\x6d\x1f\x5f\xab\xa7\x59\x26\xea\x45\xdc\x1f\xf1\xc6\xd4\x03\xdb\xec\x8f\x7a\xec\x61\xd8\x92\x3b\x13\x2d\x8a\xfc\x77\xe8\x16\xbf\xf6\xfe\x90\x86\x09\x65\x2e\x3e\x80\x62\x30\x66\x3e\xee\x4d\xa2\xf1\x38\x91\x10\xbe\x90\x7f\x17\x34\xe3\xba\x6b\xc3\x59\x08\x8d\x86\x9c\x2e\x51\x97\x5b\x54\x4b\x3f\x14\xa8\xf7\x94\xe5\xd4\x6c\xc3\xd6\x42\xac\x95\xbe\xf6\x08\xd2\xcb\xcb\x73\x65\x45\x75\xdc\xcd\xdb\xcc\x14\x7b\x55\x50\x59\x56\xdf\xb8\x01\xb0\x97\xb0\x6b\x4b\x96\x61\x13\xe7\xbe\x71\xb4\xb6\x8a\x18\x9a\x2b\xbd\x58\xe4\xb6\x7d\xd8\xff\xd0\x25\xe1\xd7\x2a\xa3\xee\x1a\xe4\x06\x72\x87\xf7\x62\xe4\xea\x27\x43\x2a\x30\x54\x51\x8c\xaf\xc3\x56\x15\x25\x8a\xa5\x95\xb0\xd0\x2d\x40\x3b\x02\x0b\x51\x55\x44\xce\x4f\x6d\x8c\x8e\x1c\x2c\x21\x8c\xf9\x86\x5c\xc5\xbe\xf2\xea\x8b\xb3\x5d\x91\x01\x79\x8e\x0e\xcc\x26\xd3\x39\xf8\xda\x6f\x25\x9a\x0f\xa7\x0b\xa8\xbe\xb2\x43\x91\xa4\x73\x43\x40\xea\x17\x36\x84\xdc\xe7\x39\xc2\x38\x20\x09\x8b\xd4\x55\x72\xde\x04\x57\x39\xcf\xf3\x1e\xd1\x17\x28\x2c\x52\x20\x19\x81\xc8\x71\x4d\xad\x5a\x0d\xc4\x86\x94\xaa\x44\x4a\xa2\xb8\x5c\x4c\x57\xd4\xb6\xbc\x43\xea\x78\x08\x5d\xbd\xe5\x5d\x91\xa4\xc9\x8a\x7b\x89\x99\x17\x1c\x65\xec\x55\x07\xd8\x8b\x2b\xec\x72\xd3\x54\x88\xe7\xf1\xff\xc9\x0b\xbf\xee\x2d\xb8\x17\x61\x14\x28\x24\x20\x4a\x82\x7a\xda\x59\x8f\x12\x0b\x07\x0d\xbe\x84\x8c\x88\xda\xec\xcf\x55\x84\x4e\x5a\x07\x41\xae\xfb\x16\x3a\xc8\x7c\xd5\x82\xb9\x4b\xac\x31\x54\xc9\xc9\x2e\x47\xe1\xc0\xbb\x9a\x05\xd9\x69\xb4\x22\x42\x5c\x2a\x75\x86\xf2\x5b\x5a\x5d\x68\x9f\x34\xbf\xec\x31\xab\xb3\xfc\x4f\x79\xe1\xaf\x7a\x8b\x66\xe2\x45\x39\x10\xc4\x19\xe2\x21\x9c\x03\x99\x28\x7a\x59\x62\xc5\x5d\x03\xc7\x0b\xcf\x9c\xcf\xe8\xb0\x75\x90\x07\xf2\xf4\x01\x7e\x66\x2b\x98\x04\x8b\x75\xfa\xc0\xe9\x1a\x65\xe9\x77\xee\x0f\xeb\x9f\xdc\x9e\xbd\x4e\x90\xed\xab\x2b\x6c\x60\x7e\xf8\xcf\xaa\x84\xef\xf6\x06\x3a\xaa\x44\xf8\xcd\x95\x27\xc3\x9a\xb1\x40\xc3\x1b\xa7\x9b\xb8\x75\x76\x45\xd6\x4c\xb3\x8e\x5c\x93\x49\x9a\x4c\x6b\x2b\x08\xaa\x19\x58\x4e\xd6\x10\x30\x03\x22\xac\x73\xd4\x4a\xe0\x00\x9b\x14\x55\x18\x18\x92\x0d\x41\xa3\x07\x51\xf0\x05\x24\xb1\x62\x60\x4b\x1e\xad\xc7\x83\x23\x67\x54\xfd\x9b\xd9\xa3\xc7\xd8\xe9\x07\x84\x57\xa9\xb9\xec\x85\x15\xe6\x2e\x24\xff\x1f\xbd\xf0\xe7\xbd\xfb\xaf\x4b\x1e\xe4\xee\x18\x9f\x39\x3a\xd0\x1d\x4e\x5f\x7c\x78\xaf\x83\xcd\x69\x91\xf7\xd7\x88\x91\xbf\x36\x82\xbc\xdf\xf0\xd3\xfc\xcb\x9e\x50\x6c\xf7\xd0\x48\xb2\x9a\x60\xc4\x9b\x48\x5c\x63\x00\x9b\x23\x48\x65\x1a\x43\x5b\xf3\xbf\x27\xd8\xcf\x0d\x67\x9f\x79\xd5\x18\xbf\xd5\x76\xf4\x33\x4f\x18\x2c\xcf\x40\x6f\x5d\x14\x31\x0d\x6b\x99\x28\xa4\x1f\x0c\x4f\x69\x22\x1a\xa9\x7d\x97\x02\x92\xc4\xd9\x6e\xcc\x49\x02\x5b\xe4\x14\x2e\x51\x0d\x64\x17\xe9\x4f\xdb\x82\x6e\x59\x07\x1b\x1d\x0f\x6f\xa4\x34\xa7\x48\xed\xc9\x17\x44\x4c\xb3\xaa\x0d\x3a\x8b\xe1\x4d\xf9\x4e\x88\x69\x82\xc3\xc3\x18\x69\xa6\xec\x42\x6f\xa4\xd0\x9a\xa3\xe1\x23\x01\xad\xcf\x9d\x31\xea\xe0\xaf\x4b\xb4\x5f\xfd\xf5\x4b\x9d\x58\x19\x1d\xf0\x5a\x42\xf9\x9a\x8b\x79\xd4\xf1\x7f\xfc\xd2\x70\x69\xe8\x1d\xec\xfb\x5e\x2e\xb2\x49\x6d\x2b\x45\x25\x31\x69\x04\x75\x78\x02\xa2\x66\x2c\x38\x52\x04\x68\x74\xe6\xe1\xe7\x76\x0d\xe8\xbb\x06\xf4\x5d\x03\xfa\xfd\x6b\x40\xff\x27\x65\x40\xff\xa6\x37\x26\xa8\x66\xec\xba\x07\x43\xfa\x2f\x0e\x42\x37\x29\x23\x7a\xbd\xcd\x33\x5e\x2f\x44\x16\xe5\x45\x54\xcf\x1d\xbc\x5e\x1a\x77\x15\xbd\x01\x27\x4f\xd8\x56\xcf\xfb\xe4\x4c\x70\x9e\x33\x46\x86\x28\x7e\xbe\x2b\xcd\x25\xbc\x02\x12\x27\x67\xcf\xab\x68\x61\xfb\xad\x71\xd1\x3c\xe3\x1b\x8f\x56\xf4\xf7\x7b\xe3\x4d\xc5\x56\x9c\xd1\x8c\x6d\x36\x1e\x90\x78\x28\x0e\x11\x7d\x70\x5a\xea\xb6\x0f\x7c\x47\x9c\xf3\x9e\xbc\xbd\xcd\xfd\x98\x7f\xc3\x30\x8c\xab\xa1\x7d\x52\x0e\x13\x7a\xce\x01\x1b\xee\x6a\x28\xaa\xc4\x72\x16\xa5\x59\x54\xf4\x4f\xc8\x19\x3c\x67\x7b\x56\x21\x79\xfb\xd7\xf7\x87\xa7\xc6\x3f\xa2\x13\x16\x46\x3a\x67\xbb\xf4\x7e\x10\xcb\x02\x94\xca\xe3\xec\x30\xff\xb4\x97\xfd\xa5\xc7\xf6\x03\xe6\x98\x68\xf8\x5f\xf1\xd8\xd2\x79\x61\x63\x9c\xc0\x17\x47\xd7\x34\x7c\x89\x77\x9a\x4a\x3f\x6d\xd5\xb8\x9d\x5a\x31\xa1\xf2\xc4\xd3\xe6\x49\x23\x26\x1e\x7c\x1e\x50\xb1\xe5\x16\x38\x61\xd2\x65\xcc\x55\xe4\x24\x6b\xe8\x30\xdc\xd3\xb2\xb1\x80\x14\x72\x3a\xa4\xf2\xc2\xd3\x35\xf6\xbc\x3d\xa4\x1b\x7c\x7b\x22\xfc\xe6\x84\x7a\x68\x48\xcc\x19\x90\xce\xd9\x9f\x07\x2c\x1c\x43\x00\x02\xad\xa2\xde\x4e\xf4\x1e\x2f\xce\x8a\x7a\x0f\x8f\xff\xc1\x2c\xed\x2e\x69\x33\x38\x1d\x2e\x9c\x95\xb5\x0c\x4f\x07\x1d\xc1\x93\x5c\x21\xdb\x52\x0f\xa8\x9d\xba\xf4\x41\x63\xd1\xd6\x5f\xe5\xf8\xdd\xe0\x30\x9e\x5f\x7b\xd8\x7b\x89\xd8\x10\x59\x70\x4f\x4f\xf4\x44\x63\x0a\x7a\xa1\x91\xc2\x9b\x0d\x51\x48\x49\x64\xb6\x24\x4d\x43\xdd\xe1\x0d\x61\xd9\xb1\x8a\x94\x40\xb2\xdd\x2a\xe4\xe5\x66\xe8\x9e\xb4\xdb\x71\x98\x4f\x6d\xdb\x96\xa7\xf2\x4c\x3c\x75\xa0\xff\x30\xb7\xfe\xf0\xfa\x14\x52\x77\x5b\x69\x23\xa0\x39\xd1\xcc\xb1\xc8\xb3\xf3\x72\xc5\xc5\xd9\x7a\xdc\xcb\x81\xc6\x1b\x35\x94\x81\x4f\xd7\x14\xc9\x70\xc3\xc5\xae\x3d\xcd\xbe\xcb\x91\x01\xbd\x04\x1c\x4b\x8b\xfe\xe3\xa6\x83\x46\x24\x15\x46\x88\x77\x4b\xb3\x63\x88\xd3\x12\x50\xa2\xc2\x74\x91\x4e\x5b\xf7\xc5\xad\xfd\x63\x40\xcb\x4c\x95\x3d\xa6\x66\x2f\x63\xe7\x2a\xec\xae\x8b\xa3\x24\x9d\xeb\xe5\x45\xda\x51\xc7\xac\xbb\x90\x78\x5a\x2a\x82\x6f\xa8\x84\x27\x47\xdd\x74\x71\x2e\x36\xcc\xf5\x8e\x28\xda\x29\x65\x10\xbb\x2f\x97\x62\xe8\x7f\xcd\x63\xbf\xe2\xb1\xcb\xd3\xae\x48\xa4\xb2\x79\x0d\xc2\xdf\xf8\xf7\x79\xec\x49\xa3\xc4\xc3\x85\x12\xae\x62\xd1\xcb\x59\xda\xcd\xc3\x3b\x4a\x1f\x54\x07\x81\x53\x78\x39\xd8\xb8\x46\xa9\xb6\x16\x2f\xa3\xd5\x3e\x38\xe4\x66\x3d\xa4\x8a\x78\xdf\x15\xec\xe8\x36\xd2\x4b\xb5\x7e\x19\x48\x37\xe4\x21\xd6\xbf\xf7\x8a\xf0\x8d\x13\x83\xd7\x09\x37\x20\x13\x28\x27\x70\xda\x13\x60\x16\x4e\x5d\xad\x2c\xaa\x85\x50\x0d\xa4\x9e\xac\x14\x4a\xba\x3a\x99\xcb\x8d\x62\x5d\x91\x0b\x07\x05\xcf\x5a\xa2\xb0\xa0\xde\x66\x83\x21\x1f\x57\x1f\xe2\x03\x5f\x29\x09\xbd\x63\xb0\x14\xb9\x0d\xc1\x87\x80\x57\x30\x11\x44\xb6\x9e\xeb\xb2\x0a\x9b\x2f\x42\x2e\xc0\x11\x6f\xf1\x6e\xf4\x38\xb9\x09\x8e\x7a\xb3\x3e\xf2\x4d\xad\x8e\x0f\x7f\x13\x16\x7e\x63\x6a\xe8\xab\x1a\xc3\x77\xe8\xbb\xb5\x2d\x6f\x2f\x34\x66\xcb\x3b\xa8\xab\xb7\xe5\x1d\x74\xf5\x7f\x35\x97\xdf\x79\x29\xfb\x43\x8f\x99\x07\xfd\x4f\x7b\xe1\xcb\xbd\xd3\xfa\x77\x09\x4c\x0a\xbe\x27\x47\x4d\x4e\xb8\x16\xb6\x5c\x9d\x6d\x14\x1a\x07\xe2\x72\x87\x57\x85\x66\x64\xe2\xb8\xf4\x02\x18\x75\x49\x33\xaa\xea\xdd\x0a\x31\x17\x62\xca\x29\x72\x24\xd3\x28\xb8\xee\x6d\xb0\xa6\x72\x51\x30\xf6\xee\x0a\xbb\x94\x80\x08\x57\xeb\x69\x57\xf8\x6f\xae\x84\xaf\xaa\x9c\xb6\x2f\x0d\xdd\xe4\x52\x82\x75\x28\x03\x3b\x5a\x80\x17\x52\x49\x35\x90\xca\x87\x31\x83\xaf\xcd\xbb\x5d\x91\xe4\x81\x88\xa0\x1c\xc5\x67\xed\x64\xaa\x11\x9d\x82\x7e\x17\x08\x06\xec\x50\x6e\x9c\xfb\xd8\x77\x66\xc0\xa7\x4c\x26\x92\x41\x83\xec\x44\x45\x81\x05\x20\x6e\x75\xa1\x0c\xa9\xa7\xcd\x8b\xa7\x6d\xc5\x40\x99\xc0\xb8\xa5\x1f\xc4\x08\xa3\x69\x99\x35\xff\x71\x82\x31\x53\x80\xff\xe7\x13\xe1\xdb\x26\x9c\x12\x5d\x98\x31\x5c\xab\xd6\xdc\xa4\x4d\x5c\x8e\x53\xbd\xd0\x53\xd5\x25\xf5\x02\xdf\x93\xd6\x7b\xf8\x40\x29\x7a\x0a\x29\xbd\x85\xfa\x54\x2e\x64\x83\x50\x67\x79\x3f\x78\x31\x58\x46\x9a\xc1\x12\x1e\xf2\x7c\x78\x55\x58\x0b\x2c\x78\x19\x67\xd2\x26\x7d\x2b\xeb\xd5\x94\xb6\xde\x43\xfb\x39\x8c\x1f\xe1\x7b\xba\x0d\x7a\xaa\xbe\x4d\x93\xe4\xa9\xee\x2c\xc9\x05\x4e\x86\xd2\x0c\xc4\x01\x6a\x12\xb0\xff\x14\xe9\x73\x50\x61\x9b\xe3\x14\xdd\xf9\x5a\x8f\x2b\xcd\x62\xb4\xa5\x5f\xe4\x82\xf9\x64\x85\x19\x71\xe1\xff\x6a\x25\xfc\x17\xef\xb4\xfe\x3d\x4a\x22\x18\x81\x76\x38\xaa\x89\x5a\x35\x88\xd3\x4d\x91\xd5\x79\x8e\x59\xc2\xdd\xb8\x97\xf1\x78\x0a\x1c\x1b\xb0\xfa\xe9\x38\x58\xb5\x89\xdf\x6a\x01\xe0\x41\x52\x5a\x6f\x35\x78\x52\x10\xaa\x90\x7c\xa0\x86\x48\x1b\x22\xa7\xf3\x52\x18\x3c\x59\x65\x06\xea\x2e\x1a\x2f\x81\x4c\x05\x1f\x6c\x01\xf4\xdb\x1e\x43\x91\xec\xff\xba\x17\x3e\xdb\x3b\x0d\x7f\x8f\xea\x47\xdc\x88\x76\x26\x54\xf5\xb3\x0f\x6a\x73\xfe\xe6\xe1\xec\xfb\xec\x70\xfd\xb4\x01\xe7\xe1\x95\x5e\x52\x44\x70\xe4\xcb\x73\xff\x93\x0f\x0f\x3f\x31\x61\x5f\xd1\xa6\x00\x85\x37\x9a\x36\x2d\xa8\x95\x0c\x9f\xb4\x12\x9c\x29\xa5\x8d\xa6\x37\xda\xf7\x9d\xf2\x22\x83\xe6\xd9\x10\x98\x7e\x21\x2c\xe4\x58\xb7\x5c\xeb\xe1\xac\x97\x04\x9c\xd0\xad\xe0\x21\x72\x27\x42\x54\x82\xfd\x05\xf2\x43\x76\x78\xd2\xe3\x71\xdc\x77\xf3\x4a\x00\x85\x38\xcd\x34\xc0\xad\x61\xe0\xce\xaa\x14\x63\x42\x14\x3c\xba\x29\xcb\x69\x43\x9e\x4c\xb1\x29\x16\x81\x57\x26\xf2\x6e\x9a\xe4\x91\xd4\xd7\x9b\x29\x62\xe5\xc6\x1b\xda\xd6\x66\xd5\x08\x20\x77\x0d\xa7\x32\x81\x7c\xd9\x1e\x7b\x68\x84\xc1\x54\x25\xc3\x75\x35\x90\x22\x67\x27\xc6\x02\xd3\x29\x33\xd4\x75\xd3\x30\x5a\x33\x5b\xde\x7e\x3c\x84\xba\x24\x22\xcf\xbb\x62\xd7\x06\x7b\xb1\x36\xd8\x4f\xef\x61\xaa\x6f\xfd\x8f\xec\x09\xdf\xb3\xe7\x36\xfc\x51\x32\x61\xf4\x92\x86\xc8\xe2\x3e\xba\x7a\x71\x56\x73\x4c\x88\xb2\x2c\x1b\x1a\x1a\x68\x6e\x65\xd1\x00\x26\x5b\x04\x4d\x04\x13\x85\xdf\xc3\x6c\x61\x35\x08\x30\xd0\x38\x3b\xc9\x17\x66\x31\xaf\x18\x58\x3c\xd5\xcb\x40\xf9\xf9\xfd\xf0\xa1\x12\x1a\x2d\x38\xac\x73\xf2\xc6\x37\x74\x16\x17\x7d\x94\xf2\xfd\xad\x38\xc4\x24\x90\x07\xf4\x3e\x94\x58\xa5\x48\x13\x7a\x52\x1d\x79\xe5\xc4\x87\x78\x27\x80\x0a\xb8\xa7\x17\x6d\xf0\x18\xb3\x8a\xad\x77\x6b\xee\xe6\xc1\x55\x31\xe0\x39\x16\x8d\x20\xcc\x7a\x49\x3d\x0c\x3a\x51\xab\x6d\xf4\x37\xdd\x63\xf2\x66\x70\x6a\x6e\x51\xf7\xee\x61\x24\xd0\x4f\x38\x90\x62\x9d\x88\x92\xde\x59\x4b\x68\x4c\x69\x78\xa7\x5e\x29\xca\x69\xa8\x60\x91\xbd\xaa\xc6\x55\x89\x67\xbd\x41\x56\xa1\x07\xd3\xac\xa3\xfa\x76\x7e\x69\x35\x40\x58\xb3\xc3\x2b\xc7\xe7\x82\xa3\x47\xaf\xbe\x66\xca\x66\x0d\x22\x97\x65\x94\x07\x51\xa7\xd3\xfb\xff\xd9\x7b\x13\x30\x49\x8e\xf2\x4c\xf8\xc9\xea\x9e\x51\x4f\x8c\x90\x21\xb1\xd7\x5e\xec\xdf\x1b\x1b\x82\x9d\x69\xa8\xae\x9e\xd1\xe8\x1c\x21\x44\x4f\xf7\x8c\xd4\x62\x8e\xd6\x74\x8f\x64\x4e\x75\x74\x65\x54\x57\x6a\xb2\x32\x4b\x99\x59\xdd\x53\x92\xd9\x05\x84\x00\x23\x96\xc3\x18\x30\xc3\x61\xc0\x18\x30\x37\x36\xb7\xd7\x60\x8c\x6d\xbc\x60\xf0\x62\x2f\x68\x59\xb3\x3e\x38\x6c\x6c\x78\xd6\xde\xc5\x07\xe8\xc7\xde\xff\x89\xef\x8b\x88\x8c\xc8\xca\xea\x73\x46\xb2\xff\x6d\x9e\x07\x4d\x57\x1e\x71\x65\xc4\x17\x5f\x7c\xc7\xfb\xe6\x03\x89\xe6\x3b\x66\xfd\xad\x9b\xf5\x3f\x64\x9b\xf5\xdf\xb1\x6d\xb3\xfe\xf2\x43\x65\xb9\xff\x5a\x8d\x8c\x25\x2b\x22\x6d\x0b\x1e\xf8\x5f\xaa\x91\xf1\xe1\xf9\x75\x6a\xc3\x3e\xa5\x9e\x66\x6f\xaf\xe9\x3f\xcb\xf6\xea\x82\x91\x57\x3f\x50\x66\x28\x33\x81\x5f\x48\x08\x0c\x06\x4a\x44\x41\xb7\x77\xae\x46\xf5\x9e\x44\x36\x66\xc1\xc6\x88\xac\x30\x5e\x9e\xd0\xf4\xbd\x93\xdd\x24\x98\xd0\x6d\x9a\x24\x2e\x3c\x7e\x18\xd3\x25\x91\xcb\xd9\xce\x53\x98\xdc\x2b\x07\x1b\x07\xaf\xd5\x2b\x06\x14\xa2\x76\x12\x27\x29\xee\xe5\x99\x9a\xcf\x20\x08\x90\x9f\x50\x6f\xd7\x66\x54\x5a\x82\xcb\xf1\x6f\x90\x57\xd7\x08\x29\x9a\xe3\xbf\xb0\x46\x9e\xb0\xee\x30\xcf\x9b\xe7\xd9\x03\x5e\xf1\x43\x65\x1c\x5b\x09\x03\x80\x92\x52\x90\x23\x23\x5f\x62\x86\x20\xe5\x3c\x47\x61\xad\x87\xbb\xe0\x27\x74\x94\x22\x10\xd4\x3a\x80\x4d\x16\x60\xc7\xf8\xa9\x60\x96\x30\x87\x43\xa4\x55\xa9\x3c\x8c\x86\x51\xbd\xa2\x3c\x5b\x8c\x27\x88\xd6\x69\x31\xbb\xc1\xd9\x54\x56\xd0\xd8\xb8\xcf\x00\xfd\x04\x76\x25\x25\xf7\x40\x91\xa3\x25\xc7\x4f\x67\x67\xfd\xde\x68\x35\x74\xc6\x40\x94\xb9\xff\x96\x51\x36\x3b\x78\x79\x78\x58\x44\x11\xaa\xbb\xd9\x40\x88\x8f\x8e\x90\x57\x54\x07\x42\xdc\xb3\xf5\x38\x88\x27\x1f\xdf\x5e\xb4\x43\x83\x3c\xb5\x08\x77\x38\xc9\xa6\x14\xe8\x0a\x35\x31\x0e\x26\xfe\x01\x0d\x1e\xeb\xc5\x37\x38\xfb\xca\x31\x13\xe0\xf0\x44\x36\xb9\xb0\xf5\xb0\x86\xe3\xc6\xd3\x76\x84\x5d\x35\x5f\x1d\xc8\x50\xd7\x1c\x19\x55\xf1\x0c\x4e\x69\x07\x95\xcf\x62\x9c\xfd\x84\x86\x0a\x71\xe2\xaf\x83\xc1\x06\xfc\xd7\x5a\x65\x1c\xc3\x4c\xb2\x1a\xaf\xf2\x34\x98\x9a\x9b\x9d\x4b\x93\x3b\x31\xd1\xdc\x7f\x7b\x8d\xbd\xd6\xb3\xb2\x29\x02\xf5\x14\xd8\xb4\xa4\x64\x47\xcc\x51\xf5\x02\x90\x7f\x61\xf8\x02\x5e\x91\xea\x25\x38\xc3\x6c\x20\x5b\xcd\xa9\x19\x06\x98\x69\x8f\x5c\x1e\xa6\x68\xb0\xe7\xda\xc4\xa3\x06\xa9\x32\xb7\x78\x06\x3a\x03\x94\xc3\xcf\x26\xf7\x68\x5c\xe7\x94\x8d\x57\xe0\x3a\x5b\x3d\x44\x0f\x1d\xe0\x78\x6d\x3c\xc8\xa9\x62\xa4\xb0\x9c\x63\x61\x24\xc8\x8b\x47\x2b\xf9\x68\xb5\xd1\xf6\xd6\x5e\x92\x6b\x54\xfc\x3f\x19\x61\xc7\x2a\xae\x3b\xe7\x05\xcd\xf2\x43\xdb\x72\xb4\x2d\x97\x88\x09\xf3\xed\x65\xa5\x01\x78\xd1\x08\xf9\x53\x8f\x8c\xca\x17\xfc\x07\x3c\xf6\x42\xef\x66\xf9\xaa\x0e\x99\xc1\x88\xd6\xca\x62\x0d\x67\x18\x82\x44\x15\x16\x89\x4d\xba\x5b\x91\xa2\x7a\x52\xbf\x3f\x71\x97\xec\x5b\x36\xf9\x4e\xef\x46\x72\xc3\x26\xf0\xd0\x1b\xa6\x01\xb7\xf6\x78\x9c\x87\xb9\x9d\xf1\x43\xde\xe2\x91\x51\xc0\x05\x7d\xad\xc7\x6e\x39\x23\xf5\xcf\x52\x26\xbc\x19\x20\x8c\x5a\x46\x76\xb4\x32\x5a\x96\x3a\x97\x1a\xcb\x54\xe3\xc2\x36\xf2\xfd\x35\x72\x64\xcb\x6e\x5e\xc3\x6b\xeb\xff\xa5\xc7\xee\xdc\xc0\x73\x85\x51\xcf\xc6\xf0\x50\x1b\xa7\xde\x4e\x65\x77\x99\x52\x42\x27\xb4\x1f\x8c\x29\x5c\x0f\x40\x4f\x3d\xef\x8d\xc6\x65\xae\xc0\x36\x69\x11\xb8\xea\x3f\x8b\xdd\x0a\x16\xd0\xc5\x2a\xe2\x9b\x92\x4b\xcf\x3d\x98\x61\x15\x96\x51\xa0\xca\xeb\x46\x5e\xba\xc7\x59\x3f\x9a\x92\xd4\xf8\xbb\xe6\x67\x4f\x26\x01\xf2\x1d\x7c\x7d\x8c\x4d\x5a\xbf\x2b\xb9\x0e\xf0\xb6\x52\xe2\xb3\x46\x25\xdf\xc1\x07\x2f\x21\x6d\x2d\x32\xee\x60\x3f\x11\x6a\x91\x61\xc7\x64\xaa\x82\x6c\x29\x71\x25\xb9\x62\x0d\x24\xe0\x21\x0d\xdf\x39\x97\x6c\xe3\x5c\xf2\x59\xfb\x5c\xf2\xeb\xde\xf6\xb8\x15\xfe\xbd\x89\x35\x42\xe3\xa9\x2a\xf7\x21\x0b\x33\xda\x31\x1a\x6d\xcf\x68\xf4\xa0\x17\xac\xaf\x6f\x4f\xf9\x37\x9a\x18\x1d\xbd\x22\xcb\x54\x0a\x85\x04\xa9\x04\x38\xfd\xdd\x4b\xc9\x4d\xb6\xda\x1d\xa8\x1c\x8a\x54\x2c\x87\x90\x8d\x69\xa3\xb8\x6a\x1f\x7b\xbc\x7c\x3b\x42\x96\x39\x92\xda\xff\xc1\x5e\xf6\xa2\xda\xda\xcf\x94\x43\x51\x07\xa2\x76\xe2\x80\x9a\x36\x14\xc0\x68\x60\x60\x6a\xca\xfd\x97\x82\xfd\x14\x3e\x15\xea\x09\xf0\xa7\xd6\x9d\x9a\x6d\x1e\x2f\x83\x82\x96\x37\xe8\x4c\x41\x12\x16\xc6\x70\x44\xbc\xba\x4e\xbb\x11\x8f\x63\x15\x68\x93\x8a\x4e\xb2\xc2\x23\x7d\xf7\xba\x06\x3d\x93\x09\x5a\x3d\x04\xea\x5b\xaf\x1c\xa4\xeb\x74\x30\x8c\xb3\x5c\xf0\x12\xc4\xe5\x57\xc6\x76\x24\xe3\x36\x24\xe3\x17\x6d\xc9\xf8\x5b\xdb\xb6\xd8\x3c\xaf\x1c\x88\x69\xc4\xe3\xf5\x0f\x95\x7c\x6c\x90\xfb\x6a\x64\x4c\xcd\xef\xcc\xff\x9e\xc7\x66\xd5\x6c\x2a\xa9\xf3\xfa\x11\x13\x32\x61\xd8\x0a\x1c\x6f\x57\x41\xd3\x9f\x39\xbe\x9f\xe3\xe4\x16\x72\xf3\xf0\x84\x86\xcd\xad\xf6\x0d\xe5\x77\x4b\x85\x69\x33\xf9\xdd\x3b\x1b\xc5\x76\x37\x8a\xfb\xbc\xf5\x77\x8a\x25\x7f\xb1\x40\x7f\x5b\x43\xc0\x99\x7d\x63\x6d\x29\x57\xb9\x95\xfc\xe9\x65\xe4\x9a\x35\xb2\x65\x70\x52\xcd\x8b\xa8\x35\x98\xe4\xe8\xbf\xf5\x32\xf6\xa2\x5d\xd5\xf7\xa8\x88\x7b\x1d\x39\xb9\x85\x73\xc6\xb3\xd3\x88\xf4\xa1\x08\x7c\x76\x4d\x1e\x9b\x0c\x22\xb9\x2f\x60\x18\x84\x39\x02\x51\xb4\x6a\xa8\xd4\xb3\x72\x52\xd2\x40\x9e\x5b\x55\xd6\xa4\x8a\xce\x73\xf3\x1a\x3b\xc6\xb7\xb1\x76\x86\x24\xc8\x63\x2b\x4b\x72\x48\xa7\x8b\x7c\x5d\xf0\x3e\x2c\xf5\xe9\x99\x59\x98\xa1\x59\x3b\x59\x9d\x6c\x87\x81\xd0\x6d\x06\x12\xc3\x3c\xa1\x77\xf5\xc2\xe6\xd9\x48\x1e\x4e\x00\xab\x59\xc4\x01\x8e\x87\xb2\xe0\x18\xd3\x4f\x98\x5a\xa9\x92\x98\x7c\xa8\x2a\x3b\x79\x6a\x81\x1e\x29\x2a\x34\x89\x73\x59\x3f\x83\x43\x43\x9e\xd0\x20\x0d\x57\xca\x19\x9d\x81\x68\xaa\x5c\x79\xae\xb2\xdf\x53\x1e\x66\x02\xd3\x47\xa1\xb0\x40\x74\x7b\x79\xbf\x8e\xb0\xa7\x34\x0a\x5b\x22\x0f\x3b\x62\x32\x15\x2b\x49\xd3\xca\x47\x54\xd9\xd5\xb1\xa2\xff\x6b\x8a\x54\xb6\x4f\x0d\xce\x54\xb3\x29\x32\x35\x3a\xf8\xf8\xf1\xa4\xc9\x23\xfb\x32\x18\x47\x51\xad\x80\x82\xe8\x2a\xef\xa3\xf7\x58\x6e\x89\xc3\x1a\xad\x56\x3d\x30\x69\x0e\x87\x55\xbd\x7f\xec\xc2\x22\x5b\xbe\x4c\x87\xe1\xbf\xc0\x23\xb3\x1b\xce\x38\x5b\x6b\x0d\x41\x54\xfe\x75\x5b\x85\xba\x6c\x90\x77\x17\xd8\x32\x6f\xf6\xc8\x4d\x9b\x6d\xd3\x90\xc4\x65\x76\xdb\x66\x61\x2f\x2b\xd6\x38\x1f\x58\xd9\x3b\xbc\x1a\x3b\x99\x41\x0f\x9f\x42\xfa\xa0\xd7\x5b\x7f\xcb\x3d\xed\xcf\xad\x05\x5a\xb4\x26\x01\x5e\xf5\x0a\x27\xe4\xd3\xa3\x0e\xe5\xf6\xb0\x44\x15\x65\x81\x7d\xd5\x28\x9b\xa9\xbe\x55\x85\xab\x39\x34\x43\xc5\x3d\xca\xfc\xc6\x08\xb9\xb3\xf0\x3f\xdc\xc1\x4e\x0f\x80\xbe\xaf\xeb\x7f\x58\x6d\xe3\xf2\x57\xf6\x6f\x74\xe8\xc1\x04\xd1\x58\x44\xc5\x2c\xfd\x35\x8f\xec\xea\xb6\x79\x26\xfc\x0f\x78\xec\x17\xbd\x39\xf9\xa7\x25\x2c\x42\x2b\xb5\x48\xce\x5e\x1d\x73\x50\xa7\x88\x26\x0b\x36\x77\xc8\x7a\xa9\xe3\xc9\x31\x12\x3c\xd3\x21\x3e\x2a\xf3\xe6\x02\xa6\xdb\xc8\xd6\x39\x78\xf0\x05\x3a\xfd\x8b\x3c\x76\xcf\x69\x93\x31\xca\xe9\x52\x1a\x8a\x96\x45\xa4\xa1\x96\x1d\x46\xa0\x9a\x43\xb2\xd4\x25\x14\xd5\x82\x76\x6f\x76\x04\x8f\x31\x99\x52\xed\x34\xb4\xcb\xd3\x4c\x43\x73\xe4\x61\xd0\xa7\x41\x98\x75\x23\x58\x7a\x18\x2a\x72\x7c\xd6\x19\xd3\x6f\xbb\x28\xf5\x62\x05\x16\xad\x96\xe4\x47\xe5\xcf\x79\xa9\xb6\x64\xfe\xa7\x46\xd8\x5d\xd6\x6f\x13\x57\x6a\x6f\x2d\x80\xbe\x01\x77\x93\x16\xc5\xb2\xea\x34\x6c\x88\x86\xfc\xa4\xba\x47\xab\x3c\x9b\x0c\x33\x15\x38\xab\xdc\xa0\x79\x18\xf7\x92\x5e\x16\x21\x7c\x08\x44\x91\x4b\xb5\xa0\x71\xde\xdb\x05\xc9\xfd\xe7\xbd\x47\x46\x3c\xcb\x4f\x29\x4b\xf7\x42\x58\xb2\xda\xbe\xb5\x46\x62\x82\x8f\xfa\x42\x23\x79\xcc\xc1\x6f\x63\xbd\x2d\xa8\xf2\x10\x4c\x21\x96\xe7\x25\x33\xdb\xb0\xd9\xbd\x6e\x21\xc1\xb3\x9c\xb6\x05\x4f\xf3\x25\xc1\xd1\x47\xe7\x42\x89\x7c\xc0\x23\x03\x6d\xf2\x5f\xbf\x46\x2e\xd9\x1a\xca\xc0\x89\xb0\x99\x26\xe0\x11\x7c\x46\xb9\x48\xdd\x7c\x70\x12\x02\xbc\x01\xb4\x0c\xbe\x44\x21\x44\x55\xf3\x57\xb9\xec\x89\x88\x75\xb4\x98\xdb\x89\x06\xf9\xf4\xa5\x0e\x85\x4d\x61\xb9\xd5\x46\x5b\xff\xcd\x97\xb2\x2f\x8c\x6a\x5b\xf2\x30\xdd\x81\x47\x11\x9d\x9e\x9f\x45\x0d\x10\x22\x5f\xb2\x1c\xa3\x6e\x12\x8c\x33\x0e\x44\xc3\x79\x40\x85\x51\xc7\x42\x11\x72\x17\xb8\x46\xae\xd9\x9a\x06\x21\x62\xea\x34\xe8\x54\x46\xa3\x44\x4e\x64\xe8\x7e\x9f\xea\xa0\x6a\x59\xf8\x04\x96\x3b\xa1\x0f\x2d\x29\xcd\xc2\x40\x34\x79\x5a\x84\xe3\x00\x61\x35\x60\xe4\x4b\x1d\x18\xa2\x77\x78\x2f\x4f\x64\x37\x9a\x10\xe0\xd7\x4d\xba\xbd\x68\x48\x2b\xb4\x87\xb3\xe8\x82\x6c\x46\x97\x23\x73\x8b\x2e\x54\xc1\xf1\x3b\x27\x27\x53\x12\x42\x91\x38\xc1\x4c\x99\x19\x9a\x59\xf4\x21\x24\x06\xf0\x00\x34\xf0\x78\x19\xd9\xe5\x21\x99\x48\x85\x3e\x23\xe5\x04\x26\x3f\x41\x73\x66\xd4\x88\x3a\x11\x55\x7a\x5c\xea\x3a\xae\x5c\x07\x1c\xaa\x2d\x47\x56\x11\x25\xf2\xf4\xa4\x48\xb7\x79\x2e\x6b\xd2\xc0\x17\xe6\x73\x98\x0d\xdc\xed\x07\x8f\xe9\xa9\xd5\x58\xa4\x85\xfb\xa5\xc2\xd3\x02\x7a\x76\xd6\x4d\x62\x03\x91\xa4\xcb\xaa\x52\xa1\xbf\xba\x7b\x47\x69\xdb\x51\xda\x1e\x3e\x2b\xe2\x4f\x5b\xe7\xb7\xee\x76\x6d\x88\x93\xc6\x92\x07\x0b\xdd\x0e\xc8\x7e\x8a\x51\x1e\x70\x49\xc8\x07\x1a\xe4\x0e\x75\xde\xbb\x9d\x4c\x6e\xc0\xab\xa6\x65\x33\x1c\xea\x1e\x9b\xad\x45\x5e\xac\x9e\x7c\xd0\x7b\xfa\xfa\x3a\xe9\xb5\xfe\xd5\x1b\x74\x18\x94\x53\x7a\x1f\x18\x21\x37\xab\x96\x22\x09\xc9\xf2\x72\x2a\x96\x79\x9e\xb8\x59\x6e\x95\x86\xc4\x79\x8c\xf0\x2f\x3c\xbe\x2f\x1e\x61\xd7\x97\x2f\xaa\x8d\x87\x5b\xe1\xcf\x79\x42\xd5\x53\x8d\x48\x2c\xf3\x66\x5f\xb5\xd5\x91\x2a\x9f\xa8\x91\x2b\x95\xf3\xb6\xce\xfe\x0d\x04\x50\x57\xb8\x6e\x55\x92\x81\x3d\x1d\xa6\xc9\x1e\x63\x15\xf2\xaf\x66\xe3\x27\x4d\xfe\x86\xf5\xbe\xca\x2f\x19\x5a\xc8\x6f\x78\x8a\x7e\xec\x23\x06\x84\xed\xcd\xde\x6c\xab\xc8\x2b\xa9\xab\xa8\xed\x34\xb7\xed\x47\xa1\xa1\xb2\x52\x6c\x01\xca\xcc\x5b\x10\xda\xe4\x09\xbd\xf2\xca\x43\xb0\x2b\x2d\xf1\xe6\x59\x88\x46\x69\x26\x9d\x2e\xcf\xc3\xa5\x30\x0a\xf3\x7e\x83\x2e\xca\x52\x17\x2d\x4b\x11\xc7\x64\x40\x87\xf4\x6c\xff\xc1\x89\xab\xaf\xba\xea\xd0\x55\x0a\xc2\x36\x0b\x57\xc4\xb8\xab\xd3\x7c\x70\x97\x03\x58\xb6\x66\xf2\xbb\x3a\x43\x80\x1c\xf1\xff\xdf\x51\xf6\xc6\xda\xba\x8f\x15\xdf\x53\x45\x39\x23\x28\xc8\xdc\x6d\xd3\x5a\x3d\x35\xdb\xa5\x31\xd0\x85\x99\xd6\xe9\x5b\x72\x11\xc3\x53\xa8\xcf\xcf\xdd\x86\xa2\x59\x2a\x79\x2a\xea\x4d\x3f\xa9\xb6\x41\x08\xc6\x9d\xaa\xce\x53\x77\xda\x15\x66\x75\x2a\x32\x10\x93\x52\x39\xa8\x53\x4e\x57\x53\xa9\x9f\xa6\x94\xa7\x50\x99\x0a\xb8\x82\xf4\x57\xc8\x20\xc4\x9a\x70\x2b\xcd\x68\xb2\xaa\x92\x05\xa4\xea\x9a\xc4\x82\x8a\x28\x13\x74\x3f\x74\x09\x2c\x66\xe3\x8d\xf3\xde\x1e\x38\x64\x9c\x2c\x47\x1c\x7c\xb2\x46\x9e\x4a\xc6\xe4\x91\xe9\x54\x1c\xf5\xfd\x13\xec\xc6\xdb\xa5\xba\x02\x61\x2b\x28\xb2\xd5\x2d\x9a\x89\x5c\x85\x1c\x51\x6c\xfe\x09\xe8\x7b\x31\x53\x20\x25\xcc\x4d\xec\xfa\x33\x8f\x14\xf5\xfa\x7f\xe8\xb1\xdf\xf6\xa6\xf5\xcf\xf2\xea\xe0\xd5\x43\x55\xfd\x71\x94\x66\x06\x91\xa0\x18\x3c\x9d\x17\x1f\xeb\xe2\x03\x17\xd8\x2b\xef\xe5\x8f\x25\x3f\x51\x4d\x4d\xac\x4e\xbf\x7f\x7d\x39\xfb\xb0\x67\x7e\xda\x71\xaf\xd5\x86\x31\xe7\x0c\x2c\x27\x91\x7a\x51\x6e\x87\x79\xca\xc3\x08\xdd\x2f\x4d\x60\xf9\xb0\xc2\x0b\xf1\x5b\xcb\xb9\x24\xd7\x3c\xe8\x99\x61\xab\x08\xa0\x37\xcb\xbc\x18\xb9\x26\xee\x8f\xa0\xb7\x36\x73\x13\x52\x9e\x26\x11\xb8\x27\x4b\x07\xee\xb7\x33\xf2\xba\x9a\x83\xfd\xfb\x92\x1a\x3b\x67\x30\x9c\x95\x34\x31\x0d\xda\x1e\xf6\x66\x37\xc1\xff\x4c\x44\x61\x4b\x34\xfb\xcd\x48\x5c\x2e\x7f\x15\x95\xdb\xce\xa5\x83\x64\x92\x4c\x6c\x84\x2c\xfa\xe2\x22\x04\xbf\xbb\x46\x1e\x65\xce\x00\xf8\xd1\x44\xe6\xbf\xba\xc6\xfe\xc0\x33\x98\x61\x52\xa5\x85\x25\x0a\x5c\x76\x72\x8d\x17\x29\x44\x6a\xa6\x77\x78\x1c\xb6\x44\x96\x37\xe8\x51\xde\x6c\x6b\xd6\x3b\x83\x93\x1c\xa1\xcd\x22\xe9\xe5\xdd\x1e\x1c\x09\x16\x83\xa4\x79\x16\x5e\x97\x1f\x3e\x5f\xbc\xf0\xa3\xce\x63\x18\x79\x6c\xe6\x84\x8e\x4f\xdd\x68\x88\x8e\x1e\xff\x69\x77\x68\xc8\x32\xd9\x2d\xa7\xe3\xec\x9c\xff\x4c\x36\x37\x3b\x47\x79\x10\x00\x69\x8e\xda\xe4\xe4\x3d\xb9\xfb\x60\xa2\x95\x9e\xb2\x18\x26\x1c\x2e\xc7\x52\x99\x3b\xaa\xf1\x26\xe4\x2c\xee\x8b\xbc\x08\x48\x76\xcc\x0c\x3f\xa8\x91\x1f\x91\x0d\x9b\x1e\xf8\x36\x5f\xab\xb1\x37\xd6\xd6\xf8\x36\xf2\xad\xb5\x3e\x50\x19\x1f\x34\xeb\x81\x17\xa0\xd5\x8b\xca\xaf\xc2\x21\x10\x60\x4d\x11\xa8\xf4\x06\xc8\x9e\xc4\x4d\xd9\x2a\x41\xca\xd9\x9c\x43\xd4\x73\xd5\xbb\x70\x0f\x0e\xe6\x99\xc8\xff\xa5\x7c\xe7\x73\x64\x57\x37\x09\x66\xe7\xfc\x84\x2d\x59\x9f\x99\x47\x51\x82\x41\x11\xea\x04\x84\x69\x71\x09\x26\x99\x14\xc9\xec\xca\x75\xe6\xa4\xe8\x0d\x7c\x78\x53\x98\xf3\xe1\x57\x8c\xd1\x2b\x62\x77\x4c\x0d\x58\xba\x36\x6c\x1f\x54\x13\xcf\x35\x0e\x52\xd1\x58\x6e\xd0\x7d\x47\x57\xc2\x66\x2e\x82\x7d\x76\xbd\x7f\xe4\x91\x3d\xe6\x53\xf9\x9f\xdf\x06\x56\xdd\x2b\xbc\xd3\xc7\xa6\xe9\xa1\x43\x87\xae\xa3\x40\x79\x88\x96\xb5\x0e\x0c\x4f\xb1\x30\x74\xf0\x89\x3c\x2e\x37\xcf\xc6\xc9\x6a\x24\x82\xe5\x02\x9a\x56\x1d\xc8\x0b\x08\x4b\x65\xa0\xb1\x0f\xeb\xdd\x1e\x98\x50\x9c\xac\x22\x1a\x76\xf8\xb2\xd8\x9f\x8d\x3b\x3a\x0d\xf9\x99\x1a\x79\x8c\xe8\xb6\x45\x47\xa4\x3c\x1a\x5c\x53\x7f\xe5\xb1\xb7\x69\x4c\x22\x44\x5a\xeb\x53\xf3\xb8\x9d\xb2\xa4\x28\x54\x57\x20\x21\xca\x0c\xae\xca\x61\xb2\xb3\x2c\x78\xd4\x6d\xf3\x09\x05\xc5\x62\xa5\x56\x68\x2b\xca\x9a\xc9\x15\x47\x07\x5a\x9a\x99\x24\x8b\xed\xcf\xed\xb3\x85\x05\x7a\x91\xcd\x6f\x3e\x02\x7e\xc8\x0c\xab\x0e\x25\xff\xfc\x28\x79\x54\x9c\x20\xd8\x49\x20\xcf\x46\xa0\x55\x7d\x64\x94\xfd\xf2\xe8\xc0\x65\x00\xc9\x11\x2a\x7b\x5b\xe1\x9d\xe2\xe8\xd2\x6e\x2a\x90\x47\x52\x01\xcd\x40\x66\x9e\x6d\xc7\x59\xea\x81\x85\xa6\x69\x4e\xcf\x45\x9e\x47\x0a\x19\x6d\x7c\x95\xf7\xc1\x28\x85\x25\x49\xf5\x05\xb2\x65\x3a\xc0\x24\x2c\xc2\x15\xa1\xfc\xbb\xcb\x29\x6f\x0a\x29\x0d\x35\x69\x99\x7c\xb4\x2b\xd2\x30\x09\x32\xe7\x2b\x9b\x3c\xf6\xe5\x1e\x4f\x79\x9c\x0b\x51\xa4\xcb\xc9\x36\xeb\x0c\xb8\xa2\x25\x89\xea\x11\x1a\xb5\x34\x94\x72\x0a\x5a\x52\x20\x9a\x61\x00\xc7\x36\xe4\x2c\xd5\xa5\x48\xbd\x78\x15\x79\x54\x5b\xaa\xf7\x98\xb5\xb2\x24\x9a\x49\xc7\xce\x14\xcc\x92\x24\x96\x82\xc6\x2d\x97\x47\x59\x62\x15\xbe\xac\x3a\x6a\x45\xc0\xd8\xad\x42\x9b\x7f\x3b\x5c\x76\xe0\x7c\x64\x3b\xb4\xe2\x8e\xb6\xaf\x80\xf2\x16\x26\xf6\xea\xd1\x04\x03\x24\x57\xe8\xca\x75\x1b\x84\x41\x85\x05\x04\x61\x0b\xce\x32\x39\x52\xfb\xea\x7c\xdf\x58\x7f\x7c\x03\x70\xab\xe6\x55\xf5\xbe\xf8\x3b\x7b\xb4\x4b\xe3\x3f\xed\x61\xef\xdd\x03\xe9\x98\xe0\xd6\x40\x6d\x3c\xd1\x26\x9d\x10\xb3\x1c\x65\x4f\xd4\x2a\xcc\x7a\x9d\x0e\x4f\xfb\x48\x25\x2d\x52\x93\xc6\xa4\xe6\x70\x98\x67\xd4\xec\x2c\xb8\x4b\x16\x8a\x1b\x92\xf9\xd6\xd5\xc0\x61\x48\x80\x3c\x49\xa9\xa5\x82\xd8\x3e\x75\x13\x66\x24\x97\xce\x4a\x18\xf4\x6c\xd9\xa1\x55\x64\x8e\x44\xc8\xda\x19\x60\x25\x7d\x59\xea\x74\x37\x09\xf6\x65\xea\x0d\x68\x8b\xb2\x69\xb6\xe4\xd7\x33\xe9\xa7\xd8\x71\xb4\xa8\x1d\x26\x64\x0e\x43\x2d\x0e\xab\x1c\xd5\x00\x74\x83\x25\x21\x62\x15\xfd\xe7\x0a\x57\x65\x64\xd1\x0a\x38\xa2\x26\x0c\x50\x04\x94\xe4\x6a\x06\x65\xe2\x0a\x13\xb1\x9e\x0b\x5a\x48\x23\x35\x74\x86\xc2\x5e\xc9\x6b\xf4\x94\x17\x4b\x80\x67\x74\x55\x44\x11\x9c\x85\x40\x27\xe8\xca\x19\x11\x24\xab\xb1\xdc\xe5\xe1\xac\x86\x15\x25\x2b\x42\x63\xf7\x03\x19\x55\xdd\x64\xaf\xcb\x03\x7b\xce\xcf\xca\x23\xfb\x6a\x3b\x94\x1f\xeb\x34\xa6\x7d\x55\xf4\xdc\x72\x64\x15\xf9\xb3\x3c\x8a\x06\xfa\x97\xa1\x54\x77\xbb\x35\x65\x83\xd3\x58\x43\x21\x3f\x8d\x5c\xdc\x2a\xdd\x0c\xac\xc8\x5a\x12\x02\x17\x78\x53\xe9\x84\x26\xc7\x0e\x13\xd7\xd5\xaf\x06\x9d\x97\x3a\x97\x08\x44\x70\x98\x4e\x0d\x24\xdb\xe7\xa6\x13\x72\xa9\x6a\xe6\x44\x70\xfd\x2b\x5d\x0d\xbb\x01\xf2\x45\x49\x3b\x55\xb8\x6c\xf4\x31\x1e\x46\x9b\x2a\x58\x0d\x4a\x75\x5f\xc1\x2c\xef\xb4\x41\x79\xd4\xcc\x12\x51\x0f\x2a\xfb\xbb\x38\x17\x9a\xe4\xc7\x38\x89\x27\xee\x16\x69\x62\x4e\x87\x29\x6c\xf7\x56\x71\x3a\x94\x01\x26\x61\x43\xa7\x2f\x1d\x86\x74\x48\x85\x8c\x04\x8b\xcd\x49\x4a\x33\x27\x41\x98\x09\x6a\x00\x92\x25\x68\x47\x50\xa7\x79\xbf\xab\x3c\x16\x8a\x22\xdc\x60\x82\x23\x88\x78\xa7\x17\xeb\x7d\xcd\x30\xfe\x83\xde\x5e\x14\xdd\x20\xe4\x42\xab\xa9\x03\xde\xcd\x17\x8e\x90\xdd\xa0\x62\x66\xfe\x0f\x6a\xec\x6f\x3c\xfc\xdb\x4a\x7b\x2c\xd4\x4e\x31\x4c\xf1\x1c\x00\xbb\x29\x59\xce\x0e\xe4\xfa\x28\x06\x26\x56\x84\x63\x51\x6f\xcf\xce\xe1\x6b\x0d\x29\x03\x4d\xec\x56\x51\x0f\xcf\x51\xc7\x3f\xa8\xec\xe2\x26\x03\x28\x69\xd1\xd9\xb9\x95\x2b\x61\xd2\xcc\xce\xad\x5c\x6d\x23\xb1\x18\xe6\x6f\x50\x73\x29\x74\xc8\x2c\xab\xa2\xec\xbe\xc8\x1d\x3d\xe6\xf1\x64\x3f\xf9\x77\x1b\x39\x0b\xcf\xce\x6d\xfc\x68\xfb\xa0\xf7\xb8\x75\x8e\xcb\xbb\xfc\x91\xb0\x4b\xc8\xbd\x35\x32\x76\x57\x92\x21\x32\xc7\xdf\x7b\xec\x5b\x70\xf2\xbd\xb5\xc7\x23\xb9\xf7\x25\x2d\x6d\x47\xa5\xfb\x6f\x3d\x35\x3f\x8e\x40\x00\x85\x11\x59\x9f\xec\xac\x0f\xa3\x48\x4d\x2d\x04\x6e\x27\x3b\x9d\xce\x0b\xd8\x78\x6e\x3d\x35\x8f\x69\xa4\x60\x22\x03\xb5\xd3\xec\xe5\xb7\x9e\x9a\xc7\x8a\x44\xb6\x55\x83\xbf\x6c\xd6\x44\x37\x4d\xba\x49\xc6\xa3\x6c\x52\x8a\x3f\x2b\xef\x2a\xc9\x1a\x9d\xc0\xf1\xb6\x13\x52\xaf\x4c\x4e\x43\x1c\x70\xe0\x7d\xd1\x14\x11\x90\x62\xf3\xb5\x3d\xec\xe8\xd0\xbb\x95\xac\xb5\xc5\xc3\x16\xdd\xc4\x90\xc4\x9b\x37\x8d\x91\x2f\x78\x3a\xf3\xe6\xb7\x3c\x76\xcf\x71\x15\x6c\x38\xac\x94\x0b\xc3\x1d\x62\x95\x5e\x5c\xde\x7c\xfe\x5f\xe5\xb8\xec\xf8\x9f\xb6\xe1\x7f\xfa\x7d\x3b\x8a\xfd\x37\xb7\x99\xdf\x63\xc5\xb0\x3b\x09\x3e\x0f\x65\xe7\x76\xdc\xb9\xdb\x8e\xdd\xe6\xeb\xfb\xec\x9e\xe4\x3f\xb1\x0a\x88\x77\xa8\xdc\x2a\x7b\xee\x3e\x39\x46\x1a\xd6\xfa\x0e\xc2\xac\x29\x15\xd3\x7e\x11\xf0\xa3\xd6\xd5\x7c\x14\x36\x31\xf5\xf0\x25\x63\xec\xea\x81\xab\xb6\x05\xbd\xc8\x4f\x30\x8b\x32\x93\xcf\x65\x95\x82\xf0\x0b\xbb\xc9\x59\x2d\x07\x97\xd8\x8f\x1e\xaf\x7e\xd5\x16\x51\x4f\x24\x87\xc9\xb5\x43\x45\xd4\x3a\x5d\xd8\x11\x52\xdb\x10\x52\x4b\x96\x8c\xba\x6d\x7b\x22\xea\x47\x87\x48\xa8\x1d\xb1\xb1\x6d\xb1\x11\xad\x2f\x36\x00\xc7\x57\x89\x8d\x62\xc1\x94\x9c\xfd\x03\x8b\xbc\x32\xb1\xe3\x23\xbb\xc8\x15\xeb\xe4\x79\x1f\x8b\x92\x55\x04\xad\x2d\x70\x3a\x9e\xb3\x8b\x1d\xae\xb8\x6e\x45\x37\x5a\xd6\x09\xc4\x95\x29\x1e\x77\x7d\x60\x1f\x1a\x2d\x71\x7c\x2c\xaa\xbf\x17\x2b\x59\x3e\xd6\xb5\xff\xad\x05\x5d\x11\x19\xeb\xf5\x12\x3b\xb3\x88\x7f\xaa\x6a\x7a\x71\x78\x97\x9c\x17\x49\x2c\x26\x56\x93\x34\xa8\x5b\x56\xed\x2d\x02\x65\xb4\x4c\xd0\xbd\xec\x15\xfe\xb9\xb8\x0e\x03\x08\x08\x0f\x29\x39\x2a\x81\x33\xaa\x13\xcf\xa7\x15\x84\xc6\xf5\xac\x51\x20\x83\x43\x8c\xa1\x72\x6e\x97\x6a\xa8\x2c\xe4\xbd\xd5\x60\x28\xaf\xd9\x86\xa5\xfd\x19\x8b\x83\x05\x2e\x5e\x20\x5e\x98\x06\xf9\xf8\x88\x43\x01\x9b\x2e\xf1\xa6\xac\x79\x4a\x05\xaf\x84\x49\x0c\xa8\xc7\xaf\x1c\x61\xb7\x95\xae\x59\xb3\xb4\x9d\xac\x02\x60\x37\x9c\xfc\xe8\x34\x3a\x43\x4e\x27\x91\xc0\xba\xd4\x7b\x02\x41\x41\x20\x84\xb0\x78\xc4\x99\xc5\xef\xae\x91\x5f\xae\x91\x1f\x6e\x16\xb7\xe7\x85\x3c\x5c\x24\x69\xe6\xbf\xbc\xc6\xfe\x93\x37\x5d\x71\xc7\xc4\xc5\xe8\x1d\x37\x33\x77\xd0\x9a\x54\x46\x29\x6b\xc9\xfd\xce\x69\x25\xe4\xd6\x14\xe1\x97\xa9\x22\x1d\x6b\x81\x8f\xc0\xc4\xb6\xe8\x52\xe1\x88\x0d\x87\xef\xb8\xdc\x9b\x7d\x99\x9d\x3a\x64\x6a\xe6\x41\x20\x02\x7b\xfb\x9e\x21\x47\xc8\x93\xb7\xb2\x75\xf0\x25\x11\xe9\x9e\x93\x4f\x8e\x90\x7d\x83\x1f\x0f\xe5\xcd\xce\x17\xfc\x97\xf0\x05\xbf\xe7\x1c\xc8\xdd\xd7\x14\x08\x5f\xe3\x34\x5f\x3d\xaa\xa1\xd1\xfd\xcf\x10\xf6\x31\x62\x5f\xb1\x71\x3d\xe5\x30\xd2\x02\x46\x9d\x86\x16\xb7\x9b\xda\xb4\xb2\x06\x21\x0b\x89\x8a\x1b\x0e\xb3\x3a\xed\xa0\x91\x15\xad\x4b\x1a\xbc\x39\xa3\x4e\x15\x3c\x03\xcb\x39\x08\xc2\x30\xa6\xfd\xa4\x97\x9a\x82\xeb\xb6\x06\x92\xa7\xbd\xa6\x42\xee\x3e\xa5\xc2\x78\xd5\xe3\x46\x71\xc0\x67\x1a\xf4\xa9\x49\x0f\xdd\x16\x3a\xfc\x19\x03\xe3\x44\x8a\xcf\xaf\xf0\x34\x4c\x7a\x99\x0e\x27\x06\x5d\xac\x41\xc8\xe4\x24\x9d\xd5\x25\x75\x79\xf3\x2c\x5f\x16\x08\xbe\x4f\x4f\xf4\xa7\xe6\x66\x55\xa5\x58\x07\xbd\x87\xec\xd1\x63\xb8\xd0\xef\x0a\xa9\x72\xd1\xc5\x3b\xb3\x24\x3e\xcc\xea\x61\x1c\x85\xb1\x60\x8b\x64\xcf\x89\xfe\x9c\x0a\x59\x56\xcf\xaa\x42\xd4\x93\x1d\x75\x9b\x2d\x92\x67\x63\x4d\xf8\x7b\xca\xaa\x65\xea\x14\xfa\x9a\x94\xfa\xac\xde\xe4\x78\x55\xbe\x08\x0d\x3f\x7a\xee\x22\x37\xdc\xf9\x66\x17\xbc\xf9\xa7\x70\xa9\xac\x86\xa9\x8a\x0e\xb8\x65\xfe\xd4\x49\x5c\x1f\x51\x92\x9c\x05\x53\x2e\xe6\x33\x44\xe1\x59\x9c\x5d\x87\x65\xe9\x4c\x2a\x52\xec\x30\xb3\xfa\xc9\xea\x64\x0f\x2b\xf4\x5b\x76\x98\xad\x1c\x84\x6b\xa6\xb5\xf0\xa6\x79\x55\x35\x59\x3e\xb2\xc7\xb4\xeb\x30\x6b\x25\x89\xbc\xf4\xec\xba\x6c\xe1\x7c\x42\x57\xd1\x6f\x0b\xc8\xe3\x37\xd2\x19\xd1\x4c\x02\x41\x5b\x61\x9a\xe5\xc8\x3b\x2c\xfb\x45\x93\x94\xf6\x79\x07\xb0\xa6\x7a\x71\x87\xa7\x59\x9b\x47\x26\x59\x80\x47\xa0\xb9\x02\x0e\x08\x88\x3a\x67\xaa\xdb\x9f\xaa\x41\x17\x64\x6d\x00\x6b\xae\x70\x02\xf9\x2a\x0e\x89\x42\x89\xcb\x13\x80\x76\x5e\xea\xe5\x60\xbe\xee\xc5\xf2\xb3\x0b\x85\x83\x19\x8b\x73\xf2\x6b\x8b\x2e\x6c\xe4\x09\x6d\x26\xdd\xbe\x46\xdb\xec\x9e\x5d\x9e\x44\x85\x5c\x0e\xce\x78\x21\x73\x07\xd6\xd0\x02\x62\x76\xc2\xfe\xaf\x26\xd5\xbe\x4c\x87\xbd\x81\x96\x88\xa1\xea\x45\x69\xb4\xd5\x8b\x55\xca\x60\x91\x9e\x60\xc9\x58\x6c\x65\xf1\x79\xb1\x17\x72\x15\xdb\x93\xab\x4e\xf3\x5e\x1a\x23\x8a\x44\xd1\x3c\x9d\x53\xaa\xce\x84\x72\xb2\xa1\x28\x90\x85\x98\x87\xe1\x51\x3d\x86\xfb\x17\x4e\xcd\x9c\x3a\x2c\x8f\x75\x50\x80\xd4\x12\x0b\xb7\x5d\x91\x08\x80\x67\x97\x1e\xaa\x6f\xba\x60\x33\xed\x95\x5a\x57\x20\x5d\xa0\xc4\x36\x3e\x4c\xd5\x02\x11\x34\xc6\x6d\x6c\xa6\xfb\xf6\x90\x6b\x6d\xab\x9e\x48\x73\x34\xf8\x0a\x80\xd5\x9b\x2e\x7e\xcf\x87\xcb\xb2\xb3\xa7\xf1\x70\x0a\xe7\xff\xdf\x1d\x63\xa7\xd7\x7c\xa2\x12\x8c\x68\xd8\x0b\x1a\x9e\xa8\xd2\x36\xf0\x8d\x9d\xa4\x80\x6d\x27\x05\xbc\xd6\x58\x99\x5f\xe6\xb1\xc3\x61\x81\x09\xb7\xc9\x0f\x64\x2b\x00\xc7\xc8\x0c\x39\x32\xdc\x48\xbc\xd1\xe9\xb4\x63\x8b\xd9\x86\x2d\x66\xd6\xb2\xc5\x6c\x06\xb5\x6d\xd0\x16\xf3\xa0\xb7\xb2\xbe\xc5\x60\xde\xbf\xd5\x58\x0c\x9c\x0f\x5c\xce\x10\x58\x4b\x32\x94\xad\x8f\x5f\xdb\xe3\x28\xf1\xc3\xa2\xcb\x41\xec\x7c\x78\x0f\xbb\xae\xea\x86\x8b\x88\x52\x7e\x82\xc2\x84\xaf\x76\xc1\xdc\x37\xb6\x23\x5d\xb6\x2b\x5d\x7e\xd5\x48\x97\x5f\xf6\x98\xd0\xc6\xdb\x81\x2c\xe1\xcd\xbb\xaf\x86\x87\x7f\xdb\x82\xe8\x2a\x72\x88\x1c\xdc\x34\x55\xdf\x8e\xdc\xd9\x71\x54\x15\x9d\x7b\xd0\x7b\xc6\xfa\xe2\xef\x3a\xff\x9a\x8d\x10\x1e\x56\x09\xb9\x6f\xef\x71\x12\xaa\xf5\xa4\x54\x4e\xf7\xa9\x26\xe4\x24\x83\x88\xfb\xd4\x1e\x76\xf5\xe0\x65\x57\xc0\xb9\xf7\xd7\xd4\x9e\x5e\xb5\x23\xdf\xb6\x2d\xdf\x3e\x6d\xe4\xdb\xc7\x3c\xb6\x7a\xbc\xf2\x23\x6c\x58\xb8\xe5\x3c\x3b\x0b\x22\x0e\xb0\x92\xc4\x84\x4a\x9e\xc0\x00\x23\xeb\xba\x4a\xdb\x98\xe0\x58\xfe\xa4\x2d\xf1\x0e\x91\x83\x6b\xe4\x08\x56\x4f\xae\x1d\x79\xb7\x23\xef\x6c\x79\xf7\xb4\xf5\xe5\xdd\x35\xfe\x55\x55\xf2\x6e\x50\x3a\x95\xa5\xdd\xc7\xc6\xc8\xb1\xad\xa6\x82\x4e\xcd\xcd\xaa\x0a\x40\x1c\xfe\xcf\x4b\xd8\xa4\x7b\xc9\x15\x85\xc5\xbd\x75\x30\x6e\x77\x5f\x40\x65\x79\x47\xa4\x6e\x57\xa4\xde\xa9\x25\x2a\xb7\xe5\xda\x02\x39\x4d\xe6\x2a\xbf\xcb\x36\xa6\xd1\x8e\xe0\xdb\x0e\x8c\x51\xb2\xbe\x98\x38\xee\xdf\x52\x20\x07\x96\x3e\x47\xe9\x60\xe8\xae\xe4\x4a\x57\xf2\x37\x7d\x72\x66\xab\xa4\xa9\x25\x36\xd8\x19\x33\x8f\x80\x31\xfa\x7e\x9f\xcd\xad\xf5\x40\xc9\x1d\xa4\x20\xc5\x56\xb9\x22\x42\x09\x53\x6b\x3a\x24\x94\x77\xbb\x82\xa7\xe7\xbd\x5d\xd0\xf3\xf3\x1e\xc0\x5a\x4a\x1d\x2c\x6b\x26\x5d\x71\xde\x1b\xd3\x0e\x07\x47\x0c\xbd\xf0\x51\xe4\x83\x1e\xc1\x67\xfd\x77\x7a\x24\xb8\x30\x6c\xb1\x43\x3b\x0e\x29\xeb\xec\x08\xd4\x67\xf1\x1d\x59\x08\xf0\x52\x42\xc8\x8f\x83\x29\xbc\x85\x77\x1a\x0a\x2c\x30\xf0\xc9\x2f\x8f\x92\x1f\x81\x79\x9f\xae\x08\x65\x71\x3c\x06\x19\x01\xfe\xcb\x46\xd9\x73\x46\x2b\x6f\x39\x98\x6d\xdc\x58\x46\x31\x93\x40\x99\x5d\x0d\x85\xb3\xe1\x59\xd4\x36\x52\xc5\x69\xab\xc4\x66\x91\xc4\xae\xab\x0a\x30\x9b\x42\x1d\x0e\x61\xdd\x26\x06\xb3\x80\x16\xe2\xb9\x0e\xfd\xab\x17\x08\xd7\xd0\x65\x30\x99\xb6\x74\x33\xb3\x30\x10\xd6\x03\xa9\xa0\x3c\x5a\xe5\xfd\xac\xa8\xac\x9c\xfb\x14\x38\xd8\xc1\x2d\xbe\x92\xa4\xe8\xb9\xc3\x64\xec\xc5\x73\x13\xfa\xd5\x09\x65\xb8\x9d\xc0\xda\x16\x41\x64\xa7\x3d\x70\x25\x2d\xca\x6e\x37\xf4\x54\x79\xfa\xe3\x9f\xd9\xc0\xee\x36\x4a\x44\xbf\x8b\x0d\x08\xa8\x5d\x57\xaf\xe4\x10\x3a\x6f\x2f\x58\xde\x0d\x27\xf1\x63\x4e\x18\x49\x5c\xbe\x30\x61\xcf\xc1\xcb\x15\x41\x30\x2c\xf2\x5e\xa6\xbb\x21\xaf\xb8\x1d\x81\xb9\xa2\xa2\x26\xdc\xec\xf2\xd7\x79\x04\x97\x81\xff\x0a\x8f\xdd\xeb\xc1\x9f\x95\x14\xe2\xc2\x30\xea\x95\xe6\x1b\x24\xe1\xa0\x53\x72\x82\x26\x69\x91\x5f\x3e\x01\x85\x05\x0d\x3a\x15\x45\xc9\xaa\xd9\xc5\xe0\x93\x2d\x2a\x37\xe6\x22\x7c\xe1\x45\x03\xd7\x10\x2c\x3a\x31\x0a\xdf\xdd\x4d\xcc\xe2\xf4\xff\x7c\x37\xfb\xce\x2e\xfd\xab\x0c\x7a\xaf\x49\x6b\xcd\x7d\xe5\x48\x1d\xd2\xe8\x06\xd5\x0a\x00\xae\x25\xd9\x26\xed\x9a\x6c\x26\x9d\x6e\x4f\x39\x67\x93\x34\xc0\x9c\x55\x5c\x01\x6a\x32\x9b\x4a\xe4\x6b\xb2\x05\x38\xb3\x64\xfd\x45\x74\x8e\x06\x09\xd2\xee\x0c\xb5\x87\x85\x19\x65\xb0\x45\x46\xe1\x59\xc1\x00\x30\x08\xdc\x00\x59\x92\xe6\x94\x2f\x25\x2b\x40\x03\x6f\x3f\x53\x2a\x21\xab\x5b\xcb\x11\xda\x27\x02\x1a\x89\x73\x61\x33\x59\x4e\x79\xb7\x8d\xc9\x06\x0d\xca\x9e\x32\x50\x42\x86\x09\x20\x98\x67\xc0\x29\x5b\x61\xca\xb1\x0c\xb9\x3c\x89\xfa\x4c\x00\xa7\xa6\x11\x27\x30\x57\xf7\xce\x24\xd5\x65\x8c\xab\x57\x12\x70\x6d\x41\x5e\x03\x46\xb7\x40\xef\x18\xe4\x19\x32\x39\x0f\x98\xdc\x25\x98\x02\x51\x55\x89\x62\x76\xa1\x61\x6c\x15\x0a\x0e\xa2\x0c\x93\x8a\x32\x64\x2c\x42\x6f\xd8\x52\x9f\xde\x34\x45\x9f\x84\x14\x51\x4f\xc2\x34\x46\xba\x1f\x3d\x2f\x37\x4d\xa1\x76\xa0\xc7\x47\x25\x79\xd0\xac\xd7\x6a\x85\xe7\x68\xd6\x93\x83\x94\xe1\xab\x49\x8a\xef\x8e\x9b\xac\x28\x00\xae\x04\x14\x0e\x68\xb9\xd3\x49\xd5\x47\xa7\x8d\x0d\x3a\x15\x6b\xba\x3a\xdd\x46\xc3\x4b\xae\xc6\x57\x6e\x8e\x07\xea\x74\xe5\x8a\x3a\x5d\x39\x28\xff\x0f\x5b\x25\xfc\x3a\x20\xff\x3a\x54\xa7\x2b\x87\x60\xf7\x94\x97\xae\x80\x16\xe1\x73\xf0\xe7\x15\x75\xda\x4a\x92\x83\xf8\xdf\x03\x4e\x4a\xc2\x9d\xa4\x4d\x5a\x17\x79\x07\x52\x4b\x82\xfc\x92\x07\x08\x05\xaa\x53\xfe\xab\x3d\x72\xc7\x45\xa9\x79\xda\xd4\xc1\x0e\x59\x7e\x3f\xad\x92\x5b\x97\x94\xa8\x2e\xf6\xbc\xe9\xd3\x33\x0d\xf2\x4d\x8f\xe0\x96\xee\xff\x91\xc7\x3e\xef\xc1\x9f\x5a\x2e\x18\x02\xeb\x75\x05\xc1\xc2\xe0\x16\xaa\x98\xb9\x14\x69\x4d\x2c\x45\xc0\xa2\xd4\xc4\xb2\xc9\x27\x42\x99\x4f\x9a\x6c\x34\x1a\x8b\x0d\x7a\xc2\xcd\x62\xb1\x31\x6a\x86\x8d\x31\xdd\xaf\xf6\x4c\x80\x34\x5e\x7c\x22\x88\x9f\x06\xd2\xed\x3e\xa9\xa1\x8a\x5f\x1c\x77\xa4\xe0\x5f\xee\x26\x4f\x74\x31\x5b\x93\xac\xc9\xa3\x30\x5e\x6e\xac\x5c\x01\x13\xac\xc8\xa9\xd5\x35\x9e\x10\x79\x1a\x36\x15\xb8\xcb\x3b\x76\xb3\x3f\x1c\x59\xf3\x11\x4b\xe4\xab\xf8\x1a\x59\x83\x40\x38\x38\x23\xe9\x3b\xf0\x86\xda\x90\xf3\xc4\xca\xdb\xab\xcb\x85\xe6\xe8\x05\x46\x65\x96\xcb\x0d\x59\x7b\xea\x5a\x6d\x03\xb0\x5a\xde\x6c\x63\x6a\xa5\xf2\xa8\x6a\x0c\x0c\xa8\x57\xb1\x42\xef\x87\xfc\xf0\xe9\xb9\x33\x90\x07\x28\x3a\x49\xda\x1f\x07\x1e\x61\xc3\x75\x69\x82\x5e\x56\x84\x54\x26\xa4\x00\x5f\x16\x8a\xc8\xdb\x4a\xf8\xc3\x75\x5e\x64\xc5\x60\xf9\x0d\x4a\xe7\xa5\x90\xc0\x7e\xe1\x57\x5f\xea\x85\x11\x3a\x7f\x4b\xfd\x8b\x55\xa2\x9a\x42\x06\xa1\xea\x13\x28\x41\x88\x69\xab\x89\x9a\x6e\x49\x66\x27\xc2\x02\xb1\x5b\xda\xe1\x91\x54\x80\x26\x64\x9f\x75\x85\x1a\x76\x45\x50\xd6\x4d\x82\x8c\x51\x43\xac\x0c\x70\x31\x49\x2c\x28\xc3\xa6\x32\x8c\x88\x28\x54\xab\x4c\xe4\x9a\xfe\xe6\xbc\xb7\x1b\x1f\x3a\xef\xed\x31\xf6\x29\x17\x76\xa4\x46\x96\x48\x71\xcf\x3f\xc3\x6e\x76\xd2\x07\xcb\xb3\x77\x00\xae\xa1\xa0\x1e\x15\xa6\xe3\x58\xa7\x3d\x51\x8f\x28\xec\xa6\xc3\x6c\x22\x1e\x82\xdd\x64\xd3\x19\xc1\x04\x29\xc7\x50\x3e\x9b\xa8\xce\xf8\x19\xb9\x6e\x2d\xdc\xe2\x81\x35\x80\xf3\x79\x01\x87\xeb\x6a\x35\x83\x5c\x56\x56\x75\xb1\xc8\x20\x93\x17\x91\xff\x10\x3f\x09\xf9\xef\xbe\x03\xb0\xa8\x0d\x74\x00\xdf\x85\xa1\x9d\x1f\xf5\xd9\x0d\xc5\x4f\xcc\xb3\xac\x82\xa0\xa9\x82\x63\x8d\x07\x28\xc0\xfe\xea\x51\xe4\x6d\xa3\x64\x8f\xc9\xac\xf3\x7f\x7e\x94\x3d\x7f\x44\x1b\x2e\x8b\x84\xbb\x54\xae\x17\x3d\x9b\x74\x9a\x79\x83\xde\xda\x13\x69\xa8\xe3\x26\x9b\x51\xd2\x0b\x90\xdb\x38\x10\x29\x90\x4c\x9b\x49\xb8\x69\x87\x0e\xb2\x77\x43\x96\xd6\xe5\x45\x33\x4e\x26\xb9\x38\x3c\xa0\x5e\x37\x23\x58\x5b\x3c\xa3\x90\xcc\xa6\x30\x5b\xd5\x38\xc0\x25\x7a\x56\xf4\x35\x8b\x3e\x6c\xcf\xcd\x10\x91\x3a\x74\x14\xae\x4a\xa6\xe5\x31\xc6\xa9\x60\x5c\x4b\x33\x49\xd3\x1e\x06\xfc\xc0\xf9\x21\x44\xac\x45\x59\x60\x20\xcf\xe1\x90\x23\xa5\xd7\x84\xe2\xea\x80\x78\x31\x4e\x5b\xbd\x28\x9a\x48\x05\xe4\xae\x77\xe4\x67\x80\x64\xbb\x42\x35\x3f\x3c\x39\xd9\x4d\xf5\x91\xfc\x9a\xeb\x0e\x5d\x77\x50\x01\x2d\xe8\x2d\xde\xd9\x7d\x0f\x90\x06\xa9\xaf\x6b\xc5\x95\xb3\x62\x0a\x87\xea\xa2\x60\xe3\xfc\x92\x8b\x1c\xf4\xea\x1a\x7b\x8e\x37\x5d\x44\x5d\x87\x00\xf4\x08\x2d\x06\xba\xee\x32\xb9\x18\xe4\xd3\x17\xef\x6f\x6b\x46\x98\x62\xec\x51\xba\x82\x1c\x20\x8d\x0d\x8d\xd2\xc5\xc5\x10\x7a\x85\x47\x76\xa3\x75\xde\x7f\x81\xb7\x01\x7f\xa3\x6a\x51\x2b\x5c\x56\x30\xe7\xb7\x0e\x90\x1c\xb6\xc2\xe5\x81\xcc\x4a\x18\xcf\x95\x90\xa3\x7a\xd1\x8f\x79\x27\x6c\x1a\x2c\x10\xf5\x8e\xa1\x22\xcd\xc9\x0f\x05\xc0\x72\xa8\xa3\xf4\x33\x9f\x93\x2b\x37\xd4\xb4\x19\xf7\x3d\x36\x6e\xfe\x94\x0d\xc4\x52\x0b\xaa\x51\x95\x9d\x2c\x5f\x6c\x90\x7b\x3d\xf2\x43\xca\x0d\x3b\x95\xe7\xbc\xd9\x16\x81\xdf\x65\x0d\x2d\x5e\xd4\x2d\x45\xc9\x23\x4f\xd2\xea\x21\x47\xc8\x6c\xde\x9d\xa1\xeb\x52\xee\xdb\xdf\xf1\xc8\x5e\x95\x6c\x2b\x45\x83\xff\x61\x8f\x2d\x4f\x15\xbf\x87\xb1\xd8\x5a\x32\xd3\x6a\xa1\xd9\x55\x01\x67\xd8\xb0\xa2\x1a\x08\x35\x30\xb3\x4e\xf3\x2e\x6f\x86\x79\xff\x02\x73\xe4\x7d\xcd\x23\x63\x4d\x55\xb4\xff\x25\x8f\xdd\xe7\xe9\x8a\xca\x7d\x40\x22\xbf\x8a\x9e\x5c\x48\x5c\x35\xdd\x94\x0b\xdb\xc9\xbb\xc8\x6e\x84\x3c\xf0\x97\xd9\xe3\xf4\x4c\x19\xc0\x5d\xb0\x41\x3a\x36\x3f\x41\x8c\x2e\x3a\x2b\x4b\x23\xef\xf3\xc8\x98\x2c\x68\x36\x6e\x25\xfe\x5b\xbc\x0d\x14\x00\x1b\x30\x64\xe9\xcb\x77\x58\x32\x8f\x1c\x03\x61\x90\x4d\xf6\x7a\x61\x90\x61\xcc\xa4\xdc\x5a\xa2\xbe\x62\xed\x54\xd6\xb4\x2d\x7d\x04\x5b\xf4\xc9\xb7\xc8\xe7\x0d\x92\xf9\xa7\x3d\xf6\x21\x4f\x36\x47\xa1\x99\xeb\x39\xac\x90\xa8\x8c\xf4\x35\xe9\xf7\x05\x3e\xc8\x05\x69\x0e\x96\x26\x35\x62\xb3\x21\xc7\x62\x05\x30\x69\x14\xb2\x0f\xea\xae\x71\xb2\xea\xda\xc2\x1c\xad\x2b\x20\x97\xaa\x59\x35\x1b\x9f\xc9\x84\xbf\xc0\xae\x35\x3a\x08\x2c\x66\x58\x72\x5a\x5e\x84\x31\xec\xb2\xfb\x01\xb9\x51\x04\xe3\x1a\x37\x61\x40\x5c\x3c\x82\xec\xb5\x6b\x79\xd9\x6e\x72\x70\xa3\xe8\x94\x45\xea\xd1\x57\x76\xb1\x23\x6b\x3f\xa2\xa6\x67\x94\x95\x32\x83\x0a\x1c\xbd\x95\xe6\x9a\xdc\xc0\x7f\x3f\x4a\x7e\xc4\xe4\xee\x38\x4d\x7e\xb4\x4a\xb5\x71\x2e\xc6\xe4\x11\x11\xcf\xf2\xb9\x34\x59\x12\x90\x34\xf3\xcc\xad\xe7\xcc\xb0\x82\x41\x78\x15\xb0\x3a\x96\x0a\x08\x29\x95\xbf\xf3\xcf\x92\xb7\xf8\xa7\x8a\x14\xae\x13\xec\xc9\x37\x5f\xc0\x9c\xad\xbf\x2c\x70\xf6\xff\xd8\x63\xff\xc5\x3b\xa3\x54\x44\xc4\x0d\xb3\x00\x52\xb3\x76\x92\xe6\x75\x83\x9c\x0f\x07\xf5\x0c\xfc\xb5\x00\x3f\x64\x61\xf0\x4b\x15\x3f\xb3\xd1\x72\xe4\xe6\xb1\x56\x56\x17\x9d\x6d\x49\x6d\x33\x15\xdd\x24\xcd\x33\xca\x4e\x8b\x2c\xbc\x5b\xaa\xfc\x69\x2e\x02\x86\x85\x22\xce\xb7\x2c\x14\x6a\x8e\xfa\x10\x11\x5d\x0e\xa5\x42\xac\x30\xa4\x13\x95\x65\xb8\xeb\xee\x1f\x2f\xad\x46\x39\x38\x32\xc8\xf5\x80\x47\xf9\xdf\xbb\x94\xbd\xc8\x66\x37\xe6\xf4\x34\x0f\x92\x8c\x1e\x89\x92\xe6\x59\x3a\x23\xc0\xbd\x0a\xeb\x12\x1b\x29\x3b\xa6\x2d\xa5\xc8\xd4\x63\x81\x62\x9e\x3e\x32\x63\xd6\xb4\xe6\x1b\x4f\x56\x63\x91\x66\xed\xb0\x4b\x3b\x3c\xe6\xcb\xa8\x3c\x4b\x01\x32\x7f\xf4\x78\x18\xf7\xce\xd1\x54\x44\x7c\x49\xc0\x9e\x7b\xde\x1b\xeb\x24\x71\x98\x27\x29\x44\xb4\x48\x59\xee\x2c\xab\x5f\xd8\x4b\x9e\x03\x98\xba\x49\xe4\x9f\x63\x67\x21\x06\x1c\x5a\x2b\xaf\x20\x94\xb2\x41\x3e\x0d\x33\x9a\x2e\x55\xa3\x5d\x2a\x8d\x3c\x33\xbc\x7d\xd8\xe4\xc9\x74\x29\x98\x3c\x7d\x74\x6a\xe6\xc4\xd1\x46\x27\xb8\xbc\x9d\xac\x4e\xe4\xc9\x44\x2f\x13\x13\xa1\x73\x2a\xfd\xa0\x67\x81\xb3\xbe\xdd\x63\x3f\xef\x19\x3c\x56\x30\x23\xae\x6e\x11\xac\x15\xd6\x03\x02\xb6\x5e\xb0\x56\x5b\x96\xf9\xbf\xf5\xc8\x9e\x4c\x34\x53\x91\x9f\x16\x2d\xff\xcf\xbd\x0d\x20\xab\xcd\xeb\xc7\x11\xa3\x97\x7d\xc0\x33\x57\x60\x5f\xb0\xce\xe1\xbc\x97\xb7\x91\xcb\x1a\xf3\x29\xe0\x39\x58\x16\xa7\x8f\xcc\x9c\xc9\x44\x0a\x4b\x40\x9d\x25\x03\x40\x3f\x4a\xc3\x40\x64\xf2\x20\x97\xda\xfa\x96\xa2\xa3\xbf\x50\x43\x40\x9e\x87\x64\xc9\xa9\x7f\x37\xeb\x14\x13\x06\xfc\x7b\x03\x13\x86\x07\x9d\x30\xbe\x18\x53\xe6\x57\x6b\x64\x77\x2b\x5b\x90\x82\xff\x1d\x35\x76\xbe\x76\x2c\x8c\x04\x82\x02\x39\x29\x96\x36\x86\x70\x3f\xe9\x81\x03\x52\x4e\x0a\x58\x7f\x0d\xba\x10\x76\x0f\xd3\xa3\x71\xd6\x4b\x2d\x24\xb6\x56\xa9\xa8\x30\x73\x59\xfa\x0b\xf8\x1f\x24\x01\x8c\x97\x0d\x1c\xd1\x51\xd5\xa9\xc3\x94\x89\x73\xf9\x95\xac\x4e\xd9\xb9\x56\x26\xff\x89\xf3\x56\xc6\x1a\x74\xb6\xd3\x8d\xc2\x66\x28\xf5\x0e\xf0\x70\x2b\x83\xd7\x92\x50\x2f\xd0\xb0\x45\x7b\xb1\x31\xd3\x6d\x59\x17\xd5\x0a\x68\xba\xe4\x40\xb6\xa4\x04\x65\x80\x1f\xb2\x67\x14\x9f\x0e\x2e\xa9\x6f\x77\xe1\xbf\xd4\xbb\x3c\x72\x89\x9a\x92\xfe\x2f\x78\xec\x15\xde\x53\xf0\x87\x56\xc4\xba\x3c\x6f\xcb\x31\x38\x2b\xfa\x14\xae\x3b\x53\xdc\x9a\x4b\x93\x22\x6f\x4e\x36\x45\xb7\x3d\x69\x66\xf8\x85\x6f\xed\x4b\x3d\x62\x24\xa6\xff\x5c\x8f\x89\xa9\x81\xb0\xfe\x6e\x9b\xea\x27\x2e\x5c\x0b\x86\x6a\x64\xdf\xd8\x4d\x1e\xbb\x2e\x05\x7c\x57\x34\xfd\x5f\xdb\xcd\x6e\x1a\xb8\xea\x44\xcf\x04\x22\x0b\xd3\x12\x4d\x7b\x9e\x68\xfa\x76\x18\x77\x78\xd1\xb5\x7f\x7d\x7d\x17\xf9\x13\xcd\x00\xff\x65\x8f\xbd\xc0\x6b\x0f\x32\xc0\x57\x95\xfc\x2f\x8a\x00\xfe\xab\x35\xf2\x08\x70\x86\xea\x64\x4a\xff\xb3\xb5\x0d\x58\x4a\xe6\xed\x57\xd8\x6b\x6a\x4e\x11\x08\xea\x99\x25\x03\x99\x21\xad\x30\xca\x45\x9a\x61\x6a\x1b\xbc\xa2\x0e\xf8\x16\xe6\x16\x02\x67\xa9\xe4\xa7\x14\x92\xbd\xd0\xed\x07\xdd\x07\xd3\x9d\x38\xd7\x05\x9b\x9f\xc6\x06\x77\x1a\x73\x0a\x64\x93\x81\x30\x5b\xd2\xb0\x94\xe0\x81\x33\x78\x80\x3a\x6a\xe9\x18\xc0\x01\xd8\x11\x19\x2a\xa9\x75\x29\xc9\xdb\xba\x89\x53\x27\x67\xa8\xdb\xc1\xfd\x61\xcb\x75\x29\xc8\x1f\xe3\x75\x43\xcf\x00\x85\x88\xa0\x41\x7e\xc1\x23\xbb\xb1\x14\xff\xe7\x3c\x76\xae\xbc\xa6\xf4\x80\x6c\x6e\x10\x60\xff\x73\xa2\x1d\x30\x95\x10\x47\x08\xeb\xce\x10\xba\x4f\x05\xb3\xad\xb1\xcc\x7e\xef\x52\x27\xa6\x58\x41\x08\x82\xf1\xfa\x60\x63\x36\x5e\x96\x23\x8d\x78\x5f\x6f\xb9\x94\x7d\xb7\x66\x5f\x29\x5b\x16\x00\x85\x4b\x6f\x40\xea\xc1\xba\x4d\x55\xaf\xf6\x10\x75\x8b\x02\xa8\x25\x9c\x0f\x17\x43\xbc\x04\x25\x34\xdc\x45\x11\x66\x13\x01\xca\xc2\x09\xb8\xbd\x48\x21\xc8\x49\xc1\x5a\x21\x40\x81\xf6\x8f\x6b\x57\x91\x32\xca\xc4\xd4\x69\x6e\xa1\xa0\x37\x13\x88\xd5\x48\x81\x33\x12\xca\x6e\xd0\xdb\xc1\xdb\x4c\xe5\x8c\x8a\x04\x2d\xf5\x53\xcd\x8f\xb6\x66\x9e\xb4\x9a\x20\x25\x81\x8a\xc5\xa8\xd3\x58\xac\x9a\xee\x15\x26\x16\x4d\x1b\xcd\xd5\x10\x15\x53\xc7\xf8\x88\x8c\x01\xaf\x0d\x27\x61\x94\xfd\x38\x1c\x8e\x50\xfa\xc8\x4e\x24\xf6\x0e\xb9\xcd\xc3\x18\xc3\xfc\x07\x76\x0c\xf3\x6f\x6f\x9b\x22\xfb\xde\x32\x45\xf6\xbe\xec\xa1\x8b\x64\xd6\x15\x91\xaf\x69\x92\xd4\xaf\xac\x81\x30\xb2\x86\x68\x04\xf6\x9c\x37\x78\xf3\x16\x7d\x8e\x56\x0c\x1c\x28\x4e\xfb\x9d\x8b\xde\x3b\xd9\x21\x80\x7c\x47\x0b\xc9\x83\x5e\x73\xfd\x20\xcc\x27\xfb\x4f\x32\x41\x98\x56\x77\x4b\xf1\x97\x76\x37\xca\x41\xdb\xef\xda\xe3\x30\x47\xf2\x6e\x37\xd3\x56\x55\x84\x0e\x3b\x2d\x56\x80\x10\x17\xe2\xb2\xff\x71\x8c\x9d\xa9\xbe\x85\x2b\xd2\x2c\x37\x65\xe4\x05\xf6\x41\x13\xda\x32\xf8\xe6\xda\xd1\xdb\xef\xbe\x84\xac\xea\x88\xe1\x98\xed\x9f\xd5\x09\xac\x76\xb0\xd6\x60\x99\x4e\x96\xd8\x35\xe4\x2a\x72\x68\xb8\xeb\x77\x68\x6f\x77\x64\xce\x36\x64\xce\xaf\xda\x32\xe7\x6d\xdb\xcc\x9b\x58\x7e\xa8\x84\xca\xce\x36\xbd\x5d\xf4\xb1\xc5\xf5\x05\xd6\x0d\xfe\xf5\x56\xd4\x78\x37\x2b\x92\x87\x2b\xa5\x4a\x59\x5a\xbd\xfa\x52\x87\x93\xaa\x4c\x39\xdd\x00\xea\xef\x0a\x62\x70\xff\x7f\xec\x65\x7f\xe1\x0d\xbb\x4b\x9b\x6d\xd1\x3c\x5b\x44\xa8\x26\x29\x68\xeb\x2a\x14\x3c\x49\x55\xf4\x97\x4d\x20\xcf\x63\x45\x42\x4d\x81\x46\x1e\xe3\x3e\x2c\xae\xaa\x9b\xf9\x0a\xca\xbe\x82\x22\x09\x43\x58\xad\x08\x28\x7e\x56\x64\x40\xf2\xd8\x83\x13\x44\x16\x0a\xe0\x6b\x5f\x4e\x79\x9c\x0f\xbe\x87\xa7\x4b\x85\x55\xaf\xe1\xc8\x6d\xcc\x1e\xe8\x04\x9a\x52\x07\x39\x16\xbf\x75\x81\x69\xca\xff\x97\xde\x81\xbf\xe5\x91\xa9\x0d\x53\x82\x37\x2a\x06\x1f\xf6\xe2\xb7\x78\x5b\xe6\x27\xa7\xa0\x9d\x37\x8a\xf1\xd2\x67\x3a\x71\x57\x8f\x47\xc6\xfb\x6c\x6e\xf7\x93\x1e\xed\xf0\x40\x38\x85\xf2\x65\x1e\xc6\x59\xde\xa0\xf2\xa4\x06\x30\xcf\x75\x15\x21\xa2\x54\x7b\x79\x36\x7c\x7b\x41\x84\xfe\x7a\x8f\x4c\x6f\xaf\xd7\x18\x1d\x70\x66\xb3\x24\xe8\x76\x10\xb5\x6e\x7c\x88\x18\xda\xab\x22\x50\x33\x77\x47\x94\xed\x9c\x38\x1e\xc6\xe4\xa1\x74\xfd\x6d\xe0\x94\x7f\x62\x62\x43\x84\xe7\xc3\x44\x76\x79\x63\x78\xc5\xa3\x9c\x58\xbb\x25\x88\xd0\x5a\x39\xd8\xb8\x25\x59\xd2\xb4\x6f\x8f\x64\x07\xcc\xaf\x01\x4b\x88\x15\x60\xa7\xbc\x5a\xb7\x24\x4b\xee\x49\xfe\xbd\x8f\x24\x5f\x1d\x21\x8f\x6c\x26\x9d\x6e\x24\x72\x11\xcc\xc6\x81\x38\x27\x32\xff\x33\x23\xec\x63\x23\xd3\xa5\xab\x16\xd8\xbd\x79\x41\x2e\x63\xb8\x07\x01\x68\x0d\x10\x5b\xea\x66\x98\xc4\x27\x92\x40\xd0\x1b\x28\xc3\x02\x02\x86\x1b\x4b\x2e\xce\x81\x2b\xa5\xc3\x15\xf0\x91\x2e\x83\xa7\xd6\x04\xc4\x80\xb9\x40\x34\xc3\x0e\x8f\xa8\x22\x70\xcc\x68\x26\xba\x3c\xd5\x64\x04\xf2\x73\xf3\x4c\xe1\x30\x41\xf0\x7c\x39\xe7\x20\x8c\x9b\xa9\xdc\x86\x80\xd3\x21\x10\xa9\x7c\x36\x15\x05\x6f\x46\x33\x89\x33\xd1\xec\xe5\xe1\x8a\x5b\x82\xec\x83\xb2\xef\xc9\xf5\x6c\xb7\x4a\x89\x32\x8c\xbf\x87\xe8\x5d\x9e\xe5\x54\x44\xe8\x0a\x2c\xe8\x33\x43\x91\xd5\xdd\xe6\x72\xda\xee\x77\xdb\x22\x46\x93\x9f\xb2\x54\xd7\x35\x83\xde\xe0\x98\xca\x86\x1c\xac\xd3\x43\x75\x7a\x65\x9d\x5e\x05\x75\x5d\x03\x56\xb6\x7e\xd5\x50\xb1\x83\xf5\x43\x13\x57\xd5\xaf\x61\x8e\x07\xf5\x37\x6b\xe4\xb2\xe2\x83\x80\x5f\xfc\x7d\xb5\xad\x3b\xc6\xbf\x6b\x3b\x57\x0b\xca\x6e\xd9\xfe\x3b\x93\x25\xe0\x8b\x30\xfd\x68\xd0\xd9\x5c\x07\x35\x1a\xce\x1d\xed\x71\xc9\x04\x44\x11\x2b\x8c\xaf\x09\x15\x8d\x8c\xf9\x24\xbc\x99\x26\x59\xf1\xa9\xb5\xab\x07\x82\xf2\xb0\x48\xbb\xeb\x61\x4c\x4f\x1f\x9b\x06\xfe\x2a\xa5\xc6\x68\x8e\x98\x33\x0b\xd3\x9a\xf6\x42\x0f\x00\xb6\x59\xb3\x3b\xc9\x46\x38\xed\x97\x43\x92\xb5\xc1\xdd\xab\x59\xd6\xa2\x7e\x83\x7c\x78\x97\x13\x59\xf8\xf6\x5d\xec\xdb\x23\x0b\xc5\x0e\x60\x71\x55\x43\x38\x0b\xcf\x75\x8a\x8d\xd9\x5e\xf6\x65\xee\x7a\x34\xa6\xbe\x5b\x64\xad\x3c\x8c\xb2\x3a\xf2\xb9\x94\xc0\x49\x33\x8b\x99\x0d\xfc\x61\x0c\xf9\x42\x98\x02\xc3\xc2\xb8\x83\xb4\xe7\x16\x08\x4e\xb3\xac\x2b\xe2\x40\x04\x1b\x2d\x77\x5e\xbf\x30\x50\xf4\xf5\xc5\x18\xa9\xc2\x53\x91\xf5\x3a\xda\xe2\x6b\x03\xb7\xda\xbc\x52\xda\xae\x08\xb4\x47\xca\x0f\xec\xb6\xd1\xcc\x94\x8d\xb6\x51\x4b\xa4\x8a\xde\x5f\x10\x3a\x81\x3b\x93\xa5\x6c\x22\xed\xc5\x13\x79\x32\x51\xcc\x99\xc9\x8d\x07\x71\xda\x32\xfa\xa2\x06\x71\x3e\xe8\x5d\x4e\xfe\x95\xf3\xa4\x94\x79\x13\x10\x8b\xb3\xc7\xbf\x84\xe7\x49\x27\x6c\x12\x72\x82\xec\x6e\xc1\x7c\xf1\xa7\x35\x65\x6f\xa3\x10\x96\x8a\x42\x53\xe7\x2f\x42\x0c\xb5\xd4\xca\x21\x64\x0a\xe7\x99\x4b\x9f\xfb\xcd\x9a\x4d\x3a\xf7\xc0\x36\xe4\xc8\xeb\x6a\x6b\xca\x91\xe2\xa3\x18\xae\x42\x45\xd3\x83\x27\x90\x3b\x93\xa5\x81\xc9\xa4\x40\xe2\x34\x97\xab\x9e\xce\xb8\xde\xea\x25\xe6\x15\xf0\x5c\x08\xa9\x9d\xe5\x8a\xec\x14\xe5\x39\x8a\x87\xdc\x9a\xe4\xe5\x6c\x49\xd9\xe8\x9c\x8a\x15\x91\xf6\x15\x4d\x5e\x69\x55\xa0\xd6\x83\xf5\x63\x62\xd4\x66\x65\x16\x99\x27\x7b\x32\x4d\x39\xe4\x1f\xd3\x5f\xee\xe0\x06\xbf\x9c\x61\x2b\x72\x3f\xde\x34\xd9\x2d\x8f\x77\x2b\xc2\xbf\x4e\x97\xf8\x58\xb7\x44\xbc\x1d\xf5\x4d\xb0\xac\xac\xc2\x2d\xe4\x33\x7b\xc9\x81\x0a\x57\xdc\x4d\xd3\x47\x8b\x80\x9c\x99\x30\x3b\xeb\x04\xe5\xfc\xec\x5e\xf6\xa9\x9a\x13\x94\x53\x3c\x4c\xe5\xd3\x4e\xda\xc3\x4d\x49\xb2\x1c\x09\x3a\xad\xd2\x0c\x8f\xc6\xcb\x61\x2c\x1a\x84\x4c\xd1\x9b\xa6\x8f\xd2\xb9\x19\x3c\x0c\x89\x73\x21\x1c\x89\x60\xdb\x80\x80\x02\x95\x36\xcb\x8b\x60\x4c\x14\xfe\x81\xac\x00\xde\x01\x7f\xe0\x92\x70\xe8\x7e\x65\x99\xdd\x34\x01\x8d\x56\x7e\x85\xbb\xa5\x24\x52\xcc\xbf\x67\x35\xa9\xa1\xa9\x5a\x1e\x97\x61\xe7\x58\x52\x95\xe2\xd6\x9b\x0a\x1e\x4c\xae\xa6\xa1\xdc\xab\xe2\xa6\x40\xfa\x28\x1e\x4c\xc0\xa3\x1d\x1e\xe3\x4c\xc9\x1a\xaa\x98\xad\x46\x13\xed\xee\x06\x03\xe4\xca\x1f\x1e\x23\x9f\x2a\xa2\x31\x3e\x5c\x63\xef\xd8\x89\xc6\xa8\x8e\xc6\x58\x6e\x8a\x22\xfa\x4c\x4e\x0a\x5b\x4d\xfa\x7e\x8d\xec\xe9\xf2\x34\xc7\x90\xca\x6f\xd7\xf4\x0a\xf9\x12\x50\xb7\x9a\x3b\x7a\xea\xac\x33\x96\xb3\x2d\x9a\x74\xc2\x3c\xd7\x5b\x64\x50\xc4\x51\xe8\x87\xe4\xe8\xa9\x52\x30\xf6\xa3\x18\x2f\xa9\x1c\xaa\x5b\xf2\xe4\x32\x99\x05\xfc\x60\x1d\xaa\xb1\xd3\xde\x8b\x36\x81\xee\xc7\x1a\x74\x3e\xec\x84\x11\x4f\x23\x45\x7c\xa7\x8a\x28\x9e\x6b\x25\xa9\x29\x10\xf2\x6c\x0f\x30\xba\x3f\x01\x94\x5e\x98\xd8\x91\xe0\x8a\x6c\xb0\x9b\xca\xef\x99\xf7\xd1\x6c\x30\x7e\x31\x86\xde\x92\x29\xbf\xe2\x11\x35\xb3\xfd\xb7\x7b\xec\xb5\x2a\xa0\xd1\x09\xc7\x9a\x9b\x71\x45\xc4\xf4\xd1\x06\x3d\xa3\xfd\xad\x76\xf8\x32\x2c\x76\xfd\xc4\xc5\x9c\x30\x9f\xb0\xa3\xe6\x3e\xe0\xb1\xb7\x3c\x34\x51\x73\xdb\x1f\x75\x8b\x37\xfd\xdf\x54\x85\x9e\xf3\x2e\x07\xd2\xfd\x50\x64\xfe\xaf\x7b\xec\x89\x53\x41\x90\xa9\x33\x50\x27\x59\x11\x19\x9d\x3b\x35\x3f\xfb\x53\xb4\x69\x3d\x87\x3b\x9e\xde\x34\x0a\x12\x3b\xf7\xac\x79\x17\xb9\x8a\x8c\xf0\x20\xf0\x1b\xcc\x9f\x0a\xe4\xce\x6c\x97\xb1\x46\x74\xc0\xb5\x64\x34\x48\x93\xae\x7f\x80\xfd\xf0\x69\x68\xc3\x86\xdf\x7c\xd1\x98\x43\xe6\x60\x76\x2b\x4c\xae\x6f\x65\x43\x82\x48\xbf\x78\x09\xbb\xdf\x0d\x22\x35\x6f\x6c\x38\x76\xb4\x78\x43\x47\x90\x06\x89\x4a\xef\x5a\x43\xf4\x27\x69\xb5\xe4\xdf\xa3\x0d\x28\xd9\x79\x6f\xb4\xcb\xf3\xb6\x33\xb2\x6f\xde\x4d\x5e\x55\x23\xbe\x79\xc6\xc0\x05\xf8\xff\xe4\xb1\xbf\xf1\x8e\x0e\x5c\xb7\x33\x0f\xf1\x02\x74\x48\x7d\xb9\xcc\x6a\xbc\x2e\xb3\x82\xbc\x4e\x99\x14\x65\x39\xba\x86\xa2\x82\xc0\x9a\xcd\xf9\x50\x6a\x7d\xa4\x7b\x9c\xbb\x6d\x7a\x53\xa1\x5c\xcb\xba\x75\x56\x40\x17\x6a\x7f\x13\x7c\xa2\x9b\x38\x31\x77\xf7\x7a\x04\xc6\xcb\xbf\x87\xc5\x73\x3c\x6f\xeb\x9e\x97\x3f\x0f\x04\xc2\x5d\xb4\x56\xfc\x81\x2d\x2c\x7e\xdb\x63\x1f\x5e\x5b\x58\x0c\x34\x0e\xb7\x45\xad\x70\x40\x14\x51\xa1\x5f\x58\xf6\xf2\xed\xc6\xde\xae\xdf\x27\x4b\x80\xbc\xcb\x23\xc5\xb4\xf4\xdf\xe0\xb1\x97\xb9\x33\x4d\x0f\xb5\xb1\xfd\x81\x40\x87\x89\xa6\x83\xdd\x8b\x8e\xe6\x49\x37\x89\x92\xe5\xfe\x45\xfb\x04\x1f\x19\x75\xd8\x31\x2c\x92\xc2\x05\xd1\xe9\xca\x83\x3c\xc4\xf1\xbd\x7c\x94\xdd\x5a\xba\x66\x81\xe9\xc0\x0e\x03\xb0\x2a\x90\x9a\xad\x2c\xc5\x70\x40\x85\xe3\x8b\x3e\x83\x80\x3c\xe4\x34\x57\xa5\xb8\x26\xb7\x91\xff\x7f\xc6\x2f\x7c\x59\x7b\x4f\x3e\xef\x91\xfd\x1b\x21\x87\x04\x27\xc9\x9b\xc0\x49\x52\xd0\x33\x1a\x34\x02\x8c\x5c\x58\x12\x6d\xbe\x12\x22\x1e\x4d\xae\x69\x34\x1f\xda\x98\x05\xf2\xe6\x47\x90\xeb\xd6\x61\x04\x9a\x53\xcc\xcb\xc7\x65\x25\xd3\x0a\xf8\x10\x3a\xe4\x7f\xfd\x52\x76\x7c\xf8\xed\x01\x9b\xad\x73\x13\x77\x13\xcd\xea\x0c\xb4\xc8\xee\x96\xfa\xdc\xbd\x3b\x6e\x91\x1d\xb7\xc8\xc3\x17\x14\xf1\x0d\x5b\x90\x3d\xb0\x6d\x41\xf6\x2a\x6f\x51\x97\x66\xd3\x42\x3d\xec\xa2\xed\xe7\x6a\x4a\xb4\xdd\x5f\x23\x4f\x19\x2a\xda\x36\x27\x18\x40\xfa\xfd\x9a\x07\xa8\x59\x45\x67\x37\x2a\x0b\x39\x65\x6a\x7e\x4c\x68\xf9\xc0\x1e\x72\xc1\x78\x6f\xcd\xf8\x8e\xbf\xe7\x91\x13\x17\x6a\x60\xd0\x8b\xfc\x36\xaf\x4c\x10\x56\x05\x18\xf1\xf0\x8f\xc2\x83\xde\x73\xbd\xf5\x7d\x83\xcf\xf2\x9f\x61\x7c\x83\xf6\x70\x14\xa0\x40\x25\x1f\xe1\xf0\xf1\xa9\x84\x1a\x7c\x7f\xcd\xc9\x1c\x1d\xf0\xd6\x9f\x4c\x62\x9d\x9d\x30\x95\x63\xaf\x45\xe6\x3f\xe8\xb1\x7b\x2a\xef\x58\xdc\xf0\x2a\x17\xca\x94\x46\x79\xf1\x94\x9b\x6c\x1e\x27\xf1\x84\x43\xa0\xac\xa4\x17\xe2\x0d\xa9\x32\x84\xe2\x0f\x6a\xf1\xa6\xab\x16\x25\xf2\x98\x07\x9a\xfa\x01\x76\xb9\xad\xa9\x9f\x39\x7d\x1c\xb3\x54\x0c\x42\x0a\x94\x6c\x8b\xa1\x43\x64\x74\x45\xa4\x4b\xfe\x13\xd8\x4f\xde\x26\xd2\xa5\x01\xd1\x71\xf3\xc2\xc2\x9c\x1c\xb4\x25\xfb\xa5\xbf\x1e\x73\xce\xbf\xc6\x72\x3f\x9d\x26\xf1\x2d\xc9\x12\x84\x06\x7e\x6e\x8c\x8d\x5b\xbf\xab\x88\x26\x9a\x69\x12\xd3\x3b\x93\xa5\x21\xe1\x7e\xef\xbf\x64\x67\x87\xde\xee\x0e\xdd\xd4\xf1\x92\x4f\x63\x3f\x19\x56\xc6\x4b\xe2\x27\x72\x53\x0c\x26\xc8\x13\xc8\xf8\xfa\x8e\x1a\xf5\xee\x8e\x1a\xb0\x0d\x35\xe0\x73\xb6\x1a\xf0\x89\x6d\xc6\x46\xfe\x87\x87\x09\x52\x5a\x57\xf4\xa0\x77\xdb\xfa\xf2\xfc\x90\x7f\xd0\xc8\x73\x98\x4a\x45\xcc\x5f\x21\x2e\xca\xf1\x1c\xdf\x78\x74\x65\x32\xf3\xf4\xfc\xec\x10\x3b\xd4\xaf\x3e\x9a\x9d\xb6\xcc\x50\xca\xbe\xa7\xc2\xe5\x32\x65\x37\xc2\xc8\x02\x8b\x1e\x6e\x7a\x7e\x56\xdb\x0d\x82\x34\x5c\x11\x29\xdd\x7f\x44\xe4\x5c\x63\xad\x8c\x9f\xf7\x76\xe3\xf5\xf3\x9e\x02\x35\xb8\x99\xc7\x41\x89\xfc\xef\xa3\x3e\x79\xcf\x08\x79\x4c\xe1\x87\x9b\xeb\x2d\x45\x61\xd6\x36\x09\xb3\xfe\x4b\x47\xb6\x90\x71\xfb\x95\xda\xf4\xd0\x12\x75\xb4\xb5\x7a\xd6\x58\x8e\x30\xf5\x56\x2d\x2b\x2b\x06\x3b\x13\x90\x8d\xbe\x22\x9c\xe0\xba\x3c\xa1\x5d\x20\xe9\x57\xe4\x86\xf3\xb3\x7a\x14\x14\x74\x65\x24\x14\x76\xa5\xbc\x35\xd0\x1a\x45\xb3\x22\x45\x61\x71\xef\x4c\xdc\x75\xee\x36\x79\x14\x65\x65\xbf\xa0\x06\x7c\x2c\xe4\xe8\x92\x40\x1b\x19\x0d\x5b\x00\xbb\x88\x1d\x09\x71\x4d\x03\xdf\xa8\xc6\xc0\xac\xec\x63\x86\x11\x2a\x79\x1b\x7c\x4e\xfa\xa1\x3a\xe4\x54\xe1\xdf\x18\x21\x22\xbb\x2b\x82\x06\x79\x2a\x51\xdf\xd5\x3f\xc5\x8e\xcc\x60\x9f\x2b\x10\xc6\x8a\xd1\xe8\x65\x1a\xe4\x2b\xd4\x96\xa6\x21\x5c\xa8\xaf\x1a\x21\x3f\x1c\x27\x81\x18\x98\x04\x3f\xa8\x6d\x61\x12\x7c\xa6\x76\xb2\xa2\xac\x87\xe3\xf3\x5b\xed\xb0\x3e\xbc\xbc\xfa\x2f\xe3\x93\xff\x8a\x47\x9c\x25\xec\xbf\xd9\x63\xaf\xf4\x6e\xb3\xae\xe8\x19\x80\x60\x2f\xb6\xc7\x89\xa6\x22\xef\xa5\x71\xe1\xc7\xb3\xe4\x06\x52\x35\x7e\xed\x39\xaf\xcd\xe8\x34\x98\xb4\x6e\x33\x76\x48\xf8\x40\x7a\x78\xd5\xe3\x52\x2b\x94\x2d\xec\x2d\x65\x72\xb7\x8a\x73\x3d\x5c\x95\x93\xe9\x81\x11\xf2\xaf\x0b\xb9\x72\xf4\x5c\x97\xc7\x41\x31\xa3\x3e\xb6\x15\xb1\xf2\xfc\x91\xe9\x61\x05\x3e\xbc\x52\x05\x1b\x63\xcd\x21\x35\x85\x14\x16\x19\xa0\xb5\xe2\x74\x42\x0f\x0b\x0c\x57\x46\x45\xcc\x97\x00\x43\x10\xdf\x9f\x9e\x9f\xbd\x4d\x39\x11\x94\x10\xa7\xcb\x10\x43\xf4\xcf\x6c\x3a\xbe\xd4\x33\x8e\xe8\x7b\x3d\xb6\x52\xf6\x43\x17\xfe\xd1\x13\x2a\x9c\x99\x0f\x38\x98\x37\xee\x5d\x6e\x0c\xf1\x2b\xdb\x53\xed\xcd\x23\xc4\x8f\x11\x8b\x70\x59\x14\x73\xec\xc5\x5b\x99\x63\x5f\xaa\x9d\x1c\x28\xe9\xe1\x92\x59\xd0\x8a\x92\xc4\xaa\xba\x76\x26\xce\xac\xab\xff\x3c\x65\xd8\x39\xcb\x35\x12\xb1\x67\x9d\x52\xed\x39\x5c\xa0\x98\xda\x03\x34\x64\xc3\x56\xa4\x6c\x15\xfe\x0f\xba\xbf\x08\xce\x18\x77\xb1\xbd\xcf\x90\x47\xa2\x00\xb3\x8e\xc4\x53\xec\xb1\xd6\x31\xb8\x14\x39\x91\x50\xb5\x29\x34\xde\x59\xf2\x34\xda\xd9\xec\xdf\xdc\x43\x1a\xc3\xa8\x9c\x2d\x76\xe2\x23\x61\x1c\x84\xf1\x32\x9c\x33\x7f\x65\x0f\xfb\xb8\x57\x7d\xaf\x92\xdc\x70\xe0\x49\xf0\xfc\xd8\x28\xee\x2b\x07\x1b\x07\xaf\x71\xe0\xdc\xa1\x1d\x55\x71\xc9\x93\x2b\x07\x2b\x4a\x94\x75\xe3\x9c\x00\xe7\x54\x9c\xd0\x28\x89\x97\x01\x37\x56\x23\xff\x62\x35\x57\x5c\x51\x7d\xf2\xfd\xb3\xdd\x3b\x67\xaa\x6d\x9c\xa9\x5a\xd6\x91\xea\x69\xdb\x3b\x51\xfd\xf8\x1a\xee\xa1\x1d\xeb\xc4\x76\xad\x13\x77\x6b\xeb\xc4\x5d\xec\xdf\xcd\x16\x74\xa4\xc6\x36\x31\xb8\x56\x6d\x2b\xc5\x13\xc9\x61\x72\xed\xd0\xbd\x68\x1d\xd9\xf1\xa0\x77\xf7\xfa\x47\xd5\xdb\xfd\x33\xe6\xa8\x3a\x54\x06\x14\xc7\xd7\x4a\x41\x50\x69\x73\x7c\xc7\x6e\x72\xc7\x56\x91\xce\x55\x8f\x86\x80\x80\x17\xd8\x76\xbf\xb5\x8b\x3d\x75\xdd\xa7\x8a\x9d\x47\xfb\x95\x0b\xea\x0f\x34\x19\x17\x31\xc9\x7a\xca\x76\x93\xa0\xb1\x26\xe4\xdd\x67\x47\x89\x28\x20\xdc\x9e\xc6\x4e\x18\xcc\x36\xf9\x75\xdb\x17\x10\xcf\xed\x4e\x03\xe7\xb6\xc8\xe6\x15\xfe\x1a\x54\xa2\xb1\x7f\x93\x58\x4c\xac\x26\x69\x50\x2f\xa4\x92\x8d\xd3\xe6\xc4\x4c\x57\x60\xb5\xd9\x75\x3d\xcd\x58\xec\xe7\xd8\x74\x66\xf2\xb4\xca\x61\xdc\x36\xba\x9e\x14\x90\x52\x3a\x2e\x00\xb6\xc4\x31\xb9\xa7\xd6\xa9\xe2\x46\x71\xca\xbe\x4b\x41\x01\x86\xec\x19\x3a\x56\x50\x96\x64\x87\x20\x5a\xa5\x4a\x2d\xd1\xd8\x99\xe9\xd1\x2c\xe7\xb0\xb3\x8a\xa0\x4e\x21\x8a\x64\xaa\xd9\x14\x5d\x4d\xfa\xbc\x20\xd2\x0e\x60\xa8\xc4\xcb\x4e\x95\xbf\x54\x0d\xfc\xf7\xd2\x35\x32\xe8\xd7\x0b\x4c\x9e\x1f\x2c\x4f\x8d\xe8\x36\xc0\x00\xff\xb7\x47\x16\xb6\xb7\x54\x6e\x99\x3f\x75\x12\xf9\x53\xe6\xd2\xa4\x9b\x9d\x4a\xa7\xa4\xfc\xf0\x5f\xeb\xb1\x57\x7b\xd5\xf7\x6c\xd7\x32\xd7\x8a\x14\x12\x9d\xc7\x54\x84\x0a\x03\x9e\x72\x5a\x7a\x9d\x22\xcc\xb3\xc1\x49\x2e\xdd\x6e\xd0\x13\x3c\x34\x81\x2b\x00\x32\xab\xd8\xd6\x51\xf8\x77\x7b\x69\x37\xc9\x44\xd6\x20\xef\x25\x95\x11\x17\xd3\x49\xa7\x9b\xc4\x22\xce\x55\x0e\xd3\x0b\x09\xeb\x97\xae\xd1\xfd\x68\x7f\x71\x2e\x4a\x39\x34\x6e\xa7\x20\xa1\xa4\x92\x3d\x0b\x03\xae\x82\x33\x5b\x89\xad\x08\x29\x24\xee\xa9\xb9\xd9\x41\x9a\x1b\xa9\x20\x5d\xf7\x04\x67\xc9\xff\xe2\x18\xf9\x82\xe7\x24\x7a\x7c\xd2\xb3\x21\x5e\x55\x73\xec\x04\x05\x0d\x5f\xba\xf1\xf4\xfc\x81\x61\xb8\xb8\x58\xcf\x3b\x2a\xd8\x0e\xcc\xc8\x0e\x22\xc0\x05\x45\x04\xb8\x7d\x7d\x9d\xeb\x4a\xff\x8a\x2a\xba\xc9\x92\x44\x2b\xfb\x07\xfe\x6e\xac\x32\xb7\xc2\x25\xa9\x5c\x48\xce\x8a\x78\x0e\x13\x16\xe4\x07\xfc\x8d\x31\xf6\x1d\x6f\xcd\x47\xdc\x8d\x40\xe5\x3a\xc8\xcf\xa0\xc8\x26\x15\x2d\x2b\xcd\xe5\x6b\xc6\x0e\x0c\x92\xb3\x5b\x14\x32\x00\x72\x95\xc9\xaf\xca\x87\x94\x12\xc6\xea\xe3\x42\x92\x4a\xda\x8b\x61\xf7\xb4\x8c\x3d\x72\xe3\x00\x26\x02\x4c\x52\x97\x32\x3a\xa3\xfb\x0b\x42\x11\x10\xda\x38\x95\xe4\x86\x04\xfb\xe8\x6a\x98\x89\xf1\x46\x55\x00\xec\xaf\xed\x26\x3f\x5b\x23\x63\xbc\x17\x84\x22\x6e\x0a\xff\xbe\x1a\xfb\x07\x6f\x4a\xfd\xd2\x8a\x88\x9c\x60\x90\x10\xa4\x1f\xd3\x5a\x09\x34\xb9\x41\xa7\xe4\x1c\x0d\xbb\xa1\xca\xe2\xe4\xaa\x2b\x90\x39\x62\x62\xcc\xc3\x3c\x13\x51\x4b\x31\x44\xc5\xfa\x7a\x28\xd2\x41\xd6\xb7\xca\x6a\x70\x5e\x9b\xee\xe8\x55\xa2\x26\xb9\xd5\x9a\x05\xbb\x84\x72\x34\xad\x55\xad\xc6\x2b\x35\x8a\x84\x13\xdb\x34\x42\x1e\x25\xce\x75\x43\x15\x59\x21\xe4\xce\x95\xf9\xbf\x38\x02\xd9\x0d\x57\x5f\xc9\xfe\xe3\xc8\xd1\xf2\xdd\x02\xa1\x1b\x04\xb4\x08\x68\x60\x85\xa3\xc1\x66\x1b\xe6\x7d\x2b\xcd\x75\xf0\xeb\x37\xe8\x54\x56\x74\x85\xf2\x6e\x37\x4d\x38\xc0\xc1\x15\x6d\xa9\xdb\x09\x36\xae\xd9\x19\x0d\x0e\xf0\x8e\x4e\x47\x4a\x72\xae\x2c\x60\x43\x2a\x5c\xb0\x0a\x43\xba\x30\x20\xf2\xca\xd3\xbe\xca\x0a\xb2\x8a\x50\x33\xb4\x65\xff\xc8\x68\x12\x05\xb0\x81\xf1\x98\x5e\x7b\x80\x76\x45\xda\x54\xf3\x20\xd4\x09\x6a\x79\x42\xa3\x70\x05\x92\x7b\xd6\x78\xf9\x8a\x2b\x69\x3b\xe9\xa5\x59\xc3\xb6\x44\x1d\x84\x6b\x28\xd2\xb4\xe9\x33\xa7\x91\x90\x7a\xe5\xc1\x03\xb4\x13\xc6\xbd\x5c\x94\x32\xad\xda\x2a\x1c\x62\x91\xcd\xdb\xe1\x10\x10\x0a\x91\x8a\x88\x83\x19\x51\xcd\x07\x0c\x4a\xc7\xcd\x56\x7d\x19\xb9\xd6\xc0\x62\xa5\x72\x9b\xac\xf6\xc6\x79\xe2\xcc\x92\xaf\xef\x71\x82\x47\x10\x94\xa3\x88\xd4\x49\x82\x99\x30\x53\x3c\x23\x47\x7a\xc1\xb2\xc8\x21\x52\xf6\x3d\x7b\xd8\x91\x21\xf7\x50\xc5\xc0\xb0\xd9\x6e\x11\xc9\x58\xf1\xb4\x1b\xce\xf8\xdf\xc7\xc8\xf9\x11\x32\x96\x69\x14\xc8\xff\x38\x42\x9e\xbc\x15\xc3\x07\x5f\x12\x91\xc1\x85\x7c\x7d\x0d\x7e\xd3\xbb\x7a\x22\xed\x03\x50\xaf\xce\x9c\x4b\x32\x41\xc5\x4a\xd8\xcc\x0d\x57\x9d\xe5\x51\x55\xc9\x24\x9a\x5f\x65\x09\x9b\x4b\xa7\x68\xdc\x03\x43\xa6\x02\x61\xc4\x3f\x32\x1a\x27\x98\x2c\x07\x24\x68\x60\x3d\x35\x8f\xec\xbf\xe7\xd9\xe3\x98\x7a\x56\x7a\x58\xb3\xba\x04\x61\xab\x25\x77\x4c\xcc\x1b\xd4\x3a\x82\x1d\xee\x85\x2f\x42\xea\xa3\x5c\x1a\x50\xd1\x6c\xac\xe0\x53\x26\x57\x0e\xd6\xc1\x01\xec\x56\x8b\xcb\x00\x7e\x99\xb7\xb4\x68\x2a\x40\x5d\x1e\xf4\xc6\xd7\x56\x25\x89\x3f\xa6\x68\x62\x08\xf9\x9b\x1a\xb9\xac\xc3\xcf\x9d\x89\x4d\xe0\x8f\xff\x3f\x6a\x1b\x55\x8b\x7a\x79\x18\x35\xc2\x38\xcf\xf2\xb4\x31\x1b\xe7\xa7\xd2\x79\x98\x7d\xec\x75\x35\x39\x64\xea\x33\xd8\xb8\x1f\x61\x4b\x2e\x92\x4e\x92\xe5\x94\xb9\xb5\x32\xec\x0c\x76\x0e\x3f\x17\xd3\xfd\x66\xc8\x55\x58\x3c\x4c\x79\x2b\x57\xe0\x22\xba\x96\x3a\x0d\x1b\xa2\x41\xc5\x8a\x40\xa8\x9b\xa5\xcc\x96\xd3\xf0\x14\x80\xd3\x04\xa5\x44\x7d\x79\xba\x03\xc0\x9c\x54\xbe\x8a\xc3\x2a\x45\x57\x9c\xf3\xb4\x6f\x4d\xa5\xa5\xbe\xce\xd4\x92\x9f\xec\x80\xe5\xf3\xa1\x9d\x5e\xde\x03\x52\x40\x71\x4e\x1e\x60\xe4\x1a\xd6\x19\x41\xb0\xa7\xb0\x4e\x18\x4f\x99\x7e\x36\xc8\x67\x6a\xe4\x52\xfb\x92\xff\xe1\x6d\x0f\xf8\xdf\x7a\x6b\x0e\x38\x4a\x25\xb7\x1d\x6b\x8e\xb7\x92\xb7\x86\x68\x6c\xc3\xe3\x0e\xfb\xd6\x1a\x63\x4f\xe7\x13\xc4\xb1\x55\xa4\x82\x3a\x4f\x6d\x73\xc3\xcf\x0e\x1e\x38\xf0\x38\xd6\x20\xcf\x27\x95\xf9\x4e\x40\x4a\xd4\x82\xd1\xec\xfb\x7f\xba\x87\x5d\x2f\x2f\x50\xae\xae\xe0\x47\x33\x44\x79\xb1\x73\xaf\x60\x57\xa1\x69\x2f\x12\xa5\x74\xa7\x9f\xdb\x43\xde\x3f\x42\x1a\xda\x69\x32\xd3\x93\x83\x3f\x6f\x5e\x99\x5d\x8e\x13\x73\xf9\xe8\x39\xc0\xa0\x48\x62\xff\x1f\x6b\x64\x62\x63\xec\x1e\x7a\xfc\x3f\x57\x53\xde\x18\xd3\x2e\x55\x65\x07\x83\x46\x8c\x5a\x02\x42\xcd\xb8\x7e\x34\x59\x6d\x47\xe4\xf2\xab\x5b\x7d\x91\x9b\x5d\x5d\x2b\x6f\xda\xfa\x0f\x7b\x96\x7a\x48\x04\x34\x89\x1d\x9a\xad\x2d\xb5\xa0\x29\x78\x66\x52\x5b\x54\x2b\x12\xa9\x05\xc0\x36\x16\xc0\xc0\x40\x13\x84\x1e\x1d\xc5\x77\x17\xa0\x4b\x88\xc7\xea\xb8\x38\xae\x70\x08\x50\xb3\x94\x67\x86\x24\x85\x7f\x64\xb3\xf3\xb4\x0f\x30\xcb\x72\xc6\xa8\x95\x27\x27\x8a\xe9\x1f\x08\xdd\x30\x47\xa6\x96\x06\xf9\xe3\x5d\x64\xb2\x0b\x0e\xbd\x8d\x7f\xb3\x77\xee\x62\x7f\x3c\xba\xd0\x2e\xc6\x27\xd5\x2a\x8c\xf6\x95\xeb\x1b\xb8\x8e\x80\xef\x2e\xd0\xb0\xc3\x19\xcf\xc3\x4c\x65\x2f\x9a\x01\x54\xe8\xc2\xc8\x49\x5a\x3d\x7e\xc8\x20\x16\xe6\xd0\xd3\x66\x3b\x01\x4e\x3d\x8b\x0d\x68\x25\x4c\xe0\x64\x85\xd0\x0a\x0a\xee\x44\x2f\xb3\xa2\x78\x05\x9e\x62\x5e\x0b\x33\x14\xb9\x66\x10\xb4\xe2\x21\x8b\x01\x11\x25\x7f\x2c\x43\x54\x40\x26\xcf\xf3\x1d\x59\xe8\xaa\x08\x97\xdb\x79\xa6\x16\x78\x01\x3e\x6d\x8a\xed\x08\xf0\xfb\x45\x51\xc1\x92\x57\x2c\x1e\x7b\xb6\xec\x2f\x87\x90\xd6\xe9\xb0\x25\x54\x39\x5c\x75\x2a\xf2\x66\x63\xbc\x6e\x68\x6a\x39\xb4\x71\x49\xaa\xee\xda\x89\x9c\xb7\xd3\xa4\xb7\x8c\x3d\x51\xb8\x2d\x05\x7e\x45\xe1\x8e\xe7\x41\x00\x02\x04\x3b\xc7\x8c\x77\xb7\xd7\xd1\x0a\x20\xf4\x4f\x63\x1d\xa3\x6d\x30\x4d\x45\xd6\x4d\xc0\x72\x8e\x77\x8e\x16\x6d\xbb\xde\xbc\xb4\x3f\x1b\x2f\x06\xb3\x1d\x2e\xb7\xf5\x58\xf2\x54\x28\x8d\xce\xfe\x06\x8d\x8d\xbb\x0c\x4c\x82\x8d\x7e\xb7\x18\xaf\x05\x91\x76\xc8\xa7\x77\x55\x1e\x32\x2b\x09\x64\x74\x16\x94\xff\xd2\x5d\x6c\x20\x57\xd2\x79\x42\x4e\x12\x7d\x34\xec\xa6\x49\xd0\x6b\x0a\x5a\xf9\x82\x06\xc7\xa4\x3c\x83\xcc\x64\x65\x3c\x38\xda\x6d\x8b\x8e\x48\x79\x64\xc7\xbf\x55\x82\xbe\xdd\x3b\x4a\xbe\x65\xdb\x65\xfe\x68\xdb\x76\x99\xd7\x7a\x27\xe4\x0a\x42\x1f\x02\x85\xa4\xcb\x4c\xd1\xf2\x6a\x7c\x65\xb5\x54\x35\x50\x72\x33\xe9\xe2\x39\x4f\xcd\x88\xb9\xdb\xa6\xad\xfc\x2f\xc8\xee\xcd\x1b\xf4\x64\x82\xe7\x3c\x4d\xcd\x8d\x54\xdc\xb8\xd5\x1a\xbf\xea\x92\x50\x67\x3f\x3c\x68\x29\x9b\x9c\x32\x68\x36\xc8\xab\x74\xe6\xc1\x4b\x6a\xe4\xf0\xfa\xdf\xbc\x6a\xc4\x21\xd1\xe0\xf3\xde\xc2\x40\x7a\x81\xf6\x1d\x54\xbe\x85\x62\x41\x9e\x32\x11\x24\x09\xa0\x1a\x00\xb2\x05\xba\xde\x8b\x9b\x6d\x1e\x2f\x97\x07\x01\xc9\x64\xe4\x4a\x77\x32\xe1\x60\x5d\xe9\x64\x38\x2c\x19\xf2\x41\xf5\xc0\x64\x88\x0b\x55\x3d\x61\x70\xd8\xb2\x04\xc7\x05\xcc\xce\x0d\xf2\x89\xbd\xe4\x27\xab\xb3\xca\xcc\x5e\xfe\xba\xbd\xec\xc6\xb9\x24\x18\xb6\x95\x83\xb9\x09\x76\x80\x0d\xee\xe7\x9f\x23\xe4\x2b\xa3\x9b\xde\xcf\xdf\x36\xca\xbe\x36\xf2\x7f\xeb\x06\x0d\x37\x61\x41\x5d\xf8\x9d\x1a\xd1\x5f\x72\xf0\x42\xc0\xd1\xad\x17\xe5\xa1\xd4\x12\xb5\x40\xaf\x9b\x10\xf1\x4c\xab\x6e\x59\x49\x3e\xcb\xda\x14\xcd\xae\x9e\x36\x52\x46\x42\x79\x30\x3f\x32\x58\x98\x6a\x57\x93\x9b\x57\x2e\xd2\x4e\x66\xce\xf0\xb8\x75\x87\x25\xf9\x7c\x25\xb9\x62\x03\xe1\x45\x73\x6e\x9d\xe4\x3b\x5b\x50\x3c\x3e\xba\x8b\x7d\x67\x47\xf1\xf8\xbf\x56\xf1\x68\xf3\xcc\x06\x01\x1a\xae\x87\x94\xe6\xf7\x43\xa9\x86\xdc\x0e\x5d\x10\x41\x79\xba\xbf\xdf\x0d\x92\x2a\x88\x55\xba\x91\xda\x9f\x8a\x48\x2f\xe5\x28\xfc\xc7\x31\x76\xdb\x1a\xf7\xd7\x82\x3f\xd4\xe9\x62\x69\xf1\xba\x05\x31\xd5\x38\xef\x8d\xa9\x3b\x6e\x0c\xc0\xfd\x63\xa4\x49\x1e\x91\x0a\x1e\xf4\x55\xc5\x99\x7f\x5a\x23\xc3\xdc\xe0\x62\x27\xc1\x53\xba\x82\xac\x88\xab\x1e\x52\xa5\x63\xea\x7b\x00\xe0\x01\x54\x05\x9f\xf5\x74\x0d\x1f\xf4\x74\xad\x7a\x29\xc0\xe7\xb0\xb8\x13\x15\x71\xad\xd5\x08\x7c\xfe\x02\xc1\xa1\x59\x6d\x2f\x2e\x5f\xbe\xda\xe6\xf9\x44\x98\x4d\xf0\x89\xca\xfb\x4e\xcf\x5e\xee\x91\x47\x19\x8b\x80\x19\xc3\x7b\x74\x0f\x5b\x25\xfc\x29\x63\x3b\x30\xe3\xb8\x1f\xc7\x15\xb8\x87\xb5\x6d\xa2\x13\xc6\xa7\xe5\x55\x65\xb1\x1e\xdf\xdc\x60\xbf\xd4\x65\x09\xfe\x3f\x1e\x7b\xea\x69\x77\xe6\xac\x8f\xea\x37\xa4\xa2\x01\x90\x3f\x7b\xbd\x4c\x93\x29\x72\xe3\xba\xeb\xa5\x72\x82\x5f\x5c\x17\xf1\x6b\x3c\xf2\xc3\x80\x73\x08\x76\x52\x11\x98\xcf\xf4\x1f\xf4\x67\xba\xb3\x02\x78\x0c\x84\x2b\x20\x1f\x28\x8d\x19\xc4\x8f\x76\x20\xab\x6b\x45\xd6\xbe\x51\xff\x8a\x34\xbe\xf5\x3f\xd5\xfd\x1e\xf1\xb5\x87\xfd\x26\x11\x2b\x10\x48\xbf\xa7\xdd\x17\x8b\xa7\x06\x6e\xd2\x54\xb4\xd0\xc8\x0a\xbb\x45\x71\x5d\x55\x5b\x5e\x41\x2a\x94\x71\x23\xad\x79\x6e\x8d\x3c\x61\x18\x13\x03\x9a\xca\x15\x27\x81\x92\x57\x5f\xf4\xd8\xb5\xce\x15\x03\x24\x31\x20\x9f\xca\xe4\x0c\xae\xe6\xf9\x22\x8f\xdc\xe7\x91\x4b\xe5\xfa\x3c\xc2\x23\x1e\x37\x45\xea\xf7\x36\x10\x62\x70\xdc\x7a\x41\x65\xd5\x3e\xc9\xbe\x56\xc4\x4d\x55\xcb\x4b\xf8\x90\x09\x0f\x26\x96\xd4\x0b\x0d\x72\x5f\x9d\x1c\xb6\xf3\x4c\x03\x85\x3c\x92\x8a\xe5\x10\xa6\x16\xe6\x9b\xe2\x70\xdc\xa6\x0e\x32\xf1\xf2\xed\x62\xa9\x9d\x24\x67\xfd\xdf\x79\x02\x5b\x1c\xb8\x6a\xe1\x6b\xf0\x98\x9a\x22\xe9\xaa\xba\x2d\x77\xc4\xdc\xe1\x3d\x06\x17\x9a\xc1\x04\x95\xaa\x08\xef\x76\x23\x20\xb1\x4f\x0a\xd2\xff\x4b\x31\xe4\x00\x93\x67\x9d\x01\xfd\xe4\xe3\xc9\xeb\x6b\xe4\x32\xa9\x47\x27\xbd\x5c\xbb\xc5\x7e\xc6\x80\x7e\x7d\xd7\x5b\x70\x6e\x95\x59\xf2\xf1\x66\x21\x76\x54\x4b\x1b\x74\xca\x98\x3c\xf5\x33\x10\xe5\xac\x74\x51\xdd\xa1\xa6\xd4\x46\xf4\xe9\x2f\x44\xd5\x8e\xaa\xc3\xd8\xd4\xdc\xac\x75\xbf\xc5\xc3\x88\x2e\xf1\x0c\x14\x7a\x74\xeb\xf0\x30\xea\xa5\x42\x99\xfe\x51\x87\xd2\x75\x61\x30\x87\x56\x4e\x97\x44\xbe\x2a\x44\x4c\x0f\xc2\x70\x1d\x3a\x40\x33\xec\x4c\xc1\xea\x96\x27\xf6\x65\x67\xae\xbf\xd1\x23\xce\xf0\xf9\xff\xd1\x23\xb7\x0c\x07\x07\x5f\x73\x1a\xa8\xcf\x3c\x6d\x15\xc7\x6e\xb4\x7f\x99\xa0\x83\x76\xb2\xaa\x42\xde\x3b\xbd\x18\x39\x94\x0a\xed\x04\x06\x58\x27\x94\x90\xaf\xee\x21\x8f\x32\x5e\x0c\x43\x1b\xf6\x3b\x7b\x2e\x80\xc3\xe8\xb9\x7b\x4e\x96\x0b\x06\x18\xe2\xc0\x86\x2a\x4f\x68\xda\x8b\x9d\xaf\x9a\xc4\x45\x14\x44\xf1\xcd\x6c\x6c\xf3\x02\xfe\x08\x67\x0e\x37\xa1\xf3\xb6\xea\xa6\x0d\xeb\xe6\xd0\xa6\x9e\x51\x9e\x67\x38\xc5\x9a\x92\x70\x62\x19\xd1\x1b\x66\x1a\xcc\x1f\x6b\x57\x31\x19\x26\xca\x04\xc5\xf2\x40\xc9\x99\x8e\x54\x33\x41\x55\x25\x5c\x7f\x00\x8e\x47\xda\xe4\xec\x6c\xd8\xcd\xec\x8e\x37\x08\x71\x9c\x24\xc3\x86\xa6\x6f\x4c\x3f\xe8\x79\x8b\x6d\x30\x2a\xa0\x26\xc8\xb2\xa4\x19\x72\x83\x70\xc4\xd2\x5e\x0c\x98\x27\x4c\x0a\x23\x76\x80\xc9\x35\xc2\x0e\xb2\xeb\x29\x42\xee\xa1\x7f\x2b\x77\x06\x8d\x82\xea\x15\x45\xc9\x6a\x76\x98\xb2\x81\x09\xc2\x0e\xd3\x7b\x08\xa5\xac\x6c\x98\x63\x87\xe9\xd3\x09\xa5\x14\xee\xca\xff\xb1\xb3\xa2\xcf\x0e\x5b\x4d\xa8\xeb\x1b\x89\xa2\x76\x93\x77\x4f\x26\xf9\x6c\x5c\xdc\xc2\xa8\x14\x53\x16\x5c\x3b\x60\x6e\x53\xd9\x76\xf5\xf7\x33\xe1\xdf\x67\x13\xf9\xd7\xb3\x09\x99\x6d\xd1\x30\xce\x72\xc1\x03\x07\x4c\x10\xd0\x9d\x36\x3f\x96\xe5\x71\x94\x6f\x33\x11\xaf\x84\x69\x12\xcb\x13\x07\x0e\x67\x37\x4d\x02\x1c\xd1\x2c\xe7\xcb\x61\xbc\xcc\xae\x7f\xe8\x86\xd5\x6e\x4d\xe5\xc8\xae\x37\xac\xd0\x7a\x6b\x64\x75\x1f\xaa\xc7\x77\x5e\x88\x0d\x69\xc1\xc9\x8a\x48\x57\x42\xb1\x3a\xa9\x36\xf6\x09\x39\x7e\x13\x6a\xa8\x27\x95\x4e\xd3\xd2\x47\x5a\x8d\x4a\x25\x87\x13\x8d\x1c\x7a\xb8\xb2\x06\x21\x96\x90\x85\xd3\x1e\x38\x67\x1d\x41\x53\x2f\x9d\xdb\x00\x52\x36\x97\xeb\xb8\x41\xfe\xe7\x28\xd9\x05\x36\x28\xff\x1b\xa3\xec\x85\xa3\xa7\xe5\x9f\xd6\x3e\xb9\x0a\xb2\xa3\xd8\x01\x41\xd0\xf0\xbc\xd8\x22\x27\xb3\xde\x52\xb1\x5f\xba\x9b\x4f\x2a\x54\x54\x32\xee\x1e\x15\x37\x40\x90\xe9\xd2\xe5\x91\x33\x2c\x44\xd4\x1d\x3c\xee\xdf\x41\x65\x83\x1a\xf4\xe6\x64\x55\x36\xba\x4e\xc3\x58\x21\x77\x83\xf9\x17\xbd\x73\xc5\x3e\x3f\xa5\xb7\x07\xb5\x13\xe0\x06\x7e\xa2\x97\x0f\xb9\x0b\x86\x9e\x6e\x2f\x37\xe1\x88\x5a\x2a\x81\x95\x10\xf5\x25\x1c\xba\xa6\x09\x1c\x4c\x45\x53\x7e\x3d\x6d\x71\xd4\x64\x77\x3a\x7b\x2a\xea\xd3\x20\xcc\x54\x52\x1d\xa8\xa4\x10\x6a\x52\xdf\x46\x2b\xc1\x3e\x07\x22\x51\xee\xd7\x28\x6f\x0b\xe5\xc5\xc4\x37\xca\xe9\x32\xa0\xf2\xb8\x18\x50\x76\x3d\x95\x0f\x54\x31\x28\x9e\x20\x4f\x21\xb3\x5b\xdc\x91\xe5\xd7\xbb\x3d\xcc\xdb\xa7\xcc\x0c\x22\x7f\xe1\x11\x50\x9b\x90\x52\x7c\xa1\x94\x33\x3c\xa0\x94\x35\x20\x48\xdb\x22\x33\x84\x03\x04\xbd\xab\xc7\x23\xc5\x05\x29\x1a\xcb\x8d\x3a\x92\xdb\x2a\x5d\xc5\x59\x79\x72\xf2\x8b\x54\x50\x66\x3d\xc1\xaa\xd2\x95\x55\x85\x18\x37\xe5\x14\x51\xf5\x74\x92\x2e\xf3\x58\xa7\x36\x54\xa7\x9f\xfe\xe5\x2e\x72\x19\x0e\xa8\x51\x1b\xbe\xbc\xeb\x02\xa8\x0d\xaf\xd8\x75\xca\x29\x75\x23\x3a\x83\x51\x13\x42\x67\x43\x6e\x73\xeb\x38\xa5\xf7\x6c\xb7\xcd\x00\xc0\xa8\xf9\x62\x4c\x14\x1d\x10\x86\x42\x41\x51\x80\xad\x81\x61\x8b\xc5\xaa\xfa\x85\x6e\x0c\xfd\xd1\xe4\x91\x57\x0b\x28\x67\x9c\x11\xc6\x5d\xb3\x53\x6a\x42\x52\xd9\x4a\x15\x38\xbe\xa6\xde\xa2\x62\x64\xd4\x33\xfb\x8b\xb6\x28\x9f\x7f\x93\x67\x02\xa1\x53\x04\x20\x73\x27\xa9\xd5\xc2\xd2\x33\x81\x90\xcb\x77\x5c\x05\xa5\x27\x56\x2f\xd4\xda\xb7\x8f\xa0\xfb\x81\xd3\x95\xd3\x19\xd1\x8d\x92\xbe\xdc\x5d\x4e\x27\x51\xb4\xc4\x9b\x67\xe1\x7d\x3a\x97\x04\x73\x69\x72\xae\x8f\x39\x86\x3a\xa6\x79\x5c\x2b\x20\x15\x5d\x06\x94\x59\xfb\xd3\x98\x1d\x11\x36\xe7\xd0\x99\xa3\x2a\x9d\x72\x42\xca\x95\x25\xd1\xe4\xbd\x0c\x62\xa0\x81\x71\x09\xa3\xa4\xa5\xf2\x54\xbd\xa0\x20\x68\x41\x14\x22\x4f\x7f\xf5\xed\x6d\x23\xff\x6d\x84\xec\x95\x5d\x3a\xda\x6a\x49\x01\xe2\xff\xee\x08\xfb\xf8\xc8\x7c\x71\x01\x85\xa9\xcd\xc0\x53\x9c\x66\x60\x16\xca\x97\xa9\xc0\x87\x1b\x14\x73\x32\x78\xc1\x5d\x2b\x85\xe0\x61\x9d\x0c\x52\xa7\x27\x93\x58\xd4\xe9\x7c\xd2\x11\xf8\xf7\xa9\x78\x26\xed\x9f\xee\xc5\xd4\x08\x4d\x50\x48\xec\x42\xe9\x89\x33\xf3\x0b\x34\x94\x52\x1a\xb1\xaf\x41\x92\xc7\xcd\x30\x0a\x15\xb3\x29\xf8\x0a\xea\x34\x0b\xe3\xa6\x80\xdb\x48\x10\xa4\x32\x55\x8d\xf3\x0c\xe8\x35\x5a\x3d\x48\x8e\xce\x72\xd1\x35\x01\x26\x66\xa4\x9b\x6d\x1e\xc6\xe6\x34\xe9\x34\x02\xdc\x08\x80\x24\x1e\x17\x0c\x15\xbd\x38\x48\x62\x85\x88\x00\xa2\xdc\x68\x53\x01\xf6\xca\x20\x21\x15\x0c\xaa\xbd\x3c\x99\x30\x4d\xc2\xd9\xd1\x57\x8b\x87\x9b\x81\x35\x83\xa0\xbf\xc2\x0d\x37\xe8\x31\x04\x00\xd8\xc4\xa2\x71\x07\xa3\x7d\x55\xb6\xcd\xfb\x47\xc9\x8f\x9a\xbe\x21\x7f\x8c\x8a\xe1\xce\xfc\x9f\x1b\x65\xff\x30\x32\x55\x7d\x53\xa5\x9e\xc3\x76\x2d\x02\x93\xa6\x56\x58\xdd\x17\x4b\x2f\x2e\xea\x20\x65\x5c\xe6\xfa\xd0\x2e\xce\x75\xd5\xa4\x98\x9b\xd5\xb4\x4e\x30\x0c\xca\x8d\x03\xe0\x12\x00\xa9\xaf\x5e\xd7\x1f\x04\x6a\xc4\x29\x1b\x1a\x34\xdc\x4c\xd1\x09\x17\x2c\x10\xa6\xd2\x52\x5c\x6d\x98\x61\x09\x4e\xa2\x78\xd1\x86\xba\x9d\x0f\x52\x9c\xa1\xcd\x51\x5d\x47\xa9\xcf\x02\xb4\xa2\x72\x38\x06\x85\x12\xe4\xec\xbb\xc5\xb1\x5f\xfb\x6d\x4d\xab\xe4\x34\x0a\x12\x81\x82\x43\x67\x31\x49\xc5\xdc\x3c\x81\xdf\x53\xc3\x5f\x99\x68\xe6\x3a\xa6\x61\x97\xc4\xae\xd5\x54\x59\xb2\x94\xcd\x3d\x25\xeb\x92\xca\x73\xbf\x25\x17\x16\x9f\xbe\x4f\x6d\xec\xfb\x9e\xb9\xb8\x16\xcb\xf2\x7b\x3d\xf2\x08\x55\xce\x1c\x14\xe3\xbf\xde\x63\x2f\xf5\x8e\xd9\x97\x9c\xb3\xb8\x13\x73\x2f\xd2\x34\x49\xad\xec\x8e\x62\x61\x99\x3c\x0f\xa9\x12\xb5\x01\x76\x22\xa0\x13\xc5\x98\x19\x51\x41\xd1\x8f\x25\x27\xb9\xac\xd4\x9d\xe4\x78\xcf\x99\xe3\xaf\xb9\x84\xec\x85\xc5\xa3\x9a\xfb\xc2\x4b\xd8\xf7\x77\x5b\x17\x5c\xc3\x81\x3c\xe6\x80\xce\xcc\x70\x86\x58\x21\x09\x6a\xfb\x8a\x9b\x49\x47\xfb\x7d\xe4\x8a\x6e\xd0\xa9\xc1\x36\xb2\xa3\xe7\x78\x33\xc7\xa3\xd1\xd1\xbb\x7a\xe1\x0a\x8f\xe4\x31\xa5\x41\xc8\x04\x85\x5b\x87\xcd\x82\xd6\xb2\x48\xef\x05\x61\x2e\x0f\x05\xcd\x3c\xea\x17\x04\xd8\xd6\xfc\x4d\x41\x69\x2e\x53\xff\x04\x66\xb3\xca\x74\x90\x7d\x27\x09\xf0\x8d\x95\x90\x03\xa3\x20\x86\x78\xe2\x1f\xf0\xa5\x71\x9b\x2e\xf2\xc4\x8a\xeb\x4b\xbd\xdc\x0c\x03\xb6\x0b\x27\x67\x40\x17\x79\x37\xbc\x29\x4d\x7a\xdd\xec\xf0\xd3\x99\x2c\x8c\x3d\x53\x16\xaa\x53\x41\xe4\xd5\x95\x83\xf2\x9a\x39\x38\x1c\xa6\x4f\x67\x56\xf3\xd8\x33\x17\xeb\x56\xaf\xf3\xc4\x69\x12\x85\x7e\x95\x1b\xa4\x94\x0d\xed\x9f\x1e\x54\x38\x70\x5c\xcd\x38\x0f\x0e\x6e\xd8\xd2\xe3\xe1\x90\xb1\x16\x14\x4f\xd0\xd9\x3a\x46\x15\xc2\x80\x29\x5b\x86\x5c\x73\xca\xdd\x9f\xea\x65\x79\xd1\x87\x5f\x5e\xff\xe7\x37\xfc\xc8\x36\xbe\x22\x40\x5e\x16\x2f\x22\x8b\x4e\xe5\x37\xb1\x57\xa6\x5a\x11\xf6\xca\xfc\xf9\xcb\xc8\x63\x2b\x38\x67\xe7\xa5\x3a\xd1\xea\x45\xf3\x42\x67\xf7\xfd\xf5\x23\xd8\x93\x07\xae\x6e\x80\xa9\xcc\x7a\x67\xa8\x7b\xee\x95\x8f\x20\x6f\xf5\xc8\x0f\xa9\xb7\x35\xc5\xa6\xff\x72\x8f\x3d\xcf\x2b\x5d\xac\x23\x98\x45\x6e\x78\x10\x0d\xf9\xa0\xb5\xd7\xe8\xad\xc7\xaa\xdb\x48\x10\xe5\x49\x10\x52\x87\x34\x61\xd4\x88\x76\xd3\x14\xf4\xe9\x07\xea\xa6\x42\x6c\xe8\xb8\x23\xc8\xbe\x5a\xed\xc8\xf8\x6d\x4f\x7b\x32\xde\xe7\x0d\xde\xae\x70\xfa\x39\x0e\x0d\xed\xbb\x30\x7b\x9b\x3d\x66\x74\x36\xb7\x9c\xc0\x66\xbb\xb1\x1e\xd9\x97\x59\xa5\x69\x25\x52\xca\x4c\x4c\xc1\x93\xa7\x92\x4e\x4f\x65\x78\xa9\x78\xf8\x62\x17\x73\xad\xc5\x2f\xf1\xca\x5e\xd2\xc2\xc3\xe7\x5c\x37\x47\x36\xe3\x4b\x82\xe1\xd4\xc1\x42\xaa\x1a\x7b\xfc\x2d\x22\xa0\xc2\xe3\xc4\x81\x4e\xa1\x4f\x8d\x5f\xcc\x6d\xce\x07\x3c\x72\x19\xf6\xc2\xcc\x89\x37\x7a\xec\xe5\x9e\x7b\xed\x62\x4f\x09\x3d\x65\x27\xd4\x80\xea\x31\xa8\xeb\x1b\xe3\xf6\x0c\xf9\x27\x8f\x5c\xd6\x4c\xa2\x08\x9a\x36\x9d\xf4\xe2\xdc\xff\xb6\x71\x04\x7f\xc9\x73\x6f\x19\x44\x54\xf8\x91\xb4\xa4\xaa\xde\xa6\xe6\x99\x22\xff\xdd\x99\x11\x0b\xc3\x87\xb6\x97\x41\xb7\x8b\x20\x04\x8d\x39\x82\x84\xd6\x7c\x25\x09\x03\x2e\x7b\xd5\x11\xcd\x36\x8f\xc3\xac\x83\xf1\x6e\x60\x15\x16\x38\xbd\xf0\x23\x16\x27\x72\xdd\x86\x58\xac\x4a\x71\x35\xc8\x85\xeb\x7e\xb4\xef\xbb\x99\xb7\x7f\xe5\xb1\x93\x9b\x77\xcb\x66\xaa\x7b\x99\x18\x24\x5c\xb3\x15\xa3\xeb\xc8\x35\xe4\xaa\x75\x19\xb4\xad\xc1\xba\xb8\x1e\xd8\xf7\xdb\x52\x4c\xad\xa0\xd7\x9b\xaf\xff\x02\xaf\x74\x6f\x5b\xab\xc8\xe8\x6f\xf6\xfd\x42\x45\xc7\x35\x80\xe4\x8a\xae\x08\x75\x3f\x57\xcb\x8a\x58\x78\x9a\x6e\xe9\xd1\xf4\x02\xb4\xd0\xad\xe7\x7d\x1e\xf9\xa1\xd2\x02\xf2\x5f\x67\x86\xe6\x3e\xaf\x74\xef\x21\x1a\x1a\x57\x92\xb8\x2d\xfe\xc8\x6e\x67\x6b\x6c\x26\x49\x1a\x00\x76\x81\x62\x73\x16\x3c\x43\xaa\x81\x97\xee\x66\xfb\xcd\x2f\x95\x95\x5d\xc6\x7f\xe6\x14\x9e\x70\xfd\xc1\x5f\xda\x45\x7e\xc6\x23\x7b\x79\x13\xac\x5b\x80\x78\x70\x37\x79\xe2\x16\x0c\x58\x27\xc2\x66\x9a\x00\xea\xc1\x61\xab\x30\x6c\x8a\xcb\xc9\xa6\x97\x52\x04\x21\x81\xab\x52\x3e\x34\x95\x6d\x8d\x08\x72\x59\x1b\x12\xe0\x66\x21\x2b\x31\xef\xfb\xf3\xec\x98\x7b\xc5\xf5\x34\x87\xfa\xaa\x12\xae\xf8\x2c\x76\xd7\xa9\xc8\xd9\x43\x7f\xd7\x23\x3f\x0c\x57\x67\x7a\x6e\x3a\xe3\xfb\xcc\x74\x78\xad\x57\xf5\x80\xca\x46\xd3\x87\x3a\x6d\x3c\x0a\xe4\x29\x51\xa0\xac\xe4\xaa\x63\xfa\xf4\xbf\xca\x43\xd0\x89\x90\x92\x43\x75\x15\x82\x7a\x75\x26\x4f\x47\x70\x60\xca\xd2\x96\x37\xcd\xfe\x02\x50\x11\x66\x6b\x3e\x2d\x62\xb1\x2a\xc7\xd4\x9d\x22\x29\x79\x24\xd4\x57\xc0\x4c\x64\xfe\xb3\x74\x27\x66\xcb\xb7\x06\xe7\x74\x6e\xdd\x84\x51\xc3\xd6\x6b\x8f\x2f\x8e\x67\xc9\xa3\xfb\x26\x8f\xec\x49\x75\x73\xfc\x9f\xf5\xb6\x39\x61\x4e\x9b\xb2\xd6\x9a\x2e\xf6\x97\xc5\x36\xb6\xb9\x02\x28\xd1\x6a\x06\x48\x76\xf8\xd8\xe4\x43\xbb\x6d\xb6\x9e\x8d\x1a\x5e\xfd\x7f\xda\xc5\x3e\xe7\x4d\x95\x5c\x30\x0a\x84\xa7\x9c\xf9\xc7\xc1\xb5\x05\x91\x52\x4a\xc9\xc6\x7d\x31\x15\x99\x3c\x4d\x27\x2d\x3c\x7e\x1c\x2f\x82\xc0\xcb\x3e\x2d\x38\x23\x4e\x9d\x9c\x11\x81\x95\xeb\x57\xaa\xdb\x1c\xfe\x8c\x15\x34\x33\x56\xd1\x21\x8f\xc6\x89\x65\xe5\xb7\xd6\xfa\x0f\x46\xc8\x7f\xf6\xc8\x23\xcb\xad\xf0\x3f\xe8\xb1\xdb\x06\x9a\xe6\x00\x0f\x95\x2a\xb2\x63\x1d\x75\x9f\xad\xe8\xc7\xa2\x57\xf6\x3e\x79\x8a\x9c\x18\x0e\x78\xbf\xd1\x0f\x74\xba\xa8\x87\xbc\xa7\xa6\x4e\xf4\x38\xc2\xfe\x1b\x6a\xec\xff\x78\xf6\x90\x63\x92\x1c\x87\x10\xed\x7b\xce\x8a\x7e\x1d\x4e\xe6\xcf\xa6\x5d\x1e\xa6\x30\x88\x59\x18\x2f\x47\xc2\xb9\xa7\x54\x2f\xbb\x18\x59\x42\x98\x51\x61\xce\x95\x2a\x61\xc8\x62\xe9\x2d\x8f\x5e\x5d\xf9\x52\xcf\x8a\x7e\x81\x8e\x07\x0e\x4b\x74\xb2\x6b\xf7\x24\x5c\x9e\x8d\x59\xdd\x98\x12\x8d\xf1\x20\xe5\x96\xa4\x83\xd3\x1f\x3a\x2f\xd9\x9a\x03\xbe\x06\x96\xdc\x83\x1e\x23\x3f\xe2\xe8\x10\x1d\xde\x1d\x20\xf9\xfc\xd8\x28\xb9\x7e\x78\xfe\xee\x7c\xaf\xab\x8c\xab\x3c\xc2\xf3\xe7\xbc\xd2\x40\x94\x19\xdc\xff\xfe\x08\x0b\xd6\x7d\xca\x41\x86\xd0\x3a\x0c\x82\xfb\x60\x38\x0e\x3e\xa5\x95\x63\x4b\x1b\xd4\x0f\xbb\x13\xfb\xf9\x23\x24\x27\xa3\xf2\xa4\xec\x47\xec\x0e\xf9\x6f\x01\x44\xa4\x0b\x37\x39\x17\x41\xd8\x54\x5e\x3f\x8e\x96\x3f\xdd\x54\x3c\xe0\x67\xc6\xd6\xa3\xa6\xc2\xbc\x68\xf6\xd2\x30\xef\x4b\xa5\x53\x9c\xcb\x9d\x7d\xe4\xfe\x1a\xd9\x9d\xf2\x78\x59\x64\xfe\x73\x6a\xec\xd7\x3d\xfc\xdb\x44\xbc\x6a\xab\x95\xba\x9c\xb4\xaa\xea\x43\x4e\x7d\x70\x97\xc3\xf9\x1a\xfc\x0e\xc5\x7e\xa1\x27\xe9\xe0\x9b\xb2\x8a\x18\xaf\xf7\x8b\xe7\xa0\xae\xc2\xbc\x0c\xb9\x11\x98\xc0\x0e\x66\x86\x38\x28\x5c\x59\xb0\x5d\x9d\xe8\x65\xf9\xe9\x5e\x3c\xe5\x7a\x04\x0f\x91\x83\x64\x72\xa8\x52\x5b\x9a\x15\xb3\x33\xa7\x65\xa5\xe4\x3d\xa3\xa4\x44\xf3\x9f\x64\x4d\x0e\xac\x63\x2b\x57\xc8\x47\xaf\x68\x9c\x10\x79\x1a\x36\x67\x0d\xe4\x80\x9c\x2f\xc7\xca\x17\x9d\xe9\x01\xfa\x7f\x31\x2b\x20\x96\xdf\x08\x22\xdc\x6f\x3b\xf0\xbe\x8a\xd5\x72\x26\xc6\xeb\x46\xc8\xff\xa8\x59\x49\xe0\xff\xa5\x76\x01\x9c\x73\xf7\xd7\xec\x8d\x41\xcd\xb2\x30\x5e\x9e\x10\x71\x33\x09\x70\x58\x3b\xe6\x0c\x81\x09\xd8\xc5\xaa\x2b\xcb\x52\x7d\xb4\x59\x0e\x57\x44\xac\xba\x82\xf9\x08\x99\xc8\xeb\x8a\x3e\x16\xf1\x2d\xe1\x28\x15\x43\x44\x37\x0e\x05\xed\xf2\x94\x77\x44\x5e\x80\xe8\xe2\xfb\x99\x36\xa2\x9b\xf8\x02\xad\x0c\x16\x0f\x34\x93\xae\xfc\x30\x58\x55\x2f\x86\xca\xee\xec\x65\xb9\x55\x0c\xb8\x65\xb5\x3b\xc2\x9c\x54\x39\x18\xc4\x54\x39\x0d\x72\x9d\xf2\xf5\x1e\x64\x8f\x8d\x2d\xa2\x2e\xdb\x91\x6a\x77\xcd\x5e\x3d\x6f\xb9\x84\xec\xab\x08\x35\x3c\x2a\xb7\xc1\x99\x30\x75\xe0\xcb\xff\x7e\x37\xeb\xd9\x2c\x7a\x7a\xb7\x0c\xc2\x14\xc6\x51\x85\xf5\x62\xb2\xef\xd1\xd2\x2d\xcd\x9a\xb7\x15\xa6\x54\x67\x3e\xfd\xcd\x2e\x72\x5f\x8d\xec\xee\x88\x20\xec\x75\xfc\x07\x3d\xf6\x1d\xef\x76\xa0\x37\x55\xb8\x64\x1a\x55\x1d\x1f\x30\x2e\x6d\xde\x3c\x8b\x27\x62\xd3\x24\xc5\x26\x5b\x50\x79\x32\xa6\x5d\x6f\x82\xc7\x99\x76\x7a\xe8\xd8\xfa\x7d\x99\x79\x16\x8b\xb6\x60\x6f\x4d\xb2\x3e\xa2\x30\xed\x57\x0f\x82\x9b\xf3\x84\xe8\x40\x65\xdb\x24\x7f\x84\x0a\x82\x30\xb5\x3f\xde\x37\x47\xc8\x9e\x2c\xbc\x5b\x1c\x0f\x3b\x61\xee\x3f\x30\xb2\x09\x58\xc9\x86\x56\x98\x1a\xb7\xf6\x38\x68\xef\xec\x35\x23\x0b\x89\x14\x6c\xbc\xa3\xcd\x10\x51\xd2\xe4\x91\x19\xd0\xd4\x16\x59\x30\x94\x7a\x96\x58\x20\x33\x82\xca\x06\xd1\x48\xb6\x08\x73\xd1\xb3\x04\xa3\x39\x9b\x86\x58\xa4\x03\x23\x62\x46\x71\x01\xf6\xfa\x73\x61\xa7\xd7\xa1\x3d\x80\xdd\x4b\x62\xf7\x99\xa2\x22\x63\xfe\x84\x15\x12\xc6\xf0\x12\xc6\x49\x6a\x6d\x19\xf6\x0b\x3d\x28\x96\xb5\x1e\x33\x8b\xb4\xb7\x10\xb3\x4d\x54\x2d\xd0\x5a\x54\xbd\xa3\xc8\xe2\xbb\xc4\x00\x15\x98\xce\xa5\xa9\x12\x87\x91\x3b\x57\x34\xc1\xae\xe9\x78\x2f\x46\x09\x3a\xc8\x6f\x56\xfd\xe1\x7b\x99\x48\x27\x96\x7b\x61\x30\xf8\xc9\xc9\x6b\x2e\xa9\x4c\x75\x9f\x4b\x82\x02\x59\xf1\xbb\xbb\xd9\x8c\x7d\xe1\xa2\x80\x28\xbe\x74\x37\xf9\x88\x67\x20\x07\xdf\xed\xb1\x37\x7a\xf3\xdb\x07\x1d\xdc\x7a\x72\x43\x37\xc1\xff\x4c\x44\x61\x4b\x34\xfb\xcd\x48\x5c\x2e\x7f\x15\x76\x27\x7b\xb5\xbc\xd2\x53\x80\x86\x2f\xf6\xd8\xb3\x17\xd6\x47\x34\x7c\x68\x5a\x15\x93\x47\xc8\xf3\xd3\x5c\x9a\x2c\xe1\xd1\xff\x99\x5b\xc7\x3a\x64\xc7\x0d\xb0\xe1\x2a\x90\xfe\x2e\xa9\x03\x59\xd1\x2b\xf2\x8a\x6a\x88\xc5\x7b\xb6\x5e\xeb\x93\x8f\x6f\x17\x4e\xf1\xa7\x0a\x60\xce\x13\xec\xc9\x37\x5f\x40\x2c\xce\x67\x19\x2c\xce\x05\x76\xd3\x99\x0b\x8f\xbf\x79\x6f\xf5\xca\xd4\xbc\x99\x73\x49\x9a\xfb\x7f\xb2\x9b\x5d\x65\x5f\x50\x07\xec\x5e\x37\x32\xec\x99\x26\x5e\x5e\x6b\x90\x72\x8b\x04\x64\xac\x24\xcd\x9d\x15\xf8\xb3\xbb\xc9\xaf\x8f\x90\xbd\xbc\xdb\x9d\x4b\x93\x3c\x69\x26\x91\xff\x9e\x11\xf6\x0b\x23\x00\x2f\xd5\x2d\x92\x1e\xba\xea\x6e\x21\xac\xa1\x48\x1b\x2c\x5c\x05\x80\x16\x0a\xd2\x53\x06\x14\xa4\x7e\x9c\xf3\x73\x0d\x7a\x26\x9e\xe8\xa6\xa2\x15\x9e\x13\x01\x86\xa6\x82\x76\x2d\xf5\x00\xe3\xb0\x98\x9d\x3a\x39\x55\x94\xa4\x51\x9d\xf0\xe1\xfd\x1c\xc2\x98\xe9\xe9\x63\xd3\x13\x57\x1f\x3a\x74\x15\x48\x61\x25\x09\x57\x57\x57\x1b\x21\x8f\x79\x23\x49\x97\x27\x79\x96\x85\xcb\x10\x45\x9a\x4d\xaa\x22\x26\xa0\x88\xf1\x06\x3d\x99\xc4\x13\xa6\x7c\xdd\x3b\x83\x4a\x27\x37\xea\x52\x13\xb3\x5e\xb3\x2d\xb5\xb5\x4e\xbf\x99\x74\xba\x3c\xee\x37\x9a\x49\x67\xb2\xd3\x9f\x68\x02\xfe\xec\x84\x2e\xc3\x46\x73\x59\x02\x5e\x15\x18\x1d\x9d\xc3\xb8\xdc\xe3\x69\x60\x99\x1a\x15\x32\x5b\x31\xfe\x0e\x84\xbf\x52\xf0\xe5\xc4\x85\x57\xd4\x96\xe1\xcc\x99\x77\xeb\xd0\xbc\x5f\xf4\xd8\xab\x4a\xa1\x79\xe6\x3b\x61\xa3\x20\xf6\x1f\x1d\xa8\xb2\xf2\x7d\xf2\xc1\x7d\xfa\x34\xab\x4c\x33\x4e\x66\xa0\x6a\xde\x1c\x94\x51\xa0\xf2\xcf\x9c\x9c\xbf\xe3\xf8\xd4\x91\xa3\xc7\x1b\x54\xe3\xb1\x1b\x27\xb7\x5c\x93\x5d\x35\x2d\xf5\x96\x65\x37\xf7\x06\x02\xb3\xd0\xbf\x4a\x1b\xb4\x60\x2f\x84\x37\x2c\x0b\x96\x05\x0f\xe9\xda\xa9\x96\xc8\x98\x1e\x69\xff\x36\x36\x2b\xdf\x9d\x9d\x1b\x3a\x3d\x75\x93\xcf\xcc\xcc\xd5\xe9\xc2\xf4\x1c\x04\x93\xcd\x4f\x2f\xcc\x15\x11\x12\x61\x26\x6f\x38\x4d\x7c\x45\x8d\x3c\xae\x62\x15\xa2\xf2\xea\x00\xc2\xfc\x85\xc7\x9e\x35\x78\xd9\x1c\x76\x9a\x49\x2c\x4f\xab\x21\xba\x28\x78\xae\xb6\x73\x38\xa6\xea\x4c\x5b\xc3\xad\xa2\xdd\xcb\xbc\xd9\x14\x70\x34\x90\x22\xce\xd5\x55\xfb\x64\x95\x8c\x69\xbd\xc9\x3f\xbb\x59\x28\x98\xc3\xe6\x94\x58\x44\xae\xb4\xe5\xfc\x87\x74\xd1\x81\xc6\xea\x4c\x91\x8e\xc8\x1b\xe4\x0d\x97\x92\x89\x75\x38\xfb\x8e\x45\xc9\x2a\x22\xc1\x82\xfd\xfa\xdb\x7b\xd9\x4d\xee\x25\x4b\x32\xe9\x88\x8c\xe2\x81\x7d\x59\xc9\xbc\x1d\x41\x44\x98\x3c\x3a\x37\xce\x7b\x8f\xe9\x0e\x25\xbc\x73\x46\xe8\xef\x09\x79\x5b\x8d\x3c\x3a\x08\x33\x29\xd9\x7b\x61\xd6\x16\xe9\x09\x91\xb7\x93\xc0\x7f\x69\x8d\xcc\x6c\x8a\x83\x50\xb6\x6d\x66\xb0\x20\xf6\xdb\xde\x62\x45\xf9\x8b\x15\x69\x2a\x90\xe7\x0b\xe1\x39\x51\xb2\x4a\x9d\x97\x60\xa6\x16\x28\xa7\x30\xde\x6a\x61\x86\x99\x82\xc0\x6c\xd0\xc5\x38\x8c\x16\x9d\xf4\x22\xa5\x17\xba\x65\xc1\x31\x24\x43\x29\x81\x2a\x69\x2f\xc3\x53\x1e\x8f\x56\x79\x3f\xd3\x1a\xae\x7d\xaa\x68\x90\x97\x8d\x10\x5f\x87\x91\xce\xa5\xa2\x29\x02\x00\x47\xfc\x9e\xc9\x73\xfa\x5a\x6d\x71\xf0\xfe\xa2\x1d\x38\xa3\xd3\xbb\x3b\x89\x8a\x4b\x2c\xbe\xa7\xd3\x29\xae\x0e\x8c\xa9\xe6\x61\x90\xeb\xb6\xd9\x4e\x32\x11\x5b\xaf\x80\xd0\x54\x45\xc9\x62\x8d\xc5\x23\xee\x75\x44\x1a\x36\xc1\x50\x10\x25\xe0\x2f\xdc\x8f\xea\xf2\xaa\xa0\x39\x3f\xab\x51\x08\xa2\x64\x59\x3d\xa5\x92\x95\xc7\xe9\x89\x81\x0e\x34\x28\x3d\xca\x9b\xed\x8a\x3b\xa5\x0c\xa9\x54\x23\x58\xd0\xa7\x1f\xac\x1f\x3c\x70\xe0\xc0\x81\x67\xca\x7d\x23\xd7\x09\xe9\x2a\x79\xb1\x78\x5d\xc5\x89\x9a\x33\x02\x1c\xf5\xf5\x61\x1b\x72\x26\x12\x2a\xcb\x91\xdb\x48\x21\xc9\x2d\xe1\xf6\xa9\x1a\x59\x63\xa2\xfb\x6f\xa9\x91\xb9\x0b\xc4\xa2\x59\xf0\x96\x7c\xde\x5b\x1c\x5e\xe5\x62\x01\x40\xa9\x39\x4c\xf8\x1a\xdc\x93\x66\x13\xc1\x80\x7c\x93\x48\x54\xbc\x6d\x47\xe4\x67\x49\xb4\x22\x07\xc9\x9d\x37\x03\x99\x6f\x68\x65\x4f\xcf\xa2\xb1\x24\x8c\x11\xe7\x23\x8c\x01\xeb\x01\xb5\x3f\x2b\x94\x9b\xfc\x6d\x4d\xa7\x46\xfc\x55\x8d\x7d\xc7\x5b\x84\xbf\x17\x9d\xe4\x08\x39\x71\xd2\x22\x6a\x33\x8a\xec\xa5\x07\x4b\x55\xaf\x3f\xd8\x35\xad\xb6\x15\x61\x5b\x56\xf8\x11\x58\xb2\xd4\xee\x67\x92\x90\xe5\x36\xd8\x11\x26\xf1\x1a\x12\x34\xec\x70\x68\xb3\x12\x30\x2e\x2c\xb4\xec\x1f\x59\x14\xaa\xcc\xad\xb4\xb0\xd5\xc4\x49\xd1\x64\x27\x95\xb6\x68\x9d\x63\xed\xbb\x99\x1c\xdb\xa4\xb8\xc3\x98\x39\x48\x25\xb9\x3d\xcc\xdb\xf3\x18\x60\x98\x3d\xe8\x5d\x4e\xfe\x95\x63\x63\x8e\xc2\x2c\x1f\x30\x32\xbf\xb2\x9a\x3f\xbd\x48\x95\xc3\x33\xde\x77\x46\xd8\x4d\xa5\x6b\xb2\xef\x36\xdd\x0d\x6a\xe1\xe5\xb8\x1f\x9d\xa2\x6f\x5e\x2e\xa1\xa9\x8d\x90\xbf\x73\x23\x04\xfe\xdc\x63\xc7\x37\x1f\x21\x60\x72\x97\xd6\x8c\x0f\xd8\x18\x84\xb7\x69\xea\xc5\x8d\x0e\x78\xad\x47\x76\x75\xdb\x3c\x13\xfe\xcb\x3c\xf6\x5c\x6f\x4e\xfe\x59\xe6\xc4\x35\x27\x47\x0a\x4f\x6a\x15\xab\xc0\x79\xdc\xe0\xe9\x34\xe7\xd9\xd9\x6c\x92\x07\x9d\x30\x0e\xe5\x0a\x9f\x50\x2b\x7d\xd2\x94\x94\x4d\xda\x9a\xd4\x97\xf7\x12\x5a\x99\xc5\x8e\xc6\xa2\x5b\x7b\x49\xce\xfd\x0f\xec\x65\xc7\x9c\x2b\x52\x56\x66\x94\x2f\x2f\xa7\x02\x94\xe0\xbb\xe0\x62\x2a\x64\xa1\x0a\xc3\x4f\xc4\x60\x4b\x0f\xe0\x20\x60\x2a\x77\xa6\xc4\xf3\xc8\x0e\x98\xf5\x0e\xf9\xf9\x0e\x3c\xfc\x05\x85\x87\xff\xb4\xa7\x00\xc7\x3e\xee\x91\x2b\x36\x80\x56\x61\xad\x6a\x00\x1a\xbb\xd7\x53\x07\x81\x62\xe5\x69\xfe\x72\x58\xe5\x8d\x87\x84\x99\xfc\x2f\x0a\xa3\xe3\x57\x3d\x72\xe5\x26\xfb\x81\x50\x09\xbf\xe8\x19\xd4\x86\xa2\x2f\xbc\x99\xf7\x78\x54\x48\x27\x94\x5c\x90\x32\x95\x17\x1b\x0a\x58\xa5\x1f\x92\x9e\x3e\xe8\x9d\x59\x1f\x8d\xfe\x0a\xff\x40\x15\x1a\xbd\xd3\xe9\x32\x16\xfd\x3b\x88\x83\x09\xad\x6c\xfa\x05\x73\xcf\xfc\xec\x3c\x5e\x9a\xe6\x5d\xde\x94\xca\x62\x98\xe5\xfe\xff\xde\xc3\x8e\x56\xdf\xaa\xa4\x31\x1b\x78\xd2\xc4\x40\x54\x32\x8a\xbd\x65\x6c\x47\xe0\x6f\x57\xe0\x7f\xc9\xd3\x74\x55\x9f\xf3\xd8\x81\xd9\x4a\x36\xed\xe1\x9f\xc5\xd6\x91\x6e\x24\x37\x0c\xf7\x1f\x6d\x60\xc2\x48\x0d\xe8\x31\x83\x7a\x67\x87\x77\xa5\xa2\x94\x49\xdd\x73\x02\x76\x7e\xf2\xa0\x47\x87\x6a\xa8\xbb\xfd\xd1\x0e\xef\xee\xf0\x9c\x6c\x67\x23\xfb\xac\xbd\x91\xfd\xfa\x36\xe9\xbb\xff\x7d\x35\x7d\xf7\x43\xc7\xde\x9d\xac\x2f\x10\x8f\xfb\xb7\x18\x81\xa8\x27\x6a\x99\x07\xad\x52\x8a\x55\xf2\xa0\xfd\xe1\x1e\x72\xcd\xc6\xa2\xe7\x10\x5d\xfe\x18\xa0\x5e\x1e\x8d\xf3\xb4\xef\xbf\x66\x0f\xcb\x06\x2f\xe3\xd4\x5d\x4d\xd2\xb3\xf2\x1c\x37\x11\x06\x75\xca\x29\xdc\x9f\x17\xb9\xf1\x49\x62\x40\x49\x29\x50\xdd\x9a\xcc\xca\x92\x84\x20\x9b\xc2\xc1\xc8\x71\xd3\x28\xc6\xc8\xdb\x3c\x32\x9a\x87\x1d\xe1\xbf\x61\x1b\xcc\x59\x4b\x3a\x1a\x50\x96\x94\xe5\xbc\x03\x41\x5c\x3a\x26\x30\x33\x70\x9f\xab\xf2\xd8\x9b\xa9\x1c\x05\x25\x67\x0b\x33\x96\xa1\x1e\x3d\xd5\xb5\xf2\x20\xf6\x4d\x75\xbb\x51\x7f\x1f\x79\xb5\x2b\xff\x5f\x58\x63\xdf\xf7\xd6\x96\xff\x96\xd8\x77\x47\xc6\xf8\x35\x4a\x63\x03\xa6\x2b\x3c\xad\x82\x93\x1f\x86\x79\x52\x95\xc6\x30\xde\x02\xe3\x7d\x80\x51\xa1\x3b\x01\x00\x21\xd4\x6a\x05\x14\x0b\xbd\x0b\x33\x1a\x8b\xa6\xc8\x32\x8e\x49\x91\x79\x8a\x61\x05\x4e\xeb\xb8\xd5\x0e\x9d\x36\x1c\xe6\x96\x25\x85\xf7\xf2\x44\x9e\x9d\xd1\xf2\x65\x12\x79\x1c\x93\xf6\x9b\x3c\x42\x70\x7c\x81\x7e\xf7\x15\x1e\xbb\xd7\x3b\x66\x7e\x6b\x11\x1f\x84\x59\x33\x0d\x81\x4a\xcd\x0a\x63\x41\xfe\x01\x29\xb5\xd4\x17\x52\xbd\x97\x13\xcd\xe4\x4d\x2d\x80\xb5\x22\x34\x4a\x4e\xd4\x47\x9b\x08\xba\x03\xb2\x2c\x34\x59\xc1\x87\x29\xc3\x9a\x6f\x3b\xe8\xe4\x0c\xbd\xc1\x23\x63\x2d\x75\xc3\x7f\xf9\xd6\xc4\x8c\x29\xf8\x56\xfd\x97\xc5\x08\x86\xe9\xa6\xb7\xcc\x9f\x3a\x69\x86\x57\xf7\xa4\x00\xcf\x30\x8e\x90\xa2\x91\xe0\xd0\x6d\x90\xdb\xc9\x25\x18\x5a\x92\xfa\xc7\xd9\x8d\xb8\x2a\x53\x65\xb8\x19\x24\x5c\xd1\xab\x13\xc3\x51\xd4\x86\x62\x26\xb9\xf3\x6d\x7e\xc5\x23\x7b\x0c\x9c\x86\xff\x56\x8f\xbd\xda\x73\x26\xb7\xed\x53\x2e\x60\x37\xd0\x8c\x15\x09\x1e\xa0\xaa\x11\x66\xb4\x42\x52\x2c\x09\x59\xb5\x8a\x6f\xc7\xb9\x0b\x9f\x05\x8d\x68\x2a\x32\xd1\x38\x4d\x0a\x64\x59\xb5\xa0\xe0\x1b\xef\x3b\x03\xbb\xd1\x3e\xa7\xd1\xef\xbb\x94\x3c\xbe\x22\x27\xe2\x74\x12\x45\x61\xbc\x8c\x6f\x14\x79\xf6\xfe\x73\x2e\x65\xd7\x80\xe6\x0f\x86\x71\x30\x3c\x39\xca\xbf\xcd\x66\x91\x62\x19\x6a\x13\x74\x85\xd1\x47\xf7\x92\x6f\xee\x22\x63\x1d\x7e\x6e\xbe\x97\x2e\x0b\xff\xbf\xed\xda\x2e\xdd\xc1\xab\x77\xd9\x01\x23\x55\x28\x76\xca\x2f\x53\x80\xe7\xf2\xa5\x64\x45\x38\xcd\x77\x5f\x6b\xd0\xdb\x40\x9f\xd0\x0e\x1d\xa0\x90\x48\xa2\x5e\x6e\x82\xb4\xf7\x8b\x73\x87\xe9\x55\x08\x5b\xa0\xc9\x64\x20\x52\xa5\x65\x8a\x84\xfa\xe1\xb9\x83\x07\x1e\x37\xae\x4c\x91\xb2\x44\xb5\xea\x0f\x48\x21\x78\xc2\xe1\xbd\x90\x93\xe5\x40\x83\x4e\x95\x2a\x83\xf7\xa2\x66\x2f\x2a\x10\x97\xad\x2a\x97\xfa\x34\x4d\x7a\xe8\xee\xeb\x75\xdd\x9c\xdb\x2b\xae\x7a\x5c\x83\x1e\xc5\x6c\xc8\xc3\x5a\x54\xa3\x73\x53\x99\xb3\x0f\x1d\x78\x5c\x5d\xa7\xf1\x50\x95\x65\x01\x69\x13\x7a\xcc\xb8\x1c\xb0\x5e\x97\x86\x9d\x8e\x08\x42\x0e\x50\x2b\x26\x0e\xdc\xfd\xd2\x18\xd3\x98\xd5\xd1\xd5\x6a\x36\xa8\x1c\xa2\x88\x8a\x11\x4e\x14\x0a\xaa\xac\x11\x06\x29\x48\x30\x4f\xeb\x5c\x53\x88\x80\x1e\x3c\x74\xe0\x71\xe5\x71\x6c\xd0\x53\x40\x22\x11\xa9\x61\x85\x2c\xb1\x25\x21\x62\x7a\x36\x8c\x22\x11\xd4\xd7\x6d\x7e\xab\x97\xe6\x6d\x91\xd6\xa9\x88\x33\x04\x36\xc6\xf6\x95\xda\xa6\xe9\xac\x80\xcd\x1b\x44\x64\x1f\x23\x19\x02\xfd\x92\xd6\xed\x40\x70\x28\xfa\x92\xca\x26\x93\xcf\xef\x1a\x60\x53\xf9\xf8\xb6\x67\xfb\xf7\x46\x37\x38\xdb\x6d\x86\x94\x81\xc6\x5f\x94\x09\xbe\xf5\x69\x1b\x40\xd4\xcf\xb0\x05\x02\x82\x42\x2d\x8d\x2d\x4e\x6e\x39\x71\x86\xce\x8e\x40\xe5\xf1\x5f\x33\xf8\x11\x37\x31\xeb\xd5\x14\x35\x93\x1a\x23\x22\x78\xd0\xaf\x6f\xa0\x76\x33\x3b\x31\x06\x03\x63\x05\x54\x9c\x2e\xc5\xa8\xe2\xd2\x0c\x1f\x98\xc8\x15\x0b\x0d\xdb\x51\xf0\xb5\x20\xa3\x0a\x68\x6f\x43\xe7\x33\x3a\x3f\x2a\x86\xa2\x41\x7e\x7f\xaf\x93\xf8\xb4\x04\xf8\x29\xe6\xfc\x97\x26\xf1\x2d\xc9\x12\x38\x8e\xdf\xb6\x97\x3d\xd5\xfa\x5d\xe1\x35\xbe\x33\x59\xb2\x40\xc5\xc1\x45\x12\x25\xc9\x59\xd4\xbb\x00\x3b\x5f\x65\x1f\xa2\x0f\xb4\xa9\xf0\xc2\xd3\x5e\xdc\x38\xef\x8d\x69\x41\x7e\xde\xdb\x7b\x67\xb2\xa4\x29\x0a\x5c\xaa\x4f\x42\x3e\xe2\x91\x7f\xd5\xe2\x61\x24\x82\x5b\x92\xa5\xec\xe6\x50\x1e\x04\xfa\x18\x19\x69\xe7\xde\xb9\xd0\xa7\xf8\x02\x95\xeb\x33\x6b\x8b\x40\x36\x14\xe6\x5a\x2a\x72\x1e\xc6\x76\x68\x08\x9c\x08\x31\xc8\xd7\xf2\xe5\x9a\xa8\x43\x71\x4e\x7e\xa9\x30\xa7\x77\x8b\x34\x41\x71\x67\x7b\x16\xdd\x99\x7c\xd0\xf5\x22\xfe\x8c\x47\xec\x8e\xf9\x77\x93\xab\x87\x9e\xc3\xdd\xaf\x70\x4b\xf1\x16\x58\xeb\x9e\x3c\xef\x00\x5b\xca\x61\x77\x89\x0e\x54\xde\x1c\x0c\xb7\xfa\x20\x52\xf0\x51\xf5\xf9\x1a\xe4\x99\xc4\x0c\xb7\x7f\x2b\x9b\xb1\xc1\xc8\xa5\xa2\x25\x9f\x53\x4a\x58\x9d\x66\x16\x0c\x9b\x88\x1b\xab\xe1\xd9\xb0\x2b\x57\x0f\xc4\xf2\xc8\x5f\x93\xf2\x71\x47\x0b\xf9\x8c\x47\x7e\x14\xd6\x4f\x18\x2f\xcf\x08\x1e\x44\x61\x2c\x74\xde\xd7\xbb\x4c\xf6\xf4\xab\x3c\x13\xa5\x12\xa8\x87\x64\xe5\x0a\xd9\x12\x49\x6a\x55\x21\xa6\x9f\x0a\xd5\x2c\xcc\x32\x91\x59\x5b\x3f\xf2\x14\x02\xda\x50\x5f\x05\x79\x35\x28\x3d\x11\x42\xc0\x06\x7c\x6d\x33\x2f\x33\x8b\x0f\xa2\x17\xe7\xe8\xbe\x54\x13\x24\x89\xcb\x74\x6e\x9f\xf4\xc8\x63\xb2\x1e\x84\x7e\xb4\x7a\xd1\xc0\x94\x7b\x93\x99\x72\x2f\x2e\x4d\xb9\xe2\xa5\x87\x7a\xda\x1d\x1a\xc8\x20\xbb\x24\xeb\x65\x5d\x11\x07\xfe\xcf\x79\xec\x3e\x0f\x63\xc3\x22\xbe\x4c\x73\x01\x90\x26\x18\x08\x67\xf2\xb5\x13\xaa\x1e\xa7\x59\x6f\x09\x13\xa3\x73\x6b\xf8\xc0\x7b\x6e\x30\x54\x38\xa4\x44\xe4\x09\xe5\x11\x42\x3e\xc3\x17\x13\x16\xb9\x40\xd6\xa0\x4e\xf3\x5a\x3c\xca\x54\x62\xdd\x52\x92\x44\x82\xc7\xe4\xf7\x6a\xe4\x51\xcd\x24\xc6\x23\x4a\xb3\xaf\x60\x43\x3e\x5c\x63\xef\xa8\x15\x33\x5d\x85\x6f\xe4\x72\x6e\x53\xf3\xb4\xdd\x32\x3c\x95\xc9\xf9\x8d\xd0\x6d\x0e\xda\xd1\x04\x65\x80\x1a\xc2\x8a\xb0\xed\xc3\x98\x35\x92\xe9\x65\x91\x69\xac\xaf\xa2\xf4\xa8\x7f\xbd\x7c\xf3\x58\x92\x2e\x85\x01\x3b\x2c\xa7\xd8\x52\x18\x64\x76\xfd\x69\x4f\x8e\x49\x76\x36\xec\x76\xe5\x44\x8d\xc5\x39\xb8\x26\x67\x6a\x37\x15\x2b\x61\xd2\x03\xd5\x83\xb6\x79\x16\xef\xcb\x8b\xc9\xd0\x17\x39\x94\x7d\x1a\x69\xda\xd8\x61\xb9\x83\x34\x45\x64\x1f\xd5\xb4\xca\x22\x67\xbe\xfc\xea\x8a\xd2\x2d\x43\x19\x9a\xb7\x29\x87\xfd\x23\x89\x85\xbd\xfa\x5e\x37\x4a\xfe\x9f\xaa\x68\xc5\x73\xa2\x39\x85\xec\xa3\xdf\x1f\x61\x07\x8b\x9f\x4e\x64\x22\x83\xb6\xc7\x45\x78\x34\x93\x82\xda\x04\x44\x6a\x49\xfc\x91\x11\xf2\xc1\x11\x72\x49\x33\xe9\x74\x78\x1c\xf8\xef\x18\x61\xf7\x8f\x4c\xe3\x8f\x22\xcd\x1d\x7f\xc2\xba\xce\x13\xf5\xa1\xe4\x12\x07\x10\x27\x3d\xed\xa0\x92\xba\x39\x9c\x81\xe2\xe0\x64\x1a\xd8\x65\xc9\xb2\xd3\x24\xc9\xe9\xfe\x7d\x93\xfb\xc6\x8b\xe0\x38\x55\xcc\xbe\xcc\x22\x2b\x55\xd1\x2c\x45\xa3\xb2\xb0\xd3\x05\x0a\x37\xd1\xdc\x17\xe8\x7c\x0f\x39\x89\xb1\xcb\xd0\x2a\x4e\xb3\xb6\x88\xa2\x3a\xcd\xe0\xd8\x6f\xd2\x3f\xe0\x2a\xc0\x7d\xa6\x3d\xe5\xeb\xdc\xbf\xef\xa7\xf7\x01\x7b\xc0\x38\x5d\x4d\xe4\xa7\x95\xcd\x6f\xd0\x05\xcc\x27\x30\x05\xf5\x93\x9e\x49\x50\xd5\xeb\x38\xea\x23\x5a\x30\x78\xd4\x13\xc5\xeb\x20\x1f\x97\x9a\x4f\x68\x7b\xd6\x0f\xc0\x68\x2a\x79\xce\x33\xa0\xb2\x9c\x6c\x0b\x1e\xe5\xed\xbe\x12\x04\xf1\x04\x48\x05\x08\x46\x57\x77\xd6\x82\x13\xfa\xf8\x5e\x72\x64\x03\x90\x83\x83\x30\xd0\x6e\xd0\xcb\x77\x09\xfb\x19\x6f\x1d\x84\xc4\x62\x5e\xa9\xaf\x64\x83\x23\xb6\x14\x67\x42\x19\x51\x0d\x06\x83\x03\x64\x19\x85\x58\x2c\x83\x87\xa7\x6c\xbc\x06\x24\xb2\xcd\xe3\x65\xc5\xda\xe3\xcc\xcd\xff\x3a\x46\xbe\x68\xdb\x46\x7f\x6b\xdb\x4e\xbe\xe7\x95\x9d\x7c\xc6\x40\x7a\xfd\x43\x65\x21\x6d\x90\xe7\xd4\xc8\x98\x1a\xa4\xcc\xff\xae\xc7\x66\x0d\x3c\x9b\x93\x40\xba\x6a\xe3\x60\xe6\x48\x12\x82\xc0\x66\xc3\x90\xb8\x9d\xd9\x72\x13\x39\x4a\xa6\x37\x0d\x50\x39\x38\x5b\x36\x14\x53\xa1\xfc\x04\x1b\x8e\xa9\xd8\xf1\x23\xed\x04\x0e\x3c\x5c\xfe\x96\x07\xbd\xe7\x78\xeb\xfb\x28\x9e\xe9\x3f\xdd\xf8\x28\xaa\x17\x4b\xc9\x63\xb1\xb6\x08\x2d\xfb\x77\xff\x69\x0f\x79\x4c\xc5\xd6\x7e\x24\x84\x13\xb7\xff\x27\x7b\xd8\x9b\x3d\xf5\x83\xe6\xa1\x26\xf3\x31\x90\x74\x2a\x15\xe3\x7a\x9b\x9f\xb3\xae\x08\x9f\xc2\x8c\x2e\xc9\x93\x3b\x52\x40\x41\xe8\x31\x80\x33\x1a\x92\x22\xa9\x65\x76\x53\x81\x68\x1a\x61\x4c\x0f\x36\xae\xa9\xd3\x2e\xe2\x03\xe8\x0c\xba\x25\xac\x3b\xa3\x16\x90\xb1\x39\xb3\x2a\xb0\xec\xc6\x79\x6f\x77\xce\xd3\x65\xe1\xa6\x3c\x7c\xf1\x12\xf2\x6c\xa2\x6e\xf8\xd9\x06\xa8\x98\x50\x3e\x17\x11\x93\x37\x02\xa8\x3e\xbc\xef\x20\x8e\xda\xd8\xdc\xb2\x7d\x86\x97\xc7\x15\xe9\x8d\x1d\xe9\xb2\x23\x5d\x76\xc2\x92\x2e\xac\x57\xf7\xd4\xfa\x12\xb3\xee\x3f\xbe\x2a\xcc\x45\x49\xb1\xb2\x00\x7c\xcb\x2e\xf2\x14\x35\x16\xb2\xd8\x09\x1d\x8d\x98\xa4\xc5\x70\xf0\x6e\x58\x89\x9f\x3d\x35\x37\xab\x12\x67\x8a\x7c\xca\x3f\x18\x65\x27\x2b\xae\x97\x54\xd7\x02\xe1\x2e\xa6\xc5\xd3\x60\x7a\x03\x3a\xcc\xb0\xd9\x8b\x78\x8a\xa7\xf8\x35\x33\x2b\xbf\x3e\x42\xae\x51\xe9\x89\x93\x8c\xad\x9f\x9d\xe8\xa4\xbf\xec\xa4\xf4\x5d\xc0\x94\xbe\xa7\x99\x50\xb3\x39\x36\x7d\x01\xb2\x5b\xed\xb2\x3f\x54\x73\xc2\x6b\x81\xf8\x50\x4f\xc2\x53\x2b\x22\x6d\x0b\x1e\xf8\x2f\xaf\xb1\xd3\xfa\x07\xc5\x63\x65\x2f\x15\x65\x8c\xc5\x62\x13\xd5\x8f\x96\x79\x22\x8c\x5b\x03\xf2\x7a\x9d\xd9\xf6\x1e\x8f\xbc\xd3\x23\x63\xdd\x24\x38\x16\x9e\x13\x81\xff\x06\x8f\x9d\x9c\x53\x3f\xca\x15\xb5\xd4\xc5\xcd\x55\xf7\xce\xb5\xe3\x89\x36\x90\x8f\x6e\x35\x98\x3c\x7f\x8c\xfc\xb8\x35\x6e\xe9\x12\x6f\x2a\xe7\xa5\x80\x38\xb5\x6f\x5c\xc2\xfe\xad\xfe\x51\x15\x99\x26\xef\x65\x95\x31\x68\xbf\xb1\x7b\x67\x77\xdf\xee\xee\xfe\x54\x1d\x82\x36\xc7\x7e\xcc\x44\xa0\x15\xe7\x4e\x18\x7c\xfb\x24\x39\x4e\xf6\x91\xc7\x0d\xd5\xe2\xec\x8f\xbb\xa3\x38\x6c\x43\x71\x68\x59\x7a\xc3\xd3\xb6\x17\x04\xf6\xe3\x6b\xe8\x0c\x0f\x7a\xcb\xeb\xef\xe5\x33\xfe\x11\xb3\x97\xc3\x07\xe6\xbd\xbc\x9d\xa4\x9a\xd9\xa1\x74\xf4\xd1\x4b\xb9\xbc\xc7\x7f\xe0\x27\xc8\xc6\x1a\x7e\x3b\x60\x41\xc9\x31\xf2\xff\xf1\xc7\xd9\xd5\xf0\x97\x2d\xd7\x4c\x9e\x35\x52\x9b\xc0\xc1\x66\x15\x92\x7d\x0a\x49\x67\x21\x21\x60\xa7\x1d\xb9\xf1\x40\x8d\x7c\xb2\xa6\x7f\xfa\x1f\x5c\x83\xcd\xd9\x6d\x66\xda\x8b\xe5\xb6\xda\x38\xcd\x57\x8f\x6a\x74\x5f\xf6\x77\x9e\x26\x4b\xc8\x0e\x13\xfa\x78\x3a\xdb\xa2\x5a\x03\x98\x0a\x02\x24\x13\x3b\xa1\x40\x8c\x0f\x1b\xe7\xa0\x43\x34\xa7\x8f\x2a\xee\xdb\x33\xc0\xb6\xa0\xde\xa9\x78\xde\xf1\x77\x2e\x21\x62\x3e\x30\x34\x00\x54\x80\x5b\xd6\xd1\x34\x4d\xd2\xc3\xf4\xf1\xc5\x96\x28\xc5\x4f\xa7\x23\xe2\x40\x04\xd7\x2b\x6a\x6c\x98\x8a\xb0\xa2\x3a\xfc\x2c\xe0\x43\x67\x82\x50\x4a\x03\xd1\x15\x78\xf8\x54\xc8\x14\xe2\x5c\xde\x20\x8f\x56\x1a\xcf\x5e\xe7\x34\xfd\xb9\x1f\x5b\x7f\x3e\xbd\xfd\xc7\xfc\xb7\xfe\x58\x95\x76\x58\x7c\xf9\xd2\xe4\x99\x58\xef\x01\x3a\x70\x3a\xd7\xd3\x72\xf0\xdc\x5e\x9e\xb0\xc3\x0a\xc5\x88\xc2\xcd\x9d\xfb\xb7\xdc\x03\xac\x6c\xb0\x1b\x55\x95\x15\x4d\xea\x86\x05\xca\xf4\x26\x9a\xb2\x9d\xd7\xcb\xa3\x52\xd2\xca\x2f\xd6\x78\x54\x57\x33\x31\x64\x12\x74\xbb\x59\x55\x13\x26\xd6\x7b\xa0\xb2\xa7\xeb\x3f\x75\x45\xa9\xea\xa2\x9e\x5e\xde\x96\xb2\xbe\x79\x71\x07\xa7\xb2\x16\xa7\x11\x43\xa5\xf5\x1a\x6d\x58\xbb\xc2\x8d\x94\x68\x37\x41\x23\x99\x6d\x66\x7e\x6e\xfc\xad\x2b\x36\xf4\xb1\xae\x28\x7f\x2c\xab\x02\x53\x2b\x38\xe9\x37\xd1\xca\x8d\x3d\x5f\x5a\x36\x4d\x91\xe6\x98\x7c\x2f\xb6\xb0\x70\xb7\xf2\x76\xb9\x01\x36\x12\xee\xe6\x1b\xb0\x85\xb7\x4b\x0d\x08\xc2\x0c\x48\xc2\xfa\x9b\xaf\x7d\xd3\xaf\x96\xaa\x06\xbd\x61\x0b\xc3\xbe\xb9\xf7\xca\x95\x1a\x49\xbb\xd9\x37\xed\xf4\x61\xa9\x28\x21\xe6\xfb\x06\x5b\xc1\xa3\x6e\x7b\x83\x52\xcc\x5a\xe0\x6b\x56\x69\x1a\xe6\xf0\x89\x6d\xb2\x39\xba\x08\x75\x4a\xda\x46\xc7\x54\x49\x16\x03\xf0\xa6\x3f\xec\xe6\xdf\x2d\x7d\x22\xb0\x05\x6c\xbe\xda\x4d\xbc\x65\xba\x3b\xfc\xa3\xad\x53\x9c\xa9\x16\xbf\xd8\x26\xda\xb9\xc1\x17\x4a\x63\xb2\xfe\x49\x61\xfd\x9a\xb7\x5e\x46\x79\x7a\x6c\xbd\xa4\x52\xb7\x94\xe3\x64\x73\xf3\x6c\xb0\x61\x74\x53\xe5\x6d\xa3\xf6\x72\xf3\xab\x33\x6c\xd6\xff\x14\x9b\x7c\xb1\x3c\xfe\x9b\x7c\x5d\x65\xf3\xfc\xe9\x28\xb9\xbc\x22\x7e\xae\x1c\x3a\xe7\x7f\x74\x94\xdd\x5a\xba\x56\xb2\xf5\x42\xda\x13\x84\x11\x69\x4b\x0e\x84\x25\x43\x2c\x9d\x0e\xac\x03\xe3\x01\x37\xe4\xe8\xce\x91\xf1\xcb\x23\xe4\xfb\xb6\x2d\xff\x3b\xdb\xb6\xe5\xbf\x73\x0d\x5b\xbe\x3e\xe8\x41\x68\x99\xd3\x3c\xb0\x72\xe8\x16\x3e\x74\x99\xc8\x0f\xe8\x4c\xe4\x2f\x78\x64\x7c\xdd\xf8\xc6\x86\x0a\x26\x65\x6f\xf2\xe6\xcb\x20\xfa\xc3\xf2\x10\x54\x77\x2f\x7a\x97\xca\xd9\xc9\x5f\x18\xa9\x84\x9f\x42\x7f\xed\x09\xde\x3d\x1a\xaf\x28\x04\xd5\xb7\x8e\xb0\xdf\xf4\x06\xaf\x2b\x24\xda\x8c\x72\x6a\x6e\x02\xf5\x6a\xd2\x85\x68\x6a\x65\x8e\x32\x1c\xbb\x74\x85\xa7\x21\x5f\x8a\x04\x72\xd8\x35\x08\x59\x50\xc1\x4e\x60\xdd\x50\x43\xa1\x3c\x9e\xa6\xc4\x7d\x19\x9d\xe1\x06\xdf\x0c\x62\x1d\x8d\x49\x04\x5e\x38\x2b\xfa\x13\x68\x51\x03\x74\x6e\xca\xb3\xea\x4a\x5d\x5b\xf2\x7f\xf1\xc8\x4d\x64\x4c\x23\x03\xfb\xd7\xb3\x09\xfc\x60\x7d\x87\x2b\xbb\xe8\x97\x46\xeb\x51\x58\x63\x4e\xbc\xdf\xf3\x35\x34\xda\x4f\xb3\xe4\xa4\x85\x5e\xab\xf0\x68\xf2\x4d\x83\x32\xae\xcd\x00\x0c\x38\x14\x93\x97\xc3\x3f\xb6\xe5\xec\x9d\x8f\x24\xff\xba\xe2\x83\xce\x8b\x66\x2a\x72\xff\x25\x8f\x64\xcf\xf3\xf0\x6f\x95\xac\x94\xe1\x0f\xbd\xec\x38\x68\xd7\x3c\x8c\x31\x11\x09\x39\xdd\x21\x56\x7b\xa9\x9f\x0b\xf3\x7d\x54\x10\xa2\x0a\x55\xb3\x3e\x8d\x1e\xa1\x48\x64\x10\xe3\x1f\x43\x54\x3c\xd4\x31\x1f\xde\x2d\xb0\x14\xf7\x23\xbc\xfd\x32\x72\x42\x19\x53\x8e\xb2\x6b\xcf\x28\xb4\xa7\x16\x6f\x86\x51\x08\x66\x9f\x6e\x9a\x2c\xa7\xbc\x03\x69\x67\xc8\xe9\x06\xc6\x98\x96\xdd\x76\xc7\x55\xb1\x63\x15\xdf\xa6\x55\xfc\x0b\x35\x32\x8a\x3e\x5b\x39\x74\xf0\x79\x1d\xd6\x0c\x7b\xe0\x11\xe0\xea\xac\xe8\xe3\xb7\x07\xe2\x52\x34\x9e\xc3\x26\xa8\xe0\xb4\x68\xb3\xcd\x53\xde\xcc\x45\x9a\xd5\xe9\xbe\x89\x7d\x75\xba\xef\x8e\x7d\x34\x49\xe9\xbe\xc6\x3e\x85\xbd\x2b\xd2\x90\x47\xd0\x75\x0d\x80\x5d\xaa\x4a\xe1\x1c\xf2\x4c\x5c\x7d\x25\xd5\x60\xd9\xd8\xe2\xfa\xa0\x21\x9d\xa7\x4b\x61\x9e\xf2\xb4\x4f\xf7\xab\x9c\xc0\x3e\xc4\x15\xe2\x0b\xe3\x58\x22\x8a\x8c\xb6\x48\x81\xe5\xd2\xca\xca\xd3\x43\x9d\x27\x49\x94\x35\x42\x91\xb7\x20\x32\xbc\x9d\x77\xa2\xc9\xb4\xd5\xbc\xf2\xea\x2b\xaf\xbd\x3c\x43\x27\xcd\xc4\x95\xef\xf4\x1e\x4d\x1e\xe5\x8f\xca\xb9\x5d\x8d\x9d\x4f\xbe\xe9\x91\x3d\x61\xa7\xd3\x03\xc2\x52\xff\x01\x8f\xfd\xae\x37\xab\x7f\x02\xf9\x93\xca\x02\xc9\xc1\x0b\x07\xe9\x12\x1a\x81\x0d\xda\x29\xf5\x07\x07\x52\x3e\x15\x76\x56\xa6\x26\xb0\xd8\x8f\x69\x90\x6e\x34\x5f\x99\x4a\x6e\x5c\xf1\x5b\xe6\x6e\xa5\x26\x3f\x77\x80\x7a\xce\xca\x2d\x32\x41\xd9\xb8\x48\xe3\x30\x72\x83\x9e\x77\x7c\x1e\x3b\xc1\x12\x8e\xe6\xf4\xd9\x1a\x21\xd8\x3f\x29\x45\xfc\x5f\xab\xb1\x37\xd4\x8a\xdf\x3a\x56\x1d\x83\xfe\xfb\x10\x6a\x9e\xc4\x13\x4b\x61\x2c\xd7\xad\xb3\xf4\x63\x3d\x87\xa4\x70\xd0\x09\xcd\xdd\x34\x59\x09\x03\x85\x6c\x4f\x57\xd3\x30\x17\x13\x8a\xe9\xb0\xdb\xcb\x0d\x56\x6c\x8a\x12\x3a\x0e\x11\x92\x6f\x2a\x8a\xa4\xbc\xc2\x88\x51\x8b\x6d\x13\xe2\x31\xe5\x22\x53\x42\x3b\x28\xb6\xb5\x24\xc6\xd2\xeb\xe0\x43\x96\x7f\x82\xbb\x38\xee\x53\x71\x0e\x53\x1b\x8c\xbc\x5e\x30\x80\xfe\xd6\xb6\x08\xc9\xd7\x2b\x22\xa5\x49\x2f\x97\x2d\x03\xc5\x3b\x15\x1c\xdc\x0a\x66\x06\x4f\xcd\xcd\xae\xcd\xc0\x71\x72\x7d\xef\xc2\x13\xfc\xf1\x2a\xdf\x02\x8a\x8c\xb2\x53\xea\x5d\x63\xa4\x2a\x08\x6d\x3a\x8c\x03\x91\xce\x29\x46\xda\x38\x77\x90\xf4\xff\xe1\x12\xf6\x6d\xcf\x86\xd2\xa7\x4d\x78\x5c\x23\x8b\x9a\x75\x1c\xc6\xf4\x54\x57\xc4\x59\xce\x9b\x67\x1b\x74\x8a\x4e\x3b\x8f\xc1\x66\x01\x83\xa7\x9d\x37\x00\xdd\x0e\x22\x21\xa1\xbc\x08\x7f\xc7\x11\xb5\xdf\x02\x5c\xf6\x25\x61\x68\xee\x38\xd4\xba\x0c\x78\x6e\xb8\x3f\xc9\x21\x8a\x44\xde\x70\xeb\xdc\x1a\x80\xff\x79\x6f\x0c\x5f\x9f\x9d\x71\xd4\x96\xbf\xde\x45\xee\xad\x91\xdd\x2d\x4c\x72\xff\x9e\xc7\xfe\xca\x3b\x66\xc2\xf4\x31\xf2\x25\x4f\xb0\x53\x36\x9c\x6d\xab\xf4\x8c\xc3\x1d\x9c\x03\x03\x95\xdc\x3d\x31\x8e\x39\x5e\xa6\x3a\xec\x5f\x25\x0f\x66\x87\x29\x13\xe7\xf2\x2b\x59\x9d\xb2\x73\xad\x4c\xfe\x13\xe7\xad\x8c\x35\xe8\x6c\xc7\x84\xe1\x83\x74\x4c\x0d\x79\x34\xbe\x20\x77\x99\x5e\x6c\xa5\xd7\x54\x88\x00\x15\x3d\xa9\x8d\x7c\x93\x9d\x7e\x76\x57\x34\x81\xdf\x77\xa2\x1b\x4c\x9e\x3e\x3a\x35\x73\xe2\x68\xa3\x13\xd8\x72\xeb\x53\x1e\x19\x93\x53\xf9\x54\x1c\xf5\xfd\x0f\x7a\xec\x97\x4c\x06\xd4\xe1\xc1\x1c\x19\xba\x5f\x3e\x3a\x09\x8b\x69\xbc\x01\xdc\x89\xf2\x3d\x5a\xe0\x0f\x22\x6f\x09\x6c\x0b\xfa\xa6\x26\x23\x0f\x63\x8a\x53\xf1\x84\x1c\xd5\x6a\xdd\x68\x13\x5d\xb0\xf6\xad\xd7\x7a\x64\x0f\x8a\x9b\xd3\xa2\xe5\xdf\xef\x6d\x20\x52\x73\x5e\x3f\xae\x22\x35\x6f\x2f\x7a\x0d\xdb\x10\xc6\x14\x69\x21\xa6\xf6\x33\x35\xab\x65\x67\x0c\xf7\x86\x85\x70\x9a\xc4\xb1\x0a\x6a\x95\x2b\x67\x1e\x56\x0e\x79\x81\x47\xcc\x0c\xf4\xef\x66\x1d\xb5\x14\xc2\xc0\xbc\xa7\x10\x01\x70\xfe\xe8\xdb\xb1\x5a\x97\x17\xee\x43\xff\xd2\x08\xb9\x71\xcb\x20\xa0\x0a\x93\xf1\xcf\x6a\xec\xb6\xf5\x1e\xda\x00\x25\x2b\x53\x1b\xfa\x84\x86\x13\x65\xee\x99\xe2\x41\x8f\xfc\x83\x0b\xd1\xf8\x2d\x8f\x5d\xbb\x58\xfc\x5e\x2c\xa3\x16\x9a\xc2\x2b\x8b\x2e\x02\x40\x16\xc8\xe9\x0b\x06\x8c\xea\x60\x35\xae\x8b\x3f\xa4\xb0\x1a\xd7\xc7\x1f\x7a\xa5\x67\xc3\x25\xac\xa1\x2d\xcc\xf1\xbc\xd9\xf6\x05\xfb\xa9\x39\xe4\xa4\xb6\x36\xd4\x3c\x01\x14\x5d\x14\xc4\x72\x06\x5b\x4c\x3a\x5a\xb6\xc9\xe1\xb3\x70\xd7\xe7\xa6\x16\xa6\x6f\x36\x58\xa5\x4b\x49\xe0\xb0\x2c\x91\xb7\xed\x26\x4f\xa8\xb6\x34\xa0\x9c\x07\xa2\xc3\x05\x91\x02\x22\x88\x08\xfc\xbf\xdf\xc5\x9e\x34\xec\xa6\x82\xa1\x2f\x7e\x5b\x53\xa3\xd8\x38\xce\x7b\x63\xe2\x5c\x98\x4f\x27\x81\x6b\xcc\x7a\xfd\x2e\x72\x9a\xec\x35\xcf\xcd\xce\xf8\xd3\xec\xea\x69\x2b\xdd\x6a\x76\x46\xef\x2d\x0a\xb3\x63\x5f\x90\x34\xcf\x8a\xf4\xf0\xe4\xe4\x13\xcd\x6b\x77\x84\xc1\x93\xf6\xd9\xcb\xe3\x76\x62\xaa\xf3\x9f\xa2\x33\x28\xaf\xb6\x53\x9f\xcc\x46\x8f\x31\x7c\xaa\xf9\x96\x65\xc8\x14\xee\x24\x3b\xe6\x84\xe8\x04\xbb\xa9\xdc\x6f\x6d\x3d\x34\xf2\x09\x80\x8a\xc3\x35\xe5\xbd\x53\xa3\xdb\x26\x11\x90\x53\x45\x14\xe4\x0c\xbb\xe6\x84\x0a\x7b\x4c\xc5\x32\x4f\x03\xad\xb8\x6f\xa0\x1f\xc5\xf8\xcc\x99\xe0\xc7\x63\xec\xba\xfd\x4b\x69\x28\x5a\xe3\x26\xd0\x71\x13\x23\xe3\x94\x98\x85\xcb\x31\x8f\xfc\x63\x7a\xbc\x0f\xce\xc3\x85\xad\x0e\xf5\x73\xe5\x3e\x80\xc9\x9e\x53\xb9\x9f\x6f\x7d\xa8\xaf\x73\x87\xda\x24\x4d\x16\x99\xe4\xe5\x76\xe8\x24\x53\xf2\xc5\x5a\x25\x8e\xe9\x7c\x33\xe9\x1a\x78\x75\xff\xdd\x35\x16\x4f\x01\x0b\x93\xb0\x79\xf5\x1c\xb9\x39\x75\x72\xa6\x38\x45\xe3\x23\x96\x6c\x2d\x34\x0e\x28\x25\x98\x30\x8a\x5b\x35\x4f\x5f\x45\x10\xe6\x20\x15\xe0\xab\x3c\xf6\xe4\x29\x13\x3d\x37\xd0\x3c\x8b\x73\x0e\x40\x03\x92\xae\x28\x83\x45\xb9\x89\x5b\xc7\xc8\x0c\x39\xb2\xfe\x56\x0c\x1d\xd0\x18\x82\x55\x5c\x7f\xaf\xa8\x91\xfd\x95\x7b\x38\xb4\x5b\x63\xe9\xa3\x70\xf6\xbf\xe1\xb1\x9b\x2b\xef\x0c\x6c\x4c\xb6\x30\x47\x7e\x36\x7c\x8d\x72\xf5\x9e\x3b\x6a\xf7\x7b\xe4\x45\x1e\x19\xc3\xb3\xe9\xec\x9c\xff\xd3\x6b\x70\xa4\x19\xf9\xa8\x1e\xc6\x16\xb0\x59\xfd\xb2\x6b\x90\x19\x6c\x09\xbe\x47\x67\xe7\xc0\x60\x12\x0c\xb6\x8c\x7c\xdb\x55\xfe\x0b\xb7\xb2\xde\xb8\x34\xf1\xc7\x74\xb1\x8b\x7e\x64\x8c\x4d\x0f\x5e\x1e\xb6\x61\x3b\x2c\x3d\x3c\xb6\x59\x16\xec\xf0\xf1\x4b\xc8\x1f\xd6\xc8\x2e\xc8\xb4\xf6\xff\x73\x8d\x7d\xbc\x86\x49\xd7\x36\x09\xb6\x46\xc9\x32\x67\x7c\xd8\xab\x44\x97\x2b\x2d\x37\x15\x4d\x21\xb7\xab\x3c\x95\xfd\x6b\xd6\x29\x6f\x36\x13\x25\xa7\x12\xe0\x40\x80\xd3\x97\x52\xbc\xc3\xcc\x41\x4a\x2a\xda\x45\xa7\x80\x1d\x09\xcd\x14\x45\xfd\x3c\xa6\x3d\x8c\x88\x56\xf8\xcc\x74\x36\x46\x34\x95\x26\xcf\x14\xf5\x42\xaf\x63\x19\x04\xc1\xce\xd7\x95\x7a\x1f\xb4\xda\x79\x59\x9e\x51\xa0\x83\xc8\xff\x0f\x04\x1f\x79\xb8\x14\x46\x61\xae\xb3\xfc\xb3\x3a\x55\x79\xe7\x58\x1c\x1e\x1d\xa5\x26\x9f\xa7\x3d\xc1\x30\x2c\x5c\x8b\xb4\x78\xd9\xb4\x3f\x73\x8d\x31\x5f\xa9\x91\x4b\x80\x8a\x24\x5e\xf6\x3f\x5f\x63\x9f\xa8\xa9\x1f\x00\x82\x1d\x60\xc8\x4c\x84\xa3\x27\x2b\x13\xe7\x20\x3d\x15\xf1\xe6\x73\x0d\x4d\x82\x02\x1f\xcc\xb9\xda\x36\x6f\xd5\x6c\xf6\xdd\xa2\x09\x0a\x1b\xc5\x7c\x7a\x4d\x62\x26\x6c\x73\x93\x62\x5b\x53\x15\x17\x86\x1b\xc4\x39\xb3\x6a\x40\x5b\x55\x18\xd5\x07\x07\x39\x10\xad\x82\xb8\x0e\x4b\xb2\xc2\xda\x2d\xb2\x18\x65\xcf\xd2\xd4\x26\x06\xe9\x5f\x4f\xe4\xf9\x28\x6c\x1a\xe5\x22\x8c\x97\x8b\x84\x09\x9b\x1e\xc5\x1d\xdb\xf7\xd6\xc8\x5e\xab\x99\xfe\x1b\x6b\xec\x65\x35\x7b\x64\xd6\x9b\xbd\x4e\x1f\x37\x3a\xed\xa6\x37\x35\xd1\xe4\xf1\x53\xf0\xb8\x00\x5d\xb1\xeb\x8f\x93\xdc\x6d\xc3\x45\x1e\xb0\x6f\x8d\x90\x1b\x36\xb4\x7d\x02\xe3\xa7\x32\xd5\x1f\x4b\xd2\x19\x2d\x96\xfc\xb7\x8d\xb0\x55\xfb\xa6\x2b\x01\xcb\xd8\x78\x52\x51\x65\xe6\x97\xb2\x1d\x81\x82\x68\x60\xe4\xd0\x86\xd4\xe1\x98\x21\x0f\xc9\x0a\x72\xcc\xce\x0a\xd1\xd5\xf1\x2a\xb8\x2c\x1b\xe7\xbd\x4b\x97\xad\x9a\xcf\x7b\x97\xa8\x42\x1c\x41\x76\x5f\x8d\x84\xc4\x79\xd0\x7f\x2a\x3b\x6e\xff\x76\xd8\x35\xc0\xde\xa3\x90\x13\x2d\x78\x3b\x5b\xf5\x2c\xf7\xca\x56\x7e\x5e\xe3\x11\xdd\x0a\xff\x7e\x8f\xfd\xfb\x95\xca\x2a\xaa\x0a\x95\x87\x1c\x5d\x62\x81\xd7\x91\x27\x34\xe3\x0a\x6a\x0c\x37\x19\x95\xc3\x93\x26\x3d\xc0\xaf\x6f\xd1\xac\x1b\x85\xb9\xb1\xda\xda\xdf\xc2\x71\xbf\x7c\xf7\x52\xfb\x53\x37\x9c\x70\x2d\xb9\xa3\x15\xbf\xa5\xb2\x16\xc6\xcb\xa7\xf1\xcc\x50\x24\x30\x7d\xe0\x52\xf6\xac\xf5\x1f\x73\x20\x1e\xdc\xbd\x86\x0e\x7d\x5b\x9d\xc4\xd7\x4c\x68\xfa\x95\xbd\xe4\xb8\x51\x56\x8f\xb0\xab\x94\x92\x6a\xad\x4c\x0a\xea\x6b\x39\x4d\x47\x9f\x7d\x60\xf9\xd9\x23\xf2\xea\x02\x03\x5a\x7e\xaa\x21\xb9\x38\x75\x4c\x6c\x6d\x0d\x61\x9a\x9b\xea\xca\xd3\x99\x08\xea\x74\x46\xc4\xc0\xf8\x21\x67\xcd\x31\x04\x79\x29\x4e\xb6\x60\x1f\x57\xf6\x6d\x06\x65\x30\x9a\xa4\x94\xa9\x72\x98\xf3\xa9\x7e\x7e\x97\xf2\xbc\xbd\x6c\x17\x7b\xee\xae\x21\x64\x72\x4f\x01\x99\x62\xd5\xc0\x53\x41\x99\x6e\x0e\xab\x53\x86\x0d\x52\x34\xc4\x0c\x9b\xc4\x1a\x84\x4c\xc5\xd6\x73\xd6\x27\x92\xc7\x37\x08\x0e\x5f\x09\x39\xd4\x36\xc9\xe1\x29\x1e\xd9\x39\xb6\x75\x3b\xc9\xca\x1e\x5f\xe0\x7c\x57\xc5\x42\x95\xc5\x1e\x13\x66\x59\xcf\xd2\x6c\xc3\x65\x79\x10\x24\x64\xca\xb4\xf1\xc2\xb6\x22\x80\x42\xed\x36\xa8\x91\x1f\xde\x0e\x35\x3a\x6b\xb6\x43\x4d\x90\xb5\x5a\x81\x45\x6a\x8c\x9f\x3c\xc1\x1a\xf1\xd3\x15\x73\x5f\x56\x69\x0f\x14\x0e\x42\xf9\x5b\x76\x7a\x0a\xb4\x4a\x9c\x6b\x46\xbd\x2c\x5c\x11\x1b\x9f\x6d\x36\xc9\x4a\x07\xea\x49\x80\xb9\x45\x76\xa8\x41\xc8\x29\x8d\xcb\x59\x5a\x9f\x48\xd1\x93\xab\xf8\x7c\x45\x74\xec\x4c\xcd\x0f\xd7\x2a\x33\x03\x7f\xa1\xb6\xf5\x43\xd9\xd7\xbd\xc1\x02\x4d\xaa\xe2\x60\xc2\x60\x29\xd3\x6e\xed\xac\x41\xa9\xa7\x28\x1a\x5c\x30\xee\x23\x88\x8d\x95\x7d\xa8\xbb\xaa\x93\x22\xa4\x3e\xac\x7d\x07\x76\x7e\x5f\x66\x72\x14\x00\x0b\x44\x93\xd6\x28\x46\xde\xc0\x18\x54\xdb\xa1\xf1\x2e\x6b\x7d\x1b\x3c\x74\xe4\x25\x1e\xb9\x4c\x36\x1d\x71\x31\x61\xd0\xee\xde\xfa\x98\xdd\xe8\x16\xe5\x0c\x97\x12\x15\x16\x87\xbe\x81\x07\x35\x3d\x22\xad\xc2\x8e\xf0\x74\x76\x52\xa7\x4f\x9a\xbd\x9b\xd3\x76\xaf\xc3\xd1\x19\xe2\x24\x58\x82\xd6\xe1\xa6\x56\xae\x29\x63\xef\xdb\x45\xc6\x87\x73\x4c\x4f\xe1\x0c\xbb\x39\xc9\xf2\x39\x9e\xb7\xfd\x07\x46\xd9\xcb\xbc\xd2\x45\x27\x30\x00\xcc\xf0\x9a\x2c\xad\x98\xee\x0e\x24\x99\x45\x96\xc7\x55\x98\x20\xec\x05\x08\x70\x08\x90\x39\xa0\x65\xa8\x83\x2f\x16\xdc\x95\x35\x21\xdf\x9f\xb2\xcf\x3b\xcc\x75\x7a\x0f\xfa\xf0\x08\x79\x4f\x8d\x10\xf9\xf4\x1c\x3c\x2c\x55\xcc\x97\xd7\x8a\xdf\xfa\x4b\x38\xe5\x69\x4d\xcf\x6e\x7d\x41\xc4\x07\x8d\x31\x28\x57\xda\x19\xb2\xf8\xf8\xc5\x06\x5d\x48\x79\x08\x61\x15\x59\xc4\xb3\xb6\xe6\x20\x4f\x21\xc7\x06\x27\xf4\x8a\xc1\x74\x18\xa8\x56\xa1\x36\x41\xa5\xf2\x7a\x83\x90\xc2\x5d\xb1\x38\xd9\x4a\x92\x45\xc5\x7e\x0b\x0b\x5d\x5d\xaa\xe3\xbf\x93\x8b\x20\x59\xf0\xef\x25\x9e\x2e\xba\x6f\x00\x1e\x57\xf1\x56\xb0\x28\xd7\xce\xe2\xa4\xc8\x9b\xf0\x94\x43\x68\x69\x3b\x22\x56\x59\xb8\xaa\x58\xb0\x0b\x1f\xb7\xa2\x29\x93\xa5\x59\x23\x54\x22\x39\xb2\x86\xd8\x30\x2d\x45\x91\x19\x4d\x70\x3d\x18\xc8\x44\x59\x97\xab\xe8\xbe\xfb\x87\x6c\x3b\xe7\x1a\xcb\x4b\x59\xc4\x7f\x70\x99\x9d\xaa\x2b\xcf\x44\x79\x2f\x8d\xd5\x61\x00\x7c\x97\x1c\x01\xcd\xb8\xfc\x76\xf1\xbe\x5c\x3f\x81\x59\x4b\x05\x1c\xbe\x9d\xe1\xf5\x08\xf2\xfb\xb6\x37\xf9\x37\xb7\x09\xa4\x6e\x41\x05\x39\x48\xea\x0f\xa5\xab\x9c\x7c\xc3\x33\x3a\xd9\x57\x3c\xf6\x39\x6f\x8a\xaa\xa6\x17\xc9\xd9\xa8\x10\x76\xf5\x36\xb3\xda\xee\xab\x68\x02\x1b\xe2\xd8\x60\x2e\xf3\x30\xea\xa5\x82\x19\x5e\xaf\x59\x15\xfa\xa3\xce\x61\x99\xc2\xff\xce\x35\xda\x74\x9c\xb8\xdc\x51\x1a\xad\x52\x9e\xdf\x4e\xa3\x26\xd8\x8c\x78\x8a\xca\x37\x8f\xe9\xcd\x0b\x0b\x73\x5a\x9c\x37\x01\x7a\xa4\x67\x2d\x3f\x79\xa8\x49\xc3\x40\x18\xa4\x27\x35\x8b\x7f\xa3\xd0\x15\x3f\xe4\xb1\xb7\x6b\xe6\x0f\x9d\xfb\xa6\x7b\xd2\xa0\xa7\x40\x59\x3c\x4c\xd9\x3c\xa2\xf2\xa1\x9a\xa7\x7b\xf5\x50\x47\x12\xee\xc4\x5f\x5d\xc0\xf8\xab\xdb\xc8\xa8\x9c\x30\xfe\x49\x6d\xd6\xbe\x6e\xbe\xb7\xbc\x2c\xb2\x5c\x04\x38\xab\x94\x08\x80\x59\x65\x10\xb5\xf1\x43\xd4\x11\x8c\x56\xc5\xf7\xb8\xb0\x89\xef\xae\x91\x4b\xd4\x96\xea\xbf\xa9\x46\x9e\xbc\x05\x99\x80\xd3\x71\x06\x0b\x61\x7f\xe4\x41\x26\xa8\x54\x69\x30\xc4\xb8\x94\x58\xaf\x4c\x33\x88\x5c\x09\x81\x62\xea\xc8\x24\x47\x1d\xe7\x01\xb0\xd5\xc8\x03\x86\x30\x25\x61\xe1\x8e\x49\x02\x16\x31\xfa\x57\x0d\x06\x18\xd4\x88\x23\x81\x2e\x21\xd9\xe7\xe5\x1e\x4f\x79\x9c\x0b\xe3\x51\x85\x23\x2f\x28\x6a\x7d\x3d\xc7\x6c\x4b\x97\xda\x7c\xb5\xa6\xae\x9a\x87\x28\xec\x3b\xd1\x4c\x5b\x8f\x66\x3a\x53\xa8\x7d\xb7\xb0\x1b\xa6\x50\xcb\x1b\x2a\xa9\xcb\x08\x15\xb6\xcc\x6e\x38\x19\xb6\xdb\x08\x81\xc1\x88\xe7\x52\x08\xcc\x1b\x47\x2a\xb1\xe5\x67\xb8\xe8\x24\xf1\xbc\x50\xaa\xef\xbc\x86\x6d\xfb\xeb\x1a\xfb\xa9\x21\xf7\xcc\xdc\xe8\x49\x51\x52\xb8\xf4\x0d\xfe\xbc\xc1\x60\x56\xcf\xa3\x0d\xd4\x94\xe6\x6e\xe1\x2f\xa8\x91\x9f\xf5\xc8\x23\x52\x1b\xe3\xde\x7f\xce\x1a\x94\x18\x43\x60\xf1\x75\xe9\xec\xe8\x69\x17\x0a\x1a\x5d\x06\x18\x86\x90\x35\xe8\x9c\x0a\xa6\xd6\x2a\x0f\x9c\x57\x6e\xa0\xcc\x29\x8d\x35\x48\xa2\x0c\x06\xcb\xec\x69\x0b\xca\x5c\x10\x40\x1d\xa0\x69\x69\xc8\x6e\x05\x2a\x52\x7a\x1b\x36\xa8\x53\x31\x66\x76\x33\x87\x16\xd9\x79\xd0\xd9\x0f\xbf\x3c\x4a\xfe\x5d\x55\x2f\x0d\xbc\x74\x61\x36\x7a\xd7\x28\xd0\x30\x96\xaf\x0f\xc5\xbd\x01\xe8\xd1\xb0\xc9\x91\x76\x23\xb7\x82\x9f\xd1\x1d\xb0\xa6\x91\xe8\x13\x23\xe4\xa9\xc5\x1c\x3f\xc9\xa6\xa6\x86\x9d\x64\x86\x42\xc5\xa0\x79\xad\x12\xc9\xe5\x98\xd1\x75\x9e\xc8\x26\x17\xda\x5b\x46\x84\x39\x6e\x94\x89\x23\xec\xaa\xf9\xad\xd8\x9d\xec\xd2\x0e\xa9\x8f\xff\x04\xf6\x93\xfa\xe3\xdb\x43\x58\x0d\xf1\xf3\xaa\x6a\x88\x9f\xff\xb0\xf5\x33\x29\x40\x3b\x47\xdb\x85\xf9\xf9\xc4\x25\x8e\xff\xcb\xca\x86\x6d\xa8\x84\xda\xc6\x5c\x12\x64\x27\x44\x9e\x86\x4d\x15\xfc\xf6\xe2\x4b\xd8\x37\xbd\xf2\x55\xcb\x30\xa8\xf0\x7c\x01\x2f\x9d\x4a\x1d\x51\xaa\xca\x69\x68\xd2\x71\xc0\x5b\x23\xb7\x41\x00\xa7\x8b\xdd\x08\x14\x78\x49\x65\x3e\xec\x77\xc0\xec\xa0\x4f\x88\x58\x9b\x4d\x74\xd3\x04\x49\xbb\x27\xba\x22\x9d\x40\x60\xe9\x71\x15\x25\x87\xc1\x8c\xfa\x7c\xca\x57\x44\xca\x97\x41\x10\x2d\x63\x3a\x83\x0a\xb5\x53\x4c\x1d\x49\xc7\x38\xd0\xac\xa4\x0b\x28\xa4\x71\xde\x23\xd8\xf4\x93\xbc\x23\xce\x7b\x3e\xde\x9c\xc2\x12\x01\x91\xdf\x59\x0d\xff\x6b\x94\x3c\x85\x58\x6f\xf8\x37\xb0\x03\xc5\x2f\x7d\x56\x8d\xad\xbc\x08\x35\x30\x61\x4c\x61\x33\xd3\xc6\x74\x35\x69\xbe\x5a\x23\x63\xda\x71\xec\xff\xfe\xd6\x54\x95\xe3\x7c\x49\x44\x86\x90\xfc\xc5\x35\xe3\x88\x36\x90\x48\xb2\xaa\x09\x1d\x49\xae\x6d\xe3\xbc\x00\xd1\x2b\xf6\x19\x0a\xf1\x80\x85\x2f\x5b\xaf\x43\xb4\x63\xa9\xbe\xdc\xae\x0e\x9c\x1a\x86\xb7\xcb\x01\xaa\x9b\xc3\x69\x80\x07\x06\x77\xd7\x84\x7e\xe9\x91\xc7\xf7\x33\x6d\xe4\x91\x85\x77\xe4\x77\xd2\x24\xe5\xc5\x03\xcd\x04\x00\x99\xa1\x26\x65\x6e\x02\x16\xa0\xa2\x14\x18\x6f\x3d\x03\xf4\x36\xb4\xcc\xe1\xf3\xab\x62\x1a\xe4\x37\x3d\x52\xf1\x45\xfd\x77\x6d\xe6\x9c\x38\x08\x7b\xc4\xa2\xc1\x32\x8d\xc1\xc8\x9a\x5c\x7a\x0a\xa8\xf9\x59\x9a\x11\xbc\x99\x26\x19\xd8\x04\x69\x2a\x22\xb1\xc2\xe3\x5c\xf1\x37\x40\x94\xef\x5d\xaa\xb2\x71\xf2\xa5\x3d\xe4\xdf\x56\x78\xcc\x01\xc4\xfc\x34\x8f\x97\xc5\x6c\x2e\x3a\xfe\xfb\xf6\xb0\x79\xf7\x92\x39\x80\x70\xda\x09\xe3\xc9\x0e\x3f\x87\x2c\x89\x8a\x31\xbf\x40\x5c\xb7\x49\x9a\x34\x9f\x72\x12\x83\x3a\xa1\xf7\x06\x67\x11\xfc\xd6\x18\xf9\xff\xd8\x7b\x13\x38\x4b\xae\xf2\x3e\xf4\x57\xb7\x67\x3d\x92\x40\x2a\x01\xc6\x40\xe0\xa4\x24\x7b\xba\xe5\xbe\xb7\xd7\x19\x69\x1a\xc1\xb8\xd5\x33\x23\xb5\xa5\x99\x69\xa6\x67\xc4\x22\x09\xba\xfa\xd6\xb9\xb7\x8b\xae\x5b\x75\xa9\xaa\xdb\xdd\x17\xa4\x04\x43\x30\x5e\xb0\x1d\xc0\x0b\x9a\x80\xc1\xcf\x04\x9e\x05\x36\x0e\xd8\x60\x1c\x9b\xc5\x0e\xbf\xf8\xd9\x71\x9c\x18\xe3\xdd\x0e\x26\x24\x78\x8b\x1d\xef\x8e\xde\x73\xf2\x7e\xe7\xfb\xbe\xb3\xd5\xbd\xbd\xcc\x22\xe1\x97\x37\xfa\xfd\x60\xfa\x56\x9d\x3a\xfb\xf9\xce\xb7\xfe\xbf\x79\xa2\x90\xc7\x83\x71\x43\x21\x07\x92\x3d\x61\x43\xd5\x24\x58\x26\x45\xcf\x41\x52\xf3\xf9\x1f\xf0\x82\x97\xab\x5b\x52\xd7\x63\xf9\x51\x50\x4d\x38\xab\xab\x56\x9f\xe1\xa4\xc5\x56\xe3\x58\x50\xf2\x55\x9d\xb8\x94\x5c\xe2\xb5\x45\xb9\xfa\xbc\xc7\x9e\x41\x9d\x26\x43\x8b\xff\x19\x2f\x78\xdd\x49\xe7\x91\x4e\xfd\xb4\xd3\x88\x94\x82\x6f\x0f\x63\xca\x4d\xb5\x4f\xcd\xa8\xbe\xc3\x63\x23\x9d\x70\xcb\x7f\xb3\x17\xcc\x9e\xd1\xdb\xa4\x99\xa5\x92\x87\x03\x1f\xcf\x8c\x12\x79\xc8\x3d\x31\xd0\xd9\x6b\xdc\x9b\x5f\xaf\xb1\x67\x75\xc2\x2d\xdc\xcc\x38\xf4\xf3\x92\x43\xf6\x3f\x55\x0b\xfe\xd4\x3b\x33\xe4\x0d\x44\x96\x98\x0c\xf1\x8a\x04\x5b\x90\x68\xa0\x1c\x84\x58\x50\x93\x66\x1c\xf1\xcd\xe5\x76\x41\xd8\x6a\x79\x61\x64\xe5\x9a\x41\xe5\xde\x04\x8d\x08\x16\x89\x62\x74\x18\x84\xb1\xeb\xe5\x30\xe1\x5f\xf2\x1a\x7b\x5d\x0f\xfd\x0c\x50\xae\xe9\x75\x24\x63\xaf\x24\xec\x17\x57\xc4\x7d\xdc\x21\xf2\x4c\xae\xf6\xf2\xa2\xd4\x84\xd6\xed\xf7\x53\xb1\xce\x71\x8a\xeb\x1c\xa7\x5f\xe5\x75\xfe\x2f\x23\xec\xc8\x0e\xe9\x2b\x2f\x64\xeb\x22\x55\x87\xec\x93\x23\xc1\xdd\xf6\x03\xa3\x58\xb7\xfc\x8b\xf1\x52\x53\xf8\x8e\x4d\x48\x11\xc1\x4b\xf9\x55\xe3\x92\x77\x28\xec\x45\x10\x18\xe1\x90\xb2\xdf\xaf\xb1\x77\x7a\x4c\xbf\xf3\xbf\xc5\x0b\xfa\xf3\xf4\x43\x1d\xe3\x38\x25\x81\x5d\x95\xd2\x1e\x22\xb2\x6a\x79\xb3\x07\x76\xd7\x20\x24\x16\x54\xd0\x70\x3b\x29\x22\x40\xfb\x42\xd5\x01\xbd\x95\xf7\x2e\x37\x98\x08\x36\x75\xfc\x79\x8f\xdd\x22\xb6\xba\x31\x39\x0c\x53\xfe\x8d\x8f\xea\xfc\x1b\xef\xf6\x4e\x55\xdf\x6a\xb2\x63\xc1\xb4\x83\x36\x1b\xd2\x89\xee\xad\xcb\x6b\x14\x59\x00\xc1\x06\xaa\xeb\xfa\x32\x0b\x06\xda\x0c\x86\xd7\xe5\x68\x63\xde\xc5\xd8\xcb\xcd\x3a\x1b\x84\x8c\xba\x19\xb9\x0d\xff\x69\x81\x15\x6d\x4c\x35\x16\x7a\x45\x99\x75\x94\xcf\xdb\x42\x96\xf4\x3a\xe9\x49\xbd\xfb\xfc\x9f\x3e\x1c\xdc\xbf\x73\x11\xcb\x51\x00\x20\x07\x7b\x1d\x94\x2e\x88\x07\x81\xc4\x01\xdd\x3c\x06\xbd\x86\xbc\xed\x52\xe0\x03\x49\x20\x3a\xf4\xda\x22\x4b\x97\xc2\x72\xcd\xd9\x34\xff\xf6\x10\x40\x33\xaa\x77\xfe\x7b\xbc\xe0\xbb\x3d\xf5\x8b\xc4\xe3\x58\x72\xb4\x98\x18\x0f\x4c\x08\xa3\x71\x43\x34\xc8\x82\x90\xe7\x68\xba\x86\x89\x1c\x23\xd7\xc9\xb8\xe0\x42\x4e\x34\x26\x0b\x68\xcb\xbd\x5d\x22\x0f\xdd\x84\xf1\x59\xf7\x6b\xc6\xbb\x79\x16\xf5\x28\x7c\xc0\x68\xd0\xc9\x22\x25\x87\xe8\xec\xa5\x7b\x28\x62\x77\x2e\xa8\xa7\xc4\xa5\x0e\x98\xa3\xe0\x85\x91\xba\x06\xea\xf8\xce\x1a\x3b\xa4\x3c\xc5\xfd\x37\xd6\x94\xc2\xee\x8f\x3c\xf5\x50\x65\xed\xc3\x45\x47\xde\xc3\x98\x92\x93\xb0\x8c\x37\x04\x8f\x3b\xdd\x2c\x2f\x43\x7d\x86\x74\x7f\x1d\x26\x1d\x04\x97\xa2\xc1\x1f\xc8\x36\x45\x4e\x69\x59\xd0\x14\x01\x51\x97\x91\x90\xe5\xd6\xe2\xb6\x64\xf5\x54\xf3\x0d\x8e\x0b\x5f\x28\x36\xa6\x2f\xf9\x42\xba\x2e\xe5\x26\x05\x32\x2e\x22\x0e\x49\xed\x79\xd1\x14\x69\x98\xc7\x59\x61\xd9\xd4\x91\xc7\x0d\x75\x95\xbc\x0d\x21\xf9\x39\x12\xf8\x49\x57\xc5\xf8\x11\x8f\x38\xa0\x0f\x78\xc1\xbb\x3c\x6d\xf5\xc4\x58\xa0\xf9\xa5\x45\x54\x2c\x18\x3a\x39\xb0\x40\x7c\xd9\x4a\xcd\xd3\x8e\xcb\xb5\xde\x6a\xa3\x99\x75\x26\xce\xcd\x2f\x4e\x50\x1d\x75\x27\xac\x7e\x62\x35\xc9\x56\x27\x3a\x61\x51\x8a\x5c\x79\xca\x14\x13\xd3\x8d\xc9\x46\x27\xba\x2d\x0a\xcb\xb0\x8e\xc8\x6e\xb2\x21\xa5\x5a\x74\xfd\xb6\x6f\xb0\xb4\x51\xfe\x7d\xc1\x8b\x6d\xe5\xd4\xb0\x3d\x31\xa0\xbc\x1a\xbe\xbd\x7e\xb2\xc6\x0e\xa0\xb9\xc0\xff\x91\x5a\xf0\xde\x9a\x49\xe4\x29\xef\x45\xa5\xcd\xdc\xf3\xbc\x48\x01\xef\x88\xdc\x8e\x47\xac\x94\xa0\xc8\x43\x6a\x11\xae\x9b\xc7\x9d\x30\xef\xdb\x39\x22\x69\x1f\x49\xc9\xb7\x80\xc8\xdc\x38\xd5\xfe\x3d\x2a\x70\x04\xa5\x41\x28\x17\x57\x20\x5a\xe1\x7e\x7b\xda\xd7\xe4\x83\x87\x1d\xad\x9c\x85\x50\xb3\x31\xd5\x38\x8b\xbf\x30\xa3\x0e\x60\xa8\xfe\xdd\xa1\xe0\xe8\xc0\x53\x17\xc9\xd3\x79\xbd\x73\x6e\xef\x4f\x1f\xbc\x6e\xc1\xb8\x5a\x0b\x46\xae\x70\x55\xe3\x20\x18\x82\xab\xaa\xa6\x6a\x48\x2e\xef\xbb\xd8\xb1\x1d\xb2\xe4\xef\xb0\x13\xae\xab\xeb\xaf\x42\x5d\xff\x8b\xb6\xb9\xf8\x53\x57\x69\x2e\xfe\xa7\x5f\x25\x6b\xb1\x81\x68\x5f\xdb\xdd\x4a\x70\xca\x5f\xd8\x03\x02\xd6\x00\x55\xa9\xda\x0f\xfe\x4b\xc3\xd1\x22\x56\xdc\x4e\x96\xb2\x68\x59\x34\x7b\xf2\xd6\xc4\x2a\x00\xaf\xe7\x5f\x35\x82\xe9\xa1\x6f\x1c\xc2\x42\x0e\x25\x22\x85\x88\xc8\xa8\x71\xc9\x3b\x58\x08\x08\x4f\xbd\xe4\x1d\xce\x7b\xe9\x7c\x71\xb1\x10\xf9\x25\xcf\x2f\x7a\xdd\x6e\x02\xc2\x73\x98\x80\x53\x66\x71\xc9\x3b\xd8\x2a\xe0\x4f\x87\xb0\x7d\xb2\xce\x5e\xc3\x58\x37\x8f\x37\xe2\x44\xb4\x45\xe4\xbf\x2c\x58\x30\xbf\x24\x21\x06\x9f\x5e\x51\x80\xcf\x03\xe8\x28\x9b\x70\xef\xa1\x68\x81\xde\x2a\x79\x0f\xc2\x6c\xcd\x77\xae\xfb\xc3\x7b\x3c\xa6\xba\xe9\xbf\xdd\x63\x2f\xdd\xf6\x24\x57\x66\x8a\x22\x6f\x95\x31\x05\x83\x29\x8b\xe0\x1c\xd5\x65\xe9\xec\xd0\x78\x62\x1c\x71\xa2\xb8\x59\x2a\xa0\x19\xf0\xed\x80\x3b\x1a\xf4\x75\x2e\xd3\x53\x88\xb2\xc1\xbe\x67\x84\xdd\x42\xee\x66\x0b\xcb\x8b\x27\xf3\x58\xae\xa6\xff\x3f\x6b\xc1\x47\x6b\xf3\xd5\xc7\x74\x55\x43\x71\x45\xb9\xe2\x14\x52\x7f\x2d\x2c\x2f\xf2\x88\x4a\x61\x1b\x14\xe1\x6b\x65\xc3\x22\xd7\x13\x48\x24\xbe\x2a\xc0\xef\x4b\xf2\xb9\x71\x4a\x73\x2b\x19\xf0\x06\x9f\x4f\xc9\xcf\xa0\xea\xfe\x8d\xc2\x77\xda\xb7\xda\xd2\x09\x53\x0b\xd4\x57\xaa\xde\x88\xee\x9a\x90\x52\xb5\xf2\x52\x29\xec\x34\x7c\x72\x7e\xd1\x8a\x8a\xd7\x85\x24\x70\x10\x72\x9b\xa5\x08\x2a\xd1\xd2\xce\xc8\xc4\xfb\xa3\x5f\x13\x4e\xf8\xc2\xf2\xe2\x22\x34\x82\x91\xb7\x55\x0f\x6f\x43\xb7\xef\x66\x73\xec\xae\xbd\xae\x76\x75\xaa\xd9\xa7\x3d\x76\x73\xe8\xba\x63\x15\xfe\x13\x5e\xb0\x52\x7d\x38\x6c\x4d\xb4\xe3\x51\xd1\xe0\xa7\x30\x67\x7b\x65\x16\x93\xc4\x2a\xa4\xf6\x83\x9c\x45\x67\x08\x2f\x66\xc7\x77\xb0\xaf\xed\xec\x51\xc6\x3e\xe1\xb1\x17\x91\x60\x08\xaf\x96\xd4\x01\x39\x55\x34\xc3\x04\xf3\x8b\xbd\xd3\x0b\xfe\x99\xb7\x4b\x21\x65\x32\x74\x55\x65\x2a\x04\x5a\x2e\xba\xc2\x26\x92\x1c\x39\x98\x02\x60\x5b\x48\xc9\x08\xb5\xc6\xfa\x68\x92\x0a\x46\xde\x41\x52\x86\x48\x4b\xf5\x81\x7b\x64\xdf\xed\xb1\xc3\x72\x76\x96\xb2\xbc\x2c\xfc\xef\xf2\x82\xd3\xfa\x97\x4d\x13\x50\x1c\xc3\x69\xcc\x24\xaf\x12\xa6\x6d\x72\x14\xa3\x45\x52\xbb\x7d\xab\x9b\x55\xa7\xf6\x38\xbb\x93\x1d\xdd\xeb\xd4\xde\x47\xcd\x83\xc6\x96\x75\xd9\x0d\xb2\x51\xa2\xc4\x7e\x18\x2c\x5b\x3f\x2b\x44\xcb\xa2\x9b\x04\x2d\x01\x86\xd7\x02\xc4\xaa\xfb\xac\xcf\xc8\xf6\xa2\x8f\xa1\x33\x21\xbf\x54\x63\x37\x12\xd8\xf5\x42\x12\x16\x85\xff\xd3\xb5\x1d\xd2\x87\x55\x3a\x7f\xde\xfa\xb0\x4a\xcd\xfe\xca\xb3\xab\xbd\x6c\x9a\x66\x57\x4d\xcc\x33\x66\x2c\xd0\xae\x4b\xc6\x59\x02\x05\xbc\x71\x35\xca\x23\x90\xaf\x51\x7f\x0d\x46\x02\x5d\x58\x72\x8d\x92\x0f\x68\x02\x3b\x72\x0a\x2f\x1c\x50\xc6\x66\x4e\xbd\x88\x84\x4d\xca\x30\xb7\x3b\x0e\x5d\x20\xfb\x12\xb9\x47\x36\x58\xc4\x0e\xc2\x8e\x5a\x3c\xe9\xbf\x32\xb8\x9f\xfe\xbc\xdc\x95\x5b\x32\x51\xb9\xc3\x57\xed\x47\x3c\x66\xae\x45\xff\xbd\xde\xf6\x36\xa3\x21\x4b\x86\x5f\x55\xd7\xeb\x21\x5d\xdf\x95\xac\x15\x7d\x49\x46\xb9\x81\x9b\xe8\x5f\x7a\xec\x20\x91\x6b\xff\x71\x2f\x78\x4c\x39\x23\x0e\x21\x70\xe4\x7b\xd8\x4d\x7a\xed\x38\xdd\x8e\xc8\xa5\x99\xe5\xcf\x68\x08\x1c\xbf\x90\x91\xcb\xa3\xf1\x62\x2c\x20\x7f\x94\x2c\x25\x27\xf8\xc8\x1d\x47\x76\xca\xad\xf8\xd1\x1a\xbb\x55\xdd\x98\x61\x37\x84\x90\x98\x58\x14\xfe\xa5\x5a\xf0\xf7\xde\x90\x17\x2e\xa7\xdf\xb4\xdf\xd8\x49\xbf\x89\xab\x40\xaa\x11\x46\x5a\x84\xb5\x80\x3f\xdc\x5a\x53\x7b\x2b\xd2\x08\xd1\x9b\x9a\x9c\x5e\xe5\xb6\x40\x8c\xcb\x23\x05\xa0\xe4\xe6\x08\x06\xcf\x5f\x29\x07\x2b\xef\x67\xc9\x79\x43\xc7\x42\xd3\x2f\x39\x8f\xa8\xdf\x1e\x36\x16\x4c\x50\x0a\xd6\x89\xe8\x64\x9e\x75\xed\x97\x3b\x4d\xda\x27\x6a\xcc\xa7\xfa\x4e\x27\x62\xeb\x41\x5a\xe7\xf7\xd5\x82\xcf\x7b\x83\xcf\x87\xad\xb9\x7c\xad\x6f\x73\x5a\xf1\x2c\x87\x40\xb1\x21\xb7\x9b\x55\xda\x5d\x7d\x64\x04\x8c\xc5\x31\x2e\xb8\x80\xdc\x89\xf1\x86\x40\x3e\x40\xe7\x0a\x47\xad\x37\x29\x44\xed\x0a\x8d\x87\xbe\x76\x9e\xa4\x57\x01\x2e\x87\x33\x13\x2f\x61\x2f\x66\xc7\x2f\xf3\x16\x35\x73\xc1\xde\x31\xc2\x9e\xa3\xae\xc8\xc8\xdd\x71\x7f\x5b\x0b\x7e\xab\x36\xfc\x5d\xd5\xb4\x24\x79\xaf\xa1\xbb\x4f\xdb\xc6\xa3\x48\x0c\xee\x39\xde\x4b\xc9\x74\x61\xa8\x8c\xb6\xc2\x42\x88\x44\x94\x67\x5d\x8a\x72\xd5\x3b\xa8\xc1\x71\x8b\x51\xe0\xcd\xf6\x3b\x6c\x9b\xbe\xef\xb8\xc9\xdc\x53\x80\xdd\x06\xfb\x8b\xbc\x78\x63\x03\xfa\x42\x2b\x84\x3c\x1e\xe4\x66\x55\xa1\x28\x69\x33\xe9\x45\x66\xed\x86\x6d\x73\xd9\xe5\x9d\xb6\xf3\x77\x8e\xb0\x9b\x31\x4d\x70\x24\xd2\xe5\x7e\xd1\x2c\x93\xc2\xff\xbb\x5a\xf0\xdb\xb5\xea\x53\xf7\xf4\x5b\xdc\xb0\x2e\xc8\x0b\x2c\x39\x6e\x05\x33\x64\x3c\xcd\x52\x41\x58\x72\x22\x2d\x73\x50\x9b\x8a\x58\xf1\x39\x89\x64\x6e\xf0\x3b\x72\x22\x90\x5c\x2a\xa4\xdf\xe3\xc1\x1d\xa0\x6c\x47\xf6\xa4\x19\x16\x82\xac\xef\x96\x4e\x14\x0c\xc7\xe4\xac\x9e\xb5\x06\xbb\xd2\xe0\xcb\x98\x53\xe3\x0e\x88\x98\x44\xe3\x33\xbd\x83\x79\xd6\x5f\x38\xae\xed\xa2\xd1\x6e\xf0\xa0\x95\x65\x13\x77\x04\x3a\x8b\x72\x40\x7e\xec\xc1\xb8\xfa\xf3\xf5\x01\x64\xd4\x6d\x98\xf2\x8d\x4a\xf9\x86\x29\xdf\x30\xe5\x77\x58\x0f\xba\x51\x17\x97\x16\xd4\x8d\xba\xb8\xb4\x70\xb9\x37\xaa\xfc\x64\xc7\x1b\xf5\x6f\x6a\xec\x39\xca\xc9\xfd\x7c\x96\x95\x06\xdf\xc8\xff\xed\x5a\xf0\xef\x6a\xc3\xdf\xf1\xaa\xdf\xbd\x8d\xeb\xa3\x4f\x9a\xce\x4b\x4d\xc1\x03\xb2\x2e\xa4\x47\x90\x0a\xb9\x15\x27\x42\x63\x1f\x21\x7b\xe3\x60\x25\xd8\x47\xd2\xd2\xaf\xd8\x35\xa6\x19\xfa\x1b\x0e\xaf\x15\x2a\x5c\x5a\x5e\x32\xd1\xc4\x69\x5f\x4d\x05\xf0\x53\x34\x00\x44\x2d\x72\x5b\x07\x85\xdb\x5e\xba\x4e\x99\xdd\x37\x63\x08\xa9\x58\xed\x95\xf8\x2b\x49\xd4\xd9\x44\xd1\x1e\x3d\x00\xac\x89\xff\xb7\x1e\x7b\xee\x76\x04\x41\x4a\x45\xdf\xe9\x6d\xf7\x16\xe3\x36\x6c\xea\x34\x40\xf9\x24\x05\xeb\x1a\x40\x5d\xe7\xc6\xe5\x17\xd6\x44\x21\x28\xba\x01\x5b\x50\x41\x2a\xf4\x95\xa4\x2e\x26\xe6\x0b\xc3\xbc\x76\xd8\xa8\x3f\x5e\x63\x0c\x98\x28\xd0\x46\xf8\xff\xb2\xc6\xe6\x2f\x8b\x2b\x83\xcf\xaa\x6c\xd9\x7f\xf2\xcc\xbb\x2b\x63\xcc\xf0\xd3\x6d\x38\xb3\x3d\x71\xd3\x56\x35\x92\xa1\x29\xc3\x75\x01\xc2\x3a\x7a\x4f\xd9\xae\xcb\x4e\xf4\x8f\xf5\x99\xc3\x31\x93\xe4\xa4\x38\xe6\xf7\x7b\xec\xb9\xe1\x76\x52\xe4\x5b\xbd\xa0\xbf\xdd\xcb\xbd\x28\x71\x90\x1b\xd4\x52\x22\x17\xfa\x6b\x15\xc5\x66\x5c\x06\x6c\x12\x2d\xcf\xb2\xbb\x4f\x9f\xf4\xd8\xb3\xe9\x3a\x59\xca\xb3\x26\xc0\x72\x5d\xe8\x77\x45\xe1\x7f\xd1\x0b\x7e\x4e\xc5\x57\xb9\xaf\x86\xf1\x3a\x8a\xbb\x70\x4b\x36\x76\xe4\x7a\xe0\xc0\xc9\x29\x25\x1f\x13\xe7\xdb\x0a\x07\x8c\xea\x78\x6b\x19\xdc\xc2\x6a\x25\x5a\x49\xd8\xae\xac\xc4\x0e\x5b\xfb\x4f\x47\xd8\xb3\xa8\xe3\x17\xd3\x22\x6c\x09\x75\x2f\x7e\x61\x24\xf8\xc9\x91\x61\x6f\xb6\xbd\x1b\xd5\xf8\x7b\x50\xfa\xab\x7f\x41\xaa\xfe\xec\x74\x3d\xba\x7d\xb5\xd5\x00\x0d\x40\x85\x4a\x04\x59\xcd\x33\x6b\xad\x43\x15\x7f\x35\x30\x58\x7b\x3a\xe4\x27\x1b\x59\x1c\x91\x55\x03\x12\x3a\x6d\x77\xed\xd2\xd5\xb6\xd7\x5b\xd7\x2a\x7e\xd9\x97\xae\x14\xd8\x48\xad\xea\x3f\x7e\x19\xaa\xcd\xd3\xcb\x43\xa9\xd8\xcb\x5b\x7b\xa6\x60\x9b\xf2\x49\xab\x20\xb0\x80\x98\x10\xe3\x28\x64\x41\xa9\x91\x17\x54\x6a\xaa\x5f\xf1\xd8\x10\x9d\xb0\xff\xaf\x3d\xb6\xb8\x67\x6d\xec\xc0\xe7\xd5\xde\xa7\x83\x2d\xec\x75\x20\xf6\x97\x38\x24\xdc\x3e\x3b\x0e\xea\x0b\x07\xd8\xcb\xae\x99\xb3\x44\xaa\x80\x13\xfe\xd7\xfe\xe0\xcc\x76\x2f\x2d\xb7\x71\x72\xeb\x55\x56\xba\x28\x6e\x21\xa6\xb7\x32\x05\x90\x8b\xcd\xc2\xf9\xc6\x25\xef\x90\x1a\xbe\xa3\x7a\xff\xbe\xfd\xec\x73\x23\x4c\xbf\xf3\x7f\x72\x24\x78\x62\x44\x4f\x94\x71\xc5\x90\x2d\x55\xfc\x1a\xb4\x85\x5f\xb6\x0d\xb0\xf1\xe5\xa6\x10\xa9\x6e\x1b\x00\x4d\xe1\x44\x19\x2c\xd3\x39\x5e\xe7\x2b\x67\xb3\x54\xac\xcc\x71\xc2\x57\x87\xaf\x73\x24\x9b\x18\x59\x8c\x17\xa3\xb6\x72\xc2\xd5\x6e\x82\x2e\xcb\xac\xd7\x5c\x83\x2b\x0d\x03\x0d\xe9\x32\x54\x3e\xcb\x4e\x17\x1b\xb2\x39\x4a\xf5\xbd\x32\x07\xaa\x64\x34\x98\xe1\xea\x4b\x36\x0d\x5d\xaf\x21\xc8\x07\xec\x97\x94\xd1\x5f\x3e\x8e\xb4\x10\xa6\xa1\x39\xe6\x8d\xb3\xac\x15\x72\xc7\x38\x02\xa9\x0a\x72\xd7\x55\x81\x22\x16\xe2\x8b\xa6\xf2\xc0\xcd\x82\xfd\x2e\xdf\x10\xe4\xcb\x7e\x5a\x0e\xa1\x20\x0a\xdf\x42\x37\x77\x08\xdd\x97\x65\xad\xe6\xad\xbe\x11\x4b\x50\x31\x95\x1d\xa4\x12\xfe\xa7\x3d\xf6\x8a\xed\xce\xd4\x65\xee\x51\x93\x29\x5d\x61\x73\x34\x55\x3f\x06\x37\x22\x4c\xa8\x33\x67\x6a\x42\x1b\xfc\xbc\x62\xdc\x80\x0f\x5f\x51\x9b\x6c\x45\x21\xfa\x94\x99\x59\xab\x06\xfb\x6f\xdf\xc8\xce\x5c\x69\x9f\x91\x56\x7c\xd3\xf2\xb9\xb3\xcb\x60\xcf\x5d\x92\xb2\xb1\xff\x2f\xbe\x31\x78\xa8\xf2\x0c\x2f\x3e\xf9\xb0\x8e\x4f\x79\x2b\x93\x7b\x36\x4e\xdb\xdc\x4d\x91\x70\x32\x0f\x5b\x25\x9f\xe5\xa3\x6b\x65\xd9\x9d\x9b\x98\x78\x6d\x91\xa5\x75\xb4\x16\x03\x00\xf7\x98\x1b\x25\xf3\x91\x13\xec\x57\x6b\xc6\x5d\xf6\xe7\x6b\xdb\x63\x33\x5e\xe9\xd0\x82\xbf\x54\x1a\x7b\x1c\x85\xeb\xfc\x25\x77\x61\x2f\x55\x41\x64\x64\x38\x86\xa3\x52\xe8\xf8\x16\x82\x5c\x52\x96\x18\x62\x36\x7a\x80\x4c\x0b\x26\x16\x87\x00\x59\x1f\x39\xb6\x96\xc1\x62\x6a\x90\x2a\x54\x9e\x78\x05\x65\x89\x52\x89\x33\x7a\x85\x32\x75\x6f\x4c\xf1\x51\xc9\x4c\x89\x4d\x91\x8f\x6d\x5b\x1f\xc0\x10\xb3\x47\xd9\x0d\xd6\x3c\xfa\x9d\x27\xbc\xd7\xb0\x47\xd8\x43\xd7\x7a\x76\xad\x4d\x62\xbb\x40\x16\xec\x46\x45\x29\x4e\x66\xcd\xc2\x6f\xb2\xf0\x5a\xb6\x7c\xca\xd4\xdd\xeb\x28\x0f\x0d\xf6\xf1\x5b\xb4\xbf\xce\x87\x6e\x09\xde\x73\x8b\xe3\xaf\xa3\xdc\x74\x36\x66\x94\xf7\x0d\x92\x83\x86\x0a\x94\xa1\xc7\x48\xad\xe3\x36\xd8\xd6\xd0\x69\xc7\xec\x75\xbb\x08\xc5\xd3\x8b\x68\x8e\xb1\x3a\x5f\x2d\xb2\x14\xc7\x1e\x47\x73\x72\xab\x14\x99\x72\x16\xe1\x8b\x27\xc7\x39\x78\xc9\x85\x7c\x7a\xd6\x02\xd2\xe7\x6b\x62\x4b\x39\x37\xd4\x79\x2f\x8f\xe7\x64\x47\x2f\x9e\x5f\x04\xfb\x6c\x98\xd3\x75\x7a\x6f\x96\x84\x69\x9b\xa7\xa2\x9c\xe8\xe5\x49\x63\x49\xbe\x20\x9f\x44\x59\xb6\xce\x45\x27\x8c\x13\xf8\x16\xfe\x92\x42\x5d\x2e\x8a\x62\xdb\x5a\x64\x21\xac\x66\x9e\x4a\xd6\xc1\x2c\x24\xf9\x4e\xd9\x77\x18\x59\xd5\xfd\x05\xbd\xea\xf9\x22\xf8\xaf\x40\xf6\x89\xa2\x04\x4e\x75\x9c\x03\x8e\x8a\x8e\xc2\x3c\x7f\x7a\x81\x4f\x4d\xce\xcc\x8e\x73\xc2\xd7\xe7\x33\x8d\x29\xfe\xd0\xf9\xd3\x0b\xf2\xe9\x23\xf2\xaa\x89\xbb\x1b\xb3\xd0\xdf\xc5\xa5\x8d\x59\xbe\xb8\xb4\x5d\x4f\xb1\x93\x8b\x4b\xf8\xc9\x31\xf5\xc9\xb1\xbd\x7d\xd2\x8c\xa3\x5c\x0e\x67\x61\xf1\xe4\xf9\x9d\x8b\x43\x89\x3a\xef\x84\x4d\x59\xfe\xcc\xfc\xc2\x6e\x53\x88\x9f\xc9\x82\x75\xde\xeb\xc1\x8a\xa7\xfc\xe2\xc5\xc5\x93\x5a\xa1\x2b\x99\xd4\x5e\xb7\x2b\x72\xe0\xd7\x07\x82\x54\xdb\x62\x8b\x8f\x9e\x88\xc7\x5e\xfd\xd0\x64\xfd\x78\x58\x6f\x3d\xf2\x86\xbb\x1e\xab\x9f\xd0\x3f\x66\xf7\xf6\x63\x6a\xfa\xb1\xdb\xa9\x07\x33\xba\x0b\x33\xd7\xb0\x0f\x33\xfa\xd7\xcc\x5e\x3a\x31\xab\x3b\x31\x7b\x0d\x3b\x31\xeb\x76\xe2\xae\xe3\xe1\xea\x23\xc3\xfb\x65\x75\xe5\xa8\xee\xca\xd1\x6b\xd8\x95\xa3\x97\xdb\x95\xb8\x58\x4d\x71\xdb\x2e\xdf\x73\x76\x6a\x52\x4a\x75\xf0\xd7\x0c\x79\x7f\xaa\xe3\x9f\xc4\xeb\x82\x07\x93\x33\xd3\x53\x77\x1e\x9d\x9a\x9c\x9d\xc1\x50\xcb\xe3\x77\xde\x55\xd7\xcf\xa6\x02\xaa\x6f\x6a\xd2\xae\x71\xb7\x7a\xe8\x9b\x19\xf3\xcd\xf0\xb6\x07\xdb\x6a\xe6\x22\x8a\xcb\x66\x98\x03\x41\xc3\x5f\x5c\xfe\x54\xdf\x0f\x9d\xc1\x57\x8f\x9e\x98\x83\x15\x83\x39\x18\x3d\x31\x87\x7f\xcf\x3c\x36\x76\xe2\xd1\xa3\x0f\x4d\xd5\x8f\x3e\x42\x2f\x67\x1f\x7b\xf4\xd8\xe8\x89\xb9\xc9\xa9\xa9\x47\x61\x5a\xf1\xf9\x98\xfe\xf4\xd1\x99\x87\x66\xef\x54\x85\x67\x1e\x7b\x74\x46\x16\x7e\x68\xb2\x7e\xf4\x91\x47\x1f\x3a\x76\x97\x5b\x7a\xea\xb1\x47\x47\x4f\xcc\x4d\x4f\xcd\x4c\x3d\x3a\x75\xd7\xe4\xe4\xa3\x33\x47\x1f\x8e\x64\x93\x0f\x47\xf2\xdd\xd8\xed\xa4\xe9\x4b\x21\x83\x08\x8f\xe2\xb6\x1c\x89\xa1\xc3\x1d\x48\x33\x1f\xa7\xbc\xce\x8b\x42\xae\x17\xbf\xd8\x58\x6e\x70\x08\x85\x4f\x24\x19\x03\x51\x46\x0d\xdb\x5c\x07\xd6\xa8\xa1\xbd\x87\xea\xfc\x91\x13\x0f\x47\x6f\x98\xd6\x7f\xcd\xc2\x2e\x58\x13\x5b\xcd\x2c\xc9\x72\x58\x83\x35\xb1\x15\x46\xa2\x19\x77\xc2\x84\xc3\x53\x44\x01\xc0\x55\xb8\xed\x34\xfc\x37\x37\xbc\x91\xdb\x4e\x8c\xd2\x06\x9b\xaf\x9f\x96\x73\xfa\xa8\xfd\xf3\x98\x1c\x68\x9d\xe7\xed\x55\xd3\xd8\xf9\x7b\xef\x19\x68\x24\x6f\xaf\x52\x6b\x79\x7b\x75\x74\xfa\xe8\xd1\x71\xfa\xdf\x71\xb9\xea\xab\xfd\x52\xcc\x55\x93\xb4\x50\x42\x07\x08\xd8\xaf\x43\x58\xdc\x66\x06\xdb\x22\xed\x63\x44\x45\xd6\x32\x17\x99\xbc\x14\xe5\x1c\xaa\x60\x69\xb3\xc7\xa6\x27\x27\x8f\xd5\x27\xa7\xea\x93\xd3\x41\xe5\xd2\x68\xf5\x92\xa4\x0e\x1f\xc4\xa9\xbc\x41\x66\x66\x66\x8e\xcb\xaa\xc8\xe3\x1f\xaa\x53\xde\xff\x6e\x95\xd3\x3c\x2d\x82\xa1\x74\x1a\xd0\x94\x80\x50\x9f\xd4\x81\x03\x06\xaf\x33\x21\x84\xa2\xe5\x66\x98\x58\x95\x13\x6f\x80\xa3\x90\x35\xe8\x91\x40\xa8\x6a\x65\x38\x53\xb3\xf5\xa9\xe9\xfa\xd4\xd1\x0b\x53\xc7\xe7\x66\x26\xe7\xa6\x27\x1b\x93\x93\x93\xaf\xaa\x0e\x4e\x7e\x5e\x87\xcf\xcd\xe0\x1c\x89\xe4\x16\x56\x8b\x23\x27\x13\x35\xeb\xb1\xfd\x59\x2a\xce\xb5\xfc\xc4\x56\x68\x3c\xd5\x2c\x1c\x7b\x16\xdb\x5f\xc6\x65\x22\x06\x3a\x13\xa6\xfd\xa7\xbd\x33\x9c\x1d\xee\xc4\xe9\x03\x22\x6d\x97\x6b\xfe\xad\x14\x20\xe2\x38\xab\x3f\x87\x1d\xec\x86\xa5\xe4\x48\xdc\x0e\x0f\x4b\xee\xcd\x9e\xcf\x6e\xe8\xa5\xf1\xeb\x7a\x10\x43\x58\xf8\x37\x3a\x9a\xd0\xcf\x8f\xb0\x17\x3a\x1e\x87\xca\xe5\x4b\xc3\x2a\xfb\x3f\x36\x12\xfc\xe0\xc8\xce\x65\x2c\xff\x3f\xb2\x69\x6b\x2c\x1a\xe0\xce\xc8\x8b\xcc\x02\x5d\x57\x39\xd9\x31\xf1\xcb\x38\xee\xc9\x0b\xfd\xae\x38\x23\x65\x0d\x29\xdc\x9a\x94\x30\x94\xcd\x0b\xd4\xa3\x24\x23\x28\x77\x64\x84\xc2\xb4\xdc\x78\x5a\xbd\x1c\xa4\x7e\xe5\x18\x82\x4e\xae\xaa\x03\xea\x33\x79\x76\xc7\xab\x2a\x04\x9d\x77\xc8\xe1\x72\x21\xdb\x30\xa4\xf0\x0a\x93\xa4\xdf\xe0\xce\x44\x28\x39\xbd\x4e\x00\xa6\x75\x94\xa0\x2a\x7d\x5a\x15\x04\xe3\xe4\xe0\xe8\x40\xf0\x1a\xbe\x8d\xdd\xfc\xf0\x05\x90\x05\xa3\x5d\x89\xf8\x68\x0f\x72\xd3\x55\xbb\x3d\xae\xfb\x3c\xe6\xea\xb7\xdf\x35\xc2\x6e\xdf\x4b\x47\xfd\x3f\xab\x05\x5f\xac\xed\x69\x48\x45\xa9\xec\xc7\x96\xc3\x5d\x24\x9a\x59\x84\x78\xba\xa2\x8b\x86\x99\x6e\xde\x83\x30\x11\xfa\x0c\x95\xb7\x72\x46\x01\xd8\x45\x8f\x88\xf4\x31\x0a\x9c\x4b\x92\x37\x14\x96\x51\x1d\x12\x82\xa9\xbf\x50\xb5\xe4\xf2\x2a\x2a\xe2\x0d\x91\xf4\x71\x16\x8b\xcd\x18\xc3\x5a\x57\xc3\xe6\x3a\x6a\x99\x73\x79\xb1\xa8\xd6\x29\x45\x61\x2f\x07\x48\x19\x74\xd7\xe8\xe6\x59\x57\xe4\x60\x57\x92\x3c\xbd\xd6\xd4\x2c\x99\xe7\xa1\x89\x5d\x36\x7d\x74\x3a\xd6\x94\xfb\x39\xa6\x98\x74\xb4\x12\xda\x92\x74\x03\x51\x08\x60\x0d\xb5\xe9\xd5\x59\x9a\x6f\xf7\xd8\x8d\xe8\x8f\x24\xd2\x66\x2c\x0a\xff\xf5\x4f\x78\x09\x7b\x2d\x5b\x7b\x0a\x29\xca\xb9\x7c\x19\x48\xc1\xbc\x24\x60\xb6\xb8\x1a\xb3\x7d\x22\xed\x75\xfc\x70\xcf\x99\x22\xae\xb4\x37\xec\x0d\x8c\x99\x05\x78\xba\xc5\xf2\x37\xb0\x67\x0d\x5b\xef\x6b\x2d\x9e\x0f\x4c\xfb\x3d\x59\x96\xb0\xe7\xb9\x71\x3a\x0e\x6d\xe6\xec\x66\x8d\x5d\x79\x26\xdc\x8a\x3b\xbd\x4e\x85\x40\x3b\x25\xe2\x74\x48\x89\x17\xb2\x83\x1d\xfa\xf4\x56\xff\x40\x04\xa8\xb7\xd0\x06\xf2\x6d\xec\x7d\xfb\xd8\xb3\x9d\x23\xde\x09\xbb\x98\x78\xe3\x5b\xf6\x05\x7f\x37\x32\xf4\x15\x07\x4b\xa9\x42\x73\x26\xc2\x64\x91\x57\xa5\xd9\x03\x1f\xcd\x32\xeb\x66\x49\xd6\xee\xd3\x11\xd1\x13\x83\xd4\x1a\x14\xb7\xca\xf7\x17\x7d\x76\x28\xb8\x8a\xaa\x55\xa1\x20\x40\x10\xa7\x39\x25\xbd\x53\xa0\x10\x73\x8c\x4d\x8d\xf1\x95\x76\x1e\xa6\xbd\x24\xcc\x57\xe6\x18\x97\xff\xa1\xbd\xb7\x13\x92\x0a\x3e\x6c\x96\xbd\x30\xc1\xdf\xa3\x95\x9c\x9a\x63\xd0\x02\x44\xde\x11\x39\x01\x4d\x47\xaa\x4e\x61\x89\x35\x02\xf5\x82\x52\xa8\x37\x1e\x2d\xd7\x44\x1f\xcf\xbb\x7c\xb8\x2a\x5b\x4b\x63\x4c\x0e\x0a\xec\x4d\x21\xba\x61\x0e\xc0\xe8\x90\xa1\x60\x4c\xfb\x2e\x63\x7d\xb6\x57\x8f\x21\x47\xa0\x4e\x48\xb0\xa7\x0d\x36\x3d\xc6\x57\xc2\x32\xeb\xc4\xcd\x95\x39\x8c\x96\xa1\xf8\x9f\x92\x74\x60\x21\xc6\x1e\x82\x11\x4b\x40\xc0\xed\x38\x32\x61\x21\xc0\x6e\x84\x79\x03\x1b\x9b\x87\x4a\x70\xfc\x06\xe5\xb1\x8c\x73\x01\x7e\x06\xdd\x24\x6c\xaa\xd9\x57\xe1\x1b\xf6\x36\x7c\x0e\x3b\x78\x3b\x92\x39\x77\x7b\x6e\xb0\x67\x9a\x73\x83\xec\xc3\xd3\x72\x64\x24\xe3\x95\x24\x5f\x15\xc6\x2b\xdc\xda\x89\xf1\xfa\xc7\x8c\x75\x7a\x49\x19\x77\x13\xc9\xa3\x0e\x3d\x6e\xb7\xb2\x7d\xb7\xe7\xa2\xe5\x4e\xe4\xed\xec\xa6\x4e\xb8\x65\x51\x9e\xa1\xb5\xcb\x52\x71\xba\x5b\x29\x79\xde\x89\x10\x0c\xed\xc0\x73\xd9\xa1\xb4\x97\x00\xc2\x5f\x85\x52\xbc\xc9\x63\xb7\x10\xdf\xb8\xf4\x55\xa3\xc5\x5f\xcf\x0e\x29\x17\x0d\xff\x79\x3b\x58\x2d\x3b\x2a\x12\x2b\x62\xab\x4f\xe9\x8e\x83\x5b\x91\xbd\x88\x1d\xea\x84\x5b\xb8\xc7\x87\x4e\xbb\x2c\x10\xa7\x3b\x14\x88\xd8\x48\x9a\x95\xfe\x53\xbc\x47\x1f\x61\x07\x09\x5e\xc7\x7f\x2a\xae\xe9\x0f\xed\xdb\x31\xa1\xd3\xdb\xf6\x05\x7f\x36\xb2\xfd\x7b\xf7\xda\xc0\xb8\x68\x8d\xa7\x37\x3c\xfb\x13\x5f\xe9\x84\xdd\x15\xa0\xa7\x26\x99\x62\x89\x99\x91\xc9\x5e\x1c\xaa\xb0\xfd\x48\x6c\x69\xcc\x95\xb0\x0b\x29\x98\x25\xad\x0c\xdb\xfc\xcc\xc5\xe5\x0b\xee\x4d\x93\xa5\x40\x4c\x49\x24\x59\x53\x08\xf1\xc1\xf0\x5e\x04\xd6\xad\x45\xb6\xa6\xa0\x13\x76\x83\x06\x9f\x4f\x8a\x6c\xdc\x88\x34\x85\xc5\x1f\x6a\x4b\x5e\x58\x62\xd4\x97\x91\x4f\x14\x79\x86\xbb\x2e\x52\xc9\x18\xc9\x1b\x6c\x2d\x4e\x22\xc2\x5b\xeb\xe5\x82\x8f\xa6\x19\xb0\xa8\x64\x6e\xd1\x89\xf5\xc6\x28\xc7\xb4\xc5\xb7\x9a\xb6\x31\x0d\xa1\x66\x44\xb5\xd3\x53\x96\x2b\x54\x0c\xc7\xde\x33\x2e\x47\x84\xe9\x59\x79\xb9\x96\x15\x4e\xad\x21\xc4\x5e\x20\x8c\x9a\xba\x9f\xf0\x22\x92\x9b\x7d\x27\xcf\x82\xdf\x3b\xb0\x6d\x52\xaf\x9f\x3b\x10\xfc\xc4\x81\x6d\x96\x7c\xc8\x2e\xb9\x06\xbc\x85\x5e\x71\x87\xa1\x98\xd9\x86\xa1\xb8\x96\xd7\x2e\x36\xbb\xc7\x7b\xb7\x32\x10\xac\xc8\x72\xfb\x01\xf8\xad\xb4\xcf\x15\xa8\x3d\xf4\x6d\x14\xb7\xcb\x38\x35\x3f\xce\x1b\x8d\xc6\x18\xf2\x0f\x85\x28\x15\x53\xb4\x2c\xc8\x46\x63\xed\x7c\xed\x3f\x0e\xb3\xa1\x2e\x2f\x5c\x5a\x73\x36\x01\x1e\x82\x5c\xc0\x4e\x85\xcd\x35\xac\x0f\x99\xa8\xea\x9e\x1e\xb7\x58\x42\xa8\x60\x38\x07\xa9\x66\x18\x31\xc3\xb1\x42\x8b\x22\x6c\x47\x0d\xe8\xab\x06\x9b\x19\x43\xd2\xe0\x30\x7c\xb4\xc0\x39\xa9\xf4\x80\xdf\x89\x4d\xa6\x90\x38\xe7\x22\xa1\x44\x4d\x74\x0c\xd2\x2c\xad\x23\xe5\x58\x17\x7d\xac\x6a\x58\xfa\xc1\x4e\x83\x9f\xcb\x23\xf4\x33\x57\x22\x70\xc4\x7b\x5d\xb9\xd3\x44\xde\xa6\x8c\xe2\x9d\xb0\x2b\xc9\x0d\xad\xd9\xb0\x1d\x48\x6e\x52\x30\x44\xdd\x95\x8c\x60\x09\x49\xfd\xc0\xec\xec\x92\x38\x5e\x3c\x77\x72\x76\xdc\x78\xf2\xb7\x8e\x54\xc8\x71\x9c\x96\xf5\x2c\xa7\x64\xd0\xfe\x1f\xd4\x82\xdf\xac\x6d\xff\xde\xc9\xa9\xa1\x30\x9c\x0c\x4a\x30\x39\x61\x19\x8c\x07\x88\xcb\x51\xe6\x41\xe5\x4c\x08\xc7\x02\x43\xb6\x15\xb0\xb0\x8b\x7e\x6f\x72\xeb\x85\x05\x11\x37\x88\x19\xef\x9f\x6b\xc1\x6c\x8a\x5c\x81\x36\xb4\x2c\xf5\x2e\x41\xf7\x95\x8e\x9d\x91\x98\x13\x3a\xa3\x50\x05\x2c\x3f\x26\x11\x9c\x53\x1d\xb5\x1f\xd1\x44\x4d\x8f\x71\xe0\x18\xa9\xb8\xf9\x74\xe8\xc7\x03\x9f\xc3\x93\x46\xa3\xc1\x01\x27\x88\x60\xcc\x1c\xde\xe9\x37\x46\xd8\xed\xdb\x45\x13\x2b\xff\x8b\xc5\xb4\x95\xf9\x1f\x19\x09\x2e\xc8\x3f\x0c\xa2\x0d\xbd\xc6\xec\x3a\xda\x29\xa4\x01\x4e\x11\x9b\xe2\x48\x92\xf0\xcd\x10\x80\x6d\x78\x14\x17\xea\x26\xc1\x9c\x42\x56\xf1\x4b\xde\xfe\x4e\xf8\xda\x2c\x97\xff\xc6\xa9\xfc\x97\xb5\xe3\x52\x67\x76\x39\xdc\x8e\xcb\x85\xac\xd3\x89\xcb\x4b\xde\x8d\xed\xb8\xbc\x90\x0b\x01\xd9\x07\x2f\x79\x87\x57\x7b\x71\x12\x9d\xc4\xbf\xdb\x99\xfe\xe4\x50\x33\xeb\x74\xe3\x44\xe4\x97\xbc\x43\xdd\x24\x2c\x65\x5b\x8e\x97\xc2\x97\x3d\xf6\xb5\xcc\x6a\xc5\xe5\x69\x9f\xcb\x4c\x65\xee\x9b\x67\x31\xec\xea\x40\x79\xdd\x11\xf7\xcd\xd7\x30\xdd\x95\xc1\x26\xd4\xb0\xaa\x4a\x4d\x67\x90\x83\xed\xcb\x29\x1a\x68\x45\x8d\xd2\x7d\xf1\xd3\x07\x1c\x04\xfe\x66\x06\x19\xb8\x70\xd6\x15\x73\xf4\x80\x08\x0b\x01\x41\xd0\xdf\x75\x20\x18\xd5\xbf\x28\x50\xdf\x71\x05\x01\x97\x2a\x28\xe1\xfa\x7c\x7c\x61\x3f\xfb\x36\x8f\xdd\x10\x36\xe1\xaa\xa6\xfc\x06\x77\x5f\x41\xbc\xfa\x99\xb8\x99\x67\x00\x28\x39\x67\x55\x46\xb9\x25\xe5\x5f\x3a\x32\x46\x41\x34\x26\xb2\x37\x98\x7e\x04\x3f\x88\x1a\x4c\xb0\x67\xac\x65\x49\x24\xf2\xc5\x08\xaf\x38\x7f\x39\x38\xed\x3e\x71\x33\x15\xc5\xea\x29\x1d\x5b\x2c\x4b\xc9\x2b\xed\x86\xaa\xb8\x47\xcf\x82\xa7\xca\x18\xa1\xa0\x8f\x3e\xe2\x29\xcc\x99\xc7\xbd\x61\x05\xc8\x6b\x45\x19\x28\x54\x08\x56\x04\x6a\x59\x15\x44\x88\x03\x4b\x09\x35\x79\x33\x8c\x51\x4b\x01\x2e\xfb\x34\x54\x1e\x97\x26\xaa\xb8\x23\x42\xe0\x81\x14\x1e\x8f\x4a\x07\x01\xa0\x9c\xd9\x2a\x91\xfd\xf3\x22\x15\x9b\x72\x4e\x5d\x88\x98\x9c\xdd\x0c\xed\x19\x40\xd0\xc2\x7f\xb5\x1a\xc4\x62\xf5\x95\xc6\x8e\x44\xeb\x99\x9c\x34\xeb\x25\xcc\x1a\xf6\x5e\xf9\xc5\xe1\x7c\x16\x6e\x9b\xef\xf3\xd8\xe1\x5c\x75\xc7\x7f\x87\x77\x95\x1b\xe6\xbc\xae\x6b\xa7\xed\x62\xaf\x2c\xf6\x71\x2d\x2c\xec\x74\x19\x88\x63\x8d\x8b\xcd\x9e\xbc\x71\x68\x8e\x42\x4c\xfc\x77\x26\xec\x3a\x59\xb8\x7f\xe9\xc6\xe0\x73\xb5\xf9\x28\xec\x42\x06\x6e\x5d\x06\x93\x97\x87\x14\xe6\x47\x8c\xaf\xdc\x7d\xfa\xfe\x34\x50\x8c\xfa\xa3\x23\x05\xb7\x52\x95\x2b\xf6\xcb\xa4\x89\x84\x80\x75\x0a\x41\x0c\x0b\xcc\x60\x6d\x79\x15\x81\x80\x41\x3a\x5e\xab\x1e\x92\x36\x20\x1a\x22\x0d\x3b\xa2\x18\xb7\x83\xab\x90\x6f\xa2\x9b\x1d\xae\xb7\x4c\xa9\x84\xe0\xce\x37\xc8\x97\x61\xb7\x1b\xa7\x6d\x84\x05\x93\x2d\x95\x99\x0a\xf5\x36\xa3\xbe\x9a\xfc\xde\x0e\x6d\xf9\x9b\xc3\x6c\x99\x1d\x52\xd8\x3c\xfe\xbd\xc1\x71\x74\x4f\xeb\xeb\xa0\x6b\x70\xd8\xd2\x0d\x67\x39\x70\xd7\xd0\x31\xc5\xdf\x91\x0a\xdb\xb9\xf5\xfe\x68\x04\xdc\xa9\x24\xb7\x72\x26\x8b\x84\xff\x5b\x23\x6a\xbf\xff\x9b\x11\x93\x37\xba\x03\x49\x02\x64\x85\x8a\xb5\x92\x32\x14\x5c\xfc\x05\xb9\x99\xa6\xda\xad\x0b\x97\x61\xb5\xaf\x04\x14\x2b\xc9\x78\xca\xb3\x66\xa9\x30\x62\xf4\xb9\x98\x9c\x9c\x9c\x84\x49\x98\xbc\xf3\xce\x3b\x91\x47\x51\x76\xe4\x4a\x41\x28\x75\x74\x6a\xaa\xc1\x5f\x39\x7f\xe6\x01\x1e\x36\x9b\x42\xee\x33\x08\x61\xc3\x9a\x65\x01\xe7\xe3\x62\x1c\x31\xbd\xb4\xff\xa5\xfb\x96\x20\x4d\x69\x78\x0d\x27\x2f\xf8\xe4\xb1\xd9\xd9\x06\x3f\x19\xe7\x80\xac\x1a\x8b\x42\xa1\x24\x94\x2a\xcd\x88\x32\x7b\xa0\x35\x43\x79\x0c\xa0\x3b\xa3\x95\xbc\xae\x13\xb7\xd7\x28\xe2\x0d\xd0\xad\x93\x58\x71\xd6\x94\x2a\x03\x5d\x97\xc9\x9f\x03\xea\x32\x5b\x54\x76\x8e\x84\x13\xf2\xcb\x1e\xd7\x40\xf3\xb9\x28\xa4\x04\x48\x81\xab\x58\x99\x59\xab\x01\x94\xfd\x27\xf6\x29\x95\xcb\xfb\xf6\x05\x5f\x1a\xa9\x86\x54\x80\x1a\xd4\xd5\xad\x0e\x39\x3e\x3a\x2d\x2a\xe5\x17\x8f\xac\x5d\x67\x8e\x68\xf6\x5a\x9c\x10\x38\xf6\xa5\xc9\xfe\x0d\x82\x17\x8c\x6b\x13\xa4\xd4\xd4\x02\xe1\x5d\x17\x7d\x8c\xe2\x41\xb2\xa0\x1e\x93\xd4\xb2\x38\x80\x18\x29\x19\x71\x11\xe1\x1e\xdf\xa1\x65\x23\x53\xc3\xf1\xc4\xd9\xeb\xa5\x03\x5f\x53\xe4\x10\x91\x17\x68\x30\x84\x3e\xc5\xb6\x5c\xae\xb1\xdf\x64\x71\x25\x54\xd3\x2c\xe9\x89\x18\xb7\x87\x5c\x88\xb2\x47\x53\x23\xf2\x3c\xd3\xa1\x9c\x31\x65\xf9\xcb\xd7\xa5\x64\x41\x67\xad\xc1\x11\x4c\x42\x9d\x59\x0d\xc4\xa6\x64\x5e\xd9\x2c\xdd\xda\xd0\xc8\x91\x46\xe3\x08\x6e\xc6\x8c\x32\xf5\xe2\xce\x92\xcf\x1d\xc9\xbe\xc1\xc6\xd9\x1d\xbb\x66\x75\xbd\x5f\xf4\x2f\x64\x00\x1b\xf1\xcf\x3c\x02\xa1\x7b\x34\xc8\xce\x5a\xf0\xc8\xb4\xf0\xe5\x50\xd0\x1c\x23\xa8\x34\xe2\x6c\x22\xca\x9a\xc5\x44\x33\x4b\xe1\x94\x4e\x64\x1b\x22\xdf\x88\xc5\xe6\x04\x21\xda\xd4\x65\x3f\xeb\x84\xb4\x34\x01\x94\x78\xe2\x36\xf8\xc7\xc9\x50\x37\xc2\x66\x86\xf4\x73\x69\x2d\x2b\xb3\x74\x49\x32\xa7\x85\xdc\x2c\x27\xe3\x62\xdd\xb9\x87\x7e\xaf\x16\xdc\x75\xde\x60\x77\x86\x1c\xbf\x90\x6b\x54\xe6\x59\x92\x88\x5c\xd2\x2f\xfa\x5a\xf2\xe5\xeb\xc6\x69\xfc\x92\xb7\xaf\x1b\x2d\x9e\x74\x08\xf0\x77\xd5\xd8\x22\x83\xc7\xfe\x7c\x30\xab\x1c\xe2\x34\x9c\x59\xb1\x7b\xfd\xd5\x5c\x2a\xad\xe2\x42\xbf\x2b\x30\x97\x8a\x15\xa4\xa8\x92\x98\x43\x3e\x1f\x8b\x76\x22\x5d\xb5\xca\x68\x3d\x92\xf2\x53\x02\xcf\x45\xca\x4e\x20\x65\x43\x0a\x52\x3c\xb5\xd5\xe0\x81\xd8\x2a\x67\x83\x71\x1e\x6c\xb5\x0a\xf9\x4f\x5a\xb6\x8a\xa0\xc1\x17\x4d\x94\x2e\x60\x47\x99\xa8\x3a\xfc\x40\x4a\x74\x16\x89\x70\xf8\xbe\x4f\x1c\x60\x53\x3b\x80\x81\xe2\x62\xcc\x97\x65\xd8\x5c\x93\xb7\x1c\x2d\xcb\x37\x1f\x08\x7e\xd7\x1b\xfe\xce\x86\x5a\xd5\xd7\x3a\xcc\xb2\x41\xfc\x0b\xe1\x1b\x11\x35\xf8\x79\xa0\xa9\x69\xb6\x89\x12\xba\xde\x09\x2a\x70\x9d\x68\xa2\xfa\x00\x52\xd8\x69\x1f\x7f\x7a\x9a\x8f\xcb\x93\xdb\xea\x81\x96\x6e\x13\x63\xb3\x14\x22\x41\x91\x29\x0c\x1b\x1d\x6c\x9e\x02\xda\xb3\x9c\xd0\xb0\x59\x52\xf6\xb8\x8e\x00\xe6\x8f\x5a\x2b\xaa\xc9\x12\xde\xb1\x8f\x7d\x66\x84\xdd\x1c\x5b\x40\x35\x20\x63\x7c\x68\x64\x07\xd0\x11\xbd\xc7\xf5\xfe\x31\x5f\x06\x7f\x5e\xab\x56\x66\xa5\x2c\x23\xe7\x7b\x3b\x19\x50\x2a\x9a\xa2\x28\xc2\x1c\x83\x97\x60\xdc\x3c\xb4\xb7\x26\x4d\xb4\xe5\xd6\x13\x52\x24\x21\x8d\xdf\x3e\x56\xd5\xd4\x27\x86\x39\x82\x55\x50\x70\x94\x0b\xcb\x8b\x67\xe2\xb6\xf2\x3c\x42\x67\x71\xf0\xe5\x30\xf2\x86\x64\x95\x13\xe2\x17\xc0\x66\x07\xe6\xb9\x1d\x9a\x86\xfe\xf3\x61\x73\x52\xed\x94\xdc\x80\xf5\x44\x6c\x88\x64\x28\xac\x10\x58\xf6\x72\x03\x90\xa4\x92\xa5\x6d\xdb\x71\x76\x86\x3d\xab\x5b\x69\x17\xa0\xe4\x8f\x06\xa3\x36\x65\x1c\x9c\x54\x3d\xe5\xce\xc9\xf9\xbf\x6f\x66\x5f\xb7\x4d\x7e\xeb\x86\x93\xc9\xd6\xff\x8f\x37\x07\xbf\xe3\x39\x8f\xdc\x43\x52\xf4\x56\x09\x4f\xc0\x86\x7a\xa3\x71\x01\xa0\x29\x32\x98\x0a\x63\x17\x33\x3b\xab\x24\x87\x0a\x78\x17\xf3\x48\x91\x86\x52\x2b\x10\xdd\x66\x89\x4c\x8f\x13\xd0\x3c\x4e\x23\x42\x59\x8d\xd3\x9d\xa8\xae\xac\xd7\x66\xb0\x91\x2a\xa0\xa7\xad\x5e\x92\x28\xf0\x03\x93\x93\xf9\x92\x77\x03\x79\x24\x5f\x00\xf8\xd6\xc3\xfa\x95\x9b\x89\xfb\x26\xf6\xfe\x11\xb6\xbf\x0b\x38\x40\x97\x46\x82\x1f\xad\xc1\x9f\x95\x94\xb2\x2a\x7e\x91\x40\xd3\x38\x96\x21\xd0\x1f\xd9\x5f\x81\x31\x8a\x2a\xd7\x30\xe1\x76\x14\x09\xcc\xcc\x29\xcc\x7e\x90\x97\x0e\xf4\x34\x3a\x56\x11\xd8\x24\x80\xdb\x63\xad\x2a\x09\x17\x22\xea\x57\x53\x2a\x2b\x14\x84\x34\xd3\xe7\x0a\x3e\xa3\x2a\x42\x6c\x27\x36\xce\x74\x2a\x32\x3c\x4e\xf0\x15\xe9\xf4\x9d\xba\x03\x79\xbc\xa1\x9a\x80\x7a\x0b\x3d\x27\xe4\x3f\x80\x52\xe0\x21\x27\x4f\x01\x39\x0f\x53\x93\x93\xd4\xac\xcd\x07\x1c\x63\xb3\x6c\x7a\x5b\xda\x33\x74\x33\x2e\x65\x79\xf9\xa4\x77\xdb\xb6\xa6\x80\xc3\xfe\x41\xd4\x72\x32\xf6\xdf\x6b\xcc\x5e\x51\xff\x8b\xb5\xe0\x57\x6a\xd6\x83\xca\x92\x29\x1d\xb8\x72\x4b\x6f\x86\x79\x1e\x5b\x7c\xb4\xb3\x09\x21\x9e\x4c\x15\xb5\x80\x57\x68\x1a\x68\xfb\x69\x6d\x37\xa4\x4a\xaa\x90\x86\xb8\xd3\xe9\x95\x10\x6d\x1d\xb6\x4a\x49\xb7\xa5\xcc\x42\x41\x5a\xb6\x9e\x52\xf5\x07\xc1\x40\x21\xcc\x0d\x45\xe7\xa4\x6f\xee\xdd\x39\x7e\x07\x38\xfa\xcf\x71\x9b\xd1\x20\xe7\x7f\x8a\x40\x68\x60\x99\x63\x43\xca\x1c\xb3\xcb\x9c\x7e\xd9\xc9\xb3\x6e\x19\x7e\x1a\x7c\xc4\x5e\xd6\x0b\x13\xe4\x3c\x4f\x66\x1d\xc9\xf4\x49\x8a\xd3\xb8\x9e\xd4\xec\x1a\x42\x82\xfe\x27\x8f\x19\xba\xe3\xff\x47\x2f\x78\xad\xa1\xa4\x4e\x60\x34\x11\x03\xeb\xed\x10\x12\xb2\xfb\xa1\x9c\x74\xf2\xe2\x9b\x93\x39\xcd\x26\x59\xe3\xf2\x4e\xe6\x1e\x4f\xe5\x75\x00\xd2\x2b\x07\x20\x5d\xb3\xf0\x47\x1f\x66\x2f\xb9\x02\xed\x9c\x71\x74\x0d\x9e\xaf\x01\x48\x71\x26\x8f\x14\x06\x84\xf4\x49\xaf\xb9\x3b\x38\xe8\x37\xfa\x2f\xd5\xe0\xa0\x66\x47\x54\xb0\x41\x1d\xaa\x59\xc5\x05\x7d\x27\x67\xcf\xb3\xb6\x95\xd8\x80\x65\x94\x7b\x4a\xfe\xe5\xff\xd5\x8b\x82\x4f\x8d\xc0\x9f\x2a\xeb\x27\x2a\xae\x80\x22\x40\x61\x5e\x64\x1d\x81\x99\x16\x54\xd0\x6d\xd2\x2b\x4a\x48\x35\x5c\xf2\xb6\x48\x45\x8e\x80\x44\x22\xcd\xe4\xbd\x25\x8b\x53\x6e\x2b\x0a\xef\x55\x7e\x97\x4a\x40\xd9\xb0\xed\x79\x0a\xf6\x3b\x17\x25\x2e\x0e\xea\x30\x41\xe5\x91\xc7\xed\x36\x20\x8b\x83\x37\x2f\x24\xb1\xc2\x8d\x27\x36\xb2\x64\x83\x1c\xdf\xc1\xed\x98\x63\xad\x00\x25\xd0\xeb\x58\xd4\x4b\x6e\x31\x30\xde\x12\x56\x5c\x19\x77\x54\x02\x7e\x35\x3e\xba\x8c\x91\x49\xa2\xfc\x99\xb9\x68\x49\xbe\x07\xee\x06\xc4\x27\x40\x46\x0f\x82\x25\x13\xf4\x69\xc0\xde\x8d\x73\x93\x09\xab\x8c\xd3\x9e\x88\x30\x9d\xb2\xca\x43\x80\x13\xae\x2c\xb3\x61\x49\x2d\xa8\x1e\xdb\xf8\xe6\x96\xb5\x5a\xb3\xf4\x1b\x62\x9c\xaf\x8a\xa2\xac\x8b\x56\x2b\xcb\xcb\x71\x37\x68\x1d\x36\x92\x64\xa3\x64\x55\x17\xe2\x8e\x9b\x3b\xe1\x67\x9e\xcf\xbe\x5f\xd2\x3a\xf5\xd2\xff\xb6\xab\x55\x37\x2f\xea\xba\x9c\xfc\xcb\xa4\x70\x96\x17\x38\xce\x28\x68\x67\x73\x4b\x05\xaf\x3c\xbb\x95\x5f\x43\x83\x7d\xbc\xc6\x0e\xe7\xa2\x1d\xe6\x51\x9c\xb6\xfd\xff\xb3\xc6\x26\x77\x15\x90\xf0\x60\x9d\x57\x9a\xa8\xe0\x2f\x3d\x5d\x81\x6b\xd9\x50\xfe\x8d\xa6\x47\x31\xa5\x3a\x03\x1a\xd3\x91\x82\x73\x33\x04\x9e\x42\x1e\xc9\x30\x25\xe7\x74\xda\xfd\xaa\x3e\x92\xeb\x35\x63\x5d\x8c\x23\x86\x83\x93\xda\x6d\xb0\x94\xf5\xbe\x20\xd5\x1d\xe4\x0e\xa0\x7e\x08\xb2\x9e\xae\x8a\x66\xd8\x43\x0c\x8c\xb0\x89\x99\x3d\xe0\xe8\xe0\xa1\x29\x50\xdb\x6d\xaa\xd2\xc6\xe6\xff\xe8\xb1\x83\xa0\x26\x12\x91\xff\x39\xef\x0a\xa6\xed\x9f\x7b\xf4\xb9\x5a\x43\x0d\x01\x8f\x39\xbc\xa4\xf0\xa8\x02\x88\x55\x02\xa8\x66\x26\x87\xb7\xc5\x29\xf7\x57\x83\x9f\x92\x13\x01\xeb\x6e\xd6\x40\x4d\xbb\x3e\xb6\x9a\xdf\xe2\x00\xaf\x9e\x08\xc5\x6d\xa8\x0e\xa8\x31\x5d\xf2\xd8\x81\x42\xe4\xb1\x28\xfc\xef\xf6\x76\xb8\x14\x2b\xd4\x6b\x19\x3e\x09\x1e\xc1\x4f\x81\xc1\x06\x7f\x7f\x9d\xd4\x0e\x17\x9f\x5e\x5b\xcb\x60\x49\x55\x0a\xd4\xa5\x45\x7b\x81\xdc\x44\xca\x2c\xc5\xaf\x1b\xec\xdf\x79\xec\x00\x8e\xdb\xff\xac\x17\x7c\xcc\xc3\xbf\x65\x6b\x80\x22\x41\x3f\xe5\x9e\x2f\xc3\x75\x91\x4e\x50\x2a\x7c\x33\x2f\xc4\x26\x55\x27\x4a\x9d\x89\x6a\xf6\x60\x87\x89\x35\x10\x47\x68\xab\x6f\x61\xdc\xb4\x22\x1e\x20\xf0\xa2\x46\x18\xe9\x69\x89\xbb\x7b\x6a\xfa\x2e\x2b\x30\xec\x3a\xff\x78\x2d\xf9\xc7\x4f\x7b\xec\x6b\x22\x39\x01\x52\x4e\x8b\x1e\x08\x0b\x20\x88\x45\x19\x76\xba\xfe\x0f\xed\x90\x18\x73\xb7\x6c\x82\x6b\xdb\x54\x6a\x20\x05\xd5\x6b\x6d\xd9\x2a\x7a\xc0\xd0\xad\x86\xcd\xf5\x4d\xc9\x65\xa8\xa0\x30\x44\xfb\x83\x3b\x87\xa8\x00\x1d\x05\xcc\x27\xfb\x01\x8f\xdd\x6c\x6a\x23\x55\xdd\xdb\x3d\x36\xbe\x2b\x2d\xc1\x63\x07\x1f\x04\x61\xb5\x8a\x6b\xdf\xd1\x8f\xa9\x24\x1e\x4f\x78\xc1\xbb\x75\x12\x0f\x5b\x92\xb4\x0e\xf5\xe8\x59\x88\x19\x19\xe7\x2f\x0f\xf3\x34\x4e\xdb\x63\xe3\x70\x52\x50\xa6\x6b\x6a\x95\x62\x64\x41\x10\xa2\x2e\xf0\x1a\x1c\x44\xe7\x84\x7d\xab\xc7\x9e\x69\xe6\x60\x21\xeb\xa5\xa5\xdf\x53\x76\xb6\x95\xca\x9b\x6b\x3e\x69\x8e\x09\xe8\xb3\x1e\x7b\xae\xa9\xf9\xb4\xbc\x93\xcd\x66\x7d\xff\x55\x6c\xd6\x78\xbb\x5a\xaf\xfd\x26\xb8\x2e\xcd\x5c\xb9\x34\xf3\x2b\x76\x3a\x85\xcf\x79\x57\x2b\xcf\xbc\xd9\xdb\x41\xa0\x79\xba\xb2\x2a\xb0\x9f\xf1\xd8\x3e\x29\x6b\xf8\x3f\xee\x05\x1f\xf0\xe4\x5f\x56\x76\x9c\x2b\x4b\xed\xcc\x21\x58\x27\x4c\x78\x02\xc1\x02\xaa\xbc\xaa\x7b\x6a\xfd\x1e\x8c\x53\x4b\xe2\xd5\x3c\x04\x6e\xc2\xb0\xed\xdd\x5c\xe8\xcc\x48\x6b\x61\x1a\x69\xcf\x54\x8e\x51\x7e\xc7\x66\xd7\xef\x71\xe8\xc3\xfb\x3d\x9d\x54\xf7\x71\x2f\xf8\x0e\x8f\x52\xea\x02\x43\x81\xa6\x9d\x2a\x4f\xa1\x28\x94\x3b\xc2\xa7\x98\x51\xf8\xa4\xc7\x6e\xd5\x0c\xb1\xe1\x74\xfd\x1f\xf4\x82\x77\x7a\x43\x5e\x0c\x4b\xae\x6a\xb1\xd1\xa8\x7c\x27\xe6\xd7\xb0\xe6\xc4\x53\xaf\xb8\xa6\xc4\x75\x04\x6e\x5b\xb9\x52\x12\xfc\xb3\x1e\xbb\x45\x77\x71\x31\x2d\x20\xa5\x95\xff\x61\x2f\xf8\x01\x6f\xe0\xb1\xea\xf7\xe2\xc9\x21\xbd\x8e\xa9\x90\xdd\xcd\x44\x94\xf5\xad\xfe\xeb\x5b\x97\xd3\xbb\x2b\x58\x80\x27\xbd\x57\xec\xae\x20\x38\xea\xcf\xd4\x1d\x81\x9f\x2b\x75\x01\xf1\xca\x55\x5d\x81\x7c\xca\xd8\x2f\x1f\xdc\x6b\x5e\xa3\xa5\x2c\x2f\xfd\xf7\x1d\x0c\x8e\x0d\x3c\xb5\xe0\xa0\x48\xc3\xad\x31\x1d\xcb\x3c\x6c\xb5\xe2\x26\xa7\x5c\xba\x4a\x20\xfd\xcd\x03\xec\x9b\x3d\x76\xa8\x9b\x67\x65\xd6\xcc\x12\xbf\x17\xac\x91\x43\x3c\xfc\xe6\xa3\x17\x16\x96\xc6\xf9\xc5\x93\x4b\x20\x54\x2f\x2f\x5c\x58\x52\xc9\xd7\x54\x85\xa0\xf5\x85\x14\xa8\x60\xb0\x77\x62\x50\xc7\x5d\x88\x78\xe3\xd8\x71\x61\x61\xc9\xd9\x1c\x8f\x8f\xb0\x83\x22\x8d\x60\x64\xdf\xa9\x1d\x60\xfe\xb6\x86\x60\xab\xe3\x43\xf4\xfb\x98\x63\x40\x6e\x0f\x34\x07\x60\x64\x2c\x0d\x99\xaa\x1a\x47\x05\x60\x01\x22\xbb\x65\xc2\x24\xa7\xda\xd5\xbe\x05\x84\xbb\xcd\xc6\x51\xe6\x01\x0d\x9a\x9b\x97\x46\x97\x2d\xcb\x68\x7c\xa7\x7c\x78\x19\xf5\x1e\xdc\x2e\x30\x53\xe5\x28\x0e\x7a\x0c\x4a\xa2\xde\x9b\x3a\x6c\x52\x85\x40\x5e\xcc\x2c\x77\xf3\xa9\xa9\xf2\xb1\xc1\xd4\x8f\x41\x2a\x9d\x4f\xba\x6b\x21\x69\x78\x00\xb5\x4c\x8f\x55\x99\xd6\x8c\x4f\xd6\x69\xfa\xf2\x5e\x59\x38\x70\xb6\xd0\x29\xec\x45\xe0\x32\x2c\x1f\xaf\xb1\x7d\xb2\x65\xff\x47\x6a\x7b\xbd\xac\x7a\x65\x9c\x34\xe2\xb4\x2c\xca\xbc\xb1\x98\x96\x2a\x38\x36\xf8\x63\xef\x82\x9a\x20\x52\xfe\xa0\x8a\x47\x6d\xb7\xa1\x11\xc0\x21\x87\xbc\xa0\x71\x13\x67\x04\xe7\x50\xd5\xb1\x5d\x92\x03\xf4\x0d\xc9\x20\x01\x29\xed\x42\x95\xa6\x57\x19\x71\xd0\xf5\x0c\x31\xb1\x31\x5f\x1e\xd4\x43\x9c\xc8\x38\xa1\x88\xea\x63\x53\xf5\x64\x51\x27\x64\xfe\xec\x49\xac\x4e\x39\xc0\x60\x3b\x51\x83\xfd\xbc\x67\xfb\x33\x3b\xea\x63\x42\x7f\xcc\xf2\x57\x65\xa9\xf0\xdf\xeb\x05\x0f\xd0\xdf\xaa\xd3\x85\x63\x42\x46\xf1\x19\xcf\xdd\xeb\xb3\x54\xd8\x92\x5c\x81\x46\x7a\xc9\x73\x13\x67\xa4\x52\x32\x3a\x07\xfd\x6e\x36\x47\xde\x24\xd3\xc1\xd7\xc1\x7d\x50\xc9\xab\x6a\xdf\x11\xb2\x0d\xe7\x7c\xbe\xa7\xc6\x8e\x59\x43\x69\x25\xd9\x26\x51\x64\x33\x98\x24\xdb\x3c\x19\x43\x8c\x4d\x2f\x2e\xd6\x44\x7e\x46\x94\x6b\x59\xe4\x7f\xc9\x0b\x4e\x6d\xf3\xae\x62\x8a\xea\xe0\x43\xf0\x89\x94\x2d\x80\xaf\xb6\xfe\x64\x68\x5a\xe5\xb7\x78\xec\x4d\x4a\x20\x79\x7d\xd0\x59\x91\x7f\xac\x54\x05\x92\xc1\xba\x54\x53\x72\x37\x1a\x27\x0e\x63\x6a\x0a\xee\xe9\x5f\x2c\x44\x1e\xc0\xe6\x08\xee\xe9\x9f\x95\x3b\xa5\x1b\x36\x45\x60\x30\xf4\x9c\xf9\xf9\xe5\x11\x27\xdf\xb4\x71\xc5\x68\x2c\x2c\x2f\x9e\xcd\x22\xf4\x39\xf8\xe1\x91\xe0\x61\xeb\x37\x38\x81\x0e\x5b\x68\x6b\xa7\x59\x0e\xcf\x49\xe2\xa4\x16\x82\x6b\x30\x49\x54\x4c\x44\x9a\x45\xe2\x92\x77\x90\xde\x3a\x93\xf4\xd1\x1a\xfb\x48\x8d\xa9\x57\xfe\x0f\xd5\x82\x6f\xf7\x22\x2b\x8d\x11\x37\x09\x8c\x4c\x4f\xac\x16\x55\xca\x23\x50\xa2\x62\x60\x01\x35\x88\x2e\x5a\x49\x62\x75\xca\xd8\x81\x01\xb7\x33\xd5\xdd\xa4\x53\x88\x7e\x1a\xcd\xac\x43\x97\xb2\x63\x7f\x39\xca\x66\xd8\xd4\xb6\x12\xef\xe0\xac\x62\xcf\x9e\xf4\x8e\xb0\x17\xb8\x08\x0b\xf2\x08\xd6\x21\xaa\xa4\xbe\x2e\xfa\xfe\x41\x7f\xbf\xdc\xde\x4c\x96\x7c\xfe\x90\x92\x1a\x7b\xf3\x90\x7f\x00\xbe\x62\xec\x7b\x0e\xb0\xfa\x9e\x78\x71\x44\x8e\x7c\x70\xca\xff\xd2\xfe\xe0\x57\xf7\xab\x5f\x5c\x76\x16\xae\x61\xb2\xb8\x2b\xd8\x8a\x14\x41\x5f\x42\x2b\x3a\x8d\xc2\x9e\x2e\xe4\xb1\x00\x77\x18\xf0\x96\xc4\x95\x68\x30\x76\x8a\x7c\x02\x1d\x50\xdf\x23\x8d\x23\x83\xf2\x15\x11\xbf\xb2\x10\x49\x0b\x75\x35\x40\x92\xc2\x64\x33\xec\x17\x18\x58\x93\x99\x10\x13\xb8\x57\xad\x70\x14\xb7\x3e\xf0\x6c\xa8\x93\xbf\x61\x0e\x3e\xb9\x78\x53\x51\x61\xc2\x6d\x07\xd6\xc2\xc4\x99\x14\x82\xb7\x28\x04\xbb\x13\x96\xc5\x1c\x3f\xd2\x9a\xbb\x5b\xce\xfc\x4b\x8f\x8c\x53\x6a\x68\xfc\x59\x65\x4c\x43\x83\x21\xaa\x66\x06\x3a\x07\xe3\x4e\xc1\x7e\xd7\xe5\x47\x36\xe6\xee\x06\x36\xde\xaa\x0d\x7f\xab\xea\xc4\x56\xd8\x2c\xf9\x6b\x0b\x8d\xb6\xa3\x73\x49\x93\xa7\xb5\x0a\xb9\xe3\x47\xe2\xb9\xbb\x21\x66\xc9\xaa\x0b\x7f\xa3\x53\x0d\x3a\x91\xe3\x57\xf0\x41\xac\x03\x8f\x8e\xac\xcf\xdd\xbd\x2e\xfa\x85\xf5\x25\xfc\xc4\xb3\x24\x3b\x9a\xb5\xb8\xdd\xd8\x11\xf0\x02\x56\x3b\x00\x35\x6c\x71\xae\x6c\x99\x24\x98\x68\x5f\x47\x08\xb8\xb2\x17\x8a\xa0\x49\x55\x90\xa1\x5e\x68\xe0\x84\xe4\x17\x16\x21\xc7\x7c\x1e\xda\x1f\x05\x92\xc9\x80\xa3\x37\xce\x8c\x81\x2d\xd4\x7c\x4d\xca\x8b\xb8\xad\x78\xd2\x09\xbd\x29\x23\x3a\x3d\x51\xdc\x6a\xd9\xa1\xc5\x7f\x7d\x60\x68\x62\xfd\xd3\x0b\x8e\xeb\xdf\x2f\x1f\x08\x3e\xe4\xb9\xa6\xf4\x78\x35\x17\x7c\x61\x2d\x4c\x53\xa1\x52\xcd\x34\x86\x3e\x45\x12\xa1\x82\xbe\xc0\x07\x0f\xd9\x27\x29\x63\x4d\x6c\xe6\x71\x29\x78\x96\x36\xb7\xfd\xfa\xaa\x1d\xbd\xdf\xb1\x9f\xcd\xb1\x91\xa4\x97\xfa\x33\x8a\x11\x7d\xa1\x71\xc4\x3e\xbd\xa0\x9c\xe4\x93\x5e\x4a\x8c\x83\xc3\x2e\xbd\xc9\x63\x87\x54\xf6\x03\x7f\x23\x58\x33\x9f\xda\x9e\xcd\x98\x3b\x60\xd4\x8c\x69\x4c\xde\x2c\xf8\x15\xe6\xf0\xb0\x32\x23\x80\xf2\x44\xbd\x54\xe9\xbe\xe2\x94\x9c\xb3\x00\xac\xbc\x92\xb7\xeb\x02\x63\xd8\xcb\x97\xbf\xfc\x6c\xe1\x9f\x0e\xee\x18\x36\x80\xcd\x2c\x4f\xa2\xcd\x38\x22\x27\x7c\x3e\x2a\x0b\x8f\xed\x10\x8b\xfa\x13\x1e\xdb\xbf\xb9\x19\x47\x85\xff\x21\x2f\xf8\x2e\xcf\xa9\x93\xfc\xad\xa0\x4e\x0e\x95\x9a\x44\xb3\x05\x1f\x85\xcf\xc6\xf8\x29\x24\x60\xf0\x8b\x20\xb3\x56\x29\x0e\x08\xf6\xac\xee\x33\x66\x9a\xef\xa5\x9a\x23\x06\x72\x25\xe5\x7d\x60\xcc\xb3\x72\x8d\x17\x71\xa7\x97\x94\x61\x2a\xb2\x5e\x91\xf4\x77\x8a\xa1\xfd\xdf\xc0\xd7\xf3\xbd\x35\xf6\xdc\x61\x0e\x8a\x59\xb4\xb8\xe4\xbf\xa9\x16\x7c\xc0\x5b\x5c\xd2\x3e\x33\xf6\x3d\xde\x02\xb4\xf7\x32\xd7\x79\x92\x04\x1f\xed\x26\xbd\x3c\x4c\xc6\x38\x7c\x4d\x4c\xb3\x8b\x1f\x8f\x7e\x13\x05\x84\xf7\x2d\x2e\xcd\xf1\xf9\x94\x5b\xf5\x4b\x01\x0a\xf5\x88\x2a\xb7\xb0\xe4\xc1\xcf\x67\xca\xb1\x07\x83\x94\x4a\xdb\x59\x5f\x19\xa8\x9d\x93\x76\x3f\x5b\x64\xb5\xb8\xeb\x2f\x04\xc7\xe2\x2e\x21\x59\x59\xcd\x8c\x82\x1b\x4f\x96\x83\xab\xce\x18\xe4\x28\x6e\xa7\x4e\xa3\xf6\x0c\xfd\x82\xc7\xbe\x76\xc8\x0c\x21\xbe\xbe\xff\x61\x2f\xf8\x06\xfc\x53\x9b\x53\x24\xb9\xcd\x25\xe5\x30\x19\x90\x34\xaa\xb3\x4e\x6a\xbe\x1f\xc8\xae\xd3\xeb\x55\xd6\x20\x4e\xfa\xeb\x83\xaf\x3d\xab\x2f\x30\x8a\xf6\xee\x53\x6c\x86\xdd\xb5\x49\x86\xd5\xf8\x47\x82\xe7\x3d\x68\x6e\xa3\x1d\xbe\xf8\xd1\x91\xa1\x01\x3f\xf3\xaf\xef\xe5\x42\xee\x5e\x87\xda\x7e\xf3\x48\xf0\x72\xfd\xc6\x71\x4f\x4c\x39\x3c\xe7\xf0\x62\x99\x9c\x0d\x61\xab\x2b\x81\x06\x76\xb1\x3c\x6b\xab\x71\x1a\xd1\x2b\x6b\x51\x2f\x79\xac\x10\xcd\x5c\x94\x67\x61\x36\x0e\x17\x6b\x61\x0e\x9e\x97\xce\x8c\xbc\xb1\xc6\xb6\x2c\xa2\x97\x04\xaf\x7e\x1a\x49\xdd\xab\x99\xd5\x45\x7f\x29\x58\xb0\xf9\x0a\x7c\x43\x91\x6d\xca\x1e\x8d\x73\xb2\x8c\xdc\x24\x9f\x6f\x36\x61\xd4\xb0\x92\x72\x26\xee\x17\x7d\x17\x57\xc4\x8c\xda\xff\x9a\x80\x2d\xcb\x1f\x5c\xcf\x01\x95\xfa\xfb\x7d\x43\xcf\xe7\x85\x30\x4e\x4b\xff\x8b\xfb\x82\x95\x0b\xa0\xbb\x8c\x48\x54\x83\xe7\x1c\x71\x0d\xd0\x3b\x1a\x34\x95\xc8\xc5\x04\x98\x85\x2b\x50\x61\xea\xdd\x8c\x2e\x7b\x0d\x6c\x56\x66\x89\xc8\x55\xfe\x12\xa8\xab\x71\xc9\x1b\x59\x17\xfd\x4b\xde\x01\xfc\xd8\x59\x9f\x2f\x8e\xb0\xf7\x79\x8c\xde\xf8\xdf\xeb\x05\x6f\xf5\xb4\x14\x83\xea\x07\x8c\x78\xd1\x41\x60\x31\x6e\x90\x6e\x16\x15\xaa\xe5\xc1\x76\xa1\x58\x83\x3f\x08\x90\xbe\x82\xd0\xc4\x60\x6e\xb2\x65\x39\xa4\x5e\x22\xc6\xf9\x12\x04\x2b\x98\x27\x30\xc3\x67\xb3\x53\x5b\xa2\xd9\x2b\x5d\x19\xf3\x24\x93\x23\xf0\x5f\x12\x4c\xba\x9d\xc3\xee\x48\x46\x07\x8f\xa7\x95\xd7\x9c\xa4\x10\xbb\x96\x1f\xf1\xd8\xe1\x32\xee\x88\xf9\x28\x12\x91\xff\xde\xab\xb0\xa7\x44\x17\x54\x35\x55\x51\x19\xdd\x61\x94\x40\x6e\xa6\x0c\xa2\x3f\x21\xed\x0d\x29\x87\x31\x89\x5a\x1e\x97\xa5\x40\x4a\xac\x47\x8e\x5f\x14\x0d\x76\x4a\xd1\x86\xbb\x83\x09\x33\x5a\xe4\x59\x9b\x59\x9e\x8b\xa2\x9b\xa5\xb6\xcd\x5a\x4f\x87\x33\xec\xcf\xdf\xe4\xe8\x1a\x5c\xed\xe1\x62\xda\x96\x04\xf5\x7c\x2f\x11\xfe\x13\x37\x05\x7f\xe2\x59\x0f\xaa\x63\xcb\x7b\x09\x78\xf4\x40\x68\x9d\x8e\xb3\x2a\x08\x93\x3c\xb4\x34\x20\x40\x3a\xb4\x21\x9d\x30\x9b\xc2\xe6\xba\x48\x23\xe5\xd8\x5c\x34\xf8\x62\xda\xcc\x3a\x28\x5e\x90\x6d\x06\x92\x66\x81\x2b\x8a\x90\xc3\x44\x7b\x14\x08\x22\x50\x23\xa8\x4f\x80\xcf\x4d\x79\x9e\xf5\xac\x5b\x46\x55\x1e\x16\x00\x9f\xaa\x03\x02\x11\xac\xa4\x94\xab\xd9\xe6\xd6\xd0\x80\xd4\xba\x37\xce\x87\x6f\x60\x5f\x62\x6c\x9f\x6c\xc8\xff\x4d\x16\xfc\x22\xbb\x2f\x2b\xb4\xbd\x0f\x21\x01\x5f\xa7\xdd\x3d\x23\x74\xf7\x34\x32\x8a\x72\x6b\x96\x9f\x0f\xc3\xa6\x9e\x39\x7e\xd7\xb1\x06\x3f\x9b\xd1\x01\x31\xce\xac\x91\xd8\x88\x43\x8c\x30\xd3\x76\xac\x40\xd6\x12\x38\xec\x3a\xe1\x73\x5b\xbc\xb9\xaa\x75\x8e\x4f\x35\xb8\xbc\xab\x75\xbc\x9b\xca\xa7\xb2\xa0\xbd\x62\x01\x42\xdb\x1d\xbc\x61\xa5\xe5\xa1\x91\x07\x88\x11\x6c\xd6\xe2\x92\xe2\x06\x40\x13\xa1\xfc\xe7\x31\x15\x2c\x55\xd3\x60\xd3\x78\x02\x57\xe6\x56\x78\x24\xd0\x2d\x2c\x57\xda\x35\xb9\x33\xc9\x0f\x9d\xdc\x66\x50\x11\x5b\xed\x21\x3b\xcc\xad\x4e\x6a\x05\x29\x3a\x28\x50\x4b\xe8\x18\xac\xb9\xa3\xb9\xbb\x26\x61\x47\xac\x95\x65\x57\x12\x0c\x59\xc5\xdc\xec\xec\x8c\x7e\x58\x34\xd8\x3d\x19\xae\x7c\x81\x9e\x9e\xae\x5f\x9b\x36\x22\x0f\xdd\x7c\xa4\xa0\x33\x11\xca\xea\x1e\x5c\x15\xad\x8c\x72\x64\x0d\x6c\x23\x95\x68\x6c\x8d\x36\x8c\x13\xb7\x67\x7d\x81\x7b\x96\x22\x41\x48\x79\xb8\x1a\x12\x74\x85\xab\x42\x1c\x68\x83\xe1\x76\xa4\x50\x96\xa0\x9b\x8b\x66\x5c\x88\xc0\x44\xbc\x85\xce\x9e\x94\x9b\x5f\xa9\x8b\x30\xb3\x13\xb2\xa2\x51\x56\x0e\xee\x57\x3e\x6a\x92\xdd\xac\x86\x79\xa3\x99\x75\x82\x31\x80\x82\xde\x8c\x93\xa8\x19\xe6\x51\x30\xbe\x5d\x43\x98\xfd\xc7\x38\xc9\x13\x6c\x8b\xfa\x10\xa3\x10\x54\x03\x77\x34\x64\x13\x50\x3d\xee\x1e\x5d\x4c\xdb\x54\xf8\x91\x3b\x8e\x20\x63\x1f\x76\xbb\x22\xcc\xe5\xf9\x41\xb5\x85\x09\x0d\x96\xf4\xe1\xe4\xd9\x65\xaa\x1b\x1d\x4f\x50\x7f\x8b\xfb\x59\x75\x02\xde\x63\x1e\x4f\xd2\xda\x93\x17\x63\xa5\x77\xa6\x09\xec\x27\xcc\xf4\x4b\x5e\xc2\x83\x3b\x82\x31\x54\xea\x09\x1b\x61\x66\xd8\x1e\x81\x4f\x9c\x5c\x27\xe6\x84\x6f\x86\x7d\x3c\xa3\x98\x3f\x8f\x30\x4e\xe4\xf2\x8d\x13\x81\xc4\x1c\x5b\x6a\x10\xe8\xb3\x23\xe9\x2f\x59\x0d\x60\xaf\xc3\x42\xad\x89\x90\x50\x52\xd0\x0a\x50\x66\x50\x65\x83\x4f\x3b\xd5\x9b\x11\x12\xb1\xbc\xe2\x66\xca\xcc\xb4\x04\x3b\xb4\xd7\x6a\xc5\x5b\x92\x63\xeb\x64\x1b\x46\xb9\x24\x57\x04\xe6\x72\x4c\x91\x0b\x3d\xc5\xb2\x05\xe7\x3a\x3a\xc5\xf6\xc9\x96\xfc\x97\xb0\x17\x6f\xab\xce\x73\xef\xa8\xfb\x2e\x5c\x58\xaa\x1e\x08\xf6\x13\x07\xd8\x6d\xbb\xdd\x6a\x17\x1e\x58\xf6\xbf\xf3\x40\x70\xc6\xfc\xb4\xac\x60\x70\x34\xf2\x30\x2d\x80\xe6\x24\x61\x5f\xe4\x06\x74\xbb\x7a\x8f\x18\x7a\x54\xc9\x24\xb2\x9f\x7d\xa6\xc6\xf6\xcb\x59\x2b\xfc\x8f\xd7\x82\xbf\xf4\xe4\x1a\x10\x2a\x22\xb7\x33\x8d\x17\x03\x19\x35\x65\x77\x9a\x22\x2f\x51\x95\x4b\x18\x37\xa4\xf2\x51\xbe\xeb\x50\x83\x31\xa3\x69\xc5\xd8\x04\x05\x7b\x53\x55\x65\x52\x2c\x03\x3b\xeb\xc6\x48\x3b\x0b\x01\x2b\x6b\x27\x04\x07\x6d\x6c\x16\x46\xab\x61\x12\xa6\x4d\x91\xdb\x86\xd4\x56\x2f\x69\xc5\x49\x82\x2b\x1c\x17\x6a\xf0\xe3\x72\xaf\x24\xa2\x55\x56\x84\xd1\xed\xc4\xeb\x3d\x7a\xc0\xff\x61\xcd\x61\xd4\x7f\xab\x16\xfc\xbb\xda\xb2\xfe\x3d\xcc\x52\x4d\xcc\xbb\x0a\x78\x57\x24\x0e\x27\xd5\x32\xcc\xc0\xda\xce\xce\xce\x34\x50\x55\x26\xab\x82\xee\x6b\x27\x4a\x6d\x04\x95\x1f\x4a\xfa\x8c\x3e\x2f\x44\x94\x97\xcf\x2e\xea\x1c\x15\x3c\x4c\x20\x97\x1a\x11\x7b\xf5\xca\x68\xff\x44\x8a\x73\x08\x11\xe4\x16\xba\x53\x70\x1f\xdc\xe6\x74\xa8\x90\x48\xa8\xa4\x55\xee\xc5\x3c\x5e\xa9\xb9\x30\x29\xfb\x35\x11\x27\xb8\x64\xad\xb9\xd4\xd4\xc7\x1c\x5a\xfd\x11\x8d\xc7\x39\x7e\x7f\xe2\xb1\xb3\x57\x9c\x6d\x68\x68\x06\x14\xff\x71\x2f\x78\xe5\xd0\x37\x2a\xfd\x81\x0a\x47\x07\xed\xb1\x95\xcd\x49\x3b\xfc\x80\x26\x42\xb6\x14\x01\x6f\x65\x55\xe1\x1e\xb7\xc9\x1d\xe1\x5c\x7d\x36\xd2\xcb\x13\xf7\xd9\x1f\xdc\xc0\x82\xe1\xf0\x18\x98\xbc\x72\x19\x7c\x4c\xfc\xcf\xde\x10\x7c\x53\xe5\x99\x11\x0a\x23\x51\x86\x71\x52\xe8\x43\xa3\x80\x3a\x2a\xfe\x29\x26\x21\xa6\x51\x11\x48\xc9\xb6\x7f\xc9\xbb\x31\x17\x10\xfd\x0d\x3e\x64\x97\xbc\xfd\x71\x27\x6c\x8b\x4b\xde\x41\xf8\xb7\x12\xcb\xfc\x71\xc6\x72\x52\x22\xbc\x36\x78\x04\x21\x0a\xb4\xea\xe9\xe4\xd9\xe5\xd7\x3c\x30\x7f\xcf\xa9\x07\x48\x27\x63\xb2\x8b\xc6\x64\xf0\xdc\x3e\x40\x6e\xd0\xe9\xc9\x9e\xa8\x65\x76\x83\xae\x6c\xf1\xa4\x7f\x32\xb8\x53\xcf\xc7\x91\x82\x9b\x2c\xea\xa4\x27\x3e\x12\x65\xcd\x75\x91\xcf\x4d\x4c\xdc\xad\x3f\x7b\x4d\x1c\xbd\xf4\x88\x53\xe9\xeb\x19\x0e\xd5\x7f\x5d\x10\x49\xea\x06\x3f\xb4\xd3\x06\x75\x1c\xe0\xc8\x53\x00\x64\xb8\xcc\xa0\x75\x93\x16\x76\x02\x6a\x76\x9c\xa9\x8e\x33\x35\xbd\x7e\x23\xf8\xc7\x8b\xf8\xa7\xed\x33\xa2\xc6\x06\xa5\x9c\x6e\xff\x58\x8d\x1d\x84\xf5\x12\x91\xff\xfe\x5a\xf0\xbd\xb5\x65\x6d\x8c\xb4\x01\x3d\xcc\x18\xd6\x20\x13\x40\x01\x14\xb9\x2c\x30\xd2\xbf\xd7\xe5\xdd\x3c\x5b\x05\x56\x33\x2e\xe3\x30\x01\x57\xd8\xb0\x50\x29\xc4\xd0\xd2\x85\xf0\x5e\x14\xf0\x46\xdf\x2d\xc9\xcf\x2a\xa9\x16\x8b\x5e\xb3\x29\x8a\xa2\xd5\x4b\x24\x47\x52\x08\x5b\x7f\x62\x10\x64\x9c\x49\x15\x34\x84\x71\x72\x40\x20\x67\x18\x9e\x64\x85\x28\xc8\x23\xa0\x14\x9d\x6e\x96\x87\x79\x9c\xf4\x1b\x7c\xb1\x50\x06\x21\xcc\xbf\x2b\xab\x4d\xb3\x81\x5e\x29\xb0\x6d\x47\xd5\x92\xb0\xfd\x50\xa3\xdf\x64\x13\xbb\xfa\xa5\x3a\x27\x4d\x04\x93\x27\xe9\x80\x19\x13\xa7\xbd\x3e\xea\xb8\x35\xa5\xb0\x8b\x69\x1d\xfb\xec\x70\x12\x16\x25\x82\x4f\x25\x97\xdf\xe2\xf1\x9d\x5b\x04\xac\x1d\x9b\xe2\x5a\x4d\x3f\xc8\xf0\x50\xfb\x67\x82\x13\x97\xb9\x2d\xe4\x77\x71\x2a\x05\x01\xdc\x18\xce\x04\x7e\xba\xc6\x1c\x2a\xe1\xff\x68\x4d\x99\x18\xde\x55\xbb\xe0\x22\x19\xc5\x1d\xe2\x5f\xdc\xa6\x56\x05\x38\xf8\xeb\x65\x37\x51\x91\x8e\x94\x61\x2a\x8a\x44\x18\x39\xb9\x95\x35\x58\xa7\x24\x14\x7d\x51\xaa\x2a\x3b\x19\x44\x85\x90\xf8\xaa\xb0\xec\xc0\x64\x9b\x34\x29\xc6\x1c\xa4\xd7\x4a\x8d\x0d\x7e\x0f\x4c\x6f\x56\x38\x39\x9c\x01\xe8\xbd\xa7\x61\xad\xdb\x61\xbe\x2a\xe9\x42\x53\xf2\x1e\x4d\x2b\x2d\x1f\x5e\x72\xc0\x77\xb7\x85\x14\x7e\x30\x97\x70\xc9\x8f\x42\xc2\x8d\x05\xd7\x19\xe5\x2b\x37\xb1\xc6\x90\xa5\x5f\x5c\x5e\x58\x5e\x1c\x88\x4c\x47\xf5\xe8\x8f\xdf\x14\xfc\xa8\xb7\x43\x81\x8a\xc6\x14\x4a\x02\x5c\x44\x83\xfe\xbe\x5c\xbb\x94\xfb\xd5\x95\xd8\xa3\x2e\x79\x37\xa2\x29\x64\x29\xcb\xcb\x30\xb9\xe4\x8d\xc4\xaf\x4b\x2f\x79\x23\x49\xaf\xe2\xbd\x75\x03\x7b\x90\xdd\xd2\x5c\x0b\xbb\xf3\xbd\x72\xed\xa4\x72\x30\xf1\xe7\x83\x19\xb5\x59\x55\xf3\x31\x74\x4a\x17\xe1\x0b\xf7\xcd\x2f\xf1\xb0\x27\x25\x87\x92\xbc\x0c\x9c\xad\xfa\xab\x1e\xbb\x09\x0e\x5b\x58\x66\x39\x70\x6c\x3f\xeb\x05\x3f\xee\x61\x66\x38\xaa\x6d\x51\xbd\xc7\x90\x58\xc9\x35\x39\x9f\x54\x70\x5b\x24\xaf\x14\x17\xcd\x22\x86\x4c\x5f\xad\xb0\x29\x2a\x36\x1c\xf4\x0e\xc7\xba\x63\x5d\xe6\x6e\x32\x57\x75\x61\x2e\x5e\x3a\x77\x37\x99\x9a\xd0\x90\xac\x04\x36\x8d\x7d\x64\x62\xbf\x52\xda\x67\xee\x65\x75\x18\xd9\xca\xf3\xa2\xe5\x77\xf6\x10\xaa\xb3\xac\x4a\x53\xa8\xce\x71\x98\x38\x7c\x0a\x8d\x61\x77\xa9\x8f\xe0\x52\xa8\x67\xc5\x9d\x5e\xf6\x7e\x8f\x39\xcb\xea\xbf\xd3\x0b\xde\xe2\xe1\xf7\x17\xf0\x7b\x7c\x81\x52\x02\xfe\xed\xc2\x48\x2e\x2e\x01\x9d\xef\xbe\x26\x8c\xa2\x7c\x0e\x17\xd6\xf2\x3a\x8b\x0b\x82\x20\x02\x77\x31\x05\x4f\x3b\x5a\xf6\xbb\x94\x0f\xfd\xc2\xc2\x12\xa9\x69\xee\x3a\x86\x58\x4e\x33\xd3\xc7\x26\xc7\x9c\x29\x3a\xcf\x9e\xa9\x76\xd4\xb2\x00\x70\x29\xff\x44\x30\x35\x7c\x3f\x51\x81\x5d\x77\xd3\x4f\xd4\xb4\x05\xee\x89\x5a\xf0\xee\x5a\xd5\x02\x47\x37\xb6\x0d\x39\xd2\xcf\x7a\x1a\xb4\x91\xac\x73\x17\xe2\xee\x1c\x3f\xa5\x20\x76\x43\x03\xd1\x64\x57\x65\xe3\xfb\xee\x6a\xab\x53\x79\x83\xaf\x91\xc5\xee\x72\x79\x1b\xf2\x68\x99\x20\x5a\x71\x1b\x9c\x0e\xd7\x72\x24\x4f\xbe\x3f\x16\xbc\x80\x36\x08\x4e\xbb\x09\x49\x1f\x88\x45\x4f\xd9\x33\xdc\x33\xe6\x3f\x1c\x9c\x53\xc7\x55\x1d\x29\x38\x9c\x30\x83\xbd\x02\x21\x82\x69\x17\x2b\x51\xd9\x15\x31\x8f\xd0\x4e\x3a\xc2\x47\xcb\x66\xd7\xdd\x2d\xb3\x68\x2a\xaf\xab\x7b\xec\xb9\xce\x7e\x7e\x40\xdb\xc8\x5d\x32\xfe\x31\x8f\x1d\xc4\xf3\x5c\xf8\x1f\xf4\x82\x6f\x1f\x76\x0a\xf8\x03\x71\x51\x7e\x35\x8e\xc2\xb6\x76\xe4\x75\xcb\xc8\xf5\x9a\xe0\x65\x57\x67\xc4\x1a\x74\x07\x70\x79\x85\x4f\xd4\xd8\x91\x21\xf4\xe8\x81\xac\x19\x26\x95\xf8\x41\xff\x3b\x6a\x41\x31\xec\x85\x11\x6f\x44\x9a\xf5\xda\x6b\x8e\x65\xb8\xcc\xb8\xe4\x14\xe5\x39\x43\x73\x2e\x69\x90\x34\xaa\x98\x4a\x96\x03\xfc\x29\x4a\xe4\x21\xd1\x5d\x70\x86\x73\xc5\xb6\xb7\x7a\xff\x50\x00\xab\x7e\xec\x90\x03\x36\xba\x3d\xba\x8b\xdc\x60\xfe\x9b\x0e\x05\xc7\x06\x9e\xba\x20\x2f\x3a\x2d\xbb\x0a\x3d\x01\x84\x81\x42\xca\x78\xa5\xe8\xb8\xce\x76\xff\xd7\x81\xeb\xe1\x7c\x57\x1b\xce\xd7\x52\x20\x79\x8f\x04\x5f\xf3\xc0\xf0\xb9\xb7\x4f\xe9\x9d\xec\x28\x9b\xb9\x3c\xd4\x06\x8c\xcb\xbf\x1e\xc6\x74\xe5\x61\x4c\xab\x56\x14\xd3\x83\xdb\x6b\x79\x77\x30\xb2\xca\x95\x85\x10\xa6\xaf\xd1\x11\x4c\xa8\x09\x35\x70\x0c\xed\xdd\xa3\x2d\x4e\xfa\xf7\x6c\x13\x6d\xb1\x37\x70\x06\xd9\x0b\xc6\xfe\xc7\x01\xf6\x8a\xab\x4b\xed\xe0\xa6\x4c\x5e\xee\xad\xea\x9d\xed\xbf\xfb\x40\xf0\xca\xed\x5f\x3b\xf4\x80\xb4\x4d\xe0\xc3\xdf\x0c\x13\x90\xa0\x4c\x49\xc9\x6e\xba\x15\x55\x34\xd5\x1f\xdd\xcf\x3e\x35\x22\x97\x08\xf4\x5d\x1f\x1b\x61\xeb\xd7\x32\x7b\xc5\xb6\x63\x40\x5d\x5a\xf0\x73\x35\xea\xbe\x1d\xad\x31\x90\x10\x5e\x51\x2d\x68\x93\x87\x7c\x65\x02\xbf\x5a\xb1\xc7\x4a\x30\x4d\x14\xbd\x00\x96\x15\xeb\x50\x0c\xad\xb6\x9b\xc7\x9d\x30\xef\x5b\xe8\x52\x90\x68\x59\x07\xef\xd3\x67\x2b\xba\xb5\x32\x4c\x5f\x1f\xaa\x2b\x4a\x91\xd6\xe9\xdd\x1b\x1a\xda\xe1\x21\xad\x85\x69\xbf\x04\x93\xb4\xc5\x87\xec\xde\x03\xf6\xa7\x1e\xdb\x0f\x6b\xef\x7f\xd9\x63\xaf\x7d\x7a\xd6\x4f\x36\x17\x6c\xe0\x8e\xbb\xdc\xc5\x93\x1f\xb9\x53\x01\x8c\x65\x2e\xca\x5e\x9e\x02\x6f\xb9\x12\xf6\xca\x4c\x96\x8b\xd3\xf6\xc4\xc6\xd4\x0a\x24\xc6\x34\x03\xfe\xb5\x7d\x6c\xd6\xa2\xd7\x61\x44\x90\xb6\xb9\x68\xc7\xe0\x98\x8d\x20\xe1\x0d\xf2\x5f\x32\x5c\xcf\x7b\xf6\x05\x2f\xae\x3e\x24\x9f\xfa\xd0\xf0\x31\x72\x29\xa8\x54\x23\x11\xed\xb0\xa9\xe8\xc1\x25\xef\xb0\x66\x65\x86\x45\x4c\x7c\x6a\x84\x7d\x23\xf1\x33\x77\x05\xdf\xb0\x22\xff\x58\x19\x6e\xa6\x20\x64\x37\xe5\xb6\x62\x93\xc9\x73\xcc\x34\xe2\xdf\x13\x1c\x5d\xd1\xbf\x9c\xba\xe0\xc9\x9e\x2a\x6c\xb1\x7d\xdd\xb0\x5c\xf3\x5f\x1d\xbc\x6c\x45\xfe\xb1\x42\x7e\x73\xda\xd8\x71\xf1\xfc\x03\x88\x46\x8a\xc6\x5c\x25\x1f\x2b\x94\xd4\x30\xed\x6b\x2b\x21\x6c\x70\xc0\xca\xc5\x06\x2b\x3e\x93\x18\xf5\xf3\x09\x0d\x22\xfe\x83\xde\x20\x02\xac\x1d\xcb\x63\xd0\xec\x42\x4c\xe2\x0d\x86\x51\xb1\xba\x96\x65\xeb\x9a\xdd\x95\x8d\x2a\x53\xfe\xf0\xb0\xe3\x06\x5f\x91\xb5\xae\xd8\x11\x5b\x94\x38\x1c\xc3\x76\x50\xb5\x35\x3a\x55\x3f\x76\xf4\xe8\xcc\x51\x2b\xc8\x6b\xcc\x15\x32\x7e\x8a\xb1\xbb\xed\x8d\x65\x76\x61\x63\x63\x5a\x1e\x89\xe9\xc6\x7d\x59\x1e\xbf\x5e\xf2\xc8\xc9\x52\x16\xcd\x53\x01\x6d\x30\xf8\x1f\x87\x83\x57\xed\x58\xa2\x62\x69\x1c\xb4\x19\x84\x7c\x4d\x7f\x0f\x8a\xfb\x50\xd7\xd0\xb8\xe4\x3d\x93\x3e\x20\x48\x91\xe2\x92\xf7\xcc\x48\x14\x72\xc5\xcd\x13\xa6\xd5\x92\x2e\x9f\xf9\xbb\x87\xd8\x87\x3d\xf6\x0c\xaa\xe1\x8c\x28\xf3\xb8\x59\xf8\x8f\x7b\xc1\x19\xf7\x91\xda\x65\xa0\xee\x94\xd2\x0b\x29\x85\x55\x92\x1f\x2a\xa5\x6c\x55\x98\x6c\xc7\x74\xd2\xe6\xb3\x5e\xc2\x5e\xcc\x8e\x6f\xcb\x67\x0d\x9b\x5e\xec\x03\xce\x15\xbb\xe4\xb1\xea\x80\xfd\x6f\xd1\x9b\xeb\x75\x95\x57\xa0\x78\xa4\xf9\x34\xca\xcc\x5c\xbd\x85\xb8\xbf\xa8\x20\x5d\xda\xb0\xae\x83\x83\x0e\x8c\xba\x10\x22\x55\x9a\x00\x67\x68\xd6\x5e\x79\x3f\x00\x04\x38\x73\xef\xff\x73\xdd\xb9\x37\x54\x5e\x99\x88\x7a\x78\x7c\xb5\x1d\xb4\x14\xac\xbb\x74\xf3\x4f\x3d\x76\x13\x28\xc5\xe5\x3b\x00\x10\xfa\x9d\xab\xf0\x70\x7b\x9f\xe7\xd4\xe5\x6c\x15\xf0\x71\x43\xbb\xe3\xd0\x03\x80\xfc\x49\x54\x51\x36\xcb\x21\x8f\x5b\x9b\xc9\x1e\x89\x3c\xf9\x64\x7d\x86\xbc\x1c\x59\xab\x14\x55\x65\x35\x4c\x99\x5c\x79\xb8\x46\xa3\x06\xdb\x62\xbe\x02\x2c\xba\x17\x70\xad\xc0\x22\xb8\x4a\xc9\xc1\x82\x33\x83\x2f\xd5\x28\x20\x94\x37\x17\x4d\xb9\x81\xda\xe6\xad\xce\x40\x30\x74\xb3\x5b\x53\xfd\xff\x78\xcc\x3a\x7b\xfe\x7f\xf3\x82\xb7\x79\xe6\xb7\x6a\x85\xa2\x7b\xac\x17\x3a\x4f\x94\xc9\x5d\xe5\x4c\x01\xdd\xb2\x92\xbf\x00\x6d\xc7\x38\x29\x0d\xd5\xad\xab\x14\x6d\x59\x8e\x2e\x97\x4a\xaf\xae\xea\x07\x0f\x26\x40\xb9\x35\x27\xf3\x65\xec\x1c\x3b\x73\x59\x27\x73\x9b\x55\x5d\x50\xed\xb0\xef\x39\xbc\xc7\x8c\x1d\x20\x44\xff\xd7\x43\xc1\xd7\xe9\x5f\x6e\x50\x19\x3c\x56\xe8\xa5\x8d\xa1\x32\xf3\xa7\x0e\x5e\x97\x99\xaf\x56\x66\x7e\x9d\x92\x99\xd7\x82\x00\x32\xe8\xb9\xab\xa0\xa6\x8a\x96\x61\xef\xe2\xf3\xf6\x0b\x7f\x5d\x7c\xbe\x0a\xf1\xf9\x17\x6d\x14\x90\x4f\x79\x57\x27\x40\xff\xd3\x6d\x04\xe8\xa7\x0b\xfe\x63\xef\x82\x3a\x89\xe6\xce\xa6\xaa\x48\xe7\x9a\x8c\xb8\xb0\x89\xb0\xf1\x18\xfb\x56\xcf\xb6\xff\xed\x05\x21\xcf\x7f\xd0\x3f\xac\xd3\xe4\x07\x2f\xd5\xcf\xe5\x5e\xa5\xfa\xe5\x01\x81\x47\x60\xa2\xea\xc8\x12\x88\xbb\xc6\x11\xc3\x1a\x3d\xf9\xaa\xa6\xa4\xbf\xf0\x6c\x0a\xb9\xcb\x5d\xeb\xff\x1b\xcf\xee\xc6\x87\x3c\x93\x20\x66\x33\x0f\xbb\x5d\x91\xf3\x30\xcf\x7a\x69\x84\xe0\x89\xd8\x1b\x60\xe0\xc9\x98\x51\xa0\x37\x78\xb3\xe4\x9d\x30\x2f\xd6\xc2\x84\x5c\xc2\x31\x0d\x47\x1a\x41\xd4\x68\x83\xf3\x97\x63\x6d\x2a\xe5\x20\x46\xc0\x23\x6a\x9c\x64\xfd\x55\x3e\x30\x48\xa8\xdb\xa7\x38\x68\x0b\x55\x01\xae\xfd\x6e\xd8\x5c\x0f\x01\x5c\xa1\x55\x45\x20\xf9\xe8\xcd\xec\x25\x36\x75\x30\xae\x6d\x96\x9c\x69\x1e\x2e\xc7\xed\x34\x4e\xdb\xe4\x5e\x09\x41\xd0\xff\xfd\x99\xc1\xa7\x3c\x4c\x16\x64\x29\xa3\x87\x20\x03\xdb\xfe\x8c\x92\x25\x40\x03\x5f\x83\x83\x56\x1d\x55\xec\xf8\x52\x8e\xfe\x22\x22\x51\x52\x8c\xa5\x01\x83\xd7\x69\x51\x20\x97\x3b\x4a\xe2\x56\x8a\xe2\x48\xe4\x31\x31\x03\x56\xe6\x7c\x48\x81\xa1\xe9\x46\x27\x8b\xd0\xd6\xb2\xda\x97\x9c\x4d\x2e\x2f\xb1\x83\xd4\x31\xe7\x1a\xfb\xbe\x67\xb0\xf7\xef\x67\x07\x7a\xd0\x15\xff\xf1\xfd\xc1\xaf\xed\x23\x27\x68\xea\x9d\x09\x77\xd7\x61\xc1\x50\x18\xf3\x6d\x6c\x95\x26\x09\x87\x92\xda\x50\xec\x69\x65\xb9\xa4\x88\xc2\x9c\xe2\x32\xcb\x92\xa2\x11\x8b\xb2\xd5\xc8\xf2\xf6\xc4\x5a\xd9\x49\x26\xf2\x56\xf3\xe8\xf4\x5d\x93\xb7\x15\x68\xf6\xac\xcf\x36\xa6\x1b\x53\x8d\x19\x4c\xc6\x76\xf9\x1f\x4e\x4d\x33\x0c\xed\x20\x6f\xc5\x30\x17\x73\x8c\x07\x05\xae\x68\x30\xce\x78\x10\xc5\xed\x58\x0a\x36\xf2\x19\x80\x4a\xc0\x53\x95\x3c\xa4\x09\x39\xc5\x3a\x22\x2d\xe1\xb1\x1c\x96\x48\x9b\x71\x77\x4d\xe4\xce\xc3\xb0\x9d\x0b\xa1\x9f\x40\x6c\xf4\x40\x39\xb9\xcf\xa0\x19\xfc\x95\x27\xe6\x87\x2a\x0b\xa6\x79\xac\x42\x54\x9f\x84\x29\xfe\x4b\x39\xf5\xc3\x5e\xb9\x86\x15\xe1\xc5\x61\x7e\x67\x91\xe0\xf6\x08\x45\x27\x8c\x13\xc0\x7a\xc0\xb9\xc1\x5a\x26\x3a\xf2\x0c\xcb\x3f\xe3\x6e\x21\x9a\x1c\x22\x1e\xc0\xa6\x68\x3d\x2c\x7b\x69\x2a\x12\xeb\x81\xdc\x3b\xf0\xb3\x54\xc0\x5c\xaa\x95\xac\x59\x74\x9d\x66\x91\x04\x65\xad\x92\x17\xed\x26\x3c\x49\x45\x59\x34\xc3\xae\x80\x07\x57\xed\x8b\x19\xb1\x43\xb2\x37\xa0\xdb\x78\x45\x70\xff\xe2\x50\x04\x02\xda\xe2\x92\xce\xc8\xc2\xb0\x03\xf1\x2f\xc8\xbd\x67\x0c\xf4\x2d\x80\x92\x04\x5f\x1b\x87\x56\x7c\x8b\xc7\xf6\x8b\xad\x32\x0f\xfd\xc7\x82\x97\x9d\x92\x7f\x6c\x83\x75\x70\x45\x2d\x3d\xe1\xbd\x80\xed\x90\xdc\xd8\x0e\x5a\xfe\x01\x8f\x1d\x80\x9b\xa7\xf0\xdf\xe9\x05\x2f\x83\x14\x3e\xd7\xb2\x2b\x57\xbd\x1e\x4d\xa6\x08\x8a\xff\x0a\x7f\xdf\x6a\xbf\x14\xc1\x8b\xee\x09\x0b\x71\x6c\xb6\x2e\x52\xb9\x29\x23\xbe\x74\xff\xc2\xf2\x6d\x53\x93\x7c\x61\xf9\x3c\xe0\x07\x5c\x7e\x23\xef\xd8\xc7\x18\x44\x50\xa2\x3b\xc7\x9b\xf7\x05\x7f\x3d\x42\x24\x54\x72\xbf\xf0\x46\xbb\x4f\x50\x77\x54\x20\x53\x68\x85\xc5\x60\xc2\x20\xe3\x28\x38\xc7\x57\x8a\x66\xd6\x15\x75\xe5\x44\x2b\x79\x0b\xd0\x96\x81\x47\x88\x01\xe9\x57\x44\x8d\x8c\xb1\x22\x9a\x63\xe4\x32\x4f\x38\x9f\xca\x79\x8d\x8e\xa5\x75\xb9\x8c\x53\xae\x1e\x15\x03\x0a\x44\x2d\x18\x04\xa8\x32\xca\xd0\x3a\x56\x52\xa7\x3a\x83\x06\x23\xff\xf9\x4a\x5b\xa0\xb4\x4a\xdb\x57\xd2\x58\x22\xca\x3a\x7d\x2e\xab\x9f\x69\xf0\x73\xf2\x7e\xd9\x04\xa7\x7f\xb7\x8a\xea\xe7\xa8\x88\xac\xf7\xd2\xf5\x34\xdb\x4c\x83\x06\x3b\xa9\xd2\x52\xaa\x48\xe8\xbc\x57\xa0\x7f\x09\x2e\x4c\xc1\xd7\xe4\xbd\x9e\x16\x5c\xee\xd4\xac\xc5\x57\xc3\x34\xd2\x61\x0f\x94\x13\x02\x15\x71\x1a\x06\x07\x31\x7f\x56\xe4\xad\xd3\x30\x0b\xbf\xe2\x9c\xd1\x26\x1b\xe9\xc5\x91\xff\x70\x70\xee\x22\xb8\x7f\x3e\x25\x84\xe0\x17\xf7\xb1\x71\x1b\x32\x76\x50\x35\x4d\xfe\xd1\xf7\x60\x84\x97\x7f\x69\x5f\x70\xd2\x7d\x64\x23\x5b\x25\x89\x05\x00\xdf\x1a\x92\x4e\x43\xde\xdf\xe0\xc5\xe0\x5c\xcf\x9f\x1b\x61\x7f\x07\xb1\xf9\x28\x7a\xf8\x7f\xec\xb1\xb9\x5d\xdd\x7f\x2e\xf4\xbb\x22\x1a\x66\x5a\x0f\x3e\xec\x9d\xd7\xba\x7f\x0b\xb0\xf8\xbc\x68\xa1\xf2\x1f\x79\x0d\x8b\xab\x30\xa6\x82\x74\xb8\xde\x57\x45\x10\x69\x2c\xda\x96\xf5\x4d\x61\x6b\x5e\x69\xa0\x3a\x64\x95\x7e\x1b\x08\x29\x62\x5d\x8c\x67\x0a\x5b\x64\x37\x58\x5f\xf9\x73\x41\x7d\xd9\x01\xdf\x49\x07\xed\xf5\x4d\x11\x0d\x55\x0d\x3f\xa6\xab\x02\xbc\xae\xf4\x6a\x51\xa1\x2a\x3d\x51\xe1\x61\xdb\xf4\x84\xbd\x9f\x39\x2c\xe8\x30\x2c\xa2\xa5\x3c\xce\xf2\xb8\xec\x3f\x20\xd9\x77\xcc\x09\x46\x49\x2e\x41\x5b\xf1\xa5\xc3\xc1\xb9\x9d\x8b\xb8\xc2\xf3\xf6\x65\x77\xd6\x6b\xfc\xf9\x41\xf6\x36\x4f\xc9\xe5\x6f\xf2\x82\xd1\x15\xf8\x73\xc5\xad\x9d\x8e\x57\xbd\x8b\xad\xc4\xc2\xbd\x50\xee\x67\x8b\xec\xde\x6d\xf7\xe9\xe5\x8d\xfe\xba\xc8\x7e\x15\x22\xfb\x97\x6c\x91\xfd\x0b\x57\x29\xb2\x7f\xaf\xb7\xa2\xea\xd2\x86\xa0\xe2\x1f\x00\x90\xe7\x75\x3d\xdc\xd5\xe9\xe1\x9e\xf4\xde\xe2\xed\xae\x0b\x59\xf5\x57\xb4\x2e\xc4\x3e\xc1\xc6\x94\x5b\x51\x8a\xec\x4c\xad\x86\x6a\x4a\x2e\x1d\x66\x5f\x3f\x1c\x3c\x8b\x90\x0f\x16\x92\xb0\x28\x80\x1e\xfe\xd9\xa1\x60\xb6\xfa\x10\xe9\x82\xf1\xd6\x06\x25\x22\x41\x26\x34\x65\x21\xb1\x0d\xd1\xfb\xd7\xd7\x95\xb9\x57\xad\xcc\xcd\xd4\xa5\xd1\x0a\x6e\xd3\xca\xdc\xd2\x4a\xb0\x65\xaf\x96\xeb\x0c\x35\xcb\xa6\x77\xf0\x6a\xde\x66\x17\x5c\xbf\x17\xae\xe2\x5e\xf8\x05\xfb\x5e\xf8\x99\xab\xbc\x17\xfe\xc9\x70\x55\xee\xd3\xa7\xc9\x8d\x76\xa7\x5e\xf3\xfe\x09\x4d\xbd\xd4\x86\xaa\xd0\xab\x2a\x35\xa9\xa6\xc0\xf9\xa3\xe7\x3b\x09\xf8\x2c\x38\xa3\x65\x8a\xce\x5d\x40\x95\x98\xff\x99\xe7\x07\x7f\xe5\x0d\x3e\x27\x3f\x8f\x6e\x16\x51\x9e\x41\x13\xd5\x5b\x52\x7e\x7f\xd2\xe3\x65\x9d\x0e\x06\xf7\x50\x10\x0d\xf9\xe3\xca\x8d\x99\x75\x84\xad\x0c\x84\x94\x93\x56\x42\x59\x13\xeb\x57\xb8\x8d\x37\x38\x45\x9a\x92\x6a\x0c\x0d\x80\xc3\xcb\x02\x5a\x34\x68\x90\x45\x84\x09\x68\x36\x74\x80\xa8\xf9\x7c\x70\x80\xae\xec\xf2\x53\x5f\xcb\x7e\x6c\x84\xdd\x4a\xe9\x87\x17\xc0\x3a\x8a\x98\xad\xfe\xbb\x46\x82\x6f\x1f\x19\xf2\x42\x93\xd9\x55\xb1\x16\x6e\xc4\x19\xd8\x57\xc1\xae\x0a\x3e\x49\x3a\x1a\x05\x84\x25\x9d\x47\xba\xe2\x89\x4f\x88\x08\xab\x42\x7e\xa3\xf2\xf8\x91\x43\xf0\x52\x16\x39\xa0\xb9\x20\xde\x3b\x60\x13\xda\x9f\x1f\x80\x35\x1d\x75\xb6\xca\xa4\xac\xa2\x96\x54\x77\x46\xdd\xee\x14\x63\xa0\x81\x80\xaa\x29\x66\x49\x83\xd5\xa4\x5c\x74\xd7\x44\x47\xe4\x61\xe2\x36\x54\xf4\x9a\x6b\x3c\x2c\xe6\x28\x80\x78\x1c\xe2\x75\xe3\x36\x00\xeb\xc9\xea\x41\x23\x11\xc5\xb9\xc2\xae\x31\x0a\x4e\x1e\x9c\x4b\xcf\x67\x59\x79\x26\x2e\x20\x14\x9b\x00\x40\xe7\x21\x60\x2e\x18\x86\x6f\xac\xde\xa9\x90\x5c\x47\x50\xfa\xa1\x1a\x63\x79\x2f\x9d\xc7\xa1\xfa\xdf\x53\x53\x66\xeb\xff\x09\x38\xb8\xf7\x2e\x9e\x94\x93\x94\xf7\x52\xa2\x83\x65\xde\x47\x4a\x58\x0d\x60\xe4\xdd\x3c\x6b\x42\x9e\xba\x8b\x85\x80\x50\x4a\xd0\xd3\x2b\xaf\x76\x8c\x42\x10\x65\x83\x9f\x81\xfc\xa9\x85\x82\xb1\x92\xbb\xb8\xba\xaf\x38\x47\x50\x65\xf9\x0e\x70\xd4\xaa\x27\x4b\x0e\x79\x70\x3f\x52\x42\x65\xb8\x08\x4c\x4c\xcf\x60\xfd\xb0\xdf\x0b\x7b\xc3\xa3\x4a\xc9\x00\x30\x55\x0d\xed\x3f\x35\xc2\x6e\x84\x59\x3a\x9b\xc1\xe4\xfb\x3f\x3c\x12\x5c\x1a\x59\x1c\x44\x7c\x36\xd3\x01\x32\xae\x9c\x37\x44\x55\xce\xd2\x7a\x9e\x65\x25\x69\x27\x16\x41\x7b\x42\x71\xd6\xf7\x93\x9a\x07\x76\x10\x68\xd3\x95\xa3\x3b\x86\xa9\x86\xa5\x9e\x4d\xc0\x8d\x36\xb1\x25\xb1\x85\xb7\x44\x4d\x5d\x5c\x3c\xc9\x27\xf9\xa8\x6c\x6b\x0c\xa6\xa9\x15\xc6\x10\x5d\x8e\x59\x9f\x2b\xd1\x99\x2d\x55\x05\x74\x09\x16\x88\x67\xb9\x8a\x0c\x4d\x33\xdc\xa7\xd4\x27\xc0\x96\x57\x19\xb4\x45\xde\xca\xf2\x0e\xc4\x93\xfc\xc3\x5b\x4f\x37\x4a\xe1\x97\x6a\xec\x19\x9b\x71\x1a\x65\x9b\x05\xc2\x01\x16\xfe\x4f\xd5\xd8\x4b\x77\xd5\xab\xbc\x1c\xbf\xa9\x34\x46\x55\x04\x7f\x0b\xe7\x83\xca\x98\x84\xff\x8a\x74\x3b\x10\x50\x49\xe2\xc4\x22\x56\x53\xaa\x97\x3a\x9b\x92\x4e\x1e\x1f\x3a\x71\xa0\xd5\xf1\xaa\x55\x80\xd3\xfc\x74\xcf\x2d\xa4\x92\x2a\x00\xa7\xae\xf0\x3f\xe7\x05\xdf\xee\x21\x68\x5d\x01\xf7\x9d\xa5\x34\xd0\xca\x23\xb0\x3c\x40\x09\x03\x23\xa0\x10\xf9\x96\xb2\x88\x20\x0a\x7a\xa9\x89\x89\x52\xe5\x47\xc9\x43\xc7\x6c\x59\x3a\x09\x63\x94\x2e\x5f\xed\xee\x24\xec\xa5\x90\x40\xd7\x70\x99\xdf\xc0\xc6\xd8\x91\xdd\x63\xe7\xa0\x25\xf6\xf3\x23\xec\x20\x91\x7b\xff\xa7\x47\x14\x0d\xfc\xc0\xc8\x3c\x4e\x4e\x98\xb8\x19\xd4\x80\xb3\xa0\x4c\xfc\xb0\xce\xc5\xe0\x3a\xeb\x48\x78\xba\xc5\x1d\xfa\x4f\x80\xf7\xd6\xe9\x2f\x33\x05\x10\x04\xdb\x41\xdf\x7d\x40\x67\x43\x3b\x59\xf0\x2a\xbe\xb6\xc0\xe1\xa3\x39\xc6\xa6\x30\x0c\x29\xdb\x4c\xe5\x3d\x28\xe9\xb6\xda\x25\xb2\xcc\xe9\x65\xbc\xca\x08\x2d\xa9\x10\x65\x3b\x8e\xf8\x2a\x6a\x80\xe5\xee\x19\x4d\xc5\x26\xc6\xa9\xe9\x30\x45\xd2\x01\x2a\xd4\x4c\xaa\x4d\x37\x4d\x55\x8e\xf1\x19\xac\xd3\xba\xa0\x57\x63\x82\x1e\x39\x77\xfe\x08\x05\x55\xe6\x9b\xf5\x7c\xb3\x5e\xaf\xd7\x19\x53\x94\x66\x08\xf5\x93\x84\x0c\x6c\x99\xfd\xca\x2c\x54\xae\x5c\x94\xb5\xfa\x0a\xa4\xd5\xa1\xd5\x9f\xa9\xb1\xc3\x40\xab\x2f\x16\x22\xf7\x3f\xaa\x2f\xb4\x77\x43\xf4\xf2\xc5\x2b\xb8\xd0\xec\x28\x28\x49\xbf\xdd\x03\x83\x44\x5a\x73\xc1\x03\xe1\x76\xff\xf0\xc8\xe3\xae\xd7\xdd\x5b\x46\xd8\x33\x0a\x01\x21\xbf\x8a\x62\xfe\x45\x6d\x0f\xd1\xed\x14\x26\xac\x48\xe4\xa7\x60\xc6\x55\xec\x70\x53\xf5\x66\x00\x21\x6f\x0f\xe4\x71\x80\x00\x28\xdc\x68\x0a\x0b\x0b\x79\x1e\xa6\x51\xd6\x19\x68\x0d\x10\x3d\x1c\x84\x8a\x06\xff\xff\xca\x9a\xb0\x7f\x22\x97\xa1\xd9\xcc\x3a\xdd\xa5\x3c\x93\x87\x73\x4f\x18\x03\xcb\xce\x27\xc1\x71\x3c\xf0\xf0\x4c\x5f\x33\xb8\x93\x79\x95\xbc\x1a\xc0\x1f\x49\xb7\xd8\x57\x3c\xe6\xdb\x74\xef\x5e\x34\x50\xfe\x07\x2f\xf8\x90\x37\xaf\xe9\x3c\x9a\x2d\xed\x15\x35\x60\x4c\x74\x86\xe0\xbc\xc5\x69\x65\x25\x00\x49\x3c\x8c\xd0\x9b\x4f\x87\x32\x58\xf7\x9e\x8a\x97\xb8\x77\xf1\x24\x2e\x88\xb3\x2f\xd2\x4c\x35\xad\x68\x13\x66\xe9\xc2\xb8\x06\x67\x6f\x9b\x5b\xe1\xd9\xec\x56\x22\x08\x2e\x83\x77\xc0\x89\xd9\x77\x50\x9c\x1c\xf3\x0f\x88\x8b\xe0\x24\xf2\xd6\x03\xda\x00\xa4\x1f\xee\x94\x1a\x01\x55\x07\x61\x51\xb8\xb8\x72\x03\xd1\x31\x1f\x18\x01\xa7\x4e\x95\x37\xe7\xfb\x47\x82\x6f\x1b\xb1\xd2\xe5\x80\xb9\x41\x2b\x8d\x76\xca\x9a\x43\x9a\x27\x4a\x2e\x84\xd0\x30\xb2\x7d\x92\x88\x08\x13\x07\x0c\x62\x71\x0b\xa3\x1f\x79\xd0\x4a\xc2\x8d\x2c\x2f\x02\xba\xdc\x72\xab\x5a\x7d\xe1\x40\x88\xa5\x69\x0d\xf3\xc5\x0b\x0c\x54\x1e\x87\x60\xcd\x4e\xd8\x47\x59\xc8\xd4\xbc\xa4\x10\x6c\x0d\x7e\x0d\xd4\xa3\x33\x60\xba\xf9\x33\xa9\x93\xc6\xbf\xde\x9c\xa6\xd0\x60\xbf\xd5\x35\xec\x1b\x84\x13\xa4\x19\xe6\x9d\x84\x38\x96\xe9\xa3\x93\x56\x8a\x1c\xb9\xd5\x30\x4b\x13\xe5\xe4\x09\xc2\x26\x9a\x81\x63\x5c\x87\xba\x69\x3b\xd8\x36\x21\xb8\xeb\x3b\x50\x63\x4c\xe3\xf2\x16\xfe\xdf\x7a\xec\xfe\xbd\x01\x89\x0d\x6e\x28\x33\x39\xc6\x78\xf7\x41\xcf\x9a\x32\xb2\xc6\xa4\xeb\x08\x29\x5a\x0d\x79\xa1\xbd\x4e\x49\xc9\x63\x0a\xb3\x68\x3a\x66\x20\x0b\x75\xc0\x9d\x63\x48\x69\x45\x9f\xc4\x03\x5b\xc9\x08\x18\xe8\x34\xcc\xc1\x5d\xc2\x00\x12\x17\x0d\xf6\xb1\xc3\x4e\x18\x70\xbe\x1a\x36\xf5\x28\xcf\x67\x89\xb8\x27\x06\x74\x50\xd0\xe3\xbe\xf5\x70\xf0\x7e\xaf\xf2\x70\x98\x1e\xd7\x2a\x52\xf0\x93\x26\x2b\x5c\x9c\xf2\x8d\xa9\xc6\xd4\x9d\xf2\x8f\x96\xdc\xaa\x60\x9e\x92\x2d\x86\xbd\x12\x02\x19\x6c\x8f\xbd\x89\x8d\x29\x5e\x69\xcc\xca\x3a\x90\x66\x3c\xc9\xd2\x36\xa6\x70\x21\x97\x6b\xac\x7f\x7a\x7a\xb8\xe2\xf8\xf3\xd7\x23\x67\xaf\x5a\x71\x9c\x28\xc5\x71\x33\x78\xd1\x10\x2f\x60\x7b\xe1\xf7\x9e\x77\x63\xbb\x3d\x77\x5d\x6b\x7c\x15\x5a\xe3\x96\xa5\x34\x7e\xd5\xd5\xe9\x8c\x77\x4e\x69\x5e\xec\xae\xd0\x5d\xf2\xcf\x6a\x85\xee\xb6\xc7\x5d\xeb\x76\x2b\x67\x7e\xa8\xf1\xe9\x83\xfb\x87\x22\xb2\x9d\x3d\xbd\xec\x40\xf3\xbc\x71\x7f\xf0\x46\x27\x4f\x44\xca\xcf\x9e\x5e\x56\x30\xe4\xf2\x92\x4c\xc2\xa2\x54\xa6\x8f\x96\x00\xe6\x14\xb1\xd3\xa5\xe8\x27\xcb\x2a\x98\x1d\x42\xa8\xde\x11\x6d\x27\xcb\x87\x83\xed\x1c\x40\xa3\xdb\x25\x0f\x42\xeb\x1c\xa2\xf4\x7b\x23\xec\x8d\x1e\x85\xdc\x6d\x05\xeb\x4b\xa1\xca\x19\x1e\x17\xa0\x0f\xb5\x51\x46\x64\x77\xc8\x7c\x77\xb5\x40\x20\x69\xcb\xd9\x2c\x3f\x67\xe7\x94\xf8\xb8\x17\x7c\xd0\xdb\x11\x7b\x42\x76\x04\x3b\x47\x02\x81\x42\x2b\x42\x69\x51\x84\x51\x1d\xf4\xb4\x96\xd0\x37\x0c\x8e\xe2\x9a\x0c\xc2\xd2\x15\xbd\x03\x53\x4a\x6f\x88\xdc\x7f\xab\x17\xbc\x1e\x4f\xb8\xb2\x6c\x69\x04\x46\xc0\xfb\xd7\x39\x00\x88\xfd\x7a\xea\xa6\xf6\x77\x6f\x72\xe2\x5c\xb6\xe7\x25\x00\x3d\xfb\x23\xff\xbf\x46\xcf\xfe\x57\xd7\xd1\xb3\xaf\xa3\x67\x5f\x47\xcf\xbe\x8e\x9e\x7d\x1d\x3d\xfb\x29\x45\xcf\xfe\x26\x42\xcf\xbe\x87\x7d\xe3\xe5\x08\xbd\x43\x21\xb4\x3f\x78\xc0\xe1\xc4\x20\x5f\x86\xfa\x80\x92\x72\xc4\x69\xdb\x7f\xe3\x81\xe0\x82\xf9\x59\x49\xcc\x58\x98\x17\xcd\x2c\x2d\xca\x3c\xd4\xae\xb7\xb2\x3e\x0d\xb8\x86\x89\xe3\xce\xa3\x12\x11\x64\x6f\xf7\xfe\xf8\x17\xfb\xd9\x8f\xd6\xd8\x0d\x94\x45\x04\x54\x9f\x3f\x50\x0b\x3e\xe9\x59\x0f\xd0\x10\xdf\xed\x22\x4a\xf0\xa8\xd8\x6a\x26\x3d\xc8\x7e\x11\xf5\x20\xb0\xba\x14\xc5\x98\x9c\x69\x08\x14\x26\x48\x59\x75\x8f\xc5\x85\xd3\x36\x8f\x30\xb9\xb9\x06\x94\x18\x27\xd3\x71\xbc\x21\x92\x3e\xef\xa5\x71\x96\xaa\xf5\xa1\x68\x1c\x1c\x8d\xca\x72\x62\x1b\x01\xe0\x0c\x81\xf4\xe2\x8e\xce\xc8\x50\x13\xac\xce\xbe\x61\x77\x7f\x62\x3d\xd4\x3d\x7a\xed\x7f\xa5\xc6\x6e\x94\xdd\x5a\x06\x0f\xef\x2c\xf7\x7f\xad\x16\xfc\x64\xcd\x7e\x02\xd2\x5d\x81\x9b\x8b\xac\xa5\x0a\x4b\x58\x39\x33\x64\xa9\x1a\x1a\xe8\xae\x88\x47\x1e\x98\x31\xb2\x18\xa9\x5c\xb1\xd5\xf9\xb4\xf1\x2f\x69\x4b\xd8\x69\x58\xf4\xa9\x57\x91\xd5\x05\x75\x10\x09\x99\x53\x95\xd3\xff\x58\xca\x2b\x79\xdb\x50\xc8\x6e\x16\x1d\xb1\xd2\x4d\xda\x85\x1b\x7c\x1e\xd5\x8f\x1a\x80\x3b\x49\x38\x5e\xa0\x6a\xa5\x90\xe5\x45\xc9\x1c\xf9\x00\xbd\x03\x1a\x4f\xec\x10\x25\xf2\xbf\x0e\xed\x92\xc3\x13\x74\x2c\xbf\x79\x28\x98\xb0\x7e\x0f\x53\xaf\xd0\xeb\x9d\x7d\x83\x3f\x72\xdd\x4d\xee\xaa\xb5\x1d\x4d\xa5\xed\x78\x55\xf0\x82\x78\x98\x9b\x1c\xad\xc4\xde\x8f\xe9\xe0\xa2\x5f\x57\x72\x5c\x77\x8d\x23\xd7\xb8\xd7\xec\xae\x49\xb9\xdb\x9f\xdb\xcd\x35\xce\x22\x1e\x55\xaf\xb8\xf7\x99\xc8\x06\x0c\x66\x6a\xb7\x73\xd1\x0e\x25\xd9\xb3\xa1\x9d\xaa\xc0\x48\xf3\x4b\x8b\x04\x70\xe4\xff\xde\xe1\xe0\x21\xf3\xd3\x45\x31\xa4\xe0\x47\x14\x16\xa5\xe0\x14\x37\x7b\x49\x98\x73\x30\x3c\x11\xd1\x69\x20\x34\xa8\xba\x3f\x02\xea\x5e\x03\x86\x14\xb8\xb7\xf9\xb7\x1d\xba\x4e\xc1\xae\x96\x82\x5d\x27\x2e\x57\x4e\x5c\xee\xb7\x68\xcb\x89\xbd\xc6\x20\x39\xa4\x05\x23\xb6\x24\x71\x61\xff\x87\xc7\xf6\x49\xa6\xd7\x7f\xdc\x63\xe7\x86\x56\x75\x65\x27\x72\xb9\x2b\x9a\xc1\x69\xd0\x12\x68\x2c\xd6\x6a\x7a\x4e\x30\xb3\x63\xda\x0c\xf4\x57\xed\xa5\x31\x3d\x51\x22\x23\x2c\x25\xfb\x7e\x4f\x63\xfb\xbd\xcd\x63\x2f\xbb\x96\xdd\x44\x04\xbf\x3b\x07\xb3\x62\x60\x7c\xfc\xa0\xc5\x35\x4c\xf9\xfc\xd2\x22\xf5\xec\x49\xaf\xb5\x3b\x6d\x5c\xf0\xe7\xeb\x44\x03\x4d\xc3\x15\x12\xa8\xc1\x1b\xab\xbd\x25\x22\xca\x7e\x78\x3f\x9b\xdc\x13\xe8\x14\x48\x3f\x84\xe3\xf5\x57\xfb\x82\x63\x03\x4f\xc9\x83\xb8\xb4\x70\xbb\xf0\xb8\x21\x81\x44\x60\x2c\x87\xe0\xfd\xc8\x3e\xf6\x27\x1e\xf3\xc3\x0d\x21\xe9\xfa\xc5\x32\x4e\x48\x43\xee\x7f\x41\x23\x45\x7d\xda\xa3\xca\xe6\x07\x4a\x29\xe6\xc4\x6d\x8d\x84\x41\xaa\xd4\xc4\xbd\xd1\xe1\xc6\x6e\xf0\xb0\x99\x67\x98\x78\x95\xe7\x22\x11\x1b\x61\x5a\x12\xd6\x92\x3e\xf1\xca\x78\xdb\x15\x79\x53\x52\x53\xbb\x32\x15\xe4\xeb\x34\xe9\x24\x66\x21\xe6\xb9\x70\x7d\x55\x3e\xe1\xb1\x1b\xa9\x67\x30\x73\xfe\x07\x2e\xe7\x0e\x6f\x68\x34\xc7\x97\xf5\xc2\xb4\x8c\xcb\x7e\xd0\xb6\x6b\xbb\x9c\x09\xd9\x65\x1e\xf8\x68\x48\x41\xca\xd0\xce\x18\xfb\x66\x4f\xe5\x55\xdc\xba\xba\x1e\x1f\xdf\xd8\xb5\xab\xd4\xb7\x4a\x17\x1a\xec\xcb\x87\x18\x1f\x22\x02\x2a\xf8\x51\x8c\xbd\xf9\xf4\xa1\xe0\xeb\x9c\x27\xae\xc5\x4e\x07\xba\x0e\x97\x22\x7e\xf8\xba\x14\x71\xd5\x77\xf0\x2b\x94\x14\x71\x2e\xf0\xab\x68\xc3\xae\x88\xdf\x60\xe3\xec\x8e\x5d\x45\x7c\xbd\x9a\xd7\x6f\xf7\xab\xb8\xdd\x7f\xd9\x16\x1d\x7e\xf6\x2a\x45\x87\x37\x79\x5f\x25\x84\x24\x6b\x70\x4f\x7a\x17\x77\xbf\x23\xa7\xfd\xc9\x6d\xd0\x8c\x83\x60\x00\xbf\x18\x23\x6b\xd8\x07\x6a\xec\x05\x43\xb6\xe1\x7d\x59\x51\xce\x27\x71\x58\xf8\x6f\xa9\x05\x99\xfe\x65\x5d\x7b\xca\x4c\xb5\x2a\xca\x4d\x21\x30\xf5\x76\x1a\x69\x4b\x1c\x69\x8b\x94\x4e\x37\x4e\x49\xa1\x12\x82\x9d\x56\x25\x0a\x57\x37\xc7\x91\x82\x32\xe0\xb5\xe2\xa4\x62\x36\x7a\x8b\xc7\x1e\x60\x87\x75\xb5\xfe\x89\xe0\xb6\xfb\x74\x1b\xea\xf2\x09\x57\xb3\x0d\x61\x59\xfe\x76\xc2\xe1\x3f\x0a\x59\xc3\x27\x82\x60\xd0\x50\xb8\x86\x5a\xe6\x84\xbc\x4f\x1d\xb5\xea\x4f\x1f\x72\x92\x6a\xbb\x46\xee\x8d\xa9\x86\x8a\xe7\x07\x4b\xdf\x77\x1f\xb2\x22\xfc\xc1\xd4\x57\xd1\x2d\x84\x4d\xf2\xf6\x5b\x33\x79\x6e\x94\xe7\x17\xaa\xc5\xc8\x8f\x9f\x67\xa9\x3e\xce\x05\xea\xc2\xb0\x8e\x5c\x72\x57\x69\x9b\xc7\x45\x7a\x04\xd1\x6d\x00\x80\x22\x2d\xc7\xd1\x28\x83\x4c\x98\xa5\xf9\x1c\x27\x64\x83\xa2\x88\x57\x51\x0d\x17\xa7\xcd\xac\xd3\x4d\x44\x29\xe4\xfd\xb0\x21\xf2\xd5\x01\x34\xfa\x37\xd7\xd8\xe1\xb0\x1b\x93\x7b\xe1\x5f\x7b\xc1\x6f\x78\xf3\x4b\x8b\xf8\x73\x18\x9c\xad\x7a\x59\x49\x9a\x6d\x73\x0c\x05\x3a\x0c\x76\x7a\x49\x19\x77\x13\xf8\x44\x3b\x2a\xe6\xc2\x0e\x8f\x09\xd3\x3e\x4d\x94\xc5\x85\x28\xab\x40\x96\xea\x46\x45\xda\xeb\x90\xce\xd5\xc0\x5d\x13\x5a\xad\xae\xdd\xb8\x22\x2a\xf3\x1d\x0f\xee\x08\x78\x47\x84\x29\xcc\xfb\x4e\x5b\xe6\x93\x1e\xbb\x49\xd5\x7c\x16\x76\x21\xa4\x9d\x38\x6f\x3f\xaa\x22\xe9\x6e\xca\xa3\xed\x7a\xdc\x9b\x60\x14\x30\x0b\x18\xff\xf4\x06\xe7\xf3\x29\x46\x16\x81\x32\x19\x3b\x05\xa5\xc5\x86\xc8\x09\x09\xda\xec\x8f\xcb\xe9\xfb\x97\x3d\x76\xd8\xa0\x89\xff\x9a\x17\x7c\x52\xf7\xbb\xa8\x42\x09\xa8\xc7\xc6\x74\xe1\xf4\xd1\x69\x53\x9d\x5e\xcb\xfb\x4f\xed\x93\x06\xe3\xc1\x1d\x13\xad\x2c\x0b\xaa\x16\x6e\x1b\xe8\xf9\x48\x2b\xcb\x8e\x20\xbf\x9c\x24\xee\xc2\x6d\x57\xef\x0e\xc3\x7c\x8f\x64\xd9\xe4\x0e\xf6\xdf\xe9\x05\x9b\x0f\x8a\x7c\xd5\x1d\xdc\xfa\x10\x28\x0d\xb9\x37\xe0\x9b\x71\x9e\xc4\xeb\x62\x8e\x03\xa0\x66\x02\xae\x68\x9b\x68\x0a\x47\x8f\xfb\x71\xba\xdd\xc6\x79\x24\xe4\x71\x19\xe7\xdd\x3c\xdb\xea\x5f\xce\x32\x7c\xb3\x3f\x34\xc5\x3b\xa4\x4c\xf3\xbf\x7c\x4b\xf0\x46\x0f\xb3\xa7\x59\x48\x25\x7c\x4d\x84\x49\xb9\xc6\x9b\x6b\xa2\xb9\x4e\x8a\x69\x1d\xdd\xa3\xcf\x81\x15\x8f\x22\xcb\x44\x02\xcd\x91\x42\x43\x81\x12\x96\x4c\x12\x6f\x80\x7b\x04\xa4\x26\x03\x47\x7b\xd1\x14\xf2\x19\x59\x4a\x5d\xaa\xfb\x2b\x37\xb3\xb7\x7b\x6c\x9f\xd8\x12\x4d\xff\x5b\xbd\x3d\x98\x26\x4e\x6d\x89\xe6\x3c\xa2\x5c\xbd\xf2\x5c\x8a\xc0\x22\xa0\xee\xb7\xce\xa9\x31\xd9\x0d\x71\x1e\x6d\x70\x59\x45\xc5\x76\x44\xa7\x5f\xb2\x86\xe1\xba\x68\xb0\x0f\x7a\xec\xe6\x56\x18\x27\xbd\x5c\x5c\x58\xcb\x45\x21\xaf\x23\xff\x1d\x5a\x7e\x7a\xec\x4c\x9c\xc6\x9d\x5e\x07\x0c\x4d\xa2\xd9\x2b\xe5\xf8\xa8\xbc\xb9\x2c\x20\xb5\x1a\xcd\xa7\x95\x3f\x4f\x96\x93\xf3\x0a\xf0\x71\x6b\x21\x58\xdf\x20\xa7\x9e\x80\x9c\xec\xb6\x87\xcb\x4c\x83\xab\x96\x34\x83\x3f\xe5\x0a\x3f\x5f\xf2\xd8\xad\x98\xcb\x29\x39\x29\x92\xb0\xbf\x0c\x90\x80\x85\xff\x0b\xba\xb3\x3f\xee\x9d\xd5\xc8\xb5\x08\x18\x58\x58\xd8\x75\x6e\xde\x36\x4a\xd8\xa6\xac\xe4\x72\x2d\x4d\x96\x38\xa4\x9b\x94\x38\xea\x0a\xf2\x08\x6d\x66\xf9\x7a\x92\x85\x51\x31\x21\x85\xa1\x09\x88\x8a\x8d\x5b\xa2\xd9\x6f\x26\xe2\x36\xdd\x8f\x3a\xb6\xe5\x0c\xf2\xdf\x7b\xec\x66\x4a\x3b\x68\x96\xe3\x93\x7a\x84\x3f\xe4\x0d\x5b\x0f\xfa\x60\xf7\x05\x31\x09\x0d\xdd\x45\xc1\x85\x72\x57\x64\xaa\xc1\xcf\x90\xda\x71\x0a\xd5\x22\x6a\x8a\x00\xe1\x06\xf3\x13\xee\x69\xd5\x9e\x51\xc6\x1d\x91\xf5\x4a\xb5\x60\xbf\xac\x87\xf3\xc9\x6d\x17\xcc\xa4\xf2\xa7\xa1\x40\xfa\xbd\xac\x57\xc9\x84\x34\x45\x9f\x0d\xed\xc7\xd3\xb7\x6a\xeb\xec\xa0\x6c\xe0\x5e\x51\xfa\x2b\xac\xb1\xeb\xc9\xbe\xef\xc2\x85\xa5\x7b\x45\x49\x87\x5b\xfd\xac\x1c\x54\xb0\x6d\x5b\xc8\xf0\x44\xa7\x1a\xec\x31\x76\x53\x57\xe4\x31\x84\x63\xc0\x7c\x26\x6a\x3a\x5f\x7e\x9f\x86\x71\x1e\x8d\x53\x35\xa3\x63\x36\xef\xa3\x67\xd4\x01\x80\x9f\x9a\x54\x85\x77\x5f\xd0\xb7\x7b\xec\x70\xd9\xec\x2e\x67\xcd\x75\x51\xfa\x6f\xf6\xf6\x90\xb3\xed\xc2\xc2\x12\x16\xa7\x11\x9f\xd3\x0f\x6c\x08\xc6\x54\xd1\xa6\x38\xdd\xc8\x92\x0d\x34\x5e\xab\xac\x50\x0d\xf8\x6b\x2d\xcb\xd6\x0b\x9d\x27\x51\x87\xd0\xb1\xbf\xd9\xcf\xfe\x91\x95\x3a\xf2\xde\x3c\x6c\x8a\x25\x67\x8e\x7e\x75\xbf\x0a\x8d\xfa\xd4\xfe\x73\x8a\xa1\x88\x94\xbb\xb8\x99\x2c\x6d\xb5\x4c\x85\x88\x0a\x37\xcd\x71\x5b\x56\x8b\x6e\x55\xbd\x6e\x96\xd2\xce\x24\x62\x88\x8c\x24\x14\xe1\xb8\x3c\x1a\x94\x7c\x48\x2b\x86\x2a\x51\xd0\x88\x30\xd6\x73\xc3\xc3\x23\xf7\x06\x88\x88\x4e\x66\x4c\xc0\x77\x4c\xb4\x09\x1c\x43\x84\x94\xd3\x84\xa9\x10\x5c\xd3\xb2\xbc\x09\xcc\xe9\x5a\x98\x98\xc4\xda\x7c\x5d\x72\x6e\x58\x8d\x14\x5d\xc9\xf6\x8c\x4b\x4e\x6e\xe2\x3a\x3f\x86\xd8\x22\xcf\xa8\x66\x22\xc2\x54\x32\xa2\xb2\x3d\x49\x11\xfa\x59\xcf\x8a\x1c\x5b\x6c\xd9\xb5\xc4\x05\x4f\xe3\x64\xdc\x12\x47\x76\x5c\xa0\x4a\x98\xa7\x05\xdc\x66\xd5\x99\x6d\x88\x3c\x8f\x23\xa5\x3d\x81\x67\x1a\x52\xd5\xf2\x0d\x00\x84\x35\x8e\x3a\x2d\x65\x3a\x49\xb3\xb4\x9e\x8a\x76\x08\x04\x93\xf6\xb2\x95\xfd\x9b\xbf\x5e\xe4\x99\x85\xfa\x5d\x94\x59\x97\xc7\x9d\x8e\x88\xe4\x0d\x90\xf4\xf9\x46\x1c\x42\xfd\xd6\xcc\xf1\xd1\x34\xe3\x19\xec\x41\x10\x4a\x21\xf2\x78\xad\x57\xf2\x28\xdb\x4c\xc7\x4c\xc0\x81\xdc\xd9\x49\x77\x2d\x24\x6f\x1b\xb9\x6c\x14\x5f\x50\x60\x46\x15\xb9\xea\xc0\xab\x5c\x18\x3a\x45\xbc\x25\x00\xcd\x93\xb7\xc3\xb2\x1a\xff\x77\x13\x7b\xf9\x15\x27\x96\xde\x39\xff\x88\xff\xe5\x1b\x83\x57\xef\x5c\x44\x2b\xb3\xd6\xb2\x4d\x18\x3c\x64\x21\x41\x0f\x95\x4a\xb2\x9c\xa1\xb9\x72\x2e\x79\x37\xcb\xa5\x52\x28\xfe\x4b\x61\xb9\x76\xc9\xf3\x51\xa3\x6e\x3f\x74\xf8\xa8\x5f\xba\x81\xfd\xe7\x1a\x1b\xf8\xd0\xff\xf7\xb5\xe0\x33\xb5\xea\x53\x47\xdd\xf6\x4d\xcb\xe7\xce\x62\xec\x0c\x21\x26\x80\x5b\x59\x35\xbc\x84\xc4\xac\x3c\x17\x45\x17\x29\x42\x46\x09\x52\x10\xb9\x4f\x65\x14\x58\x21\xe4\x5b\x5d\x6b\xe1\xb8\xb0\x01\xcf\x2a\x49\x15\x29\xe9\x73\x4b\x4c\x3a\xa3\x53\x4b\xc3\xc7\xd0\x51\xf4\x48\x5d\x69\xc8\x36\x56\x94\x7f\x5e\x8e\xe7\x28\xa3\x3d\x8a\x65\x64\xed\x88\xaf\x47\x63\x21\x4d\xa8\x33\x0c\x3c\x78\x43\xd3\xc1\xc0\x49\xc3\x74\x30\xa0\x38\xc8\xf3\x2c\x97\x32\xf1\xbd\xa7\x2e\x38\xe2\xf9\x1b\x47\xd8\x90\xb5\xf0\xff\xb0\x16\xfc\x76\x6d\xf0\xf9\x35\x9e\x69\xa8\xff\x29\x9f\x6b\x4c\xfc\x73\xcd\x66\xbb\xda\x6b\x45\x0a\xd3\x5d\x16\x23\x32\x37\xf1\xa4\xb3\x04\xbf\xbf\x9f\xdd\x02\x7e\x44\xca\xdd\x06\x56\xe0\x17\xf7\x07\x3f\xb3\x7f\xe0\xf1\x53\xb2\x00\xca\x65\xe8\xa9\x5d\x00\x29\x44\xe9\x9d\xaf\xca\x17\x18\x27\x0e\x2e\x9f\x70\x6b\x6d\x93\x22\x01\x89\x38\x92\x56\x50\xc3\x59\x1e\x4f\x66\x1a\x4c\x36\x77\x52\xf6\xe2\x07\xa3\xe0\xdb\xcb\x51\x69\xb3\xa5\x3d\xa4\x64\xa1\x5e\xb3\x1c\x23\x36\x54\x2b\x5d\xc0\xf2\xa7\xb2\x8a\xa3\x27\xa6\xfe\x44\xde\xee\x54\xb5\x64\xd3\xf6\xc8\x7c\x96\x61\xb1\x5e\x4c\x84\xc0\x96\xdb\xba\xc8\xb0\x1b\x4f\xe0\x72\xd5\xb5\x1c\x5f\x7d\x50\xb7\xd8\xae\xdb\x60\x32\xea\xf6\xd6\xba\xb6\x9b\x5a\xef\x84\x2b\xd8\xd4\xc0\x45\xa0\x2a\x06\x66\xc8\xd9\xe3\xdf\xb7\x6f\x68\x5e\xcd\xa5\x2c\x2f\x37\xb3\x7c\xcb\x89\x4f\xf9\xa3\x91\xe0\xc5\xc3\x5e\xb8\x8e\x15\xaa\x84\x8a\xe6\xd7\x46\xa4\x4b\xde\x21\x7c\x54\xc9\xfe\xff\xce\x11\xf6\x4b\x9e\x4e\x88\x0b\x79\x95\x4f\x2f\xcb\xbf\xab\xca\x96\x6a\x6e\x5b\x95\x0a\xd7\xda\xe4\xd5\x22\x7b\xcf\x7d\xdb\x70\xb3\xde\x5e\x7e\xb6\x5b\x7b\x56\xb7\xac\x00\x95\x24\x78\xf5\x40\x30\x09\x1f\x35\x69\xb2\xc1\x63\xf8\x6a\x52\xa7\x3a\x51\x25\xf7\x32\x3d\xc9\xfe\x8b\x83\xc6\x83\xf4\x37\xef\xa5\xf1\xeb\x7a\x92\x93\x8a\x23\x91\x96\x0a\x76\xbd\xb2\x56\xf6\x10\x7e\xa5\xcd\x5e\x38\x34\xe2\x5b\x1b\xf2\xfd\x8f\xb4\x83\xd3\xd6\xef\x4a\xfa\x27\x0b\x79\x0a\x03\x7c\x11\xd0\x00\x15\x50\x85\xbc\xf2\x42\x17\x4f\x55\xed\x87\xdf\x68\xb1\x5f\x3f\xc8\x6e\x91\xb2\xe0\x3d\x61\x12\xa6\x4d\x91\x83\x9b\xa4\xff\xd9\x83\xc1\xc7\x0e\x0e\x3c\xd6\xc6\x48\x15\xf0\x0c\x6a\xe9\x2c\x8c\xf8\x2a\x15\x33\x81\xbf\x94\xea\x55\x12\x27\xe5\x14\xb4\x2a\x24\xc7\x8d\x0a\xc1\xc1\x84\x5e\x96\x65\x53\x47\xe9\x1a\x62\x06\x34\xa8\x5e\x94\xfd\x44\x98\x79\xcd\xc7\x89\xcd\xb7\x74\xa7\xe8\xf4\xae\xc2\x81\x95\x29\xb0\xbe\x11\x77\x03\x70\x9b\xa7\x88\xe6\x46\x33\xeb\x4c\x38\x6f\x1b\xfc\x62\xaa\x3d\xe6\x51\xe7\x2a\xc9\xbb\x3c\x15\x10\x43\x0a\x98\x03\x69\x54\x47\x24\x7e\x3b\x96\xd8\x71\x4f\x15\xa5\x91\x50\xd4\xc0\x55\x7a\xe8\x23\x0f\x58\x33\x7a\xc4\xa0\x3a\x29\xd4\x0c\x45\x49\x76\x9c\x52\xc2\x7b\x1a\xe7\x65\x16\x85\x7d\x9d\x2b\xdf\xe4\x17\x8e\xb2\x54\x6e\xe7\x1c\xf2\xee\xe2\x72\x65\xbd\x48\xc9\x0f\x39\xca\x04\x39\x25\x26\x58\xed\xe9\x90\x72\x8c\x35\x01\xa5\x6a\xda\x37\x10\x4f\x4e\xeb\x0a\x97\xc6\x82\x99\xee\x75\x20\x19\x13\x6c\xbb\xdd\x3a\xbe\xa9\xc2\x7d\x64\x2b\x34\x3b\x85\x12\xd5\x74\x2c\x10\xc5\xb3\xcf\x5b\xbd\xd8\xb1\x62\x8c\x0c\x70\x47\x59\x8c\xa9\x61\x51\x7e\x44\xdd\x1a\x7a\x22\x2b\x49\x10\x56\x70\xf7\xd5\xc4\x4c\x0e\x69\x5b\x6e\x21\xd0\xe7\xa2\xd0\xae\x17\x38\xc3\x35\xae\x2e\xf0\xb9\xb4\x29\xf4\x74\xc9\x8a\xc9\xe0\xa9\xb2\x4c\x0d\xa0\x98\xad\x4a\x9a\xd4\x95\xe2\xab\x6c\x55\x9f\x5a\x58\x74\x34\x92\x2a\xb7\xe7\xb4\xd2\x18\x74\xc0\xa1\x8c\xdf\x3b\xc2\xf6\x43\x6c\x8f\xff\x1d\x23\xc1\x7b\xbd\x0b\x96\x09\x09\x43\x7e\x34\x18\x80\xc2\x57\x33\xfe\xd3\x94\x07\xf0\x72\x23\xde\x68\x8e\xeb\x26\x46\x40\x3d\x9b\xb8\x6d\x23\xce\xcb\x5e\x98\xd4\xe3\x6e\x51\x0f\xd3\xa8\x4e\x2f\xea\xdd\x3c\xdb\x8a\x5d\x28\xc9\x49\xd6\x60\xe3\x7b\x40\xc4\xd0\x50\xd0\x4f\x7a\x47\xd8\xf3\x1d\x13\x67\x57\x6e\xa6\x3a\x78\xf1\x88\x76\xdf\x3f\xe4\x1f\x00\x4f\x6f\xf6\xa4\x37\xcd\x9e\x37\xe8\xfc\xde\x09\xbb\xf5\x75\xd1\x2f\xfc\x67\xf9\x7e\x1d\xa6\x87\xd5\x21\xfb\x42\xd6\xcc\x12\xf6\xa4\xc7\xb7\xf5\x98\x3f\xe0\xef\xeb\x84\x5d\x26\x7b\xf0\x82\x21\x3d\x80\x56\x65\xd5\xfe\x41\x1f\x56\x83\xb1\x0f\x8d\xb0\x43\x8a\xc9\xf0\x7f\x60\x24\x78\xe3\xc8\xf9\xac\x57\x5a\x59\x0c\x29\xfc\x48\x05\x1b\xc0\xf1\x40\x1e\x4c\x76\x11\xc4\x6a\x42\x8e\xd3\x47\xa6\xe2\xf6\xae\xd0\xef\x55\x2e\x2f\xba\xdb\xc7\x29\xe4\x40\xef\x29\x7d\x7c\x33\x0a\xbf\x49\xb9\x94\x9c\x73\x24\xa4\x08\xf2\x01\x61\xac\x70\x19\x96\x85\x71\x4f\x50\x41\x47\x16\xcc\x78\x05\xeb\x87\x18\x69\x0b\x49\x09\x41\x92\x16\x92\x5e\x51\x8a\x7c\x71\x69\x9c\x9f\xcd\x22\x58\x3e\x34\x2f\xda\xdb\xb9\xc1\x17\xe1\xd8\x46\x10\x00\x43\xe4\xf3\x14\x75\x0d\x52\xcf\x5f\xcb\xbd\xb9\x93\x73\xfe\xef\x1f\x62\x87\x9b\xaa\xcb\xfe\xe7\x0f\x05\x9f\x3b\xa4\x7f\xaa\xfb\x70\xd0\x1a\x6c\x03\xc2\x03\xc1\xee\x01\x69\xd6\xa8\xfc\x88\x6b\x93\xf4\x61\xa9\xc2\x54\x7f\x6e\xa3\xad\xcb\x99\x87\xcf\xc6\x21\xce\x2e\xad\xe7\x10\x2b\x37\x1a\x16\xbc\x2b\x72\xe2\xa7\x5c\x38\x88\xb1\x71\xd5\xa2\x5c\x87\x38\x95\x37\x85\x93\x01\x41\x41\xeb\xe8\xe0\x4c\xea\xe8\x8b\x31\x43\xcd\x66\x5c\x08\x9d\xb5\xa6\x3a\x16\x64\x96\xc2\x38\x71\xc8\x56\x07\xe5\x21\x8b\xaa\xe9\xbb\x07\x29\x56\xc1\x7b\x69\x22\xc7\x06\x1a\x3c\xb9\x94\x1a\x81\x83\xd0\x7a\x80\xe6\xab\x6f\x33\x67\x99\xf9\x28\x6e\x33\xad\x46\xb2\x98\x03\xe4\x10\x57\x93\x30\x5d\x87\x88\xb8\xc1\xfa\xdd\xaa\xc1\x43\xc5\xad\x3c\x4e\x95\xe0\x13\x16\xc2\x61\x3c\xc2\xbe\x66\x29\xe8\x2a\xb0\x6c\xcb\x26\xfd\x26\x7a\x0f\x8c\x35\xf8\x10\x44\xc7\xb3\x59\x2a\x82\x71\x47\x1e\xe0\xa3\x41\x30\x36\xce\xc1\xcf\x0f\x33\xec\x58\x7e\x07\x7c\x99\xb8\x4e\xe8\x47\x99\x51\x0d\xbc\x03\xa0\x42\x21\x0f\xd6\x44\x18\xc1\x4c\xd2\x8a\x04\xa0\x97\x23\xba\xca\x17\x97\xc6\xac\x48\xc0\x5e\x21\x5a\xbd\x04\xaf\x91\x28\x86\xf4\x4d\xda\x31\xa7\x99\xa5\xa9\x68\x9a\xa8\xa7\x2e\xa0\xcf\xc8\xc3\x06\x56\xfe\x3c\xdb\xea\x93\xcd\xd8\x42\x08\x89\x1a\xfc\x2a\x0f\xb4\xc3\xd9\x39\x1b\xdd\xbd\x62\xcd\xb5\x9a\xd1\xd9\xb7\x17\x6d\xdc\xec\xcf\xe1\x1b\x72\xc8\x3d\xba\xc3\x8d\xfd\x94\xd1\x94\xdd\xef\x3b\x73\x53\x7f\x76\x84\x3d\x5b\xd1\xdd\x0b\x48\xfd\x09\x63\xf5\x83\x23\xc1\xe3\x23\x43\x5f\xf1\x48\xa4\x99\x3c\x5d\x71\xcb\xe5\xb2\x31\x35\x28\xac\x0f\xc4\xb4\x1a\x8a\x6e\x5d\x2c\x69\x16\x89\xba\x24\x05\x89\xdc\x8c\x44\xd0\xea\x9b\x71\x24\x2c\x0f\x34\x1e\x40\xfe\x89\x00\xaf\x8f\x7c\x43\x25\x9b\x25\x9f\x2e\x12\xbe\xd1\x77\x27\xdc\xc8\xe2\x08\xf5\x06\x90\xbf\x6c\x2d\xeb\x02\x93\x67\xef\x01\x28\x28\xb7\x08\x06\x81\x81\xd0\x48\x33\x88\x8c\x68\x1e\x17\xeb\x05\xef\x66\xa5\xe4\xef\xe1\xe0\xc5\x1d\x62\xfa\x22\xdd\xfb\xa2\x2b\x05\x3a\x29\x5c\xf3\x80\xb6\x5e\xc0\xb3\xd5\xa2\xd9\xcb\x77\xea\x20\x38\xb6\x40\xb8\x96\xd3\x47\x2b\x63\x86\x9c\x13\x87\x21\x86\x2b\xb1\x9d\x65\x11\xe8\xe3\xc3\x24\x01\x36\xb4\x6e\x3a\xe0\x70\x5b\xfb\xd9\xad\x68\x74\x5f\x58\x13\xcd\x75\x75\x12\xfc\xbf\xdf\xa7\x8c\x56\x5f\xd9\x37\xe4\x7d\xd5\x16\x06\x25\xd0\x6a\x9f\xaa\x22\x1a\x59\x49\xb1\x65\xb0\xdb\x33\xfb\x30\xa2\xc8\x41\xf7\x24\x29\x94\x06\xa6\x7e\xf8\x3e\xb2\x3f\x68\x86\x09\xde\x48\xc6\xb6\x61\xd1\x3d\xeb\x16\xda\xed\x9e\x41\xe3\xc6\x10\xd8\x5a\x55\xb3\xbe\x90\x7a\x65\xd6\x09\x4b\x12\x5d\xf4\xf5\xd4\xe0\xfa\x64\xd2\x45\x57\x10\x9b\x0f\x4b\xa0\x24\x81\x62\x0c\xb8\xea\x9e\x22\xde\x0a\x79\xc2\x78\x32\xc4\x2d\x9d\xa4\x05\x42\x05\xd1\x09\xcd\xcd\xe2\x62\xf3\xbc\xc4\x31\x61\xdf\x2f\x97\x5e\x21\xf5\xd5\xd8\x4a\xa9\x90\xfc\x4b\x79\xed\x28\x96\x81\x36\xa2\xaa\x95\xe8\xa3\xc0\x95\xe5\x0e\xa8\xe4\xa2\xfe\xf3\x43\x8c\xc5\xdd\xd3\x61\x27\x96\x1b\xc5\xff\xd2\xa1\xe0\xbd\x87\x16\x97\xd4\x6f\xd7\xd1\x65\x71\x89\xb7\xd4\x0b\xac\x79\x71\x69\x63\x76\x5c\xfe\xff\xb1\x31\xc3\xbc\x54\xb2\x77\xeb\xbd\xd0\xb6\x43\x57\x03\xf9\xd1\xc9\x5e\x98\x2c\x97\x61\x73\x3d\x70\x4d\x3b\xbc\x02\xc5\x35\xc0\x1f\xb9\xdb\x42\x07\xe2\x13\xa1\xaa\x60\x60\x29\xf3\x20\x0d\xb3\x4f\x1b\x9b\x44\xbb\x1d\xd6\xd1\x30\x58\xae\xb7\x3a\x4c\x02\x9c\x8c\x70\x23\x8c\x13\x48\x0d\xa8\x54\x87\xd8\x03\x1a\xb3\xdb\x20\x61\xaf\xc5\xe5\xc0\x51\xb8\x4c\xf6\xaa\x32\x3b\x3a\x07\x2f\x4c\x06\x81\x96\xcd\xc9\x36\x2c\xb4\xb7\x30\x8a\x48\x3e\xd5\xf1\xdf\x8a\xd0\x85\x79\x5f\x2f\x6d\x1f\x29\x9c\x8d\x31\x8c\xa8\xa5\x66\x0f\x81\x69\x15\x21\xfa\xf4\x57\xaa\xb3\x2a\x9f\xfd\x30\x7e\x47\xee\x15\xc2\xad\x96\x6b\x1f\xb8\xe3\xc8\x2a\xbc\x83\x96\xc7\xe9\x92\xdf\x23\x1f\x81\x4f\xa0\xef\x1a\xec\x5b\x33\x46\x81\x05\x60\x72\x8d\x58\x02\xc6\x2a\xbc\x2e\xc1\xe1\x76\xc2\x2d\x70\x1e\x90\xbd\xdf\xcc\xc0\xe7\x13\x4e\x4d\x24\xaf\xfc\x42\x6e\x79\x7d\x94\x00\x10\x51\xc4\x94\x5b\x39\x12\xf9\x18\xf4\x4e\x14\xc2\x9c\x36\x50\x74\x19\x03\x85\xe2\xce\x0d\x4e\xbb\xb5\xf7\x16\x97\xa8\x3f\xe3\x92\xba\x59\x4e\x50\x80\xad\x61\x15\xb2\xb6\x68\x4c\x8b\xd4\x96\x37\x99\x85\x32\x3b\xf4\xc8\x5c\x75\x56\xb9\x2f\x1c\x64\x37\x96\x59\x37\x4b\xb2\x76\xff\x7e\x29\x55\xff\x9b\x83\xc1\x07\x0f\xda\x4f\x90\xee\x74\x75\x96\xa5\x3a\x4c\x8c\x26\x44\xaa\x28\x0a\xbc\xc4\xd4\x3a\x4a\x9f\x02\x3d\x69\x68\x0f\xd1\x85\x0d\xf7\x40\xa6\xab\x25\x1e\xa2\x90\x97\x82\xa1\xf8\xa8\x59\x01\x3b\x84\x66\xb6\x97\x15\x25\x73\xd5\x34\x00\x6c\x4c\x6e\x97\x00\x6b\x08\x0e\x01\x61\x31\xfc\x26\x7d\x09\xdd\x9f\x17\x9c\xce\x2b\x15\x26\xb2\xfb\x15\x31\x3e\x2c\x31\x5b\xf8\xd4\x31\x2a\x1c\xf6\xab\x8e\x6d\xba\xdf\x80\xda\xb8\x96\x15\x22\x75\x81\x49\x10\xe1\xc1\x9e\x31\x52\xa8\x69\xd2\x45\x00\x3c\xc5\x8e\xb4\x10\xba\x03\x09\xce\x70\x27\x2b\xd0\x7b\xf5\x31\xc5\xf7\x87\x25\x79\x2b\xe9\x06\xf5\xe6\x8c\x07\x34\x0c\x6b\x61\xe1\x54\x61\xd0\x50\x29\xfd\x25\x84\x9d\x19\x61\x84\x96\x51\x5d\x90\x42\xc3\x34\x23\xcf\x00\x0e\x93\x38\x43\xb0\x32\x65\x06\xfe\x93\x90\x65\x53\xf7\x47\xc1\x3c\x36\x41\xfd\x12\x26\x3a\x0a\x24\x6e\x91\xde\x14\x28\x11\x0a\x55\x85\x48\x0b\xa1\xc0\x4b\x20\xfb\xbc\x63\xf3\x91\xdb\xd1\x4c\x1a\x71\x3b\x66\xca\xb2\x5c\xe5\x18\x4c\x33\x33\x1f\x36\x50\x85\xe6\x72\x10\x45\xb5\x8a\x40\x09\xce\x12\x94\x46\x82\xee\x50\xe8\xdc\x5a\x86\xba\x8f\xd5\x3e\x85\xb9\x29\x87\xde\x14\xd6\xd3\x22\xc4\x7a\xaf\xd1\xf5\x5a\x6d\x21\x32\x18\x8b\x1a\x20\x11\x30\x0a\x3a\x19\xe1\x22\x86\x84\xba\xa3\x9c\xff\x77\x72\x44\xfd\xb6\x7d\xec\x1f\x29\x16\xcd\x26\xca\x8a\x5c\x17\xfe\x57\x46\x82\xdf\x18\xd9\xb1\x88\xb6\xde\xc6\x2d\x6e\x1e\xee\xc2\x0e\x62\x3e\x42\x47\x5f\x0c\xa4\xda\x95\x30\xb5\xa3\x57\x5c\xf0\xa0\xcc\x7b\x22\x80\x1c\x0e\xea\x50\x21\x93\x1b\x80\x55\x28\xd0\x98\x98\xc4\x51\x38\x6c\xa5\x0d\x8f\x09\x6e\xa8\xa6\xa7\x0d\xbe\xf3\xe8\x40\x71\x60\x69\x8f\xf7\xd0\x71\x67\x65\x9a\x89\x08\x95\xda\x6b\xcd\x58\x0e\x2c\xf5\x08\x24\x53\x86\xcb\x04\x34\xbe\xd7\x7c\x4b\x3d\x70\x8f\x1a\x0d\xe1\xd3\xea\xbd\xe5\x58\xbf\x7e\xb2\xc6\x6e\x14\xd6\x4d\xe9\x7f\xb0\x16\x3c\x5e\xb3\x9f\x28\xed\x98\x96\x3f\x35\xb5\xc7\xa6\xa3\xb8\x68\xca\xeb\xa8\xcf\x3b\x42\x8e\x2f\x2e\x3a\x85\xeb\xb3\x41\x1e\x45\x71\x38\x84\x4f\x47\xfe\x34\x04\xb0\xa1\x85\xb3\xf3\x67\x4e\x41\x5c\x58\x1e\x8d\x35\xf8\xd9\xcc\x28\x31\x4c\x10\xc9\x46\x96\x6c\x80\x60\x61\x4c\x98\x49\xb6\x29\x72\x50\xfd\x9c\x3f\xbd\x50\x9f\x9a\x9a\x9e\x31\x68\x70\xa3\xbb\x24\x2e\x96\xa5\xc7\x5c\x17\xa7\x15\xb9\x20\x2b\xca\x72\x69\xb3\x11\x81\x23\x2a\xfe\xe7\x1a\x7b\x86\x6d\x5b\x5b\x5c\xf2\xff\x43\x2d\xf8\xd9\x5a\x55\xbd\xa2\x18\x93\x0b\xfd\xae\x98\x73\xb7\x8c\xf3\x03\xc6\xd8\x16\xa5\xc6\x78\xd7\xf0\x6a\x8b\x4b\x2e\x5e\xf5\xa0\xc9\x83\xb8\xf2\x48\x74\x81\x42\x4b\x19\x85\x7c\xbf\xe5\xf7\x60\x44\x4f\xfa\x68\x94\xc9\x7a\x51\x5d\x1b\x91\x74\x72\x70\xac\xbf\xaf\x38\x47\x77\x5c\xca\x8c\x51\x31\xdf\x58\x39\xb5\x87\x70\x69\xb1\xa5\xf9\x55\xd6\x2b\xd3\xb0\x3e\x9a\x06\x4c\x46\x58\x3b\xd4\xcc\xf2\x25\x8f\x3d\xbb\x10\x80\xbe\x32\xdf\x02\x43\x42\x1f\xf3\x97\xf9\x6f\xf4\xd8\xb1\x3d\x58\x17\x86\x7c\x1a\x9c\x1e\x5a\xa3\x1b\xac\xe2\x08\x27\xc4\xa7\x20\x82\x7e\x48\x5f\x35\xd8\x5f\xd4\xd8\x0d\xea\x5c\x2c\x2e\x15\xfe\x97\x6a\xc1\xe7\x6a\xd6\x83\x01\xb9\x8c\x94\x84\xe4\xf9\x8c\x1c\x11\x22\xeb\xb8\x82\x89\x42\x50\x2f\x32\xe0\x71\xba\xa5\xd6\x9b\x54\x4f\x90\x66\x42\x6d\x7c\x3a\xc4\xac\xac\xa4\x25\xc7\x92\x68\x53\x86\x98\x4d\xc9\xa3\x16\xb1\xa4\x1b\x68\x14\x2d\x10\xef\x08\x43\x54\xa8\xb9\x30\xcf\xe3\x0d\xc9\x75\x96\x0a\xa5\xc7\x80\x25\x2d\x2e\x35\x38\x9f\x57\x19\x92\xc8\x22\x8b\xc0\x96\x44\x2a\x5c\x29\xdf\x58\xaa\xc0\x98\x61\x41\xef\x59\xe6\x07\xf2\x2f\xd8\xe1\xfa\xfa\x9b\x1a\x7b\xb6\x32\xf9\xba\x6a\xb6\xdf\xa9\x05\xff\xbe\xb6\x38\xec\x95\xa5\x9f\xa9\xdc\x18\x3a\xca\x54\x2b\xa6\x74\x60\x82\xc1\x3f\x74\x53\xc6\x12\x6c\x15\x29\xde\xac\xe7\x69\xd2\xb7\xb5\x59\x84\x45\x37\xd0\x02\x98\xfe\x2c\x71\xc5\xa9\xdd\xa8\xeb\xe8\xf3\xe1\xea\x3e\xb7\xd5\x71\x5d\x4a\x32\x0b\x79\xd6\xed\xe2\xc1\x4b\xb7\xf9\x06\x2d\xe2\x61\xd4\x47\xfe\x4c\x99\x67\xb5\xb6\x48\x8f\xc1\x39\x8a\xff\xb2\xc6\x9e\x59\x39\x38\xfe\xdb\x6b\xc1\x9b\x6b\xcb\x8a\x8a\x04\x0b\xc0\x11\x2e\x2e\x91\x00\x09\x9a\x6f\x48\x3a\x84\x6c\x9e\x64\xa7\x42\x70\x2b\xae\x9c\x24\x7e\x0a\x2f\x30\xe2\x28\x17\x97\x88\x39\x1e\x2c\xa8\xc8\xbe\x6a\x49\xae\x86\x6c\xc6\xf5\xb3\xc7\x27\x5f\x25\x3d\xf0\x77\x1c\x62\xfb\x40\x96\x7a\xd3\xa1\xe0\xaf\x0e\xc2\xdd\xaf\x35\x59\xe4\x7b\x6a\x79\x15\x10\x10\x6c\x51\x8d\x67\xd0\x72\xb4\x4a\x33\xa5\xd2\x03\xc8\xc5\x73\x55\xe9\x7b\x54\xdd\x07\xba\x5c\xa0\xd9\x1f\x40\x9f\x22\xbd\xb1\xde\xa8\x96\x21\x0c\xf1\x25\xf4\x29\x06\xfa\x90\xd9\xbb\xd5\x95\x6c\xf4\x38\x0d\x1e\xbd\xf2\x37\xcb\x72\x3c\x7a\x88\x7d\x5b\xd1\x27\xae\xf6\x49\x8b\x43\x7c\x77\xaf\x69\x05\x92\x9b\x26\x28\x8e\x39\xcb\xf5\xb3\xe5\x04\xb4\x7d\x84\x94\x25\x99\x7c\xc7\xac\xa7\xac\x37\x8e\x81\x45\x85\xd1\x19\x86\xda\x0e\x78\x26\x63\x4a\x6f\x35\x89\x8b\x35\x05\x8a\x40\xf8\x6e\xa6\x4c\x1e\xd2\xed\x2a\x59\x1b\xab\xee\x86\x6c\x12\x97\x20\xe0\xab\xbd\x38\xc1\xdb\x58\xcf\xbc\x12\xd0\xf4\xe4\x23\x1c\x67\x8a\x51\x7e\x44\x61\xd1\x56\x46\xc7\x3f\x33\x72\xab\xd5\xc5\xc2\x55\x25\x00\xd5\x30\x6b\x6d\x37\xad\x55\xd4\x20\xa6\x91\x2f\x91\x6d\x21\x76\x79\xe6\xd1\xb8\x65\xf9\x80\x69\x4f\x3b\x84\x2d\x80\x4b\x7c\xec\x0a\x3b\xe8\x70\x52\xc8\x0f\x2a\x4b\x60\x61\xe9\x6e\x9c\xc0\x3f\xe1\xd8\x75\x96\x05\x28\xf0\x89\x6f\xa6\xcc\x7b\x04\xdc\xac\xd5\x48\x8e\x69\xd0\x28\x92\xae\x25\x2d\xa0\xcd\x11\xa7\xed\xba\x2e\xa7\xe8\x01\x28\xc1\x6c\x6a\xf0\xc7\x37\x31\x66\xb4\x39\xfe\xef\xdc\x14\x3c\x7e\xd3\x82\xd1\xee\x6c\xcf\x21\xec\xac\xa8\x95\x9b\x74\x07\x7b\xf4\x75\x83\xf4\x55\x1a\xa4\x41\x25\xf0\xbf\x87\x41\xfa\xba\x45\xfa\xab\x6e\x91\x1e\xec\x64\xe5\x02\x8c\x6d\xa0\x04\x88\x19\x05\x9f\x6d\x0d\xc7\x61\x6e\x35\x92\xfb\x76\x18\xf6\x38\xb1\x51\xa4\xb5\xb4\x93\x12\x1a\x42\xf4\xd0\xe4\x23\x78\x23\xe8\x8a\x41\x55\xa8\x49\xf9\x06\x61\x22\x5f\x34\x87\x6c\x27\x5b\x10\xb0\x31\xc0\xc3\x45\xe3\x95\x7e\x21\x72\x35\x9c\xab\x2c\x15\x4a\x8f\x87\x1b\x4a\xa9\x55\x75\xb3\xd5\x7b\xc3\x1d\xae\xd8\x53\x9b\x97\xa7\xdf\x5f\x5c\xda\x49\xb5\x2f\x49\xf4\x9e\xb4\xfa\x96\x86\x9e\xba\x7c\xad\xf4\xf8\x5f\x2d\xf7\xbd\x2b\xb2\x19\x7c\xeb\x7e\xf6\x0c\x77\x14\xfe\x5f\xef\x0b\xbe\xb2\x8f\x6c\x95\x6a\x64\x15\x3f\x75\xb3\x1c\x75\x88\xd8\x35\x36\x3c\x30\x84\x21\x9d\xd0\x7e\x8d\xcb\x57\x61\xb0\x1c\x1a\x64\xa0\x62\xf2\x34\x94\xf3\xc0\x99\x27\xad\xe3\x32\xa0\x5e\x43\xcd\x0d\x63\xfa\x52\x88\xe1\xd6\xdb\x80\x8f\x6a\x8c\x6c\x6d\x7d\x1b\x1b\xe7\xc1\x12\x90\x44\xab\x7f\xa3\x72\x5f\xda\x16\xdb\x2c\xb5\xa6\x43\x5f\xc3\x42\x9f\xd4\x02\xc9\x7c\xb5\x72\x0e\x71\x96\xf2\x99\xfa\x92\x8a\xe3\xbd\x10\x9c\xc7\x59\xbc\xaa\x96\xc7\xad\xdb\x5c\x92\x47\x82\x18\xb7\x37\xb5\x4d\x51\x0a\xcd\xa2\x81\x5a\x4a\x59\x3a\x86\x78\x88\x5f\x8e\x9d\xaf\xd8\x89\xd0\xda\x8c\xd7\x3b\x47\xd8\x73\x6d\x3d\x16\x86\x5e\x9c\x97\x97\x76\xe1\xff\x4d\x2d\xf8\xcd\x9a\xed\xbd\x8e\x51\xe2\xd5\xe0\x87\x6e\x12\x96\xad\x2c\xef\x10\x7d\x21\xb5\xa6\x6c\xa0\x69\x74\x24\x03\x4e\xda\x46\xcd\xe5\xf2\xd6\x46\x6f\x8f\x35\x58\xec\x92\xee\x86\x96\x80\x8b\x6b\xad\x55\x0b\xae\x24\xc4\x07\x2e\xe5\x26\x5c\x8b\x75\x5a\xd8\x09\xbd\x33\xea\x6e\xf3\xf5\x56\x9c\x8b\xcd\x30\x49\x26\x76\xd0\xde\x7c\x78\x3f\x7b\x2e\xf1\xcf\x67\xb3\xf2\xbc\x08\xa3\xfe\xbc\x62\x79\xfd\xef\xde\x1f\xbc\x71\xff\x76\x6f\xad\x68\x57\x54\x24\xa5\x7d\x1e\xb6\xe5\x64\x91\xc3\x86\x08\x13\x52\xce\x0f\x71\x0c\x51\xf7\x33\xa9\x77\xa2\xb8\xc8\x45\x3b\xcc\x23\xa8\x86\x6a\x56\x8a\x3e\x50\x8d\x4c\xa4\x59\x59\xb7\x94\x24\xca\x98\xde\x93\xac\xac\x64\xeb\xd0\x26\x60\x71\x56\xfa\xc6\x43\x04\xc0\xe5\x32\x2c\x25\xaf\xb4\x2c\xca\x23\x05\xbf\x4f\xf1\x58\x16\xa3\xd0\xcd\xb3\x6e\x08\x37\xd9\xf2\xf9\x07\x41\x05\x8e\xca\x6f\xac\x21\x2e\x0b\xc4\xd3\xd6\x20\x09\xbd\xbc\x9b\x15\x70\x74\xba\x42\xae\xb6\xd2\xbc\x63\x07\x2d\x25\x9a\x49\x11\x46\x73\xd5\x16\x29\xc0\xe3\xd8\xe2\x7a\x1a\x55\xa4\x68\x03\xc0\xe2\xf8\xf5\x83\x5a\xa0\x9b\x2b\x57\x7b\x65\xae\xc3\x35\x48\xaa\x6a\x25\x0b\xbd\x21\x80\xd9\x0b\xa4\x68\x9b\xaa\x0d\x0b\x03\x2a\xd7\x44\xa7\x10\xc9\x86\xd0\x1a\xcb\x06\x9f\x6f\x0b\x34\xeb\x52\x00\x5b\xd1\xeb\x08\xb4\x79\x58\xe3\x52\xc3\x88\xac\x46\xed\xd3\x77\xca\xd6\xd1\x6d\x37\x38\x49\xae\x8b\xb0\x25\x50\x70\x82\xbc\xad\x6b\xb1\x49\x73\xee\xda\x47\xfe\x6b\xcd\x89\xf6\xea\xc2\xf5\x65\x10\xf3\xb3\xa2\x94\x6c\x29\x10\x15\xff\xa7\x6a\xc1\x3f\xf7\x9c\x47\xda\x4a\x06\x29\x30\x11\x8d\x10\xe2\xa9\x2c\xcf\x7d\x75\xb2\x89\x93\x91\x94\x27\xe4\x5d\x62\x00\xb2\x1c\x9d\xc7\x31\x25\xa4\xbc\xbf\x4a\x23\xb3\xac\x52\x12\x0e\x4a\x1f\x0d\xbe\x61\xa9\x92\x5f\x28\x8d\x49\xe3\x92\x37\xd2\x89\x53\xf9\xff\xe1\x96\x13\x34\xf4\x36\x8f\x2d\x30\xf9\xd4\xbf\x5b\xb9\xb6\x1d\xe9\x84\x5b\xda\xdc\x23\x09\x36\x01\x3d\xa2\xab\x58\x9c\x4a\x02\x10\x6f\x54\x42\xba\x4f\x31\xd9\x80\xff\x52\x55\xc9\x58\x27\xd6\x50\x95\xd8\xb1\x3d\x55\xf3\x47\x27\xd8\x7d\x57\x1c\x19\xfe\x4d\xcb\xe7\xce\x2e\x03\x88\xe0\x52\x9e\x75\x0b\xff\x3d\x27\x82\x87\x2a\xcf\x50\xd0\x96\x0f\xeb\xf8\xd4\xc2\xa2\x59\xa6\x04\xd1\xc8\xfd\x9f\xcc\xc3\x56\xc9\x67\xd1\x74\x34\x37\x31\xf1\xda\x22\x4b\xeb\x08\x51\x08\xa6\xa3\xb1\x4a\x52\x9b\x97\xb2\x0d\xf6\x2c\x93\xd9\x4f\xb6\x26\xf2\x32\x16\x85\xff\x6a\xf6\xf0\x76\x06\x8a\xab\x1b\xe0\xb9\xfc\x9e\x2c\x4b\x58\x97\xed\x0f\xd3\xfe\xb9\x96\xdf\xb6\x09\xee\xab\xd8\x2b\xd8\x83\x4f\x4d\xbb\x6c\x83\xb1\xae\x19\xdf\xda\x13\x4f\x65\x63\xb6\xfb\xfe\xef\x1d\xd8\x96\xf9\xfc\xb9\x03\xc1\x4f\x1c\x18\xfe\x8e\x03\x34\xa1\x52\x78\x61\xd0\x6f\x99\xf1\x56\x2f\x07\x56\x5f\x0b\xdb\x31\x68\x5c\xd1\x04\x4f\xb7\xae\xee\x19\x72\xff\xca\x16\xdc\x23\x8f\x0d\x4c\x99\xa0\x1c\x52\x41\x72\x9a\x51\xc0\x6a\x4a\x32\x98\x63\x6c\x6a\x8c\xaf\x20\x67\xbc\x32\xa7\x5d\x11\xe0\x70\x90\x89\x0f\x95\x8b\xc8\xca\x09\xc0\xfd\x44\x20\x2a\xf9\xb4\x19\x26\x61\xde\x60\x5c\xfe\x37\x0f\x95\x50\xb3\x86\x62\x94\x31\x58\xb6\x73\xd1\x4d\x20\x95\xb7\xe1\x95\xb4\x51\x4e\x0f\x04\x2b\xb2\x1d\x2f\x32\xc4\x47\x83\x99\xca\x5a\xd8\xb7\x51\x54\xbe\x8e\x53\xf3\xe3\xbc\xd1\x68\x8c\x35\xd8\xf4\x18\x5f\x29\x44\xb9\x32\x87\xb5\x2c\x0b\xa2\xf6\xd8\x21\x93\x33\x42\x67\x80\xd1\xd8\x6e\x88\xab\xaf\x4d\x99\x96\x6c\xc9\x4f\x85\xcd\x35\xac\x6f\xc3\x81\xbe\x08\x75\xe3\x1a\x45\x14\x2b\x70\x56\xb9\x13\x76\x71\x91\xd5\x0c\x03\x5f\x4c\xc3\xc4\xb5\x1e\xfc\xc8\x6c\x0d\xf5\x55\x83\xcd\x8c\xf1\x95\x4e\xd8\x55\x63\x43\xb9\x8f\x16\x18\x86\xb8\x0e\x50\x87\x64\xa2\x43\x3f\xa2\x38\xe7\x02\xdd\x98\x0a\x95\xf1\x26\xcd\xd2\x7a\x9c\x46\x62\x8b\xaf\x8b\x3e\x56\xa5\xdc\x5b\x28\xd2\x11\x58\xca\x4e\x83\x9f\xcb\x29\xf5\x4b\x57\x47\x25\x02\x3e\x0b\x04\x19\xe1\x5d\xde\x09\xbb\xbc\x0c\xdb\xb4\x66\xc3\x76\x20\x29\x0d\x91\xdd\x51\x5d\x51\x7a\x0d\x82\x5e\x65\xb6\x3d\x01\xc7\x8b\xbc\x89\x9c\x9d\xc2\x61\x96\x9f\xcf\x6e\xc0\x80\x57\xc8\xfa\xe8\xdf\xe8\x5c\x82\xef\xa9\xb1\x83\x64\x23\xf2\xdf\x5e\xdb\x3e\x93\xea\x15\x9c\xf7\xe0\xb3\x5e\x64\xdc\x3d\xc2\x8a\x29\x4a\x76\xb6\x97\xaa\x8c\x5c\xb4\x15\x50\xa8\xd0\xc6\x12\x85\x8b\xc7\xe5\x95\xac\xc5\x3d\x13\x37\xee\x82\x78\x58\x1f\xb9\x92\xa1\xf5\x42\x5f\xb0\x80\x9f\xa1\x16\xe9\x62\xba\x9e\x66\x9b\xe9\x69\x14\x69\xf0\x92\xc5\x3c\x77\x2c\x62\xfb\x44\xda\xeb\xf8\x0f\xdb\x64\xf8\x1c\x3b\x73\x4d\x67\x8a\xbd\x90\x1d\x24\x75\x86\x7f\xab\x7f\x20\xca\x7a\xab\x09\xc6\x1f\xa7\x80\x49\xc5\x5e\xc4\x0e\x75\xe2\x14\xd7\x6f\x68\x1e\xe5\xaf\x67\x87\x94\x2c\xed\x3f\x6f\x07\x16\xfd\x31\x76\x4b\x37\x2c\xa5\x54\xb5\xf4\xd5\xa0\xf5\x9f\x1f\x61\x2f\x74\x0e\xad\xe8\xac\x8a\x28\x12\x91\x06\x12\xf0\x7f\x6c\x24\xf8\xc1\x91\x9d\xcb\x58\xf0\x12\xe4\xfa\xa7\xad\x9b\x61\xca\x55\x71\x9b\xb9\xa4\xe4\xe5\x84\xea\x4e\x31\xc9\x17\xfa\x5d\x71\x46\x6e\x2c\x49\xeb\x0d\xde\x3b\x9e\x52\x38\x6b\x8a\x6a\x29\xb8\xe3\xc5\x2a\x8c\xa7\xba\x6e\x8c\xdc\x08\xf0\x02\xd4\x01\xf5\xd9\x7a\x9c\x46\xe3\xdc\x00\x31\xe3\xe5\xa2\x72\x54\x48\x42\x04\x8a\x5d\xbc\x35\x6c\xf7\xaa\x86\x4b\xe1\xd4\x76\xad\xf7\x70\xbf\xd6\x49\x06\x77\xfb\xb4\x2a\x78\x99\xf7\x28\x4e\x42\x4b\x8d\xa8\x01\x84\xb7\xc4\xae\x67\x1a\x97\x14\x71\xa4\x8c\x9c\x3a\xda\x83\xa8\x8b\x6a\xb7\xc7\x75\x9f\xc7\x5c\x46\xfa\xad\x23\x95\x80\xcd\x38\x2d\xeb\x59\x5e\xc7\x3d\xe7\xff\x81\x94\xc7\xb7\x7f\xef\xc4\x57\x84\x65\x05\xb8\x89\x54\x77\x61\xaa\x80\x92\x48\x45\x82\xe0\x0d\xb6\xe7\x1f\x0e\x3a\x54\x48\x9b\xca\x2f\x4b\xcd\x0c\xd8\x02\x81\x71\x28\x78\x73\x2d\x4e\x22\xb4\x40\xf6\xcf\xb5\x80\x5c\x8b\xbc\x13\x97\x25\x4a\xdf\x86\x7b\x1c\x0a\x6f\x48\x07\x88\x98\x00\xa8\x02\xee\x97\x3a\xd4\x3f\xa7\x3a\x6a\x3f\xa2\xd3\x37\x3d\x26\xbb\xa3\x8b\x9b\x4f\x87\x7e\x3c\xf0\x39\x3c\x69\x34\x1a\x08\x10\x95\xe5\x90\x74\xdb\x59\x09\xce\x6e\x86\xb4\x58\x92\x07\x3f\x43\x04\xc5\xa5\xf7\xa9\xf1\x09\x3b\x99\x35\xaf\x25\x1f\x7b\xca\x54\xdb\xd3\x4e\xc0\xec\x16\x56\x8b\x23\xdf\xa1\x41\x9c\x1d\xee\x84\x5b\x0f\x40\x52\xf0\xe1\xd4\xec\x76\x76\x53\x27\xb6\x29\xd4\xd0\x52\xef\xdb\xc7\x9e\x3d\x94\x6d\xf0\xbf\x65\x5f\xf0\x77\x23\xc3\x39\x0a\x87\x6d\xa4\x23\x70\x0d\xf8\x46\x27\xba\x87\xaa\x75\x58\xc8\xe9\x6d\x58\xc8\x76\x1e\xa6\xbd\x24\xcc\x5d\x16\x05\x78\x12\x80\xae\x69\x82\x9d\x06\x7e\x8f\xae\x8b\x7e\x9d\xb4\x9a\x61\x9c\x17\xe8\xdb\x06\xa9\xfd\x89\x10\x20\x52\x24\xaa\xe4\x44\x5a\x62\x8d\x60\x67\x80\x52\x68\x5b\x1d\x2d\xd7\x44\x1f\x24\x65\x78\x08\x29\xf9\xd2\xb8\xdb\x4b\x94\xaa\xb5\x10\xdd\x10\x14\x0a\x61\xb3\xcc\xf2\xc2\xa0\x87\x61\x7d\x36\x0c\x02\x09\xd6\xbd\x5c\x23\xbd\xca\x9e\x22\x4f\x79\x2d\x99\x63\x18\xff\x1e\x79\x63\x7b\xab\x3d\x87\x1d\xbc\x1d\xc5\x3b\x77\x0b\xbe\x82\x1d\x24\x9f\x26\xff\x1a\xdf\xe4\xce\x09\x44\xf8\xc2\xca\x09\xfc\xc7\x8c\x29\x0e\xfa\x5c\x6b\xf8\x75\xff\x1a\x36\x92\x66\xa5\xff\xd4\xc9\x7a\xb7\xb2\x7d\xb7\xe7\xa2\xe5\x4e\x8a\x64\x42\xa8\xc7\x43\x7b\xf5\x5c\x76\x28\xed\x25\xe0\xb0\x5e\x19\x52\x97\xed\xcf\x52\xf1\x74\x0a\xab\x1f\xda\xb7\x23\x46\xc0\xdb\xf6\x05\x7f\x36\xb2\xfd\xfb\x61\xc2\xa3\x16\x63\xb6\x13\x2a\xa4\x1c\x01\xc7\xc3\x75\xa7\x84\xfa\x30\x0c\x01\x15\x23\x28\x28\xa8\xfc\x0f\x61\x57\x05\xa8\x94\x61\x9b\x9f\xb9\xb8\x7c\x61\x1b\x81\x13\xee\x3e\x6d\xa7\x0b\x86\xf7\x22\xb0\x88\x90\xf2\x96\xee\x84\xdd\xa0\xc1\xe7\x93\x22\x1b\xb7\x6d\x57\xe6\x3a\xd7\x7a\x52\x0d\x42\x33\x20\x8e\x01\xe9\x8a\x54\x1c\x10\xe9\x9f\xe1\x92\x44\x99\x51\xf2\xd2\xa3\x69\xc6\x53\x51\x28\xa6\x5c\xeb\xd3\xc7\x60\x80\x60\x69\x21\x72\x6d\xfb\x23\x80\x95\x12\xef\xf0\x55\x61\xec\x3d\x59\xae\x64\x2b\x47\x2a\x18\x47\x0f\x24\x32\x6a\x66\x85\x53\x2b\x99\x9d\x01\x84\x52\x91\x1b\xa4\x2b\x92\x2f\xde\xc9\xad\xb0\xcb\xf6\xc3\xbd\xfb\xf4\xed\xcf\x35\x95\x38\xe2\x35\xec\x91\xa7\x4a\x4f\x34\x2f\x87\x01\xa2\x41\xb8\xb5\x83\x68\x20\xaf\xdb\x38\xdd\xe9\xba\xbd\x95\x7c\xda\x9c\x39\x93\x77\x70\xb8\xb5\xdb\x1d\xfc\x1c\x76\x90\xd8\x21\xf7\xeb\x67\xb1\xfd\x65\x5c\x26\x95\x3a\x5f\xc7\x9e\x69\x94\x69\xd8\xe5\xa7\x5a\x8f\xb6\xc9\x6e\xb0\x6a\x7f\x1a\x45\x9d\xb7\x78\xec\x46\x75\x13\x37\xe5\xfc\xf5\x9e\xf0\xda\x4c\xb0\xe6\x53\x35\xdc\x65\x98\x63\xd8\x14\x76\x3f\x9e\x27\x27\x40\x32\x35\xe0\x9a\xe2\xae\xc7\xc7\x6f\x61\x07\x30\x79\x93\xff\xa1\x5b\x82\xf7\xdc\x82\x7f\x93\x1c\x75\xae\x2b\x52\xc0\x50\x87\xec\xd0\xf2\xb9\x62\xba\x49\x5c\xa6\xc7\xc4\x76\xa0\xf1\x8a\x10\xf0\x34\xaf\x6c\x17\xd1\x42\xce\x1c\x63\x75\xbe\x5a\x64\x29\x76\x31\x8e\xe6\xa4\x88\x5f\x64\x9a\x21\x5b\x3c\x39\xce\xe3\x86\x68\xf0\x90\x4f\xcf\x9a\xec\xc6\x05\x5f\x13\x5b\xca\x2d\xa6\xce\x7b\x79\x3c\x27\x3b\x4a\xc9\xbd\xbb\x61\x4e\x08\x39\xf7\x66\x49\x98\xb6\x79\x2a\xca\x89\x5e\x9e\x34\x96\xe4\x0b\xca\x43\x2c\xcb\xd6\xb9\xe8\x84\x71\x32\x87\xb2\x42\x18\x27\xda\x95\x6a\xbb\x5a\x64\x21\xac\x86\x2c\x56\xbc\xae\xc3\x10\xe6\xb4\x5f\x4e\x25\x53\x0e\xc2\x34\x71\xf4\x59\x16\x25\x1a\x07\x52\xf0\x46\x19\x4c\x70\x3e\x35\x39\x33\x3b\xce\x0b\x4a\x14\x3a\xd3\x98\xe2\x0f\x9d\x3f\xbd\x20\x9f\x3e\xd2\xe0\x75\x1e\x77\x37\x66\xa1\xbf\x8b\x4b\x1b\xb3\xe0\x00\x34\xbc\xa7\xd8\xc9\xc5\x25\xfc\xe4\x98\xfa\xe4\xd8\xde\x3e\x69\xc6\x51\x2e\x87\xb3\xb0\x78\xf2\xfc\xce\xc5\xa1\x44\x9d\x77\xc2\xa6\x2c\x7f\x66\x7e\x61\xb7\x29\xc4\xcf\x64\xc1\x3a\xef\xf5\x60\xc5\x53\x7e\xf1\xe2\xe2\x49\x6d\x6b\xca\x36\x0b\xde\xeb\x76\x29\xda\xc3\x9a\x1e\x0c\xfc\x6d\x8b\x2d\x3e\x7a\x22\x1e\x7b\xf5\x43\x93\xf5\xe3\x61\xbd\xf5\xc8\x1b\xee\x7a\xac\x7e\x42\xff\x98\xdd\xdb\x8f\xa9\xe9\xc7\x6e\xa7\x1e\xcc\xe8\x2e\xcc\x5c\xc3\x3e\xcc\xe8\x5f\x33\x7b\xe9\xc4\xac\xee\xc4\xec\x35\xec\xc4\xac\xdb\x89\xbb\x8e\x87\xab\x8f\x0c\xef\x97\xd5\x95\xa3\xba\x2b\x47\xaf\x61\x57\x8e\x5e\x6e\x57\xe2\x62\x35\xc5\x6d\xbb\x7c\xcf\xd9\xa9\x49\xc9\x28\xc0\x5f\x33\x1c\xb9\x50\x75\xfc\x41\x58\x08\x26\x67\xa6\xa7\xee\x3c\x3a\x35\x39\x3b\x83\xd0\x71\xc7\xef\xbc\xab\xae\x9f\x4d\x05\x54\xdf\xd4\xa4\x5d\xe3\x6e\xf5\xd0\x37\x33\xe6\x9b\xe1\x6d\x0f\xb6\xd5\xcc\x45\x14\x97\xcd\x30\x07\x82\x86\xbf\x38\xa4\xf1\xa6\xef\x87\xce\xe0\xab\x47\x4f\xcc\xc1\x8a\xc1\x1c\x8c\x9e\x98\xc3\xbf\x67\x1e\x1b\x3b\xf1\xe8\xd1\x87\xa6\xea\x47\x1f\xa1\x97\xb3\x8f\x3d\x7a\x6c\xf4\xc4\xdc\xe4\xd4\xd4\xa3\x30\xad\xf8\x7c\x4c\x7f\xfa\xe8\xcc\x43\xb3\x77\xaa\xc2\x33\x8f\x3d\x3a\x23\x0b\x3f\x34\x59\x3f\xfa\xc8\xa3\x0f\x1d\xbb\xcb\x2d\x3d\xf5\xd8\xa3\xa3\x27\xe6\xa6\xa7\x66\xa6\x1e\x9d\xba\x6b\x72\xf2\xd1\x99\xa3\x0f\x47\xb2\xc9\x87\x23\xf9\x6e\xec\x76\x85\xda\xd7\x07\x1c\xb3\x28\x6e\xcb\x91\x18\x3a\xdc\x01\x08\xbe\x38\xe5\x75\x5e\x14\x72\xbd\xf8\xc5\xc6\x72\x83\x17\x19\xc4\x82\x16\xa2\xd9\xcb\xe3\xb2\xaf\x86\x6d\xae\x03\x6b\xd4\xd0\xde\x43\x75\xfe\xc8\x89\x87\xa3\x37\x4c\xeb\xbf\x66\x61\x17\xac\x89\xad\x66\x96\x64\x39\xac\xc1\x9a\xd8\x0a\x23\xd1\x8c\x3b\xe0\x42\x9e\x64\x39\x6f\x66\x11\x29\xef\x83\xdb\x4e\xc3\x7f\x73\xc3\x1b\xb9\xed\xc4\x28\x6d\xb0\xf9\xfa\x69\x39\xa7\x8f\xda\x3f\x8f\xc9\x81\xd6\x79\xde\x5e\x35\x8d\x9d\xbf\xf7\x9e\x81\x46\xf2\xf6\x2a\xb5\x96\xb7\x57\x47\xa7\x8f\x1e\x1d\xa7\xff\x1d\x97\xab\xbe\xda\x2f\xc5\x1c\xc4\x34\x1c\x9b\xe5\x22\x95\x9f\x45\x7c\x35\x4e\xc3\xbc\xcf\x41\xc1\x57\xe7\xdd\xb0\x28\x36\x33\xd8\x16\x69\x1f\xf4\x6a\x10\x73\xa4\x2e\x32\x79\x29\xca\x39\x94\xff\xba\x7b\x6c\x7a\x72\xf2\x58\x7d\x72\xaa\x3e\x39\x1d\x54\x2e\x8d\x56\x2f\x49\xea\xf0\x41\x9c\xca\x1b\x64\x66\x66\xe6\xb8\xac\x8a\xbc\x7a\xa1\x3a\x85\xbe\xe0\x56\x39\xcd\xd3\x22\x18\x4a\xa7\x41\x45\x0a\x84\xfa\xa4\xfa\x14\xe6\xa1\xd3\x0d\x4b\xd0\x5c\xc0\xa6\x58\x96\x12\x83\xa9\x9c\x78\x03\x1c\x85\xac\x41\x8f\x04\x42\xb1\x2b\xc3\x99\x9a\xad\x4f\x4d\xd7\xa7\x8e\x5e\x98\x3a\x3e\x37\x33\x39\x37\x3d\xd9\x98\x9c\x9c\x7c\x55\x75\x70\xf2\xf3\x3a\x7c\x6e\x06\xe7\xc8\xf5\xef\x1a\x61\xb7\xef\x45\x35\xea\xff\x59\x2d\xf8\x62\x6d\x4f\x4a\xd4\xa2\xcc\xba\x28\xc0\x99\xdc\x95\x3c\x12\xcd\x0c\x40\x1b\x8a\x52\x74\x51\x93\xd2\xcd\x7b\xa9\x06\xed\x55\x4e\x0d\x2a\xf0\xa9\x12\xca\xa7\x79\x1e\x58\x05\x34\x33\xa3\x32\x25\x84\x6c\xf3\xda\x8b\x2a\x97\x27\xa6\x80\xe4\xf3\x84\x6f\xb3\x19\x97\xcd\x35\x51\x40\x64\x36\xc6\x07\xe5\x1d\x80\x7c\xc3\xd6\x8d\xe2\x25\x6e\x81\x54\x26\x22\x5b\x54\x22\xb4\x89\xaa\xd5\xda\x4d\xc1\xa4\x73\xf1\xd8\x1d\x03\xbd\x90\x96\xd7\xca\xbc\x07\x78\x2b\xda\x50\xd3\xe0\xa7\x01\xb2\x15\x3d\x61\x56\xe3\x28\x12\xa9\xab\x0c\xfe\xfe\x5b\xd9\x98\x9d\x49\xab\xdb\x05\x76\xf5\x7c\x96\x24\x71\xda\xbe\x08\x4a\x9a\x93\xa1\xe8\x64\xe9\xb2\x28\xfd\x3f\xf4\x83\x7b\x00\x2e\xb5\xcc\x94\x67\x0b\x29\x98\x0a\xf4\x0b\x24\xcf\x0d\x79\x5e\x22\xf8\x0a\xe4\xde\x1c\x6b\x23\x9d\x8f\x6b\xb4\xff\x3e\x9f\xfd\x3a\x03\xa1\x68\xb9\x97\xb7\x85\xff\x0b\x6c\xaf\x09\x60\x7b\x65\x9c\x34\xe2\xb4\x2c\xca\xbc\xb1\x98\x96\x8a\xa5\x0e\xbe\x95\xa1\xdd\x0e\xfd\x4d\x53\x9d\x26\x04\xa3\xfb\x14\xbe\xa9\xce\x49\x6f\xc2\xfa\xf5\x38\x31\xf9\x3c\x78\xe9\x4a\x82\x46\x40\x7e\x0a\x2f\xd2\x2d\x16\x61\xa8\x1e\xfd\xa3\x8b\xa9\x24\x02\xe4\x91\x18\xa6\x3c\x5c\x2d\xb2\x44\x4a\xf3\xd4\xa3\x51\xb1\x35\xc7\x8f\x8e\xa1\x82\xdc\x4d\xf5\xa9\xa6\x13\xf3\x61\xca\x72\x53\x93\x5f\x37\x66\x2d\xf9\xff\xcb\xde\xbb\xc0\x49\x92\x55\x75\xc2\xbf\xc8\xaa\xae\xae\xbe\xcd\x43\x42\x17\x56\x5d\x97\x6b\x0c\xd8\x5d\x43\x65\x56\x3f\x66\x7a\x66\x6a\x86\x81\xea\xaa\x9e\xe9\x62\xba\x7b\xca\xaa\x9a\x19\x61\x76\xa4\x23\x33\x6f\x66\xc5\x54\x64\x44\x4e\x44\x64\x55\x27\x8f\x95\x97\x08\x8a\xf2\x90\x87\x16\x1f\x30\x80\x22\xa2\x08\x0a\x82\xac\x0a\x32\x80\xa8\x88\x08\xac\x0f\x44\x45\x10\xd6\xe7\xee\xba\x8a\x7e\xee\xe0\xee\xef\xfb\xdd\x73\xce\x7d\x45\x66\xbd\x7b\x18\xf4\x6b\x14\xba\x32\x1e\x37\xee\xf3\xdc\x73\xcf\xe3\xff\xa7\x70\xfc\x63\x72\x3a\x9d\x0f\x2f\xdd\x91\x58\xb0\x2a\x39\x3f\x56\xe3\x33\xa5\x8f\xc1\x7b\x71\x83\xac\x86\xb8\x32\xcc\x27\xeb\x7d\x9e\xa5\xbd\xa4\x89\x63\x84\x59\x71\x64\x5b\x92\xd5\x39\x6e\x18\x3f\xb4\xa1\xff\x58\x8d\x9f\x41\x93\xdc\xb4\x82\x67\x45\xbb\x3e\xd9\x39\x4e\x1e\x7b\xe2\xa4\x46\x63\x38\x79\xec\x89\xca\x4c\x51\xa4\x45\x18\x0f\x0c\x0a\x42\x88\x9a\x74\x3f\xe2\xb3\x80\xa9\x85\xd3\x48\x76\xf5\x51\x38\x64\x10\xaa\x34\xf5\x11\xb2\xc0\xc8\x93\x55\xb3\x17\x8b\xe6\x84\x19\x31\xf4\x0d\x87\x3c\x11\xeb\xf0\xb6\xca\xe5\x25\xda\x1e\xf0\xa9\x00\xf0\x37\x04\x8a\x75\xc2\x6c\x15\x8d\x42\xc8\x2a\x45\x47\x23\x1c\x4c\x8c\x9e\xc9\x65\x3f\xc5\x61\x2f\x41\x84\x48\x2a\x17\x82\x35\xa9\x81\xd0\x18\x02\x29\xb5\x26\x0c\x7d\xc2\x8c\xd1\x51\x08\xa7\xc3\x23\x47\xc1\x63\x11\xe6\x85\xec\x6f\xb8\xba\xa4\xa9\x57\xa8\x82\xee\x74\x4b\xc9\xf3\x0d\xe9\x49\xa6\xde\xba\xd2\x14\x9c\xad\x5a\x56\x17\x8d\xb4\x03\x09\x1a\xe6\xeb\x0a\x90\x36\x13\xa1\x3c\xc4\x51\x65\x8a\x2c\x4c\xf2\x88\x88\xf0\x08\xea\x19\xd2\x52\xc4\x1a\xc4\x47\x42\xec\x2a\xe4\x34\x86\x52\xb2\x4c\x0c\x69\xa0\x26\xbd\x68\xc6\x7d\xdd\xdd\x4e\x85\x15\xf2\xbb\x0a\x4d\x43\x5a\xa7\xac\x2d\x30\x34\x3d\xaf\xf1\x19\xcd\x4a\x05\x97\xa3\x0e\x65\x22\x00\x3f\x47\x9e\x47\xf5\x28\x06\xbe\x0c\x4d\xde\x66\x82\xc9\x30\x52\x4d\xab\x6b\x38\x71\x20\x5d\x0c\xa3\x2b\x2c\xd0\x2a\x39\x49\xd0\x62\xaa\xdc\x6b\x88\x40\x26\x8f\x44\x88\x15\xd6\x0a\xa3\x98\x58\xfa\xf2\xd4\xe0\xde\x47\x09\x1c\xea\xd7\xac\xe2\x35\xca\x46\x11\xae\xc2\x03\x90\x28\x0c\xd8\xde\xaa\x96\x7d\x0b\x2c\x0d\xba\x13\x7a\x59\x49\x8e\x28\xcf\x7a\x5d\xc4\x02\xde\x15\xef\x87\x9e\x18\x28\xa5\x41\x7c\xba\xae\x74\xf6\x81\x83\xec\x51\x1d\x47\x3e\xf8\x6f\x3b\xb8\x5f\xf9\xfa\xe5\xb1\xe1\xf2\xd5\x99\xa8\xb9\x91\x9f\x75\xe1\x4c\xbf\xa6\xca\x6d\x16\x97\x43\x54\x96\xe5\x49\xa9\x12\x0a\x6b\xc6\x8e\x7e\xa3\x35\x6d\xc9\xd5\xbd\x4b\xcb\x66\xba\x9e\x0c\xc8\x4b\xc8\x78\x55\xb2\xba\x24\xaa\x71\x94\xa4\x00\x1d\x94\xa9\xc7\xff\x95\xc8\x54\xe8\x59\xa9\x80\x75\xc9\x5c\xad\x45\x01\xa7\x60\x60\x5c\x6a\xa0\xa0\x0e\x17\xa3\xf0\x36\x6c\x98\xe5\xe6\xa4\xb9\x18\x18\x44\xcc\x0b\x4d\x78\x5d\xce\x1c\x79\xc6\x05\xe1\x5b\x7a\x0a\xd5\x23\x59\xbd\x38\x6c\x08\x92\xc2\xb2\xb5\x5a\x50\x83\x87\x4e\xcd\x43\x48\xf4\x81\x52\x01\x97\x57\x80\x20\x2f\x52\xf2\xba\xb9\x65\x4f\xf2\x62\xa5\x97\x97\xf2\xf2\xb5\xe4\xbe\x0e\xab\x9e\x66\x51\x3b\x4a\xb6\x9c\x8c\xf6\xf7\x39\xc5\xec\x22\x3d\xd9\xe0\xa2\x60\x5f\x3e\x30\x94\x73\xda\x61\x00\xf3\x3f\x74\x20\x78\xb2\x73\xc5\xe6\x2c\xd4\xb4\x58\x1a\xde\x48\x3e\xca\x6f\x15\x85\xe6\x0d\xae\x6d\x78\xa3\xdd\x34\x2b\x1c\x95\xec\xaf\x47\xd9\x2b\x3d\x76\x78\xa5\x28\xba\x67\x45\xd8\x14\x59\xee\x3f\xdf\x0b\x66\x31\x7c\x87\xaf\xe0\x25\x64\xed\x29\x94\x56\x4a\x05\xd6\xf0\x13\x64\x8c\xc8\x44\x17\x37\x01\x7a\xc7\x31\xfa\x4f\xb1\xea\x0e\xa8\x0c\x65\x71\x58\x09\x76\x1d\x1b\xed\x86\xc5\x8a\x3f\x15\x04\x40\x05\x82\x82\x16\x30\x82\xb1\x0e\xf0\x69\xb2\xc4\xda\xc7\x8f\x8f\x7b\x0c\x1a\xe9\x7f\xd0\xdb\xaf\xec\x7b\x2e\x64\x15\xa6\x99\x35\xc8\xb8\x35\x21\x4c\xa2\x5b\x1f\x4d\xfc\x56\xe3\x44\x56\xa7\x1c\x39\xaa\xd3\x20\x12\xf9\xb8\x7c\xf3\xd4\xb5\xd7\x9e\xbc\xb6\xc6\xa1\x78\xed\xee\x49\xf8\xfc\xcc\x85\x99\x67\x2e\xdd\x39\xfb\xcc\x0b\x33\xe7\xcf\xd4\xd8\x22\x1b\x03\xf5\x5f\xf8\x67\x83\x1b\xc1\x9c\x2c\x28\x20\x19\xd6\xa1\xca\xfa\xc3\xd4\xf0\x82\x28\x23\xdc\x64\x76\xd9\x49\x35\x37\xc6\x68\x54\x3e\xe5\xf7\x82\x95\xb3\xca\xe6\x49\xfa\x7d\x82\xee\xf6\x49\xe5\xf5\xd1\x29\xc6\x52\x72\xcc\x2f\xd4\xf8\xd3\xd3\x1e\x70\x99\x85\xf5\xb8\xcf\xd7\xc3\xa4\x50\xb3\x22\x90\x45\x05\xb2\x9d\xd6\x2c\xe2\x51\x92\x17\x22\x74\x7d\xbe\x5f\xf3\x86\x72\x35\x5c\x48\x9b\xca\x7a\xeb\xff\xa1\x17\x5c\x6f\xfd\x36\xe0\x20\x51\x82\xc7\x59\x65\xbf\x85\xd5\x9e\x36\xc5\x91\x5c\xa7\x5c\x6e\x78\xe0\x2c\xd9\xf0\x0e\xd2\x15\x67\xa6\x7f\x1f\x9b\x60\xea\x86\xff\x1f\x83\xc7\x2c\x53\x01\x16\x75\xb1\xa9\xe9\x22\xf9\x5d\x9e\x16\x3c\xf9\x82\xf5\x0c\x38\xe3\x26\x55\xec\x89\xa2\x43\x9e\xd4\xd9\x30\x08\x8c\xa0\xb0\x30\xe6\xdd\xce\x7f\xdb\xe3\xd9\xe3\xad\xd6\x8b\x35\xa0\x04\x57\x41\xed\x67\xe4\x4f\xff\x05\x8f\x0f\x3e\x38\x02\x7f\x62\x74\x5d\x86\x70\xaf\x98\x91\x0f\x6f\xf0\x3c\xed\x88\x75\x4c\xa6\x72\xc0\x4b\x20\x06\x0a\x43\xf5\x81\xc8\x80\x10\x6e\xe5\xe3\x20\xf3\x55\x46\xaf\x3e\x5b\x2a\x4a\x91\x35\x3b\x9e\x52\xa5\x0d\x66\xa2\x40\x42\x6c\x82\x6d\x93\x62\x39\x8b\xda\x6d\x39\xb4\x18\x23\x95\xe7\x61\x5b\x20\x66\x93\x00\x78\x20\xf2\xd3\xc2\x46\x80\xa5\x2a\x3d\xcd\xd0\xd0\xdb\xb0\x50\x05\x92\xd2\x41\x30\x8f\xd5\x3e\x22\x34\xc0\x6d\x65\x11\xf5\xd6\x4c\xb4\x62\x9a\xec\x21\x2a\x94\xb9\xac\x9e\x0d\xb1\x43\xb5\x9b\x54\xb9\xc3\x72\xe2\x44\x49\x0f\xb2\xd9\xe1\x69\x4c\x40\xc5\x5e\x57\x2e\xe5\xb0\xa0\x2f\xa8\x1a\xe7\xd6\x2e\x6a\x05\x44\xe8\xc9\xb7\x26\x26\x79\x5d\xe4\x45\x55\xb4\x5a\x90\x18\x9b\xf7\xba\x0a\x59\x2f\x06\x9b\x52\x6d\xc3\x3b\x04\x1f\x59\x8e\x88\xa8\x44\x4d\xc0\x5f\xff\x36\xf6\x69\x8f\x1d\xcc\x04\xa8\x1a\xfe\xc7\x76\xc2\x89\x88\xb1\x6f\x8b\x0a\xfb\x29\x78\x85\x47\xaf\xab\x58\x7f\x4d\xdd\x61\xd0\x2a\x55\xc0\x26\x45\x21\x69\xda\x22\xa2\xbe\xae\xf1\x33\xb5\x76\x0d\x95\x0e\x4c\xc6\x81\x11\xa0\x78\x1b\x3d\xc6\x56\xe2\x78\x86\x47\x0e\x4a\x22\x57\x15\x50\xd1\xae\x6f\xf3\xd8\x18\x16\xed\xbf\xde\x0b\x7e\xd8\x53\xf4\x8c\x39\x5f\x87\xad\x13\x7f\xae\x87\x39\x28\xcd\xc9\x14\xd1\xbd\x9a\x4f\x93\x9c\x29\xd7\x45\xc5\xf4\x91\xb0\x86\xa4\x20\xb9\x99\x0e\xf0\x4d\xe0\xcc\x55\x60\x80\x27\xae\xb7\xac\xa1\xce\xfa\xfb\xb0\xc7\xfe\xbd\x81\x74\xbb\x25\xca\x72\x18\xa3\xbc\x08\x3b\x5d\xff\x27\x3c\x76\xdd\x1e\xb8\xea\x65\x01\x41\xb4\x59\xa9\x9a\xdb\xd1\x00\xc9\x91\x92\x9f\x93\x76\x51\x0f\x1b\xab\xeb\x61\xd6\xd4\xa6\x3c\x3c\xf2\xc0\xf4\xa4\x39\x40\x4b\x09\xf0\xca\xd8\x07\x2a\x6c\x14\x28\xe7\xdf\x5d\x09\xde\x52\xb9\x2d\xc2\x54\x4c\x4d\x57\x85\xea\xa5\xf6\x76\x29\x35\x63\xf1\xcc\xd2\xb2\xcd\xe7\x65\x02\xa1\x4c\x46\x28\x66\x56\x82\x05\x39\x24\x26\x21\xca\xaf\x52\xc9\xd0\x3a\xe1\xbc\xb0\x60\xa2\x7b\x75\x79\x96\xd3\x3a\x06\xd0\xd3\xcc\x6a\x4d\x58\x07\xc5\xcf\x27\x7c\x36\xec\x88\x78\x36\xcc\x87\x23\xc4\x3c\x44\xf4\xfd\xf6\xf8\x3f\x87\x8d\xe1\x31\xd8\xcf\x02\x41\x07\x62\x98\xa5\x78\x86\x2c\x4f\x54\x35\xff\x56\x7a\x9d\x30\xd9\xff\xec\xfb\x80\xc7\xbe\x19\xa5\x79\x94\xb4\x67\x75\xa6\x98\xff\x66\x2f\xf8\x51\x6f\xc8\x8d\x61\x24\xef\x26\xc1\x8c\xf0\xe7\x28\x30\x12\xc6\x09\xa6\x09\x51\xf7\x5c\x74\x13\x0c\xe5\xaf\x58\x14\x17\xcb\x95\xa7\x51\xc2\xa8\x4c\x29\x2f\xa4\xfa\x8c\x72\xd0\xa9\xfb\x9b\x3c\x36\x96\x8b\x2c\x12\xb9\xff\x6a\x8f\x9d\xdc\x54\x6a\x0d\xdb\xd2\x96\xe0\xbd\xe0\x1e\x7c\x1f\xac\x0a\x10\x5a\x5b\x57\xac\x70\x38\xbd\xe9\x36\xb4\x04\xf7\x01\x2b\x59\x59\xd6\x2c\x8a\xe5\xa9\x2a\x2a\x8e\x98\xf0\xb4\x22\x4d\xf0\xed\x1a\xfb\x90\xc7\x1e\x67\x56\xd9\xb9\xd0\x5e\xda\x6f\xdd\xc7\xd2\x5e\xd9\xa4\xd0\xcb\xbf\xb2\xdf\xe6\xb1\x6f\x32\xa5\x11\x93\xd9\x2b\xbd\x1d\x50\xb9\x60\x37\xc3\x0b\x41\x58\x2e\xe2\xf2\x57\xf4\x75\x1e\x33\x1b\x9c\xff\x52\x8f\xdd\xb4\x87\xce\x3d\x1f\x35\xb2\x14\x7a\x78\x5e\x97\xa5\xaa\x6a\x13\xd5\xaa\x79\x0d\xcb\x12\xc1\x5a\xd3\x3a\x66\x6f\xa8\xf5\xa9\x01\x2d\xd8\xaf\x7a\x6c\x54\x2a\x3d\xfe\x7b\xbd\xe0\x6d\x9e\xfc\x0b\x85\xa3\xbb\x82\xb9\x15\x73\xa1\x41\x51\xe0\x4c\xac\xb3\xa3\x89\x77\x4d\xaa\x05\x10\xaa\x1b\xc6\x3c\x86\x20\x1d\xf5\xbc\x2a\xfb\xf8\xea\x69\x74\x0a\xc4\x51\x3d\x0b\x61\x06\x1b\xfd\xa1\x9b\x89\x6e\x98\x29\x82\x98\xa4\xa9\xe3\x4b\xc9\xee\x7a\xea\x9a\xd5\xd3\xce\x32\x7b\xc0\x63\x8f\xd1\x92\x60\x3e\xc9\x8b\x30\x69\x08\xff\x67\xbd\xe0\x8d\xde\xc0\x65\xcd\x9e\x32\x37\x44\x38\x44\xf4\x90\x2d\x0d\x62\x51\x54\x2f\xf5\x9f\xd5\xda\x8d\x10\xc0\x54\xff\x62\x57\x72\xee\xc5\x1e\xa9\xce\xff\x39\xb8\x4f\x45\xdd\x6a\x2c\x17\xd5\xc1\xb8\xc2\x8f\x5e\x00\xcf\xc9\x24\xbf\x2b\xcc\x92\x28\x69\x4f\x4c\xc2\xb7\x11\x86\xa4\xa1\xba\x31\x84\x80\x7d\x52\x5a\x11\x6e\x75\x53\xd5\xc0\xae\xc8\x07\x2b\x8c\x99\x08\x79\xff\x5d\x95\xe0\xcd\x95\x99\x85\x79\x15\xe8\x6f\xf3\x60\x12\x7a\xab\x68\x92\xc3\x45\xd7\xb3\x14\x37\x82\x6a\xaa\x52\x4f\xd4\x7e\x49\x23\x0e\x9b\x50\x56\x40\x32\x71\x3b\x01\x1c\x11\x2c\x4d\x9f\xa4\xa4\xde\x94\x17\x06\x99\x8e\xe2\xea\x54\x30\x72\x26\x60\x4b\xee\x25\x56\x09\x38\x61\x1e\xf2\x1d\x53\x5b\x56\xed\x0e\x7c\x89\xc7\x1e\x6d\xc4\xc6\x6c\xda\x4b\x0a\xbf\xa7\xf2\x4d\x2f\x96\xee\x5c\x76\x39\xe3\xc4\xb2\x7d\xc6\x63\xe3\x2a\xc3\x41\x2a\xce\x3b\x3c\xd9\x3b\x22\xc7\xa4\x91\x04\x2f\xf4\x96\x8a\x50\x2a\xcb\x4a\x8b\x3d\x92\xeb\x04\x8a\x87\xbc\xaf\xd5\x87\xd8\xfb\x2a\xec\x90\x56\x7a\xfd\xb7\x57\xf6\x70\x1c\xf8\x07\xcf\x68\xcd\x0e\x8c\xa6\x52\xe7\x8d\x00\x95\x92\xb0\x0e\xcc\xf8\xf3\x09\x2e\xe2\x06\x20\x81\xe1\x8e\x9a\x50\x96\x0d\xd7\x82\xc6\x91\x27\x0a\x3d\x3c\x27\x89\x42\x94\xbe\x4b\xa2\x98\x1d\xf6\x94\x75\x5f\x59\xf4\xf4\xa2\x97\x7f\x90\xda\x52\x17\x68\x26\x8f\xe0\x94\x00\xa6\x14\x38\xad\xe2\x39\x35\x47\x80\x65\x53\x94\x5a\x78\x0f\x7a\xf7\xb0\xc7\x3b\x8e\xe3\x76\x96\xf6\xba\x55\x5a\xc5\xa0\xf8\xf9\xd3\xfe\xf5\x55\x0e\xd7\xa7\xe9\xcc\x47\x03\xc8\x38\x78\xf9\xa7\xb1\x5b\x18\x57\x8b\x7f\x9a\x93\xda\xc2\xd8\xbb\x2b\xec\xdb\xad\xce\x4f\xd2\x26\x76\xfe\x9a\xc8\x56\x44\xd8\xf4\x5f\x51\x09\x16\xd5\x0f\x2b\x0a\xb7\x84\xae\xa2\xf5\xed\x54\x3d\x1a\xe6\x10\x85\xa1\x41\x66\x95\x99\x36\xe4\xdd\xb4\xe9\x7a\x4a\xdf\xe9\xb1\x77\x78\x6c\xbc\x9b\x36\x6f\x89\x2e\x89\xa6\xff\x06\x2f\xb8\xb0\x40\x3f\x06\xe9\x46\xf1\xe2\xee\x3e\xf7\x0e\xef\x29\xec\xc9\xec\xc6\x1d\x2f\xa4\x9a\xe6\x47\xfd\xee\x5e\x08\x69\x01\x4e\x48\x65\x85\x7d\xe7\xe6\x09\xfb\xf3\x73\x98\xaa\xff\x05\x2f\x38\x45\x7f\x2b\xf4\x97\x1c\xcd\xe9\x53\x9d\xf0\x12\x89\x57\x95\x15\xa4\x53\xf7\xe7\xe7\xf2\x9d\xe7\xd3\x9f\xba\xe6\x32\xe4\xd3\x9f\xba\x66\xaf\xf9\xf4\x6f\x1d\x63\xcf\xb8\x4c\x4c\xeb\x73\x7a\x5c\x66\x15\x85\x85\xff\xd1\x03\xc1\xd3\xb7\x7d\xca\x48\x82\xa6\x28\xc2\x28\x36\x50\x16\x1a\x50\x50\x3f\xaa\x36\x3a\x39\x23\xb4\xf9\x6c\x0c\xd5\x21\xa7\x9f\x7f\x6b\x94\x3d\x83\xd1\x0d\x7f\x21\x98\x25\x8d\xc9\xf4\x90\xd6\x9f\x84\x29\x1e\x8e\x82\x72\x0f\x5f\x86\x04\xb0\x5b\xd0\xcf\x48\x31\xaa\x35\x37\xfc\x18\x95\x86\x28\xf8\x4f\xc3\x95\x06\xa7\xd4\x65\xd0\x10\x60\x08\x9a\x82\x9f\xc9\x8b\x90\x60\x23\x27\xc1\xa8\x9a\xcf\x00\x78\x2f\x65\x96\x69\xb6\xfc\x12\xe7\xd0\x4f\x7a\xcc\x8f\xa5\x4e\xaf\x9d\xa1\xa0\xd0\xfe\xc8\x3e\x4e\x0b\x4b\x83\xe5\x21\x30\x3e\xa8\xb4\x4e\x23\x2c\x1f\xac\x72\x3b\xa5\x89\xee\x48\x43\xac\x54\x63\x82\x1d\x24\x63\x9b\xff\x8c\xe0\x3c\xfd\x39\x54\xb1\xd5\xf7\x08\x57\x25\x69\xeb\x19\x80\xc7\x2d\xac\x8b\xfe\xb0\xd3\x1d\xf7\xea\xd3\xf1\xc5\x60\xc9\x9c\x8e\x43\x62\xe4\x05\xa3\x67\x75\x3d\xcd\x9a\x93\xe6\x24\xaf\xdc\xca\x2d\x63\x73\xc3\xd6\x1d\xc9\xb7\xfc\xd6\xf7\x07\x7b\x5f\x25\x28\x51\x36\x5b\x04\xc0\xf7\xfb\xb6\xef\x0c\x16\xb6\x7a\xc0\xf2\x9b\xac\xa4\xeb\x8a\xf0\x77\x3d\x24\x81\x1a\x65\x96\xad\x24\xe5\x61\xb7\x2b\xc2\x6c\xc3\x3b\x00\xbb\xc9\x86\x77\x00\xe8\x6d\x37\xbc\x03\x79\x23\xed\xba\x16\xbe\x77\x72\xf6\x91\x0a\x7b\x84\x45\x72\x9d\xfb\xbf\x50\x61\xad\xcb\x13\x57\x3e\xac\xe5\x4b\xd6\xa7\x82\x8f\x7b\xf6\x97\x55\x36\x0c\x9a\xe1\x9c\x3b\x94\x27\x06\x31\x5d\x65\xb6\xf7\x95\x10\x01\x5d\x2d\xd6\x4b\x73\x5a\x50\x10\x44\xb9\x5b\x9e\x4a\xf9\xa0\xad\x34\x07\x1a\x0f\x0b\x47\xbf\x2b\x32\xb5\x3b\xbb\x2f\x86\x99\xe0\x9d\x5e\x81\x78\x9a\x3a\x39\xab\x26\xf7\x3e\x86\xfa\x74\x8e\x76\x45\xd6\x7c\xe8\xfa\x70\x56\x7f\x28\x38\x69\x3e\xaa\x0f\x08\xd6\x25\xc2\x1d\x32\x02\x75\x76\x71\xae\xc6\x3e\xe0\x31\x9c\x13\xfe\xbb\x3c\x16\x3d\x74\xf5\x34\x93\x18\x84\x5c\x70\x1a\x79\x96\xd5\x30\x3b\x3a\x87\xec\x75\x08\x66\xc4\x67\xcc\x06\xe0\x0c\x76\x8d\x7d\xfa\x00\xfb\x77\x43\x53\xed\xfd\xf7\x1f\x08\xde\x7e\x60\x78\x16\x7e\x09\x11\xca\x01\x08\xd8\x2e\xea\x4e\xa5\x2e\xd0\x41\xcb\x39\x2d\x13\x2a\x03\x1c\xfd\xbb\xb2\xcb\x73\xe5\xde\xca\x8b\x34\x0b\xdb\xa2\xe6\xa4\x3c\x63\x12\xb4\x49\xd6\x96\x4d\xc6\xe4\x07\x55\xcd\x3c\x6a\x0a\x37\x9b\x3b\x8c\xd7\xc3\xbe\x05\x01\x01\x53\x9d\xe2\x5f\xd4\x69\x4d\xb9\xe4\xd4\x0a\x19\x9c\xdd\xb6\x8f\x0d\xe2\xf0\xa2\x84\xb4\x47\x78\x58\x9d\x74\x72\xf7\xa8\x23\xdf\x53\x87\xa3\x69\x0b\x95\x8c\xf2\xae\x2c\x6c\x03\x2c\xaf\xc6\x17\xb0\x9a\xfa\xf0\xd9\x4b\x9c\x06\x52\x10\xc5\xf6\x91\x8d\xbc\x97\x2b\x53\xf0\xc5\x9d\x44\x5c\x4e\x43\xab\x2e\x9a\x8c\x36\x79\xd8\x15\x3b\x46\x2f\xb3\x3e\x10\x76\xa3\x29\x9c\x74\x1a\x22\x20\x2f\x5f\xa8\xda\x0b\xe6\x2a\x0a\xa3\x04\x79\xd1\xd3\x35\x94\x57\x4a\x51\xa1\x2d\xf0\x4b\xc0\xf6\xe6\x86\x39\xfe\x4e\x85\x31\xd3\x05\xfe\x87\x2a\x0f\xa5\xf0\xb8\x53\x7f\x28\xf8\x7d\xcf\xea\x78\x97\x63\x5e\x0f\x03\x4d\x27\xeb\x41\xc4\x68\xc5\xd0\x51\xa5\xe9\x94\x56\xe9\xa0\x38\x1e\x1c\x61\x22\x36\x97\xb3\x48\x25\xf3\xec\x5c\x24\xd3\xc4\xdf\x4c\x1a\x7f\xaa\xc2\x0e\x2a\x51\xfc\x91\x4a\xf0\x8b\x15\xf5\x62\x64\xa2\x72\xd5\x25\x6a\xc2\x26\xbb\x0b\x46\x88\x94\x2e\x52\xec\x2b\x41\xb2\x00\x82\xc8\x45\x79\x70\xce\xa7\x6e\x82\x2d\xf7\xe6\xa9\x9b\xa8\xf4\x9b\xa7\x6a\xb5\xda\x45\x42\xa3\x37\x6c\x4a\xb6\x89\x1c\x6d\x84\x51\x21\x3a\x6a\x35\x5c\x54\x5d\x70\x91\x52\x12\x5b\xfa\xd2\x45\xe8\x0a\xeb\x01\x59\x11\xc0\xf7\xb2\x48\xa4\x6e\x57\x1e\x36\xeb\xc5\xfc\xa2\x03\xfd\xea\xae\x6c\x79\xa4\xb5\x1f\x1c\xe2\x08\x7f\xc3\x38\x1b\x57\x4f\xf8\xaf\x18\x0f\x5e\xa9\xfa\x57\x6b\xd4\x0a\x9b\x5a\x8e\xa1\xd5\xbf\xf9\xb6\x1d\x3c\xac\xba\xe5\xda\x2e\xef\xba\xd3\x3a\x6e\x8f\x9b\x82\x09\x7d\x6f\x97\x7d\xaa\x8c\x70\xb8\x3b\x21\xa8\x36\x4e\x5e\x29\x31\x7b\x05\x85\x6c\x22\x62\x8f\x42\x75\xa6\x19\xa2\x7b\x42\x21\x21\xa1\xe0\x93\x9d\x64\x41\xf3\x51\x6c\xa4\x9e\xe2\xe8\x1f\x8b\x72\x1e\x48\xe9\x54\x8d\xa3\x55\x11\x18\xfc\x5f\x60\x39\x03\xf0\x67\x48\xaa\xb0\x9e\x29\x95\xa0\xa9\xbb\xe5\xc7\xa1\x7e\xa2\xc9\x63\x71\x29\x6a\xa4\xed\x2c\xec\xae\x28\x70\x90\xe0\xb6\x81\x12\x72\x3a\x47\x92\x7f\x3b\x58\x0b\x08\xf8\x54\x16\x85\x29\x12\x0a\x87\x4e\x85\xc2\x61\x9a\xf2\xbd\x52\x60\x60\x19\x13\xf4\x8a\x05\x66\x8d\xc7\x2f\x68\x5d\x00\x71\x84\x98\x6e\x23\x65\x15\xd2\x41\x68\x86\x56\xbb\xd0\x28\xb1\x0a\xad\x11\xb4\x01\x2c\x43\x04\xe2\xc4\x19\x51\xef\xf3\x5b\x67\xf8\xcd\x88\xf1\x73\x33\x85\x29\x1e\xc5\xe0\x83\x5b\x67\xf0\x78\xa0\xfa\x07\x9a\x95\xa4\x3c\xef\xb5\x5a\xd1\x25\x9e\xf7\x64\x27\xe5\xf8\x2a\x6c\xa0\xdd\x95\x90\x00\xcd\x31\xbe\xab\x8f\xbb\x23\xd4\xdc\x69\x24\xb5\xd1\xa9\x63\x8d\xcf\x18\xae\x13\xaa\xa3\x5a\x22\xaa\x7f\xa7\xf9\xda\xf1\x63\x93\x7c\xed\xc4\x24\x5f\x3b\x2e\xff\x0b\x02\x1b\x7e\x1d\x93\x7f\x9d\x9c\xe4\x6b\x27\x41\x86\xcb\x4b\x27\xa0\x46\xf8\x1c\xfc\x79\x62\x92\xb7\xd2\xf4\x38\xfe\xef\x31\x27\x7c\x29\x65\x1d\xb6\xfa\xf5\x50\xec\x68\x5d\xb0\x8f\x8d\xb2\x7f\x6f\x67\x09\x80\xc9\x78\x36\x8d\x7b\x9d\x24\xf7\xdf\x3e\x1a\xbc\x63\x64\xb3\xbb\x16\x64\x8b\x79\x84\x37\xe8\x26\x72\x43\xe1\x82\x59\x86\x33\x63\xda\x2b\xba\xbd\x62\xdb\xfd\x5d\xb3\x4f\x4d\x81\x2a\x01\xfb\x3a\xd9\x36\x11\xfe\xf8\xaa\x4c\x34\x44\x04\xfb\xb4\x96\xeb\xd5\x30\xaf\x02\xdd\xa6\xbb\x59\xef\xe0\x74\xa1\xea\xbb\x9b\x83\x85\x7a\x67\x93\x5d\x0c\xe9\x74\x79\xa1\xdf\x4f\xb3\x4d\x5f\x77\x28\x77\x09\x0a\x03\xef\x4b\x11\xd3\x8d\x43\x0d\x31\xa0\x22\x53\x07\x77\x35\xb5\x23\x3b\x13\x29\x61\x31\xbb\xf7\xa1\x3c\xc9\xc8\x3a\x9a\xe9\xc4\xbe\xe2\x31\x3c\xb6\xfa\x9f\xf7\x82\x4f\x7a\xf0\xa7\xbd\x6b\xe3\x85\x87\x64\xcf\xde\x76\xa7\xde\x6c\x0d\x00\x8e\x3f\xc2\xfa\x64\x1d\x7e\xf1\x26\xd8\x23\x6a\xdd\xb8\x97\x85\xf1\xcd\x35\x2a\xfe\xe2\x84\xb3\x9f\xbe\xd7\x63\x78\x1c\xf7\xdf\xe1\x05\xff\x8f\x07\x7f\x5a\xc7\x14\x9b\x95\x6b\xb3\x73\x6f\x94\x6b\x46\x16\xf0\x37\xcb\xaf\x76\xc3\x86\xa8\x42\x61\x4d\x8a\x56\x17\x0e\x29\xc0\x45\xc2\xca\xa7\x3d\xef\x82\x7a\xa7\x79\xb1\x66\xd3\xe9\x39\x37\xec\x6a\xff\x9d\xc7\x8e\x0e\xb1\xf2\xcf\xaa\x58\x42\xc0\xb2\x5d\x44\xb3\xad\xff\x11\x2f\xb8\x7e\xe8\x1d\x8a\x14\xa3\x1f\x18\xea\x25\x35\x07\x2b\x26\xd1\xb1\x52\x3c\x9b\xf5\xd9\x21\xd8\x8b\x44\x73\xa6\xf0\xe3\xbd\xdb\xbb\x8e\x83\x85\x2b\x54\x50\xc0\x4e\x1c\x24\x78\x6c\xc1\x08\x74\x34\x13\xd5\x09\xfa\x1e\x7b\xe3\x81\xa1\x4d\x5e\xc8\x52\x59\x39\xd1\xbc\x53\x4e\x61\x41\xee\xef\xff\x35\x1a\x3c\x61\xd1\x18\xbb\x43\xde\x55\x8f\xf1\x35\x78\x8e\x68\xca\x9d\xe6\xfd\xca\x28\xfb\x9d\x11\x80\x16\x90\xfd\x7f\x3e\x6d\x0a\xff\x83\x23\xca\x6d\xf5\xf6\x11\x79\x81\xd7\xa3\xc2\xe8\xcb\xb9\x28\x10\x64\x2a\x27\x0d\x2b\xd1\x09\x0d\xad\x48\x0a\xaf\x7a\x5f\x05\x45\x1a\x22\xa4\x30\xe1\x69\xa3\xd0\xec\x9a\x75\x51\xac\x0b\x91\xf0\x63\xc7\x8e\x1d\x83\xc9\x70\xec\xba\xeb\xae\xc3\x18\x76\x95\x1f\x59\x7a\x10\x9e\xba\xf6\xf8\xf1\x1a\x7f\xfa\xcc\xf9\x73\xc4\x37\x46\xe8\xb2\x58\x32\x70\xf5\xda\x2f\xe7\x93\x80\xa4\x6a\xd2\x03\xdc\xbb\x14\xf1\x45\xcd\xab\xf1\x39\xe0\x89\x48\xc1\x2b\x2d\x77\x67\x5a\x56\xdd\xb0\x30\xe7\x73\x4c\x76\xb3\x50\xde\xc9\xc4\x41\x4e\xe2\x4e\xd4\x5e\x51\x41\xac\x52\x3c\xc7\x91\x02\x85\x44\x9d\x42\x91\x23\x61\x90\x34\x94\x45\x0a\x65\x2c\xa0\x2a\x04\x1d\xd4\xca\x6f\x95\xcb\x56\x6f\xff\x72\xd9\xc9\xc5\x41\x27\x58\x2c\x4c\x57\x5d\x56\xc2\x35\xab\x47\xec\xa0\xb2\xa7\x7d\x6f\xf0\x6d\x7a\xe3\xc7\x39\x40\x93\x42\x56\xc4\x96\xb5\xd7\xb2\x93\xec\xf8\xb6\x1e\x35\x9c\x6f\x0b\xba\x08\xf6\xcf\x8f\x60\xc1\x90\xe7\x16\x4f\xcf\x39\x53\xf3\xd3\x8f\x08\x5e\xe2\x39\x73\x73\x31\x6c\xa6\x39\x3f\x1d\xa7\x8d\x55\x3e\x27\x00\x6c\xba\x63\x32\x43\xe4\x4a\x50\x9a\x7d\x0b\x92\x31\x71\x8d\x76\xd3\x66\x8d\x2f\x9e\x9e\xa3\xc6\x68\xf0\x16\x9e\xae\x27\x22\xcb\x57\xa2\x2e\xd1\xca\x75\x14\xe7\xeb\xd2\x99\x73\x51\xd2\xbb\x04\x71\x78\x75\x11\xcb\xc1\xda\xf0\xc6\x3b\x69\x12\x15\x69\x96\x6f\x78\x07\xa2\x4e\xd8\x76\x97\xc4\x4f\x1c\x66\x3f\xe3\xb1\x83\xab\xa2\x0f\xa8\x6f\x6f\xf2\x82\x57\x7a\xb7\xe1\x0f\xb5\x1b\x74\x29\xca\x7a\x55\xf4\x79\x46\xf0\x10\xb2\x5e\x77\xe4\x22\x73\x84\xd9\x94\x28\x1a\x53\x0d\xd1\x5d\x99\xa2\xe2\x86\x3a\x4c\x49\x55\x53\x4e\xb7\x29\x6a\xdd\x54\x56\x6f\x4e\x2d\x9e\x99\x99\x3b\x7f\xa6\xd6\x69\x5e\xb5\x92\xae\x57\x8b\xb4\xda\xcb\x45\x35\x2a\x6c\xc1\xf8\x23\x1e\xd3\x2d\xf2\x9f\xef\x05\x62\x46\xee\xbf\xb1\xd0\xfc\x54\xb3\xa2\xbb\xc2\xd5\x13\x97\xaf\x06\x9b\xc2\xd4\x3c\x0f\xc2\xca\xd3\xd8\xbf\x14\xac\x2e\x83\x17\x48\x0e\xb6\xbc\x02\x3b\x85\xd3\x43\x59\x7d\x38\x7b\xc4\x3e\xfb\xe4\xbd\x1e\x1b\xcf\x44\xd8\xbc\x3d\x89\xfb\xfe\x4f\x79\xc1\x8f\x79\x8b\xf4\x8b\x83\x42\x8e\xf4\x29\x69\x46\x99\x10\xfa\xa6\x02\x4b\x8f\x12\x8e\x33\xf8\xbc\x9c\x95\x25\x2b\x16\x42\x6a\x5e\xb6\x5a\x5b\xd6\x98\xff\xed\xb1\x43\xb9\x68\x64\xa2\x58\x14\x2d\xff\x6f\x3c\x76\xed\xb6\x6b\x12\x98\xf8\xca\xae\xee\x9f\xf7\x96\x54\x29\xc0\x22\x61\x69\x12\x61\x4f\x1e\x18\x0a\x85\x24\x8d\x5f\x73\x27\x30\xa8\x9c\x48\x37\x01\x0e\xd2\x0c\x5c\x8f\x7a\x06\x5b\xa3\x97\x44\xf1\xe5\xea\x07\xf6\x02\x8f\x8d\xf6\x72\x91\xf9\xcf\x0a\x3a\x66\xd6\x80\xb7\x61\x60\xd6\x84\xcd\x4e\x94\x3c\x14\xf3\xe6\x3d\x15\x36\xd6\xca\x97\xfb\x5d\xe1\xbf\xbd\x12\x6c\x54\x6e\x91\x7b\x1a\xb2\x4d\xd9\xee\x35\x12\xa6\x20\xac\xfa\x69\x4f\x47\xf8\x83\x0c\xab\xf1\xe5\xa8\x3b\xcd\xcf\x58\x9c\x36\x4a\xcc\xdb\x45\xd9\xd8\x53\x2a\x35\x0f\xb0\x55\x28\xa0\x4a\xaa\x27\x2a\xea\x9c\x1a\x35\xcd\x03\x71\xa9\xb8\x26\x98\xe4\xc1\xa5\x56\x2e\xff\x49\x8a\x56\x1e\xd4\xf8\x7c\xa7\x1b\x47\x8d\xa8\x88\x29\x18\xd5\x98\x48\xf1\x05\xa0\xa4\x4e\x2c\x9b\xc2\x6e\xf9\x5a\xd0\xa4\xac\x7a\xf3\xaa\xac\xde\xb4\x7b\x2d\x63\x28\x47\xfd\x28\xf8\x4f\x66\xe8\xe0\x12\x8d\xdd\xe5\x1f\xa9\xbf\x7d\x1c\xbb\x6a\x93\xf4\x08\xa4\x4a\x5d\x42\xf7\xeb\x47\x1f\x17\xdc\x55\xbe\x58\x36\x38\x96\x1d\xb2\xad\xa8\x6d\x08\xcb\xea\x7d\xa0\x76\xaa\x2d\x75\x45\xa3\x46\xa5\xa0\xae\xef\x6c\x1b\x7f\xfc\x58\x76\xff\x38\x3b\x20\xb2\x2c\xcd\xfc\xd7\x8e\x07\x2f\x19\x3f\x23\xff\x74\xd2\x8e\xfa\x90\x13\x12\x8b\x0e\x64\xca\xa7\x49\x23\x8a\xd5\xd9\x68\xa0\x74\x15\x07\x35\xd3\x28\xa2\x35\x55\xab\x1a\x87\x42\x89\xfc\xb9\xd1\xe8\x65\x93\x48\x8c\x8a\x7d\x39\xc9\xc3\xa2\x10\x9d\xae\xf2\x04\x40\xc6\x26\x86\x21\x6f\x5a\x3e\xf2\x6e\xce\x68\x7a\x36\x60\x77\xd8\xa2\x20\xdc\xff\xfa\xc0\xb3\x5b\x0e\x9a\x18\xf8\x48\xb9\x1c\x78\xcb\x98\x74\x51\xf8\xea\x6f\x63\x1b\x27\xb9\x28\x1a\x83\x0d\xe5\xc0\xe3\xdc\x42\xba\x7d\xae\x19\xf6\xa5\xee\x94\xf7\x91\xf5\x51\xf7\x51\x98\xc5\x91\xc8\xb8\xc0\x22\x90\xbf\xb9\x99\xae\x27\xea\xf3\xa6\x39\xf2\x35\x7c\x6c\x02\xf7\x04\xcc\xb9\x00\x7d\x0b\x22\x6a\xb2\x34\x8e\x15\x76\xc1\xb9\x30\x2f\x6e\x4b\xd2\xf5\xe4\xd6\x34\x6d\xda\xa1\x68\x39\x64\x74\x84\x8d\x2c\xcd\x73\x80\xeb\x8d\x21\x93\x0c\x88\x9c\x6a\xfc\x5c\x58\x94\x2b\x23\x2b\x02\x36\x6c\x63\xdd\xc6\x6c\x0d\x5d\x31\xdd\x1d\x13\x9a\xd1\x65\xfb\x3a\x41\xb8\x12\x05\xcf\xc9\x6f\x36\x42\xe2\xc0\x83\xe3\x35\x1e\xf2\x35\x7c\x67\x91\xea\x9a\x43\xf0\x07\xcc\xd6\x7a\x9f\xb7\xa2\x4b\x6a\x52\x96\x97\x42\x94\x0c\x0e\x31\xe6\x3a\x49\xdd\xb4\x15\x25\x4d\xdb\x8e\x52\x4e\x42\x6a\x8a\x7a\xaf\xdd\x86\xe8\x36\xb9\xd1\x42\xe8\x17\x7d\x08\x3f\x6e\x5c\xf2\x70\x51\x75\x64\x9c\xaa\x79\xbf\xd3\x08\x55\x2c\x0e\x0e\x77\x37\xaa\xb8\x47\xf4\x00\x61\x0e\xb3\x3a\xe2\x02\x4b\x6e\x61\xca\x26\x8e\x7d\x00\xae\x18\x9e\x82\x93\x17\x21\x85\xe2\xd1\xa7\xf0\xdd\x42\x5c\x2a\xca\xe3\xaf\xcd\x30\x0e\x31\xf0\x18\x7b\x64\x6c\x0f\x99\xff\xe5\xb1\x1d\x28\xde\x96\x00\xc3\xd0\xe5\x9f\x1b\x73\x06\x9e\x22\xd1\x88\x98\x6c\x70\x12\xe9\x04\x30\xc5\x1b\x17\xc7\x1a\x91\x03\x3c\x88\x51\x01\x90\x2f\xbd\xa4\xc0\x9c\x25\xea\x42\x77\xf5\xf6\xf2\xa1\x0b\x16\x6d\x1e\xa5\x8b\x3a\xc1\x5e\xbe\xe0\xd6\x95\x1e\xa0\xa0\x65\xaa\x97\xc5\x3e\xab\x77\xcc\x72\x91\x11\x58\x85\x21\x45\x34\x69\x22\xdb\x59\xa3\x30\xb9\xe1\x14\xb0\x23\xf7\x40\x15\x5c\xa7\x10\x5a\x8f\x1f\xab\x76\xa2\xa4\x57\xc8\x33\x70\xb8\x2a\x0f\xb0\x51\xda\x44\x13\x33\x50\xb7\xab\xaa\xa0\x30\x44\x19\x28\x47\x78\x48\x0d\x4c\x96\x46\x6b\xb3\x4a\x92\xc8\xa6\x56\xe8\xa8\x2a\x84\x67\x8e\x52\xa4\xd2\xdb\xb4\x7f\x6a\xfc\x42\x5a\x90\xde\x10\xb5\x86\x08\x6e\x24\xc6\xc6\xcc\xe7\x24\x8a\xf9\x51\x39\x2e\x58\x73\x95\x8e\x88\xa6\xef\x52\xbf\x2b\xd6\x49\x8d\x46\x00\xd0\xb3\xa6\xa0\x49\x1d\x63\x68\xba\x42\xa1\x5a\x9a\xc6\x91\x53\x18\x69\x69\x9a\xbc\x0d\x35\x96\x22\xc0\x5a\x31\x9d\x70\x55\xe0\x13\x8a\x0f\x58\x27\x30\x50\x16\x62\x47\x14\x2b\x69\x13\x21\x3d\x70\xe0\x8d\x00\xb7\x16\x99\x35\xce\x89\xc8\xf3\x49\xc4\x26\x8d\x70\x5b\xa0\x0c\x3d\x29\xb5\xa0\x2f\x0d\x1f\x28\xc0\x17\x38\x31\xd0\xec\xc3\x15\x4c\xbc\x5a\x13\xfe\xfb\x2a\x7b\x59\x71\xcf\xab\xd0\xb0\xee\x78\xa9\xc9\xce\x82\x57\xe2\x3e\xfa\x94\x6b\x6a\x66\x90\x44\x57\x20\xa0\x84\x53\x63\x07\x9d\x95\x3c\x84\x03\x5b\x64\x29\x46\x6d\xd8\x02\x9b\x24\x4e\x33\xc4\xff\xd6\x32\x6f\x47\x4b\x9a\xb6\x1b\x8c\x2a\x25\x61\x50\x63\xff\x7b\x94\x8d\xab\xbd\xc0\xff\xdb\xd1\xbd\xf4\xe2\xfb\x46\x2d\x4d\x63\x37\x22\xab\xc8\xfa\x9a\x61\xe8\x2e\xb9\x5c\x87\xeb\x64\xd6\x0a\x9d\x34\x25\x98\xe2\xf1\x73\x96\xde\x42\x1f\x53\x1a\x0d\xe8\x28\x30\xf1\xa3\x7c\x75\x92\x87\x71\x2a\xc5\x03\x3a\xa1\x48\x2c\x58\x01\x63\x00\x7a\xd1\x2c\x09\x42\xf8\x22\xb8\x00\x72\x4d\x8b\x4b\xaf\x82\x26\x95\xa6\x39\xc2\x72\xd3\xa7\x4d\xe5\x26\x09\xcf\x42\xf5\x8b\x79\x31\x4a\xf4\x08\xd5\xcc\x58\x01\x00\xaf\x62\x9a\x8d\x12\x5b\x97\x0d\x5b\x05\xcd\x28\x2a\x61\x05\xdc\x4b\x22\x71\xbb\xba\x48\xa1\xa1\xd4\xa5\xf6\xa6\x8b\x42\x06\xed\x90\x88\x08\x90\x11\xf1\x29\x2c\xee\x61\x73\x66\x40\x5b\x05\x58\x18\xd2\x74\x64\xcb\x2c\x55\x67\x60\xd0\xd5\x00\x10\x0f\x49\x84\x8a\xb7\x6e\x34\x7b\xcb\xe8\xd0\xa4\x7f\x62\x00\x23\x5d\xff\xff\x8c\x04\x37\x38\x57\xca\xd1\xbf\x6a\xbd\x18\x8d\x5f\x93\xf5\xb9\xda\xfc\x7b\x46\xd8\xab\x2b\x10\x56\xd5\x24\xc4\xd5\xef\xaf\x04\xff\x6e\x56\xbd\xae\x88\xda\xa4\x86\x61\x1b\x42\x9e\xca\x6e\xde\x53\x86\x8f\x0e\x47\x7d\xd0\xe3\x9b\xb2\x08\x8d\xf9\xa3\x9d\xb0\xcb\x1e\xf4\x8e\xb0\xff\xe0\x06\xa6\x84\x45\x63\xa5\x0a\xd4\x2c\xd5\x55\xd1\xf7\x0f\xfa\x07\xe4\x0b\xf0\xe4\xb7\x0f\x79\x32\x2f\xb2\xb0\x10\xed\xbe\x3f\xee\x8f\xc1\x5b\xf0\xe4\x56\x38\xd4\x87\xfc\x83\x88\xe1\xcf\xd8\x8f\x7b\xec\x11\x36\x65\xa1\xff\x92\xad\x92\xdc\x8c\x95\xc2\x22\x39\x84\xce\x0f\xbe\xdb\xbe\xe6\x06\xe4\x0f\x0e\x13\xee\x48\x16\x51\xe1\xa4\xdc\x1b\xd3\x44\x68\x8e\x9a\xa4\xa8\xb1\x0f\x8f\xb3\xaa\x8d\xd9\xd5\x2b\x56\xd2\x2c\x7a\x16\x66\x27\x29\x2f\x90\x72\xa2\x2c\xf6\x62\xe1\xbf\x7c\x3c\xf8\x59\xcf\xbe\x32\x10\x52\xd0\x50\x46\x5b\xc1\xf3\x9e\xa6\x9a\xb0\x78\x2a\xba\x22\x03\xe7\x0b\x64\x5e\x93\xe1\x15\x25\x01\x96\x91\x11\x9c\x4f\x94\x27\x47\x0a\x2e\xe7\x33\xf0\x78\xc9\xe5\x0e\xbb\x18\x36\x9c\x37\x7b\xc8\x62\x28\x08\x5c\x87\xf4\xf4\x3e\x1a\x94\x31\x2d\xb9\x10\xb5\x0d\xef\xc0\x9a\xc8\xea\x6e\xbc\xf1\x6f\x8e\xb1\x2f\x7b\xec\x90\x89\xa3\xfc\x7d\x2f\xf8\x80\x6e\x56\x89\xc0\xdb\x8e\x6c\x94\xab\x5c\x36\xda\xf0\x1a\xd7\x38\x0f\xae\x0e\x80\x3e\x0f\x5a\xa9\xe5\x8a\x21\xa1\xec\x46\x60\x9f\xce\x6b\x8c\x07\x57\x4f\xb5\xd2\x34\x28\x2f\x33\x2b\x6c\x91\x1f\x69\xa5\xe9\x11\xed\x9b\x34\x1f\xdf\xa2\xdc\x2d\x4c\x8b\x6f\xf0\x18\xb6\xdf\xff\x51\x2f\x58\xbf\x53\x64\x75\xb7\x71\xab\x16\x57\x8a\xaa\x01\x45\x84\xd4\x73\xb4\xaf\x4f\xf3\xb6\x28\x26\xe1\x8d\x49\xbe\x2e\x17\x04\xd1\x2a\x8b\x49\x12\xa6\x93\x84\x1a\x35\x89\x7c\xd0\xe5\x2e\xd9\xaa\x7e\x2f\xac\xb0\x43\xba\x21\xfe\x3f\x7a\xc1\x1f\x7a\x33\x0b\xf3\xf8\x73\x58\x92\xaa\xba\x49\xa0\x40\xf6\x22\xb0\x26\x93\xd4\x35\x35\x5b\x95\x76\x45\x0e\xba\x5f\x93\xbe\x4a\xcc\x35\xec\xb4\x61\x5b\x96\x58\xd8\x14\x20\x22\xe9\x75\x88\xa3\xd0\x19\x0f\xf9\xbe\x71\x74\xda\xbc\xe9\xeb\x40\x81\xbd\xe3\x5e\xf8\x80\xc7\x1e\xa9\x4a\x06\x77\x9e\xff\x53\x5e\xf0\x83\x7a\x42\xc2\x25\x42\x73\xd2\x29\xf9\xeb\x2b\x51\x61\x96\x1d\xc6\xba\x18\x30\xab\x81\x49\x3a\xa3\xf8\x51\xa4\xfe\x8a\x95\xc2\x2c\xdf\x35\x91\xf5\x8b\x15\xe5\xe9\xdb\x7d\xdd\xbf\x7c\x68\xa8\x4b\x63\x76\x69\xde\x71\x69\xfc\xea\xa1\x60\xd9\xf1\x68\xd0\x64\x03\x8e\x79\x95\xfe\xa6\xed\x84\x64\x19\x9c\x24\xf7\x04\x46\xae\x24\x5c\x31\x98\xf0\xd9\xa5\x79\xde\xcc\xa2\x35\x91\x6d\x78\x63\xf8\x87\xb3\xc0\x3f\x35\xce\xde\xe2\x31\xba\xe3\xbf\xce\x0b\x5e\xea\xcd\xc1\xdf\xc3\xe6\x94\x29\x4c\x81\xf1\x27\xcd\x58\x2d\x77\xac\x51\x8d\xcf\xa6\x09\x18\x14\x40\xb7\xe9\xa7\xbd\x0c\x6d\xaa\x56\x74\x3a\x68\xdd\x58\x70\x28\x57\x53\x3b\xca\x0b\x88\xe0\x29\x21\x69\xd8\x9d\xf7\x09\x4f\x9b\x4f\x7f\xcd\x0b\x7e\xc1\x2b\x9b\x4f\x8d\x89\xf4\xcc\xa5\xda\xa6\xc6\xcc\x16\x1c\x22\x1c\xc6\x63\x1a\x6c\x8d\x08\xd5\x0d\xf3\xdc\x50\xd3\x5a\xfa\x9c\xd5\x78\xf4\xb3\xc2\x34\xd6\xa7\x4b\xe5\xd5\x86\x43\x8d\x6d\x91\x85\xd0\xf5\xb8\xef\x26\x3d\x8c\xb0\x6f\x91\xda\xdc\x02\xb2\xbd\x6a\x93\xba\xff\xb2\x91\xbd\x1a\xe6\x3f\x53\xb9\x30\xa4\x40\x05\x5f\x42\x4f\x69\xc6\x5d\xb4\xcd\x53\xc8\x30\x09\x07\xb0\x0b\x0b\x48\x14\x58\x13\x8e\x8d\x45\xee\x45\x61\xae\x13\x28\xed\x69\x90\x72\xb5\x81\xe8\x5b\x56\x3d\x70\x62\xc3\xae\x23\xaf\xde\x91\x74\x9d\xeb\x8d\x30\x8e\x5d\xa6\x5f\xc8\xfa\xc5\x75\x8b\x9b\x95\xe2\xec\xc3\x51\x8a\x20\x78\x84\x6a\x6f\x27\x1d\xab\x33\xf3\xd0\x86\xe5\x08\xc0\x51\xac\x48\xa9\x90\xa8\x87\x26\x61\xdb\xa0\x17\x74\x0f\x11\x89\x02\x4c\x82\x1a\xeb\x58\xbe\x9e\x30\x58\x5a\x32\x41\x3d\x80\x5e\x57\x05\x3d\x59\x1f\x0e\x1d\x50\x1c\xb5\x1c\x06\xdc\x3b\xfc\xa8\x7c\x75\x6a\x3d\x8b\x0a\x51\xa2\x89\x7a\xc0\x63\xdf\x84\xef\xcd\x28\x22\x8a\xdc\x7f\xa7\x17\xbc\xdc\xbb\xb3\x74\x15\x42\xb1\x45\x4e\xc3\x50\x25\x51\xdd\xb0\x11\x4e\xd1\x19\xac\x1b\x33\x38\x78\x66\xa9\xc2\x2a\xc5\x8b\x47\x72\xde\xb4\xe9\x89\x90\xe8\x57\x7b\x13\x28\x11\xf6\x1d\x25\xd9\x66\xe7\xa0\xbd\xf0\x90\x93\x83\xa6\xd3\xe3\x15\x21\x6d\xaf\x9e\x8b\xc2\xff\x93\xf1\xe0\x3d\x23\xee\x35\x9c\xab\x3a\x16\x26\xd4\xd4\xc7\x74\x4a\x6a\xa4\x1d\x85\x6e\x9a\xb6\x90\x44\x16\xb5\x21\x71\xa9\x1b\xc2\x61\x89\x6e\x19\x7a\x5c\x92\x61\xb3\xf2\xb0\x91\x47\x21\x00\x8f\x35\x7b\x0d\x78\xca\x50\x2b\x5f\xe2\x0b\x58\xd8\x2d\xb6\xc1\x1b\x90\x6f\xa6\x19\xe7\xcf\x06\xa2\x1d\xfd\xf8\x34\xbf\xfb\xd9\x41\xd4\x0d\xa6\x79\x70\xfc\x58\x4d\xfe\x7f\xed\x78\xf0\xdc\x49\xee\x5e\x3c\x51\x3b\x11\x3c\xf7\x9e\x49\x78\x15\x4a\x9f\x06\xb6\x9e\xbb\x9f\x1d\x48\xb9\x27\x9f\x0b\xa5\x60\x92\xad\x08\xa6\xf9\xf5\xa7\xae\xbb\x16\x8a\x50\x37\xeb\xd6\xcd\x93\xc7\x6e\x78\xee\x3d\x8c\xf3\xe7\x02\xc8\x2a\x9e\x9f\x71\xad\x96\x5a\x4b\x6e\xfc\xb5\x48\x00\x9d\x57\x8e\x84\x49\xe1\x34\xbf\x9b\xeb\x9a\x4e\xcb\x4f\x4d\x72\x5d\x49\xf8\xcd\xa9\xa2\x75\xf7\xd1\x93\xc7\x6e\xb0\x9f\x3c\x79\xec\x06\x7e\x8f\xb3\x79\xfc\xd8\x01\xf6\x37\x1e\x3b\xa4\x47\xca\xff\x13\x2f\xf8\x71\x6f\x7e\xc1\x1e\x3b\x10\x95\x69\xab\xa5\x0f\x8d\x31\xe1\x57\x6a\x0e\x60\x88\x14\xd3\x58\xa0\x86\x74\x3a\x17\x56\xdb\x4c\x86\x82\xc5\xb1\x9c\x87\x2d\x44\xe1\x82\x03\x9e\x52\xe0\x15\x11\x7b\x84\x5a\x63\xca\x7b\x45\x14\x47\xcf\x12\xce\xde\x7c\x0d\x3b\xb1\x83\x44\x5f\x35\x41\x69\xf0\xd9\x4f\x57\xd8\x63\x92\x01\xe2\xee\x1f\xad\x04\x9f\xda\x4d\xab\xeb\xbd\x42\x47\x7e\x18\xd3\x62\xa9\x0b\x6c\x93\x19\x31\x64\xc9\xe7\xfb\x42\xee\x2e\x09\xa4\xd9\x69\x33\xe3\x24\xde\xcf\x44\x03\x8b\x22\x6c\x9f\xb0\x0c\xb1\x39\xa9\x59\x65\x06\x1f\x8d\xe5\x74\xd7\x4f\x5e\x86\xbe\x7a\x0e\x3b\x00\xcd\xf5\xf3\xe0\xa4\x5c\x01\x14\xf9\x6a\x83\xb2\xa6\x89\xd3\x3b\x76\x17\x3a\x15\x38\xce\xa6\x58\x75\xc7\x15\x90\x1f\x63\x2f\x3b\xcc\x9e\x68\x3d\x93\xd5\xc3\x06\x28\x5b\xa8\x5a\x2c\xa6\xb1\x38\x1d\x81\x05\xcb\xff\x12\x0b\xde\xe4\x0d\x5e\x77\xb6\x04\x6e\xdd\x47\x2b\x3e\x8c\x1d\x1d\xb0\xa2\x02\xb9\xa9\xe5\xfa\x33\x5b\xad\xf3\x92\x52\x6d\xda\x71\x5a\x0f\x63\x13\xd6\x86\x9b\x5c\xd8\x84\x8c\x9d\xd4\xd9\x74\xd7\xa2\x90\x2f\xe1\xb9\xb0\xb6\xe1\x1d\xcc\xd2\x58\x2c\x8a\x96\x6b\x4b\x18\xbf\x02\xaf\xb0\x5f\x78\x85\x2b\x50\x4e\x7b\x87\x72\x5a\xb1\xe0\x20\xfe\xd3\x7e\xd1\x20\xbe\x7d\x0b\x30\x08\xa9\x19\xa9\x15\xe0\xbf\xcf\x63\x47\x37\x15\x06\x6a\xa1\x2f\xe2\xc3\xc1\x4b\x3d\xfa\x0b\x56\x27\xe8\x6b\xbb\x5c\xa2\x5a\xb7\xb4\x0a\xa2\xc1\x20\x2f\x27\x1d\x24\x66\xc8\x28\xa4\x40\x27\x31\xca\xdb\xb2\x72\xbf\xc8\x63\xe3\x64\xe9\xc9\xfd\x4b\xc1\x93\x69\x75\xe7\x7c\x25\x45\x88\x7b\x2d\x70\x68\x29\xa5\x74\x1f\x84\x64\xea\x1e\x54\x6d\xf9\x38\xc9\xae\xde\x41\x97\xd0\xe7\x1e\xf4\xee\xdb\x1e\xb7\xe1\x82\x7f\xae\x6a\x43\x32\x30\xae\x50\x1c\xa0\x34\xd7\xfe\x55\x42\x74\x18\x94\xa5\x8c\xdd\xff\x08\xf6\x24\xab\x4a\x2a\x91\x50\x59\xce\xb4\x7a\x1b\x36\x56\xa4\xea\xe9\xff\xdd\xe1\xe0\x75\x5e\xf9\x2a\x6f\x84\xdd\x02\x02\xd3\x8b\x15\xc2\x85\x46\x08\x50\x78\x82\x53\x6c\x3b\x45\xc0\x1a\xf3\x8f\x3e\x2a\x4f\xe9\x85\x67\x6e\x02\xaa\x04\x63\x03\x9f\x52\x5d\x8f\xfb\x74\x52\xd5\xd3\x01\x12\xf4\xe5\xfb\x8e\x24\xfe\xaf\x87\xae\x48\xe2\x2b\x92\xf8\xe1\x93\xc4\xbf\x6b\x23\xf3\x7c\x64\xdf\xc8\x3c\xcf\x2f\x23\xf3\x3c\x0c\xb8\x3c\x3f\xed\x31\x58\x67\xfe\xfd\x5b\x34\x67\x5b\x49\x22\x8f\xec\xc1\x33\xe9\xe0\x6e\x0c\x68\x85\xc5\xa0\x81\xe2\x63\x8a\x64\x07\x49\x0b\x45\xab\x51\xe3\x0b\xa9\xc5\xfc\xaa\x1c\x59\x64\x09\xa6\x30\x3a\xf6\x7b\x9e\x06\xe5\xf8\x2d\x8f\x3d\x65\xef\xb5\x45\x07\xc6\x8b\xbd\x25\xc7\x3f\x31\x20\x9d\x34\xf4\xf3\x40\xe5\x90\x2a\x56\x19\x65\x74\x7e\x4c\x59\x42\x6a\x68\x35\xa2\x91\x83\x57\xc9\x66\x58\xc5\xa7\x45\x56\x7b\xd0\x8b\xb6\xdf\x2a\x6e\xf1\xe7\xaa\x83\xe8\x3d\x7a\xbf\x50\x4d\x2e\x6d\x12\xe5\x26\x31\xf6\x53\x1e\xbb\xe3\x21\xe1\xfa\xf3\x2f\x04\xe7\xb6\xba\x6f\xfb\x18\x42\x5e\x7a\xd2\x26\xd3\x46\x1e\xd4\x1a\xfb\x5c\xc5\x39\x5b\x6c\xee\x89\x92\x9b\xc0\x4d\x83\x97\x07\x9c\x1a\x96\xcf\xd0\x71\x45\xb9\x9e\xc3\x2f\x79\xec\x0b\x1e\x3b\x18\x25\x6d\xc0\x4e\xfe\xac\x17\xfc\x90\x37\x8f\x3f\x2c\x57\x85\x65\xcc\xa3\x27\x55\x48\x9b\xb2\x4c\xb9\x9f\xe0\xcb\x59\xd8\x6a\x45\x0d\xe3\x72\x56\xcf\x69\x5f\xa4\x3e\x7a\xe7\xb4\xe1\x16\x70\x38\x77\x8b\x77\x14\x92\xeb\xd9\x29\x76\xcd\xae\x5c\x77\xd4\x10\xf6\x8f\xde\xd0\xe0\xcb\x85\xb4\xb9\xa8\xce\xb2\xb7\x86\x85\xf0\x3f\xe9\x05\xd3\xe5\x8b\x65\x2f\x87\x65\xf4\x0c\x91\x8f\x44\x39\x43\x37\xbc\x47\xea\xbf\x97\xfb\x25\xf8\x90\x9c\xdd\xc7\xdc\xdb\xfe\xc5\x60\x69\xd6\xbe\x60\x79\xe1\x43\x0b\x4c\x46\xa5\x76\xa4\xcd\x23\xb9\x75\x19\xc6\x05\x8c\x58\x90\x82\x05\x8b\x12\xb1\xd5\x8c\x00\x7f\xc5\x08\xbb\xc6\x6a\x77\x2b\x4e\xd7\x09\xf9\x4b\x0b\x0b\xf2\x3f\xcf\x20\xd3\x05\x69\x73\xfe\x1f\x54\x82\xc5\xa1\x77\x48\xab\xc4\x74\x3f\x30\xae\xbb\x41\x73\x34\xbc\x55\x62\xce\x80\xc5\xac\x1c\x91\xb5\x0d\xef\x90\xd6\x78\x36\xbc\x51\xf9\xb7\xd3\x47\x5f\xf4\x58\x9f\xc1\x65\xff\xbe\xa0\x79\x51\xfe\x71\xb1\xec\x31\xd0\x8d\x75\xab\xa7\x54\x2b\x30\x46\x04\x57\x07\xe8\xf9\x2f\x1a\x2b\x04\x3d\x1c\x03\x9c\x7b\x8b\xc2\x7b\x17\x95\x85\xd7\xee\xac\x26\x33\xb5\xf3\xef\x0a\x9e\x76\x51\xff\x72\x2a\x01\x57\x76\x50\x93\x4d\xbe\xf2\x0f\x23\xec\xc8\x90\xa9\xb8\x4c\x9c\xe7\x4b\x22\x86\xbc\x9e\x65\x91\x75\xfc\x8f\x8f\x04\xaf\xac\xcc\x68\x3e\x74\x9e\xd3\x4d\x5e\x88\xac\x33\x04\x92\xac\x17\x83\xed\x0e\x52\x47\xf8\x7d\x3d\x81\xf1\x9c\x33\x3c\xe9\xc5\x90\x12\x49\x0c\xfd\xc3\x8b\x83\xe6\x88\x9c\x27\xa9\x69\xc1\xf2\x8a\xc6\xb0\x40\xec\x37\xdc\x3a\x3a\xa0\xc0\xce\x5c\x98\x23\xa0\x4e\x0b\xee\x2b\x47\xa3\x6b\xda\xe2\xad\x5e\xd2\x40\x9b\x3b\x44\x46\xe5\x60\xab\xb7\x9b\x37\x8c\x25\x85\x48\x4f\x94\x32\xe9\x82\x9a\x53\x6c\x94\x9b\xfd\xe2\xb1\x37\x7b\xec\xdf\x41\xe5\xcf\xc9\x76\x9f\xb9\x24\x7b\x05\x93\xef\x7f\xc0\x0b\x4e\xce\x68\x1f\xdd\x60\xbb\x9d\xa6\x01\x27\x50\x5d\xc4\xae\xcc\x39\xc3\x66\xd9\xcc\xb6\x32\xa7\x3c\x7a\x50\x93\x45\x53\x3a\xfb\xec\xb7\xb0\xab\x6d\xd4\x39\x51\xac\xa7\xd9\x6a\x94\xb4\x21\xea\x08\x7f\x2d\x00\xae\x1a\x80\x1c\xfd\xc4\xb7\x04\x4f\x19\xb8\x6a\xba\xd9\x3a\x6c\xd8\xde\x3b\xe7\x8d\x0d\xef\x70\x37\x6d\xaa\x0a\xb9\x58\xe5\xdf\xcc\x3e\x35\xca\xc6\x04\x4a\xfc\x8f\x8e\x06\x7f\x3f\x72\x8e\xfa\x08\xaf\x81\xff\x32\xa7\x88\x7c\x3c\x1d\x36\x8d\x93\x27\xc6\xa4\xb2\x6e\xda\xcc\x6b\xfc\xf6\x5e\xd1\x4e\x11\xa2\x9d\x04\xbe\x09\x36\x40\x46\x9e\x4c\xd0\x71\xc7\xa9\x1f\xa0\xa9\x0a\x85\xfb\x4e\xf2\x8d\x1f\x45\x1b\x2b\x9c\xf4\x38\xe2\xcc\x61\xfe\xd8\x7a\x94\x0b\x45\x46\x21\x1f\xa6\xaf\x4d\x4c\xf2\xdb\x17\x15\xf3\x8f\xaa\x81\x9a\xc8\x9a\xd7\x23\x4d\x84\xdd\x30\x15\xf8\x1a\xca\x45\x81\xaf\x3a\x3d\xa7\x4f\x69\xeb\xc8\x84\x6d\x7a\x51\x17\x4d\xf5\xa5\x43\xbc\xed\x67\xa2\x25\xa6\x01\x6e\xdd\x92\x91\x1c\x09\xbf\x5c\xee\x38\x68\x3b\xa8\x24\x39\xcf\xd3\x58\xc4\x7d\x87\x94\x9b\x3c\xcb\xc8\x90\x52\x50\xdf\x11\x07\x70\x9e\x6a\x6d\x8d\x7c\x85\x13\x65\xff\x97\x14\xf6\x94\x1b\x1d\x25\xfc\x78\xed\x7a\x7b\x92\x9f\x66\x4f\x65\x37\x6f\x3a\xc9\xb7\x98\xac\x67\xa0\x57\x17\x7b\xb1\x60\x7f\x3e\x6a\x94\x88\x3f\x18\x0d\x5e\x34\xaa\xa6\x94\xda\xd0\x77\x3e\xa7\x96\x07\xa7\x92\xde\x6c\x1f\xa6\x39\x95\x3b\x78\xcb\xb8\x15\x63\xe0\x5d\x02\x89\x90\x3b\x9c\x85\x76\x5f\x3c\x8c\xd3\xb0\x99\x82\x9c\x27\xae\x59\x88\xa3\x78\x68\x66\xa1\x3d\xc9\x66\xd9\xcc\x16\x67\x98\x2d\x26\x19\x29\x71\x30\xcb\x3e\x3f\xc2\x6c\xb1\xe6\x7f\x62\x84\x3d\x75\x0f\x87\x52\x90\xcf\xaa\x90\xe0\xc5\x23\x4b\xd4\x0e\xdd\x36\x88\x33\xc7\xb4\xe7\x81\xde\xa3\xb3\x2b\x59\xcd\x70\x93\x84\x36\x0e\xce\x76\x39\x83\xcd\x54\x87\x84\x1a\xa0\x5c\x52\xf3\x5d\x25\xe6\xc2\xb8\xd5\xf8\x79\x15\x33\x43\xbd\x81\xd3\x35\xa2\x5c\x00\x7c\x0b\x17\x8c\x54\x86\xb4\xcb\x52\xae\x99\x79\x1a\x68\x4c\xa1\x40\x4b\x96\x5d\x13\xc8\xba\x09\x09\xdb\xa4\x91\x76\xea\x90\x27\x8f\xd9\x0f\x6b\x22\xee\x97\xe5\xc5\x85\xdb\x97\x4d\xac\x8b\x9c\x13\x08\x62\x02\x11\xed\x78\x84\x47\x2d\x43\xef\xa5\xb9\xe8\x84\x49\x11\x35\xf2\x9a\x89\x75\x19\x36\x67\xe5\x74\x37\x34\x4f\x94\xec\x87\x26\x51\xf6\xce\x31\x39\xba\xb2\x93\x01\x04\xd2\x7f\xc3\x58\xf0\xbc\x31\x25\x47\x60\xcd\x20\x7c\xb4\x9e\x87\xee\xc0\xa0\xc7\x07\x2d\x2a\x00\xdd\xa4\x53\x98\x65\xa3\xef\x0e\x68\x22\x05\xf7\x4c\xf2\xbb\x83\x33\xfa\xef\x34\xb3\xee\x4d\x72\x7d\x67\xc8\xb2\x72\x50\xcf\x0c\xc2\x8c\x0a\xd0\xd0\xf4\x4c\x78\xf0\xb5\x98\x49\xd4\x89\x2a\xcd\xf8\x19\x6b\x58\x6e\x34\x23\x6c\x07\x54\x49\x85\x88\x1e\x53\xd4\xe4\x80\x6f\x46\x31\xec\x72\x2a\x61\x3a\x36\x3e\x44\xee\x1e\xe8\x58\x2a\xed\x68\x29\x65\x04\xdc\x7d\x56\xe9\xaa\x3e\x54\xfc\xc4\x26\xe5\xd3\x63\xd0\x13\x76\xde\x20\x84\x19\x80\x0d\x1a\xee\x63\xc4\x02\x8e\xdc\x24\x3c\x08\xa6\x6a\x71\x49\x67\xf9\x29\x1c\x3b\x6b\x74\xf9\xdd\xba\xab\xf9\x3d\x35\x7e\x2e\x5a\x15\x52\x22\x43\xa0\xe4\x90\x6f\x29\xd1\x8d\x6c\x68\x3a\x64\x82\x28\x09\xd5\xfe\x6e\xb6\x0c\xab\x1e\xea\xe3\xa1\xf3\x79\xb4\xfc\x61\xda\x02\x81\x8d\xea\xfa\x1c\xcd\x23\x39\x70\x88\x73\xa3\xbe\xbc\xae\xf3\x05\xd4\xf3\x43\x86\x29\x69\xd2\x73\x66\x8b\x51\xb3\xa3\x48\xf9\xbd\xb2\x3a\x77\x73\x3d\xdb\xf8\x3d\xbb\xdb\xa8\x4b\xb1\x5f\x7f\x3f\xc9\x4e\xec\x48\xde\xcd\x41\x7c\x20\xa2\x47\xe5\xfe\x2f\x4f\x06\xd3\xce\x15\x15\x0e\xa3\xb3\x68\x21\xc1\x04\x79\x61\x90\x0b\x75\x66\x61\x5e\x59\x8c\x1d\x55\xf2\x87\xfc\x2b\x16\xea\xfd\x5a\xa8\xef\xaf\xb0\xb1\x66\xd6\x5f\xec\x25\xfe\x6b\x2a\xc1\x3f\x7b\x77\x21\x97\x1d\x61\xe8\x94\xf0\x18\x3b\x69\x53\x6b\xfd\x0e\xf1\x92\x1c\x3e\x84\x55\x84\x98\xfb\x84\x47\xc9\x1a\xca\xc0\xcc\x6d\x2a\x7e\x8a\x37\x01\x40\xc2\xca\xee\xd0\xf9\x7a\x2a\x99\x2a\x13\x79\x37\x4d\x72\x3c\x8d\x25\x29\x6f\xf5\x32\x10\x29\x40\xb3\x97\xe7\x16\xa6\x9d\x36\x1c\xa2\xd4\x35\x20\x2a\xd3\xbc\xca\x67\xe2\x78\x1a\x84\x53\x33\xeb\xf3\xac\x97\xc8\x1d\xa4\x0d\xf1\x37\x18\xaf\x49\xc5\x89\xe6\x16\x13\xfd\x4f\x2b\xcc\x6f\x67\x61\x43\x2c\x40\x42\x12\x51\xab\xfa\x1f\xaf\x28\x44\xe7\x9f\xaf\xc8\x5d\x58\x93\x63\x47\x09\x51\x26\xe5\x0e\x4b\x2c\x6e\xdc\xc6\xf2\xa4\xc9\x56\x91\xb7\x52\x61\x43\x82\x67\x46\xb4\x43\x8a\x58\x03\x94\x0a\xdc\xe6\x51\x66\x3c\x4b\x64\xa9\x35\x2e\x58\x8a\x9d\xa6\x64\x76\x0e\x1d\x00\x08\xf9\x4a\x76\x30\x1f\x34\x47\x65\x76\x69\xe3\x98\xf6\x20\x41\xf8\xa1\xea\x22\x80\x1a\x72\x62\xbe\x80\x3d\x53\x35\x88\x3e\xd2\x72\xb7\xa7\x1a\xd6\x13\x83\x48\x87\xd4\xd1\xc1\xe0\xb8\xe2\x25\xd9\xbb\x97\xe4\xa3\x15\xf6\x4d\x69\xd6\x5d\x09\x93\x39\x48\x60\x92\xad\x96\x62\xf0\xfe\x8a\x0d\x1c\xd8\x95\xa7\x00\xa1\x13\x98\x16\xb2\xb4\x1b\xb6\x61\xb6\x2e\xd0\xbe\x69\xa9\x1a\x6a\xe0\x2d\xc2\x05\xd8\x0c\xae\xab\xf1\x25\xe2\xa8\x45\x3a\x06\xfc\x9c\x3e\x2a\xd4\x05\xc7\x9a\xa8\xe0\xc5\xac\x27\xa6\x08\x01\x55\xbe\x11\xe0\xdd\x80\xb7\xa2\x24\x8c\xc1\xa9\xac\xc3\xa6\x81\x89\xa3\x48\xa7\x32\xd1\x49\xd7\x14\x6c\xb5\x59\x36\x47\x72\xf3\x52\x0e\x36\x95\x1a\x3f\xa3\x12\xc1\x74\xc5\xd3\x6c\xb0\x65\x6a\x77\xc9\x45\x61\xa2\x5c\xea\x69\xb1\x32\x10\xa6\xf8\xc8\x2e\xa4\x99\xab\x14\x96\x77\x7b\x7b\x52\xee\x17\xec\x42\x82\x58\x81\xfa\xb4\x7a\x71\x2b\x8a\x63\x43\x1c\x1d\x1a\xe6\x33\x50\x9c\xb3\x4c\x2e\x3c\x64\x51\xa0\x90\x5e\xca\x3d\x9e\xe4\x21\xbf\xe6\xd8\x0d\x7c\x56\xa1\xe4\x90\x6d\xdd\xc0\xbc\x22\xf2\x5a\x8d\x7d\x6d\x84\x3d\xa6\x5b\xee\x00\xff\x2b\x23\xc1\x1f\x8c\xdc\xa5\x12\xda\x92\x26\x20\x53\xb7\xc3\xac\x1e\xb6\x85\x8d\x7d\xa2\x45\x22\xa6\x68\xc8\x41\x1c\xda\xc5\xb7\x97\x66\xdb\xe6\x3d\x0c\x52\x4b\x89\x1c\xd2\x63\x22\xc4\x16\x6a\x5a\xee\x1d\x45\xa1\x6e\xa6\x85\xc5\x08\xaa\x9d\x74\xd6\xf8\x5b\x50\x3f\x08\xf3\xaa\x63\x45\xdd\x8f\xd5\x38\xc2\xb5\x43\x60\x96\xbd\x2f\x1c\xc1\x36\x1c\xe1\x55\x9a\xb1\xee\x8c\xce\x6f\xe4\x47\x4e\x87\x8d\xd5\x36\x10\xf4\xca\xa7\xf0\xa8\x0a\xa1\x14\x6e\xc7\xa5\x10\x2f\x4c\x02\xce\x2d\x44\xb5\xa0\xae\x4b\xba\x91\x1f\xb9\x25\xcd\x84\x55\xac\x3c\x31\x35\x30\xe7\xcb\xd6\x30\xb1\x3c\x3c\xae\x0c\x16\xd8\xd2\x65\xd8\xb6\xdd\x07\xbd\x2f\x7e\xeb\xf6\x9e\xad\x5f\xfd\x56\xff\xbf\x7c\x6b\x95\x1c\x56\x8e\x1a\xe6\xf2\x55\x18\x67\x57\x10\x30\x4d\x77\x11\x36\x09\xca\xaa\xec\xfa\xda\xaa\xa4\x7d\xbd\x8d\x9e\xb7\x5d\x55\x58\x7f\x06\xa3\xf0\x33\x27\xa0\x63\x07\x25\x95\x9c\x7d\xdb\x14\xa7\x9e\x72\xbc\x77\x7b\xea\x9d\x3d\x96\xa0\x7a\xc8\x14\x33\xac\xa2\xbb\xad\xca\x1e\xcb\x18\xa8\x4c\x37\xdf\xed\xa7\x77\xf6\xc6\x1e\x3f\x04\xb0\x9d\xd6\x6b\x0e\xbc\xcf\xde\xfa\x6a\xaf\x45\x94\x5b\xb0\x55\xf8\xd1\x8e\x6b\xb2\x97\x12\xf6\xb2\xc4\x7a\x45\x9a\x37\xc2\x58\x2a\x20\xd5\x61\x17\xb7\xff\xec\x89\xc1\xf6\xef\xf6\x6d\x39\x90\x43\xab\x57\x0f\x8b\xc6\xca\x26\xa5\x54\x77\xf2\xd0\x56\x03\xd5\x10\x59\x81\x87\x20\xb1\xb7\x85\xbe\xc7\x02\xca\xd5\x48\xd3\xac\x09\xe4\x23\x7b\x9c\x2e\x7b\x2c\xa0\x54\x0d\x83\x8b\xbc\x97\x3a\xec\xe5\xed\x52\x05\x86\x33\x30\xed\xe8\xeb\xbb\x7e\xb5\xfc\x69\x2d\xae\xf7\xf0\xb2\xed\x0d\x37\xd1\x20\x3b\xaf\x0b\x62\x0c\x5f\xbe\xf2\x54\xf5\x06\x3f\xa1\x97\x15\x40\x54\x91\x66\xb5\x65\xc1\xba\x52\xca\x08\xb2\xbf\x16\x0e\x5d\xe3\x96\xc9\x7e\x9b\xba\x6c\xbe\xb5\xef\xbc\x0c\xf5\x42\xda\x1c\x88\xfa\xd9\xd1\x54\xdb\xe5\x8b\xe5\xc1\xdd\xe5\xeb\xa5\xa9\x86\x43\xb6\xc3\x0a\xef\x56\x3d\xa2\xc2\xab\x3b\x8f\xa5\xdd\x51\x87\xed\xab\x98\x72\xf7\xed\xab\xb0\x52\x67\xe6\x8d\x15\xd1\xec\xc5\xdb\xce\x99\x4d\xda\xb5\xa7\xd7\xcb\xed\xd9\x53\x21\x7b\xd8\xe6\x4b\x71\x6e\xd5\x6d\xe2\xdf\x76\xd3\x82\x5d\x97\x40\x04\x7a\xbf\x71\x80\x7d\x97\x0d\x5a\xd0\xed\xe6\x68\x62\xee\xc6\x69\xbf\x23\x92\xc2\x30\x9a\xbd\xe1\x40\x70\xdb\x90\xeb\x43\xe0\xec\x08\x30\xb5\xa9\x1f\xe6\x61\x21\xcf\x66\x22\x03\x8f\x05\xd8\x87\xb6\xe6\x30\xfb\xf9\x51\x76\x82\x78\xc6\xae\x0e\xbe\x63\x99\xc0\x0f\xad\x02\x0d\xc5\x98\x6d\xbc\x79\xe5\x70\xa2\xb0\x67\xef\x1d\x37\xf9\xa9\xe7\xf6\x4b\x0a\xb6\xc6\x1e\x25\xab\x74\x07\x18\xb9\xa0\x3a\xcd\xbd\x57\x67\x02\x90\x1d\xac\x2a\x45\x76\x10\xd9\x7a\x68\x10\xa2\xd8\xd3\x0d\x19\xd9\x85\x60\x66\x06\x81\xcb\xf8\xce\x19\xc8\xc8\xfd\x3d\x8c\x14\xec\x16\x4d\x40\x76\x53\x30\x85\x51\x45\x7b\x22\x17\x3b\xa7\x23\x62\x4f\x07\xd7\x2e\x0d\x27\xa6\x9b\x54\xd8\x01\xdb\x12\xd3\x7d\xf0\xd0\x00\xfe\x86\x75\x90\x80\xb8\x9e\x55\x91\x2c\xa2\x0d\x12\x02\x73\x5e\x76\x28\x38\x5b\xbe\x68\x02\x04\xc9\x78\xa9\xdd\x28\xdd\x30\x0b\x3b\x02\x20\xca\x60\x7a\x17\xf2\x4d\x6d\x2d\xdf\xf0\x0e\x85\xbd\x66\x04\xb9\x19\xce\x54\xfe\xa9\x71\xf6\x9a\x11\x66\x6e\xfa\x3f\x30\x12\xfc\x75\x65\x46\xfd\x04\x5f\x9d\xce\x55\x68\x8a\xa4\xc9\xf5\xa3\xaa\x33\xe0\x4b\x35\x3e\xc3\x33\xd1\x88\xba\x50\x2b\xab\x06\x60\xe8\x46\xe4\x9a\x02\xc9\xa5\x3a\xb9\x88\x5b\x94\x12\x9b\x18\x50\x9b\x4c\x19\x3c\x34\xbc\xc8\xd0\x0f\xa1\x6f\xc5\x78\xbc\xc8\xc2\x4e\x8e\x16\xa7\x3e\x58\x81\x28\xcf\x7b\x14\x13\xaa\x71\x22\x4c\xd1\x64\xcd\x52\x10\xde\xd6\xb0\x08\x0d\x0f\x11\x26\x7d\x83\x10\xab\x5e\x24\xc2\x90\x7a\xaf\x00\x48\x35\x4c\xa9\x5e\x89\xda\x2b\xbc\x29\xda\x99\x40\xc4\x81\x0c\xed\x81\x88\xd4\x0d\x75\x0b\xb3\xb6\x28\x4c\x31\x5b\xa1\x2d\xfc\xc8\x08\x7b\x54\x3d\xed\x25\x4d\x9d\x28\xef\x7f\xad\xb2\x45\x58\xc3\xe0\x94\x3a\xed\xbc\x4d\x69\xf6\xef\xaf\xb8\x97\x87\x24\xd8\x6b\x87\x98\xf1\x7e\x63\x5f\x2a\xa3\x21\x54\x0b\xec\xe4\xcb\xee\x3d\x70\xce\xd6\x89\x39\x0a\x91\x4d\x72\x0e\x40\x51\x21\x0a\x60\x7c\x93\x4a\x07\x5b\x60\x5e\xe3\x17\x6e\x5f\x3e\x33\x8d\x48\x79\x0b\xf3\x18\x11\x92\x1d\xc9\x39\x4d\xfe\xb5\x48\xac\x1b\xc3\x3d\x7c\xc6\xc1\xc8\x74\x9b\x83\x46\x49\x04\x02\x77\x87\x39\x49\x8b\x1a\xbf\x4d\x88\x2e\x3f\x73\xa9\x1b\xa1\xb1\x83\xbc\x3b\x3c\xef\x00\x9e\x8b\xe5\x0d\xee\x66\x69\xa7\x5b\xf0\x4c\xac\x11\x6a\x45\x8d\x7d\xcd\x63\x8f\x11\xe5\x57\xfd\xaf\x78\xca\x31\xf4\x29\x6f\xb0\xe0\x28\xb7\xbd\x56\xa2\x69\xfc\x46\x69\x0b\x9b\x61\x01\x26\x6a\xdf\x96\xe9\x55\x98\xbd\x19\xf9\x12\x31\x1b\x4b\xf7\x37\xe4\x94\x1b\xdc\x4f\x5d\x9a\xfe\x44\x0e\xc1\xbd\x28\x28\x12\x21\x30\xd6\x04\x61\x1e\xe5\xe7\x8e\x98\xc6\x1c\x51\x4e\x61\xc0\xd0\x24\x67\x9c\xeb\xb6\xf9\xe4\x28\x2b\xcd\x36\x75\x82\xaf\xd1\x01\xbd\x76\x76\x61\x66\x09\x2f\x91\x31\xfa\xc7\x47\x83\xbb\xca\x17\xc9\xd9\x83\x64\x18\xca\xdd\x0d\xf1\x2f\x20\x2a\x56\xd2\xb8\x89\x5c\x68\x2d\x0c\x5c\xd7\x6e\xaa\x6e\xa8\x1c\xad\x6b\x61\x6c\x36\xe8\x03\x60\xea\xdd\xf0\x1e\xd9\xb5\xfd\x75\x8e\x90\x7b\xd5\x08\xfb\x2d\x8f\xb9\x0f\xf8\xbf\xe4\x29\x2c\xff\xb7\x78\x8e\xab\xcf\xf1\xf8\x0b\xbe\x1e\x25\xcd\x74\x1d\x86\x48\x6e\x6a\xb2\x56\x86\xa5\x80\xea\x4f\x42\x48\xd7\xbd\xc6\xdd\x12\x95\xb7\xaf\x0d\x58\x3a\x19\x02\x39\x80\xcb\x4c\x0a\x33\x88\x17\x46\x6c\x87\x8c\x8b\xfb\x7a\x61\x2c\xc7\xe9\xf8\xf5\xc7\x8e\xf1\xa3\x27\x8f\xf1\x4e\x94\x4c\xb8\x43\xf1\x54\x52\x3e\xae\x0f\x9e\xb4\x4c\x70\xc9\x9a\x83\xc0\x22\xf1\xa3\xe1\x51\xe6\xf1\x12\x0c\x39\xf6\x9b\xbf\xae\x7a\xa1\x8e\x8e\x49\x27\x02\x3d\x44\xe0\xf9\xb4\xa5\xa2\x63\xb1\xe5\x88\xd6\xa8\xc8\x97\xfb\x56\x4f\x40\x88\xee\xa6\xad\x75\x1a\xf1\xa6\x43\x6c\x7a\xcb\xf9\x74\xbc\x76\x56\x6a\xf0\xb2\x3e\xf1\x42\xda\x9c\xa1\x07\x44\x76\x2e\xca\x0b\xff\xcf\xc6\x83\x5b\x37\xb9\xef\xc2\x1e\xad\xe8\x87\x20\x44\x2f\x34\x8f\xa9\xd0\xe3\x0d\xef\x40\x54\x88\x8e\x3b\x67\x5e\x76\xf0\x8a\xa3\x72\x1f\x8e\xca\xcc\xca\xe6\x6a\xed\x82\x1d\xda\x8a\x9b\x8b\x72\x4c\xe5\x3a\xa2\x89\x17\x0d\x49\x30\x85\x85\x01\xa3\x98\x4e\xb1\xbd\x12\x1d\xb2\xcf\xe8\x90\x1f\xf3\x18\xae\x04\xff\x47\xbc\xe0\x3a\xf8\xab\x8c\xf9\xb6\xfd\x6a\xb2\x35\x9a\xb3\xec\x16\x36\xb7\x95\xc2\xb2\xd3\x25\xbf\xf3\x94\xdf\x2d\x0c\xcc\x5b\x88\x93\x61\xc6\x6a\xf6\x97\xbe\x93\x25\x65\xcc\x97\x2a\x9f\x45\xe1\x35\xf8\x1f\xf4\x83\x5b\xd4\x0f\x37\x19\x8b\xf6\xb9\x38\x6d\x47\x8d\x30\xe6\x41\x3d\x6c\xac\x8a\xa4\x19\x18\x1c\x5e\x44\xb7\x56\x48\x8b\x52\x51\x57\x08\x12\x8e\x3c\xfa\xfc\x63\xd8\x1f\x79\x6c\x3c\x49\x9b\x80\x11\xe6\x7f\xd2\x0b\x3e\xe4\xa9\x5f\xe5\xfc\x0c\x1b\xf2\xea\x42\xda\x44\xf0\x7c\x14\x50\x51\xae\x65\x0b\x85\x83\x11\xe8\x8a\xda\x41\x0c\x1e\x94\xc1\x2e\xc1\xf0\x63\x88\x05\x01\x6c\x51\x3b\x8e\x8c\x5e\x17\x89\x3c\xb8\x11\xd8\xb9\xfc\xae\x86\xc6\x89\xa3\x86\xb8\xa0\x2a\xaa\xb2\x2e\xda\x61\x51\x4a\x1f\xf2\xd8\x21\xd4\x8e\xa5\xa2\xfb\x02\x6f\x07\x78\x1d\x65\xcd\xf6\x82\x7e\x7f\x98\x4e\x6b\x67\x3d\xda\xda\xad\xd3\x75\x76\xef\xb0\x7f\x18\x63\xe3\x2a\x91\xc3\xff\x6f\x63\xc1\x6f\x8c\xe9\xb4\x0e\xbd\x4b\x86\x59\x3d\x2a\xb2\x30\xb3\x52\x5d\xec\x34\xa5\x32\x0a\xbc\x2d\xda\x15\x44\xcc\xaa\xe8\x4f\xe1\x5e\xd2\x0d\xa3\x8c\x94\x85\x46\x0a\xa5\x98\xb7\x30\x04\x16\x4b\xae\xed\x88\x98\x40\xce\x55\xa9\x3b\x4f\x91\xd5\xb3\x2a\xcb\xaa\xd2\x32\x9d\xc2\xfc\x13\xae\xb2\x49\x68\x23\xa2\x58\x43\xde\x09\x2f\x45\x9d\x5e\x47\xce\xa1\xe3\xa7\xca\x35\x54\xc9\x34\xf8\x74\x8e\x1a\x37\x45\xac\x42\xd6\x81\x89\xb6\xc7\x48\x5e\xc0\x91\x16\x71\x4c\xb4\xba\xab\xa2\x9f\x4f\xf3\xab\xb9\x5b\x79\x39\x45\xe5\xbc\x9d\x46\x01\x8d\x71\x46\x56\x40\x1a\x4e\x62\x7b\x66\xcb\xd9\xcf\x38\x47\x1a\x41\x67\xd3\x8c\x70\xca\x16\xc8\x51\x19\x69\x89\x6d\x08\xc4\x00\xc3\x4d\xaa\xb9\x4d\x94\x10\x80\x4c\x0b\x7d\x52\x63\x57\xeb\xb1\xac\xb9\x55\x7c\x56\x9a\x6c\x51\x3d\x79\xd7\x54\x86\xf1\x3d\x57\x67\x67\x95\xc9\x44\x1b\xc4\xd5\x66\xd5\xc1\xfb\x97\xbf\x42\x6e\x08\xa9\x15\x35\x04\xf1\xa8\x3a\x4a\x05\x03\x7b\xa2\x84\x32\xa9\x78\xd8\x8d\x0c\xec\xfb\x56\xe8\x5b\xff\xa3\x62\xe3\x31\xfd\x59\x25\xb8\xbf\x62\x60\x89\xd4\x36\xed\xac\x21\x58\x8d\x26\x65\x4c\x57\x0f\x32\x05\xe4\xd6\xdb\xcd\x04\x54\xb0\xd1\x00\x27\x58\x5b\xcd\x4e\xb7\x91\x8e\xc0\x52\x38\x3e\xa0\x5f\x53\xc8\x3c\x80\x8d\x75\x84\x5a\xa2\x88\x1d\x68\x1d\xc0\x30\x60\xdc\x01\xfe\x52\x78\x80\xb2\x82\x97\x0a\x9a\xb8\x51\xc6\xe5\x32\x68\x84\x5d\xc4\xf2\xa6\xc8\xfe\xc8\x2c\x7d\x0c\x9d\xb6\xb3\x39\xa8\x48\x8a\xb8\xb1\xe0\xe0\x8e\x1f\x3b\xb6\x85\x11\x61\x1b\xcc\xdc\x5c\x14\x80\x5a\x6b\x83\xf9\xfe\xe0\x56\xc9\xea\x9b\xef\x81\xb3\x26\x0c\x6a\xde\x94\x66\x04\xa5\x23\x15\xb5\x09\x6f\x38\x9a\xad\x11\xc1\xaf\xf6\xd8\x81\x15\xb9\x05\xc9\x6a\x5d\xbf\x87\x6a\x9d\x95\x2f\x07\x17\x56\x10\x5e\x6c\x68\x65\x4a\x22\x1a\x98\xfc\x13\xb3\x56\x5c\xdc\xae\x5e\x47\x34\x6b\xec\x77\x2a\x6c\x5c\x49\x23\xff\xc3\x95\xe0\x3d\x15\x57\x36\x0d\x6e\xb2\x38\x23\x6d\x6b\x13\xf0\x96\xaa\x09\xe5\xa0\xa0\x21\xf2\xb4\xdc\xaf\x7b\x51\xbe\x62\xdd\x80\xd3\x01\x64\x56\xa0\x7d\x03\x09\x33\xa2\x84\xcf\x5d\x58\xc2\xdc\x86\x09\x2b\xb1\xc3\xbc\x87\xa7\x36\x15\x0e\x08\x09\x1d\xba\xbe\x43\x61\xc9\x5a\xbd\xa4\x0d\x44\x18\xf8\x05\x83\xaf\xaa\xe2\xaa\xf0\x9b\x13\x86\xc6\x2e\x4e\xd7\x45\xd6\x08\x29\x82\x17\xb0\x16\x65\xa5\x20\xf9\x85\x1f\x5d\xbc\x65\x96\x1f\x3f\x7e\xe2\xe4\x84\x45\x38\xed\xec\xfe\xaf\x71\x8d\x0b\x3b\xc1\x44\xf0\xbf\x38\x12\x9c\x1d\x76\x43\x1f\x13\x06\xb3\x16\x37\x85\x21\xd8\xf0\xc6\x15\x66\xc0\x86\x37\x86\xaa\xf1\x86\xa7\xb5\x2d\x47\x13\xfb\xab\x0a\x7b\x81\xc7\xe8\x21\xff\xd2\x7e\xc0\x12\x10\xf8\xfd\x5a\xc2\x67\x2f\x29\x71\x36\x91\x92\x19\x25\xaa\x66\xb3\xc6\x5e\xe7\x31\x5d\x69\xff\x07\xbd\xe0\xb9\x33\xf4\xa3\xb4\x11\xd8\x5b\x26\x95\x69\x43\xa0\x9e\xbf\x63\x69\x59\xc9\x32\x3a\x02\x69\x2b\x54\xe4\x02\xf3\x6a\xd6\xd7\x7a\x9f\xdf\x2a\x8a\x85\xb8\xd7\x8e\x12\xd9\x3f\x47\x5d\x16\xcd\xb3\x96\x9e\x4a\x36\x78\xd8\x41\xb4\x35\x51\x91\x2e\x0e\xb4\x0a\x71\x81\x4c\x49\xef\x3f\xec\x40\x9b\x6b\x07\x50\x28\x3a\x69\xb2\x24\x70\x22\xbc\xea\x70\x70\xd2\xb9\xb2\xc5\x0c\x68\xc2\x73\x40\x0c\xb8\xe1\x8d\xab\x8c\xa2\x0d\x6f\xbc\x10\x9d\x6e\x0c\x90\xe5\xd6\x50\xff\x12\x63\xaf\xaa\xb0\x47\x77\xa2\x04\x00\xf3\x94\xe9\xe8\xff\x6a\xd3\xd1\x5f\x7a\xcb\xc8\x82\x0c\xda\x12\x31\x23\xa7\x2d\x1d\x11\x6e\xac\x45\x21\x4f\xc4\x7a\xdc\xd7\x8c\x90\xba\xc2\x70\x8e\x32\x3d\x81\xd0\x79\x52\x12\x49\x19\x49\xa6\xe7\xc8\x08\x2f\x91\xf1\x46\x16\xe6\x2b\x00\x9a\x27\x8b\x8f\x0a\x4a\x74\xb4\xd6\xaf\x06\xa8\x73\x23\xb9\x8f\xf1\xa3\xf2\x63\x6a\x93\x1e\xf6\x02\x0f\x73\x9e\xa7\x20\x16\x89\x1c\x07\x2a\x54\x32\x40\x7d\xc8\x63\xdf\x92\x89\xb5\x48\xee\xe6\x67\x23\x39\xcd\xfb\xe7\xa4\xe2\xe7\xbf\x4d\xf7\xcc\x2b\xa0\x67\x4c\x8f\xa4\x71\x93\xaf\xe0\xa3\x48\xaf\x03\x7b\x9c\x54\xcc\x21\xd8\x52\xf1\xf6\x58\x89\xda\xe8\x89\x43\x88\x56\x5b\x1e\x2a\x7b\xba\x4a\xf9\x31\x86\xb4\x52\x4c\xba\xdd\x74\x20\x62\xb6\x5a\xf0\xe1\x0a\xd3\xa3\xef\xbf\xb7\x72\x19\x32\xfb\xfe\xa7\x37\x63\x65\xc3\xf7\x81\x1d\x8e\x12\xfc\x0c\x46\xa4\x46\x38\x86\xe0\x51\x33\x17\x6d\x7e\xdb\x28\x21\xc2\x72\x3d\xac\x85\xec\x1d\xca\x7f\x2f\x11\xa8\xcb\xf1\x54\x53\x17\xfc\x59\x90\x55\xbe\x5b\x0e\xb3\x9d\x1c\x15\xa6\xae\x82\x7f\xab\xaa\xd7\x72\xf6\xa2\x11\xa6\x97\x8d\xff\xff\x56\x76\x70\x62\x5b\x48\x9b\xcb\xf4\x02\xc0\xda\x3c\x50\x99\x71\x5d\x0d\xae\xb7\x16\x1a\x27\x2f\xeb\x19\x8b\x8b\x07\xb5\x3e\xb3\x82\xe0\x36\xde\xe3\xe2\x52\xd8\x28\x80\x94\x48\x76\x5d\xb7\x6f\xf8\x65\x52\x48\x97\x03\x10\x6c\x4b\x1c\xd9\xf9\xad\x56\x47\xc2\x03\x3a\xe1\xf0\x68\x9a\x95\xde\x45\x1c\x5f\xf7\x29\x9b\x1b\x7f\x62\xd7\x63\x20\xbb\x3e\x4e\xc3\x66\x3e\xa5\x47\x3c\xcb\xa7\x32\x81\xd0\xf7\x51\x9a\x98\xcb\x57\x75\xd3\x66\x55\x55\x96\xfd\xa8\xc7\x1e\x85\xb6\xbf\x25\x45\x5e\xf0\xbc\xad\x94\xa5\x01\x21\x7a\x87\xf3\x72\x30\x37\x93\x90\x2d\x91\x2b\x36\x04\x5c\xb1\xdd\x38\x6c\x58\x01\xdc\x8e\x04\x23\x8c\xdb\x44\xac\x63\x92\x28\xfb\xec\x38\x3b\xb9\x95\x73\x0a\x77\x44\xcb\xc5\x43\x80\x33\xaf\x1f\x0f\xe6\x06\xae\x1a\x37\x8a\xc2\x9d\x30\x3e\xa9\x12\x69\xa3\xda\xbd\x5c\x14\x82\x83\xec\x55\x07\x6c\x2f\xe7\x8b\x0e\x04\x7f\x31\xea\x7a\x39\xd5\x4d\xcb\x23\x99\xf3\xc6\x4a\x9a\x23\xc7\x7c\xe1\xf2\x43\xa6\x99\x59\xd6\x40\x3f\x5f\x80\xbe\x04\x9d\x00\xd4\xbb\xf2\x79\xdb\x81\x05\x51\xec\xe4\x99\x74\xbd\x9e\xc8\x7e\x37\xe8\x07\x05\xe1\x97\x1b\xaa\xd2\x52\x89\xb0\xd1\x19\x0f\x97\x8a\x92\x87\x6f\x1c\xc9\x2d\x17\x23\x9f\x51\x06\xe4\xc1\x42\xc0\xe1\x86\x1a\x86\x28\xcc\xa6\x59\x33\xe5\xa2\xe2\x4a\xfb\x93\xe5\x77\xc3\x98\x09\xd3\xf2\x21\xdd\x87\xbb\x87\x21\x8a\x37\x48\x41\x03\xe5\x0f\xc9\xfb\xb6\x6b\x89\x2e\x41\xe8\x2a\xf5\x99\x70\x3d\xcc\x10\xd9\x30\x74\x1e\xc5\x0f\x22\x4f\x17\x82\xe0\xbb\x5f\x54\x59\x2f\x70\x2c\xd6\xf7\x8c\xd7\x17\x4e\xb5\x41\x91\xf5\x44\x30\x69\xcd\x32\xcc\xaf\x8a\x0c\x67\x80\xed\x0d\x56\x1d\x6b\x59\x98\x8c\x23\x73\x2b\x17\x6f\x9b\x3d\xd2\xf9\xb6\x7f\x67\x70\x76\xc6\xad\x8c\x9b\x92\x67\xb9\x62\xc3\x7c\xe0\xe8\x12\x92\x81\xa5\x97\xc3\x67\xad\x84\x97\xb3\x8a\x7d\xf1\x29\xc1\x09\xa2\x74\xdb\xac\xe0\x86\x1c\xe9\xe4\x08\x68\xf5\xe0\x2b\x14\x0e\x9f\xe5\x73\x88\x89\xb4\xd8\x4a\xc2\x0c\x5f\xec\x77\xe4\x22\x9b\x4f\x5a\x69\x70\xbd\xfc\x4b\xad\x69\x75\x75\xa8\xad\x4c\x87\x37\xe0\xd2\x61\x3f\x76\x88\xd5\xb6\x60\x31\xd1\x04\x26\x16\xfa\xf8\x57\xc6\x83\x62\xf0\xb2\xb6\x5e\xe9\x85\xad\xcb\x91\xca\xa8\x7a\xca\xe8\x45\x2d\xcc\x52\x54\x9a\xba\xf6\xc0\xc0\xfb\x16\x70\x26\xac\xda\x56\x58\xe2\x12\xff\xb3\x83\xc0\xe1\x0a\xe7\xc5\x67\x05\x1d\x30\x85\x0e\xa1\x27\xd0\x1f\xa8\x0b\x04\xf0\x55\x5e\x63\xf4\x85\x06\x6d\x51\x04\x88\x81\x06\xc9\x84\xea\x32\xfe\x0c\x6a\x3c\x08\xf8\x51\x98\xf5\x13\x0e\xa1\x83\x19\xbd\xaf\x56\x6c\xe0\xa1\xff\x56\x09\xfe\xb0\xa2\x39\xe5\x87\x02\x0f\x41\xef\xa0\x08\x2a\xd5\xa9\xc6\xf9\xac\x82\x7e\x9e\x24\xa0\x0c\x30\x02\x92\xb2\xa6\x5e\x42\x65\x4d\x6e\x96\xba\x5c\x95\x42\xae\xaf\xe4\x76\xcd\xc1\xaa\x04\x9a\x1b\xb5\x10\xd8\x02\x08\x13\x6a\xa6\xd1\x10\x79\x8e\x6b\xbd\xfc\x16\xae\x77\xf9\x86\x22\xe0\x47\xca\x7d\x8b\xc9\x63\xa0\x83\x82\x30\x8e\x03\x78\xc7\x54\x6f\xe0\x2d\x38\x77\x6b\x2c\x63\xbb\x0a\x72\x30\x96\x44\xdc\x1a\x72\xcb\xee\xf6\xef\x61\xe3\xaa\x34\xff\x5c\xf0\x14\x35\x1d\x81\x2c\xc0\xe2\x1e\x51\x3b\xab\xf1\x1e\xf6\xbb\xc0\x71\x52\x66\xe8\x30\x25\x7f\x2f\x3b\x6c\x31\xca\xf8\xb7\x07\xa7\x97\x2c\x82\x99\x1d\x97\xaf\x8a\x4f\xd2\xc4\x35\xcb\xbf\xd0\x63\xa3\x6b\x22\xab\xfb\xcf\x0e\x12\x43\x29\xb3\x15\x95\xcc\xe5\x63\x92\x31\xb5\x58\x62\x07\xc9\x76\xe8\x9f\x0d\x6e\x54\x0e\x3d\x9a\xaf\xf2\xc3\x77\xba\x9c\x70\xaa\x83\xb7\x2c\xf4\x3c\x3b\x00\xce\x22\x7f\x2e\xb8\x0e\x89\x66\xac\x02\x6f\x55\x20\xfe\x3b\x2e\xee\x33\x23\x6c\x96\x44\x93\xec\x9e\x6a\xd8\x6e\x67\xa2\x2d\x35\x05\x07\xf5\xcf\x49\xb5\x31\x2c\x5d\xda\x8b\xe1\xff\xe0\x48\x70\x63\xf9\x22\x21\xa1\x95\x5c\x1a\xf4\x54\x2d\x16\xed\x50\x07\x69\x3b\x62\xe7\x83\x15\x76\x0d\x49\x9d\xc9\xe0\xf1\x9b\x49\x1d\xf2\x3d\xd9\x8d\x99\xb5\xc5\xc4\xa9\x60\x62\x7b\x21\x31\xa4\x90\x5f\x03\xae\xf3\xac\xf0\xdf\xaf\x4f\x85\x6f\xf6\xe6\x5b\x36\xaa\x05\x6a\xf9\x59\xa1\x39\x44\x09\xb1\x0f\xc9\x59\xc8\x69\xb5\x2e\xea\x2b\x69\xba\x6a\x58\xae\x8b\x94\x5f\x73\xcd\x49\x58\xb5\xf2\xcc\xb8\x1e\x66\x4d\xad\x8a\x00\x39\x62\x8d\x5f\x94\xa5\x5e\xb4\x2d\x0c\xb4\x7f\x77\x0d\x90\x3b\x3f\x7a\xbc\x7a\xea\xda\x6b\x4f\x5e\x3b\x89\xbb\x41\x1e\xad\x89\xd2\x41\xf7\x2b\x07\xd8\xe4\x36\xa0\x76\x70\xf0\x5d\xa4\x90\x19\xff\xbd\x07\x82\x05\xe7\x8a\x76\x3b\xaf\xa4\xeb\xb2\xe2\x64\x69\x31\x3b\x08\x60\x71\x84\x89\x4a\xac\x17\x97\x44\xa3\x07\xf4\x43\x51\x7b\xa5\xe0\x49\xba\xae\x42\x5d\x5c\x23\xd4\x08\xfb\x88\xc7\x0e\xde\xd7\x13\xbd\x28\x69\xfb\xef\xf7\xb6\x40\x0e\x1b\x56\xeb\xef\xc6\x17\x67\x6d\xe6\x8f\x20\xbb\x48\xe5\x5d\xa4\x09\x57\xac\x88\x12\x39\x88\x15\x66\x28\xbb\x9f\x9e\x1f\x66\xe4\x4c\xd2\xa4\x8a\x12\x19\x82\xc2\xa2\x16\xbf\x28\x5b\x01\xf8\x76\x17\x03\xf9\x7d\x11\x5c\xac\xb1\xfb\x2b\x14\xcc\xf2\xba\x4a\xf0\xd2\x8a\x79\x84\x9e\x00\x88\xbd\x45\xf0\x93\xcb\xfd\x8d\x2e\x5a\xa4\x46\xdb\x77\x64\xaf\x0b\x98\x26\x59\xb4\x16\xc6\xa0\xaf\xaf\xe8\x48\x27\x59\x7d\xc1\x7b\x49\x11\xc5\x04\x5b\x42\xce\x4c\xf5\x2e\xec\xaf\xd4\x48\xf4\x6d\x91\x49\x04\x4c\x70\xba\x66\xfb\xac\x10\xc6\x01\xc8\x02\x87\xc1\xf8\x3d\xe8\x5d\x64\xdf\xec\xd8\xf0\x7b\x09\x58\xea\xe7\xfd\x5b\xab\x90\x54\x93\x45\x9d\x28\x91\x92\x66\x1a\x89\xe8\x38\x8e\x44\x5e\x2d\xd2\xaa\x75\x5f\x9c\xee\x23\xa1\x06\x35\x68\x9a\xd3\x2c\x60\xec\x4d\xa3\x4e\x74\xaa\x8b\x90\x74\x76\x79\x79\xc1\x02\x46\x82\x38\x21\xff\xbf\x8f\x04\x6f\xad\x0c\xbb\x53\x8a\xbe\x29\x8a\xae\x3e\x21\x13\xd2\x26\x79\x60\xc8\x15\x9e\x6b\x66\x66\x22\x2e\xc1\xe3\xf2\xf4\xd4\xd4\x4d\x52\x00\xdc\x3c\x75\x53\x37\x2c\x56\x6e\x7e\xca\x4d\x48\x8b\xdc\x0d\xb3\xe2\x66\x5e\xbd\x59\xbd\x4e\x9a\x3c\xfe\xaf\xbc\xa9\xbd\x08\xbd\x2c\xb6\x3c\x3c\xf2\x8b\x8b\xb7\xcc\xf2\x93\x37\x5c\x7f\x6a\x52\x19\x3a\x69\xeb\xb2\xb1\x0f\x0c\x98\xa3\xd2\xf4\x2d\xda\x2c\x43\x1d\x09\x81\xc3\x47\xa6\x8e\x80\x2e\x63\xe1\x3e\xb4\xa2\x4c\xde\x78\xca\x11\x39\x75\x8e\x5c\x75\xa4\xb6\xe1\x1d\x90\xf5\x77\x9d\xf9\xef\xf6\xd8\x3b\x3d\x86\x37\xfc\xb7\x7a\xc1\x35\x33\x76\x6a\x76\xda\xe2\x70\x47\x19\x28\xba\x8e\xbe\xa9\xbb\xcd\x3e\x57\x4c\xb3\xeb\xd9\xa9\x1d\x02\x5e\x59\x83\xb6\x10\x16\x2b\x0f\x7a\x57\x6d\xea\x22\x3a\xe4\x1f\x0c\x8b\xb4\x13\x35\x18\xfb\x17\xcf\x09\xc5\x77\x8b\xa4\xe2\xe8\x08\xff\x69\x2f\xb8\xde\xb9\xa2\xcd\x3a\x03\x3e\x1f\xbd\x7d\x28\xf4\x1f\xa7\x9b\x5e\xe2\xb1\xef\x2f\x53\x2a\xf6\xf6\xc6\xa8\x78\xf3\xbe\x18\x15\x6b\xec\x4d\x87\xd8\x51\xbb\xf9\x69\xd3\x98\xf5\x17\xa5\x00\xe9\x88\xd9\x38\xcc\x73\x88\x4d\xfb\xfb\xf1\xe0\x64\xf9\xa2\xbb\x2c\xec\xbb\x5b\xc7\xa1\xfd\xea\xc1\x2b\x71\x4d\xfb\x8d\x6b\xea\xaa\xb0\xa6\x76\x10\xcc\xab\xa8\x26\x33\x18\xaa\xab\x86\x04\x30\x9d\x62\xd7\xb0\x13\x9b\xaf\xab\xcd\x66\xc1\x95\xd0\xc1\x7d\x84\x0e\x7e\xc2\x46\x82\xff\xa0\xb7\xbf\xe0\xc1\xef\x5b\x1a\x1e\x2c\xf8\xf5\x02\x81\x7f\xd0\x6b\x6d\x1f\xb8\x36\xeb\xcf\x6c\x99\xfc\x57\x96\x25\x43\x73\xa5\x1e\xa8\xb0\x4d\xfb\xa6\x57\x44\x71\x2d\x4a\x8a\xbc\xc8\x6a\xf3\x49\xa1\xc0\xc3\xfd\x1f\xa9\xf8\x8f\x8c\x92\xa2\x9a\x66\x55\xec\xfc\xe0\x7f\x79\xd6\x7d\x9c\xb3\xc8\x4e\xa8\x94\x19\x88\x71\x0e\x13\x0e\xfa\xbc\x8d\x2d\x5e\xe3\xc8\x94\x0c\x9b\x68\x94\x00\x0c\xb9\xbc\xff\xf4\x99\xf3\xe7\x78\x27\xcc\xf2\x95\x30\x8e\x15\xdd\x71\x2f\xb1\xae\x00\xb8\x1d\xf2\x9a\x09\x80\xad\x23\xbf\xb8\x62\xc9\x48\xe4\x14\xef\x77\xe5\xf1\x0b\xd4\x4c\xc2\xd1\xec\xa7\x3d\x54\xa8\xd7\x04\x7a\xc2\x34\xf1\x19\x62\xa0\x2b\xd3\xa2\xaa\x79\x08\xe8\x20\x3c\xa4\xb3\x4f\x46\xa7\x00\xe7\x10\xf7\xd2\xc3\xec\xf8\x66\x11\x8a\x9b\x06\x27\xfa\x9f\x65\x41\xd5\x55\x93\xc1\xd7\xb8\x69\xac\xa4\xbb\xcb\xbd\xe3\x0a\xf3\xc6\x15\xe6\x8d\x2b\xcc\x1b\x97\x93\x79\xe3\x73\x8a\x79\xe3\x77\x3d\x36\xbb\xb3\xf8\xe3\x4d\x57\x37\x38\x2a\x5f\xe2\x11\x9d\x46\x2f\xc3\xd4\x34\xbd\x94\x1f\xea\x36\xc9\x66\x54\xc3\xa4\x59\x25\x5f\x05\x7b\x8e\x4e\x4b\xcc\xd8\x99\xfd\xb6\x0d\x95\xe3\x09\xa5\x02\x0f\x0f\xd2\xb2\x5a\xfb\xa0\xb7\xb2\xfd\x76\x76\xc6\x9f\xad\x6e\x1d\x72\xbd\x13\xa4\x11\xf6\xc6\xc3\xec\x71\x56\x8b\x00\xc1\x03\x98\x32\xd2\xba\xff\x82\xc3\xc1\xf1\xa7\xa5\xf5\x01\x0e\xfb\x41\x21\x4c\x01\xd8\xf7\xa6\x75\x57\xea\xfe\xcf\x43\x57\x84\xc6\x3e\x84\xc6\x67\x6c\xa1\xf1\xb1\x7d\x0b\x8d\x17\x96\x85\x86\xcd\x9d\xf6\x75\x13\x1b\xbf\xa7\xc4\xc6\x6f\x7b\x6c\x62\xd3\xa5\x65\x4f\x44\x10\x0e\x6f\xf4\xb6\x64\xe7\x51\x44\x3c\x38\x1f\xe5\x44\xfc\x3a\xcb\x0c\xf6\x80\x21\xf7\x79\xbf\xc7\x9e\xb4\xb3\x96\xa1\x68\xf8\x01\x6f\x76\xe0\x78\xfc\xf0\x34\xe2\x8a\x8e\xb4\x3f\x1d\xe9\x41\xef\xc2\xf6\xa2\xfb\x49\xfe\xc4\x8e\x50\x96\x9e\x96\xd6\x19\x7b\xd7\x21\xf6\x84\x4d\x82\x70\x1d\x2a\x53\xff\xc5\x87\x82\xeb\xec\x0b\x6e\x8a\x0c\x5c\x51\x21\xb1\x61\xe2\xc6\x61\xbb\xee\x8c\x71\x56\x67\xe3\xdd\x2c\x2d\xd2\x46\x1a\xfb\x77\x06\xf3\xcb\x2b\x82\xcf\x2f\x70\x75\x89\x72\xfc\x21\xda\x27\x2b\x4c\x74\xea\x1d\x73\x0b\x93\x7c\x79\x76\x01\x00\xb8\x97\x66\x97\x17\x8c\x2f\x21\xca\xe5\x0d\xe7\x10\xf0\xb9\x0a\x3b\x1c\x76\xbb\x0b\xea\x3b\xbf\x59\x09\x7e\x19\x30\x5f\x01\x5f\x9d\x16\xf9\x66\x9f\xb4\x0c\xe1\x03\x30\xe6\x56\x7c\x00\x21\x9a\xf7\x93\x22\xbc\x54\xe3\x77\x24\xd5\x6e\x26\x5a\xd1\x25\xd1\x24\x7a\x7f\x34\x0b\x43\x04\x01\x3a\x41\xe7\x67\x2e\xcc\x98\x92\x94\x9f\x04\x1f\x3e\x1a\x42\x42\x26\x5f\xbc\x65\xb6\x7a\xea\xe4\xc9\x6b\x11\xf7\x11\x8d\xa8\xeb\xeb\xeb\xb5\x28\x4c\xc2\x5a\x9a\xb5\xa7\xc2\x3c\x8f\xda\x09\x70\x90\x4c\x29\xf6\x1c\x15\x37\x7c\x21\x4d\xaa\xba\x7c\xd5\x3a\xbd\x1a\x7a\xb9\xe0\xa5\x2a\x22\x62\x75\xce\x3b\x7d\xf0\xbd\x24\xfd\x5a\x23\xed\x4c\x75\xfa\xd5\x46\x2f\x2f\xd2\x4e\x55\x95\xe1\xf4\xed\xc7\x46\xc8\x1f\xf5\x2b\x23\xc1\xcf\x8d\x2c\x3b\x9e\x28\xdd\x87\x33\x00\x2f\x9e\x21\x06\x62\x79\x46\xa8\xe0\xfb\x35\xc1\x43\xde\x4b\xa2\xfb\x7a\x82\x98\x76\x88\xe5\xd2\x7d\x1a\xbc\xc9\xd9\x5a\xa4\x70\x30\x9c\x3c\x20\xea\x83\x49\x05\x55\xa1\x8c\xc5\x7a\x89\x2b\x17\x1b\xd4\xe6\xee\x7b\x6a\xf8\x21\x70\xa4\x21\xec\x38\x42\x66\xd6\x85\x1d\x6f\x02\xda\x43\x9a\xe9\x28\xe8\x67\x9e\x9b\x39\x7d\xe6\x9c\x15\xfa\x3c\xcd\xaf\xb6\x00\x80\xad\x60\xfe\x53\x27\x79\x63\x25\xcc\xc2\x06\x38\x58\xe2\x54\x9e\xaa\xaf\xd6\x59\x01\x39\xd9\xab\x20\xd6\x9a\x63\xb0\x75\xdc\x5d\x09\x93\x5e\x47\x64\x51\xc3\x7e\x35\xcd\xf8\x91\xea\x11\xfd\x32\xd0\x2c\xc3\xac\x00\x8b\x39\x41\x2f\x0c\x7f\xd9\x59\x1a\x76\x93\x9c\x71\x7c\x8f\xf2\xed\xbd\x43\xfb\xf6\x5e\x0d\x11\x9f\xb6\x7f\xad\x1c\xce\xaf\xa1\x8a\x07\xe1\xed\x71\xb8\x15\xa7\x74\x26\xe4\x67\x1a\x2a\xab\x44\xf5\x95\x9d\xcc\x31\x34\xb3\x42\x47\xfc\xea\xd0\x7a\xd7\x9d\xf7\x5f\xc6\xd9\xc4\x76\x46\x6c\x63\xc6\x7d\xd9\x78\x70\xb2\x7c\x11\x35\x44\xd7\x58\x6f\x3f\x23\x36\x31\xe3\xfe\xfe\xd8\x15\x75\x73\x1f\xea\x66\xdd\xd2\x36\xef\xdc\x9f\x45\xf0\x71\x9b\x58\x04\xaf\x28\x18\xfb\x35\xc2\xe4\xca\xcc\x7e\x6f\xf0\x84\xf9\x61\xc9\xc3\xa5\x85\x62\x1b\xda\xaf\x63\xd7\x6e\xe1\xd8\xd9\x7c\xa1\x3e\xe8\xb5\xb7\xd7\x6a\xe6\xfc\xd3\xd5\xed\x51\xe0\xca\x4b\xbd\x74\x48\x65\xbf\x37\xce\xae\xdd\xf5\x09\x1b\x04\xc9\xeb\xc7\x83\xab\xf7\x09\x47\xf0\x57\x63\x57\xe6\xe7\x7e\xe7\xe7\xf7\xeb\xf4\xf6\xe7\xec\x66\x3c\x76\x4e\x2c\xb4\xb3\x29\x71\x65\x23\xf8\xc6\xde\x08\x1e\xf4\xe2\xed\x45\x0a\xc4\x5e\x5c\x06\xac\x81\xe3\x8c\xfd\xfa\x41\x27\xc6\x48\x39\xb1\x31\x34\xe7\x7c\xd8\xbd\x90\x36\x05\xfe\xc0\x3c\x31\xff\x35\x07\x83\x78\xd3\xbb\xae\x6f\xdb\x36\xe8\x41\x0c\xbf\x45\x1c\xaf\x4a\x90\x3a\x7c\x48\xa6\x33\x45\x3e\xa6\xb0\xd2\x20\xdb\x7f\x08\x95\xe6\x86\xf7\x4d\xb2\x7f\x62\x51\x60\x31\xb7\x89\xbe\x23\xae\xfe\xfe\x00\xeb\x92\xa2\xbf\x12\xdc\x6d\x07\x9e\xe9\x6e\x76\xe3\x5e\xa9\x5e\x4d\x53\xad\x32\x59\x0d\x11\x28\x62\xe4\x4e\x1c\x83\xfe\x9b\x3b\x3a\xe9\xf7\xd9\x41\x6b\x59\x20\x06\x82\xd6\x9c\x6f\x3b\xd1\x6b\x97\xa7\x02\x3f\xef\xb1\x47\xab\x15\xaa\xc4\xf4\x1b\xbc\xe0\xe5\xde\xa2\x7b\x71\xa0\x3e\xe5\xfb\xbb\xa8\x55\x2b\xcd\xea\x51\xb3\x29\x80\x88\x04\x86\x6b\xa9\x2b\x1a\x28\x84\xed\x1a\xe3\x2d\xb4\x21\xdb\x75\x7e\x99\xc7\x46\x7a\x51\xd3\x7f\x91\x17\xac\xdf\x31\x3f\x37\x50\x35\x79\xed\xeb\x58\x9d\x0f\x78\x6c\x60\x66\xf9\x3f\xe1\x05\xaf\xf5\x6e\x2b\x5d\xe5\x4d\xd1\x88\xc3\x4c\xa8\xf4\xd6\x55\xd1\xdf\xaa\xa2\xc3\x4e\x77\x4e\x91\x1a\x34\xab\xc8\x7a\x20\x95\x76\x3d\xfc\xef\x19\x1d\xba\x90\x97\xfb\x5d\xd1\x84\x18\xe6\x12\x60\x85\xff\x82\xd1\xe0\x3f\x6f\x7a\xd7\x2c\x64\x91\xa4\xbd\xf6\x4a\x79\x2d\xc7\xa2\x00\x17\x28\x26\xf2\x63\x00\x7f\x1f\xe3\x96\x75\xeb\x69\x83\x88\x20\xcf\xcf\x24\xff\x1a\x1a\xb4\x0d\x0f\x76\xa2\x61\x04\xb9\x5f\xa9\x00\xe0\x48\xd8\x8d\x20\x16\x16\x01\x47\x66\x16\xe6\x9d\x50\x59\x90\x80\x5a\x5a\x0c\x84\xaf\xab\x8a\xc0\xc9\xcf\x7e\xb7\x74\xfa\x2b\x1c\x3e\x1a\xd8\x11\xcd\x99\x4f\xa5\xea\x63\x60\x2e\x7c\xb1\xc6\x6f\x49\x33\x4c\x8e\x54\x94\x15\x59\xb3\xda\x0d\xb3\xa2\x8f\x31\xcd\x93\xce\xd7\xb2\x61\xe4\xb8\xa7\x69\x13\x9e\x0e\xaa\x6a\x0b\x56\x7d\x08\x14\x70\x9b\xb5\xa5\x54\x06\xc8\xb8\xe9\xa0\x3a\x2c\xb8\x76\x47\x65\x7c\xfa\x10\xfb\xce\x21\xd9\x59\x8b\x98\xf8\xb5\x24\x0a\x50\x21\x7f\xe6\x50\x50\xba\x34\xec\x24\x6a\x9e\xd8\x44\x8d\x7c\xe9\x38\x7b\xbf\xd6\x82\xde\xe9\x05\xa9\x62\xbc\xb3\xdf\x7c\x08\x33\xd7\x6c\x5d\x6a\x8a\x55\xb7\xb0\x45\x0f\xf6\xc3\x15\xbd\x69\x1f\x7a\xd3\xa7\x6c\x7f\xcd\x03\xfb\x0c\xaa\x79\x81\xf7\x30\x45\xd5\x58\x8d\xbb\x72\x1c\xda\xb7\x3f\xe0\x7b\xb6\x57\x73\xaf\xf5\x4f\x0e\x67\xdd\x70\x65\x51\x59\xa5\x7d\xd9\x41\x76\xdd\x1e\x9d\xd1\xfe\xef\x8e\x05\xd5\xc1\x90\xcc\x2d\xa2\x69\x36\xbc\x47\xd3\xf3\x54\xa9\x7c\xc3\x7b\x34\x39\xdf\xd4\x15\x47\x08\xfe\x8f\x03\xec\x0b\x1e\x7b\x3c\xbd\x34\xbb\x70\xc7\x1d\x45\x14\x53\xf2\xd7\x82\xc8\x1a\x72\x3e\xb4\x85\xff\xcb\xda\xb2\xf9\x93\x9e\xaa\x50\xb8\x26\xb2\xb0\x2d\xf8\xec\xc2\x1d\xbc\x67\xde\xc2\x64\x6f\x45\x37\x3a\x69\xe6\x95\x68\xa2\x76\xdd\xd5\xc5\xe2\xbe\xa0\xf2\xba\x66\x17\xee\x98\xe4\x80\xb1\x71\xdd\x31\x3b\x88\x3c\x4c\xf4\xa7\x80\x89\x38\xe7\xbd\x1c\x81\x78\xd6\xf9\x75\xc7\x9e\xa8\x30\x01\x9c\x82\x5c\x53\x67\x8b\x95\x7b\xc5\x5f\x52\xed\xb9\x59\x35\xc7\xd8\x69\x49\x5a\xe7\x8a\xe5\xd5\xcd\x55\x87\xc4\x4b\x2b\x7a\xc9\xfd\x4e\xa9\xaf\xad\xef\x28\x17\xe8\x65\xf8\xce\xe7\x3c\xf6\xc8\x38\xcc\x8b\x25\x79\x0f\x80\xaa\x3f\xee\xed\x1d\xa9\xfa\x87\xbc\xd8\x41\xce\xde\x0c\x49\x12\xfe\xc1\xc4\x5a\xd3\x06\x59\xef\x1b\xb5\xc7\xca\x8d\x90\x00\x84\x55\xdc\xee\x20\xe3\x23\x6d\x15\x04\xfd\xeb\xbe\x0f\x34\x60\x80\xa9\xd9\xac\xb1\xef\x65\x7e\x5a\x47\x5f\xcf\xad\x22\x11\xa8\x88\xfa\x67\x15\xae\xec\xc9\x4e\x9a\x83\xdc\x91\x43\xd6\xd6\x0f\x70\xf5\xce\xb6\x7d\xf7\xc6\x83\x4e\xd6\xa4\xce\xc6\x27\x0e\xc7\xa4\x40\x60\x92\xd9\x38\x8c\x3a\xb4\x0a\xff\x66\x2c\xb8\x7d\x8b\xfb\x4a\xd3\x19\xb6\x50\xbb\xfa\x35\x85\xf3\xd1\x90\x2f\x96\xc8\x3c\xc7\xd8\x67\x3c\x76\x38\x84\x84\xb9\xf3\x69\x53\xe4\xfe\x03\x5e\xf0\x93\xde\x8c\xb9\x50\x82\x22\x6d\x14\xbd\x30\xe6\xf8\x02\xef\xa4\x2a\x75\x93\x3e\x51\x0f\x1b\xab\x6a\xc7\x5f\xb8\x73\x96\xaf\x84\xbb\xd7\x63\x08\xae\x65\xca\x34\xa0\x8a\xa5\xe7\x57\xe1\x67\xab\xf0\xd9\xea\xf1\x2d\x32\x7a\x5f\xe3\xb1\xf1\x46\xd8\x0d\x1b\x51\xd1\xf7\x5f\xe2\x05\x37\x2c\xba\x11\x2a\xd4\x0c\x93\x5b\xa8\x92\x15\x92\xa6\xc8\xe2\x3e\xe8\x31\xf0\xcd\xda\x3b\xbc\xa7\xb0\x27\xef\x62\x9f\xae\xa9\x32\x6b\xdf\xdd\x0b\x93\x22\x2a\xec\x13\x39\xfb\x78\xc5\x01\x79\xfa\xa5\x4a\xf0\x4a\xed\xd9\x37\x60\xf9\x72\x72\x6e\x32\x7a\x52\x83\xb7\x2a\x39\xf8\x18\xf0\xc9\x52\x76\x21\xec\x6d\xc4\x08\x2e\xac\xf2\x55\xa2\x45\x2e\x20\x89\xeb\xc8\x22\x3c\xba\x54\x84\x59\x21\x9a\x47\x76\x61\x69\xdb\x72\x0a\xeb\xef\x3d\xe8\x1d\x61\xdf\xee\x6c\x71\xdd\xb0\x68\xac\x54\x15\xac\x81\x3f\xee\x8f\x75\x44\xd6\x16\x4c\x3e\xf9\x1f\x86\x3c\x09\x77\xab\xab\xa2\xef\x1f\xf4\x0f\x40\x6e\x0d\x5b\x64\x07\xba\x2b\x61\x2e\xfc\xf9\xe0\xa6\x05\xf9\xc7\x40\x10\x12\x75\x2b\x3c\x25\xbb\x74\x68\x25\x9d\xb3\xc8\xe7\x1f\xeb\x80\x25\x10\x96\xae\x8a\x2c\x5f\x48\x9b\x73\x51\x9e\xf5\x80\x28\xe1\x74\xaf\xd9\x16\x05\xad\xd2\xb7\x3e\x36\xf8\x41\x6f\xd3\xdb\x76\xc5\x86\x47\x76\xd9\xcb\x76\x48\x31\x35\x4e\x05\x49\xf5\xa5\xc8\x42\xcc\x92\x52\x73\xd8\xe2\x52\xc8\xfb\x79\x21\x3a\xb5\x0d\xcf\x6f\xea\x22\xf2\x19\x24\x47\xde\xf0\x1e\x45\x3d\x72\x56\x84\x71\xb1\xd2\xdf\xf0\x1e\x45\xfb\x82\xbe\xf0\x08\x71\xa9\x0b\x19\x50\x0b\x69\x09\xba\xf9\xc3\xdf\xc2\xbe\xe4\x0d\x15\x8f\x9f\xd0\xb8\xdb\xbf\xe8\x9d\xdf\x46\x40\x02\xc7\x30\xe8\xe3\x1a\x04\x73\x61\xee\xb4\x4a\xff\xe7\x73\x03\x95\x36\x20\xf3\xaa\x8f\xec\x0e\xd4\x60\x00\x2a\xb3\x6d\xb0\x7a\x88\xe3\x0c\xaa\xe1\xc2\xdc\xe9\x23\xfa\xcc\x61\x6a\xe7\x8a\xe8\xaf\x8e\x3b\xeb\xf3\x2b\xe3\xc1\x57\xc7\x66\x07\x60\xd4\xb8\x85\xac\x26\x0f\xdd\x0b\x73\xa7\x89\x76\x51\xb7\xc0\xe0\xc5\x64\x06\xd3\xc1\x34\x50\xb5\xcf\x30\x54\xc0\xfb\x06\xa7\x31\xcc\x04\xa1\x08\x10\xd4\x97\x39\xdc\x23\x8b\x02\xd8\x43\x8e\x22\x9b\x3b\x30\xb6\xe3\x8d\x1c\x81\x03\x0c\xbd\xa7\xa2\x2f\x04\xf8\xbf\x89\x69\x5e\xe5\x4b\xfd\xa4\x71\x4b\x18\xc5\xa2\x39\xad\x61\xfb\xa8\xa6\x22\x69\xa4\x3d\xa9\x37\x43\xd7\x13\x29\x30\x00\x0a\x86\x79\x72\xa4\xe0\x90\x82\x0f\x5b\x6b\xa7\xdb\x2b\x04\x64\xb1\x99\xff\xb8\xdb\x2b\x91\x72\x5b\x7d\x82\xc4\xf9\x19\x66\x69\x61\x82\xba\xba\x23\xdb\x5b\x2a\x2d\xb4\xa6\x80\xbb\x48\x0a\x87\x63\x43\x09\x33\x20\x7d\xa8\xb1\x2a\x9f\x4f\xf2\x5e\xab\x15\x35\xe4\xe1\x50\x4e\x64\x6c\x65\x69\xdf\x97\xfd\x4b\x51\x03\x61\xc1\xd3\x8c\xd7\x85\x22\x9b\xc4\x27\x4b\xb5\xc1\xff\x68\xe3\x13\x29\x1c\x43\x17\xeb\x85\xed\x5a\xb6\xcf\xf6\x2d\x0d\xb6\x2e\x13\x08\x6c\x24\x3b\x56\x61\x1d\x25\x3b\xaa\xed\x90\xaa\x2d\x0f\xfd\x3c\x32\x6b\xa8\xca\x0e\x0c\xf3\x90\x72\x4a\x9d\x60\x40\x24\x14\xee\xd2\xe0\x72\xef\x66\x69\x57\x64\x45\xdf\xd9\x82\x9e\xca\x6e\x66\x37\xed\x41\xc3\x74\xf6\x9f\x6f\x1b\x4c\xad\xeb\x84\x5d\xb9\xa5\xe4\xfe\x21\xff\x60\x15\x33\x36\xb7\xc1\x69\xec\x84\xdd\x5d\x6c\x51\x3b\xdf\xf6\xd8\x19\x56\x12\xce\xfe\x49\xa5\xbc\xff\xc7\xc1\x43\xc2\x0a\x3e\x03\x23\xed\x48\xaf\xf3\xac\x24\xd2\xfd\x1b\x55\x31\xdf\xa5\xc0\xd1\x06\xcf\x02\x9b\x16\xf7\xc3\x07\xd9\x23\x69\x90\x70\x4b\xf0\xbf\x36\x16\xbc\x6b\x6c\xce\xbe\xb4\x15\xb2\x24\xe2\x11\xad\xa4\xb9\xe0\x62\x2d\x22\xbe\xdb\x30\x37\xf4\xdf\x6a\x26\x18\x94\x16\xf3\xa0\x05\xa7\x40\xc9\xda\x19\xa0\x6e\xae\x84\x68\xb6\xec\x8b\x82\xd7\x85\x28\xab\xdf\x43\x67\xb9\x25\xe2\x6a\x7c\x86\xdb\xe0\x6b\x20\x1e\xa3\x1c\xd2\x3b\xb5\x95\x09\xce\x23\xeb\x4a\x6f\xb2\x6a\x67\x6a\x0e\xc6\x28\x55\x57\x3a\xff\x29\x03\x84\xfb\x3a\x1d\x1c\x73\x81\x00\x46\x72\xc3\xb3\x24\x6e\x98\xf3\x95\x70\x4d\x4a\x7c\x68\x4c\x27\xcc\x56\x29\xd2\x4c\x33\x15\x1f\x95\x32\x18\x32\x5e\x43\x28\x3a\xed\x15\x13\xb8\x5d\xac\x8a\xbe\x66\xec\x0d\xbb\xc3\x30\x05\xe0\x88\x4e\x6b\x56\x13\x93\xef\xa3\x89\x3a\xba\x4b\xd7\xae\x19\x01\x4a\x4d\xda\x68\xf4\x70\xab\x08\x75\x8b\x0b\xd9\xc7\x84\x48\x52\x0c\x60\xd2\xea\xde\x06\xdb\x95\x3c\x33\xc9\xc9\xd3\x08\xe3\xb8\x0f\xfd\xb4\xe5\x30\x52\x87\xe4\x69\x07\x9b\x02\xf5\xb2\x32\x84\xdb\xa9\xc8\x79\xde\x49\x11\x02\x8a\xc6\xd7\xa0\x10\x18\x88\x12\xe8\xbb\x34\x37\x60\x56\x50\xd8\xb9\x30\x6b\xdb\x42\x4e\x24\x45\x16\x19\x1c\x59\x59\x18\x5a\x28\x11\xbc\x47\x76\x5a\x3d\x16\x1d\x42\xdf\x92\xed\x57\xfd\x93\xd7\xde\xe1\xdd\xc8\x6e\xd8\xf3\x11\xd9\x3e\x3c\x5c\x64\x43\xf4\x3a\xff\x69\x6a\x89\x5f\x7b\xc1\xde\xe2\x1c\xf1\x6b\x30\xb2\x14\x54\x8c\x92\xdb\xae\xfa\x73\x37\x73\x54\x40\xff\x36\x55\xf6\xa9\x22\x2d\xc2\xb8\xbc\x89\xa2\xb2\x60\x0e\xbe\x96\xfa\x53\x87\x11\x73\x0a\x7f\xc5\xc1\x6d\x98\x4b\x40\xc5\xce\xcf\x8b\x22\x8b\x1a\xa4\x59\xff\xf1\x58\xb0\xe1\x95\xaf\x96\x80\x35\x95\x80\xc4\xf9\x0d\x8a\x70\x07\x9e\x56\xf9\xce\x72\x42\x00\x5c\x2b\x4c\xcc\xc4\x3d\x31\xcb\x73\xba\xe2\x03\x3a\xea\xa4\xaf\x01\x1f\x15\x82\xee\xe4\x55\xbd\x2c\xaa\x5d\x91\x55\x11\x57\x72\xa2\xb6\xe1\x31\xfc\xd4\x05\x70\xc6\x7e\x33\x95\x3a\x83\x36\x23\xc8\xc3\x77\xd4\xe8\x1f\x3e\xc0\xfe\xd1\x46\x3c\xfc\xcb\xcb\x81\x78\xf8\xd6\x8a\x0d\x7d\x87\xaa\x84\x3c\xce\x54\xa5\x36\xd7\x44\x69\xd2\xa1\x03\x82\xb2\x17\xaf\x0e\x84\xc0\xaa\x22\xd4\xa2\x68\x47\x6b\x52\x1e\x61\x47\x42\x46\xa1\xc5\x0f\x6e\x8d\x08\x48\xe8\x49\x02\xa9\xec\x86\x20\x39\x42\xc0\xfd\xb2\x74\x53\x0d\x57\xa1\x44\x24\x96\x9b\x2b\xa1\x03\xac\x50\x52\x79\xd1\x81\x83\xfa\x81\x46\xda\x85\xac\x46\x4c\x6a\x4c\x80\xef\xfc\xde\x1e\x21\x7f\x99\xce\x1f\x00\x0f\x68\x87\xa0\xdc\x51\x39\x35\xf6\x31\x8f\x0d\x1b\x1e\xff\x9d\xbb\x31\xc2\x0f\x1e\xee\x83\x64\x48\xa1\x65\xb3\x8c\x9e\x99\x70\x6c\x23\x83\x22\xfd\xa4\x1e\x0e\x1b\x59\x9a\x23\xf7\x78\x26\x62\xb1\x06\xdc\x47\x72\x8d\x1d\x05\xc3\xe5\x7d\xf4\xb9\x09\x76\x1b\xb3\xa6\x9c\xff\xe4\xe0\x98\xd5\x07\x43\x36\x00\x2a\x3e\x4a\x38\xc8\xef\x28\x4d\xec\x03\xef\x3f\x32\xf6\xf8\x61\x89\x07\xb3\x59\x9a\x50\x5a\x85\xff\x69\x16\x3c\xdd\xfa\x6d\x61\x43\xae\x90\xc2\x7c\x6f\x5a\x27\x54\x0d\xad\x30\xc6\x69\xba\x0a\x00\x44\x78\x7a\x90\x63\xa7\xb6\x00\x3c\xb6\xc6\x7d\x9e\xf5\x12\x00\x7f\x45\x5e\x45\xb1\xe1\x1d\xbe\x37\xad\x2f\x0f\xc3\x7f\xfd\x9d\x43\xec\x7e\x8f\x1d\xcc\x7b\x79\x57\x24\x4d\xff\xd5\x5e\xf0\xfd\x1e\x7a\x85\xe3\xb0\xcd\x0b\x11\xc7\x3a\xef\x48\xed\x0f\x45\xca\xe9\x71\xa9\x49\xe4\x72\xf7\x4a\x0a\x53\xcb\x1c\x66\x6c\x53\xee\x12\x52\x99\x08\xbb\xdd\xb8\x8f\x28\xa8\x08\xfc\x9a\xa3\x2d\xc4\x7a\xa1\xc6\x1d\x20\xd3\x16\x68\xe3\x0e\xb8\xdb\x6f\x57\xd8\x63\x1a\x29\xcd\x87\x46\x9f\xb8\x97\xde\x57\x09\xde\x5e\x59\xd2\x54\x46\x04\x3f\x53\x64\x22\x84\xfd\x4c\x4d\x11\xf3\x21\x5c\xa9\x4f\x4b\xeb\x35\x7e\x27\x9c\x6e\x6d\x0e\xfd\x2a\x0f\x40\xee\x07\xfc\x28\x81\x73\x4d\x4c\xab\x44\x5c\x1a\x24\xa8\x5e\xd6\x4b\xac\xd2\xe3\xfe\x8d\xf2\xcd\x5b\x20\x28\x20\x98\xa6\xe8\x80\xdc\xfe\x7e\xd6\x93\x7d\x92\xaf\x46\xdd\x2e\x18\xb8\xc5\x25\xb8\x26\x4f\xd5\xdd\x4c\xac\x45\x69\x2f\x87\xdf\x2b\x78\x10\x94\xab\x25\x5f\x11\x4d\xa9\x86\x41\xd9\x8b\x08\x4b\x19\x4c\xf3\x46\x98\x34\x44\x9c\x5b\x5b\x4d\xd6\x4b\x12\x59\xa8\x9c\x27\x18\x80\x00\xcf\xe6\x38\x25\x0a\x02\xe5\xe5\x69\xe2\xc0\x16\xbd\xdc\x63\x8f\x6d\xc1\x31\x55\x36\xca\x81\xb7\xed\xa9\x6d\xe9\xa2\x7b\xb2\xc3\xc7\x4d\xe5\xee\x55\xbd\x01\x28\xb7\xd0\x9f\x3d\x61\x85\x7c\x27\xd5\x44\xb4\xc3\x22\x5a\xc3\x98\xe6\xb6\x15\x75\x8d\x68\xb5\xee\xee\xf8\x22\x8f\xd9\x53\xd4\xef\xb1\xe3\x3b\xca\xe1\x71\xb0\x56\x9f\xba\xe4\xd0\x5a\xc9\x3e\x19\x86\xad\x8a\x6b\x86\x66\x05\x50\x93\xd0\xf0\xd6\xd8\x3d\x4c\xaf\x19\xff\xbb\x83\xb9\x65\xa0\x98\xc2\xdf\x72\x9d\xcb\xe7\x88\xa0\x62\x52\x6a\x9d\xda\xe6\x2a\x92\xda\x7a\xb4\x1a\x75\x45\x33\xc2\x34\x04\xf9\x6b\x4a\x3e\xee\x18\xc1\x3e\xee\xb1\xc7\xc1\xf4\x8f\x92\xf6\x9c\x08\x9b\x71\x94\x08\x85\xb8\xfc\x33\xda\xd8\xf3\x1a\x0f\x09\x43\xc3\x98\x37\xe9\x21\xf9\x71\x1b\x70\x59\x15\xa2\xdb\x19\xb5\xe4\x88\x77\x22\x80\xe4\x57\x55\x6e\x1a\x3e\xaf\x30\xe9\x93\x15\xa3\xc6\xf9\xf9\x08\xb6\x12\x18\x42\x6b\x71\x18\xd0\xe4\x9e\x72\xeb\xd0\xa8\xa7\x09\xc4\x81\x58\xe3\xf5\x3a\x8f\x7d\x5b\xde\x03\x93\x71\xab\x17\x0f\xcc\xa2\xbe\x9a\x45\x4d\x77\x16\x99\x57\x2e\xdf\x4c\x3a\xe9\xd6\xec\x67\x0e\x39\x28\x2e\x03\xb1\x66\x0b\x59\x7a\x2f\x86\x13\xf8\xcf\x3b\x14\x7c\xa5\x32\xd3\x0c\xbb\x90\xa4\x63\xe2\x68\xa2\x04\xd8\x54\xba\xf8\xa4\x68\x2a\x7b\x35\x63\x83\x54\x0c\x5a\xc1\xd1\xaf\x1f\xc9\xf9\x5c\x58\x84\x0a\x85\x93\x3a\xd5\x78\xcb\x00\x96\xa9\x5c\x36\x74\x76\x14\x0b\xe5\x05\x2b\xf0\x08\xa2\xd5\x62\xab\x44\xa2\x19\x94\x4f\x63\x98\xcb\x24\xef\x25\x44\xb0\x26\x4f\x03\x52\x57\x16\x48\xbc\x03\x7a\x43\xda\xed\xc5\x06\x72\xd2\x68\x01\x21\x88\x23\x68\x06\x7c\xa9\x48\x11\x93\xa7\xc6\x2f\xa4\x85\x46\x29\xc5\x54\x06\x44\x3c\xd5\x0c\x39\x18\x49\x27\x55\x75\x05\x73\xae\x50\x86\x10\xd3\x1b\x4f\x31\x98\x62\xd1\x49\x9b\xc2\x75\x8c\xbc\x74\x8c\xbd\x63\x54\x45\x68\xdc\x3f\x1a\x7c\x69\x04\x0c\xef\x56\xb0\x0c\x68\x94\xab\xa2\x5f\x35\x94\x2c\x43\x3a\x62\xab\x50\x28\xd3\xed\xaa\x9f\x61\x50\x2d\x77\x0a\xec\xfd\xd0\x89\x78\x8c\x4e\xac\x5d\x5e\x1e\xfe\xa4\x34\xa5\xa1\x56\x97\xa1\x36\x70\x1c\x2a\x05\xf6\x10\x53\x26\x74\xe3\x16\x5f\xb6\x89\xfe\x8a\x95\x7c\x92\x70\x22\x06\xde\xa6\xe8\x0a\x9a\x32\x84\x00\x0b\x07\x52\x0b\x7e\xd9\x10\xd5\xc9\xc7\xe9\x59\xd5\x4b\xba\x23\x26\xed\x26\xe7\xa2\xe8\x51\xd7\xa0\xf9\x91\xe6\x0d\x2a\x98\x74\x3e\x4e\x49\xf6\xd4\xf8\x02\x20\x34\xa9\x85\x98\x89\x18\x17\xa1\x72\xf6\xcb\xcf\x2a\xa3\xad\xfc\xc8\x91\x5a\xed\x08\x34\x8c\x2b\x01\x85\x33\x4e\x5e\x77\x8c\x4e\x35\x36\xc9\xae\xde\xd6\xef\x71\x9b\xe8\x2f\xa7\xb2\x0a\x72\x6f\xc0\x18\xa4\xe7\x04\xe9\x85\xc1\x90\xca\xe2\x32\x63\x81\xc3\x9a\x9a\xba\x0a\xfe\x71\x11\x1a\xc7\x55\xdf\xf8\xb7\x06\x37\x2c\x11\x0d\xe1\xfa\x8a\xa0\x00\x2d\xab\xdb\x39\xa0\xd6\xe7\x38\xa6\xaa\x07\x31\x5e\xa3\xe9\x28\x36\x6f\x38\x34\x80\x21\x6d\xa3\xbd\x12\xee\xce\x37\x2e\xe4\xeb\x15\xf0\xcc\x9d\x16\x77\x05\x1c\xf7\x0a\x38\xee\xbf\x42\x70\xdc\x03\x65\xf9\x34\x40\x89\xab\x5a\xe3\x18\x97\x3e\x31\x1a\xfc\x49\x65\xd8\x9d\xed\x0d\x4c\xba\x76\x74\xbe\x46\x57\x5d\x91\x5a\x59\xad\x93\xc0\xe1\xa1\x77\xc2\x28\x31\xb2\x0b\xd8\x66\xa5\x0e\x9a\x4f\xee\xde\x46\x05\x61\x4a\xb3\x0b\x77\xc8\x61\xed\x88\x4e\x9a\xf5\x27\x6a\x9c\x2f\xf5\x1a\x2b\xda\x68\x12\x66\x82\xd7\x7b\x51\x8c\x5b\x6d\xa9\x52\x49\x13\xb3\x76\xa1\x6a\x61\xac\xe9\x69\x53\xb2\x15\x42\x58\x33\x89\x0d\xa9\x73\x18\x41\x5c\xa4\x3c\x91\xe7\x8a\x98\x77\x45\x56\x95\x15\x55\x1f\x34\xfa\x60\xd0\x4d\x9b\x79\x40\xba\x56\x4d\xa7\x29\x1c\xa4\xb6\x38\xa2\xf9\x13\x9e\xdc\x36\xd5\x2d\xbf\xcf\x6e\xde\x05\x47\xe5\x89\x1a\x8e\x18\x68\xe2\x84\x92\x70\x9d\xea\xb1\xa1\xc0\x82\x38\x7c\xc3\xec\x5b\xdb\x05\x10\x3b\x62\xcf\x32\xa5\x38\xb3\xf0\xcf\x0e\xb3\x60\x38\xd7\xc6\x4c\x52\x44\x33\x2d\x68\x57\xdf\xff\xc0\xe1\x60\x7e\x01\xac\xf2\x45\xc4\x43\xba\x8a\x3b\x52\x5b\xc9\x6b\xe4\x5b\xe9\x0e\x3c\x45\x67\x26\x58\x1e\xbd\x58\x94\x60\x1a\xbf\xc0\xd8\x3f\x1d\x60\x53\x5d\x50\x39\x32\xd1\x9c\xeb\xc9\x7a\x2d\xe9\x77\xe6\xdb\x49\xaa\x2f\x9f\x51\x47\x2a\xff\x81\x03\xc1\x3f\x8d\xda\x87\xc8\x0c\xb5\x2f\x2c\x07\x0c\x29\xea\x74\x89\xae\x45\xe4\xdb\x20\xa3\x72\x1e\x16\x51\x4e\x44\xc7\xb2\xb2\x55\x5d\x59\x71\x49\xea\x7b\x40\x34\x67\x2d\x03\x65\x2a\x06\xed\x98\x28\x0b\x0b\x50\xd5\x1a\x2b\x29\x4c\x37\x8b\x14\x64\x2d\x4a\x21\x98\x13\x05\x04\x99\x08\xb5\xa0\xd0\xc5\xa3\x33\xc4\xbc\x26\xf5\xc4\x34\x2f\xb8\xee\x09\x35\x9e\xc0\x0c\xa8\x30\xed\x91\x16\x39\x2f\x78\x8e\x04\x8b\xeb\x22\x6a\xaf\xc8\x15\x19\xd5\x44\x0d\x81\xcc\xe4\x7a\xb4\x28\x4a\x84\x28\xd0\x42\xa7\xb2\x9c\xad\xe1\x40\x57\x2b\xa4\xf4\xf3\xa3\x65\x6d\x65\x52\xbb\x62\xcb\x63\xb2\x79\x9f\x4d\x72\x51\x34\x6a\x13\x93\xca\xd7\xce\x43\xa8\x68\xbd\x2f\x4f\x4f\x99\x8a\xa0\xc8\x20\x25\x01\xfa\x23\xa6\xaf\x97\xc8\xf7\xe4\x36\xd6\x04\x62\xbd\x00\x5b\x18\x28\xd5\x49\x16\x17\x19\x0a\x47\xf0\xac\x91\xcb\x0e\x68\xc0\x2d\x46\x16\x97\xa1\xaf\x9b\x36\xd5\x74\x5e\x16\x59\xe7\x46\x5d\xc4\xd1\x7c\xc2\xf4\xef\x4a\xd4\x5e\x51\xdd\x1b\x12\x2c\xab\x3b\x2c\x8e\xc2\x7d\x13\x9b\xde\x82\xca\x40\xad\xa6\xbb\xa0\x09\xe0\x9d\xb0\xab\xc0\xfe\x7c\x94\xd5\x36\xeb\xe3\x4d\xe6\xfd\xbb\x47\x83\xbf\x1d\x21\x6f\x96\x3b\x0a\xce\x60\x6e\x32\x75\x75\x8e\x7c\x47\x14\x5c\xae\x03\x33\xa4\x45\xd4\x11\x93\xda\xfb\x66\x1f\x96\x8c\xcd\x23\x55\xc7\x2d\xc0\x19\xe4\x7b\xaf\x46\x43\x84\xb9\x20\x8a\x22\x55\x95\xb4\x23\x10\xe1\x97\x37\xa1\xcd\x50\x0f\x63\xa0\xc5\x1d\xa4\xd9\x23\x3e\x56\x79\x13\x7d\x00\xa8\xd3\x4e\x50\x1e\x08\xc4\x12\xc1\xca\x4c\x33\x7d\x96\x2a\x90\x36\x4a\xac\x89\x84\xac\xb8\xe0\x21\xd4\xad\x05\x2d\x44\x1e\x2a\xb0\x5d\x77\x91\x83\x51\xc5\x27\x68\x4e\x3c\x9a\xac\xe6\x64\x0a\xf3\x36\xa1\x78\x43\x7b\xb2\xc9\xaf\xd1\xbe\x68\x8f\xb8\x61\x95\xcc\xe1\x00\x4b\xcb\x56\xae\xce\x42\x64\x1d\x73\xa0\x41\x01\x15\x95\x66\xdb\x35\xec\xc4\xce\x78\x92\x9c\x59\xf6\x91\x51\x27\x47\x64\xc0\x5c\x8e\x6a\xc5\x1b\x46\x83\x1b\x9c\x2b\x9b\x45\xa6\x59\x91\x5b\x8d\x2c\x4d\x06\xc1\xb1\x3e\x3b\xc2\xde\xec\xb1\x31\xa9\xdb\xae\x09\xff\xb5\x5e\x50\x9d\xd1\x49\xdc\xc4\xca\x05\xf2\x78\xa8\xa9\x35\xdf\x43\x83\x4b\xb9\x4f\x3b\xc4\x24\x7e\xad\xc7\xbe\x09\x63\x82\x71\x7a\x43\x58\xf0\xf3\xf7\x11\x16\x7c\xcb\xbc\x15\x4b\x00\x86\xd0\x75\x32\x28\xb9\xe1\xc2\xf7\xa6\x75\xb8\x63\x2c\x76\x71\xdf\x2c\xb2\x1a\xfb\x51\x8f\xf9\x50\x31\x7d\x1f\xaa\xf6\xdc\xbd\xd7\xec\xf4\x2e\x6a\xe6\xd4\x4a\x4a\x71\x38\x0f\xd5\xd8\x4b\x47\xd9\x91\x21\x7d\x7f\x36\xcd\x8b\x85\xb0\x58\xc1\xe0\x44\xca\x31\xfd\x93\x91\x60\x6d\xd1\x46\xe9\x59\x01\x09\x1a\x16\x2b\x60\x1b\x53\x86\x1b\x58\xc5\x35\x7e\x56\xdf\xa4\x80\x59\xde\x4c\x31\xc7\xab\xd7\x45\x78\xff\xf5\x44\x64\xf9\x4a\xd4\xa5\x78\x6f\xb0\xbf\xc9\xe3\xc1\x99\x73\x51\xd2\xbb\x04\xf6\x93\xba\x00\x2d\x6b\xc3\x1b\x95\x25\x39\xf3\xf1\x53\x15\xf6\x31\x8f\xc1\x75\xff\x57\xbc\xe0\xe7\xbc\x05\xb0\xa4\x50\x44\x40\x94\x81\x07\xb1\xaf\x48\x04\x64\x55\xb5\x68\x83\x5a\x61\x9a\x50\xbf\x13\x47\xc9\xea\xa4\x76\x08\x61\xd0\x1b\x49\x82\x64\x55\x6d\x4f\x99\x00\xc7\x61\xb1\xb2\xe7\x00\x62\x15\x35\x2c\x2b\xa2\xdb\x42\xda\xda\x8b\x3c\xc2\xbb\x7f\x4e\x90\x22\xb9\x6c\x9a\x71\x35\x04\x44\x50\xe9\x58\x70\x83\xe0\xa1\xa8\xc6\x2f\x8c\xb1\x63\xc3\xb6\xb9\x28\x69\xa6\xeb\xf9\x92\x68\xf4\xb2\xa8\xe8\xcf\x22\xba\x0a\x5a\xdc\x73\xff\xff\x1c\x08\x6e\xdf\xf2\x09\x6d\xf2\xa2\xa7\xaa\xda\xa0\xaa\x94\x7c\x30\x1c\x66\x02\x2c\xa6\x61\x5c\x52\x24\xdf\x70\x80\xfd\x95\xc7\xfc\x76\x27\x0f\x67\xf5\x33\xe0\x0b\xfc\x8c\x17\x7c\xd4\xbb\xf5\xfc\xd2\x8c\x7b\x5d\x0e\xac\xa1\x7f\x96\xf7\x79\xd8\xec\x44\xa0\xc8\x28\xda\x08\x7e\xd4\xca\xa8\x59\xe9\xd5\x01\xa5\xc8\x92\x2c\x79\xd4\xce\xa7\xd6\xa9\xbe\xf2\xd3\x13\x3c\x4a\x62\x9d\x3b\x54\x36\x68\xc3\x47\x4c\x0b\x60\x7f\x04\x7d\x5d\xc7\x01\x0d\x56\x13\x99\xcf\x81\x44\xd8\x1e\x83\x0e\x7b\xec\x60\x53\xc1\xbb\xba\x14\xdc\xb2\x49\x29\x43\x0e\x08\x43\x6b\x54\xa4\xbc\x97\xbb\xa7\xd5\x0f\x55\xd8\x23\xb3\x5e\x32\x93\xdf\x91\x8b\x0c\x3e\xf3\xce\x4a\xf0\x26\x00\xb6\x52\x57\xb8\x19\x3a\xe5\xcc\x03\x15\x2f\x29\xb2\x3e\x6e\xec\x26\x4a\x90\xc8\x28\x29\x3e\xc1\xf5\x3a\x40\x44\x7b\x2e\x32\xf7\x18\x1a\x75\xc2\xb6\xc9\x2c\x96\x2a\xa0\x65\xd7\xae\xf1\xf3\x61\x9f\x87\x71\x9e\xaa\x00\xf1\x28\xe1\x0b\x69\xb3\x34\xd1\xd0\xc0\x8c\x77\x81\x67\xad\x74\x1f\x26\xd8\xe0\x6b\x93\x56\x20\x92\x53\xa7\xf2\xeb\x45\xb8\x2a\x72\xa9\x29\x36\x64\x7f\x36\xdc\x1e\x7c\xf9\x21\x07\x3e\x48\x5c\x2a\x44\x82\x07\x01\x65\x8c\x24\x0c\x11\x48\xd9\xfc\xe2\x78\x70\xc4\xfa\xbd\x05\x72\xd0\xf0\x5c\xcd\x0f\x5e\x41\x7e\xdf\x37\xe4\x47\xac\x3c\x29\x8d\xe0\x3b\xb6\x82\xa4\xd9\x05\x16\xcd\xe6\xa3\x7e\x25\x41\xf5\x32\xa2\x10\xef\x2b\x41\xf5\x1b\x02\x4e\xf4\x41\xef\xe2\xf6\x09\x96\x4f\xf6\x6f\xd4\x09\x96\x66\x66\x95\x31\x89\x36\x05\x7d\x7f\xf1\x01\x87\x1f\xb9\x84\x93\xb4\x70\x3a\x4e\x1b\xab\xfe\x17\x47\x83\x3f\xf7\xe8\x87\x15\x45\x13\x02\x5d\x4a\xd4\xe8\xc5\x61\xc6\x67\xe7\xe7\x16\xf9\xd1\x33\x97\x6a\x3c\x38\x7e\xc3\x89\xda\xf1\x53\xd7\xd7\x8e\xd7\x8e\x4f\x9d\xb8\x26\x98\x0c\x4e\x1c\x3b\x76\x7c\xba\x59\xbf\x61\x7a\x7a\xea\xd4\x35\xc1\x84\xb6\x75\xa8\x40\x72\x12\x0d\x94\xce\x57\x00\x8f\x73\xbd\xcf\x43\x7e\x01\xab\x83\x01\x29\x72\x0b\x3b\x02\x07\x7d\x15\x40\x86\xe6\x13\x71\x09\x60\xd9\x61\x8f\xb1\x6a\x27\x2b\x94\x3b\xe4\xd7\x34\x6b\xc9\x8b\x83\x1e\x5b\x15\x45\x9b\xf5\x62\x30\xfa\x35\xa2\x66\x56\x46\x31\x58\x63\x70\xd9\x4f\x82\x10\x5a\x69\x2f\xc9\x81\xc5\x38\xbf\xc0\xb1\x9f\x30\x04\x86\x62\xf2\xd0\xb2\x59\xee\x19\xe0\x26\x72\x3b\xc7\x9e\xd1\x7f\xed\xb1\x31\x6c\x9c\xff\x05\x2f\x78\xc0\x3b\x83\x0d\xc5\xcf\x03\x36\x61\xda\xda\x79\x33\xc3\x64\xbf\x75\xe3\x54\x01\x0a\xeb\x31\x61\xb1\xca\x13\x0b\x5b\x7b\x1f\x8a\x4b\x7b\x85\x86\x8c\x80\x4e\xcb\xc2\xa4\x2d\xb6\xc8\x7b\xfb\x95\x8a\x6b\x0a\x57\xd9\xfb\x29\x20\xfc\x2b\x86\xd9\xb0\x10\xad\x5e\xbc\x24\x0a\xcd\x54\xfb\xa2\x4a\xb0\xba\xdd\x43\x98\xfe\x8a\x13\x8d\x56\x27\x06\xbf\xea\xe0\x3e\xa9\x43\x6f\x57\x8a\x54\xb6\x87\xd1\xcb\x1c\x82\x55\x00\x96\x99\x4b\x2a\x30\xa3\xb1\xa0\xae\x95\x2c\xf2\x69\xd6\x8c\xe4\xb6\x17\x16\x64\xac\x92\x17\xad\x8f\x59\xa1\xbe\xba\x58\x8b\x8a\xda\x84\x42\x97\xe8\xa8\x1f\x38\xec\xc4\xc3\x95\x12\xa6\x21\xe7\xd5\x7f\xe3\xe1\xe0\x04\xfc\xe5\xc2\xa7\x2a\x33\xba\x8a\x05\x47\xb7\x97\x8e\x17\x74\x5a\xfc\x02\xc6\x3e\xad\x30\x8e\x7f\xc3\xdb\x22\x8a\x68\x58\x05\x20\x8a\xe8\x55\x9e\xad\x74\xd8\xd0\xc6\x68\x98\x0c\xe3\x87\x7e\x07\x19\x80\x44\xff\x23\x83\x6f\xfc\x29\x6f\x8b\xad\x7b\x68\xab\xd0\x82\xff\x3a\x6f\x38\x0d\xd0\xc3\xd3\x22\xbe\x28\xc2\x66\x35\x4d\xe2\xfe\x15\x58\xc2\x2b\xdc\x10\x0f\xa3\x56\xf6\x69\x5b\x2b\xfb\xe8\xbe\x61\xde\x5f\xb0\x29\x37\xc4\x8d\x5f\x2f\xad\xac\xf6\xa0\x77\xe7\xf6\x6a\xd9\x49\xff\xb8\xa2\x30\x00\x29\xb1\x23\xc2\x82\xbf\x63\xec\xa6\x6d\xf2\x0c\x66\xd5\xb9\x79\xa8\x5f\xf8\x5d\x2c\xf8\x97\xca\x96\x8f\x3c\x4c\x0e\x62\x4d\xa3\x60\xce\xfd\x51\xf2\x6f\xd9\x6d\x3c\x2c\x62\x7f\xc3\x3b\xa4\x9b\xef\xec\xaa\xff\x3c\xc6\xea\xcc\xdc\xf3\xef\x08\xce\x5a\xfd\x34\x68\xb0\x71\x3a\x51\x6b\xce\xd6\x86\x03\x95\x83\xee\xb3\xd7\xe2\x1f\x54\xd8\xb7\xba\xd5\xb2\x70\x4b\xfc\x0f\x54\x94\xf2\xf2\xd6\xca\xa6\x4f\xed\x26\x3f\xa0\x3c\x91\x36\x4b\x14\xd8\x16\xed\x04\x0b\x53\xc1\x3a\xce\x27\xf5\x37\x94\x73\x5c\x16\x58\xe3\x7c\x9e\x2c\xb4\x90\x5f\x6d\x82\xfd\x90\x44\x14\x3a\xc6\x1e\x98\x8b\x68\x8b\x37\x59\x22\xae\x23\x87\xea\x9f\xdb\x1c\x0d\xae\xf6\xf5\x0f\x95\xe1\x29\x1a\x9f\xaf\xec\x2f\x45\xe3\xf5\x95\x7d\xe6\x68\xec\x7c\x0c\xa0\xdf\xb3\x70\x9d\x8a\x3b\x1a\x25\x79\x21\x42\x08\x03\xdd\x7a\x48\x26\x26\x79\x1e\x75\x22\x79\x06\xa4\xed\x9d\x96\x84\xea\x36\x13\x0c\x53\xd3\xe3\x12\xc6\xeb\x61\x3f\x27\x43\x9d\x9c\x00\xed\x30\x6b\x42\xb4\xa4\x9e\xe2\xdb\x8e\x80\x1d\xfb\x90\xec\x35\xf6\xe1\x4b\x15\xf6\x6d\x96\xc8\xcd\xea\x61\x83\x8e\x1d\x62\x51\xb4\xfc\x8f\x54\x82\xa7\xd0\xdf\xc3\xf3\x45\xe1\xe0\x05\x3b\xb4\xd6\x6e\xb2\x34\x56\x21\x66\xf2\xd0\xb1\xe1\x69\x08\xbc\x2d\xc0\xf2\xfe\xc8\x63\x0b\x16\x56\xde\x5c\x70\xdd\x1e\x91\xf2\xbe\x11\x11\xea\xfe\x89\xb1\x3b\x4d\x27\x1b\x2b\x45\x55\x6e\xf3\xa0\x00\x39\x0c\xd7\x8e\x81\xac\x36\x0b\x64\x00\x6a\x2f\x9b\xd3\x6b\x09\x22\xeb\xfc\xd7\xb3\xe0\x7b\xb6\x7c\xa2\xb4\xe1\x21\xf3\x40\x91\x62\xfe\x16\x2a\x5b\x9b\xbd\xbf\xe1\x8d\x75\xe3\x5e\x16\xc6\x34\x6e\xce\x80\xbd\xe5\x10\xfb\xa0\x47\xfd\xfb\x8b\x5e\xf0\x53\xde\xaa\xd5\xc3\xb9\xc8\xa2\x30\x06\xc5\x15\x2e\x97\x66\x23\xac\x03\x88\xe6\x93\x9b\x4b\xdc\x37\x6a\x1a\xec\x56\x72\x6f\xe9\xc5\x61\x56\xa3\x9a\xd9\xb3\x38\x2f\xc2\xa4\xa1\x0e\xdf\xbd\x9c\x5a\x80\x6b\x96\xfc\x79\x17\xe5\x27\x2f\x9a\x88\x54\x39\xf7\x67\x16\xe6\x79\x23\x8c\x63\x17\x6f\xf2\x3e\x36\x1e\x47\x79\x21\xe7\x86\x2f\x82\xef\x51\x7f\x6f\xd3\x0a\xb0\x7c\x6a\xd2\x0a\xd3\x26\xc7\xe7\x84\x95\x38\x17\xe5\x45\xe0\x7c\xf2\x87\x2b\x8c\x3a\xd5\x7f\x41\x25\xf8\xaa\x87\x7f\xab\x2f\xd2\xaf\xa1\x2b\x58\x8d\x19\x1a\x7d\x1a\x6e\xcf\xa0\x0a\x40\xe9\xd4\x80\x32\xc3\x2f\x4a\x25\x2e\x9f\xba\x09\xd6\xcd\xcd\x53\x37\x91\xfa\x75\xf3\x54\xad\x56\x9b\xba\x09\xbf\x74\xf3\x45\xa2\xf8\x40\xc2\xde\xb2\xf4\xd8\x6c\x62\x48\xe9\x08\x0f\x40\x7e\xe2\xc5\x9b\x60\x52\xd5\xa8\xc8\x1a\x7d\xf1\xe2\x84\xa1\x0f\x09\x21\xb1\x6c\x5d\x64\x8d\xb0\xe4\x53\xf9\xa2\xc7\x58\xbe\x92\x66\x05\x4e\xe7\xcf\x78\xc1\x2f\x7a\xe6\x37\xb6\x6a\x05\x18\x11\xe0\x77\x79\xf9\x4f\x72\x71\xa9\x9b\x12\x61\xa2\x1c\x64\xcd\xa1\xc2\x9b\x69\xa3\x47\xa1\x0a\x10\x08\x4f\x59\xeb\x78\x86\xc0\x25\x40\xbe\xd5\x28\x59\x4b\x51\xa6\xe6\x98\xf9\x76\x51\xea\xb6\x8d\x22\xe6\x52\xff\xba\x09\xbe\x2f\x3f\x2f\x7b\x6b\xbe\xd0\xf1\x09\xe5\x46\x6d\x6a\xda\x79\x9e\xc7\xc6\xd5\x9c\xf6\x8b\xa0\xad\xfe\xd6\xf3\x4c\xfd\x1e\x36\xee\x5b\x7c\xd2\x99\x71\xfa\x72\x93\x16\x80\x1b\x99\xeb\x31\x26\x85\x40\x3b\xcd\x22\x91\xfb\x5f\xf1\x82\xdf\xf0\xcc\x6f\x97\xcd\x15\x86\xcf\x89\x50\x45\x72\x8f\xd2\x5a\xac\x8b\x38\x4d\xda\xf0\x6d\x54\x51\x8f\x84\x71\x7c\x64\x82\xf0\x6c\xa3\x9c\x77\x7b\xf5\x18\x73\x70\x1e\xb2\xb1\x09\xe3\xf8\xe2\x56\x3d\xff\xd9\x51\x87\x8d\x52\x39\x69\xef\xcc\xbb\x2b\x22\x13\x77\x46\x59\xd1\x0b\xe3\xb9\x28\x5f\x75\x5c\xf7\x6f\x18\x0d\x9e\xe8\xb8\xee\xd7\x96\xe0\x79\x95\xe8\xa0\x87\x66\xc3\x63\x78\x69\xa1\xec\x6f\xff\xa3\x11\xf6\x6b\x1e\x1b\x6b\xe5\xcb\xfd\xae\x40\xf9\x78\x4b\x14\x0b\x0a\xcd\x41\x42\xd0\x94\x77\xd2\x5e\x62\x91\xec\x60\xc2\x88\xfd\x0c\xf5\x82\x71\x8d\x42\x10\x41\xda\x55\x61\x64\x04\x1b\xc4\xc1\xec\x2c\x2e\x15\xd7\x04\x93\x3c\xb8\xd4\xca\xe5\x3f\x49\xd1\xca\x83\x1a\x9f\xef\x74\xe3\xa8\x11\x15\x31\x9d\xaf\x33\x34\x03\xd6\x05\xbd\x50\xf6\x22\xda\xdd\x77\x89\x3d\x9a\x5c\xe1\x68\x81\x9e\x9f\x93\x62\x72\x09\x2f\x71\xbc\xc6\x4f\xc3\x9c\x3b\x6f\xa2\x12\x8e\x2e\x2d\x9c\x3e\x3f\xc1\xbb\x59\x0a\xf9\x2f\xf3\x73\x3c\xcc\xf3\xb4\x11\x99\x2c\x21\xb4\xf9\x59\x05\xcb\xc5\xee\x7c\xf9\x4e\xf6\x98\xbc\xfc\x80\x3f\x13\x5c\xb3\xcb\x6f\x27\xe5\x72\x67\x99\x35\x62\xfe\xb5\xc1\x51\x08\x1a\x40\x7b\x3c\xb8\x7f\x21\xbd\xaf\x34\xde\x6b\x9d\xe6\xaa\x5d\xc8\x9b\x0e\x3a\x54\xd6\x6a\x56\xcd\x3c\xab\x97\x89\x81\xc9\xf4\xf7\x63\xc1\xb2\xbe\xe3\x18\x1e\x13\x0e\xd7\x31\xe7\x08\xee\xc2\x7c\xb0\x83\x30\x90\x1c\x1d\xd0\x7c\xe1\x96\x71\x14\xd4\x36\xbc\xf1\x66\x94\xaf\x62\xfa\xfa\x41\xf9\xe7\x1d\x8b\xf3\xee\xa9\xea\x00\xbb\x8d\x1d\x6e\x80\x9a\xdd\x3e\x9f\x36\x85\x7f\x53\x30\x05\x81\x26\xb3\x78\x0d\x92\xa7\xa6\xf9\x85\x34\x11\x93\x60\x30\xe3\xb7\x27\x71\x9f\xfe\xbc\x2b\x8b\x0a\xb7\xef\x6e\x61\xfa\x8b\x52\x1b\x92\xbb\x90\x9d\x2f\x03\x2e\x69\xf9\x80\x3a\x44\xd4\xe3\xb4\xce\x69\x14\xed\x72\x66\x98\xaa\xae\x7f\x2a\x98\x00\xef\xf9\xe2\xfc\xee\x8a\xf8\x37\xb0\xb6\xfe\x4c\x29\x4f\x7f\xe0\x05\xbf\xe9\x9d\x21\xec\x06\xe5\x5b\x58\x5a\x09\x33\xd1\x9c\x36\x71\x77\xd0\x13\xb2\x6b\x90\xa8\x8a\xfa\x84\x87\x0d\x48\xa7\xe4\x7c\x4e\xa0\x96\xd7\x9c\x56\x96\x06\xfd\xc6\xf0\x17\x70\xd1\x34\xa7\x79\x08\x93\x50\xa1\x48\x9a\x21\x38\x8a\xd8\x5c\x89\xbe\x45\x76\x81\x28\x86\x80\x66\x51\x4c\xd4\x54\x26\x05\x4a\x6c\xa8\xb2\x2b\x3e\xc6\x33\x11\x36\xe5\xa4\xf2\xe3\xe0\x7b\x07\x92\xb0\xf9\x51\x79\x7b\x6a\x5d\xce\xb4\x09\x34\xd9\xca\x67\x39\xac\x3d\x0a\x30\x42\xdb\xa1\x30\x37\x73\x51\xc0\xf0\x44\x09\xc5\xfa\x9c\x97\xed\xc9\xdd\x84\xee\x5f\x70\xbd\x7a\x6a\x85\x12\xd4\x3f\x82\x1b\xf8\x3f\x7c\x20\xb8\xde\xb9\x62\x4e\x38\x06\x44\xc9\x3e\xeb\xa0\x63\x20\x41\x44\x7f\x88\x41\xda\xf0\xc8\x6c\xee\x2c\xbc\xf7\x8e\xca\x2d\xff\x31\x71\x98\x17\x67\x45\x98\x15\x75\x11\x16\x10\xbe\xb6\xba\xf7\xf0\xb5\x63\xe7\x74\x94\xda\xba\xe0\xed\x14\x10\x4e\xd1\xd2\x29\x05\x46\x48\x51\xf1\x06\x95\x8c\xbd\x8c\x42\xe8\x96\xb3\x30\xc9\xe1\x1a\xd4\x61\x6d\xef\x75\xb8\xf1\x9c\x13\x29\x67\x3a\xa9\xc0\x4f\xa0\xd5\x36\x4d\x34\x22\x56\x91\xf2\x30\x01\x10\xb8\x1a\xfb\x1e\x76\xb0\x23\xf2\x3c\x6c\x0b\xff\x7c\xf0\xd4\xb3\xbd\x0e\xc0\x5c\x85\x4d\x30\x34\xd1\x1d\x75\x56\x91\xe3\xdb\x14\x45\x18\xc5\x39\x01\x12\x61\x8c\x9e\x6e\x89\xb3\x92\x9e\xc6\xc6\x30\xf7\xd8\x7f\x6a\x70\xf2\x68\x3d\x8b\x44\x6b\x42\x83\xad\x91\xbe\xa8\xeb\x7a\x24\xdf\xb2\xac\x73\xda\x0f\x72\x3a\xb8\x76\x69\x38\xae\xd7\xa4\xca\x7a\x41\x60\x2d\x40\xf7\x9a\xe4\x77\x24\x60\x28\x74\x4a\x9b\xa4\x48\xb5\x27\x04\x8f\x5b\xa6\x33\x27\xc4\x6b\x9b\x51\x72\x24\xc2\xa1\xa1\xdb\x0a\x6d\x79\xb7\x2f\x39\xdb\xca\x7b\x0e\x05\x27\x1c\x1d\x45\x3f\x36\x04\x59\x72\xb8\x2f\xeb\xef\xc6\xff\x2d\xc8\xd1\x87\x4f\xc8\x7c\xca\x63\x87\x72\xd1\xc8\x44\xb1\x28\x5a\xfe\x87\x3d\x76\xed\xb6\x51\xba\xc3\x68\x0a\x82\x1f\xf0\x96\x54\x29\xda\xa8\xac\x0e\xa0\xf2\x3a\x85\xa2\xc1\x5c\x4e\xeb\x52\x40\x29\xdb\xab\x19\x73\x38\xdf\x5a\x51\x81\x9c\xcf\xb7\xca\x1c\x01\x4d\xdb\x85\x6a\xdc\xd7\x61\x51\x88\x4e\x17\xe2\x5b\x7f\xc8\x53\xea\x11\x6c\xf2\xcf\x0d\xba\x77\xea\x5f\xea\xb0\xb2\x22\x57\x6e\x55\xaf\x5c\xfb\xc8\x62\xaa\x43\x19\xed\x5c\x85\x63\x1a\x4a\x46\xd8\x54\x88\x74\x50\x39\xe6\x2d\x3a\x05\x27\xa0\x65\x84\x3d\xda\xd4\x06\x73\x0a\x81\xf4\xf0\x4e\xf7\x62\xb9\xd3\x1a\x69\x57\x57\x89\x16\x00\x7d\x49\x57\x50\xf5\x8f\x95\x96\xe7\x24\x3f\x6b\xe4\xd5\x85\xb4\x79\x24\xb7\x9e\xb2\xb1\x6a\x4a\x6c\xfa\x05\xf1\x61\x50\x66\x2a\x74\x0c\x61\xe0\xa8\x28\xff\x28\xcb\xd2\xcc\x44\x24\x98\xfe\x02\x31\x05\xf9\x11\x98\x0c\xdb\x26\x84\x4b\xbe\x24\x0a\x6e\x8d\x01\x08\xd4\x3e\x96\x5d\xa4\x00\x9a\x9d\xa9\x28\x03\x35\xbc\x9a\x67\x1b\xdf\x2e\x52\x1e\xd0\x2d\x58\x47\xfd\xb4\xa7\x33\x20\x08\x12\xdb\xe4\x49\x0e\xf6\xd3\x05\x73\x13\xb4\x64\x0a\x4b\xee\x66\xa2\x0a\x09\x7f\x83\x6d\x29\xc1\x61\x38\x43\xfa\x09\x97\xe0\xc3\x89\xb6\x71\x22\xc1\x4e\x87\x8d\x55\x91\x34\xfd\x8d\xd1\x60\xce\xbd\x64\xc7\xdf\xc4\xb1\xf6\x0f\xe6\xb4\x3b\xe3\x36\xa8\xd8\x3d\xa5\xfa\x0c\x8c\x98\x8e\xe0\xfb\xd8\x08\x7b\x2e\x3b\x4c\xcf\x00\xbf\x6a\xb2\x53\xbf\x5c\xaf\x88\xe2\x9a\xfc\x5c\x91\xd5\xe6\x93\xe2\xf6\x6c\x09\x1a\x16\x54\x5d\x6c\x10\x0c\xd9\x1e\x00\x10\xa0\x4f\xd6\xd8\x3f\x7b\x56\xca\xe6\xdf\x78\x6c\x7a\x5b\xc9\xb1\x29\xcb\x49\xf0\xb3\x9e\x9d\xf0\x19\x26\x5c\x3f\x60\xed\xbf\xf6\xcc\xb4\x6d\xc2\xc5\xb0\x8c\x5c\xea\x70\xed\xdf\x9e\xb7\xcc\x9c\xf6\x32\x99\x54\x0d\x82\xb9\x09\x96\x3b\xd3\xa7\x68\xb3\x50\xe9\x33\x5a\x74\xb3\x79\xdd\xf3\xea\x20\xe1\x76\xdd\x26\xac\x46\xaa\xeb\xec\xd9\xf4\x17\xbb\xce\x1e\xc5\x0e\x7f\xd7\x81\xe0\xb7\x46\x86\xdd\xb1\x6c\xa5\x84\xf6\x83\x9e\x38\x50\xb0\xbe\xe1\x12\x47\x97\x55\x40\xae\x25\xcb\xd1\xfb\x21\x77\xcf\xb6\x20\x62\x55\xc0\x6c\x45\xeb\x34\xd0\xcc\x66\x26\xe0\x0c\xcb\xff\x86\x75\x26\x72\x38\x8f\x82\xb6\x15\x60\x55\x03\x52\x39\x74\x8c\x50\x2e\x0a\xe3\x73\x1c\xb3\x5c\x7e\x6a\xad\x7f\xc4\xbb\x2c\x6e\x92\xe7\x32\x2a\xdc\xcf\xd9\x0d\x7b\xc8\x75\x5d\xc6\xea\x9f\xa2\x11\x75\x77\x2c\xba\xb8\x45\x96\xeb\x57\xc7\x87\x9e\x67\x34\x20\x04\x84\x4b\x7f\x6a\x3c\x98\x75\xae\xa0\x59\x4f\xb7\x8d\x4e\x37\xe8\x8e\x56\xc6\x3e\x0b\x53\x62\x2b\xf6\xc4\xd7\x5f\x09\xa5\xde\x77\x18\x4d\x4b\x85\x52\xdf\x13\xf0\xa1\xa1\xd4\x7a\x2c\xf2\x3d\x00\x9a\xe8\x97\xaf\x84\xeb\xec\x23\x5c\xe7\x3d\x76\xb8\xce\xdb\xf6\x19\x44\xdd\xfe\xba\xc5\x49\xdf\xb1\x7d\x40\xce\x09\xff\x98\x8e\x93\x0e\x02\x1d\x1f\xed\x08\x8c\x32\x0b\xcd\x3f\x1d\x66\xff\x61\xd8\x29\x26\x6a\x89\x46\xbf\x11\x0b\xff\xf7\x0e\x07\xef\xa8\xe8\x9f\xb6\x6a\xd6\xb0\xe0\x4b\x8b\x15\x61\x67\xad\xd1\xe1\x91\x96\x79\x11\xae\x0a\xdc\x29\xf3\x6e\x9a\xe4\x42\xf1\x7f\x60\x7c\x47\xac\xcb\x86\xc4\xd5\x1c\x79\xcb\x50\x33\xcf\x8b\x25\xcd\xca\xbd\x90\x89\x25\xb9\xef\x98\xe7\x09\x79\x38\x9f\x74\x12\xe6\xca\xf1\x23\xf5\x38\x6d\xac\xe6\xbc\x97\x14\x06\x9a\x9f\xc2\x3c\x54\xde\x9f\x83\x7f\x35\x90\xb6\x03\x18\x66\xf9\xa4\x6c\x01\xc6\xb3\x02\xab\x38\x1c\x94\x08\xfa\x38\x02\x1b\x46\xa6\x55\x61\x25\x52\x7f\xfc\x10\x7b\xfe\x08\x3b\xd4\x55\xed\xf0\xff\xa1\xc2\x8e\x6e\xbb\xcc\xcf\x62\xa9\xc1\xaf\x57\x4c\x07\xc8\xca\x86\x71\x2c\x35\x8e\x4e\x47\x34\xa3\xb0\x10\x71\x5f\x03\x0f\x3b\x91\x34\x4a\x29\x57\xc9\x7d\xaa\x92\xd4\x8a\x52\x70\x4d\x0e\x19\xb9\x51\x12\x2a\x1e\xf1\x4c\x28\x78\xc5\xb0\xd1\x80\x50\x5e\x38\xdb\xe0\xea\x46\x50\x26\xa2\x5e\xe0\xb7\x23\x88\xe7\x6e\xfa\x1e\x92\xcd\x54\xb7\xef\x9e\x7d\x44\x97\x6c\xfd\x59\xd5\x13\xa2\x2a\x4b\xcf\xa7\xae\x32\xb7\xe0\x02\x7b\xd5\x18\x3b\xd8\xc5\xd9\xe3\xbf\x78\x6c\x17\x23\xf0\xb9\x03\x6a\xd2\x0d\xef\x7f\xd2\xbc\xc2\x4d\x3b\x54\xe5\x71\xa3\x73\x4c\x45\x1f\xa7\x4e\xa7\xc1\xac\xe7\xb9\x54\xcf\xc2\x9c\xc7\x52\x27\x10\x79\x3e\x05\x5d\xdd\xeb\x02\x7a\xb1\x80\xc1\xeb\x65\x00\x65\x24\xe4\x51\x1e\x6c\x54\xce\xb6\x8f\x42\x03\x81\x09\x40\x6f\xb4\x26\x27\x00\x6d\x51\xf5\xcb\x43\xd4\xc8\xc2\x7c\x45\x00\x1b\xbe\xb8\x14\x15\x84\xd7\x60\xdb\xd6\xa8\x39\xb4\x66\x08\x45\x96\xf6\x67\xfa\x08\xbe\x84\x27\x69\xfb\xf9\x76\x26\xcf\x1c\x5d\x91\x45\x69\x13\x51\x01\x9b\x52\xa3\xae\x8b\x76\x94\xe4\xaa\xfb\x60\xa9\x53\x3f\xcb\x01\x43\x48\x08\x4c\x89\x97\xf3\x78\x71\x20\x72\x26\xed\x15\x8d\xd4\xa8\x76\x54\x89\xf2\xdc\x46\x98\x32\x93\x0c\xaf\xc7\xc5\x64\x45\x6c\x57\xe7\xcb\x30\xc7\x39\xa0\xa4\xa9\x7b\x9b\x76\x0e\x68\x4e\x61\x63\x05\x92\xfc\xbe\x1e\x8b\xe2\xb7\x2a\xc3\xed\xe7\xea\xa4\x08\x29\xa5\x3f\x59\x09\x4e\x39\x57\x2c\xf9\x0f\xa2\xd4\x40\x82\xc1\x01\xea\x82\x6b\xe5\x51\x72\xf0\x4f\x3d\xf6\x79\x8f\xb1\x56\x94\x40\xac\x45\x96\xfb\xbf\xed\x05\xef\xf2\x6e\xd1\xbf\xe9\x58\x9b\x76\xc3\xfb\x7a\x46\x59\xa2\x93\x0f\xe2\x7b\x90\x71\x12\x21\x9a\x8a\x54\xf6\x5b\x27\x4c\x28\xb1\x1e\x50\xcb\x95\x32\x03\x9a\x0a\x39\x43\x76\xda\x99\x45\x98\xaf\xe6\x53\x61\xb3\x13\x25\x11\x00\x3f\x11\x00\xd4\x94\xb1\x9c\x4c\x6d\xe1\x84\x7e\xd3\x88\x93\x9a\x60\x3b\x23\x54\x22\x8f\xff\xb5\x4a\xf0\x2b\xde\x0c\x5a\x87\x35\xa0\x73\x09\x7c\xa0\x97\x38\xcc\xb6\x39\x98\x39\xd3\x96\x03\xb1\x82\x70\x10\xf7\xf5\x04\xb8\xf5\x91\x54\x0d\x02\xfb\x14\x46\xc3\x8d\x2a\xf9\x08\xb2\xb8\x4b\x5f\xb8\x7d\x51\x07\x51\x52\x1d\x72\x27\x36\x91\x0c\xbc\x6e\x2d\x01\xb4\xa1\xb6\xe1\x3d\x26\xb1\x1a\xb4\x2c\x2f\xba\xdb\x9d\xc7\x5e\xeb\xb1\xc1\x87\xfc\xe7\x79\xc1\x4d\x8b\x8a\x5f\x94\x1b\x98\x84\x61\x5f\x01\x49\x82\x28\x11\xf2\x94\x7a\xfb\x62\x09\x1c\xe2\x5a\x76\x72\x8b\x9c\x8c\x61\x3d\x0f\xe8\x10\xef\x1d\x71\xe8\xbd\x86\x92\xe5\x2f\xa1\x01\x42\x19\xa6\x9e\x3f\x12\xcc\x0e\xbd\x63\x8c\x16\x52\xe7\xb6\xcc\x2e\x4b\xca\x26\x25\xaf\xd3\xc3\xb5\x61\xa1\x70\x6f\xab\xb0\x4b\x74\x64\xed\x06\x4e\xd2\xf2\x10\x7b\x08\xf4\x88\x32\x77\xc1\x3a\x40\xb3\x1c\x49\x30\x97\xad\x56\x45\x48\x95\x0c\x3c\xf6\x64\xfd\x69\x8f\x8d\x76\xd3\xac\xf0\xef\xf7\xb6\x38\xe8\xba\x3d\xe4\x76\xc0\x42\x9a\x15\x41\x63\x61\x6b\x0b\x18\x70\x39\x50\x54\x8f\x9c\xbc\xf8\x03\x81\x5c\x6d\xaa\x60\x34\xea\x0d\xed\xe8\x1a\x7b\xcd\x88\x83\xc5\xaa\x56\xb5\x32\x25\xa2\xdd\xf4\x4c\x96\xa5\x99\xff\xd7\x95\x60\xce\xfa\xcd\x1b\x61\x57\x6a\xd5\xb9\xe1\xca\xb1\x09\x74\x08\x7c\x25\x54\xe6\x63\x72\x66\x28\x9b\x80\x1a\xa8\xd7\x54\xd8\xcf\x79\xc6\xad\xf5\x16\x2f\x78\xb5\x87\xf6\x40\xf2\x5e\xa9\xb3\xd5\xa6\x5f\x98\x29\x8a\xb0\x01\x88\x96\x73\x02\xff\xd2\x5f\x42\xdb\x32\x9d\xd9\xe4\x71\xab\x2e\x78\x9c\xb6\xdb\x60\x76\x93\x2a\x97\x9d\xee\xa6\x50\x03\x72\x01\x4e\xad\x35\x87\xb7\xbc\xe6\xd2\xbf\x8f\x16\x51\x47\xf8\xcf\xd8\xbb\x1b\xf0\xf1\xcb\xca\x03\x88\xed\x5a\x0f\x73\xbb\x6d\x35\xf6\x1a\xc6\xe6\x6c\xab\x88\x02\x14\xc8\x44\x3b\x02\x0a\x15\x44\x9f\xac\x9d\xef\x15\xe0\x22\xba\x0b\x71\x06\x1c\x16\x69\xb0\x68\xfc\xf6\xa1\xe0\xb6\xed\x1e\x72\x63\x97\xb6\x7a\x7a\xb8\x65\xe3\x4b\x57\x2c\x1b\xfb\xb6\x6c\xbc\x42\x33\x22\xbf\xd8\x0b\x9e\x78\x6e\x27\x63\x61\x4b\xed\x45\xb6\xc0\x2e\x6c\x6e\x54\xdb\xcb\xf4\xb9\x62\x04\xb9\x42\x75\x6c\x1a\xf7\xa0\xf7\x02\x6f\x7b\x0b\xc9\x33\xfd\x7b\x0c\x55\xef\xd0\x49\x87\x55\xd3\xb6\x93\xed\x44\x53\xd9\x9c\xf2\xfc\x51\x36\xbd\x8d\xb5\x78\x36\x4b\xf3\x9c\x04\x4f\x99\xec\xfe\x81\x91\xa0\xbe\xc5\xfd\x9d\xd2\xdd\x53\x9c\x5b\xdf\x6c\xcd\x99\x15\xec\xb9\x15\xa1\xfd\x87\x2b\xec\x94\x23\x29\x8f\x06\xdf\x4e\xb8\xbb\xb9\xa3\x9a\x22\x70\xb2\x3d\xa5\x7e\x4c\x45\x3b\xbd\xdc\x0b\x9e\xef\xdd\xe6\xc4\x84\xe3\xd3\x0f\x79\xfe\x9a\x35\x1f\x02\x17\xe1\x02\x75\xad\x66\x70\xd7\x30\xf8\xe7\x81\x7a\x0d\x3f\x23\xf4\x72\x91\x55\xdb\xbd\xa8\x29\xa6\x74\x20\x61\x96\x0f\xc2\x3c\xff\xfa\x21\x56\xb5\xe6\x40\x2b\x4e\xd7\x89\xfb\x42\xeb\x2d\xb7\xc4\xe9\xfa\x12\xec\x07\xb0\x09\xbe\xfa\x50\x30\xe5\x5e\x72\xb7\x3c\x73\x6f\x6b\x13\xfe\x7f\x3d\xc8\xfe\xd4\x5e\xd8\x9f\xde\xe7\xc2\x7e\xa5\x77\x51\x95\x75\xd1\xd0\xd7\x3c\x2c\x4b\x5d\x7d\xe8\xca\x4e\xbe\xdf\x9d\xbc\x50\x1b\xf9\x6a\xf0\x9d\x17\xe1\xaf\x8b\x9b\xcd\x36\xd7\x49\xb1\x25\x53\xd6\x36\xd3\xfc\xca\x66\xbd\xf7\xcd\xfa\x41\xaf\xb7\xfd\xce\xb6\xe8\x2f\xe8\x9d\xcd\x1e\x0a\x93\x7e\x54\xda\xd9\x5c\x79\x33\x14\x38\xe5\x67\x0f\x39\xa1\xf5\xee\x89\xd0\xc1\x2d\xa1\xd3\xdb\x62\x2f\x16\xfe\x3f\x8d\x07\xef\xf5\x36\xbb\xbb\x19\xb4\x0a\xd9\x2f\x8a\x2c\x6c\xb5\xa2\xc6\x65\x46\x4f\x51\xa5\x76\x4c\x1a\x0c\xc0\x62\xc9\x13\x29\xba\xed\xe5\x54\x71\x0f\x7e\xef\x3e\xc8\x3e\x37\xc2\x46\xe5\x0d\xff\x77\x47\x82\x17\x8d\x28\x95\x57\x25\x4c\xa0\x2b\xc0\xb8\xa9\x95\x03\x9c\xc8\xb7\x75\x75\xd1\xbc\x41\xe7\x5c\x83\xc3\xa2\xdc\x83\x84\xcd\x82\x34\x7b\x99\xdc\xe1\x3b\xf5\x48\x8a\x2c\xf4\x98\x87\xf2\x40\x08\xb4\x19\xb7\x2f\xda\x27\xc7\x79\x07\x47\x56\x43\x97\xa7\x19\x30\xb8\x44\x49\x7b\xd2\x7c\x4b\x83\xc5\x86\x71\xac\xab\x7f\x54\x75\x8a\x9c\xf0\x99\x90\x33\xad\x41\xf6\x1f\x7c\x64\x62\xc8\x47\x54\x8a\xa9\x62\xb6\x00\x55\x24\x2c\x78\x2c\x42\xd9\x39\x09\x92\x87\xd8\x9f\x56\x81\x53\xf4\x31\xc5\x05\x5c\xd8\xa3\xa2\x6a\x57\x2e\x47\xb3\xe3\xca\x75\x2c\x3b\x68\x17\x90\xb4\x5b\xcc\xd5\x05\x21\x32\xf6\xe9\x11\x76\x00\x86\xdf\xff\xf8\x48\xf0\xb5\xca\x39\x8d\xdb\x29\x67\x44\x79\x68\x3b\x61\x53\xd0\xb8\x46\x75\x8c\x15\xd9\x76\x78\xcf\xc8\xa3\xbe\x69\x85\x1a\x62\x74\x3a\x6d\x36\xc2\xfb\x18\x57\xac\xf9\x16\xa3\x2a\x1f\xd8\xdf\x98\x8a\xe4\x32\x0c\x2c\x65\xfc\x68\xa7\xf8\x65\x1a\xd3\x34\x2b\xd8\xe7\x0e\xdb\x26\xbe\x9d\x70\xcf\xfa\x6f\x3b\x1c\x2c\x0f\x89\x0d\x57\x81\xc9\x10\x8e\x99\x08\x1e\xe6\x5d\xb9\xe7\x28\xd3\x7f\x19\x21\x16\x7a\x45\x6a\xc9\x8b\x96\x86\xed\xc4\x8e\x6f\x78\x43\xe2\xb4\x37\x3c\x0a\x6a\xde\xf0\x94\x81\xc9\x65\xb9\x61\xec\x97\x2a\x43\x03\xbc\xdf\x5c\xd9\xbb\x69\xe7\x2b\xde\x60\x81\x3a\x4a\x61\xeb\xe0\x6f\xd4\xa5\xb6\x88\x00\x27\x83\x96\x5e\x38\x9a\xc2\xd4\x22\xc5\x37\xa5\x36\x56\xc2\xa4\x0d\x31\x96\x30\x29\xc3\x42\xb9\xaa\x20\xec\x8a\x66\x9c\x09\x1c\x1a\x24\x45\x25\x90\x65\x2c\x06\xb6\x8b\x46\x43\x74\x0b\x29\x89\x6b\xec\xf9\x96\xd9\x6e\x2d\x88\x74\xf8\x39\xe0\xb4\xee\x32\x34\x9d\x66\xb5\x8a\x26\xc7\x66\x92\xc1\x2e\x4c\x68\x8d\xe2\x66\xed\x58\xe2\x7e\xa3\x32\x94\x95\xfd\xe7\x2b\x8a\xa8\xeb\xf5\x95\x21\xac\xe8\x25\x8b\x7d\x4d\xeb\xd8\x16\x6b\xbb\x76\xba\x5b\x5c\xd0\x94\xdf\x5f\x87\x84\xa9\x5e\x57\x56\xf4\x96\x34\xd3\x09\xb5\x93\x72\x7d\x0e\x2d\x2c\xb2\xf9\xe0\x8e\x9f\x40\xe0\x77\xf8\x34\x41\xed\x18\x46\xf5\xbb\x2f\xdd\x53\x1b\x52\xe5\x28\xe7\x37\x4c\x96\xea\x23\x75\xb5\x1e\x2c\x9a\xa6\xf2\xb9\x41\x04\x80\x5c\x49\xb4\x9f\x0f\x59\x49\x26\x01\xd8\x85\x1f\xf8\xc3\x8a\x4e\x01\xf8\x64\x25\xf8\x50\x85\x1c\x94\x46\x62\xf1\x6e\x96\xb6\xb3\xb0\x03\x3c\xb5\x26\xd3\x2b\xb3\x47\xb5\x28\x79\x36\xb7\xc9\x1a\xe0\x0b\x59\xda\xec\x35\xa4\x6a\x99\xb6\x0c\xef\x95\xb5\x2e\xa4\xbe\x06\x13\x01\x8f\x1d\x5c\x94\x72\x7c\xe0\x0c\x20\xc2\x04\x68\xb2\xf4\x0e\x41\xf0\xfa\x44\xbe\xa8\xb9\x7f\x0c\x95\xa0\xfc\x44\x1e\x35\x91\xe9\x9d\xb7\x7b\x61\x16\x26\x85\x10\x4d\x39\xeb\x6b\x26\x28\xd0\xd6\x3e\xac\xfc\x6a\x9a\x88\x38\x4b\x71\x8d\x28\x84\x70\xe5\x40\xdb\x3c\x21\x62\x13\xa2\xf3\x9d\x27\x44\x2c\x53\x42\xc4\xb9\xe0\x29\x2a\x09\xdf\x4e\xb5\xb1\xea\x09\x73\x93\xb7\xd2\xb4\x46\x28\x6d\x80\x3a\x6b\xb4\x6d\xbb\xd4\xcf\xb9\x59\x9e\xc3\xec\x2a\x1a\x42\xc7\x44\x81\xbe\x75\x34\x78\xa9\x37\x78\x7d\xcb\x18\xd0\x41\x76\x5a\x87\x8d\x88\x8e\x1f\x2e\x19\xed\x4a\x54\xe4\x16\xf5\x2c\x14\x94\x94\x5c\x30\x13\xb5\x0d\xef\xd1\x4a\xfb\x6d\x62\xa5\x74\x3c\xe3\x86\x37\x86\xdf\x75\x36\x80\x2f\x57\xd8\x3d\xac\xfc\x8e\xff\x34\x76\x76\x57\xd1\x89\x5b\xd8\x93\xd8\x0b\x3d\x46\x1f\xf6\xfb\x9b\xc7\x47\x6f\x11\xf4\x38\xaf\xd7\x59\x70\xbd\x62\x33\x35\x49\x96\x56\xe4\x23\xdd\xac\x53\x64\x3b\x46\x12\xa3\x92\xfe\x70\x47\x5e\xfe\xf2\x81\xa1\xdc\x20\x67\xe8\xd4\x38\xd3\x6c\xca\x61\xf4\x5f\x7d\x20\xb8\xa9\x74\x0d\x77\x93\xa2\xd7\x8d\x89\x85\xc2\x9c\x6e\x28\x43\x6f\x7e\x81\x87\xf8\x6c\x6d\xc3\xab\x44\x5d\x67\x7c\x1f\x18\x65\xa7\xd8\xf8\x4a\x9a\x43\xea\xb9\x7f\x75\xf0\x1d\x72\x69\x9f\xa5\xdf\x5a\xb3\x50\xc7\x57\x7b\x3d\xdc\x5f\x61\x95\xa8\xeb\xff\x78\x25\xf8\x21\x00\x27\x9e\x5f\x18\x78\x1c\xc1\x82\x69\xd5\xc7\x69\xda\xad\x87\x8d\x55\x7e\xf4\xf8\x89\xeb\x6a\xc7\xe4\xff\x4d\x5d\x3f\x31\x09\x98\xde\xd5\x38\x95\xea\xe7\xd1\xe3\xa7\x6e\xa8\x9d\xb8\xf6\x1a\xb8\x77\xfc\xd4\xc4\xa4\x5c\xa0\xd6\x7d\xc8\x53\x6c\x48\x11\x79\xf4\xe8\x89\x13\xd7\x50\x21\x27\xae\x91\x4a\xe5\xc2\xda\x29\x3c\xae\xe5\x29\x6d\xc2\x52\xe9\xec\x61\x70\x38\x21\xbf\xeb\x1c\x22\xb9\x3a\xa4\xc6\x1a\x87\x45\x2b\x05\x97\xef\x4c\x9c\xa7\x93\xbc\x21\x32\xf0\x70\x59\xab\xad\x91\x76\xba\x69\x82\x59\xe4\x90\x1a\x2e\xef\x55\x81\xce\x6b\x52\xa7\x38\xc0\xd7\x81\x19\xd6\x11\x19\xeb\x6c\x3c\x49\x9b\x18\x82\xbe\x1a\x7c\xaf\x62\xc4\x9c\xe6\x17\x80\x4f\x23\xcd\x69\x4b\x70\xba\x0c\x64\x66\x23\x4c\x6c\xb2\xe2\xa6\xc0\xa8\x0d\x61\x65\x22\x60\x97\x00\xb8\x7b\xa2\xe9\x09\xb5\xb5\xf1\x10\x4e\xba\x45\xd1\xf2\x9f\xb9\x7b\x60\xff\xe0\x49\xc6\xe0\x5b\xa4\x4a\xe2\x74\xb3\x74\x2d\x6a\x6a\x77\xa3\xaa\x31\x7b\xdf\x23\xd8\x63\x87\xb3\x23\xf8\xaf\x7f\x44\xb0\xbe\x90\x36\x87\x81\x2a\x9b\x98\x11\x9c\xb8\xb2\xc9\x59\x2f\x41\x11\x88\xd8\xf0\xcb\x36\xf4\x85\x15\x58\x66\x67\xf1\xc3\x32\x76\x79\x33\xe4\xcb\x25\xc8\xf2\x8f\xb1\x2b\x56\xbb\x2b\x00\x7d\x0f\x9f\xb3\xeb\x33\xb6\x4d\xfc\x63\xfb\x06\xe8\xfb\x86\x00\x4e\x66\xbf\xaf\x30\x4a\x3f\xe9\xed\x20\xa2\x71\x21\x6d\x02\x34\xe9\xfd\xde\x92\x0d\x30\xa5\x13\xfb\x45\x0e\xb1\x18\x65\xac\x52\x20\xae\xf8\xfa\xe2\x7a\xb2\xd7\x55\xb4\x3e\xfa\xb2\xca\x0e\xa2\xe2\x65\xd3\x10\x9f\xf4\x4f\xbc\xf3\x69\x0e\x6b\x1e\x8f\x32\xea\xa0\x52\x82\x2b\x85\x46\x81\x74\x83\x4c\x78\x4b\x37\xee\x75\x41\xde\x87\x85\xa8\xf1\x05\xcd\x7a\x4b\x21\x51\x2a\xc9\xd5\xc0\x8e\x7e\x9d\x7b\xe6\x41\xef\xb6\xed\xed\xc0\x47\xfd\xef\xaa\x0e\x87\x61\xb4\x22\xc2\x17\xd2\x26\x63\x7f\xe1\xb1\xab\xb7\xb1\xdf\xdf\x91\x8b\x8c\x88\x09\xfd\x5f\xf2\x82\x27\x5b\xbf\xf9\x4a\x1a\x37\x95\xa5\x04\x12\xa1\xdc\x24\x7a\x70\x96\x01\xa4\x52\x8e\x2f\x0c\x8d\x83\x6a\xb2\x3a\xb9\xe6\x9e\x11\x9c\xbf\x28\xff\xd0\x7e\x26\x59\x00\x26\x41\x42\xf8\x1f\xda\x92\x40\x27\x09\xae\x06\x96\x2c\x34\xe4\x86\x88\x11\x95\x21\x3e\x11\xd7\x51\x66\xf6\xfa\xff\x1a\x63\x77\xef\x15\x9b\x8b\x20\x29\xbf\x61\x01\xba\xfe\x7f\x8a\xfa\x73\x05\x97\xec\x0a\x2e\xd9\x15\x5c\xb2\x7f\x15\xb8\x64\xff\x32\xc2\xae\xdd\x1c\x5f\xfc\x1b\x3d\x1a\xe6\xeb\x1b\x3a\xf2\x6f\x30\xf6\xe6\x6d\xe3\xec\x89\xc3\x72\x19\x23\x29\x29\x1c\xbc\x93\x7f\x39\x18\xfc\x8d\xe7\x00\x9e\x34\xe0\xa1\x32\xc4\x89\x5c\x6f\xb7\x77\x85\x94\xc7\x8d\xd5\x1a\x9f\xe1\xb3\xce\x63\x56\x84\x34\x25\x98\x00\xbe\x09\xe5\x31\x59\xb9\x3a\x64\x49\xb5\xde\x52\xcc\x4a\x76\x64\x75\x26\xda\x40\x7e\x8e\xeb\x45\x8e\x6d\x2c\x8a\x9a\xfb\xcd\x7c\x6b\x0e\x37\x29\x03\x86\x92\xb8\x8d\xe3\xeb\xf3\x73\xce\xac\xfb\xea\x01\xf6\x62\x8f\xe9\x7b\xfe\xb3\x82\x0e\x55\x32\x6a\x6a\xa3\x84\x33\xa9\xd5\xed\x84\x7a\x6c\xa8\x66\xaa\xa8\x30\xd4\x88\x77\xfa\xf9\x7d\x71\x15\x5f\xa8\x76\x9b\x53\x8b\x67\x66\xe6\xce\x9f\xa9\x75\x1c\x7c\xa7\x17\x56\x34\x7a\xcc\x3f\x7b\xc1\x5f\x3f\xc4\xe8\x31\x58\xc1\xe9\xcb\x85\x21\x73\xd9\x7a\xe1\xc3\x9e\x85\x40\xf3\x5e\x2f\xf8\x49\xcf\x58\x93\x1e\x5a\x34\x9a\x7d\x36\xc1\x82\xb2\x79\xa3\x03\x65\xf3\x8a\x3d\x43\xd9\xdc\x65\x9a\x6e\x30\x81\x43\x85\x63\x43\xd6\x05\x2b\x0f\x5d\x13\x90\xd8\xfc\x24\x49\x42\x5e\x20\xb9\x8e\x97\x60\x1d\xb3\xe7\x57\xd8\x93\x76\x44\x21\x45\x40\xf0\x9f\xf6\x82\xeb\x9d\x2b\xda\xfa\xba\xb9\x6f\xc9\x30\x59\x0d\x50\x9c\x3c\x22\x4e\xc3\xe6\xe9\x30\x96\x3a\x5e\xe6\xf7\xb6\x60\xc8\x30\xdd\x63\x5e\xa0\x13\xe8\xcd\xf6\xb5\xe1\x44\xd7\xee\x59\x54\x7e\xb4\x5a\xa7\x17\x6a\xec\xbf\x1f\xb4\xdd\x1c\x5b\x98\x23\x14\x72\x32\x84\x0f\xbe\xff\x60\xb0\x68\x5f\x70\xb5\x7e\x75\x67\x12\x06\x0a\xd8\x1c\x2d\x45\x44\x29\x2d\xda\xa9\x1a\x16\x1c\xb4\xb7\xda\x86\x37\x06\xda\x54\x5e\x16\x4e\x57\x6c\x79\xfb\xb4\xe5\xf5\x18\xf5\xac\xbf\x1a\x7c\x07\xfe\x35\x7c\xc8\x1c\xcd\xee\x29\xec\xc9\x7b\x8a\xe6\x54\x85\x5d\x31\x21\xee\x27\x04\x6f\x79\x7b\xd3\xcb\x71\x7f\x6a\x58\xfa\xbd\xbd\x32\xcb\xe1\xe2\xaf\xad\xb0\x13\x3b\x1a\xc4\x85\x4c\x18\x27\xbc\xff\x05\x2f\x78\x86\x73\x45\x6b\xe9\xad\x5e\xdc\x8a\x20\xd1\x57\xe5\x26\x27\x26\x6c\x8c\x1f\xc5\x3e\x9d\xe4\x4d\x81\x69\xef\xc0\x62\x8e\xc9\xcd\x59\x16\x89\x26\x4f\x7b\x25\x20\xa5\x1e\x9b\x63\x8f\x56\xc3\xaf\x96\xfc\xf1\xe0\x09\x4b\xc3\x9c\x6c\x8b\xee\x73\xf6\x9c\xaf\xb2\x91\x5e\xd4\xf4\xbf\x2b\xf8\xd6\xa1\x6f\xde\x31\x3f\xe7\xe6\xa8\x1d\x70\xf2\xbe\x86\x89\x5c\x92\xe5\xfe\xff\x1d\x0d\x5e\xe1\x0d\xb9\x51\x8e\xa3\x30\x82\x37\x74\xc5\x2e\x8f\xe8\x05\x98\xa1\xd3\x3a\x7e\x49\x8a\x93\xa4\xa9\x43\xbb\x4c\x0e\x9e\x8d\x4d\x83\x88\xad\x61\xe2\x16\xe2\xf6\xe1\x1f\x8f\xb0\x67\x5b\x7e\xbe\x34\xa8\x6b\x1f\x5f\x84\x31\x1b\xf2\x0b\x5b\xd4\x89\x9c\x34\xf2\x44\x3a\x77\x61\x89\x22\x3c\x8e\x16\xfd\x6e\xd4\x00\x1b\xc6\xcc\x5d\x4b\xee\xeb\xf9\x84\xdd\x99\xcf\x06\x5f\x61\x2f\x58\x99\x5f\xd8\xfd\x07\xe7\x17\x06\xbf\x77\xeb\xec\x19\x9e\x66\x66\xf3\xde\xea\xe3\x5f\xf0\x54\xa4\xdd\xef\x79\xc1\x7d\x0b\x10\xa6\xe6\x08\x3b\x39\x8f\x33\xe4\xf6\x50\x1d\x8c\xc1\x6c\xf3\x2d\xd0\x18\x26\xb9\x80\x43\x35\xe8\xd7\xb8\xb9\x68\x2c\xa5\xd2\x88\x00\x6c\x51\x98\x10\x4f\x5e\x94\xf0\xa8\xb0\x25\xe8\x14\xab\xb2\x27\xed\xc0\x9e\x9c\x15\x4b\x64\x70\xdd\x11\xc3\xf6\x6b\x46\xd9\x13\x36\xd3\x9e\x9c\x03\xce\xdf\x8e\x04\xe7\xe0\xaa\x3d\x35\x91\x99\x39\xee\x57\xff\x3f\xf6\xfe\x04\xcc\x92\xac\xac\x13\xc6\x9f\xb8\x99\x55\x95\x75\x7a\x81\x0e\x70\x70\x04\xf5\x4c\xb4\x50\x99\xcd\xbd\x37\x2b\xab\x37\xba\xba\x69\xc8\xae\xac\xee\x4e\xa8\x25\xc9\xcc\xea\x96\xcd\xce\xb8\x37\xce\xcd\x0c\x32\x6e\xc4\xed\x88\xb8\x99\x75\x7b\xc0\x7f\x0b\x0c\x28\x22\xca\x80\x08\xc5\xa2\xc8\x3a\x88\x8e\x8c\x20\xf4\x20\x8b\x28\x8e\x02\x36\xfc\x01\xc1\x91\x45\x45\x11\x17\x1c\x9d\x81\x71\x69\x1c\xbe\xef\x39\xef\xfb\x9e\x13\xe7\xc4\x8d\x9b\x99\xd5\x59\xbd\x38\x5f\xc2\xf3\x74\xe5\x8d\xe5\xc4\x59\xdf\xf3\x9e\x77\xf9\xfd\x7c\x48\x14\x04\x6b\x35\xe2\xb8\x42\xc4\x0c\xa4\xc8\x6a\xd6\xf9\xc9\x9b\x44\xee\xf3\x8e\xf0\xa5\xf8\x9a\xaa\x62\x81\xfe\xf1\x31\x76\x77\xa1\xb3\xff\x6f\xc7\xfb\xc6\x16\x3a\xfb\x7c\xce\xfd\x5e\x2f\x82\x3c\x62\xa9\x85\xea\xe8\xaa\x05\x4d\x08\xdd\x22\x42\x44\x4c\xe9\x7c\x40\x21\x22\x97\x0d\x84\x3b\xcd\x01\x27\x17\x57\x3f\x4f\x1a\x18\x2c\x40\x1f\xc6\xef\x6e\x81\x18\xf9\x42\x45\x84\x7d\x97\xd7\x95\xc5\x76\xfa\x11\xd2\x55\x2b\x8d\x41\x65\x7d\xc6\x3a\xdb\x19\x7a\x83\x3c\xbf\x22\x84\xa0\x1c\xdf\xa4\xcd\x4e\xad\xae\xe0\x93\x41\x98\xad\xd7\x0b\x02\xbb\x3a\x6f\x36\x9b\x53\x76\x25\x0e\xb2\xcb\x4d\x85\x16\xd1\x4d\x94\x32\x7b\x5c\xfe\x04\xf5\xed\x8f\x26\xbc\xc7\xeb\x5f\xf6\xda\x80\xcb\x5b\xe7\x7c\x7c\xe0\x00\xfb\xa4\xe9\xdf\xfa\xf0\x2e\x73\x3e\xfe\x7f\x0f\x51\x2e\xd7\x5e\x82\xc7\x85\x52\x2f\xd7\x55\x82\x47\xcb\xf3\x42\x05\x42\x55\xcc\xa9\xcc\x4e\x24\x32\x05\xe4\x0c\x9b\x66\x8d\xd1\xa4\xbe\x15\x13\x78\x4f\xa9\xdc\x8d\x52\xe9\x6f\xaf\x54\xde\xe8\xde\xd0\x18\x4e\xcd\xd0\x4e\x3d\x1a\x93\x52\x6e\x87\x96\x26\x8c\x7d\xe0\x20\x33\xc7\x90\x82\x35\x4c\x38\xce\x85\x34\x4c\x80\xdd\x3b\xf2\x89\x94\xfb\xc5\x07\xbd\x6b\x86\xae\x56\x45\x91\xf4\xe8\x21\xde\x96\x4f\x89\x11\x12\xea\xe3\x7b\xe9\xd7\xbb\x5e\xd3\x03\xb5\xa6\x7b\xde\x0f\x85\x55\xc0\x72\xd6\x78\xc9\x77\x8b\x55\xfd\x64\x76\xfd\x16\x61\x75\xdb\xcd\x88\xbd\x15\xbe\x8b\xc8\x93\x4f\x98\x3b\xf3\x87\x76\xb9\x33\xff\x68\xf5\xce\xfc\xe0\x51\x75\x77\xb7\x17\x57\x4f\x73\x6f\x55\x9c\x90\x43\x12\xa4\x2a\xc7\x4c\x0b\x32\x63\x1a\x92\x30\x63\xaf\x72\xd8\xf5\xb6\xe3\x68\x2d\x49\x89\xa4\x4f\xcf\xd5\x25\x11\x75\x28\x24\x61\xb1\x1f\x89\x6c\x51\x6c\x84\x62\x13\xc0\x8b\x96\x2d\x29\x74\x33\x9b\x63\x07\x35\x4c\x8a\x7b\xad\x77\x45\x81\x2e\x9d\x27\x5c\xc8\x79\xec\xe7\x02\xb2\x5b\xc0\xd9\x37\x22\x98\xe0\x2f\xab\x21\xdc\x8f\xf7\xd6\x44\x57\xa4\x25\x8d\xff\x83\x07\xbd\xa7\x2d\x5a\x7c\x20\x42\x3d\xa7\x54\x50\x95\xf8\x80\x20\x56\x94\xd6\x46\x28\xaa\xea\x24\x10\xa4\xe1\x86\x48\xed\x43\xe5\x9f\x4c\xb0\xaf\x4c\xb0\x47\x61\x29\xc7\x22\x3f\xec\x2e\x8b\x6e\x4f\x8a\x35\xf7\xe3\x13\xec\xc6\xed\x8f\x39\x1a\x42\xfe\xb6\xe1\x22\xbc\x17\x4e\xdc\x6e\xc0\x60\x83\xd1\x16\xa2\xff\x60\xdd\xfb\x71\xd0\xf0\xa3\x24\x16\x7c\xe1\xb6\x63\x80\xc5\x94\x26\x1b\x61\x16\x92\x36\xad\x90\xc1\x97\x31\xd6\xa6\xc0\xcd\x83\xb5\x5d\xd9\x51\x98\xe9\xd4\x12\x01\x92\x79\xe3\x97\x01\xe9\x6b\x33\x16\x3a\x1a\x69\xe1\xb6\x63\x75\x1e\x36\x45\x53\xfd\xd2\x8f\xa2\x3d\xc3\xc0\xc4\xd5\x1c\x34\x10\xec\x03\x55\x31\x3d\x9c\xe6\xbb\x2b\x37\xc8\x4a\x82\x93\xb5\x71\xc3\x46\x01\x66\x7e\xe3\x8a\x3c\x0f\xa5\xf2\x01\xfb\xaa\x09\x2e\xab\x25\xd5\x0a\x45\x58\x11\x24\x4d\xb6\xc2\x41\xfa\xe2\x51\xb4\xc9\x17\x12\xd8\x3f\xc2\x00\x37\x2f\xf8\x36\xed\x31\xb9\xea\x26\x1d\x72\xdf\xf6\x73\x81\xf8\x71\xca\x46\x20\x65\x1b\xbc\x4e\x68\x39\xb2\xfe\x76\x08\x7a\x9e\x24\x3c\x4a\xe2\xd5\xa9\x26\x63\xb3\x31\xfa\xbf\xa4\x2c\xc6\x96\x2a\x02\x9c\x22\xa0\x86\x0a\x95\xfd\xab\x8f\x6c\xb2\x16\x50\xb3\x2b\xe2\x24\xbf\x42\x0f\xbe\xc1\x3b\x09\xc7\xb1\x8d\x24\xd4\xc9\x6b\x31\x6c\x91\x18\x27\x45\xbd\xd4\x1a\xf0\x6e\x98\xe5\xfe\xba\x68\x72\x00\x2f\x54\x5b\x42\x2f\x51\xe1\x0d\x31\x9e\xa5\x20\x5e\x40\x21\xa3\x15\xe5\xc8\x2a\xc3\x7e\xdf\x4d\x36\x08\xc7\x10\xd1\xf1\x00\x92\x5c\x45\xa1\xd2\x53\x5d\xe1\xa3\x09\x46\xd5\xb6\x68\x4b\x5d\x0f\xf5\x1a\xee\xfb\xb4\x35\x60\x7f\x48\xe5\x01\x26\x57\x6a\x06\xdb\xaa\x7a\x26\x31\x79\x68\xe4\x0f\xe8\xcc\xac\xc9\x4f\xa9\x98\x91\xdc\x48\x73\xa2\x6d\x27\x16\x6d\x91\x65\x7e\x3a\xc0\xec\x99\x30\x57\xf9\x41\xfd\x4c\x74\xfa\x11\x1e\xad\xbb\x7e\x8c\x50\x74\x60\xbb\xcb\xf2\xb4\xdf\xce\x31\xc3\xa0\x95\x26\xeb\x22\xe6\x84\x3a\xd6\x64\x6c\xd9\x4a\xd2\x4b\x55\xcc\x19\x28\x28\x71\x42\x49\x4f\x05\x2a\x34\xa4\x28\xb6\x06\x26\x18\x15\xb5\x46\xb6\x1f\x71\x22\xc3\x1c\x3a\xa2\x25\xe4\x87\x08\x24\x92\x31\x25\xe4\xea\x16\x9a\x77\x1c\x46\x4d\xf6\x87\x13\xec\x31\x23\x88\x23\xdd\xdf\x98\xf0\xd6\xe4\x1f\xa8\x0b\x68\xb9\x1a\xd4\x75\x3a\x23\x08\x76\xc0\x8d\xee\x10\x97\x13\x08\xe8\x22\xde\xb8\x65\xc1\x46\x01\x66\x96\xdc\xa8\x50\x02\xca\xb2\x6f\x0a\x81\x1a\xd3\x96\x7b\x5f\xd9\xbf\xa7\x4d\xee\x05\x13\x3f\x74\x2a\xdd\x9a\xa1\xd1\x3d\x67\xb7\xa1\xc4\x8f\xdd\x22\x92\x98\xe5\x6c\x1f\x28\x23\xee\xba\xd7\xc0\xa5\x83\x31\x97\x7e\x84\x12\xd3\x5c\x54\x3a\x26\x4c\xae\x9b\x9d\xdb\x3c\xd5\x92\x2e\x8a\xba\xcf\x69\x6f\xaf\xe5\x3d\xd5\xbd\x51\x7b\x3a\xa0\x08\x5b\x37\x2b\x9d\x46\x65\x95\xca\x8e\x8f\xdf\x1d\xab\xd4\xa2\x94\x03\xe1\x66\x29\xf8\x34\x72\xe2\xeb\xc7\xbc\x67\x55\xde\x31\xed\xa8\x05\x20\x67\x11\x98\x36\xd9\xee\xf5\xeb\x0a\x4e\x1f\x56\x63\xbe\x26\xc2\x94\x27\xfd\xbc\xd7\x07\x23\x78\xd7\xcf\xcf\x39\x9a\xa7\xc1\x12\x34\x6f\xab\xb1\x9f\x71\xd8\x81\x20\xdc\x08\xb3\x24\x75\x5f\x7c\x3e\xda\x7b\x05\xcf\xf1\x71\xdb\xef\x61\x55\x41\xa9\x25\x2a\xa0\x4c\xb7\xa0\x6e\xd1\x6f\x79\x33\x1e\xbb\xda\x60\x95\x98\xf2\x1e\xa7\xa4\xf7\xd1\x52\xb0\x9e\xec\x1f\x73\xd6\x3e\x93\x5d\xa2\x3b\x08\x32\x62\x6e\xf5\xae\xd7\x24\xea\x20\xbe\x8f\xda\x88\x7c\x14\xd8\x52\x27\xd4\x7f\x1f\xa2\x16\xb8\x88\x37\xf8\x86\x9f\x5a\x0b\xe2\x15\x8f\xb6\xfc\xf6\x9a\xcd\x22\xe9\x25\x51\xb2\x3a\x58\xea\xc9\xcd\xeb\x18\x6c\x77\x7e\x18\xe7\xee\x57\x1f\xe5\xfd\xf0\xa8\x9b\x46\xee\x96\xca\xcc\x83\x27\x30\x48\x10\xc2\x09\x12\xb9\x02\xba\x09\xc9\x24\x4c\xe4\xca\xa9\xb8\xe6\x39\xe7\x40\xd7\x3f\xbb\xb4\x2e\x36\xcf\x39\x17\xa9\xab\x4f\x17\x83\x73\xce\x65\x72\x03\x3e\x13\x67\x7e\x1e\x66\x9d\xd0\x6f\x45\xf6\x60\xff\x9e\xcb\xbe\xe3\xb0\x4b\x20\x36\x47\xcf\xbb\xbf\x72\xd8\x53\xef\xcf\x81\xcd\x2c\xc4\x7b\xab\x63\xfd\x96\x82\x56\xa9\xd4\x1d\x60\xfd\x33\x5b\x06\x8a\x62\x66\x84\x3c\x13\x74\x00\x40\x7e\x6a\xa0\x4c\xcc\x10\xed\xc7\x79\x39\x3f\x09\xd4\x52\x44\x58\x04\x30\x83\x80\x00\x26\xe4\x9c\xb7\xd9\xa6\x55\xdf\xf0\x20\xe9\xfa\x61\xdc\x64\x9f\xda\xcf\x54\xd7\xb9\x1f\xdd\xaf\x68\xd2\xdf\xb5\xff\x24\x5e\x2b\xe1\xbe\x06\x62\x35\x15\x30\xd5\x50\xb3\x27\x60\x0e\x54\x78\x62\xb1\x21\xa4\xaa\x12\x84\x19\x85\xc1\x06\x4d\x7e\xbb\xd4\x7f\x56\x86\x06\xe1\xc9\x73\xc9\xa9\x24\x5f\xa2\x14\xa2\x15\x40\x2c\x25\xfd\xba\xeb\x9f\x0d\xbb\xfd\x2e\x00\xbd\x86\x39\xa0\x29\x87\x1d\xa5\xaa\xb5\x44\xbe\x29\xc8\x59\x51\xb4\xd8\x9e\x25\xe4\x23\x22\x0f\xa3\x6e\x31\x89\x01\xbe\x1a\x25\x2d\x3f\xe2\xdd\x30\x96\x9f\xc1\x5c\x69\xad\x4e\x03\x67\xd1\x95\x8d\xbb\xe4\x21\x87\x94\xb2\x3a\x57\x7d\x41\x3e\xb4\x3c\xe1\x33\x75\xe2\x9f\x09\xb2\xe2\xc8\x01\x61\x63\xd6\x4c\x52\xb3\xd8\xcf\xf8\xcc\xf4\xcc\xf4\xe1\xa3\xfc\xf9\x5c\x16\x3d\x43\xff\x1e\xa1\x7f\xaf\xe4\xcf\xe7\xcf\xe7\x9c\x2f\x70\x6e\xfd\xcb\xe1\xdf\x86\x3c\x22\x18\x75\x98\x91\xd5\x6c\x27\x5d\x6a\x30\xe8\x54\x8a\x0c\xbe\x48\xca\xca\x13\x2a\x1a\x74\x64\x80\x4d\x96\x75\x98\xb9\xde\x38\x72\xcb\x5e\x87\xe4\x2d\xa8\xd4\x24\x54\x69\x8a\x6f\x82\xf2\xd3\xf5\xd7\x71\x62\xcd\xb6\xf3\xbe\x1f\xc9\x8f\x4f\x1e\x69\x1c\x9e\xe2\x49\x6c\x3f\xbe\x11\x26\x52\x0d\x52\x35\x9c\x9c\x99\x6a\x0e\x55\xf9\x48\x45\x95\xad\xda\x42\x2d\xfc\x78\x00\x45\x8f\x9e\x35\x6a\xc2\xcc\xc6\x83\x4d\x7f\xa0\xa7\x8d\x5a\x58\x52\x2a\xf0\xb5\x70\x75\x0d\x40\xdc\x45\x5b\x04\x5a\xbf\xc7\x59\x10\x2a\x3d\x14\x0b\x1d\xf0\x10\xbc\x61\x87\x90\x4c\x43\x89\x41\xb9\xd5\xe8\x48\xd7\xc2\x25\x35\x03\x63\x7e\x58\x1d\xa1\x08\xa3\xc6\x4e\x57\x7f\x47\x8d\x99\xf2\xc7\xfd\xb9\x9a\xf7\x13\xb5\xe5\xe2\x82\x9a\xe4\xeb\x62\xa0\x81\x70\x61\xca\xc0\x31\x23\x50\xd5\x43\x87\x26\xad\x7f\x9a\x60\x61\x06\x6f\xc9\x3a\x60\x10\x60\x5b\x29\x9c\x43\xb9\xe3\xf9\x50\x34\xa3\x96\x94\xfc\xf6\xe2\x49\xa4\xa8\xb9\x61\x5d\x0c\xea\x58\xd0\x8d\xa8\x8d\x7b\xad\x7e\x7b\x5d\xe4\x1e\x4e\xf2\x3c\x45\xdc\xe5\x7e\xce\xc9\xd3\x1b\x0c\x0b\x9b\x3c\xc1\xc2\xf0\xcd\x51\x7d\x6a\x21\x11\x1e\x60\xc3\xb2\xd9\xbd\xe7\x80\xf7\x4b\x07\x6e\x2f\x5f\x1e\x4e\xdc\x0e\x84\x4f\x1d\xe3\xab\x43\x74\x98\xf3\x20\x11\x59\x7c\xa8\x18\x5d\x68\x3e\x2e\xc1\xb6\xde\x6b\xe4\xec\xb4\xa4\x0f\x9f\xa4\xcd\x76\x8a\xe7\x22\x8a\x14\xd5\x18\xde\x4c\x61\xac\x21\x55\x9c\x9e\x0e\xa1\x04\x7b\x26\x56\xbe\x68\xbe\x94\x17\x36\x11\x39\xcb\x23\x0a\xfe\xae\x33\x0e\xc7\xc6\xd5\x70\x43\x2e\x8d\x1d\x4d\x5d\x5c\x9e\x6b\x22\xea\xf1\x54\x04\x7d\x3c\xaf\x32\xce\xb3\x75\xb1\xd9\x64\xb3\x46\x4b\x11\x75\x46\xcf\x0a\xcf\xea\x53\x0f\x4d\x0a\xb1\xbd\x30\xc3\x0e\x8c\xb9\x82\x75\x51\x1e\x78\x02\xc0\x41\xa7\x74\x96\x85\xab\x10\xdf\x8a\xca\xa7\x9f\xa3\x01\x01\xaa\xa5\x84\x81\x47\x8b\xdf\x93\xe2\x22\x4b\xac\x19\xf8\xe0\x08\xdc\x2b\xa5\xb0\xdb\x5a\xe0\x2e\xc0\xff\x87\x05\xef\x7c\x87\x57\x4c\x41\x5d\x17\x6b\xf2\x9c\x8f\x2c\x3e\x02\x22\xf3\xca\x29\x43\x24\x5f\x39\x7d\x64\x7a\x66\x52\xd6\xf5\xc8\x94\xac\xb5\x25\x6c\x67\xb4\xb0\xd5\x6f\x52\x8d\x44\x66\x89\xdb\xf9\x98\x23\x15\xd8\x66\x92\x06\x8a\xeb\x01\x3b\x13\x6a\x94\xe5\x64\x2e\x08\xbb\x6a\x09\xa3\xb9\xa2\x98\xac\x9b\x89\x5c\x38\x20\xf4\xc3\x9c\x5f\xd1\x4d\x52\x71\x85\xf1\xf8\x4e\x56\xf4\x6b\x0e\xb2\xa9\x1d\x31\xc0\x81\xb3\xe9\x2f\x27\xbc\x43\xc6\xef\x2a\x37\x93\x8a\xda\xac\xf4\x2e\x7d\x78\xcf\xbb\xb4\x6b\x7b\x40\xa4\xbc\x4b\x6d\xef\xfb\x2b\x69\x8b\x8a\xb8\xd9\xe2\x64\x79\x2d\xbb\x7a\x8b\x20\xd9\xd1\xa3\xbe\x67\x7d\xd8\x85\xf5\xe1\x33\xa6\x43\xe9\xb7\x76\xe9\x50\x7a\x58\x24\x32\xdf\xe7\xac\x6e\x6f\x70\x98\x73\x6f\xda\xca\x0b\x6e\x4c\xb6\x92\xed\xc1\x90\x2c\x8c\xfd\xc7\x47\xb2\x1f\xbe\xbf\x79\xa0\x23\x53\x40\x95\xd4\x79\xdf\x23\xbc\x1b\xb6\x79\xc6\x02\x3f\x54\x59\x3d\x72\xf3\x3c\xb6\x38\x67\x50\xdc\x61\x2a\xdd\x39\xe7\x80\xc9\x8a\xae\xc4\xdd\xbd\x97\xb2\x77\x39\x4c\xdd\x72\xdf\xe4\x78\x3f\xed\x28\x37\x91\x99\x65\x1a\x66\xfa\x0b\x45\xb8\x22\xe8\xc7\x60\x89\x26\x02\x61\x00\xe4\x2a\xa7\xf3\x49\x7d\x45\xb1\x67\x2c\x83\x07\x44\x93\x6f\x9c\xf5\xdb\x39\xd1\xf5\xa9\xd2\x61\x17\xa6\xe7\x9f\x9c\xa7\x7d\x61\x33\xe8\xde\xeb\xb0\x8b\xb3\x7e\x4b\x97\xee\x7e\xc8\x61\xfe\xa8\x49\xbb\xab\x21\x59\x32\xbe\xe2\xfd\xb0\xf9\x4d\xb2\x2a\x0c\xf8\x26\xa8\xfc\xe6\x1d\xab\xa3\x74\x32\x3c\xc6\x18\x96\xf3\x62\xa5\x32\xde\x64\xef\x19\x63\xdf\xeb\x07\x18\x77\xeb\x47\x0b\x29\xc8\xf8\x63\x49\xd4\xef\xc6\x99\xfb\xea\x31\xef\xf5\xb5\x51\x77\x0d\xe3\x46\xf1\x88\xdc\xea\xe0\x66\x2a\xf2\x7e\x4a\xa1\x8d\xcb\xa0\x69\xa0\x89\x48\xca\x34\xb1\x15\x75\x89\xb6\xa1\x4f\x83\x4f\x46\xf6\x9c\x5a\x6f\xc8\x0f\x73\xb9\x54\x23\x41\xb1\x6c\xe8\x86\x37\xfc\xac\x01\x40\x69\x68\x3a\x24\xb8\xb3\x26\x51\xe6\xaa\x3a\x41\x0a\x64\x41\x05\xea\x2b\x54\x1b\xbc\x2f\x0f\xf8\xbd\xc8\x1f\x28\x09\x2d\xa7\xa0\x86\xc8\x2b\x25\xcf\xe2\xd9\xcc\xda\x3f\x42\xb6\xca\xc4\x03\x32\x13\xb0\xbf\x8b\xe5\xc7\xbe\xec\x30\x16\xc8\x5d\x02\xe8\xf3\xdd\xdf\x77\xbc\x0f\x3b\xc5\xef\x51\xeb\x66\x44\x5b\x66\x17\xe6\x65\x7b\x8a\xf7\xe9\x98\x4a\x5a\x61\x0e\x00\x59\x06\xdd\x13\x29\x05\x46\xc1\x38\x1e\xf2\x60\xb7\xe9\xa7\x90\x24\xb3\x26\xfc\x00\x62\x70\x75\x54\x2b\xda\x31\x81\x2e\xad\x39\x9c\x63\x64\xaf\xb1\x5f\xad\x31\x57\x55\x27\x4c\xe2\xdb\xb1\x50\x04\x07\x1a\xbe\xae\x29\x85\x95\x29\x07\x8f\xb7\xaa\x2a\x7a\x1e\xe6\x09\xa6\x2e\x63\xae\x08\xa2\x09\x69\x95\x56\xe4\x28\x47\x56\x8a\x6e\x40\xc7\xa8\x14\x00\x56\x24\xa7\x2a\x77\x44\x27\x5b\x3d\x49\x04\x64\x72\x6f\x11\x71\x00\x73\x46\x8d\x42\x2c\x36\xa5\x46\x45\x69\xc6\xc6\x10\x89\x3b\xfb\x7e\xc4\x93\x94\xaf\x82\x4b\x2b\xe5\x59\xee\xb7\xc2\x28\xcc\x07\x00\x78\x97\x00\x2a\x5b\xa8\x31\x69\x68\x1f\xfd\x0d\x87\xf2\x3a\x7f\xcd\xf1\xde\xe6\x98\x9c\xa1\xaa\x68\x79\xad\xce\x21\xff\xfd\x6b\x77\xbf\x61\x63\xe6\x6b\x77\xbf\xb1\x0e\x7f\x01\xf4\x14\xfe\xd4\x5c\x5b\xdb\xa7\x44\x5b\x8d\xf6\xf3\x2d\x53\xa4\x57\x64\xc5\x57\xf0\xf5\xa2\x57\xcd\xea\x7f\xd5\x61\xfb\x51\xe5\x74\x3f\xe7\xb0\x3b\x1e\x90\x55\x74\x9b\x76\x57\x7b\x3d\x52\x96\x6d\x23\x20\x5d\xd4\x3e\xe2\xc2\xbf\x5d\xe7\xbd\xb4\x1f\x03\x5a\xa9\x0f\x74\xce\x30\x15\xc8\x17\xb8\x83\x35\xd6\x64\x6b\x8c\xb6\x41\xf7\x47\xbc\x05\xea\x48\x50\x12\x3b\x91\xbf\xca\x45\xec\xb7\xa2\x30\x5e\x9d\x0e\xc2\x0c\xff\xb2\x4b\x05\x75\x0f\xf9\x70\xd5\x84\x09\x7d\xd4\x20\x67\x17\xe6\x33\x6b\xf1\xfc\xba\xcd\x57\xed\xf7\xf3\x35\x34\xaa\x28\x0e\x8a\xe5\x64\x5d\xc4\x46\x58\xc9\x7f\x18\xf7\x8e\x97\xae\x61\xd5\xb0\x77\x7a\x26\xae\x4a\x0e\x5e\x5d\xbb\x4c\x25\x17\x6c\xb7\xe6\x7f\x1e\x63\xd7\xb2\x7d\xf0\xbc\xdb\xf4\xfe\x1d\x7c\x40\x4d\x49\xa2\xc5\x6a\x09\x3f\x05\x73\xc2\xba\xb0\x21\xf7\xbe\x55\x63\x07\xfd\x7e\x10\x02\x23\x91\xfb\xf5\x9a\xf7\xbb\xb5\x59\xf5\xd3\x8e\xfd\x94\xa5\x19\x09\xc8\x05\x8c\xa4\x96\x6e\x24\x7b\x0a\x42\x28\x7d\xca\xc6\xb6\x18\xe8\x6e\x7e\xd6\xe4\xea\x3b\x0d\x7f\x53\x4e\xf9\xa1\xf6\x26\x29\xf9\xa8\x37\x44\x8a\xd9\xaa\xf4\x41\x7c\x72\xd3\xcf\xec\x34\x0b\x0b\x2b\x96\x2a\xec\x17\x6d\x31\xa0\x74\xd5\x5e\x55\xdc\x95\x15\x40\x94\x2c\x41\xbe\x7f\x75\x0f\xab\xa0\x24\x12\x9d\xd1\xf4\x4d\xfa\x8c\xe1\x3a\x2f\x16\xcb\x16\xa9\xf5\xdf\xb9\xcc\x3a\xe6\x0e\xc3\xd3\xcd\x10\x3c\x1d\xcc\x9a\xdf\xbf\xcc\x7b\x7e\xf1\xb3\xc2\xcf\x01\x08\x84\x98\x69\x01\x20\x5c\xb4\xd5\x12\x6e\xde\x24\x48\xde\x15\x79\x2a\x58\x21\xcb\x8c\xa0\xb3\xbe\x36\x7a\x63\xb4\x80\x45\x9c\x2c\xfb\x53\xaa\x01\x53\x0a\x91\xd6\x9a\x73\xf7\x3c\x92\x7d\xcc\x51\x3f\xdd\xf7\x3b\xec\x29\xe7\x01\xbe\x37\x53\x01\xb8\xe8\xe5\xfa\x48\xd6\x81\xe9\x95\x8c\x00\x54\xa4\xc6\x5d\x18\x5c\x45\xf6\xb3\x35\x36\xde\x4b\x02\xc0\x0b\x3a\x1f\x10\x43\xc0\x0e\xca\xac\x06\x7c\xc2\x01\xd3\xd2\xd6\xf5\xdf\x19\xa3\xb7\x1d\x9e\x93\xfa\x71\x46\x8c\xa9\x0d\xe2\x15\x15\x81\xd1\xb6\x0b\xc9\xf6\x8d\x85\x34\xd9\xeb\xc6\x0c\x67\xe1\xcb\xc7\xd8\xec\x79\xf5\x4d\x15\x7b\xba\xf7\x3b\x35\x2d\x29\xcc\x3e\x2a\x13\xa7\x4f\x2a\x3a\x4b\x64\x08\xdf\x8e\x2f\x7d\xaa\x8a\x69\xfd\x02\x71\xa8\x3f\x3c\x79\xcf\xd9\x5b\x6a\x84\x93\x7a\xae\xe6\xbd\xbc\x06\x29\x34\x24\xed\x15\x6a\x2a\x75\xa5\x26\x4a\x9f\xcf\x8d\xb5\x4d\xe2\xd1\xd3\x3e\x5c\x35\x5a\x5e\x9d\x7b\xc7\xcf\xa2\xd9\x49\xfe\x8d\x8b\x54\xfe\xb5\x00\xdf\x4f\x52\xee\x19\xcf\x42\xc7\x76\xfd\x5e\x4f\xc3\x23\x94\xc4\x09\x75\xb8\xb2\x84\x9d\x4a\x72\x71\xb4\xea\xb3\x5c\x35\xa1\xe8\x15\x79\x38\x54\x09\x45\x94\xb2\xd4\x58\xf5\x73\xc1\x6f\x5d\x98\xd5\x05\x9c\xa4\x8e\x02\x14\x46\xf9\x9a\x95\x78\xff\x0b\xe3\xec\xb2\x76\xf9\x5b\xee\xcb\xc6\xd9\xd3\xce\x6b\x2a\x0f\x55\xd7\x9a\xd3\x1f\x1c\x1b\x8e\x1d\x78\x50\x67\xb7\x71\xae\xd2\x34\xb2\x71\x31\xe7\xcb\xb0\xe3\xff\x5a\xe7\xbc\xc6\x8f\xf2\x63\xee\x47\xbd\x35\x9d\xc8\x86\xd8\xf3\x94\x7a\x85\x93\x40\x85\xf1\x55\x4d\x15\xf5\x96\x54\x05\x9b\xec\xdb\x35\x36\x21\x68\xc2\xbb\xdf\xa8\x9d\xa7\x90\x53\x4b\xc5\x9a\x10\x6f\xae\xa9\x02\xad\x69\xa0\x1c\xc6\x38\x09\xcc\x28\x4a\x3f\xcb\x92\x76\x68\xc6\x16\x5a\x91\x78\x6a\xf1\xcc\xe7\x0a\x36\xdf\xa8\x4a\xb1\xe7\x9b\xf0\x35\xe4\x4a\x00\x45\xb6\x00\x41\xe5\x69\x3f\xc6\x23\x5c\x3f\xcf\xc2\x00\xc1\x95\xc9\xbe\x6f\xee\x37\x3c\x12\xf1\x6a\xbe\x26\x6f\xdf\xd9\x17\x7d\x44\x06\x89\x92\x7e\x40\x50\xe7\x4a\x31\x0e\xdb\x02\x10\xd5\x9e\xb1\xb0\x44\x2c\x0b\x89\x1f\xe8\x8c\xd0\xd1\x1f\x9b\x6a\xb2\xef\x8c\xb1\xef\x1b\xcd\x9c\xec\x7e\x79\xcc\xbb\x86\xfe\xd6\xf6\x77\xbf\x80\xd0\x26\x0a\x6e\x74\xc1\x6a\xa1\x96\xfb\xeb\x22\xb6\xe9\x17\xc7\xd8\x2b\x1d\x36\x2e\xce\x8a\xb6\xfb\xe3\xce\x0e\x92\x37\x8f\x9f\x15\xed\x59\x28\xdc\x7b\xe6\xe9\x58\x14\x4e\x2c\x43\x9f\xec\x24\x72\x10\xa0\x0f\x0a\x5d\xa9\x00\x0d\x91\x45\x94\x30\x84\x55\x75\x13\xa8\x62\x93\xad\xb3\x03\x6b\x79\xde\xbb\x45\xe4\xee\x0a\x6b\x6e\x4f\x27\xbd\xbc\xbc\x70\x8b\xc8\xa9\x5e\xea\x67\xe9\x1b\xb2\x40\xcd\x10\x8d\xfc\xb6\x72\x3a\x34\x65\x07\x1c\xcc\xdb\xbd\xa5\xa4\xbd\x2e\x72\xf7\x45\xce\x0e\x00\x65\x97\x8f\x2d\xe0\xe3\xf4\xc9\xd3\xfa\x82\x69\x83\x8a\x35\x13\x7a\xbc\x91\x44\x1b\x28\x89\x96\x8f\x2d\x40\xa6\x6d\x13\xfe\x02\xaa\x60\x98\xe2\x03\xf9\xae\xca\xf1\x64\x3f\xfd\x7d\x95\x90\xc9\x4b\xa2\xdd\x87\x90\xff\x24\xce\xc5\xd9\xdc\xfd\xcb\x7f\xeb\x7d\xd9\x29\x5d\xa4\x20\xb6\x8c\xae\x4a\x99\x57\x50\xaa\x91\x67\x53\x29\x3f\x90\x9b\x1a\x0c\xc1\xf6\x2c\x25\x5d\x81\xdb\x93\x52\xfa\x91\xc2\x22\x8c\x91\xd7\xa5\xfc\x45\x60\x8f\x4f\x82\xd2\xe5\x26\x47\xbb\x0d\xbc\x82\xe7\xf5\x1c\x8f\x0d\xa4\x83\x85\xf1\x50\x49\xc0\x64\x5f\xb8\x65\xed\x23\xdc\x7d\x8f\x61\x1f\x1a\x63\x17\xa7\xfd\x78\x36\x3b\x95\xc4\x8b\x49\x92\xbb\xef\x1e\xf3\xde\x38\x36\x6f\x98\x3e\x0a\xd8\x7e\x92\xf4\x60\x5b\x4d\xfb\x31\xba\xdc\xe3\x24\x6e\xa4\x49\x92\x03\xa6\x21\xb2\x75\x80\x3d\x49\x1d\x50\x22\x41\xdd\x43\x87\x6d\xf4\x28\x87\x5d\x7f\x55\x48\x5d\x3f\xed\xc7\x48\xdf\x90\x70\x11\x67\xfd\x54\x05\x7b\xa3\x4b\x1c\x59\x41\xf0\x53\x67\xe6\xe7\xf8\x61\x3e\x29\xbf\x85\x91\x71\x1d\x3f\x8c\xd0\xf4\xeb\xa7\xe5\x3a\x16\x5e\x75\xa8\x52\x3f\x06\xba\x9e\x14\x6d\x51\x75\x79\x0a\x83\x1d\xb1\x1c\xe0\xde\x12\x6a\x16\x03\x18\x8f\x3f\xd0\x00\x4b\xf2\xfd\x30\xae\x1e\x94\xf9\x8e\xba\x7d\x1e\x83\x69\x0c\x9c\xbd\x1f\x57\x8d\x60\x66\x0f\xa1\x61\x0c\xf8\x76\x8d\x5d\x9a\x09\x40\x6a\x42\x98\x9b\xcc\xfd\xd3\x1a\x9b\xde\x76\xc1\x11\xba\x13\xbd\xe3\xfd\x32\x60\x72\x2b\xc8\xa7\xb6\xfa\x74\x52\x9a\xd4\x56\x27\xab\x9e\x2d\xcc\xad\xf6\x18\xa8\xa1\x85\x9e\x95\xdb\x48\x1b\xd3\x31\x52\x3f\x0e\x92\xee\xd0\xc7\x60\x37\x90\x1a\x84\xf1\x81\x87\xeb\x10\xb0\x6f\x38\xb2\xdb\xdb\x72\xa3\x5b\x48\x93\x4e\x18\x09\xf7\xf3\xce\x4e\xba\xdd\x7a\xc7\xfb\x05\x07\x99\x92\xe1\xa2\x56\x61\xf2\x04\xec\x88\x2d\x0a\xdb\xb7\x3b\xbc\xfc\xb0\x69\x43\x90\x0b\x0a\xda\xaf\x82\x36\x9e\x60\x0c\x47\x24\x36\x44\x54\x1e\x23\xad\x35\x91\x85\xb5\x48\x27\xc0\x1b\x4d\xf6\x3b\x0e\xbb\xb8\xed\xf7\xd0\x42\x19\x8a\xcc\x7d\x9f\xb3\x45\xc6\xad\x06\x4b\x33\xde\xf0\x5e\x04\xad\x34\x0b\x01\x01\x19\x04\xd3\x41\x9a\xf4\x50\xe5\x56\x5b\x77\x01\xf3\x6d\x1b\x91\x4d\xc3\x2f\x51\x6f\x59\x05\xae\x02\xe1\x84\xd6\xc2\x86\x66\x61\x93\xbd\xac\xc6\x0e\xca\x73\x2c\xe0\x54\xb9\xff\xe2\x78\xff\xc3\xd1\x3f\x79\x20\xe2\x44\x81\x9d\xaa\xe3\x8c\xbc\x8b\xb8\x03\x6a\x44\x0c\x0a\x0e\x5d\x49\xd3\x72\x1c\x66\xaa\xce\x0b\xba\x64\x0c\x37\xec\x67\x54\xf8\xf0\xf2\xd0\xf1\xb2\x1d\x08\x0f\xf6\x03\xd8\xfd\x7b\x7e\xbe\x46\x6c\x1c\x7e\xb6\x2e\x02\xbc\xa0\x31\xce\x21\x94\x01\x4b\xd4\x9f\x5a\x96\xf5\x36\x55\x4d\x5a\xbf\xa4\xa0\x5a\x06\xb8\x57\xd5\x18\x03\xb1\x0f\x40\x2f\xee\x8b\x35\xbf\xcb\xff\x80\xb1\xba\x65\x7e\x4e\xbe\x2c\x25\x2f\xfa\xa0\xf3\x74\x80\x5e\xe8\x82\x66\x83\x9a\x41\xa6\x81\x26\x3f\x23\x9b\x58\x6a\x14\x21\x1e\x88\xfc\xe1\x2d\x4c\x55\x0c\xdc\xaf\xd6\xd8\x41\xe8\x95\x33\x99\x48\xdd\x5f\xd4\x9d\xf2\x72\x90\x8e\x67\xee\x47\xa7\x98\x53\x58\x6e\x90\x76\xed\x70\x17\xd4\x69\x91\x43\x60\x70\xff\x0a\xba\xec\xb7\x6b\xec\xd2\xcd\x30\x0e\x92\xcd\x4c\xed\x3f\xef\xa9\xed\x20\x99\xef\x76\x7c\xa7\xf4\x31\xb5\x1d\xe1\x2c\xa4\x67\x0a\x25\x9c\x30\xe7\x32\x4b\xcf\x8a\x22\x6b\x3d\x56\xed\x49\x4a\xca\xe9\xa0\x8a\xe1\xee\xd0\xfb\x3f\x78\xfd\x1e\xf4\xfd\xe4\x0f\x6a\xec\x7b\xe1\xa4\xb5\x90\x86\x1b\x61\x24\x56\xc5\x71\x79\xda\x42\xf6\xa5\x0f\xd4\xbc\xff\x54\x9b\x1d\x71\x97\x13\x04\x76\xa6\x99\x79\x7c\x35\xfd\xe0\x84\xba\xea\x87\x31\xef\x26\xb0\x4b\xd0\xcb\xa0\xd5\xc5\x3c\xcc\x33\xde\xf3\xe1\x84\xae\xe7\x2b\x88\x17\xa9\x5b\x68\x94\x97\xa2\x7c\x4a\xf7\x8b\x93\x3b\x62\xb1\x79\x87\x2c\x2d\x43\x31\xa3\xba\x0e\xe4\x72\x3c\x6a\x29\x8c\x6c\x00\xb9\x8b\xb8\x1f\x6d\xfa\x83\xac\xb0\xc0\x18\xda\x5c\x76\x94\xcf\x4c\x29\x45\x50\x97\x11\xf0\x23\x53\x90\x20\x76\x6c\x76\xe1\x8e\xa5\x67\x2e\xdd\x31\x3b\x77\x72\xfe\x94\xa5\x1e\xbd\xcd\x61\x4c\xb7\x3b\x70\x5f\xe3\x78\x2f\x75\x16\xfb\xb1\x6d\xb7\x28\x1e\xe0\x5d\xc0\x55\x59\x20\x73\x67\x56\xba\x6b\x70\x50\xc8\x6d\x57\x3e\x12\xe7\x21\xe4\xc7\x49\x89\xbc\xe1\x47\x84\xae\x04\x0a\x31\x75\x05\x72\x53\x6c\xe3\x10\xbd\x93\xfd\x1b\x05\xd7\x28\xb5\xf0\x02\x00\xc7\xbd\xdd\x9b\xbf\x5d\x53\x2e\x99\xda\x00\xb4\xdc\x37\x12\xed\xe0\xa3\x05\xca\x4d\x11\x07\x1c\x66\x55\x9f\x7c\xe7\x18\xbb\x72\xab\x2c\x08\x0a\x4c\x84\x5c\x00\x4a\xda\xe8\x8a\x38\x77\xff\xbe\xe6\xfd\xe8\x6c\x11\x9c\x9e\x15\x99\x2d\xfa\x19\x8a\x8e\x52\x77\x4c\x3c\x74\xca\x7f\x80\xd8\xc7\x6d\xec\x2b\x5d\x7f\x40\x59\x83\x9a\x57\xb1\x2f\x6f\x36\xcf\x39\x63\xeb\x62\x70\xce\xd9\x8f\xc7\x1e\xeb\x48\xf3\x59\x87\x3d\x85\xc9\xdb\xee\x93\xbc\x27\x2e\xaf\x51\x94\x25\xc4\x1f\xeb\xa3\x4c\x91\x96\x40\x50\x42\x79\x62\x6d\x8e\xaf\x70\x18\x15\xed\xbe\xc8\xf1\x56\x67\x63\xca\x8c\x4d\x3a\x56\xc4\x57\xd6\xe4\xf2\xc0\x8e\xeb\xbd\x6b\x03\x43\xe3\x57\x73\x12\xdd\x48\xb8\x48\x14\x8b\x1a\xea\xe9\x36\x3a\xb4\x65\xfc\xf4\x62\x29\xd2\xa0\xe4\xb8\x79\xdb\x38\xbb\x71\x47\x81\x52\x18\x4c\x46\x5c\x3f\x37\x0d\x8e\x81\x27\xfc\xd8\xfc\xdc\xa2\xfb\xb5\x31\xef\xa7\x9c\x91\xb7\x21\x28\x37\x33\x43\xcc\x86\xb2\x34\xc8\xcd\x46\xdc\x40\xba\x33\x07\xca\x24\xd1\xcf\x00\xa5\xad\x27\x30\x5d\x43\xc9\x81\xe2\x13\xc5\x1b\xd0\x4d\xcd\x73\x0e\x2b\xee\x9e\x73\x2e\xc9\xcc\xca\x59\x63\xfa\xf6\x1a\xbb\xdb\x61\xc6\xd3\x6e\xea\x09\x39\xb6\x50\x2e\xd8\xaf\x50\xcb\x52\x28\x91\x52\xee\xe9\xb1\x08\x53\x3e\xbf\x80\xc9\x2b\xab\x72\x6a\x29\x7a\xbc\x1d\x34\xc8\x9a\x15\xbf\xe0\x30\xbb\x8e\xee\x2b\x1c\xef\x6e\x47\x11\x2b\x29\x3f\x31\x3e\x52\xe7\x59\x3f\x84\x70\x15\xca\x7f\x56\xdd\x6a\x2e\x05\x30\xd4\xb4\x92\x0d\x6c\x88\x4d\xe5\x83\x9c\x36\xe8\xd2\x57\x7f\x1d\xed\x25\x69\x5e\x07\xe6\x24\xd9\x26\xf8\x69\x55\xf1\xb5\x17\xb3\xc7\x99\xe6\xc3\x5e\x0f\xbc\xe4\x73\xbe\xe8\x26\xf1\x92\xc8\xdd\x7f\xbc\xc8\xbb\x56\xff\x2a\xc3\xcd\xd9\x76\x0d\x40\x9d\x0b\xe0\x59\x29\xd8\x6d\xc3\xc1\x7f\x67\x7b\x31\x91\x7b\xf4\x2e\x36\x0a\xd6\xe7\x14\xbd\xcb\x27\x9c\x2d\x2c\x8c\x43\x73\x12\x48\x5e\x7e\xce\x59\x1e\xc9\xe9\x02\xac\x27\x7a\x1a\x3e\xd8\xdc\x2e\xbf\x52\x70\xbb\xbc\xa5\xb6\x85\x21\x73\xb8\x5d\x88\xaf\x8b\x9a\x6c\x15\x94\x6e\xa9\x5d\x36\xbd\x4b\x4b\x58\x54\x94\xc0\x71\x0c\xa6\x14\xa9\x11\xc3\xfb\xf2\x4c\xfb\x30\xa4\x7c\xd9\x0b\x6d\xdf\x65\x68\xfb\x7d\xce\xd2\xf6\xd1\xc5\x87\xdd\xe6\x08\xce\x1c\x39\x0f\x75\x2c\xb1\x9e\x8c\x8c\x7d\x77\xc2\x82\x7c\x6c\xc1\x16\xac\xc9\x62\xd2\x24\x7e\x5a\xd2\x82\xec\x86\x3f\x98\xf0\xa6\x8c\xdf\x95\x54\x6c\x69\x12\xf3\xe7\x25\xad\x11\xf9\x0d\xef\xdb\xc3\xf7\xdb\x9b\xd2\x25\x04\x02\xca\xd6\xb8\xc3\xfb\x81\x4a\x2c\x30\x9a\x70\x76\xba\xc6\x11\x76\x78\x8b\x8d\xa4\x72\x06\xef\x69\x25\xbb\x01\xf7\x7b\xf6\xf6\x82\xe7\x49\xee\x35\x1a\x47\x01\x46\x40\xcb\x1a\x43\x66\x54\xc1\x66\xb1\xdf\xd8\x5f\x89\x8f\x7c\x4b\x98\x2f\x8a\x5e\x62\x61\x50\xbd\x72\xbf\xf7\x8f\x35\x8b\x56\xa3\x84\x3c\xd5\xd3\xdb\x9e\x8e\xf5\x03\x2f\x82\x7c\x18\xf4\xd6\xd5\x10\x86\x2e\xc9\xc2\x3c\x49\x07\x4d\x7e\x0b\xfd\xd6\xec\x17\x41\x02\xae\xa5\xad\x48\x30\x2a\xde\x52\x8f\x57\x50\x63\x30\x36\x77\x7c\x61\xf1\xf8\xb1\xd9\xe5\xe3\x73\x47\x39\xb5\xaa\x1c\x75\xbd\x6c\x02\x4f\x19\x0e\x42\x95\x0f\xaa\xaa\x5d\x27\xb3\xb3\x1f\xf3\xe3\xdd\x5e\x3e\x98\x0b\x53\xcc\x54\x85\x58\xb2\x30\x2f\x70\x10\x10\x9a\x26\x4a\x94\xfc\x81\xea\x62\x38\xc3\x6a\x98\x13\x23\x39\xd9\xb0\xd7\x44\xa9\x34\xb2\x84\x1d\x32\x5d\x0c\xe7\x1c\x56\x74\x9c\x25\xd6\xbf\x53\x63\x3f\x59\x63\x07\x35\xc0\xac\xfb\x7f\x1c\xef\xef\x1c\x64\xb2\x35\x60\x67\xe5\x41\x85\x60\x77\x65\x0f\x53\xc9\xf2\xc4\x82\x7e\x3a\x68\xea\xa1\x66\xf3\x10\x1a\x2e\x0f\x35\x0f\x41\x82\x62\x1f\x2d\x7a\x64\x42\xc3\xe1\x2e\x0a\x35\x01\xb6\xca\x63\xcb\x4f\xe7\x6b\x22\xdd\x0c\x33\xe4\x0b\x2f\x99\xfe\xa8\x28\x28\x40\xd5\x65\xb8\x14\x1d\xc7\xde\x6f\x99\x1f\xa5\xb9\x85\x26\x0b\x68\x98\x29\xd5\xa6\x98\xd1\x55\xee\x63\xbd\x4b\x17\x8b\xf2\xce\x2c\x9e\x30\x1f\x7d\x2a\x9b\x48\x05\x8e\xbb\x7b\x95\x77\xe8\x58\xd2\xed\x22\xb6\xd1\x5a\x01\xd5\xad\x0d\x86\xea\x49\xeb\x63\x7f\x73\x89\x15\xbb\x59\xc5\x7d\x77\x73\x94\x6c\x2e\x61\x88\xf5\x87\x2e\xf1\xfe\xc2\x29\x7e\x5b\x5b\x54\xb1\x31\xf9\xb8\x92\xe5\x9f\xb2\xbc\x0c\x83\xa5\x08\x48\x1b\x2e\x01\x5e\x95\x1f\x00\xcf\x20\xbc\x40\xae\x97\x30\x6e\x25\xfd\x38\xb0\x93\x06\x30\xaf\x26\xec\x86\x91\x9f\x16\x84\x62\xe8\xc4\x08\xb3\x22\x0e\x97\x10\xe3\x7a\x7e\x98\x16\x26\x95\xec\x28\x1a\x17\x0d\xc8\x33\xa3\xfe\xb2\x08\x9f\x7b\x50\xa5\x00\xb3\x80\xfa\x61\xb6\x26\x52\xcf\x3e\x97\xfe\xff\x19\xfb\x73\x53\xf5\xf8\xe2\xae\xcf\x56\x3f\xeb\xac\xa8\xd2\x34\x8e\x5a\xf6\x30\x38\x6d\xfd\x8b\x3a\x6d\x7d\x6b\x0b\xed\x6a\x9b\x69\x02\x47\xaf\x5f\x73\x56\x64\x39\x45\xe3\x76\xca\xb6\xe9\x1b\x03\xf4\xa0\x9f\x32\xfe\xc6\xd1\xc7\xb2\x3f\xd9\x62\x8c\xb7\xeb\x00\x3c\xa3\xbd\xc9\x59\xc1\xb2\x74\x27\x0c\x9f\xd7\x1e\xd2\xd6\xee\x29\xa0\x7b\xf0\x61\x0f\x9d\x5a\x78\xe7\xf6\x6a\xe1\x29\xf7\x84\x56\x0b\xcd\x25\x57\xa4\x25\x94\xb2\x5c\x8b\xc5\x54\xa9\x2c\xfe\xe1\x41\xcb\x37\xb1\x83\x60\x6f\x94\x05\xbf\x70\xd0\xfb\x4a\xad\xea\x4e\x89\xcf\x54\xad\x6f\x1c\x78\x58\xde\xe5\x90\xd9\x8a\x08\xd8\x3a\xf7\xb3\x6d\x63\x67\xeb\x17\x28\x0a\xfc\x61\x1a\x12\xab\x93\x7e\x1f\x45\x6d\x99\xc5\x78\x7f\x70\x66\x58\x7b\xf1\xab\xf7\xb3\x9b\x28\x65\xed\xa8\xd7\x30\x13\xd6\x2a\x19\x3b\xc3\x98\x43\x5f\x96\x15\x9f\x2f\xd6\xd8\xbf\xb5\x3f\x75\x26\x0f\x23\x02\x6e\x73\xef\xa9\x29\xe0\xa7\xb7\xd4\x46\x3e\x55\x96\xea\x7a\xd4\xc1\x00\x8f\x8f\x0f\xd5\x87\xa6\x81\xdf\x4e\x93\x0c\x11\xec\x52\x11\x89\x0d\x3f\x06\xd0\x90\xac\x5e\xc8\x00\x05\x05\xd9\x13\x69\x5b\xca\x57\xb3\x30\x68\x92\x12\x7e\x43\xdf\x30\x70\x4a\x33\x8c\x97\x07\x3d\x55\xe5\x2c\xea\x28\xc1\x0e\x5f\xc1\xb9\x62\x76\xf6\x0a\xe4\x22\x91\x97\x1a\x8f\x40\x26\x5e\x96\x0a\xc6\x37\xb7\x73\xdb\x75\xff\xad\x1a\xab\x1a\x44\xf7\x4b\xb5\xdd\xe1\xc6\xbd\xbe\x56\x51\xea\x03\x33\x06\xe8\x01\xf5\x37\xa9\xb8\xc9\x30\xce\x72\xe1\x43\x00\xfa\xd6\x43\x32\x55\xd7\x9a\x2a\xed\x68\x34\xcd\xad\x1c\x06\x08\x05\x6a\xea\x71\x21\x07\x75\x8b\x02\x2f\x53\xb1\xea\xa7\x41\xa4\x9d\x3f\x3b\x1a\x81\xed\x93\xb0\x8e\xfc\x2b\x48\xc2\xda\x4d\x08\xfb\x91\xbd\x10\xf6\xfb\x1b\xc2\x7e\xff\x73\xdf\x8e\xfc\xeb\xcf\x7d\x3b\xb2\x97\xfb\xb6\x45\xdf\xec\xe5\xbe\xed\xe5\xbe\xfd\x5f\x91\xfb\x76\x64\x2f\xf7\xed\x61\x31\xe7\x1f\x98\xdc\xb7\xaf\x1d\x64\xbc\xc2\x0b\xa0\x89\x2d\xc0\x05\xf9\xa1\x83\xde\x13\xac\x2b\x36\x24\x80\xbe\x35\xc2\xff\xf8\xf6\x89\x3d\x83\xc9\x6e\x0d\x26\x9f\x77\x94\xcb\xee\x13\x8e\xf7\x72\xa7\x12\x62\xad\x60\x23\x21\x66\x2e\x25\x7e\x10\xec\xa0\xa2\xda\x15\x58\x40\x1a\xf3\x27\xd9\x90\xba\x91\xd8\x9c\x26\x5c\xac\x86\x54\xea\x1a\x54\xf2\xb4\x86\xeb\xcf\xa6\x4d\x17\x61\x93\xd5\xd9\x15\xdb\xc6\x1a\xeb\x8a\xee\xd9\x81\x76\x11\xb4\xf4\x69\xd3\xb0\xfe\xb1\x5d\xfa\xf4\x5f\xe8\x3c\x44\x4e\x7d\xa3\x71\xf7\x39\x67\xb6\xb7\x6c\x1d\x71\x0f\x57\x51\xe4\x5a\xe2\xa9\x0c\x15\xff\xb7\xcf\xae\xcc\x34\x25\xbe\x15\xf7\xde\x67\x7b\x1e\xfd\x5d\x09\xc3\x02\xb8\xb0\x10\x1e\xa9\xc3\x8d\x2d\xf9\xf6\x8a\x67\xb3\x0f\xd6\xd8\x45\x6b\x49\x96\xcf\x46\xa1\x9f\x89\xcc\xfd\xa5\x9a\xf7\x7a\xe7\xd6\xe2\x02\xc9\x6d\x8d\x84\xae\x96\xac\x7c\x07\x37\xbb\xf9\x85\xcc\x4e\x5d\x0c\xe3\xe7\x41\x94\x6a\xe1\x1a\xec\x81\x6b\x10\x5f\xe9\x84\x91\xb0\xbc\x6b\xc5\xfe\x00\x47\xcc\x82\xea\x25\x4e\xe2\x86\x7c\xe7\x14\x22\xdc\xa1\x6d\xe3\xfc\xd7\xac\x6e\xcc\x7d\xce\xe3\xd9\xe3\xac\x51\xea\x49\x9d\xa7\xd1\x15\xe9\xaa\x68\xac\x8b\x81\xbb\xcf\x1d\x0b\x7b\xec\x3e\xe7\x10\x7b\x6c\xc5\x73\x59\x9e\xfa\xb9\x58\x1d\xb8\x13\xee\x7e\x78\x87\xb1\x4f\xd7\xd8\x84\x22\x82\x73\x3f\xa6\x2d\x48\xef\x86\x2c\x0f\xcd\x10\x87\x6a\x39\xbf\xcd\x4f\xc3\xa4\x9f\x51\x64\x95\x79\x2e\xec\x67\x24\x0c\x50\xf7\x52\xf0\xe8\xb9\x59\x08\x69\x03\xc0\xe9\x03\xb9\x9b\x8a\x63\x8a\xcf\x06\xdd\x30\x83\xdd\xe8\x18\x1a\x4b\x23\x08\x74\x57\x5b\x2a\x00\x44\xf7\x52\x64\xcb\x83\xd4\x11\x12\x25\x8a\x77\xbf\xf8\x32\xe6\x20\xf9\xba\xbc\x76\x51\x9e\x72\x94\x67\x66\x45\xa1\x18\x8b\xeb\xea\x94\xaf\xd8\x8f\x08\xc7\x57\xe7\x31\xa0\x13\xd5\xb8\xaa\x5a\x66\x9b\x92\x7e\xd6\x61\x8f\x93\xaa\x1c\x78\x9a\x97\xf0\x90\x3b\xdb\x06\xc4\x77\xc0\x05\x72\xfb\xde\xea\xec\x16\xf7\x0d\xf3\x6c\x91\xc5\xa0\xa8\x72\x7d\x7c\x90\x00\x78\x0a\xad\x1a\x3e\xe8\xe7\xc4\xf0\xdb\x45\x78\x79\x3b\xc6\xfd\x25\x8e\xc1\x62\x7c\x97\xd7\xb5\x19\x0d\xd4\x1d\xcd\xb1\x94\x04\x08\xd1\x93\x97\xbd\xc8\xc5\x52\x80\xe7\xcd\x84\x07\xd0\x39\x71\x72\x34\x14\x0e\x1f\x4e\x1d\x53\x78\xbe\xb8\xc6\x1e\xd9\x4b\x85\xe8\xc2\x8a\x44\xf2\x0a\xf7\xef\x1c\xef\x4f\x9d\x85\xd2\x55\xb5\xcb\xd2\x2f\xb9\xa4\xd4\x8b\x0a\x26\x1e\xcc\x1d\x51\xb2\x09\xd9\x15\x34\x1c\x10\x8a\x2e\x37\x65\x01\xd1\xc7\x54\xea\x09\xf9\xd0\x82\x7e\xc6\x4c\x42\xa8\x7a\xc2\x48\xd7\xb2\xd9\x7c\xa4\x62\xde\xa0\x04\xc2\x55\x33\xde\xf0\x54\x12\x2f\xe8\xda\xe9\x62\xcc\xf3\x83\x8d\xfb\xe4\xb0\x47\x64\xa5\x94\xeb\x3f\x76\xb6\x00\x65\x35\x65\xa7\xfd\x9e\xf7\x8e\x11\x79\xda\xbd\x24\xc0\xaa\x16\x19\xdb\x25\x67\xb4\xdc\x44\x12\x33\x07\x44\xe5\x15\x35\xf9\x69\x92\x98\x47\xad\xbe\x92\xed\x1b\x34\x39\xe0\x1a\xc2\xc9\xc9\x94\xd8\x88\x46\x68\x20\xae\x83\x39\x10\xce\x03\xb8\x3c\xa5\x32\x35\x11\x27\x81\x00\x1a\x8b\xff\xe6\x78\xf7\x38\xa7\xe8\x17\xca\x7f\x23\x87\xde\x80\xdd\x86\x38\x17\x85\x2f\x5f\xe4\x40\x11\xf3\x6f\x87\x00\xe4\xa5\xb8\x85\xea\xd5\xb5\x73\x1f\x61\x91\xb3\xb0\xdb\x8b\x06\xfa\x42\x56\x2a\x11\xc9\xb5\x92\x40\xea\xa0\x59\xd6\xef\xa2\x48\xc1\xcc\xeb\x0e\xaa\x24\xfa\x6c\xa5\xf3\x3a\x6c\x44\xba\x37\xd4\xd8\xc5\xb2\x04\xcd\x3e\xf1\x93\x35\xef\x6f\xa1\x69\x26\x75\x84\x91\x07\x82\x41\xfa\x0a\x9a\x13\x72\x7e\x4a\x4c\x5d\x1d\x80\xf5\x87\xac\x72\xd9\xca\xa5\x8a\x37\x31\xae\x1f\x9f\x38\x44\x44\x13\x59\xb9\x9c\x12\x42\x7f\xd1\xda\xf3\x56\x4b\xad\xa0\xf8\x69\x40\x10\x8f\xe5\xf9\xa9\x21\x4b\x9b\x7e\x57\x29\x53\xc3\xd8\xa7\xd9\xab\xc7\xd8\x65\xbd\xb2\x94\x75\xbf\x5b\xf3\xfe\xbe\x36\x6f\x85\xa9\xd8\xae\x29\x14\x35\xc5\xba\xf6\x48\xb6\xc8\xef\x35\xda\x69\x08\xf2\xce\x83\x79\xac\x6e\x91\x81\xd0\xbc\x9b\x0a\x9e\x6f\x26\xfa\xa0\xb8\x2e\x06\x00\xb0\x4d\x1d\xa9\xbe\x58\x08\xf7\x2c\x57\x9f\x0c\x85\x81\x53\x0e\x99\xf0\x29\x99\xaf\x2a\x1e\x1e\x34\xf9\x6c\x3c\x20\x8b\x32\x88\x46\x35\xba\x4a\x14\xb6\x06\xc8\xdc\x85\x27\x67\x6b\xd7\x51\x4a\xb4\x4d\xf6\xd6\x1c\x2d\x82\x8b\x6d\xb5\x60\xd1\xc3\x75\x97\xa4\xfc\x2e\x91\x26\x94\xa2\x96\x12\x03\x9d\xba\x6d\xcd\xda\x6f\xd7\xd8\xf7\x64\x6b\x7e\x2a\x28\xc9\x4b\x6b\x72\xee\x1f\xd5\xbc\x4f\xd6\x96\xe4\xad\xe2\x8c\xaf\x32\xe9\xf4\xf9\x43\xf3\x78\xf8\x51\x34\x94\xf7\x99\x21\x28\x7c\xb1\xdb\xe7\xa4\x23\xc9\x8d\xc2\x78\x4a\xdb\x0b\xe9\x68\x2e\xcf\x3d\x30\xa2\x72\x76\xc9\x33\xba\xce\x3f\x83\xbd\x1a\xbb\xd7\xfe\x4a\xae\x50\xe4\x81\x36\x4e\x31\x84\x74\xc2\x34\xd3\xd9\x7c\xda\x2c\x61\xc6\x99\x45\x91\x22\x4c\xc3\xb9\x2c\x02\xbe\x30\x3f\xc7\x67\x9a\x5c\x6a\x5c\xf2\x4f\x59\xd6\x52\x55\x07\xc9\x43\x3f\xbc\x9b\xe4\x6b\xb4\xfb\x55\x08\xcc\x11\x09\x6e\xff\x67\x9c\x7d\x3f\xa6\x13\xc1\x4a\xba\x25\xf5\xdb\x62\x41\xa4\x21\xc8\xf5\x24\x0e\x32\xf7\x4b\xe3\x2a\xdd\xf6\xe3\xe3\xaa\x54\x1e\xa8\x74\x94\x30\xe6\x68\x7a\xd5\xab\x84\xc7\x42\x04\x78\xbe\xa6\x72\x05\x5f\x95\xc5\x76\xfa\x11\xc4\xbd\x63\x18\x7d\x20\xe4\xfc\xcb\xd0\xde\x83\xac\x8b\x1a\xcf\x10\x53\xb0\xf4\x9c\x95\xb2\x34\x16\xab\x7e\x1e\x6e\x08\x4e\xaa\x4d\xb3\xb0\xf3\xd2\x14\xd3\xab\x35\xcb\x93\x1e\x0f\xbb\x5d\x11\x84\x7e\x2e\xa4\x12\x1c\xfa\x50\xb9\x75\xd9\xcb\x34\x94\x93\x71\xc2\x13\x88\x1a\x84\x63\x0b\xc8\xf8\xb5\x7e\xce\x83\x64\x33\x9e\x42\xb8\x0c\xc0\x81\x54\x3e\xb2\x38\xa4\x1c\x7d\x35\xb5\xa1\x49\xbc\x07\x5d\x65\x25\xa9\x72\x72\x76\x61\x0d\xad\xc7\x48\x85\xa8\xea\x3c\x24\xd6\x43\x4d\x4e\x4d\x32\xe5\x73\xa0\x69\x25\xfb\x16\xd1\x45\xe2\x9c\xfb\xdc\x18\x35\xd5\x28\x35\xdd\x10\xde\x41\x59\x0d\x8b\x02\xe5\xdb\x9d\x24\x6d\x87\xad\x68\xc0\xd7\xfc\xa8\xf0\xd1\x98\x7d\x23\xe5\x7b\x6e\x36\x3f\x4a\xe2\x55\x8c\x69\xa4\x0c\xeb\xb3\x3d\x3c\x92\xb4\xe5\x14\xea\xf7\xf0\x7b\x52\xd4\x0f\x92\xfe\x88\x24\xeb\x2b\x0f\xab\xa6\xda\x1a\xea\xef\x38\xec\x60\x10\x67\xc7\x40\x9c\xbb\x1f\xd8\x09\x86\xc1\x42\x12\xcc\x9d\x5a\xc2\x37\xbc\x97\x38\xb6\xee\x38\x77\x6a\x89\xf7\xfc\xd4\xef\x8a\x5c\xae\x48\x7d\x6c\xe3\x0b\xc5\xc5\xc2\xd4\x08\x32\x49\x33\x1f\xca\x53\x88\x76\x02\xac\x8a\x58\xa4\xa0\x52\xc9\x22\xed\x1c\x2c\xed\xa5\x9a\x3b\xb5\x84\xfa\x60\x93\x7d\xd4\xc1\xa3\x1f\x9d\xaf\xdc\x5f\x75\xbc\x37\xc3\xd1\xcf\xc0\x14\x37\x1c\xcf\x9a\x66\x0d\x2a\x77\x26\x13\x5a\xf3\x3d\x94\xa9\x37\x0a\xe9\x56\x4c\x48\x3c\x3a\x92\xec\x52\x12\x38\xcd\x4b\x87\x46\x98\x87\x6a\xf9\x18\x67\xc3\xad\x65\xc1\xab\x00\x3c\xc3\x3c\x04\xb8\x77\x3b\x5e\x36\xa7\x23\x65\xed\x13\x82\x3a\x24\xcb\xbb\xe8\xef\xf3\xe5\xc1\x10\x9a\x66\x3f\x89\xe7\x98\xa2\x9c\xa3\xd0\xe0\x6c\xe8\x19\xbd\x74\x2c\x74\xcc\x31\x76\x59\x26\xf2\x5b\x49\xc9\x9f\xcd\x6e\x7e\xc6\xdc\x29\xf7\xeb\x63\xde\x17\xc6\x08\xd4\x66\xab\xa3\x80\x1a\x38\x0c\x06\x28\x1e\x94\x85\xd4\x79\xea\x53\x02\x2f\xcd\xec\x48\xf8\x1d\xdc\x2f\x27\x8d\xb5\x8e\x7c\x18\x05\x2a\x0a\x4a\xfb\x3a\x0e\x48\x57\xf8\x71\x66\x9c\xfe\x04\x14\xad\xd6\xac\xae\x0f\xaa\xec\xb4\x31\xad\x4b\xb5\x26\xc2\x6f\x48\xfd\xc1\x7e\x02\xd9\x3c\x79\x3f\xcf\xe4\x75\xfc\xb8\x4a\xb9\xdf\xc1\xe7\x53\xb1\x1a\x66\x79\x3a\x28\x5c\xf9\x45\x25\x48\x1b\xd3\x8f\xac\x8b\x01\xbf\xf5\xe9\xc7\x9f\x79\xc7\x89\xd3\xc7\x66\x4f\xdc\x71\x72\xf6\xd8\xad\xf3\xa7\x8e\x3f\x67\xe9\x99\x4b\xcb\xc7\x4f\x3e\xe7\x18\xda\xca\xe9\x1c\xbc\x24\xf2\xe7\xd0\xb0\x66\xcf\x59\x6e\xf7\xc2\xde\x73\x8c\x35\x95\x27\xd0\x6e\x98\xa8\x48\xa0\xa3\x71\x82\xc0\x34\x8e\xfd\x0d\x55\x5e\xf3\x41\x09\x10\x9d\x0e\x98\x6c\xb7\x9e\x93\xbf\x51\x63\x86\xbd\xc5\xfd\xe5\x9a\xf7\x7a\xe7\x04\x59\x4d\x8c\x9d\xb7\x25\xa4\x90\x22\xf7\x8b\x3e\xd9\x1f\x2b\x1e\xa0\x3d\x92\xcc\xff\x18\xc7\xe1\x03\x49\x30\xa4\x48\x13\x41\xac\x0d\x52\x6f\x41\xc8\x5a\x5e\x05\x5f\x9e\x49\xab\x2c\x82\xe7\x6f\x50\xd1\x75\xbc\xcf\x39\xb4\x8d\x41\xe5\x80\xbb\x4f\x0e\xe3\xf9\x98\x54\xfe\x9f\x71\xf6\x28\x4d\x14\x5d\x74\x87\xfb\x8d\x71\xef\x53\x63\xaa\x1f\x0b\x26\x69\xa3\x47\xd3\x7e\xac\x51\x72\xa1\x33\x8f\x57\x3d\x45\x39\x71\xf4\xb0\x6f\xd0\x05\x93\xc6\x4f\xb0\x4d\x60\x29\x69\x40\x3f\xa0\xa4\x40\x27\x2e\x57\x3e\xa0\x40\xb4\xfa\xab\x72\xfc\xe8\x84\x0b\x86\xb1\xb6\xee\xde\x42\x62\xc3\xae\x66\x68\xae\x5a\xcd\x0a\xcd\xe7\xbb\x49\xa0\x23\x9a\x61\x68\x4c\xe6\x60\x59\x18\x32\xdc\xa4\x01\x92\x2a\xf9\x41\x60\x33\x6a\x17\x83\x8d\xc1\xfd\x66\xab\xea\x64\x60\x52\x92\x44\xbf\x65\x74\x8b\xc1\x0c\x50\x3e\xb2\x83\xcf\x86\x0e\xc2\x14\x81\x0d\x96\xba\xb5\x24\x4e\x52\xac\x71\x46\x16\x6b\x10\xe9\x68\x77\xc2\x2c\x81\xe1\x81\x54\x47\xfa\xf3\xe0\x53\x19\xe2\x19\x7f\x60\x67\xe0\x17\xc7\xd9\x23\x01\x4f\x65\xa1\x1f\x45\x4b\x52\xe9\xcb\x33\xf7\x63\xe3\xde\xdb\xc6\xe6\x4b\x57\x47\x19\x47\x35\x2d\x01\x12\x4a\xa8\x87\x0d\x5d\x3b\x36\xf9\xd7\x15\x20\x50\xaf\x1f\x45\xc8\x2c\xad\xcd\x7d\x50\x8f\xcc\x60\x77\x0e\x33\xae\xd8\xb6\xf9\x7c\x39\x47\x01\xb6\x28\xfc\x98\x06\x21\xf3\x33\x22\x86\x93\xea\xe6\x46\x18\xf4\xe5\xa9\xa0\x8f\x36\xc2\x6e\x2f\x82\xd3\xb8\x4f\xa0\x26\x28\x6c\xbb\x54\xa7\x61\x96\x2a\x38\xa2\xf8\x08\x4c\x1f\x24\xed\x75\x91\xd6\x71\x2a\xcc\xc1\x0f\x54\x70\xd0\xae\xa1\xea\x21\x15\x38\x9a\x28\xf7\xe7\xc4\x4c\x93\x66\x1a\xfb\xe1\x72\x22\xb3\x08\xe3\xd5\x06\x5c\x91\x0d\xa1\x2f\x35\x92\xb8\xe1\xcb\xf3\xb4\x39\xaf\xae\x63\xd7\xb2\xab\xb7\x9d\x57\x27\x92\xb6\x1f\xa1\xc3\x7c\x51\x8d\xdc\x03\x32\xb3\xfe\xd4\x61\x97\xa4\x02\xb2\x57\xc8\x70\xf7\x69\xc7\xfb\x4d\x67\x11\x2f\xf1\x5e\x61\xa8\xb3\xb1\x68\x40\xe5\x2d\x74\x6a\x6d\xa2\x9b\x85\x30\xb2\x3a\x3f\x1d\xdf\xec\x87\x51\x3f\x15\x75\xb4\xda\x59\x5b\x14\x3e\x74\xde\x9d\x2f\xd5\xb9\x28\xf1\x83\x6c\xba\x97\xe0\x7f\x1a\x51\xd8\x11\xed\x41\x3b\x12\xd3\x97\x53\x2b\x1a\x58\xe5\x12\x4b\x8f\x3b\xac\x27\xb9\xf7\x38\xde\x2f\x39\xc3\x3a\x56\x55\x20\x67\x49\x67\xa3\x05\xa2\xf1\x92\x94\x74\xdf\x59\x7b\x72\x3f\x5b\x2f\x6c\x2f\x02\x0c\x2e\xba\x63\x8d\xeb\x54\xe5\x06\x99\x88\xa7\xcd\x26\xfd\x8b\xc3\xbe\x47\x8a\xff\x0d\x31\x27\xfc\x20\x0a\x63\xa1\x4e\x9a\x5f\x73\xd4\x49\xf3\x53\xce\x8e\x4e\x9a\xb4\xfb\x60\x69\x0a\xda\x02\x28\xe5\x80\x01\x5e\x5e\xcc\x13\xa4\x8e\x5f\x96\x47\x14\x8a\xfa\x29\x12\xb2\x29\x7e\x10\xde\x8f\x06\x8a\x98\xb0\xeb\xa7\xeb\x60\x6f\xf3\xc3\x88\xa8\x24\xe0\x78\x64\x44\xb6\x99\xc8\x46\xf6\x61\x55\x6e\x49\x59\x68\x1d\x55\xad\x03\xcf\x2a\x9b\xf0\x3b\xb0\x80\x06\xee\xb3\xd9\xd4\xb6\xcb\x69\x96\x1e\xf6\x9a\x43\x02\x8a\x36\x20\x83\x7d\xb3\x60\xea\xcb\xd8\x22\x3b\x20\x15\xbf\xf9\x85\x63\xee\x2d\xde\x75\xa5\x13\x46\xd8\x6b\x9b\xa7\x8b\x9d\x5a\x0b\xa8\xcc\x85\xf9\xb9\x8a\x32\x7b\x61\x70\x7f\xca\xfc\x87\x1a\x9c\x00\x69\x09\xff\x65\xcd\xfb\xa3\x9a\x3c\x7f\xc2\x41\xae\x58\xc2\x7a\xb1\x9a\x87\x4a\xef\x18\x5a\xd8\x6e\x0e\xd3\x2c\xf7\x60\x24\xc2\xc0\x64\xb0\x3c\x64\x3e\x70\x7b\x98\xaf\xdd\x8a\x27\xb4\x43\x75\xfb\x96\xfc\x4d\x05\x1f\x92\x0a\xe1\xa1\x53\x49\x2c\x0e\x35\xcb\xa7\x49\x4c\x38\x0b\xe1\xdc\x47\xe2\xb9\x74\x78\xd4\x16\x3a\xaa\xba\xc2\x98\xc1\x1b\xc5\x71\x91\x2f\x27\xa8\x17\xcb\x2f\xa8\x30\x11\x88\xf0\x94\x7a\x2c\x3e\x6d\x9c\x26\xeb\xf2\x64\x8d\x2f\xe4\x89\x26\x21\x32\xba\x48\x9c\xed\x45\x61\x3b\x94\x8a\x6d\x9e\x8c\x6e\xb6\x75\xb0\xfa\xfb\xfd\x6c\x22\xd9\x10\xe9\x9a\xf0\x03\xf7\xcf\xf6\x7b\xaf\xda\x7f\x9a\x7e\x95\x11\x48\xb4\xcd\x59\x3d\x3e\x14\xe4\xa9\x4c\x15\xa8\xfa\x23\xb4\x0a\xf6\xd6\x22\x22\xcf\x81\x65\xd1\xd2\x85\xb4\xb1\xad\x9f\x27\x45\xe2\xa8\x9f\x1b\x1e\x33\xb0\x2b\x90\x47\xc3\x2c\xa7\xd2\xa9\x46\x67\xe4\x1d\x3c\x69\xb9\xf3\x74\x93\xba\x2a\x35\xd2\x42\x75\x43\x5d\x53\x9b\xa6\x08\x58\x70\xfb\x4f\x40\xeb\x28\x7a\xa4\xa2\x18\x32\xf8\xe2\x88\xae\x99\x1d\x1b\xa5\xc2\x0f\x06\x68\xc4\x9b\xef\xd8\x5f\x42\x98\x29\x7d\x9e\x8d\x83\x62\x7e\xd1\x7e\x46\xda\x4c\x9d\xeb\xa1\x2c\xf9\xc4\xb4\x07\x51\x5b\x82\x2b\xa3\xd4\xcd\xcf\xd6\xd1\xd0\xb9\x19\x66\xc0\xe4\x48\x2d\xeb\xfa\x61\x4c\xf8\xad\xc8\xe9\x2a\x7c\x8a\xb8\xbf\x4b\xa4\xc9\x76\xf1\x02\x22\x5e\xf3\xe3\x36\x3a\x2f\xa6\xd7\x45\x2f\x83\x20\x01\xb0\xdd\x1f\x39\x3c\x73\xdd\xe1\x23\x47\xae\x81\xcd\x45\xf5\x4b\xb3\x1b\x6c\xa5\x47\x83\xa1\xc7\x08\x0b\xdb\x98\x69\xce\x5c\x53\x3f\x5f\xfd\x7a\x21\x09\x74\xb7\x29\xbd\xfa\x5d\xce\x53\xd8\x93\x77\x15\x77\x6f\xfa\x1e\xfe\xe7\x18\x7b\x64\x6a\x74\x2d\x6c\xe6\x5f\x1e\xf3\xee\x1d\x5b\x2c\x5d\xb5\x42\xe7\xac\x49\x40\xd6\xf9\xb0\xd8\xed\xa8\x53\x31\x1c\xa2\x4e\x53\xab\xc4\xd5\x36\xb4\xe1\x13\xe9\x89\x55\x74\x11\xa2\x67\x20\x21\x49\x91\x1e\xf0\x36\xce\x04\xb5\xf3\x9a\x06\xeb\xb4\x1f\xdb\x60\xbe\x86\xdf\xcb\x8b\xc4\xaa\xdf\x1e\x78\xf6\x77\x4c\x33\x95\xaa\x2f\x2a\xff\x52\x89\x96\x72\x0c\xbf\xa7\x02\xc8\xb1\x44\x5e\x0c\x01\x0e\x9d\x06\xef\x54\x36\x59\x85\x72\xb9\x86\x78\xe1\xbb\x98\x84\x54\x52\x03\xaa\xa1\x27\x1f\x18\xbc\x5a\x22\x37\x62\xee\xaa\x66\xde\x55\x96\x98\xbd\x93\x5d\x94\x27\x91\x40\x2d\x26\x73\x5b\xde\x0f\x8d\xda\xc8\x8d\xc7\xac\xf3\xdc\x34\x6b\xec\x00\xb0\x7c\x59\xbf\xcd\xbe\x3b\xc6\xfe\x6d\x3e\x82\x18\x3f\x73\xff\x64\xcc\xfb\x8c\x33\x8a\x37\x3f\x33\xa8\x99\xd6\x92\x4d\x33\x17\x19\x7c\xdc\x49\x7f\x75\x2d\x37\xe8\xf4\x29\x07\xa4\xc4\x02\x9f\x35\x35\x9d\x31\x89\x42\xed\x40\x55\x84\xea\x3e\xdf\xf4\x07\x34\xf6\x7e\x0b\x48\xc4\x0a\x8c\x58\x55\x19\x40\x27\xe4\x23\x9b\x02\x7b\xfc\xec\xa9\xb9\x92\xe1\xe5\xc9\xec\x7a\x76\xdd\x0e\xfa\xab\xba\xd4\xfb\x9c\x9b\xd8\xf7\x59\x27\x10\x79\x10\x6d\x74\xfd\x9e\x3c\xa8\x64\xee\x0f\xb9\x5e\x83\x1b\x8c\xdc\xac\xc1\x87\x58\xa7\xd9\x7d\x0e\x67\xff\x66\xb8\x10\x88\x55\xde\xef\x8e\x77\xfd\x1e\xbb\xcf\x69\x6e\x73\x26\xba\xd4\xbd\xd8\xfc\xce\x79\x1c\x8d\xde\x5d\x63\x07\x08\x1c\xc1\xfd\x85\x9a\xf7\x12\x6d\x32\x53\x88\x09\x88\x4f\x80\xc1\xa2\x14\xa1\x01\x2e\xc1\xed\x2c\x6a\xe7\x79\xec\x21\x36\xc7\x69\xfa\xac\x39\x48\x4f\x64\x53\xec\xd0\xb6\x83\x84\xf8\x13\xe7\x73\x7c\x3c\xb2\x75\x1f\x3d\xca\xbd\x0c\xde\xaa\xa7\x42\xb6\xf4\xe9\x62\x90\x31\xf6\x25\x87\xb9\xb8\x0f\xd0\x69\xe9\x44\x18\xaf\x67\xee\x6f\x3b\xde\xfb\x9c\xe3\x43\xd7\x2b\x82\x62\xcc\x6c\x15\xbf\x95\xf4\x73\x65\xdc\xce\x0c\x39\x6c\x47\x72\x91\xf1\x28\xde\x08\xd3\x24\xee\x62\xea\x55\x0a\x93\x27\xab\x17\xe1\xe3\x78\x54\x89\x73\xff\xac\x1c\x3d\x34\x0c\xf0\x48\xd6\x62\x54\x4c\xc4\x30\x71\xe6\x4f\x4c\xb0\x4b\x43\x13\x9d\x22\x73\xff\xe1\x80\xf7\xe7\xfb\xd5\x9c\x40\xab\x9c\x4e\xca\xdb\x76\x0e\xcc\xc7\x61\x3e\x04\xb9\x79\x56\xb4\xfb\xa4\x87\xa0\x59\x0d\x7c\xc2\xf2\x3d\xab\x3c\x48\xb6\x91\xe7\x31\x02\x73\xf5\xe3\x01\x7c\xdf\xb0\xb8\xc9\x53\x97\xb1\xd3\xd8\x8c\xe3\x39\xa9\xcd\xc6\xd1\x0c\x2c\xca\x52\xde\x07\x10\x91\x94\x06\x54\x5f\x0a\x96\x28\xcc\x03\xa8\xba\x69\x43\x38\x10\x95\x5b\x5f\x86\x28\x39\x08\xc6\x2e\x81\xea\xcb\xad\x2a\x0e\xef\xec\x0b\xee\x77\xa5\x7a\x3e\x84\x6d\x5b\xea\x11\x79\x2e\xd5\x96\xef\x13\xea\x9c\xaf\x8c\x9e\x75\x40\x01\x0b\x63\x91\x65\xbc\x97\x26\x2d\x39\xe0\x27\xa4\xae\x6c\x5e\x48\x52\x3c\xb7\xf6\x7b\x74\x09\x6b\xaf\x76\x68\x03\xf8\x33\xa3\x10\xe8\x52\x63\x20\xd4\xc0\xc7\x18\x2e\xa9\x44\xd0\xf9\x3f\xe8\x43\x44\xad\x71\x66\x6c\x0d\x20\x3e\xae\x1c\x49\x40\x9a\xea\x34\x44\xdf\x17\x20\xf0\x45\xb8\xed\xa0\x27\xb4\x83\x3b\x36\xc2\xd5\xbb\x38\x57\xc1\xfc\xe0\xeb\x84\x42\x02\xd3\xe8\x77\x35\x0d\x63\xa9\xa7\xb3\x26\x3f\x01\x81\xfe\x50\x73\x03\x48\x38\x2c\x75\x6e\x88\xe9\x74\x98\x24\xd8\xf1\xb3\xb5\x30\x89\x87\x87\x60\x67\xf6\xfe\x8a\x90\xde\xdd\x19\x76\x64\x65\x1b\x86\xa5\xed\xe1\xe6\x0f\xf8\x56\x8d\x5d\x9a\xaa\xd9\x77\x8b\x94\x61\xee\x9f\xd4\xbc\xd7\x97\x22\x5f\x30\xa3\x53\xcd\xd1\x55\x14\x75\xa4\xb3\x09\x39\xa0\xbe\x72\x61\xca\x15\xaa\x9f\x6c\xf2\x59\xb5\x64\xf1\x10\x03\xc6\x7a\x59\x98\x1c\xd6\x92\xc4\xc0\x27\x66\x4f\xcd\xa9\xd5\x84\x3c\xb6\xa5\x44\x6e\x3c\x7d\xda\x35\xc1\x54\x0b\x4c\x1f\x47\xce\xce\x3c\xe1\xde\x72\xda\x17\xde\xfd\x53\xf8\xf0\x8c\x3d\x7d\xf8\xf0\xe1\x6b\xe1\xd0\x01\x55\x7b\xfc\x91\x9b\x1e\x7f\xe4\xa6\x66\xd7\xb2\x80\x5e\xcd\xae\x64\x33\x3b\x71\x50\x2f\x9a\x7d\xcc\xde\xe2\xb0\x4b\x74\x04\x18\xe8\xfc\xaf\x74\xbc\x17\x39\x95\x7a\x60\x11\x43\x13\x66\x30\x8c\x74\x66\xd1\xbd\xa2\x0b\xda\x2a\x22\xa7\xba\x10\x0d\xd4\xaf\x8b\x30\x15\xd5\x7b\x1d\x76\x30\xeb\xb7\x50\x83\x73\x3f\xea\x78\xff\xa5\xa2\x86\x10\xc4\xc1\x65\xaf\x63\x6d\xe4\xd9\x76\xc8\xe9\xea\xdd\xa0\x2e\xdd\xd8\xbc\x41\x17\x79\x63\xf3\x06\x08\x0f\x51\x26\xa2\x1b\x9b\xd9\x46\xbb\x79\x83\xca\xd9\xa4\x87\xbc\x6d\x9b\xa5\x25\xab\x4f\xef\xc0\xb7\x7d\xc8\x27\xb5\x1a\xf4\x8f\x07\x59\xc3\x18\x1e\x34\x95\x68\xb8\x91\x85\x24\x98\x0b\xb3\xb4\x0f\xbb\xe8\x4d\xfd\x60\x55\xe4\xee\xc7\x0f\x7a\x6b\x15\xd7\x95\x67\x02\x4f\x5e\x00\xc1\xdb\x51\xf8\xbb\x52\xdc\x05\xfa\x79\x4b\xb1\x6a\xfb\xea\xe8\x55\x46\xea\x93\xb2\xc2\x8a\x1d\xff\xfa\x81\xbd\x1c\x88\x5d\xe4\x40\x3c\xdd\x48\x81\x78\xca\x2e\xa1\x85\xd8\x4f\x29\x08\x9f\x17\x6f\x95\xcb\xbb\xfd\x6c\x02\x18\x9f\xd9\xa5\x9d\xe2\xf6\x90\x05\xa2\x5c\x4a\x93\xfd\x78\x81\xa9\xf3\xa3\x5b\x64\x9f\xee\xa0\x42\x08\xab\x73\xdd\xc9\x04\xf6\xf7\x36\x6e\x8c\x49\x8b\x98\x6d\x4d\x10\xd4\x11\x55\xd9\xcb\xdf\xda\x2d\x88\x68\xb0\x7d\x6a\xcb\xac\xfb\x94\x06\xa5\xb3\x54\x0c\x42\x15\x2e\x8b\x46\x19\xc5\x39\xc0\xd8\x97\xc6\xd9\x75\x66\x36\xa7\xb2\x50\x52\xe0\x87\x62\x24\xc6\x99\x42\x67\x1b\xed\xac\x73\xdf\x38\xee\x5d\x5f\xbe\x48\x41\xdc\x7e\xe1\x8d\x05\xd7\x0a\x3e\xd5\x44\x2b\x0f\x75\xdd\x39\xe7\xa0\x96\xf1\x04\x4b\x62\xc9\xba\x0f\x8f\xb1\x8f\x3a\x6c\xbc\x97\xa4\xb9\xfb\x7e\x47\x65\x79\xbc\xb9\x72\x3b\x4c\x35\x5c\xbf\xca\x3a\x00\x01\x2b\xb7\x17\x29\x01\x37\x45\x6b\x2d\x49\xd6\x2d\x0f\xdd\x55\x57\x5d\x09\xaa\x49\xcb\x6f\xaf\x6f\xfa\x69\x80\xe9\xdd\x79\x88\x54\xde\x4d\xbe\x22\x4b\x5d\x31\xf3\x15\x28\x4b\x06\xbe\x16\xf7\xbb\x2d\x91\xf2\xc9\x99\xc6\x35\x57\x5f\x7d\xe5\xd5\x75\x1e\xc6\x72\x83\x0a\x37\xc4\x94\xed\xc7\x79\x2a\x61\xa8\x3c\xc9\x7b\xe2\x8a\xfc\x63\xa5\xca\xf9\x46\x95\x6e\x72\xd2\xd7\xad\xb4\xdc\xd3\xac\xe8\x27\xf7\x26\xef\xea\x15\xfd\xcb\x2a\x8b\x52\xf9\x76\x50\x60\x87\x8d\xf7\xfc\x7c\xcd\xfd\x11\xef\x19\x2b\xf2\x8f\x95\xb2\x47\xfd\xcc\xe2\x09\xe0\xab\x21\xb3\x4b\x61\x1a\x46\xca\x33\x79\x18\x33\x62\xde\x35\x6c\x7a\xd8\xb6\xb3\x05\xfe\xe1\x12\x76\xc3\x8e\x67\xd7\xed\x38\x44\x84\x69\x8f\x61\x7e\xef\xbb\xc4\xbb\xad\xe2\xba\x52\x11\xb1\xed\xe6\x99\x1a\x9c\x72\xeb\x72\xa8\x96\x4f\x40\x30\x5e\x4c\x7b\xa9\xf6\xb7\xd0\x4c\xb0\x26\xda\xbd\x17\xb3\x8f\x3b\x6c\xa2\xed\xdf\xd4\x97\xe7\x43\xf7\x03\x8e\x3b\xde\x1a\xe4\xc2\x7b\xab\xb3\xa2\x2e\x62\x1f\xf1\x85\xe3\x27\xb9\x88\xdb\x89\x3c\x20\x1c\x9b\xe5\x2d\xb8\x57\xea\x26\xb5\x99\x5b\x84\x69\xf4\xdd\x43\x0a\x60\x9e\xb7\x45\x9a\xa3\xbc\x17\xc3\xa4\x27\xe4\x75\xcc\x53\xa0\x6a\x4b\x92\x3c\x53\xd3\x5b\x23\x32\x81\x72\x0c\x64\x27\x66\x97\xbf\xbc\xc6\x0e\xd0\x50\xb8\x77\xd7\xd8\x2d\xa3\x13\xb7\xcf\x6b\xa9\x7b\xef\x75\x56\xa8\xd8\x15\x95\xf3\x60\x2c\x6f\x73\xdd\xe9\x80\x45\xbd\xe6\x8e\x87\x60\xfb\x28\x0a\x48\x52\xbe\xd2\x4f\xa3\x95\x8a\xc8\x43\xc6\xc8\x39\x43\x6f\xc3\x19\x81\x7c\x46\x86\x3b\x9e\x74\x41\xc2\xc7\x1c\x24\x7d\x03\xf4\xbf\xf8\x50\x93\x7d\x7b\x82\x8d\xf5\xd3\xc8\xfd\xe6\x84\xf7\xd5\x09\xfc\xe6\x6a\xb8\x41\x3b\x0f\x10\x9a\x19\x9b\x2d\x7d\x12\x62\x2e\x34\x44\xa0\x5c\x0a\x10\x98\x34\xb9\x02\x3b\x8a\x38\x3a\x3d\x2d\xa5\x0a\x80\xf7\x4f\xc3\xea\x99\x6a\xf2\xe3\x67\x7d\xe0\x5a\x21\xa0\x00\xfc\x52\x62\xb6\xb9\xaa\xa9\xf2\xa0\xbe\x22\x0b\xd3\x52\x06\xe8\xf2\x44\x87\xe2\x89\x74\x9f\x96\x02\x7c\xa9\xf5\xd7\xeb\x00\xa3\xe2\x33\x0a\x46\xc0\x88\x2c\x96\x1f\xe0\xdd\x70\x75\x0d\x8d\xf0\x22\x4b\x22\xc5\x4f\xaf\x11\x5b\xe6\x4e\x2d\x41\xab\x93\xae\x31\xc3\x32\xcc\x77\xaf\xf3\x15\xb9\x0f\x15\x7c\xfe\x2b\xea\xd0\x4c\x65\xf1\x30\x56\x29\x0c\x50\x90\xaf\x82\x4c\x0b\xc1\x19\xf9\x03\x81\xda\x69\x98\x20\x6b\xcc\x54\x53\x35\xbd\x6b\xb0\x24\xf9\x31\x9f\x5f\x50\x94\x0e\x4d\xc6\x16\x22\xe1\x67\x42\x76\x8b\x50\xa6\x7c\x59\xca\x8a\x1c\xba\x08\x5f\x97\xbd\x3c\x73\xe4\xda\xe6\xe1\xe6\xe1\xe6\xcc\x0a\xc2\x06\x51\xc9\x72\xee\x84\xd9\xfa\x80\xf7\x63\x40\xf9\x91\xf3\x04\xf8\x14\x57\x53\x01\xda\x77\x6a\x07\x38\xa8\x39\x97\xe0\x61\x14\x33\x27\x71\x6d\x03\x75\x4d\x6c\xac\x3e\xca\x68\x81\x6e\x8d\x05\x2e\x78\x10\x3d\x6d\x3f\x8a\x32\x2d\x16\xf5\x22\x00\x90\x00\x39\x2e\x70\x5b\x7e\x39\x0a\xd7\x05\xba\x61\x29\x74\x5d\xce\x28\xbf\x05\x41\x3f\x4d\xd1\xac\xc3\x64\x10\x7e\x06\x8f\xe4\xfd\x34\xe6\xfd\x1e\x1a\x35\x62\xb1\xa9\xe6\x00\xcd\x22\x9c\x9a\x7a\x92\x79\xa0\xa7\x78\xd7\xc3\xe4\x90\x33\x98\x6e\xac\x86\x24\x09\x3d\xa5\xc8\x78\x4d\xc6\x66\x51\xd6\xeb\xa0\x61\x3f\x22\x8f\x58\x47\x23\x58\xa9\x00\x8a\x78\xa0\x8e\x19\x3d\x91\x82\x00\x69\x45\x02\x2b\x75\x66\xf1\x44\x93\x3f\x33\xe9\xc3\xb3\x3a\xf2\x4d\x16\x9c\x27\x10\x0f\x05\xfd\x97\xb6\xc2\x3c\xf5\x53\x5d\x0c\x09\x0f\xbd\xf4\x2c\x18\x17\x5f\xe3\xf4\x68\xec\x51\xd9\xe0\xd9\x3c\x57\xe9\x74\x14\xa5\xe2\x23\x37\x17\x6c\xe6\x59\xd8\xe6\x7e\x3f\x5f\xe3\x80\xd5\xe0\xc9\x1b\x47\xe5\xe7\x37\x93\x34\x78\xaa\xa7\xc1\x87\xa2\x28\xd9\x94\xa7\x92\x9b\x53\x7f\x15\xad\x63\x93\xde\xe5\xcd\x66\xd3\x43\x6e\xca\x3b\xfb\x22\x1d\x98\x2e\xfd\x49\xef\x29\x74\x37\x15\x66\x09\x75\x2e\x40\xbc\x59\x52\xf8\xbf\x8f\xb3\xc7\x6e\x11\xa2\xe1\xde\x33\xee\xcd\xa8\x1f\x28\x4e\xb5\xf3\x44\xc5\x7c\x98\x96\xb7\xb4\x1f\x89\xcc\x06\x4a\xfd\xc7\x31\xb9\x65\x3d\xa2\x97\x04\xb3\x71\x1e\xea\x82\xdf\xb3\x13\xae\xd6\x05\xfb\x25\xef\x05\x73\xda\x93\x03\xa9\x03\x71\x1e\x36\x46\x56\x83\x30\x30\xfc\x8d\x44\x6a\x42\x7d\x23\x97\xd5\x00\x8c\xc1\x60\x3b\x48\x4e\xbb\x2b\x89\x45\x9d\x8b\xbc\xdd\x04\xf0\x3d\x29\x60\x30\x1d\xa6\x97\x04\x93\xd9\xd4\x54\x93\x6d\x60\x16\x9a\x6e\x43\x67\x07\xa1\xfd\xa7\x8c\x17\xbc\xab\x8b\xfa\x43\x4c\xcf\xe8\xba\x9b\x01\x22\xec\xbd\x0e\xbb\x48\xf6\x9f\xfa\xee\x5b\x1d\x56\xdf\x51\xdf\xa9\xef\xe6\xa5\x7e\xdb\xa6\xcb\xda\x49\x83\x28\x34\x77\xd5\x5d\x7f\x3a\x66\x11\xe1\x92\xe7\x04\x1d\x55\xeb\x22\x5e\x44\xbd\xcc\xfd\xaf\x63\xde\x0d\xe6\x85\x42\x67\x2a\x67\x3d\x54\xa6\xe9\x36\xcf\x39\x13\x7e\x3f\x08\xe5\x0e\x6f\x4d\xbc\xaf\xd5\xd8\xab\x1c\xa6\xef\xb9\x2f\x71\xbc\xc1\x2c\xfd\x50\xda\xa8\x54\x7d\x63\xa0\xb3\x54\x37\x68\x87\xcd\x29\x57\x98\x7b\x66\xd5\xe0\xfc\x5b\xa0\xb4\x05\x85\x8a\x0e\x0a\x0f\x95\x01\xb5\x95\x1b\x51\x21\x84\xad\x35\xf7\x7b\x0e\xbb\x4c\x9c\xed\x85\xa8\xc9\xa8\x50\xb1\x5f\xd3\xa1\x62\x6f\x74\x8e\x97\xef\x0e\xe5\xd9\x24\x1d\x54\xda\x8c\xcc\xef\xed\xaa\xbc\x46\xd9\x02\x30\x86\x56\x1a\x29\x20\x06\x0d\x7d\xd3\x1b\x51\x96\xcd\x63\x38\xce\x7e\xb8\x18\x63\xb9\x4b\xc7\x19\x60\x59\x15\x4d\xd7\x86\x09\xeb\x01\x30\x0c\xf7\xb3\x3c\xe9\x2a\xec\x9d\xa5\x22\xc2\x98\x30\x36\x3f\x37\xe6\x7d\x7c\x6c\x9b\x87\xf4\x09\x5d\xc1\xd4\xc9\x8f\x62\x3b\xf1\xbe\x11\xb8\x0c\xab\xca\x2e\x2f\x6b\x72\x05\xdb\x99\x59\x38\x8b\xe4\xb9\x5d\x69\x2a\xbc\xde\xa7\x2d\x9d\x3e\x45\xdb\x4f\xac\xf0\xd2\xfc\x52\x69\x94\x8b\x07\x79\x2c\x57\x70\x71\xb6\x97\x40\x8e\x12\x9f\x1e\x51\x17\x50\x91\xa0\x84\xc2\xe0\x75\x05\x5f\x38\xb3\x6c\x9a\xa8\xe0\xa9\xaa\x12\x72\x3c\x3f\x94\x0b\xc0\xf9\x4f\x1b\xe3\x6a\x9c\xa4\x82\xb8\xcd\x30\xf4\x22\x1e\xe4\xe0\x87\x13\x67\xdb\xa2\x97\x5b\x3d\x95\xfb\xf1\x5d\x3e\x56\x60\x7a\xe1\xf4\xd2\xf2\xf4\xc2\xec\xf2\xb1\x5b\x87\xea\x52\xfe\xe0\xf0\x47\x86\x0a\x35\x23\x46\xbe\x5e\x63\x87\xaa\xbd\x04\x9d\x70\xf5\xa4\xdf\x7b\xba\xd0\x8c\x70\xee\x3d\x35\xef\x07\xf1\x87\xec\xc6\x75\x31\x40\x03\x9f\xcf\xf5\xd3\x44\xd1\x66\xad\xfc\x17\xd5\xd8\x13\x90\x99\xed\x07\x3d\x77\x19\xb2\x53\x30\x1d\x0e\x4a\xb2\xb3\xe5\x1d\x3a\xf4\x3e\xdf\x4b\x4e\x59\x60\xa1\x70\x68\x78\x40\xc0\x65\xa6\x2f\x87\x7f\xcc\x6a\x2c\xb2\x09\xa5\xd1\xb8\x37\x7b\x4f\x5a\xa2\x70\xb8\x4d\x4d\xc7\x27\x8a\x16\x4b\xe5\x21\xcc\x33\x68\x54\x29\x07\xd6\x72\x92\xfe\xd9\x45\x16\x45\xd7\x10\x44\x8d\xfb\xb1\x8b\xbc\x93\x45\xca\x25\x31\xfb\x82\x7d\xb6\x9d\xf4\x70\x82\xc2\x6d\x4c\xe6\x4a\x3a\xbc\xdb\x8f\xf2\xb0\x17\x19\x87\xf8\xcc\xd4\xc5\xec\x7d\xff\x67\xd8\x9e\x6d\x6d\x0f\x4c\x7a\x8f\xf9\xec\x82\x62\xf1\x7f\x41\x19\xf2\x7f\x7f\x2b\xe6\xb3\xa1\xa5\x0e\x1b\xf7\x39\xc8\x2b\xb5\x56\x5d\xd9\x58\x7f\xaa\x88\x75\x7e\x90\x71\xe7\xbf\x56\x78\x04\xbe\xb8\x93\x93\x41\xd1\x34\xf4\x00\xfc\xa2\xa3\xd5\x01\xa5\xe9\xe6\x23\xd0\xf5\x1f\xb2\x46\xde\xe7\x3c\x63\x7b\x53\x79\xd3\xad\x6f\x89\x02\x55\x46\x80\xfa\xe8\xc5\xec\x72\xa3\x7f\xd2\x96\xdf\x2e\xa8\x8a\xf0\x4c\xba\x98\x44\xc2\x7d\xed\xc5\xde\x3f\x3b\xc6\x05\x62\xdb\xa2\x53\x2b\x01\xae\x44\xc9\x6a\xd8\xf6\x23\xfc\x3e\xc0\xfd\x75\x08\x1d\x66\x91\x80\x3d\x0a\x57\xa0\x36\xab\x11\x26\xb5\xec\x29\xa4\xdb\x90\xc5\xdf\x44\xf1\x17\x52\xe1\x2a\x3e\x4a\x57\xcd\xc4\x59\xa9\x64\x6e\xcc\x34\x67\xae\x95\x7f\x74\xfc\x0d\x9c\x8c\xd0\x0c\x79\x36\x4e\x52\x0a\xe2\x51\x83\xb2\x31\x63\x16\x88\xa2\x9b\x7c\xa8\x2a\xab\xbb\x45\x8c\x9b\xaa\xec\x23\x47\xec\x9d\xe9\xf5\x07\xf7\x76\xa6\xbd\x9d\xe9\xa1\xdb\x99\xd6\x8c\x8d\xe9\x39\xbb\xdd\x97\x1e\xbb\xc5\xb6\xc4\xee\x76\xd8\x3e\x38\xd8\xbb\x9b\xde\x55\xb8\x84\xc9\xe9\x15\x45\xe4\x12\x2d\x16\xb7\x36\x87\x1b\xeb\xcb\x8c\x14\xb9\x8a\x1d\xd9\x42\x30\x5b\x82\xa7\x28\x96\xfd\x4a\x8d\x3d\xc2\x5f\x5d\x4d\x01\xec\x22\x89\xe5\x35\xf7\x5c\x6d\x8b\xa4\x3b\xab\xa0\x59\xfb\x4d\xef\x4f\x9c\xd2\x95\xb2\x3f\x88\x00\xd2\xa4\x9c\xb2\xa3\x7e\xf3\x04\xc0\x4e\x03\xca\xa7\x18\xd5\x60\x70\x70\x54\x7c\x43\x41\x13\xc4\xc6\xfb\x7e\x2a\xcc\xfc\x08\xe4\xf3\xc2\x08\x3e\xa4\x76\x32\x8f\x44\xf8\x8a\xf6\x4f\xe5\x49\xb7\x57\x9c\x32\x8d\x94\x8f\xfb\x9c\x64\xfb\x4d\xe2\x84\xfb\x34\xbd\x49\x8c\x14\x95\x05\x5f\x5a\xd1\xbc\x4a\x0a\x8c\xcf\x1e\xb4\x0e\x0a\xd6\x00\xc0\xde\xf1\x9e\x83\xde\x67\x9d\x62\xd3\xd0\xda\x7f\xf0\x00\xec\x18\xbb\xdc\x1b\xee\xf7\xa6\xf0\xb5\xfd\x6c\xa0\x16\x4b\xcf\x6b\xec\x78\xb1\x5c\x98\x55\xb2\xb7\x1f\xed\xed\x47\xff\xf7\xef\x47\xf7\x39\x6b\xdb\xcb\xb6\xe3\xee\xb1\xc6\x16\xf1\x20\xdb\x8b\x3b\x90\x73\xec\xe7\xf7\x6f\xcb\xeb\x53\x22\x87\xc0\xd3\xc7\x37\xf6\x79\x71\xd5\x8d\xed\x69\x7d\x6c\xfe\x88\x9d\xf3\x46\x9c\x73\x18\xbe\x73\x0a\xd8\x6e\x2e\xa6\xa2\x87\x69\x6e\x3e\x35\xce\xde\xe9\x54\x13\xa9\xfc\xcc\xf9\x80\xe4\x56\x10\xa9\x3c\xe3\x7c\x78\x54\x14\x57\x8a\xa2\x20\x48\xc0\xc7\x4f\x1d\x2c\x02\xc4\x61\x65\xaf\x70\x98\xd5\x14\xf7\x47\x77\x57\xc5\xa7\x98\x85\x6d\xc9\xf1\xa2\xd0\xd8\x61\x93\xb9\x93\xde\x9f\x62\x01\x33\xfa\xd9\xbd\xcd\x9b\x2f\x7e\x95\x03\x5d\x34\xb9\x03\x04\x48\x40\x68\xbd\xc1\xe8\x11\xc6\x1a\x83\x1f\x39\xb0\xcd\xc5\xf4\x0e\x87\x5d\x8a\x77\xb5\x11\xf3\xd5\x0e\x7b\xea\xfd\x41\x30\xf6\x5b\x22\x52\x85\x78\x0b\x76\xa1\xb2\xc6\x2a\x7a\x83\x5c\x8e\x03\x13\xbb\x11\x92\xc6\x32\x91\x2a\x8c\x3d\x70\x7c\x62\xfa\x2a\x16\xd4\x64\xff\x34\x71\xbe\xcc\x57\x88\xb2\xff\xd1\x09\xef\x13\x63\x55\x77\x8c\x25\x62\x71\xc6\x00\xcc\xe2\xc3\x8e\xf4\xea\x42\x91\x6a\x3c\x6c\xf9\xb3\x38\x3f\x1d\x53\xa0\x87\x87\x55\x25\x32\x06\x8b\x80\xa7\x59\x15\xcf\xf6\x95\xf1\x0b\x42\xa8\xf5\xf7\x0e\xfb\x5e\x8b\x4d\xca\xe4\xd3\xfa\x9c\x8e\x93\xfb\x90\x33\xea\x21\x4d\x7d\x61\xd0\x97\x3c\xec\xd8\xb4\x2c\x7f\xd8\x5b\x6a\xcc\x1d\x26\xd0\x72\x5f\xbe\x4b\xa2\xab\x4f\x39\xc3\x85\x3e\x20\x9d\xf3\xa0\xd0\x5c\xb1\x2f\x1e\xb4\x82\x39\x8d\x00\xb3\xac\x30\x5e\x15\x17\x97\xc2\xd5\x38\x8c\x57\x95\xc3\xf8\x75\x07\xbd\x43\x85\x43\xdb\x37\xe3\xd3\x00\xef\xcf\x80\xa5\xb3\x66\xf5\x37\x0e\x5c\xd8\xa8\xea\xd7\x28\x63\xec\x4f\x39\xec\xe9\xa3\x2d\x96\xe7\xd5\x38\xb0\xd4\xde\x28\x65\x93\xd9\x2a\x15\xc2\x18\xe6\x99\x88\x3a\xc8\x51\x1b\x0f\xb8\x1f\x60\x86\x89\x1f\x99\xa1\x85\x4d\xf6\x63\x85\x31\x75\x93\x9d\xbc\x50\x35\x43\x43\xeb\x13\xe6\x44\x1a\xe2\x31\xaa\x9c\x20\x68\xcc\x86\xbd\xb8\xea\xbd\x13\xcd\x43\x49\x24\xba\xb9\xfd\x39\x63\xd9\x5d\xd4\x36\x14\x6b\x25\x94\xad\x27\xa3\x16\x44\xa5\x2d\xe5\xd5\x8c\xfd\x40\x75\x30\xce\xb2\xe8\xf6\xe4\x14\x74\xff\xe7\x41\x6f\xde\xf8\x6d\xd8\xa9\x7c\x9e\xab\x8b\x72\x87\xd1\x98\x70\xed\xa4\x17\x0a\x85\xfc\x99\x0a\x05\x73\xd1\x4b\x02\xdb\x86\xf1\x9b\x13\x7b\xb3\x66\xcf\x63\x68\x7b\x0c\xbf\xe9\xb0\x09\x35\xab\xdc\x3f\xde\x61\xd0\x9d\x9a\x9b\xb0\x1b\xbd\xcb\x31\xa6\x6a\x21\xb5\x01\xf5\xc0\x82\x68\x6d\x13\x60\x0a\x4d\x08\x8a\x1c\x53\x1f\x6f\xee\xf1\x57\xff\x2b\xd8\x76\xee\x73\x96\xb6\x17\x9d\x87\xdd\x66\x95\x8f\xd2\x98\x38\x65\x2f\xe5\x57\x0f\xb2\x1f\xaa\x98\x6a\xea\x14\xf9\x8c\x7e\x92\xfb\x40\xc8\xf5\xbe\x83\xde\x95\x43\x57\x6d\x52\x2e\xeb\x36\x07\xea\xa8\x6a\x76\xae\x9f\xda\x63\xe7\xda\xb5\x16\xf2\x41\xcd\xce\xf5\x1e\xc7\xeb\x69\x72\xae\x51\xa3\x41\x71\x4e\xe7\x1d\x35\x85\x59\x5e\xd3\xaa\x0a\x8d\x3b\x65\x69\x76\xae\xf9\x11\x76\x78\x07\x21\x0f\x56\x75\xf6\x76\xc3\x3d\x12\x2e\x93\x84\xeb\x99\xdb\x8b\xb6\x6b\xdc\xab\xaa\x44\xdb\x90\x48\x2a\x0b\xb8\x2f\x4f\x54\xea\x7d\x1a\x64\x25\xcb\xdd\x7b\x26\xbc\xc7\x1b\xbf\x75\xfa\xa1\x5a\x49\x0a\x5f\xa5\x5a\x98\xbd\xed\x00\x5b\x56\x4b\xf1\xe9\xde\x23\x4f\x94\x5e\x32\x57\x4a\x9d\x5d\xc1\x26\xb7\x5d\x29\x54\x95\xbd\x35\xb2\xb7\x46\x8a\xc6\xed\x6d\x98\x0f\xa1\xfe\x64\x08\x87\xb2\x78\xf9\xd5\xfd\x16\x95\x7b\xc1\xbf\x20\x67\x10\xf1\x5e\x03\x10\x1d\xd0\xfe\xbd\x70\xbf\x37\x57\xbe\x58\xc4\xf7\x56\x1b\x6e\x10\x9d\x0e\xc7\x8a\xde\xb5\x0f\x97\xbf\xbc\x8f\xbd\x7d\x0c\x91\xeb\x31\x54\xc1\xfd\xb9\x31\xef\x27\xc6\x0c\x4a\xb9\x02\xdf\xaf\x6c\x29\x36\xa2\x24\xe0\xc4\x40\x83\x8f\x20\x47\x38\x69\xda\x06\x9a\x26\xb1\xa8\x03\xdd\x55\xd8\xc1\x40\x6c\xee\x75\x22\x7f\x23\x49\x33\x0f\x8b\xb0\x82\x2f\x74\x20\x05\xe4\x36\x98\x00\x9a\x16\x42\xf5\x80\x72\xbe\xc0\x04\x5f\x94\x6c\x60\xfe\x2b\xc3\x2e\x94\xa3\xe1\xaf\x09\x87\x56\x17\x0a\x95\x34\xac\xe8\xda\x65\x01\x26\x52\x44\xf0\x68\xf4\x52\xd1\x09\xcf\xca\x63\xba\x9f\xaf\xf1\x38\xe1\x5d\x04\xea\xf5\x63\x7e\xe4\xea\xc3\xbc\xbd\xe6\xa7\x7e\x3b\x27\xf8\x1f\x24\x74\xaf\x53\x26\x98\xdf\xee\x0a\x39\x43\x43\x1c\x87\x46\xf1\x6d\xaf\x8c\xbd\x1e\x76\xbb\x7d\x48\xc5\xb3\x0c\xef\x3f\x56\x63\xac\x48\x9e\x71\xff\x97\xc3\x6e\x1e\xb9\x1f\x8c\x9e\x4b\x45\xbf\x14\xd9\xb5\xef\x70\x8c\xde\x22\x45\x30\x5e\x27\x40\x90\x52\x5e\x00\xe5\xf1\x00\x88\x6a\x61\xa9\xb4\x79\x47\x74\x16\x44\xb9\x7b\x8d\xb8\x72\xe2\x5a\x32\x67\x91\x66\x62\x20\xca\x30\x2e\xce\xe6\xa9\x6f\x24\x0c\x35\xd9\xdf\xee\x63\x57\x8f\xc6\x92\x30\xc1\x1b\x97\x08\x54\x08\xd1\xc7\x32\xf7\xd7\xf6\x79\xe1\x16\xf7\x4d\xa8\x14\x85\x47\x64\x1c\x84\x83\xb0\x9d\xab\x54\x6a\x98\xc8\xe0\xbe\x31\xcb\xa3\xf0\x11\x45\xbe\xf9\xbd\x94\x9f\x57\xc6\xcb\xb4\xf7\xff\x37\x8d\xb3\xff\x5a\x63\x23\x9f\x75\xdf\x58\xf3\xee\xae\x8d\xba\xab\xc9\x95\xa3\x64\x53\x2b\xee\x26\x7c\x25\x84\xf4\x60\x23\x28\x81\xb2\x98\xd4\x89\x26\x9a\x9a\x35\xd2\x85\xae\xf0\x88\xa8\x03\x57\x63\x3c\x18\x2e\x90\xab\xa5\x2c\x88\xd0\x40\xf3\xb1\xad\x09\x44\x30\x95\xea\x8c\x4d\xe5\x3b\xab\x90\x31\xa1\x9a\x34\xba\x19\x05\x5d\x95\xf0\x44\x35\x19\x26\x80\x99\x65\x22\xb7\x20\x13\x6d\xba\x34\xf6\x55\x87\x3d\x86\x92\x9e\xca\x05\xb9\x1f\x73\xbc\xf7\x3a\x23\x6e\xea\xcc\x2b\x4a\x98\x1a\xba\x0f\x79\x25\x1a\xd3\x01\xfa\x69\xd9\x78\xfe\xe4\x99\xa5\x65\xf0\x2d\x62\x47\x28\x41\x35\x72\xa4\xa8\x1b\x8a\x9e\x8e\xc3\xa8\x98\xee\x72\xb1\xe7\x1a\xda\xd5\x5a\xf3\x1f\x18\x67\x75\xd3\x9d\xdb\xeb\x41\x8e\xd5\x92\x7c\xa1\xd3\x8f\x96\x44\x7e\x06\x54\x27\x35\x9b\xdd\x97\x8e\x7b\x9f\x76\x46\xde\x2e\xc5\x3b\xd8\x13\x5d\x5e\x31\xde\x1c\x42\x09\x26\x3c\x76\xcd\x94\x01\x25\x67\x90\x85\x06\xe0\x13\x90\x66\x62\x3b\x30\x8c\x5c\xbf\x58\xb4\x45\x96\xf9\x88\x5c\xae\xca\x90\x9f\xc4\x72\xb4\xcc\x50\x35\x0c\x74\xed\xec\x1d\xeb\xed\x35\x76\x8f\xc3\x2e\x91\x15\x0b\xe3\x55\x6c\x9e\xfb\x0e\x67\x0b\xc0\x19\xd5\x69\x8b\xe6\x2b\x46\x43\x55\xe7\x78\x2d\xeb\x09\xd3\x19\x4f\x5a\x05\xb8\x6d\x8c\x36\x01\x6e\xd8\x32\x51\xe1\x6f\x57\xfc\x32\x38\xc9\xd6\xd8\x38\x80\x6b\xae\x78\x4b\xf8\xa2\x35\x20\xe0\xc9\x55\x80\xf8\xa3\x06\xb1\x40\x11\x29\x7f\xd5\x4e\x82\x1a\x67\x4f\xb4\x23\x01\x8c\xe8\x1a\xc8\x61\x8d\xd5\x01\x08\xe2\x37\x3f\x3f\xe6\x9d\x28\x5d\xa3\xd3\x8c\x85\x70\x61\x07\x61\xfa\x90\x62\xaa\x07\x2f\x4e\xe2\x86\xda\x29\xce\x39\xfb\x36\x44\xda\xb2\x05\xde\xdf\xd5\xd8\x27\x1d\xf6\x88\xb8\xf8\xce\x99\xc5\x13\x99\xfb\x7e\xc7\x3b\xe7\x9c\xb2\x2f\x2a\xf2\x47\x90\x6b\x3d\x3f\xcd\x43\x3f\xe2\xfd\x34\x52\xc2\x09\x73\xae\xb5\xd2\xb1\x01\x19\xa4\x22\xc3\xa3\x05\xbf\x82\xf0\xf9\x94\xa4\x6a\xf5\x73\x94\x4e\x94\x2f\xd9\xe9\x47\x51\x9d\x77\x42\x39\x4b\xb3\x5c\xf4\x34\x79\x99\x9f\xaf\x35\xb9\x21\x09\x11\xac\x6b\xa4\x04\x7a\x93\xc3\xb0\x99\xee\xab\x1d\xef\xec\x6d\x22\x6d\xd9\x96\x94\x42\x67\xb4\x3a\x87\xcf\x2e\xcc\x73\x78\xaf\x0e\x89\xf8\x47\xf9\xaa\xc8\xeb\xbc\x97\x64\xf2\xbf\xfd\xbc\x4e\x54\x73\x75\x0e\xb0\x68\x75\xbe\x26\xfc\xa0\xae\x22\x0a\xce\xa7\x82\x2f\xba\xd4\x92\x20\xda\x1e\x2c\x15\xd1\x2c\x17\x71\x8e\xd0\xa5\xc7\x22\x3f\x04\x7a\x5b\xf7\xb3\x97\x78\x3f\xe6\x8c\xbc\x5d\x4e\xc5\x40\x2a\x54\x83\x20\x15\x88\xa1\x20\x27\x98\x07\x02\xa1\x45\xc1\xb3\x89\xda\x9f\xcf\x97\x0a\x67\x3b\x29\xaf\x69\x43\x07\xb8\x14\xe5\x58\xb3\xe6\x23\x17\x4b\x49\x7f\x50\xab\xe6\xee\x67\x9c\x1d\x10\x7c\x2c\x56\x60\x50\x7a\xaf\x71\x74\x92\x68\x19\x3d\xbe\x1b\xc6\x61\xb7\x5f\xa8\x3a\x74\x20\x82\xf6\x9b\xf3\xec\x7e\xa3\xcb\xf6\x74\xa7\x36\x08\x68\xb6\x38\x6d\xb0\x17\x39\x6c\x42\x31\x9d\xba\x9b\x17\x20\xb6\xe8\xca\x59\x24\x37\x25\x2c\x01\x88\xe7\xd2\xb0\xba\x89\x06\x2b\x45\x0c\x22\x0a\xd3\x65\x6f\x75\xd8\x23\xa9\xba\xc5\x4e\xfa\xd3\x8e\xf7\x63\x8e\x99\x47\xb9\x64\x3c\xa1\xb6\xf3\x22\xec\x59\x4e\x95\x0b\xd9\x47\x70\x88\x68\xcc\x98\x93\xfa\x8d\x0e\x63\x78\xfb\x64\x12\x08\xf7\x15\x8e\x77\xb7\x53\xfc\xd6\x07\xda\x4d\xd8\xd6\x48\xa6\xd2\x40\x86\x23\x6b\x7c\x9b\xda\x9c\x6f\x0e\x23\x41\x08\x38\xa0\x8c\x23\xc4\x27\x08\x7b\xb9\x5d\xd3\x66\x07\xf1\x49\xf0\x2a\x32\x35\x99\xf5\x7b\x9e\xaa\x1e\xf4\xdf\x73\xbc\xd3\xb7\xe9\x5f\x4a\xf5\xa0\x2e\x1f\x06\xb2\x29\x2f\x3d\x00\x88\xd2\x28\x07\x58\x57\xf3\x5b\x9f\x74\xd8\x45\x28\xf9\x64\xdb\x33\xf7\x83\x8e\xf7\x26\x67\xb6\xb8\x60\xa3\x15\x29\x44\x37\x92\x95\x5d\x78\xe2\x81\x9f\xe7\xf8\xb9\x06\x7c\x4e\x0e\xe5\x48\x71\xf5\xf9\x71\xc6\x02\x3f\xf7\x29\x2c\xed\xe3\xe3\xec\xe8\xf6\x08\xd9\x83\x9e\x08\xaa\xe8\x7c\xbc\x97\x8c\x1b\x07\x2b\x0a\x58\x57\x7b\xba\x62\xa7\x40\xfc\x8c\xa3\xfc\x0a\x50\x53\x15\x81\x16\xf6\xfd\x52\xec\xf7\xb2\xb5\x24\x57\x66\xb0\xc9\x8c\x2e\x68\xdc\x03\x32\x3b\xd8\x8f\x4f\x95\x0a\x5b\xb8\xed\x18\x9f\xac\x14\xa9\xe5\x27\xcb\xa7\x2d\xa4\x54\x56\x47\xd6\x8c\xcb\xae\x51\xac\xec\x72\x3b\x9e\x9c\x8d\x7a\x6b\xfe\x94\xc5\x12\x26\xf5\xb4\xa1\x72\x06\x3d\x75\x14\xd0\xa5\x95\x0b\x43\x2c\xb3\xd9\x78\x80\xf5\x9b\xd3\xa3\xa0\x51\xe4\x57\xa5\xfe\xa3\xf4\x7d\x62\xa6\xd0\x74\x16\x20\xcd\xc1\x76\x04\x48\x28\xc0\x46\x46\xd6\x1d\x43\x93\x94\x83\x90\xf5\x81\xd0\x14\x55\x50\x7d\x22\x81\xda\x60\x75\xeb\x9a\xbf\x81\xe8\x28\x10\x73\x66\x43\xad\x87\x4c\xb1\x32\xe3\xf1\x51\x81\x0b\x8f\x2c\xaf\xc9\xde\x35\xc1\x66\x69\xe6\x20\x98\x10\x25\x83\x24\x36\x92\x41\x09\x8c\xaa\x39\xbb\x30\x6f\x1a\x7b\xff\xfc\x80\x37\x6d\x5f\xb2\x37\xfb\xe2\x9e\xf6\x99\x54\x9a\x7d\xff\xf3\x7e\x36\x6f\xd8\x18\xcf\x87\xb7\x61\xd8\xc4\xb8\x67\xdd\xdb\xad\x3b\x4c\x28\x13\xfc\x73\x4c\xc1\x74\x9a\x9d\x1c\x11\x00\x76\xff\x66\xd0\x9e\x4d\x7e\x37\xb1\x3f\xcf\xdb\xde\x00\x7b\x8b\x7b\x5c\x1b\x60\xcb\x23\x51\x0a\xff\xb1\x17\x71\xd9\x2e\xfb\x67\x97\xb0\x1f\xac\x86\xb8\x39\xb6\x34\x3f\x97\x86\x1b\x22\x75\x3f\x72\x89\x77\x6f\x4d\xff\xe4\x6d\xbf\x27\x5b\x54\x65\x87\xf5\x0b\x7a\x4f\xa5\x38\xf1\x79\xb9\x32\x3a\x7e\x5b\xf0\xc9\x63\x4b\xf3\x53\x4a\xb2\x05\x58\x58\x20\x7a\x51\x32\x30\x64\x1c\x61\x6d\x99\x69\x06\x7e\x9e\xfb\xed\x35\x1e\x88\x5c\x31\x74\x93\x80\x25\xb2\x91\x62\x9a\x00\x0c\x30\x92\x30\x0b\x8d\x3d\x41\xaf\x1b\xca\x10\x96\x1e\x89\x7c\x87\x25\x60\x80\x76\xd1\x58\xcd\xa6\x5d\xd0\x0f\x26\x31\x72\x36\x34\x79\xd1\x51\x24\x17\x09\xc6\x2a\x6e\x14\x69\x67\xcd\x73\x0e\x04\x5e\x5a\x92\xf2\x9f\xf6\xb2\x7a\xf7\x62\x0e\x1f\x42\x5f\xe0\xeb\xc6\x8d\x7d\xfa\xe5\xe3\xbb\x8d\x1e\xfb\xc4\x58\x29\x7a\xcc\xf0\x07\xea\xbf\x88\x61\xda\xb4\x0b\x99\x6e\x97\x63\x4b\xf3\x4a\x50\x90\xd9\xce\x1c\x1a\x72\xd6\x5c\x2f\x35\x28\x65\xa5\xcc\x4d\xfe\x51\x9e\x8a\xbc\x9f\xc6\xc5\xe9\x47\x96\x77\x8b\xc8\x17\xa2\xfe\x6a\x18\xcb\x6f\x4f\x4e\x01\x88\x20\x19\x75\xfc\x9c\xbe\x46\x16\x50\xfc\x32\x94\xa4\x34\xc1\x6b\xae\x34\x1d\x1f\x49\xca\x23\x91\x65\x75\xc4\xfb\x43\x47\x41\x1c\xc8\x99\xa0\x40\x34\xd1\x6a\xdd\x5b\xf3\xe3\x7e\x57\xa4\x61\xbb\x78\x9b\x4f\x3e\xdb\x6f\xdc\x75\xb8\x71\xdd\x6c\xe3\x59\xcf\x9d\xc2\x87\x03\x3f\x5b\x13\x19\x9f\x6c\x4c\xd5\x79\x90\xe4\x19\x9f\x6c\x4e\xd5\xc9\xa6\x50\x94\x91\xf1\x96\xc8\x37\x85\x88\x1f\xbc\x20\xbc\xe7\x52\xa0\xf8\x99\x2d\xa0\xf6\xab\xf6\x0e\x88\xbf\xe3\x95\x78\xdb\x72\x2c\xf0\xa1\xe6\x7d\xce\x73\xb7\xdf\xf2\x8e\xba\x4f\xd2\x5b\x9e\x7d\x22\x29\x22\x5d\xd5\x67\xcb\xbb\xdc\xdf\x4c\xb0\x99\xca\x9a\xa2\x2f\x05\x0f\x01\xb3\xb0\x4f\xc8\xd3\x02\x65\xd2\xbd\x6f\xc2\x3b\x56\x7d\x4b\x1d\x6c\x4d\x54\x8e\xf2\x93\x3a\x92\xfc\x9c\x33\x81\x5b\x10\x21\x03\x2b\x79\xff\x85\x03\xec\xb7\x6a\xcc\xf5\xf5\x1b\x27\xd5\xe2\x7b\x77\xcd\x7b\x45\xed\x4c\x2f\x91\xc7\x07\x38\x4c\x76\xfa\x11\x6d\x63\xc4\xd7\xad\xdd\x67\x05\x4b\x9f\x4e\xd0\x33\x77\xaa\xf2\x02\xa0\xbd\x30\xe9\x11\x2d\x15\x79\x4c\x68\x72\xd3\x5e\x06\xe4\x24\x59\xbf\x95\xc9\x06\xc4\x39\xbf\xdd\x0f\xf3\x9b\x93\x74\x96\xde\x4d\xf9\x49\x00\xaf\x03\xf4\x4d\xcb\x9d\x07\xe5\x80\xe5\x91\xc8\xed\xe8\xab\x02\x72\x40\x20\xfd\x28\x12\x5a\xea\x96\xeb\x82\x58\x9c\xf8\x02\x9d\xa6\x1a\xd4\x71\x69\xf3\x5d\xa5\xc3\xb3\x89\xc7\xf5\x37\x0e\xbb\x08\x95\x83\xe3\x69\x9a\xa4\xee\x97\x1c\x76\xd5\x0e\x66\xa9\x39\xf6\xf0\xa2\xf7\x8b\xce\x32\x6c\x79\x59\xce\x85\xbc\x00\xf0\xc3\x7d\xb9\xf5\xc9\x33\x16\xb2\xb4\x90\x16\x62\xd6\x1a\x28\x73\x76\xd1\x11\x15\x45\x8e\xee\x08\x68\x2d\xfe\x7a\x10\x5a\x5b\x31\x46\xbb\x6d\xed\x79\x0d\x3b\x7b\x8f\xc3\xf4\xea\x71\xdf\xea\x78\x3f\xeb\xcc\x5b\xbb\x45\x61\xe9\x2a\x96\x4a\x34\xe0\xea\x95\x07\xab\x9e\x16\x6e\xd9\xdf\xda\xd2\xa6\x2a\x2f\x51\xef\x93\x45\x56\xe2\xfb\x27\xbc\x9f\x70\x86\xaf\x6f\x99\x93\x48\xa9\x49\x46\x42\xa1\x6f\x5a\xe1\x95\x25\xc7\x42\x7a\x5d\x0b\xf3\xac\xd1\x13\x69\x03\x99\x7b\xa1\x20\x1d\x31\x41\xaf\x4c\x35\xcf\x39\xfb\x31\x2d\xab\x94\xdc\x7b\x11\x5e\x1d\xce\xed\xfd\xa7\xfd\xec\xd7\x1d\x76\xb1\x6f\x26\x8d\xbd\x6d\x97\x49\xbd\x1d\xff\xfe\x65\x8b\x6d\x93\x24\x36\x94\x58\x7b\xc2\x4a\xac\xbd\xd1\x9b\x19\x9d\x58\x6b\x14\x3f\x2a\x69\xf0\xcb\x35\xc3\xba\xfd\xe9\xda\x05\x30\x6f\xbf\xac\x96\x19\x59\xb3\xe4\xcd\x0c\xe3\xd5\x86\x82\x47\x07\x07\x23\x22\x8c\x2a\x9d\xcb\x98\x06\x68\x1a\xd7\x45\x28\x07\x96\x99\x4c\x6b\xc0\x3e\x86\x60\xe8\xa1\xad\xc0\x47\xb7\x7b\x85\x97\x53\x1d\x10\x54\x12\x27\x61\x35\xcb\xc2\x21\x4e\x44\xfb\x39\xf4\x03\xed\x04\xf0\x35\xe0\x4b\xe0\xed\xae\xf3\xe7\xc9\x15\x59\x94\x72\xca\x24\xac\x51\xb6\xcb\x55\x1f\xce\x60\x54\x0c\x40\xc2\xd0\xd4\x74\x37\xd8\xad\xa3\x3d\xa1\x15\xab\xee\x98\x9c\x0f\x74\x98\x2a\x9b\x4f\xaf\xa0\x79\xa5\xbd\xe5\xe8\xfa\x09\x2a\xf2\xdd\xd9\xcb\x1d\x66\xae\x03\xf7\x05\xbb\x9b\xe6\x37\x1a\x65\x6d\x35\xcb\xab\xd3\xc2\x9b\xec\x25\x17\x59\x79\xd0\x1a\x02\xf9\xf6\xa5\xe3\x52\xba\x87\xed\x9b\xa2\xa4\xbd\x2e\xcf\xe3\x82\x6c\xb7\x28\x71\xee\x65\xde\x9b\x6b\x8b\x85\x63\xc8\x37\xec\xf1\x7c\x2e\xcc\xd6\xad\x04\xd9\xd9\xdb\x97\x9a\x8c\xcd\xc2\x1f\xfc\xf8\x4d\x4b\x3c\x90\x4f\x80\x4c\x05\x93\xae\x4a\x35\x86\x63\x30\x01\x46\xfb\x05\xc3\x14\xa9\xd4\xfa\x1d\x05\x43\x6e\xe2\xf2\xca\x92\xef\x4a\x62\xa1\x1c\x97\xeb\x78\x4a\x87\xa0\x0a\xeb\xab\x6d\x79\xa4\x25\x41\xae\xa8\x12\x7d\x64\xb8\x9a\xde\x4c\xc3\x5c\x8a\xc7\xb6\x68\xea\x97\x94\x2f\x48\x59\x63\x93\xcd\x58\xa4\xd9\x5a\xd8\x23\xcc\x1b\xd0\xd7\xa4\x9a\xbd\x74\xfc\x44\x18\xf7\xcf\x02\x57\x79\x4b\xc0\xe4\x39\xe7\x4c\xe0\xeb\xf3\x73\x36\x3c\xe4\x04\xfb\xed\x1a\xdb\xdf\xc9\x96\x07\x3d\xe1\xde\x53\xf3\x7e\xa9\x66\x38\x53\x4c\xef\x36\xed\x51\xa0\x6a\x0d\x92\x3e\xdf\xf4\x91\xf4\x9d\x0c\x06\xcb\x61\xef\x28\x3f\x1e\x67\xfd\x54\x14\xc1\x09\x9d\x52\x51\xa1\xae\x7c\xa1\xcc\x01\xda\x3c\xed\x4f\xf1\xaa\xca\xe5\xe7\xc7\x51\xd2\x67\x47\xb9\x27\xce\xe6\x57\x79\x75\xee\x9d\xed\x64\xf2\x9f\x38\xef\x64\x5e\x93\xcf\x77\x35\x31\x35\x9c\x63\x29\x23\xbc\x25\xe8\x05\xb9\xc7\x1b\x14\x09\xbb\x65\x98\xbc\xdc\xdf\xcc\x04\x4e\xc4\x96\x9c\x88\xf2\xb6\x30\x05\xe6\x3b\x6b\xec\x20\x38\xbd\x21\xad\xfa\x5c\x4d\xa5\x55\xbf\xb8\xb6\x0c\x5e\x6a\xba\xa3\xa6\xca\x36\xdd\x39\xdf\xe1\x49\x37\xcc\x73\x45\x58\x12\x14\x01\x04\xea\x21\xd9\x81\x54\x8a\x94\xeb\x66\x97\xdd\x9c\x28\xcf\x21\x97\xe7\xa4\xe9\x2c\xf0\x67\x30\xee\x4e\xf9\x50\x72\xab\x4e\x7e\xc6\xbd\x19\xaf\xc9\x97\x30\x75\x38\x22\x8e\x5d\x2a\xa2\x78\x4e\xca\x45\x55\xa0\xac\x8a\x77\xd8\xe3\x93\x49\x0a\x25\xcb\xd9\x1c\x09\x45\x3b\xdd\x4b\xe5\x90\xe6\x03\x0c\x23\x2a\x31\x9c\xfc\xb9\xc3\x26\xe4\x2c\x3f\x1d\x47\x03\xf7\x8b\x8e\xf7\xbb\x8e\x42\x5a\xf5\x72\x20\x5b\xcb\x13\xf9\xa9\xb6\x20\x26\x6a\x9c\x4c\x8b\xf4\x46\x51\x76\x18\xd3\x79\x05\x54\x79\x24\x6e\x87\x02\xb6\xec\x3f\x0f\xa8\xe2\xbd\x07\x68\x42\x18\x1a\xd4\x7b\x1d\xa6\x17\x9d\xfb\x0e\xc7\x7b\x9d\x73\x06\xb9\x1e\xe7\xe7\xd4\xa2\x2a\x1c\x6f\x28\x12\x4a\xa2\x8a\x4f\xce\x76\xfd\xbb\x92\xd8\x58\xfe\x53\x0f\xf8\x44\x7e\x6d\x8d\xfd\xbb\x2a\x41\x4c\xca\x28\xf6\xb8\xfb\xbf\x1c\xef\x2a\xfb\x92\x15\x64\x42\x53\x47\x69\xb0\x28\x46\xe3\x24\x50\xbc\x3d\xe7\x1c\x86\xc1\x06\x0b\x7e\xbe\x66\x49\xa4\xd7\x39\x4c\x30\xe3\xa6\x7b\xbb\xf7\xb4\x39\xfd\xab\x1c\x02\x80\xcf\x29\xee\x19\x91\x8a\x0a\xd7\x68\xcb\x00\x70\x30\x1b\x7a\x98\xb0\x15\x26\xbd\xc7\x9a\xbe\x72\x5d\x67\x2c\xc5\x7c\xe3\x1b\xe3\xec\xf1\xa5\x08\x1d\xa9\x76\xb7\xb5\xf3\xe0\x4c\x26\xd2\xf9\xb8\x93\xb8\x1f\x1a\xf7\x9e\xa5\x7e\x50\x50\x4e\x5e\xa2\x9e\x29\x82\x7e\x21\x2e\x26\x16\x22\x20\x20\x11\xed\xef\x53\x37\x9b\x50\x4c\xa8\x6c\xd0\x76\x7c\xd5\x67\xc7\xd8\xaf\x38\x6c\xac\x1f\x06\xee\xdb\x1d\xef\xb5\xce\xac\xa2\x14\xc5\x6d\x17\x5d\x88\x8a\x0e\x81\xec\xc4\xf0\x45\xc5\xb0\x1c\x76\x05\xf9\x04\xd5\x9d\x30\xa3\x68\x96\x80\x92\xdc\x11\x52\x1e\xee\x99\x21\xbe\x3a\xbc\x30\x08\x68\xa1\x0d\x50\xf3\x29\x85\xf6\x9e\x99\x9f\xcb\x2c\xed\xf2\x39\x6c\x42\x16\x06\xdd\xbf\xe0\x1d\xd3\xf4\xa9\x48\xd9\x01\xd5\x97\x72\xbd\xb2\xd6\x9a\x28\xd5\x6f\xe7\xe1\x06\x76\x90\x5d\x7a\xcc\xf6\x41\x20\xaa\x2b\xbc\xeb\x66\x47\x26\xe8\xab\x68\x96\xc2\xac\x50\x0c\x67\x22\xcf\xea\x8f\x63\xdf\x37\xda\xef\x6d\x1e\xdd\x9f\xc1\xf6\x83\x49\x27\x73\x6f\xf1\x9e\xa8\xda\x02\x06\x15\xbc\x6c\xf7\x2c\xc4\xc7\xe6\x3c\xe9\x6c\x15\x04\xf4\xa9\xea\x44\x16\x43\xdc\xb9\xff\x69\xc2\x7b\xaa\xf1\xdb\x5a\x7e\x5a\x7d\x31\x8c\x3a\x05\x00\x4d\xa1\xce\xe8\xd5\x78\x10\xde\x18\x5a\x8c\x1f\x3f\xc0\x5e\xe4\xb0\x03\x59\xbf\x05\x4b\xf1\xac\xb7\x0e\x8b\xd0\x20\xd6\xa1\xa5\x06\xf6\x63\xa4\x38\x51\x4e\x5e\xf8\xc2\xa1\x6c\x78\x31\x92\xae\xd3\xb4\xd8\x85\x3d\x8f\x4f\xe2\x93\x87\x32\x20\x30\x9a\xb2\x86\xf4\x23\x35\x76\x11\xd5\xe2\xf8\xd9\x5e\x8a\x4e\x85\xe3\x67\x7b\x3e\xd0\x06\xf4\x2e\x60\xa5\x6e\x12\x72\xf2\x66\x0a\x46\x03\x09\x57\x96\xf0\xd3\x10\x94\x56\xc5\xac\x5c\x04\x85\x64\xfc\x87\x26\x6f\x9b\x5d\xbc\xe3\xd4\xec\xc9\xe3\x53\xc4\x60\x4c\xb5\x2c\x10\x62\xcc\x9a\x18\xc5\x6d\xdb\x23\xaa\x1e\xb2\x0b\x50\xd3\xa3\x7a\xc9\xef\x74\xfb\x79\xdf\x8f\xa2\x01\x17\x67\x89\x58\xac\xc4\x16\x5f\x8c\xb1\x1b\x78\xb7\x97\x07\xd2\x20\xf8\xcd\x8d\x4e\x1b\xdd\x51\xfc\xa4\xd4\x80\x81\x0b\x17\x5f\xe5\x87\x8e\x1e\xb2\x3e\xf9\x07\x0e\x7b\x24\x7e\x33\x4d\x7a\x3e\x22\x39\x22\xfd\x67\xf9\x6a\xe1\xae\x42\x03\x41\x17\x37\x74\xd9\xac\x1e\x3d\x55\x64\x34\x93\xce\x68\x32\x40\x2b\xba\x60\xe2\xbe\xd8\xf4\x07\xdc\x4f\x93\x7e\x1c\x10\x15\x00\xb0\x7e\xca\xb3\xda\xc9\xd2\x87\x4f\x49\x45\x9d\xe2\x46\xcb\x41\xfd\xc0\xc7\x1f\xc6\x7c\xa6\x39\x73\xd8\x6a\xd7\x51\xda\x38\x8e\x78\x8f\x87\x37\xe0\x28\x00\xcc\xda\x50\x87\x53\x1a\xbe\x0a\x17\x9e\xf5\x6e\x6e\xa8\x3e\x6b\xde\xb3\x4e\x92\xde\x2f\xaf\x35\x30\x18\xbb\x03\x4c\xdb\x75\xbc\x44\xe7\x00\xd9\xaa\xcd\x30\x13\x7c\x12\x94\x17\x9e\xa4\xa6\x6e\x3b\x65\x4f\x1c\x78\xc4\x36\xe6\xbc\xd4\x4e\xfc\xad\x4c\x36\x80\x80\x89\xaf\x4e\x78\x87\x8c\xdf\x04\x4f\x6c\x51\x8c\xaa\xb4\x94\xca\x40\x89\x7b\x0e\xec\xb9\xff\x76\xeb\xfe\x5b\x55\xd1\x0d\x3f\xe2\x7d\xbf\x4e\xf5\x55\xb1\xf9\xe6\x08\xec\x3c\x2f\xb7\x72\xc0\xf7\xfc\x8c\xbb\xf0\x33\x7e\xc6\xcc\x39\xfc\xad\x5d\xe6\x1c\x3e\x2c\x30\x2a\xee\x73\x5a\xdb\xfb\xaf\x9e\xe2\x3e\x59\xfb\xaf\x8c\x49\x55\x72\x61\x19\x12\xa4\xec\xc4\xfa\xe0\x41\x2b\xba\x59\xe7\x03\x55\xd1\xca\x82\x44\x7a\xd9\x41\xef\xa9\x23\xee\x55\x49\xa7\x8a\x47\x47\x88\xaa\x4f\xee\x89\xaa\x5d\x8b\xaa\x81\x12\x55\x3d\xef\x50\x05\x2a\x41\xd5\x60\x98\x42\xeb\x28\x7b\x12\xbb\x66\x7b\xde\xe1\xaa\xb9\xb1\x27\xbc\xf6\x84\x97\x25\xbc\xda\xdb\x0b\xaf\xa7\xba\x37\x5a\x98\xb6\x43\xf4\xc6\x7c\x34\x3b\x32\xc8\x32\xf6\xd6\xba\x95\xcd\x38\x8a\x13\xb5\x79\x1b\x32\xb9\x86\xf1\x2a\xb1\xd1\xba\x7f\xfd\x44\x6f\x65\xe8\xaa\x79\x66\x8b\xb9\x2e\x4d\xf3\x4a\x2a\xad\xb6\x48\x70\x90\x57\xb4\x33\x2f\xe3\x61\xce\xfd\x5e\x2f\x82\x13\x72\x52\x9c\xe6\x2e\x6e\x1b\xe4\xb7\xe7\x9c\x8b\xb2\x30\x10\xc7\x3b\x1d\xd1\xce\xb3\x73\xce\x63\xf4\x77\x16\xc5\x46\x28\x36\x49\xda\xd9\xc2\xf1\x83\x57\xb0\xd7\x8c\xb3\x51\x8f\xba\xf7\x8d\x79\x5f\x19\x9b\xad\xbe\xa9\xb0\xe0\xd3\x00\x7c\xb0\x4a\x16\xf4\xe0\x88\x24\xaf\xac\x94\x5e\x5c\x51\x63\x82\x92\x56\xf5\x8d\x38\xdb\x43\x10\x93\xd9\x85\x79\xe5\x98\x01\xe3\x42\x8e\x29\x69\xfd\x4c\xf0\x4e\x98\x66\xb9\x7a\xdd\x4c\x61\xa4\x13\x4c\x98\x2b\x83\x73\x46\xec\xff\x71\x61\xd0\x56\x1f\xb5\xb0\x4e\x61\xa1\x43\x09\x96\xa5\xba\xa8\x43\x5d\xd1\xf4\x22\x4b\x70\x14\xf1\x8e\x1f\x46\x05\x12\xb9\x12\xfd\xf3\x1d\xc4\x69\x04\xfb\x5e\xa0\x87\xd4\xce\xbb\x55\x9f\xd6\x19\x9a\x45\xad\x00\xbf\x5e\x25\x1c\x52\x06\x03\x44\x46\xe8\x27\x34\x76\x2b\x44\x81\x2f\xcc\x93\xd8\xaa\x9b\x8c\xa2\x05\x2f\x6e\x51\x55\x59\x72\x4b\x48\x81\xa5\x82\x05\xc1\x56\xef\x87\x51\x5f\x9e\xb7\x50\xea\x6e\x61\x9b\x78\xb7\xc3\x2e\xa1\xa7\x11\x3b\xdd\x3d\xe7\x78\x2f\x77\x6e\x36\x2f\x59\x7c\x70\xd6\x76\x05\x5e\x7a\x43\x96\x16\xb3\x5e\x4b\x55\x79\xec\xc3\xa4\xf4\x80\x37\x8a\x9e\x41\x94\x58\x79\x73\x1e\xa9\xce\x92\x94\xcb\x8f\xda\xa7\x1f\xb8\x62\x56\xf7\xaf\xf6\xb1\x4b\x71\x50\x34\x14\xf0\x17\xf6\x5d\x00\x7f\xe6\x2b\xf7\x9d\xb6\x4a\xe5\x81\x68\x43\x66\xbf\xa6\x0b\x53\x4c\xb1\xc5\x20\xe8\x48\x78\xca\xa5\xa6\xbd\x67\xcd\xcf\xf0\xfc\x28\xb7\x29\xf0\xd9\x64\x4d\x6e\xd7\x59\xae\x2a\x21\xbb\x00\x4e\xc2\xfe\xaa\x1f\xc6\x59\xce\x5b\x09\xb1\x54\x27\x51\x80\xb5\x81\xd1\x8d\xc5\x26\xfd\xb2\x79\x75\x81\x9a\xb5\xcc\xa0\xea\xe3\xce\xa9\xd2\x8b\x14\x33\xad\x3c\xcd\x86\x1d\x4a\xb6\xd0\xc1\x6f\xf2\xb2\xca\x45\xa5\x9a\x35\xf9\x2c\x8f\xfb\x51\xa4\x1d\xf5\x45\x5d\x94\x69\xc1\x47\xe2\x32\xcc\x0d\xa8\xcb\x71\x2b\x6a\x58\x7a\x06\xed\x8e\x53\x94\x90\x90\x18\xad\x20\x0e\x61\x30\x2d\x62\x1f\xf1\xc9\x28\x04\xee\xbd\x39\x88\xbf\xed\x8a\x38\x5f\x4c\xa2\xa8\xe5\xb7\xd7\xe1\x7d\x29\xc7\x17\xd2\xe4\xac\x4e\x19\xa7\xb8\x00\xc5\xe9\x5a\xd1\x64\x24\x59\x33\x86\x46\x3b\x9c\xf5\xe1\xdc\xe6\x9a\x4e\x7a\x79\x23\x8c\xeb\xbc\x25\xda\xbe\x94\x48\x22\x0e\xd0\x22\x09\xca\x43\xb6\x1e\xf6\x4a\xb3\x5c\x4f\x85\x01\xcf\x44\xae\x15\x13\x35\xea\x73\x36\x99\x25\x66\x61\x5b\x13\xaf\xae\xa8\x84\x69\x2c\xc4\x86\x48\x91\x4c\xb0\xc9\xfe\x6a\x5c\x91\x27\xfc\xf1\xb8\xf7\xd2\x71\x24\x49\x28\x36\x19\x48\xaf\x32\xb6\x0f\x59\x1d\x79\x49\xef\x2f\xd3\x06\xb1\x61\x66\x35\xb5\xed\xa7\x72\xf1\xb5\x92\x7e\x8e\x4e\xd0\x8a\x1b\x48\x01\xa2\x82\xb2\xc2\x8e\x14\xbf\xaa\x96\x77\xf8\xf1\xe0\x0e\xa0\xdf\x68\xf2\x5b\x93\x4d\x01\x82\x2a\x34\x92\x60\x7a\xa9\x90\x1b\x3b\x2f\x36\x49\xbd\x4d\xd0\x8e\x80\x32\xf1\x64\x3f\x1f\x71\x17\x44\x4a\xc1\x30\x2b\x0a\x32\xe0\x18\x63\x0a\x72\x45\xbc\xde\xd6\x6a\x99\x14\x4c\x1b\x30\x03\xd0\x58\x18\xe6\x6b\xb2\x21\x14\x45\x23\xa2\x01\x0f\xc2\xcc\x6f\x45\xaa\xc8\x1e\x04\x5d\xd6\x77\x51\x4b\x88\xa3\x16\x18\x82\x0e\x98\x19\x89\xb9\xf3\x6b\xed\x51\xee\x27\x43\xfa\xc2\x31\x6b\xf3\x30\xbf\x53\xf9\x80\x4a\x69\x31\x65\xf9\xad\xec\x66\x36\x77\xde\x24\xef\x4d\x39\x70\xb7\x87\xf9\xda\x69\x3d\x79\xd8\xeb\x1c\x66\xe9\x19\xee\x8f\x3b\xec\xf8\xf9\x97\x5c\x41\xd7\xef\x3d\xc5\x22\xef\x2f\x51\x8b\x9a\xa9\xdd\x9a\xa5\x1f\x39\xb3\x29\x71\x34\x60\x6f\x38\xc0\x2e\x82\x99\x47\x1b\xd4\xcb\x0f\x78\xdf\xdd\x6f\x5c\xb0\xcb\x5c\x13\xdc\x83\x55\xe3\xe1\xce\x6f\xe4\x91\x93\x1c\x8c\xdb\x49\xd7\xc0\x33\x96\x4a\xc9\xf0\xae\xe4\x01\xa9\xbb\x27\x45\x8f\x77\xfc\xce\x7e\xb8\xe1\x47\x22\xce\xbd\x26\x63\x0d\xe4\x7b\x3f\x4a\xc5\xf9\x1a\x49\x58\x09\x95\x30\xe7\x82\x18\xe1\xd5\x82\xf1\x0d\xbd\x24\x85\x65\x63\x81\xa8\x84\x1d\xca\x3a\xc0\x34\x33\x4a\x95\xeb\x26\x01\xbe\xb1\x11\xfa\x52\x33\xcc\xa6\x37\x66\xea\xea\x0f\x08\x1f\x41\x79\x5f\x10\xc0\x16\xd7\x5b\xfd\x5c\x77\x03\xd6\x4b\xa5\x4d\xae\xf8\xbd\xf0\x16\xf0\x64\x1c\x7d\xb6\x27\x0b\xf3\x9e\x2b\x0b\x55\xe7\x66\x79\x75\x63\x46\x5e\xd3\xa2\xe3\x28\x7f\xb6\x67\x54\xcf\x7b\xee\x4a\xdd\x68\x75\x9e\x58\x55\xe2\xd0\xae\x72\x85\x68\xd7\xa2\x75\x5a\xb1\x73\x61\xbf\xea\x7e\x1e\xee\xdc\xb0\xa3\xfa\x23\x33\x91\xef\x23\x54\xc8\xc2\x18\xc9\x96\xeb\x52\x80\xc6\xd8\x61\xe4\xe7\x92\xba\x14\xf1\x6b\xa7\x4a\xdd\x7a\xc0\xbb\x5f\x5e\x7f\xf8\x75\x7f\x4b\x28\xa3\x05\x39\x71\xf1\x45\x72\xcc\x57\x8d\x89\xe5\xc2\x30\x96\x81\xe5\x47\x55\x74\xaf\x5f\x75\xbc\xcf\x38\xcb\xa5\xc8\xb4\xa1\xbd\xb2\x89\x26\xf5\xc2\x07\x81\xe1\x91\x77\xf6\xfd\x08\xba\x1b\x01\x7b\xea\x3c\xec\xfa\xab\x82\xf4\x57\xcb\x23\x5e\x27\xdf\xb0\x67\x3c\xe1\x55\x05\xc5\x59\x4a\x91\x55\x44\xd5\xd3\x49\xba\xea\xc7\x0a\xa0\x41\x0b\x1f\x3b\x8c\xee\x20\xbb\x4c\x67\xcc\x68\xfd\xf3\x77\x0e\x5e\x00\xfd\xf3\xc7\x0e\x9e\x2a\x17\xbc\x13\x15\x14\x23\x25\x49\xbb\xd1\xfa\xa8\x49\x71\xab\xeb\x5b\x24\x14\x6c\xa9\xfe\xcd\x5b\xba\x2c\x81\xa3\xdb\x14\x55\x18\x84\xa1\x55\xdc\x30\x53\x80\x22\xf8\x75\x3a\x33\x69\xab\x81\x52\x86\x4a\x25\x67\x7a\x85\xaa\x9d\x1d\x28\x72\x03\x3d\xf1\x21\xee\x0f\x37\x57\xa9\x79\x65\xa5\xa9\x69\xad\xe0\x51\x5d\x33\xd0\x19\x4f\x9b\xc0\xfd\x50\xf4\x06\x69\x8d\x65\x3a\x19\x2f\xed\xc7\x40\xdc\xe8\x01\x22\xcf\x61\xdc\x00\x66\xbc\xeb\x39\x06\xf6\xc8\x73\x97\x8a\x61\xd1\xda\xa4\x2f\x77\x78\x40\x58\x38\xca\xbd\xa1\x09\xe2\x1d\xe5\xff\x9e\x71\xee\x41\x87\x1d\x3f\xdb\x4b\x05\xac\x87\xcc\x3b\xca\x9f\xcd\x38\xe7\x70\x57\xfe\xcf\x5b\x17\x03\xef\xa8\x51\x85\xba\xba\x81\x7a\x18\x14\xe5\x9d\x4a\xf2\xf9\xb8\xb8\x85\x5b\x96\x2e\x0b\xae\x1d\xd6\xb7\xb9\xac\x3b\xfd\xfd\x5c\xf8\xf7\x05\x4c\xfe\xf5\x02\xc6\xe6\x3b\x5c\x11\x11\x98\x21\x4b\x20\xad\xce\xbf\x2f\xcb\xfd\x08\xdb\xb0\xe1\x0d\xc5\xee\xec\xa5\x49\x80\x3d\x9a\xe5\xfe\x6a\x18\xaf\x7a\xd7\x3f\x78\xdd\x6a\xd6\xa6\xb2\x67\xb7\xeb\x56\xa8\xbd\xd1\xb3\xaa\x0d\xd5\xfd\xbb\x24\xc4\x05\x20\xb7\xa6\xb3\x91\x8e\x61\xa5\x19\x0f\xf1\x08\x76\x10\x6d\x56\x88\xeb\xfb\x79\xde\xf8\xdf\x63\xcc\x34\x2e\xb9\x5f\x1f\xf3\xbe\x38\xb6\x54\x5c\x40\xad\xdb\x90\x47\x6b\x61\xa6\xa7\x88\x3c\xf5\x02\x85\xbb\xc0\x87\x9b\x7c\xb6\x2d\x1b\x08\x0e\xf5\x42\xaf\x3a\xca\x4f\x25\xb1\xa8\xc3\x7f\x4f\xc7\x73\xe9\x60\xb1\x1f\xf3\xc9\x4d\xa5\x4f\x2b\xb8\x6b\xb9\xe5\xaa\xbd\x4b\x1e\xbd\x20\x34\x53\x85\xbb\x2d\x25\x5d\x30\x17\x9c\x89\xc1\x68\x32\xd5\xe4\x5a\x1f\x87\xb9\x67\x56\x03\xb3\xb0\x8a\x20\x1c\x1f\x0e\x09\x71\x3b\x8c\x42\x32\xda\x40\x88\x62\x9d\x67\x61\xdc\x16\xc6\xbe\x4a\x90\x5d\x68\xa3\x47\xb3\x91\xcf\x3b\x7d\x48\xc4\x37\x11\x6b\x8a\xfd\xad\xbd\xe6\x87\xb1\xb6\xf2\x59\x95\x90\xdd\x85\xa1\xa8\xb1\x10\x05\xbc\x56\x90\xc4\x02\xb7\x1a\x38\x25\xe8\x85\x13\x60\xb7\x68\x38\x96\x82\x4c\xa7\x9f\x27\x0d\x5d\x25\x3c\xbf\x0e\xb4\xaa\x54\x18\x87\xa8\x13\xd4\xb8\x3d\xf9\xc9\xaa\xaf\x64\xb7\xc9\xee\xb3\xb6\xb5\x37\xd4\xd8\xa5\x79\xd8\x15\x49\x3f\x5f\x82\x00\xfc\xcc\xfd\x09\x1d\xf1\xf8\x2d\x67\xd9\xba\x65\x58\xb9\x20\x28\x18\x6f\x16\x16\x33\xbd\xcb\xcf\x76\x72\xda\x82\xd4\x33\x10\xc0\x9d\xd5\x4b\x27\xd1\x28\xd2\xcd\x43\xd2\xfb\x80\x53\x34\xb8\xd4\xdc\x8a\xfb\x60\xed\xb2\xc0\x07\x4a\x46\x2e\x38\xc8\xaa\x6f\xa1\xc7\x40\x65\x11\x51\x72\x1a\x47\x55\xe7\xca\xc3\x1c\x13\x0d\xec\x13\xfa\x4c\x71\xd9\x0a\x70\xfc\xe6\x25\xec\xda\xfb\x79\xf6\x71\x7f\xf5\x12\xef\xb6\x8a\xeb\x36\x28\x88\x05\xf0\x24\x4f\x29\x60\x06\x59\x3e\xb1\x24\x1f\x8b\xc9\x1b\xa6\x27\x07\xf5\x9c\x65\xe0\xfd\xbd\x8b\xd9\xc7\x1d\x36\xd1\xf6\x6f\xea\xc7\x41\x24\xdc\x0f\x38\xee\x78\x6b\x90\x0b\xef\xad\xce\x8a\xba\xb8\x82\xbb\xf8\xc2\xf1\x93\x5c\xc5\xe8\x1f\x9b\xe5\x2d\xb8\x47\x42\xa1\x1c\xe7\x4e\xb6\x51\x61\x7e\xf7\x90\x8e\xab\x37\x08\x1e\x60\x73\x37\x62\x18\xea\x5c\x05\x0a\xa7\x72\x04\xd2\x24\xc9\x33\x35\x6a\x52\x09\xc2\x02\xe4\x31\x0b\x42\x35\xcc\xc9\xf8\xd2\x1a\x3b\x40\x00\xbc\xee\x77\x1c\x76\xd3\xf9\x9f\x41\x29\xb5\xbc\x88\xa3\x7f\xaf\xb3\x42\x25\x52\x1f\x0c\x81\xbe\xd0\xed\x8a\x59\x7c\x1c\x2d\x66\x45\x01\x49\xca\x57\xfa\x69\xb4\xa2\xe7\x56\x11\x94\x0c\x7b\x6a\xc9\xa2\x94\xf6\x31\x07\xd3\x8c\xcd\x41\x75\x87\xa8\x4f\x21\x8e\x17\x75\xe1\x7e\x26\x8a\x0f\x35\xd9\xb7\x27\xd8\x58\x3f\x8d\xdc\x6f\x4e\x78\x5f\x9d\xc0\x6f\xae\x86\x1b\xb4\xee\xa2\xc4\x4e\x5d\xd4\xba\x6e\x18\x17\x09\x17\x67\x16\x4f\x60\x1e\xc6\xe4\x0a\x78\x26\xc5\xd1\xe9\xe9\xb5\x24\xcb\x8f\xf6\x92\x34\x9f\xee\xf9\xf9\xda\xca\x54\x13\x4f\xb3\x44\x6a\x95\x74\xa8\x75\x89\xd9\xe6\xaa\xa6\xca\xc5\xb6\x22\x0b\x5b\x51\xd5\x47\xe8\xc8\x0e\x2a\xaa\xbe\xee\x53\xd5\x03\x76\xeb\xaf\x47\x3c\xbb\x35\xa3\xc5\x2a\x56\x07\x95\x12\x5c\xce\x10\x1b\xd4\x0d\x57\xd7\xc8\xbe\x93\x25\xd1\x06\x6d\x0f\x1a\xde\x64\xee\xd4\x12\xb4\x5a\xee\x0a\x7a\x72\x65\x48\x51\x56\xe7\x2b\x08\x17\xa1\xae\xaf\x28\x73\x11\x95\xc5\xc3\xb8\xa1\xf4\x4f\x59\x90\x9f\x95\xac\xac\x3e\x8f\xfc\x81\x40\x2f\x64\x98\x20\x54\xcb\x54\x53\x35\x5d\xef\x4d\xf2\xc9\x98\xcf\x2f\x70\x3f\x08\x20\x9c\x83\xb1\x85\x48\xf8\x52\x4d\x4a\x72\x15\x0a\x09\x21\x63\x2b\x72\xe8\x22\x7c\x5d\xf6\xf2\xcc\x91\x6b\x9b\x87\x9b\x87\x9b\x33\x2b\x08\x75\x4a\x25\xcb\xb9\x13\x66\xeb\x03\x2e\x95\xc1\x2c\x83\x79\x92\x4b\xc9\xb0\x2a\xb7\x48\x30\xd4\x15\x5a\xaf\xb1\x0f\x27\x00\x49\x09\x1d\x97\xd1\xb2\x96\xcf\xf8\xb1\xb1\xf0\x48\x05\x80\x6e\x55\x1b\x12\x48\x1d\xc3\xd7\x60\x2e\x02\xe0\x62\x93\xe3\x02\xb7\xe5\x97\xa3\x70\x5d\x60\x30\x5d\x0b\x81\x04\xe4\x8c\x92\x5b\x3d\xa6\xa4\xd5\x61\x32\x08\x3f\x83\x47\xf2\x7e\x1a\xf3\x7e\x0f\x2d\x77\xb1\xd8\xd4\x88\x0a\x38\x8b\x70\x6a\xea\x49\xe6\x81\xd2\xe4\x5d\x0f\x93\x43\xce\x60\xba\xb1\x1a\x92\x10\xf4\x94\x56\xe5\x35\x19\x9b\xc5\x70\x41\x03\xd9\x94\x6c\xe0\xe0\xa3\x82\x43\x2d\xed\xe4\x52\x81\x25\x77\x72\x4f\xa4\x20\x3b\xa4\x6a\x02\x95\x3a\xb3\x78\xa2\xc9\x9f\x49\x48\xb6\x6a\x62\x42\xc1\x79\x02\xdb\x16\xf4\x5f\xda\x0a\xf3\xd4\x4f\x75\x31\x65\xdb\xbb\x95\xd3\x56\xf0\xc0\xeb\xc0\x57\xd9\xe0\xd9\x3c\x97\x5a\x19\xbd\x2e\x3f\x45\x48\x7a\x49\x2a\x37\xb7\xb0\x0d\x81\xab\x84\x59\x2b\x6f\x1c\x95\x9f\xdf\x4c\xd2\xe0\xa9\x9e\x3e\xb3\xa0\xb5\xaa\xc9\x6f\x4e\xfd\x55\x34\x59\x4c\x7a\x97\x37\x9b\x4d\x6f\x0a\xda\x8e\x88\x63\x06\x50\xe2\xa4\xf7\x14\xba\x0b\xb0\x0f\x79\x81\xcb\x87\x0e\x01\x4b\x00\x7f\xee\x31\xcc\xdb\x1a\xf3\x12\x70\xea\xde\xfd\x18\xef\x49\xb3\xbc\x74\x55\xe7\x82\x95\xb3\xab\x7d\xf3\xc9\xe6\x39\x47\x67\xa3\x9d\x73\x34\x93\xca\x39\xe7\x22\x12\x05\xa7\xca\xdc\x79\x1f\xf9\x37\xec\xa7\x6b\x6c\x22\x15\xbd\x28\x6c\xfb\x99\xfb\x42\xad\x9e\x7c\xd3\x51\x17\x8d\x34\x29\x80\xd8\x8a\xfb\xdd\x96\x40\x72\x63\xf5\x04\xc9\x4a\xcc\x32\x5b\xd6\x1c\x2a\xcb\x6b\x42\x8e\x43\x2a\x8a\x27\x55\x0a\x90\x88\xb3\x22\x03\x66\x00\xcf\xc0\x3a\x88\xf3\x50\x59\xdd\x3b\x45\x04\xb5\x2a\x12\xcd\x6f\x61\x1c\x84\x1b\x61\xd0\xf7\xa3\xa2\x5c\x90\x15\x88\x96\x88\x0e\x0b\x4c\x17\xc0\x29\x92\x0f\x86\xf7\xd1\xc0\x30\xc0\xcc\xd8\x7a\xc9\x2f\xd7\xd8\xa3\x53\x81\xa0\x4f\xb7\x86\x59\x9e\xa4\x83\x13\x61\x37\xcc\xdd\x57\xeb\xde\xf9\xae\x53\xf5\x80\xea\xa9\xae\x7f\x16\x10\xf7\xcc\x9e\xc2\xa7\x4b\x24\x34\x5d\x3f\xc4\xd0\x4c\x4d\x0a\x69\x8c\xe6\xa1\x4c\xbf\xc6\xd7\xf0\x2b\x28\xbb\xcb\x57\x55\x83\x31\x39\x1d\x32\x20\xd5\xd7\x50\x20\x17\x14\x82\xa0\x6c\x13\xf1\x64\x34\x20\xaf\x78\x30\x34\xdb\xb4\x35\xcf\x04\x87\xdd\x50\x39\x6b\x10\xe7\x69\xf4\xd7\x3b\xcd\x24\xc8\xd7\x5f\x88\x24\xc8\x2f\x38\x66\x12\xa4\x3f\x0c\xf8\x57\xf0\xf9\xd0\x1e\x59\xc4\x95\xd2\x94\xe0\x6d\x4a\x11\xca\xcb\x81\xa7\x26\xcf\xcf\xa1\x4c\xbb\x94\xce\x33\x5f\x64\x27\xa7\xcb\xe9\xcb\xe1\xdf\x86\x3e\x49\xb2\xef\xd4\x98\xb9\x16\xdd\xbf\xa9\x79\x5f\xa9\x19\x17\xaa\xec\x67\x6a\xbf\x87\xe6\xae\xca\xef\xc6\x14\x2b\x6f\x2e\x7d\xc2\xf9\xa6\x67\x87\x53\xf5\x4a\x93\x4b\x3b\x34\x53\x91\xf5\xe4\xf4\x69\x99\x70\xa7\x18\xb2\xa6\x57\x4f\x51\x93\xbc\xc9\x17\x64\xd7\xaf\x8a\x5c\xee\xea\xa0\xf4\x18\x70\xcc\x68\x55\x50\x42\x5e\xaa\x11\x47\x65\x77\x6b\x20\xcc\x06\x8a\xc2\xa6\xd1\xe2\x26\x4d\xaf\x66\xb6\xd1\x6e\xaa\xfd\x0b\x76\x72\x65\x8d\xac\x28\x00\x24\xb6\xa2\xb0\xa7\xbc\x84\x6a\x88\x5f\x4b\x02\xbf\xbb\x66\xd0\x4b\xfd\x7c\xed\x7e\xd0\x4b\xfd\xb5\xa3\x49\xcf\x68\xa4\x4c\xdf\xab\x8d\x21\x0a\xf3\xac\x8a\x72\x2a\x04\x03\x51\xbf\xd3\x09\xdb\x21\x82\x47\x28\x21\x96\x02\x40\x00\x1c\x42\x9b\xfc\xb8\xe2\x8b\xcd\x72\x1f\xf8\xf7\xe5\xf1\xab\xa2\xb1\x78\x88\xeb\x47\x1d\x88\xfa\x90\xb3\xc0\x16\x97\x24\x15\x29\xdd\x45\x8f\xa9\x0e\x2d\x48\x05\x86\x9e\x94\xca\x6d\xb2\xaf\x3b\xec\xd2\xbe\x0d\xc3\xfc\x59\x67\x0b\xdc\xc2\x6d\x51\x9c\xbd\x57\x39\xfd\xad\x70\x9b\x47\xe3\x3b\x5b\xfd\x28\x5b\x07\x38\x52\x72\xa3\x47\x4c\x63\x98\x94\xc3\x22\x14\xc1\x2d\xfd\x42\x62\xc2\xb4\x09\x40\xc1\xd3\xdb\x14\xfb\xee\x18\x7b\xf4\x46\x81\x5d\xa8\x6e\x80\x9d\xe6\xf5\x63\x55\x77\xec\xf8\x3d\xc0\xae\xa4\x15\x00\x82\xc9\x40\xe8\x05\x55\x52\x9d\x8a\x50\x9e\x8e\xc0\xa2\xae\x58\x8b\x5d\xbf\x07\x69\xd4\xa5\xf5\x18\x12\xd2\x29\x7e\x16\xf4\xac\x4d\x7f\xa0\x00\xd1\x43\xf3\x00\x6c\x2c\x60\x82\x45\x3f\xbe\x21\x85\x28\xe2\x7b\x5a\x81\x3c\x20\x32\x70\xae\xe4\x5c\x6a\xd8\x39\x1c\x5c\xb4\x35\x7a\xb2\x35\x00\xb1\xa4\x50\xbd\x30\x9d\x26\x8c\xe1\xa9\x22\xc5\x80\x06\xa1\x20\x52\x9b\xad\xfa\x98\x54\xb8\x33\xa9\x48\xb6\x45\x00\xe7\x45\xa4\xe5\x8e\x07\x3a\x7d\xb7\x54\x4e\xbd\x38\xa7\xeb\x9c\xaa\xe6\xce\x83\x24\xb7\x84\x07\x66\xf7\x8c\xb3\x47\xf5\x92\xe0\xa4\xce\x0f\x26\x7f\xe8\x9b\xc7\xbd\x57\x8d\x57\xdc\x50\xc3\x86\x8e\x51\x3d\xe4\x6a\x7d\x13\x9e\x06\xd4\x83\x68\x93\x05\xef\xf7\xea\x38\x1b\xe5\x6a\xf7\xdb\xa0\x2d\xcb\x17\x93\x18\x12\xfe\x32\x88\xf7\x80\x07\x14\xcd\x72\x90\x6c\x96\x76\x60\xb4\xc7\xc8\x99\xb2\x72\x1a\xe3\xc6\x16\x85\x1f\x0c\x56\x94\xe3\x66\xa8\x26\x61\xcc\xc3\x58\xfe\x80\x03\x12\x06\x11\x4c\x4a\x79\x7a\x98\x0e\xc9\xf2\xef\x99\x3a\x17\x79\x7b\x4a\x1b\xd8\xca\xf8\xe8\x9b\x7e\x98\xf3\x7e\x9c\x87\x91\x41\x61\x8d\x09\xd8\x03\xb5\xbb\xc8\x77\xc2\xb8\x2f\x65\x3b\xc1\x0b\x18\x8d\xa8\x2b\x71\x98\x91\x2e\xd8\x4d\x36\x0a\x8d\x27\xe9\xf5\x92\x0c\xd2\x37\x64\xf5\xb0\xc1\x7e\x04\x47\x50\x48\x5c\x33\x1a\xbd\xe0\xa7\x7e\x14\x89\x68\xc5\x34\xab\x10\x94\x66\x8f\x24\x40\x8f\x9e\x29\xdc\xd2\xa6\xee\x8a\x63\xa1\xe2\x17\x64\xcb\xc2\x78\x15\xf7\xc2\x24\xa6\xbb\xb2\xca\xc4\x8e\x00\x51\x36\xa0\x52\x61\xed\x73\xcc\x35\x37\xf7\x94\x0f\x5f\x6a\x25\x3b\x16\x2e\x42\x8d\xc3\x42\x61\xde\xee\xab\x2f\xf5\x7e\x72\x4c\x61\x6f\x54\xc4\x64\x83\x57\x93\x40\xc0\x61\x1b\x0d\xe3\x56\xd2\x8f\x03\xc3\x58\x95\xa1\x38\xf1\xa9\x55\x2a\x14\x4c\xb1\x3c\x90\x7e\xd7\xf2\xdb\xeb\x22\x0e\x20\x95\x5e\x7d\x8f\x5c\xaf\x2a\xae\x8e\xe0\x16\x64\xff\x2a\x52\x26\x7d\xee\x8f\x06\x0d\xf8\x04\x18\x98\xfb\x69\x94\xd5\x79\x94\xf8\x01\x6f\xf9\x91\x0f\xa6\x9d\xd4\x97\x5b\x57\x9d\x63\x2e\x92\xec\xfc\xa5\xa5\x13\x75\x9e\x74\x3a\x0a\x41\x0b\xad\x89\x1b\x61\x9a\x4b\x25\x5d\x2a\x09\x40\x80\x9e\xb7\x9b\x7c\xee\xf8\xc2\xe2\xf1\x63\xb3\xcb\xc7\xe7\x78\x03\x75\x16\xf4\x21\xab\xe8\xc4\x22\x71\x03\xf3\x2b\xa5\x8c\xf0\x49\x75\x1d\x0a\xa5\xd7\x6e\x58\x95\xeb\xc1\x97\x84\xa0\x4d\xad\x30\x12\x18\x56\x7e\x93\x79\xd8\x3a\x08\xbd\x96\xed\x85\xb9\xef\x01\xf2\xed\xd1\xb9\x5e\x50\x24\xb9\xaf\x28\xce\xf1\xcf\x3b\xec\xda\x91\x7b\xf3\x68\x91\x09\x2a\xf7\x6b\x1d\xd3\x00\xa2\x05\x39\xc4\xa9\x91\xd6\xaa\x57\xff\x03\xdc\xb0\x32\x7f\xeb\x9f\x15\xd4\xe5\x7f\xe8\xb0\xeb\xee\x4f\x0b\x91\xa7\xfc\x9c\x63\x63\xcd\xd1\x09\xfd\x61\xd1\xca\xfb\x9c\xe7\x6c\x9f\x33\x70\x9d\x7b\xad\x4e\x78\x2a\x5a\x5b\xce\x74\xaa\x24\xa1\xfe\x95\x09\xcb\x2c\x96\xb6\xfc\x36\xb1\x9a\x88\x9b\x10\x4b\x1e\x12\x9c\x5e\x3a\xe1\x4d\x97\xae\x55\x6d\xa2\xc6\x23\x59\x65\x3e\xd3\xbd\xfb\xf7\x04\xfd\x05\x4c\xbd\xfc\xc1\x2a\x96\x55\x63\x0c\x4c\x15\xfd\x30\x6b\xb2\xfa\xc8\x45\x52\x31\xf0\x7b\x3b\xca\x2e\x76\x94\x8e\xb1\xa1\x3c\x6b\x77\xb9\x4b\x8f\xdd\x62\x33\xb9\xcf\x89\xb7\x17\x0f\x4f\x77\xe7\xb5\x78\x80\x71\xb6\x59\x7b\x4a\x79\x91\xa5\x65\x5e\xce\x8d\xfc\xc8\x98\x25\x30\x0a\x8a\xd0\x76\x2a\xf2\xe3\xf1\x06\x21\x5e\xbd\x76\xcc\xbb\xc7\x29\x5d\xa4\x98\x0e\xe0\x6b\x81\x3b\xe0\x86\x20\x58\x4d\x1a\xf5\x61\xd8\x02\x0c\x20\x20\xa7\x4a\x19\x98\x9f\xc0\xbb\xb0\xb8\x43\x19\x9f\xf3\x73\x9f\x1c\x6e\x70\x86\xd0\x53\x0e\x9e\x5e\x17\x83\x06\xce\xda\x9e\x1f\xa6\x19\xf7\xb3\xea\x2f\xda\xca\xe9\xef\x3b\xec\xc5\x2a\x16\xf0\xf9\x5e\x62\xc2\xb0\x90\x6d\x21\xbf\xc0\xf6\x4b\xb0\xe9\x4d\x5f\x1e\x6b\x66\x37\x9a\x54\x73\x6c\x42\xb9\x83\xdc\x27\x79\x57\x28\x40\x22\x33\x2e\x8e\x3a\x56\x79\x9d\xe8\x64\x62\xe5\xd9\xbf\x99\xb1\x9b\xef\x57\x7e\x98\x15\xb8\x0d\xdb\xc2\x17\x0e\x7a\xa7\xb7\x7f\xcc\x96\x4f\x5b\x3f\x5f\x9d\x06\xfb\x17\x7b\x69\xb0\xbb\xde\x36\x5e\xad\xe9\xb9\x5f\xe6\x78\x87\x4e\xec\x6c\x34\xcc\x0d\x64\x99\x2d\xb2\x85\xf3\x8f\x5b\xd8\xfa\x0b\x7b\x9b\xcc\x1e\xa7\xb0\xc9\xbb\xfd\x62\x67\xfb\xfd\xcc\x77\xef\x68\xd0\x66\xb5\xbd\xf0\x29\xed\x5f\x3a\x9b\xb6\x7a\xbe\xd2\x5e\xc8\x5e\x78\x80\x5d\x51\xb1\xcb\xcd\x25\x9b\xf1\xa6\x9f\x06\x52\xf0\x98\xf8\x8e\x9f\xdb\xef\xbd\xca\x19\x71\xd3\x44\x03\xd3\x98\x63\x06\xdf\x69\x40\xaf\x41\x5c\x98\xec\xe5\x26\x9f\x33\x2f\xed\x06\x51\xd1\x12\xa2\xbf\xb2\x8f\xbd\x7b\x9c\x5d\x44\xe6\x4c\xa0\xb8\x7a\xc3\xb8\x72\xa9\xbe\x64\xfc\x34\xed\x2c\x47\x81\xbe\x89\xb7\x42\xf4\xce\xf6\x33\x40\xc0\x55\x36\x4d\x40\x4b\xe4\xad\x81\xb2\x8a\x36\x11\x61\x07\x22\x4a\xaa\x4a\xd0\xbc\x48\x22\xd7\xf1\x09\x94\xd5\xb5\x83\x22\x63\x9e\xb4\x73\x25\x5a\x75\xb8\xdb\xe1\xc3\x87\x0f\x43\x8b\x0f\x5f\x7b\xed\xb5\x98\x44\x17\x88\x76\xd8\x1d\x7e\x10\x9e\xba\x7a\x66\xa6\xc9\x9f\x39\x7b\xf2\x04\xd0\x53\xf5\xf2\x0c\x33\x12\xb1\x64\xc8\x60\x35\x5f\xce\xea\xfc\x69\x4b\xa7\x4f\x15\x7c\xa2\xf6\x5d\x32\x66\x51\xf3\xec\xac\xce\xc3\xd7\x5c\x75\x55\x93\xcf\x85\x29\xb8\x1b\x43\xd2\x5c\x0c\x0a\xc0\x22\x50\x01\x22\x18\x95\xf7\x0c\x3c\x87\x90\x11\x46\x7e\x44\x1d\x19\x14\xc6\x60\x33\x8c\xc2\x76\x8e\x16\x78\x8c\x2c\x27\xc2\x3e\xb2\x56\x42\x59\x18\x39\x18\x46\x90\xdf\x21\x90\xfe\x8f\x77\x32\x48\xc9\xa8\x9b\x39\xda\xfd\x28\x57\xe6\x48\x2c\xac\x18\x2b\xa4\x45\x35\x5c\xcb\x2f\x50\x3b\x46\xee\x3d\xb1\xe2\xa4\x11\x0c\x4f\x53\xa8\xc2\xf9\x3b\x06\x86\x96\xce\xcd\x61\x24\xd8\xd7\x0e\xb0\x27\x54\x3c\xfc\x8c\x7e\xd2\x1a\xe4\x36\xc0\xea\xfb\x0f\x78\x2f\x75\x2c\x80\x55\x7a\x8a\x60\x28\xa1\xa7\x22\x3f\xcb\x15\x48\x4d\x47\xe4\xa1\x42\x40\x02\xcf\x8c\x7a\x5e\x2d\xb7\x20\x41\x40\xa6\xad\x56\x5d\x92\x8e\x80\x31\x25\x99\x32\x38\xe7\xec\x37\x00\xfa\xd4\x42\x7c\xd9\x7e\xf6\x0c\x36\xde\xcf\x44\xea\xce\x7b\x37\x9c\xc9\x30\xb4\xac\xeb\xf7\x34\x22\xa1\xa2\x9c\xb4\xa6\x57\x26\xd2\x70\xa3\x2d\xfc\x36\xf8\xd6\x21\xbc\xc6\xdc\x0c\x02\x46\xdf\x72\x9f\xe5\x9d\xbc\x4d\x83\x75\xeb\x9d\x34\xc7\x24\x4a\x0d\x01\x06\x74\x09\xe8\x46\x50\x2b\xd1\xee\x03\x4e\x2e\x27\xcb\xe0\x7e\x0b\xdb\x07\x02\xd4\xbd\xd1\x9b\x81\xc9\xb5\x5d\xd5\x31\xba\x07\xa5\xae\x59\xd0\x0b\x4d\x7c\xcd\x0d\x6f\x4d\x23\x67\x82\x2f\x05\xbd\xaa\x09\x6e\xee\xa2\x5c\x31\x8c\xcf\x52\x70\xb4\xb0\x30\x0a\x6c\x2a\x43\xca\x6c\x0b\x39\xf5\xa7\x50\x09\x1c\x2b\xf7\xf3\x8e\xf7\x3b\xce\x22\xfd\xb2\xa5\x76\x16\xc6\xab\x11\x04\x67\x77\xfb\x51\x1e\xf6\xa2\xa2\x4a\xfa\x05\x6d\xc9\x2f\x71\x7c\x53\xf7\xfb\x19\xd7\x31\x8a\x70\xfc\xe0\x93\xba\x2c\x21\xf7\x4d\x4a\xd0\xcb\x44\xcf\x4f\x8b\x84\x03\xb9\xbb\xfa\xd9\x14\xb9\x5c\x7c\x38\x3d\x91\x95\x4a\xbe\x05\x41\x38\x54\x81\x8e\x06\x54\xb5\x94\x84\x37\x38\x6c\x7f\x2e\x62\x3f\xce\xdd\x57\x3a\xde\x8b\x9c\x65\xf8\x5b\x4e\x68\xa5\x4c\x61\xe0\x50\xa9\x8f\x49\x6c\xdd\x84\xde\x0c\x7e\x26\x53\x35\x0a\x06\xb1\xdf\x0d\xdb\x80\xe2\x56\xb0\xb3\x95\x27\x4f\x56\x2f\x22\x56\x0c\x00\x78\x4c\x4d\x35\xab\xf7\x17\x63\xec\xf0\x68\xee\x6d\x5a\x5e\x65\xda\xed\xf7\x8c\x79\xcf\xad\xbe\x65\x1d\x04\x0a\x26\xe2\x41\x4f\x10\x4a\xe4\x40\x4b\x4f\x4d\xc3\x8b\x2e\x2c\xf3\x85\xe6\x39\x67\x3c\xed\x47\xf6\xb2\xfd\x8d\x1a\xf3\x19\x5c\x76\x9f\xe9\x9d\x00\x86\xda\xb0\x8a\xf1\x78\x0b\x6a\x6f\x4a\x7b\xb0\xc8\xb3\x41\xe8\x16\xfd\xf1\x05\x87\x5d\x9a\x09\x68\x9a\x6a\xed\x6f\x39\x6c\x7a\x5b\x11\x4a\xdd\x41\xef\x78\x3f\xed\xd8\x85\x14\xf4\x94\x14\x5d\xe9\x67\xd7\x17\xd7\xe4\xd4\x91\x9b\xee\x62\x3f\x9e\xcd\x76\x78\x96\xcd\xfd\x6c\x1d\x4e\xb4\xe8\xd2\x6a\xf4\x92\xa0\xa1\x1d\xd1\xd3\x99\x68\xf7\xd3\x30\x1f\xc0\x25\x71\x36\x9f\x66\x7f\xf0\x04\xf6\x58\xa3\xde\x2d\xc8\x64\xdf\x98\x69\x3e\x2d\x69\x41\xe4\xdd\xfb\x9e\xe0\x5d\x4b\x7f\x1b\xa1\x1c\x2a\xf7\xf5\x79\x49\x8b\x8b\xb3\xa2\xdd\x2f\x20\x2d\xa2\x24\x59\x87\x7d\xae\x69\x44\xdb\x59\x23\xf6\xb5\xc7\xb3\xb7\x8f\xb1\x8b\x94\x53\x32\xcc\xba\xee\x6b\xc6\x94\xc6\x73\xf7\xd8\x92\x15\xf2\xaf\xc2\xc6\x86\x03\xed\x28\xdc\x09\x2b\x41\xc7\x43\xe8\x42\x24\x33\xc7\xe5\x83\x08\xa5\xe0\x3e\x6d\x83\xdf\xad\xf4\xbe\x11\x2f\x0c\x81\xc0\x03\x95\xec\x4d\x61\x15\x10\x0d\x0b\x94\xff\xa0\x10\xd0\xdb\xe0\x92\x9e\x9c\x6c\x02\x17\xa8\xa2\x4d\x90\xc3\xd9\xe0\x4d\x34\x10\x37\x0b\x36\x86\x29\x7e\x03\xc7\x27\x8d\x16\x4f\x11\x9b\x02\x94\x04\x71\x9d\x49\xba\xce\x23\xd1\x41\x06\x2e\xc8\x19\x2c\xbe\xdd\xf5\xcf\x72\xe3\xe5\xf3\xb6\x6b\xc8\xc2\xa3\xc4\x0f\xb2\xe9\xc2\x8f\x9d\x4d\x3f\x2f\x69\x65\x8d\xb4\x1f\x37\xf2\xa4\x51\x34\x62\xda\xd2\x35\x5e\xbd\x8f\x1d\xc8\xfa\x59\x4f\xc4\x81\xfb\xe3\xfb\xbc\x7f\x1e\x5f\xc2\x1f\x46\x62\x86\x69\xe7\x78\x5a\xd2\x32\x5d\xe5\xea\xd0\x8e\x4b\x19\xe2\x51\x92\x54\x6e\xe0\x84\x71\x22\x1f\x0f\x8b\x3c\x1c\x4c\x25\x51\x1f\x40\x43\x14\x02\x1a\xc6\x09\xbe\x6d\xfa\xf1\x49\x76\xd9\x9f\xb4\x0b\xa6\xb2\xa4\xcc\x87\xfc\x10\x78\x15\xa8\x34\x35\x95\x45\x27\xf2\x57\xf9\x6a\x22\xe8\xfc\x89\x18\x89\xf4\xdd\xa9\x7a\x55\xa3\xca\x5e\x70\xc2\x92\xc5\xfa\x0d\x25\xa6\x85\x99\x7c\x1f\xb0\x21\x52\x82\x7b\x94\x53\x79\x15\x46\x3d\x4c\xb9\x1a\x1a\x70\x3d\xa7\x7e\x5b\x60\x82\x2a\x62\x98\xc0\xfb\x4d\x4e\x7d\x8e\xf4\x16\xb2\x36\x64\x44\x53\x39\x6c\x4b\xb9\x9f\xe6\xcb\xa1\x26\xd4\x27\x33\xd8\xd3\x92\x56\x9d\x92\x82\xc2\x0d\x11\x0d\xf0\x0d\x7d\x58\x9f\x85\xcb\x73\xc2\x0f\xa2\x30\x16\x2a\xe1\x46\x2e\x18\xa9\xf8\x24\xa4\xf4\x86\x99\x66\x70\xa2\xd2\xa5\xc0\xb6\x68\xfd\xa9\x7a\xb2\x62\x16\x79\x28\xea\x03\x44\x1d\x7a\xbd\x81\x44\x69\x30\xf8\x48\x71\xab\xf3\xb4\xf5\x80\x6f\xab\x21\xfc\x45\x8d\x7d\x8f\x5f\x55\x7f\xf7\x53\x18\x8e\x7a\xcd\x55\xde\xaf\xd7\x6c\x49\x12\x28\x6c\x03\xb9\xd6\xa9\xb5\x52\x3f\x84\xd1\x53\xa9\x19\xba\x27\x35\x10\xbd\x94\x2e\xb4\x29\x50\x40\x47\xd2\xcf\xa2\x81\x1a\x76\x23\x92\x50\x67\xa1\x50\x2c\x52\x11\x0a\x10\xe6\xd7\x97\x72\x84\x20\xbc\x23\x84\x8c\x00\x58\x68\xa3\xe6\xed\xa4\x9f\x17\xb3\x16\x22\x11\xd3\xa4\xbf\x0a\xac\x5a\x68\xf3\x98\x22\x42\x24\x1c\x37\x98\x18\xe6\x90\xcb\x7e\xcd\x93\x5e\x4f\xa8\x71\xcb\x54\x00\x98\x9a\xd9\x18\x62\xd5\xef\x2a\x68\x18\xfb\xac\xf1\x91\x03\xec\xd2\x42\x36\xc0\xe9\xf4\xdd\x07\xbc\x37\x1d\x38\x66\x5d\x33\xa4\x81\xdc\x19\x16\x92\x80\x9b\x52\x11\xb2\x07\x52\xa9\xb2\x04\x10\x7b\x4a\x07\x9d\x95\x53\x49\x3c\x1f\x07\xe2\xac\x08\x56\xf8\x24\x1d\x33\x01\xbe\x65\x45\x5d\x6e\x32\x66\x3d\x85\x2c\xe8\x7a\x6c\x94\xfc\x28\xc0\x58\x14\xfa\x86\x6e\x23\xe0\x01\xc1\x38\x89\x98\x0f\x0b\x6c\x8b\x34\x47\xbd\x1c\xc0\x62\xa6\x60\x43\xbb\x31\xf2\x73\x6b\x49\x37\x89\x92\xd5\xa4\x0f\xa3\x0c\x81\x27\x30\xb7\x65\x65\x47\xd5\x14\x65\x9f\x1a\xe2\x55\x01\x80\x27\x86\xb4\x30\xbf\x20\x8b\x40\x69\x74\x58\x7e\xa0\x72\x9b\x99\x99\xaa\x17\xc8\xe4\x3a\x3b\x30\x8e\x13\x32\xa2\xe2\x3e\x6e\xef\x09\xcf\x4b\x5a\x86\x9c\x6f\xc0\x77\x70\x6f\xdc\x59\x3f\x86\x19\x84\xb5\x8d\xee\x32\xcc\x49\x00\xae\x49\x2c\x1b\xa2\x9e\xb4\xc2\xa9\x3b\xa7\x5e\x31\x10\x43\x59\x3f\x30\x5f\x57\x86\x36\xce\x22\x3f\xa8\xd8\x1e\xe5\x57\xef\x94\x9b\x3b\xe4\xd5\xfd\xc8\xd5\xe0\x95\x30\xe1\x78\x41\x7c\x35\x20\xcd\x59\x85\xf8\xc2\xa1\x64\x2d\xc1\x14\xc0\xd6\x80\xab\x44\x1e\x18\x31\x94\x59\xe4\x60\x86\x3a\x97\x85\x1b\x6d\xc1\xc6\xb0\x21\xbb\x36\x4d\x6d\x40\x35\x57\xc3\x82\x79\x9c\x3a\x25\xbd\xb4\x9d\x24\x2d\xf8\x34\x42\x6f\x07\x0a\x74\x3d\x07\x00\xaf\xf8\x90\x61\xe9\xae\x97\x03\xd1\x30\x4f\x1d\xc5\x40\xa6\xe3\x94\xe5\x6e\x63\x01\xf6\x8d\xb1\x8b\x8c\x8e\x76\x3f\xaa\x55\xad\x77\x95\x54\xad\x61\x15\xcb\x1a\x6a\xa9\xe7\x66\x6b\x22\xa8\x54\xbc\x5a\x90\x7a\x85\x3e\x21\xce\x97\xd4\x36\x93\xf0\x38\x8c\xca\x6b\x81\x4a\x45\x43\xff\x00\xa3\x79\xc3\xd5\xd8\x8f\xb2\xa1\xdb\x14\x64\xa6\x28\x00\xa3\x64\x33\x33\x15\x21\xf9\x01\x8c\xce\x84\x72\x48\xa4\xc2\x84\xb3\x6b\x31\x63\xd6\xc1\x2c\x00\x62\x2f\xbb\x21\x41\x54\xcc\x14\x09\xb5\x45\x25\x54\x08\xeb\xa8\x4a\x52\x4f\x3c\x88\x4a\xd9\x97\x1c\x23\x64\xfb\x5e\xe7\x7e\x84\x6c\xbf\xce\x99\xdb\x59\x58\x36\x2c\x7f\xd2\xf0\x41\xfd\x78\xc0\x5b\xca\xbe\x35\xce\x1e\x93\xe7\x11\x6d\xe8\x90\xd8\x7b\x33\x4d\x3d\xf7\x8b\xda\x32\xfa\x9b\xe3\x23\x9e\xc1\xf1\xac\x32\x28\xc9\x85\x07\x8d\x5c\xf3\xb3\x62\x36\x17\xc7\x97\x49\x02\x2c\x3b\xa6\x64\x1f\x81\xc4\x01\x4a\xb6\x22\x39\xd0\x32\x05\x30\xc1\x47\xd5\xc1\xd7\xe9\xc8\x20\x38\xf0\x72\xa6\xb8\xa5\x44\x14\xae\x42\x3c\x33\x6a\x48\x7e\x3f\x4f\xba\x7e\x4e\x87\x77\x62\x4f\x20\xe1\x69\xec\x72\x2d\x81\xf4\x7b\x70\x5b\x16\x95\x41\xfb\xda\x83\x76\x24\xf8\x6a\xdf\x4f\xfd\x38\x17\x82\x52\x11\xe5\x37\xfd\x28\xbc\x4b\xa4\xd9\x94\x1e\x54\x12\x77\x15\x8d\x21\x3a\x2a\xf5\xb5\xcd\x44\x4a\x9e\xd1\x55\xab\xea\x0c\xd9\x98\xbb\x44\x9a\x14\xa5\xb4\x44\x3b\xe9\x8a\xa1\xe6\x2a\x7a\x88\xb0\xdb\x15\x81\xdc\xfd\xa4\x32\x05\xfd\x15\xe6\xba\xab\xca\x80\xea\xbb\x90\xe0\xcb\xcb\x27\xec\xc1\x21\x39\x6e\x2b\x3a\x29\xbb\xb8\xe5\xb7\xd7\x93\x4e\x07\xd3\x9a\x5a\x6a\xa2\x9d\xb4\x85\xa4\x99\xbe\x84\x9a\x9e\xa2\x7d\xf2\xc1\x65\x8c\x1d\x23\x25\x63\x07\xa6\x8e\xad\xca\x5e\x63\x7d\xf3\x9e\x7d\xec\xd2\xae\x1f\xf7\x7d\x9d\xe4\xe3\xbe\x7d\x9f\xf7\x73\xfb\xec\x6b\x45\x60\xf5\xaa\x88\x15\x42\x1a\x9e\x5f\x95\xe5\x42\xf6\x08\x48\x28\x8d\xce\xc0\x4f\x00\x9f\xce\x8a\x5d\xd4\x0a\x0e\xb4\x99\xe5\x09\x27\x2a\x91\x02\x08\xff\xa6\x62\x14\x82\x9c\x8b\xa4\x08\x5c\x36\x91\xe3\xd5\x3c\x21\x6d\xb7\x17\xb6\xd7\x55\x35\x28\x9b\x42\x65\x74\xca\x4e\x00\xb9\xdd\x93\xca\xac\xec\xbe\x24\x2b\x8c\x2d\xc9\x50\xde\x51\x93\xd3\x9c\x87\x23\x5f\xae\xd8\x4d\x2a\x72\x00\xe4\x47\x65\x5f\xd3\x07\x8d\x5e\x20\xd4\x06\x75\xc6\x29\x90\x66\x38\x61\x4c\x42\x70\x83\xac\xb3\x6f\xbd\x0d\x2a\x3e\xc2\xf0\x41\xdd\x21\xf8\x19\xa4\x81\x14\x53\xb0\x91\x25\x39\xef\xf4\x63\x0c\xaa\x6a\x27\x69\x2a\xda\x79\x34\x68\xf2\x02\x92\x4e\xa5\x74\x66\x62\xa8\xe3\x9f\x2c\xdb\xb4\x22\x15\x02\x2c\x0e\x44\xad\x30\x0e\xb3\x3a\x90\x3f\x89\x02\xbe\x32\x8c\xa9\xb4\xc2\x67\x17\xe6\x1f\x58\xc1\x7b\x79\xd1\x77\x8d\x41\xd2\x4f\x1b\xc9\x66\x0c\xe6\x23\xd5\x89\xd6\x09\xec\x8d\x66\x7e\xdb\xcf\x5c\x88\xfc\xb6\x4f\x3a\xb3\xe7\x95\xd3\xd6\x03\xc5\x1c\xf2\xd9\x4e\x25\x69\x57\x4a\x28\x6b\x66\x66\x22\xcf\x4c\x31\xd5\x41\xb6\xa9\x07\x29\xa9\xed\xfd\x07\x19\xb7\x36\xe2\x24\x0d\xe4\x61\x90\xdc\xef\x27\x84\x9f\x09\xf7\x3f\x1e\xf4\x7e\x00\xfe\xd2\xf6\x51\x9f\x63\x88\x36\x7d\xdd\x76\x15\xbe\x70\x62\x2f\xde\x62\x2f\x1e\xfb\xa1\x0b\x6c\x78\x9f\x19\xd8\xf0\xce\x5d\xc7\x63\xaf\x3e\x58\x21\xd7\x9f\x50\x21\xd7\xbf\xe9\xb0\x23\x5b\xe8\xca\x15\x4b\x14\xb4\xe5\x97\x39\x95\x04\xde\xf0\xc0\x83\x1f\x79\xfc\x23\xdb\x87\x62\x5c\xef\x5e\xa7\x43\x0b\xad\x66\x95\x82\x0a\xa1\x05\xe5\x50\xc2\xd7\x33\x8b\x66\x61\xcb\x2c\x31\x08\x37\xfb\xeb\x83\xde\xb1\x91\x77\x4b\xa8\xfe\x55\x8f\x71\xf0\x66\x57\x87\x98\xbd\x6b\x62\x6f\xc5\xee\x85\x22\x15\x8d\xdb\xdb\x00\x77\xbb\x01\xfe\xa1\x0e\x38\xbc\xd7\xf1\x5e\x2c\x75\x2e\x85\xb2\x5f\x10\x4a\xaa\x70\x28\x48\xa6\xbd\xdf\xac\x91\x45\x81\x0d\x45\x20\x59\x5c\xc2\x2b\xf8\x85\x0b\x94\xb2\x7a\x9f\xe3\x6f\x2f\x1a\x6f\x74\x6f\xd0\xa2\xd1\xf3\x0a\xda\x86\x51\xf2\xab\x2c\x1d\xdf\x33\x6e\x71\x0d\x0f\xb3\x2c\x1f\x69\x1e\xa7\x9c\x41\x8b\xdd\xfc\x9f\xc7\xbc\xcf\x38\x55\x77\x76\xc2\x6f\x5e\x85\x1d\xe9\xc7\x83\x61\x6a\x66\x8b\xea\x9c\x47\x22\x5e\xcd\xd7\xe4\xd8\xde\xd9\x17\x7d\x8c\x5b\x8a\x92\x7e\xc0\xbb\x22\xcb\x00\x4d\x50\x85\x47\x40\xa2\xed\x33\x16\x96\x50\xf2\xc9\x23\x03\x25\x36\xa6\xda\x43\x9a\xf4\x73\x40\x99\x83\xdc\x6e\x40\x24\x00\x92\x74\xac\xa1\x66\x4b\xb7\x84\xf7\x7f\xa8\xb1\x17\x39\x8c\x1e\x71\x07\xa3\xf5\x85\xca\x6e\xc4\x4e\x9a\xd7\x78\x36\xde\x93\x14\xef\xb8\xc9\xed\xa8\x83\xcd\xe9\x26\x45\xc7\x10\xca\x2c\x6a\xe3\xec\x05\x9a\x31\x3b\xdb\x22\x23\x69\x74\x25\x96\xe1\x65\xef\x1a\xfa\x54\x09\x94\xce\x64\xaa\xae\xe2\x16\x67\x1f\xbf\x8c\x35\xce\x4b\xd4\xba\xaf\xba\xcc\x7b\x8b\xa3\x7e\x19\x7e\x77\x25\x72\xe9\x48\x34\x88\xf3\x35\x91\x87\x6d\x83\xe5\x43\x67\xac\xd7\x09\x05\x18\x78\x01\x00\x08\x45\x76\xc9\x86\x9f\x86\x49\x1f\xc1\x15\xfb\x99\x86\xf9\xe6\xb3\xc5\x5e\x29\x85\x16\x18\x55\xc1\xc0\x42\x38\x5d\xff\xbe\xd0\xdb\xea\x5c\x55\xec\x05\xf6\xf1\xe4\xab\x8f\x60\x7f\xed\xc0\xa9\xb0\x73\x22\x8c\xd7\xdd\xaf\x38\xde\xa7\x1d\xf5\x0b\xf7\xec\x33\x8b\x27\xca\x5b\xb5\xc1\x7b\xb1\x40\x49\x07\xda\xb7\xab\x18\x9d\x17\x55\x18\x51\x93\x31\x23\x57\xd6\x98\xfe\x88\xe9\x99\x27\x3d\x4d\xfa\xa7\x4b\x57\x40\x5f\x7c\xa6\x79\xe4\xb0\xce\x81\x55\x86\x5e\x6d\x61\xea\x45\x7e\x1c\x6b\xb8\x44\x23\x1f\x7b\xa6\x79\x64\x46\xbd\x66\x59\xd6\xff\x7c\x9c\x4d\x90\x4b\x50\xb8\x5f\x1c\xf7\x7e\x6f\x5c\xfd\x32\xa2\x48\x14\xee\x3f\x98\x32\xe4\x6f\x1f\x0d\x94\x0a\xa0\xae\xb0\x27\x81\x50\xe6\xa9\xc8\xfb\x69\x2c\x02\xc2\x22\x31\xa0\x20\x94\xf5\x1c\x51\xb5\x80\xf7\x41\xca\x65\x98\x0e\xda\x15\x84\xfe\x1c\xed\x72\x49\x7a\xfe\x9d\x7d\xa1\xf7\x22\x03\x6d\x2f\xcc\x32\xb8\x81\x46\x0e\x03\xdf\xb9\xa4\xf6\xc8\x69\x26\xbf\x18\x98\x40\x05\x09\x19\xbf\x88\xb1\x39\x16\x67\x81\x23\x11\x76\x52\xed\x94\xd2\x73\xeb\x98\xce\x83\xb7\x71\x88\x50\x89\x28\x1c\xc0\xbd\x44\xa1\x64\x75\xcc\x96\xda\xb4\x27\xb2\xdd\xed\x35\x3f\x5e\x45\xe4\xc6\x2e\x3a\x5f\x7d\x29\x2c\x3b\x62\x93\x77\xc3\xb8\x0f\xa2\x54\x4e\x60\xe4\xf0\x57\xf8\x40\x38\xbd\x95\xa2\x80\xe3\xae\x7a\x1b\xed\xdc\x8a\x65\x13\x5d\x61\x38\x92\xd8\x95\x1a\x33\x32\x40\x96\xd7\x48\xf5\x14\xf5\x34\x39\x7a\x80\x52\x86\x8c\x55\xa2\x6e\x9a\xd9\xa0\x3e\xa9\x68\x8b\x50\x77\x65\x9e\xac\x8b\x18\x05\xae\x1f\x23\xb7\x09\x09\x66\x7b\x9a\xfd\xf1\x3e\xe6\xa6\xa2\x8b\x71\xc9\xf3\xb9\xe8\x1e\x03\x0e\xd7\xdf\xdd\xa7\x1c\xdd\xff\x65\xdf\xf0\x6d\x8d\x99\x63\xf8\x72\x5a\x99\x1c\x65\x79\x0f\x83\x46\x87\x28\x6f\x54\x1c\xac\x86\x0f\xb7\xe0\x29\x54\xbb\xb4\x23\x8b\xae\xe2\xcc\x51\x31\x46\x64\x93\x94\x63\x83\x5d\xac\x4d\x22\x84\xae\x50\x36\xa2\x52\xcd\x55\xa5\x32\xde\x27\xf0\x50\x7b\x85\x16\x01\x39\x9d\x9c\xac\x98\x60\xa3\x43\xa6\x6e\x05\x2f\x91\x89\x34\xf4\x23\x8d\xab\x6d\x56\x14\x06\x95\x0c\xfb\xca\xd2\xaf\x98\x37\xc2\x5c\xf3\x7a\xac\xf5\xe3\x75\xc4\x85\xd0\x77\x73\x8a\x83\x40\x65\x2f\xa3\x87\xa6\x8a\xf6\xa4\x82\xba\x0e\xa7\x63\xb9\x4d\xd8\x10\x2d\x89\xee\x57\x4b\x94\x56\x9a\x44\xc0\x79\x21\x27\xfc\xc6\x4c\x73\xe6\x6a\x1d\x10\x0b\xa1\x20\xea\x1b\x38\xe5\xa5\x46\x4a\xec\xb1\x46\x6a\x54\xd5\x4c\xb9\x42\x64\x79\xd8\x05\x99\x79\x05\x2e\xbd\xf0\x2e\x72\x9a\x14\x99\xa4\x4d\x8e\xa0\xa2\x99\x0d\xc1\x08\x7b\xc4\xa8\xb2\x51\x98\x82\x68\x48\x55\x3c\xc8\x59\xbf\x5d\x0a\x68\x7e\xdb\x18\x7b\x44\x69\x7d\xba\xaf\x1c\xf3\x5e\x34\xb6\x64\xc4\xc8\x96\x76\x7d\x14\x0e\x87\x32\x43\xef\x2e\xc0\x12\xcc\xe3\x9e\x22\x80\xd1\xc2\xaf\x35\xa0\x93\x1c\x68\xf0\x9a\x3d\x16\x45\x80\x02\x9d\x86\xf5\x4a\x72\xa6\xc9\x6f\xb3\x62\x37\x72\xb2\xd9\xfa\x5a\xbe\x1a\x45\x82\x29\x1e\xe4\x0e\xef\xc7\x1a\xd4\x1f\x78\x65\x0c\xf8\x4f\x91\xee\x68\xb7\x7b\xa0\x0f\x08\x52\x65\x87\xac\xea\x36\x46\x04\xa6\x49\x04\xa6\x06\x2d\xa4\xdb\x03\x0b\x2d\xf5\xa0\xa9\xfb\x6e\x65\xe4\xd9\x8c\x45\xaa\x21\x51\xdd\x4f\x4f\x78\xff\xcd\xb1\xaf\x15\x98\xb4\x22\x86\x80\x96\x12\x2c\x6d\x24\xd0\x13\x41\xa3\x3e\x80\x13\x1a\xc6\xc6\x2a\x6d\x61\xb6\x74\x45\x8f\x8f\x82\xd3\x53\x90\x38\x08\x1b\xee\x2b\x27\x37\x44\xd6\xc4\x79\x1d\x97\xb8\x52\x66\x1b\x88\x07\x5f\xe7\x59\x52\x84\x3b\xc4\x89\x89\x68\x0f\x2b\xeb\x9c\x63\x1c\x3f\xcf\x39\x60\x99\xd0\xe4\x69\x63\xfd\x30\xb0\x54\xa2\x3f\xd8\xcf\x7e\xce\x21\xf3\xc5\x2b\x1c\xef\x6e\x07\xcc\x17\x3b\x49\x53\x7c\x10\x8c\x03\x11\x65\x4f\x06\xde\xed\x3b\xca\x9e\xac\x3e\xf6\x49\xc5\xa6\xb1\xda\x0f\x03\x31\x5d\x60\x4f\x66\xc3\x59\x92\x21\xf2\xcc\xb7\xbc\x33\x67\xe6\xe7\x2e\xec\xb7\xfa\xa1\xdd\xb0\x6b\x2d\x13\xc1\x94\xf7\x38\xc8\x84\x30\xc5\x83\xf1\x65\xf3\xc5\x7b\x6b\xcc\x6d\x45\x49\x7b\x1d\x26\xeb\x9c\x40\xcf\x88\xfb\xfe\x9a\xf7\xce\xda\xbc\x22\x57\x9e\x3d\x35\xa7\x39\xb8\xe4\x63\xa0\x92\xc8\x5f\x5e\x27\x49\xc5\x2a\x70\x47\xab\x57\xbd\xc2\x0f\x6b\x6c\x7f\xf8\x5a\xc1\x24\xa4\x3c\xa2\xda\xec\x54\x64\xc4\xca\xb3\xb4\x20\xa0\x21\xb2\x5d\xa8\x15\x04\x3f\x40\x4b\xad\x0a\x97\xe3\xcb\x49\x69\x53\xa8\x2b\xf0\xcf\x58\x88\x20\xe3\x1e\x7e\xd5\x33\x22\xf3\x35\x39\x85\xac\x5f\xdd\x08\xd8\xbb\xea\xc8\x11\x3e\x79\x26\xee\xa5\x49\x5b\x2a\x28\x52\x47\x3b\x0e\x18\x5a\x85\x6f\x59\x69\x52\x76\x9c\xde\x6d\x8c\x15\x9e\x27\xf7\x56\xef\xa8\xee\xc5\x52\x63\x08\xb2\x87\x44\x24\x24\x73\xc8\x95\x6d\x61\xd6\x19\xe5\xfe\xfc\xf7\xd8\xa4\xd4\x49\x20\x74\x70\xfa\xa2\xec\x2d\x38\xc1\x67\x99\xfb\x0f\x8f\xf6\xfe\x70\xcc\xbc\x62\x78\x5a\xda\xf0\x5b\x9e\x67\x35\x50\x57\x8a\x4f\x1a\x04\x7e\x36\x90\x30\x6e\xac\x56\x79\x06\xe3\x8f\xb9\x97\x00\x57\xd4\x50\xb9\xc6\xc3\x10\xaa\x1c\x45\xc5\x43\x84\x5a\x06\x69\x2f\xe6\x17\x28\x03\x61\x52\x23\x54\x4e\x71\x74\x2e\x46\x03\x1b\xe2\x48\x21\xbb\x2a\x28\xd8\x22\x0d\x20\xad\x53\xf4\x1f\x75\xb7\x6e\xd6\x42\x12\x2c\xf5\x44\x1b\x9b\x25\x8f\x53\x52\xee\x56\x38\x5c\x11\xbf\x58\xdb\x56\x8d\xda\x81\xe4\x28\xc6\x91\x9c\xe1\xca\x68\x40\x7e\xba\x26\x07\x0a\x1c\x3c\xaf\x88\xdc\x0f\xa3\xac\x0e\x6e\xd2\x0a\x69\x27\xe2\x35\x3f\x6e\x43\x26\x4f\x36\xbd\x2e\x7a\x19\x88\x38\x39\xc2\xd3\xd4\x8b\x0d\x18\xb8\x66\x37\x38\xe7\x1c\xc0\x38\xd9\xd4\x12\xba\x6f\x7c\x24\x7b\x7d\x8d\xb1\xac\xbd\x26\x82\xbe\x3c\xcd\xbb\x2f\xdf\x0a\xd6\xd0\x9a\x3c\x4b\xfa\x25\xef\x8b\x4e\xf1\x83\xaf\x25\x11\x05\x3d\x15\xc5\xc2\x59\x26\x4f\x7d\x35\x73\x45\x9c\xf5\x53\x61\x40\xde\x99\x70\xdc\x38\xe1\xad\x99\x03\x79\x25\x58\x1a\x4e\x09\xc0\x3c\xa3\x33\x17\x25\x38\x85\x18\x2a\x6d\x7c\x54\x6e\x4b\x61\x54\xaf\x28\x0f\x89\x31\x20\x92\x93\xf4\x2e\x93\x86\x52\xce\x35\xf8\x40\x73\xcf\x86\xba\x5b\x1b\xea\x67\xc6\x99\x9a\x79\xee\x6f\x8f\x7b\xbf\x3e\x7e\x2b\xfe\x28\x59\x86\xfa\x71\x20\xd2\x08\x82\x11\x94\x00\xf0\x11\xba\xcc\x38\xd0\xea\x83\xfd\xb1\xc5\xf9\x82\x3a\xc2\xe0\x08\xed\x63\x40\x3a\x45\x84\xf7\x28\x90\x14\x4f\xa9\xb0\x10\x60\xf1\xea\xc3\xb3\xc1\x2a\xa6\x00\x42\x55\x2f\xcb\xe1\xe7\x4f\x80\x0f\x59\x75\x68\x72\x3e\x9f\x5b\xd3\x87\xf0\xd6\xe8\xa3\x29\xa1\x37\x16\x47\xfb\x18\xa9\x3c\xa0\x44\x1c\x26\xfd\xa4\x09\x51\x8c\x96\xb8\x54\x70\xa1\xc9\x9c\xec\x77\x4b\xd4\x58\xbe\x2a\x46\x11\xdc\x79\x69\x3f\x6e\x7b\x94\x79\xa9\x18\x39\x74\x8f\xc9\x9b\xfc\xf4\xb1\x79\xdd\xbb\x93\x78\x82\x27\x90\x3c\x4c\x01\x2c\xe4\xeb\xd4\x10\xe5\x80\x62\x9e\xa9\x94\xc1\xb2\x57\xd5\xb8\xea\x98\xd3\x64\x53\xa4\x6d\x5f\x1e\xee\x65\x0f\x26\x69\x57\xf5\xed\xdc\xa9\x25\xe4\x3e\xe1\x93\x8b\x37\x1f\xe3\x33\x33\x47\xae\x9c\x52\x61\xf2\x20\xcb\x34\xb8\x6c\xd8\xed\xf6\x01\xbd\xbc\xb9\xe7\x97\xfe\xff\xb6\x5f\xfa\xdb\x35\x36\x91\x6c\x88\x74\x4d\xf8\x81\xfb\x8d\x1a\x6b\xee\x6c\x8f\x3a\x4d\xaf\x78\xef\xad\xa9\x3f\xcd\xbc\xc8\xdc\xb0\x76\x71\x55\xfc\x90\xfb\x40\xed\x4d\x30\xd9\x61\x8f\xf7\xc9\x68\x6d\xee\x29\xcd\x0b\xb2\x6f\x1f\x39\x3c\x73\xdd\xe1\x23\x47\xae\x81\x68\x22\x55\xa3\x66\x37\xd8\x2a\xc6\x0f\x04\x89\x61\xe0\x05\x6b\x47\xfd\x7c\x63\xff\x16\x92\x40\x77\x91\x0a\xfb\xbb\xcf\x69\x6d\xef\x26\x7a\x8a\xfb\x64\xed\x26\x82\xce\x2f\xc3\xf1\x18\x9d\x54\x89\xe0\xf5\xdb\x8f\xb6\x00\x79\xc8\x27\x86\x48\xc0\xf0\x27\xea\xa7\x6f\x7c\xb4\xf7\x67\x8e\x79\xa5\x8c\x97\x5c\xe0\xea\xe3\x18\x69\xa5\x95\x4a\x84\xcb\xa8\x6e\x96\x7d\x58\x3a\x1a\x7d\x44\x6e\x68\x93\x31\xf3\xcb\xb4\x69\xc4\x49\xdc\xd0\x87\xde\x00\x89\x11\x2c\xe4\x6d\xfa\x2e\x56\xc4\x6f\xb7\x21\xbc\x00\xa2\xac\x45\xde\x46\x09\x17\xf3\x62\x39\x35\x01\xd0\xfa\x9c\x73\x91\xa1\x8e\x5a\xea\xda\xfb\x2f\xdb\x53\x48\xf6\xa2\x9a\x1e\xba\xdd\xe3\x9b\x0e\xbb\x18\x92\xd6\x55\x62\xef\x97\x1c\xef\xc3\xce\xdc\x88\x7c\xea\xe1\x45\xa6\x26\x60\x69\x61\x54\x04\x77\x66\x94\x1d\x4f\x1f\x42\xee\x49\xfe\x6c\x2f\x4d\xbc\x3a\xf7\xb2\xa4\x93\x7b\xcf\x6d\xf2\x53\x49\xae\xb9\x90\x02\xde\x20\xa8\x04\x5a\x7d\x0b\xb7\x29\x5f\x97\x54\x15\x07\xc8\x53\x15\x76\xc0\x4d\x07\x2b\x0f\xde\xdc\x8a\x82\xfd\xd4\xff\xcb\xde\x9b\xc7\x59\x92\x55\xe5\xa2\xbf\x38\x99\x35\xed\xea\x01\xc2\xfb\xd4\x87\xd3\x36\x68\x6f\x55\x36\x79\x4e\xd6\xd4\xd5\xdd\xd5\x4d\x43\x76\x66\x15\x95\xdd\x35\x24\x99\x59\xdd\x34\x88\x9d\x3b\xcf\xd9\x27\x33\xa8\x38\x11\x87\x88\x38\x99\x75\xfa\xe2\x53\x26\x41\x44\x01\x01\x95\xc2\x07\x8a\x4f\x10\xd0\x46\x14\x50\x04\x15\x2e\xa2\x97\xe1\x79\x55\x9e\x28\x4e\x28\x2a\x08\x82\xfa\xc4\xb1\xee\xbd\xf2\x7e\x7b\xad\xb5\xa7\x38\x27\x87\x1a\xba\x5b\x79\xc9\x1f\x4d\x65\x9c\x88\x3d\xef\xb5\xd7\x5a\xfb\x5b\xdf\x62\xee\x4e\x0c\x9f\x12\x1d\x9a\xb5\x7f\x56\xb8\xc7\x21\x40\x9b\x6a\x76\x3e\xf2\x14\x97\x7f\x09\xd8\xe3\xf1\x32\x9f\xe8\xc9\x20\x48\xec\x33\x41\xf4\xff\x04\xf7\x55\x1f\x57\xee\xba\x87\x5e\xba\x17\x4e\x48\x89\x3b\xf0\x90\x7a\x3e\xeb\xa5\x2d\x0d\x13\x26\x2c\xb2\x57\xc9\x8c\xc6\x94\x6b\x4b\xbb\x8a\x23\xdf\xea\xc1\x41\x34\x16\xd6\xec\xb2\xa0\x71\xdb\xf5\x94\xfd\x27\x88\x49\xc1\x97\x8f\x5f\xe8\x0a\x00\xed\x86\xf7\x45\x27\x27\x87\x3c\x57\x1d\x5b\xf3\xe3\x65\x2b\x6b\x06\x18\x8e\x09\x7c\x21\xd5\x67\x3e\x45\xd8\xcb\x46\xd8\xe3\x89\x42\x7d\x21\xeb\x66\x49\xb6\x1c\xcb\x22\xfc\x87\x5a\xf4\xf6\xda\x9c\x54\x6d\x22\xc2\x11\xd0\xf3\x4b\xf3\x06\x11\x61\xaf\x6e\xed\x50\xc0\xa8\x37\x6a\x04\x12\x03\x18\x01\xac\xb6\x74\xb6\x96\x3a\x86\x25\xd5\xd2\xf7\x93\xb0\x14\xe0\x9d\xc5\x84\x80\xd4\xd2\xbe\xc6\xf9\x2e\xc8\xbc\xa3\xf1\x43\x18\x92\x63\x9d\xad\xa6\xb4\x9c\xba\x43\xf9\x36\xae\xf1\x0c\xda\xbd\x71\x3b\xbb\x95\xdd\xb2\x29\xda\x64\x58\x17\xbe\x3a\xc9\x69\x5f\x15\x30\x66\x55\x8e\xf0\x05\x41\x24\x67\xad\x06\x62\x9d\x20\x15\xb5\xa4\x22\x1f\x3c\xc0\x36\x05\x7f\xaf\x6e\x24\x2d\x1b\x6f\xab\x48\x29\x47\x41\x60\x3f\x1c\xb0\xeb\x73\x44\x0a\x11\x05\xfd\x8b\x83\xe8\xc2\x23\x20\x9f\x41\x89\x70\xea\xf1\xdd\xaa\xe0\xd2\xf5\xf6\xff\xa5\x60\x71\x73\x45\xf2\xc9\xe1\x1d\x46\x91\xd4\x4a\x60\x45\x97\x74\x95\xb0\x2a\xdc\xe8\x67\x19\xbb\x77\x0b\x74\x6e\x68\x18\x6c\x81\x1a\xf0\x4f\x1f\x25\x6a\xc0\xbf\xde\xa6\x06\xbc\x6a\xa5\xee\x75\x06\xa9\xf7\x8a\x2b\xa3\x06\x7c\x80\xdd\xcf\xce\x5d\x36\x35\xe0\x56\xd6\xd2\xb6\xc2\xb9\x0d\xca\x75\xf9\x01\xbf\x77\x0b\xfc\x80\xed\xb0\x55\xdf\x12\xcd\x1f\xbf\x42\x16\x41\xb2\xbc\x5f\x7a\xa3\x97\x7c\x42\x27\xe0\x99\x32\x57\x49\x73\x94\xf8\x26\xfc\x93\x1b\xa2\x77\xee\x18\x7c\x6e\xbd\xb0\xc0\x7d\x61\xfc\x75\xbc\x48\x45\xb7\x58\xc9\x4a\x34\xbf\xd5\xa9\x86\x23\xad\x71\x11\x98\xc8\xc3\xbf\x39\xd1\x38\x0e\xf0\xb5\x00\xab\x9d\xfb\xa4\x34\xc9\x92\x48\x81\x21\x4f\x24\x47\x72\x10\x23\xa9\xa0\xb6\x06\x3f\x8b\x59\x83\x87\x34\x79\x45\x14\x48\x71\xe0\x47\xe7\xe3\x01\x07\x71\xa7\x4a\xed\xab\xee\x86\x05\xca\x7b\x3b\x4f\x99\x1a\x4d\xe6\x5b\xb2\x3f\xb4\xcc\x05\xb6\x11\xbd\xb1\xc0\x37\x8c\x89\x05\x81\x65\xac\x67\x18\x95\x2c\xcd\x6f\x63\x48\x1b\x61\x43\x8f\x2b\xc5\x1f\xc3\xe5\xec\xc5\x27\xd8\x3c\x78\x71\x32\xce\x5b\x18\x41\x48\x2c\x85\x4a\xc3\x03\x5e\x40\x2c\x5f\x76\xb2\x74\x9e\x00\x33\xc3\x53\x06\xa1\x42\x42\x19\x90\xe0\xd2\x2b\x4b\x92\x25\xd1\x3c\x3f\xee\xc9\x1b\x88\xa7\x55\x73\x67\xa2\xf7\x62\xcb\xfd\xd4\x23\xe4\x48\x66\xa1\xa4\x95\x83\x08\x91\x21\xe0\xe9\xa0\x2c\xcd\x04\x10\x24\x37\x6f\x73\x10\x29\x83\xc0\x03\xae\x96\x17\x26\xb7\x5e\x8a\x13\x4c\xc2\x07\xad\xe9\xe6\x71\x47\xe4\x71\x82\x84\x61\x66\xe2\x69\x08\x9c\xfe\x21\x91\x1d\x0e\xa9\x77\xe4\xbe\x73\xf7\x57\xa7\x4e\xba\xc4\x4c\x7f\xc3\xfb\x34\xe6\x6d\xd2\x6e\x56\xcf\x62\x35\x49\xad\x8c\xb7\x4a\xad\x83\x4a\xb6\x3f\xb5\x4e\x7d\x04\xd2\xb6\xae\x72\x95\xba\x4a\x9f\x8d\xc2\xa2\x7b\xee\xfa\xa9\xd0\xfc\x35\x47\x57\x36\x8d\x39\xb1\x76\x5c\x47\xbb\x46\x87\x41\x82\xc4\x06\xe1\x05\x72\x52\x0e\xec\x3e\x77\x6e\x1b\xdb\xaa\xc8\x95\xab\x22\x97\x9d\xc6\x42\x1d\xa6\xe6\x7c\x1e\x14\xf1\x55\xeb\xe5\xef\xf6\xb2\xdb\x7c\x80\xbd\x43\x70\x6f\xae\xdc\x65\xd2\x9e\x47\x91\x3b\x09\x67\x97\x2a\x4d\xae\x85\x3f\xbf\x37\xfa\xa7\x60\x9d\x1f\x79\x73\x45\x36\xcf\x5b\x5f\x0a\xd9\xa0\x3a\x45\x08\x20\x21\xd4\x81\xd7\x95\x39\x5c\xd2\x89\x14\xf8\x9a\xe0\xaa\xf3\x4c\x56\xf2\x76\x9c\x24\x44\xfb\x26\xc0\x75\xd1\xb0\x38\x2f\x74\x4b\x44\x31\xc2\x33\xcc\xf3\x22\x02\x4a\x91\xa4\x4d\xab\xab\x2b\x9b\xb1\x48\x38\x5e\x06\x6a\xa8\x68\xaf\x70\x36\xb9\x48\xd6\x44\xbf\x00\x1a\x05\x62\x3f\x80\x56\xbb\x0e\xa0\xfe\xf0\x56\x5e\x0c\x20\x5e\xd1\x13\xef\x6f\xdf\x0e\xfe\xdd\x76\x93\x3f\x86\x56\xcb\xbd\x8e\x6a\xf1\x94\xab\xd4\x2c\xd8\x3b\x74\x44\xee\x9b\x03\x76\xcf\x46\x01\x39\x5b\x97\x17\x10\xa9\xfb\x0c\xe0\xa9\x44\x3f\x95\x8b\x28\x15\x4b\x59\x8f\x30\x03\x84\x57\x47\x36\x15\xa9\xa6\x1c\xc7\x18\x85\x86\x5a\xb9\x20\xeb\x2c\x23\x15\xb8\x31\xd9\x4f\xdb\xb4\x46\x3f\x1e\xb0\x93\x97\xdb\xe6\x21\xed\xc5\x2c\x47\xe7\x6c\x92\x23\x25\x94\x10\x9a\xa5\x01\xc1\xa8\x96\xfb\x81\x20\xae\xfb\x58\x77\x26\x2e\x4c\x6a\x4d\xe4\x57\xbc\x14\xac\x6e\x2e\xd8\xe7\xc3\xa7\x5b\xc1\xbe\x51\xee\x91\x75\x46\x7c\xa8\xf5\xf5\xa9\x11\x8f\x1d\xda\xde\x7b\xe2\x40\x4c\xcd\xcf\x9c\xc9\x5a\x10\x56\x1d\x3e\x3c\x12\x7d\xbb\xf3\xf7\x86\xd3\x36\x98\xe3\x3b\x49\xf8\xd4\xfc\x0c\x6f\xe5\xf1\x2a\xe2\x36\x20\x61\xbc\x6c\x61\xe0\x5c\x9a\xb5\xe4\xc5\x60\x17\xfd\xea\xdf\x37\xd6\xd8\xbb\x6a\x4c\xff\x14\xfe\x54\x2d\x7a\x59\x60\x4a\x71\xfd\x5e\x6e\x4b\x9c\x1a\xa7\xe9\x5d\xc8\x24\x0c\xf0\x63\x5d\x21\x92\xf8\x25\x89\xd3\x28\x1b\x7f\x20\x00\xc7\x69\x9a\x49\xe6\x08\x3a\xe3\x9b\x59\x87\xd6\xd9\x65\xa4\xef\x5c\x67\x68\xb1\x79\x97\x82\x7d\xec\x1b\xbd\x05\xd0\x15\x65\x73\xa5\xde\x91\xf9\xb2\xac\x9f\x97\xfd\x70\x57\xb8\x43\x9d\x6d\x4c\xbd\xf9\x0d\x43\xde\xd4\xec\xb9\xe1\xee\x70\x27\x7c\xc5\xd8\x5b\xf7\xb0\x27\x6d\xd0\x00\xd7\x8f\x09\xce\xc6\x7f\xdd\x1d\x1d\xa9\x3e\x1c\x96\x9f\xca\xf3\xcc\xca\x75\x22\xc1\x3f\xb0\xed\x51\xbc\xea\xf3\xaf\xd4\x0e\xc5\xf3\xd1\x13\x0d\x73\xbc\x59\xa1\x59\x9b\xfb\x78\x80\xad\xdf\x94\x6c\xb4\x14\xb6\x4f\xdd\xab\x38\x75\x3f\xea\x5a\xf4\xbf\x7c\x95\xbe\xc2\xff\x63\xb8\xab\xf0\xd1\xb2\xe4\x2f\x05\xf1\xe6\x87\xd2\x89\x70\xba\x3e\x78\xac\xf0\xcb\xb8\x42\x01\xc7\x20\xfb\xcb\x3d\xec\xd0\x30\x3e\x6e\x7c\xf1\xec\x7c\xf5\x9e\x88\xc2\xb4\x1f\xde\x13\x1d\xf2\x12\x16\x98\x0f\x86\xc4\xc7\xeb\xd5\xe9\x87\xc1\xfe\xf5\x6e\xf6\x5b\x23\xec\x46\x7c\xe7\x8c\x36\x1f\xc2\xf7\x8f\x44\x0f\x8f\xdc\xe7\x3f\xac\xe0\x45\x21\x04\x45\x5b\xb7\x54\x07\xe5\xaa\x30\xcd\x68\x70\x75\xc8\x78\x81\x29\xb1\x4b\x6e\x6f\x82\x0c\x66\xb3\xd6\xbe\xc2\x79\xcb\xc5\x3e\x36\x38\x5e\xaa\x12\xa3\x62\x49\xe0\x6f\x82\x5a\x81\xd3\x4b\xb5\x85\x60\x3d\x4b\x92\x77\xe2\x3c\x87\x0b\xd7\x6a\x73\xf0\xfa\x2f\x5e\x5e\x01\xfe\xb6\xb4\x94\xcb\xb9\x89\x58\x2b\xb9\xed\xae\x2a\x47\xa4\x14\x9b\x5d\x66\x80\x4b\xcb\xe3\x96\xa4\x98\x1c\xcc\x49\xb0\x24\x57\xc4\x6a\x9c\xf5\x72\xfc\xba\xcc\x78\x44\x3f\x45\x3c\x6e\x1b\x66\x32\xb5\x4f\x35\xd0\x53\x1b\x67\x43\xc6\xe9\x8c\xfd\x11\x13\xd1\x63\xa4\x5c\x37\x97\x75\x38\xba\x07\xfb\x52\x21\x3f\xf4\xee\xfa\x3f\x10\xb0\x9d\xed\x62\xa1\xdf\x95\xe1\xbb\x83\xe8\x2d\xc1\x89\x38\x91\x9a\xf0\xb7\xdf\x85\x3e\x75\x90\x8c\xca\x66\x5e\x69\x57\xde\xf1\xf0\xd8\xaa\xe3\x2b\x99\x12\xbb\x5d\x20\x75\x4b\x97\x4d\x00\xd8\xf1\x0b\x0d\x1e\xc9\x0b\xe5\x91\x68\x9c\x47\x17\xda\x85\xfa\xbf\xb4\x6c\x2b\x0b\x74\xa6\xd3\x4d\xe2\x66\x5c\x26\x24\xee\x72\x03\xf6\xc6\x0f\xd4\x38\xf5\x52\xb3\x1c\xbc\x2e\x5c\x70\x52\x3b\x24\xd1\x77\x0c\xc4\x8c\xf0\xfd\xea\xe7\x89\xb5\x3c\x2e\xe5\x18\x86\xa1\xad\x9b\xfa\xc1\xfc\xa8\x19\xa5\xe3\x94\x66\x1b\x52\xa0\x17\x7e\xb8\xc6\x47\x03\xb6\xa7\x80\x14\x68\x73\xb2\x1d\xbe\x7f\x2b\x8c\x95\x68\x2c\x98\x78\xb1\xe8\x25\x94\xb6\x6e\x4e\xb6\xab\xbb\xc6\x24\xad\x53\x16\xb8\x5a\x8f\xd9\x92\xce\xe2\x53\x02\x3b\xb6\x9e\xdf\xc9\xd9\x19\x35\xb7\x10\x39\x24\x92\x42\x6f\x25\x1b\xd0\xdf\x1a\x37\x6b\x91\x60\xd4\x7a\x49\x90\xc3\x5b\xb6\x1a\xec\xfb\x02\xc6\xec\xe6\x0e\xbf\x33\xea\x3a\xcb\x9c\xce\xd3\x95\x5e\x47\xa4\x75\x35\x9c\x60\xfa\xbb\xf8\x39\xdb\x1c\x2c\xa4\xc1\x69\xe0\x70\x35\xc3\x0a\x07\x8c\x03\xd1\xd3\xd1\x2a\x15\x76\xb1\x7b\x93\xfa\xc7\xd7\xb3\xb1\x2d\x65\x55\x9d\xeb\x25\x32\x7c\xc7\xf5\xd1\x17\x03\xe7\xc1\x00\x6e\x14\xd2\x6d\xeb\x14\xfb\x25\x25\xc8\x29\x10\xc9\xae\xbd\x1e\x20\x67\x60\xe9\x92\x16\x04\x2c\xda\x14\xe5\x88\xd4\xed\x98\x73\x43\x1d\xa1\xcd\xac\x03\xf8\x77\x7d\xd6\xaa\xee\x61\x9c\xb4\xb1\xbd\x08\xd9\x08\x25\x02\xbd\x1b\x85\x4a\xe5\x59\x8f\x78\x59\x55\x25\xba\xf0\x41\x8a\x75\x27\x1f\xbf\xd3\x35\x88\xd9\xf4\x25\xf3\x3b\xf7\xb2\x7b\xd8\xa8\x3a\xe2\xc2\xbb\xd7\x27\xac\x1b\x36\x86\x27\x17\x16\x66\xab\x65\xb3\xcf\x30\x36\xaa\x1a\x1d\x7e\x8a\x45\x1f\x63\x27\xb3\xc2\x44\x5d\xe3\xed\xcb\x73\x7b\x22\xc1\xc1\x6a\x65\x1d\x11\xa7\x66\x19\x08\x9d\xb4\x1b\xfa\x3c\xce\x85\x97\xab\x7c\xee\xc4\x14\x3f\x7c\xfb\x6d\x47\xcd\xad\x88\x5a\xd4\x4a\x50\x23\xfd\xe7\x6a\x8c\x10\x1b\xab\xe3\x44\xaa\x94\x88\x77\x45\x6e\x60\x62\xe7\xe6\x66\xdc\x52\xe3\xd4\x94\x7a\x8c\x1f\x6c\xf0\x99\xd9\xc2\x26\x3d\x42\xc3\xb1\xc1\xa7\x74\x7c\x91\xd2\x88\xab\x9d\x05\x43\x05\x96\xa5\xe8\x76\x93\x3e\x2f\xd5\xd9\x0b\x55\xcd\xcc\x6a\x33\x07\x8c\x38\x8d\x16\x13\xe0\x88\xd3\xe9\x79\xd9\x21\xbc\x6c\x5a\x3c\xb6\xc8\x5b\x12\x19\x77\x73\x1d\x73\x9d\x4b\xb5\xac\x60\x01\x91\x1b\x4d\x49\xc9\xc1\x16\xb2\x3d\xdc\x69\x24\x86\x16\x61\x97\x6d\x83\x11\x60\x6f\x64\xe4\xb1\xdb\x0e\xc0\xea\x52\x73\xae\xb4\x72\x55\xc4\xb1\x23\x47\x0e\x9b\x87\x45\x83\xdd\x9d\x59\x74\x9e\xe8\xd3\xd5\xce\x00\x77\xf3\xd0\x85\x0c\xeb\x4e\x13\xa7\x17\xa5\x95\xe9\x0e\x2b\xfc\xc0\x92\xd4\x51\xe9\x2b\xb4\x60\x1c\x71\x3d\xee\x7e\x81\xeb\x1f\x0e\x69\x9d\x5e\x9e\x72\xc8\x53\xbc\xb5\xdd\x8c\x03\x75\x30\x5c\x8e\x04\xf5\x8a\xba\xb9\x6c\xc6\x85\x8c\x08\x28\x0c\xda\xb7\xbb\x26\x75\xee\x7f\xc0\xfc\x11\x6b\x3d\x26\x41\x2b\x07\xd7\x2b\x11\xcc\x46\xed\x2c\x6b\x2c\x89\xbc\xd1\xcc\x3a\x11\xb0\xb6\x47\x6b\x71\xd2\x6a\x8a\xbc\x15\x8d\xaf\x57\x51\x37\x97\xed\xf8\x82\xa1\xb0\xd1\x19\x7c\xf4\x87\xc4\x1d\x40\x15\xdc\xdc\x50\x55\x40\xf1\xb8\x7a\xcc\x6b\xcd\x15\x91\x8b\xa6\x5a\x42\xfb\x6e\xde\x87\x8e\x1a\xd1\xed\x4a\x91\xab\xfd\x13\x97\x85\x4c\xda\x3a\xde\x17\x65\xcd\xf4\x99\x79\x2a\x1b\x4d\x33\x35\x6d\x04\x25\x33\x8d\x80\xdf\x1b\xc0\xe2\x49\xa1\x99\x48\x2d\x5d\x6d\x9d\xad\x02\xdb\x09\x23\xfd\xe4\x27\xf3\xe8\xe6\x08\x4e\x4d\x5a\x1f\xfa\xe4\x18\xb6\x46\xe0\x13\xc3\x4b\xe2\xef\xf0\x35\xd1\xc7\x3d\xda\xe6\x5a\xa4\xd0\xf4\x8d\x7b\x3e\x1f\xdd\x09\xb4\x6a\x7b\x96\x36\x03\xd6\x3a\x4c\xd4\x8a\x14\x2d\xdc\x66\x86\x1e\x5d\x15\xd9\xe0\x87\xbc\xe2\x6d\x0f\x9d\x18\xd5\x2b\xaa\xa6\xcc\x6c\x4d\xb0\x42\x7b\xed\x76\x7c\x41\xe9\x15\x9d\xcc\x44\x0f\xe2\x8c\xc0\x58\x8e\x69\x71\x61\x86\x58\xd5\xe0\x9d\x6f\x7f\x14\x78\x29\xff\x2a\x89\x88\x26\x51\x34\x4c\xcd\xcf\xa0\xdb\x23\xfc\x99\x20\x9a\xab\x3e\x1c\x9a\x34\x2a\x4e\x93\x38\x95\x8e\x43\x87\x58\x06\xac\x27\x0d\xd5\x2a\x50\x97\x29\xc0\xdb\x3b\x4c\xa6\xd9\xdd\x14\x3f\x7d\x2c\xaa\xbb\x67\x3f\x42\x1a\x80\x45\xdf\x3d\xf7\xad\xb3\xca\xed\xde\x4f\x5e\xe7\x81\x15\xfc\xbc\xbd\x9e\x65\xf2\x3f\xf6\x46\x5f\x0a\x26\x5b\xa2\xeb\x66\xea\x8d\x53\xa5\x57\x6b\x4d\xe2\xca\x92\xf1\x02\xce\x56\xdf\x8e\x82\xa6\xa1\x93\x86\x15\x94\x04\x50\xf3\xa2\x40\x60\xb2\xf1\x6a\x39\xe5\x98\xbd\x46\xba\x0e\x18\xe6\xd0\xc0\x6b\x96\x26\xf1\x7f\xee\x61\x5f\x18\xf1\xd3\x24\xfe\x81\x61\xb2\xff\xb5\x91\xed\x24\x87\x5f\x65\x49\x0e\xff\xaf\x51\xed\xab\xba\x38\x1a\xfd\xd1\xc8\x4c\xdb\x3f\x27\x21\xcb\x84\x9f\x38\x7a\xc8\xba\xf4\x63\xfd\x9b\xb2\xa5\x97\xa5\x5d\xf8\xd9\x73\x70\x34\x60\x27\x39\x76\x37\x24\x89\x83\x4e\xad\x01\x6d\x75\xea\xec\xf0\xf3\xb2\xaf\x03\x39\xc1\x1d\x40\x8f\x57\xcd\xf1\x5e\x39\xd0\x13\x25\x0f\x5a\xb8\x79\x36\xa8\xd9\x9e\xe7\xa0\x74\xe3\xd0\xf5\xd2\x81\xaf\x35\x5d\x12\x6e\x5a\xca\x1c\xa3\xda\xe4\x39\x02\xcc\x09\x4c\x46\x2f\xa4\xdb\xd6\x9a\x1a\x8c\xc2\xb8\xdb\xdf\x42\x96\xbd\x2e\xe5\x8f\x01\x2a\x22\x22\x2f\x42\x6a\x9c\x8e\xc8\xcf\x2b\xc5\x83\x76\x59\x83\xcf\x82\x59\xa0\xaf\x48\x4c\x1a\x1d\xed\xf8\x04\x2a\x1d\x0b\x65\xe2\xfb\x1a\x8d\x7d\xb8\x0c\xb3\x1c\x93\xec\xe0\x9a\x52\xcf\x3d\x97\x77\x83\x8d\xb3\x9b\x37\x35\x0e\xef\x95\xfd\x85\x4c\x35\x81\xcd\x3a\xb9\xb7\xa7\xa3\xa3\x1b\xe4\xde\xce\x72\x00\xde\xc0\x30\x6e\x94\x87\xfb\xd5\x01\x63\x68\x52\x82\x79\xf7\xa2\x20\x5a\x73\xd9\x31\x0a\x2d\x78\x49\x01\xf5\x9d\x2c\x68\x84\x5e\x31\x63\xa2\xa6\x49\xc4\x4a\xdc\x73\xe2\x0b\x3b\xd9\xbc\x1d\x08\x6b\xa1\xd4\x45\x37\x26\x42\x19\xe3\xf7\xf3\x5e\x00\xe8\x5b\xaf\x28\xb3\xce\x1c\x79\xab\xe6\x7b\x4b\xc6\x39\x1c\xfe\xe0\xce\xe8\x81\xf5\x7f\xae\xa4\xed\x83\x8b\x2a\x20\xd6\x03\x86\xc2\xc2\x7d\x53\xc9\x26\xbf\xa0\x4a\xbe\xf6\x9f\xda\xc1\x3e\x1f\xb0\x1d\xf0\x69\xf8\xe9\x80\xc9\xf5\x66\xf9\x5a\x75\x6e\x5e\xd5\x14\xad\x62\x5b\x7d\x94\x50\x13\xbe\xb1\xde\x65\xf2\xf7\x43\x5d\x5c\xf0\xc5\x09\xf8\x68\xd1\xed\xa1\x4e\xd4\x59\xf6\xf2\x14\x60\x81\x8b\x0e\x5d\xe0\xc4\xea\xc1\x45\x3e\x8f\xb4\x8d\x78\x95\xc0\xde\x3b\x62\xee\x0b\x1f\x1e\x61\xed\x47\xbc\xb3\x78\x9b\xf8\xa1\x1a\xcd\xd2\xe5\xf6\x17\xbe\xf2\x3a\x4c\xd4\xff\x94\xbe\x0b\x54\x52\xc7\x61\x3e\xb4\x58\xc4\xb0\xf5\xad\xd3\x3d\x5e\x4e\x21\x4b\x0e\xa1\xe5\xe8\xb3\x45\x53\x5b\x29\xd2\x87\x84\x61\x1d\xa1\x4b\x98\x43\x9b\x57\x34\xb4\xc1\x43\x6a\x13\x69\xbf\x04\xbf\x40\x46\xd2\x40\xa4\x5b\x68\x01\xfb\xfd\x11\x36\x45\x53\xa4\x76\x6d\x5d\x2c\x2f\xe7\x72\x59\x94\x99\x3f\x35\xd5\x94\xea\x93\xb3\x33\xf3\xe8\xf9\xc0\xd9\x08\x5f\x39\x12\x4d\x56\x1f\x5a\xe2\xa3\x96\xcc\x63\xa4\x18\xac\x5e\x78\x8a\x14\x5c\x55\xb8\x1a\xbc\x4d\xf4\x2b\x35\xf6\xbe\x1a\x70\xaa\xb4\x70\x29\x85\x3f\x5d\x8b\x6e\x22\xa3\x58\xfb\x5d\x08\xf4\xa6\x0c\xb7\x6e\x4c\x95\x7b\x42\xf6\x19\xec\x3e\xb6\x30\x74\x45\x5e\x59\x77\xa7\x74\x73\x2e\x05\xfb\xd8\x13\x3c\x0f\xbf\x3a\xbc\xea\x1d\xd1\xad\x2b\xb9\x1b\xee\x09\x77\xd5\xc1\x15\xca\x2e\x05\x9c\x7d\xed\xe0\x9b\xea\xb7\x70\x67\x38\xda\x11\x5d\xb6\xa5\x2b\x4c\x2a\x6c\xcb\x57\x98\x6f\xbb\x8e\xdd\xbe\xe9\x6d\xfd\xa9\xac\x29\x92\x61\x90\xa4\x2f\xee\x8d\x3e\x17\xac\xf7\xeb\x10\x4c\x12\xe8\x5b\x86\x97\x05\xae\x30\x86\x03\x7e\x50\xef\xc6\xf8\x6b\xeb\xe7\xe3\x27\xc5\x2a\xc6\x68\xdb\x13\x06\x69\xaa\x5c\xb6\xce\xf3\x10\x98\xc5\x3b\xbd\xe6\x0a\x97\xa2\x88\x31\x6f\xf1\x72\x2e\xd2\x72\xf0\x3b\xb4\x9f\xc8\xd6\x41\x9a\xbf\xc2\x53\x8e\xa1\x13\x98\x2f\x79\x10\x83\xf4\xf7\xdb\x18\xa4\x6d\x0c\xd2\x57\x0b\x06\xe9\x9f\x34\x06\xe9\x4b\x01\x3b\x71\x0d\xf0\x3c\x5d\xd9\x8c\xde\x14\x5c\x05\x00\xa9\x8a\x43\xd4\xf8\x23\xd7\xa3\x62\x7f\xee\x43\xb6\x19\xba\x41\xd3\x85\x92\x93\x09\x6f\x36\x00\x50\xa2\x73\x4e\x91\x81\x2b\x5b\x8d\xff\x70\x50\xa6\xb5\xcd\x6f\x8d\x17\xc2\xb9\xad\x41\x99\xd6\x13\xde\x43\xb1\x4c\x6f\xdb\xe1\xe5\x70\x71\x73\x23\x9b\x23\x2f\x7c\xf1\x8e\xc8\x7b\xe0\x10\x38\x68\x38\xaa\x3d\x8f\x21\x7d\xda\xc5\x60\x54\xad\xef\x8b\x01\xcd\x82\x27\x62\xdf\x33\xca\x5e\x1e\xb0\x30\x11\x45\xb9\x90\x8b\xb4\x80\x32\x17\xe2\x8e\x0c\x57\xd9\xad\x57\xb0\xe0\xd5\xa7\xd1\x1d\xa7\x44\x51\x42\x8a\x50\xdc\xf9\xa6\xad\x25\x56\x81\x12\x02\x92\x3b\xe2\x14\x82\xee\x44\x49\x2d\x9f\xc1\x76\x11\x2d\x6d\x78\x3a\x7a\xea\xc9\x5e\x47\xa4\xdc\xdc\x6c\xd1\x2f\x7a\x52\xf1\x8a\x02\x88\x42\x68\xc9\x03\x61\x6a\x69\x7a\xe2\xf9\xf6\xee\x61\x3b\x73\x29\x8a\x2c\x0d\x9f\x1a\x1d\xde\xbf\x94\xc7\xb2\x3d\xc6\xf1\x89\x09\x2b\x35\x6d\xdd\x57\x6c\x58\xd6\x29\xb3\xa6\xef\x8e\x6e\xa1\x85\x48\x6a\x9d\x29\x62\x5c\xb3\x59\x2f\x00\x05\xdd\x09\x91\x14\x72\x9c\x9f\x43\xbe\x59\xaf\xb4\xa7\x30\x98\xa2\xf0\xd6\xe8\xe6\x05\x8a\x81\x7f\x0e\xa6\x6d\xd4\x25\x0d\x26\x89\xf3\x0a\xe8\xb2\xeb\x55\x6b\x67\xf3\x6c\x49\xc2\xec\x3d\x78\xe5\xb3\x77\xd3\x7a\xb3\xb7\x26\xe8\xbc\x56\xbb\xfa\x9f\x8e\x0e\xf5\x24\x1e\xef\xae\xc8\x8e\xcc\x45\x32\xa5\x39\x8e\xc2\x8f\x1f\x8d\x5e\xb8\x63\x32\xe5\x83\x3f\x69\x70\x96\xfe\xd3\xcd\x88\x8e\x29\x2d\x4b\xd9\xe9\x66\x39\x06\xaa\xc0\x22\xb1\x30\x38\xcd\x23\x03\x24\x8d\xd0\x4d\x64\x49\x6d\x96\xf1\x6a\x5c\xc6\xe0\x04\x6c\xae\xe0\xb5\xd4\x52\x6f\x79\x19\x7c\x4e\xa6\x0d\x2e\x07\x13\xf8\xdd\xd3\xcc\x61\xb1\xc9\x5d\x06\x34\x9b\xeb\xce\x78\x97\xfa\x9e\x67\x24\x97\xe0\x62\xd0\xb4\xce\xf0\xbb\xbc\x10\x83\x0f\x00\x9e\x20\xe9\x8d\x25\x50\xe4\x48\x71\x87\x1f\xa1\x43\x25\xe5\x72\xb0\x69\x98\x21\xac\xa0\xef\xcb\x8c\xcb\x0b\x4d\xa9\xe4\x1c\x9c\x9f\xd4\x58\x25\xbe\x10\xa7\x38\xae\x7d\x04\x7a\x0c\xe5\x6a\xdc\x84\x1a\x86\x76\xdb\xa1\xc2\xc6\xc1\x5e\xea\xf3\x56\x8c\x79\xc6\xf0\x1c\x76\x28\xf5\xf0\xb4\xe0\x0b\xaa\x6f\xfa\xa4\xc0\xaf\x56\x63\xe1\xf8\x26\x4c\x2f\x9c\x8a\x1c\xa3\xa9\x3a\x82\x74\x8d\x62\xdd\x1b\x50\x0f\xcf\x20\xf0\x4c\x15\x3f\x2c\x2d\x34\xe5\x45\x25\x53\x51\x8b\xfc\xc1\xe5\x55\x98\x57\xdb\x89\x58\x1e\xea\x55\xff\xd9\x83\xec\xd3\x01\x1b\x91\xe9\x6a\xf8\x7b\x41\x34\xa3\x83\x5e\x65\xba\x1a\xe7\x59\x0a\xde\xe2\x55\x91\xc7\xaa\xa2\x42\xfb\x76\xe3\x0a\x89\xd7\x30\xf5\xc5\x35\x7f\x9e\xc4\xc6\xd8\xbe\x4d\x7d\x4c\xc7\xd3\xd5\xfb\xc4\x23\x84\xa3\x0c\xe8\xe6\xe0\xc7\x82\xe8\x07\x03\xd7\xbb\x34\x6c\xcd\x39\x19\x71\xd5\xca\x9b\x3e\x33\xff\xe0\xa9\xc9\xbb\x8f\x9f\xa2\x99\x00\xc7\xa4\x5e\x01\x84\x19\x10\x9d\x4c\x99\x0d\x1e\xbb\xe4\x38\x57\xbd\x75\xd7\x9b\x9a\xf9\x21\x15\x16\x0d\x3f\xb0\x67\x07\xdc\xc6\x86\xdd\x68\x62\x76\xd8\xb5\x2c\x26\xfd\x1d\x5e\x8c\x1d\xf3\x43\xec\xc0\x06\xf4\x56\x7a\xcc\xcd\x4a\x51\x35\xb1\x84\xdd\xa0\xce\x19\x65\x4f\x14\x20\x48\xc3\x67\xb2\xff\xbc\x79\x6a\x10\xf5\x66\x74\x00\xfe\xef\x32\x1a\xcb\xbe\x8b\xdd\x58\xc8\x66\x2f\x8f\xcb\xbe\x6a\x86\xbc\x50\x86\xc9\x16\x70\x2a\xf3\xfe\x37\xd1\x6d\x95\x07\xda\x03\xbb\x79\x03\x7e\x6f\x94\xed\x29\xca\x56\x9c\x9e\x4d\x9b\x32\xfc\xc8\x68\xf4\x4b\xa3\xf7\x3b\x0a\xd2\x10\x92\x52\xb2\x90\x92\xac\xa0\x04\xe4\xea\x6b\xf0\x7f\xa4\x32\xb1\x39\x35\x4d\x6c\x68\xd6\x95\x86\x2c\x94\xae\xc1\x44\x59\x8a\xe6\x0a\xf9\x7a\xf0\xfb\xb8\x00\x8a\x56\xa7\xc4\xa2\xcc\xa5\xe8\xe8\xac\xf3\x70\x9b\xab\x8a\xe2\xa2\x99\x67\x45\xc1\x3b\xbd\xa4\x8c\xbb\xa6\x30\x5e\x48\xb4\x25\xd1\x15\xae\x7b\xe4\xa4\x09\x45\x06\x58\x53\x1b\x35\x0b\xd2\x2a\x9a\x45\xaf\x64\xf1\x38\x5c\x5d\x02\x8b\x88\x66\xc0\xd5\xd7\x87\x64\xbc\x60\x8d\x24\x0a\x54\x79\x46\x9e\xa5\xd4\xd2\x82\x9a\x9a\xb6\xcc\x15\x0c\x60\x1e\x6d\x81\x54\x54\x2b\x2e\x9a\x59\x9a\xca\x26\x50\xf5\x69\x4a\x7c\x1c\x68\xdd\x52\x18\x6a\x9d\x49\x1d\x4b\xa7\x47\x4e\x71\xee\x61\xea\x1f\x2a\x68\x8c\x25\x02\x48\x3c\xdb\xa8\x7d\xb8\xc7\x2d\xf1\xeb\x6a\xc0\x9a\x5a\xfc\x64\xbc\x61\x0b\xf0\x8c\x93\x78\xa5\x09\xa9\x04\x94\x10\x3e\x7e\xf6\x84\xb9\x0b\x32\x05\x7b\x2e\xed\x2f\xd5\xd8\xd7\xe0\x2d\xa0\xd9\x60\xe0\xdb\xfe\xdd\x5a\xf4\x1b\x35\x35\x47\xfa\x2e\xc0\xbd\xaf\xb4\xcd\x82\x16\x10\x53\xac\x26\x5f\x8c\x8b\xa1\xb2\x0a\x6b\x21\x4a\xca\x61\x2f\x18\xba\xe0\x5e\xaa\xe5\xb6\x03\xe2\xdb\x3f\x33\x3b\x35\xce\x67\x67\xa6\xc7\xb9\x2c\x9b\x63\x96\xe7\xd2\x8a\x76\x8d\xd8\x02\x6a\x63\xba\xab\x1e\x56\x11\xdc\x56\x43\x1d\x6b\x2b\xa2\x84\x31\x73\x2a\x02\x76\xcc\x15\x91\xd3\x86\x2c\x35\x4d\xad\x89\x43\x5e\x67\xcb\x81\x9c\xd5\x77\x99\x38\x9d\x43\x78\x81\x3e\x3d\xca\x46\x45\xbe\x5c\x84\x9f\x1c\x8d\xde\x3b\x3a\x99\x2f\xf7\x3a\xd2\x61\x37\x96\x69\x99\xf7\xc1\x0e\xc7\x71\x6a\x65\xcd\xf3\xaa\xc5\x1d\xb1\x2c\xf7\x15\x7c\xea\xf4\xb4\xe1\x09\x8e\xdb\x26\xfb\x00\x5e\xe3\x64\xab\x71\x0b\x19\xe9\xf1\x10\xb4\x77\x5b\x05\xbf\x69\xff\x7d\x93\x73\x0f\x9e\x99\x3c\x7d\x7c\x0c\x49\x37\x81\x41\x08\xf8\xff\xb5\xe2\x60\x7a\xa4\x34\x03\x7b\xa6\xd2\x1d\x92\x3e\x59\x1d\x6a\x6a\x24\xfe\xd5\x17\x59\x0e\xf9\x34\x8e\x7c\x9c\x76\x7b\xa5\x76\x5d\x18\x84\x69\x6a\x88\xf3\x55\xf7\xdc\x66\x15\xfd\xb4\x14\x17\xf4\x25\xa0\x2c\x9a\xa2\x6b\xc1\x20\xad\xac\xa7\x2a\xbf\xe9\xa6\x71\x1e\xcb\x63\xfc\x26\xe7\xc3\x06\x3f\x4e\xef\x3a\xfd\x75\xb6\xc3\x92\xed\xed\x38\xcf\xe5\xb2\xc8\x5b\x09\xa5\xe7\x76\x8d\x4c\xd3\x41\x50\x5a\x0b\xb2\x30\x87\xba\x3b\xb6\x76\x83\x53\x8a\xe2\x7c\x31\x11\xa7\x4a\x79\xa9\x2b\xb9\x52\x17\xdd\x6e\x42\x61\x2a\x78\x74\xc8\x7a\x33\xeb\x74\x44\xda\xaa\x0b\x5a\x08\x75\x33\x0b\x13\x4f\x24\x1a\xc6\xba\x30\x6f\xc5\x69\x5d\xd4\x8b\x15\x99\x24\x1b\x90\x78\xfd\x8f\x51\xb6\x8b\x3e\x08\xff\x76\x34\xfa\x9d\xd1\xe3\x66\x4d\x71\xf8\x02\x69\xc4\x30\xb7\xb5\x85\xed\x0a\x0e\x05\x0f\x5d\x76\xc7\xcf\x2c\xcc\x3d\x30\x7b\x76\xe6\xcc\xc2\xf6\xea\xdb\x5e\x7d\x1b\xae\xbe\x98\xed\x80\x55\x13\x2e\x46\xf3\xd3\xce\x2a\x02\x09\x7b\xd9\x97\x9f\x56\x07\x9a\x80\x52\x3c\x8f\xdf\x4b\x6a\xec\x46\x78\x3a\xdb\x4b\x12\xa2\x7f\xfa\x72\x10\xfd\x65\x30\x03\x15\x76\x7b\x49\x42\x3e\xed\x06\x3f\x8b\xc6\xfd\x24\x84\xdd\x8e\xf3\x33\xc8\xeb\x30\xd3\x3e\x93\x95\xb3\xfa\xae\xdc\xc5\x4c\xe0\x8b\x6a\x95\x1f\x23\x1f\x72\x89\x47\xb3\x73\x7d\x9f\xe5\x5e\x01\x96\x13\xff\x2a\xa6\x6d\xfd\x9e\x3f\x51\x5b\x79\xf5\xc1\x91\xf8\xf0\x08\xfb\x5a\x83\xcd\xcb\xd2\xd3\xe8\x78\x99\x15\xe5\x4a\xf8\xb6\x91\xe8\x47\x1d\x04\xcc\x2c\xc0\x3d\x8c\x06\xa3\xc1\x19\x65\xe6\x3c\x71\xb7\xa2\x53\xaa\xf1\xe7\xe8\xdd\xb4\x96\xc7\x65\x29\x41\xf9\x01\x78\xbb\x8b\x57\x70\xcb\xb0\x50\xf7\x06\x3f\xad\xcb\xb0\xdf\x9a\x54\x34\x08\xaa\x02\x57\x0f\xa6\x46\x20\x8f\xd3\xb8\x71\x0e\x28\xb3\xb2\x28\x64\x0e\xcd\x69\x53\xd2\x6e\x9d\x17\x89\xdf\x4f\xed\x2a\xf3\x5e\xda\x74\x93\xa7\x00\xe7\x5d\xdc\xe6\xcb\x80\xec\xa1\xbb\xbe\x23\x07\x6e\x3f\xca\x97\xfa\xa5\x24\x8d\xa4\xcc\x4a\x91\x98\x3e\x52\x7a\x3c\xd2\x62\x2b\x5c\xfc\x26\x4b\x0f\x60\x55\xa1\xe1\x07\x0f\x9d\x5f\xf2\x57\xd0\x44\x4b\xae\x4e\x38\xc3\x57\x4f\xb2\xe5\xe1\xd6\xa7\x9d\xc7\xcf\x8e\xb0\xaf\x1f\x32\x8f\xb8\xb4\x3f\x32\x12\xbd\x6f\x64\x86\x1c\xa4\x98\x0f\xd0\x85\x64\x3a\x13\xe4\x90\x24\xea\x3c\x32\x0d\x7e\x22\x4e\xa4\x43\x1a\x5e\x05\x83\x0d\x5d\x3d\x90\x10\x9d\x8a\xa8\x68\x3d\xe4\x0c\xd4\x55\x66\x29\xa2\x97\x88\x62\x06\xd4\x60\x9a\xa0\x06\x3f\x21\x90\x66\x65\x21\x3b\x95\x2d\x17\x67\xd3\xe3\x00\x22\xf1\xda\x62\x73\x27\xf9\x49\x17\x92\x0c\xb2\x0b\x2a\x59\x4e\xd8\xc2\x61\x1d\x86\x35\x6c\xec\x01\x8d\x2a\xb2\xa5\xc8\x0b\xb1\x93\x1b\x11\x41\x2c\x38\xeb\x6e\xf9\x85\x3b\xa1\x87\x0e\x1c\xb9\x0d\x97\x87\xda\xe7\xb7\x1d\xe0\x89\xb2\x35\x09\xbc\x0a\x92\x5d\x09\x83\x8e\x80\xfc\x13\xde\xc4\xab\x81\xde\x6c\xa2\xff\xdf\x80\x5d\xb7\xea\x84\x44\x84\x7f\x1a\x44\x27\x67\xb3\x96\xc1\xc4\xe9\x90\x91\xcd\x77\xd4\xc6\xfe\x8c\x03\xac\xc1\xc6\x37\x35\x54\x9d\xe8\x8c\x4b\xc1\xf8\x26\x4e\x8d\xeb\x42\x06\x4d\x03\x8c\xcd\x65\x78\x36\x3e\x18\xb0\x3d\x16\x5c\xf2\xf3\xc1\x16\xc8\x15\x35\x98\x61\xce\xe1\x4a\x8f\x1e\x32\x20\x92\xad\x5b\xf0\xc3\x9d\x6a\x6a\xf1\x15\x5d\x62\x66\xd2\x45\x26\xca\xb4\xea\x6b\x4f\x9d\x8d\x31\x50\x36\x00\xfb\xef\x01\xdb\x01\xf6\x56\xf8\xe1\x20\x7a\x4f\x60\x6d\x70\xd7\x10\xb1\x1c\x0f\x58\x04\x17\x7c\xa9\xd7\x6e\x2b\x6b\x09\x10\x4e\x60\x30\xa6\xc3\xad\x08\x6b\x0b\x92\x62\x05\xf6\xd7\x80\xb5\x37\xf0\x39\x3a\xe8\xf0\xd0\x22\x34\x5d\xbc\x8e\xf9\xe7\x87\xdf\x3c\x3f\x60\x23\x65\xd9\x0f\x1f\x8a\x92\x2d\xf7\x66\x61\xe1\x01\x64\x22\x02\xa8\xf3\x38\x17\x49\x91\x59\x60\xe2\x3e\x68\xe2\x3e\x12\xe7\xca\x9e\xdf\xac\x0d\x1f\x08\x18\xa3\x04\xfa\xd3\x71\x1e\xbe\x33\x88\x7e\x22\x98\x72\x96\x3b\xfd\x46\x0e\xcf\x2c\xef\x37\x86\x04\xe7\x0c\x1d\xce\x7d\xe6\x72\xcb\x8b\x71\xd3\x18\x74\x03\x68\xd4\x29\x0f\x9c\xa4\x2e\xd6\x5a\xec\xc0\xe9\xb2\xf1\x86\xfe\x72\xc0\xae\xc7\xbd\x3b\x2d\x21\xbe\x25\xfc\xb3\x20\x7a\x9a\xf7\xa4\x1a\x4f\x0b\xc9\x84\x20\x68\xa3\x89\x1b\xde\x49\x42\xe6\xfb\x2c\xdd\x0d\x7d\x90\x4d\xb0\xfa\x16\x37\x34\x56\x7c\x29\xa8\x6f\xb2\xa3\xaf\x0f\xf7\x62\x33\x2e\x77\x4b\x7f\x72\x84\xed\x92\xe9\xea\x89\x3c\xeb\x84\x1f\x1d\x89\x5e\x3a\xa2\x7d\xb2\x7a\x37\xb9\xe7\xc7\x70\x3f\xed\xa0\x83\x76\x41\x63\x89\x75\x84\x8a\x35\x50\x08\xd6\x60\x82\xe8\xa6\x1e\x9c\x99\x3e\x7e\x66\x61\xe6\xc4\xcc\xf1\xb9\x06\x9f\x4c\x12\x4d\x72\xec\xe3\x29\x73\x49\xa1\x75\xa8\x42\xc8\x55\xd5\x04\xed\xfe\xf7\xfd\x02\xe0\x92\x81\xdb\x87\xfb\xf1\x32\xe0\x3c\xde\x0f\x28\x9d\x3c\x4e\xad\x3b\x8b\x3a\x38\x6e\xc1\x9d\x43\x83\x8f\xe0\x58\xa3\x66\x43\x6b\x4a\x71\x1e\xd0\x99\x4d\xd9\x52\xa6\x02\xa5\x8f\xf3\x62\x7c\x44\xca\x8f\xa7\xab\xc6\xf4\xe8\xa1\xd6\x8e\xc8\xd2\xe1\x65\x6c\x7c\x04\x6c\xcd\xbd\x7a\x1c\xa7\x11\x01\xe5\xac\xc3\xf6\x24\x71\x5b\x36\xfb\xcd\x44\x86\x8b\x5b\x40\x5d\x9e\xd2\x6f\x47\x87\xcc\x3f\xb7\xee\xde\x3c\xcf\xae\x4f\xe2\x55\xf9\xe8\x38\x73\x9f\xc3\xae\x83\x59\xee\x75\x1f\xf9\xba\xde\xe0\x67\x84\xae\x44\x28\xcc\xf5\xd2\x49\x84\x42\xcf\xd3\xde\xd2\x34\xe3\x9f\x1d\x89\x16\xd7\xfd\xb5\x82\xbc\xc4\xdf\x30\x8a\x14\x5c\x99\x69\xdf\x20\xb1\x35\xcc\x9d\x88\x76\xdd\x0f\x1a\x17\x83\xd1\xbc\x97\xf8\x57\x2c\x7f\x53\x63\xff\x2b\x60\x3b\x73\x40\xc9\x85\x7f\x1f\x44\xef\x08\xf0\xdf\xd0\x67\xf5\xb9\xee\x33\x3d\xce\xda\x7c\x39\x6e\x15\xde\x6d\x20\x46\x11\xcf\x60\x50\xee\x1a\x1c\x1e\x00\xfb\x2e\x33\x0a\x12\x35\x1e\xe6\xe5\x98\xfc\xb1\x45\x0f\x22\xc7\xcc\x0f\x50\xba\xdd\x46\x90\x30\x06\xa1\xc1\x70\x31\x91\xb6\x30\x98\x26\xd6\x4e\xba\xd3\xbd\xa2\x84\xf1\xf2\x56\xfe\x61\x76\x90\x4d\xac\x3b\xb7\x95\xc9\x98\x99\x9e\x53\x95\xb2\x84\xc1\xb0\x84\xad\xe8\x7e\x0c\x69\xa9\x8e\xb3\xea\x29\xec\xc3\x56\xdc\x34\xf4\x86\x30\x2c\x60\xc0\xdb\x69\xd3\xd0\x7c\x77\x6c\x10\xcb\x6e\xcf\x8d\x1f\xbe\x81\x3d\xfd\x4a\x11\x9f\xd8\x6e\xcd\x7f\x09\x9e\x6a\x64\xc1\x0c\x3f\x78\x7d\x74\xff\x90\xe7\x16\x5f\x88\x1e\x12\x2f\xab\x62\x47\x49\x15\xc1\x17\x4e\xcd\x73\xf2\x75\x63\x96\x21\x9a\x82\x35\x2c\xce\xc7\xed\x7e\xea\x3a\xf6\xa1\x80\xed\x6e\x8a\xbb\x7b\x69\x2b\x91\xe1\x7b\x82\x70\x54\xe9\xcc\xd1\x9b\x02\xfd\x0c\xaf\x8d\x67\x8f\x9f\xe6\x32\x6d\x66\xca\xcc\x9b\x9a\xe4\x4b\xf8\x13\x1e\xc2\xd5\xc4\x3b\x9a\xdf\xde\xad\x76\x5f\x61\x32\xfe\x2a\xeb\x0f\xc8\x5e\x50\x57\xf2\x90\xff\x3a\xa0\x3a\x57\x27\x44\x9e\x65\x65\xa1\xe3\xe1\xcc\x70\x22\xd7\x4a\x51\x39\xbe\x5f\x5f\x63\xbb\x08\x21\x19\xbe\xa2\xc6\xbe\xfd\xda\x40\x72\x35\x27\x11\x94\x6b\xc3\x95\x1f\x0e\x34\x18\x13\xc6\xc6\xba\xae\x9c\x24\xa0\xea\x57\xf4\x3e\xc7\x85\x19\x7b\x7e\x1c\x53\xd3\xea\x17\xb2\x9c\xf7\xf2\xc4\x9c\x87\x36\xb2\x9b\x31\x8a\x23\xa4\x2f\xc9\xe3\x6d\x12\x8e\xf9\x89\xeb\x28\xb2\x4b\xed\x56\xd2\xf5\x94\x62\xbc\x48\xb5\x2c\x36\xd8\xdf\xef\x66\x23\xbd\x3c\x09\xbf\xb0\x3b\xfa\xa3\xdd\xaa\xc6\xe5\x78\x95\xc4\x8f\xbe\xce\x36\xc1\x5a\x58\xe1\x38\x87\xab\x21\x62\x94\x38\x37\x77\x8a\x03\xa6\x71\xff\x22\xe0\xf3\xe4\xb1\x89\x89\x95\xac\x28\x8f\xa9\x63\x79\xa2\x2b\xca\x95\xc5\xb1\x06\x3f\x7e\x41\xc0\x6d\x36\xe1\x30\x16\x7b\x79\xb2\xa8\xba\x68\x1a\x32\xb4\xa3\x10\x39\xaa\x0a\x5b\xf4\x53\xcf\xb6\x11\xea\x28\xcc\x60\xe9\xfe\xfb\x7d\xbf\xc3\x58\xa0\xb6\x1a\x1d\x7c\x57\x94\x52\x90\xa7\x10\xe3\x8f\xb5\xb6\xa8\x5d\x8f\x70\x9d\x2e\x29\x6f\x3f\xc4\x11\xaa\x5e\x67\x1d\x67\xb9\x15\x18\x08\x38\xce\x17\x11\x3e\xab\x9f\x2f\x6a\x4f\x26\x95\xc5\xe3\xb4\xae\x73\xf3\xa9\x82\x04\x89\x8d\x35\x6d\xc9\x0b\x9e\x88\xbe\x44\x18\x60\x9c\x25\x30\xe8\x63\x0d\xdd\x75\x25\x5d\x40\x0b\xc7\xe8\xa4\x99\x59\x2e\x5a\x2d\x8c\xae\x65\xb3\x98\xd4\x3c\x35\xd7\x17\xe8\x74\x5d\x54\x53\x97\xe0\xe7\x6a\x94\x0f\x1e\xba\xb5\x71\xa0\x71\xa0\x71\x70\x11\xef\x92\xa9\x64\xb5\x72\xe2\xe2\x7c\xdf\x4d\x58\x0d\x0a\x08\x38\x53\x78\x13\xce\x05\x9d\x2d\xcb\xae\x55\x20\x3e\x4a\x12\x18\xb8\x82\x36\x3a\x64\x35\x4c\x9d\xad\xe8\x2a\xe1\xa9\xc4\xdd\x0f\x62\xa8\x29\x92\x84\xae\x44\xdc\xe5\x3f\xdf\x6b\xae\x68\x32\x27\x3c\x91\xd4\xb9\x82\x68\x93\x25\xcc\x4e\xa3\x56\x94\x12\xc3\xe3\x3c\x6e\xc8\xc6\x38\x2c\x06\x29\x0a\x78\xa5\xec\xe5\x29\xef\x75\x11\x4f\x9b\xca\x35\x93\xb8\x11\x57\x11\x2e\x4d\xb3\xc8\x22\xf0\xd2\x45\x98\xe4\x46\xad\x60\xfa\x61\x39\x26\xa9\x18\x69\x37\x5e\xd4\x60\x6c\x12\x23\x58\xe0\xc6\x12\x7d\x6d\x94\x8f\xa8\x6d\xe2\x6b\x34\x56\x26\xed\x6b\xb7\xb4\xc6\xd6\x42\x5e\xf3\x14\x53\xe0\x63\x90\xa9\x7a\x57\x2f\xcc\xae\x76\xc4\x00\x35\x7d\xca\x45\xbe\x14\x97\xb9\xc8\x4d\x31\x24\x36\xcc\xd6\x6b\xfb\x69\xd3\xf4\xb2\xb2\x59\x51\x55\x7b\x91\xb3\x80\x3e\x57\x55\x59\x2c\xf2\x92\x28\xe2\x26\x40\xe5\x30\x09\x49\xa4\x7e\x38\xa6\xaa\x5f\xcb\xf2\xd6\x53\xa3\x8a\x5e\xd7\xe0\x27\x72\xb1\x8c\xb7\x58\xfb\xa3\x27\x36\x1a\x8d\x68\x0c\xfa\xfe\xdc\x9e\xcc\xfb\x6e\x3a\x80\xfd\xd1\x53\xe8\x57\x5f\x81\x1a\xe7\x98\x73\xdb\x13\xc9\x97\xf6\xb0\x3b\x7d\xc0\xa1\x8e\xa8\x68\xac\x1e\x22\x56\x2b\xad\x69\x69\x8f\xc0\x69\x59\xe6\x71\x93\x82\x22\xdf\xbb\x27\xfa\xc4\xc8\x86\xaf\x54\x52\x8e\x94\x19\x05\xaf\x00\x69\x97\x45\x51\xc3\x17\x1c\x13\x8f\x97\x99\xc3\x86\x02\xd1\xf9\x16\x82\x11\xa7\x4e\x04\x78\xda\x42\x6f\x52\x31\xae\x41\x7f\x00\xe9\x14\xcd\x15\xc4\x17\x91\x14\xd2\x28\x40\xa8\x97\xa2\x31\x31\x74\x78\x6a\xf6\x1c\x24\xb1\x97\x9d\x2c\xef\x8f\x01\x2b\x8b\x1c\x60\x9e\x58\x95\xb9\x58\x86\x8d\xb3\x2c\x29\x6b\x39\x04\x97\x23\x80\xb4\x99\x75\xba\x22\xb7\x2e\x0c\x2c\xbf\xc1\x71\x23\x61\xbf\x70\x1f\x2d\xf5\x62\xf4\x18\x54\xfb\x07\xd9\xfb\x56\xa5\xa1\xb4\xa4\x29\x30\x0a\x26\xe8\x0e\x5d\x94\xfe\x59\xe1\xe6\x01\x84\x9c\x95\x79\x47\x24\x6a\x99\xd7\x01\xe8\x44\x15\xda\x4b\x9f\xa8\x9b\xb5\x8a\x88\xeb\xa0\x12\x0e\xac\x21\x4a\xfe\x47\xd8\xd4\x88\xb8\x51\x8c\x3f\x53\xa9\x4f\x26\xa3\xf2\x1e\xa3\x69\x7b\x4a\xc9\x07\x77\xb0\x9f\xa8\xb1\x10\x4b\x98\xc4\x11\x02\x2b\x2b\x7c\x79\xed\x32\x38\x92\x1a\x26\xd8\xe5\xe9\x3d\x01\x09\x6d\xa3\x8f\x07\x83\x85\x6a\xfd\x90\xe6\x0e\x4d\x41\x3a\x0c\x69\x7a\x6c\xa8\xa1\xbf\xa2\x1c\xe7\x72\x2e\x13\xb9\x2a\x52\xcc\x0d\x3a\x8e\x02\x38\x17\x6b\x54\xdc\x7e\x3a\x8b\x00\x26\x0a\x08\x33\x99\x37\x65\x5a\x7a\x65\xc3\xc2\x1b\x1b\xe7\x45\xdc\x89\x13\x91\xeb\x39\xa7\x21\xa6\x2a\x35\x46\xbc\xdf\x95\x0d\xb6\xc4\xec\x08\x86\xe7\xa2\x93\x9e\x21\xbc\xfe\x95\xbf\xc5\x7f\xd9\x84\x8e\xb4\x2a\x70\x10\xdc\x5d\xec\xc4\x41\xbb\x51\x92\xa9\x97\x53\x5a\xc7\xe8\xa4\x1c\x3a\x51\x85\x6f\xfe\x5d\xc0\xbe\xde\x1b\xf8\x73\x65\xac\xb3\xdf\x87\x9f\x08\x74\xa0\xef\x2f\x07\xeb\xbd\xf4\x88\xcc\x91\xcb\x1b\xbd\xf1\xa4\xe8\xa0\x82\x81\x3a\x1c\x78\x41\xe1\x47\xb8\x7e\x72\x37\xfb\x86\x75\xd0\xc5\xc0\x9e\xf7\x9e\xdd\x11\xa7\x7f\x0f\x23\xcd\x7b\x4e\xb6\xb4\x0e\x53\xde\x4f\xed\x62\xcf\xd2\xc1\xb3\x73\xd1\x13\xe2\x61\x44\x6f\xf7\xa8\xaf\x5d\x3b\x6a\x8c\xed\x63\xdf\xb6\xae\x1d\xe5\x36\x6e\x3b\x82\xe1\x2a\x22\x18\x3e\xe6\xf2\xb9\xfd\xca\x55\xf2\xb9\x7d\xd7\x63\x94\xfa\xc1\x50\xb3\x6f\x07\x03\x5d\x5d\x30\xd0\xa5\x60\x6e\xf3\xd8\x86\x89\xb0\x6e\x62\x1b\x60\x1f\x9a\x60\x06\x92\x0e\x55\xd6\xed\x37\x8c\xb2\x6f\xdd\x08\x5c\x09\x89\x13\xc2\x7f\x19\x89\x7e\x32\xf0\x9f\x51\xdc\x8a\xb0\xc9\x84\x4d\xe4\x82\xe3\xbb\x35\x07\x78\xd6\x06\xe0\x73\x47\x76\x96\xf4\x96\xf5\x0c\x37\x74\xe0\xa7\x5a\x26\x76\x2a\x57\xeb\xa5\xc3\xfc\x46\xe9\xeb\xfc\xe6\xdc\x2f\xe2\x72\x80\x07\xe2\x83\x35\x96\x31\xa6\x2f\x08\x65\x2b\x14\xec\xf6\xad\xe3\x4a\xa1\xdc\x05\xf3\x71\x74\xd3\xb4\x17\xac\x20\xb8\x2d\xd8\x76\x99\xb5\xd9\xae\x35\x6c\x4b\xf8\xac\x0d\x08\x59\x87\xd7\x46\xbd\x88\xbe\xb5\x5a\x15\x15\xe9\xd7\x43\x16\xec\x15\xd4\x33\x87\x5f\x0e\xd6\xa3\x8d\x62\x5b\xcf\xe7\x6b\x1e\x8f\x6b\x3b\xc9\xd6\x28\xc1\x84\x71\x68\xa0\x4f\x12\xe3\x64\xc2\xf7\xd6\xa2\xa7\xb8\x0f\x68\x9d\x60\xa0\x47\x25\x82\xb5\xad\x03\x1d\x61\xf1\xea\x5c\x1a\x43\xb1\xde\x9f\x09\xd8\xa7\x35\x12\xfa\x93\x41\xf4\xdf\x02\x57\x7b\x00\x43\x05\x23\x26\xc9\xb7\x06\x3c\x34\x80\xc8\x88\x6e\x8e\xd0\x8c\x2c\x9b\x2b\x70\x6c\xdb\x97\xe1\x08\xf1\xf2\xd3\xae\xf4\x96\x1a\xcd\xac\xe3\x00\x31\x26\x8c\x75\x3a\xb1\x94\x64\x4b\x13\x1d\xa1\x6c\xa7\x89\xee\xf9\xe5\x09\x65\x10\xa9\x3d\x4b\x10\x1a\x55\x2e\xfc\xa7\xb1\x9c\xe1\xc5\x9e\x32\xfc\xd7\x64\x92\xd4\xd1\x54\xc0\x06\x12\xe5\x89\xf6\x56\x7a\x8a\xcd\x6b\x76\xb2\xfd\x6e\x22\x5f\x24\x52\x02\x0b\xc7\xe7\x67\x5b\x38\x35\x1f\x7e\x6e\x47\x74\xda\xfe\x59\x49\x05\x0b\x81\x2f\x00\x3c\x04\x2f\x01\xd7\x68\xe5\x81\x4b\x09\xcb\x86\xe5\x6f\x9d\xef\xdd\xc1\x2e\xd6\xd8\x0e\x30\xd7\xc3\x57\xd6\xa2\x2f\x07\x27\x33\xcd\x64\x65\x59\x8f\xd1\x9a\xa7\xd8\x50\x63\xc4\x80\xcb\xd0\x75\xcb\x39\x96\x4a\x4c\x6e\x01\x3c\x84\x7a\x9a\x34\xc8\x28\x81\x13\x1a\x4e\x86\x45\x95\x49\x81\x94\x0c\xfe\x95\x7a\xe9\xd2\x00\x81\x2f\x46\x53\x0b\x6a\x15\x2a\xc9\x44\x6b\x49\x24\x22\x6d\xca\xdc\xc9\x88\xc2\xdb\xbd\x44\xf3\xf9\x43\x3b\xa8\xf3\xe3\xca\x30\x4f\x64\xbb\xac\x10\x22\xae\x0b\x6b\xfa\x7c\xcd\x63\x7e\xf8\x83\x5a\xf4\xf1\xda\xbc\xf9\x7b\x98\x5a\x4b\x64\x10\xda\xab\x69\x84\x07\x0c\x97\xe6\xec\xca\x52\xe4\x29\x3b\x72\xe4\x70\x83\x9f\xd0\x69\x0c\xa1\x61\xda\x8f\x00\x5e\x2c\x48\xfe\xa8\x3e\xcc\xb3\x1e\xf4\xdb\x90\x7d\xcd\x9f\x99\x81\x11\xc1\x6c\x34\x49\x96\x5a\x12\x31\xfd\x13\xfa\x16\x80\x2a\x24\xc5\xd1\x01\xe6\x96\xc2\x3a\x77\xa3\x93\xc0\x12\x47\x64\x4d\xe8\xff\xd2\x57\x91\x3e\xe1\xdb\x78\xa5\x64\x9a\x3e\x98\x06\x07\x98\xa1\xce\x54\x4f\xe7\x3d\xe9\x93\x41\x99\x8f\xa8\x3f\x7e\xba\xf3\xeb\xd8\xf1\x2d\xe7\x22\x3b\xdd\x2b\xd7\x4d\x03\x15\xfe\xed\xde\xe8\x2b\xc1\x46\x6f\x54\xb6\x91\x9f\x7d\x1f\xd4\x8d\x96\xcd\x47\x65\x7c\x5b\xc8\x6f\x03\x88\x71\x8c\x0e\x02\xc1\xa7\xf5\x08\x22\x89\x73\x48\x03\xf8\xb4\xd2\x63\x10\x4d\x10\xa7\x90\xae\xfa\xe8\x38\xef\x26\x22\x4d\xf5\x30\xc8\x4e\xb6\x2a\x12\xfd\xeb\xed\x0d\x7e\x4e\x19\xd3\x1b\x64\xc2\x9a\x58\x3d\xc8\x37\xec\x99\xf6\x5f\x7a\xdb\xfc\xf7\xb6\x83\xb4\xb7\x83\xb4\x1f\x43\x13\xe7\xb7\x5d\x13\xe7\xd7\xae\x3a\x09\xd5\x0b\xaa\x49\xa8\x8c\x9d\x73\xc7\xa3\x65\xe7\x34\xd8\x0b\x6b\x6c\x37\x49\x86\x22\xfc\xa7\x20\x9a\xa1\xed\x58\xc9\x18\xa0\x5f\x31\xf0\x34\x43\xb6\xe5\x80\x8f\xd2\x96\xa6\xfc\x55\xd5\xb8\xe7\xd1\x3d\xec\xe4\x46\x91\xe8\x97\x23\x23\x1f\x89\xb8\xb5\x4b\xc1\x0b\xb7\x90\xe6\x6f\x31\xfc\x8e\xcb\x4b\xf3\xb7\x91\x84\x1b\x1a\x96\xfd\xa5\xeb\xd9\x37\x0d\x49\xf0\x37\x27\x01\x45\x31\x2f\xcb\xf0\x63\xd7\x47\x0f\xd8\x3f\xb9\x4c\x8b\x5e\xae\x2f\x69\x5d\x12\xdb\xb4\xa7\x4c\x17\x35\x73\xdd\x0c\xb2\x4c\xa9\x2f\x28\x8f\x1f\x69\xcd\xea\x8b\xb4\x4f\xd4\x1c\x80\xde\xf2\x84\xed\xcb\xae\xdb\x16\xb6\xdb\xc2\xf6\xb1\x13\xb6\xff\xad\xe6\x08\xdb\xf7\xd5\xae\x56\xd8\xfe\x6b\x40\x7a\xe5\x29\xb1\x24\x93\x02\x39\x0b\x9c\x9d\x04\x81\x1d\x48\x2b\x01\x31\xc3\xea\x6f\xc3\x2c\xa1\xd1\x80\x1a\xcc\x41\xac\x90\xb3\x59\x6b\x7f\x31\x66\xa3\xaa\x9c\xe2\x90\x03\x52\x4d\xd3\xbf\x83\x3c\x83\xff\xa8\xf9\x40\xbe\x18\x6c\x80\x28\x19\x94\x36\x40\xfc\xf1\x8b\x48\xfc\xe1\xa1\x76\xaa\x29\x6b\xd0\xe1\x51\x00\xa0\x85\xa8\xee\x73\xfd\xdc\x16\xf7\x88\x77\x58\xb5\xab\x2e\xd2\x56\x1d\xe1\xdd\xec\x37\x6a\x86\x3a\xe1\xfd\x35\x76\xf0\x72\x7a\x8e\xbc\x1f\xdf\x53\xb3\xc4\x1f\xaa\x2f\x1d\x65\x07\xe4\xb2\x89\x3c\xcd\xd9\x12\xd8\xda\x2d\x8d\x26\x1f\xd2\x61\x88\x63\x86\xa8\x4c\xf2\x21\x65\x3d\x38\x4e\x01\x21\xb2\xd4\x27\xab\x3b\x4e\x5b\xd9\x1a\x7c\x0e\x18\xda\x59\x0d\x7b\x37\x14\x23\x04\x96\x9e\x93\xa2\x55\xcf\xd2\xa4\xff\x68\x8f\xe4\xa5\x60\x61\xf3\xe3\xf1\x60\x38\x31\x3c\x9b\x9e\x1d\x90\xaa\x3f\xef\x53\x7b\x87\x5f\x14\x4c\xe5\x59\x7a\x4f\xb6\x14\xbe\x77\x6f\x74\x8c\xfe\x5d\xe5\x73\x1f\x34\x76\x34\xfa\xaa\x99\x67\x29\xb0\x91\x78\xc7\xd9\xeb\xd8\xf6\x71\xb6\x7d\x9c\x3d\x76\xc7\xd9\x57\x65\x02\x5b\x97\x68\x6a\x7d\x58\x77\x75\x5b\xc3\xb1\xf2\xbe\x60\x7e\xab\xa7\x88\x30\x5b\x7a\x9c\xbc\x77\x7a\x69\x11\x75\xca\x23\x3f\xa9\xd5\x93\xe5\x63\x96\x68\xea\x03\x1b\x9d\xa9\x03\x5d\xc7\x73\xe5\xe5\xc1\x94\x43\xa0\xd4\x2b\xfc\x5e\x3e\xfa\xd2\xfd\xaa\xee\x6a\xa8\x6b\x55\xd9\xfe\x03\x01\x3b\xba\x01\xe5\x96\x9b\xec\x70\xae\x97\x48\x87\x6b\x2c\x5c\xf0\x24\xf7\x09\x36\xcd\xf6\x98\x08\xf7\xf0\xd6\xe8\xe6\x33\x2e\x2b\xad\xe6\x19\xa3\x0c\x1f\xed\x2c\x5f\xc7\x5f\xfd\xfe\x91\xa1\x97\x47\x44\xcf\xad\xb1\xcb\x3f\x34\x12\xdd\xe9\x3f\x32\xe0\xe1\x04\x35\x47\xd4\x05\x21\x1e\xd5\x82\x53\x86\x83\x39\x3e\x52\x63\x4f\x67\x3b\x12\x35\x31\xe1\xc9\xe8\x8e\x53\xea\x1f\x4a\x64\x6a\x4a\x70\xf8\x85\xc8\xf7\xd1\x84\x83\x52\x8b\x81\x52\xbd\x8e\xcc\xb2\xd1\x3c\x4b\xa4\x2a\x71\x2e\xd3\x18\x55\xc3\x32\x9e\x69\xc2\xff\xcb\x2b\x11\x48\xa1\x4e\x46\x77\x00\x29\x94\x57\x22\x80\x58\xae\xa0\xc4\x5e\x21\x73\x55\xe2\xb9\x42\xd3\x2f\xe9\x12\xe1\x52\xe3\x72\x4b\x7c\xf3\xde\x2b\xc7\x1a\x57\xd8\x65\xa7\xcd\x66\x0d\x7f\x8b\x45\xaf\x09\xd6\xfb\xd5\xa7\xd7\xf7\xf9\x72\x2d\xaa\x47\x5e\xe8\x66\x4e\xee\x0a\xcb\x6f\xda\xe0\x7c\xa6\x24\x1a\x9b\xd3\xe7\xe6\x17\x88\x7b\x1c\xc2\x56\xe1\x56\x89\xdf\xd9\x30\xcc\x78\x77\x35\xe8\x0f\xd8\x63\x77\x0d\x25\xa9\x7c\x78\x37\x7b\xb7\x15\x3c\x6f\x7b\xa4\x98\x86\xed\x00\x90\xb8\x9a\x1c\x4a\xbd\x2b\x9a\x65\x4f\x27\xf0\x37\xa9\x00\xd6\x29\x68\x5b\xf7\xda\xd6\xbd\xbe\x4a\xc8\x35\xdf\xaa\x75\x9e\x1f\x0b\x58\xf3\x91\xde\x7f\x4a\x53\xba\xbd\x40\xfb\x5b\x5f\xf5\xe8\xd8\x69\x90\xa2\x6b\xc2\x24\xb8\x92\x4e\xd8\x1a\x92\x9d\x5d\x0a\xf2\xcd\x0f\xf6\xb3\xe1\x69\xc7\x6c\x73\x1b\x56\xf1\x66\xae\xbb\xb7\x2b\x07\xff\x67\x77\x7b\x79\x4d\x80\x7d\x68\x55\x8d\x2a\xc4\x69\xe1\x4a\x9a\xb2\x34\xcf\xbf\xb0\x3b\x9a\x1a\x7c\x3c\x60\xee\x91\xbe\x64\x29\x02\x71\xfb\xeb\xa5\xe9\x1b\x7b\x7f\xbe\x8b\x7d\xa2\xc6\x76\x40\x2c\x6c\xf8\x91\x5a\xf4\x4b\x35\x0c\x8b\x75\x05\x98\x21\xfb\x31\x94\xde\x90\x8e\xc6\x40\x4e\x35\x0f\x11\x5d\x76\x8e\x73\xd1\x6c\x66\x79\x8b\x30\xc7\x86\x7a\x87\x82\x36\x20\x93\x40\x2a\x96\xf5\xc6\x33\xed\xe2\x93\x3c\x8d\x75\x0a\x0d\x5b\xbf\x48\x79\x0f\xd9\x19\x29\xd9\xbf\xda\x28\x1d\xcc\x6c\x54\x48\x08\x60\x2d\x7a\x1d\x47\xa0\x81\x9c\xea\x42\x3a\xb8\x15\x48\xad\xe4\x7c\xcc\x45\x01\x41\xb6\xfd\x06\x3f\x91\xe5\x08\x9c\x2d\xe3\xa5\x38\x89\xcb\x3e\xb1\x4e\x16\x18\x86\xdb\x37\x61\x06\x9a\xde\x23\x2a\xf3\x9e\x8c\xfc\x2b\xd0\x74\xd9\xb4\xbf\x92\xee\xee\x53\x3a\xd2\x24\x5d\x0e\xff\xef\x5a\xf4\x2b\x35\xfa\x03\x98\x10\x5a\x88\x2f\x48\x70\xf4\x54\x65\xf2\x02\xdc\x32\x22\x27\x73\xa9\x79\xb2\x7c\x1e\x91\xb2\x92\x99\xc9\x9c\x27\xb6\x09\xe8\x46\xb1\x53\xef\x21\x6a\x35\xed\x16\xe5\x5a\xa3\x8a\xad\xc4\xc2\xd4\x37\x4e\x0d\x88\xde\x89\x93\xf1\xc1\x41\x6e\xe9\xc0\x0b\xdc\x50\xaa\x24\x53\x2b\xb5\x02\xaf\x97\x35\xd1\x0a\xf1\x02\x9a\xab\x68\xbd\x90\xe7\x93\xb8\x69\xd0\x38\x71\xba\x6c\x39\x54\x35\x4f\xe0\xb2\x9a\x74\x6f\x6c\x1f\xae\xb1\xbd\x4e\x33\xc3\x37\xd4\xa2\x57\xd4\xdc\x91\xd9\x6c\xf5\x7a\x7d\xdc\xea\xb2\x9b\xba\xac\x85\x56\x66\xbc\x23\x81\x6a\x9e\x5c\x9e\x6e\xfd\x4a\xf4\x7b\x6d\x78\x84\x07\xec\x15\x3e\x00\x65\xfd\x04\x81\x0b\xa7\xe6\xc3\xcf\x3c\xa2\x00\x94\x17\x6d\x03\x50\x36\x04\xa0\xfc\x85\x0f\x40\x01\x7a\xb6\x2b\x04\xa0\xcc\xcf\x9f\x72\x01\x28\x5b\xc2\x9e\xa8\x6f\xfe\xff\x80\x3d\x79\xeb\x1e\xef\xe8\xb5\xcc\xb2\x18\x05\x1c\x67\x40\xdf\x68\xb2\x98\x5f\xda\x1d\x1d\x1d\x78\x3a\x0c\x91\xdd\xa5\x97\xb6\xf3\x98\x3f\x8a\x79\xcc\x6f\x1a\x0a\x6f\xf7\xe6\xcb\x4f\x64\x7e\x1b\x3b\xca\x8e\xac\x9f\xc8\x7c\xfd\xc5\xb0\x6d\x5c\x6c\xe7\x31\xa7\x3c\xe6\x2b\x9b\x1b\x0c\xc7\xc3\x29\x63\x30\x38\x8b\xaa\x62\x2d\x0c\xc8\x95\xaa\x99\xf0\x3d\x21\xfb\xe6\xa1\xac\xb3\x10\xc7\x3a\x9b\xe5\x65\xf8\xe7\x8f\x8f\x0e\x3b\x7f\xdb\x00\x70\x17\x96\xab\xf4\x41\x7c\x67\x5f\x01\x70\xc4\xc6\xc5\x60\x54\xfd\xbf\x27\x9b\x7e\xe4\xf1\xec\x39\x6c\x77\x37\xcf\xca\xac\x99\x25\xe1\x77\x44\x4f\x5f\xc0\x0c\xaf\xfa\x91\x8d\x57\x86\x32\xf8\x3c\x52\x61\x16\x3c\x5a\x98\x9a\x8d\xc6\x79\x74\x6e\x5a\xfd\x9f\x92\x1b\xd1\xfc\xd4\xc2\x6c\xe4\xd1\xc2\x2c\x4c\xcd\x7a\x82\xf8\x33\xa3\x8c\x61\xbc\x0e\x74\xe4\x13\xa3\x5b\xb5\x3a\x7b\x65\x9c\x34\x94\xd2\x5b\xe6\x8d\x99\xb4\x3c\x9b\xcf\x43\x81\xd1\xab\x46\xcf\x10\xa2\x23\xf7\x8e\x49\xa4\xeb\xcc\x00\xcf\x57\x98\x78\x71\x88\x6e\xc2\xfa\x9d\x5b\x44\xca\x97\xc3\xa9\x24\x1d\x2a\x4a\xba\x03\x92\x16\x1c\x54\x85\x1d\xbd\xe5\x96\xc3\xb7\x60\x9a\x71\x4b\x57\x92\xf2\x99\xc9\x33\x93\x0f\xce\xdf\x37\x05\xd4\x81\x1e\xd5\x8f\x96\x14\x90\x92\xc1\xf0\x8b\x65\xd9\x79\xd9\xe2\xbd\x2e\x06\x18\xa9\x56\xb7\xb0\xbd\x5a\x5b\xc1\x80\x26\x4c\xe7\xee\x70\xc5\xaa\x61\x1f\x64\x12\xf2\xe1\xf5\xde\x11\xb9\x4f\x7d\xb2\x4f\x47\x3e\xd3\x19\xb9\x5f\xa4\x64\x92\x94\x7d\xde\x11\xdd\x31\x4f\x1f\x55\x05\x43\x52\x25\x3c\x4c\x75\x5e\x67\x3c\xd8\x29\xe6\x74\x66\xf6\xc9\x67\xb2\x94\x0e\x0b\x6b\x73\x64\x9d\xb8\x2c\x91\x59\x5d\x99\x1f\x5e\x12\x0b\xb7\x25\x97\x9f\x2b\x8d\x1a\x51\xb7\x50\x6a\xfd\x6c\xe2\x89\xb8\x78\x80\xd1\x90\x9e\xb1\x5f\x1e\x61\x7b\x45\xb7\x3b\xab\x17\xf5\xcf\x8c\x44\x6f\x1c\x59\x58\x21\xdf\x34\xdd\xab\xac\xb7\xbe\x9d\xb1\xc0\x0c\xad\x85\x8d\x78\x77\x32\xe6\xa3\x97\x16\xe9\x25\x1b\xfc\x5c\x5a\x37\x79\x6e\x6d\x4e\x6f\x25\xea\xe1\x1e\x5c\x55\xa1\x16\x89\x2d\x49\x87\xaf\xe3\xcb\xfb\x05\x64\xe4\xe1\x73\x27\xa6\xea\x47\x0f\x1f\xbe\x05\x03\x34\xcb\xb2\x7b\x6c\x62\x62\x6d\x6d\xad\x11\x8b\x54\x34\xb2\x7c\x79\x42\x14\x45\xbc\x0c\x5c\x3b\x66\x54\x20\x00\xaf\x18\x6b\xf0\x33\x59\x5a\x37\xe5\xeb\xde\x15\x6e\xec\x7f\xa5\x89\x9a\x7e\xaf\xd3\x07\xc3\x38\xed\x03\x68\xbe\xd3\xaf\x63\xee\xad\xba\x2e\xc3\xe1\x7f\xe7\xca\x7c\xa0\xd1\xd1\x16\xe4\x72\x4f\xe4\x2d\xbb\x9b\x48\x2e\x4d\xda\xf1\xf7\x2c\x15\x62\xfa\x30\xb4\xf1\x3a\x0b\xa7\x2b\x24\x7e\xae\x46\x21\x02\x6f\xad\x45\xaf\xaf\x2d\x78\x0a\x30\xcd\x93\xcb\x77\x60\xf6\x2f\x66\xb3\x34\x34\x42\x0e\x6d\xfa\x24\x70\x46\xe6\x65\x61\x59\x87\x74\x8a\xae\xae\x6c\xe2\x37\x10\x10\x4b\x6c\xea\x04\xef\x07\xb2\x20\x65\x0c\xc7\x2d\x8c\xd1\x77\xcf\xe5\x82\x0c\x6b\x2a\x68\x1c\x1b\x57\xb1\x45\xf6\xa9\x92\xf6\xf9\x89\x7f\xb5\x69\x37\x0b\xeb\x4d\x93\x38\x2a\xcb\x21\xd3\x71\x36\xae\x70\x8f\x2d\x8d\x50\x96\xea\xfc\x9d\x3a\xc3\x97\x1d\xb4\x17\xec\x60\xbb\xd3\xac\x85\x07\xc4\x3f\x8e\xea\xf0\xc9\x4f\x8f\x2e\x98\xac\xd9\x29\x06\x2a\x03\x6f\x62\x96\x1a\x6a\x48\x5b\x20\x90\xed\x91\xd7\x1e\x89\x94\xe8\xd2\xe3\x0c\x15\xac\xf6\xf6\xa9\x4c\xb4\xee\x26\x93\xa8\xc1\xf9\xb9\xa2\x27\x92\x04\x2c\xc2\x78\x39\x1d\xc4\x66\x10\xd1\x2b\xc5\xd4\x3a\xd2\x2a\x4e\xeb\x20\x5a\x51\x8c\x28\x51\x16\xa7\xb0\x4c\xe3\x2a\xab\x97\x61\xe0\x44\xf4\xb5\x46\x52\xe2\x5b\x6d\x11\x27\x43\xd3\xfa\x0b\xbd\x50\x28\xa8\xda\x30\xbf\x69\x8e\xdb\x79\x4d\x21\xa1\x29\xce\xc0\xd2\xb1\xac\xdd\x5a\x1e\xba\x09\x36\x25\x25\x92\xc5\x1c\x5d\xba\x04\x1c\xc9\x56\x26\x51\x24\xa7\x98\x20\x62\x9c\x5e\xf5\x5b\xea\xc8\x17\xc3\xb8\x19\x77\x75\xe1\x26\xe7\x83\x2d\x1c\x22\xae\x79\x92\xa5\xcb\x32\xd7\x45\x53\x30\x39\x60\xd2\x61\x5d\xaa\x79\x02\xcd\xd1\xcc\x54\x99\xf1\x29\x2d\xae\xc7\xae\xad\xc8\x55\xb5\xd5\xd5\x2a\x42\x6d\xc2\x09\x70\xbd\x97\x81\x86\x11\x4e\xe9\xe5\xd7\x30\xab\xcf\x12\xec\x38\x57\x43\x36\x21\xad\x5e\xd0\x4e\x61\x1f\xd9\xcd\x1a\x5b\x8a\xa3\xb1\x86\xdb\x0f\xed\x8e\x0e\x57\x1f\x0e\xb3\xdb\xdc\x77\xd6\xb3\xda\xfe\x70\xe7\xb6\xd5\x76\xb5\x56\xdb\x05\x6d\xb5\x65\xd1\x4d\x33\xc3\xac\xb6\xca\x44\xb8\x56\xdb\x9d\xec\x18\xbb\x6d\x5d\xab\x6d\x93\xd5\xb0\x6d\xb9\x5d\x85\xe5\xb6\xe4\x18\x6e\xf7\x5d\x9d\xdd\xf6\x75\xeb\xc4\x2b\x5f\x0a\x92\xcd\x0d\xaa\x99\xf0\x69\xc6\xa0\x72\xe6\xbb\x62\x50\x55\xf7\xfb\x50\x00\xf9\x0b\x47\xd9\x81\xf5\x49\xc2\x4e\xcc\x0f\xa5\x6b\xfb\xcd\x91\xe8\x81\xe1\x3f\x6d\xc2\xd5\xb6\x15\x9e\x36\x4f\xd6\xfc\x45\x8d\xfd\xb3\x25\x68\xfb\x62\x10\xbd\x75\x73\x82\xb6\x76\x61\xe2\x1f\xb7\xc4\xca\xa6\xdf\xe7\xff\xde\xa8\xd9\x56\x88\x9a\x6d\x31\x9a\xdf\x22\x35\xdb\x9a\x7a\x42\x33\x63\xa9\xeb\x4d\xa2\x6b\x37\x19\x8b\xa7\x23\xbd\x73\x0f\xdb\xe7\xb4\x27\x5f\x12\x4d\xd3\x1a\x3a\x2c\xe7\xb2\x44\xc2\x51\xf2\xe2\x3d\xd1\x9b\x82\xca\xc3\x61\x47\x89\xf3\x4a\x31\x2c\x24\xec\x56\xf5\x8f\xb6\x58\x45\xc8\x16\x54\x39\x2c\x5d\xdd\xc4\xea\x41\xaf\x28\x94\xe9\x94\xe2\x4a\x9f\xfe\x4b\x94\x55\x4f\x17\x7e\xe8\xd0\xf0\xa3\xeb\x13\xdb\x47\xd7\x55\x1f\x5d\x89\x3e\xba\x9a\xd1\xb7\x98\xa3\xcb\x5e\x59\xb8\x73\xe5\xee\x80\x5b\xd8\xe1\x0d\x00\xd5\xeb\xad\xb8\xed\xe3\xea\x2a\x8e\xab\xb6\x73\x5c\x3d\xf3\xea\x8e\xab\x6f\xd8\x00\x3c\x7a\x29\x28\x36\x3f\xb2\x66\xc3\x33\xe6\xc8\x5a\x77\xaf\x5b\xe4\x80\x2f\x5e\x86\x9e\x5c\x5f\x1c\x61\xff\x79\x88\x3b\xf0\x44\x02\x59\x18\x90\x11\x98\xa8\xb1\x3e\x38\x12\x7d\x28\x98\x73\xa1\x59\xf4\x96\xce\xf8\xaf\xf9\xfc\xc9\x44\xd3\xbf\x8a\x65\x48\x94\x70\x36\xa5\xd3\xcb\x61\x7b\x50\x3d\x2f\xe8\x32\x4a\xfd\x46\x7f\x9f\x3b\x37\x33\x5d\xe1\x6f\xaa\xd4\x55\xf0\x56\x86\x16\x19\xa5\xce\xc9\xd6\x52\x99\x17\x2b\x71\x97\x42\x40\x80\x30\x38\xcb\x2d\x3e\x4f\x82\x4b\x65\x80\xfd\xe1\x8b\x01\x7b\x69\xc0\xf6\x3a\x0d\x09\xfb\x51\xe2\x66\x50\xa3\x9f\x78\x51\x82\xdb\x4a\xd8\x39\xe3\xf5\xbb\xc8\x75\x90\x7a\x6f\xaa\x03\x4c\x37\xd7\xf6\x42\x1b\xfa\x58\x46\xcb\x48\x72\x77\xad\x3d\x68\x5a\xa2\x86\x20\x9c\x8d\xa6\x60\x28\xfc\x96\x58\x87\x09\xb9\x13\x2c\x47\x1b\x02\x5a\x75\xdd\xf4\xbe\x5b\xc1\xfb\xae\x67\x4f\x1c\xc6\x54\xab\xd6\x45\x51\xca\xb4\xc4\x19\x0f\x5f\x7d\x7d\xf4\xce\xa0\xfa\x94\xef\x9f\xbd\x6f\x4c\x0b\x8e\x0c\x08\x90\x9c\x4c\xed\xd9\x6a\x4c\x72\x1e\xef\xe0\x44\xab\x13\xa7\x18\xa3\x97\xe5\x0d\x3e\x83\xc7\x5b\x2a\x92\x6c\x39\xa3\x84\xa0\xe0\x2b\xb8\x7c\xe3\x11\xeb\x9e\xe8\x9a\xe6\xd5\x69\x51\x78\x33\xfb\x8f\xec\xab\x13\xfc\xfd\xb2\x1a\x01\xa1\x9e\x5f\xdb\x02\x19\x7e\x75\x0e\x01\xda\xf4\x1b\x7e\x6c\x91\x18\x8c\x2c\x02\x62\x2a\xfa\x50\x6f\x6f\xb5\xc5\x2c\xcf\x38\xb1\x20\xf2\xd9\xcd\x26\xfe\x9a\xcd\xee\x13\x07\x1f\xb1\x57\xdb\x50\xa3\x97\xd6\xd6\x4f\x88\xba\xfe\x70\x20\xd2\xf2\xe3\x01\x05\x1c\xad\x03\x7f\x72\x2e\x3e\x26\x08\x94\x69\x68\xb8\xaa\xe3\x74\xc5\x81\x44\xd7\x6e\x54\xb6\xb5\xb3\x6d\xd4\xe7\x63\xa5\x2f\x5d\x0a\x9e\xb1\xb9\x1e\x73\x4b\x78\xd8\xe8\x31\x51\x64\x2f\x2f\x2b\xbb\xb3\x7a\x77\xf9\xc5\x9d\xc3\x43\x09\x64\xb3\x99\x75\xba\xb3\x79\xd6\x8e\x13\x19\xfe\xfa\xce\xa8\xed\x3f\x72\x24\x5d\x37\x6b\x4d\xb8\x49\x51\x0a\x7c\x51\x9d\x5f\xf0\x26\x21\x74\x0a\x87\x95\xca\xfc\x44\x1c\x7f\x96\x93\x9b\xf2\x6e\xfb\xc6\xd1\x28\x7b\x43\x8d\x70\xfd\xaf\xad\x45\x2f\xa9\xa1\x93\xdb\x49\x51\x1e\x37\x57\xa0\xbf\x90\xf2\xa0\x52\xbd\x71\x27\x63\x98\x03\x30\xfd\xc7\xd6\xe2\x17\xb9\x3c\xc6\xd8\x29\xcd\xc1\xcb\xeb\xaa\x47\x5e\x1f\x5b\x88\x9d\x81\x27\xa4\x96\x80\x43\xde\xea\x21\x48\xb4\x3e\x87\xa9\x2e\xf4\x5d\x6a\xdd\x8f\x00\x30\xe9\x09\x35\x9d\x96\x19\x83\x4a\x31\xe7\x52\x08\x08\x54\xf5\xd6\x95\x25\x39\xf8\x9e\xee\x89\xbb\xbd\xde\x51\x63\x8f\x33\x44\xc2\x7a\xda\x2e\xd6\xa2\x97\xd7\xaa\x4f\x5d\x0c\xdd\x15\xf6\x14\x5c\xc4\xf4\xa5\xbe\xbd\x51\xba\x97\x4d\xde\xe1\x7e\x5d\x66\x90\x38\xa4\x01\x1e\x08\xbc\xe8\x69\xc9\xa2\x29\x53\x40\xa0\x76\x45\xb9\x32\x0e\xba\x64\x09\x18\x55\x14\x6e\x6a\xad\x27\xb2\xc4\xdb\x54\x5d\x68\x75\x66\x35\xe7\x35\x95\x0c\x5a\x30\x21\x29\xe3\xb6\xb9\x09\x89\xcc\xdc\x46\x0d\x6f\x53\xe5\xec\x6b\xbc\x4d\xd5\x4b\xc1\x87\xf4\xac\xf0\x81\x3a\x24\x1a\xcd\x63\x80\x32\x65\xf9\x31\x28\x8b\x71\xbc\x04\x28\xea\x65\x56\x77\x7e\x97\x77\xf7\x8f\x31\xce\x39\xaf\x0e\x34\x25\xb2\x77\x9e\x30\xf6\xca\x3d\x9e\xb2\x08\xca\xda\x2a\x24\x20\x50\x6b\xc3\xba\xc5\xff\x6a\x77\x74\xb8\xfa\xd0\x37\x67\xdd\x5f\x49\x26\xae\xe3\x16\xff\xc5\x6d\x30\xd3\x55\x9f\x5e\xe7\xb5\x6f\x61\x29\x8a\x86\xf8\x16\xf4\x50\xd1\x34\x6c\x3d\x4f\xcc\xb0\x05\xb0\x7d\x54\x6e\x73\x77\x6a\x10\x93\xd8\xfc\xe0\xbf\x2b\xbc\xb3\xae\xc3\xd3\x2b\x12\xa3\x72\xd8\x73\xe3\x9a\x57\xab\x8e\x3c\x1b\xec\xf5\xe3\x9e\x48\x22\xb5\x18\x62\x39\xe6\x67\xa6\xf3\x78\x55\xe6\x10\xca\xf8\xe5\x27\x45\x87\xbc\x27\xc6\xed\x3b\x68\xe9\x98\xf7\x7c\xcf\xc0\xcf\x3e\x89\xfd\x61\x8d\x5d\xdf\xc6\xb4\x1c\x3a\x9d\x5e\x2d\x7a\x5f\x6d\x9a\x24\x10\xe5\x96\xeb\xa5\x2d\x99\x27\x7d\x58\xed\x68\x29\x15\x1a\xc4\x64\x6e\x50\xad\x7b\x42\x09\x0d\x4d\xe1\x6e\xe3\x6f\xe9\x43\x8f\x88\x9b\xdc\x29\xca\x6c\x70\xe0\xf1\xba\x03\xda\x41\x8d\x0d\xd3\xc0\x65\xc0\x0c\xb4\x10\xc2\x2d\x12\x22\x54\x2c\xaa\x10\x1c\xc8\xb2\x5f\x87\x28\x48\x22\x9c\x2f\xf0\x40\x5a\xc9\x10\x9b\xb3\xd4\xe7\x3a\x13\x01\xb8\xc7\x11\x51\x81\xa1\x66\xf3\x33\xa8\x9c\xf9\xf5\x7b\x70\x71\xc6\x2a\x90\x9f\x4e\xa7\x07\x04\xfb\x3e\x6a\x76\x2f\xbb\xa1\x9b\xb5\x66\xd2\x76\x76\x36\x85\x34\x72\xe1\x0f\xed\x8d\x5e\xb2\x17\xf3\x47\xdb\xb4\xde\xfe\x3b\x1e\x1c\x3f\x2e\x54\x7b\xf4\xe8\xb5\x60\x16\xed\x85\xbb\x33\x10\xc8\x9e\x6e\xd1\x6b\xfb\xe1\x16\xa3\x9b\xb5\xce\x88\x0e\x56\x71\x8e\x72\x44\x37\xc6\x78\xab\x97\x9b\xf1\x77\x99\x95\xb8\x6d\x19\xe5\xda\xae\x16\x4b\x0e\x75\xd4\x31\x44\x41\x88\x67\x28\x68\x48\x3a\x33\x50\x4d\x54\xfb\xa9\xe1\x1a\x09\x50\x54\xbb\x2c\x0a\xde\x15\x39\x32\x58\xe0\xab\x2d\xd9\x4d\xb2\xbe\xc9\x75\x8b\x03\x75\x2f\xea\x21\xd8\x0a\x20\xfe\xaf\xb6\x4f\x14\x1c\x27\xcf\xe4\x92\x4f\xf5\xa4\xe2\xd5\x7e\x6f\x29\x89\x8b\x15\x7c\x67\xff\x18\xa6\x54\x18\x68\x27\xa6\x21\xef\x66\x29\x52\xba\xaa\x35\xd7\x15\x39\xf0\xb3\x13\x8c\x3a\x26\x98\x41\x59\xc9\x18\x43\x63\x12\x0f\xb6\x04\x2b\x41\x48\x94\xfa\xd2\xfc\xa8\x5a\xa9\xb5\x62\xfd\x79\x7b\x60\x4d\x78\x99\xe0\x69\xb9\xa3\x18\x84\x3c\x11\xcb\x79\xb6\x36\xce\x97\x7a\x78\x52\x20\x50\xc9\x43\x81\x34\x78\xd4\x2c\xac\x3c\x21\xd9\xd8\xcd\x5a\x10\x24\x1a\x1d\x83\x44\x7e\xe0\x15\xdc\xe8\x3d\x08\x8e\x76\x5e\xc6\x60\xe9\xf5\xbe\xe8\xc5\xad\xe8\x18\x9d\x93\xfb\xd5\x83\x73\x33\xd3\x63\x43\xdf\x36\x69\xa2\xa2\x63\x3a\x70\x28\xf6\xe4\x46\x8c\x29\xca\x4c\x36\xa9\x38\x4d\xe2\x54\xff\x0a\xfa\xde\x46\xff\x73\xd3\x88\xd9\xfd\x8d\x5e\x5f\x17\x1e\x13\xc1\xb2\x8d\x18\xdb\xb8\x8d\x78\xfe\xa7\x72\xcd\x08\x85\x38\x75\xb1\x6d\x07\x1b\x07\x8f\x6a\x7f\x20\x48\x9d\xdc\xbd\xf9\xc3\x35\xa6\xed\x24\xed\xde\x85\x34\xa1\x00\xfc\xb7\x36\x62\x84\xa8\xd0\xe3\xb6\x62\x6c\xb8\x49\x25\x76\x1a\xbc\x8b\x67\x21\xc5\x81\x2e\xb6\x29\x52\x9e\x48\xb1\x2a\xcd\xde\x50\xea\x33\xe2\xc5\x44\xda\x9a\xc8\x72\x02\x28\x3a\x28\x9d\x06\x9f\x2c\x2a\x1d\xb8\x05\xe0\x38\xe9\xbe\x6a\xee\x76\xf5\xfa\xb8\x57\x19\xf4\xd0\x78\xa9\x53\xc9\x3b\xca\xcc\x00\x34\x0e\x6e\x62\x94\x11\x88\x96\x33\x69\x37\x34\xdd\x9b\xdd\xe7\x4a\x96\x43\xbc\x82\xb1\x21\xa1\x20\x82\xc9\x79\xf9\x3b\x20\xc3\x8c\xe0\x94\x81\x19\x72\x90\xda\x84\x1a\xc6\x99\x8c\x47\xde\x46\xa2\xda\x89\xf9\xf9\xca\x08\x7b\xbc\x96\xab\x73\xb2\x8b\x62\x22\xfc\xfc\x48\xf4\x07\x23\x73\xd5\xc7\x95\x78\x65\x47\x70\x60\xd4\xe4\xe2\x80\xa4\x59\xa4\x13\xaf\x2b\xf3\x38\x53\xdf\x26\x49\x1f\x64\x8f\x0e\x09\x6c\x27\xc8\x95\xd9\xb7\x44\xd2\x44\x98\x49\x02\x4c\x5f\x3d\x68\x17\x9c\xd3\xa9\x96\x13\x91\x83\x72\x97\xb1\x33\x59\x29\x8f\xf1\xc9\x36\x0c\xb5\x4e\x3f\xdb\xee\xa9\x8d\x13\x97\xb1\x48\x06\x85\x21\x34\x67\x5c\x69\x97\x85\x52\x2c\xd3\xd2\xa6\x9b\x19\x7c\x97\x0c\x0b\x98\x7a\x54\x38\x8d\x79\x6d\x52\xe7\x9a\xcd\xdb\xe0\x67\xe4\x1a\x1d\x36\x84\xfc\x73\x8f\x91\x42\xca\x14\x77\xe6\x00\xed\xb2\x9e\x3c\x07\x3a\x49\x1b\xce\xdc\xb3\xd8\xcc\x1a\x26\x73\xe1\xd4\xfc\x8c\x06\x51\x36\x9b\xaa\xd6\x85\xec\xbc\xb4\xf1\x5e\x10\xdc\x06\xfb\xc1\x5f\x01\xdf\xbd\x93\xdd\x48\x5b\x7e\x4a\x74\x45\x33\x2e\xfb\xe1\x17\x77\x44\x7f\xbc\xa3\x7a\x5c\x57\x5e\x1a\x0c\x9f\x93\x43\xce\x6c\x5c\x19\x6a\x4b\x5a\x68\x3b\x40\x1b\xe8\xd2\x84\xae\xec\xf1\xd2\xa1\xa9\x8b\x36\x05\x0e\x9c\x8a\x38\x84\x98\xc2\x51\x8d\x9e\x41\xd5\xa9\xde\x57\x1a\x48\x86\x10\x61\x90\x6d\xb3\xcd\xb1\x45\xa9\x7e\x9a\x2b\xb2\x79\xbe\x1a\x51\x17\x77\x3a\xb2\x15\x8b\x52\x26\x7d\x77\x53\x23\xc6\x8e\xf6\x98\xb2\x35\xa0\xa9\x4d\x01\x4a\x83\xf6\x98\xab\x97\x94\x98\xd4\x57\x5a\xd0\x00\xc8\x7a\xb9\x14\xa3\xbf\x81\x4e\xf2\x5e\xa1\xb4\xcc\x32\x4e\xd6\xe9\xec\x8a\x52\x10\x70\x05\x2a\xe3\x35\x03\x15\x34\x86\x6d\xbc\x7e\x87\x1b\x8c\x4d\x26\x60\xd0\x96\xf1\xaa\x4c\xfa\xe3\x6e\xe1\xd4\x4b\x23\xa1\x0c\x72\x83\x42\xad\x52\x35\xe5\x59\x8e\x1b\x0a\x55\xc8\x52\x7f\xd4\x4e\xe2\x6e\x57\xb6\xa0\x27\x39\x0e\xca\xc0\xcc\xb9\x4a\x81\x6a\xfd\x92\x5a\xe5\xa6\x0b\x1b\x48\xa5\xc1\x25\x0f\xef\x6c\xb6\xe0\x2b\x23\x30\x64\xb1\x83\xfe\xd1\xda\x30\xe3\xec\x5f\xee\x64\xd7\x97\x6a\xb3\xcc\x91\x6d\x19\x7e\x62\x67\xf4\xf9\x1d\x0b\xee\xa3\xf5\x85\x5f\x2a\x65\x0b\x96\x78\xb1\xcf\x00\x62\x05\xee\x40\x0e\xa5\x16\x14\xab\x0b\xa2\xc0\xb1\x26\xe0\xa6\x21\x83\x0b\x4f\xa9\xe4\x94\xc8\xfb\xdc\xa7\x15\x6f\x0c\x51\xfd\x00\xe9\x4f\xc5\xa6\x97\xa1\xf5\xad\xa3\xf3\x91\x48\x53\x7a\x9e\x74\xb5\x3c\x49\xbc\x1a\x03\x7a\x9b\xaa\xe8\xd8\x50\x6d\xa6\xf0\xa4\x4f\x03\x1b\x19\x1d\xe3\xff\x85\x71\x1e\xdd\x29\x7a\xad\x58\xa6\x4d\x79\x17\x3d\xe1\x3c\x82\x37\xa2\x63\xfc\x4e\xf8\xc7\x5d\xe3\xf8\x54\x5e\xe8\xc6\xa8\x99\x2f\xc4\x1d\x59\x94\xa2\xd3\x55\xef\xd8\xc7\x40\xeb\x06\xcf\x55\x87\xe7\x4e\x4c\x1d\x3e\x7c\xf8\x76\xf8\xfa\x3b\xd5\x7f\x1a\x8d\x06\xfb\x4e\x73\x14\x50\xad\xea\x4d\x40\x31\xbb\x93\xea\xb8\x14\x5b\x71\x1b\xf2\xee\x21\x6e\x49\x94\x18\x3b\xae\x8e\x75\x68\x9b\x4d\x27\x8e\x6a\x5d\x83\x2f\xd8\x88\x76\xd4\x89\xf0\x3d\x01\x47\x0f\xb4\xb5\x3f\xce\x07\x8f\x50\xda\x4a\x26\x0c\x33\x8f\x97\x97\x65\x3e\x64\xb6\xdc\x23\xf3\x91\x3f\x0f\xac\xa7\xe8\x08\x3b\xc4\x0e\xac\x1f\xf4\x66\xed\x72\x77\x20\x2f\x05\x4f\x64\x5f\xeb\xb9\x08\x94\x8e\x5e\x07\x5f\xf9\x9e\x70\x97\x28\xb3\x4e\xdc\x64\xec\x0b\x3b\xd9\x7f\x5a\x1d\x54\xe5\x8a\xf0\xb7\x77\x46\xaf\xda\x39\xec\x17\xe3\x14\x04\xe8\x96\x76\xae\x9b\xb4\xe8\xc3\xed\x44\x6d\xa5\x57\xb6\x7e\xdb\x22\x48\xcd\x6c\xc6\x85\xa7\x78\xea\x4c\xd0\x26\xb3\x80\x92\x6d\x8e\x16\xad\x37\x97\xef\x6c\x00\x29\xa9\xf4\xb3\x0e\xe6\xff\xf1\xb5\x62\xa5\xb3\x61\x61\x3d\x91\xf0\xd9\xfb\x26\x66\xef\x9b\xe2\x1d\xa9\xd4\x9c\xb8\xe8\x60\x1b\x41\x15\x47\xbd\x4f\xb5\xc8\x6a\xbe\x74\xc4\x80\xf0\x68\xc9\x71\xd3\x73\x62\xd3\x24\x6f\x39\x28\x82\x31\x1c\xa8\x3a\x5c\x09\x9a\x88\xd2\xbd\xa2\xf8\x6b\x15\x34\xce\x79\xe2\xe6\xe6\x2d\x1d\xf6\x25\xfb\x03\x68\x34\x02\xb2\x1c\x35\xf8\xa4\x1e\xe1\x15\x61\x68\x9b\xd6\x54\x53\xb4\x77\x76\x49\x36\x05\x41\xf1\xb5\x0d\xb0\x9c\xd1\x89\xbf\x2c\x4b\x2e\xd6\x11\x4b\x18\x33\x84\x9a\xb2\x56\x9e\x4e\x64\x6a\x44\x72\xdf\xce\xc4\x4c\x15\x66\xb0\x4d\x1c\x35\x8e\x4e\xe1\xe4\x73\x70\xd6\xa2\x12\x55\x94\xde\x41\xdf\xbf\x1a\xa3\xa6\x0e\xfe\x72\x7d\xc1\xda\x58\x29\x3b\x89\xed\xa6\xda\xac\xae\x86\xaf\x5b\x84\x6a\x5e\x81\x2a\x3f\xf2\x34\xc3\x73\xfc\x53\x67\xf6\x6b\x39\x31\xe9\xed\x9e\xda\x73\x55\x77\x8d\xda\xca\x1b\x2a\xea\xeb\xc5\x7f\x5f\x0a\xf8\xba\xfb\x6d\x67\x38\x5a\xc8\x92\xb1\x8f\xec\x60\x37\x88\xb2\x14\xcd\x15\x0d\xc0\x0c\xdf\xb3\x23\x7a\xcb\x0e\xff\xd9\xe5\x78\x5d\x52\x8e\xdf\x3a\xa1\x14\xfb\xdd\x19\xd7\xb3\x62\x4f\xc8\x29\x13\xf9\x5e\x75\x40\x74\x64\xb9\x92\xb5\xc6\xc6\x69\x35\x92\xba\xe7\x6c\x1b\xaa\xaa\x25\xe1\xff\x9c\x10\x7a\xed\xdc\x57\xcb\x06\x10\xae\xf8\xa2\x36\x98\xd3\x52\xe6\x6d\x61\x82\x2b\x40\xb7\x2b\x1c\xad\x1c\x5f\xef\x38\x5c\x71\x00\x98\x14\x71\x59\x38\xaa\x98\x63\x7e\xc3\xfb\xc0\xa0\x07\x2e\xbc\x6e\x9e\x35\xa5\xd4\xb4\x25\xfa\x48\xb7\xc7\xaa\x4e\x00\x5a\xa7\x0f\x73\xde\xcc\x80\xe6\x04\x2f\x09\x69\x43\x56\xc6\x58\x35\x01\xed\x89\x8d\x9b\x6a\x64\xfb\xc0\x44\x00\x9f\x87\x9a\x80\xd2\x46\xdd\x1b\xff\xe7\x1c\x72\x6a\xfb\xce\x3c\xe7\x00\x30\x56\xe9\x60\xbc\x8d\xe3\x13\x1b\x5a\xaf\xf6\xb5\x14\xe7\x41\x37\x24\xab\xdc\x04\xdd\xac\xfb\x3e\x1a\x81\x5b\xb5\x52\x7f\xf3\x7a\x16\x0d\x3d\x85\x08\x11\x39\x3f\xa3\xe4\x4a\xf8\x96\xeb\xa3\x8f\xee\x98\x3e\x3e\x3b\x77\x7c\x6a\x72\xe1\xf8\x34\xaf\xe3\x7e\x43\xf8\x32\xf9\xa0\x01\x84\x89\xef\x63\x88\x94\x01\xde\x2e\xf5\xb5\x3a\x3b\xb1\x7a\x70\x82\xde\xc1\x24\x31\x48\x5f\x62\x33\xa7\xa2\x3f\xb6\x2a\x9d\x1a\xa6\x60\xcc\x7a\x33\x28\xb8\xd4\x9a\xb5\xba\x57\xa1\xb3\x97\xa2\xa7\x40\xa3\xa6\xdc\x17\x08\x0c\xa7\xd3\xa1\x3a\x80\x70\x5d\x15\xdd\xae\xb4\xe2\x5c\x36\xcb\xa4\x0f\x2e\x8d\x24\x53\x56\x0a\x2c\x25\x9b\x38\x54\x15\x5e\xc7\x72\xeb\x9a\x64\x3d\xe7\xea\xcc\x68\x8a\xdc\xda\x9e\xe3\xee\xcd\x27\x4e\x97\xe8\x95\x99\xea\x06\x9a\xef\x26\x83\xff\x90\x56\x68\xec\x8c\xa3\x5f\x3a\x2e\x4e\x5d\x68\x37\xe9\x2d\x43\x76\x4c\x87\xe9\xdd\x0e\x1d\x71\x41\x03\x92\x3c\x25\x72\x68\x3d\x34\xb4\xb0\xa9\x36\x25\xf7\xe3\xa2\xd0\x71\xb2\x1d\x29\xd2\x82\x72\x87\xaa\xd7\x94\x7a\x04\x99\x45\xa1\x39\xd3\x34\xa2\x56\x51\x72\x6e\x87\x21\x57\x90\x16\x40\xaa\x89\x7a\xb1\xc4\x6a\x30\xd7\xb8\x4c\xb3\xde\xf2\x8a\xe1\xdd\xd1\x2e\x22\x33\x1d\xe6\x96\xcb\xef\x87\x48\xf9\xd9\x35\xc8\x36\x6a\x72\x3a\xe3\x59\x0a\xce\x00\xc3\xce\x97\xa3\xd3\x15\x64\x4a\x6a\x47\x73\x28\x65\xdd\x9f\x6d\x43\xb4\xb7\x41\x40\x8f\xe1\xcd\xe6\xf3\x9c\x8b\xcd\xee\xd5\xe2\x2e\x27\xcc\x5d\x66\xea\x86\xc6\x57\x34\x01\xd8\x12\xea\x85\x06\x6b\x11\x42\xf2\xdb\x37\xe2\xe5\x18\x7e\x38\x00\x3e\xf2\xa6\x62\xa3\x1b\x43\x7a\xf3\x52\xb0\xb8\xf9\x7d\xe7\x93\xc3\x3b\x2c\x69\x83\x67\x06\x5b\x94\x36\x16\x37\x14\x9d\xfd\x7b\x23\xec\xf0\x86\xe9\x8c\x0f\x35\x8e\x93\x22\x41\x29\x8a\x11\x0b\xf9\xc6\x91\x28\x1d\xf6\x43\xc5\x3b\xa1\xe1\x8d\x26\xaa\x5f\xf0\xe5\x24\x5b\x12\x89\x4e\x64\x0a\xe9\x96\x07\xb8\x98\xfa\xee\xb0\x1b\x21\xb4\x13\xbf\xb9\x18\xec\xa2\x62\x3d\x81\xf4\xfd\x35\xf6\xc2\x80\xd1\x3b\x61\x7f\xfd\x25\x31\xb4\x93\xd8\x87\x19\x83\x73\x8e\x6e\xa3\x06\x1a\xe8\xb3\x97\xab\x95\x7e\x5c\xea\xd3\xc9\x90\xb6\x78\x21\x13\xd9\x2c\xb3\x9c\xbd\x28\x60\xba\x81\x61\x9f\xdd\x75\x05\xcd\x80\x0c\xbe\x04\x1c\xbd\xd5\x21\xc8\x43\x8e\x8c\xc1\x71\xd5\xa7\x1d\x66\xfc\xc0\xb6\xb1\xe7\x8f\x0c\xa5\xe1\x38\xae\xf6\xd6\xbc\xcc\x63\x59\x84\x7f\x52\x8b\x9e\xeb\xfc\xad\xab\x18\xc2\xc2\x11\x63\xc8\x96\x54\x2f\x17\x98\xc4\x5c\xc9\x13\x90\x48\xa2\xe4\x6b\xa2\x98\x88\x0b\xbe\x22\xba\x5d\x69\x3c\xc8\x71\xda\xcb\x7a\x45\xd2\xb7\x59\xe8\x06\x73\x91\xfc\x51\xc0\x16\xd9\x0e\x70\x0a\x84\xf7\xeb\x98\xdb\xbb\xcf\x98\x1c\x27\x59\x13\x7b\xda\x74\x28\xb3\xa8\x39\xbd\xae\x95\xfa\x48\xa4\x94\x97\x4b\x52\xe9\xef\x71\x47\x7a\x71\xb8\x17\xd8\xe3\xd4\x2b\x67\x89\xd5\x7f\x21\xee\xc8\xb0\xc5\xee\xbc\x02\x91\x71\x3a\x6e\xe6\x99\xfa\x3e\xba\x49\xfd\x57\xbb\xd9\xa1\x01\xb6\xa9\x26\x7f\x00\xfb\xd3\x9a\xa7\x2e\x3a\x70\xc2\x5c\x96\xe6\x30\x0e\xdf\x5b\x8b\x92\xca\x33\x9f\xa1\x16\x7f\xe4\xe6\x57\xb8\xdc\x52\x07\x3b\xe9\x03\xee\x84\xc1\x75\x46\x99\xc7\x72\xd5\x70\x6d\xc5\x29\xec\x29\x73\x81\xe8\x4d\xc1\xfb\x03\x76\x1f\xd1\x15\x9c\x89\x26\x35\x6b\x17\x01\xff\x0d\xdb\x40\xea\x32\x33\xe7\xa6\x95\x42\x57\x61\xb2\x52\xfb\x71\x98\x0e\xbd\xf3\xb9\xe8\xa4\xbd\xb1\xf4\x93\x4e\x80\x95\x84\x35\xe9\x98\x7e\xd3\x76\x4f\x20\x63\xab\x7c\xda\x80\x11\x2f\x31\xa4\x17\x56\xab\x39\x67\xee\x16\xcd\xf3\x32\x6d\x01\xb3\xc0\xef\xd4\xa2\xdb\x06\x1f\x1b\x51\x4c\x6e\x53\xf4\xea\xc3\x95\x91\xe9\x6c\x25\x67\xd9\xf7\xd6\x58\x8f\xc6\xad\x13\x2d\xae\xc7\x76\xa6\x89\x0b\x1c\x66\x09\x97\x8e\xa2\xd3\x2b\x91\x7d\x40\x5e\x68\x26\xbd\x22\x5e\x35\xf8\x50\x4a\xe6\x8f\x5b\xc1\x83\xea\xb1\x57\x04\x6c\x27\xa6\x01\x0a\x5f\x64\xd2\x4c\x67\xb4\x69\x74\x1b\x7a\x1d\x99\x03\x67\x23\xb4\x80\xb2\x06\x61\xd4\xfd\x6d\x07\xc6\xae\xaa\x49\xa2\x23\x23\x3f\xd2\xfd\x95\x3e\x03\xb7\xe3\x9c\x43\x3b\xfb\x78\x9e\x67\x79\xf8\x85\x5a\x34\xed\xfc\xcd\x9b\xa2\x5b\xf6\xc8\xa0\x97\xf0\x44\xa6\x20\x0a\x20\x84\x85\x30\x12\xc2\x04\x07\x68\xd3\xcd\x9f\x86\xd7\xd6\xd8\xc3\x01\xdb\xd5\x91\x45\x21\x96\x65\xf8\xa6\x20\x7a\x4d\x80\xd4\x3a\x84\x4d\x31\xb4\x17\xeb\xd5\x30\x49\xa6\x61\xce\xa7\xa5\x6f\x24\xd2\xb0\x90\x3a\x46\xee\x94\x24\x5b\x5e\x96\xad\x71\x5e\x64\x4a\x03\xd7\xac\x9b\x99\x11\xd0\xbc\x90\x69\x11\x03\x7a\xd3\x35\xc9\xfc\x7d\x31\xaa\x84\x54\xf8\xcc\xf5\xe3\x09\x36\x10\x42\x20\x7f\xbe\x05\xe4\x8f\xed\xd7\x1a\x08\x03\xd3\xb7\x06\xfb\xe0\x5e\x76\xdf\x95\xd2\xd6\x92\xbe\xe2\xd1\xc2\x4e\x81\xf2\x0d\x8a\xfe\x67\x59\x74\x7a\xbd\x1f\xab\x74\xb6\x99\xd1\xda\xad\x63\x9b\x5e\x25\x72\xfc\xa9\xb9\xc6\xc5\x60\xb7\x0e\x96\xf5\xe6\xf6\x7f\xed\x61\xbf\x3d\xc2\xcc\x6f\xe1\xaf\x8d\x44\xef\x19\x31\x61\xb5\x16\xcc\xa2\x6a\x42\xce\x17\x37\x69\x59\x2e\x75\xdd\xe0\x34\x29\xd7\xa4\x4c\x4d\xdd\x40\xa9\x02\x01\xc9\x84\x6b\x12\xb9\x3c\xc6\xeb\x7c\xf1\x4c\x96\xca\xc5\x63\xe0\x45\xd1\x5f\xe7\xe8\x40\x74\x12\x28\x5a\xab\x07\x9d\x36\x66\x0d\x94\x19\xf8\x0e\xd3\x3e\x79\x52\x3d\xde\x94\x4a\x13\x1b\xaa\x3a\xca\x20\xb6\x78\x0c\xe8\xc5\x51\x69\x47\x63\x17\xfd\x4a\x19\x6c\x0e\x52\xb4\x6c\xa6\x47\xb8\xac\x29\x4d\x1b\x0b\x58\xac\x93\x16\x8d\xe4\xac\x3c\xc6\x81\x69\x49\xca\x96\x26\x25\x04\x8b\xa1\xeb\x2c\x70\xe3\x59\x03\x9e\xf2\x2e\xd1\xfe\x9c\x43\x82\x50\xa0\x60\xd4\x5e\x56\xf2\xc0\x80\xbe\xa3\xde\x75\xaa\xa7\xb6\x4d\x81\x29\x81\x19\xd1\xe8\xa3\x42\xfa\x51\xcc\x2f\xa9\xb1\xaf\x19\xf2\x76\xf8\xb7\x01\x7b\xf0\xda\xf0\x2e\xe3\x02\xbe\x7f\xb0\x8e\xe8\xfb\x82\x61\xed\x24\xa1\x19\xa7\x45\x99\xf7\x9a\x88\x84\x57\x43\xa5\x97\xb0\x76\xf1\xe9\xf1\x8f\xdb\x36\xba\x3b\x2e\xec\x2c\x3a\x31\xe6\xe0\x21\x5b\xd4\x6f\x2d\x3a\x00\x22\xfb\x36\xfb\xd1\x51\xf6\xf5\x76\x08\x31\x51\x02\x2d\xac\x22\xfc\xca\x48\xf4\x99\x91\xf5\x7e\x25\x40\x4e\x96\x63\xbc\x9f\x46\xde\x76\xe1\xb4\x52\x4f\x16\xa7\x2a\x5f\x2e\xda\x7d\xa7\xba\x42\x8d\xe0\xf2\x42\x17\x40\xba\xb0\xe2\x2d\xc5\x3d\xae\x41\xed\xb2\x69\xc7\x79\xe1\xf8\x22\x52\x7b\x81\x41\xd7\x14\xa5\x73\xd7\xe1\xa7\xd0\xb6\xb5\x5a\x57\x9e\x47\x7e\xaa\xf6\x29\x7d\x8c\xbe\x2f\xdb\x88\x71\x67\x79\x5b\x0a\x1a\xa3\xee\x0e\xec\xa7\x19\x37\xac\xac\x65\xba\xe8\x67\x14\xb2\x62\x43\x53\x12\x98\x16\x42\x80\xa8\x26\xc1\x21\x36\x57\xd8\xcc\xe6\x0d\xa4\xcc\x25\xbd\xd3\xee\xd8\x71\x8b\xd5\x70\x97\x89\xc3\x9a\xe3\xb2\xb6\x2e\x3e\x2b\xa2\x25\x1a\x3d\x7b\x71\x23\x72\xd5\xbf\xd9\xc3\x8e\x6c\xe9\x48\x98\x9c\x9d\xd1\xa2\x18\xf0\xf2\xef\xde\x13\xbd\x39\xa8\x3c\xf4\x21\xda\xce\x8f\xe3\x74\x4b\xa2\xaf\x02\x91\xdb\x66\x40\x93\xb1\x92\xd5\xce\x16\xa8\x86\x06\x2f\x8a\xee\x4d\xb8\xba\xc5\xf1\x22\xe8\xa7\xff\x3d\x48\x23\xad\x08\xb6\x1a\x17\x83\xeb\xe0\x3b\x5a\xd8\x17\x83\x3d\xbe\xab\x44\x9f\x05\x2f\xdd\x86\xed\x5f\xb5\xbf\xe9\x41\xe6\x8d\x75\x78\x36\xba\xdb\xfd\x5b\x8b\xc1\x81\x79\xc4\xa1\x1b\xb2\x9e\xda\x99\x9f\xca\x63\xdb\xa1\x75\xe5\x0e\xad\xb7\x04\xcc\x2e\xfd\xf0\x75\x41\x74\xd2\xee\x38\xcf\xf6\x1f\xbe\x29\xed\x4e\xc3\x14\x87\xce\x16\x73\x25\xcc\xdd\xec\xa9\xeb\xbb\x24\xb6\x26\x61\x2e\x05\xf7\x6f\xee\x96\x3a\x12\x1e\x1a\x16\x7f\x57\x59\x43\xd5\xf0\xbb\xcf\x8c\xb0\x93\xd4\x1c\x55\x7c\x5d\x2c\x2f\xe7\x72\x19\xa2\x7c\xdd\xb3\x7e\x68\x36\xd9\xc9\x59\x8d\x32\x20\x17\xd5\x6b\x47\xa2\xc9\xea\x43\x3b\x92\x2d\x99\xc7\x48\x44\x32\x70\x37\x92\x3a\x47\x90\x27\x83\x3e\x54\x63\x1f\xa8\x31\xd6\xb4\x39\x0e\xde\x59\x8b\x6e\x32\x19\x9f\xc8\x76\x34\x3c\xf7\xa2\x1b\xcf\x1b\x5e\x30\x3b\x05\xcf\x66\xcf\x62\x0f\x0c\x9d\x82\xab\xe8\xb3\xa1\x55\xdf\xe4\x46\xb6\x23\xba\x6c\x4b\x89\x76\x21\xc6\xeb\x72\x12\xed\xee\x63\x4f\x18\xac\xb6\x23\xba\xaa\xc0\x22\xdc\x13\xee\xaa\x63\xdc\x18\xfb\xf5\x3d\xec\xdb\x3c\xa7\x08\xdd\x4a\xba\x1d\x3b\x25\x45\x21\xc3\x1f\xdd\x13\x7d\x33\xfc\xcb\x09\xaf\xc4\xbb\x2f\x0a\x5b\xf6\x4d\xc1\x97\x6c\x67\x11\xdf\xbe\x92\x78\x0c\x25\xf8\xbb\xdd\x60\xab\x9f\xba\x6a\x32\x88\xe5\x47\x8b\xef\xe1\xbf\xeb\xc4\x37\xbf\x1e\x6c\x48\x70\xb0\xde\x3e\x85\x1b\x8d\x97\x0d\x4f\xfb\x07\x2f\x3c\xfa\x79\xef\x9a\x9b\x9f\x50\x4f\x0d\xef\xaa\x0f\x5e\x88\x98\xa0\x30\xaf\xbb\x95\x0b\x15\xe8\x14\x63\xbf\xb0\x77\x68\xb0\x38\x5c\xf2\x00\x1f\xc3\x4c\xda\xce\xc2\x57\xed\x8d\xa6\xfc\x47\xb4\xa3\x24\x28\xe2\x71\xab\x98\xe8\xf5\x62\xb4\xb0\xd1\xbf\x99\xf4\xf5\xad\x43\xdf\x5c\x0c\x37\x2e\x06\x7b\x68\xd9\xcc\x4c\x5f\x0c\x18\x12\x3e\x9c\x3b\xa7\xfe\xd8\xb9\x94\x65\xa5\xfa\xc7\xf5\xe7\x55\x7f\x13\xa3\x4a\xef\xca\x8a\x99\x8e\x58\x96\x17\x83\xaf\x33\xd7\xea\x14\x14\x67\xde\xb9\x81\x2e\xc3\xcd\x83\xc7\xa9\x07\xb3\x79\x76\xa1\x6f\x1e\xdd\x48\x1e\xb1\x74\x19\x3b\x71\x31\xb8\xce\x9d\x11\x4f\x08\xbf\x69\x0f\xfb\x74\xc0\x6c\x5b\xc3\xdf\x0e\xa2\x0f\x05\xa7\xf5\x9f\x84\x98\xb6\x28\x36\xbc\x4f\x3f\x91\xe5\xda\xe5\x4c\x5f\x9a\x8b\x17\x5a\x4f\xda\x87\x42\xe1\x0b\x3e\xc3\xa9\x31\x7b\x1b\x6a\x6e\xf2\x14\x11\x11\x20\x58\x3a\x22\xdd\x7f\xcb\x98\x2e\xb5\x1e\xb7\x8e\x69\x62\xe2\x8e\x48\x6f\x05\x52\xe2\x24\x4e\x7b\x17\xd4\x9f\xf5\xae\x58\x96\x85\xfa\xd7\x2d\x13\xf6\x83\xc6\x2d\x80\xc6\x72\x77\xfa\xbf\x05\xcc\x99\x81\xf0\x6f\x83\xe8\xcf\x82\x79\xf3\xf7\x15\xf7\xd1\x8e\x92\xdf\xa7\x85\x61\x74\xae\x4d\xb5\x60\xe6\x64\x8b\x9f\x14\x25\x25\x20\xd1\x5b\x0b\x39\xc3\x1b\xb9\x6c\xad\x88\x12\x48\x91\x5b\x59\xb3\xd7\xd1\x47\xda\x84\x4c\xeb\xbd\x62\x22\x97\xad\x07\x57\x44\xf9\x60\xd1\x5b\x2a\x9a\x79\x0c\x0e\xa1\x07\x2d\xb7\xd1\xc4\xc1\x09\xd5\xed\x89\x7c\xa5\xe8\xc0\x0a\x75\x07\xe0\x6e\xe6\xad\x80\xf0\x50\xf4\x6d\xe0\x3f\x70\x9e\x0d\x1d\x05\xb7\x8c\x23\x8c\x16\x6e\x78\x73\xf4\x4d\x77\x67\x59\xc9\xd7\x1b\x3a\xcf\x79\x14\xb0\xf5\x16\x73\x98\x44\x0f\x4e\x55\x7e\xe2\xfa\xe8\x1f\x56\x30\x2f\x57\x72\xb8\x3f\xd1\x64\x04\xb9\xec\x64\x25\x1a\xf6\xe8\x2a\x6f\x01\xcf\xd1\xb1\x89\x89\x83\x8d\x5b\x1a\x07\xc6\xbc\x96\x9c\x64\x03\x5b\x25\x3c\x12\xed\xbb\x57\x3f\xdb\xb0\x6a\xaf\xa4\x94\xf9\x3b\x37\x7c\x76\x34\x7b\x2f\x3c\xd8\xb8\xf9\xb0\xc0\xf7\xf5\xc0\x20\xa8\xe7\xfb\xa8\xcd\x87\x1b\x07\x8f\x36\x0e\xd4\x0f\x34\x96\xba\x59\xe3\x48\x5d\x74\x5a\x47\x8f\xf8\x2d\x9f\x66\x95\x5d\xaf\xe6\x4f\x23\x4e\xb6\xdc\xea\x19\x56\x95\x0b\xe1\xd1\x68\x4c\x2d\x83\xb3\xfa\x31\xc7\xe7\x9b\x2e\x85\x94\x69\x51\x15\x36\xa3\xfb\xce\xce\x73\xf8\xf7\x06\x9d\x9e\x90\x65\x73\x22\x2b\xea\x1a\x0b\x85\x3d\x9f\x96\x4b\xb1\x48\xf9\xd3\xce\x9c\x9b\x40\x4e\xae\x5b\xf9\xfe\xb5\x15\x29\x1f\xea\x8f\xf9\x03\xf0\x82\x51\x2f\x9d\x8a\xe1\xee\xd1\x5b\x6e\xde\x84\x88\x2c\xc8\xbc\x13\x7e\x62\x24\x7a\x38\x98\x4c\x09\xaa\x6b\x7d\x6c\x6e\x24\x89\xcc\x3b\x48\x9b\x8d\x8e\x25\x3f\xe6\x23\xee\x74\x93\xb8\x19\x97\x7c\x4d\x42\xb4\xe0\x01\xbe\x1f\xae\x50\xe3\x72\x1f\x62\x8a\xea\x59\x77\x0c\x52\x3b\xf5\x92\x64\x0b\x15\xa4\x99\x29\x9f\x0a\x52\x95\x16\x99\x2d\xeb\x62\xb0\x13\xeb\xba\x18\xb0\xae\xb9\xc2\xf2\xbd\xeb\x01\x7b\x41\xc0\x9c\x5f\xc3\x72\x03\xe6\x3f\xef\x74\xa3\xab\x6e\x35\x38\xd1\x53\x26\x89\x15\x83\x1e\x42\x4b\xc7\x07\x2e\xf5\x07\x11\x46\xd8\xbe\x06\x5b\x65\xd4\xd4\x30\xd1\x97\x59\xf7\xdf\x8f\xe3\x54\x2d\x04\xfa\xaf\x95\xce\x41\xbc\x92\xdb\xae\xf1\x4a\xfa\x83\xfa\xc1\x03\x07\xfc\x4b\xab\x0f\xed\x61\xcf\xbc\x96\x37\x24\x36\x71\x1e\xf8\xe0\xfe\x62\x77\x74\xef\x46\x2f\x54\xe8\x18\xd7\xcb\x54\xba\x21\x97\xc5\x0b\x76\x6d\x2b\xec\x57\xa1\xb0\xcf\x38\xfa\xfa\x93\xaf\x8a\x1b\x61\xdb\xf0\xbc\x5a\xc3\xf3\x17\x02\xcd\x29\xf2\x33\x41\x74\x14\x33\x24\x61\x88\x44\xda\x8a\x57\xe3\x56\x4f\x24\x9b\x6e\x12\xd7\xcb\xb2\xc2\xda\xac\x75\x2d\x6f\x93\xd6\xab\xfc\x52\xf0\x5f\x36\x37\x36\x9e\x11\xde\x77\x75\xb9\x38\xd7\xa7\xd7\xf4\x8f\xb2\x4a\xd8\x96\x6e\xfc\xb9\x42\xe6\x60\x8d\xfc\xf2\x68\xf4\x4c\xfd\x07\xa1\x83\xab\x21\xf4\xe8\x05\x2b\x75\x22\x52\xba\x39\x2c\x33\x8b\xab\x37\x3f\x36\xd0\x9c\xd1\x50\x77\xdf\x1d\xf3\x3b\x23\xec\xe9\x6c\x27\x52\x3c\x87\x4f\x8b\x9e\xa4\xf3\x60\xc0\xbd\x2f\x3e\xa6\x4c\x84\x26\x8f\x34\x01\x74\x37\xba\x13\x79\x38\x60\x23\xbd\xb8\x15\xbe\x39\x88\x7e\x24\x98\xd4\x0a\x35\x8a\x39\x84\xc5\xba\x80\x2d\x5d\xba\x68\xe6\x59\x51\x20\x00\xc9\x24\x48\xd0\xf5\xb6\x94\xde\x43\xe0\x73\x91\xe2\xc5\x2d\xfc\xa6\xc9\xf5\x0c\x02\x38\x2e\x30\x9a\x62\x1c\xfd\xac\x70\xbf\x03\x69\x37\xec\xe5\xf6\xb9\x99\xe9\xc2\xd3\x35\xbe\x9d\xed\x56\x85\x01\x50\x64\x36\x9a\x32\xd9\x40\xa0\xb1\x55\x83\xaf\xd2\xea\x0e\xe0\xa7\x93\x84\x8b\x26\x00\x0a\xd4\xd3\xa2\xa2\x3a\xee\x90\x17\xca\x5c\x84\x32\xba\x7d\x32\xed\xbb\x8c\x14\x1e\x2d\x42\x9e\xad\xc6\x4e\x92\x13\x67\x99\x64\x79\xe3\x6d\xc1\x37\xb2\x27\xac\x3f\xe6\xce\xac\xb2\x0f\xed\x76\xaf\xa4\x1a\xed\x24\x5b\xa3\x90\x08\xb3\xd6\xce\x64\xa9\x5e\xbf\x48\xdd\x31\xd7\x4b\x64\xf8\xb2\xdd\xd1\x2f\xd4\x86\xfe\x44\x53\x9f\x4b\x04\x0e\xe2\xc0\x58\x4d\x27\xad\x9b\x73\xca\x9c\x29\x5e\xc6\x56\x0c\x21\x5a\x95\xf9\x92\x09\x1f\x20\x94\x9e\xf7\xf1\xb9\xb9\x53\x4a\xc3\x1a\xde\x04\xa3\xb9\xe9\x3a\x78\xdc\xb6\x31\x6d\x71\x1b\xe9\x01\xf6\x8b\x31\x2e\x4a\x70\x41\x52\xa4\xbd\xd4\x40\x35\x55\x7d\x61\x8a\x41\xd7\x3c\x16\xa4\x4a\xd9\xbf\xb4\xee\x87\xa9\x6d\xcf\xb9\xb9\x53\x43\x8b\x50\x67\x3f\x94\x7f\x31\xb8\xb1\xf2\xba\xb7\xe1\xde\xb2\x83\xfd\xd6\x08\xab\xbe\x12\xbe\x7f\x24\xfa\x9f\xb5\xc5\xca\xd3\x45\xcf\x09\xd1\xcb\x13\x9d\x5c\x87\x82\xa8\x05\xae\x40\x3a\x6d\x60\x8d\x53\x26\x2a\x80\x24\xe0\x19\x42\x67\x3a\xa8\xc5\x68\xdf\x12\x3f\xc0\x31\xc6\x79\x9d\x47\x13\x2b\x52\x24\xe5\xca\x43\x11\x66\x70\x5c\x16\x89\x7d\x7e\x33\x3c\x8c\x93\xca\x63\xfb\x2a\x90\x69\xd8\x65\x00\x68\x43\xfb\xde\xc4\xcd\x11\x6a\xbc\xeb\xbe\xa1\x2a\x56\x6f\xb9\x4a\x79\x57\xe6\xf5\x66\xd6\xe9\x66\x29\x04\x35\xc3\x4b\x14\x99\xd3\x60\x51\xe5\x65\x6f\xf5\xf4\xf2\xa4\x68\xa8\x85\x10\xeb\x7c\xc2\xea\xa0\x46\xb8\xbf\x83\x16\x86\xe5\x22\xd3\x32\xef\x5b\x28\xc0\x55\x86\x4f\xfd\x76\xc0\x70\xf6\xc3\xdf\x08\xa2\x97\x04\x8b\xf0\xef\x45\x5f\x7b\x34\x7a\x31\x2e\xc3\xe1\xf3\x53\xed\x1f\xbc\x0b\xd2\xf0\x51\xef\xd3\xeb\x47\xbd\xcc\x28\x55\xa4\x34\x82\xc4\x94\xa5\x31\x67\x2e\xc4\xfe\x6a\x24\xba\x67\xc8\x73\x6f\x19\x9b\xd9\x4a\x62\xd0\x41\x01\x78\x6a\x4d\x28\x1b\xb0\xe9\x1f\x54\xdf\x3f\xc2\x5e\x36\xa2\x51\xa8\xdf\x3d\xa2\x8d\x90\x2f\xd4\x4e\x8b\x0b\x71\xa7\xd7\xd1\xe8\x39\xb5\x51\xe8\xb8\xa1\xe8\x47\xf4\x96\x78\x11\x99\x14\x6d\x42\xd1\xf8\x36\xc6\xd6\x89\xab\x99\xd4\x90\x36\x9d\x81\x0a\x84\x8b\x89\xef\xc2\x28\x3e\x64\x9b\x30\x5f\x61\x5c\x95\xe1\x77\x46\x60\x0d\x15\xdc\x94\xe3\x08\x3e\x5a\x23\x28\x1f\x1d\x59\x90\x8c\x00\xd9\x11\x75\xae\x27\xaf\xfd\xa6\xfe\x62\x05\x72\x63\xe3\x71\xd3\xe9\x25\x65\xdc\x4d\x28\xd7\x1c\xe1\x04\xf1\x08\xb4\xa1\x2f\xae\x3f\x0a\x32\x2e\x97\x3a\x20\xcc\x82\x03\xec\xa8\xe9\xe1\xd2\x37\xc9\xba\x43\xbd\x74\x29\xeb\xa5\x2d\x4d\x04\xa1\x0d\xb3\x3f\x18\x19\x6a\x9d\xa3\x4d\x28\x5b\xb3\x59\x6b\xb2\x0d\x7a\x51\x1f\xac\xf3\xb7\x8f\x44\xab\x0b\x80\xba\x50\xbf\x23\xaa\x4c\x19\xe0\xe8\x80\xc6\x15\xdf\xe2\xeb\x7c\x4d\x24\x86\x98\xcf\x17\x02\x25\x95\x8c\xd0\x44\x8d\xed\x98\x0e\x14\x08\xc2\xb6\x76\xb9\xfa\x7d\x7f\x31\xe6\x18\xd9\x37\x76\xfd\x72\xab\x50\xd1\x57\x04\xac\xfa\x4a\xf8\xbc\x0d\xe2\x9b\x8d\x4b\xc2\xff\x26\x3a\x69\x76\x20\x9f\x84\xf0\x5a\x41\xbf\x5e\xb6\xd9\xdd\x33\x66\xf7\x79\xbd\xe2\xef\x5b\xbb\x6c\xb3\xbb\xd2\xa7\xcd\xad\xee\x57\x8c\xac\x9b\x44\x1e\x37\xbf\xce\x2e\x76\x32\x4e\xcb\x22\xfc\xd3\x5a\x74\xaf\xf7\x44\xab\x32\x05\x5f\x81\x3f\x09\x6f\xa8\xda\xb2\x92\xad\xb9\x99\xe3\x2b\xcc\xe8\xbd\x4e\x15\xc1\xfb\xa2\x1a\x7b\x7e\x8d\xed\x6e\x67\xf9\x33\xb3\x54\x16\xe1\x3f\x04\xd1\x4b\x03\xfd\x57\x25\x90\xe1\xa1\x2c\x55\x33\x5e\xc9\xcd\x3d\x58\x03\x88\x82\xcc\xd0\x99\x65\xdd\x2c\xc9\x96\xfb\x14\x9d\xac\x33\xfb\xf2\xd3\xa2\x6f\xe0\xa2\x82\x77\x48\xcc\x64\x6d\x7e\x1b\x08\xda\xb8\x92\x49\xe8\x28\x3b\xc2\x0e\xad\xbb\x54\x06\x87\xf0\x04\xf6\x61\x8b\xc1\xf0\xaf\xdd\xc3\xbe\xc9\xb5\x20\xba\x5d\x65\xf4\x34\xa6\x0d\xfb\x47\xf8\xe5\xdd\xd1\x53\xed\x9f\xd4\x39\x35\xf4\xcd\x44\xe4\x48\x54\xaa\x83\x46\x95\x98\x99\x55\x82\x43\x49\xb1\x39\x09\xe9\x0a\xe7\x65\x59\x91\xb8\x1f\xdb\x06\xf3\x6c\xdf\xd4\xfe\xbb\xc9\xb8\x71\x95\xf7\xb4\xff\x7b\x85\xb3\xdf\x12\x63\xb2\x82\x2e\x56\xcf\x6f\x90\x54\x68\x70\xbf\xc1\x7d\xea\x6d\x43\xaf\x53\x5b\xb2\x00\x74\xe9\x92\x5c\x11\xab\x71\x66\xb8\xb6\xec\xc7\x0d\x96\x19\xc2\x7a\xb9\x81\x3f\x77\x48\xb5\x18\x70\x74\xe0\xb4\x3a\xeb\x72\xd9\x94\x69\x99\xf4\x4d\x2c\x8b\x8e\xfc\x1e\xac\xf0\x52\xb0\xb0\xb9\x03\xe4\x60\x38\xe1\x38\x40\xba\x85\x71\x78\xd8\x82\xaa\x60\xa0\x17\x31\x36\xec\x44\x9c\x92\xdd\x95\x13\xf3\x03\x34\xfb\x98\x41\xe4\xb7\xf6\x44\xdf\xef\x67\x10\x51\xaf\xf3\x13\x71\x22\xf1\xbe\x8e\x68\xb0\x40\xf3\x49\x44\x51\xea\x6c\x6e\x6d\x59\x52\x40\x0f\x30\x78\xc3\x67\xed\xe2\x1a\xe4\x02\xb9\x18\xec\xee\x64\x69\xac\xd6\xad\x27\x02\xdf\xbc\x9b\xbd\x39\x60\xe6\xb7\xf0\x75\x41\xf4\x9d\xfa\x6c\x3f\xc6\x4f\xd3\xe3\xa1\x09\x9b\x54\x8f\xf4\x77\xc3\x36\x10\x19\x61\x85\xc9\xcc\x84\x9d\x98\x68\x42\x9f\x26\xe6\x8e\x4f\x4e\x9f\x3e\xae\x76\xc7\x4a\xb6\x56\x2f\xb3\x7a\xaf\x90\xf5\xb8\xdc\xc0\xe7\x22\xd9\x68\x57\x94\x2b\xe1\xb3\xa3\x59\x9d\xed\xf3\x18\x3f\x57\x60\x9e\x91\xd2\x21\x47\xcb\xb3\xac\x1c\xe7\xb9\xa0\xc8\x67\xa1\x39\x27\x92\x04\x5b\x5d\xe6\x52\x8e\xbb\x1c\x48\x13\x6e\x35\xbf\x19\xb0\xdd\xb9\x14\xad\xb3\x69\xd2\x0f\x3f\x18\x44\x3f\x17\xd8\xda\xa6\xab\x1c\x6b\x7c\xbf\x7a\x75\x62\x2d\x8f\x4b\x39\x86\x89\x0f\x80\x4f\x1d\xc2\xad\x11\x78\x9b\xa1\x88\x93\xf6\x47\x1d\xc8\x62\xf8\x8a\x80\xdc\x71\xb8\x00\xbf\xd2\x51\x74\xd8\x02\x7e\x25\x60\x0c\xc3\x98\xd4\x02\x0c\xdf\x11\x44\x3f\xee\x74\x69\xde\xfc\xa2\x81\x97\x6a\x90\x55\x07\xcf\xcb\x3e\x07\x21\xae\x4e\xd3\x73\x85\xcc\xfd\x31\x93\x65\x13\x5a\x31\x01\x2e\x38\x8a\x93\xba\x86\x3d\xb0\x33\xf2\xd9\x80\xed\x29\x74\x60\x5a\xf8\xfb\xc1\x16\x14\xd6\x4a\x1c\x5b\xf4\x13\x03\x3d\x9e\x93\x6d\x24\xf8\x34\xb1\xe8\x59\xd5\x27\x05\x38\x6d\xec\xd7\xd0\x21\x20\x8b\xf6\x9a\xf5\x99\xfd\x48\xc0\x46\xd5\x68\x86\xaf\x08\xa2\xe7\x07\xde\x22\x37\x21\x55\xb9\x68\x65\xe4\x98\x4b\x81\xd3\xd5\x69\x10\x64\x24\x79\x64\xe6\xe0\x15\xbb\x59\x7d\x68\xfe\x24\x79\x61\x1d\x21\xf8\xc7\xbb\xa2\x17\x06\xeb\xff\xee\x87\x16\x2e\xcb\x54\xe6\x71\x73\x48\x36\x16\x47\x4b\x10\xe4\x20\x30\x89\x58\x26\x8c\xb5\xda\x23\x56\x56\x2e\x2f\xc8\x26\x5f\x12\x4a\x2a\x20\xaf\x42\xe3\x62\xb0\x13\xad\x61\x4f\xf0\xfd\xea\x4e\xf6\x6b\x01\xdb\xd9\x2e\x16\x94\x1e\xfa\xde\x20\x7a\x7b\xe0\x88\x67\xa0\xa9\xd7\x7c\x26\x2e\x47\x7e\xbb\xf2\x8e\x17\x32\xa0\xa6\x07\xd2\x15\x98\x0b\x69\x93\x11\xe5\xf8\x85\x06\x8f\xe4\x85\xf2\x48\x34\xce\xa3\x0b\xed\x42\xfd\x5f\x5a\xb6\x8b\xc8\x27\x65\x72\x8a\x6f\xc9\xae\x4c\xd1\xf4\x55\x83\xa8\x19\x17\x01\x22\xe1\xf9\x5e\xcf\xb2\x5d\x94\x36\x21\x9c\x8e\xf6\xd9\x45\x73\xfc\x42\x99\x5b\x72\x4c\x9d\x59\x01\x1c\x8a\xfd\xc6\xdb\x36\x70\xae\xbe\xc0\x15\x80\xab\xd1\xca\xa3\x25\xfe\x7c\x8a\x93\x9a\xbb\xe7\x3f\x50\xbb\x82\x3d\xff\x7d\xb5\xad\xee\x79\xda\xe4\xa4\x38\x91\x49\x04\xd3\x37\x2c\x88\x4e\x7d\x85\xd4\x73\xf8\x35\xf1\x77\xe0\xd4\x68\x0e\x6a\x0a\xd3\x23\x5a\xad\x36\x4f\xb3\x4a\x2d\x2e\xab\x8c\x61\xf2\x18\xda\x90\x02\x71\x44\x70\x90\x65\xa9\x7e\x69\x1c\xdc\x0b\xf8\x6f\x74\x1c\x10\x6b\xf0\xf0\x56\xb1\xb3\x8c\xb6\x41\x78\x3c\xba\x6d\xda\x10\x1c\x57\xa1\xdc\xda\x71\x94\x41\xd4\x8d\x09\xd4\x22\x16\x2a\x77\xdd\xbd\x69\xa7\x67\xb0\x69\xd2\x7c\x0b\x5a\x08\xbf\x7b\x67\xb4\x60\xff\x74\x42\x5e\xa0\xab\xf6\x07\x65\xb5\x96\xb9\x30\xc9\xc0\x53\xe0\x8d\xa2\xad\x85\xd1\x97\x2e\x89\xba\x6f\xc4\xbd\x7e\x07\xfb\x5c\x8d\x5d\xe7\x5e\xbc\x87\x9f\xac\x45\xbf\x58\x73\x9f\x80\x8b\x92\xb2\xcd\x93\x6b\xd9\x49\x91\x51\x80\xde\x94\x52\xbd\xf0\xab\xc7\x76\xeb\x55\x8e\x76\x25\xca\x9b\x81\x5f\x2d\x13\xee\x92\xe9\x21\x4e\x09\xf9\xcf\xb4\x1f\xc8\x66\x6c\xc6\x06\xa2\x18\xf0\x8a\xf2\xda\xaf\x56\x94\xcc\x97\x0d\x37\x81\xd2\x0e\xf7\x15\x5c\x5e\x88\x8b\xb2\x8a\x3b\x68\xf0\xc9\x14\x0c\xfb\x76\x12\x37\x35\xcb\x2a\xd2\x52\x95\xc4\x86\x86\x8e\x3b\xb4\x25\x29\x80\xa6\x45\x4c\xed\x1b\x8a\x86\x87\x6b\x6c\x6f\x99\x25\x9a\x29\x3c\x7c\x43\x2d\x7a\x6f\xe0\x3c\x40\x07\x56\x57\x49\x2e\xd9\xe2\xfb\x21\x76\x17\x1c\x34\xad\x1e\xd8\xe0\xa5\x2c\xc6\x60\xfb\xa8\x31\xd4\x3c\xaf\xe4\x21\xaa\x0e\xa5\x8e\xbc\xd5\x0d\x1b\xe7\xb2\xdd\x96\x4d\x24\xf1\xe4\x90\x17\x44\x9b\x93\xe4\x78\xa5\xf9\xc3\xe6\x58\x91\x0c\xfe\x29\xf2\xa0\x55\xd6\x91\xd5\x35\x27\x58\x9d\x3d\x69\x53\x11\xb3\x60\xba\xba\x45\xaf\xc6\x4b\x1f\xe7\x1e\x9b\x1b\x47\x36\x00\xcd\x7c\xf8\xc9\x1b\xa3\x07\xf4\x1f\x83\x11\x17\xe3\x15\xef\xa6\x0e\x09\x1b\x37\x3d\xb4\xee\x41\x87\xe1\x49\xa0\xd1\xd3\xb8\x18\x40\xa8\xf8\xc5\x60\xb7\xfe\xd0\x87\xae\xdf\xb0\xed\x10\xd9\x76\x88\x3c\x76\x0e\x91\xc3\xc4\x64\xf0\xa4\xe8\x9b\xd3\x75\x98\x0c\x70\x1d\xbb\x1f\xfd\x46\xc0\x1e\x67\x16\xbd\x5e\xb7\x3f\x17\xb0\x7b\xaf\xc0\x9f\xf2\x34\x27\x0e\xed\x44\x96\x4f\x6b\x9f\x66\xd4\xac\xd6\xa0\xdb\xa6\x37\x99\xdd\x76\x24\x75\xdc\xf8\x51\x0c\x4f\xed\xe6\xd9\x92\x58\x4a\xfa\x36\x33\x33\x92\x05\xeb\xd0\x65\xf6\x57\x3b\xd8\x13\xf0\x93\xc9\x56\x2b\x97\x45\x71\x77\x9f\xe2\x83\x67\xa6\xe7\x8a\xf0\x23\x3b\xa2\xcf\x8f\x0a\xde\x11\x5d\x35\x18\x34\xbd\xea\x27\xb5\x53\x28\x5e\x56\xe0\x87\xf6\x4e\x45\xe6\xab\xe6\xa4\xc2\xb1\x33\x24\x0b\x65\xc6\x57\x64\xd2\xa5\x92\xd4\x0a\x11\xcd\x15\x93\x0f\xc3\x10\x8e\x17\xa5\xce\x1a\x5e\x97\xed\x76\xdc\x84\x6a\xd7\x84\xa5\x28\x6f\xf0\x29\x2a\x41\x9d\x7e\xfa\x98\x11\xdd\x6e\x9e\x75\xf3\x58\x94\xb2\xda\x38\x51\x28\x3d\x1f\xef\xaa\xa0\xf9\xc4\x77\xd8\xc7\xe3\x11\xd6\x62\x53\x14\x30\xe7\xe6\x1e\x88\xee\x0c\xc7\x4d\x73\x49\x80\xe8\xfa\x20\xb7\x73\x51\xda\x5b\x02\x55\x34\x5d\x43\x61\xf5\xb9\x2c\x7b\x79\x4a\x3c\x9c\xe5\x4a\x56\x60\xf5\x85\xe1\x31\x2b\x57\xe2\xf4\xbc\x43\xdf\x4d\x43\xac\x7a\x45\x0d\x73\x2f\x97\xe9\x5e\x07\x70\xe0\xc4\xc2\xad\xca\x57\xb2\xce\xc8\xaa\x99\x59\xec\xa1\xaa\x72\x5c\x87\xa0\x52\xb1\x30\xdc\xd2\x12\x7e\x00\xdc\x83\xac\x18\xa7\x00\xbd\xeb\x79\x92\x65\xe7\x0b\x2e\x4a\xfe\x8c\xfa\x89\x2c\x5f\x13\x79\x4b\xb6\xd4\xbf\xf8\x8a\x14\x2d\x99\xf3\x2c\xe7\xcf\xa8\xcf\x49\x91\xd4\x67\xba\xce\x33\x7d\x7b\x3f\x07\xa0\x62\xb5\xb0\xf8\xfe\x98\x78\xba\x21\x6e\x7b\x4c\xb3\x91\x3a\x6d\x9b\x99\xf5\x0e\xc7\x59\x76\x86\x9d\xba\x82\xed\x34\xbf\xde\x62\x66\xff\x67\xc0\xcc\x11\x14\xbe\x32\x88\x0e\xd9\xe8\x67\xca\xd4\x6e\x03\xb6\xdd\x38\x5f\x67\x1d\xbb\x0d\x3c\xcb\x4e\x5f\xd3\xfd\x7e\x29\x98\xdd\xdc\x99\x58\x0f\x9f\x54\xb7\x01\x85\x50\xd4\x7a\xb9\x7d\xa2\x88\xb1\xaf\x54\x03\xce\x5c\x47\xa2\x67\x39\xff\xee\x7f\x18\xf7\xe1\xdb\x77\xff\xc7\xf7\x2e\xfd\xb5\xe7\x5d\xfa\xe3\x60\x0b\xc9\x66\x21\x85\x1c\xfa\xde\xb7\x5d\x4c\xd7\x6c\x22\xb6\x1d\xd1\x5f\xe5\x8e\xe8\x37\xee\xf5\x58\xfe\x86\xa1\xf6\x9e\xde\x93\xbd\x38\x5d\x9e\x72\xb9\x32\xc2\xcf\xb1\x68\x6a\xd8\x0f\x0e\x72\xd4\x27\xd7\x30\x49\x60\xd0\x9f\xf0\x5c\xfc\xd6\x93\x5c\xaf\x66\xec\x4d\x3b\xd8\xee\x15\x91\xb6\xe6\xe3\x87\x64\xf8\xda\x1d\x1a\x7e\xf0\x95\xd1\x45\xfd\x54\xc3\xd3\x3a\x80\xda\xca\xc8\x15\x44\x88\x12\xc4\xd6\xe8\x44\x98\x74\x8e\xaf\xf4\xda\x6d\x48\x0b\x2a\x10\x18\x08\x70\x20\x93\x31\xa1\xcc\xa0\x2d\xca\x34\xe1\xf7\xaf\xc8\x94\xcb\x94\xda\xe6\x40\xfe\x04\x79\x1d\xba\x79\x9c\xe5\x71\xd9\xe7\x90\xbf\xcc\x45\xe2\xed\x2b\xb8\x1a\x3b\x37\x1f\xfa\x7e\x63\x60\x74\x45\x9c\x43\xf2\xf2\x15\x51\xac\x38\x5c\xc6\xea\x4f\x4b\x68\xac\x59\x36\x74\x83\x0d\x93\x4a\xd6\xa6\x26\x22\x0d\x89\x14\x09\x17\x7c\x45\x20\xd1\x3c\x74\x31\x7e\x48\x3a\x24\x2a\x6a\x7d\x35\x38\xa8\x59\x06\xb3\x58\xf0\x6e\xaf\xc4\xee\x3a\x0c\x2c\xc5\x8a\x3a\xc5\x8b\x52\x97\xaf\x95\x10\x55\x78\x83\x3b\x63\xae\x3d\x33\x69\xc6\x13\x91\x2f\xeb\xad\xb3\x88\xdf\x2d\x12\xef\x8f\xcd\x9a\x1f\x2f\xa7\x70\x43\x09\x17\x85\x30\x57\x6a\x40\x8a\x4c\x43\x08\xdb\x72\x4d\xe9\x43\xab\x7d\x18\x35\x7b\x0c\x8a\x52\xad\x17\x52\x71\xa9\x91\x58\xc7\x58\x83\x1b\x9e\x63\x25\x06\xeb\x6d\xd1\x04\x2f\x86\x1b\xbf\x66\x39\x8f\x09\x47\xbd\x2a\xf9\x72\x2f\x6e\x09\xe0\xde\x4b\xcd\xe6\x72\xf3\x2b\xb9\x31\x74\xc0\x88\x6b\x36\xbf\xa1\xa6\xbc\xcd\x07\xaa\xbc\xba\xc6\x1e\x07\x8d\x3a\x25\xd3\xe5\x72\xe5\x54\xdc\x89\xcb\xf0\xdf\x0c\xdf\xda\x5f\x05\x8b\xd5\x5f\x17\xb5\x18\xef\x0c\xe0\xc6\x2c\x72\x95\x38\x67\xd0\x0f\xb4\x26\x62\x2d\x06\x04\xb1\x37\x42\xa1\xc6\xa0\xaf\x2c\x45\x18\x55\xa5\x69\xdc\xc1\xe5\x05\x40\x63\xda\x82\x73\xeb\x56\xd2\xdd\xc5\xae\x19\x7f\x1b\x6d\xa3\x06\x47\x8a\x9e\xd2\x2e\x26\xc0\xfc\x69\x46\x6c\x1a\x18\x6c\xe4\x2d\x15\xf8\xce\xef\xd6\xd8\x4e\x9c\xaa\xf0\xa3\x35\x3d\x16\xef\xaa\xe9\x25\xe2\xd0\xcf\x51\xcf\x69\xcd\x19\x7f\xa6\xdf\x23\x34\x13\xe8\x1d\xf0\xa9\xf1\x38\x45\x07\x3c\x5e\x3f\x8b\x12\xb3\x65\x58\x98\x3e\x7c\xb1\x6e\xcf\xe6\xb5\x60\x05\xaa\xa5\x83\x9e\xe7\xaa\x9b\x4b\xa0\xf4\x29\xf4\xe6\x33\xc2\x02\xb7\x6a\x4f\xd9\xf7\xe7\x49\xa0\xb4\xd0\xbf\xd7\x8b\x0b\xc8\x88\x00\x2c\xf1\xa0\xdf\x59\x6c\x14\x88\x02\xed\x33\x89\xf3\x5c\x26\x72\x55\xa4\xe5\x96\x16\xdb\xd1\x23\xfe\xb8\xbe\x8b\xb1\xbb\xaf\x9e\x05\x22\xfc\xd2\x9e\xe8\x59\xf6\x4f\xff\xa6\x87\x4c\x1d\x04\x02\x76\x45\x5e\xc6\xcd\x5e\x22\x72\xee\xaa\xe2\x0d\x7e\xc6\xe5\x5b\x8c\xb4\x85\x0c\xda\x74\xe4\xfb\x7f\x5f\xbd\x9b\xbd\x45\x47\x8e\xbf\x21\x60\x0b\xd7\x9a\xd2\x02\x60\x10\x27\x20\xb5\xa6\xf1\xc6\xb9\x97\x01\xaa\x23\x98\xf3\x98\x66\x90\x9c\x23\xf4\x84\xdc\xb5\xd8\x6b\xf6\xa3\x81\x41\x45\xbc\x2a\x60\xf7\x5d\xf3\xb6\x12\x59\xeb\x15\xb2\x8c\x6c\x3b\xff\xb6\x9d\x7f\x8f\x9d\xf3\xef\x5e\x07\x0d\xf5\x94\xab\x44\x43\x5d\x0a\xce\x6f\x6e\xbf\x9f\x0c\x4f\xb8\xd1\x50\xde\xde\xaa\xc4\x43\xd9\x2d\x36\x34\xfa\xe9\x95\x35\xb6\x7f\x98\x69\xaf\xa3\xc0\xd5\x7e\x94\xf7\xe3\x29\x1b\xfe\x79\x10\xdd\x36\xf4\x17\x5c\x2a\xfa\x30\xb6\xfc\x3d\x4e\x22\x3c\x4f\xf2\x5d\x0c\xd8\x59\x4b\x39\x3a\x1d\xdd\x7a\x1a\xff\xc9\x95\xe4\xc0\x13\x65\x6d\xa5\xaf\xd5\x63\x4a\x78\x1f\x23\xad\x5c\x5f\x96\xfa\xfe\xc5\x73\xa6\x3e\x8d\xed\xcc\xa5\x28\xb2\x34\x7c\x72\x74\x60\xff\x52\x1e\xcb\xf6\x18\xc7\x27\x97\x57\xd0\x07\x83\xa1\xac\x14\xd3\x42\x76\xb2\x54\x43\x69\xc3\xd7\x07\xd1\x94\xff\x68\xb8\x90\x25\x61\xc5\x8b\x38\x5d\x4e\x24\xc7\x4f\xcc\x8a\x6f\x5c\x0c\x46\x67\xb3\xdc\x27\xe2\x9e\x64\x4f\x61\xf0\x34\xbc\x55\x2b\x08\xd1\xac\x43\x42\xab\xfd\xc9\xa0\xee\x98\x92\xfc\xd0\xdc\x80\x7d\xcb\x3a\x08\x57\x0d\x6e\x0d\xdf\x18\x44\xa7\xe8\xdf\x16\x13\x3c\xd8\x74\xf4\x00\x3f\x04\x90\x5e\x2b\xfc\x0a\x84\xbf\x3b\x58\x5e\x7d\x43\xe3\x75\xe5\x4e\x76\x8c\x1c\xe3\x87\xa2\x6f\x03\x67\xb8\x73\xa2\x56\x1d\xe4\xaa\x0e\x3f\xca\x7c\x07\x3b\x38\x64\x26\x08\x15\xab\xda\x68\xd3\xd2\x18\xfe\xa6\xf0\xe3\xa3\xd1\xd2\xc6\xaf\x38\x1c\xab\xe8\xcd\x36\xeb\x35\xb7\xdf\xb9\x99\x6a\x40\x6d\x6c\xca\x1c\xf0\xc6\xa6\xb7\x4a\x1a\x5c\x0c\xe8\x54\xf4\xba\xfd\x91\x11\x76\xc2\x2c\xc7\x3b\xa3\x09\xb4\x31\x60\x29\x1a\xee\x45\xdd\x98\x7d\x05\xd2\x5f\x97\xb9\x80\x1b\xfb\x0a\xd5\xed\x29\x73\xec\xde\x1d\xdd\x32\xef\x41\x08\x4d\x11\xe3\xda\x58\x59\x80\xf4\x8e\x27\x90\x63\x94\xe8\x47\xbd\xd2\xee\x62\xd0\x6a\xe0\x19\xe8\x77\x25\x6a\xd6\x43\xbb\x6c\x0a\xf7\xbe\x7f\x6d\xc0\x42\xd5\xda\x05\xd3\x58\x20\x03\xff\xae\x2b\xe7\xe1\x9d\x5e\xd0\xfc\xdf\xa5\x26\xe4\x35\x55\x3b\x63\xa2\xb4\x45\x75\x5c\x00\x8a\x00\x47\x01\xe2\xa8\x20\xd8\xb0\xc1\x1e\xb0\xd2\xe4\x4c\x34\x39\xc9\x57\x7a\x1d\x91\xaa\x21\x6f\x01\x8c\x9c\x7e\xd3\x90\x74\xcb\x6d\x5c\x38\xc1\x9a\xeb\x4c\xc0\xbb\xf6\xb0\xb1\x2d\xe1\xed\x61\xc7\x7e\xcf\x9e\xe8\x56\xf7\x81\xaf\x41\xc2\x13\x30\x60\x97\xfa\x4a\xb9\xd0\x6f\xce\x27\x71\x85\x5b\xe0\x57\x76\xb3\x0f\x8f\xd0\xd6\x79\xff\x48\xf4\xf0\xc8\x82\xb7\x59\x94\x1d\x90\xe5\x25\x90\xf0\x72\x4c\x64\x0e\x1c\xe5\x7e\x89\xa8\x86\x62\xec\x99\x8e\x5c\x81\xf4\x0b\x1a\xb4\xe1\xbf\x0d\x91\x9c\xf9\x6a\xac\xc7\x5a\xb8\x49\x04\x88\x9c\x6d\x1c\x2b\xb7\x31\x0c\x46\xdf\xd1\x4c\x6d\xd0\x9a\x67\x3d\xbb\x81\x15\x59\x6d\x98\xd2\xb9\x2c\x49\xc0\x3a\x39\x19\xf8\x38\x24\xa7\x2e\x0a\x3e\x7d\x66\xfe\xc1\x53\x93\x77\x1f\x3f\x65\xf2\x53\xab\xa3\xea\x66\xd7\xaa\xb6\x70\x92\xa3\x87\x79\x73\x45\xe4\xa2\x09\xbe\x92\x24\x4b\x97\x1b\xfa\x55\x08\xf3\x41\xc3\x58\xd9\x8a\x39\xde\xc8\x40\x46\x75\x62\xf5\x76\x3f\xcd\x72\xbe\xaf\xbe\xcf\x7c\x5c\x94\x22\xc7\x98\x43\x99\x9a\x74\x0a\xeb\x7c\xec\x25\x0c\xf7\x92\x0a\xba\x0b\xe8\xe7\x03\x36\xaa\x06\x25\x7c\x9b\xb1\x7d\x5f\x13\x2c\x68\x6a\x73\x5f\xa6\x1b\x61\x6a\xa2\x84\xe8\xb0\x72\x2c\x4d\x9c\x6e\x4c\x88\x03\xbc\xf1\x65\x1e\x37\x75\xf8\xad\x1e\x2b\x50\x3b\xbb\xb9\x2c\x6d\xe6\xb2\x26\xa5\x96\xd4\x4e\x0d\xcd\x82\x43\xd2\x3c\xf7\x4f\x90\x25\xb6\xbb\x9b\x67\x65\xd6\xcc\x92\xf0\xbe\x68\x46\xb5\x77\x66\x96\xeb\x47\x8e\x39\x0a\xcb\x50\xc3\xcc\xce\x4d\xcf\x8e\xf3\x85\xa9\x59\x48\xc3\x33\x3f\xb5\x30\xeb\x0d\xd1\xc2\xd4\xac\x37\x32\x9f\xaa\xb1\xbd\xa2\xdb\x9d\xd5\xf5\x40\xea\xfe\x85\x15\x8a\xb9\x6a\x9a\xc8\xdb\xa1\x55\x3a\x26\x22\xe6\xb6\x2c\xd4\xdc\x21\x8e\xdc\x59\xb7\x70\x11\xc0\x8b\x7e\x5a\x8a\x0b\x0d\x7e\x2e\xad\x53\x98\x66\x8b\x42\xa9\xd1\xec\x27\x88\xb6\xaa\x62\x66\xf2\xcc\xa4\x2d\x49\x73\x12\xe2\xcb\xfb\xe9\xfe\x6f\xee\xc4\x54\xfd\xe8\xe1\xc3\xb7\xc0\x90\x13\x1b\xd2\xda\xda\x5a\x23\x16\xa9\x00\x46\x24\x51\x14\xf1\x72\x0a\x29\xd4\x74\x32\xcd\x3a\x14\x31\xd6\xe0\x67\xb2\xb4\x6e\xca\xd7\xbd\xf3\x2e\x05\x2b\x4d\xc4\x74\x7a\x05\xef\xf4\x9b\x59\xa7\x2b\xd2\x3e\x30\x12\x75\xfa\x75\xe4\xef\xad\xeb\x32\xbc\xb1\xfd\xe9\xe0\x6a\xc9\x39\xee\x99\x3f\x7b\x66\x1e\x6c\x9a\xd9\x3c\xeb\x16\x67\x73\x64\x85\x9f\xcc\x73\xd1\x0f\xcf\x44\xa7\x36\xfa\xdd\x17\x7b\x95\x37\x39\x18\xd0\xb4\xf9\xc1\x4f\xdd\x60\x7f\x57\xf3\x8e\xfa\x81\x28\xfc\xc6\xdd\x59\x2f\x6d\x55\x2e\x2e\xc2\x5f\xaa\x45\xf7\x0c\xfb\x01\xf5\x51\xef\xf6\xc2\x98\x72\xda\xb7\x66\xb2\x81\x42\x08\x9d\x32\x2f\x3c\x01\xfc\xe9\x80\xdd\xea\x99\x94\x63\xd1\x37\x2a\x7b\xd3\x81\xa6\xa0\x5f\x13\xc3\xd6\xbd\xb1\x3f\x43\xa6\xd4\x89\xe8\xf6\x7b\x63\xeb\x7f\x34\xef\xf2\xfb\x94\x7c\x03\x05\x1d\x17\xe0\xbe\xd9\xac\xb5\x0f\x16\xd3\x3e\xbc\x7f\xd9\xe7\x95\x77\x33\x1d\x04\x51\xf4\xbf\x9d\xf1\xb8\x4b\x87\xd4\xbd\x1f\xa3\xfb\xbf\x35\xfa\x4f\xe7\x66\xa6\x37\x7c\xf3\x77\x76\x6d\x92\xb9\xe6\x60\x35\x73\x0d\xde\xf1\x5d\xdc\x15\xfd\x6b\x30\xec\x17\x27\xe2\x8b\x78\xbf\x55\x79\x12\x63\x30\x2f\x37\x5d\x0d\xdf\xef\xa6\x4b\x4f\xc0\x49\x68\xdc\x61\x4a\xa4\x35\x93\xac\xd7\xa2\x93\x1d\x01\x8f\x74\x40\x65\x39\x7f\xfa\xec\x3c\x1e\x61\x49\x26\x5a\x4b\x22\x11\x69\x53\xe6\x06\xb5\x95\xf5\x4a\x48\xb0\x09\x50\x04\x60\x43\x1b\x6b\xf0\xe3\x17\x44\x13\xc2\x35\x52\xc9\x23\x0c\x7f\x8f\x08\x28\x6b\xfd\xb5\x52\xe9\x7d\x0c\xbb\x72\xa6\xaa\xeb\xbe\x60\x07\xfb\x58\xc0\x42\xfc\x76\x72\x55\xe6\x62\x59\x42\x22\x9a\xf0\x5d\xc1\x65\x70\xa3\x34\x0c\x1d\xf7\xd3\x7b\x22\x2d\xe3\xb2\x1f\xf5\x06\xcb\xd4\x7e\x42\x0a\xd4\xef\xca\xbc\xde\xcd\x5a\xd6\x3d\xe6\x27\x09\xda\x0f\x3e\xb4\xe7\x52\x79\x63\x4a\x5e\x0f\xe4\xa8\x80\xa9\x58\x80\xe2\xa0\x86\x06\x7b\x6f\xc0\xf6\x96\xf6\x41\xf8\xd6\xab\xec\xc6\x73\x9c\xc2\x2a\xed\x37\xed\x06\xef\xef\x15\x35\xda\x1d\x9d\x06\x3b\xc5\x9c\x69\x0a\xef\x8a\x0e\xda\xbf\x86\x61\x73\x74\xae\x22\x70\x1f\x17\x03\x3a\xe0\x5b\x02\x76\x03\xbe\x62\x80\x9a\xaf\x09\xd8\x53\xaf\x84\xef\x46\x1d\x47\xba\x90\x68\xd6\x2f\xd4\xbd\xde\x30\x04\x86\x0e\x3f\x38\x68\xc8\x94\xbd\xc7\x24\x96\x71\x73\x16\x35\xd8\x87\x76\xb0\xa7\x6c\x92\x22\xe9\x64\x96\xc7\x0f\x29\x53\x35\x99\xcd\x5a\x93\xf4\x82\x6b\x40\x7d\x65\x34\x92\x9b\xbd\xb4\xbe\x09\xb5\xce\x97\x97\x6d\x43\xfd\xeb\x08\x7b\xfb\x70\x6b\xe3\x35\x1b\xb0\x6c\x6e\x66\x6e\x3c\x30\x58\x9e\x5e\x0f\x57\x69\x84\xb0\x65\x6b\x83\x7c\x7b\x74\xd6\x98\x1c\x6a\x11\x83\x39\x52\x37\xe6\x88\xbc\xd0\x4d\x44\x6a\x4d\x2e\x82\x6c\x6f\x64\x92\xb8\xab\x71\xd6\x98\x96\x27\xa2\xdb\xc9\xac\xd4\xf7\xdf\x57\x66\x64\xce\x1b\x23\x73\x26\xba\x93\x7a\x16\xdb\x99\x1d\x62\x72\xf2\xfd\xc3\x6c\xcd\x31\xb7\xd0\xdb\xc9\xd6\x3c\x18\xdd\x04\x72\xd4\x5f\x31\x4e\x56\xae\xd6\x40\x0f\x5f\xf7\x35\x1b\x62\x4f\x07\x65\x4b\xf8\xb9\x30\xfa\x54\xa8\xff\xc2\x41\x07\x15\xaa\x8e\xae\x99\x21\xae\x5d\xd2\xbc\x21\x13\x94\x71\x7f\xa0\xbf\x0f\x1c\x90\x1d\x91\x17\x2b\xb0\x73\x26\x7a\xa9\xfd\x43\xc9\x08\xa5\xcf\xc0\x69\xfd\xc0\xe4\xe9\x53\xe3\x88\x41\xd6\x8b\x25\xe3\xa8\x06\xed\x1f\x83\x37\x26\x8b\x99\xb4\x3c\x7a\x44\xfd\x05\xec\x1f\x59\x5e\x40\xaa\x54\xdc\xc7\x22\x89\x1f\x32\xbe\xf8\x0e\xe0\xde\x8e\x31\x76\xa7\x96\x79\x77\x71\xfa\xdf\xb1\x63\x4f\xe6\x77\x2a\x8d\x52\xb6\x30\x4b\xd1\x5d\x77\x16\xbd\x76\x3b\xbe\x70\x17\xe3\x7c\xff\x99\x4c\x93\xbe\xe8\xa7\x1e\x86\x7f\xdc\x3a\x5a\xa3\x08\x6d\xa1\x38\xe5\x77\xb6\x64\x33\xee\x88\x64\x7e\xe6\xae\xc6\x18\xbb\xb3\x15\x2f\xc7\xa5\xa9\x8f\xaa\x3c\xc0\x9f\xc7\x0f\xf2\xe7\xf1\x46\xa3\xc1\x9f\xc7\x6f\xe7\xf8\x56\x71\x97\xff\x96\xfe\xf6\x79\xfa\x5f\xe6\xb5\x3b\x71\x88\x87\xbe\x5f\xd8\x0f\x8a\xbb\x1a\xc3\x9e\xa9\x8a\x6d\x51\xaa\xf7\x6e\xfb\xa0\xa8\xe8\x49\x11\x7f\x1e\x8f\xea\x51\x65\x74\x4c\x55\xba\x01\xcf\xa3\x02\xcc\x03\x33\x52\x7e\xd3\x96\xe2\x54\xe4\xfd\xf9\x19\x6c\x08\x8e\xd0\xf1\x0b\x48\x77\xe2\x3e\x53\x6f\x38\x2f\x3b\x45\xdc\x1b\xf3\xe7\xf1\xd3\xea\x3f\x4f\x53\xff\x59\x50\xff\x99\x55\xff\x39\x1e\xab\xb9\x9a\xc1\xeb\x00\x62\x18\x22\x76\x47\xe4\xc5\x28\x8b\x3b\xf8\xbc\x94\x86\x5e\xb5\xbb\xd2\x2f\xe2\x66\xd1\x48\xe3\xa2\x6c\x2c\x67\xab\x13\xcd\x5e\x6f\xe2\x9c\x7a\x6f\x02\x6b\x06\x56\x55\x35\x77\xb6\x4d\xb6\x1d\x1d\x35\x30\x6a\x74\xce\xab\xf6\xa8\xe6\xa8\xd6\xa8\xc6\xa8\xb6\xf8\xcb\xe6\xe0\x81\x43\x47\xf8\x93\xf9\xc1\x7b\x63\xe0\x8c\x39\x78\xe0\xc0\x01\xf5\xe7\xf9\x3b\xf8\x0c\x6f\xc5\x2d\x48\x90\xba\x92\xe9\x9c\x16\x4d\xd1\x8d\x4b\xb3\x72\x1b\xb6\x01\x76\xa0\x60\x6e\xe4\xc0\xac\x3c\x8f\x47\xc7\xab\x0f\x19\x3b\x03\x1c\x34\x80\x45\x04\x57\x23\x89\x9a\x72\x25\x97\x20\x2a\x91\x6b\x46\x6d\x90\x42\x1f\x90\xe3\x3c\xcd\x8c\x66\x40\xd7\x29\x3a\x1a\x42\x6f\x6c\xbe\x0c\x39\x5d\xe9\x0a\xfe\xd0\x77\x1c\x3d\x5c\x3f\xa8\x16\x7e\x47\x2c\xa7\x71\xd9\x6b\x01\xe7\x47\x8e\x77\x12\xe4\x24\xb1\xde\x85\xc3\x9c\xfa\xc4\xbb\x89\x68\xca\xa2\xc1\xb1\xb9\x85\xbe\xd7\xd7\x17\xe8\xdd\x5c\x36\xe3\x42\x3a\xd9\x90\xbb\x5d\xd9\x02\xf4\x22\x32\x73\xf0\x5e\xb7\xc1\xf7\x1f\x6f\x2c\x37\x8e\xf1\x03\x8d\x83\x1d\x02\x5c\x9a\x1f\xe1\x96\xb5\xd3\x18\xf3\x63\x6f\x94\x35\x36\x90\x74\x9c\xc7\x6d\xbe\x26\x75\xb2\x21\xa7\x25\x1a\x39\x40\x23\x12\x4b\x25\x63\x00\xa5\x21\xb8\x2b\x13\xbb\x22\x2f\xac\x73\x07\x65\xad\xbd\xb9\xce\x25\x91\x2a\xc1\xe8\x93\x77\x10\xb7\x09\x8e\x50\x0b\x6f\xaf\xbc\xc4\x36\xc0\x6b\x02\x2f\x8b\x65\x01\xe9\xe7\x94\x51\xa5\x01\xbc\x20\xe0\x20\x39\xf4\xdd\x98\x73\x5b\x3f\x83\x8a\x4d\xd3\xf4\xe0\x21\xf6\x82\x47\x4d\x91\x66\x29\xe4\x5e\x53\xb3\x1e\xe9\xb8\x24\xc8\x0a\x0c\x0b\x56\xaf\xb4\x09\x6a\x9e\x2e\x40\xb4\x9e\xd3\x83\xcc\x35\xbd\xae\x1a\x97\x56\xb6\x96\xf2\xfd\x74\x8f\xe9\xd3\x6e\xc4\x69\x33\x07\xe2\x53\xf5\x9a\xa4\x7f\xc7\x29\x3f\xad\x9a\x54\x14\x62\x0c\xad\x6e\x55\xdb\x31\xc6\xb9\x50\x66\x3b\x4d\xb6\xc9\x26\x0c\x84\x72\x4b\xf0\x4b\x3b\x17\x4d\xda\xd3\x28\xb1\x4c\x93\x64\x27\x2e\x4b\xd9\x62\x9c\x37\xf1\xe6\xdd\xac\xe8\xfd\x90\x29\x5f\xb5\x1f\x40\x2f\x82\xd6\x16\x60\x8c\x35\x3e\x19\x4f\x8a\x78\xd9\xa6\xdb\xce\xb0\x3c\xde\x4b\x13\x44\x4b\x1b\xac\x00\x24\xa9\x5a\x06\x36\x89\x06\x63\xc7\x09\xf4\xa4\x5a\x7f\xb0\x71\x8b\x4d\xef\x6d\x66\x45\x55\x14\x1d\xbc\xe5\xc0\x81\x4e\x84\xef\x3c\x2d\x5e\xff\xad\xc3\x47\x4f\xc7\x91\xda\xab\x5a\x66\x20\xe4\xc4\x9d\xc0\x33\xc7\xef\x3b\x3e\x67\x7c\x4f\x29\x68\xea\x66\x5b\x92\xcb\x93\xb7\x93\x0c\xfd\xaf\x78\x2e\xeb\x33\x78\x81\x40\xdf\xaa\xd4\xb5\x95\x0c\xc8\x73\xd4\xef\xda\xd9\x29\x2f\xc8\x5c\xed\xb3\x86\x6a\x42\x5a\xb7\x0b\x84\x92\x8f\x41\x03\x8a\x52\xfd\x17\x16\x39\x8c\xa6\x9b\x3b\x5b\x59\xd9\x6b\x12\xb1\x64\x1d\x25\x40\x94\xa0\xd3\xbd\xcd\x65\x9d\xa6\x89\x36\x5c\x9c\x73\x7f\x0d\x36\xf8\xfe\xf9\x8c\x8b\x64\x4d\xf4\x41\x02\x55\x7e\x1e\xc7\xd5\xa6\x04\x65\x2b\x6e\xb7\x1b\x63\x3a\x1b\xba\x3e\xd5\x61\x4c\x52\xa2\x01\xec\x88\xf3\x90\x66\x5f\xbd\x1a\x37\x7b\x49\xa9\x63\xd6\xca\x15\x59\xe8\xe9\x44\x0d\x1f\x2e\x60\x72\xba\x56\xcb\x94\xf6\x9f\x61\x06\x6e\xb0\x09\x44\x02\x10\x24\x8a\x44\x6b\x49\x2d\x2e\x56\xb2\xae\x34\x60\x70\x51\xba\x61\x54\x86\x82\x30\xcb\x51\x79\x4d\x0a\xac\x9b\xf4\x25\x1a\x77\xf3\xda\x60\xee\xbd\x9f\xb9\x91\x1d\xbb\x32\x0b\x63\xbe\x2b\x9b\xe1\xdf\xdc\x10\x3d\xb8\xc1\xef\x15\x2d\x51\xd3\x35\xb4\x7b\x29\xed\x2f\xb5\xdc\xe8\x84\x58\xa7\x98\xc6\xc5\xe0\x06\xf8\x17\xda\x85\x73\xb2\x7d\x31\xd8\xdb\x11\x17\xe8\x4e\xc8\xb7\x32\x3e\x7d\x3d\xfb\xfb\x1a\xdb\xdb\x89\x53\xfd\x73\xf8\x19\x03\xcb\xf9\x78\xcd\x79\x6e\xcc\x04\x70\x29\x03\x41\x96\xd1\xb3\x5d\x9c\x12\xbd\x5d\x66\x4e\x2a\x4e\x61\xcd\xa0\xa6\x48\xc9\x2d\xa2\xa4\x53\x83\x2b\xf5\xb3\xe5\x40\x22\x0f\xf2\x6e\xd6\x6a\x70\x5e\xa9\xd9\x87\x3d\x1d\xd0\x80\x7c\xf0\x4b\xf3\xb6\x14\x70\x3e\x2c\x2b\x23\xec\xe4\xec\xe4\x3c\xf4\x3e\x7b\xa6\xcc\x81\x2a\x1f\xe9\x66\x88\x9e\xd1\x25\xd1\x43\xaf\x99\x5a\xbb\xda\x9d\x63\x0c\xe1\xc2\xe2\x03\x55\x6b\xe6\x9b\xa4\xfc\x16\x9a\x49\xd1\xd9\x60\x15\x62\x3e\x28\xc0\xc0\xf5\x4c\x96\x76\xdf\xbd\xfc\x3d\x35\x56\x99\xa4\xf0\xcb\x01\x3b\x79\x59\xb9\x7e\xa7\xf2\xac\x28\xc8\x3d\x57\x85\x34\xbf\x39\xf0\x4b\xaf\xa4\x6a\x27\xb7\x83\x45\x2e\x90\xaf\x8a\x12\x6e\x59\x33\x9c\xa2\xf0\x10\x7f\x85\x13\x8a\x3d\x2c\x3c\xee\x22\x40\xf5\x2a\xb1\x22\x0a\x14\x33\xb8\x02\x44\x93\x3c\x16\x4e\xea\x43\x5a\x21\x1c\xd8\xd2\x1a\xec\xe1\x1a\xdb\xad\xc9\x48\xc2\x1f\xaf\xad\x1f\xac\x70\x39\x3b\xed\x6e\x2a\x30\xfa\xad\xc0\x10\x9d\x54\xf1\x9e\x34\xa3\x55\x22\x14\x1a\x99\x38\x45\x52\xb5\x73\x98\xc7\x6a\x5a\x9d\xa4\xad\x38\x97\x94\xdb\x6f\x3f\xd4\x43\x3f\xc2\xbf\xe1\x0d\xe2\x02\x53\xe7\xac\x06\x8d\x8d\x35\x0c\x58\x4e\x96\xe3\xb4\xa9\xf1\x46\x80\x56\x6a\x9c\x2e\xcf\xf5\x12\xa9\xd9\xe6\xd4\xd6\xe8\x39\x05\xe3\x29\xae\xe4\xb7\x9a\x93\x06\x7b\x6b\xc0\xdc\xdd\x1c\xbe\xce\xdc\xaa\xbc\x30\x70\x9e\xeb\xed\xda\xeb\x76\xaf\xcd\x76\x55\x7a\xdc\x0c\x84\xd4\x10\x04\x25\x31\xd1\x4a\xce\x5e\xf5\x57\xf9\xf3\x77\xb0\x5d\xb4\x5c\xc2\x7f\x1c\x8d\xde\x36\xaa\xd7\x8e\x17\x1d\xe9\xa5\x2f\x77\x57\x9a\x3e\x16\x20\x81\x62\xb3\x97\x20\xb9\xa7\x95\x8a\xde\x52\xe2\xfb\x5d\xe4\xa4\xff\x13\xb1\xb7\x8a\x24\x31\xab\x57\x9f\x7d\x6a\x50\xc7\x08\x06\x3b\xbc\x5c\x25\x0b\x74\xf5\x2d\x1d\xd5\xd4\xd7\x08\x20\x40\x9d\x98\xec\xa0\x03\x2e\x3d\x8d\xe1\xf5\xf3\x6d\x53\xa0\x99\x7e\x68\xe7\x43\x6d\xb5\x06\xe7\xc7\xf3\xe5\x6c\xdc\x34\x15\xf6\x22\x5c\x6c\x19\x4d\x8d\xd0\xea\xdd\xac\x65\x1b\xa9\x55\x3a\x52\x53\xe1\xce\x65\x55\xe6\x85\x70\x20\xb1\x0e\x17\x32\x09\x2a\x2d\x00\xfa\x5d\x5a\x81\x1d\x0d\x21\xf2\x61\x10\x2b\xd9\x1a\x02\x29\xb5\x66\x4c\xdf\x43\xbb\x48\xb1\x5c\x7f\xa9\xd3\xcb\x56\xbd\x82\x33\xff\xb6\x03\xdf\xc6\x05\xba\x2d\xf9\xd4\xec\x39\xde\x2b\x63\x63\x56\xb9\x20\xfe\x3b\xd8\xed\x1b\xe4\x95\x59\x3f\x0d\xba\x3a\x50\xd9\x8f\x8d\x7a\xf7\xd7\x03\xa9\x85\x7d\x96\xc8\xbf\x7f\xe4\x58\x22\x7f\x78\x84\xbd\xc6\xb0\x44\xbe\xcc\xb0\x44\xfe\xc3\x36\x4b\xe4\xd6\x58\x22\xfd\x5b\xe0\x6b\xc9\x17\xf9\xee\x51\xf6\xec\x6b\xc9\xed\x3d\xdf\x5b\xd2\x6b\x84\x52\xc9\x7d\x62\x24\xfa\xf0\xc8\x26\x2f\x19\x90\xa6\xbe\x3c\x52\x35\xbb\x3e\xc8\xc2\x7e\x01\xe3\xec\x97\x57\x34\xf8\xbc\xf1\x5c\x56\xec\x0e\x55\xc8\x62\x03\x8b\x59\x44\xf7\x1d\x04\x73\xc5\xa9\xbe\x08\x12\x95\xd2\x1a\x18\xe5\x00\x1b\xf9\x66\xca\xe8\xa9\xb6\xc0\xc4\x3a\x6d\x29\x07\xd3\xa9\xf2\x9b\xf9\xec\xb9\x05\x17\xc0\x08\x6f\x0d\x2b\xa1\x54\x16\x81\x18\x28\x00\x77\x0e\xe9\x24\xcb\xa9\x12\x4c\xa8\x48\x90\xdf\xb9\x0f\x8c\xbd\x80\x64\xef\x96\xde\x48\x95\x22\x7d\x48\x60\x03\x26\x66\xcf\xce\x2f\x4c\xcc\x4e\x2e\x4c\x9d\x1c\x68\x4b\xb5\xc2\xc1\x4a\x06\x0a\x75\x39\x15\x3e\x59\xf3\x50\x66\x1a\x9f\x85\xf2\x63\x5a\x02\xa0\xfa\xe7\x6a\xd1\x3d\xab\xce\x03\x47\xc1\x87\x80\xe0\x2e\x89\x0c\xc1\x73\xb1\xc6\x97\x92\xac\x79\x9e\xb7\xf0\x4d\x73\xc5\x61\x51\x84\x86\x05\x80\xe1\x3b\xb3\xa2\x5c\xf1\x33\x0c\x06\x2c\x61\xce\x8f\xe1\x77\x44\x4f\xb7\x7f\x79\x91\x7c\x76\xf2\x7d\x78\xa0\x31\x6f\x4d\x33\x50\x68\x77\xd0\xb5\xa3\x2f\x8a\x8d\xeb\x1c\xef\x66\xef\x8d\xee\xb2\x99\xf6\x21\xe6\xd6\xbb\x64\x12\x0e\x3f\x10\x8e\xcf\x54\x22\xe2\x8e\xb6\xd8\xba\x99\x97\x1d\xe8\x1d\xbb\xd8\x13\x9c\x81\xcd\x97\x44\x13\x82\x52\x7b\xd0\xcb\xf0\x95\xbb\xa2\x5f\x0f\xe8\x0f\xab\x4a\x88\xc1\x70\xbd\xcc\x28\xf8\x48\xd5\x0e\x77\x4a\x65\x8c\x3c\xdd\xca\xca\x5e\x8a\xd1\x1d\xa2\xc5\x57\x99\x69\xf0\xbd\x12\xaa\x04\xd9\x59\xc9\x92\x16\x17\xa4\xfe\x01\xe8\xda\x60\x7c\xa9\xbe\x71\xbc\xd2\xc7\xc3\x1d\x79\x50\xd2\xba\x4e\xb0\xa2\xe1\x0b\xc8\xc8\x9e\xb6\x28\x3d\x2a\x60\x1b\xd4\x84\x9e\x8f\xd3\xd6\x30\xec\xe0\xdb\x76\xb0\x3f\x0d\xe8\x26\xfd\xf7\x82\xe8\x23\x81\xbe\x4b\xa7\xda\x97\xa4\x6a\xb9\x69\x43\x0b\xae\xd5\x7b\x52\xcb\x11\xcb\x54\xa2\x5a\x4c\x29\x59\x73\xc9\xa3\x73\x85\xcc\xa3\x71\x1e\x01\x6c\x3f\xc2\xdd\x15\x11\x7a\x69\xb2\x09\xc7\x53\x64\x10\x52\x93\xbd\x72\x45\xe9\xd8\x32\xb7\x89\x8d\x1d\xc4\xb6\x7a\x45\x35\x50\xa3\xbb\x2b\x9f\x90\x89\x80\x69\x78\x4c\x96\xfe\x46\xe5\x96\x04\xd6\xcf\xc1\xe8\x26\xf7\x6e\x7f\xbd\x3e\xba\x9f\x7e\x28\x60\x7b\x4c\x96\xd2\xf0\xdd\x41\xf4\x96\xe0\x8c\xfe\xb3\x72\xf3\xdf\x94\x2d\x83\x64\xd7\x5d\xa3\x2a\xce\x13\xd4\x5b\x4d\x99\x29\x6d\xdc\xcc\x1a\x0e\x97\x9a\x5f\x6f\xc0\x4a\x1b\x1e\x43\x67\x13\xe2\x9f\x2e\x7f\x00\x3e\x14\xb0\xdd\xa2\x1b\x23\x85\xc8\x7b\x82\xe8\xa7\x02\xc3\x21\x62\x83\xe4\xec\x14\x0e\xf6\xab\xe8\x51\xc7\xdc\xc8\xc2\x28\x82\x75\xe8\x4f\xab\x7e\xb5\xa8\xbc\x0b\xfb\x4b\x50\xab\x5d\x14\x75\x64\x42\x5b\xa1\xd3\xd8\x2a\x53\x88\xdb\x8b\x17\x5e\xc7\x9e\xb8\x05\x72\xc8\xf0\x0f\xf7\x46\x27\xab\x0f\x4d\xd4\xd3\x65\xf2\x46\xfa\xe8\x83\xbd\x6c\x91\x85\xfa\xa3\xa7\xc9\x94\xd8\x5e\xc2\x7b\x40\xd1\x3a\x7a\x24\xba\x45\x69\x2c\xcb\xe6\x07\x5b\x01\x1d\x90\x2d\x4b\x50\x6b\x71\xa0\xbe\xa2\xf0\x6c\x76\x7d\x2e\x45\xab\x6f\x8c\xaf\x53\x5a\x8b\xbb\x75\x21\x2b\x45\xe2\x59\x56\xa2\xd5\x47\xe5\x06\x0d\x02\x67\x43\xb6\xdc\x3e\x38\xc5\xbf\x10\xc2\x46\xa9\xe8\x35\x5d\xf4\x52\xb5\x68\xb5\x52\x4b\x99\x77\xe2\x14\x2c\x92\xcd\xea\x00\xc3\x28\xce\x35\x85\x92\x95\xcd\x9a\xc1\x68\xcc\x6f\xc5\x07\x6b\xec\x6b\x7a\xa9\xf1\x5b\x98\xbe\xbe\xd5\xf8\x85\x5e\x5d\xab\x36\xc9\x79\x7f\xf3\x3e\x5b\x1a\x0b\x65\x2d\x55\x4a\xc2\xaf\x01\xa2\x94\x4b\x72\x69\xe6\x3a\x27\xbe\xd6\x34\x9c\xce\x95\x19\xde\x5d\x1c\x3c\x00\xc6\x84\x6e\x44\x53\x74\x45\x33\x2e\xfb\xa0\xa7\xe2\x15\x89\x05\x60\xfa\x75\x68\x58\xcc\x52\xaf\x34\xb8\x78\x5b\x50\x96\x3b\xaf\x63\x73\xa0\x3e\x34\x82\x65\xca\x9b\x70\xcd\x52\xd1\x28\x5f\x1e\xb0\x1b\x29\x44\xc3\x8c\x5f\x5f\x0f\x5f\xeb\x6a\x27\x94\x82\x2f\x57\x7d\x6b\xb8\x94\x9d\x2e\x98\xc8\x4a\x4b\xf6\x9b\xf3\xb2\x80\x3d\x7e\x70\x42\x7b\xba\x41\x8b\xd5\x06\x55\x26\x73\x3f\x2e\x66\xd0\xed\xb5\xaf\x0b\x6c\x7e\xd1\xea\xcf\xcb\x66\x96\xb6\x8a\xb1\xad\xaf\xf2\x3f\x09\xd8\x0d\xcd\x2c\x49\xe0\x26\x61\x0a\xac\xa1\x8f\x19\x1f\xc6\xbb\x03\x78\xa2\x1a\x01\x61\xaf\xe6\xc5\xc2\x4c\xfe\xb4\xb7\x92\xdc\xbf\x5d\xfc\x76\xaf\xd0\x99\x50\xd0\x82\x10\x3a\xfc\x1c\x2f\x30\xc4\x6a\x46\xf1\x9e\x1d\xa9\xd4\xbd\xb8\xe8\x98\xbb\x9b\x54\x4a\x84\xf5\xe2\xd4\x5a\x3d\xc6\xf8\x4f\xe4\x9a\x2c\x4a\x87\x9d\xda\xef\xe0\x3f\x07\x5e\x8a\xe7\xbf\x0a\xa2\xd3\x73\x3e\xea\x9f\x62\xa3\x9c\x55\x06\xb2\x88\x1c\x20\xa0\x2e\xd9\xd1\xdb\x57\x18\x47\x01\xc0\x4c\x3c\xd3\xf8\x36\x76\x94\x1d\xb9\x0c\x8e\x5e\x27\xcd\xf3\xb5\xcf\xe1\xcc\xbe\xf8\x38\xf6\xa4\x4d\x20\x75\x64\x99\xe3\x69\xf0\xfe\xc7\x45\x77\xb9\x0f\x2a\xde\xef\x44\x14\x25\xa0\x46\x5c\x7c\x0d\x05\x92\x10\xe0\x87\x20\x34\xde\x51\xf0\xd9\x1b\xd9\xc7\x46\xd8\xe3\x6d\x92\x47\x52\xef\xc3\x77\x8f\xb0\x7b\x2e\xc3\x8d\xe0\x84\x01\xe9\x22\xdc\xc6\x46\x9f\xad\x59\xa5\xd9\x49\x31\xd3\x96\x74\xb5\x60\x1f\x6a\x44\x97\x56\x2a\x90\xc2\xc6\x86\x62\xc7\xa9\x13\x87\x9b\xb6\xc8\xb1\x30\xc6\x01\x54\xa2\xca\x72\xe0\x81\x0e\x5f\xbd\x19\x0c\x27\xb6\x27\x45\x2f\x4d\x37\xb3\xb8\x67\xbd\x78\xc0\x8d\x47\xde\x29\xcc\x77\x38\x35\x7b\x0e\x6e\x72\x65\x27\xcb\xfb\x63\x0d\x3e\xdf\x73\xfc\xbb\x4a\x36\x2e\xf5\xe2\x04\x9c\xa1\x5e\x1b\x50\x05\x02\x01\xa4\xef\x61\xb4\x3b\x55\x93\x55\x02\x14\x84\xb4\x15\xd5\x57\xbb\xd4\xcb\x8c\xa7\x59\x0e\x57\xcb\x04\xda\xb3\x7e\x2e\xed\x54\x8b\x94\xd8\x89\xc8\x37\xd5\x60\xff\x50\x63\xbb\x25\x79\xe8\xc3\xcf\xd5\xd8\xe4\x65\x4d\x62\x05\xaa\x89\x73\xf7\xe3\x35\x5d\xa0\x37\x63\x3e\x6c\x50\x3b\x2e\xb6\x0c\xda\x04\x0f\xa9\x40\x30\xb6\xd3\x14\x62\x35\x85\x24\xb4\xd6\xaf\xd6\xcc\x3a\x40\xa2\x92\x67\x1d\x6e\x72\xca\x14\x1b\xa0\x34\x1f\x65\x48\x28\xfb\xaf\x81\xde\x53\xe1\x2f\x04\xec\x29\x97\x35\xe8\x26\xa0\xcf\x0e\x79\xe9\x5a\x4d\x34\xde\x34\xd0\xc3\xd6\xf4\xf9\x0d\x11\xb1\xe3\x7c\x25\x2e\x8b\xba\x5a\x42\x05\x9c\x40\xe0\xc3\x4a\xf9\x4c\xba\x0c\x44\x55\xf8\xc9\x58\x83\xbd\xb6\xc6\x46\xd5\x6a\x0a\x5f\x5e\x5b\x3f\x32\x71\x68\x17\x66\xb3\x56\xe1\x75\xe0\xa3\x01\x92\x1f\x6e\xd8\xfe\xad\xed\x3e\xaf\x27\x00\x4a\xc3\xfb\xf3\xa2\xde\xcd\xb3\xa6\x2c\x0a\xd9\x72\xfa\xa6\xfd\xd3\xee\x65\xef\x92\xd4\xae\x53\x65\x92\x2f\x4b\xd2\x6d\x00\x65\x80\x56\x13\x80\xe5\x73\x7b\x8d\xe3\xfa\xa5\x1b\xec\x75\x23\x4a\xd7\x24\xc1\xf8\xf2\x91\xcb\xdc\x53\x43\xe5\xe1\xaf\xd7\x1e\x13\x29\xf8\xd5\x27\xef\x7e\xb2\x46\xd0\xc1\x1f\xad\x45\x3f\x50\x03\x87\xbb\xd6\x96\x7d\xe7\xbb\xf6\xd5\x29\xb1\x63\x00\x12\x18\x0a\x17\x0d\x9c\x5d\xca\xe6\xd7\xb2\x50\xfd\x1b\xb7\xa8\xfa\xd7\x2c\xd4\xae\x4c\x5c\xe7\x5d\x18\xd6\x4a\x9c\x93\xb0\x1c\x6d\xe4\x97\x4d\x1d\x53\xba\xc1\xcf\x64\xa5\x3c\x36\xac\x6a\xae\x3b\xe1\xa8\x3c\x04\x96\x01\x7c\x0f\x5e\xe0\xd6\xf5\x05\xae\x29\xe0\x34\x0d\x95\xbd\xc5\x75\x8d\xce\xff\x3a\xca\x36\xbb\x08\x70\x36\x31\x2e\xf5\x1f\x18\x8d\xfe\x32\xa8\x3e\xdd\x0a\x72\xff\x91\xdf\xe3\xd7\x78\x8b\x5f\x0c\x76\x62\xd3\x2f\x06\x3b\xf1\x07\x4f\x4b\x7a\x71\x4d\xd9\x9b\xf4\x4a\xd8\xbf\x2c\xe1\xa8\x2f\x58\x66\x0c\x8d\x4d\x74\x9b\xbe\x39\x77\xf3\x10\x9a\x16\xd1\x8f\x4b\x7d\x54\xa4\xe1\x72\x93\xac\x4f\xf6\x9d\x8c\x9a\x17\x16\xec\xf6\x2b\x68\x04\xde\x71\x47\x47\xa9\x2a\x9f\xab\xd8\xbb\x8c\xd3\xfa\xbb\x0b\x19\x67\xff\xb0\x97\x7d\xdd\x3a\x69\x8a\xc3\xdf\xdf\x1b\xc5\x67\xe8\xee\x40\xf0\xb5\x2c\x3f\x2f\x73\xba\x4c\x48\x1d\xf9\xd0\xe0\xc7\xd5\x8a\x80\x1f\x6c\x4a\x47\x73\x0d\xe2\x90\xfd\xe8\x05\x23\x9a\x2b\x52\x67\x5e\x4e\xb9\x2c\x9b\xad\x31\xdf\x9d\xf1\x0a\xc6\x7e\x55\x73\x63\xbc\x27\x60\x63\x5b\x4b\xab\xdc\x95\xcd\xe8\xa5\x01\xe1\x48\x2c\xe3\x83\x7b\xc7\xad\x6f\x87\x1e\x09\x7a\x00\xd5\xda\xba\x48\x5b\x75\x74\xd9\xb0\x7f\xb1\x9c\x19\x5f\x0a\xb6\xc0\xd1\x0b\x7d\xc0\xb3\xe4\x97\x83\x2d\x65\x11\xc1\xbe\xcc\x66\x5d\xba\x9d\xd5\x09\x37\x89\xbb\x5d\x59\xa8\xf5\x2c\x4d\x86\xf3\xb0\x3d\x92\x5d\xdf\xe6\xe3\xd8\xe6\xe3\x78\xcc\xf8\x38\x7e\x27\x70\x08\x39\x3e\x1c\x5c\x6d\x7e\xa2\x17\x06\x95\x04\x45\xfb\x0a\x9b\xa2\xe8\x91\xee\xa2\xae\xe8\x52\x70\x6a\x73\x5e\x90\xb1\x70\x5f\xdd\x21\xee\xd4\x1c\x20\x4a\xae\x54\x93\x03\xbd\xf8\x7a\xef\x8a\xc9\x66\x22\x40\x1e\xa4\xcf\x5e\x17\x7d\x2e\xd0\x2c\x48\xb0\xf0\xd4\xc1\xd5\xe2\x62\xa9\x28\x09\xeb\x0a\x30\xc4\xac\x5d\x42\x66\x36\x1d\x27\xeb\x9f\xfa\x9d\x7e\xf1\xdc\x64\x4c\x07\x64\xd3\x4d\x5f\x92\x35\x05\x06\xad\xfb\x06\xdd\xe1\xc3\x07\x8e\x8e\xd9\xdb\xb7\x6e\x9e\x5d\xe8\x03\xb3\x9b\x04\xfd\xd2\xf2\x84\xdb\x44\xf9\xea\xdd\x96\x44\xd7\xa1\xd2\x1a\x90\xac\x58\x19\x29\x70\x0c\x89\xb4\x58\x93\xb9\x5d\xb2\x05\x3a\x0f\xf3\xac\xb7\xbc\x62\xeb\xa8\x90\xf2\xb3\x6d\xd9\xb5\x2d\xbb\xb6\x65\xd7\xb5\x94\x5d\xec\xc3\x5a\x95\x7b\x7f\xc0\xc6\xb7\x90\x0d\xc5\xd2\x97\x7d\xdf\x66\xda\x1c\x09\x9e\x47\x47\xa1\xfb\x37\xab\xd0\x7d\x39\x60\x8d\x2d\xf7\x04\x75\xba\x0f\x6c\x4d\xa7\x33\x3d\xfa\xf7\xa7\xd6\x5d\x0a\xce\x6e\x7e\x08\x8d\x87\x37\x0f\x3b\x84\x86\xb2\x50\x31\xf6\x8a\xeb\x3c\x02\x2a\xe2\x6b\x07\x2b\xe7\x60\xe3\xe4\xc2\xc2\x2c\x79\xb4\x00\xcc\xf1\x99\xbd\x51\x56\x79\x66\x1d\x93\x98\xff\xbe\x5c\xd1\xc4\x75\x4b\xa2\x79\x5e\x02\x28\x2f\x25\x57\x63\x2f\xd7\xf7\x7f\x5a\xe6\xc0\xfb\xea\xfc\x6a\x6b\x5e\x72\x2d\x72\xf5\xd7\x17\x83\x5d\xf4\x4f\xef\x98\xf8\x7d\xc6\x7e\x70\x17\xdb\xad\xbe\x87\x34\x4c\x2f\xde\x15\xfd\xf3\xce\x59\xfa\xcb\x3d\x93\x10\x75\x48\x64\x1c\x5e\x2a\x42\x68\xbd\x6e\x4d\x83\x9b\x8f\x09\xce\xe6\xf0\x8f\x22\xbf\x85\x11\x9d\xc5\x31\x7e\x33\xc6\xab\x1f\xe3\xa7\x9d\x6c\xe7\xe7\xe6\x4e\x61\x87\x24\xc6\xb2\x37\xf8\xcd\x7c\x16\xa8\x24\xec\x7b\xc6\x13\x2b\xec\xeb\x48\x37\xc1\x8b\x6e\x12\x97\x6a\xa9\xed\x9b\xd8\xd7\xc0\x0f\x10\xf2\xcd\x38\x6f\x41\x6b\x52\x3d\xc2\x12\x83\x03\xd4\xcb\xe6\x9f\xa2\x88\x0b\xc8\xa9\xeb\xbe\x40\x7e\x30\xf4\xde\x30\x6e\x88\x5a\xe9\x2e\x56\xa3\x5f\xd4\x27\xa6\x7a\xf5\x64\xdf\xc4\x3e\x5e\xc8\xae\xc8\x05\x66\x85\x71\x19\x5a\x05\xe3\x74\x89\xdb\x06\xe6\x18\xd5\x03\x1e\xb7\xb9\x5c\x95\x79\x5f\xfd\xb3\x00\xa0\x01\xb6\xa0\xbe\x16\x1b\x42\x0d\xb8\x5e\xa5\x31\x65\xdc\x14\xa9\x4a\x40\xd7\x0d\x39\xbc\xdb\x36\x1c\x58\xf7\x83\x26\xa2\x4b\x18\x22\xa1\x8e\x14\x12\xd8\x5c\xff\xe8\x7d\x60\x7d\x79\xf0\xd1\x38\xc5\x44\x81\x27\x9d\x5a\x8f\x2e\xb9\x89\x76\x96\x4d\x2c\x89\x5c\x77\x4a\x16\xe6\xd1\xc4\x92\x78\x08\x03\x55\x0c\xf4\x04\xbf\xd4\x2f\x2c\x89\x87\xc6\x1a\xec\x66\x3e\xe3\x45\x6b\xe8\xbc\x97\xc7\xf8\xcc\xe6\xeb\x0e\x50\x81\x5d\x5e\x66\x8c\xc3\x8f\xb4\xb3\x28\x61\x90\x5f\x30\x82\x82\xca\x5c\x6a\x9e\x5f\x81\xa0\x50\x98\x26\x69\x16\xb0\x1a\x91\x9c\x5e\x53\xbd\x6e\x21\x91\x47\x92\x40\x62\xdf\x59\x9a\x8a\x1c\x57\x30\x91\xaa\xab\xb3\xb0\xc1\xaa\xd5\x21\x37\x0b\xdd\x7d\x97\x99\xa1\x7f\x07\x4e\x63\xfb\x9d\x7b\x7c\xbe\x31\x60\x7a\xbf\x86\xaf\xde\x88\x10\xdd\x17\x34\xd4\xed\xbb\xf1\xcb\xe8\x99\xf4\x0f\xef\xdc\x71\x21\x27\xa4\xed\x5a\x65\xc3\x85\x8f\x97\xb9\x68\xb7\x1d\xb4\xaf\x2b\x5b\x1a\xec\x0d\x35\xe2\xe0\x7e\x6d\x2d\x7a\x49\x4d\xa3\xd2\x74\x76\x25\x88\xa2\x2b\x4a\xbb\xda\x50\x73\x8c\xb5\x08\xd3\x39\x11\xf8\x14\xfa\xdc\x12\x88\x5e\x54\xf3\xa2\xd3\x21\x3b\xd4\x46\xad\xb8\xd0\x71\x23\x46\x3f\xb2\x02\x5e\x24\x3c\x52\x55\x44\xc0\x65\x8a\xa7\xa9\x92\x09\xc2\x43\x50\xcd\x9d\x98\xe2\x87\x6f\xbf\xed\x28\x0a\xa8\x42\x13\x0c\x2d\xc7\xa9\x96\xb3\x20\x2e\x00\x2d\xd9\x4b\x1d\x80\xaa\x9e\x24\xd2\xcd\xaa\x3d\xc0\xd9\xa5\x6e\xfb\x84\x5b\x37\xb0\x9b\x36\x9b\x28\x08\x25\xfa\xbe\x1b\xa2\x3b\x9c\xbf\x2b\x97\xa7\xfa\x26\xa4\x24\x26\x64\xbe\x16\x17\x2b\x08\x6a\x04\x9e\x5c\x5f\xed\xff\xd5\xeb\xd9\x5b\x46\xd8\x48\x99\x14\xe1\x1b\x47\xa2\x77\xd5\x16\x4e\xcd\xfb\xcc\xdc\xee\x88\xbb\xc5\x43\x4a\x0e\x5a\x98\x85\xbd\xbd\x51\xdf\xab\x47\xe3\xfc\xc8\x91\xc3\x80\x26\xb3\xe9\x40\x24\xc6\x77\x69\x53\x01\x64\x22\x0e\x5c\x1f\x62\xc2\x80\xaa\x05\xd2\xf1\x15\xe3\x18\xbd\x66\x20\x88\x54\xc6\x05\x94\xe1\x06\x32\x8c\xbb\xa2\xd9\xcc\x90\x3b\x91\x8e\x30\x55\x02\xb8\x1b\xed\x15\x83\x6b\xfc\xcc\x9f\x99\x81\x66\x1a\x38\xaf\x49\xf3\x11\x53\xdf\x1c\x38\x41\xbb\x97\xb4\xe3\x24\xd1\xe7\xa6\x7e\xc3\x74\x7c\xfe\xcc\x8c\x77\x2f\x7f\x0b\x3b\xbc\x41\xee\xdc\xa1\x73\xba\x70\x6a\x7e\x8b\xa9\xa9\x3e\x5d\x63\x37\x10\xb2\x9e\x36\x6a\xf8\xf1\xda\x95\xee\xf5\x1f\xac\x4d\x7b\x45\xe9\xab\x06\x92\x22\x04\x7c\x41\x4b\x0d\xa2\xed\xa4\x63\x47\x80\x01\x0a\x71\x7f\x28\x99\x45\xda\x07\x3c\x38\xcc\x38\x46\xb5\x68\xa2\x2e\x67\x6b\x54\x2a\xd4\x9c\x5d\x7e\x52\xbd\xc1\x56\x79\x91\x05\x26\xf0\xcf\x25\xc7\xa6\xf6\x38\x47\x85\x6a\x90\x86\xcc\x41\x73\x4c\xdc\x47\x57\x2f\x93\x99\x81\xd9\x6e\xb0\x77\xed\x60\x8f\x8b\x9d\xa3\x00\x58\x54\xde\xb8\x23\x7a\xd5\x8e\x99\xca\xd3\x61\x6c\x2a\xee\x3b\xe6\xf2\xd6\x70\x36\x80\x9f\xdf\xb9\x4e\xf6\xde\xd6\x02\x17\xa5\xa9\xb3\x00\xa1\xdd\x26\x2c\x91\x04\xb2\x2d\x11\x4d\x6e\x88\xd5\xd6\x08\xa9\x5c\x36\xa1\xfc\x45\xbb\x9c\x94\x4e\x4c\xdd\x6a\x34\x55\x7d\x8b\x1c\xac\x40\xda\xe1\x27\xb2\x1c\xa6\x5d\x49\xeb\x02\x2f\x17\xca\x78\x29\x4e\xe2\xb2\x3f\xae\x2f\x6b\x44\xe9\x7c\x82\x61\xce\x25\x9c\xee\x7a\x16\xd1\xb9\xae\x6a\x97\x2d\xc0\xe2\x66\xab\xc6\x48\x45\x2a\xf5\x05\x82\x1b\x53\xcf\x00\x9b\xd5\x89\x4b\x60\x50\xcd\xe1\x3a\x9a\xf6\x21\x21\x77\xd2\x96\x5b\x25\xf8\xd6\xad\x98\xd0\x76\x7e\xf5\xec\xd4\xd2\x05\x38\x92\x71\xf5\x12\xba\x9b\xc6\x5b\xda\x08\x53\xc1\x61\x30\xdc\x05\x38\x99\xfa\xf3\x62\x2f\x31\x31\x42\xbd\x23\xf2\xf3\x18\x1c\x4c\x1b\x51\xa7\x8a\x72\x83\x31\x00\xc4\x5f\x0e\xb0\x77\x1b\x22\x37\x1a\x8f\x13\x43\xa2\x6e\xc6\xf1\xb8\xad\xac\x51\x5a\x23\x2e\x97\xbd\x77\x74\xfc\x6b\xc0\x76\xc0\x32\x0f\xff\x36\x88\x5e\x18\x4c\x1a\x7d\x13\x72\x9b\xe2\x06\xd0\x2d\x33\xf1\x70\x6e\x05\xb0\xf3\xbc\x63\x0c\xc0\xcc\x18\xe3\x61\xf2\x38\xa9\xa3\x4d\x1f\xf2\xb1\x76\x2b\x65\x5e\xc0\x8f\x36\x1f\x5c\x99\x78\x94\x1d\x61\x87\x2e\x4f\x48\x29\x11\xb2\x45\xa1\xf8\xb2\x51\x76\xf3\x46\x71\x3e\x93\x10\xf8\xa2\xd3\xa3\x87\x7f\xf8\xff\xb1\xf7\xf5\xc1\x95\x5c\xd5\x9d\xdb\x4f\x23\x8d\xe6\x7a\xc6\xe0\xde\x90\x4a\x91\x40\xdd\x6a\xef\xa2\xd1\x44\x7a\x1a\xcf\x8c\xc7\xb6\x6c\x6c\x6b\xa4\xb1\x2d\x66\x46\x23\x24\x8d\xbd\xc4\x18\x4f\xeb\xbd\xfb\xa4\xf6\xf4\xeb\x7e\x74\xf7\x93\xe6\x41\xd8\x60\x42\x08\x8b\x17\x08\xa4\x80\x20\x20\xc9\x06\x27\x04\x87\x85\xad\x5a\xc3\x26\xb5\x71\x55\xc2\x02\x09\x64\x97\x65\x59\x96\x72\x6d\xd8\xc4\x7c\x25\x45\xb1\x54\xa5\x76\x59\x2a\xe5\x54\x92\xad\x7b\xce\xb9\x5f\xfd\x3e\xa4\x19\x79\xec\xa4\x4a\xf3\xcf\xe8\x75\xdf\xbe\x7d\xfb\x7e\x9c\x7b\xee\xf9\xf8\xfd\x86\x82\xfb\x7a\xdd\xd0\xb8\x2f\x65\xf6\xf4\x90\x97\x8b\x6b\x65\x64\xcb\x1b\xa5\xb4\x9a\x6c\xcb\x1b\xc1\x89\xb2\xe5\x8d\x26\x69\x5d\x74\xa1\x64\x7d\xbb\xc2\x3e\xe0\x31\x5d\xde\x7f\x87\x17\xbc\x69\x86\x7e\x58\x6e\xc8\xb2\x48\xa1\x54\x1a\x3b\xed\xe7\xdc\x85\xe5\x15\x25\x91\xc9\xe6\x46\xba\x91\x1d\x5f\x49\xa0\xb3\x45\x3b\x23\x85\xe6\x5e\x51\x2c\x02\xc1\xa8\x6c\xda\xe1\x71\x67\xfe\xdc\xc7\x74\xa3\x15\x6c\x2b\x38\xb5\xb4\x51\x92\x9a\x61\x52\x3f\x75\x3a\x51\x29\x2d\xe0\x4d\x8c\xfa\xc1\xcf\xd9\x74\xdf\x31\x1f\x34\x48\xe8\x38\xbe\xb9\x9b\x72\xd8\x6a\x87\xbd\x37\x59\x8d\xa9\xb2\x4f\x57\xd8\xc9\x12\x9c\x9e\x89\x6d\x56\x49\x3b\x0b\x69\xa2\x1c\xd4\x33\x05\x5a\x07\x44\xee\x3f\xeb\x05\x6f\xec\x79\x47\xaa\x70\x88\xfe\x4f\x39\x92\xa6\x4a\xf9\x66\x55\xca\x78\xb8\x55\x22\x80\x15\x15\xe1\xa6\x9f\x58\x81\xe2\x70\x44\x6e\x84\x25\x14\xd4\x94\xdd\x4a\xca\xf2\xd1\xe0\x46\x3b\x81\x43\x9f\x5d\x75\x38\x38\xd4\x5c\x62\xe4\xdb\x10\xd9\xaa\xff\xd3\xc1\xcb\xef\x17\xd9\xaa\x85\x67\x84\xe6\xb0\xfb\x56\x56\x16\xb9\x2c\xe1\x60\x3f\x8f\xb0\x3b\x77\x97\x72\xeb\xff\xdd\x70\xf0\x41\x6f\x9b\x42\x2f\x5c\x32\xae\xd3\xbd\xff\x7d\x1f\xfb\x77\x15\x76\x40\x3f\xe2\xff\x46\x85\xdd\x71\x65\xf9\xc7\x6e\x0a\x6f\xf0\x4d\xcf\xbc\x5f\x4a\x46\xfa\xae\x56\x1a\x47\xb5\x8e\x4e\xf0\x95\x97\xe6\x20\xfb\xbd\x5f\xbe\xa4\xce\x2c\x00\x88\x82\xd8\x8e\x49\xa8\x53\x30\x8c\x9d\x20\xdf\x4a\xeb\xf9\x84\x3a\x8f\x1c\x3f\x7a\x94\x53\x4c\x54\x5e\x84\xab\x3a\xa5\x92\x6f\x46\x49\x3d\xdd\x44\xb7\x33\x29\x51\xd1\xda\xba\x40\x93\x5c\xda\x6c\x8a\xa4\x6e\x88\x11\xf4\x89\xfe\xf8\xd1\xa3\x39\x8a\x45\x4c\x95\x65\x1f\xa9\xb0\xfd\xd4\xe3\xfe\x7b\x76\xdb\x61\x5f\xf1\xd4\xe0\x0d\xee\xae\x0b\xad\x9d\x74\x96\xfa\x24\x39\x81\xa6\x19\xe7\x47\x0c\xce\x89\x03\x9e\x7b\x02\x9d\x24\x2d\x91\xf1\x93\xaa\xb3\x72\x28\x5f\x4f\xdb\xab\x44\xaa\x53\x8a\x49\x2f\x15\x5e\x48\x4b\xbd\x4b\x1d\x54\x65\x5f\x38\xe4\x9c\xdf\x94\x2d\x74\x7e\x79\x76\x79\xde\x21\x8b\xfb\xc8\xa1\xe0\xbd\x0e\x59\x5c\xc2\xa1\x90\x3c\xb7\x5e\xaa\xd2\xdf\x2a\x95\xd1\xa6\x27\x56\x69\x9b\x21\x30\x3f\x12\x75\x14\x64\x68\x96\x9f\x1a\x48\x18\x27\x97\x4b\x4f\xc6\xb8\x83\xb8\xee\x16\xd3\xac\x08\xe3\x2d\x6f\x28\x7a\x7d\xb2\xe5\x0d\xc5\xed\xc4\x59\x3d\x7f\x76\x1d\x7b\xdc\x63\x4e\x59\xff\x97\xbd\xe0\x17\xbc\x08\x9a\x80\x61\x19\x1c\x6f\xa0\xd2\x87\x7f\x43\x30\x0f\xc6\xe2\xcb\x2f\x5e\x94\x2a\x46\xd4\x7a\x38\xac\xd7\xb3\x69\x68\x2c\x69\x7f\xf8\x77\xce\x53\xc3\xc1\xa5\x46\xfc\x70\xd1\x69\x91\x49\x65\x65\x76\x91\x10\x81\x6f\x3d\x79\x14\x3e\xe9\xf8\xb1\x93\x47\xdd\x6d\xed\x7e\x76\x43\x6d\x3d\x6c\x49\x71\xab\x79\x02\xfd\x99\xe0\xf8\xe6\x3a\xc6\xd4\xa8\x5e\xc2\x86\xeb\x22\x7c\xf6\xbe\x99\xc5\x12\xe5\x9b\xc3\x8a\xf5\xe9\x8a\xa6\xa1\x7f\xa2\x12\x7c\xb8\x52\xa6\xa1\x77\xf7\x6e\xd8\xac\x3a\x69\x9b\x6f\x86\xa8\x2f\x11\x45\xfd\x4a\xd4\x9a\xe6\xa7\x93\x1c\x55\x31\xda\x68\xcb\x6c\xf5\x51\x7e\x05\x84\xf5\x84\x7c\xd3\x8f\xb6\x5e\xaa\xca\x51\x2d\x02\xdb\x49\x42\xd4\xa7\x98\xe9\x8b\x0f\xc8\x01\xb0\x74\xc0\x9e\x46\x76\xf7\x4c\x51\x4f\x6b\xf9\x54\x4d\x4e\xc0\x56\x91\x4f\xd1\xae\xae\x78\xc6\x6e\x8c\xf2\x5a\x1e\xd9\xe3\xf1\x35\x8f\x1d\x02\x81\x11\x16\x69\x06\xca\xc6\x67\xbd\xe0\x49\x0f\x33\x50\x69\x14\xe6\xd5\x7d\x80\xd0\x86\xc5\xef\x3c\xe2\xb0\xb0\xa3\xe8\x83\xf7\xcc\xab\x8d\x94\xe7\x51\xb3\x1d\x17\x61\x22\xd2\x76\x1e\x77\x26\x78\x22\x36\xa9\x6e\xbd\xd9\xf2\x3b\x14\x7e\x28\xcc\xcc\x3b\xa7\xef\xa0\xb1\x92\x5a\xd3\x9d\x06\xd4\x0a\x53\x3c\x6c\x58\xc1\x04\x37\x1f\x67\x9a\x9d\x60\x72\x8d\xf8\x93\x2a\x97\xe1\x27\x9c\x85\x70\xb6\x9d\x28\xb8\x1f\x27\x5b\xe0\x92\x45\x15\xf7\x70\xf0\xea\x5d\xd2\xbf\x75\xb1\xcb\xb9\xdc\xfc\x3f\x67\x13\x26\x66\x57\xcb\x97\x78\x1b\x2c\x8c\x65\x43\x7e\x88\x1f\x4a\x7d\x09\xd9\xba\x7a\xf4\xdc\xe5\xc3\x96\xd8\x8b\xd4\x52\x5c\x16\x40\x0e\xee\xdf\x15\xdc\xd4\x7b\x21\x52\x81\x6d\x97\xe1\x51\x26\x25\x94\x3f\x1e\xfc\x14\x75\x35\x3e\xfe\xea\x76\x18\xe3\xec\x80\x19\x64\x8f\x54\xc2\xae\x77\x27\x8b\xff\xda\xe0\xbc\x9a\x77\x6a\x6e\xc0\x2c\x83\x05\x09\xb9\x24\x61\xa2\x3e\x33\x0b\x93\x1c\x31\xb8\xed\xde\x1e\x23\xe1\x34\xc6\x0f\x17\xb5\xd6\x78\x19\x02\x7d\x3f\x4e\xb1\xdc\xff\x98\x17\xbc\xa3\x97\x88\xe4\x67\xa3\x9c\x32\x5a\x5a\xcf\xab\x9c\xec\x4b\x96\xf8\x7f\x46\x59\xd0\x63\x4a\x2c\xa6\xf5\x15\x4a\x35\x92\x4d\xf6\xff\x64\x34\x38\x52\xba\x86\x3e\x02\x75\xf8\xb4\x6e\xe6\xd5\x2d\x6f\x38\x2a\x44\xd3\x45\x21\xfa\xe4\xfe\xbd\xa0\x83\xdd\x06\x1d\x3c\xc4\xb0\x63\xfd\x95\xe0\x25\x67\xa9\xe7\x5b\xa9\x49\x0b\xcb\xed\x91\x3e\xca\xaa\x3b\x70\x44\x5b\x03\xb7\x17\xd3\xb0\x8b\x98\x86\xff\x6a\xc7\x34\x7c\xf6\x4a\x50\xa4\x2d\xe0\xe4\x28\xc7\x88\x86\xb7\x98\x88\x06\x58\x60\xcf\x5b\x34\x83\xf5\x71\xcf\x7a\x0f\x6c\xef\x07\x3f\xe1\x1f\x9b\xec\xcb\xa9\xac\xbc\xe2\x25\xc1\xc1\xd8\xbb\x6f\x70\xcc\x38\xfd\xe9\x46\x80\xb3\xc3\x7f\xe6\xc5\xc1\x37\x3c\x97\xc6\xc3\xe5\xac\x6b\xaf\x12\x6a\x8b\x3d\x91\x14\x71\xb8\x36\xa7\x5a\x71\x14\xf7\x40\x2a\x3f\x5a\x31\x95\x9f\xab\x80\xcd\x58\x99\xfe\x94\x23\xc3\x7d\x2d\xa5\xfb\x4f\x50\x78\x16\xaa\x69\xe8\xe7\x55\xb6\x41\x65\x22\x7d\x24\x05\xef\x52\x91\xf2\x56\x96\xd6\xdb\xb4\xb9\x03\xb9\x2c\x35\x56\x37\xb4\xba\xe5\x5d\x47\xe4\xeb\x2b\x00\x15\x7d\x40\xdf\x72\x24\xe8\x0f\x0e\xb1\x75\x6b\x92\xbd\x76\xb7\x71\x33\x3f\x39\x20\x6c\x86\x7d\x7c\x88\x0d\xc3\x5e\xe2\xff\xda\x50\xf0\xc9\x0a\x6e\x2b\x6e\xdc\xb5\x92\xfd\x64\xd5\xa3\xad\x07\x71\x44\xa0\x67\x20\x86\x5e\x2f\x6c\xc5\x0f\x9e\xc7\x30\x06\xa7\x31\xc0\x3e\x2b\xfa\x33\xb8\x80\xc3\x8d\x98\x5f\x72\x05\xf4\x1b\x15\x8e\x09\x0d\x75\xe9\x4c\x90\x0f\x42\xbb\xf5\xe0\x31\xaa\x22\xd4\xfb\xa7\xba\x4b\xc7\xe8\x24\xa2\x20\x3d\x92\xfb\x4e\xdd\x41\xa8\x78\x67\x02\x6a\x6d\x8e\x84\x33\x20\xc1\xc0\x4c\x04\x7e\x6e\x04\xf6\x49\x1b\xfc\xa6\xa3\x47\xe9\xb5\x3b\x07\x36\x1a\x4c\xb5\xb3\x43\xb3\xe8\x5f\x55\x98\x3d\x81\xfc\x67\x2a\xc1\x57\x2b\xd6\x85\x72\xbc\x3c\x9d\x5b\x14\xe1\x7f\x2d\xcc\xb2\xc8\x4a\xea\x75\xe6\x3c\xd2\xef\x50\x51\xc5\x0b\xab\x46\x51\xcf\xf6\xc2\x86\x49\x75\x78\x4b\xa2\x9c\x47\xcd\x66\xbb\x00\x6b\x59\xd8\x28\x44\x86\xaa\x36\x38\x23\x56\x9c\xc0\x0f\xd5\x1e\xc4\xa9\x92\xe3\x59\xd3\xee\x48\x7d\x30\x9a\xe6\x47\xf8\xfc\xe2\xc6\x89\x69\x5e\x3a\x55\x2f\x6e\x9c\xe0\xc4\x65\x5f\xc5\x32\x27\x7b\x94\x39\x69\x97\xb9\xe7\xd5\x73\x0b\x6e\x19\x7e\x4f\x5b\x2a\x52\x46\xad\x9c\x4b\x9b\x61\x94\x74\x6b\x97\x7b\xaa\xcc\x2e\x55\x99\xef\x78\xcc\x88\x39\xff\xeb\x5e\xf0\x88\x11\xdc\x8e\x66\x49\x12\xc1\xba\xdb\x43\x8e\x6c\xbf\x32\x8f\x5a\xf2\xd6\x5e\x9e\xb7\xb0\x9b\xd9\xf1\xab\x58\x9e\x3b\x5c\x9a\x7b\x2a\xd5\x55\xab\x54\xcf\x7a\xeb\xdb\x2b\x20\xa7\xfd\xd9\xc9\x6e\xca\x47\xad\x85\x98\xf1\x2b\x51\x46\x3a\x32\x8e\xb1\xc7\x86\xd9\x2b\xb6\xe1\x3e\x57\xc0\x44\xcf\xec\x0b\x9e\xd4\xc0\x44\x4d\x2b\x34\x2d\xcd\xa2\xb5\x28\x81\x03\x31\xf1\xec\x41\x17\x03\x5e\xa6\x4e\x0f\xd2\x86\x1d\xcd\x27\xee\x9c\x79\xb5\x81\x67\x45\xef\x69\x88\x11\x0e\xa0\xbc\x69\xc3\xc4\x34\x49\x51\xa1\x5f\x78\xbb\xac\xb5\x9d\x8b\x6c\x02\x3f\x1c\x5c\x7a\x4a\xb1\x09\x11\x18\x46\xc1\x10\x39\x2a\xc5\xa3\x15\x76\x8a\xed\x93\x4f\xfa\xd3\xec\xd6\xbe\xcb\xa0\x57\x7f\x5c\xc8\x45\x46\xdd\xc0\xe6\xd8\x30\xbc\xd7\xbf\x7d\x40\x76\x57\xaf\x4a\x00\x6d\x46\xd5\xf2\x32\x5a\x2a\x2f\x09\x46\x97\x28\x22\xca\xb5\xf0\x5d\x9f\x3b\x50\x37\xfe\x1c\x3b\x75\x45\x6f\x73\x91\x72\xe8\xb5\xcf\x7a\xef\xf2\xd8\x3f\x75\xe6\x59\x3b\x01\x50\x87\x4d\xbf\x3d\x09\x33\x28\x8b\x9a\xd8\xcf\xd3\x30\x7b\x18\x27\xbf\xc3\x64\x91\x4e\x5a\xf7\xc5\xa9\xce\x34\xe3\x5c\x4f\x3e\xf8\x38\xb8\xe0\xb6\x7b\xba\x04\xd9\x03\x45\xe4\x18\x4c\x03\x0c\x0f\x63\x5f\xff\x71\x56\xb5\x3e\x05\x4d\xe5\x74\x58\x9b\x8b\xf2\xac\x0d\x09\xa9\xa7\xda\xf5\x35\xa1\x30\x77\x3e\xfa\xe3\xc1\x3b\xbc\xbe\xb7\x6d\x7d\xb9\x1b\xf6\xb1\x70\x28\x30\x42\xde\xa3\x1a\x8d\x3b\x27\x65\x4d\x91\x85\x11\x32\xde\x23\xf6\xab\x83\xdc\x80\xf3\x77\xcb\xf3\xeb\xba\x8a\x7c\x06\x03\xb4\xb6\xbc\xeb\x69\x43\xbf\x4f\x84\x71\xb1\xde\xd9\xf2\xae\x27\x60\x13\x7d\xe1\xa0\xb8\xdc\x02\xcd\x7a\x31\xad\xbb\xda\xef\x1f\xfe\x18\x7b\x90\x39\xb7\xfd\x33\xca\x0a\x77\xb2\x27\xc2\x4c\x8d\x4c\xe8\x1a\xac\x44\xb7\x88\xaf\xc2\x57\x39\x36\xba\x6f\x79\x3d\xa1\x85\x08\xb6\xe4\xe4\x89\xe0\xd3\x76\x68\x73\x4f\x90\x21\x08\x9f\x00\x11\xaa\x99\xe5\x17\xe7\x4e\x51\xdf\x56\xf9\x5c\x57\x8f\xc0\xee\x8c\x36\x1d\xc5\x48\x62\x8d\x0e\xa2\x4f\x45\x75\xf4\x09\x44\x0d\xde\xdd\x3c\x2e\x5e\xdf\x0e\x63\xd0\x01\x16\xe7\x4e\x8d\xe9\x6d\xc2\xb4\xce\x35\x44\xfe\x70\xd4\x81\x2d\xf9\xee\x68\xf0\xc3\x11\x0d\x17\x92\x9b\xf8\x3a\x73\xa9\x91\x66\xb2\x6a\xd4\xd5\xac\x1e\xb4\x82\x3b\x72\x41\x1e\x5b\xf3\x81\xea\xfb\x0c\xc3\x66\x59\xd7\xcb\x04\xe5\x7c\x53\x36\xac\xb2\xbb\x2a\x76\x17\x50\x1e\x0f\x2b\xce\x11\x80\x70\x90\x37\x60\x54\xc9\x13\x5c\xef\x62\x0f\x18\x9f\xe6\x93\x7c\xb9\x93\xd4\xee\x09\xa3\x58\xea\x8a\xa5\x30\x14\x91\xe0\x9c\x00\x88\x4a\x02\xea\x42\xbc\xff\x30\x4f\xc6\x0a\xae\x92\xb9\x6b\x69\xb3\xd5\x2e\x04\xe3\xce\x3f\xd7\x61\xa4\xa2\x0e\xad\x79\x4e\x62\x1b\x92\x77\xe5\x51\xc4\xdc\x91\xdf\x5b\xaa\x2d\xb4\xa6\x40\x31\x80\x84\x46\x19\xa8\x81\x85\xa6\xca\x26\xf9\x7c\x02\x88\xfa\x35\xb9\x9f\xcb\x65\x80\x5f\x59\x9a\xfb\xb2\x7f\x95\x61\x11\xc0\xf1\x56\x05\x78\x18\x75\xc9\x52\x6b\xf0\x9f\x0e\x44\xa5\x4d\xaa\xa7\x24\x58\xd8\xee\xcb\x76\xf9\x7d\xcb\xdd\x5f\x47\x5b\x21\xb2\x51\x10\x52\x53\xb2\xa3\xd6\xf6\x68\xda\x4a\xcf\xd7\x23\xd5\x8f\x6a\x6c\xd7\x30\xf7\xa8\xa7\xd4\x09\x8a\x60\xc7\x60\x8d\x75\x2f\xf7\x56\x96\xb6\x44\x56\x74\x1c\x0d\xf4\x6e\x76\x67\x7f\x07\xeb\x80\x93\xbc\x03\xf3\xf3\xd2\x6e\x55\xb4\x19\xb6\x26\x2f\x89\x4e\x2e\xd5\xd1\x49\x4e\x30\x3f\xbc\xaf\xd2\x3a\xe2\xef\x6b\x86\x2d\x76\x4d\x30\x83\x4e\xb3\x92\xe4\xf7\x8f\x2b\xd1\xfd\xf2\x6e\x80\xe4\x75\x2c\x03\x23\xed\x48\xaf\x73\xac\xb4\x5f\xf8\xb7\xab\x6a\x5e\xd1\x8c\x12\xd0\xf6\x15\x52\xd6\x0e\xaa\x7b\xe7\x7e\x76\x88\x06\x89\x36\x94\xbf\x19\x09\x3e\x35\x32\x67\x5f\x1a\x44\x78\x8d\x49\x78\x00\x05\x21\x36\x22\xcc\x17\xdc\x0c\x73\xae\x53\xff\xd5\x4c\x30\x1c\xfe\xa6\xa0\x0d\x8d\x8a\x01\x3e\x19\x84\xc1\xaf\x87\x86\xb9\x1b\xb0\xc7\xca\x10\x76\x3d\x66\xb9\x1d\xd6\xc8\x67\xc0\x22\xac\xa6\xb5\x3a\x2c\x35\xc3\x96\x39\x18\x00\x01\x98\x06\x66\xb0\x5a\x67\x5a\x0e\xe7\x07\xd5\x56\xa5\xab\x2a\x04\x02\xe7\x71\xc0\x48\xc8\x79\x2e\xdb\xba\xda\x81\x0d\xcf\x66\x95\xce\xf9\x7a\xb8\x81\x71\x1f\x22\x51\x21\x75\x0d\x60\x24\x89\x05\xd4\x7e\x58\xca\x60\x30\x0c\x84\x50\x75\xda\x2e\x08\x28\xe1\x92\xe8\x28\xf9\x2e\xdb\xdf\x23\x0a\x53\xbe\x5c\xad\x59\x27\x44\xe0\x2a\x3f\x51\x63\x62\xea\xd6\x11\x37\x50\x5a\xab\xb5\x71\xab\x08\xf5\x17\x03\x50\x1c\x1a\x9f\x22\x9b\x68\xa3\x99\x6e\xd8\xd1\xe8\x70\x90\x0d\xdb\x45\x2a\x27\x0f\x3a\x6a\x64\x3f\x0d\x1c\x46\xea\x10\xa0\xc3\x90\x9f\x02\xed\x82\xe4\x0f\x84\xc3\x5d\x4b\x45\xce\xf3\x66\x9a\x16\xeb\x66\x7c\x4d\x90\x14\xe2\x54\xaa\x2d\x15\x30\x17\x55\xb4\x0d\x54\x76\x16\x48\x58\xcc\x12\x11\xf2\xd8\x26\x72\xbb\xb3\xf1\x50\x89\xb6\x30\xd9\x69\xab\xb1\x68\x62\x34\x25\x7c\xbf\xea\x9f\xbc\xfa\xc4\x60\x0b\xd7\x36\x64\x75\x36\xd4\xee\x45\xd6\x43\x69\x24\x6c\xc7\xe3\xc7\x82\x9b\x17\xec\x2d\xce\x11\xbf\x1a\xe7\xcf\x18\x8c\x48\x6e\xbb\xea\xcf\xd6\x01\x27\x11\xcb\x84\xa6\x11\x14\xd8\xf2\xfc\x1c\x04\xdf\x81\xcf\xeb\x07\xa3\xc1\x71\xe7\x0a\x9e\xdc\x89\x08\x81\x2c\x36\xba\x80\xb2\x0d\xf7\x76\x7e\xfd\xee\x9e\xf3\x6b\xd7\x16\xa3\x58\x39\xbf\x6a\xc1\xcb\xe1\x0f\xcd\x56\x42\x96\x22\x3d\x16\x3b\x0f\x48\xed\x3b\x03\xf6\x0c\x37\xbb\xf0\x85\x7d\xc9\xf6\x85\x3d\xb5\x4b\x5f\xd8\xbf\xec\xed\x0a\x7b\xfe\x30\x09\x1a\xdb\x5b\xa1\x66\xfd\x99\x49\x32\x2c\x39\x12\xc3\x4d\x04\x2d\xd9\xa6\xd4\xdc\x23\xcb\x14\xfb\xe6\x01\xc7\x06\xa5\x1c\xb4\xb3\x0a\x36\x0e\x4f\xe0\x20\x9a\x3e\x73\x20\x78\xd4\x5b\x36\x47\x76\xdc\x87\xca\xc7\x36\xbc\x44\x4f\x63\x22\x9b\x5e\x2a\x6e\xa5\x5a\x78\xf1\x39\x9d\x53\x30\x8d\x56\x7c\xb9\x75\x22\xd0\xa7\xca\x35\x88\x12\xbe\x71\x53\xf5\xa6\xdb\x7e\xba\xa7\xa4\x7b\x6a\x4f\xd2\x3d\x97\x92\x8e\x9f\xdd\x66\xc4\x6c\x59\x77\x82\x1d\x63\x47\xb7\xf5\xf8\x97\x6a\xda\x93\x74\x7b\x5e\x7f\xdb\xeb\xff\xe0\xf6\xe2\xee\x56\xff\xa4\x16\x77\xdd\xd2\xa9\x94\xfd\x6e\x47\x04\xb0\xef\x8c\xf4\x64\x53\x90\xca\xf0\xc2\xf2\x2c\x04\x8c\xfb\x7f\x30\x12\x3c\x6c\x5f\x70\x04\xc6\xdc\xc2\x32\x6f\x85\x59\xd8\x14\x05\xe5\x17\x86\x0a\xa5\xcd\xe6\xa7\x45\x80\x3e\xb2\x82\x29\x65\x7c\x6e\x61\x79\x11\x4d\xa9\x8e\xc4\xfa\xca\x30\xfb\x9c\xc7\xae\x03\x5c\x78\x9c\xae\xfe\x93\x5e\xf0\x01\x2b\xb3\x46\xbe\x14\x93\x0c\xf1\x0c\x31\xbf\x68\x1c\xa2\xe4\xec\xd4\x60\x6e\xad\x96\xe6\xc0\xc3\x0c\xbb\x1c\x4f\x2c\x54\x75\xff\x36\xf1\xb9\x36\x44\x7a\x03\xcb\x89\xf5\x40\xe9\x5c\x31\x28\x98\xeb\xd3\x15\xb6\x9f\xc0\x0a\xfd\x8f\x57\x82\x6f\x95\x3e\x41\xae\xd6\x18\x54\x55\x63\xae\xb2\x9a\x0e\x67\x75\x72\x8d\xeb\xa6\x2b\xec\xc3\x1d\x35\x5b\x1d\x23\xca\x4d\xe6\x4b\xf2\xcd\x6d\x94\xe4\xaa\x42\x08\xbe\x88\x12\x7e\x9e\x2e\xc0\x43\xe9\x86\xc8\xb2\x08\xb2\x51\x90\x8a\x55\xea\xf5\xad\x96\x08\x35\xac\x1a\xb4\xca\x1e\xc9\x9d\xba\xf2\x7a\xcd\x35\x7c\x37\xfb\xb2\xc7\x46\x73\x21\x57\x89\xc8\xfd\x3f\xf4\x82\xc7\x4b\x1d\x87\xf7\x78\x1d\x7c\xc1\xb8\xb7\xae\xa7\x79\x01\x54\x02\x3c\x4e\xd3\x4b\xed\xd6\x4e\xa6\x01\x55\x83\x09\xc3\x3b\xea\x50\xe7\x89\x2b\x98\x08\x1f\x3d\xd0\x13\xf8\x68\x31\xad\x83\xfa\xf0\xd6\x03\xc1\x4b\xe9\xef\xae\x28\xbe\x3e\x07\x98\xbf\xdf\xdb\xd6\x77\xbd\xad\xff\x5b\x4f\xed\xeb\x1f\xf5\x82\xd8\x8a\xdf\xbb\xe6\xed\xb1\xa7\xca\x61\xf6\x0a\xf6\xcf\x76\xb2\x4a\xf6\x14\x83\x3d\xc5\xc0\x56\x0c\xae\x1e\x16\x87\x64\x4d\x19\x16\xe7\xa9\x03\xec\x81\xab\xa5\xe4\x2a\xb1\x71\xcd\xe9\xbe\x25\x7f\xe8\x37\x47\x83\xa5\xc1\x45\x4a\x89\x98\xda\x87\x29\x7f\xf4\x7b\xd2\x11\x89\x7f\xb7\x9f\x7d\x63\x88\x5d\x2f\x8f\x71\xa2\x4e\x52\x30\xf7\xbf\x38\x14\x7c\x62\xc8\xbd\x06\x83\x86\xcc\x84\x1b\xea\x92\xd4\xe8\x5d\x6a\x2f\xa2\xb1\x15\x99\x00\x43\x9f\xe6\x52\xaa\x57\xf9\x4a\x16\xd6\x2e\xd1\xfa\xca\x85\xa9\x44\xa1\x90\xf3\x66\xb4\x46\xfe\x40\x48\x18\x84\xa4\x2a\x68\x82\x29\x4b\x10\xa4\xe4\x87\x53\xa1\x59\x2a\x30\x2b\x4f\x9d\x5a\x2c\x43\x64\x2d\x4c\xb8\xfc\xfc\x7c\xdd\x29\x01\xdc\x5c\xe8\xb9\xa4\x57\xf0\xc3\x22\xc9\xdb\x20\x19\x92\x94\xa7\xb1\x8a\x2a\x44\xe7\x48\x2c\x1a\x10\x01\x48\x87\xde\x71\xed\x6a\x49\x68\x3f\x53\xd9\xee\xda\x52\xa9\x5b\x4e\x32\x81\x50\x24\xaa\x5c\x77\xab\x94\x1d\xb4\xf6\x1d\xa3\xeb\x45\x20\xc7\x50\xcf\x5f\xe4\x9b\xeb\x11\xa6\x7b\x75\x10\x15\x43\x1b\xc5\x63\x84\xc8\xe8\xbb\x8d\xfe\xd0\x63\x87\xc2\x5a\x4d\xb4\x0a\x51\x07\xd6\x21\xff\x5b\x1e\xab\xf7\x5b\xc9\xcf\xd1\x04\x86\x17\x05\x6f\x70\xde\x4b\x81\x20\xa4\x49\x1a\x73\xa7\xe6\x5e\x45\xa8\x60\x93\x90\x9e\x41\xfe\xbc\x8a\x7d\x31\xfc\x28\xab\x76\x5a\x3d\x38\xd1\x4c\xad\x72\x74\x64\xc7\xb1\xdf\xac\x38\x4e\xe2\xf7\x57\x82\x05\xcb\xb2\xa0\x8d\xc2\xb8\x62\x10\x9f\x28\x2b\xa2\x5a\x3b\x0e\x33\x1e\x42\x22\x66\xde\x8b\x6e\xce\x5e\x46\xa6\xcb\x63\xf6\x08\x5b\xbf\xc6\x5d\x7a\x6d\x3c\x65\xec\xbb\x07\xd9\xb1\x1d\x09\x72\x14\x38\x73\xa2\x08\xa3\x38\xf7\x3f\x79\x30\xf8\x5e\xc5\xb9\xe4\x30\x4f\x5a\x2e\x6f\x72\x17\x46\x6a\xc8\xcf\xcd\xbc\x46\x31\x6b\x2a\xb4\x34\x3c\x90\x60\x94\xf1\x86\x54\x9c\xad\xc7\xbb\x3d\x56\x21\xb1\x78\xe6\x84\x50\xb1\x64\x3b\xdb\x61\xc8\x1c\xeb\x82\x85\x54\x21\x27\x9c\xc9\x7f\xb6\x38\x3e\xab\x7c\x16\x76\x67\x42\xcd\x21\xfc\x05\xca\xcb\xed\xc6\xea\xa0\x9c\x4e\x8c\x8d\xa6\x38\x54\x08\x13\xd6\xb5\xa3\x64\x20\x1d\x30\xcc\x73\x9d\x56\x17\x26\x1d\x53\x4a\xcd\x66\x15\x14\x9c\x40\xa4\x04\xc4\x3d\xb5\x93\xba\xc8\xd4\x4b\xdc\xa3\xde\xbf\x3f\xc0\x7e\xd3\x63\x43\xed\xa8\xee\x7f\xc4\x0b\xde\xed\x5d\x98\x9f\x33\xd9\xd5\x0a\x68\xe3\xb0\x72\x1b\x65\x84\x0a\x4a\x70\x37\x5a\xa7\x71\x40\x20\x14\x20\x4f\x7d\xbc\x6b\x37\xee\x9d\x42\xd7\xce\x45\x36\xb9\xd6\x8e\xea\x62\xca\x80\x46\xe7\x37\xb6\x23\x57\x81\x78\xc6\x63\x23\x40\x67\x9e\xfb\xff\xc3\x0b\x7e\xde\x93\xc3\x35\x1b\x62\x96\x92\x5c\x39\x26\x53\x1d\xbc\xe2\x75\x9a\x49\x65\x0a\x0b\x00\xc1\x81\x31\x55\x63\x1d\x46\x71\x3b\x13\x00\x06\x06\x5b\x92\x7d\x17\x65\xaa\x9a\x4a\x58\xa7\xa8\x23\xad\xba\x6b\x6a\x3a\xc5\xee\x66\x77\x5e\x85\x4e\x83\x6f\x83\x0f\x61\xab\x2a\x6a\xec\x35\xc1\x59\xe0\xed\x42\xfe\x3a\x3d\xc4\xa5\x91\xe9\xf9\x6d\x14\x55\x60\x7f\x84\x13\xa7\xfb\x4e\xa5\xc3\xbe\xb5\x12\xfc\x08\x3a\x11\xb8\xe0\x76\xff\x12\x7e\x3e\x41\xf7\x1c\x25\x67\xaa\xce\x43\xf1\x6a\x14\x59\x52\x56\x81\x71\x98\x5e\x21\x35\xe9\x17\x4a\x2f\xfd\x80\x47\x5c\x7c\xef\xf2\x82\x37\x43\x7f\x20\x58\xfb\x6e\xfb\xa3\xef\xaa\x81\xea\xfb\xad\x18\xa7\x65\x15\x76\x43\x26\x8a\xac\x33\xd3\x28\x44\x46\x94\x53\xfe\xa3\x9a\x90\xec\xfb\xde\x7c\xa3\x44\x0e\x8b\x5e\x5e\xb9\x6f\x61\x69\x05\x9c\x0f\xd1\x98\x6a\x58\x2c\xb7\xa8\xac\x1e\x92\x5d\x97\xe5\xc0\x41\xf4\x4f\xee\x3a\x3a\xad\xd3\x06\x88\x33\x24\x2d\x4d\x78\x18\xc3\x11\xb3\x80\x2d\x57\x56\x3a\x49\x16\x76\x70\xfe\x63\x45\x16\x11\x95\x53\xe7\x7a\xba\x89\x34\xf2\x45\xca\x37\xc3\xa8\xd0\xad\x0c\x95\x4e\xd7\x55\xbd\xeb\xb5\xfc\xc2\xa8\xc3\xbb\x67\x80\x37\x6b\x99\x28\x16\xb3\xf4\x11\x74\x47\xfa\xbf\x3a\x1a\xbc\xb3\x32\x53\x0f\x5b\x98\x15\x83\xa9\x9b\x51\x02\x9c\x0e\x2d\x2c\x26\x35\x42\xc8\x25\xad\x32\xa6\x62\xa3\x40\x78\xbb\x60\x0c\x58\xf5\x58\xce\xe7\xc2\x22\xa4\x6f\x52\x32\xdf\x90\xce\x02\x6f\x69\xb9\x62\x1e\xe6\x98\xd8\x6c\x51\x5f\xc8\xbd\x55\xd9\x6f\xac\x1a\x89\xe0\x5a\x96\x26\xa6\x4c\x0b\xa1\xb0\x20\x7c\x13\x0d\xad\x87\xdc\x14\xf4\x55\x0a\xa3\x84\x04\x32\x61\xfc\xd8\x80\x01\xcd\xb4\x2e\x5c\xe1\xff\xf7\xc3\xec\xf1\x7d\xea\x04\xbe\xb5\x2f\xf8\xc6\x50\x19\x07\x07\x36\xa2\x4b\xa2\x33\x89\x47\xdb\x56\x18\x65\x3d\x9a\xdd\xcd\xce\x48\x59\xb2\xa6\x87\x54\x97\x40\xe7\x5b\xe9\xe1\xe0\x83\x81\xef\xc5\xb0\x91\xc4\x02\x97\xba\x24\x3a\xb0\xf3\xd1\x90\xa8\xcb\xc8\xf3\xc0\xbb\xe7\x3e\xa0\x46\xd7\xb1\x6f\x07\xbc\xd9\xe4\x4f\x83\x15\x09\x77\xd7\x76\xd2\xf5\x34\x29\xd2\x34\xba\xf0\xc2\x10\x03\x30\x9c\x1c\x6c\x58\xc8\x84\xd3\x45\x65\x55\x17\x61\x2f\x4c\xd8\xdf\x9b\x8b\xa2\xdd\xc2\xfa\x31\xd6\xae\x9d\x00\xa3\x3c\x02\x45\x52\x30\x08\x5a\x04\xc3\xb8\x84\xbe\x07\x70\x05\x45\xb4\x21\xb4\x3d\x47\xbe\x53\x45\x28\xca\x97\x8c\x55\xab\x63\x84\x90\x02\xf1\x93\x59\x81\x22\x4a\x5e\x77\x36\xab\x2a\x9b\x60\x47\xb6\x35\x79\x9c\x11\x9d\x95\x54\x36\x81\xbd\x55\x09\xc9\x9f\x0d\x52\x9b\xb0\x94\x86\xbc\xb8\xe2\x6c\x79\xa9\x86\x6f\x44\x62\x73\x8a\xd0\x8f\x26\x65\x3b\x15\x79\xec\x14\xcc\xfd\xa9\x1b\xe1\x3f\x5b\x22\x9e\x67\xa3\xaa\x6f\xfc\xd9\xe0\xe6\x65\x82\xcf\x53\x89\xd4\xa6\xcf\x21\x6b\xb8\xc8\x61\xb8\x54\xef\x91\xfe\xe3\x24\x51\x3f\x79\x90\xbd\xbc\x07\xe5\xee\x52\x1a\x8b\x53\x48\x92\xeb\xbf\xe7\x60\xf0\x1f\x2a\xd6\x05\x33\xcd\x15\x9f\x6e\x09\xad\x53\x0d\x48\x54\x20\x45\x4d\x0d\x02\xf3\x14\x47\x6f\xc8\x65\x5d\x6a\x86\x20\xf5\xb7\xa1\x6f\xcd\xe4\x19\x01\xa1\xd3\xec\x62\x44\xd0\xa5\x0b\x22\xe3\x56\x1d\x83\xad\x1c\xad\x76\x23\x0a\x39\x85\x71\x23\x9d\x90\xa9\xdc\x2e\xb6\xda\xa1\x89\x6b\xdd\x2e\xf0\x2c\x28\xe5\x52\x95\x73\xeb\x8b\x73\x94\x6b\x68\x9f\xb6\x1a\x0b\xf9\xfa\xe1\x86\xe0\xa2\xd1\x90\xba\x71\x44\x48\x69\xa6\x99\x5b\xde\x7e\xd9\x41\x4b\xa2\xe1\xc8\x9d\xff\x36\xba\x67\x3a\xdd\x43\x5b\x7f\xe1\x4c\x91\xcf\x5f\xce\xe8\x33\x1e\x53\x2b\xc0\xff\x9a\xc7\x0e\xf7\x15\xb9\xb6\xe4\x59\x12\x8d\xe0\x63\x1e\xfd\x35\x50\x7c\xe8\x48\xd1\xab\x91\x20\x28\xc1\xad\xd7\x68\xcb\x11\x38\xc5\xea\x5d\xbc\xd6\x20\x48\x11\x54\xcd\x90\x3a\xcb\xad\x61\x54\x91\x23\xfb\x97\x83\x57\x6a\xe9\x83\x3c\xce\x96\xb4\x74\xe8\xc9\x09\x5d\x57\x36\xd1\xa2\x21\xb7\xf7\xa8\x09\x76\x64\x07\x1d\xa6\x73\x56\x1e\xd9\xde\x18\x7b\xaf\x7f\x5a\x1b\x63\xfb\xb2\x3f\x6b\x1b\xad\x25\x01\xcb\x76\xda\x3f\xf6\xd8\xf2\xd5\xda\x64\x30\xac\xea\x55\xcb\xe7\x17\x96\x41\x00\x2d\x66\x69\x2b\x3f\x9f\x9d\x4a\xd3\xd8\x7f\x7d\x90\xf6\xbc\x61\x67\xab\x94\x0a\xe0\x88\xd3\x7e\xa6\x74\x23\x1b\xa1\xa3\xc8\x2c\x0e\x28\x55\x4e\x87\x5d\xb3\xff\x7c\xbd\x6d\xb2\xe9\xc2\x8c\xab\x2e\x8b\xb8\x41\x7d\x0c\xd8\x55\x4b\x42\x6e\xdb\xfe\xfb\xae\x0f\xde\x3e\xdc\xfb\x1e\x17\x49\xbb\x09\x9e\x3c\xb2\x23\x93\x15\xa7\xa6\x22\x13\xcd\xbc\x05\x84\x5e\x39\xc1\x5b\x22\x93\x9b\x93\x21\xff\xb7\x26\xea\xca\xba\x05\xe5\xa7\xfc\x72\xaa\x36\x32\x7a\x00\xce\x70\x2b\x16\x05\x60\x80\x0a\xdc\xa8\x15\x56\x2e\x0c\xc8\x58\x5e\x02\xaf\x93\xea\xf0\x04\xc1\x6c\x76\xd4\x89\x45\x5c\x6e\x89\x2c\x42\x1d\xb6\x8e\xa6\x5b\x0c\x8a\x0d\xe3\x36\x65\xe8\xf6\xf9\x68\x73\xa6\x6a\x53\x9c\xf3\x85\x79\xe8\xff\x7c\x3d\xdd\x9c\x5a\x07\x43\x14\xb6\x19\x4c\x32\x45\xca\x5f\xdf\x8e\x6a\x97\xe2\x0e\x8f\x05\x72\xa4\x4b\x2d\x34\x07\xc8\x54\x38\x3e\xea\x4c\xa4\x08\x2c\xdf\xcd\x28\xc7\x19\x24\xb7\x7e\x7a\xd9\xc2\xf9\x15\x7e\xca\xbc\x50\x73\x7b\x62\xca\x11\xbc\x1d\xa0\x13\x4b\x5f\x5e\x17\x35\x22\x17\x0e\xe9\x8c\x96\x85\x51\x2e\x20\xb2\xbb\x01\x95\xd5\x45\xab\x5d\x74\x26\x88\xb1\x2b\x8e\x1a\x42\x9e\x2b\xa7\x32\xb1\x91\xd6\x08\xa8\x13\x15\xf3\x2c\x13\xb5\x22\x21\x1c\xd9\x9a\xc8\x64\xfb\xa8\x73\x66\x6a\x35\x91\x53\xef\x60\x71\x40\xd5\xb1\x2f\x6b\x23\x2e\x55\xc4\x37\x43\x40\x0b\xaf\x03\x08\x68\xbf\x46\x2b\x18\x41\x1d\xc1\x5c\xdd\xf2\x80\x67\xc2\xcd\xe3\x1b\x65\x67\x2c\x31\x7f\xd7\x2e\xc5\x3c\x7b\x87\x22\xb3\x78\xd4\x63\x73\x83\xc0\xdf\x76\xb2\x7c\x80\xe4\xe2\x36\x00\xde\x44\x29\xd9\x3b\x05\x4d\x45\x99\xa3\x2d\x9b\x26\xa1\xa8\x57\xd9\xc7\x0c\x23\xc5\x87\xbd\x01\x29\x7f\xdd\xcd\xe9\x6e\x0a\xb2\x54\xdc\x6f\x48\xe9\x1b\x51\x1c\xe3\x59\xd6\x35\xa9\x22\xc2\x91\xe3\x21\x72\x57\x76\xd8\xb5\x9e\xab\x7b\x7a\xde\x9e\x9e\xf7\x02\xa6\x4b\xb7\xb6\xd7\x09\xce\xf9\x67\xb4\x4e\x30\x50\x1d\xe8\xbd\x92\xcb\x9a\xc1\x9f\x8d\x30\xde\x33\xc2\x90\xa8\x3d\x17\xd3\xac\xf0\x7f\x6f\x24\xb8\xd3\xb9\xe2\xa2\xb7\xd8\xe8\x21\x78\xf4\x2a\x13\x5e\x57\xb7\xbc\x43\x35\xbb\x02\x47\xf4\xfd\xcf\x61\xf6\x76\x8f\xb9\x05\xfc\x4d\x65\x35\x5c\xb5\x93\x06\xb2\x02\x91\xf1\x5b\x69\x2e\xd4\x7e\xd9\x4a\xeb\x63\xb9\x15\xd1\x45\x81\x3c\xea\x18\x1d\x52\x0a\x26\x3c\x8c\x09\x13\x13\xfc\x28\xbf\x83\x5f\xe6\x77\xf0\x93\x37\xdf\x7c\xfc\xa4\x6b\xab\x9b\x61\x23\xeb\x69\x5e\xcc\x2f\xfa\xb7\x04\x47\x1e\x00\x0e\xff\x34\x2f\x64\xfd\x45\xca\x57\x23\x4a\x55\xd1\x7b\x17\xb5\xc9\x31\x84\x7e\xd7\x63\xa3\xf2\x21\xf8\x90\xa7\x35\x6b\xfe\x67\xbd\xed\x3e\x45\x3e\xd4\x6d\x29\xba\xb2\x8f\x91\x8f\xdf\x97\xe6\xc5\x02\x8d\x8a\x6d\xfd\xb1\x6b\x43\x6f\x8e\x33\xac\x72\xde\xe7\x85\x19\xb6\x5c\x79\x7e\x12\x01\xd9\x36\x51\x5e\x32\x6b\x2a\x2b\xcb\x53\x5e\xf0\xa9\x2e\xe3\xae\xdd\xec\x84\xcf\xcf\x2c\xcc\x3c\xbc\x7c\xff\xec\xc3\x0b\x33\xe7\x4e\x93\x09\x0b\x60\x21\x48\x85\xa2\x91\x54\x24\x9d\x40\xe3\x66\x26\x14\x10\xf2\xf6\x03\x99\x59\xb0\x59\xff\xb1\x63\xe5\xb0\x91\xb1\x1a\x14\x7a\x05\x9e\xd8\x51\x89\xdc\x2e\x1f\xc7\x6b\xd8\x68\x2b\x4b\x8b\xb4\x96\xc6\xfe\xb9\xe0\xee\x45\xfa\x1b\x5d\xa3\xd8\x31\xf4\x25\x17\xe6\x16\x27\xf8\xca\xec\x22\x28\x45\xcb\xb3\x2b\x8b\xae\xf2\x1a\xac\xcc\x2e\x06\x4e\xd5\x6f\x19\x61\x63\x3d\x16\x98\x72\x71\x52\x9a\x7c\x53\x00\x86\xc6\x70\x30\xd3\xeb\x46\x89\x33\x82\x72\x5b\xb9\x83\x58\xac\xca\xba\x16\xd3\xb7\x0e\xb3\x1f\x79\x6c\x04\x39\x9a\xfd\xef\x7b\xc1\x87\xbc\xb3\xf0\x77\xa9\x4a\x85\xb4\x11\x02\xda\x25\x10\x8c\x97\x5e\x92\xeb\x7c\x9c\x2b\x35\x9d\x39\x04\x15\x53\x88\x6c\xaa\xd1\x96\xf3\x49\x33\xdb\xa6\x9e\xf0\xee\x62\xaf\xbc\x82\x40\x9b\xaa\x76\xf9\xbd\xba\x1d\x26\x45\x54\x74\xec\x64\xa4\xb7\x03\x77\x36\x4a\x7d\xff\x6f\x2a\xc1\xef\x54\x96\xd4\x1e\x50\xfa\x78\x4a\x3c\x1c\xf4\xf1\x2a\x53\x15\x29\x13\x54\x3d\x72\x9b\x6a\x46\x85\x42\x9d\x0c\xcd\xd2\x01\x24\xa2\xba\x35\x33\xa8\xdb\x01\x0d\x10\xf9\xea\xc5\x65\x0d\xf0\x69\x23\xb9\x17\xeb\x22\x03\x3a\x20\x08\xd0\x30\xe8\x57\xd0\x7d\x93\xca\xf3\x4a\x07\xa7\x7f\x24\x43\xf1\x25\xd7\xff\x11\xb6\x5a\x39\x2e\x02\x88\x93\x5c\xd6\x18\x08\xbf\x31\x1a\xdc\x55\xbe\x58\x06\x15\xd7\x34\xce\x16\xde\x81\x79\xa6\xba\xe5\x8d\x66\x04\xb8\xec\xac\x84\x3f\xda\xcf\x9e\xf6\x98\xbe\xa7\x50\x01\x8e\x1f\x0b\x3e\xed\x69\x84\x66\xb2\xd8\x37\x4b\x04\x68\x98\xbd\x69\x92\xed\x54\x25\x57\xdc\xff\x52\x20\xc7\x69\x58\xcf\xa7\x4c\x7c\x4e\x3e\x45\xd5\xc9\x3e\x36\x97\xa7\x6e\xdc\x5c\x0f\x8b\xc9\x28\x9f\x0c\x27\x7b\x16\x70\x24\xf1\x2f\x78\xec\x06\x0d\x69\xae\x3e\xc7\x6f\xa9\x4f\x7c\xd0\xcd\x2f\x37\xe0\xe7\xea\x4b\xf8\xe1\x4c\x84\x75\x4c\x38\x0c\x0b\x1e\x8b\x50\xee\x10\x51\xb2\x24\xaf\x92\x27\x6f\xdc\x50\x22\xd0\x63\x10\x3d\xe0\xb4\xe3\xaf\x3d\x27\xf0\xe4\x7b\x5e\xb0\xb0\xe4\x0e\x1f\xa9\xb3\x16\xc3\x38\x64\xc7\x1a\x3e\x88\xd0\xae\x7d\x2c\x77\xc6\x5b\x38\x06\x97\x5b\xd9\x49\x76\xa2\xff\x59\xa2\x6b\x92\x39\x41\x24\xcf\x79\x86\xf4\x63\x1e\xfb\xb1\x46\x3b\x8e\x3b\x67\xc3\x55\x11\x8b\xba\x1e\x85\x5c\x8d\xc2\xeb\x7a\x64\xf9\x83\x30\x80\x4d\x8d\xc8\xc6\x1c\xe2\x37\xba\x66\xa5\xca\x2a\x9c\x48\xe3\xd0\xc0\xb7\x94\x07\xe2\xe7\x7a\x42\x61\x44\x0a\x09\x63\xe5\x7c\x37\x10\x45\x26\x1a\xb1\x36\x74\xd9\xe0\x18\x8d\x9e\x8b\x82\x72\x9a\xad\xa5\xe7\x34\xe0\x5f\xb0\x43\x30\xa5\x74\x37\xdc\xab\xba\xe1\x98\xdb\x0d\x38\xf1\xf4\x44\xdc\x7e\x8e\xfd\xeb\x83\x4e\x96\xd5\x00\x76\x02\xff\x9b\xd7\x05\x1f\xf0\xba\x08\x21\x6a\x61\xab\xd0\xa0\xf6\x11\xfa\xea\xa4\xb0\x85\x12\x1c\x12\x9b\xe1\x2f\xd7\xf9\xa6\xf0\xa1\xd3\x29\x7d\xde\x30\x37\x81\xe1\x9a\xb1\xae\x57\xd9\x01\x74\x49\x9a\x4c\x6a\x33\x51\xbd\xa7\x11\xe0\x4b\x07\xd8\x57\xcc\x51\xf9\xf3\xde\x55\x92\x32\xe0\x11\xf9\x6d\x56\x7e\x99\x6c\x6d\x5f\x62\x8c\x6e\x0a\x47\x01\x12\x9c\x93\x8d\x4a\xfb\xb8\xcb\x1d\xa4\x3d\xf4\x13\x1c\x48\xd2\x6d\xc5\x78\x52\x71\x67\xec\x9d\xa9\xf7\xce\xd4\x2f\xa0\xef\xe4\x2b\x76\x18\xf7\x7f\xda\x35\x53\xed\xa3\x65\xa6\xda\x17\x80\xa7\xf6\x71\x65\xda\xfb\x90\x37\x00\xf1\x6b\x1b\x6a\x9d\xe0\xe1\xe5\x32\x77\x0e\x06\x5f\x20\xf8\x06\xae\xde\x29\x5a\xe8\x24\xfb\x14\xf1\x47\x0f\x89\x71\x46\xef\x90\x0a\x40\xea\x59\xaf\xbe\xbd\x35\x63\xc6\xbf\xab\x0f\xfa\x6c\x29\xb7\x56\x59\x35\xca\x9f\xc2\xd8\x5f\x1d\xea\x87\x7f\x3d\xd3\x80\x8e\xe9\xac\x88\xac\xe9\x7f\xf1\x50\xf0\xe7\x95\x39\x12\x35\x3a\x54\x13\xf6\xe0\xc3\x52\x2a\x03\x61\x9e\x3c\x8a\x77\x6f\xc0\xcb\x8a\xc9\x5b\xc7\x33\x90\x18\x29\x79\x98\x0f\xe7\xe3\xe3\x56\xe8\x8b\xdc\xae\x8d\x95\xbd\x96\x4e\xc6\x29\xe6\x04\x1d\x0e\xa9\x61\xe3\xc8\xdb\x54\xb8\x37\x93\x22\x9a\x34\x25\xe4\xf1\x18\x68\xbd\x32\xa7\x0e\x0b\x09\x35\xcc\x79\xd6\x4e\x12\xf2\x20\x84\xc8\x05\x84\xd1\x29\x28\x19\x34\xf3\xe7\xaa\x88\x31\xbe\xe2\x92\xe8\xf0\x3b\x8a\xb4\x95\xc6\xe9\x5a\xe7\x8c\xe8\xdc\x69\xc1\xe0\x85\x68\x23\x4d\x3a\x58\x51\x9a\x90\xe7\x1d\x0f\xe1\x9a\xfd\xd7\x74\x5f\xa4\xdf\xbf\xe5\x5d\x67\x55\xea\xee\x6c\x8c\xfd\xa8\xc2\xec\xdb\xfe\x5f\x54\x82\xa7\x2b\x2b\xcf\x6d\x4f\x29\x3d\xa9\x97\x1e\xa5\x87\x51\xc5\x32\x98\xdd\x5b\x8d\x60\x7e\x4d\x7a\xda\xfa\xe8\x9d\xf4\xb3\xe1\xc2\xd3\x18\xc5\xa5\x7e\xae\xf2\xd3\x00\x0f\x62\x57\xac\x68\x5b\x35\x68\x86\x11\x81\xef\xf2\xd8\x21\xa7\x07\xfc\x37\xb1\xbb\xaf\x26\x9b\xc5\xae\x23\xb8\x6d\x86\xbe\xf3\xf5\x6d\x91\x75\x90\x3f\x4e\xaf\x2b\xbd\x8d\x4d\xe8\x50\x7d\xa9\xa4\x62\xaa\x14\xfb\x7f\x43\xec\x06\xdd\xe7\xba\x51\x7f\x3e\xf4\x1c\xb4\x6a\x6b\xa8\x47\xb3\xac\x19\x6b\x86\xda\xb0\x78\x14\x22\x6b\xda\x4e\x5d\xf0\xe0\xc1\x45\xb9\xcb\xc2\x75\x9d\x06\x08\xc0\x82\x6a\x7c\xac\xca\x6c\x38\x69\x2b\x8c\x50\x21\xdb\xa4\x52\xea\x50\xc4\x56\x94\x94\x1f\x26\x86\xb9\x04\xa1\xa5\x69\x96\x42\x30\x8c\xbc\x92\x66\x84\x06\x63\x3d\x41\x49\x44\x61\x92\xf3\x40\x09\x9b\xb1\xdc\x94\x08\x80\x1b\x0f\x1f\xd3\x35\x1e\x7e\xe3\x9b\xc6\xf5\x04\x0c\x63\xcb\xbb\x9e\x97\x01\x7f\xc3\xb8\xb5\x1e\x4e\xc6\x72\x6f\x42\x3f\x0a\x51\x88\xae\xa7\x09\x24\xa5\x40\xa8\xa8\x25\x62\x17\xca\xa3\xc9\x1b\x22\x94\x1b\x19\x18\x3a\x12\x79\xd0\xab\x57\xd9\xe7\x2b\x8c\x99\x77\xfa\x9f\xa9\x04\x1f\xac\xd8\x7d\xa8\x31\x8e\x43\x38\xed\x45\x35\x03\x50\xad\x03\x06\xac\xfc\x89\xe7\x6a\xec\xec\x71\xe9\x3d\x72\xf6\xe8\x76\x4d\xdc\xea\x36\xc3\xa4\x07\xb2\xeb\xc9\x81\x23\x38\x20\xab\xe5\xf3\x87\xd8\x6b\x77\xe7\xce\x77\xf3\x2c\x96\x0d\x92\xd5\x72\x2d\x8c\x85\xff\x9d\x83\xc1\xeb\x06\x17\xd1\x5a\xfb\x3a\xb1\x5e\x41\xc2\x4a\x41\x2c\x61\xc2\x01\xc7\x92\x47\xba\x52\xaa\x54\x75\xcb\x7b\xb1\x1c\x6e\x75\x3a\x5c\x0c\x8b\xf5\x2d\xcf\xcf\x29\x1e\xd9\x5c\x74\x36\x91\xff\x72\x1d\xfb\xe6\x30\xbb\xc1\x91\x65\xc0\xb8\xfe\x27\xc3\xc1\x53\xc3\x5d\x97\x9d\x93\xc5\xab\x96\xcf\x2f\x10\x33\x76\x92\x47\x75\x02\xbb\xac\x21\x99\x8d\xa5\x25\x87\x05\x7a\x77\xf3\x16\xc4\x23\x17\x29\xc7\xef\xbd\x48\x18\x90\x6a\x35\x5d\xac\x72\xe0\x78\xd1\xf5\xe6\x4e\x10\x2b\x46\xf8\x6b\x3a\x4c\x48\xf5\xd1\xf6\x53\x6d\xcc\x87\x87\xa1\xa9\x98\xf2\x70\xb1\x8a\x6f\xb9\x28\x67\xd3\xc5\xaa\xec\xa1\x8b\xa6\xbc\x14\x61\x45\xca\xc1\xaa\x0f\x9b\x4b\x1f\xfe\x36\x3b\x43\x0c\x74\x77\x4b\x2c\x99\x6e\x30\x2e\x05\x3a\x46\x10\x60\x23\x92\x7f\xe3\xd1\xef\xb2\x11\x1e\x79\x91\xb5\x6b\xc5\xb8\x45\x79\x0a\x99\xd4\x00\xc9\x1f\x85\x31\x9c\x91\x50\xf0\xe6\xd6\x3e\xab\xaa\x4e\xb3\xe6\x4e\x8d\x65\x45\x98\x5f\xca\xa7\x42\x70\xbb\xdb\xda\x63\xd8\x8a\xa6\x70\xb8\x8c\xc5\xb2\x7c\x61\xd2\xda\x3d\x6e\x84\xce\x98\xb4\x27\x22\x86\x10\xa1\x50\x4a\x52\xda\xb3\xb1\xe7\x8d\x3a\x47\x73\x84\x6c\x8d\xce\xf4\xc0\x08\xa3\xae\x99\xa0\x70\xcb\xf0\x99\x8b\x53\xf0\xe2\x8b\xce\x12\x80\x00\x5a\x15\xd8\x4c\xe2\x88\xa4\x33\xf4\x90\xb3\x5f\x7f\xbb\xc2\xba\x16\x87\xff\xe5\x4a\xf0\x07\x95\xf2\xd5\xe7\x78\x86\xb7\x44\xad\xaa\x0c\x31\xd7\x6a\x7e\xe3\x94\x7e\x8e\x46\xa2\x6f\x57\x97\xa2\xbe\xa4\x76\x75\xef\xe9\x15\xa7\x97\xdf\x3c\xc4\x7a\xc8\x1b\xff\x7b\x95\xe0\x4f\x2b\xdd\xd7\xaf\x89\x2c\xb9\xd6\x7d\x8d\xb2\xe4\x39\xeb\xed\x72\xab\xaf\x62\xde\x1f\x75\x86\xe0\xc3\xfb\x7b\x62\x89\x9c\x4e\x36\xee\x0f\x33\xa2\xdf\xfb\xeb\x91\xe0\x0e\xfb\x42\x89\x38\xc4\xec\x30\x3a\xd4\x9e\x8c\x43\xf8\x90\xeb\x0e\xfb\x9d\x11\xf6\xab\x15\x36\x0a\x92\x6e\x49\x34\xfc\xf7\x54\x06\x18\x90\x55\x73\xf0\xf4\x7f\x8f\x7c\x46\xab\x99\x4f\x7b\xf8\x27\x66\x03\x58\x39\x05\xad\xb4\x3e\x6d\xf8\xc6\xb5\x6d\x40\x6e\xeb\x13\xee\x4f\xd8\xe5\x27\xf8\x45\x7d\x11\x8d\xbd\x0f\x8e\xdd\x71\xe6\xf4\x6b\xee\x1c\x7b\xe8\xa2\x7d\xcf\x30\x2b\x3b\x05\x60\xc5\x2a\x2e\x58\xfa\xe9\x22\x55\xd3\x0d\x1c\x39\xf4\x6b\xeb\x9f\xad\xb4\x5e\xfe\x95\x57\xd9\xe3\x15\xf6\x62\x35\x7e\xf7\xa8\x8e\x7a\x77\x85\x9d\xdc\xb6\xa3\x96\xec\xa7\x74\x57\x7d\xcd\xea\x2a\x3d\x2f\x0c\x86\x2c\x3a\x9c\xa6\x51\xbd\x34\xfe\x36\xf4\x58\x82\xee\xa4\xad\x4c\x87\xf1\x62\xb5\xd6\x6a\x4f\x50\x81\x6a\x53\x34\xd3\xac\xa3\x7f\x8a\xd6\xba\x68\x8a\x2c\x8c\x27\xc9\x7e\x30\xa1\x1f\xc7\xc7\xf4\x2f\x7c\xd0\x79\x41\xf7\xd3\xe3\xfd\x38\x2c\xaa\x6c\x83\x1d\xc4\x4c\x96\x33\xa2\x23\x7b\xa8\x31\x00\xa3\xce\xcd\xf7\x39\x23\x3a\xba\x73\x8e\x9a\xbe\x91\x27\x45\x04\xe0\x56\x69\x3f\x56\x74\x83\x9e\x30\x2c\x62\x2f\x42\x2f\xde\xb9\xb0\x45\xaf\xbe\x7f\x07\x0c\x71\xb3\xd6\x33\xfa\xed\x2f\xeb\xf1\x76\x5d\xb0\xca\x9e\x3a\xc8\x26\xfb\x51\x3f\xa3\x1a\x79\xdf\xca\xca\x22\x71\x40\x83\xf0\x7c\xec\x60\x90\x96\xae\x99\xf4\x33\xf9\x1a\x10\x32\x44\xdd\xa2\xc8\xa7\xf9\x7c\x52\x4b\x9b\x90\xfd\x9c\x95\x1d\x20\x50\x5e\x8e\x41\x23\xcd\x36\xc3\xcc\xc1\x63\xc1\xa7\xb7\xbc\xfd\xf4\xa7\x1b\x4e\x07\xb4\x97\xea\x96\xff\x2b\x83\x4c\xe9\x3d\x3e\xac\xc4\xbe\xff\x33\x8a\xdf\xde\xde\x05\xac\xf4\x21\x05\xd4\x6f\x8c\xa5\x29\x29\x4a\x70\x46\x21\x12\x6e\x95\xe3\x63\x7f\x4b\x55\x0a\x24\x24\x0f\x7e\x5f\x25\xf8\xc5\x8a\xa2\x0f\xc6\x63\x5a\x9d\x87\x6b\x52\xcd\x2a\x4c\x67\xa0\x70\x8b\x54\x97\x69\x1b\xfe\xac\x9e\xa4\x11\x86\x3e\x68\x24\xf0\xf5\x30\x0b\x6b\x80\xb5\x54\x8f\x72\x85\xe9\xac\xed\xbb\xc6\xc8\x18\xc6\x3c\x90\xaf\x08\x20\x1b\x1c\x67\xc3\x85\xa5\xb3\xc4\x9e\x1e\x11\x31\xf5\xd2\x3d\xb3\xfc\xf8\x6d\xb7\x9e\x2c\xe5\xfa\xac\x45\x89\x1a\xd7\xb1\xa9\x31\x62\xed\x71\x52\xb3\x80\x8b\x07\x1e\x81\x77\x97\xbf\x00\x7d\x24\xf4\xd9\xce\x2e\xf1\x99\xfd\x6c\x54\x3e\x08\xc4\x38\x1f\xdf\x1f\x7c\x68\xff\x22\xfd\xe2\x75\x21\x8f\x7a\x7a\x44\xc0\x9e\xdf\xca\x44\xe1\x98\x34\xa1\x4b\xd5\xac\xc2\x66\xc3\xc3\x14\x1f\x92\x26\x5a\x1c\x19\x70\x73\xb4\xf6\x4f\xf3\x23\xfc\xf4\xe5\xb0\x56\x4c\xf3\x73\x16\x4d\x84\xa6\x75\x16\xf2\x5e\xdc\xa9\xf2\x23\x7c\x31\x13\x8d\xe8\xb2\x29\xb7\x1a\xe6\xa2\x8e\x56\x22\x5d\xbc\x05\x65\x78\xde\x8a\x23\x48\xff\x86\x8e\x3a\xa7\xa6\x7b\x94\x33\xce\xeb\xd0\x9a\x44\xad\x14\x41\xc4\x57\xab\x1d\xf3\x67\x98\x47\x39\x60\x04\xdb\x05\x60\x2e\x2a\xff\x35\xe3\xfa\xdc\x4c\x0e\x44\x25\x4b\xe4\x23\xfa\xf5\x90\x80\x35\x35\xc6\x73\xd1\x0a\xb3\x10\x0e\xb2\x33\x3a\x84\x53\x9e\x9e\x19\xa7\x20\x21\x44\x08\x90\x5f\xc0\x23\x02\xb1\xe5\x00\xe6\x2b\xf5\x2b\x6c\xc1\x24\x84\x2c\xd0\x17\xa6\x0d\xde\xa2\x3e\x65\x5c\x57\x29\x6b\xb0\xf3\x03\x23\x65\x2c\xcb\x0b\xfd\x1d\x6a\x17\xa5\x55\x80\xcc\x60\x38\x0d\xb8\xb1\xae\x59\x0f\x44\x89\x53\xff\x04\x25\xa6\xe1\x21\x06\x5b\x7f\x58\x54\xd7\xaa\x7c\xaa\x91\xa6\x53\xab\x61\xa6\x3e\x4a\xe4\xfa\xd2\xd4\x6a\xf8\x86\x52\x4e\x14\x3e\xa9\x0a\xac\x86\x6f\x18\xaf\xb2\x23\x40\xc9\x6a\x62\x31\x94\xfd\x7c\x1a\xd9\x28\x07\xcf\x3b\x20\x1e\x6e\xf1\x22\x65\x88\x42\x4f\x02\x66\x36\x0e\x81\xce\xdf\xa9\x18\x69\x84\x8b\x4c\x28\x4b\x72\x88\xe7\x2c\x18\x26\xa1\x27\xb0\xec\x91\x8c\x8a\xc9\xaf\x56\x69\x96\x31\xc4\x24\x2f\xd2\x50\x64\x38\x83\xb1\x4b\xc1\x47\x52\x65\xe5\xd7\xc9\x95\xa7\xa1\xd8\xe5\x61\x9e\x08\x3e\xd5\x92\xa5\xe7\x9c\x48\xa7\xde\x7d\xe1\x2c\xdc\xa7\x47\xd9\x78\x8f\x0c\x08\x2b\xdb\x83\xd2\x15\x00\xd2\xea\x89\xd1\xe0\x95\xbd\x6f\xf5\x44\xed\xed\x2a\x99\xf7\x44\xbd\xfa\xc6\xc8\x9e\xfb\x71\xb7\xee\xc7\xb6\x4a\xb9\x8d\x83\x57\xcc\x2b\xd8\x5e\x0b\x89\xb4\x7b\x28\x76\x8e\xe9\xd6\x7f\x52\xec\x79\x3d\x77\xe1\xf5\x6c\x58\x4e\xcf\x9f\xd9\x1d\x74\xd5\xa0\x7c\xb1\x67\xbd\xf6\xf6\x3e\xbe\x25\x7f\xf1\x0a\xb2\x98\x7a\x8b\x80\x72\xd8\xf2\xdf\x32\xf6\xb2\x1e\xb3\x08\x01\xf8\x96\xda\xb1\xf0\xff\x94\x05\xff\xc6\x33\xbf\x7b\xe4\x2d\x20\xb4\x89\x8e\x04\x0c\x15\xa1\x7d\xd6\xee\x9f\x22\xdb\x95\xf6\xb0\xb9\x8e\x4b\x5a\x3e\x64\xd9\xa1\xa5\xdc\x2d\x27\xac\xf6\x28\x56\xdd\xf2\x86\x37\x44\xb6\xea\xca\xac\x5f\x3f\xc0\x7e\xdb\x63\x87\xd4\x24\x46\xdc\xa2\xf7\x7b\xc1\x1b\x96\xec\x2b\xb4\xff\xaa\xfc\x62\xf9\xba\x42\xb8\x06\x73\x63\x26\x2f\xbf\x97\xdb\xee\x01\xe5\x49\x80\xd2\x16\x44\x7d\x94\x5b\xee\xa4\xbe\xc6\xe8\xb7\x79\xec\x80\x16\x1b\x7e\x27\x78\xc8\xe0\x61\x39\x62\x22\xb3\x60\xb2\xc0\x95\x55\x6e\x91\x7a\x6e\x26\x76\xf2\xc7\x42\xf8\xa9\xec\xc6\x03\x1a\xf2\xa4\xc7\xb0\x33\xfd\x27\xbc\xe0\x9d\xde\xfd\xf2\x4f\xb7\x09\x78\x49\x41\x52\xe2\x3e\x39\x73\xf6\x2c\xca\x0d\x7a\x85\x94\x33\x78\xee\x9c\x51\x88\x1a\x4b\x42\xbe\x81\x92\x46\xd4\x91\xd5\xf8\x0b\xe4\x97\x54\x39\x54\xde\xa3\xe9\xb0\x34\x07\x35\xfb\xff\x7a\xec\x40\xd8\x8a\x80\x6a\x2a\xf7\xbf\xeb\x05\x7f\xec\xcd\x2c\xce\xe3\xcf\x5e\x84\x09\xea\xa6\xb2\x2f\x91\x21\xb6\xb0\x20\x3f\xf2\x2a\xe7\xf3\x0d\x43\x81\x3a\xb3\x38\x8f\x0b\x10\xb7\x7a\x5b\x29\x4f\x3a\x0a\x0f\xc3\xc0\x9c\xa8\x33\x87\xa5\x19\xeb\x14\xb9\xba\x35\x8e\x51\x02\xcf\xeb\xda\x0d\x76\xe6\xf6\xb3\xe6\xf7\x87\xd8\x8b\x92\x34\x51\xbd\x7e\x61\xe9\x6c\xee\xff\xf6\x50\xf0\xd8\xd0\x82\x7b\xd1\x01\x56\x02\x94\xaa\x30\xc6\x73\x22\x0e\x23\xa6\xf0\xd0\xce\x8b\xc1\xe1\x60\x39\xc6\x29\x75\x24\xb7\xad\x65\xb8\xa8\xc1\xd0\xa0\x80\x2b\xda\x71\x3c\xc1\x1b\x11\x24\xa1\x15\xa2\xe5\x28\xca\xcb\x51\x52\xc3\xa8\x2d\xbd\x9d\x40\x8b\x30\x96\xcb\x4a\x62\x55\xd1\xee\xda\x7b\x86\xaf\x68\x81\x99\x6c\x35\x26\x07\x88\x91\x6b\xb9\x7d\x74\x84\x2d\x27\xec\x21\xf6\xaa\x1c\xd2\x36\x40\x17\x54\x3c\x40\x7a\xd2\x2e\xce\x5b\xe3\x70\x38\x6f\xd7\xe4\x39\x9b\x07\xad\xb4\x9e\x07\x52\xf6\x04\x68\x44\xc8\x03\x72\x9c\xbb\xdf\x40\xe7\x30\xf3\x9c\xdc\x59\x82\xf1\x09\x0e\x1d\x04\xfb\x59\x5a\xac\x0f\x1a\xbe\x2f\xb8\xaa\x9d\x4b\x81\x07\xcc\x10\xe9\x25\x91\x50\x9c\xb4\xff\x2b\xa3\xc1\xb4\x7d\xc1\x3a\xf3\xf1\x42\x5e\xa7\xe8\x69\x97\xce\xd7\x62\xbd\xeb\x0a\x94\xdb\x53\xeb\xf6\xa2\xca\x5e\x48\xfd\xea\x39\x4d\xd5\x3c\x4d\xe1\x5c\x03\xe2\xed\xb7\x59\x61\xf2\xf8\xc5\xe6\x75\xe0\xe8\x80\x16\x6d\x57\x11\x54\xf0\xac\xb7\xb6\xbd\x5a\x37\xe7\x9f\x52\x10\xe2\x76\x0d\xfd\xb0\xc3\x4b\xef\x55\x94\x09\x5f\x1c\x75\x88\x12\xfb\xb6\xce\xa4\x7e\xfa\xef\x1f\x0d\xe6\xba\xae\xaa\x9d\x32\x13\x79\x3b\x36\x5c\x39\x20\x5c\x4a\x04\x9d\xca\x64\xe6\x72\x13\xee\x67\x9b\x44\xa3\x99\x0e\x38\xae\x74\xb7\xef\x42\x2e\xb2\xf9\xa4\x91\x06\xb7\xca\xbf\x54\x33\xd4\xd5\x9e\xe0\x5b\x9a\x66\x0c\x9a\x57\x65\xef\x1d\x66\x07\xc2\x76\x1d\xd2\xb8\x73\xff\xad\xc3\xc1\x5f\xee\x9b\x51\x3f\x71\xff\xa2\x5f\xdc\x82\x9b\xe3\xb5\xf5\x34\x17\x3a\xe7\xd5\x6a\x18\xf8\x42\x14\x9b\x4e\xda\x6c\x85\x45\x24\x37\x21\x78\xfd\x6a\x4a\x6d\xb0\x3a\x10\x43\x1d\xa0\x29\x52\x2b\x34\xef\x40\x0d\xb3\xe3\x5c\x49\x8c\xa1\x2d\x37\xa7\xf1\x52\x8d\x90\x28\x1c\x9a\x4f\xa0\x50\x0a\x78\x07\xe4\xb5\xd3\x9d\x2a\x9f\x51\x8b\xbf\xbb\x12\xd8\xe4\xe0\x43\x34\x3b\x21\xf8\x37\x4c\xbd\xb8\xdf\x92\x78\x86\xbc\xb8\x50\xd9\x96\x42\xfb\xcb\x7b\x74\x1f\x04\x53\xa9\x1c\x7d\x15\x0f\x86\x7e\x90\x72\xfd\x45\xca\x01\x16\x55\x18\x6d\xda\x6e\x25\x25\x1b\x47\xe6\xb3\x78\xb8\x19\x66\x82\xf0\x97\xec\xa2\xf8\x42\xb4\x9a\x91\xef\xd7\x79\xa3\x82\xe9\x02\x57\x9d\xbe\xa7\xc7\x15\x63\xd1\x82\x22\x6b\x8b\x60\xc2\x9a\xde\x9a\x64\xd2\xb6\x15\xeb\x3a\xa9\x63\xad\xf8\x4c\x2b\x11\x7d\xc0\x0e\xbf\xc6\x0e\x39\xef\xf6\xef\x0f\xee\x9b\x71\x1b\xd3\xc5\xe1\x4e\x0d\xda\x0c\xbb\x51\x0c\x43\xe2\x8a\x94\x2b\xac\xea\x40\x1a\xdd\xc7\x86\xc1\x47\xeb\xdf\x15\x1c\x3b\x0d\xce\xda\xbe\x15\x03\x71\x64\x32\x06\xdb\x41\x6d\x5d\xd4\x2e\xb9\xf4\xb2\x5f\xde\xc7\x6e\xd9\x61\x6e\xbb\x9d\xd5\x2f\x67\xab\xff\xde\x7d\xc1\x6f\x79\x03\x0a\xe0\xd6\x88\xa7\xc5\x96\x3d\xed\x49\xdd\xd4\x76\x78\x34\xb7\xc5\x1d\xa5\x3d\xeb\x53\x8d\xdd\x9a\x19\x03\xc4\x29\x17\x87\xa5\xf3\xf6\x2b\xd6\x34\x31\x20\x6e\xee\x6c\x85\x3d\xe1\xb1\x97\x58\xaa\xb4\x79\xc8\xff\x25\x8f\xdd\xb5\xf3\x5c\xfb\x85\x5e\x75\x04\xe7\x7a\x5e\xb6\xce\xcd\xf6\x99\x18\xd5\x38\x47\xdd\x74\xfb\x47\x36\xd6\xcf\xba\x5b\xfa\xcb\x5e\x7f\x02\xc5\xee\x96\xf6\x68\xe6\xf2\x76\x1d\x38\xa8\xc1\xfd\x1a\xfb\xb9\x83\x3d\x43\x8b\x71\xeb\x5e\x52\x3a\xbc\xff\x91\x83\xc1\x43\xa5\x6b\xe6\x5c\x26\x92\xb4\xbd\xb6\xee\x1a\x1e\x52\xc0\xd0\xe8\xa4\x6d\x1e\x81\x87\x04\xe0\xbf\x9a\x69\x3d\x6a\x74\x8c\x67\x29\x13\xca\xe2\xe2\xee\x54\x9f\xba\x8e\xfd\x85\xc7\x5e\xa4\xda\xac\xf4\xdf\xaf\x7a\xc1\xe7\x3c\x65\x86\xe5\xa5\xbb\xb6\x3f\x2a\xb2\x8e\x1f\xe8\x69\xaa\x8b\x09\x1e\x41\x28\xea\x35\x57\xa7\x6a\x69\x82\xde\xd4\x5a\x67\x92\x52\xd9\x26\xc3\xa4\x2e\xff\x06\xa8\xec\xa4\xd6\xb1\x57\xf4\xa3\x04\xf5\xfa\x86\xa0\xe9\x00\xbd\x5e\x4b\x10\xb7\x32\x8c\xeb\x2d\xce\x31\x63\x3c\xf8\x29\x29\x3f\x15\x62\x76\xb9\x45\xf6\x83\x5f\xdb\xc7\x0e\x80\x44\x07\xd7\xe8\x17\xf6\x05\xbf\xbb\x6f\xbe\x41\x63\x1b\x21\x98\x64\xc8\x5b\x91\xa8\x09\xe7\xe0\x21\xe7\x44\x21\xc2\x3a\x5d\x94\x9d\x97\x29\x10\x22\x3a\x68\x92\x86\x6e\x0e\x26\x60\x9c\x52\xb9\xe1\xaf\x5a\x3e\xbf\x30\x75\x6f\xaa\xe2\x18\x71\x4a\x43\xf6\x5c\x53\x24\xc5\x04\x57\xa7\x3e\x0a\xf5\x5f\x86\xbc\xba\x66\x98\x44\x0d\x29\xc0\x4c\x0e\xe8\x83\xc7\x1e\xaa\xf2\x7b\xd2\x8c\x8b\xcb\x61\xb3\x15\xe3\x24\x29\x34\x20\x92\x3b\x8b\xe0\x63\xf4\xb3\x06\x17\xa7\x95\xaa\xd3\xf1\x26\x34\x16\xe0\x38\x53\x6a\x6c\x5b\xf0\x38\xba\x24\xa6\x79\x00\x3b\xbb\x79\xf5\x1b\xe5\x58\xbc\x29\x00\x48\xd2\x4c\xf0\x40\xfe\x0c\x94\x93\x8b\x4e\x5b\xb6\x4d\xc4\xbc\x18\x77\x8c\x2c\x5a\x5b\x03\x8a\x60\x38\x6b\xc8\x09\x08\xe7\xe0\xa8\xc1\x93\xd4\x2a\xac\xc0\x1b\x4d\x24\x78\xb9\x21\x0f\x1e\x7b\x28\xe0\x87\xdd\xef\x92\xfb\x93\xb8\xcc\x8f\x69\x03\x50\x2b\xad\x8f\x53\x00\x6d\xde\x49\x8a\xf0\xb2\xac\x93\xd4\x33\x30\x05\x14\x29\x9a\x26\x00\x6d\x76\x53\xc4\xb1\x4e\xe3\xdd\x0c\x3b\x68\x1b\xc3\xae\x04\x5e\x65\xe3\x7e\x4d\x1c\x01\x60\xe1\xbf\x82\x02\x0e\xf8\xaf\x70\x6c\xdb\xc9\xba\x78\x1e\x0e\x45\xff\x40\x40\x17\xdf\xe5\xb1\x03\xda\x36\xe3\xbf\xd9\x0b\xf2\x05\x03\x37\x76\xed\x5b\x04\x91\xbf\x53\x0e\x04\xc0\x01\x07\x63\x83\x8c\xd5\x18\x68\xb0\x94\xc6\x02\xdc\x5f\xff\x6b\x34\x78\xb7\xa7\x7e\xf5\xf2\x78\xa1\xe5\x68\xae\x8b\xc5\xed\x16\xf9\x47\x23\xdc\x48\x31\x9b\xb2\x9f\x81\x7d\x6a\xe3\x26\xae\xaa\x47\x9b\x04\x81\x86\x02\xb2\xad\xc8\x50\xb9\x80\x94\x4e\xac\xf8\xd8\xb1\xde\x3c\x32\x9f\xdf\x33\xbd\xec\xda\xf4\xf2\x3a\xe5\x51\xbb\x10\xfc\x44\x0f\x8f\x1a\x0c\xf5\xce\xe1\x4f\xbb\x26\xd4\x9e\x69\xe7\x1f\x83\xeb\x2c\xde\xde\xc6\x32\xef\xdf\x7b\x85\x00\x80\xfd\x38\x2b\xd9\xe3\x8c\xcd\xdb\x3a\x75\x9d\x00\xda\x32\xb1\x16\x41\x36\x3b\xea\xd6\x38\x89\xce\xb5\xe5\xb2\x4c\xd6\x1e\x10\xab\xeb\x69\x7a\x69\xd6\x86\x8d\x00\x69\xf5\xf5\x03\xc1\x99\xed\x0a\xb9\x73\x7a\x50\xe9\xde\x82\xe6\x2f\xf7\x08\xab\x76\x2d\x68\xde\xa7\x09\xab\x1e\xf3\x82\x7f\x7e\x76\x27\x63\x61\xcb\x9d\x07\xd8\x05\xb6\xdc\xff\x5c\x76\xd5\x73\x68\x4f\x40\xed\x11\x53\xd9\xc4\x54\xbf\xe8\x6d\x2f\x0b\xeb\xfe\xaa\x01\x3e\xeb\x39\xf3\x4a\xe2\x70\x3b\xf9\xd4\x53\x4c\x7e\xe2\x7a\x76\xfb\x8e\xa7\xf8\x52\x3b\x16\x0f\x44\xc5\xfa\x79\x4d\x20\xe1\xff\xef\x43\xc1\x5b\xbc\xee\xeb\x38\xbb\x8b\x76\x2b\x06\x1d\xd4\xba\x21\x25\x87\x49\x8b\xe2\xf3\x05\x9a\x26\x65\xff\x6a\xfe\xc1\xa6\x3c\x34\x19\x13\xa4\x22\x0b\xc6\xea\xc4\xe5\x56\x98\xe4\x3a\x8e\x0b\xce\x80\xae\xc5\xe0\xe9\x83\xec\xf7\x3d\x76\x9d\x11\xa4\xb9\xff\x09\x2f\x78\xb7\x67\x24\xa9\x36\x9f\x5b\x67\xdb\x92\x4b\x99\xaf\x0a\xa2\x40\xa8\xf2\xb1\x23\x63\x14\x1c\xa0\x0b\x83\xb9\x93\xae\xd3\x52\x24\x90\x7b\x91\xac\x61\xd8\x2a\xd8\x58\xe3\xa8\x26\xb4\x31\x2b\x4d\x44\x95\x2f\x29\x64\xa5\x01\xc6\xc8\x5f\xaf\x30\x66\x58\x3a\xfc\xf7\x54\x82\x1f\x7a\x6e\xe7\x16\xeb\x0e\x8f\x07\x58\xe6\xd4\xd8\x71\x39\xfc\xbc\x16\x66\x22\xa7\xa8\x8d\x49\x3e\xbb\x74\x7a\x66\xe5\xf4\x04\xbf\xb0\x38\x07\xff\xcf\x9d\x3e\x7b\x5a\xfe\x3f\x7b\x7e\x61\xe1\xf4\xec\x8a\x3c\x2d\x1e\x41\xeb\x50\x1c\x63\xe3\x01\xa6\xcd\x1d\xb7\x30\xe9\xf0\x46\x1b\xd2\x1c\xcd\xcb\x9c\x56\x28\x96\xa7\x7a\x9d\xa0\xa3\xae\x59\x17\xbd\x7f\x9f\x1d\x86\xf1\xf6\x7d\xc1\xf7\x87\xae\x2e\x10\x83\x31\xeb\xcc\x3f\xcd\xc7\x5a\x69\x3d\x1f\xa3\x08\x11\x64\x3a\x84\x4b\x53\x71\xba\x36\xa6\x03\x47\x04\x8f\xd3\x35\x27\xf3\x43\xf3\x22\xca\x2f\xc6\x62\x4e\x24\xc7\x84\xf6\x35\x5b\x4f\xe9\xca\x9d\x67\xec\x02\x76\xbd\x98\x70\xe2\x94\x2c\xe7\x1e\x62\xb9\xde\x2d\x50\x7e\x89\x28\x73\x9f\x60\x6c\xbe\x21\x0f\x47\xf5\x9a\x94\x8a\xe5\xc1\x22\x3f\x03\x38\x92\xda\x31\x65\xb8\x90\x83\xc0\x54\x4d\xb8\x79\xf2\xb8\x18\x87\x2d\x34\x1b\x00\x37\x05\xc0\x7b\x55\x19\x9b\x2b\xa3\xfe\x8a\xa4\x16\xa7\xc0\xb7\xa1\x4c\x3d\xce\x67\x37\xa3\xb5\xf5\x42\x51\x3c\xe8\xec\x9f\x9d\x4c\x8c\x8f\x0e\xb1\xe1\xbc\x96\xb6\x84\xff\xc1\xa1\xe0\xb1\x21\xf8\xd3\x4a\xb5\xc5\x94\xcd\xb4\x25\x8c\xc2\x04\xf1\x2c\xf7\x83\x2d\x09\x75\x17\x98\xc3\x01\x85\x28\x04\x13\x3c\xd0\x07\xea\x7a\x80\xba\x4f\x70\x24\x30\x05\xec\x70\x22\xb0\x7f\xd4\xf0\xc6\x24\xbc\xc7\x8e\x20\x81\xce\x53\xb4\x52\xfa\xd5\xe6\xb8\x2e\xc5\x91\x0d\xa1\xe3\x56\x54\x75\x1a\xd2\xf5\x56\x13\x9f\xb1\xed\x1b\x65\xf3\xad\xc7\x31\x59\x0a\xe3\x3c\xa8\x73\x32\x2b\x06\x08\x20\x83\xad\xa1\xd1\xb4\x58\x56\x3f\x02\x0a\x72\x98\x61\x6c\xb6\xe2\xa5\xa2\xf8\x59\x70\xe3\x1c\x71\x61\x02\x9f\x74\xa2\x80\x7e\xcb\x0b\xfe\x55\x77\x14\x90\x15\xc6\xb3\x13\xd1\x8c\x45\xaf\xad\xd4\xf9\xf6\x7e\x76\xca\xb6\x90\x8b\xac\x40\x48\x11\x61\xe5\x1a\x9b\x8b\xcb\xd1\x5a\x12\x25\x6b\xe4\x2a\xd6\x78\x5c\xfe\x87\xf7\x6f\x79\xfb\xa4\x46\xe0\xec\x5b\x6f\xdb\xcf\x7e\x96\x5d\x1f\x87\x79\x71\x01\xf4\xaf\x95\xa8\x29\xfc\x47\xd8\x2d\x57\xa1\xef\xc8\x47\x83\xa9\x22\x6a\x8a\xbc\x08\x9b\x2d\x9d\x30\x06\xb1\xe4\xa8\xdd\xa1\x86\x1f\xe5\x86\x83\x9f\x2d\xb3\xfd\x4d\x91\xe7\xe1\x9a\xf0\xef\x0b\x6e\x5f\x6f\x37\x01\xda\x3e\xac\x43\x50\x0f\xdd\xc1\xb5\xad\xc9\xbb\xba\xb0\x90\xc1\xf0\x6a\x77\xd9\x6d\x6c\x04\x11\xb3\xfd\xa9\x20\x58\xcd\x22\xd1\x50\x08\xda\xaa\x51\x7d\x1f\xfd\xaa\xc1\x86\xfa\x23\x2f\xf8\xbd\x12\xbe\x93\x6e\xf7\x84\xf2\x3d\xad\x64\xf2\x6c\x72\x4f\x18\xe7\x62\x82\x5f\x48\xc0\x03\x57\xe5\x33\xad\x56\x96\x02\x5e\xfe\x9c\x48\x28\x0a\xac\xce\xef\x21\xa2\x30\x43\x13\x68\x91\x33\x06\x50\x07\x46\x16\x51\x3d\x41\x19\xf8\x32\x6b\x8b\x00\x26\x5b\x3b\xc9\x85\x14\x5f\x1a\xd0\x03\x42\xd4\x11\x3e\x83\x8a\xb9\xe4\x06\x30\xf2\xfe\xc5\x60\x59\xd1\xc9\x39\x5f\x53\xe5\x67\xc0\x73\xe8\x10\x18\x02\x71\x1a\x0f\xd4\xa7\x48\x99\x84\x1f\xa3\xe4\x11\x7e\x8e\xfb\xa6\xcf\x54\x98\x2f\x07\x7c\x25\x93\x0a\x93\xac\x0a\x66\xd4\xaf\x55\xae\x7e\x4a\x7d\xdb\xeb\xae\x50\x2d\x57\xa0\xb6\x72\x3e\x05\xa7\x5b\xa1\x4b\xab\xf0\x2f\x39\x5c\x04\x67\x68\x58\x39\xed\xbe\x04\xb8\x85\x90\x27\x62\xd3\xaa\x0c\x7a\x4b\xae\x75\xa9\x5c\x00\xac\x7e\x82\x8c\x28\x72\x13\xd1\xc5\xc6\x72\x55\x35\x18\xa5\xc3\x64\x4d\x31\x25\x90\xe7\xda\x80\x54\xae\x47\xfa\x98\xab\x40\xf7\xe4\x37\x54\xd9\x57\x87\xd9\x89\x5e\xe9\x6c\x20\x85\x35\x42\x00\x65\x95\x59\xc0\xa5\xfe\x07\x87\x83\x5f\xf2\x66\x50\x2e\xd6\x8d\x4f\x30\x37\x80\x3a\xba\xac\x0a\xf4\xa3\x3b\x6e\x70\x23\x6e\x43\x13\xb2\x00\x88\x58\x4c\xa7\x44\x15\x8c\x14\x2e\xf5\x0c\x60\xf4\x38\xfb\x1a\xd2\xa3\x25\xfa\x20\xbe\xe5\x1d\x80\x1b\x72\xef\xd8\xf2\x46\xd5\xe3\x8e\xe8\x79\x66\x88\xfd\xbc\xc7\xf4\x3d\x7f\x33\x78\x64\xc9\xc9\x3b\x95\x15\x8c\xe5\x84\x08\x94\x26\xf9\x7a\xd4\x52\xf4\x56\xa0\x64\xa9\x43\x3f\x6e\xa3\xaa\x1e\xdc\xc5\xe6\x93\x09\xbe\x90\x16\xf2\xbf\xd3\xc0\x60\x33\xc1\xe7\x52\x91\x2f\xa4\x05\xfc\x74\xe6\xec\x39\x66\x1a\xeb\xdf\x1d\x1c\x5f\x29\x79\x3e\xf0\x13\xb5\x9f\xdc\xa0\x87\xd8\x1c\x15\xa6\xba\xb7\x57\xd8\x08\x36\xcd\xff\x5b\x2f\x78\xc6\x9b\x49\x28\xbb\x38\x6d\x38\x67\xef\x5c\xf3\x6d\xe8\xde\x8d\x72\x79\xfa\x4d\x33\xd5\x74\x9d\x6f\xab\xe8\x0c\xd5\xe6\x91\xa4\xc9\x24\xc4\x37\xf4\xac\x03\xbf\x58\xd6\x63\x7f\xf3\x80\xea\xa8\x2a\x70\xaf\x10\x6f\x22\x82\x03\x86\x16\xe9\x01\x58\x0e\xc2\x42\xac\x45\x35\x64\xc1\xe7\x80\xd3\x38\x68\xeb\xfa\xc1\x3e\xb6\xb0\x3b\x10\x8d\x65\x0c\x54\x34\x8e\xe0\xad\x7d\xc1\xed\xe5\x8b\x14\x78\x1e\x5a\xee\xb2\x22\xe5\x54\xaa\x1a\x8b\xb5\xb0\xd6\xa1\x93\xeb\x96\x67\xfc\x16\x5b\x1e\xb8\x52\x9c\x49\xf9\x1f\x87\xd8\x9d\xe4\x61\x39\x19\x8c\xdb\xcc\x63\xce\x8c\xa0\xaa\xf5\xfe\x5d\x9a\x4e\xc6\x35\x72\x77\x70\xdc\xa2\x53\x32\x35\x39\xae\x92\x81\xd5\xbd\x86\x52\x17\x5f\x1d\xcc\xe9\x94\x2d\x2b\x24\x5d\x67\xbe\x85\x85\x95\x0e\xb9\x89\xe7\x71\x1d\x2d\x0c\xab\xbc\x56\x94\xb2\xfe\xbe\xec\xb1\x7d\xad\x34\x2b\xfc\xcf\x6b\xa0\xd6\x4f\x79\x08\x08\xed\xbe\x44\x85\x8b\x62\xc6\xd2\xce\x5e\xc4\x2f\xca\xd2\x17\xad\x3d\xaa\x07\xb0\x36\x3f\x7c\xd3\xe4\xc9\x9b\x6f\x3e\x7e\xf3\x04\x6e\x38\x79\xb4\x21\xc6\xdd\x5d\xef\xc4\x89\xe3\xb0\x6b\xaf\x86\xb5\x4b\x9b\xf2\xb4\xa0\xa2\x8e\xa2\x38\x2a\x3a\x0e\x6c\xe5\xea\x0d\xec\x45\xec\xba\x53\x22\xcc\x44\x06\x41\x41\xfe\x3f\x79\xe4\x3c\x3b\xe7\x5e\xba\xd3\xbf\x83\x8d\x84\xad\xe8\x8c\xe8\xf8\x87\x1c\x5b\xef\x4b\x47\xd6\x45\x58\x17\x59\xf0\x93\x58\x1e\x03\x8b\x4a\xa1\x6d\xff\x3f\x00\x00\xff\xff\xee\xd7\x1d\x22\xa3\xf0\x34\x00") - -func kubernetesapiV1212SwaggerPbBytes() ([]byte, error) { - return bindataRead( - _kubernetesapiV1212SwaggerPb, - "kubernetesapi/v1212/swagger.pb", - ) -} - -func kubernetesapiV1212SwaggerPb() (*asset, error) { - bytes, err := kubernetesapiV1212SwaggerPbBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "kubernetesapi/v1212/swagger.pb", size: 3469475, mode: os.FileMode(420), modTime: time.Unix(1649964528, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "kubernetesapi/v1212/swagger.pb": kubernetesapiV1212SwaggerPb, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "kubernetesapi": &bintree{nil, map[string]*bintree{ - "v1212": &bintree{nil, map[string]*bintree{ - "swagger.pb": &bintree{kubernetesapiV1212SwaggerPb, map[string]*bintree{}}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.go new file mode 100644 index 000000000..b599e539a --- /dev/null +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.go @@ -0,0 +1,249 @@ +// Code generated by go-bindata. (@generated) DO NOT EDIT. + + //Package v1_21_2 generated by go-bindata.// sources: +// kubernetesapi/v1_21_2/swagger.pb +package v1_21_2 + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +// Name return file name +func (fi bindataFileInfo) Name() string { + return fi.name +} + +// Size return file size +func (fi bindataFileInfo) Size() int64 { + return fi.size +} + +// Mode return file mode +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} + +// ModTime return file modify time +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} + +// IsDir return file whether a directory +func (fi bindataFileInfo) IsDir() bool { + return fi.mode&os.ModeDir != 0 +} + +// Sys return file is sys mode +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _kubernetesapiV1_21_2SwaggerPb = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x79\x78\x1c\xd7\x79\xe0\x0b\x3f\xdd\x00\x45\xf2\x48\xb2\xa9\xa3\xc5\x51\x5b\x4b\xa9\x29\x11\x40\x13\x68\xb0\xc1\x1d\x5c\xd1\x00\x49\xa1\x09\x92\x30\x21\x91\xb6\x23\x89\x2a\x54\x1d\x34\x8a\xec\xae\x53\xaa\xaa\x06\x05\xe7\xf3\xcc\xc4\xb2\x3d\x9e\x6f\x1e\x3b\x1e\x27\x5e\xee\x38\xd7\xe3\x6c\x1e\x3b\xf1\xc8\x71\xe2\x3b\x49\x1e\x4f\x96\x9b\x1b\x67\x94\x91\xa3\xc4\x71\x66\x9c\x71\x12\x27\x4e\x9c\x79\x32\x9e\x9b\x9b\x78\x32\xb9\x71\x56\xdf\xe7\x2c\xb5\x75\x57\xa3\x1a\x60\x77\xa3\xc1\x7e\xff\x91\xc0\xae\xaa\x53\xa7\xce\xf2\x9e\xf7\xfc\xde\xe5\xa0\x81\x89\xfc\x3e\x7c\x3f\x42\xe7\x6b\x8b\xc4\x36\x89\x4b\x1c\xbc\x7d\xa5\x90\x9f\x28\xe4\x27\x8a\xbf\xff\xa7\x3f\x9c\xc2\x7f\xb1\x07\xdd\x3b\xae\x5a\xc6\xf8\x4a\x61\xbc\x62\x54\x0d\xd7\x56\xcd\x32\x71\xf0\xef\xec\xc1\x5f\x1c\x40\xdb\x35\x6a\x93\x6b\x2b\x85\xcc\x70\xc5\x70\x5c\x85\xda\xca\x4d\xd5\xd5\x96\x15\xba\x78\x9d\x68\xae\xa3\xd0\x25\xe5\x86\x61\xea\xca\x1c\x7b\xf2\x32\x7b\x32\xf7\x38\xbb\x73\x9a\xda\xe4\x4a\x21\xf8\xf5\x2c\xb5\xa7\x2a\x95\x8b\x6a\x95\x38\x96\xaa\x11\x67\x62\x97\x6a\x59\x15\x43\x53\x5d\x83\x9a\xe3\xd7\x1d\x6a\x46\x7f\x59\x55\xab\x95\x89\xdd\xe1\x5f\x56\x4c\x3d\x7f\xc3\xff\x88\xbc\x65\x53\x97\x2e\xd6\x96\x26\x1e\xae\x2f\xe8\x98\xe3\xda\x44\xad\x9e\xe0\x15\x9d\xd8\xd7\x42\x19\x91\x27\x26\x07\x72\xe3\xb9\xd2\xb3\xe8\x0d\x68\xe0\xc0\xbe\x02\xde\x85\x5e\x87\xee\x7a\xda\x54\x6b\xee\x32\xb5\x8d\xb7\x11\x1d\x15\xd1\xc0\xc4\xbe\x7d\xf8\x18\x3a\x8a\xd2\x97\xce\xe3\xfd\xa8\x80\xc6\x77\x8f\xeb\x64\xc9\x30\x0d\xf6\x16\x67\xdc\xa0\xf9\x1b\x47\x9c\xbc\x6a\x19\x79\xd6\x7c\xf9\x95\x42\x3e\x68\x89\x39\xc3\x71\x2f\x6f\x5b\x76\x5d\xcb\xb9\xfe\x08\xba\xf7\xc5\xb1\xa0\x42\x63\xaa\xc6\x0a\xc0\xdb\xf1\x36\xd6\x86\xe8\xfa\x1c\x7a\x34\x72\xbd\x6c\xd3\x9a\x35\xb6\x42\x6c\xc7\xa0\xe6\x18\x6b\x78\x3c\x82\x87\xd8\xff\x27\x43\x3d\x80\xe4\x0d\x93\xca\x4a\x01\xf1\x47\x26\x95\x6c\x16\x95\xde\x31\x88\xbe\x33\x80\xff\x7e\x20\xf3\x37\x03\x78\xdb\x0b\x35\x62\xaf\x66\x5e\x1b\x50\x2b\x15\x7a\xf3\x2a\xfb\xf0\x22\xa5\x37\xaa\xaa\x7d\xc3\x51\x6c\xf2\x42\x8d\x38\xae\x23\xfb\x9a\xac\x10\x93\xfd\xc3\x70\x97\x15\x77\xd5\x22\x4a\xb6\x78\xe9\xd2\xf9\x0b\x53\x97\xcf\x67\xf3\xca\x02\xb1\xd9\xeb\x14\x77\x59\x75\x15\x9d\x2a\x26\x75\x15\xa3\x6a\x55\x48\x95\x98\xae\xb2\xe8\x97\x59\x55\x57\x15\xa3\x6c\x52\x9b\x28\xee\xb2\xe1\x28\x4b\x15\xb5\xac\xa8\xa6\x1e\xba\x45\xb5\x89\xe2\xb0\xa7\x54\x57\x71\x97\xd9\xdf\xac\xe8\x21\x47\xd1\x0d\x47\xb3\x09\x6b\x9a\xbc\x32\x5d\x31\x78\x6d\x9c\x65\x5a\xab\xe8\xfc\x75\xaa\xe3\xd4\xaa\xa4\xae\x20\x9b\xb8\x35\xdb\x24\x3a\x2b\x4c\x35\x57\x15\xc7\x22\x9a\xb1\x64\x68\x8a\x61\xba\xc4\x5e\x51\x2b\xa3\x8a\x49\x6d\x5e\x2d\x77\x99\xac\x7a\x85\x04\xef\x55\x6e\x1a\x95\x0a\xab\x8f\xce\x9f\xf7\x3e\x59\xb4\x86\xa2\xd7\x6c\xc3\x2c\x2b\xaa\xe2\x10\xc7\xe1\x15\x9b\x5d\x12\x1f\x66\x38\xa2\x52\xa2\xf1\x46\xe5\xd7\x1a\xa4\xa2\xb3\x4b\xa2\x09\x74\x79\x3b\x51\x96\x88\xea\xd6\x6c\xa2\x94\x55\x97\x28\x75\xdd\x20\x4b\x22\xa6\xba\x58\x21\xba\x62\x98\x8a\x6a\x19\xa2\x72\xcd\x8a\xcd\xde\x1b\xd3\x9f\x13\xdb\x17\x29\xad\x10\xd5\xfc\x78\x2a\x55\xfa\xf3\x9d\xe8\xff\xde\x89\xff\xfb\xce\xcc\x7f\xdb\xe9\x0d\x82\xff\xb8\xf3\xa9\x65\xa2\x68\xd4\x74\x0d\xb3\x46\x14\x6a\xb1\x96\xf6\x1a\x78\x91\xb5\x87\xab\xdc\x5c\x26\x26\x6b\x53\xdb\x20\x2b\xec\xc3\xab\x94\xb7\xb1\x53\xab\xb8\x8e\xb2\x64\xd3\x6a\xa8\xe5\xf2\xca\x82\x61\x6a\xb2\x9f\x57\xd4\x4a\x8d\xb0\x2a\xca\x56\xe5\xf3\x84\xe8\xa3\x8a\x26\x3b\x92\xf5\x00\x35\x2b\xab\x4a\xcd\x11\xcd\xef\x57\x44\x3c\xca\x0b\x57\x15\xcb\x26\x2b\x06\xad\x39\x0a\xaf\xb3\x7c\xb5\x18\x93\x86\x4e\x4c\xd7\xd0\xd4\x8a\xbc\x66\xa9\xb6\x5a\x25\x2e\x1b\x95\xc3\xe4\x45\x8d\x58\xae\xb2\x44\x6d\x5e\xb6\x28\x92\x2e\xf9\x2f\x19\xe1\x63\x30\xd4\xeb\xac\x3a\x36\x61\xc2\x4d\x51\xeb\xab\x62\xb0\x11\x4e\x44\xaf\xd8\x44\xa3\x65\xd3\x78\x1b\xf1\xbb\x52\x8e\x30\xa2\x37\x3c\xc6\x9e\x50\x2a\xd4\x2c\x13\x9b\xfd\x64\xe8\xac\x39\xdd\x65\xd6\x1a\x35\xa2\xb8\x54\x21\x2f\x5a\x86\xcd\x45\x94\x32\x5c\x26\x26\xb1\xd5\x4a\x65\x55\x59\x32\x56\xf8\xd5\x25\x63\xc9\x25\xc4\x54\xaa\x86\x59\x73\x89\x33\xc2\xa4\x30\xaf\xdb\x92\x51\xae\xc9\xc7\xb4\x65\x36\xf3\x15\x6a\x86\xbe\x65\xb4\x61\x34\xdb\xc4\xb1\xa8\xa9\x8b\x66\x53\x95\x03\x85\x7d\xca\x65\xe2\xd0\x9a\xad\x91\x33\xac\x0a\x44\x57\x88\x6d\xb3\xb6\xa2\x65\x51\x41\x79\xa7\xff\x45\x2e\xbd\x41\x4c\xff\x93\x45\x1f\x2a\x26\x21\xba\x23\xee\x72\x0c\xc7\x65\x3f\x31\xf9\x35\xca\x1a\xac\x5a\x73\x58\x63\x39\xae\x6a\xf3\x59\x6d\xd8\xfc\x1a\x2f\x98\xd6\xdc\x68\x8f\xf3\xf1\x9c\x57\x2e\xb1\x57\xdf\x34\x1c\x32\x1a\x7e\x0b\xeb\x19\x39\x1d\x29\xaf\x1b\x2f\x47\xca\x2a\x29\x9d\x96\x65\x0d\x59\xf7\x10\x63\x85\xe8\xc1\xef\xec\x63\xf9\xc7\x25\x36\x0b\x2f\x97\x57\x98\x8d\x74\x7f\x70\x9b\xe4\x45\x57\xb9\x41\x56\x47\x95\xc5\x9a\x1b\xfc\x5c\x51\x5d\xf6\x7e\xc7\x54\x2d\x67\x99\xba\xa3\xca\xcd\x65\x43\x5b\xe6\x93\xd2\x0c\x35\x88\x7f\xbf\x3f\x90\x65\xf5\xc5\x14\x1a\xf3\x57\x54\x2e\x48\x99\x04\xd3\x6c\xa2\xba\x6c\xa6\x54\xa9\xce\xc7\xd5\x28\xeb\x78\x9d\x54\x88\xcb\xc4\xda\x92\x4b\xc4\x98\x5e\x32\x6c\xc7\xad\x6f\x8c\x4a\x85\xcd\x5c\xc3\xd4\x2a\x35\x5d\xc8\x0e\x76\xab\xf8\x50\xd6\xae\xaa\xc3\x07\x24\xfb\xbf\xe8\x94\x1b\x64\x55\x08\xce\xa0\xe0\xac\xf7\xc5\xd9\x3c\x42\x4f\x45\xe4\x0d\x9b\x01\x4e\xcd\xb2\xa8\xcd\xea\xc2\x85\x83\x58\x2b\x0c\x47\x71\xed\x1a\x09\xe4\x34\xef\x35\xde\xf9\x52\x22\x86\x5b\x4e\x34\x00\x1f\x7f\x57\xc4\x9a\x25\xa7\x8c\x2f\xbd\x17\x57\xc3\xbd\xc5\xe6\x2a\x7b\x75\xd5\x70\x1c\x2e\x95\x45\xd3\x88\xd5\xdd\xc9\x67\x77\x78\x23\x69\xe2\x0e\xc7\x65\x02\x9a\x49\xbc\x7f\x9e\x42\xef\x4c\xe1\xef\x4d\x65\xfe\xa9\x27\xf0\x9e\x99\x52\x1c\x52\x21\x9a\xcb\x47\x3a\x1f\x9d\xb6\xa1\x89\xb1\x28\xd4\x9c\xa5\xa0\x06\x5e\xbf\x88\x9a\x18\xb6\x68\x04\x27\xaf\xcc\x90\x25\x95\xf7\x1d\x9b\xc0\x2b\xc4\x5e\x75\x97\x0d\xb3\x9c\xcf\xde\xcd\x6f\x58\x90\x2f\xe8\x64\x4d\x2a\xea\x22\xa9\xac\x55\x13\x7e\x43\x5c\x4d\xfe\x16\xa1\xbf\x46\xf8\x7f\xa1\xcc\xb7\x90\x57\x95\xdf\x46\x5c\xfb\x63\x3d\xa8\x2a\x55\xf5\x45\xa3\x5a\xab\x2a\x66\xad\xba\x48\x6c\x51\x0b\x31\x74\x1c\x51\x4f\x56\x25\x2e\x55\xe5\x74\xd1\xd4\x4a\x85\x8b\x05\xbe\x30\x18\x2e\xa9\x3a\x0a\x79\x91\x0b\x81\xc6\x25\x55\x7c\xdf\xf3\x5e\x67\x3d\x2f\xc7\x95\x14\x5e\xbc\xbc\x2a\x71\x55\x5d\x75\x55\xf6\x36\x55\x0e\x0a\x3e\x33\x34\xd5\x64\x23\xbb\xe6\x84\xe7\xb6\xa3\x56\xd9\x60\x37\x5c\xc3\x5f\x04\x44\x2d\xd9\x72\x45\x82\xd9\xcb\x5e\x2d\xbe\x85\x35\x17\x53\x5e\x5c\x57\x2c\xe3\xe2\xdb\x85\xf0\x17\xdf\x46\x6e\xf2\x69\xa0\x7a\x33\x87\xcf\x2c\x36\xf1\xaa\xb4\x66\xf2\x62\xc4\x57\x0e\xd7\x2c\xf6\xb2\xb7\x11\x9b\x8a\x5f\x46\xbc\xd9\x26\x34\x05\x95\x0b\x18\xef\x69\xaf\x0f\xd9\x4c\x5b\x32\x2a\x2e\x61\x32\x97\xc9\x41\x36\xb4\xb5\xa8\x6e\x13\x59\x15\x2d\x9b\x38\x84\xad\xaa\x74\x29\x46\x66\xb2\x1a\xe8\x6c\xc9\xab\x1a\x26\xf1\x57\x97\xc8\x22\xcd\xe7\xf6\x8a\x6a\x54\x98\x36\x11\xe8\x6d\xec\x93\xb5\x65\x4a\x1d\xc2\x67\x96\x4b\xbd\x79\x2d\xfb\x82\x35\x8b\x6a\x97\x6b\x5c\x9d\x53\xb9\x90\xe4\x1f\xc4\x1b\x89\x7d\x9b\xac\x8f\x5f\x74\xd0\xba\xb3\x4b\x8a\x3f\xa4\x82\xc5\xd1\x5b\x6f\xeb\x3e\xc0\x70\x14\x52\xb5\xdc\xd5\xa8\x62\xe0\x6b\x65\xaa\xcb\xd6\xd0\xb5\x3e\x68\x2d\x01\x65\x2c\xd5\x89\x27\x26\xcf\xfc\x51\x59\xae\xa9\xb6\x6a\xba\x84\x48\xe1\xcb\x6a\xe7\xf5\x93\x3f\xf9\xb8\x8c\xab\x39\x6c\xb4\xf8\x35\xf7\xc5\xac\xaf\x80\xb8\x54\x31\x1c\xa7\x26\x55\x43\xc3\x2c\x57\x48\x30\x3f\xfc\x35\xcf\x1b\x6e\x63\xe2\x7d\x86\xc3\x74\x51\xff\x95\xeb\x93\xfb\x9e\xc8\xe7\x9a\xa7\x53\x23\x7a\xac\xf0\xe7\x1a\x70\x6d\xd1\x61\x37\x9b\xae\xff\x05\xba\xaf\xea\xcb\xf6\x63\x3d\x45\xab\xc4\x35\xaa\x84\x7d\xfb\x12\xb1\xd9\xf8\x64\x73\xb0\x6e\x7d\x0f\x96\x3b\xd6\x9f\xc4\x74\x6a\xb6\xd7\x7c\xaa\xb7\x60\xcb\x8f\x93\xad\x26\x3e\x99\x4f\x4b\xbe\x34\x2b\x4e\x55\xad\x54\x88\xad\x68\xcb\x35\xf3\x06\xdf\x49\xaa\x0a\x13\x5e\x4a\x45\xb5\xcb\x5e\x37\xf3\xf9\x2e\x8a\x17\x7a\xba\x43\x08\x1f\x76\x16\x75\x1c\x83\x0d\x37\xd9\x6c\x7c\xb8\x85\x67\x57\xcd\xd2\x59\x33\x06\x9a\x3a\x7f\x0f\xd1\x45\x7f\x70\x65\x50\x2e\x39\x72\x04\x8b\x87\x45\xad\x6f\xaa\x8e\x9c\x71\xfe\x6e\x84\xb5\x49\xe3\x7a\x2b\xb4\x50\xd5\x61\x1d\xac\xd5\x2a\xfc\x8d\x46\x30\x6c\xf2\xd9\x6d\xfc\xbb\x27\xb6\xb3\x6d\x47\x99\xd8\x4c\xf8\x5e\x42\x17\xf0\xf9\xcc\xac\x27\x78\xc7\x66\x97\x94\x21\x36\x2a\x87\xb8\xac\x14\xb2\x83\xd6\x5c\xab\xc6\x5b\xcf\xb2\x89\xeb\xae\x2a\x96\xcd\x4a\xd0\xf3\xd9\x3b\xc4\x0f\x61\x69\xfe\x77\x29\xf4\xed\x14\xfe\xab\x54\xe6\x7f\xa6\xbc\x42\xbf\x98\xaa\x5f\x58\x1d\xe2\x7a\x7d\xe8\xda\xaa\xc1\x44\x98\xa9\xdc\x64\x1f\xeb\xdd\xe9\x35\x08\xbb\xcd\x1b\x56\x6c\x12\x2e\xca\x99\xa2\xf3\xa5\x9b\x89\x0e\xa2\xf0\xfd\xeb\xe4\xf8\x78\x68\x37\x6d\xd0\x71\x9d\x6a\xce\x38\x1f\x36\x4c\x54\x8d\xf3\x8e\x1f\x53\x2d\x63\x5c\xb5\x8c\x31\x8d\x9a\x4c\x17\x77\xc6\x77\x7b\x2f\x1c\xf3\x5f\xb8\xc4\x47\xb8\xab\x1a\x15\x27\x8f\x50\x78\x3d\xab\x99\x0e\x71\xb3\xaf\xaf\xfb\x9a\xf0\xd7\x7f\x35\x8d\xbe\x92\xc6\xbf\x9d\xce\x7c\x29\xed\x7d\xfd\x27\xd2\x75\xf7\x5f\xe0\xb3\xdf\x97\x90\x8e\xb2\x4c\x6f\x36\xa8\x1e\x6c\xe5\xb3\xac\x8a\x21\x46\xbc\x3f\x6d\xd9\xd0\xe2\x3d\xb1\x6c\x94\x97\x2b\xab\x5c\xf3\xaf\x56\x89\xc9\xa6\x96\x1b\x6e\xbf\xc8\xbb\xe4\xbe\x89\x7d\x58\x50\x12\x93\x22\x42\x82\xd5\xbf\x98\xdd\xbb\x09\xed\x7a\x5f\x5c\xdd\xc3\x8d\xfb\xb1\x14\xfa\x68\x0a\x7f\x24\x95\xf9\xa0\x3f\xb4\xac\xa7\x8c\x2a\x61\x62\xcc\xdb\x54\xb1\xef\x1b\x17\xf2\x55\xa8\x01\x5c\x94\xf0\x71\xcf\xb5\x4b\x36\x05\xc5\x2e\xc5\x5b\xbb\xd4\x4a\x65\x54\xb1\x49\x59\xb5\xf5\x0a\x71\xc4\xdc\x37\x57\x15\x55\x73\x8d\x15\xc3\x5d\x65\xf2\xce\x30\xbd\x7f\xe5\xb3\xaf\x73\xc5\x1b\x17\x88\x46\x4d\xdd\x89\x4c\xa6\xcf\xa6\xd0\xcb\x29\xfc\x13\xa9\xcc\x27\xfd\x0a\xfe\xcb\xd4\x55\xa1\x68\x52\x5b\xee\x8b\xf8\x17\xf3\x9a\x10\x47\xb3\x8d\x45\x2e\xf8\xc4\x87\x3b\x5c\x80\xc9\xf5\xcc\x5d\x26\x55\x21\xea\x04\x11\xe2\x15\xd3\xf5\x51\x29\x4c\x46\xe5\xbd\x55\xba\xc2\x57\xcb\x90\xea\xa9\x2c\xf0\x05\x6e\xb5\xbe\x6f\xf3\xd9\x6d\x82\x43\x85\xf6\xe0\xf8\xa7\x87\xd1\x88\x87\xdc\xf8\xd5\x71\xd3\x07\x63\xe3\xdf\xe3\xff\xfd\xf6\x71\x8b\xea\x0e\x7e\xd7\x30\xfe\xf0\x60\x00\xe2\xa8\x5c\xc9\x4c\xdd\x58\x31\xf4\x9a\x5a\x09\x7f\xa3\xea\x6b\x8d\xf3\x54\xcf\x2b\x3a\xb1\x6c\xa2\x31\xa1\x34\xe9\x2b\x12\x43\xfc\xf9\xa1\x60\x97\x1c\xd9\xf6\x50\x8b\xc8\xbe\x32\x4c\xc7\x25\xaa\x9e\xcf\x3d\xc4\x1f\x10\x40\xcf\x07\x78\xfa\x3c\xd5\xe7\x0c\xc7\xed\x75\x8e\x77\x03\xcd\x0b\x5c\x37\x8b\xce\x71\x5c\x37\x85\x4e\xa1\x13\xcd\x70\x5d\x55\xd5\x96\x0d\x93\xd8\xab\x79\xeb\x46\x99\xfd\xe0\xe4\x99\x22\x9a\x5f\x29\xe4\xf9\x90\x3a\xc3\x34\xba\xa6\x64\xd0\xa3\x7a\xbb\xe3\xa9\xde\x5d\x18\xf1\x8a\x09\xb4\x77\x26\x19\xed\x65\xb1\x12\xd0\x3b\x01\xf9\xe6\xa9\x1e\xa1\x7b\xc0\xf4\x80\xe9\x01\xd3\x03\xa6\x07\x4c\x0f\x98\x1e\x30\x3d\x60\x7a\xc0\xf4\x80\xe9\x01\xd3\x03\xa6\x07\x4c\xaf\xcb\x4c\xef\x79\xf4\x1c\x7e\x26\xfb\xd6\x1d\x29\x3c\x68\xa9\xee\x72\x66\x52\xbe\x99\x6d\xe6\x79\x73\xb2\x6d\xa2\xe2\x68\xd4\x22\xa3\x8a\x53\xd3\x96\x59\xeb\x73\x0d\x96\xa8\x55\xc1\x20\x2c\x9b\xf2\x2f\xcd\xee\xf4\x09\x40\x4e\x8a\xf7\x8f\x00\x35\x04\x6a\x08\xd4\xb0\xbf\xa9\xe1\xb7\x86\xd1\x69\xd6\x75\xce\xb8\x46\xa9\xad\x1b\x26\x2f\x84\xa3\x2b\x83\x26\xa2\xc4\x0a\x51\x1d\xe2\xe0\x4f\x0f\xe3\x5f\x18\x44\xaf\x0f\x97\x70\x6d\xa5\x90\x79\xa1\x35\xa8\x38\xc7\x0a\x69\x13\x56\xdc\x23\xb1\x62\x50\x91\x30\x5e\xe4\x6f\x02\xc0\x78\x0b\x80\xf1\xcd\xc9\x80\xf1\x20\xde\x2f\x01\x63\xcc\x88\x92\xc4\x91\x77\x04\x30\x47\x60\x8e\xc0\x1c\x81\x39\x02\x73\x04\xe6\x08\xcc\x11\x98\x23\x30\x47\x60\x8e\xc0\x1c\x81\x39\x02\x73\x04\xe6\x08\xcc\x11\x98\x23\x30\xc7\xdb\x94\x39\xfe\xf5\x33\x68\x8f\x60\x8e\x8e\x4b\x6d\xb5\x4c\x42\xb8\x51\xfe\xa2\x55\x54\xc7\x21\x0e\xfe\xe2\x33\xf8\x5f\xed\x41\x48\xfe\x7a\x6d\xa5\x90\xc9\xad\x1d\x32\xbc\x20\xee\x9c\x66\xcf\xe7\x1e\x64\xf7\xca\x5f\xae\x14\xc2\x97\x7a\x1c\x00\x16\x81\x86\x01\x0d\x2b\x02\x0d\x03\x1a\x06\x34\x0c\x68\x58\xdf\xd0\xb0\x62\xcf\xd0\xb0\xb6\xd7\x64\xc3\x34\xac\x08\x34\x0c\x68\x18\xd0\x30\xa0\x61\x40\xc3\xba\x4f\xc3\x8a\x7d\x8d\x96\x8a\x80\x96\x3a\x87\x96\x8a\xbd\x8e\x96\x8a\x5b\x10\x2d\x95\x16\xd1\x39\xe1\x38\x75\x1a\x9d\xe4\x8e\x53\x47\xd0\x21\x74\xa0\x69\x22\x35\x8f\x3f\xad\x14\xf2\x61\x3a\x34\x67\x38\xc9\xfe\x52\x49\x69\xd6\xde\x9a\xec\x2a\x75\x18\x1f\x94\xae\x52\x51\x10\x26\xbd\xa4\xc2\x55\x8a\x38\x4b\x65\xff\xc5\xce\x08\x13\xbb\x5f\xac\x43\x8a\x1a\xc5\x5f\x6f\x14\x3f\x77\x16\x80\x09\x5e\x75\x16\xcd\xa0\x22\x1e\x5c\xa4\xfa\x6a\x86\xff\x57\x49\xe5\x26\xd0\xbe\xf5\x36\x7c\xf1\x63\x69\xf4\xd1\x34\xfe\x48\x3a\xf3\x41\x5f\xe2\x7c\x3b\x75\x95\xad\xe7\x52\xc4\x8f\x72\x77\x42\x8d\x6d\xe4\x84\x88\x88\x6c\x2b\xc2\xa8\x69\x91\x28\x16\x6b\x33\xa6\xcb\xe5\x95\x29\x53\x31\x4c\xb1\xa1\xa7\xb6\x52\x33\x7d\x26\xa0\x2b\xba\xbd\x7a\xb9\x66\x2a\xba\x61\x13\x36\x2f\x88\xbf\xd1\x64\xeb\x05\x5f\x90\xe5\x4e\xdb\xd3\xab\xe5\xde\x46\x59\xaa\xd9\x5c\x77\xb3\x6c\xaa\x11\x87\xaf\x9c\x72\x1a\x4a\x19\x9f\x57\xae\xf0\x37\x72\x9d\x98\x2f\x75\x93\xca\x98\x32\x55\xa9\x4c\xf2\x75\x51\xb7\x57\x15\xbb\x66\xb2\x3d\x17\x9b\x48\x9e\x32\x20\x8b\x23\x7a\xf6\x0e\x51\xb5\xb0\xd4\xf8\x50\x1a\x7d\x7f\x1a\xbf\x3f\x9d\x79\xaf\xdf\x40\xdf\x4c\x71\x55\xea\x82\x6a\xaa\x65\x62\x8b\x4d\x81\xb0\xd6\x38\x0e\xd5\x0c\xbe\xce\xf9\xea\xb7\xca\xf7\x2f\xd4\x56\x98\x1a\xe4\xae\xfa\x0b\x7f\x55\xbd\xc1\xea\xef\x2e\x13\x87\x78\x53\x9b\x89\x1b\x0f\x8c\x70\x36\xb0\x48\x14\x2e\x54\xb8\xaa\x4d\x6d\xa5\x30\x71\x84\xdd\x6b\xab\x1a\x27\x38\x6c\x97\x2a\x26\x32\x57\x87\x99\xe6\xa2\x1a\xa6\x30\xdd\x70\x75\x33\xb8\x97\xef\x6a\x25\x5f\x62\x9b\x24\x4f\x38\x97\x69\x45\x35\xcb\x79\x6a\x97\xc7\xad\x1b\xe5\xf1\x9a\x69\x68\x54\x27\xe3\xbb\x67\x9d\x79\x56\x4a\x3e\x7b\x57\xf8\x5b\xc3\xa4\xfe\x2f\x53\x68\x5a\x4c\xfd\xe3\x68\x92\x4f\xfd\x03\x68\x03\x23\x10\x3d\xc9\x0a\x29\x70\x87\xcb\xed\xd3\x42\xbd\xdb\x60\x49\xb3\xac\xa4\x09\x5c\x44\xa7\xd1\x8e\x29\x8d\x2d\x24\x1b\x2e\x6a\xe3\xb2\xc8\xa2\x1d\x96\x45\xb9\xdf\x19\x8d\xc8\xa2\xc7\x84\xf6\xab\x68\xb4\xc2\xf6\xb2\x72\x6d\x8a\xc8\xa5\x27\xc4\x2d\xbe\x5c\x9a\xf6\x6f\xed\xa0\x84\x7a\x0a\x5d\x46\xf3\x61\x09\x95\x2b\xa2\xd3\x1b\xf0\xa8\x9d\xe1\x75\xbf\xc4\xc1\xab\x03\x88\x16\x10\x2d\x20\x5a\x40\xb4\x7d\x84\x68\x41\x43\x4b\xd0\xd0\x7a\x87\x61\x7f\x23\x8d\xbe\x9e\xc6\x5f\x4b\x67\x7e\xd7\xef\xaa\xcf\xa6\x9f\x0a\xef\x1a\x0d\x53\x71\xc4\xce\x4f\x59\x24\x4b\xc2\xe0\xeb\xd3\x95\x60\xc9\x92\xb3\x84\x37\x56\x48\x17\x34\xa9\x39\x66\x92\xb2\xca\xbb\x44\x6e\x1c\xc3\x3a\xa3\xe0\xac\xfe\x60\x90\x8a\x81\x51\xad\x12\x9d\x69\xa5\x95\xd5\xc0\x12\x1b\x88\x76\xa3\x32\x2a\xf7\x93\xfc\x73\x95\xb2\xad\x6a\x7c\x9c\x18\x54\xf7\x17\x9e\x60\x71\xe0\x46\x6e\xaf\x5f\x6a\x0e\xab\x64\xb8\xa1\x54\xf6\xa4\xf7\x41\xf2\x25\x4b\x62\xbe\x79\x45\xe4\x45\x3d\xab\x44\x35\x63\xeb\x98\xc5\xbc\x0a\xf3\xbc\x06\x71\xfb\x64\x30\x15\x80\xa9\x00\x4c\x05\x60\x2a\x00\x53\x41\x5f\x9b\x0a\xbe\x94\x46\xaf\xa5\xf1\xab\xe9\xcc\x2b\xfe\x6a\xfb\xf1\xf4\x4c\x28\xa8\xd5\xe2\xd1\xb2\xfe\xd4\x9f\xb7\xa9\xa5\x96\xf9\x3a\x3c\x4f\x2b\x86\xb6\x1a\x71\x14\xf2\xba\x3b\x88\x8a\x65\x1d\x5e\xc8\x1f\xce\x2b\x0b\x42\x8e\x88\x45\xd2\x22\x26\x1b\xa6\xc1\x2a\x42\x14\x6a\x5b\xcb\xaa\xe9\x39\x2e\xd9\x35\x32\xbe\xa4\x56\x3c\xed\x3f\x2b\xae\x66\x95\x25\xc3\x54\x2b\xc6\xdb\x3c\xf1\xbd\x48\x14\x55\xe7\xdc\x9d\x8e\x0b\x0c\xab\x07\xaa\xa5\x28\x7c\xc8\x09\x1e\x12\xfa\x76\x5e\x39\x63\x70\x91\x14\xaa\x38\xb5\x1b\xbf\x2c\xb0\x75\xb8\x42\xdd\xe7\xda\x1f\x75\x97\xf3\xd9\x5d\xa2\x3e\x33\xde\x87\x44\x3d\xa0\xde\x33\x88\xde\x35\x88\xdf\x31\x98\xf9\x8e\xef\x06\xf7\x95\x81\xab\x52\x0e\xb2\x21\xba\x4c\x6f\x2a\x65\xd5\x5e\x54\xcb\x11\xe2\xe0\x2b\x6a\xc4\x5e\xa2\x76\x95\xb5\x45\x6c\x4d\x2f\xd5\xbd\xbc\x79\x45\xb9\x5a\xe3\xe9\x24\x96\xf8\x2a\x83\xe9\x0b\x9a\xa1\x07\x8a\x35\x5f\x1b\xf9\x36\xc7\x6f\x5d\xb6\x38\xc9\x95\xc3\x5b\xfd\xf2\xa1\x66\xf4\xe4\xa6\x6f\x60\xf0\x9d\xdf\xa2\x2f\xcb\x2b\x02\x21\x71\x59\x1c\xd6\x56\x87\xc4\x37\x0c\xb1\x3d\x0f\xff\x2b\x3a\x30\x9c\x63\xca\x50\x51\xd5\x6e\x94\x6d\x5a\x33\x75\x76\x17\xf7\x3a\xe3\x37\xd5\x35\x9c\x50\x56\xa4\x06\x14\x2d\xc4\xfb\x82\x45\xbf\xa4\x63\xca\xd0\x59\x6a\x93\x50\xb1\x8a\xa6\x3a\x9a\xaa\xb3\xaf\x97\xed\x23\xfc\x0c\x79\x79\x8e\x50\xa7\x1b\x0a\x5c\xf2\xcb\xc8\x67\xef\xb1\xea\xc7\x4d\x58\xb7\x01\x4b\x1c\x58\xe2\xfa\xd4\x12\x57\x2a\xa3\x39\x81\xb6\xcf\xa0\x69\x8e\xb6\x4f\xa0\x63\xe8\xe8\x06\xe0\xe5\x82\xab\xba\xb5\x64\x9c\x9c\x8b\xc7\xc9\xf7\xe2\x7b\xc4\x6c\x0e\x24\x6d\x47\xd1\x72\xdb\x23\x45\xf0\x7f\x4a\xa3\x6d\x3c\x47\x2e\xfe\xa5\x34\xfe\xf9\x34\x1a\xd4\xa8\x4d\x32\x99\x32\x71\x43\x9a\xee\xd4\xfc\xac\x2f\x25\x72\xb8\x4c\xf8\xb1\x53\x53\xf3\xb3\x72\xf8\xb4\x11\x4c\x37\x14\x34\xd9\x50\xd0\x64\x2b\x05\x95\x2a\xe8\x4d\x62\x80\x94\xd0\x93\x7c\x80\x14\xd1\x69\x74\x72\x03\x03\x24\xf4\x99\x49\xa3\x04\x7f\xea\xbb\xd1\xdd\x5e\xc2\x61\x93\xea\xc4\xc1\x1f\xfe\x6e\xfc\x7b\x4f\x04\x49\x85\xb3\x6b\xbb\xea\x5f\xa4\x3a\xc9\xbd\x2e\x38\xd7\x8b\xfd\x1b\xfc\xf2\xc1\x2f\x1f\xfc\xf2\xc1\xe8\x03\x46\x1f\x30\xfa\x80\xd1\xa7\x67\x8c\x3e\xbd\x63\xd3\x00\xd8\x0e\xb0\x1d\x60\x3b\xc0\x76\x80\xed\x7d\x0d\xdb\x81\x06\x02\x0d\xec\x53\x1a\xb8\x25\xfd\xf2\xaf\xa2\xe3\x02\x50\x1d\x44\xfb\x39\xa0\x1a\x43\x7b\xd1\x48\xe2\x01\xe7\x17\xa9\x4e\xda\xe2\x8c\x7f\x36\x99\x52\xee\xc6\x8f\xd5\x1f\x8c\xc4\x5e\x1f\x75\xbc\xff\xe9\x1d\x01\xde\xba\xdb\xf7\xba\xe7\x24\x6b\x97\xf8\x67\x07\x58\x96\x40\x4f\xc7\xd0\x51\x74\xb8\xce\xc5\x7e\x08\x3d\xd1\x52\x1b\x82\xd7\x16\xf8\xd5\x6f\xd0\xaf\xfe\xb7\x52\xe8\x88\x98\xba\x05\x34\xce\xa7\xee\x08\x6a\x75\xd8\xa1\x13\xc2\x99\xfe\x10\x3a\x10\x38\xd3\xaf\xe3\xf1\x93\xc2\x83\xfe\x30\x3a\x18\xf2\xa0\x5f\xc7\xf3\x49\x52\xa3\x4d\x52\x21\xc9\xfd\x3e\xf7\xf2\x68\x20\x35\x1e\x8c\xf5\x8f\xe7\x12\x24\x23\x2e\x09\x09\x12\x38\xc5\x77\x40\x96\x80\x33\x3c\x70\x51\xe0\xa2\xc0\x45\x81\x8b\x82\x33\x3c\x38\xc3\x83\x33\x3c\x38\xc3\x03\x9f\x07\x3e\x0f\x7c\x1e\xf8\x3c\xf0\x79\x70\x86\x07\x67\x78\x70\x86\x07\x67\x78\x30\x7f\x81\xf9\xab\x07\xcd\x5f\x3d\xed\x0c\xdf\x26\xa0\xdc\x7e\xc7\xf7\xbf\x1f\x46\xc7\x3c\x5f\xed\x35\x4f\x74\xb4\x89\x8f\x90\x99\x06\x65\xb3\x8f\xb3\x1d\xfc\x1f\x86\xf1\x6b\x83\x01\xc4\xfe\xde\x54\x6b\x47\x3b\x5e\x0e\x4a\x9b\xf6\x4b\x6b\xd3\x51\x8f\x79\x79\xd4\x23\x37\xb7\xf9\x47\x3c\xc6\xbe\x11\x8e\x7c\x8c\x1f\xda\x57\x93\x87\xeb\x01\x3c\x51\x3f\x5c\x63\x9b\x38\x6a\x10\x69\xe5\x2c\x49\x38\xf1\x11\x7c\xe9\xe1\xc4\x47\xb0\x19\x81\xcd\x08\x6c\x46\x7d\x64\x33\x82\x13\x1f\xe1\xc4\x47\x60\xf5\xc0\xea\x81\xd5\x03\xab\xef\x09\x56\x0f\x27\x3e\x6e\x31\xfe\x09\x27\x3e\xc2\x89\x8f\x5b\xcb\xfd\x1f\xff\xf6\x08\x3a\x2d\x4e\x7c\x5c\xe4\xf0\x71\xa5\xb0\x48\x5c\x35\x01\x45\x6a\x36\x35\xaf\xd3\x45\xf9\xe3\xdb\xf1\xf7\x8d\xe0\xff\x31\x88\xee\xe6\x25\x5c\x93\x25\x64\x5e\x96\x24\x32\x8c\x1f\x4d\x4f\x76\x7a\x99\x26\xa6\x6d\x6a\x96\xe8\x62\x5b\xc0\xe3\x68\xa0\x27\x71\x5d\x50\xae\xaa\x4c\xd5\x0a\x14\xc0\xa1\x88\xce\x1d\x2a\x3b\x9f\xcb\xf2\xd7\x15\xd9\x7f\xae\x88\x6f\x08\xe0\xa5\xac\x27\xa0\xca\x46\x54\xf9\x68\x3c\x51\xdc\x81\xef\xe0\x15\x43\xd7\xdf\x94\xcc\x32\xf3\x78\x54\xb2\x4c\x3e\x86\x24\xce\x94\x8d\x1e\x06\x98\xbc\x5b\x00\x50\x02\xa0\x04\x40\x09\x80\x12\x00\x25\x00\x4a\x00\x94\x00\x28\x01\x50\x02\xa0\x04\x40\x09\x80\x12\x00\x65\xb7\x01\xe5\x01\x34\x81\xf7\x65\xf3\x3e\xa0\xbc\x97\x93\x49\x59\x0b\xb9\x7d\xcb\x0e\xb2\x1f\xc3\xd0\x11\xb0\x26\x60\x4d\xc0\x9a\x80\x35\x3b\x88\x35\x3f\xfc\x2c\x1a\x17\x58\x53\xb5\x2c\x87\xe7\xc1\x8d\x47\x99\xba\x4a\xaa\x4c\x19\x74\x1d\xfc\xc7\xcf\xe0\xbf\x7f\x02\x6d\x67\x0f\x5c\x5b\x29\x64\x86\xd6\xce\x91\x3b\xc3\x1f\x5c\x20\x6e\xee\x61\x76\xe3\x94\x65\x39\x61\x6f\x47\xff\x72\x8f\x23\x43\xc8\x9b\x0b\x28\x0d\xf2\xe6\x02\x4a\x03\x94\x06\x28\xad\x8f\x50\x5a\x0f\xa5\x3f\xe8\x19\x94\x06\x71\xf9\x80\xd2\x00\xa5\x01\x4a\x03\x94\x06\x79\x73\x21\x70\xf8\xf6\x21\x4c\x3d\x1f\x38\xbc\x25\xf3\xe6\x3e\x83\xa6\x84\xab\xd5\x24\x3a\xc2\x5d\xad\x26\xd0\x3e\x94\x6f\x9a\xfd\x52\xb5\x2c\x87\xe7\x65\xf4\xb8\x50\x4b\xc9\x73\x2f\x24\xbb\x4e\xe5\xf0\x70\x38\xc0\x53\xba\x51\xb1\xd7\x49\x2f\x2a\xff\x8d\x6b\x65\xc3\xe4\x71\x9f\xd9\x3f\xda\x11\xe0\x2f\xec\xe7\xd0\x0d\x48\xd7\xa3\xe2\xb7\xce\xb3\x2e\x81\xa6\x4e\xa3\x93\xe8\x78\x5d\x5e\xdd\x51\x94\x6b\xbd\x8d\x21\x0b\x1c\x24\xd7\xdd\x60\x72\xdd\xaf\xa7\xd0\xb4\xc8\x71\x7b\x1c\x4d\x86\x72\xdc\xe6\xd1\xba\x46\x60\xd3\x19\x2e\x12\xf0\xee\xe3\x09\x78\x99\xf4\x58\x6f\xb9\x45\x91\xbf\xf7\x18\x3a\x1a\xe4\xef\x5d\x67\x19\xc9\x19\xba\x79\x8e\xdc\x36\x0b\xa1\xdc\xaf\x8d\x06\x42\xe6\x91\xd8\x94\xbb\x81\xc0\x19\x11\xd7\x85\xc0\x09\xe5\xdd\xed\xb8\xe8\x81\x34\xbc\x80\x59\x01\xb3\x02\x66\x05\xcc\x0a\x69\x78\x21\x0d\x2f\xa4\xe1\x85\x34\xbc\x80\xfb\x01\xf7\x03\xee\x07\xdc\x0f\xb8\xbf\x2d\xb8\x1f\xd2\xf0\x42\x1a\x5e\x48\xc3\x0b\x69\x78\xc1\x9a\x06\xd6\xb4\x3e\x4a\xc3\xdb\x1a\x4b\x5e\x8b\x1f\x47\xb2\xf1\x6e\xbd\x48\x12\xfc\x97\x77\x06\xf9\x7e\x9b\xf8\xa4\x33\xd1\x62\x68\x44\xd5\x34\xb6\xcb\xf0\xb2\x6c\x8c\x73\xb8\x86\x7f\xfa\xce\xec\x7b\xb6\x05\xf9\x7e\xa5\xa6\x28\xc9\x1b\xd7\x9f\x16\xc4\xe3\x53\xe2\xf1\xdc\x48\xe4\xf4\x4b\x9f\x9c\x47\xef\x7a\x8a\x3d\xde\x66\x86\x7e\x01\x9d\x47\xb3\x75\xe6\xbb\xa3\xe8\x70\x73\x03\x45\x8d\xb5\xa8\x2b\xcb\x66\x03\x90\xd7\xea\xb2\x90\xbb\xa5\xf7\xa4\x45\x72\x8b\x09\x9e\xdc\x22\xb0\xc8\xf0\xd3\x37\x37\x58\x68\x73\xf3\x4c\x49\x4c\xa1\x69\x34\xc5\xa7\xd0\x2d\xbd\xe4\x92\xb0\xd5\x3c\x89\xce\x06\xb6\x9a\x5b\x29\xd0\x9b\x78\x6a\xf2\x64\x3a\x89\x8f\x7b\x93\x29\x5a\x24\x7b\x93\x41\xe5\xec\x8a\xd4\x76\x3d\xe7\x27\x96\x80\xef\xad\xcd\xf7\x4a\x60\x60\x6d\x62\x60\x3d\x8a\x0e\xe3\x83\xd9\xfd\xbe\xe8\xfe\xae\x70\xe8\x60\x78\x40\xde\x0e\xf1\x83\xf8\x17\x87\xd1\x09\x2f\x1e\xc9\x20\x2f\xba\xc4\xe4\xda\x88\x9c\x86\x41\xee\x77\xad\xe6\xb8\xb4\xea\xa9\x20\x21\xe9\x80\xff\x61\x08\x7f\x6b\x10\xed\x8a\x3c\xce\x16\x80\x77\xb6\x98\xf0\x7d\x9a\x97\xec\x59\x9c\x66\xfc\x92\xdb\x94\xf3\x7d\x1f\x7f\x60\x2a\x5c\xbb\x2b\x85\x66\xef\x84\xac\xef\xf1\x9a\x54\x25\x59\xa0\xcf\xe2\x73\xbe\x76\xd4\x38\x90\xbc\xc4\x49\x4d\xda\x1d\x52\xc1\x43\x78\x18\x64\x5a\x02\xbf\x05\xf0\x5b\x00\xbf\x05\xf0\x5b\x80\x4c\x4b\x90\x69\x09\xec\xc5\x60\x2f\x06\x7b\x31\xd8\x8b\x7b\xdd\x5e\x0c\x19\x8d\x20\xa3\xd1\x56\xb1\x90\x41\x46\xa3\x4e\x64\x34\xfa\x8b\x34\xca\x08\x82\x68\x52\x9d\x04\xe0\x50\xa4\x6b\xc7\x5f\x4a\xe3\xd7\xd2\xe8\x2e\x76\xcd\xcf\xc0\xfe\x86\x32\x71\xa3\x6b\xac\xa8\x7d\x2e\x53\x26\xee\x45\xaa\x13\x99\xe6\x7c\x6a\x7e\xd6\xdb\xd1\x39\xed\xb3\x01\x35\x14\x34\xd9\x50\xd0\x64\x2b\x05\x95\x2c\xf4\xb4\x20\x71\x17\xd1\x1c\x27\x71\x67\xd1\x0c\x2a\x6e\x80\xc4\x85\xbe\xb3\x95\xe8\x3b\xfc\x8f\xc3\xe8\xb0\x68\x72\x47\x5b\x26\x7a\xad\xc2\x14\xe4\x7a\x62\x6b\xd9\x06\xb5\x0d\x77\x55\xab\xa8\x8e\x43\xfc\x94\xf8\xbf\x3c\x8c\xff\x76\x10\xdd\x1d\x3c\x78\x6d\xa5\x90\xf9\x5c\x2b\x29\xf1\xe7\x65\x81\xd3\xac\xc0\x9e\x48\x8c\xff\x08\x7f\xdd\x82\xff\x29\x57\x0a\x91\x3a\x02\xc9\xdd\x40\x52\xfc\xe7\x92\x51\xef\x31\x7c\x54\xa2\xde\x86\xe1\x27\x39\x6f\xa4\x1b\xa2\x96\x71\xe0\xb6\xc0\x6d\x81\xdb\x02\xb7\x05\x6e\x0b\xdc\x16\xb8\x2d\x70\x5b\xe0\xb6\xc0\x6d\x81\xdb\x02\xb7\x05\x6e\xdb\x5d\x6e\x3b\x89\x8e\xe0\x43\xd9\x03\xbe\xaf\xda\x83\x61\x37\xb7\xc8\xfe\xad\xd1\xcf\x0d\x98\x2f\x30\x5f\x60\xbe\x7d\xcc\x7c\x7f\xf1\x39\x74\x30\x21\x56\xc0\x26\x3e\x12\x63\x82\xde\xa6\x4c\xcc\x3a\xf8\x5d\xcf\xe1\x1f\xdf\x13\x44\x09\xec\x5f\x3b\x97\xfd\xe5\xa0\x90\x69\xbf\x90\xdc\x08\x7b\xa8\x3e\x6c\x20\xf6\xd6\x1e\x27\x80\x90\xe3\x1e\x60\x18\xe4\xb8\x07\x18\x06\x30\x0c\x60\x58\x1f\xc1\xb0\x1e\xca\x2d\xd4\x33\x30\x0c\x92\xde\x00\x0c\x03\x18\x06\x30\x0c\x60\x18\xe4\xb8\x87\xac\x1c\xb7\x0f\x7f\xea\xf9\xac\x1c\x5b\x32\xc7\xfd\x32\xba\x20\x3c\xa7\xce\xa2\x19\xee\x39\x75\x12\x1d\x47\x93\x4d\xb3\x16\x68\xd4\x26\xf9\x95\x42\x3e\x96\x11\xb5\x94\xef\x3e\x21\x41\xfd\xf5\xab\xc9\x5e\x53\x07\xf0\x84\xf4\x9a\xca\x66\xa5\x9b\x54\x6c\x7d\x22\xee\x52\xd9\xcf\xed\x0c\x60\xd9\x23\x7e\xe6\xfb\x78\x2e\xb6\x37\x3e\xa1\x46\x67\xc9\x98\x00\x59\x73\xa8\x84\x9e\xac\x4b\xa9\x71\x04\x1d\xda\x58\x8f\x40\x72\x56\xc8\x8e\xbf\xc1\xe4\x0d\xef\x4a\xa3\x59\x21\x19\x8a\xe8\x34\x97\x0c\x93\x68\xc3\xe3\x10\x5d\x14\xf9\x51\xce\xa1\x33\x41\x7e\x94\x5b\x29\xef\x92\x48\x13\xf3\x24\x3a\x1b\x4a\x13\x73\x2b\x05\x6e\x5c\x6c\x89\x0c\xfa\x9d\x12\x5b\xb9\xff\x31\x1a\x88\xad\x5c\x6c\x2e\xfd\x78\x11\x76\x50\xdc\x2b\x44\x58\x5c\x5e\xfd\x6e\x08\x33\xc8\xb1\x0f\x98\x17\x30\x2f\x60\x5e\xc0\xbc\x90\x63\x1f\x72\xec\x43\x8e\x7d\xc8\xb1\x0f\xe6\x06\x30\x37\x80\xb9\x01\xcc\x0d\x60\x6e\x68\x8b\xb9\x01\x72\xec\x43\x8e\x7d\xc8\xb1\x0f\x39\xf6\xc1\x9a\x07\xd6\xbc\x3e\xca\xb1\xdf\x29\xda\xbc\x15\xf3\x2e\xff\xd5\x83\xe8\x94\x97\x77\xd9\x72\xd6\xca\xb9\xef\xaa\x2e\x59\xaa\x55\x98\xbc\xf2\x12\xee\x3b\xbc\x6f\xf0\x67\x1f\xc4\x7f\x97\x0e\xce\xac\x1d\xb6\x89\xaa\x2b\xe2\x9a\x37\xb4\x02\xad\x7b\x41\x96\xb3\x40\xdc\xdc\x13\xec\xce\xfa\xc3\xb2\x43\x37\x88\xbe\x6f\x2f\x55\x2f\xbd\x15\x9d\x12\x23\xf3\x08\x3a\xc4\x47\xe6\x3e\x94\x47\xa3\x89\xa7\x02\x87\xaa\x95\x38\x18\x1f\x8e\x1f\x8c\x77\xe0\xc1\x32\x71\xd1\xf5\x4b\xc9\xe3\x6f\x14\xe7\x1a\xcf\x78\x08\x57\x21\x3c\xee\x32\xbf\x1a\x3a\x96\x7c\xaf\x4d\xac\x8a\xaa\x91\x96\x3a\x60\x58\xde\xdc\xe5\x3e\x28\x16\xd1\x69\x74\xb2\xce\x4c\xbb\xce\x4e\x00\xaa\x07\xc6\xd9\x0d\x1a\x67\x3f\x9e\xba\x75\x11\x30\x23\x4c\xb2\x6c\x55\xf3\x4d\xb2\xdd\x14\x24\x56\xad\x03\x82\xa4\xf8\xb7\x77\x06\x82\xe4\x80\xa5\xda\xae\xc1\xed\x50\x62\x07\xdb\x92\x44\xd9\x63\x89\x34\xf7\x5d\x93\x27\x6f\xac\x2f\x68\x8c\xd7\x60\x2f\x4f\xa8\xf5\x50\xf8\x62\x95\xd8\x65\x12\xbe\xba\x27\x7c\x95\x69\xdf\x2e\x29\x1b\xda\x58\xc3\x7d\x91\x52\xd8\xdf\xab\xf2\x2a\xab\x65\xf1\x22\x9a\x43\xa5\x3a\x59\x36\x89\x8e\x6c\x40\xd5\x99\xe7\xb1\x39\x20\xd7\x12\xe4\xda\x67\x06\xd0\xa7\x07\xf0\xa7\x06\x32\x9f\xf0\x77\xd8\x2f\x0d\xf4\x8f\x5c\xab\xe3\x8b\xac\x9d\xb9\xdd\x96\x33\x70\x36\x38\x83\x20\xbd\xe1\x26\x03\x77\x84\x83\x02\x61\xe6\x57\x2b\xfc\x49\x93\x9a\x63\xe2\x69\x7e\x07\x37\x52\x38\xca\x70\xc9\xa1\xe6\xbc\x88\x56\xbb\xc0\xa6\x85\xfc\x7b\xc1\x9b\x2c\xc1\x8f\x23\xcd\x05\x6e\xf1\xb5\x14\x7a\x35\x85\x5f\x49\x65\xbe\xe0\xef\x56\x3e\x99\x3a\x4b\xd9\xde\xd6\x70\x94\x32\xe5\xcd\x4e\x95\xec\x12\xfb\x29\xab\x4c\x45\xbe\x82\x6f\xf3\x84\xa9\xa3\xe6\x04\x06\xdb\x31\x55\xe3\x1f\xce\xcd\xe0\x15\x43\x93\x0c\x83\x54\x74\x47\xa1\x37\x65\x9b\x0a\x33\xb1\x45\xa8\x55\x21\x79\x45\xbc\x91\x87\x17\x7a\x7d\xc9\xb7\x5b\xb1\x0d\xe0\xbf\x3e\xbb\x8d\x57\x2b\xe2\xf7\xd7\x05\x1d\xb2\x79\x82\x34\x4b\x24\x48\x6b\xb7\xf0\x2f\x1d\x41\x87\xf0\x81\xec\x84\xbf\x7b\x79\x43\x38\x12\x3f\xf4\xd4\x6d\x71\xde\xcc\x1f\xa4\x11\x96\xfb\x9e\x9a\x4b\x1d\x4d\xad\x18\x66\x79\x1c\xbf\x92\xc6\x5f\x48\xa3\x3b\x43\xbf\x65\x32\x65\x8e\xc3\x96\xa8\x5d\xf5\x77\xcb\xaa\xc2\xdb\x35\xf7\x40\x99\xb8\x53\xc1\xbd\x53\xf3\xb3\xe7\xd8\xef\x3d\x98\x23\xd2\x10\x4e\x64\xfb\xb8\x13\x19\x1b\xb1\xa7\xd0\x09\x74\x6c\x63\x39\x22\xf9\x37\x26\x26\x87\xfc\xa3\x37\xa0\x37\xfa\xb1\xd9\x54\x27\xf5\xbb\xc6\x5f\x7e\x03\xfe\x72\x3a\xf0\xce\x7a\x6c\xcd\x5d\xe3\x45\xaa\x93\xdc\x7d\xec\x16\xe9\x55\x4a\x75\xd2\x91\xdd\xe1\x02\x3a\x22\xda\xa9\x80\xc6\x79\x3b\x8d\xa0\x21\xf4\x44\xa2\x5b\x1c\xab\x4f\xe2\x94\x3e\x9b\x3c\x63\x77\xe3\xc7\xea\xb9\x03\x2f\x3a\x72\x2e\xcd\xda\xdb\xcb\xcc\xfb\x77\x04\xad\xfa\x78\xd2\x6e\x90\x37\xec\x1b\xe4\x5d\x9d\x6d\xdb\x22\x3f\xd2\xad\x4e\x53\x6a\xb5\x71\x41\x2d\x82\xed\xde\x06\xb7\x7b\x1f\x48\xdd\xc2\x9c\x3e\x21\xf6\x79\x87\xd0\x81\x60\x9f\xd7\x46\x91\x90\xb0\xc1\x6b\x4d\x62\x34\x91\x13\x81\x20\x29\xfe\xd6\x9d\x81\x48\x18\x6b\x79\x5f\xc7\x65\xc3\xfd\x5c\xdd\xe8\x9c\x64\x80\xfd\x5b\xbf\x09\x2a\xd8\xbf\xc1\xfe\x6d\x93\xf7\x6f\x9d\xd4\xf2\x12\x37\x6e\x6d\x52\x03\x4b\x05\x34\x8e\xc7\xb2\x7b\xfd\x5d\xd7\xae\xf0\x7e\x8d\xdd\xde\xf9\x84\x69\xf8\x1b\x43\xe8\xd1\xa8\xf9\x48\x24\x7d\xd7\x89\x55\xa1\xab\x55\x62\xba\x0e\xfe\xa5\x21\xfc\xb9\xc1\x80\x2b\xae\xb4\x76\x1c\xe7\x8c\x5f\x42\x9b\x0e\xe0\x1c\xb9\x19\x90\xc9\xa0\xf0\x39\xc3\x71\xcf\x52\x7b\xaa\x52\xf1\x69\x25\xe4\x6b\x8f\x19\xd5\x17\x93\x07\xed\x5e\x3c\x12\xa3\x7e\x84\xcf\x28\xf7\x5b\x1d\xce\xd6\x84\xb4\x54\x90\xa3\x1d\xe2\x95\x20\x5e\x09\xe2\x95\x20\x5e\x09\x72\xb4\x43\x8e\x76\x88\x13\x81\x38\x11\x88\x13\x81\x38\x91\x5e\x8c\x13\x81\x3c\xeb\x90\x67\x7d\xab\x78\xc6\x43\x9e\xf5\x4e\xe4\x59\xff\x97\xcf\xa1\x03\x02\xf3\xd9\x8b\xaa\x96\xf7\xf0\x10\x2f\xaa\xfe\xa4\x4d\xad\x52\x73\x5c\xb6\x6f\xa9\x10\x07\xff\xd6\xb3\xf8\xe7\xf7\xa0\x07\xd9\x53\x53\xe1\x87\xfc\x23\x38\x47\xd6\x4e\xbc\x3e\x2d\x0a\xbb\x4c\x2b\x24\x37\xc4\x6e\xbd\x5c\x5f\x92\x3c\xa2\x33\x74\x63\x8f\xe3\x3b\x48\xb6\x0e\x54\x0b\x92\xad\x03\xd5\x02\xaa\x05\x54\xab\x8f\xa8\x56\x0f\x25\x99\xe9\x19\xaa\x05\xd9\x4f\x80\x6a\x01\xd5\x02\xaa\x05\x54\x0b\x92\xad\x43\x7a\x86\xdb\x07\x42\xf5\x7c\x7a\x86\x2d\x99\x6c\x5d\x43\x4f\x0a\xb7\xa7\x29\x74\x8a\xbb\x3d\x1d\x45\x87\xd1\xc1\xa6\x4e\x7b\x9c\x54\x49\xcc\x94\x0f\xe1\xa1\x96\xf2\xac\x1b\xc9\xee\x4e\x67\xf1\x8c\x74\x71\x6a\xca\xc4\xa4\xdf\x53\xe8\xe5\x61\x0f\x3e\x5e\x33\x94\x94\xd2\x3d\xfb\xb3\x3b\xd7\xe2\x67\xf7\xf9\xb9\xd8\xc3\xa8\x6c\x44\xfc\xda\x4d\x58\x26\xd8\xd6\x39\x74\x06\x4d\xd7\x39\x53\xef\x47\x85\x75\x77\x12\x78\x51\x43\xb8\xc7\x06\xc3\x3d\xfe\xdf\x94\x48\xbd\x5e\xe0\xa9\xd7\xfd\xa0\x8d\x83\x68\x23\xe3\x10\x95\x44\xaa\xf4\x69\x34\x15\x4a\x95\xbe\xc1\xb2\x9a\x09\x1d\x91\x4c\x60\x1f\x4f\x26\xc0\xe4\xda\xc6\x8a\x6f\x35\xd7\x7a\x6b\xa2\xad\x05\xc9\x95\x28\xfd\x72\x2f\x8d\xad\x25\xba\x94\xd8\x7c\xec\x61\x31\xb6\x5f\xdc\xd1\x54\x8c\xf9\x0f\x76\x4e\xa0\x41\x0e\x76\xa0\xbf\x40\x7f\x81\xfe\x02\xfd\x85\x1c\xec\x90\x83\x1d\x72\xb0\x43\x0e\x76\xb0\x42\x80\x15\x02\xac\x10\x60\x85\x00\x2b\x44\x5b\xac\x10\x90\x83\x1d\x72\xb0\x43\x0e\x76\xc8\xc1\x0e\x46\x3e\x30\xf2\xf5\x51\x0e\xf6\xee\x51\xe8\xf6\x27\xbd\xf8\xeb\x61\x74\x32\x2e\xe9\x45\x93\xcc\xe9\x9a\x9f\x2d\xde\x26\x2b\x06\x1f\x7c\xf8\x73\xc3\xf8\x57\x43\x39\x31\xfe\x49\x6b\x39\x31\x82\xbc\xf3\x97\x65\x49\x6d\xca\x8d\xb1\xf7\x66\x5c\xd6\xde\xc6\xd7\xcd\x19\x8e\xdb\xe3\xee\xf5\xa5\x1b\xcd\xed\x2c\x6d\x4f\x9b\xe1\x8d\xfc\x2b\xc9\xa3\x79\x3f\x2e\x34\x66\xc4\x68\x6c\xe1\x68\xa6\x3f\xc8\x92\x01\xf1\x04\x90\x25\x03\x2c\x4a\x60\x51\x02\x8b\x12\x58\x94\x20\x4b\x06\x64\xc9\x00\x92\x0f\x24\x1f\x48\x3e\x90\xfc\xde\x23\xf9\x5b\xf0\x14\x04\xc8\xc3\x01\x74\x14\xf2\x70\x6c\x9d\x10\x08\xfc\xae\x11\x74\x46\x90\x47\x8d\x52\x5b\x37\xcc\xd8\x0c\x1c\x6b\xd2\x48\x6e\x4d\x74\xf0\xe7\x87\xf1\xaf\x0f\xa2\xfb\xc2\xc5\xf8\x8e\xb9\x2f\xb4\x46\x23\xe7\x58\x49\x6d\x05\x90\xd3\xa1\xda\x48\x1f\xdf\x80\x46\xf2\xd7\x6d\x0d\x00\xd9\xfd\xf4\xbc\xcf\x26\x03\xc8\x49\x7c\x44\x02\xc8\x98\xb1\x23\x79\x24\x6f\xe3\x98\x18\x15\xe0\x90\xc0\x21\x81\x43\x02\x87\x04\x0e\x09\x1c\x12\x38\x24\x70\x48\xe0\x90\xc0\x21\x81\x43\x02\x87\x04\x0e\x09\x1c\x12\x38\x24\x70\x48\xe0\x90\xfd\xc5\x21\x3f\x34\x8c\x86\x04\x87\x74\x5c\x6a\xab\x65\x12\x20\xc8\x71\xcd\x31\xc2\xc7\xfd\xe2\x6f\x0e\xe1\x6f\xa4\x11\x92\x37\x5e\x5b\x29\x64\x32\xfc\xa8\xdf\xe8\x9e\x76\x7a\x61\x36\x38\xe3\x77\x41\xdc\x7b\xa5\x20\x7f\x6d\xf3\x19\xbf\x6f\x41\x27\x05\xa0\x3b\x8c\x0e\x72\x40\x37\x8e\xc6\xd0\xde\xa6\x09\x17\xbc\x4f\x5c\x29\xe4\x65\x7d\x6e\xe1\x58\xcf\x32\x71\xd1\xf5\xa7\x93\x69\xdd\x04\xde\x27\x69\x5d\xb4\x85\x3d\xc7\x41\x59\x91\xb0\xb7\x60\xe6\xdf\xed\x88\x34\xf3\xc3\xde\xd9\xbf\xf1\x2d\xed\x1d\xfa\xdb\xd9\xc6\x2e\x72\xf8\x59\x97\x11\x66\x7d\xad\x0d\xb1\xc3\x90\x0b\x66\x83\xb9\x60\x3e\x96\xba\xe5\xa9\x3e\x2d\x72\xc9\x1c\x47\x93\x41\x2e\x99\x2e\xca\x0b\x7e\x0c\x70\x6b\xf2\x22\xe6\xf0\xbd\x35\x65\x47\xee\x8f\x5f\x1f\x91\x17\xbb\x64\x0c\x8f\xea\x8b\x88\x07\xc4\x2f\x1d\x96\x10\x9d\x49\xb1\x02\x42\x23\x41\x68\x40\x98\x7f\x57\xc2\xfc\x21\xbe\x13\xe2\x3b\x21\xbe\xb3\x53\xf1\x9d\xa5\x7f\x73\xeb\x2b\xfc\x8c\x48\xf1\x76\x02\x1d\x0b\xa5\x78\x6b\xfb\x12\xdf\x99\x35\xfc\xba\x12\xaf\x39\xec\xc4\xdb\x45\x0b\xa3\xe2\x1f\xdf\x19\x59\xe5\xf7\x34\x1c\xff\x1f\xbf\x3d\x10\xe7\xfe\x77\x6e\xe9\x87\x73\xff\xfb\x4d\xe1\x80\x73\xff\xe1\xdc\xff\x4d\x3e\xf7\xbf\xf3\xe4\xa7\x33\x68\xe7\xfa\xa3\xf1\x62\x7e\x07\xbe\x83\x7f\x35\x2a\x1d\x40\x13\x78\x5f\x36\xef\x43\xff\x7b\xf9\x34\x92\x73\x5a\x16\x99\x1d\x64\x3f\x76\x12\xe4\xe3\x1f\x1b\x41\x85\x71\xd5\x32\xc6\x57\x0a\x4d\x1d\x10\x8d\xaa\xe1\xda\x7c\x96\x7a\x88\xf0\xcf\x87\xf1\x9f\xa4\xd1\x76\x8d\xda\x1e\xb8\x6a\xe0\x83\x73\xec\xa9\xcb\xec\xa9\xdc\x23\xec\xf2\x34\xb5\x49\x38\x56\x39\xb8\xbe\xb9\xb0\x90\x7d\x03\x1b\x2f\x41\x7d\x6e\x15\x16\xce\x25\x8f\xa8\x11\x3c\x14\xa3\x38\x64\xb3\x9e\x57\x5f\x50\x97\xcc\xcb\x3b\x82\x76\x56\xe2\x01\x61\xa8\xa9\x1f\x93\x77\x74\xab\xb5\xd7\x4d\x0b\x1b\x9b\x1b\xd6\x61\xa0\x85\x5d\xa2\x85\x31\x73\x7d\xfd\xb4\xb0\xad\x02\x83\xd3\xc2\xb6\x0a\x8c\xdc\x3f\xdb\x15\x08\x8c\x7b\x7d\x42\x18\x92\x11\x72\x2b\xd7\x35\x11\x01\xb8\x10\x70\x21\xe0\x42\xc0\x85\x80\x0b\x01\x17\xae\x1b\x17\x7e\x3e\xd5\xe6\x9c\x58\x97\x05\x3c\x3c\x8f\x66\x43\xf0\xb0\xc3\x79\xb6\x5a\x5b\xe0\xd7\x58\xd4\x23\x5b\xcb\x64\x82\xf8\x8d\x3b\x03\x15\x60\x24\x01\x1f\x86\x14\x83\x47\x2d\x11\xd3\xd5\x79\xbd\x00\x58\x62\xbf\x69\x23\xc0\x12\x81\x25\x6e\x2d\x96\xb8\x81\x7d\x5e\x12\xf4\x6b\xef\x42\x50\x3a\x8c\x0e\xe2\xfd\xd9\x82\x8f\x10\x1f\x08\x23\xc4\xe0\xa1\x46\x8a\xb8\xf5\x1c\x8e\xf1\x2f\xe7\xd0\x69\xe1\xc0\x48\x5e\x74\x89\xc9\x7d\x4d\xfd\xf8\xe9\x26\xe0\xd2\x30\xcb\x36\x13\x48\x3e\xb6\xfc\x87\x11\xfc\xcf\x07\x10\x0e\x4a\xf0\x23\xa8\xe3\x3c\x1c\x67\xc5\xe3\xb9\x3d\xec\xda\x19\xff\x99\x86\x38\x67\x79\x5f\x9b\x31\xa6\x8a\xce\x8a\xd1\x7a\x0a\x9d\xe0\xa3\x95\x8d\xda\xfd\x4d\x47\x6b\xf0\x4d\xfe\x51\x53\xb2\x5e\xb7\x8a\x33\xd7\x95\x2a\x31\xa8\x86\x1c\xbb\x5e\x25\x1a\x42\x94\x33\x7f\xb8\x23\xb6\x27\x9a\x38\x41\x7a\x9d\x31\x22\x2f\x77\xbb\x3f\x8a\xb3\xe8\x1c\x3a\x53\xa7\x31\x6c\xac\x43\x40\x59\x00\xe0\xb9\x41\xe0\xf9\x72\xaa\x6d\x52\xe1\xbc\x00\x9f\x33\xa8\x18\x80\xcf\x8e\x89\x98\x0e\xc9\x90\x04\xb0\x9a\xfb\xe8\xae\x58\x11\x73\x8f\x47\x45\x4d\x5f\xac\x0c\x8b\x9f\xba\x2e\x55\x80\x8d\x02\x1b\x05\x36\x0a\x6c\x14\xd8\x28\xb0\xd1\x8d\xb0\xd1\x6e\xd2\xcc\xf6\x82\x58\x4f\x35\x48\xa4\x99\x2d\x2a\x0f\x09\xaa\x42\xa3\x6e\x51\x7c\xf7\x5d\xb1\xda\x41\x92\xbf\xa5\xa7\x32\x0c\xf1\x3d\x7d\x37\x35\x06\xa0\xa6\xfd\xa6\xa7\x00\x35\x05\x6a\xba\xc9\xd4\xb4\x7b\x1c\xaa\x53\x9b\xc4\x5b\x73\xc5\x94\xe5\xde\x16\x10\xf5\xa5\x11\x34\x25\x20\xaa\x50\x47\x12\x4f\xc2\xb1\xa8\xae\x1b\x8e\x5d\xe3\xd3\x67\xb1\xa6\x97\x89\xeb\xe0\x9f\x1f\xc6\xbf\x31\x88\x76\x8a\x22\xae\xad\x14\x32\xff\xb4\xb5\xf4\x93\xf3\x54\x9f\xf1\x0b\x2b\xf2\xc2\xda\x94\x8c\x32\xcf\x1f\x10\x0a\x52\xd8\x74\x19\xf3\x46\xc8\x47\x19\x3f\xf9\xde\x92\x3c\xf9\x0e\xe1\x03\x72\xf2\x89\xae\x97\x13\x2f\xa6\x91\xe1\x4c\x1c\xc8\x45\x09\xb9\x28\x21\x17\x25\xe4\xa2\x84\x5c\x94\x90\x8b\xd2\x85\x5c\x94\x90\x8b\x12\x72\x51\x42\x2e\x4a\xc8\x45\x09\xb9\x28\x21\x17\x25\xe4\xa2\x84\x5c\x94\x90\x8b\xb2\x8f\x73\x51\x7e\x65\x08\xbd\xc1\x0b\x39\x17\xf4\x91\x98\xba\x45\x0d\xd3\x75\xf0\xe7\x87\xf0\x67\x06\x83\xe0\x85\x5a\x6b\x64\xf1\x8c\xf7\x7c\x9b\x78\xe2\xf0\xcd\x20\x10\xc2\x2f\x7b\xce\x70\xdc\xb3\xd4\x9e\xaa\x54\x7c\xc0\xd8\x3e\xdb\xde\x6d\x44\x12\xcf\x27\x93\xc4\x61\xbc\xa7\xde\xc7\xd9\x6f\x66\x60\x87\xc0\x0e\x81\x1d\x02\x3b\x04\x76\x08\xec\x10\xd8\x21\xb0\x43\x60\x87\xc0\x0e\x81\x1d\x02\x3b\x04\x76\xd8\xf3\xec\x10\xc8\x1e\x90\x3d\x20\x7b\x7d\x4c\xf6\xfe\x00\xa1\x7d\xc2\xbf\x50\xad\xb1\x19\xef\xca\x62\xea\xcf\xbb\xe6\x5b\x19\xb6\x5d\x20\x37\x1d\xfc\xe3\x28\xfb\x83\xdb\xd0\x03\xd1\x27\x7c\x6f\xfc\xfb\xc4\xaa\xa1\xa8\xca\x53\xec\xa1\xcb\xfc\xa1\xdc\x1e\xf1\xeb\x54\xe4\x19\xe9\x80\x1f\xba\xaf\xcd\xc1\x7a\x6f\x42\x4c\xc2\x45\xdd\xdf\x4f\xa0\x63\x4d\x7d\x61\xeb\x1a\xc1\xf3\x87\x0d\x55\xb0\xf4\x03\x69\x74\x51\x10\xba\x73\xe8\x0c\x27\x74\xa7\xd0\xad\x15\x89\x16\x44\x60\xe7\x1c\x2a\x05\x81\x9d\xb7\x5c\xe8\x53\x22\xce\xe4\x02\x3a\x1f\x8a\x33\xb9\xe5\x52\x93\x50\x22\x49\x46\x89\x45\x7c\x5a\xa2\xc4\xd8\x21\x27\xe9\x62\xf8\xa5\x8d\x0e\xc2\x8f\xc4\x43\xc6\xed\x78\x9b\x45\x1d\x17\x95\x20\x4c\x61\xed\x30\x85\x12\xc4\x6b\x37\x89\xd7\x6e\xbb\x07\xf7\xd7\x9f\x45\x47\x65\x1a\x0c\x0e\xaf\xeb\x25\x6b\x13\x3f\x6e\x71\x33\xfe\x91\x67\xf1\xf7\xed\x41\xaf\x13\xff\xf2\x45\xec\x6e\xb1\x21\xb7\xe5\x56\xc2\xd3\x35\xe9\x92\xc2\x26\x8f\xc2\xa9\x7f\x8e\x2f\x86\xfc\xcf\xc6\x40\x27\xfe\x73\x8f\x9b\x42\x8a\x60\x24\x00\x23\x41\x11\x8c\x04\x60\x24\x00\x23\x01\x18\x09\xfa\xc6\x48\x50\xec\x19\x23\x41\xdb\x6b\xb2\x61\x23\x41\x11\x8c\x04\x60\x24\x00\x23\x01\x18\x09\xc0\x48\xd0\x7d\x23\x41\xb1\xaf\x99\x7e\x11\x98\x7e\xe7\x98\x7e\xb1\xd7\x99\x7e\x71\x0b\x32\xfd\xd2\x35\x71\xdc\xe2\x3e\x9e\xee\x27\x7d\xe9\x3c\x3e\x88\xf6\xa3\x42\xf3\xfc\x0f\x02\x4b\x79\xb4\x97\xa3\xa1\x39\xc3\x49\x76\x1b\x6d\x0e\x61\xb9\x93\xe7\xf5\xab\xc9\x2c\xf8\x00\x9e\xf0\xb2\x43\x84\xe1\x98\xe7\x61\xca\xbd\x57\x1b\xe8\x6f\xf6\x3b\x3b\x1a\x88\xd8\xeb\x3d\xa3\x83\x29\xe9\x57\x56\xfc\xd0\x15\xfe\x25\x70\xd5\x34\x9a\x42\xa7\xea\x6c\x0d\xe3\x68\x6c\x5d\xed\x0e\xf9\x75\x20\xd1\xe8\x06\xc1\xf5\x37\x53\xcd\xd3\x80\x9d\x16\xf2\xe0\x28\x3a\xcc\xe5\x41\x01\xad\x77\x5c\xa2\x33\xc2\x44\x75\x12\x1d\x0f\x4c\x54\x1b\x28\xe6\xac\x30\x4a\x9d\x42\x27\x42\x46\xa9\xf5\x97\x93\x2c\x81\xb8\x19\xa8\x63\x12\x28\xf7\x5f\x47\x1b\x24\x50\x46\xe6\x9c\x0b\x25\xf0\xa3\x4b\x52\x18\x8d\xca\x5c\xa5\x61\x61\x34\xed\xdf\xd7\x59\xb1\xd4\x99\x7c\xa5\x80\x65\x01\xcb\x02\x96\x05\x2c\xdb\x3f\x58\x16\x34\xb3\x04\xcd\xac\x77\xb8\x35\xe4\x8a\xee\x4a\xae\x68\x30\x0f\x80\x79\x00\xcc\x03\x60\x1e\x00\xf3\x40\x5f\x9b\x07\xe0\xc8\x00\x38\x32\x00\x8e\x0c\xe8\xd4\x91\x01\x60\x7d\x03\xeb\x5b\xbf\x5a\xdf\x4a\xe5\x36\x9f\x24\x9c\x64\xd1\xea\x14\x2f\xbe\x9e\x8b\x07\xd5\xf7\x62\x79\xb0\x55\x20\xc2\xd1\x16\xcc\xe7\x85\x3f\x3d\x82\xa6\x85\x8f\xfb\x52\x85\xde\x64\xea\x98\x4d\x2b\x79\xdf\xfb\xb7\xde\xe5\x5d\xa4\x10\x62\xb7\x3a\xda\x32\xa9\xaa\xfe\x69\x8f\xdf\x18\xc6\xff\x66\x1b\x7a\x28\x54\xc8\x94\x57\x86\xcf\xd9\x3f\x9b\x92\xa3\x31\x94\x56\xc8\xf4\xb4\x1d\xcf\x03\xfe\x6c\x85\xde\x5c\xe0\x65\xb7\x25\xbf\xd0\x68\xb0\xb9\xe1\x1b\x38\xa9\x0a\xb3\xfd\x51\xb0\x6b\x1b\x8a\xf0\x88\x50\xd9\xf9\x5c\x8e\xbf\xee\x6c\xcc\x67\x49\x63\x40\x50\xdf\x1e\x77\xca\xdf\x94\xfc\x44\xcd\x8f\x03\xb8\x29\x0e\x69\xbd\x91\x3c\x6f\x9f\xc4\x67\xc5\x14\x0d\x9a\xba\xe9\x91\x33\x6b\x0d\x62\xc8\x5d\x04\x61\x09\x90\xbb\x08\xec\x5f\x60\xff\x02\xfb\x57\x3f\xd9\xbf\x20\x77\x11\xe4\x2e\x02\xbb\x03\xd8\x1d\xc0\xee\x00\x76\x87\x9e\xb0\x3b\x94\x0e\xa3\x83\x78\x7f\xb6\xe0\x73\x92\x07\xc2\x67\xc0\x05\xbb\xbc\xc6\x63\xe0\x20\xe9\x11\x24\x3d\xda\x22\x88\x16\x92\x1e\x75\x22\xe9\xd1\xab\xc3\x68\x3c\x9a\xce\xbc\x49\x12\x0e\xb1\x39\xac\xaa\x96\x83\x3f\x3c\x8c\x3f\xb5\xfe\x34\xe7\xd3\xbc\x80\x0b\xaa\xd5\xa6\x34\xe7\xd9\x50\x9a\xf3\xc0\x6d\xd8\x7f\x0b\x1c\x95\x18\x0f\x10\x5b\xc9\x49\xde\x62\x16\xf4\x70\xae\xf3\xfa\x8c\xe8\x7e\x3f\x00\x24\x04\x48\x08\x90\x10\x20\x21\x40\x42\x80\x84\x00\x09\x01\x12\x02\x24\x04\x48\x08\x90\x10\x20\x21\x40\x42\x38\x1c\x11\x68\x22\xd0\x44\xa0\x89\xb7\x11\x4d\xfc\xa5\x11\x34\x23\x53\xa8\x5b\x06\x79\xd1\x25\x26\xef\xad\xc0\xe9\x51\x32\x46\xad\xe6\xb8\xb4\xea\x95\x18\xc6\x5d\xd2\xfb\xf1\xaf\x87\xf1\x8f\x6e\x43\xbb\x22\xa5\x5c\x5b\x29\x64\x7e\xb1\x15\x8f\xc7\x69\x5e\xba\xb7\xc3\x9c\xf1\x4b\xef\x09\xff\xc7\x51\xfe\xba\xa9\xf0\x87\x5d\x29\x34\xab\x31\x00\xcc\x46\x80\x59\x49\x66\x93\xb3\xf8\x9c\x97\x56\x3d\x66\x18\x7a\x84\xb2\x49\x9b\x47\x8f\x70\x4c\xf2\xb7\x04\xba\x09\x74\x13\xe8\x26\xd0\x4d\xa0\x9b\x40\x37\x81\x6e\x02\xdd\x04\xba\x09\x74\x13\xe8\x26\xd0\x4d\xa0\x9b\x5d\xa6\x9b\x67\xd0\x34\x9e\xca\x9e\xf2\xe9\xe6\xe3\x61\x17\xc8\x66\x7b\x3d\x70\x88\x04\x84\x09\x08\x13\x10\x66\x08\x61\xfe\xe6\x08\x3a\xe9\x21\x4c\xcb\x49\x74\x8b\x74\x5c\xd5\x25\x4b\xb5\x0a\x9b\xc1\x1e\xbc\x7c\xef\x08\xfe\x93\x41\xb4\x9d\x3d\x7f\x6d\xa5\x90\xf9\xa9\x56\x98\xe5\x82\x2c\x67\x81\xb8\x3d\x81\x29\x15\x89\x29\x2d\x27\xec\x5d\x19\xaa\x25\xa0\xc9\x46\x34\x79\x29\x19\x4d\x8e\xe2\x9c\x8f\x26\x2d\x47\xa2\xc8\x50\xb3\x02\x7d\x04\xfa\x08\xf4\x11\xe8\x23\xd0\x47\xa0\x8f\x40\x1f\x81\x3e\x02\x7d\x04\xfa\x08\xf4\x11\xe8\x23\xd0\xc7\x9e\xa6\x8f\x47\xd0\x21\x7c\x20\x3b\xe1\xd3\xc7\x37\x84\xe9\x63\x68\x7b\xd7\x08\x1c\xc1\x2b\x13\x90\x26\x20\x4d\x40\x9a\x1d\x44\x9a\x5f\x4d\xa3\xfb\x05\xd2\x74\x5c\x6a\xab\x65\xe2\xf9\x63\xe2\x5f\x4a\xe3\x9f\x4f\xa3\xed\xf2\xe7\x4c\xa6\xcc\x13\x15\x2f\x51\xbb\xea\x37\xa0\xaa\x70\x5e\x95\xc3\x65\xe2\x2e\x88\xfb\xa6\xe6\x67\xcf\xb1\xdf\xda\x77\x3a\x53\x43\x41\x93\x0d\x05\x4d\xb6\x52\x50\xc9\x68\x7e\xf0\xd7\x45\x81\x03\xcf\xa1\x33\x1c\x07\x9e\x42\x27\xd0\xb1\x0d\xe0\x40\xef\xe3\x25\xf3\xc3\x1f\x1c\x42\xbb\x45\xe3\x6a\x94\xda\xba\x61\xf2\x0a\x86\x3c\x5e\x79\xc6\x6f\x07\xff\xd9\x1e\xfc\xf5\x01\xf4\xfa\xf0\x4d\xd7\x56\x0a\x99\xdd\x62\x4b\x60\x4b\x65\xc6\x5b\xed\x3c\x2c\x3c\xc7\x1e\xce\x0d\xb1\x9b\xa6\x43\x4f\x5e\x29\xf0\x0b\x67\xa9\x3d\x55\xa9\xf8\x78\xd6\xe9\x75\x26\xfb\xbc\x38\x3b\x6d\x1f\x3f\x3b\x8d\x75\xc2\x21\x74\x00\x4d\x34\x3d\xee\x2c\xd2\xa0\x2b\x85\x3c\xff\xe6\x96\x8e\x63\x7c\x73\x32\x88\x3d\x88\xf7\x4b\x10\x1b\xd3\x6f\x92\xcb\xf2\x17\x46\x89\x6c\xc2\x41\x8f\x00\x64\x01\xc8\x02\x90\x05\x20\x0b\x40\x16\x80\x2c\x00\x59\x00\xb2\x00\x64\x01\xc8\x02\x90\x05\x20\x0b\x40\xb6\xcb\x40\x16\xa0\x27\x40\x4f\x80\x9e\x7d\x0c\x3d\x7f\xe2\x19\xa4\xc4\x42\xcf\x95\xc2\xb8\xe6\x18\x26\xd5\x89\x83\xdf\xfd\x0c\xfe\x87\x27\x10\x92\x77\x5c\x5b\x29\x64\x9e\x58\x9b\xc7\x4d\x2f\xcc\x5e\xa4\x3a\xc9\xdd\xc7\x6e\x93\x38\xf4\x4a\x41\xfe\xda\xe3\xf8\xad\x08\x6c\x0a\xd8\x54\x11\xd8\x14\xb0\x29\x60\x53\xc0\xa6\xfa\x86\x4d\xf5\xd0\x61\xfc\x3d\xc3\xa6\xe0\x94\x78\x60\x53\xc0\xa6\x80\x4d\x01\x9b\xda\x8c\x53\xe2\xfb\x1a\x25\xc1\x31\xd6\xfd\x7c\x8c\x75\x71\x0b\xa2\xa4\xd2\xb3\xa8\x28\xdc\x96\x8e\xa1\xa3\xdc\x6d\x69\x3f\x2a\xa0\xf1\xa6\x6e\x4b\x1e\x6f\x5a\x29\xe4\x25\x18\x6a\xc9\x67\xe9\xe9\x64\x9f\xa5\x09\xbc\x4f\xe6\xae\x13\xe5\xa2\x98\x13\x38\xa2\xb4\x2b\xd1\x61\x29\xfb\xdf\x76\x44\xf8\xd7\x2e\xb1\xfa\x28\xaa\x8f\xba\x1e\x10\xbf\x74\x0c\x76\x09\x36\xc5\xa3\x73\xf1\xe0\x22\xd5\x57\x33\xfc\xbf\x4a\x2a\x37\x86\xf6\xae\xa3\x91\x8b\x1f\x4b\xa3\x8f\xa6\xf1\x47\xd2\x99\x0f\xfa\x82\xe5\xdb\xa9\xab\x6c\xd9\x96\x92\x7c\x94\x9f\x51\xa3\xb1\xfd\x9a\x90\x04\x91\xdd\x43\x98\x28\x2d\x12\xc5\x62\x4d\xcb\x54\xb6\xbc\x32\x65\x2a\x86\x29\xf6\xed\xd4\x56\x6a\xa6\xbf\xf5\xd7\x15\xdd\x5e\xbd\x5c\x33\x15\xdd\xb0\x09\x1b\xfe\xc4\xdf\x4f\xb2\x65\x81\xaf\xbb\x72\x43\xed\xa9\xcf\x72\x0b\xa3\x2c\xd5\x6c\xae\xa2\x59\x36\xd5\x88\xc3\x17\x48\x39\xdb\xa4\x28\xcf\x2b\x57\xf8\x1b\xb9\xea\xcb\x57\xb4\x49\x65\x4c\x99\xaa\x54\x26\xf9\xf2\xa7\xdb\xab\x8a\x5d\x33\xd9\xd6\x8a\xcd\x17\x6f\xcd\x97\xc5\x11\x3d\x7b\x87\xa8\x5a\x58\x38\x7c\x28\x8d\xbe\x3f\x8d\xdf\x9f\xce\xbc\xd7\x6f\xa0\x6f\xa6\xb8\xc6\x74\x41\x35\xd5\x32\xb1\x85\xee\x2f\x3c\xcf\x1d\x87\x6a\x06\x5f\xce\x7c\x2d\x5b\xe5\xdb\x14\x6a\x2b\x4c\xdb\x71\x57\xfd\xf5\xbd\xaa\xde\x60\xf5\x77\x97\x89\x43\xbc\x19\xcc\xa4\x8a\xc7\x3f\x38\x02\x58\x24\x0a\x97\x1d\x5c\xa3\xa6\xb6\x52\x98\x38\xc2\xee\xb5\x55\x8d\x83\x1a\xb6\x19\x15\xf3\x95\x6b\xbd\x4c\x41\x51\x0d\x53\x58\x64\xb8\x56\x19\xdc\xcb\x37\xaf\x12\x23\xb1\xbd\x90\x27\x83\xcb\xb4\xa2\x9a\xe5\x3c\xb5\xcb\xe3\xd6\x8d\xf2\x78\xcd\x34\x34\xaa\x93\xf1\xdd\xb3\xce\x3c\x2b\x25\x9f\xbd\x2b\xfc\xad\x61\x00\xff\x8d\x14\x3a\x29\x66\xf8\x61\x74\x90\xcf\xf0\x71\xb4\xbe\xc1\x87\xa6\xd9\xf3\x05\x7c\x1c\x4d\xa2\xed\xd3\x42\x81\x5b\x7f\x21\x33\xac\x90\x09\x7e\xb2\xff\x8e\x29\x8d\xad\x12\x1b\x29\xa5\x3d\x82\x26\x5e\x9c\x34\x17\x3f\x6b\x08\x1a\x8b\x3a\x2e\xca\xfd\xda\x68\x44\xd0\x3c\x24\x14\x5a\x25\x38\xee\x9f\x1f\x12\x25\x85\x8e\x54\x77\x03\xa1\xe3\xdf\xd5\x19\xf1\xf3\x14\xba\x8c\xe6\xc3\xe2\x27\x57\x44\xa7\x37\xe0\x1d\x3c\xc3\xab\x7d\x89\x13\x54\x07\x58\x2b\xb0\x56\x60\xad\xc0\x5a\xfb\x88\xb5\x82\x0e\x96\xa0\x83\xf5\x0e\x8c\xfe\x46\x1a\x7d\x3d\x8d\xbf\x96\xce\xfc\xae\xdf\x55\x9f\x4d\x3f\x15\xde\xfe\x19\xa6\xe2\x88\x2d\x9c\xb2\x48\x96\x84\xe5\xd6\xc7\x24\xc1\x92\x25\x67\x09\x6f\xac\x90\xb6\x67\x52\x73\xcc\x24\x65\x95\x77\x89\xdc\x01\x86\xb5\x42\x01\x4c\xfd\xc1\x20\xd5\x01\xa3\x5a\x25\x3a\xd3\x3b\x2b\xab\x81\x49\x35\x10\xed\x46\x65\x54\x6e\x0c\xf9\xe7\x2a\x65\x5b\xd5\xf8\x38\x31\xa8\xee\x2f\x3c\xc1\xe2\xc0\xad\xd5\x5e\xbf\xd4\x1c\x56\xc9\x70\x43\xa9\xec\x49\xef\x83\xe4\x4b\x96\xc4\x7c\xf3\x8a\xc8\x8b\x7a\x56\x89\x6a\xc6\xd6\x31\x8b\x79\x15\xe6\x79\x0d\xe2\x36\xbc\xc0\xfc\x81\xf9\x03\xf3\x07\xe6\x0f\xcc\xbf\xaf\x99\xff\x97\xd2\xe8\xb5\x34\x7e\x35\x9d\x79\xc5\x5f\x6d\x3f\x9e\x9e\x09\xe5\xf9\xb3\x78\x9c\xa8\x3f\xf5\xe7\x6d\x6a\xa9\x65\xbe\x0e\xcf\xd3\x8a\xa1\xad\x46\x3c\x7e\xbc\xee\x0e\x12\x05\xb2\x0e\x2f\xe4\x0f\xe7\x95\x05\x21\x47\xc4\x22\x69\x11\x93\x0d\xd3\x60\x15\x21\x0a\xb5\xad\x65\xd5\xf4\x3c\x90\xec\x1a\x19\x5f\x52\x2b\x9e\xf6\x9f\x15\x57\xb3\xca\x92\x61\xaa\x15\xe3\x6d\x9e\xf8\x5e\x24\x8a\xaa\x73\x80\x4e\xc7\x05\x4f\xd5\x03\xd5\x52\x14\x3e\xe4\x04\x0f\x09\x7d\x3b\xaf\x9c\x31\xb8\x48\x0a\x55\x9c\xda\x8d\x5f\x16\x18\x2d\x5c\xa1\xee\x73\xed\x8f\xba\xcb\xf9\xec\x2e\x51\x9f\x19\xef\x43\xa2\xae\x4c\xef\x19\x44\xef\x1a\xc4\xef\x18\xcc\x7c\xc7\xf7\x67\xfb\xca\xc0\x55\x29\x07\xd9\x10\x5d\xa6\x37\x95\xb2\x6a\x2f\xaa\xe5\x08\x67\xf0\x15\x35\x62\x2f\x51\xbb\xca\xda\x22\xb6\xa6\x97\xea\x5e\xde\xbc\xa2\x5c\xad\xf1\x74\x12\x4b\x7c\x95\xc1\xf4\x05\xcd\xd0\x03\xc5\x9a\xaf\x8d\x7c\x9b\xe3\xb7\xae\xc3\x03\xae\xf9\x55\x6f\xf5\xcb\x87\x9a\xd1\x93\x9b\xbe\xa5\xc0\xf7\x62\x8b\xbe\x2c\xaf\x08\x5c\xc4\x65\x71\x58\x5b\x1d\x12\xdf\x30\xc4\xf6\x3c\xfc\xaf\xe8\xc0\x70\x8e\x29\x43\x45\x55\xbb\x51\xb6\x69\xcd\xd4\xd9\x5d\xdc\x7d\x8c\xdf\x54\xd7\x70\x42\x59\x91\x1a\x50\xb4\x10\xef\x0b\x16\xfd\x92\x8e\x29\x43\x67\xa9\x4d\x42\xc5\x2a\x9a\xea\x68\xaa\xce\xbe\x5e\xb6\x8f\x70\x18\xe4\xe5\x39\x42\x9d\x6e\x28\x70\xc9\x2f\x23\x9f\xbd\xc7\xaa\x1f\x37\x61\xdd\x06\x4c\x6a\x60\x52\xeb\x53\x93\x5a\xa9\x8c\xe6\x04\xbc\x3e\x83\xa6\x39\xbc\x3e\x81\x8e\xa1\xa3\x1b\x80\x97\x0b\xae\xea\xd6\x9c\x36\xf1\xe3\x64\xd3\x54\x94\x25\x5f\xcf\xc5\xf3\xe3\x7b\xf1\x3d\x42\x48\x04\x02\x1c\xb5\x3d\xba\x03\x7f\x6b\x0f\x7a\x90\x0d\x25\xee\x1d\x4e\xab\x16\x35\x99\x1c\xe2\xed\x41\x1c\xfc\xe5\x3d\xf8\x3f\x0e\xa0\xed\x1a\xb5\x39\xba\x7e\x5c\xec\xd2\xea\x5d\xc3\xbd\xc7\x44\x33\xe6\x1e\x14\x49\x1b\x6c\x4e\xaf\x23\x97\x7a\xdc\x4f\xbc\xb4\x88\xce\x89\x01\x75\x1a\x9d\xe4\x03\xea\x08\x3a\x84\x0e\xac\x91\xa6\xc1\x16\xf6\x87\xe8\x57\xb6\x64\xf4\x4c\xb0\x4e\x5e\x7f\x53\xf2\x58\xcb\xe3\xd1\x98\xb1\x96\xcd\x7a\xe3\x2b\x5a\x2b\xc8\xd0\x00\x5e\xf0\x90\xa1\x01\x2c\x33\x60\x99\x01\xcb\x4c\x3f\x59\x66\x20\x43\x03\x64\x68\x00\x22\x0e\x44\x1c\x88\x38\x10\xf1\x9e\x20\xe2\x90\xa1\x01\x32\x34\x6c\x15\x06\x08\x19\x1a\x3a\x91\xa1\xe1\x1b\x43\xe8\xd1\xb8\x93\xb6\x6c\xc2\xa1\x15\x9b\xa9\xf8\x97\x86\xf0\xe7\x42\x47\x69\xad\xc8\xf5\xcb\xd4\x8d\x15\x43\xaf\xa9\x95\xc8\xa1\x5a\xbe\xae\x78\x59\x94\xd0\xae\xb3\xb4\xf2\xb9\x91\xd0\x69\x58\x41\xe1\x73\x86\xe3\x6e\xb5\x14\xac\x9b\x71\x2c\xd6\xc5\x64\x88\xb7\x17\x8f\x34\x1e\x8b\x15\xb4\x74\xd4\xd3\x78\x77\x3c\x34\xbc\x0b\x23\xfe\xa1\x90\x88\x15\x30\x1f\x60\x3e\xc0\x7c\x80\xf9\x00\xf3\x01\xe6\x03\xcc\x07\x98\x0f\x30\x1f\x60\x3e\xc0\x7c\x80\xf9\x00\xf3\x01\xe6\x03\xcc\x07\x98\xaf\xab\x98\xef\x57\x1e\x44\xc7\x05\xe6\x5b\xe4\x78\x6f\xa5\xd0\xec\x2c\x7d\xcd\xa6\xe6\x75\xba\xe8\x9d\xa3\x3f\x2e\xfc\xef\xf0\x4b\x0f\xe2\x3f\x4f\xa3\x1d\xfc\x69\xee\x7e\x67\x13\x55\x57\xc4\x45\xaf\x91\x83\x15\x77\xda\xa6\x66\x89\x2e\xe6\xb2\xec\xae\x22\x7b\x26\x7c\x80\xbd\xbc\xda\x66\x3f\x3c\x81\xd6\xae\xa2\xe3\x02\xad\x1d\x44\xfb\x39\x5a\x1b\x43\x7b\xd1\x48\x53\xb7\x39\xfe\x3d\xdc\x6f\x4e\xd4\x29\x11\xa3\x3d\x1c\x8f\xbd\xee\xc0\x83\x65\xe2\xa2\xeb\x73\xc9\x94\x6d\x04\x0f\x49\xca\xc6\x5f\xee\x79\xc8\xc9\xf7\x87\x19\x5b\xe6\x73\x3b\x42\x2d\x3e\x64\x13\xab\xa2\x6a\x24\xb1\xd1\x9f\x90\x37\x76\xb3\xdd\x8b\xfc\x24\xaf\xba\xd4\x21\xeb\x69\x78\x08\x5a\x85\xc4\x21\x1b\x4c\x1c\xf2\xaf\x53\xb7\x38\xe7\xa7\x44\xda\x90\x49\x74\x24\x48\x1b\xd2\x35\xb1\x61\xd5\xda\x2d\x36\x8a\xff\xcf\x9d\x21\xb1\xb1\xcf\x52\x6d\xb6\x49\x65\x1b\x3b\xbe\xa4\x24\xca\x8f\xdd\x16\x67\xb9\x5d\x92\x1e\x6f\xac\x2f\x68\x8c\xbf\x7e\x2f\x3f\x80\xf0\xa1\xf0\xc5\x2a\xb1\xcb\x24\x7c\x75\x4f\xf8\x2a\x53\x31\x5d\x52\x36\xb4\xb1\x86\xfb\x22\xa5\xb0\xbf\x57\xe5\x55\x56\xcb\xe2\x45\x34\x87\x4a\x75\x92\x6b\x12\x1d\xd9\x80\x35\x66\x9e\xb7\x1b\x08\xb2\x04\x41\xf6\x99\x01\xf4\xe9\x01\xfc\xa9\x81\xcc\x27\x7c\xa3\xd0\x4b\x03\xfd\x23\xc8\xea\xb0\x01\x6b\x67\x8e\xc1\x39\xda\x62\x83\x33\x30\x86\x0d\x37\x19\xb8\x23\x9c\x07\x0b\xab\x89\x5a\xe1\x4f\x9a\xd4\x1c\x13\x4f\xf3\x3b\xb8\xd5\xcc\x51\x86\x4b\x0e\x35\xe7\x85\x55\xe8\x02\x9b\x16\xf2\xef\x05\x6f\xb2\x04\x3f\x8e\x34\x97\xb0\xc5\xd7\x52\xe8\xd5\x14\x7e\x25\x95\xf9\x82\xaf\xf1\x7e\x32\x75\x96\xb2\x0d\x9c\xe1\x28\x65\xca\x9b\x9d\x2a\xd9\x25\xf6\x53\x56\x99\x8a\x7c\x05\xdf\xcb\x88\xd0\xfd\x9a\x13\xf0\xef\x31\x55\xe3\x1f\xce\xad\x0a\x15\x43\x93\x31\x79\xa4\xa2\x3b\x0a\xbd\x29\xdb\x54\x50\x77\x8b\x50\xab\x42\xf2\x8a\x78\x23\x37\xe3\x79\x7d\xc9\xf7\x14\xb1\x0d\xe0\xbf\x3e\xbb\x8d\x57\x2b\x62\x92\xea\xb4\x96\xf8\x68\xbc\xb8\xdf\x81\xef\xe0\x95\x6b\xb3\xc0\x2f\x1d\x40\x13\x78\x5f\x36\xef\x1f\x5f\x7d\x6f\xf8\xe0\x6b\xf9\xc4\xed\x70\xe8\x35\xfe\xbe\x0c\x9a\x8a\x6e\x63\x16\x89\xab\xae\x77\x2f\xf3\x6b\x0f\xe2\x97\x06\xd0\xdd\xde\x12\xc9\x8b\x68\x71\x43\x33\x14\xda\xd0\xf0\xe7\xba\xb3\xab\x79\x46\xe8\x28\xfb\xb8\x8e\xc2\xc6\xeb\x04\xda\x87\xf2\x89\xe3\x95\xd7\xb0\x5d\x5b\x9b\x75\x47\x01\xf1\xb7\xa3\x35\xc6\x70\xe6\xb7\x76\xd4\xf7\x42\xcb\x9b\x9c\x5c\x74\x93\xd3\xbd\xbe\x28\xce\xa0\x22\x3a\x5d\xa7\x2f\xac\xbb\x33\x40\x4b\x80\xed\xce\x06\xb7\x3b\x3f\x9a\x6a\x87\x30\x38\x2b\xf6\x3c\x6c\xdb\xee\xef\x79\xba\x2b\x54\xf8\xc6\xa7\x35\xa1\xd2\xda\x3a\x28\xe4\x4d\xf1\x1d\x77\xd5\x0b\x95\xf5\x6f\x81\x86\xc3\x5b\xa0\xee\xc8\x16\xd8\x07\xf5\x9b\x84\x83\x7d\x10\xec\x83\x36\x79\x1f\xd4\x15\xbd\xb2\xfd\x32\x3e\x71\x7f\xd5\x3f\x3b\xa2\xff\x34\x8c\xf2\x5e\xce\x04\xe1\xb9\xdd\x64\x2f\x44\x4c\xdd\xa2\x86\xe9\x3a\xf8\xc3\xc3\xf8\x53\x83\x41\x22\x85\x5a\x6b\xee\xdc\x67\xbc\xe7\xdb\xe4\xcd\x9d\xe5\x0f\x88\xd4\x0c\xc1\xe2\xea\xbf\x65\xce\x70\x5c\x70\xe3\x6e\x9c\x4c\xad\xb8\x5d\x5f\x3f\x9f\x3c\xe3\x86\xf1\x9e\xfa\x24\x0d\x7e\xdb\x47\xe1\x02\xf8\x70\x83\x0f\x37\xf8\x70\x83\x0f\x37\xf8\x70\x83\x0f\x37\xf8\x70\x83\x0f\x37\xf8\x70\x83\x0f\x37\xf8\x70\x83\x0f\x37\xf8\x70\x77\xd7\x87\x7b\xeb\xc1\x09\xf0\x12\x07\x2f\x71\xf0\x12\xdf\x42\x5e\xe2\x9f\x1b\x41\x07\x5a\x82\x89\x6c\xda\x19\xfe\x8f\x6f\xc7\x7f\x37\x8c\xbf\x12\x42\x8a\x2f\xa7\x64\xab\x87\x40\xa2\xe9\x49\x4a\x2f\x55\xeb\x82\x28\xa3\x2d\x38\x71\x34\xd0\x8a\xb8\xe6\x27\xd7\x50\xa6\x58\x05\xea\xde\x50\x44\xc3\x0e\x95\x9d\xcf\x3d\x14\x0b\x23\x65\x0d\x01\x43\xae\xc7\xc1\xe9\xa6\x70\x70\x9a\x4d\x46\x90\x7b\xf0\xe3\xf5\x08\x52\xb6\x38\x00\x48\x00\x90\x00\x20\x01\x40\x02\x80\x04\x00\x09\x00\x12\x00\x24\x00\x48\x00\x90\x00\x20\x01\x40\x02\x80\xdc\x4c\x00\xb9\xa6\x4f\x95\xdc\xb9\xdd\x0e\x3e\x55\x80\x2d\x01\x5b\x02\xb6\xdc\x42\xd8\xf2\x2f\x86\x50\x36\x2e\x2a\x4c\x20\x4c\x2f\x08\x0c\xff\xda\x10\xfe\xf9\xc1\xfa\xd8\x00\xa7\x35\xef\x47\xe9\x32\xda\x26\xdf\xc7\xd1\x9b\xf5\xe1\x05\xb2\x7c\x48\x66\xdb\x46\x2f\xc8\xd6\xfc\x8e\x13\x5c\x8d\x23\x6e\xc9\x80\x22\x01\x45\x02\x8a\x04\x14\x09\x28\x12\x50\x24\xa0\x48\x40\x91\x80\x22\x01\x45\x02\x8a\x04\x14\x09\x28\x12\xf2\xd9\x02\xf2\x03\xe4\x07\xc8\xaf\x5b\xc8\xef\xa3\xc3\xe8\xa0\x40\x7e\x8e\xb6\x4c\xf4\x5a\x85\x69\x6b\xe2\x48\xfb\x3a\xfc\x67\xd9\x06\xb5\x0d\x77\x55\xab\xa8\x8e\x43\x1c\xfc\xf5\x21\xfc\x9f\x07\x11\x0e\x1e\xf3\x51\xe0\x6a\x6b\x28\x70\x5e\x16\x38\xcd\x0a\x6c\x13\x10\x14\x0f\x2c\xf8\x75\x92\x54\x30\xf2\x2a\x88\x88\x8e\x67\x81\x5a\x32\xe6\x3b\x8d\x4f\x4a\x8e\xd7\x30\x5a\xa4\xe3\x61\xa4\xa5\x63\x12\x0e\xc0\x69\x57\x40\x07\x81\x0e\x02\x1d\x04\x3a\x08\x74\x10\xe8\x20\xd0\x41\xa0\x83\x40\x07\x81\x0e\x02\x1d\x04\x3a\x08\x74\x10\xe8\x20\xd0\x41\xa0\x83\xbd\x44\x07\xbf\x37\x87\x2e\x0a\x3a\x68\x12\xf7\x26\xb5\x6f\x44\xe8\xe0\xda\xa1\xcd\xf2\x09\x8b\x56\x0c\xcd\x08\x22\x9c\x5f\x1e\xc1\xef\xdc\x86\xee\x0e\xca\xbb\xb6\x52\xc8\x7c\xae\x95\x38\xe7\x8b\xe2\x91\x79\x56\xe0\x6a\x4f\x44\x3b\x0f\xf3\xd7\x5d\xf4\x3f\x25\x1c\xf3\x1c\xa9\x2d\xe0\xc6\x0d\x44\x3e\x3f\x97\xcc\x23\x8f\xe1\xa3\x92\x47\x36\x8c\x4f\xc9\x23\x23\xdd\x00\xe1\xd0\x40\x19\x81\x32\x02\x65\x04\xca\x08\x94\x11\x28\x23\x50\x46\xa0\x8c\x40\x19\x81\x32\x02\x65\x04\xca\xb8\x99\x94\x71\x12\x1d\xc1\x87\xb2\x07\xfc\xc0\xe6\x07\xc3\xe1\xd0\x91\xfd\x1b\x04\x45\x03\x03\x05\x06\x0a\x0c\xb4\xab\x0c\xf4\x37\x9f\x41\x4f\x78\xb9\x1c\x9b\x1d\x09\xc3\x89\x10\xfe\xc4\x33\xf8\x9b\x4f\x04\xc9\x1b\x77\x0b\x8d\xd5\x96\x6b\xad\x27\x8c\x3d\x9c\xc9\x29\x59\xee\x41\x76\x53\xc3\xe1\x2d\xec\x52\x8f\x33\xc3\x22\xe0\x33\xc0\x67\x45\xc0\x67\x80\xcf\x00\x9f\x01\x3e\xeb\x1b\x7c\x56\xec\x19\x7c\xd6\xf6\x9a\x6c\x18\x9f\x15\x01\x9f\x01\x3e\x03\x7c\x06\xf8\x0c\xf0\x59\xf7\xf1\x59\xb1\xaf\x79\x52\x11\x78\x52\xe7\x78\x52\xb1\xd7\x79\x52\x71\x0b\xf2\xa4\xd2\x9b\xd1\x09\xe1\x6b\x75\x08\x1d\xe0\xbe\x56\x79\x34\x8a\x72\x4d\x8f\x8a\xd6\xa8\x4d\xf2\x2b\x85\x3c\x67\x42\x73\x86\x93\xec\x58\x75\x2e\xd9\x6f\xea\x71\x9c\x6d\x38\xb4\x96\x3b\x6d\x85\x1d\xa4\xae\x3f\x12\xef\xa1\xb5\x1d\x6f\xe3\x61\x9a\xd9\x2f\xec\x08\x60\xd7\xeb\xc5\x3a\xa3\xa8\xa6\x04\x5b\x6f\x14\x3f\x74\x16\x6d\x09\x12\x75\x1c\x4d\xa2\x23\x75\x07\xee\x0f\xa3\x3d\xad\x35\x29\x1c\xaf\x9f\x74\xbc\xfe\x87\xd2\xe8\xfb\xd3\xf8\xfd\xe9\xcc\x7b\xfd\x06\xfa\x66\xaa\x7f\x8e\xd7\x6f\x7a\x8a\x7d\xe9\x3f\xa7\xd0\x51\x31\x95\x27\xd0\x3e\x3e\x95\x73\xa8\xe5\x71\x87\x4e\xb2\x47\x0b\xf8\x30\x3a\x88\xb6\x4f\x0b\x25\x6d\x5d\xcf\x9f\x62\xcf\x4f\xe0\x23\xe8\x10\xda\x31\xa5\xb1\x45\x60\x9d\x05\x24\xc9\x91\xe6\xd3\xdf\xa2\x8e\x8b\xda\x26\x67\x72\x9f\x1f\x0d\xe4\x48\x46\x68\xa6\x8a\x46\x2b\x6c\x9f\x29\xd7\x0d\x21\x52\x9e\x10\xd7\x84\x48\x99\xf6\x6f\xe8\xac\x70\x79\x0a\x5d\x46\xf3\x61\xe1\x92\x2b\xa2\xd3\x1b\xf0\x8c\x9d\xe1\x75\xbf\xc4\x69\xa8\x03\xdc\x14\xb8\x29\x70\x53\xe0\xa6\x7d\xc4\x4d\x41\xcd\x4a\x50\xb3\x7a\x07\x2c\x7f\x23\x8d\xbe\x9e\xc6\x5f\x4b\x67\x7e\xd7\xef\xaa\xcf\xa6\x9f\x0a\x6f\xe5\x0c\x53\x71\xc4\x76\x4c\x59\x24\x4b\xc2\x0a\xeb\x23\x8f\x60\xc9\x92\xb3\x84\x37\x56\x48\xa1\x33\xa9\x39\x66\x92\xb2\xca\xbb\x44\xee\xe6\xc2\x8a\x9f\x80\x9f\xfe\x60\x90\x1a\x81\x51\xad\x12\x9d\xa9\x96\x95\xd5\xc0\x3c\x1a\x88\x76\xa3\x32\x2a\x37\x79\xfc\x73\x95\xb2\xad\x6a\x7c\x9c\x18\x54\xf7\x17\x9e\x60\x71\xe0\x96\x67\xaf\x5f\x6a\x0e\xab\x64\xb8\xa1\x54\xf6\xa4\xf7\x41\xf2\x25\x4b\x62\xbe\x79\x45\xe4\x45\x3d\xab\x44\x35\x63\xeb\x98\xc5\xbc\x0a\xf3\xbc\x06\x71\x9b\x57\xe0\xf7\xc0\xef\x81\xdf\x03\xbf\x07\x7e\xdf\xd7\xfc\xfe\x4b\x69\xf4\x5a\x1a\xbf\x9a\xce\xbc\xe2\xaf\xb6\x1f\x4f\xcf\x84\x82\x5b\xad\x0a\x51\x1d\xe2\x4f\xfd\x79\x9b\x5a\x6a\x99\xaf\xc3\xc2\x2b\x36\xe2\xbd\xe3\x75\x77\x10\x1d\xcb\x3a\xbc\x90\x3f\x9c\x57\x16\x84\x1c\x11\x8b\xa4\x45\x4c\x36\x4c\x83\x55\x84\x28\xd4\xb6\x96\x55\xd3\xf3\x26\xb2\x6b\x64\x7c\x49\xad\x78\xda\x7f\x56\x5c\xcd\x2a\x4b\x86\xa9\x56\x8c\xb7\x79\xe2\x7b\x91\x28\xaa\xce\x61\x38\x1d\x17\x6c\x54\x0f\x54\x4b\x51\xf8\x90\x13\x3c\x24\xf4\xed\xbc\x72\xc6\xe0\x22\x29\x54\x71\x6a\x37\x7e\x59\x60\x80\x70\x85\xba\xcf\xb5\x3f\xea\x2e\xe7\xb3\xbb\x44\x7d\x66\xbc\x0f\x89\xba\x25\xbd\x67\x10\xbd\x6b\x10\xbf\x63\x30\xf3\x1d\xdf\x37\xed\x2b\x03\x57\xa5\x1c\x64\x43\x74\x99\xde\x54\xca\xaa\xbd\xa8\x96\x23\xa8\xc1\x57\xd4\x88\xbd\x44\xed\x2a\x6b\x8b\xd8\x9a\x5e\xaa\x7b\x79\xf3\x8a\x72\xb5\xc6\xd3\x49\x2c\xf1\x55\x06\xd3\x17\x34\x43\x0f\x14\x6b\xbe\x36\xf2\x6d\x8e\xdf\xba\x6c\x71\x92\x2b\x87\xb7\xfa\xe5\x43\xcd\xe8\xc9\x4d\x9f\xfa\xfb\x1e\x69\xd1\x97\xe5\x15\xc1\x86\xb8\x2c\x0e\x6b\xab\x43\xe2\x1b\x86\xd8\x9e\x87\xff\x15\x1d\x18\xce\x31\x65\xa8\xa8\x6a\x37\xca\x36\xad\x99\x3a\xbb\x8b\xbb\x82\xf1\x9b\xea\x1a\x4e\x28\x2b\x52\x03\x8a\x16\xe2\x7d\xc1\xa2\x5f\xd2\x31\x65\xe8\x2c\xb5\x49\xa8\x58\x45\x53\x1d\x4d\xd5\xd9\xd7\xcb\xf6\x11\xce\x7f\xbc\x3c\x47\xa8\xd3\x0d\x05\x2e\xf9\x65\xe4\xb3\xf7\x58\xf5\xe3\x26\xac\xdb\x80\x79\x0c\xcc\x63\x7d\x6a\x1e\x2b\x95\x9b\x32\x5e\x34\x27\xc0\xf5\x19\x34\xcd\xc1\xf5\x09\x74\x0c\x1d\xdd\x00\xd5\x5c\x70\x55\xb7\xe6\x78\xc4\x38\x17\x4f\x8c\xef\xc5\xf7\x88\xd9\x1c\x48\xda\xf6\xd1\xe3\x2d\x18\x02\x82\xbf\x7e\x27\x1a\x4f\x70\x29\xb7\xa8\xee\xa5\xcc\x18\x27\x2f\x12\x0d\xff\xbb\x3b\xf1\xfb\xd3\x21\xe7\x72\x8d\x9a\x26\xfb\xcc\x73\x67\x9e\x0a\x3c\xac\x39\xc4\x24\x1a\xcf\xae\x4b\xf5\xdc\x63\xf2\x26\x41\xcc\xcf\x11\x37\x40\xe5\xf3\x54\x3f\xf3\x22\xd1\x26\x06\x72\xe3\x39\x91\x03\xe2\x30\x7a\x48\x8c\x89\xfb\xd1\xbd\x7c\x4c\xdc\x8d\xee\xfc\xa9\xd4\x0e\x24\xeb\x9d\x68\x2e\x78\x2c\xbe\xf3\x11\xde\x21\x6b\x81\xae\xcf\x27\xf7\xf9\x18\xde\x5b\xdf\xe7\xb2\xaa\x12\x9d\x47\x3a\x3f\xfb\x81\x50\x93\x3c\xee\x35\xc9\xfc\xa5\x85\xe6\x6d\x92\x8d\xb4\xc9\x3c\x75\x3a\xda\x28\x6d\xff\xe2\x16\x9a\xb9\x54\x43\x0e\x7e\x21\x43\xbd\xf1\x7a\x79\x9a\x56\xab\x6c\x98\x1b\x8e\x54\x19\xaa\x94\x5b\x58\xc4\xaf\xb2\x7d\x6a\x2e\xc9\xb3\xad\xdd\x8a\xa2\xda\xb6\xba\x9a\x57\x2e\x52\xd7\xbb\x20\xf6\xd6\x6c\xe3\xa0\x38\xcb\xa4\x52\xc9\x67\xb7\xcb\xa7\xc3\xe6\xb0\x8f\xa4\xd0\x07\x53\xf8\x03\xa9\xcc\xf7\x05\xe2\x70\x5a\x18\xe4\x08\x93\x59\x12\xc9\x06\xef\x93\x1b\x3f\x5e\x50\x14\x5b\x84\x8d\x79\xec\x59\x2e\x1a\x6d\x0e\x7a\xf8\x25\x6a\x92\xf0\x65\x31\x05\x2d\xaa\xe7\xb3\x3b\xfd\x9f\xc3\x55\x3b\x86\x8e\xe2\xc3\xd9\x83\xbe\x8c\xc8\x84\x43\xcc\xa2\xad\xbd\x19\x31\x66\x2f\x20\x8a\xab\x99\x1b\x5e\xab\x5d\xbc\x4c\x04\xb2\x14\x34\xc3\x55\x4d\x5d\xb5\x3d\x9b\x40\xe0\x9b\x20\xbf\x59\x2e\x35\x86\x23\x17\x98\x70\x3b\xf2\xdd\x6d\xf6\x0e\xc7\xd5\x89\x6d\x47\xbc\x10\xea\x5e\x79\x29\xfe\x95\x86\xc9\x84\xda\xba\x5e\xc9\xf7\x0c\xf9\xec\x36\xc7\xd5\x0d\x33\xf2\x4a\x1b\x59\xd8\xcc\x54\x12\x5e\x29\x05\xe9\x06\x3f\x93\xd6\xdc\xc8\x3b\x5f\x44\x2b\xd8\xcd\xd8\xde\x3b\xdf\xfc\xd4\x53\x6f\xe1\xa3\xc9\xae\x91\x7a\xdc\xac\x2a\x4c\x6c\xfb\x9b\x9a\x4a\x85\x8a\xed\x93\xb7\x92\x73\x21\xd2\xf4\x7b\x07\x98\x88\x0f\x87\x0d\x7d\x72\x14\x9d\x17\xa9\x93\xd4\x9a\x4b\x1d\x4d\xad\x18\x66\x79\x0d\x81\xcf\x05\x07\x1b\xbb\x15\x8b\xea\xde\x23\xc4\xf6\xf3\x26\xfd\xce\x5e\xfc\x33\x03\xe8\x75\xa1\xc2\x98\xcc\xcb\xd9\x44\xd5\xeb\xd0\xe6\x93\x7e\x49\xf3\x54\x9f\xf2\x4b\xca\x4d\xb0\x7b\xa7\x82\xe7\xc3\x6e\x19\x4d\x9e\x69\xaf\x2d\xb5\x54\x45\x97\x85\x34\x3d\x8f\x66\xb9\x34\x9d\x46\x53\xe8\x54\x53\x73\x75\xe8\x5b\x99\xae\xd1\xa4\x8e\x89\x32\xf8\xe1\x78\x89\x79\x07\x1e\x2c\x13\x17\x5d\x5f\x4c\x16\xd1\xa7\xf0\x09\x29\xa2\x43\x55\x92\xb2\xba\x59\xad\xc2\x42\x3b\xf3\xc9\x9d\x0d\x3d\x37\x66\x13\xab\xa2\x6a\xa4\xc5\xce\x3b\x28\x6f\xdf\xcc\xfe\x2b\x3e\x8d\x16\xd0\x9b\xea\x1c\x6d\x6e\xbd\x03\xc1\x34\x04\x1e\x38\x1b\xf4\xc0\xf9\xd5\x14\xba\x2a\xdc\x68\xe6\xd1\xc5\xc0\x8d\xa6\xa3\x62\xa5\x13\x32\x2c\x59\x54\x59\xb5\xee\x88\xaa\xdc\x2f\xec\x6a\x10\x55\x1e\xdb\x51\x9b\x4a\xa7\x03\xe2\x8e\x4d\x15\x4e\x9d\x71\xd4\x01\xd9\x94\x20\x9b\xc0\x58\xdc\x15\x63\x31\x58\x09\xc0\x4a\x00\x56\x82\x4e\x59\x09\x4a\x9f\x4f\xb5\x97\x88\x0a\x25\x61\x82\x2b\x09\x81\x77\xee\x2d\x96\x99\xb4\xd1\x51\xe2\xb5\x87\x9d\x78\xbb\x68\xa6\xae\x28\x10\xc5\x7f\x7f\x57\x83\x02\x71\xc8\x52\x6d\xd7\xe0\xde\x94\xc2\x0e\xdb\xe2\xa6\x67\xbf\xa5\xba\xda\xf2\x66\x69\x15\x6f\xac\x2f\x68\x8c\x57\x67\x2f\xfb\x73\xf2\xa1\xf0\xc5\x2a\xb1\xcb\x24\x7c\x75\x4f\xf8\xaa\xe3\xda\xaa\x4b\xca\x86\x36\xd6\x70\x5f\xa4\x14\xf6\xf7\xaa\xbc\xca\x6a\x59\xbc\x88\xe6\x50\xa9\x6e\xbb\x35\x89\x8e\x6c\x60\x00\xcd\xf3\x0c\x0e\xa0\xcb\x24\xe8\x32\x9f\x19\x40\x9f\x1e\xc0\x9f\x1a\xc8\x7c\xc2\x5f\x10\x5e\x1a\xe8\x9f\x7d\x56\x9d\xd3\x0c\x6b\x67\xee\x8c\xcc\x1d\xbb\xd8\xe0\x0c\xa0\xfa\x70\x93\x81\x3b\xc2\xd7\x35\xe1\xbb\xae\x56\xf8\x93\x4c\x81\x13\x4f\xf3\x3b\xb8\x32\xe5\x28\xc3\x25\x87\x9a\xf3\x22\xa7\xc9\x05\x36\x2d\xe4\xdf\x0b\xde\x64\x09\x7e\x1c\x69\xbe\x01\x2c\xbe\x96\x42\xaf\xa6\xf0\x2b\xa9\xcc\x17\x7c\xe6\xfc\xc9\xd4\x59\x6a\x6b\x5c\xcf\x2b\x53\xde\xec\x54\xc9\x2e\xb1\x9f\xb2\xca\x54\xe4\x2b\xb8\xed\x52\xa8\x64\x35\x27\xf0\x42\x1e\x53\x35\xfe\xe1\xdc\xb7\xbb\x62\x68\x72\xc9\x25\x15\xdd\x51\xe8\x4d\xd9\xa6\xc2\xf7\xd9\x22\xd4\xaa\x90\xbc\x22\xde\xc8\x93\xd0\x78\x7d\xc9\x6d\x88\xb1\x0d\xe0\xbf\x3e\xbb\x8d\x57\x2b\x02\x2c\x37\x07\x91\x35\xcf\xc5\x6d\x89\x5c\xdc\x5d\x58\x38\x4a\x33\xa8\x88\x4f\x67\x4f\xfa\x9c\x7d\x77\x18\xd2\x37\x29\xe1\x76\xc8\x08\x87\xbf\xba\x07\xdd\x2b\x50\xf1\x22\x4f\xa8\xbf\x52\x18\xbf\x4e\x17\x1d\xfc\xcb\x7b\xf0\xbf\x1f\x40\x3b\xf8\x8f\x6c\x19\x7d\x6c\xed\x84\x52\x25\xba\x98\x7b\x84\xdd\x52\x64\x97\xaf\x14\x4a\x74\xf1\x2c\xb5\xa7\x2a\x15\x7f\xcd\x74\x7a\x3c\xa7\x54\xe9\x2a\x3a\x2e\x46\xff\x41\xb4\x9f\x8f\xfe\x31\xb4\x17\x8d\x34\x1d\xfd\xbc\x65\xd8\xb8\x2f\xd1\xc5\x96\x42\x23\x13\x22\x1a\xaf\x3f\x99\x3c\xcc\x9f\xc0\xbb\xe5\x30\xe7\x6f\x97\x03\xbc\x44\x17\x21\xb9\x3c\x64\xc7\x82\xe4\xf2\x10\xe5\x05\x51\x5e\x10\xe5\xd5\xaf\x51\x5e\x90\x5c\x1e\x92\xcb\x43\x74\x0d\x44\xd7\x40\x74\x0d\x44\xd7\xf4\x44\x74\x0d\xa4\x6f\x87\xf4\xed\x5b\x25\x9e\x00\xd2\xb7\x77\x22\x7d\xfb\xdf\x0f\xa3\x63\x9e\xaf\xfd\x9a\xe7\x55\x7a\xf6\x0c\xd3\x5d\xa1\x95\x5a\x95\x68\x15\xd5\xa8\x3a\xf8\x3f\x0c\xe3\xd7\x06\x03\x27\xf3\xef\x95\x27\x55\x1a\xa6\x6e\xac\x18\x7a\x4d\xad\x44\x0e\xad\xf4\x15\xc9\x79\xbf\xb4\x2b\xbc\xb4\x69\x56\x5a\x5b\x0e\xad\xcc\xe7\xf2\xfc\x81\xfa\xcc\x5a\xb1\x6f\x9c\x33\x9c\x5e\x4f\x24\xbf\x29\x87\x4f\x5e\x4d\x06\x7d\x07\xf0\x44\x98\xe8\x35\xf8\xe8\xc7\x35\x37\xba\xbe\x3b\x9e\x30\xde\x85\x11\xff\x62\x8e\x19\x01\x0e\x02\x1c\x04\x38\x08\x70\x10\xe0\x20\xc0\x41\x80\x83\x00\x07\x01\x0e\x02\x1c\x04\x38\x08\x70\x10\xe0\x60\x97\xe1\xe0\xd6\xf3\x15\x02\xfc\x08\xf8\x11\xf0\xe3\x16\xc2\x8f\xaf\x8d\xa1\x69\x19\x06\x6e\x19\xe4\x45\x97\x98\xbc\xb7\x38\xcd\x32\xe8\xf8\x4a\x61\x91\xb8\x6a\x61\x5c\xab\x39\x2e\xad\x7a\x05\x86\xc9\x97\x0c\xff\x7e\xf7\x18\xfe\x9f\x03\xe8\xfe\x48\x21\xd7\xe4\xd3\x99\xbd\x31\x51\xe0\xd3\xbc\x44\x6f\x53\x39\xe3\x97\x98\xdb\xc7\xc3\xc0\xc3\xe5\x5c\x11\xc5\x34\x7b\xa2\xcd\x41\xe0\x1f\x48\x35\x0f\xad\xbc\x29\x40\xa0\x85\x4c\x0e\x02\x97\xd1\x12\xd2\x9b\x81\xc0\xa0\xfe\x63\x3e\x8d\x09\x98\x60\xb4\xb5\x65\x43\xe5\x9b\x7d\x62\x8b\xa1\xe2\x2f\x24\x53\xc3\x8b\x78\xce\xf3\x82\x8d\xe9\x6f\xc9\x0e\x9b\x55\x23\xec\x42\xc8\x2b\x8c\x32\x9f\x46\xcd\x3a\x3d\x1f\x1f\x40\xde\xb4\xdf\xf7\x7b\x11\xe4\x9b\xd6\xf5\xc5\xb7\xa1\x17\xd1\x4a\x5d\x40\x43\x97\x7a\x18\x82\x1f\x20\xc8\x7c\x83\x41\xe6\xef\x4f\xf7\x9e\xc0\x42\xff\x3f\x11\xf6\x5e\x43\x4e\x10\xf6\xde\x43\xe2\x92\x87\xab\x77\x5f\x5c\xe6\xbe\xbc\xab\x99\xb8\x7c\xcc\x0f\x62\x6f\x2a\x21\x27\x64\x14\xfb\xe6\x09\x48\x88\x61\x87\x18\x76\x88\x61\x87\x18\x76\x88\x61\x87\x18\x76\x88\x61\x8f\x8f\x61\xef\xbe\x56\x51\xfc\xd6\x5d\xcd\xb4\x8a\xc3\x09\x91\xed\x4d\x75\x8d\x82\x08\x6d\xdf\x14\x55\x03\x02\xdb\xfb\x4d\xc1\x81\xc0\x76\x08\x6c\xdf\xe4\xc0\xf6\x0f\xa4\x36\x6f\xb3\x7c\xcb\xe1\xef\xdd\x5f\x73\x4a\x67\xd0\x34\x9e\xca\x9e\xf2\x6d\x53\x8f\x87\xa3\xe1\x9b\x95\xd3\x18\x0e\xdf\xf6\x60\xf5\x77\x0c\xa0\xdd\x02\x68\x2f\x55\xe8\x4d\x36\x5b\x6d\x5a\xc9\x07\x7d\x24\xc1\x36\xfe\x6a\x1a\x7f\x25\x8d\xee\x0b\xdd\x34\xe5\xdd\x93\xc9\x94\xb9\xca\xc7\x14\x4f\xdf\x58\xa0\x2a\xbc\xf9\x72\x8f\x96\x89\x7b\x36\xe6\xa1\xa9\xf9\xd9\x73\xec\x86\xf6\x2d\x83\x0d\x05\x4d\x36\x14\x34\xd9\x4a\x41\x25\x03\x5d\x14\x23\xfb\x1c\x3a\xc3\x47\xf6\x29\x74\x02\x1d\xdb\xc0\x6a\xe6\x7d\x63\xd2\x80\xc5\x7f\xb5\x07\xdd\xe7\x39\x35\x5b\x54\x77\x49\xd5\xe2\xde\x4f\xf8\xf7\xf6\xe0\xdf\x1c\x08\xbc\x95\x47\xd6\xce\x18\x30\x4f\xf5\xa7\xe4\xa3\xb9\x27\xd8\xad\x5e\x52\x6c\xff\xe7\xad\x96\x40\xe0\x39\x34\x2d\xba\xe2\x38\x9a\xe4\x5d\x71\x00\x4d\xa0\x7d\x89\x07\xa2\x86\xbe\xb8\xa5\x3c\x02\x17\x92\xe5\x41\x0e\x0f\xc7\xa4\xf5\xf6\xde\xb2\xae\x83\x96\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\xfc\x85\xc1\x5f\x18\x92\x09\x80\x37\x2f\x78\xf3\x82\x37\x6f\xb7\xbc\x79\x7f\x61\x04\x1d\x6a\x29\x99\x80\xd8\xe3\x55\x55\xcb\x77\xe0\x7d\x69\x04\xff\x7e\x28\x8f\xc0\x4f\xca\x3c\x02\xe1\xe4\x01\xa6\x27\xc9\x3c\x3e\x37\xcd\x4b\xb9\xa0\x5a\x6d\x49\x1c\x30\x1a\xe8\x2d\x5c\x37\x93\xab\x1c\x53\x7d\x02\x85\x6c\x28\xa2\x03\x87\xca\xce\xe7\x1e\x89\x4d\x3b\xe0\xd7\xb1\xd7\xd1\xe0\x66\xa4\x19\x38\x9f\xcc\x09\x87\xf1\x9e\x7a\x4e\xe8\x37\x69\x94\x12\x36\xb7\x52\xf0\xaf\x04\x4c\x08\x98\x10\x30\x21\x60\x42\xc0\x84\x80\x09\x01\x13\x02\x26\x04\x4c\x08\x98\x10\x30\x21\x60\x42\xc0\x84\xdd\xc6\x84\x87\xd0\x01\x3c\x91\xdd\xe7\xbb\x6e\xdd\x1f\x71\xdd\xf2\x36\x77\xb7\xc3\xd1\x25\x00\x30\x01\x60\x02\xc0\xdc\x42\x00\xf3\xcf\x87\xd1\xac\x4c\x47\xa0\x33\x25\xdb\xa0\xa6\x4d\xca\x06\xf7\xe4\x67\xcf\xf8\x69\x09\x24\xde\xac\xd6\x5c\x95\x69\x50\x37\xc9\xe2\x32\xa5\x37\x22\x7b\x52\x07\xff\xd0\x30\xfe\xe0\x36\xf4\x5d\xb1\x45\x5d\x5b\x29\x64\xde\xd3\x62\xb2\xd4\x0b\xf2\x2d\x57\xc5\x5b\xa6\xc3\x6f\x69\x53\xce\xd4\xe3\xfc\x81\xa9\xb8\x9a\x5e\x29\xac\xf5\x7e\xc8\xa0\x1a\x8f\x36\x5b\x49\x74\x7a\xfd\xc5\x64\xfe\xf9\x34\x5e\x88\x49\xb3\xba\xd6\xe8\x94\x94\x74\xad\x4e\x03\x16\x0a\x2c\x14\x58\x28\xb0\x50\x60\xa1\xc0\x42\x81\x85\x02\x0b\x05\x16\x0a\x2c\x14\x58\x28\xb0\x50\x60\xa1\xe0\x32\x09\xc4\x11\x88\x23\x10\xc7\xae\x11\xc7\x77\xaa\xe8\xc9\x96\x88\xa3\x48\x84\xba\x36\x70\xfc\x99\xe7\xf1\xc7\x86\xd0\xc3\xcd\x80\xa3\xc8\xc9\x32\xb9\x76\xd0\xf3\x5a\xdc\x28\x77\x9c\x3d\xdb\x84\x12\xf2\xd2\xd7\x7a\xba\xc7\x31\x61\x11\x98\x18\x30\xb1\x22\x30\x31\x60\x62\xc0\xc4\x80\x89\xf5\x0d\x13\x2b\xf6\x0c\x13\x6b\x7b\x4d\x36\xcc\xc4\x8a\xc0\xc4\x80\x89\x01\x13\x03\x26\x06\x4c\xac\xfb\x4c\xac\xd8\xd7\x08\xab\x08\x08\xab\x73\x08\xab\xd8\xeb\x08\xab\xb8\x05\x11\x56\xe9\x5d\x29\x74\x5d\xf8\x57\x69\x48\xe5\xfe\x55\xdf\x8d\xde\x82\xae\x36\xcd\x2a\x17\x0f\xba\xbc\x2c\x95\x49\xce\x66\x89\x9e\x57\x09\xd9\xe2\xae\xbf\x3d\xd9\xe9\xea\xad\xf8\xcd\x6d\x72\xb4\x6a\x48\x5c\x99\xfd\x47\x94\x04\xe8\x9e\x10\x2b\x9c\xa2\xae\xcd\xe2\x4e\x8a\xdb\x36\x9d\xc6\x09\x78\x66\xa0\x32\x22\x75\x39\x8b\x9f\x46\x0b\x1d\x18\x04\x90\xce\x18\x8e\xaa\xd9\xe0\x51\x35\xbf\xb7\xc6\x51\x35\x4b\x42\x84\x5d\x43\xcf\x72\x11\x76\x15\x75\x66\xf4\xa2\x1b\xe2\x64\x1a\x1d\x2d\x06\x27\xd3\x74\xec\x65\x15\x91\xa2\x9e\x20\x2d\x94\xa2\xbe\x53\x6f\x4b\x16\xc0\x16\xdd\x7c\x01\x9c\xfb\x3f\xc7\x92\x04\x70\x41\x1e\x61\x10\x3a\x0f\x22\xc1\x0b\x3b\xf7\xa4\x3c\x1b\x67\x0d\x61\x3c\xed\x97\xd6\x45\xb1\xdc\x99\x13\x73\x00\x92\x03\x24\x07\x48\x0e\x90\xbc\x7f\x20\x39\xe8\x9c\x09\x3a\x67\xef\x58\x11\xe0\xb4\xb2\xae\x9c\x56\x06\xc6\x1a\x30\xd6\x80\xb1\x06\x8c\x35\x60\xac\xe9\x6b\x63\x0d\x1c\x5a\x09\x87\x56\xc2\xa1\x95\x9d\x3a\xb4\x12\x6c\xa1\x60\x0b\xed\x57\x5b\x68\xa9\xdc\xe6\xf3\x5a\x93\x0c\x87\xb9\x78\x6e\x7d\x2f\xbe\x47\xcc\xe6\x40\xd2\x6e\x36\xc3\x6e\xff\xb1\x75\xaf\x0c\x05\x27\xa6\x89\xd4\x26\xc2\xab\x1d\x7f\x66\x08\xff\x48\x28\x2f\xf3\x0b\xad\x65\x2c\xe1\x39\x32\xda\x94\x9a\xe4\xf1\x50\x5e\x65\x5e\xee\x9c\xe1\xb8\x5b\xed\xe0\xb5\x9e\x4d\x41\x72\x2e\x79\x20\x3f\x8e\xb3\xf5\x29\x98\x45\x05\xc2\x89\x49\x20\xa3\x08\x44\x4f\x40\x46\x11\x30\x0c\x81\x61\x08\x0c\x43\x7d\x64\x18\x82\x8c\x22\x90\x51\x04\x80\x3c\x00\x79\x00\xf2\x00\xe4\x7b\x02\xc8\x43\x46\x11\xc8\x28\xb2\x55\x10\x24\x64\x14\xe9\x44\x46\x91\xdf\xb8\x86\x8e\x8b\x8c\x22\x1a\xb1\x65\x29\xc4\xa9\x4f\x24\x12\xbe\x66\x94\x4d\xc3\x2c\x7b\xc2\x1a\xbf\xef\x1a\xfe\xb3\x3d\xe8\xbe\xf0\x1d\xbe\x6b\xec\xe1\xb5\x93\x87\x4c\x07\xcf\x2c\x88\x52\x2f\x8b\x52\x73\xfb\xd8\x83\xa1\xcb\x8e\xe7\x15\xdb\xec\x89\x1e\x27\x7a\x90\x2d\x04\x78\x17\x64\x0b\x01\xde\x05\xbc\x0b\x78\x57\x1f\xf1\xae\x1e\xf2\xf3\xed\x19\xde\x05\x0e\xa8\xc0\xbb\x80\x77\x01\xef\x02\xde\x05\xd9\x42\xc0\x43\xee\xf6\xc1\x53\x3d\xef\x21\xb7\x25\xb3\x85\xac\xa2\xe7\x84\x27\xd4\x55\xf4\x34\xf7\x84\xba\x84\x2e\xa0\xf3\x4d\xc3\xd1\x23\x0c\xcb\x8b\x42\x6f\x0a\x8d\xda\x92\x20\xe4\x85\x64\x97\xa8\x8b\x78\x4e\xba\x44\xc5\x30\x36\xef\x98\xfa\x66\x95\x8c\x49\x0a\xf2\xe3\xa8\x09\x6f\xcb\xfa\xb9\x40\x9a\xa3\xb5\x09\x71\xcf\xa6\xc0\x35\xc1\xc2\x9e\x45\xdf\x8d\xde\x52\x97\xfc\x63\x16\x9d\x6b\x53\xa7\x42\xf0\x25\x24\xfc\xd8\x60\xc2\x8f\x9f\x4d\xa3\xb7\x0a\x69\xb3\x80\xde\xc4\xa5\xcd\x79\xd4\xbe\x81\x89\xae\x89\x5c\x1e\x6f\x46\x57\x82\x5c\x1e\x6d\x7d\xc1\xf3\x22\x7f\xc7\x5b\xd0\xd5\x50\xfe\x8e\xb6\xbe\x61\xe3\xc2\x52\x24\xf3\xe8\xbe\xb0\xcc\xfd\xef\x63\x4d\x84\x65\x3e\x36\x6f\x47\x73\xc1\x79\x5c\xdc\x1f\x27\x38\xfd\x12\xba\x25\x42\x21\x51\x07\xf0\x69\xe0\xd3\xc0\xa7\x81\x4f\x43\xa2\x0e\x48\xd4\x01\x89\x3a\x20\x51\x07\xd8\x49\xc0\x4e\x02\x76\x12\xb0\x93\x80\x9d\xa4\x2d\x76\x12\x48\xd4\x01\x89\x3a\x20\x51\x07\x24\xea\x00\x33\x24\x98\x21\xfb\x28\x51\x47\xf7\xf9\x74\xfb\x93\x73\x7c\x75\x08\x1d\x10\x1e\xfd\xf6\xa2\xaa\xe5\xbd\x06\x89\x3d\x20\xd4\xa6\x15\xb2\xc8\x36\xb5\x66\xd9\xc1\x3f\x34\x84\x3f\x38\x88\x1e\x64\x4f\x4d\x85\x1f\xf2\x89\xf9\xc8\xda\xee\xfc\x97\x69\x85\x14\x45\x61\x39\xee\xf9\x7f\xb9\xbe\x24\xc9\xcb\x43\x37\x6e\xb5\xcc\x1c\x1a\x7a\x52\x0c\xde\x29\x74\x8a\x0f\xde\xa3\xe8\x30\x3a\xd8\xd4\xbc\xc2\x7b\xc0\x33\xab\x84\x3e\xbb\x25\xcb\xb3\x91\x3c\x18\xcf\xe2\x19\x39\x18\x9b\xf6\xb5\x1c\x92\xa1\x97\x37\x0e\xc2\x24\x23\x37\xa4\xeb\x80\xf0\x05\x48\xd7\x01\xe6\x21\x30\x0f\x81\x79\xa8\x8f\xcc\x43\x90\xae\x03\xd2\x75\x00\x96\x07\x2c\x0f\x58\x1e\xb0\x7c\x4f\x60\x79\x48\xd7\x01\xe9\x3a\xb6\x0a\x88\x84\x74\x1d\x9d\x48\xd7\xf1\xea\x08\x3a\x21\xe0\x9e\x6a\x59\x4e\x90\x7f\xd7\xf4\x09\xda\xf8\xf7\xf8\x7f\xbf\x7d\x5c\x27\x56\x85\xae\xb2\x05\x58\xfe\xfe\x76\xfc\x2f\x46\xf0\x1f\x0d\xa2\xed\xec\xf1\x6b\x2b\x85\xcc\x67\x53\xb2\xf9\x43\x89\x79\x4d\x4f\xa0\x79\x64\x6f\xc6\x2f\xa6\x2d\x59\x7a\x47\x03\xfd\x85\xeb\x68\x72\xb5\x63\x2a\x50\xa0\x98\x0d\x45\x74\xe1\x50\xd9\xf9\xdc\xa3\xfc\x75\x53\x96\xe5\x5c\x29\xf8\xe8\x50\x0f\x2a\xd9\xeb\x10\x71\x33\xd2\xfb\x3e\x1a\x4f\xf8\x76\xe0\x3b\x78\xc5\xd0\xf5\x8b\xc9\xb4\x71\x2f\x1e\xf1\x72\x54\x5b\x96\x23\xc1\x62\xd0\xec\x90\xe1\x17\x90\x21\x20\x43\x40\x86\x80\x0c\x01\x19\x02\x32\x04\x64\x08\xc8\x10\x90\x21\x20\x43\x40\x86\x80\x0c\x37\x13\x19\x1e\x46\x07\xf1\xfe\x6c\x61\x47\x0a\x0f\x5a\xaa\xbb\x9c\x79\x80\xc7\x75\xcb\x5a\x04\x9b\xb7\xec\x20\xfb\x3d\x27\xa5\xf6\x47\x52\xa9\xd2\xf3\xe8\x39\xfc\x4c\xf6\xad\xfe\x83\x93\xb2\xca\x22\x2e\x9c\x69\x46\x35\x77\x59\x71\x34\x6a\x91\x51\xc5\xa9\x69\xcb\xac\xdb\xb8\xea\x4b\xd4\xaa\x60\x23\x96\x4d\x79\x13\x65\x77\xfa\x4c\x22\xfc\x06\xa0\x99\x40\x33\x81\x66\xf6\x31\xcd\xfc\xb9\xe7\xd0\x4c\xab\xae\x8a\x4d\x08\xa7\x4d\x2b\xc4\xc1\x7f\xf1\x2c\xfe\x89\x3d\x6b\xb9\x2e\x66\x93\x5d\x17\x73\xb9\xb5\x7c\x16\x03\xce\xc8\xee\xed\x71\xc2\x08\xe9\x86\x01\xbe\x41\xba\x61\x80\x6f\x00\xdf\x00\xbe\xf5\x11\x7c\xeb\xa1\x6c\x05\x3d\x03\xdf\x20\x8c\x1e\xe0\x1b\xc0\x37\x80\x6f\x00\xdf\x20\xdd\x30\xc4\xf9\xde\x3e\x40\xaa\xe7\xe3\x7c\xb7\x64\xba\xe1\x67\xd0\x94\xf0\xcc\x9a\x44\x47\xb8\x67\xd6\x04\xda\x87\xf2\xad\x87\x77\xb6\x25\xa3\xf0\x62\xb2\x27\xd6\x29\x7c\x62\x1d\x71\x9f\x31\x29\x84\xff\xd5\xce\xb5\x68\xd9\xdd\x7e\x1e\x61\x0e\xc6\x46\xc5\x3f\xbb\x8c\xc6\x04\xc9\x3a\x8d\x4e\xa2\xe3\x75\xc9\x82\x47\x51\x6e\x1d\x11\xb7\x90\xe3\x0d\xf2\x01\x6f\x2c\x1f\xf0\xd7\x53\x68\x5a\xa4\xd4\x3d\x8e\x26\x43\x29\x75\xf3\x68\x5d\x23\xb0\xa9\x40\x40\x27\x84\xb0\x39\x84\x0e\x70\x61\xb3\xde\x72\x8b\x22\xa1\xf0\x31\x74\x34\x48\x28\xbc\xce\x32\x5a\x4d\xdc\xdb\x05\x99\x94\xfb\xf6\xe8\x5a\x32\xe9\xc1\xd8\x74\xbd\x5c\x3e\x1d\x12\x97\x9a\xc9\xa7\x20\x3d\x6f\x47\x25\x15\xe4\xe4\x05\x88\x0b\x10\x17\x20\x2e\x40\x5c\xc8\xc9\x0b\x39\x79\x21\x27\x2f\xe4\xe4\x05\x63\x02\x18\x13\xc0\x98\x00\xc6\x04\x30\x26\xb4\xc5\x98\x00\x39\x79\x21\x27\x2f\xe4\xe4\x85\x9c\xbc\x60\xab\x03\x5b\x5d\xdb\x73\xf2\x36\x65\xd4\x6d\x4d\xd6\xbb\x91\x9c\xbc\x5d\x40\xcf\x5b\x30\xd6\x05\xbf\x6f\x18\x15\xbc\x4c\x20\x86\x4d\xca\x06\x13\x48\x51\xc7\x79\x99\x1b\x44\xba\x12\x1b\x1a\x71\xf0\xef\x0c\xe1\x2f\x0e\x22\x5c\xf7\xc8\xb5\x95\x42\x66\x45\x6a\xba\xa6\x6e\xac\x18\x7a\x4d\xad\x44\x52\x82\xf8\xbb\xca\xa9\xf9\xd9\x05\x51\x58\x5b\x52\x81\xe4\x73\x8f\xcb\x64\x1e\x91\x0a\x5d\x29\x04\xef\x99\x33\xda\x78\x7c\xde\x6d\x94\xd1\x63\x77\xfc\x1c\xba\x0b\x23\x5e\x31\x61\x4b\x7e\x3e\x79\xf2\x9c\xc0\xc7\xc4\xdc\x08\x9a\x1c\xf9\x69\x3e\xe2\x46\x16\xe4\xf9\x80\x50\x03\xc8\xf3\x01\x56\x2a\xb0\x52\x81\x95\xaa\x5f\xad\x54\x90\xe7\x03\xf2\x7c\x80\x75\x00\xac\x03\x60\x1d\x00\xeb\x40\x4f\x58\x07\x20\x99\x06\x24\xd3\xd8\x2a\x3c\x14\x92\x69\x74\x22\x99\xc6\x3f\x0e\xa1\x11\x01\x04\x35\x4a\x6d\xdd\x30\xe3\x69\x20\xb7\x11\x3a\xf8\x37\x87\xf0\xaf\x0c\xa2\xd7\x87\x6f\xbd\xb6\x52\xc8\xbc\xd0\x1a\x05\x9c\x63\x85\xb4\x09\x00\x8e\xf2\x07\xa6\x43\x15\xb9\x52\xe0\xe5\xcf\x19\x8e\xbb\xd5\xce\x07\xdb\x0c\x10\xf8\xe6\x64\xc6\x77\x10\xef\xf7\x0e\xad\x6b\x1c\x1b\x12\x8d\xf3\x36\x8f\xb0\xbd\x96\x10\x23\x00\x40\x00\x80\x00\x00\x01\x00\x02\x00\x04\x00\x08\x00\x10\x00\x20\x00\x40\x00\x80\x00\x00\x01\x00\x02\x00\x04\x00\x08\x00\x10\x00\x20\x00\xc0\x6e\x01\xc0\xbf\x4f\xa3\x47\xa4\x47\x60\x7c\x22\xdd\x71\xfc\x5f\xd3\xf8\xbf\xa4\xd1\x2e\xb5\x2e\xc2\x3e\xf3\x86\x32\x71\xa3\x6b\xad\xf8\x8a\xdc\x23\x65\xe2\xd6\xc5\xd4\x4f\xcd\xcf\x7a\xbb\xbb\xf6\xe1\xb8\xc9\x86\x82\x26\x1b\x0a\x9a\x6c\xa5\xa0\x92\x85\x9e\x16\x04\xee\x22\x9a\xe3\x04\xee\x2c\x9a\x41\xc5\x0d\x10\xb8\xd0\x77\xb6\x92\xd6\x05\xff\xcd\x30\x9a\x13\xcd\xbf\x54\xa1\x37\xd9\x5a\x68\xd3\x4a\xde\x67\x2b\xf5\xf9\x8c\x05\x8d\xb5\x6c\x83\xda\x86\xbb\x5a\x21\x2b\xa4\x12\xd9\x7b\x3b\xf8\x93\xc3\xf8\x07\xb7\xa1\x87\x42\xa5\x4d\x79\x85\xf9\x59\x11\xde\x9d\x6a\x0d\xd8\xce\xcb\xf7\xcc\xb1\xf7\x4c\x87\xdf\xd3\x26\x8a\x7b\x92\x3f\x70\x36\xa6\xae\x32\x0b\x43\xf3\x1a\x6c\x0d\x07\xcf\xa6\x0e\xd2\x6d\x07\xbe\x1e\xd7\xfd\x9e\x64\xae\xfb\x66\x7c\x45\xc0\xdb\xe6\xad\xdb\xe8\xed\x2c\x49\xf0\x5a\xa3\x14\xd0\x2f\xa0\x5f\x40\xbf\x80\x7e\x01\xfd\x02\xfa\x05\xf4\x0b\xe8\x17\xd0\x2f\xa0\x5f\x40\xbf\x80\x7e\x01\xfd\x02\xfa\x05\xf4\x0b\xe8\x17\xd0\x6f\x6f\xa1\xdf\x0f\x8f\xa0\xb3\x82\x3d\x8a\xcc\x18\x75\x94\xb1\xc9\xd9\x69\x16\xd5\x75\xc3\xb1\x6b\x7c\x7b\xbe\x58\xd3\xcb\xc4\x75\xf0\x17\x87\xf1\xd7\x06\xd1\xeb\x44\x39\x3e\x67\xfc\xa7\x2d\x62\x46\xaa\xcf\xf8\x25\x16\x79\x89\x6d\xe2\x8b\xfb\xf9\x03\x22\x6b\x47\x43\xde\xe9\x98\xd7\x6e\x0d\xa8\xd8\xa3\x51\xe3\xcf\x25\x93\xc7\x63\xf8\xa8\xe4\x88\x62\xa4\x48\x27\xd2\x98\x9e\x88\x49\xb7\x00\xdc\x10\xb8\x21\x70\x43\xe0\x86\xc0\x0d\x81\x1b\x02\x37\x04\x6e\x08\xdc\x10\xb8\x21\x70\x43\xe0\x86\xc0\x0d\xbb\xcb\x0d\xb7\x5e\xda\x3b\x20\x93\x40\x26\x81\x4c\x6e\x21\x32\xf9\x81\x11\xb4\x8f\x75\xdd\xf8\x4a\xa1\x19\x86\x14\xfb\xc7\xaa\x6a\xc9\x9f\xdf\x8e\x7f\x7f\x18\x7f\x3d\x8d\xb6\x6b\xd4\x26\xd7\x56\x0a\x99\x87\x6c\xa2\xea\x75\x3b\x5b\xe1\xe3\x76\x41\xb5\x72\x0f\xb3\xab\xd3\xd4\x26\x57\x42\x44\xd0\xbf\xdc\xde\x43\x9e\x4a\x6f\x5e\xdf\x99\x5d\xec\x0b\xf2\x2b\x85\xbc\x5f\x9d\x44\x3e\xf7\x70\x3c\x9f\xbb\x03\x0f\x96\x89\x8b\xae\x9f\x4f\x26\x73\xc3\x78\x8f\x24\x73\xd9\xac\xa4\x72\xc1\xeb\xc3\xe1\xdd\x99\x4f\xee\x08\xda\xf8\x51\x9b\x58\x15\x55\x23\x4d\x9b\x59\x91\x37\x74\xa9\xa5\xd7\x7d\xf0\x5f\x43\x53\xc3\x41\x32\x70\xf0\xdf\x06\x0f\xfe\xfb\xc1\xd4\xad\x4e\xf3\xf5\x1f\xcd\xd7\x4e\x51\x61\xd5\xda\x2c\x2a\x72\xff\xf0\xfa\x40\x54\x60\x99\xc1\x5d\x0d\x49\x87\x47\xc5\x6f\xdd\x12\x0e\x9d\x39\x6b\x0f\x04\x46\x82\xc0\x80\xf3\x9e\xba\x72\xde\x13\x1c\xf4\x01\x07\x7d\xc0\x41\x1f\x9d\x3a\xe8\xa3\xf4\xf9\x54\x97\x4e\x3b\x40\x97\xc5\xe9\xc1\xe7\xd1\x6c\xe8\xf4\xe0\xf6\x9c\xa0\xa0\xc4\x2f\xfe\x3b\xf1\x76\xd1\x4c\xad\xae\xff\xe1\x55\xbe\xb9\x2e\x50\xfc\xc3\x3b\x83\xf5\x7f\xd8\x52\x6d\xd7\xe0\x86\x41\xb1\x57\x6c\xba\x67\x78\xc4\x12\xa9\xbd\x3a\xae\x14\xbc\xb1\xbe\xa0\x31\xfe\xe6\xbd\x3c\x90\xf0\xa1\xf0\xc5\x2a\xb1\xcb\x24\x7c\x75\x4f\xf8\x2a\xcf\x74\x4f\xca\x86\x36\xd6\x70\x5f\xa4\x14\xf6\xf7\xaa\xbc\xca\x6a\x59\xbc\x88\xe6\x50\xa9\x6e\xb7\x32\x89\x8e\x6c\xa0\x9b\xe7\xb9\xc5\x1c\x54\x91\x04\x55\xe4\x33\x03\xe8\xd3\x03\xf8\x53\x03\x99\x4f\xf8\xf2\xfc\xa5\x81\xfe\xd9\xbb\xd4\x19\x19\x58\x3b\x73\xa3\x39\x37\x84\xb1\xc1\x19\xb8\xce\x0c\x37\x19\xb8\x23\x7c\x59\x12\x3e\x16\x6a\x85\x3f\xc9\xf4\x2f\xf1\x34\xbf\x83\xeb\x42\x8e\x32\x5c\x72\xa8\x39\x2f\x7c\x48\x2e\xb0\x69\x21\xff\x5e\xf0\x26\x4b\xf0\xe3\x48\xf3\x4d\x55\xf1\xb5\x14\x7a\x35\x85\x5f\x49\x65\xbe\xe0\xd3\xab\x4f\xa6\xce\x52\x5b\xe3\x6a\x5a\x99\xf2\x66\xa7\x4a\x76\x89\xfd\x94\x55\xa6\x22\x5f\xc1\xb9\xa4\xd0\xa8\x6a\x4e\x60\x2d\x1f\x53\x35\xfe\xe1\xdc\x07\xa1\x62\x68\x72\xc5\x24\x15\xdd\x51\xe8\x4d\xd9\xa6\xc2\x46\x6f\x11\x6a\x55\x48\x5e\x11\x6f\xe4\x4e\x3f\x5e\x5f\x72\x3e\x18\xdb\x00\xfe\xeb\xb3\xdb\x78\xb5\x22\x0e\x2c\x1d\x67\x41\xed\xdc\xc1\x5d\x7f\x34\x7e\xc1\xd8\x81\xef\xe0\x9f\x8a\x4a\x87\xd0\x01\x3c\x91\xdd\xe7\x1b\x03\xee\xe7\x73\x47\x4e\x64\xbf\xd0\xec\x20\xfb\x39\x8c\xf8\xb7\x9e\x11\x01\xbf\x6f\x3b\x3a\x94\x00\x25\x2d\xaa\x7b\x38\x72\xdc\xa2\xb6\xbb\x44\xed\x9b\xaa\xad\xe3\x2f\xdf\x81\x7f\x2c\x84\x26\x73\x1a\x35\x4d\xf6\xb5\xe7\xce\x3c\x15\x4c\x39\x97\x2a\xa1\x67\xa4\x63\x64\x6e\x58\xde\x2b\xd6\xc3\x73\xc4\x8d\x38\x30\xce\x07\x0f\x4c\xb0\x3d\xae\xe0\x8d\x87\xd1\x43\x62\x8c\xdd\x8f\xee\xe5\x63\xec\x6e\x74\xe7\x4f\xa5\x76\x20\xf9\x31\x89\x43\xe8\x6a\xf2\x10\x3a\x80\x27\xea\x87\x90\xac\xce\x59\x51\x1d\xb9\x3d\x8e\x0e\xa7\xc7\xe2\x87\x13\xc2\x3b\xe4\x57\xa2\xec\xbf\x0d\xb5\xd3\x5e\xaf\x9d\xe6\x2f\x2d\x24\x36\xd4\x48\xa4\xa1\xe6\xa9\xd3\x5a\x4b\x35\x55\xea\xd6\x6c\xc2\x1e\x68\xa9\x52\x11\x9d\xc6\x27\xb3\xc7\xfd\x29\xf4\x58\x78\xea\xc5\xbe\x62\x33\xa6\xe1\x5b\xd0\x55\xfc\x74\x66\xc1\x9b\x86\x87\xe7\xa4\x5b\x08\xeb\x41\xde\x95\x5e\x37\x5e\xf6\x56\xa3\x90\xa9\xfa\x2a\x59\x5c\xa0\xda\x0d\xe2\x3a\xd9\x6d\xfc\x81\xf0\x8e\x17\xff\x64\x06\x15\x13\x26\xa4\x4d\xfc\x55\x4c\x46\xad\x57\x88\xed\x4f\x51\x47\x53\x2b\x04\xff\xf7\x07\xf1\xf7\x0d\x04\x83\xae\xc0\xed\x06\xfc\x92\xd7\x98\x81\x96\x7a\x39\x28\x6f\xda\x2f\x2f\x97\x8f\x33\x26\xc4\xde\xba\xc0\x8a\x6d\xb3\x75\xe1\xbb\xd1\x69\x31\x54\x8f\xa2\xc3\x7c\xa8\x16\xd0\x38\x1a\x6b\xba\xa2\xa8\x35\x97\xb2\xaf\x33\xcc\x32\xdf\x20\xb0\x1a\xdd\xaa\x81\x61\x3e\x79\x1a\x8c\xe1\xbd\xde\xf9\x50\x41\x05\xe4\x7c\x10\x75\x88\x58\x19\x7e\x2f\x64\x65\x38\xe0\x59\x19\xd6\xd5\x29\x85\x26\xa6\x87\x6e\xf5\x4b\x71\x1a\x4d\xa1\x53\x75\xda\xfd\x7a\x3b\x06\x54\x7a\x30\x47\x6c\xd0\x1c\xf1\xc3\xa9\x36\xc8\x85\x33\xc2\x22\x71\x12\x1d\x0f\x2c\x12\x1d\x10\x2f\x6d\x97\x1f\x09\x66\x8e\xe2\xfb\xee\x0a\xc4\xcb\x89\x06\x32\xb1\x2e\x39\x33\x1e\x8b\x2b\xba\x21\x65\x80\x5f\xf4\x9b\xb0\x03\x7e\x01\xfc\x62\x93\xf9\x45\x37\xb4\xcd\x24\xea\xd0\xfe\xf5\xa2\x34\x81\xf6\xe1\x7c\x76\xd4\xdf\x08\xdd\x13\xde\x4c\xf1\xfb\x6f\x0b\x86\xf1\x1b\xc3\x81\x63\xd5\x9a\x51\x9e\xdc\x39\xcd\xe6\x82\x00\xff\xeb\x61\xfc\xe9\xc1\x60\xbd\x6c\xf1\xcc\xdf\x39\x56\xc2\x65\x76\xa1\x4d\xc1\x9c\xbb\x6f\xc6\x2d\xb4\xc1\x6b\x20\x78\xf3\x16\x82\x37\xe7\x92\x67\xd4\x08\x1e\x92\x67\x7e\xf8\x4d\x8e\xe2\x0d\x41\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x09\xa1\x9a\x10\xaa\x79\xfb\x84\x6a\x7e\x79\x18\x8d\x89\x24\x72\x8e\x4b\x6d\xb5\x4c\x1a\xce\x0e\xd6\x1c\xc3\xa4\x3a\xf1\xe3\x34\x7f\x68\x18\xff\xc1\x20\x42\xf2\xf6\x6b\x2b\x85\xcc\xcb\xf2\x3c\x8a\x30\x47\x34\x3d\x29\x49\x97\x94\x1b\x86\xa9\x2b\xd3\x0b\xb3\x17\xa9\xde\x1e\x98\x38\x1a\x68\x44\x5c\xeb\x93\xeb\x27\x53\xaa\x02\x55\x6f\x28\xa2\x5d\x87\xca\xce\xe7\xee\xe7\xaf\x5b\x10\x5f\x70\xa5\x20\xab\x06\xf0\x71\x3d\x28\xff\xa6\x40\xf9\x4f\x27\x83\xc7\x09\xbc\x4f\xb2\xc5\xe8\x10\xf3\x5c\x17\x45\xeb\x47\x79\x3e\x10\x48\x20\x90\x40\x20\x81\x40\x02\x81\x04\x02\x09\x04\x12\x08\x24\x10\x48\x20\x90\x40\x20\x81\x40\x02\x81\xec\x2e\x81\x3c\x80\x26\xf0\xbe\x6c\xde\x27\x90\xf7\x46\xe2\xc3\xc4\xce\xad\xd1\xb3\x0a\xa8\x22\x50\x45\xa0\x8a\x7d\x4c\x15\xbf\x38\x84\xee\x8f\xfa\x29\x3a\x44\xb3\x89\xeb\xe0\x9f\x1a\xc2\x9f\x08\x39\x23\xda\xad\x39\x23\x2e\xf0\xa7\xdb\xe4\x88\xf8\x44\xc8\x11\x51\x14\x3c\x67\x38\xee\x59\x6a\x4f\x55\x2a\xbe\x63\x62\xfb\x4e\x39\xbe\x8d\x0e\xa7\x6d\xc9\x15\xf1\xc9\x64\x22\xf8\x04\xde\x5d\x1f\x53\x29\x3a\x02\x20\x20\x40\x40\x80\x80\x00\x01\x01\x02\x02\x04\x04\x08\x08\x10\x10\x20\x20\x40\x40\x80\x80\x00\x01\x01\x02\x6e\x26\x04\x04\x9c\x07\x38\x0f\x70\x5e\x1f\xe3\xbc\x9f\x7b\x1e\x4d\x0b\x27\x41\x55\x67\xaa\xac\x41\x4d\x9b\x94\x0d\x9e\x78\x82\x3d\x13\xb8\x0c\x56\x6b\xae\xca\x34\x94\x9b\x64\x71\x99\xd2\x1b\x91\x3d\x9f\x83\xbf\x75\x0d\xff\xff\x87\xd0\x77\xc5\x16\x72\x6d\xa5\x90\x99\x14\x2a\xa4\x2d\x17\x3f\x4f\x3a\x7a\x2e\x84\x17\x64\xe1\x57\x45\xe1\xd3\xe1\xc2\x73\x87\xd9\xb3\x53\x71\x25\x5f\x29\xac\xf5\x60\x8f\x73\xbe\x22\x40\x30\x80\x60\x45\x80\x60\x00\xc1\x00\x82\x01\x04\xeb\x1b\x08\x56\xec\x19\x08\xd6\xf6\x9a\x6c\x18\x82\x15\x01\x82\x01\x04\x03\x08\x06\x10\x0c\x20\x58\xf7\x21\x58\xb1\xaf\x99\x55\x11\x98\x55\xe7\x98\x55\xb1\xd7\x99\x55\x71\x0b\x32\xab\xd2\x3f\x4b\x21\x22\xfc\xa0\x9e\x43\xcf\x70\x3f\xa8\x2b\xe8\x29\x74\xb9\x79\xa6\xc3\x58\xb2\xb5\x52\xc8\xaf\x05\x8f\xe6\x0c\x27\x39\x86\xf2\x91\x78\xaf\xa9\xed\x78\x9b\x70\x98\x7a\x31\xd9\x61\xea\x69\xbc\x10\x93\xaa\x6d\x2d\x18\x27\xdd\xaa\xd6\xaa\x3c\xca\xfe\x2e\x5a\x03\xc6\x3d\x21\x96\x34\x45\x5d\x9b\xbb\x1d\x15\xb7\x6d\x26\x79\x13\xa0\x4c\x47\x8b\xe8\xf9\xba\x6c\xb6\xf3\xe8\x62\x7b\x3b\x1c\x72\xdc\x42\x42\xef\x0d\x26\xf4\xfe\xf5\x34\x52\x85\x40\x7a\x2b\x7a\x33\x17\x48\x97\x51\xdb\xc7\x27\x5a\x12\x19\xbf\xaf\xa1\x67\x83\x8c\xdf\x9d\x78\x4f\x59\x9c\x72\xf6\x3c\x7a\x2e\x74\xca\x59\x27\x5e\xb4\x71\xe9\x6a\xd1\xd6\xa5\x6b\x9b\x24\x6a\xe4\xf8\xd4\x9f\x1a\x5b\x43\xba\x16\xe4\x41\x79\xa1\x53\x07\xe9\xd2\xda\x92\x76\x5a\x3c\xd2\x44\xd2\x4e\xfb\x05\x75\x51\xe6\x76\xe6\x48\x56\xa0\xdd\x40\xbb\x81\x76\x03\xed\xee\x1f\xda\x0d\x5a\x65\x82\x56\xd9\x3b\xe6\x00\x38\x0e\xbb\x2b\xc7\x61\x83\xd5\x05\xac\x2e\x60\x75\x01\xab\x0b\x58\x5d\xfa\xda\xea\xf2\xa5\x34\x7a\x2d\x8d\x5f\x4d\x67\x5e\xf1\x57\xdb\x8f\xa7\x67\x42\x51\xc0\x56\x85\xa8\x0e\xf1\xa7\xfe\x7c\xfd\x19\xf0\x11\x9f\x2b\xaf\xbb\x83\x30\x62\xd6\xe1\x85\xfc\xe1\xbc\xb2\x20\xe4\x88\x1b\x3e\xb7\x3e\x58\x45\x88\x3c\x1c\xdf\xf3\x01\xb3\x6b\x64\x7c\x49\xad\x78\xda\x7f\x56\x5c\xcd\x86\xce\xed\xf7\x5e\xa5\xea\xdc\x84\x41\xc7\x05\xd1\xd6\x03\xd5\x52\x14\x3e\xe4\x28\xa1\xe3\xfc\x59\x4b\xe5\x95\x33\x06\x17\x49\xa1\x8a\x53\xbb\xf1\xcb\x02\xb3\x91\x2b\xd4\x7d\xae\xfd\x51\x77\x39\x9f\xdd\x25\xea\x33\xe3\x9f\x97\x1f\x71\x26\x7b\xcf\x20\x7a\xd7\x20\x7e\xc7\x60\xe6\x3b\xbe\x47\xe1\x57\x06\xae\x4a\x39\xc8\x86\xe8\x32\xbd\x59\x7f\xb8\x3f\xeb\x7b\x5f\x51\x23\xf6\x12\xb5\xab\xac\x2d\x62\x6b\x7a\xa9\xee\xe5\xcd\x2b\xca\xd5\x1a\x4f\x27\x91\xa7\xfe\x1b\x4c\x5f\xd0\x0c\x3d\x50\xac\xf9\xda\x28\xce\x48\xf2\x5a\x97\x2d\x4e\x72\xe5\xf0\x56\xbf\x7c\xa8\x19\x3d\xb9\xe9\xdb\x6a\x7c\x3f\xc2\xe8\xcb\xf2\x8a\x40\x57\x5c\x16\x87\xb5\xd5\x21\xf1\x0d\x43\x6c\xcf\xc3\xff\x8a\x0e\x0c\xe7\x98\x32\x54\x54\xb5\x1b\x65\x9b\xd6\x4c\x9d\xdd\xc5\x1d\xf8\xf8\x4d\x75\x0d\x27\x94\x15\xa9\x01\x45\x0b\xf1\xbe\x60\xd1\x2f\xe9\x98\x32\x74\x96\xda\x24\x54\xac\xa2\xa9\x8e\xa6\xea\xec\xeb\x65\xfb\x08\x97\x4d\x5e\x9e\x23\xd4\xe9\x86\x02\x97\xfc\x32\xf2\xd9\x7b\xac\xfa\x71\x13\xd6\x6d\xc0\xa8\x09\x46\xcd\x3e\x35\x6a\x96\xca\x68\x4e\xe0\xf8\x33\x68\x9a\xe3\xf8\x13\xe8\x18\x3a\xba\x01\x78\xb9\xe0\xaa\x6e\xcd\x49\x04\xd5\xb9\x78\x50\x7d\x2f\xbe\x47\xcc\xe6\x40\xd2\x6e\x22\xb4\x6e\xff\x91\x65\x1f\x7a\x1e\x1d\x96\xb1\x03\x96\x41\x5e\x74\x89\xc9\x07\x58\x28\x66\x40\xab\x39\x2e\xad\x7a\xe3\x29\xd4\xfc\xf8\xab\xd7\xf0\x5f\xef\x41\xbb\x22\x0f\x5e\x5b\x29\x64\x0e\xad\x1d\x27\x30\xcd\x0b\xf4\xa8\xe1\x8c\x5f\x60\x6e\x2f\x8f\x11\x08\x97\x76\xa5\xd0\xec\x66\x88\x0b\x80\xb8\x00\x88\x0b\x00\x4b\x09\x58\x4a\xc0\x52\x02\x96\x92\x9e\xb1\x94\xf4\x8e\x21\x00\x08\x35\x10\x6a\x20\xd4\x40\xa8\x81\x50\xf7\x35\xa1\x06\x84\x06\x08\xad\x4f\x11\xda\x96\x8c\x0b\xf8\x57\x29\xb4\x22\xb8\x1f\x45\x55\xce\xfd\xca\x88\x20\xad\x19\xf7\x0b\x50\xd1\x98\xbf\x5f\x0f\x10\x60\x14\x69\xad\x14\xf2\xcd\x68\x52\x5b\x02\x05\x2a\xc9\x54\x70\x16\x9f\x93\xa7\x2a\x35\xa9\x48\xdc\x91\xef\x71\x60\x0e\x65\xff\x0e\xc5\x90\xb7\xc7\xfc\xa0\x80\xa6\x90\x6d\x4c\x06\x04\x74\x19\xb3\x09\x2a\x56\x43\x0e\x7a\xa1\x2e\x08\x40\x45\xd7\x3a\xdc\xbb\xe0\xbf\x05\x51\x01\x1b\x8c\x0a\xf8\x67\x03\xc8\x16\xe2\xe8\x06\x32\xb8\x38\xd2\x50\xe7\x07\x2c\xba\x29\xc2\x04\x2c\x64\x06\x61\x02\x5d\x79\xf1\x8b\x22\x6e\xe0\x05\x44\x43\x71\x03\x5d\x79\xf3\xad\x06\x12\xb4\x26\x7d\xd7\x12\xa9\xeb\x90\xcc\xb9\xf7\x8d\xc5\x48\xdf\xb1\xd8\xa0\x81\xa6\x92\xf8\xb0\x0c\x18\xa8\x93\xc4\xfe\xc3\x5d\x92\xc9\x10\x24\x00\xe8\x1b\xd0\x37\xa0\x6f\x40\xdf\x10\x24\x00\x41\x02\x10\x24\x00\x41\x02\x60\x82\x01\x13\x0c\x98\x60\xc0\x04\x03\x26\x18\x08\x12\x80\x20\x01\x08\x12\x80\x20\x01\xb0\x70\x82\x85\xb3\x07\x2d\x9c\x3d\x1d\x24\xd0\x55\x20\xdd\xfe\xc0\x80\xff\x35\x8a\x4e\x6e\x30\x30\x60\xfc\x7b\x4c\xb5\x4a\xde\x8e\x3f\x3b\x8a\xbf\x36\x10\xc3\xc9\xf7\xda\x44\xd5\xeb\xb6\xab\xcd\x83\x02\xd8\xcd\x9b\x62\xad\x2c\xbd\x37\xd5\xfc\x10\xcf\x4d\xb0\x0a\x79\x83\xf0\xe1\xf8\x41\x78\x07\x1e\x2c\x93\x6e\x1b\x42\x32\xef\x8b\x33\x43\xe7\x6d\x62\x55\x54\x8d\xb4\xda\xc7\xde\xfd\x60\x94\x06\x5e\x08\x46\xe9\x44\xa3\xf4\xbb\xd3\xfd\x65\x94\x4e\x5a\x95\x9b\x0b\x44\xab\xd6\xb2\x40\x6c\xd5\xf1\x26\x41\x38\xe6\x7e\x65\x57\x9c\x5f\x8e\xdc\x3c\xac\xe5\x97\x13\x6f\x0d\xde\xca\x36\x60\x90\x70\x09\x12\x0e\xec\x10\x5d\xb1\x43\x00\x80\x02\x00\x05\x00\xaa\x53\x00\xaa\xf4\xf9\x54\x9b\x77\xe1\x97\x85\x13\xda\x79\x34\x1b\x72\x42\xeb\xf0\xce\x5e\x89\xd7\x21\x76\xe2\xed\xa2\x99\xba\xbc\xaf\x2a\xfe\xfe\x5d\x31\x6a\xc4\x61\x4b\xb5\x5d\x83\x3b\xed\x08\xdc\xdf\xea\x06\x6b\xd4\x52\x5d\x6d\xb9\xeb\xba\xc5\x1b\xeb\x0b\x1a\xe3\xf5\xd8\xcb\xfe\x9c\x7c\x28\x7c\xb1\x4a\xec\x32\x09\x5f\xdd\x13\xbe\xca\xb3\x26\x90\xb2\xa1\x8d\x35\xdc\x17\x29\x85\xfd\xbd\x2a\xaf\xb2\x5a\x16\x2f\xa2\x39\x54\xaa\xdb\xda\x4d\xa2\x23\x1b\x18\x46\xf3\x3c\xca\x1b\x34\x9a\x04\x8d\xe6\x33\x03\xe8\xd3\x03\xf8\x53\x03\x99\x4f\xf8\xcb\xc2\x4b\x03\xfd\xb3\x67\xab\xb3\xca\xb2\x76\xe6\xde\x6e\xdc\x73\x80\x0d\xce\x20\xdd\xc3\x70\x93\x81\x3b\xc2\x57\x37\xe1\x1c\xa9\x56\xf8\x93\x4c\x8d\x13\x4f\xf3\x3b\xb8\x4a\xe5\x28\xc3\x25\x87\x9a\xf3\x22\xef\xc1\x05\x36\x2d\xe4\xdf\x0b\xde\x64\x09\x7e\x1c\x69\xbe\x99\x2c\xbe\x96\x42\xaf\xa6\xf0\x2b\xa9\xcc\x17\x7c\xc6\xfb\xc9\xd4\x59\x6a\x6b\x5c\xdb\x2b\x53\xde\xec\x54\xc9\x2e\xb1\x9f\xb2\xca\x54\xe4\x2b\x38\x1c\x17\x8a\x59\xcd\x09\xdc\xdc\xc6\x54\x8d\x7f\x38\x77\x1e\xac\x18\x9a\x5c\x78\x49\x45\x77\x14\x7a\x53\xb6\xa9\x70\xae\xb3\x08\xb5\x2a\x24\xaf\x88\x37\xf2\x44\x15\x5e\x5f\x72\x48\x1d\xdb\x00\xfe\xeb\xb3\xdb\x78\xb5\x22\x11\x24\xef\x4d\x6d\xca\xee\x38\x69\x81\x79\x34\x7e\x81\xd9\x81\xef\xe0\xdf\xd4\x6d\x5e\x7c\x06\x4d\xe3\xa9\xec\xa9\x1d\x29\x3c\x68\xa9\xee\x72\xe6\x71\x3e\x25\xa5\x7c\x68\x56\x44\x76\x90\xdd\x95\x93\xa3\xe7\x23\x1d\x38\x7b\x1a\xff\xda\x08\xda\x27\xb0\xb3\x49\xdc\x9b\xd4\x66\xd3\x3e\xc4\x9c\x0d\xb3\x6c\x13\xc7\xd1\x2a\xaa\xe3\x10\x1f\x34\xff\xc0\x08\x7e\xe7\x00\xba\x3b\x78\x82\x2d\x96\x8f\xc6\x50\xe6\x59\xf1\xf8\x34\x7b\x3c\xf7\x10\xbb\xe1\xa2\xff\xcc\x95\x42\xf8\x6a\x9b\x51\xb2\x8a\xce\x8a\x31\x79\x0a\x9d\xe0\x63\xf2\x30\x3a\x88\xf6\x37\xcd\xc5\x1f\xfa\xf6\x95\x42\x3e\x5c\xaf\xc4\x71\xf6\x6c\xf2\x30\x9a\xc4\x47\xe4\x30\x6a\x68\x63\x39\x86\x22\x6f\x0c\x8f\x9b\x04\xf8\x9c\xf9\xfd\x1d\xf5\xdd\x90\x8d\x67\xc1\x91\x9e\x78\x54\xde\xd3\x9d\xce\x28\xce\xa2\x73\xe8\x4c\x9d\x56\xb0\xb1\xde\x00\x85\x00\x20\xee\x06\x21\xee\xcb\xa9\xb6\x89\x84\xf3\x02\xcc\xce\xa0\x62\x00\x66\x6f\x3f\xf9\x62\xd5\x5c\x94\xfb\xc8\xae\x7a\xf9\xf2\x80\x87\x56\xcd\xa8\x4c\x79\x44\xfc\xde\x25\x91\x02\x00\x15\x00\x2a\x00\x54\x00\xa8\x00\x50\x01\xa0\xf6\x27\x40\xed\xb0\x5e\x90\xc8\x67\x8b\x2f\xdd\x55\xaf\x1a\xec\x4d\xc0\xa5\x11\x7d\xe1\x61\xbe\x0d\xef\xbc\xba\x00\x4c\xb4\xdf\x94\x14\x60\xa2\xc0\x44\x37\x99\x89\xde\x36\xf8\x29\x89\xa2\x96\x8e\xa2\xc3\xf8\x60\x76\xbf\xcf\x35\xbf\x2b\xcc\x35\xc3\xe5\x76\x81\x65\x7e\x6b\x04\xcd\x09\x96\x69\x2f\xaa\x5a\xde\x6b\xac\x70\x02\xf0\xf1\x95\x82\x70\x9e\x1e\x67\xb5\x71\x2c\x55\xf3\xa8\x26\xff\xfb\xed\xe3\x36\xad\x04\x9c\xf3\xe3\x23\xf8\x3b\x83\xe8\x3e\x56\xda\x54\xb8\x30\xb6\xd8\xfd\x44\x4a\x3a\x61\x07\x59\x9d\xd8\x8c\x17\xfb\x02\x2f\xf5\xf6\x65\xca\xc6\x95\x1e\xd2\xdc\x3d\x95\x7d\x88\x3f\x3d\x14\x24\x35\x88\x44\xa9\x53\x8b\xf8\xfb\x29\xc7\x25\xaa\x3e\x1a\x44\xf3\xf1\x3d\x88\x8c\xfd\x32\x5c\x52\x0d\x04\xd7\x50\x24\x00\x37\x54\x76\x3e\xb7\x87\xbf\xee\x72\xfd\x87\x5c\x29\x5c\xf4\x3e\x5d\x67\x75\xed\xf1\x2c\xdf\xa5\x1b\x68\x5e\xcc\xab\x59\x74\x8e\xcf\xab\x29\x74\x0a\x9d\xd8\xc0\x52\xca\xb3\x72\x9d\x59\x21\x66\x72\x1a\xaa\xe6\x53\xe0\xa6\x30\x24\xac\x6b\x0a\x36\x1d\x99\x72\x2a\xb2\x5e\x88\x5a\x0e\x20\xb3\x39\x64\x36\x2f\x41\x7a\x17\x48\xef\x02\xe9\x5d\x20\xbd\x4b\xdf\xa4\x77\x29\xf5\x4c\xf6\x92\xb6\xd7\x64\xc3\x69\x35\x4a\x90\x56\x03\xd2\x6a\x40\x5a\x0d\x48\xab\x01\x69\x35\xba\x9f\x56\xa3\x54\x40\xe3\x78\x2c\xbb\xd7\x27\x1d\xbb\xc2\xa4\x83\x6d\xdb\x1a\x09\xc7\xf3\xe8\x39\xfc\x4c\xf6\xad\xfe\x23\x93\xb2\xb2\x02\x3d\x32\x9d\xa8\xe6\x2e\x2b\x8e\x46\x2d\x32\xaa\x38\x35\x6d\x99\x75\x18\x57\x7a\x89\x5a\x15\x06\x1d\xcb\xa6\xbc\x71\xb2\x3b\x7d\x48\xd1\x49\x86\x52\xea\xeb\xec\x06\x25\xc8\x6e\xd0\xb9\xec\x06\xa5\x9e\xcf\x6e\xb0\x05\xf3\xb7\xe3\x7f\x3b\x84\x1e\x61\x5d\x37\xbe\x52\x18\xf7\x6c\x39\xa6\xbb\x42\x2b\xb5\x2a\xd1\x2a\xaa\x51\x75\xf0\x3b\x87\xf0\xb7\x07\xd0\x76\x8d\xda\xe4\xda\x4a\x21\xb3\x7f\xed\xd3\x02\xe7\xfd\x42\xae\xf0\x42\xa6\x59\x21\xb9\x71\xf6\xd0\x34\xb5\xc9\x95\x42\xec\x0d\x67\xa9\x3d\x55\xa9\xf8\x30\xb1\x7d\xf6\xbb\x0e\x81\xc4\x65\x74\x41\x80\xc4\xb3\x68\x86\x83\xc4\x93\xe8\x38\x9a\x6c\x0a\xe8\x59\xdb\x71\x0b\x5c\xdc\xb7\xb7\x94\xcc\xfe\x6a\x32\x24\x3c\x80\x27\x24\x24\xcc\x66\x25\x0d\x8c\x7d\x5f\x94\xd0\x27\x64\xc9\x07\x7c\x08\xf8\x10\xf0\x21\xe0\x43\xc0\x87\x80\x0f\x01\x1f\x02\x3e\x04\x7c\x08\xf8\x10\xf0\x21\xe0\x43\xc0\x87\x5d\xc6\x87\x40\xea\x80\xd4\x01\xa9\xeb\x63\x52\xf7\x7f\x8d\xa0\xc3\x1e\xa9\x5b\xd3\x05\x91\xb7\xa1\xcd\xbf\xc0\x73\x44\xfc\xe7\x23\xf8\x0f\x07\x03\x84\xf7\xd9\x56\x7c\x0f\xe7\x58\x31\x97\xd9\x0d\x3d\xe1\x81\xf8\x28\x7f\x9d\x40\x88\x81\xd3\x61\x50\xc9\x5e\x27\x86\x3d\xe9\x7a\x38\x97\x4c\x15\x47\xf0\x50\x3d\x55\x0c\x1a\x1d\x3c\x0d\x01\x15\x02\x2a\x04\x54\x08\xa8\x10\x50\x21\xa0\x42\x40\x85\x80\x0a\x01\x15\x02\x2a\x04\x54\x08\xa8\x70\x33\x51\xe1\x61\x74\x10\xef\xcf\x16\x7c\xb7\xc1\x07\xc2\x9e\x86\xc1\xe6\x0d\xfc\x0d\x81\x62\x02\xc5\x04\x8a\xd9\x55\x8a\xf9\x7f\x0c\xa3\xfd\xf2\x98\xa2\x9a\x4b\x1d\x4d\xad\x18\x66\x39\x40\x9a\x1c\x60\x51\xd3\x55\x2b\x16\xd5\xbd\x3b\x88\xed\xe0\x7f\x18\xc2\xdf\x1a\x44\xaf\x0b\x3d\x74\x6d\xa5\x90\x79\x49\x82\x4c\xc3\xd4\x8d\x15\x43\xaf\xa9\x95\x08\xd3\xf4\x55\xdc\x27\xfd\x62\xe7\xa9\x3e\xe5\x17\xdb\x16\xb0\x99\xcf\x09\xcc\x37\x15\x54\xed\x4a\xa1\xc9\x0b\xe7\x0c\xc7\xdd\x6a\xae\x8e\x9b\x01\x2e\x77\xc7\x83\xcb\xbb\x30\xe2\x15\xe3\x9e\x89\xd7\x17\x93\xe1\xe5\x29\x7c\xc2\x4b\xc0\x1a\xf4\x8e\xa4\x98\x4d\xba\x08\x90\x26\x20\x4d\x40\x9a\x80\x34\x01\x69\x02\xd2\x04\xa4\x09\x48\x13\x90\x26\x20\x4d\x40\x9a\x80\x34\x01\x69\x82\xf7\x23\x70\x43\xe0\x86\xc0\x0d\x37\x85\x1b\x7e\x65\x18\x1d\xf2\x8e\x37\xb7\x9c\xe4\x34\x8c\x84\xa3\x2e\x36\x81\xf1\x0f\x0e\xe3\x97\x07\xd1\x76\xf6\xdc\xb5\x95\x42\x66\xa5\x35\x64\x78\x59\x94\xb0\x40\xdc\x36\x51\xc2\xdd\x82\x12\x5a\x96\x13\xc9\x9a\xe8\xbf\x66\xce\x70\x5c\x60\x81\x8d\x2c\xf0\x62\x32\xe6\xdb\x8b\x47\xfc\x73\x96\x2c\xc7\xcb\x84\xe8\xb7\x6c\x34\xe0\xb9\x15\xb6\x08\xdc\x0f\xb8\x1f\x70\x3f\xe0\x7e\xc0\xfd\x80\xfb\x01\xf7\x03\xee\x07\xdc\x0f\xb8\x1f\x70\x3f\xe0\x7e\xc0\xfd\xba\xcc\xfd\xc0\x23\x11\xc8\x22\x90\x45\x20\x8b\x1d\x24\x8b\xbf\x99\x46\x77\x0b\xb2\x28\xce\x8a\x1b\xc7\xbf\x90\xc6\x9f\x4f\xa3\x3b\xc4\x3f\x33\x99\x32\x3f\x36\x6f\x89\xda\x55\xbf\xdd\x54\x85\xf3\xa6\xdc\x3d\x65\xe2\x8a\xf3\xe1\xa6\xe6\x67\xcf\xb1\x9f\xda\x77\xf0\x58\x43\x41\x93\x0d\x05\x4d\xb6\x52\x50\xc9\x40\x17\x05\xb4\x3b\x87\xce\x70\x68\x77\x0a\x9d\x40\xc7\x36\x00\xed\xbc\x6f\x4c\x42\x76\xf8\xbd\x23\xe8\x58\xf3\x43\xc1\x17\x89\xab\x7a\xf8\x36\xfe\x7c\xf0\x5f\x1f\xc6\xef\xde\x86\x70\xe4\x74\x38\xfe\x54\xe6\xa7\x5b\x89\x5c\x0f\x1f\x1b\xd4\x13\xb1\xeb\xd9\x9b\xf5\x67\xd5\xf1\xaf\xe9\xc8\x81\x75\xb7\x11\xf9\x4d\x0c\x5f\x5f\x97\x07\xe8\x7a\x0f\xaf\xe2\x5d\x04\x24\x18\x48\x30\x90\x60\x20\xc1\x40\x82\x81\x04\x03\x09\x06\x12\x0c\x24\x18\x48\x30\x90\x60\x20\xc1\x40\x82\xbb\x4d\x82\x7b\xe8\xa0\x60\x40\xbc\x80\x78\x01\xf1\x6e\x21\xc4\xfb\xfd\x6f\x44\xb3\x11\xc4\xbb\x52\x68\xe6\x38\x6a\x51\x5d\x37\x1c\xbb\xc6\xb7\xf3\x8b\x35\xbd\x4c\x5c\x0f\x4b\x8e\x3b\xae\xea\xd6\x1c\xfc\x85\x0c\xfe\x91\x01\xb4\x53\x14\x75\x6d\xa5\x90\xd9\x67\x13\x55\x57\xc4\x55\xaf\xc9\x83\xa5\x7b\x9e\xea\x33\x7e\x89\x45\x5e\x62\x6e\x9c\x3d\x21\xc0\x71\xd8\x19\x34\xe6\xd6\x05\x5e\x6a\xfb\xa8\x32\x87\x79\x7a\x53\xf4\x86\x66\x05\xe5\x2b\xa2\xd3\x9c\xf2\x4d\xa2\x23\xe8\x50\xd3\x63\x6d\x44\x13\xf0\x83\x6d\x1a\x6b\xee\x51\xbc\x87\xe3\x29\xde\x1d\x78\xb0\x4c\x5c\x74\xfd\x2d\xc9\x0c\xef\x10\x3e\x20\x19\x9e\x78\xa1\x77\xb8\x4d\xe3\x3b\x23\x9e\x9e\x99\x77\xec\x0c\xf7\xd2\x7e\x9b\x58\x15\x55\x23\xeb\xea\xa8\x09\xf9\xd0\xa6\xf5\x55\x71\x0e\x95\xd0\x93\x78\x70\x91\xea\xab\x19\xfe\x5f\x25\x95\xdb\x70\x9f\x14\x3f\x96\x46\x1f\x4d\xe3\x8f\xa4\x33\x1f\xf4\x65\xf7\xb7\x53\x57\xd9\x22\x28\x17\xee\x51\xee\x18\xad\xb1\xed\xb9\x10\xb6\x91\xcd\x62\x18\x20\x2e\x12\xc5\x3b\x30\x4a\xcf\x2b\x53\xa6\x62\x98\x02\xd3\x50\x5b\xa9\x99\x3e\xe9\xd1\x15\xdd\x5e\xbd\x5c\x33\x15\xdd\xb0\x09\x93\x30\xc4\xc7\x07\x4c\x0b\xe0\x6a\x96\xe4\x27\xde\x6e\x49\xee\x58\x95\xa5\x9a\xcd\x35\x72\xcb\xa6\x1a\x71\xb8\x3e\x24\x3b\x4d\xae\x96\x79\xe5\x0a\x7f\x23\xdf\xe9\x70\x05\x66\x52\x19\x53\xa6\x2a\x95\x49\xae\xed\xe8\xf6\xaa\x62\xd7\x4c\xd6\xe1\x4c\x24\x79\x2a\x9e\x2c\x8e\xe8\xd9\x3b\x44\xd5\x42\xf2\xb7\xf8\xa1\x34\xfa\xfe\x34\x7e\x7f\x3a\xf3\x5e\xbf\x81\xbe\x99\xe2\x0a\xf2\x05\xd5\x54\xcb\xc4\x16\x5b\x3d\x61\x7f\x76\x1c\xaa\x19\x5c\x7b\xf1\x37\x55\x2a\xdf\x95\x52\x5b\x61\xca\xad\xbb\xea\xab\x73\x55\xf5\x06\xab\xbf\xbb\x4c\x1c\xe2\x09\x49\x26\xb8\x3d\xdc\xc5\x89\xcf\x22\x51\xb8\x78\xe6\x1b\x28\x6a\x2b\x85\x89\x23\xec\x5e\x5b\xd5\x38\x97\xab\x50\xb3\x2c\x44\x22\xdf\xe4\x30\x7d\x54\x35\x4c\xa1\xa9\xf0\x4d\x44\x70\x2f\x67\x15\x92\x1a\xb2\xad\xaf\xb7\xcc\x95\x69\x45\x35\xcb\x79\x6a\x97\xc7\xad\x1b\xe5\xf1\x9a\x69\x68\x54\x27\xe3\xbb\x67\x9d\x79\x56\x4a\x3e\x7b\x57\xf8\x5b\xc3\x0b\xd3\xe7\x52\x6d\x94\x0d\xc2\x22\x55\xe0\x16\xa9\xed\xd3\x42\x75\xbf\xa5\xf2\x92\x4c\x09\xcd\x85\x90\x55\x6b\x59\x08\xb5\x26\x76\xa2\xa2\xaa\xf8\xc3\x77\x85\x85\xd0\x71\x4b\xb5\xd9\x7e\x9b\xed\x51\xf9\x12\xb7\x2e\x69\xb4\xcf\x62\x4b\xdb\xa6\xc8\xa2\x37\xd6\x17\x34\xc6\xeb\xb2\x97\x1b\x26\x1f\x0a\x5f\xac\x12\xbb\x4c\xc2\x57\xf7\x84\xaf\x32\x5d\xd8\x25\x65\x43\x1b\x6b\xb8\x2f\x52\x0a\xfb\x7b\x55\x5e\x65\xb5\x2c\x5e\x44\x73\xa8\x54\x27\x07\x27\xd1\x91\x0d\x58\xa0\xe6\x39\xe7\x07\x49\x98\x20\x09\x3f\x33\x80\x3e\x3d\x80\x3f\x35\x90\xf9\x84\x6f\xf8\x7a\x69\xa0\x7f\x24\x61\x1d\x1a\x61\xed\xcc\x51\x3f\xc7\x77\x6c\x70\x06\x06\xbf\xe1\x26\x03\x77\x84\x33\x6f\x61\x19\x52\x2b\xfc\x49\x93\x9a\x63\xe2\x69\x7e\x07\xb7\x0c\x3a\xca\x70\xc9\xa1\xe6\xbc\xb0\x7c\x5d\x60\xd3\x42\xfe\xbd\xe0\x4d\x96\xe0\xc7\x91\xe6\x22\xba\xf8\x5a\x0a\xbd\x9a\xc2\xaf\xa4\x32\x5f\xf0\x55\xf3\x4f\xa6\xce\x52\xb6\xd3\x34\x1c\xa5\x4c\x79\xb3\x53\x25\xbb\xc4\x7e\xca\x2a\x53\x91\xaf\xe0\x9b\xae\x2a\x51\x4d\x47\xa9\x39\x01\xe3\x1f\x53\x35\xfe\xe1\xdc\x72\x52\x31\x34\x41\xf7\x39\xcc\x55\xe8\x4d\xd9\xa6\xc2\xb2\x60\x11\x6a\x55\x48\x5e\x11\x6f\xe4\xa6\x4a\xaf\x2f\xf9\xe6\x27\xb6\x01\xfc\xd7\x67\xb7\xf1\x6a\x45\xcc\x6e\xed\x54\x47\x13\x97\x88\xce\x29\xa2\x6b\x18\xb2\x79\x23\xa0\xd2\x69\x74\x12\x1f\xcf\x4e\xfa\x70\xe3\xd1\x30\xdc\x88\x29\xfe\x76\x48\xdd\x87\xdf\x3b\x8c\xf2\x75\xbb\xb2\xb0\x6b\x88\x45\x75\x87\x68\x35\xdb\x70\x57\xf9\x75\x83\x38\xf8\xab\x43\xf8\xb5\x41\xf4\x3a\x7f\x3d\x15\x4e\x21\x6f\x6f\x2d\xa2\x6f\x9e\xea\x0b\xb2\x40\xb1\x84\xb6\x29\xb0\x4f\x3c\xe0\xad\xca\xbc\x4a\x0d\xaf\xda\x1a\xc1\x7d\x4d\x77\x85\x6d\xf7\xfd\xf0\x26\xdd\x33\xc9\x93\xee\x28\x3e\xdc\x64\xd2\x45\x9b\xb8\xd1\x77\x03\x42\xfd\xc0\xc1\x03\x1c\x3c\xc0\xc1\x03\x1c\x3c\xc0\xc1\x03\x1c\x3c\xc0\xc1\x03\x1c\x3c\xc0\xc1\x03\x1c\x3c\xc0\xc1\x03\x1c\x3c\x7a\xd1\xc1\x03\xbc\x34\xc0\x4b\x03\xbc\x34\xfa\xd8\x4b\xe3\x5b\x43\xe8\x41\xef\x80\xd3\x7a\xef\x8c\xb7\xe3\x2f\x0f\xe1\xaf\xa4\x83\x23\x4c\x1f\xe2\x3e\x17\xd1\x0d\xa6\x6f\x10\xcb\xdd\xcb\xae\xd6\x9d\x15\xda\x66\x1f\x8a\x37\xa3\x13\x02\x8a\x1d\x42\x07\x38\x14\xcb\xa3\x51\x94\x6b\xca\xa6\x59\xbd\xf3\x2b\x85\xbc\x5f\x9d\x5b\x30\x59\x72\xbf\x89\xf3\xc9\xe4\x6c\x18\xef\xa9\x3f\xba\x33\x78\x7d\xc4\x53\xe2\x63\x3b\x82\x96\x7d\xd4\xf3\x93\x68\xd6\xb8\x0f\xc8\x1b\x3a\xda\xbe\xc5\xd3\xe8\x24\x3a\x5e\x67\xef\x5b\x57\x03\x83\x85\x0f\x7c\x1d\x36\xe8\xeb\xf0\x83\x29\x54\x14\x0e\x0a\xc7\xd0\xd1\xc0\x41\xa1\x5d\x33\xfc\x16\x25\x47\x8b\x3e\x0d\xed\x14\x10\xb9\xbf\x7c\x7d\x20\x20\xb0\x50\xba\x15\x35\x24\x13\xee\x17\xbf\x75\x56\x24\x3c\x85\x2e\xa3\xf9\xb0\x48\xc8\x15\xd1\xe9\x0d\x98\x21\x66\x78\x5d\x2f\x71\xa0\xeb\x80\x98\x48\x12\x13\xdf\x48\xa3\xaf\xa7\xf1\xd7\xd2\x99\xdf\xf5\x1b\xe8\xb3\xe9\xa7\xc2\x0a\x8c\xc1\xf4\x68\xae\x84\x28\x8b\x64\x49\x18\x33\xfc\x9d\x43\x40\xcc\xe5\x66\x8d\x57\x31\x24\x06\x4c\x6a\x8e\x99\xa4\xac\xf2\x86\x90\x3a\x4c\x58\x5c\x08\x86\xe0\x77\x81\x1c\x7d\x46\xb5\x4a\x74\x26\x90\x2a\xab\x81\x95\x21\x20\xcb\x46\x65\x54\xaa\x36\x5c\xb9\x53\xca\x36\x5b\xd2\x2c\x62\x1b\x54\xf7\x55\xb4\x60\x75\xe3\x06\x1c\xaf\x35\x6a\x0e\xab\x64\x58\x2d\x54\xd9\x93\xde\x07\xc9\x97\x2c\x89\xdd\xb4\x57\x44\x5e\xd4\x53\x58\xd0\x63\xea\x98\xc5\xbc\x0a\xf3\xbc\x06\x31\x2a\x5b\xf1\x4b\x69\xf4\x5a\x1a\xbf\x9a\xce\xbc\xe2\x37\xf3\xc7\xd3\x33\x21\x03\xa5\x55\x21\xaa\x43\x7c\xf4\x31\x6f\x53\x4b\x2d\xf3\x0e\x10\x06\xb0\x88\xf5\xc3\xfb\x96\xc0\xc2\xc9\x7a\xa9\x90\x3f\x9c\x57\x16\x44\x87\x88\xd6\xb1\x98\xc6\xce\x76\x3d\x1e\x45\x23\x0a\xb5\xad\x65\xd5\xf4\xac\x31\x76\x8d\x8c\x2f\xa9\x15\x8f\x3a\x67\xc5\xd5\xac\xb2\x64\x98\x6a\xc5\x78\x9b\x87\xaf\x16\x09\x53\x09\xf9\x1e\x61\x5c\xa8\x82\x7a\x80\x34\x45\xe1\x43\x4e\xf0\x90\xe0\xbc\x79\xe5\x8c\xc1\x87\x73\xa8\xe2\xd4\x6e\xfc\xb2\x60\xbf\xe5\x0a\xcc\xcc\x27\x1b\x75\x97\xf3\xd9\x5d\xa2\x3e\x33\xde\x87\x44\xcc\x3a\xc5\xf7\x0c\xa2\x77\x0d\xe2\x77\x0c\x66\xbe\xe3\xdb\xf6\xbe\x32\x70\x55\x72\x20\x36\xa5\xd8\x86\xa7\xac\xda\x8b\x6a\x99\x28\x1a\xad\x54\x08\x97\xa1\xc1\xbc\x20\xf6\x12\xb5\xab\xac\x2d\x62\x6b\x7a\xa9\xee\xe5\xcd\x2b\xca\xc7\xb3\x37\x18\x85\x21\x93\x8d\x53\x9d\x68\x86\x1e\x00\x5d\xce\x06\x85\x87\x85\xd7\xba\x0e\xcf\x3e\xc1\xaf\x7a\xf4\x2f\x1f\x6a\x46\x8f\x1b\xf9\x9b\x1c\xdf\xa2\x17\x7d\x59\x5e\x99\xd2\xd8\x7e\x88\xaf\x9d\x61\xe1\x30\x24\xbe\x61\x48\x19\x93\x1d\x1f\x1d\x18\xce\x31\x65\xa8\xa8\x6a\x37\xd8\x3a\x61\xea\xec\x2e\x6e\x4a\xe3\x37\xd5\x35\x9c\x80\xb5\x72\xe8\x47\x0b\xf1\xbe\x60\xd1\x2f\xe9\x98\x32\x74\x96\xda\x24\x54\xac\xa2\xa9\x8e\xa6\xea\xec\xeb\x65\xfb\x08\xe3\x29\x2f\xcf\x11\xd2\xab\xa1\xc0\x25\xbf\x8c\x7c\xf6\x1e\xab\x7e\xdc\x84\xd7\xf4\xcf\xa7\xd0\x9c\x58\x76\xcf\xa0\x69\xbe\xec\x9e\x40\xc7\xd0\xd1\x0d\x2c\x1f\xc2\xb5\x0e\x5d\x66\xa5\x4d\xe0\xf3\x68\x16\xed\x10\x6d\x4b\xf4\x5b\x2d\x33\x69\x4f\xd0\xce\x35\xfd\xba\x12\xaf\x3f\xec\xc4\xdb\x45\x9b\xa3\xe2\x7f\xb9\x33\x58\xf5\x87\x1b\x3c\x17\x9b\xed\x0f\xee\xe3\x4e\x2d\x1d\x53\x05\xc0\x13\xb1\xdf\x14\x10\xf0\x44\x04\x4f\xc4\x4d\xf6\x44\xec\x38\xed\x69\xab\x64\x4f\xf4\x37\x3c\x84\x0e\xe0\x89\xec\x3e\xdf\x5b\xf0\xfe\xb0\xbf\xa1\x5f\x68\xe7\x23\x29\xf1\x0f\x0f\xa3\x8c\xc7\xfc\x64\x42\x7f\xaa\x07\xd0\xef\xa5\x61\xfc\x2b\x83\xc1\x1a\xf4\x13\xad\x64\x7f\xba\x48\x75\xd2\x13\x59\x9f\x5e\x7f\x33\xb4\x0e\x52\xbd\x7d\x4b\x60\x3f\xa5\x78\x3a\x9b\x3c\x2f\x76\xe3\xc7\x1a\xe6\x05\xd5\x09\x1c\xe4\x09\x5e\x7e\xe0\xe5\x07\x5e\x7e\xe0\xe5\x07\x5e\x7e\xe0\xe5\x07\x5e\x7e\xe0\xe5\x07\x5e\x7e\xe0\xe5\x07\x5e\x7e\xe0\xe5\xb7\x99\x5e\x7e\x05\x34\x8e\xc7\xb2\x7b\x7d\xf2\xb0\x2b\x42\x1e\xa8\xde\x05\xe8\x00\x8e\x81\xe0\x18\x08\x8e\x81\x5b\xc8\x31\xf0\x2f\xd2\x02\x12\x3a\xe3\xba\xe1\x68\x94\xc9\xc9\x20\x9b\xfc\x38\xfe\x52\x1a\xbf\x96\x46\x77\xf9\xd7\xae\xad\x14\x32\x6f\x28\x13\x37\xba\x2c\x8b\xda\xe7\x32\x65\xe2\xce\x78\x77\x5e\x29\x4c\xcd\xcf\x7a\x9b\xc0\x36\x26\xcb\x68\x5b\xea\x7e\x0b\x3d\x2d\x90\xdc\x45\x34\xc7\x91\xdc\x59\x34\x83\x8a\x1b\x4b\xdd\xef\x7d\xe7\x9c\xe1\x24\x72\x39\xfc\xae\x11\x74\xa6\x79\x93\xaf\x79\xf4\x2a\x31\x75\x8b\x1a\xa6\xeb\x54\x0c\x8d\x38\xf8\xf3\xc3\xf8\xd7\x07\xeb\x7a\x67\xb5\xb5\x80\xed\x33\xb2\xa4\x05\x56\x52\x9b\x82\xb5\xf7\xf2\x07\x42\x23\x20\xc8\xa2\x12\x79\xdd\xd6\x08\xd8\xee\x3e\xb0\x6d\x25\xa4\xfa\xfa\xb3\xc9\xd0\x76\x12\x1f\x11\xa8\x36\xd2\xea\x71\x89\x74\xea\x07\x20\xb0\x5c\x60\xb9\xc0\x72\x81\xe5\x02\xcb\x05\x96\x0b\x2c\x17\x58\x2e\xb0\x5c\x60\xb9\xc0\x72\x81\xe5\x02\xcb\x85\xc3\x59\x01\xfd\x02\xfa\x05\xf4\x7b\x1b\xa1\xdf\x3f\xc9\xa1\x09\xc1\x21\x55\xb6\xad\x2b\x1b\xdc\x6b\x9f\xdd\x1d\xd0\x48\x09\x13\x8c\x50\xb0\xf8\xcb\x39\xfc\x63\x03\x08\xd7\x3d\x73\x6d\xa5\x90\x79\x38\x26\x6e\x7c\x6a\x7e\x76\x41\x14\x90\x7b\x94\x5d\x9e\x8a\x3e\xc6\x29\xb1\xbc\xa1\xcd\x41\xe4\xab\xe8\x39\x41\xf0\xae\xa2\xa7\x39\xc1\xbb\x84\x2e\xa0\xf3\xb1\x04\x8f\x95\x31\xa6\x96\xcb\x6c\x2c\xb8\xd4\x0e\x20\x5e\x7d\xc3\x08\xda\x2b\xeb\x7b\xab\x51\xe6\xcf\x27\x93\xbc\x13\xf8\x98\x24\x75\xf1\x5d\x14\x61\x7a\x82\xf9\x85\xea\x97\x79\x79\x67\x6c\x3f\x29\xf1\x51\xe8\xa1\xae\xca\xca\x3b\xba\xd6\x5b\x45\x15\x5d\x43\xcf\xd6\x05\x7e\xb4\xb7\xbb\x20\x16\x04\x62\xd6\x37\x18\xb3\xfe\xb5\x54\xf3\x78\xf3\x4e\x0b\x19\x4d\x04\xcb\x3f\x83\xde\x1a\x04\xcb\xb7\xfb\x25\x2d\x46\xbd\xb7\x26\xb0\xd6\x14\x49\x6b\x4b\xb3\xdc\x0f\xed\x8a\x15\x58\xf7\x79\x51\xf1\x66\x58\x48\x3d\x26\x7e\xed\x9e\x8c\x82\x18\x79\x88\x91\x87\x18\x79\x88\x91\x87\x18\x79\x88\x91\xef\xcf\x18\xf9\xc4\xb0\xf6\xce\x6f\x6a\x8a\x3f\x7a\x57\xac\x8e\x30\x92\x10\x43\x1f\x52\x1c\x44\x50\x6a\x57\xf4\x06\x08\xa8\xef\x37\x6d\x05\x02\xea\x21\xa0\x7e\x93\x03\xea\x57\x37\x6d\xb7\x9a\x1c\x7a\x2c\x82\xe4\x3b\xbf\x4c\x94\x0e\xa3\x83\x78\x7f\xb6\xe0\x1b\x50\x1e\x08\x3b\xc3\x07\x37\x76\x21\x0e\xff\xcf\x86\xd1\x29\xc1\x59\x85\x93\x5c\x80\x57\xc3\x47\xf2\x34\xf3\xf8\xe4\x8f\xe0\x4f\x0d\xe3\xcf\x0f\xa2\xd7\x89\x7f\xf9\x87\xf3\xbc\xd0\xa2\xaf\x27\x7b\xaa\x4d\x3e\x9e\x4f\xdc\xf4\xfd\x19\x1d\x79\x20\x4f\xc8\xcb\x93\xfd\x0c\xde\x9d\xb7\xe0\xdd\x79\x35\x79\x5e\x1c\xc0\x13\x72\x5e\x44\x86\x93\x9c\x02\xa2\x2e\x0d\xc7\xf5\x80\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\x27\xf8\x75\x82\x5f\xe7\xed\xe3\xd7\xf9\xbe\x01\xf4\xb8\xf4\xeb\xac\xb1\x19\xef\xca\x62\xea\xb9\x23\xfe\x93\x34\xfe\xa3\x34\x7a\x20\x7a\x97\x0f\x17\x9b\x86\xf9\x3f\x5e\x26\xee\x54\xe4\x19\x09\x02\x21\xe0\x3f\x3e\xe0\xff\x07\x9e\x45\x43\xa2\x43\x1c\x97\xda\x6a\x99\xd4\xf7\x84\xe6\x18\xba\x6d\xb0\x69\x85\xff\xf4\x19\xfc\xbf\xed\x41\xaf\x97\x37\xfa\x9d\x31\x24\x36\x04\xb6\x54\x65\xbc\xb5\xce\xcb\xcb\x3a\xbd\x30\x3b\xc3\x0b\xc8\xbd\x91\xdd\xb8\x20\x9e\x96\xdd\xe2\x5f\xec\x71\x2a\x5b\x04\x46\x09\x8c\xb2\x08\x8c\x12\x18\x25\x30\x4a\x60\x94\x7d\xc3\x28\x8b\x3d\xc3\x28\xdb\x5e\x93\x0d\x33\xca\x22\x30\x4a\x60\x94\xc0\x28\x81\x51\x02\xa3\xec\x3e\xa3\x2c\xf6\x35\xf0\x2b\x02\xf0\xeb\x1c\xf0\x2b\xf6\x3a\xf0\x2b\x6e\x41\xe0\x57\xd2\xd1\xac\x00\x5b\x45\x74\x9a\x83\xad\x49\x74\x04\x1d\x6a\x7a\x80\x92\x07\xa1\x24\x5b\xca\xfb\x7c\xa8\x15\x98\x75\xfd\x99\x64\x0f\xb5\xa3\xf8\xb0\xf4\x50\x8b\xf2\x2e\xe9\xa2\xe6\xbf\xaf\xd1\x4d\xed\xfa\x23\xf1\x4e\x72\xdb\xf1\x36\xee\x1f\x97\xfd\xf0\xce\x46\x36\x86\xc5\x82\xa4\xa8\x21\x0c\xf6\xb0\xf8\xad\xd3\x20\x4c\x70\xab\x27\xd1\x59\x34\x53\xe7\x63\x7f\x00\x4d\xac\xbf\x03\xc0\xbb\x1e\x42\x94\x37\x18\xa2\xfc\x37\x29\x74\x46\x08\x81\x93\xe8\x38\x17\x02\x87\xd0\x86\xc6\x20\x2a\x89\x80\xe3\x69\x34\x15\x04\x1c\x6f\xb4\xac\xf3\x22\x46\x69\x06\x15\x43\x31\x4a\x1b\x2d\x2c\x49\x32\x35\x97\x1d\x16\x75\x5c\xd4\xa2\xe4\x4a\x94\x51\xf1\xa2\x2d\xf7\xb5\xd1\x46\xc9\xf4\x88\x0c\x46\x0b\x45\xf6\xd1\xa5\x90\x94\x1a\x12\xd7\xeb\xa4\x94\x7f\x73\xa7\xe4\x55\x67\xe2\x98\x01\xdc\x02\xb8\x05\x70\x0b\xe0\xb6\x7f\xc0\x2d\x68\x6b\x09\xda\x5a\xef\x90\x6d\xc8\x21\xd1\x95\x1c\x12\x60\x40\x00\x03\x02\x18\x10\xc0\x80\x00\x06\x84\xbe\x36\x20\x40\x2a\x21\x48\x25\x04\xa9\x84\x3a\x95\x4a\x08\xec\x73\x60\x9f\xeb\x57\xfb\x5c\xa9\xdc\xe6\x2c\x5a\x49\x50\x39\x17\x0f\x95\xef\xc5\xf7\x88\xd9\x1c\x48\xda\x56\x01\xf3\x06\x4d\x63\xed\xcf\x4b\xf2\x8b\x7b\xd1\xe1\x84\xfc\xcf\xc2\x3d\x3d\x26\x09\xf4\x4b\x7b\xf1\xcf\x0d\xa0\x37\x34\xe6\xe1\x12\xe0\x3b\x21\x13\xf4\xe3\xb1\x99\xa0\xbd\x18\x82\xce\xa4\x83\xfe\x27\x22\x93\xea\x3e\x9e\x49\x95\x0d\x1c\x4e\xc1\x6f\x35\xf7\x8d\xb0\x51\xac\x23\x27\x34\x49\x1e\x23\x45\x7c\xba\xe5\xc4\x37\x62\x6c\x34\x64\xbf\x49\x48\x3d\x9d\xf9\xe2\xce\xe6\x7d\x97\x9c\x1d\x7a\xa8\x59\x76\xe8\x8e\xf6\x60\x71\x09\xe9\x68\xb1\xce\xcc\xda\x81\x2e\x04\xac\x07\x46\xd8\x0d\x1a\x61\xff\x34\xd5\x1d\x21\xb3\x2c\x4c\xb4\x2a\xba\x16\x98\x68\xfb\x54\x9c\x59\x35\x17\xe5\x7e\x72\x57\x73\x71\x16\x9f\x3b\x7a\x4f\x93\xdc\xd1\x9d\x95\x60\x90\x40\x1a\x12\x48\xdf\xbe\xf0\x1f\xa8\x0f\x50\x1f\xa0\x3e\x90\x40\xba\x07\xf4\x85\xc4\x3c\xd5\xc5\x9f\xbd\xab\xb9\xca\xb0\x8e\x54\xd2\x4f\xc4\xa7\x92\xee\x98\x1a\x01\xf9\xa4\xfb\x4d\x79\x81\x7c\xd2\x90\x4f\x7a\x93\xf3\x49\xff\x93\xe6\xf9\xa4\xbb\xb1\xdd\xed\xf2\xda\x91\x94\xbb\xba\x87\x32\x4b\xff\xf1\x30\x3a\x2a\x08\xee\x22\xcf\x21\xdd\x52\x46\x69\xcd\xa6\xe6\x75\xba\xe8\xe0\x1f\x1b\xc6\x3f\x33\x88\xee\xe6\x8f\xfa\x6b\x9f\xd3\x5a\x4a\xe9\x69\x9b\x9a\x25\xba\xd8\xa6\xa4\xd2\x7b\xf8\x03\x45\xf6\x9f\x86\x9c\xd2\xf2\x4d\x90\x55\xfa\x16\xb2\x4a\xbf\x29\x79\xe6\xe4\xf1\xa8\x9c\x39\x7c\x3c\x78\xf6\x08\xd1\xf8\x90\x4f\x1a\x72\xb5\x40\x3e\x69\x70\xf9\x07\x97\x7f\x70\xf9\xef\x6b\x97\x7f\xc8\x27\x0d\xf9\xa4\xc1\xd5\x1a\x5c\xad\xc1\xd5\x1a\x5c\xad\x7b\xc2\xd5\x1a\xf2\x49\x6f\x31\xf7\x55\xc8\x27\x0d\xf9\xa4\xb7\x56\x7a\x19\xfc\xd2\x08\x3a\x23\x28\xa3\xbd\xa8\x6a\xf9\xff\x8f\xbd\x7f\x8f\x6f\xe3\x3a\xef\xfc\xf1\x17\x48\x2a\x92\x1e\x2b\x6b\xeb\xc8\x8e\x6d\x48\xb2\x61\xc8\x26\x41\x88\x04\x09\xea\x4e\x5d\x09\x52\x94\x08\xd1\x32\x43\xda\x74\x9a\xd8\x51\x86\xc0\x08\x82\x0c\x61\x90\x19\x90\x8a\xda\xcd\xbe\xd2\x66\xb3\xc9\x6e\xf7\x92\x66\xb3\xe9\xb6\xdb\xa4\xd9\xb4\x75\xe3\xd6\x89\x93\x6e\xba\x6d\xe2\xb6\x69\xbb\x4d\xe2\xad\x5b\xff\x72\x69\xda\x74\xd3\xa4\x49\x9b\xfc\xb6\x6d\x7a\x4f\xb7\x49\xb3\xed\xe6\xfb\x9a\x73\xe6\x0a\xcc\x70\x00\x68\x00\x82\xc2\xe7\x9f\x44\xe6\xcc\x1c\xcc\x9c\x33\xf3\x9c\x73\xde\xcf\xe7\x79\x1e\x93\x41\xd5\x48\x45\xd7\x87\x8e\xaa\x52\x92\x35\xf6\xd1\x04\x7b\x71\x80\xee\xd4\x9b\x99\x72\xb6\x72\x69\x2d\x1d\xad\x34\x06\x1e\x17\x15\x7d\x7e\x0e\x85\x3a\x26\xf9\x05\x8b\xb5\x37\xb3\xec\x80\x8f\xfa\xaf\x6d\x0e\xf2\xe8\x4b\xe8\x43\x47\x92\x26\x79\x7c\x32\x18\x2a\x4e\xb2\xa3\xce\x22\x8d\x06\x60\xf4\x7d\x8b\x0c\xe8\xa8\x77\x3a\x35\x04\x36\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x41\x21\x6f\x1d\x0a\xf9\xf7\x43\xb4\x7f\xdd\x22\x6a\x82\x3f\xe6\xb4\x62\x59\xc9\xcb\x1a\xfb\xe4\x10\xfb\xd8\x40\x7d\x4a\xd6\x46\xf5\x8d\x4b\x73\x17\x95\x7c\x58\xa4\xf1\x3e\x7e\x41\x5d\x32\x6a\xfd\x17\x36\x07\x5d\xec\x52\x5d\xe3\xab\x83\x11\xe4\x11\x76\xa8\xc1\x0c\xbe\x56\x06\x06\x7d\x58\x80\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x81\x16\x3b\x8d\x16\x01\xfe\x00\xfe\x00\xfe\x7a\x18\xfc\xfd\xe8\x93\x94\xd4\x87\x6e\x6c\x2d\xed\xa7\x2e\xe4\xbd\xa7\xf2\x7b\x67\xdf\x78\x82\xfd\xbf\x87\x68\x6b\x4e\x51\xe5\x4b\x6b\xe9\x68\x42\x2c\x0c\x55\x63\x4a\x33\x6d\x9e\x72\x39\xf6\x54\xb1\x9c\x8f\xcd\xeb\x57\x2e\xea\x57\x26\xef\xd3\xcf\x9c\x56\x54\xd9\x29\x00\xb4\x8f\x77\x39\xa4\xcb\x80\x57\x81\x57\xa1\x06\x17\x78\x15\x78\x15\x78\x55\xef\xf0\xaa\x2e\x2a\x31\xd5\x35\xbc\x0a\xb5\x8f\xc0\xab\xc0\xab\xc0\xab\xc0\xab\x36\xa2\xf6\x51\x4f\xe3\x25\x14\x67\xe9\xe5\xe2\x2c\x99\x4d\x88\x97\xb2\x4f\x52\x46\x88\x9b\x8e\xd3\x31\x2e\x6e\x3a\x40\x69\x1a\xf3\x2d\x4f\x9e\x53\x54\x39\xb5\x96\x4e\xd9\x60\x68\xbe\xa8\x05\xcb\x99\xfc\x6b\x93\x0b\x25\xd3\x7c\xb0\x92\x69\x98\x0d\x19\xc2\xa5\x78\xdc\x10\x2b\xd9\x37\xe1\xcc\xd0\x46\xf1\xff\xbd\xcd\x06\x60\xbb\xc4\x8c\x13\x93\x9c\xac\xcb\x98\x86\x3a\x40\xbb\x04\x9c\xe2\x82\xb1\x9a\xac\xb1\xa3\xb4\xbf\x89\x5e\x46\xa2\x58\x54\xe5\x68\xb1\x2a\xc7\xd7\x22\x74\x4a\x7c\xe2\x47\xe8\x10\xff\xc4\xc7\xa8\xb9\x97\x8f\xa6\x45\xc1\x8d\x13\x34\x69\x17\xdc\x68\xba\x91\x19\x91\x6f\xfb\x24\x1d\x77\xe4\xdb\x6e\xba\x95\xd6\x2d\x4d\x45\x09\xdd\xd2\x24\x7f\x73\xc4\xb6\x34\xf7\x1b\x99\xd3\x1d\x69\xe8\x95\xcb\x4e\xab\x93\x14\x27\x08\xab\x33\x6d\x9d\xd5\x01\xfb\xd3\x9e\xc2\x1b\xa0\xad\xa0\xad\xa0\xad\xa0\xad\xbd\x43\x5b\xb1\x08\x0b\x58\x84\x75\x0f\x8e\x46\xd1\xa3\x8e\x14\x3d\x02\xf5\x07\xf5\x07\xf5\x07\xf5\x07\xf5\xef\x69\xea\x8f\xda\x77\xa8\x7d\x87\xda\x77\xed\xaa\x7d\x07\xa7\x1a\x9c\x6a\xbd\xea\x54\xcb\x16\xfc\x73\x7b\x86\x5a\x0f\xd2\x04\xc8\xa1\x02\xe2\xab\x49\x6f\x1c\xbd\x8b\xed\x14\xb6\xc1\xb6\xdb\xb4\x09\xb3\xc8\xb0\xb7\x3d\x49\x29\x77\x05\xae\xc0\xb2\x5b\x9f\x7f\x82\x7d\xfb\x21\xda\x66\x96\xdd\x8a\x3e\xb4\xbe\x42\xdd\x28\xc1\x94\xdc\xa3\x9f\x66\x94\xc8\xaa\xab\x8e\x05\x71\x3a\xc4\xe9\x10\xa7\xc3\x5d\x02\x77\x09\xdc\x25\x70\x97\x74\x8d\xbb\xa4\x7b\xbc\x01\xc0\xd4\xc0\xd4\xc0\xd4\xc0\xd4\xc0\xd4\x3d\x8d\xa9\xc1\xd1\xc0\xd1\x7a\x94\xa3\x6d\x4a\x71\xfa\x6b\xe8\x8c\x40\x7c\xc7\xe8\x08\x47\x7c\x69\x1a\xa3\x51\x5f\xb9\x28\x67\x4a\xa9\xb5\x74\xca\x51\x34\xbd\xb3\xd2\xf4\x80\xe2\xe1\x14\xff\xe2\x36\x07\xfa\xba\xc3\xd2\xa6\x9b\x94\xeb\x3e\xf1\x97\xb6\x73\x2e\x81\xa5\x4e\xd3\x49\x3a\x5e\x23\x4b\xdf\x4f\xc3\x0d\xf7\x2f\xf4\x50\x10\xa5\xb7\x28\x4a\xff\x72\x84\xa6\x84\xa8\x7c\x92\x8e\xda\xa2\xf2\x51\x6a\xe6\xfd\x13\xa1\x2b\x13\x3c\x74\xc5\x96\x94\x37\xd9\x86\xaf\x77\xe1\x84\x30\x3d\x87\xe8\x00\x37\x3d\xcd\x35\xdb\x16\x39\x7a\x90\x75\x49\x7e\x72\xc4\x61\x5d\xf6\x78\xea\xd1\x4d\x4b\x93\x10\x47\x0d\x4b\xe3\xa5\x46\x6f\x8f\xcd\x81\x14\x1d\x6c\x15\x6c\x15\x6c\x15\x6c\x15\x52\x74\x48\xd1\x21\x45\x87\x14\x1d\x8c\x1f\x8c\x1f\x8c\x1f\x8c\x1f\x8c\x1f\x52\x74\x48\xd1\x21\x45\x87\x14\x1d\x2e\x34\xb8\xd0\xba\xd0\x85\x96\x2d\x84\xab\x38\x0f\x74\x4d\x35\x21\x1e\x6f\x10\x24\x3b\x69\xf1\x3a\x50\x79\x33\x4a\xd1\x3f\xbb\x9b\xce\x0a\x29\x7a\x4e\x56\x0d\x8f\xa3\xac\xd9\x55\x12\x5d\x7f\x2e\x16\xca\xc5\x72\xc1\x5c\x9e\x09\xa1\xfa\x1b\xc7\x34\x3e\x2c\xec\x6d\xbb\xd9\xa7\xfb\xe9\x76\xe7\xf9\x97\xd6\xd2\xd1\xc3\xaa\x2c\xe5\x63\xe2\x1c\xf3\xed\xb2\x17\xde\xd3\xf6\xd9\x4b\xa2\xf5\x45\xd1\x7a\x32\xad\x5f\xe7\x38\xac\x2d\xa7\x7d\x4f\x16\x2f\x46\xb8\xc8\x3d\x5b\xa1\xc7\xc4\x6b\x7b\x91\xe6\xf9\x6b\x3b\x4b\x33\x94\xf1\x4f\xba\xe3\xec\xbe\xb5\x74\xca\xf7\x66\x03\xdf\xdf\xbd\xde\xef\xef\xcb\xd8\x40\x41\xae\xd2\xd5\x52\xf0\x2b\x3b\xc7\xce\x19\xaf\xa9\xc7\xa0\x9a\x2f\xad\xef\xfd\x39\xdf\xf6\xe8\xa7\xb6\xd7\x0f\xe9\x31\x55\xae\x94\xa4\x9c\xdc\xc2\xa8\x1e\x34\x2e\xdd\xc0\x81\xcd\xbc\x8a\x96\xe9\xd1\x1a\xff\x6d\x28\x23\x0b\xba\x08\xc7\x6e\x8b\x8e\xdd\xdf\x8a\xd0\xab\x85\x63\x77\x89\x5e\x69\x3b\x76\xdb\x6d\x72\xda\x64\xe2\x82\x2d\x59\x65\xb5\xd3\x96\x2c\xf3\xff\xdb\x51\x6f\xc9\x32\x15\x49\xad\x16\xb9\x83\x4d\x6c\xcd\x5b\x30\x69\x13\x15\x7d\x29\xb0\x41\x06\x6d\x77\x6d\x43\xa3\xfc\x6e\xf6\xeb\xff\x9c\xdc\xe3\x3c\x78\x4d\x56\x0b\xb2\xf3\xe8\xa0\xf3\xa8\xbe\xe1\xa8\xca\x85\x62\x6e\xb4\xee\x3c\x57\x2b\xfa\xbf\x6f\x18\x47\xf5\xbb\xcc\xe8\x6f\x4e\xb6\xc6\x98\x4e\xd2\xd1\x16\x56\x77\x0b\x3c\x06\x08\x26\x34\xc0\x84\x3e\xd7\x4f\xcf\xf6\xb3\x67\xfa\xa3\x4f\x5b\x50\xe1\xcd\xfd\xbd\x63\x42\x6b\x90\xaa\xde\xcf\xdc\x55\xcd\xb1\xbf\xfe\x72\xda\xc1\x80\x09\x9f\x17\x77\x98\xb3\x11\xa1\x6c\x90\x4a\xfc\xca\xb2\x52\x1e\x15\x57\xf3\x33\xb8\x5f\x46\x8b\x25\xb2\x9a\x52\x5e\x10\x51\x71\x0f\xeb\x9f\x85\xf1\xef\x25\xf3\x63\xb1\xff\x38\xec\x6f\xdb\x33\x2f\x45\xe8\xc5\x08\x7b\x21\x12\xfd\x84\xb5\x41\x7b\x7f\x64\x56\xd1\xb7\xf3\x45\x2d\x56\x50\x78\xb7\x2b\xb1\xf8\x65\xfd\x4f\xf1\xd8\x94\xeb\x29\xf8\xce\x56\x78\x77\x56\x35\xdb\x47\x3d\x2a\xe5\xf8\x83\x73\xcf\x7f\xa9\x98\x33\xb0\x8d\x5c\xca\x6b\x31\xe5\xba\xd1\xa7\xc2\x33\x5e\x91\x95\x4a\x49\x4e\xc5\xc4\x2f\xf2\x30\x46\x73\x2c\xf9\x0e\xd3\xb3\x03\xac\x9f\x8f\x6f\xe1\xb7\xe5\xd2\x17\x56\x36\x6a\x3e\xb9\xdf\x7b\x3e\xd9\xc6\x5e\xc6\xef\xba\xc3\x33\x4a\x76\x96\x66\x58\x26\x7e\xc6\xda\xee\x3d\xc4\x3f\x3a\xc3\x02\xf8\xb6\x11\x1f\xd0\x4f\x6b\xeb\xa6\xee\xdd\x7b\x28\xbb\xde\xa6\x4e\x94\xbe\x6f\x78\x67\xf7\xd2\x6e\xf6\xb5\x7e\xba\xb3\x66\xf2\x14\x95\xf1\x5b\xdd\xde\x1d\xae\xdf\xde\x89\x02\xf7\x1d\xdd\xe3\xad\x8a\x55\xd7\x38\x5f\x75\xe9\x2f\xec\x05\x9a\xa3\x73\x8d\xbe\xb0\xfc\x86\xdb\xb7\xd1\x7b\x7d\xf0\xcb\x7c\x91\xcd\x87\xf3\x32\x8b\x12\xf7\xd1\xaf\x6f\xf7\x19\xe6\x9b\xd8\xf2\x1d\xf3\xdc\xf2\x75\x7e\xb0\x33\x4f\xd2\x6b\xe8\x7b\x6a\x96\x2a\xe1\x8d\x36\x56\x2e\xd8\xfc\xb5\xb8\xf9\xfb\xdd\x48\x5b\xcd\xd0\x25\xb1\xb1\x7c\x15\x2d\xdb\x1b\xcb\x2e\xb1\x73\x7c\x1b\xd8\x98\x9d\x6b\xda\x98\xad\x63\x18\x33\x7f\xbc\xc3\xc7\xce\x85\xb1\x21\x3c\xe2\xb1\x21\xec\xac\xb9\xc3\xae\xb0\xd7\x6c\x2b\x76\x85\xd8\x15\x6e\xf0\xae\x70\x63\xd7\xd2\x81\x5b\xc3\xc6\x66\x99\x66\x66\x91\xa0\x19\xa9\x7b\xf7\x87\x5f\x4c\xd0\x11\xb1\x3f\x94\x2a\x15\x6d\x6c\x2d\x2d\x7c\xc3\x7e\x49\xa8\xf4\x29\x50\xbe\xbc\x5a\xd2\xe4\xaa\xc6\x7e\x3c\xc1\x3e\x3c\x40\x5b\xf5\x0b\x2f\xad\xa5\xa3\xd7\x0d\x0d\x5b\x39\x5f\x5c\x2b\xe6\x57\xa5\x92\x33\x24\x52\xb2\xf4\xa2\x4b\x46\x13\x4b\x72\x35\xe5\x50\x05\x4d\x5a\x7a\xa2\x21\xde\xce\x90\x1d\xaf\xe1\x12\xe0\x2b\x15\xd9\xd2\xfc\x6a\x55\x59\xca\xa7\x92\x0f\xf2\x0b\xa6\x2a\x15\xcd\x19\xf1\xe7\xf8\x9d\xf9\xa2\x56\xed\xf2\x0c\x57\xd9\xa7\x68\x41\x7c\x33\x73\x74\x8e\x7f\x33\xbc\xe4\x4d\x0b\xd3\x24\x8f\x48\x3d\xbb\x26\x97\x83\xbf\x94\x7d\xde\x5f\xca\x0e\x46\xfc\xc6\x44\xf8\xe6\x23\xc1\x5f\xcb\x08\x4b\x1a\x1f\x87\xfe\x2e\x18\x5f\x83\xa3\xff\xdd\xac\x04\xb9\xbc\x90\xcb\x2b\x8b\x78\x33\xc4\x9b\x21\xde\x0c\xf1\x66\x3d\x13\x6f\x96\xed\x9a\x70\xaa\xd0\xef\xa4\xe5\x38\x9f\x2c\xe2\x7c\x10\xe7\x83\x38\x1f\xc4\xf9\x20\xce\xa7\xf3\x71\x3e\x9b\x50\xa2\x9c\xed\xe9\xd8\x89\x2c\x62\x27\xda\x17\x3b\x91\xed\xfa\xd8\x89\x4d\x98\x7e\x8c\x7d\x64\x8c\x98\x3e\x74\xee\xb4\xf6\xec\xdd\x63\xec\xaf\x1f\xb2\xeb\xbe\x0e\xad\x9f\xc0\xde\x42\x7a\xc9\x5d\xfa\x89\x35\x35\xa7\xbb\x9c\xeb\x21\x73\x3d\x68\x17\x32\xd7\x83\x76\x81\x76\x81\x76\xf5\x10\xed\xea\xa2\xe4\x41\x5d\x43\xbb\x90\xd5\x06\xb4\x0b\xb4\x0b\xb4\x0b\xb4\x0b\x99\xeb\x91\x76\xe3\xd6\x41\x47\x5d\x9f\x76\x63\x53\x66\xae\x7f\x42\xa4\xb7\x1e\xe7\xe9\xad\xfb\x1e\xb9\xc0\x26\x68\x9c\x52\xfe\x1a\x42\x45\x95\x53\x6b\xe9\x94\xc5\x85\x1a\x4a\x5d\x7f\x21\x58\xdb\x94\x60\x83\xb5\xa5\x2a\xad\xdf\x70\x57\xaa\x0c\xc8\x83\x1f\xff\xdd\x6d\x36\xf2\x62\x56\xe2\x7a\x9b\x6e\xdd\x25\xfe\xd6\x2e\xbe\x25\x70\xd4\x19\x3a\x45\x27\x6a\xe4\xd8\x23\x94\x6c\xbc\x5f\x21\xc0\x46\x70\x4b\x8b\xc1\x2d\x5f\x8d\xd0\x49\xf1\x4d\x1f\xa6\x83\xfc\x9b\x4e\x51\x53\xef\x9e\x48\x57\x9f\xe6\xe9\xea\xad\xf8\x95\x66\xdb\x98\x16\x29\xef\x4f\xd0\xa4\x23\xe5\x7d\xb3\x8d\x74\x89\x61\xe1\x29\xf0\xc3\x17\x05\x7f\x7a\x88\x5e\x61\x62\x7b\x21\x07\xd6\xd7\x36\xc5\x9c\xac\xb1\x9f\x1f\x62\xcf\x0c\xd8\x76\x4c\x6b\x50\xf3\x2b\x2e\x0f\x49\xef\x3b\xc8\x2f\x10\x76\xd2\x68\x59\xb7\xf6\xb3\x8a\x3a\x55\x2a\x59\x7d\x18\x5e\x10\xcd\x2d\xa4\xf8\x9d\x0b\x7e\x2f\x07\xd9\x83\xb5\xef\xa5\xd1\xc9\xee\xb7\xb2\x11\xf1\x30\xb4\xbe\xf0\x7e\x40\xeb\x0b\xef\x07\xbc\x1f\xf0\x7e\xf4\x90\xf7\x03\x5a\x5f\x68\x7d\xe1\xfd\x80\xf7\x03\xde\x0f\x78\x3f\xba\xc2\xfb\x01\x25\x2e\x94\xb8\x9b\xc5\x9d\x02\x25\x6e\x3b\x94\xb8\xbf\xbe\x83\x96\x8c\x38\x7f\x03\x0a\xf1\x56\x6a\x13\xc1\xf9\x84\xfd\x97\x94\x9c\x54\xd2\x56\xb9\xb5\x92\x72\x39\x59\xd3\xf4\x1d\x85\x7c\x5d\x63\x7f\x76\x5b\xfc\x3b\x5b\xe8\x2e\x57\xa3\x56\x0a\x9d\x07\x2c\x2f\xc7\xbc\xde\xc0\x92\x68\x60\x8a\x37\xb0\xc8\x1b\x48\x9e\x10\xa7\x4c\x39\xaf\x37\x72\xe4\xd8\xa1\xfc\x7e\x57\x6f\x70\x56\x30\x77\x4f\x9a\x89\x2b\xfc\x6e\x36\xfb\x8b\x7d\xf4\x3a\xc1\x9e\xbf\x87\x1e\x77\xb0\xe7\xf5\x93\x63\x34\xf7\x23\xfe\xe9\x18\x9b\xca\xc8\xd1\xe4\x8f\x36\x9f\x56\xaa\xb9\x1f\x30\xe9\x65\x53\x69\xf0\xbc\xde\x73\x83\x67\xfa\x3e\x48\x5d\xce\x8f\x40\xf6\x0e\x6f\xd8\xfa\xde\xb0\x2c\xbc\x61\x3e\xde\xb0\xcd\x17\x7e\xc5\x7e\x61\x94\x1e\x16\x93\xc8\xe5\x92\x72\x5d\xef\x2e\x55\x29\xa5\x2c\x42\x5c\x3b\x99\x54\xd4\xa2\xa2\x16\xab\x37\x4a\xf2\x9a\x5c\x72\xb1\x43\x33\xad\x28\xfb\xfa\x08\xfb\xeb\x7e\xda\xe3\x68\x6e\xca\x6c\xcd\x9a\x45\x46\x79\x5e\x51\x37\xee\x5c\x30\x9a\x9e\xd7\x9b\x9e\x76\x36\x9d\x3c\xa6\x9f\x3e\xeb\xd1\xa0\x31\xad\xf8\x5f\xba\xb1\x19\x45\x9d\x5d\x6a\x1a\x44\xff\x7b\x0d\xf4\xf4\x7c\x5f\xb0\xad\x7c\x15\x5b\x36\x6c\xe5\x7a\xc3\x69\xd8\xcc\x75\x6e\xa5\xde\x6a\xae\x9f\xce\x34\xfa\x37\xdb\x03\x86\x7c\xdc\xcc\x31\xda\xf0\xa8\x9f\x30\xae\xe8\x82\x81\x6f\x7a\x1d\xd1\xdc\xc8\x43\x80\x01\x01\x46\xeb\xd9\x45\x9b\x5f\xaa\x85\x64\x97\xda\x69\x0c\x1b\xcc\x2e\xba\x91\x26\x31\xf9\x57\x77\x04\xd8\xbc\x7d\x46\xc1\x3a\x69\x3d\x33\x77\x5c\x9c\xd4\x0d\x56\xee\x51\x5a\xa4\x05\xa7\x95\x4b\x66\xe8\x4c\x0b\xea\x85\x19\xfe\x44\x8f\x70\x0f\xb0\x06\xe3\x16\x64\xdc\x50\x0b\xbb\x23\xb5\xb0\x51\x04\x15\x45\x50\x51\x04\xb5\x5d\x45\x50\xb3\xcf\x47\x42\xae\x04\xb9\x28\xc8\x9a\xbe\xaa\xb0\xc9\x5a\x9b\xab\x4b\xc6\xbc\x97\x1b\xdb\xd9\x56\xd1\x4d\x1b\xbb\xe2\xc8\xfc\xd5\x8e\x80\x15\xc7\xb1\xba\x0c\xe7\x0d\x6f\xb7\x26\x79\x2a\xdd\x0d\x5e\x86\x20\xb7\x79\xaf\x2d\x7e\x90\xdb\x1c\xb9\xcd\x37\x57\x6e\xf3\x90\xa9\x5e\x60\x6e\xf3\x8d\x9c\x71\xb2\xe7\xe8\x2c\x9b\x8e\x4f\x59\x48\x7b\xd0\x99\xe5\xdc\xbf\xa5\x0e\xa4\x39\xff\xc1\x27\x69\xb8\x3e\x11\x91\xcb\xc7\x29\x00\xf5\x35\xa9\xa2\xb1\x2f\x3d\xc1\xbe\xd3\x78\x7e\x22\xf1\x2c\x0f\x4b\x95\xe4\x5e\x8f\xfc\x44\x79\xeb\x70\x97\xc7\x23\x20\x53\x11\xb4\xfa\xc8\x54\x04\xad\x3e\xb4\xfa\xd0\xea\xf7\x90\x56\x1f\x99\x8a\x90\xa9\x08\x5a\x7d\x68\xf5\xa1\xd5\x87\x56\xbf\x2b\xb4\xfa\xc8\x54\x04\x69\x3d\x32\x15\x6d\x1e\x69\x7d\xab\x99\x8a\x2c\x2e\xd4\x50\xa6\xa2\x80\xe4\x42\x2d\x26\x1c\xb1\xee\xc1\x95\xda\x21\xfe\x15\xcf\x4c\x45\x36\xe7\xba\xdf\x33\x53\x51\x1b\x48\xd7\xcd\xe5\x2c\xb2\xee\x07\x8e\x15\x48\xe6\x3a\x9c\xb3\xc8\xfe\xb2\x5a\xcf\x59\x64\xb7\x71\x13\x39\x8b\xec\x46\xda\x93\xb3\xc8\xdb\x84\x04\xc5\x4d\x24\x3f\x35\x62\x9b\x98\xfb\x0c\x95\x82\x43\xf2\xa1\x5c\x76\x98\x9b\x61\x71\x5c\x98\x9b\x69\xeb\xa4\xf6\x1b\x9e\xf6\x48\xdc\x80\x58\x81\x58\x81\x58\x81\x58\x7b\x07\xb1\x62\xf9\x15\xb0\xfc\xea\x1e\x06\x0d\x79\x71\x47\xe4\xc5\x40\xfd\x40\xfd\x40\xfd\x40\xfd\x40\xfd\x3d\x8d\xfa\x11\x65\x82\x28\x13\x44\x99\xb4\x2b\xca\x04\x9e\x34\x78\xd2\x7a\xd5\x93\x96\x2d\x84\x1c\x60\x15\x44\x8f\x93\xde\xc0\x77\x17\xdb\x29\xbe\x66\xdb\xd2\x86\xeb\xac\xda\x8c\x79\x54\x7e\x69\x98\x1e\xb1\x92\x71\x29\x5a\x4e\x2a\x15\xcb\x85\xb1\xb5\x89\x15\xb9\x2a\x4d\x18\x19\xf7\x7d\x54\xea\xbc\xd7\x95\x72\x55\x2a\x55\x94\xbc\x79\xb5\xac\x6a\xec\x4f\x12\xec\x3b\x03\xb4\xcb\xd1\xe0\x25\xa3\xc1\xe8\x9b\x23\x8d\x65\xe9\x3f\x6f\xb5\xbd\xa0\xe4\xa7\xac\xb6\x43\xca\xda\x7f\x82\x5f\x30\x65\xdf\xdf\xb2\xb8\x3d\x1b\xe3\xfb\xfc\xfe\x7c\x51\xab\x76\xb9\x76\x7e\x43\x72\xf9\x37\x92\x80\xff\x6a\x21\xf8\x53\x9b\x61\x19\x3b\x65\x96\x39\x38\xc6\x37\xe7\x33\x24\x8e\x2f\x50\x0c\x22\x32\xfd\x23\x7a\x00\x99\xfe\xe1\xda\x82\x6b\x0b\xae\xad\x5e\x72\x6d\x21\xd3\x3f\x32\xfd\xc3\xa5\x00\x97\x02\x5c\x0a\x70\x29\x74\x85\x4b\x61\x13\xe2\x10\xd4\x12\x00\xa6\x45\x2d\x81\xcd\x13\xf0\xc0\x9e\x1e\xa6\x8b\x02\x5f\x6a\x55\x45\x95\x0a\x72\x6d\xe2\xe7\x75\x09\x66\x4e\xb7\xf2\xfc\xb2\x9c\x54\x91\x72\xc5\x6a\x51\xd6\xd8\xe7\x12\xec\xeb\x03\x74\xbb\x71\xc0\xca\x50\xf5\x2f\x1a\x03\x97\xd3\x4b\x73\x4b\xe2\xca\x69\xd1\xe4\x8d\x90\x98\xe5\x01\x7e\x81\xd1\x76\x5d\x59\x82\xfa\x9f\xdd\x1c\xa8\xd2\x37\x45\x6b\xe8\x0c\xd3\x44\x95\x72\x30\x85\xcc\xb0\x33\x06\x85\x74\xbf\x54\x26\xfc\xaf\xeb\x6b\x8f\xb4\xd3\x28\x49\x0a\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\x09\x50\xd9\x5b\xa0\xf2\xed\x49\x7a\xa5\x00\x95\xf9\xa2\x96\x53\x74\xb3\xda\x14\xaa\x94\xcb\xf9\x8a\x52\x2c\x57\xb5\x52\xd1\x3a\xf4\x46\xf6\xb1\x61\xf6\xf6\x2d\xb4\xd3\x6a\xd2\xa2\x95\x1f\x31\x74\x96\x4e\x46\x59\x36\x0d\xaa\x99\x2d\xf8\xac\xd1\xe6\x92\xde\x66\x28\x98\x72\xc4\x5e\x42\xf1\x65\xa2\x31\xe1\xea\xab\x30\x7b\x6d\x38\xe4\x5a\x8e\x3b\xda\x4e\x25\x47\xf8\xcf\xcd\x98\x8f\x53\x87\x39\x5d\x77\xdc\xfd\x74\xb3\xf3\x42\x4c\xff\xa4\xdc\xd7\x45\x52\xee\x95\x60\xfc\x79\x9a\x9d\x34\xf0\x67\xed\xab\x6a\x00\x50\xd7\x28\x78\xe4\xde\x06\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\x04\xd6\xec\x2c\xd6\x9c\xa4\xa3\xec\x70\xfc\xa0\x85\x35\xef\x75\xd6\x40\x72\x6d\xe2\xea\xcb\x1e\x01\x89\x02\x89\x02\x89\x02\x89\xb6\x11\x89\xfe\xe9\x30\xcd\x0a\x24\x2a\xbf\xa1\x2a\x97\xf9\x50\x35\x06\x43\x8b\xe5\x82\x2a\x6b\x9a\xcd\x41\xdf\x33\xcc\xbe\x33\x40\xcc\x6e\xc7\x02\xa1\x1f\x6c\x04\x84\xce\x89\xf6\xba\x02\x81\x8a\x9f\x3b\x6b\x3d\x49\x1d\x03\x35\x6e\x16\xf4\xb3\x05\xfa\xb9\x1c\x4c\x3f\x0f\xb0\xb4\x41\x3f\xed\xb7\xc9\xe0\x9e\x46\xcf\x83\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x82\x78\x6e\x38\xf1\x3c\x48\x13\x6c\x3c\x9e\xb2\xa8\xe5\x2e\x27\xf1\x34\xb6\x6f\x60\x9d\x60\x9d\x60\x9d\x60\x9d\x1d\x65\x9d\x6f\xdd\x4f\x27\x05\xeb\xbc\x5c\x52\xae\xeb\x93\x84\xaa\x94\x52\x16\x74\xa8\x95\x82\xea\x27\x69\xb9\x2b\xf2\x35\xc9\x42\x9c\x9f\x48\xb2\x0f\xf5\xd3\x1e\xc7\xe5\x53\xe6\xd5\x16\xec\xdc\xab\xca\x52\xbe\x66\xc7\x3c\x5b\x52\xae\x2f\xf1\xa6\x92\xc3\xfa\xe1\x59\x8f\x06\x0c\xc6\x68\x9f\x1a\x6e\xf1\xaa\xac\x4c\x59\xc1\x02\xa7\x69\x8a\xb3\xc0\xe3\x74\x8c\x8e\xf8\xd6\x0b\x73\x76\x91\xf1\x68\x29\xfb\xde\x02\x29\xe0\x5e\x6f\x0a\xf8\x32\x36\x50\x90\xab\x74\xf5\xa9\x60\x06\x78\x9e\xcd\xd6\x31\x3e\x03\x0a\xae\x37\x7c\x06\x26\x74\xdc\x6a\xf4\x87\xb6\x07\x0c\x59\x4c\x95\x2b\x25\x29\x27\xfb\x8f\xda\x88\x71\xc6\x06\x0c\x5c\xe6\x61\xba\x40\x73\x35\xe5\x0e\x5b\x1f\x39\x14\xdf\x41\xed\xc3\x16\x6b\x1f\xfe\xf7\x48\xa8\x26\xe4\x11\x51\x08\xf1\x3c\xcd\xda\x85\x10\x37\xc8\x26\x55\x56\x1b\xb6\x49\x2d\x99\xa0\x3a\x43\x96\xfc\xf8\x1d\x01\x36\x69\x97\x91\x44\x5f\x72\x9a\xa1\xfd\xe2\x8f\x1b\x61\x85\xda\x53\xfb\x10\xc6\x28\xc0\x18\xa1\xfe\x56\x47\xea\x6f\xa1\xf0\x0a\x0a\xaf\xa0\xf0\x4a\xbb\x0a\xaf\x64\x9f\x8f\x84\x5c\x7d\x62\x51\x14\x40\xbe\x40\x73\x8e\x02\xc8\x6d\xae\x68\x11\xf3\x5e\x3e\x6c\x67\x5b\x45\x37\x75\x76\x05\x91\x79\x6e\x47\xc0\x0a\x62\xb8\x22\xa9\xd5\x22\x77\xb5\x8a\x7d\xb4\xff\xf6\x26\x59\xd1\x37\xcb\x1d\x5e\x56\xec\xae\x6d\x68\x94\xdf\xc5\x7e\xfd\x9f\x93\x7b\x9c\x07\xaf\xc9\x6a\x41\x76\x1e\x1d\x74\x1e\xd5\xaa\xaa\x54\x95\x0b\xc5\xdc\x68\xdd\x79\xae\x56\xf4\x7f\xdf\x30\x8e\xea\x77\x99\xb9\x48\xf3\x94\xad\xd9\x58\x4d\xd2\xd1\x16\xde\xa0\x05\x2e\x48\xc0\x62\x26\x60\x31\xf3\x5c\x3f\x3d\xdb\xcf\x9e\xe9\x8f\x3e\x6d\xcd\x08\x6f\xee\xef\x9d\x9d\x55\x8d\x0f\x47\xef\x67\xae\x49\xe0\x7e\x46\xfd\xe5\xb4\x95\x49\x09\x9f\x17\x77\x98\x4f\x6c\x42\xc2\x22\x95\xf8\x95\xfa\x0a\x4e\x5c\xcd\xcf\xe0\xab\x29\x2d\x96\xc8\x6a\x4a\x79\x41\x48\x74\x1e\xd6\x3f\x0b\xe3\xdf\x4b\xe6\xc7\x62\xff\x71\xd8\x7f\xcb\x97\x79\x29\x42\x2f\x46\xd8\x0b\x91\xe8\x27\x2c\xcc\xf7\xfe\xc8\xac\xa2\xe6\xf8\x42\xaf\xa0\xf0\x6e\x57\x62\xf1\xcb\xfa\x9f\xe2\xb1\x29\xd7\x53\x70\x80\x2b\xd6\x64\xab\x9a\x2d\x46\x18\x95\x72\xfc\xc1\xb9\xc4\xa3\x54\xcc\x19\x73\xae\x5c\xca\x6b\x31\xe5\xba\xd1\xa7\x42\x02\x51\x91\x95\x4a\x49\x4e\xc5\xc4\x2f\x72\x4d\x95\x39\x96\x1c\xa4\x7a\x76\x80\xf5\xf3\xf1\x2d\xfc\xb6\x5c\xfa\xa0\xce\x52\x30\x7f\x2d\x5c\x45\x68\xe1\x1a\x9b\x31\x82\x67\x83\x46\xe6\x94\xec\x11\x3a\xc4\x0e\xc4\xd3\x96\x8b\xe5\x15\x4e\xc7\x8c\xdd\x7a\xbd\x6f\x26\xf4\x82\x47\xff\x7d\x98\xc6\x04\x89\x2d\x2b\xf9\xba\x74\xa1\xea\x6a\xb9\x5a\xbc\x26\xe7\x4a\x92\x53\x5e\xfa\x03\xc3\xec\x4d\xfd\xb4\x43\xbf\xc0\x9a\xe2\xee\xf7\x60\xad\x8b\xe2\xea\x69\xfd\xea\xe4\x6e\xfd\x84\x8b\x4a\xde\x4c\xd6\xe9\x3c\x18\x32\x5f\x7d\x1d\x9d\x15\x6f\xd6\x29\x3a\xc1\xdf\xac\xc3\x74\x90\x26\x7c\xdf\x2c\xfe\xe0\xe6\x2b\xe5\xbc\xad\x9b\x45\xab\x4f\x04\xbf\x52\xc7\xd8\x11\xe3\x85\x71\x74\xbf\xb1\xe6\x70\xdd\x4a\xdd\x7b\x16\xfd\xbd\x6d\x35\x43\x10\xf7\x66\xa7\xae\x51\xb8\xcf\x38\xa7\x23\x03\x91\x39\x4f\xb3\x34\x53\x33\xad\xb7\x34\x12\x98\xd0\x81\x4a\x5b\x44\xa5\xcf\x46\xc2\xb2\x06\x59\x41\x49\xf5\xe9\xca\xa2\xa4\x9d\xb7\x2c\x1c\x90\xb6\xd5\xb2\x24\xdf\x79\x47\x8d\x65\xb9\xcb\x22\xa0\x2e\x63\xb2\x57\xfc\xb9\x33\xb6\x04\xd4\x13\xd4\x13\xd4\x13\xd4\x13\xd4\x13\xd4\x13\xd4\xd3\x9b\x7a\xb6\x75\x59\x90\xf9\xee\x6d\x35\xcb\x82\xfd\x01\x58\xd3\xb5\x58\xd8\xc3\xf7\xd9\x6d\x5f\x2b\x00\x65\xf6\xda\x0a\x05\x28\x13\x28\x73\x83\x51\x66\xc7\x80\x53\x20\xc5\x6c\xeb\x0c\x90\x3d\x46\x47\xd8\xa1\xf8\x01\x0b\x5b\xde\xe3\xc4\x96\xce\x6b\x3b\x00\x2e\xbf\x9e\xa4\x73\x06\xb8\x94\xab\xd7\x15\x55\xff\x58\x6b\xf1\x65\xa3\xf1\xf2\x3f\x92\x64\xff\xbe\x9f\x98\xdd\x90\x35\xc5\x45\x3d\xb0\xa6\x21\x9c\x4f\x0e\x72\xa2\x69\x5d\xd3\xf6\xc8\x74\x01\x37\x25\x9a\x15\xef\xda\x69\x3a\xc9\xdf\xb5\x23\x74\x88\x0e\xf8\xbf\x6b\x76\xe7\x98\x6f\x9c\x19\xb7\x1d\xf4\xb2\x3d\x19\xfc\x2e\x4d\xb2\xa3\xe6\xbb\x54\x3b\x08\x41\x41\xe2\x01\xf0\x34\xfa\xbf\xb7\x79\x0e\xc8\x5e\x6f\xc8\x69\x8e\xc9\xb0\xc9\x37\x3b\x3c\x2c\x99\x39\x3a\x47\x67\x6b\xa6\xfd\xd6\xc6\x05\x33\x3e\x58\x67\x8b\xac\xf3\x83\x91\xd0\x8c\xc3\x05\x01\x3b\x67\x28\x63\xc3\xce\x5b\xcf\xd2\x54\x56\xab\x94\x7c\xdf\x1d\x9e\x96\x66\xa7\x09\x3d\xcb\x96\x75\x49\x18\xc0\xb3\xd3\xc6\x05\xec\x13\xec\x13\xec\x13\xec\x13\xec\x13\xec\xb3\x37\xd9\x67\x9b\x57\x08\x81\x68\x35\xf3\xef\x76\x78\x2e\x12\x06\x03\x10\xa8\xb9\x72\x18\x12\xf4\xb3\x83\x0b\x07\x80\xd0\x5e\x5b\xae\x00\x84\x02\x84\x6e\x30\x08\xed\x1c\x9c\x0a\x24\xa1\xed\x9d\x31\x7a\x26\xb5\x06\xfb\xc8\x30\x4d\x0b\xce\xaa\xae\x48\xb9\x94\x39\x12\xfc\xdb\xb1\x79\xab\x91\xa0\x34\x57\x5a\xd5\xaa\xba\x45\x2c\xc9\x2b\xba\x31\x2e\x17\x2c\xc6\xfa\xe7\x09\xf6\xe3\x5b\xe8\x4e\xbd\x91\x29\x67\x1b\x97\xd6\xd2\xd1\x8f\x36\x92\x95\x74\x5a\xb4\xbd\xa8\x94\xe4\x8c\x68\xbb\x2b\x12\x94\x26\xf9\xcf\x2d\xd6\x3e\xd6\x72\xba\xfe\x7e\x91\xa3\xb4\x85\x1c\xa5\x4d\x45\xf2\xf8\xbe\xa2\x66\xad\xfa\xba\x31\x71\x7e\xda\x48\x5c\x8a\xc4\xa5\x48\x5c\x8a\xc4\xa5\x48\x5c\x1a\xd4\x2d\x48\x5c\x8a\xc4\xa5\x48\x5c\x8a\xc4\xa5\x48\x5c\x8a\xc4\xa5\x48\x5c\x8a\xc4\xa5\x61\x27\x2e\x3d\x4d\x27\xd9\xf1\xf8\x31\x8b\x93\xdc\xe7\xa4\x2b\xf5\x9b\xb8\xf6\xcb\xcd\x90\x61\x14\x19\x46\x91\x61\x74\x13\x65\x18\xfd\xa1\x61\x3a\xd1\x0a\xb6\xb4\x78\xe5\xa7\x13\xec\xdf\xf8\xf1\xca\x9f\x6b\x92\x57\x76\x05\xa8\xdc\xd7\x00\xa8\xec\x7e\x42\xe9\xc7\x13\xc3\x47\x97\x26\xa1\xcc\x07\x03\xc8\x29\x76\xda\x89\x11\x9b\x87\x91\x14\xc8\x41\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x81\x26\x3b\x8c\x26\x8f\xd2\x61\x76\x30\x3e\x61\xa1\xc9\xbb\x7d\xd0\x24\x98\x24\x98\x24\x98\x24\x98\xa4\x83\x49\xfe\xd4\x30\x4d\x05\x33\x49\x67\xc1\x77\x2f\x30\xf9\x87\x09\xf6\x23\x5b\xe8\x5e\x2f\x30\x29\x62\x12\x36\x25\x9d\x4c\xf8\xd1\x49\xfe\x4c\x40\x94\xeb\x22\xca\x40\x11\x65\x31\x98\x61\xce\xb2\x99\x16\xb8\x25\x6a\xbf\x83\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x6e\x42\x4e\xf9\xb5\x21\xba\x5f\x1f\x3a\x5b\x20\x69\x66\xcb\x28\x57\xd7\x94\xd2\xea\x35\x59\x63\xbf\x3a\xc4\x3e\x32\x40\x5b\x73\x8a\x2a\x5f\x5a\x4b\x47\xff\xb9\x31\xf3\x95\xf3\xc5\xb5\x62\x7e\x55\x2a\xb9\xe8\xa3\xb5\xca\x5c\xb0\xda\x59\xe6\xed\x84\x82\x1e\x53\xc9\xfb\xf9\x05\xd3\x8a\x2a\x2f\xa7\x6b\x7f\x62\xbe\xa8\x55\xbb\x9f\x19\x76\x3e\xf0\x7a\x9f\x37\x33\xdc\xc1\x88\xdf\x98\xde\xd5\x74\x75\x31\x98\x1b\x8e\xb1\x51\x83\x1b\xc6\xe3\x06\x20\xac\x1d\x02\xc4\x58\x03\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x02\x10\x6e\x24\x20\x04\xe6\x03\xe6\x03\xe6\xeb\x61\xcc\xf7\x27\x43\xb4\xc7\x8d\xf9\xcc\xab\x5e\xbf\xaa\x54\x25\x8d\x7d\x6a\x88\x3d\xef\x60\x7c\x37\x1a\x63\x7c\xe6\x56\xee\x95\x7a\x23\x21\x01\xbe\x11\x07\xe0\x73\xb5\x3f\x5f\xd4\xaa\xb3\x8a\x3a\x55\x2a\x59\xa9\x94\xc3\xcb\xa1\xdc\x6b\xb4\xef\x91\x60\xda\x37\xc2\x92\xb5\xb4\xcf\x35\x1e\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x40\x7d\x1b\x82\xfa\x7e\xa2\x9f\xf6\x8b\xc8\x63\x29\xaf\x2f\x65\x8b\x4a\x59\x95\x0b\x45\x5e\xdb\xcb\x23\xf8\x98\x7d\xb3\x8f\xfd\x75\x1f\xed\xf5\x3c\xd9\x8a\x33\xbe\xbb\x20\x57\xdd\xb3\xb0\x78\xbe\xe4\xfe\x82\x5c\x9d\xf2\xba\xd4\x88\xe6\x9d\x5a\x98\x33\x37\x81\x21\x16\x3c\xab\x6b\x68\xb2\xae\xa1\xc9\x46\x1a\xca\x56\xe8\x31\xc1\xe7\x2e\xd2\x3c\xe7\x73\xb3\x34\x43\x99\x16\xf8\x9c\xe3\x39\xe7\x8b\x5a\x20\xa4\x63\xff\x32\x41\x43\xc6\x28\x55\x2a\x9a\x23\x3d\xa5\x52\xae\xaa\x8a\x3e\x75\xe9\x3b\x39\xfe\x9d\xb1\x2f\x0c\xb1\xdf\x1a\xa0\xad\xfa\x89\x97\xd6\xd2\xd1\x7f\xd1\x18\x9b\x9d\xb6\x5a\x5a\x34\x5a\x0a\x09\xd0\xa6\xf9\x05\x53\x95\x8a\xb6\x9c\xae\xff\x11\x50\xda\x10\x29\xed\x72\x30\xa5\x3d\xc0\xd2\x06\xa5\xd5\xdf\x0f\x33\x6c\xbb\x6e\x58\x00\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x01\x6b\x37\x04\xd6\xfe\xf2\x30\x1d\x72\xeb\x32\xad\x4a\xdf\x46\x12\x48\xfe\xef\x37\x8e\xc9\xe5\x7c\x45\x29\x96\xab\x56\x6a\xc8\x37\x0f\xb3\x2f\x39\x04\x9b\x1f\x6a\x24\x11\xe4\x59\xb3\x91\xae\x48\x03\x79\x9f\x43\xe8\x69\xb1\xc2\xbc\x75\x8f\x80\x86\x2d\x54\xd0\xbe\x10\x0c\x0c\x13\x6c\xb0\x56\xd6\x69\xf5\x39\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\x21\x28\xe1\x46\x52\xc2\xc3\x74\x90\x4d\xc4\xc7\xad\xf4\x8e\x77\x39\xd3\x3b\x5a\x7b\xb7\xfa\xe4\x8e\xaf\xa3\xd7\xb2\x27\xe2\xaf\xb6\xae\x9b\x34\xee\x98\x5f\xae\x0f\x83\xbe\xc1\x8c\x69\x39\xa5\x22\x8f\xc4\xb4\xd5\xdc\x15\x7d\xd4\xf8\xca\x57\x96\xae\x09\x1a\x52\x51\x15\xde\x43\xf1\xed\x16\x8b\x40\xfa\x48\xf0\x4b\xf0\x4b\xf0\x4b\xce\x2f\x7f\x72\x98\x52\x42\xc6\xa8\x55\x15\x55\x2a\xc8\xb5\xf2\xd2\x9c\x56\xcc\xab\x45\x7d\x14\x4d\x70\xf9\x37\x09\xf6\xa6\x7e\xba\xdd\x38\xdf\x52\x98\xee\x51\x65\x29\x5f\xb3\x2f\x9e\x5e\x9a\x9b\xe1\x17\x27\x77\xeb\x47\x97\xc4\x25\x66\x9d\x18\xf3\x60\x78\xb2\x52\xce\xf5\x5e\x47\x67\x05\xd7\x3b\x45\x27\x38\xd7\x3b\x4c\x07\x69\xc2\x8f\xeb\xa5\xcc\xe7\x36\x9e\x23\x65\xdd\x56\x20\xcc\x7b\x22\x98\xd5\x1d\x63\x47\x0c\x56\xe7\xee\x5e\x53\xe6\x67\xfd\x56\x5d\x6d\x96\xab\x7b\xbd\x51\xe1\xcb\xd8\x40\x41\xae\x52\xf4\xf7\xb6\xd5\x0f\xc1\xfd\xaa\x5c\x29\x49\x39\xd9\x77\x14\xee\x33\x4e\xe8\xc8\x40\x64\xce\xd3\x2c\xcd\xb0\x81\x15\x25\x7f\x23\xca\xff\x37\x16\x49\xb6\x34\x12\x99\xf7\xf4\xd1\x7f\xe9\x63\xff\xb9\x2f\xfa\x9f\x2c\xbb\xfa\xed\xc8\xe3\xfa\x04\x65\xcc\xd9\x23\x5c\x4d\x9b\xd3\x77\xe6\xc2\x10\xba\xf6\x89\x4e\x76\xb8\x22\xc7\xcc\x04\xa9\xf9\x54\x6c\xaa\x1c\x2b\x96\x05\xa1\x51\xd4\xd8\x6a\xd9\x82\x3c\xf9\x58\x5e\xbd\xb1\xb8\x5a\x8e\xe5\x8b\xaa\xac\x7f\xfd\xb2\x45\x0e\xf4\x05\x00\x5f\x61\x19\xe8\xc4\xdc\x28\x19\x9b\xd5\xd8\xe5\x55\x95\x2f\xc6\x2b\xaa\x92\x93\x35\xbe\x14\x32\x8c\x8d\x31\x93\xa5\x62\xcb\xfc\x17\xf9\x26\x87\xaf\x5d\x26\x63\xa3\xb1\xa9\x52\x69\x92\x2f\x74\xf2\xea\x8d\x98\xba\x5a\xd6\x37\xd1\xba\xb9\x30\x57\x77\x46\x73\x72\x3e\xfe\x32\x71\x6b\x0e\xdb\x98\x79\x57\x1f\xfd\xc7\x3e\xf6\xf6\xbe\xe8\xbf\xb3\x3a\xe8\xcf\x22\x7c\x6d\xfc\xb0\x54\x96\x0a\xb2\x2a\x76\x79\x62\xe1\xa0\x69\x4a\xae\xc8\x17\x2e\xd6\x7e\x4a\xe2\x1b\x52\x45\x8d\xe9\xeb\xda\xea\x0d\x6b\x25\x77\x4d\x7a\x4a\xbf\xff\xea\x15\x59\x93\x4d\x03\xa6\x1b\x55\x93\x74\x71\xd8\xb3\x22\xc7\xb8\xe9\xe4\x7b\x27\x45\x8d\xa5\x27\x8e\xea\xe7\xaa\x52\x8e\x23\xb9\x92\x52\x2e\x08\x73\xc5\xf7\x37\xfa\x52\x54\x2a\x96\xc5\x2a\x82\xef\x1f\xec\x73\x39\xa6\x30\x80\xa1\xbe\xeb\x35\xa7\xa0\x82\x52\x92\xca\x85\x94\xa2\x16\xc6\x2a\x4f\x15\xc6\x56\xcb\xc5\x9c\x92\x97\xc7\xf6\xcd\x69\x0b\x7a\x2b\xa9\xf8\x0e\xe7\xb3\x3a\x27\x8d\x67\x23\x61\x59\x83\xac\xde\x4c\x9a\x4d\xd3\x14\x6d\x9d\x16\x2b\xf6\x5b\xce\xb2\x54\x56\xab\x94\xfc\x57\x77\xd4\x5b\x16\x26\x76\x23\x31\xc9\x61\x4c\xf6\x8a\xbf\x75\xc6\x96\x3c\x4a\x8b\xb4\xe0\xb4\x25\xc9\x0c\x9d\x69\xc1\x57\x33\xc3\xef\xf9\x11\x4e\xbc\x35\xd8\x95\x20\xbb\xf2\xb5\x3e\xfa\x6a\x1f\xfb\x72\x5f\xf4\x8b\x56\x07\x7d\xb8\xef\x51\xe7\x3a\xaa\xa8\x2f\xe7\xf9\x5a\x28\xb6\x22\x5f\x16\xde\x1e\x6b\x6b\x65\xbb\x14\x8c\xdd\x2c\xbf\x45\x87\xdd\x28\x2b\xe5\xd1\xb2\x5c\x90\x78\x47\x18\x4b\x29\xa7\x7d\x11\x90\xc5\x1a\x02\xe3\x2d\x2c\x5e\xbb\x26\xe7\x75\x0b\x56\xba\x61\xbb\x61\x6c\xf4\x5e\x2c\x8d\x18\x2b\x2c\xbe\xc6\x8c\x15\x54\x7d\x4e\xac\xc8\x6a\x51\xc9\x5b\x2b\x45\x7b\x7a\xe4\x1e\x2e\xb3\x37\x56\x35\xfd\x26\x9d\xab\x53\x49\xbf\xd2\x7c\x20\xe3\x47\x2e\x0b\xdc\x60\x36\x91\x12\xf7\x79\x4d\x96\xca\x9e\xf7\x18\x67\xfc\x16\x16\xf8\x1d\x78\xac\x1c\x33\x9f\xe9\xa3\x97\xfa\xd8\x8b\x7d\xd1\x17\xac\x6e\x7e\x6f\xdf\x8c\xc3\xc3\x5b\x29\xc9\x92\x26\x5b\x6c\x68\x41\x55\x2a\x52\x81\x0f\xc0\x82\x52\x2a\xe6\x6e\xb8\xdc\x43\xe6\xb3\xd8\x2e\x62\x7d\x94\xd2\xa9\x23\xa9\xd8\x92\x18\x10\xd1\x3b\x15\x7d\xe3\xa0\x6f\xbe\x4c\xcc\x28\xc7\x14\xb5\x72\x45\x2a\x9b\xee\x2a\x75\x55\x1e\xbb\x2c\x95\x4c\x2c\x1f\x17\x47\xe3\xb1\xcb\xc5\xb2\x54\x2a\x7e\xaf\xc9\xf7\x56\x64\x7d\x65\xca\xb7\x2a\x63\x62\x45\x9a\xb7\x99\xaf\x68\x7c\x48\xb3\x2f\x12\x20\x3c\x15\x3b\x5b\xe4\xaf\xb3\xe3\xc6\x15\xb5\xfe\xc9\xec\x6d\x5f\x55\x70\x78\xfe\xb1\x29\xd5\x2b\xa9\xf8\x1d\xe2\x7e\x66\xcc\x07\x71\xf9\xbd\x32\x6f\x1b\xa0\xb7\x0c\xb0\x1f\x18\x88\x7e\xd7\x72\x7e\xfe\x5e\xff\xe3\x06\x28\xd3\x3f\x29\x7d\xdf\x55\x90\xd4\x15\xa9\x20\xc7\x72\x4a\xa9\x24\x73\x33\x68\x7f\x17\xb2\x7a\x59\x51\xaf\xe9\x7d\xe1\x79\xa7\x8f\xd4\xfc\xb8\xff\x8d\xf2\xf7\xd9\x7c\x19\x2b\xe2\xa9\x8a\xfa\x8b\x92\x2b\xe6\x6d\xe2\xcd\xe1\x29\xf7\x3f\x58\xbd\xab\xef\xc4\x0c\xb4\x68\xe2\xd1\x94\xa3\x1b\x4d\xb0\x66\xed\xb5\x2c\x97\xa7\xfb\xc7\x52\xb1\xa9\x9c\xbe\x2d\xe3\x93\xad\xd3\x38\x0c\x89\x67\x18\x8a\x8d\x1a\x03\xef\x7e\x31\xb4\xe3\xb1\xa1\x8c\x94\x7b\x4a\x9f\x67\xca\x79\xfd\x2c\xee\x6b\xe4\x27\xd5\x74\x9c\xa0\xd9\xc6\xab\xef\x6e\xc4\x7c\x82\x15\xab\xa5\xe3\xb1\xa1\x59\x45\x95\x1d\xcd\xc6\x72\x92\x96\x93\xf2\xfa\xd3\x1b\xfd\x23\xbc\xcb\xbc\x3d\x4d\x58\xaf\xba\x06\x2f\x5b\x6d\xa4\xe2\x3b\x2b\xb5\xef\x8d\x73\x11\xf0\x81\xd0\x16\x01\x17\xf4\x66\x26\xd8\x0c\x65\x68\x9b\xe8\xd4\x36\xae\x02\x62\xde\xf3\xf4\x76\xb6\x55\x74\x0c\xb5\x77\x9d\x90\xf9\xee\x6d\xf5\x0b\x81\x44\x45\x52\xab\x45\xee\xad\x14\x1b\x51\xdf\xbd\xc6\x9e\x8a\xbe\xd9\x6c\xfb\xea\x60\x77\x6d\x43\xa3\xfc\x77\xf7\xf3\xa0\xc2\x3d\xce\x83\xd7\x64\xb5\x20\x3b\x8f\x0e\x3a\x8f\xf2\xb0\x47\xb9\x50\xcc\x8d\xd6\x9d\xe7\x6a\x45\xff\xf7\x0d\xe3\xa8\x7e\x97\x99\x8b\x34\x4f\xd9\x9a\x5d\xce\x24\x1d\x6d\x61\x6d\xb2\xc0\x9d\xf8\x58\x93\x04\xac\x49\x9e\xeb\xa7\x67\xfb\xd9\x33\xfd\xd1\xa7\x2d\xc3\xfe\xe6\xfe\xde\xd9\xeb\xd4\xf8\x3d\xf4\x7e\xe6\x7e\x7c\xee\x9b\xd3\x5f\x4e\x5b\xcd\x93\xf0\x79\x71\x87\xf9\xfc\x24\x64\x1f\x52\x89\x5f\xa9\x2f\xc4\xc4\xd5\xfc\x0c\xbe\x28\xd2\x62\x89\xac\xa6\x94\x17\x84\xac\xe5\x61\xfd\xb3\x30\xfe\xbd\x64\x7e\x2c\xf6\x1f\x87\xfd\x37\x61\x99\x97\x22\xf4\x62\x84\xbd\x10\x89\x7e\xc2\x02\x63\xef\x8f\xcc\x2a\x6a\x8e\xaf\xd7\x0a\x0a\xef\x76\x25\x16\xbf\xac\xff\x29\x1e\x9b\x72\x3d\x05\x47\x9e\x62\x69\xb5\xaa\xd9\x0e\xfc\x51\x29\xc7\x1f\x9c\xcb\x22\x4a\xc5\x9c\x31\x75\xca\xa5\xbc\x16\x53\xae\x1b\x7d\x2a\x64\x03\x15\x59\xa9\x94\xe4\x54\x4c\xfc\x22\xd7\x21\x99\x63\xc9\xd1\xa3\x67\x07\x58\x3f\x1f\xdf\xc2\x6f\xcb\xa5\xa9\xe9\x18\x62\xf2\xd7\x8b\x55\x84\x5e\xac\xad\x33\xc0\xfa\x8e\x0b\xeb\xc2\xf6\x57\xa5\x62\xef\x1c\xa6\xe3\xeb\x62\x4a\xa1\xbd\x14\x05\x6f\xa4\x6a\x55\xca\x5d\xb9\x26\x3b\xc4\x96\xbf\x93\x60\xff\x7a\x4b\xfd\x6c\xf6\x0b\x8d\x88\x2e\x45\x5d\x94\x29\xab\xd1\xae\xd0\x5e\xee\xbb\x5e\x3f\xbb\xd6\xde\x28\x04\x98\x2d\x08\x30\x73\xc1\x1f\xd4\x19\x76\x4a\x7c\x3a\xb5\x1d\x5e\xff\x05\x79\x7f\x78\x10\x66\x42\x98\x09\x61\x26\x84\x99\x10\x66\x42\x98\x09\x61\x26\x84\x99\x10\x66\x42\x98\x09\x61\x26\x84\x99\x10\x66\x76\x58\x98\x79\x92\x8e\xb3\x63\xf1\x23\x16\xdf\xd8\xe3\xe4\x1b\xb5\xbb\x3b\x14\xdf\x86\x7a\x12\xea\x49\xa8\x27\x1d\xea\xc9\xff\xf4\x24\x25\x04\x96\x2c\x2b\xf9\x3a\x26\xa9\xae\x96\xf5\xe7\xcd\x95\x24\x4d\x93\x35\xf6\x27\x4f\xb0\x1f\x19\xa4\x1d\xfa\x99\x16\x80\x4c\x8a\xa5\xa5\x6a\x4c\x8a\xa6\xd5\x34\xd1\xe3\xa2\x68\x61\x5a\x6f\x21\xb9\x5b\x3f\xf7\xa2\x92\x37\x71\x9f\xf3\x60\x97\xa3\xbe\x0c\x80\x17\x80\x57\x06\xc0\x0b\xc0\x0b\xc0\x0b\xc0\xab\x67\x80\x57\xa6\x6b\x80\x57\xe8\x77\xd2\x32\xf0\xca\x00\x78\x01\x78\x01\x78\x01\x78\x01\x78\x75\x1e\x78\x65\x7a\x1a\x30\x65\x00\x98\xda\x07\x98\x32\xdd\x0e\x98\x32\x9b\x10\x30\x65\xf3\x34\x27\x24\x52\x19\x3a\xc3\x25\x52\x93\x74\x94\x0e\xfb\x0a\x0d\x39\x85\x32\x55\x86\x4e\x3e\xd4\x48\x49\x93\xab\xf7\x79\x6b\xa3\xb6\xb2\x2d\xa2\x98\x45\x53\x5a\x43\x07\x10\x33\x6b\x0f\x3b\xee\xa7\x5e\x29\x15\xff\xe1\xed\x35\x6c\xec\x2e\x31\x1b\xc5\x24\x37\x06\xdb\x2b\xfe\xdc\x6e\x10\xd6\x5a\x08\xab\xef\x00\x40\xd6\x8d\x10\xd6\x16\x43\x58\xff\x21\xd2\x4a\xd8\x89\xef\x9b\xe8\x6b\x06\x9a\xd3\x34\xfb\xb7\xdf\x7c\xa0\xac\x6f\x5b\x2d\xc5\xc3\x36\x6b\x79\xd6\xb1\x7b\x15\x45\xab\x52\xf2\xcb\x23\x35\x96\xe9\x01\x23\xd0\xc9\x11\x35\xa6\x5c\x76\x5b\xa9\x21\x71\x8a\xc3\x4a\x4d\x5b\x27\xb7\xd1\x5e\xb5\x27\x4c\x16\xe0\x16\xe0\x16\xe0\x16\xe0\xb6\x77\xc0\x2d\x56\x6b\x01\xab\xb5\xee\x21\xdb\x48\x51\xd0\x91\x14\x05\x70\x20\xc0\x81\x00\x07\x02\x1c\x08\x70\x20\xf4\xb4\x03\x01\x99\x6a\x90\xa9\x06\x99\x6a\xda\x95\xa9\x06\xfe\x39\xf8\xe7\x7a\xd5\x3f\x97\x2d\xf8\x93\xe9\x79\x41\xa6\xcf\xd2\x34\x27\xd3\x27\xe9\x38\x1d\x6b\x81\x6a\x2e\x55\xa5\xea\xaa\x05\x95\x93\xde\xd8\x77\x17\xdb\x29\xbe\x66\xdb\xd2\xb6\xd9\xf5\xd5\x86\x74\x19\x49\x5a\x12\xba\x74\x75\x45\xca\xa5\xcc\x9e\xe4\x43\x67\xab\xd4\xd7\x2f\x58\xa6\x2a\x25\x79\x45\xdf\xd7\x96\x0b\x56\x1a\x8d\x5f\x1a\x66\xef\xdc\x42\x77\xea\x8d\x4e\x39\xdb\xbc\xb4\x96\x8e\xfe\x5c\x23\xb9\x34\x16\x95\x92\x9c\x11\x8d\x76\x45\x1a\x8d\x51\xfe\x73\x8b\xb5\xcf\xe3\xac\x67\xe6\xb8\xe5\x2e\x57\xd9\x77\x67\x42\x8d\x7c\xf0\xa7\x33\xc5\x4e\x1b\x9f\x8e\xef\xeb\x6a\x7e\x48\xf6\x60\xa0\xd4\x19\x02\x0c\x90\x51\x03\x7e\x2a\xf8\xa9\xe0\xa7\xea\x55\x3f\x15\x32\x6a\x20\xa3\x06\xfc\x03\xf0\x0f\xc0\x3f\x00\xff\x40\x57\xf8\x07\xb2\x47\xe9\x30\x3b\x18\x9f\xb0\x32\x6a\xdc\xed\xcc\xa8\xe1\xd8\xbd\xa1\xd8\xd9\x66\xa7\xb5\x48\xd7\x81\x74\x1d\x9b\x2b\x9a\x82\x7d\x65\x88\xa2\xfa\xd0\xd9\xec\xb3\xa2\xe4\xab\xf2\xb5\x0a\xdf\xe7\xb0\x5f\x1b\x62\x3f\x3f\x40\x5b\x73\x8a\x2a\x5f\x5a\x4b\x47\xaf\x1b\xd3\x6a\x39\x5f\x5c\x2b\xe6\x57\xa5\x92\x0b\x6d\x5a\x4b\xd8\x05\x25\xff\xa8\xd1\x44\x28\x48\x33\x95\x4c\xf2\x0b\xa6\x15\x55\x5e\x4e\x3b\x5a\x9f\x2f\x6a\xd5\x59\x45\x9d\x2a\x95\x2c\x38\xd9\xed\x79\x3f\x36\x84\x48\x3e\x1c\x0c\x1c\x93\x2c\x21\x78\xa2\xa3\x7b\x5d\x3c\xd1\xc0\x91\xf1\x38\x5d\xdd\xe7\x0d\x38\x77\x30\xe2\xcf\xc9\x43\x63\x80\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x81\x1f\x3b\x8c\x1f\x81\xf8\x80\xf8\x80\xf8\x7a\x18\xf1\xfd\x40\x3f\xc5\x84\xf2\x51\xd2\x37\x5d\x85\x22\xaf\xeb\xe8\x96\x3d\xb2\x2f\xf5\xb1\xff\xd5\x47\xac\xe6\x8c\x4b\x6b\xe9\xe8\xdd\x05\xb9\xea\x9e\x6f\xc5\x93\x24\x63\x05\xb9\x3a\xe5\x3e\x7f\x39\x3d\xb5\x30\x67\xee\xf1\x42\x0c\xe4\xaf\x6b\x68\xb2\xae\xa1\xc9\x46\x1a\xca\x56\xe8\x31\x01\xdf\x2e\xd2\x3c\x87\x6f\xb3\x34\x43\x99\x16\xe0\x9b\xe3\x39\x1b\x49\x24\xc3\x7e\xb0\x9f\xf6\x19\x83\xe0\xad\x3c\x15\xf9\x91\xd9\x1f\xf7\xb1\xaf\xf4\xd1\x5d\x52\x8d\x94\x54\x24\x59\xf0\x1d\x8a\x7d\xfa\x50\xb8\xd5\x9a\xfc\x8a\xae\x1f\x0d\x5f\x79\x73\x7b\x86\xc9\x1c\x8d\x7f\x4c\xd2\x79\x23\x49\xb5\x5c\xbd\xae\xa8\x4f\xe9\x1b\x18\xfb\x6b\xf0\x91\xff\x1a\xe7\xf2\x20\x87\xa2\x6c\x29\x80\x9f\x4b\xb2\x77\xf4\xd3\xcb\xed\x96\xf4\xaf\x26\xa6\xca\x52\xbe\x06\xd4\x5c\x14\x67\x88\x10\x87\xe4\x90\x7e\xc6\x45\xeb\x22\xa7\xbe\xd6\x75\x62\xb8\xe9\x30\xb2\x2b\x74\x4e\x74\xed\x19\x3a\xc5\xbb\xf6\x28\x1d\xa6\x83\xfe\x79\x48\xec\xfe\x59\x4b\xa7\x5c\x37\x16\x48\x9d\xfd\x8b\xea\x17\xe4\x2a\x5d\x7d\x6d\x30\x94\x3e\xce\x8e\x09\x28\xed\xfe\x61\x0f\x2c\x5d\x37\x8e\x14\xfd\x8b\x6d\xb5\x83\xb2\x4f\x95\x2b\x25\x29\x57\x5b\xa0\xd7\x3d\x2e\x49\xe3\xa4\x8e\x0f\x4d\x26\x4b\xe7\x69\xb6\x26\xb3\x52\x8b\x63\x83\x68\x7d\xe4\x56\x6a\x31\xb7\xd2\x87\x22\xe1\x59\x88\x79\x91\xf7\xe8\x2c\x4d\xdb\x79\x8f\x36\xc2\xde\x54\x56\x1b\xb6\x37\xbe\xf6\x24\xc8\x10\x25\x7f\xf2\x8e\x5a\x7b\xf3\x0a\x23\xa6\x4e\xaa\x31\x31\xc3\x46\x26\xa4\x8e\x5b\x98\xf6\xe4\x42\x82\xad\x09\xb0\x35\xc8\xc7\xd1\x91\x7c\x1c\x08\xc4\x46\x20\x36\x02\xb1\xdb\x15\x88\x9d\x7d\x3e\x12\x6e\xd0\x29\x2d\x8a\x14\x8e\x17\x68\xce\x91\xc2\xf1\x26\xdb\x0c\x5a\x23\xc4\xbc\xd7\x08\xdb\xd9\x56\xd1\x4d\x6d\xdf\x96\x64\x7e\x68\x47\xed\x32\x61\xa4\x22\xa9\xd5\x22\x77\xc2\x0b\xf2\xb3\xee\xfe\x24\xc1\xcb\xdc\x77\x74\xed\xb0\xbb\xb6\xa1\x51\x7e\x0f\xfb\xf9\xde\x7f\x8f\xf3\xe0\x35\x59\x2d\xc8\xce\xa3\x83\xce\xa3\x1c\x13\xc9\x85\x62\x6e\xb4\xee\x3c\x57\x2b\xfa\xbf\x6f\x18\x47\xf5\xbb\xcc\x5c\xa4\x79\xca\xd6\xec\x8c\x26\xe9\x68\x0b\xaf\xc9\x02\xd7\xaa\x60\xc5\x12\xb0\x62\x79\xae\x9f\x9e\xed\x67\xcf\xf4\x47\x9f\xb6\xcc\xfe\x9b\xfb\x7b\x67\x77\x54\xe3\xde\xd3\xfb\x99\xcb\x55\xb8\x0b\x5a\x7f\x39\x6d\xd1\x5a\xc2\xe7\xc5\x1d\xe6\xb3\x97\x50\x37\x49\x25\x7e\xa5\xbe\x4c\x13\x57\xf3\x33\xf8\x92\x49\x8b\x25\xb2\x9a\x52\x5e\x10\xea\xad\x87\xf5\xcf\xc2\xf8\xf7\x92\xf9\xb1\xd8\x7f\x1c\xf6\xdf\xb6\x65\x5e\x8a\xd0\x8b\x11\xf6\x42\x24\xfa\x09\x8b\x4c\xbf\x3f\x32\xab\xa8\x39\xbe\x9a\x2b\x28\xbc\xdb\x95\x58\xfc\xb2\xfe\xa7\x78\x6c\xca\xf5\x14\xdc\xe7\x20\x16\x5e\xab\x9a\xad\x53\x19\x95\x72\xfc\xc1\xb9\xfa\xa7\x54\xcc\x19\x13\xab\x5c\xca\x6b\x31\xe5\xba\xd1\xa7\x42\x1d\x53\x91\x95\x4a\x49\x4e\xc5\xc4\x2f\x72\xb9\x9d\x39\x96\x9c\xfd\x7b\x76\x80\xf5\xf3\xf1\x2d\xfc\xb6\x5c\xd2\xb1\x0e\x82\xaa\x36\xef\x0c\xd7\x09\x08\xe7\xfd\x40\xd9\x49\x3a\xca\x0e\xc7\x0f\x5a\x42\xff\x7b\x9d\x21\x02\xae\x86\x6f\x85\x20\x01\xf6\xaf\x86\x69\xd6\x1f\xbf\x0a\x12\xbe\x6e\x22\x86\x62\xb9\xa0\xca\xbc\x82\xe0\xf3\x09\xf6\xdb\x03\xc4\x5c\x13\xaa\x80\xe5\x5a\x63\x5a\xe5\x39\xd1\x54\x48\x3a\xe5\xfd\xd7\x6b\x27\x67\x7e\x33\xf6\x0c\x6d\xfc\xdc\x7c\x51\xab\x42\xa8\x5c\xff\x25\x36\xa2\x2c\xbe\xfa\x64\xf0\xe7\x3a\xc9\x8e\x06\x7c\xae\xc6\x40\x78\xa4\x1e\x81\x70\x19\xc2\x65\x08\x97\x21\x5c\x86\x70\x19\xc2\x65\x08\x97\x21\x5c\x86\x70\x19\xc2\x65\x08\x97\x21\x5c\x86\x70\xb9\xb3\xc2\xe5\xcd\x07\x36\x20\x8d\x86\x34\x1a\xd2\xe8\x4d\x24\x8d\x7e\xdb\x93\x94\x30\xb3\x1f\xf8\xa0\x46\xb9\x9c\xaf\x28\xc5\x72\x55\x63\x5f\x7c\x82\x7d\xe7\x21\x3b\x17\xc2\x90\x58\x78\xaa\xc6\x94\x69\xda\x54\x33\xad\xeb\x59\xf3\xba\xe4\x5e\xfd\x44\x91\xba\xc0\xe6\x80\xd6\xe1\x2e\xa7\x80\x19\xd0\x30\xd0\x30\x54\xbb\x03\x0d\x03\x0d\x03\x0d\xeb\x1d\x1a\xd6\x45\xc5\xdc\xba\x86\x86\xa1\xca\x18\x68\x18\x68\x18\x68\x18\x68\xd8\x46\x54\x19\xeb\x69\xb4\x84\x32\x48\xbd\x5c\x06\x29\xb3\x09\xd1\x52\xf6\x09\x9a\x12\xea\xa9\x49\x3a\xca\xd5\x53\x13\x34\x4e\x29\x5f\xf9\x62\x4e\x51\xe5\xd4\x5a\x3a\x65\x71\xa1\x46\xa2\xca\xd7\x29\xd3\x2f\x94\x52\x17\x82\x95\x52\x09\x36\x68\x67\x76\x14\xd2\x28\xeb\x1e\x5c\x2a\xc6\xf8\x97\xb7\xd9\xf0\xeb\x0e\x31\xdf\x38\x28\xd7\xfd\xe2\x2f\xed\xe7\x5c\x02\x4b\x9d\xa1\x53\x74\xa2\x46\x11\x3e\x42\xc9\xc6\xfb\x17\x1a\x70\x44\xc8\xb6\x18\x21\xfb\xd5\x08\x4d\x8b\xd0\x95\x13\x34\xe9\x08\x5d\x49\x51\x53\x6f\xa0\x7f\xf2\x83\x93\xc2\x72\x1c\xa6\x83\xdc\x72\x34\xdb\x6e\x46\x44\xdd\x1e\xa7\x63\x76\xd4\x6d\x93\x6d\x04\x1b\x98\x8a\x12\xb6\x81\x49\x7e\x6a\xc4\x36\x30\xf7\x19\x51\x50\x8e\x90\x32\xe5\xb2\xc3\xdc\x18\x21\xb4\xc2\xdc\x4c\x5b\x27\xb5\xdf\xf0\xb4\x27\x84\x16\x80\x15\x80\x15\x80\x15\x80\xb5\x77\x00\x2b\x96\x5f\x01\xcb\xaf\xee\x21\xd0\x48\x5f\xd0\x91\xf4\x05\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x3d\x0d\xfa\x91\xc5\x06\x59\x6c\x90\xc5\xa6\x5d\x59\x6c\xe0\x47\x83\x1f\xad\x57\xfd\x68\xd9\x42\xc8\x09\x9c\x82\xdc\x53\x49\x6f\x7a\xbc\x8b\xed\x14\x5f\xb3\x6d\x69\x1b\x25\xc9\xde\x05\xc9\x6a\xa9\xf2\x26\x0c\x1d\x61\x1f\x4f\xd0\x88\xbb\x10\x9f\x8f\x20\x5d\x93\x73\xaa\x5c\xd5\xd8\xbf\x4f\xb0\xf7\x3a\x4a\xf3\xa9\x8d\xa5\xbb\x58\xe2\x57\x87\x94\xed\xe2\x7e\x47\x55\x3e\x9b\xbc\x8b\x9f\x40\x86\x8b\x9b\xc8\x70\x71\x3e\xf8\x63\x78\x88\xed\xab\xfd\x00\x44\xc7\xbb\x7c\x2a\x48\x66\x01\xf9\x3e\x92\x59\xc0\xbb\x04\xef\x12\xbc\x4b\x3d\xe4\x5d\x42\x32\x0b\x24\xb3\x00\xd5\x07\xd5\x07\xd5\x07\xd5\xef\x0a\xaa\xbf\x09\x89\x04\x92\x59\x80\x94\x22\x99\xc5\xe6\x89\x38\x60\x7f\x7a\x2f\x9d\x34\xeb\xfc\x55\xb4\x75\x52\x5a\xe4\xe5\x4a\x49\xb9\xa1\x4f\xee\x66\x0d\xb3\x31\x2d\x27\x95\x64\xf6\xd3\xf7\xb2\x7f\xe8\xa3\xad\xfa\xe5\x97\xd6\xd2\xd1\x41\x5e\xc3\x8c\x1f\x32\xfb\xd8\x9e\xd2\x67\xac\x46\x92\xfb\xf4\xf3\xa6\x2a\x15\xcd\x49\x01\xed\xe3\x4b\x7a\x03\x21\x57\x31\x7b\x8d\xbf\x78\xfa\x8c\x40\x7a\xc7\xe8\x08\x47\x7a\x69\x1a\xa3\x51\x5f\xe1\xb3\xb4\x5a\x55\xf4\x07\x34\xd2\x46\xf3\x5b\x35\x49\xdd\x42\x30\x84\x1b\x65\xfb\x0d\x08\xe7\x68\xc8\xa4\x71\x7a\x5b\xee\x3c\xd0\xeb\x17\x44\x8b\x7e\x72\x9b\xdd\xf7\xc3\x66\xa9\xb2\xe0\xee\x1f\x34\x4e\xed\xe8\x08\x64\xa6\x69\x8a\x4e\xd7\x04\x60\x34\xdb\xd3\x10\x01\x22\x06\xa3\xc5\x18\x8c\xf7\x45\xe8\xac\x08\x73\x38\x45\x27\xec\x30\x87\xe6\xbf\xf6\x0e\x18\x92\x80\xba\x64\xa1\xdb\x99\xcc\xb7\x6f\xb3\x0d\xc9\x44\x5d\x71\x91\x60\x8b\xf2\x20\x4f\x4b\xdf\x31\x7b\x82\xf2\x22\xbd\x66\xd6\x50\x5e\x04\xe5\x45\x36\xb8\xbc\xc8\x6b\x6e\xde\xbe\x07\xfa\x7a\xc3\x5f\x41\x06\x56\x12\x99\xa0\x71\x96\x8a\x8f\x58\x9c\x61\xa7\xb3\x92\x08\x6f\xf0\x96\xa8\x20\xf2\x97\x83\x74\xb7\xd8\xeb\xac\x70\xad\xc4\x5a\x7a\x2c\xa7\x2a\xe5\xab\xca\x8a\xc6\x3e\x3b\xc8\x3e\xd9\x4f\xdb\xf8\x01\x7d\x06\x7c\x68\xfd\x44\x7d\xd3\xaa\x52\xce\x2a\x2b\xc9\xb8\x7e\x5a\x46\x3f\x65\x39\x6d\xfc\x6d\x56\x51\xa7\x4a\x25\x6b\x06\xec\xf6\x5c\x7d\xcd\xbe\xd3\xbc\x87\xf4\xb7\xd9\x78\xdc\x86\x42\xce\xe7\x83\xdf\xe9\x61\x36\x64\xbc\xd3\xfc\x17\x8c\xb7\xd9\xf8\x11\xf7\xfb\x1c\x10\xc0\x0e\xf9\x02\xe4\x0b\x90\x2f\x40\xbe\x00\xf9\x02\xe4\x0b\x90\x2f\x40\xbe\x00\xf9\x02\xe4\x0b\x90\x2f\x40\xbe\x00\xf9\x42\x87\xe5\x0b\x10\x17\x40\x5c\x00\x71\x41\x0f\x8b\x0b\xfe\xf5\x6e\x9a\x0e\xa8\x94\xa1\xca\x16\xb3\xd2\x8d\xb5\xaa\xe8\xa6\xd2\x56\x18\xf0\x90\x31\xf6\x6b\x51\xf6\x5f\xfb\xed\xa8\xa5\x09\x21\x31\xe0\xc7\xea\x5d\x52\x8b\x76\x8b\xd3\x56\x8b\xc9\x31\xfd\x9a\xda\xa0\x23\xcf\x53\x45\x98\x5a\xc8\xd2\x83\x3c\xcd\x09\xc8\x96\xa1\x33\x1c\xb2\x4d\xd2\x51\x3a\x1c\x98\x5a\xcd\xf3\x06\x03\x69\xdb\xe3\xc1\xb4\xed\x20\x9b\xa8\x0d\x04\xf2\xfe\xad\x66\xa4\x08\x6f\xda\x6e\x8f\xd1\x21\x4b\x8a\xd0\xd4\x30\x4d\x18\x97\x6d\xd8\x48\x65\xe6\x29\x4b\xe7\x6b\xdc\x7a\x2d\x0f\x15\x9c\x7a\xd0\x2a\xb4\xa8\x55\xf8\x48\x24\x4c\x93\x71\x51\xc8\x1e\xce\xd1\x59\x5b\xf6\x70\x8b\x99\xa0\xca\x6a\x95\x32\xef\xdd\x61\x9b\xa0\x53\xf5\x22\x86\xa6\x6c\xd1\x78\xc5\x2b\x50\xb5\x23\x96\x08\xe2\x86\x5e\xb3\x83\x10\x37\x40\xdc\xb0\xc1\xe2\x86\x8e\xae\x51\x83\x34\x09\x0d\xce\x20\xeb\xa5\x76\xf0\xbe\xb1\x6c\x86\xce\xb0\x53\xf1\x13\x96\x70\xe1\x01\xa7\xd8\xc1\xf3\x9a\x5b\x42\xfc\xf0\xf4\x93\x34\xde\xac\xd0\x9b\xfd\xcd\x13\xec\x4d\x83\xb6\x2c\x30\xb1\xbe\x28\xc2\x21\x06\xbc\x4f\x3f\xd3\x5f\x0b\xd8\xe5\x9a\x08\xd4\x2f\x84\x82\x00\xf5\x0b\xa1\x20\x80\x82\x00\x0a\x82\x1e\x52\x10\x74\x51\xf6\xe8\xae\x51\x10\x20\xad\x31\x14\x04\x50\x10\x40\x41\x00\x05\x01\xea\x17\x22\xef\xea\xad\xe3\xf0\xef\xfa\xbc\xab\x9b\xb2\x7e\xe1\x93\xfe\x81\xb1\x19\xc1\x16\x8f\xd3\x31\xce\x16\x0f\x50\x9a\xc6\xfc\x03\xa7\x2a\x15\x4d\xd4\xbb\x32\x89\xd1\x7c\x51\xab\x36\x5a\xc0\xf0\x62\x30\x3a\xdc\xcf\x86\xcd\x08\xaa\x4a\x45\x33\x80\xa1\xfd\x6b\xee\x1a\x86\x7f\xea\x08\xb1\xdf\x65\xd4\x30\x94\x9c\xb4\xcb\x98\x88\x3a\xc0\xbb\x04\x9e\xe2\x19\x47\x6b\xbc\x33\xa3\xb4\xbf\x89\xee\x84\x43\x06\x8e\xe9\x16\x1d\xd3\x5f\x8b\xd0\x29\xf1\x2d\x1f\xa1\x43\xfc\x5b\x1e\xa3\xe6\x5e\x3e\x51\x08\x31\xcd\x0b\x21\x5a\xde\xe8\xa6\x1b\x99\x11\xd5\x14\x4f\xd2\x71\x47\x35\xc5\xa6\x5b\x69\xbd\x58\xaa\xa8\x65\x18\xb2\xad\x49\xfe\xd6\x88\x6d\x6b\xee\xf7\x2c\x67\xe8\xb0\x3b\x49\x71\x82\xb0\x3b\x5e\xf5\x0c\xdb\x66\x81\x50\xd0\x10\xc4\x15\xc4\x15\xc4\x15\xc4\x15\x05\x0d\x51\xd0\x10\x05\x0d\x51\xd0\x10\xe4\x1f\xe4\x1f\xe4\x1f\xe4\x1f\xe4\x3f\x14\xf2\x8f\x82\x86\x28\x68\x88\x82\x86\x28\x68\x08\xc7\x1a\x1c\x6b\xa1\x17\x34\xf4\x75\x52\x85\x5a\xe9\xb0\x95\x82\x86\x8d\xe1\x64\x0f\xd5\xbb\x37\x5a\xde\x8c\x42\xf5\x6f\x0d\xd2\x5e\x21\x54\x17\x6a\x6a\xde\xdf\x45\x65\x6c\x2d\x6d\xfc\x81\x7d\x7e\x90\xfd\xcf\x7e\xda\x2e\xfe\xeb\xd2\x5a\x3a\xba\x6f\x7d\x5d\x3a\xaf\xb1\x97\x7c\x40\x3f\x89\xff\x53\x5b\x4e\xf3\xff\xdf\x6c\x99\xfa\x5e\x4d\xa7\xc5\xfb\x79\x94\x0e\xf3\xf7\x73\x9c\x52\x34\xe2\xeb\xed\x30\xba\x6f\x2d\x9d\xe2\x4f\xdb\x50\xa2\xbe\xc5\xe0\xf7\x6f\x8c\x8d\x1a\xef\x9c\x6b\x7c\xcc\x7a\x9a\x6b\xb5\x2e\x0d\xa4\xeb\x83\xd8\x1e\xe9\xfa\xe0\xfa\x81\xeb\x07\xae\x1f\xb8\x7e\x90\xae\x0f\xe9\xfa\x80\xdc\x81\xdc\x81\xdc\x81\xdc\xbb\x0b\xb9\x23\x5d\x1f\xd2\xf5\x6d\x16\xc8\x88\x74\x7d\xed\x48\xd7\xf7\x8e\x24\xcd\x0a\xf2\xa6\xae\x48\xb9\x94\x49\x87\x78\x53\x0e\x0a\xe7\x97\xc9\x4f\x29\x99\x7f\x79\x23\xfb\xd4\x30\xfb\x7f\x7d\x74\xa7\xde\xce\x94\xb3\x99\x4b\x6b\xe9\xe8\xdd\x3c\x7d\x9f\x7b\x6b\xba\xa8\x94\xe4\xe4\x43\xfa\x81\xc5\xda\x4b\x5c\xc9\x97\x94\xd0\x8b\x02\x2e\xd1\x51\x01\xd5\xd2\x34\xc6\xa1\xda\x30\x0d\xd1\x43\xbe\x50\x8d\xf7\xcc\x5a\x3a\xa5\xdf\x49\x20\x4d\x7b\x32\x98\xa6\x4d\xb2\xa3\x06\x4d\xf3\xed\x73\x33\x9d\x89\xd2\x64\x65\xc0\xe7\xb7\xf9\x0c\x40\xd4\xcc\xcd\xe7\x31\x06\x09\xe3\x58\x87\x87\x21\x73\x9c\x8e\xd1\x91\x9a\x90\x86\x46\xc7\x01\x2a\x3a\x04\x33\xb4\x18\xcc\xf0\x8e\x88\xbf\x33\xa8\x75\xbb\x70\x52\xc4\x37\x1c\xa6\x83\x76\x7c\x43\xe3\x97\x37\x58\x01\xb0\xbd\xc6\x25\xf9\xe3\x77\xf8\x58\x8f\x97\x1b\x3e\x6d\x49\x18\x8c\x21\xf1\x9f\x9d\xb6\x17\xed\x09\x40\x80\x21\x09\x30\x24\x10\xc1\x76\x44\x04\x0b\xf5\x13\xd4\x4f\x50\x3f\xb5\x4b\xfd\x94\x7d\x3e\x12\xae\xd2\x83\x16\x45\x2c\xe2\x05\x9a\x73\xc4\x22\xde\x64\x9b\x41\x9b\x8b\x98\xf7\xf2\x60\x3b\xdb\x2a\xba\xa9\xdd\x2b\x84\xcc\x3f\xdd\xe6\xb3\x42\xd8\x57\x97\x78\xd7\x63\xa3\x31\xc8\xf3\x3c\x76\x70\xd9\x80\x9c\xba\xbd\xb6\x58\x41\x4e\x5d\xe4\xd4\xdd\xe0\x9c\xba\xed\xa4\x4b\x81\x29\x74\xdb\x6b\xff\xb3\x69\x1a\x63\xa3\xf1\xfd\x96\xb6\xf0\x0e\x57\x22\x5d\xe5\x16\x29\x1a\xfc\xbe\x24\x3d\x26\xa0\xa8\x56\x55\x54\xa9\x20\xdb\x24\x74\x45\xae\x4a\x69\x41\x98\xfd\xa0\x68\x4e\xb7\xa9\xfc\xb2\x9c\x54\x91\x72\xc5\x6a\xd1\x66\xa4\x2f\x0c\xb3\x1f\xd9\x42\xb7\x1b\xc7\x2f\x19\xed\x45\x3f\x1a\x31\x98\xb5\x8d\x88\x75\x0b\x22\x3a\xca\xaa\x3f\xbc\x34\xb7\x24\xae\x9b\x16\xed\xde\x48\x39\x96\xf7\x93\xd6\xc6\x60\x88\xb7\x35\x64\x6b\x8f\x5c\x62\x12\xa5\x22\x5b\xbb\x36\xad\x2a\x4b\xf9\x11\xdb\xf9\xcb\x77\x3a\x86\xab\xb0\x58\x95\xaf\xd9\x66\x71\xc8\x25\x24\x70\xb4\x9d\x4a\x8a\xce\x30\xee\x6c\x59\x3c\x90\x3d\x9f\xd7\xdf\x74\xb7\x2b\x2e\x9f\xa2\x05\xf1\xf9\xce\xd1\x39\xfe\xf9\xf2\xcc\x2b\x2d\xcc\xd8\x9c\xfc\x0b\x6d\x64\xd0\x67\x2d\x07\x7f\xb5\x19\x76\xc6\xf8\x6a\xdd\xef\xa4\x59\x34\xb9\xae\x9f\x9d\x1f\x2e\x1f\x94\xf5\x8a\x82\x5f\x17\x45\xc1\x21\xcb\x84\x2c\x13\xb2\x4c\xc8\x32\x21\xcb\x84\x2c\x13\xb2\x4c\xc8\x32\x21\xcb\x84\x2c\x13\xb2\x4c\xc8\x32\x21\xcb\xec\xac\x2c\xf3\x34\x9d\x64\xc7\xe3\xc7\x2c\x66\x72\x9f\x13\xb3\xd4\x6f\xf5\x6e\x05\xe8\x02\xe5\x28\x94\xa3\x50\x8e\x6e\x22\xe5\xe8\x17\x86\xe8\x1e\xb3\xd0\xb3\xe0\xa1\x62\xbf\x79\x4d\xaa\x68\xec\xf9\x21\xf6\xdc\x80\x5d\x96\x73\xd5\x98\x5b\xcb\xf9\xe2\x5a\x31\xbf\x2a\x95\x5c\xa4\xd3\x5a\xc7\x4e\xf3\x06\x1e\x96\x2a\xa1\x80\xcd\x54\x32\x71\xdd\xae\xe6\x69\xb5\x3d\x5f\xd4\x36\x5d\x14\xf8\x53\xfe\x8a\xb5\xd0\x61\xa5\xc9\x24\xf7\x79\xc3\xc2\x1d\x8c\xf8\x8d\x89\xb4\xdb\x17\x82\xc1\x65\x82\x0d\xd6\x56\xe9\xb3\xc6\xc2\xed\x5c\x00\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\x04\x7d\xec\x2c\x7d\x04\xda\x03\xda\x03\xda\xeb\x61\xb4\xf7\xf9\x7b\xe9\xa4\xd0\x3f\x4a\x95\x8a\xb6\x4e\xfc\x77\x5e\x92\xaf\xe9\x8b\xae\xaa\x29\x70\x1c\xd3\x78\x20\x03\xfb\x8f\xf7\xb2\x6f\xf6\xd9\x55\x8d\x06\x79\xf8\xb7\x38\x66\x76\xb2\x3d\xe3\xce\xf0\x56\x96\xe4\x6a\x72\x9f\x7e\x5e\x5d\x49\x35\xf3\xb0\x08\x92\x08\x39\x16\xfc\x55\x22\x72\x73\x9c\x47\x6e\xf6\x3d\x72\x81\xa5\x68\x84\x92\xc1\xe5\xa4\xcc\x9b\x0a\xd4\xf6\xad\x1f\xb1\x7d\xf5\xe1\x60\x82\x96\x64\x09\x23\xcb\xa7\xf5\xa3\x7e\xd9\x40\xa3\x1f\x73\xd4\xad\x1b\x36\x63\xbe\x83\x3b\x7e\xd0\x38\xb5\xa3\x7d\x9f\x39\x43\xa7\xe8\x44\x4d\x74\x44\x53\x9d\x8f\x78\x08\x44\x81\xb7\x18\x05\xfe\x63\xeb\x44\x81\xdf\xa4\x45\xc8\x88\x50\xf0\xe3\x74\xcc\x0e\x05\x6f\xb2\x0d\xd3\x78\x84\x6b\x1d\x02\xc2\xcb\x33\x7f\x7b\x9b\x6d\x3c\x26\xea\x02\xba\x82\xad\xc8\x83\x3c\x08\xa1\x63\x36\x04\xd1\x5d\xbd\x66\xcd\x10\xdd\x85\xe8\xae\x0d\x8e\xee\x6a\xfb\x7a\x31\x30\xc4\xab\xb1\x39\xc1\x23\x47\xbc\xe7\xfc\x90\x3d\x4c\x07\xd9\x44\x7c\xdc\x92\x0a\xdd\xe5\xd4\x1a\x59\xd7\xdc\x0a\x12\x23\xf6\x4b\x49\x5a\x36\xf6\x35\xab\x55\x45\xcb\x49\xa5\x62\xb9\x30\xb6\x36\xb1\x22\x57\xa5\x89\xf5\x83\xba\xf8\x20\xe9\x9f\x74\xa9\xa2\xe4\xcd\xab\x65\xd5\x0a\xec\xfa\xea\x30\xfb\xc0\x16\xda\xe5\x68\xf7\x92\xd1\x6e\xf4\x57\x1a\x09\xee\x3a\x6f\xb5\xbf\xa0\xe4\xa7\xac\xf6\xbb\x22\xc2\xeb\x28\xff\xb9\x29\xfb\xd1\x96\xc5\x93\xd9\x53\xbc\xcf\xdd\x77\xbf\xac\xa2\xf3\xa1\x5e\x41\x31\x58\x57\x0b\xc1\x9f\xf7\x0c\xcb\x98\x9f\xb7\x3d\x28\xc6\x57\xee\x33\x14\x8e\x6f\x5e\x0c\x1e\xe4\x16\x90\x5b\x40\x6e\x01\xb9\x05\xe4\x16\x90\x5b\x40\x6e\x01\xb9\x05\xe4\x16\x90\x5b\x40\x6e\x01\xb9\x05\xe4\x16\x9d\x96\x5b\xcc\x50\x86\x9d\x89\x9f\xb2\x40\xca\x3e\x27\x80\xf1\xd9\xce\xdd\x0a\x38\x06\xb2\x10\xc8\x42\x20\x0b\xd9\x44\xb2\x90\x2f\x0e\x53\xda\x48\x8b\x95\xbb\x22\xe7\x57\x4b\xfa\xaa\xd2\xae\x11\x50\x51\x8b\x8a\x5a\xac\xde\xc8\x95\x24\x4d\xb3\x53\x5e\xfd\xd4\x30\x7b\x5b\x3f\xbd\xdc\xbe\xe4\xd2\x5a\x3a\x1a\xf3\xa8\x07\xb0\x60\x5c\x3f\xad\x5f\x9f\xdc\xab\x9f\xb1\x64\x5d\xb4\x9c\x76\x1d\x0e\x59\x04\xb2\x42\xe7\x04\x08\x3c\x43\xa7\x38\x08\x3c\x4a\x87\xe9\xa0\x2f\xd4\x77\x3c\xfe\x5a\x3a\xe5\xba\xb1\x9b\x95\x83\xbc\x36\x98\xfe\x1d\x67\xc7\xcc\x4c\x50\xb5\xc3\x60\x30\x40\xf7\x1d\x39\x69\x7f\xf4\x8f\xb7\xd5\x0e\xc5\x3e\xef\xca\x00\xee\xd1\x88\x19\x27\x75\x68\x40\x32\x59\x3a\x4f\xb3\x35\x9e\xd5\x16\x47\x04\x5e\x55\x68\x44\x5a\xd4\x88\x7c\x28\x12\x9e\x5d\x98\x17\xa2\x90\xb3\x34\x6d\x8b\x42\xda\x67\x65\xda\x6c\x46\x02\x84\x24\xc9\x1f\xbd\xa3\xd6\xca\xbc\xc2\xaa\x20\xe0\x36\x2c\xf7\x8b\xbf\x77\xca\xae\xa0\x84\x00\x4a\x08\xa0\x84\x00\x4a\x08\xa0\x84\x00\x4a\x08\xa0\x84\x80\x77\x09\x81\x36\xaf\x1d\x32\x6f\xdd\x51\xbb\x38\x18\x09\x28\x1e\xe0\x5e\x32\xdc\xc7\x75\x50\x1d\x58\x31\x40\x5f\xda\x6b\xeb\x14\xe8\x4b\xa1\x2f\xdd\x60\x7d\x69\x07\x51\x54\xa0\xd2\xb4\xb1\x99\x20\xc8\xe0\xfb\xce\x14\xd9\x49\x3a\xca\x0e\xc7\x0f\x5a\x3e\x8b\x7b\x9d\x9e\x0f\x57\x83\xf5\xfe\x8e\xd0\xc5\xa1\x7f\x9b\xa0\x29\x41\x37\xcb\x72\xf5\xba\xa2\x3e\xe5\xa6\x9b\xeb\xaa\x43\x8b\xe5\x82\xaa\x1b\x15\x8d\x3d\x9b\x60\xbf\x32\x40\x2f\xb7\x9b\xd0\xe7\x37\xad\xb1\xf4\x57\x73\xa2\x95\x90\x92\x5f\x0d\xf2\x0b\x2e\x5a\x37\xe2\x0c\xc9\x30\x7e\x69\xbe\xa8\x55\xa1\xd1\xac\xff\x30\x1a\x4a\x7d\xf5\xaa\xe0\x8f\xe3\x10\x3b\x20\x3e\x0e\xa3\xbf\xbd\x3e\x8b\xba\x97\x0d\xc2\x4c\x08\x33\x21\xcc\x84\x30\x13\xc2\x4c\x08\x33\x21\xcc\x84\x30\x13\xc2\x4c\x08\x33\x21\xcc\x84\x30\x13\xc2\xcc\x4e\x0b\x33\x21\xa9\x84\xa4\x12\x92\x4a\x48\x2a\xdb\x28\xa9\xfc\xc8\x10\xed\x72\x27\xd1\x2f\x2b\x79\x59\x63\x3f\x36\xc4\xde\xee\xc8\x9f\x5f\x69\x0c\x20\x5e\x54\xf2\x72\x48\xf4\x70\x97\x23\x75\xbe\xde\x2c\x50\xe1\x4d\xa0\xc2\xd9\x60\x54\xb8\x8f\x3d\xe0\x01\x07\xad\x8c\xf9\xfa\x10\x00\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x22\x41\x3e\xb0\x1d\xb0\x1d\xb0\x5d\xc7\xb0\xdd\x57\x5f\x47\x27\xcc\x04\xf9\x45\xf9\x0d\x55\xb9\xcc\x47\xcb\x96\x0b\xae\xc8\x55\x29\x3d\x96\x5b\xd5\xaa\xca\x35\xb3\x41\x07\x86\x62\xef\x7d\x1d\xfb\xc1\x21\xba\xcb\x75\xf5\x25\xe3\xb2\xe8\x61\xb1\x70\x54\x8d\x29\xcf\xb4\x89\x66\xaa\xc8\x69\xde\xaa\xb9\xed\x9b\xb1\x5a\x4d\x8e\xeb\xd7\x4d\x39\x9b\x5c\x16\x2d\xfa\x5d\xd1\xe5\x40\x2f\x03\xde\x05\xde\x95\x01\xef\x02\xef\x02\xef\x02\xef\xea\x19\xde\x95\xe9\x1a\xde\x15\xfa\x9d\xb4\xcc\xbb\x32\xe0\x5d\xe0\x5d\xe0\x5d\xe0\x5d\xe0\x5d\x9d\xe7\x5d\x99\x9e\xc6\x53\x19\xe0\xa9\xf6\xe1\xa9\x4c\xb7\xe3\xa9\xcc\x26\xc4\x53\xd9\x77\x45\xe8\xfb\x84\x12\xaa\x4a\x2a\x57\x42\x95\xe8\x2a\x5d\xf1\x53\x42\xd9\xbc\x68\xd4\xda\xaf\xdb\xa2\x28\x37\xe1\x32\x18\x55\xca\x0f\x29\xcd\x17\xb5\x60\xd1\xd4\x7d\xde\xa2\xa9\xad\x6c\x8b\xd0\x4b\xbd\x3e\x58\x2f\x75\x91\xcd\x3b\xf4\x52\xfc\x9e\xec\x52\x67\xf5\x48\xce\x90\x51\xf9\xdd\x35\xc5\xdf\x73\x9b\x1f\x8d\x7b\x40\x4c\x6f\x31\xc9\x1f\xbc\x4d\x88\x53\x36\x04\xbd\x09\x52\xf6\xbd\xf4\x06\x5a\xab\xc9\x14\x71\x99\xf2\x9d\x18\x71\x64\x95\x40\x7e\xbd\x16\xf3\xeb\xfd\x87\x7e\xba\x2e\xec\x54\x85\xca\xdc\x4e\x5d\xa1\x0e\xbd\xb5\xf4\xcf\x45\x3e\xbe\x55\xd2\xec\x7c\x7c\x9d\xfb\xf5\x37\x8a\xcc\x3f\x6b\x54\x75\x64\xfe\xe9\xdc\xcf\x07\x19\xe8\xc6\x0c\x70\x80\x4d\x6d\xca\x3e\xaf\x33\x27\x54\x14\xad\x4a\xc9\x77\x8f\xfa\x19\xe8\x51\x23\x5f\x94\x23\xf9\x96\x72\xd9\xdf\x58\x9f\x10\xa7\x7b\x1a\x6b\xab\x85\x0e\x99\xed\xf6\xa4\x23\x04\x31\x07\x31\x07\x31\x07\x31\xef\x1d\x62\x8e\x25\x68\xc0\x12\xb4\x7b\x5c\x0a\x48\x05\xdb\x91\x54\xb0\xf0\xdc\xc0\x73\x03\xcf\x0d\x3c\x37\xf0\xdc\xf4\xb4\xe7\x06\x19\xc1\x91\x11\x1c\x19\xc1\xdb\x95\x11\x1c\x8e\x51\x38\x46\x7b\xd5\x31\x9a\x2d\x84\x9c\x0c\x3f\x1c\x26\x7d\x13\x3e\xc0\x3a\x5e\x7d\x35\xe9\xcd\xa4\x77\xb1\x9d\xc2\x80\xd8\xc6\x9d\xc2\xcf\x47\xfc\xc5\x28\x9d\x13\x31\x06\xf6\x93\x58\x91\x05\x41\x79\x88\x8d\xe2\x6b\x63\x1a\xef\x5b\xf6\x1f\xa2\xec\x87\xfb\x89\x79\xc0\xf3\x07\x79\x21\x36\x71\x9a\xf9\x96\xd8\x0b\x68\x23\x6f\x6d\x72\x44\x3f\xeb\x6c\x2d\x2e\xaf\xcb\x27\x2c\x46\x32\xe4\xda\x6c\x12\xcd\x8a\xf7\xec\x34\x9d\xe4\xef\xd9\x11\x3a\x44\x07\x7c\x13\x62\x7b\xb8\x41\xcc\xec\xbb\x37\x59\x9a\x6d\x39\xf8\x05\x3c\xc0\xd2\xc6\x0b\x68\xdf\x06\xf9\xa6\x00\x16\x6f\x59\xf4\xaf\xb7\x79\x8e\xcc\x90\x59\x97\x2d\x68\x70\xc6\x8c\x13\x37\x66\x7c\x32\x73\x74\x8e\xce\xd6\xb8\x9e\x5b\x1b\x20\x60\x3c\x78\x92\x5b\xf4\x24\x7f\x30\x12\x9a\x95\xb8\x20\x1c\xc3\x33\x94\xb1\x1d\xc3\x6d\x33\x39\x6d\xb2\x29\x01\xf5\xd9\x32\xef\xda\xe1\x69\x72\xc6\xeb\xea\xb0\x04\xd9\x1e\x51\xf4\xa1\xf3\x96\x07\xa5\x59\x7a\xcd\xf4\xa1\x34\x0b\x4a\xb3\x6c\x70\x69\x16\xc9\xd7\x9c\x87\x35\xf9\x34\x37\x2d\x04\x4c\x02\xf5\xb3\x46\x60\xc5\x97\xec\x41\x9a\x60\xe3\xf1\x94\x95\xf2\x74\x97\xb3\x22\x8b\xf1\x4b\xb7\x42\xed\x79\xf6\x6c\x94\xe6\xd6\xa9\xf6\xd2\xe4\xfe\xea\xcb\xf7\xb2\x7f\xd3\x5f\x5b\xf5\xa5\xb1\xad\xd5\x90\x7e\xd6\xba\x55\x5a\xda\xb2\xab\x7a\x82\xa6\xc4\x2b\x3b\x49\x47\xf9\x2b\x3b\x41\xe3\x94\xf2\x7d\x65\x1d\x9d\xb4\x16\xda\x86\xaa\xb1\x0a\x2a\xbe\x75\x52\xfc\x4b\xab\x44\x7f\x7f\x5b\xed\x60\x34\xbc\x9b\x4a\x1a\x27\x76\x7c\x48\x32\xfa\x8a\xf3\x4c\xcd\x92\xa2\xe9\x31\xc1\x42\x02\x7b\xa8\x16\xf7\x50\x3f\x19\x09\xc3\x26\xcc\x8a\xed\x93\x3e\x13\x5a\xdb\xa7\x76\xd8\x96\xb6\x19\x8f\xa0\xbd\xd3\xbf\xde\x51\x6b\x5b\x9a\xdf\x36\x25\x2a\x81\xb5\xb9\xb0\x63\xc2\x8e\x09\x3b\x26\xec\x98\x36\xf5\x8e\xa9\x23\xab\xcc\xb6\x15\xe2\xc3\x76\xc9\xda\x2e\xfd\x55\x1f\xdd\x65\x24\xbc\x5a\xad\x2a\x5a\x4e\x2a\x15\xcb\x05\x7d\xa3\xc4\x3e\xdf\xc7\x3e\xdb\x47\xff\xcc\xf1\x67\x7d\x4a\xbc\xbb\x20\x57\xdd\x3a\x2d\x11\x0c\x99\xdc\x53\x90\xab\x53\xf6\xb9\xcb\xe9\xa9\x85\x39\xd3\x17\x17\xe2\x6c\x57\xd7\xd0\x64\x5d\x43\x93\x8d\x34\x94\xad\xd0\x63\xe2\x0d\xd6\xa7\x2f\xfd\x0d\x9e\xa5\x19\xca\xb4\x30\x69\x39\x9e\xb3\x91\x18\x49\xf6\x03\xa3\xb4\xe0\xd1\xe3\x13\xfa\xde\x7e\xc2\x6f\x7f\xca\xdb\xd0\x6d\x69\xa9\xa2\xe4\xcd\xeb\x64\xd5\xdc\xae\xb2\x0f\x8c\xb0\x17\xfb\x69\x97\x6b\xb0\x44\x8b\xd1\x24\xdf\xad\xba\x97\x2b\xe7\xad\xe6\x16\x94\xfc\x94\xd5\x5c\xf2\x88\x7e\xae\x73\x14\x45\x1b\xf6\x1a\xc6\xe7\xc2\x90\xf7\xb0\xaa\x3f\x8f\x79\x5c\x0c\xda\x02\x5d\xe4\x83\x76\x9e\x66\x69\xc6\xd7\xec\x38\xba\x23\x65\x74\x47\xca\xe7\x09\x1a\xdc\xd9\x16\x82\x4d\xd2\x0c\xcb\xd8\x46\x48\xfc\xa8\x15\x20\x65\xdf\x8f\xb1\x4e\xf5\xb9\x1b\x8a\x7e\x72\xbb\xf7\x68\x8e\x9a\xdb\xdd\xc6\x06\x74\xd2\x38\x7d\xc3\xc7\x34\xf3\x6a\x7a\x15\x2d\xd7\xac\x12\x43\x1a\x3b\xac\x18\xb1\x35\x6e\x71\x6b\xfc\xe9\x48\xdb\x2c\x0a\x3d\x21\x36\xcc\x8f\xd1\x92\xbd\x61\x0e\xaf\xf5\xd6\x11\x9d\xbe\xd9\x6d\xd0\x90\x35\x6d\xb7\xea\x2c\x5f\xf2\xb7\xef\xf0\x36\x64\xa6\xf4\x4f\xf2\xb5\x5d\xc7\x8c\x78\xce\x0d\x37\x5d\xed\x09\xe6\x84\xd1\x0a\x30\x5a\x08\x28\xea\x48\x40\x11\x94\xe4\x50\x92\x43\x49\xde\x2e\x25\x79\xf6\xf9\x48\xc8\x72\xda\x45\x91\x61\xe2\x02\xcd\x39\x32\x4c\xb4\x59\xa2\x1b\xf3\x5e\x4c\x6c\x67\x5b\x45\x37\x75\x6e\x3d\x91\xf9\xcd\x1d\xde\xeb\x89\xc3\x75\xac\xbe\xb1\x1d\xd2\x51\x4e\x7c\x36\x74\x91\x01\x82\xdf\x6b\x4b\x1b\x10\x7c\x10\xfc\x0d\x26\xf8\x6a\xfb\x36\xbe\x41\xb3\x49\x10\x7d\xef\xd8\x64\x92\x9d\xa1\x0c\x3b\x13\x3f\x65\x01\xfb\x7d\x4e\xcc\xef\xd3\xcc\x2d\x81\xfd\xff\x6e\x98\xe6\x05\x84\xce\x29\x8a\x9a\x2f\x96\xf9\x07\x56\x5b\xe6\xc2\x28\x5c\xeb\x8d\xa4\xf9\xae\xc0\x02\xd0\x3f\x31\xcc\xbe\x7f\x0b\xdd\xe9\x6c\xcd\x52\x1f\x3f\x1b\x31\x42\x99\x1c\xa5\x6d\xcb\xe6\xae\xc6\x2c\x7e\x31\xaf\x37\x17\x4a\x8d\xdb\x11\x3b\x28\x9e\x6f\xa1\x8c\x10\xea\x62\x55\xbe\x66\x5b\xd0\x21\x57\x1e\x0b\x47\xdb\xa9\xe4\x90\x51\x21\xd7\x7e\x92\x3a\xf1\x33\xbf\xd9\x2e\x2f\xb2\xb1\x21\x55\x73\xfd\x3f\xed\xeb\xe2\xd3\x7e\x32\xf8\xd3\x9e\x64\x47\xc5\x77\xcc\x7b\xd9\x57\xfe\xe8\xf1\xe2\xa2\x90\x2e\x0a\x8b\xa0\x90\x2e\xd2\xa4\x21\x4d\x1a\xd2\xa4\xf5\x52\x9a\x34\x14\xd2\x45\x21\x5d\xa4\xa7\x42\x7a\x2a\xa4\xa7\x42\x7a\xaa\xae\x48\x4f\x95\x9d\xa0\x71\x96\x8a\x8f\x58\x48\x64\xa7\x13\xac\xf0\x7d\xdd\xad\x80\x51\x50\xde\x17\x69\x82\x50\xde\x77\xf3\xd4\x4f\x61\x4f\x27\xe8\x80\xc0\x9e\xf9\xa2\x96\x53\x74\x53\xec\xcd\x3c\xe5\x72\xbe\xa2\x14\xcb\x55\xad\x54\xcc\xc9\x1a\xfb\xcb\x21\xf6\x47\x03\xb4\xd3\xba\xc8\x42\x9b\x37\x8c\x39\xb7\x9c\x2f\xae\x15\xf3\xab\x52\xc9\x05\x39\xad\xf5\xed\x59\xa3\xb9\x25\xbd\xb9\x50\x20\x67\x2a\x79\x98\x5f\x30\x63\xde\x92\xc1\x28\x5d\xbf\x34\x5f\xd4\xaa\xb3\x8a\x3a\x55\x2a\x59\xe8\x32\x3c\x29\xf6\x2d\x44\x2d\x57\x82\xa1\xe4\x69\x76\xd2\xe0\x8e\xb5\x6f\x8e\xe1\x74\x70\x75\xbc\x47\xe2\x8e\x7d\xde\x64\x74\x07\x23\xfe\xf0\xbc\x3e\x0e\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x25\xf0\x65\x87\xf1\x25\x40\x21\x40\x21\x40\x61\x0f\x83\xc2\x5f\x7a\x2d\x9d\xf1\xcf\x22\xd7\x58\xaa\x6e\xf6\xad\x27\xd9\x4f\x0f\x12\x73\xe5\x14\x12\xd8\xf0\x21\xb1\x72\x54\x8d\x39\xcf\x34\x8a\xa6\x16\xd2\xcc\x26\x34\xa8\x9f\xe6\x4c\x26\xe4\x9d\x83\xb5\xcb\x91\x5e\x06\x54\x0b\x54\x0b\xb5\x4b\x41\xb5\x40\xb5\x40\xb5\x7a\x87\x6a\x75\x51\x69\xce\xae\xa1\x5a\xa8\x19\x09\xaa\x05\xaa\x05\xaa\x05\xaa\xb5\x11\x35\x23\x7b\x1a\x42\xa1\xa8\x5d\x2f\x17\xb5\xcb\x6c\x42\x08\x95\x95\xfd\xd3\x20\x66\x85\x46\x6a\x9a\xa6\xb8\x46\xea\x38\x1d\xa3\x23\x8d\x65\x5f\x75\x95\xa5\x98\x2f\x6a\x55\x53\x04\x75\x9f\xb7\x40\x69\x2b\xdb\xc2\xb5\x49\x0d\x46\x6e\x36\x9f\x97\x5b\xe8\xa3\xe2\xcf\x6c\xf7\x24\x65\x3b\xc5\xac\x14\x93\xca\x76\x8e\x6d\xf1\xa7\x0e\x72\xb1\xd6\xea\xa1\xf9\x77\x3b\x12\x64\x20\x61\x61\x8b\x09\x0b\xff\xb1\xc9\x7a\x68\xfe\x2f\x61\x0b\xf5\xd0\xd6\x69\x6c\x5e\x64\x25\x3a\x4b\xd3\x8e\xac\x44\x2d\xb7\x16\x24\xd8\x6c\xaf\x2d\x5a\xc7\x14\x56\x14\xad\x4a\xc9\x6f\x8c\x78\xda\xaa\x3d\x46\x0e\x2a\x47\x42\x2f\xe5\xb2\x65\xb6\x26\xc4\xd1\x3a\xb3\x35\x6d\x9d\xdd\x6e\x03\xd6\x9e\x3c\x86\x00\xbb\x00\xbb\x00\xbb\x00\xbb\xbd\x03\x76\xb1\x7a\x0b\x58\xbd\x75\x0f\xf9\x46\x0e\xd9\x8e\xe4\x90\x85\x83\x01\x0e\x06\x38\x18\xe0\x60\x80\x83\xa1\xa7\x1d\x0c\x48\x25\x8e\x54\xe2\x48\x25\xde\xae\x54\xe2\xf0\xdf\xc1\x7f\xd7\xab\xfe\xbb\x6c\x21\xe4\x2c\xfa\x41\x84\x39\xe9\x8d\x80\x77\xb1\x9d\xe2\x6b\xb6\x2d\x6d\xbb\x3d\x63\x9b\x30\x2f\x0e\x7b\x66\x9c\x86\xf4\x97\x76\x9d\x8a\xeb\xba\xa9\xe1\xb9\x35\xfe\x69\x8c\xfd\xed\x43\xb4\x35\xa7\xa8\xf2\xa5\xb5\x40\x69\xfc\x92\xb8\x2c\xb9\x5b\x3f\x6d\x5a\x51\x65\x67\x85\x5d\xe3\x20\xf4\xf0\xd0\xc3\x43\x0f\x0f\xb7\x09\xdc\x26\x70\x9b\xc0\x6d\xd2\x35\x6e\x93\xee\xf1\x0a\x00\x57\x03\x57\x03\x57\x03\x57\x03\x57\xf7\x34\xae\x06\x4f\x03\x4f\xeb\x51\x9e\xb6\x29\xf5\xf0\xaf\xa6\xd3\x82\x01\x1e\xa5\xc3\x9c\x01\x8e\x53\x8a\x46\x7c\xf5\xa5\x39\x45\x95\x39\xf1\x13\x54\x68\xbe\xa8\x05\x67\x02\x0d\x12\xc1\xcf\x05\xa3\xbe\x41\xf6\xa0\x81\xfa\xe2\x71\x83\xed\x19\x77\xe0\x64\x7b\x14\xff\xec\x36\x1b\x7a\xdd\x61\xaa\xdc\x2d\xbe\xb5\x57\xfc\xa5\xdd\x84\x4b\x00\xa9\x53\x74\x82\x26\x6b\x94\xed\x49\x4a\x34\xda\xb3\x10\x44\x41\xce\xde\xa2\x9c\xfd\x8b\x11\x3a\x2e\xbe\xe9\x83\x34\xc1\xbf\xe9\x11\x6a\xe2\xcd\xa3\x33\x42\xc3\x7e\x8c\x8e\xd8\x1a\xf6\xe6\x5a\x98\x12\xc2\xf5\x49\x3a\xea\x10\xae\x37\xd7\x44\xeb\x46\x85\xcb\xc9\x43\x34\x2a\x9b\xd1\x57\xf0\xc2\x10\xdd\x63\xfa\x0a\x6a\x0b\x0e\xb2\x9f\x1d\x62\x3f\x3e\x60\xdb\xc9\xd5\xc6\xd2\x6d\x5b\xf6\x32\xa4\x54\xdb\xf7\x18\x15\x01\x5d\xb6\x58\x9f\x4f\xba\xdc\xd3\xb0\x21\xc9\xb4\x1b\x49\x74\x7d\xf5\x42\xf0\x2b\x9f\x60\x83\xb5\xaf\xbc\xd5\xf7\xee\x97\x1e\xfe\x14\xf8\x53\x90\x35\x1b\xfe\x14\xf8\x53\xe0\x4f\xe9\x1d\x7f\x0a\xb2\x66\x23\x6b\x36\xfc\x29\xf0\xa7\xc0\x9f\x02\x7f\x4a\x57\xf8\x53\x90\x35\x1b\x59\xb3\x37\x8b\x83\x06\x59\xb3\xdb\x91\x35\xfb\x73\x09\x4a\xfb\xa1\x3c\x97\xf8\xb7\xa2\xe4\xab\xf2\xb5\x0a\xdf\x62\xb0\x77\x27\xd8\x73\x0e\xc6\x77\xbd\x31\xc6\xb7\xa0\xe4\x1f\x35\x9a\x08\x89\xf2\x3d\xe8\x45\xf9\xf2\x8e\xdf\xd9\x1c\xc4\xcf\x37\x67\x54\xe8\x28\xb0\x29\xe2\xf7\x70\x30\xf1\x4b\xb2\x44\x2d\xf1\x73\xf4\x3e\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\x1f\x98\xdf\x46\x32\xbf\xcd\x27\x38\x02\x55\x04\x55\x04\x55\xdc\x44\x54\xf1\x57\x87\x88\xb9\xa9\x62\x45\xc9\x6b\xec\x99\x21\xf6\x6e\x07\x36\x54\x1a\xc6\x86\x21\xe1\xc2\xb8\x03\x17\x2e\x28\xf9\xf9\xa2\x56\x9d\x55\xd4\xa9\x52\xc9\x62\x87\xdd\x5e\x98\x6f\x43\xe4\x81\x67\x83\x39\x60\x9c\xc5\x2c\xfa\xe7\xa2\x7e\x36\x1d\x6c\x88\x39\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x02\x12\x42\x18\x08\x84\x07\x84\x07\x84\xd7\x29\x84\xf7\xf1\x04\x9d\xd4\x87\x4e\x1b\xcb\xc9\xaa\xd1\x8a\xac\x19\x09\x50\x6d\xae\xe7\x3c\x58\x2c\x94\x8b\xe5\x82\x69\xad\xd9\x3f\x0d\xb1\xbf\x19\xa0\xdb\x9d\x67\x5c\x5a\x4b\x47\xdf\x12\x69\x0c\xfb\x4d\xdb\xd7\x2d\x89\x96\x17\xcd\x60\xff\x50\x60\xe0\xb8\x80\x81\x8e\xbb\x5b\x4e\xfb\xfe\xe6\xe6\xd0\x11\x76\x69\xe4\x70\x29\x98\x1f\xce\xb1\x73\x06\x29\xf4\x78\xdb\x0c\x61\xa1\xef\xe0\x40\x66\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\x08\x82\xb8\x21\x04\xf1\x5b\x51\xba\x28\x08\x62\x5d\x01\xa5\x31\xa3\x52\x92\x5f\xb0\x71\x51\x54\x56\x32\xff\xfa\xc6\x31\x8d\x97\x80\x62\x3f\x19\x65\xef\xe9\xf7\x2c\xe4\xff\xa0\x2a\x4b\xf9\x98\x38\xcd\x1c\x00\x7b\x36\x36\x0b\xfa\x8f\xe8\x67\xd5\x95\xf3\xaf\x2b\xe2\x2f\x0a\x4e\x85\x9b\xb1\x35\x2b\xd1\xac\xc0\x73\xa7\xe9\x24\xc7\x73\x47\xe8\x10\x1d\xf0\xcd\x58\xe9\xe8\x33\xe3\x19\x53\x66\xbd\xa9\x20\x28\xb7\xd7\x1b\xca\xbd\x8c\x0d\x14\xe4\x6a\xa3\xb5\xaf\x02\x4a\x5c\xf9\x96\xc6\x8a\x7e\x6b\x9b\xe7\x00\x0d\xa9\x72\xa5\x24\xe5\xe4\xc0\x31\x1a\x33\x4e\xdc\x98\x61\xca\xcc\xd1\x39\x3a\x5b\x93\x58\xb7\xb5\x71\x42\x8e\x5d\xe4\xd8\x6d\x31\xc7\xee\x07\x23\xa1\x19\x8b\x0b\x22\xdd\xee\x0c\x65\xec\x74\xbb\x1b\x60\x79\x2a\xab\x0d\x5b\x9e\xc6\x6d\x8d\xdb\x46\x65\xde\xbd\xc3\xd3\xf2\x8c\x57\x24\x55\xdf\x32\xeb\xdb\x4c\x3e\xc1\x05\x9a\xa0\xd1\x8a\x3e\x99\x75\xde\x00\xed\xae\x6d\x48\xdc\xc8\x7e\xfd\x9f\x93\x7b\x9c\x07\xaf\xc9\x6a\x41\x76\x1e\x1d\x74\x1e\xd5\x97\xbe\x55\xb9\x50\xcc\x8d\xd6\x9d\xe7\x6a\x45\xff\xf7\x0d\xe3\xa8\x7e\x97\x99\x8b\x34\x4f\xd9\x1a\xe3\x37\x49\x47\x5b\xf0\x21\x2d\x70\x36\x0f\x0b\x18\x60\x01\x9f\xeb\xa7\x67\xfb\xd9\x33\xfd\xd1\xa7\x2d\x67\xd5\x9b\xfb\x7b\xc7\x02\xd6\xe0\x0c\xbd\x9f\x39\x9e\xe7\xc8\x4d\x7f\x39\x6d\x27\x5d\xc2\xe7\xc5\x1d\xe6\x9c\x5a\x78\x73\xa4\x12\xbf\xb2\xac\x94\x47\xc5\xd5\xfc\x0c\xee\xcd\xd3\x62\x89\xac\xa6\x94\x17\x84\xb7\xea\x61\xfd\xb3\x30\xfe\xbd\x64\x7e\x2c\xf6\x1f\x87\xfd\x4d\x73\xe6\xa5\x08\xbd\x18\x61\x2f\x44\xa2\x9f\xb0\x56\xe2\xef\x8f\xcc\x2a\xfa\xc6\xb2\xa8\xc5\x0a\x0a\xef\x76\x25\x16\xbf\xac\xff\x29\x1e\x9b\x72\x3d\x05\xdf\x63\x5d\x93\xa5\xb2\x16\x5b\xd5\x6c\x2e\x3f\x2a\xe5\xf8\x83\x73\x6f\x47\xa9\x98\x33\x8a\x31\xcb\xa5\xbc\x16\x53\xae\x1b\x7d\x2a\xbc\x01\x15\x59\xa9\x94\xe4\x54\x4c\xfc\x22\x77\x2f\x9a\x63\xc9\xf7\x3a\x9e\x1d\x60\xfd\x7c\x7c\x0b\xbf\x2d\x97\xab\xac\x73\xeb\xd2\xf6\x9a\xff\xab\xf7\x7b\x4f\x3e\xdb\xd8\xcb\x78\x2f\x50\xf6\x20\x4d\xb0\xf1\x78\xca\x0a\x7c\xdc\xc5\x3f\x2b\xe3\x1b\x37\x9a\x89\x0f\xe8\x7f\x74\x06\x33\x6e\xbe\x70\x49\xf6\xe3\xc3\x34\x2f\x76\x5e\xea\x8a\x94\x4b\x99\x23\xc1\xbf\x9d\x3a\x05\x87\xcf\x16\x4c\x55\x4a\xf2\x8a\x6e\x9c\xcb\x05\x8d\xbd\x94\x60\x5f\x19\xa0\x3b\xf5\xd6\xa6\x9c\x8d\x35\x91\xfc\x69\x51\x29\xc9\x19\xd1\x5e\x48\x02\x8e\x34\xbf\x60\xb1\xf6\x9e\x9c\x99\xa0\x1c\x3f\xba\x39\x14\x1c\x5d\x9a\x09\x2a\x1f\xfc\xe5\x4e\xb1\xd3\xc6\x87\xea\xfb\xce\x19\x1f\xac\x63\x50\xa0\xdc\x80\x72\x03\xca\x0d\x28\x37\xa0\xdc\x80\x72\x03\xca\x0d\x28\x37\xa0\xdc\x80\x72\x03\xca\x0d\x28\x37\xa0\xdc\xd8\x48\xe5\xc6\xe6\x23\x1e\xd0\x86\x40\x1b\x02\x6d\xc8\x26\xd2\x86\xbc\x35\x41\xe3\x82\x50\x6a\xb9\x2b\x72\x7e\xb5\xe4\xd2\x86\x98\x39\xa3\xd4\xa2\xa2\x16\xab\x37\x72\x25\x49\xd3\x64\x8d\x7d\x76\x88\x7d\x72\x80\x5e\x6e\x5f\x71\x69\x2d\x1d\xbd\xd1\x60\x12\x29\xa3\xad\x69\xbd\xad\x50\xd3\x49\x2d\x59\xb7\xb3\x9c\x76\xfd\xca\xe6\x20\x8e\x9d\x8f\x19\x7b\x6d\x30\x4c\x3c\xce\x8e\x19\x30\xb1\xee\xf5\x30\xb3\xcc\x3b\x7b\xda\x85\x11\x91\x67\x0a\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\x11\xac\xb1\x1b\x59\x23\x48\x20\x48\x20\x48\x60\x0f\x93\xc0\x3f\x48\x50\xd2\x88\x12\x53\xf2\xb2\x83\x01\xaa\xab\x65\xfd\x51\x0d\xf8\x67\x04\x82\xb1\x0f\x24\xd8\x9f\xf7\xd1\x56\xfd\xdc\x4b\x6b\xe9\xe8\xfd\x3c\xec\xcb\xbd\xe3\x5c\x14\x17\x72\x32\x94\x7c\x05\x8f\xf8\x52\xf2\xf2\x72\xda\xf9\xf7\x90\x63\xbb\x5e\x43\x67\x04\x46\x3b\x46\x47\x38\x46\x4b\xd3\x18\x8d\xfa\x6b\x68\xf5\x27\x5d\x4b\xa7\x9c\x77\x74\xb3\x51\x5d\x8f\x07\x53\xb5\x83\x6c\xc2\x23\x35\xbb\xa3\xdb\x4d\x81\x9e\xf3\xb6\xa2\x1f\xdd\x66\x77\x77\xdc\x0c\xe2\x5a\xa7\xc7\xef\x35\xe3\xb7\xda\xdc\xe9\x99\x69\x9a\xa2\xd3\x35\xc1\x0a\xcd\xf6\x3a\x22\x14\x10\xa3\xd5\x62\x8c\xd6\xfb\x22\x21\x7c\xf4\x67\x45\x74\xd6\x29\x3a\x61\x47\x67\xb5\xc1\x76\xb4\xcb\x38\x04\x04\x7c\x25\xdf\x72\x87\x6d\x3b\xee\x12\xab\xf6\x98\xe4\x36\x17\xf7\x88\x3f\xb7\xdd\x5a\x3c\x4a\x8b\xb4\xe0\xb4\x16\xc9\x0c\x9d\x69\xc1\xd1\x31\xc3\x6f\xf7\x11\xce\x85\x61\x3e\x02\xcd\xc7\xd7\xfa\xe8\xab\x7d\xec\xcb\x7d\xd1\x2f\x5a\x1d\xf4\xe1\xbe\x47\x9d\xeb\xa0\xa2\xbe\x1c\xe7\x6b\x99\xd8\x8a\x7c\x59\xf8\x44\xac\x0d\x88\x0d\xde\x8d\x3d\x1f\xbf\x45\x87\x79\x28\x2b\xe5\xd1\xb2\x5c\x90\x78\x47\x18\x4b\x21\xa7\x19\x11\x28\xc2\x1a\x02\xe3\x1d\x2c\x5e\xbb\x26\xe7\x75\x43\x55\xba\x61\x3b\x2b\x6c\x40\x5d\x2c\x8d\x18\x2b\x24\xbe\x46\x8c\x15\x54\x7d\xce\xab\xc8\x6a\x51\xc9\x5b\x2b\x3d\x7b\xfa\xe3\x7e\x20\xb3\x37\x56\x35\xfd\x26\x9d\xab\x4b\x49\xbf\xd2\x7c\x20\xe3\x47\x2e\x8b\x4d\xb9\xd9\x44\x4a\xdc\xa7\x88\x0c\xf2\xb8\xc7\x38\xe3\xb7\xb0\xc0\xef\xc0\x63\xe5\x97\xf9\x4c\x1f\xbd\xd4\xc7\x5e\xec\x8b\xbe\x60\x75\xf3\x7b\xfb\x66\x1c\x4e\xce\x4a\x49\x96\x34\xd9\x22\x28\x0b\xaa\x52\x91\x0a\x7c\x00\x16\x94\x52\x31\x77\xc3\xe5\x44\x31\x9f\xc5\xf6\x92\xea\xa3\x94\x4e\x1d\x49\xc5\x96\xc4\x80\x88\xde\xa9\xe8\x0b\x7f\x7d\xf3\x64\xc2\x38\x39\xa6\xa8\x95\x2b\x52\xd9\x74\xea\xa8\xab\xf2\xd8\x65\xa9\x64\xc2\xeb\xb8\x38\x1a\x8f\x5d\x2e\x96\xa5\x52\xf1\x7b\x4d\x0a\xb6\x22\xeb\x2b\x4b\xbe\xd5\x18\x13\x2b\xca\xbc\x4d\x46\x45\xe3\x43\x9a\x7d\x91\xc0\xc5\xa9\xd8\xd9\x22\x7f\x9d\x1d\x37\xae\xa8\xf5\x4f\x66\x6f\xdb\xaa\x82\x56\xf3\x8f\x4d\xa9\x5e\x49\xc5\xef\x10\xf7\x33\x63\x3e\x88\xcb\x3b\x94\x79\xdb\x00\xbd\x65\x80\xfd\xc0\x40\xf4\xbb\x96\x8b\xf0\xf7\xfa\x1f\x37\x70\x92\xfe\x49\xe9\xfb\xa6\x82\xa4\xae\x48\x05\x39\x96\x53\x4a\x25\x99\x1b\x3f\xfb\xbb\x90\xd5\xcb\x8a\x7a\x4d\xef\x0b\xcf\x3b\x7d\xa4\xe6\xc7\xfd\x6f\x94\xbf\xcf\xe6\xcb\x58\x11\x4f\x55\xd4\x5f\x94\x5c\x31\x6f\x73\x61\x8e\x18\x45\xe4\x98\xd9\xbb\xfa\x4e\xca\x00\x70\x26\x44\x4c\x39\xba\xd1\xc4\x4f\xd6\x5e\xc9\x72\x0c\xba\x7f\x2c\x15\x9b\xca\xe9\xdb\x2a\x3e\xa7\x3a\x8d\xc3\x90\x78\x86\xa1\xd8\xa8\x31\xf0\xee\x17\x43\x3b\x1e\x1b\xca\x48\xb9\xa7\xf4\xc9\xa4\x9c\xd7\xcf\xe2\x1e\x39\x7e\x52\x4d\xc7\x09\xe6\x6b\xbc\xfa\xee\x46\xcc\x27\x58\xb1\x5a\x3a\x1e\x1b\x9a\x55\x54\xd9\xd1\x6c\x2c\x27\x69\x39\x29\xaf\x3f\xbd\xd1\x3f\xc2\x07\xcb\xdb\xd3\x84\xf5\xaa\x6b\xf0\xb2\xd5\x46\x2a\xbe\xb3\x52\xfb\xde\x38\xe7\xfa\xe7\x23\x34\x2f\xe6\xfa\xb3\x34\xcd\xe7\xfa\x93\x74\x9c\x8e\xb5\x30\x7d\x88\x90\x61\x5a\xd4\x5b\x9b\x60\x17\x68\x8e\xb6\x89\xbe\x95\xf3\x37\xdb\x66\xd0\x22\x20\xe6\x3d\x57\x6f\x67\x5b\x45\x37\x35\xba\x87\x68\x6c\x69\xe0\x5c\x4c\x64\xbe\x71\x9b\xbd\x0e\xd8\x5f\x17\x8e\xbd\xce\x66\xe2\x6e\x11\x89\xdd\xc6\xc5\x01\x62\xae\x7b\x6d\x49\x82\x98\x6b\xc4\x5c\x6f\x70\xcc\x75\x27\x78\x51\x50\x38\x74\xdb\x36\x85\xd9\x63\x74\x84\x1d\x8a\x1f\xb0\xf4\xc3\xf7\x38\xe3\xac\x9d\xa7\xd6\x07\x5b\x87\x1e\x0a\xfd\xa9\x04\x8d\x98\x95\x28\x7d\x22\x9d\x85\xa4\xcb\x04\x8c\xef\x4a\xb0\xcf\xf4\xd9\x35\x2a\xef\xf1\x00\x8c\x5c\xe6\x96\xbc\x57\x3f\x22\x6a\x49\xda\x01\xc7\xfc\x50\xc8\x70\xf1\x51\x3a\x26\x5e\x96\x09\x1a\xe7\x2f\x4b\x92\x12\x34\xe8\xfb\xb2\xe8\x77\xae\xbf\x2c\x8d\x89\xf1\x02\xa8\xe2\xb9\xe0\x77\xe4\x41\x16\xf7\x2e\xf8\x28\x5e\x0d\x71\x1b\xd1\xb7\x6f\xb3\xfb\x74\xb7\x37\x45\x14\xdd\xba\xc7\x38\xd8\x81\x9e\xcd\x9c\xa0\x49\x3a\x5a\x33\xf5\x36\xdc\xb5\x98\x68\x81\x0e\x5b\x44\x87\xef\x8c\xdc\xcc\x27\x7d\x4a\x30\xc3\x23\x74\xc8\x66\x86\x61\x9a\x84\xc6\xbe\x79\xef\xef\xdc\x25\xc4\x0d\x80\x83\x7f\x7b\xbb\x6d\x12\x6e\x37\xe1\x60\xd9\x30\x03\xbb\xc5\x1f\x3a\x61\x05\x40\x06\x41\x06\x41\x06\x41\x06\x41\x06\x41\x06\x5b\x21\x83\x9d\x64\x79\xe1\x62\xc8\xd0\x67\xfc\x40\xc4\x98\xf9\xf4\x6d\xf6\xa4\xff\x60\x00\x09\x14\x2b\x81\x68\xc5\x2e\xda\xdf\xb6\x85\x00\x28\x60\xaf\x2d\x3f\x40\x01\x41\x01\x37\x98\x02\xb6\x15\xec\x04\xe2\xbf\xb0\x8c\x7e\x76\x82\xc6\x59\x2a\x3e\x62\xe1\xbe\x9d\x4e\xdc\xc7\xcf\xbf\x25\x92\x2a\x7e\x65\x98\xce\x19\x05\x31\x15\x45\xcd\x17\xcb\x4d\xa5\x53\xe4\x8b\x6c\x0b\x32\xbe\x73\x98\xfd\xed\x00\xdd\xee\x6c\x48\x9f\x10\x9f\x35\x4a\x63\x3a\x23\x98\xcb\xe6\xfe\x40\xb9\x1c\xd3\x87\x20\x36\xaf\xb7\x14\x4a\x04\xf3\x88\x1d\x75\xc1\x37\x23\x86\x46\xbf\x58\x95\xaf\xd9\x76\x6e\xc8\x15\xc1\xe3\x68\xdb\x8c\x7f\x9e\x76\x3c\x84\x73\x86\xe6\xf7\x89\xf8\xe7\x66\xbe\xcc\xeb\xe2\xcb\x7c\x55\xf0\x97\x79\x88\x1d\x30\xeb\x65\xd6\xbf\x8c\xc6\xa7\xca\x07\x00\x19\x16\x11\xf5\x8c\xa8\x67\x44\x3d\x23\xea\x19\x51\xcf\x88\x7a\x46\xd4\x33\xa2\x9e\x11\xf5\x8c\xa8\x67\x44\x3d\x23\xea\x79\x23\xa3\x9e\xd7\x45\x26\x7c\xdf\x76\x2b\x20\x13\xc4\x62\x23\x16\x1b\xb1\xd8\x9b\x28\x16\xfb\x1d\x09\x4a\xad\x87\x38\x45\xcd\x4e\xc1\x39\x05\xd0\x64\x7f\x38\xc4\x3e\x37\x40\x77\xd6\x90\x4c\x51\x78\xed\xf5\x8d\xa5\x66\x0c\x0f\x68\x9a\x35\x61\xdc\x48\x92\xdf\x0c\xff\x91\xf9\xa2\x56\x9d\x55\xd4\xa9\x52\xc9\xc2\x94\xe1\x45\x12\xdc\x42\x84\xb2\xa1\x9a\x30\x8d\x55\x73\x6a\x9e\x52\x8a\xa2\x4f\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x40\x95\x48\xd0\x08\x28\x08\x28\x08\x28\xd8\x29\x28\xf8\xc7\x7d\x74\x8f\x91\xa0\xb1\xb6\x02\xf7\x18\xfb\x64\x1f\xfb\x1f\x7d\x44\xf6\x91\x68\xb4\xc0\x23\x4b\x2e\x2b\xea\x35\xab\x1b\xa5\x18\xc7\x40\xc9\xbb\x0a\x72\xf5\xa2\x75\xea\xd4\xc2\xdc\x39\xfd\xcf\xe1\xa9\xf8\xeb\x1a\x9a\xac\x6b\x68\xb2\x91\x86\xb2\x45\xba\x28\xa0\xdb\x39\x3a\xcb\xa1\xdb\x69\x3a\x49\xc7\x5b\x80\x6e\xe6\x33\x06\x21\x37\xf6\x99\x3e\x62\xf5\x69\x30\xd9\xc7\xfa\xd8\x2f\xf4\xd1\x80\xfe\xb7\x75\x7b\xf6\x76\xbd\x67\x95\xbc\x8c\x3e\x75\xf4\xe9\x6f\x0f\xd2\x0e\x33\xf6\xbf\xa2\xe4\x35\xf6\x4b\x83\xec\x43\xfd\x76\xfc\xc9\x03\x62\xd3\xa2\x1a\xcb\x2d\x73\x3e\x36\x85\xb6\x0b\x4a\x3e\xb9\x57\x3f\x45\xc4\x9e\x2c\x28\xf9\xcd\xc6\x8e\x97\xe9\xb8\xe8\xf2\x83\x34\xc1\xbb\x7c\x84\x92\x94\x08\x14\x98\x2f\x28\xf9\xf9\xa2\x16\x8c\x89\xef\xf3\xc6\xc4\x5b\xd9\x16\x41\x88\xcf\x06\x13\xe2\x38\x8b\xd5\x2a\xcc\x17\x94\x3c\x44\xab\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x20\xc1\x1b\x42\x82\x7f\xeb\x09\xb3\x54\xcf\x0a\x97\x80\xfa\xa7\xd4\xbc\xaa\xac\x68\xec\xdd\x4f\xb0\x3f\x79\x88\xb6\xf1\x73\x1b\xc0\x6d\x59\x65\x25\x79\x8f\x7e\x4a\x46\x3f\xec\x8c\x24\xcf\x2a\x2b\x5d\x4e\xda\x32\x60\x54\x60\x54\x19\x30\x2a\x30\x2a\x30\x2a\x30\xaa\x9e\x61\x54\x99\xae\x61\x54\xa1\xdf\x49\xcb\x8c\x2a\x03\x46\x05\x46\x05\x46\x05\x46\x05\x46\xd5\x79\x46\x95\xe9\x69\xa4\x94\x01\x52\x6a\x1f\x52\xca\x74\x3b\x52\xca\x6c\x42\xa4\x94\x7d\x9c\x4e\x08\x85\xd2\x21\x3a\xc0\x15\x4a\xa3\xb4\x9f\x86\x7d\x15\x4a\x9c\x25\xa5\xd6\xd2\xa9\xac\xb2\xd2\x90\x44\xe9\x7c\xb0\x04\xe9\x21\xb6\xcf\x90\x20\xf1\xd6\x0d\x15\x52\x56\x59\x71\xa7\x36\x0e\x10\x3b\xc5\x3f\xbe\xcd\x81\xba\x76\x88\x89\x26\x26\x71\xaa\x15\x15\xff\xd5\x56\xae\x25\x30\xd4\x71\x3a\x46\x47\x6a\xb2\x08\x0f\xd1\x43\x0d\xf5\x27\x52\x06\xa3\x9e\x49\x8b\xf5\x4c\x3e\x1b\xa1\xa3\xe2\x33\x4e\xd3\x18\xff\x8c\x87\xa9\xd1\xd7\x8e\x4e\x8a\x72\x26\x87\xe9\xa0\x5d\xce\xa4\x89\xcb\x4f\x89\xec\xeb\x47\xe8\x90\x23\xfb\x7a\x13\xd7\xb7\x2e\x72\xac\x28\x5a\x95\xc2\xb3\x30\xc9\x8f\x8d\x38\x2c\x88\x51\x16\xd9\x59\x3d\x40\xb9\xcc\xad\xc9\x83\xe2\x88\x61\x4d\xa6\xad\xe3\xed\xb4\x2b\xed\x29\x91\x02\x5e\x0a\x5e\x0a\x5e\x0a\x5e\xda\x3b\xbc\x14\x4b\xac\x80\x25\x56\xf7\x00\x65\x94\xa7\xea\x48\x79\x2a\x70\x7b\x70\x7b\x70\x7b\x70\x7b\x70\xfb\x9e\xe6\xf6\xa8\x52\x88\x2a\x85\xa8\x52\xd8\xae\x2a\x85\x70\x8b\xc1\x2d\xd6\xab\x6e\xb1\x6c\x21\xdc\x9a\x99\x81\xc0\x38\xe9\x0d\x8c\x77\xb1\x9d\xe2\x6b\xb6\x2d\x6d\x88\xf0\x78\x13\x66\x07\x67\x9f\x1f\xa6\x39\x23\xdb\xb0\xac\x1a\x1e\x44\x59\xf3\xce\x36\xec\x3c\xa3\x58\x28\x17\xcb\x05\x73\x95\x66\x96\x54\x7b\xeb\x30\xfb\x6f\x5b\xe8\x4e\xe7\x89\x56\x22\xe2\x5f\x6d\xa4\xae\xda\xb4\x7d\xe5\x92\xf8\x89\x45\x13\x73\x74\x41\xad\x35\x23\xb1\xb1\xe3\xe9\x8c\xc4\xc6\xbe\xb7\xdd\xe5\x92\xf9\xee\x2c\xbd\xf6\xfa\xe0\x0f\xf2\x22\x9b\xaf\xcb\x56\x6c\x66\x39\xae\x7f\x8f\x8d\xef\xd5\x77\x94\x90\xde\x02\xa1\x03\x48\x6f\x01\x57\x18\x5c\x61\x70\x85\xf5\x92\x2b\x0c\xe9\x2d\x90\xde\x02\x2e\x08\xb8\x20\xe0\x82\x80\x0b\xa2\x2b\x5c\x10\xd9\x59\x9a\x61\x99\xf8\x19\x8b\xa0\x3c\xe4\xac\xc9\xe6\xbb\x7f\xab\xaf\xd3\x86\x34\x19\x48\x93\xb1\x49\xe0\x2d\xd2\x64\xb4\x23\x4d\xc6\x6f\xec\xa7\x0b\x82\x6b\xe6\x8b\x5a\x4e\xd1\x8d\x67\x2d\xd4\xf4\x49\x9b\x21\x97\xf3\x15\xa5\x58\xae\x6a\xa5\xa2\x75\xe8\x8d\xec\xef\x92\xec\x7d\xfd\xb4\xd3\x6a\xcc\xc2\x9a\x31\x55\x96\xf2\x35\x9b\xdc\xb3\x46\x13\x4b\x7a\x13\xc9\xfd\xfa\x19\x33\xe6\x85\x06\x31\xb4\x85\xc2\xae\x93\xc3\x95\x0c\x67\x2f\xfb\xc2\x38\xba\x20\xb8\xdf\x0c\x65\x38\xf7\x3b\x41\x93\x74\xd4\x57\xac\x6d\xf7\xa1\xf1\xd8\x29\xd7\x5d\x9b\x64\x6f\x25\x18\xdc\x9d\x66\x27\x05\x8c\x73\x35\x50\x5f\x7a\xcc\x80\x79\xb5\x83\x47\x57\xf7\x7a\xd3\xc3\x97\xb1\x81\x82\x5c\xa5\xe8\x5b\xb6\x7b\x0d\xd2\x3e\x55\xae\x94\xa4\x9c\xbc\xee\x38\xa5\x8c\x93\x36\x64\xa8\x32\x17\x69\x9e\xb2\x35\x51\x23\x37\x31\x24\x50\x39\x22\x90\xa4\xc5\x40\x92\x5f\x8c\x08\xa7\x40\x9a\x3b\x05\xac\x70\x90\x9b\xb2\x10\x9d\xb5\x43\xfe\x36\xa2\xb2\x5a\xa5\x4e\x98\xa9\xe4\x87\xef\xf0\xb2\x43\x77\x1b\xda\x04\xa9\x5c\x63\x7b\x46\xc5\x81\x8d\x31\x3d\xed\x09\x2c\x81\x01\x0a\x30\x40\x10\x37\x77\x44\xdc\x0c\x55\x1b\x54\x6d\x50\xb5\xb5\x4b\xd5\x96\x7d\x3e\x12\xb2\xb4\x67\x51\xc4\x92\x5e\xa0\x39\x47\x2c\x69\x9b\xe5\x42\x31\xef\x05\xc3\x76\xb6\x55\x74\x53\xa3\x6b\x06\xbf\xe5\x40\x43\x6b\x89\xcc\x7f\xdd\xe1\xb5\x66\x18\xa9\x48\x6a\xb5\xc8\xbd\x9e\x62\x8b\xbc\xee\x26\x66\xa4\xa2\x6f\x85\x3b\xbe\x8e\xd8\x5d\xdb\xd0\x28\xbf\x8f\xfd\xbc\x56\xcd\x1e\xe7\xc1\x6b\xb2\x5a\x90\x9d\x47\x07\x9d\x47\xb5\xaa\x2a\x55\xe5\x42\x31\x37\x5a\x77\x9e\xab\x15\xfd\xdf\x37\x8c\xa3\xfa\x5d\x36\xbb\x7d\x5a\xe7\x95\x59\xe0\x02\x01\xac\x5e\x02\x56\x2f\xcf\xf5\xd3\xb3\xfd\xec\x99\xfe\xe8\xd3\xd6\x14\xf0\xe6\xfe\xde\xd9\x3e\xd5\xf8\x54\xf4\x7e\xe6\x1a\x01\xee\xf7\xd3\x5f\x4e\x5b\x29\x94\xf0\x79\x71\x87\xf9\x4c\x26\x24\x25\x52\x89\x5f\xa9\x2f\xd9\xc4\xd5\xfc\x0c\xbe\x7c\xd2\x62\x89\xac\xa6\x94\x17\x84\x64\xe6\x61\xfd\xb3\x30\xfe\xbd\x64\x7e\x2c\xf6\x1f\x87\xfd\xf7\x75\x99\x97\x22\xf4\x62\x84\xbd\x10\x89\x7e\xc2\xc2\x78\xef\x8f\xcc\x2a\x6a\x8e\xaf\xec\x0a\x0a\xef\x76\x25\x16\xbf\xac\xff\x29\x1e\x9b\x72\x3d\x05\x07\xb4\x62\x11\xb6\xaa\xd9\xe2\x80\x51\x29\xc7\x1f\x9c\x4b\x2e\x4a\xc5\x9c\x31\xc9\xca\xa5\xbc\x16\x53\xae\x1b\x7d\x2a\x24\x09\x15\x59\xa9\x94\xe4\x54\x4c\xfc\x22\xd7\x38\x99\x63\xc9\x41\xa9\x67\x07\x58\x3f\x1f\xdf\xc2\x6f\xcb\xa5\xd7\xb9\x1c\xea\xe6\xf1\x26\x74\x6b\x15\xa1\x5b\xeb\xc0\x1c\x91\x9d\xa4\xa3\xec\x70\xfc\xa0\xe5\x20\xb9\xd7\xe9\x20\x71\x5d\x5c\xef\x14\xd9\x84\xf2\xd4\xff\x70\x1b\x1d\x16\x18\xd7\x1c\x0f\xfe\x19\xd9\x28\x77\x4c\x93\x4b\x97\xb5\x55\xfe\x20\x52\x4e\x37\x57\xaa\xbc\x56\x94\xaf\x6b\xec\x77\x28\xfe\xc9\x2d\x74\x87\xeb\xba\x4b\x6b\xe9\x68\xcc\x4a\x0b\xb3\x24\x97\x2e\x2f\x89\x4b\xa7\xf8\xa5\x8b\xfc\xd2\xe4\x88\x38\x63\xca\x79\xe5\x72\xda\xe7\xec\x90\xf7\xe2\x8f\xd3\x63\xb4\x54\x33\x8f\x4d\xd3\x94\xef\x4b\xed\xee\x16\x7d\xc5\xe3\x7d\x9b\xd9\xa7\xfb\xe8\x51\xf1\xb5\x3c\x4c\x17\xf8\xd7\xa2\xaf\xd7\x6e\xbe\x61\xfa\x1e\xc1\x8a\x16\x69\xc1\x66\x45\x21\x35\xfd\x6a\xb1\x14\x5c\xa2\x57\x3a\x96\x82\x21\xb5\x7d\xb3\x29\x47\x9e\x0a\xfe\xd8\xcf\xb3\x59\xe3\x63\xf7\x7a\x79\x8d\x0f\xde\xef\xfe\x5c\xc2\x72\xac\x46\xd6\x5f\x8d\x64\x01\x73\x7d\x60\x6e\xe8\x16\xf9\xe9\x01\x8a\x99\xf5\x1c\x73\xca\xb5\x8a\x52\xd6\xf7\x8d\x7c\x9b\x65\x7b\xcb\xbe\x7f\x80\xfd\x55\x9f\x5d\xe3\x31\xee\xe1\x23\x9b\x36\xaf\x15\x5b\xb4\xe4\xbd\xfa\x39\xa2\xc8\x63\xcd\xa1\x90\x7d\x62\xaf\xa5\x69\x61\x07\xf5\xd5\x82\x6e\x07\x0f\xd2\x04\x8d\x07\xd6\x63\xac\xb9\xa9\x40\xfb\xb1\xbe\x9f\xea\xea\x2b\x83\xcd\x47\x8a\x8d\xd4\x96\x65\xac\xbd\x09\x97\x91\x38\x41\x93\xec\x68\xfc\xb0\x35\xbd\xef\x76\x69\x27\xdc\x57\xb6\x5f\x31\xc1\xbe\xda\x47\x77\xd5\x17\x53\x5d\x4b\x8f\xb1\x4f\xf5\xb1\xdf\xe8\xa3\xad\xfa\x9f\xf5\xb7\xe3\xee\x82\x5c\x75\x6b\xa4\x84\xd7\x58\x54\xaa\x55\xf2\xf2\x72\x7a\x6a\x61\xce\x14\xe3\x86\xf8\x3a\x84\x56\x55\xb5\x42\x8f\x89\x57\x4a\xdf\x85\xea\xaf\xd4\x2c\xcd\x50\xa6\xb5\xaa\xaa\xe6\x73\x36\x92\x59\x8f\x7d\x28\x41\x93\xa2\x8f\xd5\x15\x29\x97\xf2\x59\x23\xb9\x62\x78\x4a\xab\x5a\x55\xb7\xdb\x25\x59\x63\x7f\x33\xc4\xbe\x3e\x40\xf7\xea\xd7\x4e\xd5\x2c\x93\x04\x7b\xb8\x6e\x48\xc3\xca\xf9\xe2\x5a\x31\xbf\x2a\x95\x5c\xd1\x3b\x96\x0c\x73\x5a\x34\xba\xa8\xe8\xeb\xfb\x10\xe2\x74\x52\xc9\x11\x7e\xc1\x62\xed\x8d\x99\xe1\x36\xf6\xef\xe9\xdd\x84\x20\x9b\x7a\xf3\xb3\xcf\xdb\xfc\xec\x60\xc4\x6f\x4c\xd4\x86\x2d\x06\x1b\xa1\x59\x36\x63\x18\x21\xdf\x37\xcc\xb4\x4d\xf6\xa0\x78\xec\x5b\x10\x60\x83\x00\x1b\x04\xd8\x20\xc0\x06\x01\x36\x08\xb0\x41\x80\x0d\x02\x6c\x10\x60\x83\x00\x1b\x04\xd8\x20\xc0\x06\x01\x36\x9d\x0d\xb0\x41\x60\x0c\x02\x63\x10\x18\xd3\xc3\x81\x31\x7f\x9e\xa0\x94\xc9\xef\x7d\x22\x60\xf4\x0f\xce\x19\xfb\xf2\xd1\x04\xfb\x7d\x07\xcd\x8f\x7a\xd0\xfc\x25\x71\x49\x72\xb7\x4d\xf1\x6d\xcd\x91\x71\x30\x64\x8e\xbf\x4c\xc7\x05\x55\x3b\x48\x13\x9c\xaa\x8d\x50\x92\x12\x81\x1c\xdf\xb8\x99\x9b\xe5\xf7\x73\xc1\xe8\x6c\x90\x3d\x68\xba\xf8\xc4\x4f\x3a\x69\xbd\x4d\xf6\xa3\x3f\xb6\xcd\xee\xdb\xbd\xde\x81\x2a\x66\xf7\xde\x67\x1c\xee\x48\x0f\x67\x4e\xd1\x09\x9a\xac\xf1\x45\x37\xd1\xc5\xd0\x50\x21\x04\xa5\x45\xaf\xe5\x7f\x8e\xdc\xdc\xc7\x7d\x46\x68\x12\x8e\xd1\x11\x5b\x93\xd0\x29\xf3\xc0\x43\x4c\x1a\x33\x0f\xb5\xee\x3d\x2f\x43\x91\xfc\xd6\xed\xb6\x79\xb8\xc3\x8c\x1f\xb1\x2c\xc2\x5e\xf1\x97\xce\x18\x04\x04\x8a\x20\x50\x04\x81\x22\x08\x14\x41\xa0\x08\x02\x45\x7a\x33\x50\x24\xbc\x79\x3d\x38\xe6\x24\xf3\x85\xdb\xec\x99\x7f\x30\x20\x0a\xc4\x5c\x0f\xec\xe1\x5a\xe4\xb6\x2f\x07\x10\xef\xd1\x6b\x8b\x10\xc4\x7b\x20\xde\x63\x83\xe3\x3d\xda\x4c\x7c\x02\xe3\x3b\xc2\x33\xfe\xd9\x83\x34\xc1\xc6\xe3\x29\x4b\xab\xb9\xcb\xa9\xd5\x34\xae\xb8\x25\x02\x38\xde\xf5\x24\x1d\x14\x0a\x45\xa1\xe4\x72\xe8\x40\xfd\xf2\xef\xf0\xf3\xd8\x97\x9e\x60\xff\xf7\x21\xda\x2e\xfe\x4b\x9f\x01\xf7\x09\x9f\xb4\x6a\x78\xd3\xcc\xf5\xb2\x99\x39\x9c\xcb\xe2\x92\xbb\xf5\x93\xf8\x3f\x35\xe7\xfc\xc7\xff\xd2\xe5\x32\xc1\x0c\x24\x72\x90\xc8\xa1\x1c\x2b\x24\x72\x90\xc8\x41\x22\xd7\x3b\x12\xb9\x2e\xaa\x36\xda\x35\x12\x39\x94\xc1\x84\x44\x0e\x12\x39\x48\xe4\x20\x91\xdb\x88\x32\x98\x3d\xad\x68\x43\x9d\xbe\x5e\xae\xd3\x97\xd9\x84\x8a\xb6\xec\xab\xe9\xb4\xc0\x82\x47\xe9\x30\xc7\x82\xe3\x94\xa2\x11\x5f\x2c\x68\x70\xa8\xb5\x74\x8a\x53\xa1\x46\xe2\x6c\xd7\x49\x06\x21\x02\x29\x17\x83\xc9\xe0\x18\x1b\x35\xc8\xa0\x0b\x84\x99\x69\x5f\x78\x50\xa7\x13\x11\xc6\xff\x60\x9b\x93\x7e\xdd\x6e\x66\x2d\x29\x1b\xa4\x6b\xaf\xf8\x43\xbb\x59\x57\x6b\x4a\xb0\x9a\x3e\x86\x77\x05\x4a\xb0\x16\x95\x60\x5f\x8c\xb4\x20\xe6\xaa\x79\xfd\x68\x4a\x78\x8a\x27\xe9\xa8\xc3\x53\xdc\x5c\x13\xbe\xf9\x8b\x9b\x72\x49\xd4\xb4\xda\x68\xae\x99\x36\x98\x97\xe4\x6f\x8e\x38\xcd\x4b\xd4\x50\x0d\x38\x24\x18\xca\x65\xc3\xd2\x0c\x89\x63\xa6\xa5\x99\xb6\x4e\x69\xaf\xcd\x69\x8f\xd8\x0c\x7c\x15\x7c\x15\x7c\x15\x7c\xb5\x77\xf8\x2a\xd6\x5e\x01\x6b\xaf\xee\x01\xd0\x10\xfa\x76\x44\xe8\x0b\xce\x0f\xce\x0f\xce\x0f\xce\x0f\xce\xdf\xd3\x9c\x1f\xf1\x1e\x88\xf7\x40\xbc\x47\xbb\xe2\x3d\xe0\x46\x83\x1b\xad\x57\xdd\x68\xd9\x42\xc8\xa1\x4e\x41\xfe\xa9\xa4\x37\x40\xde\xc5\x76\x8a\xaf\xd9\xb6\xb4\x6d\x81\xc9\x9b\x51\x98\xfe\xc3\x09\x53\x98\x5e\x96\xab\xd7\x15\xf5\x29\x7d\xab\xe6\x99\x32\xb7\x58\x2e\xa8\xb2\xa6\xe5\x4a\x92\xa6\xc9\x1a\xfb\xf2\x10\xfb\xec\x00\x31\xfb\x2a\x2b\x5b\xee\x1b\x1a\xcb\x96\x3b\x27\xda\x9b\xd6\xdb\x0b\x29\x5d\xee\x20\xbf\xe0\xa2\x75\x4b\x46\x9e\x5c\xe7\x2f\x21\x51\xae\xf7\xa7\xd3\x4c\x31\x48\x67\x7f\xfa\xd6\x82\xac\x7b\x9d\xa8\xa1\x64\xbc\xc8\x90\x0b\xf9\x3f\x32\xe4\xc2\x3d\x05\xf7\x14\xdc\x53\x3d\xe4\x9e\x42\x86\x5c\x64\xc8\x85\x5b\x00\x6e\x01\xb8\x05\xe0\x16\xe8\x0a\xb7\x00\x32\xe4\x22\x43\xee\x66\x01\xa1\xc8\x90\xdb\x8e\x0c\xb9\xdf\x18\xa2\x61\xcf\xc2\x65\x02\x07\xaa\xab\x65\xfd\x81\x4d\x1c\xf8\xcb\x43\xec\xc3\x03\x76\x31\xb3\x06\x19\xe0\xa2\x68\x24\x4c\x06\xb8\x5b\x30\x40\x5e\x2f\xcd\xd9\x3c\xc0\xdf\x4d\x54\xc8\x7a\x3c\x98\x0e\x1e\x64\x13\x1e\x89\x7d\x1d\xaf\x8e\x81\xcd\x9d\x63\x02\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\x07\xda\xd7\x31\xda\xf7\xab\x09\x93\xf6\x69\x55\x45\x95\x0a\x4e\xe0\x97\xd3\x8a\x79\xb5\xa8\x0f\xa0\x59\x0a\xeb\x1d\x09\xf6\xe7\x7d\x44\xc6\xa9\x97\xd6\xd2\xd1\x3d\x1e\xd5\xb0\xa6\x97\xe6\x66\xf8\x75\xc9\x57\xe8\x47\x97\xc4\xd9\xcb\x69\xeb\xef\x21\x97\xc2\x7a\x8d\xc8\x91\x30\xce\x73\x24\xf4\x3d\x72\x81\xa5\x69\x8c\x46\x7d\xb3\x10\x98\x0f\xba\x96\x4e\x59\x77\x14\x88\xcb\x1a\x23\x61\x06\xfd\x72\x77\xa5\x59\x20\xde\xfa\x2d\x57\x1e\xfc\xf5\x0b\x6d\x45\x3f\xba\xcd\xd5\xdd\xf7\x7b\x17\xc8\xb2\x7b\xfc\x5e\xe3\x84\x76\x77\x7a\x66\x9a\xa6\xe8\x74\x4d\x4e\x94\x66\x7b\x1d\xc1\xb9\x48\x8c\xd2\x62\x62\x94\xf7\x45\x42\xf8\xe8\xcf\x8a\xd4\x2a\xa7\xe8\x84\x9d\x5a\xa5\x0d\xb6\x23\xa0\x58\x56\xbb\x4c\x4b\xf2\x2f\x6e\x77\xd9\x0e\x66\x55\xcf\xb2\xcd\xc5\x3d\xe2\x6f\x6d\xb7\x16\x28\x9d\x85\xd2\x59\xb7\x6e\x44\x3d\x42\x29\x11\x4a\x89\x50\xca\xb6\x95\xce\xfa\x89\x08\xcd\x8a\x14\x66\xa7\xe9\xa4\x23\x85\x59\x88\x53\xf5\xcd\x2f\x26\xcc\xc9\x3e\xb0\xae\x55\xdb\xe6\xfb\xcc\x37\x6e\x73\xcd\xf7\x89\x80\x9a\x59\xf6\x2a\xe0\x6e\x5e\xe1\xa5\x9d\x8b\x00\x14\xcc\xea\xb5\xa5\x07\x0a\x66\xa1\x60\xd6\x06\x17\xcc\xea\x04\x17\x0a\xac\x9a\xd5\x2e\x6b\x9f\x3d\x4c\x07\xd9\x44\x7c\xdc\x0a\x3a\xbe\xcb\x59\x43\xcb\xba\xa6\xbe\x8a\x56\xe8\xa1\xc4\xdf\x1d\xa4\x57\x98\x25\xf5\xcd\xb5\xcc\xeb\x57\x95\xaa\xa4\xb1\xaf\x0d\xb2\x2f\xf4\xdb\x55\x1c\xf7\xaf\x5f\xc3\xca\xd4\x7f\xbc\x52\xbf\x38\x39\xa4\x9f\x2c\x2a\x39\xba\x0e\xcc\x2a\xea\x54\xa9\x64\x25\xdf\xd4\xba\x5d\xdc\xf7\x3a\x81\x19\xc6\x39\x66\xd0\xdf\xc2\xc3\x74\x90\x26\x02\xcb\xb6\xb9\x9e\xb9\xa1\x2c\xcd\x8f\x04\xbf\x69\x23\x2c\x59\x5b\x9f\xcd\xf5\x3b\x6e\x34\x19\x90\xf6\x19\x22\x3e\x88\xf8\x20\xe2\x83\x88\x0f\x22\x3e\x88\xf8\x20\xe2\x83\x88\x0f\x22\x3e\x88\xf8\x20\xe2\x83\x88\x0f\x22\x3e\x88\xf8\x20\xe2\x83\x88\x0f\x22\xbe\x4e\x89\xf8\xde\x3b\x4c\xe3\x26\x81\x13\x51\xba\x3e\xc5\xe5\x2b\x4a\xde\xd2\xf2\x7d\x23\xc1\x5e\x1c\xb0\xd9\xdc\xcf\x44\x8c\x1e\x77\xc4\xeb\x96\x4d\x1b\x66\x12\xba\x05\x25\x1f\x4a\xb8\xee\x88\xbd\x56\xe1\xeb\x31\x63\x66\xd3\x97\x3b\xf6\x22\x6c\xc8\xb5\xee\x75\xb4\x9d\x4a\xde\xc3\x7f\x4e\xc0\x41\xbb\x0c\xcf\x82\x92\xef\x76\x18\xf8\x94\xbf\x07\x32\xf4\x10\x60\x93\x0b\x9e\x0d\xe6\x82\x71\x16\xab\xe5\x82\x0b\x4a\xde\x4d\x03\xfd\x49\x37\x7f\x3e\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\x40\xe0\xc0\x4e\xe3\xc0\x71\x4a\xb1\x91\x78\xd2\x12\x06\xdd\xee\x14\x06\x2d\x28\xf9\x7a\x49\xd0\xe6\xab\x5f\x00\x44\x09\x44\x09\x44\xb9\x89\x10\xe5\x77\xfb\xe8\x7e\x11\x67\xac\xdb\x12\x31\x9f\x71\xe2\x62\x87\x1b\xb3\x2f\xf6\xb1\x2f\xf4\xd1\x4e\xf7\x09\x97\xd6\xd2\xd1\xbb\x0b\x72\xd5\xbd\x02\x10\xcf\x91\xbc\xbf\x20\x57\xa7\x5c\xa7\x2f\xa7\xa7\x16\xe6\xcc\x4d\x67\x78\xda\xc0\xc9\xba\x86\x26\xeb\x1a\x9a\x6c\xa4\xa1\x6c\xc5\x9f\x00\x3e\x26\x08\xe0\x45\x9a\xe7\x04\x70\x96\x66\x28\xd3\x02\x01\x74\x74\xc0\x7c\x51\x33\x31\x20\xfb\xb7\xc3\x74\x48\x8c\xc0\x0a\x47\xc4\x6b\x69\x3f\x4a\x9c\x53\x95\xf2\x55\x65\xc5\x22\xc5\x9f\x4d\xb0\x3f\xec\xa3\x6d\xfc\x32\x5e\x2d\xdd\x2b\xe6\x5b\x55\xca\x59\x65\x25\xc9\xe3\xc1\x33\xfa\x99\x4e\x32\x6b\x1c\x0d\x39\xee\xfb\x71\xff\xae\x3c\x21\xba\xf2\x10\x1d\xe0\x5d\x39\x4a\xfb\x69\xd8\x57\x72\xc9\x1f\x8c\xcb\x7e\xc5\x6d\x06\xc7\x6d\x16\xe4\x2a\x5d\x9d\x0f\xe6\xaa\xc3\x6c\xc8\xd0\xf0\x8a\x96\xc9\x23\x55\x22\xff\x75\x8a\xfe\xe4\x36\x47\x0f\xef\xf5\x09\xf3\x36\x3a\xd9\x8c\x02\xef\x4c\x3f\x67\x4e\xd3\x49\x3a\x5e\x13\x3b\xd1\x4c\x7f\x22\x58\x02\x61\xde\x2d\x86\x79\xff\x68\xe4\xe6\x3e\x65\x9a\x12\x21\xde\x93\x74\xd4\x0e\xf1\x6e\xb2\x89\x9b\x0c\xef\x6e\xcc\x4c\xb8\x8c\x81\xbf\xcd\x48\xfe\xe3\xed\x0e\x33\x71\x87\x1d\xd1\x6d\x58\x86\xfb\xc4\x5f\x3a\x64\x18\x10\xd5\x8d\xa8\x6e\x44\x75\x23\xaa\x1b\x51\xdd\x88\xea\x6e\x3a\xaa\xfb\xf9\x48\xc8\x55\x42\x17\x45\x8c\xf8\x05\x9a\x73\xc4\x88\xb7\xb9\xf2\x68\xa8\x93\x7b\x70\xec\x78\xe6\xcb\xb7\x39\xa6\xff\xc1\xa0\x00\x6f\x63\x51\xb0\x97\x87\x22\xb6\x7f\x4d\x80\x20\xef\x5e\x5b\x89\x20\xc8\x1b\x41\xde\x1b\x1c\xe4\xfd\xf8\x4d\x6e\x10\x6f\x3a\xc0\x3b\xd4\x29\x20\x7b\x90\x26\xd8\x78\x3c\x65\xb9\x62\x76\xb9\xa2\xba\xc5\x15\xb7\x82\x03\x87\xfd\xa1\x51\x80\x3a\x50\xb3\xaa\xc9\xea\x5a\x31\x27\x4b\xb9\x9c\xb2\x5a\xae\x6a\xec\xe9\x04\xfb\x45\x87\x6e\xf5\x7b\x1b\xab\x38\xb3\x24\x5a\x99\x12\xad\x84\x54\x73\x66\xc8\x53\x86\xea\xfe\x29\xd4\x9f\xb9\x89\xfa\x33\x0b\xc1\xdf\xd6\x28\xdb\x5f\x2b\x5d\x75\x0f\x80\xfb\xfb\x82\x48\x15\x22\x55\x88\x54\x21\x52\x85\x48\x15\x22\x55\x88\x54\x21\x52\x85\x48\x15\x22\x55\x88\x54\x21\x52\x85\x48\xb5\xb3\x22\xd5\xcd\x47\x2c\x20\x39\x85\xe4\x14\x92\xd3\x4d\x24\x39\xfd\x1f\x09\x1a\x6d\x86\x30\x6a\xec\x87\x12\xec\x27\x1c\x68\x51\x6b\x0a\x2d\x86\xc4\x14\x63\xeb\x31\x45\xc0\xc4\x9b\x80\x89\x73\xc1\x30\x71\x90\x3d\xe8\xa1\xd0\xac\x05\x8b\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xa0\x88\xb7\x10\x45\xfc\xc1\x7e\xda\x67\x04\xae\x57\x8a\xf2\x1b\xaa\x72\x99\x8f\x96\x1d\xb7\xbe\x22\x57\xa5\xf4\x18\xfb\xe3\x3e\xf6\x95\x3e\xba\xcb\x75\xd2\x25\xe3\xa8\x7f\x00\xfb\xbe\x82\x5c\x9d\x72\x5e\xb2\x2c\xae\xe8\xfa\x20\xf6\xf6\xc4\xaa\x07\x81\x3e\xf6\xf7\x7d\xb4\x47\x8c\x86\x40\x69\x75\xc3\xf0\xf9\x3e\xf6\xd9\x3e\xfa\x67\xe2\x68\x70\xff\xef\x29\xc8\x55\x8e\x18\xd1\xf1\xeb\x77\xfc\x3f\x24\xe8\xb0\xe8\xf8\xb2\x5c\xbd\xae\xa8\x4f\xe9\xdb\x22\x3b\x77\x83\xe0\xeb\xc5\x72\x41\x95\x35\x2d\x57\x92\x34\x4d\xb6\xd2\x07\xfc\x4a\x82\x7d\x6b\x80\x5e\x6e\x5f\x77\x69\x2d\x1d\xfd\x6f\x8d\xa4\x9b\x9d\x13\xed\x4d\xeb\xed\x75\x45\xde\xd9\xbd\xfc\xe7\x2e\x5a\x4f\xb2\x9c\x76\xde\x22\xc8\x7c\x33\xf2\x79\x91\x35\xf6\xea\x93\xc1\x54\x7e\x92\x1d\x35\x48\x7c\xdd\xbb\x67\x80\x79\xe7\x28\x40\xef\x0b\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\x0f\x52\xbf\x91\xa4\xfe\x18\x1d\x61\x87\xe2\x07\x2c\x52\x7f\x8f\x33\xae\xd9\xb9\x7d\x6b\x7f\xc1\x6a\x20\x78\x20\x78\x20\xf8\x4d\x84\xe0\xdf\x99\xa4\x87\x05\x7b\x14\x79\x88\x2c\xda\x1b\x54\xeb\x2a\x5f\xd4\xd4\x55\xbe\xb3\x5f\x59\xcd\x17\xe4\xaa\x85\x24\x7f\x7d\x98\xbd\x63\x0b\xfd\x33\xd1\x9c\x45\x89\x3f\xd6\x60\x09\xac\x19\xab\xd9\x0c\x6f\xb6\x2b\xd0\xa4\xe8\x0c\x91\x66\xc9\x60\xd9\xae\xca\x58\xb5\x37\x0d\x58\x59\x0f\x2b\x5f\x1b\xcc\x22\x8f\xb3\x63\x06\x8b\x14\x2f\x8f\x5d\x2d\xab\xb6\x83\x9d\x1c\x92\x0f\x07\x4a\x68\x81\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x82\x56\x76\x1d\xad\x3c\x43\xa7\xd8\x89\xf8\xa4\x45\x2b\xef\xaf\x29\xa1\x55\xbb\xd7\xbb\x15\x32\x32\x02\x8b\x02\x8b\x02\x8b\x6e\x22\x2c\xfa\xa6\x61\x91\xdf\x40\x1b\xd3\xaa\x8a\x2a\x15\x64\x87\x1e\xd3\xf8\x4b\x8d\x12\xf3\xa5\x04\xfb\x76\x1f\x91\x71\xf0\xd2\x5a\x3a\x7a\xbf\x47\x29\xa7\x25\x71\x98\x7b\x63\x92\xf7\xea\x27\x18\x7f\x59\x4e\x3b\x0f\x85\x5c\xcc\xe9\xb5\x34\x2d\x78\xdf\x09\x9a\xe4\xbc\xef\x20\x4d\xd0\xb8\x6f\x1e\x5f\xf3\x91\x79\xaa\x76\xfb\xa6\x6e\xa2\x58\x0b\xaf\xe9\xf4\xea\x60\x02\x78\x84\x1d\x32\x08\xa0\xbb\xdb\xcd\x1c\x01\xce\xbb\x71\x4a\x11\xa3\x2f\x6e\x73\x75\x7d\xdc\xbb\xc6\x93\xab\xf7\xf7\x18\xe7\x74\x60\x00\x32\x5c\x49\x5c\x93\x3c\xbd\x85\x11\x40\xd2\x74\x14\x7b\x6a\xb1\xd8\xd3\xfb\x23\xe1\xd8\x80\xf3\xa2\xe6\xd3\x14\x9d\xb6\x6b\x3e\x75\xda\x9a\xf0\xd2\x4f\x6d\xb4\x26\xc9\x7f\xbc\xdd\x65\x4d\xee\xb2\x4a\x41\xb9\x0c\xc8\x6e\xf1\xe7\x4e\xd8\x0f\x14\x83\x42\x31\x28\x14\x83\x42\x31\x28\x14\x83\x42\x31\xa8\xa6\x8b\x41\x3d\x13\xd2\xd4\x3f\x27\x6a\x40\x65\xe8\x8c\xa3\x06\x54\x7b\xe6\xfe\x36\x4e\xee\x0d\x14\x82\xfa\xd6\x6d\xae\xe9\x7f\x7f\x40\x29\x28\xd7\xa2\x20\xca\x2b\x97\xb4\x79\x4d\x80\x62\x50\xbd\xb6\x12\x41\x31\x28\x14\x83\xda\xe0\x62\x50\x1d\x82\x48\x81\x35\xa1\xda\x38\x37\xac\xaf\xa4\x76\x5e\xd6\x7e\x25\x35\xfb\xa7\x27\x29\xe5\x83\x20\x85\x42\x73\x4d\x29\xad\x5e\x93\xa5\x6a\x55\xca\x5d\xb9\xa6\x2f\x0d\xd8\x6f\x3e\xc9\x7e\x7e\x90\x6e\xb7\xe7\x2e\xa1\xbd\x4c\x09\x5f\xba\x6a\x78\x01\xcd\x05\xaf\xa9\xba\x5c\xe6\xed\x4c\x59\xed\x24\xe3\xfa\xf9\xd6\x14\xc6\xdb\xa8\x3d\xa7\xcb\x15\x8e\x19\x88\xfd\x20\xf6\xcb\x40\xec\x07\xb1\x1f\xc4\x7e\x10\xfb\xf5\x8c\xd8\x2f\xd3\x35\x62\xbf\xd0\xef\xa4\x65\xb1\x5f\x06\x62\x3f\x88\xfd\x20\xf6\x83\xd8\x0f\x62\xbf\xce\x8b\xfd\x32\x3d\xad\x7b\xcb\x40\xf7\xd6\x3e\xdd\x5b\xa6\xdb\x75\x6f\x99\x4d\xa8\x7b\x6b\x32\x32\xd4\x01\xf9\x38\x25\x4a\xd5\x62\xa2\x46\xd2\x1f\x5e\xbd\xcf\x9b\xf8\x6d\x65\x5b\x44\x6d\x99\x5c\x30\xf0\x3b\xc3\x4e\xad\x07\xfc\x6a\x6f\xab\x3e\x7c\x34\xfe\xc2\xf6\x7a\x6e\x76\xaf\x98\x9e\x62\x52\x3d\x22\x7b\x50\x1c\xea\x10\x24\x13\x4c\xeb\x11\x7a\x98\x2e\xd4\x38\x5d\x8e\xd3\xb1\x96\x07\x07\x5e\x17\xa8\xc9\x5a\x54\x93\xfd\xfb\x3e\x9a\x17\x76\xe2\x2c\x4d\x73\x3b\x71\x92\x6e\xe6\x55\xa4\x57\x0a\x59\x59\x96\xce\xdb\xb2\xb2\x9b\x6c\x72\x51\xb8\xab\x2f\xd0\x9c\xc3\x5d\x7d\x93\x6d\x06\x99\xb2\x4e\x98\xaa\x75\xec\x65\x45\xd1\xaa\x94\xfc\xe6\x48\xbd\x29\x7b\xc8\x10\x27\x38\x94\x1e\xca\xe5\x7a\xb3\x96\xaa\x91\xb4\xf1\x8b\xa7\xad\x6b\xda\x6c\xe0\xda\xa3\x72\x03\x05\x06\x05\x06\x05\x06\x05\xee\x1d\x0a\x8c\x75\x5d\xc0\xba\xae\x7b\x30\x39\x14\xc6\x1d\x51\x18\xc3\x1b\x01\x6f\x04\xbc\x11\xf0\x46\xc0\x1b\xd1\xd3\xde\x08\x04\x9a\x20\xd0\x04\x81\x26\xed\x0a\x34\x81\xb3\x0f\xce\xbe\x5e\x75\xf6\x65\x0b\x4d\x01\xf1\x75\xe0\xe5\x52\x55\xaa\xae\x06\xcb\xe4\x3b\x42\x9a\x93\xde\xa4\x79\x17\xdb\x29\x4c\x86\x6d\xce\x29\x7c\xfd\xfb\x97\x86\xe9\x90\xfe\x62\x8d\xad\xa5\xfd\xd2\x10\xeb\xe6\xa0\x98\x93\xa5\x5c\x4e\xdf\x19\x58\xa9\x38\x7e\x62\x98\xfd\x9f\x3e\xda\x9a\x53\x54\x1e\xbf\xf5\x80\x57\x1e\x0e\x71\xe5\x94\xb8\x32\x19\xd7\x4f\x99\x56\x54\x79\xd9\x91\xd8\xd7\x7d\x4e\xc8\x29\x39\x9e\xa4\x8c\x78\x5f\x8e\xd3\x31\xfe\xbe\x1c\xa0\x34\x8d\xf9\x7a\x26\xf4\x67\xe1\x6f\x87\xeb\x9e\x6e\x36\x23\xc7\x42\xf0\x4b\x34\xca\xf6\x3b\x23\x24\x8c\x17\x2a\x1e\x37\x43\x29\xdc\xf7\x13\xfd\xe4\x36\xbb\xdf\x1f\xf4\x49\xc2\xe1\xee\xfa\x87\x8c\xb3\x3a\xd9\xfb\x19\xfd\x23\x9d\xaa\x71\xa5\x36\xdf\xfd\x00\x6d\x70\xa0\xb6\xe8\x40\x7d\x3a\x12\xca\xf7\x7f\x4e\xb8\x4d\xcf\xd0\x29\xdb\x6d\xda\x61\x43\xc2\x93\x71\x34\x66\x48\x3c\x4d\x86\xb7\x75\x49\x7e\xfb\x76\xdb\x90\xdc\x6d\xe7\xdf\x70\xdb\x8e\x07\xc5\x81\x8e\x9a\x0e\xa4\xe2\x40\x2a\x8e\x5b\x17\x94\x83\x90\x80\x90\x80\x90\xb4\x2d\x15\xc7\x4f\x87\x33\xed\x9f\x17\xd2\xa6\x29\x3a\xed\x90\x36\xb5\x65\xde\x6f\x6c\x62\x0f\xd8\x15\x34\x99\x7e\xe3\xef\x6e\xb3\xa7\xfe\xd1\xa0\xdc\x1b\xee\x05\xc1\x3e\x1e\x23\xde\xa9\xf5\x00\xd2\x70\xf4\xda\x2a\x04\x69\x38\x90\x86\x63\x83\xd3\x70\x74\x06\x1c\x85\x6f\xf7\x83\xf2\x7a\x64\x8f\xd3\x31\x76\x24\x7e\xc8\xca\xbd\x11\x75\xe5\xde\x70\xb5\x7c\x2b\xa4\x04\x67\xcf\x27\x68\xbf\xc9\x37\xd7\x2d\xb6\x26\x72\x52\xb0\x1f\x4c\xb0\x77\x0f\xd8\x33\xe3\xeb\x0d\xbf\x7a\x39\x5f\x5c\x2b\xe6\x57\xa5\x92\xab\xb4\x9a\xa5\x61\xe1\xc5\xb9\x42\x29\xa2\x96\x4a\xde\x77\xdd\x6b\x76\xe5\xbf\x30\x5f\xd4\xba\x3d\x27\xc8\x86\x54\x3d\xdb\xe7\xfd\xd6\xef\x60\xc4\x6f\x4c\x04\xb8\x9c\x0b\xfe\xd8\x1e\x64\xf1\xda\x8f\x4d\xdc\x80\x2b\x7d\x0d\xb2\x9e\x20\xeb\x09\x4a\x9c\x41\xef\x0e\xbd\x3b\xf4\xee\xbd\xa3\x77\x47\x89\x33\x94\x38\x83\xce\x18\x3a\x63\xe8\x8c\xa1\x33\xee\x0a\x9d\xf1\x26\xa4\x11\x28\x50\x06\xed\x26\x0a\x94\x6d\x9e\x44\x2d\xec\xc5\x24\x9d\x16\xd9\x81\xa5\x4a\x45\x5b\x47\x23\xa9\xcf\x04\xaa\xa2\xdb\x61\x7d\x5b\xc2\x87\xd4\xd4\x49\xbe\x35\xc9\xde\xda\x4f\x5b\xf5\x06\x2e\xad\xa5\xa3\x0f\x79\xe8\x24\xa7\xad\xab\x17\x8d\xab\x93\x83\xfa\x69\x53\x95\x8a\xe6\x84\x80\xf5\xe7\x85\xac\x97\x94\x68\x56\xc0\xbb\xd3\x74\x92\xc3\xbb\x23\x74\x88\x0e\xf8\x62\x6f\xfd\x99\x52\x6b\xe9\x54\xfd\x7d\x05\x22\xbb\xe5\x60\x1a\x77\x80\xa5\x0d\x1a\xa7\xff\x8e\xc1\xe3\x3c\x7e\xca\x05\xc0\xd7\xd7\x62\x46\xbf\xb2\xcd\x1e\x89\x84\xb7\x72\xd2\x63\x30\x86\x8d\x33\x3b\x3d\x1e\x99\x39\x3a\x47\x67\x6b\x5c\x8f\xad\x0d\x08\xbc\x8e\x50\x51\xb6\xa8\xa2\xfc\x60\x24\x34\xab\x70\x41\x28\x29\x67\x28\x63\x2b\x29\xdb\x66\x62\x02\xd4\x94\x8d\x59\xa0\x86\xac\x8e\xd3\x4c\x25\x7f\xf4\x0e\xdb\xc4\xec\xb6\x34\x95\x1e\x56\x25\x21\x0e\x76\xdc\xa8\x40\x5b\x09\x6d\x25\xb4\x95\xd0\x56\x42\x5b\x09\x6d\x65\xd3\xda\xca\xe7\x23\x21\x87\xe0\x35\x9f\x40\xee\xe6\xc3\xfa\x02\xd5\x91\xed\xda\x9e\x64\xfe\xd5\x0e\x7b\x71\x90\x0e\x50\x5d\x7a\x2c\x19\x86\xb8\x8a\xa7\x93\x2b\x06\xa8\x2f\x7b\x6d\x9d\x02\xf5\x25\xd4\x97\x1b\xac\xbe\xec\x1c\x86\x0a\xac\x83\xd6\xa6\x89\x20\x7b\x9a\x4e\xb2\xe3\xf1\x63\x96\xf3\xe2\x3e\xa7\x0e\xb3\xfe\xe2\x5b\x42\x8b\xf9\xae\x21\x7a\x50\xd0\xd4\xb2\x5c\xbd\xae\xa8\xba\x3d\xb0\xcb\xad\x8d\x15\xcb\x05\x55\xb7\x4a\x1a\xfb\x8b\x41\xf6\xd5\x7e\x7a\xb9\x7d\x16\x07\xa7\xeb\xd7\x57\x9b\x13\x57\x27\x87\xf4\xd3\x2e\x5a\x57\x2e\xa7\x8d\x03\xb3\x8a\x3a\x55\x2a\x59\x93\x66\x78\x75\x42\xdb\xa4\xa3\x7c\x1d\x9d\x15\xdf\xc0\x29\x3a\xc1\xbf\x81\xc3\x74\x90\x26\x7c\xbf\x01\x47\x8f\xae\xa5\x53\xc6\x33\x87\x92\x18\xfc\x55\xc1\x5f\xc0\x21\x76\xc0\x03\x87\xd4\x0d\xb2\xf1\x69\x18\x37\x07\x21\x25\x84\x94\x10\x52\x42\x48\x09\x21\x25\x84\x94\x10\x52\x42\x48\x09\x21\x25\x84\x94\x10\x52\x42\x48\x09\x21\x65\xa7\x85\x94\x90\x39\x42\xe6\x08\x99\x63\x0f\xcb\x1c\xbf\x7e\x2f\x9d\x6a\x48\xe6\xa8\xca\x1c\x65\xe9\x9f\xae\x21\x6f\x1c\xd3\xb8\xcb\x8d\xbd\xef\x5e\xf6\xad\x3e\xdb\xb7\x35\xc4\x55\x8e\xe2\x98\xd9\xcb\xf6\x94\xbb\x28\x9a\x59\x92\xab\xc9\x07\xbd\x74\x8e\xf6\x71\xe1\xd0\x0b\x59\xe5\xf8\x3d\x74\x4a\xa0\xb5\x23\x74\x88\xa3\xb5\x31\x1a\xa5\xfd\x81\x78\xd9\xbe\xab\x9b\xcd\x08\x79\x31\x18\xa9\xed\x67\xc3\xf5\x50\xd9\x71\x07\x4e\xde\x16\xfd\x55\x87\xaa\x31\x69\xaa\x1a\x1b\xe8\xfc\x21\x1f\x5d\x63\x7b\xfb\x3f\xc3\x23\xc2\x6b\x5c\x7a\xcd\x0d\x00\xbc\x78\x50\x33\xb6\xa8\x66\x7c\x4f\xe4\xa6\xbf\xfe\x69\xa1\x62\x3c\x41\x93\xb6\x8a\x31\x74\x13\xd2\x98\x8d\xf0\x53\x21\xd6\xd9\x8b\x00\x35\x64\xe6\xef\x6f\xb3\x4d\xc8\x81\x3a\x61\x42\x03\xb6\xe4\x21\x4f\x69\x42\xfb\x2c\x09\x84\x09\xbd\x66\xd2\x20\x4c\x80\x30\x61\x83\x85\x09\xed\x5f\x39\x06\x0a\x12\x42\x5e\x3b\x66\x8f\xd0\x21\x76\x20\x9e\xb6\x74\x04\xaf\x70\x0a\x11\xec\x8b\x6e\x09\x01\xc2\x37\x87\xe9\xac\x7b\x9f\xb3\x6e\x4a\xa8\x75\x82\xba\x9e\x19\x66\xdf\x19\xb0\x67\xcc\x8f\x46\x8c\xed\xa6\x23\x39\x54\xd9\x04\x38\xa6\x42\xa1\x5e\xd5\x11\x4a\xc6\xa8\x11\x9b\xdb\x72\x36\x6d\x50\xbe\x62\x55\xbe\x66\xdb\xbe\x21\x97\x0f\xc0\xd1\x76\x2a\x29\x7e\xae\x83\x9a\xc2\xb6\x25\x9e\xf2\xfb\xb6\xc2\xcf\x48\x15\xfc\xb5\x5e\x6f\xaf\x7c\x08\xd2\x09\x48\x27\x20\x9d\x80\x74\x02\xd2\x09\x48\x27\x20\x9d\x80\x74\x02\xd2\x09\x48\x27\x20\x9d\x80\x74\x02\xd2\x89\xce\x4a\x27\x7a\x30\x8c\x03\xea\x0e\xa8\x3b\xa0\xee\xd8\x44\xea\x8e\xff\xff\x10\xed\x13\xd4\x53\xd0\x1f\x47\xc8\x95\xc0\x9f\x46\xea\xfb\x5f\x19\x62\x3f\x37\x40\xdb\xc5\x7f\x6d\x50\xf2\xfb\xc1\xeb\x16\x63\xd3\x96\xd3\x56\xd2\xfb\xcd\x16\xbc\xd5\xb5\x49\xf0\x17\x83\x79\xe4\x18\x1b\x35\x78\xa4\xeb\x75\x41\x3e\x7c\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\x48\xb0\xc8\x6e\x61\x91\x00\x7d\x00\x7d\x00\x7d\x3d\x0c\xfa\xbe\xd9\x47\xbb\x05\xe8\xd3\x72\x57\xe4\xfc\x6a\xc9\x9d\x5f\x89\x7d\xae\x8f\x7d\xba\x8f\x5e\x6e\x1f\xbc\xb4\x96\x8e\xde\x5d\x90\xab\xee\x59\x56\xdc\x7f\x72\x77\x41\xae\x2e\x59\xa7\x2e\xa7\xa7\x16\xe6\xcc\x4d\x5d\x88\x32\xfe\xba\x86\x26\xeb\x1a\x9a\x6c\xa4\xa1\x6c\xc5\x5f\xfe\xf7\x98\x60\x71\x17\x69\x9e\xb3\xb8\x59\x9a\xa1\x4c\x0b\x2c\xce\xd1\x01\xf3\x45\xcd\xd4\x00\xb2\x7f\xdb\x47\xf1\xb1\xd4\x75\xb9\x54\x1a\x7d\xaa\xac\x5c\x2f\x8f\x29\x15\xb9\x5c\xcc\x8f\xba\x36\xd2\x63\xec\xeb\x11\xf6\x47\x11\xda\xfe\xb8\x5c\x2a\x5d\xd0\x4f\x8b\x3e\xae\x77\xbc\x26\x2a\xae\xc6\x24\x51\x72\x55\xcc\xb5\x6a\xec\x91\x8a\x5c\x9e\x9b\x71\xef\xc5\x47\x62\x52\x49\x53\x62\xfc\x37\x8c\xfd\x55\x6c\xe8\x91\xb9\x99\x69\xce\xb1\x14\x3e\xc5\xe5\x95\xdc\x50\x32\xa9\x0f\x9c\xab\x92\xeb\x1c\x6f\x55\x34\x3a\xed\x6c\xb3\x7e\x1c\xb3\x47\x68\x8f\xe8\xae\xbb\x68\x17\xef\xae\x97\xd3\x6d\x3f\x17\xd9\x46\xc6\xc7\x1b\x84\x21\xd9\xdf\x0f\x51\xd2\x2c\xb8\xea\xa3\xab\xad\x28\x79\x4b\x48\xfb\xa9\x21\xf6\x3f\xfb\xec\x7a\xab\xaf\xf0\xa8\x8e\xb0\xa0\xe4\x93\x77\xeb\x7f\xaf\xad\x89\xba\xa0\xe4\x43\x8e\x0c\x5c\xa4\x23\xe2\xe1\xc7\x29\xc5\x1f\x3e\x41\x83\xf4\x60\x60\xd9\xdf\x05\x25\x1f\x88\x67\xcf\x06\x93\xd7\x38\x8b\xd5\x96\x1f\xd5\x5b\x6e\xa6\xbe\xc1\xbf\xdc\x66\xf7\xe5\xbd\xde\xf5\x0d\xf4\xee\x8c\x1a\x87\xda\xde\xa3\x99\x49\x3a\x4a\x87\x6b\xa2\x64\x1a\xec\x52\x44\xc4\x20\xc8\xaf\xc5\x20\xbf\xb7\x47\x5a\xff\x90\x4f\x88\xe8\xbe\x43\x74\xc0\x8e\xee\xdb\x44\x66\xa0\xb2\x5a\xa5\xe4\xaf\xdd\x6e\x9b\x81\x1d\x56\x0d\x02\xfd\xcb\xbf\x57\xfc\x57\xfb\x3f\x7c\x54\x19\x40\x95\x01\x54\x19\x40\x95\x01\x54\x19\x40\x95\x81\xa6\xab\x0c\xfc\xd0\x4d\xcc\xdf\x27\x45\x41\x81\xc3\x74\xd0\x51\x50\x20\xbc\x09\x3c\xb8\x76\x40\x38\x53\x7c\xe6\x85\xdb\xec\x39\x3c\x1e\x50\x2a\x40\x9f\xd9\xef\xe1\x01\xa2\x6d\x9d\xd8\x11\x73\xdf\x6b\xcb\x09\xc4\xdc\x23\xe6\x7e\x83\x63\xee\x37\x9c\xc9\x78\xe4\x58\x71\x59\xed\xc0\x98\xfd\xec\x38\xa5\xd8\x48\x3c\x69\x89\xbc\x6f\x77\xaa\xc4\x17\x94\xfc\xad\x20\x0b\x67\x1f\xb8\x8d\x0e\x34\x0e\xfe\xc6\xe4\xb5\xa2\xe8\xa6\xff\x43\xf1\x97\x06\xec\xa9\xee\x1e\xe1\xa7\x8c\x99\xc7\x85\x03\x4f\x9f\xe0\x1e\x10\x47\x3c\x66\xb8\xb3\xc6\xb9\x21\x6f\x61\x39\x28\xae\x99\x6d\x26\x68\xdc\xf7\xd5\x33\x16\x6f\x6b\xe9\x15\xb9\x2a\xa5\x53\xe6\x5d\x65\xbf\x19\xf1\x67\xd3\xd3\xe2\xdd\x3e\x41\x93\xfc\xdd\x3e\x48\x2d\xfc\x00\x9d\x17\xc8\x62\x8a\x4e\xdb\xc8\xa2\xb5\x96\xe6\xc4\xe2\x29\x43\x67\x1c\x8b\xa7\x96\x9a\x0a\x2e\x2f\x50\x51\xb4\x2a\x5d\x5d\x0a\xfe\x06\xc7\x59\xca\xf8\xee\xc4\x6f\x59\x52\x54\xe3\xa6\x1d\x1f\x28\xbf\x07\xca\x62\x5e\x5f\x7f\x5e\xcf\x82\x1c\xfa\x90\xc3\x43\x74\x80\xa5\xe3\x63\x96\xe1\xbd\xd3\x69\xaa\xcd\x37\xee\x96\xb0\xd7\x3f\x73\x17\x1d\x0f\xb0\xd7\x86\x77\xca\xb2\xd9\x15\x55\x79\xc3\x8d\xb1\xef\xd3\x9f\xf0\x8d\xec\xcf\xee\x64\x3f\xed\xf0\xdc\x24\x72\x4a\xb9\xac\x3f\xf2\xb9\xb3\x8f\xda\xab\xa2\xaa\x12\xe3\x17\xe9\x3d\x68\xf8\xa4\x92\x29\xe3\x4c\x61\xc8\xcf\xc9\x55\xdb\x96\x1b\xa7\x2c\xe8\x97\x3c\x5e\xac\x5e\x59\x90\xaa\x57\x26\x74\x5b\x2c\xdc\x33\x37\xe9\x9b\xba\xfa\x80\xb7\x2d\x22\xb6\xcd\xb8\x25\xba\xfa\x58\xb0\x39\x9a\x60\xe3\xc2\x00\x39\xef\xd6\x00\x94\x5e\x65\x61\xe3\x71\x8a\x7a\xf6\xd4\xc2\x63\x4d\xf5\xd4\xc2\x6a\x33\x3d\xe5\x3b\xe3\xac\xdb\x85\xa1\xf7\x54\xed\x82\x29\xa8\xcf\xe2\xcf\x38\x7a\x6a\xd8\xea\xa9\x47\x96\x02\xba\x6a\xcc\xdd\x55\x8a\xd6\x03\x7d\x95\xfc\x80\xa3\xaf\xf6\x9b\x7d\x35\x73\x76\xfe\xec\xa3\x67\xd7\xef\xad\xb4\xab\xb7\x04\x62\xdf\x7c\x5f\x61\xb3\xfd\x35\xf1\x9c\xa3\xbf\x46\xcc\xfe\x7a\x64\xe1\xd1\xb9\x47\x2e\x2e\xad\xdf\x61\x13\xae\x0e\x33\x1a\xbf\xf5\x7b\x6c\xd2\xf3\x6b\x3c\x7f\x76\x6a\xa6\x99\xaf\xf1\xbc\x2c\xe5\x6f\xfd\xbe\xca\xfc\xac\xa3\xaf\x92\x96\xe5\x9a\x7a\x74\xfa\xfc\xfa\x9d\x35\xee\x36\x5d\xfa\x96\xf1\xd6\xef\xad\xec\x19\x3a\xc5\x4e\xc4\x27\xad\x15\xd3\xfd\xce\x85\x96\xc7\xd5\x1b\xb1\xe6\xaa\x5b\x0c\xea\xff\x6b\x6a\xbe\x4c\x88\x1f\xe7\xc7\x9c\x97\x7d\xba\x8f\x7e\xbb\x8f\xfd\x66\x5f\xf4\x53\xd6\xe2\xfa\xd9\x3e\x7d\xe0\xb8\x4e\xf8\x8a\x1c\xab\x48\x2a\x57\x7a\x3f\xb6\x38\x6f\x6c\x3f\x0c\x51\xad\xa5\x07\x92\xcb\xf9\x8a\x52\x2c\x57\x35\xfd\xce\x2f\x5f\x2e\xbe\x41\xd6\xc4\x92\xd8\x11\x84\x54\x55\xb8\x7b\xc9\xf4\x8f\xe5\x56\x55\x55\x2e\x57\x8d\xf7\xcb\x14\x5a\x56\x15\xb3\x4d\xce\x64\x62\xf2\x1b\xa4\x6b\x95\x92\xe1\x1f\xba\x7e\x45\x29\x59\xbb\x0c\xfd\x6e\xb8\x1c\xb1\x5a\xad\x4c\x8e\x8d\x95\x94\x9c\x54\xba\xa2\x68\x55\x8f\x35\xa2\xfe\x36\x8c\x6a\x37\xb4\xaa\x7c\xcd\x5e\x23\xca\x25\x49\xab\x16\x73\x9a\x2c\xa9\xb9\x2b\xa3\x25\xa5\x50\x28\x96\x0b\x63\x97\xc4\x7f\x9f\x7e\xfd\xc9\x55\x4d\x56\x27\x9f\x2a\x5e\xcb\x5d\xb9\x91\x8a\x99\xbd\xe1\x7d\x58\x74\xa9\x73\xb1\xfa\x7f\x93\x74\x52\x48\xdb\xd4\x15\x29\x97\x32\x5f\x64\xbe\x5d\x73\x48\xdc\x72\xa5\x55\xad\xaa\xef\xb2\x4a\xf2\x8a\xbe\xc1\x2b\x17\x2c\xa1\xd1\x47\x93\xec\xd9\x7e\xba\x53\xbf\x7c\xca\x79\x35\x2f\x2d\xe8\xa1\x3a\x9a\x16\x4d\x2d\x2a\x25\x39\x23\x9a\x4a\x0e\xeb\xa7\x2d\xd6\x36\xb0\x9c\xae\x3f\x35\x64\x59\x52\x93\xf5\x30\x79\x17\xad\xa5\x53\xf5\xf7\x75\xb3\x89\xcb\x9f\x0a\xb6\x05\xe7\xd9\xac\x61\x0b\x7c\x47\xca\xcc\x71\x57\x7f\x7b\xae\xac\xe6\x6f\xd9\xee\x33\x5c\x09\x6f\x61\x93\xc7\x88\x8d\x18\x67\x6e\xc0\xa0\x65\xe6\xe8\x1c\x9d\xad\xa1\x47\xad\x8d\x1a\xdc\x14\x10\x42\xb5\x88\x33\x3e\x18\x09\xcd\x74\x5c\x10\x90\x71\x86\x32\x36\x64\xdc\x00\x3b\x54\x59\xed\xb0\x1d\x4a\x7e\xfc\x0e\x1f\x3b\xb4\xdb\x52\x56\x79\x98\x9e\xfd\xe2\xe0\x46\x58\x1e\x48\xaf\x20\xbd\x82\xf4\x0a\xd2\x2b\x48\xaf\x20\xbd\x6a\x5a\x7a\xf5\x7c\x84\xe6\xc5\x8a\xe1\x2c\x4d\xf3\x15\xc3\x49\x3a\x4e\xc7\x5a\x98\x3e\x44\xc5\x0f\x5a\x14\x2e\xc5\x0b\x34\xe7\x70\x29\xde\x64\x9b\x41\xcb\x87\x4e\xae\x0f\x82\x15\x61\x99\x9f\xdd\xe1\xb3\x82\x48\x07\xe8\xba\x3c\xd6\x15\x49\xae\x29\xe8\xf0\xb2\x02\xc2\xaf\x5e\x5b\xcc\x40\xf8\x05\xe1\xd7\x06\x0b\xbf\x3a\x47\xbd\x02\x8b\xae\x74\x72\x3e\x09\xc8\x29\x5a\x77\x71\x3d\x18\x0f\x5d\x2a\xf0\xf1\xd7\xd2\xa1\x20\x69\x97\x61\x02\xcb\xd5\x35\xa5\xb4\x7a\x4d\xce\x95\xa4\xe2\x35\x8d\xbd\xe5\xb5\xec\x67\x06\x6d\xb7\xc8\x01\x91\x7c\x46\x35\xd2\x66\x98\x8b\x69\xb3\x42\xca\x82\xd5\xc8\x32\x6f\x64\x5a\x6f\x24\x39\xac\x5f\x54\xa7\xfa\xf2\x3a\xb5\xcb\xd3\x02\x66\x90\x29\x0f\x99\xf2\x32\xc8\x94\x87\x4c\x79\xc8\x94\x87\x4c\x79\x3d\x93\x29\x2f\xd3\x35\x99\xf2\x42\xbf\x93\x96\x33\xe5\x65\x90\x29\x0f\x99\xf2\x90\x29\x0f\x99\xf2\x90\x29\xaf\xf3\x99\xf2\x32\x3d\x9d\xd8\x2e\x83\xc4\x76\xed\x4b\x6c\x97\xe9\xf6\xc4\x76\x99\x4d\x98\xd8\x2e\x7b\x85\x1e\x16\x24\x70\x96\x66\x38\x09\x3c\x45\x27\x68\x32\x38\x04\xd4\x8b\x11\xcd\x17\xb5\xe0\x5a\x0a\x8f\x07\xf3\xbe\x83\x6c\x62\xdd\xc0\x50\xaf\xdf\xa6\x75\xa2\xe1\x78\x7d\x86\xf8\x47\xb6\xdb\xb0\xec\x3e\x23\x12\x52\xf2\xe1\x62\xfb\x7d\xe2\x21\xdb\x4a\xc6\x04\xc8\x9a\xa7\x2c\x9d\xaf\x71\xc7\x1c\xa5\xc3\xad\x8d\x08\x9c\x31\x90\xb7\xb5\x28\x6f\x7b\x4b\x9f\x7f\xec\xce\x9c\x30\x19\x19\x3a\xc3\x4d\x06\x4f\x44\xd7\xda\x0b\x4a\x17\x85\xf4\xed\x1c\x9d\xb5\xa5\x6f\x37\xd3\xde\x23\xc2\x25\x7e\x9e\x66\x1d\x2e\xf1\x9b\x68\xb0\xd1\x58\xdb\xc6\xcc\x5a\x63\xa6\xcc\x25\x91\xfb\xc6\x88\x23\xf4\xc1\x50\x36\x38\x64\x22\xca\x65\x1f\x13\x76\xc8\x99\x8d\x6c\xda\xba\xa0\xb3\xc6\xac\x3d\x72\x39\x60\x5e\x60\x5e\x60\x5e\x60\xde\xde\xc1\xbc\x58\xc6\x05\x2c\xe3\xba\x87\x83\x43\xaa\xdc\x11\xa9\x32\xdc\x0d\x70\x37\xc0\xdd\x00\x77\x03\xdc\x0d\x3d\xed\x6e\x40\xc4\x0a\x22\x56\x10\xb1\xd2\xae\x88\x15\x78\xf3\xe0\xcd\xeb\x55\x6f\x5e\xb6\x10\x72\xb0\x56\x90\x63\x2c\xe9\x4d\x98\x77\xb1\x9d\xe2\x6b\xb6\x2d\x6d\xfb\x68\xf3\x66\x4c\xb6\xf7\xb9\x04\x65\x44\xfe\x92\x9c\xac\x1a\x7e\x50\xd9\x51\x89\x9f\xe7\xad\x34\xca\xf1\x3b\xcf\x28\x16\xca\xc5\x72\xc1\x5c\xb4\xb1\x7f\x9b\x60\x6f\xda\x42\x77\x3a\xcf\xb8\x64\x5c\x1c\x7d\x4b\xa4\xb1\x72\xfd\xd3\xf6\xc5\x4b\xa2\xf9\x45\x93\x78\x84\x52\xc2\xff\x10\xbf\xc0\xf1\x2b\xda\xb2\xb8\x43\xdf\x1f\x9e\x2f\x6a\xd5\x2e\x97\xee\x77\x6f\x45\xff\xd7\x07\x7f\x65\x17\xd9\xbc\xf1\x95\x79\xbc\x7c\x66\x50\x8a\xdf\xe0\x78\x64\x57\x45\x18\x03\xc2\x18\x50\xf0\x1f\xfe\x2d\xf8\xb7\xe0\xdf\xea\x1d\xff\x16\x0a\xfe\xa3\xe0\x3f\xfc\x0a\xf0\x2b\xc0\xaf\x00\xbf\x42\x57\xf8\x15\x50\xf0\x1f\x05\xff\x37\x0b\x49\x45\xc1\xff\x76\x14\xfc\xff\x6e\x1f\xdd\x2f\xa8\xa2\x55\x02\xbe\x16\x29\xb2\x2f\xf6\xb1\x2f\xf4\xd1\x4e\xeb\x04\x8b\x17\xfa\x16\xfe\xbf\xbf\x20\x57\x67\xcc\xd3\x0d\x76\xd7\xf5\xc5\xff\xdb\x53\xe3\x3f\xb0\xda\xfd\x7f\x1d\xa2\xb8\x18\x01\xf9\x0d\x55\xb9\xcc\x3f\x16\xab\xef\x39\xb9\xd5\x34\x59\x63\xdf\x19\x64\x7f\xd9\x4f\xcc\x3e\xc7\x1a\x85\x87\xd6\xcf\x88\x32\x27\x9a\x48\x8e\xe8\xa7\x9d\xb5\x2e\x37\x46\xc5\x38\x3a\xab\xa8\x53\xa5\x92\x25\x9a\x0e\x6f\x80\xda\xc4\x52\x65\xca\x8a\xd1\x9a\xa6\x29\x3e\x5a\xc7\xe9\x18\x1d\xf1\x95\xbe\xdb\xbd\x66\x15\x99\x32\x1e\xbc\xa1\x58\x9e\x80\x90\x9b\xab\xcb\xc1\x00\xf5\x00\x4b\x1b\x00\xd5\xbe\x17\x83\x9b\x1a\x77\x02\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\x0a\x4a\xba\x71\x94\xf4\xbd\x43\xf4\x80\x60\x74\x52\xa5\xa2\xf1\x32\x71\x4a\xb9\xaa\x2a\xba\x39\xd4\x77\x07\x7c\xec\x0c\x44\xb7\x55\x3f\xe5\xd2\x5a\x3a\x3a\xbe\x3e\x97\x9b\xb6\x5a\x58\x34\x5a\x10\x88\x6e\xaa\x52\xd1\x96\xd3\xf5\x47\x6f\x71\x44\xa7\xf7\x1a\xcf\xbd\x5d\xf7\xe0\x9d\x47\x74\xfa\xbd\x98\xa2\xc6\xba\xdb\x71\x0b\x89\x81\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x3a\x84\xe8\x7e\x38\x41\xe3\x02\xd1\x95\xe5\xea\x75\x45\x7d\x4a\x5f\xad\x59\x4a\x46\x23\x2e\xda\x38\xc4\x53\x48\x14\x65\x8d\xfd\xd1\x10\xfb\xdd\x01\x7a\xb9\x7d\xc5\xa5\xb5\x74\xf4\x46\x63\x41\xd0\x17\xc5\x45\x0b\x46\x06\x8d\x50\x02\x9f\x27\xf8\x05\x17\xad\xdb\x59\x4e\xbb\x7e\x65\xbe\xa8\x55\x37\x1b\x06\xdc\x88\xa8\xe7\xd7\x06\xc3\xbe\xe3\xec\x98\x01\xfb\xea\x5e\x17\x83\xfc\xb9\x7a\xde\x5d\xae\xb5\x91\xa8\x6a\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\x41\x90\xc1\x8e\x91\xc1\x61\xca\x0a\x32\xa8\xae\x48\xb9\x94\x89\x8b\x78\x53\xde\xe9\x13\xad\x84\x8e\xda\xd8\xf7\x59\xff\x7e\xe3\x98\xaa\x94\x64\x8d\xbd\x90\x60\xff\x6b\x80\xee\xd5\xdb\x9a\x72\x36\x65\xc5\xe3\x56\x1a\xe3\x87\x8b\x8a\x3e\x8f\x86\x82\x0d\xc5\x6d\x2f\xd6\xde\x91\x11\xe2\x6b\x97\x42\xd2\x7f\x12\x99\x12\xbd\x99\xe1\x4a\x30\x33\x3c\xcd\x4e\x0a\x34\xa8\xf7\x63\x7d\xb8\xae\xc1\x13\x7d\x5f\x32\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\x43\x70\xc3\xae\xe4\x86\x9b\xaf\x44\x04\xc8\x24\xc8\x24\xc8\xe4\x26\x22\x93\xbf\x90\xa4\x43\x82\x4c\x6a\x55\x45\x95\x0a\x72\x2d\x8e\x5c\xe3\xf5\x6b\xa4\x6a\x55\xca\x5d\xd1\xa7\x76\x83\x47\xbe\x91\xfd\xd3\x30\xfb\xb1\x7e\xba\xdd\xb8\xcc\x42\x8f\xfb\x54\x59\xca\xd7\x6c\x73\x45\x0d\x9c\x29\xab\x8d\x64\x5c\x3f\x69\x49\x5c\x69\x20\xc2\xda\x73\xc2\x2d\x8f\xde\x64\x89\xa1\x94\xd9\x19\x66\xaa\xbe\xda\xbb\x0b\x64\x79\xb9\x60\x96\x77\x86\x9d\x32\x78\x9d\xbb\xeb\x0d\xf1\x5f\xdd\x4f\xd6\xd1\xbe\xab\x7b\xbd\x61\xde\xcb\xd8\x40\x41\xae\x52\xf4\xfb\xb7\xd7\x0f\xcf\xa0\x2a\x57\x4a\x52\x4e\x0e\x1a\xa1\x87\x8c\xf3\x3a\x39\x48\x99\x47\xe8\x61\xba\xe0\xac\x61\x1f\x8b\x24\x6f\x66\x94\x50\xcc\x39\xa8\x98\xf3\xbb\xfa\xe8\x3f\xf6\xb1\xb7\xf7\x45\xff\x9d\xd5\x41\x7f\x16\xe1\x6b\xe3\x87\xa5\xb2\x54\x90\x55\xb1\xcb\x13\x0b\x0e\x4d\x53\x72\x45\xbe\x70\xb1\xf6\x53\x12\xdf\x90\x2a\x6a\x4c\x5f\xd7\x56\x6f\x58\x2b\xb9\x6b\xd2\x53\xfa\xfd\x57\xaf\xc8\x9a\x6c\x1a\x3e\x67\xe9\x64\xb3\xc4\x32\x37\xb9\x7c\xef\xa4\xa8\xb1\xf4\xc4\x51\xfd\x5c\x55\xca\x71\x24\x57\x52\xca\x05\x61\xe6\xf8\xfe\x46\x5f\x8a\x4a\xc5\xb2\x58\x7d\xf0\xfd\x83\x7d\x2e\xc7\x14\x06\x30\xd4\x77\xbd\xe6\xd4\x55\x50\x4a\x52\xb9\x90\x52\xd4\xc2\x58\xe5\xa9\xc2\xd8\x6a\xb9\x98\x53\xf2\xf2\xd8\xbe\x39\x6d\x41\x6f\x25\x15\xdf\xe1\x7c\x56\xe7\x64\xf3\xb1\x48\xc8\x06\xe3\x95\x7a\x6b\x69\x96\xa5\xf3\xb4\x75\x5a\x2c\xdc\x6f\x71\x1b\x54\x59\xad\x52\xf2\x99\x3b\xea\x6d\xd0\xbd\x46\x0d\x46\xa9\xde\xec\x3c\x28\x0e\x75\xd4\xea\x3c\x4a\x8b\xb4\xe0\xb4\x3a\xc9\x0c\x9d\x69\xc1\xd3\x33\xc3\x6f\xfd\x11\x0e\xc5\x35\x98\x9e\x20\xd3\x83\xea\xed\x1d\xa9\xde\x8e\xb2\xbd\x28\xdb\x8b\xb2\xbd\xed\x2a\xdb\x9b\x7d\x3e\xec\x75\xc2\xa2\xde\xda\x04\xbb\x40\x73\xb4\x4d\xf4\x6d\xfb\x17\x0a\x31\xef\x39\x7c\x3b\xdb\x2a\xba\x89\x3a\xb2\x94\xc8\xfc\x97\x1d\xf5\x6b\x85\xb1\x8a\xa4\x56\x8b\xdc\xcb\x29\x36\xbe\x41\x1b\x97\x7d\x15\x7d\x8f\xdb\xa9\x05\xc4\xee\xda\x86\x46\xf9\xcf\xef\xe7\x65\x00\xf6\x38\x0f\x5e\x93\xd5\x82\xec\x3c\x3a\xe8\x3c\xaa\x55\x55\xa9\x2a\x17\x8a\xb9\xd1\xba\xf3\x5c\xad\xe8\xff\xbe\x61\x1c\xd5\xef\x32\x73\x91\xe6\x29\x5b\xb3\x65\x9a\xa4\xa3\x2d\x2c\x5f\x16\xb8\x14\x00\xcb\x96\x80\x65\xcb\x73\xfd\xf4\x6c\x3f\x7b\xa6\x3f\xfa\xb4\x65\xfb\xdf\xdc\xdf\x3b\x3b\xa6\x1a\xef\x89\xde\xcf\x5c\x0d\xc0\x3d\x7c\xfa\xcb\x69\x6b\x82\x12\x3e\x2f\xee\x30\x9f\xc2\x84\x78\x44\x2a\xf1\x2b\xf5\xb5\x9a\xb8\x9a\x9f\xc1\xd7\x4d\x5a\x2c\x91\xd5\x94\xf2\x82\x10\xc7\x3c\xac\x7f\x16\xc6\xbf\x97\xcc\x8f\xc5\xfe\xe3\xb0\xff\x56\x2e\xf3\x52\x84\x5e\x8c\xb0\x17\x22\xd1\x4f\x58\x58\xee\xfd\x91\x59\x45\xcd\xf1\x25\x5d\x41\xe1\xdd\xae\xc4\xe2\x97\xf5\x3f\xc5\x63\x53\xae\xa7\xe0\xc0\x55\xac\xbe\x56\x35\x5b\x06\x30\x2a\xe5\xf8\x83\x73\x71\x45\xa9\x98\x33\x66\x57\xb9\x94\xd7\x62\xca\x75\xa3\x4f\x85\xf8\xa0\x22\x2b\x95\x92\x9c\x8a\x89\x5f\xe4\x6a\x26\x73\x2c\x39\xf8\xf4\xec\x00\xeb\xe7\xe3\x5b\xf8\x6d\xb9\x94\x39\xdd\xc9\xb2\xfc\xc4\x68\x8d\xcd\x06\x57\xef\xf7\x9e\x83\xb6\xb1\x97\xf1\x1e\xa1\xec\x49\x3a\xce\x8e\xc5\x8f\x58\xce\x90\x3d\xfc\x13\x33\xbe\xf7\xda\xf6\xe2\x03\xfa\xd1\xb6\x16\xc3\xfe\x99\x61\x9a\x18\x93\x2a\x45\x47\x68\xb7\xb7\x66\x53\xa8\xe2\x4c\x6c\xfa\xcd\x04\xfb\xcc\x00\x6d\xcd\x29\xaa\x3e\xc9\x45\x9f\x35\xea\x5d\x3b\xf5\x99\x65\x73\x4b\x60\xe6\x69\xe4\xf2\xc1\x50\x84\x9a\x23\xb6\x2f\x99\xef\x3f\x0c\xcf\x63\xb1\x2a\x5f\xb3\x4d\xd4\x90\x4b\x97\xe0\x68\x3b\x95\x8c\x8a\xb2\xd8\x8a\x2a\x2f\x3b\x44\x9d\xfc\xfe\xa0\xe8\xac\xff\x72\xfc\x5f\x6a\x7e\x63\x74\xf5\x5c\xf0\xa7\xf5\x20\x8b\xd7\x56\x97\x17\x3f\x8e\x24\x90\x90\x6c\x42\xb2\x09\xc9\x26\x24\x9b\x90\x6c\x42\xb2\x09\xc9\x26\x24\x9b\x90\x6c\x42\xb2\x09\xc9\x26\x24\x9b\x1b\x28\xd9\x9c\xa0\x71\x96\x8a\x8f\x58\x94\x62\xa7\x93\x52\xf0\x7d\x5b\x3d\x9a\x80\xcc\x13\x32\x4f\xc8\x3c\x21\xf3\x6c\xa3\xcc\xf3\xf9\x84\xa8\xb1\xed\x0f\x2b\xdf\xc8\x7e\x38\xc1\x3e\xe7\x20\x93\x1f\x6a\x84\x4c\x5a\x0c\xb0\x2b\xe8\xe4\x9d\x5e\x74\xb2\xfb\xb9\xa4\x1f\x45\x0c\x1f\x58\x36\xcc\x25\x2f\x04\x73\xc9\x04\x1b\x34\xb2\x54\x9a\x3d\xed\x22\x92\x36\xb3\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\x04\x9b\xec\x30\x9b\x3c\x4c\x07\xd9\x44\x7c\xdc\xe2\x8c\x77\x39\xd9\xa4\xb5\x8b\x6b\xbf\x74\x0a\xf4\x10\xf4\x10\xf4\x70\x13\xd1\xc3\x7f\xd9\x4f\xfb\x8c\xda\xd3\x79\x7d\x09\x5c\x54\xca\xaa\x5c\x28\x72\xd1\xba\x23\x83\x25\xfb\x83\x3e\xf6\xfb\x7d\x74\x97\xe7\x49\xd1\x68\x81\x87\x9c\x5c\x56\xd4\x6b\x56\xe7\x4a\x31\x8e\x89\x92\xb1\x82\x5c\x9d\xf2\xba\x6a\x6a\x61\xee\x9c\x7e\x46\x78\x8a\xfd\xba\x86\x26\xeb\x1a\x9a\x6c\xa4\xa1\x6c\x91\x2e\x0a\x3c\x77\x8e\xce\x72\x3c\x77\x9a\x4e\xd2\xf1\x16\xf0\x9c\xf9\x8c\x41\x6a\x42\xf6\xad\x61\x7a\xd8\xbf\xbe\x50\x03\xd9\x43\x8b\xe5\x82\x2a\x6b\x9a\x8d\x7c\x7f\x6a\x98\x7d\xff\x16\x62\xae\xe2\x43\x22\xee\xe2\x83\x8d\xd0\xdf\x39\xd1\x5e\x57\xb0\xdf\xa1\xba\xba\x45\x35\x99\x47\x8d\x9b\xed\x7e\x1c\xdc\x85\x32\xd5\x27\x83\x71\xf0\x24\x3b\x1a\x50\xcd\xc8\x18\x80\xfa\xc0\x1f\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\x62\x00\xe2\x0e\x03\xe2\x83\x34\xc1\xc6\xe3\x29\x0b\x10\xef\x72\x02\x62\x63\xfb\x06\xf9\x2a\x00\x34\x00\x34\x00\x74\x47\x01\xf4\x3f\xf4\x51\x2c\xa8\x7e\x12\xfb\x9d\x3e\xf6\x99\x3e\xda\x59\x57\x15\x69\x5d\xf2\xbc\xa7\x20\x57\xeb\xaa\x16\x81\x3a\x3b\xa8\xf3\x97\x12\x34\xe6\x93\x21\xd6\xa0\xcd\x39\xad\x98\x57\x8b\xfa\x27\x64\x72\xe5\x67\x12\xec\xeb\x03\x44\x76\x32\x9f\xc6\xd4\xc4\xd3\x4b\x73\x33\xbc\xa1\xae\x20\xca\x77\x5f\x77\x65\x12\xb2\x6e\x0e\x04\xb9\x05\x82\xfc\x78\x30\x41\x3e\xc8\x26\xd6\x4b\x19\x62\xf5\x3f\x12\x1f\x80\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x83\x1d\x77\xad\xb8\xd8\xda\xbb\x41\x5c\x0c\xb6\x0b\xb6\x0b\xb6\xeb\x60\xbb\xdf\x1d\xa2\xa4\xbf\xaa\xd5\x40\x8c\x96\x72\x95\x7d\x7a\x88\xfd\xc6\x00\xbd\xdc\x25\x59\x8d\x6a\x8d\xd5\xbb\x0f\x53\xaf\x9a\x4a\x8e\xd4\x29\x4e\x8d\xf6\xe7\x8b\x5a\x75\x56\x51\xa7\x4a\x25\x4b\x7d\x0a\xd9\xa9\x07\x34\x6c\xa4\x16\xfd\xd5\x57\x05\x83\xc3\x43\xec\x40\xf3\xd2\x53\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\x43\x90\xc3\x4e\x93\x43\x10\x40\x10\x40\x10\xc0\x1e\x26\x80\x7f\xfd\x24\xa5\x82\xe2\xda\x0d\x00\x98\x2b\x49\x9c\x02\xfe\xf2\x93\xec\xc3\x83\x9e\x81\xeb\x49\xb1\x4e\x54\x8d\x19\xce\x34\x81\x35\x21\xeb\xd3\x7a\x3b\xc9\x07\xf4\x73\xeb\x42\xc6\x9d\xa7\x74\x39\xb6\xcb\x80\x61\x81\x61\x65\xc0\xb0\xc0\xb0\xc0\xb0\xc0\xb0\x7a\x86\x61\x65\xba\x86\x61\x85\x7e\x27\x2d\x33\xac\x0c\x18\x16\x18\x16\x18\x16\x18\x16\x18\x56\xe7\x19\x56\xa6\xa7\x91\x53\x06\xc8\xa9\x7d\xc8\x29\xd3\xed\xc8\x29\xb3\x09\x91\x53\xf6\x2a\x3d\x22\xe4\x4e\xe7\x69\x96\xcb\x9d\xce\xd0\x29\x3a\xe1\x5b\x42\xdd\xc1\xa5\xcc\x2a\xea\x4e\x4a\x34\x5f\xd4\x82\xd5\x4e\xf7\x79\xab\x9d\xb6\xb2\x2d\x42\xe8\xb4\x12\x2c\x74\x3a\xcd\x4e\x36\x26\x74\xe2\x77\x55\x9f\x68\x2f\xfe\xeb\xdb\x3d\x99\xd9\x2b\xc4\xfc\x14\x93\xca\x6e\x3e\xb6\x4f\xfc\xbd\x33\x84\x4c\x00\xad\x8b\x34\x4f\x59\x36\xb0\xa2\xe4\x6f\x44\xf9\xff\xc6\x22\xc9\x49\x3a\xda\xea\xc8\x64\xde\xd3\x47\xff\xa5\x8f\xfd\xe7\xbe\xe8\x7f\xb2\x4c\xd3\xb7\x23\x8f\xeb\x13\xbf\x31\x17\x8c\x70\xd5\x60\x4e\xdf\xf1\x09\x5b\xe2\xda\x7f\x38\x99\xd4\x8a\x1c\xab\xe8\x3d\xaa\x2f\xfa\x52\xb1\xa9\xf2\xff\xc7\xde\xdb\xc7\xb7\x71\x9d\x77\xbe\x1f\x82\x54\x2c\x3d\x56\x62\xf9\x38\x69\x6c\x58\xb6\x61\xc8\x26\x48\x88\x04\x05\xea\x9d\x7a\x25\xf8\x22\x11\x92\x25\x5a\x94\x29\xc7\x95\xc2\x0c\x81\x21\x34\x12\x88\x41\x66\x40\x2a\xca\x6e\xb6\x89\xb3\xe9\xa6\x6d\xd2\xdb\x4d\xb6\x69\xf7\xb6\xdb\x9b\xf4\x6d\x93\x36\x4d\x36\x6f\x6d\x6f\x93\x6d\xda\xbd\x9b\xd6\xad\x1b\xb7\x69\xda\xe6\x73\x6f\xba\xd9\xa6\xeb\x6d\x9a\x6e\xdb\xcd\xde\x6e\x9b\x9b\x7c\xd2\xcd\xfd\xcc\x39\xf3\x0a\xcc\x60\x40\x08\x00\x41\xe1\xf7\x8f\x3f\x32\x31\x73\xe6\xcc\x99\x33\xcf\x9c\xf3\x7d\x9e\xe7\xf7\xc4\x94\x92\xd8\xf9\xab\x5a\x6c\xad\x64\xc3\x83\x7c\x2c\xaf\xdd\xbe\xb4\x56\x8a\xe5\x15\x4d\x36\x5e\x20\xd9\xde\x91\x1a\x1f\x16\xfe\xe5\x36\xb7\xe4\xd6\x02\xdc\xdc\x04\xc5\x56\xd6\x34\xbe\xc8\x2b\x6b\x6a\x4e\xd6\xf9\x27\xd6\x7c\x5f\xcd\x8f\x41\x2a\xb6\xc8\xaf\xc8\x17\xcf\xfc\x9b\x38\x11\x1b\x8d\x4d\x16\x8b\x13\xfc\x03\x9a\xd7\x6e\xc7\xb4\xb5\x92\xb1\x39\x33\xde\x38\x6b\xd5\x60\x36\x27\xe7\xe3\xaf\x10\x5d\x73\x9b\x97\xf7\x45\xe8\xbd\x11\xf6\x23\x91\xe8\xbb\xed\x01\xfa\xab\x3e\xbe\xe6\x7a\x4a\x2a\x49\x05\x59\x13\xbb\x07\x21\xe6\xa1\xeb\x6a\x4e\xe1\x1f\x44\x7b\x9d\x2e\xf1\x8d\x8e\xaa\xc5\x8c\xf5\x52\xe5\xb6\xbd\x42\x58\x95\x8c\x87\x62\x1c\xa2\xcb\x96\x0d\x30\xec\x92\x45\x50\x38\x44\x58\x96\x63\xdc\xfa\xf0\x35\xb9\xaa\xc5\xd2\xe3\x47\x8c\x63\x35\x29\xc7\x51\x8f\xb1\x9d\x15\x6f\x3c\x5f\x37\x1b\x4b\x1c\x49\x29\x09\xdf\x0f\x5f\x97\x3a\xc7\xf2\xed\xaf\x09\xa2\x8c\xdd\x94\x65\xc5\x0b\x6a\x51\x2a\x15\x52\xaa\x56\x18\x2b\xdf\x2c\x8c\xad\x95\x94\x9c\x9a\x97\xc7\xf6\xcc\xe9\xf3\x46\x2b\xa9\xf8\x4e\xf7\xbd\xba\x51\xff\x0f\x45\xe8\x9c\xb0\x11\xd3\x94\xe1\x36\xe2\x38\xdd\xc1\x4c\x14\xf1\x95\x69\x1e\x5f\x79\xcf\x94\x58\x0f\xde\x61\x8b\x4f\x1b\x2d\x8e\xb3\x2c\x9d\xa5\xed\x93\x39\xe3\x0b\x74\xc7\x4d\x36\x6f\xc4\xca\x6a\x87\x8c\x58\xf2\x1b\x23\xbe\x46\xec\x71\xb1\x9c\x8e\xe5\xd4\xa2\xb1\x39\x36\x3f\x76\x1e\x7b\x36\x2a\x0e\xa9\xb1\x67\x53\xf6\x29\x6d\xb4\x6c\x97\xe9\x12\xcd\xbb\x2d\x5b\x32\x43\xa7\x9b\x08\xb0\x9d\xe6\xf7\x70\x91\x13\x5d\x1d\xec\x17\xec\x17\xec\x17\xec\xb7\x87\xd8\x2f\x56\x74\x21\x2b\xba\xee\x81\xe3\x2f\x47\xe8\xab\x11\xf6\x95\x48\xf4\xcb\xf6\xa3\xfa\x58\xe4\xb2\x7b\x3b\xaa\x94\x62\xba\xd8\x52\xc6\x96\xe5\x15\xe1\x49\xb6\xb1\x8d\xf3\xc9\x32\xdf\x12\x3e\x58\xae\xb5\x63\x49\x2d\x8d\x96\xe4\x82\xc4\x1f\x89\xb9\x23\x75\xaf\x31\x05\xc0\xb5\x27\x83\xb9\x40\x50\x56\x57\xe5\xbc\xb1\x8a\x2d\xde\x76\x5c\xbc\x8e\x69\x57\x8a\x23\xe6\x46\x95\xdf\x6e\xac\xa0\x49\x39\x3e\x4f\x14\x35\x6f\x7f\x78\x9c\x8f\x03\xf7\x9e\x5b\xcf\x65\x4d\x37\x3a\xe9\x1e\x28\xc9\x38\xd3\xba\x21\xf3\x22\x2b\xe2\x7d\xb3\x9a\x48\x89\x7e\xae\xca\x52\xc9\xb7\x8f\x71\xc6\xbb\x30\xcf\x7b\xe0\xb7\x01\x87\x0f\x02\x3e\x08\xf8\x20\xe0\x83\x80\x0f\xa2\xa7\x7d\x10\x5f\x88\xd0\x4b\x11\xf6\x62\x24\xfa\x82\xfd\xb5\x7d\x7f\x64\xda\x95\xe9\x5a\x2e\xca\x92\x2e\xdb\xaf\xfe\xbc\xa6\x96\xa5\x02\xff\x0e\xcf\xab\x45\x25\x77\xdb\x13\x81\x64\x3d\x6e\x27\x55\xd6\x78\xe0\xe9\xd4\xe1\x54\x6c\x41\xd8\x11\xf1\x91\x2c\xcb\x25\x63\x9a\x3a\x5f\x11\x39\xa6\x6a\xe5\xeb\x52\xc9\x8a\x88\xd2\xd6\xe4\xb1\x15\xa9\x68\xad\xfe\xe3\xe2\xd7\x78\x6c\x45\x29\x49\x45\xe5\xcd\x96\xf9\x5e\x96\x63\x52\x9e\x03\x7d\x75\x4c\xf0\xdd\xbc\xb3\xb4\x14\x8d\x27\x74\xe7\x24\xb1\xde\x4e\xc5\x66\x14\x6e\x92\x5c\x1d\x57\xb5\xda\x3b\x73\x9c\x28\x15\xb1\xdc\xe7\xab\x3f\xb5\x72\x3d\x15\xdf\x25\xfa\x33\x6d\xdd\x88\x37\xb4\xea\x9d\x03\xf4\x8e\x01\xf6\xfc\x40\xf4\xbb\x76\x7c\xdd\x97\xfa\xaf\x98\x76\xd0\x98\xa2\xd7\xd5\x5b\xb1\x82\xa4\x2d\x4b\x05\x0f\x79\xb0\x17\x6a\xb2\xb6\xa2\x6a\xab\xc6\x58\xf8\xf6\xf4\x62\xd5\xc5\x83\x3b\xca\x97\x35\xd6\x9a\xa4\x2c\xee\x4a\x31\xd6\x0b\x39\x25\xef\x2c\xac\xf9\xb7\x91\x6f\x73\xec\xd1\xd5\xb9\xf8\x25\xff\xd5\xfa\xfa\xa5\x5c\xc3\x68\xd9\x4d\xdb\x73\x61\x47\xd5\x79\x2f\x96\x8a\x09\xc4\xc4\x6d\xb1\x7b\xb5\x9a\x10\xf7\x90\x30\xf6\x3c\xfc\x5f\xde\x89\xa1\x1f\x8b\x25\x32\x52\xee\x66\x41\x53\xd7\x4a\x79\xe3\x28\x1e\xce\xc6\x0f\xaa\x1a\x38\xb1\x58\x31\x57\x40\xde\x46\xac\x3b\x58\xb6\x5b\x3a\x16\x4b\xcc\xaa\x9a\xec\x6a\x36\x96\x93\xf4\x9c\x94\x37\xee\xde\x1c\x1f\x11\xc0\xc8\xdb\xd3\xc5\x72\xba\xa6\xc1\x15\xbb\x8d\x54\xfc\xfe\x72\xf5\xbc\x71\xaf\x6d\xe0\xe2\x83\x8b\xaf\x47\x5d\x7c\xd9\x02\x9d\x17\x28\x7c\x86\xa6\x38\x0a\x3f\x41\xc7\xe8\x68\x13\xf0\x72\xa1\x22\x55\xd6\xc2\x31\x73\x07\x30\xf2\x8d\xa4\x3f\xca\x7e\x80\xdd\x2f\x2c\x86\x63\xcd\xa9\xe5\x29\x2a\xec\x1d\x49\x7a\x3a\x4c\xd0\xb8\xa1\x92\x6e\x9a\x5a\x74\xca\xb9\x7d\x74\x98\xfd\xf0\x36\x7a\xa8\x46\x01\xd9\x66\xe4\xbf\xd8\x88\x0a\xef\x25\xd5\x58\xf7\x76\x81\x00\xef\x5e\x7e\xb9\x1a\x75\xe6\x9a\xca\x6e\x46\x87\xbb\x3c\x50\xbf\x3b\x45\x79\x37\xf4\x9a\x05\x4e\x54\xf3\x75\x33\x9e\x02\x6a\xbb\x21\x43\x01\x2a\x1b\xf0\x52\xc1\x4b\x05\x2f\x55\x4f\x7b\xa9\xa0\xb2\x01\x95\x0d\x78\x07\xe0\x1d\x80\x77\x00\xde\x81\xae\xf0\x0e\x64\xd3\x34\xc6\x46\xe3\x7b\x6d\x7d\xde\x5d\x6e\x7d\x5e\x63\xef\x86\xc2\x6e\x5b\x1d\xd2\x42\xfa\x03\xd2\x1f\x5b\x2b\x0f\x83\xbd\x7d\x98\x2e\x08\x0e\x2a\xe5\x8d\xf5\xb5\xa2\x96\x34\xb9\xa0\x18\xef\x65\x30\x0a\x5d\x5d\xab\x48\xc6\x0a\xea\x96\xbc\x7c\x5d\x55\x6f\x7a\xf6\xa4\x3a\xfb\x77\x43\xec\x67\xb7\xd1\x23\xbe\xed\xd9\x20\xf4\x9d\x7d\x8d\x29\x06\x3f\x65\x5e\xea\x8a\xb8\xd4\x94\xfb\x52\x2d\x92\x11\x9e\xe4\x27\x4c\xfa\x75\xd7\x24\x9d\xf5\x3a\x71\x5e\xd1\x2b\x60\x9f\x4d\x6a\x0b\xbf\x25\x9c\x7f\x3e\xc7\x9e\x15\x78\xb3\xde\x43\xa8\xc5\x9e\x26\x33\xad\x37\xa9\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x81\x46\x21\x40\x0c\x0a\x09\x0a\x09\x0a\xd9\x31\x0a\xf9\x3b\x43\x74\xc4\xa4\x90\x6b\x15\x55\xcf\x49\x45\xa5\x54\x18\x5b\x1f\x77\x43\x47\xce\x97\xd4\x52\x45\x2a\x96\xd5\xbc\x75\x98\xac\xe9\xec\x5d\x43\xec\xad\xdb\xe8\x01\xd7\x99\x4b\xe6\x99\xd1\xb7\x37\x48\x19\xcf\xda\x6d\xcf\xab\xf9\x49\xbb\xed\x16\x01\xc6\x8c\x00\x8c\x4e\xff\x16\x45\xf7\x02\xae\x8a\xea\x65\x2d\x24\x8c\x85\x70\xc2\x38\xcd\x32\x16\x2d\x74\x1e\x91\x19\x53\x19\xf0\x88\x5c\xbc\x71\x1c\x61\x96\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x60\x89\x9d\x65\x89\x7f\x79\x3f\xed\x33\x1e\xdd\xd8\x7a\x3a\x28\x67\xbb\xac\xe6\xad\x94\xed\xb1\xb2\xa6\xbe\xe9\x36\xfb\xc4\xfd\xec\xbd\x11\xba\x27\xa7\x6a\xf2\xd2\x7a\x3a\xfa\x44\x4e\x2d\x95\x0c\x7b\x75\x66\xe6\xb2\x03\x6c\x2a\x6a\x8c\x1f\x6d\x74\x7c\x5e\xcd\x27\xe3\xe6\x51\x53\xaa\x26\x2f\xa6\xcf\xc8\x15\x27\x23\x7a\x5e\xcd\xcf\x1b\x87\x8e\xf7\x27\xc7\x92\x02\x91\x1d\xa6\xdd\x02\x91\xbd\x86\x1e\xe0\x88\xec\x95\x74\xef\xc7\xfb\xb6\x93\x39\x1f\x42\x71\xd7\xe3\xfe\xb8\x8b\xd8\x76\xb3\x1b\x74\xe3\xe9\x70\xd8\x95\x62\x23\x26\xec\x8a\xc7\x4d\xc6\x65\xf5\xd5\x54\x34\xf5\xd4\xe8\x8f\xfa\x8e\xca\xfc\x33\x0d\x8f\xca\xfc\xda\x5d\x38\x2a\xf1\x1f\x75\x8d\xca\x93\xf6\xa8\x5c\x5c\xa8\x33\x2c\x7b\xbc\xc3\xa2\xea\x77\xe1\xb8\x24\xff\xb5\x6b\x5c\x12\xd6\xb8\x4c\xcf\x9c\x9f\xb9\x3c\x13\x3c\x32\x4f\x7a\x46\x46\xa8\xeb\xde\x7d\x63\x33\xfe\x13\xae\xb1\x19\xb2\xc6\xe6\xe2\xfc\xe5\xb9\x8b\x17\x16\x82\x07\x67\xd0\x33\x38\x66\xc3\x5b\x63\x74\xdc\x77\x1f\x36\x52\x13\xbe\x6f\xd4\xd9\x99\xc9\xe9\x46\xdf\xa8\xb3\xb2\x94\xdf\x1a\xe3\xb2\x91\x59\x93\xf9\x31\xd7\xb8\x0c\xda\x96\x66\xf2\xf2\xd4\xd9\xe0\x81\x79\xc2\x6b\x6a\x8c\x2f\x64\xc8\xc8\x04\xdd\x7b\xfd\x21\xdb\xd4\x91\xc9\x1e\xa7\x09\x76\x24\x7e\xc8\x4e\x8e\x7a\xd8\x9d\x4f\x55\x75\xe6\x66\xa4\x56\x49\xb4\xc4\xae\x45\xbf\xd7\x5a\x37\x4d\xce\x4b\x15\xb1\x45\xbe\x2e\xc7\x9e\xb9\x74\x3e\x66\x5c\x96\xaf\x15\x75\xd9\x5e\xec\xe5\xd6\x34\xcd\xd8\x15\x89\xc7\x69\x6d\x13\x8c\xe7\xab\xe6\x53\x71\xde\x53\xb7\x88\xcd\x6f\x5f\xa3\xd1\x90\xa5\x8e\xb5\x62\x7a\xe3\x9a\x5a\x91\x74\xf6\xa3\xd7\xd8\x0f\x0e\x3a\x33\x6a\x6f\xfd\x5a\xad\x16\xbe\x7e\xda\x38\x59\x14\x6b\x15\x73\xca\x25\xfd\xe2\x3e\xa4\xcb\xbd\x94\x28\xd6\x0a\x1f\x1d\x8a\xb5\xc2\x47\x07\x1f\x1d\x7c\x74\x3d\xe4\xa3\xeb\x22\x3d\xfa\xae\xf1\xd1\x41\x28\x1d\x3e\x3a\xf8\xe8\xe0\xa3\x83\x8f\x0e\xc5\x5a\xa1\xe4\x7c\xf7\xb8\xd4\xba\x5e\xc9\x79\x4b\x16\x6b\x7d\x03\xcd\x08\x0e\x78\x92\x8e\x73\x0e\x78\x88\x0e\xd0\x78\x60\x8d\xc3\x9c\xaa\xc9\xa9\xf5\x74\xca\xc3\x86\x5a\x52\xa2\xf5\x62\x38\x46\x1c\x61\xc9\x6a\x8c\xe8\xe9\x87\xd7\x91\xf3\x9d\xed\x0e\x0c\xb3\x8b\xb0\x56\x71\x2f\xb3\x08\x6b\x67\xc8\x97\x00\x55\xd3\x94\xa1\xd3\x55\x45\x58\xf7\x51\x6a\x63\x23\x8e\x42\x5d\x28\xbd\xda\x64\xe9\xd5\xbf\xe9\xa3\x33\xa2\xb6\xe9\x69\x3a\xe9\xaa\x6d\x3a\x4e\x1b\x9e\x85\xc1\xbe\x85\x49\x61\x53\x26\xe8\x08\xb7\x29\xcd\xb4\x3d\x2b\x4a\xba\x9e\xa2\x13\x4e\x49\xd7\x26\xda\x69\xb4\xb8\x6a\xab\xcd\x4f\xf2\x8b\x23\x8e\xf9\x89\xfb\x96\x4f\xf5\x9a\x22\xb3\x7e\xaa\x30\x45\x4e\xd1\xd4\xce\x18\x25\xd4\x4f\x05\x8e\x05\x8e\x05\x8e\x05\x8e\x45\xfd\x54\xd4\x4f\x45\xfd\x54\xd4\x4f\x85\x5b\x00\x6e\x01\xb8\x05\xe0\x16\x80\x5b\xa0\x25\x6e\x01\xd4\x4f\x45\xfd\x54\xd4\x4f\x45\xfd\x54\x78\xdd\xe0\x75\xdb\xe2\xf5\x53\x5b\x4d\x8a\x37\x54\x2c\x75\xeb\x95\x0d\x61\x1f\x49\xd0\x90\x10\x00\xcb\x2b\x7a\x4e\x35\x96\x3b\x4e\xe9\x81\x31\xb9\x94\x2f\xab\x4a\xa9\xa2\x17\x95\x9c\xac\xb3\xb7\x25\xd8\xdf\xf7\xd3\x4e\xfb\xc8\x06\x22\xd9\x67\xcc\x16\x16\x8c\x16\x92\x23\xc6\xc1\xd3\xd6\xe9\x8b\x69\xcf\xaf\x5b\x4d\x7a\x4b\xa6\xac\x98\xda\x53\x34\xc9\xa7\xf6\x31\x3a\x4a\x87\x03\x1d\x20\xce\xf8\xae\xa7\x53\x9e\x1b\x6f\x89\x87\xf6\x5a\xf8\xc4\x9f\x60\x47\xcc\x89\x5f\xfd\xac\xcd\xd7\xc0\xd3\x2b\x6f\xd2\x07\x22\xf8\x11\xc1\x0f\x95\x2d\xb8\x8c\xe0\x32\x82\xcb\xa8\x77\x5c\x46\x50\xd9\x82\xca\x16\x50\x3d\x50\x3d\x50\x3d\x50\x7d\x57\xa0\x7a\xa8\x6c\x41\x65\x6b\xab\xc0\x49\xa8\x6c\xb5\x43\x65\xeb\x67\x87\x68\xbf\x00\x76\xda\xb2\x94\x4b\x59\xa0\xa8\x4e\xd1\x50\x4d\x2d\xca\x3a\xfb\xeb\x04\xfb\xb3\x01\x7a\xc8\x38\x69\xd2\x7d\x8e\x5d\x18\xb4\xdc\x98\x62\xff\x25\xd5\xf8\x60\xb6\x44\x9e\xff\x20\x3f\xe1\x52\x75\x8f\xcc\xda\x9f\xc6\x85\xa0\xc8\xdf\x42\x45\xfe\xe5\x70\x42\x78\x8a\x9d\x30\x09\x61\xe0\xe4\xb2\x88\xb9\x5a\x94\x6b\x8b\x7f\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x76\x0a\x13\x7e\xbe\x8f\x76\x8c\x99\xcf\x68\x8c\x7d\xb6\x8f\x7d\xa6\x8f\xee\x31\xff\x3f\xfa\xea\x82\x6c\xed\x8a\xf2\xf6\x2b\x99\x7c\x55\x41\xae\x4c\xa9\x79\x7b\xfe\xd7\x70\xb6\x89\x9a\xbf\x6c\x50\xa0\xc4\x0b\xbb\xcc\xeb\xa6\xe6\x4a\x2b\x6a\x18\xe1\x62\xdf\x89\xd0\xa3\x66\xa1\xd2\xb2\x22\xbf\xa9\x22\x97\xf8\xec\x73\xc5\x2a\xb2\xff\x3b\xc2\xfe\x24\x42\xbb\x3c\xbf\x2f\xad\xa7\xa3\xaf\x35\xee\xd6\xb3\x76\x10\x4f\x25\xf9\x68\x41\xae\x4c\xba\x8f\x5e\x4c\x4f\xce\xcf\x59\xbb\xd5\xd6\x81\xc6\xda\x71\x9b\xa8\x69\x68\xa2\x91\x86\xb2\xe5\x60\x51\x87\x67\xc4\x73\xb8\x40\xe7\xf9\x73\x98\xa5\x69\xca\x34\x01\x1d\x5d\x03\x70\x5e\xd1\x2b\xd6\xf0\xff\xc6\x10\xa5\xc5\xf0\x2f\x73\xa6\x1c\xac\x7b\x7c\x43\x5d\xb6\x4a\x3c\xb0\x1f\x1c\x62\xbf\x1f\xa1\xed\xfc\x14\x2e\xf4\xa2\xc9\x52\xbe\x0a\x64\x64\xd5\xe5\xe4\x83\xc6\xdf\x33\xc6\x51\x6e\x9d\x97\xac\xba\xdc\x5a\x21\x85\xec\x02\x1d\x11\xa3\x94\xa6\x31\x3e\x4a\xc3\x94\xa0\x27\x03\x23\x36\x79\xbf\x8d\x41\xc9\xaa\xcb\xa1\x08\xf6\x6c\x38\x5d\x7d\x92\xed\xf1\x91\x66\xe7\x57\x31\xa9\xaa\x71\xa1\x1b\x8f\xf8\xc3\xdc\x57\xb0\x81\x82\x5c\xa1\xe8\xbb\xb6\xbb\x46\xf4\x21\x4d\x2e\x17\xa5\x9c\xec\x33\xa8\x0f\x9b\x3f\xb5\x7f\x5c\x33\x3c\xf0\xb5\x4a\x35\xa7\xd1\x81\x45\x56\x36\xc4\x72\x9a\x14\xcb\x79\x4f\xdf\x1d\xbc\xcf\x27\x84\x82\x8d\xf1\xbd\xb2\x15\x6c\x3a\x6e\x0e\x02\x4c\x80\x27\x01\x21\xd8\x1c\x94\xd7\x2a\x94\xfc\xc6\x7d\x2e\x73\xb0\xd3\x4c\x81\x92\xb8\x05\x88\x8a\xff\xeb\x80\x01\x68\x8f\x42\x0d\x2c\x43\x88\x65\x80\x4a\x42\x47\x54\x12\x90\x1e\x8b\xf4\x58\xa4\xc7\xb6\x2b\x3d\x36\xfb\xe9\x3e\xba\x24\x34\xef\xce\xd1\x9c\x4b\xf3\xae\x4d\x99\x82\xad\x4d\x48\xb4\xbe\xf7\x31\xff\xaf\xf4\x0e\x76\x8f\x18\x26\x6a\xdd\x8a\x20\xf3\xd2\xbd\xae\x4f\x7e\xbc\x2c\x69\x15\x85\x3b\x73\x05\x41\xf0\xd9\x0a\x3c\x54\xe6\xce\xfa\xb6\xae\x03\x1e\xae\x6e\x68\x94\x5f\x74\x2f\xdf\xee\xee\x76\xff\xb8\x2a\x6b\x05\xd9\xfd\xeb\xa0\xfb\x57\xbd\xa2\x49\x15\xb9\xa0\xe4\x46\x6b\x8e\xf3\xb4\x62\xfc\xfb\xb6\xf9\xab\xd1\xcb\x8c\xb1\xf3\xcd\x56\x6d\x42\x26\xe8\x48\x13\x4f\x96\x17\x6e\xc2\xea\x23\x6c\xf5\xf1\xd1\x7e\xfa\x70\x3f\xfb\x50\x7f\xf4\xe7\x6d\x13\xfe\xf6\xfe\xde\xd9\x97\x54\x79\x83\x8c\x71\xe6\xd1\x0d\xdc\x63\x69\x4c\x4e\x27\xc6\x69\x28\x60\xe2\x0e\xf3\x2f\x91\x08\x86\x91\x8a\xfc\x4c\x63\xc9\x25\xce\xe6\x47\xf0\xe5\x8f\x1e\x1b\xca\xea\x6a\x69\x5e\x04\xfb\x3c\x65\xbc\x16\xe6\xbf\x17\xac\x97\xc5\xf9\xe3\x70\xf0\x86\x29\xf3\x52\x1f\xbd\xd8\xc7\x5e\xe8\x8b\x7e\xce\x06\x99\x1f\xec\x9b\x55\xb5\x1c\x5f\x99\x15\x54\x3e\xec\x6a\x2c\xbe\x62\xfc\x29\x1e\x9b\xf4\xdc\x05\x47\xd4\x62\x11\xb5\xa6\x3b\x61\x0d\xa3\x52\x8e\xdf\x38\x0f\x16\x29\x2a\x39\xf3\x23\x29\x17\xf3\x7a\x4c\xbd\x65\x8e\xa9\x08\xa6\x28\xcb\x6a\xb9\x28\xa7\x62\xe2\x8a\x3c\x3a\xcb\x7a\x96\x1c\x15\xfb\x0e\x80\x7d\xf9\xf8\x36\xde\x2d\x4f\xa4\x51\x3b\x81\xce\x63\xfe\x16\x7d\x3b\x7b\x05\xef\x58\x0b\x0d\x7a\x76\x1f\xa5\xd8\x48\x3c\x69\xe7\x8d\xdf\xe7\xae\xa8\x96\x55\x97\x37\xa3\x8a\x5a\xcb\x33\xcd\x3f\x33\x42\x53\x02\x21\xe6\x64\xcd\xe4\xda\xb2\x5e\x1d\xb2\xea\xfe\x4d\x29\x94\x94\x52\xc1\x9a\x00\x16\x54\xfc\x9f\x7b\xd9\x1f\xf5\xd3\xab\xdd\x07\xda\x31\xac\x23\x3e\x80\x71\xca\x39\x70\x41\xb4\x78\x49\xb4\x98\xdc\x67\x1c\xed\xfa\x59\x37\x23\x4f\x03\xcf\x68\x31\x8e\x5c\xa3\xe7\xc4\xec\x5d\xa0\xa7\xf9\xec\x35\xd6\x3f\x67\x82\x15\x74\xdd\xc3\x66\xde\x71\x2a\xb0\xaf\xa1\xf3\xbb\x3e\x66\xbc\xf1\xc6\xf0\xd9\x7d\x81\x9d\x37\x67\xb7\xcf\x13\x35\xe7\x7a\x70\xff\x6a\x82\x47\xa3\x7f\xbc\x23\xe0\xb1\x8e\xf9\x53\xce\xe0\x27\xbb\xdf\x3c\x61\xf3\x1e\x6e\xe6\x1a\x7d\x2f\xbd\xae\x6a\x39\xd2\xba\xa7\x8b\xd5\x09\xa8\x69\x93\xd4\xf4\x4f\xfa\xda\x6a\x76\x96\x04\x57\x7d\x96\x16\x1d\xae\xda\x51\xbb\xd6\x98\xe1\xda\xb0\x75\xaa\x63\xe9\xc2\x10\xed\x17\x77\x05\xd8\xb5\xb8\x8d\x6b\x83\x4d\xd9\xb8\xa9\x3c\xbe\x79\x96\x0c\x70\x17\x70\x17\x70\x17\x70\x17\x70\x17\x70\xb7\x19\xb8\xdb\x5a\x01\xb8\x4e\xa2\xe2\xc6\xe1\x6e\xe7\x17\x1d\x99\x2f\xee\x0c\x58\x55\x1c\x09\x21\xc2\xc1\x6b\x8d\x34\x27\x1b\x9b\xb3\xd4\x00\x3f\xee\xb5\x05\x0e\xf8\x31\xf8\xf1\x26\xf3\xe3\xcd\x25\x70\xa1\x84\xb9\xf3\x0c\x2e\x3b\x4b\xd3\x2c\x13\x3f\x6d\x83\xe5\x27\xdd\x28\x3a\xb0\xa1\x5a\x40\xdd\x72\x7c\xfc\x7c\x1f\xdd\x37\x56\x54\x0b\xfa\xd8\x3f\x29\xaa\x05\xa3\x6f\x6f\x61\x2a\x3b\x42\x03\xc6\xdf\x92\xaf\x2a\xaa\x85\x59\xa5\x28\x9f\x95\x4a\xf9\xa2\xac\x65\x1f\x0a\x1b\xfc\xec\x7e\x4a\xb3\xb1\xf8\xa8\xc3\xdc\x8d\xff\x5a\x31\xdc\x45\xb5\x10\xbf\xc7\xbc\x8c\xeb\xae\xd8\xbf\x79\x03\xcd\x99\x51\xc8\x6b\x15\x55\xcf\x49\x45\xa5\x54\x18\x5b\x1f\x37\x06\x6f\x3c\x28\x22\x96\x5f\xd8\x30\x20\xc5\xb2\x9a\xb7\xce\x93\x35\x9d\xfd\xfe\x12\x7b\x79\x90\x1e\x70\x35\xb5\x64\x36\x15\x3d\x58\x5f\x55\xf5\xac\xdd\xe4\xbc\x9a\x9f\xb4\x9b\x4c\x1e\x36\x4e\x9b\x74\xda\x5b\x14\xcd\x39\x2e\xdf\x80\x13\xbb\x5c\x53\x21\x03\x59\x01\xc8\x0a\xa0\x60\x1d\x64\x05\x20\x2b\x00\x59\x81\xde\x91\x15\xe8\xa2\x7a\x6c\x5d\x23\x2b\x80\x42\x61\x90\x15\x80\xac\x00\x64\x05\x20\x2b\xb0\x19\x85\xc2\x7a\x5a\x05\x00\x95\x8c\x7a\xb9\x92\x51\x66\x0b\xaa\x00\x64\xd7\xe9\x7b\x05\xdf\xbc\x4c\x97\x38\xdf\x3c\x4f\x59\x3a\x1b\xc8\x37\x5d\x24\x2a\x65\x92\xa8\x54\x00\x31\x6a\x49\xcd\x9a\x42\x38\xdf\x9c\x66\x19\x93\x6f\xba\x3a\x67\x72\xcd\x80\xae\xb9\xa8\xa6\xb8\x07\x8a\xff\x38\xf9\x63\x36\xf3\x8b\x15\x93\x02\x89\xda\x51\x71\xc4\x66\x32\x35\x81\xc0\x9e\xa3\x67\x69\xb1\xca\x3d\x35\x4b\xd3\xad\x78\x96\x70\x55\x21\x98\xb0\xc9\x60\xc2\x8f\x46\x82\xf3\xac\xae\x08\xd3\x33\x4f\x17\xb8\xe9\x39\x4b\x2d\x9a\xae\x74\x55\x84\x18\x3e\x43\x0b\x4e\x88\x61\xeb\x5a\xbf\x26\x02\x0c\x16\xe9\xb2\x2b\xc0\xa0\x65\xcd\x5b\xa6\xb1\x53\xa6\xaf\x8e\x0d\x2e\xab\x7a\x85\x92\x3f\x36\xea\x6f\x1a\x47\xcc\x88\x12\x57\x78\x8e\xba\x12\x68\x26\xa7\xc4\xd1\xb5\x66\x72\xca\x3e\xbd\xd3\x06\xb3\x3d\x61\x8b\x80\xd0\x80\xd0\x80\xd0\x80\xd0\xbd\x03\xa1\xb1\x38\x0c\x59\x1c\x76\x0f\xa5\x47\xc8\x78\x47\x42\xc6\xe1\x0c\x81\x33\x04\xce\x10\x38\x43\xe0\x0c\xe9\x69\x67\x08\x32\x87\x90\x39\x84\xcc\xa1\x76\x65\x0e\xc1\xd7\x08\x5f\x63\xaf\xfa\x1a\xb3\x85\x0e\xab\x97\x75\x8c\x46\x27\xfd\x69\xf4\x03\xec\x7e\x61\x36\x1c\x93\x4e\x5b\x51\xe3\xe6\xcf\x13\x34\x28\xf2\x03\xf4\x8a\xaa\x49\x05\xd9\xa5\x4f\x2e\x8a\x31\xe6\x74\xa5\xa4\xe6\x65\x9d\xfd\x4a\x82\xfd\xe2\x00\x91\x79\xdc\xd2\x7a\x3a\xaa\x37\x56\x80\x71\x6a\x61\xee\x82\x9a\x6f\x55\x0d\xc6\x87\xf8\x09\x0b\xa2\x17\x8b\x69\xb3\xf1\xf3\x4a\x0b\x53\xfb\x7a\xad\xce\xe2\x33\xe1\x2f\xd3\x38\xdb\x67\xbe\x4c\xde\x79\x62\x25\xec\x88\xa7\xe0\x15\x89\x42\x0e\x04\x72\x20\x50\x5a\x11\xee\x27\xb8\x9f\xe0\x7e\xea\x1d\xf7\x13\x4a\x2b\xa2\xb4\x22\xb0\x3f\xb0\x3f\xb0\x3f\xb0\x7f\x57\x60\x7f\x94\x56\x44\x69\xc5\xad\x02\x3a\x51\x5a\xb1\x1d\xa5\x15\xbf\x15\xa1\x47\x02\x20\x9f\xd0\xb0\x66\x7c\x42\xd3\x7d\x0e\xdb\x13\xc2\x5c\x81\x85\x08\x1f\x29\xc8\x15\x1b\xc1\xf1\x63\x51\x87\xd0\xbf\x0e\xe1\x0f\x3c\x2c\x44\xc4\xeb\x14\x20\xb4\x22\xcc\x4a\x95\x75\xb5\xb8\xb6\x2a\xe7\x8a\x92\xb2\x6a\xa9\x87\x8f\xe9\x9c\x7b\xb3\xdf\x8c\xb2\x0f\xf4\xd3\x3d\x39\x55\xe3\xe8\x75\x9c\xeb\x86\x8b\xdf\xac\x69\xee\xac\x79\xe6\xed\x16\x17\x79\x8b\x53\x46\x8b\xc9\x31\xae\x1e\xae\x6a\xb2\xbb\xa4\x86\xef\xa1\x82\xb5\xb7\x58\x3c\x3c\x4f\x73\x62\xa4\x33\x74\x9a\x8f\xf4\x04\x1d\xa1\x43\xc1\xd2\x45\xaa\x26\x73\x6d\x32\xbf\x0e\xde\xa9\x56\xf8\x95\x70\xe2\x79\x80\x8d\x9b\xc4\x33\x1e\x37\x29\xa7\x7f\x57\xdc\xcc\x33\xfa\xd6\x1d\xce\x33\x3a\x68\x89\x80\x6f\xec\x31\x8d\x5b\x52\xe0\x9b\xf5\xa4\x32\x3c\xe7\xaa\x2a\x73\xa7\xe9\x47\x85\x70\x4c\xe4\xea\x34\x99\xab\xf3\xc9\xbe\x56\x9a\x8c\x0b\x22\x09\xe7\x0c\xcd\x38\x49\x38\xed\x34\x41\xed\xb2\x31\x21\xe2\xdd\x99\xf7\xef\x74\x4c\xd0\xc9\x1a\x65\xcd\x8d\xd9\xa2\x7d\x42\x5f\x73\x33\x2c\x11\xe4\x35\x7b\xcd\x0e\x42\x5e\x13\xf2\x9a\x9b\x2c\xaf\xd9\xd1\x35\x6a\xdb\x3e\x10\x61\x32\x9d\xd9\x0c\x9d\x66\x27\xe3\xc7\xed\x40\x95\xc7\xdd\x9a\x99\xbe\x17\xb8\x2b\x0a\x3a\xfd\xab\x7e\x2b\xd8\x45\xca\xaf\x2a\xdc\x8f\xae\xc9\x05\x85\x7f\x21\x8c\xbd\xb3\xab\x34\xff\xd7\x23\xec\x2f\x22\xf4\xa0\xef\x71\x75\x4b\xf4\x0f\x16\xe4\xca\xa4\xdf\x59\x5b\xa0\x54\x7f\x7b\x76\xc2\x61\xef\x01\xfb\xe2\x10\x65\xcc\xc7\x52\x56\xe4\x37\x55\xe4\x12\x87\x49\xd5\x90\xc2\x0c\x47\x5a\xd3\x2b\xea\xaa\x35\xde\xae\xbe\xb1\x77\x0d\xb1\xb7\x6e\xa3\xd7\x78\xda\xb0\x49\xc6\x3f\xef\x6b\x30\x56\x89\x37\x6f\x75\x7f\xda\x6e\xbe\x45\xc1\x4b\x07\xf9\x09\x93\xee\x2e\x5a\x82\xe5\x01\x17\x46\x60\xd3\x9d\x14\xcd\xb1\x02\x00\x7d\xe6\x95\x15\xb9\x14\x30\xee\xb5\x4a\xc3\x0d\xc5\x52\x21\xe8\x09\x41\x4f\x08\x7a\x42\xd0\x13\x82\x9e\x10\xf4\x84\xa0\x27\x04\x3d\x21\xe8\x09\x41\x4f\x08\x7a\x42\xd0\x13\x82\x9e\x10\xf4\x84\xa0\x27\x04\x3d\x21\xe8\xa9\x53\x41\x4f\x9f\x49\xd2\x62\x50\xe5\x23\x0b\x26\x6e\xb0\xfe\x91\x55\xd0\xff\xab\xc3\xec\x97\xb6\xf9\x89\x10\xa6\xa3\xbf\x6e\x72\x46\x37\x5c\x2c\x59\x56\x2f\xa4\x18\x52\x4b\x18\xe3\x88\xb3\xe2\xe1\xab\x3a\xf3\xfb\x68\x2c\x9a\x9c\xa5\x5c\xc2\xb3\x7a\x76\xb5\x9d\x4a\x1e\x11\x84\xb2\x5a\x16\x31\xbd\xd5\x2b\x32\x6d\x0a\xa4\xec\x4c\x96\x72\x5d\x8f\xcf\x2d\xe1\xf1\x01\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\x04\x96\xec\x2c\x96\x9c\xa6\x0c\x3b\x1d\x3f\x69\x47\xcd\xed\x71\x47\xde\x05\xec\xf7\xee\x86\xd8\x3b\xe0\x53\xe0\x53\xe0\xd3\x2d\x84\x4f\xff\x3e\x41\xe3\xc1\xf8\x34\xb0\x42\xfc\xaf\x27\xd8\xc7\x07\xfc\xd1\x68\x93\x15\xe2\x4f\xf8\x56\x88\x4f\x07\x1c\x3e\xab\x6a\x93\xc5\xa2\x0d\x2b\x5b\x17\x67\xdb\x26\x2a\x79\xc7\xf5\xce\xd2\x77\x41\xbd\x33\x68\xc5\x81\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x82\x4f\x22\x6c\x12\xdc\x0f\xdc\x0f\xdc\xaf\x73\xdc\xef\xcf\x1e\xa6\x33\x82\xfb\xe5\x64\xcd\x6c\x45\x76\xe5\x62\x7b\xfe\xac\x14\x4a\x4a\xa9\x60\xd9\x69\x4b\xb1\x4c\x2a\x97\x35\x75\x5d\x2a\xb2\x7f\xf5\x30\xfb\xa3\x7e\xba\xcf\x7d\xc6\xd2\x7a\x3a\x7a\x84\x6b\x97\x59\x47\xd5\x4a\xd1\x4c\x39\xc7\x2f\x88\x2b\x5c\x12\x57\x48\xee\xe7\x0a\x66\xae\xe6\x16\xd3\x81\x07\x4f\x9a\xed\xb7\x58\xc5\x6c\x63\x59\xf2\x29\xcf\x20\xae\xa7\x53\x81\xdd\x0d\x45\x75\xc5\x70\x14\x37\xc7\xce\x98\x28\xce\xe7\xd9\x59\xf9\xce\x81\x1d\x68\x50\x63\xa8\x20\x57\x28\xfa\xe2\x8e\xda\xc7\x7a\xcc\x92\x3b\x6b\xe6\xc9\x1e\xb2\x44\xcf\x36\xf3\xe1\x66\x9e\xa5\x45\xba\x5c\x25\xf9\xd3\x92\xa7\x0b\xf1\x1f\x88\xa0\x35\x29\x82\xf6\x7b\x7d\xed\xb2\x38\xcf\x09\x41\xb4\x05\x7a\xda\x11\x44\xeb\x94\x35\xab\xaf\x61\xd6\x59\x63\x97\xf9\xe2\xce\x5a\x6b\x36\x5d\xa3\x9c\xd6\x8c\x59\x3b\x20\xf4\xd3\x36\xcb\xa8\x41\x43\xad\xd7\xcc\x28\x34\xd4\xa0\xa1\xb6\xc9\x1a\x6a\x9b\xb6\x42\x0e\x93\x3d\xeb\xec\x57\x25\x3b\x4b\xd3\x2c\x13\x3f\x6d\x07\x69\x3d\xe9\x0e\xf5\x0a\x6c\xa3\x36\xd8\xab\xe5\x32\x68\x1f\x4d\xd0\x13\x62\x8b\x27\xaa\xa0\x1a\xbb\xba\xb2\x9a\xcf\x2b\xba\xb6\xc6\xa7\xfd\xf2\x5a\xbe\x20\x57\x74\xf6\xfd\x09\xf6\xed\x7e\xda\x21\x8e\x32\x3e\x8a\xe9\xfa\x21\x1c\xf3\x6a\x7e\xda\x6e\x24\xc3\x1b\x49\x8e\x19\xa7\x88\x5a\xa9\x8b\x69\x9f\x03\xb6\x5a\xc0\xc6\x75\x7a\x4a\xcc\x6e\x63\x56\x1b\xb3\xfb\x24\x1d\xa7\x89\xc0\xd9\x6d\x96\xc6\x35\x3e\x60\xb5\xf7\xde\x92\x10\x8d\xd7\x85\x4f\xea\x43\xec\x80\x39\xa9\x45\x77\x2c\x25\xc1\xda\x1e\xa1\x80\x1f\x82\x32\x10\x94\x81\xa0\x0c\x04\x65\x20\x28\x03\x41\x19\x08\xca\x40\x50\x06\x82\x32\x10\x94\x81\xa0\x0c\x04\x65\x20\x28\x03\x41\x19\x08\xca\x40\x50\xc6\xa6\x04\x65\x7c\xe8\x1a\xed\x0d\x2b\x22\xa7\xe6\x2b\xf2\x6a\x99\x6f\x2e\xd8\xb7\xae\xb2\xe7\x07\x9d\x2a\x40\xc3\xa1\xd8\xee\xb2\x79\x6a\xf2\x31\xe3\xd0\x9a\x7a\x3f\xce\x01\x5d\x8e\xe7\x32\x40\x56\x40\x56\x19\x20\x2b\x20\x2b\x20\x2b\x20\xab\x9e\x41\x56\x99\xae\x41\x56\x2d\xef\x49\xd3\xc8\x2a\x03\x64\x05\x64\x05\x64\x05\x64\x05\x64\xd5\x79\x64\x95\xe9\x69\xc2\x94\x01\x61\x6a\x1f\x61\xca\x74\x3b\x61\xca\x6c\x41\xc2\x94\x7d\x3d\x4d\x89\xb0\xa6\xe3\x34\xc1\xc3\x9a\x0e\xd0\x38\xed\x0b\x2f\x7c\xea\x90\xa1\x96\x04\x33\x3d\x15\x1e\xcc\x94\x64\x43\x35\x25\x51\x9d\x5e\x78\x02\x98\xe2\x7f\xbb\xdd\x81\x60\xaf\x16\xdf\x9c\x98\xe4\xe1\x5d\x8f\x8b\xbf\x76\x82\x78\x09\x40\x95\xa1\xd3\x74\xb2\x2a\x22\x3a\x45\x23\x1b\x19\x69\x44\x41\x23\x99\xa4\xc9\x64\x92\xaf\xf5\xd1\x29\xf1\x9e\x1f\xa1\x43\xfc\x3d\xdf\x47\x1b\x9c\x7d\x34\x2d\xd2\x46\x4e\xd0\x31\x27\x6d\x64\xe3\xad\xcc\x18\xad\x8c\xf3\xe8\xc9\xed\x93\x39\xe3\x6b\xd1\x54\x33\x61\x06\xa7\xb5\x06\xa5\x8e\xfd\x2a\xab\x7a\x85\x92\x9f\x1f\x71\x0c\x8e\xb9\x9c\x8d\xe5\xd4\xa2\xb1\x39\x35\x3f\x36\x6e\xe3\xb3\x57\x1c\x21\x8c\xcf\x94\x7d\x58\x27\xcc\xd0\x65\xba\x44\xf3\x6e\x33\x94\xcc\xd0\xe9\x26\xd2\x32\xa6\xf9\x1d\x5c\xe4\x38\x55\x07\x78\x05\x78\x05\x78\x05\x78\xed\x21\xf0\x8a\xa5\x58\xc8\x52\xac\x7b\xc8\xf4\xcb\x11\xfa\x6a\x84\x7d\x25\x12\xfd\xb2\xfd\xa8\x3e\x16\xb9\xec\xde\x0b\x2a\xa5\x98\x2e\xf6\x73\xb1\x65\x79\x45\xb8\x71\x6d\x66\xe2\x7c\xb2\xcc\xb7\x84\x0f\x96\x6b\xd1\x57\x52\x4b\xa3\x25\xb9\x20\xf1\x47\x62\x6e\x07\xdd\x8b\x43\x41\x4f\xed\xc9\x60\xae\x0e\x94\xd5\x55\x39\x6f\x2c\x3f\x8b\xb7\x1d\xff\xaa\x63\xda\x95\xe2\x88\xb9\x4b\xe4\xb7\x1b\x2b\x68\x52\x8e\xcf\x13\x45\xcd\xdb\x1f\x1e\xe7\xe3\xc0\x5d\xd7\xd6\x73\x59\xd3\x8d\x4e\xba\x07\x4a\x32\xce\xb4\x6e\xc8\xbc\xc8\x8a\x78\xdf\xac\x26\x52\xa2\x9f\x22\xa7\xcc\xa7\x8f\x71\xc6\xbb\x30\xcf\x7b\xe0\xb7\xfb\x85\x03\x00\x0e\x00\x38\x00\xe0\x00\x80\x03\xa0\xa7\x1d\x00\x5f\x88\xd0\x4b\x11\xf6\x62\x24\xfa\x82\xfd\xb5\x7d\x7f\x64\xda\x55\xdf\xb0\x5c\x94\x25\x5d\xb6\x5f\xfd\x79\x4d\x2d\x4b\x05\xfe\x1d\x16\xd9\xa2\x9e\xf0\x1f\xeb\x71\x3b\x05\x12\x8d\x07\x9e\x4e\x1d\x4e\xc5\x16\x84\x1d\x11\x1f\xc9\xb2\x5c\x32\xa6\xa9\xf3\x15\x91\x63\xaa\x56\xbe\x2e\x95\xac\x70\x24\x6d\x4d\x1e\x5b\x91\x8a\xd6\xea\x3f\x2e\x7e\x8d\xc7\x56\x94\x92\x54\x54\xde\x6c\x99\xef\x65\x39\x26\xe5\x39\x4d\x57\xc7\x04\x5c\xcd\x3b\x4b\x4b\xd1\x78\x42\x77\x4e\x12\xeb\xed\x54\x6c\x46\xe1\x26\xc9\xd5\x71\x55\xab\xbd\x33\xc7\x83\x51\x11\xcb\x7d\xbe\xfa\x53\x2b\xd7\x53\xf1\x5d\xa2\x3f\xd3\xd6\x8d\x78\xe3\x9a\xde\x39\x40\xef\x18\x60\xcf\x0f\x44\xbf\x6b\x07\xb7\x7d\xa9\xff\x8a\x69\x07\x8d\x29\x7a\x5d\xbd\x15\x2b\x48\xda\xb2\x54\xf0\x60\x07\x7b\xa1\x26\x6b\x2b\xaa\xb6\x6a\x8c\x85\x6f\x4f\x2f\x56\x5d\x3c\xb8\xa3\x7c\x59\x63\xad\x49\x44\x52\xa9\x31\x23\xf2\x72\x4e\xc9\x3b\x0b\x6b\xfe\x6d\x14\xa9\xe7\xd6\xe8\x1a\x1f\x27\xf3\xcb\x61\x7d\xfd\x52\xae\x61\xb4\xec\xa6\xed\x36\xb0\x43\xda\xbc\x17\x4b\xc5\x04\x33\xe2\xb6\xd8\xbd\x5a\x4d\x88\x7b\x48\x18\x7b\x1e\xfe\x2f\xef\xc4\xd0\x8f\xc5\x12\x19\x29\x77\xb3\xa0\xa9\x6b\xa5\xbc\x71\x14\x8f\x25\xe3\x07\x55\x0d\x9c\x58\xac\x98\x2b\x20\x6f\x23\xd6\x1d\x2c\xdb\x2d\x1d\x8b\x25\x66\x55\x4d\x76\x35\x1b\xcb\x49\x7a\x4e\xca\x1b\x77\x6f\x8e\x8f\x88\x1e\xe4\xed\xe9\x62\x39\x5d\xd3\xe0\x8a\xdd\x46\x2a\x7e\x7f\xb9\x7a\xde\xb8\xd7\x36\xf0\xaf\xc1\xbf\xd6\xa3\xfe\xb5\x6c\x21\x90\xfa\xd2\x79\x01\xb7\x67\x68\x8a\xc3\xed\x13\x74\x8c\x8e\x36\x41\x35\x17\x2a\x52\x65\x4d\xb7\x18\x72\xd2\x1f\xfa\x3e\xc0\xee\x17\x6f\xb3\x63\x69\x1b\x75\x60\xb9\x99\x72\x3d\xf6\xbc\x05\x0b\xfd\xb0\x7f\x48\xd2\xf1\x90\x58\x75\x4d\xb6\x29\xb5\xb1\x48\xd3\x8c\xf1\x73\xaa\x2b\x7f\x2a\xc9\xfe\x65\xbf\x83\xd1\x87\xb8\x5a\xa0\x77\x9b\x7b\xc9\x69\x60\xca\x6e\x20\x39\xcc\xd5\x01\xab\x3c\x79\xbe\x87\xb6\x58\x13\x30\x4f\x73\x62\xde\x65\xe8\x34\x9f\x77\x13\x74\x84\x0e\x85\xfa\x31\x7c\xbb\x16\xea\xd1\xb8\x12\x3e\xc3\x0e\xb0\xf1\xea\x59\xe5\x7f\xad\x8d\x48\xfe\x7d\xc3\xe5\x4b\xdd\x6b\x49\xfd\x35\xf2\x58\x46\x2c\x69\xbf\xce\x3f\x99\x0c\xaf\xa6\x52\xe5\x6d\x6d\xfa\xd1\x00\xf6\xc1\xef\xda\xa4\xdf\xf5\x93\x7d\xad\x34\x11\x17\x84\x07\xf6\x0c\xcd\x38\x1e\xd8\x76\x9a\x9c\x10\xb1\xbe\x76\x59\xa4\xe4\x07\x76\x39\x26\xe7\x51\x73\x25\x2e\x05\x58\x19\x8f\x2f\xb5\xb3\x46\xa6\x3d\xbe\x54\x18\x9b\x10\x63\x03\x9e\xdf\x11\x9e\x0f\x90\x03\x90\x03\x90\xd3\x2e\x90\x93\xfd\x74\x5f\x6b\x37\xad\x74\x49\x04\x56\x9d\xa3\x39\x57\x60\xd5\x1d\xb6\x19\xb6\x40\x88\xf9\x2f\x10\x76\xb0\x7b\xc4\x30\xb5\x6f\x8d\x90\xf9\x91\x9d\xce\x1a\xe1\x40\x8d\x66\x6f\x23\xfb\x93\xa4\xd0\xe8\xed\xec\xc2\x01\xca\xbc\xbd\xb6\x5c\x81\x32\x2f\x94\x79\x37\x59\x99\xb7\xa3\x9c\x2a\x54\x8d\xb7\x5d\x9f\x84\x6c\x86\x4e\xb3\x93\xf1\xe3\x36\x34\x7d\xdc\x2d\xbc\xeb\x7b\xfe\xdd\x50\x61\x9d\xbd\x27\x49\x57\xcc\x8a\xcd\xf9\x55\x85\x2b\x36\x68\x72\x41\xe1\x5f\x08\x45\x2d\x39\x25\x5c\x44\x09\x67\x4e\xef\xc7\xb8\x61\x95\x8c\x59\x78\x4b\x5e\xbe\xae\xaa\x37\x3d\x91\x9f\x36\x93\xfd\xe5\x61\xf6\x9f\xb6\xd1\x23\xbe\x0d\x2f\x99\x2d\x46\x3f\xd7\x67\x7a\x04\x9c\x04\x17\xc3\xda\x88\x81\xb3\xc4\x46\x16\xed\x0b\x5e\x11\x17\x9c\x72\x5f\x30\xe5\xda\x18\x4c\xd8\x5b\x8a\x04\x6f\x37\xe1\xc4\xde\x7a\x82\x29\xd5\xb2\x6c\xef\xf7\xf4\x8a\x2c\xe5\x47\x9c\xa0\x13\xbe\x47\x32\x43\x14\x94\x8a\xbc\xea\x98\xd3\x84\x27\x4e\xcc\xd5\x76\x2a\x79\x8a\x5f\x6e\xd2\xef\x5e\x17\xc5\xad\xd6\xbf\x89\x2e\xd7\x48\xc9\xde\xa4\x79\x61\x06\xe6\xe8\x0c\x37\x03\x93\x74\x8a\x4e\x34\xf1\xe5\xe7\x39\x4d\x33\xeb\x72\x29\x3c\xf1\xe7\xfb\xc2\x5f\xf6\xab\xec\x39\xab\x90\x74\x9d\xf9\x6b\x9a\x81\xfa\x4f\xc0\x6d\x0f\x44\x81\xe9\x3a\xe6\x88\x8f\x0c\xc4\x8e\xa1\x1c\x03\xb1\x63\x24\x30\x20\x81\x01\x09\x0c\xbd\x94\xc0\x00\xb1\x63\x88\x1d\x23\x70\x1c\x81\xe3\x08\x1c\x47\xe0\x78\x57\x04\x8e\x67\xcf\xd1\x1c\x3b\x13\x9f\xb1\xc9\x4b\xd2\x4d\x6f\xea\x6f\xfb\xda\x5f\x3b\x09\xca\xc9\x88\xbb\x85\x72\xf2\xd6\xd1\xb5\x61\xff\xe2\x5e\x3a\x68\x42\x51\x93\x49\x55\xc1\xd0\x31\x5d\x2e\xae\xe8\x6b\xdc\xba\x69\x6b\x45\x59\x37\x36\x20\xf2\x2d\x9d\x7d\x9e\xe2\x9f\xdd\x46\xbb\x3c\xa7\x2d\xad\xa7\xa3\x8f\xd9\x3a\x32\x0b\x72\x71\x65\x41\x9c\x79\xc9\x38\xf3\x12\x3f\x33\xb9\x57\x1c\x30\xe9\x3e\x71\x31\xed\x7f\x70\x8b\x23\x91\x16\xe9\x32\x5d\xaa\x72\xea\xd5\x89\x45\x4a\x79\xc7\x64\x3d\x9d\xf2\xef\x65\xf6\x67\x22\xc1\x21\xd7\x0b\x82\x25\x9e\xa7\x2c\x67\x89\xd3\xd4\x82\x0b\xd2\xb3\x22\xc2\xed\x69\xba\xe8\x44\xb8\xb5\xa6\xe5\xd7\x09\xf7\xf8\x25\x9a\x77\xb9\xc7\x5b\xd2\x74\xb8\xc6\x11\xd7\x08\xb9\x71\x23\x1c\x85\x9e\x61\x33\x16\x0a\xf5\x99\xb5\x26\x02\x0d\xb8\x41\x8f\x2b\x04\x5e\xd9\xfa\x5e\xd9\x2c\x22\x56\x03\x22\x56\x5b\xee\x9e\x7a\xdb\x30\x1d\x11\x96\x58\xaf\xa8\x9a\x54\x90\xfd\x1d\x52\xe6\x8f\xb9\xa2\xa4\xeb\xb2\xed\x7f\xfa\x8f\x43\xec\x1f\x07\xe8\x3e\xf3\x47\xdb\xe3\xf4\x89\x46\x3c\x4e\x0b\xe2\xa4\x29\xa3\xc5\xae\xf0\x2f\x3d\xc6\x2f\x67\x76\xcb\xf4\x28\xb9\x3b\x09\xff\xd1\x46\xbc\xc9\xc2\x7d\x73\x63\x29\xdc\xaa\x1e\x67\x13\xa6\x55\xf5\xce\x40\xcb\x9e\xba\x1e\x41\xad\x03\x09\xfe\x21\xf8\x87\xe0\x1f\x82\x7f\x08\xfe\x21\xf8\x87\xe0\x1f\x82\x7f\x08\xfe\x21\xf8\x87\xe0\x1f\x82\x7f\x08\xfe\xa1\x0e\xfb\x87\x8e\xd2\x61\x76\x30\xbe\xdf\xf6\x0f\x3d\xe8\xf6\x0f\xb9\xf7\x70\xf0\x06\xc1\x1b\x04\x6f\x10\xbc\x41\x2e\x6f\xd0\x97\x86\xe9\x98\xa5\x4d\x22\x70\x63\x80\x42\x89\xf1\xda\x29\x39\x59\xca\xe5\x8c\xe5\x8a\x8d\x21\x7f\x6c\x98\xfd\xf5\x80\x93\x6f\xf6\xa9\x86\xf0\xa3\x68\x6a\x52\x34\xd5\x15\x00\x72\xcf\x2d\xbf\x8c\x37\x6f\x47\x01\x21\x6b\x21\xe4\x7c\x38\x63\x1c\x65\x7b\x2d\xef\x8c\x7b\x34\xc9\x5f\xf1\x07\x51\xe9\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xa0\x8e\xdd\x46\x1d\x8f\xd1\x51\x76\x38\x7e\xd0\xa6\x8e\x51\x0f\x75\xf4\xec\xf5\xee\x06\x31\x01\x90\x4d\x90\x4d\x90\xcd\x2d\x44\x36\xbf\x39\x44\xe7\x1a\x12\xff\x68\x4c\xf7\x83\xfd\xdb\x21\xf6\x13\xdb\xe8\xc1\x20\xc1\x8f\xe8\x0f\x9a\xe8\x53\x29\xe5\x95\x75\x25\xbf\x26\x15\x3d\x14\xd4\x5e\x08\x77\x40\xee\x23\x95\x3c\x59\x4f\xb0\xa3\x7e\x0f\xce\x2b\x3a\x50\xa7\x0f\xea\x7c\x73\x38\xea\xbc\xc2\x9e\x69\x87\x5e\x07\xdd\xd8\xe3\x0f\x45\x77\x32\xe2\x83\xc2\x2b\x05\x03\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x02\x8c\x76\x18\x8c\x82\x3c\x82\x3c\x82\x3c\xf6\x30\x79\xfc\xfe\x25\x9a\x16\xe4\x31\xaf\xe8\x39\xd5\x30\x7a\xd5\x99\xdd\x01\x41\x96\x72\x29\x5f\x56\x95\x52\x45\x2f\x2a\x39\x59\x67\xff\xfe\xf5\xec\xd3\x83\x74\xbf\xdd\x8a\x9d\xe5\xbd\x57\x2c\x1e\x35\xf3\xb3\x67\xd9\x45\x2b\xc0\x72\xc6\x6c\x66\xc1\x68\x26\xc9\x0f\x9e\xb6\xda\x30\xb3\xab\x9d\x20\x47\xcf\xc1\x5d\x0e\xfe\x32\x60\x5c\x60\x5c\x19\x30\x2e\x30\x2e\x30\x2e\x30\xae\x9e\x61\x5c\x99\xae\x61\x5c\x2d\xef\x49\xd3\x8c\x2b\x03\xc6\x05\xc6\x05\xc6\x05\xc6\x05\xc6\xd5\x79\xc6\x95\xe9\x69\x24\x95\x01\x92\x6a\x1f\x92\xca\x74\x3b\x92\xca\x6c\x41\x24\x95\xbd\x41\x17\x45\xc0\xd4\x59\x9a\xe5\x01\x53\xa7\xe9\x24\x1d\x0f\xd4\xf7\x74\xb8\x95\x49\x9c\x52\x1e\x4a\x74\x5e\xd1\xc3\xe3\xa5\x82\x45\x3f\x79\xb8\xd2\x8d\xe5\xf0\x78\xaa\x53\xec\x84\x19\x4f\x55\x0d\xd2\xcc\x18\x2a\x4f\xaf\x6a\x15\xea\xe2\xbf\xb7\xc3\x8f\x9e\xbd\xd6\xd2\xab\x2d\x55\x91\xb2\x51\xf1\x43\xa7\x59\x99\x40\x5b\x1b\x2c\x3f\x19\xf6\x8c\x50\x7e\x12\xa5\xf9\x9b\x14\x3a\xfd\xa1\x3a\xda\xc6\xe7\x84\x19\x99\xa6\x0c\x37\x23\xc7\xe9\x0e\xa6\xa8\x08\xe2\x4c\xf3\x20\x4e\x5b\xd3\xf8\xce\x5a\x7c\x5a\x68\x19\x67\xe9\xac\x4b\xcb\xf8\x8e\x9a\xb4\xcc\x59\x63\xe6\xaa\x21\xb3\x14\x64\xd3\xc2\x74\x92\x93\xdf\x1e\xf1\x33\x67\x71\xb3\x90\xb3\xab\x2a\xb6\xba\x52\x65\xd9\x0e\x8b\x63\xaa\x2d\xdb\x94\x7d\x4a\x67\x6c\xdc\x65\xba\x44\xf3\x6e\x1b\x57\x4f\x8b\xbb\x4e\xd8\xee\x34\xbf\x9b\x8b\x9c\xf2\xea\xe0\xc1\xe0\xc1\xe0\xc1\xe0\xc1\x3d\xc4\x83\xb1\xb6\x0b\x59\xdb\x75\x0f\x30\x7f\x39\x42\x5f\x8d\xb0\xaf\x44\xa2\x5f\xb6\x1f\xd5\xc7\x22\x97\xdd\x5b\x54\xa5\x14\xd3\xc5\x36\x33\xb6\x2c\xaf\x08\xef\xb2\x8d\x72\x9c\x4f\x96\xf9\x96\xf0\xc1\x72\xad\x22\x4b\x6a\x69\xb4\x24\x17\x24\xfe\x48\xcc\x5d\xaa\x7b\xb5\x29\xa0\xae\x3d\x19\xcc\xb5\x82\xb2\xba\x2a\xe7\x8d\xf5\x6c\xf1\xb6\xe3\xf6\x75\x4c\xbb\x52\x1c\x31\x37\xaf\xfc\x76\x63\x05\x4d\xca\xf1\x79\xa2\xa8\x79\xfb\xc3\xe3\x7c\x1c\xb8\x47\xdd\x7a\x2e\x6b\xba\xd1\x49\xf7\x40\x49\xc6\x99\xd6\x0d\x99\x17\x59\x11\xef\x9b\xd5\x44\x4a\xf4\x53\x54\x07\xf7\xe9\x63\x9c\xf1\x2e\xcc\xf3\x1e\xf8\x6d\xca\xe1\x97\x80\x5f\x02\x7e\x09\xf8\x25\xe0\x97\xe8\x69\xbf\xc4\x17\x22\xf4\x52\x84\xbd\x18\x89\xbe\x60\x7f\x6d\xdf\x1f\x99\x76\x65\xd4\x96\x8b\xb2\xa4\xcb\xf6\xab\x3f\xaf\xa9\x65\xa9\xc0\xbf\xc3\xf3\x6a\x51\xc9\xdd\xf6\x44\x25\x59\x8f\xdb\x49\xc9\x35\x1e\x78\x3a\x75\x38\x15\x5b\x10\x76\x44\x7c\x24\xcb\x72\xc9\x98\xa6\xce\x57\x44\x8e\xa9\x5a\xf9\xba\x54\xb2\xa2\xa4\xb4\x35\x79\x6c\x45\x2a\x5a\xab\xff\xb8\xf8\x35\x1e\x5b\x51\x4a\x52\x51\x79\xb3\x65\xbe\x97\xe5\x98\x94\xe7\x90\x5f\x1d\x13\xcc\x37\xef\x2c\x2d\x45\xe3\x09\xdd\x39\x49\xac\xb7\x53\xb1\x19\x85\x9b\x24\x57\xc7\x55\xad\xf6\xce\x1c\xc7\x4a\x45\x2c\xf7\xf9\xea\x4f\xad\x5c\x4f\xc5\x77\x89\xfe\x4c\x5b\x37\xe2\x0d\xb7\x7a\xe7\x00\xbd\x63\x80\x3d\x3f\x10\xfd\xae\x1d\x73\xf7\xa5\xfe\x2b\xa6\x1d\x34\xa6\xe8\x75\xf5\x56\xac\x20\x69\xcb\x52\xc1\x03\x21\xec\x85\x9a\xac\xad\xa8\xda\xaa\x31\x16\xbe\x3d\xbd\x58\x75\xf1\xe0\x8e\xf2\x65\x8d\xb5\x26\x29\x8b\xbb\x52\x8c\xf5\x42\x4e\xc9\x3b\x0b\x6b\xfe\x6d\xe4\xdb\x1c\x7b\x74\x8d\x8f\x93\xf9\xe5\xb0\xbe\x7e\x29\xd7\x30\x5a\x76\xd3\xf6\x66\xd8\x91\x76\xde\x8b\xa5\x62\x82\x29\x71\x5b\xec\x5e\xad\x26\xc4\x3d\x24\x8c\x3d\x0f\xff\x97\x77\x62\xe8\xc7\x62\x89\x8c\x94\xbb\x59\xd0\xd4\xb5\x52\xde\x38\x8a\x87\xb8\xf1\x83\xaa\x06\x4e\x2c\x56\xcc\x15\x90\xb7\x11\xeb\x0e\x96\xed\x96\x8e\xc5\x12\xb3\xaa\x26\xbb\x9a\x8d\xe5\x24\x3d\x27\xe5\x8d\xbb\x37\xc7\x47\x04\x35\xf2\xf6\x74\xb1\x9c\xae\x69\x70\xc5\x6e\x23\x15\xbf\xbf\x5c\x3d\x6f\xdc\x6b\x1b\xb8\xfd\xe0\xf6\xeb\x51\xb7\x5f\xb6\x40\xe7\x05\xfb\x9e\xa1\x29\xce\xbe\x4f\xd0\x31\x3a\xda\x04\xbc\x5c\xa8\x48\x95\x35\x3d\xd4\x7f\xd6\x09\xe0\x9c\xf4\x07\xce\x0f\xb0\xfb\x85\xc5\x70\xac\x39\x6d\x41\xc9\x1e\xf6\xa1\xd7\xd3\x21\x11\x88\xaf\x2d\x4b\xb9\x54\x50\xbd\xcb\x5c\x71\x4d\xaf\xc8\x9a\xa6\x16\xe5\x65\x63\xa7\x5c\x2a\xe8\xec\x6f\xaf\xb1\xcf\x0d\xd2\xab\x8d\xf3\x26\xab\xeb\x5d\xee\xab\x1f\x7d\x3f\x25\x9a\xbb\xa4\x16\xe5\x8c\x68\x2e\x39\x6c\x9c\x71\xa9\xba\xad\xc5\x74\xed\xa1\x08\xc0\x47\x00\x3e\x02\xf0\xe1\x70\x81\xc3\x05\x0e\x17\x38\x5c\xba\xc6\xe1\xd2\x3d\xfe\x04\x80\x6e\x80\x6e\x80\x6e\x80\x6e\x80\xee\x9e\x06\xdd\x20\x71\x20\x71\x3d\x4a\xe2\xb6\x64\x00\xbe\x4c\x59\x41\x0f\xa7\x68\x92\xd3\xc3\x63\x74\x94\x0e\x07\x06\xa5\x72\x5e\xb5\x9e\x4e\xd5\x02\xa2\x96\xc4\xde\xdf\x0c\x67\x8b\x67\xd9\xac\x89\x0d\x03\xd9\x99\x19\x84\x5f\xdb\x47\x8f\x78\x69\xfc\xb7\x76\x04\x70\xb4\x87\xad\x38\x7c\x3f\x64\xb6\x57\xfc\xd8\x59\x68\x26\x18\xd7\x1c\x9d\xa1\x99\xaa\x48\xfc\x83\xb4\xbf\x89\x87\x85\x40\x2d\x04\xe1\x37\x19\x84\xff\x9d\x3e\x9a\x15\x16\xe3\x14\x9d\xe0\x16\xe3\x30\x35\x37\x09\x45\xcc\x7e\x9a\xc7\xec\xdb\x61\xf6\x4d\x37\x76\x5e\x44\xd8\xcf\xd0\x94\x2b\xc2\xbe\xe9\xd6\x9a\x37\x64\x3c\x22\xbe\xa3\x86\x2c\xf9\x03\xa3\x01\x86\x2c\xe1\x1b\x81\xef\x63\xd4\x0e\x8a\x03\xfd\x8c\x9a\x7d\x6a\xdb\xcd\x1b\x82\xf0\xc1\x84\xc1\x84\xc1\x84\xc1\x84\x11\x84\x8f\x20\x7c\x04\xe1\x23\x08\x1f\xbe\x09\xf8\x26\xe0\x9b\x80\x6f\x02\xbe\x09\x04\xe1\x23\x08\x1f\x41\xf8\x08\xc2\x87\xeb\x0f\xae\xbf\x2e\x74\xfd\x75\x3c\x08\x7f\x03\x01\xf2\x0d\xb2\xe8\x86\x50\x73\x28\xb0\x6e\x7d\xac\xfc\x37\x92\x74\xdc\x98\x60\x63\xeb\x81\xea\xf4\x16\xa2\x28\x55\xd6\xd5\xe2\xda\xaa\x9c\x2b\x4a\xca\xaa\x79\xc8\x5b\xd8\x47\x93\xec\x5f\xf6\xd3\x3d\x39\x55\x93\x97\xd6\xd3\xd1\x21\x4d\x96\xf2\x55\x5b\xd4\x79\xbb\x81\x45\xde\xc0\x94\xd1\x40\x72\xd8\x38\x72\x4a\xd5\xe4\x45\x97\xd2\x96\xef\xa1\xad\x05\xe1\xd9\x3c\xcd\x89\xc9\x94\xa1\xd3\x7c\x32\x4d\xd0\x11\x3a\x14\xe8\xc6\x30\xee\xcc\x98\x3a\xbe\x5d\x0b\x9d\x49\x8f\xf8\xcf\xa4\x57\xb0\x81\x82\x5c\xa1\x1b\x57\xc2\x27\xcf\x01\x36\x6e\xce\x8b\x78\xdc\xf4\x58\xf8\x77\xc5\x3d\x93\xa2\xdf\xd8\xee\x3c\x93\xbd\x9a\x5c\x2e\x4a\x39\xb9\xa1\xc7\x32\x62\x1e\xbc\x09\x4f\x26\x73\x9e\xb2\x74\xb6\xca\x03\xdb\xf4\xa3\x01\xa8\x83\x13\xb6\x49\x27\xec\x27\xfb\xe8\x82\x70\x9e\x9e\xa1\x19\xc7\x79\xda\x0e\x3b\xd1\x42\x5b\x64\x99\x9c\x76\xd9\x94\x3a\xb6\xac\xbc\x56\xa1\xe4\x4f\xec\x72\x4c\xce\xa3\xe6\x2a\x5a\x0a\xb0\x32\x7b\xc5\xef\x9b\x61\x64\xda\xe3\x07\x85\xb1\x09\x31\x36\x60\xf1\x1d\x61\xf1\x80\x30\x80\x30\x80\x30\xed\x82\x30\xd9\x4f\xf5\x09\x45\xe5\x71\xae\xa8\xec\x44\x42\xf5\xfa\xd2\x20\xe6\xbf\x34\xd8\xc1\xee\x11\x23\x4f\x99\x1f\xd9\xe9\xac\x0e\x0e\x94\x25\xad\xa2\xf0\xa0\x14\x81\xb3\x1b\xda\x99\x24\xcb\x52\x25\x77\xbd\xc3\x4b\x86\x87\xab\x1b\x1a\xe5\xbd\xd8\x6b\xfc\x73\x62\xb7\xfb\xc7\x55\x59\x2b\xc8\xee\x5f\x07\xdd\xbf\xea\x15\x4d\xaa\xc8\x05\x25\x37\x5a\x73\x9c\xa7\x15\xe3\xdf\xb7\xcd\x5f\x8d\x5e\x6e\x54\x1f\xba\xce\x82\x65\x9e\x67\xf6\x62\xa1\x12\xb2\x50\xf9\x68\x3f\x7d\xb8\x9f\x7d\xa8\x3f\xfa\xf3\xb6\xb5\x7f\x7b\x7f\xef\xec\x8a\xaa\x1c\x8e\xc6\x38\xf3\x40\x2e\xee\x14\x37\x26\xa7\x93\xe2\x3f\x14\x30\x71\x87\xf9\x47\x4b\xc4\xfd\x49\x45\x7e\xa6\xb1\x3a\x13\x67\xf3\x23\xf8\x4a\x49\x8f\x0d\x65\x75\xb5\x34\x2f\x72\xdd\x9f\x32\x5e\x0b\xf3\xdf\x0b\xd6\xcb\xe2\xfc\x71\x38\x78\xbb\x96\x79\xa9\x8f\x5e\xec\x63\x2f\xf4\x45\x3f\x67\xe3\xcb\x0f\xf6\xcd\xaa\x5a\x8e\x2f\xe2\x0a\x2a\x1f\x76\x35\x16\x5f\x31\xfe\x14\x8f\x4d\x7a\xee\x82\x73\x5f\xb1\xde\x5a\xd3\x9d\x08\xae\x51\x29\xc7\x6f\x9c\xc7\xc5\x15\x95\x9c\xf9\x3d\x95\x8b\x79\x3d\xa6\xde\x32\xc7\x54\xc4\x8d\x95\x65\xb5\x5c\x94\x53\x31\x71\x45\x2e\x4e\x60\x3d\x4b\xce\x5f\x7d\x07\xc0\xbe\x7c\x7c\x1b\xef\x96\x27\x6b\xa0\xa3\x84\xaa\x6d\xdf\x84\xc7\xfc\xbf\x09\xdb\xd9\x2b\xf8\x10\x50\x36\x43\xa7\xd9\xc9\xf8\x71\x5b\x5a\xe4\x71\xfe\x4e\x99\x2f\xb8\xef\x05\xe2\x03\xc6\x21\x6e\xf1\x90\x2d\x28\x4f\xf2\xef\x47\x29\x2b\xe4\x49\xa4\xfc\xaa\xc2\x25\x20\x34\xb9\xa0\xf0\x2f\x84\x57\xa1\x64\x75\xad\x22\x19\x13\xef\x96\xbc\x7c\x5d\x55\x6f\x7a\x42\x34\x6d\x00\xfb\xb7\x23\xec\x1b\xfd\xf4\xa0\x6f\x5b\xc6\xc7\x76\xcc\x87\xc8\x3e\x65\x36\x7c\x45\x34\x3c\xe5\x6e\x38\x79\xd8\x38\x61\xd2\xaf\xb9\xc5\x74\xbd\x13\x5b\x8c\x69\xff\x29\x49\xe2\x25\x78\x8e\x9e\xe5\x2f\xc1\x25\x9a\xa7\x0b\x81\x2f\x81\xff\x58\xae\xa7\x53\xf5\xba\x7c\xa7\xf8\xf6\x4d\xe1\xef\xce\x33\x6c\x41\xbc\x31\x75\xfb\xe1\xe3\x05\xa8\x37\x39\x28\xfa\xdd\x1d\x75\x1e\xf9\xb8\x3f\xf0\xad\xfb\xd4\x27\xcc\x73\x36\xfd\xc1\x67\xf2\xb4\x4c\x6f\xa8\x5a\xf1\xb4\xfc\xc9\x63\x1d\x04\x3a\xdc\x24\x1d\x7e\xb9\x8f\x56\x04\x1d\x5e\xa2\x6b\x0e\x1d\xee\xa4\x79\xea\x80\x69\xb4\x2c\xe0\xa6\x99\xb8\x30\xdc\xfc\x97\xbb\xea\x58\xc0\x27\x6d\xfe\x5c\xd7\xe8\x1d\x15\x87\x6d\xbe\xcd\x03\x94\x06\x94\x06\x94\x06\x94\x06\x94\x06\x94\xde\x30\x94\xfe\x74\x5f\x8b\xc3\xa3\x2e\x09\xc4\x7d\x8e\xe6\x5c\x88\xbb\xcd\x21\x57\xa1\x04\xb9\xc1\x95\x48\x23\x4b\x8b\x0d\xae\x56\x32\xff\x7d\x67\x9d\xa5\xc6\xb1\x10\x98\x5d\x77\x01\x72\x84\xa3\x90\x4d\x5d\x7f\x80\x70\xf7\xda\xaa\x07\x84\x1b\x84\x7b\x93\x09\xf7\x3f\xed\x86\xad\x6d\x18\xa0\xde\xbc\x2f\x4e\x76\x8e\xce\xb0\x99\xf8\x94\x8d\xb5\x87\xdc\x68\xbc\x5e\x33\xb5\x84\xbc\xe5\xfc\xfa\xe5\xdd\x34\x63\xf2\xeb\xb2\x22\xbf\xa9\x22\x97\x78\x18\xba\x5b\x59\x7b\x4d\xaf\xa8\xab\xd6\xba\xcd\xfd\xe8\x04\xb3\x1e\xd3\xf9\x9a\x80\xfd\xef\xbb\xd9\xdf\xf6\xd3\x2e\x4f\x33\xc6\x27\xf5\x20\x47\xd6\xe2\x20\xeb\xa6\x9d\x0f\xea\x14\x6f\xdd\x12\x1a\x98\xb6\x5b\x4f\xa6\x39\xb8\x76\x37\xb6\x98\x0e\x3a\x58\xac\x4a\x5a\x8c\xac\xdf\xdd\x47\x9a\x98\xbd\x37\x49\xe1\xb3\x37\x47\x12\x2d\x05\xcd\x5e\xa7\x9f\xa3\xb6\x3a\xb3\xf3\x51\xf3\x0e\xee\x7a\x3a\x15\x74\x2b\x77\x0a\xb1\x8b\xe1\xb3\x7c\x8e\x9d\x31\x03\xd8\x83\xfa\xe0\x47\x77\x7c\x66\x07\x45\x7f\x8a\x7c\x1e\xf8\x11\x0b\x58\x6f\xf8\x99\x1f\xb0\xb0\xf5\xe6\x3d\xf6\xcc\x1a\xe9\xf4\xc6\xaa\x05\x4c\xfb\x1f\x3b\xd6\x39\x20\xd8\x4d\x12\xec\xef\x8f\x6c\x8a\x9d\xba\x25\xa8\x79\x99\x4a\x0e\x35\xef\x72\x03\x59\x5e\xeb\xb4\x81\xcc\xfc\xcd\x4e\x1f\x03\x39\x59\xb3\xc9\xdc\xb0\xa5\x1c\x17\x5b\xcd\xcd\xb1\x93\xd8\x64\xf6\x9a\xf1\xc5\x26\x13\x9b\xcc\x4d\xde\x64\x76\xe9\x72\xbc\xb1\xcf\x49\xbd\x6f\xc4\x06\x3e\x35\xe1\x51\x58\x33\x34\xc5\x26\xe3\xa7\xec\xad\xe6\x13\xee\xad\x66\xd0\x35\x3a\xb0\xcd\x7c\xef\x10\x8d\x89\x6d\x66\x49\xae\xdc\x52\x35\xe3\xb5\x77\xf6\x98\xbc\xc2\x95\xc8\x47\x1e\x53\x4a\x05\xcd\xb0\x43\x3a\xfb\xcf\x09\xf6\xc5\x01\x62\xce\x09\x4b\xe6\x91\x51\xdd\x14\x4a\x29\xe5\x95\x75\x25\xbf\x26\x15\xdd\x7a\xc1\x92\x2d\x4a\x34\x27\x9a\x4a\xb9\x9c\x4b\x13\xb6\x5b\x2a\xc1\xdb\x48\x38\x82\x80\x1e\x85\x37\xb5\x2c\xdb\x3e\x43\xbd\x22\x4b\xf9\x54\x32\xcd\x4f\xb8\x60\xf7\x66\x51\x74\xc6\xbc\xc8\x79\x45\xaf\xcc\xaa\xda\x64\xb1\x68\x47\x33\xb7\xee\x8b\xdb\x9e\x3a\x50\xd9\x9b\x34\x2f\xde\xa8\x39\x3a\xc3\xdf\xa8\x49\x3a\x45\x27\x9a\xf8\x8a\x72\xdd\xe6\x99\x75\xb9\x14\xae\x6a\x7c\x2d\xfc\x7d\x99\x60\x47\xcc\xf7\xa5\x66\xae\x98\x2f\x8b\x39\xe6\xb5\x45\xd2\x6e\xec\xf1\x7f\x41\x76\x32\xe2\xf7\xcd\x95\x93\xb3\xa8\x7f\x85\xfa\x57\x59\x68\x9d\x42\xeb\x14\x5a\xa7\xd0\x3a\xed\x19\xad\xd3\x6c\xd7\x48\x79\xb6\xbc\x27\x4d\x6b\x4c\x66\xa1\x31\x09\x8d\x49\x68\x4c\x42\x63\x12\x1a\x93\x9d\xd7\x98\x6c\x39\x65\xc8\xf6\xb4\xaa\x5e\x16\xaa\x7a\xed\x53\xd5\xcb\x76\xbd\xaa\xde\x16\x2c\xa8\xc5\x3e\x7e\x8d\x86\x05\x15\xd4\x2b\xaa\x26\x15\x64\x57\xd8\x89\x90\xa7\x93\x2a\x15\x29\x77\xdd\xf8\xe6\xea\xec\x9f\x5f\x63\x1f\x18\x24\x32\x0f\x5d\x5a\x4f\x47\x53\xf5\x8b\xb8\x8b\x5c\xd3\x49\xbb\x89\xe4\x23\xc6\xf1\x0b\xe2\xfc\xc5\x74\xf5\xcf\x5d\x8e\xeb\x50\xb6\x1d\xd8\x0a\x65\xdb\x81\xad\x80\xad\x80\xad\x7a\x08\x5b\x75\x51\x05\x9a\xae\xc1\x56\x28\x8d\x02\x6c\x05\x6c\x05\x6c\x05\x6c\x85\xb2\xed\xa8\xdd\x70\xf7\x50\xa6\xae\xaf\xdd\xb0\x25\xcb\xb6\xaf\x88\xe2\xc9\xfb\x78\xf1\xe4\xc8\xc5\x73\xec\x38\xd5\x09\x16\x4e\x59\x28\x6a\x3d\x9d\xaa\x26\x44\x2d\xa9\xdb\xfe\xfa\xf0\x08\xa8\x63\xec\xa8\x4f\x84\xb9\x97\x91\x99\xa1\x50\xd5\x5d\xa4\xf8\xcf\xed\xf0\x30\xb2\x87\xec\x02\xed\x35\x38\xec\x31\xf1\x53\xfb\x81\x98\xe0\x57\x59\x3a\x4b\xb3\x55\x51\xdb\x87\xe8\x40\x33\x0f\x02\x11\xdb\x48\x97\x69\x32\x5d\xe6\xbb\x7d\x74\x46\x98\x83\xd3\x74\x92\x9b\x83\x23\xd4\xe4\x2c\x14\x42\x0d\x69\x2e\xd4\x60\xe7\xc0\x34\xdf\xda\x53\x42\xa8\x61\x96\xa6\x5d\x42\x0d\xcd\x37\x17\x66\xa7\x1a\xb3\x43\x1b\xb2\x3d\x9e\x58\xe5\x90\xb2\xef\xc9\x97\x47\x3c\x76\xea\x49\xdf\xfa\xeb\x35\x36\x6b\x58\x1c\x66\xdb\x2c\xa7\xe6\x7a\x9b\xad\x17\x2a\xae\x03\xe7\x02\xe7\x02\xe7\x02\xe7\xa2\xe2\x3a\x2a\xae\x43\x50\x0f\x15\xd7\xe1\x56\x80\x5b\x01\x6e\x05\xb8\x15\xe0\x56\x68\x89\x5b\x01\xba\xaa\xd0\x55\x85\xae\x2a\x2a\xae\xc3\x6b\x07\xaf\xdd\x16\xaf\xb8\xde\x18\x5a\x6e\x00\x22\xfb\xd3\xe7\x8d\x54\x74\x6f\x83\x62\xe2\x30\x8d\x07\x04\xad\x0b\x1d\x0b\xf3\xcf\xb9\xa2\xa4\xeb\xb2\x5d\xd9\xe7\x97\x86\xd9\xbb\xfa\xe9\x3e\x87\x78\x0b\x29\x8b\xc7\x7c\x0a\xfa\x98\x70\x7b\xca\x68\x20\xf9\xa8\x71\x80\x8d\xbb\xf9\x49\xee\xdf\x5b\x2c\x7a\x98\xa3\xb3\x62\xa6\x4c\xd2\x29\x3e\x53\x8e\xd2\x61\x3a\xd8\x80\xff\x81\x77\x2c\xe5\xee\xd9\x9d\x2a\x19\x2e\x85\x4f\xa2\xe3\x6c\xa2\x9e\x7f\xc2\xd3\x9b\x1a\xad\x88\xe8\xd7\xb7\xd7\x3e\x8e\xb8\x7f\xb1\x1d\xcf\x13\x79\xdc\x3c\xa6\x53\x0f\x25\x73\x8e\xe6\xe8\x4c\x95\xe3\xb4\xd9\xa7\x02\xfe\x06\xcf\x69\x93\x9e\xd3\x8f\xf7\xb5\xd0\x38\x3c\x25\x5c\xa7\xb3\x34\xed\xb8\x4e\x37\xc5\xd6\x70\x51\xc0\x76\xdb\x9a\xe4\x8f\xee\xaa\xb5\x35\xaf\xb1\xcb\xda\x78\xcc\x4b\xac\xca\xc3\xd9\x6e\xeb\x82\x6a\x35\xa8\x56\x73\xf7\xc2\x75\x50\x15\x50\x15\x50\x95\xb6\x55\xab\xf9\x44\x2b\xd7\x04\x17\x44\x00\xd4\x19\x9a\x71\x05\x40\xb5\x71\x51\x10\x5e\xa5\xa6\xdd\xeb\x82\xcc\x0f\xed\xac\x5d\x17\xec\x0d\xa9\x41\xe3\x59\x2d\x3c\xc6\x85\x1f\x3b\xb1\x58\x80\xea\x6f\xaf\x2d\x51\xa0\xfa\x0b\xd5\xdf\x4d\x56\xfd\xed\x24\x8f\x6a\xb7\xb1\x0f\x57\xef\x3d\x4a\x87\xd9\xc1\xf8\x7e\x5b\xbd\xf7\x41\xb7\x7a\xaf\xbb\xf1\x0e\x28\xf6\xfe\xa7\xab\xf4\xd0\x98\x54\x56\xc6\xd6\xd3\x63\x65\xbb\x7c\xbb\x50\xe5\xd0\xd9\x67\xaf\xb2\x77\x0d\xd2\x3d\x39\x55\x6b\x44\x88\xa3\xba\xfc\x7b\x32\x6a\x1c\x3f\xa5\x6a\xf2\x62\xba\xfa\x37\xa8\x70\x40\x85\x03\x2a\x1c\x08\xdb\x46\xd8\x36\xc2\xb6\x11\xb6\xdd\x35\x61\xdb\xdd\x13\x95\x8c\x70\x59\x84\xcb\x22\x5c\x16\xe1\xb2\x08\x97\xed\xe9\x70\x59\xc4\xf3\x21\x9e\xaf\x47\xe3\xf9\xb6\xa4\x0a\xc7\x06\x49\x5e\x4e\xd5\x78\x5a\x7b\x35\x1e\x6a\x89\x04\xc7\xa5\x70\xd2\x37\xc6\x46\x4d\xd2\x17\x8f\x9b\x74\xaf\xba\x2b\x9e\x48\xc5\xf8\xbf\xd8\xe1\xe0\x30\x47\x73\xa3\x86\x7c\xed\x16\x3f\xb5\x99\x7d\x09\x54\x75\x86\x66\x68\xaa\xca\x61\xb2\x9f\xd2\x1b\x1e\x73\x78\x4a\x10\x33\xd6\x64\xcc\xd8\x3f\xf4\xd1\xb4\x78\xed\x4f\xd0\x31\xfe\xda\x1f\xa4\x66\xa6\x20\xcd\x89\x78\xb1\x0c\x9d\x76\xe2\xc5\x9a\x6c\x2a\x2b\xdc\xcc\x53\x34\xe9\x72\x33\x37\xd9\x56\xf3\x96\x88\x8b\x60\x34\x68\x89\x7c\x42\xa2\x83\xad\x52\xf2\x0f\x47\x1c\x4b\xe4\xaf\xaa\x51\x63\x95\x06\xc5\x61\xc2\x2a\x39\x92\x1a\x6d\xb6\x4f\x90\xd4\x00\x9b\x05\x9b\x05\x9b\x05\x9b\x85\xa4\x06\x24\x35\x10\xf5\x0b\x49\x0d\xf8\x08\xe0\x23\x80\x8f\x00\x3e\x02\xf8\x08\x5a\xe2\x23\x40\xf2\x07\x92\x3f\x90\xfc\x01\x49\x0d\xb8\xe0\xe0\x82\x6b\xb9\xa4\x46\x10\xfa\x6d\xad\xd6\x86\x05\x92\xdb\xe0\xb2\xda\x5c\x19\x8d\xdf\x8d\xd0\xbd\x42\x46\x43\x2a\x97\xf5\x31\xf6\x6b\x11\xf6\x2b\x11\x1a\x30\xfe\x27\x1a\x2d\x70\x0b\x6d\x7c\x27\xec\x07\x28\xc5\xf8\xcd\x25\xef\x2b\xc8\x95\xc9\x72\x59\x9f\x9c\x9f\x3b\x63\xfc\xa1\x75\x4c\xba\xa6\xa1\x89\x9a\x86\x26\x1a\x69\x28\xab\x88\x4c\xb6\x7d\x3c\x93\xcd\x98\x02\xa7\xe8\x04\x1d\x6b\x62\x0a\x58\xf7\x18\xe6\x66\x60\x9f\x1d\xa2\x7d\x62\x30\x97\x8d\xf7\x61\x6c\x3d\x2d\x5e\x8c\xb1\x92\xb4\x2a\xeb\x65\x29\x67\xe9\x90\xf0\x7f\xbf\x65\xec\x86\xba\xac\xb3\x1f\x1c\x62\x3f\x39\x40\xdb\xf9\x19\x4b\xeb\xe9\xa8\x6a\xae\xdc\x4b\x79\x65\x5d\xc9\xaf\x49\x45\xb7\x23\x59\xb2\x77\xc9\x59\x75\x39\xe5\x5a\x03\x4d\xd8\xab\xa7\x04\x3f\x3f\xe1\xd0\x69\x0f\x6e\x54\xcb\xb2\x4d\x38\xf4\x8a\x2c\xe5\x53\xc9\x47\xf8\x09\x19\xe3\x3f\x8b\xe9\x0b\x56\xef\xf2\x59\x75\xf9\xbc\xa2\x77\x7b\x39\xce\xec\x4d\x9a\x17\x4f\x79\x8e\xce\xf0\xa7\x3c\x49\xa7\xe8\x44\x13\x4f\x99\x3b\xee\x67\xd6\x1b\xd1\x6c\x3f\x1b\x6e\x05\x9e\x64\x7b\x4c\x2b\xc0\x1f\xac\x69\x08\xb2\xea\xb2\xf7\xdd\xdf\xe3\xff\xee\xef\x64\xc4\x6f\x91\xfb\xc9\xb3\xc8\x75\x40\xae\x43\x16\xfe\x34\xf8\xd3\xe0\x4f\x83\x3f\xad\x67\xfc\x69\xd9\xae\x71\x17\xb5\xbc\x27\x4d\xfb\x31\xb2\xf0\x63\xc0\x8f\x01\x3f\x06\xfc\x18\xf0\x63\x74\xde\x8f\x91\x7d\x03\xbd\x9e\x5d\x8d\x3f\x67\xeb\x02\x4c\x98\x57\x16\xf1\xa4\xc6\x02\x67\xad\x72\x3d\xa6\xe7\xd4\xb2\x3c\x12\xd3\xd7\x72\xd7\x8d\xd1\xe7\x2b\x58\x59\x5a\x15\x40\xbb\xac\xa9\xfc\x4e\xe3\x3b\x6c\x0c\xd0\x4e\xf9\x80\x6c\x4f\xb3\xe1\x2c\xd8\x70\xfb\xd8\x70\xb6\xeb\xd9\xf0\x16\x4c\xcf\x60\x5f\x4d\xd2\xac\x20\x88\x39\x55\xd5\xf2\x4a\x89\x37\x52\x2d\x6d\x1c\x80\x13\xb9\x17\xd5\x56\x3a\x7e\x5f\x92\xfd\x70\x3f\xbd\xda\xdd\x8e\xad\x6d\xf5\xa0\x8f\xdc\xf1\x79\xe3\xec\xe4\xa0\xf1\xcb\x94\xeb\x1c\x53\xcc\xca\xe1\x82\xfc\xb8\x16\xeb\x1d\x4b\x34\x2b\x20\xde\x29\x3a\xc1\x21\xde\x61\x3a\x48\xfb\xeb\xc4\x81\xbb\xc6\xc6\x12\x99\xe1\xfd\xba\x53\xb5\xe3\x6b\xe1\x64\x6f\x82\x1d\x31\xc9\x9e\xcf\x23\x32\x39\x9f\xe8\x4b\xad\xd6\xf1\xd7\xb6\x07\x3c\x90\x87\xfd\x05\x8f\xc5\x33\x19\x36\x7f\xec\xf4\x63\xc9\xcc\xd1\x19\x9a\xa9\xca\x5c\x69\xee\xb9\x20\x38\x12\xb9\x2b\x4d\xe6\xae\x7c\xa4\xaf\x65\xc6\xe1\x9c\xc8\x5e\x99\xa6\x8c\x93\xbd\xb2\x09\x96\x86\x6b\x1d\xb7\xd7\xd2\x24\x3f\xb0\x2b\xc0\xd2\xbc\xca\x96\x3b\x16\xc6\x65\xc8\xca\x39\xe9\xb0\x6d\x81\xde\x31\xf4\x8e\xef\xde\xc8\x67\x84\xbc\x21\xe4\x0d\x21\x6f\x6d\xd3\x3b\xfe\x74\x1f\x5d\x12\xe9\xa3\xe7\x68\xce\x95\x3e\xda\xa6\x82\x3a\xed\x89\x25\x6a\xef\x0a\x20\x5c\x56\x39\xf3\xee\x9d\x01\x6b\x84\x27\x42\xa4\x8f\xc5\xca\x21\xc1\xe5\x32\x3b\xb9\x70\x80\xf6\x71\xaf\x2d\x57\xa0\x7d\x0c\xed\xe3\x4d\xd6\x3e\xee\x1c\x9b\x6a\xf3\x07\x21\x54\xf7\x78\x9c\xf6\xb1\x54\x7c\xc4\xf6\x6f\xdc\xef\xd6\x3d\xe6\xad\xd6\x0a\x1e\x6f\x3d\x9f\x08\xfb\xab\x41\xba\xdf\x92\x54\x96\x4b\xf9\xb2\xaa\x94\x2a\x3a\xfb\xa3\x41\xf6\x42\xbf\xa3\xd8\x90\xa8\x2f\xa5\x3c\x63\x9d\x97\xdc\xe3\x68\x28\xdb\x7f\x9c\x55\xb5\xc9\x62\xd1\xfe\x0c\xb6\x4e\xfd\xbf\x4d\x31\x94\x57\x69\x52\x4c\xf1\x09\x3a\xc2\xa7\xf8\x38\xed\xa3\x54\xa8\x0c\x87\x7d\xbf\x2d\x51\x03\x3a\x17\x3e\xfb\x87\xd8\x60\x75\x68\xb5\xdd\x07\x4f\x5c\x25\x42\x26\x11\x32\x89\x90\x49\x84\x4c\x22\x64\x12\x21\x93\x08\x99\x44\xc8\x24\x42\x26\x11\x32\x89\x90\x49\x84\x4c\x22\x64\xb2\xc3\x21\x93\x08\x68\x44\x40\x23\x02\x1a\x7b\x38\xa0\xf1\x4b\x83\xf4\x2a\x1b\xb6\x71\xb8\xc2\xfe\xe3\x20\xfb\x55\x17\x69\xdb\x13\x42\xda\x8c\x93\x92\x8f\xb9\x28\x9b\xf1\x87\xad\x46\xd8\x9e\xa5\x13\x82\xb0\x1d\xa2\x03\x9c\xb0\xa5\x68\x84\x92\xe1\x84\xcd\xb8\xd7\x96\xd0\xb5\x33\xe1\x74\xed\x09\x16\xaf\xa1\x6b\x3c\x1d\x1a\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x0d\x64\x6d\x33\xc8\xda\x0f\x0d\xd3\xbc\xa9\xdc\x98\x37\x96\xb2\x8a\x5a\xd2\xe4\x82\xc2\x63\x9b\x7d\x72\x86\x85\x10\x21\xdf\x38\x4a\xc6\x72\xe5\x96\xbc\x7c\x5d\x55\x6f\x7a\x36\x80\x3a\xfb\xe5\x21\xf6\x0b\xdb\xe8\x11\xdf\x16\xed\xf0\xf0\x1f\xec\x6b\x4c\xa2\x70\xd1\xbe\xd8\x15\x71\xb1\x29\xf7\xc5\x5a\xa4\x5e\x38\xc5\x4f\x98\xf4\xeb\xb0\x19\x8e\x5e\xbf\x1b\xd0\x38\xf4\x07\x8a\x8d\x28\x13\xde\xf8\xbe\x70\xaa\x78\x95\x3d\x67\x52\xc5\x7a\xd3\xd4\xe4\x8d\xf5\x1f\x55\x6d\x4c\x2b\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x24\x68\x64\xa7\x68\xe4\x3b\x87\xe9\xa0\xa0\x91\x42\xef\xa3\x8a\x3b\x96\xd5\xbc\x2e\xe7\xd6\x34\xa5\x72\x9b\xff\xae\x38\x3a\x85\x2f\x0d\xb1\xe7\xb7\xd1\xab\xc4\x69\x36\x63\xfc\x55\x93\x31\xba\xc1\x62\xc9\xb2\x67\x56\x6c\xe0\x3c\x17\xdf\xe1\xad\xce\x9b\xc2\x28\x2d\x60\x8a\x23\xce\x2a\x86\xaf\xd4\xcc\x6f\x9e\xb1\x10\x72\x96\x67\x09\xcf\x8a\xd8\xd5\x76\x2a\xb9\x87\x5f\x4e\x74\xc8\x44\x90\x35\x1d\x05\x71\xac\x25\x8e\xc1\xf9\xe9\xbc\x63\x74\xe3\x6a\x38\x6d\x3c\xca\x0e\x9b\xb4\x51\xcc\x27\xab\x00\x53\xf5\xf8\x03\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x6e\x3a\x4a\x3c\x49\xc7\xd9\x44\xfc\x88\xad\x28\xf6\x88\x5b\x85\xac\x66\x23\x57\xab\x48\x06\x14\x09\x14\x09\x14\xd9\xc3\x28\xf2\xaf\x23\xf4\xb0\x55\xd2\x5a\x91\xdf\x54\x91\x4b\xfc\x69\x59\x01\x91\xec\xf7\x22\xec\x77\x22\xf4\x4a\xcf\x8f\x75\x6b\x5d\x3f\xc8\x6b\x5d\xbb\x8e\x46\xd1\x6b\x57\xd1\xeb\x7f\xfe\x10\x1d\xa9\x2a\x7a\x5d\xa7\xdc\xb5\x49\x7d\xc7\x74\x2e\x85\xcc\x7e\xfb\x41\xf6\x9f\x23\xae\xe2\xd7\x31\x5e\x98\x46\xfc\x68\xcd\x67\x67\x71\x94\x55\x97\x93\x8f\x1a\x47\xf8\x15\xab\x16\xe2\xca\x2d\x2e\x4c\xb3\x40\x47\xc4\x70\xa6\x69\x8c\x0f\xe7\x30\x25\xe8\xc9\xc0\xbc\x6d\x7e\x1f\xc6\xe8\x65\xd5\xe5\x3b\x2d\x45\xd3\xb2\x22\xd3\xd1\x9f\xdc\xee\x1a\xe1\x3d\x56\xa5\x99\x7a\x83\xfc\xb8\x79\x50\xa7\xc6\x39\x73\x8c\x8e\xd2\xe1\x2a\x61\xe5\x46\x07\x1a\x2a\xca\xa8\x2d\xd3\x64\x6d\x99\xf7\xf4\x09\x5d\x86\x34\xd7\x65\xb0\x6b\xc2\xb4\xe0\x25\x6f\xde\x6e\x34\x58\x3f\xa6\x31\xf3\xe0\x6f\x11\x3c\x46\x23\xf3\x95\x7b\x5d\xe6\x61\xa4\x46\xfa\xbd\x9e\x9d\x78\x8c\x2b\x07\x77\xc2\x4a\x40\xfa\xbd\xd7\x8c\x16\xa4\xdf\x21\xfd\xbe\xc9\xd2\xef\xed\x5c\xfd\x85\xa9\xb1\xb7\x6e\xfd\x97\xdd\x47\x29\x36\x12\x4f\xda\x44\xe5\x3e\x37\x51\xc9\xaa\xcb\x77\x85\xaa\xfb\x77\x76\xd3\x65\xb1\x0d\x59\x29\xaa\xb7\x8c\x37\x52\x53\x8b\x29\xdb\x25\x5c\x9d\x0e\x57\xd6\x14\x55\x53\x2a\xb7\x8b\xf2\xba\x5c\xf4\x26\xc1\x55\x6d\x51\x7e\x66\x37\x7b\xeb\x00\xed\x76\xb5\x3a\x69\x35\x6a\x47\xab\x1c\xae\xbb\x6d\x99\x37\xaf\x75\xde\xb8\x96\x27\xa3\x29\x79\xca\x38\x71\xd6\xa7\x69\x2b\x70\x24\xf0\xd4\xb6\x6c\x77\xd6\xe8\x39\x31\xe1\x17\xe8\x69\x3e\xe1\xcf\xd1\x1c\x9d\x09\x9c\xf0\xee\x91\xb6\x4a\x1d\x04\xf7\xf8\x4e\x37\x44\xff\x24\xfc\x85\x78\x96\x2d\x9a\x2f\x44\xbd\x49\x60\x05\x85\x04\xf7\xb4\xb6\x72\xe7\xdb\x28\x64\x0a\x4c\x84\xed\xab\xea\xcc\x82\x8c\x79\x6e\xd7\x4c\x84\xcc\x35\xfa\x5e\x7a\x5d\xd5\x6a\xa7\x75\x33\x01\x8b\x1f\xec\xd8\x9a\xdc\xb1\xfd\x49\x5f\x5b\x4d\xd4\x92\xd8\x0d\x3e\x4b\x8b\xce\x6e\xb0\x4b\x6c\x20\xdf\xf5\x35\x66\x03\x6b\xcc\x57\x4b\x8c\x62\xe6\xbb\x3b\x43\x6c\xe0\x54\xc3\x9b\xc7\x3a\xc6\xf0\x34\x5f\xff\x74\x85\x29\xc4\xa6\xb3\xd7\xec\x2e\x36\x9d\xd8\x74\x6e\xf2\xa6\x73\x73\xd7\xe0\xa1\xdb\xd2\xcd\x5c\x85\x67\xcf\xd0\x0c\x9b\x8a\x4f\xda\xfb\xd2\x41\x4f\x6c\x40\x60\x4b\xed\x0f\x12\x60\x3f\x32\x44\xc9\xaa\xfc\x07\x27\xf5\x21\xaf\xe8\xda\x1a\x7f\x23\x96\xd7\xf2\x05\xb9\xa2\xb3\xaf\x26\xd8\x1f\x0f\xd0\x0e\x3b\xe9\x21\xfa\x7d\x8d\x49\xaa\xcc\xab\xf9\x69\xbb\xb1\x0c\x6f\xac\x45\x3a\x2a\x07\x3c\x59\x0b\x3e\xd7\x39\xaf\xe8\x5b\x4e\x76\xb9\x6b\x85\x53\x5e\x17\xfe\x16\x1d\x62\x07\x02\x52\x19\xaa\x9f\x0c\x04\x9a\x91\xc7\x80\x3c\x06\xe4\x31\x20\x8f\x01\x79\x0c\xc8\x63\x40\x1e\x03\xf2\x18\x90\xc7\x80\x3c\x06\xe4\x31\x20\x8f\x01\x92\x28\xc8\x43\x40\x1e\x02\xf2\x10\x36\x25\x0f\xe1\x0f\x87\x69\xc2\x2a\x7d\x26\x50\x60\x40\x5c\xbc\xd5\xd8\x1b\xd7\xd4\x8a\x64\xeb\xa2\xbc\x77\x98\x7d\x7d\xc0\x29\x93\xf6\xc9\x46\x04\x51\xac\x6d\xde\xd3\x46\x4b\x5d\x21\x86\x12\xe7\x97\x13\x95\xdb\x9c\x00\x51\x4f\x3f\xbb\x1f\x22\x06\x06\xf9\xb6\x9c\x2e\x5a\x10\xf1\x62\x38\x1f\x1c\x61\xc9\xea\x72\x6d\x9e\x61\xf5\x50\xc1\x50\x71\x15\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\xc3\x0e\x63\xc3\x09\x3a\xc2\x0e\xc5\x0f\xd8\x21\x4e\x0f\xb9\x43\x9c\x3c\x1b\xbc\xbb\x21\x6d\x07\x50\x13\x50\x13\x50\x73\x0b\x41\xcd\x8f\x0e\xd3\xfe\x86\xa0\xa6\x2e\xe7\x34\xb9\x62\xd3\xcc\x6f\x0e\xb1\x3f\x72\xd1\xcc\x5f\x6a\x84\x66\x2e\xf0\x26\xba\x02\x63\x3e\xec\x8b\x31\x45\x07\xbb\x9f\x5f\x76\xa1\x96\xf3\x86\xb2\x5b\x6d\xc0\x29\x06\x1c\xf1\x8e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x9b\x09\x2e\xf7\x53\x9a\x8d\xc5\x47\x6d\xf8\xc8\xdc\xe0\x52\x6c\xdc\x40\x2c\x41\x2c\x41\x2c\x41\x2c\x3b\x4a\x2c\x3f\x1f\xa1\x9d\x6e\x7d\x62\xf6\x99\x08\xfb\x3f\x23\xb4\x8d\xff\x5f\x5d\xdd\xe7\x5d\x05\xb9\xc2\xb5\x2d\xa1\xf7\xec\xd2\x7b\xfe\x17\x49\x9a\x14\xe3\x99\x53\x55\x2d\xaf\x94\x78\x07\x1d\x7d\xb5\x20\x20\x5c\x94\x25\xdd\xa9\xfa\xf7\x9b\xc3\xec\xdb\x11\xba\xcf\xdd\xc4\xd2\x7a\x3a\xfa\x20\x17\x52\xf3\x72\x87\xf3\xc6\x89\xc9\xc7\x8d\x5f\xa6\x5c\x87\xbb\x41\x2c\x3f\xa4\xc5\x5a\x68\x57\x69\x52\x8c\xec\x04\x1d\xe1\x23\x3b\x4e\xfb\x28\x15\xa8\xc3\xe0\x19\x8c\xf5\x74\x8a\x77\xe9\x4e\x25\xcf\x9e\x0d\xa7\xa4\x07\xd9\x7e\x93\x92\xfa\x3c\x0e\x13\x9b\x8a\xbe\x78\x34\xa1\x7f\x67\x7b\xed\xe0\x3f\x6c\x49\x98\xf9\x8d\xff\x13\xe6\x8f\x1d\x7c\x04\x99\x69\xca\xd0\xe9\x2a\xf9\x9b\x0d\x3f\x03\x88\xde\x40\x6c\xac\x49\xb1\xb1\x9f\xed\x6b\x85\x0d\x98\x15\x9a\x62\x86\x61\xb6\x35\xc5\xda\x61\x4b\xda\x66\x2c\x42\x44\xc9\x92\xef\xd9\x55\x6b\x4b\x5e\x25\x76\x76\x31\xc9\x34\x1f\x7b\xc4\xff\x77\xd2\x7a\x5c\xa6\x4b\x34\xef\xb6\x1e\xc9\x0c\x9d\x6e\xe2\xcb\x38\xcd\x7b\x7e\x91\xfb\x0f\x74\x58\x93\x30\x6b\xf2\x72\x84\xbe\x1a\x61\x5f\x89\x44\xbf\x6c\x0f\xd0\xc7\x22\x97\xdd\x0b\x53\xc5\xd8\x1f\xf1\xc5\x65\x6c\x59\x5e\x11\xbe\x33\x7b\xa3\xea\x38\x68\x4c\x36\xc0\xbb\xe8\xb2\x16\x25\xb5\x34\x5a\x92\x0b\x12\x1f\x08\x73\x6d\xea\xb6\x2a\x02\x59\xd9\x8f\xc0\x9c\x87\xca\xea\xaa\x9c\x37\xec\x56\xf1\xb6\xe3\xd4\x72\x1c\x19\x4a\x71\xc4\x5c\xb2\xf2\x45\x7b\xac\xa0\x19\xdf\xc1\xb2\xac\x29\x6a\xde\x5e\x7a\x3b\x9f\x44\xee\x2f\xb4\x46\x63\x4d\x37\x3a\xe9\x5e\xee\x4b\xc6\x99\xd6\x0d\x99\x17\x59\x11\xf0\xc6\x6a\x22\x25\xfa\x29\xb4\xa7\x7c\xfa\x18\x67\xbc\x0b\xf3\xbc\x07\x3e\x4b\xf1\xcc\x17\x22\xf4\x52\x84\xbd\x18\x89\xbe\x60\x0f\xf3\xfb\x23\xd3\x2e\x4f\x79\x99\x2f\xb8\x6c\xd2\x36\xaf\xa9\x65\xa9\xc0\x1f\x80\x10\xf9\xf1\x38\xdb\xac\x7b\x71\x5c\xed\xc6\x53\x4a\xa7\x0e\xa7\x62\x0b\xe2\x81\x88\xd1\x29\x1b\x3b\x31\x63\x37\x6b\x41\x5b\x39\xa6\x6a\xe5\xeb\x52\xc9\x72\xfe\x69\x6b\xf2\xd8\x8a\x54\xb4\x9c\x1c\x71\xf1\x6b\x3c\xb6\xa2\x94\xa4\xa2\xf2\x66\x8b\x96\x2e\xcb\xc6\x52\x9f\xef\xfd\xc6\xc4\x12\x3f\xef\x10\x74\xd1\x78\x42\x77\x4e\x12\x6e\x85\x54\x6c\x46\xe1\xd3\xd9\xd5\x71\x55\xab\xbd\x33\x67\x1f\x5d\x11\x5e\x0d\xfe\xb2\xa9\x95\xeb\xa9\xf8\x2e\xd1\x9f\x69\xeb\x46\x3c\x5e\xc4\xcc\x3b\x07\xe8\x1d\x03\xec\xf9\x81\xe8\x77\x6d\x57\xf2\x97\xfa\xaf\x98\xd8\xd1\x78\xa5\x8c\x8d\x6c\x41\xd2\x96\xa5\x82\x1c\xcb\xa9\xc5\xa2\xcc\x0d\xa1\xf3\x5e\xc8\x9a\xb1\x91\x30\xc6\xc2\xb7\xa7\x17\xab\x2e\x1e\xdc\x51\x3e\x9f\xad\xc9\x28\xf4\x7f\x8c\x79\x9a\x97\x73\x4a\xde\xf1\x1f\x70\x14\x2d\xb4\xc9\xac\xd1\xd5\xf9\x76\x86\xff\x6a\xc1\xe6\x94\x6b\x18\x2d\x4c\x69\x6f\x5e\x6d\x07\xb2\xf7\x62\xa9\xd8\x64\xce\xd8\xe7\xf2\x4f\xac\xdb\x38\x24\xc4\x3d\x24\x62\xa3\xe6\x83\xf7\x4e\x0c\xfd\x58\x2c\x91\x91\x72\x37\x8d\xaf\x4c\x29\x6f\x1c\xc5\x3d\xb7\xfc\xa0\xaa\x81\x13\xbe\x01\x73\xea\x7b\x1b\xb1\xee\x60\xd9\x6e\xe9\x58\x2c\x31\xab\x6a\xb2\xab\xd9\x58\x4e\xd2\x73\x52\xde\xb8\x7b\x73\x7c\x84\xaf\x9e\xb7\xa7\x0b\xeb\x55\xd3\xe0\x8a\xdd\x46\x2a\x7e\x7f\xb9\x7a\xde\xb8\x3f\xfd\x9f\xee\xa3\xf3\xe2\xd3\x3f\x43\x53\xfc\xd3\x7f\x82\x8e\xd1\xd1\x26\x3e\x1f\x42\x94\x92\x2e\x19\xad\x8d\x73\x31\xb7\xed\x62\x6c\xe5\xfc\x9d\xb6\x19\xb6\x22\x88\xf9\x7f\xb7\x77\xb0\x7b\xc4\x30\xb5\x71\x83\x91\xf9\xd6\xbd\xb5\x8b\x82\x27\x6a\xf4\x41\xfd\x76\x1a\xf1\xb2\x88\xb5\xe9\xc8\x4a\x01\x12\x9f\xbd\xb6\x3e\x81\xc4\x27\x24\x3e\x37\x59\xe2\xb3\x23\x68\x29\x54\xc9\xb3\x6d\xb6\x3f\x3b\x4e\xfb\x58\x2a\x3e\x62\x7b\x75\xee\x77\xbb\x82\xf8\xf1\x77\x83\x27\x88\xbd\x2f\x49\x63\x55\x9a\x9f\x66\x71\x09\x35\xaf\x9b\x55\x4a\xf9\x2f\x8a\xc3\x3d\xff\x7c\x98\xfd\x68\x3f\xbd\xca\x16\xfe\x14\xc2\xd9\x4f\xf8\x60\xcf\x9a\x52\xa7\xc9\xb8\x71\x94\xa5\xd0\x29\xa4\xb0\xab\x8f\x69\x31\x03\x2d\x6c\x68\x11\x94\x32\xd7\x8e\xb6\x0c\x6d\x75\xef\xee\x14\x87\x5e\x0d\x9f\xb1\x47\xd9\xe1\x00\xd5\xcc\xaa\xae\xd4\x96\x78\xf8\xf6\xf6\x9a\xe7\x92\xf0\x27\xa2\xb5\x8f\xe6\x49\xf3\xc0\x4e\x3e\x9d\xcc\x45\x7a\x8a\xce\x55\x2d\x1d\xee\xe4\xf1\x60\xed\x00\x52\xda\x24\x29\xfd\xb5\x3e\x7a\x5a\x60\xce\x2c\x9d\x75\x30\x67\x9b\xcc\x45\x6b\xad\x52\x83\xa5\x17\x1a\x33\x3e\x41\xa5\x17\x42\xac\x51\xf2\xa7\x77\xd5\x18\x9f\xa8\x8d\x50\x6b\xed\xcd\x13\xe2\xb7\x8e\x9a\x1b\xf0\x54\xf0\x54\xf0\x54\xf0\x54\xf0\x54\xf0\xd4\x76\xf3\xd4\xf0\xb5\xc1\xc6\x79\xea\x9d\x6f\x4f\xc2\x79\x6a\x5b\x77\x28\x99\x7f\xb5\xb3\x66\x91\xb0\x2f\x04\xa9\xd6\x2e\x1d\xf6\x94\xdd\x85\x1e\xda\xbd\x72\x00\x5f\xed\xb5\xf5\x0a\xf8\x2a\xf8\xea\x26\xf3\xd5\x4e\x63\xab\xb6\x5a\xfd\x50\x90\x9b\x3d\x49\xc7\xd9\x44\xfc\x88\x8d\x4e\x1f\xf1\x54\x45\xaa\xbe\x42\x07\x8a\x21\x7d\x7b\x98\x32\x0d\x89\x04\x58\xe6\xaf\x54\x59\x57\x8b\x6b\xab\x72\xae\x28\x29\xab\x36\x2b\xfd\xc4\x30\x7b\xdb\x36\x47\x33\xe0\x33\x8d\x68\x06\xcc\xdb\x2d\x2e\xf2\x16\xa7\x8c\x16\xbb\x42\x42\x20\xe9\x2b\x21\xe0\xdb\x5f\x28\x0a\x34\xa1\x28\x70\x25\xfc\x25\x3c\xc0\xc6\xab\x15\x05\x7c\xc7\x1f\x02\x03\x10\x18\x80\xc0\x00\x04\x06\x20\x30\x00\x81\x01\x08\x0c\x40\x60\x00\x02\x03\x10\x18\x80\xc0\x00\x04\x06\x20\x30\xb0\x99\x02\x03\x19\x3a\xcd\x4e\xc6\x8f\xdb\x98\xe3\x71\x0f\xe6\xf0\xdb\xc7\xdd\x0d\x51\x66\xd0\x1b\x80\xde\x00\xf4\x06\xb6\x90\xde\xc0\xfb\x87\xe9\x90\x88\x0a\x95\xca\x65\xbd\x4e\x42\x7c\x5e\x92\x57\x8d\xa5\xa1\x23\x92\xfa\x5f\x87\xd8\x7f\x89\xd0\x3d\xc6\x79\x4b\xeb\xe9\xe8\x6e\x9f\xa8\xd0\x69\x7e\xd2\x82\x5c\x49\x3e\x62\xfc\x3a\x59\x2e\xeb\x6e\x9c\x68\xff\xdc\xe2\x40\xd0\x67\xe9\x84\x20\x7e\x87\xe8\x00\x27\x7e\x29\x1a\xa1\x64\x20\x51\x37\xee\x80\x87\xfa\x58\xdd\xb9\xd3\xc8\xcf\xa7\xc2\xe1\x5e\x92\x0d\x99\x70\xcf\xb8\xba\x89\xf7\x9c\x0e\x78\xb2\xdf\x7f\x61\xbb\x33\xca\x8f\xf9\xc7\x78\x3a\x03\x1d\x33\x0f\xe8\xd0\x58\x67\x4e\xd3\x49\x3a\x5e\xe5\xb1\xdc\xd0\x60\xc3\x47\x89\x38\xce\x26\xe3\x38\x7f\xb2\xef\x4e\x5f\xf4\x8c\x08\x03\x3d\x46\x47\x9d\x30\xd0\xce\x19\x0b\x1e\xa9\xd9\x5a\x63\x91\xfc\xee\x7d\x8e\xb1\x60\x76\x4c\xa6\x63\x1f\x1e\x13\x7f\xeb\x94\x79\x40\x18\x26\xc2\x30\x11\x86\x89\x30\x4c\x84\x61\x22\x0c\xb3\x37\xd3\xda\x5b\xfb\x7d\x0f\x8f\xea\xcc\xfc\xf9\xbd\xce\x0a\x60\x28\x24\xe0\xd2\x59\x17\x3c\xca\xc3\x73\x3a\xb0\x2c\x40\x8c\x65\xaf\x2d\x46\x10\x63\x89\x18\xcb\x4d\x8e\xb1\x6c\x3b\x11\x6a\xb1\x95\x0f\x8d\xa2\x3c\x44\x07\xd8\x78\x7c\x9f\xed\x1a\x78\x8d\xdb\xbd\x60\x37\x7a\x37\xb8\x14\xd8\x07\x93\xf4\xb4\x89\x28\xd7\x2a\xaa\x9e\x93\x8a\x4a\xa9\x10\x1a\xac\xc9\x9f\x8f\xf1\x36\x17\xcb\x6a\xde\x3a\x51\xd6\x6c\x7a\xf9\x87\xc3\xec\xa7\xb6\xd1\xab\x5c\x4d\x1a\xdf\xcb\x5f\x6f\x24\x6a\xf3\xac\xdd\xf4\xbc\x9a\x9f\xb4\x9b\xee\x8a\xb8\xcd\xfd\xfc\x72\x93\xce\x5d\xb9\xbf\xe6\x01\x1d\x47\x00\x67\xed\xfb\xbc\x1c\xfe\x3e\x9f\x62\x27\xac\xf7\xd9\x19\x6e\xf3\xb5\x0e\x18\x69\x54\xb9\x47\x2c\x27\x62\x39\x11\xcb\x89\x58\x4e\xc4\x72\x22\x96\x13\xb1\x9c\x88\xe5\x44\x2c\x27\x62\x39\x11\xcb\x89\x58\xce\xae\x8e\xe5\x9c\xa6\x0c\x3b\x1d\x3f\x69\x43\x93\x3d\x6e\xd8\x12\xb0\xd5\xbb\x1b\xd0\x0b\xa2\x39\x11\xcd\x89\x68\xce\x2d\x14\xcd\xf9\xfc\x28\xcd\xfb\xa0\xd2\x71\x21\xf4\xd9\x24\x29\xfd\xa5\x11\xf6\x62\x3f\x3d\xe0\x21\xa5\xa2\xc5\x68\xd2\x27\xe6\x33\xc0\x1e\x26\x0f\xf3\x08\x50\x17\x98\x14\x6d\x74\x8e\x4e\x0a\x98\xa8\xd1\x15\x01\x13\xe7\xe9\x02\x87\x89\x67\x69\x96\xa6\x83\x3d\x01\x4e\x87\x53\xe6\x5d\xa7\x82\xe0\xde\x1d\x46\x8d\x16\xc2\x91\xe3\x34\xcb\x38\x04\x71\xdc\x23\xd9\xd7\x38\x83\x8c\xfe\xd6\x0e\xff\xa7\x39\xea\x1f\x5b\x1a\xf4\x40\x27\xac\x48\xd3\xcd\x7e\xa6\x99\xe7\xe8\x59\x5a\xac\xf2\xe8\xb6\xe8\xa1\xc2\xbb\x8b\xe8\xd4\x26\xa3\x53\xff\xa0\x8f\xae\x8a\xf0\xd2\x67\x68\xc1\x09\x2f\x6d\xbf\xbd\x69\x9b\x85\x6b\x30\xa2\xb5\x31\x43\x76\x07\xbe\x13\xd3\xf2\x25\x3f\xbf\xcb\xdf\x90\xc5\xec\xb8\xd7\x20\xdb\x75\xd4\x8c\x82\xdd\x74\xd3\x85\xf8\x58\xc4\xc7\x22\x3e\x16\xf1\xb1\x88\x8f\x45\x7c\x6c\x6f\xc6\xc7\x76\x6a\xb5\xd0\x40\xe4\xec\xef\xee\xf4\x5f\x4f\x1c\x0a\x89\xa2\x0d\x5a\x65\x1c\x29\x57\x07\xe3\x74\x7c\x91\x81\x68\xdb\x5e\x5b\xda\x20\xda\x16\xd1\xb6\x9b\x1c\x6d\xbb\x89\x8c\xad\xb1\xaf\xc9\x06\x3f\x1d\x3e\x1f\x9f\xf0\x08\xdd\x5e\x75\x1a\xb1\x17\x86\xad\x92\xfb\x22\x0e\xd1\x55\x6c\xbf\x6e\xc4\xae\x38\xda\xa2\xce\xcf\x0f\xb3\x3f\x1b\xa0\x1d\xe2\x8f\x4b\xeb\xe9\xe8\x87\x1b\x09\xcd\xe5\xc1\x9d\x5d\x11\x88\xbb\xfb\x96\x1d\x6c\xea\xc9\xa8\xe1\x7f\x41\xc4\x6d\xed\x9b\x7b\x29\xfc\xcd\x1d\x63\xa3\xe6\xab\xe8\x99\x59\xe6\x4a\x50\x5c\x06\x11\xb6\x88\xb0\x45\x84\x2d\x22\x6c\x11\x61\x8b\x08\x5b\x44\xd8\x22\xc2\x16\x11\xb6\x88\xb0\x45\x84\x2d\x22\x6c\x11\x61\xdb\xcd\x11\xb6\x75\x6b\x70\xf3\x8d\xdd\xdd\x80\x46\x10\x4f\x8b\x78\x5a\xc4\xd3\x6e\xa1\x78\xda\x6f\x26\x68\x44\xa0\x4c\xbd\xa2\x6a\x52\x41\xae\x61\x99\xe6\xdf\x73\x45\x49\xd7\x65\x9d\xfd\x56\x82\xfd\xda\x00\x91\xf9\xd7\xa5\xf5\x74\xf4\x4d\xe6\x57\xb6\x94\x57\xd6\x95\xfc\x9a\x54\xf4\x00\x4c\x7b\x45\xbb\x20\xce\x98\x32\xda\x69\x09\xbf\x4c\x25\x1f\xe5\x27\x98\x0d\x2f\xa6\xdd\x57\x38\xaf\xe8\x60\x90\x3e\x0c\x72\x8f\x3f\x2f\xdc\xc9\x88\x77\xcc\x18\x69\xba\xf1\x5c\x38\xa8\x3c\xcc\x0e\x9a\xa0\xd2\x3b\x6f\x4c\x52\xe9\x7e\x14\xa8\xde\x04\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\x09\x1e\xb9\x99\x3c\x12\xe4\x0f\xe4\x0f\xe4\xaf\x87\xc9\xdf\xc7\x1f\xa4\x98\x55\x14\xbe\x3a\x5e\xf1\x2d\x63\x3a\x4f\x6d\x60\xef\x7e\x90\x7d\x2d\xe2\x94\x7c\x1f\xe4\xd9\xf0\xe2\x37\x6b\x1c\x9d\x8f\xaa\x1d\x02\x98\x7c\xc8\x38\xae\xaa\xb4\xba\x48\x96\xd8\xdc\x3a\x48\xc6\x7d\xa4\xd6\xd3\x29\xbb\x53\x77\x9a\xd1\x7e\x2e\x9c\x94\x0d\xb1\x41\x37\x00\xab\x2e\x78\xee\x74\x25\xfa\x91\xed\xce\x48\x0f\x5b\x99\xea\xe1\x83\xbd\xdb\x3c\xb4\x03\xe3\xbd\xe1\x5a\x48\x35\x03\x8e\xec\x06\x64\x9b\x77\xa8\x16\x52\xed\xcb\xbe\xf1\x5a\x48\x1b\x37\x18\x8d\x59\x84\x60\x2b\xe0\x89\xee\xad\x9f\x86\x9e\xf9\x8b\x7b\x1d\x83\x31\x5e\x93\xc1\x15\x6e\x39\xa2\x3c\x90\xbf\xcd\x76\x03\xf9\x59\xbd\x66\xc1\x90\x9f\x85\xfc\xac\xad\x55\x0d\x61\xe3\x66\x3e\x2c\x39\xaa\xa5\x2b\xc3\xfa\xb5\x10\xec\xe3\x6a\x03\x88\x5a\x9e\xf9\xf4\x77\x83\xf4\xa0\xb7\x98\xaa\x53\x35\x95\xfd\xc9\x20\xfb\xdd\x7e\xa7\x32\x4f\x42\xb0\x63\xcd\xa4\x5e\x16\x16\xb1\x12\x99\x9c\xc2\x3c\x7b\x8c\x03\x45\x5d\x1e\xfb\x8f\xb3\xaa\x36\x59\x2c\xda\xb7\xd6\xba\xef\x51\x9b\x7c\xf9\x57\x69\x52\x4c\xb8\x09\x3a\xc2\x27\xdc\x38\xed\xa3\x54\xe3\xe5\x37\xce\x2b\x7a\xc7\x4b\x70\x3c\xea\x3f\x87\xef\x61\xdb\x78\x18\x00\x5c\xf5\x70\xd5\xc3\x55\x0f\x57\x3d\x5c\xf5\x70\xd5\xc3\x55\x0f\x57\x3d\x5c\xf5\x70\xd5\xc3\x55\x0f\x57\x3d\x5c\xf5\x70\xd5\xc3\x55\x0f\x57\x3d\x5c\xf5\x9d\x72\xd5\xbf\x38\x4c\x27\xbc\xd4\xad\xae\xcc\x90\x26\x73\x82\x65\xbc\xc0\x96\xd6\xd0\x0f\x0c\xb3\x3f\x1f\x70\xd0\xdc\xc7\x1a\x51\x1a\xba\x24\x9a\x59\x90\xbb\x43\x6e\xe8\xb1\x5b\x7e\xe5\xbb\x9d\x4e\x76\x3b\x21\xdc\x8c\x6c\x9f\x0b\xe1\xc0\x70\x2f\x1b\xae\x05\x86\xce\xa8\x42\x6d\x08\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\x10\xc8\xb0\xab\x91\xe1\x61\x3a\xc8\xf6\xc7\xd3\x76\xc0\xd0\xf7\xb8\x03\x86\x9c\xdd\x1d\x24\x87\x40\x33\x41\x33\x41\x33\x3b\x4a\x33\xbf\x78\x8d\xf6\x0b\x9a\xb9\xcc\x29\xe6\x7a\xba\x6e\xf1\xce\x9c\xa6\x96\x6e\xa8\xcb\x3a\xfb\x89\x6b\xec\x5d\x83\xf4\x4a\x7e\xd2\x92\x79\x52\xf4\xc9\xfa\x41\x86\x53\x9a\x5a\xca\xaa\xcb\xc9\xc7\x8d\xc3\x32\xc6\x21\x8b\xe9\xaa\x02\x25\xe6\x21\x5d\x8e\x0f\x33\x20\x6b\x20\x6b\x19\x90\x35\x90\x35\x90\x35\x90\xb5\x9e\x21\x6b\x99\xae\x21\x6b\x2d\xef\x49\xd3\x64\x2d\x03\xb2\x06\xb2\x06\xb2\x06\xb2\x06\xb2\xd6\x79\xb2\x96\xe9\x69\xda\x94\x01\x6d\x6a\x1f\x6d\xca\x74\x3b\x6d\xca\x6c\x41\xda\x94\x7d\x03\xcd\x88\xb0\xab\x93\x74\x9c\x87\x5d\x1d\xa2\x03\x34\x1e\x98\x98\xc9\xe9\x52\xca\xa4\x4b\x29\x93\x0d\x35\x94\x9c\x19\x92\x4d\x79\xe3\xe9\xf0\x58\xac\x14\x1b\x31\x63\xb1\x78\x37\xcc\x60\x2c\xb3\x13\xee\x48\x2c\x51\xb4\x31\xfe\xbf\xb6\x57\xe3\xb0\x5d\xe2\xfb\x13\x93\x6c\xf2\xb5\x47\xfc\xa5\x33\xec\x4b\xa0\xaa\x69\xca\xd0\xe9\x2a\xc1\x85\x7a\xc9\xb0\xbe\x63\x0e\x99\x05\x08\xc5\x34\x29\x14\xf3\x37\x7d\x74\x46\x94\xf9\x3e\x4d\x27\x5d\x65\xbe\xeb\xa7\x64\xfb\xce\xc2\xc0\xb7\x7e\x63\xe9\xde\xfe\x6d\xcf\x0a\x39\x9a\x53\x74\xc2\x91\xa3\x69\xa2\x9d\x70\x03\x54\x56\xdb\x63\x80\x92\x7f\x3c\x52\x6d\x80\x76\x9b\x95\xe4\x5d\x65\xf9\xd5\x15\xdb\x18\x8d\x8a\x5f\xdd\xc6\x68\xca\x3e\xb0\xdd\x66\xe9\x32\x5d\xa2\x79\xb7\x59\x4a\x66\xe8\x74\x13\xf1\xb7\xd3\xfc\x1e\x2e\x72\xd0\xaa\x03\xc9\x02\xc9\x02\xc9\x02\xc9\xf6\x10\x92\xc5\xc2\x2c\x64\x61\xd6\x3d\xcc\xfa\xe5\x08\x7d\x35\xc2\xbe\x12\x89\x7e\xd9\x7e\x54\x1f\x8b\x5c\x76\xef\x12\x95\x52\x4c\x17\x3b\xbd\xd8\xb2\xbc\x22\x1c\xbc\x36\x4d\x71\x3e\x59\xe6\x5b\xc2\x07\xcb\xb5\x04\x2c\xa9\xa5\xd1\x92\x5c\x90\xf8\x23\x31\x37\x8a\xee\xa5\xa2\xe0\xaa\xf6\x64\x30\xd7\x06\xca\xea\xaa\x9c\x37\x16\xa3\xc5\xdb\x8e\xe7\xd5\x31\xed\x4a\x71\xc4\xdc\x3f\xf2\xdb\x8d\x15\x34\x29\xc7\xe7\x89\xa2\xe6\xed\x0f\x8f\xf3\x71\xe0\x4e\x6d\xeb\xb9\xac\xe9\x46\x27\xdd\x03\x25\x19\x67\x5a\x37\x64\x5e\x64\x45\xbc\x6f\x56\x13\x29\xd1\x4f\x21\x61\xe5\xd3\xc7\x38\xe3\x5d\x98\xe7\x3d\xf0\xdb\x17\xc3\x35\x00\xd7\x00\x5c\x03\x70\x0d\xc0\x35\xd0\xd3\xae\x81\x2f\x44\xe8\xa5\x08\x7b\x31\x12\x7d\xc1\xfe\xda\xbe\x3f\x32\xed\xca\x9c\x2d\x17\x65\x49\x97\xed\x57\x7f\x5e\x53\xcb\x52\x81\x7f\x87\xe7\xd5\xa2\x92\xbb\xed\x09\x0c\xb2\x1e\xb7\x93\x7a\x6b\x3c\xf0\x74\xea\x70\x2a\xb6\x20\xec\x88\xf8\x48\x96\xe5\x92\x31\x4d\x9d\xaf\x88\x1c\x53\xb5\xf2\x75\xa9\x64\x05\x2a\x69\x6b\xf2\xd8\x8a\x54\xb4\x56\xff\x71\xf1\x6b\x3c\xb6\xa2\x94\xa4\xa2\xf2\x66\xcb\x7c\x2f\xcb\x31\x29\xcf\x39\xbb\x3a\x26\xb0\x6b\xde\x59\x5a\x8a\xc6\x13\xba\x73\x92\x58\x6f\xa7\x62\x33\x0a\x37\x49\xae\x8e\xab\x5a\xed\x9d\x39\xbe\x8d\x8a\x58\xee\xf3\xd5\x9f\x5a\xb9\x9e\x8a\xef\x12\xfd\x99\xb6\x6e\xc4\x1b\xf1\xf4\xce\x01\x7a\xc7\x00\x7b\x7e\x20\xfa\x5d\x3b\xec\xed\x4b\xfd\x57\x4c\x3b\x68\x4c\xd1\xeb\xea\xad\x58\x41\xd2\x96\xa5\x82\x07\x3a\xd8\x0b\x35\x59\x5b\x51\xb5\x55\x63\x2c\x7c\x7b\x7a\xb1\xea\xe2\xc1\x1d\xe5\xcb\x1a\x6b\x4d\x52\x16\x77\xa5\x18\xeb\x85\x9c\x92\x77\x16\xd6\xfc\xdb\x28\x94\x2e\xad\xd1\x35\x3e\x4e\xe6\x97\xc3\xfa\xfa\xa5\x5c\xc3\x68\xd9\x4d\xdb\xa1\x60\x07\xbb\x79\x2f\x96\x8a\x09\x90\xc5\x6d\xb1\x7b\xb5\x9a\x10\xf7\x90\x30\xf6\x3c\xfc\x5f\xde\x89\xa1\x1f\x8b\x25\x32\x52\xee\x66\x41\x53\xd7\x4a\x79\xe3\x28\x1e\x65\xc6\x0f\xaa\x1a\x38\xb1\x58\x31\x57\x40\xde\x46\xac\x3b\x58\xb6\x5b\x3a\x16\x4b\xcc\xaa\x9a\xec\x6a\x36\x96\x93\xf4\x9c\x94\x37\xee\xde\x1c\x1f\x11\x57\xc8\xdb\xd3\xc5\x72\xba\xa6\xc1\x15\xbb\x8d\x54\xfc\xfe\x72\xf5\xbc\x71\xaf\x6d\xe0\x79\x83\xe7\xad\x47\x3d\x6f\xd9\x42\x30\x88\x3e\x2f\x40\xf4\x0c\x4d\x71\x10\x7d\x82\x8e\xd1\xd1\x26\xa8\xa6\x90\xfd\xb6\x58\x72\xd2\x9f\x25\x3f\xc0\xee\x17\x6f\xb3\x63\x69\xdb\xc1\x95\xb7\x60\x16\x0a\xfb\x5a\x84\x5e\x2b\xa2\xda\x45\xc4\xb5\xab\x8e\x2e\x7b\x31\xc2\x5e\x88\xd0\x0e\xf1\xc3\xd2\x7a\x3a\xfa\xda\x82\x5c\xf1\xae\xac\x85\x7f\x34\x69\xfc\xc0\xa5\x1d\xf4\xc5\xf4\xe4\xfc\x9c\x05\x13\x5b\x28\xc7\x5e\xd3\xd0\x44\x4d\x43\x13\x8d\x34\x94\x2d\xd3\x33\x62\xe6\x5d\xa0\xf3\x7c\xe6\xcd\xd2\x34\x65\x9a\x98\x79\xae\xfb\x6c\xc4\xd1\xca\xfe\xd7\x35\x1a\x33\x4b\x16\xe7\xae\xcb\xf9\xb5\xa2\xb1\x27\xb6\x47\x5b\xe4\x12\x94\x35\x45\xd5\x94\xca\x6d\xab\x6a\xf1\xef\x5e\x63\x9f\x1a\x24\xe6\x9c\x60\x3b\x2c\xf6\xd6\x4f\x20\x98\x37\x1b\xe2\x95\x6c\x93\x71\xe3\xe0\x05\xbb\x11\xd3\x85\xe1\x39\x06\x79\x04\xc8\x23\x40\x1e\x01\x9c\x56\x70\x5a\xc1\x69\x05\xa7\x55\xd7\x38\xad\xba\xc7\x27\x03\x67\x01\x9c\x05\x70\x16\xc0\x59\x00\x67\x41\x4f\x3b\x0b\x40\x33\x41\x33\x7b\x94\x66\x6e\xc9\x3c\x82\x8d\xc9\xb7\xa6\x5c\x68\xca\x0a\xd7\xf5\x60\xa2\x96\xa4\x14\xe4\xc2\xc9\xeb\x69\x76\xb2\x06\xaf\x9a\x28\xb6\x86\x9e\x99\x58\xd6\xd3\x4f\x8a\xbf\xb0\xc3\x97\x9b\x7d\x8f\x9d\x69\xe0\x45\x64\x4f\x88\xbf\x77\x08\x92\x09\xa6\x75\x91\x9e\xa2\x73\x55\x09\x07\x75\x28\x78\xe8\xc3\x41\x88\x1b\x72\x0f\x9a\xcc\x3d\xf8\xe1\xc8\x86\x1c\x32\xa1\x53\x91\x9e\x16\x49\x02\x59\x3a\xeb\x24\x09\xdc\x61\x93\x97\x44\x72\xc4\x39\x9a\x73\x25\x47\xdc\x61\x9b\xcd\x9b\x32\x91\x9c\xd0\x98\x29\xdb\x90\xe5\xaa\x4d\x57\xf8\xbb\x11\x5f\x53\x16\xf7\xcd\x59\xf0\x9a\xb5\x94\x38\xa6\xc6\xac\x39\xe9\x0b\xed\x34\x70\x48\x5d\x00\x05\x06\x05\x06\x05\x06\x05\x46\xea\x02\x52\x17\x90\xba\x80\xd4\x05\x78\x23\xe0\x8d\x80\x37\x02\xde\x08\x78\x23\x90\xba\x80\xd4\x05\xa4\x2e\x20\x75\x01\xce\x3e\x38\xfb\xba\xd0\xd9\x97\x2d\xb4\x36\x43\x21\x94\x34\x6f\x24\x75\xa1\x13\x0e\xb4\xd6\xa7\x1a\xfc\xb7\x41\x62\xc6\xc4\x1a\x5b\x4f\x8f\x09\xf4\xb7\x2a\x95\x75\xf6\x47\x83\xec\x85\x7e\xba\x27\xa7\x6a\xf2\xd2\x7a\x3a\x9a\x08\x51\xc6\xe7\x27\x3e\x25\x95\x93\x7b\x8c\x03\xa7\x54\x4d\x5e\x4c\xdb\x7f\x9c\x55\xb5\xc9\x62\xd1\x56\xe4\xe9\xf6\xa8\xf6\xec\xd5\x8d\xe9\x31\x19\x63\x64\x4c\x29\xfb\x7e\x5b\xe2\x8e\x3d\x17\x3e\x9b\x86\xd8\xa0\x39\x79\xe2\x71\x2b\x0b\xc6\xea\x83\xa7\xd4\x26\x2a\x69\x22\x4e\x1f\x95\x34\xe1\xa1\x81\x87\x06\x1e\x9a\x1e\xf2\xd0\xa0\x92\x26\x2a\x69\x82\x8c\x83\x8c\x83\x8c\x83\x8c\x77\x05\x19\x47\xb9\x4a\x94\xab\xdc\x2a\x2c\x10\xe5\x2a\xdb\x51\xae\xf2\xbb\x44\xe3\x16\x6d\x0b\x28\x51\x59\x56\xf3\xe6\x1f\xde\x32\xb6\xac\x94\xf2\x4a\xa9\xc0\x5e\xa0\xf8\x4f\x0f\x38\x34\xee\xb5\x66\xb8\xbc\xf9\xb3\x30\xa0\xf3\x6a\x3e\x69\x7e\x41\x04\x7f\x73\x24\xb0\xe7\xd5\x7c\x46\x1c\xda\xe2\x50\xd2\x93\x74\x9c\x26\xaa\x62\xe5\x93\x34\x14\x8a\xca\xcc\xde\x64\xbf\xdc\x17\x2c\x45\x73\x4c\x30\xb8\x03\x34\xce\x19\xdc\x08\x6d\xa0\x61\x3a\x2d\x02\x9d\x8f\xd2\x61\x27\xd0\x79\x63\x2d\x4c\x8a\xb8\xe6\x09\x3a\xe2\x8a\x6b\xde\x50\x13\x16\xe9\x9b\x0b\x27\x79\x83\xec\x89\x6a\x92\x67\xf5\xc3\xcd\xf1\xc2\x02\x9f\xb3\x08\x49\xab\x1f\x92\x96\x45\xaa\x41\x40\xaa\xc1\x01\x1a\x67\xfb\xe2\x29\x5b\x24\xe9\x01\x77\x8d\x6f\x73\x2e\xde\x0d\x05\xbe\xd9\xd7\x77\xd3\x15\x21\xf8\x23\xad\x55\x54\x3d\x27\x15\x95\x52\x61\x6c\x7d\xbc\x6e\xd9\x60\x6e\x93\x8c\xe7\x51\x2c\xab\x79\xeb\x3c\x59\xb3\xed\xb4\xce\xbd\x49\xec\xdd\xbb\xd9\x97\xfb\xe9\x01\x57\xc3\x4b\x66\xc3\xd1\x03\x9a\x2c\xe5\x63\xe2\x38\x6b\x58\x9d\x9d\xd1\x59\xbb\xfd\x79\x35\x3f\x69\xb7\x9f\x3c\x61\x9c\x35\xe9\x34\xb7\x38\x5e\x55\x73\x25\xe0\x44\xe1\xdd\x6a\xad\xb1\xcf\x6a\x74\x45\x98\xe4\x79\xba\xc0\x4d\xf2\x59\x9a\xa5\xe9\x40\x6b\xe8\x1a\x85\x94\x39\x0a\xa9\x80\xee\x86\x3a\x4b\x0a\xe1\x26\x74\x9a\x65\x4c\x13\xea\xba\xb0\x69\x4b\x83\x2e\xeb\xd8\x56\xd1\x3f\xba\xf1\x88\xbf\x81\x7d\x05\x1b\x28\xc8\x15\x8a\xfe\xc9\x0e\xff\xa7\x7b\x58\x93\xcb\x45\x29\x27\x6f\xf8\x01\x9f\x36\x4f\xec\x92\x67\x9c\x79\x8e\x9e\xa5\xc5\xaa\x0f\x7a\x8b\x1e\x32\xe2\xa5\x91\x07\xd7\xe4\xc7\xe9\x0f\xfa\xda\x67\x7a\xae\x8a\x95\xe2\x33\xb4\xe0\xac\x14\x3b\x67\xd8\x82\xed\x4d\x79\xad\x42\x1d\xb3\x7b\x99\xff\x67\xa7\xbf\x61\x3b\x5d\x96\xb4\x8a\xc2\x7d\x52\x62\x23\xb4\x61\x0b\x77\xb2\x6c\x6c\x82\xba\xc0\xbe\x3d\x5c\xdd\xd0\x28\xef\xd9\x5e\x2e\x5b\xb8\xdb\xfd\xe3\xaa\xac\x15\x64\xf7\xaf\x83\xee\x5f\xf5\x8a\x26\x55\xe4\x82\x92\x1b\xad\x39\xce\xd3\x8a\xf1\xef\xdb\xe6\xaf\x46\x2f\x33\x17\xe8\x3c\x65\xab\x6c\xeb\x04\x1d\x69\x22\x78\x65\x9e\x3b\x79\x61\x4f\x43\xec\xe9\x47\xfb\xe9\xc3\xfd\xec\x43\xfd\xd1\x9f\xb7\xa3\x1e\xde\xde\xdf\x3b\xf6\xb4\x8a\x8b\x1b\xe3\xcc\xfd\xbc\xdc\x77\x63\x4c\x4e\x27\xda\x63\x28\x60\xe2\x0e\x73\x87\xa7\x08\x0b\x90\x8a\xfc\xcc\x92\x5a\x1a\x15\x67\xf3\x23\x78\x58\x88\x1e\x1b\xca\xea\x6a\x69\x5e\x84\x3d\x3c\x65\xbc\x16\xe6\xbf\x17\xac\x97\xc5\xf9\xe3\x70\xb0\xa1\xcf\xbc\xd4\x47\x2f\xf6\xb1\x17\xfa\xa2\x9f\xb3\x91\xce\x07\xfb\x66\x55\x2d\xc7\x5d\xe9\x05\x95\x0f\xbb\x1a\x8b\xaf\x18\x7f\x8a\xc7\x26\x3d\x77\xc1\x61\x9d\x48\x5e\x59\xd3\x1d\x07\xef\xa8\x94\xe3\x37\xce\xdd\xe6\x45\x25\x67\x46\xa5\xca\xc5\xbc\x1e\x53\x6f\x99\x63\x2a\xdc\xca\x65\x59\x2d\x17\xe5\x54\x4c\x5c\x91\xc7\xa9\x58\xcf\x92\x43\x33\xdf\x01\xb0\x2f\x1f\xdf\xc6\xbb\xe5\x89\xb9\xe8\x85\x35\xf3\x63\xfe\xdf\xb0\xed\xec\x15\x7c\x80\x28\x3b\x4d\x19\x76\x3a\x7e\xd2\xde\x25\xee\x71\xef\x2d\x03\xae\x73\x57\xec\x35\x7f\x3b\x41\xa3\x62\xaf\x99\x57\xf4\x9c\xba\x6e\x18\xf3\x2a\x6d\x59\xb9\x94\x2f\xab\x4a\xa9\xa2\x17\x95\x9c\xac\xb3\x1f\x4d\xb0\x1f\x18\xa0\xfb\xed\xc3\x1b\x55\x96\x9d\x31\x9b\x59\x30\x9a\x49\xa6\x8d\x83\xa7\xad\x36\xcc\xe4\x72\xcf\x21\x5b\x2d\x24\xef\x06\x5d\x14\xef\x91\xf1\xfe\x18\xef\xd1\x69\x3a\x49\xc7\x03\xdf\x23\x67\xb8\x2d\x81\x01\xcf\xdd\x37\x14\xa0\xb7\x1c\xfe\xfe\x9c\x62\x27\xc4\xcb\xe2\x69\xbd\x56\x2b\xc0\x7c\xc9\xaa\x27\x41\x3d\x9e\xc7\x83\x00\x11\xb7\x87\xb8\x3d\xc4\xed\x21\x6e\x0f\x71\x7b\x88\xdb\x43\xdc\x1e\xe2\xf6\x10\xb7\x87\xb8\x3d\xc4\xed\x21\x6e\x0f\x71\x7b\x88\xdb\x43\xdc\x1e\xe2\xf6\x10\xb7\xd7\xa9\xb8\xbd\x7f\xec\xa3\x5d\x63\x6a\x59\x2e\x29\xf9\xb1\xf5\xf4\xd8\x8d\x5b\x37\xf5\x31\xf6\x97\x7d\xec\xbf\xf6\xd1\x2b\xc4\x9f\xa3\x57\x0b\x72\x85\xbf\x75\x4a\x4e\x8e\x49\xb9\x1c\x5f\x73\x70\x03\xaf\xc5\x2e\x96\xe5\xd2\xdc\x74\x2c\xbb\x70\xf1\x42\xec\x8a\xbc\x1c\x3b\x27\xdf\x36\x56\x32\xb1\x21\x93\xfb\xeb\xb1\xf2\xda\x72\x51\xc9\x99\x5b\xa1\x75\x59\xb3\x3b\xca\x97\xf9\xc3\xc9\x3d\x05\xb9\xb2\x20\x1a\x9f\x14\x6d\xcf\xf1\xa6\x45\xcb\xe7\xe4\xdb\xba\x5c\x19\x7f\xd0\xc3\xde\x6e\xdd\x1c\xd5\xe5\x0a\xf7\x4c\x65\x0f\x07\xc7\xd9\xed\x16\x60\xed\x35\xf4\x00\x07\x6b\xaf\xa4\x7b\x3f\xde\xb7\x9d\xcc\x09\x65\x97\xc9\x1a\xa6\x4b\x66\xd4\x4c\xde\x58\xca\x2b\x6a\x49\x93\x0b\x0a\xf7\x85\x19\x63\xe6\xd4\x27\xe3\x63\x37\xc6\xf7\xcc\x92\xb1\x52\xbb\x25\x2f\x5f\x57\xd5\x9b\x9e\xbd\xaf\x15\x37\xc3\xfe\xed\x30\x7b\x69\x1b\x3d\xe8\xdb\xe6\xd2\x7a\x3a\xfa\xb9\x3e\x73\x92\x3a\x73\x42\x2a\x59\x66\xdf\x62\x9f\x8b\xf6\xb5\xae\x88\x6b\x4d\xb9\xaf\x95\x72\x09\x87\x4c\xd8\x6b\xb3\x04\x6f\x37\xe1\x80\x07\xcf\x4e\x52\x2d\xcb\xb6\x2c\x98\x5e\x91\xa5\xfc\x88\xb3\xf2\xe3\xab\x5b\x73\x9d\x60\x2c\x1e\x9d\x25\x6d\xc2\xb3\x8b\x70\xb5\x9d\x4a\x4e\xf0\xcb\x4d\xfa\xdd\xe6\x62\xba\x7e\xff\xbb\x9d\xcc\x6e\x4c\xca\xba\x8e\x53\x93\x5b\x00\x5e\xae\x2e\x14\xcd\xbe\x39\x1c\xcd\x5e\x61\xcf\x58\xae\x8d\x3a\x13\xd6\xf4\x75\xd4\x7f\x02\xde\x10\xcc\x60\x6f\xc7\x2d\xe1\xed\x00\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\x05\xb3\xed\x2c\xb3\x3d\x47\x73\xec\x4c\x7c\xc6\x8e\x17\x4b\xba\xa3\xce\xea\xef\xf8\x6a\x83\xcf\x00\x80\x01\x80\x01\x80\x7b\x18\x00\xff\xca\xbd\x74\xcc\x4e\x1b\xe4\x38\xaa\x0a\x7c\x8a\x70\x4e\x5d\x2e\xae\xe8\x6b\xdc\xc4\x49\xb9\x9c\xac\xeb\xc6\x36\x44\xbe\xa5\xb3\x6f\x52\xfc\xeb\xdb\xe8\x35\x9e\x93\xed\xe0\xce\x98\x5d\xfe\x6c\x41\x2e\xae\x2c\x88\xf3\x27\xf9\xf9\x97\xf8\xf9\xc9\xb4\x38\x62\xd2\x7d\xba\x19\xd7\x19\x70\x4a\x8b\x13\xc3\xae\xd2\x73\xf4\x6c\x55\xf2\xc2\x59\x9a\xad\x17\xc9\xec\x1a\x25\x2b\x0a\x33\xa0\xaf\xd9\x4f\x45\x68\x49\xe4\x5b\x3f\x4b\x8b\xae\x7c\xeb\x2c\xb5\xec\x1a\xc1\x00\xfc\x75\x82\x5f\x5e\xa2\x79\xce\x2f\x5b\x79\xcd\xd7\x8b\xe4\xa2\x2b\xf4\x8c\x93\x5c\xd4\xc2\xf6\x1b\xad\x87\x55\x0e\xe7\xa5\x4f\xb1\x73\x4e\x28\x78\xcd\xfc\x36\x39\x69\xd0\x6d\xd6\x04\xbc\x22\x11\x1d\x89\xe8\x4d\xe6\xfa\xb5\x3c\x08\xff\xf7\x87\xe8\x80\xb0\xdc\xcb\xc2\x35\x65\xf9\xa8\x02\x72\xbd\x73\x9a\x5a\xba\xa1\x2e\xeb\xec\x7d\x43\xec\x83\x03\xb4\x9d\x9f\xb5\xb4\x9e\x8e\xea\xe6\xe6\xa6\x94\x57\xd6\x95\xfc\x9a\x54\xf4\xb8\xa5\x6c\x90\x30\xa5\xa9\xa5\xac\xba\xdc\x12\xbf\x53\x2a\xf9\x38\x3f\x21\x63\xfc\xc7\xad\xe8\x61\x5e\xe4\xbc\xa2\x57\xba\xdf\x41\x14\x68\x79\x5b\xee\x39\xb2\x0c\xe2\x1e\x7f\x83\xb8\x93\x11\xef\x98\x50\xd8\x3d\x1f\x6e\x15\x87\x59\xc2\xb4\x8a\x7c\x16\x58\x22\xbb\x62\xf0\x21\xb1\x0b\xb7\x0f\xdc\x3e\x70\xfb\xc0\xed\x03\xb7\x0f\xdc\x3e\x70\xfb\xc0\xed\x03\xb7\x0f\xdc\x3e\x70\xfb\xc0\xed\xb3\x99\x6e\x9f\xad\x27\x13\x00\x5f\x10\x7c\x41\xf0\x05\x6d\x21\x5f\xd0\x6f\x0c\x5b\xbe\xa0\x8d\x11\x45\x2b\xea\xfd\xad\xc3\xec\x4f\xdd\x60\xf1\x23\x8d\x44\xb9\xb7\x12\x2b\xde\x69\x38\xfb\x23\x75\xa1\x64\xf7\x03\xc9\xce\x47\xac\x87\x45\x8d\x03\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x6e\x69\x18\x59\xb7\xaa\x86\xb9\x73\xbb\x1b\x94\x4e\x81\x30\x81\x30\x81\x30\xb7\x10\xc2\xfc\xa9\xd7\xd3\x11\x33\x9c\xbd\x5c\xd6\xeb\x54\x23\x33\xbe\x1f\x9a\x6a\x58\x6f\x63\x33\xc3\x1f\x29\xfb\xea\x35\xf6\xfe\x41\xba\xc7\x38\x73\x69\x3d\x1d\xdd\x57\x5f\x9a\x78\xca\x6e\xe1\x92\xd9\x42\x72\xd0\x38\x63\xb2\x5c\xd6\x3d\xf4\xb0\xe6\xb8\x2e\x07\x89\x19\x50\x36\x50\xb6\x0c\x28\x1b\x28\x1b\x28\x1b\x28\x5b\xcf\x50\xb6\x4c\xd7\x50\xb6\x96\xf7\xa4\x69\xca\x96\x01\x65\x03\x65\x03\x65\x03\x65\x03\x65\xeb\x3c\x65\xcb\xf4\x34\x7c\xca\x00\x3e\xb5\x0f\x3e\x65\xba\x1d\x3e\x65\xb6\x20\x7c\xca\xca\xc1\x19\xa1\x59\x11\x99\x35\x45\x93\x3c\x32\xeb\x18\x1d\xa5\xc3\xc1\xb9\xf2\xe5\xb2\x9e\x5a\x4f\xa7\x6a\xc9\xd1\x79\x45\xaf\x84\x27\xc7\x8b\x34\xd0\xc5\xf0\xc8\xab\xfd\x2c\x6d\x25\xc7\x97\xcb\xba\x15\x78\x55\x73\x55\x4f\x0c\x56\xfc\x03\x3b\x1c\x44\xf6\xb0\x2d\xf0\xe0\x43\xc3\x86\x4c\x6d\x87\xce\xf1\x30\x81\xaf\xe6\xe8\x0c\xcd\x54\x49\x3a\x1c\xa4\xfd\x4d\x0c\x37\x4a\x51\xa2\xb4\x6f\x93\xe9\xfe\xdf\xe9\xa3\x59\xf1\xce\x9f\xa2\x13\xfc\x9d\x3f\x4c\xcd\x4d\x42\x3a\x27\xc4\x36\xa6\x29\xe3\x88\x6d\x34\xdd\xd8\x79\x21\x47\x32\x43\x53\x2e\x39\x92\xa6\x5b\x0b\x0b\x0f\x6d\x93\x0d\x0a\x13\x06\x49\xbe\x3c\xe2\xd8\xa8\x84\x58\x11\xc7\x72\x46\x7b\x39\xeb\x7b\xe5\x63\xaf\xc6\xc5\x81\xc2\x5e\x4d\xd9\x47\x77\xd0\x72\x5d\xa6\x4b\x34\xef\xb6\x5c\xc9\x0c\x9d\x6e\x22\x80\x77\x9a\xdf\xc8\x45\xce\x67\x75\x90\x5c\x90\x5c\x90\x5c\x90\xdc\x1e\x22\xb9\x58\xb6\x85\x2c\xdb\xba\x07\x75\xbf\x1c\xa1\xaf\x46\xd8\x57\x22\xd1\x2f\xdb\x8f\xea\x63\x91\xcb\xee\xcd\xa5\x52\x8a\xe9\x62\x83\x18\x5b\x96\x57\x84\x5f\xd8\x86\x30\xce\x27\xcb\x7c\x4b\xf8\x60\xb9\x16\x88\x25\xb5\x34\x5a\x92\x0b\x12\x7f\x24\xe6\xfe\xd2\xbd\x90\x14\x38\xd6\x9e\x0c\xe6\x5a\x41\x59\x5d\x95\xf3\xc6\x52\xb5\x78\xdb\x71\xd8\x3a\xa6\x5d\x29\x8e\x98\xdb\x4e\x7e\xbb\xb1\x82\x26\xe5\xf8\x3c\x51\xd4\xbc\xfd\xe1\x71\x3e\x0e\xdc\x17\x6e\x3d\x97\x35\xdd\xe8\xa4\x7b\xa0\x24\xe3\x4c\xeb\x86\xcc\x8b\xac\x88\xf7\xcd\x6a\x22\x25\xfa\x29\x8a\x80\xfb\xf4\x31\xce\x78\x17\xe6\x79\x0f\xfc\xb6\xd3\xf0\x28\xc0\xa3\x00\x8f\x02\x3c\x0a\xf0\x28\xf4\xb4\x47\xe1\x0b\x11\x7a\x29\xc2\x5e\x8c\x44\x5f\xb0\xbf\xb6\xef\x8f\x4c\xbb\x12\x6f\xcb\x45\x59\xd2\x65\xfb\xd5\x9f\xd7\xd4\xb2\x54\xe0\xdf\xe1\x79\xb5\xa8\xe4\x6e\x7b\xe2\x89\xac\xc7\xed\x64\xee\x1a\x0f\x3c\x9d\x3a\x9c\x8a\x2d\x08\x3b\x22\x3e\x92\x65\xb9\x64\x4c\x53\xe7\x2b\x22\xc7\x54\xad\x7c\x5d\x2a\x59\xf1\x4d\xda\x9a\x3c\xb6\x22\x15\xad\xd5\x7f\x5c\xfc\x1a\x8f\xad\x28\x25\xa9\xa8\xbc\xd9\x32\xdf\xcb\x72\x4c\xca\x73\x3c\xaf\x8e\x09\x5a\x9b\x77\x96\x96\xa2\xf1\x84\xee\x9c\x24\xd6\xdb\xa9\xd8\x8c\xc2\x4d\x92\xab\xe3\xaa\x56\x7b\x67\x8e\x4b\xa4\x22\x96\xfb\x7c\xf5\xa7\x56\xae\xa7\xe2\xbb\x44\x7f\xa6\xad\x1b\xf1\x06\x4a\xbd\x73\x80\xde\x31\xc0\x9e\x1f\x88\x7e\xd7\x8e\x96\xfb\x52\xff\x15\xd3\x0e\x1a\x53\xf4\xba\x7a\x2b\x56\x90\xb4\x65\xa9\xe0\x81\x10\xf6\x42\x4d\xd6\x56\x54\x6d\xd5\x18\x0b\xdf\x9e\x5e\xac\xba\x78\x70\x47\xf9\xb2\xc6\x5a\x93\x94\xc5\x5d\x29\xc6\x7a\x21\xa7\xe4\x9d\x85\x35\xff\x36\xf2\x6d\x8e\x3d\xba\xc6\xc7\xc9\xfc\x72\x58\x5f\xbf\x94\x6b\x18\x2d\xbb\x69\xfb\x21\xec\x18\x39\xef\xc5\x52\x31\x41\x94\xb8\x2d\x76\xaf\x56\x13\xe2\x1e\x12\xc6\x9e\x87\xff\xcb\x3b\x31\xf4\x63\xb1\x44\x46\xca\xdd\x2c\x68\xea\x5a\x29\x6f\x1c\xc5\x83\xd3\xf8\x41\x55\x03\x27\x16\x2b\xe6\x0a\xc8\xdb\x88\x75\x07\xcb\x76\x4b\xc7\x62\x89\x59\x55\x93\x5d\xcd\xc6\x72\x92\x9e\x93\xf2\xc6\xdd\x9b\xe3\x23\xc2\x11\x79\x7b\xba\x58\x4e\xd7\x34\xb8\x62\xb7\x91\x8a\xdf\x5f\xae\x9e\x37\xee\xb5\x0d\x1c\x76\x70\xd8\xf5\xa8\xc3\x2e\x5b\x10\x68\x79\x1f\x47\xcb\x91\x8b\xe7\xd8\x09\x3a\x46\x47\x9b\x80\x97\x0b\x15\xa9\xb2\xa6\x87\xa2\xe5\xa4\x3f\x02\x7e\x80\xdd\x2f\xde\x66\xc7\xd2\xb6\xcd\x15\xb6\x05\x13\x5a\xd8\x9f\x26\x68\xd4\xd6\x7b\x57\xf5\x9c\x54\x54\x4a\x85\xb1\xf5\xf4\x18\x1f\x5e\xb5\x54\x91\x8a\x65\x35\x6f\xfd\x26\x6b\x3a\xfb\x85\x04\xfb\xa9\x01\x7a\x95\xeb\xf0\xa5\xf5\x74\xf4\x60\xfd\xe0\xf8\xb3\x76\x6b\xf3\x6a\x7e\xd2\x6e\x2d\x79\x84\x47\xc8\x3b\x4d\x2d\xa6\x03\x8e\x9c\x55\xb5\xc9\x62\xd1\x66\xef\x7a\x97\xc7\xcc\x67\xdf\x48\x8b\x62\xfa\x5f\xa4\xa7\xf8\xf4\x3f\x43\x33\x34\x55\x4f\x0e\xdd\x1a\x02\x63\xce\x07\x0c\xc2\x79\x45\x0f\x97\xe0\x58\x0e\x9f\xdc\xa7\xd8\x09\xf7\xbc\x75\x04\xd1\xad\x3e\x98\xf3\x3d\xa0\x1b\xf5\xfc\x2d\xdc\xd7\x0c\x5d\x0e\x64\x0c\x40\x97\x03\x7e\x26\xf8\x99\xe0\x67\xea\x21\x3f\x13\x74\x39\xa0\xcb\x01\xbe\x0f\xbe\x0f\xbe\x0f\xbe\xdf\x15\x7c\x1f\xfa\x17\xd0\xbf\xd8\x2a\x44\x13\xfa\x17\xed\xd0\xbf\xf8\x4e\x94\xa6\x05\xde\x5b\x29\xaa\xb7\x4c\x91\x8b\x94\xbd\xb9\xaf\x2e\xeb\x68\x1c\xa4\xe7\xae\xcb\xab\x92\x25\xe2\x3b\xa6\x73\xfc\xca\x3e\x11\x65\xbf\xd1\x4f\xbb\x5d\xad\x4c\x5a\x8d\xd8\xe5\x1d\x13\x9a\x2c\xe5\x63\xe2\x04\xeb\x01\x38\x5f\xe3\xd9\xa2\x7a\x6b\x81\xb7\x9d\x1c\x33\x0e\x9c\xf5\x69\xca\x2c\xf5\xe8\x1c\x2a\xe0\x6f\x6b\xc3\x6a\xb3\xf2\xc6\xd2\x2f\xdc\x23\x67\x15\x2a\x74\x7a\x18\xca\xe3\x6e\x86\xf3\xb8\xb3\x6c\xd6\x64\x70\xf5\x9e\x92\x09\xe5\x5c\x97\xae\xa9\x47\x78\xe3\x11\x7f\x30\xf7\x0a\x36\x50\x90\x2b\x14\xfd\xc0\x8e\x90\x47\x98\xd4\xe4\x72\x51\xca\xc9\x8d\x3c\xc5\x71\xf3\xd8\x4d\x7b\x90\x99\xa7\xe8\x1c\xcd\x55\x65\x76\x34\xff\x24\x11\x26\x88\xec\x8e\x26\xb3\x3b\x7e\xb9\x8f\x2e\x8a\xac\x8c\xb3\x34\xeb\x64\x65\xb4\xc5\xae\xb4\xd2\x78\x6d\xcc\x46\x85\xdb\x9f\x46\xac\x58\x1d\x1b\x55\x5e\xab\x50\xe6\xb3\x3b\x43\x6c\xd4\xfe\xb2\xa4\x19\xdb\x6f\x63\xcb\xca\x3f\x96\x8d\x18\xab\x7d\x65\xe3\xdb\xb8\x29\xa6\xea\xe1\xea\x86\x46\x79\x5f\xf6\x1a\xff\x9c\xd8\xed\xfe\x71\x55\xd6\x0a\xb2\xfb\xd7\x41\xf7\xaf\xc6\x62\xba\x22\x17\x94\xdc\x68\xcd\x71\x9e\x56\x8c\x7f\xdf\x36\x7f\x35\x7a\x99\xb9\x40\xe7\x29\x5b\x65\x26\x27\xe8\x48\x13\xbe\xd8\x79\x4e\xfb\x61\x27\x43\xec\xe4\x47\xfb\xe9\xc3\xfd\xec\x43\xfd\xd1\x9f\xb7\xdd\x5f\x6f\xef\xef\x1d\x3b\x59\x05\x48\x8c\x71\xe6\xc0\x9f\x43\x3c\x63\x72\x3a\x6e\xbf\xa1\x80\x89\x3b\xcc\xc9\xb7\xf0\x0f\x49\x45\x7e\x66\x49\x2d\x8d\x8a\xb3\xf9\x11\xdc\x3f\xa8\xc7\x86\xb2\xba\x5a\x9a\x17\xfe\xaf\xa7\x8c\xd7\xc2\xfc\xf7\x82\xf5\xb2\x38\x7f\x1c\x0e\x36\xe0\x99\x97\xfa\xe8\xc5\x3e\xf6\x42\x5f\xf4\x73\xf6\xda\xfe\x83\x7d\xb3\xaa\xb1\x55\x55\xf4\x58\x41\xe5\xc3\xae\xc6\xe2\x2b\xc6\x9f\xe2\xb1\x49\xcf\x5d\xf0\x5d\x9b\x88\xc5\x5e\xd3\x1d\xd2\x3f\x2a\xe5\xf8\x8d\x73\xff\x49\x51\xc9\x99\x41\x56\x72\x31\xaf\xc7\xd4\x5b\xe6\x98\x0a\xff\x42\x59\x56\xcb\x45\x39\x15\x13\x57\xe4\x0e\x4b\xeb\x59\xf2\xdd\x93\xef\x00\xd8\x97\x8f\x6f\xe3\xdd\xaa\xca\x3d\xee\xe4\x1a\x37\xb8\xec\x43\x59\x94\x7d\xe8\xe4\x22\x38\x7b\x98\x0e\xb2\xfd\xf1\xb4\x1d\x86\xf1\x3d\x6e\x35\x52\xe7\xcc\x5a\x41\xd2\x96\x47\x57\xfc\xd2\x4e\x4a\x1b\xdb\xaf\x3a\xc2\x83\x65\x35\x6f\xef\xb5\xa4\x4a\x45\xca\x5d\x67\xdf\xbc\x97\xbd\x2f\x42\xf7\xe4\x54\x4d\x5e\x5a\x4f\x47\x9f\xcc\xa9\xa5\x92\x9c\xab\xc4\xce\xcc\x5c\x76\xde\x9c\x8a\x1a\x13\x87\x1b\x37\x36\xaf\xe6\x93\x7b\xcc\xc3\xa6\x54\x4d\x5e\x4c\x9f\x91\x2b\x4e\xa2\xe2\xbc\x9a\x9f\xe4\xc7\x8e\x1b\xcb\x66\xb1\x09\x3a\x1c\xbc\xc0\xd8\x2d\x66\xce\x6b\xe8\x01\x3e\x73\x5e\x49\xf7\x7e\xbc\x6f\x3b\x99\xb7\x65\x3d\xf2\xc7\xfd\x1f\x39\xb1\xed\x66\x3f\xe8\xc6\xa5\xf0\x87\x3e\xc6\x46\xcd\x87\x1e\x8f\x9b\x8f\xd6\xee\xac\x99\xaf\xe8\xcd\x36\xff\x71\xd7\xc0\x0c\x5a\x03\x33\x7f\x71\xa1\xde\xc8\x3c\xe1\x19\x99\x79\x55\xbf\x2b\x87\x26\xfb\x93\x7d\xf4\xaf\xfb\xd8\xfb\xfa\xa2\xef\xb5\x6d\x58\xc5\x72\xb7\x4b\xc6\x07\xdd\xf8\x4e\x0a\x97\x21\x77\x04\xcb\xb9\xb5\x8a\xe5\x07\x5f\x5d\x95\x4a\x55\x69\x28\xee\xcf\x83\x71\x2e\x7f\x7d\x34\x6e\x0f\xf9\x4f\x6a\xa9\xaa\x69\xee\x3b\x50\xf3\xa9\xf8\x0e\xfb\xcf\xee\x35\xf2\x09\x3a\xc6\x8e\xc6\x0f\xdb\x6f\xe5\x6e\xf7\x5b\x59\x7d\x67\x9b\x21\x16\xfc\xf6\x3e\x7a\x6b\x1f\xfb\x67\xd1\x7f\x6a\x8d\xde\xd2\x42\x25\x2f\x6b\xe2\xd6\xb5\x35\xb9\x7a\x51\xa3\x9b\xbf\xf2\xd1\x5a\x36\xd6\x13\x62\x75\x22\x3b\x39\x3f\xe6\x3c\x14\xac\xca\x3d\xb8\xdc\x35\x10\x7f\x85\x68\xc2\x63\xb8\xdf\xd6\x47\xdf\xc7\xde\x12\xfd\x27\xee\x4e\x28\x25\xab\x0f\x23\xf6\x55\x04\xef\xd2\x2b\x52\x29\x2f\x69\xf9\x98\x52\x32\xac\x92\xc3\x92\xcc\x87\x61\xf6\x44\xd1\x7d\xfa\xc0\x23\xac\x53\xf1\x6d\xba\x71\x01\x4f\x1f\x7c\x47\x42\x35\xac\x5e\xe0\x48\xa8\xc2\x26\xde\xc9\x48\xa8\x6b\x15\x4f\x2f\xbe\xd1\x47\x7f\xd3\xc7\xfe\xaa\x2f\xfa\x35\x17\x6b\xbe\x7c\xf9\x75\x41\xbd\x90\x62\x86\x39\xb6\x23\xc3\x8b\x45\x55\xc4\xa0\xfb\x76\xc1\xf2\x41\x94\x25\x63\x11\x17\xab\x5c\xd7\xd4\xb5\xc2\x75\xdb\x5d\x24\x26\xb5\xb6\x56\xe2\x2c\x5e\x17\x48\xcf\x68\x5e\xd1\x5d\x2d\x9b\x6e\xc4\x5b\xaa\x76\x53\x36\xbe\xcf\x79\xd9\xf2\x22\xd7\xb4\xe1\x3b\xf4\xfd\xc6\xe7\xc2\x8d\xeb\xbe\x3a\x48\xbb\xac\xef\x85\xf1\xd9\x53\x72\xb2\xce\x7e\x6f\x90\xfd\x46\xbf\xeb\x73\x50\x3f\xd2\x6e\x41\x9c\x96\x7c\xdc\x38\x4c\x58\x3c\xf3\x4f\x5b\x2d\x84\xee\x39\x3a\x25\xac\xed\x11\x3a\xc4\xad\xed\x3e\x4a\xd1\x48\xe0\x12\xc6\x18\x1f\x1e\x2f\x2a\xee\xb6\xa1\x58\xb9\xb9\x70\x33\x3c\xc8\x9e\xa8\x36\xc3\xe6\x15\x1a\x95\x20\x40\x48\x1c\x42\xe2\x10\x12\x87\x90\x38\x84\xc4\x21\x24\x0e\x21\x71\x08\x89\x43\x48\x1c\x42\xe2\x10\x12\x87\x90\x38\x84\xc4\x21\x24\x0e\x21\x71\x08\x89\x43\x48\x5c\x47\x43\xe2\xfe\x34\x42\xf7\x8b\x90\x38\xf9\x4d\x15\xb9\xc4\x1f\xd5\x18\xfb\xad\x08\xfb\xbf\x22\x44\xce\x9f\xa2\xd1\x02\x57\x41\x58\x51\xb5\x55\x7b\xfc\xa4\x18\x67\x41\xc9\xd7\x14\xe4\xca\x8c\x7d\xe8\xe4\xfc\xdc\x19\xe3\xcf\xad\x0b\x19\xa8\x69\x68\xa2\xa6\xa1\x89\x46\x1a\xca\x2a\x74\x41\x30\xb4\x33\x34\xc3\x19\xda\x29\x3a\x41\xc7\x9a\xf0\xfc\x5b\xf7\x18\x86\xd4\xd8\x9f\x5f\xa3\x21\x31\xbc\x42\x51\xc1\x8e\x2d\x2c\xab\x79\x5d\xce\xad\x69\x4a\xe5\x36\xff\x45\x91\x75\xf6\xa9\x6b\xec\x23\x83\xf4\x2a\x71\xa4\x1d\xe0\x31\x56\x9f\x70\xce\x73\x49\x2b\xde\x90\x90\x5c\x48\xc6\x8d\x13\xc4\xbf\xcd\x68\x8e\x9a\x63\xba\x1c\x76\xa2\xc6\x16\xf0\x20\x6a\x6c\x01\x0f\x02\x0f\x02\x0f\xf6\x10\x1e\xec\x22\xe1\xd1\xae\xc1\x83\x50\xc4\x04\x1e\x04\x1e\x04\x1e\x04\x1e\x44\x8d\x2d\x48\xf6\xdd\x3d\x34\xaf\xeb\x25\xfb\xb6\x64\x8d\xad\x9b\x34\x2f\x00\xd7\x1c\x9d\xe1\x80\x6b\x92\x4e\xd1\x89\xc0\x20\x31\x53\x98\xd4\x0a\x71\xaf\xc1\x44\x0d\x45\x8d\x85\x55\xda\xba\x1a\x1e\x55\x76\x94\x1d\x0e\x4a\x9e\x12\x5d\x74\x22\x7e\xbd\x1d\xa4\xf8\x6f\xee\xa8\x01\x66\x51\xbb\xec\x56\x2d\x1b\x7b\x42\xfc\xd6\x21\x3a\x26\x60\xd6\x45\x7a\x8a\xce\x55\x25\x1c\xd5\x11\x7f\x0c\x7d\x2a\xc8\x38\x42\x66\x66\x93\x99\x99\x3f\x1c\xd9\x90\x0e\x69\xe8\x54\xa4\xa7\x45\x9e\x67\x96\xce\x3a\x79\x9e\x77\xd8\xe4\x25\x51\x83\xeb\x1c\xcd\xb9\x6a\x70\xdd\x61\x9b\xcd\xdb\x30\x5e\x31\xab\xbd\x36\x2c\xf9\xd7\x23\x35\x36\x6c\xd0\xb7\x2c\x57\xad\x3d\x4b\x89\xe3\x3c\xf6\xcc\x29\xce\xd5\x6e\xcb\x86\x8a\x5c\xe0\xbe\xe0\xbe\xe0\xbe\xe0\xbe\xa8\xc8\x85\x8a\x5c\xa8\xc8\x85\x8a\x5c\xf0\x3f\xc0\xff\x00\xff\x03\xfc\x0f\xf0\x3f\xb4\xc4\xff\x80\x8a\x5c\xa8\xc8\x85\x8a\x5c\xa8\xc8\x05\xf7\x1e\xdc\x7b\x3d\x54\x91\xab\x31\xdc\xdc\x18\x5d\xae\x15\x84\x6a\xb9\xae\xd3\x0b\xc3\x74\x20\x44\xd7\xc9\x9a\x2e\x6f\x5c\x53\x2b\xb6\x9a\x2e\xfb\xdf\x86\xd9\xff\x70\x29\x18\xc5\xb8\x62\xae\x77\x2f\x6a\xc1\xbf\xa7\x8d\x13\x93\x8f\x1b\x47\x08\x19\x0f\x47\xb4\xc8\x73\x48\x8b\xc5\x71\xaf\xd2\xa4\x98\x25\x13\x74\x84\xcf\x92\x71\xda\x47\xa9\x50\xd5\x0d\x4f\x97\x42\xa7\x46\x7d\x99\xda\x1b\x17\xc3\x67\xc3\x08\x4b\xfa\x94\xb0\xb2\x25\x3a\xbc\xdd\x89\xfe\xc6\x76\x67\xcc\xf7\x58\x12\xb7\xf5\x86\xfd\x09\xf3\xa0\x0e\x8e\x7c\x66\x9a\x32\x74\xba\xca\x6b\xba\xe1\xa1\x07\x59\x83\xab\xb4\x49\x57\xe9\xcf\xf6\xb5\xe2\xd5\x9f\x15\xfe\xd1\x53\x74\xc2\xf1\x8f\x76\xd6\x84\x94\xd7\x1a\x36\x21\xf5\xcd\x86\xdb\xc0\x24\xff\xee\x3e\xc7\x84\x7c\x8f\xb9\xbc\x95\xaa\xac\xc6\x1e\xf1\xf7\x4e\x1a\x8d\xf6\x38\x24\x61\x44\x42\x8c\x08\xa0\x78\x47\xa0\x38\x68\x08\x68\x08\x68\x48\xbb\x68\x48\xf6\xe7\x5a\xf2\xc5\x3f\x23\xc2\x97\x4e\xd3\x49\x57\xf8\x52\x3b\x3e\xf9\x31\xff\x4f\xfe\x0e\x76\x8f\x18\x90\xd6\x7f\xf5\x33\xdf\xb8\xd7\xf9\xea\x8f\xd4\xe8\xce\xd7\xdb\x41\xc4\xb9\xf2\x71\x87\x96\x02\x90\x98\xef\xb5\x05\x08\x24\xe6\x21\x31\xbf\xc9\x12\xf3\x57\x83\x65\xb2\xef\xfc\xab\xd2\xb0\xb2\x7c\xab\x4d\x7e\x76\x82\x8e\xb0\x43\xf1\x03\xb6\xd0\xf4\x43\x6e\x9d\x6a\xcf\x79\x9b\x21\x52\xdd\x72\x94\xf9\xd9\x14\x3d\x2d\xf4\x3a\xa4\xfc\xaa\xc2\xf5\x12\x34\xb9\xa0\xf0\x2f\x81\xa2\x96\xaa\x2b\x84\x71\xd3\x29\x19\xf3\xec\x96\xbc\x7c\x5d\x55\x6f\x7a\x42\x1e\x6d\xce\xf9\xf5\x51\xf6\xee\x01\x7a\xc4\xb7\x49\x3b\xe4\x37\xed\x43\x3f\x17\xed\xf6\xaf\x88\xf6\xa7\xdc\xed\x27\x4f\x1a\xa7\x4c\xfa\xb5\x6a\x86\x02\xd7\x3f\xbf\xc5\xac\xf4\xed\x7d\x74\x5d\xcc\x74\x89\x96\xf8\x4c\x7f\x1d\x5d\xa1\x67\x82\xab\xfc\xfb\x8e\xb0\x15\xc4\x5d\xbf\xeb\x77\xca\x54\xbf\x2f\xfc\x3d\xb9\xca\x9e\x33\xdf\x93\x7a\x53\xc1\x7c\x83\x42\x7a\x5b\x03\xe1\xa3\x1f\xa2\xb0\xf9\x70\xc0\x9f\xcc\x86\x4c\x89\x49\xf3\xac\x6e\x99\x15\x99\x9b\xa4\x50\xa1\x6a\x2d\xd4\xae\x59\x81\x85\x12\x70\x6f\x93\xb8\xf7\xff\xed\x0b\xfe\x7e\x77\xce\xaa\xad\x0a\x5c\xbc\x42\x79\x07\x17\xb7\xef\x72\x96\xad\xdc\x6c\x63\x18\x42\xaf\x93\xff\xb8\x2b\xcc\x56\x26\x6c\x04\x1d\x62\x1e\x4f\x8b\x03\xbb\xc6\x3a\x02\x58\x03\x58\x03\x58\x03\x58\x03\x58\x03\x58\x6f\x18\x58\x7f\xba\xaf\xc5\x31\x4c\x1b\x4f\xbd\xbd\xf3\xb8\xa8\x70\x8c\xbd\xd9\xcb\x93\xcc\xbb\x5e\x19\xb6\xfe\x38\x11\x02\xc3\x43\x56\x25\xa7\x38\xbd\xe9\x86\x45\x09\xd0\x79\xaf\x2d\x85\x80\xce\x81\xce\x37\x19\x9d\x77\x15\x38\x0c\x45\xec\x9b\xfd\x39\xca\x9e\xa3\x39\x76\x26\x3e\x63\x63\xf5\xa4\x1b\xc9\xd7\x6f\xad\x03\x45\x5e\x7f\x75\x88\x8e\x0b\x82\x5e\xaf\x70\xad\x4d\xd0\x79\xf8\x37\x3f\x54\xe7\x65\x68\x75\xf6\xcd\x04\xfb\x6f\x03\x21\x45\xcf\xd7\xcd\x1c\xb5\x52\x5e\x59\x57\xf2\x6b\x52\xd1\x2d\xc7\x24\xd9\xf9\xa0\x4e\x75\xdb\x94\x6b\xd7\x30\x61\xef\x37\x12\xbc\x99\x84\x23\xc7\xe0\xc9\xaf\x57\xcb\xb2\xbd\x19\xd4\x2b\xb2\x94\x4f\x25\x53\xb7\x1a\xae\x9b\x7e\x5e\xd1\x2b\x5d\x2e\xb3\xbd\x41\xb9\xa8\x3a\xdf\x5a\x2e\x8b\x35\xb3\x2e\x97\xc2\xe5\xa2\xf6\xf8\xbf\x5f\x3b\x19\xf1\x8e\x09\xcd\xa8\x4e\x56\xe0\x47\x2d\x42\x88\x8d\xa3\x16\x21\x44\x67\x20\x3a\x03\xd1\x99\x1e\x12\x9d\x41\x2d\x42\xd4\x22\x84\xd8\x07\xc4\x3e\x20\xf6\x01\xb1\x8f\xae\x10\xfb\x40\x2d\x42\xd4\x22\xdc\x2a\xf2\x06\xa8\x45\xd8\x8e\x5a\x84\x7f\x3f\x44\x07\x05\x3a\x2c\xa9\x79\xd9\x9f\x14\x6a\x6b\x25\xe3\xae\x73\x45\x49\xd7\x65\x3b\xc0\xf6\xd3\x43\xec\x7f\x0e\xd0\x4e\xe3\x34\x9b\x11\x7e\xa2\xcf\x1c\x7b\x17\x19\x2c\x59\xd6\xcc\xaa\x9e\x77\x49\x34\x37\x65\x34\xd7\x12\x46\x38\xe2\x2c\x5f\xf8\x12\xcd\xfc\xd8\x19\x2b\x20\x67\x5d\x96\xf0\x2c\x85\x5d\x6d\xa7\x92\xbb\xf9\xe5\x2e\xa8\x79\xd9\x24\x8a\xee\x1e\x82\x27\xd6\xf2\xc4\x0d\x69\x65\xb8\xe6\x95\x15\xfa\xee\x1a\x5e\x9f\xc8\xb4\x60\x6f\x00\xbf\x6d\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\x43\xc0\xc3\x4e\xc3\xc3\xa3\x74\x98\x1d\x8c\xef\xb7\x83\xa2\x1e\xf4\xe4\x29\xbb\x36\x79\xed\x0f\x81\x02\x77\x04\x77\x04\x77\xdc\x42\xdc\xf1\x37\x13\x34\x26\xb8\xa3\xb6\x2c\xe5\x52\x16\x63\xaa\xca\xf8\x1f\xd3\xd4\xa2\xbc\xac\x94\xf2\x4a\xa9\xa0\xb3\x77\x27\xd8\xdb\x06\xe8\xd5\xc6\x09\x93\xee\xe3\x97\xd6\xd3\xd1\x61\xb1\xca\xd4\xcc\xef\xa3\x65\x40\x6d\xe6\xa8\x16\xe5\x8c\x68\x27\x39\x6e\x1c\x7a\xa9\xba\x91\xc5\xb4\xeb\x98\x59\x55\x9b\x2c\x16\x6d\xd1\x9c\xae\x87\x80\xaf\xa7\x29\x01\x01\x8f\xd3\x04\x87\x80\x07\x68\x9c\xf6\x05\x06\xf3\xf2\x21\x5f\x4f\xa7\x5c\x77\xdc\x50\xd9\xc9\x7c\x38\xf7\x9b\x64\xa7\x4c\xee\x17\xf8\x5c\x2d\x0a\xe8\x5c\xdc\x23\x7f\x11\x56\xdc\x12\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xf8\x0f\xb1\x83\x60\x78\x60\x78\x60\x78\x9d\x62\x78\x9f\x4a\xd2\x21\xc1\xf0\xf4\xdc\x75\x39\xbf\x56\x34\x56\x6b\x55\x11\x84\x65\x4d\x51\x35\xa5\x72\xbb\x2a\x78\xf0\xdb\xc3\xec\x27\xfb\x89\x39\xe7\xd9\x21\x84\x7e\x05\x89\xe6\xcd\x46\xb8\x33\x21\x19\x37\x8e\x58\xb0\xcf\x34\x63\xf6\x3c\xc7\xb4\x58\x65\x73\x63\x75\xab\x52\xae\xd1\xb0\x12\xe4\x3d\xbd\x0b\xe5\x6c\xb9\x70\xce\x76\x9a\x9d\x34\x39\x5b\xcd\xd8\x5b\x65\xa9\x3c\x97\xdc\x88\x00\x5c\x41\xae\x50\xf4\x6d\x3b\x7c\x1f\x4f\x40\xed\x22\xef\x13\x7a\xd2\x3c\xa8\x93\x0f\x29\x73\x91\x9e\xa2\x73\x55\x2a\x26\x77\xf2\x94\x20\x63\x02\x61\xcb\x26\x85\x2d\x7f\x6d\x63\x22\x51\xe1\x06\xe3\x69\xa1\x51\x99\xa5\xb3\x8e\x46\x65\x9b\x6d\x50\x48\x75\xa3\x4e\x98\xa8\xe4\x87\x76\xf9\xda\x20\xa7\xf8\x91\xd7\xec\x3c\x21\xfe\xde\x51\xab\x03\x31\x49\x88\x49\x42\x4c\x12\x62\x92\x10\x93\x84\x98\x64\x6f\x8a\x49\x76\x64\xb3\x12\xaa\x58\x99\xf9\x89\x9d\xbe\x6b\x85\xb0\x92\x49\xde\x15\xc4\x1e\xae\x37\xd6\xa9\x05\x04\x84\x1f\x7b\x6d\xd9\x02\xe1\x47\x08\x3f\x6e\xb2\xf0\xe3\x5d\xc9\xb2\xc2\x04\x24\xeb\x97\x54\xf2\xb4\xde\x01\xb9\xc6\x4f\x0c\xd3\x61\xb3\xe0\x51\xb9\xac\xd7\xa9\xe0\x9e\x97\xcb\x45\xf5\xf6\xaa\xb1\xb8\xb0\xc0\xe9\x37\x87\xd8\xd7\x22\x74\x8f\x71\xe2\xd2\x7a\x3a\xfa\x88\x0f\x2d\x9d\xb6\xcf\x4a\x3e\xca\x8b\x15\x95\xcb\xba\xbb\x02\xa0\xf3\x7b\x8b\x31\xe9\xeb\xe8\xa4\x98\x5a\x87\xe9\x20\x9f\x5a\x63\x34\x4a\x7b\x83\x25\x45\xcb\x65\x5d\x6c\x7d\xad\xfe\xdc\x69\x85\xa1\x0b\xe1\x73\x6d\x2f\x1b\xb6\x64\x42\xcb\x65\xdd\x9c\x5e\xae\x1e\xb8\x23\x11\xa3\xff\x6e\xbb\x33\xd2\x31\x7f\xf0\xe9\x1a\xec\xc7\xad\x32\x40\x1d\x1a\xef\x0c\xcf\xf4\xae\xfa\x7c\x6f\x6c\xc0\xf1\xc5\x06\xe3\x6c\x92\x71\xfe\x54\x9f\x88\x39\x4e\xf3\x98\x63\x9b\x4a\xb6\xec\x95\xbf\x53\x5b\xd2\x20\xc7\x6c\xcc\x64\xd4\x35\x13\x6e\x7b\x92\x7c\x7e\x97\x63\x32\x1e\xb0\x39\xa5\xcb\x4a\x98\x9b\xc7\x8e\x19\x09\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\xca\xde\x04\x94\x8d\x7d\xe2\x83\xbe\xe8\x35\x9f\xfe\x06\x58\xe4\x5f\xdc\xeb\x2c\x02\x86\x43\x00\xa4\x6b\x69\xf0\x98\x28\x49\xd3\x81\x95\x01\xc8\x63\xaf\xad\x47\x40\x1e\x41\x1e\x37\x99\x3c\xb6\x1f\x0f\xb5\x98\xff\x84\x63\xc5\xc3\x74\x90\xed\x8f\xa7\x6d\xac\xf8\x3d\x6e\xac\xe8\xb4\x7a\x57\x94\x69\xff\x56\x84\x1e\x11\xd4\x32\x27\x6b\x66\xcc\xa8\xac\xbb\x72\xb5\x19\x0f\x5f\xa6\xfb\xdc\x3f\x1b\x5f\xc0\xd7\x16\xe4\x8a\x37\xaf\x42\x44\xac\x26\x1f\x29\xc8\x95\x29\xd7\xc1\x8b\xe9\xc9\xf9\x39\x2b\x91\xaf\x85\x7e\xb6\x9a\x86\x26\x6a\x1a\x9a\x68\xa4\xa1\x6c\x99\x9e\x11\x33\xd8\xf8\x7c\x19\x33\x78\x96\xa6\x29\xd3\xc4\x47\xcb\x75\x9f\x8d\x24\x5e\xb3\xaf\x47\x28\x6a\x8e\xbd\xaa\x6a\x79\xa5\xe4\xc9\x93\x67\xbf\x1b\x61\xbf\x1d\xa1\x9d\xee\xdf\xa2\xd1\x02\x5f\x03\x1b\x2b\x71\x3b\x68\x59\x8a\xf1\xb9\x9f\x34\x9e\xc8\x94\xeb\xe0\xc9\xf9\xb9\x33\xc6\x0f\x5d\x38\xe4\x0a\x5d\x10\x43\x7e\x86\x66\xf8\x90\x9f\xa2\x13\x74\xac\xb9\x21\xe7\xf7\x18\x3a\xd6\x9f\x4c\x50\xd2\x54\x44\x95\x2b\xb7\x54\xed\xa6\x27\xaa\xd9\xfa\x23\x5f\x6d\x2b\xb2\xce\xde\x91\x60\xdf\xea\xa7\x57\x3a\xc7\x1a\x53\x7e\x6f\x7d\x35\x82\x0b\xe2\x60\xb1\xde\x4e\x8e\x1a\x07\x5f\xb0\xcf\x5f\x4c\x7b\x7e\xde\x6a\x52\x04\x2b\x74\x4e\x3c\xb0\x69\xca\xf0\x07\x76\x9c\xea\x2c\xec\x52\xae\x31\x5e\x4f\xa7\x3c\x77\xde\x90\x24\x41\x88\x58\xc0\x8d\xd7\x87\x7f\x12\x8e\xb1\xa3\x96\x54\x69\xf5\x03\x37\xbf\x0f\x9e\x6e\x79\x3e\x11\x10\x23\x80\x18\x01\xc4\x08\x20\x46\x00\x31\x02\x88\x11\x40\x8c\x00\x62\x04\x10\x23\x80\x18\x01\xc4\x08\x20\x46\x00\x31\x02\x88\x11\x40\x8c\x00\x62\x04\x10\x23\xe8\x94\x18\xc1\x7f\xb8\x46\x7b\x4d\x31\x82\x8a\xaa\x49\x85\x9a\x5a\x46\xe6\x9f\x4d\x21\x02\xf6\x9e\x6b\xec\xe7\x06\xe9\x3e\xf3\xaf\x76\xbe\x48\xb2\x3e\xb9\x5b\x10\x87\x8b\x6c\x91\x47\x8d\x63\xcd\xbf\x98\x99\x22\xee\xdf\xbb\x9c\xd4\x65\x80\xae\x80\xae\x32\x40\x57\x40\x57\x40\x57\x40\x57\x3d\x83\xae\x32\x5d\x83\xae\x5a\xde\x93\xa6\xd1\x55\x06\xe8\x0a\xe8\x0a\xe8\x0a\xe8\x0a\xe8\xaa\xf3\xe8\x2a\xd3\xd3\xa4\x29\x03\xd2\xd4\x3e\xd2\x94\xe9\x76\xd2\x94\xd9\x82\xa4\x29\x5b\x08\xce\x59\xdc\x58\x6a\xbd\xc9\xa9\xac\xbc\x7a\x37\x3b\x3a\xaf\xe8\x76\x06\xe3\x52\x78\x08\xd3\x71\x36\x61\x65\xd0\x7b\xe0\x97\x19\xbf\xe4\x6e\xd9\x27\x7b\x3e\x24\x86\x2a\xfe\xe1\x1d\xb5\x9c\xec\x35\xe2\xb3\x14\x93\xbc\x48\xcc\xfc\x5a\x75\x00\x8a\x09\x86\x75\x8e\xe6\xe8\x4c\x55\x1e\xc1\x61\x3a\xd8\xd4\x98\x23\x89\x00\xc9\xd0\x4d\x26\x43\x3f\x1f\x11\x61\xaa\xe3\x3c\x4c\xd5\xc9\x6c\x3a\x4a\xcd\x4e\xc6\x60\x1b\x73\x56\xd8\x98\x49\x3a\xc5\x6d\xcc\x1d\x5c\xe2\x29\x91\xbf\x3d\x4b\xd3\x4e\xfe\x76\xf3\xcd\x85\x47\x64\x96\x55\xbd\x42\x0d\x9a\xb3\x1a\x2b\xd5\xb0\x7d\x4b\x7e\x6d\xa4\xd6\x5c\x3d\x6e\x66\xd8\xb9\xd2\x15\xd5\x15\xaf\xe9\x4a\x9a\xea\x91\x1e\xd3\x35\x65\x1f\xdf\x46\x23\xd6\x9e\x14\x6d\x90\x5d\x90\x5d\x90\x5d\x90\xdd\xde\x21\xbb\x58\xbf\x85\xac\xdf\xba\x07\x7d\x43\x1e\xa3\x23\xf2\x18\xf0\x30\xc0\xc3\x00\x0f\x03\x3c\x0c\xf0\x30\xf4\xb4\x87\x01\x2a\x49\x50\x49\x82\x4a\x52\xbb\x54\x92\xe0\xc0\x83\x03\xaf\x57\x1d\x78\x1b\x94\x93\xbe\x73\x31\xaf\xa4\x3f\x5d\x7e\x80\xdd\x2f\xde\x66\xc7\xd2\x36\x4a\x9a\x9b\x77\x9c\xb5\x5e\x63\xe5\x4f\x13\xf4\x90\x31\xa9\xc6\xd6\xd3\xe2\x89\x8e\xf1\xc7\xa8\x71\x8f\x08\xfb\xf5\x04\xfb\xf8\x00\xdd\x93\x53\x35\x79\x69\x3d\x1d\x5d\x37\x57\x98\xa5\xbc\xb2\xae\xe4\xd7\xa4\xa2\xdb\x5d\x2a\xd9\xbb\xb9\xf3\x46\x0b\x97\x8c\x1f\x52\xae\x4f\xf6\x84\xfd\xb1\x4f\xf0\x66\x12\x0e\x4c\xf5\xd0\x31\xb5\x2c\xdb\x1b\x72\xbd\x22\x4b\xf9\x54\x72\x98\x9f\x30\xa5\x6a\xf2\x62\xda\x69\xfc\xbc\xa2\x57\xb6\x9a\x56\xc5\x4d\x9a\x17\x93\x77\x8e\xce\xf0\xc9\xcb\x15\x95\x9b\x98\xbc\xdc\x63\x3d\xb3\xde\x88\x46\xd1\xf9\xf0\x49\x39\xcc\x12\x3e\x6a\x74\xf1\xb8\x39\x29\x9d\x31\xa7\x1b\x7b\xfc\x5f\x87\x9d\x8c\xf8\x6d\x72\xff\x2d\x34\x2a\x10\xe8\x0f\x8d\x0a\xb8\x83\xe0\x0e\x82\x3b\xa8\x87\xdc\x41\xd0\xa8\x80\x46\x05\x30\x3c\x30\x3c\x30\x3c\x30\x7c\x57\x60\x78\x68\x54\x40\xa3\x62\xab\x80\x47\x68\x54\xb4\x43\xa3\xe2\xcb\x43\xb4\xdf\x8b\xf7\x02\x0a\xbf\x59\x8d\xbd\x71\x4d\xad\x48\x3a\xfb\x99\x21\xf6\x29\x17\xf8\xbb\xdd\x18\xf8\xb3\x76\x78\x4f\x1b\x8d\xb4\x88\xfd\x0d\xba\xd8\x9f\x53\xa2\xc0\x73\xa5\xf3\x8a\xde\xba\x4a\x05\x77\x11\xf8\xbb\x18\x0e\xfe\x46\x58\x52\x20\x3e\xcf\x80\xfa\x15\x9b\x8a\xc7\xc1\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xc0\xfe\xba\x92\xfd\x6d\xbd\x82\x4f\xa0\x8b\xa0\x8b\xa0\x8b\x5b\x88\x2e\xfe\x55\x92\x66\x85\x02\x6e\x5e\xd1\x73\xaa\x61\x56\xdd\x75\xab\xfc\x49\xa3\x5c\xca\x97\x55\xa5\x54\xd1\x8b\x8a\xfd\xd3\x5b\xd8\xff\x91\x64\x3f\xdc\x4f\x3b\xed\x76\x96\xd6\xd3\xd1\x98\x26\x4b\xf9\xaa\x4d\xef\x8c\x79\xf6\x82\x71\x76\x72\xd0\x38\x62\xda\x3a\xc7\x0d\x08\x3d\xc7\xb5\x36\x7b\x3e\x2b\xd1\xac\x60\x79\xa7\xe8\x04\x67\x79\x87\xe9\x20\xed\x0f\x94\x30\x70\xc6\x66\x3d\x9d\xf2\xf4\x2b\x94\xe0\x05\x97\x92\x2f\xc8\x15\xba\x71\x2d\x1c\xf0\x4d\xb0\x23\x26\xc0\xab\x7e\x44\x66\x6c\x9f\xb7\x43\x6e\xf0\x17\xfd\xda\xf6\xaa\x07\xb2\x47\x93\xcb\x45\x29\x57\x5d\x50\xd6\xfb\x4c\x86\xcd\x83\x3a\xfd\x58\x32\x73\x74\x86\x66\xaa\x94\x59\x9a\x7b\x2e\xc8\xeb\x85\x2e\x4b\x93\xba\x2c\x1f\xe9\x6b\x99\x71\x38\x27\xc4\x52\xa6\x29\xe3\x88\xa5\x6c\x82\xa5\x29\xaf\xb5\xdd\xd2\x24\x7f\x7a\x57\x95\xa5\x79\xad\x99\x79\x23\x95\xaa\xac\xcb\x90\xf8\xa1\xe3\xc6\xa5\x3d\x8a\x29\xb0\x33\x21\x76\x06\x59\xfb\x1d\xc9\xda\x47\xba\x26\xd2\x35\x91\xae\xd9\xae\x74\xcd\xec\xa7\xfb\x5a\x9c\xb3\x76\x49\x48\xbf\x9d\xa3\x39\x97\xf4\x5b\x9b\xf3\xe0\x62\xfe\x2b\x84\x1d\xec\x1e\x31\x4c\xed\x5e\x24\x64\xde\xbd\xb3\x6a\x91\x30\x52\x96\xb4\x8a\xc2\x9d\x98\x62\x5f\x5b\x77\x5f\x92\xe0\x15\xd4\x3b\xb9\x70\x78\xb8\xba\x21\x51\xd6\x7f\x2f\xaf\x4e\xbd\xdb\xfd\xe3\xaa\xac\x15\x64\xf7\xaf\x83\xee\x5f\x75\xab\x8c\xff\x68\xcd\x71\x9e\x56\x78\x5d\x7c\xf3\x57\xa3\x97\x99\x0b\x74\x9e\xb2\x55\x3b\xa2\x3a\xa5\x91\xeb\xcc\x91\x79\xee\xea\xc7\x72\x25\x64\xb9\xf2\xd1\x7e\xfa\x70\x3f\xfb\x50\x7f\xf4\xe7\x6d\x9b\xff\xf6\xfe\xde\xd9\x16\x55\x79\x47\x8c\x71\xe6\xde\x7e\xee\xc1\x33\x26\xa7\x13\xf3\x33\x14\x30\x71\x87\xf9\xa7\x4b\x04\x87\x48\x45\x7e\xa6\xb1\x46\x13\x67\xf3\x23\xf8\x7a\x49\x8f\x0d\x65\x75\xb5\x34\x2f\x82\x5f\x9e\x32\x5e\x0b\xf3\xdf\x0b\xd6\xcb\xe2\xfc\x71\x38\x78\xbf\x96\x79\xa9\x8f\x5e\xec\x63\x2f\xf4\x45\x3f\x67\x63\xb7\x0f\xf6\xcd\xaa\x5a\x8e\x2f\xe5\x0a\x2a\x1f\x76\x35\x16\x5f\x31\xfe\x14\x8f\x4d\x7a\xee\x82\x03\x55\xb1\xea\x5a\xd3\x1d\x37\xff\xa8\x94\xe3\x37\xce\x83\x27\x8a\x4a\xce\xfc\xaa\xca\xc5\xbc\x1e\x53\x6f\x99\x63\x2a\x82\x0b\xca\xb2\x5a\x2e\xca\xa9\x98\xb8\x22\x8f\x56\xb2\x9e\x25\x07\x9b\xbe\x03\x60\x5f\x3e\xbe\x8d\x77\xcb\x13\x79\xd3\x39\x38\xd5\x5e\x73\x7f\xe3\x31\xff\xef\xcd\x76\xf6\x0a\x3e\x0a\x94\x9d\xa0\x23\xec\x50\xfc\x80\xed\xe0\x78\x88\xbf\x56\xe6\x3b\xee\x69\x38\x3e\x60\xfc\xe4\x76\x5d\x6c\x3d\xe7\x08\xfb\x76\x82\x86\x04\x6c\x15\x91\x72\xd5\xd5\xc6\x44\x78\xa7\xf8\x8d\x7d\x3e\xc1\x7e\x73\x80\x5e\x25\xfe\xcf\xd6\x24\x7d\x63\x63\x61\x9c\x3c\xba\xb0\x45\xe1\x9b\x7b\x6f\xd9\xf1\x8a\xba\xa9\x70\xca\xff\x07\xc9\xdb\x8d\xc5\x70\x36\x12\x72\x79\xe3\x4a\xf8\x9b\x78\x80\x8d\x9b\x6f\xa2\x67\xf6\x58\xaf\x21\xef\x4b\xad\xdc\x00\x62\x39\x11\xcb\x89\x58\x4e\xc4\x72\x22\x96\x13\xb1\x9c\x88\xe5\x44\x2c\x27\x62\x39\x11\xcb\x89\x58\x4e\xc4\x72\x22\x96\xb3\xb3\xb1\x9c\x88\xb4\x44\xa4\x25\x22\x2d\x7b\x38\xd2\xf2\x43\x0f\xd1\x41\x2b\x8f\x3b\x20\xae\xd2\x78\xe1\x5c\x11\x95\x63\x3a\x77\xeb\xb1\xff\xfe\x20\xfb\x7a\xc4\xc9\xe4\x7e\x82\xc7\x54\x8a\xdf\xac\xc1\x75\xbe\xb4\x0b\xa2\x8d\xe4\xe3\xc6\x51\xd5\x39\xd7\xe6\x8f\xc2\x5d\xd8\xe2\x90\xca\x45\x3a\x26\xd0\xda\x01\x1a\xe7\x68\x6d\x84\x92\x34\x14\x48\xad\x8d\xbb\xe1\xae\x4b\xd1\xa5\x3b\x8d\xa3\x9c\x0b\xe7\x67\x83\xec\x89\x6a\x55\x44\xeb\xe2\x9e\x98\xc9\x0f\x6f\x77\xc6\x3a\x61\x85\x4b\x86\x0d\xf7\x13\xe6\x81\x1d\x1c\xf1\xcc\x49\x3a\x4e\x13\x55\xbe\xc1\x0d\x0c\x39\x7c\x81\x08\x91\x6c\x32\x44\xf2\xc7\xfb\xee\xec\x65\x3f\x2d\xe2\x22\x8f\xd2\x61\x27\x2e\xb2\x53\xe6\x82\x07\x43\xb6\xce\x5c\x64\xfe\xf2\x5e\xc7\x5c\xec\xab\x09\x67\x08\xb3\x1b\xf1\xb2\x9f\x36\x46\x9b\xac\x06\xa2\x19\x7a\xcd\x82\x21\x9a\x01\xd1\x0c\x9b\x1c\xcd\xd0\xe6\x75\x61\xeb\x2c\x79\x78\xb8\xc2\x01\x1a\x67\xfb\xe2\x29\x3b\xe4\xe0\x01\x77\xb8\x82\xd9\xe4\x5d\x11\xa8\xf0\x5f\x46\xe9\xbc\x08\x54\x90\xf2\xab\x0a\xf7\x75\x6a\x72\x41\xe1\x76\xdf\xd8\xdf\x38\x19\x62\xdc\x46\x4a\xc6\x84\xba\x25\x2f\x5f\x57\xd5\x9b\x1e\x0f\x95\x9d\x1b\xf6\x9e\x51\xf6\xff\xf5\xd3\x83\xbe\xad\x19\x1f\xce\xb4\x4f\x9e\xd8\xa2\xdd\xf4\x15\xd1\xf4\x94\xbb\xe9\xe4\x51\xe3\x94\x49\xbf\x06\x17\xd3\xf5\x4f\x6d\xf1\xc6\xe7\x9f\x51\x4e\x4c\xf0\xab\xf4\x1c\x9f\xe0\x3c\xd1\x20\x70\x82\xfb\x8f\xe8\x7a\x3a\x55\xbf\xd3\x77\xba\x41\x7a\x73\xf8\x7b\x72\x85\x3d\x63\xbe\x27\xf5\x9e\xba\xf9\x06\x85\xf4\xd6\xb3\xa3\xfa\x21\xaa\xf3\xe8\x0f\xf8\x67\xa4\x85\x3c\xfd\xe3\xe6\x59\x5d\x30\x01\x32\x2b\x94\xa7\xe5\xaa\x55\x4d\x1b\x66\x00\x56\x3b\xd8\xaf\x35\xb9\x5f\xfb\xcb\xbe\xe0\xd2\xe0\x1d\x31\x5e\xd7\xc5\x86\x4f\xa2\x25\x67\xc3\xd7\x96\x2b\x35\xb8\xff\xdb\x44\x6b\x98\xfc\xdb\x5d\x75\xac\x61\xc2\xca\x9a\x0b\x33\x80\xc7\xc4\x81\xdd\x60\xff\x90\x58\x87\xc4\x3a\x24\xd6\x21\xb1\x0e\x89\x75\x48\xac\x6b\x26\xb1\xae\x93\xa9\x70\xad\xcd\xe2\x6b\x3c\xb1\xae\xb1\x05\xc7\x86\x17\x13\x8d\xac\x50\x32\xdf\xdc\x59\x67\xc1\x71\x22\x24\x03\x2f\x64\x19\x32\xc1\xd1\xc8\x26\xaf\x42\xc0\xb5\x7b\x6d\xed\x03\xae\x0d\xae\xbd\xc9\x5c\xbb\x4b\xb0\xdf\x26\xee\x64\xc3\x81\xf9\x39\x9a\x63\x67\xe2\x33\x36\xfa\x4e\xba\x81\x79\xfd\x2b\xd5\x72\xf4\x96\x53\xee\x8f\xd8\xe9\x78\x39\x55\xd5\xf2\x4a\xa9\x0a\x6e\x8b\xa4\x3c\xbe\xba\xd7\xd9\xdb\x12\xec\xef\xfb\xe9\xd5\xee\x23\xed\xa4\xbc\x3d\x22\x6a\x5b\x33\xe3\x4d\xad\x35\xbb\xba\x12\x33\xc6\x34\x76\xde\x68\x21\x39\x62\x1c\x34\xe5\x3a\xdd\xcc\xa5\xe3\xbf\x6e\xb5\x3c\x3a\x99\xb2\x62\xf2\x4f\xd1\x24\x9f\xfc\xc7\xe8\x28\x1d\xae\xe3\xd4\x71\x8d\xaf\x39\x6a\x29\x7e\xe3\xe7\x15\x3d\x3c\x83\xae\xb1\x34\x55\xb3\xd0\xa9\xd1\x6a\x6d\x1e\x9c\xf9\x02\xf8\x3c\x68\xba\xf1\xa8\xff\x34\xbe\x87\x6d\x43\x39\x04\xa4\xd0\x21\x85\x0e\x29\x74\x48\xa1\x43\x0a\x1d\x52\xe8\x90\x42\x87\x14\x3a\xa4\xd0\x21\x85\x0e\x29\x74\x48\xa1\x43\x0a\x1d\x52\xe8\x90\x42\x87\x14\xba\x8e\xa6\xd0\x7d\x67\xd8\x0a\x4b\xf5\x2b\x56\x50\xb7\x38\xaa\x7f\xc9\x82\x5f\x1c\x66\x6f\xdb\x56\x25\x49\xf9\xc9\x3e\xf3\x91\xb8\x74\xb5\x4a\x96\x91\xb3\x90\x9e\x47\x9b\xac\x25\x3a\x5b\x23\xce\xb2\x86\x2f\xdd\xcc\x8f\xa0\xb1\x32\x72\xd6\x6b\x09\xcf\x12\xd9\xd5\x76\x2a\x29\x2e\xd7\x41\x6d\xcc\xbb\x48\xa1\x2b\x98\x63\xf3\x8e\xb5\x5b\x16\x15\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\x11\x80\xb1\xc3\x80\xb1\xb7\xe4\xc8\x81\x3f\x81\x3f\x81\x3f\xb7\x10\xfe\xfc\x1f\xd7\xe8\x98\xc0\x9f\x25\xb9\x72\x4b\xd5\x6e\x1a\x6b\xc9\xd0\x62\xad\x4a\xa9\xa0\xc9\xba\x2e\xeb\xec\x63\xd7\xd8\x7b\x07\xe9\x95\xce\xc9\x4b\xeb\xe9\xe8\x93\xf5\x63\x17\xe7\xc4\xd9\xc9\xc7\x8d\xc3\x2e\xd8\x67\xba\xf1\xa2\x79\x48\x97\x83\xc5\x0c\x20\x1b\x20\x5b\x06\x90\x0d\x90\x0d\x90\x0d\x90\xad\x67\x20\x5b\xa6\x6b\x20\x5b\xcb\x7b\xd2\x34\x64\xcb\x00\xb2\x01\xb2\x01\xb2\x01\xb2\x01\xb2\x75\x1e\xb2\x65\x7a\x9a\x3a\x65\x40\x9d\xda\x47\x9d\x32\xdd\x4e\x9d\x32\x5b\x90\x3a\x65\xdf\x40\x33\x22\x20\xeb\x24\x1d\xe7\x01\x59\x87\xe8\x00\x8d\x07\xa6\x7a\xba\xd0\xd4\x7a\x3a\x65\xb2\xa1\x86\xb2\x3c\x9f\x0d\x0f\xb2\x3a\xc8\xf6\x8b\x60\x2a\xb3\x5d\x3f\x2d\x8c\x1a\x36\x16\x9a\xe0\x19\xff\xfe\x1d\xd5\x54\xec\x7e\xf1\x19\x8a\x49\x25\x9b\x80\xed\x11\x7f\xea\x0c\x03\x13\xc8\x6a\x9a\x32\x74\xba\x4a\x56\x62\x1f\xa5\x36\x36\xf6\x10\x93\x80\x6c\x60\x93\xb2\x81\x7f\xd3\x47\x93\xe2\xdd\x9f\xa0\x23\xfc\xdd\x1f\xa7\x0d\xcf\x3f\x51\xcc\x38\xcd\x8b\x19\xdb\xda\x7f\xcd\xb4\x73\x46\xc8\x04\x9d\xa6\x93\x2e\x99\xa0\x66\x1a\x0a\x33\x44\xc1\xe6\xa2\xac\xea\x15\x6a\xd0\x50\x05\x9a\xa3\x60\x0b\x96\xfc\xd3\x91\x6a\x43\xb4\xdb\xd4\x6d\x72\x89\x60\xa9\x2b\xb6\x4d\x1a\x15\xbf\xba\x6d\xd2\x94\x7d\x60\xbb\xad\x53\x7b\x64\xff\x40\x68\x41\x68\x41\x68\x41\x68\x7b\x87\xd0\x62\x7d\x16\xb2\x3e\xeb\x1e\x84\x0d\xc9\xd5\x8e\x48\xae\xc2\x53\x00\x4f\x01\x3c\x05\xf0\x14\xc0\x53\xd0\xd3\x9e\x02\x28\x6f\x43\x79\x1b\xca\xdb\xed\x52\xde\x86\x23\x0e\x8e\xb8\x5e\x75\xc4\x65\x0b\xad\xd5\x81\x0f\x45\xca\x49\x7f\xa4\xfc\x00\xbb\x5f\xbc\xcd\x8e\xa5\x6d\x23\x5e\xde\x82\x39\x2a\xec\xdb\xc3\x94\xb1\xaa\x66\xd7\x15\xf8\xd0\x64\x1b\x5b\x1b\xab\x36\xcd\x18\x50\xcd\x16\xfa\xf8\x04\x17\xfa\xb0\xeb\xb4\x7e\xa6\x11\x8d\x8f\x4b\x4e\x8b\x53\x76\x8b\x5d\xa1\xf5\x91\xbc\xe5\x57\x34\xd6\xb7\xbf\x5d\x1e\x95\x9f\xbd\x19\x5c\xa9\xa1\xe5\x3a\x20\x0d\xcb\x7d\x5c\x09\x7f\x03\x0f\xb0\x71\x1f\xdf\xb3\x5d\x5f\xd2\xf7\x59\x40\xe8\x03\x39\x08\x10\xfa\x80\x87\x0b\x1e\x2e\x78\xb8\x7a\xc9\xc3\x05\xa1\x0f\x08\x7d\xc0\xb3\x00\xcf\x02\x3c\x0b\xf0\x2c\x74\x85\x67\x21\x9b\xa1\xd3\xec\x64\xfc\xb8\x0d\x42\x1e\x77\x0b\x7d\xf8\xee\xdd\x20\xf8\xb1\xd5\x89\x2f\x04\x3f\x20\xf8\xb1\xb5\x52\x2f\xd8\xaf\x24\x68\x54\x08\x7e\x68\xcb\x52\x2e\x65\xb1\x31\xdf\x32\x65\x9a\x5a\x94\x75\xf6\x8e\x04\xfb\x56\x3f\x3d\x64\x1c\x3e\xe9\x3e\xda\x2e\x55\x16\xaf\x2f\xf7\x71\x49\x2d\xca\xc9\x7d\xc6\x31\x97\xaa\x9b\x30\xcb\x95\x19\x47\x6c\xb5\x6a\x65\x57\x37\x16\xc6\xce\x07\xdb\xaa\x52\x66\xdc\x6f\x43\xe9\x2b\x21\x49\x26\x37\x96\xc3\xa1\xe2\x29\x76\xc2\x04\x89\x81\xcf\xdb\xe2\x8b\x6a\xd1\xa7\xc8\x19\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\xf8\x22\x2a\x95\x81\xdc\x81\xdc\x81\xdc\x75\x8a\xdc\xfd\x9b\x37\xd0\x9c\x20\x77\xd2\x5a\x45\xd5\x73\x52\x51\x29\x15\xc6\xd6\xc7\x05\xab\x0b\x08\x61\xe4\xb0\x47\x2d\x55\xa4\x62\x59\xcd\x5b\xe7\xc9\x9a\xce\x7e\x7f\x89\xbd\x3c\x48\x0f\xb8\x9a\x5a\x32\x9b\x8a\x1e\xac\xcf\xf3\xce\xda\x4d\xce\xab\xf9\x49\xbb\xc9\xe4\x61\xe3\xb4\x49\xa7\xbd\x45\xd1\x9c\x13\x4c\x18\x70\x62\x97\x93\x3e\x88\xfc\x02\x80\x41\xe4\x17\x00\x0c\x00\x0c\x00\xac\x87\x00\x58\x17\x29\x24\x74\x0d\x00\x43\xea\x3e\x00\x18\x00\x18\x00\x18\x00\x18\x44\x7e\x91\x5b\x7c\xf7\xf0\xaa\xae\xcf\x2d\xde\x92\x22\xbf\xeb\xf4\xbd\x22\x42\xea\x32\x5d\xe2\x11\x52\xe7\x29\x4b\x67\x03\x23\xa4\x5c\x24\x2a\x65\x92\xa8\x54\x00\x31\x6a\x49\xec\x54\x21\x3c\x76\x6a\x9a\x65\x9c\x78\x28\xd1\x25\x2b\x2b\xd3\xd5\x5b\x33\x7c\x2a\xa0\xaf\x14\xff\x71\xf2\xc7\x6c\x31\x4b\x0f\x38\x90\xa8\x1d\x15\x47\x6c\x26\x53\x13\x08\xec\x39\x7a\x96\x16\xab\x44\x83\x67\x69\xba\x15\xcf\x12\x52\x75\x90\x12\x6e\x52\x4a\xf8\xa3\x11\xba\x22\x2c\xcc\x3c\x5d\xe0\x16\xe6\x2c\xb5\x68\x56\xd2\x55\x21\x30\xfc\x0c\x2d\x38\x02\xc3\xad\x6b\xfd\x9a\x90\x1d\x5e\xa4\xcb\x2e\xd9\xe1\xd6\x35\x7f\xa7\x62\xc4\x8d\x99\xc6\x0d\x5b\xc2\x1a\x5b\x9a\xfc\xb1\x51\x7f\xd3\x38\xe2\xab\x50\x1c\x64\x26\xa7\xc4\xd1\xb5\x66\xd2\x4f\xb7\xb8\x33\x06\x13\x3a\xc6\x80\xd0\x80\xd0\x80\xd0\x80\xd0\xd0\x31\x86\x8e\x31\x74\x8c\xa1\x63\x0c\x67\x08\x9c\x21\x70\x86\xc0\x19\x02\x67\x48\x4b\x9c\x21\xd0\x31\x86\x8e\x31\x74\x8c\xa1\x63\x0c\x5f\x23\x7c\x8d\x3d\xa4\x63\xdc\x29\xa7\xdd\x16\x54\xe2\x61\x7f\x17\xa1\x87\x45\x7e\x40\x8d\x80\xf3\xd8\x7a\x7a\x8c\x7d\x31\xc2\xfe\x20\x52\x5d\x0b\xf0\xb5\x05\xb9\xe2\x5d\x77\x0b\x7f\x71\xf2\xe1\x82\x5c\x71\xd7\x00\x9c\x9c\x9f\xb3\x70\x63\x0b\x8b\xfe\xd5\x34\x34\x51\xd3\xd0\x44\x23\x0d\x65\xcb\xf4\x8c\x98\xb4\x17\xe8\x3c\x9f\xb4\xb3\x34\x4d\x99\x26\x26\xad\xeb\x3e\x1b\x71\x33\xb3\x9f\x5e\xa2\x73\x8d\xea\xa9\x04\xc9\x4c\xab\x45\x79\x59\x29\x19\x1f\x33\x9d\xfd\xe1\xeb\xd9\x6f\x0f\xd6\x53\x5b\x19\x0e\x57\x5b\xc9\x88\xc6\x92\xe9\x7a\xa2\x2b\x2e\x91\x67\xe7\x14\xe4\x62\x20\x17\x03\xb9\x18\x70\x83\xc1\x0d\x06\x37\x18\xdc\x60\x5d\xe3\x06\xeb\x1e\x2f\x0f\xdc\x0f\x70\x3f\xc0\xfd\x00\xf7\x03\xdc\x0f\x3d\xed\x7e\x00\x1f\x05\x1f\xed\x51\x3e\xba\x25\x73\x31\x72\x74\x56\xe0\xb1\x49\x3a\xc5\xf1\xd8\x51\x3a\x4c\x07\x1b\x57\xab\x35\xf1\x50\x4b\x12\x2f\x94\x70\x86\x3b\xcb\xa6\x37\x20\x5a\x6b\x76\xae\x56\xbb\x36\xfe\x1f\x76\xd4\x23\x69\xaf\xb6\x13\x30\xdc\xd0\x6c\xbf\xf8\xeb\xe6\x60\x33\x41\xb9\xce\xd0\x0c\x4d\x55\xa5\x5b\xec\xa7\xf4\x86\x1f\x17\xc2\xe7\x90\x5b\xd1\x64\x6e\xc5\x3f\xf4\xd1\xb4\xb0\x18\x27\xe8\x18\xb7\x18\x07\xa9\x99\x29\x48\x73\x22\x91\x22\x43\xa7\x9d\x44\x8a\x26\x9b\xca\x8a\xac\x89\x29\x9a\x74\x65\x4d\x34\xd9\xd6\x9d\xa6\x48\x34\x66\xc4\x6a\x2c\x52\x13\x56\x2d\xf9\xee\xd1\x7a\x46\x2c\xe6\x9b\x2a\xe1\x36\x68\x27\xc4\x11\x41\x06\xcd\x2f\x49\xa2\x7d\xa6\x0d\x89\x11\x20\xc2\x20\xc2\x20\xc2\x20\xc2\x48\x8c\x40\x62\x04\x12\x23\x90\x18\x01\xcf\x04\x3c\x13\xf0\x4c\xc0\x33\x01\xcf\x04\x12\x23\x90\x18\x81\xc4\x08\x24\x46\xc0\xf1\x07\xc7\x5f\x17\x3a\xfe\xba\x3a\x31\xa2\x31\x1e\xdd\x80\xcf\x2c\x94\x50\x6f\xc5\xd4\x88\x7f\xd9\x4f\x4f\x9a\xa5\x13\xca\x8a\x26\x17\x14\xc3\x2e\xf9\x45\xe8\xb3\xaf\x45\xd8\xcb\x11\x7a\x6d\xd5\x61\x36\x6d\x0f\x4c\x97\x78\xb2\x20\x57\x26\xbd\x27\x99\x7c\x1d\x89\x13\xfe\x89\x13\x5f\x1c\xa2\x83\xd6\x33\x29\xeb\x63\xeb\x69\xf1\x5e\x07\x25\x49\xe4\x25\x79\xd5\xd8\x22\x57\x74\xf6\xaf\x87\xd8\x2f\x0e\xd0\x3d\xc6\x69\x4b\xeb\xe9\xe8\x9a\xb9\xfb\x28\xe5\x95\x75\x25\xbf\x26\x15\xdd\x2e\x78\xc9\xde\xe9\x4f\xf3\x06\x16\xe4\x4a\xca\xb5\x9a\x9b\xb0\xd7\x81\x09\xde\x4a\xc2\xe1\xec\x1e\x70\xaa\x96\x65\x9b\xd5\xe8\x15\x59\xca\xa7\x92\x71\x7e\xc2\x64\xb9\xac\x2f\xba\x9c\xc2\xf6\x55\x8c\x31\xe8\xf2\x6c\x8a\xec\x4d\x9a\x17\xcf\x7e\x8e\xce\xf0\x67\x3f\x49\xa7\xe8\xc4\xff\xcf\xde\xbf\x87\xb9\x71\x9e\xf7\xdd\xf8\xb5\x07\x49\xe4\x2d\x59\x87\x47\x92\x65\x41\x94\x04\x81\xd2\x1e\xc0\x5d\xec\x62\x79\x58\x72\x79\x5c\xec\x81\x5c\x70\x49\xae\xb8\x24\x65\xc9\x12\xe9\x59\x60\x16\x04\x89\xc5\xc0\x18\xec\x52\x6c\x7f\xba\x7e\xb6\x15\xbf\xb1\x9b\xb4\x75\xd3\x24\x75\x53\xd7\x71\x9c\xd6\xb1\x53\xbd\xb6\x63\xbb\x71\xae\xb8\x75\xdd\x37\x3e\xc8\x51\xea\x38\x7d\x9b\xb8\x3e\xc4\x6f\xea\x26\xb1\x9d\xbc\x49\x9a\x34\xa9\x5d\x27\x6d\xde\x6b\x9e\xe7\x99\x13\x30\x83\x01\xb0\x00\x16\x4b\x7c\xff\xe1\xb5\xc4\xcc\x3c\x33\xf3\xcc\x33\xf7\x3c\xcf\xe7\xfe\xde\xf7\xdd\xc0\xb3\xe7\xea\x87\x39\x63\x45\x1e\x68\xd4\xce\x04\x1b\xaa\x28\x1b\x32\x03\xb6\x0a\x05\x5d\xba\xc4\xac\x8e\x75\x9a\x2c\xba\xb6\xdb\xdb\x46\xde\xc5\x88\xdf\x27\x57\x1c\xa0\x84\x2d\xa2\x46\x50\xc2\x16\x3e\x42\xf8\x08\xe1\x23\xec\x22\x1f\x21\x4a\xd8\xa2\x84\x2d\x7c\x33\xf0\xcd\xc0\x37\x03\xdf\x4c\x47\xf8\x66\xb6\x21\x39\x42\x91\x5c\xf0\x6e\x14\xc9\xdd\x3e\x81\x2e\xec\xab\x43\x74\xa0\x1e\xaa\xa8\x16\x72\xda\x4d\xe3\x13\xaf\xb3\xf7\x0e\xb1\x8f\x38\xb0\xe2\x46\x8d\x58\xd1\x6a\xa1\x49\x5c\x71\xb7\x37\x57\xb4\x4e\x03\xb0\xe8\x0d\x16\xcf\x06\x83\xc5\x3d\x6c\xd8\x03\x2c\x5a\x3d\x0b\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\x08\xb2\xd8\xcd\x64\xf1\x7d\xbb\xe8\xbc\x24\x8b\x76\x1a\xf1\xb1\x0d\xdf\xac\xce\x57\xad\xd4\xe2\x05\x2d\xad\x58\xa9\xc5\xe5\x4e\x2f\x8d\xe9\x5c\x04\xcc\xbe\xf8\x08\xfb\x62\x1f\xdd\xed\xaa\x82\x19\x0f\xed\x2b\xaa\x4a\x3a\x2c\x76\x31\x1f\x80\xfd\xbd\xf7\x2b\x84\x79\xd0\x38\xca\x59\x06\x33\xb8\x50\xb0\x90\x22\x37\x37\xc9\x43\x72\x8d\xce\x0b\xfc\x77\x9a\x16\x38\xfe\x9b\xa1\x69\x3a\x5e\x5b\x69\xd3\xc6\xab\x9a\xae\x04\x03\xc0\xe3\xec\x68\xad\x25\x4a\x3d\x93\xc6\x5f\x7b\xd4\x1b\x0a\xde\xce\xfa\x33\x6a\x89\x42\xbf\xb2\xb3\xe2\x49\x4e\x16\xd5\x42\x4e\x49\xa9\x75\x3f\xcc\xc3\xf2\xc0\xad\x7f\x9e\x89\x8b\xb4\x4c\x4f\x97\xe5\x23\xda\xfc\x03\x45\x0c\x3b\xb2\x13\x35\x98\x9d\xe8\x0b\x3d\x2d\xb1\x30\xcf\x88\x5c\x45\x4b\x74\xd6\xce\x55\xd4\x16\xd3\xe5\x6f\x56\x0a\xeb\x25\xaa\xd1\xb2\x05\xd8\xae\xea\x86\x2f\xf1\x85\xbb\x2a\x4c\xd7\x89\x82\x52\x34\x96\xff\xc6\x92\x99\x7f\x4a\xeb\xb6\x61\x87\x0a\xdc\x97\xb5\xa5\x16\xec\x91\xf2\x86\x46\xf9\x45\xed\xe1\x41\x13\xbb\x9c\x1b\xd7\xd4\x62\x46\x75\x6e\x1d\x70\x6e\xe5\x61\x1d\x6a\x26\x9b\x1a\xad\xd8\xcf\xd5\x8a\xf1\xf7\x4d\xb9\xd5\xb8\xca\xc4\x59\x5a\xa4\x64\x99\xf5\x9c\xa2\x83\x0d\x78\xc3\x96\xb8\x0f\x02\x66\x33\xc0\x6c\x7e\xb4\x8f\x5e\xe9\x63\x1f\xee\x0b\x7d\xd0\x72\xca\xbd\xdc\xd7\x3d\x66\xb3\x0c\xdb\x18\xfd\xcc\xdd\x10\x1c\x2d\x1a\x83\xd3\x76\x46\x0e\xf9\x0c\xdc\x61\xce\xe3\x85\xd7\x4a\xc9\xf1\x23\xf3\x5a\x7e\x54\x1c\xcd\xf7\xe0\x5e\x4b\x3d\x3c\x94\xd4\xb5\xfc\x92\xf0\xca\x9d\x31\x5e\x0b\xf9\xf7\xb2\xf9\xb2\xd8\x3f\x0e\xfb\xdb\xf3\xc4\x97\x7b\xe8\xb5\x1e\xf6\x6a\x4f\xe8\xf3\xd6\x7a\xe0\x43\x3d\xf3\x9a\xb1\xbc\xcd\xea\xe1\x8c\xc6\xbb\x5d\x0b\x47\x56\x8d\x9f\x22\xe1\x69\xd7\x5d\xf0\x95\x9e\xc8\x1b\xb2\xae\xdb\xfe\x87\x51\x25\xc5\x6f\x9c\x7b\x75\x72\xd9\x94\x0c\x08\x56\x73\x69\x3d\xac\xdd\x90\x7d\x2a\xbc\x1e\x05\x55\x2b\xe4\xd4\x58\x58\x9c\x91\xbb\x51\xcd\x67\xc9\x57\x5c\x9e\x1d\x60\x9d\x3e\x72\x1b\xbf\x2c\x97\x4b\x70\x6b\x66\xc0\x8f\x7b\x7f\x46\x76\xb0\xdb\xf9\x25\xd7\xfa\x21\xd9\x44\x61\xff\x38\x25\x67\x29\xc1\x4e\x44\x8e\x59\x28\x66\x37\x7f\xcf\xe4\x4b\xef\xd3\x42\xa4\xdf\xd8\xc9\x89\x5b\xb6\x1f\xd0\x61\x9f\x7d\x81\xc6\x82\x2b\x01\x8d\xa5\x72\xeb\x7a\xc9\x30\x96\x39\x55\x67\x3f\xfe\x02\xfb\xf0\x00\x3d\xe0\x95\xde\x2f\xa8\xd0\xcf\x8c\x68\xe7\xbc\x96\x53\xa3\x11\x9f\x42\x3f\x8e\x7d\x3a\x5c\x32\x82\xca\x3e\x50\x52\xa0\xb2\x0f\x94\x14\x50\x52\x40\x49\xd1\x45\x4a\x8a\x0e\x4a\x53\xd8\x31\x4a\x0a\xe4\xcf\x83\x92\x02\x4a\x0a\x28\x29\xa0\xa4\x40\x65\x1f\x24\xf8\xba\x75\x64\x09\x1d\x9f\xe0\x6b\x5b\x56\xf6\xb9\x4c\x33\x82\x34\x1e\xa1\x29\x4e\x1a\xf7\xd1\x04\x8d\x07\x15\xc4\x88\x39\xc8\x50\x53\x8a\xfa\xa4\x83\xc9\xe2\x34\x3b\x5e\x63\xf9\x0b\xc7\xc5\xb9\xd8\x62\xe4\xa7\x76\xfa\xb0\x32\xbb\x94\x8f\x13\x8b\x3d\xe9\x5b\xca\xa7\x15\x60\x4c\x70\xac\x04\x9d\xa0\x63\x65\xde\x9e\x18\x8d\xd4\xf3\x40\xe0\xe1\x81\x63\xbc\x41\xc7\xf8\x77\x7a\x68\x4e\x54\xc9\x39\x46\x47\x1c\x55\x72\xc6\xa9\xce\x31\xe8\x6b\x10\xe8\xb8\x30\x37\x07\xe9\x00\x37\x37\xf5\xb7\x3c\x2b\xbc\xec\x47\xe9\xb0\xed\x65\xaf\xbb\x95\x5a\xeb\xf4\xb4\xc5\x2e\x45\xff\x72\xc4\xc7\x2e\x79\x57\xe7\x71\xda\xa8\x98\x6f\x75\x1e\xbb\x30\x4f\xeb\xac\x15\xca\xf1\x00\xe3\x02\xe3\x02\xe3\x02\xe3\xa2\x1c\x0f\xca\xf1\xa0\x1c\x0f\xca\xf1\xc0\x9d\x00\x77\x02\xdc\x09\x70\x27\xc0\x9d\xd0\x14\x77\x02\xca\xf1\xa0\x1c\x0f\xca\xf1\xa0\x1c\x0f\xbc\x75\xf0\xd6\x6d\xf3\x72\x3c\xb5\xa1\x64\x8f\x28\xac\x7a\xb0\x72\x3d\x45\x7f\x9a\x2f\x61\xff\xc4\x30\x4d\xba\xb3\x27\xfa\x04\x37\x17\x55\x0e\x98\x0d\xcb\x22\xe3\x99\xd9\xf7\x87\xd8\x77\x7a\xed\xf4\x89\x8f\xf2\x08\x66\xf7\xb2\xf4\xbc\x38\x6a\x59\x2d\x45\x1f\xe3\xa1\xca\x65\x49\x0e\xed\xed\x4d\x0e\x48\x7e\xd6\xdf\x9d\x71\x4c\x8c\xa1\x49\xda\xcf\xc7\xd0\x18\x8d\xd2\x1e\xff\x38\x8d\x42\x41\x37\x46\x8c\x7d\xa1\xc1\x11\x7c\x19\xb5\x44\x0d\x27\x27\xb4\x4f\xe4\x72\x38\x84\x3e\xb6\xc3\xee\xe9\xb0\x19\x61\xec\xdb\xd9\x4f\x98\xa1\xc4\x6d\xea\xef\x04\x4f\xf7\x58\xe6\x04\xad\xaf\x5f\x41\xd4\xe0\x03\x6d\xd0\x07\xfa\xbe\x9e\xcd\xbe\xd4\x42\x52\x11\xe7\x92\x0a\xcb\x45\x59\x77\x23\x9b\x0c\xfa\xad\xcd\x64\x54\x35\x13\x4e\x7b\x12\x7d\xfb\xbd\xb6\xc9\xb8\x5f\xce\x67\x15\xa7\x95\x90\x93\xd2\xb6\x19\x89\xd6\xf8\x1e\x61\x37\x02\xec\x06\xf8\x77\x5b\xf8\x37\xc0\x07\xc0\x07\xc0\x47\xab\xc0\x47\xf2\xd3\x3d\x4d\x5e\xfd\x9d\x17\xb2\xa9\xd3\xb4\xe0\x90\x4d\xb5\x78\x45\xd9\xe4\x55\xc1\xb5\xb0\xf7\x8c\x62\x27\xbb\x43\x74\x3b\x25\xfe\xf0\x4e\x7b\x12\x30\x5c\x91\xde\xc3\x77\x01\xf1\x78\xc1\x2b\x27\x7d\x2b\x66\x06\xc8\xd6\xd1\x6d\xf3\x11\x64\xeb\x40\xb6\x8e\x2d\xce\xd6\xf1\xec\xa6\x17\x8c\x9b\xce\xcc\xd1\xe4\x4f\x41\x72\x92\xf6\xb3\xbd\x91\xb8\x95\x3f\xe3\xf5\xce\x2c\x1c\xf6\x41\xb7\x44\xe2\x8d\x1f\x1d\xa4\x5d\x82\x5a\xae\xf0\x5a\x2f\x66\x31\xef\x54\x51\xcb\x5f\xd3\x56\x74\xf6\x87\x03\xec\xeb\x7d\xf4\x3a\xbe\xd5\x2a\xe5\xfd\x54\x40\x7a\x8d\xa2\x96\x4f\x6a\x2b\xd1\x41\x63\xb7\x84\xb1\x8b\xac\xe7\x2d\x37\xcc\x6b\xc5\xe9\x5c\xce\xfa\x18\x36\x2f\x61\x55\x8b\x4a\xb2\xbc\x59\x08\xc3\xc7\xb9\x30\xdc\x18\xe3\x07\x68\x1f\x4d\xf8\x8e\x71\xde\x57\x31\xd9\x57\x31\x79\xcf\x35\x45\x8a\x3c\x1d\x3c\x92\x63\x6c\x44\x8e\x64\x7e\x1a\x13\x83\x8b\x93\x54\x96\xa4\x0f\x0a\x3e\x41\x15\x16\xe4\x0e\x41\x15\x16\x88\xce\x21\x3a\x87\xe8\xbc\x8b\x44\xe7\xa8\xc2\x82\x2a\x2c\x10\xfb\x42\xec\x0b\xb1\x2f\xc4\xbe\x1d\x21\xf6\x45\x8d\x14\xd4\x48\xd9\x2e\xf2\x46\xd4\x48\x69\x45\x8d\x94\x9f\x8f\xd2\x7e\x41\xe2\xf2\x6a\xe9\x86\x56\xbc\x6e\xcc\xd6\xac\xd4\xb7\x82\xca\x65\xf3\x99\xa2\xaa\xeb\xa9\x9c\xa2\xeb\xaa\xa5\x1e\xfc\xde\x30\x7b\x4f\x1f\x31\xfb\x30\x8b\xd3\x3d\xee\x21\x24\x5c\x10\x6d\xcc\x18\x6d\x44\x9f\x30\x76\x38\x6b\x1d\x28\x31\x9d\x73\x97\x26\xab\x09\x57\xe9\xb4\x40\x69\xb3\x94\xe0\x28\xed\x08\x55\xf1\x10\xc5\x1c\x5d\x61\xf2\x34\xe7\xc5\x6d\x42\x27\xc4\xa5\x85\x75\xe5\x74\xae\x78\x2c\x92\xbd\xb9\x2e\xa8\x02\xc0\x85\xfe\x7a\x87\xe7\xa3\x89\x78\x2b\x0f\x5d\x4f\xe7\x49\xb9\x4f\x1b\x1f\x50\xbd\x3e\xbc\xa0\x27\x04\x1f\x1e\xb4\x88\x0d\x6a\x11\x7f\xa5\xa7\xb9\xb6\x62\x49\x08\x13\x17\xe8\xa4\x2d\x4c\xdc\x2a\xeb\x53\x47\x69\x92\x4d\x59\x9f\xe8\x2f\xdc\xeb\x69\x7d\x5e\x6f\x8a\x18\xf3\x6e\x8b\xb3\x5b\xfc\xde\x4e\x83\x03\x29\x23\xa4\x8c\x90\x32\x42\xca\x08\x29\x23\xa4\x8c\xdd\x29\x65\x6c\xc3\x3c\xa0\x06\x79\xe3\x3f\xb9\xcb\x73\xa6\xb0\x27\x40\xe9\xe8\x9a\x3e\x44\xb8\x22\xa7\x4d\xb3\x07\xc8\x1d\xbb\x6d\xce\x02\xb9\x23\xe4\x8e\x5b\x2c\x77\x6c\x33\xbf\x6a\x6e\x55\xb2\xc6\xbe\x1d\xc9\x43\x34\xc9\xf6\x47\xf6\x5a\xb2\xc6\x37\x38\xf5\x90\xce\x63\x2b\x15\x91\x4d\xd7\x2b\x7e\x73\x0f\x9d\x14\x94\x54\x4c\x27\x2c\x34\xea\x13\x6c\x5d\xd0\xd2\xe9\xac\x5e\x5c\xe7\x23\x7e\x65\x3d\x9d\x71\x44\x5d\xbf\x7b\x0f\xfb\x85\x3e\xba\x5b\x34\x64\x7d\xf0\x06\x3c\x98\xe9\x92\x96\x9e\xb5\x5a\x49\xf0\x56\xa2\x31\x63\x3f\x31\x23\x91\x9f\x39\x5b\xdd\xef\xb1\x7f\x93\x39\x6a\x96\xce\x8a\x71\x78\x92\xe6\xf8\x38\x3c\x4e\x47\xe9\xb0\xef\x38\x94\xd3\x45\x73\x0c\x7a\x5c\xdf\x66\x51\xea\xe5\xe0\x81\x78\x98\x1d\x92\x03\x51\x5c\x8e\x1c\x7d\x5e\x17\x53\x89\x51\xdf\xbd\xb3\xe2\x49\x0d\x7b\x23\x54\xaf\x87\x15\x97\xbb\x6e\xd5\xf3\x4a\x3c\x4d\xc6\xab\xe0\x9e\x2b\x6c\xee\x81\x61\xba\x00\xb2\xda\x20\x59\xfd\x4c\x8f\x7f\x4e\x87\x66\x9b\x95\x65\x41\x5d\x17\x29\x69\x53\xd7\xcd\x36\x5a\x23\x5f\x6d\xb1\x49\x8a\x7e\xfc\xde\x0a\x93\xb4\xcb\x0a\x0e\xf7\xb2\x42\xe3\x62\xeb\x96\x19\x21\xa0\x56\xa0\x56\xa0\x56\xa0\x56\xa0\x56\xa0\xd6\x46\x50\xab\xef\xa4\xa1\xe3\x19\xac\x39\x63\x08\xc4\xa0\x35\x4e\x1a\x2a\x26\x03\xb5\xce\x22\x12\x1f\xbc\xab\x62\xd2\x30\x11\x80\x58\xbd\xa6\x12\x63\x7c\xfd\xbf\x15\x33\x09\x60\xd7\x6e\x9b\xbf\x00\xbb\x02\xbb\x6e\x31\x76\x6d\x3f\xee\x0a\x24\xaf\x2d\x5e\x5d\x26\x4f\xd0\x31\x76\x24\x32\x65\x51\xd7\xc7\x9d\xd4\xd5\xa3\x89\x5b\x22\x1c\xfd\xc7\x86\x28\x2e\xf0\xae\x5e\xd2\x8a\x4a\x46\x2d\x57\xc0\x72\xdd\xac\xb9\x51\xea\x60\xd9\x6f\x0f\xb2\x2f\xf5\xd3\x3d\xf2\x57\xeb\xbb\xfa\xa2\x0c\xef\xc8\xa7\xb3\x1b\xd9\xf4\xba\x92\x73\x0a\x7f\x15\x2b\x94\x6a\x59\x1c\xc6\x09\x76\xcc\x31\xdf\x9f\xb2\x56\x0a\x83\xbc\xa1\x41\x3b\x86\xd4\x15\x14\xa8\x15\x54\x6b\x19\xa7\x97\x54\x25\x1d\x8b\xee\xe6\x07\xc8\x86\xe5\xe7\xd9\x79\x9a\xc5\xac\xde\xbc\x2f\x72\x8b\x82\xde\xaf\x0b\xc1\xdc\x38\x17\xcc\x19\xaf\x1c\x4f\x4c\xd9\xc0\x57\x96\xeb\xae\xe7\x36\xd4\x7c\xf0\x4b\xb7\xdb\xfb\xa5\xbb\x8b\x11\xbf\x30\x51\x2e\xf1\x4a\xf0\x8b\x77\x84\x4d\xc9\x17\xcf\x3d\x8c\xe4\x0b\xe8\x7c\x14\x1e\x6f\x1e\x42\xe2\x11\x12\x8f\x90\x78\x84\xc4\x23\x24\x1e\x21\xf1\x08\x89\x47\x48\x3c\x42\xe2\x11\x12\x8f\x90\x78\x84\xc4\x23\x24\x1e\x21\xf1\x08\x89\x47\x48\x3c\x42\xe2\xdb\x14\x12\xff\xd7\xbd\xf4\xb0\xa0\x81\xea\x8b\x25\x35\xcf\x1f\x95\x45\x02\xd9\xef\xf6\xb2\xaf\xf7\x12\xb3\x37\x59\xe0\xef\xa1\x8c\x5a\x72\x7f\x68\xc5\x2d\x44\xc3\x19\xb5\x34\x67\xed\x2f\xc1\xdc\xf4\xd2\x82\xb9\xb8\x6b\x62\x74\x42\x45\x43\x53\x15\x0d\x4d\xd5\xd2\x50\xb2\x40\x17\x05\x87\x3b\x4b\x8b\x9c\xc3\xcd\xd3\x2c\x25\x1a\xe0\x70\x8e\xfb\xac\x25\x19\x25\xfb\xb7\x97\xe9\x80\xe8\xfd\xd5\x9c\x76\xc3\xf8\x14\x16\xb5\x5c\xcc\x42\x2b\xe5\x64\xd6\xd8\x49\x4f\x5d\x55\xd7\x14\x9d\xbd\xfd\x32\xfb\xd2\x00\xed\x72\x1c\x37\x6d\x1e\x66\x3d\xa4\xa1\xea\x39\x44\xe7\x73\xda\x8d\x65\xde\x5c\x74\xd8\xd8\x73\xde\xa3\x2d\xf9\x00\xed\x5d\x3b\x9c\xa9\x26\x40\x16\x41\x16\x13\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x5d\x43\x16\x9b\x5e\xcf\xbe\x61\xb2\x88\xca\xfa\x20\x8b\x20\x8b\x20\x8b\x20\x8b\x5d\x4d\x16\x51\xfa\x1b\x20\xb0\x5b\x4b\x7f\x27\xb6\x21\x08\xac\x57\xfe\xe9\xe4\x55\xa6\x06\xd4\x86\x44\x35\x55\x62\x09\x28\x9b\x72\xed\x7a\xb0\x08\xed\x14\x9b\x97\x22\xb4\x6a\xfc\x4c\x4a\xd2\xec\xcb\xab\x14\xa4\x45\x7e\x67\x67\x00\x4b\xbb\x5f\x7c\xb1\xc2\x8a\x13\x9b\xed\x11\x3f\xb6\x17\x9c\x09\xce\x75\x86\x4e\xd3\x42\x99\x44\xff\x10\x4d\x36\xf8\xc0\xa0\xd0\x47\xa4\x73\x83\x91\xce\xef\xec\xa5\xa4\xb0\x1c\x33\x34\xcd\x2d\xc7\x61\x6a\x7c\x20\xd2\x39\x11\xcc\x7c\x8a\xe6\xed\x60\xe6\x4d\x35\xb8\x24\x42\x9d\x16\xe8\xa4\x23\xd4\x69\x53\x2d\x36\x6e\xd8\x0a\x5a\xbb\x0d\x5b\xf4\x5d\xa3\x01\x86\xed\x71\x19\x0d\xe7\x08\x2d\xd4\x56\x9d\x46\x6e\xbf\xd8\xa1\x8a\x91\x9b\xb1\x0e\x6d\x99\xb9\x6b\x4d\x5c\x35\x38\x31\x38\x31\x38\x31\x38\x71\xf7\x70\x62\xcc\xf3\x02\xe6\x79\x9d\x03\xd2\x91\xd3\xa2\x2d\x39\x2d\xe0\xaf\x80\xbf\x02\xfe\x0a\xf8\x2b\xe0\xaf\xe8\x6a\x7f\x05\x52\x1b\x21\xb5\x11\x52\x1b\xb5\x2a\xb5\x11\xdc\x81\x70\x07\x76\xab\x3b\x30\x99\x69\x72\xf2\xae\x20\xfe\x1c\xf5\xe6\xcf\xf7\xb3\xfb\xc4\xdb\x6c\x5b\xda\xf6\xb2\xe8\xe6\xe7\x32\x79\x4f\x1f\x0d\x09\xfd\x7c\x71\x45\x49\xc5\xcc\xae\xe0\x4f\xb2\x5c\x3c\xcf\xfe\xb8\x97\x7d\xb7\x97\x1e\x36\xf6\x9c\x76\xee\x18\x1c\xd3\x30\x98\x51\x4b\xe7\xcb\x0f\xdb\x2e\xa1\x0d\xbe\x19\xe5\x5a\x13\xf3\x60\x86\x36\xbc\x7b\x88\x62\xc1\x8f\x46\x26\x9b\x29\x6a\x39\x55\x67\xbf\x3b\xc8\x7e\xab\x9f\x1e\xf0\x7a\x40\xa1\x42\x6d\x89\x66\xce\x6b\xc6\xaa\xa3\x29\x09\x66\xc6\xf9\x01\x1e\x8f\xdd\x38\x87\x71\xa7\xf3\x5a\x71\x3a\x97\xb3\x52\xc2\x35\xef\xe9\xb7\x2c\xdb\x8c\xef\x50\x68\x7a\x1a\x9a\xba\xb2\xcd\xbc\x10\x6c\x83\xa6\xd8\x41\x69\x83\x7c\x47\x93\x34\x40\xc6\xd3\x71\x9a\x1e\xe4\x9a\x41\x44\x08\x72\xcd\xc0\xd3\x07\x4f\x1f\x3c\x7d\xdd\xe4\xe9\x43\xae\x19\xe4\x9a\x81\x87\x05\x1e\x16\x78\x58\xe0\x61\xe9\x08\x0f\x0b\x72\xcd\x20\xd7\xcc\x76\x61\xca\xc8\x35\xd3\x8a\x5c\x33\xff\x6b\x80\x42\x02\x09\x2a\x85\x82\x3e\xb6\x11\x1f\xd3\x4b\x4a\x49\x5d\x5d\xcf\x19\x2f\x29\xfb\xd6\x00\xfb\x8f\x7d\x74\x87\xb1\xed\xca\x46\x3c\x34\x5c\x3d\x79\xc9\xb2\x3c\x74\x59\x2d\x45\x9f\x32\x76\x9d\x2e\x14\xf4\x4b\x71\xc7\xcf\xdb\x8d\xcf\x5d\xa6\x19\x81\xe1\x8e\xd0\x14\xc7\x70\xfb\x68\x82\xc6\x7d\x45\xea\x46\x3f\x99\x4e\x01\x79\xc7\x4d\x09\xbb\x39\x17\x4c\xe3\x46\x58\x54\xd2\x38\xe3\x22\xac\x8c\xcf\xd6\x75\x80\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x81\xbf\x6d\x09\x7f\xfb\xbd\x5e\x7a\x48\xf0\xb7\x74\x56\x4f\x69\x86\xd1\x33\x95\x78\xec\x73\xbd\xec\xdf\xf7\xd2\x4e\x6b\x43\x28\x94\xe1\xca\xf7\x55\xad\xb8\x66\x75\xa2\x12\xe6\xd8\x27\xfa\x40\x46\x2d\xcd\x9a\x7b\x4e\x2f\x2d\x9c\x34\x7e\xed\x40\xf1\x63\x7d\x39\x6d\xaa\x6b\x1c\xf9\x3d\x06\x26\x74\xfe\xa7\xc3\x94\xf4\xe9\x62\x77\x79\x3d\xab\xd6\x9f\x3e\xf6\x77\xad\xbf\x5f\x1a\x53\xf3\xe9\x82\x96\xcd\x97\xf4\x5c\x36\xa5\xea\xec\xd7\x87\xd8\x37\xfb\xe9\x3e\xab\x2d\x4b\xaa\x7a\xb3\x36\x39\xe4\x9c\x6c\x6e\xd9\x68\xae\xa9\xba\x48\xeb\xf1\x57\x54\xc6\x75\x9d\x73\x7b\x54\xe1\xeb\x50\x5d\xe4\x4a\x30\x89\x3d\xce\x8e\x4a\x12\x5b\x3e\xde\x24\x95\x75\x3d\x0d\x14\xe2\x03\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\x05\x9c\xdd\x72\x38\xfb\x66\xba\xcc\x9e\x8f\x3c\xb7\xa3\x87\xf5\x17\x94\xd2\xd5\xd0\x94\x3c\xb3\xc8\x27\x6a\x4c\x70\xd6\x4b\x57\xc3\x7a\x4a\x2b\xa8\x23\x61\x7d\x3d\x75\xd5\xe8\x7d\x3e\x83\x55\x95\x35\x01\x93\x0a\x45\x8d\xdf\x69\x64\xa7\x05\x14\xa2\xd2\xbc\xbf\x07\xf8\x17\xf8\x17\xf8\xb7\xbb\xf1\xef\x8f\x45\x29\x21\xd8\x64\x5e\x2d\xdd\xd0\x8a\xd7\x8d\xf9\xa0\x1d\x89\xed\x43\x24\xb3\xf9\x4c\x51\xd5\x75\xf3\xd7\x97\xd8\xe7\x86\xd9\x0f\x7b\xe9\x75\x76\x1b\x57\x36\xe2\xa1\x50\x51\x55\xd2\x65\x2b\xde\x05\x71\x64\xf4\x09\x63\xdb\x59\x6b\xf7\x4b\x0e\x56\x28\x77\x69\x6e\xae\xd8\xe4\xf3\x34\x2d\xb8\xdd\x14\x1d\xe4\xdc\x6e\x82\xc6\x29\xe6\x2b\xa4\x74\xf4\xc6\x46\x3c\x26\x2f\x29\x50\x46\xf9\xc6\x60\x38\xb7\x9f\xed\x95\x70\xae\xa2\xc3\x25\x9d\x33\x4f\xe6\xd4\x4b\x5e\x7b\xd4\x9b\x0d\xde\xce\xfa\x33\x6a\x89\x42\x5f\xda\x51\xde\xf9\x8f\x16\xd5\x42\x4e\x49\xa9\x3e\xfd\xff\xa4\xdc\xdc\xc6\x47\x90\x98\xa5\x04\x9d\x28\xcb\x4e\x5e\xf7\x33\x40\xb2\x4a\x24\x25\x6f\x30\x29\xf9\xbf\xe8\x69\x86\x0d\x98\x17\xb9\xc8\x8f\xd3\x51\x3b\x17\x79\x2b\x6c\x89\xff\x1b\x5f\x58\x2f\x51\xeb\x4c\x4d\xf4\x1f\xdf\x5b\x6e\x4b\x64\x8a\x18\x63\x98\x9b\xf6\x63\xb7\xf8\xa9\x9d\xe6\xa3\x35\xd9\xbe\x61\x4e\x02\xcc\x09\x32\xce\xb6\x25\xe3\x2c\x52\x0d\x22\xd5\x20\x52\x0d\xb6\x2a\xd5\x60\xf2\xd3\x3d\x4d\xce\xb7\x76\x5e\x54\x10\x39\x4d\x0b\x8e\x0a\x22\x2d\xce\xe1\x16\xf6\x9e\x12\xec\x64\x77\x88\x6e\xaa\x75\x56\xe0\xfc\xdc\xd7\x38\x43\x48\xfc\xcf\x3b\xcb\x67\x05\x03\x05\xa5\x58\xca\x72\x07\xa4\x58\x93\xfa\x2c\x35\x22\x05\x63\xd5\xd9\xa6\x99\xc2\x23\xe5\x0d\x8d\xf2\xb3\xef\xe1\x8a\xa1\x5d\xce\x8d\x6b\x6a\x31\xa3\x3a\xb7\x0e\x38\xb7\xea\xa5\xa2\x52\x52\x33\xd9\xd4\x68\xc5\x7e\xae\x56\x8c\xbf\x6f\xca\xad\xc6\x55\x26\xce\xd2\x22\x25\xcb\x16\x39\x53\x74\xb0\x81\x41\xb1\xc4\x7d\xf3\x98\x9f\x04\xcc\x4f\x3e\xda\x47\xaf\xf4\xb1\x0f\xf7\x85\x3e\x68\x19\xf9\x97\xfb\xba\x67\xb9\x53\xe6\xce\x30\xfa\x99\xbb\xe7\xb9\xcb\xcd\x18\x9c\xb6\x48\x67\xc8\x67\xe0\x0e\xf3\x6f\x95\x50\x73\x28\x39\x7e\xa4\x31\x29\x13\x47\xf3\x3d\xf8\x04\x49\x0f\x0f\x25\x75\x2d\xbf\x24\xd4\x2a\x67\x8c\xd7\x42\xfe\xbd\x6c\xbe\x2c\xf6\x8f\xc3\xfe\xeb\xb0\xc4\x97\x7b\xe8\xb5\x1e\xf6\x6a\x4f\xe8\xf3\x16\x27\xfb\x50\xcf\xbc\x56\x4c\xf1\xb9\x5b\x46\xe3\xdd\xae\x85\x23\xab\xc6\x4f\x91\xf0\xb4\xeb\x2e\x38\x01\x15\xd3\xac\x75\xdd\xf6\xcb\x8f\x2a\x29\x7e\xe3\x5c\xed\x90\xcb\xa6\xe4\x67\x54\xcd\xa5\xf5\xb0\x76\x43\xf6\xa9\x50\x03\x14\x54\xad\x90\x53\x63\x61\x71\x46\x2e\x2f\x32\x9f\x25\x27\x91\x9e\x1d\x60\x9d\x3e\x72\x1b\xbf\x2c\x97\x54\xa6\x83\xd8\x92\xff\xba\xce\xd7\xd0\x5f\x7b\xdc\xfb\xb3\xb2\x83\xdd\xce\xef\x9d\x92\xfb\x68\x82\x8d\x47\x62\x96\x1f\xe2\x7e\xfe\x32\xc9\x37\x5b\x9e\x2b\xd2\x6f\xfc\xe8\xf4\x2d\x6c\x3f\xef\x05\xfb\x4f\xbd\xb4\x63\x4c\x29\x64\xc7\x36\xe2\x63\xec\x8b\xbd\xec\x73\xbd\x74\x47\x4a\x2b\xaa\xc6\xe7\xce\x37\x11\xe8\x83\x19\xb5\x34\xa3\x15\xd5\x4b\x9d\x9f\xf6\xb3\x35\xd9\x3d\x03\x05\xb0\x1f\x7c\x81\xc6\xdd\x31\xfe\x3e\x5c\xb9\xa8\xf2\xbb\xe0\x91\xff\x7f\xfe\x3c\x7b\xeb\x80\x1d\xf9\x3f\x54\x3d\xf2\xff\xbc\x38\x72\x59\x2d\x45\x1f\xb3\x03\xff\xed\x89\x86\xbd\xbd\xc3\x95\xa7\x09\x88\x2f\x21\xbe\x44\x0d\x3a\x88\x2f\x21\xbe\x84\xf8\xb2\x7b\xc4\x97\x1d\x54\x62\xad\x63\xc4\x97\xa8\xfd\x05\xf1\x25\xc4\x97\x10\x5f\x42\x7c\xb9\x15\xb5\xbf\xba\x5a\xc9\x88\xe2\x44\xdd\x5c\x9c\x28\xb1\x0d\x95\x8c\xc9\x17\x28\x21\xe8\xd6\x61\x3a\xc4\xe9\xd6\x5e\x8a\xd3\x58\x60\xa6\x44\x1b\x0c\xd5\x94\x28\xf1\x6c\x30\x85\xdd\xc3\x86\x65\xd5\x11\xab\x69\x2f\x10\xcb\xb3\x24\x06\x25\x5e\x8c\x7c\x6f\x87\x8d\xc0\xee\x17\xdf\x9c\xb0\xe2\xa4\x5d\xf2\x43\xd4\x06\xde\x25\xf0\x14\x0f\x77\x2e\xf3\x6f\x8d\xd2\x9e\x3a\xfa\x19\x2e\x2d\x28\xf8\x1a\x54\xf0\xfd\x7e\x0f\x1d\x13\x2f\xf9\x24\xed\xe7\x2f\xf9\x18\xd5\x37\xf8\x44\x3a\xd5\x38\x4f\xa7\x6a\xc9\xf7\xea\x6e\x64\x56\x38\xff\x8f\xd2\x61\x87\xf3\xbf\xee\x56\x9a\x63\x6b\xfc\x4c\x4b\x85\x0d\xaa\x62\x6b\x0a\x9a\x5e\xa2\xe8\x6f\x8c\xd8\xb6\xe6\x71\x29\xe4\x70\xa8\x62\xb4\x55\xa7\xdd\x89\x8a\x1d\x84\xdd\x99\xb1\xf6\x6a\x83\x05\x6a\x8d\x0e\x10\xc4\x15\xc4\x15\xc4\x15\xc4\xb5\x7b\x88\x2b\xa6\x61\x01\xd3\xb0\xce\x41\xd2\xd0\x60\xb7\x45\x83\x0d\xf2\x0f\xf2\x0f\xf2\x0f\xf2\x0f\xf2\xdf\xd5\xe4\x1f\xa1\x38\x08\xc5\x41\x28\x4e\xab\x42\x71\xe0\x58\x83\x63\xad\x5b\x1d\x6b\xc9\x4c\x93\xa3\xd0\xda\x8d\x90\xa3\xde\x08\xf9\x7e\x26\x43\xc4\x6d\xcb\x4d\xdb\x51\xff\xff\xed\x3d\x74\x4c\x08\xd5\x53\x6a\x51\x7a\x22\x55\xdd\x91\x0f\xc5\xf9\x73\x36\x93\xe7\x79\x50\xc4\x04\xcd\xcc\x84\xf2\xb3\x7b\xd8\x67\xfb\xe8\x1e\xe7\x8e\x57\x36\xe2\xa1\x11\x8f\x5c\x28\x33\xf6\x3e\xcb\xa2\xb1\xf3\xa2\xb1\xe8\x1e\x63\x6f\xc7\x66\xfd\x52\xdc\x77\xe7\x26\xe7\x49\xf1\x4f\x67\x5d\x57\xf4\x40\xcc\xd5\x81\x1b\xf1\x98\xef\xf5\x07\xe7\x3b\xc8\x18\x23\x2f\x17\x3c\x92\x17\xd8\x49\x39\x7a\x3d\x9e\x9e\x1c\xcc\xbe\x97\xe1\x72\xd1\x86\x3e\xb5\xb3\xf2\x11\x8e\x79\x67\x54\xf1\x7f\x8a\x31\x79\xc0\x96\x3c\xc8\xc4\x1b\xe9\x12\x5d\x28\x73\xd4\x36\xe5\x81\x01\x1c\xc2\x7f\xdb\xa0\xff\xf6\x37\x7a\x5a\x64\x44\xe8\x39\xe1\xd6\x5d\xa6\xa7\x6d\xb7\x6e\xb3\xda\xde\x64\xa6\x96\xb6\x5a\xae\xe8\xe7\xee\xad\xb4\x5c\x11\x33\x7f\x4b\x15\x63\x35\x2a\xf6\xd9\x1a\x5b\x85\xd4\x2e\x48\xed\x72\xeb\xba\x15\xc0\x93\xc0\x93\xc0\x93\x90\xda\x65\x73\xa9\x5d\xda\x3a\x8d\x48\xfc\xbb\xbb\x2a\xa7\x11\x07\x03\x12\xbe\xf8\x4f\x2e\x46\x78\x22\x81\xb6\xcf\x2d\x90\x0c\xa6\xdb\x66\x34\x48\x06\x83\x64\x30\x5b\x9c\x0c\xa6\xbe\x2c\x1b\x4d\x5c\x86\x06\xa5\x71\x69\xef\x17\x24\x39\x4f\xb3\x2c\x11\x39\x61\xe1\xdf\xa7\x9c\x49\x63\x7c\xdb\xa8\x4c\x23\xd3\x74\xc8\xfb\xfe\xcb\x74\x48\x40\x5e\xf5\xc5\x92\x9a\xe7\xae\x07\xab\x10\x5f\x50\xc2\x6b\xf6\xed\x17\xd8\xfb\x07\x88\xd9\x87\x5a\xe5\xf7\x9e\xaa\x9e\xa1\xc4\x4c\x87\x36\x60\xec\x36\x67\x1d\x5e\x51\x2a\xaf\xd9\x29\xd1\x90\xa6\xc4\xa1\x70\x42\x9a\x12\xa4\x29\x81\x68\x1e\xa2\x79\x88\xe6\x21\x9a\x47\x9a\x12\x88\x95\x21\x56\x86\x58\x19\x62\x65\x88\x95\xb7\xaf\x58\x19\x6a\x4a\xa8\x29\xbb\x54\x4d\xb9\x2d\xd3\x94\xa8\x94\x14\x78\x70\x86\xa6\x39\x1e\x3c\x4c\x87\x68\xd2\x17\x0f\xda\x9c\x29\x26\x39\x93\x99\x30\xba\xa6\x74\x25\x01\xe9\x45\xae\x5d\x0a\x46\x82\x7b\x59\x5c\x22\x41\xfb\x5a\xfc\xcb\x07\xf1\x4b\xa4\xc8\x07\x76\x7a\x22\xb2\xfb\xcc\x0c\x26\x76\x21\xa1\x21\xf1\x53\x1b\x81\x98\xe0\x57\x0b\x74\x92\xe6\xca\x5c\x33\xfb\x69\x6f\x03\x0f\x02\x5e\x19\xe8\xe1\x1a\xd4\xc3\xfd\x4d\x8f\x28\x27\x36\xce\xcb\x89\x19\xd6\x60\x92\x1a\x1b\x84\x74\x5a\x08\xe0\x66\x29\x61\x0b\xe0\x1a\x6e\x6c\x51\x78\xc0\xe7\x68\xc6\xe1\x01\x6f\xb8\xb5\xc6\x8d\x14\xcf\x4b\xd2\x2a\x23\x15\xfd\xfd\x11\x4f\x23\xb5\xcb\x33\xf5\x89\x69\xaf\x26\xc4\xd6\x0a\x7b\xe5\x95\x02\x65\x3b\xd5\x41\x03\xca\x05\xca\x05\xca\x05\xca\xed\x1e\x94\x8b\x69\x1b\xf2\x9f\x40\xa8\x8c\xfc\x27\x70\x29\xc0\xa5\x00\x97\x02\x5c\x0a\x70\x29\x20\x5e\x05\xf1\x2a\x88\x57\x41\xfe\x13\x78\xec\xe0\xb1\xbb\x35\xf2\x9f\xd4\x91\xaf\xa4\x55\x98\x79\x3b\xe6\x41\xf9\xd6\x10\x0d\x98\x75\x50\xf9\x50\x19\x33\xf1\x46\xbe\xb4\xa1\xe5\xd6\xd7\x54\x2b\xdf\xc9\x27\x86\xd8\x77\xfb\xed\x2a\xa9\x9f\xea\x91\x43\xcb\xf6\xbd\x2a\x79\x73\xea\x62\x4a\xe1\x97\xac\xc6\x2e\xf1\xc6\x62\x8e\xc9\xc1\x94\x35\xad\x18\xe4\x2d\x0d\xda\xd8\xd6\xc5\xe1\xb4\x82\x6a\x2d\xfd\xf5\x92\xaa\xa4\x47\xec\xf5\x0a\x5f\x93\xc9\xd9\xad\xb1\xe4\xb1\x17\x62\x83\x2e\xc4\xe0\x68\x3b\x16\x7d\x84\x9f\x4e\x14\x72\x2d\xbf\xc0\x0e\x17\xe3\x27\xaf\xfb\x27\x6d\x59\x12\xef\xdb\x02\x9d\xe4\xef\x1b\x2f\xdf\xd0\xc0\xfb\xc6\xbd\xea\x73\xc6\x82\x31\x38\xdc\xe4\x86\x08\x37\x39\x1f\xfc\x3e\x8d\xb1\x51\xf9\x3e\x45\x22\xf2\x3d\x2a\xef\x7a\x77\x50\x09\xa2\x0e\x10\x75\x90\x84\xab\x0a\xae\x2a\xb8\xaa\xe0\xaa\xea\x1a\x57\x55\xb2\x63\x3c\x31\x4d\xbf\x92\x86\x5d\x04\x49\xb8\x08\xe0\x22\x80\x8b\x00\x2e\x02\xb8\x08\xda\xef\x22\x48\x1e\xa5\xc3\xec\x50\x64\xd2\x62\x1a\xbb\x9c\xc1\xfd\xe5\x4b\xb8\xd6\xc7\xf4\x27\xbb\x9a\xa9\x26\xc1\x54\x5b\xc7\x54\x93\x1d\xcf\x54\xb7\x61\x14\x04\x7b\xd7\x10\x3d\xe9\x06\x8c\x45\xd5\x02\x5f\x86\x69\x2f\x6a\x86\x61\xd5\xd9\xef\x0d\xb2\xff\xe4\xc0\x8b\x6f\x93\x78\x31\x9b\x4f\x67\x37\xb2\xe9\x75\x25\xe7\x22\x8d\xd6\x84\xf3\xbc\xdd\xda\x8c\xd5\x5a\x53\x30\x63\x2c\xba\xcf\x01\x0a\x3d\xcf\xb3\x98\xd5\x4b\xf3\x5a\x71\x3a\x97\xb3\xa4\xc0\x9d\x9e\xce\x23\x79\xbd\xf9\xa0\x30\x10\xce\x3f\x13\x0c\x08\xf7\xb1\x89\x72\x40\xe8\xd9\xe5\x2e\x4a\x78\x6d\xb7\x37\x9a\xbc\x8b\x11\xbf\x63\x1e\xfa\x02\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\x08\x94\xd8\x66\x94\x08\x16\x08\x16\x08\x16\xd8\xc5\x2c\xf0\x07\x03\xf4\xb0\xc8\xc7\xab\x14\x0a\xfa\xd8\x46\x7c\x2c\xad\x16\x72\xda\x4d\xe3\x1b\xab\xb3\xaf\x0f\xb0\x2f\xf7\xd1\x1d\xc6\xa6\x2b\x1b\xf1\xd0\x50\xf5\x24\xbb\xb3\xd6\x91\xd1\x27\x8d\x3d\xa7\x0b\x05\xfd\x52\xdc\xfe\x75\xbb\x61\xb9\x17\x28\x21\xb0\xdc\x61\x3a\xc4\xb1\xdc\x5e\x8a\xd3\x98\x6f\x12\x06\xa3\x97\x44\x68\xbf\x79\xc3\x35\x65\x89\x69\x46\x95\x40\xfb\x94\x14\x94\x75\x06\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\x0d\xe8\xad\x5d\xe8\xed\x7b\xbd\x14\x12\xe8\xcd\xa3\xdc\xd7\x18\xfb\xf5\x5e\xf6\xc5\x5e\xba\xcb\xb9\x2d\x14\xca\xf0\x34\x10\xab\x5a\x71\xcd\xea\x4a\x25\xcc\x79\x50\xf4\xa1\x8c\x5a\x72\x16\x79\x9c\x5e\x5a\x38\x69\x6c\x68\x5e\x02\xcc\x8a\x86\xa6\x2a\x1a\x9a\xaa\xa5\xa1\x64\x96\xce\x0a\xb0\x76\x92\xe6\x38\x58\x3b\x4e\x47\xe9\x70\x03\x7a\x37\xf3\x1e\x83\x20\x1b\xfb\x91\x2b\x34\xe9\xdf\xd7\x1b\x71\xd7\xcf\xa2\x26\x9a\xf9\x4d\x64\xaf\x5e\x66\x5f\x1b\xa8\x2c\xc8\x39\x59\x1d\x86\xfa\xd7\xe3\xdc\x63\x1c\xd8\xee\x72\x9c\x28\x44\x06\x98\x88\x42\x64\x80\x89\x80\x89\x80\x89\x80\x89\x9b\x84\x89\x1d\x94\x9c\xb5\x63\x60\x22\xb2\x86\x02\x26\x02\x26\x02\x26\x02\x26\xa2\x10\x19\xd2\x1a\xde\x3a\xec\xaf\xe3\xd3\x1a\x6e\xcb\x42\x64\x25\x7a\x56\x10\xb0\xf3\xb4\xc4\x09\x58\x92\x4e\xd1\xbc\xaf\xb4\xcc\x05\xad\x36\xe2\x31\x5f\x5e\xd4\x94\xba\x64\xb9\x60\x45\xda\x02\x3b\x29\x55\x68\x1e\x3c\x4d\x8a\xd2\x7c\x2f\xd2\x15\x2f\x1a\xf9\x51\xaa\x64\x6b\x11\xb3\x54\x59\x15\x8c\x36\x2a\xf6\x69\x37\x48\x13\xdc\xeb\x8d\x74\x89\x2e\x94\x15\x30\x9b\xa5\xc4\xe6\x1f\x20\x0a\x63\xa0\x9e\x59\x83\xf5\xcc\x3e\xdc\x4b\x17\x85\x51\x39\x4b\x8b\xdc\xa8\xcc\x53\x53\xc6\x24\x3d\x27\xca\x9b\x2d\xd3\xd3\x76\x79\xb3\x66\xb5\xfd\x26\x51\xed\xec\x02\x9d\x77\x54\x3b\x6b\x56\xe3\x9b\x2d\x7e\x56\x9b\x25\xac\xc7\xdc\x55\xb1\x9a\xd1\x7f\x30\x5a\x69\x09\x63\x9e\xf5\xd0\xfc\xad\xe2\xa4\xd8\xbf\xcc\x2a\x5a\x07\xb7\xcb\x3e\xa2\x4c\x1a\x40\x33\x40\x33\x40\x33\x40\x33\xca\xa4\xa1\x4c\x1a\xca\xa4\xa1\x4c\x1a\x1c\x1e\x70\x78\xc0\xe1\x01\x87\x07\x1c\x1e\x4d\x71\x78\xa0\x4c\x1a\xca\xa4\xa1\x4c\x1a\xca\xa4\xc1\x9f\x08\x7f\xe2\x36\x2f\x93\xd6\x56\x77\x5b\x3d\x45\xd9\x9a\x5f\xda\xec\x07\x43\x74\x5c\xc8\xf0\xed\x12\x6e\x63\xb2\x56\x9b\x4c\x45\x6c\xd5\x58\x93\x45\xce\xf8\xdf\x2f\x8d\x65\x45\x85\x37\x55\x67\x9f\x1c\x62\x5f\xe8\x27\x66\x37\x70\x45\x36\x10\xd2\x6b\x4b\x4f\x2c\x8b\xc5\x35\x29\x21\xf1\x1e\x7e\xc0\x9c\x75\x35\x97\xc4\xc5\x58\x59\x4e\xd2\xf2\x74\x8b\xd9\x8e\x57\xf3\x6f\x49\x25\xb3\x5a\xd2\x05\xb7\xac\x3a\x20\xc2\x17\x10\xbe\x80\x5c\x28\xf0\x2a\xc1\xab\x04\xaf\x52\xf7\x78\x95\x90\x0b\x05\xb9\x50\x40\xf3\x41\xf3\x41\xf3\x41\xf3\x3b\x82\xe6\x6f\xc3\x2a\xed\xc8\xb6\x02\x42\x8a\x6c\x2b\xdb\x27\xe2\x82\xfd\x5e\x2f\xdd\x2b\xd0\xa3\xf0\x97\x8c\x6d\xc4\xc7\xd8\x6b\xbd\xec\xd5\x5e\xda\x29\x7e\xb9\xb2\x11\x0f\x3d\x94\x51\x4b\xee\x0f\xb7\xb8\x60\x9e\x5d\x45\xb8\x49\x2e\xc5\xa7\x97\x16\xcc\x35\x62\xf3\x72\x18\x37\x2f\xbb\x4a\xa1\x2e\x19\x78\xf5\xec\x2a\xe6\x7d\xd6\x12\x57\xc2\xfe\x6b\x2f\xbd\x41\x74\xb1\x9e\xba\xaa\xa6\xd7\x73\xc6\x94\xdb\x4c\x67\xf3\x85\x5e\xf6\x6b\xbd\x44\xf6\x96\xaa\xc9\x6c\x1e\xcc\xa8\xa5\x65\x6b\x57\xa4\xb2\x71\xf4\xf2\x27\x86\xe9\x69\xd1\xcb\xc5\x15\x25\x15\x33\x77\xe0\x97\x69\x27\xb4\xa9\x01\xa9\x17\xb5\x9c\xba\x92\xcd\xa7\xb3\xf9\x8c\xce\x7e\x77\x88\xfd\x59\x3f\x3d\x6c\x34\x39\xed\x6c\xd1\x82\xeb\x37\x6a\xac\xfd\xa7\xe5\xd4\x84\x68\xb4\x49\x80\xfd\x00\x3f\xe0\x7c\xf9\x85\x55\x70\x76\xc7\x99\xb7\x07\x6b\x6f\x7f\xcd\xbf\x6c\x30\x46\x9f\x67\xb3\x12\xa3\xfb\x8e\x2e\xb3\x14\xa0\xdd\xdf\x95\x64\x1d\x55\x00\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\x81\xdf\xbb\x0c\xbf\x7f\xf2\x01\xda\x67\x3c\xba\xb1\x8d\xb8\x1f\x8f\x34\x5e\xb8\xac\xf5\xe3\x4b\x63\x85\xa2\xf6\xe2\x4d\xf6\xd7\xf7\xb3\x9f\xed\xa5\x3b\x52\x5a\x51\xe5\x25\x08\x53\x5a\x3e\x6f\xd8\xa6\x93\x73\x17\x6c\x2c\x54\xd2\xc2\x7c\x6f\xe3\xe2\x97\x45\x33\xd1\x01\xb9\xe7\x8c\x56\x54\x2f\xc5\x4f\xaa\x25\x1b\x15\xca\x5d\x96\x8c\x43\x26\xfa\xa2\x63\x51\x81\xe4\x26\x69\x97\x40\x72\x0f\xd2\xfd\x1c\xc9\xbd\x8e\xee\xfc\x78\xcf\x0e\x92\x63\x23\x10\xaf\x3d\xe1\xcd\xbc\x88\xed\x90\x97\x42\xd7\x2e\x06\x13\xb8\x09\x36\x2e\x09\x5c\x24\x22\x51\x9b\xf3\x7a\x65\x2e\x0c\x97\xa8\x3b\xe4\xd9\x43\x4b\x17\xeb\xea\xa1\xa5\xf5\x6d\xd4\x43\x1e\x29\x55\xaa\xf6\x56\xe4\xe7\x1c\x3d\x34\x6c\xf5\xd0\xb9\xe5\x80\x2e\x1a\x74\x77\x91\xa6\xb7\xbe\x8f\x5a\x33\x44\x6a\xe8\xfa\xe8\xbf\x74\xf4\xd1\x1e\xb3\x8f\x66\xe7\x16\xe7\x2e\xcc\x55\xef\xa5\x61\x57\x2f\x89\x9c\x2d\xdb\x67\x2c\xd5\xdb\x95\x13\xbf\xe0\xe8\xa7\x11\xb3\x9f\xce\x2d\x5d\x58\x38\x77\x76\xb9\x7a\x47\x45\x5d\x1d\x25\x1b\xbf\x75\x7b\x6a\xca\xf3\xad\x3b\x35\x37\x3d\x5b\xcf\x5b\x77\x4a\x55\xd2\xb7\xee\x5b\x97\xf8\x79\x47\x1f\x45\x2d\xcb\x34\x7d\x61\xe6\x54\xf5\x4e\x1a\x72\x9b\x26\xe3\x8b\xdb\x21\xbd\x54\x5b\xdf\xd8\x7d\x59\x43\x2f\x25\x4f\xd0\x31\x76\x24\x32\x65\x2d\x51\x1e\xe7\x6b\x13\x39\xb9\xf2\x38\x55\xa4\xdf\xd8\xc1\xb9\x04\x69\xfd\x22\xe7\x2b\xbd\xf4\x1f\x7a\xd9\xaf\xf7\x86\xbe\x68\xcd\xca\x5f\xe9\x5d\x52\x4a\x62\x95\x7f\x55\x0d\x17\x94\x22\xe7\x34\x17\xcf\x2f\xca\xa5\xa9\x5c\x12\x87\xe5\xdc\x27\xac\xe6\xd3\x05\x2d\x9b\x2f\xe9\xc6\x25\xac\xae\x66\x5f\x54\x75\x31\x03\x73\xb8\x10\x8c\x99\xac\xae\x5a\x53\xd1\xd4\x7a\xb1\x68\xac\x0a\xc5\x00\x31\x17\x31\x25\xcd\x6c\x33\x16\x9e\xd7\x8a\x61\xf5\x45\x65\xad\x90\x93\xfc\xfa\xc6\x55\x2d\x67\x11\x24\xe3\x6a\xf8\x54\xbf\x54\x2a\x4c\x8d\x8d\xe5\xb4\x94\x92\xbb\xaa\xe9\x25\x8f\xd9\x9a\xf1\x88\x46\xf5\x9b\x7a\x49\x5d\xb3\x67\x6b\x6a\x4e\xd1\x4b\xd9\x94\xae\x2a\xc5\xd4\xd5\xd1\x9c\x96\xc9\x64\xf3\x99\xb1\x2b\xe2\xff\xc7\xdf\x72\x74\x5d\x57\x8b\x53\xd7\xb3\x6b\xa9\xab\x37\x63\x61\xb3\x37\xbc\x37\x47\xf8\x93\x71\x06\x8c\x7d\x73\x90\x1e\x15\xce\xee\x15\xee\xca\xde\x30\x7d\xda\xa9\xa2\x96\xbf\xa6\xad\xe8\xec\x57\x07\xd9\x47\xfa\x69\x07\xdf\x6c\xbc\x42\x35\x06\x81\xcd\x14\xb5\x7c\x52\x5b\x69\x92\x8f\x5a\x1c\x90\x30\xfe\xb9\x14\x97\x4d\x2f\x66\xf5\x6d\x57\xf1\x7a\x2b\x9c\xd2\x35\x05\x80\x2d\x06\x1b\x9e\x61\x36\x28\x4d\x0a\x1f\x0b\x66\x54\xa4\x78\x18\x2e\xcb\x03\xbf\x33\xfc\xce\xf0\x3b\xc3\xef\x0c\xbf\x33\xfc\xce\xf0\x3b\xc3\xef\x0c\xbf\x33\xfc\xce\xf0\x3b\xc3\xef\x0c\xbf\x33\x4a\x60\xc3\x2b\x0c\xaf\x30\xbc\xc2\xed\xf2\x0a\x7f\xb5\x97\x1e\x90\xf9\xa0\x38\x5a\xb1\xa2\x85\x3e\xd3\xcb\x3e\xdd\x4b\xb7\x8b\x5f\xab\x46\x0a\xdd\x97\x51\x4b\x1c\x34\xa1\xe0\xb5\x33\x4a\xe8\x1d\x43\x34\x14\x90\x69\xcb\x4e\xa9\xf5\x9f\x07\xd9\x6f\x74\x50\x4a\xad\xb8\x77\x4a\x2d\x47\x22\x2d\x70\xd5\x26\x71\x55\x24\xd6\x02\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\x05\x61\xdd\xee\x84\xf5\x32\xcd\x07\x67\x0b\xaa\x29\x45\xd0\x8f\x5f\x66\x9f\x18\xa0\x07\xbc\x52\x04\x85\x86\xc5\x0c\xb2\x28\xbf\x7d\xa6\x71\xd4\x56\xc3\xd7\xb3\xf9\xb4\x33\x57\x4c\x74\xc4\xd8\xd5\x23\x9d\x8f\x67\x26\x9f\x0e\x07\x7b\x09\x70\x2e\x70\x2e\x94\x25\x06\xe7\x02\xe7\x02\xe7\xea\x1e\xce\xd5\x41\x55\x77\x3b\x86\x73\xa1\x1c\x2c\x38\x17\x38\x17\x38\x17\x38\xd7\x56\x94\x83\xed\x6a\x2c\x85\x7a\x95\xdd\x5c\xaf\x32\xb1\x0d\xb1\x54\xf2\x32\xcd\x08\x41\xd4\x11\x9a\xe2\x82\xa8\x7d\x34\x41\xe3\x7e\x82\xa8\x18\x67\x57\x1b\xf1\x58\x59\x8e\xe7\x40\x0d\x54\x3a\x58\xde\x34\xcd\x8e\x7b\x44\xa5\xd7\x93\xfc\xf8\xda\x63\xde\x4a\xab\x3b\xd8\x6d\x5c\x64\x15\xf9\xd9\x9d\x3e\xd4\xec\x01\xf1\x5d\x0a\x2b\x2e\x40\x16\x13\xbf\xb6\x1d\x91\x09\xa2\x95\xa0\x13\x74\x8c\xf5\xaf\x68\xe9\x9b\x21\xfe\x6f\xb8\x27\x1a\xa3\x91\x7a\x1e\x4d\xe2\x7d\xbd\xf4\xcf\x7a\xd9\x7b\x7a\x43\x3f\x65\xd9\xa3\x1f\xf4\x3c\x63\x7c\xed\xe5\x07\x60\x84\x2b\x0a\x79\x11\x53\x61\x40\x5c\x8b\x0e\x27\x88\x12\x65\xa5\xf9\x27\x32\x1d\x0b\x4f\xe7\xc3\xd9\xbc\x58\xee\x6b\xc5\xf0\x7a\xde\x22\x06\xe9\x70\xba\x78\xf3\xfc\x7a\x3e\x9c\xce\x16\x55\xe3\xad\x51\xad\x65\xa8\xf1\x35\xe1\x9f\x6b\xb9\x0e\x37\x67\xdd\x72\xe5\x13\x5e\x5d\x2f\xf2\x99\x5d\xa1\xa8\xa5\x54\x9d\x7f\x57\xe5\x4b\x2a\xbf\x00\xb1\xf0\x25\x7e\x46\x67\x1d\xe8\xd1\xf0\x74\x2e\x37\x25\xca\x2c\x17\x6f\x86\x8b\xeb\x79\x63\x45\x66\xbc\x66\x56\x31\x6c\xd1\x9c\x9a\x8e\xdc\x2e\x2e\xcd\x69\x53\x7e\xba\x97\xfe\x71\x2f\x7b\x77\x6f\xe8\xef\x5b\x1d\xf4\x47\x3d\x7c\xa2\x75\x46\xc9\x2b\x19\xb5\x28\x96\x0c\x22\x35\x81\xae\x6b\xa9\x2c\xff\x0a\x5a\x93\x73\x85\xaf\x6e\xb4\x62\xd8\x98\x24\x95\x6e\x5a\xd3\x82\x35\xe5\xba\x71\xfd\xa5\xab\xaa\xae\x9a\x2f\xbe\x28\xa6\x2d\xa6\xfb\x9c\x1c\xac\xa8\x61\x6e\x72\xf8\x44\x5c\x2b\x86\xe3\x13\x07\x8d\x7d\x8b\x4a\x8a\xf3\x1d\x63\x0d\x2b\x5e\x73\x3e\x59\x36\xe6\x35\x4a\x36\x2f\x9c\x42\x7c\x32\x6a\xef\xcb\xd7\xbc\x92\x3e\x19\x4b\x28\xd3\x74\x67\xb4\x9c\x92\xcf\xc4\xb4\x62\x66\xac\x70\x3d\x33\xb6\x9e\xcf\xa6\xb4\xb4\x3a\xb6\x7b\x41\x5f\x32\x5a\x89\x45\xee\x72\xde\xab\xd3\x07\xf0\x9d\x1e\x9a\x35\x0c\x43\x9c\x17\xdd\xbd\x63\x46\xcc\xdb\xd8\x38\xd5\x39\x04\x69\xce\x68\x65\x82\x1d\xa3\x23\xb4\x43\xd4\xf2\x6e\xa8\x19\xdf\x7a\xa8\xc7\x85\xf9\x3a\x48\x07\xb8\xf9\xaa\xbb\x65\xd3\x42\xf9\xdb\x8e\x82\xa6\x97\xa8\x46\x0b\x56\x35\x23\x7b\xb0\x4d\x8b\xfe\xef\x11\x1f\x0b\x65\x16\x28\x77\x54\x7b\x77\x27\xf9\x8f\x1e\x14\x7b\x78\x58\xab\x19\xeb\x98\x76\xd8\xad\x0b\x74\x9e\x96\x9c\x76\x2b\x9a\xa0\x13\x0d\x28\x6c\x45\xf6\x22\x99\x45\x04\x68\x17\x68\x17\x68\x17\x68\xb7\x8b\xd0\x2e\xe6\x6e\x01\x73\xb7\xce\x61\xdf\xbf\xdf\x4b\xff\xa5\x97\x7d\xab\x37\xf4\x0d\xeb\x51\xfd\x52\xef\x05\xe7\x6a\x33\x9b\x0f\xeb\x62\xc5\x18\x5e\x51\x57\x85\xa3\xd8\xa2\x32\xf6\x27\x4b\xbe\x25\xbc\xb3\x1c\xb3\xc4\xbc\x96\x1f\xcd\xab\x19\x85\x3f\x12\xb9\xe0\x74\xce\x26\x05\x9f\xb5\x06\x83\x9c\x2a\x64\xd7\xd6\xd4\xb4\x31\x5f\xcd\xdd\xb4\x3d\xb8\xb6\x69\xcf\xe6\x46\xe4\x3a\x94\xdf\x6e\x38\x53\x54\x52\x7c\x9c\x64\xb5\xb4\xf5\xe1\xb1\x3f\x0e\xdc\x39\x6e\x3e\x97\x75\xdd\xb8\x48\x67\x47\x29\xc6\x91\xe6\x0d\xc9\x93\xac\x8a\xf7\xcd\x6c\x22\x26\xae\x73\x4d\x55\xf2\x9e\xd7\x18\x61\xfc\x12\x96\xf8\x15\x78\xad\xaf\xe1\x62\x80\x8b\x01\x2e\x06\xb8\x18\xe0\x62\xe8\x6a\x17\xc3\x6f\xf5\xd2\x97\x7b\xd9\x6b\xbd\xa1\x57\xad\xaf\xed\xfb\x7b\x67\x1d\xf1\xae\x85\x9c\xaa\xe8\xaa\xf5\xea\x2f\x15\xb5\x82\x92\xe1\xdf\x61\x51\x38\xd2\x25\x30\x32\x1f\xb7\x1d\x30\x6b\x3c\xf0\x78\x6c\x32\x16\x5e\x16\x76\x44\x7c\x24\x0b\x6a\xde\x18\xa6\xf6\x57\x44\x0d\x6b\xc5\xc2\x55\x25\x6f\x0a\x9e\x8a\xeb\xea\xd8\xaa\x92\x33\x67\xff\x11\xb1\x35\x12\x5e\xcd\xe6\x95\x5c\xf6\xef\x98\xe6\x7b\x45\x0d\x2b\x69\xce\xeb\xb5\x31\x81\x6f\xd3\xf6\xd4\x52\x34\x3e\xa8\xdb\x07\x89\xf9\x76\x2c\x3c\x97\xe5\x26\xc9\x71\xe1\x5a\xb1\xf2\xce\x6c\x1f\x49\x49\x4c\xf7\xf9\xec\x4f\x2b\x5d\x8d\x45\xee\x15\xd7\x33\x6b\xde\x88\x5b\x39\xf5\xce\x7e\x7a\x47\x3f\x7b\x7b\x7f\xe8\x6f\x2d\xf9\xdc\x57\xfb\x9e\x91\x76\xd0\x18\xa2\x57\xb5\x1b\xe1\x8c\x52\x5c\x51\x32\x2e\x06\x61\x4d\xd4\xd4\xe2\xaa\x56\x5c\x33\xfa\xc2\xf3\x4a\xcf\x95\x9d\xdc\xff\x42\xf9\xb4\xc6\x9c\x93\x88\x7a\xa0\xc6\x88\x48\xab\xa9\x6c\xda\x9e\x58\xf3\x6f\x23\x5f\xe6\x58\xbd\xab\xf3\xd0\x74\xbe\xd5\xfc\xfa\xc5\x1c\xdd\x68\xda\x4d\xcb\x31\x61\x89\xe6\xdc\x27\x8b\x85\x05\xa5\xe2\xb6\xd8\x39\x5b\x1d\x14\xf7\x30\x68\xac\x79\xf8\x5f\xee\x81\xa1\x1f\x0e\x0f\x26\x94\xd4\xf5\x4c\x51\x5b\xcf\xa7\x8d\xbd\xb8\x5a\x8d\xef\x54\xd6\x71\x62\xb2\x22\x67\x40\xee\x46\xcc\x3b\x58\xb1\x5a\x3a\x1c\x1e\x9c\xd7\x8a\xaa\xa3\xd9\x70\x4a\xd1\x53\x4a\xda\xb8\x7b\xd9\x3f\x42\x9f\xc8\xdb\xd3\xc5\x74\xba\xa2\xc1\x55\xab\x8d\x58\xe4\xbe\x42\xf9\xb8\x71\xce\x6d\xe0\xc1\x83\x07\xaf\x4b\x3d\x78\xc9\x0c\x2d\x0a\x9c\x3c\x47\x33\x1c\x27\x1f\xa5\xc3\x74\xa8\x01\x78\xb9\x5c\x52\x4a\xeb\x7a\xa0\x5b\x2c\xea\x0d\x9d\xef\x67\xf7\x89\xb7\xd9\xb6\xb4\xb5\x02\xe8\xcd\xd5\x0c\xa5\x6d\x58\x81\x86\xbd\x77\x88\xf6\xd7\xa0\xac\x97\xe9\x8a\x73\xeb\x7a\x49\x2d\x16\xb5\x9c\xaa\xb3\x6f\x0f\xb2\xdf\xe9\xf7\x01\xee\x35\x96\xd9\x9d\x11\xed\x19\xfd\xd9\xd4\x14\xc6\x5e\x18\xdf\x3e\x15\xea\xea\x6e\x22\xd5\x46\xcb\x7c\xd1\x8e\x07\x84\xc4\x1b\x08\x48\x40\xe2\x0d\x78\xad\xe0\xb5\x82\xd7\xaa\x9b\xbc\x56\x48\xbc\x81\xc4\x1b\xf0\x16\xc0\x5b\x00\x6f\x01\xbc\x05\x1d\xe1\x2d\x40\xe2\x0d\x24\xde\xd8\x2e\x7c\x14\x89\x37\x5a\x91\x78\xe3\x0f\x87\x28\x6c\x96\x50\x33\x55\x50\xf9\xd2\x86\x96\x5b\x5f\xb3\x4a\xdc\xb2\x7f\x3f\xc4\xfe\xbb\xa3\xfc\xdf\xee\xa2\xaa\xa4\xcb\xd6\x99\x4b\xd6\xb1\x97\xf8\xb1\xd1\x90\xb1\x93\x2c\xfa\x57\xb6\xad\xb9\x92\xda\xe4\x15\xa1\xc5\x1e\xe7\x38\xba\xf7\xdc\x69\xb6\x9f\xf6\x52\xdc\x57\xe5\x6c\xdc\x45\x6c\x23\x1e\x2b\xbf\xaa\x40\x7c\xf6\xa8\x37\x3e\xbb\x9d\xf5\x67\xd4\x12\x5d\x3b\x1f\x0c\xce\xc6\xd8\x68\x79\x69\xc6\x8a\xab\x70\x15\xcc\x7d\x75\x87\xdd\xeb\x03\x45\xb5\x90\x53\x52\x6a\x50\xc7\x3f\x2a\xf7\x6b\x47\xdf\x27\x4e\xd2\x1c\xcd\x94\x85\x61\x34\xd2\xf9\xd0\xf3\x21\x16\xa3\xc1\x58\x8c\x5f\xec\x69\xd2\xfb\xbf\x20\x22\x3a\x12\x74\xc2\x8e\xe8\x68\x91\x29\x69\x81\xad\xa8\x62\x9e\x0a\xeb\x25\x8a\xfe\xe0\x1e\xdb\x94\x3c\x2c\xbd\xeb\x4a\xa5\xf5\xd8\x25\x36\xb5\xc5\x78\xb4\x26\x16\x02\x96\x24\xc0\x92\x40\x8f\xdb\x16\x3d\x2e\x84\x58\x10\x62\x41\x88\xd5\x2a\x21\x56\xf2\x5f\x35\xeb\xb3\x9f\x14\x21\x98\x33\x34\xed\x08\xc1\xdc\x46\xdf\xfd\xb0\xf7\x77\x7f\x27\xbb\x43\x74\x35\x25\xfe\xe2\x4e\xfb\xd3\x3f\x56\x50\x8a\xa5\x2c\xf7\xe9\x89\x85\x64\xd0\x72\xe2\x91\x82\xb1\x66\x6c\xf5\x7c\xe0\x91\xf2\x86\x46\xf9\x69\xf7\xf0\x6a\x36\xbb\x9c\x1b\xd7\xd4\x62\x46\x75\x6e\x1d\x70\x6e\xd5\x4b\x45\xa5\xa4\x66\xb2\xa9\xd1\x8a\xfd\x5c\xad\x18\x7f\xdf\x94\x5b\x8d\xab\x4c\x9c\xa5\x45\x4a\x96\x2d\x64\xa6\xe8\x60\x03\xb3\x11\x5e\xe2\x1e\xb3\x90\xa0\x59\xc8\x47\xfb\xe8\x95\x3e\xf6\xe1\xbe\xd0\x07\x2d\x53\xfe\x72\x5f\xf7\xac\x67\xca\x7c\x04\x46\x3f\x73\x9f\x37\xf7\x63\x19\x83\xd3\x56\xbe\x0c\xf9\x0c\xdc\x61\xfe\x45\x12\x12\x09\x25\xc7\x8f\x34\xa6\x5e\xe2\x68\xbe\x07\x9f\x06\xe9\xe1\xa1\xa4\xae\xe5\x97\x84\x04\xe4\x8c\xf1\x5a\xc8\xbf\x97\xcd\x97\xc5\xfe\x71\xd8\x7f\xa1\x95\xf8\x72\x0f\xbd\xd6\xc3\x5e\xed\x09\x7d\xde\xc2\x5b\x1f\xea\x99\xd7\x8a\x29\x3e\x43\xcb\x68\xbc\xdb\xb5\x70\x64\xd5\xf8\x29\x12\x9e\x76\xdd\x05\x07\x97\x62\x32\xb5\xae\xdb\xce\xee\x51\x25\xc5\x6f\x9c\x4b\x08\x72\xd9\x94\xfc\x58\xaa\xb9\xb4\x1e\xd6\x6e\xc8\x3e\x15\x2e\xf6\x82\xaa\x15\x72\x6a\x2c\x2c\xce\xc8\x35\x3b\xe6\xb3\xe4\x00\xd1\xb3\x03\xac\xd3\x47\x6e\xe3\x97\xe5\xd2\x9f\xb4\x0b\x1c\x3d\xee\x6d\xa1\x77\xb0\xdb\xf9\x45\xb6\x04\x1d\x25\x8f\xd2\x61\x76\x28\x32\x69\x49\x15\x77\xf1\x37\x49\xbe\xd6\xe5\x87\x46\xfa\x8d\xad\x2d\xd5\x21\x7e\x61\x98\x8e\x08\x1d\xa2\x52\x28\xe8\xb6\xe4\xd0\x27\xa5\x6f\x5a\x51\xd7\x0c\x13\x55\xb2\x20\xe4\x3b\x86\xd9\xff\xd3\x4f\x77\x18\x47\x1b\x1f\xb2\x8f\xf5\x48\xcc\xeb\xd0\x1d\xe6\xcd\x29\xbd\x99\xd0\x77\x96\xb7\xb2\xac\x96\x9a\xa2\x3e\x1c\xb1\xdd\xa4\x7c\x0d\x21\x9d\x6a\xd9\x92\xba\x66\xdb\xa5\x41\x97\xcb\xdd\xd1\x76\x2c\xfa\x18\x3f\xdd\x74\xa1\xa0\x3b\x73\xa4\x58\xd7\xd8\xf9\x92\x45\xdf\x34\x13\x4d\xd7\x32\x9a\xaf\xce\x99\xe0\x37\x23\xca\x86\xe4\x9b\x61\x0c\x0d\xf9\x6e\x58\x9d\xea\x9e\x2b\xf9\xbf\x89\xfc\x3e\xa1\x4b\x84\x2e\x11\xba\x44\xe8\x12\xa1\x4b\x84\x2e\x11\xba\x44\xe8\x12\xa1\x4b\x84\x2e\x11\xba\x44\xe8\x12\xa1\x4b\x6c\xb7\x2e\xf1\x00\xed\x63\x13\x91\x71\x8b\x5e\x3c\xe8\xa4\x17\xd6\xe2\xae\x12\x5b\x6c\xbf\x00\x4d\x28\x26\xa1\x98\x84\x62\x72\x1b\x29\x26\xbf\x39\x6c\x96\x2a\x13\xd0\xc7\x0e\xa2\xe6\x45\xe5\xab\x63\x4d\x71\x88\x89\x34\xff\xd1\x30\xfb\xb3\x7e\xba\x5b\xfc\x78\x45\x36\x10\x7a\xa5\x16\xb2\xc9\x29\x59\x47\x50\xcd\x27\x6e\x58\xd4\x4e\xbf\x24\x6e\xc1\x86\x9b\xfc\xe7\xce\x07\x9b\xed\x8f\xc5\x7e\x26\x18\x6c\xee\x63\x13\x12\x6c\xba\x06\x9a\x24\x9c\xe2\x34\x0e\xba\xc9\x7b\x1e\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\x13\x88\xb3\xe3\x10\xe7\x04\x8d\xb3\x58\x64\xc4\x42\x95\xf7\x39\x11\x27\x5f\xdd\x01\x6f\x02\x6f\x02\x6f\x02\x6f\xb6\x15\x6f\xfe\xfa\xf3\xb4\x5b\xe0\xcd\xbc\x96\x56\x1d\x19\x22\x8b\xeb\x79\xe3\x56\x53\x39\x45\xd7\x55\x9d\x7d\xe0\x79\xf6\x8e\x01\xba\xc3\xd8\xe9\xca\x46\x3c\x14\x15\xf3\xd4\xa2\xfc\xc2\x9a\x26\xd8\xc4\x95\xe7\xc5\xc1\x33\xc6\xc1\xd1\xd7\x1b\xfb\x9e\xd5\xd2\xea\xa5\xb8\xf3\xf7\x0e\xc7\x84\x09\x80\x33\x80\x33\x54\xda\x02\x38\x03\x38\x03\x38\xeb\x1e\x70\xd6\x41\x85\xa4\x3a\x06\x9c\xa1\xc2\x11\xc0\x19\xc0\x19\xc0\x19\xc0\xd9\x56\x54\x38\xea\x6a\xa2\x84\x12\x2c\xdd\x5c\x82\x25\xb1\x0d\x89\x52\xbd\x61\xd6\x1c\x3b\x6d\xc4\x63\x4e\x34\xb4\x98\xd5\x83\x25\x55\xfe\x35\xca\x45\x65\x8b\xba\x24\x57\x0e\xf8\x65\x16\x85\x71\x5c\x8f\x2b\xaa\x34\xf2\x97\x3b\x6c\x0e\xf6\xa0\xf8\xfc\x84\x15\x37\xf2\x7a\x83\xf8\xb9\x85\xd0\x4b\x30\xaa\x19\x9a\xa6\xe3\x65\x69\x2c\xc6\x68\xb4\xae\xce\x46\xee\x0a\xe4\xe2\x6b\x30\x17\xdf\x1f\xf5\xd0\x9c\xc8\xa2\x77\x8c\x8e\xd8\x59\xf4\xe2\x54\xef\x18\xa4\x79\x91\x95\xe7\x38\x1d\x75\x64\xe5\x69\xa0\x1d\xdf\x90\xf5\x13\xc2\x26\x1d\xa2\x49\x6e\x93\xea\x6f\x3a\xd8\xec\x14\xb4\x56\x9a\x9d\xe8\x6f\x8e\xd8\x66\xe7\x09\x99\xa6\xc9\x91\xf3\x4a\x5b\x75\x9b\xa0\x88\xd8\x45\x98\xa0\x19\x6b\xbf\x16\x1a\xa3\xd6\xe4\xf7\x03\x81\x05\x81\x05\x81\x05\x81\xed\x1e\x02\x8b\xf9\x58\xc0\x7c\xac\x73\x10\x35\x72\xab\xb6\x25\xb7\x2a\x3c\x01\xf0\x04\xc0\x13\x00\x4f\x00\x3c\x01\x5d\xed\x09\x40\x8a\x6d\xa4\xd8\x46\x8a\xed\x56\xa5\xd8\x86\xa3\x0d\x8e\xb6\x6e\x75\xb4\x25\x33\xb4\x28\x00\xf1\x1c\xcd\x70\x40\x7c\x94\x0e\xd3\xa1\x06\xe0\xe5\x72\x49\x29\xad\xfb\x73\xe8\xfa\xf2\x01\x04\x20\x61\x0f\x88\x7c\x2d\xea\x8d\xa7\xef\x67\xf7\x09\x33\x61\x9b\x70\x6a\x7e\xd2\xdf\x5f\x92\x62\xf2\xb1\x8d\xb8\x5f\x46\x8c\x82\x96\xd6\xd9\xbb\x9e\x67\xdf\x7e\xca\x4e\x52\xff\x44\x75\x31\xf9\x92\x96\x8e\x3e\x64\xec\x22\xb2\xd2\xdb\xd9\x26\x96\xb4\x34\x44\xe4\x10\x91\x43\x44\x0e\x17\x06\x5c\x18\x70\x61\xc0\x85\xd1\x31\x2e\x8c\xce\x21\xf4\x40\xc7\x40\xc7\x40\xc7\x40\xc7\x40\xc7\x5d\x8d\x8e\xc1\xb6\xc0\xb6\xba\x94\x6d\x6d\x4b\x11\xf9\x25\x7f\x25\xe7\x61\x01\xea\xf6\xd1\x04\x07\x75\x23\x14\xa5\xa1\xe0\x22\x5e\x5a\x7a\x31\xab\x97\x6a\xd5\x8e\xcf\x05\xe3\xb9\x08\x0b\x57\x54\xe8\xd2\xd2\x6e\xa5\xf8\x2f\x3b\xea\xb9\xdf\x65\x29\xc5\x97\xb4\x74\xf4\x61\xf1\xbf\x56\x12\x2d\x01\xa0\xa6\xe8\x20\x1d\x28\x53\x88\x0f\xd0\x93\xb5\x74\x18\x84\x48\x10\x86\x37\x28\x0c\xff\xcd\x1e\xff\xf7\x77\x52\xbc\xbf\xe3\x14\xe3\xef\xef\x10\xd5\x38\x1c\xe9\x88\x90\x9a\xef\xa7\xbd\xb6\xd4\xbc\xf6\xa3\x8f\x0a\x85\xf9\x01\xda\xe7\x50\x98\xd7\x7c\xb8\x69\x38\x6a\x33\x0c\xde\xe6\xc0\x36\x17\x41\x22\xf2\xe8\xbf\x1e\xb1\x0d\xc7\x1b\x3c\xb5\xde\x86\x11\xd9\xed\x2c\xde\x6e\x4b\xbc\x5b\x69\x4e\xa0\xf1\x06\x20\x05\x20\x05\x20\x05\x20\x85\xc6\x1b\x1a\x6f\x68\xbc\xa1\xf1\x06\xa8\x07\xa8\x07\xa8\x07\xa8\x07\xa8\x87\xc6\x1b\x1a\x6f\x68\xbc\xa1\xf1\x86\x1f\x0c\x7e\xb0\x0e\xf4\x83\xb5\x5d\xe3\x5d\x87\x14\xbb\x49\x0e\xa7\x6d\x58\x30\x80\x7d\xeb\x79\x1a\x08\xd0\x8c\xeb\x6a\xaa\xa8\x96\x74\xf6\x89\xe7\xd9\x9f\x3a\x64\xe3\x4f\x56\x97\x8d\x2f\xf3\xa3\xa2\x21\x2f\xe5\xb8\xd8\x06\xf1\x38\xc4\xe3\x10\x8f\xc3\x37\x02\xdf\x08\x7c\x23\xf0\x8d\x74\x8c\x6f\xa4\x73\xd0\x3f\x98\x34\x98\x34\x98\x34\x98\x34\x98\x74\x57\x33\x69\x40\x33\x40\xb3\x2e\x85\x66\xdb\x52\x3c\xfe\x2c\x1d\x13\xa0\x6f\x92\xf6\x73\xd0\x37\x46\xa3\xb4\x27\x50\xe6\x29\xa0\x50\x53\x72\x8f\x9f\x0a\xc6\x79\x4f\xb1\xdd\xe5\x38\x4f\x5c\x80\x5b\x42\xfe\x9a\x43\x42\x7e\x8f\x25\x21\x97\x6c\x6b\x97\xb7\x8a\xbc\xc9\x74\x4b\xc0\x28\x0e\x4b\xcb\x84\xe4\xc3\x34\x58\x63\xaf\x42\xf0\x04\x2d\x79\x83\x5a\xf2\xff\xdc\x43\x53\xe2\x75\xde\x4b\x71\xfe\x3a\xef\xa1\xda\x07\x1e\x1d\x17\xaa\xf1\x83\x74\xc0\x56\x8d\xd7\xd5\xc0\x09\x21\x1c\x3f\x44\x93\x0e\xe1\x78\x5d\x2d\x34\x6e\x4d\x44\x4a\xf1\xda\xac\x89\xb7\xd4\xdc\x65\x59\xa2\x9f\x71\xe8\xca\x1f\xf1\xd4\x95\x4b\xcb\x32\x10\x24\x2d\x6f\x89\x8d\x81\xba\x1c\x04\x15\x04\x15\x04\x15\x04\x15\xea\x72\xa8\xcb\xa1\x2e\x87\xba\x1c\x24\x1f\x24\x1f\x24\x1f\x24\x1f\x24\x1f\xea\x72\xa8\xcb\xa1\x2e\x87\xba\x1c\x8e\x32\x38\xca\x3a\xd0\x51\xd6\xd1\xea\xf2\xa6\xb9\xa3\xb6\xa3\xc0\xfc\xdf\x0f\xd3\xac\x31\x3e\xf5\xb1\x94\x5a\x94\x3e\x45\x55\x97\x09\xd3\xc7\x36\xe2\x62\xc4\xb8\x36\x66\x33\xf9\x6c\x3e\x63\x4e\xd0\x84\x16\xfd\x25\xf6\x83\x21\xf6\x2f\x6e\xa3\x7b\x9c\x3b\x5e\xd9\x88\x87\x3e\xdb\x23\x87\x9c\xed\x0a\x55\xf2\xe6\x94\xc6\x14\xa3\xcf\xd8\x07\x2d\x8b\xd6\xcf\x9b\x70\x23\xed\x98\x7e\x98\xf3\x8e\x41\xde\xe4\xa0\xcd\x75\x5d\xa0\x4e\x2b\xa8\x16\x1b\xd0\x4b\xaa\x92\x1e\xb1\x17\x34\x7c\xd1\x26\xa7\xbf\xc6\x9a\xc8\x5e\xa9\x0d\xba\x18\x84\xa3\xed\x58\x74\x84\x9f\xce\x71\x8d\xfa\xa5\xb8\xef\x15\x77\xb8\x6a\x3e\x79\x9d\x96\xc4\x8b\xb8\x40\x27\xf9\x8b\x38\x4d\xc7\xe9\x68\x03\x2f\x22\xf7\x72\xcf\x19\x2b\xc9\xc0\x97\xf1\x71\xef\x97\x71\x07\xbb\x9d\x5f\x18\x5d\xcb\x05\xbf\x81\x0b\xec\xa4\x7c\x03\x3d\xc6\xa9\x7c\x25\x7d\x1f\x8a\xfb\x2d\x45\xe0\x00\x02\x07\x92\x70\x7b\xc1\xed\x05\xb7\x17\xdc\x5e\x5d\xe3\xf6\x4a\x76\x8c\x57\xa7\xe9\x57\xd2\xb0\xbb\x21\x09\x77\x03\xdc\x0d\x70\x37\xc0\xdd\x00\x77\x43\xfb\xdd\x0d\xc9\x79\x9a\x65\x89\xc8\x09\x8b\x96\x3c\xc5\x31\x89\xbc\x0a\xdf\xb5\x5c\xa4\xdf\xd8\xad\x95\x4c\x24\xd9\xd5\xa0\x36\x09\x50\xdb\x3a\x50\x9b\xec\x78\x50\xbb\x0d\x23\x1a\xd8\x9f\xf5\xd2\x83\x82\x61\x0a\xb7\xcd\xd8\x46\x7c\x45\x2d\x29\xf1\x31\xf6\xdb\xbd\xec\x3f\xf6\xd2\xdd\xe2\xe7\x2b\xf2\xe7\xd0\x43\x19\xb5\xe4\xfe\x50\x8b\x4b\x8f\xee\xca\xa8\x25\xe1\xb7\xb9\x24\x76\x9d\x5e\x5a\x30\x17\x86\x7a\xf3\xd4\xbc\x15\x0d\x4d\x55\x34\x34\x55\x4b\x43\xc9\x02\x5d\x14\x30\xef\x2c\x2d\x72\x98\x37\x4f\xb3\x94\x68\x00\xe6\x39\xee\xb3\x96\x08\x0f\xf6\xd3\xc3\x74\x54\xf4\xb8\x62\x2c\x97\x33\x59\xc3\x06\x72\x30\x65\x81\x63\xf1\x04\x04\x3d\x96\xbc\x26\x6b\xa5\x2e\x79\x89\xfd\xa7\x21\xf6\x0f\x6f\xa3\x87\xca\x0e\xb7\x1e\xd1\x2f\xd5\x82\x8d\xa7\x97\x16\x96\x45\xb3\x1d\xc1\x89\x9f\xe2\xa7\x9b\x76\xdf\x91\x3d\x90\xe4\xa5\x02\x10\x57\x02\x62\x35\x98\xff\x26\xd8\x09\x07\xc4\xe5\x7d\x2a\xa9\xaf\xdd\xb5\xa6\xb0\xdf\x7b\x4c\x52\x20\x87\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x06\x19\x6e\x33\x19\x9e\xa4\xfd\x6c\x6f\x24\x6e\x91\xe1\xd7\x3b\xc9\xb0\xbd\xde\x03\x0a\x06\x0a\x06\x0a\x06\x0a\x76\xa0\xe0\xaf\x0d\xd1\x94\x00\x93\x82\xc9\x54\x08\x59\x7d\x92\x28\x8b\xbd\xd9\xcf\x0c\xb1\x57\xfa\x69\xa7\xf8\xdf\x95\x8d\x78\xe8\x2d\xf2\xab\x98\x4f\x67\x37\xb2\xe9\x75\x25\xe7\x22\x92\xd6\x0c\x94\x63\xae\xa6\x40\xc8\x58\x54\x7c\x88\x79\x8b\xba\x33\x6f\x0d\xff\x65\x31\x0b\x89\xa9\x17\x41\xdc\xed\x8d\xf6\xee\x62\xc4\x2f\x4c\xe4\x1d\x3a\x1f\x8c\x19\xc7\xd8\xa8\x84\x88\xae\xf1\x23\x51\xa3\xb8\x16\x88\x49\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\x81\x0c\xb7\x10\x19\x6e\xbf\xd0\x5b\xb0\x45\xb0\x45\xb0\xc5\x6d\xc4\x16\x7f\x38\x44\x23\x82\x2d\xea\x25\xad\xa8\x64\xd4\x72\xb1\x63\x4a\xcf\xe6\xb5\xb4\xad\x71\xfc\xd2\x10\xfb\x41\x2f\xdd\x23\xf7\xb6\xb4\x8d\xa1\xa2\xaa\xa4\xcb\x56\xb7\x33\xcb\x0b\x67\xb5\xb4\x1a\x7d\xd8\xd8\xb6\x2c\x0e\x90\xd2\x41\xb9\xa9\xb9\xc9\x64\x93\x97\x69\x46\x40\xba\x23\x34\xc5\x21\xdd\x3e\x9a\xa0\x71\xdf\x9c\xbd\xe6\x1d\xcb\x7b\x88\xc9\x8b\x0a\xe4\x72\x8f\x7a\x73\xb9\xdb\x59\x7f\x46\x2d\xd1\xb5\xe7\x82\x89\xdc\x24\xdb\x2f\x89\x9c\xbb\xd7\xcd\x98\x6f\x79\x21\x15\xe2\xc0\xd0\x6b\x3b\x2a\xbb\xfe\xd1\xa2\x5a\xc8\x29\x29\xd5\xa7\xf7\x77\xc9\xcd\x6d\x78\x00\x09\x2e\xd5\x2d\xcb\x18\xde\xc0\x13\x40\x36\x4b\xa4\x0e\x6f\x30\x75\xf8\x87\x7a\x9a\x63\x03\x4e\x89\x1c\xe2\xd3\x74\xdc\xce\x21\xde\x6e\x6b\x52\x58\x6f\xad\x35\x89\xfe\xcd\x3d\x95\xd6\xe4\x5e\x99\x69\x4a\xb1\x0c\x88\xcc\x1a\xde\x0e\xfb\xd1\x9a\x6c\xe0\xb0\x26\x01\xd6\x04\x19\x69\xdb\x92\x91\x16\xa9\x08\x91\x8a\x10\xa9\x08\x5b\x95\x8a\x30\xf9\xe1\x1e\x5a\x10\x85\x3b\x12\x74\xc2\x51\xb8\xa3\xb9\x9f\xed\xa6\x4c\x2f\xcc\x6f\x7f\xd8\xfb\xdb\xbf\x93\xdd\x21\x3a\xa5\xa5\x9f\xff\xc4\xf7\xef\xac\xfc\xfc\x0f\x14\x94\x62\x29\xcb\xbd\x8a\x62\xa1\xe9\xb3\xaa\x08\x15\x8c\xa5\x64\x8b\xe7\x04\x8f\x94\x37\x34\xca\xcf\xba\x87\x87\x17\xee\x72\x6e\x5c\x53\x8b\x19\xd5\xb9\x75\xc0\xb9\x95\x07\x4d\xa9\x99\x6c\x6a\xb4\x62\x3f\x57\x2b\xc6\xdf\x37\xe5\x56\xe3\x2a\x13\x67\x69\x91\x92\x65\xeb\x99\x29\x3a\xd8\xc0\x8c\x64\x89\x3b\xda\x31\x13\x09\x98\x89\x7c\xb4\x8f\x5e\xe9\x63\x1f\xee\x0b\x7d\xd0\x32\xe7\x2f\xf7\x75\xcf\xba\xa6\xcc\x37\x61\xf4\x33\xf7\xb5\x73\xff\x99\x31\x38\x6d\xc5\xcd\x90\xcf\xc0\x1d\xe6\x5f\x25\x21\xcd\x50\x72\xfc\x48\x63\xfa\x25\x8e\xe6\x7b\xf0\xa9\x90\x1e\x1e\x4a\xea\x5a\x7e\x49\x48\x4f\xce\x18\xaf\x85\xfc\x7b\xd9\x7c\x59\xec\x1f\x87\xfd\x17\x5c\x89\x2f\xf7\xd0\x6b\x3d\xec\xd5\x9e\xd0\xe7\x2d\xe8\xf5\xa1\x9e\x79\xad\x98\xe2\xb3\xb4\x8c\xc6\xbb\x5d\x0b\x47\x56\x8d\x9f\x22\xe1\x69\xd7\x5d\x70\x9c\x29\x26\x54\xeb\xba\xed\x64\x1f\x55\x52\xfc\xc6\xb9\x74\x21\x97\x4d\xc9\x0f\xa6\x9a\x4b\xeb\x61\xed\x86\xec\x53\xe1\xda\x2f\xa8\x5a\x21\xa7\xc6\xc2\xe2\x8c\x5c\x2b\x64\x3e\x4b\x8e\x15\x3d\x3b\xc0\x3a\x7d\xe4\x36\x7e\x59\x2e\xdd\x4b\x9b\x20\x92\x7f\xdc\x66\x41\xe4\x0f\xac\xcd\xf2\x07\xd8\x78\xef\x0f\x43\x72\x1f\x4d\xb0\xf1\x48\xcc\x72\x2c\xdc\xef\xca\x52\x21\x1a\x6b\xbd\x10\x99\xfd\x8f\x61\x3a\x20\xe0\x63\x71\x45\x49\xc5\xcc\x4e\x2a\x0b\xba\x1e\x4b\xe5\xd6\xf5\x92\x61\xa3\x72\x36\x86\xfc\xf4\x30\x7b\x77\x1f\x3d\x60\x1c\x37\xed\x3c\xec\xca\x46\x3c\xf4\x98\x17\x8b\x14\x6d\x9c\xd7\x72\x6a\x34\x62\x6c\x3f\x5f\x7e\xe4\xa5\xb8\x63\x9f\x26\x83\xc9\xe7\x44\x4d\xb2\x71\x5e\x93\xcc\x18\x53\xe3\x14\xa3\x11\xdf\x31\xc5\x7b\x63\x23\x1e\x73\x5c\xd0\x66\xa1\x64\x3a\x78\x34\x4d\xb3\xe3\x72\xb8\xf8\x3e\x0d\x73\x4a\xe1\xb8\x2e\xa7\x70\x30\xf4\x8d\x1d\x3e\x8f\xe4\x09\x1f\x46\xe9\x78\x2a\x4f\xc9\x5d\xda\xf9\x60\x12\xc6\x4c\xf1\x58\xd9\x07\xbe\xce\x27\x83\x8f\x3a\x60\x65\x83\xb0\xf2\xfd\x3d\x9b\xb7\x0b\xb3\x02\x54\x1e\xa5\xc3\x36\xa8\x6c\xbe\x75\x69\x8b\xf9\x08\x40\xa1\xd1\x5f\xbc\xd7\xc7\xba\x3c\x60\x33\x4b\x87\x41\x79\x52\xfc\xda\x56\x7b\x02\x80\x09\x80\x09\x80\x09\x80\x09\x80\x09\x80\x59\x37\xc0\xfc\x74\x4f\x93\x0b\x4a\x9c\x17\x38\xf4\x34\x2d\x38\x70\x68\x8b\x8b\x54\x04\x23\xcd\xb6\xcc\x25\x12\xff\xf0\x2e\x9f\xc9\x42\x34\x88\x70\x3a\xa6\x10\xbb\xf9\x5a\xbc\x5d\x33\x08\xe0\xce\x6e\x9b\xb7\x00\x77\x02\x77\x6e\x31\xee\x6c\x03\x9a\x0a\x44\x9d\xb5\x7d\x11\xaa\x1b\xfc\xc0\xef\x45\xf2\x20\x1d\x60\xfb\x22\x13\x16\xf4\x7c\xc8\x05\x3d\xed\x66\xdb\x00\x3e\xdf\x37\x48\x43\x35\x80\x4f\x4e\x3c\xd9\x9f\x0f\xb0\x3f\xf0\x43\x9d\x11\x11\xfb\x53\x94\x51\x0b\xe6\x14\xd9\x4c\x26\xc9\x3f\x62\x7b\x8c\x7d\x3c\xbe\x61\xc6\xc6\x79\xad\x38\x9d\xcb\x59\xf1\xd8\xcd\xcb\x07\xda\xa2\x30\xec\x67\xe8\x88\x18\xad\xfb\x69\x2f\x1f\xad\xa3\xb4\x87\x86\x03\x47\xab\x71\xab\xb5\xe4\x00\xbd\xf6\x98\xf7\x50\xbd\x83\xdd\x26\xa2\xad\x5f\x08\x1e\xa9\x53\xec\x60\x8d\x73\x97\x8a\x31\x8c\xc0\x6b\x04\x5e\x23\xf0\x1a\x81\xd7\x08\xbc\x46\xe0\x35\x02\xaf\x11\x78\x8d\xc0\x6b\x04\x5e\x23\xf0\x1a\x81\xd7\x08\xbc\x6e\x73\xe0\x35\xc2\xa2\x11\x16\x8d\xb0\xe8\x2e\x0e\x8b\xfe\xac\x95\x72\xb1\x1a\xa0\x73\x96\x83\x29\x6a\x39\x75\x25\x9b\x4f\x67\xf3\x19\x9d\xbd\x6d\x88\xfd\x55\x3f\x3d\xec\x85\xec\x84\xcc\xfe\x46\x6d\x29\x18\xb9\xbe\x4c\x34\xda\xa4\x44\x8c\x47\x6e\xf8\x78\xb4\xf8\x75\x39\xce\xb7\x98\xd5\x4b\xdb\x8d\x0e\x5e\xf7\x8f\xda\x68\x7a\xf6\xc6\xba\x92\x34\x66\x83\xb1\xe1\x3c\x9b\xad\x03\x1b\xca\x87\x54\x29\xf8\x05\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x04\x42\x6c\x17\x42\xfc\xc2\x30\x1d\x34\xcb\x49\x17\xf4\xb1\x8d\xb8\x5f\x99\x16\xbd\xa4\x94\xd4\xd5\xf5\x9c\xf1\xee\x9a\xe1\xcd\xef\x1a\x66\x7f\xdc\x4b\x77\x18\x47\xfa\x45\x34\x2f\xcb\xc3\x96\xd5\x52\xf4\x71\x63\xfb\x74\xa1\xe0\xaa\xad\xe2\xd8\x61\x6b\xc3\x99\x8d\xbb\x30\x23\x08\xe4\x05\x05\x0a\xf1\xce\x05\x13\xb3\x11\x16\xb5\x6a\x23\x17\x74\x09\xc7\x9c\xe7\xa8\x31\xb6\x30\xa3\x96\x28\xf4\xcb\x3b\xec\xde\xf6\x09\x56\x76\x76\x78\x44\xee\xd2\xb6\x3e\xaf\x3b\x52\xd9\xa3\xd3\xa1\xc7\x47\xa4\x72\x9b\x22\x95\xbd\x5e\xf9\xfa\x23\x95\x3b\xdc\x70\xf0\xa0\xe4\x77\xdc\x6b\x1b\x0e\x3b\x0e\xd9\x69\x2b\x9e\x10\xbf\xb6\xcf\x54\x20\x08\x19\x41\xc8\x08\x42\x46\x10\x32\x82\x90\x11\x84\x8c\x20\x64\xef\x20\xe4\x66\x4f\x13\x12\x7f\x74\xa7\x3d\x0f\x08\x0a\x31\x76\xce\x0e\x44\x8c\x5e\x5b\x26\x07\x88\x2f\xee\xb6\x29\x09\xe2\x8b\x11\x5f\xbc\xbd\xe2\x8b\x1b\x59\xf2\x05\xc6\x17\xd7\x66\xec\x3d\xa2\x89\x7d\x0c\x7f\xf5\x50\x62\xc7\x9e\x95\xa1\xc4\xdb\xaf\xa4\x13\xfb\xee\x20\x85\xdd\x20\x53\x28\x1e\x9d\xdc\x92\xfd\xda\x20\xfb\x54\xbf\xfd\x05\xac\x51\xdf\xe8\xe8\xaa\x26\xe9\x1b\xa3\x37\xec\xcf\xa9\xa3\xf5\xed\xa9\x66\x6c\x7f\xc9\xe9\xa6\xd3\x93\x5a\xe4\x91\xd0\x2c\x42\xb3\x08\xcd\x22\x34\x8b\xd0\x2c\x42\xb3\x08\xcd\x22\x34\x8b\xd0\x2c\x42\xb3\x08\xcd\x22\x34\x8b\xd0\x2c\x42\xb3\x08\xcd\x22\x34\x8b\xd0\x2c\xb6\x4b\xb3\xf8\xbd\x5d\xf4\x8c\x44\x7d\xeb\x25\x4d\x4f\x29\xb9\x6c\x3e\x33\xb6\x31\xb1\xa2\x96\x94\x09\x3f\xfd\x22\x47\x48\x5a\xbe\xa4\xe4\x0a\x5a\xda\x3c\x4e\x2d\x9a\x5a\x46\xce\x09\xd7\x75\xf6\xf7\x77\xb1\x6f\xf4\xd1\xfd\x8e\x86\xaf\xc8\x86\x43\xfb\xb8\xbc\x51\xec\x67\x3e\x0a\xfb\xbb\x7c\xca\x6a\x7f\x49\x4b\x4f\x5b\xed\x47\x8f\x72\xd1\xa3\xdd\xdc\x25\xd1\x9a\xed\x44\xf3\x39\x50\xf8\x10\x9b\x2c\x89\x2c\xd2\x33\x02\xd6\x2d\xd1\x59\x0e\xeb\x4e\xd1\x3c\xcd\xfa\x63\x6e\xfb\xb2\x63\xb2\x17\x62\x3e\x97\xbb\xd9\xca\x2f\x99\x60\xa4\x37\xcb\x12\x26\xd2\xb3\xaf\x4b\x92\x3d\xbf\xab\xb2\x29\x9f\xb8\x7c\x0a\xfd\xce\x4e\xef\xa7\x3b\x69\xca\x29\xeb\x7d\xc0\x27\x4c\x91\x65\x67\x3c\xe3\xc4\x73\xf4\x46\xba\x54\xe6\xbe\x6c\xd2\x43\x86\x2b\x13\xd2\xcc\x06\xa5\x99\x5f\xe9\x69\x9d\xe9\x79\x5e\x48\x36\x2f\xd2\xb2\x2d\xd9\x6c\x9f\x61\xab\xcd\x72\xd5\x69\xa6\x3c\x0c\x5d\x80\xc4\x33\xf1\xf5\xbb\xbc\x0d\xdb\x89\x0a\x99\x47\xbd\x16\xee\x98\x10\x7f\x6c\xbd\x7d\x83\x34\xa4\xdb\xec\x29\xa4\x21\x90\x86\x6c\xb1\x34\x64\x0b\xe7\xcc\x81\x92\x91\x76\xcd\x9a\x93\xb3\x94\x60\x27\x22\xc7\x2c\x41\xc8\x6e\xa7\x94\xc4\xa7\x99\x5b\x42\x56\xf2\xbb\xbd\x74\x8f\x58\x6b\xae\x70\x39\xc9\x46\x7c\x8c\x7d\xa9\x97\x7d\xa1\x97\x76\xf0\x1f\xae\x6c\xc4\x43\x0f\x65\xd4\x92\x1b\xe0\x8a\xa5\x71\xf4\xf5\x19\xb5\x94\x30\xf6\xba\x14\x9f\x5e\x5a\x30\x5d\x85\x4d\xfc\x20\x56\x34\x34\x55\xd1\xd0\x54\x2d\x0d\x25\x0b\x74\x51\x0c\x72\xe3\x0b\x67\x0c\xf2\x79\x9a\xa5\x44\x03\xdf\x35\xc7\x7d\xd6\x92\xca\x9e\xfd\xf0\x7e\x8a\x19\xfd\x5b\x25\xf2\xb0\xa0\xa5\xad\x55\x7a\x4e\xcb\xb0\x2f\xde\xcf\x3e\xd7\x4b\x77\xa4\xb4\xa2\x6a\xf4\xfe\xa3\x7c\x59\x9e\xd3\x32\x95\x13\x9a\x25\x2d\x1d\x0d\x19\x9b\x67\xb4\xa2\xea\x14\xae\x2e\x69\xe9\x45\x2d\x33\x41\x25\xf5\xc5\xd2\x58\x21\xa7\x64\xf3\x4d\x5e\x68\x4f\xd2\x2e\xd1\x9f\x0f\xd2\xfd\xbc\x3f\x5f\x47\x77\x7e\xbc\x67\x07\xc9\x91\x15\xf8\xe6\xcf\x05\xbf\xd8\x11\x16\x16\x6f\xf1\x92\x96\xf6\xaa\x31\x11\x89\x04\x85\x13\x26\xdf\xdd\x43\x7f\xbf\x87\xfd\xbd\x9e\xd0\x8f\x5a\xb6\xfa\xaa\xa9\x65\x50\x8c\x07\xcc\x5f\x3e\xe1\x90\x2d\x69\x26\xd4\xc9\x69\x99\x32\xa7\x99\xf3\xfb\x67\x7c\x92\xf9\x73\x28\x72\x83\xaf\xe5\x9d\xcd\x49\xcf\x4e\x41\x4b\xc7\x22\x3b\xad\x9f\x9d\xeb\x84\x67\xe8\x22\x5b\x0e\x3d\x6d\x5e\xce\xbe\x79\xcd\x12\xa8\x1b\x8f\xd8\xe6\x4a\x66\x3b\xae\x0b\xe1\xa1\x0d\xb1\xc8\xed\xab\xfc\x28\x97\x19\xff\xf1\xdb\xe8\x5d\xb7\xb1\xff\xe3\xb6\xd0\xcb\xb7\x99\x8d\xff\x66\x7f\x36\xaf\xab\xa9\xf5\xa2\xba\x7c\x3d\x5b\xb8\xb0\xb8\x7c\x49\x2d\x66\x57\x6f\x26\x94\xd4\x75\x35\x9f\x2e\x9f\x79\xf1\xe9\x84\x29\x20\x71\xce\xbc\xb8\x92\xa0\xb8\x66\x0a\x24\xb2\x69\x8e\xe0\x56\x2d\xc7\x1d\xf7\x79\xa8\x45\x89\xbb\x2c\xab\xb9\x62\x9e\x86\x9b\xa2\x94\x96\xcf\xab\xe2\xc3\x56\xd2\x62\x61\xf1\xe1\xe7\x9f\xbf\x35\xe5\xba\x00\xe7\xa7\x2e\x5c\x58\x5a\xb6\x76\xd4\xf2\xe1\x15\xb5\x74\x43\x95\x46\xcd\xbe\x32\xd3\x41\x64\xb5\x2f\xef\x51\x4e\x26\xc4\xd7\xd5\x7d\x48\x4a\xc9\x1b\x37\xb2\xc1\x6f\xdf\xea\x6b\xee\x3f\x14\x57\x27\x7c\x0e\xfc\x46\x0c\x53\x6d\xb9\xa0\x8b\xaa\x92\x0b\x1b\xe3\x2b\xa7\x96\x62\x61\x53\xd6\x20\x7f\x90\xb7\xc5\x55\x16\x82\x09\x3b\x4e\x60\x9d\x7c\x50\x0f\x5f\x58\x5c\x0e\xa7\x8a\x2a\xf7\x02\x29\x39\x7d\xc4\x25\x14\x31\xae\xd7\x74\x78\x99\x37\x2e\x69\xa4\xf3\xec\xc6\xc9\x36\xd6\x73\x79\xb5\xc8\x6d\x30\x77\x7b\xae\x29\x79\x2b\xd8\x22\x9b\x4e\xe7\xd4\xb0\x52\x2a\x29\xa9\xeb\xe1\x21\x35\x96\x89\x19\x13\x5d\xf1\x7f\xa3\x07\xac\xa7\xc9\xf5\x4d\x5c\xf4\x22\xe7\x8f\xeb\x4a\xce\xee\x8e\x94\xb6\xe6\x12\x35\x38\x2f\x61\x38\x16\xd9\x55\x6d\x40\xb9\x86\xe3\x5b\x7b\xe9\x7f\xf5\xb0\x1f\xf6\x84\xbe\x6f\xbd\x7a\xbf\xdd\xb3\xb0\x2a\x62\x4d\xb8\xc3\xd5\x72\x1d\xaf\xdc\x2c\x99\x6e\x63\x25\x5d\x2e\x16\xb2\x42\xb4\x38\x99\x57\x4a\x72\x56\x2b\xec\x21\xff\xd0\x99\xcf\x5d\xb9\xc9\xef\x2f\x9d\xd5\x0b\x39\xe5\x26\x77\x65\xac\x15\x78\x74\x07\x0f\x40\x09\xe7\xb2\x79\x3e\x36\x73\x5a\x26\x93\x35\x67\xb6\x0e\x8f\xae\x9e\xcb\x66\xae\x96\x72\x37\x85\x17\x51\x2b\xda\x3f\xd8\x93\x64\xb7\xf9\xe5\x08\x3b\x16\x11\x8e\xf1\x84\x71\x17\x2e\xf4\x3c\x4e\x31\x36\x12\x89\x5a\xb3\x81\x7b\x9c\x73\x8a\x25\x2d\x7d\x2b\xcc\x1f\x92\x2b\xf4\x66\x76\x39\xf4\xbc\xd9\xe0\xd1\xf3\xa2\x33\x2d\x15\x8b\xf9\xdc\xa4\xec\x49\x98\xc9\x4a\x0b\x2b\x0d\xdb\x0e\xf3\x38\xd7\x58\xfa\x0f\xbd\xf4\xeb\xbd\xec\x8b\xbd\xa1\xcf\x39\x62\xcd\xa6\xc3\x45\x35\x27\xa2\xf0\xb8\xeb\xcd\x3b\xaa\x2f\xb5\x5e\x2c\x72\x5f\x63\xd6\x7c\xad\x6d\x6b\x7f\x55\xbb\x21\xaf\xc4\x1d\x90\x57\x30\xac\x41\x5a\xd5\x6d\xb7\x9e\x62\x58\x62\xee\xc6\xe3\x52\x15\xee\x72\x35\x3e\x09\xc6\xd1\x61\x5d\x8a\xd9\xb8\xb9\x96\x5a\x16\x73\xed\x67\xf9\xf9\x2a\x63\xfe\xcc\x90\xa0\xf5\xd2\x7a\x51\x1d\x11\x0a\xb0\x8c\xee\x71\xe4\x39\xe3\x4c\x9a\x18\xbb\xfc\x5c\xd2\xcd\xc1\x87\xa8\xf1\xff\x0b\xc6\x25\x9a\x8e\x38\x2b\xc0\x2f\x72\x97\x73\x67\xd7\xc0\x7c\xb5\x87\x3e\xdf\xc3\xfe\xaf\x9e\xd0\xbf\xb3\xde\xcd\xf7\xf9\xbc\x9b\x39\xee\x0d\xb3\xde\x49\xc3\xde\xca\x01\xcc\xaf\x56\x76\x23\xbf\x3d\x57\x7c\xe1\x88\xd8\xce\x25\x9b\x57\xb5\x1b\x79\xbb\x09\xee\xbe\x76\x3a\x7b\xac\x51\x61\xde\x8f\xd7\xfd\x45\x76\x96\x94\x6c\x6e\xd1\xb8\x1a\xd7\xad\xfc\xb3\x1e\x7a\x4f\x0f\xfb\xa9\x9e\xd0\x4f\x58\xb7\xf2\x16\x19\x07\x38\x12\x56\xd2\x69\xc3\x08\x9e\x9f\x9f\xd9\xbb\x77\xef\x21\xa3\x3d\xf9\xe7\x59\x25\xaf\xf1\x27\xab\x97\x94\xb5\x82\xe9\xc1\x5d\x51\x33\xd9\x7c\x5e\x2e\xfb\x55\xe1\x6a\xb6\x6d\x86\x65\x6d\x3c\x86\x2d\x59\x6d\xb9\x06\x2e\xfb\xea\x20\xc5\xc5\xe4\xda\x5d\xfa\xdf\x4a\x5a\x9b\xd2\xb3\x72\x4b\x4a\x29\x28\xa9\x6c\x29\xab\xea\xec\xe7\x06\xd9\x4f\xf5\xd3\x3d\x72\x83\x95\xac\x76\xbc\x7a\x91\xa9\x99\xe5\x85\x65\x71\xc4\x8c\x68\xea\x66\x74\x9f\x71\x84\xfc\x51\xa6\x96\xad\xdc\x6b\xbb\xe9\xb1\xd7\x44\x28\xdb\x38\x0f\x65\x33\x66\x9e\x33\x34\x4d\xc7\x7d\x97\xab\x66\xc7\xcb\x5e\x8c\x55\x76\x40\x53\x2a\x52\xa9\xc1\xf3\xd9\x04\x3b\x21\x67\xae\xee\xc1\x60\x96\xd0\xac\xb8\x30\xa4\x95\x85\x44\x1b\x12\x6d\x48\xb4\x21\xd1\x86\x44\x1b\x12\x6d\x48\xb4\x21\xd1\x86\x44\x1b\x12\x6d\x48\xb4\x21\xd1\x86\x44\x1b\x12\x6d\x48\xb4\x21\xd1\xde\x3a\x89\xf6\x27\xae\xd0\xa9\xaa\x64\xcf\xc7\xd7\xeb\x09\xfc\xfe\xf0\x32\xfb\xe2\x40\x33\x80\x5f\xac\x12\xf8\xd9\x3e\xe1\xca\xfd\x3b\x1c\xf5\x25\x40\xbb\x40\xbb\x12\xa0\x5d\xa0\x5d\xa0\x5d\xa0\x5d\x5d\x43\xbb\x12\x1d\x43\xbb\x9a\x7e\x25\x0d\xd3\xae\x04\x68\x17\x68\x17\x68\x17\x68\x17\x68\x57\xfb\x69\x57\xa2\xab\xe1\x54\x02\x70\xaa\x75\x70\x2a\xd1\xe9\x70\x2a\xb1\x0d\xe1\xd4\xb6\x96\x48\x55\x68\x9e\xea\xd4\x4c\x45\x7e\x6f\x67\x25\x49\x7b\x44\x7c\xa2\xc2\x8a\x17\x34\x1b\x17\x1b\xb7\x00\x9b\x09\xca\xf5\x34\x9d\xa3\x33\x65\x31\x97\x47\xe9\xf0\x26\x1e\x17\xc2\x2e\x11\xc6\xde\x60\x18\xfb\x4f\xf6\xd2\x59\x61\x3b\x4e\xd2\x1c\xb7\x1d\xc7\x69\x73\x83\x91\x96\x45\xf4\xfa\x22\x25\xed\xe8\xf5\x4d\x37\x7a\x41\x94\x33\x38\x43\xa7\x1d\xe5\x0c\x36\xdd\x6a\x90\x89\x6b\x8f\xca\xb3\x8a\x25\x2d\x68\x7a\x89\xa2\x2f\x8f\x56\x9a\xb8\x41\x59\xc9\xc2\x51\x16\x44\x5b\xf5\x32\x77\x53\x62\xc7\x32\x59\xb0\x75\x54\x1b\x0d\x5f\x6b\x0a\x24\x81\x17\x83\x17\x83\x17\x83\x17\x77\x0f\x2f\xc6\x6c\x2f\x60\xb6\xd7\x39\x40\x1d\xc5\xe9\xda\x52\x9c\x0e\x7e\x0b\xf8\x2d\xe0\xb7\x80\xdf\x02\x7e\x8b\xae\xf6\x5b\xa0\x46\x29\x6a\x94\xa2\x46\x69\xab\x6a\x94\xc2\x2d\x08\xb7\x60\xb7\xba\x05\x93\x99\x26\x97\xe7\xed\x10\xf2\x1c\xf5\x26\xcf\xf7\xb3\xfb\x84\xd1\xb0\x0d\x3a\x6d\xc3\x64\x35\xec\x53\xf7\xd1\x13\x56\x32\x36\x2d\xad\x5a\x69\xd7\x0a\x45\xed\xc5\x9b\x63\x7f\xd7\xb8\x8f\x97\xd8\x3f\xba\x8f\xfd\xa4\x23\xff\xda\x53\x32\x31\x53\xf8\xe4\xdc\x05\x5b\x69\x5e\xd2\xc2\xfc\x20\x63\x10\x9d\xd5\xd2\x6a\xf4\x09\xb9\x9b\x48\xc5\x76\x52\x2d\x19\xbf\x2e\x19\xbb\x3c\x93\x2d\x5d\x5d\x52\x4a\x57\x27\xfa\xa2\x63\xd1\xe6\xa4\x4f\x7b\xc2\xfb\x39\x11\xdb\x21\xaf\x82\xae\x9d\x0f\x1e\x31\x63\x6c\xd4\xce\xa5\x26\x46\x89\x75\xd1\x12\xa7\xbb\x12\xaf\x85\x3c\xbb\x65\xe9\x62\xed\xdd\xb2\xb4\xbe\x3d\xba\xc5\x3b\xdd\x9c\x4f\x17\x45\x7e\xda\xd1\x2d\x03\x56\xb7\x9c\x5b\xae\xd6\x2f\x11\x77\xbf\x68\xfa\x2d\xd8\x31\xd1\x9f\x71\x74\xcc\x90\xd9\x31\xb3\x73\x8b\x73\x17\xe6\xaa\x74\xcd\x93\xae\xae\x11\xde\x9d\x6d\xd1\x39\x75\xbd\x4c\x13\xef\x75\x74\xce\xb0\xd9\x39\xe7\x96\x2e\x2c\x9c\x3b\xbb\x5c\xa5\x77\x9e\x72\xf5\x8e\x6c\xb9\x95\xdd\xd3\x82\x7b\xaf\xa1\xcb\xa7\x3c\x5f\xaa\x53\x73\xd3\xb3\x35\xbf\x54\xa7\x54\x25\x7d\xeb\x75\x4c\xe2\x3d\x8e\x8e\x19\xb4\xac\xcd\xf4\x85\x99\x53\x55\x7a\x66\xb7\xdb\xdc\x18\xb3\xa6\x5b\xef\x95\x4a\x1e\xa5\xc3\xec\x50\x64\xd2\x9a\x92\xec\x72\x66\xdc\x2b\x3f\xb4\x32\xfd\xde\x7e\xda\xcb\xe2\x91\x31\xeb\xf0\x07\x8c\x7f\xed\x64\x8c\x62\xca\x1a\xe1\xdb\x9c\x87\x95\xa5\xc0\x4b\x18\x7d\xc9\x01\xd8\x55\x35\x7c\xf1\xfc\x62\xd8\x6c\x65\x5d\x57\xad\xc9\xab\x99\x97\x4e\x3c\x25\x73\xd9\x53\xd2\xc2\xc6\xb4\x24\x26\xce\xe1\x9c\xb9\x7c\xfa\x32\x1d\x17\xf1\x86\xe9\xac\x9e\xd2\x36\x8c\xb9\xa4\x15\x71\xe8\x17\x6c\xa8\xe6\xd3\x05\x2d\x9b\x2f\xe9\xb9\x6c\x4a\xd5\xd9\xf7\x5f\x60\xbf\x30\x40\x77\x59\x0d\x18\x03\x68\x4f\xf5\x18\xc3\x39\xd9\xc2\xb2\xd1\x42\x74\xc0\xd8\x79\xd6\x3c\xdc\x99\x6f\xd6\xb5\x1f\xc2\x0a\x11\x56\x88\xb0\x42\xc8\x44\x20\x13\x81\x4c\x04\x32\x91\x8e\x91\x89\x74\x8e\x0a\x02\xee\x79\xb8\xe7\xe1\x9e\x87\x7b\x1e\xee\xf9\xae\x76\xcf\xc3\x7f\x08\xff\x61\x97\xfa\x0f\xb7\x65\x58\xa1\x4a\x49\x01\x05\x67\x68\x9a\x43\xc1\xc3\x74\x88\x26\x7d\xe3\x6d\x6c\x50\xb5\x11\x8f\xb9\x00\x51\x53\xc2\x09\x5f\x08\xe6\x87\x53\xec\xa0\xe4\x87\xe5\xd0\x4c\xd2\x44\xd7\x55\xb9\x50\x62\xe4\xc3\x3b\xcb\x48\xd9\x43\x66\x0c\x61\xbe\x8c\x8a\x0d\x89\x0d\x6d\xe4\x62\x02\x63\x2d\xd0\x49\x9a\x2b\x8b\x1b\xdc\x4f\x7b\x1b\x78\x1e\x50\x90\x23\x5e\xb0\xc1\x78\xc1\xbf\xe9\xa1\x79\x61\x14\x8e\xd3\x51\x6e\x14\x26\xa9\xb1\x41\x48\xa7\x45\x9c\xe0\x2c\x25\xec\x38\xc1\x86\x1b\x5b\x14\xf1\x81\x73\x34\xe3\x88\x0f\x6c\xb8\xb5\xc6\x6d\x15\x0f\xd8\x6b\xb1\xad\x8a\xfe\xf1\x48\x99\xad\x8a\x78\x06\x03\xba\xcd\xd6\x84\xd8\xc7\x61\xb6\xbc\x82\x00\x5b\x69\xc0\x10\xff\x07\xb0\x0b\xb0\x0b\xb0\x0b\xb0\x8b\xf8\x3f\xc4\xff\x21\xfe\x0f\xf1\x7f\x70\x30\xc0\xc1\x00\x07\x03\x1c\x0c\x70\x30\x20\xfe\x0f\xf1\x7f\x88\xff\x43\xfc\x1f\xfc\x77\xf0\xdf\x75\xa0\xff\xae\xed\xf1\x7f\x75\x04\xe6\xb5\x98\x36\x6f\xc7\xb8\xbf\x4f\xbc\x40\x51\x59\xad\x27\x75\x55\x4d\xaf\xe7\x8c\x55\x9b\x2d\x9f\x2f\x14\xb3\x5a\x31\x5b\xba\x99\xca\x29\xba\xae\xea\xec\x47\x5e\x60\x3f\x37\x40\xaf\xb3\xf7\xad\x41\x29\xbf\x24\xdb\x98\x31\xda\x88\x3e\xca\x0b\xf1\x58\xc7\x5f\x8a\xbb\x36\x43\x20\x0f\x81\x3c\x04\xf2\xf0\xa3\xc0\x8f\x02\x3f\x0a\xfc\x28\x1d\xe3\x47\xe9\x1c\x37\x01\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x75\x57\xf3\x6b\x00\x36\x00\xb6\x2e\x05\x6c\xdb\x52\x20\xbf\x2a\x34\xac\xe3\x5c\xc3\xda\x7b\xee\x34\x3b\x42\x53\x74\xd0\xbf\x20\x85\xcd\xa2\x36\xe2\x31\x17\x21\xaa\x49\x21\x7f\x39\x98\xf3\x1d\x66\x87\xcc\x9c\x60\xe5\xe0\x4b\x82\x3e\xd7\x69\xdd\xb9\x48\x02\x14\xf8\x91\x7f\xb9\xb3\x9c\x91\xbd\xde\xaa\xb3\xe3\xc6\x61\x8f\xcb\x12\x3b\x2d\x07\x62\x82\x5f\x25\xe9\x14\xcd\x97\x29\xe3\x0f\xd0\xbe\x46\x1e\x04\xc4\x55\x90\xc6\x37\x28\x8d\xff\xdb\x1e\x3a\x29\xcc\xc1\x09\x3a\xc6\xcd\xc1\x41\x6a\x70\x14\x0a\x67\x43\x9c\x3b\x1b\x2c\x6d\x7c\xe3\xad\x9d\x11\xe2\xf8\x79\x9a\x75\x88\xe3\x1b\x6f\x6e\xb3\xea\xf8\x16\xdb\xb1\xe8\xef\x8f\x94\xdb\x29\x6f\x7d\xbc\xdb\x66\x0d\xcb\x3a\x39\x0e\x9b\x65\x0b\xe4\x5b\x69\xbd\x20\x8b\x07\xce\x05\xce\x05\xce\x05\xce\x85\x2c\x1e\xb2\x78\xc8\xe2\x21\x8b\x87\x5b\x01\x6e\x05\xb8\x15\xe0\x56\x80\x5b\x01\xb2\x78\xc8\xe2\x21\x8b\x87\x2c\x1e\x5e\x3b\x78\xed\x3a\xd0\x6b\xd7\x76\x59\x7c\xab\x5d\x60\xf5\xd4\xc3\x69\xba\x6a\xfd\xed\x7d\x14\xf6\x57\xad\xf3\x8a\x3d\x63\xec\x77\x7b\xd9\xd7\x7b\x89\xb9\xf8\xb6\xa8\x08\xff\x50\x46\x2d\xb9\xa7\xc5\xc2\x31\x1a\x0d\x67\x54\x97\x36\x9d\xef\x3e\xbd\xb4\x60\x22\xc1\x26\x02\xed\x8a\x86\xa6\x2a\x1a\x9a\xaa\xa5\xa1\x64\x81\x2e\x8a\x81\x75\x96\x16\xf9\xc0\x9a\xa7\x59\x4a\x34\x30\xb0\x1c\xf7\x59\x8b\x93\x95\x7d\xf4\x51\x4a\x8a\x87\xa0\x14\xb2\xea\x8b\x25\x35\xcf\xdf\xe5\xf2\xe7\x90\x5a\xd7\x4b\xda\x9a\xd9\xc7\xce\xab\x92\x15\x86\x74\x3e\xa0\xd9\xef\xed\x62\x6f\xef\xa7\x07\x5d\x6d\x59\x4f\x6c\x7f\x51\x55\xd2\x61\xb1\xa7\xf9\x76\xda\x0b\x97\x19\x7e\x0a\xf3\xe2\x67\xad\x53\x44\x0f\x18\x87\x4d\x3b\x5b\x34\xab\xfa\xfb\x1c\x21\x5e\xae\xe6\xba\x2d\x92\x3f\xd1\x43\x37\xc4\x23\x2a\x50\x9e\x3f\xa2\xab\xb4\x4a\x69\xbf\x47\x64\x5f\xec\xa8\x25\x56\xb7\x9f\x96\xbb\xaf\x65\xff\xc4\xfc\xee\x27\xd0\x4c\x3c\xea\xfd\x1a\xdf\xce\xfa\x33\x6a\x89\xae\xbd\x25\xd8\x8a\x9c\x65\x8b\xd2\x8a\x78\x0d\x03\xb3\xc4\x96\xdf\xf5\x55\x14\xda\x0a\xfd\x1b\xf2\x1b\x04\x07\x8b\x6a\x21\xa7\xa4\xd4\xfa\xc7\xc1\x21\x79\xe4\x56\x0f\x85\xc4\xdf\xa1\x17\x69\xa3\xcc\xff\xde\xa6\xa1\x00\xea\x0b\x7f\x7d\x83\xfe\xfa\x77\xf7\x6e\x9d\x01\xfb\xff\x09\xff\xfe\x3a\xe9\xb6\x7f\x7f\x3b\x98\xcf\xc2\x7a\xcd\xe6\xb3\xc2\x06\x6e\xc2\x9e\x26\xde\xf6\x3a\x3f\xf3\x39\x5d\x50\x8a\xa5\x2c\xf7\xa3\x0a\x02\x53\xbf\x1d\x9d\x2c\x18\xb3\xe7\xad\xb4\xa2\x8f\x94\x37\x34\xca\x2f\x69\x0f\x9f\x41\xed\x72\x6e\x5c\x53\x8b\x19\xd5\xb9\x75\xc0\xb9\xd5\x58\x5b\x96\xd4\x4c\x36\x35\x5a\xb1\x9f\xab\x15\xe3\xef\x9b\x72\xab\x71\x95\x09\x63\x96\x95\x2c\xb3\xe0\x55\xa4\x6c\x55\xe6\x5b\xbc\xd4\x14\xac\x72\x90\x55\xfe\x68\x1f\xbd\xd2\xc7\x3e\xdc\x17\xfa\xa0\xc5\x8f\x5e\xee\xeb\x1e\xab\x5c\x46\xcf\x8d\x7e\xe6\xaa\x04\xee\xe1\x31\x06\xa7\x1d\x6a\x3a\xe4\x33\x70\x87\x39\x06\x13\x22\x16\x25\xc7\x8f\xcc\x6b\xf9\x51\x71\x34\xdf\x83\xbb\xe0\xf4\xf0\x50\x52\xd7\xf2\x4b\x22\xe6\xf2\x8c\xf1\x5a\xc8\xbf\x97\xcd\x97\xc5\xfe\x71\xd8\xff\x73\x91\xf8\x72\x0f\xbd\xd6\xc3\x5e\xed\x09\x7d\xde\x5a\x8b\x7f\xa8\x67\x5e\x2b\xa6\xb8\x77\x30\xa3\xf1\x6e\xd7\xc2\x91\x55\xe3\xa7\x48\x78\xda\x75\x17\x1c\x62\x08\x47\xde\xba\x6e\xcb\x11\x46\x95\x14\xbf\x71\x2e\xf2\xc8\x65\x53\x92\xd0\xa9\xb9\xb4\x1e\xd6\x6e\xc8\x3e\x15\x22\x88\x82\xaa\x15\x72\x6a\x2c\x2c\xce\xc8\x83\x64\xcd\x67\xc9\x61\x82\x67\x07\x58\xa7\x8f\xdc\xc6\x2f\xcb\xa5\x5e\xed\xe4\x09\xfc\xe3\xde\x5f\xa0\x1d\xec\x76\x7e\x63\x5b\xf1\x0d\x4a\xce\xd1\x0c\x9b\x8e\x1c\xb7\xe2\xe0\x9f\x74\x16\x9b\xf3\x3b\xac\xb2\xe8\x5c\xd3\xb1\xc1\x9f\xf5\xd2\x2e\xb9\x62\x5d\x37\x5a\x28\xc9\x97\xc5\x5c\xb2\x32\x0e\xff\xe9\x6e\xf7\xd6\x50\x28\xc3\xf9\xef\xaa\x56\x5c\xb3\xf0\x90\x12\xe6\x1d\x14\x7d\x38\xa3\x96\xa6\x5d\xbb\x4f\x2f\x2d\x9c\x34\x36\x75\x20\x2a\xc8\xd2\x59\x31\x8c\x4f\xd2\x1c\x1f\xc6\xc7\xe9\x28\x1d\x6e\x0c\x15\xf0\x7b\x0c\x64\x04\x7f\x3e\x44\xfb\x24\xa8\x71\x55\x5e\xb6\xe8\x00\xc7\x71\x63\x29\x3d\x9b\x2e\x66\x8d\x31\x28\xa1\x00\xfb\x95\x21\xf6\x97\xfd\x74\x8f\x3c\xca\x9a\xc3\x7c\xac\x47\xf2\x3b\x5b\xe4\x6e\x18\x66\xe1\x1f\x32\x13\x0e\xcc\x2c\x2f\xcc\xf2\xd6\x62\x0e\xd7\xcb\x94\xe5\xb4\x19\xe4\x4d\x0c\xda\xa2\x38\x97\xca\x49\x2b\xa8\x96\xb0\x42\x2f\xa9\x4a\x7a\xc4\xf6\x06\x73\x8f\xb7\xf4\x1d\x66\x4b\xea\x9a\xfd\x91\x19\x74\x09\x38\x1c\x6d\xc7\xa2\xbb\xf8\xe9\x64\x81\x69\x73\xb6\x64\x5e\x61\x87\xe7\x3b\x48\x5e\xa7\x25\x31\x62\x16\xe8\x24\x1f\x31\xd3\x74\x9c\x8e\x36\x30\x62\x78\x7c\xc2\xdc\x86\x9a\x0f\x16\xef\xfb\x5b\xb4\x1b\xc2\xa2\x3d\x1f\x6c\xd1\x0e\xb1\xc9\x80\x8a\xdf\xa2\xff\x2b\xf9\x43\x12\x29\x1e\x90\xe2\x21\x09\x4d\x30\x34\xc1\xd0\x04\x43\x13\xdc\x35\x9a\xe0\x64\xc7\x48\x5e\x9b\x7e\x25\x0d\x6b\x31\x93\xd0\x62\x42\x8b\x09\x2d\x26\xb4\x98\xd0\x62\xb6\x5f\x8b\x99\x3c\x40\xfb\xd8\x44\x64\xdc\x82\x48\x0f\xba\x20\x92\xb9\x80\x6b\x3d\x35\x4a\x76\xb5\x6a\x2d\x09\xd5\x5a\xeb\x54\x6b\xc9\x8e\x57\xad\x6d\xc3\x5c\x13\xec\xfb\x0f\xd3\xa4\x0f\x73\x1c\xdb\xd0\x72\xeb\x6b\xaa\x52\x2a\x29\xa9\xab\xc6\xb7\xba\x5c\x84\xf4\xe9\x87\xd9\x7b\xfa\x88\x6c\xec\x18\x1a\xad\xaa\x3c\xba\xc4\xdb\x9b\xb6\xda\x8b\xee\x36\x76\xb7\x60\x5f\xf9\xe6\x96\xc8\x8b\x56\xea\x0c\xa6\x97\x9d\xb2\x11\x8f\x95\x5f\xde\x66\xd5\x42\xf5\x69\x0e\xbd\xc0\x5c\xc5\x15\x39\x35\x87\xa1\xff\xbe\xc3\xf5\x68\xc6\x83\xf4\x40\x15\x4f\x67\x40\x1e\xd1\xd6\x07\x54\x7f\xd2\x0d\xff\x27\x04\x77\x31\x44\x3c\x0d\x8a\x78\x3e\x56\x6f\xd2\x8d\x2a\x76\xa2\x81\xa4\x1b\x2d\xb1\x3a\x5c\x64\xd3\x62\xab\x93\xf8\x27\x77\xb9\xac\xce\xa1\x9a\x65\x34\x15\xe6\xe7\xc9\x82\xcb\x15\xd4\x6a\xe3\x03\xad\x4c\xb7\x19\x3f\x68\x65\xa0\x95\xd9\x62\xad\x4c\x1b\x67\xa3\xb5\x19\xfe\x1a\x4c\xbc\xf7\xb7\x21\x50\x5a\x93\x3c\x4a\x87\xd9\xa1\xc8\xa4\x85\x28\x76\x39\x11\x45\xf9\x19\xdb\xa0\x6f\xf9\x93\x21\xda\xeb\xb7\xf2\x11\x42\x0b\xf9\xbb\x2c\xe7\x60\x8a\x2d\xfe\xf5\x10\xfb\xd3\x7e\xd7\x47\xee\x13\xb5\xe8\x2c\xe4\x87\x8c\x07\x07\x75\x84\xd4\x22\xe4\x96\x5a\x38\xaf\x0f\x42\x8b\xca\xf7\xe7\xb9\xe0\xf7\x67\x92\xed\xaf\x36\x71\x72\xf6\xb0\x3b\x3c\x2c\x48\xc4\x01\x99\x05\x64\x16\x90\x59\x40\x66\x01\x99\x05\x64\x16\x90\x59\x40\x66\x01\x99\x05\x64\x16\x90\x59\x40\x66\x01\x99\x45\x9b\x65\x16\x87\x68\x92\xed\x8f\xec\xb5\x18\xc6\x1b\x9c\x0c\xc3\xb9\xbe\x83\xd2\x02\x4a\x0b\x28\x2d\xa0\xb4\x70\x28\x2d\x3e\xa0\x58\x19\x60\xd2\xc6\x2c\x38\xab\xe5\x8b\x6a\x26\xcb\xfd\x45\x8e\xb0\x3a\x33\xd6\x8b\xaf\x36\x15\x63\x8e\x73\x43\x5d\xb9\xaa\x69\xd7\x5d\xab\x46\x9d\xfd\xdf\x6f\x66\x1f\x1c\xa4\x47\x3d\xdb\xb2\x22\xc0\x8e\x54\x2f\x36\x7b\xc9\x3a\xc7\x33\xe2\x1c\x33\xce\x73\x44\x8f\x19\x47\x4f\x7b\x9d\x40\x46\x66\x55\x3f\xbe\xc3\x29\x22\xca\xd3\x02\xaa\xa1\x3c\x2d\xa0\x1a\xa0\x1a\xa0\x5a\x17\x41\xb5\x0e\x4a\xd7\xdf\x31\x50\x0d\x79\xe4\x01\xd5\x00\xd5\x00\xd5\x00\xd5\x50\x9e\x16\x89\xae\x6f\x1d\x90\xd5\xf1\x89\xae\xb7\x65\x79\xda\x1f\xed\xa1\x9c\x90\x5f\xa9\x94\xe2\xf2\xab\x17\xe8\x4d\xf4\xac\xaf\x6a\xd1\x1b\x77\x99\xb9\xbc\xaa\x33\xa4\x9a\x0a\xd8\x06\x14\x98\xbd\xf6\xff\x0f\x96\x6e\x3d\xcf\x9e\x33\x73\x78\x55\x81\x73\xa6\x02\xbe\xea\x25\x57\x66\xc9\x89\xfc\xf8\x9d\x41\xa0\x6e\xd0\xaa\x78\x1b\xc0\xe4\x4e\x88\x1d\x3b\x80\xca\x09\x88\x76\x9d\xb2\x94\x29\x53\xad\x3f\x43\x17\x5b\x32\x18\x20\x69\x47\x3c\x4f\x83\xf1\x3c\xdf\xee\xa5\xab\xc2\x66\x29\x74\x85\xdb\xac\x67\xa9\x55\xc3\x94\xd6\x44\xc0\xcf\x2a\xa5\xed\x80\x9f\x16\x9e\x2e\x2f\xca\xf0\x66\x48\x75\x94\xe1\x6d\xe1\xf9\x36\x5b\xa7\x77\xab\xcd\x71\xf4\x8b\xa3\x41\xe6\x78\xaf\x67\x61\xdf\x00\xd3\x9c\x14\x07\x55\x33\xcd\x76\xe5\xdf\xb6\x1a\x69\x94\x02\x06\x3a\x07\x3a\x07\x3a\x07\x3a\x47\x29\x60\x94\x02\x46\x29\x60\x94\x02\x86\x0b\x07\x2e\x1c\xb8\x70\xe0\xc2\x81\x0b\xa7\x29\x2e\x1c\x94\x02\x46\x29\x60\x94\x02\x46\x29\x60\x78\x48\xe1\x21\xdd\xe6\xa5\x80\xeb\x28\xd5\x5b\x23\xc9\x6e\x8c\x52\xd7\xc2\xbf\x9b\x9f\x14\xe5\x53\x44\x7b\xaa\x15\xfd\xd9\x88\x8f\x71\x2a\x56\x54\x37\xb2\xea\x0d\x9d\xfd\x28\x45\xfe\x67\x3f\xdd\xe7\xde\xf9\xca\x46\x3c\xf4\x80\xe5\xd0\xbc\x60\xec\x7f\x9e\xef\x1f\x7d\x42\x7a\x2f\x5d\xbb\x5f\x8a\x3b\x76\x69\x32\xf9\x5e\xa4\x24\x9d\x2a\x73\x4f\x1e\xa4\x03\xfe\x8e\x11\xf7\x5d\x6f\xc4\x63\x8e\x6b\x4b\xbe\xa3\x97\x16\xc4\x60\x4c\xd0\x09\x3e\x18\xa7\xa8\xe1\xd6\x44\x79\xa1\x38\x2f\x2f\x64\xb9\x89\x36\xd3\xde\x39\xe1\x07\x3a\x45\xf3\x0e\x3f\xd0\x66\x1a\xdc\xac\xa3\xe7\xcd\xc1\xaf\xc7\x51\x76\xd8\x1c\xe8\x5e\xe3\x4d\x7a\x78\x9c\x17\xe5\x4c\x9c\x92\x04\x90\xab\x0e\xe4\x92\x70\x08\xfb\x38\x84\x9b\x6e\x39\xff\x6a\x90\x26\x2c\xcb\xa9\xe9\x29\x25\x97\xcd\x67\xc6\x36\x26\x0c\x6b\x3e\x31\xc6\xdf\x1c\xe3\x06\x73\x05\x2d\x6d\xee\xa0\x16\x75\xf6\x99\x41\xf6\xf1\x7e\xba\xdf\x71\xcc\x15\x79\x4c\x68\x7f\xf5\xe0\xad\x53\x56\x93\x4b\x5a\x7a\xda\x6a\x32\x7a\x94\x47\x6d\xd9\xed\x5d\x12\xcd\xf9\xec\x3e\xaf\x15\xa7\x73\xb9\xb3\xca\x9a\xaa\x17\x94\x66\xd6\x6c\x6f\x51\xea\xa7\x0d\x7a\x93\xb0\xc0\x17\xe8\x3c\xb7\xc0\xdc\xc2\x57\x33\x70\x66\x3f\xc4\x64\xbf\xc6\x7c\x7a\xa2\x29\x52\xa3\x4c\xb0\xc9\x9b\x65\x09\xdb\xe4\x99\x17\x27\x0d\x9d\xcf\xa5\x39\x8c\x9e\xb8\x07\x64\x84\x42\xf0\x1a\x32\x42\xc1\x03\x0f\x0f\x3c\x3c\xf0\xdd\xe4\x81\x47\x46\x28\x64\x84\x82\xe7\x13\x9e\x4f\x78\x3e\xe1\xf9\xec\x08\xcf\x27\xd2\x3a\x21\xad\xd3\x76\xf1\xf5\x20\xad\x53\x2b\xd2\x3a\xfd\xf4\x15\x3a\x21\xb8\x9f\xf0\xfc\x5a\x09\x9c\xf2\x16\x53\x13\x99\xe3\xf9\xdf\x2f\x8d\x15\xb4\x74\x3a\xab\x17\xd7\xf9\xc2\x7c\x65\x3d\x9d\x51\x4b\x3a\xfb\xad\xcb\xec\xb3\x03\x74\xb7\x68\xc1\x8a\x42\x88\x57\x07\x80\x4b\x5a\x7a\xd6\x6a\x29\xc1\x5b\x8a\xc6\x8c\x43\x84\x03\x59\x86\x1c\x58\x68\x2f\xed\xb1\x7f\x87\xd3\x3e\xa4\x68\x02\xe5\x42\x8a\x26\x50\x2e\x50\x2e\x50\xae\x2e\xa2\x5c\x1d\x14\x46\xd1\x31\x94\x0b\xfa\x7e\x50\x2e\x50\x2e\x50\x2e\x50\x2e\xa4\x68\x82\x00\xf9\xd6\x81\x52\x1d\x2f\x40\xde\x96\x29\x9a\xd6\xe8\xbc\x50\x49\x9d\xa6\x05\xae\x92\x9a\xa1\x69\x3a\xee\xab\x92\x92\x61\x16\x66\xfe\x0f\x0f\x50\x54\x93\x38\xaa\xae\xda\xc2\xe2\x9c\x52\xf7\xe4\x71\xc6\x4a\x45\x74\x90\xf8\x2a\xf2\xb5\x9d\x15\x08\x6d\x97\x25\x43\xf6\xa2\x65\xe3\x62\xeb\x16\xf0\x32\x81\xb7\x9e\xa6\x73\x74\xa6\x4c\x9d\x7c\x94\x0e\x6f\xe2\x39\x21\x44\x1d\x29\x92\x1a\x54\xc4\xfe\x64\xaf\xef\x0b\x2e\xa4\xea\xe3\x5c\xaa\x6e\x58\x93\xe3\xb4\xb9\x51\x4a\xcb\x42\xfa\xbe\x48\x49\x5b\xfa\xbe\xe9\x46\x2f\x08\xfd\xfb\x19\x3a\xed\xd0\xbf\x6f\xb6\xd5\x46\xca\xe7\xd6\x64\xcd\xdc\x66\x30\x48\x4b\x1f\xfd\x9b\x91\x0a\xdb\x36\xe4\x99\xa4\xc8\xcb\xce\x4d\x89\x3d\x5d\x76\xce\x4e\x45\xd4\x4e\x8b\x87\x4c\x44\x20\xc4\x20\xc4\x20\xc4\x20\xc4\xc8\x44\x84\x4c\x44\xc8\x44\x84\x4c\x44\xf0\x54\xc0\x53\x01\x4f\x05\x3c\x15\xf0\x54\x34\xc5\x53\x81\x4c\x44\xc8\x44\x84\x4c\x44\xc8\x44\x04\x47\x20\x1c\x81\xdb\x3c\x13\x51\xab\xdd\x69\x75\x64\x3a\x4a\xbe\x99\x2e\xb3\xe7\x23\xcf\x59\x85\xcf\xa7\xe4\x07\x5d\xb8\x49\xf2\x69\x9e\xbe\x25\xac\xa7\xb4\x82\x3a\x12\xd6\xd7\x53\x57\x8d\x49\x0d\x7f\x6a\xaa\xb2\x26\xec\x6b\xa1\xa8\xf1\x8f\x63\x64\xa7\xa5\x86\x6f\x65\x7d\x74\xf6\x97\x97\xe9\xb0\x10\xe6\x17\x57\x94\x54\xcc\xec\x5f\xcf\x62\xcb\xa9\xdc\xba\x5e\x52\x8b\x45\x2d\xa7\xae\x18\x4b\xe5\x7c\x46\x67\x9f\xbc\xcc\xbe\x36\x40\x0f\x1b\x07\x4f\x3b\x8f\xb5\xf8\xfb\x78\x75\x79\xfe\x8c\x68\xf3\xbc\x96\x53\x13\xa2\x4d\xa1\xce\x3f\x5f\xde\xa0\x09\xe4\x2b\xf6\x87\x3a\x1f\xea\x7c\xa8\xf3\xe1\x7b\x81\xef\x05\xbe\x17\xf8\x5e\x3a\xc6\xf7\xd2\x39\xae\x05\x30\x6f\x30\x6f\x30\x6f\x30\x6f\x30\xef\xae\x66\xde\x80\x72\x80\x72\x5d\x0a\xe5\xb6\xa5\x3a\xff\x9a\x48\xd5\x3c\xce\x53\x35\xf7\x9e\x3b\xcd\x4e\xd0\x31\x3a\xe2\x2b\x52\xe5\xf8\xca\x94\xa8\x56\x52\xa2\xa6\xe4\x2d\x2d\x04\xb3\xc6\x33\xec\xb4\x64\x8d\xbe\x3c\x4d\xe2\xc7\xca\x6b\xf4\xa8\x89\xfc\xbd\x9d\xd5\xd8\xda\x23\x96\x6e\xdf\x03\xa3\x49\xd9\xfe\x16\x80\x34\xc1\xbd\xce\xd2\x22\x25\xcb\x64\xfb\x53\x74\xb0\xd1\x07\x08\x31\x17\x34\xfb\x0d\x6a\xf6\x7f\xac\x97\x4e\x0b\x53\x32\x4b\x09\x6e\x4a\x8e\xd0\x26\x46\x22\x2d\x09\x5d\xfe\x02\x9d\xb4\x75\xf9\x9b\x6b\xf1\x69\x21\xca\x4f\xd2\x29\x87\x28\x7f\x73\x4d\x06\xd9\xba\xda\x6c\x59\xed\xa6\x2a\xd0\xea\x05\x8a\xf7\xdf\x33\x5a\xcd\xd6\x0d\x7a\xea\xf8\x3d\xec\x9e\x94\xf1\xfb\xda\x3d\xeb\xf8\x96\x5b\x40\xc8\xf8\x81\x92\x81\x92\x81\x92\x81\x92\x21\xe3\x87\x8c\x1f\x32\x7e\xc8\xf8\xe1\xd2\x80\x4b\x03\x2e\x0d\xb8\x34\xe0\xd2\x80\x8c\x1f\x32\x7e\xc8\xf8\x21\xe3\x87\xc7\x10\x1e\xc3\x0e\xf4\x18\x76\x74\x41\xe1\xb6\xa3\xeb\xe6\xcb\xee\x3f\x49\x34\x68\x8c\xb2\xb1\x0d\xdf\x14\xf8\x96\xc4\xfe\x9d\x14\x79\x4f\x3f\xdd\x91\xd2\x8a\xea\x95\x8d\x78\xe8\x5e\xcb\xe9\x67\x12\xef\x47\xc5\x2f\x33\x5a\x51\xbd\xe4\xc8\xcc\xd5\x1a\xa8\x7d\x8c\x8e\xd0\x54\x99\x5b\x2f\x4a\x43\xbe\x7e\x0a\xe3\xb2\x8d\x71\x20\xaf\x26\xf9\x8d\x1e\x3a\x2c\x46\xd6\x3e\x9a\xe0\x23\x6b\x84\xea\x38\x9e\x4e\x08\xe7\xcb\x21\x9a\xb4\x9d\x2f\xf5\xb5\x30\x2d\x9c\x2d\x53\x74\xd0\xe1\x6c\xa9\xaf\x89\xcd\xd6\xfc\x5d\x08\x1e\xc1\x03\xec\x49\x67\x11\x5f\x39\x46\x23\x11\xe9\x3d\x36\xaf\x04\xc5\x7d\x51\xdc\xb7\x41\xb7\xe8\x76\x8c\x56\x1a\xa6\x25\x59\x3e\xb8\x4a\xc5\x77\xc3\xa8\xf2\xef\xe6\xd8\xda\x7a\x89\x17\x93\xbf\x21\x8a\xc9\xbb\x3c\x2e\xd2\xda\xbe\xc4\x7e\x76\x98\xbd\x7a\x1b\xbd\xc1\xb3\x45\xc3\xe0\xfe\x5a\x8f\xfc\x08\xdb\x2a\x19\xe3\x61\x8a\xce\x32\xe3\x98\xce\xc8\x33\x79\x95\xad\x8f\x39\x96\x54\x53\xd6\x62\x6c\x90\xb7\x3a\x68\x3b\xbb\x5c\xde\x0b\xad\xa0\x5a\xc0\x54\x2f\xa9\x4a\x7a\xc4\xa6\x3c\x9c\x64\x49\x26\x90\x2d\xa9\x6b\xf6\x58\x1d\x74\x81\x59\x47\xdb\xb1\xe8\x41\x7e\xba\x69\xaf\x9b\xbc\x14\xaf\x76\xf5\x1d\x1e\x5f\x95\xbc\x2e\xfc\xf1\xe3\xdc\x1f\x6f\x7c\x4f\xa6\xe9\x38\x1d\x6d\x60\xa6\xc2\xf5\x50\x73\x1b\x6a\x3e\x58\x28\xf4\xb8\xb7\x7d\xdf\xc1\x6e\xe7\x17\x46\xd7\x5e\x0c\x36\xf0\x17\xd9\xb2\x59\xe1\xb8\xca\x58\x96\xe6\xbe\xda\x03\x72\x17\x7b\x47\xb8\x19\xc2\xcd\x50\xf2\x18\x1a\x01\x68\x04\xa0\x11\xe8\x1e\x8d\x00\x4a\x1e\xa3\xe4\x31\x7c\xb3\xf0\xcd\xc2\x37\x0b\xdf\x6c\x47\xf8\x66\x93\x0b\x74\x92\xcd\x45\x66\x2c\xba\x32\xc4\xb1\x8a\xbc\x8a\x6a\xcb\xb9\x48\xbf\xb1\x67\x2b\x31\x0a\xaa\x27\xc3\xb1\x85\xea\xc9\xdb\x27\x14\x8e\xfd\x9b\x61\x3a\x27\xb1\xe7\x7a\x49\xd3\x53\x4a\x2e\x9b\xcf\x8c\x6d\x4c\x88\xb4\x4c\x02\x75\xfa\x78\x91\x38\xb8\xd2\xf2\x25\x25\x57\xd0\xd2\xe6\xd1\x6a\x51\x67\xdf\x1d\x62\x3f\xec\xa7\xfb\x1d\x0d\x5e\x91\x0d\x86\x5e\x96\xc0\x33\x9b\x4f\x67\x37\xb2\xe9\x75\x25\xe7\x62\x9f\xd6\x9c\xf5\x94\xd5\xf6\x92\x96\x9e\xb6\xda\x6e\x0a\xee\x8c\x45\x8f\x08\x60\x69\x5f\xdf\xa5\x89\xb2\xd2\x33\x3e\xe7\x5f\xcc\xea\x9d\x5e\xb2\x79\x4b\xa0\x65\x26\x98\x49\xce\xb2\x84\xc9\x24\xed\x7e\x97\x08\xd2\xa7\xb7\x1d\xf4\x71\x42\xa6\x4c\xdb\xed\x4d\x47\xef\x62\xc4\x7b\x80\xc7\x52\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\x82\x53\xb6\x99\x53\x6e\x3f\x15\x18\xf0\x25\xf0\x25\xf0\xe5\x36\xc2\x97\xaf\x0c\xd3\xa4\xc0\x97\x2b\x1c\x55\x6e\x04\x30\xcb\x6b\xda\x8a\x25\xce\xfc\x6f\x43\xec\x2b\xfd\xb4\x83\x1f\x78\x65\x23\x1e\xfa\xc5\x5a\xc4\x98\x49\x6d\xa5\x23\x34\x97\x0f\xf3\xd3\x25\x8c\x7f\x9c\xc2\xfc\xa4\xb6\x02\x3e\xd9\x80\xa8\xf2\x54\x30\xc0\x7c\x8a\xed\x96\x00\x93\x8f\x18\x89\x2e\x93\xda\x0a\x44\x92\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x80\x8f\x5b\x09\x1f\xc7\x29\xc6\x46\x22\x51\x0b\x3e\xde\xe3\x14\x49\x26\xb5\x95\x4a\x2d\x24\x70\x25\x70\x25\x70\x25\x70\x65\x0b\x71\xe5\x07\x86\xe8\x80\x54\x5b\x1a\x0b\x41\xaf\xf0\x72\xa7\xf0\x52\x92\x88\x6c\x4a\xd5\xd9\x77\x06\xd9\x37\xfa\xe9\xa1\xb2\xe3\xac\x1c\xd6\x1b\xb5\xe9\x2a\xa7\x97\x16\x96\x45\x8b\x4d\x92\x52\x0e\x0b\x29\xa5\xfb\xaa\x64\x3e\x6c\xfb\x64\xd0\x4d\x7a\x73\x49\x35\x18\x3b\x26\xd8\x89\x8a\xac\x32\x02\x3d\xda\xdd\x6b\xa6\xf0\xf0\x1e\x54\x50\x4d\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x02\x5c\x76\x24\xb8\x04\x24\x04\x24\x04\x24\xec\x62\x48\xf8\xda\x65\x3a\x2c\x20\xa1\xc8\x3c\x5e\x25\x91\x6f\x41\x4b\xa7\xb3\x7a\x71\x9d\xaf\xc9\x57\xd6\xd3\x19\xb5\xa4\xb3\x1f\xbb\xcc\x5e\x19\xa0\x9d\xe2\xe0\x2b\x1b\xf1\x50\x5c\xcc\x15\x8b\xf2\x2b\x67\x9a\x41\x53\xd2\xb8\xa4\xa5\x67\xad\x46\x12\xbc\x91\xe8\xb0\x71\x88\x48\x5b\xee\x94\x17\x7a\xec\xda\xe1\x58\x2f\x01\xac\x05\xac\x85\xc2\x86\xc0\x5a\xc0\x5a\xc0\x5a\xdd\x83\xb5\x3a\xa8\x6e\x5f\xc7\x60\x2d\x14\x94\x03\xd6\x02\xd6\x02\xd6\x02\xd6\xda\x8a\x82\x72\x5d\x4d\xa1\x50\xf1\xaa\x9b\x2b\x5e\x25\xb6\x21\x85\x4a\x5e\xa5\x33\x42\x0e\x35\x4f\xb3\x5c\x0e\xc5\xab\x33\xf9\x96\x31\x92\x75\xfd\x36\xe2\x31\x0f\x46\xb4\x98\xd5\x83\xb5\x50\xcf\x06\x6b\xa1\x0e\xb0\x7d\x52\xe9\x24\x4e\x27\x85\x50\x1e\x67\x74\xc5\x64\x56\xa9\x99\xc4\xa5\x4f\x91\x5f\xde\xe9\xc4\x65\xbb\xac\x2a\x58\x5e\x64\x6c\x8f\xd8\xda\x5e\x36\x26\x50\xd6\x22\x25\xe9\x54\x59\x7d\xac\x83\x74\xa0\xb1\x67\x82\xd2\xe7\x41\xa5\xcf\x51\xdd\xc9\xa7\xba\xd3\x3b\x7a\x7d\x5f\x66\x5a\x10\x46\x23\x41\x27\xb8\xd1\x98\xa2\x86\x07\x28\x9d\x15\xe5\xd8\x4e\xd2\x9c\x5d\x8e\x6d\x33\xed\x9d\x13\xc5\xd9\x4e\xd1\xbc\xa3\x38\xdb\x26\x1a\xac\xb5\x22\x5b\xeb\x0c\x5b\xf4\x4f\x46\x9c\x86\x6b\x48\x56\x3b\x75\x94\x8e\xd5\x56\x3d\x8d\xd8\x7e\xb1\xa7\x69\xc4\x66\xac\x03\xda\x69\xce\x2e\xd0\x79\x5a\x72\x9a\xb3\x68\x82\x4e\x34\xa0\xb7\x9d\xe5\xf7\x72\x8e\x5f\xa8\x0e\xd4\x0b\xd4\x0b\xd4\x0b\xd4\xdb\x45\xa8\x17\x13\xb9\x80\x89\x5c\xe7\xb0\xf0\xdf\xef\xa5\xff\xd2\xcb\xbe\xd5\x1b\xfa\x86\xf5\xa8\x7e\xa9\xf7\x82\x73\xf5\x99\xcd\x87\x75\xb1\x82\x0c\xaf\xa8\xab\xc2\x71\x6c\x51\x1a\xfb\x93\x25\xdf\x12\xde\x59\x8e\x29\x63\x5e\xcb\x8f\xe6\xd5\x8c\xc2\x1f\x89\x5c\x80\x3a\xa7\x96\x82\xd7\x5a\x83\x41\xce\x17\xb2\x6b\x6b\x6a\xda\x98\xbc\xe6\x6e\xda\x1e\x5d\xdb\xb4\x67\x73\x23\x72\x5d\x2a\x4a\xb8\x67\x8a\x4a\x8a\x8f\x93\xac\x96\xb6\x3e\x3c\xf6\xc7\x81\x3b\xcb\xcd\xe7\xb2\xae\x1b\x17\xe9\xec\x28\xc5\x38\xd2\xbc\x21\x79\x92\x55\xf1\xbe\x99\x4d\xc4\xc4\x75\xae\xa9\x4a\xde\xf3\x1a\x23\x8c\x5f\xc2\x12\xbf\x02\xaf\xf5\x36\x5c\x0e\x70\x39\xc0\xe5\x00\x97\x03\x5c\x0e\x5d\xed\x72\xf8\xad\x5e\xfa\x72\x2f\x7b\xad\x37\xf4\xaa\xf5\xb5\x7d\x7f\xef\xac\x23\xea\xb5\x90\x53\x15\x5d\xb5\x5e\xfd\xa5\xa2\x56\x50\x32\xfc\x3b\x2c\x56\xc6\x2e\xc1\x91\xf9\xb8\xed\xb0\x59\xe3\x81\xc7\x63\x93\xb1\xf0\xb2\xb0\x23\xe2\x23\x59\x50\xf3\xc6\x30\xb5\xbf\x22\x6a\x58\x2b\x16\xae\x2a\x79\x53\x00\x55\x5c\x57\xc7\x56\x95\x9c\x39\xfb\x8f\x88\xad\x91\xf0\x6a\x36\xaf\xe4\xb2\x7f\xc7\x34\xdf\x2b\x6a\x58\x49\x73\x7e\xaf\x8d\x09\x9c\x9b\xb6\xa7\x96\xa2\xf1\x41\xdd\x3e\x48\xcc\xb7\x63\xe1\xb9\x2c\x37\x49\x8e\x0b\xd7\x8a\x95\x77\x66\xfb\x4c\x4a\x62\xba\xcf\x67\x7f\x5a\xe9\x6a\x2c\x72\xaf\xb8\x9e\x59\xf3\x46\xdc\x4a\xaa\x77\xf6\xd3\x3b\xfa\xd9\xdb\xfb\x43\x7f\x6b\xc9\xe9\xbe\xda\xf7\x8c\xb4\x83\xc6\x10\xbd\xaa\xdd\x08\x67\x94\xe2\x8a\x92\x71\x81\x08\x6b\xa2\xa6\x16\x57\xb5\xe2\x9a\xd1\x17\x9e\x57\x7a\xae\xec\xe4\xfe\x17\xca\xa7\x35\xe6\x9c\x44\x40\x10\x63\x44\xa4\xd5\x54\x36\x6d\x4f\xac\xf9\xb7\x91\x2f\x73\xac\xde\x35\x3e\x4e\xf2\xcb\x61\x7e\xfd\x62\x8e\x6e\x34\xed\xa6\xe5\xa8\xb0\x44\x74\xee\x93\xc5\xc2\x02\x22\x71\x5b\xec\x9c\xad\x0e\x8a\x7b\x18\x34\xd6\x3c\xfc\x2f\xf7\xc0\xd0\x0f\x87\x07\x13\x4a\xea\x7a\xa6\xa8\xad\xe7\xd3\xc6\x5e\x5c\xbd\xc6\x77\x2a\xeb\x38\x31\x59\x91\x33\x20\x77\x23\xe6\x1d\xac\x58\x2d\x1d\x0e\x0f\xce\x6b\x45\xd5\xd1\x6c\x38\xa5\xe8\x29\x25\x6d\xdc\xbd\xec\x1f\xa1\x57\xe4\xed\xe9\x62\x3a\x5d\xd1\xe0\xaa\xd5\x46\x2c\x72\x5f\xa1\x7c\xdc\x38\xe7\x36\xf0\xe8\xc1\xa3\xd7\xa5\x1e\xbd\x64\x86\x16\x05\xe8\x9e\xa3\x19\x0e\xba\x8f\xd2\x61\x3a\xd4\x00\xbc\x5c\x2e\x29\xa5\x75\xbd\x49\xce\x31\x27\x1b\xae\x95\x27\x5f\x8b\x7a\xe3\xeb\xfb\xd9\x7d\xc2\x50\xd8\x46\x9c\xb6\x61\x8a\x1c\xf6\x1f\xaf\xd0\xac\x47\x81\x33\x5f\x49\xbd\x6f\x55\xb3\x77\x5d\x61\x5f\x19\xa0\xbb\x5d\x55\xcd\xe2\xa1\xfd\xd5\xb5\xf5\x3e\x95\xad\xa2\x13\xc6\x61\xce\x02\x64\xc1\xb5\xc7\x20\xb4\x87\xd0\x1e\x42\x7b\x78\x5f\xe0\x7d\x81\xf7\x05\xde\x97\x8e\xf1\xbe\x74\x8e\x73\x01\xd4\x1b\xd4\x1b\xd4\x1b\xd4\x1b\xd4\xbb\xab\xa9\x37\xb0\x1c\xb0\x5c\x97\x62\xb9\x6d\x29\xb4\x7f\x0b\x5d\x12\x28\xf1\x1c\x9d\xe1\x28\xf1\x24\xcd\xd1\x8c\xaf\x24\xd5\xc1\x9f\x62\x1b\xf1\x58\x95\x42\xf5\x81\x50\x31\x40\x16\x7f\x6d\x25\x18\x3a\x1e\x67\x47\x37\x51\xd5\x3d\x4e\x91\xbf\xda\x59\x81\xd4\xc2\x96\xfe\xde\x8f\x9e\xed\x13\x7b\x6c\x11\x3f\x13\xb8\xeb\x22\x2d\xd3\xd3\x65\x62\xfc\x69\x3a\xbe\xc9\xe7\x06\x31\x17\x54\xf9\x0d\xaa\xf2\xdf\xdf\x4b\xe7\x85\x21\x39\x4d\x0b\xdc\x90\xcc\xd0\xe6\x07\x24\x3d\x23\x54\xf8\x4b\x74\xd6\x56\xe1\x37\xa5\xe1\x37\x0a\x39\xfe\xd3\x74\xce\x21\xc7\x6f\x4a\xcb\x8d\xdb\x3d\x21\xd8\xaf\xcd\xee\xd5\x6e\xe4\x3c\x2c\x64\xf4\x9d\xa3\x15\x76\x6f\xc4\x53\xbe\xef\x67\x03\x8f\x89\xbd\x5d\x36\xd0\x4b\xc7\xdf\x1e\x6b\x08\x2d\x3f\x68\x32\x68\x32\x68\x32\x68\x32\xb4\xfc\xd0\xf2\x43\xcb\x0f\x2d\x3f\xbc\x1a\xf0\x6a\xc0\xab\x01\xaf\x06\xbc\x1a\xd0\xf2\x43\xcb\x0f\x2d\x3f\xb4\xfc\x70\x1a\xc2\x69\xd8\x81\x4e\xc3\xb6\x6b\xf9\xeb\x10\xdc\xb7\xc3\x05\xb7\x1d\x45\xfd\xaf\x0c\xd1\x7e\x21\xea\x2f\xae\x28\xa9\x98\xd9\xc7\x65\xa5\x34\x65\x15\xcd\xa2\x96\x53\x57\x8c\x85\x72\x3e\xa3\xb3\xbf\x18\x64\x7f\xd8\x4f\x0f\x18\x87\x4d\x3b\x8f\xba\xb2\x11\x0f\xdd\xa8\xad\x86\xe6\x79\x2d\xa7\x26\x44\x7b\x4d\x2a\xa2\x39\xc9\x0f\x38\x5f\x7e\x4d\x97\xe2\x8e\x53\x2d\x66\xf5\xd2\xbc\x56\x9c\xce\xe5\x2c\xb6\xaf\x77\x78\x48\x40\xf2\xba\x7f\x9e\xa8\xa6\xd7\xda\x34\xdf\xae\x5a\x6a\x5d\x5e\x4b\x07\xbf\x56\xd3\xec\xb8\x7c\xad\x7c\x87\x98\x7c\xc9\x1c\x0f\xc9\xfd\x62\x21\x22\x02\x11\x11\xa8\xa8\x09\x1f\x16\x7c\x58\xf0\x61\x75\x8f\x0f\x0b\x15\x35\x51\x51\x13\xbe\x03\xf8\x0e\xe0\x3b\x80\xef\xa0\x23\x7c\x07\xa8\xa8\x89\x8a\x9a\xdb\x85\x96\xa2\xa2\x66\x2b\x2a\x6a\x7e\xe9\x79\x8a\x08\x5c\xa8\x97\xb4\xa2\x92\x51\x1d\x8c\x30\xa5\x67\xd3\xc5\xac\xf1\x00\xd9\x07\x9e\x67\xef\x18\x20\x92\xfb\x5c\xd9\x88\x87\x06\xab\x67\xf7\x98\x59\x5e\x98\xe5\xc7\x46\x5f\x6f\xec\xb8\x2c\x0e\xbc\x14\xb7\x7e\xef\x70\x40\x87\x9c\x1d\x20\x54\xc8\xd9\x01\x42\x05\x42\x05\x42\xd5\x45\x84\xaa\x83\x44\xc4\x1d\x43\xa8\xa0\x6e\x05\xa1\x02\xa1\x02\xa1\x02\xa1\x42\xce\x0e\xc8\xef\x6e\x1d\xa0\xd4\xf1\xf2\xbb\x6d\x99\xb3\xe3\x0a\xcd\x0a\xfd\xd2\x51\x3a\xcc\xf5\x4b\xfb\x69\x2f\xc5\x7d\xe3\xd6\x4d\xea\xb4\x11\x8f\x59\x68\xa8\xa6\x0c\x1d\xcf\x04\xeb\x94\xf6\xb1\x09\xa9\x53\x72\xb3\x2d\x29\x4e\xb2\xce\x57\x5f\x45\xcc\xbf\xdc\xe1\xe2\x60\xcc\x4a\xc9\x61\x23\xaf\x37\x88\xdf\x5a\x08\xbd\x04\xa3\xe2\x29\x01\xca\x12\x6d\x8c\xd1\x68\x5d\x9d\x8d\xb8\x4a\xa4\xd5\x68\x30\xad\xc6\x1f\xf5\xd0\x09\xf1\xae\x1f\xa2\x49\xfe\xae\xc7\xa9\xde\xe1\x47\x73\x22\x89\xc6\x31\x3a\x62\x27\xd1\x68\xa0\x99\x79\x91\x32\xe3\x38\x1d\x75\xa4\xcc\x68\xa0\x9d\x0e\x34\x3b\x3c\xf3\x46\xf4\x37\x47\x5c\x66\xe7\x31\xcf\x8c\x18\xb6\x09\x8a\x88\xed\xb6\x09\xb2\xf6\x6b\x95\x31\x42\x9e\x0b\x10\x58\x10\x58\x10\x58\x10\x58\xe4\xb9\x40\x9e\x0b\xe4\xb9\x40\x9e\x0b\x78\x02\xe0\x09\x80\x27\x00\x9e\x00\x78\x02\x9a\xe2\x09\x40\x9e\x0b\xe4\xb9\x40\x9e\x0b\xe4\xb9\x80\xa3\x0d\x8e\xb6\x2e\xca\x73\x51\x1b\x71\xf6\x48\xaa\x1c\x40\x9f\x9b\x9f\x7a\xe2\x0f\x76\x0a\x2d\xb9\x57\x09\xc9\x97\xc6\x4c\x9b\xcc\x3e\xb3\x33\xf4\x83\x3e\xba\x23\xa5\x15\x39\xc9\xde\x53\x54\x0b\x39\x63\x09\x6a\xee\x60\x3e\x60\x7b\xee\x6b\xa5\x75\x88\x3e\x26\x77\x9e\xd1\x8a\xaa\x23\xb1\xfd\xbc\x3c\xb4\xc9\x48\xfb\x04\x1d\xa3\x23\x65\xfe\xb5\x11\x8a\xfa\x7a\x14\x8c\x5b\x32\x46\x81\x75\x5d\xc9\xf7\xf6\xd0\x51\x31\xb2\x0e\xd0\x3e\x3e\xb2\x62\x54\x57\x0b\x94\x10\xfe\x91\xc3\x74\xc8\xf6\x8f\xd4\xdb\x46\xd0\x70\x7c\xd4\x7b\x38\xde\xce\xfa\x0b\xeb\x25\xba\x76\x3a\x78\x04\x0e\xb1\x01\x39\xea\x22\x11\x39\xd2\xec\xd3\xbb\x32\x3f\x00\x6f\x55\xc7\x5b\x49\xb8\x1b\x7d\xdc\x8d\x07\x68\x1f\x9b\x88\x8c\x5b\xc9\x78\x1e\xe4\x5d\x20\x9f\x87\x35\xda\x22\xfd\xc6\xcf\x2d\x4d\xb1\xf3\x6a\x2f\xdd\x2e\x62\x66\xd8\xbf\xed\x65\xbf\xda\x4b\xfd\xc6\x7f\x42\xa1\x8c\x5a\x72\xac\xe7\xa7\x97\x16\xac\xb9\x50\xf4\xee\x8c\x5a\x9a\x5e\x5a\x90\x1f\xc8\xe6\x65\xa7\x99\xaa\x68\x68\xaa\xa2\xa1\xa9\x5a\x1a\x4a\xae\xd5\x55\x22\xa1\xca\x27\x70\x7a\x69\xe1\xa4\x61\x0a\x6a\x51\x71\xb0\x77\x46\xe9\xa2\x2c\x41\x9c\x5e\xcb\xf2\xe0\x90\xa2\x9a\xc9\x1a\x93\x4b\x77\xc2\xa2\x15\xb5\xa4\x98\x59\x8b\xd6\xd6\x4b\x8a\xb1\x08\xb8\xa1\xae\x5c\xd5\xb4\xeb\x2e\xcf\x92\xf9\xb9\x61\x1f\x19\x66\x5f\xbd\x8d\x1e\xf5\x6c\xf6\x8a\x6c\x2f\xf4\x6b\x3d\x72\xc6\xe1\x48\x66\x94\x37\x57\xb4\x66\x28\xd3\x19\x79\xba\x67\xc4\xe9\x66\x9c\xa7\x6b\x4a\x96\xa3\x11\x1b\x69\x71\x6c\x27\x01\x48\xb6\xa4\xae\xd9\xaf\xf5\xa0\x8b\x42\x3b\xda\x8e\x45\x45\xd8\xd2\xb4\xd7\x9d\x5e\x12\x37\x5a\xed\x16\x3a\x3c\x10\x6b\x4b\x32\x25\x3d\xee\xfd\x41\xdc\xc1\x6e\xe7\x17\x46\xd7\x5e\x0a\xfe\x24\x3e\xc7\xde\xe8\xf8\xf0\xf1\xc7\x60\x95\xbb\xa8\x32\xd6\xe5\xd7\xb3\xda\x13\x43\xfa\x24\x04\xa7\x21\x7d\x12\xa4\x11\x90\x46\x40\x1a\xd1\x4d\xd2\x08\xa4\x4f\x42\xfa\x24\xb8\xa4\xe1\x92\x86\x4b\x1a\x2e\xe9\x8e\x70\x49\x27\x17\xe8\x24\x9b\x8b\xcc\x58\x48\x6a\xc8\x89\xa4\xaa\x2d\xe1\x5a\x4f\xa9\x90\x89\x09\xfe\x3c\x64\x62\xda\x3e\x81\x73\xec\xa3\x77\xd2\x94\x44\xa1\xde\x39\xdb\x05\x02\xd5\xd5\xdc\xaa\xbe\xce\x0d\x5c\x71\x3d\xa7\xea\xc6\x1a\x44\xbd\xa1\xb3\xff\x46\x91\x6f\xdf\x46\x0f\x2a\x65\x99\xdb\x05\xe7\x7c\xdc\x0a\x52\x5b\x56\x73\xab\xcb\xe2\xf0\xf3\xc6\xe1\xe7\xf9\xe1\xd1\x71\xab\x6c\xb4\x33\xc7\x3a\x3f\xd8\xfb\x88\x26\x7b\xda\xde\x44\xcf\xd2\x33\x65\x9e\xb6\x93\x34\x57\xad\xdc\xad\xa3\x8b\xe4\x6d\xc6\xbc\x2f\x35\xf9\xf1\x5e\x51\x51\x77\x9c\x57\xd4\xed\x3d\x77\x9a\x13\xc3\xe6\x34\x4e\x2f\x08\xff\xdc\x25\xba\x60\xfb\xe7\x9a\xd8\xfc\x65\x11\xd7\xf4\x0c\x5d\x74\xc4\x35\x35\xb1\xfd\xcd\x16\x04\xd6\x82\x41\xe8\x22\x4b\xda\x55\x18\xfc\x32\xc5\xfb\x5c\x5e\x05\x41\x85\xff\x10\xfe\xc3\x06\xfd\x87\x4d\xf7\x03\x7e\x69\x88\x0e\x5a\x16\xdb\x2c\x2f\x32\xb6\x31\x61\x8c\xd4\x09\xe9\xab\xba\x6a\x95\x19\x29\x68\x69\xc5\x2a\x33\xa2\xb3\x1f\x1f\x62\x6f\xbd\x8d\xee\x77\x15\xba\x16\x47\x86\x5e\xee\xa9\xad\xda\x86\x4f\x09\x93\x26\x55\xde\x48\x08\xaf\x92\xa3\x88\xb6\xb8\x3c\x9f\xb3\xa2\x08\x47\x13\x8b\x70\x64\x82\xad\xea\x2c\x4b\x6c\xa2\xb6\x8d\x78\x94\x70\x24\xc1\x91\x04\x47\x12\x1c\x49\x70\x24\xc1\x91\x04\x47\x12\x1c\x49\x70\x24\xc1\x91\x04\x47\x12\x1c\x49\x70\x24\xa1\x0e\x07\xbc\x3f\xf0\xfe\xc0\xfb\xd3\x36\xef\xcf\xcf\xf5\xd1\x1e\xc1\x12\x57\x73\xda\x0d\xc3\x18\x17\xb5\x5c\xcc\x5a\xdc\x97\x7b\x81\xd8\x9f\xf7\xb2\x3f\xed\xa5\x5d\x8e\x9d\xa7\xcd\x7d\x2d\xaf\xcf\x43\xee\x80\x04\xeb\xf6\xa2\xd1\x8c\x5a\x9a\xf7\x38\x52\x7a\x7c\xa6\x97\x16\xcc\x25\x60\x27\x46\x2a\x14\xe8\xa2\x80\x73\x67\x69\x91\xc3\xb9\x79\x9a\xa5\x44\x63\x91\x0a\xe6\x7d\xd6\x14\xac\xf0\xe7\x7b\xe8\x7c\x70\x69\x65\xf1\x80\xca\xe3\xdf\xf8\xdf\x2f\xb9\x0a\x2e\x9b\x91\x0a\x3f\xb3\x87\x7d\xa4\x8f\x1e\xf6\xaa\xbb\x2c\x9e\xe3\x63\x45\x55\x49\x97\xf1\x04\x47\x65\xdd\x68\xdc\xd8\xee\x51\x22\x99\x1f\x6d\xd1\xd8\xb4\xe3\x90\xe6\x7a\xef\x92\x57\xfc\x39\x6a\x5d\xc9\x40\x79\xb7\x9a\x0e\x2b\xc7\xe5\x9a\xec\x34\x1b\x8c\x45\xe7\xd9\xac\x9f\xea\xbe\x9e\x62\xc5\x55\x42\xe2\x32\x6a\x89\x42\x2f\xef\xac\xf6\xc0\x9e\x30\x43\x1a\xfd\x9f\xd9\x3e\xb9\xcb\x16\x3e\xb6\xc4\x49\x9a\xa3\x99\x32\xa7\x6b\x23\x8f\x07\x29\xab\x90\x42\xb4\x41\x9f\xdc\x2f\xf6\x34\xc7\x42\xd0\x82\x70\xc3\x27\xe8\x84\xed\x86\x6f\xb0\xa9\x4d\x46\xcb\xd6\x66\xa4\x36\x57\x40\x5d\xd8\xb5\xe8\xaf\xdd\x5b\xcd\x0a\x3d\x20\x33\x4d\x28\x2e\xc3\xb3\x57\xfc\xba\x95\x76\xa7\x35\x99\x42\x61\x84\x02\x8c\x10\xb2\xd5\xb5\x25\x5b\x1d\xd2\x14\x21\x4d\x11\xd2\x14\xb5\x2a\x4d\x51\xf2\xd3\x3d\x4d\xce\xd5\x72\x5e\x28\xec\x4e\xd3\x82\x43\x61\xd7\xe2\xfc\x2f\x61\xef\x29\xc4\x4e\x76\x87\xe8\xa6\x76\xce\x22\x12\xff\xe7\x5d\xd5\x66\x11\xd1\x82\x52\x2c\x65\xb9\xf3\x59\x10\x8f\x2a\x8b\x9a\x89\x82\x52\x4a\x5d\xdd\xa2\xa9\xc5\x23\xe5\x0d\x8d\xf2\xab\xd9\xc3\x51\xc3\x2e\xe7\xc6\x35\xb5\x98\x51\x9d\x5b\x07\x9c\x5b\x79\x3c\xb6\x9a\xc9\xa6\x46\x2b\xf6\x73\xb5\x62\xfc\x7d\x53\x6e\x35\xae\x32\x71\x96\x16\x29\x59\xb6\x9c\x9a\xa2\x83\x0d\x8c\xa2\x25\xae\xd5\xc0\x84\x26\x60\x42\xf3\xd1\x3e\x7a\xa5\x8f\x7d\xb8\x2f\xf4\x41\xeb\xab\xf0\x72\x5f\xf7\xac\xaa\xca\xdc\x5b\x46\x3f\x73\xb9\x06\x77\xc1\x1a\x83\xd3\x16\x6d\x0d\xf9\x0c\xdc\x61\xfe\x71\x13\xea\x1e\x25\xc7\x8f\x34\x66\x71\xe2\x68\xbe\x07\x9f\x51\xe9\xe1\xa1\xa4\xae\xe5\x97\x84\x7a\xe9\x8c\xf1\x5a\xc8\xbf\x97\xcd\x97\xc5\xfe\x71\xd8\x7f\xb9\x97\xf8\x72\x0f\xbd\xd6\xc3\x5e\xed\x09\x7d\xde\x22\xb3\x1f\xea\x99\xd7\x8a\x29\x3e\xd9\xcb\x68\xbc\xdb\xb5\x70\x64\xd5\xf8\x29\x12\x9e\x76\xdd\x05\x67\xee\x62\x5e\xb6\xae\xdb\x3a\x8d\x51\x25\xc5\x6f\x9c\xab\x5f\x72\xd9\x94\xfc\xee\xaa\xb9\xb4\x1e\xd6\x6e\xc8\x3e\x15\xea\x90\x82\xaa\x15\x72\x6a\x2c\x2c\xce\xc8\xe5\x66\xe6\xb3\xe4\xec\xdb\xb3\x03\xac\xd3\x47\x6e\xe3\x97\xb5\x99\x6a\x37\x0d\xaf\x39\xdb\xf7\x39\xa8\x92\xfb\x82\xf7\x07\x25\x0f\xd2\x01\xb6\x2f\x32\x61\x05\x3d\x3d\xe4\x0c\x7a\x72\xb4\x5d\x19\xe3\xf4\x66\xba\xcc\x9e\x8f\x3c\x67\x1d\x39\x25\x67\xe2\xe2\x0d\xcd\xa7\xb9\x40\x3c\xac\xa7\xb4\x82\x3a\x12\xd6\xd7\x53\x57\x8d\x37\x83\x4f\xf2\x55\x65\x4d\xcc\x91\x0a\x45\x8d\x4f\x70\x23\x3b\x2d\xaa\xda\xd2\x5c\x3f\xff\x34\x46\xe7\xea\x48\x50\x53\x53\x6a\x9a\xcf\x8f\xb2\x77\xf4\x07\xa5\xa6\x19\xf3\x80\xbe\xd5\x22\xca\xa2\x47\x8c\x03\xb6\x3c\x09\x8c\x00\xc2\x6f\xeb\xa1\x55\xf1\x5e\x5c\xa1\x17\xf8\x7b\xf1\x0c\x5d\xa4\x65\xff\x90\x05\xcf\xbe\x35\x5f\x94\xaa\xb9\x50\x1a\xa7\x35\x19\xb5\x54\x6b\x22\x97\x26\xe5\x6d\xa9\x78\xd9\x42\xff\x9c\x82\xc6\xc1\x84\x37\x4b\xae\x3a\x14\x8e\xcb\x63\x3a\x63\x34\x24\xb2\x94\x21\xb5\x6c\x62\xd4\x9a\xd1\x80\x39\x13\x48\x74\x83\x24\xfa\x4f\xdb\x67\xb2\xae\x0b\x56\x9d\xa6\x15\x9b\x55\x77\xa0\x7d\xe4\x34\x7b\x6b\xed\x63\xf4\xfb\xf7\x06\xd9\xc7\xa7\x2c\xca\x5d\xd5\x24\x1e\x13\xbb\x75\x88\x45\x04\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\xf7\x26\xe0\x5b\x9b\x62\x33\xf1\x23\xaf\x0b\x9a\x79\x1c\x0e\x20\xe3\x55\xe7\x23\x47\x0b\x1d\x91\xb3\x15\xd4\xbc\xeb\x26\x41\xa0\xe6\xa0\xe6\x5b\x4c\xcd\x3b\x08\x0f\x6e\xed\xfa\x36\x18\xb6\x77\x70\x86\x31\xf6\x4f\xf6\xd0\x99\x60\x3d\x74\x3d\x52\xe8\xcf\x47\xd9\xcf\xf4\xd1\x03\x5e\xde\xe8\x40\x15\xf4\x88\x8f\x0a\xba\x1d\x02\xe8\xe7\xe8\xb8\x18\xcf\x07\xe9\x00\x1f\xcf\xe3\x14\xa3\x91\x20\x37\x50\x5d\x1e\xa0\x74\xf0\x40\x9d\x66\xc7\x37\xe7\x01\x0a\x94\x3d\xff\xc1\x0e\x9f\x87\x53\x83\xe2\x79\xcc\x5f\xf1\xdc\x0e\xd1\x61\x82\x4e\xd0\xb1\xb2\x79\x46\x9d\xcf\x08\x73\x0b\xd0\xe5\x06\xe9\xf2\xfb\x7b\x36\x6f\x21\x66\x05\x36\x36\x16\x66\x16\x36\xbe\xf5\xec\x4c\x61\xbd\x44\xd1\x4f\xde\xeb\x63\x67\xbc\x35\xcd\x31\x5f\x4d\x33\xe4\xcc\xb7\xac\xad\x01\xcc\x05\xcc\x05\xcc\x05\xcc\xdd\xf6\x30\xd7\x37\x76\xb2\xe3\x29\x6f\x7b\xe7\x0c\x81\xc8\x38\xf1\x4f\xef\xf2\x99\x36\xd4\x23\x62\x1e\xf5\x13\x31\x43\xbf\x0c\x12\x0b\x12\x0b\x12\x7b\x2b\x91\xd8\x5b\x06\x5c\x41\xb5\xec\x24\xb3\xff\x6f\x94\x4e\x37\x21\x53\x85\xc5\x65\xdf\x1b\x65\x3f\x51\x35\x45\xc5\x43\x3e\x70\x36\x1a\xad\x3d\x37\x45\x93\x99\xec\x1b\xeb\xab\xbc\x5c\x21\xcd\x0f\x1c\xd8\x2b\xc1\x03\xfb\x38\x3b\x6a\x8f\xdb\x4a\xfc\x1f\x38\xe8\x83\x78\xec\xd7\x76\x54\x7b\x28\x21\x7f\x28\x1b\x1d\xad\x2b\xff\xc4\x16\xd7\xd5\xae\x0c\x9b\xc0\xdc\x02\x24\xb6\x31\x12\x5b\x6f\x45\xf6\x4a\xbb\x50\x7f\x45\xf6\xfa\x6d\x4b\x80\x2a\xb7\x36\xd3\x53\xc7\x37\xd5\x43\x7a\xfb\x91\xaa\xc9\x25\x5e\xe7\x02\xb1\xd1\x91\x7a\xb2\x4a\x80\xbf\xde\x0a\x16\x06\xfc\x15\xfc\x15\xfc\x15\xfc\x75\xdb\xf3\xd7\x8e\xc7\xac\x4d\x5a\x89\x6c\x6a\x3a\x50\x03\x7d\xfd\x47\x55\xf3\x48\xec\xae\x01\xc1\x46\xf7\xd4\x91\x40\x02\xe4\x15\xe4\x15\xe4\x15\xe4\x75\x9b\x92\xd7\x96\xe3\xa9\x20\x22\xda\x8e\xaf\x46\x32\x4e\x63\x6c\x34\xb2\xc7\x62\xa7\xf7\x96\x53\xd7\x5b\x02\xb7\xfe\xef\x41\x1a\x15\xb8\x55\x2f\x69\x45\x25\xa3\x96\x33\x56\x51\x0b\x2e\xa5\x67\xd3\xc5\xac\xd1\x49\xec\x37\x06\xd9\x67\xfb\xe9\x1e\xb9\xbb\xf5\x91\x5c\xaf\xad\xf0\xdb\xcc\xf2\xc2\x2c\x6f\xa8\x49\xa5\xde\x44\x25\x84\x65\x71\x31\xf2\x63\x6b\x9d\x63\x31\xab\x97\x3a\xbf\x90\x5b\xd3\xeb\xb5\x05\xbe\x5f\x35\x15\x72\x7b\x3e\xf8\x1d\x3b\xc4\x26\xe5\x3b\xe6\x1e\x3c\xf2\xc5\xb2\x9e\x83\xc7\xdb\x85\xea\x6d\xa8\xde\x86\xea\x6d\xa8\xde\x86\xea\x6d\xa8\xde\x86\xea\x6d\xa8\xde\x86\xea\x6d\xa8\xde\x86\xea\x6d\xa8\xde\x86\xea\x6d\x4e\x4f\x23\xaa\xb7\xa1\x7a\x1b\xaa\xb7\xa1\x7a\x5b\x0b\xab\xb7\xfd\xf6\x1e\x4a\xd4\xaa\xb7\x4c\xe5\xd6\xf5\x92\xb1\x6e\xa9\x0c\x7f\xff\x07\x7b\xd8\x67\xab\xca\x2c\x9f\xf2\x90\x59\xce\x88\xf6\x5c\xf1\x90\xd5\x44\x97\x95\xfb\x37\x59\x78\xb9\xea\x1f\xd1\x72\x5a\x50\xba\x59\x4a\x70\x4a\x77\x84\xaa\x78\xb9\xdc\xc8\xbb\xf2\xaa\x4d\x0e\x57\x08\x46\x6c\x67\xd8\xe9\x1a\x31\x76\xe5\x69\x3c\x5c\xa1\x01\xa2\xcc\x9f\xaf\x5a\x1b\x6c\xc8\x5b\x94\xe9\xf1\x14\xe3\x01\x12\xcd\x56\x3f\xc8\x7a\xdd\x92\x41\x0f\x0c\x6e\x49\x88\x36\x1b\x14\x6d\xfe\x4a\x8f\x00\xfc\x71\x0e\xf8\x2d\xd5\xe5\xa6\xec\x47\x7b\xad\x54\x80\xa0\xb3\x36\x23\xd6\x68\x65\x43\x8f\x9b\x8f\x7e\xb9\xaa\xbc\xf3\x11\x4b\xde\xe9\x61\x98\xc6\xab\x8b\x3d\x5b\x6e\x97\x20\xf8\x84\xe0\x13\x82\x4f\x08\x3e\x21\xf8\x84\xe0\xb3\x3b\x05\x9f\xc1\xd9\x53\xdb\xbe\x2a\x4a\xfc\xbb\xaa\xf2\xcf\x78\x80\xfc\xd3\x63\x9a\x31\x56\x55\x0c\xda\xca\x59\x06\x04\xa1\xdd\x36\xb7\x81\x20\x14\x82\xd0\x2d\x16\x84\xae\x36\x75\xdd\xb9\x79\x79\x68\xdb\xbf\x20\xc9\xe3\x74\x94\x1d\x8e\x1c\xb2\x94\x9f\x8f\x39\xc5\xa2\x95\x2d\xb4\x21\xc3\xe9\xbb\x42\x74\x78\x4c\x29\x64\xab\xa5\x31\x95\x13\xae\xb7\xac\x6b\x25\xc5\x24\xb9\x63\x3a\xff\x8e\xb3\x2f\x3d\xcc\xde\xd6\x47\x77\xa4\xb4\xa2\xca\xd3\xd0\x70\x7c\x2b\xb6\x99\xf7\xe5\x88\x80\x90\x2d\x3d\x6d\xb4\x14\x1d\x34\xf6\x9d\xd1\x8a\xaa\x2b\xf1\x8c\x73\x17\x31\x57\x68\x32\xbc\x7d\x9e\xa6\xc5\x28\x9c\xa2\x83\x7c\x14\x4e\xd0\x38\xc5\x7c\x47\xa1\x71\x67\x3c\x21\x84\xf3\xc2\x36\x5b\x93\xeb\x5c\xf0\xc8\x1b\x61\x51\xa9\x3b\x76\x9d\xd8\x99\x12\x42\x8e\xcc\x48\x84\x42\x5f\xd9\x61\x3f\x03\x33\xf0\xbd\xc6\xc7\x10\x95\xbb\xb7\xfd\x49\x24\x0c\x33\x70\xa2\x6c\x0e\x50\xf7\xa3\xc0\x97\x1f\xcc\xb5\x41\xe6\xfa\x2f\x7a\x9a\x61\x0a\xe6\x05\xb6\x3d\x4e\x47\x6d\x6c\xdb\x0a\x93\x52\x9b\xcd\xf0\xb6\x0f\x5e\x96\x24\x00\xd8\x26\xde\x7a\x97\x6d\x52\x0e\x54\xac\x6d\x6a\xb3\x2d\x43\xfc\x4b\xdb\x56\xcb\x82\x95\x4d\xb7\xd9\x37\xac\x6c\xb0\xb2\xd9\xe2\x95\x4d\x5b\xe6\x94\x81\xeb\x99\xda\xbe\x10\xd5\xbf\x0a\xce\xef\x47\x72\x8a\x0e\xb2\x03\x91\x7d\xd6\x72\xe5\x61\x57\x6c\x9b\xf3\xb8\x5b\x22\xc8\xed\x0f\x1e\xa6\x63\xb2\x12\x72\xa1\xa0\x57\x59\x11\xa5\xd5\x42\x4e\xbb\xb9\xa6\xe6\x4b\xe5\xcb\xa1\x0f\x3c\xcc\xbe\xdf\x4b\x77\x18\xc7\x1b\xdf\xcd\xc1\xaa\xcb\xa1\x59\xab\x99\xe8\x93\xbc\xb4\x71\xa1\xa0\x3b\xbf\x93\xf6\xf6\x96\x2c\x84\x9e\xa5\x63\x62\xd0\x4e\xd2\x7e\x3e\x68\xc7\x68\x94\xf6\xf8\x97\x28\x29\x14\x74\xe1\x53\x34\xaf\x2a\x70\xc4\x9e\x0d\x1e\x90\x7b\xd8\xb0\x59\x7a\xa4\x50\xd0\xe5\x90\x74\x9c\xa2\x9e\xda\x0d\x9f\xdd\x61\xf7\x7c\x34\x68\x11\xe4\xe8\xfc\x41\xb3\x98\x70\x5b\xfb\x3f\xc1\x23\xf8\xca\x26\x0a\xf5\x3d\x00\xcc\x0d\xb0\xf6\x69\x70\xed\xf3\xbe\x9e\x4d\xbf\xfd\x33\x62\xe1\x73\x84\xa6\xec\x85\x4f\xd3\x4d\x48\x80\xaa\xa4\xc9\x16\x26\xf1\x3f\xee\xb4\x4d\xc8\xde\x9a\x17\x3d\x0e\x5b\xf2\x94\xa8\x7a\xd7\x36\x4b\x82\xe5\x4e\xb7\x99\x34\x2c\x77\xb0\xdc\xd9\xe2\xe5\x4e\xeb\x67\x8e\x81\x6b\x9d\xda\x0c\x7f\x55\x63\xef\xfc\x2a\x24\x27\x69\x3f\xdb\x1b\x89\x5b\xcb\x95\xd7\x3b\x97\x3a\x76\x03\xb7\xc4\x3a\xe7\x43\xc3\x94\x94\xeb\x9c\xf5\x92\xa6\xa7\x94\x5c\x36\x9f\x31\x96\x3b\x22\x89\x87\xcf\xa2\x87\x3f\x21\xe3\x85\xce\x15\xb4\xb4\x79\xa0\x5a\xd4\xd9\xd7\x86\xd8\x1f\xf7\xd3\xdd\x8e\xb6\x8c\xaf\xe7\xcb\x3d\xb5\x65\xfa\x38\x65\x35\xbb\xa4\xa5\xa7\xad\x66\x9b\x94\xf7\x63\x92\x1f\x30\x6d\x5f\x9a\xf3\xab\xec\x73\x6a\xa4\x03\x69\x42\x0e\x36\xc7\x68\x90\x53\x2e\x9f\xde\x76\xaf\xf0\x6a\x49\x39\x82\xa4\x20\x48\x0a\x82\xa4\x20\x48\x0a\x82\xa4\x20\x48\x0a\x82\xa4\x20\x48\x0a\x82\xa4\x20\x48\x0a\x82\xa4\x20\x48\x0a\x82\xa4\x20\x6d\x4e\x0a\xb2\xfd\xd0\x07\xd2\x8e\x20\xed\x08\xd2\x8e\x6c\xa3\xb4\x23\xef\x1d\x16\xf2\x74\x7d\x4c\xc0\x1b\x3b\xd5\x88\x1f\xa6\x14\xfb\x99\xf9\x46\xbe\x39\xc4\xbe\xdd\x4b\x3b\xc5\x8f\x57\x36\xe2\xa1\x37\x78\xe4\x17\xe1\xf8\x2b\xfa\x88\xb1\x85\xff\xe9\x72\xdd\xf1\x5f\x9a\xac\xbc\xb8\x44\x87\x05\xbd\xdb\x47\x13\x9c\xde\x8d\x50\x94\x86\x7c\xf9\xb9\xbc\xf5\x8d\x78\xac\x36\x50\x17\x20\x3e\x3f\x1f\xcc\xf1\xc6\xd8\xa8\xe4\x78\xae\x6e\x97\x24\x4f\x5c\x85\x93\xdb\x85\xfe\xe5\x0e\x67\x27\x3f\xe2\x9d\x01\x44\xf4\xf3\x63\x72\x63\x5b\xba\x3a\x71\x8c\x8e\xd0\x54\x99\x7b\xb2\x8e\xbe\x86\x3b\x12\x0a\x8b\x06\x15\x16\xef\xa9\x52\xf7\x7a\x53\xaf\xff\x09\xa1\xbb\x38\x44\x93\xb6\xee\xa2\xae\x16\x6a\xd4\x56\xb4\xc0\x4e\x44\xdf\x76\xaf\xd3\x4e\xdc\x63\xe6\xe0\xc8\x4b\xdb\xf0\xa8\xf8\xa1\x3d\xa6\x01\x49\x36\x90\x64\x03\x49\x36\x90\x64\x03\x49\x36\x90\x64\xa3\x91\x24\x1b\xed\x4c\x8b\xd1\xdc\x8c\x1e\xb5\x27\xd9\xa8\x6d\x0e\xe0\xf7\xb9\xf7\x9c\x1b\x24\xfe\xcb\x9d\xce\x39\xc0\x93\x01\x69\x33\xc4\xc4\x60\x57\xc1\xd2\x29\xb4\x72\x5e\x00\x35\x65\xb7\xcd\x46\xa0\xa6\x84\x9a\x72\x8b\xd5\x94\x2d\xa6\x41\x81\x52\xca\x16\xac\xf3\x92\x13\x34\xce\x62\x91\x11\xcb\x35\x70\x9f\x53\x4e\xc9\xf7\xbf\x25\x94\x94\x7f\xf6\x02\x4d\x09\x3c\x99\xd2\xb4\x62\x3a\x9b\x2f\xcb\x87\xec\x07\x29\xf9\xd4\x5b\x67\x1f\x7b\x81\xfd\xe3\x01\xba\xc7\x79\xac\xf1\x49\xdc\x2d\x3c\xe6\x45\xe9\xeb\x33\xe7\xd2\xda\x6a\xd8\xe8\xef\xf0\xa2\x71\x70\xf4\x09\x63\xa7\x19\xc7\x91\xce\xcf\x22\xdf\xa5\xc3\x35\x8c\x09\xc8\xf8\x20\xe3\x4b\x40\xc6\x07\x19\x1f\x64\x7c\x90\xf1\x75\x8d\x8c\x2f\xd1\x31\x32\xbe\xa6\x5f\x49\xc3\x32\xbe\x04\x64\x7c\x90\xf1\x41\xc6\x07\x19\x1f\x64\x7c\xed\x97\xf1\x25\xba\x5a\x13\x97\x80\x26\xae\x75\x9a\xb8\x44\xa7\x6b\xe2\x12\xdb\x50\x13\x97\x7c\xb3\xbf\x97\x68\x4e\x80\xc4\x63\x74\x84\x83\xc4\x03\xb4\x8f\x26\xaa\x64\xa1\x72\x20\xab\x8d\x78\x8c\x43\xa3\xc5\xac\x6e\xe9\x43\x1e\xf3\x26\x87\x77\xb0\xdb\x44\xe9\xf7\x37\x06\x83\xc3\xfd\x6c\xaf\x87\x43\xc8\x03\x96\x49\x94\xc8\xaf\x81\x22\xef\xd8\x59\x49\xc5\xee\x16\x1f\xa2\xb0\x22\x01\xd8\x6e\xf1\xff\xf6\x20\xb0\x46\x13\x96\x7a\xf4\x30\x7c\x32\x90\x94\x35\x28\x29\xfb\x93\x2a\x92\xb2\x3a\x13\xd0\x79\x0c\xcc\x86\x32\x99\x7a\xb5\x73\x52\x38\xc6\x4f\xd0\x31\x87\x63\xbc\x81\x86\x82\xed\x50\x41\xab\xdd\x0e\xd5\x68\x7b\x5c\x72\xb5\x6f\x8e\x54\xda\xa1\x90\x94\x24\x38\xf4\x1d\xda\xaa\xb4\x49\xa3\x62\x9b\xdb\x26\xcd\x58\x3b\xb6\xd6\x3a\xb5\x46\xcf\x06\x40\x0b\x40\x0b\x40\x0b\x40\xdb\x3d\x80\x16\xf3\xb3\x80\xf9\x59\xe7\x10\x6c\x68\x89\xdb\xa2\x25\x86\xa3\x00\x8e\x02\x38\x0a\xe0\x28\x80\xa3\xa0\xab\x1d\x05\x08\x29\x41\x48\x09\x42\x4a\x5a\x15\x52\x02\x3f\x1c\xfc\x70\xdd\xea\x87\x4b\x66\x9a\x5c\xb2\x38\x48\x14\x1f\xf5\x46\xca\xf7\xb3\xfb\xc4\xdb\x6c\x5b\xda\x16\xe2\xe5\xed\xa8\x78\x7f\x75\x90\x86\x85\xe2\x5d\x98\xc0\x31\x59\xdb\x72\xac\xa0\xa5\xd3\x59\xbd\xb8\xce\x61\xf0\xca\x7a\x3a\xa3\x96\x74\xf6\x33\x83\xec\x1f\xf4\xd3\xdd\x62\x57\xbb\x52\x72\x75\x7d\xfb\x92\x96\x9e\xb5\x5a\x4a\xf0\x96\xa2\xfb\x8c\x43\x84\xc9\x94\xd5\x91\x3d\xf6\x9a\xd7\x8a\xd3\xb9\x9c\x05\xd9\x9b\x97\x65\xbf\x45\x49\x7c\xd7\x44\x08\xe1\x38\x0f\x21\x34\x06\xfd\x0c\x4d\xd3\x71\x5f\x1f\x89\xfc\x4c\x9a\x15\x51\x3d\x3a\x60\x31\xab\x07\xc7\x83\x04\x79\x75\x2f\x07\x0f\xf7\xc3\xec\x90\x1c\xee\xe2\x9a\xe4\x08\xf7\xb8\x22\x8f\x1a\xa8\x90\xfd\x43\xf6\x8f\xec\xbd\xf0\x2a\xc1\xab\x04\xaf\x52\xf7\x78\x95\x90\xbd\x17\xd9\x7b\x41\xf3\x41\xf3\x41\xf3\x41\xf3\x3b\x82\xe6\x23\xb7\x2e\x72\xeb\x6e\x17\x7e\x89\xdc\xba\xad\xc8\xad\xfb\xd6\x61\x3a\x20\x50\x9e\x5e\xd2\x8a\x4a\x46\x75\xe4\xad\x10\x95\xc0\x36\xb4\xdc\xfa\x9a\xaa\x94\x4a\x4a\xea\xaa\xb3\xda\x31\xfb\xfc\x10\xfb\x61\x3f\x91\x3c\xee\xca\x46\x3c\xf4\x29\x59\xee\xcb\x59\xe3\x2b\x6f\x1a\x33\x93\xec\x5d\xe2\xed\x4d\x5b\xed\x35\xa5\xc8\xd7\x88\x3d\x83\xe1\xb3\x34\xf9\xbd\x33\x26\x41\xf6\xd4\x6c\xd0\x35\x1b\x76\xb4\x1d\x8b\x3e\xc6\x4f\xb7\x2c\x6e\xe5\x52\xbc\xfc\x1a\x3b\x1d\x22\x6e\x45\x25\xb0\xba\x10\xa1\x7b\x70\x49\x54\x58\xde\xcb\xee\x2a\x60\xfe\x29\x6b\xf8\x8d\x83\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\x82\x21\xb6\x9b\x21\x1e\xa5\xc3\xec\x50\x64\xd2\x12\x30\xed\x72\xa6\xf9\x2c\x5f\xe3\x55\x66\xfc\x04\x82\x04\x82\x04\x82\xec\x62\x04\xf9\x2d\x46\x93\xc6\xa3\xab\x92\x2a\xb7\xa0\xa5\x4d\xec\x38\x56\x28\x6a\x2f\xde\x1c\xfb\xbb\x86\xa9\x79\x89\x7d\x80\xb1\x7f\xd6\x4b\x77\xa4\xb4\x22\x07\x90\x4f\xa6\xb4\x7c\xde\xb0\x7a\x27\xe7\x2e\xd8\xd8\xa7\xa4\x85\xf9\x41\xc6\xf5\x2f\x69\xe9\x68\x54\xee\x35\xa3\x15\xd5\x4b\xf1\x93\x6a\xc9\x0e\xc9\x5f\xd2\xd2\x4b\xc6\xae\xcf\x64\x4b\x57\x97\x94\xd2\xd5\x89\xbe\xe8\x58\x54\x30\xb6\x49\xda\x25\x18\xdb\x83\x74\x3f\x67\x6c\xaf\xa3\x3b\x3f\xde\xb3\x83\xe4\xf0\x08\xe4\x65\x4f\x78\xf3\x2c\x62\x3b\xe4\xe5\xd0\xb5\xa7\x83\x91\x5a\x8c\x8d\x78\xe4\x52\x89\x44\x6c\xf5\x1d\xbf\x7e\x19\xb8\x4f\x21\xcf\xde\x59\xba\x58\x73\xef\x2c\xad\xb7\xa7\x77\x6a\xbb\xf5\xa0\xdb\x75\x01\xc4\xe0\x0e\x8f\xfc\x73\x47\xef\x3c\x65\xf5\xce\xb9\xe5\x2a\xdd\xb3\xc7\xdd\x3d\x9a\xbe\xcd\x46\x4f\x3d\x5d\x18\xfd\x39\x47\xff\x0c\x9a\xfd\x33\x3b\xb7\x38\x77\x61\xce\xbf\x87\x46\x5d\x3d\x24\x12\x49\xdc\xba\x7d\x34\xf1\xf3\x8e\x3e\x1a\x32\xfb\xe8\xdc\xd2\x85\x85\x73\x67\x97\xfd\x3b\x29\xe6\xea\x24\xd9\xf0\xf6\xea\xa5\xe0\xbe\xb1\xfb\x71\xca\xf3\x4d\x3b\x35\x37\x3d\x5b\xeb\x9b\x76\x4a\x55\xd2\xdb\xab\x7f\xea\x19\x45\x89\x9f\x75\xf4\xcf\x80\x65\x89\xa6\x2f\xcc\x9c\xf2\xef\xa0\x11\xb7\x29\x32\x3e\xac\xb7\x6e\x0f\x25\x8f\xd0\x14\x3b\x18\x39\x60\x2d\x33\x1e\x71\x2e\x33\xca\x8e\xdc\x8a\xba\x02\xfb\x69\x2f\x8b\x47\xc6\xac\x33\x3c\x60\xfc\x6b\xce\xb4\xcc\x79\x50\x84\x6f\x73\x1e\xa6\xd0\x15\xf6\x42\xe8\x4d\xe6\x6c\x6d\xda\x78\x56\x7c\x5d\x7f\x55\x0d\x5f\x3c\xbf\x18\x36\x5b\x59\xd7\x55\x6b\x8a\x99\x5a\x2f\x16\x8d\xa5\x9c\x18\x0d\xe6\xe2\xc4\x18\x1e\x5a\x3a\x26\x4e\xe1\x0c\xd7\xf8\x91\x41\x7a\xc8\x9c\x60\x19\x4b\x97\x6c\x4a\x55\x52\x29\x6d\x3d\x5f\xd2\xd9\x77\x07\xd8\x37\xfb\xec\xa1\x37\x52\x3d\x2a\x63\x59\x1c\x3d\x2d\x8e\x8e\x0e\x89\xf2\x03\xc6\xe8\x73\x6f\xd9\x6e\x41\x18\x8a\x48\x7b\x35\xce\xd3\x5e\x19\x6f\xc4\x24\xed\xa7\xbd\x55\x12\x55\x15\x55\x1e\x67\xe4\xba\xe9\x9a\x02\x2f\x96\x82\x5f\x8c\x51\xb6\xa7\xda\x14\xcf\x7d\x52\x0a\x0a\xe5\x80\x9b\x14\x6e\x52\xb8\x49\xe1\x26\x85\x9b\x14\x6e\x52\xb8\x49\xe1\x26\x85\x9b\x14\x6e\x52\xb8\x49\xe1\x26\x85\x9b\x14\xa1\x16\xf0\x73\xc2\xcf\x09\x3f\x67\xbb\xfc\x9c\xbf\x7a\x99\xf6\x88\x50\x0b\xc5\x58\x74\x65\xb2\xbc\x40\xb4\xbb\x54\xa8\x5c\xea\x67\x53\xaa\xce\xfe\xde\x65\xf6\x99\x01\x62\x65\x3b\x73\x37\x43\x75\x4a\x37\xbd\xb4\x20\x21\x51\xf4\x71\x63\xcf\x69\x77\x0b\x97\xe2\xf6\x0e\x1d\x0e\xe6\x50\x1e\x14\xf0\x0a\xe5\x41\x01\xaf\x00\xaf\x00\xaf\xba\x08\x5e\x75\x50\x72\xf5\x8e\x81\x57\xc8\xfa\x0d\x78\x05\x78\x05\x78\x05\x78\x85\xf2\xa0\x48\x4b\x7c\xeb\xb0\xa6\x8e\x4f\x4b\xbc\x2d\xcb\x83\xbe\xe4\x5f\x23\x70\x45\x28\x9d\xde\x44\xcf\x72\xa5\xd3\x32\x3d\x4d\xe7\x3c\x95\x4e\xc6\x00\x19\x55\x32\x19\xa3\x17\x4b\x5a\xd1\x4e\x16\x51\x8e\xaf\x36\xe2\x31\x9b\x28\x39\x6b\x87\xbe\x39\x58\xec\x74\x94\x1d\x96\x02\x27\x6f\x28\xe6\xd2\x00\x0a\x01\x94\x7d\xae\x40\xf1\x53\xe4\x9d\xe4\x09\xd0\x1e\x30\xcb\x88\xe6\x9d\xb0\xec\x09\xf1\x6b\x3b\x70\x99\xa0\x5b\x0a\x5d\xa1\x17\xca\x4a\x89\x9e\xa1\xd3\x4d\x7c\x1a\xa8\x63\x85\x3a\xa3\x0d\xd6\x19\xfd\x5c\x2f\x5d\x16\xa6\xe2\x19\xba\xc8\x4d\xc5\x39\x6a\xee\xe0\xa4\x94\xa8\x35\xfa\x3c\x3d\x67\xd7\x1a\x6d\xfa\x49\xd2\xa2\x10\xe9\x0b\xf4\x26\x47\x21\xd2\xa6\x9f\xa5\xf1\x84\xdb\xa2\x7c\x69\x6d\xa6\xb2\xc2\x00\xd6\x6e\x3b\xa3\x7f\x34\xe2\x69\x0a\x1f\xf7\xac\x64\xea\xb0\x8a\x7b\xc4\x0e\x15\x56\xd1\xae\x68\xda\x32\xfb\x88\x62\xa6\xc0\xc9\xc0\xc9\xc0\xc9\xc0\xc9\x28\x66\x8a\x62\xa6\x28\x66\x8a\x62\xa6\x70\x6b\xc0\xad\x01\xb7\x06\xdc\x1a\x70\x6b\x34\xc5\xad\x81\x62\xa6\x28\x66\x8a\x62\xa6\x28\x66\x0a\xaf\x21\xbc\x86\x5d\x54\xcc\xb4\xe5\x7e\xb9\xe6\x97\x1c\xfd\x57\xbb\x68\x51\x88\xe7\x53\x6a\x51\xba\x45\x55\xdd\x56\xce\x8b\xfa\xa3\xce\x6d\xd9\x4c\x3e\x9b\xcf\x98\xb3\x2a\x33\x7b\x98\x52\x28\x14\xb5\x0d\x25\xc7\xbe\xfe\x08\xfb\x6e\x1f\x3d\xe0\x3c\xc2\xaa\x4d\x7a\xb0\xa8\x2a\xe9\xb0\xb9\xab\x39\x3a\xec\x89\xf3\x8c\x7d\xd0\xb2\x38\xcd\x79\x71\x9a\x28\x3f\xd2\xb1\x59\x97\x85\x4a\x7d\x8f\x98\x96\x27\x69\x2e\x39\x4f\xae\xd3\x73\x62\xf4\x2d\xd3\xd3\x7c\xf4\x9d\xa6\x05\x3a\xe9\x9f\xd0\xc2\xd9\xa7\x66\x6d\x51\xdf\x6b\x0e\x1c\x8b\x6f\x09\x1e\x5f\x67\xd9\xa2\x59\x2c\xb7\xf2\x79\xca\x01\xe5\x7f\x01\x15\x05\x45\xaf\x3d\xea\x3d\xfc\x6f\x67\xfd\x19\xb5\x44\xa1\xef\xed\xf4\x79\xd4\x87\x8b\x6a\x21\xa7\xa4\xd4\x86\x9e\xb6\x79\xf0\xd6\x3f\xf0\xc4\x0b\xf4\x26\x7a\xb6\xcc\x95\xdc\xbc\x27\x0e\x82\x08\x37\x72\x83\x6e\xe4\xdf\xe9\x69\xa9\x29\xba\x22\x5c\xc8\x6f\xa4\x4b\xb6\x0b\xb9\x7b\x6d\x5d\x61\xbd\x44\x89\xef\xdc\xe5\x63\xeb\x66\x0b\x4a\xb1\x94\xe5\x8e\x35\xb1\x24\x6f\xc8\xe8\x1d\x2a\x18\x33\xaa\xad\x35\x79\x8f\x94\x37\x34\xca\x2f\x6a\x8f\xf1\xe7\xd4\x2e\xe7\xc6\x35\xb5\x98\x51\x9d\x5b\x07\x9c\x5b\xf9\xa4\x46\xcd\x64\x53\xa3\x15\xfb\xb9\x5a\x31\xfe\xbe\x29\xb7\x1a\x57\x99\x38\x4b\x8b\x94\x2c\x33\xb7\x53\x74\xb0\x81\xe9\x1d\x4f\xdb\x06\xfb\x1a\x64\x5f\x3f\xda\x47\xaf\xf4\xb1\x0f\xf7\x85\x3e\x68\x51\x85\x97\xfb\xba\xc7\xbe\x96\x31\x55\xa3\x9f\xb9\xaf\x9a\x73\x7f\x63\x70\xda\x01\x90\x43\x3e\x03\x77\x98\xc3\x11\x21\x6d\x50\x72\xfc\xc8\xbc\x96\x1f\x15\x47\xf3\x3d\xb8\x63\x46\x0f\x0f\x25\x75\x2d\xbf\x24\x22\x01\xcf\x18\xaf\x85\xfc\x7b\xd9\x7c\x59\xec\x1f\x87\xfd\x0d\x7f\xe2\xcb\x3d\xf4\x5a\x0f\x7b\xb5\x27\xf4\x79\x6b\x85\xf6\xa1\x9e\x79\xcd\x58\xcf\x67\xf5\x70\x46\xe3\xdd\xae\x85\x23\xab\xc6\x4f\x91\xf0\xb4\xeb\x2e\xf8\xd2\x56\xb8\x77\xd6\x75\xdb\x49\x3d\xaa\xa4\xf8\x8d\x73\xd7\x7f\x2e\x9b\x92\xdc\x46\xcd\xa5\xf5\xb0\x76\x43\xf6\xa9\x70\x8d\x17\x54\xad\x90\x53\x63\x61\x71\x46\x1e\xba\x69\x3e\x4b\xbe\xc4\xf4\xec\x00\xeb\xf4\x91\xdb\xf8\x65\xb9\x34\x95\x5b\x3b\xa7\xf6\x2f\x87\xc5\x2f\x9d\x6a\xfc\x10\x55\x7c\x4d\x36\xf1\x65\x4a\xce\xd3\x2c\x4b\x44\x4e\x58\x29\x0f\x9f\x72\xa6\x64\xf4\x3d\xae\xf5\x29\xe0\xd9\x77\x86\x68\xc2\xa7\xaa\x9d\x58\x28\x8a\xd2\x76\x29\x3d\x9b\xd7\xd2\xaa\x55\xd1\xee\x63\x43\xec\x4f\xfb\xe9\x1e\xbb\xa2\x9d\xf8\x6e\x7e\xa4\x96\xb2\x76\x33\xcb\x0b\x67\xb5\xb4\xda\x11\xd5\xec\x42\xee\x6a\x76\xe2\xeb\x2c\xae\xaf\xc3\x03\xbe\xb7\xa4\x92\x5d\x50\xa5\xb9\x6b\xcf\x05\xbf\x5a\x93\x6c\x7f\xb5\x52\x77\xb2\xf7\x2b\x27\x73\x48\xcf\x88\x08\x77\xa4\x67\x84\x24\x11\x92\x44\x48\x12\xbb\x48\x92\x88\xf4\x8c\x48\xcf\x08\x29\x18\xa4\x60\x90\x82\x41\x0a\xd6\x11\x52\xb0\xe4\x3e\x9a\x60\xe3\x91\x98\xc5\x32\xee\x77\xb1\x0c\xb1\x7c\x43\xf1\x3a\x24\x75\xdc\xb6\x92\x19\x24\x75\x6c\x45\x52\xc7\x8f\x0e\xd2\xb0\x20\x8d\x79\xb5\x74\x43\x2b\x5e\x37\xe6\x78\x65\xb0\x91\xcb\x50\x74\x5d\xd5\xd9\xdb\x06\xd9\x5f\xf5\x11\xb3\x77\xb5\x18\xe3\x53\xd5\x53\x3a\x2e\x88\x26\xa2\xbc\x3e\xcb\x59\xeb\x70\xc9\xf6\xe4\xd6\xed\x56\x75\xc5\x3f\x6a\x96\x92\x02\x02\xce\xd0\x34\x87\x80\x87\xe9\x10\x4d\xfa\x92\x76\x47\xcf\x9b\x9c\x5d\xf6\x88\x33\x19\x41\x40\xaa\x80\x6b\x2f\x04\x43\xbe\x29\x76\x50\x42\xbe\x8a\x87\x2d\x39\x9f\x3c\x2f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\x1f\x38\xdf\x96\x73\x3e\x10\x3b\x10\x3b\x10\xbb\x2e\x26\x76\x6f\x8d\xd2\x29\x41\xec\x44\xc8\xeb\xd8\x86\x29\x07\xb4\xca\x3a\x4b\x41\x20\xff\xfb\xa5\xb1\x82\x96\x4e\x67\xf5\xe2\x3a\x5f\x99\xaf\xac\xa7\x33\xaa\x15\x4e\xc6\x3e\x31\xcc\x5e\xbe\x8d\x76\x8a\x96\xae\x6c\xc4\x43\xbf\x5a\x8b\x56\x70\x49\x4b\xcf\x5a\x2d\x26\x78\x8b\x1d\xa1\x1b\x8c\xf2\xd3\x89\x38\xde\x4b\x71\x57\x2d\xf1\xf2\xeb\xed\x74\xb6\xd8\x91\x3a\xc2\x67\x83\x11\xe3\x01\xb6\xcf\xa3\xf8\xb3\x18\x5f\x76\x95\xf4\xf2\xa7\x01\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\x08\xbc\xd8\x6e\xbc\x78\x82\x8e\xb1\x23\x91\x29\x4b\x46\xf8\xb8\x53\x46\xe8\xb1\x72\xab\x94\x14\xbe\x99\x2e\xb3\xe7\x23\xcf\x59\x2d\x4c\xc9\x6b\x17\xa1\xcd\xc6\x14\x69\xbd\x74\x35\xac\xa7\xb4\x82\x3a\x12\xd6\xd7\x53\x57\x8d\xe7\xc7\xe7\xc0\xaa\xb2\x26\x80\x4a\xa1\xa8\xf1\xbe\x8a\xec\xb4\x30\x06\x44\x8b\x40\xa0\x40\xa0\x40\xa0\x1c\x81\x7e\xeb\x11\x3a\x5b\x86\x40\x85\x52\xb1\x7e\x02\x3a\xa6\xf3\xf4\x64\xec\xc7\x1e\x61\x9f\xea\xa3\xbb\x2d\x10\x2a\x54\x8d\xe3\x3c\x91\x96\xd8\xa5\x32\xc7\x88\x87\x39\x8c\xee\x33\x8e\x30\x09\x24\x6f\xa4\x2a\x86\x14\xc9\xd1\x9a\x9c\x3c\x2b\x4b\x67\x05\x3b\x3c\x49\x73\x9c\x1d\x1e\xa7\xa3\x74\xd8\x57\x7e\x28\x93\x3d\x9a\xd2\x43\x2f\x3c\x17\x44\x0e\xab\x67\xaf\xba\x76\x39\x98\x1b\x1e\x66\x87\x6a\x65\x85\x15\xda\xc4\xd0\xfb\x77\x56\x3c\xb9\xbd\x66\x5e\xac\x7a\x1e\xde\xa4\x3c\x68\x6b\x9f\x5f\xe2\x69\x32\xbe\x70\xee\xe4\x2c\x9b\x7b\x80\xc8\xcf\x82\xfc\x57\x0d\xe6\xbf\xfa\x4c\x4f\xd3\xad\xc9\xb2\xc8\x79\xb5\x48\x49\x3b\xe7\xd5\x16\x9a\xa8\xc2\x7a\xeb\x4d\x54\xe2\x97\xef\xaa\x30\x51\x47\x2a\xd2\x59\xd5\x63\xab\xf6\x17\x9c\xbe\xae\xf6\x5b\x2a\xa4\xb0\xea\x36\x13\x89\x14\x56\x48\x61\xb5\xc5\x29\xac\xda\x3f\xb3\x0d\x4c\x5b\xd5\xe2\x0f\x47\x57\x02\x19\xf6\x13\xc3\x74\x44\xe6\xbf\x4a\x5d\x55\xd3\xeb\x39\x8f\xa8\x34\xa1\x79\x29\x14\xb3\x5a\x31\x5b\xba\x99\xca\x29\xba\x6e\x67\xc2\xfa\xad\x21\xf6\xae\xdb\x88\xd9\x47\x5b\x5f\xdd\x4f\xd6\x24\x70\x91\xad\xce\x18\xad\x76\x84\xb4\x65\xb7\x48\x89\x65\xdd\x8f\xfc\xe4\xbb\x2e\x14\x9a\x96\xca\xf7\x37\x15\xfc\x7a\x9e\x60\xc7\xcc\xd4\x57\xe5\x83\xcd\x7c\x53\x9d\xbd\xec\x91\xd0\x34\x48\x38\x03\x75\x0b\xd4\x2d\x50\xb7\x40\xdd\x02\x75\x0b\xd4\x2d\x50\xb7\x40\xdd\x02\x75\x0b\xd4\x2d\x50\xb7\x40\xdd\x02\x75\x4b\x9b\xd5\x2d\x53\x74\x90\x1d\x88\xec\xb3\x50\xc8\xc3\x2e\x98\xe2\x5c\xe5\x21\x55\x16\x54\x27\x50\x9d\x40\x75\xe2\x50\x9d\xbc\xb3\x8f\x22\xb2\x84\x9b\xa6\x15\xd3\xd9\xbc\xb3\x9e\x9c\x85\x25\x19\x2f\x7f\x4e\x0f\x38\xf7\xb1\xe0\xe3\x43\x19\xb5\xe4\xfe\x5e\x8b\xbb\x89\x46\x32\x6a\x69\xc6\x71\x84\xc4\x7b\xd3\x4b\x0b\xe6\x2a\xb1\x89\xae\xbb\x8a\x86\xa6\x2a\x1a\x9a\xaa\xa5\xa1\x64\x81\x2e\x0a\xa0\x77\x96\x16\x39\xd0\x9b\xa7\x59\x4a\x34\x00\xf4\x1c\xf7\xb9\x98\x0d\x2e\x26\xc1\xfe\xeb\xb0\x19\x03\xe9\x95\xb5\xac\x7a\x38\xa4\x95\xcd\xcc\x64\xc5\x3f\x3d\xcc\xfe\xa2\x9f\x5e\xe7\x4a\x6a\x56\x5b\xcd\x04\x99\x2d\xab\x23\x00\x71\x84\x9f\xce\x99\x5a\xcd\x76\x07\xcb\xeb\x04\x1f\x6e\x20\xe6\xf1\x8d\xc1\x00\x79\x3f\xdb\x5b\x7f\x5a\x35\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\x61\x40\xe1\x8e\xaa\x9c\x20\x57\x6e\xb7\x82\xaa\x0e\xc0\x19\xc0\x19\xc0\x79\x1b\x01\xe7\xbf\x37\x4c\x27\x1b\xa5\x9c\xf2\x08\x2e\x38\xce\xaa\x3a\xfb\xcc\x10\xfb\x4a\x05\xe4\xbc\x29\xbf\xc2\xf9\x74\x76\x23\x9b\x5e\x57\x72\x2e\xdc\x69\xcd\x78\x25\x54\x14\xb1\x26\x4d\x81\x9d\xb1\xe8\x48\x15\x5c\xe9\x3a\xdf\x62\x56\x47\xb2\x36\x0f\x70\x59\x9b\xee\x5c\xe0\x47\x57\x87\x92\x47\x7e\xb6\x4a\x6e\x79\x6d\xb7\x37\x18\xbd\x8b\x11\xbf\x71\x5e\x73\x02\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\x13\x08\xb3\xcd\x08\x13\x30\x12\x30\x12\x30\x12\x30\xb2\x85\x30\xf2\x5d\x7d\xb4\x5b\xc0\xc8\xe2\x8a\x92\x8a\x99\x40\xaa\x4c\x03\x6b\xc9\x5f\x8d\x9d\xa6\x9d\xfb\x5c\xd9\x08\x90\xbf\x9e\x2f\x3f\xe2\x12\xe4\xaf\x3e\xf2\xd7\xef\xbd\x81\xe2\xc6\xb3\x30\x3a\xdc\x3f\xe5\x5d\x79\x8a\xbb\x4f\xbc\x81\x7d\xad\x97\xee\x48\x69\x45\xd5\x78\x18\xe1\xa0\xdc\x76\xd1\x47\x8d\x3d\x66\xb4\xa2\x5a\x56\x4b\xa3\x25\x49\xeb\xce\xd3\xa4\xe8\xcc\x71\x8a\xf1\xce\x1c\xa2\x01\x7a\xd2\x37\xb5\x87\x71\x17\x3c\x77\x8f\x96\xde\x6c\x76\xba\xb9\x60\x92\x1a\x61\x61\x49\x4a\x23\x11\x3b\x7b\x87\x8b\xa4\x86\x7e\x72\x87\xdd\xb7\xbb\x6b\xc8\x3e\x17\x0d\xcb\x9d\xda\xd4\xc3\x89\x29\x3a\x48\x07\xca\x12\x26\xd5\xd8\xc5\x48\x8e\x84\xfc\x71\x0d\xe6\x8f\x7b\x77\x4f\xe3\x2f\xf6\x11\x91\x28\x6e\x3f\xed\xb5\x13\xc5\xb5\xc3\x2c\xf0\x8c\x70\xb5\x99\x05\x0f\x67\x8a\xcb\x44\x24\xfe\xf3\x9d\xb6\x59\x18\xa9\x27\xe3\x5b\xf4\x31\x9e\x61\xa8\x0d\xd6\x01\xa9\xdc\xba\xcd\x5a\x21\x95\x1b\x52\xb9\x6d\x71\x2a\xb7\x16\xce\xf7\x6a\xb3\xdc\xde\xd3\x38\xdb\x86\x07\xa6\x7e\x4b\x8e\x53\xec\xff\x63\xef\xcf\xe3\xe3\xc8\xaa\xbb\x61\xfc\x53\x2d\xaf\x77\x56\x0a\xc2\x30\x9a\xad\xa6\x3c\x63\x2d\x96\x5a\x96\xed\x19\xdb\xf2\x78\x3c\x6a\x49\xb6\x25\x6f\x42\xf2\xd8\xc3\x30\x33\x76\xa9\xfb\xaa\x55\xe3\x52\x55\x53\x55\x2d\x59\x2c\x09\x30\x84\x40\x58\x03\x09\x10\xc3\x43\x12\xe0\x19\x06\xc2\x12\x48\x42\x02\x24\x64\xe1\x47\x02\x21\x21\x04\x92\x90\x10\xc8\xf2\x23\x4f\x12\x92\xbc\x3c\x7c\x42\x12\xc2\x24\x6f\xf2\x7e\xee\xb9\xb7\x6e\xdd\xea\xae\x5e\xd4\x6e\xc9\xf2\xe8\xcc\x1f\x9e\x56\x2d\xf7\xde\xba\xcb\xb9\xe7\x7e\xcf\xf7\x9c\xa3\xf7\x99\xbd\x12\x75\xb9\xa1\x22\x34\xdb\x33\x81\x34\xa6\xff\x73\x17\xb9\x2d\x3a\x6b\x70\xc6\x49\x40\xfd\x05\x3b\x4f\xad\x7c\xde\x2b\xbb\x61\xa0\xff\x5e\x97\xfe\x99\x0d\xf1\x26\xf7\xe2\xe6\x48\x25\xd3\xbc\x94\x61\x5e\x4a\x9b\x58\x25\xfd\x8b\xf1\x96\x99\xac\x80\x9d\xab\x0e\x7b\xfe\xb0\xe3\xc8\xad\x14\xfd\xe1\x52\xd6\x4e\x33\xb4\x8f\xc7\x27\x1b\x2f\xb0\x7e\x7d\x07\x5f\x60\xc9\x61\xa8\xb1\xd6\x90\x48\x82\x44\x12\x24\x92\x20\x91\x04\x89\x24\x48\x24\x41\x22\x09\x12\x49\x90\x48\x82\x44\x12\x24\x92\x20\x91\x04\x89\x24\xab\x4c\x24\x41\x9a\x07\xd2\x3c\x90\xe6\xb1\x8e\x69\x1e\xbf\xfc\x28\xa7\x16\x04\x03\x56\xa9\x14\xd4\x21\x18\x04\xa1\x15\xd2\xd9\xb2\xc3\xd6\xae\xfe\x3f\x8f\xe8\xaf\xda\x4e\x36\xb3\x57\xce\x2d\x0c\x76\xf6\x70\xfd\xd0\x17\x3b\x5b\x24\xfa\xa2\xb0\x59\xd3\xe2\xd5\x69\x1a\xf6\xde\xc1\x1e\x1d\x2e\x95\x02\xd5\xc6\xa5\x3c\xb0\xc6\x31\xba\x1c\x02\x57\x08\x5c\xe5\x10\xb8\x42\xe0\x0a\x81\x2b\x04\xae\xd6\x0d\x70\x95\x5b\x33\xc0\x55\xdb\x5b\xd2\x32\x70\x95\x43\xe0\x0a\x81\x2b\x04\xae\x10\xb8\x42\xe0\x6a\xf5\x81\xab\xdc\xba\xc6\x99\x72\x88\x33\xad\x1c\xce\x94\x5b\xeb\x38\x53\xee\x2a\xc4\x99\x26\x1e\x23\x23\x9c\xdb\x74\x1f\x19\x02\x6e\xd3\x1e\xb2\x8b\xec\xac\x49\xff\xb3\x4a\xa5\x20\xbb\x30\x98\x55\x90\xa1\x66\x3c\x65\x1e\xbf\x3d\x9d\xce\xb4\x59\xdf\xc8\x99\x4c\xa7\x1a\x33\x99\xfa\xf4\x5e\x41\x54\x62\x8d\x10\xd4\x6e\xa5\x1d\x09\x4a\x93\xf9\xdd\x2d\x31\x0c\xf6\x1c\xbe\xeb\x18\x56\x02\xf1\xba\x93\x5f\x5d\x0d\xcc\x8b\x43\x54\x39\xf2\x00\xb9\xbf\x82\x5d\x9d\x25\x7d\xcb\xe9\x6b\x64\x54\xa3\xff\x47\x8b\xfe\x1f\x7f\xaf\xd5\x5c\xa4\xe4\x10\x17\x01\xfb\xc8\xbd\x20\x02\x76\x92\x65\x4e\x4b\x32\xca\x1d\x44\x0e\x92\x03\xb1\x83\xc8\xf2\x4b\x19\x63\xa5\xec\xd2\xef\x27\xf7\x91\x2d\xc3\x79\xb6\x91\xb4\x52\x4c\x63\x91\x53\xf2\x56\x42\xe4\xf4\xfe\x61\x5f\x2c\x72\x84\x4a\x6b\xe4\x3d\x87\x1d\x50\xc5\x86\xa3\x8a\x9f\x1d\xfc\x09\x2e\x7e\x46\xe4\x63\xab\x21\x88\x4e\x93\x29\x32\xa9\x0a\xa2\xde\x1c\x79\xa0\x05\x3a\xeb\x28\x7c\xc1\x29\x80\x54\x03\x04\x5f\x11\x7c\x45\xf0\x15\xc1\xd7\x75\x04\xbe\xa2\x32\xd6\x40\x19\x5b\x3b\xe8\xf4\xdf\x66\x08\x04\x44\xe8\xfc\x0b\x39\x54\x1f\xcb\x9c\x56\xcf\x83\xb6\x6b\x04\xfc\x4c\x67\xcc\xd0\x59\x6e\xca\x95\xb8\x49\xbc\x65\x89\x55\x02\x9d\xa5\xa8\x7d\xae\xe7\xf6\xbb\xb4\x68\xc1\x90\x88\x23\xa1\xaa\x1e\x72\x04\x55\x4e\x06\xa1\x1d\xd8\xf3\xf3\xb4\xc0\x14\x50\x67\x29\xb6\xb1\xc6\xa2\xdd\x76\xfa\xc4\x49\x11\x3e\xd7\x28\xfa\x56\x1e\xe6\x89\xed\x15\xe4\xc6\x13\x6f\x0e\x60\xbe\x8e\xc6\xa5\x1c\xb0\x46\xaa\x1d\x65\xb1\x37\xa3\x0f\x12\x95\xcc\xf2\xf5\x16\x15\x91\xe5\xed\xe4\x1e\x6a\x29\x6d\x34\x75\x68\xc2\x24\xb4\x20\xed\x04\x8c\x46\x00\x34\x02\xa0\x11\x00\x8d\x00\x68\x04\x58\xd7\x46\x80\x3f\xca\x90\x2f\x65\xf4\x2f\x66\x3a\x3f\x2f\x77\xdb\x9f\xcd\x8c\x2a\x8e\xa5\x25\x87\x5a\x01\x95\x4b\x7f\xd2\xf7\x4a\x56\x11\xf6\x61\x1e\x1b\x3b\x41\x01\x8a\x86\x3b\xf6\x4c\x65\x03\x3e\x98\xdd\x9b\x35\xa6\xb9\x1c\xe1\x9b\x64\x89\xba\x6c\x9a\xc6\xbb\x08\x35\x3c\xbf\x34\x67\xb9\x11\x25\xc9\x2f\xd3\x81\x59\xcb\x89\xb4\x7f\x93\xdf\x35\x8d\x59\xdb\xb5\x1c\xfb\xc5\x91\xf8\x9e\xa1\x86\x55\x00\x44\xdd\x1b\xe0\x00\x6b\x21\x56\x2d\x79\xe1\x5d\x41\xfc\x12\xd7\xb7\xb3\xc6\x98\x0d\x22\x49\x69\xb8\xe7\x57\x7f\x59\x6c\xc5\x08\xb9\xba\x0f\xda\x9f\x17\xce\x65\xcd\x1b\x79\x7b\x46\xa3\x0f\x49\x72\x9b\x5e\xb3\x81\xfc\xe8\x06\xfd\x95\x1b\x3a\xff\x47\x12\xdc\xbe\xd6\x71\x56\xc8\x41\x36\x45\xe7\xbc\x45\xa3\x68\xf9\x33\x56\x31\x01\x3b\x48\x45\x8d\xfa\xb3\x9e\x3f\xcf\xfa\x22\xb5\xa5\xa7\x2a\x2a\xaf\xdd\x50\x50\x6b\x22\x9d\xa4\xc4\xbf\xca\x66\xfa\x42\xde\x2e\xc4\x8a\x35\xec\x8d\xdc\x91\x3d\xea\x5d\xb6\x39\x89\x9d\x23\xda\xfd\xb2\x4a\x37\x46\x72\x53\x9a\x0e\x24\xad\x2d\x59\x59\xd6\xe0\xe0\x10\xc8\x62\x55\x5b\xed\xe2\xdf\xd0\xc5\xce\x3c\xf0\x2b\x39\x31\x82\x03\x46\x57\xce\xca\x5f\x28\xfa\x5e\xd9\x2d\xb0\xa7\x80\x4f\x06\x0f\x55\x74\x1c\x57\x56\x84\x06\x94\x2c\x24\xfa\x82\x19\x59\xd2\x01\xa3\xeb\xb0\xe7\x53\xa5\x58\x23\x6f\x05\x79\xab\xc0\xbe\x5e\xf4\x0f\x67\x10\x42\x79\x01\x57\xa7\xab\x0a\x9c\x95\x65\x64\xcd\x67\x95\x2a\xe7\x8d\xaa\xdb\xa0\x8d\x0d\x6d\x6c\xeb\xd4\xc6\x36\x51\x24\xc7\x39\x58\x3d\x46\x46\x00\xac\x3e\x48\x0e\x90\xfd\x2d\x80\x97\x3c\x78\x4f\x43\xc3\x55\x73\x28\x71\x7d\x64\x58\xc5\x90\x1f\xef\x4d\x87\xa5\x9f\xad\x3f\x8b\x8b\x87\x58\x74\x93\xab\x31\x4c\xc5\x7f\x67\x48\xa7\xe0\xad\x97\x43\x2f\xc8\x5b\x8e\xed\x16\x07\x16\x76\xcd\xd0\xd0\xda\x35\xa0\xff\x55\x46\xff\x46\x86\x3c\x5b\xb9\x77\x4e\xdc\xab\x1d\x94\xf0\xce\x22\x0d\x87\xe3\x17\xce\xf0\xe7\x31\x26\x61\x7a\x4c\xc2\xa7\x7a\xc9\x43\x8d\xe3\x43\xf2\x1c\xe9\x75\x33\xd7\xf8\x9e\x43\x67\x6c\x97\xed\x62\x32\x45\xf7\x17\x7b\xf4\xf7\x6e\x24\x37\xa7\x05\x95\xe4\x89\xd5\x3f\xde\x4c\xba\xee\x29\xcf\xa1\x39\x5e\xf2\x9a\x48\xd9\xbd\x0b\xaa\x4b\x89\x7b\x09\xdf\x14\x5b\x64\x94\x76\xaf\x71\x77\x88\x2b\x12\xb2\xc4\x6e\x2c\x2a\x0f\xeb\xa3\x42\x18\xd6\x9c\x9c\xc2\xca\xa6\xf4\xb5\x2a\x4b\x61\x44\xea\x85\x04\xe2\xd9\xc2\x31\x8e\x09\xba\x83\x60\x1c\x13\xb4\x48\xa2\x45\x12\x2d\x92\xeb\xc8\x22\x89\x71\x4c\x30\x8e\x09\x5a\x82\xd0\x12\x84\x96\x20\xb4\x04\xad\x09\x4b\xd0\xc4\x3e\x72\xaf\xbe\xc7\xdc\x25\x11\xac\x9b\xd4\xd0\xac\xca\x19\xef\x99\x10\xa2\x15\x63\xac\x20\x2e\x8f\x31\x56\xae\x1e\xdf\x17\xfd\x17\xbb\xc9\x5e\x0e\x95\x06\xa1\xe7\x5b\x45\x9a\x8e\x8f\xe6\xd9\x46\x00\xf7\xf3\x56\xc9\xca\xdb\xa1\x4d\x03\xfd\xfb\x5d\xfa\x3f\x6d\x20\x37\x88\x1b\x12\xff\xfc\xe1\xe6\x82\x2e\x8f\x4c\x8f\x4f\xf3\x37\x47\x78\x91\xed\x4a\xe7\xbd\x1f\x5e\x10\x65\x0b\x00\xb3\xba\x32\x0c\xc2\xdc\x1c\xa2\x49\x1b\x23\x9a\x39\xfd\x01\x81\x68\x26\xe7\x90\x80\x31\xab\xfb\x3e\x05\xcd\xc4\x14\xdf\x88\x68\x22\xa2\x89\x88\x26\x22\x9a\x88\x68\x22\xa2\x89\x88\x26\x22\x9a\x88\x68\x22\xa2\x89\x88\x26\x22\x9a\x6b\x10\xd1\x44\xd4\x10\x51\x43\x44\x0d\xd7\x31\x6a\x78\x94\x6c\x1a\x70\xbc\x62\x30\xa0\xdf\xaf\xdf\x47\x36\xb0\x9f\xbd\xba\xe3\x15\x0f\xdb\x0e\x30\x34\x8f\x5a\x6e\xc1\xa1\xfe\xc4\xcd\x0d\xa9\x9a\xff\xb3\x83\x9c\xaa\x8b\x3f\xd6\x60\x66\xa6\x01\x92\x11\x43\xf3\xe7\x77\xe8\x1f\xe9\xa8\xc6\x25\xef\x86\x24\xd3\xc9\x83\x6e\x35\x36\xd5\x9b\x65\x8f\x25\xd1\xc3\x98\xfe\x58\xfd\x7c\x9b\x53\x4f\xdb\xe4\x24\x87\xf8\x8e\x90\x31\x80\xf8\x0e\x91\x83\xe4\x40\xcd\xd8\x1f\x51\xa7\x89\x6f\xcc\xa6\x60\x6d\x97\x99\x91\x7a\x75\xf0\xbf\xce\xb7\x6f\xad\x1e\xb0\xee\x28\x73\x75\xc3\x31\x1b\x14\x4f\x5e\xa9\x61\xcb\x3d\x9f\xb0\x3d\x31\x19\xd7\xe8\xf2\xc6\x0d\x3d\xeb\x31\xcc\x51\x8b\x61\x8e\x3e\xa3\xb5\x5d\x88\x4c\xf3\xe0\x46\xc7\xc9\x44\x1c\xdc\xe8\x0a\x4a\x26\x48\x8a\xdd\x9c\x64\x6a\x5e\x06\xa5\xcb\xb0\xde\x4f\xde\x58\x2d\x99\x6e\x11\x6e\x71\x56\x9a\x30\xda\xc9\x6f\x5e\x31\x59\xb4\x32\xa1\x8d\x50\x1c\x35\x10\x47\x18\x5e\x63\x55\xc2\x6b\xa0\x5f\x35\xfa\x55\xa3\x5f\xf5\x4a\xf9\x55\x4f\x7c\x5a\x6b\xb3\x73\xe9\x14\x0f\x68\x78\x8c\x8c\x2b\x01\x0d\x57\xd8\x61\xd5\x48\x57\x1c\xb6\xea\x9b\x79\x37\x35\xab\x3b\x34\xa9\x22\xd4\x54\x31\x72\x1f\xbe\xb6\x5a\x77\x18\x2c\x59\x7e\x68\x83\x7d\x94\x1f\xca\x1b\x1f\x6f\x06\x4a\xd5\x8c\x96\xd5\x51\x28\x6e\xa9\x2c\xa8\x1f\x9a\xb2\x03\xdc\x42\x6f\x55\x6f\xce\x53\xbf\x48\xd5\xbb\xdb\xd5\xbb\x41\xe8\x5b\x21\x2d\xda\xf9\xfe\xaa\xe7\x12\xa5\x40\xca\x7e\x71\x97\xb5\x32\x77\x92\x1c\x27\x13\x15\x07\xab\x21\xb2\xaf\x85\xb9\x33\x09\x94\x02\x54\x63\x1a\xa8\x31\x1f\xed\x20\x1f\xea\xd0\x3f\xd0\xd1\xf9\xa4\xdc\x0b\x9e\xe8\x58\x3f\xa7\xaa\x0a\x2b\x0c\xeb\x67\x60\x15\x80\xa5\x90\x4d\xce\x98\x5b\xd4\x5d\x63\xe2\xf6\xc0\x96\xc6\x49\x28\x96\x03\x6f\x32\xdd\x8d\xbf\x0d\x4f\x80\x1e\x15\x18\xdd\x13\x81\xe7\x4e\x72\x92\xcd\x09\xb6\x2c\xc4\xef\xe9\x68\xb1\xc4\x17\x7b\x6a\x1f\xf7\x72\x5f\xd2\xc8\x17\x35\xfd\xf3\x5a\xe7\xe7\x24\x80\xf8\x94\x76\xd8\xf3\xf3\xa0\xe2\x15\x3d\xe8\x76\xcf\x30\x67\xd9\x25\xd3\x18\x4e\x7c\x05\x40\xc3\x5c\x1b\x2b\x07\x31\x9d\xa0\xdf\xca\xc3\x87\x03\x49\xc3\xb1\xf3\x62\xb7\xa5\x4e\x21\x30\xbc\x45\xd1\xa7\x9c\xc4\x50\xa2\x5e\xc9\xa1\x59\x83\xd7\x08\xac\xa8\x68\x2c\x01\xa2\x4d\xed\x00\x59\xbd\xb9\x11\x9a\x95\x60\xf8\xac\x3e\x06\xb6\x3a\xdb\x41\x1d\x97\xdd\x12\x77\xd9\x3d\x44\x0e\xea\x07\xcc\xfd\x92\xf0\x7d\xbb\x4a\x15\xaf\x2e\xf1\x99\xc0\x18\xd7\xff\xf4\x51\x92\x1d\xb0\x4a\x76\xbd\xfc\x7e\xd4\x5f\xb0\xf3\xd4\xca\xe7\xbd\xb2\x1b\x06\xfa\x7b\x1f\xd5\xdf\xb8\x9d\x6c\xce\x7b\x3e\xdb\x56\x3b\xfb\x1a\xa4\xf8\xe3\x6f\x0f\xf3\xb7\x7b\x4d\xf6\xf4\x88\xe7\xd3\x44\xc4\xf3\xc4\x33\x6b\x9c\x07\x8a\x89\xfe\x90\x07\x89\x89\xfe\x90\x07\x89\x3c\x48\xe4\x41\xae\x23\x1e\xe4\x1a\x0a\xa5\xbc\x66\x78\x90\x18\xe3\x17\x79\x90\xc8\x83\x44\x1e\x24\xf2\x20\x31\xd1\x1f\x06\x21\x7d\xe6\xd0\x16\xd7\x7c\x10\xd2\xab\x32\xd1\x9f\x55\x3b\xfd\xd7\x61\x8e\x38\x1e\x22\x07\x01\x71\xdc\x4b\xee\x21\xbb\x6b\x22\x8e\x79\xcf\xa7\x60\x8e\x4a\xa0\x46\xc7\xed\x40\x26\xde\x9a\x6c\x0c\x28\xf6\xeb\x3b\x52\x02\xa4\x9a\x66\x94\x62\x2b\x51\x36\x69\x94\x3d\xd0\x7c\x62\x6b\x0c\x88\xdd\x14\x27\xfb\x4b\x62\x5f\x77\xf1\x1b\xab\x84\x7e\x71\xb0\x6a\x8c\x8c\x90\xe1\x0a\x0b\xce\x20\x19\x58\x66\xe7\xa2\xe1\x06\xe9\x70\x2d\xd2\xe1\xbe\xab\x91\x1c\x5f\xdd\x07\xc8\x7e\x58\xdd\xbb\xc9\xf2\x27\x20\x39\xc2\x29\x70\x0f\x90\xfb\x63\x0a\x5c\x4b\x05\x1d\xe5\x16\xf1\x61\x72\x48\xb1\x88\xb7\x54\x52\xeb\x19\x47\x79\xfa\xbf\xe6\xa4\x54\xaa\x3c\x4a\x17\x5d\xbd\x7f\xda\x17\x4b\xa1\x6d\xe9\xf9\xff\x92\x12\x29\xcb\x1f\xe2\x12\x29\x35\x05\xe0\x4a\xca\x26\xcc\x02\x88\xc8\x2c\x22\xb3\x88\xcc\x22\x32\x8b\x59\x00\x31\x0b\x20\xd2\x94\x31\x0b\x20\x5a\x08\xd0\x42\x80\x16\x02\xb4\x10\xa0\x85\xa0\x2d\x16\x02\xf4\x56\x41\x6f\x15\xf4\x56\xc1\x2c\x80\x68\x80\x43\x03\xdc\x55\x9e\x05\x70\x19\x49\xfb\x9a\x04\x96\x1b\x98\xbc\x54\x88\xf9\x6a\x24\xb6\xff\xd6\x8d\x3c\x0d\x20\x10\xdb\xbd\x82\x8c\x4f\x32\x50\xf2\xbd\x8b\x4b\xfa\x7b\x6e\xd4\x5f\x9f\x89\xd1\xf2\xbb\xf3\x9e\xeb\xb2\x2f\x3a\x32\x76\x3a\xe6\x6d\x87\x9e\x01\x4f\xb3\x89\x72\xd2\x2b\xd0\xde\x9b\xc5\x63\x1c\x30\x3f\x42\x43\x76\x75\x92\x3d\xb2\xab\xa3\x77\xa0\x97\x07\x11\xd9\x4b\x6e\xe5\x53\xe3\x87\xc8\xb3\x61\x6a\x5c\x47\xae\xf9\xb8\xb6\x85\x88\xc6\x35\x1c\xea\x3b\xd3\x87\x9a\xe8\x5b\x44\xed\xe4\xf1\xa9\xc6\x23\x3c\xa0\xf7\xf3\x71\x95\x4d\x14\x00\x79\x0d\xe3\x41\x67\x6a\x77\x4c\x3e\xd8\x7c\x77\x4c\x96\xd7\x76\x77\x54\x4e\xf8\xba\x1d\x63\xbe\x51\xe9\x8e\xed\xb2\x3b\x4e\x4d\xd7\xeb\x8f\xce\x64\x7f\x78\xc1\x33\xa8\x43\x7a\xdf\xa2\x74\x48\x77\xd4\x21\xa3\x63\xc7\xc7\x4e\x8f\xd5\xe9\x92\x5b\x13\x5d\xc2\x2d\x35\x2b\xd1\x29\x2b\xf0\xc5\x4d\x74\xf4\xae\x9f\x54\x3a\xa5\x27\xea\x94\x53\x93\xa7\xc7\x4f\x9d\x9c\xae\xd3\x2b\xb7\x25\x7a\x45\x54\xfe\xcc\xe9\x96\xa1\xd4\xc5\x73\x74\x6c\x78\xb4\xe9\xc5\x73\x94\x5a\x85\x67\x4e\x87\xe4\xde\xac\x74\x48\x97\x94\x26\xc3\xa7\x47\x8e\xd6\xe9\x91\x5b\x92\xe2\x84\x69\x3a\x57\xae\x4b\x96\xb5\x99\x34\xd1\x25\x13\x07\xc9\x01\x7d\xbf\xb9\x57\xea\x14\xb7\xaa\xde\x76\x95\xf5\x54\xfb\xda\xcd\x90\xf3\xfa\x63\x9d\x8f\x44\x0a\x43\x6e\xd2\x0a\x39\xea\x34\x47\x8d\x07\xa7\x8e\x1b\xac\x4c\x50\x38\x03\x2a\x35\xc6\x7c\xd9\xf7\xd9\xc9\x9c\x77\x73\x74\xd6\x08\x3d\x83\x29\x08\x59\x13\xda\xa1\xea\x10\x1f\x3e\x4f\x0e\xf3\xf0\x68\xb3\x8e\xb7\x98\xf7\xdc\xd0\xf7\x9c\xac\xf4\x1e\xaa\x0c\x96\x56\xf2\x6d\xcf\xb7\xc3\x25\x87\x2e\x50\x27\x61\xbd\x0c\xf4\xff\xff\x39\xfd\xb5\x5d\xe4\x56\xa5\x9c\xe1\xa8\x18\xe9\x9b\xbe\xaf\xbe\x27\xdd\xa4\x28\xfe\x38\x2b\x7e\x44\x2d\xbe\x77\x3f\x7b\xf3\x70\x4a\xd9\xc2\x5d\xbd\xf6\xab\xe8\x6c\x87\xce\x76\xe8\x6c\x87\x94\x0e\xa4\x74\x20\xa5\x03\x29\x1d\x6b\x86\xd2\xb1\x76\x18\x0b\x68\x4a\x47\x53\x3a\x9a\xd2\xd1\x94\x8e\xa6\xf4\x75\x6d\x4a\x47\x5b\x1f\xda\xfa\xd6\xa9\xad\xef\xaa\x74\xb6\xab\x1d\x75\x8b\x3c\xc6\xd1\xc2\xb3\xe4\x41\x40\x0b\x4f\x91\x13\xe4\x58\x4d\xdf\x17\x15\xf8\x8a\x42\x7c\xd5\x46\x93\x54\x27\xbc\x97\x34\x86\x15\x1f\xd2\xcf\x08\xcc\xb0\x1e\xbe\x26\x30\xd8\xda\xb5\xa6\x24\xb4\x6c\xe4\xaf\xf7\x3b\xa4\x01\x16\xb7\x4d\x3a\xf1\xd5\x81\xdd\x0e\xf0\x87\xae\x2c\xf0\xc6\x71\xb2\x47\xc9\x0b\xc9\x0b\x2a\xfc\xfc\xc6\xc9\x91\x36\x8d\x2b\x52\xcc\xd1\xff\xaf\x45\xff\xbf\x5f\xcd\x90\x87\xb9\xc0\x99\x26\xcf\x07\x81\x73\x8c\xb4\x6f\x62\x92\x73\xdc\x2f\xf0\x21\x72\x26\xf6\x0b\x6c\x6b\x05\xe7\xb9\xbf\xe0\x0b\xc8\x59\xc5\x5f\xb0\xad\x35\x5c\xae\x1f\x61\x73\x82\xb6\x56\xf8\xc4\xcb\x93\xbc\xbd\x9f\xec\x6f\x20\x48\x07\x52\xfd\x10\xeb\x08\xd5\x31\xfe\x42\x1d\xa1\x1a\x3b\x2a\xae\x9a\x78\x45\x57\x45\xc4\xb5\x11\xd7\x46\x5c\x1b\x71\x6d\x74\x55\x44\x57\x45\x74\x55\x44\x57\x45\xb4\xaf\xa0\x7d\x05\xed\x2b\x68\x5f\x41\xfb\x0a\xba\x2a\xa2\xab\x22\xba\x2a\xa2\xab\x22\x9a\x2f\xd1\x7c\xb9\x06\xcd\x97\x6b\xda\x55\xf1\x4a\x1a\x09\xdb\xef\x73\xf8\xbe\x6e\x32\xc0\xfd\x05\xb8\x0c\x93\x9e\x01\x30\xf4\x03\x25\xaf\x50\xb0\x03\xbf\x0c\x98\xee\x4c\xb9\x50\xa4\x61\xa0\x7f\xb7\x4b\xff\xdb\x0d\xe4\x7a\xfe\x82\x44\xcd\x7f\x44\xa8\xa6\x6e\xc1\x5e\xb0\x0b\x65\xcb\x51\xad\xcc\x96\x3c\x06\x4e\x7a\x85\x51\x59\x62\x0e\x4a\xcc\x2a\x9b\xfe\x90\x54\x17\xba\xa0\xbc\xae\x18\x8e\x4d\xe0\x6b\x5e\x89\xca\x23\x7d\x10\x52\xab\x90\xed\xdd\x0f\x2f\x70\x41\x1a\xd9\x32\xab\x2b\x3b\x6e\x07\xe1\x61\xcf\x1f\x76\x1c\x19\x32\x30\x58\xe3\x1e\x05\x13\x17\xc8\x24\x5f\x0e\xe3\xe4\x08\x2c\x87\x61\x72\x88\x1c\x6c\x61\x39\x00\x03\x60\x8c\x9d\xe7\x1a\x2e\x89\x6d\xe9\x4b\xe2\x5a\x9d\x40\xc3\xc0\x26\xfd\xf8\x63\x8d\xd7\xc2\x01\x7d\xbf\x58\x0b\x7c\xbe\x44\xb3\xbe\x7a\x64\x52\xa6\x3b\xba\x52\xa0\x2b\xc5\x04\x9a\x9c\xd0\xe4\x84\x26\x27\x34\x39\xad\x1b\x93\xd3\xc4\x9a\xb1\xa8\xb4\xbd\x25\x2d\x43\xfd\x13\x08\xf5\x23\xd4\x8f\x50\x3f\x42\xfd\x08\xf5\xaf\x3e\xd4\xdf\x76\xd8\x61\x62\x5d\x83\x9b\x13\x08\x6e\xae\x1c\xb8\x39\xb1\xe6\xc1\xcd\xab\xd0\x37\x43\xff\xce\xa3\xe4\x10\x87\x09\xfd\x19\x2b\x9f\x8d\xe0\x22\x28\x2a\x8e\x29\x52\x2b\x1d\xb7\xef\x39\x34\xd0\x3f\xf8\xa8\xfe\xf6\xed\xe4\x39\xac\x80\x61\xf5\xfd\x73\x0b\x83\x9d\x66\xfd\x38\x22\x53\x9e\x43\x7b\xef\x66\xcf\x4c\x55\xbe\xad\xa6\x25\x62\x8f\xad\x71\x2c\x0f\xa3\x83\x20\xa4\x85\xd1\x41\x10\xd2\x42\x48\x0b\x21\xad\x75\x04\x69\xad\x21\x92\xf0\x9a\x81\xb4\x90\xbd\x8a\x90\x16\x42\x5a\x08\x69\x21\xa4\x85\xd1\x41\x90\x5e\xf7\xcc\x41\xa0\xd6\x3c\xbd\xee\xaa\x8c\x0e\x72\xb6\x76\x74\x90\xfb\x38\x39\xea\x1e\xb2\x1b\xc8\x51\xfd\x64\x07\xe9\xa9\xe9\xe9\x0e\xf8\xd5\xc2\x60\x76\xca\x73\xa8\x1a\xfb\xe3\xd1\xc6\x54\xa6\x21\x7d\x9f\xa0\x32\xd5\x04\xc1\x04\xbb\x89\x15\x9e\x0c\xb8\xdc\x28\xba\xc7\x77\xb6\xd4\x40\xc6\xae\x93\x51\x3d\x00\x04\xeb\xe2\x7f\xae\x1e\x0c\xc6\x51\xab\x03\x64\x3f\xd9\x5b\x11\xab\xa3\x8b\xdc\xdd\x54\x2f\xa3\x07\x25\x46\xe2\x68\x31\x12\xc7\x57\xb4\xda\xab\x7e\x1f\x5f\xf5\x83\x64\x00\x56\x7d\x0f\x69\x76\x3e\x92\x83\x3c\x00\xc7\xbd\x64\x4f\x1c\x80\x63\x19\xaf\xdf\xcf\xc3\x6b\xec\x25\xf7\x28\xe1\x35\x9a\x7f\xbf\xd9\x18\x19\x2b\x2b\x90\x7a\xbf\xdd\x57\x43\xe0\xdc\x9c\x1a\xfd\x02\x84\xcf\x20\xbf\x95\x22\x7c\xd2\x12\x71\xaf\x80\x18\xc2\x98\x16\x88\xc6\x22\x1a\x8b\x68\x2c\xa2\xb1\x18\xd3\x02\x63\x5a\x60\x4c\x0b\x8c\x69\x81\x56\x01\xb4\x0a\xa0\x55\x00\xad\x02\x68\x15\x68\x8b\x55\x00\x63\x5a\x60\x4c\x0b\x8c\x69\x81\x31\x2d\xd0\xe8\x86\x46\xb7\xab\x3c\xa6\xc5\x0a\x1b\xb4\x96\x11\x32\xe3\x6a\xcc\xc5\xfd\x96\x6e\x92\xe5\x84\xf7\x82\x1d\xe4\x3d\xa6\xfc\x28\x3c\x77\x1e\x1c\x83\xba\x85\x92\x67\xbb\x61\xe0\xd8\x79\x1a\xe8\x7f\xd5\xa5\x7f\x75\x03\xb9\x56\x3e\x7f\x6e\x61\xb0\x73\xa9\xb9\xa0\x18\x63\xa2\xa4\x69\x56\x52\x9b\xc2\x61\x0c\xc2\x0b\xa3\x51\x6b\xce\x0c\x26\x2a\xc1\x30\x18\x6d\x0c\x83\xb1\xac\xa5\x56\x39\x9f\xc4\x0a\x4b\x8c\x4e\x32\x95\x3d\xba\x0c\xa0\xcb\x00\x46\xc1\x40\x23\x15\x1a\xa9\xd0\x48\xb5\x7e\x8c\x54\x18\x05\x03\xa3\x60\xa0\x71\x00\x8d\x03\x68\x1c\x40\xe3\xc0\x9a\x30\x0e\x60\x14\x0c\x8c\x82\x71\xb5\xc0\xa1\x18\x05\x63\x25\xa2\x60\xfc\xef\x47\x49\x0f\x07\x05\x5d\x1a\x2e\x7a\xfe\x05\xa6\xad\xc5\xa8\xa0\xed\x16\x7d\x1a\x04\x79\xc7\x0a\x02\x1a\xe8\xdf\x7f\x44\xff\x5f\xdb\xc9\x75\xf1\xa3\xe7\x16\x06\x3b\x7b\xeb\x07\xba\x18\xe7\x45\x8c\xb0\x22\x7a\x6f\x65\xcf\x9e\x94\xaf\x9f\x19\x54\xef\xae\x71\xb0\x0e\xe3\x5c\x20\x68\x85\x71\x2e\x10\xb4\x42\xd0\x0a\x41\xab\x75\x04\x5a\xad\x21\xe2\xf0\x9a\x01\xad\x90\xd1\x8a\xa0\x15\x82\x56\x08\x5a\x21\x68\x85\x71\x2e\x90\x72\xf7\xcc\xc1\x98\xd6\x3c\xe5\xee\xaa\x8c\x73\x41\xc9\x04\x27\x39\x8d\x90\x61\x20\x39\x41\xe8\x85\x9a\x9e\xe5\x0a\x10\xb5\x30\x98\x55\x01\xa2\xe3\x76\xd0\x98\xde\xd4\x20\x2c\xc5\xf2\x98\x4d\x55\xa0\x98\xa0\x36\xa9\xad\x4a\x30\x9b\xcc\x9f\xd9\x5a\x89\x8f\x3d\x37\x0a\x77\xe1\x26\xb1\xb0\xdb\xf9\xf5\x15\x47\xc3\x38\x78\x35\x4e\x8e\x90\xb1\x8a\x70\x17\xf7\x90\xdd\x2d\x8c\x02\xba\x5a\x62\xf0\x8b\x16\x83\x5f\xfc\x97\x46\x0e\x73\x51\x70\x88\x1c\x04\x51\xb0\x97\xb4\x36\x09\xc9\x31\x1e\xf1\x62\x94\xe4\xe2\x88\x17\x2d\x17\x76\x9c\xc7\xbf\x18\x23\x23\x4a\xfc\x8b\x96\x4b\x6b\x2b\x8d\x79\xd9\x12\xa8\x51\x14\x8e\xde\xbf\xe9\xab\x94\x50\x77\xa6\xc6\xc7\x48\x08\xab\x6e\xfe\x88\x2a\xac\xe2\x00\x19\x2b\x28\xb6\x30\x3c\x06\x82\xb8\x08\xe2\x22\x88\x8b\x20\x2e\x86\xc7\xc0\xf0\x18\x18\x1e\x03\xc3\x63\xa0\x31\x01\x8d\x09\x68\x4c\x40\x63\x02\x1a\x13\xda\x62\x4c\xc0\xf0\x18\x18\x1e\x03\xc3\x63\x60\x78\x0c\xb4\xd5\xa1\xad\x6e\x3d\x85\xc7\x58\x3e\xae\xbc\x9c\xf0\x18\x6d\x0f\x5e\xf1\xee\x1e\xb2\x8b\x4d\xa9\x3a\x29\x19\x4b\x5e\x21\xa4\xf3\x25\x80\xa2\xf8\x8d\x97\xe9\x7f\xdf\xad\x7f\x3b\x43\x36\xe7\x3d\x9f\x9e\x5b\x18\xec\xbc\xdd\xa7\x56\xa1\xe2\x28\x3a\xe9\x15\x4e\x8b\xd7\x7a\xef\x60\xf7\x47\x3c\x9f\xaa\xb1\xe7\x95\x07\xda\x0b\x6e\x4f\x3c\x4c\x0e\xf1\x09\xb2\x8f\xdc\x0b\x13\x64\x27\xc9\x92\xbe\x9a\x26\x07\xf6\x15\x6c\x3a\x28\x0d\x6a\x38\x27\x6e\x4b\x1f\xb4\x4d\xfa\x86\x22\x0d\xc9\xe3\x27\x1a\x4f\x99\x5e\xbd\x5b\x9d\x06\x62\xfa\x98\xa6\x98\x2f\x6a\x63\x3a\x7f\x69\x4b\xdc\xd7\x77\xfa\xb4\xe4\x58\x79\x5a\xa7\xbb\x4d\xf1\xc8\xaa\xf5\x78\x2e\x47\x1e\x20\xf7\x57\x58\x41\x97\xd9\xe5\x08\xa5\xa1\xf9\xb3\x45\xf3\xe7\xcf\x6a\x97\xbf\xe0\x47\xb9\xdd\x93\x6d\x25\xd2\xee\xb9\x9a\x62\xa3\x54\x6e\x5a\x6c\xd4\x13\x15\xc9\xc0\xfd\x37\xc4\x62\xe3\x39\x42\x93\xb5\x12\x92\x42\x58\x28\x57\x4f\x50\xac\x8c\xdd\x11\x45\x47\x03\xd1\x81\xd8\xf7\xaa\x60\xdf\x08\x7a\x20\xe8\x81\xa0\xc7\x4a\x81\x1e\x13\x3f\xa7\x91\x31\xce\x28\xba\x9f\xdc\xa7\x30\x8a\xda\xb7\x4f\x5f\xb6\x1e\x11\x6d\xf4\x46\xfa\x46\xbf\x55\xdf\xcc\x3b\xa3\xdd\x7b\x7d\xee\x1f\xae\x89\xf7\xfa\xde\x92\xe5\x87\x36\xd0\x3c\x38\x40\x5c\xe7\xac\x60\x94\xd8\x29\x7e\x55\x14\x80\x5b\x2a\x0b\xea\x87\xba\x77\xb0\x9f\x43\xb7\xaa\x37\xe7\xa9\x5f\xa4\xea\xdd\xed\xea\xdd\x20\xf4\xad\x90\x16\xed\x7c\x7f\xd5\x73\x89\x52\xd8\xef\x25\x71\x97\xb5\x32\x77\x92\x1c\x27\x13\x15\xa7\x94\x21\xb2\xaf\x05\xf5\x63\x12\x1c\x59\x51\xed\x68\xa0\x76\x7c\xb4\x83\x7c\xa8\x43\xff\x40\x47\xe7\x93\x52\x76\x3f\xd1\xb1\x7e\x4e\x2c\x15\xe6\x3a\xd6\xcf\x40\x83\x02\x93\x32\x9b\x9c\xb1\x47\x7b\x77\x8d\x89\xdb\x03\x5b\x10\x67\xcd\x59\x0e\xbc\xc9\x74\x2d\xfe\x36\x3c\x01\x7a\x4f\x60\x74\x4f\x04\x9e\x3b\xc9\x5d\xbb\x4f\xb0\x65\x21\x7e\x4f\x47\x8b\x25\xbe\xd8\x53\xfb\x28\x95\xfb\x92\x46\xbe\xa8\xe9\x9f\xd7\x3a\x3f\x27\xc1\xbf\xa7\xb4\xc3\x9e\x9f\x07\x95\xac\xe8\x41\xb7\x7b\x86\x39\xcb\x2e\x99\xc6\x70\xe2\x2b\x00\x35\xe5\xda\x53\x39\x88\xf9\x4f\xfd\x56\x1e\x3e\x1c\x58\x65\x8e\x9d\x17\xbb\x23\x75\x0a\x81\xe1\x2d\x8a\x3e\xe5\xac\xab\x12\xf5\x4a\x0e\xcd\x1a\xbc\x46\xf0\xc5\x8f\xc6\x12\xd0\xcb\xd4\x0e\x90\xd5\x9b\x1b\xa1\x59\x09\x92\xfc\x2a\x60\x41\xed\x05\x7b\x1e\xbf\x23\x7d\xeb\xd8\xa2\x6f\x82\xcf\x25\x13\xfb\xc8\xbd\xfa\x1e\x73\x97\x8c\x91\x7b\x13\xac\x1f\xb1\x98\x95\xa2\xcc\x0d\xec\x86\x1a\xfb\xf6\x2a\x8c\xae\xfb\xe7\xdd\xa4\xbf\x01\x40\x19\xd0\xbc\x4f\x43\x89\x4d\xbe\xbf\x5b\xff\x13\x05\x9b\xbc\x39\x05\x9b\x9c\x86\x37\x7a\x3b\xd3\x60\x49\x7e\xaf\xcd\x88\xe4\x83\x64\x88\xcf\xc2\xdd\x64\x10\x66\xe1\x0e\xd2\x43\xba\x1a\xce\x42\xde\x96\xcb\x05\x23\x8f\x36\x9e\x9f\x77\xeb\xdb\xf8\x4c\x14\x35\xa6\x4f\xd6\xce\xb7\x29\x38\xe4\xad\xe9\x38\xa4\xe8\xda\xdb\x6a\x40\x90\x2b\xd1\xbb\x39\xc0\xff\x2b\xf6\xf5\xe6\xbb\x17\xb7\x71\x04\x1e\x5b\x04\x1e\xdf\xa6\x5d\xd6\xba\x3e\xc4\x31\x47\xb6\x33\x49\xcc\x71\x95\x04\x03\xc0\x8d\xcd\x09\x86\xca\xcd\x2a\x45\x44\xf4\xfe\xab\x82\x34\xde\x20\x91\x46\x21\x0b\x6e\x4d\x07\x19\x57\x44\x14\x20\xbe\x88\xf8\x22\xe2\x8b\x88\x2f\x22\xbe\x88\xf8\xe2\xb2\xf1\xc5\x4f\x6b\x6d\x66\x96\x4c\x71\xb4\xf2\x18\x19\x57\xd0\xca\x15\x66\xab\x34\x46\x1e\x9b\xdb\xf6\xeb\x9d\x57\x85\x0a\x90\xfb\x63\x05\x74\xbc\xbb\x01\xe8\x28\x94\x81\x5b\x52\xf1\xc6\x76\xeb\x02\x08\x35\xae\x37\x0d\x04\xa1\x46\x84\x1a\xaf\x30\xd4\xb8\xb2\x20\x4f\x23\x58\xb0\x7d\xa7\xb9\x89\xdd\x64\x50\x1f\x30\xfb\x25\x4c\xa8\xab\x00\x23\x7f\xe1\x19\x81\x2d\xbe\xb6\x9b\xdc\x15\x61\x8b\x3c\x4f\x57\x24\x18\xdd\x70\xc1\x73\xca\xf3\x34\xef\x58\xf6\x7c\xa0\xff\x75\x97\xfe\xc7\x1b\xe2\xad\xee\x15\x5a\x73\xb9\xba\x26\x65\x69\x67\xa0\xb4\x11\x56\x5a\x9b\x72\x76\xed\x59\x8c\xf7\xd1\xd4\x7a\x30\x6d\x57\x1b\xd3\x76\x9d\x6d\xbc\xb6\xf6\xe8\xbb\xaa\x60\xfd\xb4\x71\xc1\x84\x5d\x18\xfb\x18\x13\x76\x61\xd8\x0c\x0c\x9b\x81\x61\x33\xd6\x6b\xd8\x0c\x4c\xd8\x85\x09\xbb\x30\x5c\x01\x86\x2b\xc0\x70\x05\x18\xae\x60\x4d\x84\x2b\xc0\x84\x5d\x98\xb0\xeb\x6a\x71\xd0\xc6\x84\x5d\x2b\x91\xb0\xeb\xb3\xb7\x90\xfb\x79\xc2\x2e\x8b\x1d\xba\x8a\x36\x98\x7e\xd8\xd3\x32\x6b\xd7\x0c\x0d\xad\xc1\x01\x71\xde\xb7\x25\x0b\xf1\x65\x03\x01\x58\xe6\xf4\x97\xdf\xa2\x7f\xa1\x83\xdc\x54\xf1\xfe\x39\xf1\x62\x67\x17\x10\x11\xf9\xb3\x51\xaf\xc7\x5b\xf0\xf0\xe4\xf8\x34\x2f\xb6\xb7\x97\x3d\x38\x9c\x2c\xe5\x0c\x2f\x24\x7e\x8a\x5b\x03\xdb\x4c\x53\xfc\x61\x92\xe7\xf8\xdb\x23\xe4\x61\xc0\xdf\x80\x4e\x93\x8a\xbf\xb1\x32\xfa\xad\x62\x91\xcd\x98\xd0\xf3\x63\x08\xae\xb2\xfb\xc4\xe7\x67\xe3\xa6\x37\x84\xe4\x68\x63\xb4\x2d\xa7\x3f\x20\xd0\xb6\xf4\xe1\x52\x51\x36\xa8\x5f\x40\x72\x4a\x2b\x1a\xd0\x26\x3b\xbf\xb1\xb5\xf6\x58\xf6\x46\xe4\xc7\x26\x86\xb3\x5f\x3c\x7b\x25\x46\x34\x37\x4b\x0a\x64\xa6\xc2\x0e\xb9\x02\x43\x8a\xf6\x49\xe4\x50\xb6\xc8\xa1\xfc\x07\x6d\x75\x84\xce\x1c\x27\x5b\x5a\xe4\x5c\x4c\xb6\x5c\xa7\xe2\xad\x54\x0e\x49\xee\xf3\xd7\xd6\x16\x6f\xbb\xab\xb8\x1c\x4d\xc8\xb9\x1d\x60\x87\x5c\x6d\x29\x87\x4c\x8f\xf5\x26\x49\x91\xe9\x81\x4c\x8f\x2b\xcc\xf4\x58\x5f\x7a\x72\x43\x87\xb4\xbd\xe4\x1e\x7d\xb7\x39\x28\xa9\x1f\xcf\x55\xf9\x22\x71\x49\xd5\x9c\x91\xb6\x33\x3a\xbe\xb1\x9d\xdc\x10\x31\x3a\x84\x5b\x98\xfe\xf9\xed\xfa\xaf\x75\xc4\xe4\x8d\xbb\xea\xa7\x55\x16\x34\x45\x38\x40\x73\x76\x05\xbf\x72\xb5\x51\x29\x5e\x40\xee\xe7\x53\x74\x2f\xb9\x07\xa6\xe8\x00\xe9\x27\x3b\x9a\x24\x23\xb5\x25\x21\x50\xdb\xdc\xce\x90\x24\x81\x24\x09\x24\x49\x20\x49\x02\x49\x12\x48\x92\x40\x92\x04\x92\x24\x90\x24\x81\x24\x09\x24\x49\x20\x49\x02\x49\x12\x48\x92\x40\x92\x04\x92\x24\x90\x24\xb1\x5a\x24\x89\xdf\x7b\x8c\x0c\x73\x92\x44\x55\x98\xfb\x3a\xf1\x99\xc4\xb3\xe0\xb1\x6d\xd3\x40\x7f\xd5\x63\xfa\xcf\x6f\xaf\xcc\x95\xba\xa3\x3e\x2c\x27\x12\xa4\x72\x9f\xed\xde\x2e\xf6\xb0\x9a\x33\x35\xf6\x24\x4e\x3c\xb8\xc6\x41\xba\x1c\x02\x5b\x08\x6c\x61\xd2\x5c\x04\xb6\x10\xd8\x42\x60\x6b\xfd\x00\x5b\x6b\x28\x27\xec\x9a\x01\xb6\x30\x59\x29\x02\x5b\x08\x6c\x21\xb0\x85\xc0\xd6\x95\x48\x56\xba\xae\x71\x28\xcc\xa6\xb8\x9e\xb3\x29\xe6\xae\x42\x1c\x6a\x62\x96\x1c\xe3\xe4\xa6\x51\x92\x03\x72\xd3\x7d\xa4\x0e\xe5\x36\xab\x80\x55\x0b\x83\xd9\x04\x42\xd4\x16\xa6\xd3\x63\x8d\x99\x4e\x07\xf4\xfd\x9c\xe9\x94\xa8\x3d\x8d\xf0\x54\x9d\x40\xd2\xfc\xe8\xd6\x4a\xb4\xec\xb9\x7c\x4b\x32\xac\x0a\x60\xac\x87\x5f\x5f\x4d\x68\x8c\x23\x59\x13\xe4\x28\x39\x5c\xc1\x82\xbe\x97\xec\x69\x65\x48\x90\x01\x8d\xbe\x24\x2d\xfa\x92\xfc\x8f\x46\x8e\x70\xc1\xf0\x00\xb9\x1f\x04\xc3\x3e\xd2\xe2\x2c\xe4\x91\x40\x07\x21\x12\xa8\xf4\x17\x69\xbd\xb4\x13\x3c\x12\xe8\x61\x32\xaa\x44\x02\x6d\xbd\xb8\xd6\x25\x56\xc9\x6b\x5e\x62\x35\x48\x69\x5b\x5b\x94\xf5\x7e\xa7\xaf\x52\x62\x99\x22\xe8\xab\x12\x41\xd7\x9b\xad\x90\x5e\xbb\xf9\x33\xaa\xf4\x1a\x91\x8f\xaf\x8e\x1c\x5b\x99\xf8\xe1\x08\xf1\x22\xc4\x8b\x10\x2f\x42\xbc\xeb\x07\xe2\x45\x1d\xae\x81\x0e\xb7\x76\x30\x70\xcc\xdd\xb0\x2a\xb9\x1b\xd0\xd4\x80\xa6\x06\x34\x35\xa0\xa9\x01\x4d\x0d\xeb\xda\xd4\x80\x29\x7c\x30\x85\x0f\xa6\xf0\x59\xa9\x14\x3e\x68\xc9\x43\x4b\xde\x7a\xb5\xe4\x4d\x14\xdb\x9c\xbd\xaa\x11\xc8\xbc\xc2\x20\xf2\xe3\xbd\xe9\x20\xf6\xb3\xf5\x67\x71\x69\x11\x4b\x72\x72\x35\x66\x1f\x79\xcf\xcd\xa4\x2b\x8a\x55\x51\x99\x77\xa4\x32\xb4\xe0\xbf\x3f\x4f\x7f\x42\x89\x61\xd1\x5f\x37\x94\x60\x65\xda\x89\x5e\x23\xce\x73\x5c\x79\x6f\x45\xc2\x08\x9e\x23\xa3\x7c\x22\xb2\x09\xc8\x26\xe2\x3d\x64\x37\x19\x6c\x9c\x73\xbb\xa2\x6d\x97\x9b\xf7\x78\xaa\xf1\xfc\x1c\xd0\xfb\x1b\x25\xed\x48\xcc\xc9\xce\x3f\x53\x32\x20\xef\x6c\x14\x04\xb0\x6a\x20\xb6\x25\xb2\x22\xaf\xc6\x58\xe4\x8e\x90\x31\x32\x52\x61\x98\x6d\x65\x30\x10\xd1\x43\xab\x6c\x8b\x56\xd9\x0f\x6a\x6d\x92\x07\xe3\xdc\x24\x9b\x23\x0f\xc4\x26\xd9\x15\x12\x2d\x2b\x20\x3b\x1a\x05\xe4\x7b\xe5\xb5\xb1\x68\xd9\xdf\x74\x00\xbe\x2a\x19\x73\x67\xa9\x76\x62\x28\x0c\xbe\x87\xc1\xf7\x30\xf8\x1e\x06\xdf\xbb\xaa\x83\xef\xad\x96\x76\xd9\x30\xe1\x62\x73\x7b\x44\x13\x3b\x83\x12\xea\xec\x20\x39\xa0\xef\x37\xf7\xca\x73\xcc\xad\x6a\x28\xbd\xca\x42\x56\x21\xa0\xde\x97\x7b\xc9\x01\xee\xf1\xeb\xcf\x58\xf9\x6c\xd4\x4b\xa9\x91\xd1\xf3\x4e\x39\x08\x99\xa8\x72\xe4\xf9\x45\x7f\x73\xaf\xfe\xbe\x0e\x72\x33\x7b\x79\x58\x7d\x57\x86\x9a\xbd\x1d\x8e\x32\xc9\x3d\x6d\x84\x17\x34\xe5\x39\xb4\x17\xa2\xa6\x4f\x55\xbe\x2e\xc2\xca\x2a\x0f\xb6\xfd\x08\x53\x6b\x7a\x2c\x6f\xf6\x41\xaf\x45\xa1\x1d\x95\xe6\x36\x79\x84\xb1\x1b\x4f\xb1\xc3\xfa\xa8\x98\x3f\x35\x47\x48\x68\x27\x4a\xf5\xd5\x61\x1f\x3b\x7f\xb0\xa5\xde\x30\xdd\x19\x9d\x75\x6a\x8f\x54\x14\x13\x7d\xd5\x07\x6b\xd9\x67\x9c\x5a\x83\x82\xdb\x3f\x9e\x71\x56\xe9\x8c\x53\x6b\x0a\xb6\x70\xc6\xa9\x59\x54\xeb\xf0\x09\x3b\x8f\xac\xa2\xec\xe9\xfd\xe4\x8d\xf5\x64\xcf\x73\x84\xb1\xc1\x4a\x88\x9b\x1e\x7e\x75\xf5\xa5\xcd\xca\x50\x44\x51\xf4\x34\x10\x3d\x48\x53\x5a\x15\x9a\x12\xda\xa7\xd1\x3e\x8d\xf6\xe9\x95\xb2\x4f\x4f\x7c\x5a\x6b\xb3\x91\x6e\x8a\x3b\x96\x1c\x23\xe3\x8a\x63\xc9\x0a\x1b\xfe\x8c\x74\xc5\x61\xab\xbe\x99\x77\xd3\x6a\xea\x0e\xb9\xf7\x5e\x5b\x4f\x77\xe8\xad\x02\x52\x6b\x1f\x60\xba\xe1\x5c\xbf\xaa\x0a\x05\x02\xa8\xeb\x4d\x8d\x41\x00\x15\x01\xd4\xab\x0b\x40\x6d\xf9\x7c\xb9\x7a\x9b\x40\xe3\x14\x25\xfb\xc8\xbd\xfa\x1e\x73\x97\xc4\x55\x6f\x52\x71\x55\xa5\xec\x55\x80\x54\xbf\xda\x43\x76\x72\x48\x35\x08\x3d\xdf\x2a\x52\x25\x82\x22\x67\x7f\x58\x61\x68\xe5\xe7\xe6\x99\x86\x11\xe1\xa8\xef\xee\xd1\x5f\xd3\x41\x88\x78\xe3\xdc\xc2\x60\xe7\xb6\x14\xe0\x94\xc3\xc2\xc3\xf2\xf5\xde\xdb\xd8\x43\xd3\xfc\xa5\x33\x83\x95\xb7\xdb\x8c\x99\xce\xd4\xc6\x4c\x97\xe5\x95\x1b\x75\xcb\xc2\x60\xb6\xb2\xc5\x2d\x51\x8f\x92\xdd\x2c\xe6\x53\x65\xc9\xcd\x9a\x6a\x21\x35\xe4\xb7\xb6\x24\x86\x62\x7b\x3a\x38\x5a\x35\x1a\x86\x78\x6e\x95\x06\x64\xd9\x4e\xf9\x75\x3a\x1e\x37\x76\x84\x46\x5b\x84\x46\x7f\x41\x6b\xc1\x97\xbe\xce\x54\x5c\x3d\x29\xd3\x00\x20\x5d\x61\x21\xd4\xfb\xe6\x1b\x13\x52\xe6\x66\x09\x83\x56\x09\x96\x3b\xf8\xad\xd5\x92\x2b\x88\x80\x22\x02\x8a\x08\x28\x22\xa0\x88\x80\x22\x02\xba\x6c\x04\xf4\x63\xcb\x8c\xd1\x53\x4f\x13\x68\x21\xaa\x4e\x2b\x8a\x45\xf3\xb8\x67\x73\x2a\x41\x0a\xf7\xa7\x39\xf5\x20\xf7\x63\xd7\x26\x54\x82\x81\x06\xe8\x66\x95\xa2\x70\x3b\x1c\x87\x57\x41\x4f\x40\x60\x73\xbd\x69\x27\x08\x6c\x22\xb0\x79\x85\x81\xcd\x99\xf6\xed\x2c\x97\x4d\x0e\x5d\xe1\xc3\x61\x7d\xa2\x68\xe5\xab\xab\x80\x6a\xbe\xbf\x8b\xdc\x1e\x79\xb3\xf9\x54\xce\x6f\xb6\xd4\x7c\xa6\x96\xf8\x81\xfe\xaa\x2e\xfd\x3f\x14\x27\xb6\xdd\xf5\x33\xbe\x4c\xc5\x85\x8c\xc8\x42\x7a\x07\xe2\xbc\xcc\xa9\x0f\x5c\x6d\x69\x9a\xe7\xb8\x0e\xb3\x13\x74\x18\x36\x65\xef\x27\xf7\x91\xa1\x86\x64\xe6\xd4\x6f\x6f\x4b\x2c\xd3\xb3\x8d\xe7\xed\x1e\x7d\x57\xa5\xe3\x4b\x6a\x7b\x92\x13\x16\x73\xdd\x60\xae\x1b\x4c\xe2\x8c\x81\x10\x31\x10\x22\x06\x42\x5c\x3f\x81\x10\x31\x89\x33\x26\x71\xc6\x00\x74\x18\x80\x0e\x03\xd0\x61\x00\xba\x35\x11\x80\x0e\x93\x38\x63\x12\xe7\xab\x25\xe4\x16\x26\x71\x5e\x89\x24\xce\xff\xfe\x08\xb9\xbb\x06\xff\x50\xf8\x71\x07\xb6\xeb\x15\x68\xa0\xff\xfe\x23\xfa\x4f\x6c\x27\x37\xc4\x06\x27\xce\xa9\xbf\xbb\x3e\x70\x37\x32\x3d\x7e\xd2\x2b\xd0\xde\x9b\xd9\x63\xd2\xd4\xc4\x39\xf4\xfc\xd6\x1a\x07\xe5\x30\x2d\x33\x42\x55\x98\x96\x19\xa1\x2a\x84\xaa\x10\xaa\x5a\x47\x50\xd5\x1a\x4a\x49\xb1\x66\xa0\x2a\xcc\x95\x80\x50\x15\x42\x55\x08\x55\x21\x54\x85\x69\x99\x31\x98\xfb\x33\x07\x59\x5a\xf3\xc1\xdc\xaf\xca\xb4\xcc\xed\x77\x00\x15\x4e\xc7\x1c\x36\x3a\x6e\x07\x61\xb3\x34\xa6\x87\x1b\xd3\x98\xf6\xea\xf7\xd4\xa3\xdf\x89\x4a\xab\x9d\x8d\xcd\xd7\x6e\xad\xc6\xc4\x6e\x94\x09\x99\x23\xf8\xeb\x16\x7e\x65\x65\x01\x30\x8e\x57\x1d\x26\xa3\x24\x57\xc1\x75\xde\x45\x76\x2e\xb7\x7f\x91\xe3\x8c\x3e\x9e\x2d\xfa\x78\x7e\x4f\xab\xbd\xf4\x47\xf8\xd2\xbf\x8f\x0c\xc1\xd2\xdf\x43\x5a\x98\x9a\xe4\x28\xf7\x20\x1d\x26\x87\x62\x0f\xd2\xd6\x4a\x1a\xe7\x3e\x23\x39\xf2\x80\xe2\x33\xd2\x52\x51\xcd\x26\x5b\x6e\x4e\x16\x55\xc9\x99\x66\x84\x53\xef\x9f\xf5\x55\xcb\xa2\x5b\x53\x53\x2d\x47\x72\xe9\xee\x0a\x5f\x51\x2e\x97\xe4\xa3\x2b\x23\xa1\x30\xad\x32\x42\xb4\x08\xd1\x22\x44\x8b\x10\x2d\xa6\x55\xc6\xb4\xca\xe8\xad\x8f\x69\x95\xd1\x54\x80\xa6\x02\x34\x15\xa0\xa9\x00\x4d\x05\x6d\x31\x15\x60\xd0\x16\x0c\xda\x82\x41\x5b\x30\xad\x32\x5a\xe2\xd0\x12\x77\x95\xa7\x55\x5e\x46\xda\xe3\x95\x34\x73\xb5\x3f\x44\xc4\x3f\x66\xc8\xf3\x6a\x05\xbe\xd5\xff\x20\xa3\xff\x5e\x26\x11\xdc\xe8\xa6\x22\x0d\x93\x2a\x30\x37\x6c\xf6\x3e\xaf\x48\x63\x5e\xf9\xf0\xe4\x78\x04\xfb\xb5\x31\xb1\x65\x55\x41\x43\x55\x05\x0d\x35\x53\xd0\x44\x89\x3c\xc8\x27\xcf\x49\x72\x1c\x26\x0f\xd8\xea\x5a\x98\x3c\xca\x77\x36\x13\xe7\x41\xff\xe3\x1e\x32\xce\x3b\xdb\x2a\xd9\xf4\x62\x48\x5d\x58\xaf\x95\x5c\x7f\x58\x54\x03\xf9\x72\x10\x7a\xf3\x51\x0f\xab\x6d\x13\xe1\x87\x5f\xdd\xa3\xff\xe2\x46\xf2\x43\x89\xa2\xa4\xbd\xe1\x37\x34\xb1\x34\x63\x9b\xb4\xe5\x46\xaa\x9f\xf4\x0a\x80\x2a\xa2\x4f\x18\x95\x55\x64\x15\x25\x6b\x48\xaa\x67\x5d\x50\x62\x57\x0c\x7f\x27\xf0\x4c\xaf\x44\x25\x84\x12\x84\xd4\x2a\xf4\xc5\xe7\x3e\x38\xdb\x8a\x53\x02\x3b\x3a\xc6\x07\xda\xae\x04\x54\xa3\x94\x9d\xed\x1d\x84\xea\x86\xd5\xaf\x8b\x0c\x23\x35\x9a\xbd\xc6\x5d\x18\x26\x2e\xd4\xb6\xc7\x4d\xf2\x09\x39\x4e\x8e\xc0\x84\x1c\x26\x87\xc8\xc1\x16\x26\x24\x70\x11\xc6\x16\x94\x70\xa9\xb5\x63\xe2\x2c\xf2\x98\x38\x2f\x6a\x2c\xad\x4e\xea\xc7\x6b\x19\xc2\xd2\xe6\x71\x24\xc4\x6a\x8c\x12\x46\x1d\x41\x57\x0e\x8c\x3a\x82\x76\x42\xb4\x13\xa2\x9d\x70\x3d\xd9\x09\x31\xea\x08\x46\x1d\x41\xfb\x0c\xda\x67\xd0\x3e\x83\xf6\x99\x35\x61\x9f\x99\x18\x23\x23\xfa\xb0\x79\x48\x86\x2b\xbd\x2b\x91\x7f\xa9\xc6\xf1\x6d\xe5\xc3\x96\x62\xf0\x12\x04\xb6\x31\x78\xc9\xd5\xe3\x62\xa2\xbf\xfa\x5c\x94\x3c\xcd\x62\x67\xb7\xa2\x0d\x01\xe2\xe3\x6c\x71\x12\xd8\x14\xb0\x81\x9d\xa7\x81\xfe\x47\x8f\xe9\x5f\xdd\x4e\x6e\xaa\x78\x43\xe2\x97\xdd\xf5\xe3\x99\x0c\x4f\x8e\x4f\xf3\x92\x7a\xef\x62\x4f\x0e\x27\x8b\x11\x40\x61\xfc\xd4\x1a\x87\x06\x31\xba\x09\x42\x62\x18\xdd\x04\x21\x31\x84\xc4\x10\x12\x5b\x47\x90\xd8\x1a\x62\x86\xaf\x19\x48\x0c\x29\xcb\x08\x89\x21\x24\x86\x90\x18\x42\x62\x18\xdd\x04\x39\x95\xcf\x1c\xe8\x69\xcd\x73\x2a\xaf\xca\xe8\x26\xaf\xd4\x48\x91\x53\xa7\xce\x93\xc7\x80\x3a\xf5\x10\x39\x43\x4e\xa7\x52\xa7\xd8\x44\xe8\xb7\x8a\x45\xd6\x5b\xa1\xe7\xc7\xec\xa9\x4a\xd4\x2a\x0a\x29\x10\xc3\x47\x6d\xc9\xe2\x44\x1b\x33\xad\x72\xfa\x03\x31\xb1\x2a\x05\x49\xab\x66\x84\x72\xae\x55\xdc\x52\x62\xfe\x3c\xa9\x8d\xaa\x3d\x27\x8a\x88\xe2\xaa\x08\xda\x76\x7e\x75\xd5\x30\x34\x0e\x79\xcd\x92\x02\x99\xa9\x08\x90\x32\x45\x26\xdb\x3d\x74\xe8\x9e\x8b\x01\x54\x5a\x0c\xa0\xf2\xd5\x4c\x6d\xc2\x66\x9e\x4b\x9d\x47\xc8\xc3\x20\x75\x20\x96\x46\xbb\xa7\x2e\x99\xe3\x01\x56\x2c\x72\x2e\x0e\xb0\xb2\x32\x35\xd9\x3c\x00\xcb\x0c\x39\xaf\x04\x60\x59\x91\xaa\x22\x69\xd9\x9c\x34\x6c\x2c\xef\xea\xcb\xcb\x46\x71\x60\x7a\x7f\xd0\x57\x5b\x5a\xde\x91\x1a\xb3\x45\x11\x9c\x3b\xf9\x03\xe9\x82\x33\x0e\xdf\xb2\x62\x22\x14\x23\xb8\x20\x0c\x8d\x30\x34\xc2\xd0\x08\x43\x63\x04\x17\x8c\xe0\x82\x11\x5c\x30\x82\x0b\x9a\x43\xd0\x1c\x82\xe6\x10\x34\x87\xa0\x39\xa4\x2d\xe6\x10\x8c\xe0\x82\x11\x5c\x30\x82\x0b\x46\x70\x41\x6b\x23\x5a\x1b\xdb\x1e\xc1\xa5\x26\xb6\xde\xd6\xd0\x2e\xad\x44\x70\x59\x1d\x4b\x5d\xfb\x83\xb9\xfc\x75\x17\xb9\x3d\x22\xe2\x97\x82\x81\x85\x28\x94\x48\xc1\xa2\xf3\xec\x44\x14\x06\xfa\xaf\x77\xe9\x1f\xdb\x40\x36\xb3\xfb\xe7\x16\x06\x3b\xcb\x42\xd9\x74\x0b\xf6\x82\x5d\x28\x5b\x4e\x22\x60\x88\x3c\xd8\x8d\x42\x01\xd3\x34\x6c\x4b\x64\x90\x6c\x6f\xb7\x88\xed\x51\x0a\xce\x0c\xca\xb2\x8f\xdb\x41\x78\xd8\xf3\x87\x1d\xe7\xa4\x35\x4f\x83\x92\xd5\xce\xe8\x31\x2b\x16\xd2\xa3\xed\x91\x3b\x1a\xda\x99\xb7\xa5\xcf\xe4\x6b\x75\x02\x0d\xe3\xc6\xe6\x13\x8d\xa7\x70\xaf\xde\x2d\xa7\x70\x29\x10\xf3\x53\x8e\x86\x3a\x81\x31\x64\x07\xfa\x27\x60\xc8\x0e\x34\x0c\xa1\x61\x08\x0d\x43\xeb\xc9\x30\x84\x21\x3b\x30\x64\x07\x02\xf2\x08\xc8\x23\x20\x8f\x80\xfc\x9a\x00\xe4\x31\xd6\x06\xc6\xda\xb8\x5a\x20\x48\x8c\xb5\xb1\x12\xb1\x36\x2e\x5d\x4b\x4e\x0a\x88\x4f\x00\x43\x15\x91\x36\x06\x5c\x09\x9e\xf1\x40\xc1\xf0\xfb\x65\x03\x8e\x97\xb7\x9c\xa0\x0c\x82\xca\xca\xe7\x69\x10\xb0\xc3\x04\x5d\x0c\xf4\xdf\xbd\xc6\xfc\xda\x46\x72\x63\xa2\xbc\x73\x0b\x83\x9d\x77\xca\xf4\xa9\xc7\xd9\xbb\xd3\xfc\xdd\x61\x78\x77\x0a\xde\xed\xdd\x2b\x3c\x07\xd4\x57\xcf\x0c\x4a\xf8\xae\x50\xeb\xc5\x36\xf3\x60\xc1\xe7\xa3\xc2\x95\xa0\x4e\x44\xe7\x6c\xb2\xeb\x16\x06\xb3\xb5\xda\x39\xf1\x81\x0c\x79\x21\xa7\x46\x9f\x26\x53\x0a\x35\xba\x6e\xc4\xe8\xe6\xcb\xaf\x8d\x81\x2f\x27\x42\xf5\x32\xea\x7b\x98\x33\xca\xa7\xc9\xf3\x63\x46\x79\x9b\xca\x6e\x36\xf3\xa6\xd3\x18\x99\x1c\xd7\x8f\x44\xc8\x64\xca\x24\x17\x48\x65\xcd\x6f\x4c\x00\x97\x48\xed\xab\x4f\xed\x9b\x40\xef\x8f\x1a\xde\x1f\xe7\xc9\x63\xfa\x23\xe6\xc3\x32\x3a\xda\x90\x50\xf2\x78\x4f\xb8\x05\x98\x9b\x46\x90\xf7\x4a\xb4\xcf\x08\xca\xf9\x39\xd6\x02\xd8\xd7\xa8\x35\xcf\xb7\x86\x92\xef\x81\x52\x69\x6e\x95\x82\x78\x25\x03\xa7\xe9\xff\x92\x21\xb7\xd5\x0d\xc4\xa4\x7f\x39\xa3\xff\x41\x86\xdc\x50\x71\xbb\xb3\xb3\x08\x16\xfd\x59\xcf\x9f\x97\xbb\xad\x65\xc0\x1a\xec\x65\xf7\x2a\x3c\x1c\x86\x27\xc7\x8f\xb0\x7b\x6b\x30\xb6\xbf\x4d\x4e\x72\xc9\x79\x84\x8c\x81\xe4\x3c\x44\x0e\x92\x03\xad\xc5\xf6\x87\x6f\x6c\x18\xd4\xff\x9f\x33\xe4\x39\xbc\xd3\x67\xc0\xd8\x16\x05\xbb\xd2\xbf\x9a\xd1\xbf\x9c\x21\xd7\xc1\x55\xe9\x53\x52\x33\x81\xc2\x2d\x45\x1a\xe6\xd8\xa3\xb1\xdf\x1d\xe6\x50\x48\xe9\xee\xff\xe8\x24\xfb\x1b\x04\x1b\x53\xe3\x8c\x89\x64\x09\x03\x01\x18\x83\xf5\x4f\x75\xea\xbf\xdc\x41\xf4\x6a\x8f\x9f\xce\x2e\x9f\x5a\x05\x83\x3f\x16\x49\xdd\x18\x79\x50\x9c\x7e\xee\x66\x0f\x56\xb9\xfc\xc4\x0f\x70\xb3\x73\x7b\x35\x9c\x89\x25\xf2\x18\xef\xee\xb3\xe4\x41\xe8\xee\x53\xe4\x04\x39\x76\xb9\xbe\x59\xaa\x07\x58\x23\xab\xe3\xf9\xc6\xdb\xf6\x41\xfd\x40\xd3\x36\xf1\x6a\x73\xf8\xe3\xb7\xa5\x2b\x0e\x9b\xf4\x0d\x45\x1a\x92\xce\xcf\x6c\x4d\x1d\xb7\x5e\x9f\x96\x1c\x2b\x4f\x9b\x19\xba\x6e\xf1\xec\x2a\x8f\x5e\xce\x22\xe7\xc8\xa3\x15\xfa\x69\x7b\x87\x0f\x5d\x18\xd0\xcb\xb5\x45\x3d\xe7\x2f\xb5\xda\xa7\x90\x95\x16\x3a\x79\x7e\x1c\x79\x84\x3c\x1c\x1f\x47\xda\x5d\x49\x24\xc0\x6a\x8b\x97\x52\x39\x24\x2b\x2f\xdf\x72\xbf\x74\x6d\xaa\x00\xdb\x5d\xb2\xfc\xd0\x06\xab\x2d\x87\x0a\x9a\x91\x64\xdb\x4b\x22\x39\xce\x6a\xc9\xb1\x5b\x2a\x0b\xea\x87\x16\xec\x00\x1d\xe2\x56\xf5\xe6\x3c\xf5\x8b\x54\xbd\xbb\x5d\xbd\x0b\x6d\xa5\x45\x3b\xdf\x5f\xf5\x5c\xa2\x14\xf6\x7b\x49\xdc\x65\xad\xcc\x31\x3d\x63\xa2\x42\x86\x0e\x91\x7d\x2d\x68\x1c\x93\xc0\x70\x40\x81\xd9\x40\x60\x7e\xb4\x83\x7c\xa8\x43\xff\x40\x47\xe7\x93\x92\xf2\xf3\x44\xc7\xfa\x11\x98\x15\x46\x21\xd6\xcf\x40\x72\x00\xc3\x25\x9b\x9c\x31\xd5\xa9\xbb\xc6\xc4\xed\x01\x6b\x3f\xe7\xc4\x58\x0e\xbc\xe9\x7a\x6e\x3f\x7f\x1b\x9e\x00\x4e\x54\x60\x74\x4f\x04\x9e\x3b\xc9\x39\x3f\x27\xd8\xb2\x10\xbf\xa7\xa3\xc5\x12\x5f\xec\xa9\x2d\xc9\x73\x5f\xd2\xc8\x17\x35\xfd\xf3\x5a\xe7\xe7\x24\x9e\xf9\x94\x76\xd8\xf3\xf3\xc0\x23\x29\x7a\xd0\xed\x9e\x61\xce\xb2\x4b\xa6\x31\x9c\xf8\x0a\x40\xaa\xb9\xc3\x58\x39\x88\xd9\x0d\xfd\x56\x1e\x3e\x1c\x38\x23\x8e\x9d\x17\x4c\x70\xea\x14\x02\xc3\x5b\x14\x7d\xca\x39\x15\x25\xea\x95\x1c\x9a\x35\x78\x8d\x40\xd2\x8a\xc6\x12\x10\xe3\xd4\x0e\x90\xd5\x9b\x1b\xa1\x59\x09\xc2\xd1\x95\xd7\x7a\x6b\xa7\xcf\x2a\xf1\xf4\x59\x2b\xbe\x6d\x4c\xec\x25\xf7\xe8\xbb\xcd\x41\x89\x43\x3c\x57\x8d\xd2\x1e\x3f\xb8\xf2\x71\xd9\xd9\x49\xf7\x96\x3a\xd8\xb3\xfe\xfb\x19\xfd\x0b\x19\x72\x5d\xe2\x66\x5d\x68\xe1\x79\x45\x1a\x26\xb0\x63\x04\x16\x94\x93\xee\xdf\x74\x47\x61\xb5\x5d\xaf\xa0\xe6\x65\xe4\xa4\x5e\xbf\xec\x86\xf6\x3c\xcd\x3b\x56\x10\xc8\x73\xae\xfe\xa1\x6e\xfd\xff\x6c\x20\x9b\xd9\x1b\x4c\xb9\xf8\xc5\x66\xd2\x00\x4e\xf1\x92\x46\x58\x49\x6b\x22\xf5\xdf\x4d\x50\xdd\x49\xaf\x40\xcf\x0c\xaa\x8d\x43\x36\xf0\x72\x24\x94\x48\xf0\x77\xb6\xb1\x84\xda\xa3\xef\xe2\x72\x47\xed\xec\x84\x58\x12\x02\x4c\x99\x88\xc8\x09\x46\x4e\x30\x72\x82\x91\x13\x8c\x9c\x60\xe4\x04\x23\x27\x18\x39\xc1\xc8\x09\x46\x4e\x30\x72\x82\x91\x13\x8c\x9c\xe0\xd5\xe6\x04\xef\x27\x7b\xf5\x7b\xcc\xdd\x12\x20\x7a\x9e\x0a\x10\xa9\x27\x3a\x4c\xdd\x87\x74\x62\xa4\x13\x23\x9d\x58\xa1\x13\xff\x4f\x17\xc9\xa6\x61\x8c\x9c\xc2\x94\x06\x34\xea\xbf\xdf\xa5\xff\xe6\x06\x72\xad\x40\x18\x39\xab\xe9\x62\x73\x61\x04\xda\x0e\x34\x66\x7b\x0d\x05\x2a\x84\xb6\xa8\x75\x1c\xb7\x83\x10\x31\xc3\x16\x23\x08\x3c\xd2\x18\x37\xdc\xaf\xef\x4d\x01\x06\xeb\x43\x89\x3c\x18\x06\x82\x87\x08\x1e\x22\x78\x88\xe0\x21\x82\x87\x08\x1e\x22\x78\x88\xe0\x21\x82\x87\x08\x1e\x22\x78\x88\xe0\x21\x82\x87\x18\x50\x00\x11\x40\x44\x00\x11\x01\x5c\x2d\x04\xf0\x2d\x5d\xdc\x7d\x11\x42\x07\x78\x85\x98\x49\xf8\x83\xed\xfa\x67\x33\x64\x73\xde\xf3\x81\x49\x78\x13\xf8\xc7\x25\xcf\x96\x27\xbd\x02\xed\xbd\x9e\xdd\x18\xf1\x7c\x7a\x66\x90\xfd\xdd\x66\xc7\xb7\x69\xb2\x8f\xc3\x63\x83\x64\x00\xe0\xb1\x1e\xd2\x45\xee\xae\xe9\xad\xce\x5a\x9b\x5d\x18\xcc\xb2\x96\x34\x84\xc1\xea\x3b\x9c\x3d\x7e\xb8\x31\x00\xb6\x4d\xbf\x53\x00\x60\xa6\x29\x70\x2f\xa8\x59\xa5\xce\x75\xbe\x7c\x4b\xdc\x8b\x9d\x91\xb7\x5a\x4a\x47\x3e\x4b\xdc\x5b\xa9\xbe\xcc\x1d\x20\xfb\xc9\xde\x0a\x17\x8a\x66\x3b\x13\xfd\x25\xd0\xc1\xac\x45\x07\xb3\xb7\x68\x97\xb1\x86\x0f\x72\x0f\xb1\x7b\xc9\x9e\xd8\x43\xac\x8d\x22\xa0\x4d\x6b\xbc\x81\x73\x59\xef\xdf\xde\x10\x8b\x80\xeb\x44\x34\x7a\x8b\xaf\xfa\x1b\xf9\x9f\x2b\xb6\xe8\x57\x26\x47\x20\x4a\x83\x06\xd2\x00\xf3\x54\xad\x4a\x9e\x2a\x4c\x50\x82\x09\x4a\x30\x41\xc9\x4a\x25\x28\x99\xf8\x74\x1d\xdf\xf0\xb6\x66\x69\x20\x53\x3c\xca\xd6\x31\x32\xae\x44\xd9\x6a\x4f\xe6\x87\x76\xed\xf1\x46\xfa\x1e\xbf\x55\xdf\xcc\xbb\x9b\xe4\x7e\xfb\x9a\x78\x9b\xdf\x56\xe5\xd6\x9d\xa2\xf2\xdf\x00\x5e\x84\x2b\xb1\xf7\xa3\xbf\xf6\x7a\xd3\x38\xd0\x5f\x1b\xfd\xb5\xaf\xb0\xbf\xf6\x4a\x82\x35\x0d\x3d\xb1\x9b\x13\xf3\x35\x84\x7b\x2c\xfd\x27\x06\xc9\x80\xde\x6f\xee\x90\x74\xda\x1b\x55\x3a\x2d\x7b\x71\x15\x3c\xad\xbf\x9e\x21\xd7\x27\x13\xf9\xe8\xbf\x9b\xd1\xff\x7f\x99\x38\x71\x4f\xcd\x38\x62\x3f\x04\xe1\xda\x4a\xc1\x19\x8c\x20\x56\xc3\xaf\xfa\xff\x12\xb2\xab\x7e\x08\xd5\xd4\x30\xa9\xbf\x4a\xcc\x0f\xa6\x85\x49\xbd\x55\x86\x49\x4d\x8b\x90\xda\x9d\x1a\x21\x75\xe5\x43\xa2\x4e\x93\xe7\x93\x53\x15\xdb\x6f\x1d\x5e\x61\x75\x98\xcf\xb4\x68\xa8\x97\x32\xcb\x22\x2b\x36\x55\x28\x9f\x05\x83\x30\x0b\x24\xc2\xd3\x86\x62\xcf\x70\x85\xf2\x14\x39\xa1\x28\x94\x6d\x28\xb7\x91\x9c\x6a\x14\xfe\xb4\xd8\x58\x4c\x8d\xea\xb9\x14\xd9\x54\x27\x14\x6a\x5a\x3b\x31\xf2\x29\x46\x3e\x6d\x11\xb0\x6d\xfb\x76\xf6\xf6\x6b\xc8\xde\xba\x12\x97\xd3\xcd\x53\xc5\xee\x5f\x10\xf3\x0f\x36\x92\x1f\xaa\x14\xbb\x9c\x77\x5e\x5f\xf6\xf6\xa7\xca\x5e\x78\x73\xed\xc7\xa4\x86\x66\xa6\x4a\xe1\xf6\xc4\xa4\xae\x59\xfe\x0a\xc5\xa4\xae\x5d\xdf\xe5\xc7\xa4\xae\x59\x76\x24\x94\x9b\x8b\x39\x5d\x5b\x98\x56\xf1\xd7\xeb\xc9\xe4\x46\x5b\x00\x4a\x66\x94\xcc\x6b\x45\x32\xff\x5d\x0f\x19\x4a\x0b\x5e\x5c\x23\x89\x40\xde\xf7\xdc\xc7\xbd\x19\xc9\x11\x78\x7f\x8f\xfe\xbd\xaa\x10\xc7\x9d\x29\x4c\x81\x11\xdf\x73\x27\xbc\x99\xde\x3b\xd9\x3d\x35\xcc\x71\x9c\x2b\x40\x3c\xd2\x66\xfe\xc0\x23\x64\x98\x4b\xad\x21\xb2\x0f\xa4\xd6\x2e\xb2\x93\x64\x6b\x4a\x16\xf8\x12\x29\x51\x44\x93\x2e\x97\x48\xf0\xfc\xc6\xd2\x27\xab\xf7\x09\x91\x02\x2d\x10\x7a\x5d\x54\x7f\x95\xf8\xe9\xfc\xed\x2d\x95\xbd\x7e\x5b\x3a\xb3\x20\xea\xf8\xbb\xc4\xed\x55\xec\xfb\xdc\x28\xc9\x91\x07\x2a\xb6\xc0\x65\x77\x3e\x02\x7f\x48\x3c\x68\x51\x5a\xbe\x4f\x23\x87\xb9\x6e\x71\x88\x1c\x8c\x75\x8b\x76\x4a\x80\x36\x48\x97\x26\xe3\xd3\xb6\x5f\x88\xf4\xbe\xee\xc6\x4a\x21\x72\xa3\xe4\x26\x44\x72\x63\x1b\xbf\xb2\x9a\x62\x03\x19\x0b\xc8\x58\x40\xc6\x02\x32\x16\x90\xb1\x80\x8c\x85\xf5\xc9\x58\x68\xff\x5e\xdf\x04\x79\xe1\x5f\xae\xa9\xd4\x06\xb6\x37\xa0\x30\x44\x3a\x82\x09\x16\xb8\x55\x52\x11\x90\xd8\xb0\xde\x14\x13\x24\x36\x20\xb1\xe1\x0a\x13\x1b\x56\x05\x45\x6a\xc8\x70\x68\xff\xb6\x30\xb1\x87\xec\xd2\x77\x9a\x59\x49\x76\x78\xb6\x4a\x76\x10\xaf\x55\xf3\x1d\xae\xc2\xd4\x78\xbf\xda\x4d\xee\xe3\x40\xa7\x3f\x63\xe5\xb3\xb5\x2c\xff\x3c\xe2\x51\xde\x29\x07\x21\x13\x80\x0e\x9d\x61\xb2\xd7\x2d\x06\xfa\xf7\xbb\xf4\x7f\xda\x40\x9e\xc3\xde\x1e\xae\xa4\x00\xfc\x70\x73\xe1\x8f\x46\x78\xb1\x53\x9e\x43\x73\xbc\xd8\x36\x05\x41\xca\xc2\x0b\x53\x95\x4d\x3b\x33\x58\x5d\x23\x86\x44\xba\x8c\x90\x48\x17\x1a\x2f\xc0\xa3\xfa\x61\xb1\x00\x6b\xce\xb3\x68\x51\x56\x8d\x4d\x32\x73\x29\x46\x48\xc2\x08\x49\x18\x21\x09\x23\x24\x61\x84\x24\x8c\x90\x84\x11\x92\x30\x42\x12\x46\x48\xc2\x08\x49\x18\x21\x09\x23\x24\x61\x84\x24\x8c\x90\x84\x11\x92\x30\x42\x12\x46\x48\x5a\xa5\x08\x49\xbf\xdf\x4d\x86\x1b\x43\x87\x6a\xc4\xf4\x34\xfc\xf0\xd5\xdd\xfa\xd3\x1b\xc8\xcd\x69\xf8\x21\xb7\xb6\x5d\x69\x10\x71\x77\x2d\x10\x11\x9a\x87\x48\x62\x5b\x91\xc4\x52\x63\x24\xf1\x84\x7e\xac\x2d\x48\x22\x06\x5c\x47\x38\x11\xe1\x44\x84\x13\x11\x4e\x44\x38\x11\xe1\x44\x84\x13\x11\x4e\x44\x38\x11\xe1\x44\x84\x13\x11\x4e\x44\x38\x11\xe1\x44\x84\x13\x11\x4e\x5c\x5d\x38\xf1\x4d\x3d\x64\x40\x06\x5c\x4f\x77\xb3\xa6\x6e\xa1\xe4\xd9\x6e\x28\xfd\xac\xff\xa2\x5b\xff\x1b\x25\x16\xfb\xad\x29\x1e\xd6\x63\xd1\x3b\xbd\xb7\x29\x01\xd9\x25\x0f\x5f\xde\x6e\xb3\x7f\xf5\x43\x3c\x42\xf3\x4e\x88\xd0\x9c\x39\x75\x4c\xcf\x92\x3e\xd2\xdb\x30\xe4\x97\x6c\xce\xe5\xfa\x56\x1f\x6b\x0c\xa4\x75\xeb\xdb\x2b\x83\x3b\xc6\xd5\x27\x22\xb5\x3f\xa5\x44\x6a\xbf\x23\xdd\x9f\x3a\xee\x66\x23\x19\xae\x7d\xa5\x7b\x3a\xf7\x00\xb9\x9f\xdc\x57\xe1\x77\xb0\xac\xae\x46\x4f\x03\xf4\xa4\x6e\xd1\x93\xfa\x5d\xda\xe5\x2e\xf3\x1c\x77\xc4\x3e\x40\xf6\xc7\x8e\xd8\xed\x16\x15\xed\x94\x05\x8d\x22\xba\xff\xa7\x12\xd1\x3d\xf2\x9a\x8e\x65\xc3\x1d\x89\xa0\xee\x2b\x2e\x1a\xd0\x63\x1a\x3d\xa6\xd1\x63\x1a\x3d\xa6\xd1\x63\x1a\x3d\xa6\x5b\xf1\x98\x5e\xf3\x8e\xd1\xab\xbb\xf5\x37\xf6\x95\xfe\x6b\x25\xd0\x7b\x77\x03\x2f\xe9\x58\x2b\xb8\x5d\x8d\xf6\xbe\x92\x4a\x01\xfa\x48\xaf\x37\x55\x04\x7d\xa4\xd1\x47\xfa\x0a\xfb\x48\xaf\x38\x12\xd4\x56\x19\xdf\xc8\xd9\x7a\xe2\x5e\xb2\x47\xdf\x65\xee\x94\x3e\xce\x3f\xa4\x7a\x46\xcb\x42\x9f\x11\xbe\xd1\xbf\xdf\x45\x6e\x4e\x06\x81\x14\x3c\xc6\xc7\xbd\x99\x40\xff\x48\x97\xfe\x9e\x0d\x64\x4b\x14\x1a\xa4\xd3\x6b\x8e\xa7\x38\xe1\xcd\xb4\x89\x98\xb8\x6d\x51\x09\x2f\x32\xe1\xcd\x1c\xb7\x83\xf0\xb0\xe7\x0f\x3b\x8e\xdc\x44\xdb\xb7\x77\xae\x37\x22\xe2\xd1\xc6\x8b\xea\x6e\x7d\x5b\x4a\x4c\x81\x8a\x78\x02\x48\x30\x44\x82\x21\x12\x0c\x91\x60\x88\x04\x43\x24\x18\x22\xc1\x10\x09\x86\x48\x30\x44\x82\x21\x12\x0c\x91\x60\x88\x04\x43\x24\x18\x22\xc1\x10\x09\x86\x48\x30\x5c\x35\x82\xe1\xbf\xf7\x90\x07\x38\x9c\xc7\xa1\x95\x4a\x1f\xe5\x5a\xa4\x43\x78\x38\x62\x1c\x7e\xac\x47\xff\xf7\x0c\xb9\x9e\x5f\x94\x3e\xca\xcf\x4b\x23\x1e\xb2\x47\x7a\x0d\x76\x07\x7e\x06\x55\x31\x80\xe1\x72\x9b\x79\x87\x2f\x24\x0f\x70\x40\x6d\x3f\xd9\x0b\x80\xda\x20\x19\x20\xfd\x35\xd1\x66\xd1\x13\x51\x48\xce\xe6\x00\xb4\x06\xd4\xc3\xb3\x8d\xa1\xb3\x3d\xfa\x2e\x01\x9d\x25\x86\x22\x82\xa6\xa1\x15\xd5\xc9\x5d\x3e\xbb\xa5\xaa\xe3\x6f\xa9\xc1\x46\x84\xbe\xdf\x26\x6e\xae\x5e\xf7\xe7\x46\xc8\x30\x39\x54\x61\xe0\x5b\x6e\xff\xa3\x55\x0f\xf9\x88\x2d\xf2\x11\xdf\xa3\xb5\x61\xf9\x8f\x71\x4a\xe2\xfd\xe4\xbe\x98\x92\xb8\x02\x52\xa4\x39\x31\x51\x57\x22\xa4\xca\x90\x46\x0c\xc5\x37\xdf\x58\x25\x45\x6e\x88\xd2\xbb\xb8\x42\x72\x98\xfc\xc2\x2a\x0a\x0e\xa4\x2a\x22\x55\x11\xa9\x8a\x48\x55\x44\xaa\x22\x52\x15\xd7\x27\x55\xb1\x21\xbb\x70\xc5\x0e\x16\xb9\x7f\xbb\xa6\x4a\x25\xb8\xab\x11\x7b\x11\xf4\x84\x3b\x4b\x92\x76\xb0\xe2\x6a\x02\x92\x17\xd7\x9b\x72\x82\xe4\x45\x24\x2f\x5e\x61\xf2\xe2\x6a\xc0\x49\x0d\xf3\xbb\xac\x94\xdc\x9f\xd8\x45\x76\xea\x59\xb3\x4f\x72\x12\x9f\x95\xe0\x32\xb2\x97\x9e\x11\x3c\xc6\x57\xee\x20\x39\x0e\x7c\x72\xe5\xa3\x8e\x87\x75\xc9\x2b\x14\xec\xc0\x2f\xc3\x8a\x99\x29\x17\x8a\x34\x86\x3e\x3f\xdd\xab\xbf\xb5\x83\x6c\xe5\x65\x9c\x5b\x18\xec\xdc\x9e\x82\x7a\x4e\x7a\x85\x51\x59\x40\x0e\x0a\xe8\xed\x61\xcf\x71\xad\x45\x25\xf8\xa7\x3c\xda\x66\x30\xb4\x40\xc6\xf9\xec\xcd\x91\x07\x60\xf6\x0e\x91\x7d\xe4\xde\x9a\xb3\x57\x68\x93\x6c\x83\xaa\x6e\x5a\xc3\x69\xfc\x82\xc6\xb3\xf4\x5e\x7d\x8f\x98\xa5\xbc\x2a\x31\x3d\xd3\x6a\x6b\xd2\xe7\x92\x3d\xda\xf9\x2f\x5b\xd4\x51\xe9\x49\x87\x44\xd3\x06\xa6\x4f\x3c\x7a\x05\xc6\x26\x77\x9c\x4c\x90\xa3\x15\xda\x44\xcb\x83\x83\xba\x04\x42\xa6\x2d\x42\xa6\xbf\xa4\xb5\x53\x48\x9c\xe4\xd8\xe9\x11\x32\x16\x63\xa7\x2b\x29\x74\x1a\x24\xc7\x5e\x39\x99\xd4\xfb\xde\x1b\x55\xa1\x73\xab\x4c\x90\x9d\x26\x67\x76\xf0\xbb\x57\x42\xcc\x20\xae\x8a\xb8\x2a\xe2\xaa\x88\xab\x22\xae\x8a\xb8\x2a\xe2\xaa\xe9\xb8\xea\xca\x69\x09\xb9\xb7\x5c\xab\x6a\x09\xbb\x1a\x80\xaa\x69\xba\x43\x2f\x80\x00\xab\xac\x3a\x20\xd6\xba\xde\x14\x16\xc4\x5a\x11\x6b\xbd\xc2\x58\xeb\x33\x05\xad\x6a\xe8\x42\xfe\x00\xb9\x5f\xbf\xcf\x1c\x92\x10\xea\x1d\x2a\xec\x9a\x52\xfc\x33\x02\x84\xfd\xda\x79\x32\xc6\x41\x58\xab\x30\x6f\x83\xf7\xaa\x4f\x8b\x36\xec\x10\xc9\x5c\xdb\x20\x4d\x2d\x36\xf5\x16\xe9\xcc\x9c\xe7\x5d\x48\xf8\x1c\x06\xfa\x1b\xce\xeb\x6f\xe9\x22\xcf\x4b\x2d\x86\xed\xb2\xf7\x71\x17\x26\x5f\x38\x5f\x44\x5a\xba\x37\x6b\xb0\x01\xe4\xa2\x13\x8a\x3f\xcb\x8b\x1f\x51\x8b\xef\xdd\xcf\xde\x1e\x4e\x2b\xfb\xcc\x60\xfd\x57\xd7\xb8\xaf\x79\x0e\x1d\xb1\xd1\x11\x3b\x87\x8e\xd8\xe8\x88\x8d\x8e\xd8\xe8\x88\xbd\x6e\x1c\xb1\x73\x6b\xc6\x11\xbb\xed\x2d\x69\xd9\x11\x3b\x87\x8e\xd8\xe8\x88\x8d\x8e\xd8\xe8\x88\x8d\x8e\xd8\xab\xef\x88\x9d\x5b\xd7\x7e\xd3\x39\xf4\x9b\x5e\x39\xbf\xe9\xdc\x5a\xf7\x9b\xce\x5d\x85\x7e\xd3\x13\xaf\xd4\x48\x91\x03\x93\xe7\xc9\x63\x00\x4c\x3e\x44\xce\x90\xd3\x35\x81\xc9\x74\x7c\x6b\x61\x30\x5b\x1f\x3e\x3a\x6e\x07\x8d\x61\xcb\xdb\xd3\xb1\xc5\xcd\xfa\x46\x1e\xb6\xef\xc5\x8d\x61\xcd\xb3\xfa\x83\x2a\x5c\x29\x20\xce\x7a\xa0\x9c\x00\x3e\xeb\x37\x9f\x98\xdf\x26\x75\x40\xb9\x2e\xbe\xad\x19\x56\x23\xfc\xed\x00\x7f\xf0\xca\x22\x70\x1c\x30\x9b\x25\x05\x32\x53\x61\x84\x9a\x22\x93\xed\x1e\x78\x34\x4e\x21\x79\xaf\x45\xf2\xde\x57\x33\x24\xcf\x45\xd3\x23\xe4\x61\x10\x4d\xc0\xf7\x6a\xf7\x0c\x25\x73\x9c\xd6\x67\x91\x73\x31\xad\x6f\x65\x6a\xb2\x39\x43\x60\x86\x9c\x57\x18\x02\x2b\x53\x55\x23\x59\xdb\x9c\x2c\x6d\x9b\xfc\x4c\xd8\x90\x6a\xcb\xf9\x92\x17\x84\xa4\xf7\x57\xfb\xeb\xc8\xda\xdd\x82\x4f\xa2\x90\x73\xbc\xd9\x46\x72\x77\x8c\xbf\x54\x43\xee\x8e\xc8\xa2\x56\x55\x02\xaf\x0c\x7b\x11\x31\x70\xc4\xc0\x11\x03\x47\x0c\x7c\xfd\x60\xe0\xa8\x61\x36\xd0\x30\xd7\x8e\x91\x00\x99\xe3\xab\xc2\x1c\x47\x5b\x0c\xda\x62\xd0\x16\x83\xb6\x18\xb4\xc5\xac\x6b\x5b\x0c\x3a\x10\xa1\x03\x11\x3a\x10\xad\x94\x03\x11\x9a\x3a\xd1\xd4\xb9\x5e\x4d\x9d\x13\xc5\x36\xfb\xce\x35\x82\xab\x7b\xd3\x21\xe3\x67\xeb\xcf\xe2\xab\x39\x96\xb4\xcd\x9a\x09\x97\x0d\x5b\x37\x83\x85\xb7\xdf\xb3\xe0\x3f\xb6\x47\x69\xea\xac\x52\x29\x18\x58\x18\x1c\xf0\x29\xe0\xcb\x4c\xb0\xe8\x5f\xdf\xae\x7f\xa9\x83\x6c\x66\xb7\x20\x2b\x6b\x7d\xe7\x80\x29\xfe\xe6\x34\x0d\x7b\xef\x02\x47\x80\x52\x29\x38\x33\x18\x5f\xbd\xda\xf2\xcb\x3d\xca\x13\xec\xef\x84\x04\xfb\x6c\x12\xee\x26\x83\x64\xa0\xb6\x29\xa5\x54\x0a\xd8\x94\x8b\x3f\xb8\x2d\x56\xe9\x93\x8d\xa7\xdb\x0e\xbd\x27\x9a\x3d\xa5\x52\x20\x2c\x26\x71\x33\x30\xa5\x1c\x7a\x32\x60\x4a\x39\xb4\xe2\xa0\x15\x07\xad\x38\xeb\xd5\x8a\x83\x29\xe5\x30\xa5\x1c\xa2\xe7\x88\x9e\x23\x7a\x8e\xe8\xf9\x9a\x40\xcf\x31\xa5\x1c\xa6\x94\xbb\x5a\xf0\x42\x4c\x29\xb7\x12\x29\xe5\x9e\xe8\x26\x03\x1c\x7a\x73\x69\xb8\xe8\xf9\x17\x98\xb6\x16\x47\xf2\x80\x17\x06\x6c\xb7\xe8\xd3\x20\xc8\x3b\x56\x10\xd0\x40\xff\xc3\x2e\xfd\xb3\x1b\xc8\x75\xf1\x0b\xe7\x16\x06\x3b\x2f\x8a\x5d\xcd\x2d\xd8\x0b\x76\xa1\x6c\x39\xea\xf7\x5a\x52\x83\x1c\xe7\x45\x8d\xb0\xa2\xb2\x8a\x99\x6d\x48\x6a\x17\x5d\x50\x50\x57\x7c\x74\x4e\x9c\x85\xbc\x12\x95\x24\x9a\x20\xa4\x56\x21\xdb\x7b\x27\xbc\x70\x52\xb6\xe6\xcc\xa0\x5a\xc9\x71\x3b\x68\x5f\x58\xad\x15\xc2\xf8\x2e\x90\x49\x8e\xf1\x8d\x93\x23\x80\xf1\x0d\x93\x43\xe4\x60\x0b\x40\xf3\x59\x99\xcc\xa1\x21\xe2\xb7\x2d\x1d\xf1\xbb\x56\x27\xd0\x30\x0e\xfb\x3d\xda\x18\xf6\x1b\xd2\xf7\x09\xd8\xaf\x6a\x02\x09\x0c\x50\x1d\x0d\x44\x01\x11\x05\x44\x14\x10\x51\x40\x44\x01\x11\x05\x44\x14\x10\x51\x40\x44\x01\x11\x05\x44\x14\x10\x51\x40\x44\x01\x11\x05\x44\x14\x10\x51\x40\x44\x01\xaf\x08\x0a\xf8\x83\x0c\xb9\x8d\xa3\x80\x79\xcf\xf3\x0b\xb6\x5b\x19\xd1\x57\x87\x09\x4d\x6e\x50\x6f\x9f\x5b\x18\xec\xbc\xa9\x48\xc3\xe4\x4e\xcb\xbf\xa1\xf7\xb6\x22\x0d\x47\x94\x87\xcf\x0c\x0e\x4f\x8e\x47\x47\xbb\xf6\x91\xee\x86\xaa\x0a\x1a\xaa\x2a\x68\xa8\x99\x82\x26\x4a\xe4\x41\x8e\xc1\x9d\x24\xc7\x01\x83\x3b\x4c\x46\x49\xae\x05\x0c\x4e\xf9\xce\x66\xa8\x77\xfa\xa7\x1e\x23\x87\xea\xf5\x3d\x64\xfa\xab\x95\xed\x0e\x7c\x1b\x02\xfd\xdf\x1f\xd5\xdf\xbf\x9d\x3c\xa7\x62\x74\x78\x1e\xd8\x6d\xf5\xf9\x92\xc7\x59\x09\xbd\xdb\xd9\x43\xc9\xf1\xaa\xc8\x05\x0b\xcf\xad\x71\x20\x15\x03\x24\x23\xa0\x88\x01\x92\x11\x50\x44\x40\x11\x01\xc5\x75\x04\x28\xae\xa1\xd8\x07\x6b\x06\x50\x44\xa7\x7c\x04\x14\x11\x50\x44\x40\x11\x01\x45\x0c\x90\x8c\x5e\xc3\xcf\x1c\xfc\x6f\xcd\x7b\x0d\x5f\x95\x01\x92\x29\x99\xe0\xe0\xd7\x08\x19\x06\xf0\xeb\x00\xd9\x4f\xf6\xd6\x74\x32\x4d\x00\x55\x02\x67\xca\x02\x40\xd4\x16\x67\xd3\x65\xb1\xce\x52\x40\x33\xc1\x3b\x83\x06\xa9\x84\x33\x68\x27\x31\x9f\xda\x5a\x03\x29\xbb\x5e\x46\x38\xe6\xa0\x58\x37\xff\x7b\x15\x61\x31\x8e\x62\x8d\x93\x23\x64\xac\x22\x6a\xf1\x3d\x64\x77\x0b\xc3\x81\x61\xe3\x30\x30\x71\x8b\x81\x89\xff\x4b\x23\xc7\x78\xcc\xe0\x51\x92\x8b\x63\x06\xef\x25\xad\xcd\x44\x1e\x4a\x61\x17\x84\x52\x88\xc3\x02\xb7\x5c\x5a\x2d\x11\x43\x0e\x73\x39\x76\x88\x1c\x04\x39\xd6\x6a\x05\x8d\x45\x15\x44\xf1\x5d\x61\x51\xd5\xfb\x4f\x7d\x35\x44\x55\x67\x6a\x80\x60\x2e\xb6\x76\xf1\x7b\x29\x62\x2b\x8e\x01\xbc\xb2\x02\x0c\x83\xfe\x22\xae\x8b\xb8\x2e\xe2\xba\x88\xeb\x62\xd0\x5f\x0c\xfa\x8b\x41\x7f\x31\xe8\x2f\xda\x17\xd0\xbe\x80\xf6\x05\xb4\x2f\xa0\x7d\xa1\x2d\xf6\x05\x0c\xfa\x8b\x41\x7f\x31\xe8\x2f\x06\xfd\x45\xf3\x1d\x9a\xef\xae\xf2\xa0\xbf\x2b\x8b\x20\x2f\x27\xa6\xf0\xc4\x79\xf2\x98\xfe\x88\xf9\xf0\x16\x4d\xdf\x50\xb2\xc2\xb9\xce\x21\xb1\x9f\x73\xe3\x87\x5b\x30\x58\xeb\x8d\x20\xef\x95\x68\x9f\x11\x94\xf3\x73\x4c\xa7\x81\x41\xa3\xd6\x3c\x17\xaf\x25\xdf\x83\xbd\xd1\xdc\x2a\x49\xea\xbd\x62\xf4\xdf\xb1\x02\x8e\x46\xfa\xab\x65\xf8\x92\x20\xf4\x7c\xab\x48\xab\x62\x97\x2c\x78\x4e\x79\x9e\x5a\x61\x68\xe5\xe7\x98\x06\x1e\xe8\x5f\xe9\xd2\x7f\x67\x03\x21\xe2\x85\x73\x0b\x83\x9d\x2f\x6d\x2e\x76\xc9\x19\x28\x6a\x58\x16\xd5\xa6\xf8\x25\x26\xbc\x30\xcd\x9b\x73\x66\xb0\xb2\x96\xab\x23\x80\x49\x4d\x83\x4c\xdb\x23\x9b\x2c\x2b\x80\xc9\x63\x8d\x57\xd7\x01\x7d\xbf\x58\x5d\xc9\x29\x14\xe5\x7c\xac\x18\x0e\x8c\x60\x82\x0e\x07\x18\xc1\x04\x0d\x53\x68\x98\x42\xc3\xd4\x7a\x35\x4c\x61\x04\x13\x8c\x60\x82\x06\x01\x34\x08\xa0\x41\x00\x0d\x02\x6b\xc2\x20\x80\x11\x4c\x30\x82\xc9\xd5\x02\x81\x62\x04\x93\x95\x88\x60\xf2\xdd\x9b\xc9\xfd\xc9\x14\x62\x35\x22\x66\x04\xa1\x15\xd2\xd9\xb2\xc3\xd6\x2e\xbf\xf1\xb2\x81\x20\x6f\x39\x54\xff\xf0\xcd\xfa\x7f\x66\xe2\x3c\x63\x5d\x3e\xb5\x0a\x06\xdc\x8a\x3a\x39\xde\x71\xa7\x45\x29\x90\x66\x8c\x3d\xc8\xd3\x8c\xc5\xb4\x5a\xe5\x81\x69\x56\x44\x7b\x19\xb6\x13\x2f\x24\x0f\x70\x5c\x6d\x3f\xd9\x0b\xb8\xda\x20\x19\x20\xfd\xb5\xb3\x82\x95\x43\x8f\x7d\x09\x53\x61\x17\x06\xb3\xd0\xa2\x86\xc8\xf4\x64\x63\xec\xac\x5f\xdf\x11\xe5\xfc\x8a\x6b\x10\xc0\x19\xaf\x44\x45\xcb\x1e\xbf\x2d\x1d\xb2\xdb\xa4\x6f\x28\xd2\x90\x74\x7e\x7e\x4b\xdc\xfb\xbd\x3e\x2d\x39\x56\x9e\x36\x33\x00\x5d\xe2\xd9\xd5\x1d\x83\xdc\x08\x19\x26\x87\x2a\xdc\x34\x96\x3b\x08\x48\xf1\x43\x07\x8d\x16\x1d\x34\xde\xa3\xb5\x41\x06\x8c\x71\x17\x8f\xfb\xc9\x7d\xb1\x8b\xc7\x55\x2e\x4a\x4a\xe5\x90\xe4\x9e\xbe\x26\x16\x25\xbb\x4b\x96\xcf\x4e\xb1\xec\xe4\x07\x7b\x4e\x33\x32\xe5\xee\x12\xdb\x62\x56\x4f\xa2\xdc\x52\x59\x50\x3f\x34\x60\x07\x84\xb4\xba\x55\xbd\x39\x4f\xfd\x22\x55\xef\x6e\x57\xef\x42\xb2\x4e\x5a\xb4\xf3\xfd\x55\xcf\x25\x4a\x61\xbf\x97\xc4\x5d\xd6\xca\xdc\x49\x72\x9c\x4c\x54\x48\xb3\x21\xb2\xaf\x05\x53\xcd\x24\x20\xe5\x28\xd8\x1a\x08\xb6\x8f\x76\x90\x0f\x75\xe8\x1f\xe8\xe8\x7c\x52\x9a\x8e\x9e\xe8\x58\x3f\x82\xad\x02\x5c\x60\xfd\x0c\x60\x39\x00\x60\x6c\x72\xc6\x26\xb3\xee\x1a\x13\xb7\x07\x50\x63\x6e\x5b\xb1\x1c\x78\xd3\xf5\xdc\x7e\xfe\x36\x3c\x01\xb6\xb5\xc0\xe8\x9e\x08\x3c\x77\x92\xdb\x8e\x4e\xb0\x65\x21\x7e\x4f\x47\x8b\x25\xbe\xd8\x53\x5b\xe2\xe6\xbe\xa4\x91\x2f\x6a\xfa\xe7\xb5\xce\xcf\x49\xbd\xf8\x29\xed\xb0\xc7\x8e\x79\x76\x60\x14\x3d\xe8\x76\xcf\x30\x67\xd9\x25\xd3\x18\x4e\x7c\x05\x9c\x78\x38\xf1\xb9\x1c\xc4\x28\x79\xbf\x95\x87\x0f\x07\xdb\x83\x63\xe7\x05\xa3\x89\x3a\x85\xc0\xf0\x16\x45\x9f\x72\x6c\xbe\x44\xbd\x92\x43\xb3\x06\xaf\x11\x8c\x7d\xd1\x58\xc2\xc9\x23\xb5\x03\x64\xf5\xe6\x46\x68\x56\xc2\x70\xb5\x1a\x5a\xe4\x1d\xe9\x82\x7a\x8b\xbe\x09\x1a\x48\x9a\xdc\x1b\xd2\x92\x14\xd7\xd8\x27\x26\x76\x91\x9d\x7a\xd6\xec\x93\x3c\x86\x67\xc1\x1a\x12\x0b\x1a\x9e\x31\x37\xb0\x4b\x2a\x33\xe1\x2a\xe4\x3e\xbc\xb9\x8b\x98\xfc\xc8\xc3\xad\xc9\x95\x21\x03\xf9\x55\xfd\xdb\xdb\xf5\x6f\x76\x90\xeb\xf9\x5f\xcd\x46\x05\x04\x4b\x3b\x8f\x0a\x08\x3f\x03\xe1\x41\x08\x7f\x5c\x6d\x29\x94\xcf\x91\x51\x3e\xcd\x0f\x92\x03\x30\xcd\xef\x21\xbb\xc9\x60\xcd\x69\x2e\x7a\x33\xf2\x07\x85\x4f\x6e\x8b\x5f\xfb\xd9\xc6\x33\x7d\x8f\xbe\x4b\xcc\xee\xc4\x98\x8a\xf9\xcd\x33\xbb\x54\x91\x7c\x90\x85\x80\x2c\x04\x64\x21\x20\x0b\x01\x59\x08\xc8\x42\x40\x16\x02\xb2\x10\x90\x85\x80\x2c\x04\x64\x21\x20\x0b\x01\x59\x08\xc8\x42\x40\x16\x02\xb2\x10\x90\x85\xb0\x5a\x2c\x84\x57\x76\x10\xa3\x76\x36\x65\x0e\xcb\xe9\xdf\xcc\xe8\x5f\xcf\x10\x3d\x91\x3e\x99\x83\x72\x35\xb3\xa9\x18\x45\x1a\xaa\x09\x8e\xe1\x71\x4c\xa8\x92\x9e\x50\xe5\x1f\xbb\x48\x77\x7d\x9f\xb0\x7c\x60\x17\x7c\x9b\xad\x25\xfd\xd7\xbb\xf4\x8f\x25\x9d\xc1\xca\xcd\x39\x83\x8d\x4c\x8f\x8f\x42\x19\x6d\xf2\x02\xbb\x25\xe9\x05\x26\x8b\xbf\x3a\xdc\xbf\xd6\x68\xfe\xea\x65\x21\xae\xa9\xee\x5f\x72\x1c\xd0\xef\x0b\x11\x57\x44\x5c\x11\x71\x45\xc4\x15\x11\x57\x44\x5c\x11\x71\x45\xc4\x15\x11\x57\x44\x5c\x11\x71\x45\xc4\x15\x11\x57\x44\x5c\x11\x71\x45\xc4\xf5\xca\x20\xae\x3d\x64\x5f\xe4\xf7\x65\xfb\xb4\x68\x03\x01\x3e\x99\xbc\x9a\x83\x7e\xe2\xc0\x6f\x4b\x87\xb0\x97\xe9\x9f\xeb\xd6\x5f\xbe\x91\xe8\x15\x6f\x9e\x5b\x18\xec\xfc\x98\x26\x06\x41\x81\xfe\xdc\x48\xac\x45\x24\xc9\xe1\xc9\xf1\x69\x5e\x62\x5b\x30\xc0\xbe\x58\x8b\x01\x4d\x4d\xec\x79\x4c\x11\x8a\xd5\xb3\xae\x84\x46\xac\x94\x9d\xed\xe5\xfb\xf2\x70\xf2\x63\x20\xef\xb6\x68\x25\xc2\x88\xcb\xa1\x27\x2f\x72\x7a\xf2\xf9\xc6\x10\xe2\x41\xfd\x40\x44\x49\x4e\x9d\x83\x09\xe8\x90\xc3\x8a\xf1\xa0\x20\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\x88\x58\x22\x62\x89\x88\x25\x22\x96\xb8\xda\x58\xe2\x5e\x72\x8f\xbe\xdb\x1c\x94\x2e\xa0\xcf\x55\xdd\x46\xe3\x03\x5b\xb5\xef\x28\x82\x90\x08\x42\x22\x08\xb9\x8e\x41\xc8\xff\xce\x90\x4e\x01\x42\xc6\x3e\xe9\x03\x0b\xbb\x04\xe1\xf3\xaf\x32\xfa\x37\x32\xe4\xd9\xca\xbd\x73\xe2\x5e\x6d\xc6\xe7\x9d\x45\x1a\x0e\xc7\x2f\x9c\xd9\x85\x94\xcf\x3a\x94\xcf\xd7\x74\x44\xae\xf0\x79\xea\x8b\x61\xa4\x55\x0e\xf1\x3a\x64\xe8\x23\xcf\x51\x9f\x69\xcc\xbd\x35\x8b\x34\x1c\x51\xde\x40\xf6\x6d\xdd\xa1\xf8\xaf\x1e\x32\xcd\x87\x62\xd6\xf1\x16\x99\x46\xe3\x7b\x4e\x56\x22\x64\x95\x63\xc2\xb1\xf9\x92\x6f\x7b\xbe\x1d\x2e\x39\x74\x81\x3a\x09\x04\x45\x62\xf5\xef\xeb\xd1\xff\x70\x23\xb9\x55\x29\x74\x38\x2a\x53\x8e\xe1\x6f\x35\x83\xda\x4f\x8a\xba\x8e\xb3\xba\x46\xd4\xba\xd6\x04\x8a\x3f\x04\xd5\x1d\x4e\xf9\x4c\x31\xf1\x6a\xb7\x7f\xed\xe3\xfb\xab\x9f\x25\xe2\x25\x8d\xe1\xfb\x87\xf4\x33\x02\xbe\xaf\x37\x63\x05\x70\x5f\xbb\xf7\x53\x92\xaf\x34\x32\x2e\x20\xf4\x8f\xd0\x3f\x42\xff\x08\xfd\x23\xf4\x8f\xd0\x3f\x42\xff\x08\xfd\x23\xf4\x8f\xd0\x3f\x42\xff\x08\xfd\x23\xf4\xbf\xca\xd0\xff\x11\x32\xa6\x8f\x98\xc3\x12\xfa\xdf\xae\x42\xff\xb5\x8f\x7c\x68\x0a\x40\x53\x00\x9a\x02\xd0\x14\xa0\x98\x02\x3e\xdf\x43\x8e\x72\xf8\xd3\x9f\xb1\xf2\xd9\x08\xe2\xaa\xa0\x24\xab\xd8\x67\xde\x29\x07\x21\x3b\x06\x39\x74\xc6\x76\x0b\xb6\x5b\x94\x98\xe7\x7f\x76\xeb\x1f\xd9\x48\x6e\x66\x25\x0d\xab\x05\x49\xc0\xf3\x93\xcd\x00\x9e\x23\xbc\x82\x29\xcf\xa1\x39\x5e\xc1\x9a\x00\x3a\xf9\xe7\x4f\x55\x7e\x9b\x40\x39\xab\x1b\xbd\xf6\xd1\xcd\x35\xc8\x5e\x2e\x35\x86\x3f\x4f\xe8\xc7\x04\xfc\x59\x73\xc6\x46\xb1\x10\xaa\xc6\x04\x63\xd1\x22\xa4\x89\x90\x26\x42\x9a\x08\x69\x22\xa4\x89\x90\x26\x42\x9a\x08\x69\x22\xa4\x89\x90\x26\x42\x9a\x08\x69\x5e\x71\x48\xf3\x10\x39\xa8\x1f\x30\xf7\x4b\x48\xf3\x76\x15\xd2\xac\x3e\xc9\x21\x94\x89\x50\x26\x42\x99\x08\x65\x26\xa1\x4c\x08\xad\x10\x87\x50\xa8\x91\x52\xb7\xe4\x15\x42\x3a\x5f\x82\x33\x4a\x04\x5d\xbe\xae\x47\xff\xd6\x06\xb2\x39\xef\xf9\x10\x54\xf5\xe3\x4d\x31\x33\xbd\xc2\x69\x51\xce\x9a\x40\x28\xf9\x76\x3e\xe2\xf9\x54\xcd\x01\xa9\xb4\x12\x21\xc9\x16\x20\xc9\x13\x8d\x21\xc9\x5e\xbd\x3b\x25\xdf\x9b\x69\x46\x1c\xcc\x78\x04\x10\x6f\x44\xbc\x11\xf1\x46\xc4\x1b\x11\x6f\x44\xbc\x11\xf1\x46\xc4\x1b\x11\x6f\x44\xbc\x11\xf1\x46\xc4\x1b\x11\x6f\x5c\x6d\xbc\x71\x1f\xb9\x57\xdf\x63\xee\x92\x78\xe3\x4d\x09\x0a\x65\x7c\x62\x7b\x26\xa4\xde\x46\x28\x13\xa1\x4c\x84\x32\xaf\x22\x28\xf3\xdb\x37\x93\x83\x51\x94\xd8\x52\x30\xb0\x30\x58\x0b\xca\xf4\x29\xe0\x6c\x6c\xe9\x0a\x24\x73\x20\xc8\x5b\x0e\xd5\xdf\x7f\xb3\xfe\x83\x0c\xd9\xcc\x5e\x3f\xb7\x30\xd8\xb9\xdd\xa7\x56\xc1\x80\x5b\x51\x1f\xc7\xca\xc0\x14\x2f\x64\x9a\x86\xbd\xdb\xd8\x73\xc3\xa5\x52\xa0\x22\x88\xf1\xfd\x69\x56\x40\xfb\xa2\x07\x00\xe8\xf7\x42\xf2\x00\x07\xfd\xf6\x93\xbd\x00\xfa\x0d\x92\x01\xd2\x5f\x33\xdb\xbd\x12\x95\x22\xbb\x30\x98\x85\x16\x35\x04\xf9\x26\x1b\x63\x78\xfd\xfa\x8e\x28\x28\x6a\x5c\x83\x00\xf0\x78\x25\x2a\xc4\xf7\xf8\x6d\xe9\xb0\xe1\x26\x7d\x43\x91\x86\xa4\xf3\x77\xb6\xc4\x7d\xdf\xc3\x06\xc9\xca\xd3\x26\xba\x7f\xbb\x78\x74\x55\x47\x20\x37\x42\x86\xc9\x21\x7d\xc3\x8c\x57\x58\xea\x84\x7f\x0d\xad\x77\xb9\x43\x90\x7b\x77\x86\xbc\x33\xa3\xbf\x23\xd3\xf9\x53\x52\xc8\xfe\x87\x76\x96\xed\x56\x62\x0b\xef\x83\x14\x65\x10\x92\x82\x4b\xc5\xc4\xb1\x51\x85\x12\x67\xa8\x51\x62\x7d\xcd\x74\xf5\xac\x31\xec\x1a\xb6\xcb\x01\x1b\xcf\x37\xca\xae\xc4\x7c\x0a\x46\xc1\x5f\x9a\x2a\xbb\x46\xc1\xf6\x29\x13\x05\x54\x02\x09\x4c\x1f\x00\x85\x4b\x20\x29\xd1\xb9\x49\x9c\x5d\x8d\xd9\xb2\x0f\xba\x79\xc9\xf7\xf2\x34\x00\xcd\x48\x0c\x8b\xd8\xd6\xb2\xc6\x19\xa8\x11\xce\x3c\xa0\xca\x0c\x19\xfd\xc6\xb0\xe3\x0c\x81\xde\x53\xf0\x97\x0c\xbf\xec\xb2\x33\x35\x93\x1d\x91\xb2\x27\x8a\xa3\x05\x73\x13\x6f\x9a\x22\x28\x73\x6f\xcb\x90\xb7\x66\xf4\x37\x67\x3a\xdf\x20\x3b\xe8\x1f\x35\x50\x95\x4f\x58\xae\x55\xa4\x3e\x3f\xf4\x71\x2d\x22\x08\xbc\xbc\x0d\x7a\x8c\x3c\x5e\x59\x70\x3e\xf5\x7c\x83\xa9\xb9\xe1\x92\x54\xec\xe6\xad\x0b\xac\xfd\xe1\x1c\x0d\x68\x24\xcd\x98\x84\x8d\x80\x2f\xc0\x7e\x66\xa8\x01\x72\x14\x8e\x52\x9e\x6f\x0c\xee\xda\xc7\x9e\xf5\xad\x3c\x20\x74\x8e\xe7\x16\xb9\xec\x82\xe3\x0e\xd3\x4c\x2d\xdb\xe5\x2a\x05\x1c\x27\xe2\x67\x01\xb5\x10\xf8\x21\x3b\x04\x47\xfb\x51\xd1\x73\x2c\xb7\x98\xf5\xfc\xe2\x40\xe9\x42\x71\xa0\xec\xda\x79\xaf\x40\x07\xb6\x8d\x07\x93\xac\x94\xac\x79\xad\xfa\xad\xea\x0e\xf2\x1e\xad\x0d\x12\x60\x8c\x95\x30\xa8\xdf\x4f\xee\x23\x9b\x47\xb8\xee\xbe\x12\x82\xa4\xf6\xb2\x2f\x95\x43\xd2\x7e\x39\x93\xfb\x8f\x6b\x62\x41\xb2\xab\x64\xf9\xec\x70\xcd\x0e\xa4\xb0\xdd\x34\x21\x51\xee\x2a\xf1\x20\xdb\xab\x24\x4f\x6e\xa9\x2c\xa8\x1f\xea\xdf\x01\xa1\x61\x6e\x55\x6f\xce\x53\xbf\x48\xd5\xbb\xdb\xd5\xbb\x10\x91\x9a\x16\xed\x7c\x7f\xd5\x73\x89\x52\xd8\xef\x25\x71\x97\xb5\x32\x77\x92\x1c\x27\x13\x15\xb2\x6c\x88\xec\x6b\xc1\x86\x34\x09\xf0\x3d\x8a\xb5\x06\x62\xed\xa3\x1d\xe4\x43\x1d\xfa\x07\x3a\x3a\x9f\x94\xf6\xac\x27\x3a\xd6\x8f\x58\xab\x40\x3c\x58\x3f\x03\x82\x0f\xa8\x1c\x9b\x9c\xb1\x1d\xaf\xbb\xc6\xc4\xed\x01\x28\x9b\x1b\x7c\x2c\x07\xde\x74\x3d\xb7\x9f\xbf\x0d\x4f\x80\xc1\x2f\x30\xba\x27\x02\xcf\x9d\xe4\x06\xad\x13\x6c\x59\x88\xdf\xd3\xd1\x62\x89\x2f\xf6\xd4\x96\xb7\xb9\x2f\x69\xe4\x8b\x9a\xfe\x79\xad\xf3\x73\x52\x21\x7e\x4a\x3b\xec\xb1\xf3\x9d\x1d\x18\x45\x0f\xba\xdd\x33\xcc\x59\x76\xc9\x34\x86\x13\x5f\x01\x47\x9d\x79\x6a\xb9\x81\x51\x0e\x62\xe8\xbe\xdf\xca\xc3\x87\x83\x41\xc4\xb1\xf3\x1c\xb4\x07\x8c\xd6\xf0\x16\x45\x9f\x72\x83\x41\x89\x7a\x25\x87\x66\x0d\x5e\x23\x58\x20\xa3\xb1\x84\x23\x47\x6a\x07\xc8\xea\xcd\x8d\xd0\xac\x84\x35\x6d\x35\x34\xc8\xda\x66\xe2\x12\x37\x13\xb7\x5d\xf4\x4f\xec\x22\x3b\xf5\xac\xd9\x27\x71\x86\x67\xa9\x08\x05\x3c\xff\x4c\xc0\x26\xf4\x4b\xdd\x64\x4f\x8d\xf4\xb7\xaa\xdb\xd9\x82\xe7\x94\xe7\xa9\x15\x86\x56\x7e\x6e\x9e\xba\x61\xa0\xff\x4d\x97\xfe\x27\x1b\xc8\x0d\x71\x2a\x5c\xee\x63\xf6\xd2\xe6\xf2\xe1\x9e\x81\xf2\x86\x65\x79\x6d\x4a\x8b\xdb\x95\x4c\x8b\x0b\x4d\xaa\xac\x0a\x53\xe4\x5e\x46\x8a\xdc\x7c\xe3\x75\xf6\x80\x7e\x7f\xbd\x14\xb9\x95\xc3\x81\x4e\x61\x48\xd2\x40\x92\x06\x92\x34\x90\xa4\x81\x24\x0d\x24\x69\x20\x49\x03\x49\x1a\x48\xd2\x40\x92\x06\x92\x34\x90\xa4\x71\xc5\x49\x1a\x48\x84\x40\x22\x04\x12\x21\xd6\x2f\x11\x62\xe2\xd7\xbf\xbf\x93\xbc\x7f\x23\x31\x15\xf8\x36\xef\xf9\x34\xbb\x30\x98\x3d\x79\x78\x9a\x23\x39\xd3\x50\x8a\xfe\xf2\x8d\xe6\xcb\xb5\x29\x2a\x64\x11\x6b\xac\x71\xf2\xf0\xb4\xc1\x75\x10\x98\x7d\x4c\x8b\x0e\xc4\x38\xcc\x82\xe4\xe6\xa2\xb4\xe4\x15\xb2\xf0\x2c\xc7\x18\x83\x08\x9c\x89\xb6\x77\x6f\xd1\xa5\x7e\x30\x67\x97\x8c\x79\x40\xd3\x61\x83\xf7\x7c\x63\x7a\xec\xb8\xed\x96\x2f\x1a\x3e\x05\xed\x91\x29\x92\x97\xb4\x4d\x7c\xab\xbc\xa4\x01\x00\xfb\x71\x6d\x0b\xd9\xc4\xc5\xe5\xef\x69\x7f\xd9\x41\x5e\xae\x11\xb8\xae\x5f\x34\x2f\x4c\x5a\xa0\x93\x71\xc9\x4f\x2f\x8a\x0d\x58\xa8\xf1\xac\x39\x11\x46\x70\x02\x14\x45\x77\xd6\x1b\xaa\x37\xe9\xe5\xe4\x16\xa0\x97\x40\x4c\x83\x6d\xee\x6c\x00\xcd\xe0\x53\x95\x7c\x56\x23\x5b\x7c\x6a\x15\x4e\xb9\xce\x92\xfe\x09\xcd\x7c\xbf\x36\x25\xfe\x32\x60\xc9\xc1\xa6\x08\x20\xbb\x6c\x08\x6f\x1c\x9b\x19\x33\x94\x77\x68\xa4\x52\xb2\x82\xfa\x41\xfb\x2a\x31\x79\x01\x00\x4f\x85\x9a\x3d\x6b\x39\x01\x6d\xcf\x47\x6c\x25\xd1\xdc\x20\x6f\xd1\x88\xe8\x69\xfd\xc7\x34\xf3\xc5\x5c\x47\x03\xa5\x65\x8e\x1a\x73\x5e\x10\x72\xb0\xdc\x37\xc6\x27\xd9\xbc\xf4\xc5\xda\x59\xd9\xae\xfd\xbc\x46\xee\x52\x66\x6a\xc1\x0e\xf2\x1e\xdb\xa7\xb3\x02\x58\xcc\x1e\xf6\xfc\x87\x3d\x97\xea\x3f\xa3\x99\xc7\xc5\x6f\xa3\xe4\x7b\x0b\x76\x81\x06\xd0\x0c\x7f\x9e\x2f\x7f\x6b\x86\x89\x0d\x7e\x3e\x7e\xb1\xc7\xc4\xb0\xd0\x74\xd9\xa6\xc4\xf5\x3c\x36\x69\xdc\x42\xc9\xb3\xdd\x30\x7b\x49\x03\x4b\x40\x62\xb6\xdd\x47\x86\x08\x5c\xd5\x77\x99\x77\x43\x6f\xf8\xf1\xe2\x00\x3d\x5f\x31\x27\xb0\x3a\xb2\xea\xa7\x3c\x79\x07\xb9\x43\xf9\x14\x0e\x6c\xca\xef\x00\x3c\x57\x7f\xe5\x1d\xe6\x67\x3a\xe0\x27\x3f\x0a\xf9\x94\x2f\x97\x59\xb0\x50\xc2\x75\xa6\x22\x71\x49\x2e\x34\x7d\x11\x3d\x0e\x36\x8a\x18\xbf\x29\x50\xd7\x0b\x29\xd7\xa8\xd8\x19\x38\x8c\x4c\x7e\xd1\x6b\xc1\x52\x10\xd2\xf9\xac\x31\xc6\x01\xd6\x39\x6b\x81\x46\xba\x21\x48\x28\xa6\x69\xb1\x7e\x83\x45\x0d\x7a\xb3\x6f\x17\x8b\x4c\x6b\x67\x7f\xcc\xd3\x20\x00\x8b\x26\xdb\xa3\xe9\x82\xe7\x80\x4d\x95\xad\x3e\x7b\x9e\x66\x0d\x5e\x6a\xd4\xb5\x7e\x02\x31\xf5\xa9\xb3\x14\x1d\xb7\x42\x7b\x5e\x98\x54\xe5\xf7\x09\x1c\xa4\x68\x2f\x50\xd7\x98\xa2\x56\xe0\xb9\x4c\x19\x64\xc7\x48\xa1\x4a\xc5\x8a\x60\xd9\x2d\x50\xdf\x59\x02\xf3\x1a\x6f\x1d\xa8\xab\xaa\x86\x5f\xe0\x27\xc1\xe8\xf4\x92\x80\x93\x99\xa0\xe0\x35\x44\x2d\x0e\x14\xe4\x31\xe4\xaa\x30\x13\xc9\x72\x1e\x2d\xd0\x3e\x63\x86\x06\x61\x3f\x9d\x9d\xf5\xfc\xb0\x0f\x04\x1a\x87\x9b\x2d\xc7\x60\x67\xc6\xec\x25\x6d\x2b\x54\xc2\x36\xaa\xc4\xec\xf9\x9d\x4e\xf2\x52\xb2\xc9\x87\xfa\x74\xdf\xa4\xfc\x17\x1b\xe7\xc5\xb9\xa5\xc8\x70\xcb\x7a\x9c\x69\x74\xa1\xc5\xa1\x2e\xbe\xf7\x97\xe7\x2d\xb7\x9f\x09\x86\xaa\xd3\x06\xd3\x50\xf9\xd0\x85\xc6\xbc\x17\x84\x15\xf6\xda\xc4\x04\xfc\x23\x8d\x6c\x66\x82\x35\xa4\x05\xfd\x73\x1a\xd9\x59\xd3\x9c\x17\xed\x07\xa7\xa0\xe5\x53\xd1\xd6\x6f\xbe\x59\x13\xaf\x47\x52\x41\x5a\x58\x03\xd8\x1c\x2d\x7f\x29\x52\x64\xd9\xf6\x07\x07\xa6\xbc\x37\x5f\x72\xe8\x45\xf1\x6d\x41\xd6\x18\xcb\x16\xb3\x11\xa2\xcb\xf6\x60\x18\x7f\xa1\xfd\xca\x19\xc6\xcf\x21\xb0\x6b\x8b\xd3\x87\xd8\xc1\xa3\x06\xf0\x37\xb2\xe4\x93\x1a\x79\x36\x5f\x24\xb6\x5b\x1c\xe1\x89\x3b\x1c\xea\xeb\x3f\xa7\x99\x6f\xd5\x52\x6e\x44\x2d\x57\x57\x6a\x3e\xbe\x0b\x53\x82\xce\xdb\x61\x08\xfa\x95\x1d\xf0\x69\xd1\x67\x50\xd6\xea\xf3\x49\x41\xc6\xfe\x72\x68\x78\xbe\x72\x40\x04\x33\x01\x4e\x94\xdc\xf4\x4a\x17\xc5\xf4\x4a\x0a\x04\x8d\x6c\x12\x06\x99\x77\x6a\xe6\x1b\x34\x31\xfc\x30\x21\xd8\x51\xa6\x62\x36\x0c\xcc\x5a\xb6\x03\x4b\x33\xea\x36\xa1\x57\x54\xf6\x63\x34\x6d\x84\x09\xe9\xf2\x27\xce\x6b\x34\x72\x43\x6c\xca\x1b\x61\xbb\x95\x5e\xd6\x37\xda\x6e\xb8\x7b\x97\x79\xbe\xe2\x4e\xd4\xc3\xf1\x65\x51\x23\x3b\x4e\xc3\x69\x68\xc6\xca\x5f\x58\xb4\xfc\x02\xcc\x0d\x2b\xb4\x67\x6c\x87\xe9\x5d\xb0\x26\xc5\xd4\x13\xf2\x23\x5c\x2a\x31\x19\xba\x95\x44\x4a\x17\xf9\x0d\x8d\xdc\x14\x97\x7c\xdc\x0a\x60\x9d\x05\xa1\x35\x5f\xd2\xdf\xab\x91\xbd\x2d\x98\xd3\x58\x01\xe6\x5c\x8d\x42\xdb\xfe\x35\xe4\x2b\x1a\xd9\x12\x01\x4c\x6c\x19\xb6\x62\x01\xe4\x0b\xf3\x04\x0d\x2d\xf3\x09\x6d\x3a\xb4\xd8\xd2\x8b\xd6\x44\x57\x20\xf1\xab\xd4\xcd\xb8\x68\x87\x91\x39\x98\x1d\x25\xca\xae\x1d\x2e\x0d\xc0\x12\xb0\x67\xca\xa1\xe7\x07\x03\x05\xba\x40\x9d\x81\xc0\x2e\xf6\x5b\x7e\x7e\xce\x0e\x69\x3e\x2c\xfb\x34\x52\xf7\x17\xf8\xbe\x10\x64\xe7\x0b\xdb\xa2\x8a\xc8\x6f\x69\xe4\x79\x71\x17\x1d\x66\x87\xd4\x78\x5c\xde\x77\x19\xe3\x62\xd7\x2a\xb5\xfd\x03\xf3\x76\x8d\xc4\x92\x5b\x7f\xad\x46\xee\x6b\xa1\xd1\x27\xec\xbc\xef\x41\xcb\xc7\x65\x59\x51\x53\x61\x27\x5d\xe4\x87\xec\x48\xb2\xc0\xf2\xe6\x87\x7a\x6f\x86\x1f\x74\xa3\xe5\x1b\x11\x5f\xb2\xe4\x93\x19\xb2\x01\xcc\xb0\xbf\x90\x31\xdf\x93\x39\x66\xbb\x05\xae\x1d\xf0\xe5\x29\x51\x6b\xa1\x8a\x08\x8e\x8f\x31\x35\x36\x7d\x3a\x3e\x5e\x43\x95\x42\xce\xc6\x5a\x4b\x12\x8a\xb3\xdd\x59\x90\x81\xb6\x62\x55\x8b\x14\x22\xd5\x18\x12\x94\x67\xe0\x78\x25\x4d\xb5\xa1\x97\x35\x46\xa4\xe0\x13\xe0\x47\xd6\x18\x77\x8d\x11\x6b\x9e\x3a\x23\x56\x0d\x75\xb5\x9d\x73\x11\x08\x3d\x60\xad\x4e\x28\x90\x9f\xc9\x10\x62\x95\x6c\x71\x22\xd2\x3f\x9a\x31\x7f\x2e\x33\x3c\x39\x1e\x9d\x7e\xb9\x45\x30\x50\x21\x19\x5a\x30\x82\xfc\x1c\x9d\xb7\xf8\xfe\x00\x23\x21\xfa\x4b\x1e\x24\x65\xe4\x8a\xb8\x03\x63\x6d\x72\x81\xfa\x8a\x89\x2e\x2a\x4d\x1e\x03\x85\xcd\x06\x4c\xc1\x6c\xef\x84\xe1\xe3\xa7\x3b\xc5\xfe\x97\xa0\xaf\x71\x72\xd9\x8a\x77\xa1\x3c\x96\x56\xec\x52\x37\xc6\x8b\x4c\x9c\x0c\x7f\x42\x23\x7d\x0d\xd5\x07\x98\xe0\xfc\x05\xd3\xaa\x2c\xa2\xfd\xeb\xf7\x13\x19\xb2\x55\x6e\x85\xfa\x53\x99\x16\x14\x9c\xef\x69\xf1\x5e\x2a\xa8\x6d\x41\x12\x9e\x93\xeb\x96\x2d\x40\x76\xa2\x80\x59\x0e\x1b\x68\xde\x0a\xd8\x91\x83\x09\x60\xcb\x35\x4e\xc9\xa5\xc6\x55\x10\x55\xcb\x90\x14\x85\x40\x28\x16\x31\x79\x74\x24\xed\x29\xe5\x7e\x20\x20\x6c\x76\x54\x89\xda\x11\xe9\x2b\x33\x34\x6f\x95\x03\xb0\x14\x5b\xf9\x30\x60\x3a\x36\x68\xff\x11\x0c\x61\xbb\x86\xa5\x14\x25\x75\xa8\x9f\xe1\x07\x3f\x9b\x06\xfa\x4f\x6a\x64\x77\xcd\x5e\x4b\x3b\xb1\x4c\xc3\x7b\xe6\xa3\xfc\x7d\xd6\x1a\x30\x9c\xf0\xc3\x16\xeb\x39\xde\x5b\xe2\xb6\xd2\x6e\xe5\xe4\xc4\x34\x24\xdb\x31\xec\x59\xd1\x79\x02\xbb\x0e\x3d\x97\xbf\x9d\x25\xbf\xae\x91\x0d\xec\x38\xa3\xff\x92\x66\x3e\xa9\xb1\x5f\x5c\x00\x26\x15\x63\x01\xb0\x94\x54\xb4\x87\x9d\x7c\xca\x81\x5c\xc9\x92\x5e\x94\x35\x4e\x58\x17\xed\x79\xcb\x31\x1c\xea\x16\xc3\xb9\xe8\xf9\xa8\xec\xc1\x0b\x39\x6e\x6a\x75\xec\x19\xdf\x82\xc6\xc7\x27\x83\x92\x4f\x4b\x96\xc0\xa6\xe7\x2c\xb7\xe0\xd0\x88\xfe\xc9\xcd\x31\xf7\xee\xb9\x90\x4b\x28\x50\xbf\xad\x91\x67\xc9\x99\x30\xee\x06\xa1\xe5\xe6\xa9\xfe\x21\xcd\x7c\xb7\x56\x75\x39\x5a\x18\xe3\xa3\x29\xfa\xa9\x2d\x1e\x52\x15\x52\x87\x86\xfd\x17\x97\x5e\x3c\xbb\x1c\x3d\x14\x66\x91\x1d\x2e\x4b\x0b\x7c\xb5\x46\x36\xb0\x95\xa6\xff\xb0\xf9\x22\x60\xe2\x44\xdb\x1a\xfb\x1d\x75\x30\x1f\xdc\xee\x93\xec\xb8\xe4\xf4\x19\x67\x2d\xdf\xb5\xdd\x62\x4f\x1f\xd4\xcd\x39\x97\xf9\xa8\x1b\xad\x82\x62\x1d\x9e\x2d\x33\xa9\x54\x53\x75\x55\x1a\xf2\xb4\xf6\x68\x63\xc2\xd2\x90\xbe\xaf\xdf\x10\x94\x25\x31\x6f\x05\x63\xc9\x30\x38\x67\x89\x13\xa8\x0c\xa3\x8a\xaa\x44\xbe\xd3\x41\x0e\xa9\xc2\x42\xcd\x27\x1a\x4d\x7e\x25\x1d\xe8\xb4\x5d\x64\xdf\x38\xc5\x37\xc3\x69\x98\x70\xfa\x07\x3b\x12\x67\xbf\x77\x76\x90\x77\x68\xe4\x1a\xa5\x28\xfd\x35\x9a\xbe\x61\x66\x29\xa4\xe6\xa9\xf1\xd9\xd8\x76\x6e\x01\x0c\xec\x7b\x0b\xb4\xd0\x57\x39\xf8\x00\x23\x71\xbf\x17\x76\x47\x58\x5c\x94\x32\x01\x6d\x4a\x76\xd5\x36\xf2\xdc\x44\x57\x39\x76\x10\xf6\xc3\x28\x6e\xd5\x37\x5b\xa1\x37\x6f\xe7\x09\xf9\x7f\x35\x42\xd8\xf9\x8d\x2f\x79\xfd\x3b\x9a\x79\xff\x88\xfc\x53\x85\xa5\x15\x63\x64\xcc\x75\xe4\xed\xb5\x1c\x7e\x54\x73\x6d\xcb\xc9\x7e\x5c\xdb\x4c\x36\x5a\xbe\x6f\x2d\x7d\x4a\x3b\x4d\xa6\xc8\x64\x6d\x49\xbc\xac\xce\x95\xad\x7a\x5a\xeb\x22\x9d\xd5\x1f\x36\x6f\x95\xfa\x2f\xd0\xa5\x80\x7d\x5c\x3f\x4c\x37\xf2\xb4\x66\xd4\xec\x82\x4d\xfa\x86\x79\xab\x44\xc8\x47\x48\x2a\x1c\x3a\xe2\xcd\x97\x3c\x97\x09\x39\x3e\xa6\x3f\x46\xcc\xa5\x8a\x6b\x46\x37\x5b\x48\x15\x17\x8f\xdb\x41\xd8\x63\xcc\x79\x4e\x21\x50\x01\x1a\xce\xbe\x89\xc8\x8d\xb3\x5e\xd6\x18\x55\xe8\x91\xb0\x74\x87\x27\xc7\x41\x84\xc6\x7b\xa2\xed\x1a\x0b\x83\xd9\xc1\xfd\x3b\x12\xd3\xe9\xbd\x5b\x50\xaf\xb9\x5c\xbd\xe6\x4b\xc9\x49\xff\x1b\x9a\x79\xf7\x71\x41\x7a\xc8\x47\xe3\x69\xc4\x0f\x48\xf5\x5c\x9d\xdb\x7b\xc9\x3d\x75\xf6\xcb\xaa\x79\x94\x98\xbe\xb7\x26\x26\x25\x50\x9e\x85\x67\xc6\x05\xba\xa4\x6f\xd6\x37\x8a\xe9\xdb\x45\x6e\x49\x79\x52\x78\x73\x2c\xe9\x5b\xf4\x4d\xf0\x16\xc1\x53\xc2\x65\x9c\x12\x9e\x89\x87\xf2\xa7\xb5\xb3\x8d\xf7\xc9\x3d\xfa\x2e\xb9\x4f\x9a\xa6\xdc\x1c\x2b\x24\x5a\x72\x9b\x24\xe4\x1d\x9b\x48\x6f\x9a\xfd\xc8\x2b\xd0\x88\xf0\x33\xc5\x4f\xaf\x4c\x7f\xd5\xbf\xbd\xd1\x5c\x1c\x36\x5c\xaf\x40\x63\xc2\x91\x1f\xdf\x17\xd3\x54\x52\x91\x80\x69\x13\x69\xdf\x5c\x44\xf4\x19\x16\x67\xbf\x01\xe1\xde\x15\x7a\x5c\xf4\x30\x07\x05\xb9\xb0\xbb\x40\x97\xe0\x21\x21\x5a\x2e\x69\x1d\x17\xe8\xd2\x25\x6d\x4b\xf4\x46\x42\x8e\x7e\x79\x03\xf9\xcf\x0c\xd9\xc4\x9f\xd5\xbf\x9b\x31\xbf\x9a\x19\x76\x0d\x58\xdc\x4c\x0e\xa8\x2b\x27\x90\xbc\x43\x59\xb7\x1d\xb0\xb9\xeb\xf9\xc6\x49\x2f\x1c\x77\xfb\x62\x8e\x67\x20\x8a\x88\x9c\x30\x5c\xcf\xed\x07\x2d\x2c\xb5\x8c\xb1\x8b\x76\xc0\xb5\xe0\x51\x8f\x06\x27\xbd\x70\x2c\xa6\x2e\xa5\x16\x57\xbb\xa8\x23\x60\x44\x3b\x5e\xf3\x65\x01\xf2\x0b\x6e\x08\xe5\xc7\x8b\x88\x34\x18\x53\x37\x42\xea\x97\x7c\x2a\xb0\x6f\xcb\x35\x04\xf8\x26\xf4\x4b\x5e\x1e\xdf\x3e\x98\x32\xa2\xb0\x1c\xa4\x8f\x99\x01\x32\x89\x7b\x9a\x24\xb4\x81\xeb\xc8\x35\xea\xba\x3b\x44\xd8\xf0\xe8\xfb\xcc\x1d\xa7\x61\x07\x99\xa1\x0e\x8c\xa0\xa4\xc2\xc8\x59\xc1\xb5\x10\x10\x22\x6a\x01\x6f\xd4\x88\x1c\x5a\xfd\x15\x9a\x19\xaa\xe6\x4a\x56\x54\x57\xc0\xa7\x07\x5b\x1d\x73\x76\x49\x84\x81\xe4\x54\xac\x68\x60\xb9\x07\x57\x54\x0c\x67\x70\xb0\x01\x15\xe3\xca\x07\xa8\x2f\x31\x3c\x59\xe3\x88\xa0\x9f\x1c\x0f\x13\x0d\x7a\xcb\x3d\xa4\x2b\x65\x69\x4c\x0a\x37\x35\x37\x14\x16\xd6\x12\xcd\xeb\x7f\xb7\xc7\x1c\x4e\xbb\x11\x69\xd6\x11\x6d\x3c\xde\x9e\xa5\xbb\x9b\x1b\x0a\xd3\x6a\x36\x31\xa1\x7f\x72\x0f\xf9\xdf\x1a\xb9\x9e\x1d\x29\x16\x3d\xff\x22\x2f\x52\x7f\x8b\x46\xee\x69\xb8\x4b\x4d\x26\xde\x11\xc7\xf6\x17\x24\xaf\xaa\xa7\x36\xcb\x88\x6a\x11\x2d\x31\xb8\x27\x89\x60\x59\x45\x36\x4d\xcf\x35\xc4\x21\x25\x00\x23\x62\xa4\xda\x93\x27\x35\xb2\x19\x9c\x2d\xc7\x4f\xe9\x97\x34\x72\x7f\xc3\x06\x4e\xf3\x87\xab\x3a\x8c\xb7\xf4\x21\x71\x3b\xd9\xc4\xe8\x62\x55\xb7\xd5\x6c\xec\x31\x29\x2e\x41\x60\x05\x59\xf2\x8a\x0c\xd9\x2a\xac\x94\x5e\xa0\x7f\x4f\x23\x0f\x34\x6e\x2a\x7f\xfc\xd4\x74\x8d\xc6\x7e\x44\x93\x4f\x54\xb4\x57\x5e\x16\xcd\x8c\x8c\xd9\xb2\xb9\x42\xd9\x12\x7d\xda\x95\xec\xd4\xc4\xc7\xd8\xae\x78\xb6\xe4\x15\xd2\xf6\x1c\x7a\xd1\x9a\x2f\x39\x34\x90\xce\x41\xdc\x02\x3b\x20\xbf\x75\x60\x6a\x6c\x78\xf4\xc4\x58\x76\xbe\x40\xbe\xa3\x91\x6b\xa1\xdc\x53\x25\xae\x2e\x7d\x53\x33\x7f\x53\x1b\x96\x34\x51\x41\x4b\xe4\x37\xc5\xe1\xf4\x85\xa6\xef\x99\x7d\x86\x19\x78\xb3\xa1\xf9\x68\x96\xad\xa6\x48\x05\xa6\x05\xa3\x5f\xbc\xc3\x59\x99\xf6\x7c\xc9\x59\x32\x66\x2d\x0e\x03\x78\x2e\xe5\x14\x66\x78\xbc\x65\x93\x72\x3c\xe8\xfd\xd1\xb7\x6d\x83\x4a\xfb\x45\x43\xeb\x08\xa6\xdf\xd2\x48\x87\x3b\x1b\xe8\x9f\x6c\xc6\x4e\x56\xc1\x9b\x30\x5f\xa5\x9d\x3c\x9c\x1c\x58\x95\x38\x21\x4c\x9f\x6c\xdc\xb2\xc6\xa4\xef\x2d\xd8\x42\x3b\x9f\x61\x3b\x97\x61\x15\xe6\x6d\xb7\x1d\x66\x74\xf2\x36\x8d\x6c\xca\xd3\xd2\xdc\x6c\xa0\xbf\xae\x8e\x4a\x13\xeb\xa9\xb4\x34\x77\xb8\xd6\x94\x9d\xe0\x77\x93\xd3\x95\x5d\x33\xd2\x3e\x8c\xcf\xdb\x60\xce\xf2\x29\x97\x14\x85\xae\x40\x52\x44\xc8\xaf\x67\xc8\xb3\x8a\x79\x1a\xd7\x34\x6a\x07\x17\xf4\xf7\x67\x9a\x10\x02\x47\x46\xc6\x92\xaf\x25\x1a\xf9\xb7\x5a\xd5\xfd\x64\x83\x8f\x8c\x8c\x19\xe2\xaa\xd4\x78\xab\x17\x98\x55\x6f\x79\x01\x4b\x8e\x5e\x2c\x79\x41\xbc\x1a\x81\xee\xb2\x52\x43\x59\xcc\xd3\x78\x26\x17\xec\xe0\x02\xf9\x5b\x8d\x5c\xcb\x84\xd3\xf0\x2c\xf4\xd5\x92\xfe\xd5\x7a\xb0\x5d\xd4\x75\xbc\xa7\x4e\x2a\xef\x99\xef\xd4\xd4\x3f\xe5\xa1\x31\xa6\xe9\x09\x56\x25\xa7\x4f\x2e\x72\x22\x6c\x21\x02\xf2\x84\x88\x12\xa4\x68\x2b\xcf\x3d\x9a\x05\x4f\x4f\x65\xc4\xba\xb3\x4e\x99\xba\x79\xa1\xa1\xb1\x63\x63\xa1\xec\x08\xbb\x7f\xc9\x2b\x88\x4a\x38\xd9\x58\x96\x9b\x25\x1f\xcb\x90\xe7\x58\x8b\xc1\x98\x63\x05\xa1\x9d\xcf\x39\x5e\xfe\x02\x93\x8f\x54\x7f\x47\x86\x0c\x37\xfc\xdc\xe1\xb3\xd3\x55\x6f\x26\x26\xcb\x57\xb4\xb4\x47\x2a\x96\xed\xf0\xd9\xe9\x15\x9b\x30\x97\x39\x2f\xac\xc5\x80\xf2\xd6\xcf\xb0\xd6\xb3\xdb\x94\xfc\x69\x86\x6c\xc9\x3b\x96\x3d\x3f\x45\x67\xf5\x2f\xb4\x82\x81\xff\x64\x66\x44\xbc\x0f\x04\x50\x4b\xd0\x4f\x8c\x19\xbb\x5f\xb8\xcf\x83\xc5\x5f\x24\x2a\x34\x66\x68\xb8\x48\xa9\x6b\x54\x8a\x0d\xf8\xf4\xca\x8b\x50\x72\xd6\x18\xbb\x58\xa2\xf9\x90\xf7\x86\x50\x8f\x5d\xdb\xe1\xa6\xb1\x19\xaf\xec\x16\xb2\x06\x7c\x43\x34\x65\xad\xd8\x86\x26\x5c\x1c\x43\xe0\x62\x40\x23\xe2\x16\x9c\xe1\x75\x9e\x19\x69\xe3\x8e\xb1\x4d\x7c\x27\xf9\xa0\x46\x32\xb3\x79\xfd\xbd\x1a\x19\x68\xd8\xa5\x87\x47\x12\x13\xad\x74\x78\x24\x29\x85\x0e\xdb\x33\x3e\x35\x46\xe6\x2c\xd7\xa5\xce\x0a\xcc\x2c\xf2\xff\x68\x64\xf3\x2c\x9b\x14\xd4\xd7\xff\x46\x23\x7b\x1a\xb7\x98\x3f\x9c\x68\xf6\x53\x9a\xb8\x5a\xd1\x78\x71\xb1\x52\x8f\x6a\xd4\xd8\xea\x76\x02\x26\x6d\x87\x81\x51\x0e\xac\x62\xc4\x4e\x28\xd0\x12\x75\x0b\x41\xb4\x99\x44\xb5\x09\x18\x14\x58\x66\x76\x9e\x1a\x33\x94\x4d\x3e\xbf\xec\xba\x6c\x70\x7e\x34\x43\xb6\x16\x39\xca\x36\x1b\xe8\xdf\x6f\x46\x45\x3b\x12\x3d\x5e\x63\xbf\xfb\xb8\x26\x9f\xa8\xd8\x42\xe4\xe5\x3a\x2a\x9a\xc5\xbf\x3f\xfd\xbb\x97\xb7\x55\xd4\x52\xd3\xe4\xf7\x2a\x6a\xda\x4b\xc9\x46\xc7\xcb\x5b\x8e\x1e\x90\x5d\x0d\x7b\xe0\x38\x7b\x32\xf1\xcd\x07\xe1\x92\xfa\xb9\x7c\xc5\x3b\x4b\xfd\xf2\xe3\xc4\x52\xe1\x66\x38\x38\xd2\x5b\x62\xfb\x20\x5f\xd0\x08\xe1\xad\x3b\xe1\x15\xa8\xfe\x29\xcd\xfc\x90\x16\xff\x2d\x77\x17\x1b\xb8\xf6\xbc\xef\x40\xcb\x0b\x05\x9d\xd9\x4b\xfa\xd6\x58\x06\x27\x5d\x71\xd3\xa0\x43\x39\x61\xcd\x88\x9c\x95\xe6\x2d\x9b\x9d\x4c\x0d\xdf\x5a\x34\x40\x00\x72\x96\x1b\x9c\xe6\xb8\x9b\xe5\xe1\xf8\x25\x56\xcf\x3c\x87\xb1\x41\xca\x80\xa3\xb0\xe2\xa2\xc0\x4e\x5a\x89\x63\xdc\x77\x35\xb2\x25\x6f\x95\xac\x3c\xdb\x5e\xbf\xa5\x99\x6f\xd5\x86\xd3\xcc\x4b\x55\xe7\x0a\x38\x6e\xaa\xe4\xde\xa8\x90\x76\xca\xa4\xa8\xcc\x0f\x6a\x87\xc8\x41\x72\xa0\x69\xac\x2a\x1b\x35\x2d\xfb\xfc\xb2\x05\xb1\x41\x94\xc3\x23\xf9\x3a\x53\x17\x6d\xb7\x40\x7d\xfd\x0f\x9b\x52\x17\xe1\xd9\x1a\xcb\xe7\x0d\x1a\xbf\x9d\x5c\x3b\xbc\xf8\x96\xce\x8b\x4d\xad\x8d\xf9\xa5\xe0\x45\x4e\x3f\xaf\xa5\xbf\x54\x50\x56\xc6\x9b\x34\xb2\xf9\x45\x65\x6f\x66\x29\xa4\xfa\x13\xcd\x48\xc4\xe7\xf3\x87\x13\x1f\x75\x4c\x5c\x4c\x7e\x54\x74\x71\x99\x4a\xf0\xbb\x34\xb2\xd5\x7a\x71\xd9\xa7\xa0\xfc\xbe\x51\x23\xf7\x36\x56\x69\xa2\xc7\x13\xad\x3a\x2d\x2f\x57\xea\x2e\xec\xba\x31\x6a\x85\x16\x57\x61\xaa\x1b\x08\x2e\xf0\x76\xd4\xfb\x89\x2d\xe4\x4f\x34\xb2\xd1\x0e\xf2\x81\xad\x7f\xb1\x0e\x13\x46\x36\x6d\x7c\x7a\x64\x7a\xbc\xc6\x5c\xf8\x71\x0d\xee\x56\xb4\x8e\x5f\x5b\x6d\x65\x9c\x3c\xa5\x91\x1b\xc5\xd2\x1a\x71\xac\x20\x60\xca\x85\xfe\x56\xcd\xfc\x51\xed\xa4\xa0\x04\x4e\x2b\x77\x59\x99\x1c\x1d\x03\xcd\xb4\x1a\x46\x98\xa1\x8e\xe7\x16\x83\xac\x31\x06\x56\x56\x11\x48\x07\x82\xb9\x08\x0c\x2b\x56\x94\xa5\xfb\x36\x7f\x89\x67\x40\x59\x4a\xd4\x97\x90\x41\xbf\xa6\x91\x6b\xb8\x56\xcd\xe4\x67\xa0\x7f\x48\x33\xdf\xa4\x0d\xc7\x17\x62\x90\x14\xfc\xbb\xac\x25\x61\xee\x49\xa8\xe5\x62\x5d\xb5\x53\xfc\xf0\x36\xf5\xcf\xb3\x36\xd4\x39\x42\xff\x5b\x86\x6c\x61\x03\x36\x69\x85\x73\xfa\x3f\x64\x9a\x80\xa0\x8e\x8a\xa7\x93\x58\x49\x26\xba\x9c\x5c\x76\x7c\x6b\xf2\xfc\xa5\xfa\x07\x6a\x03\x80\x73\xaf\x44\x21\x22\x52\x48\x39\x55\x3a\xf2\x37\x2b\x07\x74\xb6\xcc\x03\x04\x71\x50\xb4\xdf\xe5\x5b\x15\xbc\x23\xdd\x0e\xd9\x6b\x70\x5e\x71\x9d\xa5\x3b\x8d\x53\x6e\x3f\x4c\xc4\x68\x2b\xac\xf6\xf8\xe3\x3e\x6f\x8b\x16\x87\xa2\xcf\x8e\x1f\x3f\x6e\x9c\x3c\x75\xda\x38\x7b\x6a\xea\x18\x67\x61\xcc\x97\x9d\xd0\xe6\x75\x49\xfa\xf6\x65\x1e\x07\x58\x93\x4a\x56\x38\x47\xbe\xaa\x91\x0e\x7f\xa6\xc0\xd6\xed\x50\xc3\x2e\x9f\xca\x8d\xd6\x58\xb5\xaf\xd7\xa6\x72\xa3\xc9\x2e\x9f\xb2\x0a\x5e\x60\xc0\x59\xc9\x18\xa5\xa0\x87\x2d\x4f\xe8\x2d\x4b\xc1\xf1\x67\x54\x01\xfe\x09\x8d\x90\x59\x87\x46\x90\xe6\xfb\xb5\xda\xfb\x9e\xa2\xd5\xd2\x8b\x35\xbe\x6e\xee\xb0\x2c\x2b\xf9\x8d\xc0\xa0\xb7\xf3\xd1\x2a\xaa\x12\x4d\xa5\x78\x7e\x0d\x48\x31\xc5\x9d\x0c\x2d\x26\x8a\x68\xde\x98\xb1\x98\x34\x2a\x39\xe5\x22\x13\x38\xbf\xd6\x41\x6e\x2b\x55\x34\x62\x8a\xc2\xf9\x66\xd2\x73\xec\xfc\x92\x7e\xa9\xc3\x7c\x7d\xc7\x59\x56\xfe\x9c\x55\x2a\x51\x57\x84\xd5\xa9\x16\x36\x82\x35\xed\x50\x2b\x3a\x67\x83\xfa\xcc\xcf\x4a\x12\xc5\x16\x56\x7b\x9f\x1a\x53\x14\x82\x73\x75\x17\xb8\xef\x08\x27\x65\x5b\x6e\x19\x1c\x04\x84\xa7\x67\xd5\x19\x2d\xe8\xe9\x33\x46\xc1\xdf\x33\xf9\x62\x61\xc9\xb5\xe6\xed\x3c\xbc\xab\x74\x42\xea\xfb\x6c\xd6\x4f\xd1\xfc\x52\xde\x81\x42\x22\x6b\x76\x4f\x56\x5e\x8d\x6c\x19\xf1\xa2\x11\x5e\x3a\xe2\x53\x79\xef\x25\x08\xfe\x6c\xc9\x56\x56\xd6\x4e\xb1\xe6\xf3\x41\xb1\xdd\x62\x85\x99\xf8\x39\xa5\x39\x2f\xf4\xdc\x0a\xb8\xea\x97\xb5\x26\x40\x88\xc9\x94\x37\x93\x67\xc3\xb4\x27\x92\x33\x92\x3f\xa1\x10\xc3\x94\x89\x51\x60\x4f\x2f\x0f\x77\xff\x90\x46\xae\x5b\x08\x4a\x73\x34\x82\x43\xf4\x4b\x1a\x39\xd4\x18\x3d\x12\xaf\xd8\x7e\x58\xb6\x9c\xaa\xef\x38\x7b\x46\x2d\x32\xf9\x01\x0b\xd3\x70\xab\x35\x33\xc1\x07\x22\x35\x89\x69\xf3\xfa\x3b\x9b\x39\xda\x0d\x47\x8f\xd7\x58\xfb\x67\xe5\x03\xa9\x0a\x13\xdc\x98\x16\xe7\xcc\x65\xe9\x4c\x6f\xd3\x48\x07\xd3\x98\xde\xd8\x8c\xe4\xad\xad\x2f\x4d\x56\x28\x4b\xd1\x3e\x13\x89\x20\x4e\x39\x8b\xf4\x1a\x7a\x51\xf0\x2d\xd8\x5b\x05\xdf\x5e\xa0\xbe\xd1\x9d\xa3\xa1\x15\x85\xf7\xe9\xc9\x92\x4f\x5c\x4b\x9e\x9b\x6a\xf2\x29\xe8\xef\xbc\xd6\x5c\x9c\xf4\x04\x55\x20\xcf\x26\x58\x3e\x3a\xe0\x08\xf5\x42\x06\x58\x62\x1a\x85\x5f\x76\x59\x6f\x58\x62\xb7\x3d\xcd\x69\x24\x81\xa4\x74\x46\x52\x65\x66\x49\xba\xd2\xb3\x0e\x13\x98\x1f\x0c\x74\xe8\xc1\xcb\x41\xd2\x72\xf5\x39\x82\x94\x96\xcb\xa5\xb4\x20\x03\x04\x19\x20\x09\xb7\x8c\x3f\xd5\xc8\x86\xa0\x44\xf3\xfa\x1f\x68\xa4\xbb\x09\x0b\x70\x61\xba\x44\xf3\xe6\xcf\x6a\xd3\x95\x86\x67\xe1\xbe\x0c\x41\x9a\x66\xe8\x9c\xb5\x60\x7b\xbe\xc4\x40\x6a\x60\xd9\xed\xfc\x22\xf6\x11\xfd\x96\x5b\xe8\xe7\x7c\x5e\xf2\xf6\x0c\x1b\x38\x60\xe5\xbd\x3e\x43\x7a\x9b\xfa\x34\x78\xdc\xfc\xa6\x76\xc2\x83\xe0\x09\x79\xea\x86\xce\x92\xa4\x75\x25\x98\xc2\xe2\xa3\x38\x20\xc9\xce\xcf\x6c\xd6\xcb\x59\x0b\xf1\x4e\x00\x6a\x9a\xf4\x4a\x22\xec\x42\x14\x2a\x48\x38\x55\x4e\x45\x4e\xbc\xab\xdd\x33\x4f\x6b\xc7\x1a\x93\x7e\xba\xf5\xed\xfd\x86\x4c\xa4\x58\x41\xee\x31\x14\x3a\x10\x79\xfb\xe6\x84\xcf\xaa\xd2\x9d\x92\xcb\xa6\x7f\x6f\x93\x39\xaa\x5e\x88\x8f\xa5\xc2\xf9\x5f\xfa\xea\xe7\xcb\xbe\x9f\x60\xd5\x49\xb1\xcd\xba\xfb\x92\x06\xf4\xe2\x4b\x9a\x18\xd9\xc4\xf6\xf0\xc6\x4d\xe4\x21\xb2\x59\x78\x9d\xea\x27\xcc\x07\x8e\x26\xa9\xdf\xe2\x4e\x14\x39\x98\xc9\xb6\xa8\x76\xce\x45\x87\x78\x4f\xa1\x6f\xb9\x01\xd4\x9c\x38\x68\x3f\x26\xdd\x32\x4f\x9b\x47\x1e\x74\xed\x17\x31\x21\xef\xb9\xb4\x7f\xd1\xf3\x0b\x7d\xb1\x6c\x32\x84\xcb\xe6\x6c\xec\x63\xca\xbf\x83\x1d\x71\xea\x94\xff\x2b\x9a\x9c\xad\xc0\xf9\x16\xdc\xd1\x88\xe5\x91\x98\x78\xb2\x4c\x90\x94\x6c\xc2\x9d\xf6\x59\x73\x0e\x5b\x4e\x40\xfb\x8c\x07\xdd\x0b\xae\xb7\xb8\x7c\xa3\xe2\xa2\xe7\x5f\x70\x3c\xab\x10\x0c\x94\x3c\xfe\x4f\x3f\x3b\x94\x81\x32\xbe\x8d\xfd\x15\x33\x1d\xd5\x96\xbf\x35\xe2\x7c\xff\xb8\x66\xbe\xec\x74\x2a\xe9\x3b\xd1\xe4\xd5\x69\x95\x4b\xae\x63\xdd\x3d\xe9\x7b\x33\x14\x9c\xb5\x1e\x6d\xdd\xc1\xcc\x3c\x0e\x03\x07\xae\x59\xe0\x39\x3e\x43\x0b\x15\x5f\x45\x7e\x42\x23\x3a\xab\xf0\xb4\x1c\x5e\xa8\xf5\x25\xad\xd7\xfa\x40\x5c\x6b\xa2\x2e\x65\x06\x45\x27\x3c\xcf\x95\x53\x04\x00\x23\x08\x3f\x97\x25\xdf\xce\x90\x8a\x08\xbc\x73\x3c\x0e\x10\x34\x99\xd5\xe3\x5d\xa0\x6e\x92\x94\xfe\xcb\x19\x73\x4f\xf5\xe5\x68\x48\x45\x3c\x19\x30\xf6\x45\x71\xec\x78\x88\xeb\x4b\xda\x46\xb8\x70\x49\x7b\x76\x1c\x2c\x50\x7a\xe2\x25\xd6\xe9\x57\x34\xa6\x05\xa7\x3d\xa6\xff\x48\xeb\xdd\x35\x3a\x56\x5d\x5e\xc2\xab\xce\x9b\x55\xc3\x18\xca\x08\xdd\x22\x7c\x12\x8f\x1b\x48\xf6\x12\xfe\x19\x7a\xd6\xbc\x13\xba\x21\x76\x63\xb6\x5e\x54\xa6\xc6\x0c\xb5\x7c\xa6\xd7\xc0\xd3\xea\x7c\xfb\xc0\x46\xb2\xb3\x56\xb4\xe3\x5d\x33\x34\xb4\x76\x65\x4f\xd0\xd0\xb7\xf3\x60\x7a\x10\x9d\xfd\xaf\x1b\xcc\x7b\xab\xae\xaa\xac\x70\x21\x0c\x45\xa0\x49\x88\x66\x36\x0f\xcf\x27\x3a\xf4\xc3\x1b\xc8\x3f\x6b\x44\xb7\x16\x28\x3b\x03\x3c\x18\xda\x8e\xfd\x62\xf8\x4a\xfd\x4f\xb4\xc8\x05\xf7\x37\x34\x51\xd8\x70\xd5\x53\xd1\x27\x26\x6b\x93\x61\xb3\xe0\xf1\xb8\xbf\x84\x0e\xc8\x9b\x61\x58\x79\xdf\x0b\x02\x11\x43\xcc\xa1\x0b\x96\x1b\x82\xb9\xbe\x2f\x56\x0c\x05\x45\x90\x1d\x49\xd9\x7e\x9a\x28\x2c\x8a\x3a\x96\xa8\x52\xd6\x11\xc9\x50\x56\x60\xd2\xc5\xf7\x57\x34\x72\xad\x68\x19\xf4\x9c\xfe\x64\x1d\xac\xa7\x09\x1b\x87\x59\x54\x4b\x5b\x4e\x87\x34\xe8\x07\xa3\x1b\xbe\xfd\x45\xa2\x9e\x1e\xf2\x0a\x8d\x6c\x84\xf2\xf4\x8b\x97\xd7\xe2\xfd\x0b\x0d\x9b\x2a\xda\x56\xd1\x04\x80\x9b\xee\x4c\x63\xa4\xf1\xc0\x2a\x11\x7d\xeb\x6d\x1d\xe6\x7d\xc9\x4b\x00\x18\x85\x11\x09\x33\x10\xd6\xb8\x0a\xdf\x0f\x79\x22\x4c\x4c\xd1\x2f\x64\xc8\xf3\xc9\x46\x87\xa9\x2c\xfa\x51\xf3\xc0\x71\xf6\x83\xb5\x3d\x0a\xe6\x02\x77\x04\xb9\x93\x07\xe9\x92\x5c\xce\x64\xa9\x89\x45\x37\x49\x36\xf8\x9e\x43\x59\x89\x53\x9e\x23\x1c\xbe\x64\x7c\x18\x76\xa5\x85\x12\x61\x2f\x3b\x6a\x1e\x88\xb6\xb2\xb8\x44\xd8\xd0\x5a\x28\xb1\x1c\x50\x9f\x95\xf8\x60\x10\xc5\xe5\x8f\x4a\x84\x60\xee\xcb\x2d\xf1\xaf\x33\xe4\xee\x1a\xf1\x4e\xb2\x63\xe2\x88\x75\xd4\x76\xc3\x40\xff\x44\xc6\x3c\x96\xb8\x12\x87\x3d\x99\x83\x3f\x45\xb8\x21\xa6\x0a\xcd\x79\x8b\x00\x15\x44\x67\xb4\xd8\x95\x4d\x44\xe8\x28\x24\x0f\xe3\x5f\xd7\xc8\xd7\x34\xb2\x65\x96\xc7\x53\x09\xf4\xdf\xd3\xcc\x42\xf4\x47\x22\x39\x03\x0f\x73\xd2\x1d\xf4\x24\xa3\xa7\xa4\x54\x00\x1a\xb2\x27\xe2\x09\x1b\xa1\x57\xf2\x1c\xaf\xb8\x64\x58\x8b\x10\x2f\xd9\x2b\x33\x95\x2d\xc1\x14\xae\x1f\x71\x3e\xd1\x31\x22\xee\x4b\x93\xde\x4e\xdf\xda\x4c\x72\x97\xef\x81\xa4\xbf\x6b\xb3\x50\x58\x13\x3d\xf7\xea\xcd\xe4\x13\x99\x54\x6d\xe1\x67\x32\xad\xef\x7f\xdf\xd2\xaa\x0b\x4c\xec\x7f\x49\x25\xa2\x42\x17\xad\xaf\x49\x18\xe3\xb3\x3c\x1e\x57\x1f\xc7\x97\x2d\x70\xd5\x53\x34\x92\x68\xa9\x80\xb7\x1e\xdb\xa6\x5c\x1e\x52\x45\x38\xb5\x4a\x0d\x38\x90\xda\x04\x77\x38\x2d\x24\xa2\x6f\x16\x64\xfc\x22\x36\x51\xa2\x35\x20\x24\x1b\xd8\x06\xc8\x4b\xc9\xf5\xac\xe5\x0f\x02\x2c\x00\x7d\xf6\x78\xeb\x5d\x36\x10\x4a\x45\x41\x86\x0a\x63\xdd\x22\xd2\xbc\x40\x03\xec\x20\xfe\x00\x32\x1d\x1f\x2f\x8e\x9a\x07\xc0\xb3\xd4\xa8\x3a\x5e\x00\x31\x21\x79\xb0\x50\x36\x3b\xce\x40\x50\x97\xf3\x7e\x79\xb2\x18\x30\xcd\x19\xdf\xa6\xb3\x95\x67\x88\x9a\xaf\x7e\x25\x3e\x34\xfc\xae\x66\x7e\x32\x3a\x34\x54\xea\xdc\x70\x50\x61\x57\xd3\x8f\x09\xc3\xd2\x99\x70\x94\xba\x10\xce\xd1\x72\x0b\xc6\x61\x1e\x49\x44\xf1\x6e\x52\x0e\xb8\x26\x94\x61\xb2\xa1\x36\x45\x39\x66\x32\xfe\x94\xc9\xea\x32\xd5\x99\x93\x1a\x35\x47\x3c\xa6\x7e\xd4\x9c\x10\xc1\xe7\xcd\xe9\x1a\x27\x88\x63\xac\x3e\xb5\x65\x82\xa6\x61\x98\xd1\xa7\x98\x7d\x86\xc9\x3f\xc6\xe4\x5f\x63\xf2\xcf\x49\xd6\xf4\x2a\x42\x96\xcb\x71\xd5\xbf\xbc\xd5\x7c\x43\x22\xde\x99\x20\xb8\xc6\x3c\x92\xe6\x42\x9f\xc1\x6b\x92\x20\x74\x79\xc1\xcf\xb6\xcc\x7b\xae\x1d\x7a\x7e\xf2\x38\xfc\xe4\x16\xf2\xa4\x46\xe4\x3d\xfd\xa7\x35\xf3\x65\xc2\xe3\xa6\x30\x64\x9c\x10\x97\xd3\x40\x5d\xf8\xa2\xe8\xbd\xe5\x98\xe3\x38\x93\x38\xb6\xc8\x6d\x9b\xf3\x16\xfb\x43\xaf\xbf\x1c\xd0\x7e\x3b\xac\x63\x07\xa6\x22\x3e\xdb\xa3\xe6\xe4\x29\x11\x2f\x68\xc8\x78\x30\xe0\x73\x04\x54\x19\x61\x03\xf0\x3d\x2f\xec\x33\x7c\x0b\xc2\xc7\xca\xe0\xb7\xb3\x65\xc7\xe1\xad\x0e\x7d\x4a\xfb\x22\x41\xc2\xbe\x6d\xa0\xc2\x50\x13\x07\x61\xfb\x2d\xcd\xfc\xb8\x16\xd7\x56\x15\x3c\xcd\xe8\x66\x8f\x0e\x2c\xfa\x76\x48\x7b\x38\x5c\x53\x33\x5c\x9b\xbc\x19\x88\x80\xbd\xb6\x2b\x12\x1e\x9c\x60\x0d\x4f\xc7\x7a\x5b\xed\x45\x25\x1e\xdb\x67\x34\x42\x02\x9a\xf7\x69\x08\xa6\x8f\x8f\x6a\xe6\xcf\x29\x9f\x34\x2d\xef\x44\x1b\x41\x09\x82\xdf\x79\xe0\x3f\x03\x78\x2f\x13\x31\x4c\x2d\x49\xf6\x19\x0d\xf3\xd0\x8a\x01\xa6\x9f\x64\x79\x05\xed\xfc\x82\x78\x44\xfe\x4e\x23\x5b\x79\xf9\x53\x74\x56\xff\xb3\x66\x98\xf4\xd3\xd1\xe3\x82\x8c\xfa\xde\xaa\x2f\x16\xbc\x54\x19\x8f\x32\xda\x4a\x92\x07\x60\x43\x7c\x57\x6a\x17\x08\xff\xa9\xb6\x7d\x33\x79\x87\x26\xf4\xc0\x37\x69\xe6\x2b\xb4\xc4\x24\x97\x01\xa7\x7c\xb0\x9d\x83\x4e\xe8\x5a\xf3\xc9\x79\x0c\xd4\x94\x95\x19\x83\xff\xec\x20\x9d\x69\x4c\x0b\x30\x21\xf9\xfa\x37\x3a\xcc\x7b\xc5\x6f\x69\x5f\xb1\xe2\x74\x15\x22\x04\x95\x30\xe9\x4b\x11\x6f\x5d\xa0\x6e\x42\x1c\xfd\x54\x07\xf9\x09\x8d\x6c\x0d\xf3\xa5\x69\x2f\x7f\x81\x86\xfa\x13\xcd\x0c\xf6\xe9\x91\x49\xfe\xf8\x30\x54\x63\x9e\x92\x17\x64\xc4\x66\x30\xcb\x45\x71\xb1\xdc\x05\xcf\x59\xe0\x8e\x66\xa7\x47\x26\xc1\xfd\x28\x0b\xbf\xe6\x3c\xef\x02\xe7\x60\x2c\x51\x85\x87\xc1\xda\xb4\x81\x5e\xa4\x79\xfd\x35\x1a\xd9\xd1\x38\x5c\xc9\x45\x9a\x17\x2d\x79\xc1\x29\xc1\x2f\x82\x38\x8c\x62\x83\x05\x61\xe4\x39\x8e\xb7\xc8\xda\xa0\x64\xa8\x88\xa2\x4b\x67\x0d\x56\x84\xd2\x76\x25\xa6\x1b\x9b\xa5\xd6\x05\x9a\x25\x17\xc8\x66\x36\xba\x47\x68\xa8\x9f\x27\xd9\xc6\x94\x98\xd3\xa7\x27\x8f\xc8\x1e\x8a\xfe\xac\xa8\x83\x15\x28\x15\x89\xd0\x63\xa7\xf1\x59\xcf\x9f\xcf\x92\xbf\xcf\x24\xe0\x5b\x7f\xc6\xca\x4b\x15\x97\x1d\xaa\xd8\xba\xfc\x6c\xc6\x3c\x24\x7e\xc7\xc8\xad\x1a\x38\x11\x46\x1f\xd4\x7a\xa9\xb7\xc1\xf1\x8b\x53\x70\xcb\x01\x2d\x5c\xd2\xb6\x58\x25\xfb\x88\xef\x95\x4b\x97\x34\xb0\x40\xa5\x45\x4f\xfc\xba\x46\x26\x89\x7c\x50\x1f\x35\xf7\x0e\x4f\x8e\xc3\xef\x68\x8d\x00\xf0\xac\x68\x46\x02\x2a\x10\x5c\xdf\x68\xc5\x17\xd4\xf9\x9d\x13\x16\xaf\x21\xb3\x3f\xb2\x77\xa9\xf0\x64\xb3\x65\x40\x50\xc7\x21\xb3\x5f\xa5\x9a\x47\x21\xe2\x9a\x2a\xe3\xcf\x3b\xc8\x76\xa5\xa7\xa3\x2c\x39\xf2\x3c\x31\x3d\x0e\xce\xb1\x25\x9a\xd7\x3f\xd2\x61\x3e\xa2\xfc\x2d\x20\xa1\xea\x50\x95\xe9\x1e\x80\x8e\x6a\xe8\x0d\x78\x40\x10\x87\x1b\x56\x99\xea\xee\x15\xe8\x25\x6d\xb3\xb8\x9b\xe8\xfe\x5f\xc9\x90\x5f\xca\x90\xe8\x96\xfe\x54\xc6\xfc\x71\x4d\x96\x12\x28\x69\x9c\xd4\x96\x28\x35\x8e\x8a\x67\xa5\xee\x2f\x2b\x04\x45\x90\x27\xbb\x8b\x1a\x25\xf4\xa2\x80\x27\x93\x28\xbb\xb2\x99\x22\x77\x0c\x27\xa7\xe5\xbd\xf9\xc8\x9b\x55\xd5\x1f\x86\xc8\xbe\x3a\x64\xc8\x1a\x5d\xcb\x9b\xd7\xbc\xbb\x7c\x53\x2e\xf8\x6c\x0a\x10\xf2\xca\x2d\xe4\x60\xcb\x07\xc6\xe3\x76\x10\xea\xbf\xb9\xf9\x92\xb6\x11\xe2\xf3\x27\x86\xe4\xe7\x37\x11\x8b\xf0\xeb\xfa\x43\x6a\x0f\x1c\x23\xe3\xe4\x48\x9b\x62\x66\xa0\x55\xf8\x32\xac\xc2\xe3\x8a\x51\x78\x39\x4c\xeb\xf8\x30\xca\xc6\xff\x04\x0d\x2d\x64\x37\x5c\x26\xbb\xe1\x69\xed\x25\x8d\x2d\x9b\x0f\xe9\x67\x64\x38\x83\xc4\x32\xa9\x08\xfe\x53\x77\xb9\xa6\x06\x05\xfa\xd7\x9b\xc8\xf3\x6a\xc5\x38\xd3\xbf\x76\x93\xf9\xda\x96\xc3\xf6\x62\x04\xde\xb6\x47\xe0\x95\x8b\xf6\x92\x76\x3d\x57\x1b\x69\x81\x93\x33\x92\xe1\x1f\x9e\x4d\x26\xc8\xc6\x3c\xc4\x33\x1d\x8e\x8c\x29\x7d\xa7\xd9\xde\x2f\x53\xcf\xf0\x6c\x14\x4a\x6c\xab\x39\x2b\x30\xbc\x3c\x20\x57\x85\xa4\xe1\xe2\xc1\x18\x41\x9a\x30\x0f\x0e\x5f\x4e\x74\xb2\x67\x3c\x33\xe5\x4d\x1a\xd9\xc4\xd7\xb8\xfe\xaa\xe5\xc6\x12\x3c\xcd\x33\xc6\x45\x31\x7a\xe2\x10\x7b\xf1\x28\x65\x8d\x69\x39\x8b\x2c\x36\xa3\xfc\xd8\x6f\x00\xa6\x6c\x00\x7d\xc0\x86\x85\xf7\x72\x16\xe5\xf3\xe5\xb2\xcf\x7e\x4a\xe3\x66\xf9\xd8\xe2\xfb\xc4\x65\x04\x7e\x3d\x7a\x3a\xc2\xb6\xad\x50\xba\x60\x50\x1e\xa4\x8e\x93\x77\xa2\x55\x28\xf3\x12\xc9\x25\xba\x68\x05\xd0\xad\x7e\x81\x16\xb2\xc4\x8f\xa3\x5e\x17\x5b\xf0\x87\xdd\x7d\x6a\xf9\x41\xae\x49\x89\xe8\x4a\xf0\x69\x31\x53\xf5\x87\xcd\x13\x27\xdb\x19\x77\x5a\xed\xfd\x07\xd3\x22\x0c\x3e\x60\xee\x6e\x21\x8c\x60\x45\x7c\x95\x28\x36\xe4\x13\xcd\xaf\x53\x1e\x14\x72\x7a\x74\x05\x42\x41\x9e\x91\x31\xb3\x8f\x9b\x87\xce\x2e\x2b\x4e\xf6\x54\x65\x9c\x6c\xf5\x43\x2d\x81\x4c\xbf\xc0\x3c\x7e\xba\x8d\x01\x0d\xd5\x2a\x7e\x5a\x93\xd6\x80\x37\x6a\xe6\xcb\x35\xa0\x97\x05\x95\x72\xaa\xaf\xbe\xa0\xe2\x53\x85\xed\xcd\x11\x6b\x23\x61\x4e\x88\xad\x3e\x71\xfc\x0f\x29\xe6\x23\x73\x0b\xdf\x76\x2a\x63\x91\x5f\x3f\x9b\x0c\xdb\xfc\xd6\xcb\x58\xbd\x0f\xa5\xaf\x5e\x5a\x11\xf2\x58\x2e\x52\xa3\xfb\xb4\x00\xd0\x85\xb9\x08\xf2\x34\x95\x78\x66\x29\xd7\x60\x23\xc2\x36\xaf\x6c\x0f\x79\x9c\x54\xec\xe8\xfa\x43\x2d\x2c\xea\xbb\x4e\x57\xe4\x5c\x4a\x46\x54\xe5\x91\x5d\xf1\xe4\x74\x19\x27\xa7\xb2\x1a\x4c\x7b\xee\x32\x63\x69\xf3\xd9\xd1\x44\xe8\xec\xa7\xb5\x13\x8d\x0f\x09\xbd\x7a\x77\x7f\xed\x20\xa0\x49\x02\xe4\xa7\x36\x91\xac\x32\x9f\x5c\x1a\x2e\x7a\xfe\x05\x9e\xe7\x9c\x1f\xbc\xc7\xdd\xa2\x4f\x83\x00\xdc\xf7\x00\xdf\xf9\xb1\x4d\xe6\x68\xe5\xc5\x7a\x29\x49\xf8\x00\x5b\x51\x26\x22\x43\xbc\x9b\xb4\xc8\x7f\x7c\x23\x79\xb2\x03\x02\x16\x46\x19\x0e\xde\xde\x61\xbe\xb6\x43\xf1\x0a\x01\x5c\x4a\xea\x0e\xf5\xf2\x1b\x08\x91\x23\x22\xd7\x72\x3c\x06\x9c\x0f\x45\x7c\x2f\xc7\xf1\x16\x45\xf6\x26\x7b\x16\x56\x4c\x68\x98\xb3\x8e\xb5\xe0\xf9\x81\xa9\xa4\x08\x8d\x8a\x8d\xd9\xaf\xac\xd2\xb8\x36\x48\x48\x6f\x08\x0c\xbb\xcf\x58\xf2\xca\x30\xdb\xe1\x9c\x13\x97\x3c\x19\x27\xcc\x8d\x84\x18\xcf\xa8\x18\x85\x3f\x4e\x06\x4f\x16\x8d\x4c\x81\x5f\x39\x13\xa9\xe0\xcd\x5b\xb6\xdb\x5f\xf2\xe9\xac\x7d\x91\x16\xb8\x55\x24\xca\xde\x07\x46\xa5\x5d\xf7\xec\x54\x42\xdc\x32\xf1\xc2\x43\x00\x8b\xcd\xd0\xb4\xf2\xf3\x94\xad\x0c\x9b\x8f\x43\x7f\x5c\xb7\x59\x99\xe8\xcf\x9e\x9f\x2f\x87\x95\xf1\x69\xc9\xab\x33\x84\xc4\x69\x80\xf5\xef\x6b\xe4\x58\x4d\x01\xd5\x60\x42\xc5\x9d\x13\xcb\xae\xf7\x6b\x4a\x97\x09\xe4\xce\xbd\xc0\x7d\xc6\xf2\xe5\x20\xf4\xe6\x63\xe9\x23\x00\x5d\x38\xb6\x15\xb8\x45\xd5\x72\x2a\xb2\xf7\x2a\x6c\xd6\x64\x1f\xc3\x89\x44\xbc\x62\x57\x4d\x25\x25\x19\x31\xd8\x1d\x0d\x7a\x31\xf4\x2d\x25\xff\x71\x96\xfc\xdd\x96\x44\x98\xc0\x54\x32\x4b\x1c\x68\x56\xff\x95\x2d\xe6\x48\xf5\xe5\xca\x1c\x3b\xa9\x24\x62\x85\xdc\x92\x5c\x37\xdf\xda\x4c\xbe\x9a\x21\x1b\xd9\x21\x6c\x49\xff\x42\xc6\xfc\x54\x06\x7e\x26\x48\x2c\x52\xfc\x47\x22\x97\x27\xbe\x93\x21\x9e\xa3\x9c\x81\xa1\x6f\xcd\xce\xda\xf9\x3e\xc3\xca\xb3\x6d\x4b\x68\x16\x8b\x73\x56\x48\xd9\x96\x15\x87\x1a\x00\xb3\x6e\xb4\x1d\xc8\x76\x19\xc3\xa0\xdb\x08\x6a\x97\xac\xdf\x72\x8d\x32\xb7\xb2\x47\x01\x0c\x92\x01\xc5\xab\x4e\xf0\x32\x3e\x1f\x6f\x75\xe2\x65\x03\x34\x5f\xab\xb0\xc4\xd7\x5e\x32\x72\x3a\x57\x15\x80\xbe\xc7\xba\x20\x02\x04\xa0\xf1\x33\xd4\x30\x43\xbf\x4c\x4d\x3e\x1d\x20\x53\x1d\xa7\x51\x47\xed\x17\x2c\xbd\xc8\x3a\xf9\xe7\x19\xb2\x19\x82\x71\xb8\x45\xfd\x0f\x32\xe6\x67\x32\xe2\x0f\x58\x16\x6a\x4a\x4a\x5e\x99\x48\x85\xcd\x5d\x98\xc2\x28\xe9\x5c\x32\x0b\x1b\xe8\x2f\x4a\xcd\xfc\x8b\xbc\x59\xa5\x09\x7c\x62\xc6\x43\x9f\xcc\x13\xce\x64\x9f\x2f\xc9\x94\xa2\xe2\x78\x1f\xe5\xde\x53\x4a\x0d\x00\x5c\xbb\xb6\xd3\x57\xdd\xc9\x05\x0a\x5b\x72\x14\xf2\x98\x95\xa4\x90\x14\x2a\xf2\xa8\xcc\x50\x99\x27\x5d\x66\x85\x8d\x26\xf2\xb4\x63\xe7\xe9\xe9\xb8\xce\x98\x26\xaf\x66\x5f\x4f\xf6\xed\x47\x32\xe4\x1a\xa5\x99\xfa\xbb\x33\xe6\x9b\x32\x6a\xcf\x34\x9a\xbd\x89\x6f\x6c\x76\xda\x8d\x2c\x6b\xa2\x85\x1e\xb8\xb9\xc7\x91\x1a\xd5\xfa\x21\x99\xab\xda\x86\x15\xee\xb0\x7f\xda\x42\x6a\x91\xc3\x44\xac\xfa\x55\x93\x36\xb8\x2e\x70\x5d\xac\x99\x75\x81\x5b\xdf\x4a\x6c\x7d\xbf\x90\x21\xb7\xa8\x2a\x9c\x57\xe0\x67\xcc\x05\xea\xcf\x51\xab\xa0\xbf\x39\x63\x4e\x45\x7f\xb0\xb3\x62\x19\xce\x4e\x95\x92\x45\xea\x68\x5e\xf4\xa8\x15\x04\x5e\xde\xb6\xe2\x4c\x90\x3c\xba\x95\x48\xa7\x99\xf4\x0a\xd0\xc8\x07\x35\xb2\xa5\xe4\x15\x0e\x33\x2d\x57\xff\x5f\x9a\x79\x72\x52\xfc\x51\x59\xd1\xac\xb8\xb8\xbc\xea\xda\x1b\x5b\xe8\xab\x5b\xc8\xee\x7a\xde\x2a\x5c\x4a\x0b\xdf\x94\x05\x9b\x2e\x0a\x27\x8a\x77\x6e\x31\x47\xab\xae\x56\x3b\xac\x80\x84\x04\x8f\x8e\x0a\x1a\x50\xe4\xc1\x92\x4c\xc4\xb7\x99\xbc\x65\x23\xd9\x6a\x95\x0b\x36\x44\x25\xd4\x5f\xb5\xd1\xfc\xfb\x0d\xc3\xd1\x9f\x3c\xb7\xb7\xf8\x4b\xc8\xec\x59\x9b\xcd\xc2\xfc\x9c\x17\x50\x37\x3a\xed\x28\x55\x45\x81\xa8\x2d\x81\x05\xb2\x89\xe7\x08\x73\xcc\x8c\x27\x16\xb2\xf2\x1d\xdc\x9a\x03\x7e\x26\xc6\xb0\xab\xd4\x01\xfa\xbc\xbb\x94\xb8\xc2\xe1\x24\x98\xfa\x41\xcc\xe3\xab\x28\x11\x0e\x99\x56\xfc\x09\x22\xcf\x39\xd4\xd1\x15\xc4\x77\xd8\x52\x14\x68\x42\x75\x21\x90\x7f\x80\x1f\x11\x69\x18\x87\x20\xce\xc6\xe5\x72\x51\x25\x96\x4f\x14\xcc\x55\x66\xde\x8e\xbf\x3c\xa5\xfb\xd4\xcc\xd4\x32\x07\x25\x07\xa2\x2a\xcb\x07\x9e\xb8\xc8\xba\x2d\xa4\xa8\xda\xca\x40\x66\x26\x95\xd5\x00\x8d\x9c\xf3\x10\x12\x8f\xf2\x0a\x41\xd2\xf0\x34\x28\x15\x35\x8a\x0a\xb9\x61\x4e\xde\x93\xe3\xca\x33\x1d\x72\xe9\xd0\xa7\xcc\x32\x3b\xe0\x1f\x6f\x58\x45\xcb\x76\x45\x46\x6f\x59\xa6\xe8\x58\x25\x92\x30\xeb\x57\x91\x1f\xb5\x0e\x51\xb2\x48\xae\x4b\xd4\xad\x9f\x31\x8f\x0e\x27\x1b\x53\x29\xba\xa3\x06\x41\xde\x90\x8a\xf5\x6c\x19\x5c\x3a\x02\xcf\x2f\x21\xc0\x8e\x92\x8d\xd4\xf7\x3d\x5f\x3f\x64\xee\x1a\x63\x3f\x6a\x17\x0c\xd8\xa6\xdb\x05\xf8\x52\x7e\x8e\xe6\x2f\x24\x69\x2f\x2f\x15\xc4\xb7\x90\xec\xab\x79\xc4\xad\xb1\xd8\x1f\x0c\xa8\x3f\xee\xce\x7a\xe6\x3e\x95\x26\x17\x5d\xad\xfa\x1a\x60\x38\x72\x10\x45\x3a\x74\x7d\xef\xda\x7a\xc4\x8c\x66\x48\xfc\x1f\xbb\xd6\x7c\xac\xf1\x63\x32\x73\xb3\xc8\x61\xae\x68\x82\xb5\x2d\xc9\x02\xf4\xab\xeb\xd5\xfa\xf1\x6b\xc8\x6c\x6c\x34\x7c\xa1\x79\x32\xe2\x99\xc7\x91\x9d\x8c\x36\x31\xd1\x8f\x4b\xec\x39\x67\xde\x13\xa5\x1e\x8d\x77\x62\x63\x79\xe4\xf4\xb7\xc5\xe4\xf4\xd7\x69\xe6\x0f\xd7\x70\x61\x5d\x25\x6e\xba\xda\xb0\x77\x6c\x14\x38\xfe\x9b\x36\x9a\xaf\xd8\xd8\x2c\xc7\x9c\xc9\xed\x26\xf8\xe5\x84\x0c\xbb\xca\x73\xca\x54\x90\xfe\x11\x0b\xb6\x05\xb5\x0d\xc8\xac\x38\x41\x79\x26\xda\x1a\xfb\x54\xf7\x64\xb5\x7f\xd5\xb4\x3f\x3c\x5e\x86\xd4\xdf\x45\x96\x9f\x08\x61\xb3\x8b\x2e\xf5\x59\x43\x64\x1b\xdb\xdb\x8a\x02\x14\xaa\xb6\x41\xf4\x7c\xed\x76\x88\xde\xa9\xdb\x0e\x31\x41\xea\xb5\x82\x17\x69\x08\xe3\x4d\xe8\xf1\x1a\xf9\xd0\xc5\x6b\x8c\x55\xa9\x76\x14\xef\x84\xca\xb1\x9c\x2f\x87\x3c\xc8\x11\xbd\x98\x77\xca\x81\xbd\x40\x9b\x9f\x6d\x71\xe2\x2c\x9e\x6b\xbd\x60\x78\xb0\xc3\x14\xc0\x98\x48\x4e\x45\x8c\xd0\x0a\x39\xc0\xd9\x12\xd2\x59\xc6\x71\xbc\xc5\xc8\xab\x4a\x4c\x4d\xf4\x0b\x6a\xd1\x2f\xe8\xf5\x5a\x95\x63\xd0\x8b\x5b\xef\xb3\x43\xc9\xa2\x2a\xdd\x88\x1b\x3b\x0a\xfd\xf5\xd6\x54\x0f\xcb\xe3\xf6\xbc\x1d\x4e\xb1\x0f\x04\xca\xdf\xa7\xb6\x9a\xfd\xc9\x4b\x49\x96\x65\x7c\xcf\x00\x02\x60\x36\x95\x21\xf8\x4e\x4c\xf4\x74\xd9\xbc\x84\x2f\x68\x11\xc7\xf2\x37\x34\xf3\xe5\xda\x38\xfb\x59\x73\x2c\x78\xa7\xa4\xb7\xb4\x5e\x24\x83\x04\xa4\x3e\xc0\xfd\x7a\xfa\x65\x73\xfa\xe3\x50\x4a\x03\xaa\x02\x38\x40\xfa\x9b\x20\xa6\xc7\xcd\x43\x8b\xe4\x65\x58\x24\xff\x50\xe5\x51\xfd\xf6\x72\x7c\xca\xab\xd9\x9c\xe6\x2b\x63\x16\x15\xcc\xa2\x55\x63\x50\x29\x1f\xf7\xb4\x76\xa6\xb1\xb1\x73\xb7\x3e\x98\x96\xe0\x29\x29\x9a\x2a\xf3\x3b\xbd\xaf\x8f\xdc\xa3\x6a\xf0\x85\x79\x3b\x60\x77\x7d\x5a\xb4\x81\x4a\x2d\x62\x4c\x9c\x11\x19\xed\xdc\xe2\x59\x3a\x33\xe7\x79\x17\xf4\x7f\xdc\x61\x9e\xaf\xba\xaa\xea\xcf\x3c\x10\x2b\x94\x66\x2c\x8a\xdb\xd1\x69\x35\x19\x39\x59\xb2\xe1\x02\xc8\x68\x1a\xe7\xff\x11\xce\x05\x97\xb4\x6b\xf9\x2c\x1c\x81\xb5\x77\x49\xbb\x26\xb0\x0b\x74\x6c\x76\x96\x2d\xe0\x4b\xda\x4d\xb2\x1e\x7e\x16\x14\x02\x33\x29\x5f\x3f\xdd\x4b\xfe\xad\x83\xa8\x2f\xea\xff\xa7\xc3\xfc\x5a\xc7\x74\x7c\x81\x2b\xbf\x01\xdb\x04\x85\x63\x9a\x1d\xc8\x96\xcf\x59\x81\xc1\x5e\x36\x28\x7f\x38\x6b\x0c\xe7\x99\x40\x00\x55\x5d\xe6\x5f\xa2\x43\xc6\x49\xcf\xa5\x7d\xf0\xef\x29\x77\xd4\x5f\x9a\x2a\xbb\x46\xb7\x28\x24\x0e\x9a\xc6\xd4\x25\x71\x3c\x82\x55\x68\x39\x81\x27\xec\x9b\x4b\xc6\xb4\xc7\x36\x28\x3f\x52\x9f\x7b\xb2\xc6\xd9\xe8\x7d\x38\x0b\xa8\xcd\x30\x4e\x3c\x38\x7d\x3a\xb6\xa0\x02\xe8\xcb\x44\x95\xed\xd8\xc2\x3d\x0a\x00\xbb\x3e\x23\xb0\x41\xb7\x91\x2a\x20\xab\x15\x34\x9f\xc7\x79\x80\x7e\x88\xa0\xca\x99\x2c\x46\x10\xd2\x52\x74\x70\x8f\xc7\x30\x3f\x67\x41\xb8\xd3\x82\x50\xe2\x94\x46\xb0\xee\xa2\xb3\x6c\x39\xb8\x34\x8e\xef\xed\x16\x3c\x97\x66\x8d\xa9\x48\x62\xc8\xd3\x5d\x81\x77\x8b\x15\xf2\x65\x41\x65\x42\x2a\xab\x1c\x7a\xfd\xb2\x49\xdc\x12\xb9\x64\xcc\x5b\x61\x9e\x1d\x72\xa3\xa1\x90\x9d\x10\x8d\xdb\xc1\x83\x51\x5f\x81\x73\xa5\x37\x9f\xb4\xd2\xbe\x2b\x43\xae\x67\x9b\xbe\x57\x0e\xa7\x81\xd8\x15\xe8\xaf\xcd\x44\x24\xd0\xef\x69\xa7\x13\xb7\x2a\x1c\x6e\xc4\x7b\xe2\x9c\x14\xcf\x87\xac\x31\x3c\x1b\x52\x3f\xf1\x4c\xc9\x0a\x02\x1a\x70\x9d\x27\x6a\x6b\x1e\x02\xf6\x46\xf9\xb6\x8a\xae\xe7\x73\x15\x8a\x3d\x33\x3c\x39\xae\xdc\x87\x94\x38\x3c\xa0\xa8\x20\xec\xb2\x2b\x6c\x38\x4a\x10\x3c\x34\x6b\x9c\x56\xea\x12\xe1\x87\x45\x6c\xcd\x28\x31\xc2\x20\x0c\xcf\xee\x9d\x82\xc0\x16\x48\x67\x5e\x36\x24\x83\xf1\xe5\x04\x99\xf5\x6d\x1b\x48\xad\x15\xa4\x3f\xdd\x61\x7e\xb3\x63\x38\xfd\x26\x47\xb0\x0c\xcf\x2f\x50\xf6\x51\xd1\x16\x5b\x02\x7a\x02\xbb\x72\xbe\xe2\xc5\xf3\x91\xe8\xe1\x5d\x1b\x89\x0c\x0a\x39\x22\xd8\x82\x92\xd8\x09\xef\x91\xd0\x87\x40\x02\xe5\x80\x0a\xf2\x87\x78\x3d\xe1\x75\xc2\x29\x47\xb6\x74\x06\xe3\xd9\xdb\x5c\xc5\x93\x4b\x56\x1a\xf3\x07\x6c\xc1\x2e\x81\x12\x12\x81\x49\xe3\x36\xf4\xa9\x59\x3c\xe3\x11\x92\x13\x21\x52\xaa\xc6\xd5\x64\x5d\x85\x78\xe0\x13\x96\x77\xc5\xcb\x8d\x9f\x17\xe2\x56\xb1\x11\x93\x16\xf6\xc8\x05\xda\x72\x97\xe2\x27\xf8\xcc\x16\x2a\x19\x6b\xe0\xb4\x68\x20\x9b\x3c\x52\x57\x8b\x57\x47\xd4\x54\x88\x5f\x49\xd9\xce\xcd\xd9\x4f\x5e\xda\xac\xaa\x83\x52\x7d\x48\x23\xd7\x89\xa7\xa3\xf8\xb5\x9a\xf9\x7a\xed\xb0\x7a\x49\x6a\xa5\x73\xde\x62\x52\x11\x04\xdc\x49\x51\x2a\x62\x41\x22\xd5\x0b\x76\x80\x8b\x42\x5c\xf6\xc7\x3d\x23\x85\xa9\x31\x0e\x0b\x86\xad\x17\x56\x69\xd2\x35\x1d\xae\xa8\xcd\xfd\x7b\x4d\x78\x77\xfd\xa5\x66\x7e\x59\x3b\x5d\x41\x8d\xa9\xda\x8b\xb2\x06\x30\x34\xe3\xf3\xf7\x6c\x99\x9d\x23\x5f\x54\xb6\x1c\x98\x24\x9c\x24\xd2\x67\xd8\xf3\x56\x91\x8a\xce\x4a\xe8\x85\x7d\x02\x4c\x34\x95\x27\xcc\x4a\x97\x32\x65\x64\xb8\xde\x9c\x28\x22\xed\x69\xcf\x2f\x5a\xae\x88\xe9\xc3\x85\xa7\xed\x57\x9c\x2f\xbf\xbd\x91\x5c\xcf\xa7\x5f\x94\x83\x51\xff\xd3\x8d\xb5\xc3\xa5\xd6\xd3\x72\xac\x19\xea\x44\x85\x98\x3f\xb1\xf1\x54\xa2\x54\xa3\x40\xf3\x40\x65\x92\x3b\xa2\x07\x61\x41\xd5\xe9\x26\x25\x96\xe0\x8d\x08\x75\x93\x6d\x97\x20\xb7\x99\x66\xca\x03\xcd\x64\x8d\x64\x9b\xc1\x41\x97\x0d\x36\x67\xfe\x0b\x7c\x55\x82\xe8\x9e\x23\x68\x7f\xd0\x6d\x2e\x5d\x3c\xa5\x90\xf8\x16\x63\xa3\x67\x1c\x99\x35\xd1\xcf\xfc\x20\xc7\x76\x09\x61\xe0\xe2\xbb\x88\x3d\x6b\x50\x1b\xbe\x45\x34\x14\x2e\x47\xf9\x8a\x44\xcb\xc0\x8a\x55\x76\x9c\xe8\x99\xee\xb8\x2d\x91\x4b\x87\x15\xc0\x80\xf1\xfd\x1c\x1c\x21\xe2\x16\x56\x3c\x53\x80\x10\xcb\x3d\xe2\xe0\xac\x52\x11\x05\x00\x01\x34\x29\x11\x8c\xa7\xdb\xb1\x2f\xb0\x6d\x7a\x94\x96\x1c\x6f\x89\x6d\xe9\x53\x9e\xe3\xcc\x58\xf9\x0b\xf0\xbe\x31\xe9\x15\x26\x7d\xef\xe2\x52\x14\xcb\x87\x17\xd7\x13\x99\x1c\x53\x3e\x39\x6b\x3c\x18\x50\x75\x68\x64\xa2\x45\x70\x79\xb5\x13\x73\x54\x30\x81\xfa\x6d\xb7\x4f\x26\x99\xa7\x6e\x01\x90\x65\x7e\x5e\x08\x2e\xd8\xa5\xf4\x05\xc5\xc4\x67\xe4\x38\x1f\xca\xf0\x42\x89\x2d\x08\x0e\x17\x80\xce\x27\x26\x5e\x94\x97\x32\x1a\x0b\xba\x40\xfd\xa5\x70\x0e\xc8\xfa\xdf\xde\x40\x36\xfa\x65\x87\x06\xfa\x5f\x6d\x30\x7f\x6c\xc3\x14\xfb\xa9\x68\x99\x90\xa9\x4a\xd1\x1f\x59\x73\x78\xa2\x50\xa1\x60\x0e\x28\x48\x54\x50\xb1\x35\x43\xe0\x72\x9e\xda\xff\x74\xfa\x8d\x38\x03\xa9\xcd\xa7\xb8\x1d\xcf\x98\x73\x96\xbb\x74\xce\x60\x0d\xca\x1a\x47\xbd\x45\x0a\x22\xd9\x16\x1b\x22\x38\xe7\xfa\x9c\x66\x1a\x6b\xc9\x72\x43\x94\x0a\x1d\x9b\xaa\x27\xca\x61\x8d\xbb\x20\x3c\x4b\xe5\xb8\x4f\xa3\x04\xd3\x10\x5a\x9e\x1b\x43\x79\xd7\xa9\x58\x16\x30\x22\x22\xc8\x87\x29\x4b\xec\x43\x38\x71\x3d\xa4\xce\x92\x51\xb0\x03\x6b\xc6\x89\x8a\xe4\xf1\xb7\xfb\x2e\xa3\x95\x16\xe8\x7d\x6c\xdb\xce\xc7\x0e\xaa\x72\x76\xc8\x03\x23\xdb\x39\xab\x0e\x0c\x23\x89\x6d\x52\xad\x27\xf5\x81\xe8\xd0\xae\xee\x5a\x47\xc9\x61\x32\x5a\xdb\x26\x51\xeb\x44\xc3\x06\xee\xac\x1d\xce\x9d\x92\x93\x87\xfc\xb4\x46\x12\x07\x0d\xfd\x35\x1a\x19\x5b\x7e\xc9\x51\xcb\x95\x92\xcc\x43\xea\x5f\x89\x4d\x33\xf4\x0c\x71\x54\x84\xc4\xee\x52\x49\xe6\x7b\x54\x24\xff\xc9\xbb\x36\x93\x6b\x60\xe6\x89\xad\xf8\xf5\x9b\xcd\xff\xde\xa4\x5c\x48\x96\x39\x47\x0d\x13\x56\x8d\xc9\x75\x1c\x9e\x00\x41\x95\x83\x6e\xde\x9b\xe7\x4e\xce\x7c\x78\xb2\xc6\x70\xf5\xfe\x6b\x8e\x5d\xb4\xf2\x21\x07\xe1\xc7\x5e\x54\xb6\x17\x2c\x87\xba\xa1\x99\x25\xa4\xdf\x80\x5b\x43\x52\x39\x8f\xce\x15\x91\x50\xb1\x43\x83\xb2\x27\x9c\x25\xb9\x60\x2c\x45\x03\xf3\x61\xd9\x24\x58\xa3\x36\x13\x95\x91\xd4\x0b\xe2\xac\x16\x05\xfe\x06\x3b\x32\x59\xa5\x52\x30\xb0\x30\xd8\x17\xfd\x80\x03\x54\x9f\x48\xbe\x14\x52\x17\xf4\xa5\xf8\xfa\x4c\x39\x94\xdd\xc0\xdb\x15\x25\x02\x3a\x1f\x39\xa7\x07\x43\x2f\x34\x59\x61\xe6\xa3\xac\xd0\x08\x7b\x63\x57\x17\x06\xd9\x35\x29\x3a\x86\x8c\x17\x9a\x4a\xf3\xcc\x47\xcf\xf7\x29\x5f\x1d\x7a\x89\x26\x19\xf0\x5d\x95\x0d\x12\xbb\x96\x58\xa7\x29\x3b\x17\xef\x57\xd9\xcf\xd5\x9d\x6b\xcf\x46\xfd\xc1\x7d\x0f\x05\xce\xe3\x70\xd5\xd3\x76\xa1\x5b\x83\x3e\xa0\xb7\xf3\x0e\xe3\x10\x2f\x68\x8d\xdc\xe7\xde\xf3\x23\xc5\x72\xc5\xbb\x1f\x2c\x2a\x6b\xae\xfb\x79\xa4\xb2\x05\xea\x8b\xb4\x74\xe2\x45\x6e\x08\x49\x1d\x93\x44\x40\x24\x65\x19\xa8\x2a\xd9\x37\xb6\x92\x67\x31\x2d\x2e\x28\x59\x79\x99\x19\x5b\xff\x9d\xad\x6d\xd0\xca\x5e\xb1\xf5\x64\x65\xc1\xcd\x28\x66\x20\x4e\xa3\x3d\x5f\x6a\x69\x31\xb6\xc1\xb5\x4e\x28\x56\x1c\x6a\xac\xb0\xbe\x52\x34\x9e\xd0\xf0\xec\x30\xa0\xce\x2c\x07\x25\x65\x49\xfc\xf0\x2b\x15\x3f\x9e\x48\x67\xd6\xf3\xe7\x79\xed\xe2\xcc\x24\x21\xb4\x48\x45\xa8\x28\x39\x90\xf3\x36\xda\xef\x82\xbc\x57\x52\xa8\x2d\x7d\x4c\xbc\xf0\x2d\x87\xe9\x23\x41\xc5\x80\x25\xe6\x75\xad\xae\x89\x7c\xbb\x58\x27\x7a\x81\xda\x1b\x42\x97\xaa\xb4\x4b\x9b\x7e\xd9\x85\x00\x87\x26\xd3\xea\xcc\x9d\x5c\x2c\x0e\x9a\x07\x0c\x20\xbc\xf3\xf4\xb6\xb4\x32\x99\x75\x20\x22\x89\x04\x43\x86\x59\x35\x41\xcc\x21\xe3\x25\xc4\x30\x4c\xe8\xb0\xb1\x8b\x25\x9f\xc2\x86\x12\x98\x43\xc6\x0b\x89\x61\x18\x70\x97\xfd\x67\x5e\xa0\x4b\xe6\x90\xd2\x84\xbe\xe8\x46\x94\xcb\x9a\xdd\x85\x2c\xd6\xf1\x2d\x2e\xc8\x65\x59\x70\x6d\xa7\xbc\x6d\xb0\xb6\x8b\xdf\x8f\xc2\xff\x5f\x46\xd8\xaf\x97\x11\x32\x3e\x0b\x7e\x63\xd4\x2a\xf0\x2f\xb3\xf8\xaa\x80\x35\xbc\xfc\xbe\x4c\xb3\xef\x9b\xd4\x5d\xb0\x7d\xcf\x65\x8b\x99\x77\x67\xc9\xf7\x0a\xbc\x47\x83\x10\x78\x65\xe6\x81\xd5\xeb\x56\xb5\x35\xa9\x3d\xdb\xa8\x5b\xa1\xf5\x4a\xcf\x46\xdf\x90\xde\xbf\xd3\x94\x36\x65\x6a\x60\x7a\xdc\x82\x4d\x17\x07\x84\xe3\x40\x3f\xeb\xbf\x7e\xd1\xd5\x03\xe2\xc4\x20\x5d\x13\xa3\x10\x42\xac\x3b\x79\x30\xca\xa8\xbb\x82\x58\x88\xb5\xa8\x85\xff\xdf\x2d\x89\xf0\x32\x33\x70\xb0\x58\x18\xcc\x8e\xf8\x9e\x3b\xe1\xcd\x80\x1d\xec\x8b\x5b\xcc\x1e\xe5\xef\xd4\x3c\x13\xbe\xe7\x1a\x8f\x7b\x33\x35\x6c\x60\xbf\xb0\x19\x6d\x60\x97\x6b\x03\xcb\x47\x26\xb0\x87\xcd\xdb\xed\xc8\x00\x26\xd1\x32\x6f\xd6\x10\x43\x94\xd4\xa1\xfb\xc9\x0e\xd2\x53\x53\xd3\xad\x1c\x6e\x34\x4e\x5d\x86\x71\xea\x8b\xaa\x71\xea\x33\x97\x69\x9c\xfa\x91\x2b\x64\x9b\x8a\x2a\x5a\xb6\x61\x0a\xa6\x52\x1c\x9c\x23\x16\x17\x95\x86\xa9\x5f\xd9\x48\x76\x29\x53\x70\xd6\xf1\x16\x85\x4b\x92\xe4\x95\x1d\x76\xbc\xc5\x69\x58\xac\x31\xcd\xeb\xe5\x1b\xcd\xa1\x94\xeb\x0a\x62\xa0\x10\x40\x38\x4b\x3e\x7e\x3c\x49\x1e\xfd\xe5\x0d\xe4\x23\xe9\xe1\xe0\xdf\x7e\x19\xfe\xb2\x8f\x9c\xaf\x2e\xf0\xbc\x5c\xa3\x97\x1b\x2b\xbe\x18\x73\xcc\x1e\x31\x4f\x9d\x17\xbf\xcf\xf3\xd5\x39\xd7\xc6\x44\x0a\x8e\x24\x99\xcd\x98\x0f\x9e\xe7\x3f\x45\x35\xe5\xf6\xa7\x55\x98\x95\x1c\x34\xf6\x55\xfc\xe7\xf9\xcb\xcb\xaa\x90\x0a\xac\x8e\x08\x4a\xd9\x01\x33\x7b\x9e\xfd\x38\xdf\x20\x09\x42\x6a\x21\x3f\xba\x91\xf4\x28\x33\x57\x40\xc7\xd1\xa4\x15\xa7\xec\x28\xd3\xa1\xfe\xb5\x0d\xe6\x9b\xb4\x8a\x8b\x89\x6d\x0e\x52\x51\x45\x99\x1e\xe3\xb9\xcb\x61\x50\x61\x58\x8a\x5c\x09\xc0\x88\xc7\x2b\x84\x3e\xe6\x29\xd7\xc1\x84\x92\x35\xc6\xa5\x03\x9f\x12\x45\x92\x7b\x4f\x0a\x8b\x1d\xaf\xb6\x82\x80\xfe\x89\x0e\xf2\x61\x70\x73\x0c\xe7\x26\xe1\x61\xfd\xdd\x19\xf3\xcd\x99\xf8\xef\x44\x54\xca\xa8\xbc\x88\x5b\xaa\xb6\x1e\xac\x55\x02\x93\x1c\x0f\x63\xa3\x47\x14\x2d\xf5\x7c\xef\xf9\xac\x71\xda\xb7\x6c\xc0\xa6\x02\xc7\x0a\xe6\x04\x0e\x11\xfa\xf6\xfc\x7c\x94\xd1\x77\x41\x62\x48\x55\xd5\x0a\x36\x2c\x54\xca\xae\x67\x09\x19\x13\x5a\xd1\x90\x71\x7e\x60\xd6\xf3\xce\x8b\x53\x20\x18\x1b\xc4\xa5\x3e\xfe\xff\x81\xf3\xb0\xa9\xf3\xdf\x33\x96\x7f\x3e\xf9\x06\x1c\x09\xe2\xb7\x0a\xe7\x99\xb2\x7a\x1e\x82\x6c\xb2\xa7\xd4\x19\xf0\x84\x1a\xa0\x74\xd1\xb4\xa1\xd9\x8a\x7b\x4e\x1f\x1f\x38\x5e\x9a\xd2\x43\x0a\x64\x1e\x7d\x99\xe8\xe2\x08\x55\xb1\x1c\x47\xf6\x26\x84\x24\x85\xee\x89\xea\x4a\x72\x7f\xbf\xb5\x95\x0c\xd6\x9e\x87\x93\x5e\x61\xd4\x0e\xfc\x32\xe0\xc8\xb9\x72\xa1\x48\x43\xf0\x69\xfe\xf0\x56\x33\x57\xe3\x1e\x5f\xde\x15\xc1\x6d\x00\x92\xae\x7c\xba\x22\xc6\xf8\x16\xf2\xdd\x0c\xb9\x7e\xde\xba\xf8\xa0\x6b\x2d\x58\xb6\xc3\x26\xab\xfe\xcd\x4c\xb3\xf1\x6d\xca\xa1\xed\x64\x6d\x37\x0c\x42\x3f\x3b\xee\x86\xa7\xfc\x69\xe8\x66\xf3\x9d\x99\x61\xd7\xa0\x0b\x76\x5e\x52\x11\x05\x82\xc5\x3a\x2a\xe4\xee\x25\x66\xb2\x56\x93\x2f\x09\xae\x18\xf3\x05\x63\x46\x5a\xb2\x29\x22\xd8\xc9\x87\x0d\x4b\x9a\x78\xa3\x5a\xfa\x0c\x3b\x4b\xb3\x1c\x5f\xb1\x5d\xc3\x9a\x09\x54\x1e\x38\x3c\x45\x0b\x3c\xa5\x50\xe2\x10\x0a\x34\x42\xcb\x95\x90\x70\x34\x8e\x6e\x68\xf9\x4b\xb2\xf4\x00\x20\x74\xce\x02\x60\x93\x60\x67\xec\x9e\x6b\xa5\x30\x1d\x25\xda\xce\x8f\xa7\xf3\xb6\x3b\x2c\xbf\x33\x4b\x7e\x37\x43\xae\x55\x2f\xe9\x9f\xb8\xec\x0e\xff\x57\xad\x6e\x87\x3b\xd4\x82\x1e\x57\xdb\x51\xb7\xbf\xf9\xd9\x2e\x8c\x8c\xff\xcd\xf7\x3b\xd8\x1f\xea\xf4\xbd\x31\xed\x81\xfc\x13\xfd\x0f\x07\xc9\xe5\x77\xbf\x39\xb8\x73\xe7\xdd\x66\x96\x5c\xea\x20\x5b\xa2\x46\xeb\x6f\xe8\x68\x03\xa4\xf3\xae\x0c\xfc\x6d\xbc\xa8\x4c\xfd\x25\xf0\xd3\xe1\xfd\xc4\x4f\xcf\x71\x7b\x80\xe1\x0a\x0c\x33\xc9\xc7\x2d\xc8\xa5\x66\xcc\xf0\xb5\x16\x19\xab\xe4\xe1\x98\xff\x60\xb2\x95\xe7\xdc\x30\x86\xa5\x4f\x44\xf4\x48\xf7\x4b\x5e\xd6\x23\x48\x27\xc9\x87\xa3\x43\x20\xf7\xda\x17\x6a\x77\x10\x29\x99\x6a\x42\x30\xfe\x22\xb8\x11\x39\x8e\xa8\x68\xdc\x15\xbb\x0f\x47\x09\xab\xaa\x15\x87\x79\x07\xac\x7a\xe2\xad\x68\x3c\xe5\x29\x3e\xfb\xb4\xd6\x53\x3f\xb4\x23\xd1\xb7\xf8\xb4\xe4\x58\x79\x4a\xc8\x87\x37\x54\x66\xc7\xa9\x91\xb1\x65\x5c\xfa\xa7\xe8\x3f\xe8\x30\x0f\x57\x5e\x4c\xec\xb9\x60\x8f\xe5\xcc\x24\xee\x15\xef\x28\x1f\xa1\x26\x70\x49\x8b\x7e\xfa\xce\x0e\xb2\x5f\x58\xa2\x07\xcd\xbb\xdc\x94\x38\xa3\xec\x37\x67\x11\x2b\x69\x60\xc4\xde\xf1\xcd\x8c\x32\xd9\xbe\x9c\x69\xc3\x64\x7b\x5d\x26\x50\x2c\xae\x5c\x63\x62\x55\xf5\x53\x37\xef\x15\x98\x42\xe9\xf9\xf3\x5c\x94\xcb\x81\x8e\xfb\xbe\x02\x4a\x90\xaa\x9b\xda\x7e\xe3\xac\xd8\xe0\xfa\x84\x67\x2b\x30\x61\x78\x98\x06\x57\x0d\x47\x20\x43\x06\x44\x87\x6b\xfe\x7e\x10\xd1\x3e\x24\x96\x21\xe3\x12\xcb\x07\xf2\x5e\x09\xfc\x28\xa1\x2a\xc1\x56\x7e\xbc\x2c\x1c\x72\xf8\x53\x60\xcf\x8f\x54\xa2\xc8\xdc\x51\xe4\x41\xc6\x45\x39\x59\xf2\x9a\x2d\x89\x73\x45\xc4\xbc\x3c\xc2\x81\xc6\xd9\xa0\x46\xc0\xf8\x3f\xda\x6c\xbe\x2e\x19\x30\x5e\xbe\xd1\x64\xa8\xf8\xac\xf2\x46\x3b\xc2\xc5\xff\x7f\xec\xbd\x0b\x94\x25\x59\x59\x26\xba\xe2\x64\x56\x55\xd6\xee\x87\x74\xc0\xc0\x2c\x70\x60\x1b\xcd\x58\x99\x90\x27\x2a\xb3\xb2\xaa\xba\x3b\x9b\xa6\xc9\xce\xac\xea\x4e\xba\x1e\x49\x66\x56\x37\x74\xd3\x90\x71\xce\xd9\x79\x32\xa8\x38\x11\x87\x88\x38\x95\x75\x9a\xee\xb9\x02\x32\x20\xf2\x94\x77\x31\x88\x30\x5e\xd4\x06\x01\x75\x68\x75\x8d\xa8\x3c\xbc\x3a\xea\x28\x17\x14\xf5\xaa\x80\x20\xea\x20\x73\xf5\xfa\x40\x6d\x07\xbd\x6b\xff\xff\xbf\x77\xec\x1d\x27\x4e\x66\x76\x67\x75\xb7\xcb\xc9\x5e\x0b\x2a\x4f\x3c\x76\xec\xe7\xbf\xff\xfd\x3f\xbe\xef\xa0\xce\x59\xbc\xe4\x00\xec\xba\x35\x09\x3f\xb0\x9f\xbd\xa3\xc6\x5c\xfd\x8c\x36\x21\xbb\xff\xe4\x78\x7f\xe9\x9c\x18\xb8\x6e\xce\x51\xbc\x80\x2e\x6a\x95\x9e\x52\x54\xbe\xc8\xf5\x5c\x24\x83\x8b\x46\xc9\x80\xe5\x8e\x36\x60\xf5\x85\xe2\x03\x2d\xc3\x8c\x9e\x2b\xec\x8f\xe2\x73\x04\x11\xdf\x48\x7a\x71\x8b\x2f\xdd\x31\xff\xb0\x60\xbb\xdb\xaa\x76\x06\x52\x36\xfa\xe6\xeb\x41\xbd\x9b\xb4\x4a\xda\x19\xc2\xd4\xbf\xc2\x8b\x41\xdb\xa6\x96\x97\x87\x07\x35\xc8\x47\xab\x16\x9f\x37\x75\xc4\x5f\x72\xbc\x07\x9d\x2d\xa1\xe9\x07\x2a\x87\x1a\xbb\x02\xd4\xc7\xb4\x4e\x45\x45\xc8\xbb\x22\x25\xdf\x64\xe6\x0f\x42\xe2\x5f\xe6\x36\x19\x2a\xe7\x87\x1d\x56\x4c\x4b\xf7\x7d\x8e\xf7\x66\x7b\xa6\xa9\xae\xd6\x36\x1c\x90\x88\x30\xd1\xd4\xd1\xb3\x68\xa8\x62\x8e\x79\xd4\x86\xe0\x8d\x57\xb3\x53\x85\x28\x28\x1c\x46\x75\x29\x4c\x31\x87\x4f\x8b\x56\xeb\x81\x21\x4e\x5e\xf7\xe7\xae\xf2\xee\xac\xb8\x5e\x2c\xa2\x7c\x43\xd8\x80\xdb\x09\xef\x04\x10\xef\xb1\x7a\x6a\x45\x3e\x16\x93\xad\x54\x1b\xca\x95\x53\xc3\x5a\xdc\xbf\x75\x25\xfb\xab\x31\x36\xd2\x4b\x23\xf7\x1b\x63\xde\x1f\x8c\xf5\xd2\xc8\xc0\x09\x8b\x12\x9b\xcd\x53\x87\xc5\x84\x71\x21\xe0\xcf\x2d\x9f\x42\xb9\x3f\xbe\x06\xf6\x4e\x31\x7b\xf8\xb0\x3c\x89\xcc\x4a\x41\x74\x58\xce\xfc\xb5\x09\x1f\x7d\xbc\x05\x2e\xfa\x5a\x2f\x8d\xf0\xd8\x93\x21\x69\xf2\x5a\xc1\xee\xad\xa1\xd1\x19\x5b\xdd\x10\x7c\x4d\x16\xb6\x66\x43\x91\x12\x9e\x40\xc0\xe9\x6d\x9d\x87\x6c\xe3\xa4\xde\x08\x11\x7f\xf2\x42\xf1\x19\x92\x30\xe8\x94\xc0\x68\x0d\xe4\x8e\x0e\xdb\x1b\x14\xf5\x90\x01\x52\x18\xf8\x29\x35\x51\xf2\xc2\x99\x15\x68\x75\x22\xb7\x73\x35\xa8\x19\x1f\xc7\xc8\x2e\x00\xc3\x2b\x06\x7b\x4d\x05\x51\x50\x59\x3c\x8c\xeb\xca\xff\x24\x0b\x0a\xb2\x52\xec\x51\xc0\xa3\xa0\x2f\xd0\xe2\x19\x26\x11\x74\xfa\x84\xaf\x9a\xae\xc3\x7a\xe5\x93\x31\x5f\x5c\x92\x1b\x21\xc0\x3d\x31\xb6\x04\xc4\xee\xb2\x5b\x68\xf6\x23\xad\xfc\x9a\x1c\xba\x08\x5f\x97\xbd\x3c\x7d\xe4\x3a\x7f\xca\x9f\xf2\xa7\xd7\x10\xf1\x88\x4a\x0e\x33\x9e\x86\xd9\xf9\x3e\xef\xc5\x00\x1c\x21\xb5\xdb\x5c\x4e\xa3\xb6\x9c\xe8\x10\xbe\x52\x78\xbd\x8c\x10\xe6\x24\x06\xa5\x0b\x28\x99\x49\xcd\x93\xcf\xc8\x2d\x5a\xf5\x81\x72\x01\x40\xb7\xaa\x58\x5e\x98\xa2\x46\xac\xa1\x19\x05\xbb\xd2\x83\x60\x02\xc0\xfc\x46\x7d\x35\x0a\xcf\x8b\xa8\x4f\xf2\x29\x4e\xe2\xba\x9c\x51\x52\xad\x47\x1d\x7e\x12\x26\x83\x08\x32\x78\x24\xef\xa5\x31\xef\x75\x31\x9e\x05\xb2\x8e\x08\x2b\x17\x67\x11\x4e\x4d\x3d\xc9\x3c\x58\xfd\xde\x8d\x98\x3f\xba\x7c\x4a\xdd\x68\x87\xb4\x62\x3c\x25\x1e\x20\x83\x0f\x4d\x03\x06\xb6\x11\x45\x86\x41\x8c\x2a\xb8\x7a\x29\x08\x3a\x88\xfb\xca\x74\xad\x24\xa7\x3c\x86\x40\xa5\xce\x2d\x9f\xf2\xf9\x8b\x08\xd0\x4a\x4d\x4c\x45\xc0\x21\xf5\x1c\xe8\xbf\xb4\x11\xe6\xa9\x3c\x4b\x28\xe8\xbe\x52\x44\xda\xba\x79\x18\x0c\x8a\x30\x1e\xad\x7e\xca\xfa\xe6\xb9\xdc\x3f\xe9\x75\xf9\xa9\x00\x59\x24\x92\x94\x37\x82\x2c\x6c\x42\x1e\x3a\x41\x57\xc9\x1b\xb3\xf2\xf3\x9b\x49\xda\x7a\x9e\xa7\x7d\x96\x94\x8d\xc6\x4f\xa6\x41\x1b\x1d\xf9\xe3\xde\xb5\xbe\xef\x7b\x13\xd0\x76\x3c\x70\x14\xc8\x4d\x7c\xdc\xbb\x99\xee\xa6\xc2\x2c\x61\x92\xc2\xe4\x2c\xcb\xd6\x67\x1c\x36\xd6\x0c\x6e\xe9\xc5\x2d\x79\x9c\x74\xdc\xd1\x46\x3f\x17\xde\x07\x1d\x75\x0d\x0f\xaa\x4b\x27\x4e\x73\xa5\x5a\xce\xcf\xf1\x06\xde\xc2\x89\x55\xd6\xce\x8c\xc4\x72\xdd\x5b\x87\xb4\x3a\x68\x66\x03\x52\x92\x9a\x12\x33\x93\x0a\x89\x22\x4f\xe5\x1c\x48\x93\x24\xcf\x54\xdc\x74\x31\x9b\xe1\x40\x9f\x95\xec\x73\xef\x54\xb8\x2d\x4d\xe1\xbe\xbe\xc6\xee\x1c\xa6\x60\x3f\xcc\x0d\x81\x78\xe4\x0b\xf4\xae\x8f\x3a\x4a\xce\x11\x52\x74\x89\xc7\x44\xdd\x1d\x0c\x2d\x3f\x81\x11\x8a\xea\x81\x24\xe5\x52\xc2\x57\x89\xda\xc5\x81\xe8\x3d\x25\x53\xe5\x7a\xb0\xe5\x2a\xe8\x65\x31\x48\x0b\x12\xcb\x72\x8e\x69\x19\xeb\xb3\x87\x6a\xec\x8e\x47\xda\x7c\x82\xa6\x07\x50\xb2\x65\x72\xf1\xdc\xa1\xe3\xa7\xdd\xf7\xd7\xbc\xd3\xc3\x6e\xda\x19\x5a\x46\xd0\x75\x47\xe4\x1b\xf2\x80\x28\x3b\xc8\x7e\xb9\x04\x99\xf7\x29\x87\xfd\xbc\xc3\xbe\x23\xe9\x8a\x78\x6e\x69\xf1\x8e\x19\xb4\xe6\xbb\x0f\x38\xec\xee\xcb\x33\xb8\xd8\xba\xe7\xaf\x9c\x3d\x83\x45\x2f\xa5\x49\x37\xf3\x6e\x2f\x7d\x50\x69\x37\x67\xf1\x32\xbf\x30\xa3\x3c\x93\x2a\x8a\x3d\x49\xcd\xf6\xc9\x05\xd9\x4d\x7b\x31\x78\x58\x2f\x3d\xc1\x64\x1e\xdd\xe2\x70\x37\xb7\xb4\xa8\xba\xc1\xfd\xfa\x77\x78\xcf\x37\x7e\x97\x72\x17\xd4\x71\xd3\x88\x14\x92\x9f\x54\x21\x20\x78\x54\xd3\x0a\x78\xcb\xc8\xb6\x91\xbb\x51\x2f\x0a\xd2\x33\xf0\x93\x15\xcf\x68\xd2\x8f\x7d\x17\x44\xda\xb0\xbd\xb7\xbf\x7b\x35\xdb\x60\x0c\x90\x4d\x41\xe9\x77\xef\xf2\x9e\x5b\xfc\xb2\x47\x39\xeb\xb5\xdb\xc8\x19\x8a\x88\xcd\xf0\x85\x32\x73\xe8\x56\xb1\xe9\xbf\x3e\xc2\x5c\xe2\x87\x20\xdf\xf0\x6d\x41\xb6\xe1\x7e\x62\xc4\xfb\x91\x11\xd0\x0e\x82\x6c\xc3\xa6\xd1\xa4\xa7\x95\x97\x69\xd2\xf4\x21\x2b\xbf\x31\xf5\x12\xc6\x0e\x17\x21\x42\x60\xbf\xdd\x4c\xc3\x3c\x17\x3a\x0e\x1f\xc8\xc2\x65\x99\xc2\xe7\x77\x58\xc9\x18\x06\x96\xb9\xa2\x9b\xed\x93\xa3\x32\xf3\x39\x68\xf8\x02\xa2\xcc\xf3\x3e\x02\x69\xa4\x61\x26\xb5\x35\x5c\xac\x9a\x0f\x14\x26\x8a\x61\x00\x94\x9b\x77\x77\x23\xd0\x18\x40\xca\x01\x8d\xa9\xb6\xb0\x49\x14\x89\xcc\x16\x32\x2d\xea\x4b\xfa\x90\xd6\x2d\x53\x99\x17\xf2\xd2\x8c\x08\x5e\x19\xe8\x5d\x0b\x7e\x08\x8e\x7b\xe8\x76\xb0\xc0\x8d\x40\xc2\xa7\xa2\x13\x84\x71\x81\x29\x88\x76\x3b\x08\x0a\x6c\xa7\x41\xab\x07\xb8\x0d\xe6\x70\x7e\xd8\x61\x38\xa3\xdc\x0f\x38\xde\xf7\x3a\xf0\x67\x79\xc6\xa8\x2c\x0d\xa9\xb5\x71\x7c\x62\x1c\xc6\x8d\xc2\xca\x32\xde\x16\xf9\x24\xbc\x30\xc9\x37\x83\xbc\xb9\x31\xa9\xe3\xb3\xd1\x03\x3c\xc9\xbb\x78\x19\x43\xb2\xd5\xbf\x45\x8c\xc2\x24\xad\xc9\xe4\x62\x7f\x62\x8b\xc9\x77\x13\x99\x77\x8e\x79\xe3\xa6\x79\xa7\x1b\xf5\xd2\x20\xb2\xac\x3c\xc6\x54\x2e\x5e\x5f\x65\xc6\x8a\x72\x4f\x7a\xd7\x17\xbf\x0c\xa0\x86\xd0\x5a\xb8\xd6\x4a\x85\x70\xf3\x24\xb7\xcd\xfd\x2d\x72\xc9\xbf\xd8\x3b\x7b\xde\xe0\xc7\x81\xbf\x07\x88\x76\x40\x03\xe6\x87\x4e\x26\xc9\xa1\x81\x07\x8d\xaf\x1e\x5a\x4f\x92\x43\x13\x66\xdd\x7f\xb0\xc6\x2c\xe9\xe0\xbe\xb1\xe6\xfd\xb3\x63\x5e\xd1\x46\x26\xba\x56\xdd\x1f\xdc\x42\x20\xa5\xd5\x21\xd7\x16\x61\x95\x52\x5f\x42\x50\x9e\x2a\x08\x57\x53\x44\x99\x50\xe5\x6f\x12\x3c\x77\x9a\x2a\xbc\xee\x02\x2d\x5e\x79\x08\x63\x0d\x33\x0d\x99\xd8\x98\x20\x93\x40\x32\x19\x7d\x02\x86\x9f\x3e\x2d\xd7\x18\xd9\xb7\x75\xf0\x81\x9c\x7b\xcd\x3c\xe2\xf3\xa7\x16\x31\x22\x64\x3d\x28\x0d\xee\xf7\xd5\xd8\x01\x92\x2a\xee\xb7\x1d\xef\x2f\x1c\x9d\xb4\x44\x93\x44\xa7\x47\xa9\x1b\x83\x5d\x73\x02\xac\xa6\x61\x87\xf2\x20\x0d\x39\x65\xe0\xbc\x12\xd8\xa7\x15\x04\x0a\x4e\x07\x33\xe0\x9d\x48\x78\x34\x18\x6b\x60\xc0\xb1\x52\x20\x8b\xa1\x9a\xce\xf2\x0b\xd3\x7c\x7c\x73\x03\xa8\xe6\x20\x91\x80\x17\x69\x8a\x03\x55\x48\x8b\x3a\x1f\xca\xd0\xbf\x3f\x61\x43\x74\xdc\xcf\x98\x9c\xcb\xed\x04\x50\xc5\x13\x6f\xa5\xf8\x65\x2f\xee\x5c\x51\x42\x19\x31\x7e\x59\x49\x28\x37\x44\x94\xc4\x6d\x98\x23\x34\x7b\x83\x28\x3a\xb4\xd5\x32\xfd\x65\x87\xed\x83\x52\xdd\x4f\x3a\xde\xc7\x9c\xb6\x49\x40\x55\x0c\x03\x85\xc5\xee\x60\x10\xac\x27\x87\x0d\x81\xbf\xeb\x31\x58\x69\x06\x51\x89\x4c\xf3\xfd\xfb\x4d\xf8\x9b\x9d\x5a\x7e\xc9\x3b\x2d\x8f\x01\xee\x1f\xee\xf3\x2e\xce\x95\x6d\xb9\x69\xf1\x00\xc5\xef\xa8\x3b\xb6\xed\x0f\xe3\x99\xe4\xc1\xe5\xbc\xe8\xa3\x8c\xd4\x79\x11\xea\x61\x04\xde\x27\x51\x22\xfa\xf0\x10\xc5\x41\x5d\x72\x46\xce\x8b\xfe\x25\x67\x4c\xbd\x61\xa9\x0d\x9f\x19\x65\x97\x1c\x26\x9f\x70\x7f\xc0\xf1\x8e\xc8\x77\x75\x34\x84\xac\xad\xbc\xa0\xdd\xc9\x45\x00\x60\x91\x24\x6c\x31\xc7\xec\x9c\x14\xea\xbb\xb7\x21\x85\xda\xef\x8e\x9e\x17\x7d\xc6\xde\xe4\x30\x5d\x71\xf7\x95\x8e\x97\xeb\x76\xa7\xa6\x39\xf8\xbc\xe8\x1f\xca\xb0\x17\xa4\xd2\xb8\x11\x76\x95\xad\x43\xa9\xb5\x10\x12\x06\x6a\xaf\xee\x3a\xca\x72\x8b\x27\x39\x84\x6e\x4e\xf2\x13\x17\x43\x79\x38\x07\xbc\x93\x44\x64\x67\x92\x1c\xae\x58\x93\xe1\x07\x6a\x6c\x3f\x16\xe7\xbe\xb6\xe6\x7d\xc3\xa1\x78\x7d\xd2\x11\xe4\x4a\x80\xfd\xd2\x08\xc5\x32\x22\x6c\x55\xdd\xc3\x8c\x2f\x42\xb6\x2c\x7d\x58\xab\x1e\x19\x15\xa1\xb4\x19\x79\x82\x27\x1a\xc5\x8a\x32\xa8\xbe\x49\x6a\x55\x77\x8b\xe2\xa8\x28\x14\xfe\x70\x07\x03\xf6\x22\xd8\xd7\x5a\xbd\x14\x71\xe9\x68\xc0\xc0\x01\x90\xb6\x05\xee\xdb\x5b\xe9\x83\x9f\xa8\xb1\xe3\x25\x24\xaa\x24\x55\x59\x74\x4a\x81\x3f\x93\xc4\x4a\x55\x9e\x53\xb9\xc7\x99\xfb\x90\xe3\xbd\xa2\xf2\x4e\xa1\x58\xe4\x04\x02\xa7\x8b\x2c\x72\x97\x33\xc3\x6f\xb9\x0e\xfb\x72\xac\xd1\x20\xcc\x78\x34\x28\x63\x8e\xca\x80\x0c\x1e\xda\x3d\xac\xc5\x90\xb0\xeb\xc9\x38\x3d\xe5\x5d\x6b\x1a\xa7\xcf\x2d\x9f\x42\xab\x83\x4d\xba\x6f\x76\xc1\x0c\x1b\x95\x5a\x91\xfb\x6c\xef\xe9\x77\x88\xb4\x61\x84\xc7\xa0\xc9\xef\xb6\xd5\xd5\x25\xd0\x9b\xcc\x97\x3e\x3e\xca\x5e\xf8\x88\x8f\xbc\xf6\xa1\x6c\xa5\x90\x79\x84\xe9\xf7\x85\x11\xef\x97\x46\xb6\x79\xa8\x9c\x0b\x03\x1f\x35\xe3\x7a\x0c\x51\x5a\x79\x12\xe4\x05\x54\xa0\x5e\x90\x85\x6e\xbb\xe6\xab\x68\x21\x79\x7a\x23\x8b\x10\x6e\x6d\x08\xea\x65\x95\xe6\x1b\x9e\xac\x67\x71\x71\xb1\x9b\x64\x90\x69\x51\x81\x6a\x54\xc4\x30\x95\x80\xb8\x9f\xc5\x97\xce\xad\x0e\x8c\x7c\x55\x09\x39\x9a\x7e\xcb\x05\xe0\x5c\x20\x5b\x15\x26\xc0\xa2\x8e\x4f\xa1\x5e\x18\x93\x5b\xe0\xc9\x16\x3d\x95\x07\xf1\xbd\x01\x56\xe0\xf0\xd2\xd9\x95\xd5\xc3\x4b\x73\xab\xf3\xb7\x0d\xd4\xa5\xfc\xc1\xc1\x8f\x0c\x14\x6a\x22\x3c\x7e\x8e\x59\x40\xf9\x55\x1e\xd7\xdb\x96\xe6\x56\xf0\x12\xe4\xeb\xb9\xef\x63\xde\xdb\x47\x4a\x17\x75\x86\xb4\xca\x33\xc0\x7b\x85\x8f\x79\x1d\x52\x14\x05\x6f\x85\x29\x6a\xe7\xa0\xf7\x65\x82\xe3\xeb\xa0\x9f\xc1\x2e\xd0\xa2\x80\x81\x66\x10\x35\xe5\xc9\x46\x96\xb2\x20\xb2\x30\x15\xad\x65\xd1\x8d\xc2\x66\x40\x7e\x6c\xe5\x4c\x54\x43\x77\xdb\xd2\x1c\x94\xd9\x87\xe0\x00\xa0\xe3\xb2\xaa\x72\x41\x44\x49\x53\x1e\xd3\xec\xb8\x00\x75\x1b\x5c\xdd\xa1\xc8\x8c\x32\x54\x80\xc1\x7a\x14\x74\xbb\xd0\x1a\xeb\x4d\xea\xd7\x46\x18\x29\x39\xb2\x19\xc6\xad\x64\x73\x92\x67\x49\xb1\xc9\x15\x94\x54\xa9\xaa\x3e\x99\xf7\xe4\x66\x82\x8c\x2e\x79\xd4\x9f\x54\xf6\x70\x42\x59\x0a\xd6\x45\xa6\x80\x01\xb4\xc2\x5a\xf5\x35\x04\x68\x4a\x32\x11\xdb\x66\x94\xbf\xdb\x2f\x8f\xd5\x4f\xb5\x5e\xb9\x13\xde\x50\xb0\x09\x3f\x3e\xa2\x60\x13\xde\x35\xb2\x32\xf4\x31\xed\x4a\xd4\xed\x20\xdc\x01\xe8\x78\x34\x04\x76\x03\x22\x05\xe9\x74\x44\xdc\xa2\xe4\xcd\x22\x17\xdb\xc8\x63\x45\x75\x54\xf5\x39\x66\x30\xa9\x5f\x2d\x08\xe5\xdb\xa2\x26\x6a\xdb\x01\xcb\xb8\xe2\x9a\x96\xca\x96\x3c\x80\xcb\x99\x7e\xaf\x48\x13\x58\x69\x60\x49\x1f\xb8\x3d\x73\x7c\x6a\x8a\x8f\xcb\x59\xb8\x91\xf4\xd2\x09\xc2\x16\xc8\x51\x42\x28\x6b\xb0\xe2\xf7\xc5\x0d\x6f\x96\xd7\x51\x05\x94\x6a\x1c\xef\x75\x67\xf9\x14\x1f\x87\xe8\x95\x38\x29\x0d\x47\x98\xf1\x56\x12\x8b\x09\xdf\x7a\x45\x36\x6a\x96\xcf\x4c\xa9\xd7\xb6\x1a\x46\xf9\x94\xea\x5c\xa9\x1e\x4f\xd8\xd0\x0e\x6f\xad\xb1\x31\x35\x4b\xdd\xef\xad\x79\x3f\xe5\xa8\x5f\xb6\xfe\xdd\x4d\x80\x81\x2e\x88\xec\xb9\x2d\xb2\x22\xbb\x54\x5b\x6d\x69\x8f\x56\x4b\x9e\xcf\xa9\xc0\x1f\xd9\x4b\x14\x7b\x38\x60\xaa\x9c\xe4\x10\xa0\xba\x19\x52\x97\x95\x65\x81\xb2\x0b\xb7\xc2\xac\x19\xa4\x2d\xc5\x04\x07\x36\x10\x73\xd7\x9f\x63\x37\x0f\x0f\x62\xda\x46\x14\x61\x9e\x24\x7b\xab\xc3\xae\x44\x35\x92\x32\x29\xbf\xc7\xf1\x32\xf3\x82\x99\x2c\xa9\x20\x59\x68\xd2\xe2\xfd\x62\x9a\x82\x6d\xd9\x9a\x13\x03\xf3\x81\x9f\x0e\x2e\x62\xb9\xa8\x96\xab\xd2\x6d\xe2\xb7\x7d\xec\x68\x15\x47\x36\x64\x3d\xe9\xad\xb3\x42\xad\x7f\xcf\x3e\xef\x2d\xce\x1c\xa5\x47\x15\x7a\xc7\x2e\x34\x7c\x28\x8a\x88\xab\xb7\x55\xf4\x8b\x87\x6d\x7d\xff\x20\xdc\x40\xeb\x61\xb5\xd6\xff\x95\x11\x88\x92\xd4\x8a\xf5\xa6\xf7\x32\x2b\xba\x02\x0a\xb8\x6c\x0a\xf5\xe4\x70\x6d\xfa\x34\x2b\x2a\xeb\x3e\xcf\x9b\x29\xe3\x46\x60\x13\x77\x7a\x00\x61\xaf\x2b\x94\xf3\x6f\x3b\xde\x57\x9c\xb9\xff\x7d\x55\xf2\x5f\xbc\x8a\xdd\xf9\x28\xa8\x96\x52\x46\xba\x7f\x7c\xa5\xf7\x92\xad\x1f\xd9\x42\xaf\x84\xdb\xdb\xa9\x95\x97\x9c\x27\xc8\xc5\xaf\x14\x08\xa9\x8b\x5f\x72\x5c\x54\x8a\xcc\x8b\xd6\xac\xfe\xef\x57\xb0\x3f\xda\xc7\xae\x89\xcc\x53\x38\x44\x79\xff\xda\x3e\xef\x93\xfb\x06\x2e\x5b\x31\x67\xd5\xfa\x69\x59\x57\xa3\x65\x9b\xa6\x22\xeb\x82\xd4\xcf\x13\x34\x18\x70\x0a\x8b\xf7\xd5\x0c\x5d\x23\x5b\xb3\x2e\x37\xd3\x58\x00\x70\x9c\x81\x91\x8e\x13\x4a\x92\x32\xac\x5d\x3e\x3f\x4d\x33\x23\xc0\x97\xa1\xaa\x40\x51\x66\xa8\xd3\x09\xfc\xe8\x8a\xe6\x5a\xf1\x3c\x85\x38\x6f\x26\x29\x81\x34\xdd\x26\x0f\x3b\x52\xc6\x44\x4b\x49\x6b\x8e\xa4\x33\xb2\xce\x28\x83\x34\xc4\x81\x28\x7d\x3d\xcc\x8c\x6e\xe8\xe8\x5a\xd0\xc2\xc1\x17\xc6\xc1\x4b\xa9\x89\xf8\x8a\xa8\x47\x80\x5f\x9f\x50\x3b\x56\x01\xab\x9b\x89\x34\x0c\x22\x48\xcc\x2a\xd9\x3f\x20\x20\x02\x8b\x4e\xd2\xce\x4e\x91\x00\xf3\x20\x3b\x9f\x1d\x0e\x9a\x4d\x91\x65\xa6\x01\x21\xe8\x86\x87\x71\xb8\x0a\x38\xc0\xf2\x85\xba\xb1\x73\x5d\x0b\x9d\x51\x37\x27\x22\x2e\xe7\x94\x52\x50\x69\x03\xc1\x9e\x2f\x62\xee\x68\x8e\x54\xa9\xf2\x93\x14\x36\x51\x9a\x09\x1a\x8e\x1f\x6f\x1f\x86\x0f\xaf\x59\x4b\x00\x36\xe0\x56\x55\x8e\x20\xb1\x66\x9a\x2b\xfb\x6b\x35\x36\xb0\x38\xdc\xdf\xa8\x79\xbf\x58\x2b\x5f\xbd\xcc\x33\xbc\x2b\x9a\xbe\xd2\x89\x1f\xad\xf9\x8d\x53\xfa\x32\x8d\xc4\xd0\xae\x46\xb8\x72\x08\x91\x05\x58\xee\x24\xe6\xb7\x9e\x58\xb5\x7a\xf9\x7b\xc0\xc5\x55\x96\x37\xee\xff\xa8\x79\xbf\x5f\x1b\xbc\xfe\xa8\xc8\x92\x47\xbb\xaf\x51\x96\x5c\xb6\xde\x2e\xd7\xfa\x11\xcc\xfb\x29\x6b\x08\xbe\x39\x6a\xd1\x5a\x6d\x83\x6f\xee\x7e\x72\xd4\xbb\x4b\xc3\x9a\x23\xd9\x7f\x39\xe2\xab\xc0\xef\x86\xd0\x8e\x58\x88\x16\x61\x20\x6b\x08\x3f\x75\xd3\x87\x62\x4a\x5e\x06\xb5\xd3\x7c\x7e\x84\xc5\x6c\x1f\x10\x71\xb9\xc2\xbb\x61\x2e\xee\x9b\x71\xb6\xe6\x17\x35\x94\x7a\x15\x99\x81\xff\x80\xf3\x9d\xec\xa9\xc3\x37\x71\xf3\xdc\xff\x02\xb6\x1f\x2c\xe0\x99\x7b\xab\xf7\x6c\xa5\x26\x81\xd3\x16\x2f\x13\x53\x07\x41\xbc\x03\x3f\x98\xd4\xd4\xb6\x52\x11\x3e\xea\xb0\x91\x5e\xd8\x72\x3f\xe4\x78\xef\x76\xe6\x28\x73\x8c\x46\x0d\xd9\x6a\x54\x80\x8c\x59\x7a\xd0\x4c\x13\x79\x58\x03\xf6\x6b\x15\x83\xaa\xbe\x8b\x2e\xbd\x16\xe9\xae\x88\x22\x00\xf7\x4c\xe6\x3a\xe5\xb5\x03\x44\x63\x98\x3c\x7d\x9c\x09\x25\xc6\xba\x73\x8b\x0b\xb6\x9f\xf2\xc5\x6c\x4c\x16\x06\xde\xbf\x25\x6f\x5e\x2b\x8b\x18\xc4\x05\xd5\x8f\xfa\x43\x6a\xdd\x49\x28\x56\x3e\x68\xe6\xe1\x05\x1c\x63\xbb\xf4\xff\x35\x62\x83\x71\x9a\xc7\x19\x48\xbe\xcd\x32\x72\xc7\x96\x58\x2e\xdd\x4f\x8f\x78\x8d\x2d\xee\x17\xdb\xa1\x88\x93\x5e\x7b\xa3\x1c\x84\x18\x89\x1c\xe2\x42\xa8\xe2\x7d\x32\x31\x92\x87\x44\x3b\x45\xb4\xf7\x7f\x30\xe8\xfd\x53\x35\xf6\x6e\x87\x3c\x90\x6f\x76\xbc\x57\x3a\x90\x14\xac\x8d\x95\xd8\x9f\x37\x3e\x86\x29\xb7\x9e\x9d\xad\x88\x0e\xdb\x96\x77\xe7\x19\xcb\x1b\x39\xa4\x5e\xd5\x1b\xbf\x1c\xb0\x7a\xbb\x17\xb6\xc4\x61\x83\x2b\xe4\x5a\x58\x06\xe6\xd7\x8e\x5b\x29\xec\xe3\xde\xd3\x20\x18\xa4\xec\xed\xc3\x4f\x5b\x18\x22\x07\x98\x67\x0e\x7f\xb7\x8b\x81\x45\x79\x90\x8b\xf5\x5e\xb4\x22\x80\xb3\xde\xfd\xc4\x01\x6f\xaa\x74\xad\x2a\xd7\xde\x78\x64\x48\xba\xfd\x5b\xf6\xef\xa5\xdb\xef\x36\xdd\xfe\xa4\x4a\xb7\xbf\xc9\x14\x73\x53\xcc\xdf\x82\x41\xb9\x62\x60\xf7\x32\xea\x77\x91\x51\xbf\x68\x24\xd4\x3f\x1c\x22\xa3\xc1\x7c\xfa\x87\x9c\x17\x6d\x9f\xce\x7e\xdc\x3d\xaa\xd3\xd9\xe5\x50\xea\x6c\xf6\xd2\xa2\x2c\x67\xb4\x7f\xed\x2a\x0b\x43\x83\xe2\x91\x40\xb2\xaf\x2c\x2e\xa4\xe1\x05\x91\xba\xbf\x70\x95\xf7\x1b\x35\xfd\x93\x37\x83\x6e\x0e\x06\xf2\x41\x15\x22\xe0\xf3\x0a\x69\x5c\x85\xea\xf0\x45\xa5\x2b\xf0\xf1\xf9\x95\xc5\x09\x95\x2a\xd0\xc2\xc2\x10\x3e\xa9\x80\x97\x55\xa1\xb6\x26\x7d\x4d\x90\xe7\x41\x13\xd9\x46\xe8\x10\x45\x1c\xa0\xbd\x4c\x6d\x66\x89\x46\x13\x6d\x09\xa4\xd0\x12\x3a\xa4\x8c\x5e\x0f\x33\x65\x78\x6a\x61\xe9\x72\x7f\xd9\x59\x09\xdd\xa4\x65\x35\x56\x2a\x48\x19\x05\x13\x53\x56\x51\x12\x63\xda\x83\xcf\x8b\x8e\x52\xf0\x33\x18\xc5\x1a\xd7\xed\xa8\x36\xa9\xd3\x5b\x92\xef\xef\x0f\xee\x49\xbe\xdd\x4a\xbe\x3d\x89\xf5\xc8\x25\xd6\x7b\x46\x0d\x91\xf5\x86\xd1\x9d\xe6\xe5\x5a\x32\x0b\x55\x3c\x40\x01\xf9\xd5\x11\x0d\x03\xa2\x00\xbc\x34\x10\x88\xfe\x0b\xe3\xa4\x0c\xf6\x27\xdb\xce\x39\xbf\xb2\xa8\x04\x45\x41\x16\xa8\x87\x86\x08\xa7\x6f\xe4\x61\x8e\x88\xe3\x0d\x51\xd2\xa6\x35\xe1\x17\xe9\xd9\xb2\xbc\x5b\x45\xbe\x04\xe8\x92\xf2\xdb\xe3\x13\x08\x76\xad\xb1\xc6\xf0\x6b\x68\x0b\xa2\x2f\x43\x49\xca\xee\x73\x7c\xc6\x24\x6f\x4e\x52\x70\xd1\x4c\x62\xb8\x3f\xd2\xd7\xc5\x2d\x39\x13\x74\x06\xb4\x0a\x91\x8c\x7b\x1d\x91\x86\xcd\xe2\x6d\x3e\x7e\x77\x50\xbf\x77\xaa\x7e\xc3\x5c\xfd\xae\x7b\x26\x88\x50\x09\xd1\x05\xc6\xeb\x13\x93\xbc\x95\xe4\x19\x1f\xf7\x27\xc8\xe2\x6d\x94\x91\x29\x68\xed\xc7\x0c\x51\x85\xdd\xc3\x40\x5e\xb9\xe7\xd8\xf4\x50\x0d\xa2\x6a\xef\x58\xe9\x8a\xa6\xc7\x57\x28\x71\xd2\xca\x00\x92\x63\x81\x0f\xf9\x0f\x39\xf7\x6c\xbf\xc3\xcd\xba\xd7\xeb\x1d\x4e\x7d\x0a\xdb\x59\x20\xb7\xa8\xcf\x96\x77\xb9\x4f\x5e\xc9\xea\x46\x4d\x2b\xc2\xa8\x6f\x5b\x5d\x5d\x22\xe6\x6b\x30\x68\x7c\xff\x95\x5e\x52\xba\x56\x60\x86\xe1\x41\x32\xdf\x50\xd0\x0e\x8d\xa0\x79\x5e\xc4\xb0\x8c\x09\xc0\xb2\x97\x46\x15\xb8\x09\xb0\x13\xac\x27\xe9\x26\x7a\x93\x48\xc4\xaa\xb7\x2f\x39\x07\xe8\x4f\x6b\x5b\x78\xe5\x15\xec\x87\x1d\xa6\x6e\xb9\xef\x76\xd8\xec\xd0\x21\xa8\x68\x18\x35\xe0\x16\x7c\xdd\xbb\x8b\xfe\xb0\xf6\x12\x9d\x05\xd0\xd2\xe1\xfd\x85\x30\x4b\xc8\x78\x29\x1f\x24\x1e\x4e\xed\x19\x33\xdb\xe2\xb3\x1f\xac\x51\x98\xc8\x3b\x6a\xde\x6b\x6b\x2a\x50\x04\x91\xbb\x6c\xae\x3a\x15\x34\x12\xc4\x03\x98\x9f\x3e\x9f\x47\xf6\x1d\x79\x64\x05\x34\x62\x75\x4e\x34\x17\x5e\x2b\xcc\x06\xc2\x20\x8b\xb9\x1b\x44\xdc\x93\x9f\xf0\xd4\x71\x1f\x53\x66\x78\xa0\x02\x3b\x40\x20\x2c\x9f\x9c\xe7\x33\x37\x5c\x7f\xdc\x07\xfb\x4f\x36\x90\xb7\x13\xf0\x43\x87\x0f\x15\xb9\xbd\x85\xd7\x10\x92\xc4\xe1\x15\xf8\xf6\x00\x6a\x29\x65\xc8\x43\xb3\x6d\x0a\xa6\x03\x6c\x4c\xbe\xb8\xda\xef\x0a\xf7\xc7\x0e\x78\xef\x3d\xb0\x44\xbf\x0a\xa5\x43\x59\x67\x88\x69\xd4\x5a\x32\xd0\xa5\x6a\x56\x61\xb5\xe1\x65\xf2\x84\x1a\xf0\xf2\x88\x43\x57\x38\x76\x66\xf9\xb3\x14\x36\xea\x69\x03\x46\x51\x07\xf0\x10\x2a\xaa\xcf\x9f\xc5\x11\xdc\xa3\x78\x4e\xa3\x34\x06\xc5\xe3\x84\x6c\x92\x75\xa3\x30\x97\x5d\x09\x1d\x75\xba\x00\x58\x64\x1c\x7c\xc8\xf8\x16\x7e\x80\xec\x48\x8d\x7e\xf1\x67\x90\x85\x40\x08\x69\x3d\x40\x62\x1d\xbd\xf5\x8c\x6b\x6f\x30\x01\xcb\x91\xd9\x0c\x5e\xd1\x9f\x97\x57\x0e\x1d\x3e\xc4\x33\xd1\x0d\xc0\xe5\x24\x4b\xd5\xf0\xa4\x19\x0f\x18\x27\xd4\x52\xc0\x9f\x81\x16\x00\xe8\xf6\x05\x48\x3c\xa2\x28\x35\xaa\x41\x1d\xfc\xc1\xd4\xc2\x64\x9d\xab\xe0\x4a\xc6\x75\x91\x98\x83\x7b\x46\x27\xca\x85\x06\x6f\x93\x6a\x07\x0d\x84\xca\xf6\x0a\xa4\x2a\x40\xd3\x80\x5b\x44\x4f\xea\x85\x30\xb6\xca\x57\x59\xeb\xe8\x58\xc0\xda\x63\x88\xa9\x82\x82\x51\x8d\x12\x99\xbe\x74\xb8\x11\xdc\x8b\x08\xb3\x1a\xc7\x06\xdf\x54\x0f\x34\x82\x7b\x27\x7c\xf6\x2c\xbe\xa8\x0c\x7b\x30\xbf\x94\x7c\x9e\x45\x65\x7d\xeb\x79\x07\xbe\xe2\x2e\xcf\xa5\xd8\x95\x37\x49\xc0\xcc\x47\x41\x96\xf9\xa5\x82\x11\xb1\x15\x72\x0f\x70\xef\x0e\xd0\xf7\x01\xc3\x24\xf4\x04\x96\x3d\x92\xd2\x63\x61\x5e\xf0\x54\x63\xc6\x9e\x42\x9b\x49\x71\x06\x53\x9e\x9b\xd4\x61\x7c\x56\xfe\x1c\x02\xcf\xa0\x96\x0f\x0e\x36\x4a\x62\x57\x4b\x96\xde\xb3\xd2\x8f\xab\xfb\xc2\x5a\xb8\x3f\xcc\x2c\xa6\xc7\x2a\xdc\xaf\xa5\x34\x4c\xd2\x30\xef\x9f\x92\x9b\xab\x85\x0f\x0d\xf6\x91\xaf\x1e\xf4\xce\x6e\xfd\x88\x1d\xfc\x30\xfc\x59\x0d\x37\x5d\x69\x3e\xf9\xff\x0e\xb0\xaf\x9a\x58\x6e\xbf\xbd\x4b\x2c\xb7\x77\x38\x6b\xaa\xac\xb5\x81\xe0\x3d\xfc\xe8\xa1\xec\xb1\x87\x78\xdb\x3b\x29\xed\xf6\xa4\xf4\x06\x4d\x4b\xf6\x2a\xc7\x1b\x5f\x83\x3f\xd7\xec\x39\x48\xe2\xa8\xde\xc5\xb9\x18\x0a\x1b\x9e\xf1\x76\xb6\xc8\x6e\x1d\xaa\x8a\x3c\xbc\x35\xb2\x77\x70\x7b\xe4\x07\xb7\x87\x9c\xd7\x38\xdb\xab\xcf\x0d\x77\x4d\xab\xcf\xe6\xd8\x14\x71\x0f\x25\x65\x7a\x6b\x69\x65\x6b\xd8\x30\xbc\x8c\xbd\xa5\xc6\xc6\x2b\x22\x86\xb4\x4d\x08\x6c\x51\x77\x06\x21\xb0\xe7\x7f\xcd\xf1\xae\xaf\xbc\x83\x03\xbf\x49\x3f\x90\x4f\x00\x5d\x85\xea\x69\xdb\xeb\x74\xc9\x61\x67\x0b\x84\xc1\x05\xef\xba\xd3\x84\x21\x98\x8a\x76\x80\x64\xf1\x9b\x1b\x7d\x33\x3f\x02\x9d\x32\x72\x28\xfb\x22\x57\xc9\xa9\x96\xc0\xbf\x55\x23\x09\xde\xe4\x4d\x8d\x03\x39\xed\x84\xc2\x09\x7c\x58\x05\xfd\xd7\xab\xd8\xb5\x15\x5d\x52\x06\x74\x71\xdf\x76\x95\xf7\x13\x4e\xf9\x2a\x1f\x5f\xba\x63\x42\xad\x03\xb4\xa6\xe9\xc9\x0e\x1e\x34\x92\x6b\x8d\xbe\x22\x36\x8b\x11\xf3\x1f\x80\xb1\x09\xb3\x3a\x88\x92\x76\x42\x88\x8c\x1c\xc8\xe2\x1f\x2e\xb9\x20\x7d\xfb\x70\x57\x57\xaf\x4e\xc8\x16\xd6\x38\xfc\x2d\xdb\x93\xca\x7b\xf6\xab\xc7\xcf\x7e\xf5\x79\x53\xef\xf9\x25\x67\xb7\xf6\xab\x57\x3b\x2b\xff\x02\xf4\x9c\xd7\xd7\xc8\xf2\xf2\xca\x1a\x3b\xb6\x2d\x55\xe7\x00\x4e\x54\x57\x34\xbd\x5f\x76\x00\x27\x51\x2d\x3e\x4d\x78\x51\x98\x63\x0a\xaa\xb0\x58\xe3\x62\x26\x9b\x86\xdd\x4c\x5b\xe5\x97\xb6\x93\x3a\x97\x4d\xb4\x5c\x3b\x78\x89\xbd\xad\xa6\x21\x57\x5f\xb7\x05\x6d\xf1\xf0\xee\x80\x77\xbd\x5f\x77\x28\x3b\xc3\xc8\x95\xca\x0d\xda\x5f\xc3\xd4\xaf\x32\x24\x54\x70\xfe\x40\x3f\xf9\x7c\xa9\x9c\xb9\x8c\x18\x10\x3e\x5f\x56\xc8\x47\x8f\x6e\xaf\x3c\xe4\xbc\x70\xfb\xdd\xff\x98\x3b\x53\x45\xc3\x59\xee\xa0\xb2\xdd\xec\x53\xfb\xd9\x73\xb7\x0b\x65\xae\x8e\xa6\xbb\x85\x12\x26\xdc\x7f\xda\xe7\xbd\xc7\xd9\xe6\xa1\x6d\xb3\x2e\xe8\x1c\x9a\x07\x69\x1b\x92\x0d\x30\x41\xf6\x5c\x97\x72\xd2\x36\xe3\x22\x1f\x23\xe3\xe3\x50\x38\xdd\x84\xbf\xe1\x09\x08\xd4\x83\xd4\xcd\xae\x80\x58\x87\xa8\x3f\x61\x2b\x12\x5f\x18\x65\x1f\xaf\xb1\x83\xfa\x15\xf7\x83\x35\xf6\x9c\x47\x18\xd7\x0d\x11\xe4\xde\x1f\x39\xc5\xf7\xc3\xcc\x8e\x63\x47\x30\x5c\x75\x69\x01\x92\x06\xb6\x0e\xda\x46\x82\x6a\x04\x68\x95\x67\x5b\x1d\x98\x0f\x78\x38\x61\xac\xf3\x4a\x08\x33\x11\x8d\x58\x45\x34\x7e\x75\xc0\xfe\x38\x02\xe0\xc8\xcf\x6d\x84\xed\x0d\x31\x90\x02\xa1\x27\x3f\x98\x2b\x66\xa6\xa6\x32\x44\x5d\xed\x65\xa2\x35\xe1\xb3\xf7\xd5\xd8\x01\xea\x71\xf7\xad\xbb\xed\xb0\xcf\x39\x6a\xf0\xb6\xee\xae\x73\xdd\x9d\x74\x96\x6a\x92\x9c\x40\xb3\x8c\xf3\x67\xf1\x30\x6e\xa6\x84\x72\x84\xb9\xd9\x90\x5c\x71\x14\x31\x1f\xbb\x22\xe5\xc7\x75\xea\x02\x3c\xdf\x4a\x7a\x8d\x48\x94\x12\x47\xaa\x1e\x3e\x53\x91\x46\x01\x11\xf5\xec\x9f\xc6\xd8\x33\x2b\x60\xeb\x09\x9b\xc4\xa0\x2a\xf8\xed\x5d\x53\x15\x7c\xe2\xc0\xbf\x2e\x20\xf7\x3d\x7d\x72\xb7\xfa\xe4\x86\x3a\xe4\xbf\xf4\xe1\x10\x2f\x1c\x61\x53\xcc\xdf\x96\x78\xc1\x9a\xc1\x7b\x9a\xeb\x6e\x0e\xf0\x77\x6f\xbf\x83\x5f\xef\x1e\x7f\xb8\x7c\x05\x74\x2a\xff\xed\x83\xec\xbb\xb6\xa4\x75\x5f\xcc\x45\xc7\xfd\xd8\x41\x6f\xc5\xbe\x64\x68\x8c\x9d\x30\x3e\xdc\x09\x2e\xf2\x1e\x9c\xab\x31\x27\x11\x50\x39\xe2\x7e\x29\x72\x57\x59\xa4\x93\x18\x6a\xe7\x5f\x72\x00\xbc\xde\x12\x53\x9f\x1d\x63\x3f\xe9\xb0\x03\x24\xaf\xdd\x0f\x39\xde\x9d\x8a\x08\xc6\x4a\x52\x56\x39\x42\xf8\x3d\x9c\x41\x0d\xe3\x83\x18\x30\xb9\x6e\x42\x1d\x74\xd0\x68\x9e\x74\xc2\x5c\x8e\xee\x03\xce\xcd\xec\xe1\x04\xdf\xf8\x3a\xaa\xf0\x05\xbd\x20\xce\xc3\xbc\x6f\xc6\x9a\x7e\xc1\x61\x57\x53\xa5\x89\x3e\xda\xfd\x45\xc7\x7b\xf9\x82\x75\x49\x2d\xb0\xd6\x56\x2d\x52\x86\xfe\x1d\xb4\xc9\x70\x63\x3c\x3a\xad\xfa\x7e\x87\x8d\x74\x82\x8b\xee\xab\x1d\xef\xe8\x69\x3d\xc6\xcd\x24\x96\x3a\x7d\x18\x2b\x04\xb3\x30\x43\x30\x96\x72\x65\x2f\x73\x6d\x7e\xa7\xc6\x9e\xd4\x09\x2e\xe2\x4c\xc4\xa6\x2f\x4b\xc1\xed\xfe\x7c\xcd\xfb\x7f\x9d\xd3\x15\x77\x64\x6f\x19\xce\x39\x15\x42\x50\x44\x88\xa2\x63\x8f\x50\x2e\x54\x77\x42\x76\x25\xe5\xd6\x06\x48\xfa\x0b\x3a\x65\x9c\xc4\x75\x48\xbf\x44\x1a\x5d\x7c\xa4\x15\xea\x60\x65\x63\x38\xaa\x93\x33\x51\x1e\xf5\x3a\x22\x45\x4e\x75\x39\xc2\x37\x96\x76\x22\x9c\x21\x72\x41\x35\x7a\x69\x96\x6b\x05\xcb\xae\xf7\xa3\x31\xce\x61\x8c\xe3\x1c\xc6\x8f\xf3\x38\xcf\x11\xa9\xc5\x0d\xde\xe4\x2a\xd1\x58\xd8\x82\x84\xa8\xb0\x3b\x36\xf7\xbe\xb9\xb7\x7d\xf6\x49\x56\x64\xaa\x11\x7e\x40\xa1\x67\xe0\x92\x72\xdf\xf7\x24\xef\x6b\x8e\x79\xc5\xa0\x5d\x41\x0f\x9d\xc6\x1d\x44\xa0\xa1\x26\x3c\x04\xa9\x71\x68\x73\x2b\x12\x84\xcb\xe7\x25\xcd\x48\xd8\xea\xc7\x41\x87\x5c\x56\x86\x65\xce\x67\xcc\xfc\xb2\xa8\x8a\x05\xbb\x71\x20\xea\x45\x7d\x17\x2b\x12\x34\x9b\x09\x5a\x31\xf3\x84\x8b\xbc\x09\xfb\x6a\x18\xf3\xc2\x54\x01\x51\x34\xfe\x25\xe7\x8a\xe2\xcb\x76\x5e\xe3\x4f\x5f\xc3\x62\xf6\x24\x38\x38\x60\xbd\x4f\x5c\xec\x06\x10\x27\xe0\xde\xe1\xdd\x36\x57\x71\x5d\x2a\x44\x9b\x99\x45\xcc\x57\xaa\x15\x9c\x42\xc8\x56\x20\xe4\x6b\x36\xe8\xee\x9e\xe6\xb6\x4b\xcd\xed\x9b\x0e\xbb\x12\x22\x0a\x89\x54\xd9\xfd\x7d\xc7\xfb\x79\x67\xa1\x7a\x9e\x55\x4c\x4c\xd5\x89\xa5\x61\x4b\x05\xc1\x8f\x15\xbc\x77\x19\x21\x36\xd3\x87\x90\x62\x9c\xdf\xed\xa5\x89\x37\xc9\xbd\x2c\x59\xcf\xbd\x7b\xc0\xdb\xad\x81\x31\x5b\xbc\x4e\xf8\xe2\xca\x41\x7c\x07\x65\x4b\x67\x61\xa7\x1b\xf5\x91\xe9\x3d\x5c\x87\x88\x84\x50\xe7\x4c\x6f\x95\x74\xf1\xf7\x0e\xbb\x06\x67\xd3\x2d\x21\x44\x4f\x9d\x4e\x5a\xc2\xfd\xaa\xe3\xfd\x96\x73\x47\xf9\xb2\x11\x30\xb6\x91\x6c\x0e\xb4\x7d\x3e\x0a\xc2\x8e\x99\xb7\x6f\x76\x14\xa2\x6b\xf5\xe2\x96\xcf\x2d\xd4\x76\xeb\x23\x8b\x9d\x8e\x68\x85\x84\x27\x87\xe9\xd4\xab\x16\xa4\x38\x40\xd2\x6d\x24\x71\x92\xe2\xae\xa0\x30\x7c\x41\x72\x21\x00\x1d\xf4\x0b\x99\x9d\x9a\x1b\xa2\xd5\x83\x73\x2b\x81\xd5\x59\x72\xec\xf5\x23\xec\x1a\x0a\x66\x59\x45\x74\xe9\x50\x64\xee\xdf\xd4\xbc\x0f\xd7\x96\x85\x7c\xa6\x49\x08\x0c\xb2\xe9\xb9\x7e\x82\x76\xa8\x0b\x3b\x13\x44\xfc\x44\xd0\xdc\xd0\x18\xe2\x10\xff\xa6\x17\xa1\x54\x93\x93\xcd\xd8\x40\xb3\x53\x28\xd7\xb6\xa9\xd0\x24\x6d\xa0\x9a\xf6\x55\xe6\xe8\xaa\x48\x3b\xea\x94\x18\x20\xa8\xb4\xce\x9c\xd2\xa5\xa5\xd4\x1c\x82\xcd\xb8\xcc\x3d\x5a\xcc\xad\x1b\xd8\x75\x3b\x30\x96\x56\x35\x61\xef\x18\xb3\x67\x80\xb7\x4d\x10\x6f\x75\x18\x2b\x54\x04\xf7\x55\x8e\x27\x96\x0a\x8d\xa1\xc8\xa7\x2b\xa9\x11\x70\xa9\xd8\x8e\x71\x1e\xab\xbd\x0a\x04\xb0\x5e\xb9\x95\x92\xda\x7f\x60\x8b\xa4\xb7\x33\xcc\xdc\xea\xdd\x9b\xbd\x23\x4b\xc6\xa7\xec\x70\x5a\x93\x24\xcc\x78\xc9\x92\x40\xef\x72\xd8\x55\xa9\x68\x4a\xb9\x49\xf0\x13\xaf\x71\xbc\x8b\x8f\xc2\x5e\x03\x9b\xba\xf1\x1d\x3b\x10\x67\x01\xb2\xe4\x6c\xe8\xb4\xb5\xed\x4f\xc6\x37\xb9\x37\x6e\x17\x18\x6a\x2a\x61\x65\x1b\xf7\x0f\x15\xb1\x3d\x08\xbd\xde\x6e\xa7\xa2\x0d\xde\x0c\x13\x09\xa0\xcc\xa7\x3e\xb7\xb4\x48\xe0\xca\xee\x97\x0e\x7a\x77\x17\x3f\x6d\x04\x36\x83\x43\x04\x93\x0f\xc3\x26\x60\x3a\x02\xd1\xf4\x1d\x8a\xf3\xfa\x8c\x19\x62\xec\x29\x2a\x6c\x68\x93\x67\xdb\xa8\xbf\x6f\x8c\xdd\x6e\xac\xb2\x2d\x80\x47\x76\xb4\xc8\xd8\x07\x1d\xf2\x2f\xbd\xc7\x61\x67\x2b\x8b\x7a\x64\x9d\x02\x9e\xa7\x93\xe0\x78\xd2\x69\x7e\x66\x0a\x85\xec\x10\xe4\x04\xa0\x98\xe9\x82\x6e\xbe\x08\x9d\xa6\xde\x93\xf3\x53\xf9\x7d\xde\xe0\xb0\x17\x5c\xce\x6a\xa2\x47\xe8\x3a\x72\x08\xe9\xaa\xb6\x44\x1a\x22\x64\xed\x40\x8a\x4b\x0c\xbc\xe5\x54\xb3\x3d\x35\x77\xcf\xe1\xfd\xf8\x99\x0d\xd7\xb7\x17\x8e\xf3\xee\x5c\x9d\x84\x60\x31\xeb\x4b\x22\x90\x17\x89\x63\xf6\x52\x21\x29\xca\xbe\xf0\x94\xed\x72\x40\x81\xa5\xef\x23\x4f\xf1\xae\x9f\xe3\xa5\xab\x3a\x68\x70\xd0\xe9\x6c\x3c\xe9\x5f\x72\x34\xc1\xd4\x25\x67\x2c\x17\x9d\xae\x9c\xc8\x97\x9c\x2b\x28\x20\xfd\x4c\x39\xb7\xf7\x17\x9e\xcc\xde\x5c\x63\x63\x2a\xad\xde\x7d\x55\x4d\xa1\x80\x7d\xd3\x31\x11\xca\xd0\x16\x07\xb8\x6b\x55\x18\x66\x16\xf1\xd5\x2a\x7d\x56\x61\xba\x61\x34\xa9\x2a\x0b\x23\x7f\x32\x11\x67\x05\xf4\x4e\x1f\x9e\x21\xf4\xb3\x90\x82\x50\xd5\x31\x5e\x0a\x75\x55\x24\x46\xe5\xca\xad\xf9\x42\xd8\xea\x05\x51\x51\x2e\xd0\x71\x90\x75\x0a\x10\xc6\xd0\xbd\x8c\x41\xb0\x04\xa7\x63\x85\x9f\x9b\x94\x45\xd3\x36\xb4\xd6\x8f\xd7\xd8\x93\x52\x81\x3b\xf5\x6d\xa1\xdc\x0c\xfb\x60\x2f\x73\xdf\xae\x7b\xe7\x9f\x9c\xaa\x07\x54\x4f\x75\x82\x8b\x61\xa7\xd7\xb1\x7a\x0a\x9f\x2e\x91\x7b\x76\x82\x10\x23\xa0\x34\xac\xb7\x31\x9a\x00\x91\x84\xaf\xf1\x0d\xfc\x0a\x66\xd4\x94\xaf\xaa\x06\x43\x9f\x05\x80\x40\xa1\xbe\x86\x9c\x27\x16\x74\x62\xa0\x3c\xf4\x51\x5f\x83\xec\x95\x67\x9b\xda\x3b\x31\x81\xa7\xec\x11\x9c\x9e\xb2\xfb\xeb\x47\x4d\x5e\xb3\xf7\x5e\x0e\x5e\xb3\x2f\x3a\x26\xaf\x59\x40\xe0\x2e\x65\x4a\x3d\x53\x1b\xc4\x00\x6d\x4c\xc3\x80\x29\xc1\x9b\x98\x48\xb8\x98\x1b\xe4\xa4\xa8\xbf\x25\x2d\xae\x96\xc6\x21\x22\x41\xab\x96\xdb\xbb\x25\x70\x3f\x7c\x2d\xfc\x5b\xd7\x64\xed\xec\x1f\x6b\xcc\x5c\x8b\xee\x9f\xd7\xbc\x3f\xac\x19\x17\xaa\xe8\xe4\x54\x32\x09\x34\xb7\x2d\xbf\x1b\x53\xb6\xa5\xb9\xf4\xf1\x24\xa8\x9e\x85\x26\x8b\x8b\x21\xe8\x42\xeb\xe8\xa2\xb5\x26\x17\x61\x50\xa2\x27\x5f\x4e\x1f\x05\x72\x0a\x5f\x17\x39\x00\xfd\xa8\xd5\x53\xd4\x24\xf7\xf9\x92\xec\xfa\xb6\xc8\xf9\xc2\x99\x15\xe0\x15\x42\xac\x08\xa8\x1d\x26\x4c\xa8\x90\x7d\xb9\x77\xce\xca\xee\xae\x2b\xb1\x55\x27\xc4\x19\xa3\xc5\x3e\x4d\x2f\x3f\xbb\xd0\xf4\x55\x84\x0c\x90\xe5\xd0\xd1\xdc\xab\x28\xc0\xc3\x94\x18\x8b\x3d\xd1\x68\x9c\x91\xdd\x6a\x69\xe8\x1f\xa9\x31\x2d\x14\xdd\xf7\xd7\xd8\xd4\xf6\xb1\x2f\x49\x4b\xc9\x1e\xd0\xc5\xbe\xe1\xa8\xf7\xd5\x48\xa9\x8c\x57\x24\xba\xb2\x4c\xa2\x72\x9e\x99\xab\x5d\xa9\xf1\xe1\xba\x94\x75\xbd\xf5\xf5\xb0\x19\xa2\x1f\x43\x09\xb1\x14\x53\x58\x9a\xb9\xb6\x35\xc8\x42\xb2\x3c\xe8\x74\x45\x8b\x4b\xc5\xa9\xa2\xb1\x48\x27\xd6\x8b\xd6\xe5\xbf\x30\x2f\x6c\x71\x49\x52\x91\x10\x38\xf4\x98\xea\x0d\x3c\x15\x05\x52\xb7\x39\xa3\xd8\xd7\x1d\x76\x35\x6e\xd5\x2b\x0a\x64\xf9\xf3\x5b\xe5\x4d\x55\xec\x68\xe7\xac\xd7\xbd\xb7\x39\x76\x79\xa5\x53\xd6\xd0\x17\x4b\x94\xc8\x1d\xca\x76\xce\x13\x52\x25\x70\x52\x0e\x8a\x50\xa4\x77\x08\x0a\x89\x09\xd3\x06\x0c\x40\xc5\x36\xc5\xfe\x69\x84\x3d\xe9\x42\x61\xf4\x52\x37\x32\xf7\xeb\x23\xde\x7b\x47\xaa\xee\xd8\x11\xde\x4d\x34\x95\x41\x1d\x41\x30\x99\xf8\xf2\x79\x52\x24\x86\xa1\x3c\xad\x9e\xa8\x55\x6b\xb1\x43\x48\xa3\xa5\xf5\x88\x56\x7c\xf5\x59\xa0\x32\xda\x0c\xfa\xca\x73\x18\x9a\x84\x64\xc6\x02\x26\xa6\xc2\x13\x90\xad\x03\xef\x62\x87\x81\x83\x20\xcb\x4d\xff\x8e\x09\xfb\xa8\x13\x56\xc6\x1b\x7d\x10\x4b\x2a\xf7\xfc\x34\x98\x2e\xc3\x18\x09\x70\x8b\x48\x5e\x1c\x84\x5c\x2b\x01\x73\x55\x1f\xcb\x83\xf3\x22\xe3\xdd\x54\x34\x45\x0b\xa9\x5e\x81\xd3\x27\xee\xeb\xf3\x7c\xa9\x9c\xc9\x82\x37\x4d\x27\xa6\x5a\xd6\xaa\x59\x76\x3d\x3b\xfe\xb0\x63\xd9\x60\x58\xd9\xcf\x8e\xb2\x27\x76\x93\xd6\x69\xcd\xcc\x48\xe7\xf7\x0f\x8c\x7a\x6f\x1b\xad\xb8\xa1\x86\x0d\x2d\xa7\x7a\xc8\xd5\xfa\x26\x5c\x3d\xa8\x07\xe1\x6e\x4a\x9d\x77\x12\x67\x23\xc2\xef\x61\x44\x4e\x0b\xdc\x45\x71\xd2\x12\xd9\x24\x07\xff\x88\x88\x4b\x08\xa8\xe6\x0e\xdc\xd5\x20\x96\x6b\x67\x53\x80\x50\x5d\x16\x41\xab\xbf\x36\x49\xa2\x72\xa0\x26\x61\xac\x62\x75\x64\x81\x89\x7c\x87\x8f\x4b\x79\x3a\x45\x8c\x41\xf2\xef\xe9\x49\x2e\xf2\x26\x92\x48\xa9\xa8\x6c\x9a\x93\xb0\xe2\x36\x83\x50\x1e\x75\xf2\x30\xe2\x42\x89\x24\x98\xac\x41\xab\xaf\x76\x17\xf9\x4e\x18\xf7\x0a\x1a\x4f\xb3\x11\x93\x4a\x1c\xaa\xcc\x22\x8b\xc8\x24\xe9\x76\x93\x2c\xcc\x05\x56\x0f\x1b\x1c\x44\x70\xee\x02\x2c\x1d\xa3\xd1\x4b\x41\x1a\x44\x91\x88\xd6\x4c\xca\x29\xb2\x03\x29\xbe\xd9\x2e\x3d\x83\xec\x66\x6a\xcf\x57\xba\x2b\x8e\x85\x02\xb8\xa2\xe8\x78\xdc\x0b\x93\xd8\x8c\x05\x23\xf0\xa8\x48\xe4\xa2\xa0\xb3\x0d\xe4\x92\x28\x91\x42\x3c\x38\xca\x26\xb7\xc2\x91\xf2\x57\x93\xf3\x22\x5e\x16\x52\x57\x00\xfd\xfe\x35\xa3\xde\x89\xd2\xb5\x4a\xf6\x6d\x98\xfd\xf2\x39\x6e\x97\xa9\x53\x3c\x2d\x45\xfe\x63\x23\xec\xaf\x6b\xec\x60\xd0\x6b\x85\x72\x3d\x65\xee\xd7\x6b\xde\xaf\xd4\xe6\xd4\xcf\x41\x4e\x06\x03\xe6\xa6\x80\xc0\x34\x50\x46\xc1\xe0\x52\x28\x8e\x7a\xf5\x61\x95\x0c\x18\xa4\x20\xf3\xb9\xfa\x4e\x3d\xd8\x44\x86\xba\x52\xb5\x93\x94\x3c\x1b\x17\x44\x8a\x18\x44\xf4\x41\x7c\x72\x13\x0e\x06\xb9\x88\x89\xb2\xd6\x96\x40\x54\xe1\xa0\x68\x8b\x21\x49\x28\x80\xcd\xb8\x2b\x2b\xa0\x80\xb1\x26\xad\x37\x2b\x91\xf0\xf4\x4d\xfa\x8c\x89\x98\xa1\x93\x3a\xb6\x70\xb9\x5c\xc7\xf6\x41\x23\x5c\xdf\xfb\xae\x55\xec\x1b\x52\x0c\x88\x20\x48\x04\x29\x90\x23\x9e\x57\x98\xcc\xf4\xe2\x7f\x74\xd9\xd3\xab\x80\x61\x51\x35\x5a\x4a\xd2\xdc\xfd\xda\x35\xde\x8c\xf1\xbb\xda\x06\x24\xe7\x2d\x3e\x73\x28\xe3\xdd\x24\x95\xa7\xc0\x51\xf9\xaf\x35\x3f\xde\x7d\x0d\xfb\xea\x28\x63\x18\xfb\x09\x85\x7f\x61\xc7\xd8\x04\xc3\x38\xc3\xdf\x3a\x7a\x86\x0e\x38\x36\x13\x0c\xe4\x0a\xe6\x09\x47\x1c\x45\x85\x49\x82\x2a\x3b\x7c\xdf\x88\xf2\xc5\x9a\xfb\x9c\x4a\x52\xd6\x3b\x92\x0d\x29\xf0\x1f\x4d\xcb\xc2\x8e\x1f\x3b\x36\x73\xac\x64\xe3\x0b\x62\xbe\x38\x77\x66\xee\xa5\x2b\x77\xcc\xbf\xf4\xcc\xdc\xe9\x13\x05\x64\x98\x61\xfd\x80\x14\x50\xa5\x3a\x44\x49\x72\x5e\xb4\x78\xaf\x8b\x39\x94\x18\x2a\x00\xf5\x55\xfb\x0d\x06\xc7\x2e\x25\xad\x43\x99\xb1\xab\xc9\x47\x32\xab\x78\x08\x9a\xb4\x03\x26\x2c\x4e\xaa\x43\xf2\x95\x43\x85\x6b\x06\x60\x87\xc7\x83\xb8\xd8\x93\x3b\x41\x77\xa2\xec\xc0\x41\xbc\x76\x5c\x04\xd4\x37\x88\xc7\xa7\x82\xc7\x17\x97\x6e\x3a\x93\xc4\x64\x8a\x2a\x9c\x73\x14\xd4\x02\x00\xda\x22\xb7\xe3\x28\xcc\x9a\x3c\xfc\x20\x6a\xaa\x44\x9d\x74\x90\x30\x6e\xab\x6b\x87\xaf\xc5\xc9\x13\xb7\xeb\x41\x9d\xae\xb1\x4f\x8e\xb0\x2b\x82\x6e\x77\x29\x4d\xf2\xa4\x99\x44\xee\x8f\x8f\x78\xef\x07\xd6\x2e\x38\x6a\x36\x35\x6e\x1d\xdc\x2d\xf8\xf1\x60\xde\x9a\x7d\x81\x27\x89\xac\xc8\x92\xbc\x7d\x80\xb6\xba\x1f\xe7\xc1\x45\x9f\x9f\x8b\xeb\x98\x66\x2c\x5a\x04\x5b\x87\x9b\x0c\x2c\x5d\xec\x49\x39\x49\x8a\x92\xd4\x19\x09\x1f\x1e\x0f\x30\x0a\x75\xf9\xe4\x7c\xfd\xf8\xcc\xcc\x31\xe8\x58\x02\x0a\xdb\xdc\xdc\xf4\xc3\x20\x0e\xfc\x24\x6d\x1f\x0e\xb2\x2c\x6c\xc7\x40\xbc\xa8\x7a\x00\xe3\x0f\x26\x7c\x7e\x26\x89\xeb\xba\x7c\xd5\xba\xcc\xe4\xe2\x2b\x55\x31\xeb\x35\x37\xe4\x14\xec\xf4\x81\x26\x2c\xee\xfb\xcd\xa4\x73\xb8\xd3\xaf\x13\xa8\xa8\x2a\xc3\x20\x09\xe3\x0d\x91\x07\xd4\x3b\x98\x2f\x9d\xf1\x76\x0f\x71\x03\xd4\xa9\x00\xab\x35\x57\xf4\xbf\xcd\xeb\x85\xa8\x1a\x40\xec\x25\x5f\x51\x27\x2f\x53\x2a\xfd\x64\x8d\xf0\xd4\x7e\xac\xe6\xbd\xb7\x66\x23\x26\xd3\x38\x99\xfc\x83\x7a\xfd\x42\x35\x0b\x58\xd7\x85\x33\x2b\x2f\x3d\x35\x77\xcb\x89\x53\x3e\x9f\x83\xdd\x33\xcd\x33\xf5\x5e\xc0\x0d\xeb\xb6\xa1\x76\xd2\x01\x05\x3a\x88\xb4\x08\x85\x15\xaf\x2c\x96\x9a\x80\x98\x5c\x01\x54\x90\xa2\xe1\xb1\xcf\xf9\x87\x64\x49\x7a\x05\x62\x7d\x15\x65\xf1\x12\xcc\xb7\xb3\x8a\xc4\x0c\x9c\xec\x44\x86\x6b\x0a\xdc\xb0\x80\x3a\x50\x61\x3d\xaa\xc5\x66\xa7\xbd\x6a\x1f\x1b\x93\x4a\x1c\xc8\xd5\xbf\x1d\x55\x46\xa2\x2f\x8f\xae\x2a\x69\x98\xc4\xa8\x3b\x81\xf7\x39\x89\x35\x18\x84\x71\x64\x0f\x33\x62\xa5\x68\xa1\x1a\x08\x2e\xa7\x30\xe3\x67\xa8\x60\xb9\xb6\x4f\x25\x41\xeb\x96\x20\x0a\xe2\xa6\xd4\x94\xf8\xb9\xac\x07\x7e\x25\x9c\x9a\x83\xb9\x13\x8b\x52\xeb\xd7\x66\x1b\x43\x5a\x85\x71\x1d\x44\x2b\x8a\x11\x29\xca\x20\x94\x49\x98\xa2\x52\x0a\xac\x32\xb6\x3b\x82\x51\x63\xd8\xbb\x3c\x74\x06\x61\xe4\x73\x1d\x42\x6e\x60\x3b\xa8\x89\x82\x45\xc9\xb3\x50\x53\x1d\x7d\xd1\x72\xa1\xbd\x3c\x10\xce\x27\x37\x09\x81\x25\xd9\xac\xe3\xba\x4c\xec\x13\xd0\xf5\x10\xb3\x5a\x95\x80\x3d\xa9\x13\xf5\x81\xd8\x36\xcc\x89\x1e\xae\x54\xd3\x32\x97\x5d\x43\xaa\x04\x5d\x55\x38\x1c\x25\xed\xc2\xf3\x44\xea\x16\x51\x12\xb7\x09\xd0\x53\x76\x10\xe2\x07\x00\xa5\x06\xcc\x4b\x39\x4e\x70\x98\xd6\x23\x95\x27\x7c\x5e\x89\xeb\x89\xcb\x2b\x72\xe5\xd7\xea\x72\x16\xe1\x0e\x6f\x58\xe1\x6e\x67\xb0\xeb\xbb\xf3\x6a\xfa\xf9\x7a\xf6\xd9\xa7\x67\x9a\x64\x0a\x95\xb9\x98\xd0\x46\x61\x2f\x63\x63\x4a\x04\xb9\x2f\xf1\x5e\x20\x4b\x5a\x5c\x1a\x2a\xb7\x57\x30\xe4\x21\xe3\xde\xea\xfc\x92\x37\xc9\xbd\x73\x0b\xf2\x1f\x39\xb7\xbc\x95\xf9\xd5\x25\x4f\x7b\x28\xe5\x98\xae\xce\x2f\x59\xab\xe7\x4f\x1d\x0b\x89\xb5\x2a\xe5\xf9\x5c\x26\xd2\x95\x1e\xa8\x32\xee\xcf\x38\xde\x4d\xc6\x6f\x72\x1e\x23\xc7\x78\xc9\xd7\x24\xab\x09\xc8\x8e\x10\x8b\x97\xe1\x0b\x7e\x15\xc6\x65\x8b\x35\x48\xee\xdd\xe5\x9d\x5e\x93\x7f\xe8\x3c\x7d\x05\x0a\x6a\x45\xe6\xc2\x69\xcd\x7b\x96\x57\x9c\x32\xe4\x21\x41\x3d\x9a\xf9\x7c\x59\x81\xa4\x59\x5c\x5f\xff\xc6\x4a\x62\x80\x34\x52\xd5\xc4\x65\x79\xc2\xea\x50\xb4\xdd\xb7\x9e\xe4\xfd\xee\x88\x79\xc5\x88\x22\xd6\x81\x75\x85\x76\x92\xe2\x93\x46\xe8\x49\x58\xc2\x81\x93\x03\x68\x95\x67\x10\x21\x98\x48\x6d\x06\xbe\xb6\x51\xae\xf1\x30\xb0\x4a\xcb\x53\x97\x7a\x88\x0c\x10\x60\x5b\x30\xbf\x40\xfb\xf0\xb8\x36\x36\x4f\xf0\x4e\x10\xa3\xbc\x32\xe0\x63\x0a\x1e\x64\x45\x9c\x6c\xb8\xd7\x71\x0a\x19\xb8\x3a\xd4\xac\xa5\xa4\x25\xf7\x0e\x6c\x96\x02\xa1\xab\xb0\x9f\x20\xdb\xb7\x76\x77\x19\xb5\x3b\x83\xb8\x56\x0a\x43\x95\x4e\xb1\x8a\x60\x97\xd4\x55\x9f\x03\x75\x07\x64\xb8\x10\x87\xfd\x24\xcf\x84\xa8\xf2\x4e\x89\x78\x43\x4a\x65\x54\x0f\xce\x8b\x6e\x06\x2e\x29\x39\xc2\x87\xa9\x17\xeb\x18\x91\xd0\x69\x5d\x72\x0e\x20\x13\xa2\x1d\x5e\xf8\xbe\x27\xec\xf9\x41\x77\xeb\x07\xfd\xdc\x28\x53\x7d\xeb\x7e\x76\xd4\x7b\x70\xf4\x36\xfc\x51\x62\xcf\x05\xf8\xe9\x08\x68\x7b\xd4\x14\x47\xe7\xb9\x09\x10\xa2\xcf\xa8\xf3\xcb\x8b\x05\x84\xb3\xb1\xa7\x00\x47\x4c\xc1\x6a\x09\xc6\x1c\x1a\x04\x1c\x6a\x8e\x02\x98\x28\xc7\x35\x41\x43\xe1\xc5\x53\xbd\x0c\x5a\xc1\x77\xc3\x87\xac\x3a\xc8\x1d\x11\x33\x98\xb2\xac\x27\x4f\x2a\x18\x65\x0d\x60\xc6\xd0\x2e\x32\x35\x6a\x96\x32\xa9\x66\x80\x7d\x4f\x96\x88\xc3\xa4\x9f\x34\xfd\x69\x48\xeb\x91\x0a\x79\x50\x08\x2f\x04\x11\x40\xed\x98\xef\x22\xd5\xa1\x41\x6b\x4e\xc5\x00\xce\x9b\x68\x71\x2f\xed\xc5\x4d\x8f\xc8\xe4\x15\x93\x4a\x61\x46\xe8\xc5\x4d\x7e\x76\x7e\x51\xf7\xee\x38\x92\xe0\x93\x45\xe7\x54\x18\xf7\x2e\x1a\x12\x64\x62\x80\x3b\x1c\xf9\xed\x45\xb5\x94\x91\xbd\xaa\xc6\x55\x69\x9c\x51\xb2\x29\xd2\x66\x90\x89\x49\xe8\xc1\x24\xed\xa8\xbe\x5d\x38\xb3\xc2\xc1\xb9\xc4\xc7\x97\x4f\xce\xf3\xe9\xe9\x23\x33\x13\x66\x16\x41\xa6\x3d\x21\x61\xa7\xd3\x03\x36\x7b\x7f\xcf\xb5\x7e\x79\x42\xd9\x3e\x61\x86\xb2\xfd\xe8\xae\x43\xd9\xda\x8f\x55\xb4\xda\xdf\xd4\xd8\x58\x72\x41\xa4\x1b\x22\x68\xb9\x7f\x5a\xdb\x22\x8b\xcb\xda\xc2\xcf\xd2\x2b\xde\x7f\xa9\xa9\x3f\xcb\xd9\x0a\x05\x13\x9c\x7a\x40\xc3\xe1\x91\x8d\x4d\xed\x41\x30\xd9\xe9\x98\x83\x7e\x75\x73\xff\xf2\x2f\xcb\xce\x74\x64\x6a\xfa\x86\xa9\x23\x47\x8e\xd7\xbb\x49\xab\xae\x6a\xe4\x77\x5a\x25\xa3\x04\xa0\x26\xd6\x23\xd9\x8f\x1c\x9d\xfd\xc6\x61\xfc\xc2\xb4\x3f\x7d\x4c\xaf\xa1\x9d\x06\xa0\x2e\x25\x2d\xdd\x45\x2a\xf6\x94\xbd\xb7\xc6\x58\xa6\x63\x52\xdd\x37\x6c\xe5\xa0\xb3\x3a\xbe\x08\x64\xf5\x7e\xc7\x31\xa2\x5a\x8b\xb8\xc2\xa2\x58\x2b\x57\x23\x4f\xb8\x88\xb3\x5e\x2a\x0c\xe7\x8d\xc9\xb2\x8f\xeb\xd1\x52\x9c\x40\x7e\x63\x69\x28\xab\xc0\x7a\x4f\xbe\x68\xc2\xc9\x0a\xd1\x2c\x69\x7c\x34\xcc\x78\x1c\x46\x93\x15\xe5\x99\xd2\x1d\xa0\x70\x0b\x25\x4e\xaa\x47\x51\x84\x1f\xf0\x1f\x72\x1a\xdb\xc7\xa9\xdc\xec\xde\xa4\x83\xf8\xa0\x87\x4a\x11\x7c\xe6\x97\x2b\xb3\xdc\x7e\x77\x8c\x3d\xc5\xe8\xe5\xb4\x11\x34\xe5\x22\x5c\x4e\x22\xe1\xfe\xdc\x98\xb7\x21\xff\x40\xf9\x57\xa4\x5e\x4c\xf2\x28\x69\x87\xcd\x20\xc2\x2f\x83\xa7\x61\x9d\xa3\xa7\x04\x29\xc0\x90\x8d\x02\x43\xab\x0d\x6d\x0e\x4c\x70\x72\xc5\xa2\x22\x28\xcb\xa6\xd0\x71\xdb\xb6\xfd\x87\x7b\x60\xe6\x7b\x11\x62\x8f\xe3\x36\xb6\x61\xec\x62\x2f\xde\xed\x26\xf6\xb4\x2d\xc2\xb1\x59\xce\xf6\xa5\xc0\xaa\x79\xde\xab\xe3\xd2\x41\x11\x16\x80\x67\x5f\x58\x8b\x4a\x9f\xc1\xe5\xba\x31\x1d\x14\x87\x59\x9d\x3d\x7b\xa8\xe0\x54\x4b\xba\x28\xea\x21\xa7\xb9\xbd\x64\x79\x9e\xfb\xdc\x7a\x75\xb8\x1b\x14\x68\x93\xf2\x96\xa5\x4e\x12\x09\xc6\x3e\x31\xca\xee\x79\xa4\x9c\x61\x94\x24\xbd\xc7\x49\xfb\xbf\x21\x27\xed\x67\xf6\xb1\x9b\xb7\xc4\xbf\x98\x1e\x86\x9e\x32\x9f\xc4\x48\x9b\xe3\xfe\xf3\xa8\x27\xb6\x7b\xa8\x14\xbd\x63\x20\xa6\x0d\x79\x93\x07\x40\x56\x26\x52\x80\xd5\x05\x09\xa7\x12\xb5\x2f\x39\x14\x69\x6d\xed\x63\xff\x30\xc2\x3e\xec\x30\x37\x0a\xb2\x7c\x35\x0d\xe2\x0c\x3e\xbb\x1a\x76\x84\xfb\x76\x67\x38\x0e\xcf\x16\x62\x45\xbe\xeb\xbd\x68\xb0\xbc\x82\x65\x3d\xcb\x81\x4b\x47\x1d\xa6\xa8\xa5\xb9\x7e\x5a\x21\xff\x26\xb1\x1e\x01\x18\x74\x30\xfb\xb2\x76\x01\x08\xf7\x62\xef\x2c\xfd\x89\xfb\xc6\x46\xaf\x13\xc4\xf5\x54\x04\x2d\xd0\xe9\xc4\xc5\x6e\x14\xc4\xb8\xb1\x1a\xf4\xf9\xa4\x9b\x1a\xd4\x48\xc5\xa7\x4d\x09\xbb\xa4\x81\xe2\x4e\x7a\x37\x10\x40\x5c\xa8\x34\x66\xf8\xa5\xa7\xbf\x6a\x04\x44\xee\xc9\xe6\xe9\x02\xad\x63\xdb\x8a\x8e\x75\x5f\xf4\x9e\x93\xe9\x25\x6b\xcc\xb4\x82\xec\x9f\x7a\x65\x7c\x35\x95\x3b\xf8\xc9\x20\x92\xc7\xc8\x73\xf1\xf9\x38\xd9\x8c\x27\xcc\x42\x6f\xa0\x74\xdb\x69\xef\x99\x39\xc2\x0d\x9b\x33\x46\x01\x1f\xe9\x12\xcd\x57\xbf\x72\x85\x15\xfc\x6b\xc4\x97\xcd\xc5\x79\x38\xb7\x0e\x23\xdf\x77\x7f\xf6\x0a\x6f\x71\x29\x69\xf1\x20\xce\x43\x1e\xd0\x55\xec\x71\x10\xb7\xb2\xd6\xa0\x72\xc0\xe9\xc0\x7e\xca\x50\x37\x61\x13\xb1\x95\xa8\x2f\x33\xf6\xb5\x51\xe6\x2b\x58\xd7\x05\x88\x51\x29\x74\xe5\x45\x74\x3c\xe2\xe5\x13\x17\x45\xb3\x07\x0b\xe7\xe3\xa3\xde\x37\x47\x88\x89\x52\x7e\xad\xae\xbf\x66\x1e\xa1\x0d\x33\xbd\xb2\x2a\xe3\xe1\x01\xf3\x74\x01\xf3\x44\xae\x16\xa3\x86\x72\x56\xea\xb8\x10\x3c\xff\xd3\xd6\x5f\x28\xd7\x49\x6c\xd8\x47\x34\x21\xe6\x23\xa8\x46\x13\xc0\x6a\x50\xbd\x56\x55\x49\x3a\x02\xd7\xac\x0a\xd7\x91\xf5\x10\xaa\xe1\x64\xe4\x6f\xf5\x04\x22\xfe\xc9\x9b\xe8\x76\x44\xcd\x64\x62\xd2\x70\xb4\x80\xe2\x03\xe1\x5a\xc0\x94\xc6\xf3\x14\x10\x77\x81\x2e\x1a\x0d\x9e\xe2\x82\x4a\x3f\x84\x43\x1d\xe0\x5d\xe7\x19\xb5\x0b\xf6\x00\xcc\xf4\x03\xc8\xeb\x5e\x94\x87\x5d\xb9\xa6\x22\x65\xa0\xc8\x09\x6a\x04\x26\x2d\x9e\x37\x0a\x6e\x37\x95\xd3\x4c\xa1\x39\x6a\x2a\x41\x2a\x21\x86\x55\xe7\x22\xcd\x20\xa6\x70\x92\x03\xeb\x30\x68\x13\x22\xed\x14\x0e\xbb\x2c\xc8\xc3\x4c\x76\x9c\x15\xe9\x70\x94\x1d\xd9\x59\x88\xa4\xf9\x4d\xf6\xad\x7d\xec\x70\x57\x11\x4c\xed\x70\x9a\x7d\x7a\x9f\xf7\x2d\x70\x96\xa9\xc1\xa7\xd0\x23\x2c\x07\x61\x9a\xf0\x06\x85\x11\xd8\xc7\x2e\xa8\x7d\xbf\x62\x76\x88\x8b\x72\x87\xc6\x50\xe8\x21\x93\x83\x42\xca\x73\x18\xbd\xe6\x46\x92\x64\x82\x10\x1e\xb1\xf0\x0b\x61\x82\x21\x7f\x10\x8a\x42\x67\x6e\x92\x1d\x46\xf1\x68\x96\x2a\x5e\x0b\x33\xde\x49\xb2\x9c\xeb\x9e\xd0\x61\x21\xb1\x28\x82\x69\x90\xbb\x3a\x93\xea\x70\x47\x16\xba\x29\xc2\xf6\x86\x1c\x71\x18\x27\x29\xf3\x0a\xaf\x21\xba\x1f\x84\xc8\x51\x1d\xd4\x1c\xb6\xc5\xa2\x37\x97\xc2\x78\x19\xfa\x62\x92\x0f\x5b\xfa\xc3\xfb\x0c\x02\xc3\xfc\x89\x49\x60\xe4\xec\xe5\xc0\xd7\xd9\xeb\xc8\xfe\x0b\x73\x70\x04\xc2\x31\x21\x05\xda\x31\xe8\x0f\x9a\xb1\xfa\xc8\x45\x52\x20\x6e\x01\x83\x5d\xdc\xe6\x1e\xb6\xd0\xd3\xbb\x7e\xaf\xa3\x70\xbf\xa1\x91\x1b\x84\xbb\x45\xae\x88\x8e\x81\xb2\x6e\xcf\xf8\xd2\x4c\xbf\x51\x17\x31\x9e\x4d\x14\xfd\xab\xa0\xb8\xe4\x67\x02\x0a\x82\xb6\x87\xc5\x9a\xf0\xcf\x61\xb3\xec\xfa\x6d\x27\xfc\x9d\xd0\x04\xd1\x2a\x4f\xfc\x9f\xbb\xba\x12\xb7\x95\xf0\xc4\x64\x71\xf3\x3a\xb2\xce\x7d\xf3\xd5\xde\xd9\xca\x3b\x03\x70\x7a\x36\x6a\xf5\x3a\x44\xb3\x16\xa1\x14\xe5\x48\x67\x25\xee\x7f\xf3\xca\xbd\x33\xf3\xde\x99\xf9\xf1\x3b\x33\x7f\xb9\x66\x1c\x9a\x3f\x5f\xdb\xed\xa9\xf9\x2d\x35\xda\xfd\x4f\x21\x81\x01\xac\x83\xea\xf5\x03\x6e\x8d\x4e\x37\xef\x4f\x16\xa9\x45\x14\xe9\xa2\x6d\x6c\xda\x11\x12\x64\xca\x1c\x29\xe5\x86\x11\x07\x59\xb5\xc2\x28\xe3\x00\xcf\x80\x8f\x7b\x4a\xf5\x1b\x14\xa6\xe9\xab\x6b\x5b\xc4\xe4\x6f\x29\x85\x20\xa5\xe1\xb3\x36\xb0\x69\x65\x96\x99\x19\x42\x5b\x86\x93\x1c\x22\x8d\x1e\xed\x7e\x90\x75\xac\x07\x71\xab\x8e\xea\x3c\xfb\x52\x81\x6a\xfa\x85\xad\xf0\x13\xb7\xee\x10\x4c\x64\xfd\x81\xda\x8a\x75\x62\x80\x2d\x23\x15\x4d\x4c\x9a\x4a\x1a\x14\x5a\x66\x1f\x24\x86\xf5\x03\xd8\xd2\xe5\x88\xc1\x5a\x6f\x08\x48\xe3\x48\xd6\x39\xe4\x2d\x34\xfa\xa8\x89\x12\x8a\xa4\x2c\x2a\xdc\x05\x1c\xea\xa3\xd8\xc1\x0f\x9b\x5d\xc8\x00\x48\xad\xec\xeb\x72\x06\xf9\x6b\x6a\x16\xc0\x1a\x86\x7d\x17\x04\x3c\x0b\x80\xa8\xe6\x7e\xd9\xf1\x8e\xd3\xdf\x2a\xca\xd7\x84\x56\xc3\x0d\x4a\xe5\x5e\x60\xf8\x68\xb2\xce\x17\x17\x32\xff\x92\x33\xd2\x09\x63\xf9\xff\xc1\x45\x6b\xab\x7c\x83\xc3\x4e\x20\xa8\xd3\x73\x21\x74\xe6\xf8\x51\x6f\xa2\x13\xc6\xc6\x71\x31\xd5\x51\xd3\x14\x35\x15\xc6\xcd\xa8\x97\x85\x17\x4a\x51\x33\xf3\x88\x01\xf6\x1c\x55\xcc\x21\x59\x25\x2a\x46\x18\x9c\xa9\x5b\x16\xf2\xae\xab\xd9\x0b\x76\x67\x27\xbb\x53\x34\x36\x92\xe4\xfc\x3c\xec\x1a\x88\x39\xef\x7e\xea\x2a\xef\xce\x8a\xeb\x45\x48\x71\x5e\x62\x33\x86\xc0\x16\x30\x18\xad\x9e\x5a\x91\x8f\xc5\x04\xa0\xa9\x95\xab\x4d\x2c\xce\xd6\x3b\x7e\xef\x4a\xf6\x19\x87\x8d\x35\x83\x5b\x7a\x71\x2b\x12\xee\x83\x8e\x3b\xda\xe8\xe7\xc2\xfb\xa0\xa3\xae\xe1\x26\xba\x74\xe2\x34\x17\x71\x33\x69\x89\x16\x9f\x9f\xe3\x0d\xbc\x65\xc4\xf5\x1b\xee\x60\x85\x98\x63\x7e\xf6\x50\xa6\x82\xd4\x9b\x22\xcd\x51\x5a\x89\xc1\x34\x4f\x3a\xa1\xe5\xa9\x3c\xe9\xa4\x49\x92\xeb\x78\x64\xdd\x9d\xb0\x43\x00\x3e\x8d\xb9\x81\xbd\xb7\xc6\x0e\x50\x68\x94\xfb\xe6\x1a\x7b\xf1\x30\x81\xf2\x48\x06\x88\xc2\xcb\x34\x87\xaf\xf7\x51\xc7\x88\x02\x0c\x8c\xc0\x14\xa5\x26\xd3\x5d\x6d\xf3\x55\x7d\xcf\x4f\x84\x00\x2d\xa5\x1e\x48\x52\xde\x4b\xa3\xe2\x5c\xa7\x3a\xc2\x67\x8c\x36\x50\x7a\x13\xec\x97\x86\xa7\xcb\x0e\x18\xa2\xec\x90\x7e\xd2\x33\x63\x58\xd7\xe8\x2b\x6b\x3e\xfb\xab\x31\x36\xd2\x4b\x23\xf7\x1b\x63\xde\x1f\x8c\xc9\x2f\xb6\xc3\x0b\xb4\x79\x20\x1e\x41\xb1\x6f\xd0\x07\x27\x91\x92\x9f\xf6\xcd\x73\xcb\xa7\x80\x98\x9f\x8f\xaf\x81\x8e\x28\x66\x0f\x43\x2e\xe1\x6c\x37\x49\xf3\xc3\xdd\x20\xdf\x58\x9b\xf0\x91\xa9\x86\xc2\x32\x93\x75\xbe\xd6\x4b\xa3\x35\xd9\x44\x5d\x91\xca\x86\xca\x83\xd8\x9a\x2c\x6c\x4d\x55\x1e\xb3\x60\xe9\x24\x19\xe8\xce\x52\xed\xb7\xdb\x7e\x23\x06\x76\x6c\x18\xed\xd5\x31\xa4\x59\x2e\x02\x8a\x40\x90\x1f\xa0\xf8\x87\x86\xa0\x48\x23\xa9\xaf\x86\x01\x97\x23\x0e\xfa\xed\xc2\x99\x15\x68\xb5\x94\xf0\x7a\x72\x64\x68\x5b\x98\xe4\x6b\x08\xb6\xa0\xae\xaf\xf1\x26\xaa\x72\x54\x16\x0f\xe3\xba\x8a\x89\x92\x05\x05\x2a\x77\x58\xc5\x7c\x07\x3c\x0a\xfa\x18\x1b\x8b\x87\xd4\x30\x89\x27\x7c\xd5\x74\xb9\xd9\x40\x52\x34\xc5\xc9\x2f\xc9\x23\x98\x3c\xd8\xf9\x8c\x2d\x45\x84\xde\xab\xa8\x97\x30\x3c\x63\x0d\xd2\x2e\xf1\x75\xd9\xcb\xd3\x47\xae\xf3\xa7\xfc\x29\x7f\x7a\x0d\x5d\x75\x54\xb2\x9c\x39\x61\x76\xbe\xcf\x7b\x31\x80\xf7\xc9\x59\x02\xb6\x65\x38\xcd\xf2\x26\x66\x80\x50\x0c\x47\x31\x57\x81\xc6\x2a\x8a\xa0\xe3\xd4\xf9\x0e\xa2\xc9\x62\x63\x29\xd2\xb1\x0f\xba\x15\xe2\x2d\x95\x18\x6a\x06\x51\x44\xe7\x08\x73\xfa\xaf\xf4\x9a\x1b\x98\x38\x2e\x6f\x07\x80\x35\x78\x5e\x20\xe3\x51\x03\x31\xe2\xe4\x8c\x0a\x1a\x91\xc0\x43\xf5\x24\x4c\x06\x11\x64\xf0\x08\x10\xf5\xf7\xba\x18\x5c\x12\x8b\x4d\x1d\x30\x87\xb3\x08\xa7\x66\x01\x29\x02\xdb\xac\x87\x67\x4d\x39\x83\xcb\x5c\x67\x9e\xda\x87\x3d\x9f\xb1\x39\xcd\x5a\x95\x50\x98\x31\xd9\xd8\xd7\x55\x5a\x8d\x52\x08\x82\xb8\xaf\xce\x14\x5d\x91\x76\x42\x0a\x18\x0a\x89\x2c\xcc\xe7\x2f\x4a\x7a\xf0\xac\x9a\x98\xc8\xc1\x94\x00\x6b\x2a\xf4\x5f\xda\x08\xf3\x34\x48\x75\x31\x24\x36\xf4\xd2\x5b\xb7\x83\x79\xd4\xb4\x2a\x72\x80\x64\x7d\xf3\x5c\xaa\xcd\xf4\x7a\x0f\xcc\x20\x2a\x36\xaf\x11\x64\x61\x13\x12\x7a\x10\xd6\xcc\x93\x37\x66\xe5\xe7\x37\x93\xb4\xf5\x3c\x4f\x53\x6c\xe1\xc6\xeb\xf3\x93\x69\xd0\x26\x43\x84\x77\xad\xef\xfb\x1e\xa6\x97\x61\x06\xb7\x01\xf2\x33\xee\xdd\x4c\x77\xc9\x52\x48\x25\x4c\x72\x01\x82\xcd\x12\xc9\x7f\xf9\x04\x76\xd4\xd4\xe4\x0a\xb9\x0f\x69\xa7\xf3\xc5\xef\x95\xb0\x2d\x57\xb6\xc2\x17\xfd\xe9\x27\x78\x1f\xd9\x37\xf4\xb6\x66\x98\x25\x7d\x42\xaa\x13\xa2\xb9\x11\xc4\x61\x06\x51\x44\x49\x03\x0c\xfc\x17\x8f\x4d\xdd\x60\xee\x35\x19\x28\x6f\x70\x24\xa3\xa8\x61\xe3\x26\xcf\xf0\x13\x85\xf5\x05\x63\xb1\x20\x18\x31\xcc\x79\x90\xf5\xe3\xe6\x46\x9a\xc4\x49\x2f\xc3\x3c\xfc\x14\x72\xe2\x30\x8c\x22\xeb\x81\x20\xa3\xc8\xc6\x8c\xc6\x3d\xcc\x00\x33\x45\xd7\x68\x96\xf1\x69\x5f\x9d\x0d\xad\x8a\x49\x29\x57\x24\x5f\xc1\x6a\xb4\x65\x0d\x1f\xd7\xbb\xb8\x67\x87\x22\xdb\xcf\xd5\xb1\x74\xd0\xfa\x22\x91\x7b\xd0\x2c\x91\x9e\x09\x3a\x62\xc2\x67\xfc\x88\x8f\xb2\x34\x6e\xdb\xdf\x97\xd3\x4d\x6a\x0d\x45\xb8\x7e\xe9\xf3\xc4\x47\x18\x13\x57\x70\x26\x9a\xbd\x54\xae\xda\x2d\xab\x15\x89\xbc\x4e\x9f\x2b\x55\x84\xad\xaa\xce\xa1\x20\x03\x1d\x47\x46\x23\xfc\x58\x74\x92\x55\x27\x88\x0f\x2e\xe6\x8e\xdd\x3b\xf2\x8c\x4f\x4e\x31\x29\xa0\x8c\x60\x1a\x2c\x21\xab\x24\x36\xfe\xf6\xc1\xcb\x8b\x59\xf4\x61\x75\x7e\xfc\x60\x8d\x9d\x1c\x7e\x5c\xda\xe9\x22\x83\xb3\xe4\xef\x38\x99\x85\x55\x04\xdb\xaa\xb1\x2a\xac\xd5\x60\x86\xdc\xf1\x60\x5d\x0a\x24\x15\xb4\xef\xf3\xb3\x71\xd4\xa7\x63\x15\xbd\x52\xf4\x2e\xbe\x0e\xc8\xab\x99\x22\x24\xa0\x81\xcf\x04\x04\x32\x1a\xe5\x80\x7a\x44\x0f\xa1\x29\x00\x31\x89\x1a\x7d\x2b\xd5\x2f\x6e\xa9\xed\xb7\x21\xcf\x7b\x2d\x6d\x29\x96\x92\x2e\xf3\xd9\xab\x8a\xe3\xe5\xdf\x39\xec\xb6\xcb\xd0\x5f\x78\xd4\x7c\xc0\xc9\x4a\xa0\x49\x83\x60\x49\x26\x7e\xa8\xc9\xc7\xa8\x84\x46\x92\xf2\x96\x88\x31\xf1\x42\xe5\xf0\x1a\x9d\x8e\xf2\x44\x1f\x24\xa1\x1b\x71\x7e\x6e\x08\x48\x8c\xe8\xa5\xa6\x1b\x8c\x52\xf2\x81\x35\x0a\x9e\x55\xcf\xf8\x7b\x16\xc5\x3d\x8b\xe2\xe3\x88\xd3\x94\x6e\x6f\x7f\x38\xeb\x9e\xd6\xf6\x07\x6b\x25\x96\x29\x8e\x87\xad\xca\xb2\x51\xe2\xa7\x47\x87\xb9\x6d\x4d\x58\x10\xf7\x2d\xa3\xde\x0b\x4a\xd7\x4a\xce\x61\x30\x00\xa1\x1f\x91\x26\x37\xe4\xbc\x15\x59\x4d\xca\x13\x1f\x68\xc8\x03\x4b\xfa\x7f\x74\x84\x7d\x51\x81\xcc\xfd\x77\x87\x8d\xef\xc4\x2d\x07\x22\xf9\x87\x9c\x4a\xde\xe8\x61\xd6\x3c\x88\xb0\x7e\x8c\x4d\x77\xff\x2a\x11\x2f\xbf\xf9\x94\x4a\xca\xba\x33\x49\x4b\xa0\xe9\x85\x82\x96\x3e\xfb\x14\xef\xce\xf2\xc5\x8a\x50\x14\x2b\x60\x61\x3d\x6c\x5b\x39\x7f\xf2\x7d\x1f\x32\x62\xa8\x14\x8c\x2e\xb2\x26\xd0\x1f\x3c\x99\x7d\xaa\xc6\xf6\x07\x40\xda\xe3\x3e\x58\xdb\x82\x82\xbc\xa2\xae\x50\xa0\xf7\x3d\xb5\x39\x78\x5d\xca\x1d\xc8\xf7\x82\xfa\x6c\x88\xe6\x79\x90\x2c\x42\xa5\x50\x14\xfe\x3c\x29\xdd\x88\x26\x08\x0f\x99\x3e\xa7\x22\xc0\xc6\xa3\xe5\x17\xa9\xfb\x56\x1c\x05\x2d\x44\xd5\xee\x39\xd5\x60\xfc\x86\xde\xc1\xd4\xe3\xa7\x82\x2c\xbf\x3d\x4e\x36\xe3\x5b\x93\xa4\x78\xa8\x25\xba\xc4\x23\x0f\x59\x97\xb8\x91\x06\x03\x47\x9d\x8a\x0f\x48\x89\x0b\x00\x61\x21\x9c\x51\x45\x9a\x26\xa9\xcf\xfe\x61\x94\x8d\xa9\xae\x77\xbf\x39\xfa\x48\x7a\xf1\xc1\x51\xfd\xa5\x1d\xf7\x23\xf4\x16\xc5\x15\xf4\x32\x15\x34\x50\x3d\xee\x48\x2d\x0c\x92\x7b\xb2\x28\xa1\x28\x1e\x3f\x67\xc4\x9d\xd3\xc7\xba\x41\x3f\x4a\x02\xd0\x9b\x11\x7f\xa9\x15\x66\xe7\x27\x79\x10\x25\x05\x94\xa4\xdc\x47\xd3\x96\xa9\x23\x68\xdc\x06\x2c\xc5\xf0\x83\x13\x07\xb5\x3a\xb3\xd3\xab\x79\xa2\xbc\xec\x72\xe3\xa1\x4f\x17\x95\x53\x29\x5f\xaa\x5f\x8a\x17\xc3\x58\x8f\x90\x5f\x8c\x15\x04\x9c\x63\x6b\x0b\x70\x39\x5c\x2f\xa8\x52\xa2\xd2\x04\x25\x6c\x04\x19\x6f\x08\x29\x70\xcd\xae\xce\x13\x68\x68\x11\x87\x51\xca\x28\xcb\x83\x14\x43\x27\x72\x9e\xa7\x04\xbd\x03\x26\x89\xaa\x39\x03\xd7\x70\x82\xd3\x95\x46\x9f\xcb\x5e\x55\x00\x9d\x64\xca\x54\x5b\xbb\x55\x13\x35\x00\xfa\x58\x0e\x8b\x5b\x37\x9a\xfd\xd0\x18\xdb\x07\xd3\xd0\x7d\xe7\x98\xf7\xba\xb1\x13\xf2\x4f\x43\x54\x04\x31\x20\xcc\x36\x22\xd1\xc1\x4e\x8b\x9b\x61\xa4\x3e\x34\x38\x4b\x48\x83\xb2\x6a\xeb\x73\x28\x14\x95\x88\xa4\xd9\xec\xa5\x65\xdb\x81\xb5\x72\x8a\xda\x0f\x2f\x1f\xa7\x92\x31\xe3\xe5\x50\x6c\x51\x10\xda\x37\xb0\x23\xca\xb9\x11\x03\x1f\x29\x97\x03\x6f\x25\xa9\x6d\x30\x1e\x10\x1c\x22\x6f\x0e\x36\x94\x07\x39\x6f\x85\xeb\x60\x78\xcd\x39\x2d\x94\xcd\x8d\x30\x12\x5c\x9e\xd5\x29\x73\x00\xfb\x28\x48\xa3\x50\xa4\x28\x12\x32\x15\x2a\x94\x6c\xc6\xea\xf3\x45\x73\x20\x72\x12\x1e\x9b\x28\x82\x9c\x50\xb0\xa0\x7d\x27\x4d\xa2\xa8\x11\x34\xcf\xcb\xda\x5b\x12\xcc\x54\x62\xd1\x1e\x18\x34\xd3\x24\xcb\xf4\xec\x4c\x05\x4c\x47\x9f\x9f\x0a\xf2\x72\x65\xd4\x8c\x2b\xba\x82\x2c\x14\x83\x32\x66\x42\x49\xe2\x1d\xd4\x09\x14\x41\x52\xbb\xe1\xb8\x06\x09\x57\x88\x7b\xd8\xa3\x5c\x74\x9d\xef\x06\xc7\x6f\xac\x39\xa8\x9f\x30\x5b\x1b\x7d\xbe\x1e\x5e\xd4\xb3\xbf\xb4\x95\x85\xf1\xe0\x10\xa3\xf5\x4b\x1e\xef\xd6\x43\x8a\x23\x51\x49\xfb\xa5\x4c\xdf\x96\x68\xf4\xda\x90\x92\x0d\x89\x27\xb0\x53\x2b\xdc\x00\xf8\xb8\x0e\x60\xb4\x97\x79\x94\xa8\x79\x5f\x19\xda\x58\x01\xcb\x83\xc5\x41\x84\xe8\x8d\x9c\x94\x12\x3c\x82\x42\x07\xeb\x7d\x26\x49\x61\xbc\x75\xd9\xe4\x96\x6e\xf4\x72\xdb\x32\x0d\x26\x6e\x25\xba\x1a\x61\x64\x40\xee\xe1\xbb\xb9\xb8\x98\x97\xc7\x9f\xb6\xc7\xcc\x32\x91\x7d\x6b\x3f\xbb\x2a\x32\x87\xcc\xfd\xe3\xfd\x8f\x64\x8f\xfa\xe8\x7e\x7b\x3b\x7d\x78\x1b\xd5\x7a\x10\x45\x5c\xcd\x20\x50\x71\xc3\x1c\x9c\x3d\x3d\x88\x45\xd3\xdb\xe9\xce\x36\x62\xdc\x52\xca\x92\xb6\x21\x9a\x49\x87\x14\xa4\xaa\xad\x9f\x40\x14\x54\xbd\x74\x92\xb3\x81\x76\x54\x2e\x12\xb0\xb7\xd1\x1a\x01\xd9\xa0\x69\x0a\x87\x52\x85\xc0\x51\xc0\x66\xea\x6c\x50\x95\xc4\x32\x3d\x55\xef\x84\x71\x2f\x17\x3c\x4b\x82\xf3\xbc\x2b\xd2\x10\x71\xfb\x52\xc4\x61\x56\x55\x41\x61\x48\xdb\x51\xb2\x5e\x55\x83\xe2\xcc\x55\xa9\xf6\xc8\x47\x48\x64\x53\x2b\xb4\x63\x31\xcc\xe8\xc3\xb0\x24\x87\xf6\x0f\x90\x50\xa8\x28\xb5\xf5\x0a\xc1\x8d\xdb\x9e\x00\xcb\x5c\x1c\x46\x7c\x5c\x8e\x0b\x69\x04\x04\x9a\x4a\xe1\x8f\x76\xbf\x87\x84\xc2\x1a\x2a\xde\x87\xa8\x6f\x15\x34\x29\xeb\x14\xa8\x41\xb6\x0a\x34\x1a\x17\x44\x9b\x41\xbf\xc8\x89\x6a\x43\x8d\x5f\x54\x38\xa2\x20\x9c\x14\x1c\x93\xf2\x09\x24\xdb\x30\xe2\x8b\xe5\x60\xa3\xbe\xbf\x91\x40\xbf\xa8\x81\x2f\x04\xb8\xb1\xc8\x8c\x71\x8e\x45\x96\x4d\xa2\x93\x25\xcc\x28\x18\x10\xdd\xc7\x29\xf5\x65\x11\x8a\x45\xd6\x79\xb0\x9f\xf4\x30\x77\xed\x1d\x57\xb3\xa9\x1d\x1d\x54\x0a\x7b\x49\xe6\x7e\xe5\x2a\xef\x8d\x8e\x71\x81\x82\x3c\x0d\xfb\x49\x56\x10\x2b\xe9\x2c\xdf\xc9\x82\xbf\x12\x8f\xf1\x19\xe9\x30\x4d\x00\xd1\x83\x49\xb3\xb4\x28\xa7\x87\x3c\xa0\x4c\x92\x4f\x45\x85\x53\x27\x49\x8e\xfe\x03\x12\x30\x91\x68\x07\xcd\x3e\xbf\x30\x2d\x5f\xf2\x2f\x39\x63\xea\xcb\x97\x9c\xa7\xa2\x7d\x73\x0e\xfd\x46\xb7\xf4\xc9\x71\xbc\xb8\xb0\x6c\xc7\xb5\x7f\xe6\x0a\xf6\x22\xa6\xdf\x73\x4f\x7b\xd3\xba\xf6\x2a\xe8\x2e\xe8\x86\x5b\x35\x69\x2b\x80\xad\x3d\xa3\xd3\x9e\xd1\xe9\x71\x0b\x63\xfb\xb3\x7d\x6c\x8b\x55\xe0\xfe\xb7\x7d\xde\xff\x18\x0d\x78\x27\xe8\x22\x0e\x28\xb4\x4f\xde\xd2\xa9\x45\xa9\x72\xbb\xea\xb0\x60\xe5\x31\x81\x8e\x02\x5b\x55\xb1\xc5\xe4\x09\xdf\x10\x51\x57\xaf\xeb\x14\xc2\x7f\x95\xdf\x98\x44\x0e\x44\x23\x11\x36\x4c\x5d\x68\x14\xd9\xcd\xa0\x50\xbe\x7c\x3e\x4f\x25\x48\xa5\x44\x89\x5c\x30\x18\x77\x53\xa0\xe4\x29\x55\x8e\x40\xb0\xe4\x53\x58\x7d\x8d\xcc\x0d\x21\xb8\x30\x18\x52\xdb\x93\xcd\xd4\x01\xea\x1a\x0b\x45\x55\xd7\x88\x15\x40\x11\x1f\xb7\x85\x82\x64\x92\x4d\x96\x45\xe3\x6e\x4e\x9f\x4f\x45\xde\x4b\x63\x4a\x1b\xce\x37\xe4\xa9\x10\x3a\x96\x3a\x0b\xf8\xcb\xe2\xf3\xc6\x96\xad\x1c\x39\x41\xac\x2a\x66\xe0\x14\xcc\x62\xf7\x04\xe0\xdb\x24\xad\x16\x3c\xbc\x41\x5c\x2c\xd6\xc5\x25\x6c\xa1\xfc\xe4\xa4\x8a\x3d\xa6\x62\xa1\xbb\x95\xd1\x05\x6b\x88\x9e\x71\xbb\x00\x35\xed\x01\x4d\x0e\x50\x21\x5f\x58\x3f\x99\xa4\x9b\x80\xc5\x25\xff\xe2\x1b\x22\x68\xa1\xfe\xf7\xc2\xfa\xb2\x08\xa2\xfa\x62\xd7\xb8\xa6\x00\x1c\x97\x45\x27\xc9\x85\x9c\x58\x7c\x3c\x24\xc0\x09\x00\xc1\x9c\x90\x13\xa1\x2d\xac\x26\x2f\x2e\x59\x42\x72\x89\x9d\x61\xa7\x1e\x81\x9d\x6c\x65\xd8\x64\x7e\xc8\x59\xd9\xde\xbe\x3a\xe5\xfa\x55\xf1\x5d\xc6\x16\x56\x36\xa0\xbe\x63\x84\x7d\x77\x25\xbd\x1c\x46\xc2\x10\x61\x1a\x1c\x6a\xbf\x51\xf3\x16\x8c\xdf\xbc\x19\x74\x73\x20\xb3\xd6\xea\xa2\x56\x21\x0b\x90\xd5\x40\x33\xad\x2b\x68\x2a\xdb\xec\xf5\x8e\x1a\xfb\xa8\x53\xa4\x31\x7d\xd0\xf1\xde\xee\x20\x7c\x21\x25\x27\xd9\x47\x84\x8a\x2f\xcc\xe5\xb9\x5c\x84\x49\xca\x17\x04\xfe\xa5\xbf\x44\x98\xdb\x58\x1c\x39\xf3\xa3\xa4\xdd\x86\xc0\xa3\x44\xce\x5f\x43\x69\x21\x07\x0f\x40\xdf\x87\xa0\xc0\x19\x07\x18\x4b\x89\x6f\xb0\xd1\x3c\xec\x08\xf7\xae\x47\x9e\x14\xf6\x8c\x55\x95\xf5\x85\xed\xda\x0c\x32\xb3\x6d\x3e\xfb\x15\x87\xad\xec\x2e\x88\xe9\xf9\x2b\x67\xcf\xac\xc0\xc6\xb8\x94\x26\xdd\xec\x6c\x7a\x4b\x92\x44\xee\xcb\xbd\xa4\xf2\x86\x19\xd6\x5e\x7a\x80\x03\xc6\x01\x51\xde\xe1\x76\x64\x33\xda\xe4\x69\xaf\xc8\x7f\x54\xcf\x49\x51\x26\xd2\xbc\xef\xb3\x37\x8e\x59\x81\x83\x0a\x85\x7a\x41\x74\xa3\xa4\x2f\xb5\x74\xe0\x85\xfe\xd3\x03\xde\xb8\x7d\xc9\xc6\x44\x2d\xee\x0d\xa1\x85\xfe\xb5\xbd\x2c\xf4\xcb\x49\xa4\xfc\x5d\x8b\x55\x44\xca\xe6\x28\xec\x3c\xa7\x79\x70\xc8\xf7\x94\x9e\x5d\x28\x3d\x0d\xc3\x1d\x73\xc7\xee\xb8\xcf\x9f\x32\x84\xfb\xfc\x21\xe7\x85\xdb\xef\x36\xc7\xdc\x99\x7a\x41\xaa\xd2\xcd\xf4\x7e\x63\xaf\xe3\xf2\x96\xf3\xc5\x27\x33\xbf\x2a\x90\xd8\x5f\x4a\x5a\x0b\x61\x96\xf6\xe0\xd0\x78\x4b\xaf\xd5\x16\xe4\x85\x77\xff\xf3\x93\xbd\xd7\x3b\x43\x6f\x9b\xb2\x6b\xd0\x3b\x6f\x7b\x68\x02\x5e\x51\x8c\x4e\x1a\x97\x33\x26\x4f\x83\x10\xb3\xf9\x83\x66\xde\x0b\x22\x33\xd3\x98\xa2\xbc\x2f\x39\x6e\x4b\x17\x91\xcd\x61\x48\xd4\x25\xe7\x6a\xb2\x40\xdc\x26\x82\x28\xdf\xe8\x5f\x72\xae\x26\x2f\x9e\xbe\x70\xa5\xb8\xd8\x85\x4c\xbf\xa5\xa4\x65\x4b\xaf\x4f\x3d\x89\x7d\xd5\x61\xae\x8a\x5d\xbf\x55\xc4\xb4\x89\xb9\xbf\xe6\xa8\x70\xe5\x4f\x38\xa7\x8b\x40\x77\xde\xd6\x8f\x14\x11\xef\x36\x4e\x22\xcc\xfa\xa5\x85\x5b\xa8\xf9\x3e\x5f\x18\xa8\x34\x22\x6b\x63\x88\x2a\x85\xd4\x1b\x1d\x18\x66\x68\x9e\x44\xfd\x2f\x5c\xe7\x83\xd5\x43\x28\x5b\x90\x77\x4b\x0b\xb7\x1c\xd2\xeb\xb1\xa8\x9d\x1d\x3d\xfd\x37\x63\x8c\xe9\x58\x86\xcc\xfd\xfa\x98\xf7\x37\xfb\x75\x8a\xb7\x8e\xb2\x28\xc2\x1d\x30\x58\x69\x69\xe1\x16\x42\x5a\xd7\x2d\x30\xf3\x3e\x32\x41\xa7\xf2\xa2\x81\xaa\x7d\xba\x20\x7c\x1f\x61\x6b\x41\x31\x49\x05\x87\x0c\x62\x05\xfc\xa5\x36\x30\x95\xd0\x0c\x21\xa5\xe3\x86\x3d\x13\x6f\xc8\x3a\xaa\x00\xcf\x56\xab\xc0\xbc\x43\x43\xc3\xc4\x2c\xaf\xf3\x95\x7e\xdc\x3c\x09\x68\x87\xb3\xf0\x51\xa3\xa6\xa6\xfe\x52\x58\xd9\xe2\x96\x54\x00\xe2\x43\x39\x0f\xc8\x32\x4b\x09\x7d\x8c\x5b\xff\x81\x01\x45\x73\xd6\xa8\x28\x7a\x63\x2a\x42\x23\x53\x04\xcb\x8b\x13\xf3\x8e\x6c\x6f\xa9\xb4\xc0\x98\x02\x95\x6e\x4c\x0a\x38\x51\xd1\xde\x90\x78\xed\xb3\x3a\x5f\x34\xc8\x31\xe4\x44\xc6\x56\x16\x15\xd3\x48\xf2\xe4\x34\x04\xb5\x99\x37\x84\xa2\x1e\xc1\x27\x4b\xb5\xc1\xff\x54\x0e\xa4\x8a\x86\xa9\x5c\xac\x67\xb6\x6b\xd9\x2e\xdb\xb7\x32\xd8\x3a\x95\xfb\x9b\x28\x14\x7f\x60\xc4\xde\x49\x6d\x2b\xaa\xb6\x5a\xf9\x79\xcc\x6e\x57\x95\x1d\x18\xe6\x8a\x72\x4a\x9d\xa0\x51\xd5\x55\x75\x06\x65\x54\xa1\x95\x99\x9b\xf7\xf3\xd8\x73\x87\x27\xe4\x6c\xb1\x8b\xe8\x75\xfb\x90\x73\x88\x3d\xd5\xda\x2d\xe4\x6e\x52\xef\x04\xdd\xfa\x79\xd1\xcf\xdc\x83\xee\x81\x3a\xe0\xb0\xb2\x87\x1c\xce\x9e\x3c\xf8\x24\x64\xed\xef\x77\x47\x3b\x41\x97\xc9\xc2\xbe\xd3\x7a\xa4\x2b\x4f\x92\xf5\x8e\x48\xdb\x42\x96\xe7\x1e\x70\xf7\x51\x61\x87\xd8\xd3\x2a\x9e\xcc\x14\x1b\xca\x98\xbb\x1f\xde\x62\xec\x04\x2b\x09\x67\x77\x46\xc1\xb0\x3e\x5d\x39\xa8\x8b\x2e\xdf\xc0\x67\x60\xa4\x2d\xe9\x75\x9a\x95\x44\xba\x7b\xa3\x2a\xe6\xbb\x3b\x61\x0c\xa4\x52\x83\x34\x5c\x43\x8b\x7b\xe3\x01\x76\x15\x0d\x12\x6e\x09\xee\x3f\xee\xf7\x3e\xb6\x7f\xc1\xbc\xb4\x55\xe0\x19\x65\xe2\xca\x63\x39\x64\xb0\xc3\x74\x0a\x20\x50\xb6\x29\xb2\xac\x98\x09\x05\x97\x5f\xf1\xa0\x09\x3d\xa2\xd0\x03\x91\x8e\x06\x63\x85\xfb\x22\x47\x6f\xac\xde\x5d\x86\xcf\x72\x2b\xa1\x6a\xae\x80\x0c\x50\x48\xf1\x60\xb1\xed\x16\x1a\x18\x60\x5e\x68\xab\xbb\x51\xbb\xa2\xe6\xa0\xa8\xa9\xba\xaa\xa8\x3a\xd2\xaa\xed\xd7\x89\xef\x22\x93\x75\x6d\xf4\x61\xc3\x33\x24\x6e\x90\xa9\xb0\x5e\x68\x4c\x27\x48\xcf\x13\xea\x38\xb0\x47\x00\x96\x80\x94\xc1\xe0\x8c\x0e\xa0\xe8\xa4\x97\x4f\xe0\x76\x71\x5e\xf4\xb5\x55\x27\xe8\x56\x91\x3f\x21\xcc\x03\x56\x57\x23\x39\xef\xa2\x89\xda\xaf\xa0\x6b\xd7\x0a\x5b\x72\x67\x20\x27\x68\xdc\xa2\x28\x25\x38\xd8\x22\xa3\x10\x70\x10\x17\x00\xc2\x8a\xbf\x43\xf7\x36\xa8\x76\x41\x2f\x4f\xe4\xe4\x41\xa6\x53\xd9\x4f\x5b\x0e\x23\x75\x08\xa4\x46\x60\xca\xdb\xe2\x3a\xe2\x4f\x22\xdc\x4c\x3b\x11\x19\xcf\x3a\x49\xa2\x40\xd8\x64\xff\x14\x78\xf7\x48\x9f\xac\xb6\x54\xb0\x88\x29\xca\x0c\x28\xec\x54\x90\xb6\x4d\x21\x27\x62\xf4\xdd\x1b\x9d\x8d\xda\x3b\xd2\x0f\x15\x7e\x73\xf0\x33\xcb\xf6\xab\xfe\xc9\xfc\x07\x9c\x1b\xd9\x0d\x8f\xf8\x28\x6e\x42\xd9\xac\xb1\x0a\xbd\xce\x7d\xbe\x5a\xe2\xc7\xce\x98\x5b\x9c\x25\x7e\xb5\xc9\xdc\xe0\x6e\xa3\x58\x7b\x6b\xc5\xdf\xcd\x2c\x15\xd0\xbd\x5d\x95\x7d\x3c\x4f\xf2\x20\x2a\x6f\xa2\xa8\x2c\x14\x88\x08\x86\xfa\xd3\x80\x11\xb3\x0a\xff\x23\x87\x3d\xa3\xc2\x79\x38\x1f\x74\xd1\x9f\x12\x8a\xcc\xfd\xa4\xe3\x3d\x67\xae\xd5\xca\x28\x8c\x43\xce\x94\x8c\x2f\x9d\x5d\x59\x7c\x21\x6f\x1a\xcf\xe1\xe4\x51\x09\x38\x05\xcc\xa7\x6d\xbc\x79\x39\x3b\xc6\x46\x82\x56\xcb\xf5\x3d\x77\x0e\x94\x21\xb3\x8c\x2d\x7c\x06\xd7\xb3\xd1\x56\x9a\x74\xdd\x29\xef\x49\xcb\x34\x5b\x77\xf8\xe6\x1b\xaf\xb6\xc2\xb6\x0a\x7b\x95\x3f\xbf\xb2\x78\x26\x69\x89\x85\x34\xbc\x20\x52\xf7\xeb\x57\x79\xf7\x58\x57\x08\xa9\x6b\xc8\xf9\xa0\x1c\x82\x97\xc4\x82\xcf\xaf\x2c\xf2\x16\xbe\x4b\x19\x2c\x08\x33\x8f\xe8\x13\x84\x52\x7d\xc9\xd9\x2f\x7f\x2d\x2e\x58\x1d\xf3\xa7\x57\xb2\x9f\x19\x65\x74\xc7\xfd\xf1\x51\xef\xfd\xa3\xf8\xb7\x5a\x05\xe0\xf3\xd4\x0b\x94\xbe\x82\x87\xd2\x64\x9d\x5f\x08\xc5\xa6\x85\x86\x8e\xc8\x8c\x99\x19\x11\x8d\x4a\x22\x91\xc9\x12\x64\x85\x62\x26\xc6\x63\x0a\xcd\xca\x56\x82\xe8\xef\x1b\xca\xd7\x83\x08\xb3\x49\x47\xc4\xcd\x08\xc9\x07\xd6\xc1\x11\xde\x12\x59\x09\x56\xd6\xf8\x1c\x5a\x2b\x74\x8a\x16\x22\x5e\x42\x2b\x82\x8c\x7b\xf2\x8f\x69\x0f\x3d\xe7\xa8\x6a\x99\x15\xb1\x5f\x36\xaa\x60\xbc\x3d\xe7\x51\x80\x8f\xf1\x4d\x08\x8c\x06\x48\xed\xa4\xd3\x01\x21\x9b\x54\x95\x2e\x2b\x84\x36\x40\x6d\x6c\xc4\x34\x32\x85\xe2\x8b\x60\xbb\x61\x6e\x18\xdb\x75\xcf\x2a\xfa\x2f\x0b\xea\x17\x04\x3c\x5a\x96\xe5\xb5\xc5\x85\xc2\xc0\x5d\xfa\x36\x02\x0d\xc7\x2d\x91\x42\xea\xdc\x24\xa5\xdf\x60\x8b\x54\x42\x9a\x1c\x52\xea\xa2\x32\x9f\x48\x5a\x05\x43\xfe\xe9\x7d\xec\x4a\xc5\x26\x7f\xbb\xd4\x9f\x7e\x62\x9f\xf7\xf6\x7d\xe6\x95\xb2\x59\x46\x6a\x59\x36\x30\x65\x31\xad\xa8\x5f\x03\x3d\x97\x33\xc5\x7c\x05\xe6\x26\x98\xd0\x3a\xad\x30\xcc\xcd\xac\x5d\x88\xd6\x5f\x2f\x98\xed\xe1\x33\xca\xf4\x5f\xb4\x5a\x45\xb5\x78\x26\x57\xc6\xbd\x49\x2c\xbc\x49\xfb\x5a\x2a\xda\x61\x12\x7b\x13\x3b\xa9\x92\x1e\x34\x5d\x1f\x3d\x71\xec\xfa\x18\xf1\x6f\xca\x74\xa6\x42\x30\x60\x74\x10\xb6\x4d\xbe\x9d\x0d\xbc\xaa\xd8\x25\xe5\x27\xc3\x3c\xe3\xf2\x38\x88\x14\x10\x64\xf0\x2b\x4f\x49\xe0\x31\xd0\x85\x20\x9b\x92\x06\x44\x57\x64\x36\xd6\x34\x43\x3a\xb5\x41\x14\x77\xfa\x70\x61\x83\xc6\x78\xa1\x0b\x86\x58\x30\x6a\x02\xe2\x1a\xd2\xc9\x54\xd8\x86\x39\xc0\x08\x42\xad\x23\x7b\x40\xb9\xd1\xa1\x52\x04\xc4\x83\xe1\x1b\xc5\x65\xab\x27\x68\x5a\x52\x92\x06\x6e\xde\xe1\xba\x1a\x1e\x4d\xde\xa0\xf0\x53\xd5\xbb\x5b\xb9\x85\x7f\xda\x61\x57\x10\xaf\x84\x94\x5d\xee\x8f\x6c\x01\xa1\x66\x8a\x71\xf4\x30\x48\xb9\xad\x31\xfd\xbc\xc8\x28\xa8\x8c\xbf\x42\x2b\x5e\x9b\x33\xd1\x50\x53\x20\xf2\xd8\x00\xdc\xc0\xdb\xa3\x91\x75\xca\xab\xb1\x21\xf5\x02\xf6\x80\x43\x54\x03\x1f\x70\xbc\xb7\x39\xda\xf5\x57\x52\xfc\x8c\xdd\x81\x84\x83\x69\x8c\xa4\xc8\x4a\xfa\xc0\xe9\x73\x2b\xab\x16\xac\x45\x8c\xf0\xf6\x79\x2f\x35\x58\x41\x64\x89\xb7\x8a\x7c\x29\xea\xb5\xc3\xf8\x4c\xd0\x11\xe3\x13\x90\x56\x49\x6a\x94\x14\xe5\x38\xde\x66\x37\xff\xf9\x18\x9b\xde\xd6\x7f\x83\x2e\x92\x8e\x88\x95\x3d\xed\x13\x63\xde\x7c\xf5\xad\x41\x10\xb6\x80\x97\x9f\xd4\xba\xea\x25\x67\x0c\x25\xaf\x68\x59\xdb\xdf\x17\x0f\xb0\x3f\x77\xd8\x15\x2d\xf0\xc7\xa0\xf3\xe8\xf7\x1d\x76\x74\x07\xc3\x3f\xe0\x75\xf2\x3e\xe8\xac\x2a\xa4\xbc\xa1\x2e\xa0\x56\xc9\xf1\x03\x7e\x43\x29\x74\xcc\xf1\x85\x64\x50\x30\x64\x51\x1e\x12\x75\x3b\xb1\x3d\x49\x39\x25\x35\x4a\x92\xf9\x15\x45\xfa\xc2\xc7\x17\x28\x7d\xb8\x4e\x6d\x4f\x7d\x68\x2d\xfe\x7a\x0c\x5a\x4b\x9b\xdd\xe5\x6c\x6d\x45\x91\x5b\xb4\xf6\x27\x1c\xa6\xc7\xdd\xfd\x61\xc7\x7b\x87\xb3\x68\xd1\x84\xd2\x92\x0c\x81\x46\x49\x9e\x75\xd6\x7b\xc0\x82\x43\xaf\x3c\x56\xf5\x04\xdd\x98\xdc\x51\xec\x33\x35\xe6\x06\x7a\x06\x9f\x56\xe6\xf3\x8f\xd4\xbc\x37\xd5\xce\x75\xe1\x38\xac\xaa\x4a\x5f\x99\x2c\x51\xdd\x74\x35\xe4\x07\xc6\x5a\xc7\x7d\x4b\x99\x2c\xaf\xe6\x72\x55\x09\x1f\x8c\x52\x95\xa5\x28\x07\xdb\x61\x9e\xc8\x83\x78\x26\x17\x54\x9c\xf3\x3b\x83\x30\x3f\x99\xa4\x85\x4b\x13\x49\x3c\x21\xb9\xfa\xb1\xea\xb6\x07\x4a\x92\xdc\x3c\x20\xfd\xcf\xe7\xb1\xd3\x97\xd5\x2b\xe9\xbe\xf7\x79\xde\xdd\x65\x7f\x23\x38\x82\xe4\xc5\x3a\x5e\x35\xac\xb6\x76\xae\xcc\x42\x1a\xac\xe7\xfc\x28\x1f\x27\x3e\xb0\x97\x65\x49\x5c\x47\x0f\x1c\x50\x82\x4d\x94\x38\x18\x6f\x66\x3f\x34\xca\xfe\x8d\x65\x31\xea\x04\x5d\xb4\x3e\xfd\xc7\x51\xef\xef\x47\x2a\x6f\x71\xf0\x02\x05\x98\x86\xa8\xf9\x84\x13\xbe\xde\x4b\xc1\xbc\xa9\x22\xbc\x41\x83\xd0\x5b\x23\x8e\x96\xee\x01\x7b\xc4\x7a\x03\x2c\x52\xc6\x36\x2f\xb5\x65\x48\x3e\x3a\x52\x26\xa7\x98\x65\x6c\x7a\x82\xaf\xb5\xd3\x20\xee\x45\x41\xba\x36\xcb\x94\x3d\x31\x83\x33\x33\xd1\x4d\xa0\xdb\x02\x7e\x8f\x9f\x17\xfd\x3a\xda\x25\xba\x41\x98\x66\x98\xe6\x0d\x51\x2b\x46\xce\x65\x18\x63\x1a\x86\x88\x73\x2c\x11\x54\x10\x78\x0a\x7d\x03\xe3\x10\x6a\x22\xd5\x03\xb8\x08\xcc\xe8\x71\x68\x40\xe0\x64\xa2\x1b\xa4\x40\x61\x06\x3c\xda\x13\x3a\x64\x86\x69\xc3\xb5\x0a\x25\xa4\x8c\xa6\x5e\x8a\xe0\xf9\x11\xd6\xd4\x67\x47\x26\xf8\x5a\x90\x27\x9d\xb0\xb9\x36\x5b\x28\xb7\x72\x3b\xa2\xf4\x2b\x88\xe4\x94\x4a\x79\xa4\xe6\xf9\x24\xa0\x09\xc8\xab\xcd\x20\x0a\x52\xb2\xb5\xce\x41\x21\xd8\x7e\x4d\xaa\x14\xe7\x61\x8a\x01\x8f\xdd\x28\x68\x5a\xae\x92\x92\xf6\x7d\x0d\xab\x85\x2d\xd7\xd2\x65\x3a\xca\x2d\xda\x62\x8d\xcb\x89\x33\x32\xe0\x89\x9f\x93\xaa\x14\x7b\x06\x1b\xeb\x04\x17\xc1\xff\xea\x3e\x91\x9c\x3f\xd6\x41\x9f\xb3\x83\x9d\xe0\xe2\x29\x11\xb7\xf3\x8d\xea\x27\x9e\xc9\xae\xea\x04\x17\x97\xd0\xda\x2b\xcf\xfd\x95\x4f\xf5\xd8\xbe\x24\x16\x67\xd7\xdd\xc8\x54\xe4\x5e\xca\xee\x61\x77\x3f\x8a\xcd\x64\x4f\x62\xfb\xf2\x30\x8f\x84\xdd\xc9\x4f\x66\x07\x9e\x89\x6b\xd7\xbe\x7e\x81\x7d\x47\xe1\x84\xc1\x4e\x69\xb2\xe0\x51\x1d\x86\x5b\x92\x24\x62\x4f\x95\x0a\x8c\x0e\x2d\xb7\xeb\xc4\xd9\x13\xc4\x45\x42\x07\x3a\x8d\x76\x5f\xf7\x4a\x6b\xbf\x69\xb1\x91\x38\xc9\xdd\x47\xb9\x27\x9f\xcc\x0e\x10\x8f\xbb\x5d\xbf\x27\xb2\xd1\x67\xa6\x62\xdd\xbe\xf8\x0a\xf6\xa4\xa2\x23\x8d\xa9\xf1\x98\xf4\x66\x8f\xed\x0b\xa2\xe8\x31\x9f\x6a\x4f\x67\x07\x3a\xc1\x45\x18\x9f\x27\xba\xfb\x5b\x49\xaf\x11\xa1\xc5\x8f\x7c\x50\xdf\xcd\xc6\xd4\x11\xdc\x7d\xea\x16\xa7\x99\x27\x12\xb2\xb0\x75\xf1\x4b\xfb\x87\xfa\x32\x3e\xb3\xdf\xfb\xc4\xfe\xea\x7b\xf6\x76\x02\x9f\xbb\x1c\xbb\x49\x12\x53\x74\xb2\xb5\x85\xcc\x0c\xd9\x42\x2e\xa7\xa0\xc5\xcf\xee\x50\xd2\x96\x1a\x82\x05\x51\x68\x96\x6a\x87\x54\xad\xa0\xa7\x92\x75\xac\xdb\x78\x96\xa7\xbd\x66\x3e\x49\x9f\x9f\xe4\xbe\xef\x4f\xe0\x8e\x91\x89\x5c\x6d\x83\x2b\x00\xbd\x9a\x0a\x1d\xa5\xad\xf4\x2d\x79\x74\x85\xde\xd0\x91\x91\x20\xcd\x4b\x8c\xe5\x14\xd8\x74\x22\x68\x6e\x60\x79\xb8\x6d\x16\x9c\x99\xea\xe3\x85\x12\x00\x05\x54\xeb\x0c\xaa\x87\x21\x78\x8a\x9a\x89\x63\x3d\xf8\x52\x31\x35\xd4\x5b\x3e\x9b\x99\xe0\x6b\x9d\xa0\x6b\x6f\xf1\x34\xc0\x84\xa2\x83\x3b\x5c\x58\x30\x61\x85\x69\x81\xf0\x8a\x44\xf1\x80\x5f\x21\x77\xf7\x8b\xf2\x98\x8f\x45\x29\xec\x0d\xca\x62\x03\xbd\xb1\xe3\x73\x20\x2c\x07\x3d\x57\x53\xb3\xf6\xa4\x5e\x0c\x0e\x34\xf4\x86\x74\x82\x2e\xcf\x83\x36\x8d\x59\xd5\x0c\xa4\x70\x2d\x68\xa2\x05\x36\x0b\xa3\x89\x36\x15\x66\x86\x8e\x61\x7b\x51\x13\x90\xbd\x63\x67\xcb\xfc\x56\x8d\x1d\x20\xb5\xc1\xfd\x95\x1a\x5b\xba\xdc\x92\xc2\xfb\x6b\xa7\x55\xf0\x1e\x06\x5a\x45\xc1\x91\x07\x76\xc2\x58\xf3\x8b\xe2\x90\xa3\xd6\xa4\xe3\xdf\x88\x3b\x46\x91\xbf\x12\x99\x2b\x98\xc6\xf0\x4c\x6f\xf1\x09\x18\x2f\x99\xbc\xaf\xfe\xe0\x63\xaa\x91\xd8\x95\x2a\xad\x43\x4f\x46\x95\x91\x5e\xd8\x28\x2f\x4c\x83\x1b\x2b\x16\x9b\x22\x9d\x18\x5a\x1e\xe4\x10\x80\xfa\x10\xc6\x5b\xa9\x0f\x1f\x1e\xdd\xd2\x9f\xfb\x86\x51\xef\x2f\x46\x86\xdf\xaf\x92\x70\x7a\xad\x0d\x9b\xf9\x72\xb2\x83\x26\x89\x64\x65\xaa\x5d\x50\x1e\x4c\xaf\x40\x61\xe0\xc9\xd9\x4c\x46\x98\x4e\xd0\x55\xe8\x32\x79\xd0\x46\x3b\x4b\xb5\x54\x84\x35\x02\x8b\x42\xbe\xe7\x55\xd7\xc2\x33\x24\x2c\xe5\xc5\x78\x9d\xa0\xeb\xf9\x7c\x2e\xca\x12\x83\x44\xda\x44\xab\xd6\x98\x6f\x41\x8e\x31\x5e\x83\x32\x03\xe6\x7f\x8b\x8e\x6e\x2a\xfe\x60\x23\x8c\x5a\x1c\x05\x9b\x9c\x08\xe3\x71\xc2\x63\x91\xa9\x19\xa5\x8d\xb9\x13\x84\x75\xd5\xd5\x1b\xb6\xf1\x6d\xf8\x10\x45\x59\x34\x44\x11\x8f\x90\xa4\x4a\x00\x58\x53\x7a\xd2\x22\x54\x4a\x32\xab\x54\x34\x65\x62\xb6\xb7\xd2\xcc\x71\x67\x90\xc2\x72\x2b\x53\xdf\xab\x1c\x76\x0d\xa9\x21\x86\x5a\xd1\x79\xe0\x51\xdf\xde\xcd\xa3\xe9\x2b\x18\xeb\x3e\x6e\x1f\xff\xc2\x08\x7b\xba\x35\xa5\x44\xa7\x21\x5a\x2d\xd1\xaa\x2b\xbb\xa4\xfb\xf1\x11\xef\x03\x23\x5b\x3f\x63\x04\xa8\x92\xb7\x41\x7b\x94\xe5\xc9\x8b\x1e\x37\xcd\xd1\xc4\xdf\x47\xe8\x0a\x93\xb8\xca\x56\xfb\x5d\x71\x5a\x8a\x23\xa9\x09\x14\xb8\x0b\x28\xc3\x61\xb1\xa9\xf9\xa9\xac\xdc\x44\x62\x48\x31\x22\x86\x32\x92\x0a\x39\xc4\x04\x8d\xaf\x2b\xa0\x5e\x3b\x1f\xc6\xad\x49\x5e\x04\xdc\xa2\xea\x41\xa6\x15\x98\x4f\x2a\xcf\xb7\x65\xbb\x9f\x7d\x5b\x0a\xa8\x1d\xa7\xde\x43\x4e\x87\x3a\x1d\x4d\xed\x3a\x35\x04\x04\x1a\xa3\x93\x49\x9b\xa4\x71\x49\xc3\x5d\xca\x15\x20\x41\x1d\x66\x1c\xcd\x4e\xc5\x6a\x19\xef\x75\x01\x45\xaa\x54\xed\x49\x5d\xe7\x09\xdb\x66\x14\xb2\x51\x11\xf7\x3a\x6e\x60\xce\xfd\x55\xb6\x7c\xf9\x37\x22\x96\xb1\x2b\x95\x25\x66\x21\x69\x5e\x76\x9d\xfc\x44\x51\x76\x4f\xb3\x64\xb2\x07\xaf\x61\xfb\xd1\x80\xe5\x7e\xf8\x1a\xef\x7d\xd7\xe0\xdf\x34\xdd\xce\x76\x45\x3c\xb7\xb4\xc8\x2f\xcc\x70\xba\x8e\xab\xdd\x57\xcc\x1b\x74\x99\x2c\x08\xc8\x1b\x50\x0e\xb2\x33\x1f\xd1\x73\x61\x96\xb1\x3a\x6f\x64\x49\x8c\x23\x15\xb6\x66\xe5\xfe\x99\x25\x5a\xad\x5a\x5c\x50\x44\x08\xfc\xc8\x51\xde\xdc\x08\xd2\xa0\x09\x79\xa9\x1b\xe2\xa2\x0a\x10\xae\xf3\x5e\x1a\xce\xca\x8a\x9e\x5b\x5e\x84\xf4\x98\x20\xa5\x80\x97\x5b\x93\x28\x88\xdb\x3c\x16\xf9\xe1\x5e\x1a\xf9\x4b\xf2\x06\xc1\xc7\xc8\x67\xeb\x5c\x74\x82\x30\x9a\xc5\x35\x15\x84\x91\x95\x64\x53\x55\x8a\x7c\x08\x8b\xa1\xbc\x0c\x5e\x07\x94\xc4\x38\xe8\x88\x59\x64\xf0\x0e\x5b\xe5\xc0\x71\x10\xa1\x31\x5f\x84\xc8\x6f\x91\x23\x1e\x65\x8c\xe8\x58\x99\xc9\xb0\x0b\xac\x97\x53\x33\x47\x27\x79\x46\x08\xae\x33\xfe\x34\xbf\x7b\xf9\xe4\xbc\xbc\x7a\x8f\xcf\xeb\x3c\xec\x5e\x38\x3a\x8b\x28\x91\x17\x8e\x02\x54\x64\x75\x4d\xb1\x92\x8b\x4b\xf8\xca\x71\xf5\xca\xf1\x9d\xbd\xd2\x0c\x5b\xa9\x6c\x0e\xa4\xdf\x6c\xf9\x38\x3c\x51\xe7\x9d\xa0\x29\x9f\x3f\x3d\x37\xbf\x5d\x17\xe2\x6b\xf2\xc1\x3a\xef\xf5\x60\xc4\x63\x7e\xee\x9c\x72\xac\xc2\x2a\xcf\x78\xaf\xdb\x45\x92\x50\xb3\x7b\x30\x24\xb3\x2d\x2e\xf2\xf1\x9b\xc3\x89\x97\xdc\x3d\x55\xbf\x21\xa8\xaf\xdf\xf3\x8a\xeb\xef\xaf\xdf\xac\x7f\x1c\xdd\xd9\x8f\xe9\x23\xf7\x3f\x93\x6a\x30\xa3\xab\x30\x73\x19\xeb\x30\xa3\x7f\xcd\xec\xa4\x12\x47\x75\x25\x8e\x5e\xc6\x4a\x1c\xb5\x2b\x71\xfd\x0d\x41\xe3\x9e\xea\x7a\x19\x55\x39\xa6\xab\x72\xec\x32\x56\xe5\xd8\xc3\xad\x4a\x98\x35\x62\x9c\xb6\x2b\xb7\x9c\x99\x9e\x92\x8a\x0c\xfc\x35\xa3\x22\x63\x68\xf9\xc3\xf9\xc7\x9b\x9a\x39\x32\x7d\xdd\xb1\xe9\xa9\xa3\x33\x1e\xf0\x7d\xdf\x70\xdd\xf5\x75\x7d\x6d\xda\xa3\xf2\xa6\xa7\xcc\x12\xb7\x2b\x87\xde\x99\x29\xde\xa9\xfe\xf6\xe0\xb7\x9a\xa9\x68\x85\x79\x33\x48\x41\xa0\xe1\x2f\x2e\x7f\xaa\xf7\x2b\x7b\xf0\x25\xe3\x37\xcf\xc2\x88\x41\x1f\x8c\xdf\x3c\x8b\x7f\xcf\xdc\x3f\x71\xf3\x7d\xc7\xee\x9e\xae\x1f\xbb\x87\x6e\x1e\xbd\xff\xbe\xe3\xe3\x37\xcf\x4e\x4d\x4f\xdf\x07\xdd\x8a\xd7\x27\xf4\xab\xf7\xcd\xdc\x7d\xf4\x3a\xf5\xf0\xcc\xfd\xf7\xcd\xc8\x87\xef\x9e\xaa\x1f\xbb\xe7\xbe\xbb\x8f\x5f\x6f\x3f\x3d\x7d\xff\x7d\xe3\x37\xcf\x1e\x99\x9e\x99\xbe\x6f\xfa\xfa\xa9\xa9\xfb\x66\x8e\xbd\xb8\x25\x3f\xf9\xe2\x96\xbc\x37\xf1\xcc\xc2\xc5\x11\x43\x04\x5a\x5b\xb6\xa4\x90\xc3\x9d\xf0\x22\x06\x3e\xd7\x79\x96\xc9\xf1\xe2\xe7\xfc\x15\x9f\x03\x18\x48\x84\x68\x91\x61\xde\x57\xcd\x2e\xb6\x03\xa3\xd5\xf0\xbd\xbb\xeb\xfc\x9e\x9b\x5f\xdc\x7a\xc5\x11\xfd\xd7\x51\x98\x05\x1b\xe2\x62\x33\x89\x92\x14\xc6\x60\x43\x5c\x0c\x5a\xa2\x19\x76\x82\x88\xc3\x55\xde\x4c\x5a\x74\x02\xf6\xae\x3d\x09\xff\xcd\x56\x7f\xe4\xda\x9b\xc7\x69\x82\xcd\xd5\x4f\xca\x3e\xbd\xcf\xfc\x79\x5c\x36\xb4\xce\xd3\x76\xa3\xf8\xd8\xf2\xad\xb7\x0c\x7c\x24\x6d\x37\xe8\x6b\x69\xbb\x31\x7e\xe4\xd8\xb1\x49\xfa\xdf\x0d\x72\xd4\x1b\xfd\x5c\xcc\xf2\x46\x90\x89\xe3\x47\x35\x60\x76\x23\x8c\x83\xb4\x8f\xa0\x62\x75\xae\x70\x58\x67\xa1\x47\x81\xeb\x3e\x59\x2f\x36\x32\xb9\x29\xca\x3e\x04\x40\x14\x6b\x8e\x1d\x99\x9a\x3a\x5e\x9f\x9a\xae\x4f\x1d\xf1\x4a\x9b\x86\x54\x6d\xea\xf0\x42\x18\xcb\x1d\x64\x66\x66\xe6\x06\x59\x14\xf1\x90\x40\x71\x8a\x93\xc4\x2e\xf2\x08\x8f\x33\xaf\x52\x4e\x83\x26\x09\x82\x7a\x41\xd3\x99\xa4\xe0\x4a\x0a\x72\xb0\x20\x21\xc6\x8b\x3c\xd1\x14\x85\x93\x6e\x80\xad\x90\x25\xe8\x96\x20\xe3\xbd\xdd\x9c\xe9\xa3\xf5\xe9\x23\xf5\xe9\x63\xab\xd3\x37\xcc\xce\x4c\xcd\x1e\x99\xf2\xa7\xa6\xa6\xee\x2a\x37\x4e\xbe\x5e\x47\x62\x7b\xdd\x38\xcb\x2e\xf0\x6f\xd9\x58\xdc\x8b\xc0\xa3\x5f\x32\xbb\xf6\xd8\xbe\x20\xee\x3f\xe6\x66\xc6\x7b\xd8\x01\x0a\x9a\x72\x1f\x0d\xed\xd0\x32\x37\x93\x39\xd3\x6e\xf7\x33\xd8\x58\x27\x8c\xb7\x70\x19\x3c\x9d\x1d\xa0\x00\xe5\x6a\x43\xe8\x6b\x47\x4a\x27\xfe\x30\xce\xeb\x49\x5a\xc7\x1e\x77\xff\xac\xe6\xfd\x5e\x6d\xf8\x7d\x8b\xbf\x5d\x05\x43\xe8\xc3\x8b\x4a\x03\xc0\x24\xdd\x36\x26\xd9\x06\x5a\x9f\x5c\xa4\xcc\x3b\xb0\x40\x62\x0c\x3c\x85\xa0\x28\xe7\x98\x15\xc9\x0f\x26\xd4\x8c\xce\xcf\x90\x9e\xd7\x3f\xbb\xce\x11\x5c\xa3\x13\xe6\xf2\xb0\x11\xae\x1b\xf2\x80\xc0\xc9\x73\x4b\x31\xa5\xe3\x2a\x99\x43\xa1\x08\xb0\xb4\x61\x98\xfa\x2c\xd7\x9e\x96\xe2\x12\xcd\xbd\x23\x13\x1c\x0c\xd9\xf4\x78\xf1\x6a\xe5\xcb\x03\xaf\xc3\x15\xdf\xf7\xf9\xbd\x22\x4d\x14\x5f\x95\x35\x94\xef\x1e\x61\xcf\xdc\xc9\xf1\xc8\xfd\x8b\x9a\xf7\x95\xda\x8e\x0e\x52\x59\x9e\x74\xb3\x72\x1c\x72\x4b\x34\x13\x00\x21\xca\x72\x41\xa1\xd9\xdd\xb4\x07\xf1\x9e\xf4\x1a\x06\x2a\x29\xe4\xe7\xe2\x1c\x45\x41\xba\x0a\xb9\x48\x8a\x18\xf4\xb9\xa2\x71\x37\x58\x5f\x07\xb8\x66\x2a\x25\x95\xdb\x41\x06\x10\x73\x04\xad\xb3\x19\x22\x6b\x94\x0a\x65\x8a\xa5\x0c\x89\xf4\xd7\x0b\x07\x61\xb8\x0e\x26\x91\x22\x6f\x41\x4e\xb0\x24\xe5\x55\x6e\x0c\x93\xb8\xbf\xa8\xa3\x55\x31\xf0\x5f\x6a\x63\x09\x64\xad\x9a\x26\x3e\x1f\x33\x40\xe0\xe4\x98\xa4\x8d\xb0\xd5\x12\xb1\x7d\x20\xbc\x8f\x5d\x61\xac\xec\xc7\xda\xc8\xf0\x7a\x87\x5d\xa9\xfc\xb4\xcd\x50\x64\xee\xbd\x0f\x38\x11\x7b\x19\xdb\x78\x54\xbd\x37\x98\x8c\x0d\x8e\x49\xb3\x32\xcf\x64\x57\x75\xc2\x78\x3b\x07\xe3\x77\x31\xa6\x6c\xee\x67\xd7\xab\x05\xcf\xd3\xd8\x15\xbd\x38\x7c\x79\x4f\xa0\xf0\xb2\xc5\xda\x4f\x5c\xc9\x66\x1f\x19\xb7\x28\xc0\x7e\xfe\xd5\x15\xde\x4b\xb7\xb8\x5f\x86\x00\xa5\xc4\x8d\xf5\x5e\xdc\xc4\xd9\x65\xe0\x3c\x0d\x29\xc6\xbf\xe4\x5c\x0d\x7f\xad\x06\x69\x5b\xe4\xcb\x62\xfd\x92\x73\x45\x27\xb8\x48\x8c\x2a\x76\x8e\xdf\xd7\x18\xfb\x31\x87\x99\xb7\xdd\xf7\x38\x2a\x00\xfc\xd5\x8e\x71\x5d\x45\x61\x81\xf6\xcd\xa3\xb0\x13\xe6\x3a\x98\xbe\x08\x11\x4f\xd5\xd3\x80\xe2\x24\xd7\x2a\x04\x7b\x14\x04\xa8\x72\xc2\xc3\x9f\xbc\xd7\x05\x2b\x4f\x01\xa1\x1c\x69\xc8\x8b\x4e\x18\xab\xcf\xda\xb1\xea\x0f\x8e\xb2\x03\x1d\x91\xa7\x61\x33\x73\x1f\x18\xf5\xbe\x3c\x42\x3f\x6c\xf8\x68\x2b\x74\x1a\xb3\xe8\xa8\x2e\x04\x18\x95\xf0\x66\x10\x35\x21\x54\xc0\xea\x66\xaa\x3d\xc6\xb8\x43\x84\x01\x27\x57\x5d\xe9\x16\xe1\x6a\x41\xa4\x00\xd5\xc0\x24\x20\x99\xf0\x31\xa3\xaa\xba\x5c\x58\xf6\xf4\xf9\x96\x72\x00\x69\xeb\x32\x28\x31\xbc\x21\xf2\x4d\x41\x89\x1a\x39\x8c\x23\xed\x5d\x1a\xad\x59\x21\x5e\xc2\x55\x52\xdf\x07\xd3\x86\xba\x49\x2b\xf3\x39\x3f\x91\xb6\x93\x49\x5d\x55\x30\x43\x83\xc1\xad\x25\x9a\x29\xf0\x3a\x90\x25\xbb\x0b\x58\x58\x54\xc9\x30\xc6\x9b\x84\x2b\x77\x21\x6c\x0a\x48\xb6\x0d\x7c\xce\x57\x84\x50\xa6\xef\xf0\x42\xd8\x82\xe0\x0e\x28\x9d\xab\x44\xe8\x7e\x97\x12\x18\x3b\x2a\x21\xd9\x8e\x71\xdf\x48\x36\x31\x72\x43\xb9\xd5\xe8\x7d\xa8\x17\xb1\xf6\x59\x16\xde\x2d\x33\x2a\x2a\xd7\xe1\x69\x28\x51\x2e\x2b\xf6\x57\x35\x76\x85\x31\xab\xdc\xaf\xd6\xd4\x24\xff\xf5\x9a\x71\x5d\x07\x31\x27\x9b\x97\x67\x92\xb7\x92\xcd\xd8\xe7\x72\x9e\xb7\x0c\x17\xd3\x34\x62\xe6\xf2\xd2\x97\x6d\xcb\xe2\x94\xb2\x1e\x06\x51\x77\x23\xb0\xbc\x33\xfc\xb6\xa5\xb9\x15\x58\xe2\xc9\x5d\x72\xcf\x96\x0a\x0d\x84\xe3\x13\x71\x62\xce\x23\x11\x80\x2f\x4c\x90\xb5\x55\xee\x2a\xca\xe2\xa6\x7a\x3a\xcc\x34\x3c\x95\xdc\x69\x40\x8d\x56\xce\x23\x82\x0b\xcb\x00\x90\x05\xbc\xaf\x66\x99\x54\x40\x61\x0a\x36\x40\x99\x8c\xd5\xfa\x1f\x6b\xac\x24\x89\xdc\xbf\xde\x0a\x08\xbd\x6a\x0c\xe7\xe5\x42\x23\xab\x28\x36\xa5\xa0\xc0\xf9\x90\x63\x97\xae\x20\x18\x55\x4a\x16\xae\x9b\x22\x37\x3f\xc1\x41\xd1\x50\xf2\xca\xed\x48\x33\xdf\x94\x14\x6a\xa9\x14\xe9\x43\xcd\x24\x8a\x88\x11\x35\xc8\xf8\xa6\x88\x22\x8e\x33\x00\x63\x9b\x22\x0d\xfe\x95\x17\xc4\x5e\xb8\x96\x7c\xf6\x3f\xed\x88\xd8\xaa\x76\x6a\xa3\xb8\x9c\xb1\x68\x9e\xff\xe9\x31\xef\xfb\x9c\xc1\xeb\x3a\x03\xa9\x20\x24\x87\xa9\x06\xbe\x4e\x1a\x19\xda\x45\x10\xed\xa4\xd0\xc6\x94\x35\x73\xdc\x02\xe8\xdc\x08\xf3\xac\xde\x15\x69\x3d\x13\xcd\x24\x26\x77\x37\x5f\x8c\xdb\x60\x3e\xc3\x57\x26\xfc\x4b\xce\x7e\xec\xd0\x4b\x0e\xc3\xaf\x9c\x81\x5c\x93\x2b\xf0\xea\x1d\x72\x2e\x58\x5b\xcb\xdf\xef\x67\x7f\x50\x63\x63\x99\x90\xdd\x96\xa4\xee\x6f\xd6\xd8\xf3\x1e\x09\x2e\x40\xd0\x10\xd1\x0a\x15\xe2\xbd\xbe\xa6\xca\x2b\xa2\x82\xa5\x32\x50\x57\xc7\x5c\x60\x08\xc2\xc4\x78\x05\x23\x60\xb4\x1f\xf9\x78\x75\x11\x6a\x69\x63\xea\x08\xf5\x5d\xc1\xaf\x8e\x28\x95\x14\x17\x19\xa0\xe7\xb0\xc8\xbd\xd6\x94\x24\x6a\x0a\xe9\x39\x83\xca\xac\x96\x7d\x3a\xe9\x43\x3f\xd0\x4c\xba\x72\x68\xe0\x4b\xbd\x18\xbe\xf5\x32\x29\xf6\x8a\x52\x64\xdf\x0e\x70\x5a\xb5\x03\x50\x14\xa9\x18\x9f\x7d\x8f\xc3\x68\x4c\xdc\x0b\x97\x71\x59\x3d\x8b\x16\x4e\xa8\x75\x10\xd0\x48\x2c\x2f\x8f\x72\x9c\xbf\xc1\x61\xe6\x04\x70\xef\x7f\x18\xd8\x0f\xbe\x5a\x99\xfe\x0b\x7a\x01\xc4\x74\x78\xcf\x35\xca\xd2\x59\x8b\xe6\xf6\xa7\x9c\xac\x38\x54\xe3\x10\x16\xf2\x72\x7a\x7b\xc2\x67\x0f\x3a\xec\xca\xe0\x82\x48\x83\xb6\xc0\xfa\xfc\x9f\xce\xee\x2a\xb4\x6e\x96\xb6\x55\x8d\xe8\xb9\x52\x05\x0d\x3d\x21\x15\x91\xb8\x10\xc4\x94\x21\x5b\xaa\x39\x3b\xc5\x8c\x45\xe5\x3e\xd7\x9b\x36\xa6\x41\x45\xa4\xbf\x92\xe0\x31\x07\x1f\x42\x19\x0d\xe8\xcd\x07\xd9\x84\x31\x01\x2a\x74\x6a\x5a\xdd\x00\x73\xf3\x47\x63\xde\x21\xe3\x37\x06\x0f\x90\xb8\xa3\xdc\x33\xba\x5d\x8d\x72\xf3\xf3\x07\xd8\xe7\x4c\x38\xf6\xcf\x3c\x9c\x3e\xaf\x00\x00\xf9\x97\x01\xc6\xbe\x07\xdc\xb3\x4b\xe0\x9e\x48\x45\xa8\x36\xbd\x7f\x57\x09\xdc\xa3\x26\x95\xa9\xe4\x5d\xc7\x8e\xb1\x99\xa1\x92\x6c\xf8\x44\xde\x03\xef\xd9\x0d\x4d\xc6\xda\xf6\xc0\x3a\x37\xb9\x37\x6a\x60\x9d\x62\x18\x34\xbc\x8e\x21\x3f\x6c\x6c\x1d\x18\x25\xc6\xfe\x74\x94\xfd\x7b\x7b\x4b\x52\x2c\x4a\x52\x76\x5d\x98\xf6\xcf\x65\x22\x5d\x8c\xd7\x13\xf7\x93\xa3\xde\x5d\xea\x07\x25\xc8\xe6\x1b\x55\x07\x08\x38\x8c\x66\x22\x05\xd2\x37\x8a\x1f\x53\x20\xbb\xfa\xa6\x0f\xc5\xc0\x92\x59\x0f\xca\xfc\x06\x9f\x1f\x61\x31\xdb\x27\x2e\xe6\x69\xe0\x0a\xef\x86\xb9\xb8\x3f\x0c\x2b\xba\x0c\x63\x61\xd4\x3f\x49\xfd\x07\x9c\xef\x64\x5b\x44\x6a\x9a\x36\x8a\x17\xb0\xfd\xd0\x89\x99\x7b\xab\xf7\xec\x55\x92\xea\x10\x8f\x86\x97\x71\x66\x41\xb3\x60\xfa\x76\x91\x48\x74\xab\x50\x97\x8f\x3a\x6c\xa4\x17\xb6\xdc\x0f\x39\xde\xbb\x9d\x39\x8e\x96\x0b\x9a\xf0\x98\x18\xa9\xb0\xe1\xcd\xd2\x69\x67\xd2\x79\xf4\xd6\x77\x21\x91\x5d\x1d\x26\x62\x8c\xb7\x87\x7b\x8a\x10\x48\x27\x8c\xc9\x4a\xb6\x5a\xc4\x1a\xd0\x47\x8d\x05\xe2\x1f\x8a\xac\xbe\x73\x8b\x0b\x76\x08\xdd\x8b\xd9\x98\x2c\x0c\xf2\xd9\x96\xbc\x79\xd5\x0b\x44\x2b\x08\xd5\x8f\xfa\x43\x6a\xdd\x81\xe3\x88\xd4\xbd\xf1\x84\x82\x54\x4b\x66\xe9\xdf\xcb\x2a\x33\xce\xcf\x24\x2d\xa1\xa8\xd7\xdd\xaf\x1c\xf4\x6e\x3c\x03\xa9\xbe\x8a\xc1\x1e\x3a\x1b\x86\x40\x8e\x45\x6c\xdd\x33\xf9\xf2\x7b\x91\x28\x25\x9c\xbf\xfd\x20\xfb\xd2\x3e\x76\x58\xb3\xc3\x97\xa9\xf2\x17\x31\x0c\x01\x2f\x9f\xb8\x28\x9a\x3d\x88\xdd\x7e\x60\x9f\xf7\xa5\xd1\xd5\x82\x8d\x5f\xc1\x4f\x76\x75\xea\xaf\xba\x41\xe0\x2e\x89\xca\x9a\x94\xbd\x94\x05\x79\x98\xad\xd3\x5c\xac\x60\xe1\x37\xac\x8e\x2a\x4f\x1f\x4c\x9f\x68\xed\x0c\x73\x02\x2b\x06\x4e\x05\x33\x33\x11\x49\x21\xe5\x84\x8c\x85\xb2\x04\x6b\x04\xf3\xa2\x78\x83\xb1\x41\x41\x94\xda\x14\xf9\x4a\xd4\xcb\x62\x74\x98\x1d\x70\x3d\x2a\x6a\xfd\x64\x9d\x23\xaf\x7f\x46\x81\x15\x70\x24\x09\x9a\x1b\x46\xb1\x1d\x01\xe1\xb3\x51\xa4\xaa\x60\x8e\x04\xc6\x95\x11\x61\xa0\x16\xe1\x9a\xfa\x4b\xc5\x9d\x95\x87\xa3\xb2\xbb\x10\xdf\x7f\x62\x52\x61\x1c\xc9\x7d\xa3\xd7\x91\x5d\x17\xe6\x90\x9f\x04\xdb\x45\x9a\xf4\xda\xd8\x12\x2b\x8e\xb4\xc8\x80\x0a\x08\x6c\x3e\x6e\x73\x0f\x1b\xe7\xe9\xfc\xf0\x5e\x47\x1d\xe7\xa1\x7d\x84\x83\x8a\x3b\x46\x92\x92\xbd\x03\x31\x21\xf3\xe6\xc6\x89\xa2\x6e\x37\xea\x97\xc6\x81\x10\x80\x3a\x73\x23\x6c\x6f\xa8\xbe\x54\x59\xf4\xf6\x18\x58\x32\xe3\x39\x6c\x96\x5d\xbf\x3d\x01\x90\x7a\xb7\xe8\xaf\x55\x91\x76\xd8\xc7\x47\x98\x3f\xac\x43\x87\xcc\xef\x6f\xd7\x58\x7d\x47\x18\xf2\xfa\x68\xf7\x6b\x8a\xaf\x5d\x8f\x90\x35\xc6\x43\x66\xb4\xf6\x05\x74\x44\xce\xe5\xca\x28\x46\x5a\xca\xb6\x49\x6d\xd6\xd2\x54\x0a\x8d\x62\xcd\xc9\xb3\xae\x91\x64\xaf\x81\x4e\x1e\x5e\x0d\x9a\x60\x41\x43\xa3\x8d\xaa\x45\xd2\x11\x84\x9d\x40\x19\x92\xb2\x0a\x42\xf5\x8e\xe2\x7f\xe8\x21\x2c\x80\x0a\x45\x27\x88\x74\x03\xa1\x40\x2e\xc1\xa0\x0f\xd5\x26\x26\x17\x21\xf7\x73\xb4\x37\x00\x4e\x8b\x6e\x1f\x68\x23\x52\xe3\x80\x96\xb0\xd7\x1e\x64\xcf\x34\x7a\x9c\xb0\x7f\xe1\x08\x68\x6b\xff\x5f\xda\xa5\xf6\xff\xb3\x07\xf6\x54\xe5\xdd\xaa\xca\x6d\xa5\x2a\xbf\xe4\x61\xa8\xca\x47\xd8\x14\xf3\x87\x2e\xb1\xca\x01\xdf\xd3\x92\x77\x01\x71\xf9\xaf\xef\x8c\xfb\x90\xd3\xd8\x5e\xf1\xbf\xd9\xbd\x49\x2b\xfe\xc6\xa4\x2a\xb1\xe3\x0d\xd5\xff\x19\xfb\x45\x9b\xa4\x5f\x43\x00\x29\x00\x9f\xc5\x4e\xd0\x16\xee\xa5\x9a\xf7\xd4\x05\x95\x67\x14\x14\xf0\x3e\x3c\x94\xb7\x2f\x39\xfb\x40\x51\xb6\x11\x6d\x1c\xf6\x01\x87\xe1\x0d\xf7\x5d\x8e\xf7\x8a\x33\xa0\x4b\x37\xfa\xda\x28\x0f\x74\xa1\x40\xdf\x92\x21\xb0\xa2\x8f\x60\x28\x77\x7b\xb2\x36\xed\x66\x2a\xbb\x73\xa3\xdf\x15\xa9\xec\x83\xd9\x0b\xd3\xfe\x94\x7f\x9d\x37\xc9\xbd\x56\xd2\x3c\x2f\xd2\x8d\x5e\x43\x3e\xd0\x4e\x92\x76\x24\x5e\x5a\x20\x0e\x0d\xbe\x72\xcf\x16\xfa\xf9\x1c\x3b\x98\x85\xf7\x8a\x5b\xfa\xb9\xc8\xdc\xa3\x0a\x38\xf3\x19\xa0\xfb\x85\xf7\x6a\xf5\x8a\x2a\x1a\x43\xf4\x4e\xc9\xed\xf5\x73\xfb\x2d\x44\x6c\xd5\x85\xb7\x86\xf9\xb2\xe8\x26\x98\xac\x4f\x46\xe3\xb7\xee\xf7\xfe\xae\xb6\x5c\xe0\x51\x14\xf8\x33\xa4\xa8\x95\x72\xc6\x73\x02\x83\x54\xea\x4c\xc0\xdb\x21\xac\xeb\x24\x0b\xf3\x24\xed\xfb\xfc\x56\xfa\x4d\x05\x65\x1a\xbd\x87\x90\x37\x92\x4d\xd9\x27\x1b\x61\x97\x77\x82\x38\x68\xc3\x66\x59\xf1\x96\x7a\x7c\xe5\xc4\xa9\x30\xee\x5d\xe4\xa9\x00\x63\xac\x9c\x4b\x8c\x2d\x9c\x58\x5a\x3e\x31\x3f\xb7\x7a\x62\x61\x96\x53\xab\xf0\x1c\xd2\x4d\x45\x93\x92\xb4\x92\x02\xd5\xc4\x9a\x20\x44\x33\xa6\xaa\x3d\xc9\x3b\xe8\xa2\x8b\xf9\x89\x4e\x37\xef\x2f\x84\x29\xe6\xb4\x83\x4d\x3b\xcc\xf5\xbc\xc3\x1e\x69\x46\x89\xda\x9b\xa0\xba\x98\xbe\xd2\x0e\x73\xe2\xb3\xc7\xc2\xe4\x6d\xbb\xb4\x1c\x51\xe7\x0e\x65\x45\x4d\xfc\x4b\x0e\x2b\x3a\xce\x9a\xaa\xff\x58\x63\xdf\x5f\x63\x07\x5b\x61\x0a\xba\x4e\xdf\xfd\xb6\xe3\xfd\x85\x83\x8e\x0b\xae\xaf\xc2\x31\xc8\xe7\xa7\x55\x82\x98\x42\x1e\x45\xe2\xa0\x94\x92\x98\x0e\xf9\xfe\x21\x9f\x4b\x55\xe5\x90\x7f\x48\xe5\x65\x44\xa1\x62\x6e\xa3\xe1\x2e\x0a\x55\x56\x64\x34\x74\xdb\x63\x8b\x5c\xb7\x9b\x21\x70\x32\xad\x17\x1a\x8e\x55\x14\x14\xa0\xea\x32\x58\x8a\x8e\x6b\xe8\x35\xcc\x8f\x2a\xa5\x1f\x51\x99\x64\xc3\xcc\x45\x31\xc1\x8c\xae\x72\x9f\xe6\x5d\xbd\x5c\x94\x77\x6e\xf9\x94\xf9\xe8\xf3\xd8\x58\x2a\x70\xdc\xdd\xa3\xde\xa1\xf9\xa4\xd3\x09\x01\x12\x70\x43\xdb\xef\x0b\xcd\x4c\x3d\x69\x7d\xec\x17\xc6\x2c\x74\x5f\x45\x7b\xd2\x2f\x62\xd1\x69\x6b\x5a\x89\xc2\xa6\x00\xad\xe8\x0d\x63\xde\xf1\x81\xab\x26\xce\x4b\x81\x02\xae\xf7\xb5\x4c\x3e\x97\x55\x2a\x49\xbf\xb1\x07\x04\xbe\x6b\x25\xe9\xbc\x52\x92\x1a\xde\x53\x4e\x55\xf7\xfd\xce\x4f\x3c\xdb\xcc\x81\x3d\x45\xe9\x5f\x3a\x16\x78\xb4\xbd\xe6\xb2\xe8\xde\x5a\x27\xf5\x64\x60\x29\x57\x19\x29\xb9\x52\x73\x8a\xc9\x41\x5a\x0e\xfb\xf4\x41\x6b\x03\xb6\x95\xeb\x33\xf8\x6b\x09\x40\xc3\xdd\x77\x1d\xf4\x16\xad\x2b\x46\x48\xcf\xa6\xdc\x71\xe8\x65\x9e\xa7\xf2\x98\xd9\x34\x1d\xff\xeb\x18\x84\x88\x10\x67\x03\x78\xdc\x5f\x3c\xf0\xaf\x93\xf6\xf6\x95\x8a\xa4\xb8\xbf\xc5\x82\xdd\xa2\xcb\x81\xb3\xf8\xa6\x9d\x51\x16\xeb\xcc\x48\xab\x84\x3d\x9a\xf2\x3d\xc6\xa8\xc7\xd3\xff\xd2\xda\x5e\x98\xcd\xb9\x37\x2b\x61\x66\x4d\xdd\xd2\x69\x8b\x0f\x3f\xaa\xb1\xcf\x8c\x5a\x07\xb1\x06\x90\x21\x5d\x80\x58\x80\xf8\xf9\x49\x83\x70\xd8\xde\x37\xea\xdd\x60\x5d\x29\xa3\xdb\xa9\x20\x33\x83\x83\xa0\x99\x26\x31\x7f\x59\xd2\xb0\x2d\xe3\x5f\x18\x91\xe7\x33\x45\x1f\xfd\x4e\xc7\xab\xcf\x69\xa5\x09\xb9\x20\x91\xea\xb7\xc0\xa7\x55\xe0\xae\x2f\x4b\x1a\xb6\xad\xe3\x28\x3b\xc2\xa6\xb6\x35\x27\x96\x02\x19\x1e\x72\xae\x1d\x0a\x86\x71\xd0\x3d\x80\x79\xfe\x8c\xbd\xd3\x61\x4f\x88\x82\x2c\x27\x93\xa6\x58\x0d\x3b\xc2\x7d\xe5\x16\xd0\x80\xdb\x11\xe9\x9c\x5c\x34\x3c\x47\x80\x34\xb1\x49\xe1\x75\x00\xa2\x96\x2b\x9a\x9d\x97\x25\x0d\xb8\x63\x21\x92\x69\xd3\xa4\xcf\xde\xe6\x30\x17\x2a\xa6\xef\x43\xd5\xee\x7f\xe4\x35\xbb\xe5\x61\xd4\xcc\xaa\x15\x81\x77\xc9\x5a\x7d\x71\x8c\x3d\xad\x6a\x16\x3d\x3f\x69\x80\xe6\xfc\xe0\x98\xc7\xe9\xef\x2a\x5b\x22\x0c\x6d\xa5\x8e\xfc\xa3\x7b\x86\xc4\x5d\x4b\xe1\xbb\x95\x8e\xbc\xec\x3d\x35\xac\x32\x24\x3e\xbf\xbc\xb2\x26\xd8\x21\xf6\xef\x87\xae\x2c\x73\x74\xf7\x44\xfc\x2e\x74\xe2\x5f\x33\x15\xb7\x9f\xdf\xa5\xf1\xf0\xff\x18\xa2\x15\x3f\x76\x76\xc3\xe5\xed\x37\xac\xc3\x6e\x5d\xdb\x0d\x61\x1a\x69\x5b\x21\x49\x87\xb2\x9d\xf0\x75\x8c\x95\xa2\xd6\x36\x92\x34\xbc\x57\x47\x08\xac\xf4\x60\xda\xcc\x81\x58\x5a\x16\x17\x42\xb1\xe9\xfe\xd6\x41\x6f\xa9\xe2\x3a\xf2\x0d\x67\x65\x52\xe5\x00\x9d\xc8\x49\x4a\x9e\xde\x66\x10\xf3\xae\x48\x21\x64\x30\x88\xc1\xa5\x9c\xc4\xfe\x25\x07\xb4\x51\x4b\x36\xfd\xaf\x03\xec\x47\x1c\x39\x98\xb0\x45\xfe\x27\x87\xcd\x6f\x15\x6d\xb7\x6d\xbd\x71\x63\xf5\xce\x15\xf8\xa6\xeb\x21\x40\x79\x83\xf9\x0f\x4d\x1a\x44\xb6\x18\xb7\x8c\x78\x4f\xd5\x1e\xb4\x56\x21\xff\x80\x71\x7c\xc0\x66\xee\x49\xd1\x3d\x5d\xf6\xf1\x13\x74\xb7\x1b\x72\xee\xe6\x5d\x9e\x4f\xd9\x6b\xd4\xc9\xf0\x7e\x36\xb7\xbb\x05\x27\x8f\x88\xd7\x43\x82\xcd\x56\x98\xfb\x6a\x4d\x35\x04\x90\xf0\xcb\x81\x96\x3d\xfb\x90\xd3\xd9\x5e\xde\x3d\xdf\xbd\xad\x60\x1e\xb3\xaa\x54\x72\x95\x54\x54\xaf\x2c\x0a\xbf\xef\x8a\xe1\xf1\xe2\x43\xd3\x8b\xdc\x2f\x30\xaf\xae\xf9\xa6\xf5\xb2\xe5\x1b\xfa\x71\x64\x06\x29\x12\x85\x2c\x11\xf7\xc0\xc1\x3d\xc1\xb1\x27\x38\xfe\xe5\xb8\x57\x77\x69\xda\x7a\x65\xd9\xb4\xf5\x38\x18\xb6\x7e\x4f\x89\xaf\xcf\x6d\xa3\x30\xec\x60\x75\x83\x04\x7b\x9d\x53\x24\xa2\xca\x95\x55\x2c\xe5\x47\xbb\x4d\xb2\x19\xf5\x20\x6e\xd5\x89\xb7\x8f\xdd\xa7\xb5\xa1\x94\x9d\xd8\x6d\xdb\x50\x1d\x9a\x50\x96\x85\x6a\xe1\x6c\xb4\xf6\x21\x67\x63\x7b\x81\x7c\xc2\x9d\xaf\x57\xdb\x46\x8c\x5a\x69\xa9\x3c\xa4\x6a\x8c\xbd\x7a\xd4\x64\xe9\x2f\xa8\x21\xd1\x6b\x70\x72\xe5\x56\x59\xe6\x0a\xd1\x7b\x9d\x45\xee\x1d\xf7\x37\x46\xbc\x17\x55\xdf\xb2\xa4\xa8\x62\x05\xa3\x0c\xf2\xb8\xc5\x13\x7a\x4a\xa5\x7c\x20\xaa\x9e\xf5\xb0\x2d\xb6\xff\xb8\xc6\xfe\xce\x61\xfb\xd3\x20\x6e\x8b\xcc\xfd\xa6\xe3\xfd\x98\x83\x7f\x17\x3c\xfa\xa4\x1d\xd2\xe5\x64\x9d\xaf\x13\x89\x78\x86\x6e\xc4\x7e\xd2\xe3\x9b\x20\x90\x01\x13\x21\x4f\xf8\x7a\x22\x25\x91\x06\xdc\x54\xcf\xa3\x47\x14\xdc\x8d\xfd\xe2\x2e\x94\x5b\x02\xae\x44\x77\x25\xe0\x3a\xc7\x2d\x9f\x2f\x2b\x10\xb8\xf5\x24\x05\xf7\xe6\x72\x2f\x9e\xb3\xcf\xa1\x33\x6c\x9a\x1d\x1e\x3a\x8f\x4a\xbd\xbe\xb8\xb0\x2c\x3f\xca\x36\xd8\x68\xda\x8b\x84\xbb\xe6\xad\xc8\x7f\x8d\x94\x20\xea\xd6\x8d\x80\x18\x37\x5a\x61\x13\xcc\x55\x60\x81\xa7\x91\xd1\x29\x60\xe4\xc0\x5c\x21\x90\x90\xf9\x24\xce\xc5\xc5\xdc\x72\x21\xfe\xd4\x41\x76\xc8\xa8\x4f\xda\x08\x9a\xba\x36\xcb\x49\x24\x6e\x09\x21\x7a\x0f\x2c\x20\xaf\x3d\xe8\xfd\xb0\x53\xba\x58\x65\x0a\x31\x1e\xc9\xf8\x82\x76\x75\xcb\xea\x5c\x98\xf6\xa7\xaf\x93\x7f\xac\x07\x17\x12\xcc\x39\x94\x5f\xac\xd2\x2b\x0e\x5f\x98\xe6\xa5\x8f\xe1\x06\x49\x01\x6f\x48\xa9\x9e\x22\x28\x3b\x60\x68\x62\xf9\x47\x8e\x54\x9b\x61\xbe\xb0\xe7\xaa\xbc\x9c\xa9\x0f\xcf\xd0\xf1\x5c\x85\xc7\xd8\x1c\x78\x73\x0d\x1c\x63\x33\x6c\x7a\xe8\x1a\x18\x36\xe7\xf6\xb4\x8e\x5d\x68\x1d\xeb\x86\xd2\x71\xd7\xee\xac\x32\x4f\xdb\xc2\x97\xf6\x90\x93\x6d\xbf\x61\x2d\xb9\x67\xf4\x09\x62\xe8\x72\xd7\x1b\x56\x69\xcd\x57\x66\x5d\xbc\x9b\xb1\x3b\x1f\x29\xf6\x82\x6f\x03\xb6\xce\x27\x51\xaf\x13\x17\xb0\xad\xee\xcf\x1d\xf4\x6e\xdf\xfa\x11\x03\x81\x05\x44\x5f\xaf\x83\x10\x74\x64\xda\xc8\xc2\x96\xe0\xdd\x34\x84\x29\xe9\x6b\xee\x32\x00\xb5\xbe\xe4\x8c\xbd\x2c\x4b\xe2\xa5\x20\xdf\xb0\x84\xd3\x2f\x8f\xb1\x37\xd6\xd8\x58\x37\x0d\x13\x29\xa9\xdd\xef\xd1\x69\xdc\xdf\x70\xd4\x45\x02\x0b\x54\xb8\x2e\x38\xa0\x1a\x84\x29\x0a\x90\x47\xbf\xd3\x4d\xd2\x3c\x88\x9b\x42\x4b\x2c\xaa\x21\x80\x0b\xa5\xb8\xfb\x42\xe6\x43\xe6\xf3\x53\x90\x0e\x8e\x09\xe0\xb8\xb1\x36\x93\x58\xd6\x5f\x3e\x07\x91\xd8\x29\x57\x9f\xf7\x39\xf6\x83\x82\x32\x40\x1c\xe9\x44\xc1\xc0\xc4\x98\x55\x2e\x45\x5c\x37\x68\x0a\x9e\x35\x45\x1c\xa4\x61\x62\xa6\x1a\x63\xcc\x4c\xa0\x8b\xa4\xc8\xf9\x14\x19\x5e\xa7\xec\xd8\xb0\x8f\x39\x84\x03\x0e\xf9\x1f\x1a\x9e\xa6\x40\x4b\x84\x4b\xc5\xb4\x2e\x5c\xa0\xd8\x60\x1f\x72\xf9\x8d\x25\xb7\xd1\x6b\x00\x33\xd6\xd9\xb9\xc5\xc3\x54\x46\xdd\x72\xae\x1e\x6e\x44\x49\xe3\x70\x27\xc8\x72\x91\x1e\xa6\x49\x97\x1d\x3e\xe2\x4f\xc9\x75\x26\xa7\x7b\xbd\x48\xfe\x6f\x89\x3c\x08\x23\x3b\x43\xe3\x4e\x1b\xc5\xfe\x36\xef\x46\xe3\x27\x8a\xae\x8d\x5e\x07\xb8\x6c\x83\x16\x50\x24\x99\xf7\xed\xe1\xb2\x0a\xfe\x99\x9a\x06\x8f\xfc\xf1\x9a\xf7\xfe\x9a\x05\x1e\x89\x9a\x55\x10\xed\xbc\x5f\x56\x37\x04\x3f\x24\x27\xe5\x21\x6e\x94\x84\xb1\x56\x3a\x6d\x3c\x0d\x3b\x41\x6a\x64\xab\xa4\x6a\x1e\xe5\x09\x0f\xb2\x0c\xb6\xfe\x98\x24\x63\xa6\x01\xae\x91\xc1\x10\x9e\x0b\x55\xf0\x19\x49\x62\x8c\x01\x7b\xac\xc7\xe4\x01\x87\xe9\x15\xe7\xbe\xcf\xf1\xde\xec\xa8\x5f\xb4\x97\x40\x6a\x15\x30\xa0\xf0\xae\xbc\x3a\x0e\x49\x1b\x18\x7b\x07\x68\xca\x00\xaf\x1c\x26\xf1\x04\x45\x5f\x86\x59\x61\x40\xe1\x41\x3b\x08\xe3\x2c\xc7\x04\x8f\x26\x48\x0d\x2b\x2f\xbf\x9b\x26\xad\x5e\x13\xf5\xd5\x02\xe9\x7a\xd8\x38\xdf\x42\x64\x58\xb3\x5e\x5d\x27\x21\x95\xa7\x0c\xdc\x50\xf1\x61\x15\x65\xfc\xd9\x08\xbb\x69\x47\xf2\x1d\x54\x45\x52\x7d\x4e\x26\xe9\x82\x8a\x0d\x71\x3f\x34\xe2\x6d\x9a\x37\x6d\x0c\x12\x0f\x04\xb9\x1a\x0a\x0f\x54\x15\x4f\xff\xa2\xad\x19\xec\x33\x74\x51\x41\xde\x76\x82\x96\xc0\xcd\xbb\x87\x9c\x2e\xe7\x85\xe8\xaa\x94\x3b\x60\xa3\xec\xfb\x97\x9c\x2b\xdb\xc6\x97\x2f\x39\x07\xa8\x10\x4b\x58\xbe\xa6\xc6\x42\x66\x3d\xe8\xbe\xc8\x3b\x65\xfe\xb6\x30\xb2\x10\x89\x09\x15\x7d\xc0\xfb\xa0\x67\x14\x99\x78\x92\x76\xca\xad\x32\x3b\xf4\x5d\x0e\x53\xb5\x70\xbf\xdf\xf1\xfe\xc3\x85\xca\x4f\x54\x15\x9a\xac\x17\x3d\xa3\x49\x5a\x20\x03\x4a\x61\x63\xab\xe5\x03\xc9\xd7\x29\xe0\xf5\x00\x5c\x5d\x37\x0a\x73\xad\xd0\x98\x63\x61\x0d\xf5\xff\x35\x66\x65\x43\x0f\xe6\x1e\xae\x26\xe7\x45\x4c\x70\xac\xee\xbb\xc7\xbc\x59\xf3\x42\xa1\xc6\x04\x3c\x97\xd7\x29\x4a\x07\x85\xb4\xdc\xcb\x42\x79\x56\x6a\x22\xd4\x43\x95\xf3\xe0\x0f\xf6\xef\xa9\x68\xff\x52\x2c\xca\x27\xc8\x22\x73\xd3\x70\x5d\x6f\x9b\x09\x02\x70\x32\x8b\xda\xfa\xb1\x45\x8d\xb6\x2b\x08\x0a\xd8\x3b\x6c\xed\xf2\xb0\xf5\x90\xd3\xde\x5e\xb5\x5e\x70\x6f\xb1\x8c\xf3\xc6\xa8\x94\xd4\x6a\x73\x84\xca\x66\xf9\x77\x8e\xb0\x99\xaa\xac\xb9\x8d\x24\x4f\xe2\x25\xf9\x64\x96\x8b\x38\x5f\x08\xb3\xf3\x56\x4c\xfe\x97\x6a\xde\xf5\x56\x48\x3e\xbe\xc1\xe7\x0b\x6a\xeb\xae\x7e\x9b\xb7\xc2\xec\xbc\x5e\xf5\x52\xa0\x74\x5b\x25\x2a\xdf\x37\xd5\xd8\x22\x83\xcb\xee\x9c\x77\x54\x21\x16\x1b\x09\xb3\xdb\x96\x6f\xae\xaf\x5f\x74\xd8\xfe\xf5\x6c\x55\xaa\x90\x9f\x70\xbc\x1f\x71\x4e\x86\x91\x50\x34\xb6\x52\x45\xca\x13\x0c\x82\xa7\xc0\x74\x48\xcf\x58\x2f\x3d\x33\xc0\xf3\x0a\xd0\xd2\x44\xee\x16\xb7\x29\xa5\xcd\xe7\x27\x2e\xfa\xdc\x13\x17\xf3\xa3\xde\x24\xf7\x2e\xae\x67\xf2\x9f\x38\x5f\xcf\x3c\x9f\x2f\x76\xba\x51\xd8\x0c\xf3\x88\xa4\x58\xaa\x81\x90\xf0\x05\x1e\xae\xf3\x5e\xac\x23\xbd\x2d\x09\xff\x9f\x0f\x6e\x83\xc9\x76\x64\x98\xe9\x11\x0c\x36\x7f\x3c\xe6\xdd\xbe\xc5\x7d\xfb\xf0\x3e\xd4\x9d\x42\x0b\x6e\x48\x74\xcb\x1b\x0e\xb0\x77\x3b\xca\x2c\xf0\x26\xc7\xbb\xae\x32\x3c\x63\xfb\xc2\x4d\x7b\xc1\x6d\xec\x24\x5b\x78\x18\xb0\x2f\x43\x7b\x61\x6f\x7f\xda\xc5\xfe\x94\x1a\xfb\xd3\xfa\xee\x4c\x08\x87\x34\x53\x41\x41\x79\x5a\x15\xe8\xb1\xb7\x69\xec\x7a\xd3\x78\xf9\xf6\x9b\xc6\x19\xf7\x54\xfd\x11\xb8\x0c\x06\xac\x31\xb8\xf6\x18\xfb\xc1\xa7\xb3\xeb\xcd\xed\x43\xa4\x39\x9e\xdf\x04\xda\x5b\x8a\xdf\x2b\x61\x3b\x0e\xe3\xb6\xa1\x71\xb8\x7f\xf4\xef\xbc\x9b\xb7\x7c\xc2\x3e\x7e\x18\x85\x1b\xd4\xb8\x07\xe8\xcf\x4b\x0e\xcb\xc2\x76\x2c\xd2\x33\x41\xc7\x06\xed\x7a\xe8\x3b\xd9\x5f\x39\x4c\x3d\xe7\xfe\x89\xe3\x8e\x36\xfa\xb9\xf0\x3e\xe2\x28\xdf\xb8\xfe\x4c\x10\xf3\x8b\xc7\xa6\x6e\xb0\x3e\x95\x61\xb5\xb4\x23\x5d\xa1\x72\x85\x31\x0f\xb8\x37\x7f\x62\x79\x75\xf1\xe4\xe2\xfc\xdc\xea\x09\xbe\x7c\xe2\x05\xe7\x4e\xac\xac\x7a\x7c\xe9\xc4\x69\xde\x88\x92\xe6\x79\x5f\x21\x6f\xa5\x8a\x74\x3b\xc8\xf0\xc0\x99\xa4\xfc\x45\x73\xa7\x4f\x61\x52\x92\x5a\x1e\x05\x52\x47\xd4\x27\xac\x6b\x05\x02\xe6\x5b\x23\xbd\xa3\x20\xd0\xb7\x7c\x07\x33\xba\xc4\x7d\xe5\x77\x78\x7f\x7d\x75\xf1\xdb\x08\xc1\x31\xc2\x04\xe4\x22\x80\x47\x34\xa0\x1c\x20\x3a\x45\x98\x89\x04\xe7\x78\xc6\xe4\x6c\x38\xbc\x19\xe4\xcd\x8d\x42\x98\xc9\x03\xc4\xd0\xb1\x44\x4c\xd8\xf5\x30\xca\xa5\xd4\x8f\xcd\x44\x73\xcc\x4d\x0b\xb8\x27\x77\x41\xbf\xa8\xde\x4d\x67\xe6\x4e\x9f\xf0\xf0\x21\x95\x4e\xef\x33\x76\xa7\x88\xa2\x3a\xf2\x62\x18\xc8\x5d\xf8\x1a\x58\xb1\x66\x19\x9f\xf6\xb9\x57\xf4\x8d\x5c\x6f\xf2\x57\x61\x1f\xac\xa3\x40\xf6\x66\x15\xf3\x3d\x09\x68\x73\xf2\x52\x22\x1d\x12\x75\x2b\xc7\x95\xa1\x65\x81\x0a\x61\x17\xeb\x33\xce\x97\xcd\xee\x80\x56\x62\xd5\x30\xa3\x5f\x40\xf4\x53\x2f\x4f\xea\x41\xb7\x9b\x26\x17\x50\xb5\x80\x52\x9a\x5a\xad\xa9\x63\xc6\x61\x3a\xa9\xbe\x0e\x95\xd4\x4a\x88\xd7\xcc\x52\x9a\x91\x1e\x2f\xde\x92\xb3\x71\x48\x41\x3e\xe3\x47\x76\xd6\x23\x30\xa3\x22\xb1\x93\x9e\xa1\x27\x33\x85\x3d\xba\x8b\xae\xa1\x66\x0e\xf4\x8b\x6a\x2d\x5e\xdb\x79\x7b\x71\xe6\x5e\xbe\xce\x9b\xa9\xec\xbc\x48\xe4\x75\x38\x28\xcb\xa2\xa8\xb7\xe8\xf7\x0e\xba\x0b\xba\x85\xaf\x9e\x5a\xd1\x9a\x42\x36\x49\x36\x26\xbb\xe7\xa0\x1d\xcd\x24\x8e\x89\x0c\x17\x40\xff\x45\xd4\xbf\xec\x93\xed\xb2\xf6\x19\x83\xed\x8f\x6c\x72\x25\x6a\xf8\x20\xd7\x3b\x22\xed\x86\xad\xa4\x99\x1d\x4e\x55\x84\xfb\xe1\x00\x82\x88\xea\x72\x46\xc5\xf0\xff\xf7\x1e\x36\x3a\xb4\x4e\x75\xa9\x2b\xc9\x73\xf8\x5a\x43\x0e\x92\x20\x60\x0c\xad\xf8\xbc\x90\x27\x28\x82\x82\x28\x03\xf5\xbb\x50\xb9\x39\xe6\x2c\x43\xbf\x91\x8a\x81\x22\x64\x35\x05\x30\xd9\x30\xc3\xfd\x19\xb6\x3d\xc0\xa6\x84\xeb\xe3\xf3\x73\xbc\xd1\x8b\x5b\x91\xc8\x26\xa0\x81\xfa\x41\xd1\xc2\x05\xb7\xa4\x61\xd2\x33\x0c\x8e\xca\x66\xa1\x93\x75\xda\x0e\xc4\xaa\x07\xf2\x45\xe5\xcd\xa6\x07\x79\x98\x15\xe2\x18\x27\xa0\x72\x36\x4f\x16\xe8\xeb\x93\x1c\x53\x7f\x10\x40\x1b\xb7\xad\xc2\xd9\xa1\x8c\x51\x6a\xd3\x1a\x0f\xe3\x66\xd4\x03\x30\x16\x15\x70\x49\x5f\x9b\x8b\x72\xec\x1f\x18\x26\xac\x89\x9a\x8b\xa0\x1d\x4e\x6a\x7a\x2a\x28\x38\x89\xb5\xf7\x1d\x95\x9d\x89\xed\x9a\x55\x90\xbd\x95\x1a\x76\x74\x27\x0d\x3b\x2f\xfa\xbc\x97\x05\x6d\x91\xf1\xc3\x58\x94\xdc\x7c\x8b\xab\x3e\xe3\xc7\xe4\x21\xac\x1b\x62\x80\x98\x39\x59\x78\x14\xae\x13\x5b\x82\x6a\x35\xe2\x5f\xae\x03\xb3\x86\x0a\x4b\xa5\x0d\x4f\xc7\x99\xc9\x69\xaa\x40\xb1\x5a\x9d\x30\xf6\x19\x3f\x0e\x3b\xb9\x19\x78\x6b\xef\x7c\x73\xf6\xa2\x37\xfa\xd2\x3a\xd4\xbd\x87\x70\xad\xde\xea\x78\xaf\x76\x7a\x61\xcb\x56\x70\xe4\x05\x4a\xf2\x82\xa0\x5e\xdc\x83\x88\x83\x50\x5e\x1d\xba\xc1\xfa\x7c\x29\x31\x68\xa2\x73\x1b\x82\x3e\x89\xb1\x14\xc5\x1d\x16\x76\x3a\xbd\x9c\xa0\x6d\x0d\x90\xa9\xfd\x6c\x3f\x76\xa9\xfb\x0f\xfb\xbc\x07\xf7\x51\xa7\x9b\x0e\x2f\xca\xe2\x33\x86\xa4\x50\x1b\x68\xc2\x91\xf0\x30\x7a\xc3\x67\xcc\x92\x54\x52\xea\x55\xee\x2b\xfd\x2e\xd2\x96\xa9\x42\x67\xb9\x07\x94\x28\x41\x04\x43\x04\x50\xc1\xf2\x70\x2d\x3f\x2f\xe2\x66\xd8\xdd\x10\x69\x47\x6e\xe4\x93\xdc\xa3\x02\xa5\xb8\xf0\xaa\x3e\x58\x2d\x9a\x2b\xbe\x58\x55\x78\x65\x2d\x54\x30\x33\x7d\xf1\x0e\x20\xa7\x22\xd6\x42\xd4\x43\x3c\x25\x36\x87\x15\x41\x18\x05\xbc\x09\xe9\xdf\xf8\x35\x56\x5d\x05\x79\x2d\x68\xa7\x42\xe8\x3a\x49\x95\xd1\x7e\x8a\x71\x4f\x36\x0f\xbe\x01\xc5\xa7\x91\xfe\x5b\x3d\x09\xb4\x8d\xf0\xbe\x28\x5d\x08\xe2\x3e\x14\x61\xb6\xab\xd4\xb1\xf0\x85\xa4\xa5\x55\x62\x28\x18\xa8\xbd\xba\x69\x92\x63\x10\x08\x74\xcd\xe1\x4e\xd8\x11\xf0\x78\xd8\xcd\x44\x53\x6e\x72\x64\x2e\x91\xb7\xf1\x5a\xde\x8b\x63\x11\x15\xbf\xe5\x8c\x87\x57\xe4\x7a\xcd\xf2\xa0\xd3\xa5\x2f\x24\xcd\xac\x6b\x7e\xb1\x13\x36\xd3\x24\x4b\xd6\x73\x9e\xb5\x9b\x60\x6c\x11\x79\xd6\x0c\xba\x02\x7e\x0f\x07\xad\xd8\xa1\xd6\xfc\xc3\x8e\x01\xe5\xf6\x2e\xc7\xfb\x3e\x47\xfd\xb2\x17\xab\x09\x5d\xfa\x38\xac\xd6\x5f\x72\x14\xca\xdf\x7f\x75\xbc\x37\x39\xf0\x67\x51\x41\xfc\xa9\x99\x32\xb3\xc7\xb8\xa2\x0f\x03\x3c\xf0\x0f\x1d\x8d\x1e\xf8\x79\xc7\x7b\xb3\x43\x90\x81\xba\x25\xe8\xbb\xe9\x08\x70\x53\x6f\x84\xdd\xc7\xbc\xcb\x77\x39\x9d\xbe\x6a\x07\x59\x69\xfb\xaa\xb6\x5d\xa2\x55\x15\xd3\xcc\x0e\x7a\x37\x54\xdd\xb0\x8d\x75\xe5\x27\x88\x38\xb4\xd2\x42\xf7\x9a\xb1\x3d\xb3\xca\x6e\x03\x9f\x7e\x4a\x9b\x38\x7f\xcc\xf1\x84\x42\x69\x30\x8c\xcf\x84\x06\x53\x59\x3b\xfb\xe0\x00\x9a\x6e\x33\x89\x9b\xa2\x9b\x67\x87\xb3\x3c\x49\x83\xb6\x38\x5c\x14\x55\xa7\xa2\x76\x1e\x40\x35\x6c\x3e\xed\x59\x3f\x77\x61\xfd\xfc\x4d\x33\x6c\xfb\xd3\xbb\x4c\x6c\x7b\x95\xf3\x38\x65\xb6\x19\x8d\x7b\xc8\x79\xf1\xf6\xa6\xc1\x1b\xdc\xeb\xb4\x69\xd0\xf3\xb4\x45\xb0\x4a\x20\x95\x9d\x48\x1f\xdc\xc7\x6e\xa7\x5e\xc1\xe3\x6b\xbb\x9d\x8a\x36\xe0\xc8\x9a\xb1\x58\xa9\x68\x87\x10\xc7\x8a\x9e\x43\x8c\xfa\x9b\x5b\x5a\x5c\x41\x87\xf3\x7c\x12\xa3\xf9\xcb\xfd\xfc\xa8\x77\xa6\xe2\x7a\x89\x48\xa6\x48\xd6\x06\xc2\xed\x15\xe5\xb6\xce\x09\x63\x36\x6c\xf6\xa2\x20\xc5\xb4\x6c\x1d\x83\x45\x3e\x4e\x9b\x30\x66\x84\xbd\x90\x1d\xe8\x88\x4c\xea\xb4\xee\x69\xef\x79\xb7\xf5\x3a\x41\x5c\xd7\x71\x17\x74\x47\x59\xcc\xe4\x62\xd1\x67\x5b\x08\xe5\xc6\x4c\xe3\x34\x88\xb3\x70\x00\xb7\xfc\x25\x6c\x7f\x2a\x82\x2c\x89\xdd\x55\xef\xd6\x73\x80\x04\x3b\xc9\x93\x58\xd4\x37\x93\xb4\x35\x59\x4c\x76\x8e\x4f\x19\xf1\x1d\xd4\xea\x43\xd9\x96\xe5\xdf\xa5\xdd\xb6\x4b\xde\x7c\x91\x7c\xa7\x3a\xa8\xa7\xf7\x7e\x5d\x20\xac\x3b\xb9\xe8\x56\x81\x06\x0c\xd8\x98\x26\x15\xdd\xac\x55\xf6\x75\x14\x86\x75\xd8\xf3\x56\x29\x08\x2b\x57\xe4\xc6\x03\xa5\x9a\x2f\xbe\x95\xd2\xbc\x57\x75\x9d\x21\xcd\xfb\x15\x8f\x3c\xcd\xfb\x79\xa7\xac\x6c\x6e\xfd\x59\xa3\x5b\x04\x01\x46\x26\xb1\x6e\x3a\x40\x64\x41\xc4\x9b\xcf\x3e\x5e\x2b\x27\x20\xd9\x29\x56\x67\x92\x58\x45\xfd\xcd\x69\xc5\xc9\x7d\xc8\xf1\x5e\x51\x79\x87\xe3\x89\x9a\xe6\xa2\x55\x9a\xa9\x78\x15\x86\x8f\x75\x38\x38\xc6\xf5\x32\xae\xab\xde\x17\xe7\xa8\x0c\x30\xae\x10\xb8\xb3\x35\x4f\x13\x76\x3d\x1b\xed\x06\xf9\x86\x3b\xe5\x5d\xab\xe2\x98\xe4\x9b\xe7\x96\x4f\x61\x04\x13\x0d\x0a\x95\x6c\x8e\xc8\x0c\x1b\xbd\x20\xd2\x86\xfb\x6c\xef\xe9\x77\x88\xb4\x31\xe0\x8c\xb9\x6d\x75\x75\x49\x2e\xea\x86\xf9\xd2\x6f\x8c\xb2\xeb\xb6\xcc\x4a\x13\xd1\xfa\x90\xcc\x34\xf7\x07\x46\xbd\x0f\x39\x5b\x3c\x80\xdb\xd1\x40\x14\x1c\x84\x9d\x88\x4c\x6f\x14\x3e\xe7\x27\x2e\x06\xcd\x3c\xea\x2b\x86\x39\x3d\x14\x66\x6d\x8c\x71\x91\x7a\x84\x39\x62\x43\x1e\x53\xe4\xdc\x99\xc8\xad\x4e\xfe\x7f\x6a\xec\x01\x87\xfd\x9b\xb8\x72\x36\xbc\xc5\x61\x37\xef\x3c\x69\xaf\x72\xde\x78\xa7\xab\xa7\x53\x21\xdb\xcc\x54\x11\x8c\xcb\xb1\xa6\x8d\xdd\x3f\xb2\xb2\x6e\x3a\x58\xd3\xb7\x39\xec\x39\x3b\xaf\x69\x45\x35\x57\xb6\xeb\xc0\xad\x2a\x3c\xac\xb2\xff\x3c\x66\xc1\x75\x90\x06\x04\x9e\xa2\x95\xc5\x33\x49\x0b\xf5\xe0\xdf\x1b\xf3\x0e\x1b\xbf\xab\xf2\x0c\xe8\xf6\xd6\xfe\xe9\x8f\xed\xa1\x2f\xec\x5a\xfb\x6d\x2a\xe5\xf7\x2e\xef\x3b\x2b\xdd\xfb\x34\x12\xa6\xca\x7a\x98\xd5\xd9\xb3\x87\x4e\xbe\xc1\x41\xdf\x53\x56\x77\xa1\xac\xfe\xaa\xa9\xac\x7e\x72\x97\xca\xea\x7f\xa8\xd6\x55\x1f\x3b\x10\x86\x97\x6e\xaf\xa7\x3e\xc7\x9d\xd5\x7a\xaa\x9a\x4b\xa5\x80\x27\x43\x78\x94\x55\xd5\x4f\x5d\xc1\xee\xd8\x1d\x75\x63\x39\x41\x20\x56\x11\xa2\x7f\xc2\xbc\xd3\xc3\x6e\x1a\xd2\x92\x08\xae\x94\xa4\x28\x48\x05\x54\x88\x33\x86\xd0\xce\x2f\xfb\x97\x9c\x31\x95\xf6\x65\xc9\xb5\x6f\x1f\x64\xff\x69\x94\xfd\xdb\xa6\x2e\x1d\x77\x55\x12\x6a\x99\xfb\xcf\x23\xde\x57\x47\x86\xdd\x55\xa1\xe3\x29\x46\xfa\x6b\xf0\x22\x0d\x73\xbf\x36\x5f\x7a\x73\xad\xa8\x99\x5c\x23\x77\x8a\xc6\x46\x92\x9c\xe7\xe2\x62\x17\x44\x2f\x78\x50\x0c\x63\x0a\xe4\x68\x81\x9f\x6b\x43\xf0\xf5\x30\xcd\xf2\x72\x84\x2c\x7c\x93\x22\xaa\x35\xe6\x6a\x06\x48\xe5\xb1\x41\x23\xab\xbf\x5a\xa2\x1b\x0d\x33\x2c\x01\x98\x48\xcd\x20\xad\xa2\x12\x93\xbc\x68\x3e\x56\x68\x3d\x08\xa3\x42\xb7\xb6\xa3\xb5\xe1\xcb\x81\x3e\xd2\xb7\x74\x13\xed\xcc\x73\xc3\x12\xae\x1c\x20\xaa\x86\x52\x7a\xb7\x12\x91\x81\x67\x80\x14\x43\x60\xa1\xd6\x4f\xa0\xcf\x5a\x69\x7a\x4b\x8b\x24\x97\x26\x79\x33\x88\x22\xbd\x39\x6c\xd2\x87\x75\x95\x7d\xbe\x60\x70\xec\xad\xdd\xed\xd1\x2c\xf4\xee\x59\xdb\x8a\x3f\xe3\xff\x1e\x61\x7a\xea\xb8\x9f\x1d\xf1\x1e\x1c\xd1\xf9\x83\x45\x2b\xe4\x44\x2c\xf5\x84\x4e\x04\x91\x53\x13\x30\xe6\x90\xb2\x51\x35\xc3\xe7\x73\x96\xef\x07\x2c\xdd\xbc\xce\xd7\xce\x24\xb1\x58\x9b\x85\xa9\xa0\xde\x46\xd3\xb2\xc9\x20\x57\x6c\xc4\x98\xcc\x07\x3b\x26\xe0\xc0\x27\xbd\x26\xf2\xa0\x23\x2f\x07\x86\x06\xd0\x6c\x19\x18\xac\x3a\x5f\xa3\x01\x5a\x9b\x35\xba\x92\x30\x5d\x83\x28\x22\x00\x7a\xa1\xb8\x01\x55\xaf\xe6\x09\x6f\x25\xea\xf8\xa0\x43\xd4\xe7\x2a\xe9\x51\x18\x97\x0b\x85\x68\x58\xb4\x83\x15\x13\x2e\x28\xa0\x9b\x80\xf4\x71\x7e\xfa\x8a\x14\x98\xce\x51\x27\x91\x95\x17\xa3\xfd\xd6\xf1\x88\x25\x1b\x0d\xcf\x1a\x9f\xa7\xba\xcd\xc3\xc6\x33\x0f\xf3\x8d\x5e\xca\x84\x9d\xae\xf9\xda\x1a\x7b\x62\xc5\xd3\xee\x5f\x38\xec\xa5\x97\x93\x9a\xf6\xce\xc1\x6f\x78\xdf\xef\x54\xd5\x33\x54\x34\x36\x18\xd8\xaf\x89\x49\x95\x84\x83\xa1\x30\x66\x75\xb8\x5e\xa4\xb1\x86\x59\x31\x8a\x46\x32\x2d\x78\x0f\xd7\xd4\x53\x6b\x00\x05\x2c\xc0\xf3\x5d\x3c\xcd\xfe\xf2\x2a\xe6\x55\xd9\xc0\x92\x96\x62\x43\x59\x15\x69\xc7\xfd\x6f\x57\x79\x5f\xae\x2d\x90\x86\xa7\x9d\x57\x48\x55\x16\xcb\x6d\xbb\xcf\xf3\x8d\x24\x23\xe2\x0a\xa5\x55\x44\x26\x37\x5f\x91\x5c\x45\x0b\xb4\x80\xfe\x85\x54\xa7\xf1\x6c\x62\xc2\xa0\xe2\xee\x26\x2d\x8b\x5d\xb1\x1e\x25\x98\xfe\x3a\xae\xd8\x17\x26\x94\xfb\xd0\xba\x19\xe7\x61\xbd\x78\x62\x33\xcc\x37\x26\x65\x4f\xa4\x56\x19\x61\x41\xde\x1e\x64\x1a\x56\x0e\x80\xa3\x81\x7e\x63\x13\xda\x62\x11\xb8\x21\x35\x20\x24\xb4\x9c\x17\x7d\xfe\x9c\x3c\xe9\x26\x51\xd2\xee\xdf\x2e\xfa\xcf\x35\xe8\x3a\x82\x9c\x08\xbe\xb1\x20\xc0\x51\x03\x4a\x6a\x68\x90\xe2\x29\x31\xba\x2f\xd4\xdf\xbf\xe4\x5c\x61\x14\x6a\xed\x52\xbf\xca\xd8\x9b\x1c\x76\x95\xd5\x9f\xee\xfd\x97\x81\x2f\xf1\x86\x39\x6a\xd8\xcb\x7b\x22\xed\xf3\x04\xdc\x55\xaa\x7e\x5a\x92\x4d\xea\xcd\xa2\x19\x64\x48\x38\xe3\xb3\xbf\x1d\x61\xd7\xe8\xc1\xd3\x95\xfa\xf2\xc8\x65\xa8\xd5\xa5\x91\x8a\x6a\x19\x1d\xa7\x3f\xab\xb9\xdb\x05\xcf\x45\xda\xa1\xec\x2b\xd4\x31\x57\xd5\xc5\xc1\xac\xac\x5e\x6c\x9c\x91\x8d\xc2\x90\xf8\x71\x90\x42\x84\x38\x75\x01\x09\x3c\x0a\x4d\x17\xad\xf1\x32\x3c\xeb\xf3\xb8\x17\x19\x0c\x92\xf2\x55\xb8\x92\xa4\x44\x10\x6f\xbc\x41\x7a\x61\x10\x67\xdc\x53\x73\xfe\x50\x56\x3c\xe1\xf9\x7c\x4e\xf1\xca\xeb\x12\xc7\x5f\x71\xff\x84\x9e\x6f\x52\x2a\x14\x05\x92\x2c\x25\x89\x9f\x21\x31\x6c\x3d\x92\xaa\xa3\x8a\x40\x83\x6d\x64\x23\x01\x4a\x16\x14\x10\xc6\x4a\x3f\x53\x1e\x4d\x4d\x2a\x5b\x10\xc8\xfa\xec\x97\x6a\x8c\x15\xdf\x74\x1f\xac\x79\xef\xa9\x99\x7d\x68\xfa\xb8\xe5\x31\xaf\xa9\xf5\x22\xfd\x14\xb1\x5a\x5d\xd6\xb1\x33\xc7\xa5\x7a\xe4\xcc\xd1\x1d\x98\xb8\xfe\x36\xc3\xa4\x07\x72\xe0\xcd\x2d\x47\x70\x0b\xbd\xe2\x5b\x35\x66\xae\x77\xf7\x4f\x6a\xde\xef\xd6\x56\x2f\xaf\xe8\xc3\x1c\x44\x29\x66\xb6\x90\xcb\x0a\x9f\x5d\x6b\x86\x45\xdb\x1f\x15\xd1\x69\x34\x7a\x27\x82\x33\xee\x17\x62\x93\x06\xb0\x24\x38\x7d\xc4\xde\xb7\x0a\x0e\x51\x7f\xac\x0a\x1c\xf9\xc8\x41\xcb\x78\xb9\x05\x72\x30\xb1\x56\x2c\xf7\x22\xe1\x7e\x6b\xcc\xfb\x2f\xce\xb0\xbb\xc6\x91\xc4\xb2\x97\x93\xbc\x52\x50\xce\x8a\x63\xc1\x20\x72\xb6\x07\x08\x27\x67\xc0\x07\xf0\x8b\x0f\xc1\xac\x28\x26\x2b\x2c\x10\x2a\x15\xac\x6f\xf0\x3a\x6f\x24\xf9\x06\x87\x13\x00\x4c\x58\x79\x30\xb7\xe1\x40\x3e\x7e\x80\xfd\xde\x08\x1b\x95\x37\xdc\xcf\x8d\x78\xdf\x3b\xa2\x7c\x70\x4a\x67\xc5\x4e\x2f\x66\x1f\x98\x5b\x81\xc5\xb8\x89\xf4\xeb\x54\x5d\x3d\x16\x5a\x9f\x4b\x7b\x91\xd4\xfe\xd1\xae\x51\x3e\x5b\x34\x93\x4e\x03\xe6\x8c\x8a\x51\x8d\x92\x76\xd8\x0c\x22\x7e\x76\x59\xa5\x81\x40\x8a\xa3\xc5\x97\x25\xa5\x0e\x0c\xac\x5c\x64\x61\x26\xdf\x9c\x2c\xbe\x65\x09\x41\x55\xfd\x71\xd5\x29\x18\x56\x84\xb1\x56\xd8\xab\xf8\xc8\x44\xc5\x47\xc8\xc0\x81\x71\x7b\x3a\x7c\xd9\x24\xb4\x0e\x73\xd1\x31\x3f\x0d\x03\x98\xe9\x11\x00\xa9\x4a\xf4\x5d\x7a\x54\x54\xed\xca\xe5\xe8\xdc\xc6\x34\xe9\x40\x07\x3d\x0c\x22\xae\x2d\xe6\xea\x92\x10\xa9\x3c\xab\xec\x83\xe1\x77\x7f\x79\xc4\xfb\xc7\x9a\x76\xb0\xc2\x8c\x28\x0f\x2d\x66\x92\xc2\xb8\x86\x0d\x24\x88\xde\x76\x78\x4f\x04\x70\xd0\x54\xad\x50\x43\x0c\x79\xb8\x43\x47\x78\x17\xe3\x8a\x35\xdf\x62\x54\xe5\x03\xbb\x1b\x53\x11\x5f\x86\x81\x05\xea\x12\xe3\x48\x7e\x99\xc6\x34\x49\x73\xf6\x87\xac\x92\xdc\x05\xf8\xdd\x17\xcf\x5a\x89\x64\x3f\xc9\xbc\xd9\x8a\xeb\x36\x2f\x85\xe1\x6d\xa7\x67\xc9\xeb\x7e\xc9\x39\xd0\x0e\x72\xb1\x19\xf4\x2f\x39\xfb\x31\xc4\xe8\x92\x73\x30\x13\xcd\x14\xd8\xd3\x2d\x39\xf2\x2b\x07\xd9\xe7\x1c\x56\xdc\x74\x3f\xed\xb0\x63\xdb\x7a\xd6\x4f\x25\xcd\x20\x2a\xd3\x49\xbf\xce\x59\x51\xa5\x70\x1d\xb9\xaa\x4f\xf1\xf8\x05\x98\x86\xaa\xb6\xc8\xf4\x18\xb7\xe8\x80\x9b\x09\xf0\x59\x5d\xb0\x38\x40\x8b\x19\x41\x1b\x81\x62\xe8\x9c\xe4\xa7\x92\x76\x18\x17\x42\xc7\xb0\x0f\xb0\x1f\x70\xd8\x15\x64\x06\x3b\x9d\xb4\x84\xfb\x2a\xc7\xeb\x2d\x56\xa2\x6b\xd2\x53\x64\xa2\x27\x22\x94\x62\x69\xad\x6e\x84\xcd\xf3\x4b\x8a\x8e\x06\xa1\x37\x57\x37\xc2\xd8\xb8\xa4\xad\x11\xb2\x86\xe5\x7b\xe6\x76\xf5\x81\x22\xff\xee\x9d\x8e\xf7\xba\xc7\x2b\xff\xce\xa8\x2d\xdc\xb1\xea\xb8\xc0\xd4\xd4\x71\x6f\xf0\x26\x57\xd5\x07\x82\x56\x0b\x39\xe2\x71\x05\xa9\x01\x9c\x5b\x5a\xe4\xb7\xe2\xe3\x56\x29\x6b\x8c\x65\x59\x74\x02\x15\x4d\x77\xd9\x5b\x38\x19\x05\x70\x82\x47\xdd\xf3\x70\x2b\xcc\x60\x3b\x5a\x59\x39\xc5\xc9\x4e\xda\x54\x63\x98\x6f\xa8\x22\x27\xa5\x7e\x02\x55\x05\x53\x01\x80\x61\x34\x92\x24\x12\x41\xcc\xee\xd6\xe3\xbb\x94\x24\x91\x7b\xca\xbb\x79\xd5\xa8\xd7\x0a\x0d\xaa\xbc\xc7\x83\x2c\x4b\x9a\xa1\x4d\x84\xf4\xff\xb3\xf7\xee\x61\x96\x64\x55\x9d\xe8\x17\x27\xb3\xba\x2a\x77\x3f\x68\x02\x1d\x1d\x07\x75\xdf\x00\xad\xcc\xe6\x9c\x93\xf5\xea\xa2\xbb\xfa\x81\xd9\x59\xd5\xdd\x09\x55\x59\x49\x66\x56\x23\xd3\x34\x9d\x91\x27\xf6\xc9\x13\x54\x9c\x88\xd3\x11\x71\x32\xeb\x20\x68\xf3\x10\xe4\x21\xa0\x80\x0c\xa5\x80\x30\x32\x8d\x2d\x82\x33\x82\x80\xe2\x8b\x0b\x0c\x17\x04\x01\xf5\x02\x8a\x0f\x50\xc0\xd7\xa7\x33\x57\x1d\xef\x6d\x75\xe6\x7e\x7b\xad\xb5\x5f\x71\x4e\x3e\xaa\xb2\x1f\x8c\x5f\xf6\x1f\xd5\x79\xe2\xb1\x63\x3f\xd6\x5e\x7b\x3d\x7f\xcb\x84\xe6\xf1\x28\xeb\x86\xb1\xeb\xa8\x3d\xcb\x68\xd7\xf8\xa7\x82\x1b\x96\x2b\x61\x6d\x8a\x60\x68\x55\xc2\x42\x1b\xc4\x50\x68\xa5\x3e\x38\x0d\xbe\xc8\x63\x0c\x49\x0b\x92\x4e\x8a\xa0\x6d\xb7\xaa\xc9\x2e\x4c\x72\x11\x46\x03\x1d\xbc\xa5\xe0\xaa\x68\x54\x8a\x0e\x94\xec\x31\x34\xae\xb8\xd0\x04\x8c\x56\x21\x17\x00\xe7\x5a\x33\xea\x93\x30\x68\x7f\x31\x38\x55\x1d\x9e\xfa\xd8\x82\x99\x21\x7c\xd8\xf6\xc1\xab\xe1\x2a\x4b\xb3\xfd\x9d\x0b\xec\x80\x1c\xc5\xd9\x34\x19\xf8\x49\xf0\x5c\xdb\x52\x07\xcb\xc8\x27\xe5\xed\xe9\x8d\x3c\x2e\xe5\x19\xbe\x48\xcf\x72\x10\x4f\x71\x0b\x67\x39\x21\x44\xe8\x9b\x85\xc0\xf4\xff\x38\xe5\xc8\x0f\xcf\xc8\x8d\x42\xc5\xb3\x14\x4d\xbc\xf6\x3b\x46\x5a\x40\x2a\x68\x5f\xfe\x9f\xff\xdb\xe0\xcb\x5e\xe5\x22\x81\x85\x16\x74\xb5\x62\xe3\x34\xe8\x62\x72\x4f\x1a\x2d\xc6\x2a\x4e\xd5\xe4\x4b\x59\x57\xe0\xa9\x85\xf6\x42\x75\x6e\xc5\x29\x0a\x73\xd5\x2f\x4a\xbe\xb7\x20\x25\x41\x17\x8b\x8c\x63\x72\x14\xbc\x02\xb6\x5c\x51\xd6\x0d\x5a\x06\x08\x64\xd5\x96\xca\xf0\x3c\x7c\xae\x25\x22\xc9\x71\x5d\x39\xf1\xa1\x6f\x63\xef\xf4\x18\xeb\xe5\xf1\x7a\x9c\x88\x35\x11\x49\xde\xf3\x72\x6f\xb1\x9f\xda\xa5\xd7\x52\x6e\x1e\xe0\x5d\xa8\x90\xb9\x90\x67\x52\xa0\xc0\x4f\x5a\x77\x4d\x75\x34\xe8\x9f\x7c\x24\x2d\x63\xac\x53\x79\x5f\x3f\x5e\x0f\x13\x28\xcb\x9c\xf1\x3c\xcb\x4a\x25\x8a\x48\x26\xe2\x5a\x6d\x81\x16\xdc\xf5\x7b\x65\x8d\x4d\xf4\xf2\xac\x05\x6b\xeb\xff\xb3\x17\xfc\x8d\xa7\x7f\xf2\x48\xa4\x99\x4a\xcb\x52\xa1\x16\xf2\xae\xaa\xdb\x95\x81\x75\xdd\xa2\x51\xea\x24\x4a\xd8\x91\xe1\x79\xd4\x89\x05\xdd\x32\x4a\x53\xfd\x42\x17\x69\x55\xb3\x92\xf7\x53\x08\xad\x88\x54\xb7\xdb\x60\xfb\x0a\x23\x10\x26\x7a\x61\xd9\x29\xc8\x43\x59\x9c\x97\xba\x8c\xbc\x50\xb5\x82\xca\x16\xf5\xa7\x20\x5c\x44\x69\xe2\x6d\x62\x89\xab\x42\x6b\xe4\xf6\x36\xfa\xd5\x31\x76\x55\xde\x4f\x67\x8a\xf9\x2c\x5d\xcc\xb2\xd2\x7f\xf7\x58\xf0\x96\xb1\x39\x2b\x3d\x8d\x54\x6e\xd3\x5f\x50\x1f\xf2\x7e\x2a\x79\x12\xb9\xc7\xe5\x12\x40\x75\x6c\x38\x45\x21\xb2\x45\xbe\xf3\x0c\xcc\xbc\x41\x9a\x5e\x0f\x93\x38\x52\xd8\x83\x58\x9c\x2e\x2c\xf5\xe0\x81\x69\x17\xfd\x5c\xd5\x95\x2b\x8d\x49\x9f\x3e\x75\x6e\xee\x24\x3f\xc4\x27\xe5\xb7\x30\xeb\x01\xbc\x0a\x65\x46\xd8\x80\x6e\x1f\xe3\xb6\x6a\x02\xba\xd4\x4f\x41\xb1\xca\x95\x31\x38\xcd\x78\xd1\x6f\x75\x54\x9f\xf4\xa9\xbe\x2a\x14\x7e\xb7\x3c\x6f\xcf\x84\x03\x93\xb4\x22\x60\x8b\x8d\xdc\x49\x73\x6d\x75\xfb\x12\x76\xa0\xb5\xdb\x5c\x1f\xcb\xa8\x6d\x57\xb8\xfb\xce\x22\xe6\x5f\xa8\xb1\x09\x58\xbf\x73\x85\xc8\xfd\x77\xd4\x54\x39\xc0\x57\xd7\x24\x3d\xca\x39\x93\x5b\xa4\x9f\x92\xbb\xb5\xcc\x07\xe8\x70\x35\x11\x44\x34\x63\x3d\xdc\x87\xee\xee\x01\xc9\xc9\xe9\x1d\x2e\x9c\x49\x2b\x76\x73\xe8\xbf\xa9\xa7\x4c\x01\x5c\xfd\x7d\x8d\x5d\x53\x08\x28\x1a\xa8\xe0\x35\xbf\x52\xdb\x02\x2b\x52\x33\xf8\x53\xf6\x3b\xc1\xcf\xc3\x0c\xab\xea\x83\x2d\xf5\xe9\xac\xc2\xbc\x9d\x59\x56\xc4\xe8\x96\xc5\x1b\x66\x05\x40\x8c\x52\xb5\x80\x44\x9a\x90\xe7\x61\x1a\x65\xdd\xa1\x8f\xe9\x12\xd7\xd6\x07\xbe\x59\x97\x80\x7d\xc3\x93\xd3\xde\x6a\x65\xdd\xde\x42\x9e\x49\x81\xd3\xff\x5d\x6f\x27\xd3\xee\xbc\x13\xfc\xb4\xb7\x8c\x52\xbe\xbc\xa8\xe1\x4d\x89\x2f\x2b\x33\xac\x3b\xe1\xd5\x87\xf1\xd8\xa4\x02\xfc\x61\x89\xe3\x27\x4d\x96\x7f\xaf\xb5\x1c\x60\x09\xad\xae\x91\x6a\x25\x5b\x17\x79\x1e\x47\x42\xbf\x49\x37\x9a\xec\xf7\x6a\xec\xdb\x41\x2f\x5c\x50\xc7\xd9\xa9\xa2\x15\x26\xc0\x67\xfc\x0f\xd6\x82\x9f\xad\xcd\x6c\x72\x57\xe5\xf8\x19\xdd\x21\x54\x1b\x13\x52\xe8\xd6\xa4\x80\x04\x35\xd4\xf5\x49\x59\x20\x88\x5b\x5c\x16\xbc\x17\x82\x2b\x5b\xef\x64\x38\x22\x24\xa3\xa0\xe2\x8d\x50\x77\x85\xda\xd7\xb5\xc3\xef\x4d\xc5\xc6\xbd\xb2\xb5\x02\x8f\x0a\xc5\x07\x81\x61\xa6\x9b\x31\x89\x4d\x07\x10\x17\xc0\xff\x79\x98\x6c\x84\x83\x02\x2d\xc6\x15\xd6\x5c\x9c\xe0\x87\xa7\x14\x57\x5f\x30\x27\xfe\x91\x29\xde\x09\x0b\x3e\x3b\xb3\x70\xef\xd2\xb3\x97\xee\x9d\x39\x79\x66\x6e\xde\xe1\x75\x1f\xf7\xd8\x55\xad\xb0\x17\x02\x68\x55\x2c\x0a\xff\xfd\xde\x0e\x6a\x82\xcf\x5a\x6f\x04\x2f\x01\xea\xb1\x1b\x01\x01\x2b\x8a\xa6\xa3\x3c\xeb\x61\x77\x95\x89\xd2\x3e\xdc\x6d\xa6\x58\x5a\x07\x3d\xd9\xeb\x9c\x06\xd7\xf2\x30\xb5\x34\xa7\xa1\xdd\xdd\x64\x1f\xad\xb1\x6b\x36\xe2\x34\xca\x36\x0a\xc5\x81\xfe\x73\x8d\xdd\xba\xed\x50\x9e\x85\xef\x54\xf6\x9a\x62\x48\x7f\x03\x63\xa3\x67\xd4\xee\x6c\x29\x99\xd6\xb1\x8b\x87\xa6\x00\x27\x0c\x6f\x14\x57\x52\x74\xae\x83\x75\x86\xb9\x81\x26\x96\x7e\x01\x11\x39\x8f\x32\x47\xb9\x8f\xfd\x1b\xa5\x02\x48\xd1\xc5\xe8\xb9\xfe\xb3\x82\xb9\x67\x69\xe5\xdb\xe6\x07\x40\x61\x21\x48\x57\x0d\x10\xaf\x40\x74\x31\xda\xaf\xa3\xb6\x8e\x90\x1d\x5f\x5f\x63\x0c\x8e\x5b\x00\x07\xf3\x5f\xaa\xcf\x5b\x9c\xfc\x3b\x2e\xe3\xbc\x3d\x27\x25\xc2\x8a\x0c\x48\xe7\xaa\x28\xff\xf7\x38\x51\x5f\xb6\x8f\xf1\xcd\x4b\x85\x2f\xdc\x96\x64\xad\xf3\xfe\x57\xc6\x83\x3f\xf5\xe8\xc7\x66\xe6\xef\xd9\xb9\x93\x8b\x7c\x12\x8c\x0a\x87\x6f\x3c\xd2\x3c\x7c\xfc\x86\xe6\xe1\xe6\xe1\xe9\x23\xc7\x82\x7a\x70\xe4\xd0\xa1\xc3\x27\xa2\xd5\x1b\x4f\x9c\x98\x3e\x7e\x2c\x98\x7a\x98\x6d\xe3\xe2\x42\x4b\xf4\x4a\x5c\x31\xab\x77\xb2\x43\x24\x04\x93\xb1\x86\xc2\xd0\x28\xce\x04\x75\xe2\xd8\xb2\x08\x36\x2f\x7a\xe3\xad\x38\xca\x1d\xed\xe8\x6b\x35\xb6\xce\xe0\xb2\x9f\x06\x21\x8c\xd2\x8e\xb1\x1b\x8a\xae\x9b\x5b\xe0\x38\x4f\x98\xd9\x28\x2e\x84\xdd\x5e\x42\x01\x22\xd5\x99\x91\x62\x6d\x65\x72\x6c\x01\xff\x2f\x3d\x76\x05\x0e\xce\xff\x63\x2f\xf8\x88\x77\x0a\x07\x8a\x9f\x4f\x62\xc4\x2b\xdd\xf1\x30\xc3\x74\xb7\x7d\xe3\xd4\x01\xd2\x33\x15\x07\xc1\xd0\x4b\x49\x7c\xb0\x51\x06\xd0\x5c\xd6\x2f\x0b\x75\xc2\xc2\xa4\x01\x34\xf8\x16\x2e\xb2\x0f\x4c\x38\x84\xd8\xca\xb2\x3c\x8a\x53\x1d\x69\x7b\x5a\x84\x85\xf0\x7f\x7c\x22\xf8\x2e\xf8\x4b\x47\xa0\x86\x60\x98\x85\xdd\x29\xfb\xe6\x6a\xb6\x2f\xde\x4b\xe3\xda\xab\x63\xf1\x18\xc6\x98\xbe\xdf\x8e\x31\x7d\xd7\xae\xeb\x58\xac\x3d\x5a\xc5\x2a\x3e\xa9\x8a\x55\xfc\xa6\xc7\x8e\x6c\x21\xda\x8c\xd8\xa2\x50\x9b\xe2\x95\xde\xc8\x0a\xac\xf0\xc0\xa3\x5d\x9e\xe2\x21\xef\xb9\xdb\xc7\xc6\xde\xe4\xdf\xa8\x63\x63\x9d\x61\x55\x02\x64\x61\x04\xd5\xd0\xd8\xd7\x8f\x8f\x34\x2a\x9a\x08\x0b\x4c\x33\xfa\xeb\xb1\xe0\x8e\xca\x35\xb9\x93\x46\x17\xb8\xb0\x0b\x6b\xf6\x29\xb2\x55\xbf\xec\x32\xb9\x37\x8c\xb1\x7f\xf0\x18\xd3\x99\x3d\x85\xff\x75\x2f\x38\xbd\xe8\x16\xea\x24\xa6\x63\xb2\x6a\xb2\xd5\x42\xe4\xeb\x61\x69\x02\x67\x75\x24\xc0\xc1\xc2\xad\xeb\xe9\xf8\xb7\x9e\xca\xae\x67\x47\xb7\x95\x76\x75\x57\x75\x0e\xda\x43\xde\x41\xf6\x44\x67\x19\x7a\xf2\xa0\x6f\x74\x45\xbe\x26\x1a\xe7\xc5\xc0\xdf\xef\xef\x93\xdb\x88\xc9\x27\xff\xdd\x88\x27\x75\x5c\xe6\x01\xff\x0a\x78\x8b\xb1\x37\x7b\x6c\x5f\xaf\x23\x0f\x86\xd7\x7a\xc1\x8b\xbc\x05\xf9\xa7\x8a\xae\x53\x43\x48\xe2\xb6\x68\x0d\x5a\x89\xe0\xf0\xe4\x50\x34\xc9\x4e\xd3\x4f\xcb\xb0\x38\x5f\x4c\x03\xae\x45\x5c\x94\x80\xfd\xd3\x07\x84\x65\x13\x41\x31\xed\xa4\x72\x3d\x9e\x7d\xe7\x26\xd5\x13\x89\x20\xfe\xf6\xda\xe0\xd0\xa5\x54\x56\x7d\x7a\xb5\xa8\xea\x7b\xae\x65\xbf\xb4\xcf\x59\xf9\x07\xf6\x05\x7f\x35\xb6\xbc\xa3\xf5\x4e\x0d\x34\xbd\xbb\xda\x68\x5d\x86\xcf\x81\x9d\xae\xa8\x73\x2b\xb8\xd8\x7c\x0c\xcf\xff\x0e\xe0\xf2\x0e\x7a\x82\x07\xb7\x87\x71\x22\x22\x84\x37\x56\x79\x64\x79\xdf\x6d\x30\x2e\x78\xd1\x2f\x7a\x00\x46\xb2\xd3\x76\x97\xd4\x0b\x43\x4d\xdf\x64\x94\x54\x6a\x3c\x17\x45\xbf\xab\xd4\x20\x3b\x8f\x0f\x35\x09\xca\x7d\x23\xc9\xa5\x05\xf6\x78\xd0\x14\x2a\x7d\xd4\x35\x4e\x77\xda\xc7\x59\x7a\x61\xc4\xe8\x2f\x31\xbb\x59\xca\xbb\x49\x16\x46\xc5\xb4\x41\x08\x2a\xa6\x9f\x97\xad\x16\x8d\xbc\x9f\x36\xca\xac\x41\x9d\x8b\xb3\x74\xda\xde\x99\x47\xd8\x21\xd6\xdc\x51\xf5\x4e\x6b\x53\xee\x24\x17\xff\x11\xd9\xba\x67\xd8\x15\x6d\xa0\x17\x7f\x56\xc1\xf6\x37\xc1\xd1\x04\xc0\xfa\x3a\x62\x12\x2d\xef\xb9\x08\x41\x27\xc0\x1d\x8c\x74\xe6\xaa\x31\x5f\xab\xb1\x09\x30\x26\x43\xbe\xe4\x17\x6a\x97\x9f\x30\xf9\x93\x35\x9b\x75\x82\x45\x4f\xd1\xd8\xf3\xb2\x55\x1b\xc9\x09\xbe\x27\x7b\x85\xea\x20\x46\x42\x3c\x2f\x5b\x1d\x22\x26\xd7\x57\xa7\xe9\x1f\xf7\x5b\xbd\x12\xcc\x20\xe5\x18\xa9\x0d\x4a\xad\x32\xb1\x72\x01\xa0\x2b\x71\x69\x11\x79\x35\x04\x50\x76\xba\xe4\x62\x5d\xe4\x03\x7c\x3a\xac\xec\x0a\x14\xac\xf0\xfb\x36\xcc\xb8\x66\x3d\xd8\xc9\xc5\xdb\x67\x8f\x1e\x3d\x7a\x23\xa7\x5a\x98\x11\x9e\x52\xfc\xdc\xf2\x6c\x93\x2d\xb1\x09\x28\x06\x2c\x22\x11\xf9\xb7\xab\x95\x3b\xbc\xc3\x95\x5b\x52\xaf\xba\x8b\x37\xab\x0b\x43\xdf\xa8\x5a\x7c\xb2\xdb\x22\xde\xb6\xaa\x42\x43\x58\xaa\xd3\xc8\x97\xc7\xd8\xb5\x7a\xdb\xce\xa5\x91\xb8\x20\x20\x32\xe6\x43\x63\xb3\x95\xab\xe4\xc9\xc3\x1d\x4d\xb7\x78\x4c\xf7\x60\xb1\x9b\x14\x6d\xae\xf6\xd9\x99\x2c\x12\xfc\x16\x1e\x60\x03\x51\x80\x18\x86\xca\x8e\xdb\x0d\x4b\x54\x44\x55\x1b\x52\xff\xb1\xe7\x34\x2c\x78\x24\x5a\x71\x17\x22\xe5\xa1\xb7\x05\x2f\x44\x2f\xcc\x15\xac\x86\x94\x79\x42\xf2\x43\xd9\x95\x25\x4c\x9c\x63\x9c\x4a\x2a\x02\x1a\x83\x0c\x14\xf9\x6c\x2e\x04\x44\xd5\x64\x54\x83\x42\xb4\xfa\x10\x1a\xe1\xd6\xa6\xe8\xca\x7e\x14\x02\xe3\x23\xed\x5e\x91\x8d\x0b\xa9\x4b\xde\x84\x6c\x69\x91\x00\x54\x8e\x09\xc3\xcb\x63\x51\xd4\xdd\xee\x86\xbc\x33\xe8\x75\x44\xda\xe4\xb7\x67\xb9\xd2\x22\xeb\xca\x2e\x39\x3c\xa7\xb2\x23\x87\xeb\xfc\x68\x9d\x1f\xab\xf3\xeb\xe1\x5b\x4f\xad\x1b\x55\xb1\x32\x55\xc1\xe1\xfa\xd1\xc6\xf5\xf5\xa7\xba\x51\x07\x1f\xa9\xb1\x6b\xcc\x82\xc0\x2e\x7f\xef\x2e\x76\xf9\xdf\x79\x5b\xee\xf2\x8d\xd0\x3a\x03\xd4\x36\x91\x3b\x73\xad\x1f\x82\x89\x50\x03\x12\x93\xe1\xa6\x13\xf6\xe4\xa6\x6a\xac\x8a\xb6\x5c\x0e\x58\x23\x1e\xb6\xf2\xac\x30\x4b\x6d\xe2\x50\x8a\x4b\xdf\x79\x94\x22\xa2\x26\x80\xd8\x01\x05\xf9\xca\x4e\x38\xfd\x97\x53\x52\x74\x84\x5b\x4f\xbc\xc9\xfe\xcf\x03\xec\x98\x75\x26\xb4\x93\x6c\x83\xf8\x99\xce\x62\xb0\x92\x6c\xd1\xea\x02\x01\x91\xaf\x3c\x10\x7c\xa0\x36\xf2\x16\x2a\x83\xbd\x5c\x44\x84\x61\x88\x85\x4e\x30\x6c\x6a\x74\xda\x76\xd8\x6a\x81\x84\xbd\x46\x1a\x71\x9c\x43\x02\xb5\x0e\xe0\x2d\xc3\x7c\x4d\x94\xee\xcb\xe7\x16\x4f\x37\xf9\x0c\x1f\xdd\x05\x1d\xa5\x65\x0a\xe1\xb6\x31\x68\x88\x42\xba\xc0\xac\x36\x19\x4e\xb9\x71\x5c\x08\x8e\x23\x29\x5d\x7e\xbe\xb0\xe2\x53\x0d\xfe\x9b\x6c\x65\x72\x75\xd3\x17\xad\x6c\xe7\x73\x8b\xa7\x47\x36\xd1\xbc\xe8\xed\x83\xf6\x2f\x7a\x8f\xab\x3c\xee\x08\x73\x0f\xec\x63\x9f\x1d\x63\xd5\x47\xfc\x0f\x8f\x05\xff\x5c\x5b\xa9\x5c\x5d\x21\x15\x1c\x2d\xd8\xfd\x3c\x81\x34\xb4\xf8\x82\x72\xfa\x52\x71\x63\x32\x49\x80\x98\xa2\x62\x3a\x33\x6d\x68\x20\x85\x19\xa2\xf3\x9c\x9d\x7c\x82\x71\xde\xe0\xc1\x74\x47\x84\x49\xd9\x79\x7e\x20\x3f\x96\x88\xb5\x30\x31\xd7\xaf\x83\x8b\x71\x52\xb9\x6c\x1e\xe5\xab\x7d\x9b\x0c\xca\x0e\x82\xe5\xd2\x73\xd3\xd7\x05\x68\x18\xdd\xf4\x09\xf9\x61\xf9\x94\x13\x1f\x28\x85\xee\xac\xdb\xcb\x52\xc9\xa0\xf0\x21\xaa\xee\xdc\x64\x41\xe5\x61\x87\x7a\xfa\x79\x52\x34\xc9\xb1\x6c\xe2\x05\xeb\xf2\xa7\x4a\x67\xc7\xc8\xf1\x64\x80\x66\x44\x93\x59\xb3\x25\x92\x11\xdf\x54\x7a\xba\xc2\x1f\x2f\x44\xc9\xd8\xe7\x3c\x86\xab\xef\xff\x57\x2f\x78\xb9\xb7\x02\x7f\xaf\xb8\xc0\x44\x3a\x5c\x1b\xc9\x70\xf4\xfa\x54\xc7\x07\xcf\x82\xdd\xfe\x51\x1f\xd3\x3f\x31\x76\xf7\xc3\x99\x0a\x6a\xaa\x44\x81\xda\xe8\xff\x24\x0b\xbe\x7f\xcb\x27\x2a\x10\xbc\x94\x60\xa0\xd0\x41\x41\x9c\xda\xec\xfd\x8b\xde\x15\xbd\xa4\x9f\x87\xc9\x45\x0f\xac\x5a\xce\x16\x7c\xc7\x04\xfb\x7b\xa9\x49\x4b\x59\x35\x93\xe7\x9e\xff\x35\x2f\xf8\x84\x67\x7e\xbb\xeb\x06\xf6\x02\x11\x59\x49\x80\xa8\x66\x54\x4a\xda\xac\x8a\x24\x4b\xd7\xa0\x83\x93\xa2\xb9\xd6\xe4\x07\xc3\x24\x39\x38\x65\xaa\x9b\xf4\xfa\xab\x89\xe4\xd6\x70\x04\xcc\x2c\xcc\xf1\x48\xd5\x95\xe1\x51\xd6\xea\xcb\xe3\xb8\x40\xfb\x20\x00\xea\x4a\x79\x41\xd5\x40\xc9\x54\xb4\x1f\x8f\xd3\xf5\xac\x45\xea\x1d\x94\x6e\x5c\x91\x6b\xd8\x2a\x13\x2e\x79\x69\x98\x24\x5b\xe6\x3d\xfe\x9a\x47\x46\x3e\x40\xfd\x3f\x4f\x46\x3e\x25\x00\x10\x04\x33\x5c\xd6\x48\x19\x3a\x05\x94\xce\xc6\xbc\x0b\x01\x3e\x06\x97\x05\x14\xa1\x38\x5d\xeb\x27\x61\xde\xa4\x05\x31\xb3\x12\xa7\x05\x94\xdc\x2a\xec\xbc\xd7\xb8\x20\x7b\x62\x88\x1f\x5f\x91\x9f\x5c\x31\xb0\x20\x6a\x82\x20\xf7\xd3\x11\x0f\xee\x63\x07\xe4\xb2\x3c\x43\x8e\x41\x04\xdf\xaf\xfe\xde\x66\x14\xb0\x92\x26\xea\x59\x8f\xc9\x76\x19\x06\xd8\x89\xd3\x71\x51\xba\x12\xc9\x8f\xd6\x18\xd1\x92\xff\xe2\x5a\xf0\xf7\x1e\xfe\xad\xbe\x48\xbf\xec\xb8\x39\xbb\xc8\x11\x90\x2a\x1d\xea\xa3\x52\x49\xa9\x3c\x63\x3f\x95\x72\xc4\xca\xb4\xdc\x4b\xd3\x37\x03\xc1\xdd\x3a\x7d\x33\x59\x9f\x6e\x9d\x6e\x36\x9b\xd3\x37\xe3\x97\x6e\x5d\xa1\x98\x50\x4c\x0e\x28\x2b\x31\x7b\x9b\xed\x07\x3e\x69\x57\xdf\x59\xb9\x19\xf6\x52\x93\x9a\x6c\xd2\x17\x57\xa6\xac\x78\xd3\x24\xe1\x49\xb6\x21\xf2\x56\x58\xb8\x51\x7d\x5f\xf1\x18\x2b\x3a\x59\x8e\xb0\xa8\xfe\xe7\xbd\xe0\xfd\x9e\xf9\x8d\xa3\x92\x3f\x69\xbf\xaa\x38\x2c\x35\xee\x3a\x17\x17\x7a\x59\xf1\x48\xee\x82\x9b\xe1\xfb\xf2\xf3\x72\xb6\xe6\x0c\xa3\xac\x0e\x6a\xd3\x7d\x72\xbf\xc7\x0e\x28\x9a\xf6\xcb\x60\x4d\xfd\xad\xe9\x4c\xfd\x1e\xb5\xee\x5b\x7c\xd2\xa1\x38\x7d\x39\xa2\x0d\xe0\x4c\xf3\x6f\x8d\xb3\xef\xb1\x21\x49\x7a\x3d\x40\x8c\x3f\x19\x8a\x6e\x96\x2e\x89\xd2\xa0\x41\xbd\x63\x3c\x98\x1b\xbe\xbc\x29\x18\x14\xd7\xcf\x22\x14\x54\x4b\xe4\x65\x18\xa7\x88\x03\xd5\xdc\x12\x08\xea\x83\x63\xdf\x94\xc8\x45\xcf\x36\xe0\x54\xf3\xc1\xcc\x4c\xb5\x2c\xd8\xb6\xf0\x54\x94\x09\x30\x0a\x3d\xea\x76\x8d\x4e\x75\x73\x30\xbd\xdc\xb9\x6c\x14\xaa\xd3\x1a\x85\xea\xb6\xe0\xfa\xa5\xd1\xb8\x53\xda\x06\xb5\x2d\xee\xd4\x61\xc2\x9d\x9a\x0a\x9e\xb8\x4c\x01\x90\x66\x51\x47\x23\x4e\xbd\xf5\x4a\xf6\x6d\x9b\x98\x89\xfc\x17\x5f\x19\x1c\x7e\x7a\xb6\x3a\x64\x9a\x1c\xae\x2b\x4f\xe5\x7f\x9f\x57\xb5\x50\xfe\xed\x04\xfb\xbc\xed\x03\xf9\xd8\xae\x7d\x20\x2f\xa9\xd6\xf2\xb6\x4b\x6b\x3e\x6a\xd5\xbc\x7f\x4f\x39\x48\x7e\xcb\x63\x53\x3b\xb2\xb9\x81\x5f\xe4\xad\xa3\xfd\x22\x91\x28\x20\x89\x5b\x63\x41\xc3\x9c\x82\x25\xe9\xd1\xf5\x95\xb0\x8f\x78\x9a\x1e\x3f\xe0\x6d\x81\x45\x33\x6c\xcd\x0e\x5e\xee\xcd\x8e\xf0\x59\x3c\x16\x83\xd8\x73\xf9\xee\xb9\x7c\x1f\x2b\x97\xef\x43\xde\xfc\xf6\xde\xc6\xa7\xf8\x53\xda\xdb\x08\x3b\x49\xfb\x17\x9f\x9e\xad\x56\xbd\x8b\x9f\x5f\x63\xdf\x35\x32\xb4\x12\x50\x1b\x01\x32\xee\xbd\x6b\xc1\xed\xd6\xef\xca\x09\x6f\x81\xea\xd9\xc6\x01\xb4\x4a\x23\x2e\xbd\x2a\x5d\xe8\x32\xef\x2f\xb6\xd9\x17\xf6\xb3\xc7\x27\x59\x18\xdd\x16\x26\x52\x58\xcf\x67\x93\xb0\x28\xfc\xdf\xdc\x1f\xfc\xe2\xfe\xa1\xcb\xda\xf1\x06\x3f\x94\x84\x9d\x85\x11\x5f\xa5\xc7\x38\x14\x0e\xed\xea\x5d\x05\x2b\xaf\xe0\x27\x8d\x9a\x84\xd1\x68\x6e\x44\x9b\x95\x63\xac\x4d\xde\x5a\x94\xc2\xa4\xe3\x46\x51\x0e\x12\x61\x55\x5f\xad\x53\x49\x52\xab\xde\x2b\x9a\x49\xea\x1c\xf4\xb0\x40\xed\xc7\xc6\x7a\xdc\xc3\x78\x17\xb2\x80\x40\x7d\x55\xe7\x6e\x93\x9f\x4b\xc9\xc6\x42\x39\xd3\x64\xba\x24\x41\x1d\xc2\x79\xd3\xa8\x21\xa7\xd6\xcd\xcd\x6f\xc9\xef\x4b\x25\x9c\x8c\x85\xda\x4e\xa7\x06\xae\xca\xf4\x1e\x3c\x6d\xcd\xe8\x41\x42\xf5\x29\x4d\x76\x87\x8a\x2f\xdb\x72\x4a\xa9\x8c\x7d\x9d\x97\x59\x14\x0e\x74\x56\x9c\x41\x6c\x8f\xa4\x2c\x51\x76\xf2\xac\xbf\xd6\xa1\xe5\xca\xfa\x91\x8a\xa9\x45\x04\xc5\x35\x3c\xda\xeb\x60\xc4\x21\x26\x17\x42\xa1\x7f\x48\x81\x4b\x07\x26\xd6\xcd\xf9\xba\x0a\x23\xac\x93\x4d\x22\x2c\xd0\xed\x40\x64\xb7\x5d\xc7\x37\x94\x1d\x04\x12\x00\x71\x76\x0a\x5a\x43\x63\x24\x01\xf2\x6a\xf2\x19\xab\x17\x5b\x36\x8c\x3a\xb7\x3b\xca\x62\x4a\x0d\x2b\x5e\x4b\x25\x9b\xd0\x5f\xc3\x38\x2a\x51\x5a\x74\xb6\xfd\x6a\x22\x06\x36\x98\xe6\x91\x19\xa1\x2b\x48\x2f\x70\x86\x6b\x5c\x5d\xe0\xb3\x69\x4b\xe8\xe9\x92\x0d\x13\x3f\x43\xe4\x1f\xf7\xbb\x2a\xd6\x6a\x23\xee\x29\x30\x07\xbd\x6b\x61\xd1\x91\x07\x62\xca\x51\x9a\xa5\x95\x8f\x41\x07\x1c\xb9\xef\x4f\x6b\xec\x1a\x7b\x0b\xcf\x2d\xf8\x9f\xad\x05\x1f\xa9\x41\x2e\x95\x81\x67\xd0\x83\x90\xf2\xe4\x09\x6e\x37\xea\xfe\x80\x0e\x4a\x25\x4b\x79\xbb\x74\x22\xdd\xdc\xc2\x08\x20\x2a\x67\x66\x29\xdd\x25\x12\x3d\x91\x46\x05\xc2\x01\x98\xf4\x4b\xd0\x81\x13\x2c\x93\x2c\x57\xb1\xa1\x69\x55\x21\x60\x51\xfb\x03\x0d\x79\xe0\x8c\x4b\xcd\x56\x85\x4a\xb4\x5f\x6e\xe4\x3c\x23\x5d\x44\xda\xa7\xe1\x7e\x58\xe7\xb7\x28\xbd\x13\x34\x68\x1c\x86\x33\xcb\xaf\x1f\x63\xdf\x6e\xf7\x06\x73\x74\x17\xe5\xfa\x16\xfe\xff\xa8\x05\x5f\xaa\xd9\xac\x0e\x4d\x26\xd5\xf4\xcd\x5e\x12\x96\x52\x3b\x27\x47\x21\xf4\x50\xe5\x45\x5b\x68\x03\x95\x1d\x6d\x3a\x2b\xbf\xdf\x58\x75\xd6\x09\x82\xf6\x74\x66\xb5\xca\xbe\xd5\xdd\xa0\x63\x77\x6e\xa1\x78\xb8\xe7\x26\xb8\xb4\x60\x0b\xaa\x68\x23\xa9\x11\x25\x66\x1d\x74\xa1\x33\x0c\x1b\xee\xe7\x1b\xed\x38\x17\x1b\x61\x92\x4c\x6f\xa1\xc5\xff\xdc\x18\x3b\xa0\x30\x56\xfc\xb7\x8e\x05\xf7\x8f\x2d\x66\xfd\x52\xe8\xfd\xa4\x27\x35\x23\x57\xa6\x24\x65\x04\xb6\x38\x2f\x06\x68\xa1\xa5\x18\x48\x0b\x6a\x23\x2e\x34\x70\x0b\x30\x42\x9d\xf6\x8e\x29\xc9\x64\x9e\x25\x6b\x94\xda\xb7\x9a\x45\x66\x64\xa6\xb7\xe0\xb7\x54\xf6\x00\x94\x07\x82\xd4\xc6\xb2\x18\xae\x7b\x64\x95\xf3\x82\x05\x92\x5f\xeb\x66\x51\xdc\x1e\x48\x0e\xe3\x6e\x66\xac\xfb\x3d\x8b\x73\x38\xb7\x50\xe7\xf3\x59\x24\x16\xb2\xbc\x44\x59\xd4\xde\xd0\x4d\x3e\x67\x2d\x33\x1d\x51\xa7\xa8\x6b\xf3\x50\x97\xfc\x52\x61\xdb\x89\xc7\x36\x4c\x8c\xb1\xba\x36\xfd\xe0\x16\x95\x0e\xde\x59\x63\x8f\x2b\x44\x21\x25\x22\x05\x5e\xe3\xff\x58\x2d\x78\x49\x6d\x49\x6d\xff\x00\xd1\xb5\xe6\x16\xa8\xb4\xf6\x7c\x96\x8a\x00\xa2\xb3\x61\x62\xbb\x61\x0c\x91\xdb\x9c\x5a\xe1\x0a\x37\xa5\xc9\x31\xff\xd8\x10\x3c\x14\x8f\x8b\x46\x3c\xa8\xcc\x5f\xea\x4b\x72\x5d\xe5\x67\x5c\xcb\x0d\x5e\x79\x18\xe7\xe5\x49\xeb\x71\x5e\xf6\xc3\xa4\x11\xf7\x0a\x54\x71\xf0\x86\xa4\xf7\x0b\xb1\x2b\xb5\xff\xde\x7e\x76\x95\x85\x8a\x52\xf8\x1f\xdd\x1f\x3c\xb0\xdf\xbe\xa2\x7d\x75\x94\x78\xdf\x40\x37\xa5\xb2\x67\xab\x47\x91\xc8\x09\x67\xd0\x39\x4c\x41\xac\x53\xfd\x55\x47\x28\x95\xe6\x52\xcd\x52\xa2\x67\x21\xb7\xbe\x26\x56\xe2\xc1\x2d\x15\x27\x61\x4b\x7e\xd5\xe3\x0f\xcc\x7b\x94\xb9\x58\x84\x5d\x41\xb1\x0c\x85\xde\x18\xcb\xb8\x3d\xd1\x01\x78\x0b\xe0\x0c\x34\xf9\xb2\xd3\x79\x25\x1a\x42\x92\x60\x75\xeb\x86\x72\x83\x14\x25\x3f\x7c\x9c\x1e\x0e\x07\x95\xda\x56\xa7\x74\xbf\xc1\x87\xde\xc9\x0a\x91\x12\x69\x50\x5e\x0d\xc5\x64\x58\x1f\x25\x41\x45\x07\x5c\xad\x86\xad\xf3\xf2\x38\x1b\x81\x57\xe1\x32\xfc\x30\x49\xc0\x41\x03\xd0\x82\x92\x07\xa4\x99\x7e\xd9\x72\xa7\xa2\x35\x4a\x7d\x50\xd9\x88\x80\x1c\x5d\xae\xd2\x09\x0b\xa7\x09\x34\x49\x85\xa5\xa2\x72\x42\xc9\x48\x05\x21\xcf\xd1\x32\x22\x6a\xe2\xb2\x3a\x08\x94\x96\x4a\x8e\xa7\x81\x5d\xcf\xaf\x2b\xc2\x14\x0a\xdf\xe8\xfe\xa8\x5a\xed\x2d\x08\xf7\x09\x13\xad\xe2\xc6\x6d\x92\x47\x41\x68\xea\x42\x2a\x42\x21\xd2\x42\x9b\xf8\xc1\x38\x86\x5f\xb2\x21\x35\xaa\x90\x0e\x66\xca\x14\x6a\x13\x64\x82\xea\xf9\x68\x65\x69\x51\xe6\x21\xd2\x9a\x9b\x86\x7d\xa9\x48\x59\xab\x03\x02\xc3\xa4\xd9\xc7\xd4\x5b\x5b\x64\xd7\xb4\xa6\x8e\xb5\xca\x17\x22\xa9\xef\x22\x82\x12\xe0\x35\xea\x23\xb7\x0b\xe5\xe4\x20\x78\xa4\xdd\x07\x99\x67\x5d\xd7\xa8\xdf\xf4\xb4\xfa\xcd\x31\xf6\xad\x23\x49\xdf\x7f\x60\x2c\x78\xf3\xd8\xc8\x5b\x3a\x17\x3a\x6e\xbb\x5a\x16\x9a\x9a\x0a\x4c\xbe\x96\x67\x9e\x3e\x6d\xac\x43\x2f\xcd\x22\x01\x18\x50\x80\x91\x45\x47\x6e\x63\x23\x8e\x8c\x7a\x5e\x34\x79\x00\x3b\x2f\xe0\x0a\xc0\xb1\x70\x54\x76\xb4\x02\xcc\x2d\x20\x89\xaf\x67\x71\x84\x1e\xeb\x56\x96\x46\xbc\x93\xf5\x80\x2c\x1d\x09\x12\xf1\xc7\x23\x81\x42\x03\x20\x59\x10\xa7\x41\x45\x24\x8f\x8b\xf3\x05\xef\x65\xa5\xe6\x31\x71\x97\xc4\x9a\x48\xf7\xbe\xe8\xe5\x22\x8c\x00\x27\x2a\xa0\x73\x2e\xe0\xd9\x6a\xd1\xea\xe7\x5b\x75\x50\x12\x78\x2b\x94\x9c\xcc\xe9\xa3\x31\x26\xc3\x9c\x38\x0a\x11\x6c\xd5\xb5\x2c\x8b\x20\x9b\x10\xcd\xf9\x61\xd4\x30\x1d\xb0\xd7\xf0\xaf\xae\x66\xac\xa5\x8e\xdd\xc2\xff\xf2\xd5\xc1\x9b\xaf\xd6\xc7\x70\xc5\xad\x28\xbb\x84\x58\x1a\x02\xe4\x83\x78\x2d\x55\x42\x5a\x5c\xa8\x39\xc1\x03\x5b\x72\xa7\x7e\xd1\x87\xc9\xd0\x4f\x62\xc2\x69\x32\xc0\xc4\xa2\x30\xd5\xc8\x1c\x0e\xe7\xe9\x86\x29\xbc\x57\xc7\x18\x93\x06\xa4\x67\xf0\xc9\xb0\xe0\x3d\x29\x59\x23\x8e\x84\x63\xe9\x9d\xd2\xa5\x4d\x11\xac\x55\x6e\x6c\xe0\xdd\x7a\xbf\x25\x0a\x37\x4c\xe3\xb9\x40\x5f\x6f\x42\xf0\x96\x8d\xb8\x10\xa6\x5c\x90\x89\x2f\x02\xba\xb4\x80\x5b\xad\xbd\x64\xb9\xc1\x49\x29\xd2\x82\x2e\x2a\x3c\x05\xef\xa7\x89\xc2\xaa\x02\x9a\xb1\xb6\x39\x24\x5e\x81\xda\xa0\xde\xcd\x1c\x09\x86\x4f\xaa\x18\x35\x9d\x89\xaf\xbf\x4c\x59\xf7\x92\xd1\x00\xfe\xda\x70\xfb\x6e\xd3\x60\xbf\x72\x1b\x8f\x15\xaa\x19\xe0\x28\x96\xee\xa8\x94\x45\x22\x71\x8f\x9e\x3a\xc6\x8a\xa1\xf9\x86\x87\xab\xd9\xba\x98\x6a\x72\x5e\x2d\x92\x46\x22\x4e\x5d\xe1\x05\xa2\x5d\x6e\x32\x08\xa6\xa0\x08\x60\x48\xe7\x9e\xa1\xa4\x26\xe7\x4b\x84\x8f\x01\x1d\x29\x33\x6a\x82\x58\x72\xc8\x83\x8e\x08\x23\x98\x4a\x5a\x92\x80\x4f\xa6\x19\x27\xf9\x83\xcf\x2d\x4c\x29\x81\x13\x4d\x0c\xed\x7e\x82\x87\x3a\xe6\xa7\x1a\xbb\x9d\x7d\xb4\x10\xc8\x05\x01\x24\x4b\xea\x91\x72\x0b\xe8\x69\x44\x46\xb9\x0a\x49\xe0\xbb\x14\x56\x37\x3f\x63\x5d\x15\xdd\xa8\xe5\x19\xc9\xb5\xf6\xaa\xd5\x0d\x81\x8e\xa6\xc8\x11\x7a\xf8\x16\x1a\xbf\x2b\x2f\x0f\x77\xd2\x39\xd9\x9c\xbd\x04\x46\x77\xf2\x58\x6b\xdb\xa8\xe6\x20\x4a\x7d\xde\x62\xd8\x75\xed\x1e\x05\x59\xc8\x06\x68\x30\x8c\xe8\xee\x43\xf7\xa0\x38\xa0\x1b\xc6\x90\x66\x25\x79\x01\xc5\x35\x19\x3b\x67\x36\x59\x30\xb7\xb0\x7e\xfc\x64\x3f\x4c\x96\xca\xb0\x75\x3e\xd0\xca\xfb\x5a\x58\xda\xd0\x91\xd5\xa8\xd6\x24\xee\xc6\xc4\x19\xb2\x54\x28\xe9\x00\x09\xca\x0e\x57\x81\xcf\x86\xc5\x56\xc3\x15\x3b\xfa\xa6\xdc\x64\x9d\x2c\x89\xc0\x74\x74\x21\xee\xf6\xbb\xb0\xe0\x1b\x99\x96\xb5\x26\x23\x29\x58\x17\x72\x18\x52\xd5\x05\xdc\x53\x11\x53\xa9\xca\x48\xe4\x72\xe3\x2d\x77\x44\x21\x0f\x09\x9a\xc5\x56\x96\xe7\xa2\xe8\xc9\xe3\x81\x58\x1c\xed\x49\xe2\x66\x71\xef\xf6\xb0\x1b\x03\x01\x53\x97\x6f\xcb\xca\x8e\x35\xe1\xc8\x41\xcd\x53\x72\x83\xac\xc9\xf3\x23\x35\xfa\x3e\xdd\x1e\xd0\x49\x4e\x0d\x3d\xaa\x4a\xc5\x2e\x6b\xb7\xbd\x71\x1f\x7b\x02\x86\x67\xcd\x76\x44\xeb\xbc\xda\xb7\xfe\xbf\x8c\xab\xf0\xde\x6f\x8c\x8f\xb8\x6f\xc1\x89\xca\x79\xc0\x27\x20\xbe\x0b\x4e\x5f\x78\x44\xf9\x57\x95\xc1\x1a\xf7\x66\x66\xb3\x0e\x34\xb0\x92\xc6\x4a\x20\xc8\x43\x82\xc6\x68\xa9\xc9\x7e\x01\xb4\x0a\xc0\x37\x27\xe9\xd4\xd9\x5c\xd6\xa1\xb9\xdd\xb1\x88\x09\xd6\xda\x9c\x6b\xb1\x7a\x6a\x59\x9f\x9f\xfd\x32\xeb\x86\x25\x19\x6a\xf5\x69\x0a\x95\x5c\x48\x48\xc3\x73\xb9\x20\xa3\xa6\x63\xd9\x29\xa6\x40\x89\xd2\x81\x34\x28\x46\x65\x3c\x12\xa5\xc8\xbb\x71\x2a\x20\x28\x52\x01\x31\x67\x91\xa0\x30\x68\xa3\xa3\x99\x72\xc8\x8a\x43\x82\xed\x62\x4b\x36\xb3\x29\x77\xc5\xad\xad\x8d\x41\xa9\x90\x82\x6f\xf9\xf0\xf1\xd7\x34\xe3\x49\x96\xae\x49\xc9\x0c\x9b\x56\x86\x5e\x79\x20\xc3\x39\x37\xe8\x89\x29\x37\x44\xfc\x7f\xd4\xd8\xb7\x2a\xab\xbe\x2b\x49\x7f\xb9\x16\x7c\xa6\x36\x37\xea\x96\x45\x94\xda\xde\x05\xbb\xd9\x78\xf3\xb4\xec\xa9\x21\xe1\x40\xb4\xd6\xd9\xfa\x66\x86\xb3\xdc\x96\xad\xad\xeb\xa9\x14\xd7\x8c\xc0\x0a\xef\x17\xc3\x5f\x00\xeb\xae\x35\x09\x4e\xeb\x46\x22\xa7\xd7\x47\x4b\xf4\xee\x57\xeb\xfa\x29\xa9\xb7\xe4\x59\xaf\x87\x16\x9f\x74\x93\x77\xd0\xe9\x11\x46\x03\x17\x34\x49\x6f\x11\x3d\x06\x47\xfc\xfd\x91\x7d\xec\x1a\x97\xad\xf9\xff\x30\x1e\x7c\x63\x7c\x6e\xc1\x61\x75\x95\x38\x03\xc3\x9f\x1b\xa9\x55\x0c\x07\x75\x40\x25\x38\x68\xdc\x90\x25\x5b\x30\x8e\x0b\x38\x1c\x4c\x31\xee\x2d\x4e\x2d\x7d\xae\x20\xf6\xb1\x14\x7a\x60\x34\x06\x45\xd0\xe0\x46\xba\x44\x4a\xbc\x62\x09\x82\x1f\xa0\xe5\xa6\xf1\x24\x50\x51\xf0\xc0\xba\x1b\xf0\x49\x1d\x2a\x21\x4f\x35\x18\xfb\x54\x9d\x07\x0b\x20\x23\x59\xfd\x9b\x94\x07\x95\x7a\x24\x46\x2f\x9d\x75\x5c\x59\xf8\x6a\x44\x8d\x05\xca\x7d\xd5\xc6\xe5\x7b\x78\x4d\xbd\x49\x8f\xa3\xa0\x18\x50\x44\xe8\xae\xbe\x5c\xb7\xc4\x7b\xb9\x9f\xa7\x28\x19\xc2\x3a\xe5\x6c\x11\xa3\x50\x08\x68\x68\xee\x57\x06\x95\x11\x0e\x3e\x38\x7f\x77\xc8\x19\x8a\xad\x24\x2f\x07\x10\x78\x1f\xfb\x76\x0a\xb8\x9c\xcf\xca\x45\x49\xca\x33\x4a\xdb\xf2\x5f\xbb\x2f\xb8\x7f\xdf\x66\x77\x9d\xa8\xd3\xb0\x04\x3f\x58\xb8\x26\x34\x3c\x58\x24\xc2\x84\x6c\xc5\x23\x78\xaa\xda\xb5\xc4\x24\xa2\xb8\xc8\xc5\x5a\x98\x47\xd0\x8c\x8a\x40\x22\x0b\x1b\x6c\xb0\xe9\x34\x2b\x1b\xd6\x56\xeb\xe5\x71\x37\xcc\x07\xc0\xe0\x41\xa3\x90\x4d\x17\xb6\x50\xaf\xb9\x33\x02\x55\x2e\x95\x61\x29\xc5\xf4\x25\x51\x1e\x2c\xf8\x9d\x4a\xbc\xb7\xd8\x47\x2f\xcf\x7a\x21\x08\x51\x4b\x8b\x77\xf1\x93\xf3\x4b\x10\xc2\x90\x93\xcd\x28\x2e\x0b\xbe\x90\x45\x26\x52\xaf\xd7\xcf\x7b\x19\x66\x50\xf6\x84\xc8\x4d\x80\x1e\x76\xd0\x32\x44\x5b\x99\x6b\x38\x57\x6b\x22\x15\x90\x02\x61\x59\xd6\xd2\x48\xff\x5a\x02\x30\x03\x13\x01\xe9\x38\x00\x81\x0b\xf6\x72\xe5\x93\x53\xf6\x27\x5c\x83\xa4\xca\x9c\x5a\x59\x5a\xc4\x58\xa2\x25\x80\xd9\x0b\xb8\x90\x27\x1e\x31\x6f\x18\x50\xd9\x11\xdd\x42\x24\xeb\x24\x80\xc1\x19\x37\xb3\x26\x52\x8d\x9b\x2b\x1b\xe9\x77\x29\x78\xda\x1a\x97\x1a\x46\x64\x7d\xd4\xf6\xbc\x9c\xb2\x39\xfd\x66\x83\x93\x8c\xa1\x08\xdb\x02\x75\xf6\x7e\x97\xce\x6b\x15\xfc\xe3\x82\x96\xbc\x62\x9c\x7d\xa7\x92\x04\x6c\x21\x46\xc9\x4c\x85\xff\x8d\xb1\xe0\x8b\x63\x5b\x3e\xa2\x23\x5e\xe2\x36\x37\x17\xb7\x91\x3a\x88\xbc\x6c\x27\x2c\x6c\x2c\x57\xed\x72\x90\x42\xcb\xbc\x2f\x02\x0c\x72\x0c\x07\x16\x7f\x0c\x20\xc5\x32\xa8\x9e\x9f\xae\x5f\xca\x40\xc6\x09\x64\x5b\xba\xa7\x4d\xbe\xf5\xe8\x40\x9d\xb6\x5c\xb2\x3b\xe8\xb8\x63\x96\x6b\x25\x22\xb4\xdc\x59\x4a\x72\xb4\x8c\x06\xa6\xc0\x0a\xb8\x51\x1f\x76\x7b\xe2\xe9\xdb\xd4\x68\x66\x71\xe3\x58\xbe\x44\x8b\x16\x2e\x7a\xec\x5b\x2b\x8e\x10\x2a\x65\x72\xbf\xc7\x8e\xef\x00\x8c\x6b\xc4\xab\xc1\xed\x23\x5b\x74\x4b\x76\x3b\x66\x20\xf2\x01\x54\x1c\x24\xec\xbf\x1f\x60\xcc\xb0\x7c\xff\xab\x07\x82\xb7\x1d\xa0\xe3\x7d\x28\x70\xde\x3e\x5e\x50\x6a\x9b\x5b\x58\x3f\x56\x97\xff\x1e\x9f\xda\xc6\xe4\x75\x89\x27\xbb\xbb\x54\x43\xb6\x32\x97\xf8\xb5\x85\x5f\x91\xa8\x1b\xe9\xa8\xf2\x93\x46\x2b\x68\x5b\xc8\xc8\xc6\xd6\x66\xe5\x05\xc9\x2d\x86\x67\x74\x6c\x57\xbb\x54\xc5\x7b\xb0\x07\x75\x5b\x61\x54\x1f\x24\xdc\xea\xb8\x1c\x52\x33\x2e\xd1\xd2\x56\x99\x1d\x1d\x20\x0a\x93\x41\x95\xbc\x4f\xc8\x6f\xd0\x17\xe1\x5c\x89\x22\x8a\x74\x00\x73\xb6\x3a\x7d\xe5\xbb\xf2\x74\xd2\x92\x07\xda\x4a\x6d\x2c\x48\x68\xc4\x92\xcf\xad\x33\xcd\x92\x57\xda\xf6\xc6\x18\x69\xfa\x92\xb4\x42\x8e\x3e\xb9\xf6\x81\x3b\x8e\x6c\x74\xfc\x42\xa1\xcc\x3d\x3b\xb4\x28\xd5\x4d\x69\x2a\x8c\x7c\x91\x7c\x4c\x99\xc8\x02\xcd\x5f\x2e\x45\x44\xd9\xd2\x38\xc4\xd8\xf2\xe5\xda\x2e\xd4\x56\xda\xc2\x80\xa1\x77\xdb\x8e\xac\x18\x55\x51\x0d\xbc\x38\x96\x77\xec\xe1\xb2\x69\xec\xda\xce\xf0\xff\xd4\xd8\x95\x4a\x91\x9f\x5b\x28\xfc\xaf\xd6\x82\x8f\xd5\xac\x0b\x5b\xd8\xd5\x25\x29\xe3\x59\x2f\xd5\x9c\xa2\xb2\xed\x14\x88\x63\x81\xb5\x10\x7a\x26\xce\xa2\xaa\x23\x3b\x36\x22\x12\x26\xd0\x61\x8f\x83\x37\xc2\x03\x3e\x89\xb1\x77\x98\x6c\xd2\x93\xa2\x8a\xaa\x70\x0b\x06\x3a\xdc\x17\xa1\xf9\x5c\x98\xe7\xf1\x3a\xe2\xcf\xab\x92\x1b\x1a\xc7\x79\x6e\xa1\xc9\xf9\x0c\xe4\x0e\x67\xa9\xca\xdd\x03\x73\x98\xb2\x16\xb8\xf6\x01\x92\x98\xa8\x8f\xbd\x30\xd7\x49\xbe\x96\x84\x43\x50\x6a\x5b\xb8\xa3\x3e\x58\x63\x57\x09\x8b\x74\xfd\x07\x6a\xc1\x9b\x6b\xf6\x15\x15\x08\xa8\xfb\xa1\x1d\xce\xd8\x05\x93\xd8\xd1\x15\x92\x1d\xc4\x45\x57\x87\xb5\x94\xfd\x1c\xc1\x69\x53\x1e\x26\x71\x38\xc2\x28\x81\x07\x46\x08\xe2\xea\xec\xfc\xcc\x99\x53\x24\xb4\x4e\x35\xf9\x7c\x66\xec\xcb\xc6\x90\xba\x9e\x25\xeb\x60\x45\x31\x90\xe9\x3a\xc3\x82\x2f\xde\x3e\xdb\x38\x7c\xf8\xc8\x51\x80\x1f\x86\xa4\x8d\x49\x65\x5e\x2b\xb3\x2c\x29\x9a\xb1\x28\xdb\xcd\x2c\x5f\x9b\xee\x94\xdd\x64\x3a\x6f\xb7\xe4\xd3\x53\x94\x4c\x4d\x7e\x83\x15\x49\x98\x2b\xe4\x33\x08\xec\x7d\xed\xaa\xc1\x6f\xd4\x15\x1b\x5e\x35\x16\xbc\x0d\x50\xe7\x12\xa7\x6a\x83\x5e\x21\x95\x0a\xa3\x94\x5b\x4d\x6d\x8f\x91\x19\xf0\x10\x6b\xb2\xfa\x0e\x24\x0c\x68\x40\x72\xd4\x87\xbc\x23\xec\x3b\x86\x77\x70\x37\xec\x35\xce\x8b\x41\xe1\x7f\x8b\xef\x37\x60\xd0\xac\x01\x48\xeb\x59\x2b\x4b\xd8\x36\xc9\x87\xdd\xb0\xb7\x33\x2c\x0a\x68\xf7\x12\xb0\x28\x5e\x75\x80\xf2\x26\x5e\x7c\x20\xf8\xfb\xfd\xc0\x9c\xb5\xd5\x8c\xea\x4e\x5a\xf1\x9a\xb0\xc3\x60\x79\xdc\xe0\x0f\x7d\xae\x34\xe9\xd0\xb2\x31\x4b\x5d\x27\xc3\x0e\x9d\x1a\x81\x7e\x2e\xd0\x32\x30\x94\xf4\x25\x8f\xac\xb6\x0f\x19\xd6\x06\xfb\xc5\xda\xf7\x94\x65\x6d\x19\x89\xdc\xd8\x06\x3d\x4e\xcd\xaa\x75\xf1\xa9\x2c\x47\x91\x38\x2c\x47\xb8\x2a\x56\x07\x24\xd5\x90\xe7\xbd\xdf\xb2\xe2\xe4\x2d\x35\x08\x03\xc0\x87\xb4\x21\x55\x7e\x58\x4a\x4d\xc6\xcc\x2f\x95\x08\x72\x6c\x39\xae\x27\x05\x15\x68\x5c\xea\x76\xa4\x38\xb9\x99\x74\x12\x65\x68\xa5\x46\x9b\x67\xf2\x90\x02\x0a\x25\x67\xb1\xda\x6e\xca\x4f\xe2\x12\x04\x7c\xb5\x1f\x27\x18\x80\xa8\x67\x5e\x85\x68\xe8\xc9\x07\xbb\xaa\x64\xb8\xc0\xc1\xa8\x0c\x12\xb8\x11\xc9\xea\x96\x19\x47\x86\xd5\xc5\x8a\x4b\x03\x8c\x75\x66\xad\xed\x4f\x6b\x73\x38\x98\x4d\x28\x4a\xdb\x8e\x0b\x73\x15\xa7\x49\x79\x38\xeb\x98\x41\x5d\xfb\x11\x53\x31\x20\x38\x6e\xea\x32\x3b\xe8\x30\x32\x64\xc7\xca\x49\x6a\x9b\x5b\x9c\xd0\x41\xe1\x78\xbc\x96\x04\xb8\xc6\xed\xea\x94\x05\x8f\x32\x14\x07\x95\x58\xe5\x78\x4d\x8d\x60\xf5\x70\x72\x3a\x22\x8e\x38\x5d\x6b\xe8\xe7\x14\xb7\x03\xa1\xd0\xc9\x63\x3c\xc0\x26\xf4\x34\xf8\xbf\x73\x20\xf8\xd8\x01\x87\x44\x29\xa6\xb5\x52\xef\x42\xcd\x08\xe9\x28\x5b\x78\xe5\xf7\x9c\xf2\xbb\x73\xca\xaf\x26\x61\x7a\xfe\x5f\x87\x53\x7e\xcf\x27\xff\x58\xfb\xe4\x1f\xa3\x58\xcd\x37\x3f\x81\x35\xb6\xc8\x7c\x6c\xea\x94\xe1\x67\xf6\xc3\xb4\x8c\xcb\x81\xff\x0d\x3f\xf8\x92\xaf\x7e\xa1\x62\x03\xc9\x28\x0d\x5c\xe1\x11\xf9\x6a\x84\x03\x04\x06\x39\xf2\x65\x14\x98\xab\x96\x42\x04\x54\x37\xcc\x8b\x4e\x98\xc8\x21\xf4\x53\xf3\x43\x32\x91\xa7\x2f\x9d\x9d\x87\x05\x7d\xf6\xcc\x99\xd3\xa0\x57\x86\x91\x4a\xbe\xcd\xf8\x12\x8c\x61\x12\x85\xe0\x99\x62\x2e\x2d\x8f\x1f\x93\xbf\x20\xba\x33\xcb\x0b\x50\x66\x4d\xce\x3d\xf6\x08\x71\x92\x78\x5c\x9c\x60\xec\xe6\xfb\x68\x1c\xb7\x72\xfa\xef\xc4\x89\x5b\xf8\xcd\xc8\x29\xe7\xa1\xd7\xb7\xde\x5c\xf4\xdb\xed\xf8\xc2\xad\x8c\xf3\xc9\xf9\x4c\x01\xcb\xa8\xab\xca\xc2\x48\x91\x80\x3a\x42\x22\x08\x70\x63\xc7\x29\xbf\x99\x20\x97\x96\xe6\x6e\x6d\x4e\xb1\x9b\xa3\x78\x2d\x2e\xf5\xf7\xe8\x93\x87\xf8\x0b\xf8\x61\xfe\x02\xde\x6c\x36\xf9\x0b\xf8\x8d\x1c\x9f\x2a\x6e\x75\x9f\x52\xef\xbe\x40\xfd\xa5\x1f\xbb\x19\xa7\x78\xe4\xf3\x85\x79\xa1\xb8\xb5\x39\xea\x9a\xfc\xb0\x69\x4a\x8e\xde\xee\x1f\x34\x15\x3c\x25\xe0\x2f\xe0\x41\x23\xa8\xcc\x8e\xfe\x94\xea\xc0\x0b\xa8\x01\x7d\x41\xcf\x94\xdb\xb5\xd5\x38\x0d\xf3\xc1\xd2\x1c\x76\x04\x67\xe8\xd4\x05\x84\x54\xb1\xaf\xc9\x27\xac\x87\xad\x26\x9e\x11\xf3\x17\xf0\x33\xf2\x9f\x3b\xe4\x3f\xcb\xf2\x9f\x05\xf9\xcf\xa9\x58\xae\x15\x39\x51\x29\xdf\x6a\x09\x8f\xac\xac\xcd\xfb\x69\x5c\x16\x37\xf1\x25\x21\x70\xa7\x9d\x98\x9e\xee\x75\x06\x45\xdc\x2a\x9a\x69\x5c\x94\xcd\xb5\x6c\x7d\xba\xd5\xef\x4f\x9f\x93\xcf\x4d\xe3\x97\x9b\x52\xe7\x92\x6b\x67\xfa\x64\xfa\xd1\x95\x13\x23\x67\xe7\xbc\xec\x8f\xec\x8e\xec\x8d\xec\x8c\xec\x8b\x4b\x36\x87\x0f\x1d\x39\xc6\x6f\xe1\x87\x9f\x11\x83\x55\xea\xf0\xa1\x43\x87\xe4\xcf\xf3\x37\xf1\x39\x1e\xc5\x51\x7a\xb0\xe4\xad\x4e\x96\x51\xed\xf5\x56\xd8\x8b\x4b\x4d\xb9\x4d\xd3\x01\x33\x51\xb0\x36\x62\x68\x55\x5e\xc0\x83\x53\xd5\x8b\x8c\xcd\x03\xce\x0d\x98\x15\x80\x59\xd3\x29\x5b\x02\x80\x97\xa0\x36\x61\x83\x14\x26\x7f\x2b\xcd\xb8\xda\x25\x94\x23\xaa\xab\xdc\x29\x5c\xb4\x35\x90\x0d\x49\xa6\x3d\xf2\xdc\xe3\x47\x1b\x87\x25\xe1\x77\xc3\xb5\x34\x2e\xfb\x11\xd4\x4a\xc9\x31\xd1\xb2\xc4\xc0\x1e\x80\x0a\x83\xc7\x8f\x6a\x44\xb2\x5e\x82\xe5\x64\xe7\x09\x35\x2c\x09\xf3\x35\xb0\x20\xa9\x62\x05\xa2\x25\x65\x04\x6d\x2d\x0f\xc1\x45\x9c\xe5\x52\x9c\x04\x14\xbb\x7e\xaf\xc9\x27\x4f\x35\xd7\x9a\x27\xf8\xa1\xe6\xe1\x2e\x69\xf2\xfa\xa6\xe4\x18\x87\xbb\xcd\x29\xe4\xd8\x6a\xdf\x5e\x28\x11\x02\x4f\xa1\x4f\x60\x34\x6c\xdc\xe6\x1b\x42\x9d\x3f\x56\x4f\x8a\x6e\x08\x88\x7b\x34\x23\xb1\x90\x3c\x86\x40\xf6\x6c\x9e\xd8\x0b\xf3\x42\x9d\xfb\x2a\x5d\xd5\x48\x43\xb9\x20\xe0\xa6\xd2\x2a\x10\x84\xdb\x04\x67\x28\xaa\x1b\xc7\x80\x2a\xc4\x8f\x11\xe8\xf2\xe1\x10\x2a\x38\xc0\xf1\x82\xe9\x6d\x06\x54\xa4\xc9\xd8\x6d\x08\xfc\xa5\xae\xc1\x87\x75\xd7\x74\x81\x9a\x3e\xc8\x68\x41\x2b\x4c\xb3\x14\x0a\x26\xca\x55\x57\xc1\xd3\x58\x5b\x16\x08\x56\x51\xda\x34\x75\x4f\x4b\x73\xd1\xf3\xfa\x60\x3a\xee\xf7\xe4\xbc\x44\xd9\x46\xca\x27\x29\x43\xce\x98\xf5\x90\x8b\x03\x60\x1c\x04\x71\x44\x82\xfe\x8e\x53\x7e\x46\x76\xa9\x28\xc2\x29\xac\xa2\x23\xbf\x76\x82\x71\x1e\x92\xf5\x44\x2e\x36\xa5\xe3\x25\x59\x51\x32\xce\x57\xe1\x4e\x3b\x0f\x5b\xb4\xa7\x91\x63\xe9\x2e\x89\x6e\x5c\x96\x22\x62\x9c\xb7\x14\x1c\x3b\x51\xf4\xa4\x5c\x39\xe8\xff\x14\xa6\xba\xe0\x8a\xca\x3f\x7a\x19\xd6\xa1\x6c\xe2\x49\x11\xaf\x99\x22\x3e\x19\xb6\x67\xcb\x90\x44\xef\x50\x57\x7e\x0d\xca\x8a\x37\x19\x3b\x45\xe0\xe5\xb2\xf7\x87\x9b\xd7\x5b\x4e\x79\x0d\xf5\x02\x60\x72\xd7\x1f\x3a\xd4\x0d\xf0\x99\x3b\xe2\xcd\x9f\x3a\x7a\xfc\x4c\x1c\xc8\xbd\xaa\x78\x86\xfc\xf0\x7d\xce\x02\xce\x9f\xba\xeb\xd4\x22\xda\x94\x50\x84\x48\x06\x55\x40\xbd\x90\xb7\x93\x0c\x25\x0f\x3c\x97\xd5\x19\xbc\x4c\x6a\xb4\x6c\x75\xa3\x93\x25\x82\x5b\xb5\x05\xc0\xa2\x20\x72\xb9\xcf\x9a\xb2\x0b\x69\xc3\x10\x88\x8d\xb5\x5e\x94\xf2\x5f\x20\x72\x98\xcd\x4c\x0a\x38\xd0\x26\x02\xe9\x6d\x08\x2c\x8d\x06\x00\xa8\x92\xd1\x99\xc8\xf3\x06\x2d\x13\x6d\xb8\x38\xe7\x2e\x0d\x36\xf9\xe4\x52\xa6\x2a\x7f\xa0\x8b\xd9\xbe\x5d\x47\x6a\x93\x8c\x32\x8a\xdb\xed\xe6\x94\xb2\x57\xab\x53\x1d\xe6\x04\x76\x34\x24\xdc\x9c\x07\xa8\x4a\xf9\x68\xdc\xea\x27\xba\xf6\x56\x09\xa6\x52\x85\x4f\x28\xe9\x36\x93\xbd\xcc\x63\x2c\x4c\x98\x41\x59\x3a\xb4\x4b\xaa\x24\x84\x4e\x98\x46\x09\x96\xf4\x88\xb4\x77\xa4\x93\xf5\x4c\x7d\x2b\x55\x78\x0d\xe3\xb7\x75\xc2\x4a\x96\x23\x18\x88\xd4\x38\x30\xb0\x1b\x93\x77\x71\xde\x2b\x89\xab\xb6\x6c\xf6\xa5\x71\xa7\x64\x70\xd8\x2f\xb3\xa2\x05\xa2\x51\x73\xfd\xc8\xaa\x28\xc3\x23\x06\x8f\x22\x8f\x5b\x54\x8e\xf3\x3f\x8e\x07\xaf\xf0\x86\xaf\x5b\x41\x03\x54\xdd\x5f\xb6\x25\x30\xeb\xba\x0b\x0f\x2a\xd5\x02\xc5\x55\x23\x7d\x2a\xe3\xc9\x64\xdb\x06\x59\xec\xc4\x65\xd1\xe8\x89\xbc\x41\x61\xea\x19\x02\xfb\x63\x79\x62\x7a\x65\xaa\x79\xd1\x7b\x9c\x52\x58\x22\xec\xd4\x45\xef\x0a\xc4\xd5\xbb\xe8\x5d\x81\xdf\x75\x72\xbd\xff\xac\xc6\xee\x61\xd5\x77\xfc\xa7\xb3\x3b\x37\x35\xfa\x8d\x9a\x97\xd9\x3c\x2b\x0a\xc2\x59\xa8\x94\xfe\x64\x2f\xf1\x18\x7d\xd8\x1f\x6c\x0e\x02\x32\xb2\x59\x9c\xd0\x39\x9d\xd8\x1d\xdc\x40\x33\xa7\x73\xbd\x49\xd7\x44\xe0\x40\xba\x49\x95\xbf\x31\xa9\x92\x8c\x5a\xec\x85\x8c\xa6\xc1\x2f\xd8\x8d\x97\xd1\x89\x65\x78\x39\x38\x4e\x9f\x72\x23\x16\xe9\x22\x86\xb2\xa8\xa8\x09\x0c\xb8\xc3\x3e\xb1\xf7\x8c\xb1\xc9\x11\x86\xd3\x99\xe7\xf7\x73\x71\x7b\x9c\x08\xa7\xc2\xeb\x8b\xc6\x82\x67\xe9\x3b\x4e\x5d\xd7\x94\xc3\x75\x0e\x37\x94\x82\x83\x55\xee\xac\x6a\x7a\x30\xf2\xd5\x38\x8d\x4c\x01\xbc\x12\xab\x6c\x34\x2f\x7a\x0c\x8b\xad\x4a\x2d\xe8\xa2\x37\x51\x74\xc2\x1c\x0a\x4f\x3a\x44\x71\x7f\xed\x31\x2c\xd5\xf8\x5c\x66\x75\xd1\x5f\x08\x66\x6d\x48\x2b\xaa\x14\x8b\xe1\xcc\xca\x55\x8d\x73\xa2\x0a\x7b\xce\xb4\x5a\x30\xea\x79\x45\x03\xcf\x10\x03\x7b\x9b\x3f\x99\x99\x51\xfb\xdf\x16\xb0\x25\xf9\x83\xeb\x39\xa0\xa7\x5e\x72\x0d\xab\x8f\x58\xb0\x05\x5d\x57\x17\x07\x30\x9b\x84\x71\x17\xb0\x18\x3e\x7f\x75\xf0\x22\x6f\xd3\xdb\x15\x68\x06\xf2\xdd\x58\x08\x0d\x72\x6c\x34\x80\x48\xa0\xe3\x52\x19\x20\x37\xa4\xce\x47\x5c\x45\x12\x97\x4e\x79\xd5\xe5\x82\x4c\x3b\xce\x32\xfe\xfa\x55\xec\x53\x1e\xbb\x12\xf5\xb3\x33\x59\x24\x0a\xff\x57\xbc\xe0\xad\xde\x8c\xb9\xe0\xfa\xfb\x15\x1e\x0d\x61\x46\x76\xe1\x09\xf0\x13\x3a\xb5\x6f\xa5\x48\x79\xe9\x1a\x34\x8e\x6e\xda\x54\x26\x6e\x60\xab\xc5\x93\x28\xdd\x17\x3e\xd7\x38\xbc\x85\x0b\xea\x77\xc7\x19\x8b\xc2\x32\xa4\x7d\xf2\xb1\x71\x76\x62\x5b\xdf\xc4\xf2\xa0\x27\xa2\x91\x35\x89\x5f\x36\x5e\xc9\xef\xb7\x32\xdd\x28\xb1\x9c\xdc\xaa\x27\xf8\x75\x7c\x26\xe5\xe2\x42\x5c\x00\xfd\xd2\x6e\x4d\xc3\x5e\xd1\xc9\x4a\xcd\xaf\x0b\xba\xd0\x54\xb5\x4f\x09\x72\xc4\x7d\x7c\xaa\xd2\xd8\xc2\x5d\xb3\x7c\x72\x24\xe1\x54\x9f\xac\x02\x0c\xa2\x89\x5e\x1d\x68\x05\x87\xea\x7e\xbd\xac\xd7\xa7\xba\x5e\x93\x33\x49\xaf\x13\x4e\xf1\xb9\x94\x70\x69\xe9\x34\x1e\x6a\x67\xa0\x4f\x55\xdd\x5a\xb5\x31\x0c\x61\x98\x49\x07\xd8\xbf\x93\x7a\x15\xdc\xa0\x7c\x15\xd2\xaf\xca\x56\xaa\xc8\xfd\x9e\xae\x7b\x0c\x72\xbd\x6d\xd5\xb6\x80\xb5\x21\x42\xca\xca\x1e\x37\x76\x23\xe8\x8d\xc2\x8b\x53\x72\x3d\xda\xc8\xa5\x5e\x24\x36\x14\x89\x3a\xc9\x9a\x50\x73\x0f\xdc\x11\xed\xcd\xdb\x6b\xb2\x3f\xf2\xd8\x84\x0e\xd3\xf2\x3f\xbb\x93\x22\xd7\x0a\x50\x8f\xe2\x28\x61\xfe\x83\x9f\xf0\x16\x75\xb0\x57\x25\xa4\xb5\x1b\xa7\xe0\xce\xb7\x21\x23\x1f\xe9\x6d\xa5\xbf\x25\x8f\x60\x93\xf7\xbe\xc1\xbe\xef\x32\x90\xb8\x4e\x87\xab\x22\x51\xe5\x97\x82\xa3\x33\x94\x5b\x7b\x5f\x5f\xe4\x03\x48\x84\xa3\xc1\xc0\x09\xa1\x62\xf1\x80\x5d\xc9\x83\x48\x9e\xa7\xec\x67\x3c\x76\x2d\x75\x17\x70\x63\x80\x01\x43\xfd\x86\x79\xbb\xc8\xb0\xf5\x44\x25\xd8\x17\x20\x66\xe2\xee\xc3\x39\x47\x00\x2a\x22\x79\x8e\x61\x32\x6f\xd1\x05\x99\xa1\x3c\xf8\x6b\xbc\xe0\x7e\xcf\xfc\xd6\x31\x75\x1b\x20\x84\x92\x32\x49\x0b\x19\x6f\xda\xe3\xbb\x54\x94\xab\x55\xd8\x5b\x0a\xcf\x5d\x2c\xef\x06\xca\x25\x1a\xf2\xa9\x76\x53\x9c\xe2\xab\x40\xb3\x8e\x98\xfa\x3c\xa7\x5e\xf4\x73\x02\xaa\x02\x6f\x3b\xe0\x69\xca\x6d\xff\x3b\x8a\x00\x55\x36\x03\xc9\xc2\xda\x10\x8d\x7d\xb5\xbf\xf5\xf1\x09\xdb\x5c\x39\x12\x37\xfa\xf6\x24\xdb\x58\x02\xd4\xab\xd3\x71\x51\xfa\x6f\x98\x08\xa6\xdd\x4b\x6e\x30\x86\xb9\xa7\x7d\x81\x17\xbd\x7d\x71\x29\xba\xee\xd9\xf5\xbb\xfb\xe5\xb6\x34\x00\x72\x9f\xf3\xd8\x4d\x97\x43\xb6\x71\x81\xf0\x71\x3f\xe6\xad\xa8\xb6\x56\x34\x68\xa3\x02\x94\x83\xce\x3d\xfa\x60\x72\x7b\x78\x65\xbb\xc4\x2b\x2b\x19\x52\x8e\x7f\x3e\xf8\x3f\x56\xe0\xaf\x95\xcd\xa8\xad\x70\x42\x5b\x6e\x62\x37\x6e\x8e\x4f\xb9\x0d\x99\xef\xa1\xa4\xed\x06\x25\xad\xbf\x3d\x4a\xda\xa2\xbf\xa0\x51\xd2\xec\xa5\x30\x28\xd3\x95\xe2\x4c\x2e\xbf\x71\x71\xd4\x60\xf5\x18\xfb\x9d\xab\xd9\x93\x37\xaf\x76\x88\x4a\x34\x00\xde\x3f\x78\x75\xf0\xd7\x9e\x75\xa1\x7a\x90\xe7\xfd\x04\xd0\x5f\x7a\x3d\x1d\xcb\x08\xc5\xbe\x11\xb0\x37\xb4\x44\x0c\xd0\xc4\x68\x5f\xe5\x22\xc1\xd8\x55\xc4\x66\xb0\xbc\xdd\x73\x69\x2b\xeb\x22\xaf\x56\x28\xf9\xb9\x42\x99\x10\x92\x94\x74\x4c\x76\x88\x2d\x02\x26\x04\xa5\xa6\x98\x74\x23\xe0\xfa\xd4\xf8\x70\xf1\x7f\x61\xe0\x6a\xac\xa1\xc1\x99\xe4\x22\xbf\xbd\xfb\x4a\xf6\x55\xc6\xc6\xe5\x87\xfc\x2f\xb1\xe0\x53\xec\xce\xac\xd0\xe6\x2b\xa8\x25\xc0\xef\xeb\x87\x09\xc9\x50\x58\xfb\x5f\xa9\x66\x52\x0c\x83\x59\x85\x7e\x92\xef\xb4\xad\x22\x4c\x16\x6f\x9f\xe5\x47\x6f\xbc\xe1\x78\x93\x93\xa5\x4d\xea\x32\x52\xb9\x41\xf4\xd5\xf5\x38\xac\x54\x2e\x0d\x64\x2b\x81\x13\xae\x76\x6e\x71\xce\x6e\x15\xeb\x26\x40\xab\x27\xf8\xe1\xa6\x13\x89\x47\x05\x26\x9b\x9c\xb0\x29\x93\x81\x65\x2d\xd1\x83\x37\xa8\x5e\x2a\x28\x81\x71\xae\xfc\xfc\x64\x72\x02\xed\x8d\x3a\x40\xc5\x7a\xa9\x99\x26\x3b\x82\x86\xcf\x95\x13\x2b\x3c\x12\x98\xe9\x9a\x1b\x67\xaa\x24\x05\x58\x74\x81\x16\x2a\x0c\xf5\xaa\xf6\x90\x4d\x70\xab\x93\xa8\xa7\xe3\x90\x2d\xf3\x8e\x12\x15\x5a\xb1\x7c\xe8\xc4\x0d\x87\x80\x22\xe4\xbe\x95\xbc\x59\x36\x71\xe2\xd8\xb1\xa3\xfa\x62\xd1\x64\xb7\x51\x7d\xe4\x42\x20\xc6\x01\x78\xc6\x5d\xab\xfb\x66\xc4\xa7\x0a\x71\x82\xdd\xbb\x28\x8d\x59\x81\x6a\x5c\xc0\xfc\x54\xc9\x48\x09\xfa\x1d\x22\x98\xa1\xd2\xb4\x6a\x28\x14\x8c\x12\x26\x26\xbb\xcd\x91\xd9\xcd\x06\x1a\xfa\x06\x43\x72\x54\x09\x56\xe4\xa1\x08\x8c\x2b\x3c\x74\x68\x52\x99\x19\xc1\x42\x03\xc1\x4e\x84\xf5\x9b\x95\xc3\xf4\x4a\xe1\x85\x41\x3b\xcb\x9a\xab\x61\xde\x6c\x65\xdd\x00\x62\x0d\x82\x8d\x38\x89\x5a\x61\x1e\x05\xf5\xcd\x3e\xa4\xf1\x01\xc9\x20\x4f\xc9\x58\xea\x45\x12\x95\xe9\x03\xd7\x35\xe5\x27\xa0\x79\xa4\x1e\xfd\x58\xab\x13\xe6\x61\x4b\x92\xd0\xc1\xeb\x0e\xa2\x26\x15\xf6\x7a\x22\xcc\xe5\xfe\x89\xcb\x42\x24\x6d\x15\xad\x83\xfc\xe1\xe4\xfc\x12\xb5\x8d\x07\x34\x16\x09\x40\x7a\x56\x9d\x80\xfb\x4d\xfe\xec\xac\x2f\xe7\x4d\x12\x1e\xc2\x4d\x55\x7b\x67\x3e\x81\xfd\x84\x99\xbe\xe5\x16\x1e\x5c\x17\x4c\x61\x01\x01\xa0\x0f\x65\x58\x1e\x45\x23\xf0\x0a\xf9\xfc\xd3\xca\x0e\xdf\x08\x07\xb8\x47\xdb\x5c\xb1\x14\x5a\x3e\x27\x36\xde\xaa\xa3\x41\xa5\x59\x55\x76\x06\xd0\x3a\x2c\x54\x47\x84\x11\x6e\x33\x21\x79\x91\xe4\x7e\xb2\xc9\x26\x3f\xe2\x34\x6f\x46\xa8\xf3\xf8\x2e\xf3\x33\x65\x66\xbe\x04\x14\x8a\xae\x99\x49\x1d\x07\x6f\x56\x04\xe6\x72\x4a\xb1\x0b\x3d\xc5\x50\x63\xd6\x16\x5c\x4e\xb1\x71\xf9\x25\xff\x96\xcd\x85\xda\xca\x19\x75\xe7\xf2\xf2\x42\x75\x43\xb0\x5f\xbe\xda\x81\x04\x77\xde\x40\xb1\x85\x5e\xf1\x5f\x77\x75\x70\x7f\xcd\xe2\x26\x21\x6f\x49\x95\x5b\x07\xef\xe1\xb1\xa6\x52\xab\xb2\x0d\x1e\xa7\xab\x59\xbf\x02\x18\x54\x66\x58\xd6\xa9\x12\x85\x67\x71\xf9\x50\x1d\x42\x4d\x3e\x63\xb8\x17\x6d\x58\x2b\x85\xb0\xcc\xc0\x3c\x6a\xd2\x75\x94\x35\x20\x19\x34\xe0\x13\x90\x12\xd1\xcf\x93\xa2\xee\xc0\xf7\x29\x96\x51\xd7\x1b\x5a\xf0\xa5\xa5\xd3\x75\x9e\xb5\xa5\xac\x04\xbb\x11\xb9\x89\x8a\x95\x91\x6b\x29\xd7\x48\x94\x2d\xf7\xa8\xfb\x0f\x6c\x4f\xfe\xde\xc3\x0b\x7e\xec\x4a\xc4\xfe\xab\x84\x47\xff\x43\x05\x8f\xfe\xbb\xde\x16\xfa\xd5\xe6\x7c\x0a\xc0\xd2\xff\x03\x80\xa5\x2b\xa9\x53\xd9\xa4\x75\xbd\x02\x4b\x98\x78\xd4\x11\xc6\xff\xd4\xc0\xa4\x7f\xd1\xdb\xc2\x8f\xb4\xc5\x08\x11\x34\xfd\xa2\x67\x0a\xc1\x96\xa3\xaa\x7e\x3e\x86\xa3\x7c\xc8\x6b\x6d\xaf\xa4\x7d\x9f\x7f\xab\x56\xd2\xac\xd1\x56\x34\x33\x1a\xc1\x48\x95\xec\xcf\x0e\x54\xea\x7e\xa3\x65\x55\xc7\x90\x83\x39\xe9\xd7\x0f\x04\xdf\xe3\x5c\x71\xf5\x7b\x13\xde\x3e\xd2\x88\xf4\xb3\xfb\xd9\x6f\xdb\xdb\xec\x23\xbb\x34\x22\xbd\xd8\x6c\xb2\x47\xd7\x64\x64\xf1\x90\xbd\x53\x6b\xb7\xa7\xd6\xf7\x2b\xab\xd1\xd9\xc0\x3f\x3d\x44\x48\xb6\x99\xa8\xc9\xea\xec\xba\x6d\x7d\x01\x9a\x3e\xf7\xce\xc3\xdd\x58\x86\xce\x6d\xcf\x74\x8e\xf8\x87\x1a\x0e\x48\x3e\x57\x2c\x28\x08\x34\xcf\x71\xd8\x05\x63\x1f\xbd\x6a\x64\x91\xee\x8a\x33\xd0\x7f\xcb\x55\xc1\x3d\x95\x6b\xc6\x37\x2a\x52\x88\x72\xb7\x2b\x76\x97\x19\x4f\x44\xc9\x07\x59\x9f\xc7\xa0\xea\x96\x18\x39\x17\xc5\xed\x01\xa9\x1a\x14\x69\x4d\xdb\xca\x61\x4c\xef\xbd\x92\xbd\xd4\x63\xe3\x52\x5e\xf5\x5f\x10\x64\xf3\x4e\xd1\x20\x44\x53\xbd\x64\x2f\x47\xb6\x2e\x85\x69\xb1\x31\x4d\xbc\xb8\x21\xb5\xd1\x06\x19\xd9\xb1\x58\xf5\xf4\x93\xe0\x7f\xf6\x66\x78\x8d\xc7\x26\x74\x21\x6b\xff\x7e\x2f\x28\x74\x09\xef\x47\xa3\x47\xc3\xe5\xb3\xbf\xee\xb1\xc7\xa9\xcd\xa0\x78\xdc\xe7\xbd\xe0\xa3\xba\x82\x0a\xaf\xdc\x95\x4b\x81\x8a\x39\xb1\x36\xb5\x7c\x10\x75\x18\x21\x16\x69\x98\x0e\x1e\x71\xc2\x96\xe3\x86\x63\xbc\x35\x68\x90\xcd\x12\x4e\x55\xf0\x86\x15\xa5\xbc\x6e\x0f\xf4\x45\x1e\x1b\xeb\xc7\x91\xff\xfc\xa0\x7b\x6e\xee\xe4\xa3\xb3\xfc\xfd\xd8\x15\x42\x9f\xea\x1c\x25\x53\xc1\x13\x67\x16\xe6\xd4\x06\x1b\xea\x51\xc5\x13\x3f\x01\xaa\xfe\x42\x58\x76\xfc\x8f\x8f\x07\x1f\x1c\x9f\x6b\x13\xcd\x53\xea\x59\xc8\x7b\xb1\x40\x2a\xd2\x87\x0b\x54\x7f\x13\x61\x44\x17\xe5\xe4\xe5\x2a\x29\x8c\x50\xdc\x88\x57\x9a\xc3\x07\x10\x9c\x55\x12\xc5\xd3\x97\xce\xce\x4f\xdf\x91\x91\x99\x81\xe2\x14\x40\x68\xea\x02\x1e\x2e\xc4\x36\x62\xd6\x86\x94\x1a\x01\x0a\xa5\xd9\x0d\xd3\xb8\x2d\x8a\xb2\x49\xad\x89\xbc\xb8\xfb\xc8\x3d\xa3\x8b\xd8\x6a\xce\x6b\x51\x11\x0c\x46\xbf\x0b\x56\x1e\xe8\x52\x2f\x53\xd0\x73\x1b\xd0\xd9\x32\x3c\x4f\x01\x5e\xc8\xe9\x93\xf8\xbc\x38\xc1\x03\xaa\x29\xac\x3e\xfd\x03\x72\x2d\x5e\x18\xf0\xc9\x0d\x88\x95\x09\x52\xc8\xb2\x82\x0f\xea\x13\xd5\xae\x22\x66\x3e\x4c\x19\xc2\xf1\xda\x1a\xc0\x9c\x00\xd7\x97\x04\x38\x45\x29\x7b\x69\x66\x3d\x9c\x92\x3f\xd0\xd8\xd3\xaa\x1d\xb9\xfb\xc8\x3d\x01\x9f\x74\xc7\x85\xa5\x7b\xf9\x11\x8d\xd7\xdf\xcb\x22\x55\xb1\xb0\x18\xa4\x65\x78\x01\x21\x32\x00\x18\x19\x2c\x4d\x0a\xc0\x1c\x82\xf8\x36\x44\x92\x34\x94\x3d\x60\x23\x1c\x20\xa8\x0d\x4e\x25\x86\xb9\x29\x7b\xae\x91\x37\x6c\xb2\x7a\x93\x2a\x47\x08\x5e\xd7\x67\x38\x75\x07\xb7\xd8\x17\x8f\x82\xba\xf6\x0b\x13\xac\x39\x32\x0e\x40\x43\xd4\xcf\xea\x38\x06\x2a\xf3\xff\x2f\x07\x82\xbb\xb6\xb8\xbf\x55\xe1\x7f\x55\x45\x29\x37\xaf\x5b\x71\x12\xcd\x8b\xde\x01\xba\xe3\xca\xbb\xaf\x3a\xc0\x5e\xe7\xb1\xc7\x6b\x50\x09\xfa\x7a\xe1\xff\x80\xc2\xdf\x6b\x57\xca\x6b\x6b\xf8\x09\xd5\x1e\xc6\x75\x51\xc1\x0f\x55\xfb\xb6\x1b\xa7\x00\x89\xb4\x04\xa1\x87\xc5\x94\x5d\x3a\x71\x64\x07\x1d\xf4\xb5\xd7\xd4\x18\x33\x15\xf4\xfd\xff\xe5\x05\xcf\x5e\x74\x87\x4e\x02\xa4\xe9\x4d\xb6\x5a\x88\x7c\xdd\xc0\x8e\x6c\x36\x13\x07\x0b\x57\x73\x72\xa4\xb7\x59\x36\xc3\x9e\xb6\x83\x48\x8e\x11\x2b\x64\x15\xca\x7f\x04\x4a\xe0\xbf\xc9\x63\xdf\x02\xce\x14\x08\xaa\x10\x91\x5e\xa6\x1f\x52\xcb\xf4\xbc\x11\x75\xd5\x61\xf7\xc3\x56\x03\x2b\xa3\x53\x82\x40\x5f\x53\x8e\x8a\x2c\xe2\xa5\xe8\xf6\x12\x4b\x9b\xdc\xc9\x52\xbd\xca\x63\x3e\xce\xbd\x88\xee\x40\xcc\x23\x79\x30\xf4\xa1\x5f\xc7\x8f\x05\x2b\x67\x87\x6e\xca\x9d\x99\xc8\x33\x06\x83\x1e\xcd\x75\xfa\x2c\x20\xae\xe7\xa2\x85\xfe\x0d\xd5\xf8\x8e\x7a\xd3\x62\x57\x03\x31\xea\xf9\x59\x54\xf3\x73\x8b\x3b\x3f\x48\xb2\x9a\x84\x2f\x89\x3a\xbf\xe0\x31\xbd\x99\xfc\x4f\x7a\xea\x0b\xef\xf3\xd4\x57\x95\x8a\x5e\x1d\x08\x8e\xc3\xee\x04\x3e\x7f\xc9\x27\xb7\x3c\xb0\x93\x2c\x8c\x8a\x69\x0b\x3e\x6b\xda\xea\xbb\xb9\xfc\xa4\x8d\x4e\x58\x36\xe2\xa2\x11\x36\x46\xde\x77\x46\xf6\x07\x57\xb1\xeb\x76\x64\x93\xc0\xe2\x4e\xef\xbe\x2a\xf8\xbb\x9a\x7d\x65\x88\x41\xd9\xf5\x9d\xe8\xc1\xba\x39\x29\x75\xc8\x8b\x32\xfb\x4a\x81\x8d\x1c\x64\x31\x5e\xc2\x12\x3e\xee\x5c\xc4\x45\x83\xc0\x04\x1b\x70\x7b\x85\x83\x7e\x42\x8b\xe6\x46\xe5\xa9\x98\x6a\x85\xc3\xc6\x9d\xee\x1a\x18\x46\x0b\x0b\x8c\xda\x6e\x72\xca\x1a\x51\x40\x79\xee\x38\x49\xf7\xea\x84\xe4\x12\xb0\xba\x40\x58\x56\x25\x94\x60\x4c\xc5\x86\x71\x64\xe9\x50\x2e\xe5\x68\x0a\x69\x8a\xac\x74\x47\x95\xbe\xa1\xa1\x8d\x3a\x00\x13\x8f\xd8\x59\x38\x1d\x0e\x07\xff\xf0\x81\x3d\xfd\x7e\xcf\x2a\xbd\x67\x95\x7e\x58\xad\xd2\xdf\x50\x56\xe9\x3f\xf2\xd8\xcd\x97\x61\xb3\x05\x2e\x01\xa6\xe9\xb7\xec\xd8\x34\x3d\x8b\xd5\xca\x1e\x6d\xcb\x6d\x67\x7b\x23\xca\x29\x7f\xb6\x31\x6c\x8e\xe5\x3b\x36\xe6\xc2\xc8\x18\xfb\x7a\x8d\x1d\xb4\x66\xaf\x07\x00\x4f\x7a\xe6\xee\xcc\x8a\x72\x21\xcb\x4b\xa8\x78\xe5\xff\x72\x2d\x78\x9d\xe7\x5c\xd2\x6c\x2c\xe4\x88\x75\x90\xb5\xd1\xed\x6a\xe1\xe1\xe8\x44\x33\x8c\x25\x46\xff\x62\x8f\x80\xa4\xb2\x9c\xa4\x22\x08\x69\x6e\x72\x3e\x57\x1a\xe8\x80\x55\x0a\x7e\x90\x2b\x43\x78\x1a\x22\x55\x30\x02\xa4\x9e\x34\x2f\x7a\x63\xdd\x38\x95\xff\x86\x17\x1c\x1e\xfc\x6a\x8f\xcd\x32\x79\xd5\xbf\x59\x49\x03\x07\xbb\xa8\xf8\xd0\x16\xd7\x22\x15\xc2\x40\x43\xd0\x66\x11\xaf\x0b\x57\xb2\x38\xc5\xe4\x07\xfc\x5b\x55\x23\x53\xdd\x38\xb5\x42\x0f\x4d\x5c\xcb\xd6\xcd\xfc\xcd\x04\x3b\xb6\xa3\x7d\x37\xb3\x30\xa7\xe2\x8f\xc1\x76\xfe\xfe\x89\xe0\x3f\x79\x95\x8b\xae\xf9\xdc\xba\xa9\x4a\xf7\xa9\xa3\x16\x91\x6e\x86\x94\x51\x73\xe8\x39\xd0\x23\x3a\xee\xa9\x85\x64\x84\x95\xb2\x90\xc6\x08\xa8\xa2\x52\x0a\x3d\x2e\xb8\x36\x00\xc9\xb5\xb8\x0a\xde\xa3\x43\xee\xa2\x37\xe1\x72\x76\xb5\x34\x3f\xb2\x9f\x3d\xe0\x04\x6b\xbf\xd9\x0b\xee\xb4\x10\x36\xed\x64\x86\xd1\xdd\x36\x7d\xc1\xd4\x39\xab\x13\xb6\xee\x70\x1b\xfb\x3e\x76\xeb\x65\xf0\x3e\x6b\x46\xf7\x0e\xf2\xdd\x1e\xe4\xf7\x32\x87\x2a\xfc\xb3\xc1\x6d\xf6\x6f\xb5\x97\x86\x28\x0e\xa7\x6e\x04\xe5\xb7\x01\x65\x75\x4f\x52\x78\x58\xec\xf5\xcf\xda\xfe\xa8\x39\xe6\x1f\xd9\xde\x5e\x5f\x59\x27\xc6\x3e\x7d\x80\x3d\x71\x94\x9b\x45\x76\x0a\x18\xdb\xbb\x0f\x04\xdf\xa5\x7f\x55\x1c\x82\xeb\x62\x53\x6f\xe0\xdb\xf7\xef\x6d\xc9\xdd\x6e\xc9\x05\xe5\x3b\xbb\x23\xb8\xe6\xb4\x33\xe7\x36\xf7\xbc\x8e\x4d\xb2\xef\xdd\xde\x6f\x26\xdf\xdb\xdb\x83\xbb\x90\xd6\xff\xd5\x39\xb7\x1f\xf2\x9e\xb9\x3d\x57\x69\xfa\xf5\xc6\x28\xbf\x9f\xe2\x08\xd5\x42\xda\xff\xe0\xb1\x27\x8d\x4a\xe5\xcc\xa2\x45\xa8\xd8\x25\x8a\xe2\x8e\xb0\x14\xfe\xa7\xbd\xe0\x44\xf5\xa2\x2b\x52\x38\xf9\x34\x60\xff\x37\xd8\xb9\x17\xbd\xab\xf5\xdf\xcb\x83\x9e\x9b\x50\x5b\xb0\xfb\x98\x7b\xdb\x5f\x09\x96\x66\xed\x0b\x96\x07\x20\x34\xad\xaa\x48\xca\x5e\x16\x1d\xb4\x80\x7a\x71\x85\xc0\x60\x6f\xac\x80\xd5\x4a\xbf\x1f\xbb\x9a\x3d\xc7\x8c\x1b\x90\x37\xe4\xa4\x14\x0d\x13\x48\xaf\xa9\xc1\x79\x40\x4b\xf1\xb3\x90\x28\xa8\xb8\xf3\x52\x7f\x55\xed\xb8\xa5\x56\x98\x08\xff\xcf\xae\x0a\x9e\xbb\xf5\x23\x9a\xa3\xaa\x1c\x78\xf9\x59\x14\x80\xe1\x76\x61\x9e\x07\x91\xde\x6d\x4d\xf2\xf1\x6b\xa5\x60\xa9\x4c\x71\x0b\x61\xd9\xb9\xe8\xf9\xa8\xec\xd8\x17\x9d\xc9\xfe\xf4\x95\xec\xfe\x31\x36\xe2\x29\xff\x2f\x6a\xc1\x1f\xd4\x86\xaf\x3b\x7c\x1f\x20\x90\x7a\x21\xb8\x42\x8a\x38\xa2\xd0\xf6\x91\xa9\x97\x06\x78\x03\x11\x87\x61\x48\x2b\xd8\x7e\x53\x99\x03\x57\xa8\x1a\xab\x6e\xb7\x70\x02\x93\x81\x63\x72\x6d\x6d\x92\x22\xa9\x8e\x5d\x37\xb8\xa5\xf0\x32\x74\x15\xf3\x0c\x56\x9a\xf8\x95\x95\xe6\xe8\x12\x16\xf8\x94\xc9\x42\xa7\xf1\x90\x9f\xc1\x19\x0a\xc6\xdf\x0e\xf5\xda\x2d\xcd\xb8\x32\x0d\xeb\xb5\xe2\x2c\x18\xe8\x67\xca\x96\x55\x66\xfc\x90\x43\x7d\x5f\xd9\xc7\x1e\x9f\xd8\x49\x83\xb0\x02\x9f\xda\x17\xfc\xea\xbe\xa1\xcb\x8f\xc8\x02\xa8\x84\xc7\x47\x76\x01\x78\x06\x3f\x7a\xa2\xb5\x62\x9e\x27\x9b\x21\x04\x97\xc3\x26\xbd\x33\xcb\xe3\xe7\x4b\x4e\x92\x2c\x64\xd1\x0c\x81\x0c\x20\x3c\x88\x02\xb1\x83\x83\xc8\x42\x7e\x35\xd3\x60\xca\xdd\xd3\x99\x88\x2f\x4c\x42\x16\x01\x6f\x65\xdd\x5e\x22\x2e\x18\xf8\x4e\x04\xe5\x9c\x32\x15\x0d\x90\x7f\x85\x36\xf4\x09\xc6\x7c\xeb\x57\xe2\x54\x37\x0d\x90\x20\x97\x51\xab\xd9\x62\xd9\x61\x2f\x9e\xc6\xe5\x6a\x68\x19\xa2\x7a\xa1\x61\x9d\x53\x4f\x82\xc9\x68\xd8\xa4\xf5\xf0\x12\xb5\xa6\x84\xcb\x20\x6a\x10\x13\x2c\x5c\xbf\x6a\x2d\xf5\x21\xfe\xe4\x7f\xa6\x16\xfc\x46\xad\x7a\xf5\x61\xa6\xf0\x9e\x68\x3d\xe2\x0c\x06\x49\xfa\x61\x5a\x89\x4d\xa7\x5a\x21\x3f\xa7\x5c\xe4\x79\x96\xf3\x2c\xe5\x77\x9c\x5a\x76\x66\xf9\x65\xfb\xd9\xa1\x1d\x89\x32\xe8\x57\x9d\x0d\xfb\x85\xf0\x3f\x77\x45\x70\xc1\xfa\x6d\x80\xf0\xba\x8a\xb6\x55\x24\x4f\xb8\x0a\xb6\xfb\x94\x4b\xe1\x80\x5c\xb3\xed\x30\x4e\xfa\xb9\xb2\xc9\x40\x2e\x6d\x0b\x40\x50\x21\x51\xb7\xdb\x4f\xca\xb8\x97\x08\xec\x32\x26\xcd\x88\x14\x50\x27\x44\x0e\x86\x04\xeb\x34\xfa\xc4\x3e\xf6\x4b\x63\x6c\x1f\xec\x59\xff\xdd\x63\xc1\x5b\xc7\xcc\x9e\xaf\x58\x27\x94\x8b\xaf\x40\x48\x1b\xf2\x16\xc0\x47\x20\x9d\x2a\x0d\xbb\xc8\x20\xa4\x7c\x0a\x2b\xe6\x40\xed\x35\xf9\x19\x90\x73\x21\x83\x18\xb2\x5c\x00\xe4\x31\x2b\xca\x76\x7c\xc1\x50\x80\x3c\x67\x53\xac\x43\x60\x70\x23\x9a\x7c\x46\xd2\x09\x8e\xe5\xf9\x22\xcf\x1a\x10\x08\x00\x58\x90\xb7\x23\x7c\xab\x14\xa2\x29\x1f\xc5\xc0\x89\x65\x10\x22\x01\xeb\x87\x84\x96\xb5\xb1\xf3\x05\x8f\xfa\x20\x26\x11\xf8\x6b\x27\x84\x54\x89\xca\xd4\x35\xf9\x59\x82\xde\xac\x00\x3b\x51\x54\x44\x83\x72\x2b\xe4\x64\xd1\xa5\xcc\x05\xba\x55\x73\x27\xdf\x01\xcd\xe4\xee\x43\xf7\x34\xb7\x7b\x19\x93\x35\xb0\xc3\x22\x2d\xf3\x01\x80\x73\xc1\xeb\x81\x4d\x79\x3f\xc4\xf6\x77\x45\x51\x84\x6b\xc2\x2f\x83\xb5\x19\xde\xe9\x77\xc3\x14\x6a\xf3\x80\x97\x1a\x31\x3d\x7a\xb6\xb7\x13\x33\xbd\xe8\x07\x8c\xd1\xad\x14\x40\x30\x68\x06\x3b\x2a\x2c\x1a\x2a\xc2\x24\x87\x8c\x13\x87\xf4\x5f\xe5\xb1\x2b\x72\x11\x16\x59\x0a\xa1\x59\x33\x9c\xa8\xff\x92\xfb\xa0\x20\x39\x75\xbd\x2e\xe4\x69\xf6\xd6\x76\xf6\x84\xf2\xc4\x3b\xbd\x79\xf0\x5a\xf6\x6f\x47\xa2\x7f\xb7\x72\x51\xfa\xaf\xbe\x56\xaa\x10\x88\xcf\x82\x15\xe6\x08\xac\x05\xb0\x16\x90\xc5\x89\x1c\xa2\x79\x54\x35\x15\x49\x20\x65\x98\xf0\xd5\x41\x69\xaa\x10\x10\xf0\x15\xb1\x93\x93\xf2\x65\x9a\x3b\xe2\x56\x04\x0f\x16\xa6\xfc\x4c\x78\x01\x3f\xb8\x14\x3f\x5f\x60\x2b\xee\xe6\x7b\xe0\x9a\x3d\xfd\x72\xcf\x1b\xe4\x7a\x83\x3e\x59\x63\x0c\xc7\x27\x69\xcb\xff\x95\x5a\xf0\x96\x9a\xf9\xad\x10\x77\x08\x00\x46\xd2\x43\x9a\xa5\x0d\xc4\xa5\x74\x28\xba\x2a\x34\xcd\x51\x56\x1b\x16\x8f\x43\x34\x72\x80\x47\x6a\x40\x9c\x54\x9c\xf6\xfa\x2a\x3d\x4e\xb2\x60\x0d\xc8\xda\x12\x4d\x3e\x93\x58\x65\xea\x2d\x64\x61\x08\x18\x89\x78\x9c\x92\x24\x12\x99\xdd\x90\xa5\xd8\x7a\x1d\xd0\x37\x14\x94\x5a\x98\x0e\x0c\x5e\x8c\x32\x14\x01\xd4\x9e\x19\xa1\xa9\x42\x2b\xd6\x45\xce\xb3\x7e\x29\x7b\x06\x27\x1b\x95\xb0\x36\x14\x3c\xb3\x30\xd7\x7c\xb0\x02\xc3\x63\xed\x30\x76\x86\x00\xf4\x4f\x05\x37\x9c\x23\xcf\x41\x3b\x6c\xc5\x49\x0c\x2e\xb1\x5e\x9e\xad\xe5\x61\x17\x0a\xed\x18\x40\x37\x03\xe3\x04\x0b\x6f\x13\xdc\x9e\x7d\x6e\x97\xf6\xb9\xcf\xd4\xd8\x38\xee\x56\x39\x75\xb0\xdc\x8e\x05\xc3\x9e\x78\x7e\x2a\x6c\x75\x24\xd9\xa9\xea\x30\x10\xa6\x0a\x13\x96\xf4\x3a\x61\xda\xef\x8a\x3c\x6e\x99\xb4\xd4\xa2\xce\x0f\x36\x0e\xd6\xf9\xc1\x7b\x0f\x4a\xad\xe7\x60\xf3\x20\x91\x96\xd1\x2b\xe4\x4e\x30\x60\xe2\xd6\x5e\x29\x20\x35\xb0\x10\xc7\x8f\x81\xa4\x14\x81\xd7\x14\x51\x3a\x87\x78\x6f\x98\xaf\xc6\x65\x2e\xb7\xdb\x24\xc1\x45\x0e\x60\x0f\xe2\x0b\x53\xd8\x22\xf2\x6d\x79\x7c\x35\xf9\x49\x85\x5e\x27\xf7\xe4\x36\x55\x3c\x8e\x1d\x3f\x76\xc3\x93\x0a\xcc\x68\x6c\x1c\x7b\xd0\x7b\x02\x7b\xbc\x3f\x2e\x4f\x8e\x4d\x08\xfc\x6b\x1e\x9b\x88\xbb\x54\x13\xc9\xff\x82\x17\x7c\xc2\x9b\x53\x3f\xb1\x3e\x8e\x1d\x1f\x82\xd5\x96\xc9\x7f\x89\x18\x43\x25\xd4\x02\x53\xc9\xe4\x38\x27\xad\x2a\xbb\xe7\x93\xc0\x23\xe8\x88\x51\xac\x4a\x85\xbf\x40\x54\x79\x2c\xa2\xa9\xa6\x2e\x26\x6b\x7f\xd4\x48\x39\x95\xe7\x39\x15\x2b\x2c\xe3\xae\xd0\x25\x2b\x70\x93\xa6\x71\xe2\xa0\xae\x3d\xe4\xcd\x6f\x6f\x78\x7b\x8a\x3f\xb5\xbd\x39\x1f\x87\xc8\xd8\xd7\x26\xd8\x91\x51\xc2\x02\x62\xf1\x9c\x5d\xaa\x42\xd1\x10\xa6\xd7\x7b\x26\x82\x23\x56\x74\x60\xc8\xf5\x0b\xdc\xc0\xf7\x28\xbc\x1d\x8d\x96\xed\x1c\xfa\x7f\x75\x80\xfd\x86\xc7\xae\x68\x17\x60\x67\x7b\xbf\x17\x3c\xe0\x59\xa8\x3b\x00\xd9\x53\x66\x08\x8d\x67\xab\x40\xed\xca\x33\xc6\xc1\x49\x71\x4d\xe0\x9f\xce\x7a\x10\xdf\x96\xae\xa9\x8a\x39\xfc\xd4\x85\x26\x0f\xc4\x85\xf2\x58\x50\xe7\xc1\x85\x76\x21\xff\x97\x96\xed\x22\x68\xf2\x39\x93\xb3\x0f\xe2\x01\xa5\xbe\xae\x0a\x7a\x41\xd2\x8f\x95\x28\xef\xb0\xc2\xc7\x0e\x80\xef\x93\x1e\x9b\xc0\xcd\xbb\x28\xda\xfe\x87\x3d\x76\x68\x5b\x53\x7e\x15\x5a\xed\xe5\x24\x08\x2e\x8a\x76\x05\x2a\x51\x01\xf8\x21\x12\x99\x3c\x08\xb3\x55\xc9\x9e\xd4\xe6\x37\xcb\x3d\xb3\x30\xc7\x5b\xb9\x00\xa4\xc7\x30\x29\x46\x56\x52\x76\xca\xd0\x5a\xa5\x0d\xcb\x52\xca\xb7\x22\x6a\x4a\x09\xda\x86\x4b\x7a\x61\xd0\x1b\x86\x4b\xaa\x88\xf5\xe9\x30\x1a\xd5\xd9\x25\x22\xb9\x26\xa7\x89\x43\xc7\x31\x1c\xd2\xb0\x75\xfb\x69\x7c\x5f\x5f\x98\xd8\x70\xed\x57\x76\x16\xf5\xb3\x63\xec\x71\xa6\x37\x98\x73\xf1\xe1\xb1\xe0\x3d\x63\x77\xb9\x17\xab\x93\xd6\xca\x7a\xba\x4b\x44\xfb\xf4\x25\xdd\x41\x35\x3f\xe6\xcb\x6e\xf4\xb7\xce\x81\x5f\x00\x53\xb2\x79\xaa\x52\xae\x1a\x94\x15\x12\x82\x4a\xb7\x46\x14\x4c\x8c\xec\x0b\x45\xf8\x4b\x56\x13\x4b\xfd\x82\xa0\x0f\xec\xee\x60\x10\x66\xbc\xd6\x51\x15\x93\xd7\x72\x52\x52\x97\x44\xc9\xad\x35\xa0\x32\x8b\x29\xfd\x2d\x85\x99\x3c\x8e\x04\x05\xd8\xe0\xf2\x52\x89\xcc\x7e\x8e\x6f\x97\x19\x0f\xe8\x16\x6c\xa1\x41\xd6\xd7\xb0\x1a\xfd\x02\x44\x36\x9d\x5b\x32\x62\x9e\xe6\xcd\x4d\xe4\xd3\x58\x97\xa4\x97\x8b\x06\x88\x4e\xc3\x63\xd1\x18\xd8\x00\x38\xe7\xee\xd3\xff\xfe\x2d\xec\xbb\xed\x28\xa2\x2c\xc2\xb0\xe2\x7e\x2a\xd9\x2e\x86\x56\x7e\xfa\x5b\x82\x4f\x8d\xd9\x57\xac\xf0\x17\x1d\x55\x69\x02\xf1\x73\x7c\x72\x44\x75\x17\xac\xbf\x80\xc7\xae\xd3\x9e\x15\xb9\x61\xea\x7e\x3b\x16\x40\xab\x5d\xeb\xe1\xbc\x9f\x02\x14\x87\xc9\x0a\xe0\x2a\xb5\xa1\xe9\x7c\x41\x09\xa4\x54\xa8\xc4\x4d\xfa\x87\xda\x66\x52\xa6\xa5\x2a\x6a\x16\xda\x5f\x9d\x2a\x66\xe9\x20\xd1\x58\x53\xa1\x89\x0f\x95\x34\x96\x88\x72\x54\x79\x34\xc9\xe2\x13\x8d\xb2\x60\xf7\x08\xa8\xc7\x78\x64\x08\x9c\x24\xef\xa7\x9a\x97\xc0\x20\x20\xcb\x03\x0c\x16\x91\x28\xc3\x38\x29\xea\xbc\x10\x62\x47\x81\xb9\x66\x52\xa6\x69\xea\x30\x44\x75\xfa\xa2\xb7\x1f\xa4\x59\x91\x3b\x07\xcf\xcb\xae\xdd\x13\x60\x77\x2b\xc0\x7e\x76\x9c\xa9\xb9\xf5\x3f\x3a\x1e\xfc\xd2\xf8\x9d\xf8\xa3\xc2\x11\xc1\x02\x99\x80\x7a\xa6\xa8\x3a\x44\xb4\x0a\xab\x6e\xa7\x86\xf3\x9e\x5d\x9c\xab\x00\x3f\x5b\x58\xef\x19\x6a\x26\x02\xe3\xc9\xd4\x22\x60\x6c\x2e\x16\x60\x26\xcc\x72\x5b\x31\xd3\xe1\x4e\x2a\x61\x27\x8b\x04\xff\x5e\xf8\x90\xd3\x07\x0c\x4c\x03\x10\xf4\xa2\xdf\x05\x36\x4c\xd5\x8b\x69\x90\xd8\x9c\x95\xf9\x60\x17\x98\xc2\x65\xd2\x4f\x2a\xc1\x3a\xa4\xe3\x07\x0d\x8f\xf7\xf5\xe3\xf5\x30\x11\x69\xa5\x38\x55\x25\xbd\x29\x54\xcd\xf0\x56\x98\x24\x50\x24\xb9\x9f\xb6\x02\xde\x95\x2c\x5a\xc3\x9d\xea\x19\x93\x37\xf9\xd9\xd9\x39\x3d\xbb\x93\x8a\xb1\x96\xf1\xba\xe0\xa7\xe3\xb4\x7f\xc1\x62\x1a\x53\xce\x29\xa2\x18\x8b\x93\xbd\x64\x33\x16\x39\xab\x6a\x5d\xb5\x55\x47\x95\xe6\xab\xc3\x0c\x4a\x45\x82\xe6\xf6\xe4\xfc\x12\x3f\x8d\x10\x3a\x8b\xb7\xcf\x72\xac\xc3\x97\x5b\xc0\x9b\xba\x14\x92\x16\xd4\xf7\xa2\x7c\x1e\x26\x0b\xd0\xfb\x6d\x0b\xd0\xbb\x76\x6d\x01\x5a\x7b\xb4\x8c\x3c\x5f\xad\xb1\x03\x52\x94\xe8\x88\x30\xf2\x7f\xaf\xc6\xa6\x36\x0f\xfb\xa5\x03\xfb\x2c\x3d\x1d\x3c\x50\x53\x7f\x0e\x61\xbf\x29\x6a\x50\x2d\x0f\x41\xad\xa9\xd3\x07\x63\x03\x10\xb5\x0d\x5d\x24\xf6\xc9\xd5\x1c\x7d\x26\xb1\x9d\x81\x99\xb6\x3a\x22\xea\x27\x71\xba\xd6\x10\xeb\x31\xe8\xb1\xd3\xbd\x2c\x6a\xa8\x3e\x4d\x33\xb7\xb8\x6f\x2c\x55\x42\x50\x44\xc3\x1c\xad\x42\x87\x9b\x87\x6f\xb8\xd4\x82\xd5\x0b\x59\xa4\x67\x45\xd5\xa8\x66\x3f\x51\x63\xcc\x74\xc7\x7f\x79\x8d\x3d\x65\xdb\x69\x5e\xd2\xcf\x07\x5f\xf0\xcc\x0f\xb2\x18\xa3\xb0\xab\x2f\x62\x89\xc1\x10\xcb\xad\x67\xa4\x5d\x63\xdf\x80\x59\xab\xe9\x36\xb5\x51\x1d\xa1\x08\x18\x35\xb6\x46\x5a\x2f\x01\x5a\x87\xa5\x86\x19\x8e\x4b\x50\xaa\xad\x8f\xc6\x85\xd4\x8e\xeb\x23\xda\xb3\xd9\x38\x48\xbf\x8e\x8a\x28\x99\x3a\x7c\xa0\xf9\x90\x77\xcf\xf6\xca\xf4\x09\xff\x06\x03\xa0\x21\x27\xa7\x12\x6d\x6d\x7f\xb9\x1a\xd1\xf2\x4f\x1e\xfb\xae\x11\x5a\xd8\x7c\x16\x89\x19\x2c\x31\xe6\x7f\xd1\x0b\x6e\xb0\x7e\x1b\x2b\x90\x6d\xe6\x57\x50\xf5\xf2\xfb\x07\x0b\x5d\x9e\xec\xa2\x07\x46\xbd\x8b\xde\x7e\xba\xe2\x48\x39\x3f\xc4\xa6\x98\xba\xe1\x7f\x57\xf0\xf8\x65\x75\xfc\xa9\xd7\x6d\xfe\xb1\x48\xf6\xc1\xa7\x07\xb7\xcc\x5b\xcf\x80\x86\x5d\xe7\x59\x0a\x5a\xcd\x9d\x54\x82\xb5\xae\x6b\x74\xcd\x2d\x48\x71\x92\x4a\x0a\x25\x73\x0b\x4e\x9b\x3f\xc9\x76\x0e\xcd\x0e\xf1\x82\x7f\x39\x11\xcc\x6e\x7a\xd7\x8d\x1f\x1c\xf9\x18\x07\xcf\xd0\xe8\xa0\xc2\x07\xf7\x12\x76\x76\x2d\xf3\x7d\xd1\x53\x51\x85\x9f\xf1\x82\x97\x7a\x33\xa6\x38\xee\x90\xc5\x07\x20\x8a\x2f\xa3\x48\xe4\xe6\x08\xd0\xe6\x12\x5e\xc1\x2f\xd8\xd1\x8c\x27\xd8\x0d\x3b\xa8\xb2\x3f\x92\x72\xf6\x64\x8f\xbd\xe8\x46\x3b\xba\x31\xdc\xfe\x5c\xb8\xd5\xbf\xb9\x41\x47\xc0\xa6\x3c\xab\x72\x1e\xd8\x66\x58\xf6\xd6\x31\x27\xeb\x33\xec\xf5\x0a\x39\x11\x27\x43\xd1\xcd\xd2\x25\x51\x9e\x83\x25\x5e\x52\x59\xc9\x7f\x5b\x0b\xbe\x7f\x93\x7b\x9a\x52\xfb\x92\x59\x90\x5c\x4f\xb9\xa6\xa8\x84\xc1\xe3\x5c\x65\x38\x93\xbc\xa3\x5b\x73\xad\xb2\x2f\xab\xb1\x8c\x0e\x83\xb5\xe0\xdf\x2f\x13\x70\x7a\x04\x0f\x83\x3d\x1b\x5b\x03\x6a\x04\x0b\xe9\x62\x96\xc8\xf3\x18\xfb\x14\x00\x14\xe7\xd9\xf4\xa4\x48\x44\x29\x02\x6d\xcd\x96\x7d\x74\x1e\x74\x4e\x8a\x1f\xf7\xd8\xd5\xb9\x7d\xd7\xbf\x7f\x2b\x5c\x32\x35\x57\x4e\x83\x7a\x38\xc1\x29\xba\xae\xc6\x8d\x8a\x1e\xef\x85\x79\x28\x59\xd2\x02\x95\x69\x43\x6f\x1f\xd5\xb3\xbc\xa5\x3a\x8e\x26\xfb\xb3\x27\x8c\x3c\xbe\x66\x97\xe6\x36\x31\x89\xff\xe2\x13\x82\x45\xcb\x24\xae\xca\x84\xa8\x02\xcd\x56\xd1\x79\xbb\xac\xc2\xec\xd2\x9c\x62\x9a\x51\x1e\xaf\x8b\x9c\x4f\xde\x26\xe5\x40\x92\xde\xa6\x2e\x7a\x57\xe0\xf5\x8b\xde\x55\xf8\x1c\x6a\x64\xce\xa2\x7d\xd0\x67\x3f\x3f\xc6\xbe\xc3\x24\x18\x2f\x60\x41\x5d\x6d\xdd\xf5\x5f\x33\xb6\x03\xf3\xb0\x7e\x9c\xcc\xc3\x5f\xaa\xcd\x6e\xda\x22\x52\xdd\x10\x72\x3d\xd9\x8d\x89\x0d\x92\x34\x03\x66\x78\x91\x16\x31\x28\xa5\x15\x78\x9e\x9e\x14\xd9\xe8\x6d\x39\x19\x34\x0b\x40\xc3\x52\x27\x26\x14\x62\x79\x6b\xa8\x37\x64\xe3\x95\x07\xa6\xb9\x77\x2e\xed\x39\x77\xa5\x22\x5d\x38\x05\x49\x25\x9f\xa6\x78\x16\x73\xda\xaa\x6a\x95\x84\xd0\x41\x03\xb1\x4a\x05\x68\xec\xdc\x91\x63\x2c\x9c\x68\x1b\xf5\x50\x1d\xc4\x4d\xfc\x9b\x4a\xbb\x86\x45\x21\xa2\x26\xfb\x2f\x1e\x73\xd6\xd3\x7f\xbb\x17\xbc\xde\xbb\xcb\xba\xa2\xcc\xde\x64\xb2\x5e\x37\xf6\x6c\x8a\xc6\x32\x2e\x0f\x8b\x88\x7a\x49\x7f\x2d\x4e\xbf\x7a\xff\x9b\x0b\x3e\x0b\x66\x50\x9a\x05\x00\x05\x6d\xe3\xc4\x5a\xe6\xe9\x0c\xed\x8a\x45\x7f\xb5\x90\x47\x4d\x5a\xaa\xe9\x5a\x54\xa3\xae\xa0\x10\x29\x7f\xcd\x4b\xbc\x60\xfd\xb1\x71\xd7\x54\x2a\xf6\x7f\x8b\x14\x6a\x87\xe8\xfd\x9f\x6b\x97\x41\xef\xff\xb5\x36\x3f\xa2\xad\xc7\x82\xd2\xad\x7e\x58\x34\x2e\xaf\xfe\xef\x41\xdd\x6f\x1f\x63\xbe\x5c\x97\xa5\x32\x5c\x13\x66\x55\x5e\x79\x39\x5c\xe8\xf7\x60\x55\xdc\x96\x1e\xab\x35\x81\x5e\x54\x56\x64\xd4\xb5\x73\x69\x61\x5d\xfd\xe6\x5c\xa3\x8a\xe7\x52\x45\xf8\x9d\x00\xb3\x1f\x4a\xbc\xd6\x04\x6d\xc2\x7b\x09\x71\x5a\x1f\xf4\x9b\x39\x3e\x1d\xcf\xe5\x39\x76\x2d\xb2\x9f\x19\x1d\xd8\xe8\xcf\x04\x4f\x9e\x71\xca\x6c\x59\x4c\x4a\x76\x03\x3f\xba\x65\x90\xcb\x17\xc6\xd8\xbf\x35\x47\xe0\xa9\x0b\xbd\x30\x8d\x0c\xed\x7d\xe8\x72\x68\xef\xa5\x63\xb3\x9b\x35\xf8\xd8\x1e\x80\xd8\x19\x8b\xbe\x88\xbc\x00\x14\x03\x03\x43\x14\xf8\x16\xf8\x75\x28\xe3\x1a\x4c\x45\xb2\x37\xf8\xfe\xec\xd2\xdc\x5d\x54\x0e\xc8\x2e\x0f\xf5\x4d\x47\xaa\xcf\x66\x24\x04\xf9\x67\x83\xdb\x4e\xe2\xfc\xc4\xc3\xe9\xc3\x66\xe6\x94\xd3\x1a\x83\x29\xc9\x25\x3c\xf2\x48\xfb\xd2\x3e\x76\xdb\x36\x35\x45\x16\xf2\x38\xcb\xe3\x72\x70\x5a\x2a\x13\xb3\xb6\xdb\x40\x67\x06\xf9\x3f\xbe\x2f\x38\xbd\x83\xe7\x1c\x2b\x83\x49\x13\x92\x3a\x34\xbd\xcc\x13\xf9\xb6\x2b\x93\xbf\x7f\x9c\xad\x99\x10\xd7\xe7\x04\x67\x57\xe8\x6f\x2a\xa3\x52\x71\x8c\xd3\x4d\x05\xc3\x82\x95\x1b\xc0\x7e\x49\x41\xd4\x49\x58\x94\xbc\xcc\x43\x20\xc8\x4a\x75\xcd\x44\x47\xb2\xae\x06\xe7\x56\xf0\x4f\xfa\x0c\x0a\x22\x60\x0e\x6a\x6c\x64\x79\x54\x37\xba\x27\xc7\x07\xb5\xa5\x4a\x0f\xed\x60\xb1\xe5\xd7\xda\x1a\xa7\x57\x8e\x4a\xe5\x6a\x98\xe4\x7b\x42\xd8\x72\x9a\xd4\xaa\xc7\x32\x84\xd5\xdc\x2e\x99\x4d\x9d\x9f\x4b\xcf\xa7\xd9\x46\xba\xc9\x2a\xcf\x92\x4a\x73\x53\xd0\x5c\x91\x7f\xe8\x6f\xa8\xca\x50\x95\x2f\x8c\x6c\xe4\x3d\x1e\xf3\xe5\x60\x96\xf5\x58\x96\xe3\xae\xf0\xdf\xb4\x85\xae\xb2\x85\xca\x2b\xdf\x0d\x9e\xb3\x32\xdc\xa0\xee\x1b\x4e\x5c\xdc\x15\x15\x6a\x31\x73\xa9\x6a\x29\xc3\x1e\xc2\xd9\x02\x3f\x7d\x56\x76\x44\xde\x64\x6f\x1c\x67\x36\x93\x53\xe5\xee\x14\x5d\xdf\xa5\x78\x70\xd8\xea\x74\x45\x5a\x42\x7d\xc4\xaf\x8c\x05\x77\x8e\xba\xa1\x17\x85\x3c\x6a\x56\x1d\xfb\xea\xe3\xca\x6a\xd1\xbc\xe8\x1d\x08\xe1\xaa\xd4\x5e\xae\x40\x33\xc9\x45\xef\x80\x14\x0c\x86\x6a\x59\xfe\x45\x8d\xbd\xc9\x63\xfa\x79\xff\x95\x5e\xf0\xc2\x19\xfa\x61\x15\x69\xad\x6e\x79\x57\x75\x02\x5d\xeb\xcc\xb9\xa5\x65\xe5\x2b\x24\xa3\x1d\x9d\x51\x8a\x43\xea\x46\x6c\x39\xfa\x0e\x51\x2e\x80\xec\x2c\xbb\x36\x39\xe5\xac\xfc\x9d\x4c\x77\xda\xbf\x39\x98\xd6\xa6\x54\xed\x87\x73\x2b\xc4\x61\x68\x4b\x08\x95\x17\xca\xcc\x69\xe9\xc5\x1e\xa3\x89\xf0\x2f\x6c\x81\x7a\xb6\xed\x52\x41\x13\xc1\xf5\x54\xdb\xaf\xe2\x00\x51\xc7\x26\x18\xd0\x87\xba\xd4\x64\xff\x74\xad\x53\x8f\x20\x8a\x8b\x56\xb6\x2e\x89\xd4\x42\xc9\x5d\x4a\xe2\x96\xf0\x3f\x77\x6d\xf0\x65\xcf\xb9\xe4\xd4\x39\x45\xbd\x41\x03\x64\x98\x5a\x03\x95\x22\x85\xa1\xaa\x20\x80\x2e\x15\xe5\x6c\xa1\x8b\x14\xde\x4e\xe7\x8a\x4e\x3d\x70\x3f\x4b\x08\x99\x75\xca\x86\xc2\x35\x43\x34\x35\x55\xf0\x43\xb9\x28\x9f\x97\x41\xc8\x83\x3c\x5a\xf3\x2c\xea\x53\x70\x55\xbb\x0f\x87\xcb\x10\x1e\xf5\x95\x64\xeb\x5e\x06\x53\xfa\x84\xbe\xe5\x50\xe7\x9f\x5e\xcd\xfe\x5b\x8d\xd9\x8f\xfa\x7f\x52\x0b\x3e\x5f\xb3\x2e\x54\x6b\xcd\x12\x63\x51\x96\xf4\x56\x98\xe7\xb1\x95\x37\xe6\x8c\x0e\x23\x8b\xe9\x51\x15\x54\x1f\x17\xbc\x80\xa1\xab\x71\x95\x76\xb9\xf3\xea\x19\xad\x7d\xaa\x3c\x6c\x97\x22\xc7\x18\x18\xe0\x65\xcb\x4e\x85\x0f\xdb\xb2\x8f\x87\x6c\x4b\x57\xb5\xd1\xba\xd9\x09\x7e\x1d\x9f\x5b\x58\x3f\x76\x82\x2f\x3a\x55\x6d\xe5\x35\x4e\xae\x8a\x26\x3e\x73\x7c\xc4\x33\xc7\xed\x67\x6e\x7f\xe6\xc9\x79\xf7\x19\x7e\x3b\x54\x28\x7a\xa6\xae\x50\x74\x12\x8b\xb4\xc8\xed\xb5\x17\x66\xfc\x70\x5a\xec\xff\xd8\x63\x86\xa0\xfd\xcf\x79\xc1\xf3\xcc\x16\x75\xfc\x29\x64\x63\xb0\xee\xda\x14\x48\x21\xc8\x44\x8d\x56\xf2\x52\xc8\xbb\xe1\x05\x28\x98\x99\xb5\xf9\xe1\x43\x87\x0e\x6d\x02\xd0\x7d\x84\x1d\x62\xcd\x4d\x99\xdd\x48\xfe\xf3\x90\xf7\x24\xf6\x6f\x1c\x23\xac\xec\x6b\x03\x4e\xf1\x09\x7f\x7f\x58\x66\xdd\xb8\xc5\xf6\x0c\xf7\xbb\x30\xdc\x77\x2c\xbb\xfd\x73\x76\x1b\x32\xf0\xef\xb6\xc8\x19\x61\x3f\x33\xc6\xf6\x01\x62\x94\x7f\x71\x2c\x78\x4f\x0d\xc1\xa3\x5c\x7e\xa9\x28\x51\x15\x7b\xc2\x67\x10\xde\x08\xb8\x26\x54\xb4\xd1\x53\x3e\x8a\x3e\xc1\x51\x0c\xcc\x92\x6a\x27\x11\x55\xcb\xa3\x9e\x80\x05\xb1\x55\x95\x57\x85\x60\x4a\x96\x6c\x81\xa7\x79\x2e\x28\x4c\x51\x47\xcf\xc1\x6b\x1a\x9b\x10\x1d\xd2\xa6\xa0\x0e\x95\x93\x4a\xe3\x04\x6f\x11\x53\x70\xda\x0e\xa4\x6a\x03\xcd\x04\x3b\xde\x4d\xf4\x59\x7b\x23\x1d\x67\xc7\xd8\x91\x4b\xdb\x48\x0b\x59\xbe\xc3\xcd\x74\xc9\x05\x25\xcc\xf7\x2a\x4e\x71\xe7\x70\xab\x7a\xc5\xbf\x36\xe6\x20\x92\x55\x45\x9d\xe5\xec\xbc\x48\xc9\xac\xe0\x7f\x68\x2c\xb8\xd9\xbe\x60\x14\x48\x30\xe7\x8b\x92\xe2\xad\xb4\x80\xc1\x43\x2a\x2b\x5e\xca\xb7\x40\x02\xed\x47\x90\xbd\xe3\x9c\xe7\x5f\xa9\xb1\x4f\x78\xec\xf1\xe2\x42\x2f\x46\x0d\x8d\x20\x73\xfd\xff\xe2\x29\x0c\xd5\x9f\xf2\x4e\x55\xef\x6a\x40\xb9\xbe\xc1\x4e\x05\xbc\x6b\xa9\xb7\x91\x0c\x04\xdf\x85\x3c\x45\xbb\xdf\x80\x4a\x07\xb9\x47\x1d\x2a\x0d\x06\x07\xb9\x13\x17\x2d\x5b\x08\x86\xbe\x19\x8c\x6e\xcb\x81\x1e\x7b\xbd\x14\x9c\x69\x98\xfe\xcb\xbc\x60\x30\x43\x3f\x54\x87\xe5\x83\x29\x64\x3b\xa9\x1b\x3b\xec\xed\xa8\x34\x6b\xd5\x06\x4c\xbc\x24\x16\x6e\x80\x2a\x6c\xf6\xf2\x8d\xab\x47\x42\x31\xcf\x2d\x6d\xee\x42\x79\xdf\xd5\xc1\x7b\xbc\x2d\x1e\xa8\x14\xd9\x87\x27\x25\x15\x9e\x6f\xd2\xdf\xaa\xb8\xb1\x2e\x18\xb8\x4a\x75\xf7\x31\xd3\xcb\x58\xa4\x20\x23\xb6\xfa\x96\x0a\x36\xc9\x36\x52\x91\x17\x9d\xb8\x47\x4e\x1b\x94\x61\xd3\x88\x2f\x9d\xc2\x88\xba\x5c\x80\xe4\x19\xa7\x6b\xcd\x8b\xde\x55\x65\x98\xaf\x09\xd8\x67\x61\x72\xd1\x1b\x8b\xef\x4b\x2f\x7a\x63\x49\x3f\x75\x28\xee\x4b\x57\xb2\xbb\xd8\xe3\x5b\x9d\xb0\x37\xd3\x2f\x3b\x27\xd5\xce\xf1\x67\x82\xa3\x1b\x1d\x21\xb9\x8e\x89\x75\x81\x4e\xe9\x47\xf8\xec\x9d\x33\x0b\x3c\xec\x97\x1d\xc9\xd2\x51\xf1\x72\xcc\x69\xef\xaf\x69\xab\xfc\x83\xb5\xe0\xa7\x6a\x55\xb3\x7c\xc5\x98\x26\xb9\xdc\x20\xeb\xf3\x8d\x10\xb6\x89\x32\xd9\x2f\xc7\x3d\xb9\x71\x4d\xe8\x0e\xe6\xab\xb8\x4d\xc5\xc5\x25\x18\xf0\x29\x4d\xf8\xe1\xca\xba\xb8\xdc\x60\x02\x15\x41\x10\x17\xad\x22\x76\xc0\xf1\x3d\x76\x35\xb0\xd1\xb0\xcc\x72\xd0\xed\x3e\xe2\x05\xef\xf3\x10\xdc\x84\x56\x61\x4e\xdd\x47\xe9\x94\xcf\xb5\xb9\xf3\x8a\x1b\xbc\x8f\xd0\xec\xf2\x3b\x10\x13\xd3\x86\x14\x81\x58\x6a\x34\x61\x2a\xb2\x7e\x91\x0c\x10\x9b\x16\xdb\x8e\xf5\x33\x37\x23\x09\x01\xc3\x0f\x93\x5b\x4f\xdc\x6c\x39\x7b\x6e\xad\x86\xb5\xdb\x46\x16\xaa\xf9\xe6\xec\xbb\x43\x4c\x92\xa0\x3f\x15\x3c\x71\x19\x5b\xc5\xaf\x19\x71\x7b\x48\xce\x4e\xd9\x35\x6e\xa7\xfd\xe7\x04\x67\xd5\xf8\x55\x1f\x31\x0b\x40\x12\x06\xa4\x8d\x87\x29\xb5\x0b\xd6\x08\xd9\x71\xd7\x06\x7c\x90\xb8\xc6\x41\x3e\x59\xb6\x7a\xae\x3a\x7d\x8c\xc9\xed\xe1\x37\x14\xe2\xe2\xb7\x63\x4b\xd4\xdd\xd3\xfd\x94\xe0\x9a\x5d\x80\xc5\x5f\xf4\xd8\x7e\x9c\xa0\xc2\x7f\xc0\x0b\x5e\xe9\x39\x6f\xe1\xf6\xe3\xa7\x63\x54\xf4\x85\xba\x20\xcf\xfa\x18\xb6\x17\xe8\x26\x00\xc1\xdf\xbb\x57\x6a\x41\x27\x70\xb3\x29\x24\x6e\x3c\xd3\xc1\x72\x82\x86\x49\xc5\xf6\x26\xcb\x41\x2f\x6e\x41\x34\xfd\xf2\xec\x02\x89\x10\x37\x1c\x3f\x04\x1c\xe1\xe8\x91\xe3\x87\xa6\x9c\x23\xda\xb5\x4f\xb3\xf3\x96\x95\xfd\xde\xe0\x99\xbb\xcb\xff\x19\xb6\xb2\xbb\x86\xf5\xe7\xdb\x19\x41\xdd\xcb\xb0\x77\xdf\x08\xbc\x86\xd2\xdf\x24\x9d\xd1\x1a\xe3\x1c\x43\x30\xa2\xde\x10\x2e\x47\x62\x3f\xe3\x31\x87\x13\xfa\xaf\xf7\x82\x1f\x1e\xb5\x46\x8f\xc5\xf2\xd8\x91\x6e\x8f\x53\x4c\x78\x49\x14\xa0\x57\x3e\x2d\x38\x3c\x9a\x05\xd3\x03\xdb\x32\xe0\xaf\x4e\x8c\x2c\x91\xa5\x13\x58\x20\xba\xed\x57\x27\x82\xef\x75\xae\xb8\x1a\x98\xc9\x76\x19\x1d\xc0\xf6\x9f\xf6\x02\xd8\x76\xad\x0e\xff\xae\x0e\x60\xfb\xa4\x17\xbc\xda\x9b\x93\x7f\x6a\x63\x6b\x75\x1d\x94\xc5\x49\x65\xc2\x24\xc0\x59\x1e\xb9\xd2\x3a\x97\x5a\xce\x4a\x77\x74\x4f\x07\xde\x0b\x5e\xb3\x83\xd7\x76\x5a\xa0\x0b\x55\x35\x87\x25\x6d\x15\xb0\xf6\xce\x09\x1b\xde\xa7\x52\xf6\x76\x1e\x7f\x2d\x00\xea\xf3\x29\x53\xa6\xfd\xbf\x1d\x08\x3e\xeb\x6d\x72\x93\x30\x51\x56\x21\xbd\xae\x17\xe6\x65\xdc\xea\x27\x61\xae\x6c\xb4\xaa\xea\xb4\x8a\x9f\x22\x34\x24\x9e\xf5\x4b\x5d\x6b\x43\x95\x37\x86\xec\x36\xe7\x33\x52\x85\x39\x08\x65\x71\x14\x80\x19\x01\x99\x50\xab\x60\x26\x80\xd7\x11\x85\x9a\x8a\x7e\x03\xfa\x34\x99\x56\x95\xc0\x2b\xd5\xd2\x06\x78\xe5\x24\x2b\x38\xdc\xbc\xc1\xe1\xcb\xaf\xd9\xcf\xde\xab\xad\x1b\xef\x1c\x0b\xbe\x54\x53\x78\x9b\x91\x28\x4a\xa8\x65\x9d\x29\xbb\x03\xa4\xd1\xf6\xcb\xb5\x0c\xf6\x20\xf6\x84\xac\x01\x92\x2d\x69\xa3\x46\x42\xa7\x43\x2b\xeb\xae\x82\x85\x01\x93\x7a\x42\x9e\x64\x6b\xf2\xa8\xe3\x67\x17\x0d\x54\x8c\xb6\x00\xa3\x43\x36\xcb\x79\x37\x2e\x0a\x48\xd9\x37\x65\x93\x55\x21\x65\x6d\x85\xe0\x93\x6a\x26\xa8\x08\x7a\x99\xc7\xca\xaa\x2e\x1f\x98\x1a\xf1\x01\xe2\x0a\x2a\x83\x8b\xf0\xca\x54\xf1\x99\x2c\x15\x30\x0a\x5d\xc6\x59\x7d\x5b\x25\xa9\xd2\xf7\x74\xdc\x9d\xbd\x1a\xaa\x7b\x76\x63\x78\x10\x5b\xcc\xd7\xe6\x91\x37\xb3\x13\xec\x86\x1d\xd6\x64\x76\x08\x43\xca\x1d\xec\x4b\x63\xac\x56\x66\xfe\xe7\xc7\x82\x97\x8d\x8d\x58\xae\xd1\x2b\xa5\xa9\x4e\x7b\x20\x4c\x01\x93\x7e\x22\x75\x03\x3c\x4f\xec\x45\x04\xfb\xfa\xe6\xab\xa8\xd4\xa6\x2c\xdd\xc5\x7a\x3a\x1d\xdf\x62\x59\xad\xe7\x76\xb7\xba\xbb\x5d\x58\x43\xeb\x10\x35\xf1\x30\xae\xad\x10\x39\x7b\x8d\xc7\x8e\xdb\xc1\xa2\xfd\xb2\x93\xe5\x0a\x7a\x0b\x44\xde\xa4\xbd\xd4\xc7\x44\xf8\x7e\x22\x8a\x45\x21\x0f\x68\xf0\x7d\x2e\x3b\x3b\xfb\x76\x76\xd2\xae\xb9\xf7\xd4\xe0\x3a\x23\x1b\x94\x19\x17\xf2\x5c\x0d\x4b\x41\x35\xb9\xdb\x92\xc3\x8c\x74\x1b\x3f\x74\x80\xfd\xbb\x4d\xb2\x40\x40\x30\xfc\xfd\x03\xc1\x59\xf5\x43\x49\x23\x1b\x9d\x2c\x31\x32\x89\x5c\xe5\x79\xc8\x89\x41\x47\x17\x98\x37\x57\x05\x00\xc1\xac\xc5\x05\xa0\x99\x29\x94\x51\x48\x3c\x1e\x29\x41\xbe\x6d\xaf\xca\xea\x9e\x4c\x3c\x24\x13\xcf\x2b\x91\xf8\x54\x70\xb5\x62\x85\x90\x1e\x65\xef\xc8\x29\x76\x90\x7d\xcf\xf6\x12\x69\x16\xed\x09\xa3\xbb\xc2\x6a\x5f\xd8\x5e\x74\x6b\xf8\x4f\x19\x85\xaa\xac\x18\x48\xd5\xd8\xfe\xc6\x71\xf6\xe4\x11\x4b\x75\x3a\x6b\x85\x89\x63\x7a\xfd\xeb\xb1\xe0\x34\x5c\xb5\x6d\xac\x51\x9c\x8b\x56\x99\x0c\x1a\x3a\x9c\x41\x45\xb5\x03\xb7\xc1\x74\xb2\x36\x10\xc5\x60\x28\x6e\x7d\xbc\x57\x45\xfc\xfd\x91\x31\x76\xbf\xb1\x55\xfe\x83\x17\x7c\x63\x0b\xc4\x97\xb9\x92\x87\xbd\x5e\x12\x0b\xca\x7e\xdc\xd0\xc0\x18\x80\x62\x09\x48\x45\x49\xd6\x3a\xcf\x23\x81\x91\x05\x8f\x28\x44\xcc\x72\xa7\x6a\xad\x27\x38\xc0\x7e\x99\x35\x50\x20\xa0\x0f\xe3\x77\xb7\x40\x8c\x79\xb1\xc7\x60\x6a\xfc\xe7\x07\xdd\x65\x15\x98\x00\xd0\x9c\x43\xa1\xd9\x2a\xe9\x0f\x66\x83\x50\x83\x94\xb9\x84\x16\x27\xcb\x41\x46\xb0\xa7\x82\x4f\x46\x71\x71\xbe\x8e\x32\x75\x09\xa5\x3d\x9a\xcd\xa6\x6b\x06\xf9\xc3\xab\xd9\xd4\x8e\x8a\xea\x80\x18\xff\xde\xab\x83\xbf\xf6\xac\x0b\x43\x19\xb7\x70\x04\x76\xc3\x5e\x4f\x63\x3a\x00\xc0\x29\x02\x90\x86\x96\x85\x14\x66\x9e\xc6\x99\x8b\x04\xec\x99\xab\x61\xeb\xbc\x48\x23\xe5\xc2\x29\xe4\x66\x6c\x65\x5d\x00\x0d\x50\xbb\x56\x0a\x52\x08\x07\xa9\xce\x5d\x95\xb7\x0b\x2d\x82\x9c\x41\x92\x67\x9e\xf5\x09\x3d\x49\x7e\x44\x35\x5e\x4d\x01\x96\xf7\x34\x26\xb7\x35\xb4\xbb\xe4\xe2\xba\xe1\x77\xff\xf9\x4a\xf6\x55\xc6\xc6\xe5\x87\xfc\x2f\xb1\xe0\x53\xec\xce\xcc\x9c\xd4\x50\x20\x90\xdf\xa7\x8d\xab\x11\xc6\x32\xa8\x18\xa5\x50\x3b\x34\xe5\xeb\x75\xac\x79\xaa\x21\x39\x16\x6f\x9f\xe5\x47\x6f\xbc\xe1\x78\x93\xcf\x67\x14\xe6\x69\x22\x35\xe4\x62\x2a\x71\x54\x71\xb8\x40\xb6\x12\xe8\xea\x9c\xf2\xd2\xb9\xc5\x39\xbb\xd5\x38\xd5\xad\x9e\xe0\x87\x9b\x7c\x6e\xa1\xd0\xa0\x2b\x1a\x50\x76\x56\x87\x7c\x98\xe2\x6c\x7a\xf0\xc6\x79\x22\xf7\xdf\x80\x97\x19\xe3\x1c\x3e\x35\xb7\xa0\x01\xb2\x7a\xa2\xa5\x8b\x18\x86\x80\xf0\xa9\xaa\xe0\xb3\x23\x54\x4c\xee\xc4\x0a\x8f\x44\x12\x77\xe3\x12\xa3\x35\x49\x22\xed\x51\xf4\x8e\x40\xfc\x4b\x52\xbc\x2a\x3d\x64\x13\xdc\xea\xa4\xb6\x00\xe2\xd1\xac\x2a\xbb\x41\xd4\x8b\xf6\x21\x9c\xb8\xe1\x10\x50\x84\xe4\xd7\xf2\xb4\x95\x4d\x9c\x38\x76\xec\xa8\xbe\x58\x34\xd9\x6d\x54\x70\xa8\x40\xc7\x6b\xab\x03\x35\x8d\x68\x4c\xed\x3e\xa4\x4b\x6f\x42\x7c\x4a\xd5\x0c\xd7\xa4\x60\x5c\x1a\x36\x42\x80\x26\xa5\xa9\x29\x65\xc8\x48\x05\xc1\x76\x88\x60\x2c\x96\x50\xb7\xdf\x40\x9a\x45\x71\x5e\x89\xce\xab\x61\x21\x22\xc5\x04\xcc\x06\x1a\xfa\x06\x43\x72\x24\xee\x10\xf4\x72\xd1\x8a\x0b\x11\x90\xa8\x08\x7c\xd2\xa6\x49\x1b\x73\x18\x01\x68\x28\x42\x34\x2b\x87\xe9\x95\x4f\x8a\xe6\x5a\x93\x07\xed\x2c\x6b\xae\x86\x79\xb3\x95\x75\x03\xa8\x62\x1b\x6c\xc4\x49\xd4\x0a\xf3\x28\xa8\x6f\xf6\xa1\x5e\x2e\xda\xf1\x05\xe3\x1e\xa7\x8a\x7e\xea\x45\xc2\xb6\xa6\x0f\x5c\xd7\x94\x9f\x80\xe6\x91\x7a\xf4\x63\x1a\xd6\x8e\x1f\xbc\xee\x20\xaa\xed\x84\x6e\x8b\x00\xbb\x22\x69\x73\x72\xa9\x22\x7f\x38\x39\xbf\x44\x6d\xa3\xc8\x85\x0a\x08\xd2\xb3\xea\x04\xdc\x6f\xf2\x67\x67\x7d\x85\xf1\x46\x11\x03\x95\xde\x99\x4f\x60\x3f\x61\xa6\x6f\xb9\x85\x07\xd7\x05\x53\x28\xed\x03\x7d\x28\x07\xcd\x28\x1a\x81\x57\x48\xc9\x4a\x2b\x3b\x7c\x23\x1c\xe0\x1e\xc5\xdc\x6a\xd2\xc2\xe4\xf2\xd5\x89\x41\xa2\xd3\x5b\x0d\xc2\xa8\x5e\xa4\x66\x01\xad\xc3\x42\x75\x00\x94\x16\xd4\x46\xc9\x8b\x24\xf7\x93\x4d\x36\xf9\x11\xa7\x79\x33\x42\xad\xa6\x5f\xe6\x67\xa4\x06\xa4\xbe\x04\x14\xda\x6f\xb7\xe3\x0b\x7c\x32\x17\xdd\x4c\xe3\x00\xe1\x8a\xc0\x5c\x4e\x29\x76\xa1\xa7\x18\x94\x66\xfb\x4c\x7a\x3a\x1b\x97\x5f\xf2\x6f\x63\xdf\x77\x29\xd5\xdf\xee\x5c\x5e\x5e\xa8\xee\x0a\xf6\x62\xd7\x24\x9f\xaf\x86\x2d\xfd\xc2\x62\x96\xa0\xe6\xf5\x87\x07\x82\xd7\x7a\xea\x17\x4e\x4f\x2b\x4b\x12\xf4\xa9\xc9\xfe\xca\x7b\x05\x3f\x29\x0f\xbb\x56\x48\x00\x4f\xeb\x87\x9b\x87\x9f\x2a\xff\x68\x87\xeb\x19\x56\x14\x95\x8d\xbb\x7a\x26\x09\x8a\xeb\x87\xb9\x6a\x1e\x35\x00\xa0\x94\x34\xe3\x49\x96\xae\x89\x1c\x31\xe8\xa1\x3e\x29\x36\x7c\xe4\xc8\x68\xd5\xed\x63\x57\xb0\xb6\xa5\xb9\xfd\xfb\xdd\x29\x6e\x5b\x86\xea\xec\x29\x54\xbb\x54\xa8\x9e\xab\x14\xaa\x73\xc1\xb7\x6b\x0f\x83\xf1\xf3\x00\x49\xed\xdc\xda\x3f\x44\xb8\x7b\x0a\xd6\x6e\x14\xac\x64\x7b\x05\x6b\xce\xbf\x43\x2b\x58\x9b\xee\x6c\x03\xff\x41\xdb\xdb\xd5\xbb\xb0\x56\x23\x7b\xcd\x04\xfb\xde\x2d\x22\x9d\x66\x97\xe6\xb4\x11\xe8\x4f\x0f\x04\xd3\xd6\xef\x51\xcc\x88\x6e\x2b\xbf\xd4\x68\x4e\xf1\xbe\xbd\xe2\x59\xbb\xde\xc1\x1d\xb5\x83\xef\x0d\x9e\x18\x8f\xf2\x11\xd2\x4a\xd8\xbb\xf8\x18\x3b\xb2\x85\xbb\x7d\x93\x95\xdf\xdb\xcb\xbb\xf0\xdc\x7d\xd2\xb6\x65\xfe\xea\x2e\x6d\x99\x3f\x38\xda\x94\xf9\x68\x81\x9d\x3f\xe4\x45\xdb\x33\xa6\x19\xff\x69\xca\x69\x67\x71\x8a\x51\x8c\x47\xfb\xed\x14\xdd\x11\xd3\x62\x9f\x3e\xc0\x8e\x6e\x69\x1b\x47\xbb\xf8\x0c\xd4\x8a\xb1\x0c\xe3\x6f\x3c\x10\xbc\xc3\xdb\xe4\x26\x49\xfe\xc3\xf5\x0d\xb0\xe2\x8c\xc9\xbe\xe1\xa7\x2e\x84\x2d\xa8\xc9\x8e\x70\x42\xaa\x7c\xd4\x8c\xdd\x0b\x2b\x07\x14\x73\x69\xd3\xed\x1e\xeb\x9a\x62\x3e\x6e\x88\xe7\x15\xec\x41\x8f\x7d\x6b\x6a\xb5\x60\xb2\x4d\x5f\xe7\x6d\x91\x7c\x33\x34\x2d\xf3\xa3\xda\x08\xce\x8c\xbc\x6c\x79\x35\xab\x10\x4e\x21\xc0\x63\xeb\x8d\xeb\xce\x8f\xec\xac\x9f\x0f\xf7\xf4\xf5\x5b\xd5\x42\x1e\xea\xe9\x88\x6e\x2e\x6d\x37\x81\x5b\x75\x78\xb3\xce\xde\xca\xc6\xfa\x71\xe4\x3f\x35\xb8\xee\xdc\xdc\xc9\x11\x65\x5a\x2c\xb5\x02\x90\x38\x8a\x4a\x6c\xe8\xcf\x79\x6c\x5c\x5e\xf4\xdf\xe1\x05\x6f\xf0\xce\x15\x26\x9f\x13\x30\x4a\x07\x59\xff\xa0\xd4\xa9\xe9\xf5\x36\x95\xc6\x18\x64\x7d\x0d\x81\x18\xc8\x97\x02\xbe\xda\x2f\xc1\x70\x10\xdc\x21\x29\xbe\x08\x48\xad\x89\x0b\x0c\xbf\x2e\x45\xde\xcb\x05\x45\x7f\x06\xcf\x02\x57\x72\x9b\xc3\xf7\x36\x84\xb2\x39\xf0\xae\xe8\xae\x8a\x1c\x4f\xb9\x01\xee\x1d\x87\xd5\x7c\xdc\x63\xfb\xc4\x85\x32\x0f\xfd\x0f\x7b\xc1\x6b\xbd\x53\xf2\xcf\x6a\xc9\x1f\xd5\xf7\xe6\x5c\xda\xce\x9a\x77\x88\x12\x9e\x9a\x9c\x92\xbc\xa4\x93\x45\x86\xef\x5a\x71\x44\x50\x75\x64\x29\x4e\x5b\x06\x25\x04\xcb\x0f\xe8\x48\x5b\x5c\x31\x39\x3b\x25\x4f\x85\x88\x28\xe5\x58\x49\x05\x80\xab\xfe\xa0\xf7\x44\xf6\x1d\x9b\x47\xa0\xd9\x19\xd2\xf3\xec\x0a\x1c\x9d\x7f\x32\x98\xc4\x19\x73\xaa\xb3\x16\xa3\x66\x7e\x8b\xe0\xb6\x17\x8d\x8d\x04\x38\x83\x12\x7f\x4b\x22\x8f\x45\xe1\xff\x51\x2d\xb8\xcf\xfa\xad\x5c\x8b\x0e\xcd\x00\xb2\x0c\xdc\xd5\x65\x2a\xeb\x3c\x6e\x8a\xa6\x3c\xb2\xe0\xd0\x0b\x4b\xbe\x11\x16\xd3\x71\xc1\x3b\x52\xfb\x4f\x09\x75\xae\x8c\xd3\x3e\x84\x55\x02\xb9\x16\x59\x57\x20\x88\xba\xc3\x08\xbe\xec\xb1\x15\xb6\x0f\xa2\xc2\xfd\x67\xa9\x90\xc3\xdb\xe6\xfb\x6a\xcd\xb3\x16\x66\x40\xb5\xec\xc4\x2b\xec\x4e\xbf\x67\x44\x18\xd4\x7e\xf3\x72\x55\x84\x98\x95\xe9\x04\x27\x5e\x60\xd7\xca\x47\xce\xae\xa2\x3e\x07\x89\xa1\xd1\xe6\x3b\x77\x8b\x33\xe9\x4c\xdc\xca\x33\x48\x0e\x7d\xb2\xfc\x57\x71\x53\xe8\x80\xe9\x2a\xcf\xe8\x4b\xec\xf3\xae\x25\x77\x44\x79\x40\x52\x8e\x81\x93\xff\xcc\xd5\xc1\x4d\xd6\x6f\x6b\xf3\xdb\xe6\x28\xbd\x11\x37\xe2\x02\x2c\x02\x19\x56\xab\x70\x27\xf6\x8b\x57\xb1\x5f\xae\xb1\xfd\x64\x61\xf5\xdf\x53\x63\x27\x36\xe5\x54\x9b\x77\xeb\x36\x7c\x3d\xf8\x5b\x6f\xc6\x00\x49\x93\xd1\xb6\x15\xf6\x10\x6d\xb5\x4d\xc6\x61\xc7\x2c\x47\xa8\xd0\xe9\x41\x15\xc9\x21\x77\x2f\xba\xe2\x67\x6c\x7f\x73\xd6\xe6\x07\xa9\x45\xac\x88\x00\xe6\xea\x83\xe6\xe4\x30\x21\xc6\xa3\xf3\xde\xc1\xd0\x9f\x24\xd9\x06\xae\x44\x16\x46\xab\x61\x12\xa6\x2d\x91\x73\x83\x37\x20\x5b\xa6\xfe\xcb\x5e\x82\x93\x1f\x6a\x29\x12\xc3\x0a\xf9\x5a\x92\xad\x86\x3a\x9c\xbe\xc9\xde\xb7\x8f\x5d\x1b\x5b\xc5\xda\x21\x04\xf9\x6d\xfb\x82\x1f\xdb\x37\x57\xb9\x3a\x2a\xd9\xdd\x7e\x46\x23\x3a\x6b\xa4\x7d\x30\xa2\x59\x36\x6f\xe7\x69\xa5\x02\x18\xe0\x69\x1a\x02\x98\x27\x4c\xda\x66\x69\x81\x69\xd2\xdc\xe4\xa2\x97\x10\x24\xb7\xe0\x91\x31\x8c\xac\xb8\x51\x70\x34\xac\x26\xc0\xf3\xae\x70\x90\x20\x29\xce\xe1\xf6\x2c\x87\xf5\xdd\x08\xf3\x08\x42\x5c\x7a\x61\x19\xaf\xc6\x49\x5c\x0e\xea\xca\xc9\x03\x05\x11\x74\x25\x2c\xd8\x8f\x25\x24\xd4\xa8\x25\xa3\x7a\x66\xb9\x68\x89\x08\xb7\xc3\xba\x16\x70\xe5\xea\xe1\xf8\xad\x91\x49\x29\x58\x74\x63\xc9\xed\x37\xc2\x1c\xf8\x07\x19\xb7\x0c\x4a\x82\xf5\x49\x30\x07\x46\x71\x1b\xe2\x62\x4b\xad\x8d\xcc\x39\xe0\xc4\x06\x85\x78\x66\x61\x4e\x69\x43\xf1\x5a\x2a\x65\x46\x9a\x6f\x61\x8a\xbc\x29\x08\x71\x8b\xda\x66\x52\x77\x5d\xf4\x69\xab\x52\x61\xc3\xfc\x3c\x1e\x5d\x44\x33\xca\xd8\x4a\xc6\x5e\x05\xf6\x55\x88\x12\x44\x30\xdb\x3d\xa5\x63\x53\x68\x3e\x34\x94\xa9\xc5\x78\xeb\x2e\x24\x90\x4b\x23\x59\xab\xaf\x47\xda\xac\xc2\x00\xc2\x0e\xf2\x3f\xe3\x05\x2f\xb1\x60\x00\xc1\x42\x88\xae\x20\x0b\x86\x0c\x50\x10\x1c\xfb\x38\x9c\xe5\x8e\x29\x3c\xcb\x79\x9a\x39\x91\x2d\x75\xc7\x16\x0e\x14\x90\xea\x73\xb1\xc2\x26\x9c\x13\xea\x26\x76\xe3\x16\xd0\x61\x9b\xb3\xa1\xc5\x7e\x22\xd8\xcb\xc6\xd8\x58\x99\x14\xfe\xff\xac\x05\xef\xab\x2d\x9f\x5e\xaa\x82\x44\xbb\x2e\x09\xc5\x2d\xc1\xb6\x4c\x3e\xc6\xc2\x18\x99\xe5\xfb\xf2\x52\x9d\x1f\x3b\x76\x14\xc6\xac\x53\x9b\x51\xe0\x30\xf4\x03\x33\xa8\x18\x85\x21\x3b\x39\xa1\x05\x48\x34\x03\x63\x63\xa6\x36\x2e\x58\xce\x01\x30\xb7\x67\x79\x09\xc9\x4f\x79\x44\xb0\xff\xca\xf1\x80\xe5\x00\xac\x02\x03\x79\xd6\x5f\x43\x07\xd8\xd2\xfc\x1c\x74\x53\x4f\x4b\x5d\xed\x0a\xda\xc0\xf6\x16\x6a\xf7\x93\x76\x8c\xc8\x6a\xf6\x13\x7a\xe0\x4b\xf3\x73\xcd\x9d\xe3\x31\x6e\xbe\x12\xcb\xa7\x97\xd8\x03\x13\x0e\x3a\xde\x16\x31\x3f\x60\x3d\xf9\x7f\x0f\x04\xd7\x0f\x5d\xad\xc4\x57\xdb\xb7\xb7\xb6\xa1\xfc\xfa\x9e\x0d\x65\xd7\x36\x94\x5c\xd9\x50\xe2\x20\x18\x61\x05\x55\x53\x45\xcb\x60\x93\xcd\x0d\xec\x38\x3b\x76\x39\xd1\x5f\x7b\xd6\x94\x5d\x58\x53\x3e\x65\x5b\x53\x7e\x6d\x97\xd6\x94\x1f\x7a\x8c\x02\xc3\x8c\x39\xa5\xb3\xbd\x39\xe5\x94\x3f\x6b\x80\x9d\x0d\x55\x55\xec\xbb\x43\x5c\xa5\x1a\x60\xf3\x79\x8f\xdd\x72\xb9\xd5\xbb\x9b\x4f\x5f\x3a\x3b\xef\xbf\xce\x0b\x7e\xd4\x83\x32\xa1\x4e\x76\xe3\x00\x53\x4b\xb1\x80\xe8\x3a\xba\x93\x97\xc1\x75\x6d\xa0\x1b\x2c\xc0\x86\xd5\x2c\x4b\xea\x1c\x52\x57\xeb\xbc\x9d\x64\x21\xfc\xa1\x8a\x77\xdd\x7d\x8f\x4e\x36\xfb\x81\x17\xd6\x79\x37\xec\xdd\x8d\xb7\xec\xeb\xc0\x4c\xd2\x38\x69\xb2\xf7\x5f\x61\x17\x85\xda\x6a\xc9\xed\x12\xd1\xfe\xff\xdc\x17\x7c\x4a\xca\x03\x95\xaa\xc5\xb0\xf1\xe1\xda\x7d\x7d\x91\x0f\x50\x56\x0b\x55\x9c\xb7\x66\x1f\x28\xb3\xe5\xa2\x90\x47\x7b\xd6\x46\x49\x00\x3e\x50\x18\x57\xee\xa9\x0b\x72\x8a\x60\x02\x61\x06\x66\xe6\x4f\x92\x24\x85\xe1\xb2\x95\x6f\xdb\x71\xb2\x8a\xd9\xf0\x19\x9e\xf6\x93\x64\xb3\x47\xd3\xcc\x62\x4b\xd6\xa9\xf0\xcf\x63\xec\xff\xf2\xd8\xb5\xd5\x5e\xf8\xef\xf3\x82\xbb\x86\xba\xe6\x30\xbb\xca\x87\xec\x92\x08\x6a\xcc\xe6\x8a\x35\x2a\x9b\x2b\x9e\x65\x67\xd8\x33\x2e\x67\x4f\xda\x0b\xb4\x68\xbe\xc3\x7e\xbe\xc6\xae\xb4\x66\xd8\x7f\x4b\x2d\xf8\x5f\x9e\x3d\xe5\x30\x84\x6e\xd8\x93\x23\xf8\x81\xf3\x62\x50\x07\x1a\x7c\x21\xef\x85\x71\x0e\x93\x48\x62\x8e\x7d\x8f\x3c\xdc\x76\x33\xb2\x05\xf4\x4a\xab\xf2\x17\x80\x50\xc4\x05\xe9\x18\x6a\xa1\xad\xd9\x93\x52\x6e\x56\x08\x28\x79\xa7\x75\xb1\xe0\xbc\x18\xa0\x75\x87\x02\xb7\x90\xb2\x82\xb9\x34\xc0\x53\xb0\xec\x58\x95\x3f\xf2\x70\x60\x82\x98\x41\x3e\x0b\xe0\x5e\xb0\xe5\x84\x6f\x01\x2e\xf7\x90\x17\xb0\x6f\x75\x58\x4a\x37\xec\x0d\xa1\x51\xbc\x72\xdc\x71\xf8\x28\x7b\x88\xb2\xc0\x3d\xb3\x9f\x95\x21\x96\x2e\xf6\xff\x78\x2c\xb8\x7d\xc4\x75\x47\xb4\x10\x29\xe4\x06\x46\xbc\x83\xbc\x14\x4e\x13\x39\x56\xa5\xfc\x4b\x39\xbb\x59\x0d\xb1\xfb\x13\x8f\x8d\xcb\x17\xfc\x2f\x78\xc1\xcb\xbd\x3b\xe5\xab\x0a\xbb\x49\xa1\xdf\x8c\x68\x56\xea\x0b\x00\xb1\x80\xd5\x8b\x8d\xda\x77\x89\x19\x4f\x3d\xe0\x94\xd3\xba\x80\xf8\x7d\x72\x6c\xc5\xf4\x83\xde\xd3\xd8\x2d\x97\x70\xaa\x34\x75\x07\x9e\xd9\x0f\xd3\x32\x2e\x07\xb6\x1d\xeb\x1d\x68\x3e\x8c\xfc\x37\x7b\xc1\xd3\xa1\xa0\x25\x8d\x50\x95\x1b\xd6\x13\x84\x85\x6b\xfb\x80\x87\x56\x2d\xe3\x4c\xd4\x6a\x4a\x80\x3d\xbc\x9d\xfc\x7d\x17\xe1\x59\x11\xc3\xb3\x04\x54\xdb\x8a\x16\xb2\x68\x86\x42\x27\x97\x45\xde\xf5\x7f\x6e\x2c\x58\x87\xc8\x17\xb8\x5f\xa8\xb8\x6f\xea\xb4\x0a\x2d\xd9\xe4\x6d\x55\xbe\x19\x8a\xd4\x44\x91\x88\x78\x4f\xe4\x0d\xc4\xa8\xca\x78\x3b\xa6\xfd\xd1\x95\x1a\x5a\x0f\x94\xbe\x5c\x44\x10\x5a\x38\x59\x4c\x5d\xf4\xae\xc0\x8f\x5e\xf4\x1e\xd7\x73\xdb\x75\x68\xeb\x15\x35\xd6\x67\xf4\xa8\x7f\x5e\x59\xd2\xee\xc2\x0b\x43\x01\x76\x3a\xb8\x0e\x53\x95\x95\xb1\x54\x5e\xa9\x7c\xa4\xae\x56\x22\x87\x70\xac\xc3\x8d\xc3\x87\x0e\xb9\xa9\xbf\xaf\xf5\x58\xb5\x67\xfe\x0b\x76\x90\xde\x5a\x99\xa5\xe0\x4e\x1d\xa0\xcf\x67\xa0\xf4\x87\x0e\x5e\x2d\xa1\x1f\xa3\x82\x04\xdd\xae\xe3\x60\x9b\xec\x43\xd7\xb2\xc3\xdb\xc0\x06\xaa\xdd\x8d\xb2\x03\xc4\x51\xbe\xe4\xda\xe0\xa7\xc7\x86\xaf\x23\xaf\xed\xe5\x02\xd1\x42\xd0\x00\xa2\xce\x23\xb0\x6a\x6a\x9a\x55\xb2\x64\x5d\x9b\x68\x2d\x53\xfb\xc1\x42\xca\x26\xab\x9a\x1d\x52\xda\xae\xd9\xcb\x33\x7c\xc4\xc7\xf5\x19\x39\xf4\x15\xa9\x0c\x02\xbb\xc1\xcc\x8e\x13\x7c\x32\x9c\x72\x53\x39\x8c\xe5\x5c\x7e\xb8\xb0\x42\x88\x74\x23\x75\x3e\xb9\xba\xe9\x5b\x61\x2f\x26\x33\xf4\xe8\x37\x5b\x9b\xbe\xa9\xc5\x86\xd1\x6f\xca\x6e\x4f\x46\x53\x23\x5f\xb5\xaa\xce\x8d\x78\x57\xea\x84\x30\x98\x8b\xde\x84\xee\xde\x45\x6f\xc2\x55\x73\x74\x6c\xe8\x55\xec\x7d\x35\x76\x15\xd9\xdf\x96\x5a\x59\x4f\xf8\xff\xb1\x16\xbc\xa1\xb6\x62\x5f\x5a\xb1\x90\x60\x54\xaa\x71\x99\x91\xd5\xb2\x6a\xcf\xb4\x8a\x27\x0e\xec\x0a\x85\x7c\x52\x65\x7f\xf4\x7a\x22\xd5\x79\xd3\x2a\x90\xd2\x65\x6d\x18\x6e\xa9\xdf\x8d\x38\x61\x06\xa8\x95\x45\xd2\x40\xc1\xc8\xcc\xc7\xa8\xbc\xa0\xac\x1b\x97\x25\x36\x80\xb8\xae\x3a\x6e\x6c\xc5\xbc\xb8\x62\xd7\xfe\x56\x26\x7e\xf4\x77\x91\x5c\x86\xd6\x63\x2b\x69\xfa\x1f\xc7\x18\x33\x0d\xf8\x7f\x3e\x16\xbc\x6b\xcc\x69\xd1\x91\xa1\x88\x94\xd3\x4a\x4d\x40\x95\xe1\xa4\x57\xb2\xc9\xf9\x8c\x19\x24\x00\xe0\x69\x98\xa1\x70\xa8\x15\x37\x3c\x30\x6e\xab\x39\x95\x74\x6e\x0c\x33\x56\x65\xde\xb0\x1c\x6e\x23\xcb\x81\xc2\x47\x3c\x1f\x5c\x17\x34\xb9\x0a\xed\x0d\x4b\xf9\xdb\xec\xb6\x74\x60\x19\x65\x4c\x6b\xab\x7d\x49\x03\x02\xd7\x8f\xcc\xda\xee\x80\xee\xd5\xb7\x89\x48\xee\x75\xa9\xa4\x10\x48\x0c\x15\x0a\x34\x25\xad\x65\x2b\x53\x64\xcf\x45\x05\xcd\x42\x74\xad\x43\x0f\xd4\x7c\x54\xa9\xb8\x80\x5a\xb6\x5b\xb8\x84\x1e\xf2\xf8\xa6\x48\x43\x57\xf8\xe3\x85\x28\x19\xfb\x74\x8d\x99\xdd\xe4\xff\xba\x14\x3c\x57\xf4\xef\xca\xba\xeb\x53\xc4\xec\xf7\xc9\xb8\x29\x9a\x75\x53\x88\x0c\xf6\x7a\x2f\xe9\xe7\x61\x32\x05\x6c\x1b\x8c\x58\x91\x28\x24\xa3\xaf\x4b\x2d\xdc\x30\x40\xb7\xd8\xda\xdd\x3c\x50\x31\xe7\x10\xea\x9f\x45\xa2\x98\x46\x1c\xcd\x80\xdf\xa3\x8a\x6c\xea\x29\x22\xbd\x1d\xa6\xa9\xe9\x2e\x66\x92\x58\x1d\x0c\xd3\x08\xba\x40\xca\x5c\xdd\x01\xf0\x83\x99\x15\x69\x99\x0f\x9c\x74\xb1\xdd\xcc\xe7\x6f\x79\x0c\x39\x96\xff\x11\x2f\x78\xb1\xb7\x02\x7f\x6f\x36\x8f\xc8\xa7\x95\xd9\x68\xeb\x21\xe9\x67\x1f\xd5\xe1\xfc\x91\xc7\x0c\xe3\xf5\x3f\xeb\x05\xaf\xf3\x56\xf4\xef\xcd\x86\x35\xb3\x30\xa7\x5c\x98\x3b\x1b\x9b\xfb\xc2\xa3\x3a\xc0\x7f\x9c\x60\x0d\x4b\x76\x40\x89\xd9\xa0\x0d\x67\xd1\xc9\xb8\xc8\xfb\xe0\x7b\xba\xad\x1f\xad\x89\xd2\xff\xd8\x44\xd0\x19\x71\x9d\xd0\x9e\xc9\x5c\x55\x2a\xbc\x32\x12\x18\x2f\xf0\x48\x3f\x8f\x9c\x83\xdc\x06\x70\x5e\x80\x79\xbe\x1a\x62\xd6\xcb\x22\xf7\x78\xfb\xda\x9e\x29\x74\xd7\xa6\xd0\x3d\xb3\xe4\xe5\x9b\x25\x9f\x61\x59\x25\x9f\xb6\x4b\x88\x42\xf6\xa3\x1e\x1b\x97\x47\xa6\xff\xd2\xad\xa2\x7f\xb6\xdf\x8e\x00\x8f\x36\xb3\x54\x05\x42\x46\xcf\x14\x9c\x3a\xaa\x12\x72\xae\xae\x8f\x68\xa5\xc9\x7e\xc4\xd3\xe8\xd7\x3f\xc8\x66\x76\xd3\x21\x3c\xb2\x6e\x3c\x03\x0e\x38\xd1\x42\x17\x95\xd6\x81\x5d\x1c\xed\x51\x5d\xd9\x79\xfc\x19\x19\x4c\xb1\x4f\xda\x4a\x3a\xa2\xcd\x91\x01\xb1\x3f\x5c\x67\x27\xec\xf0\xa5\x08\x52\xdb\xb3\x14\xd3\x98\x73\x15\xc6\x44\x98\xc7\x61\x12\x47\x90\x9c\xf2\x2c\xb1\xda\xc9\xb2\xf3\xfe\xc7\x9f\x12\xac\x0c\x5d\xb5\x61\x24\x52\xae\x9b\xe4\x1b\x74\x5b\x29\x43\xce\xf9\x6c\x12\xef\x21\x50\x48\x25\x1a\x96\x59\xf3\xa2\x37\x2e\x65\xa9\x8b\xde\x55\xb8\x5d\x10\xc7\xdd\xf5\x0f\x5d\xc7\xfe\x62\x1f\xbb\x06\x7f\x6a\xe3\xe7\xff\xbd\x6f\xf3\xb4\x85\x9d\x1a\xe8\x82\x1f\xdb\x77\xd6\x69\x95\x47\xa2\x15\x47\xae\xd6\xa0\x4a\xb6\xaa\x01\xea\x44\x21\x72\xdd\x11\x9b\xe8\x84\x85\x39\x1e\x11\x28\xb9\xc9\xdd\x3e\x83\x61\x4e\xa7\xd3\xa9\xac\x95\x55\x4a\x92\xe2\x59\x12\x61\x6f\xd0\x30\x2c\x36\xe8\x17\x86\xe3\x28\x58\x69\xdb\x31\x4b\x5d\xd2\x85\x5e\x5b\x59\x5a\xc4\x91\x20\x64\x37\x94\x66\x8d\x94\x4d\x1d\xb5\x75\xb0\x42\x83\x75\x90\x91\x96\x9e\x99\x34\x7d\x51\x35\xb6\xa5\xe4\x97\xb5\x09\x14\x0d\x5d\xc8\xba\x87\x95\x67\x22\xa8\x46\x05\x89\x4b\xd6\x71\x49\x27\xa2\xce\xfe\xc1\x39\xe2\x93\x49\x7c\x5e\xf0\x90\x9f\x14\xbd\x24\x1b\x74\x45\x5a\x2e\x66\x49\xb2\x1a\xb6\xce\xc3\xfb\x92\xd6\x17\xf2\xec\xc2\x00\xeb\x65\x28\xae\x3c\xa5\x54\xae\x11\x43\x6e\xf2\x73\xa4\x9f\xd1\xa7\xb5\x29\xd8\x86\x4c\x50\xcb\x89\x71\x27\x8d\x38\xad\x6b\xd5\x4e\xa4\x60\xe9\x23\x3e\x5f\x9c\x8f\x7b\x18\x1e\x36\x44\xeb\xab\x06\x3a\x0c\x0f\x4a\x5c\xf5\x93\x2e\x80\x23\x6a\x64\x0e\xe1\x69\x08\x6d\x5a\x0b\xa8\x4f\x0c\xc1\x57\x4d\xf6\x37\xe3\xca\xdf\xff\x67\xe3\xc1\xcb\xc7\x01\x34\xc1\xda\x74\x1b\x72\x1e\xad\xed\x24\xbb\x43\xaa\x19\xee\xb7\x69\x4b\x02\x2f\x9c\xa1\xb6\xc2\x5c\x50\x4d\x02\xca\xfa\x1a\xbe\x01\x2b\xa6\x5a\x97\x73\x15\x1b\x8a\xb9\x37\x4c\x07\xf7\xf2\x45\x88\xf8\xb9\x33\xdb\x90\x9d\x06\x5b\x52\x96\x47\xb8\x55\x7a\x39\x44\x93\x71\xc3\x34\x66\xd4\x9c\x11\xf7\x40\x6e\x70\xa6\x5f\x6e\x72\x17\x4e\xd2\x5e\xdf\xcc\xa9\x8a\xb4\x01\xfd\x56\x72\x56\x61\x62\x32\xe8\x04\x95\x72\xc7\x3a\x50\x00\xbc\xad\x02\x40\x54\x35\x8f\x64\x20\x05\x33\xaa\xc3\x01\xa9\x8d\x00\x3b\x5f\xdf\x45\x2f\x21\x7d\x52\x0e\x5f\x55\x8d\xce\x6c\x4e\xa8\x0f\x7a\xa9\xfc\x0d\xf1\x4f\xa7\x50\x85\xf3\x9d\x91\x0f\x8c\x72\xd9\x9e\x61\xcf\x60\x73\x9b\x07\xa9\x6e\xc9\xe5\xe5\xea\x3d\x2b\x2e\x3b\x67\x35\x05\xb1\x9f\xaa\xb1\x6b\xca\xb8\x2b\xb2\x7e\xa9\x60\x59\x5f\x51\x53\xe6\xc6\xbf\xf3\x96\x9d\x5b\x55\xd8\x75\xbc\x69\xc2\x5f\x88\xa4\x9a\x7c\x06\x60\xd1\xed\x67\xa0\xba\x08\xc6\x57\x58\x94\x97\x24\x3a\xd6\x02\x63\x79\xb4\xed\x44\xaa\x0c\xe6\x7e\x3b\x8c\x13\x37\x49\x53\x5e\xe9\xe7\x82\x0e\x47\xc2\x1b\xa2\x6f\xa1\x94\xa7\x14\x8b\x55\x51\x6e\x08\x91\xf2\xc3\x08\x52\x77\x88\x17\x38\x18\x67\xab\x5a\x97\x1d\x63\xe8\x2f\x8c\xb3\x6f\xd3\x73\x8a\x71\xd8\x24\x8c\x17\xfe\x1b\xc6\x83\x7f\x1c\x9b\x19\x7d\x53\x69\x0b\x39\x72\x27\x5d\xbc\x53\x9b\x83\x57\x2a\x2f\xae\xa8\x13\x1c\xa7\x56\x9d\xb7\xe2\x42\x8f\xfc\x68\x0b\x73\x54\x88\x18\x67\xa4\xcc\x07\xba\xf6\x0a\x24\xfe\xd1\xeb\x36\x88\x8f\xca\x16\xd5\x95\x7d\x31\x1a\x28\xa5\x38\x3d\x4b\x8b\xb0\x71\x35\x1d\x4c\x1d\x27\x9b\xdf\xf4\xa1\x8e\xfe\x52\xab\x6c\x3c\xac\x90\x26\x04\xa5\x6e\xcc\xb5\x79\xa8\x2b\x96\x46\x66\xe1\x1d\x2a\xb7\x8c\x46\x04\x3b\xa5\x7b\x25\x57\x4c\x5b\x60\x34\x74\x73\x3a\x30\x4f\x40\x21\x12\xc5\x6c\x65\x07\x97\xa8\x83\x50\x07\xaa\x72\x56\x5a\x5d\x95\x2d\x43\xb5\x62\xad\xcf\x8d\xa2\x2a\x8b\x42\x56\xee\x3e\x48\xdb\xe8\xe0\x3d\x2b\x5b\xc5\xe9\xbe\xd5\x63\x8e\x38\xe3\xff\xa8\xc7\x9e\x7e\x99\x1b\x56\x71\x05\xab\xb9\xe0\x69\xf6\x2f\xad\x12\x76\xb2\x0d\xaa\x62\x24\x75\x03\xb0\x6c\x6b\xab\x3a\xee\x49\xa5\x50\xb3\x37\xed\x27\x6f\x24\xda\xa5\xfd\x97\xef\x0f\xfe\xbf\x2b\xac\x0b\x6e\x9b\x1d\xc1\x03\x38\x91\x02\x0d\x95\xa5\x34\x5a\x92\x31\xaa\x29\xdc\x50\x60\x01\xd7\x51\xb9\x08\x05\x0f\x20\x21\x01\x4b\x56\x9e\xd2\xfe\xc9\xa0\xc9\x58\x03\x73\x15\x4e\x0c\x19\xe0\xd4\x81\x1d\x97\x5c\x50\x36\x83\x31\x9f\x1b\x7a\xc5\x20\x54\xc7\xd6\x04\x26\x29\x25\x51\x14\x4a\x15\xef\x66\x11\xbe\xb1\x1e\x87\x52\x0a\x2d\xa6\xd7\x0f\xd7\xd5\x1f\x30\xdf\x28\x4b\x99\xb0\x01\x73\x7d\xb5\x5f\xea\x69\xc0\x7e\x21\x31\x46\xdc\x98\x4b\x4e\xdc\x1d\xc8\xc6\x82\x7b\x64\xa3\x4a\x87\x97\x57\xd7\x0f\xcb\x6b\xfa\x58\x3e\xc1\xef\x0e\xac\xee\x05\xf7\xac\xd4\x6d\xb3\x63\xe6\x74\x89\xc3\xb8\xaa\x1d\x22\x89\x90\xce\xc0\x11\x52\x21\xce\xab\x9e\xe7\xe1\xc9\x8d\xdb\x6a\x3e\x1c\x67\x44\x82\x1b\x35\x4e\x31\xb6\xb0\x0e\x11\xe2\x38\x61\x58\xe8\xc6\xd8\x72\x64\xcf\x68\x1b\x3e\xe2\xd3\x2f\xaf\x7f\xf3\x4d\xff\xaa\x50\x06\x14\xb2\xf0\xe0\x8b\xd0\xdb\xd1\x6b\x62\x43\xca\xd2\x8e\x70\xa2\x3d\xc7\xd8\x95\x52\xa0\x3d\xd5\x6e\x4b\xae\xef\x7f\x62\x2c\xf8\xe5\xb1\x25\x73\x01\x65\x20\x4b\x41\xb1\x0e\x5d\xd0\x41\xe4\xcb\x5c\xe0\xc3\x4d\x3e\xd3\x6a\x89\x1e\xd6\x29\x31\x3b\xf1\x84\xaa\xde\x54\xe7\xf3\x59\x2a\xea\x7c\x29\xeb\x0a\xfc\xfb\x6c\x7a\x32\x1f\x2c\xf6\x53\xae\x65\x1d\x60\x21\x76\xa3\x58\xf0\xc7\x2e\x36\x23\x05\xb0\xb4\x15\x27\x31\x31\x73\x80\x64\xa9\xf3\x02\x32\x2d\x42\x2b\xdf\x7d\x80\xe2\xda\xf3\x74\x41\x99\x90\x50\x20\x78\x51\x8a\x9e\x3a\xb7\x8c\x24\xd5\xea\x80\x5f\x83\x34\x4a\xa7\x13\x50\x37\x00\x90\x20\x52\xa1\x81\xac\xfb\x69\x94\xa5\xc2\x41\x0a\x20\xfe\x17\xe1\xa8\x42\x95\x86\xa3\x65\x0e\x00\x94\xd1\x5d\x42\xdd\x60\xa0\xb7\x8a\x39\x34\x68\x12\xd4\x2a\xdc\x72\x8b\x9a\x43\x49\x1e\x72\xfe\x5c\xb0\x60\x55\x1e\xab\x52\xcf\xea\x6a\x3a\x5d\x88\xed\xfe\x94\x17\xbc\xc6\xbb\xdd\xbe\xe4\x30\x5e\xc7\xa4\x26\xf2\x3c\xcb\x2d\x53\x93\x99\x25\x6d\x74\x92\x4c\x16\x0b\x31\x45\xbc\x61\x4e\x52\xc3\x81\xe7\x30\x58\x3a\xcb\xb9\xfc\xa8\xdb\x63\xbc\xe7\x22\xca\x7b\x0c\x94\x73\xff\x8f\xbc\xe0\xb3\xde\x72\x25\x20\x7e\x48\x1d\x6a\x22\x66\xb5\xa9\x80\x54\xc1\x6a\xa9\x73\xd1\x5c\x6b\xd6\x79\xdc\x0d\xd7\x04\x1d\xaf\x4e\x68\x03\xc4\xa3\xcb\x83\xc2\x7a\x22\x18\x15\x8b\xef\xe8\xbd\x4e\x13\xa3\x9e\xce\xf2\xb5\x30\x55\x49\x5b\xa3\x31\xe3\xbe\x3c\xc1\x1e\xaf\x5d\x3a\xda\xc4\xf0\xf1\x89\x87\xc1\xc4\xf0\xa2\x89\xf9\x6a\xc3\x3b\xb1\x32\x80\x6e\xa0\x14\x58\x2d\xf6\x9a\x5d\x6f\xc5\x51\x68\x27\xd3\xd6\x1a\xfe\x9c\x63\xae\x20\x9c\x0d\xb0\x8c\xea\x96\xea\x26\xf6\x01\x22\xf6\x0b\x29\xb8\xb5\xb3\xbc\x8b\x5f\x27\x91\x4e\xc7\x17\x2a\x7d\xb7\xd2\x72\xa1\x0f\x0a\xa5\xbc\x15\xad\xac\x67\x05\xb9\xd4\x31\xbd\x4a\x0a\xb2\x52\xb9\x2e\x2a\x1c\xd2\x39\x48\x36\x9b\x1a\x1d\x53\x4c\xc1\x4b\x66\x36\xc8\x30\x50\x8d\x2d\x08\xf2\x7e\x0a\xa8\xa2\x01\x14\x7e\x38\x84\x72\xc8\xe1\xe0\x26\x8e\xe8\xfc\x31\x95\xab\xb2\x27\x8d\x87\x05\xc1\x87\x14\x27\x78\x30\x44\x20\xc1\x09\xfe\x03\x8c\xf3\xa0\x1a\x50\x15\x9c\xe0\x77\x33\xce\x39\xdc\x95\xff\x41\x30\xd5\x09\xab\x0b\x75\x75\x43\xc5\x56\xc9\xbb\xf3\x59\x39\x97\x9a\x5b\xb8\x6f\x75\x5b\x70\xed\x90\xbe\xcd\x65\xdf\xe9\xef\x7b\xe0\xff\x2f\x64\xf2\xaf\x17\x32\x06\x98\xf9\x45\x29\xc2\xc8\xa9\x3b\x00\x87\xe6\xa5\xcf\xe5\xa8\x18\x8d\x40\xa4\xeb\x71\x9e\xa5\x92\xff\xe3\x74\xf6\xf2\x2c\xc2\x19\x2d\xca\x70\x2d\x4e\xd7\x82\x9b\x1e\xbd\x69\xb5\x7b\x33\x72\x66\xb7\x9b\x56\xe8\xbd\x35\xb3\x6a\x0c\xa3\xe7\x77\x49\x88\x87\x01\x8c\x9a\xcc\x5f\x6d\x95\x27\x42\x14\x5f\x0c\x47\x30\x16\x46\x6a\xb8\x4c\x93\xd2\x0f\x4f\x54\x50\xe9\x20\x6b\x41\x67\xb1\x9e\x16\x61\x81\xb0\x08\x5f\x3e\x10\x7c\x8f\xfe\xe5\xba\xfe\xe0\xf2\xd6\x81\xfc\x1f\xda\xf3\x5e\xed\xda\x7b\x95\xa8\x40\xfe\xd6\xa5\x06\xf2\x6f\x5d\xf4\x6b\xe4\x9a\xef\xf9\xca\xf6\x42\xf8\x55\x08\xff\xea\xf6\x1e\xa9\xa7\xf9\xb7\x34\x46\x03\x96\x3b\xd4\x55\x09\xe9\xd7\xfc\x84\xb1\x9f\x9b\x60\xdf\xb9\x69\x55\x0c\x60\x40\xaf\x98\x08\xbe\xdb\xfc\x74\x69\x1f\xaf\x8f\x66\x3d\xff\xbc\xc7\x7a\x76\xcd\x7a\x1e\xd4\xe5\x1a\x7e\xda\x0b\xda\xa3\x98\x8f\x5d\x5b\x7a\x74\x27\xb7\x3a\x0f\x1d\x93\xdf\x34\x36\x66\x33\xb0\xa7\xb0\x29\x76\x70\x87\x25\x54\xf6\x38\xd7\x5e\x11\x06\xbb\x08\xc3\xe2\xf6\xdc\x6b\xda\x6f\x8c\x42\xf2\x35\xdc\xa6\x9a\x6a\xf4\xba\x09\xf6\x24\x3b\x15\x2e\x8b\x30\xbb\xa0\x9f\x96\x71\x57\x40\xda\x2e\xf0\xac\x3f\x3f\x10\x1c\xad\x5e\xac\x80\x90\x59\x77\xb7\x16\xa1\x3e\xb8\xc7\xc7\x76\xcd\xc7\xce\x2b\x36\xb6\x7a\xa9\x22\xd4\x61\x36\xcd\x1a\x9b\xe7\x42\x8e\x20\x80\x3d\x3e\xb4\x27\x41\x29\x09\x2a\xdc\x9e\x07\xdd\xea\xdf\x6c\x92\x20\x25\x39\x55\xe1\xed\x2a\x6c\xa4\xca\x92\xde\x76\x45\x15\x50\x2a\x2b\x5a\x21\x14\x46\x5c\x3f\x82\xfe\xa2\x53\x17\x70\x97\x9e\x11\x65\x1e\xb7\x28\xfb\xe9\x1b\xfb\x82\x74\xd4\x8d\x4a\xa5\x77\x95\xce\xa3\xeb\x63\x6a\x10\x8d\x2e\xbc\x34\xd2\xb0\x12\xa6\x03\xfe\x0c\x3d\x6a\xc5\x65\x2e\x7a\x0c\xdf\x99\xa7\xe8\x1e\x6c\x1a\xd0\x42\x1d\x8e\xf7\x5b\xe3\xec\x35\x1e\x73\xee\xfb\x3f\xb8\xab\xa4\xa0\xe0\x69\x76\x63\xd5\x54\x25\x3d\x36\x30\x75\xe1\xb0\x26\x43\xb9\x65\xef\xa3\xf7\xa7\x58\xc4\xac\xce\xfb\x77\x05\x73\xe6\x57\xd5\xc0\x18\xaa\x36\xc0\x23\xd6\xc6\x3a\x6d\x6a\x51\x78\x9c\xaa\xdb\x84\x79\x6e\x93\xff\x03\x1e\xbb\x06\xef\x6a\x8b\xe3\x1b\xbc\x87\xc1\xe2\xb8\xe0\x36\x6a\xbb\xeb\xe2\x48\x52\x2e\xe4\x39\x90\xf7\xac\x05\x2e\x73\x05\xc0\x23\x17\x14\x22\x2d\x10\xf0\x03\x1b\x6a\xb2\x77\x79\xec\x09\x34\x7f\x33\xeb\x22\x0f\xd7\x10\xf5\xd5\x7f\xdd\xa5\xec\xd9\x11\x0b\xf5\xcc\x11\x8d\x6e\xba\x5e\x34\x91\x21\x3e\x1b\x51\x5a\x2b\x4d\x36\x14\x0d\x8e\x8a\x26\xfb\xeb\x6b\xd9\x53\xb6\xdc\x21\x47\x9a\xce\xce\xf8\xf0\xb5\xc1\xad\xce\x8e\x70\x11\x7a\x92\xb0\x28\x1b\xb9\x08\x23\x8a\x3d\xc1\xda\xb7\x98\x89\x49\xb3\x73\xd1\x1b\x97\xfc\xcd\x21\xea\xaf\x3f\x8e\x7d\x6a\x8c\x3d\x9e\x32\x13\x44\xae\xd2\x80\xfc\xf7\x8f\x6d\xe5\x08\x1e\xd1\xd9\xd9\x6a\x13\x76\x67\x83\xaf\xd7\xf4\x27\xec\x6c\xa2\xb6\x3c\x35\x20\xde\xd8\x40\x9c\x10\xa5\x17\xfd\x56\x07\x01\x9c\xb3\x42\xb8\x2e\x7f\x83\xbf\x9d\xaa\x34\xc5\x29\xe3\x5c\xb7\xb6\x38\x4d\x11\x56\xd7\xa1\xc9\x30\xfd\x88\x53\x4c\x6c\xec\x65\x1a\x82\x59\xad\x25\xac\x94\xca\xe8\x40\x88\xe7\xd9\x85\x73\x50\x73\x47\x74\xb3\x7c\x30\xd5\xe4\x4b\xb2\x7f\xd8\x59\xf4\x59\xac\xf6\xe3\x04\x23\xcc\xec\x3e\xa0\xf4\x01\x71\x64\x30\x86\x30\xe1\x6a\xcf\x65\x3d\x1d\x18\x55\x66\x3d\xdc\xe9\x72\xac\xe1\x7a\x18\x27\xe0\x09\x2b\x33\x9e\x66\x79\x37\x4c\x20\x6b\x4f\xf6\x53\x7d\x10\x4b\x06\x81\x89\x53\x92\x53\xc0\x89\x62\xd9\xdf\xd7\xd8\x01\x41\x0c\xd4\xff\x46\x6d\x8b\xf0\xd1\x51\x8b\x38\x8a\xf5\x06\x6f\xaf\xa9\x06\x9d\x15\x73\x19\xae\xc2\x29\xdb\x39\xe3\x85\x42\x0e\x58\x29\xc8\xe6\x44\x26\x6a\xd1\x02\x02\x23\xaf\x3d\x08\x14\xad\xac\xdb\xcb\x52\xf0\xd6\xe6\xfd\x14\x10\x7b\xb2\x7e\x09\x3e\xb7\xac\xad\x2d\xf9\x93\x6d\x63\x9c\xe7\x89\x48\xd7\xca\x8e\xbc\x7d\x5f\x5f\xf4\x21\xc1\xb3\x95\x64\x7d\x39\x9d\x45\x01\x16\x54\x55\x63\x00\xe2\x05\x9f\xb9\xb0\x84\x9f\x72\x10\x9d\x36\xff\xd8\x54\x93\x7d\xc4\x53\x7b\xca\xff\xc0\x36\x10\x82\x43\x93\xae\x23\x91\xcd\x94\x97\x5a\xc8\x32\xf3\x4d\x13\x3d\x8a\xa6\xcf\x57\x27\xd7\x19\x7e\x9d\x77\xe2\xb2\x68\x48\x12\xc2\xb8\x21\xf2\xd9\x68\x98\x1a\x0c\x54\x6c\xb2\x37\xd6\xd8\xb8\xa4\x26\xff\xd5\xb5\xcd\x43\xaa\x47\x0e\x61\x21\x8b\x0a\x67\x00\x9f\xf4\xa0\x22\xd6\xd6\xfd\xdf\xd9\xee\x73\x46\x02\x45\x65\x43\xc8\x4b\x28\x1a\xbd\x3c\x6b\x89\xa2\x10\x91\x35\xb6\x29\xc8\xce\xd1\x4e\x64\xed\x3d\x55\xcc\xb8\xcc\xd6\x04\xa5\xc7\x81\x53\x76\x55\x20\x64\x5c\xb7\x17\xe6\xa6\x38\x04\x7d\x1b\xd1\x15\xd8\x9b\xc7\xd8\x01\xc5\x9f\xfc\x57\x8f\x5d\xe2\x9e\x1a\xc9\x0f\x3f\x5e\x7b\x4c\xb8\xe0\xbf\x3e\x7e\xf7\xce\x1a\x83\x53\xcd\xff\xa9\x5a\xf0\x9a\x9a\x2a\xcd\x07\x6b\x48\x25\xae\x95\x5c\xa3\x32\xbd\x54\xf5\xf2\x55\xa1\x40\xe0\x82\xa1\xb3\x2b\xa8\xf3\x40\xf1\x42\xf9\x37\x6e\x51\xf9\xd7\x02\x7c\x3d\xcb\x79\x60\x3d\x0b\xd3\x5a\xc1\x7d\x0c\x8d\x7b\xd2\x41\xf9\x57\xdc\x6f\x3e\x2b\xc5\x89\x51\x9f\xd6\xf5\x05\xcd\xbc\xa0\x43\x95\x82\x09\xb1\x8e\x4e\x63\x4d\x9e\xf2\x77\x2e\xcc\xe8\x06\xce\xd0\x54\xc5\x05\x17\xa9\x7c\x2d\xb2\x65\xb8\xbf\xd9\xef\xd8\x08\x94\x91\xea\xf6\x44\x5c\x70\xca\xfd\x7c\x7c\x7f\xd0\x31\x17\x1d\xe4\x11\xbe\x26\x52\x21\xa7\x72\x5d\xdd\xd3\x6a\x61\x48\x35\x0a\xb2\xf5\x18\xf5\xfc\x69\x5d\x18\x88\x8a\xdb\xa5\x5c\x5c\x10\xaa\x78\x05\x06\xb6\x36\x2f\x7a\x57\x44\x79\xbc\x2e\x72\x47\x24\xf9\xe8\x15\xec\xa3\x9e\x2e\x06\xf4\x21\x2f\xf8\xb9\x2d\x8a\x01\x3d\x6a\xb5\x7d\xac\xe6\x23\xd1\x13\x72\x91\xb3\x94\x5b\x33\x85\x30\xb7\x8e\xdc\x7c\x96\xed\x27\x9a\xf7\x4f\x06\x07\xcf\x12\x68\xe0\x09\xae\x70\x42\xbb\x5d\xcc\x38\xa0\x74\x03\x40\x19\xdd\x0a\x6b\x82\xbd\xd8\xb3\x8a\x46\xaf\x07\x1d\xd3\xe4\x50\xfd\x67\x3e\x69\x6a\xda\x43\x49\x8a\xdd\x94\x97\x76\xf2\x73\x7f\xa7\x66\x17\x93\xfe\x58\x8d\x5d\xbf\xad\x29\x14\xea\x47\xe1\x1e\x32\x25\xa5\x5f\x55\x33\xdd\xd7\xe5\xa6\x79\x4c\x87\x06\x80\xf7\xa9\x12\x12\xb6\x39\x57\x09\x70\x78\x68\xa7\x45\x5c\xc6\xeb\x0e\x78\x1d\xc4\x77\x87\x85\x36\x0a\x21\xb1\xd1\xfa\x14\x94\xde\x6a\x67\xb6\xca\x99\x4f\xb3\xca\x57\x62\x07\x90\x8f\x02\x07\x46\x76\xa4\x40\xb7\x28\xd4\x9e\x96\x0c\x05\x1f\x42\x9c\x3a\xfc\x1b\xf9\x25\x44\x15\x47\x9b\xf4\x8a\x9d\x65\xb4\x17\xfc\x53\xc1\x0d\x27\xe1\xaf\x51\x21\x22\xf8\x8c\x8e\xa6\x55\x31\xac\xb8\x23\x1d\xe2\x7b\xe7\x18\x7b\xda\x36\x40\x04\x0b\x79\x9c\xe5\x71\x39\x38\x2d\xd6\x45\xe2\x44\x73\x93\xce\xf1\x95\x5a\x70\xd7\x76\x0f\x55\x4b\x3e\xe9\x23\xc5\xa8\x21\x01\x1d\x55\x8d\x1e\xb5\x15\xb8\xd8\x24\x0f\x79\xec\x1f\x3d\xc6\xe4\xf1\x8d\x34\xe4\xff\xb9\x17\xdc\xb0\x62\x7e\xaf\x54\x75\x2d\xdd\xf8\xc8\xa6\x8d\x9d\x6c\x99\x2d\xb2\x85\x4d\xc9\xf3\xd2\xe6\x64\x56\x75\xe7\x21\xef\x20\xfb\x8e\xe1\x54\xce\x6e\xd8\x6b\x9c\x17\x83\xc2\x9f\xf0\xf7\x37\x80\x07\xb1\x6d\x92\x3e\xbb\x61\x8f\xb1\x57\x5f\xc9\xbe\x67\xb8\xae\x43\x73\x16\x45\xcb\xc5\x2c\x11\xb7\xc5\x00\x31\xe1\x7f\x95\x05\x6f\xf3\x86\xaf\x9b\xfd\x22\x79\xb4\x75\xbf\xae\x41\x90\x35\xb6\x6e\x89\xe7\x5f\x2b\x4c\xad\x5d\xe6\xbc\xa4\x8e\x29\x92\xee\xad\x88\x1b\x40\xc2\x8c\x22\x88\xbd\x70\xf6\xdb\x7a\x1c\x72\xc2\x00\x6f\x5e\xf4\xf6\xe7\x59\x22\x16\x45\xdb\x59\xe1\x5f\xdc\x2b\x52\xbe\x97\x2e\xfa\x18\x1a\x70\x3b\x96\xfd\xf6\x39\xbb\x4c\x17\xdd\xba\x4c\xce\x47\x3c\xa6\x76\x80\xff\x4b\x1e\x9b\xdc\xae\x80\x0b\xd4\x6e\x59\x14\xed\xe0\x15\x1e\xfd\x65\xca\xac\x5d\xe2\x16\xd5\xc7\x94\xd5\x90\xce\x3c\x2a\xb2\x64\x5d\x15\x17\x9b\x31\xf0\xe1\x90\x78\x92\x8b\xb2\x9f\x83\x4a\x08\xb1\x9b\x4d\xf6\x52\x8f\x1d\xa0\x6c\x83\xc2\xbf\x10\xdc\x42\xbb\xbb\xe0\x9d\x2c\x89\x0a\x9b\xe1\xd0\x56\x52\x61\x59\x90\x4f\x29\xbb\x68\x25\x4e\xda\xfc\xb8\xce\xae\xdb\xc1\x94\xd0\xe7\x1e\xf2\xee\xdb\xde\x50\x3d\xef\x9f\xbe\x84\xaa\x2c\xc3\xdc\xb3\x6a\xb8\xfe\x17\xe6\x78\xfe\x55\x97\x2c\xac\x9e\x3f\x60\xc1\xdb\x3d\x0b\x26\x07\xe7\xc4\x11\x40\x00\xaf\xc5\x2e\x62\x8e\x21\xb3\x79\x5f\x31\x65\x9d\x27\x32\x0a\xf5\x1c\xd3\xdb\x24\x97\x2d\xa9\x84\xa2\x35\x9d\x52\xf5\xc0\xf8\x29\x13\xfc\x36\xe2\x31\x0d\x56\xe3\xb0\xe1\x9f\x9e\x60\x7f\xe7\x80\x28\x7c\xcd\x0b\x3e\xe1\xcd\x2c\xcc\xb9\x90\xef\xb6\xc0\xa1\x6e\x52\x5a\xa4\x41\x3c\x11\x36\x40\x9f\x03\x62\x6b\x23\x28\xe4\x96\xd2\x5a\x07\x43\x10\x2a\xef\x8a\x6b\x58\xe9\xa5\x56\xa6\x8f\x48\xfb\x5d\x29\xa7\x5b\xa1\x98\x00\xc1\x2e\xdf\x37\x31\xfd\x5a\xb7\xa7\xda\x80\x5b\xe4\xb9\x7c\x78\x8c\x3d\xce\x2a\xf8\x70\x6e\xf1\x74\xe1\xbf\x6b\x2c\x78\xd5\xd8\xbc\x7b\x91\x38\x2a\xc2\xa1\x41\x99\xcc\x30\xe1\xfd\x3c\x21\x88\x97\x10\xc1\xcf\xe9\x84\xc1\xd2\x70\x58\xff\x40\xf2\x3e\x7e\x1d\xe1\x6c\x61\x7f\x2c\xc0\x94\xd0\x94\x84\xac\xf3\x76\x2c\x0f\x1b\x3b\x8e\x1c\x6a\x7c\x22\xdc\xbf\x53\x08\x02\x7a\xa4\x2a\x20\x1a\xc8\x9e\x7a\x15\x88\x47\x95\x64\x8c\x5b\xa0\x2d\x4a\xa9\xd0\x22\x74\x6b\xbf\x52\xe2\x61\x38\x62\x1f\x34\x39\xe6\x6f\x4a\xe6\xa3\x2a\x89\x52\x95\x47\x98\x72\x0b\x66\x45\xd9\x24\x48\x13\x87\x58\x4a\x94\x73\xb1\x06\x60\x75\x0c\x54\xf3\xd3\xbc\x27\x19\x77\x30\x55\xe7\x5a\x3e\x59\xcd\xca\xce\x56\xcb\xf7\x2e\x8f\x5d\xad\x5a\x84\x20\x65\xff\x27\xbc\xe0\xf9\x8b\xf6\x15\x95\xc4\xa6\x90\xd9\x37\xe4\x31\xa1\x5d\xa9\x30\x79\x04\xd3\x33\x62\xb3\x70\x83\x13\x29\xd7\xbe\x2b\x42\x05\xea\x63\x82\x13\xe1\x03\xdb\x53\xda\xcb\x3c\x1b\xc3\x66\x10\xdc\xb3\x68\x08\xd8\x76\xee\xda\x89\xaf\xba\x6e\xba\xdd\x23\x5d\x9d\x23\x71\x2a\xef\x3a\x88\x32\x5b\x75\xe4\x7d\x1a\xfc\xe5\x41\x2f\xf8\x51\xef\x2e\x80\x6c\x71\xba\x80\x97\x90\xb0\xf5\x52\x9f\x3e\x4d\x2a\x21\x7e\x42\x8a\x19\x68\x61\xd2\x85\x41\x16\x09\x5a\x09\x94\x56\x65\x4d\x37\xa9\x78\x98\xe2\x04\x8d\x8f\xe8\x3a\x9c\xcc\x5b\x75\xfb\x4f\xae\x61\x4f\xdd\xa2\x90\x09\x0a\xe9\xa3\x4b\xb5\xfb\x3f\x73\x4d\xf0\x23\xfb\x46\xdf\x33\x2c\xc5\x41\x3c\x24\x4b\xa2\xa3\x5b\xc0\x16\x97\xdb\x80\x42\xca\x8d\xaf\xc9\x3a\x69\x11\x2c\x52\x1e\x9b\x56\xc6\xa4\x6a\x8d\x94\x4b\x48\x36\x83\xcc\x5e\x32\x19\x80\x11\x8c\xa0\xb9\x41\xe0\x3a\x58\x70\x67\x80\xbc\x9b\x45\x4a\xd2\x4e\x07\x2a\x93\x42\x5c\xe8\x89\x3c\xc6\xfd\x1b\xf5\x73\x25\xd9\x51\x82\x3e\xe4\x0a\x6c\x32\x68\x93\xe1\x00\x7e\xb5\xd5\x01\x3f\x37\x07\x87\x48\xd1\xc9\x36\xa6\x3b\x71\x24\x54\x9f\xc1\xee\x5d\x66\xfc\xbe\x7e\xdc\x3a\x9f\x0c\x78\x22\x20\xc1\x5a\x25\x98\xf3\x5c\x84\x85\x5d\xc4\x25\xce\xe5\xf4\x50\x5e\x45\x01\xb6\x7c\xfa\xd8\xfc\xd9\x65\x7e\x9b\xf9\xa0\x76\x1d\xa0\xf1\x04\xbe\x0e\x4a\x6c\x65\xe4\x91\x68\xc5\x94\x47\xa9\xb6\x44\x18\x17\x58\x17\xa4\x0d\x8d\x45\xa2\xd7\x2f\x07\x75\xde\x0a\x5b\x90\x33\xda\x16\x65\xdc\x15\xd3\xb9\x58\xcf\x5a\x84\x5a\x2f\x27\x0e\xcc\x70\xad\x32\x25\x90\xf2\x96\xc8\x65\xff\x46\xd4\x28\xc2\xc7\xc1\x34\x61\x5f\x06\x86\x5b\x2a\x7c\xbf\x56\xc9\x37\xc2\x01\x41\xe8\xa0\x1b\x6f\x64\xa7\xad\xa4\x4e\x02\xf7\xbd\xe8\x01\xa6\x88\x73\xfe\xbe\x6a\x4f\x0d\xda\x53\x83\xfe\xb5\xa0\xe6\xbc\x56\xa1\xe6\xbc\xcc\xdb\x2a\xc9\xff\x12\x18\x38\xe0\xe7\xdc\x08\xe5\x67\x86\x85\xea\xa1\xfa\x51\xe4\xba\xd1\x38\x25\x4d\xf6\x6e\x83\x9b\xf3\x76\x8f\xdd\x71\xa9\x7d\x1a\xee\x0f\xfa\x6a\xee\x52\x21\x28\x52\xe6\x02\x14\x85\x38\x55\x46\x65\x4a\x73\x07\x58\x13\x27\x42\xa5\x72\xc0\x84\x43\xc7\x4a\xf3\x21\xaf\xbf\xbd\x7a\xb3\xe8\x2f\x68\xf5\x66\x4b\xcd\x66\xf4\x8c\x8e\x04\xdb\xf9\xc8\x95\xec\xbb\x37\xf3\x59\x1d\x6e\x2e\xb5\xc2\x44\xf8\x6f\xbd\x32\x38\x02\x7f\xb9\x1e\x00\xe5\xca\x51\x4b\xe0\x16\x03\x73\xad\x7a\x2f\x66\x7b\x7b\x75\x17\x7b\xf5\x73\x76\xcc\xd9\x47\xbd\xdd\x1a\x2d\xac\xe8\x57\x95\x7c\x47\x8d\xdf\xf4\x68\x05\x9e\x35\xe5\x98\x90\x65\x7c\xc2\x63\x87\x77\xe6\x44\x25\x82\x04\xd6\xf0\xe3\x9e\x7d\x3c\x56\xa1\xb4\xc0\x87\xf9\x88\xaf\x96\xec\x7e\x23\x4c\xa3\x06\x32\x9a\x26\xfb\x7d\xc3\x74\x7e\xdb\x63\x47\x2f\x6d\x54\xc8\x60\xde\xe4\xd9\x76\x6d\x83\xc8\xf5\xd8\x8c\x08\xdc\x41\x0d\xa9\x54\xee\x15\x7d\xde\xad\xb4\xf2\x90\x77\xd7\xf6\x3c\xfe\xa8\x7f\xd8\xe6\xf1\x8a\x4a\x0c\x6b\x97\x64\x50\xb5\x53\xfd\xf9\x38\x9b\xbb\xec\xf2\x12\x4b\x18\xec\xa2\x7d\x71\xfe\xc5\xf1\xe0\xa6\xea\x45\x3a\x83\x43\xd7\x1f\x47\x4f\x35\x13\xb1\x16\xb6\x06\x34\x79\x17\xbd\x09\xad\x1b\x11\x4e\x9a\x73\x14\xfc\xca\x18\xbb\x95\x32\xb4\x8f\x07\x53\xe9\x26\x85\xcb\x28\x04\xc7\x64\x3e\xdb\xec\xf0\x0c\x33\x9f\xf0\xbf\x2f\x38\xea\xa4\x7e\xba\x59\xc6\x3b\x69\xee\xd9\x6c\xbc\x17\x96\x1d\xff\x99\xc1\x49\xb0\xbe\x54\xac\x07\xca\x6a\xc1\x43\x05\x4c\x33\x84\xcc\xb2\x4a\xa1\x64\xad\xb2\x92\xa2\xfd\x19\x8f\x8d\xf7\xb2\xbc\xf4\x3f\xe6\x29\x6c\xa2\xf7\x7a\x50\x85\xa9\xf2\x11\xea\x20\x55\x68\xda\xd9\x87\xf8\x8a\x7c\x7a\xc5\xd2\xec\x42\x2a\x07\x02\xad\xa4\x58\xbc\x70\xf2\x70\xe3\xf8\xf5\xd7\x1f\xbd\xbe\x8e\xd8\x13\x45\xbc\x2e\xa6\xdc\x24\xfa\x63\xc7\x8e\xc2\xe1\xad\x0a\xae\xb9\xf5\xd6\x5c\x5c\xa1\xcf\x8f\xb1\x59\x22\x35\x49\xc8\x8d\x70\x6d\x2d\x17\x6b\x50\xa5\xd2\x26\xb1\x0a\x28\xcc\x30\x91\xbd\x72\x6c\x57\x44\xe6\x50\xd4\xaf\xd5\xd8\x31\xa2\xa8\x7a\xf0\xdd\x9b\x95\xc2\xa3\x19\xb6\x57\x67\xd6\xa6\xa3\xe3\xc1\xd4\xfc\x4e\xe9\xc8\x6e\xe4\x37\xd4\x12\x7f\x40\x2f\xf1\xdb\xbd\xb9\xb6\x6d\xea\x04\xbb\x9e\x5c\x12\x4b\xe1\x8f\x55\xac\x44\x27\x43\x88\x76\x8d\x47\x60\x65\xcd\x6e\xb3\x32\xbb\x20\x00\x67\x51\x7f\xcd\xc5\x9a\xb5\x8a\x8f\xd2\xf2\x2d\x67\xe7\x45\x4a\xf8\x14\x50\x21\xf2\xd5\x13\xc1\x9d\xd5\x8b\xc6\x20\x4c\x12\x16\x84\x80\x40\x99\x81\x30\x0f\xbb\xa2\xa4\x62\x66\x21\x2f\xe5\x9b\x16\x94\xfa\x44\xd8\x8f\xc0\xa6\xe1\x5a\xa8\x1f\x38\xc0\xde\x38\xc6\xcc\x4d\xff\xe5\x63\xc1\x5f\xd6\x66\xd4\x4f\xad\x9c\xcb\x61\xa4\x91\x48\x23\xae\x1f\x55\xeb\x05\x5f\x6a\x02\xda\x77\x2b\xee\xc5\x54\x4b\x44\xf5\x00\x1c\x1e\x18\x5d\x5c\xb6\x41\x86\xef\x02\xbe\x00\x05\x2a\xaa\xc0\xe3\x18\xe3\x43\x4b\xab\xb8\xf7\xe8\x0f\xe1\xd1\x03\x28\x02\x1b\x71\xa1\x41\x25\xe8\x1c\x72\xfa\x83\x1d\x88\x8b\xa2\x4f\x01\xd8\xda\x62\x6e\x9a\x26\xd3\x91\xc6\xe1\x35\xcb\x22\xb4\xa1\x1c\xf2\xe0\x09\xda\x42\xbf\x48\x60\x38\xab\xfd\x12\x10\x4f\x10\x2a\xa7\x13\xaf\x75\x78\x24\xd6\x72\x81\xd4\x9c\x63\xb4\x0c\x62\x8c\x59\x71\x6e\xba\x99\xad\x2c\x73\xaf\x19\x63\xd7\xac\x66\xfd\x34\xd2\x81\x1c\xfe\x3f\xd5\xb6\xa9\x96\xec\x92\xd4\x6d\xce\xdb\x14\x06\xf2\x81\x9a\x7b\x19\x35\x04\x87\x1d\x54\xb0\x19\xf5\xa4\x6a\xfe\x08\xdd\x02\x61\x7e\xd9\xbd\x07\xa6\xf1\x55\x41\x3b\xa4\x8d\x19\xfd\x49\x96\xae\x29\x93\x3c\xbe\x49\xad\x43\x29\xd3\xa2\xc9\xe7\xcf\x2e\x9f\x3a\x01\x4d\x19\x7b\xce\xc1\x82\x13\xf1\x93\x39\x91\xb4\x0b\xf8\x0c\x01\x8c\x21\x69\xba\xc3\x21\x2f\x00\x1a\xd4\x9d\x65\x4e\xb3\xb2\xc9\x9f\x21\x44\x8f\x9f\xba\xd0\x8b\x29\xa4\x42\x61\xd7\x75\xc3\x24\xe1\x71\xdb\xe0\x22\xf4\xf2\xac\xdb\x93\x82\x91\xb2\x76\x35\xd9\x3f\x79\xec\xf1\xa2\xfa\xaa\xff\x35\x64\x49\xc7\x8f\x05\xbf\xed\x0d\x37\x1c\x3b\x25\x0d\xd0\xa0\xa8\xe5\x32\x18\x46\x5c\x0e\x4c\x41\x14\xaa\xd0\x6d\x66\x15\xa8\x37\x27\x51\x0b\xbd\x86\x7a\xbe\xe5\x06\x72\x6b\x63\x62\x6b\xfa\x13\x05\x00\x4b\x23\xa3\xc0\xa2\xc5\x65\xc6\x5b\x1d\xd1\x3a\x0f\x9f\x3b\x68\x06\x73\xd0\xc4\xcc\x81\x7a\xd9\xcb\x52\x28\x68\x63\x31\xb0\xaf\xef\x67\x37\x6c\x5a\xff\xcd\xae\x58\xb9\xa0\x39\x91\x39\x8a\x7e\x76\x7f\xf0\xc2\xff\x9f\xbd\x3f\x81\x8e\x24\xab\xee\x84\xf1\x13\x52\x2d\xaa\xd7\x0b\xdd\x01\x63\x7b\xc6\x78\x78\x13\x6d\xbb\x4a\x45\x66\xaa\x54\xd5\x1b\xd5\x4d\xd3\x6a\xa9\xaa\x5b\x50\x55\x2d\x24\x55\x35\x0d\x63\x50\x28\xe3\xa5\x32\x50\x64\x44\x12\x11\x29\x55\x82\x99\xe9\x61\x31\x86\xb1\x59\x3d\x78\x28\x0c\xc6\x36\x06\x1b\x63\x33\x98\xcd\x18\x83\x17\xdc\x36\x98\x01\xfc\xe7\xcf\x62\x1b\x9b\x61\x3c\x8c\x57\xbc\x8c\x61\xfc\xd9\xfd\x79\xf9\xce\xbb\xf7\xbe\x2d\x32\x53\x52\x95\xba\x1b\x8e\x8f\x38\x87\x2e\x65\xc4\x8b\xb7\xbf\xfb\xee\xfa\xbb\xdb\x94\x31\x94\x00\x6e\x6d\xb9\x13\x14\xd3\x0a\x1e\x44\xd5\x54\x9b\x3a\x2f\x83\xf2\x40\xce\x72\x73\x97\xd4\x2b\xc0\x22\x8d\x4b\x1e\x08\xc6\xc3\x98\xa5\x1f\x3c\xc0\x7e\xcd\xb3\x6f\xa9\xf7\x7a\xc1\xdb\xbc\xed\xef\x29\x2d\x31\xa3\x5e\xc4\x18\x7d\xaa\xd9\x6b\x29\xc9\x51\x84\x3e\x85\xd0\x33\x4a\xa5\x0a\x50\x4f\xba\xa5\x00\xb9\x6a\xf2\xb0\xeb\xa5\xb2\xc0\xf0\x4f\xc8\x9c\x14\x38\x7c\xd0\x97\x3c\xb6\x1f\x4a\xfa\x9f\xf5\x82\xdf\xf0\x20\x53\x80\xad\x4d\x88\xb5\x7c\x60\xfc\x5f\x87\xcd\x5d\x15\x94\xc5\xf5\xe0\xaa\x76\x81\x1f\x21\x8f\x3d\x30\x45\x59\x83\x69\xf0\xd3\x30\x01\xb4\x6e\xe4\x22\x89\xdb\xb6\x9a\x56\x17\xed\x6c\xb0\x29\x0a\xe5\x70\xc9\xd7\xc2\xd2\xf5\xb0\xfa\x3d\x8f\x4d\x28\x53\xaa\xff\x49\x2f\xf8\x65\x6d\x49\x75\x72\x67\x93\x97\xd6\x96\x0b\x34\xdf\xe2\xf6\xb7\x26\x87\x83\xe6\x25\x8c\xeb\x2f\xa8\x51\xd4\xaa\x28\x3f\x5e\x29\xda\x68\xcb\x28\x42\x9c\xc1\x35\xa1\xa0\xb7\xf2\xa8\xde\x0d\xf3\xb2\x8f\x39\xe2\x6a\x4e\x6b\xf9\x30\xa0\xa1\x59\xd2\xdc\xdc\x16\x34\x94\xde\xc6\x76\xaa\x1d\x3d\x96\x4a\x25\xc0\xa2\xdd\x16\x34\x86\xb1\x68\x3b\xab\xe4\x3f\xf9\xec\xdb\x86\xa5\xf0\xc9\xb3\x55\xe1\x7f\xe5\xfa\xe0\x01\x0f\xfe\x74\x0c\xee\x6d\x11\x26\x65\x5b\xd1\x16\x80\xdc\x32\x00\x41\xfa\x1e\xb5\x62\x41\x40\xc1\x5f\x8a\xbc\x13\xa7\x42\x83\x17\xc5\xc8\xb2\x27\xf1\x06\x40\x51\xe5\x22\x8c\xc0\x14\x90\x8b\xa6\x90\xcf\x28\x0b\xad\xab\xf6\xfa\xcc\x75\xec\x35\x1e\xdb\x27\x2e\x8a\xa6\xff\xfd\x1e\x7b\xe2\xb6\xce\x91\xa7\x2e\x8a\xe6\x0c\xa8\x09\x83\xfb\xef\x4d\x85\x49\xac\x63\x19\xc4\x11\x84\x06\x5c\x1e\x35\xdf\x67\xb9\x27\xca\x2a\x2a\x78\xa7\x64\x66\x97\x52\x73\xb8\x2e\x1a\xec\xed\x1e\xbb\x8e\x30\xbd\x96\xdb\xb9\x28\x24\xdf\xed\xbf\x56\xb3\xaf\x2f\x3c\x1b\xa7\x71\xa7\xd7\x01\x98\x62\xd1\xec\x81\x53\x25\x95\x2f\xf4\x0e\xee\xc2\x44\xe3\x7c\x5a\x78\xc6\xb2\x9c\x9c\x57\x00\x52\x6d\x87\x1b\xd0\xcf\x5e\xb3\x29\x44\x24\x7b\x67\xcb\x1d\x27\x1a\x5c\xb5\xb4\xa1\x82\xa8\xa6\x5d\xc2\xbe\xce\x0e\x4a\xf1\xfc\x6e\x51\xfa\x2b\x5b\xe2\x84\xe0\xf4\xdd\xb3\xbc\xbc\x70\xb7\x28\x69\x06\xd5\xcf\xca\x6c\xc8\x0a\x6d\xd8\x3c\xa5\x83\x65\x2f\x64\xd7\x74\x45\x1e\x67\x91\xba\x3e\x13\x35\x23\xf7\xdd\x93\x6d\xf2\xac\x55\x8a\x94\x1f\x89\x53\x85\xb8\x3a\x69\x7d\x6d\xa6\xc4\x61\xe0\xa7\x2d\xd4\xd6\xed\xc6\xfa\x87\xde\x00\xa2\xed\xa7\xf5\x9a\x7c\xd0\x33\xb9\xe8\xa9\x46\x9a\x63\x23\x29\xd2\x8a\xc4\x1d\xc9\x96\xf6\x4a\x77\xb2\xa7\xe9\xb3\xa1\xfd\xb8\x5c\x50\x04\x79\xbb\x26\x59\x18\x15\x53\xdd\x0c\xff\x53\x4f\xe2\x96\x68\xf6\x9b\x89\xb8\x41\x1f\xa4\x3a\x74\xa8\xa8\x0e\xf2\xb1\xb0\x82\x61\x32\x27\x92\xb0\xaf\x46\xfa\x5b\x7a\xa4\xef\x1d\x39\xd2\xb2\x6d\x47\x6c\x01\x6c\x60\x19\xa2\x57\x37\xc6\x6f\xc8\xc3\x09\xb6\x3e\x6c\x18\x04\x04\x6c\x0c\xc4\xe5\x47\x6d\x90\x9f\xf2\xd8\x75\xb0\xe7\x8b\xc2\x9c\xaf\x0f\xea\x11\xfe\x84\x37\xec\x80\xd1\x07\xdb\x9f\x30\x2a\xd8\xea\x25\xee\x29\xc3\x93\x57\x59\x75\xe3\x15\x3f\x0d\xf5\xea\x29\x02\xac\x47\x39\x7d\xf2\x8a\xd8\x6e\x6b\xbe\xc6\x63\x87\xca\x66\x77\x29\x6b\xae\x8b\xd2\x7f\xb1\xb7\x83\xac\x6a\xcb\xb3\x0b\x58\x9c\x0e\xe3\xbd\xfa\x81\x8d\x9b\x9b\x2a\xda\x14\xa7\x1b\x59\xb2\x81\x81\x4c\xcb\xb3\x0b\x20\xc0\x36\xe0\x2f\x04\x74\x94\xb7\x60\x5f\x58\xb8\xbe\xec\x6f\xf7\xb3\xef\x40\x22\x0d\x5c\xe2\xdd\x79\xd8\x14\x0b\xce\xf1\xfd\xec\x7e\xc5\xfd\x7e\x64\xbf\x72\x2f\x37\x0c\xa8\x39\xc7\x24\x9f\x47\x86\x0f\x55\xf5\xca\x5b\x3b\x6c\x0a\x84\x04\xec\x75\xb3\x94\xd6\x84\x88\x21\x32\xc3\x50\x84\x23\xe5\x50\xb7\xda\xb0\x56\xcc\x26\x56\xb1\x4a\x26\x68\x4d\x39\xff\x64\x11\xba\x49\x21\x44\xa5\x35\x3c\x5e\xc4\x6b\xb2\xfb\x3a\x6b\x5b\xdc\x11\x26\x0e\xc4\x54\x28\xbf\x6e\x65\x79\x33\x5e\x4d\xfa\xbc\x1d\x26\x26\xee\x8e\xaf\x03\xaa\x19\x54\xd3\xe0\x4b\x80\x6e\x16\x17\xb4\xe4\x52\x0c\x82\xce\x85\x58\x21\xc2\x37\x8b\x88\x37\x13\x11\xa6\xbd\x2e\xb6\x27\x37\x50\x3f\xeb\xe5\xaa\x3d\x93\x08\x4c\x6f\x9c\x34\x4e\x94\xbe\x23\x3a\x5c\xf0\x2d\x17\x48\x8b\x6c\x92\x6f\x6e\xf0\x7b\x95\xdc\x5c\xb3\xeb\xcc\x36\x44\x9e\x03\xee\x60\xa9\x22\xb9\x8c\x62\x81\x0c\x6f\x72\xda\xe4\xa6\x6a\xf0\x0b\x0e\x82\x76\x9a\xa5\xf5\x54\xac\x85\x14\x15\x00\x7b\xb9\x61\x22\xc2\xf8\xf3\x45\x9e\x59\xa6\xba\xa2\xcc\xba\x3c\xee\x74\x44\x24\x09\x46\xd2\x07\x67\x66\x59\xbf\x35\x73\xfc\x48\x9a\xf1\x0c\xf6\x60\x0f\x73\x02\x66\xbc\x68\x83\x17\xdf\x66\xaa\xf2\x65\xa1\x6e\x2f\x4c\xba\xed\x90\x38\x6d\xb9\x6c\xc4\x5a\x51\x44\x8e\x5c\x75\xe0\x55\x96\x87\x4e\x51\x95\xd3\xb4\x0e\xe3\xef\x4f\xb0\x9a\x75\xe0\x8a\x32\xcb\xc3\x35\x38\x73\x18\xa7\x31\x03\xd1\x36\x1d\x91\x52\xca\x0f\xff\x67\x26\x82\xd9\xe1\xaf\x74\xce\x4f\x6d\x6a\x08\x79\xb5\xa4\xa5\xa7\x99\x50\x81\x3c\x6e\x2c\xfc\x41\xf6\x47\x1e\xbb\x0a\xdf\x9d\xca\xf3\x2c\xf7\x3f\xef\xb1\xa9\x91\x14\x62\xa0\xc3\xf0\x4d\xf0\xe3\x80\xd5\x99\x84\x45\x89\xbe\x2e\x5c\xa4\xcd\xac\x97\x96\x40\xf3\xc8\xd5\x05\xdb\x30\x50\xff\x35\x15\x28\x63\x4b\x35\xb0\xfa\x4a\xd8\x97\x22\x01\xed\x12\x50\xf3\xf4\x15\xc2\xbe\x32\x30\x0e\xa9\xb2\x21\x1a\x74\x08\xd0\xae\x50\xa7\x61\xe7\x0d\xf6\x6e\xc9\xe6\xd3\x24\xf8\x6f\xf5\x82\xff\xe2\xcd\x3b\x96\x5e\x8a\x86\x92\xe2\x90\xa6\xd2\x49\x9f\xab\x4f\x1e\xad\x7e\x3a\x31\x3a\x1f\x1d\x63\x7e\xa8\x97\xf3\xac\x32\x23\xbe\x73\x2c\x78\xe5\xd8\x79\x49\xd3\xec\x0b\x05\xca\x55\x9d\x0a\xbb\x59\xb7\x97\xb8\x21\xbc\xb6\x35\x5e\xfb\x3e\xd1\x00\xaa\x5d\xa5\x54\x95\x74\x28\x29\xf4\x25\x4e\xe5\xc9\xe9\xad\x16\x72\x77\xa5\x25\xbf\x2f\x8c\xcb\xd3\x59\x3e\x43\xdf\xe6\x1c\xc2\x8d\x10\x0d\xfd\xd1\x9a\xb6\xad\xc2\xad\xe4\x16\x8f\xc4\x23\xbf\xc5\xb1\x8d\x87\x75\x8b\x0f\xa9\x72\x8b\x2d\xfe\xf2\x7d\xec\xf0\x30\xd6\x3a\x2b\xca\x85\xb0\x6c\x3b\x01\x82\x7f\x30\x1e\x6c\x2c\xda\x3e\x01\x10\x57\x07\xc6\x92\x4e\xd8\xed\xaa\x65\x0e\x25\x85\x6e\xf0\x7b\xf4\x4b\x3c\x26\x85\xce\x63\x89\x97\x3a\xcf\x36\x53\x91\x17\xed\xb8\xcb\x3b\x61\x1a\xae\x51\xee\xe7\x9c\x2f\x9d\x3a\x13\xa7\xbd\x8b\x3c\x17\x80\x31\x19\xa7\x6b\x8d\x4b\x1e\xd8\x6c\x1c\x42\xf4\xe9\x31\xf6\xa0\x47\xb6\x9c\x5f\xf2\x82\x9f\xf3\x64\x7f\x75\xb0\x54\x9c\x03\xb0\x44\x5f\x29\xe1\x65\x57\xb5\x97\xbc\xb6\xfb\xf0\xa2\xdf\x49\xe2\x74\x1d\xd0\x5e\x29\x34\x4e\x8a\x5b\xa4\xfd\x4d\xd7\x95\xed\x31\x17\x61\x02\x9f\x5d\x36\x5f\x49\x9b\x63\x8a\x26\xe1\x06\xd9\x11\x3d\x16\x92\x73\x5f\xe2\x51\x24\xeb\xf7\x06\xd9\xb2\x14\xb3\xe5\xd5\xab\x96\x80\x48\xb4\xc3\xe8\x05\xc1\x23\xd1\x8d\xdf\xb8\xa6\x02\xc1\x89\x7b\x61\x7e\x69\x76\x69\xde\xd9\x08\x6f\xba\x26\x78\xad\x67\xef\x84\x94\x43\x21\x1e\xc5\xc5\x7a\x83\xfe\x56\xab\xae\x63\x1a\x00\x5c\x5d\xee\xff\x88\x87\x05\x37\x31\x8a\x5c\xf6\xb1\xfa\xd5\x96\x9b\x44\xde\xaf\x43\x77\xc9\xd5\xa8\xd5\x5e\xc8\xf2\x32\x4c\x2e\x79\xe3\xf1\xf3\xd2\x4b\xde\x78\xd2\x4b\x9d\x9d\xf3\xa5\xab\x58\xca\xae\x8d\x8b\x66\x11\xcf\xab\x54\xf7\xfe\xbf\x0f\xee\x8d\xa1\x07\xfa\x11\x42\x45\x03\x35\xeb\x15\xc8\xbe\x62\x09\x88\x44\x47\x96\xd5\x5e\x94\xc3\xa4\x7e\x3a\xcc\x8f\x94\xcd\xee\xa4\xa3\xc9\xb8\x91\xc9\x5e\xf8\x75\x25\x14\x7c\x1b\xd6\xb4\x8c\x4a\xf8\x33\xbd\x94\xcc\x37\xee\xdd\xff\x1f\xed\x70\xcb\xfc\x4a\xa3\x2d\x9f\x34\x7b\xcf\xcc\x02\xc5\x59\xc2\xce\xa2\x51\x90\x01\x00\xfc\x97\x40\x6a\x42\x60\x18\x4b\x73\xcf\x8e\x31\x39\x85\xfe\x64\xf0\x78\xea\x29\x7e\xfa\x74\x05\x97\x0d\x53\xe4\x0c\xf4\x3d\x1e\x3b\xd8\x85\xe9\x2f\xfc\xb7\x7b\xc1\x2b\x3c\x67\xa0\xb8\x30\xfc\x4c\xac\x54\xcb\x58\x14\x02\x97\xc9\xf3\x3c\xe5\xf3\x0b\x92\x0a\xc4\xdd\xe7\x84\x51\x94\x9f\x44\xf3\x69\xcb\x58\xd5\xe2\x42\xeb\xb6\xc2\x54\x07\xe9\x1e\x29\xfb\xdd\x58\x5e\x1f\x7d\x2d\x50\x14\xfc\xd6\x9b\x8f\x61\x36\x95\xe3\x37\x1f\x9b\xdc\xca\xc0\xb1\x6e\x05\xd7\x3e\x27\x78\xfa\xee\x42\x66\x07\x23\x72\xdd\x1b\xfa\xad\x1e\x73\xf6\xa9\xff\x3a\x2f\x78\xe9\xb0\x79\xc2\x29\x5a\x78\x54\xa7\xc8\xcc\xc9\x05\x76\x7d\xb3\x1d\x76\x67\x7a\x65\x7b\x2e\x2e\x20\x7d\x51\xdf\x9f\x09\x4e\x28\x15\x99\x3a\xa1\xd8\x71\x5d\x84\xc3\x6e\x73\xf7\x91\x33\xfc\x45\xf6\x18\x55\xef\x12\xa2\x26\xfb\x4f\x09\xa6\x87\xd7\x4a\x05\xb6\xad\xf3\x7d\x63\x3a\x6a\xfc\x1d\x63\xc1\x8f\x8c\x55\xa3\xc6\x55\x1a\x19\xa4\xa4\x70\xa4\x6d\xd8\x69\x8a\x28\x5f\x8e\xbb\x27\xf9\xa9\xb4\xe8\xe5\xc2\x98\x9b\xaa\xc1\xe5\x71\x71\x19\xf1\xe5\x08\x97\x7c\x72\x54\x94\xf9\x7c\xa7\x9b\xc4\xcd\xb8\x4c\xc8\x8f\x2d\xd7\x59\x02\xf0\x03\xb9\xa8\xbd\xd4\xd2\xf6\xed\x92\xe8\x03\xc9\xb3\xd7\xf8\xb3\x1e\xbb\x46\x1f\x7e\x00\x92\xfa\x35\x2f\x78\xaf\x37\xdb\x2b\xca\xac\xc3\x15\x3d\x54\xc4\x01\x0e\x3b\x07\xe8\x6e\xeb\x13\x27\x5e\x1a\x59\x46\x97\xb4\xf2\x22\xee\xf4\x92\x32\x4c\x45\xd6\x2b\x92\x7e\x8d\xa7\x62\x93\xea\x8e\x75\x99\xdb\x89\x1c\x21\x41\xb8\xe3\xe4\xed\xb4\x56\x69\xd8\x11\x77\x18\x6f\x08\xc8\xec\x16\x69\x9d\x49\x33\x4b\x53\x4c\x55\xea\x6c\xdd\xd7\x0f\x67\x6a\xe4\x49\xda\xcc\x72\x17\xf5\xe0\xcf\xc6\x83\xdb\x86\xbd\x70\xbd\x1f\x55\x89\x2a\x00\x82\x14\x93\xf0\xd1\xfc\x9c\x73\xc7\xbc\x6e\x9c\x7d\xd2\x40\x19\xc0\xac\x9e\x5e\x82\xbb\xbd\x12\x34\x5d\xdd\x5f\x6a\x3b\x3e\x12\xf8\x06\x97\xbf\xe3\xec\x59\xbd\x68\x11\xc9\x24\x78\xf6\xa3\x88\x3b\x70\x37\xd3\x93\xec\xdf\x16\x10\x93\x3d\x3f\xc7\x7b\x69\xfc\xbc\x9e\x14\xdd\x6d\x83\x5d\x75\xad\xec\x21\xbc\xf3\x2a\x76\xe7\x0e\xb2\x1a\x35\xb6\x4a\x77\xe6\xff\x31\x0b\x5e\xe4\x6d\x99\x10\xcd\xc5\xe7\x72\xd3\x48\x65\x2d\x0a\xa7\xae\x26\xea\xc3\x68\x1c\xc8\x85\x82\x26\x07\x9d\x66\xb1\x13\xf6\x79\xb3\x1d\xa6\x6b\x76\xc6\xc0\x8a\xe9\x61\x62\xcf\xe3\x76\xcf\xe3\xd6\xf1\xb8\xfd\x27\x8f\x4d\xd0\xde\x2a\xfc\xff\xe3\x05\xf3\x3a\x5d\x8e\x13\x0a\xb6\x69\xa7\x13\x04\x19\x1a\xd2\xc7\x38\xf1\x97\x6e\x76\x54\x87\x91\x3a\xc5\x66\xb7\x02\x45\xda\xe1\x01\x7b\xc8\x3b\xcc\xbe\xdd\x71\x96\xec\x86\x65\xb3\x5d\x87\x4f\xc4\x5a\xdf\x9f\xf0\x0f\x74\x44\xbe\x26\x98\x2c\xf9\xf8\x21\x25\xe1\x6d\x7d\x5d\xf4\xfd\x83\xfe\x7e\x79\x69\xb0\x3d\x0f\xd6\x5d\x7b\xb0\xfe\x87\xed\x3d\x58\x9f\xe5\xdf\x6f\x3c\x58\x87\xae\x76\x25\x5a\x61\x2b\xc2\x59\xf5\x74\xfd\xa5\x03\x6c\x72\x74\x7e\x00\x8c\xdd\x00\xe8\x76\xf0\x52\x7b\xe5\x81\xe0\x88\xfe\x45\xb4\xaf\x9a\x90\x39\x44\xa8\x77\x97\x78\x7e\x6e\x3f\x13\xec\xda\x76\x96\x44\x22\x9f\x47\xff\xb0\xbe\xbf\x14\x9c\x76\x9f\xb8\x11\xd0\xb1\x7a\x4a\xac\x25\x96\xc5\x26\x94\x4b\x77\x62\x9a\x22\x3a\xf3\x31\x8f\x3d\x0e\x9e\xce\xf5\x5c\xd7\x9d\x77\x69\x73\xd1\x1b\xbc\x61\x05\x70\x38\xda\xce\xa0\x12\xd5\x46\xe0\x7b\x54\x50\x30\x06\x7c\xa8\x73\x4d\x6d\x86\x31\x30\xb7\x78\xe9\x86\x4d\x50\x47\x03\x0e\x88\xd2\x5a\x77\x44\x08\xbc\xae\xb2\x8a\x83\xd6\x1f\x52\x7b\x48\xd2\xa0\x52\x45\x2f\x8a\x54\x6c\x2e\xc7\x9d\x8a\x5e\x3a\x67\xd7\x41\x7b\xcb\x52\x18\x26\xec\x96\x67\xab\x41\xcc\x57\x5f\x69\xfb\xbf\x36\xf6\x95\xd6\x4b\x98\x35\xec\xbd\x72\x51\xc3\xf9\xac\xa4\xb9\x7c\x0b\x44\xd8\x52\x77\xfc\xd7\x7a\xec\xf6\x2b\xa0\xd3\x67\xe3\x66\x9e\xc9\x0a\x82\x45\x5d\x17\x4e\xaf\x6b\x65\x51\xab\x68\xaf\x2c\xf6\xb1\x1d\x16\x38\x47\x74\x87\xe1\xd9\x86\xc5\x66\x2f\xf7\xd8\x55\x34\xd7\xd0\xc9\xe7\xef\xb2\x8f\x27\xad\xca\xb6\xea\x25\xf6\x6c\x33\x2c\xd4\x4a\x47\x0d\xf6\x0b\xfb\x1c\xd3\x41\xd8\xed\xa2\x0b\x78\x19\x96\xa2\xd5\x4b\x96\x44\x79\x1e\x06\xb0\xa4\xa8\xec\xcb\xf6\x05\x9f\xf6\x46\xbe\xae\x86\x39\xa9\xc7\x5a\x54\xb2\xbe\xe4\x04\xae\x93\xa8\x44\xa0\xbd\x42\xd8\xf6\x73\x9c\x39\x8c\x1e\xa5\x24\x79\x05\x62\x04\x44\x88\xb4\x03\xea\x36\xed\x47\x9a\x8a\xa6\x28\x8a\x10\x93\x89\xda\x36\x78\xac\x47\xcb\x03\xaa\x87\x91\xee\x9d\x7b\xd2\xdf\x36\xc6\x3e\xe8\xb1\x6b\x64\xc7\xe2\x74\x0d\x87\xe7\xbf\xdd\xdb\xea\x06\xa3\x49\x5b\xb4\x3f\xb1\x06\xaa\x26\x27\x58\x75\x4a\xd8\x80\xb6\x76\xb2\x4b\x6b\x4c\xb0\x84\xcb\x24\x52\x6e\x57\xbd\x2c\xd7\x60\x6d\x52\x13\xae\x04\x28\x4a\xb8\x0b\x62\x4b\xba\x23\x17\xd1\xf8\x2b\x54\x5b\x75\x08\xd5\xcf\x5f\xc7\x9e\x6c\x53\x5e\x91\x97\x48\x47\x45\xa1\x29\xef\xac\x79\xb8\x14\xaf\xa5\x71\xba\x66\xfb\x0c\xff\xf5\x63\x82\x8f\x78\x48\x69\x2c\xe3\x81\xfc\xd9\xe9\xf4\x30\xdb\x9f\x31\x91\xea\x74\x8f\x85\x12\xf1\x1a\x1c\xc4\x03\x94\x15\xf0\xa5\xbc\x26\xcf\x17\xe1\x9a\x20\xbd\xb8\x76\xc4\x83\x80\xbb\x14\xbf\x04\x85\x37\x2a\x3f\xa8\x50\x98\x0b\x1e\x89\x3c\xde\x40\x79\xc9\x42\x47\x84\x98\x61\xcd\x90\xea\xc4\x8f\xab\x7d\xcc\xac\x0d\x88\x46\xd8\xb6\xb3\x89\x5e\x7f\x2d\x7b\xeb\x7e\x76\xa0\x07\x5d\xf1\xdf\xb0\x3f\xf8\xfc\x3e\x42\x07\xa0\xde\x59\x16\x6f\x15\x0c\x08\x85\xe1\x50\x88\x8b\x24\xf8\xad\x8b\xbe\x96\x6b\xb5\x93\xaa\x64\x2a\x84\xb9\xe2\xcb\x2c\x4b\x8a\x46\x2c\xca\x56\x23\xcb\xd7\xa6\xda\x65\x27\x99\xca\x5b\xcd\x9b\x8e\xdf\x7a\xec\x86\x02\x05\xdf\xfa\x8d\x8d\xe3\x8d\xe9\xc6\x09\xcc\x03\x75\xf9\x1f\x4e\x1f\x67\x90\xff\xd9\xce\xbd\xc8\x78\x50\xe0\x8a\x06\x35\xc6\x83\x28\x5e\x8b\xcb\x90\x6c\xa2\x92\x83\x80\xa7\x30\x98\x14\x72\x58\x77\xe2\x52\x25\xb6\x0a\xe4\xb0\x44\xda\x8c\xbb\x6d\x91\x3b\x0f\xc3\xb5\x5c\x08\xfd\x44\xf2\xa8\x83\xe5\xe4\x3e\x83\x66\xf0\x57\x9e\x98\x1f\xaa\x2c\xe8\x92\xb1\x0a\x51\x7d\x12\xa6\xf8\xaf\x0a\xcd\xec\x95\x6d\xac\x08\x25\x12\xf3\x3b\x8b\x04\xb7\x47\x28\x3a\x61\x9c\xf0\x6e\x9e\x95\x38\x37\x58\xcb\x54\x47\x52\x60\xf9\x67\xdc\x2d\x44\x13\x42\xe2\x51\xb6\xb6\x1e\x96\xbd\x34\xc5\x6c\x69\xf4\x40\xee\x1d\xf8\x09\xae\x39\x65\xd8\xe9\xaa\x56\xb2\x66\xd1\x75\x9a\xed\x48\x32\x5f\x64\xad\x92\x17\x6b\x4d\x78\x92\x8a\xb2\x68\x86\x52\xc6\x5f\x6b\x06\xa3\x15\x96\x0f\x79\x37\x8c\x44\x17\x3b\xe4\x1f\x0c\xcb\xac\x13\x37\x19\x8b\xd8\x84\xec\x0d\x38\xe2\x3d\x23\x78\xda\xfc\x56\x31\xb5\x52\x20\x94\x85\x61\x07\xe2\x5f\xb2\xbc\xa5\xa2\x69\x41\x56\xc0\x32\x8c\x93\xa2\x51\xc1\xbd\xd8\x2f\x2e\x96\x79\xe8\xbf\x30\x78\x3a\x02\x1c\x6e\x19\xbd\x7b\x79\x2d\xbd\xc3\x7b\x3c\xfb\x37\xa3\x67\xc2\x36\xda\xbd\xd9\x63\x07\x10\x7d\xc6\x7f\x9d\x17\x3c\x9d\xbc\x1c\x1f\xce\x41\xef\x72\x3d\x9a\x4c\x11\x14\xff\x19\xfe\xbe\xd5\x7e\x29\x82\x27\xdc\x15\x16\xe2\xe6\x1b\xeb\x22\x95\x9b\x32\xe2\x0b\x4f\x9b\x5d\xba\x61\xfa\x18\x9f\x5d\x5a\xe4\xf2\x8c\x5c\x7e\x23\xaf\xdd\xc7\x98\xdc\x64\x02\x15\x7a\x2f\xde\x17\xfc\xdf\xf1\x45\xed\xf4\x8d\x6f\x2c\xc7\x54\xf2\xf3\x9e\xa7\x74\x20\x3a\x13\x26\xba\x6a\x92\xa7\x8a\x9c\xc2\x93\x7c\x05\xdc\x71\xeb\xed\xac\x28\xe5\x4b\x29\x78\xc8\x7f\x57\x40\x27\x08\x18\x2a\xc6\x8e\xb6\xaa\xf1\x33\x45\x74\x92\xf1\x69\xd4\x1b\x96\x87\x65\x1b\x72\x04\x89\xe4\x11\xf0\x58\x5a\x97\x4b\x4d\x39\x5e\x16\xd0\xcf\x88\x61\x0a\x3d\x47\xc5\x89\x81\x48\x2a\xd4\xad\x8e\x95\xd4\xa9\xce\xa0\xc1\xf8\xf1\x61\x6d\x41\x10\x4e\xba\x76\x25\x8d\x25\xa2\xac\xd3\xe7\xb2\xfa\x13\x8e\xef\x8a\x5b\x45\xf5\x73\x8c\x62\xaa\xf7\x30\xd3\x6a\xd0\x60\x73\x52\x2e\x92\xe2\x19\xc9\x23\x18\x97\x21\x57\x03\x17\xa6\xe0\xed\xb0\xdb\x15\x29\xb8\xf4\xc9\x02\xab\x61\x1a\x35\xf8\xfd\x59\x0f\x2e\x3b\x4c\xb7\x87\x36\x4d\x6d\x1e\x46\x98\xd5\x15\x70\x89\x31\x0b\xbf\xe2\x9c\xd1\x26\x1b\xef\xc5\x91\xff\xef\x83\x7b\xcf\xcf\xcf\x3d\xbc\x67\xc2\x34\xf2\x7f\xf7\x0d\x05\x9a\x45\x75\xdd\x42\x9e\x3d\x17\x89\xab\xff\xc9\x7d\xc1\x3d\xe6\x27\xf9\x0b\xa0\x4f\x77\x17\x1f\x8b\x88\x87\x10\xab\x01\xea\xe4\xcc\xb6\x0c\x48\x99\x98\xd4\xf8\xfd\x6e\x25\x84\xe8\xeb\xe3\xec\xb5\x1e\x7b\x2c\x05\x5c\xcd\x34\xc1\xdc\x0e\xb1\x1b\xfe\x0b\xd8\x1d\x3b\x48\xdb\x34\xf0\x9d\xe9\x66\xf0\xa4\xe1\xb3\x36\xa4\x31\x38\xb8\xc0\xa9\xe2\xd7\xac\x64\x87\x50\x09\x78\x36\xec\xfa\x6b\xec\xc6\x6d\x7b\x32\xab\x4a\x5b\xed\x4f\x0d\x6f\x5f\x57\x3c\xd0\xea\xf3\xd9\x55\x51\xb6\x99\x6e\x86\x79\x34\xb3\x30\xef\xaf\xb3\x9b\xb7\x6d\x77\xce\x94\xb7\x5a\x9e\x1e\xde\xb2\x55\xf9\x40\xdb\xeb\xec\x00\x5a\x2e\xfd\x70\x8b\x70\x6f\x37\x5f\x96\xd5\x62\x6d\xd4\x5c\x83\x0d\xb3\xda\xd8\x07\xaf\x66\xa7\x76\x9c\xab\x7e\x4b\xd5\xee\x5f\x5d\x15\xfc\xf3\x37\x81\x6a\x97\xcf\x89\x6e\x2e\x50\x90\x89\x53\xbe\x31\xdd\x98\xbe\xb9\xc6\xbb\x49\x98\xa6\x64\xfc\xc8\x45\x27\xdb\x08\x13\xf5\xf6\x49\x0d\x7e\xbe\x10\x5b\x2a\x60\xa6\x36\xa6\xb7\xd4\xbd\xa8\x7c\xac\xae\xc0\xf4\x85\x3d\xd8\x9a\x3d\xd8\x9a\x3d\xc5\xfc\xc3\xaa\x98\x7f\xf1\x98\xa5\x98\xff\xdb\x47\x4a\x31\xff\x54\x76\x0f\x3b\x7d\xd9\x8a\xf9\xa1\x34\x72\xe7\x3a\xf7\xcb\xd1\xe3\xbf\xd8\xdb\x5e\xbb\xbc\xe2\x3f\xfb\x91\xd2\x2e\x13\x22\xce\xc7\xae\x66\x77\xef\x78\x5e\x2e\x60\xb0\xe7\xa8\xdb\xe3\x1f\xae\x0a\xbe\x7f\x6c\xeb\x32\x0f\xf7\xfd\x41\xbb\x58\xb2\x49\xf2\x92\x84\xab\x04\xcc\xa9\x8f\xdc\x25\xb2\xcd\x00\x87\x5e\x23\xbf\xbb\x77\x8d\xec\x5d\x23\x7b\xd7\xc8\xc3\x7a\x8d\xbc\xd4\xbe\x46\xfe\xee\x91\xba\x46\xce\xb0\xa7\xb2\x7b\xae\xf0\x1a\x19\xa0\x14\x8f\x84\x99\xf7\x21\xef\xa5\x3b\xb8\x48\x56\xfd\x95\xfa\x20\xf5\xe7\x97\x75\xb7\x6c\x4d\xf8\x18\xfb\xe9\x43\x4e\x5a\x37\xe3\x15\x4e\x20\x73\xf8\xdb\xe4\x64\xfd\xfb\x89\xe0\xc6\xea\x43\x5c\xbb\x66\x96\x24\x24\x1c\x67\x2d\x4e\x15\xf1\xa6\x2c\x24\x46\x24\x65\xfd\x95\x83\xec\xb7\xec\x4d\xfe\xe1\x5d\xa6\xaa\xfc\x0f\xc3\x53\x55\x3e\x5a\xdb\x7b\xef\xba\xd8\xed\x75\x51\xaa\x0c\xb3\xeb\xc1\x0d\x3a\xc3\xac\x0d\x6a\x62\x6f\x3d\xf9\xa9\x39\xf3\x4f\x62\xb7\x6c\xe1\x6b\xbc\xd5\xbe\xde\xbb\xa4\xae\xfc\x92\x7a\xc8\x8b\xb7\xa7\x63\xa7\xfd\x39\xcd\x10\xab\x85\xa8\xc2\x41\x56\x48\xca\x50\xb6\xf7\xbd\x8c\xdd\x75\xf9\xc0\x4e\xb8\xe0\x33\x0b\xf3\xa4\x29\xf3\xff\xe2\x50\xf0\x2c\xf3\xb3\x02\x18\x89\x46\x18\x74\x4d\x00\x40\xf5\x66\x2f\x09\x73\x0e\x6a\x79\x3a\xc7\x0d\xf4\xb1\x57\xc1\x42\x01\x75\xb4\x01\x23\xac\xa4\x8a\x79\xdd\x1e\x0f\xb9\xc7\x43\xfe\x4b\x41\xd0\x7d\xbb\x82\xc3\x7c\xb3\xc7\x96\x87\x56\xb5\x8b\x63\x09\x88\x99\xa7\x5d\x90\x2e\x5b\xa1\x0a\x91\xe1\x80\x25\x04\xe9\xd9\x22\xcb\x43\x21\x56\x3a\x77\x75\x7e\xd9\x8f\x18\x90\xcb\xd7\x78\xec\xc2\xc3\xde\x57\xc4\xc1\xbc\x85\x22\x54\x75\x7f\x95\xc5\x7e\x50\x11\x4c\x88\x3c\xd8\xbd\x87\xbc\xf5\xed\x89\xe6\x3d\xfe\x69\xa3\x45\xa8\xf4\xa8\x42\x3c\x4d\xc7\x86\x92\xcd\x77\xef\xdb\x26\xb7\xf5\x40\x1e\x55\x74\x32\xff\xfb\xf1\xe0\xb7\xbd\x61\x6f\x2c\x17\x8e\x76\xb6\x09\xe1\xc5\x00\xbd\x2b\x47\x7b\xd9\x09\xad\x1f\xe5\xcc\xa7\x97\xbc\x03\xd8\xc3\x4b\xde\x01\xf4\xde\x77\xe8\xf5\x4b\xc7\xd8\x8b\x3d\x46\x45\xfc\xfe\x65\xa6\x15\xc5\x49\x9a\xd7\x90\x6c\xc1\xad\x34\x1b\x96\xab\xb7\x05\x63\x46\x2f\x57\xfb\x68\xb6\x04\xb8\x03\xca\x2d\xcd\x5e\xc8\xa8\x7b\x7e\xc1\x9e\x74\x05\x9d\xc0\x98\x9c\xe0\x66\x6a\xca\x85\x17\xb1\xd3\x85\x6a\xab\xaa\x9d\x99\x9a\xbd\x92\xb1\xa3\x23\xd1\xaa\xce\xe1\x2f\xcc\x29\xb3\x20\x44\xee\xff\x8f\x43\x41\x32\xf0\xd4\x4d\x29\x23\x10\xb5\x26\xc4\x48\x45\x44\xa2\xe1\x65\x36\x25\x97\x8f\xfc\x66\x9a\x22\x87\xe4\x32\xcd\xac\xb3\x4a\x1e\x93\xe0\x66\x67\xf9\xc4\x90\xcf\x8a\xb3\x66\x7f\x38\xc1\x7e\xc6\x63\x07\xe3\xee\x5d\x49\xd6\x5c\xf7\x7f\xd4\xdb\x02\x85\xa5\x02\xbb\xb5\x00\x9f\x04\x1d\xfa\x43\x5f\xc6\x94\x00\x07\x36\xb4\xc5\x05\x50\x31\x83\x29\xa0\xc3\x8f\x01\xd6\xa9\x2d\x52\x9e\x52\xbc\x13\xb9\x34\x39\x4e\x3d\xe8\xf9\xd3\x60\xbf\x37\xce\xae\xd7\x70\x51\x3a\x45\xf9\xaf\x8f\x3f\x0c\x29\xca\xff\x79\x0c\xff\x2c\xb8\xc6\x85\x52\xc9\x48\xe9\x08\x28\x68\x2f\x08\x40\x74\xc3\x96\x31\x8c\x14\x20\x4b\x48\x8a\x92\x65\xf4\x9e\xe4\x85\xe8\x84\x69\x19\x37\x8b\xdb\x78\xdc\xe2\x74\x89\x02\x5e\x9c\xb1\xa3\x17\xd4\x7c\x98\x58\x99\x9e\x8a\x06\x63\xf3\x2d\xbe\x90\x45\x76\xee\xf4\x30\x29\x32\x39\x71\x35\x9c\x39\x39\x5d\x83\x7b\x08\x12\xc8\x6f\xb6\xb3\x44\xe8\xaa\x4b\x88\x2f\x8b\x0a\x93\xb0\xd4\xa9\x98\x6a\x32\xc3\xc7\xef\xd0\x47\xea\x5c\x75\xda\x2d\xbb\x78\xb5\xfb\xd0\xc6\xe5\x56\xc7\x3e\x3b\xce\xae\xea\x9a\xfe\x3c\x5c\xcb\xaa\x41\x1b\xaa\x8b\x82\xd8\x3a\xaa\xdf\xb2\xcf\x8f\xe8\x9a\x62\x32\x78\xb9\x9a\x03\x63\xff\x66\x5f\xd3\x1d\xb5\x81\x27\xff\x70\xc1\xb3\xcd\xd4\xd4\xdc\x60\x7f\x72\x88\x1d\x19\x06\x86\xd5\x6d\x8b\x8e\xc8\xc3\xc4\x09\xcf\xfa\xd0\xa1\xe0\xa9\x6e\xa4\xb1\x50\xe5\x9c\x70\xbe\xb8\xe0\xed\x30\x8d\x12\x1c\x47\xa8\x92\x09\x2b\xdd\x09\x26\xcf\x74\x05\x8a\x2f\x4f\xb0\x3f\x98\x60\x8f\xc5\x5a\x66\x93\x30\xee\x2c\x8b\x4e\x57\x72\xf4\xfe\x83\x13\x3b\x70\x17\x58\x90\xec\x41\x51\x8a\xb4\xbc\x30\x58\x45\xf0\xa2\x89\xfb\x2c\xbc\x13\xf0\x03\x05\xcf\x46\xe0\xb6\xc3\x34\xaa\x87\x49\x96\x0a\xbe\x70\x61\x96\x4c\xd9\x98\x3f\xd7\x8a\x53\x54\x11\xb2\xa0\xbe\x57\xb8\x4f\x71\xc1\x87\x4e\x14\xc4\x87\x76\x56\x45\x14\x01\x8b\x80\x2d\x03\xd9\xdc\x4c\x0d\x0d\x5d\xb8\x30\x6b\xc1\x01\xc8\xb6\x8d\xb3\x4e\x22\x4a\x3b\x49\x36\xb0\x19\x04\xb7\x42\x89\xb5\x6d\x7c\x5d\xfb\xdb\x95\xdb\x01\x4e\x27\xec\x88\x3b\xea\x4e\xdc\xde\x0a\xdf\x84\xe0\xaf\x95\xca\x53\x1b\x0c\x4e\xcb\x07\x2b\x72\x0b\x75\x45\x93\xfc\x45\x8a\x15\x0e\xea\x08\x2e\xd2\x32\xef\x37\xe4\x06\x53\x60\x9b\x60\x1a\x89\x21\xc3\x90\x86\x5a\x85\x69\x6a\x29\xa3\x8a\xe4\xa8\x52\xe0\x96\x14\xe2\xb4\x64\xa2\x2c\x28\x50\xe8\x7f\x25\xbf\x78\x96\x01\x30\xce\x64\x83\xb1\x99\x14\x11\x41\x61\x67\xc3\x48\x61\x32\x42\xcc\xc5\xe5\x64\xbc\x97\xf3\xeb\x40\xd3\x40\xcf\x8e\xa6\x59\x79\x54\x2f\xbe\x86\x78\xca\x10\xda\x75\x23\x8b\xad\xec\xc8\x52\x3a\x44\xbc\x0d\x9a\xa5\xd5\x3e\xef\xc4\x05\x80\xb7\xf1\xa5\x52\xde\x99\x24\x88\x75\x35\xe4\x50\xca\x57\xe5\xf5\x29\x22\xde\x4b\xcb\x38\x41\x5f\x68\x5d\x8f\xec\x32\x88\xba\x9d\x6c\x83\x30\x06\x31\x03\x97\xa4\x4a\x75\x15\x44\x49\xa5\x3a\x82\xa2\x60\xad\x5c\x41\xd4\x58\x4d\x2f\x75\x1b\x45\x5e\xe5\xf0\xae\x20\x73\x71\x73\x0d\x64\xed\x95\xfd\xcc\x52\x0a\xf5\x93\x3f\x34\xbc\x2a\x9c\x4a\xf0\xeb\x8d\xb5\x94\x4d\xc2\x9e\xf6\xf1\x46\xdc\xd4\xb8\xb4\x10\x71\x5b\xbd\x04\xfd\xa5\x3b\x61\xda\x83\x0a\xa4\x40\x9d\x16\x65\xde\x6b\xa2\x14\xc3\x57\x73\x70\xbd\xa1\xab\xb9\xc1\x58\x15\xf9\x92\x90\xed\x81\x37\x4c\x33\xf2\xba\x30\xa8\x44\x9d\x30\x12\x15\xff\x60\x1a\x8d\x1c\x3f\xba\x2a\xc7\x25\x4c\xc4\xaa\x10\xa9\xf6\x53\x66\x4c\x81\x8c\xd7\x50\x8f\xa1\x86\x13\x27\x0d\xf6\xb7\x57\xb1\xc7\x0f\x0b\xd3\x57\xc0\x62\xfe\xe7\xae\x0a\xde\x31\xa6\x7f\xda\x6c\x9e\x4e\x4f\x45\xce\xf5\x16\xfc\x01\xc5\x82\xd2\xf4\xc9\x7d\x82\x49\xe1\x11\x2b\x15\x5d\xce\x15\x6e\x9a\xc6\x30\xe3\x62\x03\xe5\xf4\xd3\xb4\x19\x17\xb2\xa2\x84\xdd\x05\x33\xb2\x90\x8b\xa5\x32\xeb\x5a\xe5\x91\x9c\xe6\x45\xcd\x81\xe7\xd0\x47\x8c\xea\x87\x6d\x58\x58\xbb\x50\x21\x7c\x15\x0a\x97\x44\xd4\x78\x2f\x4d\x20\x53\x9e\xf3\x25\xa1\x4a\x01\xba\x56\x51\x33\x34\xae\x19\x16\xb8\x71\xa8\x03\x70\x17\xae\x82\xe7\x97\x4b\xbf\xdf\x70\x88\xfd\xa7\x71\x76\xa8\xab\xc6\xe1\x7f\x6d\x6c\x8b\x0c\x93\x1a\xd9\x04\x6b\x0d\x7e\x63\xcc\x4c\x00\x60\xba\x62\x7a\x17\x0b\x0f\x0a\xd7\xdc\x86\x8a\xb4\xdd\xd3\x09\x4a\x44\x75\x92\x46\xe1\x0e\x31\x36\x90\x58\x42\xa1\x42\x29\x10\xbb\xb0\xd9\x84\x68\xa6\x35\xb9\x5e\xa8\x03\x81\x57\x74\x6d\xd2\xc5\x7b\x79\x73\x0f\xc6\x62\x35\xed\xc3\x55\x4c\x5b\x85\x8b\xeb\x9a\xad\x3f\x0d\x08\x5e\x1d\xcc\x48\x53\x16\x16\x1e\x3c\x60\xaf\x3d\xc0\x0e\x76\x71\xf7\xf8\xdf\x77\xe0\x32\x56\xe0\x77\xf7\xab\x4d\x37\x7c\xfe\x09\xe6\x2f\x1c\x39\xa1\x51\x4f\x61\x44\x63\x9a\x42\x0c\x13\xc8\x9c\x49\x83\x5d\xcf\x55\xfe\x41\x85\x87\x37\x45\x58\x78\x2e\xc0\x5b\x4d\x92\x47\xc9\xab\x41\x10\x81\x56\x78\x91\xa3\x3b\x3c\x14\x65\x13\xaf\x65\x6b\x73\x42\x32\x4f\xea\x7e\x75\x89\x9a\x79\x58\xb4\xa5\x80\x2e\x2f\x9a\x18\x73\x90\x0b\x95\x52\x0d\xae\x05\x0b\xf4\x2d\x2e\x2a\x99\xc2\xa9\x11\x85\x03\x51\x81\x58\x73\xa1\xe8\xc0\xfd\x30\x92\xac\xd6\xaa\x58\x8b\xd3\x42\x4d\x1f\x1c\x75\x9a\x67\xb9\x60\x02\xc8\xa1\xb8\x28\x9a\x3d\xd8\xc7\x8b\x62\x2d\xcc\x23\x38\x9f\x4a\xd0\xea\x95\xcd\xcc\xdc\xf4\xd4\x89\xea\xde\x06\xba\x09\xb3\x8b\x04\xd9\x80\xe8\x51\xd2\xbc\x72\xdb\x3e\x3f\x0c\x7b\x5c\x4e\xac\x79\x37\x72\x72\xf0\x02\x40\x4c\xae\x47\xe5\x50\xfc\xbe\xe7\x08\xfd\x74\xa6\xb5\xfa\x0b\x45\xef\xd9\xa5\x79\x4c\xf7\xee\xff\xac\x17\x2c\x56\x1f\x56\xb4\xe9\x71\xba\x06\xf9\x7f\x93\x38\x15\x1c\x10\x37\x28\x1f\x3c\xf1\x22\x24\xce\x5b\x17\x79\x63\x18\xc4\xf4\x1c\xbb\x8b\x90\x79\x4f\x06\x75\x1b\x99\x17\xb5\x62\x80\x4d\x65\xf3\x79\x80\xea\x03\x2d\xd9\xba\xd0\x57\xec\x73\x86\xb7\x15\x28\x5d\x57\x34\xfd\x2f\x8e\x07\xf7\x0c\x7b\xa1\x01\xe9\x06\xc3\x34\x77\x80\x4b\x97\x5f\xf2\x0e\xe0\x11\xbd\xe4\x4d\xa4\x59\x04\xd9\x40\x9d\xc1\xfe\xaf\x31\xf6\xc3\x06\xc2\x2d\xf7\x5f\xe1\x05\x2f\x9c\xa1\x1f\x95\xe0\x29\x7b\xcc\xc4\x86\x45\xd6\x04\x9f\x3d\xbf\xb4\x4c\x27\x41\x99\x11\x34\x40\x7a\xec\x66\xcf\xb5\xf1\xd1\xee\x16\xe5\x02\x64\xfb\x97\x5d\x3b\xe2\xe2\xab\xdc\xc3\x74\xa7\xfd\xdb\x83\x29\x60\xb0\xb3\xc8\x42\x1e\xa1\x6e\x58\xe9\x1e\x08\x57\x0e\x53\x2b\x9b\x9a\x5e\xc8\x68\x1e\xfc\x82\x9d\xdc\x39\x4a\x99\xb5\x16\xf0\x75\x70\xd3\x20\xf2\x45\x15\x35\x65\xb0\x33\x0d\xf6\x8b\x57\x69\x5b\xd2\x96\x31\xdf\xdb\x78\x4f\x7d\x8d\x05\x2f\xf7\xbe\x69\xbc\xa7\x9c\x7d\xf4\xd9\x3d\xd3\xd3\x9e\xe9\x69\xcf\x7d\xe9\x61\x75\x5f\x7a\xc0\x76\x5f\xfa\xda\x23\xe5\xbe\x74\x37\x3b\xc5\x66\x2f\x1f\x9e\x62\xa8\xe7\xd2\xc3\xef\x02\xfb\xc0\x0e\x3c\x97\xbe\xc7\x7f\xd6\xe5\xb9\xc0\x6e\xe3\xa6\x54\x81\x58\xf8\x9d\x43\xdb\x58\xb4\xa6\x1b\x2a\x21\x34\xd9\xad\xd0\x16\xf8\x96\x43\xc1\x1f\x8c\x0d\x7b\x53\xb9\x57\x55\x7c\x3a\xc1\xfb\xb6\xac\x9c\x91\xca\x68\x03\xb1\x51\x92\xaa\x19\xd1\xbb\x26\x99\x75\x03\x2a\x15\xa7\xe6\x98\xca\xc5\x4e\x62\x79\x74\x6b\xea\x3a\x80\x5c\xa0\x61\xb3\xad\x74\x65\x76\xbb\x68\x4e\x23\x2b\xcd\x11\xd1\x58\x6b\xf0\xd9\x85\xf3\x20\x24\x88\x4e\x96\xf7\x27\x1b\x9c\x2f\x49\xe9\x00\x3b\x83\xa6\x91\xd5\x5e\x9c\x94\x50\x53\xa5\x53\x29\xa5\x7e\x87\xae\x85\x89\x4e\x8a\x89\x89\xbd\x0a\x08\xcc\xca\xba\x48\xf0\xb3\x42\xf0\x70\x23\x8c\x13\x88\x75\x2e\x33\xa5\x92\xec\x8a\xbc\x2e\x3b\xaa\x1a\x44\x3d\x90\xec\x33\x65\x55\x37\x79\x42\xe4\x86\xba\xe4\x3d\x96\xc6\x32\xb3\x21\xe4\x05\x0e\xa0\xc7\xce\xf5\xf4\x43\x07\xd8\x17\xc6\xd8\xbf\x76\x8b\x9d\x2f\xe3\x84\x12\x86\xfa\x1f\x1c\xd3\x60\xe4\x63\x23\x4b\x29\x26\x66\x60\xc5\xe0\xd4\x61\xf1\x81\x84\x23\xb4\x84\x61\x33\xcf\x0a\x95\xa1\x3c\x11\x1b\x90\xb6\x26\x8b\x8a\x9a\x21\xd3\x88\xfa\x18\xca\xe1\x37\xe5\x15\x68\x57\xa6\x82\x13\x9d\x26\x75\x1b\x96\xf6\xac\x68\x70\x3e\x5f\xba\x09\x7e\x94\xa2\x3d\x6e\xf1\x15\x5c\x67\x7b\xa2\x56\x00\x13\xa1\x10\xa5\x95\x2f\x03\x35\x25\x20\x7b\x53\xff\x1d\x06\xd4\xc5\x9c\xf8\xda\x18\x1b\xb6\x00\xfe\x17\xc7\x2e\xc3\xc1\xae\xa1\xf1\xc2\x9e\xde\x0b\x01\x37\x24\x78\xe3\xd8\x90\x5a\x1f\x99\x35\x80\x79\xcf\xc3\x4d\xaa\xee\x08\xb9\x68\xc3\x69\xdc\x72\x49\x26\x6b\xbc\x88\x3b\x71\x12\xe6\x8a\xe9\xa0\x2d\xaa\xa6\x8d\xae\xe5\x7e\x57\x34\xf4\xba\x84\xc9\x66\xd8\x2f\x28\x2e\x5f\x6e\x80\xaa\x7c\xb9\x83\x15\xb0\x85\x94\x51\x39\x03\xf5\xf8\xe3\x94\x63\xe0\x62\x05\x05\xee\x35\x63\xec\xbb\x46\x86\x23\x9e\xcb\x22\x31\xd3\x82\xc5\xeb\xfb\x7f\xec\x05\xcf\x1e\x7c\xac\x99\x3a\xd4\x34\x86\x31\x32\xc4\x61\x89\xf4\x87\x6f\x82\x3e\x38\x8b\x54\x22\x7f\xe2\x93\x09\x94\x20\x44\x7c\xff\x08\xb8\x10\x97\x9d\xec\xb3\x4d\x36\xa1\x52\xaf\xf8\xeb\xac\xbe\xad\xca\x44\x76\x4b\x5b\xb0\x4e\x2a\x85\xa3\x65\x8a\x6e\xcb\xcb\x1c\xc4\x87\x81\xce\x2a\xe7\xaa\x8e\x28\x1b\xec\x7d\x63\x8c\xdb\x36\xdc\x2c\x32\x8e\x7c\xf7\x6e\x88\xbc\x2d\xc2\xc8\x7f\xf5\x58\xb0\xa8\x7e\x70\xd4\xb1\xf6\xf2\x01\xb1\x40\xcf\x7f\xa6\x8a\x56\x9d\x14\x94\xf3\x00\x02\x02\x3b\x53\xf0\xb3\x1e\x7b\x87\xc7\x26\xba\x59\x74\x3a\xbe\x28\x22\xff\x4d\x5e\x70\x6e\x81\x7e\x0c\x22\xe4\x5d\xb4\xae\xfb\x9d\x36\xf7\x0e\xef\x29\xec\xc9\xbb\x3a\xa2\x76\x68\xf9\x7f\xbd\xd6\x81\xc6\x1d\x02\xa5\x42\xf7\xe2\x5f\x5d\x13\xdc\x39\xf0\xb4\x3a\x22\x3b\xe7\x2b\x5d\x8a\xd6\x37\x52\xc4\xcd\x45\x37\x89\x9b\xa1\xeb\xe3\xfb\xba\x6b\xd8\xdf\x7b\x8c\x35\xe5\xc9\x41\xc0\x9d\x3f\xf3\x82\x73\x8b\x6e\xdd\x24\x16\x98\x9b\x07\x81\x7c\x42\x0b\x69\xa7\xa0\xb6\x0a\x51\x1e\x2e\xdc\xce\x34\x76\xee\x07\x3a\x64\x0e\x66\x55\xcf\x76\xc4\x2e\x49\xb2\x71\x19\xec\x12\x7b\xab\xc7\x1e\x43\x9d\x5d\x14\x68\x2d\xf3\x5f\xed\x05\x2f\xf2\x2a\x0f\x01\x43\x5b\xb2\xf1\xca\xec\xea\x62\xb6\x93\xc4\x36\x08\x94\xa2\x0d\x75\x6b\x22\x95\xcc\xa4\x70\xcc\xd6\x88\x5c\xde\x14\xfc\x59\xc7\x6a\xba\x41\x5c\x24\x57\xae\x7f\x97\xc7\x1e\x43\xd2\x83\x2a\xe0\xbf\x51\xc3\x3b\xbd\xd4\xab\xbc\x1b\x44\x46\x82\x56\x95\x91\x86\x8c\x31\x23\xa0\x75\xb4\x84\x63\xbf\x57\x23\x34\x60\x38\xab\x7d\x92\x67\xd4\x14\xb9\x57\x5c\x8b\xe9\xfd\xe6\x3f\x53\x75\xf4\x54\xfe\x30\x74\xd0\x6d\xe7\xdd\x1e\xbb\xd6\xed\x87\xff\x66\x2f\x78\xb5\xe7\x3e\x7b\xa4\x97\x4f\x8d\xab\x5e\x59\x88\x9a\x7a\x31\x69\xaf\xe6\x3f\x79\xec\xda\x66\x96\x24\xd0\xb5\xd9\xac\x97\x96\xfe\x9f\xeb\xc5\xfc\x9c\xe7\xbe\xd2\xd7\x37\xfc\xc8\x5a\xbc\x1d\x16\x6d\xae\xcb\x98\x5c\x2f\xf6\x69\x07\xe5\xee\x88\xf5\x05\xdc\x69\xcb\x3d\x26\x54\xd1\x01\x68\x2b\x06\x43\x62\x98\x02\x0f\xd0\x6c\x87\x69\x5c\x74\xd0\x4c\x16\xdb\x59\xf6\xd0\xec\x6c\x0c\xae\xd4\x87\x54\x6c\x4a\x42\x31\xab\x5b\x1b\xbe\x39\xfe\x9b\x7d\xea\x68\x93\xfc\x88\x9e\x81\xef\xf3\x2a\xef\x1e\xa5\xed\x5c\x39\xf2\x95\x94\x19\x1e\xf3\x15\x7c\xd9\xdd\xb8\x19\xe4\x5e\x7b\x50\xa7\x47\x7c\x97\x37\xf8\x5a\x75\xbc\x93\x15\xa0\x75\x91\x24\x71\xcd\xbc\xd5\x70\x68\x38\x7d\x71\xe1\xae\xe1\x7c\x69\xb1\x35\x5a\x45\x63\x15\x39\x5c\x58\xb5\xd5\xc8\xd4\x15\x17\xda\xa2\x9a\xa5\xbc\xd3\x23\xc5\x10\x4d\xd2\xcc\xc2\x3c\x69\x36\xdc\xe1\xfd\x80\xc7\xae\x81\x84\x64\x7a\x3d\x5e\xa0\x96\xa3\xe5\x3c\xdf\xd5\x5a\x60\xb6\x5a\x29\xec\x84\x80\xd6\xda\xe7\x9a\xba\xbb\xdd\x79\x9d\xc7\x6e\xab\xe4\xfe\xcc\x72\x92\x29\x4c\x90\x80\x48\x5a\x4b\x3d\x04\x26\xef\x25\xa2\xc0\x5c\x9a\xa0\x1c\x5e\x76\xee\xb8\xd3\x6c\xce\x4e\x80\x78\x4b\x70\xd4\xa4\x3f\x2c\x33\x2e\x24\x0b\x2b\xb7\x73\x2e\x6b\x41\xc4\xa4\xc5\x61\x49\xec\x5e\x32\xe1\x00\x58\xb5\x92\x6c\x93\x06\xa7\xfb\xb4\x90\xc7\x59\x1e\x97\xfd\x33\x62\x43\x24\x8e\x90\x0c\xfd\xfa\xb5\x83\xc1\xbd\x5b\x17\xa9\xb8\x02\x0e\xaa\x23\x79\x97\xbe\xe7\x89\xac\x40\x8a\x74\xf2\xd2\x73\x06\xfc\x77\xfb\xd9\x57\x3d\x76\x10\x58\x4a\x11\xf9\x5f\xf6\xd8\xb9\x91\x57\xee\xb0\x51\x9c\xc1\x0f\x47\xf7\x34\xf8\x41\x6f\x85\x6a\x5f\xb1\x39\xc6\x6c\xd3\x12\xaa\x73\xa1\xdd\x67\xd0\x3f\x82\xaa\xad\x8e\x60\x20\x2d\x05\xe5\xdd\x01\x5a\x8d\xb9\x2b\x28\x85\x1d\x88\x63\xfd\xae\x00\x6f\x8f\x95\x80\xea\x0b\x56\x1a\xec\xfb\xf6\x11\x8c\xd9\x3f\x8e\x07\x7f\x35\xae\x0a\x69\x2a\xaf\x90\xc0\xe1\x90\xb9\xcd\x23\xf8\x36\xe5\x83\xcd\x90\x0d\xa7\xd9\xd6\x1a\x02\x32\x6d\x41\x70\x01\x9f\x31\x12\xd4\x4a\x70\xea\xa2\xec\x65\xb0\x02\x1e\x0f\xc4\x1c\xeb\x19\x50\x3a\xda\x4a\x83\x72\x62\x30\x67\x85\x6e\x35\x24\xf6\xff\x08\x6a\xa4\x7a\x38\x7b\xa9\xd8\x10\x39\x7a\xda\x46\x93\x30\x0b\x94\xed\x22\x12\x65\x1e\x36\x4b\x43\xdb\x9a\x61\x37\x6c\xca\x16\xc0\xe3\xc0\xd1\x10\xa0\x8b\xa3\xdb\x85\xa2\x3a\x0c\x3d\x93\xf6\x38\x8e\x84\x93\xdb\x8e\xe5\x39\x61\x2e\x9e\x33\x30\x7f\xa8\x51\x39\xb2\x3a\xc9\x8b\xcc\x4d\x9f\x0d\x99\x6f\x69\xe7\x98\x5e\x43\xfe\x4d\xa7\xe3\xe2\x22\xe5\x99\x4e\xfa\x48\xf8\x06\x9a\x1e\x7e\x46\x1f\xf2\x56\xd8\x63\x1d\xd6\xaf\x97\x02\x57\x3b\xef\xdf\x5d\xe7\x51\x5c\x34\xf3\x18\xcc\x79\x59\x7e\x12\x64\x4c\xc6\xc9\xfd\xb3\x5e\x66\x75\xeb\xbd\xb8\xab\x7f\x12\xc0\x7b\xa8\xb3\x27\xd5\xee\x65\xec\x8d\xfb\xd8\xf1\xd1\x76\xb8\xc5\x5e\x3a\x53\x9c\x2f\x44\xae\xd0\xf1\x30\x6f\x58\xe1\x7f\x65\x3c\x78\xce\xa8\x97\x8e\xae\xdf\x80\x20\xf6\xbb\xe8\x76\x0c\xb9\x37\xa9\x64\xc5\xf3\xcb\xfe\x40\xd2\x02\x49\xc3\x1c\x5a\xf0\x17\x63\xec\x1f\x3d\x76\x20\x07\xcf\x14\xff\x6f\xbc\xe0\x5d\x1e\xfe\xad\x93\x5f\x2b\x2b\x1f\x3d\xce\x5a\xbc\x17\x47\x85\x03\xa1\x83\xe9\xb5\xe6\x29\x81\x30\x18\x13\x92\x78\x5d\x58\x50\xa0\xca\x98\xd8\x8b\x23\xf4\x25\x2a\x7a\xdd\x6e\xd2\x37\x2f\xa0\x76\xe3\x01\x56\x48\xb6\xa1\xd0\xae\x22\x22\x8d\xcc\x82\x02\xb9\x38\xdb\x2b\x4a\x98\x2e\x47\x7c\x38\xc1\xa6\xb7\x48\x9a\x53\x59\x8a\xf9\xb9\x45\xd9\x28\x5b\x67\x30\x2d\x7e\x33\xb8\x20\xff\x35\x29\xab\x6c\xb0\x49\xd0\x33\x44\x71\xb3\x54\xb3\x0a\xd3\x02\x9b\x51\xaf\x9a\xc2\xb3\xb3\xa7\xa6\x10\xa5\x73\x49\xfc\xae\xc7\xbe\x63\x44\x5e\xc9\x7b\x44\x18\x89\xdc\xff\x80\x17\xdc\x61\x7e\x3a\x6e\xd8\x4d\x04\xc9\x6f\xe3\x1b\xcb\x7f\x2a\x4e\xb9\xfc\x84\xd2\x12\x6a\x35\xde\xfe\x8d\x01\xc5\xdd\x33\xd9\x51\xd2\x73\x04\xc1\xbf\x02\xaf\x02\xac\x0c\xe9\xab\xb6\xdd\x52\x6f\x6b\x0c\xab\xf0\x6f\x08\xbe\x65\xa0\xb0\xa9\x9c\x4a\xff\xb5\xc7\xbe\x7b\x84\x26\x61\x2e\x14\x9d\x2c\x3d\x45\x46\x91\xc2\x7f\xd0\x0b\x4e\x0f\x79\x0e\x3a\xf8\x82\xf2\x44\x64\x5d\x41\x36\xcd\x08\x4a\x99\x64\x76\xe4\xb3\x28\x2b\x70\x65\xfc\x8c\x75\xd8\x63\x08\x40\x4b\x55\xea\x3f\x73\x8b\x2d\xa1\x51\x88\x9c\x7e\x04\x87\xd5\x5f\xb2\x29\x64\x9c\x9e\x46\xa8\x5e\x31\x65\x3f\x97\x1d\x69\xb0\xff\x3a\xc6\xfe\xdd\x90\xea\xc8\xe2\x1b\xa1\x86\x47\x1e\xab\x1b\xdd\x47\xce\xb2\x92\x16\xc7\xb2\xb5\x82\x37\x69\x24\xf4\x42\xb2\x48\x6c\xc4\x4d\xb1\x50\x4d\x48\xf4\x06\x8f\x09\x66\xbd\xf4\xef\x0b\x9e\x3a\xa7\x7f\x55\x75\x00\x58\x0e\x53\x11\xa1\x97\xe4\x70\x9b\xaf\x22\xb3\xf6\xda\x1e\xa3\x5d\x73\x24\xf8\xf6\x73\x96\x46\x4c\xf7\x79\x10\xf8\xfe\xf3\xc3\x7d\x6e\x2d\xbc\x27\x9c\x8a\xd3\x71\x22\xfc\x9f\x3e\x14\x3c\x63\xe8\x1b\x27\x87\xb3\x15\x98\xe3\x92\xb8\x96\x2c\x49\x0e\x11\xb6\xe7\x22\x6c\xd4\x61\x99\x9c\x3e\x38\xc1\xfe\xd2\x63\xd7\x29\x05\x0c\x24\x6b\x5e\x14\x2d\xff\x77\xbd\x1d\x40\x56\x2d\xda\x5f\x69\x1d\xd9\x9b\x3d\xe5\xbc\x6f\xd9\x1b\xaa\xce\x25\x27\x91\x53\x31\x86\x24\xeb\x42\xd4\x97\xe9\x11\x7c\xd8\x68\x76\x7b\x35\x2a\xd0\x40\xd3\x41\x4d\x17\x92\x2f\x9d\xaf\xa8\xc4\x24\xd0\x6d\x92\x55\x92\xbe\x81\x30\x6b\xb0\xb7\x79\x6c\xa2\xa5\x06\xfa\x06\x6f\x07\x98\x60\x68\xc0\x73\x87\x19\x2a\x32\x7c\x92\x9b\xf1\x22\x41\xc8\x54\x3e\x98\x88\x86\x09\xa6\x4d\x54\x03\xd5\x28\x64\xa1\x66\xa2\x65\x4c\xce\x6d\xc8\x48\x69\x3a\xfa\xa1\x71\xb6\xaf\x93\x45\xc2\xff\xf9\x71\x25\x65\xfc\xc8\xb8\xca\xaf\x79\x92\xcb\x57\x7c\x55\xce\x9a\x4e\x87\x2e\x4a\xde\x15\x39\x59\xaa\x0a\x0b\xac\x2e\x11\x35\xcd\x34\x86\x29\xcf\x9a\xa5\x32\x5b\x6b\xd8\xe7\x63\xc7\x8e\x61\x3e\x9a\x63\xb7\xdc\x72\x0b\x07\x4e\x34\x12\xcd\xb8\x33\x58\x10\x4a\xdd\x34\x3d\xdd\xe0\xf7\xcf\x9c\x3d\x43\xf6\xfd\x82\xaf\x66\x65\x9b\x6a\x06\x26\xcc\xfe\xb8\xa8\xf1\xa7\x2e\xdd\x7b\xce\xa4\x66\x74\xdf\xc2\x55\xa6\xc7\x03\x57\xe8\x90\x6c\xdc\xca\x39\x04\xc1\x0d\xcf\xca\xe2\x6e\x62\x4b\x4c\x51\x1e\xaf\xb5\x55\x96\x6e\x29\x17\x24\x31\xf9\x19\x10\x8f\xa7\x38\x04\xf4\x4d\x00\x93\xa6\x39\x3b\xb2\x0f\x35\xbc\xb4\x5b\x05\x84\xcb\xd6\xb4\xf9\x33\x17\x45\x2f\x29\x95\x92\x19\x2b\x33\x6b\x80\x17\x9c\x25\x9c\x7d\x49\x65\x48\xfb\x9c\x17\xfc\xa6\x67\x76\xcb\x02\x65\x40\xa3\x3a\x13\x4c\x9a\x09\xc4\xc8\xd6\xb1\x43\x77\x28\x25\xad\x72\x7c\x3c\x6b\x39\xb9\x86\xab\x45\x96\xf4\x4a\xc8\x91\x4d\xc7\x0a\xbe\x3b\xdc\x68\x1c\x56\xe9\xd2\x54\x12\xf9\xb2\x55\xbf\x95\x13\xcc\x25\x2a\x3d\x5a\x71\x5e\x94\x3c\x2e\x45\xc7\xe8\xf4\xed\x9e\x68\x77\x5a\xe4\x3d\x60\xfa\x64\xcd\x36\x61\x7b\xdb\xf5\x43\x69\xbe\x0b\xe5\xe7\x3f\x70\x7d\xf0\x8b\x9e\xfb\x8c\xaf\xc6\x28\xa9\xa3\xbf\xfb\x49\x7e\x54\xd2\xf9\xb0\x03\xee\xaa\x91\xc8\x8b\x32\xcb\x0c\x16\x30\x2e\x40\x57\xe4\xed\xb0\x5b\xc8\xa7\x5d\x91\x03\xf8\x6c\x98\x90\x3b\x6e\x51\x43\xc9\x29\x35\xd0\xf0\x47\x51\x02\x4c\x9b\x71\x37\x4c\x34\x66\x3b\xcc\x9b\x49\x65\x44\x8e\xa1\x4a\x6c\x16\x11\x7c\x46\xb0\xc1\x08\x78\xe7\x6a\x81\xbf\x78\xed\x9e\x33\xca\x6e\x9d\x51\xbe\xe0\xb1\xc7\x87\xbd\x32\x83\x4c\x3b\x43\x60\x1f\xfd\xf7\x7b\xc1\xdb\xbd\x99\x2d\x4a\x0c\x11\x58\xbb\x59\x64\xb8\xa2\x90\xf4\x76\x14\x62\x09\xee\xbe\x72\xd7\xd1\x8c\xa2\x62\x05\x1d\x57\x4b\xa8\x0f\xba\x13\x96\x94\xa0\x8b\x12\xe5\x81\x47\x0a\x1c\x74\xcc\x8b\x1b\xc9\x82\x26\xe0\x01\x85\x2b\x27\x55\xce\xff\x1e\x67\xd7\xc5\x9d\x70\x4d\x2c\xf4\x92\x04\x71\x15\x0b\xff\xb7\xc7\x83\x97\x8d\xcf\x57\x9e\xba\x7e\x16\xda\x87\xbf\x40\x1a\x4e\x45\x52\x23\x00\xa4\xb6\x1e\xa6\x57\xa0\x22\xb1\xdb\x03\x04\x71\x4c\x12\xda\x01\xf4\xeb\x38\xc5\x99\x20\xf9\x5a\x87\x06\x80\xce\xcc\x99\xc8\x06\x1f\xe8\x13\x80\x75\x43\xe0\x85\x12\x99\xd5\x9b\x55\xd1\x0c\x65\xab\xea\x37\x9d\x24\x95\x51\xd0\xa4\x54\xc6\xf0\x81\xa1\x35\xe3\x3d\xa8\x0c\x73\xa4\xff\x22\x0e\x75\x37\x8e\xa1\x38\xf2\xa9\x1b\xf0\xaa\xe8\xc7\xe9\x5a\x1d\x1e\xc9\xd9\xa1\xa9\xac\x67\x69\x3d\xac\x77\xb3\x68\xe7\x06\x96\xad\x92\xfa\xed\xb9\x53\xed\xc2\x9d\xea\x33\xb6\x3b\xd5\x83\xbb\x76\xa7\x7a\x71\xd5\x9d\xea\x70\xa1\x1d\xaa\x1e\xf1\x21\x6a\xc0\x9c\x5f\x1f\x63\x07\x69\xaf\xf9\xbf\x30\x16\xbc\xc5\xb3\x8e\x79\x69\xc1\xbe\xa8\xa3\x3d\xe8\x2f\x0c\xd7\x9a\x4d\xc3\x94\x67\xca\x90\x83\x7b\xf9\x67\xc5\x28\x24\xa7\xb0\x0b\xf6\x41\xb8\x91\x1d\xdf\x41\x92\xf9\xca\x19\x78\x64\xd0\xa4\x2e\x6c\xef\x92\x75\xc2\x9f\xae\x2b\xb0\x15\x67\x5e\x2a\xce\x55\x1a\x5e\x2a\x08\x18\xfb\xb9\x09\x16\x58\x63\xca\x57\xc3\x26\x20\xfd\x62\xbc\xd2\x62\x96\x08\x00\x85\x7a\xd9\x44\x30\x55\x79\x36\x0c\x13\xca\x2a\x52\x0c\xc5\x83\xfa\xd4\x81\x3d\x2e\x61\xb7\x5c\xc2\x9a\x82\x50\x7a\x76\xf0\x04\x0d\xa1\x64\xae\x4c\x7b\x0d\xec\xcd\x7c\x8c\x35\x58\x6d\xe4\x66\x1e\xb2\xf0\x7b\xc4\x7c\x17\xc4\xbc\x65\xd1\xf2\x67\xee\x0e\xf3\xec\xdb\xb7\xa0\xe3\x0f\x79\xe9\xf6\x84\xe1\x69\xfe\x7c\x7d\x38\x05\x80\x55\x77\x4d\x63\x15\xb7\xcd\xca\xa1\x67\xec\xa3\x87\xd8\x33\x4d\xff\xc5\xc5\x52\xa4\x20\x50\x1b\xec\x7b\x07\x67\xc5\x14\x30\x09\x5a\x40\x43\xa9\x14\x24\x73\x7a\x5e\x80\xd0\x7c\x65\x22\x78\xda\x56\x05\x2a\x7b\x7d\x44\x49\x9a\xa9\x11\xa0\x74\x2f\x3a\xb8\x47\x84\x76\x4b\x84\x3e\xe0\x29\x2a\xf4\xb3\x5e\x70\x33\xfc\x85\xab\x22\x05\x90\x8d\x38\xea\x85\xc9\xb6\xab\x63\x53\xa7\x36\x6b\xb1\x68\xd4\x29\x79\x38\x77\xd9\x1e\x55\xdb\x05\x55\x9b\xb7\xa8\xda\xe5\x78\xb1\x0d\x52\xb5\x87\xbc\x17\x6c\x4f\xb8\x9e\xe1\x5f\xb0\x11\x92\xac\x55\xae\x52\xa9\x2d\x28\xc6\x50\xc4\xa4\xb7\x5f\xcb\x6e\xde\x89\xc7\xfd\x62\x2f\x11\xf7\xc5\x65\xfb\x5e\xed\xc7\xef\x7f\xf5\x9a\xe0\x45\xde\xe0\x73\xca\x82\xd6\xeb\x26\xa0\xa6\xb2\x5e\xc8\x23\xac\xba\x56\xa8\x94\x26\xf2\x18\x77\x3a\x22\x8d\x90\xd7\xed\x84\xeb\x82\x9b\x0c\xcf\x61\x42\x91\x83\x50\x9d\xb8\xd8\x0d\x71\xdc\x20\x2e\x02\x5e\x80\x6b\xd3\xf8\x9d\xab\xd9\x2f\x79\xec\x2a\x43\xd1\x0a\xff\x9d\x5e\xf0\x2a\xcf\x90\x34\xcd\x70\x4b\xd1\x7e\x43\x3d\xb3\x1d\x26\xa5\x2c\x0b\xc9\x2d\xe4\xfe\x3b\x7c\xf4\x30\x45\xef\xe9\xc2\xa0\x79\xa4\xe7\xb4\xe3\x51\xf5\x68\x10\x9d\x40\x28\x4f\xe2\xa6\x81\xce\xcb\x52\xe1\x58\x59\x47\xa6\x3a\x7f\xcb\x18\x63\x26\x58\xc2\x7f\xcd\x58\xf0\x75\xcf\x9d\x5c\x88\x01\x35\x4f\xc0\xb2\xa0\x83\xaa\x30\xfc\x32\xcc\x45\x41\x70\x5c\x75\x3e\xbb\x78\x6a\x66\xf9\x54\x8d\x9f\x5f\x98\x83\x7f\xe7\x4e\x9d\x39\x25\xff\x9d\xbd\xf7\xdc\xb9\x53\xb3\xcb\x3c\xcb\xf9\x51\xd4\x8d\x25\x89\x71\x8d\xcf\xdc\x75\x0b\xd3\x3e\x6f\xf5\xc0\xcf\xd4\x34\xe6\xf4\x42\xae\x16\xbc\x8d\xc8\xbe\xf9\x88\x4d\xd1\xeb\xf7\xb1\x43\x7a\xb1\xfc\xef\xdf\x17\xfc\xf9\xb8\xde\x56\x55\xad\x89\x7a\x8c\x17\x55\x2f\x11\x3c\xec\x76\x13\x70\x09\xc9\x1a\x8c\x9d\x36\x08\x13\x27\xf9\x61\x29\x5d\x1d\x26\xb3\x3d\x7a\xb3\xc3\xa3\xa9\x24\x5b\x3b\xac\xad\xf9\x82\x27\xd9\x9a\x24\x56\xb6\xdd\x82\x4a\x1f\x55\xc5\xd0\xcb\x9b\x1a\x47\x8d\x07\xb9\x29\xe4\xe6\x00\x60\xe5\xce\x37\x76\x01\xbb\xde\x29\x88\x93\x70\x4a\x42\xe0\x44\xa5\xc2\xa3\x53\xc3\x7b\xa0\xd4\xd3\x71\xee\x7e\x01\xe8\x36\x9b\x71\x12\x35\x25\x57\x55\x5d\x2c\x0b\xce\x03\x66\x0e\x43\x8a\x31\xff\xba\xa9\x9a\xfc\x28\xb2\x0d\x91\x27\x61\x17\xb5\xc0\x10\xed\x01\xca\xef\x06\x63\x73\xa2\x2b\xd0\x97\x9c\x4c\x91\x22\x6d\x26\x19\xc8\xae\x78\x6c\x6b\xee\xb0\x51\x37\xaf\x34\xd8\x28\x06\xef\x6c\x63\xfc\xc4\x38\xdb\x0f\x98\x4f\xfe\x1b\xc6\x83\xff\x3c\x0e\x7f\x56\x9c\x80\xf0\x99\xe6\x5c\x7a\x89\x68\xf0\x6a\x7e\x35\x1e\x10\xb3\x17\xd4\x78\xa0\xdd\x9b\xa2\x00\x99\x90\xe0\x68\x60\x0a\xd8\x3e\x1e\xa0\xbd\xaa\x40\x4f\x99\x51\xc1\xe4\x01\x1c\x8f\xdd\xb4\x71\x9e\x92\xe4\x88\xd8\x01\xb4\x4a\x39\x15\x35\x9c\x8e\x0c\xb4\xaa\x75\x7f\xdb\xb7\x28\xbb\x6f\x7d\x5e\x82\x69\x13\xdd\x68\x68\x72\x72\x21\xa7\x13\xf1\x2d\x1a\x7c\xc9\x59\x1a\xaa\xcd\x99\x47\xb9\xab\xba\x61\x8e\x41\xc0\xe4\xa3\x6d\x67\x31\x0c\x8e\x06\x8e\x55\xff\xbd\x1e\x3b\x14\x76\xe3\xbb\x31\x13\xd8\xdb\xbc\xe0\xe5\x92\x3c\xe3\x4f\x9b\x38\x63\xaa\xb0\x1d\x91\x66\x2c\xfa\xc8\x52\x9d\x5f\x1a\x73\x23\xb1\x76\x98\x78\xd2\x7f\xc9\x58\xb0\xbe\x5d\xa1\x6d\xd3\x51\x02\x7d\xde\x51\x12\x4a\xe7\x3a\xfc\x7e\x8f\xbd\xd4\x63\x87\x00\xd7\x0d\x7c\x2c\x2f\x2a\x1b\x61\x73\x41\x3d\xab\x38\xf0\x62\x0a\xdf\x84\x87\xa5\xc6\x34\x72\x7d\x10\x8d\xed\x5b\x57\x2b\xf7\xa7\x5a\xf0\x0d\x15\x27\x73\xac\xe2\xf4\x39\xc1\xfe\xed\x68\x43\x10\x88\x3c\x1f\x9c\x08\xbe\xcb\xfa\x0d\x99\x5d\x6d\x6a\x4e\xba\xfa\x11\xc2\xcc\x4f\x1e\xdc\xe3\x68\x77\xc1\xd1\x7e\xda\x56\xba\xfe\xda\x2e\xd1\xc9\xad\x08\x56\x07\x9e\xfc\xd1\x1c\xdc\x9e\x68\xbb\x5b\xd1\x76\x59\x49\xb6\x4f\x0b\xae\x3b\x53\x39\x83\x36\xa1\xac\xb1\xa3\x3b\x80\x95\xa1\x93\xfd\x90\xb7\xb4\xbd\xbc\x73\xcc\x6f\x54\x34\xb8\x83\x02\x8c\xab\xbe\xfd\xd4\x35\x8e\xfa\xb6\x0a\x82\x3e\xbb\x34\x7f\x2e\x8b\x84\xff\xf6\x6b\x82\xdf\xda\x3f\x77\x6a\x61\xf1\xd4\xec\xcc\xf2\xa9\x39\x5e\x47\x77\x00\xa8\xc8\x8e\x5d\xa0\xf2\x92\x7c\x44\x26\x4d\xcb\x6a\x5f\x01\xd6\x4d\x6d\x4c\x4f\x51\x19\xcc\xc3\x47\xd6\x71\xcc\xf0\x9d\x95\xda\x5b\x81\x56\x8d\x3c\x71\x1a\xba\x62\xa4\x6d\x43\xd0\x73\x93\xc4\xc2\xf4\x28\x20\x5d\x0b\x62\xd7\x00\x42\x27\x04\x84\x39\x05\x88\xfd\x52\x59\xc5\x2d\x3f\x1f\xd5\x14\x11\xb3\x28\xce\x45\xb3\x4c\xfa\x0d\x3e\x53\x00\x90\x1a\xda\x40\x45\x1f\x73\x3f\x13\xbc\x45\x1d\xeb\xad\x2b\xf9\x2f\xe7\x45\x1c\x89\x66\x98\x1b\xb7\x9c\x9a\x6d\x96\xa3\x98\x42\xc7\x38\xda\xcd\xba\xbd\x64\x44\x2f\x54\x74\x83\x19\x82\xec\x86\xbc\x49\xe4\xb4\xab\x4a\xbb\x00\xca\xc1\x1d\x21\xd4\x4c\x5d\x58\xb8\x56\x4f\x0c\xbb\xc0\xa9\x21\xd8\x27\x6a\x0d\x3c\x3d\x0a\xc9\x6a\x02\xba\x23\xf2\x3d\x04\x5b\xea\x70\x3e\x06\xb0\xa5\xb0\x43\xb3\x52\x3d\x2f\x80\xc1\x2b\x7f\x28\xd7\x36\x1d\xf6\x20\x27\x73\x93\x8b\x34\xeb\xad\x11\x06\x5d\x5c\xf2\x28\x13\x45\x7a\xb8\x34\xcb\xa1\x2f\x15\x77\x1c\x61\xca\xef\xdd\x4c\x45\xbe\x68\xd9\x61\xc3\x92\x93\x83\x1f\x91\x0d\x37\x20\x33\x35\xb3\xd9\xb8\xe4\x01\x4a\xb5\x73\x0f\xfe\xcf\x03\xec\x7b\x2d\x52\xde\xdd\xad\xf9\x6c\x4a\x13\xef\xd4\xc6\x82\x57\x73\x41\x58\x6c\xd0\x2b\xc8\x3a\xca\x22\x82\xce\xfe\xf7\x5b\x38\x4d\x8d\x38\x9f\x80\x8c\xfd\x9d\xc5\x56\xd0\x33\x54\x72\x8f\xba\xef\x01\x7e\x7c\x03\x53\x41\xac\x6c\x7f\x87\x3d\xd9\xbf\x6d\xbb\x54\x10\x6a\x2f\x0f\x53\xcc\x7d\xe0\x80\x13\xd1\xda\xcc\x90\x31\x57\xfa\xb8\x33\xf2\xa6\x81\x38\x98\x57\x1e\x08\x8e\xe8\x5f\xb4\x84\x83\x78\x4d\x50\xc2\x15\x0e\x3e\xb7\x9f\xbd\xdc\x63\x57\x85\x4d\x90\x7d\x96\xe3\x8e\xf0\x9f\xcf\x6e\xbf\x02\x62\x71\x36\x6e\xe6\x99\xfc\x3e\x38\x69\x55\x46\x7a\x40\xf9\xd7\xa6\x02\xc8\x55\xb1\xac\x78\x4f\x6e\x4a\x02\xd8\x24\xc9\x8b\x09\x76\xad\xbc\x14\x45\x3e\x4f\xfe\x59\xfe\x52\x70\xda\x7d\x62\xe0\xe7\x65\x65\xda\x8f\x4b\x01\xa1\x41\x59\x1c\xae\xd3\x90\x23\x7d\x7e\xcc\x63\x8f\x83\xa7\x73\x2a\x52\x48\x34\xb3\x34\x2a\xfc\x77\xe9\xa0\xb9\x37\x78\xc3\x0a\xe0\x78\x22\x15\x3f\xa4\xdc\xc5\xa2\x38\x0a\xd5\x75\x1f\xd2\xc0\xd4\x65\xbc\x19\xc6\xa5\xe5\xd7\x8f\x43\x85\xdc\x6f\x0a\x95\xaa\x23\x42\x50\xa7\x84\x6b\x72\x58\x25\x4e\x57\xd6\xe2\x49\x28\xd9\x2d\x15\xd3\xb6\x28\x52\xb1\x29\xe7\xd4\x15\xa9\x72\x76\x1d\xb4\xb7\x9c\x87\x69\x41\x11\xc7\xcf\x56\x83\x98\xaf\xbe\x1a\x8c\x36\x2b\xad\x97\x30\x6b\xd8\x7b\xe5\xc2\x89\xf3\x59\xb8\x6d\xbe\xc5\x63\x87\x72\xd5\x1d\xff\xb5\xde\x2e\x37\xcc\xa2\xae\x6b\xab\xed\x62\xaf\x2c\xf6\x51\xde\x9d\x30\x47\x2a\x3e\x0f\xc5\x7c\xb9\xd8\xec\x6d\x63\x43\x41\x3d\xef\xc9\x8a\x72\x26\x89\xc3\xc2\x7f\xe9\x58\x90\xe9\x5f\xc4\x89\x41\x68\x61\xd8\xed\x4a\x3a\xa7\x26\x60\x7e\x01\x11\x45\x28\x9f\x76\x61\x05\x37\x80\xe7\xa8\xca\x84\x8c\xb0\xc7\x69\x99\xf7\x2d\x37\xa7\xc3\x05\x7c\x88\x7e\xb5\xee\xc1\x7b\xa9\xc7\xce\xb0\x43\xba\x5a\xff\x29\xc1\x0d\xf7\xe8\x36\x14\x83\x14\xae\x66\x1b\x02\xba\x10\x45\xb9\x28\xb6\xca\x6e\xce\x6e\x62\x63\x71\xd7\x9f\x0a\x02\x53\xdc\x1c\x8a\xa2\x44\x37\x51\xc4\xe9\xb5\x3f\x7b\xf1\xfe\x6d\xb3\x25\x0c\xc5\x96\xf9\xc4\xbe\x3d\x6c\x99\x47\x09\x5b\xe6\x20\x8d\xc5\xd9\x3f\x9f\xf0\xd8\x4b\x3c\xa6\x5e\xf9\xfd\x2d\xb0\xb0\x47\x67\x4d\x00\x3c\x13\x95\xdd\x43\xcd\x98\x43\x5f\xdd\xe5\x1b\x9a\x3b\x61\x04\x56\xe1\x65\xc1\x80\xfc\xb5\x37\x34\xf4\x61\x56\x89\x1b\xa0\x7b\x5a\x44\x97\x27\xff\xa3\x5e\x70\xeb\xd0\x37\x48\x3e\x94\x67\x94\x05\xdc\xa0\xc5\x16\xf7\x0c\xbe\x80\xf5\xd9\x21\xc2\x7a\x9d\x29\xfd\x84\xdd\x72\x05\x74\x0c\x48\xd8\x34\x50\x2f\x47\x5d\x66\xa1\x70\x2a\x3a\x75\x24\x17\xf5\x49\x6a\x8f\xbd\x68\xdc\xc9\x44\xe7\x66\x6a\x20\x81\xf7\xae\xb0\xb9\x2e\xd2\x68\x21\xcb\x4b\xff\x33\x63\xc1\xad\x83\x8f\x35\x8b\x4c\x2e\xac\x5d\xf9\x6c\x55\xc8\xf1\x6b\xb7\xce\x8a\x79\xec\xe5\x63\xec\x55\x1e\x3b\x80\x57\x80\xff\x12\x7d\xe3\x65\xe7\xf0\x52\x30\x57\x84\xc8\xa5\x30\x87\x75\xd2\x8d\x81\x27\xe8\xd6\x63\x93\x4a\x2e\xa2\x2e\x99\xdb\x2c\xe4\x9d\x1e\xc1\x8d\xea\xa0\x43\x5e\x88\xd2\xa4\xad\x01\x2d\x76\xe0\x5e\x29\x3d\xda\x44\x9d\x60\x65\xd4\x26\x82\x6e\xec\xa6\x55\x18\x81\xab\x86\xfe\xc4\x3e\x56\x1b\xb5\x08\x14\xf3\x96\xae\x49\x52\x4a\x53\xee\x5f\xda\x17\xcc\xb9\x8f\xec\xc0\x24\x30\x8d\xa8\xc8\x2c\x64\x06\xf0\xa8\x68\x0f\xe3\x34\x82\x71\xb8\x2b\xf2\xe0\x38\xfb\x3b\x8f\x4d\xa8\x53\xe2\xff\xb9\xb7\x05\x44\xa4\x3a\x1b\xcb\xfd\xae\x88\x86\xb9\x9d\x06\xef\xf4\x16\xf5\x79\x43\xe9\x52\x15\x40\x24\x5e\x0c\x48\xb0\xe4\x36\xfb\x78\xaa\x59\x47\x83\x04\x4d\x3d\x8d\x58\x8b\x45\xf3\x2d\xeb\x9b\xc2\x8e\xbe\xa0\x81\x9e\x33\x09\x5e\xe0\x37\x6c\x55\x1b\x79\x5b\x7f\xd2\x60\xf3\xec\x2a\xeb\x2b\x49\x46\x96\x1c\x6b\x8d\x4b\x48\xd4\x9e\x56\x35\x57\x40\x36\xaf\xb2\x1a\xf4\xd3\x9d\x8a\xbd\xbd\x32\x4e\x1a\x72\xd1\xca\xbc\x31\x9f\x96\xf7\xe6\x4b\x50\x5f\xb5\x27\xb8\x03\x47\xf6\x84\xbd\xf7\x20\x7b\xc2\xa0\x17\x19\x05\xd7\x63\x48\xaf\xff\xea\x83\xc1\x6f\x78\xf4\xc3\x90\xda\x70\x10\x9f\x9d\x24\xaa\x0c\x00\x26\x72\xc5\xe8\xc6\x10\xff\x96\x67\x89\x80\xd8\x08\x70\xeb\x36\xb6\x4c\x8e\xe7\xa1\x29\x59\x11\x54\x70\x48\xc6\x46\x72\xac\xa0\xf7\xb1\xec\x4b\xa6\xbd\x1a\x46\xf0\x18\x02\x9f\x66\x69\x5d\x19\xa1\x14\x26\x33\x74\x41\xae\x27\x2a\xc9\x60\x83\xc8\x0b\x4a\x8a\x30\xc3\x10\x6c\xdf\xb1\x9f\x7d\xd4\x63\x13\xca\xc2\xe3\xbf\xdf\x0b\x7e\x4a\x1b\x78\x2c\x6e\x4b\x9b\x78\x86\x4d\x6b\x4f\x27\xda\x07\xab\x02\xc8\xd8\x41\x00\x7d\xac\x84\x89\x50\xd1\xa2\x52\x76\xa4\x43\x17\x56\x72\x5e\x0d\x0a\x7b\xa5\x2b\xb1\x77\xd4\x97\x3d\x12\x90\xbf\xe0\x05\x1f\xf7\x40\x40\xce\x5a\x6a\x0e\x07\xe8\x2c\xbf\x80\xf6\x43\x54\x3c\x90\xf7\x7a\x5c\x58\xc3\x04\xcb\xa2\x6c\x38\xa8\xf1\x00\xda\x55\x16\x45\x77\x48\x81\xd6\x62\xcd\xa8\xa0\x93\x1c\x14\x4a\x70\x80\x2c\xed\x01\xa8\xe1\x64\xb7\x48\xd3\x50\xf9\x84\x14\x17\xb9\x80\xbd\x2b\xf7\x45\x9e\x67\xb9\x33\xc4\x27\x11\xe9\x9d\x0e\xbe\xd3\x0e\x54\x1c\x35\x46\xfb\xd3\x8f\x7a\x36\x0e\xc4\xfb\xbc\xe0\xed\xde\xb9\x2a\xed\xb0\x56\x54\x91\x8f\x8a\x82\x6e\x9d\xd4\x0e\x72\xe3\xe9\xda\x6a\x7a\xef\xe1\x74\xc9\x5d\xea\x4c\x18\xc2\x79\x29\x43\x93\xc6\xa2\xb9\x82\x09\xf8\xa1\x6f\x65\x33\x97\x9f\x24\xad\x92\xcb\xcd\xff\xd4\xb7\x04\x3f\xe1\xb9\xcf\x76\x9f\xd9\x8d\x32\x45\x81\x56\x03\x81\x15\x28\xe6\x4f\x2e\x34\x28\x1b\xfb\x59\x0f\x5d\x2e\x88\xc9\x8c\xe2\x02\xfe\x6c\x8a\xbc\x44\xf1\x1f\x74\x5f\x06\xb6\xed\x92\xf7\x38\xd8\x8a\x0a\x8c\xe2\x6c\x9c\xc6\x9d\x5e\xe7\x92\xf7\x18\xd2\x3f\xa8\x17\xce\x81\xfe\xeb\xc7\xb1\xaf\x7a\x6c\xa2\x19\xde\xd5\x4b\xa3\x44\xf8\xff\xc3\xf3\xf7\xad\xf6\x4b\x11\xfc\xa4\x37\x3b\x83\xcf\xf0\x1a\x5e\x38\x75\x56\x05\x90\xf1\xd9\x19\xbe\x8a\xaf\x90\x2d\xda\xac\x24\x5b\x21\xdf\x02\xe1\xa6\x8b\x3b\x4c\x01\x39\xe9\x9a\x3d\x08\x38\x0f\xbd\xd4\xbe\x6a\x30\xc3\x42\x99\xcb\x6b\x25\xcf\xb2\xb2\x50\xdc\x81\x76\x8b\x83\x99\x81\x88\x3f\x47\x71\x73\x03\xfb\x16\x47\x71\x93\xc4\x45\x59\x07\xb4\x8b\x43\xfe\xc1\xb0\xcc\x3a\x71\x93\xb1\x59\xb6\x1f\xe6\x49\x5e\x48\x48\x20\xaa\x66\x69\x95\x67\x84\x22\x88\x80\xda\x16\xa5\xa3\x5f\x7b\xf7\x7e\x36\x74\xb6\xfd\xff\xba\x5f\xb1\x5d\x2f\xda\x7f\x77\xb5\x40\xda\xeb\xa8\xc6\x34\x46\x43\x69\x4c\x14\x4e\x78\x12\xaa\x37\xca\x06\xbf\x27\x5e\x73\x80\x29\x5c\xfb\x3e\x7d\x8a\x46\xf1\x96\xc8\x73\x82\xe8\x01\xb5\x5b\x01\x8e\x1b\x3c\xc9\x36\xed\x0a\xb2\x54\x40\x36\x90\x92\xf4\xd1\xc8\x36\x68\x6f\x29\xa5\x3f\xc5\x8a\xd1\x5f\x83\x62\x6b\x00\x72\x9e\xb7\xb1\x43\x43\x47\x47\x7e\x16\x70\xc4\x75\x17\x31\x45\x12\xd6\xb7\x06\xe1\x0f\xaa\x0e\xd5\x27\xca\xb6\x93\xc7\x9d\x30\xef\xf3\x82\xf8\xdf\xd5\xb0\x40\xd3\xc8\x40\x53\x9d\x5e\x47\x5e\x6f\x11\x20\xa6\x43\x5d\x85\xe6\x64\xcb\x0c\x06\x2c\xd9\xf2\xe3\xc7\x14\x10\xff\xf4\xb1\x49\x6c\xa3\x00\x7d\xcf\xd0\x56\x10\xcb\xa0\xdb\x0e\x57\x05\x18\x3b\x00\xe8\x3e\xcc\xe3\xc2\x20\x5e\xa5\x03\x74\xb4\xc1\xf9\x91\x8d\xe9\xc6\x6a\x98\xab\xa6\x36\xa6\x1b\xad\x2c\x9b\xe4\xf7\x89\xc3\x91\x71\x80\x03\x80\x8f\x12\xb2\x35\x25\xf1\xba\x38\xc9\x8f\xd2\x95\xc5\x8f\x88\x8b\x80\x8e\x6d\xfc\xfe\x26\xe5\xea\x4f\xdf\xaa\xa2\x71\x17\xc2\x70\x49\x14\xfc\xc8\xbd\x5d\x91\x2e\xb5\xe3\x56\x59\xe3\x73\x22\x2e\x30\xbe\xb9\xe2\x61\xb7\xaa\x79\xbd\xe3\xc7\x8e\x1d\x2b\x1c\x56\xfc\x93\x1e\xfb\x57\x71\x5a\x88\x66\x2f\x17\x4b\xeb\x71\x77\xf9\xcc\xd2\x05\x49\x40\xfa\xfe\x7b\xbc\xe0\xad\xde\xfc\xb0\x57\x8a\xec\x14\x7c\xf9\xcc\xd2\x48\xda\x83\x4a\x9d\x21\xe4\xce\x3a\x43\x86\xa5\x2f\xca\x3c\x4b\xd7\x12\xa8\xbb\x99\xf5\xf2\x70\x4d\xde\xb0\xfc\xfe\xac\xa7\x4e\x80\xb2\x59\x19\x0a\x84\xa0\x99\x6e\xb4\xdd\xd7\x21\xe8\x06\x73\xe1\xfe\xc9\x18\x7b\xfa\x6e\xb3\x63\x2a\xe1\xcc\x30\xdc\xaf\x1d\x53\xc9\x75\xe3\xa1\xac\x9c\xe2\xfe\x35\x2c\x95\x21\x76\x88\x95\x0a\x9c\xb1\xed\xf3\x91\xa5\xc8\x6c\xde\x78\xe3\x09\xcd\x08\x58\x6d\xa4\x71\x52\x23\xd0\x0c\xed\x90\x06\xd0\x40\x72\x46\x95\x90\xae\xe9\x94\x65\xa5\x52\xf8\x41\xf2\xfe\x91\xb2\x92\x8a\xfb\x36\x73\x2f\x20\x4d\x06\x92\xea\x22\xee\x74\xe5\xfc\x8b\x44\xce\x8a\x1e\x0e\xe9\x31\x54\x76\x8d\x66\x3b\x44\x4d\xc9\xaa\xe0\xad\x5e\xd2\x8a\x93\x44\xb2\xf5\xcf\x60\x07\xa9\x61\xff\x6c\x70\xe7\x05\xd3\x87\x8a\xdf\xe5\x20\x01\x6d\x70\x7e\xda\x4e\xfa\x14\x6c\x4c\x07\x36\x51\xfd\xca\x41\x56\xbd\xab\xfc\xdf\x3e\xa8\xe8\xe9\x2f\x1e\xbc\xe0\xbe\x53\x80\x59\xda\xb5\x45\x80\x6d\x43\xd1\x2f\xbb\x2b\x71\xaa\x12\x68\xc6\x25\x51\xb6\x06\xd7\xd1\xd1\x6b\x60\xc7\x03\xd4\xad\x94\x3f\x5f\xe4\xd9\x36\xe4\xa8\xd2\x8f\x41\x4a\x34\x9a\x04\x2d\xc5\x72\xfb\xc4\xe5\xe1\xc2\xea\x53\x88\x3d\xaa\xd9\x1a\x5c\x8a\xb0\x2c\x3a\x61\x92\xd4\x00\xcd\x24\x5c\x4d\xb4\x0a\x72\xfa\x58\x01\xb6\x12\x48\xd7\x93\xb5\xb8\x78\x5e\x2f\xd4\x3e\xac\x8a\xaa\xc6\x82\x72\xe2\xa8\xe7\x64\xfc\xa9\xde\xd6\x92\xcc\xf5\xc8\xa0\x0b\x23\x51\x5d\x0b\xd5\x4c\xd1\x46\xad\xd4\x13\x17\x3c\x80\xe3\x25\x09\x5a\x00\x36\x58\xdc\x5d\xc0\x90\x81\x86\x33\xcd\x52\xbb\x4c\xa5\x86\x42\x41\xb1\x41\x78\x28\xcd\x61\x22\x2e\xc6\xcd\x6c\x2d\x0f\xbb\x6d\xb4\x38\x37\x78\xf0\xb4\x81\x1a\x0a\x3b\x2c\x3d\xe4\xc1\x46\x40\x99\xfa\x64\x55\x98\x2b\x50\x27\xa3\x23\x05\x07\x2a\x81\x9f\x9b\xe9\xab\x6e\x92\x3e\xc9\x08\x4f\x21\x41\x1e\x93\x46\x17\xc0\x55\x80\xec\xa9\x94\xf4\x02\xf2\x94\xc5\xdb\xd2\xa9\x34\x4e\xad\x4a\x61\xef\x14\x84\xe4\x00\x2c\x1d\x85\xda\xaf\xf6\xf9\xdd\x33\xfc\x0e\x2e\x2b\xe3\x77\xe0\x4d\xc3\x8f\x20\xfa\xc8\xdd\x33\x48\x61\xd4\xfc\xc0\xb0\xd2\x8c\x17\xbd\x56\x2b\xbe\xa8\x39\x66\xf8\x14\x7c\x79\xbb\xed\x70\x52\xe3\x12\x00\x68\x1d\x5d\x56\xe9\x9a\x3b\x48\x1a\xa3\xd3\xc7\x06\x87\x14\x6b\x98\xa9\x96\xfa\xa8\xdc\xb0\xd4\xfc\x9e\xe4\x1b\xd3\xc7\x6a\x7c\xe3\x78\x8d\x6f\x4c\xcb\xff\x83\xb8\x0b\xbf\x8e\xc9\xbf\x4e\xd4\xf8\xc6\x09\x90\x80\xe5\xa3\xe3\xd0\x23\x2c\x07\x7f\x1e\xaf\xf1\x56\x96\x4d\xe3\x7f\x2b\xce\x62\x7f\x7b\x0d\xbb\x7d\x07\x5e\xe9\x28\x5e\x2b\x18\x75\xe0\x67\x10\x5a\xcd\x7f\xdf\x35\xc1\x85\x21\xcf\x2b\x06\x24\x17\x22\x05\x5c\xcf\x43\xbc\xc5\xb2\x34\xa5\x60\x3e\x8d\xb2\x44\x48\xf7\x6e\x14\xdf\xd5\xec\x41\x9b\x35\xfe\x05\xc5\x1a\xbf\xd5\x5b\x51\x0f\x57\x76\xc1\x1c\x5b\xed\x1e\xd6\x84\xf2\x11\xe1\x8c\xd9\x0f\x58\x57\xe5\x03\x63\xec\xee\xcb\x06\xe5\x57\x40\x82\x95\x0b\xf2\xbd\xde\x0a\x55\xbb\xb2\xd3\x2b\x92\x46\xdc\xe0\xa7\x50\x91\x61\x2a\xc8\x72\xbe\xd2\xcb\x93\x15\xed\x85\x60\xe9\x92\x18\x91\x20\x95\x56\x24\x36\x81\xb2\x56\xc6\x23\x72\xab\xa5\x3d\xdf\x77\x19\x0a\xdd\x50\x83\x7d\x7d\x82\x8d\xf7\xf2\xc4\xff\xea\x44\xf0\xa5\x09\x6c\x73\x2d\xde\x10\xca\x01\xdc\x98\x56\xad\x26\x21\x49\x9a\xce\x3e\x7a\x7e\xf1\x8c\x1c\x52\x87\x1f\x59\x01\x47\x01\x71\x72\x6a\x4a\xde\x71\x27\xe5\xed\x3e\xd5\x0d\xcb\xf6\xca\x64\x83\x9f\xba\x18\x36\x4b\xb8\x8d\x11\x3e\x0e\x5a\xca\xec\x31\x0f\x1b\xaa\xbc\x7b\x56\x64\x65\x2b\x76\x92\x3e\x98\x59\x04\x44\x52\x73\xaa\x66\xc0\x1d\xfd\x6d\x9a\x7d\x32\xcd\x50\x26\x3e\xe2\xa2\x30\x87\x56\x56\x94\x06\x29\x25\x17\x45\x96\x6c\x88\x88\x6f\xc4\x21\x70\xa2\xe0\xe4\x30\x77\x6e\x09\x46\x9d\x75\xac\x1d\x56\xa0\xae\xb8\xc6\x57\x90\xb7\x52\xcf\x57\xe4\x9d\x85\x3d\x85\xba\x78\x9c\xd6\xa9\x4b\x50\x51\xa8\x4c\x6c\x1a\x5d\x89\x27\x61\x1f\xef\xec\x8d\x38\x4b\x60\xd2\x27\x1b\x6a\xe8\x9d\xb0\x8f\x59\x58\x11\xaf\xc6\xb2\x95\x31\xb6\x60\x5c\xb1\xb0\x4e\x34\xb5\xac\x00\xf7\x83\x9f\xcb\x59\x9e\x3e\x7e\x4b\xe3\x58\xe3\x58\x63\x7a\x05\x9d\x88\xa8\x66\xb9\x77\xe2\x62\xbd\xaf\x32\xe3\xc9\x7d\x02\x79\xfc\x80\x0f\x80\xf8\x0a\x39\xcf\x79\x2f\x75\x76\x2c\xf8\x68\x25\x09\x19\xfe\xf0\x6c\xcb\x32\x61\x6a\x9d\x3e\x7c\x4c\x4e\xee\xc2\x8a\x7a\x91\x57\x59\xa1\x11\xfa\xf4\x21\x00\x0b\x15\xb9\x81\xa1\x89\x4a\x5e\x73\x88\xe5\x47\xe8\x8e\x72\x47\x49\x16\x1c\x73\x87\xd6\x50\x23\x12\x16\x08\xf7\xd7\xcb\x53\x2e\xc5\x3f\x70\x1f\x13\x9b\x4e\x06\x46\x81\x3e\x2c\xc6\xab\x27\x00\x75\x43\x70\x1b\x6c\x0e\xb9\x83\xe9\xc5\x5a\x4c\x94\x30\x50\x5e\x16\x41\x83\xb1\x19\xc4\x81\x89\x0b\x7d\x41\xe2\x85\x63\xa5\xd7\x25\x64\xb7\x30\xed\xab\x5b\x53\x61\x0f\xad\x02\xd3\xce\x43\xd9\x4c\x03\x58\x7b\x59\x56\x6d\x4c\xa8\xb8\xcc\x20\xe1\x1a\xcc\x5f\xbe\x1a\x97\x39\xf0\x5a\x58\x0d\x11\x0f\x7d\xf4\x9c\x5c\xa1\xa1\x1a\xa5\x49\x47\x2e\x07\x3c\x53\x96\x90\x3e\x0e\x3f\x97\x4d\x85\xa8\xde\xcc\x72\xc9\xba\xc5\x4d\x80\x79\xe1\x60\xe7\x08\xe4\x8b\x93\xb2\xf9\xcd\x2c\x8f\xee\x0c\x94\xa6\x49\x07\x24\x9c\xce\xc3\xb5\x0e\x48\xd0\x47\x82\x1b\x1a\x8d\x46\x80\xb0\x92\xcf\xeb\x89\xbc\x6f\x1c\xb7\xe5\xdb\xa7\xd0\x5b\xc2\xaa\xa4\x1a\x6a\xa4\xa7\x75\xa8\xf0\x67\xf7\xb1\xc3\x3b\xc4\xf0\xf6\x7f\x6a\x5f\x70\x76\xd8\x8b\x4a\x16\x26\xcb\x16\x66\x01\x8b\x4b\xf9\x31\xd4\x69\xc8\xc1\x6c\xa1\xe0\x4f\x2f\x79\x07\x0a\xb0\x0b\x3a\x57\xdd\x2f\x8e\xb3\x13\x84\x0b\xfa\xc4\xe0\xdf\x2e\xf7\xd1\xfb\xdf\xae\xb1\x69\xe1\xcf\x5a\x28\xff\x1e\xf3\x93\xb0\x28\x8d\x27\x02\x78\x0e\xbc\xe0\xca\x0d\x6e\x77\x9e\x09\x95\xa7\x04\x19\xdb\x68\xdc\xc6\x9f\x81\x60\xfd\x81\xaa\xe2\x58\x2c\xf3\x47\x83\xdd\xcf\x0e\x62\x92\x7d\xe1\x9f\x0b\x66\x66\x78\xbb\xd7\x09\x53\x48\x41\x0a\xfa\x33\x7a\xa7\xac\xd9\x72\xbb\x44\xa2\x0c\xe3\x44\xc5\x54\x41\x44\x9a\x6e\xcc\x19\xee\x69\x76\x00\xb3\x07\xaa\x9c\x61\x76\x2e\x41\xbb\xb7\x87\xc9\x30\x38\xa2\x9e\x33\x8c\x16\xc1\xbf\x2b\xb8\x89\xac\xeb\x06\x1f\x0d\xab\xa8\xa9\x5b\x63\x39\xef\x89\x1a\x3f\x1d\x26\x85\xa8\xf1\xf3\x29\x18\xd5\x9d\xda\xfe\xc6\x63\x93\x3b\x9e\x60\xff\xd7\x3d\xff\x90\x64\x3f\xea\x72\x8e\x83\x9f\xf1\x8c\x7b\xc6\x66\x1e\x76\xbb\xc0\x41\x64\x3d\xc9\x58\xc6\x1d\x01\x9f\xa8\xd4\xdc\xa8\xa2\x2c\xd0\x63\xb1\x29\x4f\x7f\x5e\xb4\xd1\x4c\x5e\x66\x04\x04\x96\x46\x80\xf2\xd5\xe0\xfc\x3e\xac\x0d\x89\x1a\x64\x58\x8e\x08\xb0\xb2\x03\x28\x9d\x84\x71\x15\x36\xcb\x2c\xef\xf3\x8e\x28\xdb\x1a\xb7\x06\x56\x40\x36\xdc\x0d\x9b\xeb\x98\x18\xa3\x85\xbe\x2a\x16\x88\xd0\x38\xbb\xe7\xf2\x45\xfc\xe1\x6c\x8c\xff\x8a\xf1\xe0\xb6\xea\x43\x1d\xa0\xe0\xb0\x34\xca\x3e\x29\x05\xe7\x66\x9f\x54\x38\xce\x51\xfa\xc8\x18\xbb\x91\x14\xef\xb5\xe0\x09\xa3\x6c\x9e\x74\x33\xdb\x23\x9a\xb5\x55\xee\x37\x07\x93\x46\xe1\x6e\x7d\xef\x68\xe0\x87\x54\xf2\x2b\x1e\xdb\x27\x57\xc9\xff\x80\x36\xff\xfe\x98\x37\xdf\xaa\xe2\xa8\xd9\x26\x57\xc5\x4d\x20\xe6\x74\x86\x79\x97\xf5\x05\xa5\x22\x3f\xca\x8c\xdf\x78\xe3\x09\x58\xbf\xd5\xb0\xb9\xbe\x29\x99\x20\x10\x39\xca\x78\x35\x4e\x40\x85\xb7\x22\x6b\x5d\xb1\xe1\x13\x29\xe9\xb3\x63\x67\x9e\xae\xdf\x7c\xd3\x4d\x27\x6e\x92\xec\x14\x99\x73\x27\x5d\xf1\xe0\xeb\x13\x4e\x96\x0c\xcb\x65\xa0\x15\xaf\x9d\x0d\xbb\x10\x4d\xf2\xe9\x89\x60\xd6\x79\xa2\xd8\x4f\x2b\x6d\x28\x21\x20\x5a\x71\xf4\xea\x83\xad\x03\xe7\xdf\x78\x90\xb5\x94\x73\xfc\xf7\x04\x5c\x83\x4f\x94\x16\x90\x8b\xae\xca\x75\xdd\x69\xb0\x1a\x3b\xba\xad\x85\x57\x7f\xbc\xe7\xa6\xb9\x8b\x98\x96\xf7\xd8\x31\x2d\x6f\xdb\x65\x4c\xcb\xda\xa3\x85\x14\xb4\xe7\xd9\xbc\x3b\xcf\xe6\x87\xbc\xf3\xdb\x7b\xe7\x1e\xf7\x8f\xa9\x08\x13\x87\x48\x6c\x15\x63\xf2\xd1\xab\x1d\x38\x62\x2b\x61\xa7\x0a\x2f\xf9\xb1\xab\x83\x4f\xed\xdb\x0b\xf1\xd8\x0b\xf1\x78\x64\x43\x3c\x7e\x7f\x0f\x3c\x6a\x2f\xfc\xe1\x1b\x78\xaf\x7e\x63\xe3\x8b\x9e\x43\xf1\x45\xf7\x6d\x01\x55\x3e\x48\x9b\x77\x1e\x5a\xf4\x90\xf7\xac\xed\xef\x8f\x5b\xfd\x9b\xaf\x28\xba\x83\xb1\x3f\x1a\x67\xc7\x46\xe3\xec\x2f\x9d\x3a\x13\xa7\xbd\x8b\xd5\x84\x07\xef\x1e\x0f\xbe\x67\xf8\xab\x47\x30\xdd\xc1\x2f\x8d\xb1\x90\xe0\xfe\xef\x0f\xce\x5c\x11\xdc\x3f\xe2\x58\x6f\x09\xf2\xff\x79\x8f\x5d\x5b\x08\x18\x9a\x1a\xed\x47\xbd\x1d\xa0\xd0\xd3\x74\xd0\x37\xc1\xab\x3c\xb7\x12\x85\x22\x1d\x29\x45\x5d\x58\xdc\x66\x9e\x39\x59\x11\x76\x88\x96\x58\x86\xc5\xba\x81\x4a\x14\xf5\x6e\x16\xd5\xf5\x8d\x39\x05\x96\xf1\xb8\xec\xc3\x23\x71\xb1\x9c\x62\x7f\xb1\x8f\x9d\xdb\x1d\x74\xd3\x80\x14\x7a\x69\xdf\xae\xa4\xd0\x4b\x9e\x91\x1f\x87\xb9\xee\x7d\x68\x9c\xdd\x41\x82\xe9\xcd\xc1\xe4\xa8\xc4\x8e\xca\xe7\x51\xa3\x26\xd8\xab\x79\xd6\x16\x51\xef\x0c\x4e\xa4\x3b\x15\x51\x87\x57\x77\x3f\xc1\x63\x3f\x3d\x98\x53\xaa\xc6\xd0\x98\xe3\x40\x43\x09\xcf\x1d\xf7\x6b\xa5\x8d\x55\x66\x15\x58\xa4\x66\x59\x31\x78\x7c\x4a\xc9\xc1\x0f\x6a\x39\xf8\x5d\x5e\x97\x0c\xb9\x76\x23\x8e\x7f\xf5\x0e\x1b\xda\x85\xa4\xeb\xf8\x31\x6e\x23\x50\x3b\x52\xf1\xff\x6f\x6c\xa8\x54\xbc\xd4\xcc\xba\x3a\x39\xa5\xff\xce\xb1\x20\x9d\x21\xf4\x8e\x82\x1e\x56\x53\x1f\xcc\x9c\x9b\x33\x8b\x83\x45\x0a\x27\x51\x2c\x21\xf3\x22\x34\x49\x5d\x5f\x87\x56\x7d\xb0\x92\xa0\x1d\x1d\x96\x57\xf2\x3a\xc0\x11\x39\x75\x51\xd6\x88\x20\x4d\xff\xc5\x0b\xee\x9c\x31\x40\x0f\xd5\xee\x99\xea\x20\x06\xdb\xc2\x1e\x31\xd0\x20\x8e\x94\x7d\x9a\xcd\xb1\xbb\xb6\x27\x21\x30\x00\xe5\x31\xad\xe6\x68\xd1\x34\xc7\x1e\x3c\xc4\xb6\x0a\x5b\xad\x26\xea\x07\xc5\xc3\x6b\x0e\x05\x33\xc3\x5e\x0c\xc3\x09\xad\x96\xdb\x5a\xed\xf0\x9b\x7b\x78\x7d\xbb\xe6\xfb\x5e\xa0\xf4\x36\x79\xf0\xdd\x43\xf5\x36\xd5\x25\x71\xa0\x0e\x9e\xcc\x6e\x63\x4f\xda\x71\x54\x73\xb5\xaa\x3d\xa6\x73\x17\x4c\xe7\x6f\xd9\xca\x9c\x0f\xef\x52\x99\xf3\x1f\x86\xe3\x93\x3c\x5a\x68\xd0\x0f\x79\x9d\xed\x59\xcc\xa7\xfa\xf7\x6c\xc7\x62\x0e\x23\x33\x43\xa3\x89\xff\x9a\xb9\x0e\x15\x43\xd2\xc8\xeb\xb0\xaa\xa1\x31\x7f\xef\x62\xc1\x3f\x8c\x6d\x59\xe4\x1b\x14\xfc\xa7\x93\x62\x99\xa0\xab\x38\xfd\x97\x1c\x12\x38\x2c\xdb\xf9\x25\xef\x90\x1e\xbe\x9b\xbd\x70\x2f\xf5\xfc\x5e\xea\xf9\xbd\xd4\xf3\x55\xeb\xea\x2a\x33\xe7\xc5\x3f\x1f\xdc\x63\xd1\x8e\xc1\xda\x1c\xc2\xa2\x76\x9b\x66\x90\xe9\xc8\xe3\xf6\x72\x5c\x55\x0f\x39\x88\x44\xda\xb2\xb3\x44\x09\xbb\x96\x30\xe0\xef\xc3\x87\x82\x65\x2b\x45\x78\xa8\x66\xce\xf6\x31\xd2\x59\xcf\xca\x0c\x13\x6a\xd4\x78\x27\x4c\xc3\x35\xf2\x5f\x4c\x8d\x3b\x8e\xd1\xb9\x5e\xf2\x0e\xe0\x1f\x0e\x3d\xf8\xf4\x04\xfb\x71\x8f\xd1\x1b\xff\x87\xbd\xe0\xe5\x1e\xea\x44\x87\x0d\xdc\x52\xe0\x52\xb6\xd9\x54\xae\x96\x9d\x4d\xbf\xc1\x67\xb3\x14\x32\x1e\x81\x77\x48\x3f\xeb\xe5\x80\x0f\x6a\x1b\xbc\xd1\x14\xac\xb4\xb8\xa8\xf0\x05\x3f\x4e\xd7\x29\xc9\x0d\xce\xf4\xd8\x81\x56\xb1\xdc\xef\x0a\xff\x57\xbc\xe0\xe7\xbd\xd3\x71\x22\x94\x6b\x5b\xbf\x6b\x26\xa2\xc1\x4f\x5d\x6c\xf0\x40\x5c\x2c\x6f\x0c\x6a\x3c\xb8\xd8\x2a\xe4\x3f\x69\xd9\x2a\x02\x9d\x20\x4a\x59\x96\x51\xa9\x8d\x91\x42\x3a\x78\xa8\x1b\x16\xa4\x15\x81\x73\x64\x52\xd6\x5b\x83\xb7\x9c\xf4\x22\x51\x8a\xbc\x13\xa7\xa8\xe7\xa0\x24\x53\x10\x5f\xaf\x7a\x97\x41\x50\x9e\x1b\x68\xff\x93\xe3\xec\x71\x69\x16\x89\x85\xde\x6a\x12\x17\x6d\xcc\xfc\xb0\x28\x5a\xfe\x0f\x8c\x5f\x61\x7e\x91\xe0\x33\x63\xe7\x86\x54\x38\xd2\xc3\x4e\xbe\x57\x4c\xa3\x65\xf8\x2c\x04\xf8\x1e\x6c\x0c\xf8\x42\x82\xdb\x0d\x7d\x6d\x6f\x03\x74\x05\x4e\x84\xd1\xfc\x73\xab\x1f\x94\xae\x4f\xde\x8b\xf2\xe9\xf9\xb4\xeb\x3c\x07\x07\x27\x27\x45\xed\x80\xe7\x90\x52\x12\xe9\x7c\xb5\xa9\x4a\x76\x83\x58\xc1\x04\x16\xa2\x6c\x00\x43\x07\x56\x20\xec\x16\xb8\x6a\x83\x03\x08\x14\xaa\x21\x6a\x2a\x7e\x60\x65\xd3\x01\xdf\x03\xd8\x04\x0d\xd6\x61\x13\xb9\x08\xa3\x7b\xd3\xa4\xef\x87\xc1\x92\x89\x00\x0d\xc1\x39\xa4\x8e\x08\x9f\x4e\x1a\x61\xb5\xcd\xd5\x71\xb0\x85\xf7\x56\x98\x14\x82\x1f\x91\x9f\x4e\x6d\xe6\x71\xa9\xcc\xd8\x2a\x3a\xe1\xd7\x3c\x76\xdd\x86\xe2\xe0\x80\x9b\x14\x80\x22\xfe\x2a\xef\x42\xe5\x29\xf0\x7f\xa2\xa0\x65\xa8\x2b\x8a\x28\xb7\x76\x57\xe4\x65\x2c\x2c\x00\x5e\x77\x47\x9b\xc5\x33\x47\x15\x4e\x29\x3e\x3c\x5c\xf0\x28\x6b\xf6\x3a\x5a\x18\x94\xe3\xd1\x91\x66\x4a\x50\x7b\x47\x05\x70\xc2\x22\x29\xec\xa5\x87\xd8\xad\xf6\xa6\x35\xce\xa9\xe0\xb9\x34\x6b\x7e\x2f\xc5\x6b\x72\xd3\x2d\xe2\x05\x02\xa2\xf2\xc7\x26\x82\xc5\x2d\x4b\x0c\xcd\xad\x31\xea\x03\x25\x3c\x0f\x95\x9d\xbf\xb2\x67\x33\xd9\xb5\xec\xfc\x06\x8d\x75\xff\x2a\x2f\x38\x19\x9b\x94\x1b\x97\xb9\x40\x97\xa1\xa9\xd9\xe9\x76\xda\x13\xad\xbf\x49\xd0\xec\x37\xb6\x17\x6c\x97\xfc\xa7\x6b\xc1\xd6\x59\xe0\xaa\x01\x65\x2b\xca\x50\x35\xab\x7c\xe9\x50\x05\x2f\xcb\x4d\x3f\xfa\xf4\x5e\x56\x86\x40\x73\xde\x77\x28\x38\x31\xf0\xd4\x85\x0d\x77\x5e\x43\x02\xc4\x11\x0a\xb9\x1f\x9c\x60\x1f\xd2\x67\xe2\xdd\x5e\xd0\x1d\x92\x86\xc6\xad\x4c\xe9\xf7\x2e\x37\x43\x13\x9a\x89\xa6\xd4\x56\xad\x3f\x4f\xd6\x56\x4c\xd9\x27\xe9\x38\x3b\xc6\x1a\x3b\xce\xc7\x0a\xdd\xd9\x3b\x35\x7b\x88\xb9\x7b\x88\xb9\x0f\xa3\xe7\xd1\xfd\xdb\x53\xbf\x9b\xfd\x1b\xeb\x96\x57\x91\x22\x76\x03\x24\xa9\x4a\xe0\x5e\x7f\xc8\xf6\xe1\xdd\x02\xaf\x06\xa8\xdc\x9f\x4c\x04\x87\xad\xdf\xc3\xae\x69\x7a\x3d\x9c\xb2\x7d\x64\xcf\xd4\xb0\x6b\x76\x29\x51\x37\x43\x33\xf8\x8e\xa1\xa6\x06\xb5\x02\x36\x15\xbf\x85\xdd\xc4\x4e\x8c\xa4\xe2\xa3\x57\x7d\x8f\x94\xef\x82\x94\xff\xb6\x4d\xca\x3f\xba\x4b\x52\xfe\x4d\x91\x6f\xf2\x21\x6f\x6d\x7b\x52\x34\xe7\xdf\xa5\x9c\x20\x2d\x5a\x31\xcc\x80\xa0\xfd\x20\xad\x0d\x48\xdc\x1a\x7b\xed\x21\x36\xbd\x8d\x6d\x41\xbb\xfb\x18\x83\xc2\xef\x4f\x04\xaf\xf4\x06\x9f\x6f\x6f\x45\x20\xad\xa0\x63\x02\x30\xc3\x54\xbb\xf7\x88\x13\x0f\xd4\x8e\xcb\xa2\xde\x95\x92\x33\x60\x3b\x80\xa3\x65\x5a\x81\xb6\x9a\x6c\x5c\xf2\x0e\xa0\x1a\xef\x92\xc7\xb0\x95\x73\xa0\x71\xbf\x9a\x7a\x01\x7a\x58\x87\x4a\xfe\xf0\x41\xf6\x01\x8f\x5d\x1d\xda\xda\xdf\xcb\xf2\x33\x1e\xa2\xfd\x5d\x0b\xaf\x50\xeb\xbb\x8d\xb2\x97\x1f\x01\x8d\xee\xf3\xa8\x9d\x49\xf6\x2a\x8f\x39\x23\xf3\xff\xe3\xee\x3a\x7e\xa7\x5d\xd9\x96\x1d\xa7\x9e\x56\x3a\xd4\x60\x67\x98\x35\xef\xfe\x1d\xc1\xb4\xf9\x35\x4c\x3f\x49\xd5\x8c\x52\xf2\xfe\x3f\x63\x6c\x42\xf9\x10\xf8\x7f\x36\xc6\xee\xbc\x92\x43\x1d\xae\x8a\x44\xa7\xf3\xff\xc9\x31\xed\x93\x60\x1c\xa1\xe2\x74\xad\xae\x02\x7b\x21\xde\x53\x85\x5a\x21\x09\xb0\xb6\x26\x38\x43\x19\xb7\x86\x61\x88\x8a\xfc\xbe\x36\x40\xc6\x69\x9b\x84\x73\x42\x60\xc2\xc1\xcd\xd5\x68\x2e\xd1\xc3\x34\x8c\x30\x24\x28\x4c\xac\x9c\x21\x74\x6b\x2a\xcb\x12\xc5\x1f\x6a\x5c\x7a\xad\x45\xd2\x05\x9a\x59\x57\x9e\x5a\xec\x44\x2f\x05\x25\xfd\x73\x7b\x45\x69\x55\x03\x6b\x51\x8d\x57\x5e\x0b\x31\xcf\x3d\xd6\xd3\x60\x0f\x78\x8c\x4e\x92\xbf\xc1\xee\xb9\x0c\x70\xca\xe9\xc6\xac\xdc\xbc\xc4\x62\x54\x75\x9e\x47\xc9\x6e\x47\x73\xaf\xc2\xdc\x22\xdb\x4f\x90\x78\x0b\xf6\xc0\x3e\xb6\x1d\x0e\xe6\x42\x16\x15\x0e\x49\xfa\xef\xe3\xc1\x25\xaf\xfa\xf4\x4a\x08\xd2\xce\xac\x8f\x0e\x85\x82\x30\xb0\x10\x93\xee\xd4\xbb\x79\x86\x39\xb0\x2d\x9a\x05\xe4\x09\x9b\x1a\x01\x0b\xfa\x83\x63\xdf\x2c\xb0\xa0\x2f\xf6\x18\x75\xd5\xef\x8f\x76\x0f\xdd\xa2\x17\xf3\x3a\x6a\x33\xb8\x55\x9d\x72\xf5\x08\x7b\x41\x93\x48\x2f\x57\xfb\x64\x5f\x00\xd8\x41\x3c\x5f\xec\xe7\x0f\x38\x8e\x96\x4a\x00\xbe\x2f\x4e\xa3\x6c\xb3\x58\x22\x7f\xbd\x59\x74\xd7\x53\xae\x87\xff\xb8\x3f\xb8\x77\xcb\x12\x6a\x32\x38\x95\x32\xca\x58\x65\xf5\x05\x5c\xaf\x5c\x40\x7f\xc3\xa4\xe2\x00\xf5\xa6\xfd\xac\xc3\xbe\x65\xad\x53\x84\xb3\xba\xc8\x52\x57\x20\xc5\x5b\x0a\x4e\xdf\x7d\x76\x69\x66\xf0\xcd\x30\xea\x27\x4b\x5a\xed\xc0\x71\xa6\xb0\x56\x87\x0c\xfe\xf2\x18\xbb\x26\xef\xa5\x33\xc5\xf9\x42\xe4\xd0\xcc\xcf\x8e\x05\x3f\x3a\xb6\xdc\x16\x5c\x3d\xe1\x66\x38\x26\xac\x99\x10\x83\x91\xaf\x1b\x30\x85\xd1\x16\x75\x15\xde\xb2\x08\xc4\xd3\x3a\x16\x7c\x48\xb5\x6e\x5c\x2c\x62\x07\xb1\xa0\xc1\xcf\x5a\x51\xdc\x44\xf8\x16\xb2\xa8\x32\xf9\xa0\xf1\xa7\xb7\xab\x59\xd9\xe6\x95\xf7\x88\x82\x34\xf0\x99\xce\x63\xd6\x13\x6e\x9f\xaa\x9f\x97\xe1\xba\x00\x7c\xac\xa6\x9c\xcf\x0a\xb4\xe4\x9f\x7a\xcc\x1f\x5c\x31\xff\x33\x5e\xf0\xeb\xde\xe0\x7a\xc9\xb5\x42\xc8\x0e\xbd\x4a\x26\x63\x9e\xf2\x18\x3c\x62\xf1\x7e\xed\xde\x6a\xa3\x99\x75\x2c\xf5\x4f\xbd\x88\xd7\x8a\xa9\x4d\xda\x60\xb2\xe9\x49\x1e\xa7\x89\x16\xb7\xc0\xc5\x14\xb0\xbb\xb6\xd8\x0a\x72\xaf\x68\x57\xbd\x11\xdb\x0a\xac\x30\xce\x58\x7f\xfc\x80\x13\xe3\x02\x11\x17\xe0\x29\xd7\x16\x51\x4f\x9e\x54\xff\x81\x03\xc1\xb2\xf9\x39\x90\x5e\x4d\xbf\x68\x66\x69\x51\xe6\xa1\xc6\x43\x95\x55\x69\x14\x3b\x64\xdb\x16\x7b\x69\x19\x77\xc4\x6c\x12\x16\x95\x63\xf2\xc6\xfd\xec\x8f\xc7\xd8\xd5\xf2\x1b\xed\xba\xf8\xf9\xb1\xe0\x17\xc6\xec\x27\x20\x47\x15\xae\x8f\x31\x79\x8f\x2b\xcb\x7f\x96\x52\xbb\xf0\x96\x1a\x47\xe1\xc5\x69\x5c\xee\x9d\xc2\x4e\xa8\x6e\xbf\x05\xa4\x1d\xe5\x53\x40\x23\xc4\x8b\x0f\x43\x52\x30\x2d\x9a\x85\xf9\xa8\x48\x10\xc2\x28\x38\x55\x39\xfd\x07\x00\xf8\x7c\x4d\x44\x0a\xa4\x06\x71\xc3\xc5\xc5\x18\x43\x2c\xed\xc2\x0d\x3e\x93\xa2\xf1\x29\x89\x9b\x25\x65\x77\x6b\x86\x3a\x5e\x3e\x53\xe0\x5e\x28\x05\xe3\x36\xd7\x1b\x6f\x4b\x13\xce\xcf\x8d\xb1\xab\xca\x2c\xd1\x39\x27\xdf\x3c\x16\x7c\xd0\xb3\x1e\x20\xc8\x60\xb7\x8b\x10\x62\x47\x00\x64\x17\x0c\xf4\x51\xaf\x9b\xe0\xdd\x38\x09\x46\x43\x3b\x39\xbd\x01\xf7\x72\xc6\x1f\xf5\x40\x1a\xd5\x1d\xab\x71\xd1\x6a\x89\x66\x19\x6f\x88\xa4\xcf\x7b\x69\x9c\xa5\x4a\x34\x95\xc7\x3d\x6b\xa9\xf5\xc3\xee\x98\x1d\x2d\x07\x4c\xe0\x36\xd5\x7d\x64\x84\xe9\x29\x56\x67\x4f\xdc\x1e\x4e\x57\x0f\x75\x87\xf8\x80\x2f\x3b\x64\x03\xa7\x6f\x15\xe6\xe0\x04\xfe\xf8\x9f\x9e\x08\x7e\xd3\xab\x04\x03\xe9\xbb\x95\xc2\x8b\x2a\x86\xd8\x44\x80\xbd\x4e\x5d\x7f\x60\xed\xcf\x36\x53\x93\x3c\x11\x90\x7a\x9c\x27\xfa\x10\x10\xf7\xa1\x83\xa8\xd0\xed\x3a\x54\xdc\x13\xac\x67\x5a\x42\xd8\xd3\x6a\x35\xe1\x60\x8d\x17\x19\xc5\x4f\x01\xf0\x81\x55\x01\x12\x8d\x4b\x9e\xa5\x1c\x72\xe1\x60\x2f\x79\xe3\xbd\x38\x72\x73\x4d\x1c\x60\x09\xf9\x6d\x44\xc1\x7d\xe7\x06\x61\x7d\xcb\x01\xc9\x78\xb8\x42\x5c\x5e\x2f\xf5\xb5\x5e\x1c\x89\x29\x03\xed\x50\xdc\x00\xbd\xb3\xe9\x58\xcc\x64\x1f\xfc\xd5\xe0\xfc\xf9\xf9\xb9\x87\xb7\xad\x5e\xec\x2a\x0f\x6e\x71\xd4\x64\x93\xc1\xe3\x6d\x58\xb1\x6a\xcb\x8e\x07\xfa\x18\xf3\x57\x93\xac\xb9\x0e\x5b\x62\x4e\x24\x02\x5c\xb2\x3e\x30\x16\xfc\xd4\xd8\x7c\x8b\x97\x10\xd5\x3f\x73\x6e\x4e\x5e\x99\x10\xf1\x26\x8b\xe9\xd8\xb8\xa0\x95\xe5\x62\x0d\x02\xf1\xd5\xa7\x01\x6f\xc5\x69\x98\xc4\xcf\xd7\x00\x37\xe6\xb3\xa6\xd6\xbc\x44\xb2\xb4\x42\x48\x80\x38\x3f\xd1\xaf\xd3\x1d\x59\xca\x79\x91\xa7\x29\x51\xfa\x3b\xb5\x4f\xe1\x47\x27\xdb\xb0\x72\xfd\x19\x23\x77\x83\x2f\x67\x70\x5e\x4b\x6d\xdb\xaf\x29\x6c\x8d\x54\x88\xa8\xe0\x01\xb6\x1a\x68\xf8\x0f\x33\x37\xd0\xbf\x1a\x62\x4c\x6e\xc6\x85\xe0\x37\x1e\x3f\xce\x8f\x9c\x4f\x89\xc5\x00\x7f\xb9\x53\x28\x22\x6a\xc9\x23\x17\x65\x2f\x4f\x45\x05\xee\xef\x02\x63\x04\xf8\x96\x88\xdc\xbf\x27\x38\xa9\x67\xb1\x32\x18\x37\xf8\x0e\x7c\x69\xe8\xca\xa2\x8f\xdd\x7a\x7f\x58\x21\x01\xbf\xd2\x0b\x1e\xd0\x48\xc0\x5b\xee\xa8\x47\x49\x71\xf5\x33\x87\xd8\x77\x6f\x15\x3e\xbe\x90\x67\xcf\x45\x8d\xaf\xff\xc0\xa1\xe0\x7f\x8f\xcd\x44\x61\x17\xbc\x8c\x4c\xa0\x7b\x9c\xc2\x45\xd6\xc5\x92\x22\x52\xae\x0c\x88\x0f\x53\x65\x35\x88\xef\xd6\x9f\x1f\x2e\xf8\x9c\xe4\xea\xd0\x9f\x43\x2d\x8f\x71\xec\x03\x84\x97\x6a\xdd\x92\x06\x81\xcf\x8c\xe5\xed\xb8\x2e\xfa\x85\xa2\x58\x56\x8d\xb4\xd9\x21\x83\x05\x1c\xf2\x9a\xc2\xe4\x91\x8f\xd1\x04\x2d\x12\x70\xd6\x07\xa1\x98\xe2\x52\xe9\x46\x35\x22\x2e\xa6\xf6\x80\x61\x40\x4b\xe0\xe3\x52\xb6\x1d\x94\xd3\x92\xd0\x27\xf1\xb0\x37\xc3\x04\xaf\x78\x74\xf8\xe8\x84\x5d\xd5\x7b\x52\x96\xca\x16\x14\x1a\x88\xf2\x04\xea\x48\x7e\xc9\x85\xdc\x3f\xc0\xde\xb1\x4f\x29\x82\xdf\xb2\x2f\xf8\xc3\xf1\x2a\x64\x17\x48\x8b\xe6\x0c\x76\xc3\x38\x1f\x32\x11\x83\x90\xca\x66\x09\xcd\xb4\x67\xfa\xee\xa7\xbd\x6d\x26\x3c\xc4\x49\xdc\x04\x4f\x54\xdb\x73\x6e\x5d\xf4\x09\x8b\x18\x96\x5a\x3d\x86\xde\x20\xdf\xed\x22\x43\xc8\x2b\x51\x44\x38\x8d\x5b\xb4\x6c\xf8\x6d\x98\x68\x54\xd3\xf7\xd2\x81\xaf\x89\x2a\xd1\x96\x81\x06\x43\xe8\x93\x8d\x2e\x4f\x3e\x58\x84\xc1\xa3\xfd\x3a\x71\x96\xf4\x44\xd4\xec\x21\x17\xa2\xec\xd1\xd4\x00\xee\xb3\xda\x37\xa8\x3d\xe9\x84\xf9\xba\x88\xb4\xf7\x51\x83\x2f\xc8\x4e\xea\xab\x33\x17\x49\x08\x7e\x51\xca\xb6\x20\x9b\x55\x92\x9f\x6c\xe4\x70\xa3\x71\x18\x43\x8f\xb2\xdc\x06\x1a\x94\xcf\xaf\x00\xef\xe1\x69\xa2\xbf\x9c\xc9\x2e\x48\x11\x1e\xef\xc9\xef\x0d\xb2\x1d\xdd\x93\xdb\x59\x8e\xb3\x0d\x91\x6f\xc4\x62\x73\x8a\xf4\xb6\x75\xd9\x4f\x85\xf2\x3e\x05\x67\x6a\x6a\xf0\xfe\x5c\x62\x13\x6a\x6e\xfc\xbb\x83\x27\x2d\x11\xba\xef\x66\x5b\xa8\xc8\x6a\x1b\x2b\x23\x07\xd0\x4c\x58\x53\x35\x83\x84\x83\xee\xd0\xd1\x9f\x1a\x63\x37\x0c\x19\xfc\xb9\x2c\x12\x58\x19\xf9\x44\x3e\x30\x16\xf4\xaa\x0f\x2d\x41\x43\xfb\x48\x12\x77\xe8\xba\x64\xb9\x98\x6a\x45\x6f\x15\xcf\x8f\xc5\xb6\x2a\x51\x74\x52\x77\x16\xe0\xc7\xe3\x64\x48\x8a\x90\xa6\x1a\xa4\x9f\xec\x20\x31\x83\x9e\x92\x6a\xef\x83\x86\x45\x70\x07\x7c\xf4\x42\x70\x97\x3b\x5c\x98\x29\x65\x7f\x74\xc0\x49\x11\x32\x5a\x55\xb2\x8c\x7a\xb6\xf7\x1f\x08\x42\xfb\x81\x63\x9e\x23\xa2\xad\xcc\x65\xa4\x36\xa6\x9f\x59\xae\x9f\xf4\x2c\x97\x6f\xd4\x62\xba\x2a\x42\x02\x88\x72\x66\xe9\xc3\xfb\xd9\x03\x1e\xdb\x0f\x95\xf9\x9b\xbb\xd3\x20\xdf\xba\x61\xab\x8e\xed\x5e\x6f\xa7\x39\x7e\xc3\x18\xf3\xc3\x41\xef\xf6\x17\x69\xef\xf6\xaf\x7a\x83\xaf\xb7\x6a\xe8\x9b\xc7\xab\x7d\x16\xf5\x6d\xb0\x9f\x93\x3e\x45\x11\x42\x3a\xe8\x4a\x9f\x2c\x97\x6b\xc7\x4d\xfd\xfd\x55\x0b\xc5\x4f\xee\xd2\x42\xd1\x1a\x66\xa1\xd8\xc1\x24\x5e\xae\x81\xa2\x49\x78\x63\xcf\x0a\xce\x81\xd3\xaf\x15\xa6\x68\xd3\x21\xaa\x16\x8a\xc4\x05\xb7\x16\xb8\x86\x49\x19\x60\x8f\xdb\xbe\xf4\x36\xa1\xfb\xab\x27\xb0\xfa\xd6\x89\x29\x97\xf0\xd1\x6c\xd8\x0d\x9b\x71\xd9\xf7\x3f\xfc\x84\xe0\x4b\x07\x07\x9f\x2b\x1f\x4d\x5a\x4a\xc9\x0d\x64\x2d\xa0\x41\xb3\x4b\xf3\xfc\x6e\x51\xea\x82\xcd\x30\x49\x1a\x80\x73\xac\x72\xc4\xa8\xaa\xa4\x00\x4b\xcc\xaa\x0b\xe2\x66\x22\x47\x9a\xaa\x16\xe4\xac\xc2\xbc\x8c\x9b\x3d\x74\xc3\xef\x66\x49\xb6\xd6\xe7\x85\x00\x5c\x3a\x3b\x23\x88\xd2\xd5\x13\x08\x37\x60\xf7\x22\xd0\x2f\x2a\xaa\x32\x04\x21\x49\xcb\x38\x2c\x05\xa0\x04\x2e\x48\xf9\xa5\x90\xfc\x00\xfa\xa2\x16\x0d\xc6\x2c\x64\x66\xec\x23\x24\x1b\xc1\x28\x4e\x0e\xc0\xe5\x05\x21\x97\xd7\x9d\x11\xf1\x40\x59\x43\x02\x90\x5e\x82\xe9\xe3\x27\x6e\xe4\x77\xc7\x77\x05\xd6\xb8\xe2\x94\x07\x6a\x08\x0d\xf7\x3e\x7b\x7e\x96\x8a\x27\xf7\x8a\xba\x08\x8b\x72\x3a\x18\xa8\x1c\x20\x1d\x8b\x42\x57\x7e\x6c\x58\xd5\x6e\x8d\x2a\xf7\xda\x93\xd7\x01\x10\x25\x5c\x6d\x4e\x1f\x3f\x11\x20\xc7\x8b\xd0\xc0\xc8\x96\xe6\x42\x00\x80\x32\xee\x56\x84\xc4\x06\x56\x31\xcd\xac\x85\xb0\xf1\x44\x30\xf3\x8f\xc2\xd5\x6b\x66\x9d\x55\x4a\xda\x28\x27\x25\xcd\x94\x88\x0e\x2a\x9e\x82\x98\xd4\x5e\x5c\x52\x50\x10\xad\x20\xa8\xb1\x71\x8c\xbc\x89\x6a\x23\xc9\x09\xd4\x09\xe5\x37\x75\x6b\xa9\xf1\x55\xe2\x42\xed\x2e\x81\xf9\xe6\xf2\x3e\x79\xbe\xc8\x33\x9c\x83\x6e\x9e\x45\xbd\x26\x65\x09\x04\xac\x62\x95\x15\x46\x2e\x79\x24\x9a\x71\xa4\x30\xdf\xc2\x6e\x37\xcf\x42\xe4\xcd\xd0\xac\x44\xc3\x41\x01\xa2\x0f\xca\x23\xb9\xe5\x7a\x96\x3a\x12\xf0\xd8\x94\x26\x2d\x57\xf2\xed\x90\x33\x05\x70\xc6\x2d\x11\x4a\xb1\x88\x03\x10\x79\x5c\x70\x91\xca\xfa\x23\x52\x4f\x00\xca\x81\xed\xa4\x9e\x49\x09\x07\xd8\x50\x35\xb8\x7a\xb8\x09\x58\xcb\x46\x39\x09\x13\x3f\xbb\x34\x8f\xc1\x0f\x8d\x4a\xb3\x8d\x4b\xde\x75\x85\xb5\xc7\xce\x55\x03\xe5\xff\xfb\xb7\xb0\xdf\x24\xf5\xe4\x32\x2d\x9a\xff\xfe\x87\xc3\xc2\xf8\x7f\xbc\x73\x56\x9d\xfa\x12\xc7\xa9\x46\x4d\x18\xe6\x7e\x68\x36\x85\xf1\xd0\x57\x7b\x45\x6e\x3e\x2c\xaa\x97\x75\x13\x42\x2e\xd0\x9d\x5b\x47\x44\x80\x61\xcf\xfe\x50\x61\x5b\x42\xad\x80\xcc\x09\xca\x81\x30\xed\x23\x83\x55\x89\xd4\x90\xf5\x80\x87\xfe\x40\x2d\x03\x35\x00\x83\x1f\x89\x01\xb7\xff\xb8\xd3\xe9\xd1\x36\xf9\xec\x18\x1b\x98\x6d\xff\x97\xc7\x82\x77\x83\x8d\xc2\x36\x79\x38\xe7\x5e\xe3\x00\xaa\xe1\x99\x41\xdb\x69\x91\x14\xc4\x7e\x47\x88\xd2\xa8\xc3\x9c\x90\xf2\xd0\x35\xae\x84\x6e\x3b\xca\xa1\x40\xf2\x88\x34\xe8\xb9\x73\x4b\x92\xb1\x8c\xb2\x4e\x18\xa7\x93\x14\x8d\x10\xea\x38\x84\x34\x03\xf0\x25\x91\xeb\xd3\x36\x62\x77\x1b\x08\xa3\x6c\xb5\xc8\x20\xaa\x02\x8e\xbe\x06\x0d\x20\x8d\x8b\x3c\x36\x92\xc1\x06\xe0\x8e\x2c\x1f\x3d\x97\xf6\xc5\xb6\xe7\xbe\xb5\x4b\xf7\xad\xcf\x8c\xb3\x09\xb5\xa5\xfc\x07\xc7\x77\xc7\x33\xbd\x74\x7c\xd6\xa2\xb4\xc6\x2a\xa5\x37\x2f\x51\x46\x8b\x8e\xc5\x29\x2c\xba\xc5\x39\x2c\x42\x6c\x5c\xa1\x6e\x19\xe7\x0d\x3a\xd8\xa3\xd6\xdd\xbe\x47\x2c\x24\x5a\x42\x61\x29\x09\xbd\xa2\x9b\x8b\x8d\x38\xeb\xd1\x46\x2a\x14\x20\xb0\xe8\xc8\x2e\x83\x19\xab\xa9\x59\xcf\x23\xb2\x5f\x60\x56\x9a\x6e\x1c\x9f\xd4\x49\xae\xc2\xe2\x24\x98\x38\x06\xd9\x13\xc0\xc2\x5e\xed\x43\x9c\xac\x0a\x95\x23\x32\xa1\x32\xe7\xda\x1e\x04\x10\xa3\x05\xfb\x72\x83\xd8\x8d\x0a\xad\x0a\x4b\x47\x33\xee\x74\xae\x97\x9a\xf6\xc1\x24\x00\xf8\x36\x11\xf0\x22\x70\xa9\xe9\x5e\x35\xf6\xbc\xe4\x76\xa1\x6c\x7c\xff\x3e\x76\x7d\x27\xbc\x18\x77\x7a\x1d\x0a\x61\x8c\x9f\x2f\xfc\xb7\xec\xdb\xdd\xc9\xf8\xf2\xf8\xd9\x6a\x9d\xdf\xd4\x47\x04\x75\x84\xea\x04\x14\x90\xad\xc3\x3a\x1d\x37\x36\x8e\xa9\x0b\x25\x91\x22\x51\x51\xf2\x42\x0e\xc9\x86\x40\x82\x5d\x0f\xfc\xfb\x2c\x6c\x55\x1c\x39\x75\xb0\xa1\x36\xeb\x73\xf2\x30\x5d\x13\x0d\x15\xf4\xf6\x1c\x38\x4d\x44\xf5\x0d\x8a\x93\x8e\x0d\xd5\x89\x0a\xe0\x82\xb3\xc6\x04\xbd\xc9\x0a\xb8\xc5\x07\xe7\x83\x12\xbf\x38\x81\xb7\x24\x86\xe3\xa5\x6f\x39\xd7\xcc\x2c\xcc\xcb\xb1\x2b\xc1\x73\xd1\x86\x79\x59\x54\x1b\x18\xc6\x45\x7d\x6a\x26\x61\xdc\x69\xb0\x37\xed\xb3\xdc\x2b\x5f\xbd\x6f\xb7\x88\x61\x9f\x1a\xdf\xca\xc1\x52\x33\x0d\x52\x1a\x48\x33\x5b\x44\xea\x88\x30\x05\x07\xa7\x79\x63\x24\x03\x68\x1e\xe7\x42\xe7\x47\xa2\xac\x2c\x0c\x4c\xf7\xf1\x9b\x4e\xf0\x66\x3b\xcc\xc3\xa6\x9c\xce\x49\xb0\x75\x88\x14\xd2\x76\x2b\x1e\xc4\xa0\x0c\xda\x06\xda\xb2\x4d\x89\xb3\x6c\x30\xc7\x6c\x30\x0f\x81\xc9\xd0\x64\xd4\x12\x08\x4f\xde\x2c\xe2\xa2\x59\xbf\xbd\xd7\x8b\xa3\x3b\x6a\x52\x5a\x14\x29\x59\x41\xe5\x08\x29\x7d\x63\x2e\x64\xc5\xa2\x4e\xbd\x87\xb1\x23\x17\x28\xd2\xa8\x30\xfb\xa2\x97\xc6\xcf\xeb\x39\xc7\x07\xf1\xd4\xd8\xbd\xc4\xdb\xc3\x10\x94\x99\x2f\x6a\x30\xf6\xa8\xf9\xaa\xae\x6f\xef\xab\x7a\x8f\x7f\x7a\x07\x80\x6b\x15\x0e\x6b\x28\x16\xc6\x57\x0f\xb0\x7f\x37\x0c\x0c\x48\x34\x9b\x59\xa7\xbb\x90\x67\xad\x38\x11\xfe\x6f\x1c\x08\x5a\xee\x23\xcd\x32\x81\x9d\x7e\x4a\xfb\xc2\x40\x66\x0e\x28\x28\xaf\x31\x28\x49\xd9\x67\x0b\xca\xe1\x97\xa5\xc2\xbc\x22\x9d\x8d\x01\x43\x1b\xa6\x55\xfb\xff\xef\x63\xef\x1a\x63\xd7\xe9\x6c\x05\xaa\x57\x97\xc6\x82\x1f\x18\xab\x3e\xb5\x5c\xd4\x42\xdd\x8e\x22\x50\x70\x1c\xe1\x89\x05\x75\x69\xb1\x98\x90\x08\x84\x92\x19\xe1\x97\x96\x0f\x85\x06\x3b\x8b\x9c\xaf\xcb\x8c\x6f\x66\xf9\x7a\x43\xa7\x47\x0a\x41\x5d\x21\x90\x7a\x74\xc3\xb2\x5d\x33\x1a\x74\x62\xfe\x08\xf7\xf3\x70\xc1\xad\x4a\xab\xf3\xa6\x82\xde\xa9\x66\xed\x73\x21\x00\xc3\x41\x69\x78\x82\x33\x6a\x02\xdc\x8c\xbe\x6f\x1e\x23\x85\xd1\x7f\x19\x0b\x5e\x36\x86\xa5\xf5\xcc\xe0\x89\x58\x27\xdb\x5d\xb5\x61\x65\xc7\x40\xc9\x01\xb3\x79\xc6\x91\x71\xe9\xca\xc5\x49\xc6\x74\xb3\xbc\x7e\xc5\x13\x4d\xae\x0a\x0a\x33\xbb\x5e\x71\xab\xca\xf1\xb5\xb6\x27\xe9\x5d\x53\xa9\xe6\x7c\x0a\xb3\x28\xdb\x05\xb5\xc2\x60\x39\x35\x12\x27\x3c\x25\x67\x8f\x75\xce\x19\xf8\x5b\x14\xfe\xb3\xfc\xfb\xeb\x90\x6a\x2d\x8f\x3b\x71\x2a\x45\x8c\x93\x30\xd9\x8c\xd3\xc5\x57\x2f\xb3\xba\xf5\x5e\xdc\xd5\x3f\xc9\x38\xe7\xbc\xba\x13\x4f\xf2\x33\x95\x27\x8c\xfd\x89\xcf\xbe\xcb\x3a\x6e\x90\xd1\x6d\x43\x92\x78\xa5\x62\x3b\x45\x6c\x91\xff\x11\x3f\x38\xad\x7e\xd8\xca\x3e\x0d\xf1\x92\x64\x6b\x60\x96\x0b\x56\x31\xff\x72\x00\x2a\x19\xb8\x80\x08\x0a\x86\xb0\xe4\x2e\x79\x87\x28\x15\x88\x70\xc3\x5a\xbe\x78\x3d\xfb\x21\x8f\xed\x6f\xc7\x69\x59\xf8\xaf\xf0\xd8\xad\x23\x55\xfa\xa3\xfb\x79\x8f\xfc\x38\x38\x07\x75\x0c\x4f\xf3\x69\xc1\x08\x00\xf5\x6d\x67\x9b\x80\xd2\xa0\xc6\x66\x56\x49\x29\x46\x1a\xec\x53\x63\x6c\x42\xa9\xa5\xfc\x5f\x1d\x0b\xde\x33\xa6\x7e\x69\x69\x4c\x7d\xef\xc8\x7f\x36\x4b\x01\x39\x9e\xa0\xc2\x1c\x2c\x9d\x26\x21\x35\x66\x07\x95\xb3\xd4\x8b\x8b\xb6\x9d\xa9\x5a\x32\xa7\x60\x81\xc4\xab\x0a\x31\x71\xe2\x14\xae\x44\xb8\x0c\x26\xe5\x61\x4c\xca\xb8\x9b\x08\xeb\x3b\x3c\x4e\xca\xfb\x08\x58\x0e\xdd\x5f\x77\x78\x31\x26\xed\x6a\xf5\xd2\x35\xd0\x0b\x60\x0b\x1d\x55\xe5\x8c\x4a\x08\x89\x6d\x4e\x1a\xa2\x02\x39\x29\x21\x7d\x19\x32\x69\x45\x01\x9d\x02\x85\x09\x3f\xb2\x78\x7a\x96\x4f\x4f\x1f\x3f\x31\xa9\xb2\x25\x55\xdd\xbf\x7f\xcf\x63\x13\xf2\x08\x82\x3a\xe1\x93\x5e\xf0\xcb\x9e\xfa\x55\xc5\xbb\xb3\x55\x0c\x84\xdc\x5c\x94\xda\x13\xac\x32\xeb\x15\xc1\xc5\x00\x42\x98\xb9\x81\x53\x61\xec\x3a\xce\x72\xd1\xe7\x4a\x85\xa5\x2f\x67\xb5\xb9\x96\x92\xb8\x29\xce\xa9\x8e\xda\x9a\x2f\x67\x70\xaf\xf6\xd8\x21\xd4\xb8\x2f\x8a\x96\xff\x22\x8f\x1d\xdb\xd6\x36\x55\xf5\xa6\x3e\xa7\xbf\x1f\x6a\x91\x1a\xf0\xa9\x46\x66\xc7\x99\x3a\x7b\x76\xd8\xd7\x0e\xb0\x09\xc5\x56\xfb\x7f\x74\x20\xf8\xd8\x01\xcd\x64\x9b\x5c\xd7\x3a\x8b\x8b\x7e\xb7\xd5\xb9\xb1\x85\x26\x95\x34\x6d\x5d\xf4\xa7\x8c\xa1\xbc\x50\xf9\x13\xa1\x16\xf3\x15\xba\xda\x63\xcd\x8d\x87\xc1\x4c\x4a\x3e\x86\x5a\x31\x87\x22\x5e\x33\xe9\x41\x0e\x3c\x12\x8a\xe4\x1e\x9a\xbe\xb9\xda\x43\x95\xd5\x12\x4b\x93\xea\x95\x14\x6e\x80\x67\x65\xc0\x1a\x8c\xea\x79\x53\x24\x09\xe1\x63\xad\x8b\x7e\x71\x92\x1f\xe5\xc3\x35\xd8\x27\x2d\x41\xc9\xf5\x54\x77\xc9\x07\x5e\x47\x8c\x5b\xae\xa9\x9a\x1c\xc5\xb8\x65\x4b\x64\x04\x62\xad\xd1\x31\x72\x90\x23\x1e\x30\x8e\x57\x1b\xcc\x49\x83\x1d\xe5\x5b\xa8\xed\x47\x77\x4f\xbe\x35\x9d\x61\xfc\x8a\xbb\xb3\xb3\xce\xe4\x62\x0d\xb8\xc0\x51\xdd\xc1\xf7\x0f\x7f\x87\x5c\x4d\x5d\x24\x4f\x0f\xd4\x04\x34\xcd\x78\x33\xa1\x9a\x2f\x4e\x79\xab\x07\x07\x3e\xec\xc6\x3a\xcf\xde\x96\xbe\x9b\x7f\x39\xc6\xcc\x55\xe7\x7f\x79\x2c\x78\xcb\x98\xfe\x39\xf4\xe2\xa8\xba\xf4\xe8\xee\x85\xc0\xeb\x97\x22\xef\xe6\xe0\x1e\x16\x36\x9b\x59\x1e\x59\xa9\x96\xdc\x41\x3a\x04\x4b\x25\xde\x82\xb4\x40\xe8\x1f\x88\x68\x23\x70\x13\xc1\x11\x45\xf0\x20\x1e\xc5\x2d\xf4\x63\x00\x06\x03\xfa\x60\xfa\xab\x71\xb8\xd0\x29\x1b\x37\x6e\x9c\x73\x79\x0c\xa4\x54\x0c\xa8\xa7\xb1\x56\x26\xab\xa3\x0f\xa6\x16\x95\x0d\x19\x98\x6d\xaa\x12\x8e\x5a\x9a\x59\x78\x30\xd3\xc7\x8e\x39\xde\x19\xee\xc4\x3e\xe4\xf1\x91\xee\x9f\x07\xfc\x7d\x85\x28\x19\x7b\x83\x07\x4e\x66\x18\x6e\x03\x3c\xc4\xe8\x00\x87\xd1\x3c\x84\x4e\xd6\x54\x04\xf3\xa6\xb6\x11\xdc\x84\xce\x39\xa4\xe3\x48\x9c\x7c\x40\x86\x04\xff\xe8\x21\x76\x64\xd0\x79\x1b\x5b\xb6\x7d\x64\x21\x42\xf8\x6f\x26\x82\x13\xd5\x87\x15\xe4\x02\xdb\x71\x77\x4b\x60\xd2\x0f\x1f\x64\x5d\xe5\xe3\xb4\x16\x04\x43\x50\x10\x94\x62\x59\xe7\xd9\x37\x6b\x70\x33\xbb\x91\x1d\x1f\x1d\xf1\x3a\x6a\x10\x7b\xaa\xbc\x5d\xa8\xf2\x3e\x61\x07\xbc\x7e\x64\x97\x01\xaf\xff\xf1\x1b\x04\x5d\xb0\x97\x31\xe5\x61\xc3\x2d\x68\x6d\xaf\x80\x99\xf5\x67\xb4\x02\x06\x0e\x65\x45\xfb\x52\xa5\x25\x43\x75\x2f\x1f\x3a\xc4\x6a\xc3\xc0\xef\x1b\x0b\x59\x34\x17\x17\x79\x0f\x04\xee\xbb\x7a\xd1\x9a\x40\x84\xa8\x57\x1c\x0a\xee\x1c\xf1\x6e\x18\xa6\xc1\x90\xa2\x23\x48\xd6\x27\x0e\xee\x11\x90\xbd\x88\xf9\x3d\x2a\xf2\x30\x1a\x4c\xfb\x8a\x05\xe8\x06\x87\x87\xb0\x00\xc3\xce\xa6\xcd\x07\x9c\x64\xb7\xb2\x9b\x47\xf2\x01\x5b\x92\x8a\x87\xbc\xe6\xf6\x04\xec\x4e\xff\x0e\x4d\xc0\xb0\x36\x4d\xbb\x46\x50\x98\x2a\x04\xcb\xff\x1c\x77\x20\x3d\xad\x24\x23\xcb\xd9\xba\x48\xc9\x04\xe2\xff\xe2\x78\x70\xbb\xfd\xc0\xb0\x75\x96\x55\x06\xfd\x2b\x29\xb5\x80\xe4\xb5\x7b\x92\x18\xc8\xaf\x1a\x97\xbc\x89\xb0\x17\xc5\x52\x16\x77\x48\xd6\x1f\x8e\xb1\xd7\x79\x4c\xbf\xf3\xbf\xcf\x0b\xfa\x33\xf4\x43\x99\xcc\xe4\x5e\x81\x30\x2d\x55\x4a\x3b\xee\xcb\xaa\xc1\x15\xca\xee\x1a\x64\x45\x31\x00\xad\x91\x49\xe5\x07\x5e\x67\x54\x47\xa1\x12\x37\x99\x34\xb6\x8e\x36\xe2\xe3\x1e\xbb\x5e\x5c\xec\xc6\xe8\x80\xbb\x04\xf1\xca\x85\xff\x1e\xcc\xab\x70\xf3\x8d\xc1\x9b\xbc\x53\xd5\xb7\x3a\x88\x5b\x01\x29\x66\x2d\x54\xe4\x80\x5f\xc4\xce\xba\xec\x64\x89\x52\x5d\xd7\x0e\x88\xc1\x40\x9b\xc1\x88\xba\x1c\x6f\xc9\xbf\x99\x18\x0a\xdb\xba\x90\x45\xcb\xa2\xd3\x95\x27\x12\xee\xa5\x4f\x4c\x04\x47\x2b\xcf\x06\x76\xbb\x7a\x39\xe2\x06\xfa\xb9\x3d\x88\x9d\x5d\x93\x9c\xef\x51\x24\x67\x39\xf8\x57\x67\x68\xe6\x21\x14\x52\x4d\xbd\x4d\x60\x8e\xb1\x06\xab\x6d\xab\x27\xb3\x16\x6e\x8f\x43\xd8\x83\x47\x33\x83\x7b\xc8\xbb\x6f\xfb\x4b\xe6\x46\xff\xf8\x30\x74\xaf\x0a\xa9\xa8\x5e\x2c\x3f\xb1\xdf\x89\xba\x36\x5b\x31\x2f\x09\x9b\xe2\x3f\xed\xbf\xe4\x41\xba\x9a\x4b\xde\x44\x37\xcf\xca\xac\x99\x25\x0e\x35\xf9\xf2\x3e\x16\x53\x42\x9b\x50\x39\xbd\x9f\x59\xa0\x74\x36\xa5\x4a\xe8\x4a\x89\x67\xdc\xd4\x3b\x94\xeb\xb5\xa5\xb2\xf8\x12\xee\x45\x01\x64\x22\x97\x97\x49\x5b\xe4\xae\x4f\xf9\xeb\x3d\xa6\xbb\xe1\xbf\xdc\x0b\xbe\x77\x81\x7e\xe8\xd6\xd4\xef\x2b\x69\x0a\xd4\x54\x55\x14\x5a\x30\xc2\xf1\x60\x79\x76\x21\xa8\xf1\xe0\xfc\x1c\xfc\xb3\x34\xbb\xbc\x10\xd8\xbb\xee\x77\xc7\xd8\x7e\x08\xf7\xf1\x3f\x3d\x16\xfc\xea\xd8\x29\x88\xfc\x41\x83\x3a\x36\xa1\x7a\xb7\x9a\x08\x4b\x5f\xec\x74\x0f\xbd\x80\xf3\x4e\xa8\x71\x0f\x30\x80\xa8\x68\x87\x49\x82\x00\xc8\x7d\xf3\xa9\x51\xda\xe6\xbd\x44\x14\x27\x79\x1d\x13\x06\xd4\xe3\x94\xbe\xa3\xfe\xe3\xe7\xab\x15\x24\x02\xd2\xc0\x29\xd7\x25\x70\xd4\xc0\x92\xbd\x42\x30\x6e\xce\x31\x5a\x63\x58\x9d\x37\x93\xac\x17\x29\x54\xeb\xdc\xc4\x68\x38\x8d\x91\xce\x6d\x83\x3e\x23\xa7\x2b\xb7\xeb\x8c\xab\x61\xb6\xb2\xac\x41\x9e\xdd\x00\x45\x60\x88\x87\x3d\xb7\x7f\xf9\x44\x47\xbd\x34\xc4\x55\x1e\xdd\x69\x01\x1d\xe1\x57\x9f\x18\x1c\x77\x9e\x8c\x4c\xbb\x16\x5a\x8e\xb8\xce\x96\xfe\xa7\xa3\xec\xa7\xaf\x62\xd7\x76\xb3\x68\x3e\x6d\x65\xf7\xa6\x67\x25\x8f\xe4\xbf\xfe\xaa\xe0\x65\x57\x11\x1a\x84\xbc\xb4\x20\xbe\xd3\x2d\xe3\xe8\x76\xe3\x02\x5c\x1e\xc8\x23\x85\x3c\x1f\xc8\xa9\xa6\x70\x80\x73\x00\xb0\xc5\xe8\xdd\x8e\x80\xff\x58\x37\x8b\xce\x81\xaf\x45\x37\x8b\xce\xcf\xcf\xd5\xb8\x28\x9b\x8d\x49\x15\xc7\x0e\x20\xe4\x3c\xeb\xaa\x50\x79\x8d\x53\xa1\x22\x63\x6b\x03\xd5\x3a\x41\x6f\x88\xe1\x93\xa5\x0a\xcd\x5c\xd9\x85\xe5\x9e\xa0\xc0\x5a\xd7\xe3\xc9\x44\x41\x55\x86\x6c\xa5\xd8\xa4\xa2\x91\xe8\x26\x59\xbf\xa3\x82\xea\x70\xa2\x9e\x66\xe7\xf4\x04\x9b\x5a\xb5\x7f\x61\x41\x69\x45\x14\x36\x86\x8a\xb2\x1b\x86\xf5\x7d\x64\xd2\xa0\x7a\xbb\x9e\x59\xf2\x48\x83\x2b\x56\xac\xdc\xe2\xbb\x61\x0e\xd1\x9e\x72\x9f\x2b\x9b\x1d\xdd\x98\x76\xfb\x34\x27\xf1\x60\x4f\x1a\xdc\xf5\xcf\xd7\x2f\x65\x2f\x75\x24\x22\x7d\xde\x1a\xd8\x13\x85\xbd\x65\x48\x85\x8c\x97\x49\xbc\xd6\x2e\x25\xd1\xde\x34\x7e\xf1\xdd\x5c\xb4\xe2\x8b\x0e\xd2\x51\x83\x07\xcd\xc2\x6c\x7b\xba\x61\xba\x59\x04\x89\x0b\x03\x29\x54\x44\x0d\x30\xdb\x6d\x55\x0e\x9c\x6b\xac\xc2\x18\x53\x3f\xea\x8b\x5e\x1c\x05\x27\x89\xdd\x38\x22\x1f\x9c\x9f\x9f\x9b\x1c\x5a\x5a\x74\xdb\xa2\x23\xf2\x30\x09\x4e\xf2\x40\x8e\x30\x50\x6e\xf5\xb4\xf3\x31\xab\x99\x2e\x46\x80\x22\xf4\x16\xac\xf9\x5b\xfd\x4f\x79\x39\xac\xf6\xf1\xbc\xda\x39\x0c\xec\xd8\xed\x00\xb6\x6d\xc0\xd8\xd6\x7d\x44\x36\x2a\x15\x9b\xda\xc4\x19\xa7\xb6\xc9\x71\xba\x31\x7d\x33\xf0\xf8\x92\x77\x4a\x93\xbe\x9b\xb9\x4f\xf9\x52\x39\x59\xe7\x11\x17\x46\x0e\x38\x30\xc1\x2b\x01\xec\xb6\xe0\x94\x69\x18\x3b\x7e\x26\x6e\x89\x66\xbf\x99\x88\xb3\x60\xa0\xbd\x17\x6c\xdf\xaa\xda\x66\x98\xf2\x44\x48\xda\xa9\xce\x06\x8f\xe2\x02\x0d\xb6\x61\x1a\x4d\xc9\x1b\x65\x2d\x45\x9b\x82\x32\x9f\x40\xca\x5d\x77\x00\x37\xe9\x14\xb1\x0e\xee\x08\x45\xc7\xdb\x8d\xc1\x08\x55\xa1\x2c\x15\x10\x46\x8c\xc1\x3a\x78\x88\x91\x46\x60\x28\x87\x72\x1d\xd3\xe8\x17\xe6\x9c\x1b\x6b\xb4\x9a\x1b\xa8\x08\xbd\x67\x8b\x1a\xb7\x10\xa7\xf8\x46\x1c\x82\xf6\xac\xd3\xc1\xc4\x3a\xa9\xe5\x33\xa8\xae\x3d\x02\x8e\x67\x6c\xb4\xbf\xb9\x15\xdd\xf9\xcf\xe3\xec\x7a\x45\x57\x17\x05\x41\xff\xfb\x7f\x3a\x1e\xfc\xde\xf8\x62\xf5\x71\xc5\xfa\x66\x27\x5b\x08\xd3\xb2\xe0\x2b\x03\x94\x66\x85\xaf\x0a\xf0\x2e\x12\x79\x9c\x45\x94\x86\xb8\x89\x79\x93\xe1\x72\x6f\x25\x92\xc3\x0e\xd3\x3e\xef\x66\x14\x82\xd0\x6c\x87\xe9\x9a\x76\x64\x04\x12\x6b\xe2\xdb\x6d\xab\x7c\x34\x00\x68\xc0\xd8\xb9\xac\x14\x27\xf9\x4c\x0b\xa6\x5a\xce\x7d\x53\x14\x45\xab\x27\x0f\x4e\x0c\x28\x3b\x83\x89\x0f\x64\x77\x6a\x92\x49\x2f\x24\x7f\x9e\x96\x48\x1b\x65\xa5\x83\x65\x49\x22\x83\xa5\x47\xbe\xdd\xd8\xbe\xac\x78\x7b\xd5\xd9\x73\x62\x93\x2e\x1b\xe5\x80\x61\x5d\x23\x85\x10\x29\x9e\x4c\x85\xbe\xa2\x3d\x8a\x2c\x97\xd5\xd0\x8d\xa6\x09\x53\x6a\xdd\x38\x4f\x6f\x2a\xc8\x88\xd9\xa5\x79\x4a\x20\x39\x83\x9a\x09\x10\x9a\xcd\x59\xd5\x31\x38\xee\x0e\x78\xe0\x00\x7b\x4c\x51\x89\x96\xfb\xea\xfe\xe0\x0f\xf6\x57\xaf\xeb\x4a\x21\x67\x37\x50\x54\xc7\xe0\x9d\x8d\x3b\x43\x1e\x49\x2b\x90\x07\x32\x52\xa0\x93\x89\xe3\x64\xae\x63\x41\x74\x85\x03\xb7\x22\x4e\x21\x7a\x17\x83\xeb\x4c\x2e\xf0\x46\x1a\x19\xa9\x41\xce\x94\x56\x08\x9e\xbe\xb6\x14\x5c\x42\x5b\x34\xd7\xab\x4e\x1e\x71\xa7\x23\xa2\x38\x2c\x45\xd2\xb7\x0f\x35\xba\x2c\xa9\xe4\x0c\xf3\xa9\x72\x8c\x07\xa6\x41\xf9\xc3\x83\x3d\x59\x6c\x2a\xb7\x78\xec\x00\x64\xde\x5e\x8d\xd1\x10\x4b\x37\x79\xaf\x30\xc0\x1d\xc3\x06\xdb\x96\x0c\x02\xee\x40\x29\xf5\x67\x1d\x13\xa9\x35\x7a\xc0\x0d\xc6\x66\x12\xd0\x04\x20\x40\x4f\xcd\xae\x9c\x46\xa9\x29\x94\xe1\x88\xe1\x4c\x61\x00\x5a\x96\x53\x1a\x0c\xb9\xdd\x62\xed\xf7\xdf\x4a\xe2\x6e\x57\x44\x30\x92\x1c\x27\x65\x60\xe5\x6c\xa6\x40\xf6\x7e\x55\xee\x72\x3d\x84\x2d\xa8\xd2\xe0\x96\x47\x03\xf7\x36\x1b\xbe\x32\x03\x43\x36\x3b\xf0\x1f\x51\x95\x45\x73\x8e\xc0\x9f\x1d\x60\xd7\x94\x96\x86\xa9\xf0\x7f\xe7\x40\xf0\xa7\xfb\x6d\xa5\x53\x15\x52\xd0\x76\xc8\x05\xac\x94\x6e\x16\x15\x87\x87\xeb\x06\x35\x7c\x81\x7c\x04\x2a\x08\x3c\x22\x10\x32\x9c\x41\xa6\x78\x01\xa0\x29\x79\x9f\x87\xbd\xb2\x8d\x40\x16\xe8\x52\x39\xc8\xfa\x69\x25\x1b\x98\xde\x77\xce\xf5\x8d\xe0\xf9\x88\xa4\x49\x3e\x4f\xd8\x5c\x9e\xa8\xc8\x49\x4e\x43\x27\x87\x72\x33\x85\x43\x7d\x1a\xd8\xc9\xe0\x24\x7f\x01\xe3\x3c\xb8\x5d\xe9\x25\xef\xa0\x27\x9c\x07\x50\x22\x38\xc9\x6f\x87\x3f\xee\xa8\xe1\x53\xa3\x94\x5c\x8e\x3b\xa2\x28\xc3\x4e\x57\x96\x31\x8f\x79\xa9\x9e\xcb\x01\x2f\x9e\x9e\x3d\x71\xe2\xc4\x93\xe0\xeb\x17\xca\xff\x34\x1a\x0d\xf6\x42\x7d\x15\x68\x55\x2b\xe5\x97\x73\x74\xbc\xc6\xe9\xcd\xb8\x38\x40\x68\x62\xc9\x3b\x19\xb9\x25\x90\x42\xb3\xa0\xf4\x36\xc8\xd6\x81\x3f\x79\x2e\x9a\x02\xe0\x26\xe0\xb0\x63\xb9\x10\xae\x1e\xe8\x6b\xbf\xc6\x07\xaf\xd0\x8a\x27\x5a\x99\xc7\x6b\x6b\x22\x1f\xb2\x5a\xf6\x95\xf9\xc8\xdf\x07\x46\xdf\xf6\x24\x76\xcb\x16\xe9\x8d\xaa\xe2\xa3\x3d\x9b\x3b\xc4\xe1\x7a\xcf\x01\xf6\xb8\x8d\x41\x7e\xae\xf0\x2f\x1d\x08\xfe\x71\xff\x10\x4e\xaf\xb0\x22\x2a\xc3\x52\x7b\x03\x2b\xe2\x3a\x42\x58\x24\xce\xac\xa8\x9c\x7f\xbc\xa0\x13\xd2\xfc\x52\xc6\xa2\xc2\xe1\x3e\x6b\x06\xb7\x04\x3c\xf0\x0b\x49\xe0\x2c\x56\x5a\x9d\x30\x57\x26\x06\x52\xa9\x1c\x5b\x51\x14\xb2\x38\x4b\xc9\xb8\x61\x65\xbd\x30\xe1\x0b\x17\xa6\x16\x2e\xcc\xf2\x8e\x90\xbc\x4e\x5c\x74\xb0\x8f\xe8\xcb\x09\xcc\x9f\xec\x91\x61\x7f\xe9\x9e\x01\x0a\x12\x89\x9a\x1e\x79\x98\xdb\x8e\xcc\xc0\x0d\xc6\x70\xab\x92\xea\x28\xc2\xf0\x16\x15\x36\x6b\x73\xff\x8a\x0f\x8d\x73\x9e\xa8\xb9\x86\x01\xc7\xc6\xb1\xcd\xbc\xc8\x28\x54\x52\xca\x32\x7c\x46\xcd\x70\x1b\x15\xd0\xab\x82\x63\xa4\xae\xd2\x6d\xaf\x0a\x44\xb8\x8b\x8d\x20\xb0\x96\xd1\xb5\xbf\x26\x4a\x72\xb0\x1c\xa4\x4d\x94\xc6\x08\xd8\x65\xc5\x41\x9d\x56\xb8\xb7\x83\xbe\x35\x8e\x17\xb1\x35\x3b\x85\x10\x43\x7c\x07\xeb\x92\x5e\x11\x6e\xa3\x72\x23\xd4\x92\x4d\x1d\x9c\x3f\xeb\x2a\x8a\xad\x5d\x76\x12\x33\x4c\x79\x62\x6d\x36\x5f\xf5\x48\x47\x59\x77\x60\x8f\x82\xb2\x5d\x3e\xc7\x9f\xe4\xe1\x1b\x46\x91\xc9\x99\x86\x6e\x62\x5b\x72\xe6\xa3\x9c\x9c\xd8\xc7\xf7\xb3\x6b\x43\x48\x19\xaa\x32\x6e\xfb\xef\xdf\x1f\xbc\x7d\xbf\xfb\xec\x72\x74\x28\x29\xc7\x6f\x8d\x22\x84\x1f\xb1\x97\x4e\x4d\xaf\xb9\xef\x66\x35\xd2\x56\x55\x9d\xd0\x11\x65\x3b\x8b\x26\x6b\xb4\xad\x88\x79\xb3\xf6\x3f\x35\x15\x09\xf8\xc7\x40\x76\x69\x1b\x87\x5c\x7f\xb0\x5e\x61\x41\x25\xfe\xa6\xa5\xc8\x5b\x52\xd6\xa6\x08\x69\xc9\xa9\x15\x16\x8f\x1d\x9a\x24\xcc\xa4\x96\x04\x17\xbd\x30\x2e\x0b\x8b\xb1\xb2\x84\x69\x28\x2f\xcf\xb1\x68\xc9\xc5\x02\xb8\x32\xa1\x1c\xe6\xd4\x05\x6d\x2e\x49\x95\xa3\xaf\x4e\x1f\xe6\xbc\x99\x81\x83\x1d\x86\x27\xd0\xc9\xaa\xcc\x31\x60\x26\x81\x74\xb0\x75\x57\x35\xa5\x1e\x58\x88\xb8\xd0\x29\xdb\x74\xda\x34\xad\x6f\x5b\x84\x64\x7c\x79\x7f\x64\x88\xbd\x92\x31\x35\x30\x8b\xd1\x5d\x1a\x0d\xd7\xd0\x76\x95\xe6\xa4\x58\x07\x4e\x8f\x64\x6c\xd0\x11\x6c\x59\x1e\x45\xba\x9d\xca\x9c\x5f\x1c\x63\xd7\xb4\x8a\xbb\xf3\xac\xd7\x5d\x00\x93\xae\xff\xf1\xb1\xe0\x43\x63\x73\x44\xe5\x89\x46\xf7\xd2\x48\xe4\x49\xdf\xe2\x97\x14\x49\x47\x11\x11\xb0\x13\x37\x53\x91\x17\xed\xb8\x8b\xde\xe6\x03\x28\x75\xf4\x21\x2d\x36\xca\xa2\x24\x51\x36\x38\x78\x55\x73\x17\xf8\xaa\xc9\x4f\x2f\x59\x1d\x53\x8a\x59\x88\x4b\x34\x4a\x47\xb9\x8d\xe3\xc1\xac\x78\x61\xd2\x6d\x87\xf5\x44\x6c\x08\x4a\x8c\xa7\xc8\x5f\x3b\x4b\xb3\x1c\x2f\x8f\x82\x0c\x48\x70\x48\x70\xc1\xd4\xea\xe2\x69\x72\xdb\x77\x7c\xc9\xb7\x9a\x5e\x0b\xa0\xf0\x71\xec\xf0\x16\x37\xb6\x1d\x26\xef\xff\xf8\xe3\x82\xff\xe5\x39\x81\xf3\x2e\x82\x89\x65\xfa\x26\x8c\x0c\x74\x2b\x6c\x0d\x41\x2f\x18\x00\x1f\xd1\xb2\x46\x3f\x0d\x3b\x24\xfb\x6b\x11\x09\x76\x8b\xdd\x32\xdd\x67\x00\xea\xa4\xc3\xd9\x6e\x1b\x70\xf5\x77\x11\x36\x1c\x77\x57\x51\x36\x71\x5a\x52\x03\xc0\x1e\x82\xba\xae\x71\xc9\xbb\xca\xb4\xec\x26\xd7\xfc\xc0\xf5\x2c\x65\x8f\x83\xb8\x41\xec\xf7\xa9\x8b\xdd\x30\x05\xcb\xee\x85\xe0\x9e\x99\x21\xcf\x25\xcd\xda\x74\xd1\x6c\x2a\xbd\x92\x1f\xa9\xbd\x27\xe4\x67\x2e\xa2\xd6\x2b\xc6\xd9\xf5\x14\xa8\x48\xbe\xe9\xb1\x28\xfc\xaf\x8f\x05\x3f\x33\xb6\x28\xe4\x2a\x36\x4b\x3b\x6c\x4b\x95\x20\x3f\xe7\x8d\x9d\xcd\x2e\x3f\x65\xd1\xd1\x6e\xd2\x5b\x8b\x8d\x69\x5a\x52\xc7\x6c\x33\xb5\xac\x35\x06\x87\xc6\x66\x6a\x0a\xc0\x29\x45\x26\x49\x79\xd1\x2b\xd4\x8b\x65\x91\x77\x94\x59\x2f\x44\x94\x71\x0d\x3b\xaa\x6b\xcb\x69\x38\x20\xca\x54\x52\x48\xee\xf0\x60\x10\xd7\x62\x94\x07\x74\x24\x2e\x83\x69\x35\x90\xb1\x83\x43\xd8\xb3\xe6\xef\xd6\x9a\xbf\x67\x6e\xbf\x72\x73\xfb\x57\x3d\x76\x35\xdc\x47\x0a\xc9\xfe\x8b\x5e\xf0\x11\x6f\x6e\xf8\x91\x1e\x42\x61\xd5\x06\xac\xd0\x9f\x5c\x50\xa0\xb9\xd1\xef\x14\xa4\x4a\xa5\x86\x6a\x1c\x02\xba\x9e\x15\xe4\x59\x50\xe3\x41\x91\xb5\xca\xe0\x7b\x00\x56\x53\xcb\xff\x11\xaf\x2b\x4b\x19\x92\xde\x85\x0b\xa4\xc0\x2c\x10\x53\xa9\x15\xc6\x89\xbc\xac\x25\x53\x0c\x64\x17\xbe\xdc\x8a\x89\xfd\x8c\xed\x5d\xf0\xe0\x16\x4e\xf8\x3b\x0b\x29\xff\xe6\xf0\x40\x7c\x8d\xc7\x98\xb9\x27\xfd\x17\x79\x81\x58\x30\xd7\x66\x3b\x4b\xa2\xa1\x77\x29\x59\xb4\xd5\x9d\x44\x58\xe7\x44\x23\x10\x25\x60\x63\xab\x55\xde\x32\xc0\xe4\x1c\xb3\xef\x3b\xff\x29\xc1\xf1\x05\xab\x29\x57\x93\x05\x21\xb7\xb4\xc4\xd6\x47\x0e\x4f\xf1\xc3\x1e\xbb\x26\x17\x00\x0c\x40\x1c\xdb\x4b\xbd\xe0\xe2\x23\xb0\x4f\xd1\xa9\xc0\xb4\xe3\xc2\x16\x03\x64\xb2\xcb\xed\xfc\x9d\xc7\xae\xc7\x79\xba\x0b\x55\xab\x67\xb3\x48\xf8\x7f\xe8\x05\x9f\xa5\x7c\xbc\xd6\x63\x6b\xe0\xed\x6c\x10\x2d\x6d\x56\x36\x5b\x58\x3a\x21\x7b\x4c\x92\xfa\xae\x66\xbd\x34\x6a\x70\x27\xd3\x8a\xd3\xc8\xbc\xd2\x19\x03\x96\x57\xa1\x43\x8f\x1e\xce\x4b\xcf\xf2\xff\x16\xdb\x7b\xb6\xdc\xe5\xdf\xb9\x5d\x00\xbe\xcd\x84\x0d\x75\xff\x7e\xa7\xc7\x9e\x69\x8e\xa6\x94\x88\x80\x0d\x2a\xea\xc6\xaf\x50\x9f\x52\xa7\x80\xe6\x39\x9f\xba\x74\xef\xb9\x25\xb8\xe4\x16\xf2\xac\x5b\xdc\x9b\x2f\xc1\x08\x66\x24\x91\xf0\xcf\x05\x67\xb6\x7a\xef\xc6\x14\x57\x4a\x22\x96\x02\xdd\x34\x40\x73\x1a\xec\xab\xd7\xb0\x5b\x6c\x10\x4e\x05\x5a\x8f\x39\xcc\x09\x6e\x74\x63\xba\x71\x1f\x66\x75\x98\x85\x5b\x03\x31\x3c\xfd\xff\x76\x4d\x70\x61\xc8\x73\x37\x97\x4a\x05\xec\xbd\x13\xae\x0b\x1e\xf2\xe5\x33\x4b\xb2\x58\x4a\x6e\xed\x5a\xaf\x4e\xc9\x23\x1c\x9e\xf3\xe3\x57\xb3\x07\x3d\x36\xd1\x0c\xef\xea\xa5\x51\x22\xfc\x5f\xf0\xfc\x7d\xab\xfd\x52\x04\x6f\xf5\x56\xd4\xc3\x15\xbc\x45\x17\x4e\x9d\xe5\x2a\x51\xd1\xec\x0c\x5f\x85\x77\x76\x72\x73\x4b\x99\xe8\x68\x6e\xa9\xdd\xc3\x3a\x85\x90\x95\xb4\x15\x64\x4a\x07\xce\x58\x25\x42\xcf\x7b\x45\xc9\xf3\x2c\x2b\x35\xe6\x85\x5e\x64\x38\xae\xb0\xa9\xed\xf3\xf7\xb2\x31\x76\x90\xf4\xbe\xfe\xff\xeb\x6d\x91\x14\x78\xe4\x3a\x90\x8e\xd2\xc4\xb8\xbe\xd7\x5b\xa1\x1a\x57\x46\xa6\x46\x47\x2d\x3b\xd2\xd1\xb8\x50\x83\x6d\xf0\x53\x31\xf0\xe4\xa6\x82\x2c\xe7\x2b\xbd\x3c\x59\xd1\x00\x09\x26\x89\x09\x63\x24\x59\xab\xfc\x1e\xb1\x9b\x08\x21\x1e\x04\xfd\x48\x01\xd6\x9f\x28\x44\xaf\x10\xa6\xa1\x06\xfb\xfa\x04\x1b\xef\xe5\x89\xff\xd5\x89\xe0\x4b\x13\xd8\xe6\x5a\xbc\x41\x44\x56\x61\x24\x28\x42\x4b\x4d\x02\xe0\x92\xce\x3a\x75\x7e\xf1\x0c\x26\xa3\x3a\xb2\x02\x2c\xa1\x38\x39\x05\x21\xa3\x27\x25\x93\x3e\xd5\x0d\xcb\xf6\xca\xa4\x0b\x94\x9b\xb5\x68\x74\x99\x3d\xe6\x61\x43\x5d\x6e\x0b\xbe\x22\x2b\x5b\x51\xdd\x97\xfc\x50\xae\x44\x60\xe3\xd5\xac\x66\xc0\x1d\xfd\x6d\x3a\x6a\xdc\x34\x43\x54\x2d\x2d\x4a\x11\x92\x99\x05\x70\x16\xd0\x33\x63\x15\xb1\x51\x93\x0d\xc9\x9e\xc6\xa1\xd6\xa4\x40\x38\xb8\x1c\x75\xd6\xb1\x36\x57\x81\x11\xe6\x35\xbe\x02\x28\x83\xfa\xf9\x8a\x82\xc0\xa7\xba\x78\x9c\xd6\x95\x29\x5d\x56\x14\x12\xed\xdc\xd4\x08\x0a\x3c\x09\xfb\x08\x93\xb9\x11\x67\x09\x4c\xfa\x64\x43\x0d\xbd\x63\xa5\xad\x09\x53\x3e\xbf\xa0\x82\x0e\x1b\x8c\x2d\x24\x02\x1c\xb6\x34\xb2\x38\xc2\x9c\xaf\x68\xb8\x04\x9c\xe5\xe9\xe3\xb7\x34\x8e\x35\x8e\x35\xa6\x57\x10\x29\x96\x6a\x96\x7b\x27\x2e\xd6\xfb\x0a\xb0\x5a\xee\x93\x52\x52\x86\x35\x79\xc1\xf1\x66\x88\x88\x9d\x98\xa5\xc7\xec\x58\x48\x6a\x97\x24\x30\x71\xca\xfc\x2f\xcb\x84\xa9\x75\xf0\xc8\x2b\x00\xa6\x35\x15\x78\xd6\x81\xea\x68\x4b\xb5\x7b\x08\x96\x7a\xcd\x36\x62\x83\xca\xd7\xb2\xe5\x24\x5e\x17\x49\x9f\xb4\xb5\x52\xc4\x96\x3b\x4a\xde\x36\x35\x1e\x37\x44\xa3\x06\x9b\x41\x84\x05\x14\x29\x7b\x79\xca\x7b\x5d\xc4\xc6\x48\xc5\xa6\x46\x10\x24\xac\x31\xd8\x9a\x7a\x93\x05\xc0\x5c\x05\x28\xa9\xcb\x1d\x4c\x2f\xa4\xbc\x09\x44\x30\x50\xdc\x57\xd0\x60\x6c\x06\xe1\xb7\xe5\x55\x48\x40\xd5\xa4\x29\x69\x69\x7c\x70\xa5\x39\x4d\x95\xad\x45\xeb\x75\x08\x16\x34\x94\xcd\x34\xf8\xfd\x59\x0f\xca\xea\x64\x2a\x21\x40\x44\xa1\x91\x4c\xce\x9f\x0e\x5b\xa7\x6a\x88\x78\xe8\xa3\xe7\xa4\xf2\x32\x1e\x1a\x26\x6b\x84\xec\x6f\x59\x4a\xf1\x97\x3e\x97\x4d\x51\x82\x84\x2c\xe7\xab\x61\x11\x37\xc1\x60\x87\xcc\x74\x20\x5f\x9c\x94\xcd\x6f\x66\x79\x74\x67\xa0\x01\x1a\x51\xd4\x6f\xf0\xd3\x79\xb8\x86\x1a\xd5\x23\xc1\x0d\x8d\x46\x23\x98\x84\xb1\x3f\xaf\x27\xf2\xbe\xcd\x1e\x1e\x09\x9e\x42\x6f\x41\x21\x52\x1a\x54\x23\x01\xe4\xcd\x21\xc0\x2f\xd9\x57\xc5\x9c\x6e\x67\x39\x41\xe9\x22\x4e\x77\xaa\xa1\x9f\x7a\x89\xf0\x3f\x3b\x1e\x9c\xa9\x3c\x23\x26\xd5\xb9\xd7\xe4\x01\x30\xba\xa0\x10\xdc\x24\x35\xdf\x2a\x77\x90\x92\xdd\x2e\x79\xfb\x37\x44\xbe\xea\x7a\xc9\xff\xd5\x18\xfb\x84\xc7\x1e\x93\x9a\x76\xce\x2f\x9e\x29\xfc\x0f\x78\xc1\x25\xef\x9c\xfb\x90\x84\x45\x4c\x1b\x03\xb0\x4f\x61\xc2\x7b\xb9\xca\x0d\x44\xd3\x4d\x34\xcb\x85\xd1\x6c\x70\x7e\x94\xf2\xdc\xa8\x09\x5a\xed\x11\x00\x8d\x4a\x41\xd0\x4b\x92\x1a\x26\xd8\xe0\x45\x29\xba\x8a\xac\xc9\xcd\xd2\xe0\x3c\x38\x1a\x90\xfa\x22\x4c\x92\xad\x24\x97\x37\x7b\x0c\x87\xe9\xff\x90\x17\x5c\xbc\x20\xf2\x55\x37\x70\xc0\x4a\x18\x68\x4f\x0e\xa7\xac\x22\xab\x45\x8d\x40\x76\xd7\x24\xd3\xd8\xcd\x0a\xf9\xdf\x5e\x59\xa3\xbc\x1e\x35\xd9\xa1\x66\xbb\xc6\xdb\x22\x8c\x6a\x0a\xc1\xe6\x72\x3a\xf8\x63\xe3\x8c\x0f\x51\x79\x9c\x4a\x37\x4e\xe7\x59\x87\x20\xda\xff\x61\x2c\x38\xe9\x3c\xa9\x82\x6a\x18\x88\x76\xbd\x24\x1a\xdd\xdc\x5d\xe1\x77\x8f\xb1\x26\xbb\x5a\x03\xad\x2f\x8a\x96\xbf\xb4\x45\x0a\xdc\x01\xac\xf5\x53\xe9\x06\x81\xac\x3f\x7e\xd9\x81\xa5\x2f\x33\xca\xc4\x04\x52\x3e\x4b\xd9\x01\xf4\xea\xf3\xa3\xe0\xbe\x99\x54\x93\x0d\xeb\x98\x22\x14\x21\x64\xc6\x01\x35\x20\x65\x66\x18\x48\x34\x60\x23\x1f\xcd\x3e\x67\x7e\xee\xd4\xb9\xe5\xf9\xd3\xf3\xa7\x16\x9d\xe3\xf4\x4c\x76\xa8\x10\xcd\x1c\x21\x3a\xce\xee\x00\xa1\x63\x09\x4a\x9b\xe1\xfc\x6b\x39\x1c\x7c\x58\x1d\xcb\x1b\xf7\x0d\x75\x18\x3f\x75\x51\x34\x67\x30\xdd\xc7\xdf\x8f\x07\xd3\xe6\xa7\x73\x00\x03\x79\x2d\x00\x3a\x31\x39\x09\x05\x1c\x33\x0f\xba\xee\xb7\x1f\x18\x67\xef\x1d\x67\x07\xc9\x45\xcc\xff\xa9\xf1\xe0\x3f\x8f\xcf\x92\xbf\x98\xca\xee\x69\xbb\x8f\xc9\x09\xbb\x28\x9a\xbd\xd2\xb1\x1d\xea\x46\xd0\x4e\x40\xe8\x1a\x3c\x8a\x73\x50\x9c\xf5\x35\x25\x50\x75\xc1\xfd\x97\x65\x25\x3f\x72\x78\xea\xf0\xa4\x8d\x09\xa0\xd0\xb6\x20\x75\x08\x70\x99\x0a\xd0\x40\x77\x8a\xf4\x09\xb2\x1f\x87\x23\x95\x29\x13\x2e\x7d\x18\x32\xf4\x2a\xe4\x45\x5b\x80\xa3\x56\xc6\xcb\x3c\xd4\xaa\x78\x78\x0a\x97\x5d\xde\xc3\x44\x8c\xfc\xc8\xe1\xef\x3d\x0c\x1e\xbf\x93\x7c\x33\x4b\x0f\x97\x04\x7b\xb5\xac\xe8\x37\x55\x24\x6f\x68\x75\x9b\x8a\x8b\xdd\x24\x6e\xc6\x25\x79\xa7\x71\x88\xdd\xcf\x94\x4c\x2e\x92\x44\xb2\x5d\xb1\x1d\xc3\x7f\x0c\x66\x93\x84\xd7\xb0\xe0\x49\xbc\x21\xa6\xda\x22\x4c\xca\x36\xe2\x13\x4a\x32\x00\x30\x96\x00\xeb\x4c\x6f\xb6\x3a\xc1\x7f\x7f\x68\xe8\xee\x38\x13\x77\xe2\x72\x31\x4c\xd7\x84\xff\x85\x43\xc1\xbd\xe6\xa7\x3c\xa0\x85\x51\xa1\xa1\x99\x1a\xb0\x49\x50\xc1\x80\xe7\x80\x8c\xe5\xba\x18\xdc\x9f\xda\x85\xd5\xdd\x3b\x3f\x3e\xb1\xa7\x0d\xdd\xd3\x86\x7e\xe3\xb4\xa1\xff\x22\xd5\x83\x9f\xf4\xd8\x3e\x29\x88\xf9\xbf\xee\xb1\xa9\x6d\x6f\x13\x73\xbc\x21\xca\xf1\xd5\x1e\x04\x61\xd8\xc7\x8e\x4e\xb8\x90\xcc\x5a\x13\x52\x71\x3e\xb2\x03\x91\x7d\xaf\x87\x69\x54\x47\xda\xf7\x90\xb7\xb8\xbd\xd6\x69\xca\xaf\x0f\x8b\xa7\x32\x83\xab\x86\x52\x7d\x7c\x82\x35\x76\x94\x30\xdf\x20\xa1\xbc\x7e\x22\x38\x51\x7d\x38\x0c\x5c\xc0\x2e\x33\x2a\xa8\xf3\x8b\x07\xf6\x08\xdf\x6e\x09\xdf\x45\x15\xd4\x99\x05\xdf\xa9\xe3\xc8\xb5\xaf\xd5\xe0\x42\xd8\x37\xe1\xed\xec\xe4\x16\xa0\x7e\xdb\xec\x86\x3d\x92\xbb\x0b\x92\xbb\x6a\x51\xdc\x0b\xbb\x8b\xf6\xfc\xd6\x11\xc1\x9e\x0f\x79\xc9\xf6\x14\x63\xde\xbf\xdb\xe0\x94\x98\xf5\xae\xa8\xaa\xab\xe7\x7d\xa8\xba\xfa\xfb\xaf\xb3\x73\xc3\x6c\xd1\xf3\x99\x85\x79\x70\xb5\xf0\x3f\xff\x98\xe0\x7e\xf5\xc3\x55\xf5\x22\x60\x6f\xe9\x06\x36\x12\xc2\x57\x4d\xfb\xd9\x74\x41\x8d\x96\x9b\x77\x28\x40\xc1\x70\x1a\x3a\xbd\xe6\x84\xfa\xd0\x21\x3d\x2f\xbb\x76\x8f\xf4\xec\xf1\x5c\xdf\x38\x02\x70\x82\x12\xd7\x3d\x31\xf8\xb7\xe9\x88\x9c\xe5\xb8\x8f\xed\x8f\x7e\xd3\x63\xd7\xe9\x4d\xaf\xf6\xed\xcf\x7b\xec\x69\x57\x40\x3f\xe0\xd4\x51\x1d\xa7\xb3\x7c\x4e\xa1\xaf\x05\xcd\x6a\x0b\x1a\x60\x9e\x7e\x9a\x63\x47\x4e\xb9\x33\x0b\xf3\x64\xec\x50\x2e\xbc\xdd\x3c\x5b\x0d\x57\x13\x9d\xbe\x41\xd9\x1f\xa9\x8a\x06\xfb\x93\xfd\xec\xdf\xe0\x27\x33\xa8\x08\xbe\xab\x4f\x86\x9f\xf9\xb9\xc5\xc2\xff\xf8\xfe\xe0\x4f\xf7\x85\xbc\x13\x76\xe5\x64\xd0\xf2\xca\x57\x28\xda\xa3\x59\x84\x60\xeb\x28\x60\x0b\x15\xe9\xca\x25\x15\xe7\x8e\x2b\xef\xed\x32\xe3\x6d\x91\x74\xa9\x26\xb9\x43\xa4\x90\xa6\x54\xe0\x3a\xe4\xa9\x28\x15\x11\xac\x8b\x56\x2b\x6e\x42\xb3\x9b\xa1\x09\x92\x6a\xf0\x59\xaa\xa1\x19\xa6\x5a\x03\x0a\x59\x7d\xba\x39\x18\x20\x2b\x9d\x0b\x0b\xde\x55\x19\x00\xa1\xfb\xe4\xa3\xd9\x47\x3c\x44\xd8\x8b\x80\xda\x9a\xb5\x0c\xca\x2b\x66\xc8\x2e\x6a\xba\xbb\x96\xe1\x03\x8d\x1a\x29\x40\xe5\x43\x39\x88\xc1\x99\x9f\x5b\x44\xe9\x9e\x9a\xc7\x8c\xaf\x64\xf7\xc4\x30\x69\x98\x58\x9a\x2c\x08\xae\x4b\xd7\xad\x00\x22\x9a\x62\x39\x2a\xea\x98\x95\xbf\x0a\x81\x20\x3b\x21\xa8\x69\x29\x0e\x08\x94\xd5\x61\x6a\x68\xd5\xfc\x02\x8e\x50\x36\x59\x53\xbe\x84\x54\x2d\x4c\xb7\x4a\x7a\x8e\x3d\xec\x51\x74\xab\x5d\x81\x3a\xf5\x3c\xc9\xb2\xf5\x82\x87\x25\x7f\x46\xfd\x74\x96\x6f\x86\x79\x24\x22\xf9\x17\xa8\xe9\x50\x09\xfc\x8c\xfa\xa2\x08\x93\xfa\x7c\xd7\x7a\x46\xe7\xbe\xb1\x28\x3a\x59\x29\xe4\xc6\xe2\x47\x62\xd2\xa9\x66\x79\x24\xf2\x49\xe5\x0a\x6d\xf5\x6d\x7e\xc1\x61\x89\x16\xd8\x39\x76\xe6\x0a\x8e\xd3\xd2\xa8\xcd\xcc\xde\xe4\x31\x7d\x05\xf9\xaf\xf6\x82\xe3\xea\x07\x68\x50\xad\x83\x55\x58\x97\x9d\x8a\x75\x57\x34\xc0\x74\xf0\x5e\x76\xf6\x61\x3d\xef\x0f\x79\x0b\xdb\xb3\x09\x75\xff\x89\xc3\x04\x0b\x75\x79\x57\xc5\x8a\xdf\x19\x67\xdf\x39\xaa\x53\x8a\x04\xcc\xa7\xad\xcc\x7f\xd7\x78\xb0\x2c\xff\x30\xb7\x3f\xbd\x46\x4b\x98\x09\x18\x03\xc7\x81\x4d\x71\x38\x49\x20\xb2\x4d\x41\x34\x03\x3d\x16\x03\x19\x4f\xa4\xb4\xd1\x09\x9f\x9b\xe5\xf2\xdf\x38\x95\xff\xb2\xb5\xb8\xd4\xf9\xb7\x0f\xad\xc5\xe5\x6c\xd6\xe9\xc4\xe5\x25\xef\xea\xb5\xb8\x5c\xce\x85\x58\x2a\xc3\x52\x5c\xf2\x0e\xad\xf6\xe2\x24\x9a\xc3\xbf\xd7\x32\xfd\xc9\x44\x33\xeb\x74\xe3\x44\xe4\x97\xbc\x89\x6e\x12\x96\xb2\x2d\x87\xa1\xf8\x8a\xc7\xbe\x8d\x99\xaf\x7d\x47\xc7\xf4\x6d\xcc\x34\xe9\xbe\xf9\x76\xe6\x74\xc0\x7d\xf9\xaf\x99\xd5\x6d\xf7\xd5\xe3\x18\x8e\xd0\x7d\xfa\xad\x4c\xf7\x73\xb0\x03\xd9\xc8\x8a\xe4\x14\x0d\x54\xa4\x46\xe9\xbe\xf8\xd8\x7e\x27\x87\x72\xd8\xed\x16\x72\x77\xcd\xe9\xd8\x39\x0d\xd6\xe9\xbf\x69\x7f\xf0\xb4\x21\xcf\x2b\xae\xae\x52\xbc\x25\xcd\xb7\x15\x80\x07\x16\x08\x95\x18\x0e\x01\x3b\x09\xf9\xff\x92\x77\x00\x25\x62\x57\x2d\xbe\x8f\xdd\xcf\x0e\x76\x44\x51\x84\x6b\xc2\x3f\x17\xcc\xcc\xf0\x76\xaf\x13\xa6\x92\xf4\x44\xe0\xde\x41\xef\x94\x2f\x0a\xa8\x55\xd1\x9d\xd8\xc2\x0c\x2d\xf3\x30\x2d\xe2\x01\x74\xec\xd3\xec\x40\x2e\xc2\x22\x4b\xfd\xdb\x83\xa9\x65\x00\xc0\x95\xbf\x2c\x6d\x2c\x8d\xed\x70\xc1\x93\xb0\x28\x47\xd5\x73\x86\x51\xdf\xfd\xbb\x82\x9b\x96\x1c\x5c\x52\x5d\x45\x4d\x19\x98\x97\x21\xf8\xf3\x34\x7a\x8d\x9f\x4f\x01\xdf\xd8\xa9\xed\x38\x01\xf8\x1f\x0d\xbe\x63\x99\x7c\x89\xac\x19\xd4\x15\x3a\xdf\xbc\xc6\x63\xbe\xec\xe1\xb2\xee\xe0\x72\xdc\x11\xfe\x0b\xd8\x2d\x57\x40\x52\xe4\xa7\xc1\x9d\x67\x60\xc0\x71\x47\xb8\xe3\xb0\xe6\x40\xa5\x4f\x87\x14\xb3\x38\xea\x32\xe3\x61\x0a\x81\x37\x0d\xb6\xc1\xae\x95\x5d\x3a\x0f\xec\x19\x74\x27\xba\xf2\xee\x4c\x2e\x03\x1f\x6d\xba\x04\x2e\xfd\xaa\x4f\x9b\x61\xa1\xd9\x40\xf6\xb9\xef\x66\xdf\x6e\x6d\xe5\x55\xb8\xf7\x36\xa6\x1b\x4f\xcd\x56\x01\x94\xe3\x7d\xdf\x1d\xdc\x42\x7f\x5b\x7b\x56\x12\x22\x39\xd0\xe7\x66\xab\xa4\xc1\xd7\x0e\xf9\xf2\xda\x02\x73\x53\xe3\x92\x37\xa1\x40\x95\x5c\x50\xb2\xef\x62\x5f\xf4\x98\x7e\xe7\x7f\x6a\x27\x58\xe4\x16\x1c\x0e\x28\xa7\xde\xe0\xcd\xb9\xce\xe2\x19\xc5\x7e\xe8\xa8\x00\xe5\xdb\xd5\x16\xa9\xea\x23\x84\xcf\x3e\x37\x5b\xbd\xec\x8c\xc8\x92\x1b\x4a\xb2\x30\x2a\xa6\x4c\xf4\x48\x31\xf5\xdc\x6c\xb5\xa8\xe7\xbd\xb4\x5e\x66\x75\x8a\x98\x88\xb3\x74\x8a\x7d\x6d\x1f\xfb\xd6\xb2\x4c\x08\x43\x0c\xe2\xc1\x4f\xc7\x29\xc4\xa0\xfa\x5f\xd8\xa7\xa0\x76\x7e\x75\xdf\x88\x32\x4a\xcb\xa6\xc2\xa0\x60\x0d\x81\x36\x3c\x35\x5b\xc5\x41\xb6\x21\x1d\x3a\x15\x37\x0b\x70\x04\x4d\xb4\x7c\x96\xc2\x37\x24\x3f\x70\x3a\x8c\x13\x11\xa9\x94\x73\xb6\x3f\x18\xe6\xc9\x1a\xd1\x07\x0c\x25\x94\x5d\x90\x8d\x52\x5b\x85\xb2\x8f\x88\x24\x46\x68\x7e\x0a\xc1\xea\x95\x99\xbc\x74\xd0\x1b\x0f\xad\x8a\x51\x03\x5d\xd5\x54\x15\x10\x9b\x85\x04\x07\x5e\xd7\xc0\x11\xdc\x84\x79\xad\xf5\xc2\x3c\x4c\x4b\x21\xc8\x1b\x03\xed\xa6\xf1\xf3\x45\x5e\x98\x24\xfe\xe4\xbd\x36\x64\x30\xe4\x11\xa7\x5a\x43\xdb\xcb\xe8\xae\x0d\x9b\x0c\x39\x98\xe7\x8b\x3c\x33\xb5\xac\x8a\x66\xd6\x11\x03\xc3\xa5\x5a\x9c\x28\x6d\x9c\xaf\xb8\xd4\x53\xb5\x45\x7c\xc6\xe5\x86\x67\x2c\x2f\x9f\x71\x17\xc7\x38\xe4\x59\x00\x4b\xbf\x7c\x90\x5d\x6b\x76\x21\x78\x22\xbe\xf3\x60\xf0\xe6\x83\xb3\xce\x33\x0b\x0e\x06\xdc\x10\xb3\x88\x9b\x8f\x88\x1b\xcb\xc3\xe6\x3a\x4c\x92\x0e\xbe\x5e\x39\x97\xa5\xf3\x69\x24\x2e\x8a\x68\x85\x1f\xa1\x78\xc6\x49\x70\x49\x51\x8f\x1b\x8c\x39\xa5\x94\x63\x3e\xf1\xd6\xb4\x05\xac\xf4\x0e\x2a\xc6\x48\x47\x22\xe5\x02\x4d\xec\x10\xb5\xdd\x90\xfd\x6c\xd8\x5d\x33\x78\x0a\x49\x5f\x7f\x1c\xc9\x11\x14\x14\x6f\xe0\x0e\x46\x36\xd7\xce\x3a\x59\x92\xad\x65\x48\x6c\x4d\xd2\x0a\xd9\xd9\x51\x3d\x95\x15\x9a\xe3\x06\x31\x83\x4e\x9e\x01\xbb\x05\x59\x05\x92\xf5\x63\xb2\x81\x23\x83\xbd\xae\xf3\xe9\xc9\x9a\x9b\x59\x16\xa4\x25\x29\x8f\xa3\xba\x04\x49\xae\x4b\x7d\x9e\x9b\xad\x5a\x14\xa5\x0e\xed\xa0\x6c\xb3\xb3\x79\x84\xcd\x25\xb6\x98\x32\x63\xa4\xa3\xba\xe1\xac\xea\x98\x2d\x3d\x39\xb5\x21\x0b\x31\xe0\xe1\x05\xfb\x79\x05\x0b\x76\xc3\x3c\x4c\x12\x91\xc4\x45\xc7\xf8\x82\x25\x24\xa2\xa6\x72\xc7\x88\xe7\xf5\x30\xd7\xc5\xf4\xb1\x67\xdf\x34\x10\x56\xb4\x8b\x63\x42\x7d\x06\x7a\x65\x47\x2e\x21\xb1\xb7\x96\x0d\x83\x24\x69\x6b\x0f\x0b\x92\x54\x51\x6f\xb2\x2a\x2b\x5c\x30\x5b\x85\xa6\x0b\x1e\xda\x28\x29\xa5\x06\x6d\xd1\x1a\xa9\x9a\x36\x40\xab\x40\xc3\xf5\xb8\x5b\xe8\xb0\x3c\xc5\x31\x3d\x35\x5b\x75\xf8\x92\xdf\x1e\x67\x57\x59\x13\xed\xff\xca\xb8\xba\x2b\xde\x31\xbe\xa4\x8f\x2d\xe0\x29\x88\x02\x22\x2e\x0d\x38\x9b\xb3\xd4\xfa\x6a\x80\x24\xd9\xea\xa2\xb6\x92\x84\xf6\xd0\x3d\xaa\xc1\xff\x3f\xf6\xde\x05\x3a\x92\xec\xac\x0f\x3f\xd5\xd2\xbc\xee\xec\xc3\x2e\x13\xfe\x09\x10\xb8\x29\xaf\x19\x69\xd3\xdd\x92\xe6\xb9\xa3\x5d\xef\xa2\x91\x66\x76\x64\xcf\x43\x96\xb4\x6b\xbc\x0f\xef\x5c\x75\xdf\x96\xca\x53\x5d\xd5\xae\xaa\x96\xa6\xd7\xde\x84\x78\xb1\x79\xd8\x3c\x8c\x6d\x1e\x63\xcc\xcb\x76\x00\x1b\x42\x1c\xec\x04\x63\x07\x30\x8e\x71\x0e\x26\x86\x40\x0e\xe1\x61\x13\x63\xc0\xf8\x4f\x62\x20\x81\x84\xb0\xbc\xfe\xe7\x7e\xdf\x77\x6f\xdd\x5b\x5d\x2d\x69\x56\xbb\x6b\xfe\xe7\x8c\x0f\x9c\x1d\x55\x57\xdd\xf7\xfd\xee\x77\xbf\xc7\xef\xc7\x57\x90\x77\x4a\xcd\x47\x1c\x46\xe5\xbd\x40\xa5\xa2\x49\x6f\x80\x59\xbd\xe1\x7a\x2c\xa2\x6c\xe8\xe7\x28\x22\x3a\x73\x48\x61\x8f\xa2\x64\x0b\xc1\x4b\x69\x31\x80\xf5\x01\x02\x68\x10\x6e\x25\x04\xa6\x27\x58\x70\x6e\x2b\x66\xec\x36\xd8\x05\x00\xf6\x92\x21\xbf\x98\x31\x06\x50\xab\x11\x3a\x4f\x78\x54\x23\x69\x24\x9e\xdd\xe3\xdf\x11\xca\x1f\xdc\xc7\x6e\xeb\x8a\xb8\x2f\x0c\x61\xaf\xff\x2f\xf7\x05\xdf\xb5\xcf\x7d\xa6\x97\x4a\xa6\xe9\xda\xc8\x8c\xaa\xba\x42\x3c\x22\x90\x62\xa8\x7a\x46\x9f\x64\x4d\x7e\x01\x00\x87\xae\xb8\x45\x5d\x21\x14\x0d\x2b\x12\x10\x22\xdd\xe9\x16\x01\x49\xec\xfa\x61\x3b\x81\x74\x53\xd8\xfa\x08\xb9\x91\xa4\xf6\x41\x4a\x71\xb9\xbd\xb0\x75\x55\x37\x83\x18\xe1\x74\xd4\x9f\x5a\x56\x30\xdf\xbd\x1e\x30\xc7\xa1\x95\x85\xde\x25\x7b\xae\x0d\xae\xa9\xe3\xd7\x11\xd3\x05\x73\xd2\x47\x40\x7f\x85\x2d\x88\xfa\xa0\x0a\xad\x51\x40\xb1\x33\xd0\x96\x54\x3d\x20\x4d\x0e\xaa\x4e\x1f\x43\x1d\xa1\xcd\xc2\xf9\x1a\xac\xa8\x98\x61\x0c\x6d\x07\xf4\x02\x50\x97\xd4\x44\xc2\x06\x48\x72\xde\xe9\xc7\xe8\xbd\x03\xee\x8a\x56\x1e\x0d\x9a\x9c\x9f\x4f\xb6\x24\x18\xf6\x74\xd8\x5f\x26\x87\x06\xfe\xc5\xaa\x4f\x57\x94\x20\xc1\xe2\x40\x17\x95\x15\xc9\x30\x3c\x89\xda\xfc\x4a\x11\xa8\x3e\x45\xce\x83\x2b\x7c\x6e\x69\xf1\xd9\x5d\x9a\x2f\x2c\xc6\xae\x31\x48\xfa\x69\x23\xd9\x8a\x1b\xbd\xa4\xdd\xd0\x83\xe8\x64\x0a\xfe\xcb\x31\x76\xd8\xda\x80\xfe\x77\x1a\x71\xf4\x75\x25\x71\xa4\xd9\x6c\x86\xc5\x52\x95\x00\x82\x10\x53\xc4\x5d\x42\x2e\x7b\xa5\xe0\xe2\xe9\x26\x5a\xb9\x3a\x1c\x4a\xdf\x5b\x51\xc1\x10\xee\x3b\xa0\xfb\xb2\xd6\x0a\x8b\xe3\x05\x26\x96\xbe\x86\xe3\x70\xa2\xf2\x48\x6e\xe2\x05\xac\x59\x08\xcd\x49\x7e\x0f\x1f\x3a\xc0\x26\x31\x40\xb5\x48\x95\x56\x83\xcd\x23\xd9\xc9\x09\x39\x45\x89\x24\x53\x77\x57\x5c\xb3\xe5\xd5\x73\x28\x64\xde\x51\x63\x07\xf5\x0c\xfa\xdf\xfe\x4c\x90\x8a\x7f\xc2\x9b\xa3\x4d\x83\xf1\xa1\xc9\xa6\x4c\xf5\x5c\x16\x99\x42\x16\xeb\x29\x68\x5e\x80\x47\x78\x29\x49\xbb\x4a\xd7\x76\x44\x08\x44\x0b\x59\x0a\xb7\xda\xe1\x83\xa4\x7f\xc3\x63\xb4\x1b\xca\xa5\xa9\x17\xc2\x7f\xcd\x9a\xce\xd8\x5b\xf7\xb1\x03\x59\x3f\x53\x22\xca\xff\xc6\x7d\xc1\x5f\x8e\xaf\xe0\x1f\x96\x2e\x6c\xe7\xd3\x96\x4e\x7d\x37\x2d\x0a\xb5\xc3\x54\xc9\x0a\x50\x13\x84\xd1\xc8\xec\x6d\x9e\xe9\x0a\x6c\x08\xab\x38\xc1\xaf\xed\xcc\x23\x72\x1e\xb8\x55\xba\x05\x53\x59\xe6\x4e\x86\xa0\x53\xea\xb6\x07\x8b\x13\xd4\x96\x48\xac\xf3\xf5\x44\x92\x6b\x08\x65\x39\xd5\x3b\x59\xaf\xea\x14\x61\x77\x23\x81\x78\x14\x41\x34\xdf\x26\xf5\x6e\x98\x53\x2b\xcc\x40\x57\xe1\x0f\x64\x86\x9c\x47\x6d\xf5\x75\xd8\x15\x61\xca\xf5\xd2\x05\xcb\x72\x2a\x5a\x12\xd5\x10\x22\xf0\x51\xdf\x37\x39\x8d\x39\xde\xc1\xe1\x8a\x86\x36\xf4\x8c\x2c\xd1\x2b\xb9\x48\xf3\x55\x75\xd5\xc5\x25\x92\x18\x15\xac\xce\x65\xa7\x23\x5b\x88\x27\x85\x5f\x18\x3f\xda\x1c\x3c\x5e\x90\xa2\x1d\x85\xb1\xd4\x48\xe1\x4a\xa0\xa4\x3c\x4f\x92\xc2\xf9\xa1\x74\x78\xa5\x5a\x5a\xc8\x4e\x06\x8d\x02\xaa\xc7\xe6\x95\x95\x47\xba\xf1\x11\xb8\xc1\xdd\x16\x6c\x61\xee\x12\xea\x19\x5c\x35\x0b\x2f\x72\x61\x08\x23\xce\x91\xaf\x9f\xab\xb1\x7f\x20\xaa\xda\xef\xff\x52\x4d\xe3\xa0\xff\xdb\x5a\x49\xf1\xd3\xe0\xe7\x4a\x16\x52\x6f\xcb\xbc\x99\x99\x19\x49\xa3\xc7\x29\xe9\x4b\xa1\xed\x6a\x11\x84\x71\x3f\xe9\x67\xea\xd6\x8a\xd3\x4e\x10\x05\xd6\x86\xcd\x53\x64\xc3\xe7\x88\x0e\x08\x59\x65\xf9\xdd\x74\x41\x30\x74\x9f\x5a\x8d\x23\x41\x34\x6a\xdd\x4e\x88\xbc\x58\xb5\xa0\xfb\xa6\x49\x7f\x7d\x43\xcd\x09\xaa\xc4\xb0\x46\x43\x3d\x6f\xb0\x30\xec\x29\x5f\x03\xdf\x19\xa0\x7f\xe1\xbc\xa9\x51\xde\x2a\x19\x17\x52\x09\xb4\x88\x5c\xac\x8b\x30\x76\x6f\xc6\x29\xbb\x65\x4d\xb4\xae\x26\x9d\x0e\x04\x01\xf9\x6b\xfa\x1c\xbb\xe8\x0e\x6e\x71\xec\xa4\x12\x07\x80\x06\xa6\x2b\x30\x04\xd5\xe8\x3c\x1d\x30\xaa\xb8\x33\x7c\xd2\xa9\xf3\x3b\x9e\xc7\xbe\xf6\xe9\xe6\xad\x35\xe7\xfb\x59\x9e\x74\x75\xa0\xfa\x82\x91\xe5\xda\x76\xfd\x81\xdb\x83\x7b\x76\x78\xc7\x09\xdf\xd5\x4e\x4b\x25\x76\xe7\x97\x17\x8a\xb0\x80\xfd\xd0\x94\xf6\x75\xef\x00\x39\x27\x1d\x43\xdd\x27\x6f\x63\xef\x1b\x63\xff\xb0\xc0\x9e\x58\x4a\xc1\x51\x35\x9f\x44\xfd\x6e\x9c\xf9\x6f\x1d\x0b\xde\x5e\x1b\xf5\xab\x25\x5c\x2d\xf0\x8a\x16\xfd\x88\xbe\x33\xbc\x78\xad\xc2\x0d\x2e\xe9\xe7\xbd\x3e\xc4\x0b\x54\x21\xe8\x98\xa3\xc0\xa4\x63\x4d\x81\xf3\x4c\x0d\xa7\x76\x38\xe3\x11\xf1\x42\x04\xc6\x52\xbf\x19\x7f\x7d\x43\x64\x0d\xc8\x38\xc1\xbb\x97\x41\xd0\x00\xc2\x78\xd3\x26\x25\x97\xad\xac\x34\xc3\x21\x8a\xbf\xf3\x76\x98\xf5\x22\x61\xf4\x4e\xb1\x6e\x7c\xd4\x2d\x98\x0a\x2b\xcc\x35\xd3\xa9\x6a\x85\xc7\x2a\x64\xeb\x4c\x8e\x3a\x97\xf7\xb4\x3c\x70\xbc\x8b\x05\xc0\x3e\xe5\x31\x56\xd0\xc6\xf9\xff\xc9\x0b\x7e\xc6\xb3\x68\xe4\x4a\x28\x3d\x56\xd4\x48\x55\x5f\x88\xc0\xbb\xf8\x9e\xee\x0b\xce\xc9\xa6\x5e\xb2\xe2\x0d\xdc\x82\x0b\xa0\xb2\x2d\x91\x82\x1e\x47\xce\x4a\xba\x73\x1b\x6f\x2d\xd2\xb0\xef\x28\x36\xff\x75\x8d\xf9\xba\x39\x61\x12\xbf\x1c\x0b\xf5\xbf\xa7\x16\xbc\xb1\x36\xfc\x1c\x54\x97\x34\x6c\x9b\x8b\x33\x42\x71\xe9\xa6\x98\x75\x98\x27\xd0\x0b\x72\x36\x37\xf9\x45\x31\x70\xc8\x84\x41\xdc\x5c\x29\x86\xe1\x0a\x86\x60\xf7\xa5\x0b\xf1\xa5\xcb\x1d\x31\xc8\xc3\x84\x7e\x86\xc8\x1b\xd6\x8c\x61\x5e\x94\x5b\x80\x10\x07\xbb\xd3\x9e\x22\x34\x9e\x24\x29\x66\x76\x29\xed\x24\x47\x8e\x3b\x74\x37\x27\xb1\xe4\xf2\x5a\x98\x01\x5f\x5a\x61\x58\xf8\xb0\x47\x81\x16\x3f\xe9\x05\xef\xf6\xec\x50\x0b\x5d\x34\xc6\x1a\x81\xdd\xf5\xb3\x5f\xf7\xbd\x9b\x33\x9f\xfd\xba\x77\xd4\xe1\x5f\x47\xe1\x6e\x02\x7f\xca\xbc\x45\xd1\xf3\xee\x1a\xa1\x9d\x83\x6d\x05\xe0\x1c\xb7\xd3\x22\xe7\x57\xd4\x1e\xcd\xa6\xee\x01\xef\xe9\xbd\x53\xf7\xd0\x4f\xf7\x4e\x35\x9b\xcd\x2b\xaa\xe1\x57\xf0\xf3\x62\x54\xed\xe6\xff\x8e\xc7\xf6\x63\x90\x90\xff\x6b\x1e\x7b\xec\x59\xd9\x45\x0f\x1a\x4a\xd8\xa0\x47\xe1\x4d\x25\x17\x1d\x3e\x84\x74\xd7\x0e\xa2\xa6\xd3\x07\x75\xde\x4b\xfb\x6a\xd6\xd1\xf6\x41\x4b\x01\xd6\x5e\x67\x37\x7b\xac\xc9\x36\x18\x09\x62\xff\x95\xc1\x12\x0d\x24\x04\x11\x81\x62\x07\xca\x47\x18\xaf\x4f\x21\xa4\xb0\x39\x88\x8c\x54\x57\x3a\x1f\xda\xd6\xf5\x82\x09\x05\x46\x18\xcd\x2d\x2d\x66\xce\xe6\x79\x8f\xc7\xb4\xa8\xf7\xbf\xcf\x0b\xbe\xcd\xd3\x41\x29\x23\x16\xac\xcb\x22\x8d\xbb\xa0\x87\xa9\xeb\x00\x1a\x5b\x5e\x09\x79\x62\x32\xbd\xd5\x52\x49\x0b\x65\x41\x5a\x99\xa3\xba\x74\xd4\x95\xf1\xfd\x17\xd3\xb4\x5b\x8d\xfd\xa4\xc7\x6e\xc9\xfa\x6b\xa6\x74\xff\xdf\x7b\x4c\x3c\x2b\xb3\xbf\x62\xd5\x12\x7c\xad\x5d\xa7\x36\x37\xa0\xe5\xc4\xf9\xa5\x6a\x6a\x35\x22\x5e\x59\x8c\x6e\x88\x4d\xd9\x64\x1f\x3c\xc8\xce\x51\x8b\x31\xd3\x74\x7d\x3d\x95\xeb\x22\x4f\xdc\x96\x96\x92\x94\x31\xea\x74\x6e\x49\x03\x2a\x42\x04\xf2\x1f\x1f\x08\xa6\xdc\x47\x6e\x4e\x58\xf1\xdb\xf6\x3c\x8c\xef\xdf\xcf\x5e\xa5\x83\x67\x85\x7d\x60\xad\xb2\x65\xb6\x54\x39\xd8\x7b\x68\xfa\xcd\x68\xb9\x3d\x44\xcb\x2d\x5a\xe1\xb2\x2f\xde\x53\xb8\xec\xcd\xa8\xcf\x3d\xd3\x1f\x26\x3b\xc7\x0b\x5d\xf0\x5f\xd2\x28\x62\x84\xac\x9d\x5a\x15\x39\xcc\x75\x64\x51\x79\x13\x51\x14\x32\xfb\xf6\x03\x6c\xca\x4d\xb5\x4d\xb2\x96\x88\x20\x30\x1d\x0f\xe9\xa6\xba\xbd\x5f\x54\x37\x97\x16\x51\xc0\x7c\x6a\x7f\x70\xdd\x2b\x3f\x2d\x21\xb0\x68\x86\x58\xc3\x82\x25\x78\x17\xde\xd6\xe7\x9f\xda\x84\xe0\x29\x42\x68\x7b\xe7\x23\xd5\x02\xc9\x91\x16\x9c\x4f\x38\x39\xcd\x10\xf9\x80\x49\x82\x59\x03\x90\x0e\xb3\x4c\xb6\x1b\x3d\x99\x36\xf0\xe2\x3a\xd9\xbc\xee\x31\xac\xea\x12\x5c\x46\x5e\x40\xa5\xce\x6d\x4a\x75\x20\x3c\xa8\x1a\xe4\xc8\xaa\x6f\xd9\xc7\x3e\xe6\xb1\xaa\xd7\xfc\x1f\xbf\x11\xb6\xa0\xa6\x39\x79\x5f\xd6\x17\x71\x1e\xe6\x83\x20\xae\x28\xd4\xa4\x2c\x96\x47\x08\xd4\x7f\x7c\x51\xff\x49\x43\x26\x5a\x69\x82\x18\x6c\xea\x56\x2e\x37\x05\xa0\xaf\xb7\x33\x3e\x01\xe9\xfa\xaf\xa6\xea\x26\xd9\x4b\x99\xd5\x75\xff\xc5\xc1\x74\xf1\x57\x55\x14\x2c\x15\x1f\xc6\x1c\xc4\x54\x98\xc4\xb6\x60\xf8\xdf\xb6\xfd\xef\xf3\xcf\x84\xfd\xef\x9d\x35\x5d\x5e\x11\xbc\xaa\xaa\x6a\x68\x34\x10\x40\x8a\xc0\x4c\x5d\x1d\x78\x6f\x65\x21\xa3\xe9\xd0\x14\xa1\xfd\x5d\x68\xed\xa5\xbe\x98\x5b\x04\x2d\x29\x6b\x99\x12\x45\x04\x86\x1a\x10\x3b\x87\x40\x13\x8e\xc5\xbd\x62\xa8\x07\x48\x82\x60\xb9\x06\x71\xa4\xa3\xa1\x52\x0d\xb8\xa2\x79\xa1\x95\xf4\x0a\xc7\x07\xf9\x3b\x5e\xa5\xd4\x94\xa2\x18\x98\x88\x32\xc4\xc9\xba\x40\x90\x5c\x2c\xa7\xc9\xfe\xb4\xe6\x6c\xc9\x4e\x94\x6c\x91\x89\xcd\x1c\x7d\xe7\xa2\x64\x0b\x21\x63\x68\x4b\x7e\xb8\x16\xdc\x5b\x7e\x58\x4e\x84\xb6\x49\x9b\x69\x4b\x16\x9f\xb8\x59\x93\x5f\xf0\xd8\x1f\xb9\xf4\xd2\xbf\xed\x05\x77\x5f\x29\xfe\xbe\xe2\xaa\x05\x43\xc5\x83\x5f\xcc\x29\xbd\x50\x01\x16\xd8\x99\xd1\x6b\x69\x87\xee\x9a\x48\xb7\xa7\xbc\x23\xec\xcb\x86\x81\x99\xbb\xa2\xd7\xb8\x2a\x07\x99\x7f\xc8\x3f\xd0\x00\x18\x28\xb6\x03\x97\x76\x57\xf4\x18\xfb\xe0\x38\x7b\xd1\x28\x29\x38\xd3\x5c\x51\xe2\x88\x06\xfa\xdb\xc6\x83\x39\xeb\xef\xed\xc6\xb8\xaf\xb9\x15\x41\x9a\x59\x3a\x5e\xf3\xba\x77\x30\x95\xbd\x28\x6c\x09\x57\x6b\xfa\x37\x63\xec\x21\x66\x7e\xf2\x2f\x69\x83\xd2\xe9\x21\x07\x06\xf9\x8c\x11\xaa\x44\x68\x66\x44\xbc\x50\x88\x48\xea\xec\x40\xd7\x60\xf5\x6b\xf6\x86\xfe\x85\x5a\xf0\x53\xb5\x1b\x31\xc6\xeb\x66\x69\x8b\xbc\x36\x81\x02\xe9\x21\x41\x13\x94\x76\xe8\x5a\xdf\xec\x43\xd2\xc4\x88\xe6\x29\x4f\xb8\xd8\x4c\x42\xd5\xfc\x3c\x4d\xd4\x56\xc2\x98\x85\x41\x71\x53\x5e\x2d\x3e\xd2\x1b\x46\x17\x25\xba\x86\x16\x8b\xea\x85\x1e\x34\x60\xef\xf2\x6c\x10\xe7\xe2\x9a\x75\x7e\x53\x0c\xa2\xdb\xb6\x0c\x4f\xf5\x6a\x6b\x50\x3f\x93\x69\x63\xbd\x1f\xb6\x25\x19\xff\xcb\xb6\x7f\x5b\x4c\x7e\x74\x9c\x4d\x56\x45\x96\x95\x90\xb8\x68\xfd\xbc\x6d\x3c\x58\xa8\xfe\xa9\x7c\x2e\xd8\x4b\xa8\x67\xbe\xd0\x28\xd2\xce\xba\xf9\xb9\x31\xf6\xaa\x22\x42\xf3\xb1\x60\x99\x22\x34\x1b\xbb\x8f\xd0\xdc\xda\x40\x97\x41\x01\x2b\xac\xc3\xa4\x61\x3f\x3b\x17\xe7\x0f\x79\x6c\x5f\x6f\x43\x64\xd2\x7f\x9f\x17\xbc\xd3\x5b\x52\xff\xb4\x8e\xff\xb0\x63\xc0\xae\x41\x4a\xe8\x20\x95\x3a\x82\x8d\x21\x34\x0f\xe0\xa1\xd5\x31\xb2\x1c\x40\x6a\x88\xd1\x07\x9e\xdf\xb0\x03\x87\x2e\x7b\x53\xc5\x38\x69\xe0\xeb\x17\x42\x43\xed\xd6\xbf\xc5\x33\x11\xa7\xdf\xe8\x05\xaf\x59\xc6\x70\x53\x84\xa1\x4f\x43\xd9\xb1\x88\xce\x34\xc8\x4a\x09\x38\x24\x46\x9c\x40\x8d\x55\x1f\x66\x10\x5b\x90\xe3\xd9\x80\x67\xa1\xc3\x31\x95\x87\xed\x81\xb6\xf3\x19\x04\x87\x0b\x8b\xce\x98\xfe\xec\x98\x83\x70\x9b\xae\x89\x56\x71\xd1\xa1\x4b\x51\x98\xc4\x00\x77\xf2\x96\xb1\xe0\xc1\xd2\xb3\x72\x10\x65\x82\xe8\x4c\x92\xcf\x23\x02\xcc\x72\x12\xe1\x35\x5a\x5f\xb0\xc0\xba\x8e\x27\x9c\xf5\x8a\xb3\xaa\x7e\xac\xc6\x7e\xb4\xc6\xbe\xa4\x55\xfc\xac\x0f\xf2\xcc\xff\xf6\x5a\xf0\x61\x6f\xbe\xe2\x17\xc2\x5d\xb1\xf8\xf6\xcd\x2f\xd5\x00\x5f\x1d\x75\x59\x73\x5a\xa9\x86\x8c\xdc\x62\x20\x77\xfa\x91\x44\xa3\xaa\x1a\x78\xc3\xe2\xa7\x4b\xed\x22\xc8\x48\x6e\x18\x02\x8a\xa2\x8e\x64\x16\x7c\x72\x66\x6a\x86\xd0\x9c\x5d\x1f\x48\xbb\x55\x6e\xd8\xfb\x0e\x8d\x9e\x41\xab\x51\x70\xcd\x7e\xfd\xa1\xe0\x87\xbc\xd2\xc3\xaa\x44\x5f\x7b\x5c\x9a\x7c\xc1\xb6\xb6\xf2\xcd\x99\xe6\xcc\x29\xf5\x8f\x8e\xd8\x4c\xd0\xbd\xa0\xaa\x74\xc1\x72\xe8\xb6\xb2\x39\xe3\x14\x85\x17\x20\x22\xee\xc1\x94\x97\x14\x2d\x92\x74\xa6\xa8\xc2\x8f\x1e\xad\xbe\xda\xff\xda\xcd\xc4\xe2\x3d\x67\xf7\x45\xda\x36\xd2\x0a\xbe\xaa\x82\xa0\xda\x9e\x2b\x7b\xa1\x9e\x60\xc7\xd8\xcc\x48\xcd\x69\xd4\x8a\xbb\x69\x1d\xd9\x83\x75\xa4\x63\x59\x47\x1e\xda\x5b\x32\xf1\x97\x6f\x03\xdd\xf0\x94\x97\xed\x7c\xf3\x5f\xf2\x2f\x99\x4c\xa1\x91\x7b\xdd\x24\x10\x95\xc4\x4b\x65\x5e\xf1\x77\xdf\xc2\xbe\xa2\x2a\xe3\x44\xc8\x6e\x12\xaf\xc8\xdc\xff\x8b\xc3\xc1\x29\xf3\xd7\x90\xb2\x0b\x28\x44\x16\x6f\xb6\xe0\x6d\x78\x57\x5d\xc0\x5c\x0d\xe5\x37\xd9\xcd\x55\x78\x13\x45\xc4\x45\x11\xf9\x35\x8d\x22\xf2\x8b\x1e\x6b\x8e\xc6\xd8\x2c\xaf\x49\xc8\xd3\xf8\x2e\x6f\xd5\x8a\x57\x5d\x93\x1b\x62\x33\x4c\x52\x73\xb8\x58\xcb\xf0\x39\xc6\x12\x61\xff\xaa\x66\x12\x91\xde\x59\xdb\x26\x03\x65\xb8\x5f\xf0\x51\xf0\xc7\xde\x6a\xe5\x25\x60\xa8\x5f\xab\xf8\x20\x17\x3a\x04\x43\xa9\xf1\x49\x87\x03\x5a\xea\xda\x00\xc1\x28\xb7\xc2\xb8\x9d\x6c\xc1\xf7\x10\x0d\xb7\x94\xf4\xfa\x91\x1d\x22\xa4\xe1\xab\x96\xa5\x68\x37\x92\x38\x1a\x3c\xe7\x03\x76\x53\x99\xd8\xab\xd1\x78\x65\xe7\xa3\x63\xda\x6f\x36\x0a\x53\x70\x2f\x33\xa7\x84\x59\x7e\xe5\x3c\xd3\xb7\xb9\xd0\x5d\xc3\xc9\x88\xfe\x9f\x1d\x0c\xbe\xa6\xf8\x93\x82\x99\x32\xde\x96\xad\x48\xa4\x18\x3a\x64\x87\xa6\x63\x10\x58\xdc\xe6\xcb\x68\x48\x58\x91\xda\x9d\xac\x0f\x89\x4f\x1c\x60\x89\xd9\x3c\x72\x1b\x4d\x67\xb8\x31\xb4\x79\xa6\x2f\x26\x19\xcc\xac\x8c\xc1\x29\xa8\xad\x24\x99\x93\x0f\x58\x7c\xd6\xbc\xb9\xfa\x6e\x02\x55\xfc\x7d\x51\x2e\xf7\x78\xa8\xff\xa3\xd2\x99\x5e\x9c\xe8\x2c\xa3\x83\xf6\xea\x36\x68\x5d\x15\x7b\x4a\x1d\xb4\x77\xad\x94\x59\xd2\xf3\x91\x07\xaf\xb3\xb3\x9e\xf2\x56\x77\x16\x4b\x33\xfe\xd4\x08\xb1\x64\x0a\x2a\xcb\xa5\x2f\x3c\xcc\xbe\xac\x3a\x91\x13\x12\x4b\x3f\xf9\x70\x10\xd0\xbf\x71\x1d\xa2\x61\xa4\x57\xa8\xa8\xbd\xa4\xdd\xbc\xee\x31\x83\xe3\xe8\xde\x6e\xbf\xf5\x61\xf6\x77\xe3\xec\x05\x86\x46\x6d\xde\xbc\xe6\xff\xe1\x78\xf0\x4b\x63\x17\xe8\x8a\x56\xd0\x57\x17\x05\x11\xb6\x23\x2e\x52\xe0\x95\x3b\x5b\xf5\x16\x1d\xd7\xf4\xb2\x88\x31\xb4\x06\x40\x81\x13\x30\x89\xf4\x64\x0a\x8e\x10\x30\x43\x22\xc9\x2f\xc4\xf5\xb4\x4c\xc6\xda\x06\x17\x4a\xd0\xae\xf5\xd7\xd7\x89\xda\x4b\x53\x88\xb7\xcc\x4a\x2f\xf2\xa8\x20\xbc\xc2\x90\xca\xc2\x08\xd4\x2d\x1a\x54\x7a\xbf\x9b\xb4\xf1\xf5\x35\xe2\x01\xd6\x7b\x55\x93\xee\xc1\x9e\x01\xac\x07\x30\x24\xb5\xdb\x2e\x8d\xb7\xe9\x21\x26\x20\x3b\xbd\xaa\x17\x88\xc6\x49\xfb\x48\x56\x7c\x65\x0d\x8b\x6d\x20\x7f\xe6\x92\x1c\xcf\x0e\x4f\x64\x25\xdb\xce\x29\x76\x62\x17\x50\xaf\xc3\xa5\x3d\xe5\x1d\x61\x5f\xe1\x2c\x73\x40\xbd\x6d\x74\x65\xba\x2e\x1b\x57\xe5\xc0\x3f\xe0\xef\x8b\x45\x57\x32\xf5\xe6\x97\x57\xbc\x09\x2e\x59\xb9\x3e\xf0\x0f\xfa\xfb\xe1\x2b\xc6\xde\xe0\xb1\x83\x1b\x49\x96\x43\x70\xd5\xe3\x41\xd7\x8d\x27\xd5\xbf\x18\x0e\x93\xa4\x8d\x21\x87\xb9\x1d\x67\x58\x0c\xb6\x79\xdf\x30\xa1\x61\x90\x9d\x20\xe5\xaf\xa1\xa3\x4b\x30\x6d\xca\x16\x50\xdf\x74\x90\xdd\xa6\xc6\xc3\xda\x05\xff\xe7\x40\xf0\xfb\xfb\xf5\x2e\x20\x06\x6a\xba\x81\xda\x8b\x7c\x4d\x46\x09\xf2\x99\x15\xf9\x3a\x6a\x01\x85\xb9\xfd\x96\x48\xa5\x86\x6a\x05\xb3\x13\xae\xae\x5e\x1a\x22\x8b\xac\x53\x1e\x04\x22\xe5\x22\xd5\x89\xb6\x22\x1e\x40\xfd\xd6\xc2\xeb\x88\x30\xca\x4c\xd7\x4b\x09\x8d\x3a\x53\x0c\x83\x6c\xf5\x3a\xc2\x60\xf2\xb6\xcb\xba\x85\xe7\x07\x54\xa6\x29\x3b\x56\xb5\xeb\x14\x38\xc3\xe2\x72\xcd\x10\xba\x9f\x76\x9d\x6d\xa0\x43\x94\x28\x5b\x48\x74\x13\xb5\xfb\x22\x5b\x16\x0c\x8f\x88\x0e\xfa\x86\xa6\x1a\xca\x50\xbd\xf7\xeb\xa0\xa7\x2b\x8d\x24\x03\x1c\x20\x99\xd5\xf9\x85\x70\x53\x3a\x0f\x92\x14\xa3\xde\xfb\x3d\x7a\x84\xad\xd7\x9b\x8b\x78\x15\xbb\x9a\xdc\x7b\xb8\x33\x90\xad\x2b\x80\x21\x36\x56\xeb\x84\x78\x7f\xdb\x7d\x38\xd1\x2d\xce\xeb\x35\xc8\x09\x6c\x6b\x41\xb1\x11\xae\x6f\x48\xd0\xbf\xe0\xe8\x9d\x82\xbc\xba\x22\x25\xb4\x38\xee\x07\x3d\x69\x90\xc6\x62\x82\xab\xa1\x84\x1f\x70\x6e\x51\xca\x1d\x79\xc6\x89\x8e\xac\xdf\x35\x61\x8c\xa5\x91\xce\x9a\x08\xc3\x48\xb8\xd9\xbd\x5e\x44\xb4\x80\x61\x69\x70\x01\x28\x36\x0b\xbb\x61\x24\xd4\x62\xc9\x36\x00\xfe\xa4\x3c\x05\x24\x12\xe9\x0a\x16\x59\x9c\x97\xe0\xad\xe8\x26\x9b\x6a\x05\x56\xa8\x14\x4f\x3b\x33\xa7\x97\xb4\xb3\x29\xd5\xd8\x46\xd1\x8c\x29\x5b\x3a\x35\x59\x9d\xdd\xb9\x1b\x20\xea\x67\x51\x28\xfd\xd5\x18\x7b\x7e\x26\xf3\xf3\x24\x4d\xe6\xb2\x73\x2f\x5b\xb8\xe4\xff\xc1\x58\xf0\xeb\x63\x8b\x1d\x88\xae\xdc\x4e\xe6\x68\x5b\x11\xfa\xdc\x8b\x17\x55\x21\x75\x9e\x0a\x4a\x93\x11\x68\xc4\x8f\xa4\xe8\xe0\x76\x9b\xb0\xc2\x6b\x27\xe1\x04\xba\x10\xc6\xfd\x6b\xd6\x7c\x51\x90\x3f\xa6\x77\xda\x49\x1c\xaa\x68\xed\x6e\x31\xed\x71\xb2\x40\xae\xaa\x4e\x47\x58\x47\x9c\xb4\xa5\xfb\x06\xc2\x2f\xf3\x7e\x9e\xa9\xe7\x58\xf9\xcb\xe1\x3e\x9d\xed\xa6\xfa\x54\x53\x5a\x9a\x00\x8f\xa2\x11\xb4\xa6\xcd\x2b\x57\xe5\x80\x9f\x7f\xe9\xd9\x57\x3c\x76\xe1\xf2\xfc\xdc\x85\xc7\x2e\xce\xcd\x9f\x5f\xbc\x74\xf6\x91\x95\x57\xac\xac\x9e\xbd\xf8\xc8\x3c\xae\x44\xa2\x2a\x5d\x91\xf9\x23\x14\xf5\x93\x3d\xb2\xda\xea\x85\xbd\x47\x2c\x6e\xa6\x3c\x81\x7e\x53\xce\x84\x92\x82\xed\x44\x66\x85\x48\xc1\xf1\x86\x26\x6f\x08\x20\xb6\xc3\x94\x08\x13\x1f\x3d\x22\x3c\xfa\xff\xd4\xd8\xa1\x76\x9c\x11\x53\xd2\xe7\x6b\xc1\x6f\xd5\x56\x64\x0e\x7c\x15\x3d\xa2\x75\xd4\x04\x50\x49\x29\x83\x21\x20\x4b\xe4\xb9\x30\xcd\xf2\xa0\xc9\x21\x26\x56\xb3\x50\xaa\x1d\x7b\xc4\x7e\xe1\xe5\x61\xbe\xa1\xd6\xd8\x25\x99\x1f\xa9\xbb\x3f\xa9\xbf\xa9\xe0\x23\x6a\x2f\x1e\xb9\x94\xc4\xf2\x48\x13\x1b\x51\x0c\x01\xc6\x83\x84\xb1\x7a\x4e\x5c\x37\x7a\x15\xc2\x52\xb6\x72\x26\xa9\xe9\xe8\x4d\xd2\x3f\x2c\x5c\x5a\x31\x52\x9f\xce\x0c\x55\x03\x01\xd8\xc3\xe9\x29\xd4\xe1\x86\x6f\x6f\x60\x5b\xd5\x66\x46\xfc\x6d\xf8\x20\x4f\x4c\x84\xa7\x35\x44\x16\x24\x77\x9e\x8c\xee\xb6\x73\x04\xff\xb6\xc7\x7c\xd4\x67\x4c\xa8\x57\x7c\x35\xf3\xff\x83\x17\x7c\xc0\x3b\x3b\xf4\xdc\x72\xc3\xea\xdc\xb3\x61\x96\x61\x62\x3b\xb1\x69\xa1\xc2\xf8\x55\x38\x02\x20\xf1\x49\x49\x8b\x37\xc3\x34\x89\xbb\x18\xa4\x94\x86\x70\xbd\xaf\x17\xc8\x68\x68\x3e\x8a\x73\x14\xda\x0b\x49\xeb\xaa\x4c\x79\xa4\x5a\xd1\xe4\x97\x09\xd2\x7e\xd6\x59\x09\xc3\xb1\xb8\x6f\xf1\xd8\x6d\x2e\xc5\xba\xff\x75\x5e\x90\x15\x9e\x2e\x97\xed\x5b\xab\xf4\xea\x57\x52\x8a\xa3\x50\xa0\x7d\xc1\x7d\x13\x28\x32\x2d\x8f\xd9\x2c\x7f\x20\x33\x24\x3b\xd6\x3b\x86\xeb\xc5\x1e\xf3\xbf\x19\x67\xff\x58\x67\x28\x85\x49\x7c\x7f\x2a\x5a\x72\x09\xb8\xcb\x75\x2a\xd5\x6f\x8f\xeb\x54\xaa\x8f\x8d\xeb\xbe\x56\x66\x51\x69\x5d\x04\x09\xf5\x9d\xcc\xa7\x22\xa5\x0d\xf3\x02\x00\x02\x44\xa9\xe9\x19\x2a\x43\x94\x47\xa7\x91\xd7\xf8\x83\x4e\x96\x14\x90\x8a\x82\x07\xd8\xce\x94\x5a\x35\x14\xb9\x88\xd3\x6e\x56\x43\x96\x27\x3d\x07\x59\x44\xb3\x77\x5f\x45\xf6\xbb\x75\xd5\x81\x89\x38\xe1\x09\xc0\xa4\xc1\x6d\x17\x56\xf1\x46\x3f\xe7\xed\x64\x2b\xb6\xa0\x5e\x0c\x9e\x43\x1c\x46\x75\x27\xff\x01\xba\x44\x34\xef\xae\xa7\xd7\xa1\xd4\x71\x5e\x0b\x47\xa7\xa0\x15\x68\x31\x3a\xd2\x2f\x2b\x73\xf9\xa8\xb1\xc5\x3c\x81\x38\xe7\x82\x5b\xb3\xa6\x3b\xa5\x13\xfa\x01\xef\xc6\xa4\x77\x15\x05\xaa\xaf\x3b\x49\xda\x0a\xd7\x20\xb7\x30\x32\x72\x40\xd8\x63\xd3\xe4\x2b\x90\x51\x68\xba\x4f\x5e\x53\x73\x64\xc9\x6b\x3d\xdc\x41\x2d\xb5\xb0\xfb\x3d\xac\x8f\x32\x52\x53\x5d\x9f\x2b\x19\x8f\x4d\xeb\xae\xba\x81\x3a\x6f\x1d\x63\xcf\x07\x25\x38\xcc\x07\x00\x0c\x0b\xe1\x7c\x7f\x5b\x0b\xfe\xb4\xb6\xd8\xb1\x95\x7c\x37\xe6\x12\xb7\xad\xfe\xb0\xc9\x03\xd2\xef\xd5\xd1\xd6\x68\xa5\x21\xc0\xd5\x04\x30\x20\xfa\x27\x72\xee\xdb\xbf\x2a\xe5\x6f\x8b\xc4\x97\x88\xd4\xd1\xb4\x95\xa4\x6d\xed\xbe\xd7\x35\x3a\x0a\x1f\x55\x19\x6a\xfa\x68\x48\x1e\x4d\xd2\x2e\x78\x95\xcb\xda\x61\xd1\xbe\xb9\x78\x40\xa9\xf2\x70\x2a\xea\x95\x6d\xd1\xd2\x5b\x97\xd6\x25\x7b\x3c\xb4\x89\x83\x6a\x13\x39\x94\xd0\x1c\x7d\x0d\x32\xb5\x9a\x55\xa9\x97\x6c\x92\xd2\x56\x01\x95\xc0\xd0\xbd\xd2\xcf\x8e\x58\xf8\x9f\x63\xec\x79\x69\x3f\x56\x13\x5b\xcc\xca\xa7\xc6\x82\x4f\x8e\x2d\x97\x9e\x22\x09\x15\x06\x5c\x70\xfb\x47\xdd\x70\x5a\xbd\x6a\x66\xc8\xc8\x84\x66\x10\x0d\xf2\x59\x4a\x90\xb0\x59\x96\xe0\x7c\xa5\x1c\x33\xa7\x68\xa3\x5f\x13\xc6\xa5\x09\xf7\x6c\x23\x37\x61\x31\x18\xe4\xf9\xcf\xc9\x0c\xa1\xa9\xd3\x24\x8c\x06\x50\xe3\xe2\xbb\x41\x24\xd7\x45\x6b\x10\xb8\xf5\xd8\xfb\x5a\xb7\x17\x53\x61\xc3\x2e\x9e\x6f\xc4\x85\x88\xbb\x48\x93\xed\x16\xca\xab\xa6\xa2\x2a\x25\x4f\xd1\xd0\xd2\x95\x2c\xdd\xc9\x28\x27\xe3\x0d\x11\xb7\xf0\x1e\x33\x75\x55\xf6\x32\xb0\xc4\xa9\x11\x9d\xa2\x92\x1a\x48\x2a\xd9\x6d\x17\xe9\xba\x7c\x4d\xe6\xc2\xa4\xe2\x0a\xb8\x00\x59\x94\xee\x9b\x33\xcd\x99\xe3\xce\x9c\xaf\xb3\x83\xa2\x03\x0d\x1f\xf8\x0f\xb3\xc9\x1d\x75\xf0\x39\x7a\x39\x68\xba\x3b\xb5\xd8\x9f\xd6\xfd\x49\xdd\x4e\xf3\x54\x84\x71\x9e\xb1\x9f\xf3\xd8\x61\x4b\x97\xf0\xff\xb5\x17\xfc\xa0\x77\xde\x82\x4d\xc5\xbc\x32\x38\x0b\x28\x57\xa8\x58\x0e\x0f\x90\x75\x45\x15\x70\x24\xd3\x5f\x70\x43\x3a\x5d\xc8\x6e\xd4\x62\x0a\x9c\x2e\x68\x56\x9a\x67\x2e\xca\x19\x2c\xba\x61\xca\xb5\x1d\x74\xc4\x65\x76\x40\x35\x60\x69\x71\xc1\xbf\x3f\x38\x5d\x6a\x53\x2f\x6c\xdb\xed\x19\x52\x10\x46\x94\xf9\xcb\x35\x76\x50\xef\x5d\xff\xe7\x6b\x3a\x22\xf2\xc7\x6a\xab\x20\xc4\x69\x53\x13\xe0\xcb\x83\x22\x0d\x93\x7e\xa6\xb3\x8d\x5b\x49\xb7\x97\xc4\x70\xcf\xed\xbb\xa9\xd5\x3a\xee\x28\xb7\x0b\xd1\x7c\xa1\x89\x4e\x46\xd4\x22\x87\xcf\x69\x9e\x3f\x3e\x5f\xe4\xba\x17\xe4\xf4\x10\x53\xdc\x4b\xe5\xa6\xae\x2a\x25\x1b\x75\x71\x1d\xd0\x35\x13\x1e\x85\x29\xcf\xca\x9d\xef\x91\x6b\xce\x45\x34\x50\xc5\x2c\x95\x8f\x02\x22\xa6\x53\x02\x15\x8f\x47\xf2\x11\xe4\xee\x53\x23\x69\x9d\xc3\xe5\xd5\xec\x70\x9e\x44\x04\x07\x93\xf9\x6b\xc1\x1d\xa3\x56\xaa\xf5\x9a\x63\x2b\x9b\x62\x0d\xf6\x4f\x77\xc1\x4c\xad\xbf\x66\x1f\xaa\xe1\xda\x9e\x53\xca\x9a\xcc\xfc\xf7\xd6\x82\xb7\xc3\xda\xa6\x07\x24\x3e\x0c\x0f\x92\x8e\x83\x41\x06\x39\x75\x5e\x2d\x2e\x95\x56\xa8\xab\xb0\xba\x17\x4f\x24\xe6\x51\x12\xdd\x5a\xba\x5a\x04\x80\xe1\x10\xb2\xec\x60\x0f\x29\x35\xca\xda\x76\x10\x00\xdb\xbc\xf1\xab\xb7\xe9\xcc\x53\xde\x8b\x76\xb8\x7a\xef\xf3\xc7\xc2\xde\x8d\x5c\xbc\x69\x5b\x2d\x2e\xcd\x57\x6c\xab\xb0\xd7\x7a\x3a\xdb\xea\xbf\x8e\xb3\xe7\x85\x5d\xb1\x2e\x97\xfa\x51\x84\xcc\x4e\x99\xff\xf3\xe3\xc1\xbb\xc7\x16\x4b\x4f\x47\xcd\x8d\xc9\x98\xc6\xec\x3c\xfd\xb2\x15\xa2\x6b\x9a\xa5\x69\xe6\x00\x80\xa7\x1f\x45\x18\x17\x69\x36\x1c\xb4\x03\x73\x9b\xd1\x2b\x1d\x66\x9c\x4c\xf8\x20\xb7\xdc\xb5\x09\x5a\x3c\x56\xa6\xd7\x02\xc5\xf2\xe7\xa8\xef\x6e\x86\xed\xbe\x88\xa0\x22\xb5\x4b\xbb\xbd\x08\xce\x08\x5c\xc7\xfa\x96\xda\xa5\x36\x39\x58\xcc\x75\x93\x87\x42\xa8\xd1\x6d\xb8\xd3\xd4\x71\xcd\xe0\x05\x87\x2e\x94\x40\x30\xac\xdb\xa1\x54\x26\x03\x21\x78\x83\x46\x20\xcb\xe0\x83\xe3\x60\x83\xe9\xc0\x13\xd5\x11\xaa\xa9\x91\xc4\x0d\xd1\xe8\x25\xed\x1b\xe7\x89\xbf\x90\xb4\x44\x84\xde\x22\xc3\x4a\xba\xfb\x35\xb8\x7b\x83\x12\xfb\xde\x1a\xbb\x45\x1d\xc2\x06\x98\xea\x8d\xb5\xe0\x0b\xde\x25\xeb\x89\x66\xc7\xa3\xbf\x88\x09\x92\x0e\x1b\xb0\x23\x59\xa6\x04\x14\xd5\x39\x70\x4a\xa2\xba\xc4\x57\x2a\xbe\xc4\x30\x75\x7c\xe3\x48\xa6\x71\x9d\x4a\xe5\xac\x49\x7d\xf8\xca\x36\xd7\x6a\x08\x96\x79\xe3\xb3\x56\x44\x3e\x4d\x89\x4c\xdd\x11\x00\xf1\x08\xd4\x8f\xed\x58\xac\xbf\xbe\x06\x30\xf3\x40\xc0\x98\xc4\x64\x4e\xf9\x13\x2f\xf8\x5d\x6f\xa9\xf4\x54\x5f\x8c\x96\x0a\xf3\x8a\xfe\x10\x9d\x2a\xa4\x60\x45\xc9\x96\xb6\x99\x83\x56\x7d\x19\x21\x6e\x2f\x21\xb4\x14\x95\x7a\x41\xbd\xb4\x64\xde\xb1\x2f\x21\x55\x6f\x28\xd9\x09\x0a\x61\xd9\x13\xa3\xd4\x27\x74\xc4\xd4\x01\xc8\xc4\xc4\x91\x5c\x4a\xe2\x25\xd3\x3a\x53\x0c\x29\x5a\x8d\xf5\x72\x08\xf9\x9f\xd7\xd8\x3f\xc8\x36\x44\x2a\x97\xf0\x5e\x64\xd8\xbb\xfc\xdf\xaa\x05\x9f\xa8\xad\x6c\x80\x25\x57\x43\x25\xd0\xe5\xc9\x92\x28\x6b\x32\xdf\x92\x12\x79\x46\x0b\x94\x5f\xc7\xce\x5b\x9c\xe3\xb9\xce\x54\x90\x8e\x9d\xd7\xc4\x03\x13\x04\xe7\x66\x28\xb7\x10\x0a\x0c\x2f\x8e\xc5\x15\x11\x11\x76\xe1\xa6\xe2\xd6\x62\x64\x9d\x71\xa9\xc1\xd5\x27\x4c\xe1\x9e\x83\x8d\x0e\x63\x34\x7f\x17\xf6\x75\x5b\xfd\xc6\xb5\x23\xdb\x7c\x69\x71\x81\xcf\x34\xf9\x79\x54\xa0\xa0\xac\x95\xaa\x01\x32\x1e\xbb\x24\xdf\x20\x67\xce\xee\xc5\xfe\xdf\x8e\xb1\x7f\x94\x27\xbd\x24\x4a\xd6\x07\x2b\xbd\x54\x8a\xf6\x7c\xa1\x82\xfa\x9f\x19\x0b\x7e\xc5\x5b\x1d\xf5\x73\x29\xc4\x9c\xb8\x40\x0c\x9a\x56\xd2\x5f\xdf\x40\x76\x40\xf8\x50\xe7\xac\xe9\xda\x78\x3b\xe9\x8a\x30\xce\x9a\x9c\x18\xc0\xf5\x38\xe8\x1d\x89\xa5\xc0\xcc\x6d\x89\x01\xed\x6d\xb1\x06\x10\x0b\xb4\xc6\x2c\x75\xb9\xc9\xe7\xa2\x88\x8f\xec\x0a\x88\xe4\xb9\x4b\x0b\x25\xb4\x8c\x17\xb3\xbb\xd9\xe9\x5d\x28\x2e\xd5\xa5\x3e\xe5\x9d\xd9\x36\xe5\xe8\x0e\x3f\x68\x98\x26\xbd\x54\x0e\x58\x03\xcc\x0d\x0f\xc4\x99\xc8\xc3\xac\x03\xf6\xb3\xdd\x64\x23\x3d\xe5\x35\x77\x10\xb6\xb7\xf9\xb7\xd8\xf5\xdc\x80\x2e\xf1\x36\x8f\x7d\x05\x60\xd7\x26\xfd\x38\x77\x2d\x66\xab\xc9\x55\x19\xfb\xfd\x60\x7d\x6e\x9b\xdf\x2b\xec\x8b\x05\xcd\xb2\x76\x14\xe5\xf0\x66\x71\x85\x75\xc1\x72\xa1\x68\x98\x18\x6b\x61\xfe\x82\x07\xe6\x65\xa2\x2c\xff\x29\x8f\x35\x76\x03\xdd\x6c\x0c\xbc\xc1\x1b\x3c\xd7\x47\x5a\x32\x09\x1b\xc7\x3f\xb7\x4c\xe5\x85\x83\x1c\xee\xfd\x25\x1b\x31\x69\x95\x84\x9c\x28\xdb\x50\xa4\x1b\xf1\xba\x06\x96\xba\x24\xb6\x2c\xc6\xec\x93\x1e\x3b\x94\xf5\xd7\x70\xb5\xfb\x3f\xe7\x05\xff\xc6\x1b\x56\xaf\x11\xc7\xea\xd5\x7d\x11\x61\xfd\x4b\x49\x7b\xd8\x63\x12\xdc\xa3\x1f\xdd\xdb\xbc\xc7\x14\x79\x6f\xf3\x1e\x30\x27\x6a\x71\x70\x6f\x33\xdb\x6c\x35\xef\xd1\x44\xbf\xf4\x52\xb0\x9d\x29\xc4\x88\x1f\x04\xce\xa4\x6f\xa0\x6e\x91\x13\x27\x6b\x21\xa9\x7f\xd7\x63\xb7\x3a\xbe\x50\xff\x97\xbd\xe0\x23\xde\x32\x3e\xb2\x8d\xff\xae\x6b\xd3\xa6\x1b\x87\x91\xa7\x73\x69\x2e\xda\x12\x83\xac\xce\x2f\xc7\x84\xab\x58\xc7\xa3\xca\xb9\x5c\xe2\x4b\x7b\xf5\xa8\xa9\x03\xd9\x20\x41\x4f\xbd\x90\x7a\xd1\xc0\x26\xdb\x7d\x7c\xa7\xc7\x6e\xd5\x72\x28\x05\xab\xce\x9b\xbd\xe0\xc9\x8a\x89\xeb\x59\x66\xcd\x76\x98\xc1\x36\xa3\xf8\x03\xb3\x98\x4c\x41\x3b\xce\xc1\x50\x21\xda\x12\x52\x14\x61\xb7\xf2\xcf\x6a\xec\xb6\x54\xbb\x7f\xef\x57\x7b\xd0\xff\x4c\x2d\x78\x7b\xc9\x24\x88\x49\xc2\xda\x49\xbc\x8e\x5b\x95\x6a\x93\xea\x9e\x28\xb4\xf9\x40\xb5\xc3\xbc\xd9\xe4\x73\xda\x67\x9e\x02\x16\x22\x58\x4a\x55\x61\x61\x9e\x95\x5d\xf6\xf8\xc6\xdc\xa5\x05\x3d\xe7\x94\x15\x6a\x8d\x02\xcd\x7c\xb9\x25\xb0\xe4\x28\x1a\xcf\x20\xf6\x06\xab\x69\x5f\x06\x4f\xcf\xdc\x83\xd7\xb6\xa9\xe9\xe9\xe9\x53\xa0\x80\x41\xd3\x5e\x74\xf4\xcc\x8b\x8e\x9e\x69\x76\xdb\xbb\x4f\x9e\xb0\xa4\xca\xb2\x3d\xc6\xec\x57\x3c\xe6\x0f\xbb\x0d\xfc\x0f\x7a\xc1\x7b\xbd\x61\x97\x43\x55\x96\x75\xc9\x85\x41\x97\xa1\x21\x93\xde\xee\xd6\x7a\x2e\xb2\xab\x85\xfe\x29\xa1\xcf\x66\x76\xac\xe7\xd4\xe4\x06\xc9\xe4\x29\x7b\x21\xfd\x17\x8f\x1d\x54\x8a\x2a\x74\xe4\xe3\x5e\xf0\x41\x50\xcf\x75\xf3\x85\xb6\x32\xc1\x61\xae\x4f\x67\xdd\x4e\x9e\xc4\x18\x3a\xa2\xd3\x9f\x51\x7f\x5e\xec\x18\x8a\xdb\xb8\x61\x59\x10\xcd\x4a\xd6\x84\xb8\xfa\x41\x56\x2a\xd1\xe8\xe2\x75\xa5\x12\xf5\xbb\x26\xef\x0e\xb0\xcf\x6d\x52\xd8\xd4\x8a\x5f\x70\xf6\xc7\x9f\xee\x67\x07\x93\x4d\x99\x6e\x48\xd1\xf6\x7f\x6f\x7f\xf0\x96\xfd\x97\xe9\xaf\x72\xe2\x82\x29\x4b\xbf\x3e\x04\x4e\xa8\xbd\x0c\xe8\x42\x05\xe9\x46\x7e\x45\xdb\x14\xea\x68\xc7\x46\x9d\xec\xab\xb3\x59\x87\x59\x2b\x89\x6a\xac\x3d\x60\xde\x24\x65\xc6\x31\xa9\x56\x19\x84\x0c\x5c\xf4\x8e\x6f\x3a\xa6\x28\xd3\x25\xb8\x17\x59\xf8\x81\x61\x8c\x48\xe6\x98\x59\xa7\xc3\x23\xd1\x94\xb4\x73\x15\x04\xab\x08\xc6\xeb\x8a\x62\x48\x5f\x43\xdf\xe7\x86\x3d\xb0\x11\x0a\x0b\x50\x53\x17\x3b\x6e\x4d\x18\xa0\x63\xe2\x02\xe2\x76\xe1\x89\x2d\xd2\xf7\xd5\xc1\x5e\xe7\x66\x2a\x4b\x41\x4c\xc6\xfa\x65\xdc\x06\x86\xa7\x39\x45\xec\x2f\x08\x4f\xb1\xab\xad\x5b\x70\x8b\x61\xae\x7b\xa6\xce\x40\x32\x82\x83\x1e\x5f\xd0\x20\x3f\x2e\xd3\x64\x0f\xc6\xe8\xa3\xd3\x33\xa7\xa7\x8f\x1e\x3d\x09\x5b\x55\x8f\x8b\x31\x4a\x57\xc7\xb8\x55\xd9\xa5\x4f\xd6\x6f\x34\xf6\x6d\x29\x69\x9b\x61\xd3\x31\x6f\xef\xf1\xee\x63\x37\x82\xf2\x32\x0c\x6a\x61\xdf\x66\xff\xcc\x63\xb7\x67\xb2\xd5\x07\xeb\x64\x12\xe7\xf2\x5a\xee\xff\x37\x6f\x17\x81\x74\x4b\xe0\x4a\xb5\xbf\x0b\x7e\xd8\x2b\x3d\xa1\x54\x52\x38\xc5\x61\x58\x74\x4d\x5c\xe4\xc4\x4e\x44\xc9\xa2\x49\xb7\x6b\x47\x9f\x69\xbb\xeb\x48\x3f\x34\x08\x28\xc0\x07\xc7\x60\x24\x27\x48\x14\xa1\xfc\xf0\x20\xa6\x20\x85\xa4\x83\x57\x38\x34\xe1\xb2\x1f\xab\xb1\x03\x94\x5e\xec\xff\x40\x2d\x78\x83\xa7\xc3\xe1\xe8\x21\x4e\x04\x01\xc1\x93\xba\x0b\xde\xac\x9d\xc2\xe3\x9e\x66\xd6\x33\x55\x6b\x1f\x76\xff\x94\x4d\xb2\x23\x3b\xce\x02\xa6\x9f\xdf\x48\xb4\xd0\xd1\xed\x2f\x1a\x2f\xf0\x9f\x0f\x5f\xd5\x53\xa9\x7a\xfa\x52\x39\xc8\x18\xfb\x6b\x6f\x14\x20\xe9\x67\x3d\xed\x45\xff\x25\x6f\x57\x5e\x74\x0a\x9d\x25\x7c\xd1\xa4\x70\xa2\x39\x68\xa5\x05\xe6\xeb\x30\x02\x29\xec\x76\xa1\x21\x40\xf3\x14\x9c\xdc\x5d\x91\x5e\x85\x83\xa6\x08\x0d\x04\xd7\xaf\x43\xcf\x50\x04\x9b\xb9\x8e\x78\x31\x0c\x58\xea\xd8\xdb\x3f\x5c\x63\x56\xb0\xb1\xff\xe3\xb5\xe0\xed\x66\xc1\xec\xb8\x22\xe6\x6f\x34\x2c\xcd\x45\x47\x13\x39\x8f\xa4\x50\x75\xc5\x96\x81\x04\x6f\xd9\x4b\x49\x65\x14\xdb\xdf\xb7\xb0\xb3\x9f\x3e\xe8\xc0\x2b\x38\xc4\xb9\xc3\x0c\xca\x6f\x7a\x06\x19\x94\x7f\x7d\xff\xcd\xe4\x86\xbf\xdf\x34\xbc\x37\xb3\x77\xf6\x9a\xbd\x93\xe9\x44\xf4\x57\xdd\x38\xc3\xf5\xf6\x21\xf3\xa3\x37\xea\x53\xde\xfa\xce\x99\x21\x0b\xfe\x99\x3d\x93\x27\x33\xf6\xc7\x87\x59\x30\x2a\x43\x1e\xad\x19\x00\xa8\xf1\xf1\xc3\xc1\x0f\x7a\xc5\xdf\xa4\x78\xd8\x81\x73\x65\x08\x10\x6d\xf7\x48\xfb\x80\x6b\xd2\xcf\x8b\x30\x4b\x12\xb3\x15\x71\x77\x5b\x1b\x89\x41\xb4\xa0\x30\x65\x58\x37\xc6\x95\x61\x79\xcc\x86\x5f\x53\x42\x6a\x53\xa6\x6b\xae\x90\x7a\x13\x53\x4a\xd8\x21\xd1\x0b\x81\x2d\x32\xf3\xff\xc0\x0b\xfe\xa3\xa7\xc9\x23\xb3\xaa\xfb\xa8\xa1\x85\x46\x35\xc5\xe6\x86\x36\x6b\x04\x23\x4c\x0c\x6b\xea\xdc\xd2\x22\x4e\xc6\x30\x9c\x71\x3c\xa0\xe0\x74\x2b\x38\x01\xc0\xb2\xe9\xd4\xa1\x4a\x65\xdc\xef\x92\x21\xad\x80\xba\x84\xf4\x97\x41\x51\x7a\x71\x87\x8a\xa2\x64\xab\x74\x18\xb9\x3e\x15\xf6\xe1\x31\x76\x7b\x9c\xc4\x1a\x6a\xf3\x81\xe5\x0b\x99\xff\x23\x63\xc1\x1b\xc7\x2e\xb9\x0f\xb5\xb7\x09\x56\x73\x4f\xa4\x79\x28\x22\xde\x4f\x23\xd2\xd2\x04\x52\x85\xd0\xfe\x46\x8b\x18\x12\xbb\x28\xd1\xca\xef\xa4\x98\x72\x6c\x0f\xce\x34\xa8\xdf\x14\xc4\xdc\xe9\x47\x51\x1d\x39\xc5\x78\x96\xcb\x9e\x09\x4b\x13\xf9\x06\x5f\x09\xe3\x16\x06\xea\x99\xc3\x00\x5a\xa4\x4a\x54\x2b\xc5\x4c\x77\xbb\x5e\xa2\x0d\xc3\x2a\x7a\x90\x27\xa9\xa9\x4b\x1c\x8c\x14\xe3\x7d\xa5\x10\x01\x61\xff\x7c\x06\x63\xf2\x9b\x7c\x19\x2e\xda\x4a\x11\x25\x06\x37\x55\xe4\x40\x83\x12\x17\xf3\x30\xa1\x53\x8a\x82\x5e\xd2\xce\x02\xb5\x20\x03\x72\x39\x06\x93\x9c\xbc\xe4\x76\x1f\xa0\x7f\xf6\x77\x4a\xe0\x04\x93\x75\x0e\x03\xa4\xdd\x13\xdb\x4d\xdf\x8f\xa0\x59\x11\x4a\x04\xdf\x86\xff\x9d\x5e\xf0\xf8\xb2\xfd\xa4\xec\x79\xde\x52\xe2\xcd\x08\x26\x18\xbc\x02\x8a\xbe\xbc\x59\x38\x9f\xd3\x81\x47\x6a\xee\x2d\xf2\x1f\xb9\x29\xd3\x41\x0e\x11\xac\x70\xed\xda\x71\xa5\xfd\x2f\x8f\x1d\x2a\xc0\x62\x7f\xdf\x0b\x3e\xee\x2d\x17\x4b\xd8\xc6\xed\x28\x81\xb8\x0e\xb7\xe9\xc8\x9d\x47\x6c\x5b\x04\xda\xea\xac\xdd\x00\x8a\x6a\xc1\x7f\xa5\x37\x75\x93\x1f\xb9\x73\xaa\x93\x24\x47\xca\x86\x0c\x2b\x67\x8a\x1f\x81\x17\xb4\x21\x76\x57\xc5\x6e\xd3\xe9\xf7\x7b\x0c\xa5\x8d\xff\x1e\x2f\xf8\x16\xef\x41\xf5\x4f\xb7\xb3\xf8\x08\x37\x91\x59\x56\x17\x2e\xa0\x06\x44\xb5\x2b\x8d\x09\xef\x68\x73\xfa\xca\xb6\x2c\x55\x0d\x94\xca\xa6\x55\xd2\x82\x94\x57\x8d\x59\x93\x43\xe1\x73\xd0\x0d\x67\xb0\x40\xc9\xd8\xae\xd9\xbf\x3c\xc6\xfe\x89\x25\xf0\x35\x68\xb0\xd2\x52\x57\x16\xc1\x09\xdd\x93\x2d\xff\x47\xc7\x82\x47\xac\xbf\x2b\xe4\x7d\x41\x5b\x9a\x95\xf3\x1f\x55\x3b\xe6\x57\x16\x79\x3b\x0d\x89\xe1\x3a\xcb\x45\x44\x2e\x65\xf4\x40\x5f\xf7\x0e\xd0\xaf\x2e\xbc\x5b\x8d\xfd\x44\x8d\xe9\x9f\xfc\x77\xd6\x82\x6f\xf6\x4c\x29\xf6\xd0\xda\x2d\xb1\x6a\x5c\xa0\x77\x4d\x66\x9d\xe5\x14\x5f\xc4\xd7\x8a\x46\x15\xa7\xb8\x12\x37\xfd\xd8\x34\x93\x64\x0d\x5e\x4f\x5b\x49\x57\xd2\x75\x78\xf7\xb6\xd2\xe1\x51\xc5\x96\x3d\x2b\xfa\xff\x17\x3c\x76\xf9\x69\xc3\x31\xbf\x64\xe5\xf2\x25\x04\x0e\x5c\x4a\x93\x5e\x76\x39\x9d\x53\xfd\xf3\xbf\xc7\x0b\xbe\xd3\xab\xfe\xcd\x59\x71\xa4\xe0\x9b\xeb\x3c\x49\x51\xb8\xf4\x95\x3e\xe7\x98\x16\x06\xe3\xa7\xe6\xac\xf4\x73\x93\x5f\x14\x21\x98\x6d\x24\x86\x1b\xf3\x4c\xa6\x56\xe6\x5c\xaf\x9f\xf6\x12\xa5\x60\xb1\x5f\x18\x67\x47\xab\xe2\x0a\x1f\xef\xa7\xf2\x5c\x18\xc9\x21\xf0\x38\xd8\x68\xfe\xb7\x8d\x07\x2f\x37\xef\x38\x9d\x88\x39\x3c\xe7\xf0\x83\x06\x6f\x06\xab\x84\xbe\x40\x6f\x24\x19\x1a\xbd\xd6\xd4\x05\xa7\xab\xad\xd4\xfa\x12\x7a\xdd\x63\x78\x18\x20\x9e\xea\x21\xf0\xdb\xab\x7f\xbb\x89\xb3\x63\xec\x1a\x3b\x98\x4a\xd1\xbe\x1c\x47\x03\x3f\x0a\x5e\x39\x04\xb8\xcf\x27\xd4\xcf\x53\x5b\x69\x98\xcb\x49\x84\x9c\xb8\x6c\xc6\x04\x8e\xfe\x4e\x92\x92\xf2\x63\x7e\xd4\x31\x74\x61\xcc\xb1\xc3\x17\x55\xfb\x32\xd7\x7d\xf8\x4a\x66\x35\xd1\x5f\x0a\xe6\x6d\x9d\x07\x7f\x29\x69\x3b\x38\x26\x2b\x04\x53\xae\x6d\xf3\x60\x03\x57\x23\xf1\x52\xe9\x38\x88\xde\x88\x76\x2e\xaa\x00\x03\x15\xae\x05\x57\x75\x2d\xa8\xb3\x19\x68\xb2\xa7\x55\x9d\xb1\x39\x69\x64\x54\x0b\x56\x71\x29\x69\xdb\xad\xb9\x83\x15\x73\xe0\xff\x3f\x01\xc3\x68\x09\x33\x23\xda\xa9\x75\x68\x54\xa2\x34\xdc\x94\xbf\xfe\x50\xf0\x65\xf4\x6f\x57\xf8\x00\xf3\x65\xe5\x85\xf8\xef\x0e\xdc\xbc\x70\xed\xf5\xc2\xf5\xe3\x9e\xbe\x71\xbd\xd3\x0b\x22\x6d\x07\x82\xa8\xc3\x67\xb9\x3d\xb6\x7c\x9f\x60\x5f\xcd\xee\xd8\x8d\x91\xf6\xa6\x05\x64\x0f\x16\x90\x5f\xb6\x51\x9b\x7e\xfe\x46\xa0\xa4\x2b\x6c\x20\xaf\xf3\x46\x18\x41\x9e\xc3\xce\x3d\xe5\x5d\xde\xf9\xe6\x5e\xf7\xef\x34\x37\xf7\x20\x30\x57\x75\x92\x35\xe5\x1b\xfa\xeb\x0e\xb1\x17\x5a\x4b\x0f\x63\xa8\xcd\x1d\xfd\xac\xfa\x13\xc4\xd5\x6f\x1d\x0c\x5e\x64\xfe\x72\x05\x16\x3c\xde\x9e\x8e\xe0\xa7\x6e\x4a\xae\x3d\x4b\xae\xab\x5a\x70\xad\x05\x41\x38\x8c\x59\xa8\x87\x8a\xa6\xc1\x96\x36\x33\x6c\x6a\x9b\x78\x9e\xaa\x29\xbf\x29\x76\xf6\x20\x76\x3e\x61\x8b\x9d\x9f\xd9\xa3\xd8\xf9\xe7\x5f\x24\xa9\xa3\x2b\x7a\xca\x13\x3b\x8b\x9c\x7b\xfd\x7b\x1a\xdb\x70\x1f\xd0\x0a\x2b\xd9\x0e\x8d\x34\x61\xec\x33\x87\xd8\xd7\xec\x00\x41\x7e\x01\x39\x82\x75\x64\xeb\x05\xd5\x91\x79\x3b\x1a\xcc\x7f\xfb\xa1\xe0\xf3\xde\x8e\xaf\x95\x88\xd2\x01\x94\x02\xe8\x0c\x8b\x95\x05\x37\xea\x14\x2e\xf7\xb0\x76\xf3\x84\xa8\xfb\x81\x3a\x5d\xb4\xdb\x29\x46\xa5\xe6\x5b\x09\x0f\xb3\xac\x2f\xb3\x59\xc6\xef\xe4\xe7\x93\x2d\x0a\xce\xa1\x82\x8a\x14\x21\x1d\x8e\x8b\x6e\x54\xa2\x3b\xbe\x4f\x7d\xf4\x72\x0b\xea\x7b\x4d\xf2\x76\x12\x4b\x0a\x80\x70\x9a\x23\xaf\xb5\xa4\x6c\xd3\x95\xb2\x1b\xe6\xf7\x39\xd2\xf5\x07\x0f\xb0\xff\xb3\x8f\xfd\x43\x91\x65\xfd\x54\xb6\xe7\x13\x62\x3d\x68\x0d\x40\x31\xcd\xfc\xdf\xdc\xa7\xd3\x76\x3e\xba\xef\xca\xa8\xb7\xae\xf0\x89\xb9\xf9\x95\xc9\x22\x20\x20\xa3\xb4\x4a\xd9\xea\xc3\xc0\x41\xc5\x76\xbe\x19\x3e\x31\x5e\x40\x8b\x65\x8f\x9a\xae\xc5\x76\xa9\xff\xd0\x23\xf2\x24\xca\x6b\xb2\xdf\xc2\x0c\xc3\xdc\x84\x78\x20\x54\x1e\x9f\x9b\x5f\xa9\x72\xf2\x61\x45\x04\x50\x0e\xa2\xe4\x08\x18\x32\x74\x77\xa8\x59\x13\x2b\xf3\x17\x26\x81\x99\x2b\xdc\x0c\x81\x66\x13\xf0\x3f\x28\x8e\x55\xbf\xdc\x30\x21\x16\xed\x52\x33\xe1\x0e\xdf\x4b\x93\x5e\x92\xa2\x05\x1a\x0e\x8d\x30\xe5\x34\x80\x4e\x95\x70\x1d\xd0\xe1\x28\xbd\x34\x69\xf7\x5b\x34\x7e\x55\x6f\xa3\xf4\x9c\x98\x9b\x7f\x70\x92\x37\x1a\x8d\x51\xc3\x57\x1a\x27\x35\x0d\x7a\x9c\x20\x90\x45\x7d\x6a\xc0\x3d\xc0\x12\xe8\xf6\x60\x96\x31\x6e\xfd\x6f\x6e\xfe\xc1\x89\x68\x92\xbf\x98\xb7\x64\x18\x4d\xf0\x95\xf9\x0b\xfc\x4e\x35\xc6\xea\xe1\x14\x9f\xe0\x59\xbf\xfb\x70\x79\x08\xae\x3e\x0a\x6f\x5c\x9d\xe4\x93\x7c\x92\xb1\xb5\x70\x7d\x5d\xa6\xd4\x56\x98\x5f\x98\x23\x29\x62\xe4\x64\x50\x22\x1e\xf0\xde\x4c\x6f\xf3\xa2\x3b\x13\x64\x29\x94\xd7\x7a\x32\xc6\xfc\x0e\x30\x05\x52\x60\xf7\xd2\x85\x49\x27\x9c\x67\x43\x60\xaa\xb9\x15\x08\xa0\x3e\x39\x36\xed\x7a\x77\xdf\xed\xb1\x5b\x61\xc2\x97\x89\x68\xce\x7f\x8b\xc7\x66\x6f\x88\xdd\xe0\x82\xfd\x79\xf0\xc0\x15\xa7\xb8\x2b\x4e\xc4\xad\xd0\x14\xc1\x15\x7b\xb4\x25\x62\x1d\xee\x63\x20\x75\xd2\x70\x7d\x23\xe7\x71\xb2\xc5\xde\x7f\x1b\xbb\x63\x27\xef\x0c\xd8\xc6\xde\x78\x5b\x70\xb7\xf5\x77\x89\xae\x8c\x7e\x81\x7f\x83\xe1\x7c\x2b\xcc\x36\xd0\x8b\x01\x56\x29\x17\xd0\xef\x67\x6f\x65\xff\xad\xc6\x6e\xa3\x41\x3c\x23\x5a\x57\x65\xdc\xf6\x7f\xa9\xb6\x4d\xbe\x4a\x65\xc3\xe8\xcb\xe0\x3b\x6a\x0b\x4e\x51\xfa\xae\xbc\x46\x7f\xda\xc4\x05\x95\x62\xb5\x9d\xc4\x47\x4c\xb2\x48\x3c\x20\x6b\x23\x84\x25\x45\xb2\x30\xcc\x5b\xfe\x8d\x52\x85\x15\x39\x91\x8b\x9d\xf2\x4b\x21\x3a\x82\x4c\x82\x25\x34\x85\x88\xdb\xca\xed\x81\x37\x8b\x06\x91\x0d\x01\x30\xcf\x8b\x6c\xcc\x9e\x56\x19\xf5\xf0\x5b\x51\x62\xec\xfd\xfb\xd8\xf3\x42\xcb\x0f\x06\x56\x81\xef\xdf\x17\xbc\x79\xdf\x62\xe9\x69\x95\x33\xc8\x7e\x87\xeb\x28\x62\x1b\x87\x4b\xda\x51\x10\xce\xdb\x5a\x65\x46\x89\x5c\x8e\x15\x33\x89\x57\x8e\x63\x89\xb6\x58\x2a\x7b\x91\x68\x99\xfc\x5f\x03\x6b\x7e\xc5\x0d\x77\xa1\x6e\x35\x21\x8f\xf7\x0a\x07\x75\x0b\xb1\x8e\x21\x6d\x4b\x4d\xfb\x96\x48\xdb\x19\x64\x7a\x8a\x3c\xd4\x94\x85\x94\xe5\x0f\x6c\xe0\xfa\x13\x93\xf2\x1a\xe6\x66\x16\x51\xdc\xab\xda\x65\x5b\xc6\x14\x0f\x38\x94\xad\x69\xf5\x4c\x49\x43\xa9\xa4\x7b\xc1\x3a\x89\x79\xe3\x16\xff\xaf\x55\x25\xb8\x93\xda\x61\x07\x7c\x35\xb9\xd1\xde\x17\x4b\x39\x69\xfa\x9c\x9a\x5b\x5a\xd4\xab\x37\x5c\x8f\x95\x40\xa3\xf1\xa6\xbc\xfa\xa4\x9f\x23\x43\x42\x96\xd9\x0b\x70\x2e\x76\xe7\xc5\xca\x03\x07\xd9\xdd\x15\xe9\x55\x8c\x64\xa3\x8d\xa8\x0f\x51\x8a\x50\xd2\x19\xe6\x10\xfa\x56\x92\x78\x46\x87\xa0\xf1\x38\xa7\xe9\x6f\x2c\x13\x75\x1d\xbd\x51\xa5\x35\x4a\x6b\x24\x69\xf5\x4d\x4f\x9d\x68\xcd\xbf\xf4\xd8\x3e\x58\xe6\xfe\x9f\x78\xc1\x93\xde\x9c\x93\xf4\x49\x1b\x40\xb7\xcc\xe8\x04\x76\x05\x3a\x6b\xbd\xd8\xab\xe0\xa8\x42\xaf\x0b\xa5\xc0\x63\x38\x74\x9e\x8a\x4e\x27\x6c\xe1\x0a\x28\x6c\x9b\xba\xa7\x24\x3d\x9c\x2b\xcb\x49\x76\x9c\x1d\xbd\x31\x21\xa5\x44\xc8\x53\xde\x0b\x47\x66\x77\x1c\xf2\x0f\x88\x3c\xe9\x86\x2d\xc6\x7e\x78\x8c\x8d\xe5\x51\xe6\x7f\xff\x58\xf0\xfe\xda\xea\x85\x52\x5e\x41\x93\xcf\x9b\x18\x1f\x7b\xd3\x83\x53\x30\xeb\xf7\x30\x5f\xdb\x24\x47\xa9\xef\xd5\xa3\x3a\x3f\x7e\xfc\x58\xd3\x71\xdb\x76\xa5\x39\x28\x73\x83\x10\xa8\x71\x69\x8a\x75\x09\x39\xb3\x20\xaa\x0a\x78\x04\x5d\xc6\x35\x9d\x2a\x67\x12\x9d\xd2\xdc\x05\x4b\xcb\x6d\x78\xa5\xc2\xcb\xa4\xd9\x98\x21\x02\xfa\xd2\x22\x34\xd3\x18\xe7\xeb\x7a\xdb\x84\x43\x02\x8d\x77\xfa\x51\x27\x8c\x22\x7d\xa7\xd3\x6f\x98\x8e\xaf\x5c\x5a\xbc\x01\x5f\x45\xe5\x54\xad\x5e\x58\xd9\xe5\x4c\x3d\x79\x1b\x9b\xa8\xf4\x7c\x10\xca\xbe\xed\xfe\xf0\x7f\xfd\xd6\xe0\x51\xe7\xc9\x8d\x39\x96\x94\xee\x5d\x38\x96\xaa\xfd\x4a\x9a\x60\x59\xfd\xb5\xb8\xe0\x1c\xb6\xbf\x71\x0b\xfb\x11\x8f\x1d\x16\x11\x30\x7f\x88\xb5\x48\xfa\xdf\xed\xb1\x7b\x76\xe1\xc5\xc1\xbe\xa0\x75\x5d\x35\x7e\xb9\xe0\xac\xb4\x4a\x2b\xfb\x1e\x89\xe1\xa5\x70\x34\x42\x92\x0d\x04\xe3\x99\x2b\x8c\xe1\x7e\x41\x97\x87\x41\x3e\x68\xb2\xf7\x68\xee\xd8\x1f\xf4\x82\xb7\x78\x3a\x39\xbb\x7c\x3a\x59\xc3\x41\x9e\x5e\xfb\x4a\x4f\x10\x1b\x74\xa6\x5c\x7c\x60\x65\x15\x32\x48\xed\xfc\xe3\x82\x89\x97\xc2\xae\x55\x89\xf7\xcb\x7c\x29\xea\xaf\x87\xb1\x3a\x14\x27\x26\x79\x4b\xa0\xeb\x81\xce\x64\xa8\xcf\x91\x55\x3f\x35\xce\x68\xc4\xfd\x1f\x1f\x0f\xbe\x7f\x1c\xff\x5d\xc0\xd1\xb5\x65\x61\x3d\xa0\xe6\xa2\x05\x21\xe9\x40\x56\xa1\xa3\x58\x6a\x9c\x64\x2b\xbc\x17\x44\x1c\x5c\x98\x01\x5a\xc5\xe6\x2f\xa5\xb8\x45\x57\x5f\x00\x75\xdf\xea\x68\xd2\x95\x71\x2b\x42\x4c\x0b\x4c\x6a\x6f\xab\x73\xc6\x49\x6d\xb6\xaa\x43\xeb\x12\x89\x6c\x7d\xe9\x81\x5e\x88\x8c\x07\xea\x1f\x33\x01\x86\x3a\x40\x15\x4e\x43\xdc\x8f\xad\x26\x58\x5f\xcf\x05\x94\x78\x69\xd5\x89\x17\x55\x88\xc3\xeb\x76\x45\xdc\x2e\x58\xe5\x9d\xd2\x55\x83\xf2\x5c\x40\x2e\x2f\x2d\xb0\xe1\x74\x83\x3a\x01\x97\x56\xa0\x3a\x38\x2d\x83\x46\xc1\x2a\x28\x20\x06\x17\x17\x8a\x98\x81\x52\xdd\x20\xfa\x80\x68\x18\xc8\xe7\x88\xb7\x98\x7a\xa4\x01\x8c\xd4\x94\xd2\x10\x95\x73\x63\x29\x31\xc1\x85\x92\xfa\xf9\x7d\xcc\xce\xd5\xcb\xfc\xf7\xed\x0b\xde\xba\xcf\x7e\x52\x8e\xb8\xba\xaa\x9e\x91\xb4\x2b\xd6\x2d\xad\x4a\x1c\x57\x61\x64\x44\x56\x40\x70\x6a\x41\x41\x4a\x1c\x81\x52\x24\x9b\x90\x41\x69\x22\x60\x4c\x3e\x26\x54\xa3\x33\x2c\x8a\x5e\x67\x7c\x02\xbb\x0d\x2a\x55\x3c\x68\xb6\x92\xee\xd4\xe3\x49\x2c\x83\xba\xfb\x2c\x95\xeb\x61\x12\x07\x93\xbb\x69\x92\x99\x34\xd3\x1e\xb3\x70\xdc\xf6\x58\xb8\x6a\x5a\x59\x52\x6b\x28\x92\x14\xa6\x2f\xaf\xf5\x12\xc4\x3f\xc8\x86\x3e\x35\x59\xdf\x4a\xd7\x53\xb7\xff\x2d\x5a\xd4\xda\x40\x5b\x5e\x92\x10\xb1\x65\x0a\x11\x5b\x6a\x4f\x41\x03\xd5\x09\x05\xbc\xcb\xe5\x65\x06\x53\xa4\x2e\x60\x12\x71\xa6\x24\x29\x52\x54\x71\x68\x2e\x1f\x48\xf4\xbf\x69\x89\x05\xab\x25\xa0\x25\xf6\x94\x76\xa4\x34\x0f\xa3\x8d\xd0\x04\x2f\x22\x3d\x61\x92\x65\xa1\x96\x9b\xc5\x49\x0d\x1b\x5b\x67\x10\x15\x8f\x9d\x91\xa0\x65\x49\xca\x1d\x86\xc0\x84\x1d\x3d\x3d\x26\x4c\x8d\x56\x98\xf9\x76\xbb\xa8\x8a\x1f\xf6\xd8\x03\xcf\x9c\x0f\x7e\x05\x0a\x45\x4f\xfc\xa5\xe0\xc2\x76\xbf\xbb\xde\xf8\x2a\x97\xbb\xb6\x08\x43\xc3\x9b\xec\x3b\x6f\x61\xc7\x5d\x22\x3f\x8b\x20\x45\xc3\x20\xac\xa0\x61\x6d\x0e\xe2\xbc\x96\xa5\x92\xd0\xfe\xa7\x0f\x07\x7f\xe8\x8d\xfa\x95\xb7\x36\x64\xeb\x6a\x91\xf2\x0a\x22\xd6\xc4\x8e\x01\x6d\x7a\xd2\xef\xc1\x90\x6b\xec\x66\x11\xeb\xb0\x38\x08\xb6\x26\x19\x5b\x00\x75\x9c\x17\x9b\x98\x5f\x54\xf8\x8f\xb3\x56\xd2\xb3\xc2\xe3\x78\x57\x5c\x95\x19\x5e\x57\x5a\x1b\x5c\x8a\x2c\x44\xd1\xb6\x9e\x8a\x38\x1f\xfe\x8e\x22\x12\x71\x4b\xc7\xad\xa8\xaf\x96\x8a\xcd\x7f\x05\x9d\x50\x87\xef\x75\x0f\xe0\xc0\x1d\xed\xe1\xf3\x07\xd5\x2c\x6b\xf0\xfd\xef\xf5\xd8\xfc\x68\xa4\xf0\xf2\xa0\x56\x8c\x18\xe1\xf1\x3f\x50\x50\xdb\x29\x9d\x0e\xe3\x7c\x34\xf3\x04\x12\x6a\x42\x4e\xcb\x50\x52\x31\xde\x19\x31\x0d\xad\x88\xd2\xa2\x81\xbf\xe9\xcb\xb9\x09\xda\xff\xc5\x73\xaf\xbc\xd4\xf2\xae\xdc\xb7\x47\xd0\x7e\xf6\x3f\x35\x07\xce\xe7\x3d\x36\xb7\xb7\x1d\xd7\x93\xad\xe0\x87\xbc\x1d\xe3\xd9\xf4\xae\x42\x60\x3e\x93\x11\xdc\xe4\x88\xf1\x5e\x88\x15\xc3\xb0\xaf\xd3\x74\xdd\x68\x97\x41\xd2\xe7\x5d\xd1\x96\x4e\xa1\x14\xf8\x8b\xd1\xc3\x94\x06\x8a\x79\xa1\x74\xd9\x96\xed\xe6\x53\x5e\xba\xb3\x47\xe7\xb2\x7f\xb1\x20\x06\xd8\x8e\xe5\x6a\x94\xc8\x2e\xfb\x99\xdf\x71\x88\x1d\xdb\x66\x44\xf1\x0a\xa4\x2f\x3e\x26\x58\x31\xf3\xff\xe0\x60\x90\x0f\x3f\x2e\x04\x2c\xd8\xd8\xed\xc2\x9c\xe4\x34\xe7\xfa\xe3\x64\xb0\xd2\x2a\xc7\x80\x6c\xfa\x1e\x2e\x7d\xb9\x4c\x3b\xa2\xe5\xc6\x56\x7d\xe6\x00\x7b\x9d\xbe\x2f\x3d\x1e\x74\x47\xd9\xf2\x4c\x05\x38\xb7\x2e\x58\x9c\xe0\xc1\xba\xcc\x21\xb6\x17\x81\x45\xcd\x63\xfc\x33\x68\xf2\x20\xe0\x13\x30\x69\x93\x14\x2f\x5b\xc6\x02\xf8\xf3\x1a\x3b\x64\x56\x80\xff\xb9\x5a\xf0\x1b\xb5\x02\x97\xc4\x6a\x90\x13\x0f\x45\xc7\x60\xa9\x4d\x4d\x5e\x58\x39\xc0\xf4\x50\x20\x2f\x42\x70\xa3\xfe\x08\x61\x5e\xe2\xc4\x2a\x17\x8c\x6c\x51\x54\x3c\xc9\xec\x96\xdb\x6b\x0d\x7a\x38\x6a\x85\x94\xbf\x42\x4d\x49\x7d\xa1\x41\x31\x4b\x07\x72\x36\x3c\x40\x81\x88\xa2\x00\xaf\x5c\xa3\x8e\xf1\x4c\x07\x68\x57\xe9\x15\x00\x5b\x1b\x75\x2a\x7e\xb2\x87\xfd\x6b\xd9\x41\x5d\x9a\x7f\x21\xb8\x4f\x2f\x47\x0c\x14\x2f\x22\xec\x75\x54\xa8\x83\xb3\x9e\x35\x39\x0f\xee\x0c\x46\x4c\xe8\x2b\xd9\x61\x2b\x84\xd8\xbf\x1c\x9c\x59\xb1\x22\x8a\x77\x5d\xbe\x2e\x3e\x4e\x62\x17\xe6\xe7\x49\x8f\x8d\x6f\xca\x74\xcd\x7f\x4d\x10\x3f\x28\xd3\x35\x3c\x65\x2c\x4a\x6f\x53\xd6\xdc\xd2\xa2\xda\xb0\x6b\x75\x1e\x85\x57\xe5\x2c\x5f\x97\x79\x1d\xf4\xed\x3a\xdf\x42\x86\x4f\xcc\x38\xae\xd3\x61\x50\xa7\x55\x5c\x57\x2a\xfb\xb5\xc1\xb6\xbd\x5c\x61\x07\x48\x16\xf8\xe7\x83\xbb\xb5\x96\x40\xeb\x55\x55\xac\x1f\x51\x4f\x97\x8d\xb1\x7a\x9b\x42\x2f\xb2\x7d\x20\x9f\xfc\x85\xe0\x14\xa6\x53\x58\x05\xde\xaf\xa1\x71\x76\x5d\xdc\x5f\x7b\xec\xab\x77\xf4\xcf\xa0\x72\xf6\x9f\xbd\xe0\x2e\xe7\x89\xf1\xd1\xe0\x91\x5a\xa6\xf9\xb6\x6d\xa6\x8e\x58\xf9\x46\x8f\xbd\xde\x63\xb7\x44\x89\x68\x9f\x11\x91\x88\x5b\x32\xf5\xfb\xbb\x48\xde\xbd\x60\x7d\x40\x8a\xde\xbd\xf6\x33\x37\xa7\xa4\x8a\xca\x4c\x72\x55\x69\x63\x8d\x3e\x68\xb2\xdf\xfe\x52\x47\x3c\xa3\x2e\x6b\xa5\xea\xb4\x17\xc2\x2c\xed\x43\x26\xc0\x99\x7e\x7b\x5d\xb3\xa5\xf9\xef\xfc\xd2\xe0\x9b\xbd\x91\x3f\xdb\xd7\x87\x11\x46\x38\x8b\x64\xb9\xa2\x98\x26\xa7\x82\x94\x32\x93\xa7\x22\x8c\xb4\x48\xeb\x43\xc2\x87\x21\x52\x27\x1a\xb5\xeb\x9e\xdf\x36\x45\x64\x73\xa8\xb5\x5e\xf7\x6e\xa3\x31\x38\x2f\x45\x94\x6f\x0c\xae\x7b\xb7\x11\x81\x8e\x79\x70\x8b\x86\x0f\x5e\x4a\xda\x6e\xe8\xd2\x47\xbe\x84\xfd\xf9\x41\x87\x8a\xfd\x0f\x0e\x06\x7f\xbe\x7f\xbe\x00\xdd\xd0\x09\x47\x16\x0e\x07\xf0\x6d\x2d\x9c\x41\xff\x45\xd1\x22\xdb\xcc\x9a\x49\xb2\xe3\x15\x7d\xa6\xf6\x16\x05\xe1\xf7\x9d\x44\x3d\xc7\x4b\x96\xe4\x57\x63\x75\xb1\xa6\xc4\xe8\x02\xc8\x1e\x48\x94\xd1\x14\x32\x61\xd1\xe9\xe3\x0f\xc0\x19\x4e\x58\x40\x90\xb1\x4a\xe1\xe9\x9d\xbe\xd2\xbd\x26\x67\x79\x83\xaf\x0c\xe2\xd6\x39\x48\xbf\x9d\x2d\x3b\x5d\x64\x0c\xd1\xb2\x12\x31\x02\xb8\x4c\xd3\x04\xaf\x0d\x5b\x22\x8b\x8f\xe4\x06\xbf\xab\x95\x74\x7b\xfd\x5c\x3a\x4e\x67\x5e\x72\x6e\xeb\x8b\x84\x35\x4b\x94\x33\x0b\x89\xc2\x78\xfc\xe8\x5f\x54\x7f\x4b\xa5\xe9\xef\x35\xd4\x97\xbb\xa8\xcd\xc0\x19\x33\xfa\x39\xc0\xe0\x62\x0d\xbe\x18\x67\xfd\x4e\x27\x6c\x29\x75\x57\xcd\x31\xf6\xb2\x68\x18\xa0\x5f\x01\x1d\x0a\x65\xea\x00\x16\xef\x9a\x8c\x92\x2d\xab\x0b\xa5\xd6\xe0\xff\xb4\xdd\x49\x5f\xac\x2a\xd7\xf1\xa5\x9d\x7a\xb6\xc7\xfe\xad\x0c\xf7\x2e\x95\xd0\x21\x70\x17\x69\x5e\xf9\x78\x57\xad\xad\x68\xda\x6a\x65\xf5\xab\x69\xbf\x60\x12\x19\x9e\xe6\x8a\x72\x4a\x83\xa0\x2d\x52\x85\x9d\x6d\x68\xfb\x42\x10\x86\x4c\x4b\x19\x12\x5f\xc3\xee\x1d\x6d\x5b\xdf\x46\xf7\x37\xfb\xf6\x29\xef\xc8\xb6\x68\x62\x87\xfc\x03\x0d\x38\x61\x77\x07\x19\xb6\x8b\xcc\x0b\x2a\x6c\xd7\x99\x17\x67\x59\x49\x6e\xf9\xc7\x74\x1c\xcf\x57\x6a\xa1\x5e\x0c\xf9\x06\xbe\x03\x33\xed\x44\x48\x5c\x64\x25\x69\xe7\xdf\xad\x8b\xf9\xea\x6e\x18\x87\xdd\x7e\xd7\xf0\x89\xed\xa2\xb8\x6f\x39\xc0\x6e\xa5\x49\x42\x69\xe9\xff\xd5\xfe\xe0\x27\xf6\x2f\xd8\x8f\x8a\x03\x68\x58\xea\x23\x70\xe2\x46\x92\x49\x2e\x37\x31\x0f\x49\x09\x12\x83\xf6\x67\x56\x02\x78\x63\xd1\x46\x61\x5e\xb4\xf3\xad\x08\xa6\x1a\xec\xe4\x48\xa5\x91\xf3\x81\x54\x57\x26\x19\x17\xcc\x83\xa3\x57\xb9\x03\xf5\x32\xe7\xa0\x42\xe9\x64\xa8\xae\xe8\x15\xf7\x66\x17\xbf\xde\x6a\x5d\xd1\x72\x50\xd3\x74\x5b\x2d\x14\x9f\xe1\xcf\x09\xea\x29\x53\x6d\x5d\x1b\xa8\xb3\xc2\x96\xb8\x02\x80\x9a\x80\xe1\x47\xbd\x40\x0e\xe4\x8e\xbe\x3a\xa8\xd2\x27\x94\x0c\x06\x78\x7e\x8c\x06\x4a\xfa\xf9\x24\x1e\x17\x57\xa5\x21\xb9\x57\xed\xaf\xb8\xa7\x00\x66\x3f\xed\x59\xc3\x25\xb0\x87\x2e\x1a\xa4\x1c\xd3\xba\x76\xd8\x56\x27\x43\xd2\x6a\xf5\xf1\xa8\x10\xa6\xc7\xb9\x1a\x63\xba\x6f\x14\x70\xc2\x84\x9f\x50\x8c\x36\x66\x4e\x39\xc0\x75\x6a\x9c\xb6\x9d\x46\x1a\x10\x20\x5e\xc5\x18\xb2\xc5\x8e\x9d\x6e\xb8\x9e\xc8\x8c\x67\xdd\x24\x01\xd0\x7a\x9a\xdf\x22\xf8\xae\xb8\x80\xc0\xd8\x25\xe8\x0e\xd0\xe3\xd2\xe4\x17\x44\xba\x6e\x0b\x39\x19\xe7\x69\x58\x24\xf8\xa9\xc2\xd0\xe6\x42\x08\xfd\xbd\x34\x59\x8b\x64\x97\x60\x42\x81\x0a\x86\xc6\x27\x6b\xbe\xc7\xbb\x9b\x9d\x66\xa7\x9e\x86\x00\x5b\x0d\x9d\xc4\x1f\x76\x85\x55\xa8\x3c\xfe\x4b\xf4\x16\x3f\x71\xc9\x3e\xe2\x1c\xf1\x6b\xbc\x84\x05\xa4\x45\x91\x8d\x69\xed\xf8\x87\x99\xa3\x1d\xf9\x2f\xd5\x65\x9f\xcc\x93\x5c\x44\xe5\x43\xb4\x55\x00\xae\x20\x67\x6e\xa1\xfe\xac\xc1\x8c\x39\x85\x7f\xd6\x63\xbe\xde\xac\xf7\x23\xd6\x9f\xba\x27\x7c\xc2\x20\x93\x7c\xc0\xb3\x38\x45\x35\x1c\x20\x5c\x16\xf4\x16\x87\x05\x6b\x31\xe6\x85\x19\xec\x27\x3c\x3a\x9b\x96\x7e\x65\x4e\x14\xb5\x22\x31\xea\x8c\xce\x57\x5b\x4c\x21\xc3\x44\xd8\x46\x7f\x7f\xd8\xe1\xc3\xcd\x43\x9b\x0c\xa2\xb7\x2e\x9c\x39\x62\xcc\x70\x45\xeb\xdc\x11\xfc\xf4\xed\x4e\xf0\x57\x85\x17\x9b\x3c\xd8\xef\xbf\x3d\xf8\xe0\xb8\xf9\x93\xb7\x44\x2f\x87\x48\xcc\x61\x31\x2a\x0a\x68\x12\x93\xd6\xb4\xa8\x8d\x17\x7c\x62\x7e\x65\x71\x52\x3b\xf0\xb4\xe7\x01\x28\x1d\x8b\x70\x02\xba\x65\x37\x9d\x64\x4a\x72\x70\xc6\x92\x02\x3f\x10\x65\x8a\x1c\xb7\xd4\x2a\xea\x6c\x3b\x4c\x65\x2b\x8f\x06\x4d\xa5\x5b\x81\x6b\x0e\x02\x18\xd4\x16\xd0\x64\x83\xfa\x22\x8f\xa5\x37\x88\x6e\x49\xa4\x3c\x0b\xdb\xb2\x25\x2c\x34\x57\xf2\x0e\x99\x36\x12\x01\x88\xed\x8e\x2f\x8b\x03\x6c\x5b\x86\x6f\xb9\x4d\x1b\xb2\x9c\x6a\xe7\x8e\xe5\x7d\x22\x37\x67\x5b\xe6\xc2\x8d\x9e\x22\x5e\x84\xc2\xb8\x5a\x72\x38\x11\xea\x26\x7e\x6e\xbb\x1d\x8d\xab\x6c\x77\x25\x80\x40\xb4\xe6\xd5\x30\xd4\x14\x88\xda\x49\x8c\xd9\x80\xcd\xa1\x2e\xea\x58\xb9\xb8\x51\x24\xb1\x57\xfa\x15\xfe\xe6\xd0\x4d\x6b\xfd\x4d\x6b\xfd\x17\xcf\x5a\xff\x3d\xe3\x96\xb9\xfe\x4d\xe3\x7b\x25\xd9\xfd\xc5\xb1\x91\x2c\xbb\xc5\xbf\x88\x57\xca\xa6\xe6\xb9\xe1\xa0\x96\xbb\x95\xc0\x79\x86\x43\x5a\xd0\x1a\x80\x35\x3b\x8c\x3b\x27\x8f\xf1\xd6\x86\x48\x45\x0b\xc1\x72\x53\x1e\xc9\x2c\xab\xf3\x35\xb9\x1e\x12\x0c\x62\xdc\x56\x2b\x21\xd4\xce\x79\x11\x23\x5e\x1d\x80\x7a\x84\xad\xe2\x6b\x3e\xf1\xb0\x68\x3c\x3e\xdd\x38\x3d\xd7\x78\xe8\xd1\x49\x7c\xb9\x2d\x20\x44\x78\xa2\x31\x59\xe7\xed\x24\xcf\xf8\x44\x73\xb2\x4e\x56\xdc\xa2\x8c\x4c\x1b\x7b\x9f\xb3\xd4\x12\xb6\x46\xbe\x97\x87\xd8\xc9\x5d\x47\x49\x19\x41\x08\xfe\x16\x5e\xc9\x8e\x5c\xe4\xea\x37\x9f\xf2\xd6\x76\x76\x76\xdc\xe7\xbf\xd8\x38\x3b\x74\x7d\x25\x37\x87\xa9\xd6\xf5\x6b\x60\xa2\x0b\x7b\xfd\x2d\xec\xf4\x8e\xce\x0d\x32\x32\x43\xa4\xb3\xed\xa4\xf5\x3f\x7e\x38\xf8\xc3\xda\xa8\x5f\x87\xf0\x61\x80\x33\xa9\xc3\x05\x85\x68\x82\x53\x59\x87\x1c\xa8\x7f\xeb\xc0\x83\x30\x6e\x25\xdd\x1e\x30\x98\xb5\x65\x8f\x16\x8f\x8e\x24\xc4\x58\x14\x61\xfc\x1e\x99\xed\x11\x76\x51\x21\x69\xbd\xb5\x21\x3c\x1a\x6c\x3f\x19\x84\xf0\xa7\x21\xc2\x9f\x10\x2b\x29\x39\xb2\xc0\x68\x75\x46\xb6\x84\x52\x01\x5c\xbf\x4c\x6a\x42\xbc\xd1\x3e\xb5\x29\x21\x0a\x51\x18\x98\x0e\x29\x34\x74\x3c\x28\xff\x61\x7e\x24\xe3\x99\xe8\x60\x04\x52\x96\x41\x2c\xd2\x46\x91\x96\xb3\x21\x48\x85\x2d\x7c\xec\x75\x48\x35\xc2\xd8\x46\x91\x53\x31\x99\x35\x14\xcd\xeb\x9e\x41\x3d\x81\xa1\xbe\xee\x3d\xcf\x02\xb1\xa1\x47\xac\xf8\xc0\x39\x4b\xbf\xef\x20\x7b\x53\x8d\xdd\x5e\x74\xf5\xac\x1a\x0e\xff\xff\x7a\xc1\x1f\x79\x67\xdd\x87\x30\x0b\xd8\x27\x0e\xa6\xc1\xee\x9a\xa6\x45\x83\x01\x85\x9a\x30\xd8\xc4\xc8\x29\x63\x5b\x83\x6b\x53\x5a\x8c\x2d\x0c\x50\x51\x6b\xdd\x30\x50\xab\x3a\x0a\xdf\x15\x45\xa8\x49\x30\xca\xe9\xf0\x92\xa1\x6f\x85\x8e\xd3\x77\x3a\xad\x1e\x4f\x25\x29\xbf\x54\x1a\x0c\x1d\xc3\x6c\x0d\xa1\x2d\xdd\x3f\xed\x31\x6b\xb0\xfc\x4f\x7a\xc1\xcf\x7a\x8b\xc5\xc2\x53\xd7\xca\xb4\x6f\x5d\x29\x71\x0d\xb8\x02\x14\x62\x65\xa2\x08\x56\x86\x55\x8d\x21\x8c\x81\x8b\x18\x42\x4c\x46\x03\xc7\x18\x89\x10\xc9\xf6\x18\x38\x43\x23\xaf\x91\x7a\x61\xff\x5e\x35\x3e\x99\xbd\x7a\x1d\x5c\x83\xb7\xd7\xd8\xd0\xfa\xf0\xdf\x50\x0b\xde\xef\x0d\x0d\x54\x29\x8a\x4c\x93\x85\xdb\x2b\xd6\x0a\xa4\xb0\x58\xc6\x95\xea\x67\xc1\xfb\x10\x22\x2c\x96\x93\xb6\x65\x8a\x40\x39\xd0\xe6\x70\x3d\x06\x61\x17\xe7\x75\x98\x18\x6d\x79\x6e\xf7\x01\xa9\x28\x87\x80\xeb\xb8\xad\xa3\x97\x86\x67\xae\xb0\x9f\x9d\x61\x5f\xc3\xee\xdd\xb5\xc3\x1b\x25\x58\xa9\xcf\xec\x5b\x6b\xcc\xdd\x4d\xfe\x5f\x7b\xc1\x8f\x7b\xcf\xdc\xb8\x3c\xc7\x63\xb2\x2d\x32\xeb\x0e\x2e\x6b\x18\x90\x6f\xbb\xc5\x89\x56\x76\x9d\x48\xe7\x57\x57\x97\xc8\x0d\xb4\x24\xf2\x0d\xff\xb3\x87\x83\xa4\xf4\xac\x48\xf5\x00\x88\x33\xf5\x84\x2e\x42\x3a\x46\x9e\xc3\xee\x52\xdd\x07\x08\x2d\x87\x0b\x14\xde\x27\x36\xc5\x2d\x91\xb6\x0b\x10\x7d\xfd\xf5\x75\xef\x00\xfd\xd3\x8d\x5c\x66\xec\xfb\x3d\xa6\x7f\xf2\xdf\xe2\x3d\xdd\xfc\xa0\x87\x74\x06\x8e\x7d\xa7\xb0\xa0\xb2\x34\x51\x41\xa1\xd4\x26\x14\xc1\x07\x56\x16\x4a\x13\xd0\x36\x21\xbb\x1b\x4d\xf6\x7d\x35\x36\xae\x7a\xe8\xbf\xad\x16\x7c\x43\x0d\x46\x2b\xa4\x01\xb0\x10\xcf\xcc\x38\x68\x62\x6d\x1a\x2d\x63\xa9\x2a\x42\xfb\x29\xb8\xd0\x78\x6f\x0a\x05\xac\x1d\x66\x7a\x3d\x1a\x3d\xbc\xd0\x61\x44\xc4\x03\x55\x45\x00\x68\x66\x78\x16\x3f\xb0\x7c\x81\xf2\x3b\x34\x73\xe2\xf2\xb9\x79\x7e\xec\xf4\x5d\x27\x9b\x7c\x09\xa0\xba\x48\xd5\x5b\x0f\x63\x3d\xa5\x47\xa6\x8e\xd0\xad\xd7\x49\xa2\x50\xa2\x10\xd1\xbd\xa0\xee\x72\x0f\xf0\x04\xa5\x6e\x3b\xb2\xf8\x3b\x0e\xb0\x83\xea\xc3\xd5\x41\x4f\xfa\xaf\x3f\x10\xfc\xc5\xfe\x25\xfa\xab\xb8\x7c\x66\x14\xd2\x9f\xcb\xb4\x97\xca\xdc\xd1\x9a\x60\x48\xf5\x82\xc2\x66\xc3\xc7\xa4\x4f\x58\x9e\xe8\xc2\x21\x85\xb7\xb2\x59\x7e\x27\x3f\x7b\x4d\xb4\xf2\x59\x7e\xd1\xa2\x3e\xd4\x38\x65\x5c\xaa\xdf\xa2\x41\x93\xdf\xc9\x97\x52\xd9\x09\xaf\x15\xef\x19\x0a\x07\x51\xbc\xde\x83\x77\x78\xd6\x8b\xc2\x5c\x0d\x25\x0c\xd4\x45\xbd\xd2\xc3\x8c\x71\xcc\x93\x85\xaf\xb0\x02\xca\x74\x5a\x1b\x14\xff\x14\x59\x88\xa0\xfa\xf6\x0b\xa4\xde\xa3\x4c\x62\xdc\x48\x25\x1d\x40\x6a\x81\xc7\x99\xea\xd5\x93\x23\x53\x47\x78\x26\x7b\x22\x15\x79\x02\xd6\x62\x3b\x36\x8e\x71\x4a\x20\x03\x50\x7f\xe8\x81\x52\x41\x30\xb9\xb1\x47\x28\x6a\xd4\x82\x06\xa0\x5e\x53\x0f\x93\x0e\xd7\x4e\x6a\xc6\x4d\x91\xaa\x84\x26\xbf\x94\xe4\x14\xc7\x4f\x99\x1a\x91\xc8\x72\xd3\x0f\x6d\xc8\xa5\x5d\x20\x94\x28\xa5\x65\xc0\x8d\x87\xd7\xfe\x20\x8c\x9d\xf2\xeb\x06\x2d\x3e\xe7\x82\x5a\x8f\x71\xc7\x53\x9d\x24\x99\x5a\x13\xa9\xee\x94\xcc\xcc\xa3\xa9\x35\xf1\x78\x09\x6b\x11\xbf\xd4\x2f\xac\x89\xc7\x27\x9b\xec\xce\x52\x7e\x95\x56\xd1\x67\xd1\x3e\xb5\xfd\xba\x53\x8d\x82\x74\x3b\xc6\x79\x39\x99\x69\x38\x71\x4b\x2d\x4d\x00\x0a\x47\x35\x42\x60\x9c\x35\x4c\x93\x34\x0b\x58\x8d\x48\x4a\xaf\xa9\x5e\xb7\xd5\x36\x46\x13\x12\xb2\x2f\xc1\x54\xa4\xb8\x82\x71\x48\x31\xb0\x82\x95\xab\xd3\xd9\xdd\xe0\x2a\xc9\x13\xa3\x43\xe8\x2d\x4b\xdf\xd9\x9b\xf2\x77\xf6\x31\x5e\x85\xb5\x80\x30\x0b\x2b\x4a\x8b\xce\xfc\x0f\xee\x0b\x3e\x5f\xb3\x1e\x54\x42\x58\x26\x31\x40\x56\x11\x1a\x36\x94\x53\xe7\x61\x53\x36\x79\xbe\x61\xc0\xfa\xb7\x44\x36\x05\xcc\xe2\xbd\x9e\x8c\x89\xe1\x32\x0f\xe3\x7e\xd2\xcf\x22\x34\x6d\x5b\xc6\xf1\xf3\xc9\x16\x4f\x3a\xb9\x84\xdc\x66\x34\x1a\xc0\x98\xdb\x2d\xd1\xd3\x41\x76\x7f\xdc\x43\x10\x19\x9f\xd2\xa1\xac\xb3\xb8\xdc\x1f\xd5\x82\x0b\xf4\x85\x11\xac\x16\x8d\xf5\x64\x2a\x4f\x92\x28\x9b\xc2\xc6\xe3\x7f\x1e\x5b\x4b\x13\xd1\x6e\x09\xb0\x44\xae\x27\x01\xcf\x36\x92\x2d\x4a\xcd\xdf\x00\x77\x01\x70\xc0\x43\x33\xc0\xaa\xa1\xc6\x61\x43\x8a\x34\x5f\x93\x82\xb8\x09\xd5\x2a\x58\xef\x87\x6d\xc9\x5b\xfd\x2c\x4f\xba\x60\x2f\x2a\x1a\xe2\x4e\x62\xf3\xba\xb7\x0f\x34\xc8\xeb\xde\xf3\xd4\x0e\xb9\x4c\xc6\xdd\x92\x59\xfd\x17\xbd\x77\xd5\x58\xcc\xf0\x55\x5f\x6a\x8b\xf7\x92\x61\xc1\x76\xfd\x9d\xa4\xb1\xc7\x06\xef\x0f\x7c\x3b\x30\x82\xc5\xf0\xc1\x86\x34\x6d\xc7\x49\x70\xcc\xc4\xef\xf3\xd8\x50\x9b\xfc\xef\xdd\x26\x87\x68\x1b\x9b\xc9\xc5\xb0\x95\x26\xaa\x80\xe0\x91\x72\x91\xc3\xde\x1e\x68\x19\xc2\xb8\x98\x03\x8f\x9a\xbf\x25\xb4\x97\x0a\x3d\xf4\x6e\x27\x9a\xec\x8d\x2e\x7e\x8c\x0b\x4d\x87\x57\x66\xc0\x8f\xf9\xbd\x83\xc1\x31\xe7\x49\x15\x2a\xf4\x90\x95\xb3\x1a\x4d\xe6\x27\x0f\xdc\x34\xc9\xed\xc1\x24\xf7\x8b\x36\x3e\xc9\xbf\xdf\x23\x3e\xc9\x3f\xab\xc6\x27\x79\xce\x6c\x48\x37\x8d\xdb\x7b\x34\x6e\xaf\x6b\x58\xa1\x57\x06\x5f\x19\x56\x21\x50\x9b\x4d\xb9\x7b\x48\xa1\x2a\x29\xb0\x7b\x20\x99\x5d\x5a\xe2\xaa\xd0\xac\xfe\xa7\xc7\x56\x9e\x6e\xa2\x0c\xc1\x1f\x91\xd1\x60\xc1\x4e\x9c\xf6\xbf\xc7\x0b\x5e\x51\xf9\x0b\x5e\x5c\x0b\x3c\x60\x34\xd6\x16\xa6\x07\x23\x6c\x00\xa8\x43\x55\xa7\xee\x33\x15\x59\xd9\x5a\xb6\x4d\xb3\x2f\x63\x87\x2d\x3a\x0c\xdf\x49\x04\xf2\xd9\x58\x3f\x8d\xdc\x67\x7f\x77\x90\x9d\x70\xaf\xa9\x49\xd6\x12\x91\xbe\x75\xaa\x2b\xab\x52\x27\xa2\xa5\xa4\x3d\x47\xbf\xa1\xf5\xd4\xff\xd8\xc1\xa0\x31\x0c\xaf\xca\x37\xcc\x27\x18\x29\x60\x3e\x6a\x5e\xf7\x6e\x83\x7f\xad\x8a\x74\x5d\xe6\xcb\xb2\x73\xdd\x3b\xdc\x15\xd7\x96\x25\x5c\xb5\x5d\x21\xfd\xf9\x03\xec\xbf\x7a\xec\x2b\x73\x78\x75\x7e\xe9\x81\x07\xf2\x50\xa3\x6d\x2e\xc9\xb4\xa5\x7a\xbf\x2e\xfd\xf7\x7b\xfa\x68\xfd\x3e\x0f\x5f\xe5\x62\x53\x82\x37\x73\x7e\xe9\x01\xde\x2f\x3e\xe2\x13\x66\x9b\x62\x32\xbd\xe0\x3d\x53\x8e\x85\xec\x20\xdb\xea\xcb\x49\x84\x12\x10\x18\x6b\x00\x8e\xe9\xbb\x95\x26\xed\xa0\x4b\x50\xcc\x02\xea\x2f\xd6\xb8\xe9\x54\x1e\x9b\x8d\xdb\x3d\xa9\xbf\xc5\x63\x76\xc7\xfd\x7f\xa6\x7b\x11\xf6\x7b\x3d\x99\x12\x04\x8d\x0e\x25\x28\x39\xc8\x6d\x76\x92\x4c\x9a\x3b\x46\x31\xce\x77\x1b\x8e\x49\xc9\xb3\xae\x00\xaf\x24\xc4\x6e\x5d\x0c\x63\x5d\xa5\xdb\x9e\xff\x55\x63\x87\xbb\xc5\x8f\xfe\x67\x0d\x51\xf7\x2f\xd5\xac\xe7\x66\x6b\x03\x65\xe9\xa8\x46\xa6\xfa\x6d\xe7\x76\x5e\x34\x0f\xda\x0e\xff\xe4\xed\x64\x2b\x6e\x72\xbe\x98\xeb\x61\x84\x8f\x66\x88\x23\xbf\x54\xb3\x65\xe3\x59\x93\x7c\x5a\x5f\x6c\xc0\x09\x61\x28\xe1\xd7\x95\x16\x7a\x7e\x69\x6e\x05\xd6\x59\xf2\x90\x4c\x13\x8b\x5e\x09\x0d\xd1\x36\xa9\x06\xfa\x86\x50\x7f\xa7\x3d\xd7\x95\x79\x8a\x68\x03\x85\x19\xbb\xc9\xf9\x0a\x4d\xae\x6a\x09\xf2\x97\x88\x8c\x43\xbe\xa3\x5a\x4c\x76\x99\x54\x80\x09\x8d\x31\x69\x04\xee\xa0\xbf\xa1\xc6\x4a\xdb\xc1\xff\xb3\x1d\xf2\xb6\xec\x9d\x39\x9f\x26\x59\x46\xe7\x54\x89\x18\x38\x78\xaf\x67\xac\x26\xc8\x02\x26\x22\x2b\xa4\xfd\xee\xd1\x5b\x14\xd7\x6c\x24\x45\x1a\x3b\xc1\xbf\x46\x0e\xb5\x92\x38\xeb\x23\xcd\x2d\xc6\x70\x02\x07\xa8\xcc\x69\x2f\x94\xc3\xc0\x60\xc1\xae\x0d\x28\x81\x57\x69\x38\x30\x31\x76\x20\x56\x93\xfd\x34\x63\xf7\x8c\xea\xe7\x51\x25\x56\x8f\x8e\x14\x43\xe8\x01\xf9\xcb\x43\xc1\x43\xdb\xbe\x51\x42\xc1\x19\x0e\x69\xde\x5e\x6a\xdd\x4e\x1f\xe8\xd5\x78\xdd\xbb\x9d\xba\x5a\x3c\xb1\x22\x7c\x1d\x39\xf6\xe9\x83\xec\x5d\x1e\x2b\xbf\xef\x7f\xbb\x11\x5c\xaf\x29\xfd\xa4\x37\xd9\xf0\x60\x9a\x8d\xa5\x07\xb6\x2b\x62\xb1\x6e\xd9\xc1\x8b\x46\xd7\x31\x9f\x36\x53\x82\x22\x6a\x11\x97\xd9\x90\xa0\x70\xd7\xe3\x1f\x7b\xec\x56\xf5\x09\x6e\x1d\x75\x77\xf8\x94\xf7\xb4\x43\x8c\x82\x1f\xf0\x9c\xb2\x8c\xe8\x50\x6d\x82\x9b\x83\xfa\x6b\xc4\xa4\xe9\x05\x3b\x2c\xfc\xea\x16\xcd\xb8\x23\x53\x10\x65\x24\x4f\x93\x08\x2e\x7f\x74\x2f\x1d\x16\x9e\xe0\xe6\x12\xf1\xba\x6c\x37\xd9\xb5\xca\xd0\xa1\x35\x1d\x39\x74\xb1\x22\x70\x87\x7a\xd1\xdd\x21\xa4\x68\x78\x42\xdc\xa1\xfe\x6b\xcf\x89\x08\xff\x82\x17\xbc\xc9\xb3\xc2\xbf\x35\x84\xb0\xd4\x24\x43\xfa\x07\x63\x3d\x30\xb8\x2e\xee\x10\xa0\x54\x55\xdb\x0c\x0f\xc3\xfa\x88\xf4\x4c\x4a\x80\xcd\x21\x8c\xd2\x2a\x1f\x6c\x83\x32\x77\xac\xda\x2f\x63\x97\xd9\xc5\xdd\x09\xa5\xed\x37\xab\x09\x9d\x65\x3f\xe6\x99\xd0\xd4\x8b\x20\x2b\x33\xa5\x21\x5d\x74\x1f\x39\x2b\x06\x28\x89\x9d\x8c\x88\x2e\xbd\xe5\xd0\xce\x3b\xe3\xbd\x5b\xde\xe0\xaa\x2e\x60\x1b\x50\x78\xb0\xeb\x1e\x2b\x4b\x00\xff\x0d\x66\xff\xbe\xba\xf4\x13\x2c\xb1\xa1\xf0\xda\xa7\xb5\x77\x75\x78\xe7\x76\xbb\xf6\x7f\xef\x77\x10\xf3\x75\x8e\xc7\xb9\x79\x07\x5e\xfc\x97\xf7\x07\xef\xf5\x96\xed\x64\xec\x73\xe1\x5a\x2a\xf9\xfc\x86\x88\x63\x19\x51\xa8\x57\xb3\xf2\x29\xda\xc9\xc0\x7b\x66\xf1\xa1\x09\x24\x1a\x45\x34\x70\x9e\xc4\xad\x91\x5f\x6b\x33\x57\xb2\x15\xcb\x34\xdb\x08\x7b\xd4\x77\x30\x2c\x02\x4f\xf6\xd9\x0b\x61\xdc\xbf\x06\x1c\x60\x6b\x12\xe6\xc1\x11\xa1\xdf\xb1\x8f\xfd\x9c\xc7\xf6\x77\x32\x30\x4d\x7f\xc0\x0b\x7e\xd8\x3b\x17\x46\x52\x43\x4e\x0c\x7a\x70\xc8\x51\xa4\xd3\x45\x83\xf8\xd7\x29\xbd\x33\x84\xc9\x00\x48\x45\x49\x0f\x76\x6f\xbc\xae\x73\x40\xf8\xd9\x6b\x4d\x1e\xc8\x6b\xf9\xf1\xa0\xce\x83\x6b\x9d\x4c\xfd\x27\xce\x3b\x59\x80\x06\xc4\xb0\x15\x82\xf9\x5f\xdd\xec\x53\xa3\x8e\xe0\x07\xc4\xbb\x6e\xb0\x9d\x6c\x3d\x7b\x96\x8d\x45\xfd\xd8\x8a\xc1\x2e\xb8\xed\xce\xcd\xd3\x7e\xe5\x51\x3f\xa6\x45\xe3\x4c\xf2\xeb\x3c\x0b\x9a\x7d\x33\xd8\xa8\xa6\xc5\x7b\x96\x41\xda\x57\x19\xc3\x56\xbe\xfc\xe5\x97\x32\xff\x5c\x70\x67\x55\x07\xb6\x92\x34\x6a\x6f\x85\x04\xdc\x91\xf1\x09\xf5\xf2\xe4\x36\xd8\x04\x1f\xf0\xd8\xbe\xad\xad\xb0\x9d\xf9\xef\xf5\x82\x6f\xf5\x9c\x32\x29\x00\x11\xca\xe4\x50\x28\x5a\x5f\x3b\xa1\xba\x51\x4f\xc0\x67\x93\xfc\x2c\x66\x5c\xc0\x5f\x4a\xb2\xd9\xce\x72\x25\x2c\x4c\x9b\x61\xb1\xa9\x11\x36\x28\x70\x4a\x42\xda\x8c\x27\x3c\x0b\xbb\xfd\x28\x17\xb1\x04\x8b\xe7\x76\x98\x0a\xdf\x7d\x0b\xbb\x73\x14\x35\xd1\x30\x97\x8b\xff\xff\x1e\x0e\xbe\xab\x36\xfc\xbc\xf0\x6e\x65\x2e\x07\x4c\xd1\x2e\x63\xcc\xcd\x51\x53\x6e\x41\x12\x86\xd6\xee\x9c\x8f\xb4\x03\x62\x3d\x4a\xd6\x84\x95\x60\x49\xd1\x3a\x6d\x8c\x9c\x77\xcc\xc2\x9b\xa1\xc9\x6c\x6c\xf2\x85\x02\xc9\x2d\x8c\x81\xb4\xf2\x94\xfa\x47\x47\x6c\x26\x28\xc4\x54\x27\xab\xd2\x79\xa7\x36\x67\x2a\x08\x6c\xea\x85\x86\x18\x27\xa0\x2a\x23\xf9\x02\x1d\x92\x58\xc5\xd1\xa3\xcd\xeb\xde\x81\x34\x89\xe4\xb2\xec\x38\xdb\xfe\xdf\x1f\xbc\x69\x9d\xb9\x19\x7a\xf8\xc5\xb3\x73\x6e\x58\x66\xce\x47\xf6\x1a\x78\xf8\xe5\xa5\xb8\xc3\x23\x99\x45\x83\xf7\x71\x8f\xe9\x1d\xe0\x7f\x68\x3b\xee\x7c\x47\xca\x2c\xe3\x17\xc1\x37\x79\xf4\xaf\xe2\x9c\xbe\x41\xf9\x50\x50\x15\x17\x05\xd1\x8c\xa8\x55\x10\x6d\x6a\xea\x73\x2b\xd3\x1d\x64\x28\x46\xe2\x98\xc8\xa3\x26\xfb\x26\x8f\x1d\xa4\xb0\x8c\xcc\x7f\x22\x78\x31\x89\x96\x8c\x20\x0d\x2c\x69\x47\xfb\x49\x87\x23\x83\xa7\x3f\x71\xf9\x96\x76\x6f\x30\x74\xc6\x85\xea\x7c\xca\xdb\xdc\xd9\x60\xb8\xe2\xbf\xcc\x18\x0c\x47\x4a\xb7\xc2\x76\x38\x24\xe2\x2a\xc3\xf9\x9e\xbc\xc5\xf1\x69\x88\x5e\x0f\x5c\x76\x0b\x10\x9c\xae\xb4\x1e\xba\xb6\xfe\xf6\xe1\xe0\x7c\xf9\x61\xc5\x0d\x23\x1a\x14\x17\x0b\x37\x9f\xaf\xf8\xd8\x55\x98\x5e\x77\x98\x3d\xca\x6e\x05\xe2\x66\xa3\xb0\x5e\xd0\x7a\xc7\xa9\xd5\x52\xd6\x05\x12\x3c\xa3\x69\x09\xce\x4a\x3b\xf9\xc2\xae\xc1\x52\x48\x9e\x04\x85\x84\x8a\xde\xd2\x45\xaf\x95\x8b\x8e\x93\xb8\x81\xa1\x03\x70\xa8\xec\x54\x07\x9f\x40\x88\x64\x72\xa7\xa3\x77\x18\x6f\x42\x91\x6c\xe5\x49\x3a\xe9\xb6\xe2\x23\x35\xf6\x82\x7e\x6c\xcc\x2b\xa6\xaf\x3f\x6a\xcc\x57\x6f\xa9\x95\x9b\x64\xbd\xbf\x73\x9f\xb9\x0d\x6c\x57\x99\xad\x52\xa0\x7d\xe7\xc8\x43\xed\x5c\xd0\xa4\xdd\x39\xc0\x0a\xdf\x94\x7c\x66\x7a\xfa\x45\x16\xb4\x44\x4b\xf4\x44\x2b\xcc\x07\xe0\x0e\xc5\xfc\x87\x82\xa7\xc8\xad\x43\xb3\x9a\x6b\xd5\x60\x00\xe6\x4e\x5d\x50\x92\x5a\xaf\x63\x73\xa0\x3e\xdc\xc9\x32\xa6\x8c\x87\x92\x29\xf2\x4d\x1e\xbb\x9d\xc4\xae\x19\xbf\x81\x1e\xbe\xf6\x5e\x27\x14\xda\x62\x58\xc5\xb5\x49\x23\x97\xdd\x9e\x3a\x48\x11\xb2\xc4\x69\xce\x37\x7b\xec\xf9\xc3\x13\xda\xd7\x0d\xba\x52\x6e\x50\x69\x32\x27\x70\x31\x03\x32\x86\x36\xc9\x81\x19\x51\xb4\x07\xc4\x5a\x3c\xb9\xfb\x55\xfe\x3b\xea\x9e\x9a\x44\x11\x20\x8a\xcd\x83\x2b\xf7\x13\xe6\xde\xf7\x01\x6f\x1e\x49\x98\x3a\x7c\x43\x64\x1b\xdc\xbc\x58\xa4\x55\x2f\x38\x2b\xc9\xfe\xbb\x3a\x61\x84\x40\x68\xb5\x63\x13\x4a\xe3\x62\x33\x09\xdb\x42\xc9\xf2\xae\x6c\x6d\x88\x38\xcc\xba\xe8\x75\x0d\xf3\x22\xe7\xc3\x4a\xb4\x81\xc8\x70\x63\x95\x95\x5b\x4a\x5d\xa1\x81\x5c\x91\xa5\x0e\xfe\x85\x6b\x87\xf8\xbc\x17\x5c\x5c\x76\x51\x22\x49\xdf\xb1\x56\x19\x88\xa2\x02\xf9\x56\x58\xa3\x77\x24\x73\xd1\x0b\x1c\x09\x7e\x17\x3b\xc9\x8e\x8f\xbe\x84\x0f\x09\x49\x27\xd3\xf6\x19\x4f\x8e\xbd\x52\x69\xfb\x79\x89\xb6\xfd\x9c\x50\xd3\x35\xd2\xb2\xe3\x6c\x6b\x2b\x0d\xd4\x15\x4e\x5e\xe5\xc5\x7c\x41\xc8\x6e\x12\x9f\x25\xdd\xc8\x7f\xbb\x17\xcc\xbb\x8f\xb6\x4b\x7e\x35\xa0\xb1\xf8\x89\x51\xb1\x9a\xd7\xbd\xf1\xa5\x24\xcd\x9d\x53\x60\x8e\xdd\xc7\xe0\xa9\x7f\x4a\xaf\xd9\x40\xfd\x69\xed\x1e\x50\x06\x00\xda\xcc\x94\xe4\xf4\xe1\x17\x6a\x0e\xaa\x85\xee\x03\xea\x35\xe7\xd4\x6a\x5d\x21\xc9\xec\xbf\xbd\x16\xdc\x57\xf1\x9c\x44\x37\xf2\x98\x19\xcd\x5d\x09\x48\x58\xeb\x8e\x36\x7e\xdd\x3b\x04\x4f\x97\x44\xbe\xe1\xe2\x90\x7b\x6c\xc3\xb9\x08\x3c\x14\x5c\x2c\x61\x7e\x90\xd2\xaf\xfe\x79\x4e\x97\xa1\x04\xb7\xba\x07\xe7\x12\x50\xdc\x94\xdc\x52\x4b\xb6\xee\x38\x1b\x82\xcd\x99\xa0\x84\x36\x52\xb4\xc2\x3f\x17\x9c\x5e\xa2\x70\xc0\xdc\xa0\x44\x03\xd6\x72\x04\x91\xa7\x65\x6e\x46\x82\x41\xc9\xca\x68\xc9\xbf\xbf\xdf\xc9\xe0\xd3\x03\xa9\xa3\x3f\x5f\xd6\x4f\x72\x01\x3e\xb5\x0f\xed\x0f\xee\x1f\x7a\xea\x5c\x74\xb4\x10\xdd\x40\xa7\x39\xa8\xd3\x79\xc2\x65\x8c\xf7\x7a\xb5\xf3\xe1\x43\x57\x25\xf8\xbd\x7d\xec\xbf\x79\x6c\x5c\x7d\xe4\xff\xba\x17\xbc\xc1\x83\xcf\x5d\x43\x63\x55\xc9\x86\x20\x40\x89\x95\xb6\x85\x03\x7e\x83\x5c\xf7\xe8\x12\x9b\xd2\xdf\x37\x5e\xad\x9a\x98\x4d\xbd\x67\xfb\xa0\xd9\x21\xdd\xba\x69\x1a\xf0\xb2\xbe\x88\xf3\x30\x1f\xd8\xb9\xac\x9f\xaa\xb1\x5b\x01\xbe\xc7\xac\xca\x5f\xac\xb1\xe6\x8e\x78\x28\x2b\xf6\x27\xc1\x77\xd5\x9c\x22\xd0\xf3\x94\x25\x43\xc1\x26\x9d\x30\x82\x68\xcf\x28\xbc\x4a\xa0\x41\x9a\x72\x41\x69\xc6\xa8\xbb\xc0\xc8\xe9\x24\xbe\x54\xb4\xae\xa2\x04\x11\x1c\xba\x0f\xe7\xb8\xbc\xd6\x4b\x31\x35\x1a\x7d\x24\x4e\x63\x2e\x83\x71\x2a\xa9\xce\x01\x30\x18\x93\xfa\x82\x79\x0e\xf0\xa0\x8a\x7b\x5b\x82\xad\xa8\x93\x69\x03\x9b\x38\x77\x69\x81\xbb\x1d\x9c\x08\x3b\xd6\x0a\x0e\x91\xe2\x64\xb2\x6e\xac\x24\x3a\x58\x94\x7d\xbf\xc7\xf6\x63\x29\xfe\x5b\xbd\xe0\xda\xdc\x88\x01\xb9\xb1\x41\x80\xbb\x47\x09\xb4\x5f\xad\x49\x1c\x21\x1d\x43\x28\xa2\xa8\x92\x9a\xa8\x64\x94\xf9\xd3\xdb\x9d\x70\xb9\x76\x98\xb5\x92\x4d\xb5\x7c\x36\x67\x9a\x46\xe4\x7e\xe2\xf6\xe0\x9c\x11\xb6\x0e\x40\x25\x09\xd7\x28\x59\x0f\x5b\x22\xe2\x01\x45\x34\x07\x45\x10\x18\x62\x3e\x52\x1c\xb2\x12\x58\x86\xce\xc5\x75\x5e\xdf\xc6\xfe\xb8\xc6\x8a\x1f\xfd\xcf\xd4\x82\x1f\xa8\x15\xd4\x2f\xda\x36\x61\xa4\xae\xc1\x4c\x81\x96\xe8\x9f\x49\x1f\x48\xad\x90\x5b\xd9\x1e\x46\xef\x6e\x25\x69\x0a\x74\x13\xf0\x50\x77\x6d\x25\x0a\x5b\x52\xd3\xcd\x40\x24\x2e\x61\xc0\xcf\x83\x0b\x0f\x6e\xee\x6a\x92\x88\x68\xc1\x42\x23\x55\xd7\x61\x90\xcc\xa6\xbd\x24\xe7\xa0\x81\xd7\x74\xf8\x68\x98\x02\x46\xab\xd2\x5f\x01\xb8\x3f\x34\x0c\x26\x50\xae\xb6\x5b\x39\xae\x51\x2a\x92\x34\x58\xc4\x16\x01\xd7\xf4\xcc\xf4\xf4\x36\x13\xbb\x03\x84\x46\x26\x73\xc6\xde\xea\xea\x32\xaf\xf7\xd8\x5d\x23\x77\x7e\xe5\xc2\x28\x20\x79\x82\xc5\xd6\x10\x3c\xcf\x28\x04\xa2\x6a\x78\x24\x33\xb1\xec\x67\xc6\x98\x5f\x30\x24\xac\x12\x5a\xab\xff\xc3\x63\xc1\x37\x8d\x0d\x3f\xb7\xd2\xb5\xf4\x13\xbb\x5a\x1d\x31\x0e\x06\x2f\xbc\x6e\xaa\x23\xa7\x8c\x64\x5c\x94\x6b\x99\xe0\x2c\x94\x04\x93\x4f\x63\x95\x81\xa9\xc8\xf8\xfb\x44\x9c\xf0\x2c\x49\x62\x1d\x37\x60\x01\x7e\x6d\xce\x34\x8f\x1e\x9f\x6c\x72\xfe\xf2\x8d\x30\x72\xd0\x9b\x5b\x22\x86\x5b\x3e\x89\x23\x3b\x44\x58\x1d\xc2\x88\xf2\x63\x81\xca\x6f\x42\xb5\x75\x93\x1b\x26\x72\x75\x2d\xc0\xc3\x0c\x9d\x0a\x79\x62\x43\x3c\x64\x61\x44\x81\xf7\xc0\xad\xd0\x6e\xf2\xd5\xaa\x21\xa2\xc0\x88\x4e\xd2\x8f\x0d\x4e\xd1\xe3\xb0\xf4\xe2\x36\xe0\xef\x42\x76\x27\x34\x39\xd3\xa0\xd0\xcd\xf7\x94\xd6\x9b\x7d\xa8\x7c\x9b\xc7\xf6\x6d\x84\x71\x0e\x4b\x6a\x34\xb8\x56\xe5\x92\x3a\xaf\xbe\x0b\x2e\xc1\xe7\x23\x16\x52\x41\xce\x01\x42\x7d\x23\xd9\x02\x73\x8a\x96\x4f\x05\xbc\x04\x7a\xde\x95\x1c\xfe\x64\x8d\x1d\xd4\x88\xfd\xfe\x47\x6a\xc1\x4f\xd6\x0c\x7e\x7f\x95\x60\x31\x33\x44\xb9\x58\xda\x63\xd6\x32\x72\x00\xc0\x28\xf0\x03\x18\x7e\x84\xf0\x5b\xef\x87\xd9\x86\xf5\x03\x18\xf6\x50\x98\xc3\xf5\x14\x03\xbe\xc3\x98\x2f\x5c\x5a\x41\x5b\xd2\x64\x93\x5f\xd4\xdc\x05\xc5\x77\x18\x03\xa2\x73\xfa\x21\x0f\xb6\xe0\x1b\x70\xba\x17\xb6\x21\x2f\xab\xd3\x8f\xd7\xe1\x60\xc3\x1a\x0a\x16\x7b\x0d\x5b\x85\x75\x4e\x16\xce\x1e\x08\x48\x69\x89\x4c\x16\xd8\xcc\xaa\x51\x17\xc4\x9a\x8c\xf8\xc4\xf2\xb9\x79\x3e\x33\x73\xf4\xd8\x24\x02\x33\x0c\x73\x59\xfc\x96\xc7\x0e\xea\xa5\xe1\xff\x27\x2f\xf8\x59\xcf\x2c\x94\x12\x68\xbe\x9d\x07\x7c\x29\x69\x63\x4f\x0c\x6c\x44\x69\xd4\x4b\xfc\x1c\x45\x0a\x7f\x31\x36\x51\xd2\x42\x70\x4e\x01\xc5\x39\xd3\xa5\x11\xa0\x29\x74\x05\x96\x07\xc4\x57\xdb\x02\xfe\x92\x59\xd1\x56\x00\x8c\xd3\xb9\x6f\xf7\xd8\xa1\xdc\x44\x98\xbc\xce\x63\xd3\x3b\x2a\x44\xe5\x70\x92\x4b\xe6\x7b\xb4\x1e\x3b\xc1\x25\xc2\x46\x45\xd0\xc7\xbc\x52\x01\x9c\xa1\xb3\x47\x87\xbd\x84\x8d\xab\x2d\xe9\x9f\x09\x4e\xc0\xd6\xac\xc0\x98\x79\x48\x3d\x77\x3e\x43\x00\x43\x35\xf9\x4e\xf7\xde\x51\x63\x27\x77\x20\x68\x3a\x17\x25\x5b\x0b\xc5\x92\x96\xe9\x45\x99\x6f\x24\x6d\xff\xb3\x5e\x70\x76\xc4\x6f\x16\xcd\x1b\x39\x9b\xd5\x43\xb8\xee\xaa\x1a\xec\x1d\x02\x11\x22\xe3\xea\x28\x72\x54\x80\xd7\x7b\x80\xf9\x09\x47\xd4\xe3\x41\xf7\x8a\xfa\xc7\x15\x63\x4a\x52\xc7\xb1\x52\x99\x86\xca\xd2\x55\x01\x3b\x99\x71\x58\xe2\x91\xac\x14\x81\xe0\xcc\xe0\x81\x4c\xa6\x01\x2c\xf4\xe0\xcc\xc0\xe0\x77\x06\x4d\xbe\x5c\x05\x60\xff\xa7\x35\xf6\xb2\xa7\x8d\xfd\x3d\x0f\x01\xf1\xfa\x3e\xf2\xa0\xd9\x3d\xfe\xf5\x5a\x70\x71\xd4\x8f\x2e\xaf\x64\xb1\xe5\xa8\x6b\x78\xa7\x70\x3f\x2e\x01\x1b\x7e\xd8\x63\x1f\xf4\xd8\xed\x49\x4f\xc6\xea\xce\x78\x0c\x41\xc3\xfd\x77\x7b\xec\xc1\x51\x6b\x77\x6f\xa0\xe6\xc1\x4b\x4b\x75\xe9\x89\xba\x8c\x8f\xf9\xe6\x31\x73\xc3\x44\xf0\x76\xd5\x07\xab\x6b\x20\x76\xd2\x7e\x0c\xdc\x18\xff\xf9\x90\x73\xf3\xd7\xa6\x8d\xc2\x08\x03\x11\xed\xef\x3d\x14\x94\x1e\x55\x85\xb4\x17\x6f\x8c\x08\x66\xff\xa6\x9b\x5e\xb2\x3d\x7b\xc9\xfe\x9d\x21\x75\xfe\x71\x2f\x48\x34\xa9\xb3\x3d\xf4\x37\x7a\xdd\xdd\x4a\xd2\xab\x51\x22\xda\xd9\x54\x61\x1e\xca\xa6\xc8\x62\xae\x1a\x53\x3c\xb6\xb5\xde\x29\xd6\x60\xff\x74\x47\x1b\x59\xd1\xb0\x9b\xfe\xbd\x9b\xf4\xce\x36\xbd\xf3\xd7\xee\xec\xf1\x3a\xe1\x1f\x2b\x90\xb9\x7b\xbd\xcc\x38\xb7\x5c\x59\x54\x8e\x8c\xff\xc2\x61\xe7\x66\xbd\xa6\xee\xe5\x45\xbc\x43\x9a\xc4\x2f\x49\xd6\xfc\xff\x78\x38\x98\xa5\x7f\x97\x15\x27\x87\x21\x8b\x30\x57\xf1\xb6\xdd\x4a\x93\x98\xbf\x2a\x59\x73\x8f\x80\x77\xb2\x9b\x6b\x7b\x0f\x6b\xfb\x57\xed\xb5\xfd\x31\x6f\xaf\xde\xeb\x27\xbd\x6d\xdc\xd7\xcf\x59\xae\xce\x5f\x69\xb0\xfd\xff\xe5\x6d\x43\xee\x56\xb9\x34\x01\xed\xe5\x43\x5e\x25\xdc\x8b\x36\x7b\xae\xc9\x0d\xb1\x19\x62\xa4\x8b\x30\xcb\xb2\x4e\x58\xf1\x7a\x7d\x11\x09\xd6\xb3\x3f\xb3\xaa\xa7\x0d\x11\xb7\x1b\x68\x59\x60\xbf\x52\xd0\x7b\x7c\xcc\xdb\xc6\x93\x52\xdd\x7f\x84\x79\x7e\x93\x37\x5f\x11\xfa\x6c\x76\xe0\x73\xdd\xa5\x9b\x8a\xcb\xde\x14\x97\xa7\xbc\x97\xef\x2c\xf0\x8f\xfb\x47\x8d\xc0\x87\xb5\x51\x84\x33\xe0\xda\xa8\x8c\x61\xf8\x8d\x83\x6c\x72\x38\xc0\xa2\x22\xb2\x0d\x74\xd9\xf7\x1c\x0c\x5e\x5c\xfd\x53\x65\x9a\xe6\xd0\x9b\x59\xa5\x6a\xfb\xa9\xfd\x37\x57\xc8\x5e\x55\xdb\xbe\xd6\x6c\xa3\xe0\xab\x17\x87\x59\xff\x2b\xa6\xc2\xd6\x47\x4f\xb1\x13\xdb\x98\xbc\x46\x2f\x8a\x9b\x67\xf7\x1e\xce\xee\x8e\x75\x74\x3f\xb4\x37\xad\x74\xbb\xa8\xb3\xa7\xbc\xfe\xce\xc2\x63\xd9\x5f\xda\x53\x7c\x54\x95\x2a\xf9\x23\xfb\xd9\x63\x7b\x4b\xb2\x74\x8d\x07\x0b\x66\x78\x8c\x05\xdf\xff\x0f\xfb\x82\x57\xec\xf8\x56\x61\x91\x6d\xcb\x5c\x84\x51\x11\xb8\xa1\x8d\xfa\x05\x62\xb9\xe1\xa2\x4f\xda\xda\xdc\x73\xdd\xa3\xf3\xd8\x11\x5a\xbf\x38\xce\x5e\x4d\x66\x9f\x30\x78\x04\x0c\x3d\x25\xa3\x4f\x6e\x43\xa1\x37\xf9\x2a\xd8\x76\x88\x90\x86\x9f\xcd\x72\xb1\x16\x85\xd9\x86\x6c\xd7\x39\x18\x77\xe6\x5a\xea\x4a\x49\xb9\x6b\xab\x14\x7b\x63\x62\xe4\x69\xcd\xbc\xdb\x63\x7e\x24\xb2\x7c\x35\x15\x71\x06\x05\x43\x02\xcf\xb7\xee\x21\x81\x67\x65\xb8\xbc\x52\xf6\x4e\x31\x3a\xb9\x79\x4d\x63\xde\x24\xb1\x01\x9f\xcf\x13\x2e\x62\x30\x19\x37\x99\x64\x07\xba\x32\xcb\xc4\xba\xf4\x1f\x0a\x2e\xd2\x3f\x51\x34\x6c\xf4\xbb\x22\x6e\xa4\x52\xb4\xc1\x55\x60\x7e\xc3\xe4\x15\x25\x22\xf4\x2c\xa1\xf3\x05\xdb\x62\x2a\x76\x86\xe3\x55\x6c\x3f\x32\x17\xf8\x57\x82\x15\x22\x37\x80\x4a\xfa\x71\xf8\x6a\x25\xae\x93\x58\x36\xb6\x92\xb4\x5d\x2f\xb6\xbb\x21\x41\xd0\x6b\x40\xf7\xee\x48\xb6\x6d\x5d\x0f\x19\xb5\x6c\x29\x98\xcf\x9c\x20\xbe\x11\xe8\xfb\x20\x79\x0a\xf8\x7b\xc0\xe0\xaf\xf3\x07\x62\xa0\x66\x70\xca\xfe\xc3\x71\x36\xb3\x43\xa6\x8a\xd1\xd2\x4d\xbe\x8a\xff\xbe\xf1\xe0\x5b\xbd\xe1\xe7\x25\x48\x4b\xbd\xc6\x0d\x35\xbe\xd0\x89\x8b\x94\x2c\x87\xbe\xce\xab\x43\xc6\xdd\x89\x8e\xcd\x4b\xba\x11\xe6\x59\xa3\x27\xd3\x46\x06\xe1\x55\x80\xaa\x13\x17\x9c\xc7\xf0\xc9\x64\xf3\xba\xb7\x1f\x0b\xbf\xee\x1d\xa0\x8a\x31\x89\x0e\xb2\xf2\xda\xd8\x58\x67\x1f\xfd\x8f\x1a\xfb\x7a\x8f\xe9\x97\xfd\xc1\xf6\x68\x63\x23\x12\x78\x1e\x54\x7d\x23\xdd\xf7\x94\xb5\xa9\x87\xd9\x4d\x6c\xba\x6c\x1d\x13\x83\x2d\x66\x8f\xb2\x72\x43\xfd\x97\xb0\xf3\x37\xd4\x9a\x6d\x72\x35\xd9\x93\x1e\xa3\xb1\xf1\x07\xa3\xef\x69\xdb\x74\x72\xd1\xe4\x44\x04\x77\xe9\xdc\x55\xfd\x88\x24\x0f\xe6\x66\xd0\x8f\x6b\x03\xb4\xb4\x2b\x79\xa2\x03\x2b\xd9\xf7\xec\x67\xff\xa8\xc2\x13\x70\x36\xde\x7c\x50\xa4\xfe\x5f\xed\x0b\xe6\xf0\x9f\x8e\xc3\x3c\xe6\x32\xde\x0c\xd3\x24\xee\xe2\x10\xa6\x21\x46\xe2\xe1\x0b\x88\xc5\x68\x60\xa6\x9b\xc4\x7e\xec\xcc\xf2\x0f\xed\x63\x97\x88\x18\xeb\x5c\x70\xfa\x92\xe5\x00\xa8\x2a\xd9\xce\xee\x99\x7f\x6c\x71\xe1\xec\xa5\xd5\xc5\x73\x8b\x67\x97\x9d\x3d\xf3\xa1\x31\xb6\x0f\x66\xd3\x7f\xdf\x58\xf0\xce\xb1\x07\x75\xab\xac\xd8\xe3\x3b\x26\x1e\x9c\x5b\x7e\xec\xd2\xdc\xc5\xb3\x93\xc8\xd9\x71\xad\x27\x20\xb1\xbe\xe0\x99\xed\xa5\x72\x33\x4c\xfa\x05\x26\x57\x55\x7b\x1c\xc7\x38\x62\x69\x6b\x6f\x66\x01\x55\x56\xf1\x19\xc4\x3c\x88\x62\xc0\x46\x85\x5b\x17\x7e\x16\xaa\x27\x8c\x7b\xfd\x5c\x2b\x51\x26\xbd\x3c\xd6\x19\x8d\xe0\x35\xb0\x3b\x97\x0d\xe2\x5c\x5c\x33\x9e\xa4\xac\x25\x7a\x05\x38\x76\x3b\xe9\xab\xca\xef\xb8\xa3\xce\x43\x39\xcb\xef\xb0\x3e\x6c\xf2\xb3\xf4\xae\x35\x6a\x98\xc8\x21\x37\x31\x32\x55\x8f\x59\x9d\xa7\x72\x5d\xa4\xed\x08\xb6\x7b\xc7\x61\x80\x34\x1d\x24\xd7\x0d\xa6\x1d\x36\x9d\xa4\xa5\xc0\x8d\xbe\x7a\xb3\xc7\x0e\xc1\xec\x9d\x4b\x93\xae\xff\xe4\x76\xc1\xf0\xee\x1a\xc5\x44\xb7\x60\x79\xa5\xc0\x4b\x18\xb5\x8c\x8e\x64\xb8\xdd\x1d\x0d\x30\x93\x6d\x1e\x76\x8a\xa4\x6d\xf5\x1c\x10\xfd\x9b\xec\xf7\x5d\x10\x26\x5d\xef\xf9\xd5\xd5\xa5\xfb\x65\x3e\x07\xf7\x1a\xff\x67\xf7\x05\x2f\x76\x9e\x58\x39\xc7\x05\x99\xa8\xc1\x2b\x53\xaf\xf2\xfb\x65\x6e\x34\x52\xb5\x3d\x7a\xe5\x10\xbe\x3f\x1a\x67\xa7\x08\xb6\x6e\x2a\x08\x20\x12\x4d\x9d\xa6\xc0\x33\xa6\xc1\x58\xa1\x24\xd2\x9b\xec\x91\xfc\xb8\xc7\xa0\x40\xff\x67\x76\x6d\xfe\xe9\xe7\x61\xd4\x0c\xe3\x3c\xcb\xd3\xe6\x62\x9c\x6b\x2a\xd7\xe0\x09\xdc\x98\x69\x29\x72\x90\xf8\x67\x4b\xed\xb1\x30\xd9\x89\x3b\x40\x07\x12\xd1\x22\x4e\xd5\x62\xe5\x33\xea\xcb\x93\x27\x4e\x1c\x3b\xd1\x04\x3d\xc7\xbc\xa5\x4e\x8f\xb9\x4b\x73\x8f\xad\x3c\x38\x0f\x8b\xb1\xc9\x96\xd9\x7e\xb8\x84\x49\xff\x7c\x70\x37\xf8\x67\xa4\xed\x86\x69\x25\x71\xac\x2e\x97\x2e\x9d\xbd\xbb\xca\xd4\x20\x39\xa3\xf3\x04\x1b\x57\x6f\xf9\xfd\x60\xe3\x7c\x92\x21\x1d\x2b\x25\x11\xc7\x08\xb9\xee\x86\x09\x12\x0a\x04\x5f\x5c\x6a\xf2\x57\x24\x7d\x20\x67\x10\x6b\xd1\x80\x6f\x09\x0c\xed\xce\x64\xce\x03\x55\x54\xa0\xfa\xa9\xae\x0b\xe7\xa5\x68\x03\x5a\x1c\x05\x19\x94\x96\xf9\x61\xeb\x1d\xff\x5f\x78\xc1\x3c\xea\xab\x7c\x83\x3e\xa3\x32\xf5\xa0\x69\x00\x42\x98\x6e\x83\x1a\xd2\x83\x88\x6e\xfd\x4d\x73\xf7\xbe\x04\x7b\x11\x63\x23\xd8\xf7\x1d\x60\xcd\x8a\x37\x96\xd4\xb1\x95\xe5\x32\xce\x31\x35\x70\x3e\x12\x61\x97\x34\x8d\xff\xbe\x3f\xb8\xbc\xcd\xef\x5a\x0f\xaa\xca\xb7\xef\x99\xcf\x74\x9a\x5f\x4b\x7d\xe8\x5a\x81\xdf\xb8\x9f\xfd\xaa\xc7\x0e\xe3\x02\xbb\x98\xb4\x65\xe6\xff\xbc\x17\xbc\xdb\x9b\x2b\x1e\xb8\xc7\x39\x31\x7b\xd1\x8a\xec\x26\x9a\xe2\x91\xaa\x58\x13\xc0\xa0\x0b\x8f\x96\x1e\x9c\xe7\x1b\xe2\xc6\x5d\x3b\x84\x2b\x33\x55\x74\xa0\x41\x99\xae\x2f\xc4\x6a\x1b\x50\x6d\x63\x66\x9b\x38\xb5\xb7\x79\xec\xa0\x8e\xfb\xf7\xbf\xd1\x0b\x4e\x97\xa2\xae\xa9\x1b\x0e\x37\xbf\x7a\x0e\x3c\xdf\xd1\x00\xae\xd0\x98\xb1\xfb\xcc\x06\x50\x7e\xbc\xe6\xc4\x50\xfd\x54\x2d\x78\xb3\xb1\x18\xce\xdb\x77\xa1\x51\xb3\xa7\x0e\x36\xab\x91\xc3\xaf\x85\x99\x61\x92\xcc\xc0\x38\x92\xeb\x58\xa4\xf9\x21\x76\x28\x80\x95\x48\xf8\x91\x65\x78\x75\x25\x17\x69\x2e\xdb\x47\x9c\x45\x3e\xcf\xe6\xd8\x7d\x3b\x2e\xf2\xca\x25\xfa\xec\xc6\x97\x2f\xb3\x7d\xbd\x0d\x91\x49\x7f\x31\xb8\x67\x69\x03\xaf\x17\xae\x43\x84\x86\x15\xde\x52\x43\x5a\xd9\x48\x47\x68\x7c\xf6\x40\x65\x34\xf6\xcb\xfa\xc9\xda\x20\x97\x4e\xbe\xf7\xbf\x3b\x10\x7c\x83\x9b\xef\x4d\x6f\x61\x9a\x34\xe1\x5b\x8b\x4c\x47\xf9\x87\x1d\x09\xd7\x3a\xdc\x9a\x49\xbb\x69\xde\xd7\x59\xdc\xc4\xec\xb1\x6d\x32\x77\x92\x56\xe5\x72\x5f\xf7\x0e\x12\x73\xc7\xe0\xba\xb7\x1f\xcb\x73\x76\xf9\x37\xef\x67\x2f\x63\xe3\xfd\x4c\xa6\x6a\xb4\x1e\xc8\x10\xcb\xa0\x2b\x7a\x7a\xd1\xd0\x76\xce\x13\x47\xa6\x67\x32\x0d\x37\x5b\x52\xb4\x10\x54\x4f\x7d\x6f\x8f\x56\x9b\x51\x5d\x10\x2d\x6e\x56\x9f\xb1\x41\x51\x8c\x4a\x91\x7e\x1b\x73\x11\x61\xfa\x08\x25\xca\x94\xc6\x40\x2b\xce\xce\x9c\xdc\xaf\x69\x24\xef\x0d\x66\x90\x35\x72\x87\xa6\x13\x4b\x2a\x7c\x64\x17\x54\x4e\xf1\xde\x36\x71\xbb\xd4\x30\x4c\x41\xd7\x99\xf9\xa0\xde\xa9\xa2\x1a\x90\x0b\x68\x51\x88\x37\x87\xd3\xc5\xdd\x14\xef\xdf\x85\x46\xe0\x5c\xf9\xff\xc5\x0b\x7e\xc1\x5b\xa6\xbf\x2a\x03\x65\x93\xb4\x08\xce\xd2\x4d\x32\x1f\x90\x06\x9c\x59\xb1\xc5\xc2\x1a\x7e\x91\xc1\x31\x3d\x0b\xab\xa9\x27\xc2\x94\x4f\x74\x8b\xd8\x31\x64\x46\x82\xbc\x2a\xc2\xe3\xa4\x7e\xb5\x92\x6e\x57\x64\x93\x14\x54\x26\x20\xb3\x80\x36\x94\xfa\x0a\x84\x26\x35\x00\x42\x34\x70\xf5\xda\x03\xfd\xbd\x1e\xdb\x9f\xcb\x58\xc4\xb9\xff\x66\x2f\x78\xd2\x5b\x85\x7f\xab\x05\xad\x4f\x06\xbc\xfd\x95\xc6\x98\xce\x61\x8d\x50\xfc\x40\xa6\x5b\xd4\x1e\xc4\xa2\x4b\x80\xa0\xc0\x46\x47\x56\xe8\xd2\x06\xaa\x17\xaa\xa5\x05\xda\xd4\x03\xd2\x07\xbb\x79\x7f\x74\x1f\x3b\xff\x4c\x85\xb5\xf8\xef\xb8\x2f\x78\xb8\xcc\xba\x1f\x6a\x2a\xfe\x06\x85\xba\x14\x70\xbc\xae\x7b\x6c\x21\x15\x9d\x9c\x1f\xe7\x13\xea\x54\x9c\x9d\x9a\x7a\x55\x96\xc4\x0d\xb4\x86\x37\x93\x74\x7d\x6a\xd2\x3d\xab\xdf\x77\x2f\xbb\x83\xdd\xda\x0d\xe3\x25\xe4\xdb\x0b\x65\xe6\xbf\x80\xf2\x69\x9c\xa4\x92\x1e\xdb\x27\xe2\xc1\xe5\x8e\xbf\x6e\x4b\xf2\x87\xd8\xd7\x3e\x5b\xd1\x3d\xdb\x42\xa2\x7d\x2d\x3b\x40\xb6\x0c\xff\x22\x7b\xe9\x33\xd8\x00\xb6\xa1\x4d\xef\x8f\xb1\x47\x9f\x9d\x8e\x5d\x4e\xe7\xd4\xe0\xb1\xaf\x62\x07\xbb\xe2\x1a\x98\xf7\xab\x87\x9c\xb3\x43\x5d\x71\xed\x82\x8c\xd7\xf3\x8d\xea\x37\x9e\x60\xcf\xef\x89\x3c\x97\xa9\x3d\x7d\x1b\xef\x79\x36\xa7\xc5\x56\x3c\x62\x76\x8b\x2c\xf0\xf1\x32\xff\x95\xec\x91\x67\xa8\xd2\x4a\xd8\x3d\x58\xa9\xe2\xda\x4e\x2b\x55\x8d\x6b\x18\x6f\x33\xae\x5f\xc9\x0e\x10\x05\xa2\xff\x02\x7f\x3f\x5e\xa8\xa1\x5b\x44\xf7\xf9\x4f\x18\xd3\x42\xed\x72\xa7\xfa\x95\x2f\x65\x07\x68\xe0\xdd\x75\xf9\x02\x36\x7e\x47\x2a\x3b\xee\xc3\x36\x1b\x97\x71\xbf\xeb\x3f\x62\xef\x9c\xcb\xec\x19\x5e\xb8\x5f\xad\x0e\x01\x0c\x25\xf4\xbf\x6c\x1b\x2d\x56\xf5\x5e\x5c\x1b\xdd\x7b\xb5\xea\xc2\x78\xbb\x55\xf7\x02\xb2\x94\x3b\xc5\x7e\xc3\x58\x89\x58\x33\x8c\xf3\x46\x92\x36\xf0\x67\xff\xf3\xb5\xe0\x37\x6b\xa3\x7f\x77\x22\x37\x35\xb2\xb3\x11\xbd\x9a\x9d\x35\xe6\xd4\x04\x0e\x39\x33\xf8\x29\xa5\xc1\x53\xc6\x2f\x51\x93\x12\xad\x9f\x36\xe4\x3b\x04\xab\xea\x99\xc8\x78\x6b\x23\xd4\xa9\x6c\x83\xcb\x10\x22\x0b\x67\x6e\x9e\xa3\x49\xa1\x90\xaf\x95\x18\xe8\x34\xfb\xd9\x2c\x63\x33\x93\x58\xc4\x2c\xe3\x9c\x23\x7b\xe8\x2c\x37\x7b\xb8\x78\x44\x03\x75\x74\x52\x35\xc7\xbc\x5e\x7c\x5a\xf9\xf1\xd0\xe7\xf0\xa4\xd9\x6c\xf2\xc7\x65\x9a\xc0\x59\x9e\xa4\xd2\x51\x07\x7e\x67\xff\xc8\xac\x8b\x8f\xee\x0f\x3e\xb0\xbf\xfa\x37\x0e\x46\x15\x4d\x49\x02\x4b\x07\xd4\x8d\x7e\x0a\x63\x6f\xc8\xae\x31\x71\x0d\x43\xf8\x29\xf0\xd9\x2c\x46\xb4\x06\x68\xcc\xa1\x3e\x19\x4d\x22\xb0\x22\x69\x57\x2b\xa4\x15\x1f\x2b\xa7\x41\xe1\x30\x5e\x11\x79\xd2\x0d\x5b\x57\x66\x49\xbd\x45\x47\x74\x4e\x7a\x9d\xb0\x74\x18\x09\x97\x20\xa4\x2d\x57\x4f\x5b\x22\x12\x29\x31\xd8\xce\x41\x21\x54\xad\xbe\x95\xa8\x0f\x52\x09\x20\x0b\xbd\x48\xb4\x1c\x02\x41\xb4\xc1\xd9\x1d\xc1\x82\xec\xc8\x7b\x30\x90\x0f\x8c\x37\x08\xda\x36\x81\x38\xd5\x75\xaa\xbe\xae\xa6\x65\xb2\xa9\x26\xf8\x4a\x26\xf3\x2b\x34\xa9\x2b\x92\xe0\xfb\xb1\x41\x45\x9e\x95\x52\xcc\x61\x34\x8c\x06\x85\x48\xac\x26\x64\x1c\x82\xee\xc9\xe6\x75\x56\x40\x08\x00\xe7\xb4\x2b\x8c\xdd\xc5\x54\x6e\xdc\xe3\x58\x80\x33\xcb\x5d\xd1\xc3\x49\xd6\x23\x0c\x1b\x88\xba\x89\x73\x3d\xfc\x51\xb1\x34\xf4\x57\x4d\x76\x6c\x92\x5f\xe9\x8a\x9e\xee\xdb\xea\x86\xcc\x74\xc7\xb0\x8b\x57\x81\x12\x93\x4c\xac\xb0\x91\x65\x98\x6a\x40\xfa\x0c\xfb\x2b\x20\x21\x3d\x8c\xdb\xf2\x1a\xbf\x2a\x07\x58\x94\x8e\xb7\x27\x23\x38\x28\x5a\xdd\x26\xbf\x9c\xb6\x91\x9c\x08\xf4\x58\x48\xe6\xed\xf7\x20\x2a\x39\x5d\x97\x68\x3a\x55\x7a\x7b\x2e\xd6\x69\xce\xaa\x56\x20\x79\xce\xa1\x8b\xa6\x29\x6a\x4b\xc3\x6c\x62\x4c\x01\xb3\x95\x6c\xec\x2f\x26\xa4\xab\xd1\x71\xe1\xdd\xb7\x94\x62\x62\xc4\xf6\x73\x78\xde\x6e\x32\xd6\xfb\x62\x9c\xf3\x5f\xc2\xf6\xe5\x61\x1e\x95\x24\xfe\x7b\xc7\xb7\xa5\x52\x7e\xd3\x78\xf0\x27\x63\xa3\x7f\xaf\x92\x37\x66\xe5\x8f\x5a\x87\x6a\xe9\x29\x25\x1c\x4f\x8b\x81\x56\xfd\xa1\x3c\x98\x6c\xa1\xb9\x2e\xd4\xda\xd2\x98\x73\xa2\xd7\x64\x0c\x36\x78\x2e\xd6\x91\xde\xad\x5a\x46\xb9\xb8\x07\x41\x75\x2b\x02\x4b\xde\x91\xad\x23\xe8\x8a\x5e\xd0\xe4\x73\x51\x96\xd4\xc9\x84\x0e\x19\x2f\xc5\x1d\xaa\x40\xfe\xcb\x31\xe6\x60\x78\x07\xc3\x6a\xb4\x32\xac\xe1\x76\x04\x67\x14\x8a\x99\x7e\x2a\x21\xc5\x2b\x96\x98\xbb\x12\x66\x45\xaa\xc1\x24\x74\x50\xf2\x62\x75\x58\x75\x43\x45\x05\x38\x85\x01\xbb\x48\x52\xbd\x1d\x35\x1a\x2e\x45\xc5\x40\x5e\x72\xd6\x87\x24\xbf\x24\x73\x4a\x45\xf2\x6e\x74\x14\xc1\xee\x88\x22\xcd\xdb\x25\xbb\xdb\x26\x79\xbe\xde\x63\xb7\x20\x25\x99\x8c\x5b\x6a\xf9\xf6\xdf\xe3\xad\x33\xc9\x5a\xcf\x96\x92\x8d\x56\x70\x50\xb5\xed\xb5\xcc\xd9\xf3\xe4\xb5\x56\xd4\xcf\xc2\x4d\x79\x91\xb4\xc0\x5b\x9c\xf3\xb3\xc7\xf6\x25\xb1\x7c\x2e\x6f\x3a\xdf\x3d\xc6\xee\x70\x0d\x54\x24\xec\x1a\x7d\x74\x2f\x37\x30\xf3\xcd\xff\x93\x5a\xf0\x99\xda\x6e\xde\xe4\x59\xae\x6e\x8d\xb9\x4b\xe8\xdc\x96\xad\x04\x42\x22\xb3\x5c\x12\xc7\x35\xa5\x3f\xe8\xd4\x3a\xba\xa0\xa7\xb2\x84\x99\x4c\xf7\x68\x2b\x77\x82\xae\x94\x78\x70\x8a\x4e\x07\xe0\x02\xa8\x94\x54\xb6\xfa\xa9\x1a\xe0\x68\x80\x88\x68\xd9\x56\xa8\x99\x5f\x5a\x57\xd5\xfa\x8a\x93\xb4\x2b\x22\x53\x3b\x05\x71\xf6\x53\x40\x6b\x46\x3c\x67\x6b\xd5\xa9\x85\xd6\x46\xb3\x9f\x88\x96\xdc\xd5\x38\xd4\x46\xa7\x61\x2d\xa5\x0a\x9a\xa5\x0f\xb4\x64\x49\x0a\xb6\x4e\xf0\x0f\x36\xd1\x8d\xaf\xf6\x52\x27\x49\xd7\xc2\x76\x5b\x96\xb8\xc0\x5e\xcd\x6e\x2f\xaa\xc6\x3b\xc5\x33\x77\xcb\x19\x5a\xb3\x67\x92\x24\x82\x9b\xb6\x52\x10\x9f\xbb\xf5\xf7\x8e\x1a\x3b\x40\x32\xc0\x7f\x73\xed\x19\xbd\x96\x04\x1f\xf1\xda\x85\x09\xad\x24\x6a\x40\x84\x98\xc9\xd0\xea\x0b\x2e\x22\x63\xf5\xd2\xe8\xcd\x7c\x4d\xe6\x05\x62\x34\x98\xab\xd1\x02\x5d\x0e\x18\xd2\x1f\x39\xb9\x75\x76\x69\x24\x01\x51\x46\x36\xf5\x0e\xa2\x48\x8e\x73\xb8\x84\xd1\x38\x87\xc6\x36\xf6\x7c\x56\x0b\xdb\xee\xe1\xf7\x0f\xd9\xc1\xb8\x1f\x01\xb8\x4a\x49\x7c\xfc\xda\x18\xfb\x4a\x67\x8b\xca\xee\x9a\x6c\xb7\x65\xdb\x90\xbd\xf9\xff\x7a\x2c\xf8\xc1\xb1\xed\xdf\xb1\x82\x24\x51\x8b\xb2\x80\xa9\xd5\xed\x06\x5f\xb7\x93\xf8\xd2\x7e\x0c\xe4\x22\x18\xa9\x50\xc7\xc3\x74\x75\xd0\x93\x17\xd5\xb8\x29\xf5\xbb\x08\x0d\x47\xc5\x09\xce\x54\x7d\x0c\xe9\xd0\xca\xc5\x32\x33\x9b\xbe\x01\xa4\x52\x75\xbd\x85\x8d\x31\x0d\xd0\x9f\x5d\x0d\xe3\x76\x9d\x17\x41\x9f\xa8\xef\x6b\x5e\x08\xb5\x51\x49\x76\xc8\xb6\xcb\xe8\xdc\xe4\xbb\x92\x67\x43\x48\xe2\x78\xd3\x73\x78\x89\xf0\xe4\x86\x5f\x09\x65\x3c\x31\x54\x73\x9d\x7e\x14\x0d\x2c\x61\x31\x81\x36\xdf\x72\xb3\xeb\xa6\xcd\x93\xae\x1c\xf8\x81\x71\xf6\x0f\x2a\x55\x6a\xff\x0d\xe3\xc1\xff\x1d\xab\xd6\xb6\x1d\x15\xa7\x60\x85\xde\xeb\x9d\x0a\x13\xc1\xe9\x6a\x4b\xc5\x3a\xd7\xab\xa3\x23\xae\x57\xeb\xa9\x88\xfb\x91\x48\x5d\xf5\x1d\xf4\x75\x60\xe8\x44\xff\x15\xfc\x3d\x71\x55\x0e\x1a\xb8\xe4\x7a\x22\x4c\xb3\x49\x64\xa3\x15\xad\x0d\x2d\xe4\x11\xe0\x40\x1f\xe9\x39\x96\x38\x94\x6d\x0c\xec\xe0\x20\x85\xd5\x43\xc0\xa5\x88\xc3\x5e\x01\x6d\x6d\x88\x9b\x44\x2b\x4f\xd2\x6c\xd2\x80\x77\x61\x79\xb9\x85\xd5\x5f\x1c\x12\x5a\xf3\x50\x2d\xc5\xfb\xd6\x33\x79\x71\x84\xfe\xef\xf2\xde\x68\x8b\x84\x2f\x65\x07\xee\xc0\xc3\xc7\x15\x15\x9b\xec\x4b\xaa\x4e\xaf\x67\xfd\x1c\x71\x34\x1d\xb2\xf8\xb8\xa2\xea\xdf\x3e\x9f\xed\xc7\xa4\x76\xff\xbd\xcf\x0f\xde\xf1\x7c\xfc\x37\xc9\x18\x2b\x89\x92\x9e\x6b\x7b\x0b\x49\x4a\x7a\x4c\x2b\xc1\xa4\xf7\x3b\x66\x12\xfb\x15\x23\x00\x66\x19\x6b\xf0\xb5\x2c\x89\x71\xed\x86\xed\x59\x25\xdd\xb3\xc4\xec\x91\xc5\x05\x22\xb9\x12\xfc\xe8\x71\x9b\xa3\x6f\x43\x5e\xd3\x9e\x88\x06\xef\xa7\xe1\xac\x6a\xe8\x03\xcb\x8b\x6a\x8a\x7b\x22\xa5\x14\xf9\xfb\x93\x48\xc4\xeb\x3c\x96\xf9\x54\x3f\x8d\x9a\x4b\xea\x87\x65\xf4\xc4\xab\x77\x1b\x5c\x76\x45\x18\xcd\xa2\x20\x15\x61\x64\xf0\x2d\x46\x95\xa2\x5e\xc2\x62\xe6\xe8\xcd\x86\x49\x86\x9f\x85\x90\xa0\x28\x6c\x97\x23\xd6\x61\x91\xc6\x48\x7f\x16\xcb\x1c\x71\x8b\xd5\x17\xf5\x0a\xd2\xc0\x99\xe9\x63\xc7\xeb\x3c\xa3\x68\xfb\x63\xcd\x19\xfe\xf0\xf2\xb9\x79\xf5\xf4\xd1\x26\x6f\xf0\xb0\xb7\x79\x1c\xda\xbb\xb8\xb4\x79\x9c\x2f\x2e\x8d\x6a\x29\x36\x72\x71\x09\x3f\x39\xa9\x3f\x39\xb9\xbb\x4f\x5a\x61\x3b\x55\xdd\x99\x5f\x5c\x58\xde\xfe\x75\x78\xa3\xc1\xbb\xa2\xa5\xde\xbf\x38\x37\xbf\xd3\x10\xe2\x67\xea\xc5\x06\xef\xf7\x61\xc6\x63\xfe\xc0\x03\x8b\x0b\x04\x93\x87\x91\x11\x40\xa3\x01\x80\x00\xd6\xf0\x60\x1c\xc5\xba\xbc\xc6\x27\xee\x0b\x27\x5f\xf9\xf0\x74\xe3\xb4\x68\x74\x1e\x7d\xcd\x5d\x4f\x34\xee\x33\x7f\x1c\xdf\xdd\x1f\x33\x47\x9f\xb8\x83\x5a\x70\xcc\x34\xe1\xd8\x33\xd8\x86\x63\xe6\xaf\x63\xbb\x69\xc4\x71\xd3\x88\xe3\xcf\x60\x23\x8e\xbb\x8d\xb8\xeb\xb4\x58\x7b\xb4\xba\x5d\x56\x53\x4e\x98\xa6\x9c\x78\x06\x9b\x72\xe2\x46\x9b\x12\x66\x6b\x31\x2e\xdb\x95\x33\x97\x66\xa6\x95\xb6\x0e\xff\x3a\xa6\xa3\x98\x68\xfb\x83\xfc\x0e\xa6\x8f\x1d\x9d\x39\x75\x62\x66\xfa\xf8\xb1\x40\xbd\x19\x9c\x3e\x75\x57\xc3\x3c\x9b\x09\xa8\xbc\x99\x69\xbb\xc4\x9d\xca\xa1\x6f\x8e\x15\xdf\x54\xd7\x3d\x5c\x57\x2b\x95\xed\x30\x6f\x89\x14\x04\x1a\xfe\xc5\xd5\x9f\xfa\xfb\xca\x11\x7c\xe5\xc4\x7d\xb3\x30\x63\x30\x06\x13\xf7\xcd\xe2\xbf\x8f\x3d\x31\x79\xdf\x6b\x4f\x3c\x3c\xd3\x38\xf1\x28\xfd\x78\xfc\x89\xd7\x9e\x9c\xb8\x6f\x76\x7a\x66\xe6\xb5\x30\xac\xf8\x7c\xd2\x7c\xfa\xda\x63\x0f\x1f\x3f\xa5\x5f\x3e\xf6\xc4\x6b\x8f\xa9\x97\x1f\x9e\x6e\x9c\x78\xf4\xb5\x0f\x9f\xbc\xcb\x7d\x7b\xe6\x89\xd7\x4e\xdc\x37\x7b\x74\xe6\xd8\xcc\x6b\x67\xee\x9a\x9e\x7e\xed\xb1\x13\x8f\xb4\x55\x95\x8f\xb4\xd5\x6f\x93\x77\x68\x02\xf0\x01\x8f\x93\x98\xb7\xc3\x75\xd5\x93\x42\x0e\x77\xc3\x6b\x78\xe1\x6a\xf0\x2c\x53\xf3\xc5\x1f\x68\xae\x34\x39\x80\xa2\x44\x4a\x8c\xf5\xd3\x30\x1f\xe8\x6e\x17\xc7\x81\xd5\x6b\xa8\xef\xe1\x06\x7f\xf4\xbe\x47\xda\xaf\x39\x6a\xfe\x75\x1c\x56\xc1\x86\xbc\xd6\x4a\xa2\x24\x85\x39\xd8\x90\xd7\x44\x5b\xb6\x42\x75\x61\x84\xa7\xbc\x95\xb4\xc9\xd6\x18\xbc\xf0\x1c\xfc\x6f\xb6\xba\x92\x17\xde\x37\x41\x0b\x6c\xae\x71\x4e\x8d\xe9\x6b\xed\x3f\x4f\xaa\x8e\x36\x78\xba\xbe\x56\x54\xb6\x7c\xff\x99\xa1\x4a\xd2\xf5\x35\xaa\x2d\x5d\x5f\x9b\x38\x7a\xe2\x44\x9d\xfe\xff\xb4\x9a\xf5\xb5\x41\x2e\x67\x21\x44\xf0\xe4\x71\x20\xaa\x56\x6a\xf1\x5a\x18\x8b\x74\xc0\x41\xf9\x6d\x00\xb4\xc9\x56\x02\xcb\x22\x1e\x80\xce\xc9\x93\x4e\x71\x90\xa9\x43\x51\x8d\x21\x70\x31\x3a\x6b\xec\xe8\xf4\xf4\xc9\xc6\xf4\x4c\x63\xfa\x68\x50\x3a\x34\x94\x3e\xdb\x80\x0f\xc2\x58\x9d\x20\xc7\x8e\x1d\x3b\xad\x8a\xa2\x5c\x5d\x28\x4e\xe7\xed\xba\x45\x1e\xe5\x71\x16\x54\xca\x69\xb8\x3e\x80\xa0\x5e\x30\x29\xbf\x00\xcc\xde\x13\x39\x28\x93\xb0\x28\x56\x94\xca\x54\x14\x4e\xba\x01\xf6\x42\x95\x60\x7a\x02\xa1\x29\xa5\xee\xcc\x1c\x6f\xcc\x1c\x6d\xcc\x9c\x58\x9d\x39\x3d\x7b\x6c\x7a\xf6\xe8\x74\x73\x7a\x7a\xfa\xa1\x72\xe7\xd4\xe7\x0d\xf8\xbc\xe8\x9c\xa3\x6a\x3d\xc6\xc6\xe2\x24\xf7\x9f\xbd\x1b\xf1\x97\xb3\xc3\x98\x74\x80\x57\x7e\x57\x6d\x7a\xd3\x01\x76\xea\xc6\xb9\xb7\x30\xf6\xee\x57\xf6\x07\x8d\x1b\x22\xb2\xd9\x0d\x8f\x8d\xe3\xd1\xff\x63\xc0\x0c\xfc\x2a\xfa\x68\x24\x07\xd7\x87\x0c\x24\xea\xbb\x3d\xdd\xa0\x51\x24\x5c\x86\x55\x0b\xc9\x5c\x6e\x84\x92\xab\xce\x01\x0d\xe8\xd4\x34\xef\x4a\x11\x6b\x54\xdc\xd8\x54\xa5\x3a\x1b\x66\x14\xc2\x1d\x27\x5b\xfc\xd4\xf4\x8b\x54\x21\x56\xda\x17\x16\xe4\x42\x5c\x76\x86\xb9\x3d\x56\x74\x7f\xee\xdd\x13\x8f\xc7\x50\x3d\x65\x0e\xa0\xa2\x9e\x3d\x71\xfd\xb8\xf5\xfc\xe6\x10\x8b\xcf\xc7\xf7\x90\x04\xf4\x46\x6f\x8f\x84\x3d\x77\x3f\x93\x84\x3d\xaf\xac\x04\x6d\x3d\xaf\x41\x5b\x8f\xed\x95\x96\xe7\xa3\xfb\xd8\x7d\x7b\xe4\xb6\xf1\xff\x6e\x3c\x90\x3b\xbd\x54\xa2\xa3\x32\xbc\x36\x62\xe4\xf8\xaa\xa5\xce\x5b\x32\x05\x44\x3d\x03\xf9\x3a\x3a\x0b\xed\x2f\xc7\xd8\x7b\xab\x53\xc2\xde\xba\x87\xd5\xf0\x8a\x8a\x94\xb0\x4a\x5e\xa7\x1b\xce\x0c\x63\xeb\x45\x62\xd8\x23\xc1\xe5\xed\x12\xc3\xe4\xb5\x5e\x24\x08\x07\x93\x62\x7f\x87\x93\xc3\x72\xe4\x83\xa7\xaa\x6d\x81\xbf\x64\x52\xc3\xce\x05\xa7\x8b\xd4\x30\x3c\xea\x9f\x56\x02\xd8\x8a\x49\x00\x5b\x0c\xee\xd9\x55\x02\x18\x9f\xa8\xca\xfc\x9a\xb4\x0b\x3d\x4d\x91\x11\x33\xc1\x1d\x39\x52\xb0\x57\x11\x98\x99\x12\xed\x4f\xdf\xbe\x7f\x47\x3a\x35\x93\x94\xa3\x8d\x9d\x4e\xfe\xd8\x6f\xed\x0b\xfe\xba\xb6\xed\x2b\x3b\xa7\x92\x19\xeb\x23\x25\x1d\xe1\x3d\x3f\x4f\x2c\x3b\x23\xdc\x5e\x1d\xa3\x7b\xc1\x51\x1f\x6b\x00\xda\xba\x9b\x8d\xa6\x31\x43\x4c\xbe\x4d\x48\xf6\x20\x90\xfe\x2e\x67\x1d\x92\x61\x51\xee\x13\x42\xc9\xa9\xe3\x28\x49\x79\x57\x76\x93\x74\x30\xd9\xe4\x7c\xa5\xdf\xda\x30\x54\x52\x22\x95\x7c\xad\x1f\x46\x18\x74\x5f\x6a\x6a\xdc\x46\x8b\x18\x34\x58\xa9\xa6\x44\x07\x98\xf4\x10\x26\x52\xad\xf5\x84\xe8\xd8\x93\x4c\x5a\x88\xd9\x96\x93\x42\xa6\x0d\xd5\xd0\x82\xbb\x4a\x6b\x99\x81\x92\x75\x01\xa7\xd0\x6c\xca\x94\xb2\x73\xe5\x0e\x99\x2e\x3b\xfb\xfc\x27\xfe\xde\x64\xc9\x9d\xa1\x34\xae\xd9\xa0\x01\xe9\x1c\x15\x98\x6e\x66\x4d\x84\x31\x87\x89\x2e\xef\xa4\x35\x56\x74\xd3\x7f\x20\x38\x3f\x5f\x4c\xf3\x70\x69\xce\x1a\xa0\xf4\x8c\xac\x80\x83\xc6\xd9\xc1\xd9\x77\x90\x98\xc7\xd9\x11\x6b\x54\x62\x99\x6f\x25\xe9\x55\xd2\xb8\x28\x6d\x91\x82\x3c\xfd\x9f\x1a\x0f\x16\xdc\x47\x76\x52\x4f\x14\xd9\xe0\x88\x10\x47\x84\x23\xa2\x73\xbf\x00\x14\x2c\x49\x4b\xe4\x0c\xbf\x37\xc6\xde\x57\x63\x07\x8d\x09\xff\x5d\x35\x36\xbb\x63\x04\xfb\xea\xa0\x27\xdb\x17\x92\x96\x88\xca\xd8\x7c\x7f\xe0\x2d\x9b\x61\x45\x6b\x9b\x7e\xc1\x12\xaf\x8e\x75\xdf\x9a\x05\x3d\xa6\x80\x20\xa7\xc7\xce\xcd\xdd\x84\xa0\xa8\xd4\xaa\xc2\xc2\xe9\x2d\x90\x70\x2f\x15\x09\x85\xf8\x00\x80\xc6\x4d\x70\xca\x9a\xe5\x5d\x2b\x48\x15\x04\xef\xf6\xf3\x3e\x04\xce\x1a\xf3\xa2\xa1\xa2\x82\x1b\x42\xb0\x82\xc5\x05\x4d\xf6\x63\x1e\x3b\x40\x85\xfb\x3f\xb0\x0d\xa7\x79\xf5\x8c\x52\x39\x34\x8b\xc1\x15\xfa\xdb\xa5\x5f\xd2\x0f\x41\x13\xa5\x57\x6f\xa8\xb5\x7a\x26\x82\x26\xfb\xcd\x71\xf6\xe5\x15\xf3\x38\xd7\x81\x36\x0f\xfc\x0f\x8e\x07\x33\xfa\x0f\x2c\x1d\x22\xc2\x41\x78\xea\xc7\x04\x35\x03\x8e\xa6\x7e\x54\x06\xc9\xfb\x8b\x31\xf6\x7e\x8f\x1d\xee\x25\x6d\x53\xe8\xbb\x3c\x56\xdf\x39\x19\xa2\xf8\x20\xc8\x17\xcc\x72\x86\xbb\xc2\xa8\x9a\x49\x7c\xb6\x92\x46\x94\xb4\x90\x68\x00\x73\xe1\x8d\xab\x54\xcd\x7f\x9c\xb4\x65\x1d\xc0\x56\xeb\x5c\xe6\xad\x26\xc8\xf7\x44\xed\x58\x58\x83\xbd\xa4\x3d\x91\x4d\x4e\x36\xd9\xc7\x3c\x76\xbb\x6a\x76\x9c\x87\xa6\xe9\xef\xdb\x0d\x2e\xe5\x92\xfb\x51\xf0\x44\xa9\xf9\x71\x1e\x36\x76\xea\x03\xd0\x29\xf0\x5e\x3f\x2f\x60\x3b\x9f\x6e\x3f\x36\xd9\x2d\xea\x55\xd3\x87\xce\x2e\x92\x15\x2f\x59\x1f\x04\x27\x8a\xf6\xab\x82\xb6\x19\x7f\x2d\x72\x7b\x49\xbb\xc9\x3e\xb7\x8f\x4d\x54\x14\x7d\x3f\xa2\x2f\x74\x32\x27\x13\xe4\x83\xfb\x82\x37\xba\x99\x20\xe6\xbd\x5d\xe7\x82\x14\x5f\x3c\x13\xd9\x20\x87\x8c\xd4\xbc\xee\x41\x6e\xa3\x8b\x67\x38\xae\x34\xd7\xe2\x1d\xff\x1d\x5e\xf0\x6d\x9e\xc6\x3c\xcd\xec\xb3\xc5\x00\x7d\x60\xf2\x9e\xea\x86\xd6\x02\x8b\x16\x17\xde\xb0\x8a\x3c\x2f\x8a\xfc\xce\x0c\x8d\x19\x76\x6f\x6a\x5d\x7f\x3e\xb5\x7c\x76\x6e\xe1\xe2\xd9\x66\xb7\xfd\x42\x4c\x0a\x69\x08\x75\x82\xdb\x07\xca\x93\x1e\x65\x68\xbe\x26\x88\x35\xeb\x80\x6a\x5d\x79\xd0\xb8\x7a\xe9\x59\x6b\xc5\xaf\xda\xe9\x23\x1f\xf3\x82\x7f\xeb\x6d\x9b\x40\x32\xd4\xb8\xbd\xa4\x90\x3c\xb3\x7d\xb2\xcc\x23\xff\xfd\x10\x7b\x51\x15\x5e\x3f\xca\xe9\x39\x4c\xfc\x01\x00\xa2\x8f\x1c\x0a\x4e\x0e\x3f\x76\xb1\x6e\xdc\xdf\x35\x9c\x7c\x25\xf2\xd0\xdb\x0e\xb2\x8f\x1a\x4c\xc8\x0f\x7a\xc1\xd6\x85\xca\x32\x76\x9d\x3c\x98\x8b\xec\x2a\xa4\x10\x22\x9d\xb4\xea\x68\xc3\xe8\x2f\xd6\x73\x3a\xe0\x1a\x94\xd3\x34\x65\x87\x6d\x1c\x63\x33\x6c\x6a\x67\x2e\x03\xa7\x81\x37\x71\x78\x6e\xe2\x43\x16\x9d\xbb\x89\xa6\xb5\x67\xbc\xb5\x87\x76\x86\x4c\x3a\xe5\x9f\x68\x38\x80\x47\x5c\x03\x28\x05\x81\x41\x4a\x1a\x96\x55\x8c\xfd\xea\xad\x0e\xe4\x9a\xa3\xc7\x22\xee\x91\x56\x66\x7b\xb2\xe5\xbf\xeb\xd6\xe0\x6e\xeb\xef\x92\x81\x40\xeb\xf0\x90\x34\x9c\x01\xaf\x7b\xb6\x81\xac\x7b\x80\xc5\xe0\xaa\x92\xbf\x71\x0b\x7b\xff\x3e\xf6\xbc\x10\x3f\x9a\x8f\x44\x06\xe7\xac\xff\xfd\xfb\x82\x37\xef\x5b\x2c\x3d\xad\xba\x8b\xd9\xef\xf0\x16\x8a\x78\x8b\x2b\x66\x75\x43\xda\x40\xf7\xce\xdb\x7a\xd1\x61\xbc\xa0\x45\x8b\x05\x27\x96\x21\xde\x70\x2e\x90\xa4\x94\x53\x20\x85\xa6\xc5\x31\xdc\xa5\x57\x5c\x09\x4c\xdd\x6a\xb6\x54\x7d\x57\x74\x28\x0d\xe0\xf0\x9c\x4b\x52\x08\x24\xdc\x12\x69\x3b\x33\xfe\x89\x30\x82\xc0\x0e\x62\x49\x00\x2b\xb3\xfe\x84\xd2\xf7\x80\xdc\x40\xc7\x3b\xe1\xa5\x4f\xd5\x2e\xdb\x00\xd6\x01\x46\xee\x82\x19\xa1\x20\xf7\xa0\x9e\x01\xc5\x5b\x37\xcc\xb9\xe0\x5b\x22\x05\xeb\x55\x68\xf3\x0b\x21\x86\x88\xa9\x12\xcc\x0e\x05\x3d\x87\x5e\xff\x8b\x7a\x68\x0a\x2e\x2e\xa8\x13\xa2\x34\x71\xff\x61\x28\x85\x1e\x6f\x89\x09\x01\xc8\x23\x05\x83\x61\x5f\xca\xe6\x62\x77\x5e\x0a\x03\x0e\xe6\x2e\x74\x45\x7a\x15\xad\xf4\x14\x45\x53\xd7\x53\xe6\xa2\xdc\x67\x32\xaf\x0c\xce\xb3\xc7\xe3\x1c\x25\x9b\xd8\x4c\x08\x75\xbc\x8b\x69\xc1\xe0\xae\x11\x3b\x77\xcb\xb1\x18\xfc\x86\xc7\xf6\x81\x86\xec\x7f\xd2\x0b\x9e\xf4\xe6\xcc\x61\x0f\x31\x12\xa8\x3b\xeb\x96\x99\x63\xd6\xae\x80\x32\xd6\xad\x4b\x2d\x80\x94\xc0\xa7\x9a\x7d\xa6\x0e\x77\xfd\x3c\x55\xea\x79\x0b\x57\x00\x62\x3e\x38\x31\x45\x74\x5f\xb4\x8f\xec\xbb\xd9\xe9\xd1\xc6\xd6\x6d\x36\xf8\x72\x3f\x92\xec\x0d\x63\x6c\x2c\x8f\x32\xff\x6f\x6b\xc1\xfb\x6b\xab\x17\x56\x5c\x08\xdd\x26\xa7\xbc\xfc\x68\xe0\x5e\xda\x81\xce\x19\xd5\x72\x2b\x58\x49\x7d\xaf\x1e\xd5\xf9\xf1\xe3\xc7\xa0\xcf\x26\x55\xa4\x2b\xbb\x6b\x44\x02\x01\x73\x04\x23\x48\x61\xf1\xd6\xb2\x53\x03\x9a\x41\x4c\xfa\xc0\x84\x34\xe9\x32\xae\x61\xe8\xbb\xb9\x40\xc1\x9d\x60\x88\xa6\xa6\x20\x7d\x30\x36\x3f\x9b\x0f\x64\xe5\xd2\x22\x34\xd3\xb8\xd3\xea\x7a\x57\xd0\x06\xb6\xb7\x50\xa7\x1f\x75\xc2\x28\xd2\x0a\x8b\x7e\xc3\x74\x7c\xe5\xd2\xa2\x33\x13\xb3\xec\x2e\x76\xf2\x69\xcc\xc4\xea\x85\x15\xf6\xd3\x35\x76\x80\x66\xd7\xff\x57\xdb\x19\x6b\x46\x17\xa3\xed\x0e\x7f\xe2\xcd\x95\x17\x0c\xf2\xe7\x44\x20\x4a\x51\xfd\xd3\x81\xa5\xd2\x24\x12\xb4\x93\xf8\x88\x66\x53\x12\xf1\x00\x16\x67\x93\xcf\xd9\xc4\x3a\x49\x87\x1f\xa1\x12\x8f\xa8\x25\x7c\x04\xd6\xfe\x91\x82\xea\xba\x64\x7e\x31\x5c\x31\x09\x11\x6e\x83\xb5\x28\x8a\x92\x2d\x3c\x97\x13\xd1\x5e\x13\x91\x88\x5b\x32\xb5\xc7\x3d\x49\x75\xfb\xc1\x17\x9b\xac\x87\x2d\xd8\xf4\xb4\x5c\x84\xa6\x96\xa5\x97\x9a\xec\xbb\x0f\x39\xa0\x22\x2e\x7c\xa0\xc5\x80\x36\xa7\xb3\x19\x32\xff\x0f\x0e\x06\xf9\xf0\x63\x8d\x90\x97\x69\x47\x52\x51\x4e\x91\x0a\x91\x59\x66\x57\x25\x74\x8c\x10\xb3\xf4\x4d\x0c\x65\x2f\x88\x6c\x41\xf7\xe8\x88\x96\x8b\x49\xf0\x99\x03\x70\xb1\xdb\x94\xe9\x9a\xba\xd8\x3d\x28\xd3\x35\xd4\x9c\xaf\x56\x58\xd2\x88\xf5\x6d\x0d\x83\x01\x67\xf9\xba\x3a\x21\xd4\x3e\xaa\xf3\x2d\x64\xe0\xc2\x2b\x4e\x9d\x14\xdc\x3a\x6f\xcb\x48\xaa\xff\xf6\xd2\xe4\xda\xa0\xc9\x79\x70\x67\x40\x6e\x4d\x11\x45\x25\xef\xc2\x01\x52\x26\xfc\xf3\xc1\xdd\x5a\x55\x0b\x8b\x88\xfc\x12\x11\xde\xb2\x39\x23\xb7\x29\xf4\xa2\x46\x2d\x58\x08\x4e\x21\x6a\x81\x55\xe0\xfd\xda\x10\xb5\xeb\xe2\x5e\xe7\x91\xf1\xf7\xf1\xa0\xbb\xa3\xf1\x57\xc3\x7f\x68\x8f\x2c\x5a\x4e\x83\x75\x99\x07\xb8\xbc\x22\x69\x3d\xc6\x3f\x83\x26\x0f\x02\x3e\x01\xa9\x98\x93\x23\x1a\xf1\xe7\x35\x76\xc8\xd8\x32\xfd\xcf\xd5\x82\xdf\xa8\x19\x72\x0c\xbb\x41\x8e\xad\x53\xc3\x32\xb9\x6d\x6a\xf2\x42\xba\x82\xc8\x4b\x09\x12\x8a\xb8\x3a\xf4\x47\xf9\x96\x94\xb1\x7a\x5c\x94\x0b\x67\x77\x64\x71\x2b\x67\x76\xcb\x43\x73\x7a\x52\x0f\xc1\xa4\x4b\x84\xc5\x08\x6a\xb3\x2c\x37\x43\xb9\x55\xfe\x0a\x93\x50\x01\xed\x08\xb5\xab\x06\x10\xb1\xb5\x2d\x88\x98\xa1\x01\x0a\x44\x14\x05\xf0\x4d\xd1\xbc\xa1\xaf\xe0\xb6\x66\x28\xe0\xed\x26\x80\xfd\x46\x46\x9d\x8a\x9f\xdc\xfc\xf9\xc2\x94\x7d\x21\xb8\xcf\x36\x46\x5b\xe9\xae\xa0\x74\x12\xec\x0b\xdd\x2a\xd5\xbd\x64\xdb\x55\xf5\x4a\x76\x38\xeb\xaf\x99\xc2\x2f\x07\x67\x56\x8a\x3f\x77\x5f\xbe\x2e\x3e\x4e\x62\x17\xba\xe3\xad\x87\x1c\x7d\xbb\x95\xc0\x71\xa5\x25\x13\xca\xef\x0b\x52\x64\x12\x2c\x0c\x9f\x3b\x18\xbc\xc8\xfc\xe5\x1a\x16\xe0\xb1\xa1\xa7\xab\x34\x28\xfc\xcc\x81\x9b\x97\xaf\xbd\x42\x19\xbf\x5a\x1b\x64\x36\x82\xa0\x02\xca\x58\x0f\x55\x05\x4b\xe0\xf6\x30\xc6\xa3\x27\xfe\xa6\xf9\x64\x0f\xe6\x93\x4f\xd8\xe6\x93\x9f\xd9\xa3\xf9\xe4\x9f\x7f\x91\xac\x27\xba\xa2\xa7\xbc\xf5\x9d\x6f\xfe\x0b\xfe\x19\x03\x96\xec\x2c\xaa\x12\x4c\xb2\x11\x23\x95\xc8\xeb\x3f\xe2\x55\x1a\x3d\x97\x92\xf6\xc2\xa5\x95\x79\xb8\x03\x5c\x46\x1c\x93\x7f\x1e\x9c\x1e\x7e\x6a\x04\xc9\xc2\xa5\x15\x0d\x27\x99\x16\x5e\x6a\x6d\xd3\x77\xa4\xd3\x49\xf6\x95\x74\x80\x7f\x69\x70\xa8\x92\x45\xea\x4b\x34\xa6\xa6\x93\x8f\xf0\xeb\x87\x2b\x81\x11\x1d\xfe\x5a\xff\x7d\x87\x83\x73\xce\x13\x75\x45\xcc\xb8\x58\x5f\x4f\xe5\xba\xc8\x35\xd3\xa7\x4e\x0a\x82\x66\x12\x99\x6d\x9b\xf7\xa4\x75\x7a\xb9\x1c\xf7\xec\xa6\x44\xdd\xab\x44\xbd\x29\xde\x6e\x32\xac\x38\x0c\x2b\x1f\xd5\x0c\x2b\x3f\xbd\x1d\xc3\xca\x48\xf6\x6a\xd5\x8b\x51\x74\xd5\x44\xf6\xfb\x5c\xd0\x8a\xfc\x61\xc1\x94\xf2\xa9\xed\x98\x52\xaa\xfb\x81\x71\x30\xef\xf4\x28\xd2\xc9\xee\x0b\xa5\xb5\x19\xe9\x84\x92\x4b\xed\x6e\xb5\x6a\x75\x90\x4c\x3f\x13\xeb\xf2\x39\xe9\xe9\x53\xde\x03\x3b\x9f\x4a\x47\xfd\xe9\x46\x85\x05\xda\xe9\x74\x19\xa2\xff\xdd\xb7\x8c\x70\xbc\xb5\x52\x99\x3b\xee\xe5\xbf\x3a\x1c\x7c\xc1\x9b\x6b\x8b\x5e\x8e\x11\x14\xea\x05\x25\xff\x12\x2e\x34\x44\x25\x02\x0a\xb8\xe4\xc6\x26\x2e\x0b\xbf\x38\x92\xf1\x05\x91\x0b\xb2\x4a\x68\xf3\x52\x11\x1b\x0c\x48\xd2\x1a\x51\x2f\xe3\x9d\x10\xed\x7a\x0e\x6a\x03\x79\xf0\xad\x72\x08\xc2\x41\xbd\x8d\x87\x48\x53\x37\x50\xbb\xb1\xb7\xf5\x5f\xab\x79\xad\x70\x60\x3b\xa7\xd0\x5f\x1f\x62\x7f\x34\x06\x20\x1e\xea\x52\x77\x31\x69\x4b\xff\xb7\xc6\x74\x58\xef\x7f\x18\xbb\x4c\xc6\x95\x59\x80\x22\xe5\x6b\x6a\x99\xd8\x86\x52\xcb\xb1\xca\x93\xd8\xe0\x0e\x62\xff\xd6\x06\xc6\x8c\x52\xe0\x5e\xc7\x3c\x69\xe5\xfa\x64\x31\x57\xd0\xe9\xe9\xe9\x69\x68\xef\xf4\xa9\x53\xa7\x10\xd2\x48\xe7\x39\x94\x5e\x84\xb7\x4e\xcc\xcc\x34\xf9\x2b\xe6\x2e\x5e\x00\x78\x42\x35\x75\xc0\x10\x8e\x25\x0b\x88\x72\xb2\x3e\xce\xea\x00\x17\x57\x24\x3b\xbb\xbf\xc2\x0d\xd3\x74\xcf\xf5\x0f\x4f\x9f\x3c\x7e\xbc\xc9\x17\xc2\x14\x40\xc6\x43\xb2\x40\xeb\x78\x2d\x91\x17\x00\x01\x98\xf7\x6f\xc5\xe8\x52\x64\x8d\x66\x94\x0e\xd7\x37\x34\x86\x70\x2b\x89\x3b\x51\xa8\xd1\x69\x30\x26\x43\xeb\x37\x68\xae\x87\xb2\x8a\xb9\xef\x42\x3c\x07\x24\x0e\x74\x32\xb0\x6e\xe0\x91\x4c\x66\x89\x7e\x94\x6b\x23\x36\x16\x56\xcc\x55\x26\x73\x37\x42\xf8\x5d\xe3\xfa\x12\x72\x7d\x3c\xf8\xd4\x58\xd9\x76\x0c\xa1\x88\x6e\xbe\x6b\xc5\xba\x34\x16\x11\x8a\x3d\x6a\xeb\x65\x59\x2c\xfc\xe4\x55\x38\x1a\xb0\x93\x2c\x00\x5b\x08\x4d\x82\x4e\x6d\x41\x94\x61\x6c\x59\x5b\xae\xca\x01\x74\x8b\x76\x9a\x7e\x4c\xb0\x3f\x8b\x9d\x32\xc3\xba\xd2\xa4\x65\x1b\x37\xcf\x36\x35\x17\xd6\x5a\x35\x61\x14\x0a\xd9\x8f\x87\xbe\xa6\x43\x9a\x36\x2d\x41\x9c\xab\x36\xd9\x31\x63\xe4\x33\x20\x7c\x6d\x0b\x28\x1e\x2c\xc0\x30\x0a\x75\xbb\xbf\x99\xcc\xfb\x3d\x2c\x5f\xa6\x29\xe4\xf8\x03\xd0\x38\x72\x4b\x93\x4f\x42\x9b\x30\x9b\x7c\x49\xb5\xd0\xd8\x3c\xd5\xa6\xcd\xc3\x4d\x69\xf4\x2f\x55\xa7\xa6\x25\x57\x95\x1c\x69\x36\x8f\xe0\x32\x4c\x52\x9e\xe5\x22\xa5\x35\xa5\x9e\x3b\x17\xc8\x26\xab\xb3\x3b\x77\x3c\x47\x5e\x2a\x07\xab\x89\x6a\x02\x5b\x62\x07\x75\xa3\xfc\x85\xe0\xe4\x0a\x99\x47\x6d\x6c\x74\x9a\xf2\x24\x85\xb3\x03\x86\x51\xb7\x9b\xf2\x57\x9c\x50\x88\xb7\x78\x8c\x65\xf0\x09\x78\xe6\xbe\xde\x0b\xb6\x6c\xb4\xfc\x4c\x0b\x5e\x1d\x25\x74\x24\xb3\xac\x3e\x08\x96\xfd\xb4\x91\x8e\x35\xbc\x31\x56\xe2\x40\xb1\xdc\xca\xbe\x6c\x74\x10\x82\xff\xb9\x5b\x82\x3f\xf4\x74\x54\x1d\x68\x96\xaa\x4d\x6d\x2e\xd6\xb2\x3c\x15\x86\x0f\x2a\x4b\x3a\xf9\x16\x62\x7d\xe2\xab\x2e\xc3\x44\x77\x90\xbd\x3a\x9a\x44\x82\x68\x34\xf2\x24\x1d\x22\x4e\x06\xe1\x6d\xbf\xcd\x8f\x1d\x9b\x3e\x39\x59\x40\x1d\x80\x7d\x15\x57\x3a\x88\xd8\x62\xe3\x6b\xe6\x03\x13\x37\x84\xdc\xcc\xda\x11\x09\xc1\xa4\xb0\xee\x44\x9c\x6d\x81\x37\x93\x74\x52\x74\xfe\x58\x8e\x0b\xb4\xe1\x3a\xc7\xc2\xdb\x19\xfb\xdb\x42\x09\xf9\x33\x8f\x35\x77\x1b\xb8\x41\xea\xc7\xcf\x79\x17\x8b\x5c\x86\x68\x50\xa4\x30\xb8\x11\xe5\x3a\xda\x92\x2f\x25\x56\x26\x3c\xfc\x32\xc8\x72\xd9\x6d\xf2\x65\x1d\xc4\x73\x93\xdc\xed\xe6\xed\xec\xe6\xed\xec\xff\xd7\xb7\xb3\x8f\xe9\xdb\xd9\x87\x77\x13\xe7\xab\x05\x8a\xba\x97\xbd\x71\xf8\x5e\xe6\xb2\x5d\x1a\x41\xf2\x9c\xdc\x5a\x2e\xef\x7c\x6b\xa9\xfb\x77\x56\xdd\x5a\xa8\x53\xe5\xfb\xca\xa7\xdd\xd0\x99\x0a\xca\x30\xcb\xb3\xee\xff\xc4\xad\xc1\xff\xf0\xac\x07\x65\x68\x76\x0c\x1b\xe8\x8a\x5e\xcf\xb0\xc1\x80\x5e\x81\x48\x41\xc2\xd2\x66\x20\xca\x80\xa4\x0b\x68\x1b\x4a\x00\x93\x5f\x57\xe3\x5f\xab\x0d\xd1\x4a\xba\x8e\x57\x57\x1d\x76\x9d\x30\xcd\x72\x2e\xd5\x36\x16\x85\xc3\x0b\x4a\xec\xa2\xd3\x10\xa0\xf1\xd3\xa4\x9f\xe3\x85\x01\x66\x8d\x0a\xb7\xa2\x69\x0c\xd4\x1d\x7c\xa5\xaa\xb1\xba\x06\xa9\x1d\x25\x9c\xe6\xc3\xec\x25\x6c\x5c\xcd\xb3\x7f\x86\x7d\xcd\xc8\x65\x54\x31\x86\xe7\x57\x57\x97\xca\x65\xb3\xcf\x32\x62\xd2\xf8\x4d\x16\x7c\x82\x01\x97\x06\x29\x9e\x08\x94\xf3\xea\xbe\x88\x70\xb0\xda\x49\x57\x29\x5e\xda\x29\x28\x38\xf9\xcb\xa1\xcf\x55\x50\x16\xc7\x4e\xdf\x75\xb2\xc9\x2f\x25\x39\x46\x6c\x14\x79\xd9\x6d\xb9\x19\x52\xd4\x8b\x91\x58\xc1\x06\x70\x6f\xf4\x94\x12\x47\xa7\x23\xc1\x79\xe8\x52\x31\x03\x18\x4a\x9d\xe5\x33\x4d\xbe\xb8\x94\x15\xd7\x0f\x44\x04\xb2\xa3\x2a\x0a\x16\x2b\xd3\x59\xb8\x26\x40\x84\x85\xe8\xf5\xa2\x01\xcf\x13\x46\xc8\x32\x8b\x4b\x46\x89\x55\x1b\x4d\x13\xa4\x08\x30\x08\xe8\x50\x13\x76\x14\x43\x81\xae\xcc\x5e\xe1\x6d\x09\xf9\x4d\x98\xda\xa2\x5a\x90\x4a\xb5\xac\x60\x01\xc9\x96\xe8\x67\x18\x45\x31\xdc\x42\x76\x88\x97\x42\x3f\xf0\x06\xdb\xb1\x69\xb7\xc2\x0c\x22\xa7\xc2\x56\xa8\x5e\x9a\xbd\x6b\x1a\x56\x97\x9a\x73\x75\xda\xa9\x22\x66\x8f\x1f\x3f\x66\x1e\x66\x4d\x76\x26\xc1\x55\x94\x61\xc0\x0f\xa6\x5c\xea\x3e\x75\xfa\x6a\x6b\x8f\x5a\xc8\x18\x25\xd3\xe6\x62\x5d\x84\x71\x96\x9b\x58\x0f\xbe\x26\x3b\x89\x1b\x6d\x53\x2c\x49\x84\xda\xa5\x17\xc3\xcc\xbd\x46\xd9\x01\x2d\xb0\xfe\x33\x27\x02\xc7\x90\xe8\xb8\xd7\x93\xa1\x3a\x18\x2e\x47\xba\xdb\x05\xbd\x54\xb6\xc2\x4c\x06\xc5\x1d\x44\x38\x6b\x52\x07\x47\x81\x75\xa2\xe0\xd9\xe3\xed\x24\x1f\x5e\xaf\x94\x4d\x10\x74\x92\xa4\xb9\x26\xd2\x66\x2b\xe9\x06\x93\x80\x1c\xb1\x15\x46\xed\x96\x48\xdb\x41\x7d\x54\x45\xbd\x54\x76\x00\xf6\x80\x88\x98\x28\x46\x47\x7f\xc8\xc1\xd4\xa0\x2b\xb8\xb3\xa9\xaa\x80\xe2\x71\xf5\x98\xd7\x0c\x8a\x02\x3f\x72\x27\x05\x7a\x88\x5e\x4f\x8a\x54\xed\x9f\x30\xcf\x64\xd4\x29\x4c\x20\x4a\xd6\x2c\x5c\x5a\xa1\xb2\x51\xe5\x41\x20\x3d\x5c\xcf\xba\x11\xf0\x3b\x52\xdc\x10\x2b\x15\x21\x3b\x96\x5a\x57\x54\x81\xed\x84\x91\x7e\xf1\x8b\x79\x70\xa7\x6a\xe7\xb2\x5e\x1f\x26\x52\xa8\x62\x8d\xc0\x27\x14\x87\x12\x97\x76\xf8\x96\x18\xe0\x1e\xed\x70\x2d\x52\x68\xfa\x34\x33\x16\x54\x60\x3a\x81\xda\xa2\x92\xe5\x14\x33\x04\x6b\x1d\x26\x0a\xb9\x71\xc0\x89\xae\x64\x11\xb0\x01\x01\x3f\xd0\x51\xa7\xf8\xa2\x87\x24\x78\x9f\x76\x35\x79\x52\xd4\x04\x2b\xb4\xdf\xe9\x84\xd7\xf8\x44\x2a\xbb\xc9\xa6\x3e\x51\x70\x46\x60\x2c\x27\xb5\xb8\x30\x43\x0c\xf1\x3d\x4e\x8e\xc1\x21\xf6\x4f\x2a\x99\xaf\x50\x4b\x5b\xe9\xaf\x65\x32\xf7\x3f\x7d\x30\xf8\xc9\x31\xf7\x59\x39\xb5\x08\xb1\x75\xc8\x0e\x03\xc4\xbc\xdd\x2e\xa1\x8f\x42\xc2\x75\xaa\x94\xc3\xd5\x0d\x8b\x12\x8d\x7e\x2a\x32\xdd\x48\xba\xcf\x8b\x34\x97\x59\x28\x62\x75\xff\x69\xf7\x5b\xf0\xd6\x9c\x29\xff\x1a\x5f\xc2\xc2\xce\xd9\x57\x39\x08\x95\x9c\x65\x9c\xbf\x06\x70\xb2\xcc\xeb\xb3\xfc\xe1\xd7\x04\x61\x2f\x98\xe5\xc1\xcc\x74\x53\xfd\x5f\x73\x26\x78\xa2\xce\xdd\x87\x47\x9b\x47\x83\x27\x1e\xad\xc3\xa7\x50\xfa\x2c\x80\x6d\x3d\xfc\x9a\x40\x6d\x2b\xf5\x9e\x08\xea\x3c\x50\xbd\x08\x66\xf9\x5d\x27\x4f\x9d\x80\x22\xf4\x8f\x6b\xd6\x8f\xc7\xa6\x4f\x3f\xf1\x28\xe3\xfc\x09\xb0\x4d\xa2\x11\x08\xe0\x2c\xcb\xbd\x25\xe1\xb1\x19\x4a\x40\xfd\xce\x10\xef\x4c\xcc\xf2\x87\xb9\x69\xe9\xac\xaa\xaa\xce\x4d\x23\xe1\x6f\x4e\x0d\x5d\x73\x5f\x3d\x36\x7d\xda\x7e\xf3\xd8\xf4\x69\xfe\xa8\x73\x3c\x7f\xf7\x3e\xf6\xdf\x3d\x76\xc8\xcc\x94\xff\x69\x2f\xf8\x1e\x6f\x71\xc9\x9e\x3b\x10\x2b\x49\xa7\x43\xa6\x04\xad\x79\xe0\x81\x81\x26\xb0\xd4\x8e\xd8\x04\x56\x93\x26\x81\xb4\x15\x7d\xa3\x8b\xd3\x9a\xc4\xbb\x75\x5b\xa6\x6a\xbe\x45\x07\x63\xa7\xa2\x44\x28\x65\x06\x63\xc0\x30\x25\x17\x2f\x02\xb0\xc2\x11\xd4\x41\x3a\x56\x92\xe3\xec\xe8\x2e\x92\xb8\xf4\x02\xa5\xc9\x67\x3f\x5a\x63\xcf\x8f\x93\x5c\x5d\x54\x07\x66\x41\xf8\x6f\xa9\x05\xbf\x7c\x23\xbd\x5e\xeb\xe7\xe6\xa8\x6c\x99\xe3\xb1\x34\x04\xe6\x68\x85\x28\x46\x10\x6c\xea\xfd\x81\x54\x72\x28\x06\xd2\x55\x34\x03\x85\xf1\x7a\x1d\x7f\x37\x37\xf0\x8e\x08\x23\x55\x14\x94\xa4\xb4\xe8\x8c\xb7\x36\x64\xeb\x6a\xdd\xa0\xdf\x0e\xbf\x1a\xa9\xe5\x6e\xde\x7c\x06\xc6\xea\xb5\x6c\x1f\x74\xd7\xcf\x82\x63\x90\x61\x89\x60\x09\x76\xd8\x5b\x12\x3b\xa3\x63\x0f\xa1\xd3\x80\x19\x36\xb5\x2b\x6e\x3d\x6c\x80\xaa\x8c\xfd\x8f\xb1\x4a\xfe\xa1\x73\x51\xd2\xba\x2a\x53\xc7\x2d\xf0\x91\xb1\xe0\xa3\x6e\xd6\x19\xbd\xa5\x0d\x7b\x3a\xd3\x88\xcc\x15\xfa\x57\xb1\x0e\xb6\xc3\xcb\x31\x1a\xed\xe0\x6c\xa2\x30\x1f\x75\x05\xca\xd0\xfc\x85\x36\x6a\xfc\x1b\xa0\xbf\x8a\x95\x9c\xc9\xbc\x59\xaa\x6b\x2f\xd9\x6a\x2e\x25\xa9\xc7\xbe\xd1\x63\x87\xad\x86\xf8\x83\x20\xb2\xcd\x70\xf4\x13\xcf\xf2\x24\xc5\x75\x67\x80\x2b\x1b\xf7\x92\xe6\x1b\x3b\x6f\xaa\x9d\xa6\x9b\x5b\xb9\x1f\x41\x81\xd5\xa1\xed\x2e\x72\xcd\x61\x6b\x08\xfc\xa5\x60\x1e\x86\xc2\x6d\x49\x91\xbe\x8a\x20\x34\x05\x33\x28\x5d\xfc\x74\xdd\xf4\xbe\x5d\xc1\x9b\x6e\x71\xa6\x9b\xac\x81\x6a\xc6\x71\xaa\xe7\xf2\x5c\xb4\x36\xd4\xe0\xf9\xbf\x7b\x38\xf8\x2e\xaf\xfc\x94\xb7\x44\x4f\xe9\x8d\x1a\x48\x3b\xa7\xa8\x69\x01\x6f\x60\xac\x1f\xfc\xcb\x55\xe3\x4c\x42\xda\x94\xd1\xed\x8b\x1f\xe3\xa4\xad\xf4\xba\xa1\xaa\x28\xea\x87\x44\x40\xdc\x30\xb6\x4f\x60\x6b\x56\xdf\xbb\x24\xcd\x87\xd8\xaf\xd8\x16\x82\x8f\xee\xd9\x42\xf0\x2f\xca\x16\x82\x2f\x82\x7d\xe0\x5d\xda\x3e\xf0\x76\x8f\xdd\x35\x72\x6b\x6f\x33\x8f\x60\x2b\x78\xcc\x65\x01\xd2\xeb\x89\xdc\xb8\x38\x79\x53\x34\x73\x9a\x18\x8b\x6c\x09\x15\x76\x48\x2b\xf1\x9c\x4c\x92\x6a\xe4\xb5\x65\xf4\x63\xde\x36\xe1\xd4\xdb\x35\x14\xad\xa4\x6f\xd0\x4e\x5a\x6a\xe4\xd0\xb2\x30\xac\x89\x43\xed\x42\xf4\x4e\x48\xf9\x88\xa4\x31\x9e\x0d\x2d\xcd\xa4\x47\x20\x32\x04\x23\x89\xb1\x86\x68\x3f\x6c\xe0\xdb\x32\x6d\xde\xb4\x75\xde\xb4\x75\x7e\xd1\x6c\x9d\x4f\x79\xed\x9d\xcd\x69\x73\xfe\x7d\xc6\x9c\xa6\xf7\x55\x29\x2a\xad\xbc\x79\xca\x36\xb6\x6f\x1f\x73\xee\x20\x43\xbb\xf3\x6c\x9a\x26\xa9\xff\x47\xb5\x60\xc1\xfa\xbb\x38\x03\x44\x4c\x1e\x3c\x19\x43\xce\x1b\x1c\x6e\xed\x3e\x72\xc1\x69\x41\x62\xb6\x9b\x7b\xf0\xbe\xad\xc6\xfe\x95\x57\x00\x04\xfd\x90\x17\xbc\xd5\x43\x50\x7e\x4a\xf8\xd6\x0b\x62\x64\x0d\x73\x66\x63\x2f\x94\x36\x36\x9d\x90\xb4\xd0\x28\xd9\x29\x4a\xd6\xd7\x65\xbb\xce\xb3\x84\x87\xb9\xde\x74\xb6\xf7\x30\x93\x80\x04\xb4\xe9\xa4\x30\x95\xb0\x4c\xc6\xf3\xb0\x2b\xfd\x87\x9e\x3e\xdc\xd2\x57\xad\x6a\x3c\x25\xec\xd7\x96\xc8\xec\xbe\x35\xd9\x17\x0e\xd8\xf4\xf0\xdb\x14\x37\xb7\xb4\x08\x7e\x6f\x88\x64\xfe\x77\x07\x82\x65\xfb\x81\x1b\x46\xab\x7f\xa9\x17\x09\x21\x96\xda\xdf\x0e\xb3\x16\xa5\xb7\x61\xb2\x80\xc8\xf9\x14\x54\x75\xdd\xdb\x0f\xeb\xcb\x8d\x7b\xfe\xf3\x7d\x37\x65\xe3\x5e\x65\x63\x9f\xd1\xc8\xfa\x57\x83\x7f\x8c\xff\xaa\x9e\x32\x47\xbf\xbf\x31\x5a\xd8\xe1\xa5\x72\x53\x24\xef\x45\x24\xaf\xee\x2c\x92\x67\xfc\xa9\x2a\x0f\x87\xbd\x33\xcb\x22\xf8\x1b\x6e\x67\x5f\xb1\xcd\x25\x2d\xf3\x3f\x77\x5b\xf0\x37\xb5\xb3\xb6\xa9\x46\xf0\x56\x12\x45\xd2\xf8\xda\x8b\xdb\x3f\xd8\x09\xdc\xfc\x5a\x8a\x6f\x33\xce\xa0\xb3\x68\xb7\x99\x65\xfc\xff\x63\xef\x4d\xc0\x24\xb9\xaa\x33\xd1\x2f\xb2\xaa\xba\xbb\x6e\x4b\x02\x62\xc6\x33\xf3\x8c\xe7\xf9\x4e\xc8\xb8\xbb\x44\x56\x56\x6f\x6a\x49\x8d\x90\x28\xf5\x82\x0a\xf5\x52\xaa\xaa\x16\x66\xaf\xa8\xcc\x9b\x95\x41\x45\x46\xa4\x22\x22\xab\x3a\xc5\x60\x23\x04\x03\x06\xc6\xec\x3c\x28\x16\x83\x6d\x04\x02\x06\x8f\xcd\x66\x56\x03\x7e\x5e\xb0\xc1\x30\x5e\xb0\xdf\x78\x81\xf1\xb0\x3c\x83\x17\xc6\x60\x6c\x7a\x6c\xbf\xf7\xdd\x73\xce\xdd\x22\x33\x6b\xe9\x6e\x49\xd8\x5f\xd9\x1f\xea\xca\x58\x6e\xdc\xf5\xdc\x73\xcf\xf2\xff\x40\xd1\x7d\x8c\x07\xed\x5e\xbe\x5a\x0f\xaa\x8c\x73\xb4\x2f\xe5\xc7\xf8\xd3\xc0\xcc\x81\x06\x9d\xcb\x32\xe9\x68\xa3\xce\xe5\x18\x74\x38\x7f\x6e\x75\x8b\x15\x3a\x5c\x3b\xbc\xe5\x6f\xdf\x74\x78\xe8\x97\x6f\x38\x6a\x7d\xd8\xb5\xe5\xdc\xb7\x77\x47\xfa\xed\x68\x86\x3b\x5e\xf0\x2b\x7a\xca\x7d\xef\x28\xdb\x9d\xa3\xf0\xf1\x7f\x66\x34\xf8\xd2\xc8\x42\x4b\x28\xbb\xad\x8b\xc9\x46\x96\xea\x6e\xa2\x56\x4d\x1c\x73\x7a\xb3\x66\x99\xaa\x81\x89\x0a\x19\x19\x20\xe8\x8d\x1e\xe9\x4f\x60\x9e\x99\xcd\xd1\x72\x98\xb7\xc2\x4c\xd4\xf8\xb4\x72\x9a\x28\xc8\x7a\x30\xaa\xeb\xc4\x6a\xb0\xd4\x55\x09\x39\xaa\x69\x11\x22\xa1\x2d\x12\xd0\xd2\xfa\xee\xc9\x69\xb4\xdf\x31\x53\xd6\xe5\x33\x30\x25\x4d\x32\xb6\xc6\x8e\xc9\x27\xd0\xc5\x42\x61\x8c\xe4\x47\x51\xf5\xc1\xb4\xc6\x46\x94\x77\xe2\xb0\x87\x1e\x50\x53\x86\x6a\xa6\x82\x96\x32\x77\xc8\x0d\x70\x36\xb5\x1a\x16\xc7\xca\xb9\x14\x25\x18\x2d\x6a\x75\x60\xd2\xe0\x67\xcb\x16\x5c\x07\x51\x0b\xbf\x55\x43\x06\x43\xc7\x0f\xa1\x30\xf2\x68\x3f\x92\xe7\xf1\x2c\xca\x85\x15\x92\xb0\x7d\x0c\x1c\xd7\x05\x72\xd1\xbb\x73\xf3\xcd\xb8\xe6\x57\x07\x6d\xc6\x7a\x2b\x2d\xef\xc4\x3f\x33\x3a\x30\xf3\xc5\x09\xe2\xf2\xff\x71\x24\xb8\xc9\xb9\x32\x8c\x03\xde\x86\x6f\x36\xcd\xb6\x36\x92\xf7\x8d\xb0\xd7\xb8\xd4\xfc\x2f\xac\x04\x3f\xa0\x98\xf9\x55\xd8\x1c\xe0\xc8\xda\xdd\xf5\x04\x76\xcb\x70\xa0\xbc\x0d\xd6\xbc\x43\x8d\xbf\x11\x33\xdf\xb8\xbf\x1b\x49\x45\xd9\x45\x8f\x0f\xe5\x0a\xdd\xe5\x8f\xb6\xc3\x0e\x7b\x50\x78\xf6\xdf\xe0\xb1\xab\xe2\x34\x6c\xdc\x46\x8e\x0a\xff\xc5\xde\x86\xa9\x7e\x38\x4e\xa7\xad\x37\xc8\x96\x74\xa7\x7d\x6d\x30\xfa\xa5\x1b\x7b\x27\xbf\x3a\xa9\xfc\x23\x80\x55\x90\x26\x42\xf3\x4b\x26\x45\x8d\xbd\xb9\x32\xd0\x6b\x77\x3a\x6a\x47\xc5\x5c\x98\x2c\x43\x6c\x8e\xff\x77\x5e\x70\xd6\xbd\xa4\xb5\x82\x90\xb7\xa3\x64\xaa\x1d\x5e\xc0\x9c\x02\x84\x44\x75\x12\xdb\x15\x0b\x28\x40\x03\xa4\x09\x4c\x5b\x79\x14\x43\xf0\x54\x67\x0e\xbd\xdc\x63\x2f\xf3\x18\xdd\xf1\xef\xf5\x82\x5b\xe1\xab\x5a\x4c\xea\x6c\x56\x5d\x97\x99\x42\xb4\xb5\x65\x55\xbb\x95\x54\xf6\xc3\x25\x2c\x4c\xb7\x68\xf6\xf1\xab\xd8\xe4\xc6\xf0\x09\x56\xc4\xc9\x6c\x58\xb4\xfc\x97\x5e\x15\xa4\xa5\x6b\x26\x14\x06\xf0\xc3\xe5\x15\xf2\x6d\x2a\x44\x0e\x13\xb6\xd0\xcd\xe2\xdc\x84\xc9\x38\x31\xe8\xcd\x34\x5b\x0b\xb3\x46\x5f\xa4\x4d\x6d\xdd\x53\xe0\x0f\x4e\x6f\xde\xbb\x97\xfd\x9c\x67\x70\x21\x5e\xbf\x91\x21\x73\x73\x5c\x88\xa7\x1a\x78\x51\xa3\x0f\x5a\xf1\xe1\x6a\x85\x1b\x85\x24\xa5\x3d\xa3\x40\xa0\x63\x88\x8b\x50\xce\x76\xbb\x2d\x35\xf6\x96\x0a\xe1\xd3\xbd\xb6\x12\xbc\xa8\xa2\x10\xea\x06\x39\xe4\x31\x12\xba\x89\xec\xc8\x6e\xa4\x87\x1d\x18\x13\x61\x48\x85\x32\x85\x58\x64\x0e\x8d\x28\x57\xd4\x5a\x5a\x87\x32\xdb\x78\x18\xf3\x40\x7e\xc2\x04\xe9\x84\xfc\xfc\xdc\xe9\xa1\x81\x3f\x4e\x30\xf7\x72\x94\xa8\x71\xdd\x37\xb5\xaf\xc6\x9f\x0c\xdc\x49\x76\xd0\x08\xa0\xca\xc3\x2b\xf0\xed\x72\x0b\x9c\x58\x15\xc7\x52\xf3\xc1\xdd\x6c\x8f\x7c\x71\x41\xca\xaa\x07\x76\x07\x6f\xdc\x3d\x4b\xbf\xec\xb0\x60\xe5\xc3\xc8\x3a\x99\x28\x1c\xd3\x38\x74\xa9\x9a\x55\x58\x6d\x78\x59\xe5\x14\x0c\x22\x7d\x26\x32\x2d\x7e\x9d\x3c\x63\xd5\x8b\x63\xfc\x8c\x8e\x30\x10\xd0\x29\x30\x16\x42\xde\x8b\x7b\x35\x7e\x1d\x9f\x85\x98\x11\xf3\x9c\x8e\x81\x09\xcd\xe3\x18\x57\xc2\xf3\x4e\x1c\x15\xb2\x2b\xa1\xa3\xce\xa8\xe9\x0e\x44\x58\x0d\xa8\x4d\xa2\x56\x0a\x51\xd8\xca\x87\xf5\x9f\x61\x1e\x49\xf5\xc8\x7d\x00\xe6\xa2\x12\x15\x8c\x6b\x61\x01\x8e\x32\xbd\xd7\xc3\x2b\xfa\xf3\x10\x61\x3f\xb5\x4f\x11\x73\xa5\x99\x2c\x55\x45\x54\x48\x1d\x9e\x71\x12\x5c\x52\xa2\x61\x0b\xa4\x18\x15\xab\x22\xeb\xf1\x8e\x22\xa8\xc3\x1a\x4c\xae\x45\xb9\x8a\x9c\x81\x50\x05\xea\x53\xc6\x75\x91\x88\xaf\x48\xe1\x62\xf2\x6c\x4b\x72\x3a\xcc\x0b\xdd\x0e\x1d\x98\x55\x50\x5c\x8e\xd4\x4c\x14\x1d\x76\x3a\xe0\x05\x83\x4a\x0d\x2f\x55\x29\xf3\x00\x22\xb2\xa8\xf6\x18\x00\x33\xd5\x4c\xd3\xa9\xa5\x30\x53\x8d\x12\xb9\xbe\x34\xb5\x14\xde\x53\x22\x98\xc3\x37\xd5\x03\x4b\xe1\x3d\x13\x35\x76\x5d\x09\xd2\x49\xf9\x61\x8e\x21\xf3\xd3\xc6\xf3\x0e\x5c\x7c\x1d\x8c\x48\x2b\x4a\xf8\x49\xfd\x58\x51\x72\x6a\x02\xa7\x19\xe1\xe1\x43\x4f\x28\xfe\x34\x35\x81\x65\x8f\x64\xf4\x98\x6c\x35\x78\x0e\x81\x69\x4f\x8a\x9f\x59\x1a\x8a\x0c\x67\x30\x76\x29\x82\x2e\xb0\xf2\xe7\x50\xe9\x25\xb2\x58\xd0\xb0\xd1\x11\xab\x96\xac\x02\x6b\xb0\x53\x87\x06\xf7\x85\xb3\x70\xff\x71\x9c\x3d\xd6\x12\xb3\x9d\x34\x8e\xea\x3d\x2d\x62\x67\xd3\xc6\x3c\xd1\xc7\xcc\xc2\x1d\xff\x73\xe3\xc1\xeb\xbd\xbe\xcb\x7c\x39\x5d\x15\x19\x6d\xf5\x21\x82\x7f\xc9\x0a\xb4\xc3\x15\x51\xc2\xe1\xb1\x12\x8b\x54\x19\xfc\x78\x9a\x14\xe2\x02\xa1\xa8\x2a\x09\x1c\x76\x3a\x71\x84\x6d\x0d\x09\x9a\xb6\x61\x94\x76\xd9\x50\x0d\x56\x16\x25\xfc\x60\xed\xd0\xc1\x5a\x19\x2e\xe2\xd9\xe4\xcb\x5b\x1a\x7e\x6a\xdb\xb4\xc5\xe0\xcf\xfb\x0f\x79\x39\xf4\x17\x5f\x33\x1b\xf9\x8e\x91\x62\xc7\x48\xb1\x63\xa4\xb8\xb2\x70\x11\x4b\x9b\x9f\x39\x6f\xf5\x1f\xaf\xcf\x9c\xb8\x24\xf5\xb9\xb3\x6f\x25\x0f\x44\x8a\xf8\x1f\x8f\x74\x03\x34\x34\x68\x34\xe0\x45\x64\x51\x2a\xdf\x87\x1d\xc0\xff\xe0\x23\x83\xe7\x38\x57\xf4\xa2\x56\x61\xee\x04\x04\xd4\xa1\x87\x08\x20\x10\x91\x95\x53\xca\x73\xa2\x5b\x94\x0c\xa9\x32\x0b\x17\x34\xa5\x2c\x69\x3c\x61\xd2\x23\x22\x43\x7a\xb2\xb6\xee\x21\x7c\x84\x23\xe4\x3e\x7a\xcd\xce\xba\xd9\x59\x37\xae\x71\xef\x05\x15\xf6\xc8\x4e\x26\x44\x1b\xb2\x27\x69\xdf\xfe\x6b\x2f\xf8\x1f\xde\x6c\xe9\xaa\x3a\xb6\xd2\x2f\x50\x21\xe9\x91\x64\x59\xa5\xef\x15\x2d\x2e\x8f\x23\x99\x9e\xbb\x18\x5a\x96\x36\xf9\x59\xa9\x65\x56\x39\x95\x7a\x5a\x3e\x34\xab\x9f\xb1\xf5\x90\x41\x4f\x48\xd5\xb2\x9b\x98\xf0\x2a\x0d\xa6\x27\x17\xe6\x64\x2c\x9b\x5d\x05\xb2\x68\x1d\x6e\x72\x36\x4d\x66\x75\xed\x74\x31\xc4\x2b\x3d\x09\xbc\xd2\xf6\xd8\xbe\xd3\x53\x78\x2b\x6f\xd1\xe4\x5a\x2f\xf6\xcc\x42\x53\x9b\xae\xbb\x5a\x4d\xb0\x97\xe5\xcc\xd1\x8f\x80\x82\x02\xfd\x92\x89\xba\x88\x56\x85\x02\x38\x55\xa1\x90\x85\x83\xd8\x16\xe5\x24\x02\x50\xb7\x8f\x00\xf7\x1e\x79\xae\x9d\x8c\xe8\x1d\xdd\xe1\x32\x75\x87\x97\x7a\x6c\x2f\x82\xf7\x22\xaa\xcf\x7f\x0c\x52\xeb\x27\x9d\x82\xc2\x6c\x29\x2a\xb2\x30\xeb\x29\xd1\x08\xa3\xd9\xcd\x91\x8f\xa2\x93\xa5\xab\x51\x43\xe4\x7c\xb9\x1b\x35\x44\x0c\x1d\x9e\x26\x6a\x7c\xfb\xe6\x89\x15\x68\xd8\xcd\x4b\x87\xe1\xfb\x47\xd8\xd5\x88\xe1\x48\x8b\xc0\x7f\xcd\x48\xf0\xc2\x11\xe7\x92\x8e\xc7\xcb\xad\x8c\xe6\x28\xe7\xee\x06\x33\x2c\x9a\xb1\xb0\x40\x53\x75\xbd\x60\xf9\xca\xb9\x49\x78\x97\x86\x85\x5b\x6e\x26\xe5\x69\x7e\x4e\x85\x85\xba\x5f\xa4\xed\xc7\x04\xfd\x2e\x3a\xd5\x5e\xac\xf1\xdb\xd3\x35\x5c\xf7\x51\x13\x01\x68\x8b\x16\x64\xf4\x94\x4a\x12\x39\x02\xca\xe5\x3a\xb9\x2a\xca\xca\x85\xd1\xa2\xcf\x05\x26\x80\x01\x9f\x13\xd8\xbb\xdb\x61\x1c\xcb\xf9\xa7\x57\x6a\xde\xad\xb7\x4a\xb8\x98\x7d\x9f\x53\x07\x07\x00\x87\x18\xd2\x49\x0e\x8d\xf8\xf6\xa3\x7e\x8c\x76\x50\x0a\xfc\x71\xea\x52\x36\x74\x7f\x77\x2f\x3b\xb2\x11\x7e\x27\xa1\x03\xce\x75\x63\x41\xe0\x80\x64\xfc\xfe\xf8\xde\xe0\xeb\x95\x61\x77\x5d\xfb\x2a\x39\x2f\x90\x37\x0a\x72\xef\x30\x5e\x1a\xc5\x19\xfc\xad\xc6\x16\xac\x3a\x9d\x58\x14\x00\xf8\x2c\x12\x70\xcf\xa8\x4c\x20\xf2\x01\x69\x68\x4f\xe2\xe0\x02\xf9\x01\x3c\x72\x0a\x00\x58\x65\xde\x00\xce\x72\x0f\xa3\x6b\xe4\x90\x77\x44\x16\xa1\xc1\x8d\xc2\x86\x28\x3b\x0f\xc2\x84\x6e\x23\xa7\x8c\x0b\x3d\x8a\xf5\x05\xce\x73\x60\xe6\x5e\x15\x30\xb9\xb0\x21\xe4\x32\xc9\x11\xbf\x04\xc9\xc4\xe5\xbe\x0a\x31\xf6\xf2\x6c\x98\xe7\x5d\x8a\xf0\xc9\xb1\xa7\x78\x2b\xa4\x35\x60\xa0\x41\xaa\x5c\xac\x8a\x04\xcd\x19\x61\xa1\x39\xc9\x4d\x57\xd4\xd6\xbd\xab\x95\x68\x81\xae\x5e\xf7\x1e\x99\xa4\xc9\x9c\x7b\x89\x99\x17\x1c\x35\xec\x35\x7b\xd8\xcb\x2a\xec\x11\xa6\xa9\x18\xc8\xf5\xf7\x5e\xf0\x0d\xef\xa4\x7b\x11\x46\xc1\xb8\x81\xea\x69\x7b\x89\x20\xce\xb0\x43\xe1\x4b\x48\xfc\xaf\xf9\xc1\x74\xdc\x57\x5a\x07\x3b\xba\xee\x5b\xe8\x20\xf3\xd5\x2a\xae\x93\x10\xc5\x9d\x81\x67\x25\x81\x20\xf2\x64\x9f\x89\xe0\xee\x7b\x17\xb3\xfa\xc3\x82\x3b\x8d\x96\x97\xa7\xd2\x4c\xee\xbe\xee\x75\x0a\xf3\xb2\xba\xd0\x96\x81\x7f\xe2\x31\xab\xb3\xfc\xdf\xf6\x82\x5f\xf6\x66\xcc\xc4\x03\x3e\xf8\xae\xd9\x3e\x69\x0e\x64\xa2\xe8\x66\x89\x85\x60\x52\x0f\xe3\x98\xb8\xed\xf5\x67\xf4\x0e\x0d\x54\x85\x98\x7d\x13\xf7\x9c\x88\x35\x28\xd6\xe9\x03\xa7\x6b\x54\xf4\xa9\x73\x7f\x50\xff\xe4\xf6\xec\x75\xb0\x24\x5e\x57\x61\x7d\xf3\xc3\xbf\xb7\x12\xbc\xdf\xeb\xeb\xa8\x92\x6f\x20\xac\x2b\x98\x15\x33\x63\xa3\x5c\xe5\x26\xca\x29\xdd\x11\x59\x33\xcd\xda\x72\x4d\x26\x69\x32\xa9\x77\x3c\x3c\x26\x60\x39\x59\x43\x64\x68\xb2\x82\x3a\x47\xcb\x09\x84\x1b\x27\x45\x15\x73\x0f\xc9\xb0\xdc\xe8\x02\x05\xa6\xa6\x5f\xeb\xa4\x79\x1e\x2d\xc5\xfd\x23\x67\xdc\x10\x8f\x67\x8f\x63\x37\x6d\xc4\x80\xe6\x0a\xaf\x52\x73\xd9\x4f\x56\x98\xbb\x90\xfc\xbf\xf3\x82\xff\xe2\x5d\xb9\x2e\x79\x88\xbb\x63\x63\xd4\xeb\xa1\x58\xcc\xd8\x17\xa3\xec\xc0\x06\x0f\xa3\xc5\xa9\xd4\x81\xfe\xef\x8d\x04\xa7\x4b\xd7\x78\x2b\x8d\x1b\xb9\x1d\x26\xa9\x10\x37\x34\x91\x1a\x2e\x67\xe5\x87\xb6\xa7\x8d\x3c\x37\x8a\x6c\xc9\x75\x64\xfd\x75\x85\xfd\x96\xc7\x1e\x61\xcd\xe0\xf3\x73\xa7\x73\xff\x43\x5e\xb0\x6e\x4f\x60\x79\x91\x4e\x93\x94\xdd\x16\x66\x45\x14\xc6\xe8\x05\x42\x7b\x1e\x72\x23\x90\xa6\x82\xea\x06\xc0\xdc\xc2\xb9\x8f\x5f\x47\x82\x1d\x87\x12\x2d\xb8\x98\x2d\x69\x12\x9c\xab\xbc\x19\xc9\xd5\x98\x17\xa2\x63\x9b\xc1\x07\x20\xdb\x9a\x71\xb9\x9a\x39\x30\x8a\x6f\x91\xda\xbe\x6c\xa6\xff\x1a\x2f\xb8\x60\xa0\xa6\xd5\x14\xb3\x20\xa7\xed\xce\xd1\xb0\xd3\xb9\x83\x3b\xdd\x81\x6c\xea\x4e\xb7\xb0\x50\xa6\x31\x9f\xbc\x25\xc2\x46\x55\x41\x25\x6d\xa7\x82\xff\xe5\x11\xec\xd8\xa5\xf1\xa2\x82\x87\xf3\xaf\xae\x09\x9e\xb5\xc1\xfd\x12\x75\x85\xca\x34\x68\x76\x11\x67\x39\x04\x83\x2c\xd9\xbc\x87\x14\x53\x5b\xf7\xae\x81\xbf\x16\x00\x55\x6c\x4e\x34\xd7\xbd\xbd\xed\xf0\xc2\x40\x5a\xe3\x2f\x5d\xcd\xde\x5b\x61\x7b\x54\xd2\x82\xff\xb6\x0a\x3b\xbd\x2d\xd6\xc4\x21\x95\xb8\x8d\x0a\x0c\xbe\xe0\x69\x70\x05\xad\x72\x90\x80\x20\x5a\x42\x1b\x7c\xa1\x30\x60\x68\x2a\xb4\xe2\x3c\xa4\x69\xf3\x13\xe9\x5a\xc2\x1b\x00\x9e\x05\x22\x66\x3f\x7c\x87\x6e\xc2\xdf\xf0\x04\x28\xa2\xb9\x4a\x20\x8f\x56\x45\xdc\x9b\x80\xd4\x56\xc8\x79\x52\x80\x4a\x4a\x9b\xbc\x7d\x76\x7a\x1e\x6b\x31\xa7\x99\xc5\x90\x29\xb3\x6b\x15\xcc\x1b\xb2\x64\x39\xfb\xe1\x84\xc0\x1e\xf0\x98\xdd\x9f\xfe\x1b\xf4\xb1\xf4\x3e\xcf\xba\xae\x43\x6e\x3a\x1d\x91\x59\xee\xea\xc2\xe1\xf5\xd5\xdc\xc6\x8e\x17\xd3\xe2\x06\x96\x6a\x86\xaa\x13\xa8\x13\x75\x6d\x82\x89\x91\xd5\x24\x2c\x78\x3b\x4a\xd4\x67\xdd\x13\xe9\xbd\x63\x6c\x37\x31\x6c\xfa\x7f\x3b\x1a\xbc\x6b\x54\xd1\x6d\x3a\x4a\x67\x6e\x67\xb9\x60\x37\x50\x5d\x00\x2c\x09\x08\x23\xc2\xb8\x0e\x59\x23\xce\xbc\xa4\xda\x73\x64\x91\xda\x5f\x00\xf2\xc2\x85\xa8\xdd\x6d\x97\x6e\x85\xf5\x2c\xcd\x31\x73\x5d\xd5\xc0\x56\xf3\x27\x6a\x1c\x36\x81\xc1\xe5\xa2\xfe\x50\xa7\xa4\x15\x8a\x29\xea\x69\x52\x7a\x59\x6b\x0d\xea\x66\xcd\x20\x3c\x74\x28\x8c\x23\x97\xb6\x93\x4c\x11\xfd\x9c\xd6\xf2\xe0\x55\xe3\xfc\x64\xb6\x9c\x56\x2d\x6e\x52\xf8\x6e\x2e\x25\x75\x3d\x03\x84\xeb\x50\xb9\x0f\x1a\xa6\x92\x51\x82\x37\x1b\xb8\x29\x01\x7b\x95\x3c\x40\x84\x35\xce\xe7\x85\x20\xb7\x69\x23\x5a\x8d\x1a\xdd\x50\x75\x04\xb7\x31\xba\x09\x3f\xce\x65\x03\x21\x1a\xdf\x56\xba\x86\x98\x6a\xc0\x81\x9b\x36\xd5\xfb\x50\x2f\x39\xe1\x53\xf0\xef\x0f\x99\xea\xf4\xb0\xea\x74\x3a\xaa\xdd\x78\xe0\x31\xc3\xe8\xc9\xb7\x41\xde\x31\x9c\x4d\x55\x8a\x34\xf6\x37\x15\xb6\xd7\x9a\xa0\xfe\x9f\x55\xd4\x7a\xf9\x6c\xc5\xba\xae\x95\x09\x30\x52\x5d\x81\xf5\x22\x97\x6d\x8d\xcb\x25\xd3\xb0\x6c\x58\x07\x91\xc6\x8f\x97\xbe\x6c\xe9\x28\x4b\x82\x1f\x50\x0e\xd3\x30\xee\xb4\x42\x65\x9b\x02\x33\x96\x12\x1a\x62\x21\x7d\xaa\xc8\x52\xc8\xa5\x4f\xc2\x25\x48\x72\x95\x67\x28\x9b\x88\x02\x4d\x8a\xe8\x17\x24\x4d\x95\xc6\xc1\x39\x81\xc9\xe9\x41\xc2\x50\xd6\xa4\x8e\x38\x6d\x39\x8f\xd3\x64\x19\x34\x5d\xbb\x4c\x2a\x00\xa7\x71\x64\x65\xbb\xba\x0b\xff\x3f\x55\x58\x69\x17\xf0\xbf\xed\xb1\xdb\xb7\x35\x86\xc7\xe5\x9a\x25\xe3\x55\x99\x6a\xf5\x7e\xcf\x2d\x9d\xab\x48\xea\xd4\x5e\x82\xc6\x30\x9d\xe2\xa0\xe0\xca\x88\x0c\xf2\x63\xa1\xc8\x6a\x8d\xd0\x51\xab\xce\x36\x9a\x40\xd8\x36\x2c\xac\x9c\xaf\x09\x79\x96\x40\xc6\xec\x3a\xb1\x90\x12\x46\x07\x9e\xa0\x2d\xd9\x51\x63\x1f\x1d\x63\xc1\xe6\xd9\xc4\xfe\x6b\xc6\x82\x9b\x4b\xd7\x50\xf1\x28\xba\x9d\x58\x94\xd5\x34\x8a\x75\x34\x09\xc5\xb5\x75\xaf\x12\x75\x9c\xad\xf5\xd3\xa3\xec\x28\xdb\xa3\x88\x5e\xfc\xeb\x82\x7f\xbf\x40\x40\x0f\x8e\x61\x51\x99\xde\x6d\x1d\xe3\xad\x15\x56\x89\x3a\xfe\x1b\x2a\xc1\x4b\x2b\x0b\x88\xa8\x52\x7e\xbc\xc6\xcf\x10\x88\x1f\xa4\xe8\xa4\x9d\xa5\xb0\xbe\xc2\xf7\x1f\x3c\x74\x43\xed\x80\xfc\xff\xa9\x1b\x27\xa4\x26\x94\xac\x4c\x22\x3a\xdc\xfe\x83\x47\x6f\xaa\x1d\xba\xfe\x08\xdc\x3b\x78\x74\x02\x52\xb5\xad\xfb\x20\x55\xeb\x72\x92\xed\xdf\x7f\xe8\xd0\x11\x2a\xe4\xd0\x11\xb9\x7b\xce\xae\x1e\xc5\x25\x92\xa7\x04\x92\x29\x4f\x76\x5d\xa4\xb3\x45\x64\x1b\x3a\x6c\x51\x18\x46\x1c\xf3\x4e\x1c\x16\x52\x82\xe5\x35\x3e\x1d\xe7\x69\x55\x13\xb6\x5b\x0a\x9c\xd4\xd3\xd3\x44\x24\x05\x29\x6d\x70\x6f\x12\x20\xe4\xaa\x3a\x00\x14\xbe\x8e\x49\xfb\x76\x17\xad\xb1\x3d\x49\xda\x10\x90\x78\xbc\x12\x3c\xd3\x80\x8b\x9e\x4d\x1b\x88\xa4\xa2\x29\x4d\x4d\x97\xa1\x0d\xc5\xe5\x68\xd2\x61\x2d\x56\xb0\x2c\x76\x09\x38\xac\x21\xc9\xd6\xfe\x70\xcc\xc6\x0b\xbd\xa4\x9e\xb5\x85\xbc\xf5\xf2\xca\x79\xac\xfe\x53\x7e\x81\x9c\x35\x68\xb5\xd4\xa9\x5b\xaa\xc6\xec\x1d\xbb\x9c\xd9\x0b\xb5\x51\x07\x8e\x79\x6d\xc5\xf2\x9f\xb7\x2b\x58\x30\x3f\x2d\x9b\x24\x2a\x5a\xfa\x46\x3d\x4d\xf2\x22\x0b\x35\x4b\xb3\x2c\x4f\x23\xbf\x62\xf6\xd9\x5c\x37\x29\xa2\xb6\xc0\x60\x09\x17\xc8\x6f\x8c\x7d\xbd\x82\x34\xaf\xf3\x04\x18\xe8\x7f\xb1\x12\xfc\x52\xc5\xbe\x02\x8a\x7a\xae\x62\x61\x50\x39\x21\x28\x47\x85\x70\x09\xc7\xe1\x86\x0a\xd7\x53\xc7\x74\x18\x2a\xe7\xe3\x7c\x56\xca\x05\x85\x6c\x5b\xba\x6b\xe0\x87\x96\x74\x0b\x55\x90\x01\xf0\xc7\xaa\xa0\x2e\x83\xa1\x8a\x15\xc4\xd3\xa6\x53\x94\x53\xff\x28\xe7\x10\x4e\xa9\x11\x69\x10\x40\x52\x93\x6a\xd8\x0f\xd7\xf8\x74\xd2\xd3\x18\xac\xa4\xd2\xe8\x70\x65\x50\x0e\x70\x3f\x41\x3b\x3b\x81\xf7\x36\xc8\x96\x55\x7b\x57\xe9\x6c\x61\xf5\xb6\xd4\xca\xf7\x16\x69\x4c\x89\x79\xb9\xff\x96\x4a\xf0\x61\xcf\xba\x80\xa7\xb1\x4e\x47\x00\x30\xc9\x7e\x60\x61\x86\xf9\x63\x8e\xc6\x13\x70\xe0\x06\x27\x47\x37\x49\x34\x33\x73\x7f\x57\xaa\xcc\xc3\x86\x31\xb2\x41\x70\x07\xa8\xcf\x18\x32\xae\x66\x26\x1d\x1f\x69\xfc\xb0\x3a\xc6\xb3\xa3\xa2\x3b\x8a\x52\x0f\x3b\xba\xc4\x14\x9b\x64\x8f\xdd\x9c\xe4\x5b\x37\xf5\xa2\x77\xed\xd0\x68\xda\x71\x7f\x77\x58\xa4\xed\xa8\xce\xd8\xdb\x18\x3b\x65\xef\x67\xaa\x31\x99\x58\x8e\x20\x56\x96\x0e\xf6\x77\x85\x71\xd4\x00\x30\xa3\x27\x8b\xa5\x56\x9a\xae\x1c\xb7\xa9\xc4\x20\x29\xf0\x8b\xe3\xc1\xb9\xcd\x1f\x73\xcf\xa5\x1b\x3f\x3f\x98\x08\xe5\x6b\x3b\x44\x28\x97\xed\x31\x7a\x8d\xa6\xa6\x7d\x89\x17\xec\x3b\xbd\xb5\xd1\xb0\xa7\xe3\x02\x9b\x63\xb3\xc3\xd5\xa2\x4b\x9b\x46\x3b\xce\xfc\x1d\xae\x59\xd3\xb8\x8b\xde\x0b\xbc\xcd\x1d\x54\xa1\xff\xac\x21\x5c\xa9\x83\x27\x61\x39\x65\x7d\x53\x81\xc5\xd8\x67\xaf\x61\x87\x36\x74\x60\x19\x8a\x2b\xcb\x4d\xe5\xbf\xf6\x9a\xe0\xc5\x63\x83\xef\x71\x91\x74\xdb\xb0\x09\xe4\x8e\xdf\xc9\x32\x04\x1b\x2a\x00\x3a\x9d\x29\x1b\x30\xc1\x9f\x87\x06\x9c\x19\xf7\x66\xed\x3c\x28\x9b\x95\xfb\x3c\x15\x83\xfc\x5e\x72\x6d\xec\xcb\x4b\x9e\x29\x44\x3d\xdf\xdc\xc7\x05\xcb\xc7\xf2\x73\x0d\x69\xb4\xeb\x33\x96\xbb\xdf\xf9\x19\x10\xa0\x79\x2b\x5d\x9b\x6a\x45\x0d\x45\xa6\x96\x83\x9a\x5d\xa4\xfc\xee\x6e\x54\x5f\x89\x7b\x3c\x16\x05\x38\x2e\x92\x06\xf6\x47\x26\xc2\x5c\x9f\xf0\x29\xb4\xc0\x26\x18\x9f\xd1\x19\xf7\x67\xcf\x2d\xf0\xdb\xcc\x07\xb5\xeb\x03\x91\x44\x30\x21\x3d\x83\x83\xa3\xd3\xf2\x86\xa8\x47\x88\xa9\x1f\x2a\xc8\xb6\x30\xca\x05\x1e\x3f\xa1\xb0\x86\xe8\x74\x8b\x5e\x95\xd7\xc3\xba\xc5\x78\x3f\x95\x89\xd5\xb4\x6e\x79\x94\xea\x69\x96\x89\x7a\x91\x10\xf9\x64\x5d\x64\xb2\x7e\x03\x08\xd1\xf0\x71\x20\x73\x73\x28\xd4\x42\x82\x3f\xa4\x82\xf8\x5a\xd8\x43\xfd\x5b\x4a\xb0\x61\x95\x56\x14\x85\xb3\x33\x34\xb4\x03\x21\x6c\xee\xdd\xc3\xee\xb0\x64\xc6\xad\x97\x19\xff\xc3\x5e\xa2\xc0\x63\xee\xf5\xd8\x89\xad\xfb\x0c\x06\xcf\x16\x08\x3c\xbd\x09\x8c\xbb\xfd\xe6\x7f\x3d\xf0\x3a\xb2\x1a\xf3\xd4\x34\x14\x6a\x8d\xbd\xc3\x40\xc4\xbc\xc9\x63\xb7\x6d\xa3\x3a\x43\x1c\xce\xc1\x5d\xe4\x78\x86\x68\x9d\x38\x46\xb5\x54\x61\x65\xa3\x87\x18\x4e\xe9\xda\x6f\x39\x60\x65\x87\x7d\xeb\x79\x27\x74\x76\x27\x74\xf6\xe1\x84\x19\xe8\x6c\xbe\xc5\x9e\xf1\xef\x98\xd4\xe0\xc9\x83\xd6\x6a\x29\xe2\xc3\xec\xc0\xce\xda\xa2\x9d\x97\x7d\xf2\x2a\x76\xad\xb5\x00\xb3\xa5\xb0\xae\x0f\xe7\xc7\x91\x9a\x72\x2e\x8d\x85\xff\xfa\xab\x82\xef\x79\xd6\x05\xc2\x22\x20\x6a\x70\x0a\x91\x03\xfe\xd8\x30\xc6\x2f\x12\xb0\x3f\xc6\xf3\xa1\x6f\x02\x53\x42\xd1\x76\x61\x65\x43\x41\xba\x82\xec\x4f\xb9\x80\x43\x2e\x8b\xbf\x2d\xa2\x2d\x31\xe3\xd6\x47\xe9\x6a\x39\xde\x7e\xf5\x60\xed\xe0\x0d\xf2\x8f\x66\xb8\x8a\x3e\x18\x68\xc6\xa0\x06\x4f\xad\x1e\xb4\x0b\xc4\x65\x44\x74\x17\x60\xab\x14\x19\x9a\x96\x01\x9c\x1f\xcb\x3e\x74\xa8\x64\x43\x18\x97\x27\xdb\x47\x28\xc2\xb3\x28\x4d\xc0\x57\xba\x5e\x61\xd7\x0f\x15\x6c\x4e\xbf\x4e\xbb\x6f\x06\x5f\xf6\x4a\x57\x28\x48\x4c\x53\xf9\x62\x68\x52\xc9\x7e\xd7\x4a\xd7\xe0\x64\xde\x8d\x62\x75\x5a\x55\xfe\x1f\x58\x15\x56\x33\xc1\xa4\x3e\xe0\x1b\xca\xc2\x9e\x58\xef\xcb\x2d\xce\xe1\x36\x4f\xc2\x65\xb2\x0b\xa3\xeb\x8a\xec\x94\x20\x9f\xf0\x15\x6d\x90\x2f\xd2\x76\xc7\x9c\xa4\x4d\x29\x3b\x62\x75\x47\xac\x3e\x8c\x87\xb1\x96\xa5\x57\x3d\xfd\x72\xe3\xaa\x1f\xbd\x41\x58\x35\x7b\x9e\xa6\xaf\x5f\x0b\x8e\xe0\xe2\x40\x7d\x09\xe0\xae\x75\x74\xf3\xf0\x95\xba\x75\x48\x51\x47\xa2\x98\x62\x2f\x7a\xe9\xe6\x7b\xc8\x69\xff\x49\x3a\x8e\x70\xa8\xa8\xd4\xa7\x32\xab\x7a\x03\xd3\x16\xbe\xb7\x8b\xfd\x98\xa9\x98\xc1\x99\x9f\x94\x5d\x88\x0a\xaf\xee\x50\xe7\x01\xb3\xd1\x74\xa5\xe8\x50\x81\x1e\x16\x2b\x70\xee\xbf\x69\x57\xf0\x94\xe1\xb7\x1d\xc1\x41\xe9\xdc\xc6\xe7\x9d\xdb\x4f\xca\xde\x76\x0b\x2a\x99\x86\x7f\x71\x8c\xfd\x95\xc7\xc6\xe0\x55\xff\x2b\x1e\x7b\xf6\xb0\xae\xbf\xa2\x2d\x04\x37\x5c\xb0\x8a\x15\x76\xb5\xd5\x3a\xbc\x63\x96\x2f\x89\x36\xf8\x20\x0f\xf9\xe2\x14\xbc\xb4\x68\x37\x13\xf7\x08\x3c\x7c\xc2\x16\xb2\x68\xf9\xc4\xa6\x56\x0f\x2e\x82\x93\x4e\x71\x1b\xd7\xd8\x27\x46\xb4\x5e\xfe\xbe\x11\xb6\xf2\xd0\xb4\x18\x15\xf8\x5f\xa9\xd0\x78\x6d\xb7\xd1\xf0\x96\xd3\x6a\xca\x1e\x26\x17\x26\xe0\x8c\x97\xf9\xe1\xcb\xc5\x76\xb2\xa8\x1d\x66\x3d\x23\xda\xa2\xe5\x44\xca\x26\x6b\x6f\x93\xaf\x2d\xea\xaf\x15\x61\x72\x4f\xa8\xc2\x3b\xd4\xa6\x73\x68\xf3\x0f\x0d\xac\xf0\x80\xaf\x85\x49\xaf\x80\xbc\xcf\x94\xe2\xaf\xc3\x64\x0b\x35\x60\x9f\xd9\xd3\x47\xc7\x8f\x59\x9d\xea\x00\xb5\x90\xae\x88\xc4\x09\xe4\x7d\xdd\x9e\xe0\x44\xdf\x55\xe5\xb8\x36\xa1\xbb\xe0\x01\x95\x8f\x71\xb7\x50\x9d\x41\xee\x2c\x9e\x4f\xed\x66\xaf\x1a\x63\xe3\x61\xb7\x01\xc6\x88\xdc\x7f\xc1\x58\xf0\xf5\xd1\x69\xf5\x13\x2d\xfd\xf4\xcb\xc2\xac\xcd\x79\xbd\x95\xe6\x42\x9f\xdc\xac\x4f\x29\x26\x27\xd4\x47\xda\x9d\xb0\x88\x96\x62\x04\xf5\xc7\xa0\x1a\xf9\xbc\xd5\x0e\x34\xda\xcb\xdf\x35\x3e\x9d\xd8\xb8\xb8\xa0\x4c\xf5\x9c\x2b\x89\x49\xff\xce\x0d\x96\x56\xa9\x44\x38\xee\x86\xa6\x09\xe4\x14\x80\x6f\x80\x75\x86\xee\xd4\xf8\xb4\xda\x15\xfb\x0b\x81\x63\x3f\x3a\x89\x44\x61\x22\x55\x6a\xa6\x5c\x8a\x3b\xc7\x79\xbe\x8a\x16\x30\xa1\xe2\xd9\xac\x96\x0f\xe8\x3e\x1e\x59\x61\xaa\x0a\x9f\x05\xc6\xb3\xaf\xfc\x22\xe5\x22\xc9\xbb\x99\x30\x5c\x5a\x76\x2d\x4d\x50\xb5\xfe\x4c\xb8\x06\xa0\x38\x40\xfb\x66\x3f\x6a\x49\x17\x64\xb1\x2f\x7d\x51\x91\x3e\x02\xcb\xbe\xbe\xa7\xc7\x55\x80\xe2\x12\x14\x59\x57\x04\x55\x6b\x96\x45\x39\xe5\x98\xd9\x08\x06\xba\x4c\xea\x58\x0b\x7d\xd6\x32\xa7\x6c\x10\xe9\xb6\xcc\xae\x76\xbe\xed\xdf\x15\xdc\x3e\xed\x56\xc6\x12\x3f\xd4\x31\x58\xa1\x35\x79\x2c\x29\xd1\xb2\x84\x7c\x25\x49\xd7\x12\xb0\x1b\xb8\x31\xb8\xb7\xb3\x31\x30\xc9\xf9\xb7\x06\x87\x30\xb6\x7a\x68\xc1\x75\x39\xd2\xc9\x3e\xd0\x93\x20\x18\xde\xc5\x81\x5e\x63\xa3\xb2\x78\x3f\xdd\x00\xf7\xa4\x7f\x9d\x9f\xcf\x45\x36\x93\x34\xd3\xe0\x46\xf9\x97\x5a\xce\xea\xea\x40\x7e\x19\xca\x32\x51\xab\x86\x3d\x7f\xcc\x46\x9f\xb4\xd8\x54\xd1\x19\x17\xa5\xc9\x71\xad\xd1\x6b\x44\x19\xff\xb3\xa3\xc1\xd2\xc6\x8f\x94\xe2\x01\x01\xd5\x86\x92\x03\xcc\x7b\xf6\x99\x03\x67\x3e\xf9\xda\xd1\x89\xbc\xee\x8d\x4a\xe5\x6e\xdd\xa3\xed\xca\x11\x3e\x9f\x19\x61\xa7\xf5\x3e\x76\x5b\x70\xbd\x0b\x22\xac\x41\x76\xaa\x0a\xba\x61\x01\x92\x3b\x4e\x85\x71\x2e\xaa\xfc\x7c\x02\x43\xea\xf8\xc7\x6f\x61\xf0\x35\xff\x68\x30\xb1\x40\x81\x4a\x43\xaa\xaa\x0b\x77\xde\x7f\xad\xc7\xfc\x38\xcc\x8b\x85\x2c\x04\x58\xd1\x34\x59\x88\xda\xc2\xff\x89\x4b\x87\x0e\x3d\xb1\xa0\x80\x0c\x0a\x85\x21\xaa\x3f\xcd\x0b\xfd\x19\x05\xd4\x21\x1b\x4a\xdb\x2b\xec\x2d\xb0\xa9\xd4\xd8\x53\x0c\xe6\xea\xd9\x60\x7a\x9a\xb7\xba\xed\x30\x81\xc0\x04\x80\x9a\xa7\x7b\x6a\xe6\x1a\x38\xd6\xdc\xb2\xf1\x99\x8f\x39\x4d\x3e\xc5\x76\xa1\x1d\xd8\xbf\x39\x98\x42\x0b\x38\x58\x85\x55\xf4\x93\xae\xed\xbe\x9c\xda\x31\xb8\x9c\xaf\x56\xd8\xbe\x01\x93\x10\x1d\x01\x67\xc2\xce\x1d\xa2\xa7\x1d\xf7\x1f\xae\x04\x3f\x8c\x3f\x72\xa2\xa6\xa4\xa4\x57\xfd\x74\x6d\xdd\x1b\x59\x11\x3d\x17\xc4\xaf\xc2\x7e\x94\xc9\xab\xfe\x0f\x07\xfe\x02\xf1\x6c\x02\x7f\xab\x2c\xc9\xa9\xcc\x0b\x3c\xa2\x51\xff\x8f\x41\x6a\xc3\xc2\x93\xed\xa2\xd8\x36\x03\x63\xba\x2a\x32\x29\x44\xa7\x08\x3f\x66\x52\x2e\xc6\x49\x82\xe4\x99\x02\x1f\xc2\xd4\xb5\xf0\x8f\x5d\x8d\x39\x8b\x7d\xf2\x54\x70\xe3\x20\xf6\x49\xdd\x62\x8b\x80\x72\x43\xfe\xc9\x5f\xdb\xcd\xaa\x1b\xf5\xf3\xd9\xb4\x21\xf0\x07\x31\x00\xbc\x76\x77\x10\x0f\xbd\xeb\x86\x62\x3a\xb1\xe1\xa9\xb1\xf4\xd8\x23\x83\x46\x1f\x8c\x1f\x53\xe1\x83\x6a\xae\xc8\xd2\x6b\xeb\xde\xb8\xf6\xa9\xac\x7b\x30\x0c\xeb\xde\x23\x65\xe7\xc6\xa2\xc0\x62\xee\x28\x8d\xec\xdf\x8c\xb1\x0f\x7b\xac\xef\x19\xff\xe7\xbc\xe0\x75\xde\x1d\xa5\xab\xbc\x21\xea\x71\x98\x69\x22\x0a\xd9\x61\xfd\x44\xae\xa6\xbe\x60\xf2\x87\x00\x45\xad\xeb\x39\x45\x92\x93\x4a\x1e\xc8\xbb\x70\x40\x2d\xa5\x92\x6a\xbc\x8c\x08\x83\x8b\xea\x61\xae\x4e\x20\x34\xcc\x1d\x9a\x6c\xad\xe0\x69\x67\x2d\x1a\x58\x7d\xba\x4c\xfa\x67\xa0\x53\xc5\x72\xf2\xea\xe6\x5f\xfc\x09\x66\xfa\xd8\xcf\x02\x88\x44\x42\x86\xd1\x41\xdf\xc6\x3b\x57\xb4\x02\xbf\xe0\xb1\x47\x28\xa5\x58\xd9\x86\xde\xec\x05\x2f\xd7\x29\x1a\xca\x40\x54\xae\x4f\xf9\xfe\x36\x6a\xd5\x4c\xb3\xa5\xa8\xd1\x90\x2a\x47\x82\x53\x4d\x2e\x28\xb4\xfc\xd8\x35\xc6\x5b\xa8\xbf\x38\x34\x0a\x1e\x1b\xe9\x46\x0d\xa0\x6c\x3d\x3f\x73\xa2\xaf\x6a\x16\x69\xc3\x43\x51\x9d\x2f\x8f\xb3\xfd\x83\x90\xeb\x10\xce\xfb\xdc\xbc\x43\xe3\xf1\xbe\xf1\xe0\x90\xc3\xe2\xa1\x1f\xe3\x1d\xd9\x93\x39\x70\x3a\x10\x78\xb7\x3e\x5e\x39\x8b\xec\x5b\x7b\xd8\x27\x3d\xb6\xab\x99\x03\xbc\xd2\x07\xbc\xe0\x1d\xde\xa9\x28\x16\xe8\xc2\xc3\xb8\xde\x22\x45\x3a\x10\x8b\xe6\x1a\x29\xb0\xad\x67\x4c\xb0\x1d\xa9\xfe\x40\xba\x44\x28\xde\xc9\xb2\xe6\x3b\x3d\x79\xa1\xc6\x03\x71\xa1\x38\x12\x54\x79\x70\xa1\x99\xcb\x7f\x92\xa2\x99\x07\x08\x82\x43\x8c\x68\x60\xb5\xca\x74\xe8\x2b\xbe\x40\x59\xdd\x0a\x51\xca\xe9\xb5\x0b\x6c\x8f\xdc\xf6\xce\x25\x71\xcf\x8f\x83\x67\xda\x09\xe2\x4d\xa9\x17\xf0\xfd\xf2\xf6\xd4\x5a\x16\x15\x62\x02\x59\x57\x21\x49\x15\x94\x5a\xb0\x77\x02\xd6\x0a\x1a\xd9\xd4\x4d\xa2\xb8\x96\xa3\x85\xbd\x7e\x46\xf6\x42\xee\x2a\x8a\x9f\xf7\xd8\x38\x12\xef\xce\x89\xa6\xff\x29\x6f\x03\xa3\xb1\x41\xb7\xab\x87\x71\x39\x04\xef\x45\xde\xbc\x2a\xa5\x1c\x2b\x87\xdc\xc1\x14\xf7\x2e\x85\x6a\xba\x24\x85\xb3\x32\x0a\x9a\x31\x97\x3a\x74\x3d\x13\x70\x9e\x08\xe3\xbc\xc6\x75\xe8\xb5\x81\xe1\x52\xc1\xd7\x44\x0e\xae\x11\x71\x8a\x42\x6a\xff\xa2\x51\x63\x2f\xf5\x18\xc3\x29\x03\x91\x8c\xcf\x0d\x3a\x77\xe9\x5f\x6a\x75\x80\xa6\x31\xa9\x35\x0d\x5b\x94\x99\xea\x10\xbf\x3c\xa7\xde\x43\x9f\x3a\x1c\x00\x21\x48\x8e\x18\x4f\x06\xb8\xdc\xed\x91\xfd\xc2\x08\x7b\x84\xa9\x0d\x8a\xb6\x8f\x8d\x04\xef\x1d\xb9\xcb\xbd\xd8\x17\x60\x98\x76\x74\x95\x68\x01\xd0\x97\x74\x05\x55\xff\x58\x4c\xcc\x0e\x17\xb6\xb6\xa4\xcf\x96\xf8\x9a\xed\x34\x01\xc8\x12\x50\xc1\xda\x79\xf9\x54\x03\x1d\x23\xeb\x42\x30\xa5\x4b\x82\xb7\x23\x79\x9c\x20\xc5\xdd\xae\x0e\xee\x97\xd1\x72\x0b\x58\x07\x93\x42\x2c\x67\xda\xe5\x5f\x70\x6b\x0c\xd0\xbc\xa0\xb1\x3f\xa4\x12\x92\x45\x0d\xe1\xc4\xd6\x53\x06\x4b\x37\xc3\xb7\x8b\x94\x07\x74\x0b\xd6\x51\x2f\xed\xea\x68\x56\x8c\x66\xd4\xad\xcb\x07\xf4\xd3\x59\x73\xd3\x4e\x00\xef\x64\x62\x12\x82\x10\xfb\xdb\xa2\xba\x88\x28\xf3\x9d\x21\xfd\xa3\x71\x27\x80\xb4\x84\x92\x74\x72\x35\x82\x13\xbc\xff\xfe\xf1\xe0\x77\x3c\xf5\x8b\x8b\xd5\x08\xf5\xc2\x4e\x4a\x4a\xb1\x54\x8b\x20\xac\x52\xa5\xf5\x15\xa9\x75\xca\x90\xa2\x84\x4e\xf9\x79\xd8\x14\xc0\x25\xa2\x03\x4d\x4d\x9e\x67\xe8\xd8\x71\xc0\xbf\x25\x87\xd4\x00\xa1\x41\x9e\x89\x5c\x78\x98\xe3\x49\x15\xa1\x3d\x8c\x5a\x27\x65\xde\xec\xb9\xf9\x05\x1a\xe4\x5a\xad\x36\xd5\x49\x1b\xf9\xd4\xcd\xb2\xae\xb2\x63\x6f\x99\x52\x6f\x95\x8c\x94\xdf\xd9\xb5\xe3\x4a\xb9\x5c\x57\x4a\xc6\xae\xc6\x44\x3a\x0c\xb8\xce\xfd\x70\x38\x6d\xea\x06\xe7\xb2\x13\x76\x19\xc1\xbf\x77\x7e\xaa\x30\x1f\x75\xc4\xde\x71\xdf\x5c\x86\xfb\xe6\x79\x76\x2c\x5d\x71\xb9\xfe\x9b\xc3\xe6\xef\x92\x61\x02\x42\x9d\x01\x68\x30\xd7\x11\x2c\x51\x5d\x76\xc3\x45\xef\x29\x9b\x3b\x55\x8e\xfa\x47\x86\xc1\x3f\x29\xa1\x34\xd0\x7d\xf2\xd6\xab\x1c\xd4\x3b\xc3\xc3\x82\xe2\xad\x8f\x9b\xeb\x5b\xff\xcc\xb8\xb9\x7e\x6f\x7c\x47\x64\xed\x78\x7f\x1f\x3e\xf1\xf1\x2f\x90\x18\xee\x01\x15\xdb\xf7\xd6\x0d\x9a\xb3\xa9\x24\x79\x68\xd8\xe1\x7e\xdf\x84\xfe\xfd\xa6\xc7\x6e\xbd\xf4\xda\x7e\x7f\x51\xc4\x5d\xf4\xa2\xcd\xb7\x84\x53\xfe\x89\xcb\x63\xe9\xa2\x2d\xe2\xab\x3e\x3b\x7f\xa9\xde\xd8\x92\x23\xf6\x84\xee\x7d\x48\xe5\x7f\xa9\x1f\xcc\x6e\xf4\x40\x29\xde\x88\x22\x26\xd7\x42\x42\xbc\x8f\x32\x27\x3d\x12\xa1\x64\xd6\xbd\x31\x68\xf3\xba\x37\x06\x5b\xc3\xba\x37\x06\xa7\xab\x75\x6f\x0f\x35\xcd\x35\xdf\xbf\xe8\x51\xec\xed\x1e\x80\xe1\xd3\x6d\xff\x75\x1e\x7b\xd6\x95\xf1\x45\x97\x5a\x7f\x5c\x7f\x23\x38\x6c\xbe\xa7\x37\x20\xeb\x12\x9d\xe5\x0d\x9d\xc2\xf1\xb9\x13\x35\xf6\x55\x8f\x61\xdb\xfc\x3f\xf2\x82\xcf\x79\xc8\xc3\x4c\x47\x5c\x79\x98\xd6\xc4\xcc\x74\xb4\x02\x10\xec\x92\x4b\x18\x03\xc4\x4b\x17\x71\x37\xa5\xb0\xb3\x6e\xd2\x10\x19\x5f\x04\x1e\xae\xa9\x9b\xa1\xcc\x5b\xa6\x6a\xb5\xda\x22\x19\x54\x10\x6c\xb8\x68\xb9\xe7\xe8\x61\xc3\xc8\xf7\x6b\x36\xee\xac\xcd\x17\x6f\x86\x31\xa9\x75\xe2\x6e\x16\xc6\xb7\xd4\xa8\xf8\xc5\x09\xe7\xc4\xf5\x7e\x8f\xe1\xd8\xf9\xef\xf2\x58\xe3\x41\x19\x0a\x53\x41\x38\x2c\x06\xb7\xe1\x69\x3f\x27\xe3\x36\x39\xa3\x71\x6a\xc9\x6d\x59\x2e\x17\xb2\x08\x68\x9f\x42\xa9\x63\xd9\x03\xa3\xec\x07\x60\x63\xcb\x56\x05\xf9\x75\x4e\x01\x98\x82\xff\xf2\xd1\xe0\x79\xa3\x03\x6f\x95\xfd\x74\x24\xd4\x09\x84\xc1\x25\xf2\x30\xba\x11\x75\xe9\xb9\x8e\x48\xc0\x11\x89\xba\x8a\x89\xa9\x57\x9f\x22\xf8\x1f\x32\xae\xd1\x79\x4f\x89\x02\x6e\x74\xa2\x2a\xb4\xaf\x6a\xe8\x65\xa1\xc9\x89\x05\x07\x11\x01\xe6\x9a\xf5\x00\x20\x99\xac\x85\xbd\xdc\x7c\xac\x6c\x5b\x6c\x38\x61\x92\x3a\x3a\x52\xd9\xa9\x16\x2f\x4c\xaa\x57\x27\xbb\xd8\x27\x93\xf8\xb5\x45\x85\x81\x26\xdf\x5b\x04\x87\xb5\x5a\xba\x4f\xbb\xee\x19\x35\x6c\x6e\x2d\xc5\xd6\xdf\x75\x78\x1e\x7e\x2f\xd6\x00\x21\x60\x03\x3f\x48\x11\xe6\x2b\xf9\x14\x42\xb2\xd8\xa2\x33\xec\x44\x53\x38\x98\x06\x60\xa8\x7c\x61\xd2\x9e\x83\xd7\x76\xb2\x6e\x12\x25\xcb\x20\x6e\xbb\xb9\x6a\x86\xbc\xe2\x36\x04\xe6\x0a\x39\xb1\x5c\x3b\xdc\x1b\x21\xd6\x27\xed\x08\xff\x95\x5e\x70\x9f\x87\xf6\x1f\x33\x17\x6c\xe7\xca\x90\x85\x0c\x07\x7a\x8c\x8d\x9a\x94\xfb\x87\xd6\x83\x27\xa1\xb0\x46\x8d\x4f\x53\x42\x3e\xd9\xce\xe4\x90\x2d\x52\x34\xd5\x22\x8c\xf0\xa2\x36\x94\x34\x16\x9d\x05\xf8\xed\x5d\x4c\x0b\x4b\xff\x6b\xbb\x82\xbf\x18\x53\xbf\xfa\xf0\x8a\xe2\x58\x01\xc7\xe0\xfd\xcd\xa4\x8f\xd2\xba\x8d\x75\x4d\xa5\x11\xcb\x9d\xb1\x4b\xe8\x18\x80\x62\x24\x47\x1f\x57\x00\x4d\x66\xfd\x11\xf9\x9a\xac\x01\xce\x2c\xf9\x7d\xc5\x24\xd8\x83\x90\x01\x4b\x95\x57\x4a\x6a\x94\xf3\x00\x92\xa3\xe3\x68\x45\x04\x00\xbc\x0e\x46\x9f\x1c\x90\xc3\x97\x52\x20\xef\x4e\xec\x67\x4a\x25\xe4\x55\x6b\x39\x42\xfd\x44\x83\xc7\xe2\x42\x54\x4f\x97\xb3\xb0\xd3\x42\x2c\xf3\x1a\x0f\xee\xe8\x2b\x21\x47\x1a\x70\xe5\xc4\x0f\x56\x03\x8a\x7b\x45\xaa\x08\x1a\x26\x88\x3e\x26\x98\x06\xc2\x01\x79\x76\x9a\xa9\x32\x26\xe8\x15\xe5\x8a\x8b\x29\xd9\x00\x5b\x17\x00\xca\x42\x20\xe7\x41\x20\x77\xed\x80\x32\x75\x30\x9c\xc7\x29\x34\x4a\xac\x42\x15\x8b\x3b\x88\x7f\x34\x88\x37\xa3\x2c\x87\x50\xe8\x27\x4e\xf3\x5b\x00\x82\x94\xdf\x42\x20\x0e\xfb\x31\xaa\xe2\x89\xd3\xa8\xfe\xab\xfe\x81\x66\x25\x29\xcf\xbb\x4d\x20\x0c\x20\x74\x31\x78\x35\xcd\xf0\xdd\x09\x05\xaa\x86\xd1\x36\x10\x58\x42\x14\x99\x56\x23\xa9\x8d\x4e\x1d\x21\x9e\x86\x28\xff\x55\x1d\xd5\xec\x53\xfd\x2b\x95\x95\x03\x55\xbe\x7a\xa8\xca\x57\x0f\xca\xff\x81\xea\x02\xbf\x0e\xc8\xbf\x0e\x57\xf9\xea\x61\xd0\x66\xe4\xa5\x43\x50\x23\x7c\x0e\xfe\x3c\x54\xe5\xcd\x34\x3d\x88\xff\x3d\xe0\x04\x74\x3c\x9b\xb5\x58\xf3\x41\xde\x81\x68\x49\xb0\x2f\x8e\xba\xe0\x88\xc3\x12\x27\x89\x04\x48\x1b\xe3\xfd\x37\x8f\x06\x8f\x2b\x5f\x54\x91\x9f\x96\xff\xb3\x48\x39\x3d\x55\x8b\xc5\x72\x58\xef\x91\x36\x38\xc0\xd7\xe9\xc2\xc7\x8f\xb0\x27\x90\x73\xf0\xc6\xe0\xb1\x8b\xf2\x8f\x45\x25\x07\x6c\x15\x40\x13\xfd\xcd\x91\xe3\xc8\x16\x29\xe7\x6c\x67\xdf\x6d\xc1\xf5\x8b\xfa\x97\x53\x96\xe3\xe5\xdb\xb0\xc0\x26\xf1\x90\x3c\x33\xb8\x73\x51\xfe\xb1\x58\x0e\x5b\xd7\x44\x16\xb8\x6c\x0d\x6e\x0b\xf2\x30\x84\x49\xcf\xb6\x9a\x52\x86\xbb\xc5\x96\x44\xdf\xf9\xa4\xc7\x46\x3b\x69\x56\xf8\x1f\xd2\x20\x45\x6f\xf3\x66\x9a\xb6\x93\x02\xcd\x37\x59\x61\xa7\xd0\x45\x2a\x1c\x52\x01\x29\xac\x61\x4e\xa1\x86\x03\x96\x1f\x3d\x72\xe4\x30\x6c\x11\x4b\x61\x7d\x65\x4d\x9e\xe9\x54\xc0\x15\xd0\x06\xd4\xf8\xa2\x2c\x75\xd1\xda\xd8\x43\x8a\x52\xea\x18\xb6\x7e\xbe\xff\xe0\xe4\xd1\xeb\xaf\x3f\x7c\x7d\x95\x47\x89\xdc\x10\xa2\x55\x31\x51\x02\xd5\xdd\xcd\x36\x06\x2a\x01\xb0\xff\x9c\x00\x67\xd0\x57\xf7\x92\xdd\xc1\x57\xbd\xf2\x55\x6b\x87\xa2\xf8\x7f\x8c\x1c\x05\x0a\x10\x82\x55\x21\x95\x1d\x0c\x58\xf2\x40\xd3\x49\xb5\xbe\xa2\x99\x8f\xe0\x25\x02\x38\xd9\x2f\x3b\x80\xd6\x77\x15\xe3\x32\x28\x43\x6a\xb2\x93\xa5\x72\xaf\x16\x8d\xc9\x8e\xc8\x26\x73\x51\x4f\x93\xc6\x84\x85\x10\x6e\xf9\x83\x10\x81\x47\xee\x23\xcb\xb8\x73\x2e\x89\xa6\x3c\x0e\xa3\x25\x0d\xc5\x8d\x81\x4b\xb1\xe1\x8d\x6a\xeb\x1e\xc3\xaa\x9f\x05\x27\xbf\x8f\x37\xa7\xb1\xc4\xbb\xfa\x70\xc6\xff\xd7\x28\xbb\x83\x59\x6f\xf8\x8f\x0f\x0e\x98\x5f\x83\xd6\x85\x02\xac\x49\x38\xcc\xb6\x28\x4d\xec\xf9\xf5\xc7\x15\xb6\x47\x21\x2b\xf8\x9f\xaf\x5c\x92\x31\xf8\x74\xb8\x24\x62\x15\x98\x12\xbc\xa4\x92\x5b\x50\x0c\x66\x97\x98\x14\x49\x3d\x6d\x48\x11\x0f\xf8\x81\x40\x0f\xa6\x8c\x09\x16\xa6\x08\x00\x4f\x68\xb0\x07\xad\xee\x2e\x47\xab\x52\x34\x63\x5b\x20\xe2\x15\xf2\x37\x90\xc0\xa4\x13\xe6\x04\x35\x1b\x26\x04\x5d\x0a\x6b\xb0\x13\x66\x61\x5b\x14\x22\x53\x3d\xaf\x91\x69\x30\xe2\x4f\x83\x35\x29\xfc\x2c\xf3\x00\x79\xa1\x14\x33\x8f\xfc\xd6\xb3\xbb\x14\x98\x67\xf5\xb7\x03\x75\x5b\xa4\x7c\x39\x84\xe1\xa7\x62\x6a\xec\xd3\x1e\x1b\x30\xa2\xfe\xbb\xb7\x93\x14\x5d\xd3\xea\xcb\x9d\xdd\x10\x8e\xf1\x41\xdc\x5f\xa6\xea\x6c\x07\x3b\x8b\xa6\x80\x42\x88\x72\x67\x84\x05\xe9\x95\x89\x58\xac\x86\x09\x41\x6a\xef\x87\xf0\x94\xbb\xe9\x63\x13\xec\x57\x1f\x65\x53\x5b\x6d\x21\x69\xdb\x7f\xf5\xa3\x82\x9f\xf5\xd4\x2f\xeb\x18\xad\x15\x78\x0c\x0a\xed\x25\x45\x4b\x14\x51\xdd\x3a\x09\x42\xd8\x4e\x2b\x04\xe4\xd9\x44\x41\x62\x20\x24\x09\x40\x72\x85\x59\x94\x76\x73\xcd\x5e\x86\xd6\x58\xe4\xe2\x21\xc5\xb4\x1d\x12\x04\x78\xaa\x80\x95\xd3\x26\x7f\x8e\x31\x62\x55\xb9\xaa\xd8\x73\x5d\xf7\xd2\x9f\x3e\x82\x7d\x65\x94\xed\xa9\xa7\x49\x11\x25\x5d\xe1\xff\xc1\x68\xf0\x99\x51\xf5\x4b\x39\x35\x72\xa1\xb9\x78\x10\x6e\x51\x14\x00\x22\xd1\x8e\xb4\xfc\x35\x58\x57\x80\x6b\xa0\x83\x54\xab\x7d\x49\x99\x14\x19\x49\xb3\xb1\x15\xe6\x38\x1b\xf1\x88\xa3\x61\xa1\x2c\x4e\x82\x28\xe7\x69\x27\xbc\x9b\x50\xd1\xa8\x4a\x6a\xee\x45\x79\x0e\x37\x50\xeb\x72\x36\x17\xc7\x90\x19\x16\x4a\xa3\x85\x5d\x07\xb4\x19\x88\x54\x2a\xb2\x48\x28\xe8\x74\x71\xa1\xd0\x19\xa3\xaa\x26\xa6\xbb\x8f\x63\xaf\x20\xe0\x0c\x20\x62\x63\xf0\x04\x66\xe8\x1b\x5c\x23\x82\xf5\x14\xaa\xcb\xa8\xa5\x75\x27\x68\x48\xb6\x1b\x83\xc1\x1b\x5c\x2d\x48\x08\x01\x0f\x79\x53\xac\x49\x75\xac\x0b\x22\x5f\x8e\x29\xae\x74\x95\x66\xee\x86\xc1\xe0\xc9\x4f\x87\x04\xc3\xd9\xd3\x02\x9f\xd1\x23\x89\x5d\xa9\x56\xae\x66\x02\x52\x3d\x45\x3d\x4d\x66\x03\x50\x47\x31\xf6\x29\x17\x55\xde\x4d\x00\xb3\xaf\x97\x76\xb1\x3e\x84\x3e\x4f\x5d\x89\x21\xae\x18\x87\xa7\x90\x82\x29\xae\xd0\xd9\xd4\xbf\x34\xc6\xfc\x4c\xb4\x31\x2c\x61\xa6\x10\xed\xe3\x69\x37\x29\xfc\xdf\x18\x83\x2d\xfe\xe8\x91\xe0\x17\xc7\xfa\x6f\x6b\xd9\xae\xa7\x17\x10\x51\xde\xdd\x05\x8d\x02\x66\x1a\x55\x1a\x46\xc1\x3d\xbc\xe3\x5a\x52\x67\x77\x35\xea\xaa\x5d\xfa\xd4\x42\x57\x71\xe6\x28\x8a\x9f\x06\xc9\x64\x29\x8d\x09\x26\x1c\x85\x73\x6e\xe5\xcf\xd9\x00\x6f\x54\x73\x55\xa9\x9c\xd3\xb1\x54\x47\x91\x53\x90\x34\x8d\x40\x2c\x9a\x05\xca\x58\x78\x20\x6d\x47\x45\x61\x32\xfa\x73\x91\x45\xa1\xc6\xb4\x73\x2a\x1a\xe5\x5c\x03\x09\xec\x17\x11\x6d\xbc\xe8\x80\x36\xcc\x56\xf5\x56\x37\x59\xa1\x74\x4a\xc3\x45\x6a\xa8\x05\x20\x20\x13\x1e\x9a\x30\xed\xc9\x04\x75\x1d\x4e\xc7\x72\x9b\xb0\x21\xda\xda\x70\x49\x2d\x51\xae\x87\x34\x6e\xa8\x9c\x87\xd5\x83\xb5\x83\xd7\xab\x78\x01\x40\xf8\xd3\xdf\xc0\x29\x0f\xbe\x2d\x39\x8c\xb2\x11\x3a\xce\x6a\xd0\x4c\xb9\x4e\x6e\xf5\x6d\x08\x27\xba\x0e\x97\x5e\x74\x0f\x05\x1e\x1b\x0e\xed\x1a\x3f\x4e\x6c\xf8\xa4\xe3\xc9\xef\x66\x02\xc4\xe6\xb0\xb2\x31\x2e\x03\x44\x43\x46\x3f\x80\xd9\xcd\xd5\xf9\xde\x3e\xd2\x1f\xdb\xf6\xca\x91\xe0\xbe\x91\x79\x0b\xf1\x5f\xc7\xf2\xdb\xd8\xe6\xfb\x72\xcb\x31\x65\x07\xb8\x19\x07\x8e\x9d\x49\xab\xe0\x14\x6c\x5a\x7f\x0d\x08\x06\x22\x40\x79\xec\x60\xbd\x92\x9c\xa9\x71\xdc\x33\x55\x90\x68\x41\xa1\x09\xa1\x96\xaf\x56\x91\x80\x4f\x8c\x1a\x46\x37\x69\xa7\x0d\x34\x82\x01\x5c\x1b\x89\x0c\x3a\x7b\xf5\x5b\xdd\x55\x20\xd7\x9c\x08\x1b\x93\x72\x3f\x7a\xd0\xdd\x24\xf5\x34\x41\x3d\xb7\xde\x9b\xa4\x50\xed\xc9\x30\x69\x4c\x6a\x21\x5d\xef\xd9\x92\xe8\x1b\x1e\xa8\x7f\xcd\xd3\x51\xb2\xe2\xff\x89\x17\x7c\xde\x53\xbf\xf0\x90\x2d\x4f\x31\x25\xd7\x9a\x1e\x87\x2d\xb5\x97\xb1\x13\x27\x67\xe7\x4e\x1e\x9f\x5e\x38\x79\xc2\xf6\x90\xa0\xf5\xa3\x48\x3b\xbc\x93\xa5\x9d\x70\x39\x34\xa5\x93\x05\x0f\xa8\xc4\x0e\x80\x6a\x02\x78\x9d\x8e\xec\x90\x4a\x5f\x1c\x26\x89\x30\x00\x5d\xed\x74\xd5\x30\x90\xa9\xd7\x1c\xb1\xfb\x9d\xbd\xec\xdf\x0e\x88\x30\x3b\x9b\x36\x84\xff\x87\x7b\x83\x08\x90\xe7\xa0\xd9\x6b\x69\xb6\x22\x10\x5d\x4d\x96\x68\xea\x5d\xe3\x27\xe5\xa9\x02\x6e\x40\x13\x10\x67\x59\x85\x67\xf5\xa7\xd9\x20\x28\xc7\x7e\x70\xa6\x44\x09\x17\x45\xbd\x31\xe1\xaa\x1d\x2f\x67\x3b\x2e\xe2\x1d\x17\xf1\x0e\xf5\xd2\x15\x75\x12\xff\xb2\x72\x12\x7f\xd0\x63\x13\x9b\xc6\x98\xca\x85\x0f\x0e\xe1\x17\x7b\xf3\x65\x7e\x41\x1b\xdd\x9a\xd0\x24\x1f\x94\xaa\xcb\xda\x82\xa4\xc6\xa3\x0d\xfb\x7b\xe3\x3a\xfe\x4b\x6f\x0b\x78\x7b\xd0\x06\x74\x13\x7f\xdc\x3b\x93\x82\x1e\x57\x47\x8e\xdb\x74\x89\xf4\x7d\x97\xf3\x19\xdb\xf2\x7d\xb0\x67\x95\x9a\x7e\xd1\x3b\xbd\xb9\x77\x79\xc2\xdf\x37\x88\xe3\x5c\xf6\x42\x99\xf5\xe5\x1f\xaf\x1a\x98\xed\x31\x77\xdb\x89\x59\x1d\xf6\xed\x04\x8a\x7f\xf6\xaa\xe0\xc5\x9e\x13\x29\x3e\x17\x36\xd2\x9c\xdf\x16\xa7\xf5\x15\x7e\x42\x80\x75\xad\x8d\xda\x10\x90\x98\x84\x79\xa1\xfc\x12\x08\xbe\x84\x93\x05\x70\x8a\xe7\x6e\x3b\x41\xb1\x03\x1a\xa7\x93\xa7\x6b\x89\xc8\xf2\x56\xd4\x21\x84\x09\xf0\xdd\x4b\xd9\x3a\x7f\xf2\x74\x94\x74\x2f\xc8\xdd\x4b\xaa\xdc\x51\xb2\x5c\x5b\xf7\xf6\xb4\xd3\x24\x92\x5d\xba\xee\x8d\x45\xed\x70\xd9\x35\x08\xfd\xf4\x5e\xf6\x3c\xb0\x11\xa6\xb1\x7f\x21\x58\x81\x83\x11\xd4\x56\x5e\x01\x43\x90\xb1\xf9\xc9\x6d\x62\xa9\x31\x70\x3c\xc9\x04\x96\x6b\xa8\x10\xac\xf2\x54\xb6\xd4\x98\x9a\x3b\x39\x7d\xe2\xcc\x49\x39\x52\xad\x74\x6d\xb2\x48\x27\xbb\xb9\x98\x8c\x8a\x92\xcf\xd4\xc4\x94\xbf\xc3\x0b\x5e\xef\x5d\x5e\xd4\x38\xef\x0b\x4a\xbf\x72\xb5\xb6\xfc\x60\xdf\x71\xe2\xd1\xbf\xe6\x6d\x01\x0d\x56\x07\x9e\x53\x28\xfa\x2f\x58\xa1\xe8\x51\xee\x58\xde\x4a\xb9\xc3\x14\x9a\xde\x4c\x33\x39\x29\xce\xe7\x52\x63\x9c\x69\x9a\x4c\x44\x15\x9a\x0c\xf9\x4b\x19\x41\xbd\xe8\x81\x4b\xa2\xf8\x4a\x75\x01\x7b\xbe\x47\x69\x96\xf7\x04\x6d\x33\x61\xc0\x9e\xd1\x37\x61\xc2\x46\x3b\x4a\x1e\x8c\x29\xf3\xbe\x8a\x4e\xa4\x78\x67\x25\x58\xaf\x94\x13\x29\xdc\x70\x74\x58\x68\xf2\xd8\xbd\x16\xe2\x21\x84\x92\x2c\x16\xa2\xce\x31\x7e\xb2\x94\xdc\x5b\xce\xb7\x88\xf2\x6d\xa4\x5c\x60\xa3\x8e\x5d\xa9\xc4\x8b\xed\x66\xc9\x91\x7f\x5c\xf5\xe6\xb5\xd9\x52\xc3\x8d\xdf\x45\x19\xe0\x47\xc1\xd3\xcd\xd0\xc1\x25\x1a\xbb\x2b\x3f\x52\xef\xf6\xd8\x6e\x9a\x92\xfe\x4f\x7b\xc1\x2b\xbd\x3b\xf0\x87\x3a\x41\x23\xeb\x71\x0a\x59\x64\x70\xdd\x99\xe2\xd6\x5c\x9a\x12\x45\x7d\xaa\x2e\x3a\xad\x29\x3d\xc3\xaf\x7c\x6d\x7f\x4a\xea\x33\x24\x31\xfd\x7b\xbd\x40\x4c\x5b\x27\x5e\x39\xab\x8e\x8b\x4e\x8b\xab\x27\xae\x5c\x0d\x86\xa6\x61\x7f\x73\x84\x3d\xc6\x12\x24\x62\x15\xf4\x4a\x13\xc1\x2f\x92\x62\x5e\x64\x91\xc8\xfd\x4f\x8d\x04\x77\x5b\xbf\x35\x5b\x8e\x9d\x53\x08\x82\x04\xee\xa6\xc0\x2e\x0e\xe0\xdb\x14\xab\xa5\x4f\xd6\x6b\x61\x3e\x15\xc9\x23\x6f\xa7\x23\x12\xc2\x8d\x2e\xa2\xa4\x9b\x76\xf3\x18\xf9\xe9\xf2\x54\x2e\xaa\xa8\x2d\x6a\xeb\xde\x18\x20\xad\xaf\x7b\x8f\x94\x1b\xd9\x39\x52\x16\x16\xa2\x92\x1f\xee\xe7\x2a\x2c\x61\xf8\xa8\x2f\x94\x2f\x6a\xb6\x3e\xd8\x34\x45\xfc\x58\x90\x83\xaf\x4c\x4e\x54\x6d\x20\xf6\x36\x96\x97\x96\x08\xb3\x62\x09\xd8\xbb\x65\x6d\x1c\x2b\xc2\x2f\x78\xac\xaf\x4e\xfe\x9b\x3c\x76\xf3\x25\xa8\xa8\x67\xa2\x7a\x96\x42\x3a\xf1\xd3\xcb\x45\x6a\xd3\xb9\xfc\x1b\x6c\x06\x50\x33\x18\x09\xa3\xe7\x53\xf5\xd7\x42\xd9\x12\x91\x28\x17\x8f\xdb\x88\x1a\xfb\xde\x1e\x47\xdb\xd0\xf9\x1a\xb5\xd9\xb4\x71\x22\xca\xb3\x2e\x38\x08\x6f\xeb\x36\x96\x05\x04\x21\xfa\xbf\xb1\x27\xb8\x6d\xc8\x3d\x3c\xc4\xd8\x04\x8a\xa0\x57\x0c\x78\xda\x3d\x52\xfe\xed\x6e\xf6\xeb\x15\x76\x55\x3b\x4a\xa6\x95\xed\xd6\xff\x60\x65\xab\x9a\x7d\xb7\x88\xe2\x5a\x94\x14\x79\x91\xd5\x66\x92\xe2\x5c\x86\x36\x9b\xe0\x3b\xde\xb4\x9b\xd0\xa1\x28\x17\xa2\xa6\x61\x38\x08\xec\x8f\x06\xe8\x4f\x40\x7b\x21\x8a\xde\x40\x19\x0f\x03\x65\x02\xd0\x3e\x34\x65\x65\x0e\x9b\x05\xc5\x9e\xa8\x8f\xd1\x04\x47\xe6\x38\x3c\x57\x87\x4b\xb9\x8d\x8d\x40\xc1\xea\x44\x0d\x31\x9f\x72\xcb\xad\x07\xdb\x06\xe0\x1c\x66\xb0\x5e\xc0\xe3\x21\x97\x74\x52\x00\x0a\x8a\x4a\x36\x91\xd5\xa3\x08\x2c\x08\x6a\x38\x78\xe0\xc0\x63\x82\x1a\xfb\x80\xed\x21\x7b\xe7\x95\xf0\x90\x7d\xc8\x83\xdf\xfc\xee\xae\xc8\x7a\xb0\xed\x13\xc5\x6b\x2b\xcd\x85\x55\x9f\x30\x13\x1a\x82\x8c\x76\xad\x86\x1e\x77\xbe\x84\x03\xcf\xa7\x79\xd2\x8d\x2d\x8f\x19\x74\x2b\x46\xc9\x25\x08\x1f\x0e\xa1\x23\xb2\x63\x15\x68\xc5\xfe\xe7\x3c\x77\xa2\xf4\x02\xfe\x42\xe4\x7f\x45\x37\x4b\x5d\x6d\x52\xcd\x2e\x7a\x13\xec\xd1\x8e\x66\x0e\x64\x4c\x93\x10\x1e\x20\x96\x7b\x3e\xf3\xf7\x64\xa2\x13\x87\x75\xc1\xd8\xb7\x2a\xec\x9a\x76\x78\xe1\x7c\xa2\x47\xd6\xff\x93\xcb\x9e\x83\x6f\xac\x6c\x38\x07\x81\x88\x2e\x70\xbf\xba\xf1\x24\x84\x10\xa0\x64\x1b\x93\x6f\xa3\x89\x77\xca\xf6\x25\xa7\x89\xb8\x84\x59\x77\xc0\xce\xb6\x6a\x77\x89\x1d\x03\xd0\xe1\xf3\x68\x55\x68\x85\x19\xa2\x5e\xdc\xc5\x56\x63\xdf\xd8\xc5\xe6\xaf\x50\x7c\x88\x83\x43\xf5\xaa\x87\x0c\x87\xea\x9d\x63\xec\xcf\x35\x0e\xd5\x97\x3c\x26\x1e\x94\xe0\x97\xef\x1b\x08\xaa\x0f\x1b\x08\xaa\xf7\x8e\x3c\x48\x91\x3e\x3b\xe8\x53\x0f\x0e\xfa\xd4\x9b\xc7\x34\x5f\x01\x44\xed\x29\x48\xcc\xd4\x1d\x9a\x72\xf8\xd4\xf4\xec\x0c\x85\x41\x19\x18\x99\xdf\x19\x0d\xce\x0e\xb8\x3e\x14\x3b\x06\x82\x0e\xe9\x69\x04\x8c\x01\x3a\xc0\x7a\x37\x0e\x33\xc4\x8c\xd9\x10\x32\xe6\x7f\x8e\xb0\x57\x0e\x06\x69\x79\xce\xa5\x83\xb4\x3c\xe1\xf4\xe5\x02\xb4\xfc\x98\x01\x68\x39\x13\x3c\xe1\x76\x37\x69\x7a\x53\x78\x96\x8d\x70\x55\x9e\xa9\xf1\x59\x16\x82\x27\x9e\x07\x53\x3d\xc8\xe7\xc9\xb5\x34\x6b\x54\x8d\x09\xf6\x52\x71\x5b\x9e\xaa\x57\xf1\x6c\x70\xdc\xc5\x14\xcb\x07\xc3\xf1\x80\x35\x58\xaa\x3d\x9b\xc2\xf1\xdc\x40\x70\x3c\x53\x41\xb0\x40\x67\x59\xd0\x55\xad\x23\xf2\x60\x1c\x9e\xff\x67\x2f\x7b\xb4\xa5\x88\x2e\xc9\x9d\x1a\xa4\x43\x96\x26\x4f\x4a\x97\xfc\x0f\xef\x0d\x8e\xd1\xdf\x96\xbd\x5b\x15\x68\xf9\xe7\x31\x54\x07\x09\x93\xea\x59\x9a\xf0\x67\xa7\x4b\xae\xd4\x7e\x03\xdb\xb1\xc0\xef\x58\xe0\x5d\x0b\xfc\x77\x95\x05\xfe\x2f\x3d\x36\x39\xd4\xaa\x56\x9e\x95\x60\x85\xff\xa8\xb7\x61\x5e\x96\x6b\x91\x57\x33\xd2\x8e\x17\x2a\x0c\x69\xd2\x83\x3f\xa8\x65\xc3\xfd\x6f\x19\xc3\xfd\x27\x3d\x36\xb5\xf5\xa6\xe3\xe6\xfc\x32\xef\xb8\x8a\x53\xd4\xa2\xc3\xb4\xf2\x21\x6f\xcd\x8e\x6b\xf2\xf2\x5c\x93\x17\xbd\xb9\xcd\x9d\x19\x53\xfe\xa4\x76\x66\xc0\xb4\x30\xf0\xb3\x38\x37\xca\x2e\x8d\xfb\x77\x39\x69\xd3\x16\x80\x15\x44\xec\x64\x72\x2e\x89\x05\x88\x82\x00\xe0\xbf\xef\x8e\x05\xb7\x0c\xbb\x49\x2c\x79\xe6\xb7\x85\x51\xa7\x42\x80\xb2\xda\xba\xb7\x47\x5c\x88\x8a\xe3\x69\xc3\xb5\x0a\xbd\x69\x8c\xdd\xeb\xb1\x71\xc8\x30\x10\x8d\xe9\xc2\x2f\x2e\x5d\x85\xb8\x09\x8c\x31\xa1\x8a\x5d\x92\x07\x27\x08\xf6\x13\x17\x44\xbd\x6b\x4b\x02\x5d\x2d\x4e\xdf\x65\x73\x6c\xaf\xbe\x38\x73\xc2\x3f\x1e\x1c\xd5\xcd\xdd\x97\xf3\x99\x13\xdc\x4a\x03\x0b\x0b\xbe\xaf\x91\xd6\x57\x44\x76\x6c\x6a\xea\x66\xfd\xda\xb3\xa2\xc6\x2d\xfb\x6c\xb1\xfc\x64\xa6\x9b\xec\xdf\xa1\x0c\x5e\x47\x4f\x5e\x88\xf4\xd2\xd4\x3b\x10\x2a\x07\xd4\x85\x83\x2a\xea\x98\xb5\x0a\xc6\x64\xf7\xe4\x2d\xe8\xb0\xe6\xa5\x77\xd8\x63\xdd\x0e\x73\xbb\xc6\xa9\x93\x68\xb0\x73\x46\xbd\x3a\x11\xdc\x70\x86\xf4\x29\xa9\xb2\x66\x5a\x68\x6e\xa1\x1d\xa6\x7f\x66\xb5\x56\x75\x2a\xb8\x69\xff\x52\x16\x89\xe6\x84\xd6\xa0\xb6\xd1\x33\x4e\x89\x79\xb4\x0c\x48\x6f\xaa\xbf\x0f\xce\xc3\x85\x4b\xed\xea\x57\xfc\x08\xfb\xa1\x01\x0b\x65\x36\x6d\x10\x20\xec\x5f\x5f\x1b\x7c\xd0\xd3\x3f\x6d\x45\x68\x30\xcb\x87\x2d\x94\xe1\xcc\x4f\x2f\x4a\xd1\x53\x64\x61\x84\x48\xd7\x48\x6b\x69\xaf\x24\xf4\x2f\x54\x39\xf0\x1a\x47\x70\xa8\x8f\x8c\x1b\xd6\xc4\xea\x5b\xac\xb4\xa8\xac\x40\xbb\xea\x85\x6e\x63\x96\x02\x37\x63\x52\x42\xa6\x7a\x47\xc0\x96\xd9\x2e\x59\xc2\xcc\xac\xff\x8c\x60\xd6\x30\x5b\xaa\x0e\x02\x87\x87\x43\xba\x0a\xb1\xf1\x80\xf3\x19\x2d\x27\x52\x19\x3a\x09\xd6\xa1\x08\x61\x90\x7a\xa2\x30\xbc\x7c\x2e\x24\x8d\x5a\xf0\x70\x66\xf8\x9c\x77\xe9\x13\xf8\x95\xde\xdc\xa9\xe3\xfc\xf0\xe1\xc3\x37\x71\x00\x7e\x85\x20\x9f\xbe\x39\x4d\x2a\x21\x60\x92\xd6\xa5\x86\x1c\x8b\xc6\xb2\x9b\x77\x1d\x8b\xc2\x18\x4e\xc8\x32\x6b\xdd\xe3\x9d\x2e\xd0\xa4\xb8\x2b\x04\xbc\x26\xfb\xf3\x09\xad\xef\xcb\x01\x65\x17\xd8\x58\x27\x6d\xcc\xcc\xfa\x69\xb0\x64\xf5\x62\x18\xc7\x29\x66\x13\x1a\xd2\xd3\x1a\x9f\x4b\xbb\x05\xda\x8d\x94\x01\xd4\x32\x9c\x51\x7e\xdc\x80\x7e\xd5\x85\x39\xfd\xfa\xc6\x0a\x24\x02\xa3\x2e\x9f\xfb\x2f\xab\x04\x17\xb4\x2e\x40\x87\x3d\x3d\xa3\xe0\xeb\xdb\x74\x2d\xad\xa5\xd9\x4a\x9c\x86\x8d\x1c\x01\x77\x3a\x69\x63\x32\x8e\x9a\xa2\xde\xab\xc7\xe2\x5a\xf9\xcb\x7c\xdc\x76\x67\x1c\x64\x53\x1b\x68\x70\xd6\x92\xd2\x07\xd7\x8b\xde\x3e\xf6\x43\x03\xec\x84\xc0\xcb\x38\xb9\x22\x7a\xfe\x6e\x7f\x4c\x2a\xc3\x4c\x3e\xb9\xa1\x45\x71\x8f\xbf\x0b\xde\x62\xec\x3d\x15\xf6\xa8\xba\xbd\x87\x75\x73\x91\xfb\xaf\xab\x04\xbf\xe3\x2d\xa8\x88\xd0\x56\x98\xc3\xe9\x52\x24\x45\xd6\xe3\x1d\x0c\x35\x56\xa3\x8d\x83\xd2\x0e\x93\xa8\x09\x39\xf2\x10\xc9\x85\x4f\x46\xb9\xca\x0e\xa1\xc4\xb6\xb4\x5b\x74\xba\x10\xfd\xbc\x88\x5b\x05\x8f\xc0\xa7\x57\x2c\x5e\xf9\x5e\xa7\xf0\x3c\xac\xe6\xa4\x3a\xaf\x6f\x15\x0a\x7f\xe0\xde\xdf\xcd\xd9\x4f\x56\xd8\x0f\x8a\x4e\x4b\xb4\x45\x16\xc6\xc7\xfb\xfa\xed\x1b\x5e\x70\xbf\x42\x13\x90\xd3\x1f\x68\xb5\xd4\xe3\xa6\xd7\x28\x4a\x1d\x63\x9d\xbb\x89\xf6\xe5\xc0\xf4\x73\xf3\x6d\x21\x97\x6d\x12\xc8\x50\x14\x47\x30\x44\xe0\x77\xec\x00\x93\x9c\xb4\x3d\x28\x15\xad\x46\xd0\xdf\x27\xfb\x6a\x9a\x2b\xd2\xe6\xda\xe5\xf7\xc5\x3f\x54\xd8\x0f\xc8\xe7\xfb\xbb\xe1\xcf\x2a\xc1\x5b\x2a\x1b\x4c\x1f\xf9\xd6\x46\x73\x48\xbe\xda\x36\xc1\x36\x3c\xef\x42\x7e\x6f\xb3\x1b\x97\x5f\x35\xd1\x82\xc0\x85\xcb\x1f\x0f\x29\xc6\x98\xbd\xd5\x76\xc2\x75\x48\xa7\x19\xf8\xae\x16\xbb\x3c\x17\xdb\x47\x60\x7d\x98\xa6\xe2\x8a\xd1\x3c\x16\x83\xf9\xed\x23\xef\xae\xb5\x7a\xf6\x7e\xa5\xe6\xe0\x60\xb3\xc7\xe7\x46\xd9\xa3\x92\x94\x94\x9e\xb3\x8a\x61\xf8\x43\xa3\xc1\x03\xa3\x7d\x97\x89\x06\x06\xe7\xe9\x1a\x86\x7e\xe3\xe4\x96\xca\xa7\x68\x77\x8a\x9c\x8c\x82\xe0\x42\x50\xf9\x1d\xc0\x45\xb7\xd4\x2d\x78\x64\x93\xf9\x1b\x0e\xdb\x2c\x5a\x6e\x15\x3c\x5c\x0b\x7b\x3c\xcc\x55\x49\x52\x8d\x00\x9b\x3f\x64\x84\x40\xd6\x00\x47\x10\x89\xe5\x2c\xac\x0b\x39\x63\x6c\xad\xa6\x23\xb2\x08\x98\xec\xad\x45\xd6\x48\x05\x86\xb4\x2f\x77\xc3\x2c\x4c\x0a\x61\x85\x3c\xc8\x3a\xeb\x1c\x43\x5d\x93\x94\x5a\x84\xa1\x5e\x44\x30\x0c\xc4\x36\x00\x01\x0b\x38\x78\x29\x07\x87\x8d\x2e\x45\xc4\xb9\xc0\x4c\xdb\xa8\x49\xad\x47\xb6\xd8\x25\x51\x4f\xdb\xb6\xa3\x2e\x4f\x53\x79\x34\x28\x95\x0b\x2c\xd3\xa6\xf0\x65\x6a\xa8\x95\xe3\x63\xd7\x0a\x09\x7f\x5b\xd1\x32\xf4\x72\x16\xa5\x59\x54\xf4\x1c\x34\x2a\x05\x1b\x87\x9e\x19\xd3\x9b\x35\x3e\x8d\x09\xa6\x79\x37\x06\x26\x1f\xdd\x4f\x94\x17\xd3\x88\x9a\x88\x54\x8c\x26\x5d\xa9\xe4\x75\x44\xbd\xa6\x58\xa7\xd5\x80\xeb\x79\x35\x58\xd9\xf9\xb5\x71\x36\xd6\x69\x85\xb9\xf0\x3f\x36\x1e\xbc\x77\x5c\x2e\x78\xf8\xa9\x5d\xb1\x64\xe7\x8a\xd0\xeb\x23\x5b\x42\x42\x30\xef\xb6\xc1\xd0\x9d\x36\x09\x0f\xbe\x40\x74\x44\x9a\xc3\x51\x91\x73\xbd\xfa\x08\x17\x43\xef\xbf\x1c\x16\x5c\x95\x3a\x0e\x29\x06\xe5\x01\x97\x96\x0a\xe6\xf7\xeb\xa4\x66\x58\x3a\xab\x51\xa3\x6b\x8b\x6e\xed\x8a\x91\x25\x99\x58\x02\xcc\x30\x82\xf5\x65\xa9\xb5\xc8\x91\x4c\x80\xf5\xb2\x2e\x94\x00\xd1\x94\xa3\xa7\xb3\x78\xb0\xe1\x78\x9a\x3e\xc6\xd8\x2c\x52\x37\x1e\x83\xba\xcb\x4e\x6c\x41\xde\xb5\x48\x2c\x92\xf1\x21\xd0\x38\xb8\x7e\x20\x39\x8b\x32\x7e\xfa\x8e\x76\xa0\x9d\xe5\x50\x26\xae\x30\x91\x68\x80\x44\x52\xf5\x30\xa9\x25\x47\x95\xd1\x49\xb9\x34\x4b\xc0\xe6\x9b\x07\xb9\xd9\x91\x33\xa2\x91\xae\x25\x52\x12\x42\x14\x0b\x7e\x08\xfc\xb0\x98\xfb\x54\x48\x41\xa9\x12\xee\x01\xb1\x9e\x17\xe1\x8a\xe0\x21\x3a\x52\x6b\x7c\x0e\xf9\x98\x07\xb4\x7c\x29\xed\x26\x16\x8b\x35\x71\x56\xc6\x71\x5f\xfb\x28\x21\xc1\x6d\xd6\xb4\xd2\x22\xc1\x79\x68\xba\x22\x27\x3f\x39\xf1\x40\x03\x29\x65\xa4\xf3\x7d\x28\x51\x15\x52\x82\xe4\xfe\x40\xc9\x2e\x99\x50\xbf\x6a\x7c\x5e\xee\x4b\xa2\x21\x1a\xc7\xf8\x74\xec\xec\xef\x91\x59\x03\x50\x21\xcb\x10\x10\x25\x6a\x3f\x73\xa8\xc2\x0a\x8c\xb7\xa7\x6d\xaa\xc6\x4f\x85\x51\xbc\xad\x82\xa9\x53\x06\xb7\x55\xf6\xa4\x5b\x87\x66\x18\xc5\x52\x0f\x50\x4b\x84\x1e\xa4\x84\x1f\x79\x44\x57\xc0\xfe\x49\x9a\x4c\xde\x23\xb2\x54\x9f\xd2\x32\x38\x34\x58\xc5\x95\x62\x5c\xc9\xe0\x7e\x0c\x3c\xb7\x10\x12\x43\x8b\xcd\xf1\xb7\xe8\x13\x99\xce\x91\x59\x12\x04\x2b\x0b\xf9\xd7\xbd\x0e\xa2\x2f\xf0\x46\x97\xf0\x46\x29\xf7\x2b\x4a\x38\x19\x95\x68\x5f\xd3\xf4\x03\x18\x7d\xd6\x34\xa7\x0e\x76\xa5\xb7\x72\x58\xab\xb6\x20\x7b\xd1\x08\xdb\x05\x07\x9b\xdc\xff\x87\x4a\xf0\x2d\x0f\xff\xa6\x44\x7d\x59\x0f\x73\xd8\x11\xc3\x8e\x3b\x33\x4d\x27\x45\x23\x2f\xa7\xa1\x1f\x28\x94\x46\xdd\x76\xb1\x7a\xe0\x63\x2a\x93\x09\x68\xe1\x49\x48\x9b\xef\x28\xf7\xfd\x41\x72\x16\x40\x04\x07\x60\x52\x35\xf9\xcc\xec\xea\x11\x98\x34\x33\xb3\xab\x47\x69\xf5\xab\x14\x30\x61\x0e\x57\x1c\x1a\xa4\x97\x95\x29\xbb\x07\x11\x32\x46\x8f\xb9\x8e\xed\x67\x3f\xba\x95\x23\xcd\xcc\xec\x45\xef\x31\x9b\x9c\x65\xc6\xfc\x91\xa8\xb3\x9d\x93\xcc\x7d\x15\xb6\xe7\xee\x34\x07\x66\x75\xff\xbb\x5e\xf0\xff\xc2\x01\xe6\xce\x6e\x18\xcb\xbd\x2f\x6d\x2a\x9c\x04\xbe\xff\xce\x73\xf3\x13\xbc\x2e\x9f\x33\xd6\x70\x75\x5c\xb7\x06\x86\x2f\x85\x39\xee\xf6\xda\x97\x42\xe8\xd9\x6d\x30\x65\xcc\x0b\xd8\x78\xee\x3c\x37\x8f\x7c\xf1\xe0\x3c\x02\xad\x5f\xef\xe5\x77\x9e\x9b\xc7\x0f\x89\xfc\x52\xcd\xa4\xb2\x5a\x93\x9d\x2c\xed\xa4\x79\x18\xe7\x53\x52\xfc\x4d\x69\x00\x9b\xbb\xd3\xbc\xd6\x76\x22\x19\x57\xb5\xf9\x28\x0e\x9e\x35\xcd\xc1\x7e\x64\xb9\xe2\x2e\x55\x2b\x84\x55\x5b\xe3\xa2\xb6\x5c\xe3\xfb\x4e\x62\x74\x86\x63\xd6\xfb\xec\x38\x7b\xfa\x95\x64\x77\xb2\x30\xc3\xd0\xa4\xf4\xcd\x3d\xc1\xdc\xc6\x8f\x94\x99\x59\x6d\x41\x33\xec\x4d\xc7\xda\xf3\xe2\x3d\xec\x7b\x1e\xbb\x5a\x6d\xb3\x00\xa4\xe3\x7f\xdd\x63\xd1\x83\x47\x62\x55\x86\xac\xba\xc7\xf9\xb8\x26\x07\x46\x60\x1d\x4d\x5e\x84\x86\xb0\xb8\x47\xdb\xb2\x4a\x55\xc6\x98\x02\x0b\x35\x67\xa1\x25\x7a\x43\xf4\x36\x53\xaa\xdc\x8f\xa4\x06\xc7\xde\xe5\x1a\x4a\xde\x58\x09\xce\x5a\xaa\x93\xea\x5c\xea\x57\x39\xcf\x2d\xf7\x78\x08\xc7\x78\xb2\xe0\x0d\xef\x6c\x23\x2b\xee\x66\x29\x6b\x3f\x14\xfd\x6a\x99\x4f\x38\xfb\x37\x8e\x28\x91\xb2\x6e\x12\xdc\xc0\xbb\xfc\xd1\x76\x88\xd2\xe6\x07\xfb\x1f\x69\x87\x1d\x29\x92\x72\x7f\xdc\xdf\x3d\x09\xcb\x9c\xb1\x3f\x1e\x61\xd7\xe4\x45\x9a\x89\xc6\x5d\x0a\x53\xe9\x33\x23\xc1\x7b\x46\xdc\x6b\x2a\xc7\x3e\x8e\x1d\x30\xa5\x52\xb0\x0e\x45\x97\x4a\xed\x50\x40\xd8\x1a\x25\x50\x48\x8d\x2c\x0b\xeb\x2b\x64\x47\xce\x85\x05\x96\x84\x50\xdf\x21\x6f\x47\x04\xd1\x8d\xf1\xc2\x10\x84\x0a\x55\x30\xcf\x52\x82\x1c\xee\xf4\x7a\x8f\x69\x93\x89\x2d\x4f\x9d\x52\x6c\x22\x9a\x30\xe1\x68\x51\x77\x9e\x30\xc1\x05\x3a\x93\x74\x3f\xf0\x40\x01\x84\x77\xca\xd3\xb8\xe1\xe0\xb9\x42\xfa\xae\x9c\x64\x18\x82\x6d\x83\x06\x61\x7a\xa1\x3a\xc7\xe8\xad\x5b\xd7\x9c\xcc\xd3\xb4\x2d\x69\x9c\xa9\xdc\x4e\x86\x57\x29\x8a\xf0\xac\x8b\x2b\xb6\x48\x11\x7a\x85\x5c\x06\x08\x12\x6e\x27\x6a\x6f\x44\xf2\xf4\xfe\x23\xec\xf0\x56\x60\x7b\xce\x74\x0b\x9b\x5c\xde\xff\x87\xc3\xc1\x33\x4b\xd7\xac\x78\x13\xc0\xd1\xa0\x92\x14\x76\x8c\x3e\x6d\x58\xb8\x7d\x49\xc3\x40\x46\xe6\xf2\x3c\x1c\x76\x3a\x31\x24\xf4\xa6\x35\x4d\x5c\x72\x15\xfa\xe4\x91\x05\x62\xdd\xdb\x9b\x47\x0d\x71\xb2\xd9\x94\xfd\xbe\xee\xfd\x5b\xfd\x1d\xa4\xd8\xba\x6b\x10\x4a\xe2\xe7\x0f\xb1\x37\x55\xd8\x35\x52\x81\x4f\xbb\xc5\x3c\x40\xb1\xe4\xfe\x4f\x56\x94\x97\xe0\xdb\xde\x82\x73\xab\x84\x6f\x4f\xef\x19\xd2\x49\x8d\x86\x33\xad\xc3\xfd\xd4\x33\x90\xe9\x8b\x99\xed\xba\xe1\x52\xbb\x33\x80\x01\x10\x40\x04\x50\x05\x05\x21\x1f\x9a\xfb\x52\x57\x35\xbb\x31\x78\x9c\x50\x7b\x25\x54\x64\x9c\xda\xea\x5b\xab\x4e\x12\xf2\x92\x28\xd6\xa4\xda\x72\x10\xba\xf5\xf0\x01\x8e\x90\x33\xb9\x83\xd9\x73\xd0\x5c\x76\x1c\x1d\xaf\x1b\x65\xc3\x7a\xd2\xbf\x38\x12\xfc\xc9\xc8\xf4\xe0\x9b\x0a\xb6\x48\x21\x8a\x11\xb4\x55\x07\x70\x9b\xe4\x95\xc5\xd2\x8b\x8b\x66\xd2\xcb\xe6\xa9\xa9\x23\x2e\x74\x08\x89\x43\x53\x93\x61\x8f\x48\x65\x50\xb1\x31\x00\x98\x82\x5a\x8a\xfd\x60\x05\x51\xa1\xd2\x34\xf2\x1a\x92\x0d\x24\xa2\x6f\xa5\x95\x60\x08\x95\x22\xe8\xe4\x77\x98\x3a\x54\x15\xa9\x1c\x22\x85\xa9\x11\xd2\x13\x41\x79\xa1\x81\xe8\x4d\x4b\x33\x33\xf0\x2e\xbb\x8d\x9e\x54\x2a\xea\xd4\x48\xb9\xc4\x32\xcf\xd0\xb9\x14\x6c\xaa\xfa\x09\x44\x40\xb0\xe8\xf0\xe7\xa9\x82\x72\xf2\x68\xe7\xb6\xfa\xb0\xa9\xaa\x2c\x79\xc9\x81\xed\x1f\x30\xab\x36\x90\x0f\xef\xf1\xd8\xd5\xf4\x34\x12\xa5\xfa\xeb\x5e\xf0\x32\xef\x94\x7d\x49\xbb\xf1\x5b\xe9\x9a\xeb\x39\x87\x73\x8c\xe5\xe8\x34\x42\x41\x07\xdd\x48\xc9\xd9\x0a\x93\x86\x3c\x6c\x4f\x9a\x9e\x31\xa8\x7f\x33\x18\x71\x97\x66\x70\x52\x74\x53\xbb\xe0\x8a\x5d\xdd\x3f\x1f\x63\xd7\xe0\xa0\x68\xa6\xab\x2f\x8e\x5d\x81\x98\xeb\x57\x8e\x9d\x73\x4a\x25\x0b\x95\x85\x75\x98\x82\x81\xdb\x1e\x04\xbd\x8e\x23\x3b\xf2\x0f\x71\x5a\xa4\x6e\x0f\xd0\x34\xf2\x2b\x79\x8d\xbb\x75\x86\x73\x89\xec\x02\x3c\xd9\x10\xa9\x9f\x66\x6e\x4c\xe3\x06\xd6\x06\x46\x37\x11\x6b\xe7\x2c\x60\x83\x35\x85\xb6\x95\x13\x8c\xb9\x55\xa5\xaa\xb2\xac\x43\x3a\x3f\x2e\xd9\x22\xa5\x73\x56\xd4\x54\x67\x62\x85\xcd\x2c\x2f\x6b\x70\x05\xac\x99\x8e\x17\xa7\x67\xf6\x9b\xba\xe8\x8c\x75\x34\x6e\xa1\x51\x02\x4c\x0d\xa6\x86\xa5\x67\x90\x4a\x60\x02\x70\xf6\x92\x32\x3c\x83\x5c\x0a\x70\x18\xc3\x3e\xe2\xfb\xe3\x08\x6c\x28\x27\x44\x27\x4e\x7b\xf2\x64\x32\x97\xc6\x31\xe0\x28\xc8\xf7\xe5\x09\x65\x36\x4b\x2f\xf4\x14\x8d\x00\x16\x37\xa1\x71\x3c\xfa\x9b\x5c\xe3\xe7\x73\x61\x0f\x8d\x8e\x69\x07\x8b\x2e\x0d\x9b\x1a\x4e\x00\xcf\x29\x26\xa3\xa4\xaa\x71\x40\x44\x02\x50\x1a\x14\x5b\x96\xaf\x44\x9d\xd2\x2c\xd7\x53\xc1\xa4\x2a\xa2\x13\x1a\x47\xdd\x12\xcc\x10\x88\x06\x47\x51\x67\xe2\x29\x2b\x92\x1a\x0b\xa9\x36\x61\xb8\x69\x8d\xfd\xf9\xa8\x22\x4c\xfe\xd2\x68\xf0\xa2\x51\x24\x46\x36\x7b\xf0\x1a\x20\xb2\x9a\xdd\x55\x56\x07\xc3\x8b\x15\x4a\xa8\x13\x5b\xed\x6e\x58\x99\xa0\x73\x12\xee\x38\x03\x6e\x20\x5a\x1d\x95\x2e\xfb\x2a\x32\x33\xe6\x59\x61\xd2\x7b\x16\x10\x9c\xd7\xf8\xed\xe9\x9a\x00\x41\x15\xd1\x36\x01\x26\x63\x0a\x6a\xbf\x8b\xa4\x6b\xb2\xac\xb7\x09\xda\x11\x50\x26\x2a\x0d\xa3\xff\x2e\x88\x94\x4e\xd7\xf4\xa9\xa2\xd3\x07\x7a\x1b\x54\xdd\xc9\x00\xa7\x4d\xec\x52\x30\xad\xc2\x0c\x80\xb7\xd7\xa2\xa2\x25\x1b\xa2\x40\x60\xe2\x9e\x3c\x52\x84\x4b\xb1\x2a\xb2\x13\x77\x97\xe5\x70\x5f\x7a\x2d\x01\x04\x06\x54\x5d\x29\xa6\x51\x1a\x98\xd9\xa1\x83\x0b\xe5\x7e\x62\x3e\x42\x6f\xbb\xd4\x68\xf6\x77\x06\x3e\xa0\xc0\x95\x6c\x59\x7e\x3b\x3b\xc5\x4e\x0c\x27\xc2\x1c\xa6\xeb\xc9\x81\x7b\x72\x54\xb4\xce\xe9\xc9\xc3\x5e\xb1\x87\xf9\x99\x88\x92\xd5\x14\xcd\x08\xb4\x17\x7c\x6f\x77\xf0\xcd\xdd\xfd\xd7\x07\x62\xc1\x1a\xbd\xc9\x82\x04\xa4\x6e\x69\x77\xe3\x22\xea\xc4\xa8\xda\xe4\xe0\xf6\x08\xb3\xc2\x09\x1d\xb5\xb6\x0e\x94\x8c\x68\xc3\xef\xdf\x2f\x82\xb3\xb2\xc3\x11\x43\x34\x98\x69\x9e\x05\xbb\x65\x50\x63\x0c\xae\x1f\xeb\xdf\x27\x69\x76\xa8\xaa\x68\xfc\xa8\x14\x08\x63\x93\x4d\xaa\xc0\x98\xfa\xc6\x80\xa2\x4d\xb1\x8e\xb9\xd2\xc2\x98\xc3\x70\x05\xd3\xde\xd2\x2e\xa9\xbf\x53\xda\x44\xf0\x3c\x2c\x1f\x2c\x28\x06\xcb\x20\xcb\xf4\xc8\xed\x62\x8a\xc1\x89\x9c\x5b\xd9\x29\x30\x1f\xc2\xd8\x51\x51\x6b\x5c\xcf\x5b\x44\xf9\xd2\x70\xd2\x28\xfa\x64\x49\xd7\x49\x6d\xf3\x3a\x02\xbe\x6a\x77\xd2\x42\x24\x45\x95\xa3\x1f\x36\x35\x96\x64\x3a\x15\xc1\x79\x44\xc5\x61\xc5\x3d\x5d\xdf\x1a\x3f\x9b\x16\xe2\x18\x47\x68\x21\x93\xf6\x67\xf5\x8b\x99\x52\xb9\x92\xe0\xda\x6d\xd5\xb0\x81\x83\x10\xa4\xad\xc6\xaf\x83\x1c\x9e\xc1\x05\x10\x33\x73\x94\xf0\x66\x37\x43\x84\x3d\xe8\x2d\x75\x9f\xe4\x2f\x56\xbb\xaa\x3a\x25\xd7\xf0\x57\x7d\x5f\x96\x85\xaf\xa8\xad\x59\x7e\x7b\xcd\xe9\x39\x8d\x11\x45\xbd\x46\x96\x89\x4c\x28\x3d\x59\xee\x40\x51\x12\xb5\xa3\x7b\xc4\x96\xba\x40\x7e\xa2\x48\x0d\xc3\xb1\xd9\x2d\x71\x48\xe5\x01\xa2\xdd\x2d\x42\x93\xf8\x65\x55\x59\xc9\xb7\x2a\xd4\x2b\xd4\x2a\x2d\x4d\x20\x77\xa7\x92\x9a\x86\x08\x1b\x35\xc6\x6c\x3d\x8b\xd6\x94\xa3\x6a\xfd\xed\x08\xb3\x8f\x62\xfe\x57\x47\x82\x3f\x18\x99\x37\x17\x50\x08\x0f\x91\x00\x52\x09\x02\x4c\x6e\x81\x0f\xd7\xf8\x34\xd8\x83\x60\x26\x99\xc5\x7c\x8c\x9f\x4d\x13\x51\x85\xff\x9e\x4b\x4e\x64\xbd\xb9\x6e\xc2\xf7\xeb\xce\x56\xbe\xbd\xd5\x28\x54\x80\xff\xc6\x87\xa8\xa6\xef\x7c\xda\x06\xed\x91\x8c\xf5\x13\xd6\x34\x07\x7b\xba\x5d\x0d\x7e\xe6\xfc\xfc\x02\x07\x5f\x1c\x82\x2a\xc0\x9e\x91\xd4\xa3\x38\x22\x1d\x9e\xdc\x4f\x79\x84\x9c\x9c\x0a\xec\x4c\x8f\xf0\xb3\x75\x96\x58\xc8\x9b\x5d\xe0\xb2\xcc\x0b\xd1\xd1\x79\x87\xba\xc3\xeb\xad\x30\x32\x90\x66\x4e\x25\x00\x40\x0c\xbc\x51\x89\x99\x72\xdd\xa4\x01\xf3\x7c\x4e\x6d\x1a\xda\x19\xd0\xc0\x6e\x09\x0b\xb4\xa6\x1a\x6c\xba\xb0\x5b\xa4\x93\xba\x4a\x28\x40\x7a\xa4\xed\x85\x96\xa0\xa2\x4e\x50\xe3\xf6\xf8\xc7\xab\xbe\x92\xdd\x26\xbb\xcf\x19\xf7\x37\x78\xcc\x39\x91\xfb\x2f\xf6\xd8\xc9\xed\x6f\x32\x6a\x13\xb3\x4a\x0a\x6e\xb5\x7f\x39\xa7\x0a\x44\xd8\x26\x57\x88\xb0\x1d\x21\xf2\x18\xae\x10\x76\xd9\x9b\x76\xb3\xbd\xd0\x3e\xda\x9f\x5e\xb6\x3b\xf8\xa7\x5d\xd6\x05\xb7\xcc\x96\xe0\x01\x28\x50\x81\xf6\x06\x28\x0b\x23\xa9\xc4\x49\x3d\x6d\xcb\x75\xa2\x76\xea\xc1\x1b\xce\x49\x29\x87\x10\xbe\xfa\xe4\xdd\xdd\x68\x35\x8c\x45\x52\xc8\x1d\x67\x92\xc3\xad\x63\xba\xcf\xd5\x74\x51\xfa\x65\x54\x68\x21\xa6\x74\xa7\xd0\x3a\xa2\x66\xa0\x41\x39\x69\x81\x91\xd4\x9a\x95\x02\x9c\x2b\x18\x33\x2d\xfc\xe5\x4a\x08\x3b\x9d\x7c\x6a\xf5\x60\x55\xfd\x41\xd0\xd1\x72\xaa\x19\x73\xa2\xb9\xbe\xd4\x2d\x74\x37\x60\xbd\x14\xd8\xdf\x62\xd8\x89\x9e\x98\xa5\xdd\x4e\x7e\xec\x69\x81\x2c\x2c\x78\x46\xd5\xc2\xdd\x97\x57\x57\x0f\xca\x6b\x5a\x8b\x3c\xc6\x9f\x16\x58\xd5\x0b\x9e\xb1\x58\xb5\x5a\x8d\x2c\x17\xfa\xd3\x1c\xda\x55\xae\x10\x1d\x60\x54\x54\x44\xff\x21\x06\xfb\x55\xf7\x73\x7f\xe7\x46\x4d\xd5\x1f\xe4\xe0\x47\x97\x86\x81\x5c\x87\xc6\x56\x31\x25\x13\x3a\x8c\xac\x7c\x16\x0b\x85\x05\xe0\xfd\x20\x77\x3f\xa8\x29\xdf\x77\xdd\xbf\x24\x54\x28\x3d\xae\x07\x7a\x11\x13\x33\x07\x8e\x89\xb3\x5d\x58\xcb\xc0\x16\x1d\x5f\x57\x9c\xd0\x7f\xea\x05\x5f\x00\xaf\x95\x83\x77\x52\xde\x8c\x90\x0b\xd1\xd2\x16\x9b\xdd\x38\xee\xf1\xbb\xbb\x61\x4c\x4e\x43\x51\x5b\xae\x55\xd1\x03\x4f\xa6\x0c\xc7\xe9\x59\xa5\xc8\x89\xc0\x7a\x22\x18\x04\x72\xec\x9c\x8f\x9d\x22\x06\x3d\x9d\x66\xcb\x61\xa2\x81\x18\x95\xf0\x71\x84\xe4\x9f\x8c\xb3\x47\xe9\xc4\x67\x6d\x8a\xf8\xf5\xf1\x2b\x60\x8a\x78\xfe\xf8\xd9\x72\xc1\x5b\xb1\x46\xc0\x19\x42\xab\x8f\xca\x34\x61\x53\x35\x18\x04\x73\xb4\x6f\x19\x42\x8f\xc1\x96\x80\x19\x47\x23\x8d\x8a\x5c\xc4\x4d\x8c\x66\xd1\x25\x51\x7c\x9a\xb2\x76\x44\x39\xef\x88\xac\x99\x66\x6d\xfc\x3a\x99\xcf\x74\x76\x91\x3a\x17\x97\x4a\xce\xf5\x0a\x55\x87\x3c\x24\x89\xd0\x13\x1f\x80\x9c\xf1\x9c\x25\x0f\xe1\x79\x69\x6a\x3a\x2b\x78\x58\xd7\xf4\xb4\xd6\x8a\x79\xf4\x0e\x4f\xa9\x94\x46\x61\x9e\xa7\xf5\x28\xd4\xd1\x02\x41\xd6\x4d\x20\x52\x27\x90\xf3\x22\x38\x80\x1b\xc0\xc1\xe0\x71\x1c\x81\x66\x30\x2d\xbe\x70\x3a\x4d\x6a\xfa\x48\x99\x90\x1f\xe3\x41\xdf\x04\x09\x8e\xf1\xe7\x30\xce\x03\xe8\xb0\x93\x17\x3a\x99\x80\xf5\x90\x07\xc7\xf8\xd3\x18\xe7\x1c\xee\xca\xff\x0b\x56\x44\x2f\x38\x66\x55\xa1\xaa\x6e\xe0\x91\x1c\x8a\x0a\xce\xa6\xc5\x4c\x62\x6e\xe1\x96\xa5\xcb\x82\x6b\x07\xf4\x6d\x2e\xeb\x4e\x7f\x3f\x03\xfe\x7d\x2e\x93\x7f\x3d\x57\x1e\x70\x94\x5a\xe8\x40\xe8\x80\xb4\xda\x7e\x5f\x96\xfb\x11\xb6\x61\x91\xac\x46\x59\x9a\x48\xb1\x85\xdd\xd9\xc9\xd2\x06\xf6\x68\x5e\x84\xcb\x51\xb2\x1c\x3c\xee\xa1\xeb\x56\xbb\x36\x03\x7b\x76\xb3\x6e\x85\xda\x5b\x3d\xab\xda\x30\xb8\x7f\x37\x61\x7e\xd9\x22\x03\x3e\x2e\x9e\x29\x83\x4a\xae\x60\x68\x64\x7f\xba\xb0\xe8\xb9\x91\xd7\x97\x68\x7b\xfa\xd0\x5e\xc6\x6d\x2d\xaf\xd3\x81\xd4\xf1\x13\xa1\x68\xa7\xc9\x3c\x41\x93\xbc\x6a\x6f\x70\xd8\xb9\xa2\xb3\x5a\xcb\xf9\x79\x21\x6f\xc0\x73\x10\x96\xba\xee\x69\xc0\x8c\x75\x6f\x4f\x21\xda\x9d\x38\x2c\xdc\xb4\xa1\x5f\x62\xec\x55\x15\xf6\x88\x76\x94\xcc\x89\xb0\xd1\x53\x1e\x9d\x7f\xd2\x24\x07\x18\x13\x01\x67\xac\x6e\xdb\xc6\x3c\x26\x07\x8f\xec\x24\x82\x38\xe6\x89\x58\x8b\x7b\xfa\x2c\xa1\x2b\x0c\x91\x01\x66\xef\xc1\xb0\x5b\x65\x33\x82\x39\xde\x84\x20\x3c\x13\x52\x54\xcf\xc2\xbc\x05\xf1\x55\xb2\xf8\x48\x81\xdd\x5a\x96\x47\x0b\x95\xdb\xde\x2f\x0f\xf0\xfd\x76\x00\xe6\xa0\x17\xe4\x14\xcf\x53\x88\xdf\x20\x70\x62\xa8\x50\x89\x2b\xe1\x97\x3d\xf6\xaf\xe5\x71\x5b\x4e\xef\xdb\xa3\xbc\x48\xb3\xde\xe9\xa8\x1d\x15\xfe\xfd\xba\x67\x5e\x81\xfb\xae\x81\xda\x89\x1b\xbc\x85\x8f\x12\x8c\xb7\x3c\x97\xc8\x2d\x5f\xae\x27\x9e\x91\x8d\xd5\xc6\x95\x00\xc3\x3d\xee\x32\x0d\x64\x66\xea\x46\x79\x4b\x3b\xa0\xc4\x05\x84\xb8\xe2\x10\x4b\x05\x26\x6a\x9b\xff\xc9\x6d\x3a\x30\x96\x58\x2d\xf8\x94\x0d\x97\xf2\xfe\x2b\x01\x97\xf2\xd7\xde\x34\x4d\xff\x32\x60\x8a\x0e\x33\x28\xa3\xa4\x98\xb9\x68\x93\x86\xd9\x06\xcc\x25\x61\x1c\xc8\x8d\x1a\x9f\x29\x06\x44\x2c\x71\x35\x75\xf7\xe5\xda\xe2\xbb\xcd\x30\xad\x2d\xad\xf8\x6b\xe1\xdf\x49\xbd\xb8\xd9\x0b\x46\x98\x5e\x36\xfe\xdf\x55\xb6\x10\x72\x3d\x9b\x36\x16\xe8\x05\x48\xa1\xfd\x74\x65\xda\xb5\xc7\x0f\x61\x7b\x2d\x33\x4f\x83\xb1\xd8\xac\x20\xb8\x8d\xf7\x6c\x63\x0d\xaf\xa7\x9d\x9e\x4e\xef\x94\x85\x81\xa9\x4b\x0e\x8e\xc9\x66\xb2\x75\x0e\xab\x23\x91\x84\x5a\xc9\xfd\xfd\x60\xab\xb7\xdf\xc5\x40\x2e\xf7\x29\x3b\xd0\x6c\xe2\x32\xa2\xde\x4d\xc8\x40\x3e\x95\x09\x39\xc9\x41\x80\x99\xcb\x10\x39\xa7\x2a\xcb\x5e\xed\xb1\x6b\x30\x51\x7c\x5e\x05\x71\x3d\xcf\x63\x37\x0e\x3f\x2a\x97\x85\xe8\x79\xe7\xe5\xe0\xc4\x74\x42\x89\xe7\x5c\x45\x85\xe1\x8a\xc5\x00\x6c\xf0\xfb\x4b\x2d\xcb\x91\x60\x64\x27\x48\xc4\x1a\xfc\xaa\xb1\x2f\x56\xd8\x0f\x0f\x98\x01\x08\x9f\x88\xe0\x94\xfe\x2f\x56\x82\x27\xad\x5a\x17\x6c\xcf\x3e\x6f\x87\x1d\xe0\xb6\x00\xb1\x9d\x85\x6b\x7c\x09\x70\x2d\x1b\xf8\xa4\x66\x98\xb7\x73\x3f\xc9\x91\xcf\xf0\x99\xd9\xb0\x68\x39\xd2\xfc\x57\x3c\x16\x33\xeb\xa6\xff\xcc\xe0\x4e\xf3\xcb\x81\x89\x23\x26\xb7\xbe\x68\x5f\x1d\xc8\xae\xab\x81\x13\x53\x56\x16\x4e\x30\x8e\x76\x3e\x4f\xc7\x90\x3b\x82\x5b\x40\xaf\x6f\x0f\x66\x06\x34\x2e\x5d\x85\xf0\x79\x3c\x0e\xa3\xb6\x15\x9a\x6a\x17\xfa\xc0\x38\xbb\xce\xe6\xe4\xc4\x10\x62\xa0\xa9\x39\x58\x9b\xa5\xd0\x74\x08\xa0\x3b\x1d\xe5\x85\x7f\x71\x4f\x70\xb4\xef\x2a\xca\x57\x17\x6f\x4e\x47\xb5\x53\x7c\x5d\x6d\xdd\x1b\x03\x18\x79\xa7\x0f\x3f\xb9\x7b\x27\xd7\xfa\x72\x61\xa0\x0b\x86\x1d\xeb\xaf\x04\x3f\xa2\xc9\x07\x0a\x8b\x2f\xce\x19\x2f\xe1\xa4\xb6\xdc\xc8\x8e\xb2\x23\xc3\x09\x5a\x87\x4f\x86\x1d\xe8\x8b\xcb\x80\xbe\xf8\x4d\x1b\xfa\xe2\xe3\xdb\x61\xc5\xe9\x67\x9d\x09\x7e\x5c\xe3\x5e\x20\x0f\x89\x22\x9b\x79\x88\x20\x2f\x2e\x7a\xad\xcd\x53\xfd\x4f\xfa\xc7\x27\x9d\x5c\x7e\xae\x39\x72\xcd\x14\x2b\xd1\xe4\xf6\x49\x19\xc6\x3e\x58\x92\x55\x9a\x3f\xb8\x8f\x3a\x18\x64\xd5\x8b\xc6\x83\xe9\x41\x37\x06\x89\xab\x61\x94\xe7\x83\xc5\xd6\xa7\x77\xc4\xd6\x65\x8b\xad\x55\x25\xb6\xda\xc1\x8f\xce\x0c\x12\x5b\xe5\x21\xd9\x8e\xe0\x1a\x3e\x33\x76\x04\xd7\x8e\xe0\xda\xa6\xe0\xda\x1e\x9d\x37\x88\xaa\x12\x72\xc9\xbb\xaf\x62\x77\x3d\x38\xe1\xd3\xfe\x17\xf6\x06\x2f\xac\x0c\x25\x82\xce\x6c\x3c\x77\x17\xaf\xcf\xd8\x08\xc4\x85\x4e\x6a\xc5\x6e\x9a\x38\xc2\x1a\xe7\x33\x05\xa1\x7b\x83\x8b\x71\x49\x94\x20\x45\x6e\xae\x41\x44\xaf\x7c\xe2\x96\x1a\xfd\x40\x7a\x69\x79\x5e\xb6\xa9\x88\x57\x0f\xd6\x0e\x1e\xad\x6a\xfe\x92\x26\xa4\x6a\xb5\xd3\x55\xf0\x18\xcb\xbb\x87\x0e\x61\x60\x93\xdb\x7e\x85\x45\x7c\x70\x38\xd9\xb5\xf2\xfd\xae\x7b\x00\xbd\xe4\x5a\x5c\xf6\xb0\x3b\xac\x29\x7b\xeb\x65\xa2\x4c\xb1\xf7\x2a\x7c\xa7\xb7\x7b\xac\xf5\x50\x84\xc7\xc3\xb9\xf6\xa6\xbc\x9f\x97\xbd\x50\x5c\x6c\x9a\x99\xdd\x8a\x50\xd6\xc4\xec\xec\x23\x06\x97\xe9\xe7\x3d\xf6\xec\x87\xa4\xca\x08\xe9\x34\x3d\x10\x6e\xb1\x8c\x11\xb2\x51\xf2\xc7\xce\x1e\xbb\xc3\x10\xf3\xb0\xed\x75\x17\xbd\xb5\xcd\xb7\x87\x05\x7f\x6e\x52\x61\x56\x0d\x9b\xc4\xce\x56\x00\x2b\xc7\x68\xbf\x83\x64\x1d\x63\x7f\xcc\x6c\xe6\xc9\x9a\x4b\xa8\xa0\x97\xdf\x42\xba\x22\x28\x3a\xdd\x7f\x17\x0b\xde\xe1\x59\x17\x78\x58\x14\x98\xc8\x2f\x25\x81\x79\x5f\xf0\x90\xe8\xfa\x20\x57\x17\xa3\x25\xba\x00\x58\x8f\xa1\x4d\x76\x19\x7a\x90\x28\x4a\x04\x48\x9d\xb4\xb5\x51\x79\x4e\xb0\x38\xeb\x1b\x69\x46\x81\x5b\x6a\xab\x40\x9c\x50\x2d\x55\x06\x89\xe9\x7f\xd8\xd1\xa7\x77\xd6\xfa\xc3\xa8\xd7\x5e\x51\x1d\xe1\x3e\xa5\x23\x3c\x87\xdd\x3a\xdc\x6a\xba\xe9\xa2\x86\x9d\xff\x46\xf0\x3f\x61\xb6\xf2\x60\x68\x2e\x15\x26\x81\xa1\x95\x3a\xfc\x9e\x3d\x60\x36\xfe\xb7\x78\x6c\xfa\x72\x2a\x82\xfb\xf9\x53\x0c\xc4\x6b\x33\x82\xe0\xd0\x28\xd1\x99\xe5\x98\xfa\xe2\x32\xbd\xda\x4e\x7a\xcd\xae\x89\x91\x27\xb6\x48\x6a\xd4\x2e\x7a\x2b\x9b\x8b\xda\xdb\xfd\x53\x5a\x13\x2f\xd5\xb9\xa4\x90\x5b\x55\x1f\x24\x7c\xd9\x5f\x3c\xd2\x81\x11\x1c\xc4\xcc\x4d\xfc\xdb\xd8\x7d\x1f\x7b\x64\x70\x8b\x7d\xa1\xe4\x55\x88\xc3\xbc\x00\xc4\x5e\x07\xf8\x0c\x43\x6f\x91\x73\xb8\x46\xb8\xc4\x8e\xc8\xfb\xda\x23\xd8\x77\x2a\x6c\x8f\x14\xff\x52\xba\xf8\x5f\xaf\x6c\x3c\x48\x7d\x75\x3c\x49\x6f\xda\x55\x0b\xde\x56\x51\x05\x22\x07\x3d\x6e\x00\x7c\x39\x4e\x97\xc2\x58\x51\x20\x2b\x8c\x91\x41\xe1\x01\x61\xd2\xb3\x71\x2b\x74\xa6\x50\xa1\x53\x1a\x4d\x55\xac\x54\x11\x6b\x6a\x52\xec\x19\xc8\x86\x7a\xda\xee\xa4\x09\x1c\x3f\x08\xc4\x81\xa7\xdd\x42\xd9\xc2\x55\x58\x84\xcd\x46\xce\x63\x91\x2c\x17\x90\xfe\x7e\x77\x57\x20\x25\x6d\x3d\x4e\xbb\x0a\x05\x84\x28\x45\x57\xa3\x3a\x26\x69\xdc\x39\x3b\x8f\x9f\x8a\xd3\xb0\xb1\x14\xc6\x61\x52\x17\xd9\x06\x1f\x9b\x00\x76\x6a\x1a\x05\xff\x43\xde\xc6\x4b\xb4\xaf\xd3\xf5\x32\x37\x5d\x5e\x68\x79\x69\xfa\xbb\x9f\x96\x5d\x4f\x89\x95\x72\xe7\x96\xc8\xd8\x5b\x51\x91\x5b\xd4\xeb\x14\x00\x33\x93\x2c\x67\x26\x44\x79\xa2\xc6\x5e\x5b\x61\xa3\x9d\xb4\x91\xfb\x2f\xdb\x80\x5d\x60\x33\xd6\x79\x6c\xc0\x6f\x7a\xe0\x70\xd9\xb8\xfe\x0f\x12\xad\xfc\x95\xe6\x95\x67\x6f\x18\x61\x7b\xd4\x76\xe6\xbf\x6c\x64\x9b\x6b\x4a\xa9\x6f\x4e\xff\xfc\x5a\xc5\xc2\x17\x30\x7d\x64\xa8\xb7\xb1\xb3\xf6\xe7\xdd\x7a\x0b\x00\x57\x20\x78\xc4\xc9\xd8\xd3\x7b\xa0\x94\x90\x40\x9b\x9d\x4f\x98\xdc\x38\x6b\xbd\x6d\xbb\xc7\x21\xe3\xff\xf8\xec\x79\x40\x94\x11\xed\x34\xeb\x4d\x00\xee\x49\x4b\x93\xba\x87\xb2\xe7\xba\x11\x06\x92\x3b\x5f\x43\x5d\x06\x11\xb6\x10\x9f\x91\xab\x95\x9d\x76\x74\xf6\x4d\x91\x76\x50\xc1\x92\xad\x32\x8e\xfd\x22\xe5\x89\x5c\xf3\x31\x97\x03\x2a\xeb\xa9\x3e\xa8\xd8\xa7\x05\x0f\xe4\xc4\x0a\x38\x81\xe6\xb3\xb7\x57\x08\xd5\xfb\x4d\x95\xe0\xa7\x2a\xc5\x00\x5c\x6f\xea\x4a\x85\xb2\x2f\xc5\x8e\x9a\x15\x94\x15\x19\x68\x98\x2d\x35\x56\x41\x95\x07\x4a\x16\xca\xbf\x71\x89\xca\xbf\x66\xe1\xeb\x69\xc6\x03\xeb\x59\xe8\xd6\x7a\x9a\x21\x0b\x74\x43\x4d\x78\x15\xeb\xa5\x69\x58\x0b\x0b\x76\x1f\x75\xe3\x01\x9f\xd6\x44\x5b\x16\x5b\x78\x62\x20\x96\x08\xcb\x6d\x72\x59\xee\x0b\xb7\xcf\x4e\xeb\x02\xce\x50\x57\x45\xb9\x22\x11\xb0\xb5\x91\xdf\x1a\xb1\x30\xff\xd4\xb7\xfc\x0f\x8c\xb0\x27\x6d\x6b\x32\xf7\x55\xd7\x99\xd5\x5f\xab\x18\x37\xe4\xc3\x32\xbf\x0d\xba\xba\x0d\x34\xf7\x2f\x6f\xd6\xbf\x75\xd4\x21\xc2\x32\x70\x71\xb4\x35\x1a\x42\x84\xef\x8e\x04\x53\x33\x03\x95\x3c\xc3\x2b\x40\x00\xc5\xf4\x6e\x6d\x43\xc6\x83\xfb\x47\x58\x6e\x40\xe8\x5a\xc1\xd3\x14\xfc\xed\xa0\x82\x01\x18\xc5\x2a\xb9\x14\x40\xdc\x57\xad\x90\xb7\x44\x18\x17\x2d\x5e\x6f\x89\xfa\x8a\xe3\xa7\xbe\x47\x6b\x9e\x9d\x40\xe9\x4c\x65\xd0\xfe\xfe\xef\x41\x26\x99\xda\x0b\xe4\xdd\xe0\x76\xf8\x00\x84\xb6\x2d\x64\x5d\x58\xe8\x40\x19\x10\xc0\xce\x1f\x50\xb4\xbf\x9b\xde\x71\x96\x44\xcc\xa9\xe0\xa6\x05\x12\x2a\x5b\xfb\xe6\x31\xf3\x3d\xbb\xbc\x3a\x1b\x83\x6c\x60\xff\xa9\xc1\x19\x43\x51\x81\x40\x47\xf5\xb4\x21\x36\xe9\x37\xb7\x97\xac\xf7\x9c\x4a\xbf\x65\x8c\xed\x1f\x14\xde\x92\xa5\x98\x04\xe1\xf0\x74\xfe\xaf\xd1\xe0\x47\x1c\x9a\xce\x8e\x7a\x4c\xb1\x06\xe2\xcc\x73\xa6\xc2\xc7\x46\xd9\x6f\x8f\xb0\xbd\x0d\x0c\x61\x3a\x93\x36\x84\xff\x89\x11\x15\x5b\xf5\xce\x11\x79\x81\x2f\xc9\xd3\x9a\xc1\x2a\x29\xe4\x14\xa7\xd0\x66\x58\x12\x2a\xd4\x0c\x78\x06\xa5\xe6\x4f\xa5\x51\xb4\xd1\x12\xe6\xf7\xd4\x0b\x75\x54\xd6\x91\x55\x07\x0e\x1c\x38\x00\x8b\xee\xc0\x0d\x37\xdc\x80\x59\xaf\x0d\x51\x8f\xda\xfd\x0f\xc2\x53\xd7\x1f\x3c\x58\xe3\x4f\x99\x3e\x73\x9a\x00\xd5\x72\x4c\x21\xc6\x92\x21\xe5\xdc\x7e\x39\xaf\xf2\x27\xcd\x9f\x3b\xab\xa0\x7f\xf2\xd2\x5d\x8a\x2b\xa4\xe6\xd5\xf8\x89\x28\x83\xe8\x1a\x20\x35\x33\xa0\xb5\x10\xa5\xa1\xf2\xa6\x42\xc8\x28\x51\xa6\x0e\x44\x4b\x44\x40\x31\x08\x26\x6b\x03\xd0\x21\x9a\xc2\xeb\x69\xd2\x8c\xa3\x3a\x02\xe0\x52\x02\x9b\x92\x22\x18\xa7\x05\x65\xe1\x6e\x10\xc5\x10\x73\x2f\xaa\x1c\x72\x82\x9b\x39\x84\xc9\x57\x6d\x84\x89\x6e\xac\xcf\x48\xa9\xca\xf8\xa2\x91\xc9\x45\x89\x6d\x3e\x62\xbb\x15\x55\xd1\x33\x83\x1f\x54\x5e\x33\x9a\x03\x34\x29\xca\xa8\xb6\xd7\xb3\xc3\xec\xe0\xa6\x71\x55\x38\xdf\x66\x75\x11\xec\xe5\x23\x8e\xe3\xd5\x40\xd8\x68\x3e\x3f\x32\x00\xdc\x1e\x25\x45\xee\x7f\xb9\x12\xdc\xe1\x5c\x51\x74\x9f\x39\x6f\xc1\x4f\x6b\x1b\x68\xa5\x6b\x00\x1d\xa6\x2c\x08\x56\x92\x65\x9a\xe4\xdd\xb6\x8a\x50\x57\x33\xf9\x05\x15\x76\x6f\x85\xed\x69\xa6\xd9\x53\xd3\x44\xe4\xfe\x77\xbc\xe0\xc5\x9e\xfa\x55\x32\x36\xdf\x93\x26\x80\x74\x0c\x83\xb8\xc1\x17\x60\xa0\x53\x8d\xcc\x9a\x76\xd2\x38\x5d\xee\xf1\x70\x4d\xce\x88\x2c\xed\xe2\xe0\x9f\x09\x7b\x1a\x4f\x50\x6a\x0c\x17\x20\x48\x33\x6d\xf2\x1b\x01\xfd\x2b\x12\x6e\x16\xeb\x51\x76\x84\x1d\x1a\xda\xd5\xfd\x5d\x78\x0a\xdb\x70\xd1\xbb\x76\x28\x0c\xce\xb8\xbf\x3b\x2c\xd2\x76\x54\x67\xec\xa7\xf7\x3a\x00\x28\xcd\x38\x5d\xa3\x80\x2e\x5d\xe0\x9d\x5d\xd1\x8d\x92\x65\x27\xdf\xd6\xff\x3a\x0b\x8e\x0f\xba\x61\x21\xa2\xb9\xf0\x0f\x9d\x30\x0b\xdb\xa2\x00\x68\xda\x34\x83\x43\x59\x94\x2c\x3b\x43\xf2\x6a\xc6\x7e\x66\x8c\xed\x69\x85\x49\x63\x3e\xba\x47\xf8\xaf\x1d\x53\x92\xe5\xff\x1b\x5d\x54\x57\x17\xc9\x1a\xd5\x46\xb2\xb5\x3c\x2a\xa2\x55\x1d\xd0\x89\xc9\xf3\xf4\x5d\x15\xb1\xdf\xea\x36\x9b\xb1\xfc\x97\xa0\xda\xd3\xa6\xd1\x33\xa2\xa4\x48\xf1\x80\x98\xd7\xb8\x62\x63\xa2\xba\x59\xb9\x23\x10\x5d\x15\xe5\x26\x18\x09\x31\x2a\x2d\x8b\xc4\xbe\x9c\xcb\xbe\xb3\x39\xec\xf7\x6b\x9b\x59\x27\x8c\x32\xc8\xc4\x6f\x85\x79\x4b\x34\xf4\x42\x95\x3f\x49\x74\x59\xc9\x57\xaa\xc2\xb6\x0f\x1b\xab\x48\x52\x4b\x8a\x2f\x00\x8d\x50\xbb\x61\x1e\xdd\x63\x2b\x52\x2d\x91\x09\x3a\x12\xe9\xa4\xa0\x9c\x77\xba\x05\x36\xd7\xc2\x05\xc9\x5b\x69\x06\xc6\x49\x2a\x1f\xa4\x18\x20\x16\x27\x8d\x1a\xb7\xfa\x5c\xa1\xac\x24\x29\x8f\xa5\xee\x44\x44\x4f\x8b\xf8\xde\x22\xca\x1e\xb3\x20\xf2\x68\x39\x81\x08\x67\x84\xe4\x95\x63\x25\x3b\x24\x4f\x49\x98\xf1\xa6\x58\x93\x3b\xda\x6a\x0f\x7a\x2d\xe7\x8d\x14\xa3\x64\xa5\x9e\x2b\x95\xdc\xb6\x85\xf0\x87\xdf\x90\x87\xbc\x79\x21\xb4\xbf\x6a\xb2\x19\xd6\x01\xd6\x2c\xad\x77\xdb\xda\x54\x6b\x45\x7f\x83\x39\x7c\x55\xf0\xe5\x6e\xd4\x08\x81\x73\x2e\xb1\x50\x08\x14\x0c\x1f\xf4\x93\xc6\xe4\x6b\x85\x48\x19\x89\xb1\xe1\x38\x32\x72\x61\xba\x02\xf3\xd5\x15\xf6\x48\xa8\xd4\x69\xb0\x31\x60\x88\xb1\x1d\x7c\xbd\x58\xbe\xbb\xa8\x0e\x28\x6a\xb5\x9b\x00\x64\xa3\xf2\x52\x6a\x1d\x86\xd7\xae\x85\x91\xa2\x76\x0e\x01\x05\x36\x21\x3b\x86\x8e\x1b\x75\xa7\x22\xf4\x6a\x11\xb5\xc5\xe3\xb8\xb8\x00\x59\xc8\xa6\xe0\xcc\x64\x66\xaa\xe6\xba\xd8\x39\x6a\x19\xc9\x93\x52\xd3\x0d\x57\x86\xdc\x12\x75\x76\xa2\x8e\xc1\x4a\x5e\x5f\x0a\x5d\xfe\xfd\x0a\xdb\x85\x43\xe5\xff\xa6\x86\x16\x7a\x7f\x45\x4d\x91\x7e\x96\x53\x9a\x73\x1a\x4d\xc6\x6d\x11\x06\xd3\xd2\x33\x0a\xd4\xa9\x21\x3a\x22\x69\x20\xd0\x73\x58\xa0\x92\x6f\x3c\x02\xc6\x08\x30\xa8\x65\xf3\x8a\x2c\x1b\x91\x80\x28\xdd\x34\x5a\x15\x31\x24\x69\x13\x18\x2a\x2d\x3e\x2d\x2c\x70\xa9\x02\x45\xc1\x0a\x09\x14\x2b\xe8\x5b\x6e\xac\xa2\x68\xa5\xb0\x12\x2d\x13\x18\x88\x02\xe5\x06\x88\xb2\x4c\xc4\x62\x35\x94\x4a\xdd\x16\x26\xdb\xd1\x23\x6e\xbf\xae\x8f\xb3\x1f\x1d\x1c\x92\x32\x8f\x7f\x9a\xa0\xca\xbf\xde\x13\x1c\x29\x5f\x1c\x14\xa4\x44\x65\x6c\x1c\x52\xf9\xd1\xdd\x3b\xae\x80\x9d\x10\x17\xa4\xa3\xda\x71\xaa\x5d\xa6\x53\x2d\x55\x41\x6a\xcd\xe0\xda\x81\x41\x6a\xf6\xb2\x15\xdb\x40\x8d\x1f\x22\x0e\x2e\x7a\x8d\xcd\x5d\x21\xd3\xfe\xad\x9b\x05\x25\x95\xa5\x49\x39\x20\xe9\xe2\x38\xbb\xf9\x12\xcd\x47\x78\x0a\xfd\xf0\x78\xf0\xbb\x23\x1b\x3e\x62\xe9\xe2\x94\x0a\x8f\x36\x9c\x34\x19\x60\x5c\x1a\x60\x2b\xaa\x42\xee\xd0\x26\x56\xa6\xea\x15\xb2\x98\x5e\x31\x3b\xb4\xdc\xb0\xbe\x2f\xed\x50\x9c\x9f\x4b\x28\x8f\x25\xc0\xaa\x92\xf5\xd2\xd2\xfe\x20\x8b\x8d\xb2\x1e\xc6\x5d\xae\x22\xb5\xbb\x7c\x6a\x8c\x2d\x31\x73\xcf\x3f\x1f\xdc\xee\x20\x76\x97\x93\x8e\xfb\x58\x24\x90\x53\x80\xd4\x58\x6a\x2f\xd6\xc7\x5e\x77\xb7\x51\xaa\xc3\xb1\x60\x32\x09\x0d\x57\xb9\x5d\xb2\xe1\x36\x05\x15\x2b\x2f\xca\x9c\x08\xdf\xf2\xd8\xbf\xc3\x92\xa7\x71\x24\xcf\x17\x51\x4c\xf9\xcf\xfe\xef\x6a\xb5\xef\xe3\xde\xb0\x87\xb4\x75\xda\xf2\x30\xe8\xac\x6f\x7c\xba\xaf\x32\x34\x9f\xc3\x7a\x96\x22\x7d\x0e\x57\x4a\x04\x91\x52\x6b\x71\x8a\x28\xed\x90\xac\x51\x97\xd2\xd5\x2e\x0c\xda\xa3\x44\x5f\xdf\x37\x2c\xe2\x9e\x12\x1e\xe2\xcf\x56\x98\xef\xb4\xe6\x2e\x59\x80\xff\xb2\xca\x36\xb6\xb1\x9a\x66\xb9\xbd\xb3\x1b\x26\x45\x54\xf4\x82\xcf\x7a\xfd\x85\x3e\x28\x9d\x03\x1d\x92\x85\x6b\x54\xdc\x7e\x95\xbf\x0b\x5a\xda\x46\x7d\x35\x51\xe5\x79\xd4\x8e\xe2\x30\x53\xcb\x91\x66\xbf\xe3\x51\x80\x09\x5f\x63\x3f\x3d\xce\x8e\x6d\x22\xfc\x6e\x4f\xb3\xe8\x1e\x39\x75\xe3\xd9\xb4\x31\x4d\x0f\x88\x0c\xb4\xb5\x2f\xef\x09\x9e\x38\xe4\x3e\xaa\x59\x6a\x6f\x68\xe9\x87\x40\x2a\x85\xe6\xb1\x0d\x83\xcb\x5f\xb6\x13\x0c\x73\xd9\xfb\xf6\xeb\x3d\xb5\x71\xff\x94\x17\xdc\x30\x30\x2b\x66\xf3\xd1\xd9\x06\x26\xd9\xd6\xa7\xd0\x8e\x72\x7e\x19\xca\x79\x66\xe9\xe6\xcd\xcb\x53\xcd\xf7\x69\x65\xdc\x70\x16\x0f\x50\xd5\x6b\x17\xbd\xbb\x37\xd7\xc8\xce\xfa\xa7\xed\xe0\x14\x35\x17\xb4\x3a\xb6\x81\x38\x71\x34\xb3\x43\x14\xa2\xf2\xd5\x51\xc7\x21\xa0\x48\x53\x71\x62\x3d\x29\x5d\xb2\xb3\x5e\xfd\x5f\x1a\x0d\xee\x2c\x5d\x2b\x85\xa8\x40\x33\x43\xfe\xa4\x74\x49\x2d\x78\x50\x3b\xc0\x4f\xa9\xad\xfa\x72\x8e\x84\x7c\x60\xde\xfa\x17\x47\xd8\xf7\xec\x63\xd1\x5f\x5c\x36\x5b\xef\xbb\x36\x60\xeb\x55\xa2\xfd\xd9\xe9\x52\xee\x56\x0f\x26\xb3\xaa\xe1\x43\x47\xea\xfb\x07\x2a\xa0\xeb\xb7\x3d\x36\xb1\x39\xb3\xad\x22\xf4\x7d\xeb\xd6\x09\x7d\xa9\xb9\x0f\x39\xcf\xed\x4f\x57\xd8\xbf\x1b\x46\x01\xe1\x3f\xbf\x12\xdc\xef\x59\x5c\x80\xb6\x0f\x10\x02\x3d\xd0\xe8\xad\x14\xbb\xfd\x9d\xb8\x9b\x85\xf1\x04\x9f\x45\x8a\x0d\x32\xd3\xd9\x7c\x73\xc4\x5c\x73\x8c\x71\xce\x67\x66\x8f\xf1\xe9\x84\x5f\x19\xae\x41\x67\xb6\xde\xc1\x66\x58\x25\xea\xf8\xc7\x83\xa3\x51\x87\x90\x9e\xad\xcf\xec\x07\x5a\x8d\x34\x03\x56\x8d\x89\x41\xc4\x12\xb6\xc4\xf9\xe6\xd5\x6c\x62\x13\x3b\xfb\xa9\x38\x5d\x9b\x87\xdd\xd2\xff\xf8\xd5\xc1\xd7\x3c\xf3\xdb\xd9\xa8\xcd\xf6\x1c\x2a\xb8\xa6\x26\x5a\x51\x31\xc0\x40\x9b\x58\xc1\x1c\x2d\x65\x78\x43\x4a\x5f\x8a\x27\x13\xb0\x67\x45\x09\x32\xed\x4c\xcf\xce\x18\x79\x4d\x48\x68\xa8\xfd\x68\x38\xb5\x5c\x81\xe6\x6a\xcb\x36\xc1\xbb\x75\xc2\x08\x31\x25\xa0\x81\xf9\xb1\x3e\xc5\xda\xaa\x3f\x30\xd6\xf0\x00\xaa\xe4\x98\xcf\x02\xb7\xcb\xff\x1b\xdb\x51\x59\x76\xe2\x77\x1f\x3e\xbd\xe0\x2b\xf6\xee\xf4\x07\x97\xbd\x3b\xbd\xd6\x5b\x54\xa5\x2d\xf6\xa9\x07\x0f\x23\xbb\xfc\x3f\xa8\x8d\xe8\xdb\x1b\xd8\x25\x37\x91\x51\xb0\x35\xbd\xcf\x03\x26\x86\xc5\xa1\xc8\x36\xc3\x36\xaa\xd0\x92\x0e\x0f\xf9\x6e\xf5\x4d\x13\xd2\xfc\xe5\x0d\xc6\x78\xb3\x0e\xc0\xf8\xa7\xb7\x78\x8b\x58\x96\xee\x84\xfa\x00\x06\xfa\x87\xaf\xb5\x5b\xd7\x3b\x87\xa7\x97\xd8\x1d\x61\xdc\x2d\x25\x53\xa1\x69\x22\x93\x9a\xce\x6d\x97\x97\x14\xf6\xa4\xf9\x73\x67\xfd\x57\x78\xc1\x7f\xf6\x28\x2a\xc3\x04\xaa\x24\x3d\xc4\x70\xc5\x78\x0d\x8c\xd7\xe4\x0b\xc0\x9b\x02\xcb\x1a\x6c\x65\x9a\xd1\xe0\x18\x5f\x4a\xd3\xb8\x2a\xc5\xf7\xd1\x23\x55\xd9\x94\x10\xfe\xc0\x15\x5f\xe5\x4f\x7b\x06\x08\xf6\x66\x58\x17\xcf\x79\x6e\x95\xb7\xc3\xce\xd3\xf0\x96\x7d\x1d\x61\x7c\xa2\xb8\xc6\xbe\x55\x61\x07\x37\x8a\x7a\xaf\xdd\x26\x37\x56\x94\x01\x73\x02\x98\x78\xea\xc2\xff\x48\x25\x78\xd2\xa0\x1b\x28\x99\x33\xfd\x13\xe9\xcf\x6c\xe4\x19\x95\x67\x13\xe5\x9a\x1c\xcf\xdd\x32\xbf\xe4\xb1\x1b\x9c\x1d\x73\x22\xf8\x21\xb9\xad\x2b\xa2\x08\x6d\xdf\x40\x56\xa0\x72\x90\x13\x0c\xff\xa9\xe0\x26\xd8\x27\xca\xcf\x52\x5c\x13\x88\x49\xe8\xd5\x7d\xb3\x69\x63\x1f\x74\xc6\xbe\x79\x51\xcf\x44\xb1\xcf\x29\xef\x3a\xb2\xb6\x05\xc1\x0f\x9c\x75\x2c\x6c\x03\xbe\xbd\x9f\x8d\x74\xa3\x86\xff\x1f\x82\x7f\x7d\x7e\xe6\xc4\x86\x4f\xbe\x99\xb1\x23\xa5\x2e\x97\xc7\x20\x37\xcf\x60\x1e\x19\x1e\xa6\x81\x70\x8f\xb2\x99\xbe\x32\x1e\xcc\x0e\xb8\x8e\x31\x54\x26\xaf\x20\xcd\x30\x5a\x07\xd3\x20\xd3\x8c\xb4\xaa\x7a\x98\x28\xb8\x3e\x20\x74\x01\xef\xd9\xc0\xac\xa3\x17\xed\xd9\xd1\x5a\x76\xb4\x96\x7f\x21\x59\x47\x2f\x55\xba\xc1\xf3\x3d\x76\x6a\xc3\x6c\x9f\x2d\x2d\xc2\xcb\xcc\x3e\x7a\x8f\xd9\xaa\xdf\xe6\xb1\xdb\xaf\x40\x7d\x70\xd7\x3e\x7f\x25\x92\x90\x22\x13\xb4\x81\x32\xe4\xa2\x97\x6d\xbe\xd7\x9e\xf3\xcf\x6c\xb4\xd7\xba\x2d\x29\xbb\xe3\xfa\x1b\xc4\xd8\x5f\xed\xd9\x18\x8c\x10\x8c\xcd\x9f\xd9\x13\x4c\x3a\x57\x06\xc5\x05\x18\xe4\xb7\x21\x26\xe5\x07\x76\x4c\xca\x97\x2d\xe9\x9e\xae\x2c\xca\xf3\xc1\xbf\x99\xd6\x56\x64\xbb\xeb\x6d\x7b\x71\x8d\x55\xd9\x75\x5b\xc7\x4c\xdb\x91\xa3\x97\x21\x47\x7f\xcb\x3e\xfd\x7d\xe2\x32\x43\x36\x7e\x62\x70\xc8\xc6\x43\x76\xc8\xbb\xe8\x3d\x79\x73\x59\x74\xc4\x3f\x64\xec\xcd\x9d\x4e\xae\x05\x8d\x23\x2a\xca\x4e\xff\xb7\x5d\xcd\x6e\xda\xe4\x98\xa4\x40\x97\x4e\xcb\x7a\xbb\x91\xa3\xff\xf3\xaa\xe0\xf4\xf0\xdb\xb6\xa6\xdf\x1f\x44\x8a\xa8\x74\x6e\x9c\x98\x23\xa0\xee\xdd\xbb\x23\xa0\x76\x54\xb1\x1d\x03\xd2\x83\x6c\x40\x7a\x4d\x85\x94\xc4\x97\x56\xd8\x1d\xdb\xb2\x9f\x0c\x5f\xf9\xa0\x29\x7e\xf4\xd2\x0d\x4a\x01\xcd\x8f\x49\x25\x1f\x82\x87\xdc\xb0\x74\x5f\x45\x6b\xab\x7f\xef\xb1\x33\x57\xaa\x63\x50\x65\xbd\x7f\x4b\x86\xa6\x87\xbf\x17\x2e\x7a\xf7\x7a\x9b\xef\x3c\xcf\xf4\x9f\x3e\xb9\x2d\xf3\xd2\xf0\xfe\x19\x98\x9c\xff\xcd\xdd\xec\xf1\x56\x8f\x27\xa2\x20\x0c\x61\xdd\xe1\x94\x0a\x0d\xa1\x6d\xb3\x3a\x39\xc1\xd8\x6c\x1e\xd8\x1d\x3c\x77\x93\x67\x8c\x4f\x04\x9c\x43\xd3\xb3\x33\x7a\x93\x80\x38\x5f\xca\xc0\xd1\x81\xfd\x44\xc9\x13\xea\x8c\x75\x79\x6c\x50\x70\xed\x93\x25\x54\xff\xda\xba\x07\x62\x98\x22\xa9\x9c\x6d\xee\x3f\xef\x62\x9f\xf6\xd8\xb8\x7e\xd7\x7f\xbf\x17\xdc\xef\x9d\xb5\x71\xe6\x0b\x87\xd2\xa0\x1c\x41\x83\xe7\x2c\x6d\x78\x6a\xd4\xec\xc0\xe4\x28\x57\x59\x50\x0d\xf4\xed\x42\xcd\x38\x26\x30\x21\x1f\x92\x2a\x18\x79\xc6\x54\xb4\x75\x37\x91\x0f\x0c\x7e\xe5\x38\x36\xd9\xcd\xb2\xfb\x53\x8f\x8d\xc1\x93\xfe\xef\x79\xc1\xaf\x79\xf3\xf0\x92\xa5\x01\x44\x7a\x3f\x36\xf9\xa4\x83\xfa\xae\xcc\x88\xa0\x32\xac\x10\x70\xa6\x5c\x05\xbe\x9f\x82\xae\x81\x7a\xd1\x6a\x4c\x8d\x9f\x82\x0e\xa0\x71\xa3\x94\x5a\x74\x8c\xd9\x53\x41\xbf\xd1\x80\x49\x91\xab\x04\x5d\xbe\x1c\x16\x6e\x46\xde\x7f\xf7\xd8\x1e\xc5\x63\xe2\x7f\xce\x0b\x7e\xd9\x9b\x9e\x9d\x81\x5f\x6a\x8c\xd0\xd8\xa4\x42\xb1\x36\x18\xa0\x99\x26\xb7\xdf\x2d\x45\xe9\x5b\xc2\x52\x34\x38\x6c\xda\x6a\x54\x94\x8f\x53\x4a\x01\xcd\xf1\x82\xf9\x85\x80\xe3\xae\xe8\xa9\xb2\xc6\x64\x27\xcc\x8a\x1e\x5a\x51\xab\xce\xd7\xb2\x41\x2c\x1f\xc7\x49\x4f\x78\x5c\x50\x53\x5a\x82\x9d\x84\x3d\xbc\x2d\xa5\x42\xc0\x66\xf8\xb8\xa0\x76\x76\x40\x84\xde\xd6\x0a\xf9\xcb\x31\x76\xbd\xb5\xda\x89\x0c\x45\xad\xf4\xb9\x6e\x52\x44\x6d\x0c\x62\x55\x70\xd2\x44\x93\xe9\xbf\x6f\x2c\x88\x36\xb8\x4f\xea\x22\x6d\xbc\x0a\x75\x5a\x63\x7f\x37\xa2\x3a\x60\x75\x40\xb0\x5a\x1c\xa7\x6b\xe0\x61\xb6\xcb\xa3\x04\x87\x10\x9c\xd0\xeb\xde\xbf\x23\x83\x81\xfd\x08\xcc\x26\x67\x79\xbf\x65\x94\x7d\xa4\xc2\x86\x3e\xeb\xbf\xb9\x12\x3c\xaf\x32\xec\x2e\x79\xaa\xe1\xb6\x3a\x5d\xda\x0f\xd9\x24\xf3\x6a\x81\xe8\x89\x03\x41\xb5\xe0\x2f\x9f\x36\xa1\x78\xc1\x75\x01\x6f\x8b\x50\xa7\x22\x26\xbd\xfe\x02\x2d\x63\x48\xd5\x91\x09\x90\xff\x0e\xc4\x3e\x85\x68\xdb\xb4\xc5\x35\x3e\x9d\x10\xef\x02\x54\x53\x27\x5e\x82\x36\x59\x6a\x15\x49\x26\xc5\x05\x86\x39\x8c\x43\x59\x7b\xff\xd4\x63\xff\x96\x96\x78\xb9\x20\xff\xd3\x5e\xf0\x7e\x6f\xc8\x4d\x35\xf9\x54\x4e\x46\xdf\x7d\x4a\x68\x4d\x13\x13\x57\xb0\x60\x3d\xaf\xb0\x0d\x95\x55\x88\x0c\x4a\x43\x47\x8a\xba\xc1\xf4\x74\x12\xc5\x86\x08\x19\x18\xed\xb0\x03\x67\x53\x77\xbe\xdf\xbf\x97\xdd\x79\xa9\xfe\x95\x0d\x20\x20\x59\xf0\x1a\xef\xfb\x11\x02\x72\x90\xd1\xfd\xbd\x7b\x76\x0e\x2a\xdf\x2f\x36\xe3\x07\x94\xcd\xf8\xad\x1e\xab\x5f\x19\x68\xc8\x07\x0d\xc8\xf2\x03\xc6\xa2\xfc\x2e\x8f\x89\x07\xbb\xb6\x3b\x18\x96\xdf\x27\x66\x8d\xad\xdb\xe6\x37\xc2\x54\xe4\xdb\x42\x69\x64\xec\x35\xbb\x6c\x08\xc6\x0d\x56\x13\x28\x9e\xf9\x5d\x07\xfd\x3f\x1b\x0b\x7e\x6f\x4c\xfd\x82\xb4\x1c\x64\x45\xc4\xc0\x2d\xd8\x06\x73\xcc\x0a\x85\x18\xc7\xbc\xc8\xba\xd0\x0f\x9c\xf8\xc1\x17\xb2\x08\x70\x36\xd0\x3b\x8e\xb2\xb5\xc6\x18\x84\xcf\xad\x88\x1e\x40\xc5\x20\xcf\x79\xc8\xf7\xd5\xf6\xf5\xcb\x47\x3a\x03\x00\x9f\x19\x8e\x26\xa8\x3a\x61\xbc\x16\xf6\xa4\x3c\xec\x90\x97\x1a\xb7\xee\x5c\x14\x55\x84\x62\x20\xa9\xeb\x94\x17\x4a\x99\x38\x89\x25\x02\x27\x90\x68\xe3\x8e\x49\x0f\x23\x51\x3f\x50\x57\x59\x69\xc9\xb9\xdc\x13\xba\x19\x55\x3e\x3f\xc6\xf7\x35\x8f\xdd\x0c\xfb\xc2\x3e\x45\x69\x87\x3f\xcb\xca\x62\x68\x60\x77\x54\xcf\x40\xe5\xa0\xdd\x98\x6c\xdf\xe1\xfb\x56\x8f\xdd\x0c\xf3\xd0\x2a\x0d\x7f\xab\xe2\x80\xab\x85\x3f\x3b\xc7\xf8\xc4\x76\x58\x38\x29\x14\x14\x97\x0f\xea\xcc\xbe\xe8\xd8\xcd\x51\xd2\x10\x17\xac\xb2\xf0\x37\x64\x5c\x43\xf2\xa9\x32\x5b\x2a\xfd\x87\xde\xdf\xb7\x72\xec\xe6\x15\xd1\xcb\xad\x37\xe1\x27\x6e\x61\xb2\xa2\x69\x93\xdb\x1f\xdb\x97\x43\x3b\x68\x06\xe0\x1a\x8c\x32\xde\x4d\xa2\xbb\xbb\x3a\xe7\x68\x46\x7e\x69\x05\x68\x4e\x3b\xb9\x33\x50\x38\xa5\xd4\x22\x35\x03\x0d\x1b\xb8\x7c\xc3\x3e\x76\xb9\x84\xcc\x52\xdb\x62\x6c\x41\xf7\x0c\x6d\xd8\x91\xd2\x8e\xa1\xc3\xf3\x68\x59\xa3\x2c\xeb\x49\xd9\x98\x6c\x8b\x6c\x59\x4c\x36\xa2\x66\xd3\xda\xbd\xd9\x47\x47\x37\x8e\xa2\x18\x08\x62\xe8\xbf\x70\x34\x38\x59\xba\x86\xbd\x85\x1b\x41\xc7\xb6\x11\xf5\xc1\x89\x5a\x8c\xe3\xae\xc9\xf8\xe7\x47\xd8\xb7\x2b\x6c\x3c\xec\x36\x22\x79\xb0\xc8\xfd\xaf\x56\x82\xdf\xa8\x4c\xab\x9f\x6e\x2a\x86\x2c\xda\xa4\xf8\xe7\x86\x78\x45\x2b\x14\xe4\x3d\x34\xc9\x39\x9a\xe5\x8d\x02\x39\x2c\x93\x41\x5e\xe3\xea\x3b\x93\x08\x12\x31\x00\x05\x95\x12\xc9\x56\x45\x86\x6c\xd4\xf4\x41\x7c\x72\x2d\x04\x0c\x03\x91\x34\x08\x0b\xdb\x21\xda\x56\x69\x34\xa6\x2d\x09\x6e\x04\xa8\x78\x42\xae\xb7\x75\x57\x56\x80\x00\x36\xe8\x44\xa9\xee\xd1\x69\xc7\xe5\x4c\xd3\x37\xe9\x33\x16\x3c\x93\xd9\x32\x37\xd0\xd2\x6f\x60\x63\xd0\x08\xbf\x16\xfc\x87\x05\x15\xe4\x02\xc7\x85\x4e\x78\x37\xa0\xb9\x84\x19\xd0\x4d\xad\x08\x37\x21\xeb\x85\x57\xb3\xa3\x1b\x26\x4d\x1c\x1a\x96\x34\xe1\xff\xe6\x55\xc1\x6f\x7b\x1b\x24\xdd\xf4\xbb\x1c\xf0\xf4\x36\x34\xc9\x43\xb1\xc4\xc9\x2b\xed\x50\x0e\x59\x0c\x6c\xb6\x49\xb8\x2c\x94\x12\x02\x54\x49\xbc\x9e\x76\x13\xe4\x74\x4f\x7a\x56\xd2\x99\x22\x5b\x56\xe2\x17\x93\x0c\xf3\xee\x92\x39\xf9\x86\x96\x46\xad\xd2\xf3\x0c\x9f\x98\x33\x99\x2f\x8e\xef\x28\x0a\x3b\xfe\x8f\x87\xef\x58\xf1\x65\xdb\xff\xf1\xbb\x97\xed\xff\x78\xa5\x37\x34\xbb\x46\x71\xb3\x3e\xe4\xbe\x8f\x17\x28\xdf\xc7\xff\xde\x24\x20\x65\xab\x42\x09\x4e\x34\xef\xf5\xf2\xa1\x0c\x91\xca\x38\x48\xfe\x8e\x6e\x66\x04\xbb\x2a\xe3\xa1\x36\xf2\xd7\xd8\x2b\xcc\x39\xea\x85\xde\xb6\x10\x05\x87\x77\x04\x1e\x96\x6e\xc8\x75\x6c\x8e\xed\xe5\x18\x1c\x38\x64\x75\xc1\x45\xaf\xbd\xb9\x86\xff\x24\xff\xf6\x4b\xc9\xb0\xea\xcf\xae\x3a\xc4\xd8\x6f\x8c\x0c\x84\x5b\x53\xa7\x02\xd0\xb8\x34\xf9\xf1\x1b\x47\x82\xa7\x0e\xbc\x63\x2b\x5e\xfd\x50\x8a\x39\xdf\x5f\xef\x74\xab\x2a\xc3\x5c\x41\x07\x45\x19\x4f\xbb\x45\xa7\xab\x94\xb1\x75\x4f\xa3\x95\x3a\xfb\xc1\xdb\x2b\xec\x29\xec\x6a\x5d\x2c\x58\xc0\x6e\x0f\x1e\xa7\x13\xee\x41\x75\x3e\x66\xcc\xfd\x72\xaa\x21\xf2\x57\x5e\xa5\xf4\xf1\x30\xa6\x2c\x9d\x55\xbe\x1a\x66\xce\x6a\x7f\x85\xc7\x76\x37\xa2\xd5\x28\x4f\x33\xff\x05\xdb\x89\x97\x18\x90\x1b\x7c\x92\x92\x9c\x68\x6b\x72\x5a\xa7\xe6\xbb\xb2\x2e\xe9\xce\xa9\x2a\x9d\x04\x79\xb7\x0f\x06\xec\x7a\x0b\xb6\x75\x22\xf8\x21\xc5\x4e\x7d\xcc\x12\xcd\x29\x51\x23\xda\x2d\x79\xfe\x2e\xb6\x6f\x83\xa1\xa4\x62\x80\x3d\xc8\xff\xe2\x58\x30\x3d\xe8\x46\x29\x59\xae\x9e\xb6\x3b\xdd\x42\xd8\xa0\x98\xe6\xd9\x12\x16\xd9\x18\xfb\xae\xc7\x76\x21\x14\x81\xff\x4d\x2f\x78\xa3\x07\xb0\x41\xe5\x22\x15\x7a\x50\xd8\x56\xba\x44\xf9\x23\xda\x08\xbb\x6d\x9e\x47\x47\xeb\x99\x42\x05\x66\x52\x17\x3b\xa9\xa7\x50\x3e\xf5\x2e\xef\x56\xf6\xf8\xcb\x1a\x6c\xfb\x28\xf0\x62\x00\xda\xc5\x9d\xcd\xff\xdf\x95\xe0\xdd\x95\x39\xb5\xcf\x95\x1a\x4f\x6c\xb6\x1b\x35\x5e\xbb\x29\xa4\x6e\xab\xcb\x91\x5b\x71\x3b\x82\x53\x9c\x42\x59\xa4\xc6\x00\xba\x91\x3d\x85\xa8\xdb\xc1\xef\x84\x47\x1c\x45\xe7\x1a\xf7\x6c\x77\x0b\x38\x4d\xd6\xa2\x5c\x85\x6c\x6b\x35\x0e\xba\x6f\x52\x9d\x8b\x28\x38\xfd\x9f\xc9\x50\xbc\x73\xc4\xc1\x82\x53\x8b\x60\x81\x70\xec\x94\xc0\x02\x7e\x59\x6b\xe2\xfb\xdf\xaa\x04\x3f\x3e\x6d\xe0\xee\x72\x23\xd8\xf4\x33\xa4\x41\xa9\x3b\x0e\xc5\x29\xa2\x5b\x01\x8b\xab\x45\xb3\x9b\xf0\x30\xee\xb4\x42\xed\x5a\x53\xda\x62\xbd\x15\x26\xcb\xc6\x76\xdc\x95\x37\x6b\xeb\xde\xc8\x8a\xe8\xad\x7b\xbb\x50\x6f\x74\x16\xd7\xef\x78\xec\x56\x26\x6f\xfb\x37\x06\x8f\x5d\x00\x75\x74\x49\xc4\x70\xe4\xd5\x87\x29\xc3\xa4\xdd\xe9\xc4\x20\x82\x5c\xc6\xcc\x9f\xf2\x18\x15\xed\xdf\xe7\x05\xcb\xd3\x09\x87\x23\x8d\x49\x7f\xd3\x0a\xeb\xb9\xc4\x81\xa0\x32\xac\x9a\xf8\x55\x74\x60\xe0\xe7\x44\x39\xab\x91\xdf\x85\x87\xf8\x28\xe7\xe7\xe6\x40\xb3\x1f\x7a\x76\xba\x6f\x94\x1d\xb2\x86\x6a\x40\x02\xc5\xed\x0b\x0b\xb3\xe4\xb3\x9c\xeb\xc6\x04\xe0\xf0\xd9\x91\xe0\x67\x2b\x83\xee\x94\x00\x07\x8a\xa2\x63\xd8\xb2\x91\xf0\x18\xf4\xdc\x94\x2f\x85\xf5\x15\x91\x34\x72\x50\x37\xc9\x58\x22\xe7\x3e\xce\xec\x63\x53\x53\x37\xb7\xd2\xbc\xb8\x65\xea\xe6\x4e\x58\xb4\x6e\xb9\xf5\xe6\x5c\x48\xcd\xa2\x13\x66\xc5\x2d\x7c\xf2\x16\xf5\x3a\x59\x3c\xf0\xbf\xf2\xa6\x86\xf2\xe8\x66\xb1\x85\xaa\x2c\xbf\x38\x77\xea\x38\x3f\x7c\xd3\x8d\x47\xab\xea\x68\x42\xe2\x54\xc1\xab\x28\xef\x3a\x76\x75\xb8\x1c\x46\x49\x5e\x58\x6c\xdd\x3c\x6c\x16\x14\xb8\x1b\xcb\x83\xf1\xbe\x29\xcc\x60\x20\x10\x16\xb4\x84\x64\xf2\xc6\xad\xfb\x78\x9a\xf1\x7d\xd7\xee\xab\xad\x7b\x63\xb2\xfe\xee\x44\x7a\xb9\xc7\x5e\xe6\x31\xbc\xe1\x3f\xdf\x0b\x8e\x4c\x97\xa9\x4a\xe5\x1d\x35\xb7\x3b\xb6\xbe\x6e\xba\xcd\x1e\xd3\x0d\xd7\xee\x26\x63\x3a\x1b\x16\x2d\x76\xff\xd5\x4e\xe4\xaf\x13\xe4\xa0\xe2\x1b\xfc\x7b\xaf\x0e\x9e\x57\x51\xb8\xef\x03\x82\x7e\xb3\x6e\xac\xdc\x81\xc8\x79\xad\x92\x43\xeb\x69\x92\x10\xf4\x27\x12\xed\x86\x34\x95\xd5\x21\xc5\xd8\x7f\x20\x21\x94\xda\x08\x7e\x3d\xf5\x3d\xf2\xa4\x6b\x48\x46\x18\x29\xb9\xe0\x15\xf8\x7e\xce\x15\xd1\x40\xdc\x9b\x84\x4f\x80\x0b\xb5\x9b\xc5\x79\x15\xb0\xf8\x39\x81\xf1\xf3\x22\x0b\x9b\xcd\xa8\x5e\xe5\x85\xc8\xda\x51\x12\x16\x82\xcf\xcf\x9f\xae\xf2\xb4\xd9\x24\x3d\x86\x4e\xca\xab\x51\x06\x76\x75\x39\x11\x21\x9a\xbc\xa8\xbb\xdb\xed\x4f\xed\x64\x99\xee\x1c\x92\x1f\xc6\x43\xf2\xef\xd8\x87\xe4\x5f\xbd\xec\x43\xf2\x7d\x1b\x60\x20\x3c\x74\xc7\xe2\x3f\x54\x3e\xc0\xcf\x7b\x1b\xc0\xd5\x0e\x14\x51\x70\x00\x7e\xbd\x37\x6f\x1d\x80\x55\x88\x9f\xe3\x1b\xa3\xc7\x1f\xf2\xb0\xbe\x3f\x35\x47\xdd\xdf\xf5\x36\x60\x0b\x1d\xdc\x38\x3c\xd4\xae\x7b\xf3\x03\x4f\xb5\xdf\x0f\x0d\xbc\xe8\x3d\x73\xf3\x83\xf3\xe3\xfc\x9b\xf4\xc1\xd9\x6a\x68\xc9\x2f\x46\x2d\x28\xbb\xc1\xbe\x38\xea\x60\x58\xaa\xb4\x85\x39\x34\x8d\xce\x0b\x0b\xbc\xfe\xdd\xa3\xc1\xe9\x01\xd7\x4b\x87\x01\x8b\x22\x47\xd9\x57\x73\x51\x20\x0a\x6a\x5d\x64\x80\xad\x0c\x32\x62\x63\x64\xfb\x4f\x8c\xb0\xd7\x7a\xcc\x97\x7a\xc1\x42\x16\x26\xe8\xae\x59\x88\xda\xc2\xff\x09\x76\xc3\x25\xac\x4a\xf9\x6a\x70\x62\x41\xa9\x1a\x45\xd4\x16\xca\xa4\x4c\xcd\x28\xf4\x67\x14\x18\x49\x9a\x08\x15\xc1\x09\x67\x09\x38\x5a\xd4\xd8\x53\x0c\xe2\xfe\xd9\x60\x7a\x9a\xb7\xba\xed\x30\x91\x9b\x70\x03\x36\x48\xba\xa7\x3c\xca\x80\x84\x2b\x8a\x30\x8a\x73\xcb\x38\x62\x3e\xe6\x68\xb3\xa7\xd8\xae\x4c\x84\x79\x9a\xf8\x37\x07\x53\x88\x12\x1c\xe6\x96\x9d\x49\xd7\x76\x5f\x4e\xed\x18\x5c\xce\x69\xbd\x2c\x6e\x0b\xae\x1f\x82\xcf\x5f\x55\x8e\x88\x85\x4c\x6e\x67\x80\xbb\x5f\xe5\x04\xb9\xef\x94\x76\x98\x10\xf7\x1f\x1b\xfc\x9f\x0b\x3a\x82\xcc\x0c\xad\x2e\xd1\x79\xe9\x63\x7b\x1c\x13\x4c\x39\x0d\xcc\x1c\xe0\xbb\xb1\xf0\x5f\xbe\x27\x78\x8f\x67\x5f\x29\x43\x39\x85\x4a\xdb\x69\x81\x05\x1e\x36\xa6\xc8\x41\xe6\x55\x09\xa1\xe0\x4c\xa2\x6d\x11\x3d\x9a\x58\x46\xd6\x10\xb0\xff\x45\x79\xb2\xaf\xb0\x61\x90\xab\x78\x78\x21\xd8\xef\x46\x17\x1a\xa6\xd1\xfb\x3a\x69\x9e\x47\x4b\x71\x0f\xa3\x62\xe4\xb9\x36\x16\x85\x3c\xd6\x8c\xad\x8a\x6c\xc9\x9d\xb3\x9f\xd9\xc5\x3e\xec\xb1\xab\xd5\xe7\x31\x22\xec\x1d\x5e\xf0\x12\xdd\x34\x3b\x0c\x4c\xdb\x70\xd6\xa4\x44\xd0\x2d\xb5\x62\xc0\xc0\x47\x21\x3b\xc3\x3a\xfb\x70\x13\x9b\x25\xfb\xde\x0a\xfe\xb2\xf4\xea\xc8\x32\x36\x58\x31\x62\x61\x1c\x6f\x74\x72\xf9\x8a\xc7\xc6\x75\xd7\xf9\x5f\xf4\x82\x0f\xeb\x7a\x97\x7c\x6d\x56\xf4\x06\xa8\x5b\x7d\x75\x74\xbe\xa9\x4e\x84\x26\x96\x4d\xc5\x5d\xe6\x35\xc6\x83\xeb\xa6\x9a\x69\x1a\x94\xb3\x4b\x6c\x37\xcb\xbe\x66\x9a\xee\x43\x03\x01\x00\xca\xe9\x3a\x0d\x2f\x77\x83\x66\xbe\xd9\x63\x38\x76\xfe\xab\xbd\x60\xed\x2e\x91\x2d\xb9\x8d\xb3\xe8\x9b\x74\x0d\x28\x6d\x7b\x29\x47\x60\xff\x63\x7c\x59\x14\x55\x78\xa3\xca\xd7\xe4\xe9\xa6\x4a\x30\x46\x55\xd2\x67\xaa\xbc\x21\xe4\x44\xa9\xf2\x4e\x96\x5e\xe8\x6d\x67\x18\xee\xab\xb0\x71\xdd\x10\xff\x6f\xbd\xe0\x0f\x75\x64\x6a\x3e\x08\x25\x51\x07\x83\x2a\x88\x75\x39\x8f\x4b\x51\x36\x08\x1f\xdd\xee\xc6\x45\xd4\x89\xad\x58\x53\xca\xc8\x37\xd6\x93\x30\xe9\xd1\x5a\xb3\x30\x0a\xd5\xc9\xcd\x72\x5c\x8a\xa4\xdb\x16\x19\x40\xf9\x38\xe3\x21\xdf\xd7\xa5\x1b\x9c\xcd\xed\x4f\xc6\x6f\xed\x65\x37\x6e\x9e\x45\x2a\xe2\xe6\xa0\xf4\xf2\xf7\xed\x0d\xbe\xeb\x0d\xb9\x39\x20\xc7\xdc\xde\xf5\x21\x4e\x69\x70\x82\x39\xe7\x67\xd3\x02\x92\x52\x35\xfc\xb7\x8e\x8b\xc3\x58\x67\x6c\x59\x10\x41\x8c\xa7\x89\x81\xce\x03\x00\xb9\x8e\x9b\xa4\x88\x13\x16\x68\x3d\x94\x02\x77\x49\xd4\xc3\x6e\x8e\x01\x52\xfa\x50\x42\x21\x1d\xb2\xeb\x08\x0b\x14\xd9\x45\xac\x5c\xd7\xde\xe0\x5a\x0e\x0a\xc8\x7b\xf7\x4e\x16\xfc\xce\xa9\xea\x5f\x4a\x44\xe3\xcf\xab\xd3\xcc\xfd\x9b\xf8\xb6\xb6\x2e\x2f\xe0\x94\xf3\x63\x97\x9a\x09\x5f\xe3\x28\x34\xe4\xcc\x25\xa1\xaa\x22\xac\x61\x9f\xfe\x67\x97\x29\xbf\xba\xf9\x91\x63\xde\xbf\x73\x72\x6b\x69\xf1\x83\x7b\x7c\x60\x62\xd0\xbd\xa3\x9b\x80\xb6\x1e\xaa\x1d\xcf\xd2\x3c\x27\xa1\x55\x46\x72\xf9\xf4\x48\xb0\xb4\xc1\x7d\xb3\x33\x8a\x24\xed\x2e\xb7\x9c\x41\x2e\x52\x1e\x8b\x82\xf7\xd2\xae\x8a\x02\xea\x71\x8d\x7a\x92\x6d\x31\xf5\xe7\x53\x15\xf6\x7a\x8f\xa4\xc4\xcb\xbd\xe0\x5e\x6f\x10\x72\xcb\xe3\x1e\xc2\x35\xe8\xd0\x5c\xc5\x94\xcd\xd1\x08\x9e\x3c\x08\x01\xa6\xaf\x5e\x83\x3d\x21\xc0\xef\xb1\xdc\x8d\x1a\x62\xca\x0a\xb6\xba\x36\xd1\x89\x12\xf4\xb5\xa3\xce\x76\xb3\x3f\x78\xf4\x06\xc0\x37\xf6\x7b\xbf\xbe\x97\x1d\x18\xe0\xe8\x78\xe2\xf1\x93\xb3\xf2\xe5\xbc\x10\x49\x71\x22\xca\x57\x1c\xbe\xac\x57\xed\x0d\x3e\x55\x71\x08\xb3\xcc\xc3\x5c\x3e\xed\x20\x49\x3f\x31\x4d\x97\x63\xc1\x8f\x93\x8b\xea\x64\xb2\x1c\x25\xa2\xc6\xd8\x34\x7f\xe2\xf1\x93\x7c\xf6\x04\xae\x5e\xe4\xb5\x20\x4b\x34\xf8\xb5\xc8\xcc\x6e\xf9\xa8\x28\xc5\x40\x7e\x00\xde\x09\xe3\x3c\xb5\xa2\xe7\x73\xd9\xcd\xb2\x4c\x62\x6a\x82\xd5\x78\x8f\x54\xa2\x42\xdc\x69\x65\xff\xc6\x02\xf2\x0c\xe8\xd3\x72\x4b\x87\x94\x8c\x25\xfa\x28\x42\x48\xcb\xb3\xe5\xd4\x5a\x26\x8f\x09\x29\x84\x75\x65\x70\x69\x12\x1e\x6d\x4b\x9d\x4b\x9e\x67\xf3\x1a\x15\x93\x2b\x8c\x25\x9e\xae\x25\x22\xcb\x5b\x51\x87\xe2\x9e\xc0\xe1\x23\xab\x31\x7f\xf2\x74\x94\x74\x2f\xf0\x4c\x80\xf7\x43\xae\xb1\x75\x6f\x57\xa7\x71\xb6\x3c\xa9\x3f\xb8\x87\xfd\xa2\xc7\xe8\x8e\x3c\xcc\xbc\xc1\x3b\x8f\x71\x8d\xb6\x0e\x3a\x7b\xc2\xed\xe2\xe3\x27\x6b\xfc\x3c\x59\xff\x9d\x05\x05\x9d\xa5\x9e\xd8\xa6\xf3\x8d\x80\xf0\xa7\xc8\x0b\x7e\xed\x72\x5d\x74\xf4\x38\xcb\x82\xed\x89\xf4\x09\x8f\xed\x91\x7d\x74\x2e\x89\x7b\xfe\x2f\x78\xc1\xcf\x78\x73\xf4\x8b\xa3\x83\x03\xe3\x5b\x71\x5b\x16\x5c\xdf\x54\x3c\x34\x51\xc2\x71\x8e\x9d\x91\xc3\x90\xd7\xf8\x09\xcb\x17\xd9\x94\x67\xe5\x07\xa3\xfe\xe3\x6c\xf7\x52\x9a\xc6\x22\x4c\xd8\xa7\x2a\x6c\x57\x33\x97\xe7\x6d\xff\x83\x95\xe0\x9d\x95\x53\x51\x2c\xf2\x5e\x5e\x88\xb6\x4e\xe3\x02\x6d\x0d\xc9\xc0\x40\xf7\x97\xe2\x6b\x2d\x4c\x20\x0c\x10\x66\x4f\x8d\x2f\x44\x9d\x63\xfc\x64\x92\x77\x33\x61\xce\x94\xcd\x52\x51\x51\x6e\x40\xb9\xd4\x06\xd2\x02\x9a\x9f\x8e\xd4\xf1\x81\x90\x17\x1e\xaf\xf1\x93\xe8\x53\xca\x8f\xf1\x40\x5c\x28\x8e\x04\x55\x1e\x5c\x68\xe6\xf2\x9f\xa4\x68\x4a\x3d\x77\xa6\xad\x9d\xb2\xa0\xca\x64\x9a\x37\x07\x5f\xe0\x51\x93\x77\x13\x13\x23\xf7\xa0\x4e\x82\xef\x55\xd8\x78\x27\xcc\x0a\xb4\x5f\x7d\x53\x73\xdf\xfc\x7e\x65\xa1\x85\xde\x2d\x34\xfd\xd0\x82\xdd\xa4\x2f\x67\x9a\xca\x59\x5d\x75\x72\x91\xa2\x5c\x3f\x24\x7b\x8f\x4a\x91\xcb\xc3\xee\xaf\x53\x3a\x7e\x83\x4b\x69\x3e\x95\x37\xc2\x83\x55\xf8\x8c\x4a\x3e\x2d\x9c\x3a\x85\x39\x0f\x0e\x06\x35\x3e\x8f\xb0\x9f\x71\xaf\x6a\xd7\xd1\x3c\x27\x8f\xc5\xaa\x40\x59\x95\xe0\x40\xc0\xf7\xa7\x19\x94\x2c\xc5\x49\x2c\xc2\x55\x9c\xe3\x9d\x4c\x8e\x67\xd1\x43\xb5\x64\xe2\x41\x9a\xbf\x0a\xa8\xfe\x2b\xbb\xd8\x0f\x0f\x06\x9e\x3d\x71\x76\x1e\xb3\x84\xfd\x4f\xee\x0a\x9e\x65\x5f\x70\xce\x21\x27\xce\xce\xdb\xd4\x64\x08\x30\x81\xd4\x0f\x61\x43\xd9\xec\x52\xe2\x4d\x58\x16\x09\x1d\x47\x41\x6b\x3e\x71\x76\x7e\x16\x33\x0d\x1d\x61\xf6\x85\x31\xf6\x7f\x7b\x6c\x2f\xec\x56\xa8\x73\xfb\xef\xf7\x82\xff\xcb\x33\x60\x2f\xf2\xa3\x20\xd8\x48\x81\x32\xa8\xb2\x68\x4d\x8a\x2c\xf2\x88\x4e\x07\x83\x7b\xe9\x40\xb3\x14\xe6\x94\xd7\x4b\xea\xfc\xd0\x3a\xf1\x13\xca\xc8\xd4\x70\x5e\x50\x25\x67\xa2\x9d\xae\x6e\xec\x65\xfe\x40\x85\xed\x26\x0e\x09\xff\x81\x4a\xf0\x67\xa5\x26\x48\x61\x1c\xaf\x1a\xa6\xc2\x52\xd5\x21\xf4\xdb\x8a\x7f\x86\xaa\x2b\x4a\x8a\x2d\x55\x5b\x21\x03\x97\xab\xcc\xe7\xe4\x97\xbb\x78\x40\x54\x05\x42\x14\x41\x94\x70\x95\xb9\x09\x2f\xa5\xab\x22\xcb\xa2\x86\xa0\x01\x44\x2f\x27\x24\x02\xa9\xe5\x08\xb5\xb2\x47\xd2\xf4\xc6\x0d\xec\x7a\x76\x78\x53\x92\x43\x7b\x6a\xe1\xb7\xd9\x6f\x7b\x6c\x0f\x3a\xbe\x45\xee\x7f\xca\x0b\x7e\xae\xd4\x71\x78\x8f\x37\xd2\x36\xa8\x8a\x72\x71\x49\x49\x88\x14\x15\x71\x9a\xae\x74\x3b\x5b\x99\x06\x54\x0c\xba\x9d\xb7\xd4\xa1\xce\x1b\xdb\x98\x08\xdf\x64\x03\x15\xa6\xf9\x7a\x18\x8b\x99\x73\x46\x0f\x72\x14\xa6\x0f\xb2\xe0\xc4\x86\x4f\xb8\x29\x85\x66\x95\x73\x7a\x8b\xc4\xd0\xba\xb7\x7b\x39\x2c\xc4\x5a\xd8\x5b\xf7\x76\xe1\x16\xb1\xee\x8d\xe7\x80\x3f\x38\x27\x9a\xce\xda\xfb\xf4\x38\x7b\x1a\xdb\x4b\x32\x64\x36\x4d\x63\xff\x74\x70\xab\x14\xc3\xaa\x48\x22\xb4\xe1\xf2\x5e\x1f\x69\x3d\xc9\xaf\x82\x9c\xe3\x38\x3e\x8e\xbd\xf9\x5e\x8f\x31\xac\x15\x68\x2a\x79\xd0\x5c\x70\xf2\x4f\x48\x70\x86\xb1\xd4\x0a\x7a\x1a\x75\x9c\xe6\x9a\xaa\x84\xda\x16\x29\xc4\xa8\xbf\x1a\x51\xee\x72\xb0\x3a\x75\x68\xb2\x47\x9a\x4a\x9e\x80\x3a\xfa\x73\xc1\xc9\x85\x92\xc5\x4e\x7d\x6c\xd6\x34\x08\x1f\xb6\xed\xfc\xca\x2b\xaf\xe8\x7f\xec\xef\x5c\xb0\x74\x9b\x38\x78\x66\x9f\x6a\xc2\xf7\x1b\x8d\x71\xa2\xc6\x2f\x4f\xf3\x71\xb4\x92\x45\xc6\xf2\x3c\x3e\x89\xe9\xf7\xfe\x5c\x70\xe2\x54\x1c\x2e\x1b\x66\xcd\xa9\x46\x94\x83\xc5\x6a\x7e\xfe\x34\xa7\xa3\x0c\x85\xca\x42\xff\x3d\x11\x67\x8b\x0e\x0e\xc4\xea\x3a\x5f\x78\x95\xa7\x67\x09\x90\xd8\x3e\xdf\x0b\xba\x33\x03\x8f\xb0\x8a\x2b\x0d\x23\xc7\xd4\xa8\xe8\x84\xd7\x85\x56\x54\x5f\x99\xcd\xd2\xd5\x88\xcc\x59\x69\x26\xaf\x25\xd6\x25\xad\xd5\xc9\xb1\x2e\xdf\xb3\x3b\xfc\x1c\xa3\xe9\xed\x9f\x0c\x6e\x2c\x0f\xa7\xaa\x07\xcd\x9d\x30\xb7\x87\x2f\x4a\xd4\x70\x3b\x05\xbe\xd5\xd3\xda\xdd\x6b\xbd\xe0\x45\x5e\x59\xbb\x33\x5a\x87\x66\xde\xed\x53\xdb\xb6\xae\xb3\xd5\x86\x69\x6b\x56\xf3\xe1\x8e\x5d\xc5\x13\x4c\x2d\x6e\xff\xa6\xa0\xba\xa0\xca\x57\x20\xeb\xa5\xb9\x2c\xcf\x77\x34\xba\xb5\x12\x72\x97\x11\x08\xfe\xc7\xbd\x0d\x08\xb3\xb4\xec\x52\x8f\xe3\xc1\x3d\x78\xb1\xa7\xaf\x18\x94\x01\x6d\x47\xc4\xc2\x61\x12\xa8\xba\x68\x73\x0c\x02\x28\xe4\x22\x21\x2e\x52\xeb\xc8\x0f\xea\x5c\x41\x21\x6d\x49\x5a\x58\xe9\x35\xa7\xd3\xe5\x28\x51\xfd\x08\x33\x57\x2e\x98\x30\x8a\x6b\xec\x7d\xa3\xac\x3a\x28\x0e\xaf\xd7\x11\x8d\xd3\x69\x3d\x8c\xcb\x46\x89\xe7\x8f\x06\x3f\x3e\xf4\xee\x56\x4d\x12\x08\x9a\x8f\x7e\xc3\x1e\x82\x69\x28\xac\x05\x65\x4e\x8c\x92\x1c\xf7\x52\x3a\x76\x6a\xdb\xf3\x46\x06\x8b\xaf\x56\xfe\x65\xa3\x60\xdc\x46\xc6\x98\x63\xc1\xe4\xb6\x50\x30\x86\xd0\x54\x6d\x0b\x04\xc3\x2e\xe3\x8f\x46\x1d\x54\xb6\xb0\x41\x9c\xdb\x99\x58\x8e\x00\xba\xc2\xb5\x51\x42\xf4\x95\x99\x42\x6f\x1e\x0d\x1e\x57\xbe\x48\x76\xca\x12\x40\x31\x3d\x55\x8b\xc5\x72\x58\xef\x91\x45\x69\xdd\x33\x60\x34\x83\x26\xc1\x27\x46\xd8\x13\xa8\x8d\x37\x06\x8f\x5d\x94\x7f\x2c\x0e\x72\x33\x51\x54\x58\x8d\xab\xc0\x6d\x57\x3e\x5a\x88\x37\xb7\x05\xd7\x2f\xea\x5f\x8b\x43\x11\x6f\x36\x2c\xb0\xc9\x46\xa5\x2a\xe4\x3f\x33\xb8\x73\x51\xfe\xb1\x58\x76\x9a\x9e\x9f\x3b\x8d\x94\xde\x98\xe4\xa5\x34\xa6\x1c\xf3\x11\x28\x93\x0b\x4d\x9c\x20\x28\x00\xef\x06\x3f\x68\x7f\xe7\x93\x1e\x1b\x95\x42\xd4\xff\x90\x66\x0b\x7b\x9b\x37\xd3\x2c\xcf\x5c\x34\xa6\x24\x76\xbd\x89\x8e\x97\x22\xd9\xd6\xc4\x52\x2b\x4d\x57\x8c\x44\x2d\x52\x7e\xe4\xc8\x61\x58\x37\x4b\x61\x7d\x65\x2d\xcc\x1a\xc8\x27\x57\x44\x4b\x51\x1c\x15\xbd\x1a\x5f\x94\xa5\x2e\x5a\x3b\x56\x48\xe8\xd9\xf0\x35\x62\x63\xdd\x7f\x70\xf2\xe8\xf5\xd7\x1f\xbe\xbe\x8a\xdc\x1a\x79\xb4\x2a\x26\x4a\x9c\xb7\x23\xec\x31\x83\x80\x27\x45\x27\x4e\x7b\x6d\x91\x14\x0a\x38\xc5\xff\xf3\x4a\x70\x7b\xff\xe5\x72\xb2\x7e\x0a\xce\x7d\x39\x50\x60\x03\x03\x96\xe4\xb4\x41\x24\x14\x89\x80\x74\xe0\x52\x94\xfc\x2b\x2a\xac\x45\x31\x02\x8b\xc1\xbc\x8a\x11\x68\xe8\x4f\x81\x67\x02\x6c\x00\x73\x02\x15\xaf\x00\xf0\x7d\xe6\x52\xf0\xa5\x9d\x07\x67\x85\xbb\x1d\x39\xb7\x9c\x21\xfb\x59\x8f\x5d\x9d\xd9\x77\xfd\x57\x7a\xec\xc6\x4d\x81\x38\x9d\x02\x4d\x2f\x04\xe7\xe9\x06\xb9\x4c\x68\xef\xc6\x93\x67\x5e\xe3\xb3\xa8\x06\x13\x50\x4a\x93\xf7\xf7\x1f\x34\xf7\xf1\xa5\x0a\xb3\x57\x7b\x36\x9f\xfa\x06\xae\x8d\xd9\xb0\xa8\xb7\x7c\x11\xfc\x18\xfc\x01\x09\xbe\xb4\x13\xe9\x80\x4c\x30\x39\xca\x5d\x8e\x56\x24\x64\x9a\x90\x96\x50\x4a\xef\x9c\x9d\x5e\x38\x7e\xbb\xf1\x54\xa4\x0d\xe7\x04\xcc\xfe\xbb\xcf\xfe\xfd\x80\xfd\xeb\x6c\xda\x10\xe8\x4c\xf0\x7f\xc9\x0f\x1e\x6f\x7e\x02\xbb\xc8\x40\x67\xc8\x20\x84\xb3\x24\x6d\x08\x77\x62\x7c\xe3\x51\xec\x6e\xb6\x2b\x6a\x87\xcb\x22\xf7\x97\x83\xc7\x9c\xa6\xa3\x96\xc5\x19\x08\xf7\x70\x6d\xc1\xae\xd1\x10\xf6\x69\xe7\x30\x3b\xc8\xa6\x36\xd5\x18\x74\xd2\xcc\x8c\x2c\x8d\xfd\xbc\xc7\xf6\xc8\x82\x66\x92\x66\xea\xff\x8c\xb7\x85\x02\xa0\xc5\xa0\x2e\xc9\x77\x82\x74\x9e\xc8\x58\x1a\xf9\x54\xb7\x1b\x61\x52\x37\xa6\x73\xcb\x59\x60\x1b\x34\xa1\xcd\xdb\xb5\xa4\xc8\x97\xf0\xbf\x53\xd7\xca\xb7\x58\x83\x5d\x45\x56\x95\x99\xe4\x7c\x2e\xfc\x85\xe0\x46\xd5\x55\x61\x51\xa8\xd0\x5b\x7a\x44\xca\xb7\xae\x54\xf2\xc9\x42\x3c\xa1\xf4\x3f\xea\xff\xa1\x67\xc5\xb7\x57\x18\xd3\xc1\x3a\xb9\xff\xba\x4a\xf0\x3c\x4f\x87\x71\xe9\xd8\x7e\x15\x3e\xaf\x46\x38\x5d\x02\xfb\x44\x03\x8a\x37\xc1\x3e\x83\xfd\xb0\x5b\x6d\xb5\x2e\xc6\xae\xee\x21\x76\x80\xd5\xb6\x34\x56\xba\xd6\x17\xbd\x7d\xec\x87\x1c\x6f\x55\x47\x2e\x23\x4a\x6e\x5f\x11\x3d\x7f\xb7\x3f\x26\xd7\x0a\x93\x4f\x3e\x7a\xc0\x93\x0a\x3b\xca\xdf\xe3\xef\x82\xb7\x18\x2b\xd8\x23\x10\xf4\xf7\xa4\x0a\xa7\xf6\xc3\x0d\x82\x0b\xed\x8a\x9d\x70\xdf\x0b\x26\xf4\x9f\x06\x4a\x38\xe7\x59\x37\x49\x80\x05\x14\x77\x14\xf9\x62\x8d\xfd\x99\xc7\xf6\xd4\xc3\x4e\x58\x8f\x8a\x9e\xff\xfb\x5e\xf0\x42\xef\x38\xfd\x2a\xc7\xc6\x14\x69\x11\xda\x71\x30\x66\xf1\x5d\xaa\x49\xcf\x9c\xf0\x27\x95\x75\x4f\x55\xe5\xca\x26\xb2\xbc\xd2\x63\xbb\x50\xc2\xfa\xff\xc9\x63\x07\xb7\x3a\xd8\xcd\x68\x99\x9c\x9e\x77\xf6\x45\xb3\x49\x69\x5d\xa6\x78\x82\xa9\xba\x1a\x85\x68\xa7\xed\x25\x61\x3b\xaa\x83\x98\x8c\x31\x5e\x4d\xbe\x43\xe9\x2b\x35\xf6\x39\x8f\x8d\x75\x5a\x61\x2e\xfc\x5f\xf1\x82\x0f\x78\xf2\x93\xb3\xf2\xa7\xd2\x5c\x32\x51\x47\x5e\x73\xbd\x12\xe2\xa8\x29\xea\xbd\x7a\x2c\x38\xbc\xa7\x2a\x73\xd9\xb2\x00\x4b\x5b\x30\x50\x1f\x39\x4f\x04\x60\x16\xa4\x9d\x6e\x1c\x16\x0a\xc1\x2b\x41\xfe\xa8\x86\x9c\x16\x60\x3e\x72\x36\xc8\xfb\x3c\xf6\x08\x1a\xc5\x69\x10\x1e\xa2\xe1\x77\x82\x9a\x12\x28\x4a\x8a\xa0\xc5\x2d\x13\x24\x61\xdc\xce\xab\x6d\x5f\x08\xab\x6f\xa1\xf1\x80\xdd\x3f\xca\xc6\xb5\xe9\xd4\x7f\xfd\x68\xf0\x82\x11\x2d\xd2\xd4\x65\x6e\xd2\x0a\xec\x6f\xf3\x3b\xbb\x22\x8b\x94\xbd\xac\x1e\xa7\xdd\x86\xda\x14\xb3\xaa\xdc\x84\x35\x4b\xee\x65\xf5\xb6\xa9\xc6\xd9\xb4\x10\xc7\x4a\x38\x8b\x0d\x51\x8f\x81\xfc\x37\xcc\xd1\x5e\x2a\xbf\x57\xe5\x4b\xb4\xff\xc1\x25\x05\xdb\x02\x67\x9d\x6e\xb3\x19\xd5\x23\x9c\x29\xb8\x57\x28\x04\x82\x7a\x98\x70\x0c\xf2\x81\x7c\xe9\x7a\x9a\x65\x5d\x84\xc4\x00\x40\xc6\x08\x14\x1e\xb4\xc9\x4a\x4d\x29\x8e\xad\x40\x1a\xc5\x8f\x2a\xdf\x0e\x79\xb3\x1b\xc7\x93\xa4\x9e\x81\x2f\x0f\x64\x58\x8d\xcf\x0b\xa1\x9c\xb6\x1d\x85\xcf\x39\x75\xc3\x4d\x87\x6f\x3a\x88\xd6\x91\x44\x25\x03\x39\xe3\x7a\x80\xd5\x58\x75\x4b\x4b\x70\x1a\xbb\x6a\xeb\x32\x74\xeb\x72\x99\xfd\x9a\xc7\xf6\x12\x31\x9c\xec\x62\xff\x83\x5e\xb0\x3c\x6d\x7e\x97\x85\xdf\x00\xb1\x67\x4d\x65\x4d\x9f\x2c\x9b\x9d\xcb\xe9\xd8\x05\xe7\xa6\xe3\xbe\x53\x72\xb5\x76\x65\x65\xdb\x47\x46\x58\x60\xf5\x5f\xb6\x14\xd6\x61\x5d\x2c\x2f\x67\x62\x19\xf4\x27\x88\x75\x7d\xf5\x48\x70\x57\xe9\x5a\xbf\x0a\x4e\x47\x7e\xc2\xc5\x9c\x4b\x63\x42\xca\xa2\xf7\xe4\x94\xa7\x15\x63\x3d\xe2\xa8\x5e\xef\xa9\xb0\x07\x2a\xec\x5f\xd7\xcd\x6d\x95\x25\x98\xfb\xaf\xa8\x04\x1f\xf3\x8e\x0f\xb8\xa3\xcf\x95\xca\x26\x6e\x52\xcd\xdc\x73\x96\x4a\xed\x6a\xca\x73\xb5\x53\x4b\x29\x9f\x50\xc7\xd7\xf1\xab\x39\x18\x07\xe0\x2c\xdf\x74\x92\xfa\x72\x4c\x0d\x83\x33\x56\x52\x6e\xcd\xbe\x9c\x77\x44\x46\x47\x65\xcb\xde\xde\x68\xc8\xa3\xa2\x99\xc5\x27\xd8\x6d\xec\x09\x97\x82\x07\x1f\x2e\x89\x58\xb5\x9c\x7d\xb9\xe2\x0c\xde\x10\x5b\x94\xff\xe1\x4a\x10\x97\xae\xb9\xb6\x72\xbc\xc9\xf5\xdd\x1a\x9f\x29\x78\x2b\x1c\x66\xe2\xc9\x44\x91\x45\x62\x55\x9b\xb1\xe8\xe8\xaa\x0f\xcb\xce\x90\x7e\xcc\x63\x77\xd1\x51\xfd\x6c\x30\xad\xcc\x11\x04\x33\x44\x9c\x89\xa1\x75\xd0\x86\xf2\x55\x2d\x43\xf5\x09\x3d\x87\xed\x3d\x63\xc9\x3e\xc0\x9f\x0f\x6e\x37\x80\xb5\x0e\xc1\x21\x5c\xa1\x2f\xe1\x84\xb0\x4c\x70\x70\x36\x31\x80\xb3\xb2\x56\xce\x37\x7e\x8e\xb1\x99\x2d\x9b\x41\xce\x74\x0b\xb0\x62\x3e\x19\x0f\xd6\x0e\xac\x30\xd0\x66\x7c\x71\x3c\xb8\x63\xb3\x87\xdc\xc0\xde\x8d\x9e\x1e\x4c\xaa\xf1\xf5\x1d\x52\x8d\xcb\x0e\x9c\x7c\xad\xe6\x69\x7e\xa9\x67\x0e\x80\x1b\x8e\x85\xbd\xba\x9f\xcc\xce\xb3\xf9\xe1\x87\xfb\x4b\x9e\x43\x3b\x01\x9d\x97\x11\xd0\xf9\x79\x3b\x4d\xee\xd3\x97\x49\xc7\xf1\x7c\xef\x61\xe2\xe3\xb0\x1a\x77\xd1\x7b\xd1\x16\x90\xd1\x1b\xfe\xd2\x86\xfc\x40\x03\x27\x63\x29\x20\x72\x33\x91\xc5\xd8\x1f\x8e\xb0\xe3\xd4\x83\xb2\x3a\x93\x6a\xcf\x4f\x5d\x94\xcb\xd2\x8c\xaf\x4d\xcf\xce\x90\xfd\x97\x2c\x39\xaf\x18\x09\xa6\xcb\x17\x8d\xc7\xa1\x21\xb2\x68\x15\xfc\x53\x65\xeb\x0e\xc1\xa5\x63\x50\x82\x6b\x2a\xae\xb0\x8f\xba\x26\x84\xf7\x54\x82\x1f\x39\xae\x2c\x41\x64\x17\x35\x09\x60\x9d\x68\x5e\x9b\x5c\xcd\x8a\xfe\x31\x76\x17\x5b\x18\x38\x61\x2e\xad\xb9\x8e\x2d\xe0\x07\x9d\x31\x94\xf3\x69\xb2\x1d\x76\xa4\xc2\x99\xfb\xe3\xfe\xee\x49\x4e\xb6\x00\xce\xfe\x4d\xff\x93\x60\xc0\xdc\xe5\x8f\xb6\xc3\xce\x36\x14\xd8\x6d\x18\x16\xbe\xf1\x68\xc7\x54\x6b\xc5\x29\xcc\x8b\x7a\x37\x8b\x8a\xde\xf1\x34\x29\xc4\x85\xc2\xff\xe4\xa3\x83\xef\x78\xfd\xd7\x49\x3f\xeb\xa4\x8d\x49\xa0\x58\x91\x5b\x2f\xdc\x2f\xb3\x02\xcb\xc5\x91\x26\x96\x9d\x8d\xbc\xbb\x52\x38\xa5\x0a\xb4\x19\xb3\x3f\x20\x6a\x91\x64\x97\xd4\x3f\x4c\x78\x63\xee\x7e\xbc\xc6\x09\x84\x9d\x10\x0d\x6d\x3b\x5e\xf9\x59\x5e\x84\x2b\x42\x96\x5a\x17\x0d\x44\xa2\x93\xc7\xd8\x66\xe9\xf5\xfe\x06\xba\xe6\xc3\x8f\xfc\x1f\xec\x37\x46\xd8\xee\x66\x8e\xfe\xa9\x8f\x8d\x80\x8d\xfe\xe8\x91\xe0\xfe\x91\x69\x9d\x46\x91\x77\x3b\x0a\xe1\x23\x26\x6f\x95\x0a\x26\xa1\x84\x24\xc8\xc6\x30\xd8\x1c\x98\xba\x01\x10\xd1\xd0\x17\x2a\xec\x0b\x19\x2a\x21\xd1\x5e\x59\x55\x63\xc4\xa7\x27\x64\x0b\x40\xbf\xd1\x11\x95\x29\x21\x91\xa8\xd7\x21\xc8\x4d\xde\xd6\xfe\xd8\x4e\xda\x38\xc6\xd8\x41\x0c\x13\x4d\xd7\xc0\xe4\xf3\xc4\x99\x13\x5a\x95\x95\xcf\x9c\x9a\x47\x1f\xd6\x21\x42\xdf\x14\xc5\x72\xd4\xe0\x4b\x78\x26\xcc\x45\xc1\xf7\x27\x62\x0d\x5d\xbf\xe5\x98\x05\xfa\xb0\x2a\x4d\x7f\x9a\x8a\x9c\xe0\x87\xb1\x4c\xa3\x45\xcb\x72\x71\xd0\xcf\xcd\xed\xa3\x90\x86\x6c\x6d\x32\x5b\x9b\x9c\x9c\x9c\x64\x6c\xa6\x89\x00\xde\x55\xa7\xfd\x50\x3e\xa0\x5e\xa7\x0d\x65\xf5\x34\xbd\x00\x39\x72\x96\x9a\x4e\x28\x7a\x58\x37\xd7\x51\xf1\x5f\x47\xd8\xbf\xa2\xa1\x3c\x0e\x1d\x8a\x61\x30\xfe\xeb\x47\x82\x97\x8c\x0c\xb8\xa1\x95\x2b\x9b\x4d\x04\x86\x02\x6c\x67\x43\xaa\x50\x0a\x8c\xa4\x08\x5e\x8a\xd9\x27\x94\x22\xf2\x96\xce\xa6\x2e\xbb\x02\xc6\x25\x25\x71\x0f\xe6\x4e\x4f\x0e\xa9\x33\x37\x50\xe3\x55\xb1\xb5\x54\x63\x05\x02\xa8\xaa\xb3\xbf\xd4\x23\x13\x70\x02\x80\xa2\x81\x92\x3f\x49\xb9\x68\x36\xa5\xc6\x90\x26\x5c\x74\x5a\xa2\x2d\x32\xa9\xc5\xd9\x1f\xca\xbb\xf5\x16\x0f\xf3\x63\xa4\x59\x57\xc9\x64\x05\xc8\xa1\xb2\x78\x08\xe0\x6b\x44\x99\xa2\x01\xa5\x15\x25\x07\x36\x38\x97\xcc\xa5\x69\x71\x26\xca\xe1\x68\x85\x2c\x10\xc1\x34\xe4\x13\x05\x04\x2c\xe9\x38\x66\xd5\x3d\x38\x4a\xe4\x25\x53\xd2\x27\x2b\x6c\x3c\xeb\x26\xd3\xf9\xf9\x5c\x64\xfe\x2f\x56\xd4\xfa\x7b\x13\x04\x50\x9e\x9f\x39\x01\x67\x8c\x2e\xe1\x8d\x24\x45\xd6\x43\xbd\xc6\x58\xe7\x48\xfc\x74\xb2\xb4\x0e\xf9\xd3\xf6\x39\x1c\xfc\xf4\xc6\x29\x1c\x25\xe8\x0d\xe0\x06\x59\xae\x1c\x2b\x1a\xf6\x74\x90\x75\x8e\xa7\xa5\xb2\xfc\x80\x44\x37\xba\xb7\x94\x16\xad\xf2\x03\xd0\x1f\xfd\x72\x87\x82\x2b\x41\xe9\x73\x6a\x54\x7e\x5d\xca\xb5\xdc\x16\x6c\x4d\x05\x9a\x63\x64\xa1\x33\xeb\x5f\x38\xc2\xae\xc9\x05\x44\x5b\x2b\x66\x83\xbf\xa9\x6c\xc1\x9c\x46\x11\xda\xf4\x4e\xf0\x09\xe8\x71\x15\xb6\x5d\x57\xb5\x49\x29\x04\x2d\x8e\xf0\x3c\xee\x4a\x3a\x18\x6f\xab\x07\xab\xa5\x51\xc9\x10\xf7\x5e\xc1\x08\x93\xd1\x21\xe4\x59\x98\x34\xd2\x76\xdf\xd7\x00\x6c\x2c\xac\xb7\xec\x08\xf8\x7f\x2e\x63\xc2\x3e\x57\x61\xd7\xac\x45\x49\x23\x5d\xcb\xd5\x38\x7c\xa4\xc2\x6e\xd9\x74\x1c\x9e\x8c\xef\x94\xbe\xa9\x86\xe5\xef\x3c\x39\x2c\xf4\x8c\x06\x07\xd4\xbb\xed\x76\x87\x26\xd5\x11\x92\x74\x98\xd7\x2f\xec\xcb\xfb\x9a\x6d\xdb\x62\x6a\x0f\x71\x17\xd7\xd8\xcf\x56\x18\x03\xd1\x80\x7b\xf3\x6b\xb4\x6c\xf8\x27\xe8\x92\x27\x5e\x82\x6c\x38\x0f\x26\x61\x9a\x93\x3a\xba\x9a\x36\xa5\x7f\x9e\xab\xff\x23\x23\xec\x2a\xe8\xa5\xb3\x29\xc8\x65\xff\x81\x91\x60\x7d\x64\xc6\x02\x9b\xa7\x98\x7c\xd3\x1d\x60\x41\x91\xfd\x16\xe6\x60\xdf\x4c\x26\xb3\x34\xc5\xc4\x54\x0c\x5a\xca\x14\x4c\xb4\xb3\x43\x43\xe8\x80\xb2\xba\xa1\x1c\x0d\x0b\xdd\x9b\x10\xa1\x67\xb2\x00\xa2\xc2\x90\x59\xd0\xa7\xa4\x30\x3f\xc0\xf7\xcb\x6f\x21\x96\x61\x33\x8c\x00\x15\x2b\x2f\xc2\xac\x5c\xc7\xa8\xa9\x8a\x50\xf3\x58\x14\x3c\xcd\x30\x9c\xaf\x2a\xf7\x38\xd8\xc2\xa8\x4e\x3a\x88\x6a\x49\xa8\x84\xd5\xef\x53\x69\xee\x06\x3b\xfe\xb8\x94\xdc\xf5\x7a\xda\xee\xcc\x66\xa9\x54\xc1\xfc\x78\x2b\x82\xdb\x79\x25\xb8\x09\xd5\x3a\xb8\xa6\xd7\x37\x6e\x7e\x4a\x4f\x74\x55\x53\x30\x15\x48\xed\x94\x7d\xdd\x63\xbe\xad\xdd\x52\x4a\xf8\x17\xbc\xe0\xdd\x56\xd8\xb2\x4a\xe4\x36\x92\xa6\xd0\xc0\x59\xb4\xb4\x60\x8c\xa3\xa4\x24\xbc\xab\xfd\xa1\xf4\xc2\x11\x38\x9d\x2c\x6a\x87\x59\x4f\xae\x65\x1c\x09\x47\x5e\x25\xa9\xfa\xb4\x63\x9a\x45\xa8\x8c\x9e\xb3\x20\xcc\xe1\xef\x07\xd8\xbf\x22\x39\xe1\x2c\x93\xff\xe6\xb1\xdd\x79\x2f\xaf\x17\x71\xee\xff\xaa\x17\xbc\xc4\x9b\xc7\x1f\x70\xde\xb1\x4c\x78\xda\x46\xd9\xe0\xf4\x38\x5a\xa2\x55\x78\x1a\x28\xf5\xb3\x3a\x5a\xa5\x9b\x98\x18\x49\xf5\xfc\xfe\x72\xa7\xab\x35\x32\xc1\xdb\xd1\x72\xab\xd0\xf3\x3e\x0e\xbb\x49\xbd\xe5\xd4\xfe\xb1\x6c\x82\xed\xdb\x7c\x02\xc0\x97\xd8\x9b\x46\xd8\x8f\x0c\xb5\x28\xdf\x21\x34\x68\x9f\xff\xed\x4a\x50\xed\xbb\x4a\x36\xf2\x9c\x40\xe3\xc1\xd7\x81\x0f\x11\xa4\x9e\x73\x50\xfa\xaf\x15\xf6\x02\x8f\x4c\xc3\xff\x31\x48\x07\x52\xbc\x6f\xd7\x55\x26\x4f\x6c\xab\x91\x58\x9b\x22\x40\x99\x49\xd9\xa5\x93\xf8\xc5\x7c\x0a\x46\x62\xaa\x3f\xf1\xef\x1c\xdb\xa3\x62\xb4\xfc\xe3\xc1\xf5\xf3\x94\xdb\x62\xc7\xed\x92\x89\x1c\x58\x07\x10\x39\x5f\x19\x8d\x09\xb4\xcc\x59\x84\x77\x21\x42\xe0\xb9\xe0\x36\xb9\x90\xa8\x2f\x2c\xab\xb3\x06\x0d\x05\xf3\x9a\x54\x48\x74\xc0\xec\xff\xcf\xde\x9f\x80\xd9\x71\x95\x77\xc2\xf8\x53\xb7\xb5\x1e\xd9\x2c\x35\x84\xc9\x3f\xf9\xcf\xcc\x49\x79\x88\x24\x4f\x77\xb5\x24\xef\xb2\xb1\xd3\xea\x6e\xd9\x8d\xa5\x56\xd3\xdd\xb2\x43\x1c\x06\x55\xdf\x7b\xba\xbb\xac\xba\x55\xd7\xb5\x74\xeb\x9a\x90\x00\x36\x4b\xc2\x4e\x58\x95\x10\x08\x81\x4c\x86\x21\x90\x61\x86\x84\x75\x60\x42\x18\x08\x84\x30\x84\x6f\x12\xf8\x12\xb2\xf3\x65\x27\x1b\x49\xc0\xf9\x92\xef\x7b\xce\xfb\xbe\x67\xab\x5b\xb7\x17\xb5\x6c\xf3\xcd\x23\x9e\x07\xab\x6f\x2d\xe7\x9c\x3a\xeb\xbb\xfc\xde\xdf\x8b\x68\x2a\x7a\xee\xbc\x70\x81\xa9\xaf\x69\x35\x52\xc4\x2e\x08\x10\xdb\x27\x96\x61\x88\xfb\x14\xa8\xf2\x87\x5e\x70\x57\xe3\x9d\x0d\x93\xa2\x16\xe8\x41\x41\xb5\x24\xa2\xf7\x5c\x0d\xf7\x65\x1e\x7b\xa9\xc7\xf6\xa1\x0d\x70\x66\xce\xff\x81\xad\xa0\x5d\xe8\x61\x6c\x41\x30\xa3\x5e\x76\xb9\x1f\x06\x5b\x82\xef\xf1\x99\x39\x52\x59\x06\x5a\xc6\xde\xb6\x8b\x1d\xb6\x2a\x54\xd0\xf3\xb5\xa3\x21\x3a\x75\x67\xb3\x8e\xd0\x94\x20\xfe\xdf\x8c\x04\xcf\x68\xb8\xae\x08\x25\x1d\xa6\x10\x8e\x0c\xaa\x35\xb7\x9c\xe5\x8e\x76\xbb\xe5\x8d\x23\xec\x75\x23\x6c\x37\x10\xb3\xfb\x3f\x32\xa2\xa0\x79\x5f\x6f\x9d\x26\x9e\x55\x42\xc7\x65\xcb\x3a\xcb\x02\x79\xb5\x31\xce\x51\xab\xe0\x93\x0b\x33\xbc\x93\xc7\x6b\x42\x1d\xd3\x56\xde\x3f\xc8\xa8\x85\x0e\xe7\x09\x27\xf6\x2b\x2e\xf0\xb0\xd1\x8e\x71\xb0\xad\x53\x38\xa6\x7e\x4b\x3e\xd6\xce\x40\x93\x34\x41\x6e\x54\x70\x1b\x0e\xc1\x92\x97\xeb\x31\xa6\xbc\x23\x58\xae\xc3\x94\x82\xb8\x75\xa7\xfd\xba\xfe\x62\x15\x7d\xcf\xdd\x2c\x5d\x31\xbc\x1d\x80\xc3\xcb\xac\xe8\x52\x6c\xbd\x42\x32\x1b\xd0\xc0\x00\xf6\x96\xde\xd1\xbb\xa1\xe9\x3f\xd5\x71\x36\x02\x0b\xdd\x4a\xc0\x35\x08\x0a\xa1\xb5\x53\xff\xd1\x6e\x87\x89\xb4\x29\x48\x5b\xcd\x84\xd3\x40\x88\x4f\x21\x27\xef\xdd\x1d\x7c\x66\xa4\xe9\x8e\x15\x9f\x4e\xbe\x4f\xe4\xd9\x87\x7e\xd6\xd3\x07\xc9\xf5\x39\x70\x13\xc9\x67\x0c\xe4\x6d\x54\x0a\x2f\xce\x21\xaf\x2d\xe8\x72\xd8\x70\xde\x8d\x2a\x0f\x2b\x58\x01\xe4\x29\x48\x91\x64\x0e\x94\x0d\xea\x2d\xa3\x7c\x45\x94\xfc\x90\x08\x57\x42\x3e\x39\x77\x56\xee\x53\x44\xf1\x1c\x72\x18\x49\xd2\xb6\xf5\xa9\xb7\x26\x72\x98\x72\x65\xb6\x82\x9b\x9c\x63\x73\x00\xd0\x67\x6e\x0e\x66\x2c\x3f\xe4\x7c\x41\x4a\x48\x2a\x69\x80\x54\xdd\x97\xaa\x38\x01\x49\xa7\xfe\x7d\x69\x07\x4d\x07\xda\xe2\x85\x1d\xae\xa5\x09\x38\xbd\xc9\x20\x95\x15\xb6\x17\xbc\xcc\x78\x9a\xe5\xdd\x28\x91\x72\xd7\x98\xfc\x66\x55\x61\x55\x28\x97\x46\x20\x67\x55\xa0\xc2\x59\x38\x87\x60\x90\x2c\x15\x3c\xc0\xa6\x06\x14\x6d\xa0\x61\xaa\x05\x9c\x41\x70\xd8\x5c\xf4\xf6\xe0\x43\xce\xea\xfd\x84\x67\xc3\xa6\xd3\x06\xd8\xb4\x03\x25\x8f\x53\x0e\x03\x56\x67\x90\x7a\x1e\xa3\xc2\xfd\x82\xdd\xb2\x2d\x16\x73\x9c\x5f\x8b\xd8\xfc\x1b\x69\x44\x0b\x87\xc5\x9a\x2e\xa2\x8c\xa8\xc4\x07\x8c\x54\xc3\x2e\x62\x9f\x76\x99\xd1\x96\x00\x69\xa1\x5c\x4b\x93\x79\x96\x3e\x23\x5b\x22\x53\xfb\x5b\x76\x05\xb7\x38\x57\x06\x8e\x85\x3a\xa7\x5c\xc4\xdb\x79\x96\xf2\xfb\xb3\x25\x77\xe3\xfb\xe2\x08\xfb\x51\xa2\x3d\x5b\xa8\x80\x30\x61\xb9\x4a\x80\xf6\xec\x79\x97\x4e\x7b\x76\x62\xc6\x32\xf2\x03\xe4\x64\x9d\x22\xd0\x5d\x2e\xb4\xfb\xb3\x25\x29\xb7\x53\xad\x49\x9f\x2b\xba\xab\x4e\xc8\x7e\xd2\x63\x7b\xa2\x76\x19\xaf\x09\xff\x0d\x5e\x30\x66\xc4\x4f\x50\xea\x28\x05\x28\x7d\x66\xd2\xd7\x08\xb7\xfb\xb3\x25\x97\x8c\xe9\x7a\x76\x6c\x0b\x21\x20\xb5\x40\x89\x47\xbc\x6b\x86\xda\xeb\xf7\xfb\x7b\xa3\x32\xeb\xc6\x6d\xc6\xde\xe0\xb1\x27\x41\xcf\xe1\x01\x23\xa0\xdf\x5e\xe0\x5d\x7a\xc7\x9d\xdc\x46\xc7\xc9\x3b\x4e\xe7\xd1\x31\x27\x3b\xef\x55\xfb\xec\x5c\x53\xfa\x2b\x4f\x26\xe2\xc2\x90\x08\xbd\xaf\xec\x0d\x1e\xf2\x86\xdf\x77\x31\x07\x10\x60\x18\xb7\xed\x38\x3d\x3a\x4e\xdc\x64\x80\x0a\x5b\x8c\x5e\xea\x71\x7d\xbc\xe1\x5e\x00\x20\x21\xd1\x26\xe1\xa0\x97\x54\x2b\x71\x1a\x5e\xf4\xf6\xe0\xf1\xe9\xcc\xd2\x8f\xed\x61\x67\x18\xdd\xf0\xa7\x83\x9b\xa7\xf0\x84\x6d\x58\xe4\xea\xec\x45\x7d\x07\xd7\x99\x0e\xa1\x73\x56\xfb\x2f\x99\x88\xa8\x0f\x4a\x05\xe7\x71\x8a\x88\xb2\x93\x46\x5a\xc5\x77\x44\x4f\xa4\x78\xf8\xca\x51\xb9\x87\x82\xcd\x20\xb7\x51\x2d\x52\x4c\xc7\xe5\x4e\x05\x07\xcf\x90\x28\x7c\x9c\x4f\x5f\x28\xf3\x08\xdc\x32\x10\x98\x44\x3b\x77\x0c\xd6\xf2\xf0\x5d\x35\xa4\xae\x8d\x2a\x7a\xa1\x4d\x64\xb0\x16\xac\x9a\x22\x1f\xc3\xb0\xbf\x5f\x6d\xd9\x51\x5c\x1f\x6f\x5d\x42\x14\xd7\xcb\x5a\xa6\xe5\x26\x9e\x4b\x65\x10\x56\x21\x2c\x96\x60\x4f\x7e\x75\x12\x6a\x61\xf8\x9a\x02\xb9\x80\xfb\x2f\x2a\x34\x3c\x02\x27\x2e\x0d\x4d\xe1\xa6\x1b\x46\xde\xbc\x18\x92\x2b\xb9\xb5\xc4\x76\xde\x1e\x14\xa8\x86\x34\xa4\xe0\x5d\x24\xa7\x06\xaa\x0e\xa1\x4d\xf4\x51\x92\xd0\xdf\x94\xae\x29\x2a\x0a\x73\xea\xd7\x5a\xc5\x1e\xde\xc7\xbe\xb3\x01\x2b\x36\x9f\x25\x02\xd0\x2d\x7f\xb8\x37\xf8\x2e\xf5\xa3\x89\x1a\x1a\xb0\x56\x8d\x98\x95\x8f\xef\x61\xcb\x96\x77\xfe\xfb\x76\xe6\x9c\xff\xce\x0d\x08\x6c\xaf\x60\x63\x76\x8a\x8d\x79\x96\x82\xc6\xcc\x05\xdf\x3e\x23\xff\x70\x01\x4b\x30\xc8\xf6\xe1\x79\x98\x1d\x64\x4f\x1b\xba\xf2\xec\x49\x74\x05\xde\x72\xe9\xf0\x96\x47\xbc\x95\xcd\xb1\x20\x53\xfe\x09\xcd\x80\x05\x1d\xbf\x21\x0d\x96\x5a\xca\x75\xf6\xdd\x4d\x29\xaf\x8e\x7e\xcb\x53\x5e\xfd\x7f\x83\x57\xea\x5b\x98\x98\xeb\xa1\xbd\x8d\x44\x29\x2a\x70\x64\x2e\xcb\x4b\xff\x77\xf6\x04\x37\xd8\x17\x70\x2d\x97\x55\x2f\x21\xd1\xce\x00\x88\x23\x2e\xa5\xb9\x04\x63\x16\xe5\xd8\xc9\x7f\x9d\x41\x7b\xed\x1e\xb6\xc4\xf6\xf5\xf2\xac\xcc\xda\x59\xe2\xdf\x13\xcc\x48\xa1\x67\x66\x8e\xab\x4b\x46\x4e\x83\x32\xb4\xc0\x75\x76\x6a\x6e\x94\x2f\x4e\xce\x41\xe6\xce\x85\xc9\xc5\x39\x37\x7e\x7e\x72\xce\x91\x84\x3e\x3a\xc2\x0e\x44\xbd\xde\x9c\xaa\xe7\x67\x47\x82\xb7\x8e\xc8\x9a\xc0\xfe\x41\xac\x00\xc3\xaa\xb4\xbc\xf2\x98\x84\xb4\x30\xf9\xc5\xac\x70\x37\x4c\xdd\x51\xf4\xd3\x32\xba\x10\xf2\xb3\xe9\x58\x2f\x17\xcb\xf1\x05\xc5\xab\x02\x07\x71\x2e\x28\x6a\x43\x56\x31\x33\x31\x3b\x61\x4a\x52\x90\x25\x7c\xf8\x50\x04\x88\x63\x3e\x7f\x72\x72\xec\xc6\xeb\xae\xbb\x01\x15\x6f\x9c\xb2\xeb\xeb\xeb\x61\x1c\xa5\x51\x98\xe5\x2b\xe3\x18\x6d\x02\xd9\x82\xc6\xa9\x08\xd0\x72\x8b\xc3\x21\x9f\xcd\xd2\x31\x5d\xbe\xfa\x3a\x7d\x82\x49\x21\xb8\xd6\x44\xf2\xf5\xf3\x6e\x1f\x2c\x05\x69\x3f\x6c\x67\xdd\xf1\x6e\x7f\xac\x0d\x89\x6c\xc7\x54\x19\x56\x02\x16\x2e\x77\x06\x3b\x49\x68\x5c\xf0\x95\x2a\xca\x3b\x46\xf0\x25\x6c\xd4\x84\xe9\x7f\x9d\xae\x05\xe0\xe3\x80\x22\x40\x16\x07\xf9\x0a\x49\xbc\xce\xf8\xbd\x5b\x19\x94\x7f\xca\x0b\x5e\xef\xb9\xa4\x07\x7a\x9c\x48\xbc\x72\x13\xaa\x1c\x94\x0f\x1e\x34\x19\x5f\x29\xba\x9b\x32\x87\xc8\xb3\x86\x9a\x37\xe7\x4c\xaf\x88\x4f\xcd\x2e\x3c\xe7\xd4\xc4\x89\xe9\x53\x21\x57\xc2\xa2\x0e\xbc\x94\xb2\x56\x8f\xa6\x3e\xd9\x89\x9d\xe6\x3e\x9d\x02\x79\x6f\x50\xc6\x42\xc4\xbe\x58\xa1\xb4\x9a\xba\x16\xd7\x51\xcd\x51\xc7\xd8\x6d\x9b\xec\xc4\x1b\xe6\x46\xf3\xbf\xb9\x3f\xf8\xbe\x0d\x9f\xa8\x27\xa1\x6a\x08\xa0\x1c\x9a\xcb\x32\xbc\xe8\x3d\x91\x5e\x20\x06\xf6\xe2\xa2\xf7\x44\xa2\xe2\x37\x57\x2c\x68\x9e\xb3\xe2\xbf\xb2\x8f\xfd\xdf\x9e\x03\xdc\xfb\x0b\x2f\x78\xb9\xd7\x76\x62\xff\x50\xe2\x55\xe1\x99\xea\x86\x93\x7f\x0c\x06\xde\xb4\xca\x18\xeb\xe4\xc9\x8e\x16\x95\xd1\x21\x9c\x93\x48\x2e\x49\x06\x2a\xab\x7c\xb9\x42\xbb\xa2\x74\x6c\x04\xcf\x64\x67\xd8\xe9\x6d\x18\x7c\x86\x0e\x8d\x86\x06\xca\xc9\xfc\x04\xea\x40\x34\x0e\x15\xfe\x9b\xbd\xe0\xb4\x7b\x49\x93\x8e\x4b\xe5\x5e\xaa\x52\x6e\x0e\x00\x63\x3a\x53\xeb\xcc\xe9\x0d\xe7\x13\x9e\xce\x6e\xdd\x96\xcd\xea\x28\xd9\xac\x70\xaa\xb0\x8b\x1e\xab\x8f\xb7\xff\x62\x1d\xa1\xfe\x40\xed\x16\x58\xa2\x69\x3a\x99\xb9\x9e\xab\xbb\x60\xa4\xe9\xd4\x4c\xe3\x4e\xd3\xc1\x86\x0a\x5f\x5d\x08\xa1\x39\x44\x9d\x4f\xb3\x96\xca\x3b\x3c\x56\x9f\x7a\xfe\xab\x75\xe3\x9e\x5b\xbb\x55\xcf\x1b\xb1\xc3\x06\xb6\xa3\xa4\x8d\xa1\x70\x9b\x35\xf3\x6b\x1e\xbb\x1a\xad\x41\x11\x99\x82\x7e\x6b\x07\xa6\xa0\xb7\x79\x4e\x59\xce\x54\xd1\x76\xa0\x61\xe9\x6b\xe1\x9f\x0e\x1a\x47\xf4\xe7\xcb\x4f\x1e\xb5\x26\x93\xa8\xad\x2c\x10\x33\xb2\x04\xac\xe2\xd9\x72\x49\x26\x7c\xf7\x7d\x18\x79\x80\xcc\x75\x42\x76\x81\xf9\x2a\x42\xf1\x4e\xa4\x9c\x92\x32\xd2\x92\xc2\x65\x9c\x1e\xbc\xa9\xbe\xa2\x9b\xc1\x84\x6f\xcb\x09\xb4\x62\xee\xea\x78\xc7\xc6\xc9\x6e\x75\xf5\x4f\xec\x62\xdf\xb5\x51\x58\xb6\x9c\xd5\xc2\xff\xc6\x48\xf0\x4e\xcf\xbd\xa6\xe3\x8d\x88\x66\xdf\x42\x0f\x5b\x18\x23\x6d\x91\xce\x96\x61\xa7\xe9\x0a\xd9\x07\x5a\xab\x77\x15\xf7\xd4\xb0\x94\x77\x1d\xb5\xde\x25\xed\x93\x4f\xc5\x05\x77\x9b\x73\x6f\x14\x4b\x55\x28\xac\xcb\xb8\xcb\x6c\x2f\x19\x34\xfd\xfb\xd8\x8d\x5b\x0f\x47\x87\x42\xe7\xf1\xcd\xe0\xbb\xa6\x9c\x2c\x10\x91\xb6\x91\xea\x2f\x65\x19\x63\x3a\x85\x52\xc7\x8f\x36\xd8\x41\x9a\xab\x5a\xd4\x2f\x07\xff\xb6\x5e\x9b\x29\xd8\xaa\x70\x99\xed\x5d\xc7\x6f\xbe\x84\x0f\xa3\xde\x1a\xfc\x30\x2a\xd2\xaa\xe7\x8f\x0f\x34\x46\x57\x39\xe5\x55\x85\xff\xdf\x0f\x04\xcf\xa8\x5d\xb3\x11\xeb\x58\xcb\x72\x8d\xb1\xbd\xb0\x02\x82\x63\x2b\x51\xa7\xf1\x51\xec\x06\xca\xaf\x8b\xde\x55\xb9\x00\x30\xcb\x64\x56\xa5\xe5\x45\x6f\x37\xa0\x64\x2e\x7a\x7b\xe1\xdf\x99\x29\x97\xf7\x94\xb1\x05\x76\x40\x17\x36\x33\xe5\x4f\x05\x37\x4d\x5a\xe0\x88\x99\x29\x9d\xe9\x0e\x33\x61\x1e\xec\x64\xed\xf3\x22\x3f\x3e\x3e\x7e\x9b\x7e\xed\x39\x71\xe7\xf6\x83\x8e\x98\xf2\x20\xc3\x6a\xfd\x07\x82\xce\xa2\x46\xea\xd4\xd0\x35\x3a\x42\xfc\x52\x12\x14\xaa\x0c\x84\xc8\xac\x60\xd7\xfd\xb1\x16\x73\xba\xc0\x7f\x8f\x66\xc4\x7c\x13\xc0\x0b\x2d\x41\x29\xee\xea\x64\x99\xaa\x59\xab\x51\xc1\x97\xe4\xf9\x40\x65\xc8\x25\x65\x2c\xfe\x4e\x2e\x6c\x53\x50\x47\x1e\xa3\x16\xc0\x05\x59\x53\x10\x08\x5b\xf2\xbe\x28\x55\x91\xc4\x1f\x38\x9b\x95\x9a\xa9\x14\xc5\x5d\x6b\xc7\x07\x0b\x43\xad\xc4\x90\x9f\xa8\x2c\xb9\x42\xd5\x03\x79\x0d\x28\x51\x48\x99\xf1\x95\x28\x5f\x92\x1d\x6d\xac\x68\x24\x4f\xa3\x21\x04\x8c\xa3\x2b\x42\x1e\x2f\xbd\x9e\xe8\xf0\xa8\xe4\x37\xc8\x5d\xef\xce\x49\x77\xa3\xbb\x85\xa9\xc9\xe2\x87\xc1\x77\xcd\xe0\x9f\x03\x88\xb6\x83\x05\x0e\xab\x33\xf0\x7d\xb6\x1f\x4e\x10\xd8\x0a\xb7\x82\x23\x72\x17\x5b\x70\xcb\xd4\x40\x12\x19\xbb\x42\x3c\x88\x68\x8d\xc7\x08\xfd\xa7\xac\x2c\x2c\x27\x41\xfe\xfe\xe0\xd9\x46\x5c\xaf\x0b\xdc\xd3\x0e\x36\x48\x63\xe4\xf1\x61\x18\x30\xed\xab\x46\x6a\xd3\x41\xe3\x8d\xfd\xb9\xf7\x30\x5c\x75\xfe\xe9\xe0\x0e\x93\x3f\xd6\x86\x81\xb8\x13\x8b\xcc\xa5\x68\x22\x8a\x3a\x71\x2a\x0a\xf0\x56\x2c\xd5\x30\x59\x3f\xd7\x62\x7b\x69\xf6\xf9\xef\x68\x05\xaf\x6f\x6d\xb3\x70\x78\xb7\xea\x51\xd1\x7c\x46\x0e\x40\x94\x80\x25\x30\x2a\x14\x7e\x6d\x49\xb4\x33\x98\xff\x79\x25\x28\x49\x21\xbd\x37\x27\x5f\xab\x79\xfe\x8d\xd7\x07\xe8\x2f\x85\x6d\x91\x5f\x57\xae\x77\x77\x75\x9b\x05\x94\x01\x98\x8e\x98\xa0\x79\x92\x15\xa2\xa0\x33\xb0\x14\xdd\x5e\x96\x47\x79\x9c\xf4\x43\x3e\x53\xa8\x9c\x10\xd0\x26\x28\x36\xcd\x06\x5a\x65\x14\x23\xab\xcb\x12\xb6\x1b\x4a\xf4\xdb\xdb\x9f\x75\x47\x36\x9e\x75\x6a\x0f\xb6\x26\xdb\x7f\xdc\xed\xb8\x4d\x55\xb9\xa7\xb2\xa8\x73\x02\xf3\x05\xe6\x2a\xff\xe1\x3f\xef\x0a\x5e\xed\x35\xdc\x18\xc8\x05\x63\xa9\x48\x49\x16\x75\xc6\x28\xf1\xa0\x9c\xa5\xf8\x02\x28\x74\xc7\x55\x22\x42\xb0\xff\x02\x27\xa7\x3a\x2b\x74\x6c\x92\xe5\xc4\x46\x6e\xdf\x28\x75\x0b\x71\xcf\xfe\xdf\x1a\x61\xcf\x65\xfb\x56\xb3\xa2\x84\x05\x94\x05\x4b\x77\xd1\xdf\x2a\x3c\x43\xd6\xb0\x41\x9b\x2c\x9a\x85\xa9\xd9\x05\xda\x24\x0f\x95\xfd\x5e\xdc\x8e\x92\xa4\xcf\x27\xee\x5d\x70\x5f\x2f\x0e\xdb\xab\xe8\xb9\xac\x15\xf7\xfc\x2a\x58\x9d\x99\xdb\x7e\x85\x1a\xe8\x63\xd5\x77\xe7\xe4\xb4\x9c\x72\x67\x7a\x22\x5d\x28\xa3\xf6\xf9\x8d\x2a\xff\x1d\x8f\xed\x96\xfa\x73\xe1\xff\x2f\x2f\x78\x40\xea\xea\x03\x69\x80\xda\x59\xde\x21\x94\x13\x76\x30\x3c\x0f\x50\xc1\x42\xce\x6e\xc8\x49\x84\x4a\xb8\x4a\x48\x19\xa7\x4d\x23\x82\x1b\x4c\x6a\x12\xae\xc6\xa5\xad\x4e\x8d\xb3\x31\xf6\xef\xb6\xc0\xf7\x9a\x97\x0b\x94\x37\x6d\x4b\x0e\xe3\x17\xee\xb2\x49\x9a\x4c\x39\xca\x06\xba\xa0\x91\x4a\x52\xb2\xf2\xbf\x38\x12\xbc\xc7\xd3\xe9\x97\x7a\xda\x52\x6a\x01\x9a\xe4\x0e\xac\xd3\xe7\x46\x49\x42\xe6\x73\xc2\x23\xc6\x44\x8e\xcd\xd7\x05\x40\x0d\x8f\xf0\x43\x71\x28\x42\x1e\x97\x07\x11\xeb\x3b\x96\xf5\x0e\x87\x7c\x82\xa7\x55\x92\x6c\xa1\x82\x34\xd3\xe5\x53\x41\x05\x22\x6a\x75\x59\x17\xbd\x3d\x58\xd7\x45\x8f\xf5\xb4\xa7\xcd\x99\xe3\xff\xe4\xb1\x17\x7a\xcc\xba\xeb\x97\x5b\x24\x66\x51\x58\x45\xd9\x39\xc1\x1d\x13\x08\x1d\x32\x99\x84\x45\xde\x1d\x6d\x24\x72\x75\x6d\x41\xd8\xbe\x90\xad\x31\x6a\xaa\x9f\x28\xa9\xe4\xde\x7b\xb1\x9f\xea\x85\xc0\xf7\x2b\x9f\x85\x5b\x5a\x5a\x6b\xd7\xa8\x9a\x70\x39\x84\x70\x1d\x1d\x3b\x7a\xe4\x88\x7b\xa6\xff\xd8\x2e\x16\x36\x82\xde\x50\x2f\x6f\x42\xbe\xfd\xf1\xa3\x87\x7c\x7b\xc5\x08\xfb\x11\x8d\x7c\x7b\xbe\x46\xbe\xfd\xe9\x15\xe4\xdb\xd6\x90\x6f\x71\x72\x79\xf1\x6e\xaf\xbf\xde\xcd\x43\xb5\x9d\x80\x73\xff\x4b\xd7\x05\xff\xbe\x76\xcd\xb6\xd4\xa7\x26\x64\x58\x11\x08\x22\xb7\x9b\x43\x73\x82\x78\x01\xa1\x80\x9c\xb1\x1d\xd9\x68\x74\x9c\xab\xd0\xcf\x86\x98\x50\x17\x52\x74\x8c\xfd\xdc\x2e\xf6\x2f\x75\x55\x98\x81\x85\x5c\x28\x85\xff\xba\x5d\xc1\x3f\x8c\x4c\x34\xdf\x54\xa4\x8b\x39\x0e\xb4\x86\xfc\xe8\x8d\xe9\x5c\xed\xc5\x73\xca\x17\x83\x07\xb7\xfa\x66\x71\xa1\x27\x37\xa9\xd0\x0a\x2c\x46\x91\x5b\x6e\xf6\x0a\x1b\x02\x80\x75\xe5\xca\xa1\x45\x0b\x35\x62\xd8\x5d\x5c\xaa\xe1\x2c\xea\x7a\xbe\xa9\xd4\xc1\x01\xc2\xf0\x42\x09\x0e\x2e\xc4\xb4\x61\x74\x20\x40\x01\xb0\xdf\xda\xd2\xa9\xdc\xd0\x33\xcb\x16\x09\x76\x47\x0f\x95\x83\xb0\xb5\xe0\x65\x2a\x9f\x8e\x6e\x95\x1c\x41\x1d\x6e\x01\x34\x8e\x1d\x81\x51\x92\xea\x09\x8d\x6b\x2c\x31\xa1\x1b\xb9\x58\x47\xa5\xf2\x93\x68\xef\xb6\xaa\xd8\x34\x15\xb3\x65\xdb\x8a\x0e\x28\xa4\x51\x9c\x54\xb9\x5c\x34\x44\x33\x6e\x38\x29\xcf\xdd\x77\x90\x26\xeb\xc1\x67\x9f\xdb\x88\x2b\xee\x27\x3c\xe6\x4c\x29\xff\x15\x1b\xa6\x5b\xda\x70\x59\xa8\x58\x77\xab\xb8\xe0\x0e\xfb\x97\x86\x0a\x10\x02\xd4\x30\x47\x0b\x73\x6a\x20\xbf\xa6\x22\x0b\x65\x7f\xa4\xdc\x13\xbf\xed\x05\xff\xd3\xab\x73\x32\x0f\x2c\xac\x90\x83\x77\xd2\x08\x80\x08\xd2\x7a\xa0\x8a\x12\xb2\x0e\x89\x70\x25\x1c\x45\xc5\x8d\x3a\xce\x51\xb4\x47\x29\x27\x7a\x60\x3d\x11\x34\x41\x9e\xa8\x42\x34\x84\x3b\x45\x34\x3d\x9d\xe5\x2b\x51\xaa\xbc\xc6\xfa\xeb\x1c\x55\xea\x2b\xfb\xd9\x93\x75\xe0\x83\x8e\x1a\xf8\xd4\xfe\x9d\xb3\xde\x04\x2f\xdc\x3f\x5b\x2f\x98\x77\x44\x3b\xee\xd8\xea\x94\x89\xe2\x52\x13\x50\x9e\x04\x0a\xa5\x61\x14\x7f\x5b\xff\x32\x24\x34\x3a\x42\x8a\x1e\x57\xb2\x8b\xcd\x03\xa4\x11\x37\x0a\x8d\x53\x16\x3a\x5b\x9e\x2e\x09\xed\x77\xfa\xe8\x8f\x0b\x13\x4b\xc4\x33\x8d\x19\xd1\xe8\x14\x70\x0d\x16\x03\x25\x17\x2a\x8f\x2b\x27\x66\x24\x5e\xb4\xb3\x9e\xe5\xee\x1e\x95\x3b\x0d\xb2\xae\x15\xe7\xe3\x5e\x61\x7f\x78\xc8\xd8\xc9\x2c\x57\x5c\x5a\xa3\x43\xbb\xa6\x6f\xc4\x3e\xb0\x4b\x98\xde\x20\x70\x76\x5d\xa0\x09\xf2\x2a\x85\x80\xfe\x40\xce\x8b\xe0\x08\xd2\xa3\x1e\x0d\x6e\xe5\x98\x88\x24\x06\x70\x51\xe9\x74\x1a\xe8\xab\xe8\x1b\x3d\xce\x83\x81\x09\x12\x1c\xe7\xcf\x65\x9c\x07\xd0\x61\xd3\x17\xa4\x42\x05\x7b\x4d\x70\x9c\xdf\xc7\x38\xe7\x70\x57\xfe\x2f\x38\x2f\xfa\xc1\x71\xab\x09\xa3\xea\x06\x9e\x3a\x50\x54\x30\x9b\x95\x33\xa9\xb9\x85\xa8\x19\x5d\x16\x5c\x3b\xa2\x6f\x73\xd9\x76\xfa\xfb\xd9\xf0\xef\xf3\x98\xfc\xeb\x79\x10\x63\xae\x28\xcd\xec\x14\x2b\xe0\xe5\xdb\x7e\x5f\x36\x49\x97\x81\x48\xd7\xe2\x3c\x03\xff\x2c\x76\x67\x2f\xcf\x3a\xd8\xa3\x45\x19\xad\xc4\xe9\x4a\x70\xeb\x63\xd7\xad\x76\x6b\x1a\x7b\x76\xb3\x6e\x85\xd6\x5b\x3d\xab\xbe\xa1\xb9\x7f\x15\x13\xdc\xce\xa2\x7b\x70\xf1\x8c\xc3\xe2\x05\xb8\x1b\x4d\x79\xd0\xf5\xc8\xe9\xae\x38\xbc\x42\xc6\xac\x03\x06\x3c\xac\xa0\x1f\x39\x3b\x8d\xa2\xc2\x53\xab\xdf\x24\xab\x0d\xd9\x9f\xec\x66\x4f\xc0\x8a\xf5\xe6\xf6\xeb\xbb\x2f\xc3\xe6\xf6\x9a\xdd\x67\x9c\x52\xb7\xb2\xb3\xe9\xcd\x2c\x76\xb6\x8d\xd5\xa8\x30\x3b\x8f\xda\x59\xdc\x36\xcb\xe9\xa8\x73\x02\xea\x94\xa9\x20\x4d\x43\x41\x49\x07\x5b\x83\x04\x8e\x62\x9d\x7e\xc1\xd6\xb8\x5e\xb7\x4a\x0c\x9c\x23\x03\x12\x37\x7a\xdb\xe3\x65\x2e\x62\xf4\xaf\x6e\xb4\xbb\x92\x42\x49\xcf\x1c\x32\x6d\x51\xce\x79\x22\xb1\x54\x39\x6c\xb3\xdc\x6a\x61\xed\x19\xcc\x6b\x7b\x98\x23\xad\x60\x66\x7d\x45\x1b\x0d\x82\xa0\xca\x63\x1f\xf1\x43\x49\x7c\x1e\xec\x8c\x9a\x35\x79\x3e\x4b\x92\xa5\xa8\x7d\x1e\xde\xe7\x73\x59\x67\x2e\xcf\x2e\xf4\x55\x66\x18\x2c\xee\xb0\xda\x26\x1b\x3e\x19\xa2\x84\xed\xa1\xd1\xeb\x56\x01\x05\xec\xe1\x94\x42\x5c\xaf\x1c\x8b\x53\x93\x67\x55\xa4\x1d\xca\xb5\xda\x8d\xfa\xb0\xc5\x37\x0b\x0c\x52\x54\x54\xd8\x58\xf4\xf4\xe1\xa8\xef\x6c\xae\xbf\x7a\x1f\xf3\x73\x11\xa7\x6b\x19\x02\x60\x88\x02\xe3\x9b\x7b\x83\x3f\xdb\x3b\x78\xbd\x31\x77\x63\x5c\xe8\x26\x1a\x69\x46\xca\x89\xa2\x63\xf4\x25\xb4\xdf\x83\xe9\x33\x47\xce\x4d\x05\x0b\x32\x1f\x4a\xb3\x15\x04\x8f\x09\x25\xb3\x5a\x4c\x12\xb3\xb2\xe1\x44\x20\x31\xb3\x3c\x2b\x44\x47\x74\x82\x90\x31\xb8\x7e\x7c\x50\x22\x25\x6b\xb0\x6a\x8a\x85\x92\xc5\x20\x8f\x8d\x9b\x20\x8f\x06\xac\xa3\xa1\x68\x53\x6c\x54\xf2\x44\x44\x94\x8c\x58\x05\xaf\x46\x09\xfa\x60\xad\xef\x75\xc7\xd4\xd4\x53\x5b\xd8\x18\xa3\x23\x1f\x2c\x81\x59\xa5\x40\x96\x93\x18\x55\x05\x14\x14\x4c\x31\x88\xe2\x2d\xc8\x24\x0c\x81\xd6\x68\x3f\x36\x3a\x41\x94\x24\xa1\xd2\x7b\xc8\x16\x67\xf2\x7b\xe1\x74\x94\x25\x5d\xdb\xad\x8a\xf2\x5a\xc8\x7e\xd0\x11\xdd\x5e\x56\x8a\xb4\x1c\xd5\xc9\x7e\x55\xd8\xae\x3a\xf9\x20\xdd\x6f\x2f\x17\x6b\x71\x56\x15\x49\x5f\xb7\x37\x24\xe6\xd2\x6b\x6b\x4e\x17\xab\x5f\xcc\x94\xd2\x99\x2e\x56\xaa\x28\x8f\xd2\x52\x68\xd5\x5d\x5c\x88\xda\x25\xba\x58\x43\x7e\x2d\x80\xd2\x9b\x0b\xc8\x45\x51\x61\x88\xd2\x72\x95\x43\xdf\x60\x6f\xa9\xfb\xb4\x26\xb0\xd9\xa3\xaa\x53\x70\x3a\x35\xd6\x2c\x0b\x3f\xaf\xb6\x4b\x59\xf7\xba\xd3\x73\x55\x21\x9c\x5e\x23\x87\x6f\x2e\x94\x46\x2a\x77\x85\x38\x8d\xbb\xf1\x83\x62\x4b\x5d\x20\xab\x28\x33\x13\x2b\x6f\x76\x30\x1c\xd2\x28\x49\x78\xb7\x2a\x23\x83\x4d\xb1\x9a\xac\xa2\x61\x46\x89\x8c\x55\x29\x8f\x34\x81\xdc\xdd\x83\x84\x1c\x73\x38\x42\xef\xd0\x9a\x72\xc4\xfb\xaf\xed\x62\xbb\x81\x25\xd3\xff\xc3\x5d\xc1\x4b\x76\xcd\xcb\x3f\x2d\x2b\xc1\x3a\xc8\xce\x46\xff\x07\x41\x3b\x32\x34\x8e\xc5\xb8\x95\x2a\xdd\x91\x56\x79\x3b\xca\x05\x59\xee\xd1\x12\xd3\x70\x03\x93\x2a\x68\x3c\x00\xc4\xf5\xab\x8d\xeb\x39\x51\xda\x7f\x0e\x97\x0d\x0a\xf9\x5d\xd9\xba\x58\xa3\x98\x71\xe8\x7d\x9c\xa7\x62\x4d\x9e\x58\xf7\xe8\x9e\xd0\xf6\x00\xbd\x04\xe4\xf6\xa1\x6c\x20\x83\x77\xc1\xa3\xd7\xab\xcc\x36\xab\xa4\x72\xdc\x2f\xc0\x11\xa2\x49\x74\x69\x83\xc9\x45\x5b\x4a\x2f\xca\x1f\x28\x05\x17\xf9\x21\x6a\x78\x92\x3e\xc7\x2c\x44\xaa\x48\x5c\xb5\xa3\x3b\x68\x25\xcc\x5f\x50\x09\x68\x17\xca\x6c\xd3\x8d\x86\x34\x4b\x69\xc9\x54\xd2\xc4\xf0\xe6\xd4\xd3\xf8\x00\x2d\x79\x47\x35\x3f\xcd\xee\x66\x33\x97\xa8\x7b\xcb\xd1\xbb\x37\x2e\x57\xcf\xe8\x19\xc4\x7e\xbc\xc5\x9e\x20\xb7\xcb\xac\x2a\x17\x44\x3b\x4b\x3b\x85\xff\xc3\xda\x11\xfc\xb7\xde\xa2\x73\xab\x1e\x36\x87\x37\x8d\x8d\x44\xab\xd7\x13\x7a\x4f\x54\xcf\x80\xd7\xad\x18\xad\x4d\xc9\x24\xd1\x5b\x7a\xbc\x92\x66\x39\x26\x66\x52\x76\x0f\x73\x1f\xec\x1b\x8e\x53\xb9\x6e\xd6\x58\xb4\xea\x42\x37\xae\x72\x6c\x2e\x89\x72\x5d\x88\x94\x1f\x85\xfe\xbe\xee\x08\x2f\xf0\x63\x9c\xd3\xdb\xba\xec\x58\xfc\xde\xe3\xb1\xab\xa9\x2a\x3a\x9d\x7f\xdc\x0b\x5e\xe9\x9d\xb4\x2f\x39\x06\x0b\x27\x9c\x40\xe4\x79\x96\x5b\x58\x78\xeb\x0c\x52\xa8\x78\x39\x9b\x56\xa3\xb4\x23\x27\xd2\x98\xb1\x16\x99\x93\x77\x06\xfa\x45\x76\x8b\xac\xd4\xe5\x4c\xc2\x7b\xce\x06\xf2\xc6\xbd\xec\x00\x2c\x59\x6a\xee\x4b\xf6\x06\xdf\xdc\x63\x5d\x70\xad\x2b\x52\x43\x82\xed\x26\x40\xdb\x18\xd1\x3e\x59\x32\x65\xda\xce\xba\x98\xcc\x06\xe7\x75\xb3\x74\x30\x2d\x0f\x0d\xd4\xaa\xa6\x1f\xa8\xe2\xb5\x28\x91\x1a\x4e\xc8\xd8\x18\x87\x5b\xc7\xa9\xb8\x48\x67\xa3\x50\x02\x5a\x5c\xea\x13\x47\x7b\x4a\x2c\xcb\x5d\x0e\xfb\x8d\xa3\x67\xc7\x76\x32\x91\x42\x99\xb2\xf5\x49\xbd\x16\x47\x3c\xea\xf5\x8a\xf1\xb5\xa3\xa3\xea\x0f\x98\xfd\x28\x3b\x8b\x0b\xa5\x48\x41\x49\x33\xd7\x97\xaa\x52\x77\x03\xb6\x0b\xcd\x72\x1d\x7e\x4e\xa5\x43\x2a\x8e\xdf\x17\xc8\xc2\x82\x67\xcb\x42\x15\xe6\x5c\x5e\x5d\x3b\x2a\xaf\xe9\x3d\xf7\x38\xbf\x2f\xb0\x9a\x17\x3c\xfb\xdc\xa8\xf5\xd5\x65\xe6\x34\x89\xc3\x77\xd5\x1b\x44\x1a\x00\x6d\x70\x0d\x5a\x00\xf6\xab\xee\xe7\xc1\xce\x8d\x97\x55\x7f\x14\x76\xdc\x74\x82\x26\xcb\x38\x45\x22\x66\xf0\xc8\xa5\xd8\x61\x64\x06\xd1\x19\x97\x64\xcb\xc8\x20\xf9\xa8\x77\x3f\xc8\x94\xdf\x72\xdd\xbf\x24\x54\x88\x11\xd1\x98\xe0\x8b\xd0\xda\xe6\x31\x71\xce\x76\x5c\x11\xf6\xca\xfc\xd2\x08\x3b\x20\x15\x98\x69\x20\x7c\x2b\xfc\x4f\x8f\x04\x1f\x1a\x59\x30\x17\xf0\x80\x1b\x22\xdc\x4b\x9d\x13\x68\xea\x90\x2e\x4e\x2e\xc3\xb6\xd4\xdd\x31\x15\x88\x5e\x89\xc7\xf9\xd9\x14\xcc\xc7\xa3\x7c\x36\x4b\xc5\x28\x70\x1a\xe2\xdf\x67\xd2\xa9\xbc\x3f\x5f\xa5\x46\x1e\x05\x23\x89\x5d\x28\x3f\x7d\x76\x61\x11\xfc\x92\x94\x1b\x1a\x4e\xd7\xb4\x1d\x27\x31\x99\xb5\x21\xfe\x71\x54\x8a\xee\x40\x22\xad\xfa\x55\x8b\x62\xf2\xb8\x42\x69\x39\xe2\xcb\x15\x20\xcc\x8b\x52\xf4\x94\xda\x68\xf6\xbf\xf6\x6a\x14\xa7\xda\xbf\xe1\x34\x42\x7e\x3c\xc6\xcc\xa7\x46\x36\xac\xd2\x0e\x08\xa4\xf3\xea\x78\xd5\x16\x9e\x0e\x7e\x95\xa6\xbc\x34\xa1\xf8\x55\x99\x8d\xe9\x26\xa1\xa4\xdf\xd7\x4b\xc5\x68\x14\xd4\x09\x6a\x14\x9e\xfe\x74\xd5\x87\x10\xd8\x90\x75\x85\xbb\xe7\xd2\x4d\x67\xd3\x7d\xd1\xd5\xec\xc6\x4b\x03\x25\xfb\x9f\xb9\x2a\xf8\x55\x6f\x18\x54\x34\x6e\x60\xef\x20\x7f\xd9\x50\x74\xb8\x52\x38\xe5\x95\x6e\x54\x92\xab\x1f\xfd\x81\x8a\x34\x1f\xa0\xb6\x1c\xdc\x8a\x8a\xa3\xd1\x04\xe0\xab\xe1\x57\x12\x13\x82\xba\x2d\xb9\xd2\x3d\x88\x15\x10\xda\x00\x2f\x1d\x87\xd3\x23\xfb\xd9\xc3\x2d\xb6\x4b\xde\xf5\xff\xd1\x63\x77\x5d\x0e\x24\xf7\x42\x4f\xb4\x83\xf7\x78\xb2\x4c\x8d\x55\x27\xb2\x35\xd3\x45\xf2\x2a\x71\x45\x56\x1a\xee\x6f\x61\x56\x1f\xed\x08\x1f\xd9\xa2\xb1\x28\xed\x8c\x21\x60\x25\x64\xaf\xf6\xe4\x7c\x01\x68\xe3\x8b\x36\x74\x9f\x6c\x37\xda\x20\xb8\xa9\xd0\xf9\x99\x6c\x2c\x64\x73\xae\x26\xab\x0b\xae\xc4\x6c\xee\x34\x66\xf3\x4a\x60\xe5\xa5\xf3\x86\xff\xae\xcd\x1b\xfe\x45\x8f\x3d\xfd\x12\x6c\xbc\x68\x95\x84\xe0\xe4\xd7\x78\x86\x29\x54\x23\xc5\xec\x68\xe5\xc7\x8e\x4b\x5c\x55\xf4\x88\xd7\xdd\x3c\x76\xf4\x19\xfe\x5d\x3a\x76\xd4\x5a\xfa\x3a\x5a\x74\xc8\xd2\x77\x82\x47\x71\x97\x60\xec\x8b\xfb\xd9\x4d\x5b\xea\xb7\xd3\x08\x0f\x01\x06\xe7\x62\x3a\x2d\xf3\xbe\xff\xc6\xfd\x41\x31\x78\x19\xa7\xf3\x7a\x96\x9f\x5f\x4e\xb2\xf5\xb1\xb8\x23\xc5\x29\xb8\xbf\x20\x4a\x7d\x7e\xa3\xc8\x38\x10\x79\x69\xd3\x4d\x94\x2a\x8f\x51\x21\x1c\xcc\x82\x73\x58\xfc\xe8\x3e\xf6\x16\x8f\xed\xc3\xe7\xee\x39\xea\xbf\xfa\xd2\xd8\xe4\x4f\xd2\xfb\xc1\x33\xd5\x5f\x14\x5a\x50\x6a\x2e\xbc\x67\x2c\x9c\x99\xd5\x0d\x26\xcc\x76\x64\x2c\x2d\x1a\x99\x16\xe8\xb2\x80\x54\x22\x64\xf7\xb2\xbd\x78\x96\xe6\xfe\xa9\xe0\x0e\xec\xb0\x9c\xa0\x11\x26\x58\x55\xbb\x7f\xa9\xe3\xf0\xfc\xa5\xf5\x5f\xa8\x9e\x70\x64\x88\xf7\x79\x6c\xbf\xb6\xbd\xf8\xef\xf0\x82\x37\x78\x67\x7a\xb5\xd0\x0c\x95\xac\xd4\x4a\x47\x0b\x67\x7d\x22\xa2\x8e\xce\x6c\xd9\x30\x88\x44\x3e\x84\x8c\xd1\xc4\x40\x2d\x05\xed\x35\x9b\x30\x58\x6b\xf1\x88\x9f\x91\x7a\xdd\xc1\x89\x5e\x2f\xe9\x1f\x84\x71\x3e\x88\xc9\x0c\x5d\x00\xfb\x4f\x7b\x6c\x97\xd4\xba\xfd\xb7\xec\x20\x9a\x66\x49\xc7\xd0\xc4\x5d\x51\x94\x51\x17\xd8\x8b\x14\x58\x56\xf7\x16\x5f\x17\x39\xf2\x0d\xf1\x99\x52\x9d\x28\x84\x83\xb5\xe9\x1c\x9c\x5e\xa3\x2f\x60\x6f\x70\x4f\xba\x97\xb4\x82\x6f\x7a\x1b\x9f\x74\xd6\x01\xe7\xce\x63\xdd\x43\xb5\x99\x8c\xa9\xba\x70\x2a\xc5\x05\x0f\x60\x51\x8c\x53\x69\x01\xbf\xbf\x2a\x4a\x0e\x1e\x10\x18\xc9\xac\x47\xa4\xed\x56\x2b\xa0\x58\xf8\x3a\xc8\xf5\xd5\x16\x45\x11\x21\x26\xa6\xcc\xa3\xf6\xf9\x7a\xeb\x22\xab\x1d\xca\xa1\x11\x97\x96\x6d\xcc\x15\x01\xb5\x36\x53\xcf\x3d\xcd\xb0\x7f\x81\x6d\xe5\x35\x5e\xf0\x90\x77\x52\xff\xd6\xf1\x5a\xb1\x5c\x17\x00\x27\xcf\x72\x2d\x5e\x75\xe2\x65\x0c\x97\x56\x23\xa4\x16\x52\xda\x31\xca\xe3\x22\x00\x25\x4c\x50\x1a\x98\x96\x29\x84\x47\x07\xfa\xc0\x14\x3c\x6e\xad\x36\xbb\x89\x3f\x33\xc1\xb6\x7b\x1a\xf8\x5f\xff\x9e\x20\x31\x3f\x31\xa5\x16\x9d\x0e\x08\x89\x4d\x12\x0b\xc4\x63\x2c\xa6\x1a\xe0\xae\xc4\x68\xd2\x45\x5d\xfc\x26\xb9\x8c\xe4\xb3\xb8\xa8\xdc\x6d\xec\x1f\xee\x60\x6f\x1f\xb1\x73\xe8\xbc\x6e\x24\x78\xf1\xc8\x96\xb3\xe8\x00\x25\x59\x53\xfe\x1c\xae\xe1\xa6\x8e\xdf\x5b\x68\x4b\x80\x92\xa2\x02\x0a\x6c\x0a\x6c\xc0\x04\x58\x39\xf4\x0d\x25\x2b\x46\x69\x96\xca\x09\x52\x93\xe3\xc0\x99\xe0\x7c\x33\x46\x4f\x53\xfc\x27\x2a\x65\x04\x96\x28\x33\x27\xd1\xd0\x18\xce\x53\x10\x7d\x32\x07\x92\x87\xf3\x26\x2b\x84\x05\x84\x45\x5d\x0d\xbe\x2a\x64\xac\x31\xfa\xb7\x41\x7e\xd9\x2e\x8d\x80\x6e\x9d\x23\x81\xfc\x97\x16\x1b\xa9\xe2\x8e\xff\x9f\x5a\xc1\x5b\x5a\x67\x67\xa6\x54\xa7\x10\x16\x51\x1e\x01\x31\x65\x58\xc5\x4f\xb3\x09\xc2\x6c\x48\x18\x2c\x58\x83\xab\xa6\xa8\x39\x03\xbf\x24\x94\x9b\xd4\xa0\x75\x78\x00\xce\x1c\xbd\x94\xf5\x2e\x43\x0e\xde\x14\xbb\x1f\x2c\x6d\x26\xe9\x40\x96\xf2\xb9\xb3\x8b\x96\x07\x20\x64\x6c\x4e\xa5\x03\xd4\xb5\x11\xb1\xd1\xbc\x88\x3a\x63\x72\xad\x6d\xbf\xbf\x6c\xda\x85\x2a\x76\xe5\xb6\x8f\xb7\xd8\x01\x18\x11\x6c\x81\x14\x7d\x5f\xdb\x9a\x30\x17\xe8\x30\xac\xd2\xa2\xcc\x2b\x90\x91\x3a\xc0\xd4\x49\x56\xd9\xa8\x07\x39\xf2\x15\x48\x23\xaa\xed\xaf\x2a\x8c\x4f\xee\x69\x7d\xb0\xce\x80\x1e\x50\x66\x19\x42\xdf\xe0\x5d\xe8\x24\x9d\x2d\x2b\xca\x97\xe2\x32\x97\x3b\xa5\x91\xf0\x16\xa5\xae\xaf\x3c\x4d\x0f\x54\x22\xef\x83\xa5\x04\x86\x52\xfb\x49\x7b\x9a\x0d\x00\x0e\x1b\x4c\x69\x00\x78\x5c\xb2\xbb\x6f\xbb\xdf\xac\x7e\xd9\x88\xc6\xe9\x2d\x2d\x76\x80\x7c\x1b\x72\x57\xf0\x5f\xd1\x0a\xfe\x9f\x01\xd4\x9a\x72\x7e\x98\xd4\x5a\xda\x4d\x99\x64\xe9\x8a\x3a\x73\x30\x2e\x4a\x59\x6d\x3b\x98\xa4\xb9\x8a\x8b\x55\x6b\x57\x43\x23\x87\x4a\x05\x8f\xa0\x03\xb3\x83\xa4\xd6\x46\x4e\x95\x16\x61\x2d\x01\x22\x90\x48\x82\xc4\xd7\x47\xe4\x5b\x0e\x58\xec\x34\x5b\x87\xd2\xe4\x36\x8c\x73\x3c\x2e\xf8\x4a\x06\x82\x4e\x46\x26\x7d\x48\x69\xa8\x89\x9b\x29\x1b\x5c\x96\xab\x14\xcb\xa4\xaa\xb8\x5e\xb0\x11\xf6\x64\xb5\x3c\x16\x95\x50\xe0\x7f\x69\xe4\xd2\x65\x8c\x1f\x1f\x99\xac\x97\x47\xb4\x19\xfa\xe7\x80\x9a\x46\x5f\x84\xa4\xf8\x28\x8d\x18\x4d\x6d\x3d\x2a\x8c\x40\x45\x27\x76\x93\x53\x93\x3e\x7b\x35\xea\xf5\x44\x5a\x8c\x11\x1b\x24\x3a\xcd\xa2\x76\x9e\x15\x05\x2f\x44\x2f\xca\xa1\x53\xcc\xb2\x26\x7e\x56\xd4\xfe\x54\xe7\x97\x3a\x46\x4d\x55\xa9\xdb\x8c\x12\xeb\xfc\xc9\xc9\xeb\xae\xbb\xee\x16\x38\x87\xd5\x46\x12\xa7\xfc\xec\xe2\xe4\x16\xf7\x89\xd9\x0a\x79\xc1\xc0\x54\xfc\xe8\xeb\xd4\x6a\xbd\xb2\xdf\xde\x2b\xa5\x90\x14\x62\xaf\xf2\xc2\xff\xfc\xde\xe0\xa5\x7b\xd5\x59\x80\x27\x1e\x75\x9c\x8b\xde\x43\xf8\x49\xc7\xe8\xc4\xe4\xf5\xea\x53\x04\x9b\xd0\x2a\x8c\x23\x9c\x2b\xf9\x05\x23\x05\x50\x02\x69\x67\xdd\x5e\x96\xc2\x19\x0a\x20\x1c\x79\x30\x61\x1c\x22\x29\xdb\xb2\x24\x5d\x8f\xec\x1e\x8d\x26\x84\x56\x38\x33\x2b\xab\xc3\x0c\xd3\x2c\x1d\x03\x34\xba\x2c\x27\x16\x85\x8b\x48\x6e\x03\x2e\x22\x21\x1b\x2a\xc5\x3e\x9e\xd4\xdd\xa1\xf6\x44\x02\x02\x10\x10\x9f\x1e\x54\x49\x02\x61\x46\x85\x9c\x9f\x81\x99\x15\x17\x7c\xf6\xcc\x22\x17\x29\x70\xbc\x75\x6c\xf1\x30\x4e\xcb\x3c\xeb\x54\x72\x5b\x28\xe2\x95\x14\x8c\x66\x69\xc9\xf3\xb8\x38\x0f\xb1\x3b\x65\xd5\x3e\xcf\xcd\x58\x84\xd6\xdf\x64\xdb\x40\x4c\x3e\x6c\x0d\xa3\x50\x77\x04\x90\x1b\xd8\x64\xac\xd4\x2b\xf2\xab\xc8\x39\xcf\x63\xd3\x5b\xba\x38\xed\x71\x32\xdf\xa5\xdc\xc9\x1a\xb5\x1f\xa3\x83\x41\xe9\x37\x11\x2f\xe2\x52\x41\x37\xec\xa4\x83\x66\xf4\xec\x31\x55\xe3\x8c\x2a\x9f\xa9\xd8\xc6\x93\xc7\x85\x8e\x50\x46\xc3\xaa\xec\x94\x28\xe1\x87\xac\xf4\x44\xa3\xe6\x1c\x52\x16\xf0\x2c\x47\x3c\xc8\x61\xd9\x7a\xd9\x9b\x64\xf4\x1e\xde\x90\xc8\xfe\xf2\xa8\x74\x9b\x31\x4a\x68\x0a\xe2\xde\x8b\x20\xae\x35\xc9\xda\xe7\x43\x7e\x2f\x79\xb4\xf5\x58\x42\x0f\x41\x7b\xcd\xc0\xc8\x93\x6e\x39\x17\x80\x17\xa1\xbd\xa5\x2b\xcf\x08\xd0\xbb\xbb\x85\x48\xd6\x28\x76\x40\x1d\x89\x6b\x55\x22\x65\x14\x82\x98\xe8\x22\x51\xcc\x28\xec\xa6\x6d\x80\x0b\xdf\x46\xb2\xab\x9f\xdf\xcb\xae\x52\x62\x11\x1c\x79\xef\xdc\x1b\xbc\x71\xef\x9d\xd6\x15\x15\x5e\xa0\xa8\x5e\x90\x19\xc7\xe5\x44\x50\x48\xfd\x32\xd3\x32\x96\x1b\x88\xca\xcf\xcc\x9e\x7a\x16\x9f\x39\x09\x4f\x43\xa9\x38\x8c\xab\x51\x41\xfe\x34\x91\xea\x94\xfa\x0d\x11\x23\x18\xa8\xa6\x61\xd9\xb9\x28\xab\xdc\xca\x24\x4d\x56\x36\x25\xb5\x9a\x63\x13\xa0\x4d\xfa\x35\x8c\x30\x1d\x8c\x29\x56\xf9\x0d\xda\x59\x77\x09\xc2\xdf\x48\x02\xa2\x0f\x80\xa4\xc1\x17\x28\x4d\x93\x4a\xfb\x8f\xaf\xaf\x12\xd3\x28\x9c\xe1\x56\x9c\x02\x78\xcd\x38\xdd\x34\xdf\x6b\x0c\xa6\x4b\x82\x97\x79\x95\xb6\xed\x7d\x3f\x11\xe9\x4a\xb9\xaa\x99\xd3\xa1\x56\x47\xb4\xef\x46\xa4\xa5\x62\xe5\xd4\xbc\x2c\xb5\xc6\x00\x10\x5a\xb5\xce\x33\x5e\x5b\x6d\x17\xd2\x82\x30\xf4\x8b\xb8\x20\x4f\x95\x51\xfb\x70\x85\x7e\x91\x5b\x15\x76\x35\x8f\xf8\xf5\x47\x6e\xe1\x63\x0a\x31\x03\xf8\x6b\x78\x86\x90\x8d\xf4\xd8\xb1\x23\x47\xf9\x24\x25\xc0\xca\x72\x7e\xc3\x91\x23\xd8\x97\xf3\x22\x2a\xb2\x94\x4c\xa7\x84\x5d\x50\xb8\x39\x80\xe6\x38\x93\xa5\x6d\xfb\x59\x97\xb3\x2a\xd5\x66\x1f\x94\xfb\x93\x24\x2b\x75\x9a\x6d\xdb\xca\x8a\x12\xa4\x14\x40\xfb\xfc\x90\x9a\xb1\x49\xdf\x82\x82\x41\x01\x0a\xb0\xa7\x8b\x9d\x97\x6f\x8c\x21\x38\x62\x55\x44\x1d\x91\x1f\x0e\x19\x9b\xa0\x64\x0d\xca\x25\xae\x56\x83\x43\xdc\xfd\xa8\x9f\xc5\x1a\x7a\xd6\xee\xdb\xa2\xd8\x0b\x5b\x6c\x0f\xa2\x1d\xfd\x7f\xf0\x82\x2f\x7b\xa7\xa3\x1e\x1e\x13\xb0\x5f\x9c\x17\x7d\xdc\x57\xc8\x86\x34\x10\x5c\x06\x9b\x0b\x04\x35\xa0\xd8\x29\xbb\x63\x25\xcb\xe5\xcf\x43\xa0\x3e\x92\x3f\x35\x01\xa4\xa7\x91\xbb\x23\xe5\xa9\x33\xd9\x81\x0d\x49\x8c\x0a\x69\x2f\xf3\x0c\xd3\x63\x63\x19\x10\x43\x7a\x09\x42\x3b\x7e\xde\x46\xf2\xfa\x9f\x7a\x6c\x5f\x21\x92\xe5\x53\x71\x7a\xde\xff\x8a\x17\x7c\xde\x5b\xa0\x5f\x78\x24\x9e\x9d\x3f\x55\x17\x1f\x2d\xf5\x70\x0b\x82\x17\x63\x53\xd3\x73\xf3\xd3\x93\x13\x8b\xd3\x53\x36\xa5\x19\x82\xd2\xcb\x0c\x42\xd4\x7b\xd1\x4a\x64\x4a\xd7\x84\x5a\x47\xc3\x63\x47\x78\x2e\x12\x11\x15\x42\xcf\x54\xbd\x28\x7b\x49\x94\xa6\x5a\x1a\xb5\x84\x86\xa3\xe1\xb1\xa3\xea\x35\x47\xf8\xfe\x2b\x8f\x7d\x87\x12\x69\xee\xcc\xa3\xb6\x98\x13\x79\x0c\x59\x55\x00\x1d\xf4\x05\x4f\x71\xc8\x7c\xd8\x9b\xd5\x08\x3b\x02\xcf\x68\x95\xb5\xa6\x23\xc3\x8e\x2d\xcb\xc2\x40\x1b\x4d\x3f\xa2\xc4\xba\xd8\x6c\xaa\xaa\x89\x5a\xd6\x52\xbd\xa5\x08\x6a\x51\x16\x1f\x14\xba\x54\xb8\xab\x4e\x0f\xa4\x44\xaa\x62\x35\xcb\x4b\x91\xca\x35\x64\x7a\xdc\x25\x31\x3a\xc0\x9e\x3c\x50\xa0\xff\xca\x03\x97\xae\x6f\xfc\x1a\x9b\x6a\x6a\xe0\xfc\xc9\x49\x0e\x12\x7a\x47\xf1\xae\xe1\x4e\x53\x6a\x59\xc6\x36\x38\xea\x73\x06\xc5\xdc\xba\x4e\x46\x3a\xb2\xbd\x9b\xca\x9e\x89\x74\x4f\xeb\x4e\x42\x55\x01\xf4\x2c\x33\x0b\xe5\x0a\x18\xb5\xcd\x0d\x9d\x38\x17\x00\xc4\x29\x44\x89\xc0\x02\x14\x69\x60\xd3\xc3\x63\xc9\x78\x89\x0b\x8a\xe3\xd3\x53\x4b\xc9\xe2\x87\xd2\x8c\x4b\xfd\x54\xe4\x7c\x2d\x26\xf1\x47\x0e\xa5\x83\x42\x21\x22\x7b\xc8\x38\xa4\xb3\xfe\x2f\xa1\x5d\xeb\xf0\xe0\x36\x6a\xcd\xf8\x51\x44\x10\x3b\x92\x64\xa1\x45\x39\xb4\x23\xf1\x89\x02\x9a\xa0\x0e\xc6\xfa\x83\x9a\x45\x06\xf8\x56\x47\x9d\x6e\x5a\x92\x52\x97\xec\xeb\x33\xaa\x9a\xc6\x99\x46\x89\x11\xf5\xf9\xae\xd4\x34\x30\xd6\x51\xfe\x23\xd2\xfe\x14\x3a\x56\x27\x69\x47\x60\xc4\x28\x8f\x12\x29\xd9\xad\xac\x22\xca\xd2\x9d\xaa\xdc\xa8\x28\x94\xf3\x00\x1f\x50\xbd\xdc\xcb\xe3\x2c\xd7\x26\x7f\xd9\x4d\x35\x98\x4e\x84\x09\xf5\xd0\x69\x4a\xe8\x17\x30\x7c\x62\xb2\x03\xa3\x3b\xc5\xa9\x83\x89\x5b\xac\xa7\x92\x92\xe3\x53\x22\xfe\x1d\x83\xaa\xad\xf9\x65\x53\x8c\x90\xdc\x5c\xcf\x1c\xa4\x65\x49\xc8\xc6\xa3\x70\x81\x51\x69\x55\xda\x90\xbf\x4a\xd6\xc5\x23\xbe\x1a\xe5\x9d\xa6\x4a\x0e\x2d\xcc\xdc\x79\xf7\xcc\xa9\x53\x87\x07\xaa\x43\x21\x17\x6a\x69\x27\x22\x4a\xab\xde\xa8\xad\xc6\xc9\x6f\xd7\x1b\xcb\xc4\xdc\x0c\x78\x42\xe1\x06\xec\xdd\x6d\x30\xbe\xa4\xa2\x5c\xcf\xf2\xf3\x80\x1e\xc7\x85\x3f\xea\xec\x65\x10\x2a\x50\x82\x50\x22\x05\x1a\x3d\x5d\x6d\x0f\xc6\x28\xaf\xd2\x12\x62\x32\x01\xf4\x92\x22\x16\x33\x03\xea\x3b\x32\xcb\xc3\x28\x22\xb4\x5b\x9e\x98\x1d\x81\x1f\x2a\xdc\x71\x97\xf3\xde\xdd\x33\x3b\x26\x71\xa3\x9c\x84\x83\x8b\x3d\x1b\x88\x56\xd1\xa2\xaf\xde\x04\x86\xdb\x03\xb6\xb6\x89\x6c\x64\x5d\x7c\xd4\xac\x04\xaf\xf5\x18\x33\x8c\x64\xfe\x43\xfa\x24\x4a\x27\x78\x21\x5b\x26\x07\x90\x50\xdf\xce\x71\x1c\x99\x64\x7c\x36\xa3\x99\x52\xdf\x91\x8b\x0e\xe0\x57\x5b\x3a\xad\x9d\xb3\xe3\x1b\x23\xec\x89\x90\xef\x53\x33\xed\x16\xfe\x1f\x8e\x04\x1f\x69\xa9\xec\xe6\xca\xd6\x8d\xac\xf1\x16\x81\x9a\x15\x51\x3c\x71\xea\x94\x7e\xce\xd6\x4e\x21\x7c\x06\x46\x8e\x96\xab\x3b\x13\xd5\x01\x51\x23\x34\xb2\x55\x1b\x63\x83\xb0\x28\x01\x22\x4b\x7a\x22\x5d\xdb\xa6\xdb\x30\x96\x09\xa8\x80\x50\x06\x99\xa1\xd4\x52\x6f\x5a\x24\x0e\xea\xa2\xe5\x93\x02\xbf\x55\x25\x94\x0b\xc8\xf8\xa5\x5c\xce\x74\xed\x1a\x35\x85\x38\x3a\xe7\x34\x9b\x64\x13\x97\x82\x0d\x70\x06\x65\xeb\xba\xea\x23\xde\x77\x6f\x92\xec\x79\x8f\xbf\xab\x8a\x3b\x8c\x3d\xb4\x8b\x5d\xdd\xb5\xbd\xad\xfe\x5f\x8f\x04\x6f\x1a\x71\x1c\xb0\x1c\xf2\xb4\x5a\x0e\x74\xdb\x3b\x66\x48\xee\x61\xa6\x90\x17\x4d\x73\xb6\x38\x24\x0e\x10\x19\x86\xa5\x18\xb3\x6f\x37\x2b\xe4\x81\x2d\xa5\x2d\x0d\x99\x59\xcd\xaa\x42\x9c\x17\xa2\x17\xa7\x2b\x78\xcc\xa2\xbb\xca\xf8\x27\x50\x7f\x49\x0f\x96\x1a\x61\x47\x27\x56\x95\x76\x44\x0e\xb0\x09\xeb\xc4\x0d\xf9\x84\xf1\x63\x93\x6c\xaf\xe4\x87\x83\x05\x1c\xd9\xa3\xce\x8c\xd2\x17\x33\x13\xfe\x4b\x51\x47\x6a\x15\x62\x4a\xdd\x5e\x54\xae\xa2\x4b\x34\x68\xc7\x63\xed\x4e\xa0\xd3\x1e\x5b\xbd\x11\x6b\xb2\x23\x95\xe9\x58\xf5\x9d\x82\x15\xe8\xc6\x81\xc6\x51\x33\xe5\x9b\x9d\xd0\x99\x54\x33\xec\x4e\x36\x7d\x09\x93\x6a\xd0\xb9\xce\xfe\xae\x45\xb1\xe7\x7f\xde\x0a\x7e\xbb\x35\x3b\xe8\xb7\x33\x09\x3c\xb5\xd1\x1d\x38\x9c\xb4\xca\x0d\x4d\x46\x7b\x37\x20\xad\xc9\x6c\x6f\x49\x08\x45\xd6\xb5\x59\x20\xba\x90\x2c\x51\x7e\xb2\x12\xcf\x20\x7c\x51\x9f\xf3\xa2\xb6\xcd\xc9\x53\xa8\x27\x35\x88\x3c\x96\x72\x27\x3a\x01\x6c\xe7\x70\xa8\x95\x4e\x4c\xf3\x17\x03\x0a\xd7\xe2\x4d\xd2\xce\x2a\xa3\x26\x92\x42\xe7\x60\x13\x4d\x7f\x5e\x16\xb7\xdd\x86\xec\xdf\xaf\xd9\xcd\x9e\xa8\xba\x44\xf9\xf5\xff\x69\x57\xf0\x97\xbb\x26\x52\x9e\xf5\x22\x60\x13\x01\xd9\xac\xc4\x08\x19\x87\x45\xca\x00\xcc\x6a\xde\xfe\x5a\x0c\xa3\x56\x64\x97\xfa\xd4\xd3\xe0\x85\x32\x87\x35\x8c\x9d\xda\xba\x61\xbb\x56\x14\x9c\xa0\x83\xa8\xd7\x65\x1f\x66\xbd\x32\xee\xc6\x45\x19\xb7\x65\xaf\xa1\x3b\xbc\xdd\x1f\x55\xbe\x3d\x59\x26\x90\xd1\x19\x7b\xc3\x3a\xa8\xc0\x06\xed\xe1\xa6\xc1\x82\xbc\x80\x0e\xbd\x8c\xed\x37\x90\x53\xb0\x94\xa3\x46\x20\x0a\x05\x12\x2e\x54\xe7\x40\x6a\x6a\xe4\x42\xab\x52\x13\xe8\x06\x40\x83\xcc\x36\xf5\xa0\x33\xad\x6b\x69\x54\x88\x1b\x41\xab\x26\x48\x49\xed\x2a\x89\xf2\x8d\x5b\xb6\x35\x07\xc4\x3d\x4e\xe8\x46\x49\x26\x1e\xd3\x68\x6b\x18\x64\xfb\x1f\x75\xd9\xc3\x1a\xa8\x31\xda\xe1\x00\xd4\x09\xc1\xa8\xc5\x80\xb5\xe4\x33\xfb\xd8\x35\x36\x94\xb3\xd7\x2b\x20\x09\x03\xda\x2d\x16\x04\x31\x52\xf9\x6f\xdf\x17\xdc\x51\xbf\xb8\x51\x9a\x28\x45\x78\x66\xde\x09\x2f\x7a\xfb\x14\x67\xae\x03\x3e\xf8\xd4\x5e\xf6\x25\xc8\x12\x43\x64\xbc\x9f\xd5\x64\xbc\xef\xf7\xea\x34\xbc\x16\xd5\x6b\xd2\xe7\xd9\x12\x3a\x43\x07\x49\x79\xb7\xcd\x3c\x29\xb7\xe4\x24\x8b\x3a\xc8\x41\x49\x66\x9a\x71\xcb\x7c\x63\x2e\x8f\x5f\xb3\xbe\x1a\x95\x63\x71\x31\x16\x8d\x35\x3e\xe0\x26\xd0\xf6\xd8\x93\x75\x46\x33\x4d\x38\xdc\x53\x9f\x78\x9f\x4b\x5c\x69\x72\x9f\x69\x7a\x61\xc8\x8a\x83\x27\xa6\x8e\x1e\xed\xc6\xa9\x9c\x82\x7d\x32\x71\x1c\x36\xd6\x0b\x05\x95\x2e\x44\x8d\x21\xfc\x1b\x2e\x83\xf6\x9f\x78\xc1\xec\xbc\x3b\x7c\x84\x64\x35\x4d\x40\x02\x5d\x93\x81\x31\xb2\x4b\xb7\xe8\xf3\x50\x0e\xb5\x0f\xab\x9b\xd9\x8d\xec\xfa\xe1\x78\xe1\x81\x49\xa6\x99\xae\xa5\xd0\xb3\xb1\x28\xb3\xd7\xdf\x5d\xf6\x7b\x52\xe8\xd9\xb2\x29\xff\x65\x1e\x7b\x0a\xa8\x24\x10\xe7\x6c\xd1\x3e\x17\x6a\x14\xfe\xfd\xe2\x20\x37\xb1\xa1\xfa\xa4\x68\x70\x87\xb6\x8b\xae\x91\x44\x2e\xb5\xb4\x52\x74\x7b\x89\xc5\xb7\xad\x06\xb0\x3e\x10\x3f\xd4\xc8\x73\x1c\x2b\xcd\x60\xf1\xcc\x20\xcf\x71\x2e\x96\x13\x15\x69\xd0\xa0\x0f\xd4\x17\x05\x41\x04\xac\xa5\xe7\x34\xe0\x7b\xd9\xd5\x30\xa5\x74\x37\xdc\xa9\xba\xe1\x98\xdb\x0d\x38\xf1\xf4\x44\xdc\x7c\x8e\xbd\x7c\x97\xb3\x99\x0c\x23\x5b\x93\xda\xc6\x3b\x3d\x15\xd5\x9f\x2b\x84\xd0\x00\xfd\x5a\x03\x51\x9c\x32\xea\x80\x1c\x82\xf1\x3c\x8a\x2c\x59\xca\x9f\x13\xb3\x53\x0a\x2e\xb8\x98\xf5\xb2\x24\x5b\xe9\xdb\x15\x23\x1c\x51\xc7\x0b\x80\x6f\xb0\x5a\xa2\x8d\x1f\x1c\x12\xb5\x96\xba\x28\xa9\x9f\x6d\x41\x8e\xb6\x3a\x77\x86\xff\x02\x2f\xb8\xd1\x64\x94\x73\xbf\xc3\x69\xea\x12\x7e\xe5\xc1\x42\x85\xe3\xdb\x6b\xe6\x36\x76\x9c\xdd\xbc\x2d\xe2\xba\x79\x53\x36\x7b\x8d\x47\x51\x74\x24\xd7\x5f\x42\x9b\x34\xc4\xf3\x72\xb5\xe9\xab\xfb\x1d\x6a\x3a\x4a\xf0\x43\x79\x61\x10\xb6\x31\x9f\x25\xe2\x44\x0c\x66\x1a\x48\x1c\xf5\xbe\xfd\xc1\x87\xbc\xe6\x7b\x4d\x79\xa4\x06\x9f\x84\x20\xc9\x5e\x2e\xb4\x17\x63\xed\x68\x78\xf4\x26\x88\xf9\x8e\xd6\x32\x9c\xd6\xc3\xf2\xdd\x8c\xaf\x1d\x6d\x28\xf1\x14\x78\x3b\xe5\xd9\x4d\x34\x01\xca\x58\xb8\x44\xf2\x86\xaa\xe6\xd8\xb1\xb0\x31\xa5\xd5\xef\xed\xb9\x12\xb6\xb0\xd3\xb0\x85\x07\x55\xaa\xa9\x07\x82\xef\x6e\x48\x35\xd5\x30\x0f\xb6\x3e\x8d\x37\x99\x97\x57\x42\x26\x76\x10\x32\xf1\x18\xe5\x72\x7b\xc4\x7b\x70\xf3\xb8\x85\x7b\xfd\xb3\xdb\xc8\x79\xd5\xbc\x11\xb8\x19\xb0\x28\x88\xe1\xa3\xfb\xd9\xbd\xe6\x5b\x4c\x7c\xe6\x98\x06\x99\x99\xcf\x72\x1e\x00\xc6\x62\xc8\x93\xa3\x48\x38\xa7\x74\xf7\x90\xdc\xfd\x7b\xfb\x82\xf9\x8d\x1f\xb1\x58\x56\x28\x86\xc4\xc8\x20\xc3\xde\x74\xf6\xa7\x7f\xde\xcb\xde\xd9\x72\x84\xc3\x37\xb4\x82\x59\x3b\xbb\x0a\x55\x40\x65\x4b\x39\xc0\xd2\xa1\xa2\x02\xd8\x11\x51\x40\x1c\x5e\xa1\x59\x8d\x09\xbb\x9f\xad\x0e\x9b\x09\x97\xa9\xf7\x1c\x81\xf2\x3b\x06\xa9\x74\xbb\x51\x4f\x4a\x93\x85\xbf\xdf\xdf\x3b\xc6\x49\xa0\xe4\x43\x49\x77\xf7\xf8\xbb\xba\x51\x8f\xb1\xdf\x1a\x61\x4f\x40\x2c\xa8\x26\xa0\xfc\xe5\x91\xe0\xdd\x23\xee\x35\x74\x18\x01\x16\x59\x53\x24\xca\x4d\xca\x69\x2b\x09\x98\x10\x22\x00\xdc\x0c\x1a\xdc\x1d\xf2\xc5\x3c\x6a\x9f\x37\xb1\x17\x86\x89\x11\x53\x49\x45\xbc\x1b\xaf\x90\x08\x08\x16\x29\x20\x67\x45\x88\xaa\x7e\x36\x4e\xb9\x28\xdb\x24\x0c\x69\x0f\x5c\xb7\x42\x3f\x19\x90\xec\x9a\x52\x2c\x6b\x68\x3b\x4a\xb9\xec\xc5\x62\xd5\x79\x02\xb8\xa6\x31\xe4\x5a\x19\x20\x0e\x89\xb4\xa8\x72\x64\xad\xe5\x59\xd2\x71\x80\xd7\x89\x58\x06\x18\x21\xf1\xd1\x1e\xd6\x26\x82\xd4\xf6\x6e\xe4\xa2\x28\x07\x58\x30\x69\xf3\x23\x8b\x6e\xc8\x75\xb7\x5a\x2e\x2b\xc7\xe7\x7a\x4e\xce\xc0\x50\xbd\x7f\x8e\xaf\xaf\xc6\x90\x58\x4c\xf4\xc9\xdf\x61\x5b\x88\x37\x62\x8d\xfc\xba\xc7\xae\x8e\x20\x4a\x59\x74\x00\xfc\xee\xff\xbe\xc7\x3a\x8f\xf2\x54\x85\x8a\x82\x07\x9d\x7a\xa1\x0b\x95\x25\xd2\xb2\xaf\x46\xed\xb2\x02\x83\x28\xc6\xc7\x28\xc0\x02\xd4\x0d\x21\x0f\xd9\x9a\xdc\x44\x8d\xfd\x63\x38\xe6\x07\x66\x08\x74\x1c\x7b\x3d\x63\x53\x5b\x60\xe4\xa8\xf3\xc3\x3a\xcc\x1f\x20\xbd\xfd\xca\xfe\xe0\xee\xcd\x1e\x72\x0f\xee\x8d\x9e\x6e\x96\xa6\x7e\x7f\xef\x15\x69\x6a\xa7\xd2\xd4\xab\x3d\x25\x4e\xbd\xd8\x0b\x9e\x76\x6a\x2b\x63\x61\xaf\x9a\x79\x36\xc7\x66\xb7\x4d\xe8\xb2\xe1\xf4\xb9\x22\x64\xed\x40\xc8\xfa\xbc\x1d\x97\xfa\x8b\x97\x16\x81\xa8\xc5\xac\x17\x7a\x5a\xce\x82\x45\xfa\x98\xc5\xa0\x5a\x1f\xf7\x88\xf7\x42\x6f\x73\x79\xee\x39\xfe\xb3\x4d\x1c\x6a\xe3\xa4\xab\x89\x74\x9b\x6d\x4d\xf5\xf4\xa6\x3f\xcf\x9c\xbc\x50\x0d\xb6\xd1\x9e\x68\xfb\xaf\x66\xc1\xf5\xee\xa5\xe6\x10\xff\x06\x73\xa8\xd2\xc8\xdd\x0c\xc8\xfb\xd9\x43\x2d\xf6\xc4\x9a\x89\xcf\xff\x4b\x6d\x15\xfd\xb2\x77\x3a\x4e\x6b\x64\xea\x0a\xcd\x24\x25\x01\x62\x53\xe0\xa9\x58\x4f\xfa\x0a\xf2\x0f\x26\x2a\x13\x48\x82\xa6\x1d\xc5\x3d\x05\x70\x6c\x4c\x4e\x65\x70\x09\xed\x3c\x2a\x56\xc1\x23\x07\xce\xba\x92\x50\x33\x16\xa9\xa1\xb6\x14\xba\x7c\x13\x47\xf8\x21\x59\x99\x66\xbe\x6b\x78\x81\x47\x05\x2f\xb2\x2c\x95\xff\xc6\x14\x17\x10\x75\xfa\x87\x1d\x6b\xd2\x4f\xb6\x2c\xa3\xf0\xeb\x34\xc5\xd3\x3f\x0f\x18\x85\xed\x74\x3d\xe8\x19\x37\x66\x60\x93\x75\x92\x32\xfd\xd7\x63\x4e\x14\xd9\x92\xb8\x40\xc9\x0d\x1e\x14\x79\x86\x4e\xc8\xd4\xc2\x32\xda\x1f\x78\xf4\x5b\xc7\xba\xfc\x4f\x2d\xa6\x67\x91\xff\x57\xad\xcb\x40\x3b\xfa\x9f\x5a\x36\x25\x68\x44\x74\xa9\x10\x90\xc4\x33\x90\x53\xb5\x71\x94\xa6\x93\xc9\x9c\xe9\xf0\x74\x84\x48\x2b\xd9\x8c\xb8\xb4\x52\x6e\xda\x8c\x6c\x4b\x96\x63\xde\xc0\x0e\x6c\x7b\x23\x9f\x29\xeb\xf9\x3a\x6d\xe3\xab\x31\xad\x6d\x77\x88\xb6\xc4\x28\x7b\x0d\xfc\x3b\xa6\x21\x9e\xec\x47\x5b\x6c\x9f\xaa\xdb\x7f\xf1\x56\x12\xcb\xcf\x65\x9d\x45\x7a\x01\x58\x41\xbe\xe0\xa9\x9f\x6a\x3a\xdb\x0e\x3d\x37\xe9\x26\x7c\xa9\x0e\xf6\x90\x9d\x45\x8b\x3b\x06\x5a\xe2\x6a\x79\x39\x6e\xc7\x08\xe5\xa7\x15\x22\x85\x46\x74\xd3\x0d\x01\xe4\x5e\xa6\x59\x7b\x4d\x2f\xeb\x8c\xa9\x8e\x60\x5f\x6e\xb1\xa7\x6d\x92\x44\x87\xd4\xdb\xf7\xb6\x82\xdb\x06\x2f\x6f\x39\x83\x8e\x6b\x9f\xfd\x7d\x8f\xfd\x8e\x27\xd7\x06\xe6\xe7\xf9\xa2\x17\xbc\xcc\x53\x39\x79\x8c\xd4\x69\x65\xe4\xaf\xa5\x9e\x51\xd1\x17\x6e\x15\x52\x1b\xdb\x6e\x5a\x1e\xd4\xdb\xdc\xe2\xb7\xe1\x20\xd9\x20\xeb\x10\xfb\xec\x2e\x36\x6a\x3d\xea\xe8\x18\x68\xc2\xa2\x27\x4f\x44\xed\xf3\x22\xed\xf8\x17\x77\x05\x53\xee\x25\x3b\x89\x43\x92\x68\xf1\x47\x25\xb6\x58\x89\xd7\x44\xaa\x3f\x0e\x9c\xae\x59\x5e\xcb\x2c\xf4\xc9\x11\xf6\x0d\xf0\xd9\xa1\xe8\xe5\xff\x99\xc7\x8e\x6f\xfa\x39\x8b\xfd\x9e\xe8\x9c\xca\xda\x51\x52\xcb\xf4\x1d\xbc\xdb\x9b\xb7\xe0\x63\x51\xca\xf5\x03\xb6\xe2\x69\xc1\x8c\x0d\xda\xcc\xd2\x68\x20\x38\x90\xb4\x49\x35\xee\x16\x64\xc9\x46\xa8\x59\x69\x15\xe9\x43\x67\x55\x9c\x61\x61\x92\xfb\xe2\x4e\xa3\x68\xcd\xf4\x61\xc0\x66\xd8\x01\xeb\x2d\xff\x78\x30\xb6\xe0\xd0\x0c\xa6\x83\x99\xc4\xdb\x42\x97\xec\x60\x97\x9f\xa7\x8b\x82\x4c\xd9\xe9\x56\x49\x45\xaa\x32\x4e\x42\x39\x68\x65\x1e\xce\xa4\xe5\x99\x7c\x01\xca\xab\xb7\x04\x72\x17\x0d\x6f\x09\xfb\xd0\x01\xf6\xaf\x1b\x72\xf0\x5b\xc6\x2f\xff\x8d\x07\x82\x97\xda\x26\x79\xb2\xc3\x53\xac\x27\x50\x02\x8c\xf2\x24\x5b\x81\x98\x6c\x10\xc7\x28\x41\x0c\xd2\xf7\x21\x21\xa8\x8d\x4e\xb0\xda\x21\x77\x28\x2e\xa5\x46\xc4\x78\x59\xc6\x36\x9e\xe5\x0d\x26\x38\x77\x12\xbe\x7a\x3f\xfb\x8f\x2d\xf6\xc4\x68\x65\x25\x17\x2b\xb0\x21\xc9\xca\xfc\xd7\x6f\xb4\x0d\xab\x2f\x9c\x70\x5f\x0a\x7e\xd7\xab\x5d\xa9\x47\xf7\x58\xf9\xaa\xcd\xf2\xa1\x84\x0f\x4b\x55\x9c\x20\xfe\x01\xbf\x56\x7b\xca\xac\x2f\x40\xd4\xdc\x60\x1d\x84\xcb\xa5\x94\x2f\xf8\xbe\xdc\xb5\x2d\x93\x8c\x42\x55\x41\x22\x0e\x80\x3c\xeb\xb0\xa7\x32\xa3\x57\xd4\x89\x50\x94\x59\xb7\x67\x00\x0b\x16\x42\xed\x8a\xda\x7c\x85\x3b\xe9\xf1\xd3\x51\x57\x2d\x15\xf5\xfb\x77\xca\x9c\xb4\x91\x2b\x80\x3d\x57\xf1\x11\xe7\xc1\xf5\xb8\x36\x28\x4b\x6f\x92\x40\xe7\xd9\xdb\x52\xd3\x42\xdd\x7a\xe2\x36\xb5\x97\x98\x12\x1f\xf1\xee\xdf\x5c\x6f\xbd\xd3\x9f\xbe\x34\x3f\x44\x5d\x3f\x7d\x1d\x73\x36\xef\x06\x09\xd3\xff\xeb\xfd\xc1\x8c\xf5\xdb\x3e\xf9\x0d\x60\xc1\xc0\xe5\x00\xd3\xda\x8b\x05\xc9\x5a\xbd\x5c\xa8\xbc\x77\xbd\xac\x46\x93\xf7\xdf\xf7\x5d\x59\x0f\x3b\x58\x0f\xbf\x66\xdb\x6c\x3e\xb9\x63\x2e\xb1\x87\xbc\x0d\x96\xc4\x63\x06\x77\xff\x73\xcf\xd2\x86\x7e\xc7\xbb\x04\x6d\xe8\x5d\x9e\x35\x55\xcd\x79\x64\x74\xce\xba\xe6\x63\x9c\x05\xb6\x1a\x18\x3e\x16\x04\x89\x57\x0e\xd4\x1d\x1e\xa8\x8f\x78\x0b\x9b\xef\x96\x47\xfc\x50\xef\x96\x41\xa0\xb7\x45\x6b\xe2\xd4\xb7\xc5\x0f\xee\x62\xb7\x5a\x53\x8d\xf8\xb6\x95\x76\xb4\x50\xf5\x08\xfe\x13\x25\xc8\xd4\xbb\x40\x88\x31\xca\xe2\xe1\x7f\x73\x24\xe8\x6c\xfa\x94\x4b\x89\x44\xf7\x10\x5f\x84\x19\xef\xf0\x29\xe5\xa1\x21\x12\x11\xfb\x61\x77\x3b\x7d\x78\x84\xbd\xac\xc5\xf6\x40\x9a\xc7\xc2\x7f\x7e\x2b\xf8\xa8\x87\x7f\x6b\x57\x90\x0a\x54\xa4\xcb\xd9\x32\xe4\x85\x53\x8d\xc4\x2e\x2a\x42\x2e\xc5\x4c\xc8\x0e\x04\x53\x06\xe9\xbb\x32\x0e\x91\xf8\x26\x85\xc5\xe0\x9b\x28\x82\xc2\xf5\xbe\x79\x0e\xb3\x4e\xea\xa0\x09\x08\xe6\x86\xa4\xbd\x48\x8d\x9c\x76\x4c\xce\x2f\x38\x45\x4e\x57\x45\x39\x5f\xa5\x13\xae\xb2\x7b\x1d\x3b\xba\x41\xea\xde\xda\xf8\xcc\x4c\xcd\xcb\x4a\x59\xc9\x76\xc9\x63\xdc\x4f\x82\xe7\xe4\x24\x2a\xbb\x5d\xad\x77\x83\x4e\xdc\x26\xa2\xfd\xa8\x6c\xea\x13\xcd\x36\x43\xba\xe2\x82\x68\x57\x79\x5c\xf6\x27\xb3\xb4\x14\x17\x5c\x1e\x97\x5f\x7b\x32\xfb\x77\x76\x36\x4d\x9d\xf1\x52\xb7\x6f\x2e\x8f\x33\x78\x3b\x89\x8a\xc2\x7f\xfb\x93\x83\xdf\xf3\xac\x48\xd8\x31\x34\x38\x0e\xd0\x0b\x3a\x6f\x61\x30\x9b\x06\x29\x2d\xf5\xad\xcc\x9a\x06\x8a\x34\xee\xbc\x13\xd6\x8a\x50\xd3\xaf\x1b\xf5\x40\xdf\x82\x7d\x30\xc2\x28\xbb\xb8\xec\xf3\x36\x3c\x05\x8a\x28\xed\x0d\xfa\x16\xd9\x0e\x15\x2f\xcb\xa2\x0e\x9b\x27\xfd\x0c\x52\xfb\x01\x5e\x9a\x9e\x0c\x2f\x7a\xbb\xe1\x09\x67\xc6\x7e\xf8\x09\xec\xa7\x47\xd8\xd5\x2b\x49\xb6\x14\x25\x64\x1e\xf5\x5f\x37\x12\xbc\x68\xc4\xb9\x64\x31\xf0\x3b\x3c\xd1\xee\xe7\x58\xa9\x60\x2c\x73\x31\x51\xb9\x51\x41\xfa\x03\x00\x80\xa0\x4f\x84\x4e\xc6\x75\xde\x1e\xd9\x74\xb7\x0b\x28\x0a\x37\x4b\x45\xad\x46\x45\x03\x1e\xe5\xe7\xb1\xaa\x73\x4e\xb3\xcf\xd9\x39\x23\x96\x6b\x01\x40\x4e\x49\xa2\x20\x9a\x00\xbd\x4e\xe2\xbc\x5e\xd8\x60\x8c\x11\x71\x0a\x74\xa3\x24\x91\x3b\xb6\x26\x1f\x2b\xaa\xf6\x2a\xc7\x97\xf5\x87\xd7\xab\x53\x67\x20\x4c\xea\x21\x9d\xe4\xe6\xd0\xbe\x22\xa9\x5d\x91\xd4\x1c\x49\xed\xe1\x16\x7b\x52\x2f\x17\xa2\x0b\xe7\x14\x65\x5e\xf8\x4b\x2f\xf8\x3d\x6f\xae\x76\x55\x6d\xbc\xf4\x0b\xd6\x1e\x3d\x92\xae\xe0\x32\x84\x79\x2f\x0f\xa7\xdc\x4c\x3f\x7e\x06\xf3\x9b\xce\xe2\x12\xa2\x52\x4f\xc9\x87\xe6\xf4\x33\xb6\x53\xa5\xe9\x09\xb9\xf2\x20\x38\xb9\x1e\x48\x2e\xb7\xe2\x31\x32\x3d\xad\xd8\x01\x1a\xb3\x59\x3a\xa7\x5b\xa7\x8b\x59\x16\x91\xec\x91\xb1\x15\x4d\x7c\xa8\x88\x1a\x3d\x86\x3b\x9b\xff\x13\xda\xbd\xf6\x52\x6f\x71\x80\x0d\xb0\xbe\xa7\x28\xaf\x12\x9c\xcb\x80\xc9\x30\x8f\xc0\xa6\x04\xfd\x92\x8b\xb6\x88\xd7\x4c\x16\xfd\x3e\x6e\x52\xae\x85\x30\x2e\x68\xaf\xc6\xd3\x29\xce\xd1\x53\xd7\x13\x6d\x17\x5b\x7d\x45\xd8\xdc\xa1\xf5\xe6\x65\x1e\x3b\x80\xea\x2f\xcc\x6e\xff\x07\x82\xcc\xfa\x49\xe6\x3e\xc3\xcc\x47\x5b\x23\x25\x72\x42\xd4\x0d\x71\xdc\x14\x1c\x82\xbd\x12\xe8\x70\xcc\x1c\x9a\x36\xcd\x13\xeb\x54\x93\x5b\x75\xe8\x88\xbe\xf1\xe6\xa2\xef\x49\x7f\x4a\x8b\xbe\x03\x12\x82\x91\x84\xed\xd3\xa1\x11\x9f\xf8\x81\xfd\x36\x1d\xe9\xa6\x42\x0d\x40\x79\x1e\xde\x1f\xdc\x38\x70\xb5\x09\x82\xed\x7e\xb2\x28\x9a\x51\x3b\x9f\xbc\x82\xda\xd9\xf1\x04\xee\x2b\xd0\x4e\x2f\xf8\xb7\xb1\xc2\x40\xeb\xc0\xeb\xba\x90\x29\x1c\x04\xf4\xd3\xd9\xad\xec\x96\xa1\x22\xf8\x66\x33\xe2\x8a\xfc\xb0\x03\xf9\xe1\x33\xb6\xfc\xf0\xd1\x1d\xa2\x73\x7e\xb0\x19\x9c\xf3\x2d\xcb\x0f\xbf\xc5\x6d\x6b\x28\xb4\xfa\x6f\x3c\xb6\x78\xa9\x88\x4b\x9c\xc8\xcf\x58\x38\x33\xbb\x00\xeb\x7e\x2e\xcf\x7a\xc5\x99\x7c\x42\xae\x08\xff\xcd\x5e\xf0\x06\xaf\xf9\x9e\xed\x7d\x8e\xec\x88\x5c\xa9\x32\x10\xab\x17\x30\xfe\xd6\x5e\xa7\x9c\xa2\xb0\xe2\xe4\x72\xac\xdd\x0e\xf9\xe9\x28\x96\xba\x08\x70\x0b\x00\x64\x57\xe4\x71\x94\x90\xdd\x97\xf7\xaa\xbc\x97\xc9\x0d\x94\xfd\xf0\x13\x1a\x71\x47\x26\x0b\x29\xe0\x8e\xfe\xe0\xea\x60\xd6\xbd\x34\x14\x77\x64\x93\x46\x50\x86\x11\x4d\xf8\x6e\x8a\xb0\x11\x49\x17\x3d\x6d\xc8\x73\xf6\xf1\xaf\x5d\x75\x05\x9c\x04\xe2\xd8\xf7\xb0\x3d\xbd\x48\x9e\xea\xfe\x8d\xc1\xa1\x19\x0b\x81\x4f\x21\xfe\x26\xa5\x13\xc4\xa8\x47\x24\x00\x58\x3a\xd9\xdb\x46\xd8\xbf\xec\xe5\x19\xb8\xa9\xa7\x44\xd4\x91\xe2\x84\xea\xcf\x87\x47\x54\x7f\x7e\xad\xb5\x08\x69\xc3\x2f\x40\x9f\x2a\x76\x21\xbb\x47\x23\xbb\x2e\xc5\x85\xa7\x0a\xb6\xe8\xaa\x06\x72\xf0\x2e\x61\x4e\x3a\x15\x30\x67\x95\x62\xf9\x1e\xa1\xa3\xe4\xef\x38\xad\x9c\xe4\x9e\xf8\xaa\x93\x59\x0b\x98\x6c\xb8\x0e\x1c\x50\x64\x81\x73\xb5\x8f\x9c\xbe\xd0\x86\x44\xa9\xb2\x5b\x0b\x78\x8c\x5c\x97\x55\xbe\x1c\xb5\x8d\x9d\xc6\x6a\x10\x65\xa4\x81\x7c\xa1\x24\x60\xab\x0f\xb4\x73\xb7\x8a\xa2\x8c\x91\xa7\xa6\x53\xe5\xea\x14\x42\xbe\xaa\xe6\x01\x71\xa6\xc6\x8d\x47\x8e\xd4\x72\xe9\xbd\xd6\x0e\x4b\x7e\x91\x9e\xe3\xbd\xd9\x01\xc0\x99\x94\xf7\x77\x04\x36\xab\x51\xe7\xb9\x70\x33\xa7\x51\x9f\xf0\xd8\x53\x72\xb1\x16\xcb\x6d\xee\xae\xb8\x28\xb3\xbc\x7f\x2a\xee\xc6\xa5\xff\x2e\xdd\xc0\xd7\x79\x6e\x20\x67\x96\xd8\xd1\xa0\x05\x52\x2f\xc8\x95\x04\xe8\x0a\xa0\x65\xc8\x29\xb1\xf1\xa3\xf6\x11\x47\xdc\xaf\xf8\x7b\xcf\x02\xae\xfd\x89\x77\x19\x80\x6b\xef\xf0\x4e\x39\x99\xbd\xb5\x99\x28\xe4\xd3\x17\xb0\xf9\x4e\x27\x60\x3e\x76\x50\xd4\xa2\x5c\x45\x47\x5a\xa8\x33\x35\x2d\x01\x92\x25\x25\xd3\x08\xf2\x6d\x59\x4f\x98\x29\xb5\x75\x58\x1a\xfb\xa0\xfc\x70\x15\xa3\xfc\x6e\x8f\x5d\xb7\x69\x98\xb4\xb5\xc9\xd3\x7b\xc1\xc9\xc5\xfa\xfa\x50\x56\xd1\x0c\xb3\xce\x66\x00\x01\x8b\xda\x44\x61\xe9\xaa\xea\xa9\x58\x87\x2f\x0a\x1f\xf1\x46\x37\x8e\xa1\xbe\xda\x3f\x80\x13\xe5\x6e\xd1\x2f\x18\x7b\xc0\x72\xef\x88\x4b\xf0\xee\x1c\x6d\xf0\x43\x6e\xe8\xde\x09\xd9\x5b\x47\xd8\xbf\xd9\x24\xe4\xd4\xff\xc7\x56\xf0\x11\x6f\x62\x20\xc8\xd5\x81\x90\x55\xa9\x9b\xe8\x05\xe6\xa5\x5c\x1a\x29\x90\x3f\x80\x7d\xcf\x40\x1d\xc1\x03\xba\x26\x80\x5d\x57\xe8\x08\xda\xe2\x56\x6c\x64\x5c\x00\xcb\x67\xad\x86\x33\xf3\x9a\xa0\x54\x33\x40\xda\x6c\xd7\x64\xa1\x18\x0c\x73\x96\x2a\xd3\x93\xd3\x5a\xe4\xb1\xab\x3e\xbd\xd9\x63\x6f\xf0\xd8\xe0\x43\xfe\xf3\xbd\xe0\x36\x65\x81\x0f\xf9\xb0\x80\x5f\xac\x05\x33\x8e\xca\x3f\x61\xc2\x9f\x99\x87\x13\xc9\xe8\x08\x37\xb0\xeb\xd8\xd1\x6d\x05\xfb\xca\x36\xb0\x57\x8f\xb0\xeb\xad\xe7\x96\x93\x6c\x9d\xce\x0f\xe3\x73\x41\xb8\xd1\x44\x1b\x80\xa1\x0b\x15\x7c\x95\xff\x1b\xad\x60\xbe\xf1\x0e\x39\xec\x3b\x72\xe6\x25\x70\x1e\x98\xb4\x60\x24\x37\xc9\x97\xc6\x22\x7c\x0b\xa4\x4e\xa9\x12\x80\x1a\x78\xd1\x33\x69\x2c\x2e\x7a\xc0\x73\xe3\x46\xe3\x7a\xac\x4f\xf4\x37\x0f\x04\x9d\x73\xf2\x8f\x73\x1a\x48\x4c\x56\x19\x1d\xe9\xef\x36\x4f\x05\x38\x01\x4f\x50\x70\x6d\x60\x92\x8e\xe6\x62\x25\xca\x3b\x09\x00\xce\x96\xa1\x18\xe3\x18\x71\x0c\x4e\x1d\x3b\xc9\xc6\xbd\xc1\x33\xce\xe9\x5f\x4e\x23\x34\x94\x6d\x93\x96\x0c\xa9\xe5\xa1\x5d\xec\x98\x35\x24\x44\x0f\x67\xab\x77\x77\x2d\x2e\xce\x11\x44\x6e\xbe\x4a\x04\x90\x98\xf8\xbf\x32\x12\xfc\x54\xab\xe9\x8e\x1b\xb3\x23\x15\x0c\x6b\x8e\xc3\x29\x41\xfc\xf9\x4b\x08\x30\x2c\x34\x4b\x1d\xb1\xfb\x69\xf6\x9c\xdb\x56\xb3\xa2\xbc\x7d\xfc\xb6\x5e\x54\xae\xde\x7e\xc7\x6d\x85\x90\x9a\x47\x2f\xca\xcb\xdb\xf9\xd8\xed\xea\x75\x8e\x84\xfd\xf8\x5f\x79\x53\xf3\x2c\x54\xb9\x14\x46\x72\x64\xaa\x06\x21\x06\xf8\x29\x6f\xb9\xf9\xc6\xd1\x21\x4c\x94\x6e\x72\x58\x48\xd4\x5d\x94\x56\x4e\x7b\x8b\xba\x31\x89\x8a\x92\x1f\x1c\xc7\xe4\x41\x16\x7b\x3b\x92\x71\x1f\xbc\xe3\xa0\x1c\xf6\x83\xd7\x1c\x0c\x2f\x7a\xbb\x65\xfb\xdd\x25\xfa\x2a\x8f\xbd\xdc\x63\x78\xc3\x7f\xa1\x17\x5c\x3f\x51\x37\x94\xc8\x3b\x2a\x65\x44\xcf\x56\x5d\x4d\xb7\xd9\xcb\xf1\x0e\xf6\xf4\xe1\xba\xe2\x26\x63\x3a\x17\x95\xab\xec\x2d\x8c\x7d\xff\xce\x74\x27\x37\x64\x6d\x32\x4b\xaa\x6e\x6a\x02\xd7\xfc\x8f\xec\x0f\xee\xde\xf8\x11\xcb\xf9\x03\x76\xa3\xaa\x6b\x56\xb0\xc8\x31\x8b\x66\x2f\xc7\xf9\x13\xd2\x6a\xbd\xe8\xed\x92\x9a\xf4\x45\x6f\x9f\x54\xa0\xe4\x97\xb8\x6c\x31\xfb\xd8\xbb\x3c\xa6\xef\xf9\x6f\xf1\x82\x57\x79\xea\x17\x59\x25\x80\xe1\x01\x33\x66\x41\x7c\xe4\xa1\x38\x14\x21\x89\xa3\xa0\x9d\xa9\x9c\x17\x87\x55\xce\x9c\x42\xe5\xd8\x57\xd9\xdc\xe5\x24\x89\xda\xab\xbc\x0d\xdf\x67\x59\x31\x32\xc5\x9f\x8e\x96\x2a\x37\xbf\x0a\x7e\xa2\xb3\x16\xef\x75\xad\x8e\x77\x05\xb7\xd6\xad\x8e\x7c\xb5\xea\x02\xf3\x7c\xd4\x01\xf5\xc3\xbe\xaf\x4d\xc4\x83\x05\x7f\xa0\xc5\xf6\xe0\xbe\xe8\xff\x6c\x2b\x78\x6b\xcb\x24\x72\xb2\x61\x8b\x67\x7a\x22\x9d\x98\x9b\x41\xcf\xb4\x99\x4b\x03\x4d\x86\xc3\xe1\xa0\xec\xff\x83\x56\x4a\xa8\x88\x88\x9e\x8d\x0b\xb1\x1b\xe5\x7d\x3b\x33\x01\x0d\xaa\x94\x23\x8b\x82\x62\x2d\x15\xdf\x11\x3d\xd6\x47\x58\x11\x3c\x17\xab\x84\x9e\xd4\x9d\xb8\x55\x2e\x08\x61\x9b\x2d\x56\xab\xa5\xb0\x9d\x75\xc7\xcf\x4c\xcc\x8c\x53\xfb\x15\xac\x15\x75\xda\xf1\xa5\x24\x5b\x1a\xef\x46\x45\x29\x72\x95\xaf\xaa\x18\x3f\x16\x1e\x09\xbb\x9d\x6b\x3a\x51\x19\x41\xd4\x2e\xaa\x47\x78\x8a\xb8\x99\xcb\x4e\xd0\x01\x70\x3c\x18\x4b\x15\x91\x7b\x7d\x14\xe0\x86\x42\x7a\x37\x74\xff\x2b\x5a\x6c\x9f\xb2\x7d\xfa\xcf\xd7\xd1\x29\x7f\xea\x19\x3f\x2b\x66\x71\x20\x6f\x2b\xf6\x3d\xe9\x24\xb9\x48\xa2\x32\x5e\x03\x2e\x92\x2c\x2f\xa3\xb4\x2d\x6a\x43\x0d\xbc\xfc\x11\x69\x6a\x00\x7f\x2e\x42\x0e\xce\x11\x92\xeb\x35\x4a\x54\x69\x74\xab\xf1\xca\xaa\xe3\x81\xc1\xc5\x58\x38\x59\x6a\xb2\x6e\x5c\x12\x31\x46\x22\x95\x06\xa1\x12\x05\x15\x6d\x91\x46\x79\x9c\xd9\x46\x6b\x04\x82\x5b\x4e\xe5\x15\x90\xca\x72\x74\x84\xd6\x04\xfa\xf7\x7a\x0c\xd6\xad\xff\xd3\x5e\xf0\x26\xaf\xa4\x54\x5c\x51\xba\xf5\x19\xf8\x58\xcf\x82\xbf\xb8\x9a\xfd\xab\x0d\xc3\xbb\xfc\xcf\x5e\x1d\x3c\xcb\xfc\xe4\x10\xef\xac\xc3\x71\x2d\xf6\x78\x87\x39\xc8\x0d\xbe\xc8\xab\x14\x46\x3d\x42\x43\x06\x76\x29\xb0\xdf\x3a\xbb\xda\x8f\x5c\xc5\xfe\xce\xa3\xa4\xb3\x7f\xee\x6d\x80\x96\x68\x0e\x42\x0b\x3e\xe0\x81\x01\xc8\xcd\xd3\xb5\x0d\x2b\x90\x15\x97\xf6\x18\xa7\x99\x65\x9f\x6a\xe9\x2c\xb3\x1f\x69\x6d\x20\x80\x0e\xa3\x26\x0b\x5e\xdc\x5a\x70\xb2\xc9\x0e\xa1\x43\x32\x41\x24\xf5\x0f\x06\x8d\x17\xcc\xa8\x6a\x95\x54\x20\xe8\x00\xe5\xf5\x52\x1f\xb9\x0c\xd7\xe3\xb4\x93\xad\xc3\xeb\xc0\x5d\x7c\x09\x49\xac\xae\xe0\xd1\xbe\xc5\x3d\x2c\x57\xdc\x1c\x97\xee\xe6\xf8\x74\xcb\x72\x73\x7c\xb8\xb5\x53\x98\xc4\x37\x3d\xca\xbe\x73\x4a\x13\xad\xd9\xd1\xb3\xb0\xb7\x02\x6f\xd8\x28\x7a\xd6\x31\xd0\x0d\xec\x4d\xda\xba\xa9\x21\x6b\x91\x82\x30\x74\x0e\x15\x87\x8d\x8d\xd6\x2a\x8e\xb2\x8d\x87\xfc\x5b\x00\x9c\xf1\x88\xb7\xb8\xb9\x93\xe5\xa8\x3f\x6e\x82\x9f\x7b\xbd\x42\xfb\x55\xcc\x47\xd5\x71\x91\x7f\xbb\xcf\x81\x8b\x8b\x35\x98\x98\x6b\x47\xc3\x69\xf9\x17\x78\x7d\xff\xe7\xbe\xe0\x69\xfa\x97\xab\xf5\xc1\x65\xad\x77\x36\x3a\x79\xff\xcb\x15\x27\xef\x8e\xb7\xa0\x65\xe5\xe4\x7d\x76\x10\xc4\x83\x44\x57\xaa\xab\x68\x18\x6c\x7d\x71\x94\x5d\xcb\x0e\x0d\x3d\x3d\x6b\xa3\x7d\x65\xab\xdb\xc1\x56\xf7\x59\xdb\xa3\xfb\xdf\x76\xe8\xd1\xfd\xa1\xc7\x89\x6e\xc1\xec\x36\xdf\xbf\xf9\x6e\x73\x8b\x7f\x93\xde\x6d\x68\x26\xd5\xdc\xb9\x7a\xd7\xa8\xef\x3a\xef\xda\xcd\xb8\x35\x0f\x97\xa2\xb2\xbd\x2a\x3b\xe0\x19\xd9\x92\x26\x69\xf2\x5f\xb4\x3b\x70\x2e\x58\xf6\x61\x87\x64\x14\x8f\x81\xfb\xb3\xa5\x50\x5b\x09\x48\x76\x74\x36\xa2\x9f\xdf\xc5\xee\x20\x6d\xe4\xa6\xe0\xda\x45\xca\x41\x7d\x7f\xb6\x64\x9c\x53\xa3\x7c\x32\xeb\xf6\x12\x81\x99\x1d\x4f\xa2\x1f\xcc\x1e\xe4\x1e\xbb\x3a\x89\x8a\x72\x2e\xcf\x96\xc4\x62\xdc\x15\xfe\x73\x2e\x3d\xb7\xca\xbf\x3d\x15\x15\x25\x3a\xa2\x28\x28\x4f\x79\xc8\xa2\x82\xb7\x57\x05\xe4\xef\x60\x2f\xf7\x98\x2f\xab\x5c\xcc\xa3\xb4\x80\xfb\x50\xef\xda\xa5\xd7\x7b\xeb\xb0\x7a\x4b\xac\x02\x97\x64\x96\xea\x08\x6b\x13\x6c\x1b\xb2\xef\x65\x7b\xbb\xa2\x28\xa2\x15\xe1\x9f\x0e\xbe\xe7\x2e\x57\x3b\xa6\x3b\x76\xa6\x2a\x52\xb1\x78\xb4\x24\xc5\x67\x30\xa6\x95\xfa\x4b\x9c\xae\x7d\x06\xdb\x83\xae\x3f\xff\x7b\x82\xeb\x0e\x2d\xe5\xb1\x58\x3e\xac\x9c\x81\x46\xe3\xa6\xb6\x82\xeb\x64\x78\x59\xa7\xb4\xf2\x70\x22\xb8\x61\xc1\x11\xf1\xad\xb1\xce\x10\x8c\xb8\x08\xc0\xdb\x93\x51\x52\x88\x51\x7e\x36\x3d\x9f\x66\xeb\x6e\x69\x9f\xf0\x1c\x6f\x83\x61\x54\x5a\x3b\x1a\x9e\xcc\xf2\xef\xcb\x52\xe1\xbf\xd5\x0b\x4e\xd1\xdf\x06\x10\x66\x9b\xa8\xb1\x03\xd0\xb0\xf4\x20\x78\x8e\xcc\x61\x55\x54\x5d\xda\x37\xd5\x26\x18\x36\x19\xa9\x6f\x63\xc7\xc9\x44\x71\x2c\x78\x1a\x25\x76\x73\x9c\x0d\x76\x84\xb1\xac\xc3\xf9\x8a\x2f\x3e\x85\x5d\x3b\xcc\x54\x18\xce\xe2\x2f\x84\x73\x02\x90\xe0\x1d\x4f\x09\xee\x18\xb8\x6a\x3e\x6d\x08\x93\x89\xf3\xc6\x45\xef\x40\x2f\xeb\x2c\x34\xd1\x99\xfc\x8f\x7f\xc1\x3e\xbf\x8b\xed\x11\x18\x93\xff\x4b\xbb\x82\xbf\x19\x51\x84\x43\x78\x8d\x52\xc2\xa1\xc8\x56\x33\x38\x69\xa7\x1c\xfa\xf1\xce\x54\x25\xa5\x6a\x55\x21\xf9\x26\x7f\x53\x0c\x9d\x91\x0b\x4a\x18\xe8\xb4\x2f\x96\x63\x00\x45\xa9\x83\x4c\xea\xe9\x87\x80\x0d\x9e\xe2\x98\x31\x0a\x01\x2d\x2d\xeb\x71\x21\x14\xd7\x1a\x78\x90\xb1\xb6\xc3\xa3\xfc\xcc\x3c\xd5\xa3\x5b\xa0\x28\x6a\x35\x35\xb3\x9c\x16\xd6\x87\xa9\x94\xa9\x90\x98\x9a\x48\x66\xed\x9e\x33\x89\xa5\x95\x3b\x52\xd3\x6f\xa8\xa2\x4b\x95\x8b\x66\x20\x7f\x1d\x12\xe7\x9a\xcc\x93\x6e\xc9\x60\xe0\xa1\x9a\xeb\x1d\x77\x48\x45\xba\xcb\x9e\xc9\x12\x91\x80\xeb\x10\x0d\x1c\x46\x40\x06\xbf\x5c\x5c\x52\xdf\xa1\x41\x23\x2e\x32\xad\xf6\x92\xc0\x7d\x78\x38\x3c\x17\xf3\x76\xdd\x6c\xcb\x29\x27\xd8\xf7\xb0\xdb\xb7\x66\xd7\x76\x27\xeb\xb4\x76\x4a\xb0\x3f\xd8\x65\x68\x1e\x7e\x63\x57\xf0\xf0\x2e\x35\xa5\x14\xe5\xc2\xd6\xe7\xd4\xe2\xe0\x54\x82\xbc\x9d\x90\x74\xe8\xf1\x99\x53\x86\xa6\x80\x8a\x95\x7b\x60\xd6\x8e\x12\x70\xeb\x6d\x79\x16\xda\x7d\xf1\x38\x4e\xc3\x4e\x26\xac\xe4\xe0\x60\x05\x7b\x74\x66\xa1\x3d\xc9\x26\xd9\x04\xbb\xe3\x52\x26\x99\xe5\xfa\x62\xbf\x39\xc2\xec\x6d\xcd\xff\xec\xc8\x65\x80\x29\xbc\x78\x64\x41\x18\x32\x6f\xf4\x7c\x67\x76\x32\xb5\xa6\x71\xa1\x39\x4c\x3e\x5c\x8d\x30\x73\x67\xbb\x6b\xaf\x87\x50\x18\x59\xfa\x00\xb0\x81\x72\xa4\x9c\xae\x92\x32\xee\x25\xc2\x64\x8f\x52\xd3\xba\x1d\xa5\xf4\x96\x15\xf5\x85\x6e\x70\x5c\x33\x33\x3a\xd3\x6d\x41\x81\x2c\x6e\x4b\xe4\x21\x0e\xde\x13\x34\x51\x53\xee\xd0\xa8\x23\x8f\xe3\x35\x91\xf4\xeb\xfb\xc5\xec\x99\x45\xe3\xb1\x90\x73\x62\x39\xc3\x95\x52\x68\xd9\xd8\x85\x76\x14\xa2\x1b\xa5\x65\xdc\x2e\x42\x3e\x91\xd2\xfc\x6b\x9a\xb3\x11\x24\x03\xea\x98\xec\xc5\x26\x9f\x09\xfb\xd9\x3d\x72\x74\x65\x27\x4b\x01\xb1\xf0\xdf\xb2\x27\x78\xfe\x1e\xb5\x8f\xc0\x9a\x41\xf3\xb1\x9e\x87\xee\xc0\x80\x09\x5f\xa0\x9e\x72\x0f\x44\x4b\xa9\x98\x3f\xf9\xd1\xf7\x05\x34\x91\x82\x67\x8f\xf2\xfb\x82\x69\xfd\x77\x96\x5b\xf7\x46\xb9\xbe\xd3\xb0\xac\x1c\x34\x8d\xc9\x2b\xaa\x22\x7d\x96\xa2\x02\x52\x70\x92\x9f\x15\x73\x3b\x80\x50\xa0\xb9\x4f\x72\x3e\x6d\x0d\xcb\xad\x66\x84\x11\xce\x88\x68\x3a\xa9\x5d\xd3\x63\x05\x79\x2b\x81\x6a\xb2\x90\xb2\x0a\x4e\x25\x00\xbe\xd0\x43\xa8\x3a\x63\xc7\x52\x69\x87\x54\x60\x57\x96\x43\xa3\xc1\x20\x63\x95\xae\xda\x43\xc5\x1f\x1e\x52\x3e\x3d\x16\xea\x08\xc6\x08\x01\x6d\xeb\x79\x0c\xa9\x07\xe9\x58\x05\xdb\x2a\xed\xad\xa3\xf0\x20\x00\x6f\x14\x1a\x29\xe9\x53\xa7\xa9\x67\x60\x74\xf9\x7d\xba\xab\xf9\xb3\x43\x7e\x2a\x3e\x2f\xe4\x8e\x0c\xb1\x5d\x0d\x75\xa9\xad\x1b\x69\xae\x2c\x46\x95\xa8\x94\xe7\x80\x30\x9c\x42\x78\x64\x58\xed\x50\x95\x47\x4e\xf5\x16\x8a\x34\x4e\xdb\x49\xd5\x11\xa6\x3d\x87\x8a\x58\x0e\x1c\x44\x7e\xe9\x9a\xd7\x75\xa6\x57\xf5\x7c\xc3\x30\xa5\x1d\x7a\xce\x1c\x31\x6a\x76\x94\x19\xbf\x5f\x36\xe7\x3e\xae\x67\x1b\x7f\xf6\xf6\x0e\xea\x1a\x39\xea\x8b\x02\xf6\x7d\x97\xd3\x9d\x6c\xf1\x18\x4b\x29\xf4\xa7\xbf\x2b\x98\xdb\xe8\x81\x1a\xeb\x0a\x65\x0b\x94\xe3\x56\x50\xdc\x8c\xed\xa3\x8d\x7a\x3d\x11\xe5\x17\xbd\xdd\xa0\xb4\x5e\xf4\x76\xc3\xc2\xbf\xe8\xed\x86\x14\xae\x2e\xab\x3f\x67\x5f\xd8\xcd\xbe\x0d\xc4\xeb\x7c\x4d\x90\x5a\x40\x34\xfa\xbf\xb0\x3b\xf8\x99\xdd\x8d\xb7\x1c\xda\xe5\x48\x59\xc6\x54\x0e\x28\x82\xb9\x52\xee\x6a\xe3\x29\x22\x68\xa3\xf2\x89\x91\x39\xc7\xb8\xdc\x54\x55\x94\x62\x89\x38\x81\x09\x5d\x41\x5c\xba\x21\x37\x16\xb6\x51\x50\xbf\x47\x0d\x10\x5c\xce\x09\x68\xa5\xce\x46\x05\x0e\x42\xeb\x01\xb9\xf6\x30\x3d\x95\xae\x0c\x96\xdc\x32\xaa\x45\xca\x7c\xa6\x32\xda\x28\x02\x08\x80\x9a\x5a\x8c\xc6\x2e\xbc\xaf\xcc\x2b\x81\x34\xf8\x72\xa8\xe1\xe1\xa5\xa8\x7d\x7e\x3d\xca\x3b\x05\xba\x32\xcb\x78\x29\x4e\x28\xea\x4b\x85\xbe\x1e\xb7\x72\xa8\x9a\x64\xce\x80\x4b\x4d\x0a\x2a\x2f\xe4\x73\xd8\x4c\xad\x7b\x54\xa9\xf3\x81\x14\xc8\x39\xd0\xc7\x56\xd2\x69\xea\xe6\xaa\x50\xa2\xda\x39\x17\xf4\x46\xfd\x30\x46\x25\x8f\x61\xc9\xc7\xe1\xab\xce\x71\x3d\x93\x5d\x17\x65\x03\x73\x5a\x19\x15\xe7\x8b\xf1\xa8\xdd\x96\xdb\x94\x55\x41\xd4\x8b\xc7\x11\x48\x30\xa6\x8d\x7e\xf5\x0b\x63\xb6\x5c\x71\x4d\x2f\xaf\xd2\x38\x5d\x01\x2b\x4c\xa5\x5b\x28\xaf\xb8\x6d\xac\x39\x37\x2d\x78\xf1\x7f\xf5\x18\x4e\x76\xff\x5d\x5e\xf0\xe3\x1e\xa6\x2e\x36\x73\xd6\xc4\xe2\x9a\x21\xae\x63\x1d\x20\x34\x0d\x44\xd9\x31\xd8\xda\xd5\xd9\x39\x06\x85\x75\x42\x3e\x41\x02\xb3\xca\xd4\x94\x0b\x7e\x8e\xf8\x4a\xce\xc1\x4c\x3c\x37\xab\xde\xe9\x9c\xd3\x13\x46\x96\xeb\xdc\x70\x34\xf0\x16\xbb\xaa\xa8\x96\x74\x37\xf9\xef\x6b\xb1\xe5\xcb\xc3\xc0\xdc\xb4\x09\x2d\x58\x55\x05\x9f\xf2\xec\x9a\xf5\x4e\x4e\x71\xe5\xd6\x9d\x8d\x3a\x6d\x35\xc2\x13\x8c\xd4\xf5\x51\xfb\x50\x57\xa9\xc7\x64\xe1\x76\x79\x83\x6b\x6b\x31\xeb\xd1\xbe\x0c\xfc\x6b\x22\x57\xf6\x38\xf7\x45\xc8\xb9\x57\x11\x27\xb4\xb8\x20\x47\x2b\x5e\x13\x21\x7b\x17\x26\xfb\xa1\x77\xfc\x1f\xbb\x6c\x2c\xd6\xcd\xb8\x20\x55\x51\x70\x9d\xa9\x54\xdb\xfa\xad\x4b\x85\x28\xe5\x5e\x66\x98\xf6\x26\xe7\xa7\x42\xf6\x55\x8f\xe1\x36\xed\xff\xa6\x17\x7c\xce\xc3\xd8\x79\x52\x7e\xe4\x26\x89\x17\xb4\x03\xbb\xb1\xdb\x51\x30\xae\x5d\x54\xc0\x5e\xd8\x4f\x21\x53\x20\x3f\x37\x2e\x3f\x6b\xfc\x36\x28\xf3\xf6\xf1\x30\x0c\xcf\x85\xc0\x5a\x60\x01\x77\x6d\xdb\xca\xb0\x13\x89\x1f\xa2\x5d\x66\x39\xcb\xbb\xfc\xdc\x6d\xb0\x36\xc2\x5e\x52\xe5\x51\x72\x7b\x48\xc5\x9f\x3b\xec\x4c\xed\x0f\x7a\x0c\x8f\x21\xff\xbd\x1e\x8b\x1f\xbd\xf1\xa8\x53\x8b\x9f\x40\xba\x6f\x35\x9d\x1d\xfc\x0d\x1c\x17\x71\xda\x21\x4a\x70\x6d\x7d\xab\xf5\x2e\x7b\xcb\x3e\xb6\x4f\xcd\x4e\xff\xd5\xfb\x82\xd7\xec\x35\x44\xf3\x6e\x10\x9a\x9c\xc7\x72\xd4\x6c\xe6\xfb\x0d\x07\xee\x8c\x12\xfc\xe3\x65\x7e\x8e\xde\x3a\xe7\x70\xf4\xe1\xe0\xda\xc3\x82\x90\xbc\xb8\x14\x5d\xb5\xdb\x9f\x33\xf4\xef\x68\x47\x77\xc7\xd4\x14\x4c\xb2\x8f\x5d\x17\xec\x54\xe6\x7d\x39\x69\x96\xb2\x72\xd5\x6e\x80\x72\x60\xa5\x9a\x9d\x5d\x33\x7b\x64\xdd\x5e\x45\xd4\x1e\xc8\x63\x1a\xa7\x74\xfc\xd3\xcc\x33\xf4\xfd\x39\x76\x13\x9e\x51\xb2\x93\x2c\xca\xf6\x19\x87\x05\x5f\xf9\x61\xe2\x82\x07\xf2\x20\x19\x4b\xe2\xf3\x22\x30\x4a\x40\x91\xe5\x25\x8f\x96\xb2\x35\x29\x60\xa4\xf6\x33\xb5\x12\x8a\x51\x4b\x16\x81\xf6\x89\x0e\x4f\xc4\x85\xb8\x9d\xad\xe4\x51\x6f\x55\x65\x53\x0c\xee\x1e\x28\xa1\x20\xaa\x0f\x0a\xe3\x08\xd6\x02\x95\x79\x15\xe2\x97\x68\xef\x07\xe2\x3e\x02\xc0\x1c\x02\xf8\x45\x74\x7f\xa6\x93\x04\x1c\xa6\x57\x94\x76\x97\xf4\x15\x8b\x87\xfc\xba\x20\x4a\x7a\xab\x51\x00\x70\x5a\x39\x93\x03\xd4\x2d\x88\xee\xd1\x29\x34\x4e\xad\x42\x61\x42\x14\x68\x96\x91\x3d\x21\xc5\x13\x98\x11\x4b\x7d\x7e\xe7\x04\xbf\x1d\xe4\x5a\x7e\x3b\x87\xe2\x41\x3d\xc9\x85\xbc\x01\x1e\x2e\xd5\x3f\x08\x85\xcf\x38\xd0\xa6\x5e\x20\xf1\x1b\x45\x62\x88\xe4\x92\xef\xda\x69\x0b\x96\xfa\x84\xc9\x92\x2d\x77\x3e\x92\xbe\xd1\x69\x23\x2a\xa6\x88\x7e\x55\x6d\x54\x4b\x44\xf5\xef\x71\xbe\x76\xf4\xc8\x28\x5f\x3b\x36\xca\xd7\x8e\xca\xff\xc3\x72\x86\x5f\x47\xe4\x5f\xd7\x8d\xf2\xb5\xeb\x60\x85\xcb\x4b\xc7\xa0\x45\xf8\x1c\xfc\x79\x6c\x94\x2f\x67\xd9\x51\xfc\xef\x11\xc7\x17\x98\xb1\x2e\x3b\xff\x58\xec\x30\xb4\x2e\xd8\x27\x77\xb1\x6f\x47\xfd\x5e\x8e\xf2\x5c\x0e\xee\x56\x02\xa0\xf9\x3f\xb3\x2b\x78\xd7\xc8\xb0\xbb\x36\x44\x54\x3f\x42\x98\xb0\x82\xe7\xa2\xac\xf2\x14\x17\xcc\x22\x26\xa5\xab\xca\x5e\x55\x6e\x2a\x8a\x69\x92\xc9\x71\x90\xfa\x40\x04\x23\x2f\x18\x92\xdb\x5e\x83\xd1\xf9\xf2\x9e\x3e\x2f\xc6\xa2\x62\x0c\xf2\x63\xb8\x72\xd5\x16\x8e\x73\xd5\xde\xed\x9c\xe4\xea\x9d\x21\x87\x38\xe6\xcc\xe6\xa5\x7e\x3f\xcb\x87\xbe\x6e\x99\x09\x34\x77\x0f\xe1\x08\x3b\x71\xd1\x4b\x22\x9d\x59\x36\x5a\xd1\x9b\x68\x83\xb8\x47\x51\x6a\x66\x22\xa5\x2c\x61\xf7\x3f\x9a\xa2\x83\x8b\x17\x66\xbf\xda\x62\xcc\x08\xee\xfe\xc7\x5a\x8f\xa6\xe0\x72\x8f\xae\x28\xf8\x75\xcf\x52\x17\xdc\xe0\x14\xad\x3c\x90\x12\x64\x3d\x08\x23\x8a\x92\xfa\x90\x4e\x6d\x98\x3b\x83\x7a\x49\x6c\x78\xa2\xe8\xa6\xd8\xba\x38\x48\xea\xda\x30\x49\xf0\xf3\x2d\xa6\x8e\x6a\xff\x13\xad\xe0\xfd\x2d\xf5\xa2\x25\x60\x39\x19\x65\x2f\xb7\x88\x75\x1b\x95\xbe\x05\x61\x6b\xf3\x53\x7d\xbb\xc7\x76\x93\x6c\x51\xd4\x85\x0b\x5b\x1f\xad\x0a\xa7\xd2\x38\x2d\x4a\x11\xb9\x8e\xe1\xff\xb5\x8f\xdd\x60\xc3\x12\xab\x32\x2b\xda\x11\x05\xcf\x87\x77\x65\x79\xfc\x60\x96\x96\x51\x32\x97\x75\x26\xe8\x9e\xc8\x01\x5d\xf3\x63\xfb\x82\x6b\x75\x10\x85\x7e\x0e\xfc\x06\x91\x7e\x72\x63\x88\xcd\x9f\x5c\xc9\x25\xb7\x63\x88\xcd\x8b\x74\xf6\x93\x1f\xd8\xce\x78\x6c\xdd\xbd\xb0\xb5\x29\x71\x05\x82\xb3\x03\x08\xce\x92\x85\xc0\xb9\x67\x67\x00\x9c\x7f\x39\x04\x80\xf3\x88\x97\x6c\x0e\x8c\x99\xf1\xef\x34\x30\x3c\x33\xec\x1a\x16\xb3\xc1\x76\x50\x07\xca\xfc\xc9\x1e\x76\xdb\xb0\x49\x74\x0c\x04\xc3\x70\x52\xc5\xbf\xab\x13\xec\xb4\x28\xf3\xb8\xbd\x80\x1c\xec\x3f\xb3\x27\xf8\xe2\xc8\x86\x8f\x58\xf6\x1f\x62\xae\x86\xe6\xd4\xb2\x74\x77\xe1\x0d\xb2\x22\x96\x99\x45\xbb\x3e\x0a\xa1\xf1\xb6\xa1\x4d\xcf\x15\xb9\xd8\xd1\xe1\x3c\xaa\xce\x4f\x39\x63\xc1\x0b\x04\xae\xd4\x94\x8e\x47\x42\xf3\x40\xbd\x65\x94\xaf\x88\x92\x1f\x12\xe1\x4a\xc8\x27\xe7\xce\x42\x24\xa6\xe8\x66\x79\xff\x70\xc8\x0d\x31\x9d\x89\xc5\x8d\xd6\x44\x0e\x54\xd8\x65\xb6\x22\x88\x88\x01\xe2\xb4\x30\x1f\x96\x1d\x33\x01\xee\x51\x28\x3f\xe4\x7c\x41\x0a\xf7\xf8\x5d\x78\x62\x2d\x55\x71\x82\x79\xc1\x6a\xdf\x97\x76\x90\xa4\x09\xbe\x32\x4a\x38\x0d\x81\x76\xee\x40\x2a\x34\xb2\x46\x64\x52\x05\xd1\xac\x01\x65\xc6\xd3\x2c\xef\xca\x0d\x44\xe4\x63\xf2\x9b\x55\x85\xc6\xee\x18\xf4\xb2\x4e\x11\x70\x75\xa0\x1a\x6e\xba\x00\x9b\x1a\x60\x94\x84\x9d\x50\xa0\x34\x71\x51\x7b\xf0\xa1\x8b\xde\x7e\x4d\x84\xe0\x1c\x0e\xff\xa1\xc5\x96\x98\xb9\xe7\x9f\x0d\xee\x32\x8c\x09\xf1\x20\x70\xc4\xba\x99\x1a\x6f\xa4\x0a\x62\xa5\x0f\xc7\x3a\x37\x89\x9e\xa9\x97\x6c\xd3\xf3\xc3\x04\xa9\xc3\x76\x9e\xc7\xe8\x63\xfc\x62\x03\x5e\x9a\xa6\x35\x80\xf3\x79\x11\xbb\xeb\x46\x9a\x41\x85\x43\x7a\x4f\x17\xed\xd8\x2c\x15\xcc\x82\x43\xc2\x7e\x63\x3f\xbb\xc5\x8e\x6d\x15\x79\x89\xf0\x16\x61\xc9\x8a\xe6\xe2\x42\xbc\x22\x65\xbc\x79\x9c\xec\xfe\x9b\xf7\x07\x07\xa7\x2c\x22\x65\xeb\x75\x5e\xe0\xa3\x6a\x61\x38\xe3\xf3\x47\x57\xf0\xb1\x57\x20\xfa\x8f\xe3\xa1\x79\xb7\x75\x68\xde\xb1\x43\x80\x3e\x7b\x83\x0a\x57\x7a\x85\xc7\xee\x1e\x1e\x35\xbe\xad\x95\x05\xa1\x4c\xb7\x83\x9a\x61\x2d\x29\xea\x5a\x1e\x97\x85\x48\x96\xc9\x44\xd4\xb7\xad\x05\x16\xfa\x2e\x64\x2f\xf0\x34\x24\x70\x9d\x9d\xbe\x5c\x2d\xc3\x50\xa3\xef\x9e\x12\x79\xbc\x56\x0b\x49\x47\xbc\x5f\xb9\xaa\x5b\x1a\x3e\xe2\xad\x6f\x2e\x3a\x2c\xfa\xf3\x5a\x74\x70\x1a\x53\x27\x80\x1f\xd6\xa6\x46\xc2\xa4\x7f\xde\xcf\xbe\xa3\x21\x6a\x9f\xf2\x67\xf8\xbf\xb3\x3f\xf8\x49\x4f\xa5\xd8\x28\x81\xe6\x20\x35\x19\x87\x34\xfa\xf3\x56\x84\x70\xa0\xf9\x6a\x54\xa1\xa1\x0a\xbe\x94\x55\x29\xe1\xa3\x80\x61\x00\x8c\x7f\xc4\xf1\x24\xf2\x7a\xea\xed\xa3\xe1\x4d\xa3\xbc\x97\x88\xa8\x10\xc8\x4a\xb1\x2a\xf8\x12\xa5\x67\xb6\xfd\x18\x3a\xe5\xbe\x52\xb7\xf4\x51\xe7\x6c\x9f\x5f\xb8\xb2\x7d\x5e\xd9\x3e\xaf\x10\xc1\x5e\x5e\x22\x58\x5b\x10\xdb\x9c\xd0\xa5\x9e\xb7\xe9\x8e\x45\x23\x6e\xd9\x69\xcb\x6c\x48\x8d\x5c\xf1\x1a\x7b\xe9\x7e\x71\xf8\x88\x77\x66\xf3\x8d\x72\xd4\xbf\xb6\x89\x01\x5e\xa5\x67\xaf\xa9\x51\x6f\xdf\xcb\x0e\x36\xb4\x7c\xba\xdb\x2b\xfb\x53\x71\x7e\x4f\x96\x54\x5d\x41\x1a\xd3\xdf\xef\x09\xaa\x79\x8b\xec\x4d\x41\xc9\x30\xc9\x4e\x96\xf7\x89\x60\x0b\x60\x8f\xd3\xb5\x5b\x6b\x50\x52\x01\x8c\xe3\x90\x65\x69\x3d\x15\x79\xb1\x1a\xf7\x28\x98\x0c\x88\x79\xe4\x3e\xb0\x30\x7d\x2a\x4e\xab\x0b\x80\x18\x5b\x12\xc9\x40\x1a\xa3\xbf\xda\xcd\x5e\xd4\x62\x7b\xba\xa2\x13\x57\x5d\xff\x11\x2f\xf8\x73\xef\x5e\xc0\x9c\x51\xdc\x02\xc1\x3e\x38\x3e\xa0\x95\x83\xa8\x7d\x9e\x68\x88\x54\x93\x14\x8f\x97\xf6\xb2\x07\x01\x39\x7f\xba\x22\x4a\x0b\x4d\x0e\x44\x2c\x34\x07\x0b\xfd\x2c\x16\x4d\xc6\xb9\x25\x61\x7a\x82\xf6\x85\x43\x0a\x63\x29\x35\xb4\xd3\xa0\xa1\x6d\x3b\x9b\x1c\x7d\xc6\x38\xf5\xdb\x35\x50\x41\x27\xce\xed\x25\xf6\xd5\x11\xb6\xbf\x88\x1f\x14\x48\x68\xf5\x1b\x23\xdb\xd0\xec\x43\x6d\xa7\x7c\x66\x15\xa5\x65\x5c\xf6\x83\x37\x8e\x2c\x66\x65\x94\xf0\xa8\x8b\x9c\x29\xcb\x84\xa2\x55\x1d\x9a\xdb\xd4\xf5\xd0\x95\x6a\x96\xd0\xe0\x62\x87\xca\x06\xa1\x6e\x8b\x88\xaf\x22\x43\x9c\x65\x1b\xd4\xbe\x65\xad\xb3\xea\x5e\xb4\x19\xdb\x2a\x08\x93\xc8\x52\xf7\x19\x53\xd1\xba\xd2\xf4\xc8\xcb\x05\x2f\xe1\x36\xac\x78\xb6\xe4\x9d\x05\xd5\x29\x96\xfa\x8d\xc8\x64\x74\x4f\xf1\xa2\xea\x02\x5f\x0c\xd6\x42\xd0\x6f\x72\xc7\x6a\x3d\x0f\x70\x90\x34\x9d\x6b\x53\x25\x8d\x13\x77\xae\x28\xd4\xa3\xfe\xf0\x2a\x25\xc3\xf0\xc0\xc8\x37\x0f\x7c\x55\x88\x7c\x0c\x88\x72\x07\x86\x9c\x7d\x62\x37\x3b\xd2\xc4\x17\x45\x29\xd0\xd3\x12\x97\xe9\x64\x12\xc5\x5d\x9d\xcb\xe6\x95\xbb\x83\x62\xc3\x27\x6c\x43\xba\x22\xe9\x68\x7c\xc1\x64\x2a\x2f\x80\x5f\x86\x84\x80\xe9\xde\xaa\xe8\x8a\x3c\x4a\xec\x4d\x42\xaa\xdf\xb2\xcf\x9d\x25\xfb\xd0\x2e\xf6\xc7\xf6\x69\xf0\x9b\x3b\x3e\x0d\xde\xec\x9d\x8e\x0c\x68\x12\xc9\xc2\x48\xd4\x55\x64\x25\x75\x8a\xac\xac\x87\x46\x18\xda\x5b\xe7\xee\x99\x44\xd0\x98\x4e\xe5\x13\x97\x21\x9f\x25\xf6\x08\x85\x96\x42\xf8\x17\xba\x6e\x01\x3f\xa8\x01\x58\xf7\x23\x4a\x98\x98\xf3\x8c\x97\x22\x64\xaf\x6f\x91\xa8\xff\xf2\xd6\x16\xb2\xfc\x35\xf6\x38\x48\xf6\x9f\x03\x5a\x3a\x37\x96\x44\xa9\xe7\x8d\x6f\xe1\x2c\x95\xc7\x16\x25\x44\x23\xf6\x3e\xfa\xf4\x2a\xc5\x34\x68\xb5\x4e\x80\x5e\x5a\x11\x65\xd1\x90\x24\xc6\x24\x88\x59\x54\xc8\x66\xd5\x31\xb4\x38\x9a\x27\x0c\x76\x5b\x41\x0e\x1a\x58\x7a\x21\xfb\xbb\x7d\x8d\xb3\xd8\xa5\x6a\x5a\xcc\xce\x8b\x74\x2e\xcf\xee\x47\xd0\xa6\xff\xf1\x7d\xc1\x9f\x7b\x1b\x3e\xe2\xf2\x8f\xf6\xf0\xba\x49\xda\xc7\x89\xf6\x8a\x97\xf2\x35\x6b\xa7\x02\xfe\x69\x5d\x08\xc1\xe2\xd4\x7a\x88\xd3\x42\x0a\xb2\xd1\x90\x52\x74\x07\x22\x71\x79\x95\x42\xd0\xd8\x72\x9c\x08\xa4\x35\x80\x71\x92\x87\x87\x22\xc7\x99\x98\x9b\x29\xf8\x21\x2b\x23\xe3\xc4\xdc\x0c\x49\x80\xf2\x8c\xd0\x80\xd4\xc3\x72\xfd\xf4\xea\x24\x3e\x1f\xde\xc3\x5e\xdb\x62\xfb\xa2\xaa\x13\x4b\x39\xc2\x7f\x51\x2b\xf8\x07\x6f\x82\x7e\x29\x83\x92\xce\xb7\xa9\x1e\x53\xd6\x25\x68\x72\xc8\x27\xa4\x58\x1e\xf7\x40\x8e\x84\x90\x24\xfc\x14\x40\x7e\x28\xea\x19\xa5\x34\x22\x86\x21\xb5\x99\x6b\x06\x00\x83\x8d\xd5\xa0\x28\x6f\xf0\xb5\x74\xfa\x92\x5c\x6f\xb5\x66\xd1\x2e\xa1\x63\x43\x23\xe5\xa7\x98\x6a\xa9\x70\xe3\xb2\x74\xc4\xf3\x11\xf6\x64\x71\xa1\x17\x63\x4e\x6a\xc5\x06\xfa\x53\xc8\x06\x7a\xe3\xf5\xc1\x2b\x46\xa6\xeb\x77\x0d\xa5\x0e\x48\xd0\xb8\x82\xb5\x6a\x03\xd3\x35\x2e\xfb\x86\x9a\xae\x61\xf4\x43\x3e\x51\x98\x4f\x91\x87\x5b\x9e\x45\x80\x9f\x37\x6d\x41\x98\xbf\xdc\xe6\x13\x51\xd2\xa4\xe3\xbd\xa4\x5a\x89\x89\xc0\x13\xde\x41\x78\x3f\xcf\xb3\x52\x67\xbb\x69\xae\x70\xd1\x2a\x0c\x01\x2d\x00\x35\x29\xf3\x3e\x61\x5d\xad\x22\x68\x86\x2e\xdb\x3f\x0a\x9e\x25\x1d\xc5\x44\x73\xf3\x11\xde\x13\x79\x9b\xe6\x81\x3c\xf8\x30\xe4\x31\xe3\x49\xbc\x06\xf1\x9d\x1b\xbc\x7c\xec\x7a\xbe\x9a\x55\x79\x11\x3a\x6c\x95\x70\x0d\xb5\x38\x25\x12\xa9\xd0\x9a\xa3\x47\xe4\x39\x5d\xc9\xa3\xce\x21\xc0\x59\x65\x30\xcf\xfd\x73\xc1\x82\xa2\xa2\x82\x05\x25\xff\xd6\x7c\x3f\x34\x1f\x50\x20\x41\x6d\x48\x3b\x3f\x13\xc5\x2e\xe5\x4e\x2d\x58\x9b\xce\x2c\xf9\x8d\x11\x76\xdd\x26\x56\xd2\xe9\x0b\xa8\x8f\x92\xf5\x1f\xcd\x21\x6f\x1d\x09\xd2\xa6\x1b\x0e\x94\xd9\xd8\xe8\x75\x0a\x84\x48\x25\x24\x21\xcf\x00\x04\xf3\x14\x45\xd6\x8e\x61\x77\xa5\xb5\xd5\xb7\xf3\xb3\x66\x8a\x8c\x6f\x0f\xbe\x73\xd1\xdb\x4b\xc5\x3a\xfb\xc0\x2b\x5a\xec\x61\x8f\xa9\x5b\x7e\x7f\x83\xc0\xb0\xe1\xb6\x60\xa0\xa8\x23\x03\xcd\x4d\xaa\xf1\x74\x92\x36\x7d\x51\xa3\x45\xf8\x21\x8f\x51\x53\xfd\xfe\xf0\xb3\x7c\x83\x56\xcc\xe8\x25\x1e\xdc\x4c\xfd\xa4\x57\xbd\x63\x96\xa6\x9b\x4b\x7d\xb4\x98\x63\x08\x14\xc6\xad\xb0\x5f\xdc\xc5\x36\xab\x6d\x2e\xeb\x14\x8e\xdb\xe7\x95\xbb\x82\xaf\x7a\xf5\xab\x1b\x7a\x7a\xa8\x05\xdb\x76\xd3\x38\x36\x21\x88\xc7\x8d\xe0\xac\x29\xc6\x88\x14\x58\x74\xc6\x7a\x22\x1f\x43\x76\xe2\xc3\xe1\x65\xf3\xe0\x50\xaa\x22\x6b\x36\x35\xd9\x87\x5e\xd4\xfa\x16\x19\xc5\xc7\xd9\xb9\xf1\xf6\x5b\xd8\xff\xaf\x41\x2c\x41\x71\xc6\x7f\xf8\x96\xe0\x3e\xfc\xd3\x95\x33\xe4\x67\x74\xd4\xc6\xae\xd4\x04\x87\x3b\x0c\x71\xed\x04\xf9\x4b\xfb\x8d\xee\xa3\xc6\x68\xe6\xd7\xdc\xcc\x5e\xe5\xb1\xbd\x0f\x54\xd9\x52\xbf\x14\xfe\x43\xde\x16\x52\x5f\x3f\x13\x1f\xb6\x25\xf1\xe0\x6e\xba\xe8\x36\x5c\x5d\x24\x25\x0f\x9b\xb2\x9a\x15\xa5\x4a\x52\x1f\xe5\x02\xd9\x8c\x21\x8e\x32\x5e\x16\xf2\x74\x60\x6f\xf5\xd8\xfe\xe8\xc1\x2a\x17\x27\xe3\x44\xf8\xaf\xf1\xd8\x8d\x9b\xb6\x69\x42\x3d\xee\xb4\xea\x5e\x7d\xd9\x69\x57\xca\xe1\x3a\x87\x1b\x24\xef\x35\xb4\x11\xb8\x26\x63\x79\xce\xd0\xf1\xa8\x7b\x92\xfd\x4f\x8f\xed\x69\xc7\x69\x47\xe4\xfe\x27\x37\xe2\x09\x56\xcd\x9b\x84\x67\x9d\xb6\xbd\xc2\xc3\x8b\x6e\x8f\x61\xa1\x6a\xac\xa3\xb2\x94\x87\x3d\xaa\x03\xd0\x0a\x0c\x2b\xa3\xe3\xb9\xc0\x76\x92\x16\xd3\xa8\xf5\xd3\x9e\xa0\x2c\xd7\xe3\xdd\x7e\xf1\x40\x32\x86\xb5\x8c\xf5\x3a\xe3\xf3\xd3\x13\x53\xa7\xa7\xc3\x6e\x87\xbd\xd4\x03\xff\xe4\x72\xbc\x72\x3a\xea\xf9\xcf\xdd\x42\x9f\x4f\xaa\xa7\x9d\xef\x9a\xd0\x97\x6b\x5f\xa6\x2f\xd3\xd8\x83\xb0\xd6\x23\xaa\x2e\xc2\x5f\x41\x41\xec\x97\x3c\x36\x92\x2e\x17\xfe\x47\xb6\x92\xa6\x72\xf6\xe4\x82\x53\xff\x4b\xbc\xd9\x93\x0b\xb5\xe1\x96\x57\xb6\x37\x07\x77\x6a\x41\x49\x97\x0b\xf6\xab\x1e\x7b\x4a\x6f\x35\x2b\xb3\xd4\x28\x2e\x53\x71\x71\xde\x7f\xbf\xc7\x26\x36\xd7\xd5\x1a\xde\x74\x3e\xb4\xd7\xf4\x84\xdb\xe7\xf8\xc4\xa4\xa1\x8c\xef\xe9\x87\x79\x47\x3e\xbd\xad\x09\xc6\x3e\xbc\x9f\xed\x17\x4a\x11\xf7\x7f\x76\xff\x16\xe6\x48\xa3\xde\x1e\xfc\xcd\x3e\x7d\xbd\x96\xd1\x01\xe7\x3d\x51\x39\xf3\xd5\x28\xed\x24\x0a\xc8\xac\x42\xb7\x95\x89\xa8\x93\xc7\x52\x46\xc7\x93\x0c\xde\xa3\xf1\x6b\xf7\xdb\x94\x94\xd0\xe6\xc7\xcc\x74\x86\x70\x74\x44\xc4\x25\x1f\xd3\x98\x6d\x2b\x6b\xa9\xc5\x2e\x0b\xa9\x0f\xa4\xf0\x4b\xe8\x83\x8e\xec\x13\x15\xff\xa5\x1e\x00\xb7\x45\x37\x5b\x13\x9d\x90\xb1\xb3\x05\xcd\xe4\x78\xf9\x38\x8f\x0e\xa3\xb7\x83\xf6\xed\x82\x43\x74\x64\x8a\x04\xfb\xeb\xab\x20\x54\x52\x21\x79\x95\x16\xa3\x7c\xe9\xb0\x4a\x87\x85\x5c\xc5\x08\x59\x50\xc6\x4c\xc8\x17\x99\x0b\xf9\xf9\x3a\xab\x60\x91\x46\xbd\x62\x35\x2b\xa5\x20\xdd\x8e\x7a\x51\x3b\x2e\xfb\x8c\x73\x29\x01\xb4\xcf\x03\xb7\x61\x2e\xa8\xc6\x51\xd6\x3e\x4c\x86\x5e\xbb\xff\x1c\xc0\x1d\x2f\x57\xf3\xac\x5a\x59\x05\xaf\x03\x3e\x05\xa9\x83\xe8\xf3\x1b\xdf\x27\x1b\x6b\xc1\x3b\xfd\x34\xea\xc6\x6d\xad\x80\xe4\x19\x12\xe1\xa3\xa7\x02\xca\x95\x4d\x1b\xa6\xc6\x1f\x2a\x84\x68\x36\xf3\xa0\x1d\x2f\xcb\x85\x7c\xdd\xf6\xee\xd1\x62\x6e\x67\x69\x4a\x9a\xb5\xb1\xcb\xe9\xdd\x04\x6c\xb5\x50\x71\xda\x69\xae\xfa\x30\x0d\xdc\x10\x7b\x54\xae\x28\x4a\xd0\x75\x95\x76\xb2\x7c\x4c\x19\x4a\x50\xd7\x06\xe8\x29\x8d\x12\x66\x40\xc0\x92\xe0\x46\x92\xa5\x2b\x4a\xa1\x41\xa3\x9d\x9a\xa1\x68\xd9\x92\xd2\xe0\x5a\xdc\xa9\x10\xdd\x46\x4d\x99\x5c\x98\xc1\x97\xe3\x95\xd5\x72\x6c\x5d\xc8\x7f\xc8\x42\xaa\x17\xa0\xae\x92\x34\x28\xf9\x8e\x19\xd3\xae\x50\x36\x7e\x65\x68\x00\x03\x55\xd4\xe7\x63\x5c\xf6\x34\xa0\x49\xb3\x76\xd5\xb5\xbd\x6d\x70\x11\x8b\x50\x7d\xee\x3a\x70\xd9\x04\x4c\xd7\x76\x94\x82\xc5\x01\x30\x9d\x18\x8a\x9d\x2d\x37\xb4\x8c\x10\xb1\x6a\xcb\xd1\x97\xad\xe0\x75\x60\x6c\x64\xcc\x64\x36\xc0\x20\x45\x5c\x06\xa8\xe0\xcb\x55\x63\xb0\x3c\x7a\xf1\xdd\x29\x52\x91\xc7\xed\xda\x94\xd1\xaf\xae\x90\xd5\x51\xa4\xf2\xb5\x4e\xc8\xbe\xe4\xb1\xfd\x2b\xb8\x87\x2c\x17\xfe\x67\xb6\x22\x55\xdc\xa9\x1e\x77\x76\xaf\x57\x79\xfa\xba\xbb\x7b\x99\xcb\xdb\x3b\x6c\xb6\x74\x72\x53\xe7\x8d\xeb\x4f\xb0\xce\xee\x5f\xf6\xd8\x48\xbe\xd4\xf1\xff\xfb\x56\x0e\xcc\xf9\x13\x53\xce\xe7\xbc\xdc\x9b\x3f\x31\xe5\x7e\xc8\x7c\xd4\xc9\x0a\x7e\x22\xc9\xda\xe7\xf9\x94\x18\x22\x1e\x5d\xb6\x2f\xca\x97\x6c\x39\xe4\xc7\x95\xf0\x07\x47\xe5\x2b\xb7\x2c\xfc\x0d\x9c\x8f\x8b\xfa\x72\xa3\xf0\x37\x15\x95\x11\x87\xbb\xdb\x92\xfc\x7e\xc2\x63\x07\x3a\xd9\x7a\xba\x1e\xe5\x9d\x89\xb9\x19\xd9\xc0\x9b\x37\x6d\xe0\x94\x79\xc1\x69\xe2\xbc\x75\xc3\x6e\xa4\xaa\x00\x2c\x77\x06\xc3\xa0\xcf\xb0\x8d\x84\xa7\x5f\x6e\xb1\xbd\x2b\x71\x39\x2f\x7a\x99\xff\xd1\xd6\x16\xc4\xf9\x3b\xf1\x61\xa7\x61\x0f\xb7\xe8\xaa\x3b\x2f\x56\x30\xb5\x42\x56\xc4\xe0\x66\x03\xaa\xdd\x5e\x94\x97\x71\xbb\x4a\x22\x29\xc9\xe2\x8e\x1f\x72\x93\x76\xf7\x38\x57\x25\x39\x99\x75\x43\xbe\x98\x99\x23\x02\xc5\x43\xd2\x58\x28\xa6\x49\xd5\x35\x4a\x83\x10\xa5\xc6\x33\x03\x26\x51\x60\x2f\x88\x4b\x8d\xaa\x24\xe6\x84\x24\x53\x30\x03\xf9\x36\x01\xfc\x56\xe2\x52\x45\x02\xe1\x88\xae\x8a\x5a\x69\x25\x92\x50\x1e\xb4\x32\x19\x85\x72\x2e\xee\x05\x3d\x7b\xe6\x8c\xff\xea\xad\xa8\x46\x0b\xf8\xb0\xd3\x97\xdf\x4b\x17\xdd\xae\x54\x17\x07\xb6\xc7\xa1\x32\x99\x65\xc2\x81\x8c\x17\x21\x7b\xdd\x08\xdb\x27\xe7\x2b\x90\xad\xbf\x64\x84\xdd\xb0\x69\xfb\xee\xa2\xa7\x9d\x06\x7e\xae\xa5\x2e\xd7\xcd\xdb\x62\x4c\xa7\x28\x01\x1b\x58\x96\x5b\x4e\x56\x7b\xc1\x90\x84\xa8\x05\x37\x7c\x0a\xc2\x1d\x7a\x59\x61\xa4\x30\xd3\xb7\x3a\x97\xcd\x8a\xdc\xc6\x21\x34\x42\x87\x71\x90\x5d\x3b\x5a\x81\x86\x28\x93\x35\xef\xe5\xf1\x5a\x9c\x08\xb0\x50\xac\x02\x50\x05\xd9\x9e\x2d\xb7\x49\x99\xe9\xc3\xad\xae\x1a\x15\xa5\xed\x6c\x03\xa9\x6f\xf6\xcc\x22\x08\x47\xb0\x7e\x76\xec\x34\x95\x15\xf6\xa2\x72\x95\xbd\xc7\x23\x14\xe6\x3b\xbd\xe0\x8d\xde\x3d\x4a\x34\x45\x3e\x75\xed\xc6\xe5\x53\xb3\x0b\xcf\x39\x35\x71\x62\xfa\x14\x0c\x74\x95\xc6\x0f\x54\x98\xcf\xdb\x52\xd9\xb7\xdb\xa6\x6c\x4d\x6a\xb3\x62\x7d\x9c\x38\x74\xc6\x64\x79\x63\xe4\x52\x1b\x87\x08\xc9\xf1\x6b\xe0\x1f\xdb\x68\xf9\xee\x16\xfb\xb6\x5e\x93\xf0\xe3\xbf\xb6\xc5\x4e\x5c\x9a\x57\xc9\x99\x61\x9f\xf5\x36\x7d\xc6\x9d\x7a\x3a\x44\x0c\x01\x4d\xcd\x92\x19\xf5\x13\x88\x11\x86\x3c\xe6\x52\x87\xd1\x74\xc0\x98\x1a\x51\x73\x09\xaf\xb4\x65\xb5\x05\x7b\x47\x8b\x3d\x79\xa5\x2d\x6a\x4a\xdd\x2b\x5b\x1b\x58\x48\xf5\x5e\x3b\x39\xbd\x81\x46\xf7\x59\x6f\xe0\x7e\x4d\xc0\x98\x9c\xe6\x74\x55\x03\x7e\x28\x1b\x80\xda\x34\xa0\xbf\x48\x7d\x3b\xe8\xea\x6f\x26\x5e\xb2\xb6\x2a\x2f\x65\xa6\xd5\x67\xff\x4a\x5b\x98\xee\x92\xba\x25\xfb\x0b\x8f\xed\x8e\x8b\x76\x11\xfb\x7f\xe0\xb1\x63\x9b\x76\xcd\xcc\xc2\xe4\x82\x7b\x3a\xbe\xdb\x83\x6b\xb5\xd3\x1b\xaf\x3d\x86\xbd\x30\x4c\x6c\x81\x6f\xb3\x04\x97\x4f\x7a\x6c\x4f\x21\xda\xb9\x28\xfd\x0f\x6d\xc5\x26\xb4\x00\xcf\x3a\x5f\xfc\x42\x0f\x2f\xba\xa3\x8e\x85\x6e\x7a\xf2\xef\x78\x08\xb1\x1e\xf6\x6e\x8f\xb1\xe5\x44\x5c\x20\xa3\xe4\x5b\xbc\x2d\x64\x1e\x3a\xa9\x9f\xa7\x2f\x59\x35\x57\x6a\x22\x04\x4a\xed\xea\xb0\x1b\x18\x42\x2d\x13\x88\xce\xb8\x1e\x4e\x3c\xc4\x23\x39\x64\xa2\x4d\xec\x4a\xe8\xe0\x0a\xd9\x7f\x6e\xb1\xa7\x44\xeb\xc5\x74\x12\x15\x65\xdc\x06\x99\x75\xa1\xcc\x72\xe1\xbf\xa9\xb5\x05\x2b\xcb\xc4\xbd\x0b\x03\x6f\x3a\x1f\xf2\x6b\x5e\xd3\x23\x75\x89\xf2\xde\x85\x6f\xd5\x75\x19\xad\x17\x02\x5b\xbf\x24\x5b\x2f\x6f\x0b\xf6\x21\x8f\x8d\xc8\x85\xf9\xbe\xad\xe8\x0b\xf5\x65\xf9\x83\x72\xfd\x1d\x32\x62\xd7\x02\xd9\x03\x66\x52\xa9\x96\x44\x6d\x71\xd8\xee\x1d\xa3\x14\x2a\xbb\x41\x83\x71\xa7\x2d\x72\xc0\x56\x08\xf2\x80\x59\xba\x6c\xc1\x0f\x9d\xb0\x34\xc2\xc3\x21\x7b\x99\xc7\xf6\x6b\xcf\xbb\xff\x83\x5b\xd0\x0f\xe6\xd4\xd3\xce\x77\x4c\xcd\x00\x87\xb3\x0a\x0b\x8e\x53\xd0\xf3\x2d\x8e\x11\x58\x0e\xc5\x28\x59\x2e\xbb\x51\x4f\xd9\x41\x2c\xe9\x5c\xae\x96\xab\xd7\x8a\xde\xaa\x50\xf3\xc6\xbf\xe8\x6d\x10\x7f\xa6\x2d\xfe\xf4\x4a\x9c\x97\x55\x94\x0c\x9c\x04\xf7\xde\x63\x17\x59\xb3\x91\x2d\xc0\xad\x4b\xb2\x11\xb3\x37\x7b\x6c\x3f\x0d\x44\x56\xf8\x2f\xdb\x8a\x76\x45\xe3\x7b\xc6\x35\xb3\x3e\x53\x5f\xae\xc9\xb5\xfa\xf2\xb6\xc5\xd9\x97\x7b\x6c\x4f\x5b\xf4\x56\x97\x0b\xff\x05\x5b\x32\xaa\x8b\xde\x6a\xcd\xf8\xfb\x0c\xbc\xe6\x36\x49\x5e\xe3\xdb\xb6\x00\xb3\x5f\xf7\xd8\x3e\x41\x3a\x82\xff\xcb\xde\x16\xa4\xeb\x26\x20\x63\xf0\x2a\x4f\x2b\x1a\x4e\xab\x4a\xd1\xed\x65\x90\xce\xdc\x88\xd4\xdb\x56\xa9\x2f\x05\xd4\xc7\xde\xe5\xb1\xd6\x72\xdb\xff\xa9\x8d\x72\x99\xe8\x8d\x7d\xd2\xb5\x39\x9f\x9c\x74\xbf\xe2\x64\xbc\x94\x0b\x3e\xb9\x1a\xa5\xa9\x48\x1e\x85\xed\x8f\x7d\xda\x63\x7b\x97\xe5\xce\x25\x72\xff\x23\x5b\x51\xc1\x4e\xe2\xc3\x4e\xb3\x1f\xf2\xe8\x6a\xad\xf1\x74\xb1\x3e\x53\x37\x68\xac\xca\x48\x22\x7a\x22\xed\x14\x6a\x32\xa9\x82\x28\xb9\x9e\x46\x56\xa0\xe3\x94\xf2\xcc\xb0\x77\x7a\xec\x09\xbd\x2c\x2f\xd7\xb3\x5c\x1d\xae\xaf\xdd\xca\xb4\x9a\x73\xde\xa1\x4f\x7a\x96\x7b\xb5\xa6\xb9\xd1\xbd\x4b\xdb\x23\xfe\xf6\x49\x2c\x68\xca\x75\x19\x89\x6e\x96\xea\xdc\x2e\xfe\xaf\x3c\x29\xb8\xbd\x76\xad\x4e\x85\x6c\x13\x84\x57\x94\x28\xa2\x03\xaf\x50\xf4\xdc\x53\xe9\x09\xcc\xda\xba\x40\xd1\x0a\x9d\x8b\x9e\x8f\x0c\x23\xa7\xe3\xa2\x30\x17\x9f\x4a\x29\x72\x06\x9e\x3e\x80\x4f\x43\xde\x63\xc7\xbd\xf9\x33\x4f\x64\x6f\xf2\x98\x7d\xdb\x7f\xa9\x4e\xc5\x5a\xb8\x99\x58\x61\x17\x72\xa4\xac\x25\x93\x23\x08\x2c\xa3\xd8\x72\x88\x41\x56\xb1\x88\x76\x8e\x4a\x65\x40\x35\x8f\xe9\x0c\x43\x69\x07\x13\x15\xbb\xb0\x94\x4f\x7a\xec\xc9\x58\xff\xd9\x54\x1b\x38\xfd\xf7\xea\x06\xbe\xd9\xbb\x0c\x2d\x4c\x2d\xeb\xf5\x90\xa6\x19\xe3\xea\x21\xcc\xef\x0c\x67\xa2\x02\xd5\x14\x3d\xd1\x0e\x6b\x59\xa5\xdd\x84\xcb\x7f\x87\x94\x56\x18\xf3\x53\xf8\xff\x97\x17\x9c\x9a\x77\x27\x02\x85\x62\x98\x8a\x30\xf5\x0f\x61\x27\x61\x5e\xe8\xa9\x74\xb0\x46\x2c\xef\x44\x77\xdf\xc4\x6e\xd8\x4a\x5a\x56\x55\x96\x66\xad\x7f\xc4\x3b\xc8\xfe\xff\x0d\xe9\x54\xbb\x22\x5f\x11\x63\xe7\x45\xdf\xdf\xeb\xef\x06\x4f\x81\x7c\x72\xc3\xc4\xab\xfb\xfc\x3d\xf0\x16\x63\x7f\xe0\xb1\x21\x13\xd8\xff\xb4\x1e\xc4\xf7\x0d\x1f\xc4\x5a\x12\x2a\xc2\x30\xd5\x47\x11\x58\x1c\xaa\x9e\xde\x1a\xf3\x2a\xad\x0d\xe6\xb6\x8f\x86\xf5\x2c\x3f\x9f\x64\x51\xa7\x18\x37\xe9\xa4\x8b\x71\x2c\xb0\x10\xe5\xb8\x33\xba\x9f\xf1\xd8\x13\xb1\xf9\x13\x7a\x8e\xfe\xbc\xfe\xbc\xb7\x5d\x8e\x39\xba\xf5\x55\xb4\xd3\xa9\xfa\x15\x8f\x35\x6c\x2d\xfe\xff\xd0\xdf\xf3\x73\x5b\x1b\x2e\xb7\x89\xa3\x7c\xa9\x2a\x0d\xa5\xe4\xe3\x38\x58\x7f\xe8\xb1\x27\xb4\xb3\x24\x01\x15\x6a\x52\xee\xf4\xfe\x17\xf4\xb7\x7d\xd8\x9b\x54\x68\xfb\xd5\xa8\x58\xe5\xfa\x41\xc3\x2e\xa6\x57\x0e\xfa\x55\xf5\x4f\x3b\xef\x78\x55\x40\x8f\x68\xae\x9d\x88\x32\x48\x26\x64\xcb\x5d\xcb\xe2\x0e\xa4\xcd\xeb\x8a\xf6\x6a\x94\xc6\x45\x17\x9d\x36\x71\x09\xd6\x36\x40\xf1\xa1\xb7\xd5\x04\x27\xab\xfa\x53\xb1\x2e\x37\x0a\xe3\xb2\x9e\x57\x36\x65\xe7\x33\xbf\xee\xb1\x21\x87\x81\xff\x65\xfd\xb9\x9f\x80\xa1\x2c\x21\xce\xe0\xd2\x26\xe8\x21\x24\x78\x95\x77\xf0\x35\x48\x70\x0a\x86\xcd\xe6\x37\x0e\x3f\xba\xa3\x9b\x30\x5f\xe5\x4c\x03\xef\x17\x32\xf1\xdc\xa3\x20\xa8\x13\x8b\x6e\x8a\x35\xb2\xad\xa2\x77\x4f\xe5\x5a\xa3\x94\x68\xe6\x18\xb6\x86\x36\xac\xd5\xf6\x54\x0a\xf2\xaa\xf7\xf1\xbc\xea\xe2\xa7\x6f\xd2\xc3\xf6\x92\xa1\xb2\xac\xde\x72\x6a\xfb\x94\xc7\xae\x19\x4e\xd4\x01\xe6\x72\x20\xa3\x7d\xab\x17\x1c\xd7\xbf\x6a\x7c\x40\x51\x89\x01\x57\x82\xce\x14\xc4\xc8\x59\xe1\x8c\x6e\x74\xcf\x59\xb6\x60\x25\x91\xbf\x53\x7d\xd4\x31\x95\x89\xcf\x7c\x52\x9c\x16\x90\x09\xd2\x2c\x14\x28\x5a\x07\x4b\x39\x5f\xf2\xa7\x8c\x1d\xb2\xbe\x04\x59\x83\x29\xe7\xf6\x54\x5c\xe4\x15\xf0\x15\x9c\xa8\x3a\x2b\xa2\xf4\x3f\xca\x82\xd5\x86\xeb\x2a\x57\xa8\x8e\xfe\x44\xd8\x02\x22\x54\xa3\x0b\xbc\xa3\x9f\x27\xb7\x07\x42\xca\xdb\x91\x02\x95\x47\xf5\x14\xb7\x59\xc7\xa5\xab\xf9\xfd\x7d\xff\x7b\x46\xcd\xbd\x44\x05\x3f\xff\xd0\x06\x01\x11\x1b\x8e\x09\x04\x44\x4c\x2c\x6c\x27\x47\x63\x43\x29\x21\x20\x1e\x29\xda\xb9\xcf\x6e\xbb\xc4\xb6\x20\x76\xf6\x96\xd3\x5b\x49\x9c\xd8\xd8\x8a\x2b\x71\xb9\x57\xe2\x72\x1f\xaf\xb8\xdc\x47\xbc\xe7\x6c\x1e\x43\x7a\x9b\x7f\x7c\x8c\xe2\x46\x1b\x26\x70\x2d\x86\x94\xab\x68\x53\x5c\x35\x8c\xbd\xf7\x2a\x27\xa1\x8e\xce\x44\x2a\xc5\x91\x74\xe5\x2c\x74\xc6\x94\xe8\x25\x59\xbf\x2b\xd2\xd2\x7f\xfe\x55\xc1\x4d\x70\x70\x00\x3d\x28\x6a\xeb\xc3\x16\x76\x8e\x65\x50\x8f\xba\x47\xc7\x07\x0e\xb0\xaf\xee\x66\xfb\xba\xd1\x85\x85\x2a\x5f\x11\xfe\x97\x76\x6f\x75\xf7\xac\xca\x38\x09\xe3\xb4\x2c\xca\x3c\x9c\x49\xcb\x33\xf9\x02\x74\x55\xf0\x86\xdd\x76\x6c\xa2\x93\xb6\xb6\x70\xf6\x78\x2d\xb5\x12\xc9\xa8\xdd\x7c\xf7\x35\xc8\x7e\x50\x09\xf5\x62\x94\xf2\x68\xa9\xc8\x92\xaa\xd4\x02\xee\x21\x71\xe1\x38\xbf\x01\x42\x47\x23\x15\xa8\x41\x34\x84\xaa\x48\xa8\x1f\x9e\x3b\x7a\xe4\x69\x8a\xa5\x5e\x96\x48\xf3\xed\x08\x8f\x97\xf9\xe9\xe8\x82\xa5\xc2\xca\xf5\x71\x24\xe4\x13\xb5\xca\xe0\xbd\xa4\x4d\xa9\x59\x61\x8e\x5b\x55\x2e\xf5\x79\x9e\x55\xc8\x7e\x50\xf5\x5c\x0a\xf3\x63\x37\x3c\x2d\xe4\xd3\x2a\x5f\xfd\xba\xce\x66\x12\x17\x20\xc0\x94\x19\xbf\xee\xc8\xd3\x46\x95\x00\x69\x27\x8f\xd4\x7d\x06\xa7\x75\xd5\xe3\x71\xb7\x2b\x3a\x71\x54\x8a\xa4\x6f\xa0\x44\xee\x48\x6b\xcc\x1f\xf0\x8e\xea\x68\xcb\xba\x98\x93\x25\xa8\xc1\xc8\x1a\xa1\x93\x3a\x19\xf4\x89\xb8\xd0\x16\xa2\xc3\x8f\x5e\x77\xe4\x69\xf5\x7e\x0c\xf9\x19\x08\x62\x4a\xa8\x5b\x41\xf9\x59\x12\x22\xe5\xe7\xe3\x24\x11\x9d\xd1\x4d\x9b\xbf\x5c\xe5\xe5\xaa\xc8\x47\x31\x13\x0b\x6e\x36\xb2\x7d\xb5\xb6\xa9\x50\x31\x3b\xbf\x31\xc0\x5a\x3b\xea\x25\xb5\x51\xa0\x95\x0e\xa5\xc6\xc6\x26\xb3\xcf\xed\x66\x4f\xe8\x3a\xe3\xeb\x7f\x68\xc7\xb3\xfd\x1b\xbb\xb6\x38\xdb\x2b\x6b\x5a\x0d\x34\xfe\x51\x99\xe0\x97\x3e\x6d\x3b\xd9\x7a\x3a\x7c\x81\xc0\x46\x41\x4b\xe3\x12\x27\xb7\x9c\x38\x43\x67\x47\x87\x38\xc1\x6e\x1a\x1c\xc4\x6d\xcc\x7a\x9a\xa2\x7a\x52\x83\x04\x2f\xd5\xe9\xd1\x2d\xd4\xae\x67\xa7\x4d\x41\xac\xd8\xaa\xaa\x5e\xc3\x02\x1d\x98\xc8\x0d\x0b\x0d\xdb\xa1\x67\x41\x04\xe9\x8a\x60\x3a\x17\x43\xe7\x33\xda\x03\x1a\xba\x22\x64\xdf\xd8\xb7\x49\x88\xd6\xd1\xb0\x91\xc3\xed\xe3\xfb\x82\xcf\x8c\x5c\xa1\x6e\xfb\xdf\x8c\xba\xcd\x39\xd5\xbf\xb2\xeb\xb2\x30\xa8\xfd\x95\xc7\xbe\x1d\x6b\x9e\xc0\x9e\x3d\x5b\xc6\x49\xfc\x20\x6a\xeb\x5f\xd4\xf6\x89\x8f\x7a\xc3\x1e\x52\xb5\x3a\x01\x45\x2a\x3a\x15\x9f\x1e\x68\x0c\xcd\x2f\x2b\x99\x58\x2e\x12\xb1\x16\x41\x30\x63\xa7\x18\x35\x72\xa7\x20\x93\x8d\xbb\x1d\xba\x81\xaa\x4e\x95\xba\x0e\xa5\xfc\xc2\x42\x72\x74\xde\x9f\x6a\x31\xdf\xf9\x1a\xd8\x98\xfd\x97\xb7\x76\x46\x13\xf1\x2b\xde\x60\xa1\x8f\x4a\xe7\x40\x87\xe4\xd1\x3a\x15\x77\x88\xe8\x8e\x40\xd5\xd9\xb0\xaf\x0e\x8f\xf2\x22\xee\xc6\x49\x94\xab\xe5\x41\xb3\x91\xaa\x54\x0a\x40\xbf\x27\x42\xf6\x5f\xaf\x72\xd2\x3c\xe7\x4b\x51\x9b\x84\x55\xa1\x58\xa0\x5e\x73\x55\xf0\x0b\x2d\xeb\x82\x81\x42\x41\x0b\xb3\x44\xa0\xb1\x51\xa7\x6e\x53\xbc\x04\xb1\x5c\x91\x33\xb8\x2d\x1b\xf8\x54\xc4\x65\x59\xcd\x50\x29\x3c\x14\x29\x29\x88\xfd\x18\x85\x94\x5a\x98\xaa\x99\x92\x47\x1d\xc8\x9d\x93\x39\x08\xfc\xb5\x38\xe2\x0b\x95\x62\x6c\x50\xb9\x0a\xa0\x70\xfb\xb1\xa5\x3e\x11\x58\x58\xb7\x4b\x4c\x8c\x55\xf0\x38\x0d\x39\xb7\xbe\x98\x82\xfd\x31\x6e\xce\x6a\xac\x5c\xd4\xb0\x89\x08\xcc\x49\x15\x93\xe9\xc3\x34\xf3\xa2\xb7\x57\x76\xd0\xbc\x58\x76\xc9\xa9\xf6\xb1\xdf\xf5\x98\xba\xe5\xff\x1f\xde\x06\xb9\x98\xed\x21\x99\x17\xcb\xc1\x7f\xf0\xe8\xaf\x0d\xfb\x55\xed\xbf\x97\xd4\xb5\x38\x9d\xac\x6a\x48\x6e\x90\x93\x37\x59\x93\x42\xa1\xbc\x3f\x51\x95\xc0\x83\x2b\x72\x0c\x7b\x46\xf6\x75\xc0\xc4\xe4\x79\x96\x87\xec\x61\x8f\xed\x2b\x68\x28\xfc\x0b\xc1\xd3\xf5\xb0\xac\x66\x89\x14\x06\xcd\x34\xa2\x79\xaa\x88\x36\x48\x14\x50\xc9\x18\x41\x9f\xdc\x7a\xf2\x6a\xd5\x61\x54\xdd\x15\x73\xc3\x15\x73\xc3\xe3\x47\x03\xb6\x6a\xd9\x33\xbf\x7f\xa7\xe6\xcc\xef\xdc\xc0\x9a\xf9\x88\x77\xff\xe6\x86\x8d\x3b\xfd\x69\x4d\x8e\x05\xcb\x24\xa2\x35\x8c\xc1\x34\x35\x2e\x41\x6b\x07\xac\xf3\x66\xfd\x1c\x63\x77\xdb\x12\x6b\xa7\x1b\x17\xf2\x6e\x2e\x56\x62\x70\x4b\xca\xe2\x14\x4f\xa2\x62\xce\x4f\x57\xee\x15\x4b\xab\x59\x76\x7e\x92\x52\x21\xc0\x63\x40\x76\xfe\xbb\xfb\x83\x33\x9b\x3f\xe6\x66\xb7\xdf\xf8\xf9\x66\x46\xf4\x3f\xbb\xc2\x0a\xb8\xe3\xed\xe0\xcd\x9a\x11\xfd\x55\x5e\x70\xf0\xd4\xd6\x46\xc3\xde\xbe\x9f\xc5\xee\x65\x67\x87\x7b\xcc\x77\x30\x97\xae\x6c\x55\x3b\xd8\xaa\x3e\x6f\xfb\x5e\x7e\xd1\xdb\x19\x4f\xfa\x0b\xbd\x21\x44\xe9\x8f\xe1\xc7\x3d\xe2\xfd\xb0\xb7\xf9\x9e\xb8\xec\x77\x0c\x29\x7b\xe3\xdc\xab\x6d\x8b\x9b\xef\x53\x8d\x5c\xab\x0f\x3f\x91\x1d\x1f\xce\x28\xbb\x19\x99\xac\xff\xc9\x27\x04\xaf\xf4\x36\x79\xc8\xf0\x98\x18\xec\x8b\xc5\xe9\x84\x26\x01\x64\xec\x59\x13\x9d\xf1\x8e\x48\x63\xd1\x19\x5f\x8e\xe2\x64\xc0\x71\x43\x13\x56\x67\x34\xe2\x71\x51\x54\xa2\x63\x73\xcf\xba\xe6\xe7\x77\x5e\xcd\x7e\xe4\x00\x3b\x60\xdd\xf7\x1f\x61\xfe\xae\xa5\x7e\x29\x82\x8f\x33\x9b\xa1\x37\x2e\x34\x58\xbc\x63\xa8\x96\x06\x8a\x57\x6e\xe1\x22\x5e\x49\x45\xce\xa3\xe5\x52\xfe\x37\xe5\x13\xd4\x7c\xf3\x8d\x08\xd2\x86\x65\x5a\x4f\x59\x5a\x48\x75\x2c\x8e\xa0\xa0\x71\xfa\x42\xdb\xf9\x8a\xa6\x25\xdd\x9c\xd1\x5a\x52\xdd\xb8\xdb\xad\x20\xc5\x4f\xc8\x18\x49\xc5\x1b\xd0\x77\x63\x3c\x59\x4a\x89\x75\x4c\xf3\x64\x97\x4a\x6d\x3f\x98\x82\x9b\x01\x6c\x49\x9d\x0e\x81\xdf\xac\x1a\x73\xd1\x85\xd1\x03\x5c\xa4\x96\xc3\xa9\x03\x48\x0c\x87\x8e\xaa\xb7\x64\x48\x7d\x27\x61\x64\xb7\x5a\x1f\x63\x26\xc5\x8d\x62\x3b\xec\xca\xad\xef\x38\xe3\x47\x43\xe7\xc3\x41\xde\x57\x6a\x9e\x0d\x95\x99\x9b\x3e\xcd\x11\xd5\x1d\x32\x7e\x0c\x72\x3e\x5a\xd7\xf0\x3d\xd0\x98\x40\x2d\x9d\x9c\x9e\x5f\x9c\x39\x39\x33\x39\xb1\x38\x1d\x20\x8b\xdd\xa8\x2e\x35\xcd\xf8\xaa\x88\x3a\x22\x2f\xcc\x1c\x14\x69\x3b\xeb\x80\xbf\xbe\x8c\x18\x37\x64\x4b\xfc\xc4\xf4\xfc\x98\xba\x39\xb1\x30\x1b\x1e\xb5\x79\x90\xe5\xe6\x5f\xb5\x31\x78\xb7\xd0\xee\x79\xb0\x54\xa9\xdc\xb8\xd7\xcb\x3e\x9b\x3f\x39\x79\xc3\xb1\x9b\x8f\x84\x8c\x5f\x17\xf2\xd9\x2c\x1d\x93\x0d\x57\x3c\x72\x72\xd3\xc7\x34\xb1\xca\x12\x95\xa9\x39\x39\xf8\x29\xd6\x17\x47\x78\x02\x55\xa9\xca\xd5\xd3\x19\x65\x1c\xbc\xe1\x90\xdf\x1c\x49\x72\x7a\x49\x94\x46\x08\xb7\x15\x17\xca\xa1\xad\xbc\x21\x3c\x46\xed\xbc\xe9\xfa\x1b\x6f\xc6\x29\xd9\x45\x66\x80\x08\x87\x41\x57\x6c\x2d\x09\xd3\x7d\x66\x37\x1f\xb4\xae\x00\x4e\x09\x67\xda\xac\x54\xc9\xb5\x32\xaf\xb7\x0d\xcd\x6a\x86\xda\x1f\xa5\x50\x53\x95\x35\x6f\x11\x58\x77\x51\x2d\x15\xb2\xa2\xb4\x54\xbd\x62\xec\x5e\x25\x71\x1c\x00\xa1\x5e\x29\x72\x32\x0a\x3b\x1c\xd7\x94\x39\x49\x59\x8a\xe2\x94\x2f\x9e\x5a\x00\xb0\x7e\xb1\x1a\x9d\x17\x05\x04\x6b\xbb\x2b\x13\xa2\xac\x71\x3e\xc4\x29\x74\x0b\xaa\xfe\x21\x63\xf7\xae\x0a\xd9\xa5\x79\x1c\x25\x20\x4a\x45\x05\x7f\xc6\xc2\x99\x59\x39\x9e\xcf\x9a\x38\x7d\x6a\x94\xb0\x28\x65\x44\xcb\x86\x68\xc3\x93\x3e\x44\x79\xdc\x78\xbd\x9a\x68\xa3\xbc\xc8\x78\x0c\xcb\xa0\x00\xab\x41\xb6\x7c\x9c\x31\xce\x39\x3d\x77\x08\xfe\x1e\x93\xff\x3b\x31\x7d\xe7\xcc\x2c\xb7\xa6\x08\x5c\x85\xfb\x61\x18\x9a\xe7\xa6\x67\xa7\x9a\x9f\x3a\xec\x78\x30\xaf\x61\x4f\x75\x0e\x35\x79\xc0\x8e\xc9\x15\xef\xef\xf7\xf7\x46\x65\xd6\x8d\xdb\x8c\xbd\xbe\xe5\x20\x20\x5f\xdc\x0a\xee\xb3\x0e\x05\x2b\xf5\xbb\x35\x0f\x42\x7e\x37\xd8\x82\xed\x07\x73\xc1\x03\xb5\xe5\x06\xa3\x7a\x0f\xc3\x91\x55\x3b\x8c\x23\xde\x9d\x61\xa7\xb7\xce\xf1\x3e\xfc\xdc\x73\x80\x92\xdf\x31\xf8\xc1\xdd\xa8\x37\x76\x5e\xf4\x0b\xf9\xd1\x63\x9c\x80\x92\x7c\x68\xd7\xec\xf1\x77\x75\xa3\x1e\x63\x2f\x68\xb1\x7f\x37\x2c\xb9\x3f\x8a\x98\x94\x01\x9b\xce\xdd\x2f\x78\xc1\xcd\xce\x15\xbd\x36\x07\xf0\xc4\xda\x10\xa7\x72\x93\x3b\x07\xe4\x4b\x3d\xf6\x22\x8f\x5d\x95\x64\x51\xe7\x44\x94\x44\x69\x5b\xe4\x7e\xb5\x85\x98\x82\x53\xd6\x0b\x84\xbd\xb8\xdd\xbe\xd6\x4c\x5e\xe6\x9e\xe6\xb2\xd2\xb1\x25\x7a\x21\x64\x17\xf7\x3b\x70\x20\x95\x29\x5a\xf3\xda\x2f\xcc\x4c\x41\xa4\x0b\xa8\x66\x7f\xb1\x2f\xb8\xce\xb9\x82\x12\xb5\x8b\xe5\xd1\x0f\x6c\x9c\x90\xea\x03\x57\xd4\xaf\x1d\xab\x5f\x89\xd2\xbe\xda\xc1\xbf\x86\x3f\xea\x39\x55\xf5\x58\xd8\x8b\xf2\x46\x76\xfd\x06\x11\x8f\x43\x67\xc0\x15\x85\x6a\x07\x0a\xd5\x67\x6c\x85\xea\xa3\x3b\x54\xa8\x7e\xb0\x59\x9f\x7a\xac\x40\x6c\x8f\x78\xcb\x9b\xab\x52\x93\xfe\xc4\xd8\xa0\xe6\xa3\x01\x32\x6a\x96\xd5\x53\x56\xd8\x9b\x0b\x63\x7f\xcf\xd8\x3d\x97\x9a\xb7\x71\xe3\xdc\xc6\xfe\x8f\xb1\xe0\x7b\x37\x7c\xa2\xc6\x6d\x89\xf9\x7b\x21\x82\x3f\x5f\xa3\x79\x3c\xec\xfd\x8b\xde\x1e\x4c\xe8\x7c\xd1\x83\x05\xe3\xec\x7b\x6f\xdf\xcf\x1e\x60\xfb\xe4\xc0\xc9\x15\xe4\x8b\xe0\x7b\xd5\xdf\x6a\xf1\x5a\x02\x09\x64\x58\x56\x1b\xb7\xe2\xec\xa1\x7d\x4f\xa9\x2d\xb6\xb7\x3e\x38\x27\xdf\x38\x27\x7b\x2f\x70\x9c\x7e\xaf\x68\x31\x6a\x93\xff\xc2\x56\xf0\x75\x0f\xff\xd6\x54\xa3\xf8\xab\xd1\x8d\xa8\x3e\xf9\x72\x64\x71\x1c\xbf\x8d\x12\x5d\x3f\xba\xb9\xb3\x0d\x8d\x41\x92\xf0\x24\x5b\x17\x79\x5b\x2e\x7d\xbb\x3f\x7e\xcf\x63\xac\x58\xcd\xf2\x12\x67\xc3\xaf\x79\xc1\xfb\x3d\xf3\x1b\xbf\x4a\xfe\xac\xa5\xb7\x56\xdf\x3d\xaa\xa3\xc1\xea\xf9\x98\x35\x6d\x11\xe9\x2a\x15\xf1\x1e\xe2\x9e\x85\x33\x88\x78\xff\xe3\x74\x2d\x6b\x53\x90\x09\xd0\x67\x9d\x93\x4b\xaa\x5d\x26\x7c\x45\x94\xfc\x36\xa8\x5f\x56\x2f\x7b\x6b\xa6\x34\x2a\x4e\xed\xa3\xcc\xc6\x7e\x35\x3b\x60\x7f\xe3\xf3\x3d\xb6\xaf\x88\xd3\x95\x2a\x89\x72\xbf\x0c\x56\xd4\xdf\x7a\x9e\xa9\xdf\x4d\xe3\xbe\x41\x95\xce\x8c\xd3\x97\x3b\x1c\xe7\x9e\xd3\xcd\x5f\xf7\x18\x93\x6b\x68\x25\xcb\x63\x51\xf8\x5f\xf5\x82\x4f\x7b\xe6\xb7\x6b\xc3\x85\xe1\x13\x1d\x6e\x67\xcb\x8f\x8b\x81\x64\xb3\x4b\x22\xc9\x80\x5d\x23\x23\x0c\xc1\xc1\x28\x49\x0e\x1e\x36\x94\x1d\xbd\x6a\x29\x89\x8b\xd5\x47\x73\x6c\xa2\x24\x39\xb7\x51\xcf\xff\x37\x8f\x4e\xca\xf7\x7b\xc1\x7f\xf0\xce\x6f\xbe\xb6\x9d\x5e\x8f\x0b\x02\x15\x24\x7d\x73\x70\xa1\xf6\x44\x23\x16\xd2\x12\xb1\x9d\xfd\x0a\x02\x0e\xb0\x89\x4a\x31\xbd\xe1\xa1\x1c\x61\xe5\x38\x40\x06\x87\xae\x3a\xa8\x1d\x25\x49\xe1\x8c\xdb\x97\x0f\xb0\x70\x4b\x67\x92\x96\xcc\xfd\x9f\x3e\x10\x2c\xea\x5f\x46\x10\xa5\x54\xc8\xb0\x82\xa4\x5a\x1a\x49\xed\xb2\x34\x49\x6f\x07\x44\xe6\x18\x19\xc1\xd5\xea\x0f\x2f\x7a\xbb\xe4\x99\x7a\xd1\x23\xb4\xf2\x45\xcf\x4f\xa2\xa2\x5c\xcc\xa3\xb4\x80\xba\x16\x63\x48\x71\x97\x8b\xa8\x90\x5b\xef\xde\xae\x28\x8a\x68\xc5\x85\x4e\xfc\x30\x63\xa7\x34\xdc\xf9\x44\x70\x83\x2b\x12\x6b\x1d\x67\x54\x91\xa9\x2d\xe6\x52\xec\x3b\x19\x25\x52\xc5\x3d\x9b\x02\x2c\xc6\xe9\xa0\x45\x06\xad\xf2\x4f\x05\x77\xa8\x6c\x1b\x96\x0d\xca\x12\x38\x80\x44\x3a\xe5\xcb\x59\x16\x12\x55\x43\xd8\xce\xba\xe3\x46\x20\xb1\x4b\xfd\x40\x8b\x35\x7c\x9c\xff\x93\x2d\x76\xd3\x25\xc8\x0b\xf2\xdd\xe0\xab\xde\x60\x81\x5a\x4a\x8c\x8a\x92\x18\xaf\xed\x5e\x40\x86\x5e\xf8\x53\x41\xca\x64\xb7\x50\x9f\x99\x5c\x4f\xb4\xe4\x8c\x02\xaf\xb1\x5b\x70\x12\x24\x7d\x84\xe7\xe8\x29\x81\x94\xfb\x21\x47\x63\x56\x44\x13\xbd\x44\xd0\x11\x11\x20\x19\xd8\x0c\xb4\x4b\x97\x28\xa7\x04\xe5\xce\x56\xcc\xfd\x05\xf0\xca\xf6\xc8\x26\xf7\x02\x8f\xa9\x91\xf7\xd7\x82\x98\xfe\xc4\x1d\x66\xb5\xea\x82\x7b\x3c\xea\x00\x68\x47\xdf\xc3\x03\x1e\xb0\x71\x34\x4b\x0d\x9b\x95\xe9\x03\xfa\x4c\xc5\x65\xeb\x26\x38\x71\x86\xef\xd3\xad\xc6\x08\x98\xff\xdc\x52\x21\x30\x3f\xd6\x1a\xbc\x5d\x8f\x4a\x0d\xb5\x79\xdc\x8a\x8f\xd1\xe8\x33\xd3\x9d\xeb\x11\x9a\x34\x91\x6f\xa2\xea\xc9\x86\x9e\x84\xc9\x86\x3b\xc1\x28\x8f\x97\x9b\x0b\x8b\x75\x08\x63\xd2\xe7\x47\x8f\x21\x62\x03\xaa\xc6\x21\x0e\x8d\xce\x7f\xdf\x85\x67\x87\x0d\x4d\x8e\x0b\x7e\xcb\x68\xad\x3d\x52\xae\xaf\x60\x61\x03\xd0\x0d\x8c\xb9\xb9\xc0\xd5\xae\xf8\x95\x9a\x14\x64\xd5\x5e\x17\xb1\xf3\xa5\x16\xa3\x15\xed\x7f\xae\x15\x7c\xac\x85\x7f\x9b\x6d\x05\xd2\x1b\xac\xe4\x51\xb7\x1b\x95\x36\xd5\x72\x6e\x8f\x2a\xee\xac\xf0\xa2\x3a\xc0\x75\x7b\x0f\x16\x34\xfd\xad\x71\x9e\xc3\xd4\x1f\x39\x6c\x0c\x9a\x44\xd1\x5a\x17\xc0\x25\x28\x27\x02\xc5\xbb\x88\x0b\x3d\xcc\xb0\x40\x90\x35\xd0\x13\x45\x94\x02\x4e\x44\x8b\x6a\x30\x6f\xf1\xc4\x59\x5f\x45\x04\x5b\x69\x60\x6e\x11\x66\xa8\x28\xe2\x8e\xc8\x45\x87\x47\x7c\xa5\x8a\xf2\x28\x2d\x85\x00\x0a\x07\x8b\x0b\xdb\x5a\x69\x91\xb5\xc1\xd0\x44\xb4\xad\xdd\xb2\x89\xa4\x05\xa1\x3d\xd7\x9e\xa5\xbf\xd8\x62\xdb\x05\xc4\xfa\xaf\x6c\xf9\x57\xc7\x69\x39\x96\xe5\x63\x58\x4a\xf0\xd7\x9e\x75\x1f\x97\x19\x6c\x84\x1a\x1d\xbb\x8a\x08\x64\x0e\x68\x32\x44\x9c\xa8\x96\xf2\x7b\x71\xa9\xe3\x11\x6d\x5b\xdc\x78\x37\xca\x8b\xd5\x08\x91\x9f\x48\x3c\x65\x5d\x19\xe5\x71\xa9\xf2\xb3\x00\xf3\x96\xec\x37\xe2\xb5\x94\x13\x09\x68\xd6\xfa\x3d\x01\x38\x42\xc8\xb8\x93\x64\xeb\x05\xe4\x94\x2a\x33\xb0\x35\x8f\xd6\xd3\xd3\x41\xe5\xd8\x69\xba\xe5\xb8\xad\x10\xb3\xb5\xac\x06\xc1\x9e\x4e\x27\xfe\xc4\x01\x07\x2b\xa5\x80\xfd\x0b\x72\x66\x2f\x57\xc9\x82\x28\xfd\x7f\x64\xc1\x5b\x5b\xd6\x85\x3a\x6d\x4e\xa9\xd1\xa3\xb0\x56\xc8\x76\x08\x89\x4a\x60\x36\x97\xb1\x28\x42\x3e\xa3\xff\x86\x99\xa2\x52\xac\x47\xc5\x71\xc6\xc7\xf8\x2c\x9a\xac\x8e\xf3\x09\x95\xbc\xbf\x80\xfd\x90\x4f\xcd\x2e\x20\xae\x31\x2b\x40\x86\x0c\xe5\xd3\xc4\x7e\x71\x9c\x4f\xc8\x59\x9c\xf6\xb9\xc5\x57\x05\x79\x4c\xb4\x0d\x38\x04\x2b\xaa\xdd\x78\x3d\x2b\x55\xec\x9c\x82\x40\x61\x0b\x54\x9b\xfb\x28\x7f\x44\xc9\x7a\xd4\x97\x95\xf4\x74\x02\x2f\xd9\x97\x8a\x64\x45\x3d\xec\x5a\xc5\xfe\x66\xef\xe5\x4d\x34\x59\x52\xa8\x55\xb2\x01\x8d\x4c\xc3\xc0\x41\x80\xd5\xcd\x14\xbf\x67\x2c\x50\x0a\xa6\x6b\x06\xc7\xca\x3e\x88\x0b\xbd\x10\x65\xc8\xde\x6b\xe2\xaa\xde\xb1\x11\xb3\x54\x53\xcd\x68\xd2\x4b\x55\x72\x85\x61\x66\xbc\x39\xbb\x52\xeb\x7d\x45\xff\x10\x95\x91\x3a\xae\xec\x2d\x79\xa9\xcf\x8b\x4c\x1e\xaa\x71\xda\xc9\xd6\x61\xff\x05\x7a\xd3\x2b\x66\xb8\x2b\xa0\xa8\xc7\x2f\x06\xeb\xec\xe6\xb6\xa4\x63\xfe\x11\xe3\x96\xef\xf5\x0a\x6d\x2e\xb2\xe6\x7e\x1d\x95\xf4\xb1\x11\x87\x26\xc4\xa5\x35\x9b\x4e\xd7\x08\x36\xff\xa6\x91\xe0\x83\x5e\xed\x22\xe5\x63\x00\xbe\x20\x22\x37\xcb\x6c\x4e\x33\xd9\xe9\x6b\x71\x9e\xa5\x5d\x4c\x0d\x92\xc7\x72\xcb\xc5\x6d\x5c\xf9\x9f\xd0\x55\xa8\x35\x0c\x42\x03\x63\x71\x07\x0b\xa4\x77\xc5\x63\x07\xf6\x4b\x3d\xe2\xf0\xf4\x79\xd1\x1f\xc3\x49\xd3\x8b\xe2\x1c\x76\xe6\xc6\x1a\xdd\xed\xf3\x73\x1e\x7b\x58\x71\x3b\xfe\x40\x90\xcd\x3a\x4a\x3d\xc0\x2b\xcb\xc7\x88\xb1\x71\x8a\xed\x43\xe8\x7c\x94\xf8\x37\x07\xd7\x62\xac\x6a\xdf\x11\x7e\xa8\x63\x95\x81\x81\x8e\x35\x10\x01\x97\xb2\x2c\x11\x51\xca\xfe\xcc\x73\x8e\x58\x4d\x63\x24\x27\x15\x8d\xde\xa7\xbd\xc0\xfe\x6d\xc4\x43\x1b\xde\x0b\x1c\x0c\x29\x17\xf2\x39\xb7\xc7\x7e\xd8\x63\x27\xd9\xfe\x76\xd6\xed\x65\xa9\x48\x4b\xff\x96\x60\x74\x52\xfd\xc0\x15\x86\xb8\x60\x18\xf2\x35\x4a\x21\x46\x82\xb4\xe8\x38\xf2\xc0\x1d\x6c\x97\x3c\x6a\xfd\x9b\x82\x6b\x67\xb3\x8e\x32\x67\xa5\x5b\x2f\xe0\x65\xbb\xd9\x77\x5b\x5f\xbb\x9c\x64\xeb\x14\x01\xa8\x2d\xf1\x04\x62\xf5\x7f\x77\x57\xf0\x5f\x3d\xfa\x81\x16\x34\xda\x9d\xb3\x3c\x5e\x89\xc1\x7b\x8c\x01\xe6\x06\xb8\x51\x18\x09\x59\xc7\xd8\x2b\xa4\x42\x54\x49\xcd\xab\x54\xb1\xc4\x48\x6f\x0a\x62\x67\x2e\x40\xe6\x28\x57\x73\x21\x38\x1c\xe8\xd9\x32\x56\x48\x84\x77\xa6\xc2\x5b\x65\xa9\x55\x21\xf2\x51\x5c\xa8\xa3\x52\x6e\xaa\xa5\x70\x0a\x9b\xcc\xa1\x2f\x68\xb1\x29\xb6\x1b\xde\xf1\x6f\xdd\x20\xe9\x49\x53\x87\xdc\x29\xdf\x52\xd0\xde\x7f\x45\x7b\xf0\xb7\x05\xfb\xe6\x29\x3d\xa3\xdd\xbf\xf7\xb0\x27\x14\x4e\xee\x34\x7f\x6a\x03\xf2\xd0\xc6\xee\x77\x5e\x57\xd5\x9e\x60\xbb\xe4\x67\xfb\xc7\x37\x20\x5a\x6e\x2a\xed\x6c\x21\x72\x2a\xe3\x11\xef\x95\x1e\xfb\x17\xce\x26\x58\xa5\xe0\xa9\x5d\xf7\xab\x31\x4a\x33\x37\x56\x66\x63\x9d\xb8\x68\xe7\x71\x57\xf6\xb8\x38\xd1\x3f\x0e\xee\x60\xda\x16\xa1\x2b\xe0\x82\xfb\x95\xc7\xb9\xdb\x6c\x78\x44\x36\xf8\x38\x97\x2d\x60\x9c\x5b\x85\x66\xf9\x71\xd8\x58\x19\x7b\x25\x63\xdf\xd9\x94\xcd\x22\xeb\x20\xcd\xc1\xd7\xf6\x07\xb7\xab\x1f\xc3\x59\x0e\x48\x50\x84\x84\xcf\xb1\x49\xaa\x07\xfb\xa4\x33\x09\xde\xba\x9f\x7d\xde\x63\x57\x57\x29\x45\x8f\x42\x18\xdf\x47\xbd\xe0\x3d\xde\x59\xfb\x92\x8a\x89\x45\x4e\x36\xae\xef\xc4\x09\x25\x2a\x53\x71\x61\x21\x3f\xd1\x57\xa9\xd4\x46\x75\xfd\x56\x49\xdb\xde\x08\x81\x35\x02\xfe\x3b\x7e\x4d\x37\x4a\xab\x28\x19\x93\x3f\xc6\xa2\x4e\x37\x4e\x35\x3c\xcc\xd9\xbf\x7e\xdd\x63\x57\x21\x39\x1f\xed\x56\x9f\xdc\x0a\x57\xa5\xec\xd5\x49\xeb\xad\xe0\x55\xde\xcc\xb2\x89\xbf\x42\xad\xdb\x98\xe6\xe5\xa9\x02\xdf\xd7\xb6\x81\x67\xb8\x79\x01\x45\x0a\xa6\x3d\xb8\x1b\xa9\xb4\xb0\x60\x97\x84\x5e\x6d\xc1\xc4\x44\xaf\x35\x65\x7a\xc5\xe4\x7e\x55\xda\x25\x7b\xb1\xc7\x98\xe2\x42\x9c\x99\xf2\x2f\x04\xe7\xa7\x2c\xe6\xec\xd9\x0c\x23\xe0\x34\x7b\x17\x66\x69\x03\x8a\x50\x55\x44\xc8\xe7\x21\x29\x85\xa2\x68\x01\xec\xcc\xd1\xf0\xe8\x75\x21\x2f\x84\x30\x23\x02\x28\x12\x4d\x6d\x7a\xe3\xd1\x5b\x6e\xbc\xd1\x5e\xd3\xcf\x64\x7b\x7b\x59\x67\x72\x66\x6a\xde\x3f\x19\xdc\x32\x87\x7f\xd6\xed\x29\xbd\xac\xc3\x67\xe6\x78\x1e\xa5\x2b\x82\x47\x05\xe0\x5a\x34\xd8\x41\x76\x5d\x58\x23\x1b\xde\x47\x65\x16\xfe\x5b\x5b\xc1\x97\x3c\xf5\xab\x5e\xae\x2a\xb3\x68\x2c\x94\xd2\x1e\x52\x0c\x26\x08\xec\xca\x8c\x03\x75\xa2\x0d\xcc\x81\xa7\xb9\x43\x7c\xa4\x5c\xe5\x22\x2d\xf3\x3e\x0e\x90\x71\x94\x50\x7b\x54\x47\xce\x20\x1e\x49\x41\xa5\x74\xb0\xac\x95\xe7\x09\xe2\xf1\xb2\x65\x3e\x33\xb7\x76\x3d\xc8\xd0\x33\x73\x6b\x37\x6e\x60\xbe\xde\x06\xc7\xd4\x0b\x3c\xc6\x80\x13\xb5\x23\xf2\x99\x29\xbf\x08\x96\x67\xa6\x94\xd0\x01\xdd\xa0\xfb\x86\x0e\x9d\x76\x92\x55\x1d\xae\x5e\xe1\x96\x3f\x27\x2a\x8f\xf3\xdb\xe6\xe8\x86\x14\x5e\x6e\x3f\x3e\x3e\xae\x2f\x28\xbe\x0b\xb9\x3c\x66\xa6\x6e\xb7\x87\xac\xcd\xf6\xc8\x4f\x2f\x0b\xff\x59\x01\x1f\x5c\x2b\x94\xb0\x18\x1f\x71\xbe\xfa\x5a\x76\x88\x7d\xf7\xa6\x0b\x72\x51\xbe\xc8\xfe\x76\xa4\x31\x39\xf4\x62\xd6\xcb\x92\x6c\xa5\xbf\x40\x19\xbc\x16\x45\xde\xf5\x3f\x35\x12\xbc\xa6\x35\xc1\x4b\xba\xa7\xd3\x7b\xf1\x52\xe4\xdd\xfa\x34\xca\x45\x51\x25\x98\x62\x38\x5a\x12\x09\x7f\xa0\x12\x39\x28\xfe\x13\x3c\xad\x92\x44\x1e\xa3\x68\x6f\x1c\x52\x9c\x3a\xff\xd3\x4c\xc3\x2d\x60\xe1\xdb\xa0\x3d\x1a\x11\x4c\x46\x3a\x31\x3b\x25\x70\xde\xd0\x28\x80\xa6\x52\x2d\x91\x41\x62\xb9\x4a\xdb\x28\xba\xc9\x3d\x35\x2a\x38\x6c\xf3\xd6\xe7\x19\x47\x4b\x94\xf2\x28\xe9\xad\xba\xf9\x30\x60\x32\x82\x89\x56\x0f\x6e\x25\x6f\xba\x1b\xfe\x3b\x3c\xf6\x93\x1e\xfb\x36\x68\xfc\x29\xf9\xdd\xd3\x17\x64\xaf\x80\xef\xd6\x7f\x89\x17\x5c\x37\xa1\xdd\x42\x83\xdf\xed\x7c\xda\x52\x9f\x72\xde\x3a\x43\x3b\xcd\x26\xb7\x40\xaf\x5b\x1f\x3d\x68\xc9\xbc\x29\x9d\xfd\xd5\x01\x76\xe3\x26\xe7\xf8\x1c\x30\x3d\xcc\x57\x89\x28\xee\x8d\xcb\x55\x15\xd7\xe4\xbf\xff\x40\xf0\xfa\x91\x21\x37\x01\xc0\x46\x47\x66\xc4\x41\xd5\xc5\xa3\x52\x87\x38\x19\xe1\x0d\xed\xed\x56\xd6\x4f\x18\x5d\x78\x47\x59\x0d\xc9\xb3\xa4\x05\xc2\xf3\xc6\xf6\x49\xf2\x1f\xa9\xee\x4b\x8a\xf2\x51\x99\x79\x0c\x1e\xd0\x76\xf7\x42\xc6\xb6\x52\x1b\x95\x61\xb8\x87\x7d\x89\x9a\x7e\xa6\xbd\xf1\xb2\xc9\x8b\x12\x2f\x63\x12\x96\x43\xd1\x61\x13\xf6\x9c\xa5\x82\x77\x85\x0a\x9f\x2e\xea\x25\x39\xa2\x69\xda\xe1\x87\x96\x86\xbe\xab\x1a\x0d\xcd\x02\x43\x5d\x96\xce\x3b\xd7\x1a\x0a\x0d\x2f\x7a\x3a\x12\xcd\x4d\xcd\xbc\x8f\x7d\xb9\xc5\xae\x76\x0a\xf5\x3f\xd5\x0a\x7e\xd5\x3b\xe7\x5c\x3b\x47\xca\x7d\x12\x63\xc6\x57\x55\xa3\xd5\x45\xe4\xde\x50\xa9\x64\xb5\xc8\x6c\x22\xa7\xdb\xed\x2c\xef\x50\xc6\xd2\x72\x55\xc4\x39\x8e\x8f\x1a\x0e\xd2\x17\x8d\x5b\x70\xc2\xee\x81\x6c\x99\xd7\x9b\x24\x5f\x3c\x57\xff\xfc\x73\x7c\x15\x6d\x2a\x4b\x40\xb4\x38\xa6\x6c\xc1\x66\x9d\x4c\xb2\x89\x0d\xe8\x80\x9b\xe6\xfb\xe0\xd7\x6e\x11\x84\xf8\x82\x11\x2b\x02\xf0\xeb\xad\xe0\xc5\x2d\x3d\xf4\x35\xd0\x12\x45\x54\xa3\x36\x41\xe2\x2c\xa9\x10\xa0\x56\x80\xc8\xab\x5c\x22\x71\xc1\xf3\x4a\x8a\x86\x48\x4b\xbb\x94\x55\xa5\xd2\x5d\x06\x12\xb0\x5a\xb3\x47\x9b\xec\xe4\x28\xca\xcd\x16\x87\x13\xc7\x0d\x68\xd5\x44\x41\x09\x84\xe4\xda\x02\x9d\xe8\xb8\xa5\x29\x11\x80\x9a\x6e\x54\xa9\x7b\x4b\x36\x1d\x9b\x69\xa6\xa0\x00\x0f\xb4\x46\x57\x2a\x1d\xc5\x19\x8e\x9b\xd9\x8d\x1b\x70\xc8\x6e\xa0\x13\x6e\x71\x0c\xde\xd6\x62\x4f\xaa\x4f\x12\xff\x65\xad\xe0\x55\x5e\xc3\xdc\x71\x9c\xf3\xb3\xe6\xf6\xa3\x30\xcf\xe5\xe4\xd4\x3b\xd0\xd9\xf9\x53\x4e\xa7\x9c\x64\xdb\xd5\xd4\x1a\x1b\xbb\xc5\x2e\xfa\x85\xfd\xac\x91\xfe\x4a\xed\xf6\x9d\x05\xd1\xae\xf2\xb8\xec\x63\xc9\x00\x8b\x7c\x68\x7f\xf0\xf4\xc6\x3b\x6e\x1f\x0e\x3c\xb2\x31\x40\xf2\x97\xae\x00\x24\x77\x6c\x99\x5d\x57\x00\xc9\x34\x08\x34\x40\xd2\x8c\x88\xea\x2a\x1a\x06\x7b\xd6\x3d\x9d\x6d\x64\x8d\xd8\x6c\x5a\x5c\x31\x09\xef\x00\x2b\xf9\x59\x1b\x2b\xf9\xdf\x76\x88\x95\xfc\xa1\xc7\x29\xf6\xec\x72\x82\x25\x89\x4d\x8c\x1b\x1e\xb2\xc1\xad\x86\xb1\xaf\x86\xdb\xda\xb9\xc0\x8e\xf3\x9f\xc3\xe0\x58\xe3\x1d\x67\x6f\xc1\xa2\xb8\x48\x97\xb3\xbc\x2d\x3a\xe1\x45\x6f\x6f\x21\x4e\xc5\x69\x75\xe1\xa2\xb7\x3f\xaf\xd2\x89\xe2\x6c\x21\xf2\x8b\x9e\x5f\x54\xbd\x5e\x02\xa2\x73\x94\x80\x45\xaa\xb8\xe8\xed\x5d\x2e\xe0\x4f\x67\x6f\xfb\xe0\x18\x7b\x87\xc7\xbe\x1d\x1c\xb4\x73\x2a\x71\xd2\x74\xd1\x8e\x12\x84\x4c\xbc\xc4\x0b\xfa\xc3\x6e\xf2\x8e\x90\x9a\x0f\xa6\xc9\x5c\xa6\x74\xc3\xc8\x7f\x60\x24\x66\x88\xa8\xd1\x29\x99\xb8\xd0\x6f\x83\xe6\x5d\xa5\x96\x92\xe8\xa4\xdc\xcf\x2b\x02\x22\x28\x2b\xce\x2f\xb4\x98\x4f\xf9\x9b\x4c\xd2\x90\xc2\x7f\x5b\x2b\xf8\xa2\x37\x78\x5d\xab\x45\x49\xb6\xae\x36\x19\x79\x9b\x58\xee\x43\x8e\x79\xbd\x40\x56\x8d\x13\x07\x62\x4a\xc4\x41\xd6\xd3\xca\x87\x57\x15\x80\x9a\x01\x39\xbc\x17\xe5\x51\x57\x7e\x3f\x84\xb5\x00\xd5\x04\x64\xaa\x4f\x6d\xea\x24\xb4\x3b\x90\x1a\x6e\x17\xa8\x7c\xe2\x42\x73\xf3\x04\x74\x2b\x20\x7b\xc2\x25\x6f\x81\x13\xf5\xbe\x60\x1f\xf3\xd8\x93\xa8\x36\x95\xc1\xab\xf0\xdf\xe5\x05\xe7\xea\x17\x9b\x3a\x0d\x28\xdf\x7b\xf2\x6e\x48\x5d\xd6\xd0\x57\xe6\x21\xa7\xab\xec\x6f\xb8\x95\xdd\x32\x1c\x3b\x35\xe4\x1b\x54\xc3\xd8\x6b\x47\xd8\x53\x69\x76\x4c\x74\x3a\x93\x51\x0f\x4d\x8d\xb1\x28\xfc\x7f\x68\x05\xff\x67\xab\xf9\x9e\x12\x67\xe9\xae\xf2\xf4\xb7\xed\x47\x30\xdd\xa5\x22\x38\x82\x78\xbc\x7a\x0e\x32\x5e\xa5\x89\x28\x8c\x0d\x4b\xce\x58\x0d\x4a\x01\x6c\x60\x27\xcf\x7a\xe4\x22\x56\x65\xf7\x43\xce\x9f\x95\x55\x1a\x00\x02\xdd\x19\x59\xf7\xe5\xb8\x83\x58\x3b\xa4\xed\xc8\x05\x8f\xa2\xe9\x54\x9e\xf5\xec\x9b\xf2\xc0\xb0\x1f\x85\x66\x6b\x2f\x41\xdc\xed\x25\x71\x3b\x2e\x93\xbe\x9a\x63\xa3\x44\x40\x27\x3a\x0a\x8c\x42\x92\xb5\x9e\x7d\xf4\xa0\x53\xac\x6c\xf2\x46\xd8\xca\x5f\xf0\xd8\xbf\x51\x8d\x1f\xb6\x7d\xfc\xa8\x17\x3c\xec\x6d\xf2\x90\x31\x26\xd7\x06\x0b\x13\xca\x65\xb9\xf6\x57\x01\xd6\xa8\x2d\xc7\x42\xee\x32\x2b\x51\x9c\x62\xa8\x9d\xde\x5e\x0a\x8c\xba\x93\xe7\x6b\x2f\x02\x5f\x3d\xbd\xe0\x6e\x25\xaf\x18\x61\x4f\x5a\xce\xf2\xa5\xb8\xd3\x11\xe9\x42\xbf\x68\x97\x49\xe1\x7f\xa3\x15\xfc\x66\xab\x7e\xd5\x95\x52\xc4\x05\xdd\xb3\xfa\x41\xa9\x79\xc8\x27\xdd\xed\x2b\xcd\x52\x11\xf2\xe9\xa8\xad\x6c\x87\x72\x93\x88\xd5\x47\x24\xb2\xe5\xf8\x9e\x86\xb6\x40\x9e\x88\x38\xe5\xc1\xb5\x81\xfc\x07\xdd\x55\xed\xa8\x00\x0a\x9c\xb8\x70\x90\x49\x94\x75\x6f\x39\xbe\x00\x86\xa2\x7a\x53\x42\xbe\x80\x10\x94\x6b\x01\x03\x85\x44\x46\x74\x0f\x66\x88\x7e\x23\x64\x8c\x18\xe5\x8a\xe3\x1c\x30\xbc\xc1\x72\x96\x8d\x5f\x1b\xd0\x23\x05\xfe\x5e\x8a\xf2\x60\x54\xfd\xf9\x60\x30\xca\x45\xd9\x0e\xcd\xf3\x61\xed\xf9\xd0\x3c\x1f\x9a\xe7\x37\x98\x49\x3d\x76\x40\xee\x20\x84\xa1\xf1\xa3\x60\xc1\xfa\x59\x3b\x65\xac\x63\x90\x50\x45\xb8\xd1\xc2\x36\x7b\x97\xf5\x9a\x49\x8f\x87\x71\x94\xce\x0c\x78\x0e\x63\x26\x4d\xa0\xff\xcc\x60\xd2\x4a\x1a\xb8\x85\x53\x0d\xa9\xc0\xe5\x40\x98\xf7\xdc\x0a\xfe\xbe\xc5\x9e\x9a\x8b\xa8\x73\x26\x4d\xfa\xf3\x59\x56\x9e\x8c\x13\x81\x3a\xaa\xff\x9b\xad\xe0\x57\x5a\xcd\xf7\xf0\xe4\x20\x3a\x3f\x79\x04\xe2\xd6\x04\xa7\xbd\x9d\x96\x90\x18\xe3\x29\x05\x66\x0e\x0c\x54\xf2\xe0\xc9\xb3\xac\xc4\x14\x8c\xca\x79\xa8\xe2\x95\xcd\x6e\xe6\xec\x5c\x96\x14\x6a\x97\x88\x6a\xe0\xb0\x52\xa1\xc0\xb9\x85\x39\xa5\xac\x74\x44\xda\x57\x7d\x0d\xa7\x3a\x7d\xc0\x72\x94\x14\xa2\x56\x3b\xe8\x26\x5b\x69\xba\xec\x7b\x48\xbb\x5d\x48\x9d\x7d\xa9\x2a\x75\x12\x6e\xda\xc2\x50\x04\x42\x16\x22\xab\xe3\x3f\xd7\x62\x57\xe5\x55\x5a\xc6\x00\xa7\x2a\x0a\xff\x23\x2d\x36\xb9\xd5\x73\x67\xde\x7a\x71\x81\x8c\xec\x67\x90\x7b\x2e\xf8\xba\x67\x17\xab\x61\xe4\xf4\x94\x75\x90\x74\xe2\x76\xa9\xf0\x09\x30\x45\xc1\x63\x66\x17\x4d\x71\x0c\x91\xee\x30\xd7\x01\x91\x75\xe3\xb2\x54\x56\x73\xcc\xee\x63\x57\x0d\x78\x02\xfd\xb0\xd4\xf0\xe4\x32\x6a\x83\xd6\x30\x8d\x92\x21\xa0\x13\x32\xa7\xdc\x5a\x2a\x1a\xbb\x39\xae\x1b\x0a\x2d\x93\x3a\x1d\xf2\x3b\x3d\xb6\x97\x44\x13\xff\xcd\x5e\xf0\xbc\xb5\xe1\xf2\x95\xca\xe8\x0d\x19\xd7\x86\x89\x0b\x69\xc6\x1b\xa5\xaa\x45\x25\x2b\xca\xcd\x4a\x3d\xd1\xa7\x13\x54\x2e\xef\x83\xd7\x1e\xdc\x68\x0f\x79\x5f\x8b\xfd\x8b\x86\x53\xcc\xbf\xd8\x0a\xfe\xc9\x6b\x3a\xde\x9c\x9d\x7d\x50\x26\x20\xda\x4a\x13\x8c\x2d\x85\xd9\x4e\x53\x86\x52\xb7\xd4\xd4\xee\x74\x05\x55\xc6\x38\x7f\x93\x9d\x17\x19\x7e\x0e\x16\xe8\xf3\x15\x28\x0e\x83\xb8\x50\x15\xe5\x26\xf2\x42\xd3\xb7\x6c\x28\x2c\x6c\xd0\x69\x5f\xfb\x7f\xd9\x7b\x17\x30\x49\xb2\xaa\x4e\xfc\x8b\xac\xea\xd7\xed\x19\x90\x00\x05\x5d\xf7\xff\xdd\x7f\x0c\x6c\x75\x0d\x99\x59\x55\xdd\xf3\xa2\x19\x86\xa9\xa9\xaa\x66\x8a\xe9\xee\x29\xaa\xaa\x67\x00\x77\x96\x8e\xca\xb8\x95\x15\x53\x91\x11\x49\x44\x64\x55\xe7\xac\x7c\xcb\x63\x17\x84\x05\x59\x56\x50\xe8\xe5\x29\x2f\x1d\x44\x50\x50\x41\x50\x51\x77\xe0\x0f\xe2\xa2\x20\xb8\xa0\x82\x22\xae\xe2\x63\x5d\xdf\xee\xb0\xae\xff\xef\x9e\x73\xee\x2b\x33\x2a\xab\xaa\x7b\x06\x10\x5b\x3e\xa7\x2b\xe3\x71\xe3\x3e\xcf\x3d\xf7\x3c\x7e\xbf\x31\xf6\x18\x2a\xef\x5c\x5a\x84\xeb\x42\x6d\x86\x9f\x1d\x0b\x3e\x30\x56\x75\x67\xc7\x0d\x51\xa9\xb3\x3d\x78\xfa\x1b\xbf\x2b\xaa\xfa\x8c\xda\x13\xdd\xba\xda\x0c\xb1\x4d\xed\x75\x25\xc3\xad\x99\xe8\x21\x44\x55\x56\x35\xd6\xee\x0e\xf9\xca\x56\x16\x47\x64\x88\x41\x56\xf4\x1d\xf6\x5a\xda\xc7\xf6\xba\xd5\x5a\x8f\xef\x7b\xa7\x95\xab\x99\x8e\x81\xfe\xeb\xbc\x11\x4c\xa4\x03\x82\xf1\xd4\x0a\x86\x78\x0c\xc8\xc4\xbb\xa9\xac\x3d\x48\xc3\x6d\x79\x65\xbd\x20\x9b\x71\x5c\xe8\x9c\x1f\x0a\x42\x82\x63\xef\x5c\x96\x96\xe2\x42\xd9\x64\x11\x3b\x04\x8c\xc5\x8b\xf3\xfe\xb3\x82\x3b\xe8\xcf\xfd\x6a\x02\xf2\x95\x91\x5a\xc0\xeb\x3d\x76\x04\xca\xce\xf2\xb2\xf0\xbf\xdf\x0b\x4e\xe9\x5f\xf6\xb7\x70\xd6\xe1\x19\x27\xcb\x4b\xed\x6d\x76\x09\x85\xd7\x84\x4a\x45\x73\x06\xe0\x49\xec\xc6\x11\xdc\x5d\x03\xdd\x7c\x3b\x7d\x7e\x59\x7e\x81\xbd\xdb\x63\xe6\x50\xef\xbf\xc9\x63\xb7\xee\x63\x1f\xc3\xb7\x06\x07\xec\x7b\x74\x79\x97\xb2\x81\xd1\x9b\x14\x2f\x0f\x2f\x90\x84\x83\x80\xdb\x37\x78\x4c\x99\x23\xfc\x57\xed\x63\x72\xad\x2c\xc0\x3b\x83\x75\xbd\x93\xca\xda\x77\x4d\xd1\x0d\x39\x5c\xbf\x4f\x7b\xac\xc2\x30\xe2\x7f\xc8\x63\x8b\x7b\xae\xea\xd0\xeb\x83\xb5\x4e\x87\xbf\xb0\xd7\xd5\x61\xbf\xa9\x9c\x16\x72\x92\x8d\x5c\x29\xaf\x1e\x63\x8f\x52\x5b\x82\xca\xd9\x2d\xfc\xff\x5b\x0b\x7e\xb2\x36\x3b\x78\xb9\x6a\xd3\x8e\xd3\x24\x4e\x85\xc3\xa4\x89\x1d\xa7\xa2\x51\x8c\x4c\x23\xb5\x0e\x72\x19\xd6\x04\xec\x69\xc4\x43\x1d\x9a\x05\xc6\x67\x55\x5e\x0e\x9a\x56\x07\xad\x05\x69\xdf\xfa\x96\x46\xef\x56\x94\xde\x54\x1b\xc3\x06\xaa\xed\x35\xda\xd7\xcd\xd7\x84\x0a\xd9\xac\x2b\x24\x17\x04\xfd\xcc\xd2\x0c\xe2\xc2\xd7\x75\xa2\x12\x7a\x6a\x49\x99\xc1\x41\x98\x5b\x59\x5c\x84\x8f\x10\x21\x9e\xad\xfb\x38\x0b\xf7\x66\x36\x2a\x92\xac\xda\x60\x61\x52\xf4\xdf\x5f\x63\x0c\xd6\x1a\xca\xda\xb7\x8f\x22\x99\xad\x5a\xbc\x95\xe2\xf6\x4b\x9e\xb9\x77\x69\xeb\x17\x5f\xdd\x61\x01\xef\x49\x13\xb5\x8a\x91\x83\x57\x86\x9b\x02\x06\x15\xca\x74\x72\x5f\x48\x21\x29\x94\xbe\xa9\x5e\x73\xb4\x4d\x9a\x4f\x4a\xdb\x7c\xd0\x63\xdf\x4e\xb3\x79\x29\xcf\x5a\x67\xb2\x5e\x5a\xae\xf6\xbb\xa2\xf0\x7f\xd7\x0b\x7e\xd9\x9b\xad\xba\x55\x35\xab\x95\x5c\x76\x9f\x6c\x8e\x34\xfa\xc1\x24\x92\x75\xa5\xac\x5a\xe7\xdd\x01\x65\x15\xfd\x39\x56\xfb\xdc\x87\x55\x13\xd7\x93\xb0\x3d\xd0\xc4\x11\x9b\x33\x6d\x7a\x8b\x4b\x73\x6a\xd3\x5b\x5c\x9a\xdb\xef\xa6\x27\x5f\x19\xb9\xe9\x7d\xcc\x63\x8f\xdb\x49\x57\xf4\xef\xf7\x82\x57\x78\x3b\xdd\xa5\x18\x54\x31\xc2\x82\x16\xe5\x59\xb7\xab\x72\x15\x07\xf4\x64\xbe\xba\x21\x0a\x41\x48\xf1\xf8\x05\xea\x1b\xf5\x96\x5c\xcd\x06\xd8\x16\xb4\xe6\x51\xfd\xf5\xe5\x31\x76\x3b\x2d\xa3\xcd\xde\x9a\x68\x84\xed\x76\x2e\xda\x61\x99\xb9\x60\x04\x95\x90\x85\xb3\x4b\x8b\x14\x8f\x49\x90\x32\xaf\x19\x0b\x66\x07\x2f\xda\xc9\xb3\x72\x59\x47\x4e\x38\x33\xa6\x28\x86\xa9\x25\x69\x1c\xd3\xfa\x2f\xd7\xd8\x47\x5c\xbc\x9f\x9f\xa8\x05\x8f\x9f\x53\x49\x24\x14\x92\xab\x53\xf0\xc2\x6e\x4c\x1f\x77\xda\x7c\x0f\xfb\x1e\xf6\xac\x4a\xd1\x71\x19\x6d\xb6\x60\x7c\x76\x05\xe7\x79\x38\x28\x11\xf7\x8e\x1e\xc4\xfe\xf1\x08\x7b\xc2\x9e\x48\x7d\xfd\xcf\x1e\x09\x5e\xe1\x2d\x0f\x33\xfa\x1a\xeb\x0a\x32\xfb\xc2\x84\x4d\xc2\x42\x71\x4e\x12\x71\x2e\x46\x6a\xcb\x35\x33\x07\xe4\xc2\xfa\x10\x4a\x7c\x1d\x2a\x21\x3d\xdb\x4e\x45\x5e\x6c\xc4\x5d\xde\x09\xd3\xb0\x4d\x67\xed\x9c\x93\x16\xc3\x73\x01\xfa\x47\x9c\xb6\x9b\x17\xbd\xc3\x9d\x2c\x8d\xcb\x2c\x77\x1d\xca\xef\x3a\xcc\x5e\xeb\x51\xb8\xf2\x2b\xbd\xe0\x05\xde\x9d\x14\xa4\x8f\xb1\xc0\x4a\xb4\xe7\x61\x94\x15\x18\xc2\x20\xcf\x43\xfa\x2c\x85\x18\x58\x9d\x38\xdd\x0f\x0d\x3d\x32\x26\x1b\x1e\xfa\x6b\x36\xb2\xed\x46\x99\x35\x7a\x85\x68\xc4\xa5\xbd\xac\xde\xe1\x31\x5d\x6d\x38\xf2\xab\x08\x89\x93\xfc\x0c\x5d\xae\x44\x1b\x92\x9d\xad\xde\x7b\x28\x6b\xb6\xe3\xfa\x17\x6c\xbc\x1b\x96\x1b\xfe\x3d\xc1\x92\xd3\x81\x91\x4a\xb3\x57\x14\xb6\x79\x96\x95\x75\x9e\x87\x94\xf4\x10\xaa\x70\xb8\x24\xc1\x5a\x97\xb9\x70\x7b\x77\xca\xfe\xcc\x7f\xf3\xd8\x61\x65\xae\xf3\x7f\xd1\x0b\x7e\xd2\x1a\x2e\x1b\x80\x01\xcd\x5d\xc0\x37\x39\xb5\x9d\xc7\xa5\x98\x6c\xf2\x65\x7a\x0f\xad\xf3\x96\x31\x0f\xf6\x44\x75\x53\xd9\xba\xe3\x94\x12\x01\x61\x27\xa9\xf6\xd4\x5f\x6a\x2f\x5a\x3b\xc0\xcf\x7b\x8c\x21\x6b\xb9\x5c\x1b\xfe\x7b\xbc\xe0\x2d\x56\x93\x56\xf4\x1d\x0d\x4a\x12\x96\x1b\xb2\x81\x9b\xa2\xcf\x73\x65\x93\x3f\x07\x41\x41\x76\x9f\x89\xb2\x05\xb5\x98\x92\x33\xb6\x89\x1f\x78\x78\x66\xe8\x9f\x78\xec\x08\x96\xbf\x2c\xd6\xfd\xdf\xd9\x0b\x39\xf2\xe9\xac\x15\x26\x98\x92\xb8\xac\x20\xce\x83\xb7\x0e\x35\x7b\x59\xac\xf3\xd8\x42\x41\x57\xe6\x9e\xc1\xd4\x0c\x6c\x5c\x65\x3f\x10\x4e\xe4\x43\xd6\x70\xf6\xe0\x55\x0e\x30\x98\x96\x80\x10\x42\x7e\x26\xec\x3a\x42\xf0\x57\xaf\x0a\x1e\xa8\xcd\x46\x61\x17\x05\xa0\x7a\x86\xc7\x29\xc4\x32\xe2\x27\x47\xe7\x46\xe9\x97\x2a\xd2\xa3\xd6\x84\x8b\xf9\x17\x6a\xea\xe8\x02\x8c\xb7\x36\xdd\x86\x94\xe4\x4a\x15\xb1\xca\xa1\xb5\x09\xa6\x5e\x48\x58\xaa\xdb\x0e\x36\x8c\x0d\x11\x78\x0c\xaa\x40\x25\xd5\xc9\xe0\x9d\xb0\xdb\x85\xec\xee\x6c\x1d\xbf\x54\x66\xca\x4d\x69\x5a\xad\x44\xf8\x48\xd9\x2d\xb5\x8e\x0a\xe1\xed\x48\xec\xbf\x3d\xc2\xfe\x78\x8c\x1d\xa5\x61\x3e\x93\x45\xc2\xff\xc2\x98\x22\xe8\xf8\xaf\x63\x66\x1a\x75\xb2\x48\xf0\xb5\xb8\x34\x10\xaf\xf2\xd4\xd4\x95\x1a\x1c\x06\xd5\xf2\x2c\xd5\xf9\x17\xd8\x63\x6b\x3a\x43\xc2\xc2\xcb\x49\x79\xd6\x2a\x55\x58\x8f\x3c\xf2\x6c\x0b\x91\xf2\xe9\xe9\xe9\x69\xa8\xef\xf4\x8d\x37\xde\x88\xa9\xdc\x91\x68\xc5\x9d\xe1\x07\xe1\xa9\xeb\x67\x66\x9a\x98\xcd\x8d\x99\xd4\x14\x48\x87\x25\xcb\x07\x9c\x97\x8b\x3a\x26\x61\x6b\xbd\xd6\xbd\x0b\xb3\x5d\x37\xcf\xc5\x9e\x99\xbe\xe1\xba\xeb\x9a\x7c\x9e\x08\xea\x63\x4a\xc1\x53\x6a\xa8\x14\x1f\x8a\xf4\x36\x04\x4f\xb9\x3a\xcf\x62\xaa\x6e\x69\xb2\xe6\x3b\x71\x7b\x83\x1c\x94\x90\x48\x91\xc4\xad\x12\x07\x1e\x80\x2e\x34\x11\x0c\x9e\x25\x91\xe0\x41\xcf\x26\x59\xb9\x3a\x82\xc4\x90\x5d\xca\x09\xab\x95\xeb\x93\xce\x9b\x58\x98\x19\x2b\x79\xfa\x71\x50\x0f\xee\x1f\x57\xf1\x4a\x6f\x1e\x0f\xbe\x3c\x36\x18\xa9\x00\x81\xfc\x6e\x72\x60\xc5\x4c\x77\x73\xfe\x5a\x22\xb2\x66\xa6\x59\x4d\xd9\xbd\xd8\x21\xb0\x42\x21\x80\x4c\xaf\xa8\x10\xdb\xb5\x0d\x5c\x37\x36\xcd\x8c\x94\xc4\xa0\x2c\x13\x10\x2a\x5d\xa6\x33\xd8\x70\xe8\xbd\xd4\xae\x44\x84\xeb\x64\xc4\x97\x0d\xb9\x10\xac\x24\xc2\xe6\x49\x87\xde\x26\x05\x5d\xc3\xfb\x2e\x4a\xcd\x49\xd6\xc9\xce\x9e\x20\xb3\x19\x41\x8b\xa8\xac\x4a\xea\x25\xdd\x11\x75\xbb\xc9\x85\x28\x7b\xd4\x35\xc0\x56\xa1\x04\x03\xda\x7a\x3b\x61\xbe\x29\x22\xae\x12\x1a\x9b\x1c\x63\x16\x94\xa1\x42\x2e\x5d\x08\xc1\x50\x21\x70\x36\xeb\x89\xfc\xc8\x44\xb3\x39\x81\x93\x31\xcb\x91\xc5\x0a\x67\x96\xbc\xee\xa8\xdc\x4d\x56\x67\xd7\xee\xba\xa3\xdc\x21\xfa\xab\x19\x44\x27\x7c\x93\x24\x7b\xae\x58\xc9\x9e\x4f\x0b\x9e\x54\x95\xec\x69\xe6\x5f\x96\x83\x97\x1c\xc6\x74\x54\xee\xe7\x2b\x9f\xc2\xbe\xbb\x7a\xf3\xc1\x63\x9d\xff\x3f\x6f\x0e\x66\x35\xe6\x01\xc4\xcd\xb7\x42\x1b\x78\x08\x35\xae\x12\x5c\x39\xdb\x61\x5a\xda\x9e\x46\x65\x39\xaa\x24\x59\x7a\xcd\xcd\xec\x85\x35\x76\x75\x12\x6f\x89\x54\x14\xc5\x52\x9e\xad\x09\xff\x7f\x79\x7b\x48\x14\x81\x47\x83\x07\xbc\x25\x91\xc7\x59\x14\xb7\xe4\x54\x5f\x53\xc8\x40\x54\x27\x55\x2c\xec\x16\x74\x4d\xad\x8c\x5c\xc0\xec\x30\xa6\x24\x7c\x7f\x3d\x8c\x93\xa2\x32\x56\xef\x92\xb9\x9c\xbb\x19\xfe\xa7\x21\x0f\x21\xad\x7e\x2b\x11\xd7\xe8\x2a\x36\xe0\xab\x05\x7b\x4b\x8d\x3d\x42\xea\x94\xb1\xe9\x85\xef\xaf\xed\xb9\x17\x7e\x7f\x64\x2f\xa8\x43\xa8\x2e\xbf\xba\x3b\x3a\x00\xed\x0d\x67\x7a\xf5\x86\x0a\x6d\x2c\xbe\x29\xfa\xe8\xcb\x1e\x3b\xa2\xc3\x4e\xfd\xdf\xd8\x8b\x42\xa8\x63\xac\xad\x1c\x96\xe0\xa2\x37\x97\x75\xba\xbd\x52\xe8\x5c\x82\xc2\xd8\x2a\xd4\x8e\xe5\xb8\xfe\x2e\xb7\x9d\x4e\xb6\xe0\x14\x6a\x25\x3a\x02\xbb\x68\x18\x9f\xff\x14\xfb\x4f\x35\xf6\xc8\xc2\x35\xff\xfa\xff\xc7\x1b\x01\xa9\x61\xa5\xda\xdb\x2f\x05\x1f\xf3\xd4\x15\x6b\x3f\x25\x73\x11\x7a\xf4\xd5\x02\xdd\x77\x73\xd0\x34\x35\xa5\xaa\x09\xf5\x17\x17\xca\xa9\x3d\x96\x53\x86\xc5\xa6\xe9\x13\xd1\x90\xc3\xae\xbb\x60\xb8\x54\xf6\x1b\xe3\xec\x2a\x58\xab\xbd\x2e\xae\x8c\x5f\x1e\xdf\xf3\xca\x78\xed\xf8\x8a\xf5\xe6\xa0\x31\xb0\x44\x9e\x64\x70\xff\x15\xbd\x56\x4b\x14\x85\x3c\x2f\xf6\x39\x14\x8c\xc0\x71\x83\x3b\x6d\x9a\x91\x62\x81\xb3\x12\x74\x1e\x71\x41\xb4\x7a\x90\x89\x90\x96\x71\xa2\x26\x90\x3c\x06\x94\xc2\x2d\xd9\x98\x5f\xad\xa5\x54\xd7\x15\x19\x12\x4e\x75\x7e\xaf\x94\xdb\xa1\x5e\x81\x8e\xa4\xe4\x48\x20\x60\xd1\x4c\x2a\x33\xbb\xd4\x93\x31\xdf\x8c\x47\xf1\x3a\xee\x50\xf4\x49\x1d\xd3\x58\x28\x67\xf5\x9a\x68\xc7\xc8\x0e\x0a\xd6\x91\x25\x30\x01\xeb\x85\x58\xd7\x84\xfd\xa8\xb7\xa1\x31\x98\x27\x99\x3c\x01\x00\x9a\x59\x06\x28\xc7\x08\x84\x92\xe5\x7c\x3b\xcc\x3b\xe0\xd5\x6e\x6d\x00\x62\x79\x98\x2a\x66\x46\xa0\x51\xeb\x37\xc8\x1a\xd6\x25\x7c\x2b\x53\xfd\xaf\xab\x38\x79\x60\x8c\x7d\x07\x1a\x5d\xa1\x16\x67\x10\xa6\x4c\xee\xf5\xfe\xfd\x63\xc1\xeb\x2d\x75\x7f\x09\x74\xdb\xd2\x42\x17\x00\x8d\xad\xcc\xac\x2b\xba\xf8\x89\x82\x5b\xa5\x6a\xf4\x33\x35\xb2\xdb\x79\x5c\x96\x02\xf0\xbb\x94\xe1\x42\x6b\x66\x76\x19\xeb\xda\xa0\xd5\xe4\x67\x54\x19\xe6\x5d\xa9\xc2\xa6\x91\xb6\xad\xae\xe5\xb1\x58\xe7\xeb\x71\x1a\x26\x04\x5c\x43\x84\xb5\x21\x5a\xcd\x8b\x42\xe4\x98\xa9\x1c\xc6\x49\x2f\xd7\xa0\x6c\x4d\x7e\x37\xd5\xab\xcc\x7b\x29\x66\xd3\x90\x0f\x0a\xd3\xb8\xd7\x79\x1b\x8e\x31\x64\x51\xb9\x6e\xfa\x49\x37\xf0\xb5\x7e\x29\x28\xed\x11\xd9\x39\x55\x1b\x13\x91\xb6\x65\x4f\x19\x62\x3d\x2b\x9a\x49\x75\x00\x30\x58\x62\xc5\x67\x8e\x6f\xae\xb9\x47\x8c\xa9\x48\x6c\x4d\x59\xdd\xd7\x48\xb2\x76\x95\x00\xb6\x35\xa2\xbf\xf0\xd8\x55\x5b\x96\x41\xc5\xff\x5d\x2f\xb8\x5d\x2e\x26\x75\x2e\x2c\x33\xb2\x09\xee\xda\xd1\x55\x1f\x32\x1a\xe3\x34\x6b\xb2\xfa\xae\x72\xc7\xb2\xed\x3c\xe8\xd5\x77\x31\xaa\x5e\xe5\x33\xa8\x1a\x68\x98\xfb\x48\x04\xfe\xdc\x18\x3b\x24\xd2\xad\x53\x79\xd6\xf1\x3f\x31\x16\x7c\xdf\x98\xe2\x02\xd2\x58\x9e\x16\x84\x4a\x35\x7c\x8a\x62\xab\x33\xfb\xdc\xaa\x3a\xce\x2b\xd4\x2b\xad\xbd\x29\xe2\x44\xcd\xfa\x30\xf7\x9c\xc5\xf9\x85\xb3\xab\x8b\xa7\x16\x17\x96\x91\x6a\x22\x46\x9a\x05\xf7\xf4\x91\x0b\x79\x20\xa7\xb0\x0d\xc2\x04\x31\x71\xd3\x46\x43\x91\x27\x0a\x29\xef\xe0\x88\x08\x68\x65\x78\xd2\xd0\xa4\x80\xbc\xd3\x4b\xca\xb8\x9b\xa8\x5c\x7c\x12\x99\x0a\x6e\xb3\xc8\x5a\xb1\xb1\x1e\x94\x0a\x6b\x91\xaa\x0d\xb5\x01\xa9\xd5\xcd\x45\x4b\x44\xf2\x94\x46\x64\xc1\xa6\xad\x6b\xf2\xac\xc5\x17\xd2\x2d\x15\xb4\x16\xf5\x50\xcb\xc5\x73\x58\x75\x19\xa3\xe7\xcb\x71\x36\xcd\x9a\xbb\xce\x97\x05\x1c\x46\xb4\xec\xb0\x4f\x79\xec\x40\x51\x46\x71\xea\x3f\xe0\x05\x3f\xed\xdd\xad\xd5\x7a\x5b\x25\x51\x1b\x78\x98\x24\x19\xf2\xca\xf0\xb5\x9e\x14\xf2\x70\x7a\x87\xd7\x87\x86\x57\x05\x97\x99\x0d\x88\xce\x6c\x85\x28\xeb\xa0\x1a\x52\x4a\xcb\x0e\xaf\xdb\x38\x63\x74\xcc\x8e\x53\xbe\x70\xe7\x29\xbd\x80\x65\x81\x60\x1d\x75\x3d\x51\x2f\xf0\xd8\x58\x59\xf6\xfd\xfb\x82\x64\xcf\xad\x59\x5d\x7d\x16\x3a\x8a\xcb\x42\x24\xeb\x75\x1e\x26\x45\x66\x2c\x16\x13\x50\xc5\x09\x12\x7d\x90\x43\xb0\x4b\x1d\xfe\xca\x63\x57\xa3\x34\x98\x17\x52\xb1\x2d\xfc\xdf\xf3\x82\xa7\x39\x57\x06\xb3\x22\x91\x5e\x23\xa2\x9b\xf8\x29\xdb\x45\x6f\xd6\x8d\x3d\xe4\x33\x6c\x8a\x35\xf6\x28\x22\xf0\xc3\x0f\x7a\x8d\x5d\x64\xc4\xd5\xfe\x51\xac\xc6\x7e\x85\xc4\x47\x3c\xc6\xe8\x6c\x39\x1f\xe7\xfe\x4f\x78\xc1\x5b\xbd\x39\x4b\xf2\xd1\x3d\x1e\x91\x45\x07\x95\x13\x98\x13\xae\x61\x61\x68\x12\x4d\x14\xda\x16\xaa\x96\xba\xec\x9b\x3a\xed\x87\xda\xbe\xa3\x75\xbc\x68\x78\x42\xc5\x1d\xd8\x7f\x46\xcb\xf6\x57\xd4\xd8\x01\x78\xd0\x7f\x51\x2d\xf8\x1b\x6f\x3e\x6b\x6d\xaa\x57\xc1\x54\x72\x29\x9a\xb8\x52\xb5\xa1\x94\x62\x80\xb5\x48\x9d\xad\x4d\x56\xcb\x46\xdc\x96\x73\x36\x11\x5b\x22\xa1\x06\xd9\x76\xc5\x32\xd3\x5d\x91\xe5\x5c\x9e\xe9\xf3\x38\x1a\x6a\x27\xc8\x30\xa5\x9e\xa8\x50\xf8\x44\x6e\x8b\x60\xc8\x9a\x17\xdd\x24\xeb\x63\x86\x3d\x18\x2a\x0d\xd0\x96\x0b\x14\xfc\x25\x8f\x8d\x89\x74\xcb\xff\x4d\x2f\x58\x54\x22\xbf\x5a\xbc\x93\x4d\x72\x58\xca\x8f\x96\x59\x4f\x64\x93\x6c\x62\x2f\x32\xeb\xae\x30\xdf\x93\xcf\x50\x8e\xd2\x7e\x26\xed\x8f\x78\xec\x88\x56\xda\xfc\x8b\xde\x1e\x6c\x34\xa7\xd5\xe3\x41\x32\xdb\xb2\x2c\x87\xe0\x1c\x32\x23\x45\xee\x41\x92\x36\x20\xcb\x81\x5d\xbb\xe8\x66\x69\x01\xda\x9c\x6d\x38\xa0\x22\x71\xcf\xaa\x3c\xec\xb2\xd7\x28\x8b\xd0\xcb\xbd\xe0\xdf\xd9\x26\xa1\xa1\x30\x6c\x15\xb8\x38\x7f\x76\xe5\x39\xa7\x67\x6f\x5b\x38\x4d\xf1\x91\xd6\x2c\x51\xe1\x35\x86\xa7\x29\xe4\xbd\x34\x7e\x6e\x8f\x6c\x82\xc7\xf4\xbb\x93\xbb\x2d\x9a\xaf\x8d\xb3\x43\xad\xac\xd3\x09\xd3\xc8\xff\xf3\xf1\xe0\xd3\xe3\x0b\x69\x99\xf7\x31\x47\x11\x86\x19\x51\x63\xf4\xa1\xc5\x6c\xf3\x1b\x22\x49\x50\x0f\x88\xac\x95\x36\x51\xf0\x85\xb3\xab\xcb\xcf\x5a\xba\x73\xf1\xec\xaa\x0e\xea\x8b\xdd\x6d\x84\x4e\x1b\x91\xdc\x58\x71\x0e\xda\x2c\xb3\x8f\x3f\x76\xd7\xec\xf2\x73\xce\xce\x9e\x59\x98\xa4\x03\x53\x37\x04\xf5\xd5\x38\x12\x6c\x9d\xcc\x9a\xd2\x64\x77\x54\x13\x7b\x47\x4a\x5c\xe3\xcc\xa1\x29\x1f\xa7\xdd\x5e\xa9\x12\x40\xb5\x94\x4a\x35\x2c\xb2\x6c\xa5\x5d\xad\xa2\x9f\x96\xe1\x05\x75\x88\x12\x45\x2b\xec\x6a\x92\x34\x1e\x65\x3d\xf9\xf1\xc7\x3f\xbe\xce\x63\x71\x92\x3f\xde\x7a\xb1\xc9\x17\xe8\x59\xab\xbd\x68\x40\x15\x5b\xc0\x9e\xae\x5b\x2b\xf7\xd9\x76\x98\x47\x60\xee\xcc\xd6\x07\xe0\x69\xa9\x81\xa4\xf3\x00\xbc\x42\x79\x19\xc6\x07\x3c\x65\xc7\xe9\xbd\xa2\x55\x36\xe4\xd1\xac\x61\xd9\xed\x70\x49\x89\x06\x4d\x93\x46\x98\xb7\x01\xa9\xdd\x3a\x87\x5f\x93\xf7\xe0\x4c\xd8\x08\xf5\x53\x71\xda\x08\x1b\x30\x49\x46\xf8\x6b\x5f\x52\x63\x8f\x84\x69\xb3\xd4\x4b\x12\xcc\x70\xf4\xff\xca\x0b\xfe\xc0\x5b\x04\xa9\xdd\xed\x25\x09\xc5\xb6\x34\xf9\x9d\x88\xae\x30\x0b\x6a\x45\x9d\x9f\x95\x1d\x56\xe7\x8b\xeb\x67\xb3\x72\x49\x99\x9d\xed\xe3\x01\x3e\x28\xa7\xde\x49\xca\x8c\x2e\xc3\xf6\x00\x9a\x4f\x96\x3b\x05\x18\xf2\xac\x87\xc8\x90\xe3\x6e\x1f\xd7\x40\x49\xb2\x9b\xf0\xb7\xdd\x13\xaf\x3e\xc0\x0e\x74\x21\xe8\xf4\x65\x07\x82\x97\x69\x15\x1d\x2e\xc9\xd6\x60\x20\x69\x65\x14\xcd\x82\xbc\x05\xa8\x6f\x18\x8c\x0a\x8e\xe5\x76\xbc\x45\x71\x48\x24\xca\x0c\x45\x56\x45\xc8\x0a\x9c\xe1\x28\x4b\xa6\x95\xa5\xa9\x20\xd1\x18\xda\x39\x6f\x85\xd4\xa4\x21\xed\x02\x92\x5c\x3a\x61\x1e\x83\xf5\x43\x17\x16\x26\x28\x2c\xb0\x83\xfb\x83\x55\x9a\xbf\x73\x61\x85\x9f\xbd\x73\x55\x6a\xc5\x5b\x42\x85\x5d\xc0\x7d\x68\x16\xa5\x19\x50\xc4\x2c\x9f\x4d\xfb\x78\x53\x7b\x0d\xc0\xeb\x80\xa6\x87\xd4\xc9\x0c\x0b\xa6\x9b\xf0\xbf\x40\xb6\x32\x07\xff\x00\x04\x81\x3b\xf5\xd7\x29\x7d\x60\x60\x89\xe5\xf2\xd1\xbd\x49\x6d\x7f\x68\x94\x74\xad\x36\x2d\x65\x79\xf9\xa0\xf7\xe4\x91\x71\x2d\xff\xd2\xff\x17\x0d\x53\x49\xf9\x06\x6b\x48\xf9\x58\x66\xad\x2c\xd9\x0b\x53\xd6\x83\xde\xf4\x2e\x1b\xeb\xb7\xf9\x8f\x70\x3f\xb0\x8f\x1d\xf6\x37\xc7\xd9\x11\xd0\xa0\xef\x4c\x5b\xc2\xff\xf8\x78\xf0\xb3\xe3\x77\x5b\x82\x68\x48\xd9\xd3\x68\x05\x49\x46\x89\x3e\x78\x44\x90\x92\x34\x15\x09\xc1\x89\xc5\x18\x44\xbf\x26\x44\xca\xb3\xae\x50\x47\x2a\xed\x33\x28\xcb\xb0\xb5\x41\x87\x3b\x3a\x62\x14\x98\xfc\x64\x4a\x2c\xca\x5c\x84\x1d\x05\xd1\xd9\x01\x86\xc3\xae\x3c\x0c\xa2\x41\x41\x9f\x01\xb1\x30\x5e\x10\x82\x11\x5a\xe8\x54\x8b\x14\xf7\x24\xe5\x56\xd5\xcd\xd7\xa8\x5a\x8e\xd7\x02\x8e\x9d\x75\xed\xd1\xd7\x06\x3c\xc5\xb2\x47\xf9\xfc\xf8\x45\x52\xab\x64\x79\xda\xe7\x98\x6a\x2a\x47\xac\x6a\x1a\x69\x37\x2c\xd8\xc3\x4c\x81\x54\x14\xd0\x63\xc0\x72\x2c\xea\x96\x51\x09\x3a\x5a\xd5\x14\xba\x3a\xa2\x84\x0f\x2c\x9d\x2e\x59\xc5\xd9\xa7\x67\x6d\x2f\xb4\xc2\x3b\x13\x14\x8d\xeb\xc8\xaa\x60\x2f\x1b\x4a\x97\x54\x56\xd0\xa1\xc3\x9f\xb5\x7b\xc9\xc3\x2e\xba\xdb\xaa\xcf\x7a\xce\x31\xeb\x7f\x8c\xb1\xc7\x55\x58\xd4\x70\x0f\xf8\xf8\x58\xf0\xa1\xb1\x45\x45\x69\xb8\x91\x6d\x63\x34\x42\x85\xa9\xcc\xe0\xae\xeb\xb0\x80\x26\x04\x78\xd9\x64\x1b\x03\x81\x0d\x95\x76\xbc\x21\x20\x59\x67\xdc\xcb\x5e\xa1\x3f\x99\x51\xda\x0d\x99\x6a\xa1\xe7\xc9\x54\xd6\xe4\xa7\xc2\x24\x59\x0b\x5b\x9b\xab\xd9\xe9\xac\x5d\xdc\x99\x2e\x80\xd7\xd2\xa9\x0b\x98\x1b\x5a\x1b\xbd\x74\x73\xc0\x01\x95\xb5\x79\xd6\x2b\xa5\x26\x42\xf6\xdb\xaa\x06\xaf\x53\x18\x0e\x4e\x41\xe5\xcc\x36\xa5\x88\x0b\xb1\x4d\xd8\x8a\x1c\xff\xa0\xc0\xd8\xe5\x17\xb6\x69\xed\xf8\xf4\x75\x37\xa1\xa1\x4e\x6e\x88\x37\x4d\xf3\x24\x4e\xa5\xac\x87\xd9\x06\x23\x2b\x97\x49\x27\x94\x87\x10\x77\x8f\x95\x1d\xbd\x9b\x86\xf9\xa5\x71\x36\x1e\xe6\xed\xc2\xff\xdc\x78\xf0\xc1\xf1\x59\x52\x1e\x34\x6a\x89\xd0\xfa\x66\xa5\x32\x39\x77\x66\xfe\x8a\x16\x79\x45\x8b\x1c\xa9\x45\x7e\xa2\xc6\x78\x15\x5c\x67\xd8\x11\x45\x37\x6c\x21\x2c\xea\xdb\x6b\xc1\x0d\xce\x95\x9d\xb1\x51\xa5\x5a\xc4\xf5\xb3\x6e\xd8\xcf\x17\x3d\xf6\x5b\x1e\x63\x60\x3d\x8f\xef\x13\x79\xe1\x7f\xd2\x0b\xde\xe3\x9d\xd2\xbf\x29\xf6\x3c\xeb\x86\xf2\x38\xa6\x13\x21\xed\xf8\x7a\x95\x47\x41\xd8\x81\x10\x0b\x14\xa6\xc8\xf9\x81\xae\x55\x05\x2d\x43\x72\x16\xf9\xd8\xf6\x35\x0a\x0a\xfc\x54\xe4\x8d\x56\xd2\x93\xff\x62\x94\x80\x6c\x51\x31\x35\xa2\x33\x3f\x79\x95\x13\x5d\xeb\x10\x6f\x2a\xce\x4d\x4c\xa3\xfd\xe1\xab\x82\xbf\xaa\xd9\x57\x06\xf1\x13\x5b\x70\xd1\x25\xdb\xac\xdb\xc1\x2f\x64\x1e\xa3\x5b\x7c\x05\xb2\x45\xe4\x2a\x39\x1f\xe3\x25\x28\xa1\xe9\x36\x32\x2e\x1a\xa4\xf7\x35\xe0\xf6\x79\x0e\xf3\x95\x42\x0c\x5c\xb7\x96\x66\xc5\xa5\x4c\x13\xee\x54\xd7\xec\x1d\x56\xd2\xa0\x0e\xbc\x22\xd3\x32\xe9\x24\x03\xed\x24\x6b\x31\xa4\x02\x02\x9d\x85\xa9\x82\xa3\x4f\xa4\x62\x5b\x37\xcf\x90\x67\xc9\x25\x0e\x91\xe2\xd4\x45\x56\x84\x8c\x52\x52\x35\x6e\x29\xb0\x06\xd0\x46\x8a\xdd\xe1\xcc\xc7\x9f\x39\x7c\x05\x89\xea\x0a\x47\xc0\x37\x0e\x10\xea\xd3\x36\x20\xd4\x03\xde\x65\xf2\x82\x04\x2f\xf2\x34\x26\x14\x76\xe6\x44\xf1\xf5\xc7\x85\x62\x5f\xf6\x88\x9e\xe4\xf3\xde\x08\x84\x9a\x9d\x45\x23\xd0\x94\xbc\xc1\x83\x5d\x26\x76\x29\x4a\xaa\x08\x88\xe1\x9d\x87\xbd\x75\xb2\x41\x0d\xb9\xa7\xa2\x3a\xfb\xa0\xd7\xda\x1d\xfc\xea\x56\xff\x16\x07\xfc\xca\xe0\x5e\x59\x8d\x1f\xe0\x09\xb5\x1b\xc5\xd8\xa7\x8f\x38\xd1\x62\xf9\x5a\xd8\x32\x69\x6d\x59\x22\xfc\x9f\x38\x12\x7c\xda\x93\x7f\xe1\x9a\xd3\x9b\x54\x54\x97\x0a\x6b\xdc\x52\x89\x8f\x14\x71\x30\x84\x70\xa8\xb3\xf2\xf5\xae\x02\xd6\x53\xd9\x55\x78\xa8\x94\x65\xdf\x26\x37\x82\xb4\x2d\x95\x57\x85\x86\x2d\x95\xb6\xad\x99\xe6\xcc\x8d\x40\x01\x17\x6e\x21\x30\x3f\xd4\x0f\x73\xf1\xe3\xfb\x30\xe0\x40\x85\x66\xcf\x40\x49\xc4\x15\x85\x31\x8f\x10\xd7\x80\x0a\x17\xf1\x6c\x62\xa1\xc7\x8f\xbb\x42\xfa\xcb\x07\xaf\x08\xe9\x2b\x42\xfa\x1b\x27\xa4\x37\x2c\x19\xfd\xaf\x2f\x57\x44\xff\x8b\x11\x12\x9a\xf5\xd9\x81\x1c\x90\x4b\xbb\x41\x03\x17\xe9\x46\x96\x44\x18\xdf\x81\x71\x4b\x66\xf9\x6a\x12\x36\xb9\xae\x6c\x8d\xf4\x3a\x76\x7c\x44\x0c\x9b\x23\x42\x6c\x0c\xd1\x8d\xdd\xe5\xd9\x82\x3f\xd7\x20\x31\x25\x3f\xea\x12\xd3\x0c\x20\xfb\xed\x28\x0a\x18\xfb\xd4\x51\xf6\x78\xab\x46\x6b\x61\xd9\xda\x30\xa4\xdc\x79\x96\x3e\x3d\x5b\x83\x43\xc7\x3b\x8e\x06\xcf\xb2\x7e\x5b\x47\x0e\x65\xd3\xb8\x37\x5b\x23\xe7\x0a\x10\x07\xc6\xc0\xe6\x9a\x6d\xa2\xab\x8f\x68\xe9\x52\x0d\x74\x13\xb6\xca\x1e\xa2\xf4\xf4\x52\x00\x4b\x46\xda\x04\x71\xd1\x3b\x7a\x6f\xb6\xb6\x2a\x3a\x5d\xb9\xaa\x1d\xd9\xf3\x56\xc6\x7e\xc1\x63\xdf\x65\xe2\xca\x9e\x9e\xad\x15\xb7\xc7\xf2\x50\xd1\x3f\x1d\x77\xe2\xd2\x7f\xb3\xa7\xd2\x16\x5e\xe6\x49\xe5\x1b\x29\xd5\x10\x00\x5a\xbd\xc4\xe5\x50\x00\x71\xeb\xbd\xd9\x1a\x62\x03\x09\x79\x6a\xb3\xb3\xb0\x61\x89\xc8\xb5\x93\xf1\x28\x2e\xe4\x12\xec\xc5\xc5\x86\x4e\x40\x50\x69\xe3\xfc\x3e\x91\x67\x08\x3f\x66\x7b\x8f\x5d\xc3\xc2\x09\x37\xf8\xfe\xcd\x1e\x3b\x54\xf4\x8a\xae\x48\x23\xff\xd5\x5e\xf0\x1f\xbc\x55\x6d\xb5\x2a\x45\x42\x38\x61\xc6\x53\x8a\x6c\xb1\xf0\x38\xc2\xa7\x3f\xb7\x27\x97\xac\xee\xe7\x02\xd8\xea\xa2\x4c\xa0\x21\x41\x9e\x52\x11\x9f\x23\xc9\x45\x18\xf5\xb9\x0a\xf6\x35\x2f\x34\xf9\x70\x62\x97\x1b\x36\xf0\xc9\x1a\x7b\x54\x2b\x4b\x91\x11\xac\x45\x70\x8d\xfe\x4f\xd7\x82\x1f\xa9\x11\x40\xbe\x1a\x75\x79\x36\x10\x21\x44\xa2\x2b\xfe\x30\xf3\x21\x8c\xaa\x7b\x7a\xb6\x06\x41\x27\x71\x64\x51\x11\x9e\xe4\x0d\x1e\x40\xbe\x73\xc0\x8f\xd1\x91\x60\xf2\xa4\x4a\xfa\xa5\x69\xa6\x71\x9b\x4c\xe9\x49\xff\xc9\xf2\xcd\x53\x80\xc7\x15\x9c\xd4\xc0\x5c\xd6\xf7\xf3\x9e\xec\x93\x62\x33\x86\x0c\x1a\x9e\x8a\x0b\x70\x8d\xc7\xeb\x60\xac\x8f\xb3\x1e\x00\x0e\xc9\xf3\x4e\x3a\x51\x9a\xc9\xd0\x17\x25\x94\xbd\x2c\xba\x49\xd8\x12\xc1\x49\xb9\x1d\xb7\x44\x62\xb3\x58\xd2\xa1\x1e\x66\x3a\x1a\x29\xe1\xd9\x02\x27\x35\x82\x4b\x89\x6d\x9e\xa5\x62\x00\x4a\xee\x3b\x30\x60\x71\x68\xbe\xbe\x5e\xcf\xd7\x17\x0f\xcc\x57\x7c\xe1\xeb\x3d\x57\x67\xdc\xb9\xfa\x52\x8f\xd9\x8b\xd1\xbf\x8f\xdd\xb0\xa3\x2c\x73\x25\xc7\xd3\xcd\x5b\xa0\x41\xde\x6a\x26\x8e\x12\x15\x4e\x6a\xb5\x26\x6d\xd9\x80\x2a\xc3\x14\x02\x9f\x0b\xcd\x85\x26\xbb\x87\x69\x11\xe1\x3f\x23\x98\x97\xbd\xa5\x7e\x03\x13\x6e\x8e\x1c\x4c\x9d\xb0\xac\xf3\x42\x08\x93\x97\x96\x36\xb7\xe3\xcd\xb8\x2b\xa2\x38\x6c\x66\x79\x7b\x4a\xfe\x9a\x92\x8f\x3b\xa6\xbd\x8f\x79\xec\xb1\x2a\x16\x6b\x5e\x84\x51\x12\xa7\x62\x45\xb4\xb2\x34\x2a\xfc\x77\x79\x8a\x59\xf5\x35\x3a\xa7\x8e\x47\xf4\x90\xfc\x78\x81\x0f\x52\x18\x12\x16\xa2\xdb\x89\x50\x5f\x9d\x18\x0c\xcf\xaa\xca\x11\x5a\xbe\x91\x34\xaa\x4f\xf4\xa1\x4d\xce\xcf\xc8\xc7\x68\xb4\xad\x95\xa4\xbb\x89\x42\x27\xc3\x42\x4d\x90\x2c\x15\x85\x3b\x68\xff\x6d\xac\x3a\xa7\x58\x65\x47\x18\x56\xb2\xb7\x8d\x05\xbf\xe4\x0d\x5f\xb7\x88\xc9\x4c\x4a\xc5\x43\xc5\x4d\x36\x2a\xff\xee\xa1\xa0\x27\xfb\xb5\x6f\x1a\x7a\xb2\xa7\x59\x19\x2b\x4f\x0e\x1a\xa3\x33\x56\x46\x65\xa9\x7c\xf2\x70\x25\x43\x99\x15\x70\xe9\xff\xe8\xe1\xe0\x56\xeb\xb7\xb5\x39\x87\x18\x03\xaa\x83\x9c\x09\x18\x44\xc7\x3e\x18\xe7\x2b\xa5\xa9\x5c\xf4\x8e\xe8\xd0\x4c\xa7\x67\x1f\x38\xc4\x4e\x52\xc7\x1e\x0f\x9e\x80\x09\x6d\x2e\x67\x8c\xea\x6c\xf5\x15\x67\x81\x95\x56\x9e\xf1\x46\xf0\xec\x33\x2a\x7b\x59\x84\x51\x43\xb1\x38\xa0\xa1\x09\x2e\x41\x8e\xb1\x71\x62\xf3\x63\x98\x80\x0c\x69\x53\x5a\x78\x4d\x36\x77\xdb\xca\x5e\x04\xbb\xed\x1a\x44\x37\x5f\x08\x36\xc1\x3b\x62\x65\xef\x51\x6a\xd6\x00\x09\x9b\x6d\x4c\x57\xc9\x5b\xda\xbe\x46\xd1\xcb\xee\x97\x83\x80\x1f\xc3\x27\x27\x0a\x48\xc8\x9e\x74\xda\xfe\x0b\x35\x76\x94\x6a\xb1\x70\xa1\x9b\xe3\x91\x69\x41\x59\xf1\xbb\x0f\x61\xa5\x6e\x13\x1b\xe1\x96\x94\x33\x71\x27\x4e\xc2\x1c\x75\x81\x15\xfc\x34\x38\xbc\xab\x96\xd0\x43\xe5\x6b\xd8\xa5\x47\x54\x3d\x64\x17\x60\xb8\x17\xd5\x2b\x04\x16\x05\x52\x07\xc5\x85\x56\xd2\x2b\xe2\x2d\x77\xf6\x3c\x97\x99\x59\xe9\x47\xc1\xdd\x83\x03\x69\x9c\x46\x4e\xbc\xfa\xce\x1d\x85\xc9\xa8\x76\x16\xdd\xc4\xc9\x09\xe7\x93\x9f\xf5\xd8\xb7\xe1\x37\xf3\xac\x1b\xb6\x11\xf2\xf5\x23\x5e\xf0\x93\xde\xe0\x55\x1b\xc5\x44\xaa\x45\x70\x1f\x33\x24\xba\xf4\x94\x8d\x1a\x02\x58\x5b\x4e\xd8\x95\x72\x7d\x61\x82\xc5\x76\xd8\xe7\x61\x9e\xf5\xd2\x88\x2c\xb7\x3a\x5c\xf5\xcc\xc0\x87\xcf\x66\xa9\x50\x2e\xa5\xe6\x40\x44\x1f\x00\x09\xc5\x29\x9f\x69\xce\x4c\x3b\xed\x7a\xff\x98\x4d\xba\x5f\x6d\xfa\x21\x24\x8d\xdb\xc2\xd6\xa6\xd4\x53\x5f\x30\x16\xcc\x55\xde\xb1\x67\x4e\x08\xa8\x72\x28\x43\x15\x1d\x1c\x1a\x30\xe8\xe1\xca\x44\xb8\x77\xd4\xd8\x05\x92\x2a\xdd\xa0\x75\xd6\x4a\x03\xb5\xcc\x20\x94\x97\x85\x06\x75\x95\xa4\x05\xc2\x07\xfc\x3d\xca\x69\x05\xe4\xbf\xda\xea\xa2\x72\xb1\x95\xcd\x9a\xac\x0b\x76\x57\xfc\xa8\xc7\xc6\xbb\x59\x2e\xcf\x0d\x23\x20\xa8\xdd\x1e\x72\x3b\x60\x29\xcb\xcb\xa0\xb5\x04\xe9\xd7\x43\x09\xb1\xba\xda\xb3\x18\xfd\xa1\x70\xff\xf0\x07\xaa\x7a\xb1\x95\x83\x85\xb0\x99\x95\x1d\xdd\x64\x3f\x73\x90\xcd\x58\x95\x52\x9e\x14\xa5\x70\xa1\xc4\x9d\x05\x7f\x7d\xc7\x50\x57\xbe\xe0\x60\xf0\x3b\x5e\xf5\x3d\x97\x28\x9a\x56\x0a\x28\x65\x16\x01\x38\xfa\xff\xa3\x26\x5f\x86\xd8\xd6\x34\xdb\x46\x24\xa1\x25\x79\xd6\x2c\x4a\x91\x2a\x44\x72\xb2\x5d\xa9\x17\xf8\x56\x1c\x72\xc5\xde\xa6\xae\xe6\x75\x30\x50\x01\x51\x13\xdf\x46\xd4\x21\x05\x8b\x59\x64\x0a\x1e\x4b\x63\x70\xa6\x44\xb2\xb7\x70\x21\x6c\x49\xed\xdb\xe2\x55\xa1\xaf\x61\x66\xb3\x35\x9b\xfe\xf3\x38\xfb\xc8\x18\xfb\xb6\xd8\xc2\xc0\x82\xc3\xeb\xbb\xc6\xf6\x90\x34\xa7\xdb\x54\x9a\x37\x83\xbf\xa8\x0d\x16\x66\xb1\xc3\x93\x25\xc0\x0e\x42\x4a\x85\x3c\x66\x86\x39\x1e\xc2\x30\x60\x23\xe4\x5d\x5d\xb4\xea\x68\x3b\xfe\x9e\xc0\xa7\xa8\xfd\x36\xe2\xc1\xe0\xa2\x36\x78\x01\x30\x0a\x8a\x44\x6f\x6e\x65\xf1\x4c\xdc\x56\xa4\x7c\x08\xcf\x04\xdc\x5b\xba\xaa\xc0\x3f\x9f\x50\x5e\xbe\x48\x54\xdc\xc3\x88\x4f\x23\x3d\x54\x55\x9f\x54\x49\x9a\x06\xc6\x09\x57\x21\x96\xad\xf5\x09\x3f\x88\xac\x9c\x8a\x01\x70\xc7\x8a\xb3\x33\xec\x31\xdd\x81\xef\x4a\xc1\xe0\x5f\x1f\x1c\xb3\xf5\xb9\xe1\x4e\xd5\x5d\xee\xac\xf2\xb7\x1e\x64\xcf\x36\xc3\x2d\x27\x65\x0a\xf1\x33\x0d\xc3\x76\x65\xa3\x0b\x99\x07\x40\x6d\xee\x15\x65\xd6\x51\x09\x93\xf3\x7a\x06\x69\x90\x21\xff\xbf\x1e\x08\x9e\xb5\xeb\x53\x36\xd8\x52\x19\xc6\x49\xa1\xc7\x4e\x9d\x5b\x0d\xff\xbf\xb2\x91\x52\xee\x70\xd9\xef\x8a\x8b\x1e\x91\x7d\x3b\xb3\xfd\x13\xe3\x4c\xb0\x43\x14\x4d\xe1\x3f\x3b\x38\xa3\x02\x2b\xe0\x5c\xb8\xd1\xeb\x84\x08\x74\x0c\x7b\xbc\xbe\x87\x7e\x44\x08\x80\xa7\xaa\x60\xe0\x1c\xc4\x72\xc0\x3c\x81\x6a\x38\x5d\x78\x2f\x3b\x88\x47\x14\xff\x7c\xb0\x82\x7f\xe1\x47\x30\x54\xb7\x2e\xd7\x66\x63\x3b\xcb\xa3\xba\xb1\x10\xd2\xa1\xc6\x34\x54\x35\x70\xa2\x18\xf9\xad\x67\x6b\x62\xf3\xa5\x60\xae\x70\x38\xca\x0d\x37\xb9\x53\x20\x18\x2b\xa5\x3c\x58\x05\xfd\xf1\x14\x46\xfe\x9c\x4b\x37\xd3\x6c\x3b\x1d\x50\x23\xa0\x3b\xfd\x38\xf8\xd7\xf2\x5f\x55\x2e\xfc\x3d\x5c\x2a\x01\xb0\x21\x9a\x3c\x5f\x00\xce\x7b\x38\x8d\xd7\xd1\xa5\x3e\x0b\x01\x4f\x14\xb0\xb4\xaa\x02\x5c\x14\xba\x86\x01\x25\xf5\x65\x73\x57\x75\x6b\x57\xe3\x8e\xf0\xbf\x7f\x84\x3b\x66\x84\xf1\x52\xbe\x1b\xac\x0c\x97\x47\x3d\x0a\x69\x89\x76\x23\xac\x4e\x56\x2a\x88\x14\xa3\xd4\x91\x40\xfa\x06\x4a\x47\x93\xfd\xed\x0d\x95\xc7\xc6\x05\x05\x56\x68\x92\xe2\x3f\x79\x43\xf0\xa2\x03\xb3\x29\x1f\xbe\xa5\x90\x93\x9c\xdc\x78\x07\x26\xb8\x14\x9d\x6e\x96\x63\xb8\x25\x52\xce\xc1\x0e\x2e\x67\x63\x37\x8b\x88\xce\x52\xe4\x0d\x4c\x44\x85\xbe\x6d\x95\xf1\x16\x82\xb1\xa9\xcc\xbe\x48\xac\xf5\xda\x6d\x70\x82\xe8\x3a\xd8\x29\x77\x10\x46\x9e\x66\xc6\x58\x2e\x8f\xe5\x78\xf0\x96\x1f\x6a\xf7\xc2\x3c\x4c\x4b\x21\x0a\x1d\xcd\xd6\x77\xa0\x1f\x4c\x8a\xbc\xca\xd9\x82\x94\x2c\xc8\x74\xd8\x46\x57\xba\xac\x2c\x6c\xdd\x98\x3d\x0e\x74\x81\x76\x28\x9a\x6c\xd8\x70\xd5\x78\x2b\xec\x15\xa2\xa0\xf7\x21\x14\xb6\x25\x44\xc4\xd1\xf8\x4e\x95\xa5\x7c\xa0\x38\x4b\x35\x32\xa1\xea\x43\xb1\xa5\x90\xb0\xab\x9a\xad\x60\x21\x74\x67\xaf\xf5\x29\xc7\x25\xe9\x73\x15\xaf\x6b\x92\xa1\x55\x84\x42\xdf\xe4\xb7\xc1\x5b\x72\xe7\x2e\x35\x22\xa2\x6e\x85\xf5\xa1\xa2\xb7\xa6\x6a\x3b\xd8\x83\x61\xb7\x2b\xc2\x7c\x10\xa3\x8f\xcb\x93\x34\x41\xde\xed\xcc\xeb\xa8\x36\x06\x0a\xa5\x18\x9e\x5e\x85\x03\x3d\x58\xa9\x4e\xbe\x77\xe6\x4a\x8e\xe0\xb7\x6a\x8e\xe0\x95\x08\x7b\xfb\xdc\x02\x47\xa6\x37\x7b\xc1\x7f\xf6\x6c\x9d\xa8\x4a\xe8\xec\x9c\x8c\x03\x4b\x11\x4e\x25\x6a\xfa\x52\xea\x4d\xd8\xc9\xd2\xf6\x40\x26\x73\x1d\xd0\x01\x6c\x81\x23\x97\x7e\xc5\x07\xdd\xd4\xad\x7f\x37\x8c\xeb\x90\x5c\x02\xac\xc3\x4d\x03\x17\x54\xe4\xa4\xc2\x42\x05\x06\xe2\xaa\xba\xb0\x3f\xab\xb1\x47\xa3\xf1\x51\x0b\x12\xd0\x26\x3f\x5b\x0b\x3e\x56\x43\x3e\x07\xa2\xf0\xad\x4c\x65\x82\x3d\x73\x29\x8b\x40\xf5\x37\x6c\x90\x55\x1d\x8d\x5f\xa1\x14\xf1\xaa\x07\xf4\xda\xef\xe9\x4c\x53\x13\xc9\xc6\x8f\x2d\x2e\xcd\xd5\xf9\xd2\xe2\x3c\x00\x9d\x4f\x6a\x3d\xd0\x12\x43\x2a\x4f\x11\x68\xae\x49\x54\x54\x7d\x28\x2e\xd4\x37\xb6\x37\xc2\x12\x22\x29\xad\x0f\x85\xb9\xe0\xc5\x46\x98\x5b\x34\xdc\xc0\xd5\x70\x36\x53\xe1\x65\xd5\x01\xf1\x30\x49\x14\xda\x18\xba\x95\x49\x65\xb7\x07\xfc\x9f\x67\xd2\xe9\x95\xd0\xe0\x2b\xa1\xc1\x0f\x6f\x68\xf0\x95\xf4\xc6\x2b\xb3\xef\x1b\x37\xfb\xbe\x05\x92\xea\x7f\xd1\xc1\xd1\x7a\xdf\x25\xe3\x68\xdd\x67\xe0\xb3\x34\xf0\xe3\x6e\x5a\x48\xf5\x89\xad\x57\x08\x5e\x74\x11\x33\x5c\x17\x49\x81\x1b\x0a\x16\x42\x93\xf2\xc8\x2d\x9a\xdd\x3b\x00\x09\xf5\xec\x3d\x23\x42\x4d\x2f\x19\xdc\xa6\xbd\x29\x4e\xff\x1c\x01\x66\xbe\xf5\x81\x06\x92\x21\xc0\xbd\x87\x73\x0e\x7d\xeb\xe1\xba\x5c\x49\x23\xbd\x92\x46\x7a\x25\x8d\xf4\x4a\x1a\xe9\x65\xa4\x91\x7e\x33\x40\x43\x75\x6c\xb8\x99\xf3\xfb\x42\x9b\x39\xae\xff\xdc\xbb\x11\x66\x73\x10\xeb\xf6\xe1\xdc\x74\xae\x20\x1c\x7e\x6b\x20\x1c\xc6\x0a\x04\xeb\x7c\xb0\xf2\x30\x40\x60\xd9\x9f\xea\x2b\xc8\x92\x6e\x30\x85\x14\x79\x7b\x9e\x6e\x97\x89\xaa\xc1\x7e\xa6\xc6\x26\xf6\xc8\xe9\xe0\xff\xc7\x5a\x50\x54\xdd\x30\xee\x65\x91\x66\xbd\xf6\x86\x13\x92\x50\x66\x3c\x11\x88\x51\x4d\xe2\x64\x20\x4e\x85\xd2\x48\x08\x68\x64\x38\x92\xc6\x8d\xb1\x78\xc9\x37\x4d\x84\xe5\x7b\x6b\xec\x36\xab\xe7\xd6\x93\x6c\x9b\x02\xe7\x4d\x52\x45\x1e\x67\x79\x5c\xf6\x4f\x8b\x2d\x91\xcc\xd9\x70\xc4\xa6\x53\xbf\xea\x05\xf7\xee\xe1\x39\xd3\xc7\x4e\xe7\x22\xf0\x4b\x6c\xd9\xfa\x02\xca\xa3\x69\x74\xa9\xd0\x80\xf0\x60\x20\x4c\xab\xca\x6b\xb5\xc1\xd6\xa9\x43\xff\x4d\xf0\x8c\xf3\xf2\x8f\xf3\xca\x44\x6a\x1b\xa5\x55\x79\x0e\x28\x1b\x55\x93\x3e\x61\x8d\xaa\x22\xb6\x71\x96\xd4\x07\xaf\x66\xd7\x8c\xca\x61\xa3\xec\x32\xff\x55\x57\x07\x3f\x32\x66\x5d\x70\x03\xbd\x72\xc8\x1e\x5b\xeb\x59\x89\x07\x2a\x8a\x2e\x2e\x9b\x1c\x22\x4f\x80\x53\x5a\x75\x1d\xa6\xae\xed\x10\xa7\x05\x51\x4f\x73\x98\xd9\x6d\x3f\xd6\x4e\xb2\xb5\x30\xb1\xa6\xa1\x2c\x37\x8c\xa2\x82\x6f\x6f\x64\xce\x20\x6c\xc5\x21\x5f\xe9\xe1\x6c\xc1\x10\x77\x5d\xb8\xfd\xd8\x5a\x9f\xc4\xba\x75\xbb\x34\x8e\xb4\x26\xb7\x13\xec\x0a\xc4\x26\x6b\xcb\x5d\xcb\xae\x2c\x84\xb6\x84\x5b\x82\x0b\x24\x68\x88\x69\x0e\x58\xd5\xbc\xec\xcc\x3c\xaa\xc2\x5e\x13\xf4\x2e\x7a\x87\xe4\x88\x2c\x8b\x75\x67\x56\xfd\xd6\x61\xf6\x52\x8f\x1d\x2e\xa8\x63\xfc\xe7\x05\x4f\xd1\x9d\x84\xa9\x4c\xd6\xa0\xd2\xdc\xa5\x25\x87\xab\x39\x53\xa0\xf7\x70\x7f\x1f\xb6\x77\x67\x5a\xd1\x37\xaf\xa4\x0d\x5e\x49\x1b\xfc\xe7\x90\x36\xf8\x07\x1e\x53\xab\xd1\xff\xbc\xb7\xd7\x45\xb2\x8c\x6f\x04\xef\xf4\xe8\xaf\x91\x02\x54\xc5\x8c\x5d\x92\x0c\xc5\xbd\xc4\xfa\x4c\xa5\xe1\x7d\x96\xc4\x93\xc8\xd1\xed\x97\x8b\xb2\x97\xa7\xe6\xfc\xf4\xa0\x97\xed\x9e\xa3\x78\xda\x7f\x7a\x63\xf7\x1c\x44\x6e\xa5\x31\x92\xe4\xab\xca\x66\x64\x3f\x58\x63\xc7\xf7\x34\x54\x4b\xb9\xb0\x78\x09\xbf\xe4\x05\xcf\x76\xae\x68\x67\xf7\x7a\x2f\x59\x8f\x13\x08\x39\x11\xeb\x72\x5a\x02\xd8\x09\xa1\xb3\xf3\x63\x38\x81\xeb\x3c\x12\x89\x90\xff\x8a\xb2\xd5\x9c\x04\xfb\x42\x98\xe7\xb1\xd4\x9b\x7a\x03\xe1\xa7\x3d\xd6\x60\x63\xbd\x38\xf2\xff\x55\xf0\x9d\x6e\xc2\x13\x65\xbf\x9c\x5b\x9c\x77\xb6\xe3\x79\xf6\x48\xb5\x34\x95\x5c\x9c\x09\x1e\x5f\xf9\xea\xb2\xfb\x9c\x5d\xca\x1f\x3e\x72\x27\x1a\x13\xcc\x2e\xf1\x3f\xfa\xc8\xe0\x46\x93\x6b\x82\xb2\xdf\xd5\x1e\xc0\xd8\xb2\x0e\xb1\xc9\x51\x41\xc1\xe9\x85\x4e\xe1\x50\xed\xbb\xff\x11\xec\xb5\x63\x8c\xad\xc5\x69\x98\xf7\xe7\xe5\x5a\x7a\xe9\x58\xf0\x07\xb5\xdb\xf4\x6f\x2b\xe0\x74\x43\x70\x7c\x8e\x23\xe0\xc1\x02\xb1\x0a\x61\xef\x03\x4a\x89\x62\x33\xed\x6e\x84\x69\xaf\x23\xf2\xb8\xc5\x5b\x1b\x61\x1e\xb6\x4a\x08\x37\x98\x68\x4c\xd4\xf9\xc4\x73\x26\xe4\xe4\x9e\x68\x4e\x34\xb9\xfd\x9d\x50\x9b\xa1\xe0\xd4\xc2\x31\x31\xb2\xa5\x99\x78\x49\x7b\xa7\x65\x70\x6e\xf5\x54\xe3\x26\xa4\xb6\xb6\x62\x79\x8a\x32\x23\x6f\x82\x55\xb2\x26\xa9\x97\x3a\x69\x02\x64\x46\x14\x37\x93\xa5\xa2\x82\xf2\xab\xae\xad\x8f\x22\x05\xf6\xbb\x48\xa1\xfe\x43\xd0\x0f\x76\x2f\x99\x8c\x9a\xfc\x1c\x39\xc6\x74\xfc\x2c\x59\xeb\x40\x55\x83\x58\xfd\x27\x72\x1d\x96\x0a\x3b\xd1\x26\x52\xb5\x37\xef\xf7\x1e\xcd\x1e\xe5\x8f\xcb\xc6\x5a\x63\x6f\x0d\x0f\xfb\x54\x8d\x8d\x83\x80\xfb\x68\x2d\xf8\x91\xda\xf0\x70\x0c\x8f\xf8\x43\x32\x2a\x14\x2c\x04\xdd\x94\x66\x69\x03\xfb\x7a\x60\x50\xa0\x78\x65\xee\xb1\x7a\x1b\x3a\xa1\x72\x48\x76\x19\x0c\x9b\x7f\x6d\xb0\xbc\x7d\x0d\xc9\xfd\x03\x9e\x2e\xbb\x47\xff\xc8\x63\x47\xe2\x4e\xa7\x57\x86\x6b\x89\xf0\xbf\xe0\x05\xbf\xe2\x2d\xaa\x9f\x75\x79\x84\x76\x2c\xa5\x22\x2d\x7a\xb9\x9a\x80\xb0\xa0\x4c\x6b\xdc\x6c\xaf\x21\xca\x07\x7e\x0c\xf4\x4a\xda\x98\xd5\x66\xa2\xbc\x96\x9d\x2c\x52\xe9\x4e\x76\x00\x88\xfa\x2e\x9a\x2d\xe4\x64\x1a\x78\x9e\x13\x25\x35\xda\xc9\xe9\x34\x8e\x07\xf4\x34\x4e\x5c\x7b\xd0\x15\xe5\xe2\x0a\x70\x8c\x03\x1c\x73\x45\x5d\xbf\x3c\x75\xfd\x41\xef\x19\xbb\x2b\x48\x4d\xbf\xae\x15\xa4\x20\xd0\x9a\x90\x96\x14\xae\x1e\xc4\xd8\x67\xc6\x9d\x24\x20\xed\x1a\x2d\xba\x1b\x22\x17\x77\xc5\x79\xd9\x0b\x93\xf9\xb8\xd8\x74\x68\x33\xdf\x30\x1e\x3c\xc1\xa1\x0e\xde\x5a\x81\xe7\x55\xda\x84\xaa\x7e\xf3\xa2\xc7\xf0\xd2\x50\xf2\xe7\x17\xc6\xd8\x47\x3c\x76\x70\xbd\x58\xed\x77\x85\xff\x53\x5e\xf0\x4e\xcf\xa2\x1e\x86\xf8\x79\xe5\x0d\xb6\x78\x1e\x2d\x5b\x27\x3e\x43\xc1\x63\xc6\x16\x09\xb9\x70\xa4\x73\xa5\x6d\xae\xec\xa2\x0b\x17\x9a\x3c\x10\x17\xca\xeb\x82\x3a\x0f\x2e\xac\x17\xf2\x9f\xb4\x5c\x2f\x82\x26\x5f\xec\x68\xca\x7e\x90\x25\x86\x68\x1b\x5f\x90\x62\xd9\x4a\x11\x75\xd4\xad\x0b\xec\x91\x94\x37\x85\x5e\x95\xc5\x79\x5f\x04\xcf\x5c\xc1\x4b\x04\xe8\xc1\x6f\x0b\x0b\x11\xf1\x33\x06\x40\xfd\xd8\xca\xd2\x6d\x67\x26\xe5\x86\x01\xc6\xe1\xc5\xf9\xca\xa8\xda\x15\xbb\xe0\xb3\xe1\x40\xf6\xeb\x5d\xec\x51\xc5\xe0\x03\xfe\x6c\x70\xdd\x3e\xbf\x9d\x0e\x96\x3b\xc7\xac\x11\xf3\xaf\x0f\x8e\xa1\xe3\x46\xee\x40\x71\x24\x67\x28\xa8\x91\x03\xe3\xbd\xd5\x89\x36\x9d\x8c\xc0\x03\xec\xba\x3d\xe4\x43\xcd\x25\x61\xdc\x71\x26\xd6\xd7\xc6\x83\x37\xd6\x76\x7d\xcc\x31\x33\x20\x9f\x7b\x3e\x51\xf0\xa5\xbb\xe6\xaa\x0d\x42\x14\x97\xaa\xd2\x60\xa5\xb4\x45\x75\x32\xeb\xa5\x11\x5f\xba\x0b\x57\x3c\xe6\x58\x42\x4b\xd5\x93\x76\x2c\xe3\xec\x50\xea\xd2\x70\xbd\xe2\xa2\xce\x45\x01\xfb\x59\x98\x24\xfd\x3a\x0f\xf9\x76\x1e\x76\xbb\x52\xf3\x82\xfc\x4b\x95\x1d\xa1\x13\x44\xec\x2c\x39\xb9\xd7\x6d\x93\xa3\xb6\xc8\x3a\x22\x4b\x05\x17\x40\x92\x5c\x6a\xa8\xea\xc9\xe6\x45\xef\x48\x4b\x7e\xf8\xec\xa0\xcd\xef\x17\x6a\xec\xf7\x3c\x66\x6e\xfa\x9f\xf1\x82\x07\xbc\x39\xf5\x73\xd0\xfe\x37\x9c\x8a\x05\x8f\x8e\x4e\x7d\xec\x66\x26\x14\x4b\xf7\xe8\xbe\x8d\xb3\x34\x71\xa7\x4c\xbe\x55\x83\x22\x40\xae\x31\x97\xf0\x0a\xb4\xc6\xd9\x1b\x9f\x65\xa5\x7d\x9f\x09\x9e\x7a\xf7\x7e\x49\xa2\x95\x17\xab\xc2\x85\xf5\xde\x83\x6c\x72\xcf\x18\x66\xfe\x0b\x0f\x06\xf3\x83\x17\x55\x78\x5b\xb1\x03\x8e\xb8\x46\x7d\x34\x70\x8b\xee\x81\xe8\xdd\x07\xd8\x3b\xc6\x80\x05\x9f\xe0\x5a\xfc\x1f\x1a\x0b\x5e\x3a\x36\x67\xe0\x5b\x60\xee\xeb\x2d\x6c\x30\xc4\x58\x61\xbc\x58\x59\x97\x1b\x61\x1a\x25\xa4\x4b\x21\x48\x22\x2e\x07\xc2\x46\x91\x93\xdc\x30\x9b\x05\xeb\x49\xb8\x95\xe5\x45\x60\x4e\x3d\xba\x58\x2d\x63\x61\x6e\x98\xaf\x35\xf9\xa9\x2c\xe7\x44\xd7\x5c\x07\xb7\x80\xdc\x3e\xc1\xa6\x69\x4a\x5e\x32\x6c\x69\x6a\x5d\x41\x39\xb1\x7c\xab\x43\x2a\xa0\x5d\x28\x54\xd2\xf8\x9e\x07\x82\xce\xa3\xac\x13\xc6\x69\xa3\x9b\x8b\xf5\xf8\x82\xca\x79\x4f\xe5\x8e\x91\x0b\x74\x40\x1d\xbf\x7e\xda\x3a\x67\xc8\x89\x80\x4e\xa7\x3a\x17\xcd\x76\x93\x07\x61\xab\x23\x00\x33\x13\xc7\xa1\x61\xbe\x1d\x0c\x26\x24\x6a\x95\xdd\xf5\xba\xd6\x18\x33\x1c\x70\xfe\x5f\x7a\xec\xd4\x25\xe0\xe1\x99\x7e\x31\x4c\xdb\xef\xf4\xac\xde\x02\xad\x39\x89\xd3\x4d\x4c\xa0\x6c\x41\x66\xa0\xd1\x91\xe9\x44\x06\xe0\x26\x06\xc6\xde\x3d\x9a\x59\x19\x73\x6e\xf7\xda\x44\x2d\xf1\xd0\x2c\xd2\xb6\x78\x75\x9c\x14\x17\xca\x3c\xb4\x78\xef\x9a\xec\xc7\x1e\xc1\x9e\x6c\x35\x33\x8c\x88\xb8\x39\x17\xed\x18\x62\x85\xe2\x2c\x35\x36\xa9\x5e\x22\xee\x8e\xcb\x8d\x3b\x95\x49\xa4\xf0\xff\xf4\xea\xe0\x85\xde\xf0\x75\x6c\x74\xd9\xeb\x26\x30\xbb\xad\x1b\x52\x54\xeb\x70\x39\x30\xe0\x83\x5a\x28\x35\x2e\xed\xe5\xec\x84\x9b\x52\x33\xc8\x15\xb4\x29\x65\xd5\x62\x71\x10\x64\x89\xdc\xd2\x72\x76\xc3\x01\xce\x5d\x83\xff\xfd\x2a\xf6\x7e\x8f\x1d\x09\xbb\x31\xb0\x22\x17\xfe\x3b\xbc\xe0\xa5\xde\xec\xd2\x22\xfe\x54\x82\x74\x76\x69\x11\x35\x2d\x95\x5d\xae\x02\xee\xd6\x04\x52\xfa\x65\x4d\x3e\x71\xed\x04\xc7\xa5\x46\x8f\xc2\x81\x8b\xae\x92\xfe\x44\x9c\xc3\xe8\x10\xa5\xa5\x5c\x24\xb1\x95\x02\x94\xa5\xa2\x69\x7b\x5f\x76\x8c\xa9\xfc\xb0\xc7\x8e\x1a\x15\xbb\xf0\x7f\xcc\x0b\x5e\xe9\x19\x1d\xdb\xa9\xfa\x96\xba\xb6\x97\xca\xab\x87\x1f\xde\xea\xbf\xb9\xc6\x58\x66\xe6\xc6\xab\x6a\xc1\x5f\x7b\xee\x9c\x00\xab\x89\xb9\x22\x7f\xea\x29\xc7\x37\xb2\x6c\x93\xb7\x42\x79\x62\x46\x89\xdb\xe0\x73\xcb\x0b\xb3\xab\x0b\x75\x7e\x6e\x69\x1e\xfe\x9d\x5f\x38\xbd\x20\xff\x9d\xbb\xf3\xec\xd9\x85\xb9\x55\x9e\xe5\xfc\x5a\xcc\x92\x4f\x12\xac\x7c\x56\x38\x5f\x80\xf8\xa1\xb4\xaf\x72\xcc\xcd\xc7\x9c\x5a\x90\xa4\xa4\x7c\xb4\x87\xb3\x8b\x7e\x70\xdc\x0e\x39\xfd\xbe\xf1\xe0\x4f\xc6\x4c\xf0\x28\x49\x0a\xb4\xb7\x98\x21\xc5\x93\x53\xcf\xf5\xbd\x30\x66\x09\xed\x93\x7c\xa2\x9b\x45\xc5\x04\xef\x88\x30\x2d\x28\x4b\x1e\x2e\x4d\x25\x59\x5b\x5d\x2e\x29\xc0\xc5\xca\xd6\x43\x1a\x0e\x78\xfa\x5a\xf5\x58\x08\xf6\x27\x9d\x3a\xb6\xd6\x43\x83\x8b\xf5\x96\x2e\xdc\x79\xc7\x7e\xc0\x2e\x77\xaa\x68\x85\x89\x70\x9e\x94\x17\x06\x0b\xbc\x76\xaa\xba\x06\x2a\x7e\x27\xce\xdd\x37\x18\x5b\x5c\xe7\xdb\x71\x12\xb5\xe4\xb9\x78\x70\xb0\x2c\xbb\x0e\xf4\x1c\xb2\x6c\x83\x3d\xc6\x2a\x3a\xca\x86\x6d\x49\x40\x76\x4e\x29\xb0\x6c\x5e\x74\x05\xba\x3b\x89\x95\x43\xa4\xad\x04\x09\x49\x50\xda\xd4\xdd\x66\x77\x08\x14\x01\x4f\x3b\x18\x28\xb0\xb7\x89\xf1\xd6\x31\x76\xa0\x68\x65\x5d\xe1\xbf\x6e\x2c\xf8\x8f\x63\xf0\xa7\xde\x33\x29\xd9\x19\xae\xe9\xa3\x74\x2f\x11\xc3\x38\x6a\x3c\x20\x9b\xbf\x3c\x20\x69\x98\xef\x28\xc0\x53\x71\x70\x6d\x60\x1e\xd0\xb3\x22\x2c\xd1\x89\x49\x58\xda\x0d\xf8\x4e\xe4\x40\x3a\x27\x89\x46\xf5\xd1\x9f\xd6\xa5\x83\x38\x52\x7e\x42\xd0\x38\x9c\x82\x9a\x4e\x45\x86\xbe\x6a\x40\x51\x77\xfd\xa2\xac\xbe\xf5\x7a\x09\x47\x18\x34\xec\x52\xe7\xe4\x42\x76\x67\x8b\x60\xed\x56\x9c\xa1\xd1\xa8\x44\x56\x3f\xca\x59\xd5\x0d\x11\x26\x4e\x9d\x79\xed\x38\xa9\xe0\xda\xc0\x51\x19\x7e\xf2\x40\x35\x1a\x7b\x16\x09\x93\xff\xff\x8a\x03\xc1\x4d\xce\x15\x63\x75\x35\x69\xd8\xb6\x7e\x89\x30\x1f\x69\x16\x89\xd1\xe9\xfd\xef\x1f\x67\x75\xca\x57\x7f\x7c\xf0\xd8\x55\x3a\x82\x40\xf4\x8e\x49\x52\xb7\xab\xfb\x7c\x8f\x3d\x2a\x09\x8b\xf2\x76\x11\xe6\xe5\x9a\x08\x4b\xc8\x34\xdf\xbc\xf4\x44\xf3\xe9\xd3\x3a\xab\x7c\x5b\xf0\x76\x06\xb8\xe3\x68\x7a\x43\x64\x79\xf4\x8e\x9b\xda\xb0\x97\x57\x67\xbb\x6f\x5d\x7a\x1d\x9e\x7c\x7a\x74\x66\xfb\xc8\xa4\xf6\x67\x1a\x78\x84\x33\xc1\xad\xb7\xf7\x3a\xe0\x54\x7b\x28\x10\x11\x9e\xae\x11\x11\x6e\x0d\x4e\x1c\x83\x28\xad\xc9\x4b\x45\x3c\x38\xad\x11\x0f\x6e\x0b\xae\x5f\xa9\xc6\x38\x00\x88\x05\x79\x75\x57\x8c\x83\x2f\x1c\x66\x37\xd9\x3a\x9e\xe3\x72\x1b\x70\xca\xcf\x42\xbc\xe6\xb2\xd8\x8a\xc5\x36\x9c\x92\xde\x70\x38\xf8\x61\x6f\x87\x9b\xb8\x61\x21\xb4\x58\xd7\x20\x55\x28\x1a\x22\x65\xaa\x6d\x72\x07\xb1\x25\x5b\xd7\x0a\xe0\xac\x5d\x95\x59\x43\x52\x20\x65\xd5\xd9\x2c\xdd\xed\x31\xb5\xfb\x16\xa2\x74\xd6\xc9\x57\x0f\xb2\x8f\x7a\xec\x00\x68\xbb\xfe\x87\xa5\x0e\xb5\x00\x8a\x6f\x2b\xcb\x91\xe5\x2e\xd2\xe7\xaf\x5e\x21\xf2\xe6\x62\xba\x9e\x35\x9f\x26\x4a\x78\xea\xd8\x24\xef\x88\x72\x23\xb3\xf0\x99\x64\x8f\xc9\x03\x4e\x2b\x2c\xb3\xbc\xc9\xf9\x4a\x9c\xb6\xcc\x99\x1f\x13\x90\xa8\xbc\xd0\x78\x49\xe3\x92\xa7\x42\x44\x10\x1e\x23\xd6\x13\xa4\x9d\x02\xb6\xa8\xe6\xfd\xde\x77\xb3\xef\xda\x79\x33\xb0\x3d\x0e\x67\xd8\x01\xd0\x3c\xfd\xf9\xe0\x98\xab\xbf\x92\xee\xda\xcf\x7a\x13\x52\x53\x16\x08\x9a\xb0\x9e\xe5\xa3\xb6\x99\xf7\x78\xec\xdb\x53\xab\x67\x75\x67\xfa\xaf\xf1\xd8\xfc\x8e\xc7\x9f\xea\x39\x73\xb6\xaa\xa0\xe0\x4c\xe5\x65\x0b\x81\xae\x4a\xf4\xa5\x0d\x03\x77\xe0\x4c\x1e\x59\x63\x3f\x1f\xae\xee\x6b\x3d\x36\xbb\xcf\xea\x56\xd4\x75\x65\xb7\x29\x36\xaa\xd6\x3b\xd5\xf8\x16\x74\xf9\xde\x18\x5c\x7b\x6e\x71\x7e\x07\x43\x02\x3d\x4b\x41\x60\xb9\xb3\x5e\xef\xf7\xd8\xb8\xbc\xe8\xbf\xc5\x0b\x7e\xc0\x3b\x57\x60\x70\xb1\x9a\xad\x55\x03\x2e\x55\x56\x79\x6c\x27\x72\x32\x1e\xc8\x97\x02\xad\xba\x05\x30\x71\x82\x3a\xc6\xd7\xc7\x80\x4e\x0a\x46\xf3\x6e\x2e\x08\x70\x20\xb8\x1b\x66\xf3\x3a\x87\xcf\x6d\x0b\x15\xeb\xa8\xf0\x95\xc0\xe4\xd1\xa7\x39\x67\x57\xf6\xcb\x35\xf6\x5d\xc3\x31\x0c\x2a\x7c\xc1\xff\xe5\x5a\xf0\x54\x1d\x59\xb0\xc7\x70\x39\x08\x33\x32\x01\x72\x17\xbd\xc3\xea\x28\x77\xd1\x03\x97\x54\x55\xc4\xdc\x17\x3c\xb6\xc4\xf4\x83\xfe\x7c\x70\xa3\x3a\xf0\x39\xeb\x45\x8b\x62\x3d\x78\x83\x61\x72\x76\xe3\x6e\x23\x17\xd8\xc9\xa0\xa1\x1c\x60\xa5\x85\x0e\xb3\xd7\x32\x20\x90\xef\x64\xd0\xa8\x32\xe3\xed\xa9\x8c\xff\x52\x77\x82\xf4\x0c\xd4\x57\x73\x6e\x65\x71\x3e\x8f\xb7\x44\x0e\xc2\xfa\xaf\x9e\x18\x1c\x77\xae\x68\x9c\x1c\x54\x24\x5b\xc6\xed\xc2\xf5\x73\xee\xe1\xf9\xbd\x4f\x64\xcf\x3f\xa8\xad\xe2\x73\x61\x37\x6c\xc5\x65\xdf\xff\xd3\x03\xc1\xef\x1c\x58\x5c\x1f\xcc\x04\x71\x1e\xd2\x8c\x24\x16\xed\xe8\xdc\xca\xa2\x06\xb8\x82\xaf\xf1\xed\x50\x0e\x35\x00\x81\x18\x04\x16\x8a\x2f\x88\x23\x4a\x9a\xa1\x92\x79\x4b\x15\xad\x0b\xa4\x52\x22\x4d\x14\xab\x91\x42\xb3\x1c\x40\xf1\x01\x38\x56\x96\x39\xb7\xb2\xb8\x32\x50\x41\xa5\xa4\x82\xa2\xdf\x32\xd5\xd6\xd3\x51\x41\x95\x6e\x88\xd6\xa6\x4e\x11\x25\x14\x92\xb8\xd3\x11\x51\x1c\x96\x22\xe9\x23\x2c\x07\xd6\x01\x51\x69\xb1\x5a\xe0\x7d\x24\xe4\x7e\xb9\x1b\x83\x35\x51\x1e\x37\x11\x78\x78\x5b\x27\xca\x41\x05\x20\x8d\x62\x8d\xc2\x29\xa1\x15\xdd\xb0\x57\x08\x2b\x27\x65\xb8\xb1\x1b\x61\xc1\xbb\x3d\x42\x1d\x02\x2b\x33\x2f\x7a\x31\xd8\xb6\x76\x6e\x70\x93\xb1\xd9\x04\x7c\x64\x65\xbc\x25\x92\x7e\xdd\x2e\x9c\x5a\x89\xdf\xb0\xfd\x17\x68\x3d\xeb\xa5\x72\xc8\xb3\x1c\xed\xad\x88\xe7\xa5\x89\x09\xd6\x93\xb8\x2b\x8f\x0a\x09\x84\x8d\x6f\x63\x2e\xd2\xc0\xc8\xd9\x8b\x5d\x67\x34\xe9\x26\x40\x87\x57\x9b\xea\xe8\x0e\xe8\x18\x80\x5d\x88\xcf\xc8\x1a\xc0\xc1\x21\xdc\x0a\xe3\x04\x1a\xae\x41\x52\x2a\x7a\x40\x01\xc4\x80\xef\x1f\x06\x92\x12\x9f\x47\x26\x43\xfc\xc1\x41\x76\x75\x99\x6d\x8a\x74\x99\xbc\xcd\xfe\x67\x0e\x06\x5f\x3d\xb0\x6a\x5f\x72\xa6\x3b\xce\x74\xea\x52\xdc\xf6\xf1\x44\xae\xc0\x09\xc3\x16\x40\xf5\x72\x28\x15\x25\x70\x61\x90\x58\x6d\x87\x45\x06\xc7\x52\x8d\x1a\x67\x29\x1f\x80\x41\x75\x07\x86\x7f\xa8\x09\x53\x90\x48\xa2\x62\x95\xb5\x5c\x83\x62\xe8\x8e\xe1\xf2\x48\xb2\x84\xfd\x4e\x98\xaf\xad\x30\x49\x28\xba\xdf\xaa\x3d\x99\x6c\xbb\x61\x4e\xe3\x4d\x67\x69\x54\xb7\xd7\x33\x79\xaa\x95\x75\x76\x3e\x74\x92\x07\xad\xc2\x48\x26\xf2\xa3\x52\xe3\x67\xb1\xed\x4d\xac\x64\x70\x92\xff\x5b\xc6\x79\x70\x73\xd8\x8b\x62\x29\xea\x6e\xa1\x2b\x9c\x07\xf0\x44\x70\x92\xdf\x0c\x7f\xdc\x52\xc7\xab\xe2\x42\x37\x46\x63\x8d\x3c\x00\x14\x65\xd8\xe9\xca\x67\xcc\x65\x38\x0d\xc0\x75\xd9\xe0\xe5\x53\x73\x27\x4e\x9c\x78\x12\xbc\xfd\x3c\xf9\x9f\x66\xb3\xc9\x9e\xc7\xd8\xd9\xac\x14\x27\xf9\x2c\x7d\x55\x3e\x09\x67\x7d\x7b\x50\x2d\x7b\xb5\xb1\x7c\x83\x0d\xa9\xe4\x1d\xf0\x4c\xa6\xd4\xd7\x26\xbf\x08\x65\x74\x93\xaf\x66\x26\xbb\x0b\x16\x3b\x3e\x87\xe9\x7c\x50\xd7\x7e\x5d\x99\x02\x8a\x65\x41\x4b\x60\x90\xd5\xa9\xcc\xe3\x76\x5b\xe4\x15\xa3\xd5\x15\x79\x9c\xc9\x19\x97\x24\xfd\x8a\xc5\x41\xf3\x7c\xb7\xe5\xe1\x8c\x08\x34\xbd\x6a\x89\xec\x9d\xb1\xc0\xda\x8b\xec\x8e\x7c\xd0\xbb\x66\x47\x72\xcf\x23\xfe\xa1\xb0\xcc\x3a\x71\x8b\xb1\x3f\x3e\xc8\x1e\x83\x73\x5f\xa7\x10\x9d\xc9\x22\x51\xf8\xbf\x7e\x30\x78\xd5\xc1\xaa\x3b\x3a\xce\x60\x5b\x8a\x59\xb9\x3b\x1b\x37\x1c\x99\xca\x86\xf7\x1c\xf2\x32\x17\x03\x4b\x1f\x0f\x2b\x60\x70\xd3\xa3\x29\x0f\xfd\xc6\xb1\x16\xd4\x0d\x43\x2b\x2a\x60\x52\xb6\x59\x30\x48\x6a\x71\xb9\x1b\x2c\x48\x49\xe5\x17\xc1\x78\x1f\x0b\x0a\x55\xe1\x69\xf5\x8a\x5e\x98\xf0\xa5\xbb\xa6\x96\xee\x9a\xe3\x1d\xd1\xda\x08\xd3\xb8\xe8\x60\x1d\xd1\xcb\xd8\x81\xc4\x9c\x82\x07\x3a\x59\x3c\xa0\x2d\x06\x84\x47\x24\xea\xba\xe5\x61\x6e\xea\x45\xe0\x8d\x56\xfa\x86\xc6\xdd\x02\xe9\x3e\xb7\xb2\xe8\xb8\x3d\x8d\x85\x2d\xb1\x13\xb9\xca\xd8\xe4\x9a\x9b\x1b\x70\xc4\x03\x9d\x0d\x9c\xaa\xd4\xc3\x1b\xa1\x82\x69\x09\xb7\x65\x55\x94\x95\x6a\x4d\x00\xc2\x19\xc9\x3b\x98\x98\xed\x8c\x76\xfc\xb6\x90\x0a\x66\xb5\x58\xc2\x44\x5f\x48\x6b\xd2\x5e\xca\x53\x59\x8e\xee\xa1\x61\x95\xda\x71\x42\x59\xbd\x63\xe3\xbe\x5b\x73\x51\x8a\xaa\x76\x5c\x6e\xf4\xd6\xb4\x73\x53\x67\xf2\x34\x92\xac\x15\x26\xca\xa1\xd9\xdc\x28\x3b\x89\x69\xa6\x5c\xac\x0a\xef\x06\xce\xb2\x54\x23\x3c\xf7\x16\x10\x69\x45\xe7\x57\xb8\x8e\x3f\x1d\xc0\x3b\x92\xc8\x68\x90\xae\x42\xce\x1c\xb1\x25\xee\x7c\xb0\xdb\x85\x4c\xb7\x10\x25\x63\x1f\x3f\xc0\x1e\x81\x89\xb7\xca\x20\xe9\xff\xf4\x81\xe0\x9d\x07\xdc\x6b\xce\xb6\x56\xb9\x9a\x74\x92\x61\x98\xaa\xd4\x61\x2b\x48\xd6\x1e\x71\x35\x2a\x66\x87\x34\x8e\x50\x67\xcc\xf5\xa1\x7b\x52\x25\x02\x93\xba\x67\x2d\x1b\xfa\x54\x24\x4a\xc5\x18\x4f\x6e\x2e\x15\x2f\xa4\xfc\x44\xf4\x20\x55\x1a\x0e\x3a\xeb\x61\x4b\xd0\x4a\x06\xdd\x8e\xc2\x94\xe0\x89\x50\xc3\xe0\x2a\x83\x11\x24\x59\x84\x71\x59\x58\xaa\x98\x2a\xad\x30\x88\xb6\x14\x23\x0c\x71\x83\x22\xa2\x49\xad\xb6\x74\xb3\xad\x2a\xd0\xdb\x86\x02\xbd\xe5\xad\x2c\xcb\xa3\x38\x85\x3e\x56\x0b\x72\xa0\x8f\x65\x15\xd0\xae\x36\xba\xaa\x5a\xb6\x0f\x0d\x04\xa4\x8f\xca\x01\x28\x4d\x8c\xb7\xd6\xf9\x97\xd1\xbd\x67\xd4\xa3\xb6\xdc\xdf\xcd\x06\xa0\x93\x66\x31\xcc\xcf\x86\x3d\xd3\xb8\xea\xf5\xea\xef\xaa\xe4\x3f\x20\xdc\x90\xda\xd6\x9d\x1a\xb2\x7d\xe4\xf3\x72\xf8\x46\xea\x83\x8e\x82\xf6\x5b\x35\x76\xf5\x7a\x01\xe7\x3b\x95\x0f\x5d\x0b\x3e\x54\x9b\xa7\xcd\x81\x44\x7b\x2f\x8d\x44\x9e\xf4\x2d\x0d\x4b\xed\x04\x90\x6d\xdf\x06\x3b\xfe\x76\x2a\xf2\x62\x23\xee\x42\x9b\xbb\x22\xd7\x1e\xa2\x75\x7b\xe0\x69\xb0\xf1\x94\xa6\x41\xc3\xc1\xe5\xab\x64\xa4\xda\x03\xf8\xa9\x15\xab\x62\xca\x38\x0f\x36\x03\xe3\xe0\x25\xc3\xe2\xa0\x00\x80\x28\x5b\xc4\xce\xad\xef\x03\x3c\x57\x8d\x2e\xae\x26\xf7\xfb\xf6\x10\x8f\xec\x5e\x0b\x4e\xee\x28\x7b\x44\x37\x8b\x16\xd3\xf5\xec\xce\x14\x09\x05\x7e\xf0\x68\xf0\x92\xa3\x83\x07\x40\xf7\x99\xfd\x48\x0e\xd3\x11\x00\x9c\x69\x09\xf4\x63\xc0\x0e\xd4\xcd\x22\x79\x5a\x86\x4f\x9c\x23\x00\xb4\xe6\xa4\x8a\xda\x45\x90\x11\xe3\xc2\x43\xc4\x02\xac\x19\xcd\xcd\xc1\x62\x6d\x38\x4f\xa9\x35\x23\x70\x01\xc5\xa7\x0d\x65\x46\x0f\xe9\xc4\xda\x11\x33\xd0\x64\x79\x1c\x0b\x11\xeb\x7b\xe8\xb0\x86\xcb\x0e\x3a\x6a\x58\x69\x1f\xac\x5f\x58\xec\x43\x73\x3f\x36\xb9\x83\xee\x8e\xd0\x05\x5d\x79\x94\x06\x0e\xf8\x0c\xdc\x1b\x48\xa0\x6f\x34\x79\x15\xac\x6b\x7f\x9f\xfa\x24\x1e\xae\x09\x7e\xa4\x42\xef\x97\xb5\x54\xab\x57\xbd\xbe\x3e\x34\x27\x1c\xf4\x08\x9a\xee\xa0\x72\xa1\xaf\xac\x9d\x67\xdb\xe8\x64\xc4\x84\x46\xb1\x1e\x5f\x70\x60\x7f\x9a\x95\x27\x0b\xa9\x7d\xa4\x61\x47\x04\x27\x41\x11\x01\xcb\xca\xa8\xe7\xc0\xc3\x64\x3d\x8c\x8e\xab\x9d\xde\xe8\x01\x97\x10\x2e\x86\x63\xf2\xc2\xb9\xc5\xf9\xc9\xca\xa7\xb5\xda\x10\x9c\xe4\x81\x6c\x61\xa0\x64\x8f\xb5\x61\xd8\xd0\xaf\x0e\xa6\x39\x1c\x6f\x46\xfd\x9f\x03\x0a\x3e\xa0\xb6\xd5\x2d\x32\x8c\x00\xa6\x6d\xc0\xd8\xe8\x3a\x12\x0d\xa1\xd8\x36\x3a\xbf\xa3\x99\xce\x34\x67\x6e\x50\x31\x19\x20\x75\x1c\x24\x7a\x9c\x63\x05\xed\xa3\x4a\x0d\x02\x9c\x07\xc8\x72\xb5\xd4\x66\xf4\x36\x1a\xad\x95\x26\x8d\xa3\xca\xd3\xce\xa0\x8b\x95\xba\x55\x22\xc2\x2d\xa1\xd7\x06\x8f\xe2\x42\x6f\x47\x53\x59\xce\xe3\x76\x8a\xe1\x41\x4a\x84\x35\xf9\x6c\x31\xd0\x80\xeb\x21\xec\x25\x9d\x18\x04\x26\xc4\x3c\x00\xfb\x63\xd0\x42\x5b\x9b\x03\x75\xdb\x32\xed\xa0\x8c\x20\x2d\x94\x9c\x9a\x7a\x67\xb4\x8c\x32\x16\xdb\x03\x41\x54\x65\x91\xf6\x0f\xd4\x31\x51\x1c\x1d\xf5\xa0\xfb\x87\x9c\x80\xb6\x00\x44\xc2\x84\xe3\xa8\x1d\x87\x6c\x49\x7b\xdc\x09\xff\x71\x8c\x3d\x2a\x1f\x3c\x55\xfa\x5f\x1d\x0b\xbe\x30\x36\x7c\xd8\xdc\xd1\x64\x81\x56\xb9\xf3\x43\x92\xe6\x3c\xed\x78\xf6\xe1\x93\xb6\x6a\x24\x9f\x02\xc7\x06\xd8\x86\xbb\x59\x81\x52\x07\xa1\xd7\x94\x00\x53\xd0\x07\x4a\x8b\xb7\x1a\x15\x0d\x51\xb5\xe8\x43\x3a\x1c\x9a\x43\x9b\xa4\x0d\x01\xa0\x93\x1d\xce\x0b\x75\x9b\x0b\x0d\x64\xa3\x2c\x74\xf8\x59\xd2\x15\x61\xe8\xc9\x6f\x59\x56\x70\x13\xa9\xca\x9e\x15\x44\xde\xa1\x4c\xd4\xf6\x36\x52\x08\x91\xe2\xca\x54\x34\x60\x06\xf4\xe9\x61\x3f\x9f\x5b\x33\xe0\x4f\x3d\x76\xf6\x92\xe1\xec\x17\x48\x3b\x9d\xcf\x5a\x80\x0c\x87\xac\x26\xaf\xf3\x82\x67\x55\xde\x51\x51\x87\xca\x4e\x8d\x3b\x8b\x21\x76\xd0\xe6\x6c\x9c\xf4\x84\x5c\x11\xd9\x45\xb8\xf6\xe6\x69\xe6\xb3\xb1\x5e\x9e\xf8\x8e\x9b\xea\xbb\xd8\x51\xcb\xad\xe8\xde\x7b\xd1\x21\xf6\xf4\x4b\x6e\xee\xdd\x62\x6d\x23\xcb\x36\xe7\x20\xb7\x00\xf2\x18\xde\x7f\x30\xb8\x79\xe8\xea\x20\x99\x61\x86\xa7\x8b\x90\x92\x12\xe0\x91\x6d\x7c\xe9\xa2\xf7\x38\x73\x11\x7d\xa3\x2a\x5c\xcb\x69\xe8\x27\x0f\xb0\x07\x3c\x76\x15\x66\xb3\x60\x3c\xbf\xff\x7e\x8f\x3d\x7b\x27\xcb\xca\x25\x36\xcc\x2a\x3e\xb8\xcb\xfe\x98\x32\x61\xc4\x69\x51\xe6\x3d\x0c\x91\x80\x51\xb2\x1b\x28\x1f\xa0\x76\x41\x36\x13\xa1\x85\xc9\x77\xcf\xd3\x17\xce\x37\xd9\x0b\xc6\xd9\x8e\x6d\xf6\xbf\x32\x16\x7c\x6c\x6c\xa7\xbb\x8a\x40\x3e\x47\x3e\x72\x15\xeb\xd4\x85\xe9\x24\xaf\x9c\x9f\x1b\x78\xf3\xbc\x1b\xe8\x46\x95\xe0\xe2\x42\x57\xb4\x94\x41\x67\x76\x69\x91\x94\x62\x17\x45\x08\x21\xa7\xd4\x78\x91\x3c\x82\x6f\x92\x51\xa7\xb4\x2c\x43\x90\x48\x95\xea\x60\x5c\xfd\x55\x73\xf0\x89\xc9\xf0\x02\x25\x00\x64\xae\x9d\xbc\x60\x2a\x51\x77\x66\x09\xc4\x37\x87\x71\x62\xf1\x3b\x38\x01\xa0\x04\x7c\xa9\x02\xa7\x23\xdd\x44\x37\x04\xd4\x68\xa0\x0a\x7f\x44\xd7\x50\x8a\x14\x1d\xea\xa9\xc8\x09\xa4\x44\xd6\x4f\x40\x4c\x80\x3a\xa6\xc8\x8a\xae\xa8\x8a\x2a\x49\x69\x0f\xbc\xae\xf2\x28\x47\xf2\x6f\x1f\x65\x27\x46\x78\x5c\x9b\x2b\x22\x59\xaf\x08\x1b\xf0\xdf\x76\x34\xf8\x5b\x6f\x87\x9b\xea\x6c\xae\xf0\x32\x07\x08\x31\xc0\xfb\x29\x37\xee\xae\xc8\xa5\xe2\x0a\xf6\x87\x16\x5a\xc5\x01\xe9\x74\x3d\x4e\x12\x8a\x19\x0f\x11\xce\xde\x04\xc0\x63\xdc\x50\x10\x83\x04\xb3\xb0\x8f\x83\x26\xe7\xb2\x3a\x94\xdc\x26\x7b\x39\x4c\xc8\x7d\xa3\x4c\x19\xf2\xc3\x85\x81\x60\x02\x88\xb8\x35\xc1\xf1\xe0\x95\x91\xb7\xc8\x02\xf9\xec\x57\xd7\xf2\xa2\x07\xc4\xdb\x8e\x54\x78\xcb\x15\x8a\xfb\x2b\x30\x08\xdf\xc0\x4c\xc5\x3b\xac\x44\xc5\xa7\x5e\x66\x9e\x22\x04\x2e\x00\xb5\xfc\x5b\x3c\xb6\xb0\xe7\xe0\x8c\x9d\x44\x05\xb0\x2d\x3d\x13\xbc\xd8\x98\xa0\x3e\x32\x92\x82\xf4\x54\x21\x47\x1b\xbb\x17\xe5\x85\x9c\xb4\x14\x29\xa3\xc2\x85\xc0\xd0\xcf\xde\xe9\xe9\x20\xab\xd7\x7b\x6c\x6e\x1f\xd5\xad\xa8\x2a\x94\x13\x9c\x5b\xd1\xe4\x34\x04\x23\x00\xc9\xe8\x68\x1c\x32\x09\xdc\x46\x09\xb7\x81\x81\x55\x3b\x62\x23\xe1\x11\x1b\xf8\x41\xef\xb9\xbb\xe7\x0d\x9e\xf5\x4f\xeb\xbc\xc1\x91\x98\x0a\x3b\x74\xf6\x60\x5e\xe1\xef\x8c\xb3\x9b\x77\x8f\x19\xdb\x79\xe0\xfc\xd7\x8f\x07\xef\xd8\x49\xce\x7f\x33\xc7\x8e\x7d\xa5\x76\x25\x46\xea\xeb\x10\x23\xf5\x9e\x23\x0e\xcb\x38\x80\x78\x6e\x49\xf9\x02\x58\xb7\x28\x53\x97\xb2\xbc\xf4\x5f\x7c\x24\xb8\xd1\xbe\xe0\x92\xd4\xc1\x15\x45\x0c\x00\x94\x24\xf8\xe4\x4a\x12\xb7\xdc\xf8\xa0\x9f\x3f\xcc\x3e\x5f\x63\x47\xc3\x6e\x77\x29\xcf\xca\xac\x95\x25\x68\x31\x96\xfa\xa3\x05\x98\xcd\xbb\x74\xd7\x30\xb8\x4b\x15\xcf\x39\xb6\xa2\x29\x0c\x58\x58\x30\x29\xdb\x32\x40\x24\xe1\x9a\x48\x08\x63\xbc\xc9\xcf\x59\x09\x4e\xa0\x72\x70\x82\x76\x46\xbc\x26\xf9\x89\xc5\xd9\xb3\xb3\xa6\x24\x15\x2d\x80\x0f\x1f\x0b\x0b\xa9\x45\xf0\xe5\x53\x73\x8d\x1b\x4e\x9c\xb8\x1e\xe6\xb6\xdc\x1c\x4e\x4e\x4d\x6d\x6f\x6f\x37\xe3\x30\x45\x06\xe3\xb0\x28\xe2\x36\xe0\x11\x17\xca\xe7\xde\x80\x22\x26\x9b\x72\x2d\x34\x74\xf9\xaa\x75\x5a\x19\x90\xea\xcd\x40\x15\x15\x98\x60\xa7\xdf\xca\x3a\xdd\x30\xed\x37\x5b\x59\x67\xaa\xd3\x6f\xa0\xe2\xda\x50\x65\x38\x16\xe3\x07\xc6\x28\xcc\xe9\xc3\x63\xc1\x8f\x8f\xad\x3a\x99\x6d\xba\x0f\x67\x81\x8f\x25\x47\x92\x9a\xc1\xd1\xc2\x15\x09\x49\x67\x8a\x45\x8c\x60\xfd\xc8\x79\xe1\x3e\x1d\xcb\x79\x97\x6f\xc5\x8a\xc4\xca\x21\x9b\xa4\x3e\xa8\x2b\x14\xcd\xa1\xb0\x4f\x3a\x66\x37\xa1\x36\xdf\x73\x4f\x13\x3f\x74\x56\x13\x9f\x88\x18\xe4\xf2\x1a\x20\xc0\xd8\x6e\x7e\x60\x6b\x0c\x8b\xc2\x90\xa6\x58\xa9\x06\x27\xf9\xb5\x5a\xae\x38\xa9\x6c\x37\x9c\xb0\x33\xd9\x92\x2c\x6d\x37\xd5\xa3\x16\xc2\x86\x14\xfa\x39\xa8\x9e\x3b\x81\x6d\x00\xc4\x46\x63\x42\xbf\x0c\x20\xb5\xc8\xba\x92\x1a\x3c\xd3\xea\x97\x1d\x2b\xb7\x13\xb9\x60\x8f\xe3\xfb\x14\x01\xe6\xfd\x9a\x88\xfc\xd5\x40\x44\x6e\x53\x54\x2a\x6a\x19\x1a\x90\x61\xc4\x65\x03\xf0\xde\x75\xa0\x13\x55\x78\x3e\x39\x98\x54\x5f\xd9\xb1\x88\x16\x2e\xb3\xb8\xa0\x39\x34\xb5\x6b\x85\x50\x68\x72\x97\xe1\x7a\x8d\x1d\x56\xb3\xd2\xbf\x2b\x58\x94\xf5\x5d\x5c\xda\x71\x29\xab\x6c\xf4\x73\xf3\x4b\x75\xbe\x3a\xb7\x04\x44\x3e\x2b\x73\xab\x4b\x4e\x17\xad\xce\x2d\x39\x3d\xf3\x43\x8f\x76\x92\x4b\xc3\x6e\xb7\xa0\x40\x47\x79\xe6\x38\x07\x4a\xdd\x7c\x28\x3a\x59\xba\x22\x4a\xff\xab\x7e\x70\x1b\x12\xc4\x64\xca\x55\x49\x56\xc3\x02\xec\xa9\x6b\x62\x23\xdc\x8a\x11\xfd\x2d\x82\xb7\xc0\x4c\x9e\x63\x69\xa4\x23\xba\x96\x92\x1f\xf4\xd9\x6f\x32\x76\xb8\x13\x5e\x58\xe9\xe5\x6d\xe1\x7f\x82\xed\x55\x5f\xeb\x95\x71\xd2\x8c\xd3\xb2\x28\xf3\xe6\x62\x5a\xde\x99\xaf\x40\x93\x82\xef\x83\x60\xb7\x4e\x78\x21\xee\xf4\x3a\xd6\xe0\xa6\xe0\xb5\xd6\xf0\xb8\x8a\x8f\xcd\x58\xac\x74\x3b\x91\xb6\x0c\x03\xde\x52\x5a\xbc\xa9\xc6\x30\x71\x1f\x23\xdf\x0d\xfd\xa3\x1f\x23\xbc\x18\xcd\x17\x2a\x75\xbb\x22\x4b\x7a\xa5\x26\xbf\x3f\x26\x2e\x9c\xe4\xd7\x4f\x22\xa4\x55\x57\xe4\x2d\x79\xce\x69\x83\x70\x51\xdd\x09\x20\x45\xf0\xdc\xcc\xf4\x13\x26\x49\x5a\xcb\x12\x49\xe7\x9e\xe6\xf1\x3a\x3f\x13\x5e\x38\x97\x9a\x46\xc4\x05\x9f\x6e\xf2\xd9\x81\x8f\xc1\x7b\x49\x8b\x48\x35\x41\xb4\x58\x9f\x5c\xeb\x73\xc8\x03\xc7\x31\xc2\x84\xce\x4e\x9c\x42\xff\x65\xeb\x7c\xc6\xcc\x20\xed\x38\x9d\x06\xbe\x52\xcc\xd2\x22\x4b\x1f\xae\x14\x72\x8b\x9c\x98\x7e\x42\x5d\x87\x17\x9d\x98\x7e\x82\xa6\x47\x07\xbc\xd5\xc1\x41\x19\xa0\x63\x55\x86\x47\x98\x5a\x38\x8d\x64\x57\x1f\x8b\x9b\xa2\x49\x2e\xe2\x26\xf5\xd1\x59\x28\x69\x45\xd1\xcd\x4f\x9a\x11\xc3\xd0\x0f\xf4\x0b\xc8\xb7\x15\xf5\x3e\xb9\x3c\x21\x67\x2f\x89\x14\xc3\x5d\x27\xcc\x37\x31\x66\x18\x61\xb0\x28\x9e\x8e\x8c\xa9\x20\x91\x0a\xd9\x4f\x49\xd8\x4b\xe5\x24\x6c\xab\x72\x0b\x9e\xa5\xaa\x81\xd0\x98\x26\x07\x7c\x71\x6b\xc2\xd0\x27\xcc\x18\x1d\x5b\x06\xea\x03\xd0\x25\x4a\x9e\x88\x10\xfc\x46\x29\x5c\x25\x32\xfe\x49\x5d\x41\x77\xba\xa9\xd8\xe2\x94\x62\x68\xa8\xde\xba\xd2\xb4\xab\xa8\x96\xad\x89\x56\x26\x77\xbf\x9e\x35\x43\x5c\x32\x7e\x55\x19\x93\xb3\x51\x58\xfe\x46\x29\x54\x91\x8c\x0f\xc4\x89\xdc\x9e\xf2\x30\x4e\x65\x47\x0f\x37\x50\x87\x92\x46\x49\x5f\x77\xb7\x53\x61\xb9\xf8\xe4\x09\x47\x45\xc5\x02\x16\x86\x5c\xf6\x08\xaa\x5b\xc0\x66\x8a\xfe\x38\xbc\x1c\x77\x28\x35\x10\x64\x75\x51\xc4\x6b\x71\xe2\x04\xce\x9a\x4c\x28\x92\xa1\x3a\x7e\x09\x27\x0e\x84\x79\xa6\x18\xe5\x8d\x10\x97\x90\x57\x14\xa6\x8a\x14\x25\x56\x90\xae\xc4\x15\x40\x76\x8f\xf5\x30\x4e\x88\x37\xb1\xb0\x18\x16\x01\xb5\xb8\x88\xb7\xac\xe2\xb5\xd2\x01\xd4\x70\x00\x85\xac\xa3\x22\xa9\x96\x7d\x38\x68\xa3\xd5\x05\xba\x13\x7a\x59\x49\x8e\xb8\xc8\x7b\x5d\xb4\xf7\x0c\x73\x06\xea\xe0\x50\xed\x64\x06\x63\xb9\x7c\x51\x4f\x0c\x94\xd2\x20\x3e\x07\xdc\xe2\x1f\x3c\xc4\x1e\xd1\x71\xe4\x83\xff\x8e\x43\x97\x2b\x5f\xbf\x72\xb0\x5a\xbe\x3a\x13\xb5\x30\xf2\x13\x88\x6b\xcc\xf4\xa3\x66\x97\x7a\x75\x5d\x96\xa8\x1c\x94\x27\x03\x95\xa0\x59\x82\x1a\x05\x89\x20\x5a\xd3\x96\x5c\xbd\x74\x69\x19\x91\x05\xd2\x91\x97\x90\x36\xab\x64\xf5\x80\xa8\xc6\x51\x92\x02\x74\x58\xa6\xce\xfc\x13\x91\xa9\xd0\xb3\x45\x99\x41\x90\x34\x4a\x13\xd5\xa9\x84\xc4\x85\x4b\x0d\xf1\xb8\x2a\xc5\x28\xbc\x0d\x1b\xe6\x60\x73\xb2\x42\x0c\x0d\xa2\xe2\x50\x58\xcb\x01\xb0\xb6\xd7\x05\xe1\x3b\xf0\x14\xaa\x58\xb2\x7a\x09\x80\xab\xdc\x99\x12\xf8\x86\x16\xd4\x90\x0c\xad\xe6\x61\x9d\xc7\x44\x2e\x47\x91\x4e\x52\x90\x97\x19\x85\x28\xba\x65\x4b\x8d\xbb\x57\x60\xa2\x2d\xf6\xa1\x6c\xa7\x92\xdc\x37\x62\xd5\xb3\x3c\x6e\x03\x7c\xf9\xce\x93\xd1\xfe\x3e\x57\x10\x00\xb1\x94\xcf\xc3\x8b\x82\xfd\xea\x38\x1b\x38\xd8\x66\x45\x2b\x4c\x00\xab\xe1\xb8\x3c\xd6\x1e\x6f\xde\xbe\x34\xbb\x82\x97\x28\x5a\xe8\x75\xe3\xc1\xdd\x83\x17\xc9\x6a\x88\x04\x1b\xc8\x1b\xa9\xfc\xb9\x70\x34\x91\x5b\x05\x30\x6c\xe0\xd1\xd6\x38\x06\xba\xa1\xb2\x96\x6e\x85\x89\x49\xe1\x3c\x00\xf3\xf5\xa2\x77\x35\x3a\x4f\x69\xbf\x72\xe9\xc9\xc7\xd8\x27\x3c\xe6\x3e\xe0\x7f\x40\xab\xde\x3f\xec\x2d\xd9\x77\x06\xf2\x81\xb7\xe3\x34\xca\xb6\x61\x32\xc4\x14\x3c\x6e\x40\xea\xa9\xfe\x0a\x43\x44\xd5\xbd\xc9\xdd\x12\x95\x0a\xee\x40\xbf\xdf\x27\xf2\x0c\xe6\x12\x10\x58\xc1\xa5\x2c\xe7\xe2\xb9\xbd\x30\x01\x2c\xf7\x9b\xa6\xa7\xf9\xb1\x13\xd3\x72\x25\x4f\xba\x8a\xf8\xad\x94\x9e\x7a\x53\xf0\xc4\x55\xa2\x53\x56\x81\xcd\x2a\x37\x09\x33\x70\xa1\xdb\x15\x39\xe7\x40\xca\x2a\xf6\x9b\xbf\xad\x7a\x61\x8d\xa4\x9e\x0d\x5d\x18\x52\x08\xd0\xba\xf2\x36\xeb\x30\x5d\x88\xe0\x2a\x2d\x44\x29\xc5\x00\xba\x58\xee\xdc\x5a\xa7\x11\x6f\x1c\x77\x5c\x1b\xf4\xbe\x01\xc1\x48\x67\x31\xf0\x6c\x85\xbc\x63\xc8\x1e\x50\xf8\xff\x63\x2c\x38\xbf\xe3\x5d\xc7\x8e\xaf\xfd\x6a\x90\x49\xa4\x30\x0a\x32\x7a\x52\xf5\x18\x2a\x06\xce\x0b\x72\x72\xe5\xbd\xc4\x35\x6d\xfc\xcf\x1a\xfb\x07\x8f\x1d\x04\x30\xcb\xc2\xff\x4b\x2f\x78\x8f\x87\x7f\xc3\x3a\x82\xde\x22\x83\x22\x5d\xce\xd6\x79\x3b\x56\x1b\x0f\x05\xa7\x62\xa8\x0d\xe5\x91\x6d\xc3\xa4\x81\x40\x2c\xa9\xe1\x00\x3a\x8f\x5e\x19\xed\x98\x84\x4c\xd1\xeb\x76\x13\x8b\x93\x26\xc7\x81\x50\xf9\x23\x80\x0e\xe3\x9c\x50\x4d\x26\x3c\x4c\x56\x79\x0e\x83\xfe\x72\xfc\x4c\x27\xd8\x0c\x9b\xda\xd1\x6a\x35\x30\x18\x8b\xf3\xcb\xf2\xa3\x2c\x61\xd0\x2d\x7e\x14\xdc\x0d\xe9\xfe\xf1\x60\x3f\xcb\x96\x82\x5f\x2b\x8a\x5b\xa5\xea\x55\xe8\x16\x10\x31\x66\xd8\x54\xb8\x9e\xdd\x37\x85\x28\xdd\x04\xbd\xc3\x6c\x96\xea\xb4\xd9\x5b\x13\x8d\xb0\xdd\xce\x45\x1b\x92\x43\x6d\x07\xed\x00\x86\x4a\x73\x76\x49\xb9\xf7\x4f\xc7\x45\xe9\x7f\xe5\x50\x30\xe5\x5e\x72\x01\x20\xcc\x3d\x95\xb7\xd4\xbc\xe8\x1d\x88\x4b\xd1\x71\x65\xc8\x7b\x0e\x5e\x71\x21\x5d\xae\x0b\x49\x30\xec\x58\xff\x5f\xdb\x53\xf1\x4e\x76\x86\xdd\x51\x39\x15\x2f\x6d\xd8\xaf\x78\xaa\x2e\xc3\x53\xb5\x68\x79\xaa\x9e\xc2\x9e\x7c\x09\x9e\x2a\xb9\xc4\xce\x88\x32\x7c\xd0\xbb\x77\x77\x87\xca\xd3\xfc\x05\xe3\x50\x19\x18\xd4\x01\x97\x8a\xbb\x88\x07\x3d\x29\x9f\x3e\x34\xe8\x28\x1f\xd0\x4e\x4c\x0c\xce\x19\x51\xe6\x71\x8b\xa0\xf4\x2e\x1e\x0a\xfe\xb7\x57\x75\xc7\xf2\x1f\x51\xe8\x06\xe2\xa9\x00\xfe\x42\x07\x1e\xc4\xdc\xdd\x01\x4c\x42\xb9\xc5\x58\x36\x52\x9a\x42\xc7\xec\xe8\x34\x03\x71\xf3\xdc\x9e\xe8\x41\x08\x57\x2b\xc9\x7a\x11\x21\x23\xc0\x69\x53\x99\x56\xb3\x9c\x3f\x63\x69\x05\xe7\x57\x92\x85\xd1\x5a\x98\x84\x69\x0b\x69\xce\x40\x7f\xce\x7a\x25\xe4\x9f\xc8\x3d\x1a\x63\xe7\x26\x9b\x8e\x33\x27\x40\x20\xeb\x80\x90\x20\x0d\x52\x98\x28\x9b\x17\x3d\x86\x4d\x19\x82\xc9\x7b\xe1\x01\x76\x9a\x59\x37\xfd\x5b\x82\x19\xf3\xab\x8a\x25\x83\xfa\x24\x4e\x39\xe6\x5c\x0f\x80\x2d\xbc\xd3\x63\x8f\xc0\x47\x56\x44\x02\x54\x95\xfe\xab\x3d\x76\xeb\xa5\x4c\xb0\x70\x4d\x24\xaa\x90\x60\xc9\x2d\xd4\xd6\x85\x08\x89\xb1\x6f\xb4\xc8\x16\x31\x96\x89\x3c\x26\xd3\x9b\x45\x36\x81\x05\x35\xd9\xaf\x78\xcc\xc7\x3e\x9b\xdd\x12\x79\xd8\x16\xa0\x18\xf9\xef\xf7\xf6\xb1\x1c\x9a\x3a\xee\xe4\x19\xbd\x30\x2d\xe3\xb2\x1f\xf4\x86\xcb\xd4\x99\xce\x08\x35\xde\x15\x79\x43\x9e\x81\x50\x40\x49\xf5\x01\x51\xe4\xa9\x67\x8f\x01\xa2\xdb\x73\xa9\xbc\xc9\x26\x3f\xd3\x2b\x7b\x10\x29\x28\x2e\xc8\xa1\x8f\xb7\x48\x2d\x58\x85\xe2\xe0\x0b\x4d\xf6\x41\x8f\x1d\x2d\xcd\x05\xff\x47\x2f\xb3\x19\xf7\x5a\x85\x0d\xd4\x5f\xd7\xdb\x9a\x0e\xfb\xac\xb4\xdd\x3b\x4d\xf6\xa9\x43\xec\xda\x1d\xd1\xe1\xce\xe2\x2f\x3c\x54\x80\x13\xeb\xcd\x87\x82\x1b\x86\xae\x5a\x7e\xb3\x10\xcd\xeb\xf2\x78\x2c\x55\x12\x5e\xe6\xe1\xba\x9c\x13\x84\xea\xae\xa6\xfe\xe7\x0f\xb2\xd7\x8d\xb1\x43\x22\x8d\xa0\xd4\x57\x8c\x29\x0d\xf9\xef\x34\x6d\x79\x45\x0a\x36\xaa\x65\x00\xc8\x24\xcf\x94\x78\x48\xa7\xcf\x51\x51\x75\x0c\x1b\x92\x6d\xae\x5b\x0b\x51\xa9\x8d\x03\x8a\xb4\xe5\x0a\x33\xc7\x76\x9d\x7b\x46\xcc\x34\xf2\x03\x3a\x74\x55\x3e\xa3\x1e\x90\x2b\xa1\xea\x19\x75\x1f\x86\x45\x2e\xdf\x88\x1f\xc3\x15\x3a\xa9\x5d\x70\x42\x55\xd8\xf8\xf2\xe1\x50\x92\xe5\xae\x4a\x6f\xbb\xec\x4c\xf0\x64\x9c\xf2\x59\xb0\x15\x15\xa0\x01\x82\xc5\x4a\xb7\x55\x25\xbe\x18\xa2\xe2\x53\xf4\xe6\xd3\xe4\xc3\x81\x33\x7c\x0b\x58\x8b\xc0\x3d\xfc\xfc\x74\x8d\x7c\x27\xef\xae\x5d\xae\xe5\xe8\x4f\x8c\xcf\x85\x80\xa7\x50\x12\x68\xdf\x9b\xb1\x70\x5b\xae\x2a\x4e\x4e\x1f\xec\x11\xec\x43\x55\x46\x88\x09\x7b\x9a\xcd\xd0\x1e\x1a\xc5\xe9\x4c\xfe\x32\x40\x4a\xc2\x40\x33\x72\xfb\xa0\xeb\x32\x8d\xe8\xc4\x8e\xd1\x72\x1a\x6f\x0b\xc2\x59\xcd\x94\xb5\x1d\x36\xc2\xb8\x1c\xf9\xec\xd9\x79\x2c\x4e\x45\xf7\xe3\x77\xa2\x26\x7b\x81\x67\xf9\x6f\x7a\xc1\x06\xb4\x5d\xbd\x76\x0c\x3c\x34\xe0\xab\x21\x37\xcd\xa4\x3a\xe6\xd2\x27\x61\x2e\x40\x61\xd5\x14\xc3\x95\xf1\xc6\x83\xee\x9d\x7f\x18\x67\x8f\xab\x40\x76\x5a\x0d\xe3\xb4\xf4\x7f\x77\x3c\x38\xbf\xaa\x88\xd2\xa0\x40\xb8\xee\x64\x83\x95\x19\x26\x41\x6e\x08\x1e\x20\x13\x50\xa0\xec\xa9\xda\x49\xa2\xa3\xf4\xca\x2c\x11\xb9\x3a\x86\x40\x59\xcd\x8b\xde\xd8\xa6\xe8\x5f\xf4\x0e\xe2\xcb\xce\xc2\xff\xdd\x31\xf6\x66\x8f\xd1\x1d\xff\x35\x5e\xf0\x12\x4f\x63\x8a\xe1\xb2\x40\xea\x21\x65\xe6\x82\xca\xa1\xdd\x4a\xa1\xcf\x67\xc3\xdf\x85\xc7\x14\x84\x18\x96\x80\x47\xc6\xb3\x99\x32\x69\xd5\xf9\x12\x84\x66\x9a\x2b\x14\x5f\xb1\x80\xa4\xe2\x03\xdc\x15\xb2\x05\xfe\x53\x82\x69\xb7\x72\x58\x9d\x4d\xd1\x57\x19\xa2\x80\x62\x17\xa1\x35\x10\x50\xaf\xec\x52\xde\xed\xb1\x23\x72\x2f\x9c\x8d\x22\x11\xf9\x6f\xf2\x2e\x1d\x28\x2a\x5a\x55\xc5\xd8\x41\x03\xd0\x72\xb9\xd7\x3a\x2c\x7f\x58\xc7\xed\xb0\xd0\x20\x80\x26\x09\x42\x71\xf1\x49\x4d\x49\xb7\x1c\xdf\x28\x9a\x6c\x41\xd9\x2b\x6e\x0e\xa6\x4c\x6b\xb7\xc8\x64\xa1\x3c\xcf\x94\x1d\x58\xda\xdd\xe1\x34\xfb\xbd\x87\x1d\xf7\x62\x65\x40\x04\x78\xbe\xe1\xec\xf8\xc2\xc3\xc1\x0d\x43\x57\xdd\xd0\x88\x44\x93\x15\x93\xde\x0f\x88\x85\x45\xe5\x11\xf2\xe3\x57\x8e\x90\x97\x7d\x84\x5c\x57\x47\xc8\x7b\x82\xc7\x9e\xae\xee\x7b\xfb\x6c\x79\x23\xbb\x9e\x9d\xd8\xd1\xcc\xb1\xf3\xf0\x5f\x39\x43\x5e\xc6\x19\x72\xcd\x3a\x43\xde\x75\x59\x67\xc8\xe0\xb1\x9a\x92\x01\x93\xd9\x14\x1d\xc3\x83\x5e\x7b\xf7\xc3\xe5\xbc\x7f\x9b\x3e\x5c\x9a\xa1\x1e\x38\x56\x0e\xad\xef\xc1\x93\xe5\x0b\x6a\xec\x89\xd6\x9c\x71\xf2\x01\xc8\x3c\x86\x38\xc5\x18\x96\xe8\xff\xba\x17\xdc\xe4\x5c\xd1\x1a\xa8\x13\x66\x8d\xda\x11\x6d\x25\x95\x20\xd7\xdf\xe7\xb1\xff\xe0\xb1\xab\xe4\xa9\xef\x36\x3a\xf5\xf9\xbd\x11\xb3\xd9\x30\x58\x9a\x17\x28\x64\xf2\x16\xfb\xda\x00\x3b\x8d\x55\x1f\x83\x7f\x27\x3f\xda\x50\x67\xcd\x26\x7b\xed\x21\x76\xfd\x25\x05\x6b\xfa\x5f\x3c\x18\x7c\xe7\x8e\x77\x2f\x7a\x87\x48\xf9\x75\xe9\x8e\x0e\xb2\x16\x53\x77\xfc\x67\x06\x4f\x9f\x25\x0d\x39\x2e\x74\xaa\x5c\x13\x00\xf9\x94\x8e\x8b\x91\xdf\x64\x50\x35\x2a\x75\x9d\xe0\x74\x74\x06\x9f\x9b\xd1\xf3\xc2\x1a\x3b\x18\x89\x34\x16\x91\xff\x77\x5e\xf0\x47\xde\x3c\xfc\x6d\xa3\x3d\x8f\xfe\x0a\xbe\x6b\x27\x08\x52\x5a\xeb\xe2\x3a\xe6\xeb\x85\xa6\xde\x06\xd7\x27\xd2\x5f\x31\xf9\xdd\x94\x5c\x6e\x50\xed\xa4\x8e\x93\x66\x3c\xeb\xc6\x29\xc8\xf8\xd4\x04\xb1\x66\xe6\x39\xab\x56\x4d\x4e\xb5\x97\x42\x85\x84\x42\x49\x75\xb7\xba\x0f\x9c\x13\x4e\x27\x7c\xb1\xc6\x1e\x49\xe1\xbc\x71\x86\x24\xd1\xfe\x27\x6a\xc1\x87\x6b\x0b\xee\x45\x72\x03\x2b\xd0\x46\xe5\x46\x07\x6c\x24\xa0\x26\xe3\x59\x0b\xe6\x52\x64\x3b\x8f\x9c\x99\x82\xae\x6c\xb5\xe9\x4b\x39\x92\x8b\xc4\xca\x68\x53\x60\x15\xc4\x75\x06\xbd\x65\x27\x00\x64\x52\xd0\xf6\x84\x49\x04\x1c\x28\x9e\xa6\x70\x9c\xf2\xa2\x1b\xe3\xe2\x8a\x4b\x04\xb4\x88\xd3\xa2\x94\x73\xb9\xce\x97\x6f\x9b\x9d\xd3\x84\x3d\x71\x81\x49\xbb\x16\xb3\x26\x11\xb9\xca\x0b\xa8\xa6\x15\x25\x64\x13\xa3\xf4\xc6\x3a\x01\x47\x01\xe4\xe5\x41\xc4\xc2\x50\x94\xb4\xa3\x72\xdc\xa3\x11\x2b\x57\x82\x53\xcb\xf8\x86\x33\xc5\xa0\x3f\xac\x60\x65\x48\x75\xa3\x30\x65\x50\x95\x4c\x9c\x32\xce\x1d\x37\x60\x6a\x8c\x05\x55\x1a\xf5\xdc\xd2\x4a\xd6\xda\x14\xe5\x2c\x4c\x0f\xff\x7f\xd5\x82\xa7\x0c\x5c\xb3\x4f\xc6\x2a\x79\x82\xaf\x85\x94\xb3\x9d\x75\x05\xa2\xa5\xf3\x02\xde\xb9\xe8\xc1\xa9\xcb\x59\xa8\xff\xa5\xc6\x3e\xa6\x22\xd9\x7e\x7e\xcf\xfc\x3b\x3b\x9d\xc6\x9e\x77\x96\x1c\x95\xb9\xcb\xbe\xaa\xce\xec\x18\xda\x9a\x99\xc8\x35\xcc\x01\xe4\xf4\x9a\x09\x73\xb3\xce\xe3\x33\xf2\xcd\x1b\xae\xbf\xfe\xc4\xf5\x76\xdc\x21\x7a\xf5\x17\x67\xcf\xce\x3e\x67\xe5\xae\xb9\xe7\x9c\x9d\x3d\xb3\xd0\x64\x77\xb2\xf1\x8d\xac\x28\xfd\xa7\x05\x27\x0d\x51\xf5\xed\x59\x81\x07\x33\x9a\x80\xa9\xdc\xcb\xcb\xac\xee\x1c\x72\x14\xf4\xcb\xa2\x7b\xd6\x79\xdf\x63\xd8\x3d\x97\x9a\x68\x86\x1b\xcb\x1c\x84\x82\xaa\xc0\xe0\x79\xdd\xb7\x4a\x7d\xfc\xf5\x47\x07\x37\xef\xf2\x8c\x63\xfe\x50\xd9\x52\x52\xc5\x9e\x5b\x9e\x57\x9c\xb8\x17\xbd\x83\x18\x2a\x7b\xd1\x3b\x44\x49\xcd\xce\x30\xff\xb1\xcf\x5e\x34\xc6\x0e\xa2\xe2\xe8\xff\x7d\x8d\x45\x0f\x4d\x36\x5d\x55\x23\xef\xd2\x61\x9e\xc1\x2b\x6b\xa4\xf8\x9a\x26\xa0\x57\x13\x2e\x82\x91\x4f\x36\xc4\xc2\xa0\x06\x68\x89\xbc\x87\x76\x51\xd2\x96\x55\x9b\x15\xb0\xeb\x60\x5a\xd8\x6a\xd6\x45\x20\x08\x05\x4c\xa1\x74\x08\xad\x28\x4b\x21\xd0\x19\xb2\x5a\x81\x8b\x77\xe8\x59\x4d\x9c\x16\x12\x3c\x07\x46\x4a\xa0\x25\xb2\xa5\xd4\xeb\x82\x1f\x2b\xf5\x67\xad\xfa\x53\xd3\x8c\xb9\xa4\x87\x60\x01\x45\x29\xc2\x68\xb2\xc9\x36\x18\x0d\x94\xff\x6f\x82\x25\xc5\x46\x2b\x07\x76\x3d\x09\xdb\x3a\x10\x67\x0a\xf3\xb9\x0d\xfd\x88\x1a\x75\xa9\x5f\x62\xfe\x06\xbd\xbb\x15\x87\xa8\xb2\xce\x2e\x2d\x16\xce\xae\x70\xbf\xc7\xd4\x54\xf0\xdf\xe8\x05\xaf\xf4\x14\xe0\xdc\x00\xf8\x84\x6e\xbf\x5b\x65\x88\x16\xa1\x5c\x3b\xc8\xd8\x75\x7b\x1d\x56\x8d\x4a\x9f\x97\x87\xd7\xdc\x2c\x4c\x61\x99\xae\x4d\x76\x5f\xb9\xa1\x9e\x7f\xca\xf0\x16\xf6\x1f\xc6\xd8\x55\x36\x3e\xb8\xff\xd7\x35\xb6\xfe\xf0\x4d\x51\x1b\xef\x3a\x78\x69\xcd\x41\x26\x57\xee\x77\x80\xcd\x72\xee\x54\x4d\x46\x65\x8c\x1b\x24\xab\xd8\x08\xb7\x46\xcf\x4c\xbb\xe0\x3d\x4d\x4f\x07\xa2\x7b\xff\x73\xd4\x6d\xe3\x4e\xd3\xf3\x2f\xc6\xd9\xe3\x0c\xe4\xc8\x52\x0e\x67\xca\xb9\x2c\xe9\x75\xd2\xc2\xff\x8d\xf1\xe0\x73\x63\x3b\xdd\xb5\xf3\x2e\x6d\x76\x0e\xbc\x89\x1c\xa8\x18\xb5\xbc\x0a\xda\x40\xd6\x2b\xbb\x3d\x38\xed\x56\x01\x4f\x69\xb4\x29\x0d\xf3\x39\x05\xf6\x46\x39\xe0\xea\x18\x83\x14\x3b\xd7\x20\x94\x9c\xbc\xa7\xdb\xd7\x08\x8b\x06\x00\x00\x10\xe9\x8b\x46\x90\xd9\x71\x38\x54\x3d\xf7\x32\x12\xea\xd9\x4b\x18\x04\xf5\xea\x4e\xfd\x8f\x56\x39\x6e\x5e\xc8\xf2\x1d\xab\x69\x59\xee\x74\x60\x01\xde\x97\x27\xa5\x6e\x12\xf6\xb5\x06\xd7\x16\x3b\xc8\x4e\xe5\x6a\x71\xe2\x0a\x52\x96\xb0\x7b\x1f\xbe\xb5\x87\xf3\xc5\xec\x72\xec\xb7\x3d\xc6\x22\xcd\xfb\xed\xff\xaa\x17\xfc\xbc\x17\xd9\x3c\xe0\x95\xe2\x6a\x87\x06\xcd\x2e\x2d\xa2\x8d\x5c\xbd\xdf\xe4\x77\x43\x08\x86\x8d\xc6\x23\x1f\xb2\x4e\xe1\x6e\xc1\x06\x9a\x70\x3b\xcc\x61\x1f\xda\x10\x61\x24\x72\xcd\x17\x85\xf9\x69\x84\x1e\x63\x50\xf0\x2d\x70\x06\x97\x6b\xa9\xc6\x7c\x55\x9d\x38\x4b\xef\xc6\x42\xfd\xd7\xd5\x82\xff\x58\x1b\xbe\x0e\x14\x0b\x79\x1c\xd1\x4e\xa9\x10\xf8\x54\x55\xf4\x3a\x2a\x33\x68\x05\x9a\x16\x8a\x26\x3f\x13\xf6\xd1\x06\x47\x13\x11\xc4\xf7\x79\xd3\x0d\xe7\xf5\xd1\xc1\x41\xf6\x53\xe5\xee\xd0\xc9\x4e\x4f\x52\xcc\x28\x11\xd0\xc0\xc4\x51\xa3\x90\x8a\x6d\xc0\x84\xa4\x3d\xc9\x0c\xd1\x90\xd7\xa1\x28\x43\x8c\xb7\x05\x12\x50\x20\xfe\x02\x12\xf9\xe6\x00\xbb\x0b\xe6\xc8\xbc\xcf\x0b\xde\xee\xa5\x96\xb7\x52\x15\x9d\x02\xe4\x11\xd0\x1b\x7d\xf9\xf9\xaf\xdf\x9a\xf9\xf2\xf3\xdf\x50\x87\xbf\xd0\x51\x0c\x3f\x45\xd9\xc2\xc6\x0e\x6d\x5d\xb0\x7c\xb0\xae\x00\x7c\xe5\x36\x3a\x2c\xf9\x79\x29\x63\x8a\xa9\x9b\xc1\xf2\x70\xcb\xd4\xcd\x74\xeb\x96\xa9\x66\xb3\x79\x5e\x56\xfc\x3c\xbe\x7e\xde\x3a\x90\x99\xea\x7f\xd5\x35\x37\xac\x27\xd9\x36\x65\x36\xe8\x25\x81\x81\x4f\x78\xa8\xf6\x3f\x58\x0b\x9e\x6a\x5f\xa0\x2c\x4e\x14\x5b\x22\x1a\x4a\x16\x43\x3b\x09\x20\x3a\x12\x43\x7d\xb3\x0a\xe8\xf9\xcb\x1e\xfb\x92\xea\xc8\xcf\x79\xc1\xff\xe7\x74\x24\xa4\x7c\x22\xd0\x33\x05\xf0\x80\x2b\x03\x5c\x07\xc1\xb5\x01\x92\x0b\x95\x2d\x38\x00\x5b\x0f\x17\xae\xc0\x26\x68\xc0\x56\xd6\xb1\x64\xf7\x94\x16\x0c\x53\x6b\x49\xb6\x36\xd5\x09\x8b\x52\xe4\x53\xdd\xcd\xf6\x94\x0b\xd1\x3a\x25\xcb\x85\xff\x34\xdb\x19\xe2\x18\x66\xc0\x97\x90\x24\x0d\x4c\xc4\xc7\x0a\x82\x57\xc5\x21\x07\xb1\x20\xfb\x3d\xa7\xaf\x07\xa2\x9e\xe8\xd8\x7c\x2a\x11\x17\x10\xd6\xc4\xbf\xdf\x0b\x4e\x0f\x5d\x75\xed\xc1\x24\x4b\xe5\xed\x01\xd2\x3a\x75\x8c\x43\xeb\x3c\x08\xce\x8b\xde\x41\x04\x86\x71\xba\x7e\x81\xcd\x31\xba\xee\x3f\x29\xa8\x1b\xcc\xa9\x41\x8f\xbb\xf5\x91\xc8\xc2\x98\xa6\xc6\xbd\xf2\x60\x25\x67\x65\x25\x9d\x9d\x61\xd5\xf8\xfc\x81\xe0\xb6\xd1\x8f\xd0\xd1\x2b\x29\x06\x58\x1b\xb4\x41\xab\xbb\xd5\x1a\xc9\xaf\xf1\xb7\xe3\x2c\x65\x57\x27\x61\x51\x2e\xe5\xd9\x9a\x00\xa2\x8a\x7b\x2e\xdd\xff\x10\x38\x64\x19\x5d\x59\x64\xa4\x8e\x88\x8a\x1e\xe3\x55\xd5\xf4\x18\xff\xf6\xd2\xbf\x7a\xeb\x2e\xf4\x18\x68\xb9\xdf\x27\x47\x46\xe3\xa1\xe1\xc8\xf8\xaa\xa7\x4d\x0e\x5f\xf4\x82\x5f\xf3\xce\x41\x9a\x1f\xf9\xe8\x2c\xbf\xb3\xfc\x3b\x2f\xeb\x9c\xda\x8a\xe2\x0c\x93\x18\x65\x1d\xc8\xd4\x0d\xf3\xb7\x1d\x6f\x09\xc5\x81\xa5\xb9\x36\x46\xf1\x6c\x48\x65\x24\x2e\x09\x30\xbc\xe0\xc1\xb2\x28\xe2\xfb\xc4\x4a\x19\xe6\xa5\x88\x88\x36\xcf\xf0\x25\x59\x08\x82\x86\xda\xd0\xc2\xf6\x52\xa8\xed\xb2\x0c\x77\x09\x7f\xbb\x4e\x2f\x77\x70\x33\x1e\x4d\x11\xb2\xce\xc5\x2f\x30\xf6\x2f\xab\x4c\x25\xe8\xad\x93\xb3\xff\x03\x2c\x78\x05\xf9\x84\x23\xf2\x40\xea\x9b\x83\x6e\x48\xe5\xe4\x2b\x90\xeb\x39\x8c\x55\x82\x85\x72\xec\x82\x17\x2a\x8f\xbb\x89\xe0\x37\x6f\x8a\x7e\x1d\x3d\x2b\xe8\x01\xbc\xc5\xf2\x80\xc3\xf3\xb0\x7b\x03\xd2\x5e\x96\xf3\x9b\xd5\x5f\xb7\xb8\x16\xe1\xd7\x1d\x61\x1f\x30\x0e\xca\x77\x7b\xc1\x9b\xbc\x05\x74\x49\xba\x88\x53\x58\x19\xf2\x56\x2a\x61\xdc\xe4\x0b\x90\x8e\x88\xbd\x6e\xe4\xb3\xfd\x70\xa1\x14\x1e\x4b\x3d\x54\x38\x28\x86\xfc\xe8\x12\x1d\x97\x9f\xf1\xd0\x73\xf9\x2b\x5e\xf0\x73\xde\x1d\xa2\x6f\xa2\x47\xb4\xe3\x52\x05\x53\x94\xa6\xd7\x2d\x32\xae\x91\x0d\xd8\x14\xfd\x42\xa7\x1b\x6d\x62\xe9\x90\x7f\x59\x37\xfd\xaa\xce\x98\x0b\xa0\x35\x3c\x59\xe5\xad\x76\xd6\xe2\x14\x3f\x46\x33\xd2\xde\xbe\x54\xbb\xd3\x08\x7e\xc2\x67\xec\x56\xfd\xad\xc7\x0e\xab\x0f\xf8\x5f\xf5\x82\xdf\x22\x2e\xb6\x2c\x77\x37\x86\x4d\xd1\x9f\x90\x47\x99\x04\xb1\x14\x37\xe2\xae\x32\x1d\xc1\x17\x94\x83\x58\x15\x85\x3d\x8d\x15\x85\x8f\x2f\x48\x65\xc8\xd5\x17\xe9\x12\x3d\x24\xdb\xfb\xdc\x5e\xbc\x15\x26\x02\x00\xd0\x0d\x6b\x17\x59\x49\x80\x4b\x20\xa3\x64\x01\x4c\x41\x0b\x53\xe3\xab\xd6\x5d\x89\xcc\x9b\x00\xb8\x18\xb7\x7a\x49\x98\x73\x39\xb3\xda\x59\xee\xba\x52\xff\xb0\xc6\x1e\x65\xc6\x49\x45\xd5\xff\x7a\x0d\xa2\x65\x6e\xb8\x2e\xf8\x50\x6d\x75\xf0\xee\xa0\x83\x18\x03\xf2\x75\x68\xfd\xc0\xc8\x1f\xb3\xb2\x02\xd6\x60\x67\xa1\x19\xad\xa7\x97\x6d\x7a\x77\xe3\x2d\x10\xc2\x2e\x9a\xb4\x56\xa9\xe5\x8b\xbf\xad\xaf\x74\xd8\x3a\x41\x26\x13\xb9\xbb\xc2\xa1\x56\xf3\x60\xd0\x8d\x2f\xbb\x52\xc8\xdd\xf8\x18\x79\xfa\x21\x7b\x6a\xb2\xc9\x9f\xad\x62\xf9\x53\xd1\x06\xf8\x7f\x35\x6f\x54\x14\x46\x49\xe9\x67\x61\xc1\xa7\xf9\x31\x78\xcd\xa6\x3a\x98\xd4\x00\x16\xc8\xc4\xec\x44\xbc\xfc\xb0\x0e\xd6\x7f\xad\x17\xbc\xcc\x1b\x08\xbd\x32\x7e\xf0\x81\xfe\xd3\x72\x28\x33\x69\x78\x6a\x6a\xc6\x05\x4d\x9b\xba\x99\x82\x76\x98\x0e\x2d\x1c\xdd\xbb\xf7\xca\x41\x08\x79\x2e\xda\x30\x21\x2a\x52\x9a\x7f\xe2\x28\xab\x57\x08\xd7\x65\xa1\x93\xfe\x0d\x28\x31\x40\x57\x3c\xff\x68\x70\xc7\x8e\x77\x47\x30\x6a\xe4\xe6\x1d\x9b\xa9\xd3\x11\x94\x6f\x63\xec\x45\x35\xf6\xc8\x81\x1c\x46\xff\xcf\x75\xca\xc7\xe7\xbd\x33\x94\x1f\x65\xb2\x63\x0a\x9a\xa4\x26\xc3\x03\x92\x35\xad\xdc\x41\xc0\xf7\x36\x19\x4c\x90\xa7\xa8\x52\x08\x21\xb5\x40\xee\x79\x85\xb1\x4d\xf3\x56\x1e\x16\x52\xb4\x23\x3a\x61\x5c\x92\xf2\xa7\xd2\x0d\xe5\x7c\x50\xf9\x37\xee\xd2\x9e\xe6\xc7\xe4\xc7\x34\x6a\x6f\xc5\x0b\x72\x2a\x15\x19\x62\x9a\xc6\xc4\xef\x19\x46\xfd\x49\x67\xea\xbc\xb9\xc6\x0e\x53\x87\x15\xfe\x0f\xd4\x54\xf3\xff\xc1\xa3\x9e\xd7\x34\x47\xa6\x1b\x54\xb2\xaf\x7a\xcd\xca\x02\x44\x78\x3e\x74\x42\x45\x68\xda\xeb\xc5\xc5\x06\x5f\x13\xe5\xb6\x10\x29\x17\x17\x90\x23\xdc\xa4\xb6\xd8\x8c\xe0\x4e\x03\x67\xf6\x4d\x87\xbc\x9d\xe5\x9b\x49\x16\x46\xc5\x94\x19\xf5\x62\xca\x9a\x0d\xe6\xf2\x35\xdb\x1b\x61\xd9\x88\x8b\x46\xd8\xa8\xbc\xef\x74\xd1\x07\xc6\xd8\xe1\x42\x85\xa4\xbe\x6b\x2c\x78\xc5\x98\x1d\x4b\x1a\x12\xd6\xc4\x73\x7b\x22\xef\xc3\xf9\xda\x0a\xf7\xa1\xb9\x60\x38\xef\x74\xaf\x22\x13\x83\x5c\x76\x76\x61\xb4\xac\x70\xb4\x48\x02\x59\xe0\xef\xf2\x43\x9a\x60\x51\x39\x3a\x96\xa4\x26\x22\x3a\xdd\x04\x32\x13\x21\xf6\x15\x36\x21\x85\x34\x6b\xb2\x28\x74\x7c\x16\x8f\x09\xfb\xcd\x4c\x37\x87\x9a\x18\x63\x48\x2a\x16\x11\x1c\xab\x11\xb4\xc0\xa9\x1d\xd5\x2c\x4b\x07\x6a\xb3\xcf\x11\x94\xbd\xb7\x15\x8b\xed\x29\x8a\xe2\x6c\xc8\xb5\xd3\xa0\xac\x8b\x29\xfc\xc8\xd4\x35\xf0\x6f\x43\x8d\x48\x71\xff\x08\xd6\xae\x9f\xab\xb1\xc3\xaa\x36\xfe\x7b\x6b\x23\xf8\x13\xf4\xe9\x27\x8b\x56\xe9\x05\x00\x3e\xfa\x9a\xa7\x7e\x6a\xde\x54\x3c\x45\x63\x38\x97\xe3\x78\xd0\xf1\x65\x7a\x55\x92\x58\x88\xd7\x79\x9c\x16\xbd\xf5\xf5\xb8\x15\x23\xc7\x21\xcd\x02\x64\x0b\x28\x45\x8b\xf2\xb7\xe5\x27\xc2\x4d\x01\x63\xdc\x12\x11\xf0\x63\xc0\x94\x0a\xb9\xaa\xc6\xb2\x58\x7f\x58\x57\x46\x37\x8b\x1a\xaa\xcb\xd8\x27\x3c\xf6\x9d\x15\x9d\xb4\xd2\x2f\x5a\x65\xe2\xff\x98\x17\x3c\x11\xff\xd4\x71\x49\x52\x8d\xc9\x53\x91\x58\x68\xaa\x38\xc5\x0a\x70\x10\xa2\x33\x09\xf7\x2a\x47\x1e\xaf\xb1\x69\xb5\x85\x4d\x04\xdf\x75\x97\x8a\x13\x0e\xe5\x71\xad\x2b\xf2\x12\x62\xd6\x14\x46\x10\x6d\x28\x4d\xb2\x3e\xfc\xab\xe0\x3b\xcf\x6a\x32\xf6\x11\xcf\x7f\xff\x63\x9c\xc3\xbc\xd1\xee\xbb\x59\x92\xb5\xfb\x2b\x5d\x29\x1e\xe7\xb2\xb4\x28\x73\x88\x36\xfc\xe2\xa3\x83\x67\xee\x74\xd3\xb2\x47\xab\xe0\x7f\x78\xc2\xe8\xea\x98\x40\xd9\xc9\x48\x87\xa7\x04\x53\x2a\xae\x79\xd1\x3b\xd4\x09\x2f\xac\x6c\x8a\xed\x8b\xde\x51\x75\xf5\x0e\xd1\xbf\xe8\x3d\x6a\x7b\x43\xa4\xe7\xd2\x22\x2c\xe3\x62\x3d\x96\x72\xdc\x0d\x11\xf3\xd9\x27\x0f\x32\xf5\xb2\xff\x91\x83\x4a\x62\xdf\x7f\xf0\x0c\x5e\x1b\x98\x94\x91\x68\xe7\x02\xbc\x93\xb8\x65\x41\xbd\x54\xb2\x59\x2a\xb6\x44\x9a\xf4\x41\x56\x23\x8c\x90\xb2\x68\x9e\x1f\xaa\xc6\x53\xe6\xb3\xb3\x59\xa9\xd4\xf8\xf3\x4a\x4a\x95\x56\x6a\xb5\xc9\xf9\x53\xac\x2d\x40\xa8\x85\xb2\xdf\xdd\x44\xdc\x7e\x22\xe3\x27\x85\x89\xab\xfe\xd0\x18\xbf\x2a\xcc\x1d\x77\xe4\x01\x9e\x74\x08\xd0\x3f\xd1\xb8\x4f\x9e\xa2\x29\xc1\xa1\xce\x55\x5f\x98\x5c\xe4\x19\x0c\x59\x83\xcf\xb9\xb9\x71\x89\x9d\x2e\xa0\xc6\x31\x2c\xf8\xcc\xd4\xcc\xd4\xf4\x49\xfe\xbd\x5c\x16\x3d\x43\xff\x1e\xa7\x7f\x4f\xf0\xef\xe5\xdf\xcb\x39\x5f\xe2\xdc\xf9\x97\xc3\xbf\x0d\x95\x3c\x4d\x75\x98\x81\xc8\xee\xac\x43\x0d\x36\xb0\xc7\x6b\x42\xd1\x6f\xa1\x20\xc5\xa2\x61\xc9\xb4\xb2\x8e\x80\x3a\xcc\x3c\xd9\xa6\xe8\x8a\x4b\x4c\xfb\x85\x4a\x1d\x83\x2a\x4d\x52\xc4\x09\xf0\x75\xcb\x66\xcd\xb6\xca\x5e\x98\xc8\x8f\x1f\x3b\xde\x98\x9e\x94\x72\xd9\x79\x7c\x2b\xce\x40\xa2\x51\x0d\x8f\xcd\x4c\x36\x87\xaa\x7c\xbc\xa2\xca\x4e\x6d\xa1\x16\x52\xa9\xb9\x0f\xd2\xc7\x77\x9a\x35\x6a\xc2\xcc\xa6\xfd\xed\xb0\xaf\xa7\x8d\x4a\xc1\x90\xeb\x82\x6f\xc4\xed\x0d\xb9\x6f\x1a\xa1\x07\xc7\x67\x98\x05\xb1\xce\x0c\x87\x42\xfb\x10\xb1\xb1\x58\x4e\x14\x14\x04\x81\x69\x8c\x08\x42\x3d\x9c\xa0\x0e\x63\x3e\xad\x14\x78\xc5\x04\xec\x6c\xef\xef\xac\x31\x7b\x05\xfa\x3f\x54\x0b\x5e\x5a\x5b\x35\x17\xd4\x24\x97\x47\x46\x45\xf3\x8a\x5b\x51\x13\x80\x8d\xa9\x7a\x84\x98\x84\xca\x00\x4d\xb0\xb8\x80\xb7\x00\x6c\x6e\xd0\x6f\x03\x04\xbd\x46\x6b\x43\x29\xa9\x9c\x00\x18\x4f\x40\xb2\x82\xdf\x6d\x9e\x44\xaa\x24\xb0\x16\x60\x41\xb7\x60\xa0\x7e\xb0\xd6\x6b\x6d\x8a\x92\xf8\x85\xcb\x1c\xe4\x5f\xb7\x57\x72\x0a\xd1\x8a\xac\xa5\x47\x2b\xae\xcc\xb0\x30\x7c\x73\xa7\x3e\xb5\x05\xe8\xa7\x0e\xb1\x61\xe9\xe4\x7f\xf0\x50\xf0\xae\x43\x77\x0f\x5e\x1e\xce\x8e\x8a\x44\x48\x1d\x83\x67\xcb\x18\xec\x3f\x1a\x24\x9c\x46\x17\x75\x7a\x58\x82\x2d\x2d\x6d\xe5\xec\x74\xa4\x0f\x3f\x46\xea\xc7\x24\x2f\x05\x40\xa7\x6e\x98\xa9\x99\x53\x88\xb5\xbe\x00\x53\xa6\xc1\xdd\x99\x58\xf9\xa2\xfd\x92\xda\xd1\x63\x0c\x1e\x4f\x32\xdc\x2a\xeb\x8c\x43\x18\x50\x1b\xbc\x82\x7b\x9b\xba\xb8\x3c\x37\x44\xd2\xe5\xb9\x88\x7a\x98\xe6\xcf\x38\x2f\x36\xc5\x76\x93\xcd\x5a\x2d\x45\xba\x10\x3d\x2b\x02\xa7\x4f\x03\x85\x5d\xe0\x2c\xcc\x78\xdd\x80\x59\x4b\xed\x6c\x4b\xea\xa1\x3a\x64\x0a\xa6\x2b\xe0\x92\x01\x44\x3a\x42\x30\x21\x6d\x10\x55\x4b\x09\x83\x80\x16\x3f\x84\xcb\x83\xa9\xdc\xcc\xc0\xaf\x8f\xc0\x3d\x21\x85\xdd\x68\x81\xbb\x04\xff\x1b\x16\xbc\x8b\xeb\xbc\x62\x0a\xea\xba\x38\x93\x67\x3f\xb2\xf8\x38\x88\xcc\x13\x93\x96\x48\x3e\x31\x75\x7c\x6a\xe6\x98\xac\xeb\xf1\x49\x59\x6b\x47\xd8\xce\x68\x61\xab\xdf\xa4\x1a\x89\xc2\x11\xb7\x8b\x29\x01\x37\x6c\x67\x79\x44\x87\x6c\x05\x6d\x0f\xec\x46\x25\xe9\x90\x71\x47\x2d\x61\x0c\x3f\x33\x93\x75\x3b\x93\x0b\x07\x84\x7e\x5c\xf2\x6b\x3b\x59\x2e\xae\xb5\x1e\xdf\xcb\x8a\xfe\x9a\xc7\xae\x76\x46\xc3\xff\xea\x43\x91\x72\xf7\x36\xcf\xf9\x6d\xcb\xfb\xf5\x38\x1d\x50\x92\x9a\xf2\xcc\x50\x58\x96\x51\x42\x77\x46\x04\x3f\x55\x04\x8a\x4b\x84\xb0\x07\x61\xa2\x22\xfc\x5c\xb5\xc2\x05\xd6\x18\x8c\xfb\x27\xb5\x22\xca\x3a\x61\x9c\x36\xd9\xf7\x79\xac\xb9\xa7\xd6\x9d\x89\x5b\x79\x06\x0e\x81\xbb\xfc\x23\x51\x58\x8a\x46\x19\x77\x44\x70\x8b\xbe\xce\x5d\xd7\x31\x5c\x82\x39\xdf\x91\x4f\xa0\xdd\x80\xa3\xcf\x5d\x4a\x0a\xe0\xa2\x74\x06\xe2\xdf\x1f\x64\xdf\x5d\xa1\x9b\xde\x21\xfa\xab\xd9\x52\x58\x6e\xf8\xbf\x7f\x20\xa8\x9f\x09\xbb\x56\x84\x39\x25\x72\x84\xbc\x1b\x96\x1b\x26\x55\x91\x20\xf3\x55\x1a\xcb\xb8\xbc\xeb\xda\x88\x0f\xb0\x09\xb4\xb3\xf2\xe0\xd1\xab\xb4\xb1\xc9\xdd\x22\xcf\xc0\xd9\x67\x57\xeb\x43\x63\x6c\xbc\x93\x45\xc2\xff\x49\x9d\xe3\xf6\xfa\x31\x13\xfc\x06\xfc\x0a\x6b\x40\xd0\xa4\xd0\x25\x30\x4b\x91\xb8\x7b\x28\x18\x0f\x71\x58\x85\x41\x7c\x93\x2b\xae\x55\xaa\xbd\x50\x6b\x88\xd3\xd3\xd3\xd3\xb8\x61\xdf\x78\xe3\x8d\x88\x9d\x13\x89\x56\xdc\x19\x7e\x10\x9e\xba\x7e\x66\xa6\xc9\x9f\x35\x7b\xe6\x34\x44\xfe\x75\xcb\x02\x63\x6a\xb1\x64\x0c\xa4\xb5\x5e\x2e\xea\xfc\xe9\x2b\x77\x9e\x35\xb0\x44\xee\x5d\x90\x8c\xba\x3d\xd5\x09\x4c\x9a\x4c\x84\x36\x9f\x33\x88\x10\x65\x73\xa4\xc0\x11\x0e\x19\x55\x70\x3b\x6f\x65\xe9\x7a\x12\xb7\x4a\x9c\x0e\xb8\xe4\x15\xc0\x04\x1a\x5a\xc9\x08\x0f\x38\xe9\x89\x20\xc2\x34\xc0\x7c\x20\x62\xa5\xba\xd6\x83\x73\x51\x48\xf5\x86\x54\x31\x8b\x9b\x0e\xc6\x00\xe1\x11\x2c\xcd\xe6\x3d\x1e\x83\xe1\xf7\xdf\xe1\x05\xaf\x05\xaf\x05\x5a\x97\xb7\x04\xce\x19\xf2\x12\xc2\x67\xc1\xa4\xdd\xd5\x8a\x4e\x99\xa1\xd3\x9f\x02\x85\x6d\x88\x23\xf9\xaa\xb9\x49\xa6\x2c\xdc\x2d\x65\xa1\x02\xa9\xc6\xf8\x44\xb3\x39\x61\x1e\x43\xfc\x09\xb3\x0d\xe0\x14\x86\x67\xec\xf9\xf6\xea\x31\xf6\x84\x2a\x5e\x7f\x05\x13\x6e\xdc\x90\x7f\x5c\x0b\x9e\x32\x7c\xd9\x44\xae\xef\xe0\x7a\xd4\x80\xe3\xa3\x19\xfe\x5f\x5e\x63\xdf\x61\xbc\x6f\x47\x07\xfc\x49\xe4\x3a\x3b\xfa\xf0\x51\xc5\xdf\x4c\xde\xa9\xeb\x82\x89\x55\x22\x39\x36\x10\xea\x16\xe5\x9a\xf1\x60\xda\x6f\xdf\x59\xe9\xcb\x7c\xd2\x25\xfb\x32\xd9\xef\x1d\x61\xff\xaa\x62\x58\xe6\xb2\x4e\x37\x4b\x45\x5a\x62\x7b\x21\x23\xea\xa7\x8f\x04\x2f\xf0\x4c\xfb\x15\x99\x81\xae\x68\x61\x91\xf0\xd3\xdb\xa8\xc1\xaa\x3c\xa9\x81\x42\x35\xe6\x06\x9f\xd7\xa1\x22\x27\x71\x99\x0d\x05\xe3\xc8\xf5\xb6\x35\xd3\x9c\x79\xd2\x13\x2b\xb3\xab\x7e\xee\x10\x4b\x54\x72\x50\x2b\xe0\xa7\x77\xf9\xe0\xde\xb9\x37\x77\xe8\x8f\x2b\x29\x42\x97\x91\x22\xf4\x29\xcf\xca\x11\xfa\xa5\xfd\xa4\xa4\x57\x24\x09\xbd\xd0\xdb\x21\x4b\xe8\xeb\xd8\xb8\x2b\x99\x7d\x97\x99\xd9\xf7\xa0\xf7\x3d\xbb\x67\x74\xdd\xe4\xdf\xa0\x33\xba\x82\x40\xe7\x70\x55\x48\xaa\xc1\x2c\xae\x5f\xba\x8a\x1d\xdb\x6b\x34\x8c\xff\x9a\xab\x82\xb3\x95\x77\x70\x81\xf7\x0a\x91\x4f\xe8\x75\x46\xa7\xb6\x88\xb7\xe0\x09\xd4\xd9\x06\x83\x18\x1c\x49\xf5\x39\x76\x65\xb6\x5c\x61\xa3\xf8\xc6\x09\xdf\x4f\xdb\xc2\xf7\x81\x3d\xe7\xed\xec\xc0\x47\x11\xbc\xc8\x88\x5f\xec\xcc\x89\xe2\xeb\x27\x82\xd5\x87\xd8\xdf\x2b\x56\x8c\x3f\xf7\xd8\xc9\xdd\xfd\x40\x55\xab\x1b\x3c\x42\xef\xf5\xc0\xff\x6c\xaf\x40\xe5\x11\xd5\x20\xdf\x71\x51\xc6\x2d\x0a\x93\xd8\x52\x41\x80\x30\xee\x8a\x44\xb0\x9b\x45\x94\x9c\xb6\x6f\x6f\x0e\xe5\x39\x4c\x19\x19\xa2\x58\x92\xaf\x31\x97\xf0\x0a\x48\x9c\x82\xbd\xb8\xa6\xb5\xd3\xaf\x79\xec\xe6\x4b\x6c\x3c\x66\x8a\xfe\xac\xd2\xee\x06\x42\x35\x54\x9a\xa8\x15\x4e\x3a\x65\x52\x46\x2b\x24\x1e\x8a\xc3\x26\x5f\x16\x61\xd4\xc8\xd2\xa4\xff\xf0\x77\xc4\x83\xde\x3d\xbb\x6f\x21\x27\xfd\x9b\x1a\xb4\x6d\x54\xf6\xc3\xc0\xc6\xc1\xad\xed\x86\xbd\xf2\xa0\xb3\x89\xec\x9c\x0a\xbc\x7a\x7a\xc5\xff\xf2\x81\xe0\x8c\xf9\x39\xe0\xb6\x81\x48\x39\xc8\x6c\x4b\xc2\xbe\xc8\x79\x21\x5a\xbd\x3c\x2e\xfb\x15\x70\x52\xd5\xc9\xc1\xff\xfe\x00\xbb\x58\x63\x07\x36\xb2\xa2\x2c\xfc\xff\x54\x0b\xfe\xca\xbb\x3d\x2b\x08\x58\xc2\x68\xdb\x70\x5b\x91\x55\x69\xd4\x77\x59\x9d\x96\xc8\x4b\x0c\xac\xa0\xa0\x6e\x3a\x27\x3b\xec\x5b\x96\x4b\x59\xc5\x9e\x4e\x15\x2a\xeb\x00\xdb\x91\x14\x2b\xa2\x95\x8b\xd2\xf5\xee\x97\x80\x9b\x49\xe1\x47\xb2\x12\xf2\xf4\x0a\x52\x58\x1d\x0f\x1c\x2c\x2b\xeb\xc8\xb3\xde\x4b\x14\xbf\x14\xd4\x83\x1a\x0f\x9e\xe9\x44\xac\x97\x4e\x44\xc1\x08\xe2\xac\xaf\xd4\x18\x2b\xa0\x66\x80\x5e\xf5\xd9\x5a\xf0\xb1\xda\x8a\xfe\x5d\x15\x4d\x8b\x4f\x6b\x53\x07\x1a\xa0\xe4\xb9\x72\x65\xe5\xb4\x8d\xbb\x72\xdd\x75\x27\x9a\xfc\x94\x0a\x34\x82\x3a\xa9\x5c\x4e\x03\x2d\x24\xdf\xc9\xb3\x1e\x34\x59\xa7\x54\xae\x9c\x5d\x84\xce\x80\xaf\x86\x09\xf8\x55\x28\x30\x47\xdd\x42\xeb\x6b\x02\xb3\x12\x3b\x06\xcc\x0b\x96\x89\x35\x90\xe3\x1c\xa8\xb4\x02\x0c\x78\xb2\xa8\x39\xa8\xbf\x96\xc1\x10\xea\x96\x5c\x98\x9c\x39\xd5\x38\x95\x34\xe7\x20\x37\x41\xce\xa3\x4a\x5b\xb0\x5e\xa2\xf6\x38\x67\xd1\x37\x8d\xb3\xc6\x8e\x08\x4d\xb7\xaf\xae\x2e\x59\xf5\x41\xfc\xa9\x3f\x1b\x0b\xde\x5a\xab\xba\xe3\xc2\x32\x4a\x01\xa1\xcd\x83\x05\x06\x9e\x10\xba\xc7\x5a\xd8\xda\x14\x69\x54\x10\x47\xbf\x50\xa6\xeb\x93\x8a\xb4\xe3\x66\xd9\xde\x5b\xa6\x6e\xee\x86\xe5\xc6\x2d\x4f\xbd\xb9\x10\x72\x13\xe9\x86\x79\x79\x0b\x6f\xdc\xa2\x5e\xe7\xdb\x90\x76\x86\xff\xed\x02\x0e\xb0\xc2\x63\xce\x13\xcb\xb4\x28\xbf\xb8\x7c\x6a\x8e\x9f\x78\xd2\x4d\x37\xd4\x95\xe2\x45\x0a\x84\x6d\x1c\xb2\xa2\x06\xdb\x61\x9c\x16\x25\x9a\xea\x4b\x30\x84\x86\xeb\x25\xf1\x0f\x41\x9c\xec\xc4\xd4\x04\x25\x37\x6b\xe8\x77\x24\xd1\x9b\x78\xea\x04\x90\x4f\x5c\x33\xd1\xbc\xe8\x1d\x90\xf5\x77\xcf\xb8\xef\xf5\xd8\xbb\x3d\x86\x37\xfc\xb7\x7a\xc1\x75\xb3\xbc\x25\xd7\x4d\x4b\x69\x80\x70\x47\x19\x5b\xbb\x4e\x9e\x8a\xee\x36\x7b\xd5\x9c\x64\x37\xb1\x1b\x76\xdc\x30\x76\x1c\xce\xa5\xb0\xdc\x78\xd0\xbb\x66\x47\x2e\xfc\x23\xfe\xa1\xb0\xcc\x3a\x71\x8b\xb1\xd7\x1d\x76\xc2\xd0\x07\x62\xec\x97\xb2\x68\x5e\xe3\x8d\xdf\xd6\x8b\xda\xa2\x04\x3b\xc3\xef\x1f\x0a\x6e\xdd\xe1\x1e\xce\x13\xb7\xd9\x15\x8f\xee\x00\xe3\xf9\xa6\x2b\x18\x2c\x97\xad\x7b\x9f\x53\x66\x96\xd3\xf6\x54\x7a\x2a\x1b\x81\x17\xb9\x87\x71\xbf\xa2\xd2\x7f\x93\xc0\x76\x6e\xec\xae\x44\x2d\xf8\x73\x5a\x89\xaa\x5e\xa5\xae\x1a\x05\x83\x6e\x74\x29\x9c\x0c\x8c\x7d\xf6\x20\x7b\xc6\x25\x53\xb1\x0e\x26\x06\x6a\xaa\xd9\x7f\x3c\x10\x9c\xd9\xe9\x66\x05\xe3\x2c\xad\x4e\x15\xd2\x52\x1a\x3e\x4f\x50\x6c\xe7\x96\x9b\x17\xbd\xc3\x0a\xe2\xd8\xa5\x8a\x39\xc0\x1e\x18\x63\xfa\x9e\xff\x81\xb1\xe0\xfe\x31\x0d\x86\xec\x86\x10\x55\xa6\x91\xd1\xb7\x81\x04\x04\x5d\x1f\xea\xdb\x4d\x0d\xda\x61\xe2\x09\x4e\xf2\x06\x3f\x7f\x36\x4b\xc5\xf9\x93\x98\x99\x46\x6f\xe7\xe8\xdf\x24\x84\x6e\xc8\xd9\xd4\xd2\x0d\x64\x08\x3a\x82\xd1\x6b\x0e\xac\x53\x69\x9f\xbc\x0b\x14\x2f\x9d\x56\xa7\xc6\x37\x0c\x1b\xed\x49\x8b\xcf\x14\xb7\x3d\x24\xb2\xcd\x1c\x5a\x62\x45\x6d\x5a\x66\x3c\xca\x94\x61\x98\x9a\xd4\xe4\xb3\x26\xb3\xd7\x3a\x45\x30\x0e\xe1\x1b\x42\x44\x4a\x37\xd9\xd0\xe8\x18\xe4\x70\xd1\x3e\x1d\x20\x1b\xed\x12\xb1\x17\x19\xd6\x41\x13\x2b\x28\xc0\x82\x10\x55\x00\x73\x50\x3e\x6b\x7d\xde\xaa\x5b\x05\xd6\xf4\xaf\x78\xec\x10\x3d\xe1\xff\x82\xc7\x9e\xf9\x10\xd3\x05\xeb\x6a\x04\x2d\x55\x8f\x6a\xea\x63\xb7\xcf\x54\x87\x5a\x88\xde\x98\x9a\xa9\x26\xd9\x79\xcb\x09\x6e\x31\x07\x7f\xf4\xc8\x80\x9f\x25\xcb\x23\x52\xf7\xb4\x04\x3e\x2d\xc2\x42\xf8\xaf\x3f\x12\xfc\x3f\xf0\x97\x15\xe2\x97\xc0\x6f\x3a\x86\xb9\xa7\x8e\x97\x1c\xbe\x22\xa5\x2f\x43\x4a\xff\x94\x6d\x78\xf9\x91\xcb\x36\xbc\xb4\xbf\x5e\xb6\x95\x4f\x29\xdb\xca\x47\x47\xe0\x04\x8e\x98\x66\x60\x58\x79\x19\x18\x56\x9c\x60\x7e\x39\x8c\xf0\xc0\xc3\x3e\x20\xb2\xf6\x8d\x30\x8d\x1a\x68\xb3\xb8\xa2\x03\x5e\xb6\xb5\xbe\xb5\xbb\x96\x70\xab\x7f\x8b\xb6\xd6\x3b\x93\x63\x00\x82\x0d\xa6\x40\x95\xc2\xc0\xde\x74\xa8\xd2\x6a\x3f\x7b\x5f\x2f\x17\xf3\x71\xb1\x89\x76\x1b\x82\xf2\xfe\xcb\x83\xc1\xaa\xbe\xe3\x24\x5f\xa5\x1c\xae\xf3\xf9\xb0\x0c\x39\xdc\x25\x5e\x0b\xdc\xf8\xe0\x78\x0c\xe7\x31\x88\x5e\x41\xaa\x24\x0d\xeb\x23\xb7\xff\x28\x2e\x36\xcf\x42\x70\xf3\x21\xf9\xe7\xb9\xe5\x45\x47\x2c\xfe\xfd\x01\xf6\x11\x8f\x1d\x5c\x2f\x56\xe5\xe1\xe7\xa7\xbc\xe0\x9d\xde\xa9\x38\x11\x98\xcb\x83\xb8\xdb\xf2\x74\x88\x39\x01\x3a\x4a\x02\x3c\xf3\xf6\x33\x0e\xd1\xb9\xae\x18\xe6\xec\x00\x6a\x0b\xe6\x06\xf1\x85\x0b\x4d\x1e\x88\x0b\xe5\x75\x41\x9d\x07\x17\xd6\x0b\xf9\x4f\x5a\xae\x17\x41\x93\x2f\x76\x30\x03\x23\x21\x01\x6a\x62\x0f\xf1\x05\x1e\xaf\x0f\x58\x50\x8c\x74\xfa\x5d\x8f\x24\xfb\x6f\x7a\xc1\xc7\xbd\x05\xa0\x7e\x37\x0a\xc8\xca\x46\x98\x8b\xe8\x24\xef\xf4\x92\x12\x72\x1a\xd7\x92\x6c\x8d\xcb\xde\x40\xf6\x4c\x05\x10\xa3\xb8\xa6\xf8\xbc\xc0\x08\xc1\xe8\xa4\x4a\x8a\xd6\x6f\x54\xbf\x70\x26\x4c\xc3\xb6\x7c\x3c\x84\xc1\xea\xe0\x4f\x2e\x25\x10\xbe\x75\x0c\x83\xe0\x52\x7d\x8b\x72\x61\x90\x82\xab\x10\xe5\x64\xd3\xc1\x65\x2a\xa0\xca\x76\x13\x2f\xb0\xc3\xb9\x08\xa3\x3b\xd3\xa4\xef\x27\xc1\xbf\x19\x02\x5f\xe0\xc7\xe4\xed\xa9\xed\x3c\x2e\xc5\x24\xda\x2e\xe5\xb3\x1c\x4d\x05\x40\xd8\x9e\xe5\x44\xe3\xa3\x6f\x2a\xd3\x56\x9c\x72\x9c\x8f\x67\x64\x7b\x0a\x17\xc8\xe1\x0e\x76\xb4\x05\x42\xbd\x7d\x26\x8b\x00\xc5\x14\xcc\x2c\x73\x78\x0d\xc2\x3c\x4e\x72\xa9\xdc\xd5\xa1\x60\x2e\x4b\xa6\x3f\xef\x96\xb5\x71\x46\xea\x14\xd3\x33\xd2\x3f\x19\x34\xa4\x32\x78\xd6\xb2\x64\x99\x1e\x23\xcd\x0e\x3a\xde\x46\x76\xa2\x72\x66\x99\x9a\xce\xfe\x0d\xc1\xa4\x2c\xe6\xdc\xf2\xe2\xfe\x8a\xf8\xda\xa3\x5c\xbe\xc6\x0a\xdc\x7d\x42\xd5\x97\xfb\xc7\xaf\x3e\x2a\xf8\x5e\xf3\xb3\x22\xca\x1e\x20\xf6\xb5\xc1\x4c\xa7\xd3\x2b\x30\x71\x98\x00\xe7\xe5\x62\x39\x4f\x51\x91\x3a\x4e\x46\xc5\x9c\xa1\x4a\xeb\xc0\xdc\xf3\x50\x2e\xf5\x96\x98\x54\x51\x21\xce\xe2\xfd\xe0\xb7\xb1\x5f\xf2\xd4\x4f\xff\x67\x3c\xf6\xd4\x51\x64\xbe\x43\xad\xd3\xfb\xb1\x66\x0e\x08\x4a\xad\xda\xac\xcb\x2d\x00\xe9\xb8\xb0\x05\xa4\xf5\x11\xb0\x1a\x36\x6e\x73\x24\x5b\x40\x9d\x6f\xc4\x65\xd1\xe8\x8a\xbc\x41\x81\x66\xa0\xd5\x2b\x43\x1f\xbd\x32\xd9\x64\xaf\x01\x5c\xec\xa8\xf0\x5f\x3e\x02\x17\xbb\xb2\x09\x4b\x59\x54\x38\x0d\xf8\x84\x07\x81\x76\xa3\xeb\x0f\xd1\xc5\x14\x41\x6b\x7b\x08\x70\x0c\x29\xd6\xdf\x6d\x09\x58\xbd\x11\x68\xae\x68\x00\xcd\x55\x51\x88\xc8\x6a\xdb\x64\x93\xdb\xc6\x68\x65\x5f\x0b\x11\x15\x5e\x8a\xb2\xb6\x20\x1c\x6e\xb0\x9c\x61\x5e\x38\x10\xe8\xe6\x26\x91\xca\x86\xa3\x6f\xb2\xd7\x8d\xc9\x45\x8f\x5b\x98\xff\xf2\xb1\xd1\x5c\xcd\x43\x7d\xa3\x8e\x90\x4e\xff\x7c\xb4\xa6\x55\x59\xbb\x8f\xf4\x45\x35\x5d\x15\xc7\x2f\xb2\x88\x19\xb0\xee\x38\x35\xea\x2a\x10\x40\x01\xd9\xe0\x24\x47\xdc\x8a\x32\xb3\x09\x24\xf6\xdd\xe3\x80\x6b\x32\xb7\x74\x8e\x67\x39\xef\x88\x4e\x96\xf7\x27\x9b\x7c\xa5\x07\x59\xad\xb2\x5a\x78\xf4\x5c\xeb\xc5\x09\x58\x9b\x9d\xaf\xa1\xbe\x01\xb1\xee\x50\xdb\x30\xd1\x24\x52\x2a\xaa\x2d\x83\x34\x17\xc3\x8d\x66\xf2\x11\xcb\x8c\xa7\xf2\x54\x97\x68\x22\x03\xf5\x41\x93\xeb\x1e\xc8\x89\x15\x70\x3a\x61\xb2\xb7\xd6\x28\x12\xea\x62\x2d\x78\x79\xad\x24\x2e\x2b\x18\x43\x8a\x8b\xa2\xae\x54\x47\x52\xbe\x68\x73\xc8\x51\xbc\x55\x30\xa7\x12\x2e\xd5\x68\xc9\x1d\x51\x91\x7a\xc8\xbf\x71\x91\xca\xbf\x96\xe0\xfb\x59\x0e\x88\x04\xea\x59\xe8\xd8\x4e\x88\x0c\x70\x38\xdd\x5d\x71\x42\x1d\xae\x94\xbb\xb3\x59\x29\x4e\x56\x7d\x96\xab\x26\x98\x5e\x41\xe8\x4e\x7c\x9f\x50\xf2\x1b\xed\xb0\x14\xfc\xf6\xa5\x59\x5d\xc0\x19\xea\xa8\xb8\x50\x08\xf9\xb6\x8c\x7d\xf3\x38\x7b\x54\x6b\xf0\x5b\xfe\xcb\xc6\xd9\xd3\xf7\x35\x95\x87\xaa\xeb\xcc\xe9\x0f\x8d\x99\xb4\xd5\x6f\xc8\xec\xb6\x70\xa8\x54\x3d\xe2\xd4\xcc\x79\x0d\xd9\xf4\x4f\x7c\xce\x57\x70\x6a\x12\x03\x02\xc4\x90\x60\xec\xa7\xa2\x49\x20\x3d\xb0\x6a\xaa\xa8\xb7\xd6\x93\xb0\xdd\x64\x7f\x5d\x63\x87\x95\x19\xc6\xff\xc3\xda\x3e\x85\x5c\x15\xff\x4d\xf0\x96\x9a\xb6\xeb\xd8\xd3\xc0\xe5\x24\x51\xe0\x36\x7b\x66\xc2\x01\xf4\xd7\x10\x99\xdd\xad\xaa\x98\x3d\xdf\xc6\x2b\xa2\x30\x7e\x38\xff\xeb\x78\xc2\x62\x04\xf5\xcd\xd7\x99\x67\x67\x77\xed\xe7\xf8\x3f\x01\xed\xe7\x72\x36\xc8\xe3\x57\x36\xc8\x2b\x1b\xe4\xb7\xc6\x06\x79\xfc\xca\x06\xf9\x4d\x31\xe7\xbf\xf9\x36\xc8\xe3\x57\x36\xc8\x4b\xdd\x20\x2f\xfd\x64\x7d\xfc\x9f\xfe\xc9\xfa\xf8\xb7\xf8\xc9\xfa\x1d\x87\x2b\xd3\x79\xe6\xe2\x34\x12\xb9\x63\x9a\xfd\x3f\x87\x82\x3f\xf1\x96\x6d\x38\xac\x16\x3c\x64\xa2\x27\x35\x9f\x3d\xbf\xb3\x2b\xd2\xa2\x0c\x5b\x9b\x4d\x3e\xcb\xe7\x9c\xc7\x20\x1e\x0d\x20\x3f\x55\x35\xc1\xa6\xaa\x37\x25\x0b\x14\x7e\xd5\xa4\x73\xc1\x5b\x61\x52\x0c\xa5\x60\xe7\xa2\x1d\x23\x7e\x0e\xe4\x45\xf5\xd6\x44\x22\xca\xa6\xfb\xcd\x42\x59\x65\x79\xb6\x9d\x8a\x1c\x70\xbb\xd0\xfc\xd8\x51\x74\x00\x2b\x0b\xa7\xe3\xb4\x77\x01\xb2\xaf\xd6\x04\x8c\xff\x45\xef\x30\xbe\xbe\x38\xef\x68\x5b\x7f\x7d\x80\xbd\xa8\xa6\x0d\xc5\x7f\xef\x05\x7f\xfc\x30\x1b\x8a\x61\x7a\x14\x27\x1f\x2a\x73\x71\x95\xab\x81\xe6\x60\xa1\xfc\x0d\x9d\x7e\xf1\xdc\xa4\x81\xe3\xdb\xe8\x46\x53\xcb\x0b\xb3\xf3\x67\x16\x9a\x1d\x67\xc7\xfe\x45\xcf\xb2\xc4\xbe\xdf\x0b\xde\xee\x99\xb4\xc3\x87\xd7\x2a\x7b\x99\x4d\xb0\x4c\xba\x6f\xf4\xd8\x11\x0c\x1a\x5c\x16\xeb\xfe\x7f\xf2\xd8\xf5\x7b\xa0\x66\x69\x85\x09\xca\xb5\x65\x85\x4d\x1d\xdc\x6d\x9a\x0e\xde\x4d\x92\x0b\x14\x8f\x48\x82\x8b\xa6\x36\x64\xd5\x2a\xec\x15\x8b\xc3\x5a\x33\x13\xc0\xf2\x59\x81\xe5\xc3\x5e\xec\x31\x3d\x0d\xfd\xfb\x82\x8e\xc2\x53\x8c\x86\x19\x32\xad\xec\x47\xb9\x09\x40\xcb\x1f\xba\xd1\xfe\xe8\x61\x76\x4d\x15\xce\x0c\xb4\x70\x09\x13\x53\xe3\x2c\xf5\xdf\x78\x38\x78\x45\x6d\x36\x0a\xbb\x08\xa5\x8a\x1d\x00\x50\x06\xa1\xca\x5f\x15\x91\x4a\x81\x65\x8c\x82\x20\x4a\x91\x9a\xe0\x3d\x92\x50\x58\xf4\x44\x81\x2e\x1f\xd4\x51\x95\xcc\x23\x29\x84\x8a\xd8\x70\xc1\x52\x1e\xc0\x82\xb3\x34\x14\x00\x5c\x22\xd1\x61\x95\x48\x92\x03\x32\x2c\x09\x67\x56\x6a\xbe\x0a\xc7\x10\xd5\x18\x03\x0d\x61\x0f\x2b\x7d\x4b\x07\x12\x22\x88\x58\x69\xa1\x2b\x77\x34\x65\x9b\x92\x1e\xff\x78\x80\xbd\x6d\x5c\xc5\x5e\x5d\x1c\x0f\x7e\x7b\x6c\xd1\x59\x9e\xa4\xa7\x6f\x8a\x7e\x03\xdd\xf0\xdd\x30\xce\x2b\xaa\x4d\x5d\xa5\xd1\xd1\x23\xea\x2e\xab\x87\x54\x97\x40\xe7\x5b\x93\x03\x72\xf9\xa0\xbd\xdb\xa0\xe8\xd9\xa8\xc0\x0a\x0b\x83\x86\x44\xa3\x2e\x23\xbc\xe1\xe2\xfa\x60\xb6\x2d\x44\xb9\x46\xd8\xb7\x23\xbe\x6c\x71\x1c\x86\xe5\x06\x69\xa3\xbd\x74\xe8\x6d\x72\xf8\xd3\xe8\xc2\x07\x43\x05\x04\x69\xca\xd0\x04\xf6\xc8\xc8\x88\x50\x5b\xd4\x45\xd8\x0b\x4e\x2a\x70\x21\xca\x5e\x17\xcb\x47\x4e\x9a\x5e\x0a\x6c\xfd\x88\x72\xd2\x09\xf3\x4d\xa9\x94\x69\x2a\x97\x25\x08\xbf\x54\x88\x85\x3a\x1d\x57\x39\x71\x07\x33\x6a\x27\x9a\xcd\x09\xca\xd5\xcd\xed\x1c\x5a\x4a\x9c\x35\xb1\x75\x4d\x56\x67\xd7\xee\x2a\x5d\x74\x3a\x39\xfb\xf7\x0a\xba\xf9\x7b\x83\xcc\xf6\x0c\xd1\x90\x97\x0f\x31\x74\x17\xcc\xfd\xa9\x6b\xe0\x1f\x37\x53\xf5\xb0\xea\x1b\x7f\x2e\xb8\x7e\x45\x93\x23\x10\x95\x91\xee\x73\xa0\x2b\x2d\x11\x4e\x45\xf5\x1e\x91\x23\x38\x22\xf7\xfd\x47\x76\xa4\xef\x23\x4b\x16\x45\x88\x00\x73\xeb\x8b\x8f\x04\x37\xda\x17\x5c\x40\x4e\xb8\x62\x45\x4e\x3b\x44\x60\xce\xba\xfb\xf9\xc3\xec\xf3\x35\x76\x34\xec\x76\x97\x14\x7d\xe6\xc7\x6b\xc1\x87\x6a\xab\x1b\xc4\xb2\x48\x11\x0d\x9a\x4c\x53\x87\x31\xd9\x0c\xa9\xb0\xf4\xd6\x33\xd4\xec\x0b\x95\x31\x63\xe9\xff\x04\x89\xd0\x4f\xcb\xf0\x42\x93\x9f\x4b\x1b\xdd\x5c\xac\xc7\x17\x44\xa4\x98\x41\x73\x50\x94\x10\x7a\x5c\x7e\x62\x71\xf6\xec\xac\x29\x89\x34\x75\x7a\xf8\x58\x88\x6e\xd9\xe5\x53\x73\x8d\x1b\x4e\x9c\xb8\x1e\xcf\x70\x18\x1f\xbd\xbd\xbd\xdd\x8c\xc3\x34\x6c\x66\x79\x7b\x0a\xc0\x43\x52\xa9\xcc\x14\x53\x54\x44\x03\x8a\x98\x94\xc2\x2c\x6d\xe8\xf2\x55\xeb\x74\x4c\x43\xaf\x80\xd5\x66\x57\x51\x9d\x78\x3b\x7d\xd0\x1c\xd3\x3e\xa0\x7b\x77\xfa\x0d\x8c\x2d\x6b\x68\x62\x55\x7b\x96\x3c\x30\x46\x93\xf5\xc3\x63\xc1\x8f\x8f\xad\x3a\x61\xf9\xba\x0f\x67\x89\x25\xb5\x40\xc0\x16\x77\xb4\x70\xce\x10\x44\x4f\x0f\xd0\x8e\xa1\x0c\x1d\x5e\xef\x3e\x0d\x59\xc5\x72\x3a\x13\x40\x73\x68\x8f\x82\x3e\xf0\x10\x38\xac\x8a\x03\xd7\x81\x1a\x44\x42\xde\x84\xda\x7c\xcf\x3d\x4d\xfc\x90\x21\x17\xb2\x98\x62\x53\x02\xd3\xa3\xd8\xa8\x2c\xe7\xdd\xb0\x28\xf8\xfc\xd9\x95\xe7\x9c\x9e\xbd\x6d\xe1\xb4\xc5\xfd\x72\x92\x5f\xab\x67\x7e\x2a\x55\x40\x88\x0b\x0f\x53\x7e\xc3\x09\x93\x77\x54\xf0\x24\x4b\xdb\x4d\xf5\x28\x20\xc9\x60\xb8\x7c\x92\x6d\x03\xb2\x88\x3c\x7b\xcb\x33\x33\x51\xd4\xda\xaf\x66\x39\x9f\x68\x4c\xe8\x97\x51\xdc\xc8\x59\x01\xc1\xf0\x94\x6b\x52\xfd\xb2\x81\x5e\x52\x20\x86\x55\x08\xa0\xef\x53\x54\x50\xf7\x6b\x98\xcd\x57\x1b\x82\x5d\x03\xe2\x61\x47\x72\x19\xaa\x5c\x05\xc2\x6a\xf6\x08\x1c\x6e\x39\xeb\xe5\x8d\x5c\xc8\xcf\xb4\x14\x95\x80\x61\x7b\x2a\x45\xde\xcd\x45\x69\x72\x52\x60\xff\xb9\xa0\x69\x5a\x35\xf5\xb7\xec\x2e\xd9\x32\x17\x45\x61\xcd\x22\xc5\xbd\x2b\x58\x94\xf5\x5d\x5c\xda\x71\x29\x2b\x9d\x1c\x88\x72\x81\x32\x97\xd8\x72\x9d\x2e\x1a\x64\xbd\xfd\x89\xef\x66\x7b\x0b\xee\xba\x3b\x2c\x5b\x1b\x0b\x5b\x22\x2d\xfd\x7f\xf8\x17\xc1\x0d\xf0\x57\x25\xbe\xbc\xd8\x22\x90\xdf\x90\x6f\x23\xbf\xaf\x89\xdb\x34\xd0\x07\x28\xc0\x1c\x59\xf6\x9b\x35\xf6\x0b\x35\x7d\x26\x7f\x7f\x6d\xe7\x5c\x39\xb7\x9a\xb9\x3c\x67\x75\x44\x73\x39\xdc\x5e\x50\x21\x8e\xc1\xdf\x78\xa8\xcb\xf2\xb8\x38\xc9\xf8\xb5\x72\x2c\x57\xc9\xbe\x87\x84\xb0\x59\xce\xcf\x64\x11\x8c\xe7\x49\x4c\xb8\x11\xdb\x2e\xf3\x21\x19\x3d\x06\xde\x9e\x97\x27\x31\xf5\x4e\xc5\xf3\x36\x74\xae\x3a\x0a\x46\xf2\x1d\x40\x7b\x77\xcb\x02\xf6\xba\x93\xfc\x5a\xca\x6b\x83\xc0\x2d\xa2\xa1\x10\xd1\x93\xc9\x80\x0e\x01\x7b\xb0\x47\x03\xe0\x4e\x21\x52\x88\x48\xe2\x91\xe8\x0a\x84\x97\x21\xf4\x09\x71\xa1\x6c\x56\xa2\x8b\x3f\xe8\xfd\xca\xe3\x76\x0f\x89\x7a\xe7\xe3\xfc\xb7\x3d\xae\x2a\x85\xd9\x8c\xfc\x40\x02\x5a\xa3\x3a\x1d\x2d\x8c\x08\x84\x65\x30\x98\xca\x2a\xa8\xb1\x9f\x87\x2b\xc2\xaf\x86\xdf\x97\x27\x66\x88\x3d\xdd\x47\x59\x0f\x51\x31\x83\x55\x72\x42\x6d\xf7\x5e\x95\xbd\x7c\x84\x8f\xfc\x88\x5d\x85\xcb\xec\x8f\x4b\x2b\x60\xa8\x27\xba\xc5\xbe\x3e\xba\x87\xc7\x2f\xe5\x13\x60\xf1\xda\xb5\x87\xad\xce\x75\xe8\x3c\x86\x7b\xb7\xf2\xf6\x5e\x2b\xbe\x9f\x4a\x18\x26\xd3\xaa\x3a\x0c\xdd\xdd\x6f\xdf\x19\xb3\xe0\x65\xcf\xcf\xe3\x83\xf3\xd3\x2a\xfb\x52\x3e\x78\x5c\x8d\x19\xbd\xba\x26\x1f\xdb\xc7\x5c\xda\xdb\xf3\x03\x1d\x62\x65\x9e\xee\x67\xe1\x5e\xc6\xdb\x83\x15\x18\x11\x8a\xba\x87\x0a\x5c\xc2\xdb\x03\x15\xd8\x91\x8b\x78\xf7\xaf\xef\xfb\xd5\x81\x4f\x83\xde\x70\x09\xdd\xbe\xbf\xf7\x06\x3f\xaa\x65\xe8\x43\xb4\x7e\x41\x4b\xb5\xd6\x81\x4d\x92\x64\xd2\x32\x06\x57\xf3\xc8\xa7\xf6\xd9\xa4\xb8\x13\xb6\x05\xe5\xb4\xed\xb1\x04\xaa\xf4\x7e\xdb\xa6\x02\xc2\x47\x34\xcc\x4a\xd3\xdc\xf7\xc0\xee\xff\xdd\x81\x9e\x48\xb3\x48\xec\xe3\xb3\x23\x5a\xba\x4b\x49\x97\xf4\x45\x55\xd9\x4a\xe1\x4f\x69\x68\x95\xdf\xda\x35\x79\xad\xf2\xad\xbd\x6e\x3b\xf9\x5a\xd8\x6a\xee\xb0\xf7\x8c\xe8\xa1\x9d\x5f\x1b\xd5\x5f\xfb\x7a\x6b\xd4\x50\x1b\x98\xe2\xfd\xcf\xb3\xfd\xbf\xab\xd7\xcb\x25\x97\x30\x58\x7d\x22\x1c\xdd\x7f\xdd\xf7\xf7\xe2\x50\xc5\xf7\xf7\x3a\xa5\x3e\xfc\xe2\x61\x27\xb3\x7e\x90\x72\xdd\x8d\x4e\x5d\xee\x25\xc2\x7f\xe5\xe1\xe0\xc7\x3c\xfb\x8a\xb2\xc0\xaa\x9c\x7a\xf2\x0f\xe2\xa1\xaa\xa7\x4e\x6e\x36\x31\x59\x57\xe4\xeb\x59\xde\xe1\xc0\x64\x48\x59\x1f\xe8\x4b\xc3\x32\xf2\x48\x80\x25\x23\x46\x50\xdf\xb8\x9d\xc2\x5e\x9c\x02\x89\x54\x5f\xdb\x36\xa3\x1e\x1a\xc5\x54\xec\x00\xc1\xd5\xf6\xf1\xc0\xde\xca\x3a\x5d\x79\xbc\x6b\x5e\xf4\x0e\x6c\x89\x7c\xcd\x4d\xd0\xfe\xf8\x41\xf6\xa2\x1a\x3b\x12\x76\x63\x40\x47\x2c\xfc\xbf\xf1\x82\xff\xee\xcd\x2e\x2d\xe2\xcf\x2a\xe4\x06\x75\x13\xed\xee\x0e\xbb\xbd\xd5\x0a\x79\x26\xd4\xc9\x0b\xb3\x4b\x8b\xc4\x49\x37\x44\x87\x99\xf6\x15\x17\xb6\xc1\x74\x51\x29\xfd\x14\x4f\x83\x16\x8c\x5e\x07\xd8\x61\x22\x2b\xa9\x93\xc0\x84\x75\xe9\xc6\xcf\x4a\xd0\xd4\x1c\xf8\xf1\x90\x5e\x26\x4c\x92\x51\x08\x16\x1f\xf4\xd8\xd5\xaa\x64\x80\x42\xf4\xdf\xe9\x05\x2f\xd3\x03\x0c\x97\x28\x4c\x42\xe3\x4f\x6c\x6f\xc4\xa5\x19\x6f\xb4\xc9\x69\x52\xa5\x1c\xe8\x99\x2c\x3a\x25\x3e\xab\x0d\x54\xc2\xb0\x71\x85\x0e\x72\x81\x99\x1f\xfb\xa9\xfb\x57\x3c\x76\xc4\xd0\xf1\x7e\xce\x0b\x3e\xa8\xeb\x5d\xb8\x38\x0f\x03\x04\xb9\xc3\x75\x74\xbe\xa9\xdd\xb7\xda\x9e\xaf\xe7\x49\x93\xf1\xe0\xda\xa9\xf5\x2c\x0b\x06\xa1\x6b\x2c\xf2\x5a\x3e\xb1\x9e\x65\x13\x88\xd8\x95\x24\xee\xc0\xed\x54\xee\x88\x66\xbe\xc1\x63\x38\x83\xfd\x1f\xf0\x82\xed\xbb\x44\xbe\xe6\x36\xce\x8a\x3f\x70\x38\x46\xe1\x1d\x44\x01\x3d\xc9\xdb\xa2\xac\xc3\x1b\x75\x34\xe5\xd4\x89\x57\xa2\x4e\xb9\x8b\x75\xb4\x6c\x88\x3a\xef\xe6\xd9\x85\xfe\x7e\x86\xe1\x0d\x87\xd8\xc9\x5d\x65\x08\xf1\x46\xce\x02\xbd\xfa\xb2\xd8\x8a\xc5\x36\x9a\x4a\xfc\x2f\x1e\x0c\xbe\x73\xc7\xbb\x17\xbd\x43\x34\x31\x9c\xe5\x7b\xff\x41\xf6\xc2\x1a\x3b\x88\x44\xf5\xfe\xdf\x79\xc1\x1f\x79\xf3\xf0\xb7\xcb\x79\xbf\x9a\xf7\x04\x8f\x71\x25\xd1\x6a\xdb\x56\x41\x6b\xf8\xae\xcd\x3e\x84\xc4\xa8\x72\x01\x03\x04\xac\x12\x58\x71\x41\xfe\x61\x44\x83\x55\x5f\xa1\x24\xe0\x52\x05\x95\xa9\x66\x8b\x9c\x6f\x84\x05\x4f\x33\x9e\x75\xe3\x14\x52\xf6\x52\xe3\x8b\xc8\xcc\x73\x56\xad\x9a\x9c\x6a\xdf\x31\x68\xa9\x25\xd5\x7d\xd6\x54\x63\x98\x93\xfa\x8b\x35\xf6\x48\xb1\x15\x26\x3d\xe8\x6c\xb0\x41\xf9\x9f\xa8\x05\x1f\xae\x2d\xb8\x17\x69\x05\x2b\x9e\x3f\xc8\x48\x0b\x4b\x04\xe8\x46\x8f\x53\xd6\x82\xf8\x8f\x88\x47\xbd\x5c\x93\xf2\xda\x23\xc9\x5b\x1b\xa2\xb5\x09\x71\x43\x10\x1e\x57\xc6\xb9\x48\x2c\x8c\xf0\x32\x93\x73\x0c\xac\xd1\x50\x20\x22\x8f\x70\x15\x9e\x25\xe5\x65\x9c\xf6\x84\x05\xba\xec\x16\x4f\x30\x4f\x71\xca\x8b\x6e\x8c\x96\xb8\xb8\x44\xd0\x70\x29\x14\xc3\xb4\x25\xea\x7c\xf9\xb6\xd9\x39\x15\x9c\x05\x56\x1e\x88\xc3\xc9\xb3\x44\x20\xae\xb5\x48\xb3\x5e\x7b\x03\x2e\x90\xc8\x05\x04\x6c\xe5\x81\x83\x3a\x65\x3d\x84\x5b\x21\x8a\x41\xc4\x76\x45\x29\x0e\x82\xd8\xb1\xa9\xde\xa3\x81\x5a\x57\x82\x53\xcb\xf8\x86\x33\xc5\xa0\x3f\x34\x4a\xfd\xf6\x46\x9f\xb0\xb2\x45\x51\xf2\xed\xd0\x6c\x7b\xc0\xf1\x9c\x0e\x26\xc3\xb5\x98\x9a\xde\xfe\x33\x83\xa7\x5b\x43\xad\xe0\xb6\x47\xcf\x61\x7a\xb7\x4e\x13\x54\x4f\x65\x77\x92\xbc\xf1\xb1\xec\x14\xad\x4f\x29\x2a\x1a\x61\xbb\x9d\x8b\x76\x58\x66\x6e\x4e\xb9\x63\x24\xd2\xec\xa4\x4b\x8b\xe4\x89\x80\xd8\xe2\xcf\x7c\x47\xf0\x56\xcf\xbd\x66\x76\xc2\x41\x0e\x58\x04\xbb\x97\x23\x04\xee\x5a\xc8\x0f\xa5\x2b\x84\xe0\x4f\x27\x0d\x8e\x71\x16\x65\x89\x1b\xaf\x8e\x3b\x91\xab\x0b\xc6\xb3\x9f\xf5\x10\x72\x8a\x26\x13\x52\xcf\x0b\xfb\x98\x2e\xa5\x9d\xce\xfa\x6d\x5e\xf4\x1e\x03\x3b\xe3\x52\x1e\x67\x79\x5c\xf6\x89\x86\xeb\xa2\xf7\x48\x52\x81\xd4\x0d\x47\xaa\xfc\xcd\x63\xd8\x9f\x7a\xec\x70\x2b\xbc\xad\x97\x46\x89\xf0\xbf\xe4\xf9\xe3\x6b\xfd\x52\x04\x6f\xf7\xe6\x66\xf1\x1a\x4a\xde\xa5\x85\x33\x5c\xa4\xad\x2c\x12\x11\x9f\x9b\xe5\x6b\x78\x0b\x9d\xbe\x83\x68\x3d\xe4\x7c\x01\x3f\x8d\x94\xca\xd8\xe6\x09\x72\x01\xa5\x6d\x17\x23\x6b\xd0\xd5\xae\xe2\x71\xf2\x5e\x51\xf2\x3c\xcb\xca\x42\xa5\x93\xea\x83\x1a\xf4\x0c\x31\x64\x5b\x76\xe2\x3d\xc1\xe6\xcc\xb1\x03\xd0\x4f\xfe\xc9\xa0\x81\xca\x0d\x29\x3e\x46\xb7\x00\x15\x08\x39\x3d\xf1\x73\x80\xf6\xe5\xf8\x1d\x0e\xb0\xca\xde\xf6\x5f\x7b\x40\x79\x68\x5e\x78\xe0\x69\x83\x0f\xa4\xbd\x8e\xfa\x58\x97\x2e\xe3\x67\xf0\xb3\xe4\xfd\x43\x6f\x5b\x09\x68\x01\x65\x93\xdf\xae\x88\x12\xe8\x05\x4b\x9b\x90\x05\xb5\x55\x13\xba\xe0\x82\xce\xd1\xeb\x4a\x04\xd4\xc8\x81\x84\x2e\x2c\x5d\x40\x96\xba\xe1\x14\x68\xa7\xb7\xb1\x39\xac\x3a\x21\x24\xb7\x22\xdf\x17\x5b\x22\x55\xcc\x0d\x95\xad\xa3\x20\x38\xf0\x56\xea\x2a\x6e\x6f\x64\x89\xaa\x68\x5b\x80\xb3\x65\xc3\x6d\x14\x6a\xc2\xdd\x3c\xee\x84\x79\x9f\x17\x59\x0e\x02\x57\x07\x66\x0e\x7d\xaa\xd3\xeb\xd4\x51\x67\x16\x11\x96\x55\x68\x3f\x58\x99\x41\x83\x8b\x92\x1f\x3b\x3e\xad\x5c\x18\x33\xd3\x93\xf8\x0d\x8c\xd9\xab\xfc\x0a\xcc\x30\x79\xc2\x58\x13\x18\x55\x82\x31\x7a\x71\x61\x52\xea\x6d\xdd\x58\x05\x95\xf2\x63\x5b\x33\xcd\xb5\x50\xc7\xf7\x6d\xcd\x34\xd7\xb3\x6c\x92\xdf\x2d\x26\x2c\x5e\x6e\xd8\x77\x50\xf1\x43\xe5\xe4\x5a\x3a\xb5\xf0\x63\xe2\x42\x4b\x74\x4b\xcb\x96\x33\x29\x47\x7f\xe6\x26\x05\xea\xbe\x14\x86\x2b\xa2\xe0\xc7\x20\xfe\x68\x23\x5e\x2f\xeb\x7c\x5e\xc4\xf2\x29\x70\x5b\x6b\x8f\x8b\x4b\x85\x72\x7c\x7a\x7a\xba\x70\xfc\x71\xbf\xea\xb1\x6f\x8f\x53\xc0\xc3\x13\x2b\x9b\x71\x77\xf5\xf4\xca\x5d\x52\x80\xf4\xfd\xf7\x79\xc1\xdb\xbc\xc5\xaa\x5b\x4a\xec\x14\x83\xd0\x76\x8e\xec\xc1\x30\xf3\x0a\x71\x67\xad\x21\x13\x7d\x5c\x94\x79\x96\xb6\x91\x3c\xa9\x95\xf5\x20\x4a\xb2\xc9\xf9\xb3\xb2\x9e\xed\xff\x96\x6d\x30\x12\x08\x99\xf8\x5d\x19\xff\xbf\x6b\xec\x10\xf9\x94\xfd\x3f\xab\xb1\xbb\x2a\xdd\x6d\xfb\x96\xfe\x24\xe6\x4d\x10\xd9\x7f\xae\xd1\x25\x94\x83\x3a\xb6\x47\x79\xad\x55\x74\x80\xf6\x67\x1a\x89\x87\x5b\x25\x79\x94\x55\xe7\x40\x5c\x3e\x38\x6e\x01\xef\x4e\xc1\xd4\x99\x6f\xa4\x71\x52\x1f\xa4\xf1\xdd\x08\xd3\x28\xb1\x51\xfe\xb4\xb0\xb2\x38\xe1\xe1\x21\x11\xc1\x26\x94\x24\x7d\xcd\x21\x60\x06\x40\x20\x16\x0a\xc8\xeb\x22\xee\x74\xe5\x20\x88\x44\x40\x52\x00\x35\x87\x62\xca\xb1\xac\x9c\xb7\x36\x42\x8c\x5a\x5f\x13\x0a\x41\x50\x44\x40\xb1\xac\x40\x81\xce\x04\xb7\xde\x65\xea\xa0\xea\xa6\xaa\x35\x24\x45\x9b\xdc\x25\x45\x09\xb6\x66\x02\xe7\x80\x73\x88\x0d\x6e\x58\xfe\xaf\x1d\x52\x42\xf5\x67\x0f\xdd\xe5\xde\x53\x08\x87\x44\x31\xa7\x8e\xd1\x4a\x88\xd9\x55\x89\x53\x15\x45\x1d\x97\x24\xde\x9a\x5c\xfb\x9d\x15\x13\x3e\x84\x06\xdc\x27\xf2\x6c\x17\x99\x34\x50\x8f\x61\x71\xb4\xb3\x1c\x5a\x89\xe5\xf4\x89\xcb\x89\xc2\xaa\x53\x88\x35\xc2\x18\x29\x12\x65\x8a\x3a\xaa\x13\x26\x09\x1c\x52\xd6\xc2\x35\xcc\xd3\x97\x0f\xcd\x4c\x23\x50\x1f\xc4\x26\x68\x52\x7f\xd5\x5a\x12\xad\xb1\x50\x44\xa4\x74\x9d\x22\x26\x06\xb7\x6c\x29\xeb\x7a\x44\xc8\x8a\x0c\x87\x54\xb5\x50\xf5\x14\x4d\xd4\x81\x72\xe2\x82\x07\xb0\xc6\xa4\x54\x0b\x80\xa4\x0a\x67\x97\xec\xaf\x70\x2d\xdb\x92\x33\x2a\xb5\x9f\x19\x28\xa1\x50\xcc\xb0\x52\x9a\xa9\x3e\x4c\xc4\x85\xb8\x95\xb5\xf3\xb0\xbb\x11\xc3\x5c\x6e\xf2\xe0\x8e\xa1\x12\x0a\x3b\xb2\x2b\xe4\xc1\x56\x40\x67\x13\x59\x14\xc6\x03\x29\xd4\x58\xea\xd0\x63\x25\x90\xae\xdd\x9b\xe9\xfd\x6e\x92\x5e\x51\xda\x6d\x42\x4c\x4a\xd8\xba\x00\xf6\x03\x4c\xda\x91\xe2\x21\x40\xb6\x62\x24\x1a\x77\x0b\x8d\x53\xab\x50\x98\x3b\xf2\xf8\x24\xd5\x71\x8c\x27\x46\x18\xc2\xb5\x3e\x7f\xda\x2c\xbf\x85\xcb\xc2\xf8\x2d\x94\x85\x71\x0c\xa1\x12\x9f\x36\x8b\x12\x46\x43\x14\xc9\x66\xa5\x19\x07\xfe\xc3\x0b\x3a\x02\x08\x5e\x85\x63\x76\x77\x23\x9c\xd4\x1c\x17\x29\x6c\xfb\xb8\x63\xa5\x6d\xb7\x91\xd4\x46\xa7\x8e\x4d\xb0\x51\x50\xba\x02\xd5\x51\x9d\xae\x55\xff\x9e\xe4\x5b\x33\xd3\x75\xbe\x75\xbc\xce\xb7\x66\xe4\xff\xa3\x2b\x52\xfe\x35\x2d\xff\x3a\x51\xe7\x5b\x27\x40\x6c\xca\x4b\xc7\xd1\x3c\x07\xcf\xc1\x9f\xc7\xeb\x7c\x3d\xcb\x66\xf0\xbf\xd3\x6e\x70\xc8\xcf\x1c\x65\xff\x6f\x15\x61\x45\x16\x89\x15\xd0\xff\x16\xd3\xf5\xcc\x7f\xd5\xd1\x60\xce\xbd\x44\x90\x48\x02\xea\x19\x47\xc5\x54\xaf\x17\x63\x04\x11\x46\x27\xc9\xe5\x61\x87\xde\x82\x49\xfb\xa2\x77\x84\x62\x2e\x16\xe7\x2f\x7a\x0c\x15\xcc\x73\xe7\xe4\x8f\x83\x6b\x59\x56\xca\x3f\xae\x46\xfe\x45\x5a\xd6\x17\xbd\x43\x59\xb1\xd8\x09\xdb\xe2\xa2\xf7\x58\x93\x00\x85\xa1\x1a\xfa\x99\x47\x50\x64\xbb\xbe\xf0\x6d\xf2\xc2\x52\x9e\x5d\xe8\xeb\x4b\x8f\xd4\xc1\xe3\xd8\x88\x8b\xde\x55\x36\x2c\x8c\xa3\x8c\xff\xf0\x11\x76\x3b\x1b\x2a\xc3\xbf\x2e\x98\xb8\x43\x5d\x53\x72\x87\xf8\xdf\x4d\xa0\x7a\xaa\x83\x5a\x49\x90\xce\xb3\x81\xea\xf9\xc7\x83\x27\xdc\x81\x57\xf6\x5e\xca\x97\x3c\x66\xfa\xce\xff\x75\x2f\xf8\x65\xef\x8c\xfa\x59\xfd\x36\x88\x77\x0a\x15\x53\xfc\xf7\x34\x24\x4a\x5d\x50\xe1\x44\x94\x39\xe3\x12\x4c\x6b\x3d\xb6\xc9\x4f\x8b\x30\x4f\x31\x62\x0b\xc2\xc9\x3a\x61\x7a\xec\xfa\x49\x55\x6a\x23\x8e\x34\x30\x69\x27\x4c\x6f\x84\xa0\xbb\x24\x4e\x7b\x17\xe4\xcf\x46\x37\x6c\x8b\x42\xfe\x75\xfd\x94\x79\xa1\x79\x7d\x73\xa3\xec\x24\x2e\xc0\xdf\xe0\x10\x29\xc8\x8e\x3b\x75\xd8\x3f\x5e\xaf\x6c\xaf\x5d\xd4\xff\xf5\x98\x35\xb9\xfc\x3f\xf7\x82\xdf\xf3\x56\xf4\xef\x4b\xee\x2e\xd3\xe1\x6e\xf7\xac\x3a\xfd\xa6\xa3\xb1\xca\x8c\x2f\x8b\x88\xdf\x1e\x96\x84\x52\xac\xc2\x50\x43\x30\x35\x35\x73\x11\x6d\x84\x25\xc4\x0f\x46\x59\xab\xd7\x51\x38\x4b\x53\x22\x6d\xf4\x8a\xa9\x5c\x44\xcf\xd9\x08\xcb\xe7\x14\xbd\xb5\xa2\x95\xc7\x20\x17\x9f\x63\x12\x33\xa6\x66\xa6\x64\x0f\x4e\xe5\x1b\x45\x07\x16\x9f\xdd\x01\x29\x73\x97\x91\x7f\x4f\xb0\x74\x07\xf2\x9a\x8e\x9a\x71\x38\xba\x13\x3d\x50\xaf\x1b\xf9\x04\x65\xd5\x9d\x68\xce\xdc\xd0\x9c\x6e\x4c\x37\xd7\xba\x59\xf3\xba\x46\xd8\x89\x6e\xb8\x6e\xd2\x99\x9d\xd7\x31\x5a\xbf\xfe\xb5\xc1\xbf\xbc\x2d\xcb\x4a\xbe\x53\x37\xdb\x6f\xbd\xc4\x63\x3b\xad\x69\x3f\x09\x9e\x33\x37\x70\x6b\x74\xd5\xcb\x8d\x1c\xed\x2f\xf4\x70\x2e\x3a\xf2\x64\x25\x15\x0f\x6c\x45\x94\xb5\x36\x45\x7e\x72\x6a\x6a\xa6\x79\x7d\x73\xda\xad\x7f\xca\x94\x98\xf1\x5b\xc1\x5d\x77\xae\x70\xf8\x7b\x44\x1f\x4d\x89\xb2\x35\x95\x15\x8d\x5c\x20\x96\x1c\x7e\x62\x5e\xac\xc5\x61\xca\x9f\x76\xf6\xdc\x14\x26\xcc\xdc\x08\x7b\x8a\xb8\xaf\x3f\xe9\x7e\xef\x36\xe6\x08\x1f\x29\x11\xe4\x44\x9f\xb5\xae\xed\x3a\xc9\xdf\x3e\xce\x6e\xd9\x53\xc8\x1d\x02\x75\xcd\x46\x51\x2e\x8a\xe2\xb6\xfe\x1c\x1c\x49\xe7\x16\xe7\x97\xfd\x2f\x8f\x05\xaf\xf0\x76\xbc\x0d\x7c\x7f\x85\x8d\x44\x37\xc4\x5b\xa6\xac\x00\xf8\xb2\x3e\x69\xf6\xad\x03\x44\xdd\x8d\x30\x33\xa5\xc1\x27\xcc\x1b\x90\x6e\xdb\xbc\xe8\x31\x73\xf7\xa2\x77\x75\x61\x57\xce\x91\xd1\xef\xa8\xb1\xe7\x7b\xcc\x7a\xda\xcf\x03\x21\x3b\x11\xca\x85\x3d\x1b\xf5\x19\x75\x04\x97\x4a\x9c\x46\xfa\x8e\x73\xbe\xb8\x84\x74\x6e\x6d\xd9\xd9\xca\x0e\xb7\x87\x06\x39\x03\xf9\x66\x8f\xb9\x75\xf4\xbf\xdf\x0b\x9e\xef\xd1\x0f\xad\xfe\xe2\x23\x75\x5e\xf4\xe2\x12\xac\x47\x60\x9f\xd7\xdd\xaa\x99\xe3\x08\x90\x0d\xf5\x35\xd9\x10\x12\x2e\xa4\x80\x86\x1a\x5c\xbb\xae\xff\x3a\x29\x67\x49\x5d\xb6\x26\x93\x6d\x82\x9f\x4e\x15\x7f\xa3\x56\x89\x30\x36\x9f\x6d\xa7\xdb\x61\x1e\xcd\x2e\x2d\x5a\xf9\x29\xef\xac\x05\xaf\xb3\xd3\xd8\x22\x7a\x0a\xb9\x8a\xe4\xbe\x2f\x6b\x4e\x39\x0c\x98\x7c\x54\x9d\xbb\xb2\x7b\x9a\x48\x64\x2a\x70\x49\xb9\x22\xcf\x63\xff\x56\x65\x8a\xe4\xc1\xe4\xa2\xfc\xc3\xf5\x4d\x58\x2d\xc4\xfc\x28\x48\xeb\xd8\x3b\x36\x74\x45\x4f\x61\x39\xa7\xe2\x44\xb0\x17\x1e\x62\xd7\xee\xe5\x61\xca\x0f\xfc\xcc\xc1\xe0\x07\xbc\x1d\x6e\xba\xf1\xaf\x8a\x5c\xc0\xa4\x43\x0d\x0d\x42\x53\xb7\x8d\x9b\xde\xbb\xb4\x3c\x3e\xa7\x4b\x7f\xfc\x00\xfb\xb1\x71\x76\xd4\x62\x87\xf3\x5f\x3f\xae\x8e\x7c\x2f\x1e\xaf\xe2\xcd\x93\x0a\x5f\x01\x47\x69\xc5\x15\x8e\x99\x45\x6b\x9a\x60\xdd\x4e\xf3\xdb\x27\xf3\xde\x1e\x8a\xfc\xe6\x27\xe2\xb3\x93\xfd\xa6\x6f\xb8\xee\xba\x26\x9f\x8f\x73\x00\x7d\x8f\x45\xa1\x68\x0f\x4b\xc5\x3e\xa7\x82\xc1\x91\x55\xcf\xe2\xb3\xa7\x6c\xbf\x6f\x32\x86\xbe\xe7\xa9\x25\x58\x06\x4f\xac\x58\x82\xd1\xf0\x34\x7d\x48\x17\xe1\xbb\x0e\xb3\x4a\x1e\x33\x48\xd6\x1b\x24\xbf\xa0\x95\xf8\x77\x57\x32\x75\x61\xb1\xff\xf9\xff\xcf\xde\xb7\x07\x59\x76\x94\xf7\xe5\xdc\x7d\xf7\xea\x79\x48\xc5\x41\x24\xa1\x73\x48\x79\x77\xed\x3b\x77\x77\xf5\x42\x1a\x3d\x60\x76\x67\xd7\x1a\x49\xbb\x3b\xda\x99\x95\xa2\x18\xc2\xf4\xbd\xa7\xef\xbd\x47\x73\xee\xe9\xcb\x79\xcc\xec\x95\xcb\xae\x60\x93\xc4\x2e\xca\x96\x08\xb8\x80\x8d\x1f\x82\x28\x42\x41\x2a\x08\x46\x26\x26\x89\x08\x08\x6c\x12\x83\x95\x82\xb2\x11\x26\x31\x45\x30\x2a\x87\x20\x57\xd9\xd8\xa1\x94\x4d\x5c\x95\xea\xef\xeb\xee\xd3\x7d\xee\xbd\x33\x77\x66\x56\x2b\x0a\xcf\x7f\x33\xe7\x9e\xd3\xa7\x4f\xf7\xd7\x5f\x7f\xfd\x3d\x7e\xbf\x5d\x3f\x14\x35\xaa\x1f\x70\x6a\x54\xdf\xe5\x4d\x40\x73\xb7\xa0\x6f\xff\x6b\x53\x9e\xba\x5d\x92\x2d\x47\xe1\xc5\x5d\xa4\x6e\x89\x83\x9d\x2d\x69\xc0\x7c\xa3\x5e\x94\x9f\x85\x7a\xa8\x8c\xfb\xcf\xec\x0a\xe6\x9d\x2b\x06\x36\x57\xe1\x19\xa1\x77\xd6\x42\x66\x86\xf4\x1c\x96\xe8\x40\x3a\x3f\xcf\x5b\x05\x24\xd0\x80\xbe\x4e\xc4\xea\x48\x88\xa2\xef\xec\x20\x9f\xf3\xc8\x9e\xb7\x17\xbc\x88\x92\x8e\xff\xef\xbc\x35\xc0\x3b\x46\xf5\xfa\x3e\x7c\xf0\xb8\x48\xc0\x9c\x85\x53\x64\x90\x2e\xa9\xf6\x96\x68\x57\x00\x80\x38\x56\x0e\x95\xb7\xd8\x82\x2c\x37\x2d\x75\xbf\x73\xa0\xed\xb1\x01\x16\x6c\x25\x53\x98\x48\xa3\x69\xba\x15\x4a\x53\x94\xd1\xa5\x40\xbe\x9f\x07\x4b\x0d\xf2\x98\x06\xf3\x01\x0e\xfa\xf2\x16\x75\x87\x02\xdd\x01\x20\x9e\x86\xb9\x68\x05\xd2\xd6\x1f\xc8\xa2\x2f\xb5\x64\x9a\x46\x2b\x72\x6b\x4e\xb9\x3c\xa4\xa8\x32\x67\x44\xf8\x90\x3a\x38\x46\x9b\x5d\x23\xa9\xe8\x67\xc1\x0e\x50\x1f\x89\x90\x34\x18\xee\x66\xad\xae\x14\x33\xdd\xb3\x2d\x76\x08\x71\x8c\x65\x83\x1a\xd2\xdc\x0d\x8e\x2e\x91\xd7\x38\xc1\xd1\x22\x91\x53\xec\xcf\xf9\x3f\x31\x05\x91\x98\x34\x02\xe2\x1a\x91\x4e\xc3\xba\x23\x14\x67\x22\x9b\xca\xc5\x94\xf5\x3b\x3f\x36\x98\x26\x94\x52\xfd\x41\xd3\x54\x49\x01\x21\xcf\xec\x23\xe7\x2e\x11\xe9\xc0\xac\x11\x42\x20\x2d\xf9\xfa\xde\xe0\x9e\xb5\x6e\x70\x77\xff\x71\x77\x1a\x86\xd2\x91\xfc\x25\x7f\xb5\xcd\x5f\xb2\x65\xfe\x92\xdf\xf0\xb4\x5d\xf6\xa4\x17\xdc\x0c\x7f\xe1\xac\x44\x49\x18\xad\x44\x61\xc1\xe2\x75\x67\xc7\xb6\xd1\x5a\x84\x91\xb7\x5d\x22\xc6\x80\x71\xef\xdd\xc6\xdd\xff\x01\x61\x47\x59\x59\xbf\xc8\x6f\xc1\xbf\x6f\xb2\x3a\xb5\xb5\x94\x45\x95\xc0\xf4\x0b\xc4\x71\x54\x54\xca\xa3\x56\x8e\x36\x16\xc5\x32\x4f\x30\x43\xcf\xbf\x40\x82\x0f\x7b\xd6\x05\xca\xf2\x5c\x6e\x50\x99\xce\x73\x53\x8f\x4a\x4b\x26\x97\xb7\xa1\x4d\x87\x00\x64\x45\x26\x8d\x2b\x84\x70\xb3\xdb\x30\x33\xad\x76\xbd\x16\xec\x0c\xda\xde\x29\xf9\x35\x64\x73\xd6\x3b\x44\x4a\xfb\x71\xd1\x89\x8c\x43\x1d\x83\xdd\x66\x2d\x5c\xf0\x80\x5b\xc0\xd1\x72\x7f\xbe\x87\xdc\x63\xcd\xd9\x9b\xb6\xc8\x94\x40\x7e\x46\xf1\x17\xac\xac\x41\x0d\xb9\xe6\x88\x02\x83\xc1\x2d\x90\x55\x85\xe6\x82\x9d\x52\x35\x94\xa8\xa6\xd0\x93\x54\xfe\x1f\x0f\xc9\xe3\x9e\x61\x68\xfc\xc0\x5a\x0c\x8d\x6b\xf7\x01\x19\x1a\x1f\x2c\x0b\x59\x31\xce\x2d\xc7\x55\x4d\x82\x76\xd0\x49\xe5\x60\xa5\xbe\x95\x70\x0b\xba\x83\xda\x65\x66\x89\x42\xd8\xd8\xde\x59\xb6\x59\x69\x5f\x35\x25\x7d\xd1\x6b\xaf\xaf\x59\x8f\xfb\x33\xe3\xea\xa1\xd7\x2c\x17\xb5\x56\x11\x21\x1f\xb9\x82\xdc\xba\x6e\x56\x34\x20\x35\x8d\x48\x7e\xf6\x5f\xda\x1f\xfc\x89\x37\xee\x57\x4c\xc5\x2d\x97\x9c\x48\xd1\x5d\x05\x3a\x55\xfe\x87\xe9\x65\x72\xf5\xe9\x52\x0b\x96\xe8\xe4\x51\x30\xd3\x3b\xd1\x0a\x4f\x30\x73\xbf\xcf\x5a\xbc\x41\xef\x62\x2b\x98\x4b\x6b\xae\xd1\xac\x25\xfa\x56\xd9\x01\x94\xac\x03\x24\x4d\xaf\x68\x75\x29\x67\x59\x84\x09\x66\x9d\x94\x25\xf9\xf0\x73\x58\xc0\xa4\x90\x09\x91\x1a\x34\x73\x7c\x8b\xf0\x11\xe8\x1c\x19\x56\xcd\xdf\xdb\x4b\xbe\xaf\xe9\x60\xfe\xd4\x23\x27\xd7\xd4\x65\x93\x65\x9b\x4b\xdd\xfa\x21\x6f\xb3\xca\xb5\x41\x91\xeb\xa9\xfc\x4e\x8d\x0d\x81\xa9\x26\x3a\x63\xc8\xfc\x3c\x10\x05\xed\xb1\x90\x3b\x8d\xaa\x0a\x0f\x2c\x13\x81\xb3\x5c\x5d\x81\xfc\x28\xaf\xaa\xd4\x8f\x4f\x97\x6a\xfc\x83\x1e\xb9\xeb\x12\x7c\x3a\xaa\xf4\x73\x97\x42\xa5\x47\x4e\x4a\x73\x22\xf2\x6d\x75\xbe\xad\xce\x5f\x3d\x9b\xfb\x52\xda\x6f\x17\xbd\xd5\xf5\xf7\x86\x45\xff\xec\x64\x85\xfb\xe3\x94\xf7\xc8\x32\xbc\xf7\x10\xc7\x2b\xa6\x9d\xa4\x67\xb9\x81\x7d\x3a\x6e\xc8\x8b\xc1\x09\xf0\xad\x7d\xc1\x89\xb1\xbf\x8e\xe2\x2e\x4d\xcb\x9b\x2d\x22\xe4\x31\xc7\xff\xc7\xb6\x09\xd8\xb6\x22\x94\xff\xd5\x26\x60\x7b\xce\xdb\xd2\x51\x30\xf8\xd9\x92\xf7\x1e\xd9\xb2\x2f\x17\xe7\xbd\xf5\x71\xdb\x3a\x7e\xab\x3a\xfe\x79\xe3\x0c\xfa\xbc\x17\xfc\xd4\xbd\xa6\x2c\x71\xf4\xa2\xdc\x28\x6e\xde\xaa\x48\x97\x63\xc1\xc2\xec\xb0\xd5\xca\x61\xab\xf5\xf2\xf2\xc6\xa3\x7e\x23\xd5\xcc\x45\x8f\xad\xaf\x2b\xef\xf4\x6f\xd7\xc5\xea\x63\x75\xd5\x5a\x44\xf8\x9f\xbe\xca\x41\xfe\x1d\x4f\x84\xef\xbf\xf7\xaa\xe0\x5d\x3b\x34\xa2\xf2\x28\xed\x57\xc4\xba\x46\x15\x99\xd3\xa3\x04\xeb\xc0\x54\xcc\x08\xe3\xb4\x02\xfd\xd0\x8e\x0e\xca\x34\x42\x20\xe6\xce\x2a\x7a\x6b\x48\x18\xd5\xef\x53\xa7\x5c\xed\xd6\xc7\x48\x8a\xb4\xb0\x75\x3a\x7c\x66\xb8\x4b\xe3\xc1\x14\xbc\x02\xf2\x4f\x8a\x34\xce\xea\x80\x72\x4d\x15\xcc\xb5\x26\x80\xaf\xbb\xbc\xf0\x75\x2a\xda\x52\x4b\x42\x4a\x18\x26\x5d\xaf\x44\x69\x2e\xcd\xce\xae\xc8\x40\xf9\xf2\xbc\xd5\xa0\xb3\x27\xe6\xcf\x9e\x38\x3e\xb3\x78\x62\x96\x4e\x61\xfc\x00\x0f\x02\x3a\x89\x56\xb4\xa9\x35\x46\xa1\x5c\x8f\x70\x24\x97\x9f\x36\x84\xd0\x70\x58\x8d\xb1\x7e\x44\xae\x51\x6d\xcc\x62\xbe\x55\x22\x72\x13\x69\x57\xe2\xaa\xcc\x69\x37\xa3\xe1\xfd\x64\x5b\x7f\x6c\xdb\x88\xaf\xde\x76\xfc\x15\x7b\x3b\xfe\xed\x2d\xf3\xa1\xfe\x5c\xb9\x21\xe3\x60\x1e\xc8\x2e\xdf\xa6\x6c\xc8\x52\xff\x48\x9f\x8e\x7f\x7f\x2d\xb2\xd4\xf1\x2a\x13\x8e\xc3\xef\xc7\xe3\xb0\x2a\x55\x09\x79\x06\xe4\xbf\x0e\x12\x9e\x59\xfd\x97\x99\x3a\xf5\x8f\xcb\x43\xf0\xd7\x3c\x72\xeb\x66\xbe\x10\x4f\xbd\x17\xbc\xf2\xd8\x9b\xdb\x30\xf7\x3f\x00\x5f\x79\xd1\x7b\xcb\xfa\xbb\xe8\xad\xfe\x1b\xd7\xc2\x38\x52\x5d\x1f\x79\xac\xf8\x9c\x47\x4e\x6f\x3a\x46\x74\xf7\xc2\x99\xd3\x0b\xa0\x34\xe7\x53\xd1\xcf\xce\xa4\xc7\x84\x88\xfd\xb7\x07\x62\xe4\x0f\x76\xfe\x5c\xe5\x06\x8c\xf9\xaa\x5c\x11\x0d\xd4\x6c\xa7\xb6\x40\xa9\xbb\x2e\xe6\xd2\xf7\xf5\x53\xd1\xe7\x69\x3e\x68\x90\x97\x9d\xc3\xd1\xfa\x80\x91\xfe\x17\x48\xf0\x29\x62\x5f\x91\x73\xaf\xb3\x3d\xba\x22\x0e\xad\x71\x04\x72\x13\x4d\xb0\x61\x78\xd1\x09\x59\x14\xaa\xf2\x2e\xca\xea\x88\xd6\x68\x00\xbe\x21\xa3\xb5\xcb\x32\xea\xbc\x82\x65\x50\x4a\x85\xcc\x33\x09\x1d\x88\x22\x35\x0d\xd7\xed\x5d\x2d\x4f\x8b\x56\x8e\x3b\x8d\xc6\xb5\x54\xb7\x9b\xcd\x08\xef\x69\x40\x19\x20\x24\x2a\x25\x9c\xab\x9a\xf5\x4e\x04\x65\x02\x70\xff\x0a\x4b\x23\x51\x64\x3a\xf0\x01\xea\xaf\x41\xc8\xe1\xc3\x74\x4e\xb7\xd4\x67\xad\x65\xd6\xe1\x18\xc6\xa6\xa7\x06\x33\xf3\x73\xea\xa5\xf8\x0e\xfa\x53\x64\x9f\x1e\xc3\xc5\x41\x9f\x4b\x0d\x47\x97\x1e\xca\x44\x32\x1d\xd4\xa3\x24\x8e\x12\x1e\x2c\x91\x7d\xa7\x06\xf3\xf8\x0e\x7d\xaf\x6a\x44\xdd\xd9\x53\x3f\x07\x4b\xe4\xa7\xf1\x4d\xf8\xff\x8c\xf5\x96\x19\x4c\xf0\xd1\x3b\x96\x7a\x92\xe1\x55\xf9\x20\x74\x5c\x53\xa0\xbc\x62\x1d\x77\xe6\xec\x92\x77\xff\x0c\xc6\x9e\x56\xa3\x14\xa1\x21\x30\x49\x11\x12\xb3\x62\x21\x96\x2b\x85\xaf\x20\x5d\xd3\xb2\xf5\x40\xae\xe5\x60\x3a\xb0\xbe\x33\xa8\x93\x7d\x41\x69\x33\x05\xd3\xc1\xca\x51\xb8\x66\x7a\x0b\x4f\x9a\x47\x55\x97\xe5\x2d\xfb\x4c\xbf\xa6\x83\xb6\x10\xf2\xd2\x4f\xd7\x65\x0f\x17\x04\x5d\x95\x36\x70\x97\xf5\xfb\x3c\xc9\xde\x44\x67\x79\x0b\xd2\xe9\xa1\x1e\xab\xc8\x78\x46\x1f\x82\x0a\xdf\x94\x0e\x58\x2f\xc6\x4a\xa2\x1e\x4b\xb3\x2e\x8b\xb5\x9b\x30\x62\x31\x58\x43\xc0\xdd\x0a\x99\xc7\x8e\xa8\xdb\x53\xd5\xa0\x8b\x98\xb1\x01\x2d\x83\xe9\xc8\x56\x71\x48\x14\x3f\x7e\x2e\x52\x1e\x22\x74\x83\xb4\x1c\x8a\x44\x4e\x3b\x96\x73\x70\x9a\xf0\xf3\x72\xb6\x39\x16\xa5\x0b\xda\x12\xfd\x01\x3d\x88\x70\xf9\xfd\xe5\xce\xe1\x92\xc1\xfe\x50\x89\xe3\x3e\xb4\x86\x16\x01\x93\x06\xeb\x11\x94\x50\x1d\xc8\xb4\xfa\x01\x2d\xc5\x61\x31\x5b\x7c\xf8\xed\x22\x51\x47\x02\x40\x9e\x00\x57\xa9\x55\xdc\x8f\xbd\x2c\xa7\x17\xbf\x42\xae\x62\x5b\xb8\xea\x34\x2f\x52\x48\x55\x8b\xf2\xb2\x7b\x80\xf4\xdc\x32\x09\x6d\x52\xd8\x50\x15\xc8\x46\xcc\xcd\x70\xab\x1e\xc3\x83\x8b\x67\x66\xcf\x48\x3d\x8f\x0d\x48\xcb\x1b\x6b\xe4\x6c\xa0\xda\x4c\xd9\xc3\x45\xa2\xe8\x9d\xb0\x61\x23\xf6\xe7\xd4\x75\x75\xbf\xae\x78\xd4\xc9\xbd\xba\x07\x3c\x6c\x1c\xb2\x6c\x77\xf2\xbf\x09\x79\xbd\xb5\xd9\x02\x12\x23\xe4\x0f\xa4\x22\xb9\x5b\x34\x01\x13\xe2\xcb\x24\x78\xd0\xfa\x5f\x53\xcc\xe8\x04\xad\x2e\xa7\x0f\x89\xa6\xca\xd5\xc1\x52\x3e\xbd\x1a\x60\x0d\xc8\x57\x43\xc9\xb4\xae\x96\x64\x2d\x79\xb2\x89\x07\xb2\xef\x8d\x0b\xde\x5e\x85\xc8\xc5\x2f\x78\xfb\x1f\x12\xcd\x45\xde\xeb\x4b\xdb\xdd\x39\x61\x3c\xbf\x8f\x7c\xc1\x23\x3f\x02\x15\x90\x51\xd2\x99\xe5\x2c\x94\x0a\x60\x01\xea\xdb\x33\xff\x29\x44\x8a\xbe\xf9\xc6\xe0\x97\x4d\x72\x25\x0d\xd5\x4d\x80\x38\x82\x37\xc2\x1e\xa4\x1b\x31\x3d\x8f\xda\x10\xf4\x88\x32\x29\xc4\xba\x33\x21\x05\x81\x82\x12\x82\x64\xa0\xb0\x44\x1a\x94\x9e\x92\xb7\x85\xf2\xb9\xac\xfc\xe4\x92\x78\x00\x38\xa8\x39\x50\x3a\xb4\x59\x14\x43\xf5\x2c\xcf\xdc\x74\xde\xf7\x79\xe4\xba\xac\x00\x8f\x61\xbb\x88\xef\x16\xcd\xec\xae\x48\xce\xcd\x00\xb2\xe0\xfc\x81\xce\x05\x0f\x17\xcb\xe2\x58\xd1\xa6\xe5\x23\x54\x1a\x4a\x59\x57\x77\x03\xb6\x8d\x9c\x45\x49\x83\xde\x0f\xc7\x84\x12\x00\x3c\x99\x4a\x78\x07\xc9\x03\xd4\xdb\xdd\x8d\xf9\x06\xb7\x67\x8f\x79\x64\x4f\x56\x64\x7d\x9e\x84\xfe\x7b\xbd\xe0\x9f\x7a\x98\xa3\x16\xb3\x0e\xcd\x79\x1c\x9b\xec\x36\x75\xbc\x87\x84\x72\xbc\x5d\x9e\x17\x32\x79\x54\x48\x72\x6b\x58\x20\xf6\x11\x0a\xae\x78\xab\xfa\xfd\x78\x00\x19\x02\x71\xca\x59\x38\xc0\x99\xe0\xa1\xf5\x40\x83\x0e\xa7\xc4\xba\x75\xf0\x5f\xaa\x01\x47\x1b\x1a\x79\xad\xc1\x3c\x04\xa1\xfc\x4f\xd6\x82\x27\x6b\x0b\x55\x22\xc4\x5c\x0a\x3f\x35\x77\xdb\x3d\xc3\x22\xe4\xbb\x45\x13\xc6\x2c\x32\xf4\xe4\x2c\xe5\xd3\x74\x8a\x06\x80\xd4\x12\xd0\x83\x2a\x6a\x73\x68\x5a\x73\x69\xa9\x85\x80\xa3\x5e\x24\x56\xeb\xf1\xe0\x36\xf9\xe4\x49\x91\x36\xa3\x30\x98\x96\xa2\xd3\x8c\xc2\xcc\x7e\x7f\x5a\xc8\x31\xc9\x96\x23\x64\xc0\x03\xfd\x27\x1b\x89\xda\xb4\x9f\xf2\x15\xd8\xeb\xe5\xff\x5d\x06\xc0\x68\x66\x9a\x07\x3c\x87\xb6\xcf\xf2\x7e\xcc\x5a\x3c\x98\xa6\x2d\x96\xb4\x78\x9c\x51\xf3\x6e\xc3\x9f\x25\x25\x5a\x2e\xb9\x14\xef\xcd\x70\xd9\x41\xcd\x70\xc2\x57\xa5\x38\xda\x47\xa7\x47\x3c\xf2\xb7\x50\x50\x87\xe4\xb0\xd0\x72\xb8\xe4\xca\xa1\x92\xeb\x4b\x26\x83\x47\x5d\x19\x7c\xa7\x47\x6c\x35\xe0\x17\xe4\xe8\xd8\xb3\x81\x51\x57\x77\x97\x0f\xc0\xb9\xe7\xcd\xa5\x2c\xe8\x55\x0e\xbe\xa1\xaa\x5a\x04\xbd\xa4\xa4\x02\xa2\xa3\x6a\x7a\x1b\xe4\xad\xc4\xe8\x25\xff\xbe\x60\x16\xd0\x34\xd4\xff\x52\xa1\xc8\xfb\x28\xba\x43\xea\x34\xe3\xbc\xcc\x99\x4d\x1a\xab\xd1\x72\xd4\xe7\x61\x84\xc4\x08\xf2\xbf\xc3\xf2\x76\x97\x24\x7f\xa7\x43\x65\x33\xee\x43\xfc\xdf\xda\x19\xdc\x57\xb9\x66\xe9\xdf\x5c\x53\xac\x83\x28\x3b\x90\x2a\x08\x52\xa1\x4b\x3b\x90\x9e\x20\x1f\xa5\x5a\xbf\xba\x83\xfc\x1f\xfb\xfc\xfc\xd2\x96\xcf\xcf\x1f\x59\xe3\xfc\xac\xcf\x63\x20\x34\x4e\xf7\xc0\x25\xa1\x7b\x78\xf9\x8e\xd9\x2f\xe8\x63\xf6\xf3\x1e\x39\x34\x91\xa0\x81\x80\x3d\xe6\x29\x09\x6b\x19\x67\x95\x7d\xc2\x6e\xf2\x2e\x5b\x89\x44\x6a\x7d\xee\x65\x3f\x60\xbf\x7c\x05\x09\x46\x79\x7b\x8f\xcd\x3a\x95\x1a\x5f\xbe\x22\xf8\x79\xb7\x52\xe3\x2c\x0b\x45\x46\x8f\xc5\xa2\xb5\x4c\x67\x39\x00\x75\x40\xde\x3a\x2e\xa1\x98\x65\xb9\xc6\x83\x6c\x73\xd8\x24\x41\x97\xf6\x45\xd8\xa0\x67\x8f\xcd\x6e\xb5\x8c\xa2\x27\x92\x48\x7e\xf9\x05\x6f\x17\xa0\xe3\x3a\xc2\xfa\xf8\x7e\xf2\xb3\x1e\xd9\x59\x64\x3c\xf5\x1f\x0e\x7a\x60\xfa\x41\x6f\x21\x31\x02\x29\x34\x2c\x02\x05\x16\xf6\xa4\x46\x9a\x20\xb5\x5d\x75\xfa\x70\xda\xb4\xd2\xda\xdf\xd0\x15\xab\x53\xb9\x98\x2a\x32\x3e\x15\xe5\x0e\x47\x45\x99\xea\xff\x64\x2d\xb8\x50\xab\xa6\xfa\xab\x69\x57\xb5\x06\x30\x6e\x03\x51\xd0\x55\x86\xf5\x9d\xaa\x0c\x60\x31\xea\x4f\xd3\x13\x49\x56\xa4\xbc\xc4\x0f\xaa\x56\x04\xd8\x78\x59\x3f\x08\x45\x01\x6b\x85\x29\x14\x44\xa9\x1e\xcd\x37\xa4\x4d\xa7\x34\x20\x25\x38\xa5\x7e\x14\xbc\xa5\x9c\x3a\xb8\xa4\xe6\xee\xd2\xcf\xd4\x53\x1e\xd9\xb3\xcc\x07\xf2\x6f\xff\xd7\xbd\xe0\xdd\xde\x3d\xf8\x8f\x81\xa6\x62\x79\x57\x8e\xc1\x32\x1f\xd0\x54\x63\xce\x9c\x3d\x36\x7b\x2e\xab\xf0\x95\x40\x31\x72\x8b\xf7\xbb\x87\x55\x73\xaf\x44\x6f\x7f\x49\x6a\x62\xb5\x00\xfc\x77\x78\x01\x9f\xa9\xc4\x39\x8e\xf3\x7e\x97\xea\x3b\x2e\x5d\x0f\xc6\x42\x3f\xfe\x13\x20\x63\x11\xb1\x7f\x3e\x58\x2e\xa7\x4c\x5e\x19\x5e\x6d\x69\x73\xb2\x32\x92\x0d\x8e\xc9\x33\x76\xfd\xd4\x87\xbd\xe0\xfd\xde\x16\xab\xa2\x86\x2d\xcc\x4b\xd6\x6b\x1b\xb0\xc9\x29\x99\xfa\xee\xa6\x69\xfd\x3e\xee\x99\x4a\x2a\xc0\x4b\xb2\x40\xb9\xdc\x64\x35\x5d\x4a\xe5\x08\xf0\x9c\xb4\x2c\xc5\x4a\x04\x2c\x2a\x2b\x3c\x4d\xa3\x90\x03\x3f\x16\x4a\xb0\x35\x7b\x49\x14\x5f\xaa\x71\x20\x8f\x5c\xeb\x94\xed\x8e\xe7\xd7\x02\x22\x25\xff\x9b\xd7\x04\xff\xdd\x73\xb9\x95\x5c\xb2\x1a\x79\xb6\xc8\xab\x9c\x3f\x2a\xdc\x17\xc9\xde\xe1\x9e\xa2\xc3\x71\x08\x33\xa1\x93\xe0\x34\x64\x55\x0e\xd2\xa2\x92\x8e\x0d\x82\xaf\xfb\x5a\x95\x95\x2f\x4d\xba\xd8\x54\x86\xc2\xee\x64\x90\x7b\xb4\x61\xfb\x90\x80\xa0\x61\x2e\xe4\x00\x87\x85\x92\xbe\x76\x11\xc7\x1a\xb0\xc5\x74\xb4\x71\xc1\xdb\xaf\x8a\xdd\x17\x81\x51\x67\x9f\xf9\xc9\xd9\xdd\xfe\xf4\x4a\xf2\x67\x35\x62\xdf\xea\x7f\xb3\x16\x7c\xa5\x66\x5d\xb0\xd8\xde\x73\x8b\xbd\x5b\x97\xd2\xb7\x58\x9a\x46\x56\x3d\xab\xf3\x75\xc8\x7e\xa5\x6e\xd5\x60\xb5\x72\x7b\x29\xb9\xaf\x9a\xbc\x2c\x96\x94\x6d\x57\x61\x37\xa2\x5e\xaf\xc0\xda\x7a\xd6\xce\x79\x8a\x16\x1c\xe0\xeb\x48\xe5\x80\x28\x44\x60\x48\xeb\xd2\x7e\xe0\xc3\x61\x29\xb7\x0e\x2a\x66\x37\x9b\xa6\x3f\x46\xe7\xe6\x57\x6e\x84\xe0\xb1\x99\xed\x04\xae\x51\x55\xdc\xdf\xc0\x7b\x6e\x1e\x71\xcf\xcd\xf6\x3d\x27\xef\x9b\x3d\xed\xde\x43\x4f\x16\x71\x3c\xa0\xf7\x15\x2c\x46\x28\xde\x59\xd1\x63\x51\x02\x0c\x5b\x8e\x29\xbe\x1d\xba\xdc\x62\xe8\xf2\xdb\x1e\x29\x05\xda\xff\xaa\x17\x3c\x54\x2e\x51\xa7\x54\x49\x01\xbf\x58\xbf\xda\x12\xd8\xa0\x27\x58\xab\xab\xa5\x11\x42\x95\x90\x54\x0a\x2c\xf1\xe7\xa3\x5e\xd1\x93\x6d\x1c\x3d\x72\xe4\x88\xb5\xb2\xec\xad\xeb\x8d\xe4\x26\x72\xc3\x58\x25\x3b\x5e\x09\x4d\x08\xa5\xb9\x1d\xa1\xdd\x7c\x84\xb6\x6b\x1d\x30\xdf\xb2\xd5\xf3\xe5\xeb\xd6\x08\xcf\x92\x7f\xb3\x83\xec\x02\xc6\x37\xff\xd7\x77\x04\x1f\xad\x21\xf9\x9b\xab\x34\x0d\xae\x39\x66\x44\x28\x82\x38\x7e\xbe\x2f\x14\x8b\x23\xe4\x88\x98\x21\x1f\x25\xa4\x70\xb0\x19\xcb\x16\xf8\x80\x3c\x7b\x2b\x96\xc1\xcc\xce\x02\x36\x89\xb7\xda\xda\x4f\xb9\xc2\x22\x30\x49\x28\xf0\x98\x6a\x82\xe1\x7b\xa2\x32\x45\x45\x3b\x72\x22\x64\x31\xd4\x9a\xc1\x69\x3b\x60\x9a\xe3\x30\x98\x78\x49\xa9\xd7\xda\xab\xe9\x36\x72\xeb\x1a\x71\xe7\xb5\x29\x33\x27\x5b\x51\x17\xbd\xee\xfa\xc1\xd1\x13\xfe\xf1\xb5\x58\x34\xc6\x12\xd9\x38\x3b\x1f\x21\xbf\xb9\xdb\xf1\xb7\x58\xc9\x30\x2b\x26\x9e\xbc\x78\xef\x82\xff\x8b\xbb\x83\x53\xe5\xbf\x15\x57\x0b\xb0\xa3\xc3\xb8\xc7\x6c\xc0\x53\x0a\x10\xa2\x51\x3e\x18\xc1\xc8\x6f\x02\xce\xce\x06\xff\xb1\x5d\xe4\x33\x35\xb2\x0b\x80\xaa\xfc\x4f\xd6\x82\xbf\xf0\xee\x02\xcc\x2a\x80\x3e\x36\x72\x89\x38\x56\x6a\xaa\x0c\x1d\x61\x05\x92\xb4\x61\xd3\xb0\x6b\x11\xc5\xfc\x41\x29\x96\x06\x83\x07\x44\xf2\xb0\x8a\x8e\xaa\xa6\xf2\x38\x43\x9b\xb2\x12\xa5\x85\xc0\x56\x1c\xb6\xe4\xd2\x82\x23\xa6\x36\xa1\x75\xe8\xd6\x21\xec\xb7\xfc\xc0\x0a\x2b\x13\x75\x5e\x94\xe9\x8f\xaf\xcb\xf3\x64\xcc\xdb\xb9\x73\xa8\x1c\x7f\xda\x98\x50\x11\x7f\xa7\x46\x08\xda\xba\x72\x2f\xf7\xbf\x5e\x0b\xbe\x54\x5b\x30\xff\x8f\x62\x76\x50\x96\xb1\x8e\x10\x97\xb9\x57\x72\x50\x55\x4a\x96\x0b\x54\x7a\x52\x5b\x3c\xd0\x7d\x43\x8c\x00\xce\xeb\x58\xac\xc2\x83\xa9\x40\xaf\xa1\x41\xc9\x5c\x38\x3d\x67\x10\x83\x28\x8b\x45\x52\x32\x87\xea\x9f\xb0\x3a\x03\x48\x87\x13\x1c\x43\x40\x15\xc9\x34\x82\x2c\xa7\x81\x14\x89\x80\x76\x39\x0b\xe5\xc8\x42\x3f\x2c\x7a\x59\x35\xb4\x67\x8b\x58\x05\x20\xcb\x96\xd5\x24\xc3\x64\xa9\x2f\x84\xb8\x75\xa2\xcc\x03\x3d\x1a\xf2\x05\xba\x7d\xfb\x21\xf5\x3d\x8e\x71\xf4\xd1\xbd\x8e\x13\x09\x38\x60\x56\x8e\x36\xce\x8a\x98\x1f\x8b\x00\x6f\x0a\xb2\x95\xff\xf9\xde\xe0\x70\xe5\xda\xa8\x2c\x3d\xeb\x96\x6c\x64\x5e\xf2\xf3\xdb\x65\xc9\x5b\x36\xc7\x3a\x3a\x11\xf5\x1f\x07\xaf\x1f\x81\x16\x63\xcf\x81\xbd\x14\x8f\x90\x06\xa9\x8f\xd5\xf7\x23\x26\x7e\xdb\x20\xda\x82\x41\xd4\xb6\x0c\xa2\x7f\xb4\xb5\xfc\xf1\xb5\xcc\xa1\x8b\x5e\xb2\xfe\x16\x7b\x8f\x3f\xb7\x01\x92\xa7\xca\x32\xaf\xd6\x17\xbf\x78\x05\xb9\x7e\x32\xc0\x3c\xf0\x52\xcf\xf2\x9c\x45\x71\xe6\x7f\xf4\x8a\xe0\x3b\x35\xe7\x92\x83\x7d\xca\xc2\x30\x52\x2a\x58\xa5\x0d\x45\xda\x8a\x3a\x35\xf3\x20\x64\x1a\xf0\xbc\x52\xea\x84\x27\xf3\x15\x80\xf5\x2d\x1f\x1f\xae\x09\x63\x34\x55\xc0\x23\xb8\xa7\x2a\x12\x08\xc3\x71\xcf\xa8\xca\x2f\x53\x62\xaa\x35\x10\x24\x5a\xb0\x1c\x85\x82\x97\x21\xe0\x0c\x20\x85\x14\x1e\x1e\x6c\xc6\x51\x27\x01\x54\x4f\x40\x98\xc0\x5e\x87\x02\x42\xa2\xe5\x36\xad\x2d\x3c\x7d\xa2\x07\x1b\xd4\xb4\xae\x52\x08\x50\x63\xb1\x2c\x33\x5e\x65\xa0\x19\xd2\x77\x69\xe7\x86\xb6\x38\x13\xa0\x26\x00\x6e\xe1\x02\x10\x8e\xd4\x4b\x5c\xa3\xe4\x13\xfb\xc8\x2f\xea\x95\xfc\xce\x5a\xf0\x7d\xe0\x5a\x96\xff\x59\x0d\x1b\xde\x77\xb5\x6c\xab\x06\x4f\xae\xf8\x75\x8b\x4c\x0d\xd6\x59\x15\x2f\x3f\x93\x20\x07\x89\x72\x56\x8b\x04\x97\x74\x18\x41\xbe\xb3\x59\xce\x25\x45\x92\x79\x85\xd4\x27\xaf\xd6\xea\x7c\x9f\xe6\xbd\x07\x9c\x41\x43\x25\xbe\xe5\xf1\x00\xa0\xca\x44\x19\xfe\x91\xc5\xc3\x0c\xcd\x2b\x24\x45\x4c\x36\xd7\x96\x67\xe8\x62\x5a\xbe\xaf\x46\xae\x4d\x79\x9e\x0e\x66\xda\x39\x4f\x75\xfe\xc3\x3b\x6a\x3a\x56\xfb\x5d\x6f\xae\x6d\xd3\x50\x81\xb9\x17\xf5\x9c\x24\x08\x85\xa4\x05\xd9\x25\x7a\x5a\xb4\x6c\x35\xe5\x47\xe5\x29\x38\xff\x17\x0c\x79\x8c\xd6\xc3\x78\xc4\xb0\x75\x2e\xc8\x77\x0e\xd9\x73\x09\x65\x31\xec\x90\xb9\xe1\x31\x99\x52\x96\xa3\xc8\x4c\x43\xb9\x8b\x7a\x63\xda\xec\x8a\x55\x60\x25\x97\xcb\x76\x95\x45\x06\xef\x2b\x67\xcb\x86\xad\xa6\xd2\xbc\x1b\x37\xfe\xd7\x1e\xd9\x51\x44\xa1\xff\xab\x5e\xf0\x88\x77\x6e\x6e\xb6\x3a\x47\x8d\xb1\x83\x6f\x66\x71\xdc\x04\x54\xa5\x70\x74\x14\xa4\xc8\x78\x3a\xd5\x29\xa2\x90\x1f\xd6\x90\xb6\x3c\xcd\xde\x50\x44\xae\x6c\x7d\xd3\x23\xbb\x31\x61\xca\xff\x03\x2f\xf8\x39\x90\xae\xe3\x98\x40\x05\x3b\x71\x59\x4b\xdb\x43\x3a\x6a\xd4\x86\xa3\x24\xcc\x11\xad\x36\x8b\xe2\x22\x45\x4c\x48\x60\xa5\xb2\x7f\xc5\x09\xd4\xea\x10\xdb\xe4\xa1\x4a\xdc\x72\x2c\xf2\x63\xe4\xcd\xe4\xce\x4d\x6c\x47\xf8\x36\xf8\x10\xd2\xd4\xa4\x23\x0f\x06\xf7\x2e\x1a\xd6\x8e\xad\x6b\x13\x7b\x18\x7f\xfe\x6a\xa7\x74\x84\xf5\xfb\x88\x7b\x62\x0e\x25\x67\xf9\x4a\x04\x16\xe4\x37\xae\x0a\x3e\xbe\x6b\xf8\x7a\xe9\x38\x46\xe6\x24\xe3\xd9\xcc\x12\xd6\xcf\xba\x02\xf6\x1d\xcc\x21\xc6\xc4\x6f\xad\xd2\x11\x7e\x08\x76\x8c\x48\xa3\x8c\xea\xb4\x39\x4d\x86\x13\x72\xfb\x4a\x99\xc7\x95\x39\xdc\x72\x14\x31\x52\xad\x8c\x36\x38\xd8\x9d\x49\xe4\x98\xd0\x11\x5d\xee\x02\x22\x3a\x4f\xac\x5c\xa0\x78\xa0\xc3\xe8\xe0\x06\xb0\xc0\x93\x8c\xbd\xb3\xa8\x58\x0a\xd0\xa6\x52\xf1\x12\x16\xc5\x9a\xb9\x46\x9b\xc8\xc0\x64\x66\x23\x31\x29\xb4\x0f\x88\x58\x16\xb9\x5e\xf9\xb3\x2c\x57\x99\xb2\x8d\x11\x7d\x04\x49\xab\xcb\xe5\xcc\x01\x8c\xb5\xa9\x18\xd5\x65\x47\x0c\x5a\x69\x9d\x86\x05\xe0\xa1\x29\x68\x4a\xb9\x73\x03\x18\x24\xb6\xcf\x7b\x22\x59\xe0\x2a\x48\x2c\xdf\xdb\x2e\x62\xf9\xbf\x55\xfb\x04\xa3\x8e\x5f\x88\xd9\x2e\x22\x8e\x9b\xac\xb5\x5c\x77\x2c\xca\x08\x01\xe4\x1b\xf4\x2e\xdd\x9d\x28\xd7\x9b\xa4\x66\x2e\xcc\x85\x52\xee\x98\x33\x63\x9f\x1b\x5a\x5d\x96\x74\xf0\x78\xdd\x2e\x14\x5c\x30\x54\xc6\x28\x3e\x42\x0d\x7a\xab\x74\xa7\x1c\x77\x84\xe1\x95\x87\x41\x40\x72\xcc\x59\x33\x8a\x81\xf2\x05\x59\xb5\x90\x60\x21\x8a\x07\xd0\x7f\x33\xf1\x6a\x08\xdc\xb2\xcd\xbd\xa9\x1a\x52\x67\xb7\xfe\xf8\x76\xe5\xe6\x76\xa9\x48\x25\x87\xa5\x49\x8c\xac\xf8\xf7\xeb\x4c\xc8\x99\x52\xd1\x59\x6e\x47\x29\x18\xea\xb2\xf6\x8d\xc0\xc2\x36\x32\x80\x8e\x06\xb9\xc6\xdd\xed\x75\xfb\x58\xbe\xc5\x63\xf9\x80\xec\x04\xa1\x7b\xfb\x78\xec\xa0\xf5\x2b\x1f\x82\x1b\x40\xfb\x2a\x17\x97\x95\xac\x3d\x3c\xb4\x66\x6e\x1b\x1b\x2e\x42\x71\x78\xfa\x87\x55\x7c\xf5\xc8\xf7\x8d\xdd\x84\x8e\xc2\x87\xd5\xd8\xac\xf3\x22\xcd\xfd\x4f\xed\x0e\xee\x74\xae\xb8\x21\x5e\xdb\x17\x8f\x3e\x32\x65\x9c\x95\x08\xaf\x17\xbc\x2b\x5b\x76\x03\x8e\x5a\xfc\xfa\x2e\x32\x43\x76\x77\x45\x96\xcf\xcd\xfb\x6f\x0c\x7e\xec\x81\xae\x22\x04\x50\x08\xe4\xcd\x48\x41\xef\x9a\x34\x76\x78\x53\x2e\x1c\xa3\xe2\x45\x8f\xec\x95\x0f\x41\x8f\xbf\xe6\x69\xa3\xfa\x39\xef\xb4\xc9\x7e\x54\x8f\xa9\x70\x81\x06\x5b\x97\x0f\x81\xaf\xcf\x31\xbd\xa3\xcc\x44\x55\x19\x6e\xb6\xf8\x38\xe6\x52\xd6\xe9\x11\x7a\x3b\x3d\x4f\x6f\xa7\x37\xdf\x74\xd3\x0d\x37\xc3\xe3\x77\x89\x2c\x3f\xad\x86\xa2\x64\x39\x70\x5b\xc3\x33\xa3\x33\x96\x52\xa2\xb3\xbc\x1c\xab\x4c\x9f\x2f\xb1\xac\xa4\x1b\x55\x32\x90\x7f\x47\x9f\x6f\x9e\xf5\x82\x8f\x0d\x9d\x18\xec\x6e\x27\x74\x6e\xe6\xf4\xcc\xdb\x16\xee\x3f\xfe\xb6\xd3\x33\xa7\x4e\xc0\xea\x52\xb1\x0e\x1b\x54\x59\x84\x2a\xd4\x20\x5b\x0d\xad\x59\xec\x8b\x70\x7c\x9c\x04\xdc\xb5\xda\xb7\x8c\x03\xab\x01\x20\xe1\x1c\x62\x65\x28\x0d\x4c\xa9\xad\x33\x61\x0f\x92\xbd\xfd\x54\xe4\xa2\x25\x62\xff\x54\xf0\xe6\x79\xf5\x37\xe2\xa7\xe3\xc0\xa8\x2f\x39\x37\x3b\x5f\xa7\x8b\xc7\xe7\xe1\x34\xbc\x70\x7c\x71\xde\xf5\x7d\x07\x8b\xc7\xe7\x03\xd7\xc0\xf4\x88\x2b\x6f\xfe\xaa\x96\x87\xe6\x7a\xe2\xd0\x17\xe1\x81\x4c\x4a\x1e\xd3\x11\xea\xc5\x0d\x0a\x83\x33\x5d\x4f\x12\x72\xd4\x5a\x60\x9a\x08\x5a\x47\x5e\x8e\x2f\xcc\x2d\xe0\xa5\xe3\xac\xcf\x5a\x51\x3e\x00\x9f\xec\xf7\xf6\x05\x27\x46\xff\x34\xca\x35\x3b\x7c\xe7\xda\x00\x92\x1f\xda\xbb\xbd\x25\x6c\x75\x4b\xf8\x03\x83\x19\xf0\x45\x2f\x38\x62\x7c\xb5\x76\x8c\x72\x8d\x69\xb1\x4f\x6d\x6f\x22\x6b\xe0\x11\x4e\x20\x30\x17\xbd\x03\xe4\xba\xe1\xc8\x4b\x8f\xf5\xa7\x96\xf9\x20\xf3\xf7\xf9\x7b\xa6\x60\xd1\x92\x8b\x1e\x1d\x1b\xa3\xd9\xed\xef\xec\xb1\xfe\x76\xa4\x7c\x2b\x06\xea\xef\xda\x06\xea\xb3\x5b\x84\x16\xf9\x99\xd1\xc8\x22\x97\xcb\x30\xbd\xe8\x89\xf5\x0d\x8f\x7b\xfd\xbb\xd7\xa3\xb8\x1f\xad\xc5\x46\x16\xc4\x3e\x7d\x35\xf9\xf1\x0d\xf8\x2b\xfc\xff\x77\x55\x70\xbc\x2c\x1f\x66\x34\xe5\x79\x91\xaa\x1a\x56\xd8\x45\x5a\x0c\xeb\x5e\xc0\x67\x9b\x1c\xc8\xf5\x1d\x8a\x01\xc0\xac\x45\x4b\x35\xbe\x70\x25\x39\x47\xf6\xf4\x78\x96\xb1\x0e\xf7\xef\x0e\xee\x98\xa1\xdd\xa2\xc7\x92\xa9\x94\xb3\x10\x5c\x0c\xe8\x5b\xea\x57\x4d\xb5\xa2\xe4\x32\x31\x8e\xb9\xc6\x0f\x37\xee\xcc\xb7\x3d\xc3\xbf\xfc\x87\x5e\xf0\x45\x6f\xc6\xf0\x5d\x8d\x1b\xac\xd5\xee\xa0\x32\x44\x90\x98\x86\x1b\x6f\x70\x12\xbd\x60\x81\x1a\x4f\x15\x7f\x8d\x32\x35\xa3\x3a\x1d\xa3\xf4\x02\x26\xc2\x0d\x09\xac\xb0\x28\x96\xaf\x6d\xd0\x19\x1d\x09\x68\xc5\x2c\xc5\xec\x11\x96\xd0\xbb\x16\x17\xe7\xf5\x64\x41\x69\x65\xb3\xb0\x4a\x9c\x74\x8a\x25\x8d\x5c\x7a\x98\xcf\x94\xc5\xee\xbf\xe9\x05\x1f\xd6\x15\xeb\x9a\x5c\xd5\x4c\x36\x3d\x93\x70\x2a\xda\xd3\x34\x58\x40\x0f\x0f\xa2\x79\xeb\xaf\xba\xdc\x35\x04\xdb\x69\x72\x97\x70\xb7\xbf\x9f\xec\x94\x02\xe3\x9f\xd6\x66\xe4\xad\x0b\x45\xa7\x83\x51\x0f\x90\x2a\xa5\x59\xb0\x60\x57\xf3\xab\xe2\x44\x48\xf3\x30\x6a\x83\x88\x0d\xb1\x83\x3c\x5d\x23\x7b\x94\x97\xd8\x7f\xac\x46\xde\xbc\x69\xe7\xad\x0a\xbc\x05\xff\xcd\x83\xf3\x66\xa8\x6b\x80\x47\xb9\x67\x4d\x3d\x24\x58\xfd\x8a\x69\x1d\x22\x3b\x20\x07\xe0\xfd\x12\xab\x58\x79\x8f\x2d\x61\xe3\xd5\x84\x52\x93\x59\xa1\xa9\x51\xe0\x8d\x38\x12\x48\x94\x2e\xbf\xb9\x53\xb0\x94\x25\x39\x37\x34\x10\x00\x79\x99\x0b\x08\x7f\x29\x19\x53\xc4\xc2\xa8\xa9\x4b\x44\x9f\xb2\xb3\x98\xd0\xba\x6d\x9c\x6c\x05\x5b\xf5\xf4\xfa\xfb\xf9\x8f\xfb\x87\xa6\x2c\x8c\x27\xbd\x87\xa3\x88\x55\x5d\x07\xbf\x7a\x05\x99\x5a\x87\x76\xe1\x64\x2c\x56\x11\x6b\x02\x0a\xe2\xbe\xbb\x3f\xf8\x09\xf7\xd2\x88\x7a\xe4\xf2\x86\x03\x25\x55\x20\xea\x9c\x58\x88\xe5\x0c\x0a\x93\x1b\x17\xbc\xeb\x34\x25\xf7\xbd\x72\x64\x1c\x66\x07\x67\x47\xff\x3e\x21\x7f\x59\x23\xbb\x00\x64\xca\xff\x5f\xb5\xe0\x25\x6f\x09\xfe\x5e\xb2\xde\x8d\xc1\x23\x33\x8b\xe0\x65\xd7\xe1\x5d\x28\xa2\x15\xab\x4a\x54\xd5\x1a\x28\x3b\x69\x68\xc9\x58\x89\xc2\xd9\x86\x15\xa1\x79\x20\x34\x41\x3a\x15\x09\xa7\x3d\xae\x4f\x9f\x88\x7a\x65\x93\x9a\xa9\xe7\x1b\xaa\xa8\x39\x82\x3d\x0b\xb7\x3c\xc8\x02\xac\xab\x9d\x4f\x07\xab\x13\x61\xe3\x71\xe7\xad\xae\x16\xf8\xb2\x77\xce\x41\xe3\x2e\x72\x92\xcc\x6e\x88\x36\x03\x2b\x74\xcf\xca\x9e\x3e\x10\xe5\x5d\x05\x98\x98\x4d\x98\xeb\xf5\x44\x8d\xbc\x26\x8c\x00\x02\xab\x88\xb2\x2e\x4f\x4f\xf1\xbc\x2b\x42\xff\x97\x6a\x1b\xec\x86\xfc\x9e\xd9\xe1\x86\x82\xdf\xf6\x96\x46\xb4\xbf\x54\xe5\x20\xb1\x19\x83\x61\x2a\x9d\x87\x30\x7d\xca\x89\x9d\x58\x53\xaf\x67\x7d\x29\x89\xe2\x25\x27\x17\x55\x95\x7c\xb9\x6d\x45\x99\xe6\x21\x0f\x95\x56\x2c\x94\x38\xb1\x78\x95\x0d\x32\x9d\xa4\xaf\x66\x15\x56\x66\x83\x3c\xb2\x83\xf8\x7a\x02\xe7\x53\xde\xe2\x21\x4f\x5a\xdc\x7f\xd9\x44\x86\xbf\x55\x5b\x1a\xfe\x7d\xc9\x06\x4e\x69\x75\x85\xc8\x38\x65\x3d\x31\x24\x03\xce\x47\xe9\xc2\x0a\x23\x6b\x40\xb5\xdd\x15\x19\x4f\x6c\xa1\x96\xb2\xa7\x9a\x92\xcd\x9a\xad\x23\x29\x7a\x3c\x45\xa2\x63\xc3\x19\xad\xc0\x17\x38\x86\x92\xb1\x24\x2d\x16\x1d\x75\x97\x22\x99\x3e\x44\x4f\x0d\x7d\x80\xde\x81\x86\x7f\x51\x9a\x5c\xfb\x5c\x52\x96\x74\x30\x03\xf2\x27\x8f\xd6\x8f\x1e\x39\x72\xe4\xc8\x5b\x6d\xfa\xbc\x08\x2d\xb1\x7e\xf9\xb8\xda\x7a\x2c\xcf\x58\x94\xdb\x39\x1e\x50\xba\x0c\x0c\x68\x06\xdb\xd7\xdd\x97\x3f\x5b\x23\x6b\xe8\x17\xff\x43\x35\x32\xbf\xb1\x85\x34\xb6\xad\xb2\x58\xe8\xf7\xbc\xa5\xf1\xaf\x5c\xd2\xa6\x55\xc9\xea\xce\xe8\xf8\x56\x2b\xc4\xb5\x26\x95\xb1\x7c\xba\x65\x76\x29\xb9\x33\xc6\x2b\x3a\xe1\xc0\x12\x02\x3d\x60\x98\x02\x13\x2a\xe3\x2c\x5d\x46\x88\x04\x95\xa1\x22\xdf\xa4\xc2\x65\x60\xb3\x1b\x4a\x17\xf2\xde\xdd\x0e\x5b\x81\x93\xb6\xeb\x60\x41\x2d\xde\xbb\xe0\xff\xc9\xae\x57\x32\x77\xf7\x17\x76\x91\x0b\x26\x77\xf7\xd1\xed\xdc\xdd\x6a\xa5\xe0\x76\x56\xee\xe5\xcb\xca\xfd\xf4\x7e\xf2\xf7\x46\x44\x5c\xe6\x45\x38\xd3\x06\x7d\x32\xf0\xff\xe5\xfe\xe0\x4d\xf3\x22\xa4\x4c\x5d\x40\x23\x17\x33\x31\x44\x1b\x0f\x4d\xe0\x9d\x37\x37\x28\x78\x03\x39\x76\x60\x57\xb8\xe2\xff\x45\x42\x5e\xda\x45\x0e\x1b\x42\xe6\xd9\x42\xf6\x64\xc1\x3c\x33\x87\x0b\x1c\x2f\x9f\xd0\x38\x1b\xfe\x6f\xed\x0a\x5e\xda\x69\x83\x27\xa8\xfc\x03\x6c\x07\x00\x44\x34\xaa\x42\x5f\x20\xb5\x79\x22\x42\xbd\x39\x66\x2c\x8f\x32\xc5\xdb\x66\xfa\xc9\xcf\x4b\x83\x5b\x51\xe2\x6b\xc9\x34\x15\x6f\x30\x35\x08\x38\xa4\x62\xfd\x7a\x5b\xd3\x0c\xc6\x2c\xa7\x2b\x91\x80\xc3\x23\x98\x53\x1a\xde\x52\x97\x17\x96\xcd\x2b\x94\x22\xf3\x58\x94\xd1\x9e\x9c\x25\x33\x08\x5a\xaa\x65\x33\x46\x54\x3a\x90\x8e\x21\x57\x20\x96\x57\xac\xf2\xa8\xd3\xcd\xe5\x82\x6a\xf0\x06\x4c\x29\xe4\xf6\x95\xcd\xf6\x38\xcf\x01\x74\xdd\x2c\x0c\x6b\x26\x50\x15\x62\x9a\xca\x41\x73\x00\x51\x5b\x6f\x5d\xff\x3e\x34\x1d\x23\x87\xab\x0e\x28\xa2\x87\xea\xc6\x9a\x61\xd0\xc7\xe6\x80\x46\xb9\xae\x25\xd7\x0c\xcf\x30\x14\x3a\x3f\x46\x9f\xdf\x51\xee\xa5\xe8\xb2\x10\xb8\x86\x03\xfc\xb8\x40\xab\x20\xd9\x9c\xda\x4a\xe1\xfb\xba\x2c\xc3\x79\x55\xb5\x93\x96\xa5\x0a\x40\x49\x59\x5f\x20\x69\x71\xbf\x14\xdd\x45\x9e\xf6\x6e\x33\x4d\x1c\xcc\x0e\x95\x43\xab\x0c\x01\x78\x0d\x53\x29\x6c\xee\x8c\x38\x1a\xea\x76\x32\x4d\x6e\x59\xb7\xea\xf6\x01\xf8\x04\x1e\xce\xbb\x5d\x20\x7f\xb8\x93\x34\xc6\x0d\xef\x18\x69\x7f\x62\x67\xf0\xad\x1d\x4a\xb7\x98\x09\x70\xa6\x70\x8c\xc0\x1a\x46\xd2\x1e\xcf\xa5\xb1\x6f\x49\x40\x1e\xf5\x94\x4e\x91\xab\x15\x16\x8f\xda\x74\x4b\xa8\x22\xa1\xd1\xa7\x90\x64\x7d\x53\x3d\x68\x01\xe4\x2b\x9a\x5e\xba\x17\xa2\xc7\x91\xac\x91\x86\xf0\xa5\xd0\x85\x12\xe8\x49\x51\x7e\x63\x2a\x0f\xc6\xfa\xa0\x56\x56\x1d\x5a\x0f\x61\xb7\x15\x98\x81\x5c\x8a\x72\xa9\xb1\x01\xf4\x3f\x4f\x01\x0a\x88\xcb\x53\x27\xa2\x41\xf1\x95\x48\xf1\xa7\xca\x86\xe0\xcc\x2c\x8d\x02\xfc\xa4\x07\xca\xd4\x3d\x39\x54\xa6\x7c\x57\x8b\x68\xdd\x44\x4d\x40\x5a\x51\x87\xb8\x22\x26\xdf\x86\xb5\x5b\xce\x3c\x43\x7b\xa0\x0e\x33\xa8\xf8\x55\xeb\x54\x2e\x47\xa9\xaf\xcb\xa8\x1d\x2a\xa3\xea\x2e\x78\x23\xb9\x7e\x02\x32\xcc\xaa\x6c\x7d\x6c\x0f\xb9\x6e\x44\x76\xbd\x3a\x1c\xf9\x8f\xee\x09\x7e\xc7\x53\xff\xe8\xa8\x2e\x9e\x0e\xb5\xe9\xa5\xe6\x5b\xf9\x20\x44\x8a\x00\x18\x98\x77\x08\xb9\xd1\x8c\xa6\x22\xe6\x10\xf7\x06\x75\xd0\xef\xc7\x70\xe6\x10\x0d\x5a\xb2\x5d\xf3\x08\xbc\xd8\x80\x98\xc8\x68\x08\x8c\xb9\x90\x2a\x66\x7c\x1b\xea\x7d\x75\x84\x78\x2c\xdd\xe2\x89\x48\xa6\x74\x4a\x5b\x56\xc8\x43\x81\xc2\xe0\x90\xca\x01\x77\x19\x60\xca\x68\x5c\xf0\xc0\xdb\x72\xc1\x83\x80\xb3\xb3\xa5\x7c\x64\x17\xb9\x55\xc5\xa1\x8f\x06\xff\xe0\xb4\x65\x19\xa8\xd7\x23\x43\x87\xe9\x84\x43\xf1\x47\x3e\xe7\x91\x7d\x86\x8c\x03\xbd\xaa\xa7\x0d\x37\x87\xa8\x98\xaa\xa1\xf1\x32\xea\xc5\xa1\x5e\xb1\xac\xfc\x3f\x00\x53\xa4\x1f\xaf\x9b\x4f\x0a\xce\x65\x3c\x45\x1f\x2c\x50\xf8\x06\x9a\xc3\xd7\xf6\x28\x4b\x71\x36\x5e\x65\x3a\xa3\x92\xe7\xa5\x8d\xa9\xcd\x6d\xb0\x60\xe4\x78\xa7\xa9\x48\xab\x5f\xb1\x97\xf5\x23\x68\xdc\xff\xa4\x17\x3c\xe9\xcd\xcc\xcf\xc1\x7f\x16\x9f\xa4\x9c\x11\xb3\x73\x57\xbe\x4b\xa5\xb1\x55\xa2\xd9\x01\x4c\xd2\x02\x86\xcc\x67\x5a\x80\x4a\xa6\x6f\xad\x20\x20\x04\x63\x53\xfe\xb1\x91\x73\x7a\x56\xb1\x57\xa6\x91\x4a\x4e\x2b\xfa\xd4\x5e\xf0\x82\xff\xe2\x81\x4f\x4d\xb4\xc7\xce\x22\x22\x44\x65\xae\x97\x2e\xca\xac\xcf\x94\x4b\x12\x87\xbe\xee\x0e\x7c\xe0\x7e\x52\x60\x74\x9d\x35\xea\xc6\x19\x6f\xf9\x7d\x73\x9d\xd2\xae\x7c\xc4\x1b\x9f\xa8\xa7\xf6\x91\x43\x13\xe5\x9b\x42\xec\xfd\xaf\xf6\x06\xe7\x46\xff\xa4\xc3\x4c\x6a\x23\xb7\x08\x6f\x2d\x4a\xc7\xe1\xcc\xcf\x35\x63\xf1\x4f\xef\xd9\xf6\xce\x6f\xd5\x3b\xbf\xaa\x43\xf1\x49\x70\x70\x74\x24\x7e\x38\xd5\x75\xf2\xe2\xf3\xf1\xe2\xb2\xed\x8f\xde\x42\xb0\xfc\x13\x76\x3c\xf4\x89\x2d\xc6\x43\x3b\x97\x2d\x2a\xbe\xb4\xbe\x17\xfd\x0e\xff\xb6\x49\xd3\xf1\x46\x55\x61\xfd\xb3\xfd\xe4\x86\x11\x66\xc8\xcc\x03\x0b\x27\x62\x96\xe5\x51\x0b\xd0\xbd\x16\x72\x91\x72\x07\x0c\xec\x79\x12\x7c\xb0\xe6\xa0\x68\x94\xfc\xee\x74\x36\xca\x96\x1d\xe2\xf6\x99\x07\x16\x1a\x84\xcc\xc0\x1f\xf4\xc4\xb1\x05\x1a\xca\x3b\x36\xc8\xd9\x5e\x3e\x33\x8a\xb1\x5d\xb6\xfc\xb0\x3c\x5e\x55\x39\xdb\xab\x6f\x95\xe6\x0c\x78\xcb\x9b\xea\x7d\xe8\x61\x2a\xd9\xd4\xa9\x00\x77\xa1\x7e\xe8\x95\x20\x7b\x7f\x74\x2f\xf9\x7c\x09\x0c\xf6\xa9\x5a\xf0\xd4\x36\x30\xd8\x68\x60\x30\xb6\x9a\x71\x14\xc4\xa6\x14\x44\x40\xa6\xb5\x17\xf6\x93\x35\xb2\xaf\xcf\xd2\x1c\x16\xb2\x7f\xc1\x38\xb1\xdf\x59\x5b\x04\xcc\x2e\xf5\x8b\x16\x95\x75\x86\x73\xae\x4d\x45\x2f\xca\x73\xed\x9f\x0c\x4b\xd4\x23\x7d\x93\x1c\x40\xd5\x0a\xe6\x26\x96\x43\x76\x52\xa4\xfa\x27\xb9\xda\x0f\x67\x21\x3b\x5a\x87\xd7\xe0\x78\xe0\xc8\x97\x7d\x92\x66\xe3\xd1\xa0\x41\x17\xa2\x5e\x14\xb3\x34\x1e\xd4\xed\x3e\x96\xf7\x49\xe3\x4a\x37\x08\xf4\xdd\x47\x02\x7a\x50\x00\xf2\x37\x48\x73\xcc\xd9\x0a\x57\x5e\x69\x44\x4a\x47\x2b\xf3\x90\xeb\x66\xfe\xb6\x0d\x8f\xf5\x82\x17\xfc\x67\x85\x4c\x38\xa0\x41\x9e\x16\x1c\x8e\xe6\x88\x8e\x05\x25\x84\x1c\x85\xc9\xa0\x64\x99\xb6\x2b\x30\x59\x60\x1a\x42\x03\x6b\x8e\x5f\x00\x00\x5a\xa3\x13\x13\xb6\x2e\x10\x16\x9c\xd6\x33\x36\xcb\xff\x87\xbd\xe0\x03\xde\x39\x4c\x25\x2d\x2b\xbd\xfa\xa5\xaa\x0a\x47\xa8\x2a\x7a\x70\xa6\xc7\x1e\x16\x89\xb5\xfc\x87\x4b\xbb\x2e\xb5\x20\xff\x59\x8d\xfc\xfd\x51\xb9\xd1\xb0\xd7\xce\xcd\xa3\xc3\xdd\xff\xdd\x5a\x70\x9f\x7b\xc9\xce\x8e\xce\xab\x94\xf2\x70\xc4\xc5\xfb\xe9\xdc\xbc\xf2\x74\x66\xe8\xe4\x31\xa7\x7e\xd7\x7d\xf7\x3f\x3d\xf2\xa2\x47\xae\xca\xa3\x1e\x17\x45\xae\xeb\x06\xbf\x62\x52\x9c\xff\xa3\xe7\xfe\x54\x81\x4c\xd1\xa5\x83\xe6\xbd\x73\xf3\xa8\x84\xf4\x5b\xe5\x08\x2c\x0f\xc0\x59\x61\x79\xb7\xcd\xd9\xf9\xce\x23\xf4\x47\x7f\x94\xde\x7e\xc7\x2d\x37\xdf\x78\xe4\xc8\x41\x29\xf9\x47\x69\xc8\x06\x87\xa4\x5e\xd1\x26\xbd\xf6\x56\xdc\x71\x07\x0d\xf4\x4b\x82\x12\xa2\xcc\x1c\xb7\x8e\x1e\xb9\x45\xb5\x71\x03\xed\x8a\x22\xcd\x2a\x0b\xe2\x7b\xf5\x09\x2b\x90\x67\xa1\x2e\x09\xf1\xa2\x33\xff\x3f\xd4\x83\x69\xe7\x8a\x2e\x14\x32\xf8\x69\x50\x3e\x08\xc5\x4c\x58\xe6\x65\x9d\x94\xdd\xc1\x7e\x97\xbf\x6d\x8f\x6f\xd5\x1e\x7f\xac\x46\x76\x87\xe9\xe0\x6c\x91\xf8\xbf\x5c\x0b\x5e\xf6\x10\x53\x07\xc7\xa3\x5e\x45\xd2\xe9\x89\xd0\x44\xf8\x9d\x72\xac\x66\xa9\x15\x90\xd2\x49\x47\x9c\xa0\x24\xda\xfa\x54\x7c\x95\x72\x81\x44\x2b\x2a\x40\x9e\xf2\x0c\xf4\x5c\x62\xce\x84\xa6\x56\x1c\x06\x2e\x11\xb4\x5d\xa4\xe0\x43\xe9\xa7\xa2\x25\xd7\x42\xd2\x29\x0f\xe9\x2a\x3c\x3a\x0a\x60\x7a\x26\x8e\x01\x52\x5a\xbe\x18\x20\x9f\xb3\x9c\x75\xac\x22\x72\xd5\x1c\x0f\xd7\x88\xb8\x7c\xa3\x46\xfc\x4e\xca\x5a\x7c\x9e\xa7\x91\x08\xf5\xa2\xfe\x42\x4d\x97\x00\x7d\x1c\x76\xcb\xd0\x8a\xe7\x8d\x2a\x01\x56\xa4\x0b\xa6\xfe\xd7\x94\xeb\x4d\x02\xe4\x5c\x2e\xf5\x87\x79\x2a\xac\x79\xc1\x56\x68\xd4\xeb\xf1\x30\x62\x39\x8f\x07\x23\x72\xf1\x92\x28\x76\x77\x14\xf8\x1c\x39\x65\x91\x08\x4d\xe4\xaa\xf4\x58\x82\xca\xd1\x43\x54\x64\xb2\x93\xb6\x2b\x83\xc9\x27\xf5\x07\xa9\x97\xb4\xdd\x28\x6e\x03\xfb\xd9\xe3\x2c\x19\xd9\x47\x47\x93\x6c\x1f\xcd\x36\x7f\x34\xfb\x7c\x8d\x5c\x23\xd2\x7e\x97\x25\xb3\x50\x12\x29\xbf\x5a\xaa\xc1\xc7\x6a\xb3\x86\x96\x6c\x9a\xf6\x91\x68\x0c\x89\x58\x38\x9d\x4f\x45\x9f\x75\x40\x5a\x31\x6d\xa4\x6e\x7b\xa8\xf5\xc4\x5b\xbc\x66\x51\x42\x8f\x36\xde\xd8\xa0\x0b\x28\xbd\x28\x4a\xea\x75\xa6\xe4\xb6\xc9\x29\xf6\x04\xc6\xa6\x0d\x6c\x34\x87\xc1\x6e\x41\xe1\x0b\xf0\xd7\x80\xb6\xa3\x04\xca\xa9\x52\xf3\x2a\x16\x86\x60\x09\x1f\x4e\x79\x4f\xac\x94\x50\xd5\xbc\x2c\xf7\x33\x0f\x61\x08\xb7\x41\x4f\x44\x8a\x53\xd7\x74\x5c\xa4\xc3\x5f\x66\xca\x50\x79\x5e\xd2\x63\x34\x45\xde\x75\xe1\xee\x9f\xf3\xc8\x95\xf2\x6b\x45\x82\x08\x16\x99\xff\x6f\xbd\x4d\xa5\xf8\xcd\xdb\x8d\x04\xb1\x2e\x8b\x51\xd1\x5f\x80\xac\x06\x95\xc0\xd4\x0e\x87\x69\xb5\x1a\x4f\x52\x14\x68\x46\xcb\x4e\xf6\x45\x06\x85\xcf\x75\xca\xe8\x8d\x47\x6e\x95\x27\x52\x88\x96\xea\xac\x58\x3d\x76\x3a\x89\xaf\x41\xfe\xef\x0e\x72\x6d\xbf\x3a\x00\xfe\x8b\x3b\x82\x17\x76\x3c\xa0\x18\x88\xa5\x36\xed\x8a\x55\xda\x61\x69\x93\x75\xb8\x5d\x9c\x62\x54\x22\x32\x5d\xcb\x49\x1c\x39\xc4\x67\x2a\xd2\x36\x7e\x84\xf1\xdc\xa9\x54\x8e\xa2\xb1\x06\x90\xb5\x16\xec\xf3\xea\x2c\x05\x47\x58\x88\xa0\x1b\xb1\x90\xd6\xb3\x3a\x72\x98\x6c\x69\x6b\xfe\x75\x0e\xa3\x5e\xfc\x53\x3a\xf5\xac\xf2\xb2\x06\x9d\x69\x49\x73\x12\xd2\x9b\xed\x7d\xe1\x00\x7e\xc3\x01\x3a\xa5\x24\xd6\x95\xe8\xec\x36\x7a\xe0\x18\x6b\x2d\x77\x52\x51\x24\xa1\xbc\x0b\xc3\xde\x10\x75\x74\x07\x4e\x40\x6c\x55\x29\x38\xb7\x11\xfd\x05\x4d\xd3\xd2\x6d\xf4\xc0\x49\x91\x72\xab\x59\xda\x62\x59\x8b\xa9\xc8\x5c\x49\xf3\x8d\xed\x61\xac\x72\xb8\xc1\xb6\x69\xa3\xe1\x24\x0d\xfe\x8f\xd7\xae\xef\xef\x78\xf6\xb5\xfe\xbf\x7f\xed\xa8\xbc\x41\xc7\x24\xab\xb8\x39\x4a\x0f\x49\xa8\x48\xc7\xab\x95\x03\x6b\x3f\x3d\x1e\x56\x6e\xc2\x06\x87\x3b\x80\xfc\x4d\xe9\x48\xe4\x9c\x8d\x7d\xca\x26\x5b\xc2\x0f\x99\x9a\xe0\x95\xe5\xc7\x3a\xc4\x60\xea\x55\x53\x6b\xfe\xba\x81\x8e\x94\xcd\x6c\x7e\x6c\x26\x7c\x19\x5d\xe7\x65\xe3\x38\xff\x6d\xff\xda\xb8\x09\x1e\x7f\xcf\xda\x5f\x3d\xf9\x63\xd7\x13\x87\x77\xba\x04\x76\xde\x9c\x1c\x6d\xb6\x09\xfd\x05\xa3\x87\x6a\x2d\x64\xa8\x71\x43\x37\xf9\x33\x6b\x0e\x65\x91\x8b\xac\xc5\x62\x69\x5c\x6c\x74\x24\x36\xf0\xe0\xf5\xc3\xdf\x7f\x3d\xce\x0e\x9d\xbc\x41\xf3\x6e\xe0\x8d\xd8\x58\x77\x27\x7e\xa4\x32\x3e\x56\x7e\xd9\x46\x96\xe9\x26\x56\xd7\xa8\x37\x95\xdd\x10\x22\x0d\x55\x92\xd3\xa6\x04\x77\x93\x0d\x6c\x42\xef\x0d\x61\x87\x4e\xad\x8b\x2a\x3a\xf9\x74\x40\x62\xc3\x06\x27\x62\xb3\x8f\x4e\xfc\xed\x95\x89\xb4\xc8\x26\x9d\xf5\xce\xe2\x7e\xd7\xbe\xcf\xce\x46\x2d\x89\x25\x27\x5b\xfd\x9b\x78\x76\xad\x61\x05\xb2\x08\x65\x45\x4d\xde\x88\xfa\xa0\xb2\x15\xe5\x04\xd9\x54\x8f\x4c\x63\x1b\x10\xb5\x21\xf2\xe5\x4d\xcc\xd6\xa8\x36\xf4\x4f\x22\x1c\x2a\x9a\x9c\x48\xd4\x36\xf8\x60\x75\x1c\x37\xf8\xf8\x26\xd6\x28\x4e\xf5\x9a\xb6\x9a\xba\x65\x1d\x39\x5c\x1f\xd8\x70\x62\x5b\xb1\xba\x3c\x36\xda\xf4\x5a\x1f\xb3\xf1\xb6\x36\x30\x98\x65\x56\xd9\x90\x04\x0d\xff\xb4\x11\x71\x18\xff\x3d\x93\xb6\xbb\x5e\x09\xf0\x44\xd2\xbc\xf1\x67\xab\x02\xbd\xf1\x16\x54\xdd\xf1\x7b\xa8\x93\xd0\xa5\x54\xf8\xca\xd1\xc6\x09\xf9\x97\xff\x97\xaf\x0f\x3e\xbd\x03\xfe\xd4\xf9\x1f\x18\x74\x04\x97\x2e\xdc\x0c\xc9\x76\x48\xfb\x38\x94\x77\x9f\xd3\x0e\x4f\x78\x0a\x59\x72\x21\x47\x56\x76\xc8\xcd\x43\xec\x1e\x84\xa9\x32\x61\x53\x1d\xf3\x83\x2e\x68\xdc\x8d\x38\xea\x45\x08\xaf\x98\xa3\xef\x06\x51\x01\xe1\xc4\x9a\x46\x9d\x8e\x3e\xbe\xaa\xaa\x65\x3c\x3c\xf3\x15\x11\xaf\xe8\xcc\x56\xf0\xec\x63\xab\xb4\x25\x92\xac\xe8\x59\xee\x67\x4c\xb7\x89\x07\x1a\x00\x23\x8f\x7a\xca\x13\x6a\xbe\x4f\x41\x97\x63\xe9\x88\xaa\xac\x4d\x79\x1b\x4e\xf9\x90\xfd\x22\x1b\x55\xe1\x1b\x40\xab\x8c\x07\xe0\x51\xc3\xde\x41\x02\x9a\x0a\x84\xe4\x51\x52\x00\x6b\x20\xdc\x8d\xd9\x5e\x38\xe0\x3a\x53\x94\xe5\xf4\xac\x29\x50\x5c\xb1\x31\xba\x9a\x1c\x59\x01\x75\xfd\x81\xaa\xfc\x5d\xe1\x75\xda\xe4\x59\x3e\xc5\xdb\x6d\x91\xe6\x75\x88\xac\x62\x6a\x21\x8b\x11\xff\xed\x82\xb7\x0f\x5e\xb2\x18\x55\xd2\xd8\x9e\x7d\x1d\x79\xce\x23\xd7\xe2\x94\x46\x49\x67\x2e\xc9\x72\x96\xb4\xb8\xff\xb4\x17\xfc\x9a\x37\x74\x59\xe7\x95\x94\x71\x2b\x2b\x19\x3f\x52\x37\xd5\x29\xa4\x56\x2e\xa9\x70\xf7\xd4\xf9\xc1\xc3\xed\x25\xa7\x76\xb2\xac\xbd\xc0\xd4\x33\x48\xca\xe3\xab\xfa\x73\xe5\x5c\x2a\x38\x38\x94\x80\x1c\x13\x65\x8f\x5e\x7f\x8b\x94\x97\x94\xb5\x72\x9e\xba\x49\x5c\x5f\xf2\xc8\x6e\x04\x56\xf4\x3f\xeb\x05\x9f\xf0\x14\x86\x63\xa4\x91\x4e\x95\x37\x86\x65\x50\xa4\x93\x1c\x56\x3c\x80\x29\xef\xb0\x54\x27\x58\xa2\xf7\x43\x5f\xd0\xb1\x0a\xc4\x3e\xab\x16\x76\xbf\xc2\x9f\xb3\xed\xbc\xdd\x46\x49\x73\x50\xd2\xbe\xec\x91\x3d\x29\x8f\xe5\x28\xcb\x6f\x5a\x3f\x69\xb7\xca\xc4\xf4\xa8\xa7\x1e\x37\x69\xff\xba\x00\x05\xc3\x2a\x2c\xd5\xe0\x2c\x20\xbe\x50\x54\xd0\x12\xbd\x7e\xcc\xcf\xab\xd5\x93\x35\xe8\x09\xb9\xae\x21\x92\x58\x5d\x27\x96\x22\x36\xbc\x3a\x52\xeb\x19\x7f\xac\x68\x53\xdd\x01\xb5\xb2\xc8\xa7\x3c\xf2\x1a\xa3\x61\xca\xd4\x20\xff\x83\x5e\xf0\x1e\x6f\xc4\x0f\xa3\xca\x70\x6c\x3e\x57\xb9\xd0\x39\x86\xfa\x15\x81\xd0\x0a\xc4\xdb\x4a\x6d\x54\x06\xc6\x95\x6e\xda\x88\x5a\xaa\x02\x2c\x5d\x5d\xba\xf2\x8f\x8b\x22\xb1\x39\x47\x2b\xbf\xe8\x8e\x5b\xbe\x7f\x95\x38\x9f\x65\x98\x9a\xde\x64\xad\xe5\x55\x29\x62\x72\xc8\x59\x1e\x21\xf0\x22\xee\x08\x6a\x46\xd5\xee\x05\x75\xe0\x4e\xa0\xe7\x09\x8f\x5c\x53\xb6\xac\x72\xa1\xde\xed\xad\x81\x87\xae\x65\x04\x5a\xc4\x07\x02\x56\x6d\xe2\x92\x77\x9a\x3c\x5e\xc2\x65\x7c\xc0\x0b\xde\xe5\xa9\xca\x76\xd0\xd1\xaa\x4c\xa6\xa2\xa6\xb5\xf6\x75\x11\x48\x5e\x61\xdd\x7b\xc1\x23\xbb\x33\x9e\x46\x3c\xf3\x1f\xf1\x48\x63\xec\x28\x56\xcc\xa4\x05\x78\x24\x78\x2b\x3e\x0a\x2e\x79\xc0\x1f\x00\x98\x6e\xf9\x71\x38\x14\xea\x67\x90\x4f\xb4\x2d\xac\x64\x09\xd9\xf7\x28\xc6\xf2\xe7\x03\x25\xc8\x6f\x2e\x12\x7c\xba\xb1\x1d\x9a\xdf\x6a\x68\xfe\x7d\x1e\x29\x4d\x21\xff\x17\x3c\x72\xfb\x26\xb6\x87\x53\x51\x2b\x15\xb2\x81\x60\xce\xb4\xa5\xd7\x0b\x98\xa6\x0a\xac\x59\xeb\x20\x90\x68\xa4\xb1\x17\x4d\x38\xb3\x87\x5a\xb4\x53\x53\x2e\xfa\xac\x47\x76\x4a\xf3\xd8\x7f\xc6\x0b\x9e\xf0\xe4\x5f\xb8\xe7\x6f\x01\x7e\x87\x9e\x62\xe7\xa3\x1e\x8b\x69\xcc\x93\x4e\xde\xd5\xf7\xeb\xb6\x8f\x2e\x1f\xc3\xe0\x52\x1c\x35\x53\x06\x72\x59\x5a\x9a\xfd\x94\xf7\x99\x4a\xa5\xeb\xb2\x24\x2c\xa3\x3d\x45\x5f\x5e\xbb\xf9\xc6\xe5\x63\xce\xba\xf9\x64\x8d\xec\x33\xdb\x82\xff\x64\x6d\x13\x9b\xd4\x5f\x78\xe5\xbe\x62\x2a\x47\xac\x38\xbf\x35\xa2\x72\x68\x9a\x18\xd9\x4b\x70\x49\xb7\x18\xf0\xc2\xc1\xc2\x49\x14\x3f\x3d\x35\xdb\x88\x63\xa8\x1a\xf0\x64\xb5\x39\x9c\xe5\xfd\x38\x6a\xb1\x05\x9e\x1f\x1f\x75\x97\xf5\x7b\x56\x96\x50\x70\xdd\x0f\xbd\xe7\x34\x39\x40\x52\x4b\x7d\xc3\x5a\x72\x35\x2b\xf8\x78\x0b\x89\x97\x59\x4d\x99\x7d\xf0\x13\x1e\xd9\x09\xd0\x01\x1f\xf1\x82\x5f\xf1\x74\x7a\x64\x6e\x31\xe4\x59\xef\x3b\x78\x5a\x1a\xfd\x71\x9d\x3e\xc0\x80\xbf\xff\x50\x1d\xd4\x1d\x72\xd5\xb5\xf4\xe4\x61\xe8\x57\x87\xb6\x00\xfe\xf7\x12\x58\xb2\xce\x74\x7f\xd6\x23\x7f\xbb\xdc\x1b\x4e\x4a\xe1\x96\xcb\x20\xcb\x59\xaf\xef\x3f\xee\x8d\xa7\x5f\x5a\x63\x5d\xc1\x92\x8a\xc6\xb5\x7a\xe9\x77\xa4\xff\xe4\x91\x1f\x29\x5b\xbb\x97\xd9\x9f\xf0\xaf\xb6\xf0\x09\xdd\x31\x8d\x5e\xf2\x2f\xb8\xe8\xfd\xc3\xf5\xc3\x93\x37\xf9\x37\x68\x4f\x0b\x3c\x3a\xce\xc3\xe2\xba\x6e\xc9\x6f\xec\x26\xf5\x91\x38\x7c\x0d\x4c\xb5\x9c\xc9\x73\xd6\xea\xf6\x8c\x09\xe1\xbf\x63\x77\xf0\x47\xde\xe8\xdf\x5c\xbc\x54\x3b\xe3\xb5\x54\x38\x0c\x9e\x91\x9a\xf1\x6c\xd4\xe9\xe6\x34\x11\xab\x98\x14\x6d\xb2\xb8\xef\x57\x69\xcf\x0a\x63\x53\x3f\x40\x57\x22\x56\x42\xa3\xaa\xab\x69\xdd\x42\xbe\x5e\x45\x76\x09\x0c\x38\x43\xa6\x76\x94\xc4\x51\xc2\x4d\x22\x75\x94\x40\xa5\x27\x64\xce\xb6\x72\x70\x05\x18\xa8\x12\xf5\x36\x84\x2e\xb2\x8e\xce\xff\x62\x27\xf9\xcc\x0e\x72\x0d\xb6\xa4\x12\xd1\xfb\xbc\xe5\x3f\xb5\x63\x02\xb6\xd4\x32\x33\xbd\x7c\x32\xf8\xf3\x5a\xb5\x31\xab\x7e\x2e\x8e\x41\x74\x6c\xbc\xaf\x84\xb7\x78\x96\x31\x2c\x46\xc4\xef\xc6\x34\x22\xed\x8a\x50\x03\x6d\xd5\x2a\x31\x05\xef\xa9\xbe\xdf\xce\x9f\xaf\xa2\x1b\xf5\x45\xbf\x50\x06\x7b\xa2\x30\xbf\x65\x07\x8e\x2f\xcc\x9d\x8a\x3a\x2a\x2b\xab\xcd\x99\xd1\x2d\xa5\xc2\x4e\x59\x92\xc5\xa5\x74\x67\x9a\xc2\x7d\xec\xab\x31\xff\x69\xd4\x98\x54\x3b\xd5\xe4\x39\x9b\x8a\xa5\x09\x80\xa6\x5d\x86\x9d\xeb\x0a\x44\x68\x50\x50\xab\x3c\x55\xb9\x75\x3c\x41\x28\x92\xb1\x1d\x27\xa7\xc8\xdf\xec\x57\xde\x0b\x10\x00\x37\x05\x07\xed\xa2\xbe\xe1\x41\x35\x43\xee\x68\xc5\x5f\xd9\x43\x5e\x3f\xca\xd2\x4e\x56\xee\x67\xa9\x5a\x27\x2f\xef\x0e\x6e\xb7\x2f\x54\xf8\x62\xf1\x9a\x1e\x6e\x53\x66\xcf\x12\x8a\x0f\xb9\x52\xf8\xd4\x6e\x12\x91\xab\x31\xc3\xf6\x14\xeb\xdf\xc3\x07\x67\x79\xdb\xbf\x7f\x02\x11\x3c\x6e\x3d\xb3\xc0\x31\xef\x22\xf8\xbb\xf8\x97\xec\xc8\x32\x1f\x20\x83\x8c\xb9\xb1\x41\x7e\xad\x46\xf6\xc2\x5c\xc8\x97\xbc\xbb\x46\x6e\x9c\x70\x8b\x07\xec\x03\xf3\x92\xaf\x79\xe5\x5b\x0c\x53\x8d\xaa\x9d\x9d\xd6\x75\x01\xd6\x29\x5b\x1e\xf8\xea\xee\xbf\xaa\xd4\x71\xc9\x5c\x44\x9e\xdb\x9f\x3c\x70\xfb\x3d\x27\x1e\xbc\xf3\xc0\x5b\x97\xec\xdf\x60\x53\xc3\xfc\x4a\xfb\x86\x4c\xca\x57\x22\x42\x98\x70\xf5\x6f\xe6\x94\xe8\xa9\x1f\x10\xd9\x03\xf1\x99\xcd\xbf\x7d\x11\x56\xff\xcb\x1a\xe4\xf1\x1a\xb9\x46\xdb\x9d\x27\xf5\x40\x3d\x52\x23\x37\xaf\x3b\x50\x67\xed\xa7\xcc\x50\xfd\xbe\x35\x54\xc6\xb3\x63\x9d\x7d\xa1\x16\x65\x1a\x17\x81\xb1\x77\xd1\x61\x9a\x29\x56\x00\xe5\xb1\x39\x88\x17\x1b\xad\x7e\x51\x57\x37\x34\x7a\xbc\x27\xd2\x81\xf9\x97\xf7\xbb\xbc\xc7\x53\x16\x4f\x29\x65\x5f\x37\x8f\xe3\x63\xe6\x3f\x7c\xd0\x79\xc1\xf0\xd3\x87\xc6\x71\xe7\x36\xc8\x0a\xb9\x02\x01\x34\x94\xbc\xb6\xc9\xf5\xeb\x0e\xd0\x82\x7e\xc0\x0c\xce\x91\x11\xc2\xaa\x70\x39\x22\x1b\xcb\xd8\x08\x0c\xf9\xe3\xfd\xe4\xef\x8c\x68\xda\xd4\xde\xfa\xcf\xed\x0f\x4e\x95\x95\xb8\x2a\x7b\x1a\x96\x65\x4b\xf4\x71\x55\xc2\xcf\x0d\x7a\x2e\x83\x89\x30\xc5\xdc\xe6\x25\x99\x0d\x0d\xe7\x2e\xd6\x47\x09\xf9\x56\x09\xa6\xf8\xc2\x24\x7e\x1c\xd3\x19\xc4\x20\x0b\x3e\xa4\xe1\x17\x5d\x84\x18\x35\xca\xd6\x51\x80\x51\xf3\xe8\xe5\x46\x5e\xdc\x3e\xa5\x6e\xf5\x94\xba\xed\xff\xdd\xf6\xff\x3a\xfe\xdf\xaf\x7a\x64\xa7\x5c\x65\xfe\xef\xad\xe5\x92\x1a\x56\x1a\xd2\xac\xbc\xe0\x29\xa4\xc1\x72\xd5\x35\x79\x97\xad\x44\x22\xd5\x5b\xc9\xab\xa6\x2a\x2e\x7a\xf7\xad\x7f\x80\x69\xf8\xf5\x51\xd9\x95\xa6\xd3\x95\x03\x4d\xf3\x5a\x72\x35\xd9\x7f\x8c\xb3\x94\xa7\x8b\x62\x99\x27\xfe\xdf\x78\xe8\x0c\x39\xe5\x5e\xba\xd3\xbf\x9d\xec\x66\xfd\xe8\x1e\x3e\xf0\xaf\x74\x62\xd6\xd7\xed\x46\x20\xa3\xe0\x75\x78\x3f\x85\x07\x2a\x39\x69\xff\x3f\x00\x00\xff\xff\x78\xfb\xb7\x2b\xa3\xf0\x34\x00") + +func kubernetesapiV1_21_2SwaggerPbBytes() ([]byte, error) { + return bindataRead( + _kubernetesapiV1_21_2SwaggerPb, + "kubernetesapi/v1_21_2/swagger.pb", + ) +} + +func kubernetesapiV1_21_2SwaggerPb() (*asset, error) { + bytes, err := kubernetesapiV1_21_2SwaggerPbBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "kubernetesapi/v1_21_2/swagger.pb", size: 3469475, mode: os.FileMode(420), modTime: time.Unix(1658180420, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "kubernetesapi/v1_21_2/swagger.pb": kubernetesapiV1_21_2SwaggerPb, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "kubernetesapi": &bintree{nil, map[string]*bintree{ + "v1_21_2": &bintree{nil, map[string]*bintree{ + "swagger.pb": &bintree{kubernetesapiV1_21_2SwaggerPb, map[string]*bintree{}}, + }}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.pb b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.pb similarity index 98% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.pb rename to tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.pb index 2a48837bf..910436fc5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1212/swagger.pb +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1_21_2/swagger.pb @@ -1,24 +1,24 @@ 2.0 -Kubernetesv1.21.2BÝè¢* -Q/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslices/{name}º) -discovery_v1beta1´watch changes to an object of kind EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*,watchDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Kubernetesv1.21.2BÝè¢ð& +/api/v1/limitrangesØ&Ì +core_v1(list or watch objects of kind LimitRange*$listCoreV1LimitRangeForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J]  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice -version: v1beta1 + Unauthorized +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.LimitRangeListRhttpsj +x-kubernetes-actionlist +jL +x-kubernetes-group-version-kind)'kind: LimitRange +version: v1 +group: "" J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -33,9 +33,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the EndpointSlice"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -44,9 +42,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¬) -C/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/flowschemas/{name}ä(Ÿ -flowcontrolApiserver_v1beta1±watch changes to an object of kind FlowSchema. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ³( +)/api/v1/watch/namespaces/{namespace}/pods…(— +core_v1owatch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedPodList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -56,12 +54,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jE +x-kubernetes-group-version-kind" group: "" +kind: Pod +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -76,8 +75,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the FlowSchema"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -86,10 +85,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ó( --/apis/storage.k8s.io/v1/watch/csinodes/{name}¡(ß - -storage_v1®watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ñ( +@/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases¬(¾ +coordination_v1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*&watchCoordinationV1NamespacedLeaseList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -99,11 +97,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -119,8 +118,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the CSINode"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -129,69 +128,149 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean · -;/apis/authorization.k8s.io/v1beta1/selfsubjectaccessreviews÷ -"é -authorization_v1beta1 create a SelfSubjectAccessReview*1createAuthorizationV1beta1SelfSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B\ -Z -Xbodybody *H -F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewJµ -Y -200R -P -OKJ -H -F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview -^ -201W -U -CreatedJ -H -F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview -_ -202X -V -AcceptedJ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷\ +&/apis/storage.k8s.io/v1/storageclassesÌ\‘& + +storage_v1*list or watch objects of kind StorageClass*listStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.StorageClassList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +"‰ + +storage_v1create a StorageClass*createStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF +D +Bbodybody *2 +0#/definitions/io.k8s.api.storage.v1.StorageClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jó +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass H -F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview +201A +? +Created4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass +I +202B +@ +Accepted4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jp -x-kubernetes-group-version-kindMKgroup: authorization.k8s.io -kind: SelfSubjectAccessReview -version: v1beta1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ð' -"/apis/batch/v1beta1/watch/cronjobsÉ'½ - batch_v1beta1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*,watchBatchV1beta1CronJobListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +*Ø, + +storage_v1!delete collection of StorageClass*%deleteStorageV1CollectionStorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ê +/api/À½ +coreget available API versions*getCoreAPIVersions2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJl +Q +200J +H +OKB +@ +>#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions + +401 + + UnauthorizedRhttps©[ + /api/v1/nodes—[Ü% +core_v1"list or watch objects of kind Node*listCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -199,41 +278,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¦( -3/apis/discovery.k8s.io/v1beta1/watch/endpointslicesî'â -discovery_v1beta1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*6watchDiscoveryV1beta1EndpointSliceListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JW +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.core.v1.NodeList  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice -version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï + UnauthorizedRhttpsj +x-kubernetes-actionlist +jF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +"³ +core_v1 create a Node*createCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.core.v1.NodeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÒ +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node += +2016 +4 +Created) +' +%#/definitions/io.k8s.api.core.v1.Node +> +2027 +5 +Accepted) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsjF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +j +x-kubernetes-actionpost +*®, +core_v1delete collection of Node*deleteCoreV1CollectionNode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -241,30 +355,35 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ý -/openid/v1/jwks/èå -openid\get service account issuer OpenID JSON Web Key Set (contains public token verification keys)*#getServiceAccountIssuerOpenIDKeyset2application/jwk-set+jsonJ7 - -200 - -OK - ² -string +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsà' -/apis/apps/v1/watch/daemonsets½'± -apps_v1uwatch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.*(watchAppsV1DaemonSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ü( +;/api/v1/watch/namespaces/{namespace}/replicationcontrollers¼(Î +core_v1watch individual changes to a list of ReplicationController. deprecated: use the 'watch' parameter with a list operation instead.*.watchCoreV1NamespacedReplicationControllerList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -274,9 +393,9 @@ G  401  - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController version: v1 j# x-kubernetes-action  @@ -295,7 +414,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -304,9 +424,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ) -5/apis/policy/v1beta1/watch/podsecuritypolicies/{name}Î(‚ -policy_v1beta1¸watch changes to an object of kind PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ô) +@/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs/{name})ë + batch_v1beta1®watch changes to an object of kind CronJob. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -316,12 +436,12 @@ G  401  - UnauthorizedRhttpsj\ -x-kubernetes-group-version-kind97group: policy -kind: PodSecurityPolicy -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionwatch +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -336,8 +456,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J> -<:"8pathname of the PodSecurityPolicy"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the CronJob"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -346,174 +467,92 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ü+ -G/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets/{name}+§ -policy_v1beta1&read the specified PodDisruptionBudget*.readPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ji -N -200G -E -OK? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —] +//apis/apps/v1/namespaces/{namespace}/daemonsetsã\ü% +apps_v1'list or watch objects of kind DaemonSet*listAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.apps.v1.DaemonSetList  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9version: v1beta1 -group: policy -kind: PodDisruptionBudget -j -x-kubernetes-actionget - -policy_v1beta1)replace the specified PodDisruptionBudget*1replacePolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ -O -Mbodybody *= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetBž + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(version: v1 +group: apps +kind: DaemonSet +j +x-kubernetes-actionlist +"â +apps_v1create a DaemonSet*createAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.apps.v1.DaemonSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¾ -N -200G -E -OK? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget -S -201L -J -Created? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -*² -policy_v1beta1delete a PodDisruptionBudget*0deletePolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -j^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -B¦ -policy_v1beta12partially update the specified PodDisruptionBudget*/patchPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ji -N -200G -E -OK? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -J@ -><":pathname of the PodDisruptionBudget"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ç' --/apis/discovery.k8s.io/v1beta1/endpointslices•'‰ -discovery_v1beta1+list or watch objects of kind EndpointSlice*1listDiscoveryV1beta1EndpointSliceForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jj -O -200H -F -OK@ -> -<#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jb -x-kubernetes-group-version-kind?=kind: EndpointSlice -version: v1beta1 -group: discovery.k8s.io -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯' -)/apis/networking.k8s.io/v1beta1/ingresses'õ -networking_v1beta1%list or watch objects of kind Ingress*,listNetworkingV1beta1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já +C +202< +: +Accepted. +, +*#/definitions/io.k8s.api.apps.v1.DaemonSet  401  Unauthorized -J -200C -A -OK; += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.apps.v1.DaemonSet +B +201; 9 -7#/definitions/io.k8s.api.networking.v1beta1.IngressListRhttpsj -x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +Created. +, +*#/definitions/io.k8s.api.apps.v1.DaemonSetRhttpsj +x-kubernetes-actionpost +jM +x-kubernetes-group-version-kind*(version: v1 +group: apps +kind: DaemonSet +*É, +apps_v1delete collection of DaemonSet*)deleteAppsV1CollectionNamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -521,233 +560,74 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Õ+ -B/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings/{name}Ž+À -rbacAuthorization_v1beta1%read the specified ClusterRoleBinding*.readRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jp -x-kubernetes-group-version-kindMKkind: ClusterRoleBinding -version: v1beta1 -group: rbac.authorization.k8s.io -£ -rbacAuthorization_v1beta1(replace the specified ClusterRoleBinding*1replaceRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN -L -Jbodybody *: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ -K -200D -B -OK< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding -P -201I -G -Created< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jp -x-kubernetes-group-version-kindMKkind: ClusterRoleBinding -version: v1beta1 -group: rbac.authorization.k8s.io -*Î -rbacAuthorization_v1beta1delete a ClusterRoleBinding*0deleteRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jp -x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1beta1 -B¿ -rbacAuthorization_v1beta11partially update the specified ClusterRoleBinding*/patchRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jp -x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1beta1 -J? -=;"9pathname of the ClusterRoleBinding"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ì -/apis/batch/v1beta1/ÓÐ - batch_v1beta1get available resources*getBatchV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps³) -7/apis/apps/v1/namespaces/{namespace}/replicasets/{name}÷(ç -apps_v1read the specified ReplicaSet*readAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet -version: v1 -° -apps_v1 replace the specified ReplicaSet*!replaceAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.apps.v1.ReplicaSetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž  401  - Unauthorized -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSetRhttpsjN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet version: v1 -j -x-kubernetes-actionput -*‚ -apps_v1delete a ReplicaSet* deleteAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ó +;/api/v1/namespaces/{namespace}/serviceaccounts/{name}/token³ "ˆ +core_v1 create token of a ServiceAccount*)createCoreV1NamespacedServiceAccountToken2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM +K +Ibodybody *9 +7#/definitions/io.k8s.api.authentication.v1.TokenRequestJˆ +P +202I +G +Accepted; +9 +7#/definitions/io.k8s.api.authentication.v1.TokenRequest  401  Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet -version: v1 -j -x-kubernetes-action delete -Bæ -apps_v1)partially update the specified ReplicaSet*patchAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet - -401 - - UnauthorizedRhttpsjN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.authentication.v1.TokenRequest +O +201H +F +Created; +9 +7#/definitions/io.k8s.api.authentication.v1.TokenRequestRhttpsja +x-kubernetes-group-version-kind>path#name of the HorizontalPodAutoscaler"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -788,51 +667,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean õ( -5/apis/node.k8s.io/v1beta1/watch/runtimeclasses/{name}»(ô - node_v1beta1³watch changes to an object of kind RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ð +/apis/node.k8s.io/v1beta1/ÑÎ + node_v1beta1get available resources*getNodeV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j\ -x-kubernetes-group-version-kind97kind: RuntimeClass -version: v1beta1 -group: node.k8s.io -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the RuntimeClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean –) -=/apis/apiregistration.k8s.io/v1beta1/watch/apiservices/{name}Ô( -apiregistration_v1beta1±watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*%watchApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsþ( +7/apis/scheduling.k8s.io/v1/watch/priorityclasses/{name}Â(ú + scheduling_v1´watch changes to an object of kind PriorityClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -842,12 +691,12 @@ G  401  - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -j + UnauthorizedRhttpsj x-kubernetes-actionwatch +j^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -862,8 +711,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the APIService"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the PriorityClass"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -872,9 +721,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean –_ -@/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgetsÑ^À& -policy_v1beta11list or watch objects of kind PodDisruptionBudget*.listPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿^ +5/api/v1/namespaces/{namespace}/replicationcontrollers…^ª& +core_v13list or watch objects of kind ReplicationController*)listCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -896,58 +745,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jm +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jh +M +200F +D +OK> +< +:#/definitions/io.k8s.api.core.v1.ReplicationControllerList  401  - Unauthorized -R -200K -I -OKC -A -?#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetListRhttpsj^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"Ù -policy_v1beta1create a PodDisruptionBudget*0createPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ -O -Mbodybody *= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetBž +jW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController +version: v1 +"´ +core_v1create a ReplicationController*+createCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.core.v1.ReplicationControllerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J” - -401 - - Unauthorized +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J… +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController N -200G +201G E -OK? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget -S -201L -J -Created? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget -T -202M -K -Accepted? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetRhttpsj +Created: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController +O +202H +F +Accepted: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController + +401 + + UnauthorizedRhttpsj x-kubernetes-actionpost -j^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -*ü, -policy_v1beta1(delete collection of PodDisruptionBudget*:deletePolicyV1beta1CollectionNamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController +version: v1 +*ë, +core_v1*delete collection of ReplicationController*5deleteCoreV1CollectionNamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -986,102 +835,37 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -j^ -x-kubernetes-group-version-kind;9kind: PodDisruptionBudget -version: v1beta1 -group: policy +jW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController +version: v1 J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Û( -7/apis/apps/v1/watch/namespaces/{namespace}/statefulsetsŸ(± -apps_v1wwatch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.*$watchAppsV1NamespacedStatefulSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA +MKIquery-If 'true', then the output is pretty printed."pretty2string õ +?/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/status±û +apps_v1(read status of the specified StatefulSet*%readAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean µ] -1/apis/apps/v1/namespaces/{namespace}/statefulsetsÿ\„& -apps_v1)list or watch objects of kind StatefulSet*listAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.apps.v1.StatefulSetList +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist + UnauthorizedRhttpsj +x-kubernetes-actionget jO x-kubernetes-group-version-kind,*group: apps kind: StatefulSet version: v1 -"ð -apps_v1create a StatefulSet*!createAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB +Æ +apps_v1+replace status of the specified StatefulSet*(replaceAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB @ >bodybody *. ,#/definitions/io.k8s.api.apps.v1.StatefulSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  ? 2008 6 @@ -1094,70 +878,44 @@ D Created0 . ,#/definitions/io.k8s.api.apps.v1.StatefulSet -E -202> -< -Accepted0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost + UnauthorizedRhttpsj +x-kubernetes-actionput jO -x-kubernetes-group-version-kind,*version: v1 -group: apps +x-kubernetes-group-version-kind,*group: apps kind: StatefulSet -*Ï, -apps_v1 delete collection of StatefulSet*+deleteAppsV1CollectionNamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +version: v1 +Bú +apps_v14partially update status of the specified StatefulSet*&patchAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection + UnauthorizedRhttpsj +x-kubernetes-actionpatch jO x-kubernetes-group-version-kind,*group: apps kind: StatefulSet version: v1 -J` +J8 +64"2pathname of the StatefulSet"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ï -/apis/authentication.k8s.io/ÎË -authenticationget information of a group*getAuthenticationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +MKIquery-If 'true', then the output is pretty printed."pretty2string ß +/apis/autoscaling/ÈÅ + autoscalingget information of a group*getAutoscalingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi N 200G E @@ -1167,24 +925,96 @@ E  401  - UnauthorizedRhttps–' -$/apis/networking.k8s.io/v1/ingressesí&á - networking_v1%list or watch objects of kind Ingress*'listNetworkingV1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` -E -200> -< -OK6 + UnauthorizedRhttpsâ +/api/v1/nodes/{name}/statusÂÓ +core_v1!read status of the specified Node*readCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsjF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +j +x-kubernetes-actionget + +core_v1$replace status of the specified Node*replaceCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.core.v1.NodeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node += +2016 4 -2#/definitions/io.k8s.api.networking.v1.IngressList +Created) +' +%#/definitions/io.k8s.api.core.v1.Node  401  - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress + UnauthorizedRhttpsj +x-kubernetes-actionput +jF +x-kubernetes-group-version-kind#!kind: Node version: v1 -j -x-kubernetes-actionlist +group: "" +BÒ +core_v1-partially update status of the specified Node*patchCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +J1 +/-"+pathname of the Node"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ä' +/apis/apps/v1/watch/deploymentsÀ'´ +apps_v1vwatch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.*)watchAppsV1DeploymentListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: Deployment +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -1208,9 +1038,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ð] -./apis/networking.k8s.io/v1beta1/ingressclasses½]±& -networking_v1beta1*list or watch objects of kind IngressClass*!listNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹^ +4/apis/rbac.authorization.k8s.io/v1beta1/clusterrolesÒ]½& +rbacAuthorization_v1beta1)list or watch objects of kind ClusterRole*'listRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -1232,58 +1062,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj -O -200H -F -OK@ -> -<#/definitions/io.k8s.api.networking.v1beta1.IngressClassList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleList  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jb -x-kubernetes-group-version-kind?=group: networking.k8s.io -kind: IngressClass + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole version: v1beta1 -" -networking_v1beta1create an IngressClass*#createNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN -L -Jbodybody *: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClassBž +j +x-kubernetes-actionlist +"¸ +rbacAuthorization_v1beta1create a ClusterRole*)createRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ -Q -202J -H -Accepted< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jö +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole +J +202C +A +Accepted5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole  401  Unauthorized -K -200D -B -OK< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass -P -201I -G -Created< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClassRhttpsj +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleRhttpsj x-kubernetes-actionpost -jb -x-kubernetes-group-version-kind?=group: networking.k8s.io -kind: IngressClass +ji +x-kubernetes-group-version-kindFDkind: ClusterRole version: v1beta1 -*ð, -networking_v1beta1!delete collection of IngressClass*-deleteNetworkingV1beta1CollectionIngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: rbac.authorization.k8s.io +*ƒ- +rbacAuthorization_v1beta1 delete collection of ClusterRole*3deleteRbacAuthorizationV1beta1CollectionClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -1320,101 +1150,29 @@ C  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: networking.k8s.io -kind: IngressClass -version: v1beta1 -j* + UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection +ji +x-kubernetes-group-version-kindFDkind: ClusterRole +version: v1beta1 +group: rbac.authorization.k8s.io JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‰ -;/api/v1/namespaces/{namespace}/resourcequotas/{name}/statusÉ -core_v1*read status of the specified ResourceQuota*'readCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -Ð -core_v1-replace status of the specified ResourceQuota**replaceCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -j -x-kubernetes-actionput -B€ -core_v16partially update status of the specified ResourceQuota*(patchCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota +MKIquery-If 'true', then the output is pretty printed."pretty2string ÷( +>/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions´(Æ +apps_v1~watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.*+watchAppsV1NamespacedControllerRevisionList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jO -x-kubernetes-group-version-kind,*version: v1 -group: "" -kind: ResourceQuota -J: -86"4pathname of the ResourceQuota"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‹( -1/apis/storage.k8s.io/v1beta1/watch/storageclassesÕ'É -storage_v1beta1xwatch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.*#watchStorageV1beta1StorageClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 j# x-kubernetes-action  watchlist @@ -1432,7 +1190,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -1441,67 +1200,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean †( -//apis/storage.k8s.io/v1/watch/volumeattachmentsÒ'Æ - -storage_v1|watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.*"watchStorageV1VolumeAttachmentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk - -401 - - Unauthorized +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean …) +E/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases»(Í +coordination_v1beta1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*+watchCoordinationV1beta1NamespacedLeaseList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¡' -"/apis/extensions/v1beta1/ingressesú&î -extensions_v1beta1%list or watch objects of kind Ingress*,listExtensionsV1beta1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.extensions.v1beta1.IngressList +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease version: v1beta1 +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -1516,7 +1233,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -1525,54 +1243,159 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ·- -M/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations/{name}å,ð -flowcontrolApiserver_v1beta1-read the specified PriorityLevelConfiguration*9readFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean –( +'/apis/storage.k8s.io/v1/csinodes/{name}ê'ä + +storage_v1read the specified CSINode*readStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode  401  - UnauthorizedRhttpsj{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionget -ñ -flowcontrolApiserver_v1beta10replace the specified PriorityLevelConfiguration* +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode  401  - Unauthorized -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationRhttpsj{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*ï -flowcontrolApiserver_v1beta1#delete a PriorityLevelConfiguration*;deleteFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jU +x-kubernetes-group-version-kind20version: v1 +group: storage.k8s.io +kind: CSINode +*ã + +storage_v1delete a CSINode*deleteStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string JŸ +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode +D +202= +; +Accepted/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode + +401 + + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20version: v1 +group: storage.k8s.io +kind: CSINode +j +x-kubernetes-action delete +Bã + +storage_v1&partially update the specified CSINode*patchStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode + +401 + + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20group: storage.k8s.io +kind: CSINode +version: v1 +j +x-kubernetes-actionpatch +J4 +20".pathname of the CSINode"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¥) +1/api/v1/namespaces/{namespace}/limitranges/{name}ï(å +core_v1read the specified LimitRange*readCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jL +x-kubernetes-group-version-kind)'version: v1 +group: "" +kind: LimitRange +® +core_v1 replace the specified LimitRange*!replaceCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.core.v1.LimitRangeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jL +x-kubernetes-group-version-kind)'version: v1 +group: "" +kind: LimitRange +*€ +core_v1delete a LimitRange* deleteCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -1595,162 +1418,143 @@ I  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange +version: v1 +j x-kubernetes-action delete -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -Bï -flowcontrolApiserver_v1beta19partially update the specified PriorityLevelConfiguration*:patchFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bä +core_v1)partially update the specified LimitRange*patchCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -JG -EC"Apath&name of the PriorityLevelConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ÷\ -&/apis/storage.k8s.io/v1/storageclassesÌ\‘& - -storage_v1*list or watch objects of kind StorageClass*listStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.StorageClassList +jL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange +version: v1 +J7 +53"1pathname of the LimitRange"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Â* +@/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}ý)‡ +extensions_v1beta1read the specified Ingress*&readExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.extensions.v1beta1.Ingress  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 -"‰ - -storage_v1create a StorageClass*createStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF -D -Bbodybody *2 -0#/definitions/io.k8s.api.storage.v1.StorageClassBž + UnauthorizedRhttpsj +x-kubernetes-actionget +jV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 +à +extensions_v1beta1replace the specified Ingress*)replaceExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.extensions.v1beta1.IngressBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jó -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass -H -201A -? -Created4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass -I -202B -@ -Accepted4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.extensions.v1beta1.Ingress  401  - UnauthorizedRhttpsjZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 -j -x-kubernetes-actionpost -*Ø, - -storage_v1!delete collection of StorageClass*%deleteStorageV1CollectionStorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + UnauthorizedRhttpsjV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 +j +x-kubernetes-actionput +*› +extensions_v1beta1delete an Ingress*(deleteExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj +x-kubernetes-action delete +jV +x-kubernetes-group-version-kind31kind: Ingress +version: v1beta1 +group: extensions +B† +extensions_v1beta1&partially update the specified Ingress*'patchExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.extensions.v1beta1.Ingress  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ’( -./apis/discovery.k8s.io/v1/watch/endpointslicesß'Ó - discovery_v1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*1watchDiscoveryV1EndpointSliceListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsjV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 +j +x-kubernetes-actionpatch +J4 +20".pathname of the Ingress"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ƒ) +A/apis/policy/v1/watch/namespaces/{namespace}/poddisruptionbudgets½(Ï + policy_v1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*.watchPolicyV1NamespacedPodDisruptionBudgetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -1760,9 +1564,9 @@ G  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice + UnauthorizedRhttpsjY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget version: v1 j# x-kubernetes-action  @@ -1781,7 +1585,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -1790,9 +1595,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ï( -0/api/v1/watch/namespaces/{namespace}/limitrangesš(¬ -core_v1vwatch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.*#watchCoreV1NamespacedLimitRangeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×' +/api/v1/watch/endpoints»'¯ +core_v1uwatch individual changes to a list of Endpoints. deprecated: use the 'watch' parameter with a list operation instead.*(watchCoreV1EndpointsListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -1802,13 +1607,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 +j# x-kubernetes-action  watchlist -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -1823,8 +1628,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -1833,409 +1637,182 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ž( -1/apis/apiregistration.k8s.io/v1/watch/apiservicesØ'Ì -apiregistration_v1vwatch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.*$watchApiregistrationV1APIServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ß -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  -S/apis/authorization.k8s.io/v1beta1/namespaces/{namespace}/localsubjectaccessreviewsê "ú -authorization_v1beta1!create a LocalSubjectAccessReview* +< +Created1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event +F +202? += +Accepted1 +/ +-#/definitions/io.k8s.api.events.v1beta1.EventRhttpsj +x-kubernetes-actionpost +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event version: v1beta1 -*› -extensions_v1beta1delete an Ingress*(deleteExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ù, +events_v1beta1delete collection of Event*,deleteEventsV1beta1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - Unauthorized +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -jV -x-kubernetes-group-version-kind31kind: Ingress -version: v1beta1 -group: extensions -B† -extensions_v1beta1&partially update the specified Ingress*'patchExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event version: v1beta1 -J4 -20".pathname of the Ingress"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Þ -7/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path}¢› -core_v1$connect GET requests to proxy of Pod**connectCoreV1GetNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jQ -x-kubernetes-group-version-kind.,group: "" -kind: PodProxyOptions -version: v1 -› -core_v1$connect PUT requests to proxy of Pod**connectCoreV1PutNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jQ -x-kubernetes-group-version-kind.,group: "" -kind: PodProxyOptions -version: v1 -" -core_v1%connect POST requests to proxy of Pod*+connectCoreV1PostNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jQ -x-kubernetes-group-version-kind.,group: "" -kind: PodProxyOptions -version: v1 -*¡ -core_v1'connect DELETE requests to proxy of Pod*-connectCoreV1DeleteNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jQ -x-kubernetes-group-version-kind.,version: v1 -group: "" -kind: PodProxyOptions -2£ -core_v1(connect OPTIONS requests to proxy of Pod*.connectCoreV1OptionsNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,version: v1 -group: "" -kind: PodProxyOptions -j! -x-kubernetes-action -connect -: -core_v1%connect HEAD requests to proxy of Pod*+connectCoreV1HeadNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jQ -x-kubernetes-group-version-kind.,group: "" -kind: PodProxyOptions -version: v1 -BŸ -core_v1&connect PATCH requests to proxy of Pod*,connectCoreV1PatchNamespacedPodProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,group: "" -kind: PodProxyOptions -version: v1 -j! -x-kubernetes-action -connect -J< -:8"6pathname of the PodProxyOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜J5 -31"/pathpath to the resource"path*string˜Ja -_][queryAPath is the URL path to use for the current proxy request to pod."path2string Õ -=/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}/status“ó -apps_v1&read status of the specified DaemonSet*#readAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jM -x-kubernetes-group-version-kind*(version: v1 -group: apps -kind: DaemonSet -º -apps_v1)replace status of the specified DaemonSet*&replaceAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.apps.v1.DaemonSetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -Bò -apps_v12partially update status of the specified DaemonSet*$patchAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -J6 -42"0pathname of the DaemonSet"name*string˜J` +j* +x-kubernetes-actiondeletecollection +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¼) -O/apis/autoscaling/v2beta1/watch/namespaces/{namespace}/horizontalpodautoscalersè(ú -autoscaling_v2beta1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*/apis/apps/v1/watch/namespaces/{namespace}/statefulsets/{name})å +apps_v1²watch changes to an object of kind StatefulSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -2358,13 +1934,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet +version: v1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -2379,7 +1954,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 +64"2pathname of the StatefulSet"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -2388,36 +1965,36 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean £ -+/apis/admissionregistration.k8s.io/v1beta1/óð -admissionregistration_v1beta1get available resources*+getAdmissionregistrationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ú +/apis/storage.k8s.io/À½ +storageget information of a group*getStorageAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi  401  - UnauthorizedRhttpsÔ) -@/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs/{name})ë - batch_v1beta1®watch changes to an object of kind CronJob. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupRhttps•' +#/apis/coordination.k8s.io/v1/leasesí&á +coordination_v1#list or watch objects of kind Lease*'listCoordinationV1LeaseForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.coordination.v1.LeaseList  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -j -x-kubernetes-actionwatch + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease +version: v1 +j +x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -2432,9 +2009,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the CronJob"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -2443,154 +2018,146 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean · -!/api/v1/nodes/{name}/proxy/{path}‘” -core_v1%connect GET requests to proxy of Node*!connectCoreV1GetNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions -version: v1 -j! -x-kubernetes-action -connect -” -core_v1%connect PUT requests to proxy of Node*!connectCoreV1PutNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-version: v1 -group: "" -kind: NodeProxyOptions -"– -core_v1&connect POST requests to proxy of Node*"connectCoreV1PostNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions -version: v1 -*š -core_v1(connect DELETE requests to proxy of Node*$connectCoreV1DeleteNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions -version: v1 -j! -x-kubernetes-action -connect -2œ -core_v1)connect OPTIONS requests to proxy of Node*%connectCoreV1OptionsNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean «\ + /apis/storage.k8s.io/v1/csinodes†\ý% + +storage_v1%list or watch objects of kind CSINode*listStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J] +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.storage.v1.CSINodeList  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20kind: CSINode version: v1 -j! -x-kubernetes-action -connect -:– -core_v1&connect HEAD requests to proxy of Node*"connectCoreV1HeadNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +group: storage.k8s.io +j +x-kubernetes-actionlist +"æ + +storage_v1create a CSINode*createStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.storage.v1.CSINodeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode +D +202= +; +Accepted/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20group: storage.k8s.io +kind: CSINode version: v1 -B˜ -core_v1'connect PATCH requests to proxy of Node*#connectCoreV1PatchNodeProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +j +x-kubernetes-actionpost +*É, + +storage_v1delete collection of CSINode* deleteStorageV1CollectionCSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions -version: v1 -J= -;9"7pathname of the NodeProxyOptions"name*string˜J5 -31"/pathpath to the resource"path*string˜Jb -`^\queryBPath is the URL path to use for the current proxy request to node."path2string ‡' -/apis/batch/v1beta1/cronjobsæ&Ú - batch_v1beta1%list or watch objects of kind CronJob*'listBatchV1beta1CronJobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.batch.v1beta1.CronJobList + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20version: v1 +group: storage.k8s.io +kind: CSINode +j* +x-kubernetes-actiondeletecollection +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ñ& +/api/v1/componentstatusesÓ&Ç +core_v1$list objects of kind ComponentStatus*listCoreV1ComponentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.core.v1.ComponentStatusList  401  UnauthorizedRhttpsj x-kubernetes-actionlist jQ -x-kubernetes-group-version-kind.,version: v1beta1 -group: batch -kind: CronJob +x-kubernetes-group-version-kind.,version: v1 +group: "" +kind: ComponentStatus J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -2614,9 +2181,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ³) -Q/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindingsÝ(ï -rbacAuthorization_v1beta1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*6watchRbacAuthorizationV1beta1NamespacedRoleBindingList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ä' +/apis/apps/v1/watch/replicasetsÀ'´ +apps_v1vwatch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.*)watchAppsV1ReplicaSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -2626,13 +2193,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet +version: v1 +j# x-kubernetes-action  watchlist -ji -x-kubernetes-group-version-kindFDkind: RoleBinding -version: v1beta1 -group: rbac.authorization.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -2647,8 +2214,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -2657,9 +2223,153 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —) -J/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolesÈ(Ú -rbacAuthorization_v1beta1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*/watchRbacAuthorizationV1beta1NamespacedRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ä +group: scheduling.k8s.io +kind: PriorityClass version: v1beta1 -B¶ -policy_v1beta1<":pathname of the PodDisruptionBudget"name*string˜J` +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the NetworkPolicy"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¢a -J/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurationsÓ`¦' -admissionregistration_v1beta1listAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ð\ +%/api/v1/namespaces/{namespace}/events¦\ê% +core_v1#list or watch objects of kind Event*listCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -2940,58 +2604,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‡ -l -200e -c -OK] -[ -Y#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.EventList  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjG +x-kubernetes-group-version-kind$"group: "" +kind: Event +version: v1 +j x-kubernetes-actionlist -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 -"Œ -admissionregistration_v1beta1'create a ValidatingWebhookConfiguration*@createAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bk -i -gbodybody *W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationBž +"Å +core_v1create an Event*createCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B< +: +8bodybody *( +&#/definitions/io.k8s.api.core.v1.EventBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jâ -m -201f -d -CreatedY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration -n -202g -e -AcceptedY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÕ +9 +2002 +0 +OK* +( +&#/definitions/io.k8s.api.core.v1.Event +> +2017 +5 +Created* +( +&#/definitions/io.k8s.api.core.v1.Event +? +2028 +6 +Accepted* +( +&#/definitions/io.k8s.api.core.v1.Event  401  - Unauthorized -h -200a -_ -OKY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationRhttpsj -x-kubernetes-group-version-kind\Zversion: v1beta1 -group: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -j + UnauthorizedRhttpsj x-kubernetes-actionpost -*Ç- -admissionregistration_v1beta13delete collection of ValidatingWebhookConfiguration*JdeleteAdmissionregistrationV1beta1CollectionValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event +version: v1 +*», +core_v1delete collection of Event*%deleteCoreV1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -3019,70 +2683,116 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* +x-kubernetes-actiondeletecollection +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string á +//api/v1/namespaces/{namespace}/pods/{name}/exec­  +core_v1#connect GET requests to exec of Pod*!connectCoreV1GetNamespacedPodExec2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ½- -J/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations/{name}î,ð -admissionregistration_v1/read the specified MutatingWebhookConfiguration*7readAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J| -a -200Z -X -OKR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jP +x-kubernetes-group-version-kind-+group: "" +kind: PodExecOptions +version: v1 +"’ +core_v1$connect POST requests to exec of Pod*"connectCoreV1PostNamespacedPodExec2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: "" +kind: PodExecOptions +version: v1 +j! +x-kubernetes-action +connect +Ju +sqoqueryRCommand is the remote command to execute. argv array. Not executed within a shell."command2string J˜ +•’querypContainer in which to execute the command. Defaults to only container if there is only one container in the pod." container2string J; +97"5pathname of the PodExecOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜Jq +omkqueryNRedirect the standard error stream of the pod for this call. Defaults to true."stderr2boolean Jq +omkqueryORedirect the standard input stream of the pod for this call. Defaults to false."stdin2boolean Jr +pnlqueryORedirect the standard output stream of the pod for this call. Defaults to true."stdout2boolean Jx +vtrqueryXTTY if true indicates that a tty will be allocated for the exec call. Defaults to false."tty2boolean ¨, +K/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers/{name}Ø+· +autoscaling_v1*read the specified HorizontalPodAutoscaler*2readAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jm +R +200K +I +OKC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler  401  UnauthorizedRhttpsj x-kubernetes-actionget -jx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler version: v1 -ÿ -admissionregistration_v12replace the specified MutatingWebhookConfiguration*:replaceAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bd -b -`bodybody *P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationBž +¨ +autoscaling_v1-replace the specified HorizontalPodAutoscaler*5replaceAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BU +S +Qbodybody *A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä -a -200Z -X -OKR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration -f -201_ -] -CreatedR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÆ +W +201P +N +CreatedC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsj + Unauthorized +R +200K +I +OKC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerRhttpsj x-kubernetes-actionput -jx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler version: v1 -*è -admissionregistration_v1%delete a MutatingWebhookConfiguration*9deleteAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*¾ +autoscaling_v1 delete a HorizontalPodAutoscaler*4deleteAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -3107,53 +2817,54 @@ I  UnauthorizedRhttpsj x-kubernetes-action delete -jx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration -version: v1 -Bï -admissionregistration_v1;partially update the specified MutatingWebhookConfiguration*8patchAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler +version: v1 +B¶ +autoscaling_v16partially update the specified HorizontalPodAutoscaler*3patchAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J| +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jm +R +200K +I +OKC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler  401  - Unauthorized -a -200Z -X -OKR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationRhttpsjx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionpatch -JI -GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ô) -P/apis/admissionregistration.k8s.io/v1/watch/mutatingwebhookconfigurations/{name}Ÿ)È -admissionregistration_v1Ãwatch changes to an object of kind MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*8watchAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler +version: v1 +JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ú& +/apis/batch/v1/jobsÂ&¶ +batch_v1!list or watch objects of kind Job*listBatchV1JobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JW +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.batch.v1.JobList  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj -x-kubernetes-actionwatch -jx -x-kubernetes-group-version-kindUSversion: v1 -group: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration + UnauthorizedRhttpsj +x-kubernetes-actionlist +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3168,8 +2879,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JI -GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -3178,9 +2888,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¨* -Q/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}Ò)ž -autoscaling_v1¾watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*3watchAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü( +;/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims¼(Î +core_v1watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.*.watchCoreV1NamespacedPersistentVolumeClaimList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -3190,12 +2900,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jb -x-kubernetes-group-version-kind?=kind: HorizontalPodAutoscaler -version: v1 -group: autoscaling + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42version: v1 +group: "" +kind: PersistentVolumeClaim +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3210,8 +2921,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -3221,210 +2931,108 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ -"/apis/coordination.k8s.io/v1beta1/áÞ -coordination_v1beta1get available resources*"getCoordinationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps±\ -#/api/v1/namespaces/{namespace}/pods‰\â% -core_v1!list or watch objects of kind Pod*listCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JV +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Î- +C/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}†-ò +apiextensions_v1beta1+read the specified CustomResourceDefinition*0readApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J’  401  Unauthorized -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.PodListRhttpsj -x-kubernetes-actionlist -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -"¶ -core_v1 create a Pod*createCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: -8 -6bodybody *& -$#/definitions/io.k8s.api.core.v1.PodBž +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionRhttpsj +x-kubernetes-actionget +jq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +¬ + +apiextensions_v1beta1.replace the specified CustomResourceDefinition*3replaceApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bz +x +vbodybody *f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÏ -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod -< -2015 -3 -Created( -& -$#/definitions/io.k8s.api.core.v1.Pod -= -2026 -4 -Accepted( -& -$#/definitions/io.k8s.api.core.v1.Pod +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -*µ, -core_v1delete collection of Pod*#deleteCoreV1CollectionNamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + Unauthorized +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +| +201u +s +Createdh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionRhttpsj +x-kubernetes-actionput +jq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +*Ó +apiextensions_v1beta1!delete a CustomResourceDefinition*2deleteApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string å ->/apis/apps/v1/namespaces/{namespace}/deployments/{name}/status¢÷ -apps_v1'read status of the specified Deployment*$readAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -À -apps_v1*replace status of the specified Deployment*'replaceAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.apps.v1.DeploymentBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment - -401 - - Unauthorized -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.DeploymentRhttpsj -x-kubernetes-actionput -jN -x-kubernetes-group-version-kind+)kind: Deployment -version: v1 -group: apps -Bö -apps_v13partially update status of the specified Deployment*%patchAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN + UnauthorizedRhttpsj +x-kubernetes-action delete +jq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +Bñ +apiextensions_v1beta17partially update the specified CustomResourceDefinition*1patchApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J’ +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -J7 -53"1pathname of the Deployment"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +jq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +JE +CA"?path$name of the CustomResourceDefinition"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string ‚ #/apis/flowcontrol.apiserver.k8s.io/Ú× flowcontrolApiserverget information of a group*getFlowcontrolApiserverAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi @@ -3437,137 +3045,24 @@ E  401  - UnauthorizedRhttpsÑ -/apis/node.k8s.io/º· -nodeget information of a group*getNodeAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttpsÛ) -1/apis/scheduling.k8s.io/v1/priorityclasses/{name}¥)ˆ - scheduling_v1 read the specified PriorityClass*readSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 -ã - scheduling_v1#replace the specified PriorityClass* replaceSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° - -401 - - Unauthorized -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass -L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClassRhttpsj -x-kubernetes-actionput -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 -*š - scheduling_v1delete a PriorityClass*deleteSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - Unauthorized -L -200E + UnauthorizedRhttpsõ& +/api/v1/podtemplatesÜ&Ð +core_v1)list or watch objects of kind PodTemplate*%listCoreV1PodTemplateForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J^ C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 -B‡ - scheduling_v1,partially update the specified PriorityClass*patchSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass +200< +: +OK4 +2 +0#/definitions/io.k8s.api.core.v1.PodTemplateList  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: "" +kind: PodTemplate version: v1 -j -x-kubernetes-actionpatch -J: -86"4pathname of the PriorityClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ”) -;/apis/storage.k8s.io/v1beta1/watch/volumeattachments/{name}Ô(‰ -storage_v1beta1·watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jc -x-kubernetes-group-version-kind@>kind: VolumeAttachment -version: v1beta1 -group: storage.k8s.io +j +x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3582,8 +3077,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J= -;9"7pathname of the VolumeAttachment"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -3592,24 +3086,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ë& -/api/v1/configmapsÔ&È -core_v1'list or watch objects of kind ConfigMap*#listCoreV1ConfigMapForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ConfigMapList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¾) +6/api/v1/watch/namespaces/{namespace}/configmaps/{name}ƒ)Ý +core_v1°watch changes to an object of kind ConfigMap. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jK + UnauthorizedRhttpsjK x-kubernetes-group-version-kind(&group: "" kind: ConfigMap version: v1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3624,7 +3118,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 +42"0pathname of the ConfigMap"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -3633,125 +3129,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean å* -2/apis/apiregistration.k8s.io/v1/apiservices/{name}®*¥ -apiregistration_v1read the specified APIService*readApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jy -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -j` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -® -apiregistration_v1 replace the specified APIService*"replaceApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ba -_ -]bodybody *M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService -c -201\ -Z -CreatedO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -*¡ -apiregistration_v1delete an APIService*!deleteApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -j` -x-kubernetes-group-version-kind=;version: v1 -kind: APIService -group: apiregistration.k8s.io -B¤ -apiregistration_v1)partially update the specified APIService* patchApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jy -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService - -401 - - UnauthorizedRhttpsj` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -j -x-kubernetes-actionpatch -J7 -53"1pathname of the APIService"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string •' -#/apis/coordination.k8s.io/v1/leasesí&á -coordination_v1#list or watch objects of kind Lease*'listCoordinationV1LeaseForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ï( +I/apis/admissionregistration.k8s.io/v1/watch/mutatingwebhookconfigurations¡(• +admissionregistration_v1ˆwatch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.* -< -OK6 -4 -2#/definitions/io.k8s.api.coordination.v1.LeaseListRhttpsj -x-kubernetes-actionlist -jX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jx +x-kubernetes-group-version-kindUSversion: v1 +group: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3775,9 +3171,129 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ’( -./apis/coordination.k8s.io/v1beta1/watch/leasesß'Ó -coordination_v1beta1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*1watchCoordinationV1beta1LeaseListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean „a +H/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations·`ž' +admissionregistration_v1beta1:list or watch objects of kind MutatingWebhookConfiguration*createAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bi +g +ebodybody *U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÜ + +401 + + Unauthorized +f +200_ +] +OKW +U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration +k +201d +b +CreatedW +U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration +l +202e +c +AcceptedW +U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationRhttpsj +x-kubernetes-actionpost +j} +x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +version: v1beta1 +*Á- +admissionregistration_v1beta11delete collection of MutatingWebhookConfiguration*HdeleteAdmissionregistrationV1beta1CollectionMutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +j} +x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +version: v1beta1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string È' +/api/v1/watch/events¯'£ +core_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*$watchCoreV1EventListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -3790,10 +3306,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -j] -x-kubernetes-group-version-kind:8version: v1beta1 -group: coordination.k8s.io -kind: Lease +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -3817,9 +3333,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×^ -F/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindingsŒ^³& -rbacAuthorization_v1)list or watch objects of kind RoleBinding*,listRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ï_ +bodybody *. -,#/definitions/io.k8s.api.rbac.v1.RoleBindingBž +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1beta1 +"ª + +certificates_v1beta1"create a CertificateSigningRequest*2createCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] +[ +Ybodybody *I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.RoleBinding -D -201= -; -Created0 -. -,#/definitions/io.k8s.api.rbac.v1.RoleBinding -E -202> -< -Accepted0 -. -,#/definitions/io.k8s.api.rbac.v1.RoleBinding +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest +_ +201X +V +CreatedK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest +` +202Y +W +AcceptedK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding -version: v1 -*þ, -rbacAuthorization_v1 delete collection of RoleBinding*8deleteRbacAuthorizationV1CollectionNamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1beta1 +*- +certificates_v1beta1.delete collection of CertificateSigningRequest* -< -Created1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver -version: v1 -*í - -storage_v1delete a CSIDriver*deleteStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J£ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver -F -202? -= -Accepted1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver -version: v1 -Bë - -storage_v1(partially update the specified CSIDriver*patchStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ -@ -2009 +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1beta1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ú' +4/apis/rbac.authorization.k8s.io/v1beta1/rolebindings¡'• +rbacAuthorization_v1beta1)list or watch objects of kind RoleBinding*7listRbacAuthorizationV1beta1RoleBindingForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jc +H +200A +? +OK9 7 -OK1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver -version: v1 -J6 -42"0pathname of the CSIDriver"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Í& - /api/v1/pods¼&° -core_v1!list or watch objects of kind Pod*listCoreV1PodForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.PodList +5#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList  401  - UnauthorizedRhttpsjE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 j x-kubernetes-actionlist J‚ @@ -4084,8 +3495,8 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± ®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë) -=/apis/apps/v1/watch/namespaces/{namespace}/replicasets/{name}‰)â -apps_v1±watch changes to an object of kind ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +=/apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}‰)â +apps_v1±watch changes to an object of kind Deployment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -4099,7 +3510,7 @@ G x-kubernetes-actionwatch jN x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet +kind: Deployment version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -4116,7 +3527,7 @@ This field is not supported when watch is true. Clients may start a watch from t limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the ReplicaSet"name*string˜J` +53"1pathname of the Deployment"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -4126,41 +3537,160 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¼* -V/apis/autoscaling/v2beta1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}á)­ -autoscaling_v2beta1¾watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*8watchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¹^ +D/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolesð]«& +rbacAuthorization_v1beta1"list or watch objects of kind Role**listRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + ÷ ô ñ queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.rbac.v1beta1.RoleList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +"‘ +rbacAuthorization_v1beta1 create a Role*,createRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.rbac.v1beta1.RoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já +C +202< +: +Accepted. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role + +401 + + Unauthorized += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.rbac.v1beta1.RoleRhttpsj +x-kubernetes-actionpost +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +*ø, +rbacAuthorization_v1beta1delete collection of Role*6deleteRbacAuthorizationV1beta1CollectionNamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* +x-kubernetes-actiondeletecollection +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ž( +1/apis/apiregistration.k8s.io/v1/watch/apiservicesØ'Ì +apiregistration_v1vwatch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.*$watchApiregistrationV1APIServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j` +x-kubernetes-group-version-kind=;kind: APIService +group: apiregistration.k8s.io +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -4169,9 +3699,51 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean á -/apis/node.k8s.io/v1/ÇÄ -node_v1get available resources*getNodeV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean þ' +)/apis/coordination.k8s.io/v1/watch/leasesÐ'Ä +coordination_v1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*,watchCoordinationV1LeaseListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease +version: v1 +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü +/apis/authorization.k8s.io/v1/ÙÖ +authorization_v1get available resources*getAuthorizationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp U 200N L @@ -4181,24 +3753,25 @@ B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsÁ' -//apis/rbac.authorization.k8s.io/v1/rolebindings' -rbacAuthorization_v1)list or watch objects of kind RoleBinding*2listRbacAuthorizationV1RoleBindingForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.rbac.v1.RoleBindingList + UnauthorizedRhttpsù( +L/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations¨(œ +flowcontrolApiserver_v1beta1†watch individual changes to a list of PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*>watchFlowcontrolApiserverV1beta1PriorityLevelConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding -version: v1 -j -x-kubernetes-actionlist + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj{ +x-kubernetes-group-version-kindXVkind: PriorityLevelConfiguration +version: v1beta1 +group: flowcontrol.apiserver.k8s.io +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -4222,10 +3795,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷' -,/apis/storage.k8s.io/v1/watch/storageclassesÆ'º - -storage_v1xwatch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1StorageClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —) +F/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgetsÌ(Þ +policy_v1beta1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*3watchPolicyV1beta1NamespacedPodDisruptionBudgetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -4238,10 +3810,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -4256,7 +3828,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -4265,55 +3838,54 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ã- -L/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations/{name}’-ø -admissionregistration_v11read the specified ValidatingWebhookConfiguration*9readAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ’) +0/api/v1/namespaces/{namespace}/configmaps/{name}Ý(á +core_v1read the specified ConfigMap*readCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap  401  UnauthorizedRhttpsj x-kubernetes-actionget -jz -x-kubernetes-group-version-kindWUkind: ValidatingWebhookConfiguration +jK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap version: v1 -group: admissionregistration.k8s.io -‹ - -admissionregistration_v14replace the specified ValidatingWebhookConfiguration* +<bodybody *, +*#/definitions/io.k8s.api.core.v1.ConfigMapBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jè -c -200\ -Z -OKT -R -P#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration -h -201a -_ -CreatedT -R -P#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap  401  - UnauthorizedRhttpsjz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*î -admissionregistration_v1'delete a ValidatingWebhookConfiguration*;deleteAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap +version: v1 +*ý +core_v1delete a ConfigMap*deleteCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -4338,56 +3910,174 @@ I ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj x-kubernetes-action delete -jz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration +jK +x-kubernetes-group-version-kind(&version: v1 +group: "" +kind: ConfigMap +Bà +core_v1(partially update the specified ConfigMap*patchCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap version: v1 -B÷ -admissionregistration_v1=partially update the specified ValidatingWebhookConfiguration*:patchAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-actionpatch +J6 +42"0pathname of the ConfigMap"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ž +6/api/v1/namespaces/{namespace}/pods/{name}/portforwardÓ¥ +core_v1*connect GET requests to portforward of Pod*(connectCoreV1GetNamespacedPodPortforward2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PodPortForwardOptions +version: v1 +j! +x-kubernetes-action +connect +"§ +core_v1+connect POST requests to portforward of Pod*)connectCoreV1PostNamespacedPodPortforward2*/*:*/*J7 + +401 + + Unauthorized + +200 + +OK + ² +stringRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PodPortForwardOptions +version: v1 +j! +x-kubernetes-action +connect +JB +@>"<path!name of the PodPortForwardOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JY +WUSquery7List of ports to forward Required when using WebSockets"ports2integer ° +B/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/scaleé +core_v11read scale of the specified ReplicationController*.readCoreV1NamespacedReplicationControllerScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +Ü +core_v14replace scale of the specified ReplicationController*1replaceCoreV1NamespacedReplicationControllerScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +j +x-kubernetes-actionput +BŽ +core_v1=partially update scale of the specified ReplicationController*/patchCoreV1NamespacedReplicationControllerScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration +jP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale version: v1 -JK -IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ù -/apis/certificates.k8s.io/v1/×Ô -certificates_v1get available resources*getCertificatesV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +J2 +0.",pathname of the Scale"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ï( +0/api/v1/watch/namespaces/{namespace}/limitrangesš(¬ +core_v1vwatch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.*#watchCoreV1NamespacedLimitRangeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsÊ^ -A/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies„^«& - networking_v1+list or watch objects of kind NetworkPolicy*'listNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jL +x-kubernetes-group-version-kind)'kind: LimitRange +version: v1 +group: "" +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -4395,76 +4085,42 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.networking.v1.NetworkPolicyList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ó( +-/apis/storage.k8s.io/v1/watch/csinodes/{name}¡(ß + +storage_v1®watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy -version: v1 -j -x-kubernetes-actionlist -"¯ - networking_v1create a NetworkPolicy*)createNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicyBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jÿ -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy -L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy -M -202F -D -Accepted8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy - -401 - - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9kind: NetworkPolicy + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jU +x-kubernetes-group-version-kind20group: storage.k8s.io +kind: CSINode version: v1 -group: networking.k8s.io -j -x-kubernetes-actionpost -*î, - networking_v1"delete collection of NetworkPolicy*3deleteNetworkingV1CollectionNamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -4472,122 +4128,35 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the CSINode"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy -version: v1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¢ -'/api/v1/persistentvolumes/{name}/statusöƒ -core_v1-read status of the specified PersistentVolume* readCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume -version: v1 -Ø -core_v10replace status of the specified PersistentVolume*#replaceCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume -I -201B -@ -Created5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume -version: v1 -j -x-kubernetes-actionput -B‚ -core_v19partially update status of the specified PersistentVolume*!patchCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jR -x-kubernetes-group-version-kind/-kind: PersistentVolume -version: v1 -group: "" -J= -;9"7pathname of the PersistentVolume"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string §' -/api/v1/persistentvolumeclaims„'ø -core_v13list or watch objects of kind PersistentVolumeClaim*/listCoreV1PersistentVolumeClaimForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh -M -200F -D -OK> -< -:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ì' +/api/v1/watch/secrets²'¦ +core_v1rwatch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.*%watchCoreV1SecretListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret version: v1 -j -x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -4611,110 +4180,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿+ -7/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}ƒ+¹ -apiregistration_v1beta1read the specified APIService*$readApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -Ì -apiregistration_v1beta1 replace the specified APIService*'replaceApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bf -d -bbodybody *R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jè -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService -h -201a -_ -CreatedT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -j -x-kubernetes-actionput -*° -apiregistration_v1beta1delete an APIService*&deleteApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -B¸ -apiregistration_v1beta1)partially update the specified APIService*%patchApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -J7 -53"1pathname of the APIService"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ô^ -;/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings´^Ù& -rbacAuthorization_v1beta10list or watch objects of kind ClusterRoleBinding*.listRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¹` +C/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurationsñ_Š' +admissionregistration_v1:list or watch objects of kind MutatingWebhookConfiguration*7listAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -4736,58 +4204,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj -O -200H -F -OK@ -> -<#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J€ +e +200^ +\ +OKV +T +R#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jp -x-kubernetes-group-version-kindMKversion: v1beta1 -group: rbac.authorization.k8s.io -kind: ClusterRoleBinding -"é -rbacAuthorization_v1beta1create a ClusterRoleBinding*0createRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN -L -Jbodybody *: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingBž +jx +x-kubernetes-group-version-kindUSversion: v1 +group: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +"Û + +admissionregistration_v1%create a MutatingWebhookConfiguration*9createAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bd +b +`bodybody *P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ -Q -202J -H -Accepted< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÍ +a +200Z +X +OKR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration +f +201_ +] +CreatedR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration +g +202` +^ +AcceptedR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration  401  - Unauthorized -K -200D -B -OK< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding -P -201I -G -Created< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionpost -jp -x-kubernetes-group-version-kindMKkind: ClusterRoleBinding -version: v1beta1 -group: rbac.authorization.k8s.io -*˜- -rbacAuthorization_v1beta1'delete collection of ClusterRoleBinding*:deleteRbacAuthorizationV1beta1CollectionClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jx +x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +version: v1 +*²- +admissionregistration_v11delete collection of MutatingWebhookConfiguration*CdeleteAdmissionregistrationV1CollectionMutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -4824,17 +4293,16 @@ C  401  - UnauthorizedRhttpsjp -x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1beta1 -j* + UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection +jx +x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +version: v1 JO -MKIquery-If 'true', then the output is pretty printed."pretty2string É\ -"/apis/storage.k8s.io/v1/csidrivers¢\…& - -storage_v1'list or watch objects of kind CSIDriver*listStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +MKIquery-If 'true', then the output is pretty printed."pretty2string –` +7/apis/apiextensions.k8s.io/v1/customresourcedefinitionsÚ_÷& +apiextensions_v16list or watch objects of kind CustomResourceDefinition*+listApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -4856,60 +4324,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.storage.v1.CSIDriverList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‘ +v +200o +m +OKg +e +c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver +jl +x-kubernetes-group-version-kindIGkind: CustomResourceDefinition version: v1 -"ô +group: apiextensions.k8s.io +"û -storage_v1create a CSIDriver*createStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC -A -?bodybody */ --#/definitions/io.k8s.api.storage.v1.CSIDriverBž +apiextensions_v1!create a CustomResourceDefinition*-createApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu +s +qbodybody *a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jê -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver -E -201> -< -Created1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver -F -202? -= -Accepted1 -/ --#/definitions/io.k8s.api.storage.v1.CSIDriver +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J€ +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +w +201p +n +Createdc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +x +202q +o +Acceptedc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver +jl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition version: v1 -*Ï, - -storage_v1delete collection of CSIDriver*"deleteStorageV1CollectionCSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ž- +apiextensions_v1-delete collection of CustomResourceDefinition*7deleteApiextensionsV1CollectionCustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -4948,134 +4415,217 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver +jl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition version: v1 JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ð\ -%/api/v1/namespaces/{namespace}/events¦\ê% -core_v1#list or watch objects of kind Event*listCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JX +MKIquery-If 'true', then the output is pretty printed."pretty2string ô, +>/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}±,Þ +apiextensions_v1+read the specified CustomResourceDefinition*+readApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J  401  Unauthorized -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.EventListRhttpsj -x-kubernetes-actionlist -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionRhttpsj +x-kubernetes-actionget +jl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition version: v1 -"Å -core_v1create an Event*createCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B< -: -8bodybody *( -&#/definitions/io.k8s.api.core.v1.EventBž +Ž + +apiextensions_v1.replace the specified CustomResourceDefinition*.replaceApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu +s +qbodybody *a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÕ -9 -2002 -0 -OK* -( -&#/definitions/io.k8s.api.core.v1.Event -> -2017 +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J† +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +w +201p +n +Createdc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jl +x-kubernetes-group-version-kindIGversion: v1 +group: apiextensions.k8s.io +kind: CustomResourceDefinition +*Ä +apiextensions_v1!delete a CustomResourceDefinition*-deleteApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1 +BÝ +apiextensions_v17partially update the specified CustomResourceDefinition*,patchApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1 +JE +CA"?path$name of the CustomResourceDefinition"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string É) +0/apis/networking.k8s.io/v1/ingressclasses/{name}”)„ + networking_v1read the specified IngressClass*readNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 5 -Created* -( -&#/definitions/io.k8s.api.core.v1.Event -? -2028 -6 -Accepted* -( -&#/definitions/io.k8s.api.core.v1.Event +3#/definitions/io.k8s.api.networking.v1.IngressClass  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass version: v1 -*», -core_v1delete collection of Event*%deleteCoreV1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-actionget +Ý + networking_v1"replace the specified IngressClass*replaceNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.networking.v1.IngressClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass +version: v1 +j +x-kubernetes-actionput +*˜ + networking_v1delete an IngressClass*deleteNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjG -x-kubernetes-group-version-kind$"group: "" -kind: Event + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass version: v1 -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Õ) -I/apis/certificates.k8s.io/v1beta1/watch/certificatesigningrequests/{name}‡)³ -certificates_v1beta1Àwatch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*1watchCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +j +x-kubernetes-action delete +Bƒ + networking_v1+partially update the specified IngressClass*patchNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass +version: v1 +j +x-kubernetes-actionpatch +J9 +75"3pathname of the IngressClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ñ) +L/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name} )ÿ +rbacAuthorization_v1«watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*&watchRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -5085,12 +4635,12 @@ G  401  - UnauthorizedRhttpsjq -x-kubernetes-group-version-kindNLkind: CertificateSigningRequest -version: v1beta1 -group: certificates.k8s.io -j + UnauthorizedRhttpsj x-kubernetes-actionwatch +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5105,8 +4655,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JF -DB"@path%name of the CertificateSigningRequest"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J1 +/-"+pathname of the Role"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5115,15 +4666,31 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ï] -:/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases°]“& -coordination_v1#list or watch objects of kind Lease*!listCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean §' +/api/v1/persistentvolumeclaims„'ø +core_v13list or watch objects of kind PersistentVolumeClaim*/listCoreV1PersistentVolumeClaimForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh +M +200F +D +OK> +< +:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList + +401 + + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +j +x-kubernetes-actionlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -5131,76 +4698,40 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.coordination.v1.LeaseList - -401 - - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 -j -x-kubernetes-actionlist -"… -coordination_v1create a Lease*#createCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.coordination.v1.LeaseBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ã) +7/api/v1/watch/namespaces/{namespace}/limitranges/{name}‡)à +core_v1±watch changes to an object of kind LimitRange. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I G -202@ -> -Accepted2 -0 -.#/definitions/io.k8s.api.coordination.v1.Lease +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.coordination.v1.Lease -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.coordination.v1.LeaseRhttpsj -x-kubernetes-actionpost -jX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange version: v1 -*Ü, -coordination_v1delete collection of Lease*-deleteCoordinationV1CollectionNamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -5208,36 +4739,20 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 +53"1pathname of the LimitRange"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jX -x-kubernetes-group-version-kind53version: v1 -group: coordination.k8s.io -kind: Lease -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ó( -5/apis/apps/v1/watch/namespaces/{namespace}/daemonsets™(« -apps_v1uwatch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.*"watchAppsV1NamespacedDaemonSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean µ( +3/apis/autoscaling/v1/watch/horizontalpodautoscalersý'ñ +autoscaling_v1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*=watchAutoscalingV1HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -5250,9 +4765,9 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -5268,8 +4783,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5278,24 +4792,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ú& -/apis/batch/v1/jobsÂ&¶ -batch_v1!list or watch objects of kind Job*listBatchV1JobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JW -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.JobList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×( +6/apis/apps/v1/watch/namespaces/{namespace}/replicasetsœ(® +apps_v1vwatch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.*#watchAppsV1NamespacedReplicaSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jH -x-kubernetes-group-version-kind%#version: v1 -group: batch -kind: Job + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet +version: v1 +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5310,7 +4825,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5319,15 +4835,43 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ©0 -'/api/v1/namespaces/{namespace}/servicesý/ò% -core_v1%list or watch objects of kind Service*listCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ð + /apis/policy/¾» +policyget information of a group*getPolicyAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttps) +;/apis/networking.k8s.io/v1beta1/watch/ingressclasses/{name}Í(† +networking_v1beta1³watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -5335,69 +4879,276 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 +75"3pathname of the IngressClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.ServiceList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean “ +I/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets/{name}/statusÅ£ + policy_v10read status of the specified PodDisruptionBudget*/readPolicyV1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -"Ò -core_v1create a Service*createCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.core.v1.ServiceBž + Unauthorized +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetRhttpsj +x-kubernetes-actionget +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +‚ + policy_v13replace status of the specified PodDisruptionBudget*2replacePolicyV1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÛ -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ +I +200B @ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.core.v1.Service -A -202: +OK: 8 -Accepted, -* -(#/definitions/io.k8s.api.core.v1.Service +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget +N +201G +E +Created: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jI -x-kubernetes-group-version-kind&$version: v1 -group: "" -kind: Service -J` + UnauthorizedRhttpsj +x-kubernetes-actionput +jY +x-kubernetes-group-version-kind64kind: PodDisruptionBudget +version: v1 +group: policy +B¢ + policy_v1<":pathname of the PodDisruptionBudget"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ý -/apis/batch/v1/ÉÆ -batch_v1get available resources*getBatchV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +MKIquery-If 'true', then the output is pretty printed."pretty2string ( +./apis/policy/v1beta1/watch/podsecuritypoliciesÚ'Î +policy_v1beta1}watch individual changes to a list of PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead.*'watchPolicyV1beta1PodSecurityPolicyList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj\ +x-kubernetes-group-version-kind97group: policy +kind: PodSecurityPolicy +version: v1beta1 +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ñ' +/api/v1/namespaces/{name}Ó'× +core_v1read the specified Namespace*readCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace +version: v1 +ž +core_v1replace the specified Namespace*replaceCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.core.v1.NamespaceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + Unauthorized += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.NamespaceRhttpsj +x-kubernetes-actionput +jK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace +version: v1 +*ó +core_v1delete a Namespace*deleteCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace +version: v1 +j +x-kubernetes-action delete +BÖ +core_v1(partially update the specified Namespace*patchCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace +version: v1 +j +x-kubernetes-actionpatch +J6 +42"0pathname of the Namespace"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¢( +/api/v1/watch/nodes/{name}ƒ(Ä +core_v1«watch changes to an object of kind Node. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J1 +/-"+pathname of the Node"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ð +/apis/discovery.k8s.io/v1/ÑÎ + discovery_v1get available resources*getDiscoveryV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp U 200N L @@ -5407,9 +5158,9 @@ B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsã( -9/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs¥(· - batch_v1beta1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*&watchBatchV1beta1NamespacedCronJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttps…) +E/apis/discovery.k8s.io/v1/watch/namespaces/{namespace}/endpointslices»(Í + discovery_v1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*+watchDiscoveryV1NamespacedEndpointSliceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -5419,13 +5170,13 @@ G  401  - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,kind: CronJob -version: v1beta1 -group: batch -j# + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +j] +x-kubernetes-group-version-kind:8kind: EndpointSlice +version: v1 +group: discovery.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5450,25 +5201,126 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ( -./apis/rbac.authorization.k8s.io/v1/watch/rolesÝ'Ñ -rbacAuthorization_v1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*0watchRbacAuthorizationV1RoleListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean å* +2/apis/apiregistration.k8s.io/v1/apiservices/{name}®*¥ +apiregistration_v1read the specified APIService*readApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jy +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +version: v1 +kind: APIService +® +apiregistration_v1 replace the specified APIService*"replaceApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ba +_ +]bodybody *M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ + +401 + + Unauthorized +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService +c +201\ +Z +CreatedO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceRhttpsj +x-kubernetes-actionput +j` +x-kubernetes-group-version-kind=;version: v1 +kind: APIService +group: apiregistration.k8s.io +*¡ +apiregistration_v1delete an APIService*!deleteApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +version: v1 +kind: APIService +B¤ +apiregistration_v1)partially update the specified APIService* patchApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jy  401  Unauthorized +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceRhttpsj +x-kubernetes-actionpatch +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +version: v1 +kind: APIService +J7 +53"1pathname of the APIService"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string í( +?/apis/events.k8s.io/v1beta1/watch/namespaces/{namespace}/events©(» +events_v1beta1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*%watchEventsV1beta1NamespacedEventList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# x-kubernetes-action  watchlist -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role -version: v1 +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5483,7 +5335,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5492,9 +5345,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean š] -*/api/v1/namespaces/{namespace}/limitrangesë\þ% -core_v1(list or watch objects of kind LimitRange*listCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ž +$/apis/authentication.k8s.io/v1beta1/åâ +authentication_v1beta1get available resources*$getAuthenticationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps”] +'/apis/storage.k8s.io/v1beta1/csidriversè\™& +storage_v1beta1'list or watch objects of kind CSIDriver*listStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5516,58 +5381,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J] +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.storage.v1beta1.CSIDriverList  401  - Unauthorized -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.core.v1.LimitRangeListRhttpsj + UnauthorizedRhttpsj\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +j x-kubernetes-actionlist -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange -version: v1 -"ç -core_v1create a LimitRange* createCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.core.v1.LimitRangeBž +"— +storage_v1beta1create a CSIDriver*createStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH +F +Dbodybody *4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange -D -202= -; -Accepted/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jù +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver +J +201C +A +Created6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver +K +202D +B +Accepted6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jL -x-kubernetes-group-version-kind)'kind: LimitRange -version: v1 -group: "" -*Ê, -core_v1delete collection of LimitRange**deleteCoreV1CollectionNamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j\ +x-kubernetes-group-version-kind97kind: CSIDriver +version: v1beta1 +group: storage.k8s.io +*Þ, +storage_v1beta1delete collection of CSIDriver*'deleteStorageV1beta1CollectionCSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -5606,60 +5471,59 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange -version: v1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ñ+ -R/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindings/{name}š+® -rbacAuthorization_v1beta1read the specified RoleBinding*1readRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +j\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¿+ +7/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}ƒ+¹ +apiregistration_v1beta1read the specified APIService*$readApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService  401  - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io version: v1beta1 +kind: APIService j x-kubernetes-actionget -ƒ -rbacAuthorization_v1beta1!replace the specified RoleBinding*4replaceRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingBž +Ì +apiregistration_v1beta1 replace the specified APIService*'replaceApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bf +d +bbodybody *R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding -I -201B -@ -Created5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jè +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService +h +201a +_ +CreatedT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io version: v1beta1 -*à -rbacAuthorization_v1beta1delete a RoleBinding*3deleteRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +kind: APIService +j +x-kubernetes-actionput +*° +apiregistration_v1beta1delete an APIService*&deleteApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -5682,124 +5546,63 @@ I  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -ji -x-kubernetes-group-version-kindFDkind: RoleBinding + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io version: v1beta1 -group: rbac.authorization.k8s.io -B­ -rbacAuthorization_v1beta1*partially update the specified RoleBinding*2patchRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +kind: APIService +j +x-kubernetes-action delete +B¸ +apiregistration_v1beta1)partially update the specified APIService*%patchApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J~  401  - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDkind: RoleBinding + Unauthorized +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io version: v1beta1 -group: rbac.authorization.k8s.io +kind: APIService j x-kubernetes-actionpatch -J8 -64"2pathname of the RoleBinding"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ”] -'/apis/storage.k8s.io/v1beta1/csidriversè\™& -storage_v1beta1'list or watch objects of kind CSIDriver*listStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.storage.v1beta1.CSIDriverList - -401 - - UnauthorizedRhttpsj\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver -version: v1beta1 -j -x-kubernetes-actionlist -"— -storage_v1beta1create a CSIDriver*createStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH -F -Dbodybody *4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jù -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver -J -201C -A -Created6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver -K -202D -B -Accepted6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver +J7 +53"1pathname of the APIService"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ã( +9/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs¥(· + batch_v1beta1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*&watchBatchV1beta1NamespacedCronJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob version: v1beta1 -j -x-kubernetes-actionpost -*Þ, -storage_v1beta1delete collection of CSIDriver*'deleteStorageV1beta1CollectionCSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -5807,35 +5610,19 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: storage.k8s.io -kind: CSIDriver -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ƒ( -//apis/networking.k8s.io/v1/watch/ingressclassesÏ'à - networking_v1xwatch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.*!watchNetworkingV1IngressClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ƒ) +E/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles¹(Ë +rbacAuthorization_v1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.**watchRbacAuthorizationV1NamespacedRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  @@ -5846,9 +5633,9 @@ G OKA ? =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass -version: v1 +x-kubernetes-group-version-kind:8version: v1 +group: rbac.authorization.k8s.io +kind: Role j# x-kubernetes-action  watchlist @@ -5866,7 +5653,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5875,24 +5663,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ô) -L/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases/{name}£) -coordination_v1beta1¬watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk - -401 - - Unauthorized +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ö' ++/apis/storage.k8s.io/v1beta1/watch/csinodesÆ'º +storage_v1beta1swatch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1beta1CSINodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj -x-kubernetes-actionwatch -j] -x-kubernetes-group-version-kind:8kind: Lease -version: v1beta1 -group: coordination.k8s.io +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jZ +x-kubernetes-group-version-kind75version: v1beta1 +group: storage.k8s.io +kind: CSINode J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -5907,9 +5696,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 -0.",pathname of the Lease"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -5918,134 +5705,135 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚- -P/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers/{name}­,Ë -autoscaling_v2beta2*read the specified HorizontalPodAutoscaler*7readAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jr +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean š] +*/api/v1/namespaces/{namespace}/limitrangesë\þ% +core_v1(list or watch objects of kind LimitRange*listCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J] +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.LimitRangeList  401  - Unauthorized -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerRhttpsj -x-kubernetes-actionget -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -Æ -autoscaling_v2beta2-replace the specified HorizontalPodAutoscaler*:replaceAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ -X -Vbodybody *F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBž + UnauthorizedRhttpsj +x-kubernetes-actionlist +jL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange +version: v1 +"ç +core_v1create a LimitRange* createCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.core.v1.LimitRangeBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÐ -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler -\ -201U -S -CreatedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange +D +202= +; +Accepted/ +- ++#/definitions/io.k8s.api.core.v1.LimitRange  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -*Í -autoscaling_v2beta2 delete a HorizontalPodAutoscaler*9deleteAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + UnauthorizedRhttpsj +x-kubernetes-actionpost +jL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange +version: v1 +*Ê, +core_v1delete collection of LimitRange**deleteCoreV1CollectionNamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jg -x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler -version: v2beta2 -group: autoscaling -BÊ -autoscaling_v2beta26partially update the specified HorizontalPodAutoscaler*8patchAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler - -401 - - UnauthorizedRhttpsjg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -j -x-kubernetes-actionpatch -JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjL +x-kubernetes-group-version-kind)'group: "" +kind: LimitRange +version: v1 +j* +x-kubernetes-actiondeletecollection +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ò( -A/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses¬(¾ - networking_v1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*&watchNetworkingV1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jX -x-kubernetes-group-version-kind53version: v1 -group: networking.k8s.io -kind: Ingress -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +MKIquery-If 'true', then the output is pretty printed."pretty2string ˆ] +./apis/batch/v1/namespaces/{namespace}/cronjobsÕ\ø% +batch_v1%list or watch objects of kind CronJob*listBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -6053,136 +5841,270 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Î- -C/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}†-ò -apiextensions_v1beta1+read the specified CustomResourceDefinition*0readApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J’ -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.batch.v1.CronJobList  401  - UnauthorizedRhttpsjq -x-kubernetes-group-version-kindNLkind: CustomResourceDefinition -version: v1beta1 -group: apiextensions.k8s.io -j -x-kubernetes-actionget -¬ - -apiextensions_v1beta1.replace the specified CustomResourceDefinition*3replaceApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bz -x -vbodybody *f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionBž + UnauthorizedRhttpsj +x-kubernetes-actionlist +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob +version: v1 +"Û +batch_v1create a CronJob*createBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B? += +;bodybody *+ +)#/definitions/io.k8s.api.batch.v1.CronJobBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition -| -201u -s -Createdh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ +A +201: +8 +Created- ++ +)#/definitions/io.k8s.api.batch.v1.CronJob +B +202; +9 +Accepted- ++ +)#/definitions/io.k8s.api.batch.v1.CronJob  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 -*Ó -apiextensions_v1beta1!delete a CustomResourceDefinition*2deleteApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + Unauthorized +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.batch.v1.CronJobRhttpsj +x-kubernetes-actionpost +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob +version: v1 +*Æ, +batch_v1delete collection of CronJob*(deleteBatchV1CollectionNamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jq -x-kubernetes-group-version-kindNLversion: v1beta1 -group: apiextensions.k8s.io -kind: CustomResourceDefinition -Bñ -apiextensions_v1beta17partially update the specified CustomResourceDefinition*1patchApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jL +x-kubernetes-group-version-kind)'version: v1 +group: batch +kind: CronJob +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ò +E/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/statusˆÐ +certificates_v16read status of the specified CertificateSigningRequest*1readCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +Ç +certificates_v19replace status of the specified CertificateSigningRequest*4replaceCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX +V +Tbodybody *D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÌ +Z +201S +Q +CreatedF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest + +401 + + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsj +x-kubernetes-actionput +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +BÏ +certificates_v1Bpartially update status of the specified CertificateSigningRequest*2patchCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J’ -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jp  401  - UnauthorizedRhttpsj + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsj x-kubernetes-actionpatch +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +JF +DB"@path%name of the CertificateSigningRequest"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string  +J/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}/statusÎä +certificates_v1beta16read status of the specified CertificateSigningRequest*6readCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1beta1 -JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ×' -/api/v1/watch/endpoints»'¯ -core_v1uwatch individual changes to a list of Endpoints. deprecated: use the 'watch' parameter with a list operation instead.*(watchCoreV1EndpointsListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +å +certificates_v1beta19replace status of the specified CertificateSigningRequest*9replaceCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] +[ +Ybodybody *I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÖ +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest +_ +201X +V +CreatedK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest  401  - Unauthorized + UnauthorizedRhttpsj +x-kubernetes-actionput +jq +x-kubernetes-group-version-kindNLkind: CertificateSigningRequest +version: v1beta1 +group: certificates.k8s.io +Bã +certificates_v1beta1Bpartially update status of the specified CertificateSigningRequest*7patchCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jq +x-kubernetes-group-version-kindNLversion: v1beta1 +group: certificates.k8s.io +kind: CertificateSigningRequest +JF +DB"@path%name of the CertificateSigningRequest"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Û( +7/apis/apps/v1/watch/namespaces/{namespace}/statefulsetsŸ(± +apps_v1wwatch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.*$watchAppsV1NamespacedStatefulSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints +jO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -6198,7 +6120,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -6207,31 +6130,15 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ª) -2/api/v1/watch/namespaces/{namespace}/events/{name}ó(Ñ -core_v1¬watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jG -x-kubernetes-group-version-kind$"kind: Event -version: v1 -group: "" -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´/ +/api/v1/namespaces/ð% +core_v1'list or watch objects of kind Namespace*listCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -6239,63 +6146,68 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 -0.",pathname of the Event"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü( -;/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims¼(Î -core_v1watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.*.watchCoreV1NamespacedPersistentVolumeClaimList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.NamespaceList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü( -;/api/v1/watch/namespaces/{namespace}/replicationcontrollers¼(Î -core_v1watch individual changes to a list of ReplicationController. deprecated: use the 'watch' parameter with a list operation instead.*.watchCoreV1NamespacedReplicationControllerList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +j +x-kubernetes-actionlist +"Ö +core_v1create a Namespace*createCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.core.v1.NamespaceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.Namespace +C +202< +: +Accepted. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace +version: v1 +j +x-kubernetes-actionpost +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ð' +/api/v1/watch/servicesµ'© +core_v1swatch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.*&watchCoreV1ServiceListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -6305,13 +6217,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +j# x-kubernetes-action  watchlist -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -6326,8 +6238,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -6336,82 +6247,220 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹^ -4/apis/rbac.authorization.k8s.io/v1beta1/clusterrolesÒ]½& -rbacAuthorization_v1beta1)list or watch objects of kind ClusterRole*'listRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  +S/apis/authorization.k8s.io/v1beta1/namespaces/{namespace}/localsubjectaccessreviewsê "ú +authorization_v1beta1!create a LocalSubjectAccessReview* +<bodybody *, +*#/definitions/io.k8s.api.core.v1.ConfigMapBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap +C +202< +: +Accepted. +, +*#/definitions/io.k8s.api.core.v1.ConfigMap + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap +version: v1 +j x-kubernetes-actionpost -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole -version: v1beta1 -*ƒ- -rbacAuthorization_v1beta1 delete collection of ClusterRole*3deleteRbacAuthorizationV1beta1CollectionClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ç, +core_v1delete collection of ConfigMap*)deleteCoreV1CollectionNamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -6450,29 +6499,31 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole -version: v1beta1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ×& -/api/v1/eventsÄ&¸ -core_v1#list or watch objects of kind Event*listCoreV1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.EventList +jK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¼) +O/apis/autoscaling/v2beta2/watch/namespaces/{namespace}/horizontalpodautoscalersè(ú +autoscaling_v2beta2ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.* -< -Created1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale - -401 - - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale -version: v1 -j -x-kubernetes-actionput -Bø -apps_v12partially update scale of the specified ReplicaSet*$patchAppsV1NamespacedReplicaSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¦) +N/apis/storage.k8s.io/v1beta1/watch/namespaces/{namespace}/csistoragecapacitiesÓ(å +storage_v1beta1~watch individual changes to a list of CSIStorageCapacity. deprecated: use the 'watch' parameter with a list operation instead.*3watchStorageV1beta1NamespacedCSIStorageCapacityList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale -version: v1 -j -x-kubernetes-actionpatch -J2 -0.",pathname of the Scale"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ð) ->/apis/apps/v1/watch/namespaces/{namespace}/statefulsets/{name})å -apps_v1²watch changes to an object of kind StatefulSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsje +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity +version: v1beta1 +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -6600,8 +6581,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 -64"2pathname of the StatefulSet"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -6611,24 +6591,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ø& -/apis/apps/v1/deploymentsÚ&Î -apps_v1(list or watch objects of kind Deployment*$listAppsV1DeploymentForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J] -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.apps.v1.DeploymentList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean * +Q/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslices/{name}º) +discovery_v1beta1´watch changes to an object of kind EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*,watchDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jN -x-kubernetes-group-version-kind+)kind: Deployment -version: v1 -group: apps + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jb +x-kubernetes-group-version-kind?=group: discovery.k8s.io +kind: EndpointSlice +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -6643,7 +6623,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the EndpointSlice"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -6652,9 +6634,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ð' -/api/v1/watch/servicesµ'© -core_v1swatch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.*&watchCoreV1ServiceListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é) +F/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}ž)ú +extensions_v1beta1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -6664,13 +6646,12 @@ G  401  - UnauthorizedRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -6685,7 +6666,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the Ingress"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -6694,216 +6677,84 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ž^ -8/apis/apps/v1/namespaces/{namespace}/controllerrevisionsá] & -apps_v10list or watch objects of kind ControllerRevision*&listAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‡+ +=/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}Å*° +flowcontrolApiserver_v1beta1read the specified FlowSchema*)readFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Je J 200C A OK; 9 -7#/definitions/io.k8s.api.apps.v1.ControllerRevisionList +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision -version: v1 -"¡ -apps_v1create a ControllerRevision*(createAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevisionBž + UnauthorizedRhttpsj +x-kubernetes-actionget +jk +x-kubernetes-group-version-kindHFversion: v1beta1 +group: flowcontrol.apiserver.k8s.io +kind: FlowSchema +‘ +flowcontrolApiserver_v1beta1 replace the specified FlowSchema*,replaceFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM +K +Ibodybody *9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¶ +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +O +201H +F +Created; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema  401  - Unauthorized -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevisionRhttpsj -x-kubernetes-actionpost -jV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision -version: v1 -*ä, -apps_v1'delete collection of ControllerRevision*2deleteAppsV1CollectionNamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + UnauthorizedRhttpsj +x-kubernetes-actionput +jk +x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io +kind: FlowSchema +version: v1beta1 +*¿ +flowcontrolApiserver_v1beta1delete a FlowSchema*+deleteFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision -version: v1 -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ü' -/apis/batch/v1/watch/cronjobsº'® -batch_v1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*'watchBatchV1CronJobListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü -D/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}/status³À -flowcontrolApiserver_v1beta1'read status of the specified FlowSchema*/readFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema - -401 - - UnauthorizedRhttpsjk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 -j -x-kubernetes-actionget -¡ -flowcontrolApiserver_v1beta1*replace status of the specified FlowSchema*2replaceFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM -K -Ibodybody *9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¶ -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema -O -201H -F -Created; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput + UnauthorizedRhttpsj +x-kubernetes-action delete jk x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io kind: FlowSchema version: v1beta1 -B¿ -flowcontrolApiserver_v1beta13partially update status of the specified FlowSchema*0patchFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B¯ +flowcontrolApiserver_v1beta1)partially update the specified FlowSchema**patchFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž @@ -6922,266 +6773,12 @@ A UnauthorizedRhttpsj x-kubernetes-actionpatch jk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema +x-kubernetes-group-version-kindHFkind: FlowSchema version: v1beta1 +group: flowcontrol.apiserver.k8s.io J7 53"1pathname of the FlowSchema"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ) -8/apis/storage.k8s.io/v1beta1/watch/storageclasses/{name}Ä(ý -storage_v1beta1³watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the StorageClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À' -/api/v1/watch/pods©' -core_v1owatch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.*"watchCoreV1PodListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ­ -1/api/v1/namespaces/{namespace}/pods/{name}/attach÷ – -core_v1%connect GET requests to attach of Pod*#connectCoreV1GetNamespacedPodAttach2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: PodAttachOptions -version: v1 -"˜ -core_v1&connect POST requests to attach of Pod*$connectCoreV1PostNamespacedPodAttach2*/*:*/*J7 - -401 - - Unauthorized - -200 - -OK - ² -stringRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: PodAttachOptions -version: v1 -Jœ -™–“querytThe container in which to execute the command. Defaults to only container if there is only one container in the pod." container2string J= -;9"7pathname of the PodAttachOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜Jƒ -€~|query_Stderr if true indicates that stderr is to be redirected for the attach call. Defaults to true."stderr2boolean J -}{query_Stdin if true, redirects the standard input stream of the pod for this call. Defaults to false."stdin2boolean Jƒ -€~|query_Stdout if true indicates that stdout is to be redirected for the attach call. Defaults to true."stdout2boolean Jð -íêçqueryÌTTY if true indicates that a tty will be allocated for the attach call. This is passed through the container runtime so the tty is allocated on the worker node by the container runtime. Defaults to false."tty2boolean „ -#/apis/admissionregistration.k8s.io/ÜÙ -admissionregistrationget information of a group* getAdmissionregistrationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttps³) -7/apis/apps/v1/namespaces/{namespace}/deployments/{name}÷(ç -apps_v1read the specified Deployment*readAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY - -401 - - Unauthorized -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.DeploymentRhttpsj -x-kubernetes-actionget -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -° -apps_v1 replace the specified Deployment*!replaceAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.apps.v1.DeploymentBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment - -401 - - UnauthorizedRhttpsjN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -j -x-kubernetes-actionput -*‚ -apps_v1delete a Deployment* deleteAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jN -x-kubernetes-group-version-kind+)version: v1 -group: apps -kind: Deployment -Bæ -apps_v1)partially update the specified Deployment*patchAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -J7 -53"1pathname of the Deployment"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ÿ -/apis/authentication.k8s.io/v1/ÛØ -authentication_v1get available resources*getAuthenticationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps¶) +MKIquery-If 'true', then the output is pretty printed."pretty2string ¶) //apis/node.k8s.io/v1beta1/runtimeclasses/{name}‚)€ node_v1beta1read the specified RuntimeClass*readNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J` E @@ -7224,9 +6821,9 @@ A UnauthorizedRhttpsj x-kubernetes-actionput j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: node.k8s.io +x-kubernetes-group-version-kind97group: node.k8s.io kind: RuntimeClass +version: v1beta1 *” node_v1beta1delete a RuntimeClass*deleteNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R @@ -7254,9 +6851,9 @@ I UnauthorizedRhttpsj x-kubernetes-action delete j\ -x-kubernetes-group-version-kind97kind: RuntimeClass +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass version: v1beta1 -group: node.k8s.io Bÿ node_v1beta1+partially update the specified RuntimeClass*patchNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L @@ -7274,33 +6871,134 @@ E  401  - UnauthorizedRhttpsj\ -x-kubernetes-group-version-kind97version: v1beta1 -group: node.k8s.io -kind: RuntimeClass -j + UnauthorizedRhttpsj x-kubernetes-actionpatch +j\ +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass +version: v1beta1 J9 75"3pathname of the RuntimeClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ( -./apis/policy/v1beta1/watch/podsecuritypoliciesÚ'Î -policy_v1beta1}watch individual changes to a list of PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead.*'watchPolicyV1beta1PodSecurityPolicyList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string å* +G/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}™*Ž +networking_v1beta1read the specified Ingress*&readNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress  401  - Unauthorized + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +j +x-kubernetes-actionget +ç +networking_v1beta1replace the specified Ingress*)replaceNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.networking.v1beta1.IngressBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +j +x-kubernetes-actionput +*¢ +networking_v1beta1delete an Ingress*(deleteNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +j +x-kubernetes-action delete +B +networking_v1beta1&partially update the specified Ingress*'patchNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +J4 +20".pathname of the Ingress"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ´) +C/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}ì(Ÿ +rbacAuthorization_v1¹watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# -x-kubernetes-action  -watchlist -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: policy -kind: PodSecurityPolicy +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -7315,7 +7013,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? +=;"9pathname of the ClusterRoleBinding"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -7324,31 +7023,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚ -/logs/{logpath}o8 -logs*logFileHandlerJ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‘) +patchAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string —( -0/apis/networking.k8s.io/v1/watch/networkpoliciesâ'Ö - networking_v1ywatch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.*2watchNetworkingV1NetworkPolicyListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj +x-kubernetes-actionwatch +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 +64"2pathname of the ClusterRole"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ä' +/api/v1/watch/persistentvolumesÀ'´ +core_v1|watch individual changes to a list of PersistentVolume. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1PersistentVolumeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -7459,9 +7122,9 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy +jR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -7486,24 +7149,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯' -$/apis/policy/v1/poddisruptionbudgets†'ú - policy_v11list or watch objects of kind PodDisruptionBudget*/listPolicyV1PodDisruptionBudgetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh -M -200F -D -OK> -< -:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean è' +/api/v1/watch/resourcequotasÇ'» +core_v1ywatch individual changes to a list of ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead.*,watchCoreV1ResourceQuotaListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jY -x-kubernetes-group-version-kind64version: v1 -group: policy -kind: PodDisruptionBudget + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -7527,24 +7191,37 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ú' -4/apis/rbac.authorization.k8s.io/v1beta1/rolebindings¡'• -rbacAuthorization_v1beta1)list or watch objects of kind RoleBinding*7listRbacAuthorizationV1beta1RoleBindingForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jc -H -200A +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean £ ++/apis/admissionregistration.k8s.io/v1beta1/óð +admissionregistration_v1beta1get available resources*+getAdmissionregistrationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps„( +'/apis/apps/v1/watch/controllerrevisionsØ'Ì +apps_v1~watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.*1watchAppsV1ControllerRevisionListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA ? -OK9 -7 -5#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding -version: v1beta1 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -7568,9 +7245,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¢* -U/apis/storage.k8s.io/v1beta1/watch/namespaces/{namespace}/csistoragecapacities/{name}È)™ -storage_v1beta1¹watch changes to an object of kind CSIStorageCapacity. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ½) +5/api/v1/watch/namespaces/{namespace}/endpoints/{name}ƒ)Ý +core_v1°watch changes to an object of kind Endpoints. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -7582,10 +7259,10 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -je -x-kubernetes-group-version-kindB@version: v1beta1 -group: storage.k8s.io -kind: CSIStorageCapacity +jK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -7600,8 +7277,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? -=;"9pathname of the CSIStorageCapacity"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 +42"0pathname of the Endpoints"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -7611,107 +7288,152 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean — -7/apis/authorization.k8s.io/v1beta1/subjectaccessreviewsÛ -"Í -authorization_v1beta1create a SubjectAccessReview*-createAuthorizationV1beta1SubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX -V -Tbodybody *D -B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewJ© -U -200N -L -OKF -D -B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview -Z -201S -Q -CreatedF -D -B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview -[ -202T -R -AcceptedF -D -B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¤) +./apis/storage.k8s.io/v1beta1/csidrivers/{name}ñ(€ +storage_v1beta1read the specified CSIDriver*readStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jl -x-kubernetes-group-version-kindIGgroup: authorization.k8s.io -kind: SubjectAccessReview + UnauthorizedRhttpsj\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver version: v1beta1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string  -6/apis/authorization.k8s.io/v1/selfsubjectaccessreviewsÔ -"Æ -authorization_v1 create a SelfSubjectAccessReview*,createAuthorizationV1SelfSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BW -U -Sbodybody *C -A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReviewJ¦ +j +x-kubernetes-actionget +× +storage_v1beta1replace the specified CSIDriver*replaceStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH +F +Dbodybody *4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¬ +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver +J +201C +A +Created6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver  401  - Unauthorized -T -200M -K -OKE -C -A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview -Y -201R -P -CreatedE -C -A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview -Z -202S -Q -AcceptedE -C -A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReviewRhttpsjk -x-kubernetes-group-version-kindHFkind: SelfSubjectAccessReview -version: v1 -group: authorization.k8s.io -j -x-kubernetes-actionpost -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ß -/apis/autoscaling/ÈÅ - autoscalingget information of a group*getAutoscalingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G + UnauthorizedRhttpsj\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +j +x-kubernetes-actionput +*† +storage_v1beta1delete a CSIDriver*deleteStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J­ E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +200> +< +OK6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver +K +202D +B +Accepted6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver  401  - UnauthorizedRhttpsþ -/apis/autoscaling/v2beta1/ßÜ -autoscaling_v2beta1get available resources*!getAutoscalingV2beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N + UnauthorizedRhttpsj +x-kubernetes-action delete +j\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +Bÿ +storage_v1beta1(partially update the specified CSIDriver*patchStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver  401  - UnauthorizedRhttpsˆ] -./apis/batch/v1/namespaces/{namespace}/cronjobsÕ\ø% -batch_v1%list or watch objects of kind CronJob*listBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +J6 +42"0pathname of the CSIDriver"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ”) +;/apis/storage.k8s.io/v1beta1/watch/volumeattachments/{name}Ô(‰ +storage_v1beta1·watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jc +x-kubernetes-group-version-kind@>kind: VolumeAttachment +version: v1beta1 +group: storage.k8s.io +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J= +;9"7pathname of the VolumeAttachment"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean •] +(/apis/node.k8s.io/v1beta1/runtimeclassesè\™& + node_v1beta1*list or watch objects of kind RuntimeClass*listNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -7733,190 +7455,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J[ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jd +I +200B @ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.batch.v1.CronJobList +OK: +8 +6#/definitions/io.k8s.api.node.v1beta1.RuntimeClassList  401  - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"Û -batch_v1create a CronJob*createBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B? -= -;bodybody *+ -)#/definitions/io.k8s.api.batch.v1.CronJobBž +j\ +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass +version: v1beta1 +"— + node_v1beta1create a RuntimeClass*createNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH +F +Dbodybody *4 +2#/definitions/io.k8s.api.node.v1beta1.RuntimeClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob -A -201: -8 -Created- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jù +K +202D B -202; -9 -Accepted- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob +Accepted6 +4 +2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass  401  - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -j -x-kubernetes-actionpost -*Æ, -batch_v1delete collection of CronJob*(deleteBatchV1CollectionNamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jL -x-kubernetes-group-version-kind)'kind: CronJob -version: v1 -group: batch -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ð -/apis/discovery.k8s.io/v1/ÑÎ - discovery_v1get available resources*getDiscoveryV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps©^ -6/apis/rbac.authorization.k8s.io/v1/clusterrolebindingsî]Å& -rbacAuthorization_v10list or watch objects of kind ClusterRoleBinding*)listRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je + Unauthorized +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass J -200C +201C A -OK; -9 -7#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -"Æ -rbacAuthorization_v1create a ClusterRoleBinding*+createRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsj +Created6 +4 +2#/definitions/io.k8s.api.node.v1beta1.RuntimeClassRhttpsj\ +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass +version: v1beta1 +j x-kubernetes-actionpost -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -*‰- -rbacAuthorization_v1'delete collection of ClusterRoleBinding*5deleteRbacAuthorizationV1CollectionClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Þ, + node_v1beta1!delete collection of RuntimeClass*'deleteNodeV1beta1CollectionRuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -7944,158 +7534,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* x-kubernetes-actiondeletecollection -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ×' -1/apis/storage.k8s.io/v1beta1/csistoragecapacities¡'• -storage_v1beta10list or watch objects of kind CSIStorageCapacity*4listStorageV1beta1CSIStorageCapacityForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jm - -401 - - Unauthorized -R -200K -I -OKC -A -?#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityListRhttpsj -x-kubernetes-actionlist -je -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¦ - /api/v1/componentstatuses/{name}ï -core_v1"read the specified ComponentStatus*readCoreV1ComponentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.core.v1.ComponentStatus - -401 - - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,kind: ComponentStatus -version: v1 -group: "" -j -x-kubernetes-actionget -J< -:8"6pathname of the ComponentStatus"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ü -T/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations/{name}/status£€ -flowcontrolApiserver_v1beta17read status of the specified PriorityLevelConfiguration*?readFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration - -401 - - UnauthorizedRhttpsj{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -j -x-kubernetes-actionget - - -flowcontrolApiserver_v1beta1:replace status of the specified PriorityLevelConfiguration*BreplaceFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] -[ -Ybodybody *I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÖ -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration -_ -201X -V -CreatedK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -Bÿ -flowcontrolApiserver_v1beta1Cpartially update status of the specified PriorityLevelConfiguration*@patchFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration +j\ +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass version: v1beta1 -JG -EC"Apath&name of the PriorityLevelConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string †) -F/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses»(Í -networking_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*+watchNetworkingV1beta1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ”* +S/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}¼)” +rbacAuthorization_v1²watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*-watchRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -8105,13 +7562,12 @@ G  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8126,7 +7582,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 +64"2pathname of the RoleBinding"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -8136,9 +7593,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean µ( -3/apis/autoscaling/v1/watch/horizontalpodautoscalersý'ñ -autoscaling_v1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*=watchAutoscalingV1HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à' +/api/v1/watch/podtemplatesÁ'µ +core_v1wwatch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.**watchCoreV1PodTemplateListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -8148,13 +7605,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(kind: PodTemplate +version: v1 +group: "" +j# x-kubernetes-action  watchlist -jb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8178,24 +7635,151 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean »( -/api/v1/watch/namespaces/{name}—(Ó -core_v1°watch changes to an object of kind Namespace. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚ + /apis/apiregistration.k8s.io/v1/ÝÚ +apiregistration_v1get available resources* getApiregistrationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps‹ +#/apis/authorization.k8s.io/v1beta1/ãà +authorization_v1beta1get available resources*#getAuthorizationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp  401  Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsü* +H/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies/{name}¯*’ + networking_v1 read the specified NetworkPolicy*'readNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +j^ +x-kubernetes-group-version-kind;9kind: NetworkPolicy +version: v1 +group: networking.k8s.io +í + networking_v1#replace the specified NetworkPolicy**replaceNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicyBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +j^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +*¤ + networking_v1delete a NetworkPolicy*)deleteNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +j^ +x-kubernetes-group-version-kind;9kind: NetworkPolicy +version: v1 +group: networking.k8s.io +B‘ + networking_v1,partially update the specified NetworkPolicy*(patchNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy + +401 + + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +j +x-kubernetes-actionpatch +J: +86"4pathname of the NetworkPolicy"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string †) +F/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses»(Í +networking_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*+watchNetworkingV1beta1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj -x-kubernetes-actionwatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8210,8 +7794,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 -42"0pathname of the Namespace"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -8220,21 +7804,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ó -/apis/networking.k8s.io/v1/ÓÐ - networking_v1get available resources*getNetworkingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttpsî] -?/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolesª]—& -rbacAuthorization_v1"list or watch objects of kind Role*%listRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ] +(/api/v1/namespaces/{namespace}/endpointsÛ\ú% +core_v1'list or watch objects of kind Endpoints*listCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8256,58 +7828,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JW -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.rbac.v1.RoleList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.EndpointsList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role +jK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints version: v1 -"î -rbacAuthorization_v1 create a Role*'createRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.rbac.v1.RoleBž +"Þ +core_v1create Endpoints*createCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.core.v1.EndpointsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÒ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.rbac.v1.Role -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.rbac.v1.Role -> -2027 -5 -Accepted) -' -%#/definitions/io.k8s.api.rbac.v1.Role +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já +C +202< +: +Accepted. +, +*#/definitions/io.k8s.api.core.v1.Endpoints  401  - UnauthorizedRhttpsj + Unauthorized += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Endpoints +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.EndpointsRhttpsj x-kubernetes-actionpost -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role +jK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints version: v1 -*é, -rbacAuthorization_v1delete collection of Role*1deleteRbacAuthorizationV1CollectionNamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ç, +core_v1delete collection of Endpoints*)deleteCoreV1CollectionNamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -8346,15 +7918,15 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role -version: v1 +jK +x-kubernetes-group-version-kind(&version: v1 +group: "" +kind: Endpoints J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ”* -S/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}¼)” -rbacAuthorization_v1²watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*-watchRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ¿( +,/api/v1/watch/namespaces/{namespace}/secretsŽ(  +core_v1rwatch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedSecretList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -8364,11 +7936,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -8384,8 +7957,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 -64"2pathname of the RoleBinding"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -8395,92 +7967,103 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ý\ -/api/v1/persistentvolumes¿\Œ& -core_v1.list or watch objects of kind PersistentVolume*listCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.core.v1.PersistentVolumeList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é +=/apis/apps/v1/namespaces/{namespace}/deployments/{name}/scale§ù +apps_v1&read scale of the specified Deployment*#readAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume + Unauthorized +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale version: v1 -j -x-kubernetes-actionlist -"‡ -core_v1create a PersistentVolume*createCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž +j +x-kubernetes-actionget +Æ +apps_v1)replace scale of the specified Deployment*&replaceAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jö -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume -I -201B +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + Unauthorized @ -Created5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume -J -202C -A -Accepted5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleRhttpsj +x-kubernetes-actionput +jP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +Bø +apps_v12partially update scale of the specified Deployment*$patchAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale version: v1 -*Ò, -core_v1%delete collection of PersistentVolume*&deleteCoreV1CollectionPersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +j +x-kubernetes-actionpatch +J2 +0.",pathname of the Scale"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string î& +/apis/batch/v1/cronjobsÒ&Æ +batch_v1%list or watch objects of kind CronJob*"listBatchV1CronJobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.batch.v1.CronJobList + +401 + + UnauthorizedRhttpsjL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob +version: v1 +j +x-kubernetes-actionlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -8488,148 +8071,90 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‰ +C/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/statusÁ¡ +core_v12read status of the specified ReplicationController*/readCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController  401  - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -jR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ·* -5/apis/storage.k8s.io/v1beta1/volumeattachments/{name}ý)œ -storage_v1beta1#read the specified VolumeAttachment*"readStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment - -401 - - UnauthorizedRhttpsj +j x-kubernetes-actionget -jc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 - -storage_v1beta1&replace the specified VolumeAttachment*%replaceStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO -M -Kbodybody *; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentBž +€ +core_v15replace status of the specified ReplicationController*2replaceCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.core.v1.ReplicationControllerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jº -L -200E -C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment -Q -201J -H -Created= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController +N +201G +E +Created: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController  401  - UnauthorizedRhttpsjc -x-kubernetes-group-version-kind@>kind: VolumeAttachment -version: v1beta1 -group: storage.k8s.io + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController +version: v1 j x-kubernetes-actionput -*© -storage_v1beta1delete a VolumeAttachment*$deleteStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment -R -202K -I -Accepted= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 -B› -storage_v1beta1/partially update the specified VolumeAttachment*#patchStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B  +core_v1>partially update status of the specified ReplicationController*0patchCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationController  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 -J= -;9"7pathname of the VolumeAttachment"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ì -/apis/apiextensions.k8s.io/ÌÉ - apiextensionsget information of a group*getApiextensionsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttpsÇ] --/api/v1/namespaces/{namespace}/resourcequotas•]Š& -core_v1+list or watch objects of kind ResourceQuota*!listCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +jW +x-kubernetes-group-version-kind42version: v1 +group: "" +kind: ReplicationController +JB +@>"<path!name of the ReplicationController"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¦] +0/apis/apps/v1/namespaces/{namespace}/deploymentsñ\€& +apps_v1(list or watch objects of kind Deployment*listAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8651,58 +8176,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.core.v1.ResourceQuotaList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J]  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jO -x-kubernetes-group-version-kind,*version: v1 -group: "" -kind: ResourceQuota -"ü -core_v1create a ResourceQuota*#createCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD + Unauthorized B -@bodybody *0 -.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.apps.v1.DeploymentListRhttpsj +x-kubernetes-actionlist +jN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +"é +apps_v1create a Deployment* createAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.DeploymentBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota -G -202@ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä > -Accepted2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment +D +202= +; +Accepted/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jO -x-kubernetes-group-version-kind,*version: v1 -group: "" -kind: ResourceQuota -*Ó, -core_v1"delete collection of ResourceQuota*-deleteCoreV1CollectionNamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +*Ì, +apps_v1delete collection of Deployment**deleteAppsV1CollectionNamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -8741,30 +8266,30 @@ C ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* x-kubernetes-actiondeletecollection -jO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 +jN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: Deployment J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string À) -D/apis/apiextensions.k8s.io/v1/watch/customresourcedefinitions/{name}÷(¤ -apiextensions_v1¿watch changes to an object of kind CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*,watchApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA +MKIquery-If 'true', then the output is pretty printed."pretty2string ÷& +/apis/events.k8s.io/v1/eventsÕ&É + events_v1#list or watch objects of kind Event*!listEventsV1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JZ ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.events.v1.EventList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jl -x-kubernetes-group-version-kindIGkind: CustomResourceDefinition + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event version: v1 -group: apiextensions.k8s.io +j +x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -8779,8 +8304,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -8789,54 +8313,54 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ç( -,/api/v1/namespaces/{namespace}/events/{name}–(Ñ -core_v1read the specified Event*readCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JT -9 -2002 -0 -OK* -( -&#/definitions/io.k8s.api.core.v1.Event +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ’* +F/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}Ç)þ +rbacAuthorization_v1read the specified Role*%readRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.rbac.v1.Role  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 - -core_v1replace the specified Event*replaceCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B< -: -8bodybody *( -&#/definitions/io.k8s.api.core.v1.EventBž +j +x-kubernetes-actionget +» +rbacAuthorization_v1replace the specified Role*(replaceRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.rbac.v1.RoleBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J” +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’  401  Unauthorized -9 -2002 -0 -OK* -( -&#/definitions/io.k8s.api.core.v1.Event -> -2017 -5 -Created* -( -&#/definitions/io.k8s.api.core.v1.EventRhttpsj +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.rbac.v1.Role += +2016 +4 +Created) +' +%#/definitions/io.k8s.api.rbac.v1.RoleRhttpsj x-kubernetes-actionput -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 -*ò -core_v1delete an Event*deleteCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ÿ +rbacAuthorization_v1 delete a Role*'deleteRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -8861,84 +8385,284 @@ I  UnauthorizedRhttpsj x-kubernetes-action delete -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 -BÐ -core_v1$partially update the specified Event*patchCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bý +rbacAuthorization_v1#partially update the specified Role*&patchRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JT -9 -2002 -0 -OK* -( -&#/definitions/io.k8s.api.core.v1.Event +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.rbac.v1.Role  401  - UnauthorizedRhttpsjG -x-kubernetes-group-version-kind$"kind: Event + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 -group: "" +J1 +/-"+pathname of the Role"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¢* +U/apis/storage.k8s.io/v1beta1/watch/namespaces/{namespace}/csistoragecapacities/{name}È)™ +storage_v1beta1¹watch changes to an object of kind CSIStorageCapacity. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity +version: v1beta1 j -x-kubernetes-actionpatch -J2 -0.",pathname of the Event"name*string˜J` +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? +=;"9pathname of the CSIStorageCapacity"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ’) -0/api/v1/namespaces/{namespace}/configmaps/{name}Ý(á -core_v1read the specified ConfigMap*readCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ø' +/api/v1/watch/configmaps»'¯ +core_v1uwatch individual changes to a list of ConfigMap. deprecated: use the 'watch' parameter with a list operation instead.*(watchCoreV1ConfigMapListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Õ +=/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}/status“ó +apps_v1&read status of the specified DaemonSet*#readAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX = 2006 4 OK. , -*#/definitions/io.k8s.api.core.v1.ConfigMap +*#/definitions/io.k8s.api.apps.v1.DaemonSet  401  UnauthorizedRhttpsj x-kubernetes-actionget -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap +jM +x-kubernetes-group-version-kind*(kind: DaemonSet version: v1 -¨ -core_v1replace the specified ConfigMap* replaceCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +group: apps +º +apps_v1)replace status of the specified DaemonSet*&replaceAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ > <bodybody *, -*#/definitions/io.k8s.api.core.v1.ConfigMapBž +*#/definitions/io.k8s.api.apps.v1.DaemonSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ + +401 + + Unauthorized = 2006 4 OK. , -*#/definitions/io.k8s.api.core.v1.ConfigMap +*#/definitions/io.k8s.api.apps.v1.DaemonSet B 201; 9 Created. , -*#/definitions/io.k8s.api.core.v1.ConfigMap +*#/definitions/io.k8s.api.apps.v1.DaemonSetRhttpsjM +x-kubernetes-group-version-kind*(kind: DaemonSet +version: v1 +group: apps +j +x-kubernetes-actionput +Bò +apps_v12partially update status of the specified DaemonSet*$patchAppsV1NamespacedDaemonSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.apps.v1.DaemonSet + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +J6 +42"0pathname of the DaemonSet"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¼* +V/apis/autoscaling/v2beta2/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}á)­ +autoscaling_v2beta2¾watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*8watchAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Û) +1/apis/scheduling.k8s.io/v1/priorityclasses/{name}¥)ˆ + scheduling_v1 read the specified PriorityClass*readSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass  401  UnauthorizedRhttpsj -x-kubernetes-actionput -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap +x-kubernetes-actionget +j^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass version: v1 -*ý -core_v1delete a ConfigMap*deleteCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +ã + scheduling_v1#replace the specified PriorityClass* replaceSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass + +401 + + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass +version: v1 +j +x-kubernetes-actionput +*š + scheduling_v1delete a PriorityClass*deleteSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -8963,39 +8687,38 @@ I  UnauthorizedRhttpsj x-kubernetes-action delete -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap +j^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass version: v1 -Bà -core_v1(partially update the specified ConfigMap*patchCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B‡ + scheduling_v1,partially update the specified PriorityClass*patchSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.ConfigMap +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap +j^ +x-kubernetes-group-version-kind;9kind: PriorityClass version: v1 -J6 -42"0pathname of the ConfigMap"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ì' -/api/v1/watch/secrets²'¦ -core_v1rwatch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.*%watchCoreV1SecretListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +group: scheduling.k8s.io +J: +86"4pathname of the PriorityClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ò( +A/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses¬(¾ + networking_v1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*&watchNetworkingV1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -9008,10 +8731,53 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jH -x-kubernetes-group-version-kind%#group: "" -kind: Secret +jX +x-kubernetes-group-version-kind53kind: Ingress version: v1 +group: networking.k8s.io +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´' +/api/v1/watch/nodesœ' +core_v1pwatch individual changes to a list of Node. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jF +x-kubernetes-group-version-kind#!version: v1 +group: "" +kind: Node J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -9035,9 +8801,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean „_ -7/apis/certificates.k8s.io/v1/certificatesigningrequestsÈ^Ù& -certificates_v17list or watch objects of kind CertificateSigningRequest*+listCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean á` + -<bodybody *, -*#/definitions/io.k8s.api.core.v1.ConfigMapBž +Ù + networking_v1'replace status of the specified Ingress**replaceNetworkingV1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.networking.v1.IngressBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress +F +201? = -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.ConfigMap -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.ConfigMap -C -202< -: -Accepted. -, -*#/definitions/io.k8s.api.core.v1.ConfigMap +Created2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress version: v1 -*Ç, -core_v1delete collection of ConfigMap*)deleteCoreV1CollectionNamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +j +x-kubernetes-actionput +B‰ + networking_v10partially update status of the specified Ingress*(patchNetworkingV1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress + +401 + + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53kind: Ingress +version: v1 +group: networking.k8s.io +j +x-kubernetes-actionpatch +J4 +20".pathname of the Ingress"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ï +/apis/autoscaling/v1/ÕÒ +autoscaling_v1get available resources*getAutoscalingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps‚- +P/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers/{name}­,Ë +autoscaling_v2beta2*read the specified HorizontalPodAutoscaler*7readAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jr  401  Unauthorized +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerRhttpsj +x-kubernetes-actionget +jg +x-kubernetes-group-version-kindDBversion: v2beta2 +group: autoscaling +kind: HorizontalPodAutoscaler +Æ +autoscaling_v2beta2-replace the specified HorizontalPodAutoscaler*:replaceAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ +X +Vbodybody *F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÐ +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +\ +201U +S +CreatedH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +*Í +autoscaling_v2beta2 delete a HorizontalPodAutoscaler*9deleteAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap -version: v1 -J` +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +BÊ +autoscaling_v2beta26partially update the specified HorizontalPodAutoscaler*8patchAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¿( -=/apis/certificates.k8s.io/v1/watch/certificatesigningrequestsý'ñ -certificates_v1…watch individual changes to a list of CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead.*0watchCertificatesV1CertificateSigningRequestList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ô) +L/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases/{name}£) +coordination_v1beta1¬watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -9299,13 +9190,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 + UnauthorizedRhttpsj +x-kubernetes-actionwatch +j] +x-kubernetes-group-version-kind:8kind: Lease +version: v1beta1 +group: coordination.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -9320,7 +9210,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 +0.",pathname of the Lease"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9329,9 +9221,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‘) -/apis/apps/v1/namespaces/{namespace}/replicasets/{name}/status¢÷ -apps_v1'read status of the specified ReplicaSet*$readAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet -version: v1 -À -apps_v1*replace status of the specified ReplicaSet*'replaceAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.apps.v1.ReplicaSetBž + Unauthorized +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.networking.v1beta1.IngressListRhttpsj +x-kubernetes-actionlist +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +"© +networking_v1beta1create an Ingress*(createNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.networking.v1beta1.IngressBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž -> -2007 +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +F +200? += +OK7 5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet +3#/definitions/io.k8s.api.networking.v1beta1.Ingress +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress +L +202E C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet +Accepted7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress  401  - UnauthorizedRhttpsjN -x-kubernetes-group-version-kind+)kind: ReplicaSet -version: v1 -group: apps -j -x-kubernetes-actionput -Bö -apps_v13partially update status of the specified ReplicaSet*%patchAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +j +x-kubernetes-actionpost +*ë, +networking_v1beta1delete collection of Ingress*2deleteNetworkingV1beta1CollectionNamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ©0 +'/api/v1/namespaces/{namespace}/servicesý/ò% +core_v1%list or watch objects of kind Service*listCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.ServiceList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service version: v1 -J7 -53"1pathname of the ReplicaSet"name*string˜J` +"Ò +core_v1create a Service*createCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.core.v1.ServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÛ +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.core.v1.Service +A +202: +8 +Accepted, +* +(#/definitions/io.k8s.api.core.v1.Service + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpost +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ü) -L/apis/discovery.k8s.io/v1/watch/namespaces/{namespace}/endpointslices/{name}«) - discovery_v1´watch changes to an object of kind EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string È' +/api/v1/watch/namespaces«'Ÿ +core_v1uwatch individual changes to a list of Namespace. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespaceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -9498,12 +9471,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j] -x-kubernetes-group-version-kind:8kind: EndpointSlice + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace version: v1 -group: discovery.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -9518,9 +9492,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the EndpointSlice"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9529,125 +9501,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean û* -=/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}¹*¬ -rbacAuthorization_v1%read the specified ClusterRoleBinding*)readRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsjk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -j -x-kubernetes-actionget -… -rbacAuthorization_v1(replace the specified ClusterRoleBinding*,replaceRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -*¿ -rbacAuthorization_v1delete a ClusterRoleBinding*+deleteRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding -version: v1 -B« -rbacAuthorization_v11partially update the specified ClusterRoleBinding**patchRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ó( +1/api/v1/watch/namespaces/{namespace}/podtemplates(¯ +core_v1wwatch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.*$watchCoreV1NamespacedPodTemplateList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjk -x-kubernetes-group-version-kindHFversion: v1 -group: rbac.authorization.k8s.io -kind: ClusterRoleBinding -j -x-kubernetes-actionpatch -J? -=;"9pathname of the ClusterRoleBinding"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string œ( -5/apis/rbac.authorization.k8s.io/v1/watch/clusterrolesâ'Ö -rbacAuthorization_v1wwatch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.*'watchRbacAuthorizationV1ClusterRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# x-kubernetes-action  watchlist -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole +jM +x-kubernetes-group-version-kind*(group: "" +kind: PodTemplate version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -9663,7 +9534,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9672,9 +9544,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ƒ) -E/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles¹(Ë -rbacAuthorization_v1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.**watchRbacAuthorizationV1NamespacedRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À' +/api/v1/watch/pods©' +core_v1owatch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.*"watchCoreV1PodListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -9684,13 +9556,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" kind: Pod +version: v1 +group: "" +j# x-kubernetes-action  watchlist -j] -x-kubernetes-group-version-kind:8version: v1 -group: rbac.authorization.k8s.io -kind: Role J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -9705,8 +9577,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9715,9 +9586,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ã) -7/api/v1/watch/namespaces/{namespace}/limitranges/{name}‡)à -core_v1±watch changes to an object of kind LimitRange. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿( +=/apis/certificates.k8s.io/v1/watch/certificatesigningrequestsý'ñ +certificates_v1…watch individual changes to a list of CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead.*0watchCertificatesV1CertificateSigningRequestList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -9727,11 +9598,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -9747,9 +9619,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the LimitRange"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9758,64 +9628,97 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ - -2/api/v1/namespaces/{namespace}/pods/{name}/bindingÈ -"¢ -core_v1create binding of a Pod* createCoreV1NamespacedPodBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.core.v1.BindingJÛ -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Binding -@ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.core.v1.Binding -A -202: -8 -Accepted, -* -(#/definitions/io.k8s.api.core.v1.Binding +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷ +N/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}/status¤ž +networking_v1beta1$read status of the specified Ingress*,readNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jI -x-kubernetes-group-version-kind&$group: "" -kind: Binding -version: v1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J4 -20".pathname of the Binding"name*string˜J` + UnauthorizedRhttpsj +x-kubernetes-actionget +j] +x-kubernetes-group-version-kind:8kind: Ingress +version: v1beta1 +group: networking.k8s.io +÷ +networking_v1beta1'replace status of the specified Ingress*/replaceNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.networking.v1beta1.IngressBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +j] +x-kubernetes-group-version-kind:8version: v1beta1 +group: networking.k8s.io +kind: Ingress +B +networking_v1beta10partially update status of the specified Ingress*-patchNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1beta1.Ingress + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8version: v1beta1 +group: networking.k8s.io +kind: Ingress +j +x-kubernetes-actionpatch +J4 +20".pathname of the Ingress"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ô) -I/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitions/{name}†)³ -apiextensions_v1beta1¿watch changes to an object of kind CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*1watchApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string Ÿ) +L/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindingsÎ(à +rbacAuthorization_v1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*1watchRbacAuthorizationV1NamespacedRoleBindingList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -9830,8 +9733,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -9840,15 +9743,32 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ò_ -D/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers‰_Ð& -autoscaling_v15list or watch objects of kind HorizontalPodAutoscaler*2listAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‡( +0/apis/scheduling.k8s.io/v1/watch/priorityclassesÒ'Æ + scheduling_v1ywatch individual changes to a list of PriorityClass. deprecated: use the 'watch' parameter with a list operation instead.*"watchSchedulingV1PriorityClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass +version: v1 +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -9856,170 +9776,164 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jq -V -200O -M -OKG -E -C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ü( +*/apis/node.k8s.io/v1/runtimeclasses/{name}­(ì +node_v1read the specified RuntimeClass*readNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -"õ -autoscaling_v1 create a HorizontalPodAutoscaler*4createAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BU -S -Qbodybody *A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler -W -201P -N -CreatedC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler -X -202Q -O -AcceptedC + UnauthorizedRhttpsj +x-kubernetes-actionget +jW +x-kubernetes-group-version-kind42version: v1 +group: node.k8s.io +kind: RuntimeClass +¹ +node_v1"replace the specified RuntimeClass*replaceNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +?bodybody */ +-#/definitions/io.k8s.api.node.v1.RuntimeClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=version: v1 -group: autoscaling -kind: HorizontalPodAutoscaler -j -x-kubernetes-actionpost -*ˆ- -autoscaling_v1,delete collection of HorizontalPodAutoscaler*>deleteAutoscalingV1CollectionNamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42version: v1 +group: node.k8s.io +kind: RuntimeClass +j +x-kubernetes-actionput +*… +node_v1delete a RuntimeClass*deleteNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=kind: HorizontalPodAutoscaler + UnauthorizedRhttpsj +x-kubernetes-action delete +jW +x-kubernetes-group-version-kind42group: node.k8s.io +kind: RuntimeClass version: v1 -group: autoscaling -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ï -/apis/policy/v1beta1/ÕÒ -policy_v1beta1get available resources*getPolicyV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +Bë +node_v1+partially update the specified RuntimeClass*patchNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttps¥) -1/api/v1/namespaces/{namespace}/limitranges/{name}ï(å -core_v1read the specified LimitRange*readCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jW +x-kubernetes-group-version-kind42version: v1 +group: node.k8s.io +kind: RuntimeClass +J9 +75"3pathname of the RuntimeClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ç( +,/api/v1/namespaces/{namespace}/events/{name}–(Ñ +core_v1read the specified Event*readCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JT +9 +2002 +0 +OK* +( +&#/definitions/io.k8s.api.core.v1.Event  401  UnauthorizedRhttpsj x-kubernetes-actionget -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange -version: v1 -® -core_v1 replace the specified LimitRange*!replaceCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.core.v1.LimitRangeBž +jG +x-kubernetes-group-version-kind$"version: v1 +group: "" +kind: Event + +core_v1replace the specified Event*replaceCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B< +: +8bodybody *( +&#/definitions/io.k8s.api.core.v1.EventBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J” +9 +2002 +0 +OK* +( +&#/definitions/io.k8s.api.core.v1.Event > -2007 +2017 5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange +Created* +( +&#/definitions/io.k8s.api.core.v1.Event  401  - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange + UnauthorizedRhttpsjG +x-kubernetes-group-version-kind$"group: "" +kind: Event version: v1 j x-kubernetes-actionput -*€ -core_v1delete a LimitRange* deleteCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ò +core_v1delete an Event*deleteCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -10027,12 +9941,6 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status R 202K I @@ -10042,47 +9950,69 @@ I  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jL -x-kubernetes-group-version-kind)'kind: LimitRange + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjG +x-kubernetes-group-version-kind$"group: "" +kind: Event version: v1 -group: "" -Bä -core_v1)partially update the specified LimitRange*patchCoreV1NamespacedLimitRange2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-action delete +BÐ +core_v1$partially update the specified Event*patchCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JT +9 +2002 +0 +OK* +( +&#/definitions/io.k8s.api.core.v1.Event  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jL -x-kubernetes-group-version-kind)'group: "" -kind: LimitRange +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event version: v1 -J7 -53"1pathname of the LimitRange"name*string˜J` +J2 +0.",pathname of the Event"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ` -I/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalersÏ_ä& -autoscaling_v2beta25list or watch objects of kind HorizontalPodAutoscaler*7listAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +MKIquery-If 'true', then the output is pretty printed."pretty2string à) +G/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases/{name}”)ò +coordination_v1¬watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -10090,77 +10020,43 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 +0.",pathname of the Lease"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jv -[ -200T -R -OKL -J -H#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -"˜ - -autoscaling_v2beta2 create a HorizontalPodAutoscaler*9createAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ -X -Vbodybody *F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¯ -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler -\ -201U -S -CreatedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler -] -202V -T -AcceptedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ’( +./apis/coordination.k8s.io/v1beta1/watch/leasesß'Ó +coordination_v1beta1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*1watchCoordinationV1beta1LeaseListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -*—- -autoscaling_v2beta2,delete collection of HorizontalPodAutoscaler*CdeleteAutoscalingV2beta2CollectionNamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -10168,51 +10064,57 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ã +/apis/networking.k8s.io/Æà + +networkingget information of a group*getNetworkingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta2 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¸( - +2027 +5 +Accepted) +' +%#/definitions/io.k8s.api.batch.v1.Job  401  - Unauthorized -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService -c -201\ -Z -CreatedO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionpost -j` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job version: v1 -kind: APIService -*ê, -apiregistration_v1delete collection of APIService*+deleteApiregistrationV1CollectionAPIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*º, +batch_v1delete collection of Job*$deleteBatchV1CollectionNamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -10352,221 +10253,15 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -j` -x-kubernetes-group-version-kind=;version: v1 -kind: APIService -group: apiregistration.k8s.io -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‚+ -B/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets/{name}»*“ - policy_v1&read the specified PodDisruptionBudget*)readPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsjY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 -j -x-kubernetes-actionget -ò - policy_v1)replace the specified PodDisruptionBudget*,replacePolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ - -401 - - Unauthorized -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetRhttpsj -x-kubernetes-actionput -jY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 -*£ - policy_v1delete a PodDisruptionBudget*+deletePolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 -B’ - policy_v12partially update the specified PodDisruptionBudget**patchPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job version: v1 -J@ -><":pathname of the PodDisruptionBudget"name*string˜J` +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string –( -'/apis/storage.k8s.io/v1/csinodes/{name}ê'ä - -storage_v1read the specified CSINode*readStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode - -401 - - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode -version: v1 -j -x-kubernetes-actionget -­ - -storage_v1replace the specified CSINode*replaceStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.storage.v1.CSINodeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode -version: v1 -*ã - -storage_v1delete a CSINode*deleteStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string JŸ -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode -D -202= -; -Accepted/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode -version: v1 -Bã - -storage_v1&partially update the specified CSINode*patchStorageV1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode -version: v1 -J4 -20".pathname of the CSINode"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ç( -2/apis/storage.k8s.io/v1beta1/watch/csinodes/{name}°(î -storage_v1beta1®watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string Õ) +I/apis/certificates.k8s.io/v1beta1/watch/certificatesigningrequests/{name}‡)³ +certificates_v1beta1Àwatch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*1watchCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -10578,10 +10273,10 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode -version: v1beta1 +jq +x-kubernetes-group-version-kindNLversion: v1beta1 +group: certificates.k8s.io +kind: CertificateSigningRequest J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -10596,8 +10291,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the CSINode"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JF +DB"@path%name of the CertificateSigningRequest"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -10606,126 +10301,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ™. -O/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations/{name}Å-… -admissionregistration_v1beta1/read the specified MutatingWebhookConfiguration*deleteAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ä+ +K/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices/{name}ô*¢ +discovery_v1beta1 read the specified EndpointSlice*+readDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf  401  Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj} -x-kubernetes-group-version-kindZXversion: v1beta1 -group: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration -j -x-kubernetes-action delete -B„ -admissionregistration_v1beta1;partially update the specified MutatingWebhookConfiguration*=patchAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J -f -200_ -] -OKW -U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration - -401 - - UnauthorizedRhttpsj} -x-kubernetes-group-version-kindZXversion: v1beta1 -group: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration -j -x-kubernetes-actionpatch -JI -GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ä+ -K/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices/{name}ô*¢ -discovery_v1beta1 read the specified EndpointSlice*+readDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf K 200D B OK< : -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceRhttpsjb +x-kubernetes-group-version-kind?=kind: EndpointSlice version: v1beta1 +group: discovery.k8s.io +j +x-kubernetes-actionget … discovery_v1beta1#replace the specified EndpointSlice*.replaceDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN L @@ -10733,12 +10326,6 @@ Jbodybody *: 8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ -K -200D -B -OK< -: -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice P 201I G @@ -10748,12 +10335,18 @@ G  401  - UnauthorizedRhttpsj + Unauthorized +K +200D +B +OK< +: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceRhttpsj x-kubernetes-actionput jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice +x-kubernetes-group-version-kind?=kind: EndpointSlice version: v1beta1 +group: discovery.k8s.io *± discovery_v1beta1delete an EndpointSlice*-deleteDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R @@ -10763,6 +10356,12 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status R 202K I @@ -10772,13 +10371,7 @@ I  401  - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj + UnauthorizedRhttpsj x-kubernetes-action delete jb x-kubernetes-group-version-kind?=group: discovery.k8s.io @@ -10801,18 +10394,87 @@ B  401  - UnauthorizedRhttpsjb + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jb x-kubernetes-group-version-kind?=group: discovery.k8s.io kind: EndpointSlice version: v1beta1 -j -x-kubernetes-actionpatch J: 86"4pathname of the EndpointSlice"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ü) -S/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations/{name}¤)Ï -flowcontrolApiserver_v1beta1Áwatch changes to an object of kind PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*:watchFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string  +6/apis/authorization.k8s.io/v1/selfsubjectaccessreviewsÔ +"Æ +authorization_v1 create a SelfSubjectAccessReview*,createAuthorizationV1SelfSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BW +U +Sbodybody *C +A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReviewJ¦ +T +200M +K +OKE +C +A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview +Y +201R +P +CreatedE +C +A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview +Z +202S +Q +AcceptedE +C +A#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpost +jk +x-kubernetes-group-version-kindHFgroup: authorization.k8s.io +kind: SelfSubjectAccessReview +version: v1 +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¦ + /api/v1/componentstatuses/{name}ï +core_v1"read the specified ComponentStatus*readCoreV1ComponentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.core.v1.ComponentStatus + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jQ +x-kubernetes-group-version-kind.,group: "" +kind: ComponentStatus +version: v1 +J< +:8"6pathname of the ComponentStatus"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string á +/apis/node.k8s.io/v1/ÇÄ +node_v1get available resources*getNodeV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps°( +:/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolesñ'å +rbacAuthorization_v1beta1wwatch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.*,watchRbacAuthorizationV1beta1ClusterRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -10822,11 +10484,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -10842,8 +10505,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JG -EC"Apath&name of the PriorityLevelConfiguration"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -10852,232 +10514,337 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ö' -*/api/v1/namespaces/{namespace}/pods/{name}Ç'É -core_v1read the specified Pod*readCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JR -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ì( +./api/v1/namespaces/{namespace}/services/{name}¹(Ù +core_v1read the specified Service*readCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service  401  UnauthorizedRhttpsj x-kubernetes-actionget -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod +jI +x-kubernetes-group-version-kind&$kind: Service version: v1 -„ -core_v1replace the specified Pod*replaceCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: -8 -6bodybody *& -$#/definitions/io.k8s.api.core.v1.PodBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J +group: "" +œ +core_v1replace the specified Service*replaceCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> < -2015 -3 -Created( -& -$#/definitions/io.k8s.api.core.v1.Pod +:bodybody ** +(#/definitions/io.k8s.api.core.v1.ServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜ +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.core.v1.Service  401  - Unauthorized -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.PodRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionput -jE -x-kubernetes-group-version-kind" version: v1 -group: "" -kind: Pod -*Á -core_v1 delete a Pod*deleteCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +*÷ +core_v1delete a Service*deleteCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J‘ -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod -= -2026 -4 -Accepted( -& -$#/definitions/io.k8s.api.core.v1.Pod +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod + UnauthorizedRhttpsjI +x-kubernetes-group-version-kind&$group: "" +kind: Service version: v1 -BÈ -core_v1"partially update the specified Pod*patchCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-action delete +BØ +core_v1&partially update the specified Service*patchCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JR -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service version: v1 -J0 -.,"*pathname of the Pod"name*string˜J` +J4 +20".pathname of the Service"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ’' -/api/v1/nodes/{name}ù&à -core_v1read the specified Node*readCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node +MKIquery-If 'true', then the output is pretty printed."pretty2string –] +4/apis/events.k8s.io/v1/namespaces/{namespace}/eventsÝ\û% + events_v1#list or watch objects of kind Event*listEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.events.v1.EventList  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node + UnauthorizedRhttpsj +x-kubernetes-actionlist +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event version: v1 -€ -core_v1replace the specified Node*replaceCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.core.v1.NodeBž +"Ü + events_v1create an Event*createEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.events.v1.EventBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÛ +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.events.v1.Event +A +202: 8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.core.v1.Node +Accepted, +* +(#/definitions/io.k8s.api.events.v1.Event  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node + Unauthorized +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.events.v1.EventRhttpsj +x-kubernetes-actionpost +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event version: v1 -*ä -core_v1 delete a Node*deleteCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ê, + events_v1delete collection of Event*'deleteEventsV1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event version: v1 -B -core_v1#partially update the specified Node*patchCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string —( +4/apis/networking.k8s.io/v1beta1/watch/ingressclassesÞ'Ò +networking_v1beta1xwatch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.*&watchNetworkingV1beta1IngressClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node -version: v1 -J1 -/-"+pathname of the Node"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string é -=/apis/apps/v1/namespaces/{namespace}/deployments/{name}/scale§ù -apps_v1&read scale of the specified Deployment*#readAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=kind: IngressClass +version: v1beta1 +group: networking.k8s.io +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ë' +)/apis/node.k8s.io/v1/watch/runtimeclasses½'± +node_v1xwatch individual changes to a list of RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead.*watchNodeV1RuntimeClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jW +x-kubernetes-group-version-kind42version: v1 +group: node.k8s.io +kind: RuntimeClass +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À( +)/apis/storage.k8s.io/v1/csidrivers/{name}’(ì + +storage_v1read the specified CSIDriver*readStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ @ 2009 7 OK1 / --#/definitions/io.k8s.api.autoscaling.v1.Scale +-#/definitions/io.k8s.api.storage.v1.CSIDriver  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver version: v1 -Æ -apps_v1)replace scale of the specified Deployment*&replaceAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +j +x-kubernetes-actionget +¹ + +storage_v1replace the specified CSIDriver*replaceStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC A ?bodybody */ --#/definitions/io.k8s.api.autoscaling.v1.ScaleBž +-#/definitions/io.k8s.api.storage.v1.CSIDriverBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ @ @@ -11085,67 +10852,97 @@ A 7 OK1 / --#/definitions/io.k8s.api.autoscaling.v1.Scale +-#/definitions/io.k8s.api.storage.v1.CSIDriver E 201> < Created1 / --#/definitions/io.k8s.api.autoscaling.v1.Scale +-#/definitions/io.k8s.api.storage.v1.CSIDriver  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -Bø -apps_v12partially update scale of the specified Deployment*$patchAppsV1NamespacedDeploymentScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver +version: v1 +*í + +storage_v1delete a CSIDriver*deleteStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J£ +F +202? += +Accepted1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriver + +401 + + Unauthorized +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriverRhttpsj +x-kubernetes-action delete +jW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver +version: v1 +Bë + +storage_v1(partially update the specified CSIDriver*patchStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ - -401 - - Unauthorized @ 2009 7 OK1 / --#/definitions/io.k8s.api.autoscaling.v1.ScaleRhttpsj +-#/definitions/io.k8s.api.storage.v1.CSIDriver + +401 + + UnauthorizedRhttpsj x-kubernetes-actionpatch -jP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale +jW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver version: v1 -J2 -0.",pathname of the Scale"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ù( -:/apis/events.k8s.io/v1/watch/namespaces/{namespace}/eventsš(¬ - events_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.* watchEventsV1NamespacedEventList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +J6 +42"0pathname of the CSIDriver"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ÿ& +/api/v1/resourcequotasä&Ø +core_v1+list or watch objects of kind ResourceQuota*'listCoreV1ResourceQuotaForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.core.v1.ResourceQuotaList  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 -j# -x-kubernetes-action  -watchlist +j +x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -11160,8 +10957,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -11170,155 +10966,109 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean µ* -6/apis/scheduling.k8s.io/v1beta1/priorityclasses/{name}ú)œ -scheduling_v1beta1 read the specified PriorityClass*"readSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  ) +0/api/v1/watch/namespaces/{namespace}/pods/{name}ë(Ë +core_v1ªwatch changes to an object of kind Pod. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjc -x-kubernetes-group-version-kind@>group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 -j -x-kubernetes-actionget - -scheduling_v1beta1#replace the specified PriorityClass*%replaceSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO -M -Kbodybody *; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jº -L -200E -C -OK= -; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass -Q -201J -H -Created= -; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jc -x-kubernetes-group-version-kind@>group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 -*© -scheduling_v1beta1delete a PriorityClass*$deleteSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjE +x-kubernetes-group-version-kind" group: "" +kind: Pod +version: v1 +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J0 +.,"*pathname of the Pod"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ +/apis/authentication.k8s.io/v1/ÛØ +authentication_v1get available resources*getAuthenticationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jc -x-kubernetes-group-version-kind@>group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 -B› -scheduling_v1beta1,partially update the specified PriorityClass*#patchSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jg + Unauthorized +U +200N L -200E -C -OK= -; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jc -x-kubernetes-group-version-kind@>group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 -J: -86"4pathname of the PriorityClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ÿ+ -O/apis/storage.k8s.io/v1beta1/namespaces/{namespace}/csistoragecapacities/{name}«+® -storage_v1beta1%read the specified CSIStorageCapacity*.readStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ji +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsŒ) +5/apis/batch/v1/namespaces/{namespace}/cronjobs/{name}Ò(ß +batch_v1read the specified CronJob*readBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JW  401  Unauthorized -N -200G -E -OK? -= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityRhttpsj +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.batch.v1.CronJobRhttpsj x-kubernetes-actionget -je -x-kubernetes-group-version-kindB@version: v1beta1 -group: storage.k8s.io -kind: CSIStorageCapacity -— -storage_v1beta1(replace the specified CSIStorageCapacity*1replaceStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ -O -Mbodybody *= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¾ -S -201L -J -Created? +jL +x-kubernetes-group-version-kind)'kind: CronJob +version: v1 +group: batch +¤ +batch_v1replace the specified CronJob*replaceBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B? = -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +;bodybody *+ +)#/definitions/io.k8s.api.batch.v1.CronJobBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jš +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.batch.v1.CronJob +A +201: +8 +Created- ++ +)#/definitions/io.k8s.api.batch.v1.CronJob  401  - Unauthorized -N -200G -E -OK? -= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionput -je -x-kubernetes-group-version-kindB@kind: CSIStorageCapacity -version: v1beta1 -group: storage.k8s.io -*¹ -storage_v1beta1delete a CSIStorageCapacity*0deleteStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob +version: v1 +*ü +batch_v1delete a CronJob*deleteBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -11341,214 +11091,41 @@ I  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -je -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity -version: v1beta1 -B­ -storage_v1beta11partially update the specified CSIStorageCapacity*/patchStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ji -N -200G -E -OK? -= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity - -401 - - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity -version: v1beta1 -j -x-kubernetes-actionpatch -J? -=;"9pathname of the CSIStorageCapacity"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string È) -4/api/v1/namespaces/{namespace}/resourcequotas/{name})ñ -core_v1 read the specified ResourceQuota*!readCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jO -x-kubernetes-group-version-kind,*kind: ResourceQuota -version: v1 -group: "" -À -core_v1#replace the specified ResourceQuota*$replaceCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*kind: ResourceQuota + UnauthorizedRhttpsjL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob version: v1 -group: "" -j -x-kubernetes-actionput -*ó -core_v1delete a ResourceQuota*#deleteCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J¥ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota -G -202@ -> -Accepted2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsj +j x-kubernetes-action delete -jO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -Bð -core_v1,partially update the specified ResourceQuota*"patchCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.ResourceQuota - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -j -x-kubernetes-actionpatch -J: -86"4pathname of the ResourceQuota"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string  -J/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}/statusÎä -certificates_v1beta16read status of the specified CertificateSigningRequest*6readCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jq -x-kubernetes-group-version-kindNLgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1beta1 -å -certificates_v1beta19replace status of the specified CertificateSigningRequest*9replaceCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] -[ -Ybodybody *I -G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÖ -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest -_ -201X -V -CreatedK -I -G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jq -x-kubernetes-group-version-kindNLgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1beta1 -Bã -certificates_v1beta1Bpartially update status of the specified CertificateSigningRequest*7patchCertificatesV1beta1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +BÞ +batch_v1&partially update the specified CronJob*patchBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JW +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.batch.v1.CronJob  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jq -x-kubernetes-group-version-kindNLgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1beta1 -JF -DB"@path%name of the CertificateSigningRequest"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ÿ' -*/apis/networking.k8s.io/v1/watch/ingressesÐ'Ä - networking_v1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*,watchNetworkingV1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob +version: v1 +J4 +20".pathname of the CronJob"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ß( +4/api/v1/watch/namespaces/{namespace}/serviceaccounts¦(¸ +core_v1zwatch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.*'watchCoreV1NamespacedServiceAccountList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -11561,10 +11138,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jX -x-kubernetes-group-version-kind53kind: Ingress +jP +x-kubernetes-group-version-kind-+group: "" +kind: ServiceAccount version: v1 -group: networking.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -11579,7 +11156,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -11588,9 +11166,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ã) -H/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses/{name}–)ò - networking_v1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ã( +-/api/v1/watch/namespaces/{namespace}/services‘(£ +core_v1swatch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.* watchCoreV1NamespacedServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -11600,12 +11178,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jI +x-kubernetes-group-version-kind&$version: v1 +group: "" +kind: Service J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -11620,8 +11199,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the Ingress"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -11631,94 +11209,47 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ² - /api/v1/namespaces/{name}/statusç -core_v1&read status of the specified Namespace*readCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹ +#/apis/apiextensions.k8s.io/v1beta1/ãà +apiextensions_v1beta1get available resources*#getApiextensionsV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -® -core_v1)replace status of the specified Namespace*replaceCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.core.v1.NamespaceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Namespace + UnauthorizedRhttpsö +/apis/events.k8s.io/v1beta1/ÕÒ +events_v1beta1get available resources*getEventsV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&kind: Namespace -version: v1 -group: "" -j -x-kubernetes-actionput -Bæ -core_v12partially update status of the specified Namespace*patchCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace + UnauthorizedRhttpsù( +6/apis/networking.k8s.io/v1/watch/ingressclasses/{name}¾(÷ + networking_v1³watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  UnauthorizedRhttpsj -x-kubernetes-actionpatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -J6 -42"0pathname of the Namespace"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¬) -7/apis/batch/v1/watch/namespaces/{namespace}/jobs/{name}ð(Ð -batch_v1ªwatch changes to an object of kind Job. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk - -401 - - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj x-kubernetes-actionwatch -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -11734,9 +11265,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J0 -.,"*pathname of the Job"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 +75"3pathname of the IngressClass"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -11745,81 +11275,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷ -N/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}/status¤ž -networking_v1beta1$read status of the specified Ingress*,readNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress - -401 - - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -j -x-kubernetes-actionget -÷ -networking_v1beta1'replace status of the specified Ingress*/replaceNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.networking.v1beta1.IngressBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress - -401 - - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8kind: Ingress -version: v1beta1 -group: networking.k8s.io -j -x-kubernetes-actionput -B -networking_v1beta10partially update status of the specified Ingress*-patchNetworkingV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -J4 -20".pathname of the Ingress"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ö' -+/apis/storage.k8s.io/v1beta1/watch/csinodesÆ'º -storage_v1beta1swatch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1beta1CSINodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ”* +M/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgets/{name}Â)’ +policy_v1beta1ºwatch changes to an object of kind PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -11829,13 +11287,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget version: v1beta1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -11850,7 +11307,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J@ +><":pathname of the PodDisruptionBudget"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -11859,21 +11318,114 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‘ -%/apis/apiregistration.k8s.io/v1beta1/çä -apiregistration_v1beta1get available resources*%getApiregistrationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean €) +-/apis/storage.k8s.io/v1/storageclasses/{name}Î(ø + +storage_v1read the specified StorageClass*readStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass  401  - Unauthorized -U -200N -L -OKF + UnauthorizedRhttpsj +x-kubernetes-actionget +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +Ë + +storage_v1"replace the specified StorageClass*replaceStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsñ] -;/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses±]“& - networking_v1%list or watch objects of kind Ingress*!listNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +Bbodybody *2 +0#/definitions/io.k8s.api.storage.v1.StorageClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¨ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass +H +201A +? +Created4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +*ü + +storage_v1delete a StorageClass*deleteStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J© +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass +I +202B +@ +Accepted4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass + +401 + + UnauthorizedRhttpsjZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +j +x-kubernetes-action delete +B÷ + +storage_v1+partially update the specified StorageClass*patchStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 +J9 +75"3pathname of the StorageClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ý] +./apis/storage.k8s.io/v1beta1/volumeattachmentsÊ]µ& +storage_v1beta1.list or watch objects of kind VolumeAttachment*"listStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -11895,58 +11447,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.networking.v1.IngressList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentList  401  - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53version: v1 -group: networking.k8s.io -kind: Ingress -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"† - networking_v1create an Ingress*#createNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.networking.v1.IngressBž +jc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +"È +storage_v1beta1create a VolumeAttachment*$createStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO +M +Kbodybody *; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JŽ +L +200E +C +OK= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +Q +201J +H +Created= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +R +202K +I +Accepted= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment  401  - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress -G -202@ -> -Accepted2 -0 -.#/definitions/io.k8s.api.networking.v1.IngressRhttpsjX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 j x-kubernetes-actionpost -*Ü, - networking_v1delete collection of Ingress*-deleteNetworkingV1CollectionNamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ó, +storage_v1beta1%delete collection of VolumeAttachment*.deleteStorageV1beta1CollectionVolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -11983,137 +11535,141 @@ C  401  - UnauthorizedRhttpsj* + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +j* x-kubernetes-actiondeletecollection -jX -x-kubernetes-group-version-kind53version: v1 -group: networking.k8s.io -kind: Ingress -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ü* -H/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies/{name}¯*’ - networking_v1 read the specified NetworkPolicy*'readNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ý) +5/api/v1/namespaces/{namespace}/serviceaccounts/{name}£)õ +core_v1!read the specified ServiceAccount*"readCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J] +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionget -í - networking_v1#replace the specified NetworkPolicy**replaceNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicyBž +jP +x-kubernetes-group-version-kind-+version: v1 +group: "" +kind: ServiceAccount +Æ +core_v1$replace the specified ServiceAccount*%replaceCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BE +C +Abodybody *1 +/#/definitions/io.k8s.api.core.v1.ServiceAccountBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¦ +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount G -200@ +201@ > -OK8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy -L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +Created3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount  401  UnauthorizedRhttpsj x-kubernetes-actionput -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy +jP +x-kubernetes-group-version-kind-+kind: ServiceAccount version: v1 -*¤ - networking_v1delete a NetworkPolicy*)deleteNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: "" +*ø +core_v1delete a ServiceAccount*$deleteCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J§ +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount +H +202A +? +Accepted3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount  401  - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: "" +kind: ServiceAccount version: v1 -B‘ - networking_v1,partially update the specified NetworkPolicy*(patchNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-action delete +Bô +core_v1-partially update the specified ServiceAccount*#patchCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J] +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: "" +kind: ServiceAccount version: v1 -J: -86"4pathname of the NetworkPolicy"name*string˜J` +j +x-kubernetes-actionpatch +J; +97"5pathname of the ServiceAccount"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‰ -#/apis/rbac.authorization.k8s.io/v1/áÞ -rbacAuthorization_v1get available resources*"getRbacAuthorizationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +MKIquery-If 'true', then the output is pretty printed."pretty2string »( ++/api/v1/watch/namespaces/{namespace}/events‹( +core_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedEventList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttps¢_ -K/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindingsÒ^Ç& -rbacAuthorization_v1beta1)list or watch objects of kind RoleBinding*1listRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -12121,243 +11677,136 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë* +?/apis/apps/v1/namespaces/{namespace}/controllerrevisions/{name}‡*‡ +apps_v1%read the specified ControllerRevision*&readAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision  401  - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding -version: v1beta1 -j -x-kubernetes-actionlist -" -rbacAuthorization_v1beta1create a RoleBinding*3createRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingBž + UnauthorizedRhttpsjV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 +j +x-kubernetes-actionget +à +apps_v1(replace the specified ControllerRevision*)replaceAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevisionBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jö -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding -I -201B -@ -Created5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding -J -202C -A -Accepted5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding -version: v1beta1 -*- -rbacAuthorization_v1beta1 delete collection of RoleBinding*=deleteRbacAuthorizationV1beta1CollectionNamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + UnauthorizedRhttpsj +x-kubernetes-actionput +jV +x-kubernetes-group-version-kind31kind: ControllerRevision +version: v1 +group: apps +*š +apps_v1delete a ControllerRevision*(deleteAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg - -401 - - Unauthorized +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding -version: v1beta1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string õ -?/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/status±û -apps_v1(read status of the specified StatefulSet*%readAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -Æ -apps_v1+replace status of the specified StatefulSet*(replaceAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.apps.v1.StatefulSetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet -D -201= +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= ; -Created0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet + UnauthorizedRhttpsj +x-kubernetes-action delete +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision version: v1 -Bú -apps_v14partially update status of the specified StatefulSet*&patchAppsV1NamespacedStatefulSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B† +apps_v11partially update the specified ControllerRevision*'patchAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision version: v1 -J8 -64"2pathname of the StatefulSet"name*string˜J` +J? +=;"9pathname of the ControllerRevision"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string è' -/api/v1/watch/resourcequotasÇ'» -core_v1ywatch individual changes to a list of ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead.*,watchCoreV1ResourceQuotaListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean É( -8/apis/autoscaling/v2beta2/watch/horizontalpodautoscalersŒ(€ -autoscaling_v2beta2ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*BwatchAutoscalingV2beta2HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string –' +$/apis/networking.k8s.io/v1/ingressesí&á + networking_v1%list or watch objects of kind Ingress*'listNetworkingV1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.networking.v1.IngressList  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjg -x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler -version: v2beta2 -group: autoscaling -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsj +x-kubernetes-actionlist +jX +x-kubernetes-group-version-kind53version: v1 +group: networking.k8s.io +kind: Ingress J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -12381,168 +11830,96 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ³] -*/apis/scheduling.k8s.io/v1/priorityclasses„]¡& - scheduling_v1+list or watch objects of kind PriorityClass*listSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.scheduling.v1.PriorityClassList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean å +>/apis/apps/v1/namespaces/{namespace}/replicasets/{name}/status¢÷ +apps_v1'read status of the specified ReplicaSet*$readAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass + UnauthorizedRhttpsj +x-kubernetes-actionget +jN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet version: v1 -j -x-kubernetes-actionlist -"¥ - scheduling_v1create a PriorityClass*createSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClassBž +À +apps_v1*replace status of the specified ReplicaSet*'replaceAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.ReplicaSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jÿ -G -200@ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž > -OK8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass -L -201E +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet C -Created8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass -M -202F -D -Accepted8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 -*ä, - scheduling_v1"delete collection of PriorityClass*)deleteSchedulingV1CollectionPriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: ReplicaSet +j +x-kubernetes-actionput +Bö +apps_v13partially update status of the specified ReplicaSet*%patchAppsV1NamespacedReplicaSetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ê -/apis/storage.k8s.io/v1/ÍÊ - -storage_v1get available resources*getStorageV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +J7 +53"1pathname of the ReplicaSet"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ó) +E/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions/{name}©)ú +apps_v1¹watch changes to an object of kind ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsÊ -/api/À½ -coreget available API versions*getCoreAPIVersions2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJl -Q -200J -H -OKB -@ ->#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions - -401 - - UnauthorizedRhttps’* -W/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations/{name}¶)Ý -admissionregistration_v1beta1Åwatch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*?watchAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj x-kubernetes-actionwatch -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -12557,8 +11934,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JK -IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? +=;"9pathname of the ControllerRevision"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -12567,9 +11945,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿( -=/apis/apiextensions.k8s.io/v1/watch/customresourcedefinitionsý'ñ -apiextensions_v1„watch individual changes to a list of CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead.*0watchApiextensionsV1CustomResourceDefinitionList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean æ' +#/apis/events.k8s.io/v1/watch/events¾'² + events_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*&watchEventsV1EventListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -12582,9 +11960,9 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -12609,138 +11987,350 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ó& -/apis/apps/v1/daemonsetsÖ&Ê -apps_v1'list or watch objects of kind DaemonSet*#listAppsV1DaemonSetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.apps.v1.DaemonSetList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ó +/apis/scheduling.k8s.io/v1/ÓÐ + scheduling_v1get available resources*getSchedulingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp  401  - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(version: v1 -group: apps -kind: DaemonSet -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¾) -6/api/v1/watch/namespaces/{namespace}/configmaps/{name}ƒ)Ý -core_v1°watch changes to an object of kind ConfigMap. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedConfigMap2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsŒ +"/.well-known/openid-configuration/åâ + WellKnownWget service account issuer OpenID configuration, also known as the 'OIDC discovery doc'**getServiceAccountIssuerOpenIDConfiguration2application/jsonJ7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap + UnauthorizedRhttpsö' +*/api/v1/namespaces/{namespace}/pods/{name}Ç'É +core_v1read the specified Pod*readCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JR +7 +2000 +. +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod + +401 + + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" group: "" +kind: Pod version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 -42"0pathname of the ConfigMap"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean æ) -:/apis/batch/v1beta1/namespaces/{namespace}/cronjobs/{name}§)ó - batch_v1beta1read the specified CronJob*!readBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ -A -200: +j +x-kubernetes-actionget +„ +core_v1replace the specified Pod*replaceCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: 8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob +6bodybody *& +$#/definitions/io.k8s.api.core.v1.PodBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J +7 +2000 +. +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod +< +2015 +3 +Created( +& +$#/definitions/io.k8s.api.core.v1.Pod  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" group: "" +kind: Pod +version: v1 +j +x-kubernetes-actionput +*Á +core_v1 delete a Pod*deleteCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J‘ +7 +2000 +. +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod += +2026 +4 +Accepted( +& +$#/definitions/io.k8s.api.core.v1.Pod + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jE +x-kubernetes-group-version-kind" group: "" +kind: Pod +version: v1 +BÈ +core_v1"partially update the specified Pod*patchCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JR +7 +2000 +. +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod + +401 + + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" version: v1 +group: "" +kind: Pod +j +x-kubernetes-actionpatch +J0 +.,"*pathname of the Pod"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ­ +3/api/v1/namespaces/{namespace}/pods/{name}/evictionõ +"Î +core_v1create eviction of a Pod*!createCoreV1NamespacedPodEviction2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF +D +Bbodybody *2 +0#/definitions/io.k8s.api.policy.v1beta1.EvictionJó + +401 + + Unauthorized +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.policy.v1beta1.Eviction +H +201A +? +Created4 +2 +0#/definitions/io.k8s.api.policy.v1beta1.Eviction +I +202B +@ +Accepted4 +2 +0#/definitions/io.k8s.api.policy.v1beta1.EvictionRhttpsj +x-kubernetes-actionpost +jS +x-kubernetes-group-version-kind0.group: policy +kind: Eviction version: v1beta1 - - batch_v1beta1replace the specified CronJob*$replaceBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J5 +31"/pathname of the Eviction"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ª +;/api/v1/namespaces/{namespace}/services/{name}/proxy/{path}ê§ +core_v1(connect GET requests to proxy of Service*.connectCoreV1GetNamespacedServiceProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20kind: ServiceProxyOptions +version: v1 +group: "" +§ +core_v1(connect PUT requests to proxy of Service*.connectCoreV1PutNamespacedServiceProxyWithPath2*/*:*/*J7  401  Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob + +200 + +OK + ² +stringRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +"© +core_v1)connect POST requests to proxy of Service*/connectCoreV1PostNamespacedServiceProxyWithPath2*/*:*/*J7 + +401 + + Unauthorized + +200 + +OK + ² +stringRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +*­ +core_v1+connect DELETE requests to proxy of Service*1connectCoreV1DeleteNamespacedServiceProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +2¯ +core_v1,connect OPTIONS requests to proxy of Service*2connectCoreV1OptionsNamespacedServiceProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +:© +core_v1)connect HEAD requests to proxy of Service*/connectCoreV1HeadNamespacedServiceProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +B« +core_v1*connect PATCH requests to proxy of Service*0connectCoreV1PatchNamespacedServiceProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions +version: v1 +J@ +><":pathname of the ServiceProxyOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜J5 +31"/pathpath to the resource"path*string˜JÐ +ÍÊÇquery¬Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy."path2string û* +=/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}¹*¬ +rbacAuthorization_v1%read the specified ClusterRoleBinding*)readRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja F -201? +200? = -Created2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobRhttpsj +OK7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 +… +rbacAuthorization_v1(replace the specified ClusterRoleBinding*,replaceRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding + +401 + + UnauthorizedRhttpsj x-kubernetes-actionput -jQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -*‹ - batch_v1beta1delete a CronJob*#deleteBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 +*¿ +rbacAuthorization_v1delete a ClusterRoleBinding*+deleteRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -12763,41 +12353,40 @@ I  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 +j x-kubernetes-action delete -jQ -x-kubernetes-group-version-kind.,kind: CronJob -version: v1beta1 -group: batch -Bò - batch_v1beta1&partially update the specified CronJob*"patchBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B« +rbacAuthorization_v11partially update the specified ClusterRoleBinding**patchRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding  401  - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionpatch -J4 -20".pathname of the CronJob"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string •] -(/apis/node.k8s.io/v1beta1/runtimeclassesè\™& - node_v1beta1*list or watch objects of kind RuntimeClass*listNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 +J? +=;"9pathname of the ClusterRoleBinding"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¿^ +5/api/v1/namespaces/{namespace}/persistentvolumeclaims…^ª& +core_v13list or watch objects of kind PersistentVolumeClaim*)listCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -12819,58 +12408,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.node.v1beta1.RuntimeClassList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jh +M +200F +D +OK> +< +:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42version: v1 +group: "" +kind: PersistentVolumeClaim +j x-kubernetes-actionlist -j\ -x-kubernetes-group-version-kind97group: node.k8s.io -kind: RuntimeClass -version: v1beta1 -"— - node_v1beta1create a RuntimeClass*createNodeV1beta1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH -F -Dbodybody *4 -2#/definitions/io.k8s.api.node.v1beta1.RuntimeClassBž +"´ +core_v1create a PersistentVolumeClaim*+createCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jù -K -202D -B -Accepted6 -4 -2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J…  401  Unauthorized +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +N +201G E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass -J -201C -A -Created6 -4 -2#/definitions/io.k8s.api.node.v1beta1.RuntimeClassRhttpsj +Created: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +O +202H +F +Accepted: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimRhttpsj x-kubernetes-actionpost -j\ -x-kubernetes-group-version-kind97kind: RuntimeClass -version: v1beta1 -group: node.k8s.io -*Þ, - node_v1beta1!delete collection of RuntimeClass*'deleteNodeV1beta1CollectionRuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +*ë, +core_v1*delete collection of PersistentVolumeClaim*5deleteCoreV1CollectionNamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -12909,231 +12498,91 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -j\ -x-kubernetes-group-version-kind97group: node.k8s.io -kind: RuntimeClass -version: v1beta1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ä) -2/apis/storage.k8s.io/v1beta1/storageclasses/{name}­)Œ -storage_v1beta1read the specified StorageClass*readStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jc -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -j_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -é -storage_v1beta1"replace the specified StorageClass*!replaceStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BK -I -Gbodybody *7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J² -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass -M -201F -D -Created9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -*• -storage_v1beta1delete a StorageClass* deleteStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J³ -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass -N -202G -E -Accepted9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass - -401 - - UnauthorizedRhttpsj_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -j -x-kubernetes-action delete -B‹ -storage_v1beta1+partially update the specified StorageClass*patchStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jc -H -200A +jW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ó( +B/apis/certificates.k8s.io/v1beta1/watch/certificatesigningrequestsŒ(€ +certificates_v1beta1…watch individual changes to a list of CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead.*5watchCertificatesV1beta1CertificateSigningRequestList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA ? -OK9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1beta1 -J9 -75"3pathname of the StorageClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ä -E/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}/statusšî -apiextensions_v15read status of the specified CustomResourceDefinition*1readApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1 -ž +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -apiextensions_v18replace status of the specified CustomResourceDefinition*4replaceApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu -s -qbodybody *a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J† -w -201p -n -Createdc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition - -401 - - Unauthorized -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionRhttpsjl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1 -j -x-kubernetes-actionput -Bí -apiextensions_v1Apartially update status of the specified CustomResourceDefinition*2patchApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ +/apis/discovery.k8s.io/v1beta1/ÛØ +discovery_v1beta1get available resources*getDiscoveryV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jl -x-kubernetes-group-version-kindIGkind: CustomResourceDefinition -version: v1 -group: apiextensions.k8s.io -JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ß - -0/apis/authentication.k8s.io/v1beta1/tokenreviewsª -"œ -authentication_v1beta1create a TokenReview*&createAuthenticationV1beta1TokenReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ -O -Mbodybody *= -;#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewJ” -N -200G -E -OK? -= -;#/definitions/io.k8s.api.authentication.v1beta1.TokenReview -S -201L + UnauthorizedRhttps¡' +"/apis/extensions/v1beta1/ingressesú&î +extensions_v1beta1%list or watch objects of kind Ingress*,listExtensionsV1beta1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je J -Created? -= -;#/definitions/io.k8s.api.authentication.v1beta1.TokenReview -T -202M -K -Accepted? -= -;#/definitions/io.k8s.api.authentication.v1beta1.TokenReview +200C +A +OK; +9 +7#/definitions/io.k8s.api.extensions.v1beta1.IngressList  401  UnauthorizedRhttpsj -x-kubernetes-actionpost -je -x-kubernetes-group-version-kindB@group: authentication.k8s.io -kind: TokenReview +x-kubernetes-actionlist +jV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress version: v1beta1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string á] -9/apis/events.k8s.io/v1beta1/namespaces/{namespace}/events£]& -events_v1beta1#list or watch objects of kind Event* listEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -13141,76 +12590,82 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.events.v1beta1.EventList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  ' +!/apis/apps/v1/controllerrevisionsú&î +apps_v10list or watch objects of kind ControllerRevision*,listAppsV1ControllerRevisionForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.apps.v1.ControllerRevisionList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jW -x-kubernetes-group-version-kind42kind: Event -version: v1beta1 -group: events.k8s.io -"ÿ -events_v1beta1create an Event*"createEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC -A -?bodybody */ --#/definitions/io.k8s.api.events.v1beta1.EventBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jê -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event -E -201> -< -Created1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event -F -202? -= -Accepted1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —( +0/apis/networking.k8s.io/v1/watch/networkpoliciesâ'Ö + networking_v1ywatch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.*2watchNetworkingV1NetworkPolicyListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -j -x-kubernetes-actionpost -*Ù, -events_v1beta1delete collection of Event*,deleteEventsV1beta1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -13218,94 +12673,106 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —) +J/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolesÈ(Ú +rbacAuthorization_v1beta1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*/watchRbacAuthorizationV1beta1NamespacedRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - Unauthorized + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=kind: Role +version: v1beta1 +group: rbac.authorization.k8s.io +j# +x-kubernetes-action  +watchlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ·* +5/apis/storage.k8s.io/v1beta1/volumeattachments/{name}ý)œ +storage_v1beta1#read the specified VolumeAttachment*"readStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jg L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ü -/apis/extensions/Æà - -extensionsget information of a group*getExtensionsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment  401  - UnauthorizedRhttps’* -F/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}Ç)þ -rbacAuthorization_v1read the specified Role*%readRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +j +x-kubernetes-actionget + +storage_v1beta1&replace the specified VolumeAttachment*%replaceStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO +M +Kbodybody *; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jº +L +200E +C +OK= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +Q +201J +H +Created= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment  401  - Unauthorized -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.rbac.v1.RoleRhttpsj -x-kubernetes-actionget -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role -version: v1 -» -rbacAuthorization_v1replace the specified Role*(replaceRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.rbac.v1.RoleBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.rbac.v1.Role -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.rbac.v1.Role - -401 - - UnauthorizedRhttpsj + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +j x-kubernetes-actionput -j] -x-kubernetes-group-version-kind:8version: v1 -group: rbac.authorization.k8s.io -kind: Role -*Ÿ -rbacAuthorization_v1 delete a Role*'deleteRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*© +storage_v1beta1delete a VolumeAttachment*$deleteStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -13318,52 +12785,50 @@ L C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment R 202K I Accepted= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment  401  UnauthorizedRhttpsj x-kubernetes-action delete -j] -x-kubernetes-group-version-kind:8version: v1 -group: rbac.authorization.k8s.io -kind: Role -Bý -rbacAuthorization_v1#partially update the specified Role*&patchRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +B› +storage_v1beta1/partially update the specified VolumeAttachment*#patchStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.rbac.v1.Role +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role -version: v1 + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>version: v1beta1 +group: storage.k8s.io +kind: VolumeAttachment j x-kubernetes-actionpatch -J1 -/-"+pathname of the Role"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string í( -3/apis/storage.k8s.io/v1/watch/storageclasses/{name}µ(î - -storage_v1³watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +J= +;9"7pathname of the VolumeAttachment"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ª) +2/api/v1/watch/namespaces/{namespace}/events/{name}ó(Ñ +core_v1¬watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -13375,9 +12840,9 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -13393,8 +12858,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the StorageClass"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 +0.",pathname of the Event"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -13403,9 +12869,63 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×) -;/api/v1/watch/namespaces/{namespace}/serviceaccounts/{name}—)ì -core_v1µwatch changes to an object of kind ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean »( +/api/v1/watch/namespaces/{name}—(Ó +core_v1°watch changes to an object of kind Namespace. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj +x-kubernetes-actionwatch +jK +x-kubernetes-group-version-kind(&kind: Namespace +version: v1 +group: "" +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 +42"0pathname of the Namespace"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean „ +#/apis/admissionregistration.k8s.io/ÜÙ +admissionregistrationget information of a group* getAdmissionregistrationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttps÷) +M/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses/{name}¥) +networking_v1beta1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -13415,12 +12935,12 @@ G  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionwatch +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -13435,8 +12955,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J; -97"5pathname of the ServiceAccount"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the Ingress"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -13446,23 +12966,36 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean §' -/api/v1/replicationcontrollers„'ø -core_v13list or watch objects of kind ReplicationController*/listCoreV1ReplicationControllerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh -M -200F -D -OK> -< -:#/definitions/io.k8s.api.core.v1.ReplicationControllerList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ù + /apis/rbac.authorization.k8s.io/ÔÑ +rbacAuthorizationget information of a group*getRbacAuthorizationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist + UnauthorizedRhttpsÝ( +//apis/storage.k8s.io/v1/watch/csidrivers/{name}©(å + +storage_v1°watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -13478,7 +13011,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 +42"0pathname of the CSIDriver"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -13487,9 +13021,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ó) -E/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions/{name}©)ú -apps_v1¹watch changes to an object of kind ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ' +*/apis/networking.k8s.io/v1/watch/ingressesÐ'Ä + networking_v1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*,watchNetworkingV1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -13499,11 +13033,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -13519,9 +13054,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? -=;"9pathname of the ControllerRevision"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -13530,111 +13063,171 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean å* -G/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}™*Ž -networking_v1beta1read the specified Ingress*&readNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ð] +./apis/networking.k8s.io/v1beta1/ingressclasses½]±& +networking_v1beta1*list or watch objects of kind IngressClass*!listNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj +O +200H F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress +OK@ +> +<#/definitions/io.k8s.api.networking.v1beta1.IngressClassList  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress + UnauthorizedRhttpsj +x-kubernetes-actionlist +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass version: v1beta1 -ç -networking_v1beta1replace the specified Ingress*)replaceNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.networking.v1beta1.IngressBž +" +networking_v1beta1create an IngressClass*#createNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN +L +Jbodybody *: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ K -201D +200D B -Created7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress +OK< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +P +201I +G +Created< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +Q +202J +H +Accepted< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress + UnauthorizedRhttpsj +x-kubernetes-actionpost +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass version: v1beta1 -*¢ -networking_v1beta1delete an Ingress*(deleteNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ð, +networking_v1beta1!delete collection of IngressClass*-deleteNetworkingV1beta1CollectionIngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass version: v1beta1 -B -networking_v1beta1&partially update the specified Ingress*'patchNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress +j* +x-kubernetes-actiondeletecollection +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string …* +Q/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/roles/{name}¯)Ž +rbacAuthorization_v1beta1«watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*+watchRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  UnauthorizedRhttpsj -x-kubernetes-actionpatch -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress +x-kubernetes-actionwatch +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role version: v1beta1 -J4 -20".pathname of the Ingress"name*string˜J` +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J1 +/-"+pathname of the Role"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¥) -A/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterroles/{name}ß(™ -rbacAuthorization_v1beta1²watch changes to an object of kind ClusterRole. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*(watchRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ƒ) +N/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations°(¤ +admissionregistration_v1beta1ˆwatch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*AwatchAdmissionregistrationV1beta1MutatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -13644,12 +13237,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j} +x-kubernetes-group-version-kindZXkind: MutatingWebhookConfiguration version: v1beta1 +group: admissionregistration.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -13664,8 +13258,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 -64"2pathname of the ClusterRole"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -13674,27 +13267,51 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´ -4/api/v1/namespaces/{namespace}/services/{name}/proxyûŸ -core_v1(connect GET requests to proxy of Service*&connectCoreV1GetNamespacedServiceProxy2*/*:*/*J7 +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean É( +8/apis/autoscaling/v2beta1/watch/horizontalpodautoscalersŒ(€ +autoscaling_v2beta1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*BwatchAutoscalingV2beta1HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - Unauthorized - -200 - -OK - ² -stringRhttpsj! -x-kubernetes-action -connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions -version: v1 -Ÿ -core_v1(connect PUT requests to proxy of Service*&connectCoreV1PutNamespacedServiceProxy2*/*:*/*J7 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean è +0/api/v1/namespaces/{namespace}/pods/{name}/proxy³“ +core_v1$connect GET requests to proxy of Pod*"connectCoreV1GetNamespacedPodProxy2*/*:*/*J7  200  @@ -13707,12 +13324,12 @@ version: v1 UnauthorizedRhttpsj! x-kubernetes-action connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -"¡ -core_v1)connect POST requests to proxy of Service*'connectCoreV1PostNamespacedServiceProxy2*/*:*/*J7 +“ +core_v1$connect PUT requests to proxy of Pod*"connectCoreV1PutNamespacedPodProxy2*/*:*/*J7  200  @@ -13725,12 +13342,12 @@ version: v1 UnauthorizedRhttpsj! x-kubernetes-action connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -*¥ -core_v1+connect DELETE requests to proxy of Service*)connectCoreV1DeleteNamespacedServiceProxy2*/*:*/*J7 +"• +core_v1%connect POST requests to proxy of Pod*#connectCoreV1PostNamespacedPodProxy2*/*:*/*J7  200  @@ -13743,12 +13360,12 @@ version: v1 UnauthorizedRhttpsj! x-kubernetes-action connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -2§ -core_v1,connect OPTIONS requests to proxy of Service**connectCoreV1OptionsNamespacedServiceProxy2*/*:*/*J7 +*™ +core_v1'connect DELETE requests to proxy of Pod*%connectCoreV1DeleteNamespacedPodProxy2*/*:*/*J7  200  @@ -13761,30 +13378,30 @@ version: v1 UnauthorizedRhttpsj! x-kubernetes-action connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -:¡ -core_v1)connect HEAD requests to proxy of Service*'connectCoreV1HeadNamespacedServiceProxy2*/*:*/*J7 - -401 - - Unauthorized +2› +core_v1(connect OPTIONS requests to proxy of Pod*&connectCoreV1OptionsNamespacedPodProxy2*/*:*/*J7  200  OK ² -stringRhttpsjU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions -version: v1 -j! +string + +401 + + UnauthorizedRhttpsj! x-kubernetes-action connect -B£ -core_v1*connect PATCH requests to proxy of Service*(connectCoreV1PatchNamespacedServiceProxy2*/*:*/*J7 +jQ +x-kubernetes-group-version-kind.,version: v1 +group: "" +kind: PodProxyOptions +:• +core_v1%connect HEAD requests to proxy of Pod*#connectCoreV1HeadNamespacedPodProxy2*/*:*/*J7  200  @@ -13797,109 +13414,40 @@ B UnauthorizedRhttpsj! x-kubernetes-action connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -J@ -><":pathname of the ServiceProxyOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JÐ -ÍÊÇquery¬Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy."path2string Ã ->/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}/status€É -apiregistration_v1beta1'read status of the specified APIService**readApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -j -x-kubernetes-actionget -Ü -apiregistration_v1beta1*replace status of the specified APIService*-replaceApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bf -d -bbodybody *R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jè -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService -h -201a -_ -CreatedT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -BÈ -apiregistration_v1beta13partially update status of the specified APIService*+patchApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J~ -c -200\ -Z -OKT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService - -401 - - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService -j -x-kubernetes-actionpatch -J7 -53"1pathname of the APIService"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ë) -=/apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}‰)â -apps_v1±watch changes to an object of kind Deployment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +B— +core_v1&connect PATCH requests to proxy of Pod*$connectCoreV1PatchNamespacedPodProxy2*/*:*/*J7  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment + Unauthorized + +200 + +OK + ² +stringRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +J< +:8"6pathname of the PodProxyOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜Ja +_][queryAPath is the URL path to use for the current proxy request to pod."path2string Ç] +-/api/v1/namespaces/{namespace}/resourcequotas•]Š& +core_v1+list or watch objects of kind ResourceQuota*!listCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -13907,84 +13455,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the Deployment"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ì' -/apis/batch/v1/watch/jobs®'¢ -batch_v1owatch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.*#watchBatchV1JobListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.core.v1.ResourceQuotaList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job + UnauthorizedRhttpsj +x-kubernetes-actionlist +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À) -;/apis/batch/v1/watch/namespaces/{namespace}/cronjobs/{name}€)Ü -batch_v1®watch changes to an object of kind CronJob. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I +"ü +core_v1create a ResourceQuota*#createCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +202@ +> +Accepted2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob + Unauthorized +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuotaRhttpsj +x-kubernetes-actionpost +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +*Ó, +core_v1"delete collection of ResourceQuota*-deleteCoreV1CollectionNamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -13992,78 +13532,51 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the CronJob"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é) -F/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}ž)ú -extensions_v1beta1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjV -x-kubernetes-group-version-kind31version: v1beta1 -group: extensions -kind: Ingress -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the Ingress"name*string˜J` + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota +version: v1 +j* +x-kubernetes-actiondeletecollection +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚) -8/apis/apiregistration.k8s.io/v1/watch/apiservices/{name}Å(€ -apiregistration_v1±watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +MKIquery-If 'true', then the output is pretty printed."pretty2string ®' +(/apis/discovery.k8s.io/v1/endpointslices'õ + discovery_v1+list or watch objects of kind EndpointSlice*,listDiscoveryV1EndpointSliceForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.discovery.v1.EndpointSliceList  401  - UnauthorizedRhttpsj` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io + UnauthorizedRhttpsj +x-kubernetes-actionlist +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice version: v1 -kind: APIService -j -x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14078,8 +13591,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 -53"1pathname of the APIService"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -14088,9 +13600,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ä' -/apis/apps/v1/watch/replicasetsÀ'´ -apps_v1vwatch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.*)watchAppsV1ReplicaSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¤( +3/apis/rbac.authorization.k8s.io/v1beta1/watch/rolesì'à +rbacAuthorization_v1beta1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*5watchRbacAuthorizationV1beta1RoleListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -14100,13 +13612,13 @@ G  401  - UnauthorizedRhttpsjN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet -version: v1 -j# + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14130,54 +13642,78 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚- -P/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers/{name}­,Ë -autoscaling_v2beta1*read the specified HorizontalPodAutoscaler*7readAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jr -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Í + /version/¿¼ +versionget the code version*getCodeVersion2application/json:application/jsonJ` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.apimachinery.pkg.version.Info  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsü +/apis/apiextensions.k8s.io/v1/ÙÖ +apiextensions_v1get available resources*getApiextensionsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp + +401 + + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsÀ( +1/apis/batch/v1/namespaces/{namespace}/jobs/{name}Š(Ï +batch_v1read the specified Job*readBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.batch.v1.Job + +401 + + UnauthorizedRhttpsjH +x-kubernetes-group-version-kind%#version: v1 +group: batch +kind: Job +j x-kubernetes-actionget -jg -x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler -version: v2beta1 -group: autoscaling -Æ -autoscaling_v2beta1-replace the specified HorizontalPodAutoscaler*:replaceAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ -X -Vbodybody *F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerBž +Œ +batch_v1replace the specified Job*replaceBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.batch.v1.JobBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÐ -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler -\ -201U -S -CreatedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.batch.v1.Job += +2016 +4 +Created) +' +%#/definitions/io.k8s.api.batch.v1.Job  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 +j x-kubernetes-actionput -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -*Í -autoscaling_v2beta1 delete a HorizontalPodAutoscaler*9deleteAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ð +batch_v1 delete a Job*deleteBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -14202,170 +13738,84 @@ C ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj x-kubernetes-action delete -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -BÊ -autoscaling_v2beta16partially update the specified HorizontalPodAutoscaler*8patchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 +BÎ +batch_v1"partially update the specified Job*patchBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.batch.v1.Job  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jg -x-kubernetes-group-version-kindDBversion: v2beta1 -group: autoscaling -kind: HorizontalPodAutoscaler -JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ï( -4/apis/batch/v1/watch/namespaces/{namespace}/cronjobs–(¨ -batch_v1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*!watchBatchV1NamespacedCronJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jL -x-kubernetes-group-version-kind)'version: v1 -group: batch -kind: CronJob -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿( -0/apis/batch/v1/watch/namespaces/{namespace}/jobsŠ(œ -batch_v1owatch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.*watchBatchV1NamespacedJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk - -401 - - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# -x-kubernetes-action  -watchlist jH x-kubernetes-group-version-kind%#group: batch kind: Job version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +J0 +.,"*pathname of the Job"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean â+ ->/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}Ÿ+À -certificates_v1,read the specified CertificateSigningRequest*+readCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +MKIquery-If 'true', then the output is pretty printed."pretty2string ¼, +C/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}ô+Ô +certificates_v1beta1,read the specified CertificateSigningRequest*0readCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest  401  - UnauthorizedRhttpsjl -x-kubernetes-group-version-kindIGkind: CertificateSigningRequest -version: v1 -group: certificates.k8s.io -j + UnauthorizedRhttpsj x-kubernetes-actionget -· -certificates_v1/replace the specified CertificateSigningRequest*.replaceCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX -V -Tbodybody *D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1beta1 +Õ +certificates_v1beta1/replace the specified CertificateSigningRequest*3replaceCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] +[ +Ybodybody *I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÌ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÖ Z -201S +200S Q -CreatedF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest +_ +201X +V +CreatedK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsj + UnauthorizedRhttpsjq +x-kubernetes-group-version-kindNLkind: CertificateSigningRequest +version: v1beta1 +group: certificates.k8s.io +j x-kubernetes-actionput -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -*Ä -certificates_v1"delete a CertificateSigningRequest*-deleteCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ó +certificates_v1beta1"delete a CertificateSigningRequest*2deleteCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -14373,10 +13823,6 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» - -401 - - Unauthorized L 200E C @@ -14388,105 +13834,51 @@ R I Accepted= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj x-kubernetes-action delete -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -B¿ -certificates_v18partially update the specified CertificateSigningRequest*,patchCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jq +x-kubernetes-group-version-kindNLkind: CertificateSigningRequest +version: v1beta1 +group: certificates.k8s.io +BÓ +certificates_v1beta18partially update the specified CertificateSigningRequest*1patchCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jp +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsjl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionpatch +jq +x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1beta1 JF DB"@path%name of the CertificateSigningRequest"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string û -/apis/extensions/v1beta1/ÝÚ -extensions_v1beta1get available resources* getExtensionsV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps·' --/apis/rbac.authorization.k8s.io/v1beta1/roles…'ù -rbacAuthorization_v1beta1"list or watch objects of kind Role*0listRbacAuthorizationV1beta1RoleForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.rbac.v1beta1.RoleList - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ” -&/apis/admissionregistration.k8s.io/v1/éæ -admissionregistration_v1get available resources*&getAdmissionregistrationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +MKIquery-If 'true', then the output is pretty printed."pretty2string ‚ +/logs/{logpath}o8 +logs*logFileHandlerJ  401  - UnauthorizedRhttps­` -F/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurationsâ_‰' -flowcontrolApiserver_v1beta18list or watch objects of kind PriorityLevelConfiguration*9listFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsJ3 +1/"-pathpath to the log"logpath*string˜` +I/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalersÏ_ä& +autoscaling_v2beta25list or watch objects of kind HorizontalPodAutoscaler*7listAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14508,59 +13900,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jy -^ -200W -U -OKO -M -K#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jv +[ +200T +R +OKL +J +H#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -j{ -x-kubernetes-group-version-kindXVversion: v1beta1 -group: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -"Æ +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +"˜ -flowcontrolApiserver_v1beta1#create a PriorityLevelConfiguration*;createFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] -[ -Ybodybody *I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationBž +autoscaling_v2beta2 create a HorizontalPodAutoscaler*9createAutoscalingV2beta2NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ +X +Vbodybody *F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ -Z -200S -Q -OKK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration -_ -201X -V -CreatedK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration -` -202Y -W -AcceptedK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¯  401  - UnauthorizedRhttpsj + Unauthorized +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +\ +201U +S +CreatedH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +] +202V +T +AcceptedH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerRhttpsjg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +j x-kubernetes-actionpost -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -*¹- -flowcontrolApiserver_v1beta1/delete collection of PriorityLevelConfiguration*EdeleteFlowcontrolApiserverV1beta1CollectionPriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*—- +autoscaling_v2beta2,delete collection of HorizontalPodAutoscaler*CdeleteAutoscalingV2beta2CollectionNamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -14597,69 +13989,18 @@ L C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration -version: v1beta1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‚ - /apis/scheduling.k8s.io/v1beta1/ÝÚ -scheduling_v1beta1get available resources* getSchedulingV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp - -401 - - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsÜ' --/apis/autoscaling/v1/horizontalpodautoscalersª'ž -autoscaling_v15list or watch objects of kind HorizontalPodAutoscaler*8listAutoscalingV1HorizontalPodAutoscalerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jq -V -200O -M -OKG -E -C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: autoscaling +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjg +x-kubernetes-group-version-kindDBgroup: autoscaling kind: HorizontalPodAutoscaler -version: v1 -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. +version: v2beta2 +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string â' +&/apis/storage.k8s.io/v1/watch/csinodes·'« -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ³( -)/api/v1/watch/namespaces/{namespace}/pods…(— -core_v1owatch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedPodList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +storage_v1swatch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1CSINodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -14672,9 +14013,9 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod +jU +x-kubernetes-group-version-kind20group: storage.k8s.io +kind: CSINode version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -14690,8 +14031,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -14700,66 +14040,121 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‰( -$/api/v1/watch/replicationcontrollersà'Ô -core_v1watch individual changes to a list of ReplicationController. deprecated: use the 'watch' parameter with a list operation instead.*4watchCoreV1ReplicationControllerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ù +/apis/storage.k8s.io/v1beta1/×Ô +storage_v1beta1get available resources*getStorageV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp  401  Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjW -x-kubernetes-group-version-kind42kind: ReplicationController +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttps‰ +C/api/v1/namespaces/{namespace}/persistentvolumeclaims/{name}/statusÁ¡ +core_v12read status of the specified PersistentVolumeClaim*/readCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim version: v1 -group: "" -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean õ' -2/apis/autoscaling/v2beta2/horizontalpodautoscalers¾'² -autoscaling_v2beta25list or watch objects of kind HorizontalPodAutoscaler*=listAutoscalingV2beta2HorizontalPodAutoscalerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jv -[ -200T -R -OKL +€ +core_v15replace status of the specified PersistentVolumeClaim*2replaceCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL J -H#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList +Hbodybody *8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +N +201G +E +Created: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jg -x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler -version: v2beta2 -group: autoscaling + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +j +x-kubernetes-actionput +B  +core_v1>partially update status of the specified PersistentVolumeClaim*0patchCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim + +401 + + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +j +x-kubernetes-actionpatch +JB +@>"<path!name of the PersistentVolumeClaim"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ” +&/apis/admissionregistration.k8s.io/v1/éæ +admissionregistration_v1get available resources*&getAdmissionregistrationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsÓ( +B/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitionsŒ(€ +apiextensions_v1beta1„watch individual changes to a list of CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead.*5watchApiextensionsV1beta1CustomResourceDefinitionList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsjq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14783,9 +14178,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ÿ) -L/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindingsÎ(à -rbacAuthorization_v1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*1watchRbacAuthorizationV1NamespacedRoleBindingList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¼* +V/apis/autoscaling/v2beta1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}á)­ +autoscaling_v2beta1¾watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*8watchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -14795,13 +14190,12 @@ G  401  - UnauthorizedRhttpsjd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding -version: v1 -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsjg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14816,7 +14210,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -14826,24 +14221,24 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean …* -Q/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/roles/{name}¯)Ž -rbacAuthorization_v1beta1«watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*+watchRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean õ' +2/apis/autoscaling/v2beta1/horizontalpodautoscalers¾'² +autoscaling_v2beta15list or watch objects of kind HorizontalPodAutoscaler*=listAutoscalingV2beta1HorizontalPodAutoscalerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jv +[ +200T +R +OKL +J +H#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 + UnauthorizedRhttpsj +x-kubernetes-actionlist +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -14858,9 +14253,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J1 -/-"+pathname of the Role"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -14869,25 +14262,94 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ê' -(/apis/storage.k8s.io/v1/watch/csidrivers½'± - -storage_v1uwatch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1CSIDriverList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à +G/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/approval”Ô +certificates_v18read approval of the specified CertificateSigningRequest*3readCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# -x-kubernetes-action  -watchlist -jW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver + UnauthorizedRhttpsjl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +j +x-kubernetes-actionget +Ë +certificates_v1;replace approval of the specified CertificateSigningRequest*6replaceCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX +V +Tbodybody *D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÌ +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +Z +201S +Q +CreatedF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +BÓ +certificates_v1Dpartially update approval of the specified CertificateSigningRequest*4patchCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jp +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 +JF +DB"@path%name of the CertificateSigningRequest"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¯' +$/apis/policy/v1/poddisruptionbudgets†'ú + policy_v11list or watch objects of kind PodDisruptionBudget*/listPolicyV1PodDisruptionBudgetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh +M +200F +D +OK> +< +:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -14912,24 +14374,144 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ö* -bodybody *. +,#/definitions/io.k8s.api.core.v1.PodTemplateBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate +E +202> +< +Accepted0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate + +401 + + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: "" +kind: PodTemplate +version: v1 +j +x-kubernetes-actionpost +*Í, +core_v1 delete collection of PodTemplate*+deleteCoreV1CollectionNamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg  401  Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* +x-kubernetes-actiondeletecollection +jM +x-kubernetes-group-version-kind*(version: v1 +group: "" +kind: PodTemplate +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ö* +"<path!name of the ReplicationController"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ó] -3/apis/batch/v1beta1/namespaces/{namespace}/cronjobs›]Œ& - batch_v1beta1%list or watch objects of kind CronJob*!listBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +MKIquery-If 'true', then the output is pretty printed."pretty2string ’* +W/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations/{name}¶)Ý +admissionregistration_v1beta1Åwatch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*?watchAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1beta1 +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -15030,119 +14628,78 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JK +IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.batch.v1beta1.CronJobList +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‡ +5/apis/authorization.k8s.io/v1/selfsubjectrulesreviewsÍ +"¿ +authorization_v1create a SelfSubjectRulesReview*+createAuthorizationV1SelfSubjectRulesReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BV +T +Rbodybody *B +@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReviewJ£  401  - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -j -x-kubernetes-actionlist -"þ - batch_v1beta1create a CronJob*#createBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD + Unauthorized +S +200L +J +OKD B -@bodybody *0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob +@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview +X +201Q +O +CreatedD +B +@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview +Y +202R +P +AcceptedD +B +@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReviewRhttpsj +x-kubernetes-actionpost +jj +x-kubernetes-group-version-kindGEgroup: authorization.k8s.io +kind: SelfSubjectRulesReview +version: v1 +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ) +8/apis/storage.k8s.io/v1beta1/watch/storageclasses/{name}Ä(ý +storage_v1beta1³watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I G -202@ -> -Accepted2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsjQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob + UnauthorizedRhttpsj +x-kubernetes-actionwatch +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass version: v1beta1 -j -x-kubernetes-actionpost -*Õ, - batch_v1beta1delete collection of CronJob*-deleteBatchV1beta1CollectionNamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string »^ -?/apis/discovery.k8s.io/v1/namespaces/{namespace}/endpointslices÷]§& - discovery_v1+list or watch objects of kind EndpointSlice*&listDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -15150,76 +14707,41 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 +75"3pathname of the StorageClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je - -401 - - Unauthorized -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.discovery.v1.EndpointSliceListRhttpsj -x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8kind: EndpointSlice -version: v1 -group: discovery.k8s.io -"© - discovery_v1create an EndpointSlice*(createDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×) +;/api/v1/watch/namespaces/{namespace}/serviceaccounts/{name}—)ì +core_v1µwatch changes to an object of kind ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I G -Ebodybody *5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSliceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - Unauthorized -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSliceRhttpsj] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+kind: ServiceAccount version: v1 -j -x-kubernetes-actionpost -*ë, - discovery_v1"delete collection of EndpointSlice*2deleteDiscoveryV1CollectionNamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +group: "" +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -15227,36 +14749,20 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J; +97"5pathname of the ServiceAccount"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice -version: v1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ³( -7/apis/storage.k8s.io/v1beta1/watch/csistoragecapacities÷'ë -storage_v1beta1~watch individual changes to a list of CSIStorageCapacity. deprecated: use the 'watch' parameter with a list operation instead.*9watchStorageV1beta1CSIStorageCapacityListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷( +K/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations§(› +admissionregistration_v1Šwatch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*>watchAdmissionregistrationV1ValidatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -15266,13 +14772,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjz +x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1 +j# x-kubernetes-action  watchlist -je -x-kubernetes-group-version-kindB@version: v1beta1 -group: storage.k8s.io -kind: CSIStorageCapacity J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -15296,31 +14802,15 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean î& -/apis/batch/v1/cronjobsÒ&Æ -batch_v1%list or watch objects of kind CronJob*"listBatchV1CronJobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.batch.v1.CronJobList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jL -x-kubernetes-group-version-kind)'version: v1 -group: batch -kind: CronJob -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean †_ +D/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices½^»& +discovery_v1beta1+list or watch objects of kind EndpointSlice*+listDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -15328,41 +14818,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean È' -/api/v1/watch/namespaces«'Ÿ -core_v1uwatch individual changes to a list of Namespace. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespaceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj +O +200H +F +OK@ +> +<#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï + UnauthorizedRhttpsj +x-kubernetes-actionlist +jb +x-kubernetes-group-version-kind?=group: discovery.k8s.io +kind: EndpointSlice +version: v1beta1 +"Ì +discovery_v1beta1create an EndpointSlice*-createDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN +L +Jbodybody *: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ + +401 + + Unauthorized +K +200D +B +OK< +: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice +P +201I +G +Created< +: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice +Q +202J +H +Accepted< +: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceRhttpsjb +x-kubernetes-group-version-kind?=kind: EndpointSlice +version: v1beta1 +group: discovery.k8s.io +j +x-kubernetes-actionpost +*ú, +discovery_v1beta1"delete collection of EndpointSlice*7deleteDiscoveryV1beta1CollectionNamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -15370,40 +14895,42 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¨* -X/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindings/{name}Ë)£ -rbacAuthorization_v1beta1²watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*2watchRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: RoleBinding + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=kind: EndpointSlice version: v1beta1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +group: discovery.k8s.io +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ©^ +6/apis/rbac.authorization.k8s.io/v1/clusterrolebindingsî]Å& +rbacAuthorization_v10list or watch objects of kind ClusterRoleBinding*)listRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -15411,43 +14938,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 -64"2pathname of the RoleBinding"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ý( -//apis/storage.k8s.io/v1/watch/csidrivers/{name}©(å - -storage_v1°watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1 +"Æ +rbacAuthorization_v1create a ClusterRoleBinding*+createRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +Ebodybody *5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding +L +202E +C +Accepted7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: storage.k8s.io -kind: CSIDriver + UnauthorizedRhttpsj +x-kubernetes-actionpost +jk +x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding version: v1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +*‰- +rbacAuthorization_v1'delete collection of ClusterRoleBinding*5deleteRbacAuthorizationV1CollectionClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -15455,137 +15015,182 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 -42"0pathname of the CSIDriver"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ° -B/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/scaleé -core_v11read scale of the specified ReplicationController*.readCoreV1NamespacedReplicationControllerScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jk +x-kubernetes-group-version-kindHFkind: ClusterRoleBinding version: v1 -j +group: rbac.authorization.k8s.io +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ð* + -< -Created1 -/ --#/definitions/io.k8s.api.autoscaling.v1.ScaleRhttpsj +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +j x-kubernetes-actionput -jP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale +*› +core_v1delete a PersistentVolumeClaim*+deleteCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Jµ +O +202H +F +Accepted: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim + +401 + + Unauthorized +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim version: v1 -BŽ -core_v1=partially update scale of the specified ReplicationController*/patchCoreV1NamespacedReplicationControllerScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-action delete +B +core_v14partially update the specified PersistentVolumeClaim**patchCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd +I +200B @ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +OK: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim +version: v1 +j x-kubernetes-actionpatch -jP -x-kubernetes-group-version-kind-+version: v1 -group: autoscaling -kind: Scale -J2 -0.",pathname of the Scale"name*string˜J` +JB +@>"<path!name of the PersistentVolumeClaim"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ô, ->/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}±,Þ -apiextensions_v1+read the specified CustomResourceDefinition*+readApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J +MKIquery-If 'true', then the output is pretty printed."pretty2string ½- +J/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations/{name}î,ð +admissionregistration_v1/read the specified MutatingWebhookConfiguration*7readAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J| +a +200Z +X +OKR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration  401  - Unauthorized -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionRhttpsjl -x-kubernetes-group-version-kindIGkind: CustomResourceDefinition -version: v1 -group: apiextensions.k8s.io -j + UnauthorizedRhttpsj x-kubernetes-actionget -Ž - -apiextensions_v1.replace the specified CustomResourceDefinition*.replaceApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu -s -qbodybody *a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž +jx +x-kubernetes-group-version-kindUSkind: MutatingWebhookConfiguration +version: v1 +group: admissionregistration.k8s.io +ÿ +admissionregistration_v12replace the specified MutatingWebhookConfiguration*:replaceAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bd +b +`bodybody *P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J† -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition -w -201p -n -Createdc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä +f +201_ +] +CreatedR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration  401  - UnauthorizedRhttpsjl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition + Unauthorized +a +200Z +X +OKR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationRhttpsjx +x-kubernetes-group-version-kindUSkind: MutatingWebhookConfiguration version: v1 +group: admissionregistration.k8s.io j x-kubernetes-actionput -*Ä -apiextensions_v1!delete a CustomResourceDefinition*-deleteApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*è +admissionregistration_v1%delete a MutatingWebhookConfiguration*9deleteAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -15610,79 +15215,110 @@ I  UnauthorizedRhttpsj x-kubernetes-action delete -jl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition +jx +x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration version: v1 -BÝ -apiextensions_v17partially update the specified CustomResourceDefinition*,patchApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bï +admissionregistration_v1;partially update the specified MutatingWebhookConfiguration*8patchAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J|  401  Unauthorized +a +200Z +X +OKR +P +N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationRhttpsj +x-kubernetes-actionpatch +jx +x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +version: v1 +JI +GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ä +E/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}/statusšî +apiextensions_v15read status of the specified CustomResourceDefinition*1readApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J r 200k i OKc a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionRhttpsj -x-kubernetes-actionpatch +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget jl x-kubernetes-group-version-kindIGkind: CustomResourceDefinition version: v1 group: apiextensions.k8s.io -JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ñ& -/api/v1/componentstatusesÓ&Ç -core_v1$list objects of kind ComponentStatus*listCoreV1ComponentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.core.v1.ComponentStatusList +ž + +apiextensions_v18replace status of the specified CustomResourceDefinition*4replaceApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu +s +qbodybody *a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J† +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +w +201p +n +Createdc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jQ -x-kubernetes-group-version-kind.,group: "" -kind: ComponentStatus + UnauthorizedRhttpsj +x-kubernetes-actionput +jl +x-kubernetes-group-version-kindIGkind: CustomResourceDefinition version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ü' -/api/v1/watch/limitranges¾'² -core_v1vwatch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.*)watchCoreV1LimitRangeListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +group: apiextensions.k8s.io +Bí +apiextensions_v1Apartially update status of the specified CustomResourceDefinition*2patchApiextensionsV1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J +r +200k +i +OKc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsjl +x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1 +j +x-kubernetes-actionpatch +JE +CA"?path$name of the CustomResourceDefinition"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string “( +//apis/networking.k8s.io/v1beta1/watch/ingressesß'Ó +networking_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*1watchNetworkingV1beta1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -15692,10 +15328,10 @@ G  401  - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'version: v1 -group: "" -kind: LimitRange + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 j# x-kubernetes-action  watchlist @@ -15722,123 +15358,10 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ï -/apis/autoscaling/v1/ÕÒ -autoscaling_v1get available resources*getAutoscalingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp - -401 - - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsž) -2/api/v1/namespaces/{namespace}/podtemplates/{name}ç(é -core_v1read the specified PodTemplate*readCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate -version: v1 -´ -core_v1!replace the specified PodTemplate*"replaceCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.core.v1.PodTemplateBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate -D -201= -; -Created0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate - -401 - - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(version: v1 -group: "" -kind: PodTemplate -j -x-kubernetes-actionput -*é -core_v1delete a PodTemplate*!deleteCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J¡ - -401 - - Unauthorized -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate -E -202> -< -Accepted0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplateRhttpsj -x-kubernetes-action delete -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate -version: v1 -Bè -core_v1*partially update the specified PodTemplate* patchCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate - -401 - - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(version: v1 -group: "" -kind: PodTemplate -j -x-kubernetes-actionpatch -J8 -64"2pathname of the PodTemplate"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ` -I/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalersÏ_ä& -autoscaling_v2beta15list or watch objects of kind HorizontalPodAutoscaler*7listAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ²] +)/apis/storage.k8s.io/v1/volumeattachments„]¡& + +storage_v1.list or watch objects of kind VolumeAttachment*listStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -15860,59 +15383,60 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jv -[ -200T -R -OKL -J -H#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.storage.v1.VolumeAttachmentList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -"˜ +j^ +x-kubernetes-group-version-kind;9version: v1 +group: storage.k8s.io +kind: VolumeAttachment +"¥ -autoscaling_v2beta1 create a HorizontalPodAutoscaler*9createAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ -X -Vbodybody *F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerBž +storage_v1create a VolumeAttachment*createStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¯ -W -200P -N -OKH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler -\ -201U -S -CreatedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler -] -202V -T -AcceptedH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jÿ +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +M +202F +D +Accepted8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment +version: v1 +j x-kubernetes-actionpost -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -*—- -autoscaling_v2beta1,delete collection of HorizontalPodAutoscaler*CdeleteAutoscalingV2beta1CollectionNamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ä, + +storage_v1%delete collection of VolumeAttachment*)deleteStorageV1CollectionVolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -15949,51 +15473,123 @@ C  401  - UnauthorizedRhttpsjg -x-kubernetes-group-version-kindDBversion: v2beta1 -group: autoscaling -kind: HorizontalPodAutoscaler + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9kind: VolumeAttachment +version: v1 +group: storage.k8s.io j* x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string é -/apis/certificates.k8s.io/ÊÇ - certificatesget information of a group*getCertificatesAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi - -401 - - Unauthorized -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupRhttpsÈ) -H/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolebindings/{name}û(® -rbacAuthorization_v1beta1¹watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ä) +2/apis/storage.k8s.io/v1beta1/storageclasses/{name}­)Œ +storage_v1beta1read the specified StorageClass*readStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jc +H +200A ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +OK9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jp -x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding + UnauthorizedRhttpsj +x-kubernetes-actionget +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +é +storage_v1beta1"replace the specified StorageClass*!replaceStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BK +I +Gbodybody *7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J² +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass +M +201F +D +Created9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 +*• +storage_v1beta1delete a StorageClass* deleteStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J³ +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass +N +202G +E +Accepted9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 +B‹ +storage_v1beta1+partially update the specified StorageClass*patchStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jc +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass + +401 + + UnauthorizedRhttpsj_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 +j +x-kubernetes-actionpatch +J9 +75"3pathname of the StorageClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ý\ +/api/v1/persistentvolumes¿\Œ& +core_v1.list or watch objects of kind PersistentVolume*listCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -16001,34 +15597,140 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? -=;"9pathname of the ClusterRoleBinding"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ& -/api/v1/resourcequotasä&Ø -core_v1+list or watch objects of kind ResourceQuota*'listCoreV1ResourceQuotaForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.core.v1.PersistentVolumeList  401  - Unauthorized -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.core.v1.ResourceQuotaListRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionlist -jO -x-kubernetes-group-version-kind,*version: v1 +jR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume +version: v1 +"‡ +core_v1create a PersistentVolume*createCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jö +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +J +202C +A +Accepted5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpost +jR +x-kubernetes-group-version-kind/-version: v1 group: "" -kind: ResourceQuota +kind: PersistentVolume +*Ò, +core_v1%delete collection of PersistentVolume*&deleteCoreV1CollectionPersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume +version: v1 +j* +x-kubernetes-actiondeletecollection +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ê + /apis/apps/º· +appsget information of a group*getAppsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttps¿( +0/apis/batch/v1/watch/namespaces/{namespace}/jobsŠ(œ +batch_v1owatch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.*watchBatchV1NamespacedJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsjH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -16043,7 +15745,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -16052,54 +15755,54 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¨, -K/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers/{name}Ø+· -autoscaling_v1*read the specified HorizontalPodAutoscaler*2readAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jm -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean á* +F/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leases/{name}–*Ž +coordination_v1beta1read the specified Lease*&readCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease  401  UnauthorizedRhttpsj x-kubernetes-actionget -jb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -¨ -autoscaling_v1-replace the specified HorizontalPodAutoscaler*5replaceAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BU -S -Qbodybody *A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerBž +j] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +ç +coordination_v1beta1replace the specified Lease*)replaceCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.coordination.v1beta1.LeaseBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÆ -W -201P -N -CreatedC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease  401  - Unauthorized -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerRhttpsjb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*¾ -autoscaling_v1 delete a HorizontalPodAutoscaler*4deleteAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +*¡ +coordination_v1beta1delete a Lease*(deleteCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -16107,12 +15810,6 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status R 202K I @@ -16122,218 +15819,235 @@ I  401  - UnauthorizedRhttpsj + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +j x-kubernetes-action delete -jb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -B¶ -autoscaling_v16partially update the specified HorizontalPodAutoscaler*3patchAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B +coordination_v1beta1$partially update the specified Lease*'patchCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jm -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 j x-kubernetes-actionpatch -JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +J2 +0.",pathname of the Lease"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ó -/apis/scheduling.k8s.io/v1/ÓÐ - scheduling_v1get available resources*getSchedulingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +MKIquery-If 'true', then the output is pretty printed."pretty2string ê& +/api/v1/endpointsÔ&È +core_v1'list or watch objects of kind Endpoints*#listCoreV1EndpointsForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.EndpointsList  401  - UnauthorizedRhttpsÍ - /version/¿¼ -versionget the code version*getCodeVersion2application/json:application/jsonJ` -E -200> -< -OK6 + UnauthorizedRhttpsj +x-kubernetes-actionlist +jK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×& +/api/v1/eventsÄ&¸ +core_v1#list or watch objects of kind Event*listCoreV1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JX += +2006 4 -2#/definitions/io.k8s.apimachinery.pkg.version.Info - -401 - - UnauthorizedRhttps© -5/api/v1/namespaces/{namespace}/services/{name}/statusïé -core_v1$read status of the specified Service*!readCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service +OK. +, +*#/definitions/io.k8s.api.core.v1.EventList  401  - UnauthorizedRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Service + UnauthorizedRhttpsj +x-kubernetes-actionlist +jG +x-kubernetes-group-version-kind$"group: "" +kind: Event version: v1 -j -x-kubernetes-actionget -¬ -core_v1'replace status of the specified Service*$replaceCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.core.v1.ServiceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜ -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service -@ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.core.v1.Service +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹) +P/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations¶(ª +admissionregistration_v1beta1Šwatch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*CwatchAdmissionregistrationV1beta1ValidatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jI -x-kubernetes-group-version-kind&$version: v1 -group: "" -kind: Service -Bè -core_v10partially update status of the specified Service*"patchCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ) +5/apis/policy/v1beta1/watch/podsecuritypolicies/{name}Î(‚ +policy_v1beta1¸watch changes to an object of kind PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*#watchPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  UnauthorizedRhttpsj -x-kubernetes-actionpatch -jI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -J4 -20".pathname of the Service"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ø -9/apis/apiregistration.k8s.io/v1/apiservices/{name}/statusºµ -apiregistration_v1'read status of the specified APIService*%readApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jy -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -j` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -¾ -apiregistration_v1*replace status of the specified APIService*(replaceApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ba -_ -]bodybody *M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService -c -201\ -Z -CreatedO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -B´ -apiregistration_v13partially update status of the specified APIService*&patchApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jy -^ -200W -U -OKO -M -K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService +x-kubernetes-actionwatch +j\ +x-kubernetes-group-version-kind97group: policy +kind: PodSecurityPolicy +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J> +<:"8pathname of the PodSecurityPolicy"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ì +/apis/apiextensions.k8s.io/ÌÉ + apiextensionsget information of a group*getApiextensionsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj` -x-kubernetes-group-version-kind=;group: apiregistration.k8s.io -version: v1 -kind: APIService -j -x-kubernetes-actionpatch -J7 -53"1pathname of the APIService"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string „ + UnauthorizedRhttps„ 8/apis/batch/v1/namespaces/{namespace}/jobs/{name}/statusÇß batch_v1 read status of the specified Job*readBatchV1NamespacedJobStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS - -401 - - Unauthorized 8 2001 / OK) ' -%#/definitions/io.k8s.api.batch.v1.JobRhttpsj +%#/definitions/io.k8s.api.batch.v1.Job + +401 + + UnauthorizedRhttpsj x-kubernetes-actionget jH x-kubernetes-group-version-kind%#group: batch @@ -16346,12 +16060,6 @@ version: v1 %#/definitions/io.k8s.api.batch.v1.JobBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.batch.v1.Job = 2016 4 @@ -16361,12 +16069,18 @@ version: v1  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#group: batch -kind: Job -version: v1 -j + Unauthorized +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.batch.v1.JobRhttpsj x-kubernetes-actionput +jH +x-kubernetes-group-version-kind%#kind: Job +version: v1 +group: batch BÞ batch_v1,partially update status of the specified Job*patchBatchV1NamespacedJobStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L @@ -16375,16 +16089,16 @@ Jbodybody *: ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS - -401 - - Unauthorized 8 2001 / OK) ' -%#/definitions/io.k8s.api.batch.v1.JobRhttpsj +%#/definitions/io.k8s.api.batch.v1.Job + +401 + + UnauthorizedRhttpsj x-kubernetes-actionpatch jH x-kubernetes-group-version-kind%#group: batch @@ -16393,163 +16107,81 @@ version: v1 J0 .,"*pathname of the Job"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ç -/apis/events.k8s.io/v1/ËÈ - events_v1get available resources*getEventsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps‡+ -=/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}Å*° -flowcontrolApiserver_v1beta1read the specified FlowSchema*)readFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Je +MKIquery-If 'true', then the output is pretty printed."pretty2string ü +T/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations/{name}/status£€ +flowcontrolApiserver_v1beta17read status of the specified PriorityLevelConfiguration*?readFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration  401  - Unauthorized -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionget -jk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema +j{ +x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io +kind: PriorityLevelConfiguration version: v1beta1 -‘ -flowcontrolApiserver_v1beta1 replace the specified FlowSchema*,replaceFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM -K -Ibodybody *9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž + + +flowcontrolApiserver_v1beta1:replace status of the specified PriorityLevelConfiguration*BreplaceFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] +[ +Ybodybody *I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¶ -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema -O -201H -F -Created; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÖ +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration +_ +201X +V +CreatedK +I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration  401  UnauthorizedRhttpsj x-kubernetes-actionput -jk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 -*¿ -flowcontrolApiserver_v1beta1delete a FlowSchema*+deleteFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jk -x-kubernetes-group-version-kindHFkind: FlowSchema -version: v1beta1 +j{ +x-kubernetes-group-version-kindXVversion: v1beta1 group: flowcontrol.apiserver.k8s.io -B¯ -flowcontrolApiserver_v1beta1)partially update the specified FlowSchema**patchFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +kind: PriorityLevelConfiguration +Bÿ +flowcontrolApiserver_v1beta1Cpartially update status of the specified PriorityLevelConfiguration*@patchFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ju +Z +200S +Q +OKK +I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration  401  - UnauthorizedRhttpsjk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionpatch -J7 -53"1pathname of the FlowSchema"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ê& -/api/v1/endpointsÔ&È -core_v1'list or watch objects of kind Endpoints*#listCoreV1EndpointsForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ - -401 - - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.EndpointsListRhttpsjK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints -version: v1 -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¦) -N/apis/storage.k8s.io/v1beta1/watch/namespaces/{namespace}/csistoragecapacitiesÓ(å -storage_v1beta1~watch individual changes to a list of CSIStorageCapacity. deprecated: use the 'watch' parameter with a list operation instead.*3watchStorageV1beta1NamespacedCSIStorageCapacityList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +j{ +x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io +kind: PriorityLevelConfiguration +version: v1beta1 +JG +EC"Apath&name of the PriorityLevelConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ( +*/apis/policy/v1/watch/poddisruptionbudgetsá'Õ + policy_v1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*4watchPolicyV1PodDisruptionBudgetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -16562,10 +16194,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -je -x-kubernetes-group-version-kindB@kind: CSIStorageCapacity -version: v1beta1 -group: storage.k8s.io +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -16580,8 +16212,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -16590,21 +16221,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´) -4/api/v1/watch/namespaces/{namespace}/services/{name}û(× -core_v1®watch changes to an object of kind Service. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ò) +:/api/v1/watch/namespaces/{namespace}/resourcequotas/{name}“)é +core_v1´watch changes to an object of kind ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Service +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 j x-kubernetes-actionwatch @@ -16622,8 +16253,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the Service"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the ResourceQuota"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -16633,21 +16264,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ -"/apis/certificates.k8s.io/v1beta1/áÞ -certificates_v1beta1get available resources*"getCertificatesV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps ) -0/api/v1/watch/namespaces/{namespace}/pods/{name}ë(Ë -core_v1ªwatch changes to an object of kind Pod. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯) +3/api/v1/watch/namespaces/{namespace}/secrets/{name}÷(Ô +core_v1­watch changes to an object of kind Secret. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -16659,9 +16278,9 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -16677,8 +16296,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J0 -.,"*pathname of the Pod"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J3 +1/"-pathname of the Secret"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -16688,312 +16307,66 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯ -J/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}/statusà‚ -apiextensions_v1beta15read status of the specified CustomResourceDefinition*6readApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J’ -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Í + /apis/batch/¼¹ +batchget information of a group*getBatchAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 -¼ - -apiextensions_v1beta18replace status of the specified CustomResourceDefinition*9replaceApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bz -x -vbodybody *f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition -| -201u -s -Createdh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition - -401 - - UnauthorizedRhttpsjq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 -j -x-kubernetes-actionput -B -apiextensions_v1beta1Apartially update status of the specified CustomResourceDefinition*7patchApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J’ -w -200p -n -OKh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 -JE -CA"?path$name of the CustomResourceDefinition"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ã -/apis/networking.k8s.io/Æà - -networkingget information of a group*getNetworkingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttps“ -I/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets/{name}/statusÅ£ - policy_v10read status of the specified PodDisruptionBudget*/readPolicyV1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsjY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 -j -x-kubernetes-actionget -‚ - policy_v13replace status of the specified PodDisruptionBudget*2replacePolicyV1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jY -x-kubernetes-group-version-kind64version: v1 -group: policy -kind: PodDisruptionBudget -B¢ - policy_v1<":pathname of the PodDisruptionBudget"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ð* -;/apis/rbac.authorization.k8s.io/v1beta1/clusterroles/{name}*¤ -rbacAuthorization_v1beta1read the specified ClusterRole*'readRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -ji -x-kubernetes-group-version-kindFDversion: v1beta1 -group: rbac.authorization.k8s.io -kind: ClusterRole -ù -rbacAuthorization_v1beta1!replace the specified ClusterRole**replaceRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole -I -201B -@ -Created5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole -version: v1beta1 -*¹ -rbacAuthorization_v1beta1delete a ClusterRole*)deleteRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDkind: ClusterRole -version: v1beta1 -group: rbac.authorization.k8s.io -j -x-kubernetes-action delete -B£ -rbacAuthorization_v1beta1*partially update the specified ClusterRole*(patchRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -ji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole -version: v1beta1 -J8 -64"2pathname of the ClusterRole"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ) -//api/v1/namespaces/{namespace}/endpoints/{name}Û(á -core_v1read the specified Endpoints*readCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Endpoints + UnauthorizedRhttps‡* +A/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}Á)ú +coordination_v1read the specified Lease*!readCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease  401  UnauthorizedRhttpsj x-kubernetes-actionget -jK -x-kubernetes-group-version-kind(&kind: Endpoints +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease version: v1 -group: "" -¨ -core_v1replace the specified Endpoints* replaceCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.core.v1.EndpointsBž +É +coordination_v1replace the specified Lease*$replaceCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.coordination.v1.LeaseBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease +F +201? = -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Endpoints -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +Created2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease version: v1 -*û -core_v1delete Endpoints*deleteCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-actionput +*’ +coordination_v1delete a Lease*#deleteCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -17018,35 +16391,35 @@ I  UnauthorizedRhttpsj x-kubernetes-action delete -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease version: v1 -Bà -core_v1(partially update the specified Endpoints*patchCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bù +coordination_v1$partially update the specified Lease*"patchCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease version: v1 -J6 -42"0pathname of the Endpoints"name*string˜J` +J2 +0.",pathname of the Lease"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string –* //apis/policy/v1beta1/podsecuritypolicies/{name}â)• @@ -17073,12 +16446,6 @@ Kbodybody *; 9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jº -L -200E -C -OK= -; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy Q 201J H @@ -17088,7 +16455,13 @@ H  401  - UnauthorizedRhttpsj + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyRhttpsj x-kubernetes-actionput j\ x-kubernetes-group-version-kind97version: v1beta1 @@ -17132,16 +16505,16 @@ Jbodybody *: ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jg - -401 - - Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyRhttpsj\ +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy + +401 + + UnauthorizedRhttpsj\ x-kubernetes-group-version-kind97group: policy kind: PodSecurityPolicy version: v1beta1 @@ -17149,52 +16522,9 @@ j x-kubernetes-actionpatch J> <:"8pathname of the PodSecurityPolicy"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ñ) -L/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name} )ÿ -rbacAuthorization_v1«watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*&watchRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j] -x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io -kind: Role -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J1 -/-"+pathname of the Role"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean È) -8/api/v1/watch/namespaces/{namespace}/podtemplates/{name}‹)ã -core_v1²watch changes to an object of kind PodTemplate. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ú) +B/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims/{name}³) +core_v1¼watch changes to an object of kind PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -17206,9 +16536,9 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate +jW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -17224,8 +16554,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 -64"2pathname of the PodTemplate"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JB +@>"<path!name of the PersistentVolumeClaim"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -17235,41 +16565,29 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ -/apis/discovery.k8s.io/v1beta1/ÛØ -discovery_v1beta1get available resources*getDiscoveryV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttpsì* -K/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/roles/{name}œ*’ -rbacAuthorization_v1beta1read the specified Role**readRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  ) +6/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}å(ã +apps_v1read the specified DaemonSet*readAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX = 2006 4 OK. , -*#/definitions/io.k8s.api.rbac.v1beta1.Role +*#/definitions/io.k8s.api.apps.v1.DaemonSet  401  UnauthorizedRhttpsj x-kubernetes-actionget -jb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -Ù -rbacAuthorization_v1beta1replace the specified Role*-replaceRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +jM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +ª +apps_v1replace the specified DaemonSet* replaceAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ > <bodybody *, -*#/definitions/io.k8s.api.rbac.v1beta1.RoleBž +*#/definitions/io.k8s.api.apps.v1.DaemonSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ = @@ -17277,24 +16595,24 @@ version: v1beta1 4 OK. , -*#/definitions/io.k8s.api.rbac.v1beta1.Role +*#/definitions/io.k8s.api.apps.v1.DaemonSet B 201; 9 Created. , -*#/definitions/io.k8s.api.rbac.v1beta1.Role +*#/definitions/io.k8s.api.apps.v1.DaemonSet  401  UnauthorizedRhttpsj x-kubernetes-actionput -jb -x-kubernetes-group-version-kind?=version: v1beta1 -group: rbac.authorization.k8s.io -kind: Role -*® -rbacAuthorization_v1beta1 delete a Role*,deleteRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +*ÿ +apps_v1delete a DaemonSet*deleteAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -17317,14 +16635,14 @@ I  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=kind: Role -version: v1beta1 -group: rbac.authorization.k8s.io + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 j x-kubernetes-action delete -B‘ -rbacAuthorization_v1beta1#partially update the specified Role*+patchRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bâ +apps_v1(partially update the specified DaemonSet*patchAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž @@ -17336,28 +16654,44 @@ Jbodybody *: 4 OK. , -*#/definitions/io.k8s.api.rbac.v1beta1.Role +*#/definitions/io.k8s.api.apps.v1.DaemonSet  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +j x-kubernetes-actionpatch -jb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -J1 -/-"+pathname of the Role"name*string˜J` +J6 +42"0pathname of the DaemonSet"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Â] -+/apis/storage.k8s.io/v1beta1/storageclasses’]¥& -storage_v1beta1*list or watch objects of kind StorageClass*listStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +MKIquery-If 'true', then the output is pretty printed."pretty2string ¨* +Q/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}Ò)ž +autoscaling_v1¾watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*3watchAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler +version: v1 +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -17365,232 +16699,122 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.StorageClassList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -j_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -"¬ -storage_v1beta1create a StorageClass* createStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BK -I -Gbodybody *7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‚ -H -200A -? -OK9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass -M -201F -D -Created9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚- +P/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers/{name}­,Ë +autoscaling_v2beta1*read the specified HorizontalPodAutoscaler*7readAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jr +W +200P N -202G -E -Accepted9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass - -401 - - UnauthorizedRhttpsj_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -j -x-kubernetes-actionpost -*ç, -storage_v1beta1!delete collection of StorageClass**deleteStorageV1beta1CollectionStorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj_ -x-kubernetes-group-version-kind<:group: storage.k8s.io -kind: StorageClass -version: v1beta1 -j* -x-kubernetes-actiondeletecollection -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¿^ -5/api/v1/namespaces/{namespace}/replicationcontrollers…^ª& -core_v13list or watch objects of kind ReplicationController*)listCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jh -M -200F -D -OK> -< -:#/definitions/io.k8s.api.core.v1.ReplicationControllerList +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController -version: v1 -"´ -core_v1create a ReplicationController*+createCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.core.v1.ReplicationControllerBž + UnauthorizedRhttpsj +x-kubernetes-actionget +jg +x-kubernetes-group-version-kindDBversion: v2beta1 +group: autoscaling +kind: HorizontalPodAutoscaler +Æ +autoscaling_v2beta1-replace the specified HorizontalPodAutoscaler*:replaceAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ +X +Vbodybody *F +D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J… -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController -O -202H +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÐ +\ +201U +S +CreatedH F -Accepted: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController +D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController -version: v1 -j -x-kubernetes-actionpost -*ë, -core_v1*delete collection of ReplicationController*5deleteCoreV1CollectionNamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT + Unauthorized +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerRhttpsj +x-kubernetes-actionput +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta1 +*Í +autoscaling_v2beta1 delete a HorizontalPodAutoscaler*9deleteAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42version: v1 -group: "" -kind: ReplicationController -j* -x-kubernetes-actiondeletecollection -J` + UnauthorizedRhttpsjg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta1 +j +x-kubernetes-action delete +BÊ +autoscaling_v2beta16partially update the specified HorizontalPodAutoscaler*8patchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler + +401 + + UnauthorizedRhttpsjg +x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler +version: v2beta1 +group: autoscaling +j +x-kubernetes-actionpatch +JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ø( -?/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses´(Æ -extensions_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*+watchExtensionsV1beta1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string È) +A/apis/events.k8s.io/v1/watch/namespaces/{namespace}/events/{name}‚)à + events_v1¬watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -17600,13 +16824,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress -version: v1beta1 + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event +version: v1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -17621,7 +16844,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 +0.",pathname of the Event"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -17631,9 +16855,10 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean »( -+/api/v1/watch/namespaces/{namespace}/events‹( -core_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedEventList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷' +,/apis/storage.k8s.io/v1/watch/storageclassesÆ'º + +storage_v1xwatch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1StorageClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -17643,13 +16868,13 @@ G  401  - UnauthorizedRhttpsjG -x-kubernetes-group-version-kind$"group: "" -kind: Event -version: v1 -j# + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -17664,8 +16889,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -17674,25 +16898,95 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷( -K/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations§(› -admissionregistration_v1Šwatch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*>watchAdmissionregistrationV1ValidatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ² + /api/v1/namespaces/{name}/statusç +core_v1&read status of the specified Namespace*readCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace  401  - UnauthorizedRhttpsjz -x-kubernetes-group-version-kindWUkind: ValidatingWebhookConfiguration + UnauthorizedRhttpsj +x-kubernetes-actionget +jK +x-kubernetes-group-version-kind(&version: v1 +group: "" +kind: Namespace +® +core_v1)replace status of the specified Namespace*replaceCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.core.v1.NamespaceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace version: v1 -group: admissionregistration.k8s.io -j# -x-kubernetes-action  -watchlist +j +x-kubernetes-actionput +Bæ +core_v12partially update status of the specified Namespace*patchCoreV1NamespaceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jK +x-kubernetes-group-version-kind(&version: v1 +group: "" +kind: Namespace +J6 +42"0pathname of the Namespace"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ó& +/apis/apps/v1/daemonsetsÖ&Ê +apps_v1'list or watch objects of kind DaemonSet*#listAppsV1DaemonSetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.apps.v1.DaemonSetList + +401 + + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +j +x-kubernetes-actionlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -17716,9 +17010,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¢( -6/apis/apiregistration.k8s.io/v1beta1/watch/apiservicesç'Û -apiregistration_v1beta1vwatch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.*)watchApiregistrationV1beta1APIServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë) +=/apis/apps/v1/watch/namespaces/{namespace}/replicasets/{name}‰)â +apps_v1±watch changes to an object of kind ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -17728,13 +17022,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io -version: v1beta1 -kind: APIService + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet +version: v1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -17749,7 +17042,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 +53"1pathname of the ReplicaSet"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -17758,247 +17053,92 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ò -E/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/statusˆÐ -certificates_v16read status of the specified CertificateSigningRequest*1readCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ó] +3/apis/batch/v1beta1/namespaces/{namespace}/cronjobs›]Œ& + batch_v1beta1%list or watch objects of kind CronJob*!listBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.batch.v1beta1.CronJobList  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsjl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -j -x-kubernetes-actionget -Ç -certificates_v19replace status of the specified CertificateSigningRequest*4replaceCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX -V -Tbodybody *D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž + UnauthorizedRhttpsj +x-kubernetes-actionlist +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +"þ + batch_v1beta1create a CronJob*#createBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJobBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÌ -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest -Z -201S -Q -CreatedF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jl -x-kubernetes-group-version-kindIGkind: CertificateSigningRequest -version: v1 -group: certificates.k8s.io -BÏ -certificates_v1Bpartially update status of the specified CertificateSigningRequest*2patchCertificatesV1CertificateSigningRequestStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jp -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jl -x-kubernetes-group-version-kindIGversion: v1 -group: certificates.k8s.io -kind: CertificateSigningRequest -JF -DB"@path%name of the CertificateSigningRequest"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string £* -5/apis/networking.k8s.io/v1beta1/ingressclasses/{name}é)˜ -networking_v1beta1read the specified IngressClass*!readNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jb -x-kubernetes-group-version-kind?=kind: IngressClass -version: v1beta1 -group: networking.k8s.io -û -networking_v1beta1"replace the specified IngressClass*$replaceNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN -L -Jbodybody *: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ -P -201I -G -Created< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí +G +202@ +> +Accepted2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob  401  Unauthorized -K -200D -B -OK< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClassRhttpsjb -x-kubernetes-group-version-kind?=version: v1beta1 -group: networking.k8s.io -kind: IngressClass -j -x-kubernetes-actionput -*§ -networking_v1beta1delete an IngressClass*#deleteNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJobRhttpsj +x-kubernetes-actionpost +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +*Õ, + batch_v1beta1delete collection of CronJob*-deleteBatchV1beta1CollectionNamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=version: v1beta1 -group: networking.k8s.io -kind: IngressClass -j -x-kubernetes-action delete -B— -networking_v1beta1+partially update the specified IngressClass*"patchNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jf -K -200D -B -OK< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jb -x-kubernetes-group-version-kind?=version: v1beta1 -group: networking.k8s.io -kind: IngressClass -J9 -75"3pathname of the IngressClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ÷) -M/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses/{name}¥) -networking_v1beta1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*'watchNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 -20".pathname of the Ingress"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¤( -3/apis/rbac.authorization.k8s.io/v1beta1/watch/rolesì'à -rbacAuthorization_v1beta1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*5watchRbacAuthorizationV1beta1RoleListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -18006,177 +17146,16 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean æ( - /api/v1/persistentvolumes/{name}Á(ó -core_v1#read the specified PersistentVolume*readCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-kind: PersistentVolume -version: v1 -group: "" -j -x-kubernetes-actionget -È -core_v1&replace the specified PersistentVolume*replaceCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG -E -Cbodybody *3 -1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume -I -201B -@ -Created5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume -version: v1 -j -x-kubernetes-actionput -*ø -core_v1delete a PersistentVolume*deleteCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J« -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume -J -202C -A -Accepted5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jR -x-kubernetes-group-version-kind/-version: v1 -group: "" -kind: PersistentVolume -Bò -core_v1/partially update the specified PersistentVolume*patchCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume -version: v1 -J= -;9"7pathname of the PersistentVolume"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Æ) -8/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}‰)ë -apps_v1read the specified StatefulSet*readAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -¶ -apps_v1!replace the specified StatefulSet*"replaceAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.apps.v1.StatefulSetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet -D -201= -; -Created0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -*… -apps_v1delete a StatefulSet*!deleteAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg  401  @@ -18186,41 +17165,17 @@ L C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -j -x-kubernetes-action delete -Bê -apps_v1*partially update the specified StatefulSet* patchAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet - -401 - - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*version: v1 -group: apps -kind: StatefulSet -j -x-kubernetes-actionpatch -J8 -64"2pathname of the StatefulSet"name*string˜J` +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* +x-kubernetes-actiondeletecollection +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‚ - /apis/apiregistration.k8s.io/v1/ÝÚ -apiregistration_v1get available resources* getApiregistrationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +MKIquery-If 'true', then the output is pretty printed."pretty2string ç +/apis/events.k8s.io/v1/ËÈ + events_v1get available resources*getEventsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp U 200N L @@ -18230,9 +17185,9 @@ B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsÞ\ -&/api/v1/namespaces/{namespace}/secrets³\î% -core_v1$list or watch objects of kind Secret*listCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsþ] +//apis/scheduling.k8s.io/v1beta1/priorityclassesÊ]µ& +scheduling_v1beta1+list or watch objects of kind PriorityClass*"listSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -18254,58 +17209,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JY +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassList  401  - Unauthorized -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.SecretListRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionlist -jH -x-kubernetes-group-version-kind%#group: "" -kind: Secret -version: v1 -"Ë -core_v1create a Secret*createCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B= -; -9bodybody *) -'#/definitions/io.k8s.api.core.v1.SecretBž +jc +x-kubernetes-group-version-kind@>version: v1beta1 +group: scheduling.k8s.io +kind: PriorityClass +"È +scheduling_v1beta1create a PriorityClass*$createSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO +M +Kbodybody *; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JØ -: -2003 -1 -OK+ -) -'#/definitions/io.k8s.api.core.v1.Secret -? -2018 -6 -Created+ -) -'#/definitions/io.k8s.api.core.v1.Secret -@ -2029 -7 -Accepted+ -) -'#/definitions/io.k8s.api.core.v1.Secret +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JŽ +L +200E +C +OK= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +Q +201J +H +Created= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +R +202K +I +Accepted= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jH -x-kubernetes-group-version-kind%#version: v1 -group: "" -kind: Secret -*¾, -core_v1delete collection of Secret*&deleteCoreV1CollectionNamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jc +x-kubernetes-group-version-kind@>group: scheduling.k8s.io +kind: PriorityClass +version: v1beta1 +*ó, +scheduling_v1beta1"delete collection of PriorityClass*.deleteSchedulingV1beta1CollectionPriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -18342,13 +17297,93 @@ C  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#group: "" -kind: Secret -version: v1 -j* + UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -J` +jc +x-kubernetes-group-version-kind@>version: v1beta1 +group: scheduling.k8s.io +kind: PriorityClass +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ë& +/api/v1/configmapsÔ&È +core_v1'list or watch objects of kind ConfigMap*#listCoreV1ConfigMapForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ConfigMapList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jK +x-kubernetes-group-version-kind(&group: "" +kind: ConfigMap +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ + +2/api/v1/namespaces/{namespace}/pods/{name}/bindingÈ +"¢ +core_v1create binding of a Pod* createCoreV1NamespacedPodBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.core.v1.BindingJÛ + +401 + + Unauthorized +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Binding +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.core.v1.Binding +A +202: +8 +Accepted, +* +(#/definitions/io.k8s.api.core.v1.BindingRhttpsjI +x-kubernetes-group-version-kind&$group: "" +kind: Binding +version: v1 +j +x-kubernetes-actionpost +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J4 +20".pathname of the Binding"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string é W/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers/{name}/statusÛ @@ -18413,131 +17448,193 @@ D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jg + UnauthorizedRhttpsjg x-kubernetes-group-version-kindDBgroup: autoscaling kind: HorizontalPodAutoscaler version: v2beta1 +j +x-kubernetes-actionpatch JD B@">path#name of the HorizontalPodAutoscaler"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ù - /apis/rbac.authorization.k8s.io/ÔÑ -rbacAuthorizationget information of a group*getRbacAuthorizationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +MKIquery-If 'true', then the output is pretty printed."pretty2string Ç' +-/apis/discovery.k8s.io/v1beta1/endpointslices•'‰ +discovery_v1beta1+list or watch objects of kind EndpointSlice*1listDiscoveryV1beta1EndpointSliceForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jj +O +200H +F +OK@ +> +<#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceList  401  - UnauthorizedRhttpsö) -6/apis/rbac.authorization.k8s.io/v1/clusterroles/{name}») -rbacAuthorization_v1read the specified ClusterRole*"readRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRole + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=kind: EndpointSlice +version: v1beta1 +group: discovery.k8s.io +j +x-kubernetes-actionlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ý +/openid/v1/jwks/èå +openid\get service account issuer OpenID JSON Web Key Set (contains public token verification keys)*#getServiceAccountIssuerOpenIDKeyset2application/jwk-set+jsonJ7  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole -version: v1 -Û -rbacAuthorization_v1!replace the specified ClusterRole*%replaceRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.rbac.v1.ClusterRoleBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  + Unauthorized + +200 + +OK + ² +stringRhttpsþ) +R/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations/{name}§)Î +admissionregistration_v1Åwatch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*:watchAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA ? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRole -D -201= -; -Created0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRole +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole + UnauthorizedRhttpsjz +x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration version: v1 -*ª -rbacAuthorization_v1delete a ClusterRole*$deleteRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JK +IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean · +;/apis/authorization.k8s.io/v1beta1/selfsubjectaccessreviews÷ +"é +authorization_v1beta1 create a SelfSubjectAccessReview*1createAuthorizationV1beta1SelfSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B\ +Z +Xbodybody *H +F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewJµ +_ +202X +V +AcceptedJ +H +F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview  401  Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole -version: v1 -j -x-kubernetes-action delete -B -rbacAuthorization_v1*partially update the specified ClusterRole*#patchRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +Y +200R +P +OKJ +H +F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview +^ +201W +U +CreatedJ +H +F#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewRhttpsj +x-kubernetes-actionpost +jp +x-kubernetes-group-version-kindMKgroup: authorization.k8s.io +kind: SelfSubjectAccessReview +version: v1beta1 +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ï( +4/apis/batch/v1/watch/namespaces/{namespace}/cronjobs–(¨ +batch_v1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*!watchBatchV1NamespacedCronJobList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  Unauthorized +P +200I +G +OKA ? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRoleRhttpsj -x-kubernetes-actionpatch -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob version: v1 -J8 -64"2pathname of the ClusterRole"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ´) -C/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}ì(Ÿ -rbacAuthorization_v1¹watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchRbacAuthorizationV1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À) +;/apis/batch/v1/watch/namespaces/{namespace}/cronjobs/{name}€)Ü +batch_v1®watch changes to an object of kind CronJob. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -18549,9 +17646,9 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -jk -x-kubernetes-group-version-kindHFgroup: rbac.authorization.k8s.io -kind: ClusterRoleBinding +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -18567,8 +17664,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? -=;"9pathname of the ClusterRoleBinding"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the CronJob"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -18577,9 +17675,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ] -(/api/v1/namespaces/{namespace}/endpointsÛ\ú% -core_v1'list or watch objects of kind Endpoints*listCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ž^ +8/apis/apps/v1/namespaces/{namespace}/controllerrevisionsá] & +apps_v10list or watch objects of kind ControllerRevision*&listAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -18601,58 +17699,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.EndpointsList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je  401  - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints -version: v1 -j + Unauthorized +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.apps.v1.ControllerRevisionListRhttpsj x-kubernetes-actionlist -"Þ -core_v1create Endpoints*createCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.core.v1.EndpointsBž +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision +version: v1 +"¡ +apps_v1create a ControllerRevision*(createAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevisionBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +F +200? = -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +OK7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision +K +201D B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +Created7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision +L +202E C -202< -: -Accepted. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +Accepted7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints + UnauthorizedRhttpsjV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision version: v1 -*Ç, -core_v1delete collection of Endpoints*)deleteCoreV1CollectionNamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-actionpost +*ä, +apps_v1'delete collection of ControllerRevision*2deleteAppsV1CollectionNamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -18691,195 +17789,186 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jK -x-kubernetes-group-version-kind(&kind: Endpoints +jV +x-kubernetes-group-version-kind31group: apps +kind: ControllerRevision version: v1 -group: "" J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ð ->/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/scale­û -apps_v1'read scale of the specified StatefulSet*$readAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +MKIquery-If 'true', then the output is pretty printed."pretty2string Ü' +-/apis/autoscaling/v1/horizontalpodautoscalersª'ž +autoscaling_v15list or watch objects of kind HorizontalPodAutoscaler*8listAutoscalingV1HorizontalPodAutoscalerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jq +V +200O +M +OKG +E +C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale -version: v1 -j -x-kubernetes-actionget -È -apps_v1*replace scale of the specified StatefulSet*'replaceAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=version: v1 +group: autoscaling +kind: HorizontalPodAutoscaler +j +x-kubernetes-actionlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü +D/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}/status³À +flowcontrolApiserver_v1beta1'read status of the specified FlowSchema*/readFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Je +J +200C A -?bodybody */ --#/definitions/io.k8s.api.autoscaling.v1.ScaleBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ -E -201> -< -Created1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +OK; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema  401  - Unauthorized -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.ScaleRhttpsj + UnauthorizedRhttpsjk +x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io +kind: FlowSchema +version: v1beta1 +j +x-kubernetes-actionget +¡ +flowcontrolApiserver_v1beta1*replace status of the specified FlowSchema*2replaceFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM +K +Ibodybody *9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¶ +O +201H +F +Created; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema + +401 + + Unauthorized +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaRhttpsjk +x-kubernetes-group-version-kindHFkind: FlowSchema +version: v1beta1 +group: flowcontrol.apiserver.k8s.io +j x-kubernetes-actionput -jP -x-kubernetes-group-version-kind-+version: v1 -group: autoscaling -kind: Scale -Bú -apps_v13partially update scale of the specified StatefulSet*%patchAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B¿ +flowcontrolApiserver_v1beta13partially update status of the specified FlowSchema*0patchFlowcontrolApiserverV1beta1FlowSchemaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.autoscaling.v1.Scale +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jP -x-kubernetes-group-version-kind-+group: autoscaling -kind: Scale -version: v1 -J2 -0.",pathname of the Scale"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Æ) - -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet -D -202= -; -Accepted/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSetRhttpsj -x-kubernetes-actionpost -jN -x-kubernetes-group-version-kind+)version: v1 -group: apps -kind: ReplicaSet -*Ì, -apps_v1delete collection of ReplicaSet**deleteAppsV1CollectionNamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ü +/apis/extensions/Æà -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +extensionsget information of a group*getExtensionsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jN -x-kubernetes-group-version-kind+)version: v1 -group: apps -kind: ReplicaSet -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string þ] -//apis/scheduling.k8s.io/v1beta1/priorityclassesÊ]µ& -scheduling_v1beta1+list or watch objects of kind PriorityClass*"listSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsâ] +(/apis/policy/v1beta1/podsecuritypoliciesµ]®& +policy_v1beta1/list or watch objects of kind PodSecurityPolicy*"listPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -19054,21 +18035,21 @@ P G OKA ? -=#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassList +=#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jc -x-kubernetes-group-version-kind@>version: v1beta1 -group: scheduling.k8s.io -kind: PriorityClass -"È -scheduling_v1beta1create a PriorityClass*$createSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO +j\ +x-kubernetes-group-version-kind97version: v1beta1 +group: policy +kind: PodSecurityPolicy +"Á +policy_v1beta1create a PodSecurityPolicy*$createPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO M Kbodybody *; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassBž +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JŽ L @@ -19076,30 +18057,30 @@ L C OK= ; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy Q 201J H Created= ; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy R 202K I Accepted= ; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jc -x-kubernetes-group-version-kind@>version: v1beta1 -group: scheduling.k8s.io -kind: PriorityClass -*ó, -scheduling_v1beta1"delete collection of PriorityClass*.deleteSchedulingV1beta1CollectionPriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j\ +x-kubernetes-group-version-kind97version: v1beta1 +group: policy +kind: PodSecurityPolicy +*ì, +policy_v1beta1&delete collection of PodSecurityPolicy*.deletePolicyV1beta1CollectionPodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -19138,415 +18119,234 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jc -x-kubernetes-group-version-kind@>group: scheduling.k8s.io -kind: PriorityClass +j\ +x-kubernetes-group-version-kind97group: policy +kind: PodSecurityPolicy version: v1beta1 JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ê* -F/apis/discovery.k8s.io/v1/namespaces/{namespace}/endpointslices/{name}Ÿ*Ž - discovery_v1 read the specified EndpointSlice*&readDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice +MKIquery-If 'true', then the output is pretty printed."pretty2string È) +4/api/v1/namespaces/{namespace}/resourcequotas/{name})ñ +core_v1 read the specified ResourceQuota*!readCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionget -ç - discovery_v1#replace the specified EndpointSlice*)replaceDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSliceBž +jO +x-kubernetes-group-version-kind,*version: v1 +group: "" +kind: ResourceQuota +À +core_v1#replace the specified ResourceQuota*$replaceCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota F -200? +201? = -OK7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice +Created2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*¢ - discovery_v1delete an EndpointSlice*(deleteDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota +version: v1 +*ó +core_v1delete a ResourceQuota*#deleteCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J¥ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota +G +202@ +> +Accepted2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota  401  UnauthorizedRhttpsj x-kubernetes-action delete -j] -x-kubernetes-group-version-kind:8kind: EndpointSlice +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 -group: discovery.k8s.io -B - discovery_v1,partially update the specified EndpointSlice*'patchDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bð +core_v1,partially update the specified ResourceQuota*"patchCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\  401  Unauthorized -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSliceRhttpsj +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuotaRhttpsj x-kubernetes-actionpatch -j] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 J: -86"4pathname of the EndpointSlice"name*string˜J` +86"4pathname of the ResourceQuota"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string …) -E/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases»(Í -coordination_v1beta1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*+watchCoordinationV1beta1NamespacedLeaseList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ¿. +Q/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurations/{name}é- +admissionregistration_v1beta11read the specified ValidatingWebhookConfiguration*>readAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jƒ +h +200a +_ +OKY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration  401  - Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj] -x-kubernetes-group-version-kind:8group: coordination.k8s.io -kind: Lease + UnauthorizedRhttpsj +x-kubernetes-actionget +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷& -/apis/events.k8s.io/v1/eventsÕ&É - events_v1#list or watch objects of kind Event*!listEventsV1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.events.v1.EventList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Š) -G/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/networkpolicies¾(Ð - networking_v1ywatch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.*,watchNetworkingV1NamespacedNetworkPolicyList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -j^ -x-kubernetes-group-version-kind;9group: networking.k8s.io -kind: NetworkPolicy -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¼^ -@/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses÷]§& -networking_v1beta1%list or watch objects of kind Ingress*&listNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. +© -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.networking.v1beta1.IngressList - -401 - - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress -version: v1beta1 -j -x-kubernetes-actionlist -"© -networking_v1beta1create an Ingress*(createNetworkingV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.networking.v1beta1.IngressBž +admissionregistration_v1beta14replace the specified ValidatingWebhookConfiguration*AreplaceAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bk +i +gbodybody *W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jò  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress + Unauthorized +h +200a +_ +OKY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration +m +201f +d +CreatedY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationRhttpsj +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration version: v1beta1 -j -x-kubernetes-actionpost -*ë, -networking_v1beta1delete collection of Ingress*2deleteNetworkingV1beta1CollectionNamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-actionput +*ý +admissionregistration_v1beta1'delete a ValidatingWebhookConfiguration*@deleteAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: Ingress + UnauthorizedRhttpsj +x-kubernetes-action delete +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration version: v1beta1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‡ -5/apis/authorization.k8s.io/v1/selfsubjectrulesreviewsÍ -"¿ -authorization_v1create a SelfSubjectRulesReview*+createAuthorizationV1SelfSubjectRulesReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BV -T -Rbodybody *B -@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReviewJ£ -S -200L -J -OKD -B -@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview -X -201Q -O -CreatedD -B -@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview -Y -202R -P -AcceptedD -B -@#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview +BŒ +admissionregistration_v1beta1=partially update the specified ValidatingWebhookConfiguration*?patchAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jƒ +h +200a +_ +OKY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jj -x-kubernetes-group-version-kindGEkind: SelfSubjectRulesReview -version: v1 -group: authorization.k8s.io -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ø& -/apis/apps/v1/replicasetsÚ&Î -apps_v1(list or watch objects of kind ReplicaSet*$listAppsV1ReplicaSetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J] -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.apps.v1.ReplicaSetList + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1beta1 +JK +IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¸( +group: scheduling.k8s.io +kind: PriorityClass +version: v1beta1 +j x-kubernetes-actionget -jP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -Æ -core_v1$replace the specified ServiceAccount*%replaceCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BE -C -Abodybody *1 -/#/definitions/io.k8s.api.core.v1.ServiceAccountBž + +scheduling_v1beta1#replace the specified PriorityClass*%replaceSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO +M +Kbodybody *; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¦ -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount -G -201@ -> -Created3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jº +L +200E +C +OK= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass +Q +201J +H +Created= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*ø -core_v1delete a ServiceAccount*$deleteCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jc +x-kubernetes-group-version-kind@>group: scheduling.k8s.io +kind: PriorityClass +version: v1beta1 +*© +scheduling_v1beta1delete a PriorityClass*$deleteSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J§ -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount -H -202A -? -Accepted3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: scheduling.k8s.io +kind: PriorityClass +version: v1beta1 +j x-kubernetes-action delete -jP -x-kubernetes-group-version-kind-+version: v1 -group: "" -kind: ServiceAccount -Bô -core_v1-partially update the specified ServiceAccount*#patchCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B› +scheduling_v1beta1,partially update the specified PriorityClass*#patchSchedulingV1beta1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J] -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjc +x-kubernetes-group-version-kind@>group: scheduling.k8s.io +kind: PriorityClass +version: v1beta1 +j x-kubernetes-actionpatch -jP -x-kubernetes-group-version-kind-+version: v1 -group: "" -kind: ServiceAccount -J; -97"5pathname of the ServiceAccount"name*string˜J` +J: +86"4pathname of the PriorityClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ³) +7/apis/apps/v1/namespaces/{namespace}/deployments/{name}÷(ç +apps_v1read the specified Deployment*readAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +° +apps_v1 replace the specified Deployment*!replaceAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.DeploymentBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + Unauthorized +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.DeploymentRhttpsj +x-kubernetes-actionput +jN +x-kubernetes-group-version-kind+)kind: Deployment +version: v1 +group: apps +*‚ +apps_v1delete a Deployment* deleteAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: Deployment +j +x-kubernetes-action delete +Bæ +apps_v1)partially update the specified Deployment*patchAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +j +x-kubernetes-actionpatch +J7 +53"1pathname of the Deployment"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¦] -0/apis/apps/v1/namespaces/{namespace}/deploymentsñ\€& -apps_v1(list or watch objects of kind Deployment*listAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +MKIquery-If 'true', then the output is pretty printed."pretty2string ù +/apis/certificates.k8s.io/v1/×Ô +certificates_v1get available resources*getCertificatesV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsé +/apis/coordination.k8s.io/ÊÇ + coordinationget information of a group*getCoordinationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttps´' +*/apis/networking.k8s.io/v1/networkpolicies…'ù + networking_v1+list or watch objects of kind NetworkPolicy*-listNetworkingV1NetworkPolicyForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +j^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Â] ++/apis/storage.k8s.io/v1beta1/storageclasses’]¥& +storage_v1beta1*list or watch objects of kind StorageClass*listStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -19779,58 +18745,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J] -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.apps.v1.DeploymentList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jg  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -"é -apps_v1create a Deployment* createAppsV1NamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA -? -=bodybody *- -+#/definitions/io.k8s.api.apps.v1.DeploymentBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä -> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment + Unauthorized +L +200E C -201< -: -Created/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment -D -202= +OK= ; -Accepted/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment +9#/definitions/io.k8s.api.storage.v1beta1.StorageClassListRhttpsj_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 +j +x-kubernetes-actionlist +"¬ +storage_v1beta1create a StorageClass* createStorageV1beta1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BK +I +Gbodybody *7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‚ +N +202G +E +Accepted9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass  401  - UnauthorizedRhttpsj + Unauthorized +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass +M +201F +D +Created9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClassRhttpsj x-kubernetes-actionpost -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment -version: v1 -*Ì, -apps_v1delete collection of Deployment**deleteAppsV1CollectionNamespacedDeployment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j_ +x-kubernetes-group-version-kind<:version: v1beta1 +group: storage.k8s.io +kind: StorageClass +*ç, +storage_v1beta1!delete collection of StorageClass**deleteStorageV1beta1CollectionStorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -19869,30 +18835,30 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jN -x-kubernetes-group-version-kind+)version: v1 -group: apps -kind: Deployment -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string õ' -2/apis/autoscaling/v2beta1/horizontalpodautoscalers¾'² -autoscaling_v2beta15list or watch objects of kind HorizontalPodAutoscaler*=listAutoscalingV2beta1HorizontalPodAutoscalerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jv -[ -200T -R -OKL -J -H#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ü' +/api/v1/watch/limitranges¾'² +core_v1vwatch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.*)watchCoreV1LimitRangeListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 + UnauthorizedRhttpsjL +x-kubernetes-group-version-kind)'version: v1 +group: "" +kind: LimitRange +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -19916,9 +18882,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Á) -D/apis/certificates.k8s.io/v1/watch/certificatesigningrequests/{name}ø(¤ -certificates_v1Àwatch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*,watchCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Û( +3/api/v1/watch/namespaces/{namespace}/resourcequotas£(µ +core_v1ywatch individual changes to a list of ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead.*&watchCoreV1NamespacedResourceQuotaList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -19928,12 +18894,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*kind: ResourceQuota version: v1 +group: "" +j# +x-kubernetes-action  +watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -19948,8 +18915,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JF -DB"@path%name of the CertificateSigningRequest"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -19958,29 +18925,29 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë* -?/apis/apps/v1/namespaces/{namespace}/controllerrevisions/{name}‡*‡ -apps_v1%read the specified ControllerRevision*&readAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ê* +F/apis/discovery.k8s.io/v1/namespaces/{namespace}/endpointslices/{name}Ÿ*Ž + discovery_v1 read the specified EndpointSlice*&readDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja F 200? = OK7 5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice  401  UnauthorizedRhttpsj x-kubernetes-actionget -jV -x-kubernetes-group-version-kind31version: v1 -group: apps -kind: ControllerRevision -à -apps_v1(replace the specified ControllerRevision*)replaceAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 +ç + discovery_v1#replace the specified EndpointSlice*)replaceDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI G Ebodybody *5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevisionBž +3#/definitions/io.k8s.api.discovery.v1.EndpointSliceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® F @@ -19988,24 +18955,24 @@ F = OK7 5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice K 201D B Created7 5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice  401  UnauthorizedRhttpsj x-kubernetes-actionput -jV -x-kubernetes-group-version-kind31version: v1 -group: apps -kind: ControllerRevision -*š -apps_v1delete a ControllerRevision*(deleteAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 +*¢ + discovery_v1delete an EndpointSlice*(deleteDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -20013,10 +18980,6 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» - -401 - - Unauthorized L 200E C @@ -20028,113 +18991,45 @@ R I Accepted= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj x-kubernetes-action delete -jV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice version: v1 -B† -apps_v11partially update the specified ControllerRevision*'patchAppsV1NamespacedControllerRevision2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B + discovery_v1,partially update the specified EndpointSlice*'patchDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja - -401 - - Unauthorized F 200? = OK7 5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevisionRhttpsjV -x-kubernetes-group-version-kind31version: v1 -group: apps -kind: ControllerRevision -j -x-kubernetes-actionpatch -J? -=;"9pathname of the ControllerRevision"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‰ -C/api/v1/namespaces/{namespace}/persistentvolumeclaims/{name}/statusÁ¡ -core_v12read status of the specified PersistentVolumeClaim*/readCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim - -401 - - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42version: v1 -group: "" -kind: PersistentVolumeClaim -j -x-kubernetes-actionget -€ -core_v15replace status of the specified PersistentVolumeClaim*2replaceCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice  401  - Unauthorized -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimRhttpsj -x-kubernetes-actionput -jW -x-kubernetes-group-version-kind42kind: PersistentVolumeClaim + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice version: v1 -group: "" -B  -core_v1>partially update status of the specified PersistentVolumeClaim*0patchCoreV1NamespacedPersistentVolumeClaimStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim - -401 - - UnauthorizedRhttpsj +j x-kubernetes-actionpatch -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim -version: v1 -JB -@>"<path!name of the PersistentVolumeClaim"name*string˜J` +J: +86"4pathname of the EndpointSlice"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string —) -F/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgetsÌ(Þ -policy_v1beta1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*3watchPolicyV1beta1NamespacedPodDisruptionBudgetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ú' +(/apis/events.k8s.io/v1beta1/watch/eventsÍ'Á +events_v1beta1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*+watchEventsV1beta1EventListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -20144,13 +19039,13 @@ G  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -j# + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -20165,8 +19060,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -20175,9 +19069,224 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ›( -5/apis/scheduling.k8s.io/v1beta1/watch/priorityclassesá'Õ -scheduling_v1beta1ywatch individual changes to a list of PriorityClass. deprecated: use the 'watch' parameter with a list operation instead.*'watchSchedulingV1beta1PriorityClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean © +5/api/v1/namespaces/{namespace}/services/{name}/statusïé +core_v1$read status of the specified Service*!readCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +¬ +core_v1'replace status of the specified Service*$replaceCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.core.v1.ServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜ +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.core.v1.Service + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +Bè +core_v10partially update status of the specified Service*"patchCoreV1NamespacedServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Service + +401 + + UnauthorizedRhttpsjI +x-kubernetes-group-version-kind&$group: "" +kind: Service +version: v1 +j +x-kubernetes-actionpatch +J4 +20".pathname of the Service"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ã- +L/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations/{name}’-ø +admissionregistration_v11read the specified ValidatingWebhookConfiguration*9readAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ +c +200\ +Z +OKT +R +P#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jz +x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1 +‹ + +admissionregistration_v14replace the specified ValidatingWebhookConfiguration*group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 + UnauthorizedRhttpsj +x-kubernetes-actionwatch +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -20208,7 +19316,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the EndpointSlice"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -20217,9 +19327,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´/ -/api/v1/namespaces/ð% -core_v1'list or watch objects of kind Namespace*listCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ñ] +;/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses±]“& + networking_v1%list or watch objects of kind Ingress*!listNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -20241,132 +19351,29 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.core.v1.NamespaceList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -"Ö -core_v1create a Namespace*createCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.core.v1.NamespaceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já -= -2006 +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J` +E +200> +< +OK6 4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Namespace -C -202< -: -Accepted. -, -*#/definitions/io.k8s.api.core.v1.Namespace +2#/definitions/io.k8s.api.networking.v1.IngressList  401  - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53kind: Ingress version: v1 +group: networking.k8s.io j -x-kubernetes-actionpost -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string È -/apis/½º -apisget available API versions*getAPIVersions2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJm -R -200K -I -OKC -A -?#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList - -401 - - UnauthorizedRhttps· - -+/apis/authentication.k8s.io/v1/tokenreviews‡ -"ù -authentication_v1create a TokenReview*!createAuthenticationV1TokenReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.authentication.v1.TokenReviewJ… -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.authentication.v1.TokenReview -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.authentication.v1.TokenReview -O -202H -F -Accepted: -8 -6#/definitions/io.k8s.api.authentication.v1.TokenReview - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpost -j` -x-kubernetes-group-version-kind=;group: authentication.k8s.io -kind: TokenReview -version: v1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¬ -I/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses/{name}/statusÞŠ - networking_v1$read status of the specified Ingress*'readNetworkingV1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 -Ù - networking_v1'replace status of the specified Ingress**replaceNetworkingV1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +x-kubernetes-actionlist +"† + networking_v1create an Ingress*#createNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD B @bodybody *0 .#/definitions/io.k8s.api.networking.v1.IngressBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí A 200: 8 @@ -20379,60 +19386,128 @@ F Created2 0 .#/definitions/io.k8s.api.networking.v1.Ingress +G +202@ +> +Accepted2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress  401  - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53kind: Ingress + UnauthorizedRhttpsj +x-kubernetes-actionpost +jX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress version: v1 -group: networking.k8s.io -j -x-kubernetes-actionput -B‰ - networking_v10partially update status of the specified Ingress*(patchNetworkingV1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +*Ü, + networking_v1delete collection of Ingress*-deleteNetworkingV1CollectionNamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection jX x-kubernetes-group-version-kind53group: networking.k8s.io kind: Ingress version: v1 -J4 -20".pathname of the Ingress"name*string˜J` +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string à' -/api/v1/watch/podtemplatesÁ'µ -core_v1wwatch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.**watchCoreV1PodTemplateListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ú) +B/api/v1/watch/namespaces/{namespace}/replicationcontrollers/{name}³) +core_v1¼watch changes to an object of kind ReplicationController. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj +x-kubernetes-actionwatch +jW +x-kubernetes-group-version-kind42version: v1 +group: "" +kind: ReplicationController +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JB +@>"<path!name of the ReplicationController"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ·' +-/apis/rbac.authorization.k8s.io/v1beta1/roles…'ù +rbacAuthorization_v1beta1"list or watch objects of kind Role*0listRbacAuthorizationV1beta1RoleForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.rbac.v1beta1.RoleList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate -version: v1 + UnauthorizedRhttpsj +x-kubernetes-actionlist +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -20456,9 +19531,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ï_ - -< -Created1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -* -events_v1beta1delete an Event*"deleteEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» - -401 - - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -Bõ -events_v1beta1$partially update the specified Event*!patchEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -J2 -0.",pathname of the Event"name*string˜J` +jg +x-kubernetes-group-version-kindDBversion: v2beta1 +group: autoscaling +kind: HorizontalPodAutoscaler +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string è' - /apis/apps/v1/watch/statefulsetsÃ'· -apps_v1wwatch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.**watchAppsV1StatefulSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +MKIquery-If 'true', then the output is pretty printed."pretty2string ó +/apis/networking.k8s.io/v1/ÓÐ + networking_v1get available resources*getNetworkingV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jO -x-kubernetes-group-version-kind,*group: apps -kind: StatefulSet -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —] -//apis/apps/v1/namespaces/{namespace}/daemonsetsã\ü% -apps_v1'list or watch objects of kind DaemonSet*listAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttps¢_ +K/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindingsÒ^Ç& +rbacAuthorization_v1beta1)list or watch objects of kind RoleBinding*1listRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -20786,58 +19688,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.apps.v1.DaemonSetList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jc +H +200A +? +OK9 +7 +5#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList  401  - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"â -apps_v1create a DaemonSet*createAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.apps.v1.DaemonSetBž +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 +" +rbacAuthorization_v1beta1create a RoleBinding*3createRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet -C -202< -: -Accepted. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jö +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +J +202C +A +Accepted5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -*É, -apps_v1delete collection of DaemonSet*)deleteAppsV1CollectionNamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +ji +x-kubernetes-group-version-kindFDversion: v1beta1 +group: rbac.authorization.k8s.io +kind: RoleBinding +*- +rbacAuthorization_v1beta1 delete collection of RoleBinding*=deleteRbacAuthorizationV1beta1CollectionNamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -20876,117 +19778,27 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 +ji +x-kubernetes-group-version-kindFDkind: RoleBinding +version: v1beta1 +group: rbac.authorization.k8s.io J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string  ) -6/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}å(ã -apps_v1read the specified DaemonSet*readAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -ª -apps_v1replace the specified DaemonSet* replaceAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.apps.v1.DaemonSetBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -*ÿ -apps_v1delete a DaemonSet*deleteAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jM -x-kubernetes-group-version-kind*(group: apps -kind: DaemonSet -version: v1 -Bâ -apps_v1(partially update the specified DaemonSet*patchAppsV1NamespacedDaemonSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +MKIquery-If 'true', then the output is pretty printed."pretty2string ‘ +%/apis/apiregistration.k8s.io/v1beta1/çä +apiregistration_v1beta1get available resources*%getApiregistrationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.apps.v1.DaemonSet +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(version: v1 -group: apps -kind: DaemonSet -j -x-kubernetes-actionpatch -J6 -42"0pathname of the DaemonSet"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ×( -6/apis/apps/v1/watch/namespaces/{namespace}/replicasetsœ(® -apps_v1vwatch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.*#watchAppsV1NamespacedReplicaSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsÓ( +5/apis/apps/v1/watch/namespaces/{namespace}/daemonsets™(« +apps_v1uwatch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.*"watchAppsV1NamespacedDaemonSetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -20996,13 +19808,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +j# x-kubernetes-action  watchlist -jN -x-kubernetes-group-version-kind+)group: apps -kind: ReplicaSet -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21027,9 +19839,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ™) -J/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslicesÊ(Ü -discovery_v1beta1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*0watchDiscoveryV1beta1NamespacedEndpointSliceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×( +6/apis/apps/v1/watch/namespaces/{namespace}/deploymentsœ(® +apps_v1vwatch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.*#watchAppsV1NamespacedDeploymentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -21039,13 +19851,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +j# x-kubernetes-action  watchlist -jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice -version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21070,223 +19882,81 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ï( -I/apis/admissionregistration.k8s.io/v1/watch/mutatingwebhookconfigurations¡(• -admissionregistration_v1ˆwatch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*path#name of the HorizontalPodAutoscaler"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string À] +//apis/rbac.authorization.k8s.io/v1/clusterrolesŒ]©& +rbacAuthorization_v1)list or watch objects of kind ClusterRole*"listRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21308,58 +19978,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1beta1.CSINodeList - -401 - - UnauthorizedRhttpsjZ -x-kubernetes-group-version-kind75kind: CSINode -version: v1beta1 -group: storage.k8s.io -j -x-kubernetes-actionlist -"‰ -storage_v1beta1create a CSINode*createStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF -D -Bbodybody *2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINodeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jó +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ C 200< : OK4 2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode -H -201A -? -Created4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode -I -202B -@ -Accepted4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode +0#/definitions/io.k8s.api.rbac.v1.ClusterRoleList  401  UnauthorizedRhttpsj +x-kubernetes-actionlist +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: ClusterRole +version: v1 +"• +rbacAuthorization_v1create a ClusterRole*$createRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB +@ +>bodybody *. +,#/definitions/io.k8s.api.rbac.v1.ClusterRoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç +E +202> +< +Accepted0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole + +401 + + Unauthorized +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRoleRhttpsj x-kubernetes-actionpost -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode -version: v1beta1 -*Ø, -storage_v1beta1delete collection of CSINode*%deleteStorageV1beta1CollectionCSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: ClusterRole +version: v1 +*ô, +rbacAuthorization_v1 delete collection of ClusterRole*.deleteRbacAuthorizationV1CollectionClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -21396,170 +20066,133 @@ C  401  - UnauthorizedRhttpsjZ -x-kubernetes-group-version-kind75version: v1beta1 -group: storage.k8s.io -kind: CSINode + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?version: v1 +group: rbac.authorization.k8s.io +kind: ClusterRole j* x-kubernetes-actiondeletecollection JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ð* - +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSetRhttpsj x-kubernetes-actionget -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim +jN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet version: v1 -ð -core_v1+replace the specified PersistentVolumeClaim*,replaceCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimBž +° +apps_v1 replace the specified ReplicaSet*!replaceAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.ReplicaSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42version: v1 -group: "" -kind: PersistentVolumeClaim -j + UnauthorizedRhttpsj x-kubernetes-actionput -*› -core_v1delete a PersistentVolumeClaim*+deleteCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jN +x-kubernetes-group-version-kind+)kind: ReplicaSet +version: v1 +group: apps +*‚ +apps_v1delete a ReplicaSet* deleteAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Jµ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim -O -202H -F -Accepted: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet version: v1 -B -core_v14partially update the specified PersistentVolumeClaim**patchCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +j +x-kubernetes-action delete +Bæ +apps_v1)partially update the specified ReplicaSet*patchAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionpatch -JB -@>"<path!name of the PersistentVolumeClaim"name*string˜J` +jN +x-kubernetes-group-version-kind+)group: apps +kind: ReplicaSet +version: v1 +J7 +53"1pathname of the ReplicaSet"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ž -$/apis/authentication.k8s.io/v1beta1/åâ -authentication_v1beta1get available resources*$getAuthenticationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +MKIquery-If 'true', then the output is pretty printed."pretty2string ‡' +/apis/batch/v1beta1/cronjobsæ&Ú + batch_v1beta1%list or watch objects of kind CronJob*'listBatchV1beta1CronJobForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J` +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.batch.v1beta1.CronJobList  401  - UnauthorizedRhttps‹ -#/apis/apiextensions.k8s.io/v1beta1/ãà -apiextensions_v1beta1get available resources*#getApiextensionsV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp - -401 - - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttps× -/apis/events.k8s.io/¾» -eventsget information of a group*getEventsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttps¸( - -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.core.v1.SecretList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean £* +5/apis/networking.k8s.io/v1beta1/ingressclasses/{name}é)˜ +networking_v1beta1read the specified IngressClass*!readNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#group: "" -kind: Secret -version: v1 -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean „( -'/apis/apps/v1/watch/controllerrevisionsØ'Ì -apps_v1~watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.*1watchAppsV1ControllerRevisionListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsj +x-kubernetes-actionget +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass +version: v1beta1 +û +networking_v1beta1"replace the specified IngressClass*$replaceNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN +L +Jbodybody *: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ +K +200D +B +OK< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +P +201I +G +Created< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass +version: v1beta1 +*§ +networking_v1beta1delete an IngressClass*#deleteNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass +version: v1beta1 +j +x-kubernetes-action delete +B— +networking_v1beta1+partially update the specified IngressClass*"patchNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jb +x-kubernetes-group-version-kind?=group: networking.k8s.io +kind: IngressClass +version: v1beta1 +J9 +75"3pathname of the IngressClass"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ü+ +G/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets/{name}+§ +policy_v1beta1&read the specified PodDisruptionBudget*.readPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ji +N +200G +E +OK? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 + +policy_v1beta1)replace the specified PodDisruptionBudget*1replacePolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ +O +Mbodybody *= +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¾ + +401 + + Unauthorized +N +200G +E +OK? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget +S +201L +J +Created? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetRhttpsj +x-kubernetes-actionput +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 +*² +policy_v1beta1delete a PodDisruptionBudget*0deletePolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J»  401  Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj +x-kubernetes-action delete +j^ +x-kubernetes-group-version-kind;9version: v1beta1 +group: policy +kind: PodDisruptionBudget +B¦ +policy_v1beta12partially update the specified PodDisruptionBudget*/patchPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ji +N +200G +E +OK? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 +J@ +><":pathname of the PodDisruptionBudget"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ‹( +1/apis/storage.k8s.io/v1beta1/watch/storageclassesÕ'É +storage_v1beta1xwatch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.*#watchStorageV1beta1StorageClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjV -x-kubernetes-group-version-kind31version: v1 -group: apps -kind: ControllerRevision -j# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +j_ +x-kubernetes-group-version-kind<:group: storage.k8s.io +kind: StorageClass +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21666,9 +20461,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  ^ -9/apis/extensions/v1beta1/namespaces/{namespace}/ingressesâ] & -extensions_v1beta1%list or watch objects of kind Ingress*&listExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean û +/apis/extensions/v1beta1/ÝÚ +extensions_v1beta1get available resources* getExtensionsV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps½^ +6/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas‚^É& +flowcontrolApiserver_v1beta1(list or watch objects of kind FlowSchema*)listFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21690,58 +20497,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ji +N +200G +E +OK? += +;#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaList  401  - Unauthorized + UnauthorizedRhttpsj +x-kubernetes-actionlist +jk +x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io +kind: FlowSchema +version: v1beta1 +"Ö +flowcontrolApiserver_v1beta1create a FlowSchema*+createFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM +K +Ibodybody *9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jˆ J 200C A OK; 9 -7#/definitions/io.k8s.api.extensions.v1beta1.IngressListRhttpsj -x-kubernetes-actionlist -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress -version: v1beta1 -"¢ -extensions_v1beta1create an Ingress*(createExtensionsV1beta1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.extensions.v1beta1.IngressBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +O +201H F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +Created; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +P +202I +G +Accepted; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress +jk +x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io +kind: FlowSchema version: v1beta1 -*ä, -extensions_v1beta1delete collection of Ingress*2deleteExtensionsV1beta1CollectionNamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*‰- +flowcontrolApiserver_v1beta1delete collection of FlowSchema*5deleteFlowcontrolApiserverV1beta1CollectionFlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -21780,85 +20587,42 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress +jk +x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io +kind: FlowSchema version: v1beta1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string á( -0/apis/node.k8s.io/v1/watch/runtimeclasses/{name}¬(å -node_v1³watch changes to an object of kind RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ˜ +(/apis/rbac.authorization.k8s.io/v1beta1/ëè +rbacAuthorization_v1beta1get available resources*'getRbacAuthorizationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the RuntimeClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ú -/apis/apps/v1/ÇÄ -apps_v1get available resources*getAppsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp + Unauthorized U 200N L OKF D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttps( +./apis/rbac.authorization.k8s.io/v1/watch/rolesÝ'Ñ +rbacAuthorization_v1pwatch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.*0watchRbacAuthorizationV1RoleListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsÃ( --/api/v1/watch/namespaces/{namespace}/services‘(£ -core_v1swatch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.* watchCoreV1NamespacedServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# x-kubernetes-action  watchlist -jI -x-kubernetes-group-version-kind&$kind: Service +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 -group: "" J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -21873,8 +20637,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -21883,23 +20646,23 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Þ( -&/api/v1/watch/persistentvolumes/{name}³(è -core_v1·watch changes to an object of kind PersistentVolume. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ý& +/apis/apps/v1/statefulsetsÞ&Ò +apps_v1)list or watch objects of kind StatefulSet*%listAppsV1StatefulSetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.apps.v1.StatefulSetList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jR -x-kubernetes-group-version-kind/-group: "" -kind: PersistentVolume + UnauthorizedRhttpsj +x-kubernetes-actionlist +jO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -21915,8 +20678,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J= -;9"7pathname of the PersistentVolume"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -21925,9 +20687,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ò -/apis/apiregistration.k8s.io/ÐÍ -apiregistrationget information of a group*getApiregistrationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à +/apis/discovery.k8s.io/ÄÁ + discoveryget information of a group*getDiscoveryAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi N 200G E @@ -21937,27 +20699,28 @@ E  401  - UnauthorizedRhttpsà) -G/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases/{name}”)ò -coordination_v1¬watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttps™) +J/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslicesÊ(Ü +discovery_v1beta1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*0watchDiscoveryV1beta1NamespacedEndpointSliceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jb +x-kubernetes-group-version-kind?=group: discovery.k8s.io +kind: EndpointSlice +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ „query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ @@ -21969,8 +20732,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 -0.",pathname of the Lease"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -21980,9 +20742,123 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë^ -;/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets‹^¬& - policy_v11list or watch objects of kind PodDisruptionBudget*)listPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹* +B/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses/{name}Ä)ú + networking_v1read the specified Ingress*!readNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress + +401 + + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress +version: v1 +j +x-kubernetes-actionget +É + networking_v1replace the specified Ingress*$replaceNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.networking.v1.IngressBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress +version: v1 +*“ + networking_v1delete an Ingress*#deleteNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jX +x-kubernetes-group-version-kind53version: v1 +group: networking.k8s.io +kind: Ingress +Bù + networking_v1&partially update the specified Ingress*"patchNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress + +401 + + UnauthorizedRhttpsjX +x-kubernetes-group-version-kind53kind: Ingress +version: v1 +group: networking.k8s.io +j +x-kubernetes-actionpatch +J4 +20".pathname of the Ingress"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ô +/api/v1/ÇÄ +core_v1get available resources*getCoreV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps¦] +0/apis/apps/v1/namespaces/{namespace}/replicasetsñ\€& +apps_v1(list or watch objects of kind ReplicaSet*listAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -22004,58 +20880,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jh -M -200F -D -OK> -< -:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J] +B +200; +9 +OK3 +1 +/#/definitions/io.k8s.api.apps.v1.ReplicaSetList  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)kind: ReplicaSet +version: v1 +group: apps +j x-kubernetes-actionlist -jY -x-kubernetes-group-version-kind64version: v1 -group: policy -kind: PodDisruptionBudget -"¶ - policy_v1create a PodDisruptionBudget*+createPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž +"é +apps_v1create a ReplicaSet* createAppsV1NamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.ReplicaSetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J… -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget -O -202H -F -Accepted: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jä +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet +D +202= +; +Accepted/ +- ++#/definitions/io.k8s.api.apps.v1.ReplicaSet  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: ReplicaSet +j x-kubernetes-actionpost -jY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 -*í, - policy_v1(delete collection of PodDisruptionBudget*5deletePolicyV1CollectionNamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*Ì, +apps_v1delete collection of ReplicaSet**deleteAppsV1CollectionNamespacedReplicaSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -22092,60 +20968,118 @@ C  401  - UnauthorizedRhttpsjY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget -version: v1 + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)version: v1 +group: apps +kind: ReplicaSet j* x-kubernetes-actiondeletecollection J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¯) -3/api/v1/watch/namespaces/{namespace}/secrets/{name}÷(Ô -core_v1­watch changes to an object of kind Secret. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string â+ +>/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}Ÿ+À +certificates_v1,read the specified CertificateSigningRequest*+readCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp  401  Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjH -x-kubernetes-group-version-kind%#group: "" -kind: Secret +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsj +x-kubernetes-actionget +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J3 -1/"-pathname of the Secret"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean á` - -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment -L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment -M -202F -D -Accepted8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpost -j^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -*ä, - -storage_v1%delete collection of VolumeAttachment*)deleteStorageV1CollectionVolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -22471,35 +21313,30 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é +/apis/certificates.k8s.io/ÊÇ + certificatesget information of a group*getCertificatesAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9version: v1 -group: storage.k8s.io -kind: VolumeAttachment -j* -x-kubernetes-actiondeletecollection -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¹` -C/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurationsñ_Š' -admissionregistration_v1:list or watch objects of kind MutatingWebhookConfiguration*7listAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttps„_ +7/apis/certificates.k8s.io/v1/certificatesigningrequestsÈ^Ù& +certificates_v17list or watch objects of kind CertificateSigningRequest*+listCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -22521,59 +21358,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J€ -e -200^ -\ -OKV -T -R#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jt +Y +200R +P +OKJ +H +F#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1 -"Û +"‡ -admissionregistration_v1%create a MutatingWebhookConfiguration*9createAdmissionregistrationV1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bd -b -`bodybody *P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationBž +certificates_v1"create a CertificateSigningRequest*-createCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX +V +Tbodybody *D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÍ -a -200Z -X -OKR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration -f -201_ -] -CreatedR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration -g -202` -^ -AcceptedR -P -N#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J© +U +200N +L +OKF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +Z +201S +Q +CreatedF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +[ +202T +R +AcceptedF +D +B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration +jl +x-kubernetes-group-version-kindIGkind: CertificateSigningRequest version: v1 -*²- -admissionregistration_v11delete collection of MutatingWebhookConfiguration*CdeleteAdmissionregistrationV1CollectionMutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: certificates.k8s.io +*Ž- +certificates_v1.delete collection of CertificateSigningRequest*7deleteCertificatesV1CollectionCertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -22610,72 +21447,32 @@ C  401  - UnauthorizedRhttpsjx -x-kubernetes-group-version-kindUSgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration + UnauthorizedRhttpsjl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest version: v1 j* x-kubernetes-actiondeletecollection JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ®' -(/apis/coordination.k8s.io/v1beta1/leases'õ -coordination_v1beta1#list or watch objects of kind Lease*,listCoordinationV1beta1LeaseForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.coordination.v1beta1.LeaseList +MKIquery-If 'true', then the output is pretty printed."pretty2string ø( +?/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses´(Æ +extensions_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*+watchExtensionsV1beta1NamespacedIngressList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8group: coordination.k8s.io -kind: Lease -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean þ( -7/apis/scheduling.k8s.io/v1/watch/priorityclasses/{name}Â(ú - scheduling_v1´watch changes to an object of kind PriorityClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -22690,8 +21487,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the PriorityClass"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -22700,114 +21497,34 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ó) -0/apis/storage.k8s.io/v1/volumeattachments/{name}ž)ˆ - -storage_v1#read the specified VolumeAttachment*readStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment - -401 - - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -j -x-kubernetes-actionget -ã - -storage_v1&replace the specified VolumeAttachment* replaceStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à +/apis/policy/v1/ËÈ + policy_v1get available resources*getPolicyV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment - -401 - - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -j -x-kubernetes-actionput -* - -storage_v1delete a VolumeAttachment*deleteStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J± -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment -M -202F +OKF D -Accepted8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -j^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -B‡ + UnauthorizedRhttpsã +/apis/scheduling.k8s.io/Æà -storage_v1/partially update the specified VolumeAttachment*patchStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +schedulingget information of a group*getSchedulingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 -J= -;9"7pathname of the VolumeAttachment"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string þ' --/apis/storage.k8s.io/v1beta1/watch/csidriversÌ'À -storage_v1beta1uwatch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.* watchStorageV1beta1CSIDriverList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttps³) +Q/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindingsÝ(ï +rbacAuthorization_v1beta1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*6watchRbacAuthorizationV1beta1NamespacedRoleBindingList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -22817,13 +21534,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 +j# x-kubernetes-action  watchlist -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: storage.k8s.io -kind: CSIDriver J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -22838,7 +21555,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -22847,195 +21565,139 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷( ->/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions´(Æ -apps_v1~watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.*+watchAppsV1NamespacedControllerRevisionList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´ +4/api/v1/namespaces/{namespace}/services/{name}/proxyûŸ +core_v1(connect GET requests to proxy of Service*&connectCoreV1GetNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ' -"/apis/events.k8s.io/v1beta1/eventsé&Ý -events_v1beta1#list or watch objects of kind Event*&listEventsV1beta1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.events.v1beta1.EventList +Ÿ +core_v1(connect PUT requests to proxy of Service*&connectCoreV1PutNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ù( --/api/v1/namespaces/{namespace}/secrets/{name}§(Õ -core_v1read the specified Secret*readCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JU + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20version: v1 +group: "" +kind: ServiceProxyOptions +"¡ +core_v1)connect POST requests to proxy of Service*'connectCoreV1PostNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - Unauthorized -: -2003 -1 -OK+ -) -'#/definitions/io.k8s.api.core.v1.SecretRhttpsjH -x-kubernetes-group-version-kind%#group: "" -kind: Secret + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions version: v1 -j -x-kubernetes-actionget -– -core_v1replace the specified Secret*replaceCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B= -; -9bodybody *) -'#/definitions/io.k8s.api.core.v1.SecretBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J– +j! +x-kubernetes-action +connect +*¥ +core_v1+connect DELETE requests to proxy of Service*)connectCoreV1DeleteNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - Unauthorized -: -2003 -1 -OK+ -) -'#/definitions/io.k8s.api.core.v1.Secret -? -2018 -6 -Created+ -) -'#/definitions/io.k8s.api.core.v1.SecretRhttpsj -x-kubernetes-actionput -jH -x-kubernetes-group-version-kind%#group: "" -kind: Secret + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions version: v1 -*ô -core_v1delete a Secret*deleteCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +2§ +core_v1,connect OPTIONS requests to proxy of Service**connectCoreV1OptionsNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jH -x-kubernetes-group-version-kind%#group: "" -kind: Secret + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions version: v1 -BÔ -core_v1%partially update the specified Secret*patchCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JU -: -2003 -1 -OK+ -) -'#/definitions/io.k8s.api.core.v1.Secret +:¡ +core_v1)connect HEAD requests to proxy of Service*'connectCoreV1HeadNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#group: "" -kind: Secret + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20group: "" +kind: ServiceProxyOptions version: v1 -j -x-kubernetes-actionpatch -J3 -1/"-pathname of the Secret"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ú) -B/api/v1/watch/namespaces/{namespace}/replicationcontrollers/{name}³) -core_v1¼watch changes to an object of kind ReplicationController. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchCoreV1NamespacedReplicationController2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +j! +x-kubernetes-action +connect +B£ +core_v1*connect PATCH requests to proxy of Service*(connectCoreV1PatchNamespacedServiceProxy2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjU +x-kubernetes-group-version-kind20kind: ServiceProxyOptions +version: v1 +group: "" +j! +x-kubernetes-action +connect +J@ +><":pathname of the ServiceProxyOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JÐ +ÍÊÇquery¬Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy."path2string Ü' +/apis/batch/v1/watch/cronjobsº'® +batch_v1swatch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.*'watchBatchV1CronJobListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -23045,11 +21707,12 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jL +x-kubernetes-group-version-kind)'group: batch +kind: CronJob version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -23065,9 +21728,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JB -@>"<path!name of the ReplicationController"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23076,9 +21737,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ì' -/api/v1/watch/serviceaccountsÊ'¾ -core_v1zwatch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.*-watchCoreV1ServiceAccountListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean × +/apis/events.k8s.io/¾» +eventsget information of a group*getEventsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttps…( +(/apis/extensions/v1beta1/watch/ingressesØ'Ì +extensions_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*1watchExtensionsV1beta1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -23091,10 +21764,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 +jV +x-kubernetes-group-version-kind31group: extensions +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23118,133 +21791,92 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Œ) -5/apis/batch/v1/namespaces/{namespace}/cronjobs/{name}Ò(ß -batch_v1read the specified CronJob*readBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JW +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×^ +F/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindingsŒ^³& +rbacAuthorization_v1)list or watch objects of kind RoleBinding*,listRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.rbac.v1.RoleBindingList  401  - Unauthorized -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.CronJobRhttpsj -x-kubernetes-actionget -jL -x-kubernetes-group-version-kind)'kind: CronJob -version: v1 -group: batch -¤ -batch_v1replace the specified CronJob*replaceBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B? -= -;bodybody *+ -)#/definitions/io.k8s.api.batch.v1.CronJobBž + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?version: v1 +group: rbac.authorization.k8s.io +kind: RoleBinding +j +x-kubernetes-actionlist +"Ÿ +rbacAuthorization_v1create a RoleBinding*.createRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB +@ +>bodybody *. +,#/definitions/io.k8s.api.rbac.v1.RoleBindingBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jš -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob -A -201: -8 -Created- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -*ü -batch_v1delete a CronJob*deleteBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç +D +201= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -BÞ -batch_v1&partially update the specified CronJob*patchBatchV1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JW +Created0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding +E +202> < -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob +Accepted0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding  401  - UnauthorizedRhttpsjL -x-kubernetes-group-version-kind)'group: batch -kind: CronJob -version: v1 -j -x-kubernetes-actionpatch -J4 -20".pathname of the CronJob"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ù( -6/apis/networking.k8s.io/v1/watch/ingressclasses/{name}¾(÷ - networking_v1³watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA + Unauthorized ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBindingRhttpsj +x-kubernetes-actionpost +jd +x-kubernetes-group-version-kindA?kind: RoleBinding version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +group: rbac.authorization.k8s.io +*þ, +rbacAuthorization_v1 delete collection of RoleBinding*8deleteRbacAuthorizationV1CollectionNamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -23252,34 +21884,52 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the IngressClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ) -;/apis/networking.k8s.io/v1beta1/watch/ingressclasses/{name}Í(† -networking_v1beta1³watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchNetworkingV1beta1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - Unauthorized + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string œ( +5/apis/rbac.authorization.k8s.io/v1/watch/clusterrolesâ'Ö +rbacAuthorization_v1wwatch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.*'watchRbacAuthorizationV1ClusterRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjb -x-kubernetes-group-version-kind?=group: networking.k8s.io -kind: IngressClass -version: v1beta1 -j -x-kubernetes-actionwatch +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jd +x-kubernetes-group-version-kindA?version: v1 +group: rbac.authorization.k8s.io +kind: ClusterRole J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23294,8 +21944,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 -75"3pathname of the IngressClass"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23304,98 +21953,125 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷ -7/apis/storage.k8s.io/v1/volumeattachments/{name}/status»˜ - -storage_v1-read status of the specified VolumeAttachment*#readStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean æ( + /api/v1/persistentvolumes/{name}Á(ó +core_v1#read the specified PersistentVolume*readCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  UnauthorizedRhttpsj x-kubernetes-actionget -j^ -x-kubernetes-group-version-kind;9kind: VolumeAttachment -version: v1 -group: storage.k8s.io -ó - -storage_v10replace status of the specified VolumeAttachment*&replaceStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ -H -Fbodybody *6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentBž +jR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume +version: v1 +È +core_v1&replace the specified PersistentVolume*replaceCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment -L -201E -C -Created8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume version: v1 j x-kubernetes-actionput -B— - -storage_v19partially update status of the specified VolumeAttachment*$patchStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +*ø +core_v1delete a PersistentVolume*deleteCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J« +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +J +202C +A +Accepted5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume + +401 + + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume +version: v1 +j +x-kubernetes-action delete +Bò +core_v1/partially update the specified PersistentVolume*patchCoreV1PersistentVolume2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb -G -200@ -> -OK8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -j^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment +jR +x-kubernetes-group-version-kind/-group: "" +kind: PersistentVolume version: v1 J= -;9"7pathname of the VolumeAttachment"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¢( -/api/v1/watch/nodes/{name}ƒ(Ä -core_v1«watch changes to an object of kind Node. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +;9"7pathname of the PersistentVolume"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Æ) +<":pathname of the PodDisruptionBudget"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 +0.",pathname of the Event"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23463,33 +22140,92 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean â' -&/apis/storage.k8s.io/v1/watch/csinodes·'« +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ê\ +#/apis/node.k8s.io/v1/runtimeclasses¢\…& +node_v1*list or watch objects of kind RuntimeClass*listNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -storage_v1swatch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1CSINodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.node.v1.RuntimeClassList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jW +x-kubernetes-group-version-kind42group: node.k8s.io +kind: RuntimeClass +version: v1 +"ô +node_v1create a RuntimeClass*createNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.node.v1.RuntimeClassBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jê +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass +F +202? += +Accepted1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClass  401  Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# -x-kubernetes-action  -watchlist -jU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.node.v1.RuntimeClassRhttpsj +x-kubernetes-actionpost +jW +x-kubernetes-group-version-kind42group: node.k8s.io +kind: RuntimeClass version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +*Ï, +node_v1!delete collection of RuntimeClass*"deleteNodeV1CollectionRuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -23497,30 +22233,35 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚ - /apis/networking.k8s.io/v1beta1/ÝÚ -networking_v1beta1get available resources* getNetworkingV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsÌ\ -*/apis/batch/v1/namespaces/{namespace}/jobs\è% -batch_v1!list or watch objects of kind Job*listBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42kind: RuntimeClass +version: v1 +group: node.k8s.io +j* +x-kubernetes-actiondeletecollection +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ±\ +#/api/v1/namespaces/{namespace}/pods‰\â% +core_v1!list or watch objects of kind Pod*listCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23542,58 +22283,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JW -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.batch.v1.JobList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JV  401  - UnauthorizedRhttpsj + Unauthorized +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.PodListRhttpsj x-kubernetes-actionlist -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job +jE +x-kubernetes-group-version-kind" group: "" +kind: Pod version: v1 -"¿ -batch_v1 create a Job*createBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.batch.v1.JobBž +"¶ +core_v1 create a Pod*createCoreV1NamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: +8 +6bodybody *& +$#/definitions/io.k8s.api.core.v1.PodBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÒ -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.batch.v1.Job -> -2027 -5 -Accepted) -' -%#/definitions/io.k8s.api.batch.v1.Job +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÏ  401  Unauthorized -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.batch.v1.JobRhttpsj -x-kubernetes-actionpost -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job +7 +2000 +. +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod +< +2015 +3 +Created( +& +$#/definitions/io.k8s.api.core.v1.Pod += +2026 +4 +Accepted( +& +$#/definitions/io.k8s.api.core.v1.PodRhttpsjE +x-kubernetes-group-version-kind" kind: Pod version: v1 -*º, -batch_v1delete collection of Job*$deleteBatchV1CollectionNamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: "" +j +x-kubernetes-actionpost +*µ, +core_v1delete collection of Pod*#deleteCoreV1CollectionNamespacedPod2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -23632,38 +22373,98 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job +jE +x-kubernetes-group-version-kind" group: "" +kind: Pod version: v1 J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ´' -/api/v1/watch/nodesœ' -core_v1pwatch individual changes to a list of Node. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NodeList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +MKIquery-If 'true', then the output is pretty printed."pretty2string Þ\ +&/api/v1/namespaces/{namespace}/secrets³\î% +core_v1$list or watch objects of kind Secret*listCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.SecretList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node + UnauthorizedRhttpsj +x-kubernetes-actionlist +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +"Ë +core_v1create a Secret*createCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B= +; +9bodybody *) +'#/definitions/io.k8s.api.core.v1.SecretBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JØ +: +2003 +1 +OK+ +) +'#/definitions/io.k8s.api.core.v1.Secret +? +2018 +6 +Created+ +) +'#/definitions/io.k8s.api.core.v1.Secret +@ +2029 +7 +Accepted+ +) +'#/definitions/io.k8s.api.core.v1.Secret + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpost +jH +x-kubernetes-group-version-kind%#version: v1 +group: "" +kind: Secret +*¾, +core_v1delete collection of Secret*&deleteCoreV1CollectionNamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -23671,18 +22472,36 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ( -*/apis/policy/v1/watch/poddisruptionbudgetsá'Õ - policy_v1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*4watchPolicyV1PodDisruptionBudgetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Á) +D/apis/certificates.k8s.io/v1/watch/certificatesigningrequests/{name}ø(¤ +certificates_v1Àwatch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*,watchCertificatesV1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -23692,13 +22511,12 @@ G  401  - UnauthorizedRhttpsjY -x-kubernetes-group-version-kind64version: v1 -group: policy -kind: PodDisruptionBudget -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jl +x-kubernetes-group-version-kindIGgroup: certificates.k8s.io +kind: CertificateSigningRequest +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23713,7 +22531,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JF +DB"@path%name of the CertificateSigningRequest"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23722,52 +22541,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ”* -M/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgets/{name}Â)’ -policy_v1beta1ºwatch changes to an object of kind PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ï +/apis/policy/v1beta1/ÕÒ +policy_v1beta1get available resources*getPolicyV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J@ -><":pathname of the PodDisruptionBudget"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ü) -F/apis/events.k8s.io/v1beta1/watch/namespaces/{namespace}/events/{name}‘)ï -events_v1beta1¬watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*!watchEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttps–) +=/apis/apiregistration.k8s.io/v1beta1/watch/apiservices/{name}Ô( +apiregistration_v1beta1±watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*%watchApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -23777,12 +22565,12 @@ G  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@version: v1beta1 +kind: APIService +group: apiregistration.k8s.io +j x-kubernetes-actionwatch -jW -x-kubernetes-group-version-kind42group: events.k8s.io -kind: Event -version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23797,9 +22585,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J2 -0.",pathname of the Event"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 +53"1pathname of the APIService"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23808,9 +22595,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ä' -/apis/apps/v1/watch/deploymentsÀ'´ -apps_v1vwatch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.*)watchAppsV1DeploymentListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ù( +:/apis/events.k8s.io/v1/watch/namespaces/{namespace}/eventsš(¬ + events_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.* watchEventsV1NamespacedEventList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -23820,13 +22607,13 @@ G  401  - UnauthorizedRhttpsjN -x-kubernetes-group-version-kind+)kind: Deployment -version: v1 -group: apps -j# + UnauthorizedRhttpsj# x-kubernetes-action  watchlist +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -23841,7 +22628,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -23850,240 +22638,225 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ù -/apis/coordination.k8s.io/v1/×Ô -coordination_v1get available resources*getCoordinationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps†_ -D/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices½^»& -discovery_v1beta1+list or watch objects of kind EndpointSlice*+listDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ú( +,/apis/storage.k8s.io/v1beta1/csinodes/{name}É(ø +storage_v1beta1read the specified CSINode*readStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode  401  - Unauthorized -O -200H -F -OK@ -> -<#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceListRhttpsj -x-kubernetes-actionlist -jb -x-kubernetes-group-version-kind?=version: v1beta1 -group: discovery.k8s.io -kind: EndpointSlice -"Ì -discovery_v1beta1create an EndpointSlice*-createDiscoveryV1beta1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN -L -Jbodybody *: -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceBž + UnauthorizedRhttpsj +x-kubernetes-actionget +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode +version: v1beta1 +Ë +storage_v1beta1replace the specified CSINode*replaceStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF +D +Bbodybody *2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINodeBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ -K -200D -B -OK< -: -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice -P -201I -G -Created< +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¨ +C +200< : -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice -Q -202J +OK4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode H -Accepted< -: -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice +201A +? +Created4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice + UnauthorizedRhttpsj +x-kubernetes-actionput +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode version: v1beta1 -*ú, -discovery_v1beta1"delete collection of EndpointSlice*7deleteDiscoveryV1beta1CollectionNamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ü +storage_v1beta1delete a CSINode*deleteStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J© +I +202B +@ +Accepted4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jb -x-kubernetes-group-version-kind?=group: discovery.k8s.io -kind: EndpointSlice + Unauthorized +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINodeRhttpsj +x-kubernetes-action delete +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode version: v1beta1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ã -/apis/scheduling.k8s.io/Æà - -schedulingget information of a group*getSchedulingAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +B÷ +storage_v1beta1&partially update the specified CSINode*patchStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode  401  - UnauthorizedRhttps‰ -C/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/statusÁ¡ -core_v12read status of the specified ReplicationController*/readCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jZ +x-kubernetes-group-version-kind75kind: CSINode +version: v1beta1 +group: storage.k8s.io +J4 +20".pathname of the CSINode"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ö) +6/apis/rbac.authorization.k8s.io/v1/clusterroles/{name}») +rbacAuthorization_v1read the specified ClusterRole*"readRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole  401  - Unauthorized -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationControllerRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionget -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: ClusterRole version: v1 -€ -core_v15replace status of the specified ReplicationController*2replaceCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL -J -Hbodybody *8 -6#/definitions/io.k8s.api.core.v1.ReplicationControllerBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ -I -200B +Û +rbacAuthorization_v1!replace the specified ClusterRole*%replaceRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB @ -OK: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController -N -201G -E -Created: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController +>bodybody *. +,#/definitions/io.k8s.api.rbac.v1.ClusterRoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: ClusterRole +version: v1 +j x-kubernetes-actionput -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController +*ª +rbacAuthorization_v1delete a ClusterRole*$deleteRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: ClusterRole version: v1 -B  -core_v1>partially update status of the specified ReplicationController*0patchCoreV1NamespacedReplicationControllerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B +rbacAuthorization_v1*partially update the specified ClusterRole*#patchRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jW -x-kubernetes-group-version-kind42group: "" -kind: ReplicationController +jd +x-kubernetes-group-version-kindA?kind: ClusterRole version: v1 -JB -@>"<path!name of the ReplicationController"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ú) -B/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims/{name}³) -core_v1¼watch changes to an object of kind PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +group: rbac.authorization.k8s.io +J8 +64"2pathname of the ClusterRole"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ž' +(/apis/rbac.authorization.k8s.io/v1/rolesñ&å +rbacAuthorization_v1"list or watch objects of kind Role*+listRbacAuthorizationV1RoleForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JW +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.rbac.v1.RoleList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim + UnauthorizedRhttpsj +x-kubernetes-actionlist +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -24099,9 +22872,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JB -@>"<path!name of the PersistentVolumeClaim"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -24110,24 +22881,25 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ´' -*/apis/networking.k8s.io/v1/networkpolicies…'ù - networking_v1+list or watch objects of kind NetworkPolicy*-listNetworkingV1NetworkPolicyForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jf +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À( +:/apis/rbac.authorization.k8s.io/v1beta1/watch/rolebindings(õ +rbacAuthorization_v1beta1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*bodybody *. +,#/definitions/io.k8s.api.apps.v1.StatefulSetBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet + +401 + + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet version: v1 -j! -x-kubernetes-action -connect -JB -@>"<path!name of the PodPortForwardOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JY -WUSquery7List of ports to forward Required when using WebSockets"ports2integer ‰( -$/api/v1/watch/persistentvolumeclaimsà'Ô -core_v1watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.*4watchCoreV1PersistentVolumeClaimListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +j +x-kubernetes-actionput +*… +apps_v1delete a StatefulSet*!deleteAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet +version: v1 +Bê +apps_v1*partially update the specified StatefulSet* patchAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jO +x-kubernetes-group-version-kind,*version: v1 +group: apps +kind: StatefulSet +J8 +64"2pathname of the StatefulSet"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string è' + /apis/apps/v1/watch/statefulsetsÃ'· +apps_v1wwatch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.**watchAppsV1StatefulSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -24203,13 +23037,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet +version: v1 +j# x-kubernetes-action  watchlist -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -24233,206 +23067,140 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ì -/apis/authorization.k8s.io/ÌÉ - authorizationget information of a group*getAuthorizationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é +W/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers/{name}/statusÛ +autoscaling_v2beta24read status of the specified HorizontalPodAutoscaler*=readAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jr +W +200P N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup - -401 - - UnauthorizedRhttpsÊ\ -#/apis/node.k8s.io/v1/runtimeclasses¢\…& -node_v1*list or watch objects of kind RuntimeClass*listNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J_ -D -200= -; -OK5 -3 -1#/definitions/io.k8s.api.node.v1.RuntimeClassList +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -j -x-kubernetes-actionlist -"ô -node_v1create a RuntimeClass*createNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC -A -?bodybody */ --#/definitions/io.k8s.api.node.v1.RuntimeClassBž + UnauthorizedRhttpsj +x-kubernetes-actionget +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +Ö +autoscaling_v2beta27replace status of the specified HorizontalPodAutoscaler*@replaceAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BZ +X +Vbodybody *F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jê -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass -E -201> -< -Created1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÐ +W +200P +N +OKH F -202? -= -Accepted1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +\ +201U +S +CreatedH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -*Ï, -node_v1!delete collection of RuntimeClass*"deleteNodeV1CollectionRuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + UnauthorizedRhttpsjg +x-kubernetes-group-version-kindDBkind: HorizontalPodAutoscaler +version: v2beta2 +group: autoscaling +j +x-kubernetes-actionput +BÚ +autoscaling_v2beta2@partially update status of the specified HorizontalPodAutoscaler*>patchAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jr +W +200P +N +OKH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ð - /apis/policy/¾» -policyget information of a group*getPolicyAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 +JD +B@">path#name of the HorizontalPodAutoscaler"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ý +/apis/batch/v1/ÉÆ +batch_v1get available resources*getBatchV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttps­ -3/api/v1/namespaces/{namespace}/pods/{name}/evictionõ -"Î -core_v1create eviction of a Pod*!createCoreV1NamespacedPodEviction2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF -D -Bbodybody *2 -0#/definitions/io.k8s.api.policy.v1beta1.EvictionJó -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.policy.v1beta1.Eviction -H -201A -? -Created4 -2 -0#/definitions/io.k8s.api.policy.v1beta1.Eviction -I -202B -@ -Accepted4 -2 -0#/definitions/io.k8s.api.policy.v1beta1.Eviction + UnauthorizedRhttpsú +./api/v1/namespaces/{namespace}/pods/{name}/logÇÄ +core_v1read log of the specified Pod*readCoreV1NamespacedPodLog2 +text/plain2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsjS -x-kubernetes-group-version-kind0.kind: Eviction -version: v1beta1 -group: policy -j -x-kubernetes-actionpost -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J5 -31"/pathname of the Eviction"name*string˜J` + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" kind: Pod +version: v1 +group: "" +j +x-kubernetes-actionget +J +Š‡queryhThe container for which to stream logs. Defaults to only container if there is one container in the pod." container2string JW +USQquery4Follow the log stream of the pod. Defaults to false."follow2boolean JŒ +‰†ƒqueryÏinsecureSkipTLSVerifyBackend indicates that the apiserver should not confirm the validity of the serving certificate of the backend it is connecting to. This will make the HTTPS connection between the apiserver and the backend insecure. This means the apiserver cannot verify the log data it is receiving came from the real kubelet. If the kubelet is configured to verify the apiserver's TLS credentials, it does not mean the connection to the real kubelet is vulnerable to a man in the middle attack (e.g. an attacker could not intercept the actual log data coming from the real kubelet)."insecureSkipTLSVerifyBackend2boolean J€ +ýú÷queryÕIf set, the number of bytes to read from the server before terminating the log output. This may not display a complete final line of logging, and may return slightly more or slightly less than the specified limit." +limitBytes2integer J0 +.,"*pathname of the Pod"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string „' -/api/v1/serviceaccountsè&Ü -core_v1,list or watch objects of kind ServiceAccount*(listCoreV1ServiceAccountForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.core.v1.ServiceAccountList +MKIquery-If 'true', then the output is pretty printed."pretty2string Jb +`^\query=Return previous terminated container logs. Defaults to false."previous2boolean JÍ +ÊÇÄquery A relative time in seconds before the current time from which to show logs. If this value precedes the time a pod was started, only logs since the pod start will be returned. If this value is in the future, no logs will be returned. Only one of sinceSeconds or sinceTime may be specified." sinceSeconds2integer JÈ +Å¿queryžIf set, the number of lines from the end of the logs to show. If not specified, logs are shown from the creation of the container or sinceSeconds or sinceTime" tailLines2integer J› +˜•’queryqIf true, add an RFC3339 or RFC3339Nano timestamp at the beginning of every line of log output. Defaults to false." +timestamps2boolean ×' +1/apis/storage.k8s.io/v1beta1/csistoragecapacities¡'• +storage_v1beta10list or watch objects of kind CSIStorageCapacity*4listStorageV1beta1CSIStorageCapacityForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jm +R +200K +I +OKC +A +?#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityList  401  - UnauthorizedRhttpsjP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist +je +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -24456,9 +23224,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean „a -H/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations·`ž' -admissionregistration_v1beta1:list or watch objects of kind MutatingWebhookConfiguration*createAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bi -g -ebodybody *U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationBž +je +x-kubernetes-group-version-kindB@version: v1beta1 +group: storage.k8s.io +kind: CSIStorageCapacity +"à +storage_v1beta1create a CSIStorageCapacity*0createStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ +O +Mbodybody *= +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÜ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J” +N +200G +E +OK? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +S +201L +J +Created? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +T +202M +K +Accepted? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity  401  - Unauthorized -f -200_ -] -OKW -U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration -k -201d -b -CreatedW -U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration -l -202e -c -AcceptedW -U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationRhttpsj} -x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity version: v1beta1 j x-kubernetes-actionpost -*Á- -admissionregistration_v1beta11delete collection of MutatingWebhookConfiguration*HdeleteAdmissionregistrationV1beta1CollectionMutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ƒ- +storage_v1beta1'delete collection of CSIStorageCapacity*:deleteStorageV1beta1CollectionNamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -24569,126 +23336,147 @@ C  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j} -x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity version: v1beta1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ï - -2/apis/authorization.k8s.io/v1/subjectaccessreviews¸ -"ª -authorization_v1create a SubjectAccessReview*(createAuthorizationV1SubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BS -Q -Obodybody *? -=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewJš -P -200I -G -OKA -? -=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview -U -201N -L -CreatedA -? -=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview -V -202O -M -AcceptedA -? -=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpost -jg -x-kubernetes-group-version-kindDBgroup: authorization.k8s.io -kind: SubjectAccessReview -version: v1 -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Û -G/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status— -extensions_v1beta1$read status of the specified Ingress*,readExtensionsV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string · +!/api/v1/nodes/{name}/proxy/{path}‘” +core_v1%connect GET requests to proxy of Node*!connectCoreV1GetNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress -version: v1beta1 -ð -extensions_v1beta1'replace status of the specified Ingress*/replaceExtensionsV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.extensions.v1beta1.IngressBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +” +core_v1%connect PUT requests to proxy of Node*!connectCoreV1PutNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress -version: v1beta1 -B– -extensions_v1beta10partially update status of the specified Ingress*-patchExtensionsV1beta1NamespacedIngressStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-version: v1 +group: "" +kind: NodeProxyOptions +"– +core_v1&connect POST requests to proxy of Node*"connectCoreV1PostNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsjV -x-kubernetes-group-version-kind31kind: Ingress -version: v1beta1 -group: extensions -j -x-kubernetes-actionpatch -J4 -20".pathname of the Ingress"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ý] -./apis/storage.k8s.io/v1beta1/volumeattachmentsÊ]µ& -storage_v1beta1.list or watch objects of kind VolumeAttachment*"listStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-version: v1 +group: "" +kind: NodeProxyOptions +*š +core_v1(connect DELETE requests to proxy of Node*$connectCoreV1DeleteNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +2œ +core_v1)connect OPTIONS requests to proxy of Node*%connectCoreV1OptionsNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +j! +x-kubernetes-action +connect +:– +core_v1&connect HEAD requests to proxy of Node*"connectCoreV1HeadNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +j! +x-kubernetes-action +connect +B˜ +core_v1'connect PATCH requests to proxy of Node*#connectCoreV1PatchNodeProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +J= +;9"7pathname of the NodeProxyOptions"name*string˜J5 +31"/pathpath to the resource"path*string˜Jb +`^\queryBPath is the URL path to use for the current proxy request to node."path2string »^ +?/apis/discovery.k8s.io/v1/namespaces/{namespace}/endpointslices÷]§& + discovery_v1+list or watch objects of kind EndpointSlice*&listDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -24710,58 +23498,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.discovery.v1.EndpointSliceList  401  - UnauthorizedRhttpsjc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"È -storage_v1beta1create a VolumeAttachment*$createStorageV1beta1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO -M -Kbodybody *; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentBž +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 +"© + discovery_v1create an EndpointSlice*(createDiscoveryV1NamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.discovery.v1.EndpointSliceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JŽ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice L -200E +202E C -OK= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment -Q -201J -H -Created= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment -R -202K -I -Accepted= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment +Accepted7 +5 +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 -*ó, -storage_v1beta1%delete collection of VolumeAttachment*.deleteStorageV1beta1CollectionVolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 +*ë, + discovery_v1"delete collection of EndpointSlice*2deleteDiscoveryV1CollectionNamespacedEndpointSlice2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -24800,20 +23588,15 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jc -x-kubernetes-group-version-kind@>version: v1beta1 -group: storage.k8s.io -kind: VolumeAttachment -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string H -/logs/>< -logs*logFileListHandlerJ - -401 - - UnauthorizedRhttps©] -+/api/v1/namespaces/{namespace}/podtemplatesù\‚& -core_v1)list or watch objects of kind PodTemplate*listCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ³] +*/apis/scheduling.k8s.io/v1/priorityclasses„]¡& + scheduling_v1+list or watch objects of kind PriorityClass*listSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -24835,58 +23618,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ -C -200< +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jf +K +200D +B +OK< : -OK4 -2 -0#/definitions/io.k8s.api.core.v1.PodTemplateList +8#/definitions/io.k8s.api.scheduling.v1.PriorityClassList  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass version: v1 -"î -core_v1create a PodTemplate*!createCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.core.v1.PodTemplateBž +j +x-kubernetes-actionlist +"¥ + scheduling_v1create a PriorityClass*createSchedulingV1PriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç -? -2008 +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jÿ +G +200@ +> +OK8 6 -OK0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass +M +202F D -201= -; -Created0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate -E -202> -< -Accepted0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate +Accepted8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate +j^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass version: v1 -*Í, -core_v1 delete collection of PodTemplate*+deleteCoreV1CollectionNamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ä, + scheduling_v1"delete collection of PriorityClass*)deleteSchedulingV1CollectionPriorityClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -24923,17 +23706,16 @@ C  401  - UnauthorizedRhttpsjM -x-kubernetes-group-version-kind*(group: "" -kind: PodTemplate + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: scheduling.k8s.io +kind: PriorityClass version: v1 j* x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ù -/apis/storage.k8s.io/v1beta1/×Ô -storage_v1beta1get available resources*getStorageV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ‚ + /apis/scheduling.k8s.io/v1beta1/ÝÚ +scheduling_v1beta1get available resources* getSchedulingV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp U 200N L @@ -24943,15 +23725,115 @@ B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttps¥] -)/apis/networking.k8s.io/v1/ingressclasses÷\& - networking_v1*list or watch objects of kind IngressClass*listNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï + UnauthorizedRhttps¯ +J/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}/statusà‚ +apiextensions_v1beta15read status of the specified CustomResourceDefinition*6readApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J’ +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jq +x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io +kind: CustomResourceDefinition +version: v1beta1 +¼ + +apiextensions_v1beta18replace status of the specified CustomResourceDefinition*9replaceApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bz +x +vbodybody *f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition +| +201u +s +Createdh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jq +x-kubernetes-group-version-kindNLversion: v1beta1 +group: apiextensions.k8s.io +kind: CustomResourceDefinition +B +apiextensions_v1beta1Apartially update status of the specified CustomResourceDefinition*7patchApiextensionsV1beta1CustomResourceDefinitionStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J’ +w +200p +n +OKh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jq +x-kubernetes-group-version-kindNLversion: v1beta1 +group: apiextensions.k8s.io +kind: CustomResourceDefinition +JE +CA"?path$name of the CustomResourceDefinition"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ï +/apis/authentication.k8s.io/ÎË +authenticationget information of a group*getAuthenticationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup + +401 + + UnauthorizedRhttpsñ( +4/apis/storage.k8s.io/v1beta1/watch/csidrivers/{name}¸(ô +storage_v1beta1°watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +j\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -24959,154 +23841,94 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 +42"0pathname of the CSIDriver"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.networking.v1.IngressClassList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8kind: IngressClass -version: v1 -group: networking.k8s.io -"Ÿ - networking_v1create an IngressClass*createNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÷ +7/apis/storage.k8s.io/v1/volumeattachments/{name}/status»˜ + +storage_v1-read status of the specified VolumeAttachment*#readStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb G -Ebodybody *5 -3#/definitions/io.k8s.api.networking.v1.IngressClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8version: v1 -group: networking.k8s.io -kind: IngressClass -j -x-kubernetes-actionpost -*á, - networking_v1!delete collection of IngressClass*(deleteNetworkingV1CollectionIngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + UnauthorizedRhttpsj +x-kubernetes-actionget +j^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment +version: v1 +ó -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +storage_v10replace status of the specified VolumeAttachment*&replaceStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment L -200E +201E C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +Created8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass + UnauthorizedRhttpsj +x-kubernetes-actionput +j^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string —( -4/apis/networking.k8s.io/v1beta1/watch/ingressclassesÞ'Ò -networking_v1beta1xwatch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.*&watchNetworkingV1beta1IngressClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I +B— + +storage_v19partially update status of the specified VolumeAttachment*$patchStorageV1VolumeAttachmentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: networking.k8s.io -kind: IngressClass -version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9kind: VolumeAttachment +version: v1 +group: storage.k8s.io +j +x-kubernetes-actionpatch +J= +;9"7pathname of the VolumeAttachment"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string í( +3/apis/storage.k8s.io/v1/watch/storageclasses/{name}µ(î -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×( -6/apis/apps/v1/watch/namespaces/{namespace}/deploymentsœ(® -apps_v1vwatch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.*#watchAppsV1NamespacedDeploymentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +storage_v1³watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -25116,13 +23938,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jN -x-kubernetes-group-version-kind+)group: apps -kind: Deployment + UnauthorizedRhttpsjZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: StorageClass version: v1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25137,8 +23958,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 +75"3pathname of the StorageClass"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -25147,9 +23968,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean –` -7/apis/apiextensions.k8s.io/v1/customresourcedefinitionsÚ_÷& -apiextensions_v16list or watch objects of kind CustomResourceDefinition*+listApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¢a +J/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurationsÓ`¦' +admissionregistration_v1beta1listAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25171,59 +23992,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‘ -v -200o -m -OKg -e -c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‡ +l +200e +c +OK] +[ +Y#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jl -x-kubernetes-group-version-kindIGversion: v1 -group: apiextensions.k8s.io -kind: CustomResourceDefinition -"û - -apiextensions_v1!create a CustomResourceDefinition*-createApiextensionsV1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bu -s -qbodybody *a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionBž +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1beta1 +"Œ +admissionregistration_v1beta1'create a ValidatingWebhookConfiguration*@createAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bk +i +gbodybody *W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J€ -x -202q -o -Acceptedc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jâ +h +200a +_ +OKY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration +m +201f +d +CreatedY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration +n +202g +e +AcceptedY +W +U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration  401  - Unauthorized -r -200k -i -OKc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition -w -201p -n -Createdc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionpost -jl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1 -*Ž- -apiextensions_v1-delete collection of CustomResourceDefinition*7deleteApiextensionsV1CollectionCustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io +kind: ValidatingWebhookConfiguration +version: v1beta1 +*Ç- +admissionregistration_v1beta13delete collection of ValidatingWebhookConfiguration*JdeleteAdmissionregistrationV1beta1CollectionValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -25262,41 +24082,67 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jl -x-kubernetes-group-version-kindIGgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1 +j +x-kubernetes-group-version-kind\Zkind: ValidatingWebhookConfiguration +version: v1beta1 +group: admissionregistration.k8s.io JO -MKIquery-If 'true', then the output is pretty printed."pretty2string à -/apis/policy/v1/ËÈ - policy_v1get available resources*getPolicyV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +MKIquery-If 'true', then the output is pretty printed."pretty2string · + ++/apis/authentication.k8s.io/v1/tokenreviews‡ +"ù +authentication_v1create a TokenReview*!createAuthenticationV1TokenReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.authentication.v1.TokenReviewJ… +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.authentication.v1.TokenReview +N +201G +E +Created: +8 +6#/definitions/io.k8s.api.authentication.v1.TokenReview +O +202H +F +Accepted: +8 +6#/definitions/io.k8s.api.authentication.v1.TokenReview  401  - UnauthorizedRhttps’) -group: scheduling.k8s.io -kind: PriorityClass -version: v1beta1 + UnauthorizedRhttpsj +x-kubernetes-actionlist +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25311,8 +24157,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the PriorityClass"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -25321,9 +24166,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ³_ -H/apis/storage.k8s.io/v1beta1/namespaces/{namespace}/csistoragecapacitiesæ^Ç& -storage_v1beta10list or watch objects of kind CSIStorageCapacity*.listStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean –_ +@/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgetsÑ^À& +policy_v1beta11list or watch objects of kind PodDisruptionBudget*.listPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25351,21 +24196,21 @@ R I OKC A -?#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityList +?#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetList  401  - UnauthorizedRhttpsje -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget version: v1beta1 j x-kubernetes-actionlist -"à -storage_v1beta1create a CSIStorageCapacity*0createStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ +"Ù +policy_v1beta1create a PodDisruptionBudget*0createPolicyV1beta1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ O Mbodybody *= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityBž +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J”  @@ -25377,26 +24222,26 @@ N E OK? = -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget S 201L J Created? = -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget T 202M K Accepted? = -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityRhttpsj -x-kubernetes-actionpost -je -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetRhttpsj^ +x-kubernetes-group-version-kind;9kind: PodDisruptionBudget version: v1beta1 -*ƒ- -storage_v1beta1'delete collection of CSIStorageCapacity*:deleteStorageV1beta1CollectionNamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: policy +j +x-kubernetes-actionpost +*ü, +policy_v1beta1(delete collection of PodDisruptionBudget*:deletePolicyV1beta1CollectionNamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -25433,230 +24278,90 @@ C  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -je -x-kubernetes-group-version-kindB@group: storage.k8s.io -kind: CSIStorageCapacity + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget version: v1beta1 +j* +x-kubernetes-actiondeletecollection J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ´ +MKIquery-If 'true', then the output is pretty printed."pretty2string ô^ +;/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings´^Ù& +rbacAuthorization_v1beta10list or watch objects of kind ClusterRoleBinding*.listRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -'/api/v1/namespaces/{namespace}/bindingsˆ -"˜ -core_v1create a Binding*createCoreV1NamespacedBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.core.v1.BindingJÛ -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Binding -@ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.core.v1.Binding -A -202: -8 -Accepted, -* -(#/definitions/io.k8s.api.core.v1.Binding +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jj +O +200H +F +OK@ +> +<#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingList  401  - UnauthorizedRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Binding -version: v1 -j -x-kubernetes-actionpost -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ú( -,/apis/storage.k8s.io/v1beta1/csinodes/{name}É(ø -storage_v1beta1read the specified CSINode*readStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ -C -200< + UnauthorizedRhttpsj +x-kubernetes-actionlist +jp +x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1beta1 +"é +rbacAuthorization_v1beta1create a ClusterRoleBinding*0createRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN +L +Jbodybody *: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J‹ +K +200D +B +OK< : -OK4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding +P +201I +G +Created< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding +Q +202J +H +Accepted< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode -version: v1beta1 -Ë -storage_v1beta1replace the specified CSINode*replaceStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF -D -Bbodybody *2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINodeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¨ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode -H -201A -? -Created4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode -version: v1beta1 -*ü -storage_v1beta1delete a CSINode*deleteStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J© -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode -I -202B -@ -Accepted4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINode - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode -version: v1beta1 -B÷ -storage_v1beta1&partially update the specified CSINode*patchStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J^ - -401 - - Unauthorized -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.storage.v1beta1.CSINodeRhttpsj -x-kubernetes-actionpatch -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: CSINode + UnauthorizedRhttpsjp +x-kubernetes-group-version-kindMKkind: ClusterRoleBinding version: v1beta1 -J4 -20".pathname of the CSINode"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ö] -./api/v1/namespaces/{namespace}/serviceaccounts£]Ž& -core_v1,list or watch objects of kind ServiceAccount*"listCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ja - -401 - - Unauthorized -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.core.v1.ServiceAccountListRhttpsjP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 +group: rbac.authorization.k8s.io j -x-kubernetes-actionlist -"ƒ -core_v1create a ServiceAccount*$createCoreV1NamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BE -C -Abodybody *1 -/#/definitions/io.k8s.api.core.v1.ServiceAccountBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jð - -401 - - Unauthorized -B -200; -9 -OK3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount -G -201@ -> -Created3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount -H -202A -? -Accepted3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccountRhttpsj x-kubernetes-actionpost -jP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -*Ö, -core_v1#delete collection of ServiceAccount*.deleteCoreV1CollectionNamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*˜- +rbacAuthorization_v1beta1'delete collection of ClusterRoleBinding*:deleteRbacAuthorizationV1beta1CollectionClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -25695,53 +24400,53 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jP -x-kubernetes-group-version-kind-+kind: ServiceAccount -version: v1 -group: "" -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ó -;/api/v1/namespaces/{namespace}/serviceaccounts/{name}/token³ "ˆ -core_v1 create token of a ServiceAccount*)createCoreV1NamespacedServiceAccountToken2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM -K -Ibodybody *9 -7#/definitions/io.k8s.api.authentication.v1.TokenRequestJˆ -J -200C +jp +x-kubernetes-group-version-kindMKkind: ClusterRoleBinding +version: v1beta1 +group: rbac.authorization.k8s.io +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ´ + +'/api/v1/namespaces/{namespace}/bindingsˆ +"˜ +core_v1create a Binding*createCoreV1NamespacedBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.core.v1.BindingJÛ +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.core.v1.Binding +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.core.v1.Binding A -OK; -9 -7#/definitions/io.k8s.api.authentication.v1.TokenRequest -O -201H -F -Created; -9 -7#/definitions/io.k8s.api.authentication.v1.TokenRequest -P -202I -G -Accepted; -9 -7#/definitions/io.k8s.api.authentication.v1.TokenRequest +202: +8 +Accepted, +* +(#/definitions/io.k8s.api.core.v1.Binding  401  UnauthorizedRhttpsj x-kubernetes-actionpost -ja -x-kubernetes-group-version-kind> -2007 -5 -OK/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode -C -201< -: -Created/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode -D -202= -; -Accepted/ -- -+#/definitions/io.k8s.api.storage.v1.CSINode +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20version: v1 -group: storage.k8s.io -kind: CSINode -j -x-kubernetes-actionpost -*É, - -storage_v1delete collection of CSINode* deleteStorageV1CollectionCSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -25878,35 +24561,20 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J0 +.,"*pathname of the Job"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20group: storage.k8s.io -kind: CSINode -version: v1 -j* -x-kubernetes-actiondeletecollection -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string š( -4/apis/storage.k8s.io/v1beta1/watch/volumeattachmentsá'Õ -storage_v1beta1|watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.*'watchStorageV1beta1VolumeAttachmentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¢( +6/apis/apiregistration.k8s.io/v1beta1/watch/apiservicesç'Û +apiregistration_v1beta1vwatch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.*)watchApiregistrationV1beta1APIServiceList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -25916,13 +24584,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@version: v1beta1 +kind: APIService +group: apiregistration.k8s.io +j# x-kubernetes-action  watchlist -jc -x-kubernetes-group-version-kind@>group: storage.k8s.io -kind: VolumeAttachment -version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25946,9 +24614,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¿^ -5/api/v1/namespaces/{namespace}/persistentvolumeclaims…^ª& -core_v13list or watch objects of kind PersistentVolumeClaim*)listCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë^ +;/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets‹^¬& + policy_v11list or watch objects of kind PodDisruptionBudget*)listPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -25976,52 +24644,52 @@ M D OK> < -:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList +:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetList  401  - UnauthorizedRhttpsjW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim + UnauthorizedRhttpsjY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget version: v1 j x-kubernetes-actionlist -"´ -core_v1create a PersistentVolumeClaim*+createCoreV1NamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +"¶ + policy_v1create a PodDisruptionBudget*+createPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL J Hbodybody *8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimBž +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– “queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J… + +401 + + Unauthorized +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget N 201G E Created: 8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget O 202H F Accepted: 8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim - -401 - - Unauthorized -I -200B -@ -OK: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimRhttpsjW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim -version: v1 -j +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetRhttpsj x-kubernetes-actionpost -*ë, -core_v1*delete collection of PersistentVolumeClaim*5deleteCoreV1CollectionNamespacedPersistentVolumeClaim2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +*í, + policy_v1(delete collection of PodDisruptionBudget*5deletePolicyV1CollectionNamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -26049,91 +24717,32 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg - -401 - - Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -jW -x-kubernetes-group-version-kind42group: "" -kind: PersistentVolumeClaim -version: v1 -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ó( -B/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitionsŒ(€ -apiextensions_v1beta1„watch individual changes to a list of CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead.*5watchApiextensionsV1beta1CustomResourceDefinitionList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jq -x-kubernetes-group-version-kindNLgroup: apiextensions.k8s.io -kind: CustomResourceDefinition -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean …( -(/apis/extensions/v1beta1/watch/ingressesØ'Ì -extensions_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*1watchExtensionsV1beta1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjV -x-kubernetes-group-version-kind31group: extensions -kind: Ingress -version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï + UnauthorizedRhttpsjY +x-kubernetes-group-version-kind64version: v1 +group: policy +kind: PodDisruptionBudget +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ò_ +D/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers‰_Ð& +autoscaling_v15list or watch objects of kind HorizontalPodAutoscaler*2listAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -26141,173 +24750,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¤) -./apis/storage.k8s.io/v1beta1/csidrivers/{name}ñ(€ -storage_v1beta1read the specified CSIDriver*readStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J` - -401 - - Unauthorized -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverRhttpsj -x-kubernetes-actionget -j\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver -version: v1beta1 -× -storage_v1beta1replace the specified CSIDriver*replaceStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BH -F -Dbodybody *4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¬ -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver -J -201C -A -Created6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -j\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver -version: v1beta1 -*† -storage_v1beta1delete a CSIDriver*deleteStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J­ - -401 - - Unauthorized -E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver -K -202D -B -Accepted6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriverRhttpsj -x-kubernetes-action delete -j\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver -version: v1beta1 -Bÿ -storage_v1beta1(partially update the specified CSIDriver*patchStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J` +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jq +V +200O +M +OKG E -200> -< -OK6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: storage.k8s.io -kind: CSIDriver -J6 -42"0pathname of the CSIDriver"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ú -./api/v1/namespaces/{namespace}/pods/{name}/logÇÄ -core_v1read log of the specified Pod*readCoreV1NamespacedPodLog2 -text/plain2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J7 +C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList  401  - Unauthorized - -200 - -OK - ² -stringRhttpsj -x-kubernetes-actionget -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod + UnauthorizedRhttpsj +x-kubernetes-actionlist +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler version: v1 -J -Š‡queryhThe container for which to stream logs. Defaults to only container if there is one container in the pod." container2string JW -USQquery4Follow the log stream of the pod. Defaults to false."follow2boolean JŒ -‰†ƒqueryÏinsecureSkipTLSVerifyBackend indicates that the apiserver should not confirm the validity of the serving certificate of the backend it is connecting to. This will make the HTTPS connection between the apiserver and the backend insecure. This means the apiserver cannot verify the log data it is receiving came from the real kubelet. If the kubelet is configured to verify the apiserver's TLS credentials, it does not mean the connection to the real kubelet is vulnerable to a man in the middle attack (e.g. an attacker could not intercept the actual log data coming from the real kubelet)."insecureSkipTLSVerifyBackend2boolean J€ -ýú÷queryÕIf set, the number of bytes to read from the server before terminating the log output. This may not display a complete final line of logging, and may return slightly more or slightly less than the specified limit." -limitBytes2integer J0 -.,"*pathname of the Pod"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jb -`^\query=Return previous terminated container logs. Defaults to false."previous2boolean JÍ -ÊÇÄquery A relative time in seconds before the current time from which to show logs. If this value precedes the time a pod was started, only logs since the pod start will be returned. If this value is in the future, no logs will be returned. Only one of sinceSeconds or sinceTime may be specified." sinceSeconds2integer JÈ -Å¿queryžIf set, the number of lines from the end of the logs to show. If not specified, logs are shown from the creation of the container or sinceSeconds or sinceTime" tailLines2integer J› -˜•’queryqIf true, add an RFC3339 or RFC3339Nano timestamp at the beginning of every line of log output. Defaults to false." -timestamps2boolean  ' -!/apis/apps/v1/controllerrevisionsú&î -apps_v10list or watch objects of kind ControllerRevision*,listAppsV1ControllerRevisionForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je -J -200C +"õ +autoscaling_v1 create a HorizontalPodAutoscaler*4createAutoscalingV1NamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BU +S +Qbodybody *A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  +R +200K +I +OKC A -OK; -9 -7#/definitions/io.k8s.api.apps.v1.ControllerRevisionList +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +W +201P +N +CreatedC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +X +202Q +O +AcceptedC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler  401  - UnauthorizedRhttpsjV -x-kubernetes-group-version-kind31group: apps -kind: ControllerRevision + UnauthorizedRhttpsj +x-kubernetes-actionpost +jb +x-kubernetes-group-version-kind?=kind: HorizontalPodAutoscaler version: v1 -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +group: autoscaling +*ˆ- +autoscaling_v1,delete collection of HorizontalPodAutoscaler*>deleteAutoscalingV1CollectionNamespacedHorizontalPodAutoscaler2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -26315,134 +24827,51 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‡* -A/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}Á)ú -coordination_v1read the specified Lease*!readCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ - -401 - - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.coordination.v1.LeaseRhttpsj -x-kubernetes-actionget -jX -x-kubernetes-group-version-kind53kind: Lease -version: v1 -group: coordination.k8s.io -É -coordination_v1replace the specified Lease*$replaceCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.coordination.v1.LeaseBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.coordination.v1.Lease - -401 - - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.coordination.v1.LeaseRhttpsj -x-kubernetes-actionput -jX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 -*’ -coordination_v1delete a Lease*#deleteCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» - -401 - - Unauthorized +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjX -x-kubernetes-group-version-kind53version: v1 -group: coordination.k8s.io -kind: Lease -j -x-kubernetes-action delete -Bù -coordination_v1$partially update the specified Lease*"patchCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.coordination.v1.Lease  401  - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler version: v1 -j -x-kubernetes-actionpatch -J2 -0.",pathname of the Lease"name*string˜J` +J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ®' -(/apis/discovery.k8s.io/v1/endpointslices'õ - discovery_v1+list or watch objects of kind EndpointSlice*,listDiscoveryV1EndpointSliceForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.discovery.v1.EndpointSliceList +MKIquery-If 'true', then the output is pretty printed."pretty2string ¬( +5/apis/rbac.authorization.k8s.io/v1/watch/rolebindingsò'æ +rbacAuthorization_v1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*7watchRbacAuthorizationV1RoleBindingListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsj -x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8group: discovery.k8s.io -kind: EndpointSlice + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +jd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -26467,32 +24896,16 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ì( -A/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolebindings†(ú -rbacAuthorization_v1beta1~watch individual changes to a list of ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*3watchRbacAuthorizationV1beta1ClusterRoleBindingList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jp -x-kubernetes-group-version-kindMKkind: ClusterRoleBinding -version: v1beta1 -group: rbac.authorization.k8s.io -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean É\ +"/apis/storage.k8s.io/v1/csidrivers¢\…& + +storage_v1'list or watch objects of kind CSIDriver*listStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -26500,52 +24913,78 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ê - /apis/apps/º· -appsget information of a group*getAppsAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.storage.v1.CSIDriverList  401  - UnauthorizedRhttpsý& -/apis/apps/v1/statefulsetsÞ&Ò -apps_v1)list or watch objects of kind StatefulSet*%listAppsV1StatefulSetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.apps.v1.StatefulSetList + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver +version: v1 +j +x-kubernetes-actionlist +"ô + +storage_v1create a CSIDriver*createStorageV1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.storage.v1.CSIDriverBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jê +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriver +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriver +F +202? += +Accepted1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriver  401  - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*version: v1 -group: apps -kind: StatefulSet + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver +version: v1 j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +x-kubernetes-actionpost +*Ï, + +storage_v1delete collection of CSIDriver*"deleteStorageV1CollectionCSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -26553,155 +24992,93 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü -/apis/authorization.k8s.io/v1/ÙÖ -authorization_v1get available resources*getAuthorizationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListRhttpsš -N/apis/authorization.k8s.io/v1/namespaces/{namespace}/localsubjectaccessreviewsÇ "× -authorization_v1!create a LocalSubjectAccessReview*7createAuthorizationV1NamespacedLocalSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX -V -Tbodybody *D -B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReviewJ© -[ -202T -R -AcceptedF -D -B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +jW +x-kubernetes-group-version-kind42version: v1 +group: storage.k8s.io +kind: CSIDriver +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string å +"/api/v1/namespaces/{name}/finalize¾ ø +core_v1+replace finalize of the specified Namespace*replaceCoreV1NamespaceFinalize2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.core.v1.NamespaceJœ += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Namespace +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.Namespace  401  - Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview -Z -201S -Q -CreatedF -D -B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReviewRhttpsj -x-kubernetes-actionpost -jl -x-kubernetes-group-version-kindIGgroup: authorization.k8s.io -kind: LocalSubjectAccessReview + UnauthorizedRhttpsj +x-kubernetes-actionput +jK +x-kubernetes-group-version-kind(&group: "" +kind: Namespace version: v1 Jž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string é -1/api/v1/namespaces/{namespace}/pods/{name}/status³Ù -core_v1 read status of the specified Pod*readCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JR -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod - -401 - - UnauthorizedRhttpsjE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -j -x-kubernetes-actionget -” -core_v1#replace status of the specified Pod* replaceCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: -8 -6bodybody *& -$#/definitions/io.k8s.api.core.v1.PodBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod -< -2015 -3 -Created( -& -$#/definitions/io.k8s.api.core.v1.Pod +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J6 +42"0pathname of the Namespace"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string È +/apis/½º +apisget available API versions*getAPIVersions2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJm +R +200K +I +OKC +A +?#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -BØ -core_v1,partially update status of the specified Pod*patchCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JR -7 -2000 -. -OK( -& -$#/definitions/io.k8s.api.core.v1.Pod + UnauthorizedRhttpsˆ* +U/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations/{name}®)× +admissionregistration_v1beta1Ãwatch changes to an object of kind MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*=watchAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsjE -x-kubernetes-group-version-kind" group: "" -kind: Pod -version: v1 -j -x-kubernetes-actionpatch -J0 -.,"*pathname of the Pod"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ƒ) -N/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations°(¤ -admissionregistration_v1beta1ˆwatch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*AwatchAdmissionregistrationV1beta1MutatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj} -x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj +x-kubernetes-actionwatch +j} +x-kubernetes-group-version-kindZXversion: v1beta1 +group: admissionregistration.k8s.io kind: MutatingWebhookConfiguration -version: v1beta1 -j# -x-kubernetes-action  -watchlist J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -26716,7 +25093,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JI +GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -26725,97 +25103,62 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean  -A/apis/batch/v1beta1/namespaces/{namespace}/cronjobs/{name}/statusɃ - batch_v1beta1$read status of the specified CronJob*'readBatchV1beta1NamespacedCronJobStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ - -401 - - Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobRhttpsj -x-kubernetes-actionget -jQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -Ò - batch_v1beta1'replace status of the specified CronJob**replaceBatchV1beta1NamespacedCronJobStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯ +:/apis/authorization.k8s.io/v1beta1/selfsubjectrulesreviewsð +"â +authorization_v1beta1create a SelfSubjectRulesReview*0createAuthorizationV1beta1SelfSubjectRulesReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B[ +Y +Wbodybody *G +E#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReviewJ² +X +200Q +O +OKI +G +E#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview +] +201V +T +CreatedI +G +E#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview +^ +202W +U +AcceptedI +G +E#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jQ -x-kubernetes-group-version-kind.,kind: CronJob + UnauthorizedRhttpsj +x-kubernetes-actionpost +jo +x-kubernetes-group-version-kindLJgroup: authorization.k8s.io +kind: SelfSubjectRulesReview version: v1beta1 -group: batch -B‚ - batch_v1beta10partially update status of the specified CronJob*(patchBatchV1beta1NamespacedCronJobStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string É( +8/apis/autoscaling/v2beta2/watch/horizontalpodautoscalersŒ(€ +autoscaling_v2beta2ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*BwatchAutoscalingV2beta2HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  Unauthorized -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJobRhttpsj -x-kubernetes-actionpatch -jQ -x-kubernetes-group-version-kind.,group: batch -kind: CronJob -version: v1beta1 -J4 -20".pathname of the CronJob"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string þ' -)/apis/coordination.k8s.io/v1/watch/leasesÐ'Ä -coordination_v1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*,watchCoordinationV1LeaseListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsjX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 -j# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# x-kubernetes-action  watchlist +jg +x-kubernetes-group-version-kindDBgroup: autoscaling +kind: HorizontalPodAutoscaler +version: v2beta2 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -26839,180 +25182,66 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean * -N/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/networkpolicies/{name}®)„ - networking_v1´watch changes to an object of kind NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*(watchNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¡ ++/apis/flowcontrol.apiserver.k8s.io/v1beta1/ñî +flowcontrolApiserver_v1beta1get available resources**getFlowcontrolApiserverV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -j^ -x-kubernetes-group-version-kind;9kind: NetworkPolicy -version: v1 -group: networking.k8s.io -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the NetworkPolicy"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ž' -(/apis/rbac.authorization.k8s.io/v1/rolesñ&å -rbacAuthorization_v1"list or watch objects of kind Role*+listRbacAuthorizationV1RoleForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JW -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.rbac.v1.RoleList + UnauthorizedRhttpsñ+ +R/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindings/{name}š+® +rbacAuthorization_v1beta1read the specified RoleBinding*1readRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8kind: Role -version: v1 + Unauthorized +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingRhttpsji +x-kubernetes-group-version-kindFDversion: v1beta1 group: rbac.authorization.k8s.io -j -x-kubernetes-actionlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¬( -5/apis/rbac.authorization.k8s.io/v1/watch/rolebindingsò'æ -rbacAuthorization_v1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*7watchRbacAuthorizationV1RoleBindingListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io kind: RoleBinding -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ì( -./api/v1/namespaces/{namespace}/services/{name}¹(Ù -core_v1read the specified Service*readCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service - -401 - - UnauthorizedRhttpsj +j x-kubernetes-actionget -jI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -œ -core_v1replace the specified Service*replaceCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.core.v1.ServiceBž +ƒ +rbacAuthorization_v1beta1!replace the specified RoleBinding*4replaceRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜ +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +I +201B @ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.core.v1.Service +Created5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding  401  - Unauthorized -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.ServiceRhttpsj + UnauthorizedRhttpsj x-kubernetes-actionput -jI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -*÷ -core_v1delete a Service*deleteCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 +*à +rbacAuthorization_v1beta1delete a RoleBinding*3deleteRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -27020,10 +25249,6 @@ Pbodybody*B áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ …‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» - -401 - - Unauthorized L 200E C @@ -27035,206 +25260,192 @@ R I Accepted= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 -j +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj x-kubernetes-action delete -BØ -core_v1&partially update the specified Service*patchCoreV1NamespacedService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 +B­ +rbacAuthorization_v1beta1*partially update the specified RoleBinding*2patchRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ +D +200= ; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.core.v1.Service +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding  401  - UnauthorizedRhttpsjI -x-kubernetes-group-version-kind&$group: "" -kind: Service -version: v1 + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding +version: v1beta1 j x-kubernetes-actionpatch -J4 -20".pathname of the Service"name*string˜J` +J8 +64"2pathname of the RoleBinding"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string †_ -0/apis/apiregistration.k8s.io/v1beta1/apiservicesÑ^Ó& -apiregistration_v1beta1(list or watch objects of kind APIService*$listApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‚ -g -200` -^ -OKX -V -T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceList +MKIquery-If 'true', then the output is pretty printed."pretty2string ™. +O/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations/{name}Å-… +admissionregistration_v1beta1/read the specified MutatingWebhookConfiguration*deleteAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L 200E C OK= ; 9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj* -x-kubernetes-actiondeletecollection -je -x-kubernetes-group-version-kindB@group: apiregistration.k8s.io + UnauthorizedRhttpsj +x-kubernetes-action delete +j} +x-kubernetes-group-version-kindZXversion: v1beta1 +group: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration +B„ +admissionregistration_v1beta1;partially update the specified MutatingWebhookConfiguration*=patchAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J +f +200_ +] +OKW +U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration + +401 + + UnauthorizedRhttpsj} +x-kubernetes-group-version-kindZXgroup: admissionregistration.k8s.io +kind: MutatingWebhookConfiguration version: v1beta1 -kind: APIService -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string œ) -;/apis/events.k8s.io/v1/namespaces/{namespace}/events/{name}Ü(â - events_v1read the specified Event*readEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.events.v1.Event +j +x-kubernetes-actionpatch +JI +GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string —+ +M/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}Å*š +rbacAuthorization_v1read the specified RoleBinding*,readRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding version: v1 j x-kubernetes-actionget -¥ - events_v1replace the specified Event*replaceEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.events.v1.EventBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜ +å +rbacAuthorization_v1!replace the specified RoleBinding*/replaceRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB @ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.events.v1.Event +>bodybody *. +,#/definitions/io.k8s.api.rbac.v1.RoleBindingBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding  401  - Unauthorized -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.events.v1.EventRhttpsj + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding +version: v1 +j x-kubernetes-actionput -jR -x-kubernetes-group-version-kind/-version: v1 -group: events.k8s.io -kind: Event -* - events_v1delete an Event*deleteEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*´ +rbacAuthorization_v1delete a RoleBinding*.deleteRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž @@ -27257,96 +25468,143 @@ R I Accepted= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjR -x-kubernetes-group-version-kind/-version: v1 -group: events.k8s.io -kind: Event +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding +version: v1 j x-kubernetes-action delete -Bá - events_v1$partially update the specified Event*patchEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +B™ +rbacAuthorization_v1*partially update the specified RoleBinding*-patchRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.events.v1.Event +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event + UnauthorizedRhttpsjd +x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io +kind: RoleBinding version: v1 -J2 -0.",pathname of the Event"name*string˜J` +j +x-kubernetes-actionpatch +J8 +64"2pathname of the RoleBinding"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ˜ -(/apis/rbac.authorization.k8s.io/v1beta1/ëè -rbacAuthorization_v1beta1get available resources*'getRbacAuthorizationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N +MKIquery-If 'true', then the output is pretty printed."pretty2string ì* +K/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/roles/{name}œ*’ +rbacAuthorization_v1beta1read the specified Role**readRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role + +401 + + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=kind: Role +version: v1beta1 +group: rbac.authorization.k8s.io +j +x-kubernetes-actionget +Ù +rbacAuthorization_v1beta1replace the specified Role*-replaceRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ +> +<bodybody *, +*#/definitions/io.k8s.api.rbac.v1beta1.RoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +*® +rbacAuthorization_v1beta1 delete a Role*,deleteRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttps¿( -,/api/v1/watch/namespaces/{namespace}/secretsŽ(  -core_v1rwatch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.*watchCoreV1NamespacedSecretList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +j +x-kubernetes-action delete +B‘ +rbacAuthorization_v1beta1#partially update the specified Role*+patchRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jH -x-kubernetes-group-version-kind%#group: "" -kind: Secret -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jb +x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io +kind: Role +version: v1beta1 +J1 +/-"+pathname of the Role"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ò) -:/api/v1/watch/namespaces/{namespace}/resourcequotas/{name}“)é -core_v1´watch changes to an object of kind ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchCoreV1NamespacedResourceQuota2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string þ' +-/apis/storage.k8s.io/v1beta1/watch/csidriversÌ'À +storage_v1beta1uwatch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.* watchStorageV1beta1CSIDriverList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -27356,12 +25614,13 @@ G  401  - UnauthorizedRhttpsjO -x-kubernetes-group-version-kind,*group: "" -kind: ResourceQuota -version: v1 -j -x-kubernetes-actionwatch + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j\ +x-kubernetes-group-version-kind97group: storage.k8s.io +kind: CSIDriver +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -27376,9 +25635,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: -86"4pathname of the ResourceQuota"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -27387,80 +25644,254 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à -G/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/approval”Ô -certificates_v18read approval of the specified CertificateSigningRequest*3readCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jp +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Õ+ +B/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings/{name}Ž+À +rbacAuthorization_v1beta1%read the specified ClusterRoleBinding*.readRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jf  401  Unauthorized -U -200N -L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestRhttpsj +K +200D +B +OK< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingRhttpsjp +x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1beta1 +j x-kubernetes-actionget -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -Ë -certificates_v1;replace approval of the specified CertificateSigningRequest*6replaceCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX -V -Tbodybody *D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÌ -U -200N +£ +rbacAuthorization_v1beta1(replace the specified ClusterRoleBinding*1replaceRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BN L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest -Z -201S -Q -CreatedF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +Jbodybody *: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¸ +P +201I +G +Created< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding  401  - UnauthorizedRhttpsj + Unauthorized +K +200D +B +OK< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingRhttpsj x-kubernetes-actionput -jl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1 -BÓ -certificates_v1Dpartially update approval of the specified CertificateSigningRequest*4patchCertificatesV1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jp +x-kubernetes-group-version-kindMKversion: v1beta1 +group: rbac.authorization.k8s.io +kind: ClusterRoleBinding +*Î +rbacAuthorization_v1beta1delete a ClusterRoleBinding*0deleteRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jp +x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1beta1 +B¿ +rbacAuthorization_v1beta11partially update the specified ClusterRoleBinding*/patchRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jp -U -200N +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jp +x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1beta1 +J? +=;"9pathname of the ClusterRoleBinding"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ‰ +;/api/v1/namespaces/{namespace}/resourcequotas/{name}/statusÉ +core_v1*read status of the specified ResourceQuota*'readCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jO +x-kubernetes-group-version-kind,*kind: ResourceQuota +version: v1 +group: "" +Ð +core_v1-replace status of the specified ResourceQuota**replaceCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.core.v1.ResourceQuotaBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota + +401 + + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*version: v1 +group: "" +kind: ResourceQuota +j +x-kubernetes-actionput +B€ +core_v16partially update status of the specified ResourceQuota*(patchCoreV1NamespacedResourceQuotaStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L -OKF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.core.v1.ResourceQuota  401  - UnauthorizedRhttpsjl -x-kubernetes-group-version-kindIGgroup: certificates.k8s.io -kind: CertificateSigningRequest + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jO +x-kubernetes-group-version-kind,*group: "" +kind: ResourceQuota version: v1 -j +J: +86"4pathname of the ResourceQuota"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string å +>/apis/apps/v1/namespaces/{namespace}/deployments/{name}/status¢÷ +apps_v1'read status of the specified Deployment*$readAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + UnauthorizedRhttpsjN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +j +x-kubernetes-actionget +À +apps_v1*replace status of the specified Deployment*'replaceAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BA +? +=bodybody *- ++#/definitions/io.k8s.api.apps.v1.DeploymentBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jž +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment +C +201< +: +Created/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jN +x-kubernetes-group-version-kind+)group: apps +kind: Deployment +version: v1 +Bö +apps_v13partially update status of the specified Deployment*%patchAppsV1NamespacedDeploymentStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment + +401 + + UnauthorizedRhttpsj x-kubernetes-actionpatch -JF -DB"@path%name of the CertificateSigningRequest"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string “( -//apis/networking.k8s.io/v1beta1/watch/ingressesß'Ó -networking_v1beta1swatch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.*1watchNetworkingV1beta1IngressListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +jN +x-kubernetes-group-version-kind+)kind: Deployment +version: v1 +group: apps +J7 +53"1pathname of the Deployment"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¨) +J/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalersÙ(ë +autoscaling_v1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*7watchAutoscalingV1NamespacedHorizontalPodAutoscalerList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -27470,10 +25901,10 @@ G  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8kind: Ingress -version: v1beta1 -group: networking.k8s.io + UnauthorizedRhttpsjb +x-kubernetes-group-version-kind?=group: autoscaling +kind: HorizontalPodAutoscaler +version: v1 j# x-kubernetes-action  watchlist @@ -27491,7 +25922,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -27500,33 +25932,111 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ô -/api/v1/ÇÄ -core_v1get available resources*getCoreV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean œ) +;/apis/events.k8s.io/v1/namespaces/{namespace}/events/{name}Ü(â + events_v1read the specified Event*readEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.events.v1.Event  401  - UnauthorizedRhttpsŒ -"/.well-known/openid-configuration/åâ - WellKnownWget service account issuer OpenID configuration, also known as the 'OIDC discovery doc'**getServiceAccountIssuerOpenIDConfiguration2application/jsonJ7 - -200 - -OK - ² -string + UnauthorizedRhttpsj +x-kubernetes-actionget +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event +version: v1 +¥ + events_v1replace the specified Event*replaceEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> +< +:bodybody ** +(#/definitions/io.k8s.api.events.v1.EventBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J˜  401  - UnauthorizedRhttpsº^ -?/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leasesö]§& -coordination_v1beta1#list or watch objects of kind Lease*&listCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ + Unauthorized +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.events.v1.Event +@ +2019 +7 +Created, +* +(#/definitions/io.k8s.api.events.v1.EventRhttpsj +x-kubernetes-actionput +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event +version: v1 +* + events_v1delete an Event*deleteEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj +x-kubernetes-action delete +jR +x-kubernetes-group-version-kind/-kind: Event +version: v1 +group: events.k8s.io +Bá + events_v1$partially update the specified Event*patchEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JV +; +2004 +2 +OK, +* +(#/definitions/io.k8s.api.events.v1.Event + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jR +x-kubernetes-group-version-kind/-group: events.k8s.io +kind: Event +version: v1 +J2 +0.",pathname of the Event"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ï] +:/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases°]“& +coordination_v1#list or watch objects of kind Lease*!listCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -27548,58 +26058,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J`  401  Unauthorized -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.coordination.v1beta1.LeaseListRhttpsj +E +200> +< +OK6 +4 +2#/definitions/io.k8s.api.coordination.v1.LeaseListRhttpsj x-kubernetes-actionlist -j] -x-kubernetes-group-version-kind:8group: coordination.k8s.io +jX +x-kubernetes-group-version-kind53version: v1 +group: coordination.k8s.io kind: Lease -version: v1beta1 -"¨ -coordination_v1beta1create a Lease*(createCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI -G -Ebodybody *5 -3#/definitions/io.k8s.api.coordination.v1beta1.LeaseBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.coordination.v1beta1.Lease -K -201D +"… +coordination_v1create a Lease*#createCoordinationV1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD B -Created7 -5 -3#/definitions/io.k8s.api.coordination.v1beta1.Lease -L -202E -C -Accepted7 -5 -3#/definitions/io.k8s.api.coordination.v1beta1.Lease +@bodybody *0 +.#/definitions/io.k8s.api.coordination.v1.LeaseBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jí  401  - UnauthorizedRhttpsj + Unauthorized +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.coordination.v1.Lease +G +202@ +> +Accepted2 +0 +.#/definitions/io.k8s.api.coordination.v1.LeaseRhttpsj x-kubernetes-actionpost -j] -x-kubernetes-group-version-kind:8group: coordination.k8s.io +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io kind: Lease -version: v1beta1 -*ë, -coordination_v1beta1delete collection of Lease*2deleteCoordinationV1beta1CollectionNamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +version: v1 +*Ü, +coordination_v1delete collection of Lease*-deleteCoordinationV1CollectionNamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -27636,220 +26146,273 @@ C  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: coordination.k8s.io -kind: Lease -version: v1beta1 -j* + UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection +jX +x-kubernetes-group-version-kind53group: coordination.k8s.io +kind: Lease +version: v1 J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string É) -0/apis/networking.k8s.io/v1/ingressclasses/{name}”)„ - networking_v1read the specified IngressClass*readNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass +MKIquery-If 'true', then the output is pretty printed."pretty2string È' +)/apis/policy/v1beta1/poddisruptionbudgetsš'Ž +policy_v1beta11list or watch objects of kind PodDisruptionBudget*4listPolicyV1beta1PodDisruptionBudgetForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jm +R +200K +I +OKC +A +?#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetList  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -j] -x-kubernetes-group-version-kind:8version: v1 -group: networking.k8s.io -kind: IngressClass -Ý - networking_v1"replace the specified IngressClass*replaceNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI + UnauthorizedRhttpsj +x-kubernetes-actionlist +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean €) +6/apis/storage.k8s.io/v1/watch/volumeattachments/{name}Å(ú + +storage_v1·watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I G -Ebodybody *5 -3#/definitions/io.k8s.api.networking.v1.IngressClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J® -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass -K -201D -B -Created7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsj] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment version: v1 -j -x-kubernetes-actionput -*˜ - networking_v1delete an IngressClass*deleteNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J= +;9"7pathname of the VolumeAttachment"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Þ +7/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path}¢› +core_v1$connect GET requests to proxy of Pod**connectCoreV1GetNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,version: v1 +group: "" +kind: PodProxyOptions +› +core_v1$connect PUT requests to proxy of Pod**connectCoreV1PutNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string + +401 + + UnauthorizedRhttpsjQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -Bƒ - networking_v1+partially update the specified IngressClass*patchNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ja -F -200? -= -OK7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClass +j! +x-kubernetes-action +connect +" +core_v1%connect POST requests to proxy of Pod*+connectCoreV1PostNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j] -x-kubernetes-group-version-kind:8group: networking.k8s.io -kind: IngressClass + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -J9 -75"3pathname of the IngressClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string À( -1/apis/batch/v1/namespaces/{namespace}/jobs/{name}Š(Ï -batch_v1read the specified Job*readBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.batch.v1.Job +*¡ +core_v1'connect DELETE requests to proxy of Pod*-connectCoreV1DeleteNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -Œ -batch_v1replace the specified Job*replaceBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.batch.v1.JobBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.batch.v1.Job -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.batch.v1.Job +2£ +core_v1(connect OPTIONS requests to proxy of Pod*.connectCoreV1OptionsNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#group: batch -kind: Job + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,kind: PodProxyOptions version: v1 -j -x-kubernetes-actionput -*ð -batch_v1 delete a Job*deleteBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +group: "" +: +core_v1%connect HEAD requests to proxy of Pod*+connectCoreV1HeadNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsjH -x-kubernetes-group-version-kind%#kind: Job + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -group: batch -j -x-kubernetes-action delete -BÎ -batch_v1"partially update the specified Job*patchBatchV1NamespacedJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS +BŸ +core_v1&connect PATCH requests to proxy of Pod*,connectCoreV1PatchNamespacedPodProxyWithPath2*/*:*/*J7 + +200 + +OK + ² +string  401  - Unauthorized -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.batch.v1.JobRhttpsj -x-kubernetes-actionpatch -jH -x-kubernetes-group-version-kind%#group: batch -kind: Job + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jQ +x-kubernetes-group-version-kind.,group: "" +kind: PodProxyOptions version: v1 -J0 -.,"*pathname of the Job"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ½^ -6/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas‚^É& -flowcontrolApiserver_v1beta1(list or watch objects of kind FlowSchema*)listFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +J< +:8"6pathname of the PodProxyOptions"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜J5 +31"/pathpath to the resource"path*string˜Ja +_][queryAPath is the URL path to use for the current proxy request to pod."path2string „' +/api/v1/serviceaccountsè&Ü +core_v1,list or watch objects of kind ServiceAccount*(listCoreV1ServiceAccountForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Ja +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.core.v1.ServiceAccountList + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+version: v1 +group: "" +kind: ServiceAccount +j +x-kubernetes-actionlist +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean º^ ++/apis/apiregistration.k8s.io/v1/apiservicesŠ^¾& +apiregistration_v1(list or watch objects of kind APIService*listApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -27871,58 +26434,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ji -N -200G -E -OK? -= -;#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J}  401  - UnauthorizedRhttpsjk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 + Unauthorized +b +200[ +Y +OKS +Q +O#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceListRhttpsj` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +version: v1 +kind: APIService j x-kubernetes-actionlist -"Ö -flowcontrolApiserver_v1beta1create a FlowSchema*+createFlowcontrolApiserverV1beta1FlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BM -K -Ibodybody *9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaBž +"ˆ + +apiregistration_v1create an APIService*!createApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ba +_ +]bodybody *M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jˆ -J -200C -A -OK; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema -O -201H -F -Created; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema -P -202I -G -Accepted; -9 -7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÄ +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService +c +201\ +Z +CreatedO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService +d +202] +[ +AcceptedO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jk -x-kubernetes-group-version-kindHFgroup: flowcontrol.apiserver.k8s.io -kind: FlowSchema -version: v1beta1 -*‰- -flowcontrolApiserver_v1beta1delete collection of FlowSchema*5deleteFlowcontrolApiserverV1beta1CollectionFlowSchema2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j` +x-kubernetes-group-version-kind=;kind: APIService +group: apiregistration.k8s.io +version: v1 +*ê, +apiregistration_v1delete collection of APIService*+deleteApiregistrationV1CollectionAPIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -27961,85 +26525,14 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jk -x-kubernetes-group-version-kindHFversion: v1beta1 -group: flowcontrol.apiserver.k8s.io -kind: FlowSchema -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string â -/api/v1/nodes/{name}/statusÂÓ -core_v1!read status of the specified Node*readCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS - -401 - - Unauthorized -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.NodeRhttpsj -x-kubernetes-actionget -jF -x-kubernetes-group-version-kind#!version: v1 -group: "" -kind: Node - -core_v1$replace status of the specified Node*replaceCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.core.v1.NodeBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.core.v1.Node - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node -version: v1 -BÒ -core_v1-partially update status of the specified Node*patchCoreV1NodeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io version: v1 -J1 -/-"+pathname of the Node"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¼, -C/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}ô+Ô -certificates_v1beta1,read the specified CertificateSigningRequest*0readCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju +kind: APIService +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string « +L/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}/approvalÚè +certificates_v1beta18read approval of the specified CertificateSigningRequest*8readCertificatesV1beta1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ju Z 200S Q @@ -28055,8 +26548,8 @@ kind: CertificateSigningRequest version: v1beta1 j x-kubernetes-actionget -Õ -certificates_v1beta1/replace the specified CertificateSigningRequest*3replaceCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] +é +certificates_v1beta1;replace approval of the specified CertificateSigningRequest*;replaceCertificatesV1beta1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B] [ Ybodybody *I G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestBž @@ -28083,38 +26576,8 @@ kind: CertificateSigningRequest version: v1beta1 j x-kubernetes-actionput -*Ó -certificates_v1beta1"delete a CertificateSigningRequest*2deleteCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -jq -x-kubernetes-group-version-kindNLgroup: certificates.k8s.io -kind: CertificateSigningRequest -version: v1beta1 -BÓ -certificates_v1beta18partially update the specified CertificateSigningRequest*1patchCertificatesV1beta1CertificateSigningRequest2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +Bç +certificates_v1beta1Dpartially update approval of the specified CertificateSigningRequest*9patchCertificatesV1beta1CertificateSigningRequestApproval2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž @@ -28133,270 +26596,36 @@ G#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest UnauthorizedRhttpsj x-kubernetes-actionpatch jq -x-kubernetes-group-version-kindNLgroup: certificates.k8s.io +x-kubernetes-group-version-kindNLversion: v1beta1 +group: certificates.k8s.io kind: CertificateSigningRequest -version: v1beta1 JF DB"@path%name of the CertificateSigningRequest"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ž -R/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers/{name}/statusÇÇ -autoscaling_v14read status of the specified HorizontalPodAutoscaler*8readAutoscalingV1NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jm -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -j -x-kubernetes-actionget -¸ -autoscaling_v17replace status of the specified HorizontalPodAutoscaler*;replaceAutoscalingV1NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BU -S -Qbodybody *A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÆ - -401 - - Unauthorized -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler -W -201P -N -CreatedC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerRhttpsjb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler -version: v1 -j -x-kubernetes-actionput -BÆ -autoscaling_v1@partially update status of the specified HorizontalPodAutoscaler*9patchAutoscalingV1NamespacedHorizontalPodAutoscalerStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jm -R -200K -I -OKC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler +MKIquery-If 'true', then the output is pretty printed."pretty2string ç( +2/apis/storage.k8s.io/v1beta1/watch/csinodes/{name}°(î +storage_v1beta1®watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  UnauthorizedRhttpsj -x-kubernetes-actionpatch -jb -x-kubernetes-group-version-kind?=version: v1 -group: autoscaling -kind: HorizontalPodAutoscaler -JD -B@">path#name of the HorizontalPodAutoscaler"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ü( -*/apis/node.k8s.io/v1/runtimeclasses/{name}­(ì -node_v1read the specified RuntimeClass*readNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionget -jW -x-kubernetes-group-version-kind42kind: RuntimeClass -version: v1 -group: node.k8s.io -¹ -node_v1"replace the specified RuntimeClass*replaceNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC -A -?bodybody */ --#/definitions/io.k8s.api.node.v1.RuntimeClassBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass -E -201> -< -Created1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionput -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -*… -node_v1delete a RuntimeClass*deleteNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj -x-kubernetes-action delete -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -Bë -node_v1+partially update the specified RuntimeClass*patchNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ - -401 - - Unauthorized -@ -2009 -7 -OK1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClassRhttpsj -x-kubernetes-actionpatch -jW -x-kubernetes-group-version-kind42group: node.k8s.io -kind: RuntimeClass -version: v1 -J9 -75"3pathname of the RuntimeClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¹^ -D/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolesð]«& -rbacAuthorization_v1beta1"list or watch objects of kind Role**listRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string BÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.rbac.v1beta1.RoleList - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -j -x-kubernetes-actionlist -"‘ -rbacAuthorization_v1beta1 create a Role*,createRbacAuthorizationV1beta1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.rbac.v1beta1.RoleBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Já -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.rbac.v1beta1.Role -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.rbac.v1beta1.Role -C -202< -: -Accepted. -, -*#/definitions/io.k8s.api.rbac.v1beta1.Role - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionpost -jb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role +x-kubernetes-actionwatch +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode version: v1beta1 -*ø, -rbacAuthorization_v1beta1delete collection of Role*6deleteRbacAuthorizationV1beta1CollectionNamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú ÷ ô @@ -28404,52 +26633,34 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the CSINode"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string BÚ +Defaults to unset"resourceVersion2string JÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Bž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsjb -x-kubernetes-group-version-kind?=group: rbac.authorization.k8s.io -kind: Role -version: v1beta1 -j* -x-kubernetes-actiondeletecollection -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ß( -4/api/v1/watch/namespaces/{namespace}/serviceaccounts¦(¸ -core_v1zwatch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.*'watchCoreV1NamespacedServiceAccountList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¯' +)/apis/networking.k8s.io/v1beta1/ingresses'õ +networking_v1beta1%list or watch objects of kind Ingress*,listNetworkingV1beta1IngressForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Je  401  Unauthorized -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsjP -x-kubernetes-group-version-kind-+group: "" -kind: ServiceAccount -version: v1 -j# -x-kubernetes-action  -watchlist +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.networking.v1beta1.IngressListRhttpsj +x-kubernetes-actionlist +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: Ingress +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -28464,8 +26675,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -28474,9 +26684,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ½) -5/api/v1/watch/namespaces/{namespace}/endpoints/{name}ƒ)Ý -core_v1°watch changes to an object of kind Endpoints. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean €* +H/apis/policy/v1/watch/namespaces/{namespace}/poddisruptionbudgets/{name}³)ƒ + policy_v1ºwatch changes to an object of kind PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.**watchPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -28486,12 +26696,12 @@ G  401  - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionwatch +jY +x-kubernetes-group-version-kind64version: v1 +group: policy +kind: PodDisruptionBudget J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -28506,8 +26716,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 -42"0pathname of the Endpoints"name*string˜J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J@ +><":pathname of the PodDisruptionBudget"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -28517,9 +26727,81 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‹) -P/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations¶(ª -admissionregistration_v1beta1Šwatch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*CwatchAdmissionregistrationV1beta1ValidatingWebhookConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Þ +N/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets/{name}/status‹· +policy_v1beta10read status of the specified PodDisruptionBudget*4readPolicyV1beta1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ji +N +200G +E +OK? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 +  +policy_v1beta13replace status of the specified PodDisruptionBudget*7replacePolicyV1beta1NamespacedPodDisruptionBudgetStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ +O +Mbodybody *= +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¾ +N +200G +E +OK? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget +S +201L +J +Created? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 +B¶ +policy_v1beta1<":pathname of the PodDisruptionBudget"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ’) +group: scheduling.k8s.io +kind: PriorityClass version: v1beta1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -28550,7 +26831,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J: +86"4pathname of the PriorityClass"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -28559,9 +26841,21 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¨) -J/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalersÙ(ë -autoscaling_v1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*7watchAutoscalingV1NamespacedHorizontalPodAutoscalerList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ +"/apis/coordination.k8s.io/v1beta1/áÞ +coordination_v1beta1get available resources*"getCoordinationV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsã) +H/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses/{name}–)ò + networking_v1®watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*"watchNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -28571,12 +26865,11 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jb -x-kubernetes-group-version-kind?=group: autoscaling -kind: HorizontalPodAutoscaler + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jX +x-kubernetes-group-version-kind53group: networking.k8s.io +kind: Ingress version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï @@ -28592,7 +26885,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J4 +20".pathname of the Ingress"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -28602,9 +26896,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ñ( -@/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases¬(¾ -coordination_v1qwatch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.*&watchCoordinationV1NamespacedLeaseList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Š) +G/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/networkpolicies¾(Ð + networking_v1ywatch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.*,watchNetworkingV1NamespacedNetworkPolicyList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -28614,13 +26908,13 @@ G  401  - UnauthorizedRhttpsj# + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9kind: NetworkPolicy +version: v1 +group: networking.k8s.io +j# x-kubernetes-action  watchlist -jX -x-kubernetes-group-version-kind53group: coordination.k8s.io -kind: Lease -version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -28645,236 +26939,93 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean °( -:/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolesñ'å -rbacAuthorization_v1beta1wwatch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.*,watchRbacAuthorizationV1beta1ClusterRoleList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsji -x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io -kind: ClusterRole -version: v1beta1 -j# -x-kubernetes-action  -watchlist -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean õ& -/api/v1/podtemplatesÜ&Ð -core_v1)list or watch objects of kind PodTemplate*%listCoreV1PodTemplateForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.core.v1.PodTemplateList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jM -x-kubernetes-group-version-kind*(kind: PodTemplate -version: v1 -group: "" -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean É( -8/apis/autoscaling/v2beta1/watch/horizontalpodautoscalersŒ(€ -autoscaling_v2beta1ƒwatch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.*BwatchAutoscalingV2beta1HorizontalPodAutoscalerListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‰ +#/apis/rbac.authorization.k8s.io/v1/áÞ +rbacAuthorization_v1get available resources*"getRbacAuthorizationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jg -x-kubernetes-group-version-kindDBgroup: autoscaling -kind: HorizontalPodAutoscaler -version: v2beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean —+ -M/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}Å*š -rbacAuthorization_v1read the specified RoleBinding*,readRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ -? -2008 -6 -OK0 + UnauthorizedRhttpsé +1/api/v1/namespaces/{namespace}/pods/{name}/status³Ù +core_v1 read status of the specified Pod*readCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JR +7 +2000 . -,#/definitions/io.k8s.api.rbac.v1.RoleBinding +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod  401  - UnauthorizedRhttpsjd -x-kubernetes-group-version-kindA?version: v1 -group: rbac.authorization.k8s.io -kind: RoleBinding -j + UnauthorizedRhttpsj x-kubernetes-actionget -å -rbacAuthorization_v1!replace the specified RoleBinding*/replaceRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.rbac.v1.RoleBindingBž +jE +x-kubernetes-group-version-kind" group: "" +kind: Pod +version: v1 +” +core_v1#replace status of the specified Pod* replaceCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B: +8 +6bodybody *& +$#/definitions/io.k8s.api.core.v1.PodBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  - -401 - - Unauthorized -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.RoleBinding -D -201= -; -Created0 +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J +7 +2000 . -,#/definitions/io.k8s.api.rbac.v1.RoleBindingRhttpsj -x-kubernetes-actionput -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding -version: v1 -*´ -rbacAuthorization_v1delete a RoleBinding*.deleteRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod +< +2015 +3 +Created( +& +$#/definitions/io.k8s.api.core.v1.Pod  401  - Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj -x-kubernetes-action delete -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding -version: v1 -B™ -rbacAuthorization_v1*partially update the specified RoleBinding*-patchRbacAuthorizationV1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN + UnauthorizedRhttpsj +x-kubernetes-actionput +jE +x-kubernetes-group-version-kind" version: v1 +group: "" +kind: Pod +BØ +core_v1,partially update status of the specified Pod*patchCoreV1NamespacedPodStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ -? -2008 -6 -OK0 +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JR +7 +2000 . -,#/definitions/io.k8s.api.rbac.v1.RoleBinding +OK( +& +$#/definitions/io.k8s.api.core.v1.Pod  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: RoleBinding + UnauthorizedRhttpsjE +x-kubernetes-group-version-kind" kind: Pod version: v1 -J8 -64"2pathname of the RoleBinding"name*string˜J` +group: "" +j +x-kubernetes-actionpatch +J0 +.,"*pathname of the Pod"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string È' -/api/v1/watch/events¯'£ -core_v1qwatch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.*$watchCoreV1EventListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +MKIquery-If 'true', then the output is pretty printed."pretty2string ì' +/api/v1/watch/serviceaccountsÊ'¾ +core_v1zwatch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.*-watchCoreV1ServiceAccountListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -28887,10 +27038,10 @@ G UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jG -x-kubernetes-group-version-kind$"group: "" -kind: Event +jP +x-kubernetes-group-version-kind-+kind: ServiceAccount version: v1 +group: "" J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -28914,32 +27065,15 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ë( -//api/v1/watch/namespaces/{namespace}/configmaps—(© -core_v1uwatch individual changes to a list of ConfigMap. deprecated: use the 'watch' parameter with a list operation instead.*"watchCoreV1NamespacedConfigMapList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jK -x-kubernetes-group-version-kind(&group: "" -kind: ConfigMap -version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean µ] +1/apis/apps/v1/namespaces/{namespace}/statefulsetsÿ\„& +apps_v1)list or watch objects of kind StatefulSet*listAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -28947,95 +27081,76 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¡ -+/apis/flowcontrol.apiserver.k8s.io/v1beta1/ñî -flowcontrolApiserver_v1beta1get available resources**getFlowcontrolApiserverV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.apps.v1.StatefulSetList  401  - UnauthorizedRhttpsÿ' -./apis/node.k8s.io/v1beta1/watch/runtimeclassesÌ'À - node_v1beta1xwatch individual changes to a list of RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead.* watchNodeV1beta1RuntimeClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + UnauthorizedRhttpsj +x-kubernetes-actionlist +jO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet +version: v1 +"ð +apps_v1create a StatefulSet*!createAppsV1NamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB +@ +>bodybody *. +,#/definitions/io.k8s.api.apps.v1.StatefulSetBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -j\ -x-kubernetes-group-version-kind97group: node.k8s.io -kind: RuntimeClass -version: v1beta1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean á& -/api/v1/servicesÌ&À -core_v1%list or watch objects of kind Service*!listCoreV1ServiceForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JZ + Unauthorized ? 2008 6 OK0 . -,#/definitions/io.k8s.api.core.v1.ServiceList - -401 - - UnauthorizedRhttpsj -x-kubernetes-actionlist -jI -x-kubernetes-group-version-kind&$kind: Service +,#/definitions/io.k8s.api.apps.v1.StatefulSet +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet +E +202> +< +Accepted0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSetRhttpsj +x-kubernetes-actionpost +jO +x-kubernetes-group-version-kind,*group: apps +kind: StatefulSet version: v1 -group: "" -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +*Ï, +apps_v1 delete collection of StatefulSet*+deleteAppsV1CollectionNamespacedStatefulSet2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -29043,30 +27158,48 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean à -/apis/discovery.k8s.io/ÄÁ - discoveryget information of a group*getDiscoveryAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsù( -L/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations¨(œ -flowcontrolApiserver_v1beta1†watch individual changes to a list of PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead.*>watchFlowcontrolApiserverV1beta1PriorityLevelConfigurationList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsjO +x-kubernetes-group-version-kind,*kind: StatefulSet +version: v1 +group: apps +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string þ +/apis/autoscaling/v2beta2/ßÜ +autoscaling_v2beta2get available resources*!getAutoscalingV2beta2APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttps¨* +X/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindings/{name}Ë)£ +rbacAuthorization_v1beta1²watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*2watchRbacAuthorizationV1beta1NamespacedRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -29076,13 +27209,12 @@ G  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -j{ -x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io -kind: PriorityLevelConfiguration + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: RoleBinding version: v1beta1 +j +x-kubernetes-actionwatch J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -29097,7 +27229,9 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 +64"2pathname of the RoleBinding"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -29106,9 +27240,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À( -:/apis/rbac.authorization.k8s.io/v1beta1/watch/rolebindings(õ -rbacAuthorization_v1beta1wwatch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.*< +logs*logFileListHandlerJ + +401 + + UnauthorizedRhttpsÿ+ +O/apis/storage.k8s.io/v1beta1/namespaces/{namespace}/csistoragecapacities/{name}«+® +storage_v1beta1%read the specified CSIStorageCapacity*.readStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ji N 200G E OK? = -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity  401  - UnauthorizedRhttpsá -//api/v1/namespaces/{namespace}/pods/{name}/exec­  -core_v1#connect GET requests to exec of Pod*!connectCoreV1GetNamespacedPodExec2*/*:*/*J7 - -200 - -OK - ² -string + UnauthorizedRhttpsj +x-kubernetes-actionget +je +x-kubernetes-group-version-kindB@group: storage.k8s.io +kind: CSIStorageCapacity +version: v1beta1 +— +storage_v1beta1(replace the specified CSIStorageCapacity*1replaceStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BQ +O +Mbodybody *= +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¾ +N +200G +E +OK? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity +S +201L +J +Created? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jP -x-kubernetes-group-version-kind-+group: "" -kind: PodExecOptions -version: v1 -"’ -core_v1$connect POST requests to exec of Pod*"connectCoreV1PostNamespacedPodExec2*/*:*/*J7 - -200 - -OK - ² -string + UnauthorizedRhttpsj +x-kubernetes-actionput +je +x-kubernetes-group-version-kindB@kind: CSIStorageCapacity +version: v1beta1 +group: storage.k8s.io +*¹ +storage_v1beta1delete a CSIStorageCapacity*0deleteStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jP -x-kubernetes-group-version-kind-+kind: PodExecOptions -version: v1 -group: "" -Ju -sqoqueryRCommand is the remote command to execute. argv array. Not executed within a shell."command2string J˜ -•’querypContainer in which to execute the command. Defaults to only container if there is only one container in the pod." container2string J; -97"5pathname of the PodExecOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜Jq -omkqueryNRedirect the standard error stream of the pod for this call. Defaults to true."stderr2boolean Jq -omkqueryORedirect the standard input stream of the pod for this call. Defaults to false."stdin2boolean Jr -pnlqueryORedirect the standard output stream of the pod for this call. Defaults to true."stdout2boolean Jx -vtrqueryXTTY if true indicates that a tty will be allocated for the exec call. Defaults to false."tty2boolean €) -6/apis/storage.k8s.io/v1/watch/volumeattachments/{name}Å(ú - -storage_v1·watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + UnauthorizedRhttpsj +x-kubernetes-action delete +je +x-kubernetes-group-version-kindB@version: v1beta1 +group: storage.k8s.io +kind: CSIStorageCapacity +B­ +storage_v1beta11partially update the specified CSIStorageCapacity*/patchStorageV1beta1NamespacedCSIStorageCapacity2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Ji +N +200G +E +OK? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacity  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: storage.k8s.io -kind: VolumeAttachment -version: v1 + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@version: v1beta1 +group: storage.k8s.io +kind: CSIStorageCapacity j -x-kubernetes-actionwatch -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï -ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". - -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú - -÷ -ô -ñ -queryÔ -limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. - -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J= -;9"7pathname of the VolumeAttachment"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû -øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersion2string JÚ -×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. - -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ×` -E/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations`’' -admissionregistration_v1 +Created3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount +H +202A +? +Accepted3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount  401  UnauthorizedRhttpsj x-kubernetes-actionpost -jz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration +jP +x-kubernetes-group-version-kind-+kind: ServiceAccount version: v1 -*¸- -admissionregistration_v13delete collection of ValidatingWebhookConfiguration*EdeleteAdmissionregistrationV1CollectionValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +group: "" +*Ö, +core_v1#delete collection of ServiceAccount*.deleteCoreV1CollectionNamespacedServiceAccount2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -29363,163 +27504,150 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration +jP +x-kubernetes-group-version-kind-+group: "" +kind: ServiceAccount version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ¿. -Q/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurations/{name}é- -admissionregistration_v1beta11read the specified ValidatingWebhookConfiguration*>readAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jƒ -h -200a -_ -OKY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Á +/api/v1/nodes/{name}/proxy¢Œ +core_v1%connect GET requests to proxy of Node*connectCoreV1GetNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionget -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 -© - -admissionregistration_v1beta14replace the specified ValidatingWebhookConfiguration*AreplaceAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bk -i -gbodybody *W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jò -m -201f -d -CreatedY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-kind: NodeProxyOptions +version: v1 +group: "" +Œ +core_v1%connect PUT requests to proxy of Node*connectCoreV1PutNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - Unauthorized -h -200a -_ -OKY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationRhttpsj -x-kubernetes-actionput -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 -*ý -admissionregistration_v1beta1'delete a ValidatingWebhookConfiguration*@deleteAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +"Ž +core_v1&connect POST requests to proxy of Node*connectCoreV1PostNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -j -x-kubernetes-group-version-kind\Zversion: v1beta1 -group: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -BŒ -admissionregistration_v1beta1=partially update the specified ValidatingWebhookConfiguration*?patchAdmissionregistrationV1beta1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jƒ -h -200a -_ -OKY -W -U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration + UnauthorizedRhttpsj! +x-kubernetes-action +connect +jR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +*’ +core_v1(connect DELETE requests to proxy of Node*connectCoreV1DeleteNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -j -x-kubernetes-group-version-kind\Zgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1beta1 -JK -IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string þ -/apis/autoscaling/v2beta2/ßÜ -autoscaling_v2beta2get available resources*!getAutoscalingV2beta2APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +j! +x-kubernetes-action +connect +2” +core_v1)connect OPTIONS requests to proxy of Node*connectCoreV1OptionsNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsé -/apis/coordination.k8s.io/ÊÇ - coordinationget information of a group*getCoordinationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +j! +x-kubernetes-action +connect +:Ž +core_v1&connect HEAD requests to proxy of Node*connectCoreV1HeadNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - Unauthorized -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupRhttpsÊ( -./api/v1/watch/namespaces/{namespace}/endpoints—(© -core_v1uwatch individual changes to a list of Endpoints. deprecated: use the 'watch' parameter with a list operation instead.*"watchCoreV1NamespacedEndpointsList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-group: "" +kind: NodeProxyOptions +version: v1 +j! +x-kubernetes-action +connect +B +core_v1'connect PATCH requests to proxy of Node*connectCoreV1PatchNodeProxy2*/*:*/*J7 + +200 + +OK + ² +string  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jK -x-kubernetes-group-version-kind(&group: "" -kind: Endpoints + UnauthorizedRhttpsjR +x-kubernetes-group-version-kind/-kind: NodeProxyOptions version: v1 -J‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +group: "" +j! +x-kubernetes-action +connect +J= +;9"7pathname of the NodeProxyOptions"name*string˜Jb +`^\queryBPath is the URL path to use for the current proxy request to node."path2string ­` +F/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurationsâ_‰' +flowcontrolApiserver_v1beta18list or watch objects of kind PriorityLevelConfiguration*9listFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ -„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ -„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú ÷ ô @@ -29527,134 +27655,113 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersion2string JÚ +Defaults to unset"resourceVersion2string BÚ ×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to unset"resourceVersionMatch2string Jž -›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ä - -<bodybody *, -*#/definitions/io.k8s.api.core.v1.NamespaceJœ -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Namespace + UnauthorizedRhttpsj +x-kubernetes-actionpost +j{ +x-kubernetes-group-version-kindXVversion: v1beta1 +group: flowcontrol.apiserver.k8s.io +kind: PriorityLevelConfiguration +*¹- +flowcontrolApiserver_v1beta1/delete collection of PriorityLevelConfiguration*EdeleteFlowcontrolApiserverV1beta1CollectionPriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsj -x-kubernetes-actionput -jK -x-kubernetes-group-version-kind(&kind: Namespace -version: v1 -group: "" -Jž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J6 -42"0pathname of the Namespace"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string þ) -R/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations/{name}§)Î -admissionregistration_v1Åwatch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*:watchAdmissionregistrationV1ValidatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsj* +x-kubernetes-actiondeletecollection +j{ +x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io +kind: PriorityLevelConfiguration +version: v1beta1 +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¤( +//apis/policy/v1beta1/watch/poddisruptionbudgetsð'ä +policy_v1beta1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*9watchPolicyV1beta1PodDisruptionBudgetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -29664,12 +27771,13 @@ G  401  - UnauthorizedRhttpsj -x-kubernetes-actionwatch -jz -x-kubernetes-group-version-kindWUgroup: admissionregistration.k8s.io -kind: ValidatingWebhookConfiguration -version: v1 + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j^ +x-kubernetes-group-version-kind;9group: policy +kind: PodDisruptionBudget +version: v1beta1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -29684,8 +27792,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JK -IG"Epath*name of the ValidatingWebhookConfiguration"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -29694,9 +27801,129 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ˆ* -U/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations/{name}®)× -admissionregistration_v1beta1Ãwatch changes to an object of kind MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*=watchAdmissionregistrationV1beta1MutatingWebhookConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean î] +?/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolesª]—& +rbacAuthorization_v1"list or watch objects of kind Role*%listRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JW + +401 + + Unauthorized +< +2005 +3 +OK- ++ +)#/definitions/io.k8s.api.rbac.v1.RoleListRhttpsj] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role +version: v1 +j +x-kubernetes-actionlist +"î +rbacAuthorization_v1 create a Role*'createRbacAuthorizationV1NamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.rbac.v1.RoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÒ + +401 + + Unauthorized +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.rbac.v1.Role += +2016 +4 +Created) +' +%#/definitions/io.k8s.api.rbac.v1.Role +> +2027 +5 +Accepted) +' +%#/definitions/io.k8s.api.rbac.v1.RoleRhttpsj +x-kubernetes-actionpost +j] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role +version: v1 +*é, +rbacAuthorization_v1delete collection of Role*1deleteRbacAuthorizationV1CollectionNamespacedRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: rbac.authorization.k8s.io +kind: Role +version: v1 +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ’( +./apis/discovery.k8s.io/v1/watch/endpointslicesß'Ó + discovery_v1ywatch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.*1watchDiscoveryV1EndpointSliceListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -29706,12 +27933,13 @@ G  401  - UnauthorizedRhttpsj} -x-kubernetes-group-version-kindZXversion: v1beta1 -group: admissionregistration.k8s.io -kind: MutatingWebhookConfiguration -j -x-kubernetes-actionwatch + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j] +x-kubernetes-group-version-kind:8group: discovery.k8s.io +kind: EndpointSlice +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -29726,8 +27954,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JI -GE"Cpath(name of the MutatingWebhookConfiguration"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -29736,21 +27963,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ü -/apis/apiextensions.k8s.io/v1/ÙÖ -apiextensions_v1get available resources*getApiextensionsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp -U -200N -L -OKF -D -B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList - -401 - - UnauthorizedRhttps–] -4/apis/events.k8s.io/v1/namespaces/{namespace}/eventsÝ\û% - events_v1#list or watch objects of kind Event*listEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ¥] +)/apis/networking.k8s.io/v1/ingressclasses÷\& + networking_v1*list or watch objects of kind IngressClass*listNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -29772,58 +27987,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JZ -? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.events.v1.EventList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.networking.v1.IngressClassList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -jR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass version: v1 -"Ü - events_v1create an Event*createEventsV1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B> -< -:bodybody ** -(#/definitions/io.k8s.api.events.v1.EventBž +"Ÿ + networking_v1create an IngressClass*createNetworkingV1IngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.networking.v1.IngressClassBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÛ -; -2004 -2 -OK, -* -(#/definitions/io.k8s.api.events.v1.Event -@ -2019 -7 -Created, -* -(#/definitions/io.k8s.api.events.v1.Event -A -202: -8 -Accepted, -* -(#/definitions/io.k8s.api.events.v1.Event +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +F +200? += +OK7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass +L +202E +C +Accepted7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClass  401  - UnauthorizedRhttpsj -x-kubernetes-actionpost -jR -x-kubernetes-group-version-kind/-group: events.k8s.io -kind: Event + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass version: v1 -*Ê, - events_v1delete collection of Event*'deleteEventsV1CollectionNamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j +x-kubernetes-actionpost +*á, + networking_v1!delete collection of IngressClass*(deleteNetworkingV1CollectionIngressClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -29860,240 +28075,236 @@ C  401  - UnauthorizedRhttpsj* + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass +version: v1 +j* x-kubernetes-actiondeletecollection -jR -x-kubernetes-group-version-kind/-version: v1 -group: events.k8s.io -kind: Event -J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‹* -B/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses/{name}Ä)ú - networking_v1read the specified Ingress*!readNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress +JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ž) +2/api/v1/namespaces/{namespace}/podtemplates/{name}ç(é +core_v1read the specified PodTemplate*readCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate  401  UnauthorizedRhttpsj x-kubernetes-actionget -jX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 -É - networking_v1replace the specified Ingress*$replaceNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD -B -@bodybody *0 -.#/definitions/io.k8s.api.networking.v1.IngressBž +jM +x-kubernetes-group-version-kind*(version: v1 +group: "" +kind: PodTemplate +´ +core_v1!replace the specified PodTemplate*"replaceCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB +@ +>bodybody *. +,#/definitions/io.k8s.api.core.v1.PodTemplateBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress -F -201? -= -Created2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J  +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate +D +201= +; +Created0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate  401  UnauthorizedRhttpsj x-kubernetes-actionput -jX -x-kubernetes-group-version-kind53version: v1 -group: networking.k8s.io -kind: Ingress -*“ - networking_v1delete an Ingress*#deleteNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jM +x-kubernetes-group-version-kind*(group: "" +kind: PodTemplate +version: v1 +*é +core_v1delete a PodTemplate*!deleteCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J¡ +E +202> +< +Accepted0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate  401  Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 -j +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplateRhttpsj x-kubernetes-action delete -Bù - networking_v1&partially update the specified Ingress*"patchNetworkingV1NamespacedIngress2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jM +x-kubernetes-group-version-kind*(group: "" +kind: PodTemplate +version: v1 +Bè +core_v1*partially update the specified PodTemplate* patchCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ -A -200: -8 -OK2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JZ +? +2008 +6 +OK0 +. +,#/definitions/io.k8s.api.core.v1.PodTemplate  401  - UnauthorizedRhttpsj + UnauthorizedRhttpsjM +x-kubernetes-group-version-kind*(version: v1 +group: "" +kind: PodTemplate +j x-kubernetes-actionpatch -jX -x-kubernetes-group-version-kind53group: networking.k8s.io -kind: Ingress -version: v1 -J4 -20".pathname of the Ingress"name*string˜J` +J8 +64"2pathname of the PodTemplate"name*string˜J` ^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string €) --/apis/storage.k8s.io/v1/storageclasses/{name}Î(ø - -storage_v1read the specified StorageClass*readStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J^ -C -200< +MKIquery-If 'true', then the output is pretty printed."pretty2string Ù( +-/api/v1/namespaces/{namespace}/secrets/{name}§(Õ +core_v1read the specified Secret*readCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JU : -OK4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +2003 +1 +OK+ +) +'#/definitions/io.k8s.api.core.v1.Secret  401  UnauthorizedRhttpsj x-kubernetes-actionget -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass +jH +x-kubernetes-group-version-kind%#kind: Secret version: v1 -Ë - -storage_v1"replace the specified StorageClass*replaceStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF -D -Bbodybody *2 -0#/definitions/io.k8s.api.storage.v1.StorageClassBž +group: "" +– +core_v1replace the specified Secret*replaceCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B= +; +9bodybody *) +'#/definitions/io.k8s.api.core.v1.SecretBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¨ -C -200< +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J– : -OK4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass -H -201A +2003 +1 +OK+ +) +'#/definitions/io.k8s.api.core.v1.Secret ? -Created4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +2018 +6 +Created+ +) +'#/definitions/io.k8s.api.core.v1.Secret  401  - UnauthorizedRhttpsjZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionput -*ü - -storage_v1delete a StorageClass*deleteStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret +version: v1 +*ô +core_v1delete a Secret*deleteCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J© +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K I -202B -@ -Accepted4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  UnauthorizedRhttpsj x-kubernetes-action delete -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass -version: v1 -B÷ - -storage_v1+partially update the specified StorageClass*patchStorageV1StorageClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +jH +x-kubernetes-group-version-kind%#version: v1 +group: "" +kind: Secret +BÔ +core_v1%partially update the specified Secret*patchCoreV1NamespacedSecret2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN L Jbodybody *: 8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ ¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J^ -C -200< +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JU : -OK4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass +2003 +1 +OK+ +) +'#/definitions/io.k8s.api.core.v1.Secret  401  UnauthorizedRhttpsj x-kubernetes-actionpatch -jZ -x-kubernetes-group-version-kind75group: storage.k8s.io -kind: StorageClass +jH +x-kubernetes-group-version-kind%#group: "" +kind: Secret version: v1 -J9 -75"3pathname of the StorageClass"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Ó( -1/api/v1/watch/namespaces/{namespace}/podtemplates(¯ -core_v1wwatch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.*$watchCoreV1NamespacedPodTemplateList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk - -401 - - Unauthorized +J3 +1/"-pathname of the Secret"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ‰( +$/api/v1/watch/persistentvolumeclaimsà'Ô +core_v1watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.*4watchCoreV1PersistentVolumeClaimListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# x-kubernetes-action  watchlist -jM -x-kubernetes-group-version-kind*(kind: PodTemplate +jW +x-kubernetes-group-version-kind42group: "" +kind: PersistentVolumeClaim version: v1 -group: "" J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30108,8 +28319,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -30118,25 +28328,95 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ƒ) -A/apis/policy/v1/watch/namespaces/{namespace}/poddisruptionbudgets½(Ï - policy_v1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*.watchPolicyV1NamespacedPodDisruptionBudgetList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ã +>/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}/status€É +apiregistration_v1beta1'read status of the specified APIService**readApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J~ +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService  401  - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -jY -x-kubernetes-group-version-kind64group: policy -kind: PodDisruptionBudget + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io +version: v1beta1 +kind: APIService +j +x-kubernetes-actionget +Ü +apiregistration_v1beta1*replace status of the specified APIService*-replaceApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bf +d +bbodybody *R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jè +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService +h +201a +_ +CreatedT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService + +401 + + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io +version: v1beta1 +kind: APIService +j +x-kubernetes-actionput +BÈ +apiregistration_v1beta13partially update status of the specified APIService*+patchApiregistrationV1beta1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J~ +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService + +401 + + UnauthorizedRhttpsje +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io +version: v1beta1 +kind: APIService +j +x-kubernetes-actionpatch +J7 +53"1pathname of the APIService"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ü& +/api/v1/secretsÈ&¼ +core_v1$list or watch objects of kind Secret* listCoreV1SecretForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*JY +> +2007 +5 +OK/ +- ++#/definitions/io.k8s.api.core.v1.SecretList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jH +x-kubernetes-group-version-kind%#kind: Secret version: v1 +group: "" J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30151,8 +28431,7 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -30161,9 +28440,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ©[ - /api/v1/nodes—[Ü% -core_v1"list or watch objects of kind Node*listCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Ê^ +A/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies„^«& + networking_v1+list or watch objects of kind NetworkPolicy*'listNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30185,58 +28464,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean JW -< -2005 -3 -OK- -+ -)#/definitions/io.k8s.api.core.v1.NodeList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jf +K +200D +B +OK< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyList  401  - UnauthorizedRhttpsjF -x-kubernetes-group-version-kind#!group: "" -kind: Node -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionlist -"³ -core_v1 create a Node*createCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; -9 -7bodybody *' -%#/definitions/io.k8s.api.core.v1.NodeBž +j^ +x-kubernetes-group-version-kind;9kind: NetworkPolicy +version: v1 +group: networking.k8s.io +"¯ + networking_v1create a NetworkPolicy*)createNetworkingV1NamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicyBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÒ -8 -2001 -/ -OK) -' -%#/definitions/io.k8s.api.core.v1.Node -= -2016 -4 -Created) -' -%#/definitions/io.k8s.api.core.v1.Node +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jÿ +G +200@ > -2027 -5 -Accepted) -' -%#/definitions/io.k8s.api.core.v1.Node +OK8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy +M +202F +D +Accepted8 +6 +4#/definitions/io.k8s.api.networking.v1.NetworkPolicy  401  - UnauthorizedRhttpsjF -x-kubernetes-group-version-kind#!group: "" -kind: Node -version: v1 -j + UnauthorizedRhttpsj x-kubernetes-actionpost -*®, -core_v1delete collection of Node*deleteCoreV1CollectionNode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +j^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy +version: v1 +*î, + networking_v1"delete collection of NetworkPolicy*3deleteNetworkingV1CollectionNamespacedNetworkPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -30264,170 +28543,318 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg - -401 - - Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* -x-kubernetes-actiondeletecollection -jF -x-kubernetes-group-version-kind#!group: "" -kind: Node -version: v1 -JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Á -/api/v1/nodes/{name}/proxy¢Œ -core_v1%connect GET requests to proxy of Node*connectCoreV1GetNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions + UnauthorizedRhttpsj^ +x-kubernetes-group-version-kind;9group: networking.k8s.io +kind: NetworkPolicy version: v1 -j! -x-kubernetes-action -connect -Œ -core_v1%connect PUT requests to proxy of Node*connectCoreV1PutNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¢ +'/api/v1/persistentvolumes/{name}/statusöƒ +core_v1-read status of the specified PersistentVolume* readCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect + UnauthorizedRhttpsj +x-kubernetes-actionget jR x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions +kind: PersistentVolume version: v1 -"Ž -core_v1&connect POST requests to proxy of Node*connectCoreV1PostNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string - -401 - - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-version: v1 -group: "" -kind: NodeProxyOptions -j! -x-kubernetes-action -connect -*’ -core_v1(connect DELETE requests to proxy of Node*connectCoreV1DeleteNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +Ø +core_v10replace status of the specified PersistentVolume*#replaceCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.core.v1.PersistentVolumeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  UnauthorizedRhttpsjR x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions +kind: PersistentVolume version: v1 -j! -x-kubernetes-action -connect -2” -core_v1)connect OPTIONS requests to proxy of Node*connectCoreV1OptionsNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +j +x-kubernetes-actionput +B‚ +core_v19partially update status of the specified PersistentVolume*!patchCoreV1PersistentVolumeStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jR +x-kubernetes-group-version-kind/-kind: PersistentVolume version: v1 -j! -x-kubernetes-action -connect -:Ž -core_v1&connect HEAD requests to proxy of Node*connectCoreV1HeadNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +group: "" +J= +;9"7pathname of the PersistentVolume"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ð* +;/apis/rbac.authorization.k8s.io/v1beta1/clusterroles/{name}*¤ +rbacAuthorization_v1beta1read the specified ClusterRole*'readRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J_  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jR -x-kubernetes-group-version-kind/-group: "" -kind: NodeProxyOptions + Unauthorized +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleRhttpsj +x-kubernetes-actionget +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole +version: v1beta1 +ù +rbacAuthorization_v1beta1!replace the specified ClusterRole**replaceRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BG +E +Cbodybody *3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jª +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole +I +201B +@ +Created5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole +version: v1beta1 +*¹ +rbacAuthorization_v1beta1delete a ClusterRole*)deleteRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +ji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole +version: v1beta1 +B£ +rbacAuthorization_v1beta1*partially update the specified ClusterRole*(patchRbacAuthorizationV1beta1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole + +401 + + UnauthorizedRhttpsji +x-kubernetes-group-version-kindFDgroup: rbac.authorization.k8s.io +kind: ClusterRole +version: v1beta1 +j +x-kubernetes-actionpatch +J8 +64"2pathname of the ClusterRole"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ó) +0/apis/storage.k8s.io/v1/volumeattachments/{name}ž)ˆ + +storage_v1#read the specified VolumeAttachment*readStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jb + +401 + + Unauthorized +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentRhttpsj^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment version: v1 -B -core_v1'connect PATCH requests to proxy of Node*connectCoreV1PatchNodeProxy2*/*:*/*J7 - -200 - -OK - ² -string +j +x-kubernetes-actionget +ã + +storage_v1&replace the specified VolumeAttachment* replaceStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BJ +H +Fbodybody *6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J° +L +201E +C +Created8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsjR -x-kubernetes-group-version-kind/-kind: NodeProxyOptions + Unauthorized +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachmentRhttpsj +x-kubernetes-actionput +j^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment version: v1 -group: "" -j! -x-kubernetes-action -connect -J= -;9"7pathname of the NodeProxyOptions"name*string˜Jb -`^\queryBPath is the URL path to use for the current proxy request to node."path2string ¤( -//apis/policy/v1beta1/watch/poddisruptionbudgetsð'ä -policy_v1beta1watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.*9watchPolicyV1beta1PodDisruptionBudgetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk -P -200I +* + +storage_v1delete a VolumeAttachment*deleteStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J± G -OKA -? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +M +202F +D +Accepted8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment  401  - UnauthorizedRhttpsj^ -x-kubernetes-group-version-kind;9group: policy -kind: PodDisruptionBudget -version: v1beta1 -j# -x-kubernetes-action  -watchlist + UnauthorizedRhttpsj +x-kubernetes-action delete +j^ +x-kubernetes-group-version-kind;9version: v1 +group: storage.k8s.io +kind: VolumeAttachment +B‡ + +storage_v1/partially update the specified VolumeAttachment*patchStorageV1VolumeAttachment2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jb +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment +version: v1 +J= +;9"7pathname of the VolumeAttachment"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string §' +/api/v1/replicationcontrollers„'ø +core_v13list or watch objects of kind ReplicationController*/listCoreV1ReplicationControllerForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jh +M +200F +D +OK> +< +:#/definitions/io.k8s.api.core.v1.ReplicationControllerList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jW +x-kubernetes-group-version-kind42group: "" +kind: ReplicationController +version: v1 J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30451,9 +28878,9 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean À] -//apis/rbac.authorization.k8s.io/v1/clusterrolesŒ]©& -rbacAuthorization_v1)list or watch objects of kind ClusterRole*"listRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ö\ +%/apis/storage.k8s.io/v1beta1/csinodesÌ\‘& +storage_v1beta1%list or watch objects of kind CSINode*listStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30475,58 +28902,58 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J^ -C -200< -: -OK4 -2 -0#/definitions/io.k8s.api.rbac.v1.ClusterRoleList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jb  401  - UnauthorizedRhttpsj + Unauthorized +G +200@ +> +OK8 +6 +4#/definitions/io.k8s.api.storage.v1beta1.CSINodeListRhttpsj x-kubernetes-actionlist -jd -x-kubernetes-group-version-kindA?group: rbac.authorization.k8s.io -kind: ClusterRole -version: v1 -"• -rbacAuthorization_v1create a ClusterRole*$createRbacAuthorizationV1ClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BB -@ ->bodybody *. -,#/definitions/io.k8s.api.rbac.v1.ClusterRoleBž +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode +version: v1beta1 +"‰ +storage_v1beta1create a CSINode*createStorageV1beta1CSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BF +D +Bbodybody *2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINodeBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jç +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jó  401  Unauthorized +C +200< +: +OK4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode +H +201A ? -2008 -6 -OK0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRole -D -201= -; -Created0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRole -E -202> -< -Accepted0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRoleRhttpsj +Created4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode +I +202B +@ +Accepted4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINodeRhttpsj x-kubernetes-actionpost -jd -x-kubernetes-group-version-kindA?version: v1 -group: rbac.authorization.k8s.io -kind: ClusterRole -*ô, -rbacAuthorization_v1 delete collection of ClusterRole*.deleteRbacAuthorizationV1CollectionClusterRole2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +jZ +x-kubernetes-group-version-kind75version: v1beta1 +group: storage.k8s.io +kind: CSINode +*Ø, +storage_v1beta1delete collection of CSINode*%deleteStorageV1beta1CollectionCSINode2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -30565,131 +28992,42 @@ C  UnauthorizedRhttpsj* x-kubernetes-actiondeletecollection -jd -x-kubernetes-group-version-kindA?kind: ClusterRole -version: v1 -group: rbac.authorization.k8s.io +jZ +x-kubernetes-group-version-kind75group: storage.k8s.io +kind: CSINode +version: v1beta1 JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ñ' -/api/v1/namespaces/{name}Ó'× -core_v1read the specified Namespace*readCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace - -401 - - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&version: v1 -group: "" -kind: Namespace -j -x-kubernetes-actionget -ž -core_v1replace the specified Namespace*replaceCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B@ -> -<bodybody *, -*#/definitions/io.k8s.api.core.v1.NamespaceBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace -B -201; -9 -Created. -, -*#/definitions/io.k8s.api.core.v1.Namespace - -401 - - UnauthorizedRhttpsjK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -j -x-kubernetes-actionput -*ó -core_v1delete a Namespace*deleteCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT -R -Pbodybody*B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä -áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ -ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ -…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +MKIquery-If 'true', then the output is pretty printed."pretty2string ê +/apis/storage.k8s.io/v1/ÍÊ + +storage_v1get available resources*getStorageV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N L -200E -C -OK= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status -R -202K -I -Accepted= -; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsj -x-kubernetes-action delete -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -BÖ -core_v1(partially update the specified Namespace*patchCoreV1Namespace2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN -L -Jbodybody *: -8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž -›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ -¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ -ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX -= -2006 -4 -OK. -, -*#/definitions/io.k8s.api.core.v1.Namespace + UnauthorizedRhttpsÔ) +I/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitions/{name}†)³ +apiextensions_v1beta1¿watch changes to an object of kind CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*1watchApiextensionsV1beta1CustomResourceDefinition2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk  401  - UnauthorizedRhttpsj -x-kubernetes-actionpatch -jK -x-kubernetes-group-version-kind(&group: "" -kind: Namespace -version: v1 -J6 -42"0pathname of the Namespace"name*string˜JO -MKIquery-If 'true', then the output is pretty printed."pretty2string ‡( -0/apis/scheduling.k8s.io/v1/watch/priorityclassesÒ'Æ - scheduling_v1ywatch individual changes to a list of PriorityClass. deprecated: use the 'watch' parameter with a list operation instead.*"watchSchedulingV1PriorityClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + Unauthorized P 200I G OKA ? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent - -401 - - UnauthorizedRhttpsj# -x-kubernetes-action  -watchlist -j^ -x-kubernetes-group-version-kind;9group: scheduling.k8s.io -kind: PriorityClass -version: v1 +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj +x-kubernetes-actionwatch +jq +x-kubernetes-group-version-kindNLversion: v1beta1 +group: apiextensions.k8s.io +kind: CustomResourceDefinition J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -30704,7 +29042,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JE +CA"?path$name of the CustomResourceDefinition"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -30713,10 +29052,10 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean â] -(/apis/policy/v1beta1/podsecuritypoliciesµ]®& -policy_v1beta1/list or watch objects of kind PodSecurityPolicy*"listPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ -ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean †_ +0/apis/apiregistration.k8s.io/v1beta1/apiservicesÑ^Ó& +apiregistration_v1beta1(list or watch objects of kind APIService*$listApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ @@ -30737,58 +29076,59 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Jk -P -200I -G -OKA -? -=#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyList +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J‚ +g +200` +^ +OKX +V +T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceList  401  UnauthorizedRhttpsj x-kubernetes-actionlist -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: policy -kind: PodSecurityPolicy -"Á -policy_v1beta1create a PodSecurityPolicy*$createPolicyV1beta1PodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BO -M -Kbodybody *; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyBž +je +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io +version: v1beta1 +kind: APIService +"« + +apiregistration_v1beta1create an APIService*&createApiregistrationV1beta1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Bf +d +bbodybody *R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceBž ›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– -“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JŽ -Q -201J -H -Created= -; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy -R -202K -I -Accepted= -; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÓ  401  Unauthorized -L -200E -C -OK= -; -9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyRhttpsj\ -x-kubernetes-group-version-kind97version: v1beta1 -group: policy -kind: PodSecurityPolicy +c +200\ +Z +OKT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService +h +201a +_ +CreatedT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService +i +202b +` +AcceptedT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceRhttpsje +x-kubernetes-group-version-kindB@version: v1beta1 +kind: APIService +group: apiregistration.k8s.io j x-kubernetes-actionpost -*ì, -policy_v1beta1&delete collection of PodSecurityPolicy*.deletePolicyV1beta1CollectionPodSecurityPolicy2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +*ù, +apiregistration_v1beta1delete collection of APIService*0deleteApiregistrationV1beta1CollectionAPIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT R Pbodybody*B @#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï @@ -30816,168 +29156,211 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Bž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg + +401 + + Unauthorized L 200E C OK= ; -9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status - -401 - - UnauthorizedRhttpsj* +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsj* x-kubernetes-actiondeletecollection -j\ -x-kubernetes-group-version-kind97version: v1beta1 -group: policy -kind: PodSecurityPolicy +je +x-kubernetes-group-version-kindB@group: apiregistration.k8s.io +version: v1beta1 +kind: APIService JO -MKIquery-If 'true', then the output is pretty printed."pretty2string Í - /apis/batch/¼¹ -batchget information of a group*getBatchAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi -N -200G -E -OK? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup +MKIquery-If 'true', then the output is pretty printed."pretty2string à' +/apis/apps/v1/watch/daemonsets½'± +apps_v1uwatch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.*(watchAppsV1DaemonSetListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent  401  - UnauthorizedRhttpsª -;/api/v1/namespaces/{namespace}/services/{name}/proxy/{path}ê§ -core_v1(connect GET requests to proxy of Service*.connectCoreV1GetNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jM +x-kubernetes-group-version-kind*(group: apps +kind: DaemonSet +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean š +N/apis/authorization.k8s.io/v1/namespaces/{namespace}/localsubjectaccessreviewsÇ "× +authorization_v1!create a LocalSubjectAccessReview*7createAuthorizationV1NamespacedLocalSubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX +V +Tbodybody *D +B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReviewJ© +[ +202T +R +AcceptedF +D +B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jU -x-kubernetes-group-version-kind20kind: ServiceProxyOptions + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview +Z +201S +Q +CreatedF +D +B#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReviewRhttpsj +x-kubernetes-actionpost +jl +x-kubernetes-group-version-kindIGgroup: authorization.k8s.io +kind: LocalSubjectAccessReview version: v1 -group: "" -§ -core_v1(connect PUT requests to proxy of Service*.connectCoreV1PutNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ò +/apis/apiregistration.k8s.io/ÐÍ +apiregistrationget information of a group*getApiregistrationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions -version: v1 -"© -core_v1)connect POST requests to proxy of Service*/connectCoreV1PostNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string + UnauthorizedRhttpsì +/apis/batch/v1beta1/ÓÐ + batch_v1beta1get available resources*getBatchV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList  401  - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions -version: v1 -j! -x-kubernetes-action -connect -*­ -core_v1+connect DELETE requests to proxy of Service*1connectCoreV1DeleteNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string + UnauthorizedRhttpsø +9/apis/apiregistration.k8s.io/v1/apiservices/{name}/statusºµ +apiregistration_v1'read status of the specified APIService*%readApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jy +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService  401  - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions + UnauthorizedRhttpsj` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io version: v1 -j! -x-kubernetes-action -connect -2¯ -core_v1,connect OPTIONS requests to proxy of Service*2connectCoreV1OptionsNamespacedServiceProxyWithPath2*/*:*/*J7 +kind: APIService +j +x-kubernetes-actionget +¾ +apiregistration_v1*replace status of the specified APIService*(replaceApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Ba +_ +]bodybody *M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JÞ  401  Unauthorized - -200 - -OK - ² -stringRhttpsjU -x-kubernetes-group-version-kind20kind: ServiceProxyOptions +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService +c +201\ +Z +CreatedO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceRhttpsj +x-kubernetes-actionput +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io version: v1 -group: "" -j! -x-kubernetes-action -connect -:© -core_v1)connect HEAD requests to proxy of Service*/connectCoreV1HeadNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +kind: APIService +B´ +apiregistration_v13partially update status of the specified APIService*&patchApiregistrationV1APIServiceStatus2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jy +^ +200W +U +OKO +M +K#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService  401  - UnauthorizedRhttpsjU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions + UnauthorizedRhttpsj +x-kubernetes-actionpatch +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io version: v1 -j! -x-kubernetes-action -connect -B« -core_v1*connect PATCH requests to proxy of Service*0connectCoreV1PatchNamespacedServiceProxyWithPath2*/*:*/*J7 - -200 - -OK - ² -string +kind: APIService +J7 +53"1pathname of the APIService"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ì +/apis/authorization.k8s.io/ÌÉ + authorizationget information of a group*getAuthorizationAPIGroup2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJi +N +200G +E +OK? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup  401  - UnauthorizedRhttpsj! -x-kubernetes-action -connect -jU -x-kubernetes-group-version-kind20group: "" -kind: ServiceProxyOptions -version: v1 -J@ -><":pathname of the ServiceProxyOptions"name*string˜J` -^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜J5 -31"/pathpath to the resource"path*string˜JÐ -ÍÊÇquery¬Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy."path2string ñ( -4/apis/storage.k8s.io/v1beta1/watch/csidrivers/{name}¸(ô -storage_v1beta1°watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchStorageV1beta1CSIDriver2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + UnauthorizedRhttpsá( +0/apis/node.k8s.io/v1/watch/runtimeclasses/{name}¬(å +node_v1³watch changes to an object of kind RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*watchNodeV1RuntimeClass2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk P 200I G @@ -30989,10 +29372,10 @@ G  UnauthorizedRhttpsj x-kubernetes-actionwatch -j\ -x-kubernetes-group-version-kind97group: storage.k8s.io -kind: CSIDriver -version: v1beta1 +jW +x-kubernetes-group-version-kind42kind: RuntimeClass +version: v1 +group: node.k8s.io J‚ ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". @@ -31007,8 +29390,8 @@ This field is not supported when watch is true. Clients may start a watch from t queryÔ limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J6 -42"0pathname of the CSIDriver"name*string˜JO +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J9 +75"3pathname of the RuntimeClass"name*string˜JO MKIquery-If 'true', then the output is pretty printed."pretty2string Jû øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. @@ -31017,1985 +29400,3036 @@ Defaults to unset"resourceVersion2string Defaults to unset"resourceVersionMatch2string Jž ›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± -®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J½÷0 -à -%io.k8s.api.discovery.v1.EndpointHints¶"KEndpointHints provides hints describing how an endpoint should be consumed.² -objectÊÚ -× -forZonesÊ"dforZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing.² -arrayº1 -/ --#/definitions/io.k8s.api.discovery.v1.ForZoneú# -x-kubernetes-list-type atomic - -½ --io.k8s.api.extensions.v1beta1.HTTPIngressPath‹ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² -objectÊ -¤ -backend˜ -:#/definitions/io.k8s.api.extensions.v1beta1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. -ž -path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² -string -¶ -pathType©"›PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is - done on a path element by element basis. A path element refers is the - list of labels in the path split by the '/' separator. A request is a - match for path p if every p is an element-wise prefix of p of the - request path. Note that if the last element of the path is a substring - of the last element in request path, it is not a match (e.g. /foo/bar - matches /foo/bar/baz, but does not match /foo/barbaz). -* ImplementationSpecific: Interpretation of the Path matching is up to - the IngressClass. Implementations can treat this as a separate PathType - or treat it identically to Prefix or Exact path types. -Implementations are required to support all path types. Defaults to ImplementationSpecific.² -string -à -@io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration› "èLimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues: - * How are requests for this priority level limited? - * What should be done with requests that exceed the limit?² -objectÊ¡ -ö -assuredConcurrencySharesÙint32"Ã`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) --- the number of requests that may be executing at a time --- for each such priority level: - - ACV(l) = ceil( SCL * ACS(l) / ( sum[priority levels k] ACS(k) ) ) - -bigger numbers of ACS mean more reserved concurrent requests (at the expense of every other PL). This field has a default value of 30.² -integer -¥ - limitResponse“ -:#/definitions/io.k8s.api.flowcontrol.v1beta1.LimitResponse"U`limitResponse` indicates what to do with requests that can not be executed right now -ý -+io.k8s.api.policy.v1beta1.PodSecurityPolicyÍ "˜PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated in 1.21.² -objectʾ -¾ +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ÿ' +./apis/node.k8s.io/v1beta1/watch/runtimeclassesÌ'À + node_v1beta1xwatch individual changes to a list of RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead.* watchNodeV1beta1RuntimeClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j\ +x-kubernetes-group-version-kind97group: node.k8s.io +kind: RuntimeClass +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -apiVersion¯"¡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² -string -¹ -kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -j -specb -=#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicySpec"!spec defines the policy enforced.úb -x-kubernetes-group-version-kind?=- group: policy - kind: PodSecurityPolicy - version: v1beta1 +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -Î -'io.k8s.api.storage.v1beta1.StorageClass¢"ãStorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned. +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -StorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.š provisioner² -objectÊ· -‘ +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -parameters‚"eParameters holds the parameters for the provisioner that should create volumes of this storage class.ª - ² -string² -object -ø -volumeBindingModeâ"ÔVolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.² -string -¾ +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -apiVersion¯"¡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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -ì - mountOptionsÛ"¾Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. ["ro", "soft"]. Not validated - mount of the PVs will simply fail if one is invalid.² -arrayº - ² -string -N - provisioner?"2Provisioner indicates the type of the provisioner.² -string -— - reclaimPolicy…"xDynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.² -string -n -allowVolumeExpansionV"HAllowVolumeExpansion shows whether the storage class allow volume expand² -boolean -Š -allowedTopologiesô"«Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.² -arrayº9 +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ’' +/api/v1/nodes/{name}ù&à +core_v1read the specified Node*readCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +€ +core_v1replace the specified Node*replaceCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*B; +9 +7bodybody *' +%#/definitions/io.k8s.api.core.v1.NodeBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J’ +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node += +2016 +4 +Created) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsjF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +j +x-kubernetes-actionput +*ä +core_v1 delete a Node*deleteCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» + +401 + + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjF +x-kubernetes-group-version-kind#!group: "" +kind: Node +version: v1 +j +x-kubernetes-action delete +B +core_v1#partially update the specified Node*patchCoreV1Node2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JS +8 +2001 +/ +OK) +' +%#/definitions/io.k8s.api.core.v1.Node + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jF +x-kubernetes-group-version-kind#!kind: Node +version: v1 +group: "" +J1 +/-"+pathname of the Node"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ú +/apis/apps/v1/ÇÄ +apps_v1get available resources*getAppsV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsï + +2/apis/authorization.k8s.io/v1/subjectaccessreviews¸ +"ª +authorization_v1create a SubjectAccessReview*(createAuthorizationV1SubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BS +Q +Obodybody *? +=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewJš +P +200I +G +OKA +? +=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview +U +201N +L +CreatedA +? +=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview +V +202O +M +AcceptedA +? +=#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpost +jg +x-kubernetes-group-version-kindDBversion: v1 +group: authorization.k8s.io +kind: SubjectAccessReview +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string — +7/apis/authorization.k8s.io/v1beta1/subjectaccessreviewsÛ +"Í +authorization_v1beta1create a SubjectAccessReview*-createAuthorizationV1beta1SubjectAccessReview2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BX +V +Tbodybody *D +B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewJ© +[ +202T +R +AcceptedF +D +B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview + +401 + + Unauthorized +U +200N +L +OKF +D +B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview +Z +201S +Q +CreatedF +D +B#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewRhttpsjl +x-kubernetes-group-version-kindIGkind: SubjectAccessReview +version: v1beta1 +group: authorization.k8s.io +j +x-kubernetes-actionpost +Jž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string J– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string JO +MKIquery-If 'true', then the output is pretty printed."pretty2string æ) +:/apis/batch/v1beta1/namespaces/{namespace}/cronjobs/{name}§)ó + batch_v1beta1read the specified CronJob*!readBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 + + batch_v1beta1replace the specified CronJob*$replaceBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BD +B +@bodybody *0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJobBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¤ +F +201? += +Created2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob + +401 + + Unauthorized +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJobRhttpsj +x-kubernetes-actionput +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +*‹ + batch_v1beta1delete a CronJob*#deleteBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» + +401 + + Unauthorized +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusRhttpsjQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +j +x-kubernetes-action delete +Bò + batch_v1beta1&partially update the specified CronJob*"patchBatchV1beta1NamespacedCronJob2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J\ +A +200: +8 +OK2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jQ +x-kubernetes-group-version-kind.,group: batch +kind: CronJob +version: v1beta1 +J4 +20".pathname of the CronJob"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ¸( + +<bodybody *, +*#/definitions/io.k8s.api.core.v1.EndpointsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jœ += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Endpoints +B +201; +9 +Created. +, +*#/definitions/io.k8s.api.core.v1.Endpoints + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 +j +x-kubernetes-actionput +*û +core_v1delete Endpoints*deleteCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 +j +x-kubernetes-action delete +Bà +core_v1(partially update the specified Endpoints*patchCoreV1NamespacedEndpoints2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean JX += +2006 +4 +OK. +, +*#/definitions/io.k8s.api.core.v1.Endpoints + +401 + + UnauthorizedRhttpsjK +x-kubernetes-group-version-kind(&group: "" +kind: Endpoints +version: v1 +j +x-kubernetes-actionpatch +J6 +42"0pathname of the Endpoints"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Ì' +/apis/batch/v1/watch/jobs®'¢ +batch_v1owatch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.*#watchBatchV1JobListForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jH +x-kubernetes-group-version-kind%#group: batch +kind: Job +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ö) +@/apis/events.k8s.io/v1beta1/namespaces/{namespace}/events/{name}±)ö +events_v1beta1read the specified Event* readEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionget +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 +à +events_v1beta1replace the specified Event*#replaceEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.events.v1beta1.EventBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event + +401 + + UnauthorizedRhttpsjW +x-kubernetes-group-version-kind42kind: Event +version: v1beta1 +group: events.k8s.io +j +x-kubernetes-actionput +* +events_v1beta1delete an Event*"deleteEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 +Bõ +events_v1beta1$partially update the specified Event*!patchEventsV1beta1NamespacedEvent2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 7 -5#/definitions/io.k8s.api.core.v1.TopologySelectorTerm -¹ -kind°"¢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² -stringúe -x-kubernetes-group-version-kindB@- group: storage.k8s.io - kind: StorageClass - version: v1beta1 +OK1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 +J2 +0.",pathname of the Event"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ‚+ +B/apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets/{name}»*“ + policy_v1&read the specified PodDisruptionBudget*)readPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsjY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +j +x-kubernetes-actionget +ò + policy_v1)replace the specified PodDisruptionBudget*,replacePolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BL +J +Hbodybody *8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J´ +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget +N +201G +E +Created: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +*£ + policy_v1delete a PodDisruptionBudget*+deletePolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string J» +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status +R +202K +I +Accepted= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj +x-kubernetes-action delete +jY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +B’ + policy_v12partially update the specified PodDisruptionBudget**patchPolicyV1NamespacedPodDisruptionBudget2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean Jd +I +200B +@ +OK: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget + +401 + + UnauthorizedRhttpsjY +x-kubernetes-group-version-kind64group: policy +kind: PodDisruptionBudget +version: v1 +j +x-kubernetes-actionpatch +J@ +><":pathname of the PodDisruptionBudget"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ×` +E/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations`’' +admissionregistration_v1/? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² -objectÊ -Œ -paths‚"4A collection of paths that map requests to backends.² -arrayº? +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ƒ( +//apis/networking.k8s.io/v1/watch/ingressclassesÏ'à + networking_v1xwatch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.*!watchNetworkingV1IngressClassList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +j] +x-kubernetes-group-version-kind:8group: networking.k8s.io +kind: IngressClass +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ù +/apis/coordination.k8s.io/v1/×Ô +coordination_v1get available resources*getCoordinationV1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsº^ +?/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leasesö]§& +coordination_v1beta1#list or watch objects of kind Lease*&listCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*B‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Bï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú + +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer B± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean Je +J +200C +A +OK; +9 +7#/definitions/io.k8s.api.coordination.v1beta1.LeaseList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +j] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +"¨ +coordination_v1beta1create a Lease*(createCoordinationV1beta1NamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BI +G +Ebodybody *5 +3#/definitions/io.k8s.api.coordination.v1beta1.LeaseBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string Jü +K +201D +B +Created7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease +L +202E +C +Accepted7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease + +401 + + Unauthorized +F +200? = -;#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressPath -Å -/io.k8s.api.storage.v1beta1.VolumeAttachmentList‘ "AVolumeAttachmentList is a collection of VolumeAttachment objects.šitems² -objectÊÇ -¾ +OK7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.LeaseRhttpsj +x-kubernetes-actionpost +j] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +*ë, +coordination_v1beta1delete collection of Lease*2deleteCoordinationV1beta1CollectionNamespacedLease2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BT +R +Pbodybody*B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptionsBï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -apiVersion¯"¡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² -string -{ -itemsr"&Items is the list of VolumeAttachments² -arrayº= -; -9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment -¹ -kind°"¢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² -string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúm -x-kubernetes-group-version-kindJH- kind: VolumeAttachmentList - version: v1beta1 - group: storage.k8s.io +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string Bž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string Bä +áÞÛquery±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."gracePeriodSeconds2integer B‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Bú -… -6io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerÊ "ÎHorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.² -objectÊú -¾ +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -apiVersion¯"¡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² -string -¹ -kind°"¢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² -string -à -metadataÓ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‘metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -„ -specû -H#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec"®spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. - -status… -J#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus"7status is the current information about the autoscaler.úm -x-kubernetes-group-version-kindJH- kind: HorizontalPodAutoscaler - version: v2beta2 - group: autoscaling +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer BÑ +ÎËÈquery Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both."orphanDependents2boolean Bˆ +…‚ÿquery×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground."propagationPolicy2string Bû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -ð -!io.k8s.api.core.v1.ClientIPConfigÊ"QClientIPConfig represents the configurations of Client IP based session affinity.² -objectÊè -å -timeoutSecondsÒint32"¼timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP". Default value is 10800(for 3 hours).² -integer -à -!io.k8s.api.core.v1.LimitRangeListº "-LimitRangeList is a list of LimitRange items.šitems² -objectÊ› -¾ +Defaults to unset"resourceVersion2string BÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -apiVersion¯"¡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² -string -É -items¿"€Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/² -arrayº/ -- -+#/definitions/io.k8s.api.core.v1.LimitRange -¹ -kind°"¢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² -string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúV -x-kubernetes-group-version-kind31- kind: LimitRangeList - version: v1 - group: "" +Defaults to unset"resourceVersionMatch2string Bž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer Jg +L +200E +C +OK= +; +9#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status + +401 + + UnauthorizedRhttpsj] +x-kubernetes-group-version-kind:8group: coordination.k8s.io +kind: Lease +version: v1beta1 +j* +x-kubernetes-actiondeletecollection +J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string †( +//apis/storage.k8s.io/v1/watch/volumeattachmentsÒ'Æ -ƒ -2io.k8s.api.networking.v1beta1.HTTPIngressRuleValueÌ"£HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http:///? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² -objectÊ -Œ -paths‚"4A collection of paths that map requests to backends.² -arrayº? -= -;#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressPath -í -Oio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray™"–JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes. -± -:io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpecò "_HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.šscaleTargetRefš maxReplicas² -objectÊã +storage_v1|watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.*"watchStorageV1VolumeAttachmentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj# +x-kubernetes-action  +watchlist +j^ +x-kubernetes-group-version-kind;9group: storage.k8s.io +kind: VolumeAttachment +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -¶ -metricsª"ßmetrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond.² -arrayº; -9 -7#/definitions/io.k8s.api.autoscaling.v2beta1.MetricSpec -ò - minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² -integer -† -scaleTargetRefó -H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"¦scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count. -© - maxReplicas™int32"ƒmaxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.² -integer -ç -io.k8s.api.core.v1.ConfigMapÆ"7ConfigMap holds configuration data for pods to consume.² -objectʪ -¾ +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -apiVersion¯"¡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² -string -˜ +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -binaryData‰"åBinaryData contains the binary data. Each key must consist of alphanumeric characters, '-', '_' or '.'. BinaryData can contain byte sequences that are not in the UTF-8 range. The keys stored in BinaryData must not overlap with the ones in the Data field, this is enforced during validation process. Using this field will require 1.10+ apiserver and kubelet.ª -byte² -string² -object -Ï -dataÆ"¨Data contains the configuration data. Each key must consist of alphanumeric characters, '-', '_' or '.'. Values with non-UTF-8 byte sequences must use the BinaryData field. The keys stored in Data must not overlap with the keys in the BinaryData field, this is enforced during validation process.ª - ² -string² -object -è - immutableÚ"ËImmutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.² -boolean -¹ -kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúQ -x-kubernetes-group-version-kind.,- group: "" - kind: ConfigMap - version: v1 +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -˜ -*io.k8s.api.core.v1.NodeSelectorRequirementé"wA node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.škeyšoperator² -objectÊÐ -? -key8"+The label key that the selector applies to.² -string -Ž -operator"tRepresents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.² -string -û -valuesð"ÓAn array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.² -arrayº - ² -string - -Lio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookClientConfig¼ "WWebhookClientConfig contains the information to make a TLS connection with the webhook.² -objectÊÔ -à -caBundle¶byte"¢caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² -string -– -serviceŠ -W#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReference"®service is a reference to the service for this webhook. Either service or url must be specified. +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -If the webhook is running within the cluster, then you should use `service`. -ò -urlê"Üurl gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified. +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ð +>/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/scale­û +apps_v1'read scale of the specified StatefulSet*$readAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +j +x-kubernetes-actionget +È +apps_v1*replace scale of the specified StatefulSet*'replaceAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +j +x-kubernetes-actionput +Bú +apps_v13partially update scale of the specified StatefulSet*%patchAppsV1NamespacedStatefulSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jP +x-kubernetes-group-version-kind-+version: v1 +group: autoscaling +kind: Scale +J2 +0.",pathname of the Scale"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string ' +"/apis/events.k8s.io/v1beta1/eventsé&Ý +events_v1beta1#list or watch objects of kind Event*&listEventsV1beta1EventForAllNamespaces2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*J_ +D +200= +; +OK5 +3 +1#/definitions/io.k8s.api.events.v1beta1.EventList + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionlist +jW +x-kubernetes-group-version-kind42group: events.k8s.io +kind: Event +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -Please note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster. +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -The scheme must be "https"; the URL must begin with "https://". +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² -string -Ì -\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatusë"RCustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition² -objectʈ -ù - acceptedNamesç -i#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames"zacceptedNames are the names that are actually being used to serve discovery. They may be different than the names in spec. -ª +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚ + /apis/networking.k8s.io/v1beta1/ÝÚ +networking_v1beta1get available resources* getNetworkingV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsê' +(/apis/storage.k8s.io/v1/watch/csidrivers½'± -conditions›"Nconditions indicate state for particular aspects of a CustomResourceDefinition² -arrayºq -o -m#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionConditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap +storage_v1uwatch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.*watchStorageV1CSIDriverList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jW +x-kubernetes-group-version-kind42group: storage.k8s.io +kind: CSIDriver +version: v1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -Ü -storedVersionsÉ"¬storedVersions lists all versions of CustomResources that were ever persisted. Tracking these versions allows a migration path for stored versions in etcd. The field is mutable so a migration controller can finish a migration to another version (ensuring no old objects are left in storage), and then remove the rest of the versions from this list. Versions may not be removed from `spec.versions` while they exist in this list.² -arrayº - ² -string -ñ -Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation™"YExternalDocumentation allows referencing an external resource for extended documentation.² -objectÊ0 - - description ² -string - -url ² -string -¬ -@io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationç -"‚MutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object.² -objectÊÒ -þ -webhooksñ"IWebhooks is a list of webhooks and the affected resources and operations.² -arrayºE -C -A#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -¾ +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -apiVersion¯"¡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² -string -¹ -kind°"¢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² -string -Ñ -metadataÄ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.ú~ -x-kubernetes-group-version-kind[Y- version: v1 - group: admissionregistration.k8s.io - kind: MutatingWebhookConfiguration +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Ý -#/definitions/io.k8s.api.core.v1.ServiceAccountTokenProjection"9information about the serviceAccountToken data to project -t - configMapg -4#/definitions/io.k8s.api.core.v1.ConfigMapProjection"/information about the configMap data to project -¦ -!io.k8s.api.core.v1.ServiceAccount€"ºServiceAccount binds together: * a name, understood by users, and perhaps by peripheral systems, for an identity * a principal that can be authenticated and authorized * a set of secrets² -objectÊÛ -Ä -secrets¸" Secrets is the list of secrets allowed to be used by pods running using this ServiceAccount. More info: https://kubernetes.io/docs/concepts/configuration/secret² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ObjectReferenceú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean ‚) +8/apis/apiregistration.k8s.io/v1/watch/apiservices/{name}Å(€ +apiregistration_v1±watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchApiregistrationV1APIService2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +j` +x-kubernetes-group-version-kind=;group: apiregistration.k8s.io +version: v1 +kind: APIService +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -¾ +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -apiVersion¯"¡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² -string -× -automountServiceAccountToken¶"§AutomountServiceAccountToken indicates whether pods running as this service account should have an API token automatically mounted. Can be overridden at the pod level.² -boolean -å -imagePullSecretsÐ"‡ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod² -arrayº9 -7 -5#/definitions/io.k8s.api.core.v1.LocalObjectReference -¹ -kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúV -x-kubernetes-group-version-kind31- version: v1 - group: "" - kind: ServiceAccount +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -— -"io.k8s.api.core.v1.TCPSocketActionð"=TCPSocketAction describes an action based on opening a socketšport² -objectÊ› -Ç -port¾ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"}Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. -O -hostG":Optional: Host name to connect to, defaults to the pod IP.² -string -´ -Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionListÚ"KCustomResourceDefinitionList is a list of CustomResourceDefinition objects.šitems² -objectÊý -¾ +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J7 +53"1pathname of the APIService"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -apiVersion¯"¡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² -string -² -items¨"6items list individual CustomResourceDefinition objects² -arrayºc -a -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition -¹ -kind°"¢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² -string -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúv -x-kubernetes-group-version-kindSQ- group: apiextensions.k8s.io - kind: CustomResourceDefinitionList - version: v1 +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -´4 -3io.k8s.api.admissionregistration.v1.MutatingWebhookü3"^MutatingWebhook describes an admission webhook and the resources and operations it applies to.šnameš clientConfigš sideEffectsšadmissionReviewVersions² -objectÊÏ2 -õ - sideEffectså"×SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.² -string -œ - matchPolicyŒ"þmatchPolicy defines how the "rules" list is used to match incoming requests. Allowed values are "Exact" or "Equivalent". +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean þ +/apis/autoscaling/v2beta1/ßÜ +autoscaling_v2beta1get available resources*!getAutoscalingV2beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsˆ +"/apis/certificates.k8s.io/v1beta1/áÞ +certificates_v1beta1get available resources*"getCertificatesV1beta1APIResources2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json:application/yaml:#application/vnd.kubernetes.protobufJp +U +200N +L +OKF +D +B#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList + +401 + + UnauthorizedRhttpsü) +S/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations/{name}¤)Ï +flowcontrolApiserver_v1beta1Áwatch changes to an object of kind PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*:watchFlowcontrolApiserverV1beta1PriorityLevelConfiguration2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk + +401 + + Unauthorized +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventRhttpsj{ +x-kubernetes-group-version-kindXVgroup: flowcontrol.apiserver.k8s.io +kind: PriorityLevelConfiguration +version: v1beta1 +j +x-kubernetes-actionwatch +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook. +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook. +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -Defaults to "Equivalent"² -string -Ý -namespaceSelectorÇ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‚ NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JG +EC"Apath&name of the PriorityLevelConfiguration"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -For example, to run the webhook on any objects whose namespace is not associated with "runlevel" of "0" or "1"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "runlevel", - "operator": "NotIn", - "values": [ - "0", - "1" - ] - } - ] -} +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -If instead you want to only run the webhook on any objects whose namespace is associated with the "environment" of "prod" or "staging"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "environment", - "operator": "In", - "values": [ - "prod", - "staging" - ] - } - ] -} +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean È) +H/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolebindings/{name}û(® +rbacAuthorization_v1beta1¹watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.*/watchRbacAuthorizationV1beta1ClusterRoleBinding2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jp +x-kubernetes-group-version-kindMKgroup: rbac.authorization.k8s.io +kind: ClusterRoleBinding +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors. +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -Default to the empty LabelSelector, which matches everything. -é -objectSelectorÖ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‘ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything. - -reinvocationPolicyù"ëreinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are "Never" and "IfNeeded". +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -Never: the webhook will not be called more than once in a single admission evaluation. +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J? +=;"9pathname of the ClusterRoleBinding"name*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -IfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead. +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -Defaults to "Never".² -string -é -rulesß"‡Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.² -arrayºH -F -D#/definitions/io.k8s.api.admissionregistration.v1.RuleWithOperations -– -admissionReviewVersionsú"ÝAdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.² -arrayº - ² -string -™ - clientConfigˆ -E#/definitions/io.k8s.api.admissionregistration.v1.WebhookClientConfig"?ClientConfig defines how to communicate with the hook. Required -¬ - failurePolicyš"ŒFailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Fail.² -string -ç -nameÞ"ÐThe name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where "imagepolicy" is the name of the webhook, and kubernetes.io is the name of the organization. Required.² -string -œ -timeoutSeconds‰int32"óTimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.² -integer -ì -+io.k8s.api.autoscaling.v2beta2.MetricStatus¼">MetricStatus describes the last-read state of a single metric.štype² -objectÊæ -Ë -containerResourceµ -J#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus"æcontainer resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -ô -externalç -A#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). - -object· -?#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). -• -podsŒ -=#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricStatus"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. -™ -resourceŒ -A#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -¥ -typeœ"Žtype is the type of metric source. It will be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each corresponds to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² -string -™ -1io.k8s.api.policy.v1beta1.PodDisruptionBudgetListã"@PodDisruptionBudgetList is a collection of PodDisruptionBudgets.šitems² -objectÊŸ -¹ -kind°"¢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² -string -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta -¾ +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean È) +8/api/v1/watch/namespaces/{namespace}/podtemplates/{name}‹)ã +core_v1²watch changes to an object of kind PodTemplate. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.* watchCoreV1NamespacedPodTemplate2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionwatch +jM +x-kubernetes-group-version-kind*(version: v1 +group: "" +kind: PodTemplate +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -apiVersion¯"¡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² -string -U -itemsL² -arrayº? -= -;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetúh -x-kubernetes-group-version-kindEC- group: policy - kind: PodDisruptionBudgetList - version: v1beta1 +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -ÿ -5io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpecÅ"-specification of a horizontal pod autoscaler.šscaleTargetRefš maxReplicas² -objectÊè - - maxReplicas~int32"iupper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas.² -integer -ò - minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² -integer -† -scaleTargetRefó -C#/definitions/io.k8s.api.autoscaling.v1.CrossVersionObjectReference"«reference to scaled resource; horizontal pod autoscaler will learn the current resource consumption and will set the desired number of pods by using its Scale subresource. -× -targetCPUUtilizationPercentage´int32"žtarget average CPU utilization (represented as a percentage of requested CPU) over all the pods; if not specified the default autoscaling policy will be used.² -integer -Í -io.k8s.api.core.v1.EventList¬"EventList is a list of events.šitems² -objectÊ¡ -¾ +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. -apiVersion¯"¡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² -string -P -itemsG"List of events² -arrayº* -( -&#/definitions/io.k8s.api.core.v1.Event -¹ -kind°"¢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² -string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúQ -x-kubernetes-group-version-kind.,- group: "" - kind: EventList - version: v1 +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer J8 +64"2pathname of the PodTemplate"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -ë -=io.k8s.api.networking.v1beta1.IngressClassParametersReference©"}IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.škindšname² -objectÊ -Ú -apiGroupÍ"¿APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.² -string -C -kind;".Kind is the type of resource being referenced.² -string -C -name;".Name is the name of resource being referenced.² -string - - namespace´"¦Namespace is the namespace of the resource being referenced. This field is required when scope is set to "Namespace" and must be unset when scope is set to "Cluster".² -string -Þ -scopeÔ"ÆScope represents if this refers to a cluster or namespace scoped resource. This may be set to "Cluster" (default) or "Namespace". Field can be enabled with IngressClassNamespacedParams feature gate.² -string -‹ -#io.k8s.api.storage.v1.CSIDriverListã"3CSIDriverList is a collection of CSIDriver objects.šitems² -objectʳ -¹ -kind°"¢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² -string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¾ +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -apiVersion¯"¡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² -string -g -items^"items is the list of CSIDriver² -arrayº1 +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean é +=/apis/apps/v1/namespaces/{namespace}/replicasets/{name}/scale§ù +apps_v1&read scale of the specified ReplicaSet*#readAppsV1NamespacedReplicaSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*J[ +@ +2009 +7 +OK1 / --#/definitions/io.k8s.api.storage.v1.CSIDriverúa -x-kubernetes-group-version-kind><- version: v1 - group: storage.k8s.io - kind: CSIDriverList +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsjP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +j +x-kubernetes-actionget +Æ +apps_v1)replace scale of the specified ReplicaSet*&replaceAppsV1NamespacedReplicaSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:*/*BC +A +?bodybody */ +-#/definitions/io.k8s.api.autoscaling.v1.ScaleBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B– +“queryêfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint." fieldManager2string J¢ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale +E +201> +< +Created1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionput +jP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +Bø +apps_v12partially update scale of the specified ReplicaSet*$patchAppsV1NamespacedReplicaSetScale2application/json2application/yaml2#application/vnd.kubernetes.protobuf:application/json-patch+json:application/merge-patch+json:&application/strategic-merge-patch+json:application/apply-patch+yamlBN +L +Jbodybody *: +8#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.PatchBž +›˜•queryøWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed"dryRun2string B¯ +¬©¦queryƒfieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch)." fieldManager2string BÎ +ËÈÅquery¨Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests."force2boolean J[ +@ +2009 +7 +OK1 +/ +-#/definitions/io.k8s.api.autoscaling.v1.Scale + +401 + + UnauthorizedRhttpsj +x-kubernetes-actionpatch +jP +x-kubernetes-group-version-kind-+group: autoscaling +kind: Scale +version: v1 +J2 +0.",pathname of the Scale"name*string˜J` +^\"Zpath:object name and auth scope, such as for teams and projects" namespace*string˜JO +MKIquery-If 'true', then the output is pretty printed."pretty2string š( +4/apis/storage.k8s.io/v1beta1/watch/volumeattachmentsá'Õ +storage_v1beta1|watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.*'watchStorageV1beta1VolumeAttachmentList2application/json2application/yaml2#application/vnd.kubernetes.protobuf2application/json;stream=watch20application/vnd.kubernetes.protobuf;stream=watch:*/*Jk +P +200I +G +OKA +? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent + +401 + + UnauthorizedRhttpsj# +x-kubernetes-action  +watchlist +jc +x-kubernetes-group-version-kind@>group: storage.k8s.io +kind: VolumeAttachment +version: v1beta1 +J‚ +ÿüùqueryÎallowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored."allowWatchBookmarks2boolean Jï +ì é æ queryÇ The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". -• -0io.k8s.apimachinery.pkg.apis.meta.v1.APIVersionsà "APIVersions lists the versions that are available, to allow clients to discover the API at /api, which is the root path of the legacy v1 API.šversionsšserverAddressByClientCIDRs² -objectÊà -¹ -kind°"¢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² -string -è -serverAddressByClientCIDRsÉ"éa map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.² -arrayºP -N -L#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR -Y -versionsM"1versions are the api versions that are available.² -arrayº - ² -string -¾ +This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications."continue2string J‡ +„query\A selector to restrict the list of returned objects by their fields. Defaults to everything." fieldSelector2string J‡ +„query\A selector to restrict the list of returned objects by their labels. Defaults to everything." labelSelector2string Jú -apiVersion¯"¡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² -stringúS -x-kubernetes-group-version-kind0.- group: "" - kind: APIVersions - version: v1 +÷ +ô +ñ +queryÔ +limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + +The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned."limit2integer JO +MKIquery-If 'true', then the output is pretty printed."pretty2string Jû +øõòqueryÌresourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -ž -io.k8s.api.apps.v1.StatefulSetû -"ŸStatefulSet represents a set of pods with consistent identities. Identities are defined as: - - Network: A single stable DNS and hostname. - - Storage: As many VolumeClaims as requested. -The StatefulSet guarantees that a given network identity will always map to the same storage identity.² -objectÊò -¯ -status¤ -2#/definitions/io.k8s.api.apps.v1.StatefulSetStatus"nStatus is the current status of Pods in this StatefulSet. This data may be out of date by some window of time. -¾ +Defaults to unset"resourceVersion2string JÚ +×ÔÑquery¦resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. -apiVersion¯"¡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² +Defaults to unset"resourceVersionMatch2string Jž +›˜•querypTimeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity."timeoutSeconds2integer J± +®«¨query‹Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion."watch2boolean J½÷0 +§ +"io.k8s.api.core.v1.NFSVolumeSource€"€Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.šserveršpath² +objectÊÞ +€ +pathx"kPath that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² string -¹ -kind°"¢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² +à +readOnly¶"§ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² +boolean +’ +server‡"zServer is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -t -specl -0#/definitions/io.k8s.api.apps.v1.StatefulSetSpec"8Spec defines the desired identities of pods in this set.úU -x-kubernetes-group-version-kind20- kind: StatefulSet - version: v1 - group: apps - -Ð - -.io.k8s.api.autoscaling.v2beta2.HPAScalingRules -"”HPAScalingRules configures the scaling behavior for one direction. These Rules are applied after calculating DesiredReplicas from metrics for the HPA. They can limit the scaling velocity by specifying scaling policies. They can prevent flapping by specifying the stabilization window, so that the number of replicas is not set instantly, instead, the safest value from the stabilization window is chosen.² -objectÊ÷ -‘ -policies„"³policies is a list of potential scaling polices which can be used during scaling. At least one policy must be specified, otherwise the HPAScalingRules will be discarded as invalid² -arrayºA -? -=#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy -‘ - selectPolicy€"sselectPolicy is used to specify which policy should be used. If not set, the default value MaxPolicySelect is used.² +È +$io.k8s.api.discovery.v1beta1.ForZoneŸ"LForZone provides information about which zones should consume this endpoint.šname² +objectÊ< +: +name2"%name represents the name of the zone.² string -Ì -stabilizationWindowSeconds­int32"—StabilizationWindowSeconds is the number of seconds for which past recommendations should be considered while scaling up or scaling down. StabilizationWindowSeconds must be greater than or equal to zero and less than or equal to 3600 (one hour). If not set, use the default values: - For scale up: 0 (i.e. no stabilization is done). - For scale down: 300 (i.e. the stabilization window is 300 seconds long).² +¦ +io.k8s.api.events.v1beta1.Event‚"¾Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.š eventTime² +objectÊÆ +| +reasonr"ereason is why the action was taken. It is human-readable. This field can have at most 128 characters.² +string +Ñ +relatedÅ +0#/definitions/io.k8s.api.core.v1.ObjectReference"related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object. +¹ +reportingController¡"“reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.² +string +¦ +action›"action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field can have at most 128 characters.² +string +ˆ +deprecatedCountuint32"`deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.² integer -¼ -(io.k8s.api.core.v1.ReplicationController"OReplicationController represents the configuration of a replication controller.² -objectÊÏ +¿ +deprecatedLastTimestamp£ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"hdeprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Á +deprecatedFirstTimestamp¤ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ideprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. +— + eventTime‰ +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"IeventTime is the time when this Event was first observed. It is required. ¹ kind°"¢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² string -ß -metadataÒ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"If the Labels of a ReplicationController are empty, they are defaulted to be the same as the Pod(s) that the replication controller manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Œ -specƒ -:#/definitions/io.k8s.api.core.v1.ReplicationControllerSpec"ÄSpec defines the specification of the desired behavior of the replication controller. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -Þ -statusÓ -<#/definitions/io.k8s.api.core.v1.ReplicationControllerStatus"’Status is the most recently observed status of the replication controller. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status ¾ apiVersion¯"¡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² -stringú] -x-kubernetes-group-version-kind:8- group: "" - kind: ReplicationController - version: v1 - -Ù -Bio.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition’"LPriorityLevelConfigurationCondition defines the condition of priority level.² -objectʵ -® -lastTransitionTime— -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"\`lastTransitionTime` is the last time the condition transitioned from one status to another. -g -message\"O`message` is a human-readable message indicating details about last transition.² -string -l -reasonb"U`reason` is a unique, one-word, CamelCase reason for the condition's last transition.² -string -f -status\"O`status` is the status of the condition. Can be True, False, Unknown. Required.² -string -C -type;".`type` is the type of the condition. Required.² -string -Ò -)io.k8s.api.networking.v1beta1.IngressSpec¤ ";IngressSpec describes the Ingress the user wishes to exist.² -objectÊØ -º -backend® -:#/definitions/io.k8s.api.networking.v1beta1.IngressBackend"ïA default backend capable of servicing requests that don't match any rule. At least one of 'backend' or 'rules' must be specified. This field is optional to allow the loadbalancer controller or defaulting logic to specify a global default. -´ -ingressClassNameŸ"‘IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.² -string -Ø -rulesÎ"ƒA list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.² -arrayº; -9 -7#/definitions/io.k8s.api.networking.v1beta1.IngressRule -† -tlsþ"´TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.² -arrayº: -8 -6#/definitions/io.k8s.api.networking.v1beta1.IngressTLS -ç -io.k8s.api.rbac.v1beta1.RoleRefÃ"?RoleRef contains information that points to the role being usedšapiGroupškindšname² -objectÊÚ -P -apiGroupD"7APIGroup is the group for the resource being referenced² string -B -kind:"-Kind is the type of resource being referenced² +¦ +deprecatedSource‘ +,#/definitions/io.k8s.api.core.v1.EventSource"adeprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. +¶ + regarding¨ +0#/definitions/io.k8s.api.core.v1.ObjectReference"óregarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object. +Ÿ +series” +3#/definitions/io.k8s.api.events.v1beta1.EventSeries"]series is data about the Event series this event represents or nil if it's a singleton Event. +½ +note´"¦note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.² string -B -name:"-Name is the name of resource being referenced² + +reportingInstance¬"žreportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.² string -Ü -,io.k8s.api.storage.v1.VolumeAttachmentStatus«"CVolumeAttachmentStatus is the status of a VolumeAttachment request.šattached² -objectÊÌ -æ - attachErrorÖ -/#/definitions/io.k8s.api.storage.v1.VolumeError"¢The last error encountered during attach operation, if any. This field must only be set by the entity completing the attach operation, i.e. the external-attacher. -± -attached¤"•Indicates the volume is successfully attached. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.² -boolean -à -attachmentMetadata¬"ŽUpon successful attach, this field is populated with any information returned by the attach operation that must be passed into subsequent WaitForAttach or Mount calls. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.ª - ² -string² -object -æ - detachErrorÖ -/#/definitions/io.k8s.api.storage.v1.VolumeError"¢The last error encountered during detach operation, if any. This field must only be set by the entity completing the detach operation, i.e. the external-attacher. -Ý -$io.k8s.api.storage.v1beta1.CSIDriver´"¹CSIDriver captures information about a Container Storage Interface (CSI) volume driver deployed on the cluster. CSI drivers do not need to create the CSIDriver object directly. Instead they may use the cluster-driver-registrar sidecar container. When deployed with a CSI driver it automatically creates a CSIDriver object representing the driver. Kubernetes attach detach controller uses this object to determine whether attach is required. Kubelet uses this object to determine whether pod information needs to be passed on mount. CSIDriver objects are non-namespaced.šspec² -objectÊý +† +type~"qtype is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable.² +stringú] +x-kubernetes-group-version-kind:8- group: events.k8s.io + kind: Event + version: v1beta1 + +î +?io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatusª² +objectÊ› +˜ + certificateˆbyte"OIf request was approved, the controller will place the issued certificate here.² +stringú# +x-kubernetes-list-type atomic + +ý + +conditionsî">Conditions applied to the request, such as approval or denial.² +arrayºT +R +P#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestConditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap + +® + +"io.k8s.api.core.v1.ComponentStatus‡ +"yComponentStatus (and ComponentStatusList) holds the cluster validation info. Deprecated: This API is deprecated in v1.19+² +objectÊ£ ¾ apiVersion¯"¡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² string +Î + +conditions¿"%List of component conditions observed² +arrayº7 +5 +3#/definitions/io.k8s.api.core.v1.ComponentConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge + ¹ kind°"¢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² string -™ -metadataŒ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ÊStandard object metadata. metadata.Name indicates the name of the CSI driver that this object refers to; it MUST be the same name returned by the CSI GetPluginName() call for that driver. The driver name must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and alphanumerics between. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -b -specZ -6#/definitions/io.k8s.api.storage.v1beta1.CSIDriverSpec" Specification of the CSI Driver.úb -x-kubernetes-group-version-kind?=- group: storage.k8s.io - kind: CSIDriver - version: v1beta1 +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúW +x-kubernetes-group-version-kind42- group: "" + kind: ComponentStatus + version: v1 -Ú -8io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec"¢SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² -objectÊé -Æ -extra¼"Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.ª -² -arrayº - ² -string² -object -M -groupD"(Groups is the groups you're testing for.² +˜ +*io.k8s.api.core.v1.NodeSelectorRequirementé"wA node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.škeyšoperator² +objectÊÐ +û +valuesð"ÓAn array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.² arrayº ² string -¯ -nonResourceAttributes• -D#/definitions/io.k8s.api.authorization.v1beta1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request -¯ -resourceAttributes˜ -A#/definitions/io.k8s.api.authorization.v1beta1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request -> -uid7"*UID information about the requesting user.² -string -ª -user¡"“User is the user you're testing for. If you specify "User" but not "Group", then is it interpreted as "What if User were not a member of any groups² -string -ë -io.k8s.api.core.v1.EventSourceÈ".EventSource contains information for an event.² -objectʉ -F - component9",Component from which the event is generated.² -string ? -host7"*Node name on which the event is generated.² -string -æ -(io.k8s.api.core.v1.GlusterfsVolumeSource¹"‹Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.š endpointsšpath² -objectʉ -« - endpoints"EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² +key8"+The label key that the selector applies to.² string -ƒ -path{"nPath is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² +Ž +operator"tRepresents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.² string -Ò -readOnlyÅ"¶ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² -boolean -¨ -#io.k8s.api.core.v1.NodeConfigSource€"uNodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.² -objectÊ{ -y - configMapl -:#/definitions/io.k8s.api.core.v1.ConfigMapNodeConfigSource".ConfigMap is a reference to a Node's ConfigMap -Œ -#io.k8s.api.core.v1.NodeSelectorTermä"¥A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.² -objectÊ­ -– -matchExpressions"6A list of node selector requirements by node's labels.² -arrayº< -: -8#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement -‘ - matchFields"6A list of node selector requirements by node's fields.² -arrayº< -: -8#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement ’5 'io.k8s.api.core.v1.PersistentVolumeSpecæ4"APersistentVolumeSpec is the specification of a persistent volume.² objectÊ”4 +¥ +portworxVolume’ +5#/definitions/io.k8s.api.core.v1.PortworxVolumeSource"YPortworxVolume represents a portworx volume attached and mounted on kubelets host machine ¦ scaleIOš >#/definitions/io.k8s.api.core.v1.ScaleIOPersistentVolumeSource"XScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.  storageosó @#/definitions/io.k8s.api.core.v1.StorageOSPersistentVolumeSource"®StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://examples.k8s.io/volumes/storageos/README.md -¼ - accessModes¬"AccessModes contains all ways the volume can be mounted. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes² +î + mountOptionsÝ"ÀA list of mount options, e.g. ["ro", "soft"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options² arrayº ² string -© - azureFile› -@#/definitions/io.k8s.api.core.v1.AzureFilePersistentVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod. +Á +nfs¹ +0#/definitions/io.k8s.api.core.v1.NFSVolumeSource"„NFS represents an NFS mount on the host. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs – cephfs‹ =#/definitions/io.k8s.api.core.v1.CephFSPersistentVolumeSource"JCephFS represents a Ceph FS mount on the host that shares a pod's lifetime -| -locals -2#/definitions/io.k8s.api.core.v1.LocalVolumeSource"=Local represents directly-attached storage with node affinity -Ó -rbdË -:#/definitions/io.k8s.api.core.v1.RBDPersistentVolumeSource"ŒRBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md -Ú -cinderÏ -=#/definitions/io.k8s.api.core.v1.CinderPersistentVolumeSource"Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md -õ -hostPathè -5#/definitions/io.k8s.api.core.v1.HostPathVolumeSource"®HostPath represents a directory on the host. Provisioned by a developer or tester. This is useful for single-node development and testing only! On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath -¥ -portworxVolume’ -5#/definitions/io.k8s.api.core.v1.PortworxVolumeSource"YPortworxVolume represents a portworx volume attached and mounted on kubelets host machine -ð -capacityã"“A description of the persistent volume's resources and capacity. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacityª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -… - glusterfs÷ -@#/definitions/io.k8s.api.core.v1.GlusterfsPersistentVolumeSource"²Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod. Provisioned by an admin. More info: https://examples.k8s.io/volumes/glusterfs/README.md -Î -photonPersistentDiskµ -A#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource"pPhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine -– -csiŽ -:#/definitions/io.k8s.api.core.v1.CSIPersistentVolumeSource"PCSI represents storage that is handled by an external CSI driver (Beta feature). -Õ -iscsiË -<#/definitions/io.k8s.api.core.v1.ISCSIPersistentVolumeSource"ŠISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. -¨ -storageClassName“"…Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.² -string +½ +gcePersistentDisk§ +>#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource"äGCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk +ä + nodeAffinityÓ +3#/definitions/io.k8s.api.core.v1.VolumeNodeAffinity"›NodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume. ± awsElasticBlockStore˜ A#/definitions/io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource"ÒAWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore Ö claimRefÉ 0#/definitions/io.k8s.api.core.v1.ObjectReference"”ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim. Expected to be non-nil when bound. claim.VolumeName is the authoritative bind between PV and PVC. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding -ä - nodeAffinityÓ -3#/definitions/io.k8s.api.core.v1.VolumeNodeAffinity"›NodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume. -¼ -persistentVolumeReclaimPolicyš"ŒWhat happens to a persistent volume when released from its claim. Valid options are Retain (default for manually created PersistentVolumes), Delete (default for dynamically provisioned PersistentVolumes), and Recycle (deprecated). Recycle must be supported by the volume plugin underlying this PersistentVolume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming² -string -É - -volumeModeº"¬volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.² -string ª fc£ /#/definitions/io.k8s.api.core.v1.FCVolumeSource"pFC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. í flockerá 4#/definitions/io.k8s.api.core.v1.FlockerVolumeSource"¨Flocker represents a Flocker volume attached to a kubelet's host machine and exposed to the pod for its usage. This depends on the Flocker control service being running -Á -nfs¹ -0#/definitions/io.k8s.api.core.v1.NFSVolumeSource"„NFS represents an NFS mount on the host. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs +… + glusterfs÷ +@#/definitions/io.k8s.api.core.v1.GlusterfsPersistentVolumeSource"²Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod. Provisioned by an admin. More info: https://examples.k8s.io/volumes/glusterfs/README.md +| +locals +2#/definitions/io.k8s.api.core.v1.LocalVolumeSource"=Local represents directly-attached storage with node affinity +É + +volumeModeº"¬volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.² +string +ð +capacityã"“A description of the persistent volume's resources and capacity. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacityª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +Ú +cinderÏ +=#/definitions/io.k8s.api.core.v1.CinderPersistentVolumeSource"Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md  quobyteƒ 4#/definitions/io.k8s.api.core.v1.QuobyteVolumeSource"KQuobyte represents a Quobyte mount on the host that shares a pod's lifetime -¬ - vsphereVolumeš -?#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"WVsphereVolume represents a vSphere volume attached and mounted on kubelets host machine œ azureDiskŽ 6#/definitions/io.k8s.api.core.v1.AzureDiskVolumeSource"TAzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. +Õ +iscsiË +<#/definitions/io.k8s.api.core.v1.ISCSIPersistentVolumeSource"ŠISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. +¨ +storageClassName“"…Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.² +string +¼ + accessModes¬"AccessModes contains all ways the volume can be mounted. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes² +arrayº + ² +string +õ +hostPathè +5#/definitions/io.k8s.api.core.v1.HostPathVolumeSource"®HostPath represents a directory on the host. Provisioned by a developer or tester. This is useful for single-node development and testing only! On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath +Ó +rbdË +:#/definitions/io.k8s.api.core.v1.RBDPersistentVolumeSource"ŒRBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md ¶ flexVolume§ ;#/definitions/io.k8s.api.core.v1.FlexPersistentVolumeSource"hFlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. -î - mountOptionsÝ"ÀA list of mount options, e.g. ["ro", "soft"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options² -arrayº - ² -string -½ -gcePersistentDisk§ ->#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource"äGCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk -¨ -%io.k8s.api.core.v1.PodDNSConfigOption"9PodDNSConfigOption defines DNS resolver options of a pod.² -objectÊ6 - -name" Required.² -string - -value ² +¼ +persistentVolumeReclaimPolicyš"ŒWhat happens to a persistent volume when released from its claim. Valid options are Retain (default for manually created PersistentVolumes), Delete (default for dynamically provisioned PersistentVolumes), and Recycle (deprecated). Recycle must be supported by the volume plugin underlying this PersistentVolume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming² string -« -io.k8s.api.core.v1.SecretList‰ "SecretList is a list of Secret.šitems² -objectÊü +Î +photonPersistentDiskµ +A#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource"pPhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine +¬ + vsphereVolumeš +?#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"WVsphereVolume represents a vSphere volume attached and mounted on kubelets host machine +© + azureFile› +@#/definitions/io.k8s.api.core.v1.AzureFilePersistentVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod. +– +csiŽ +:#/definitions/io.k8s.api.core.v1.CSIPersistentVolumeSource"PCSI represents storage that is handled by an external CSI driver (Beta feature). +¶ +io.k8s.api.core.v1.Pod› "wPod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.² +objectÊÅ + ¾ apiVersion¯"¡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² string -ª -items "fItems is a list of secret objects. More info: https://kubernetes.io/docs/concepts/configuration/secret² -arrayº+ -) -'#/definitions/io.k8s.api.core.v1.Secret -¹ -kind°"¢Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² +¹ +kind°"¢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² +string +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ö +specÍ +(#/definitions/io.k8s.api.core.v1.PodSpec" Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +— +statusŒ +*#/definitions/io.k8s.api.core.v1.PodStatus"ÝMost recently observed status of the pod. This data may not be up to date. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúK +x-kubernetes-group-version-kind(&- kind: Pod + version: v1 + group: "" + +— +io.k8s.api.core.v1.PodConditionó"DPodCondition contains details for the current condition of this pod.štypešstatus² +objectÊŽ +X +messageM"@Human-readable message indicating details about last transition.² +string +^ +reasonT"GUnique, one-word, CamelCase reason for the condition's last transition.² +string +· +status¬"žStatus is the status of the condition. Can be True, False, Unknown. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² +string +“ +typeŠ"}Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² +string +n + lastProbeTime] +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time""Last time we probed the condition. +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +é +/io.k8s.api.authentication.v1.TokenRequestStatusµ"4TokenRequestStatus is the result of a token request.štokenšexpirationTimestamp² +objectÊÒ +– +expirationTimestamp +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DExpirationTimestamp is the time of expiration of the returned token. +7 +token."!Token is the opaque bearer token.² +string +© +0io.k8s.api.autoscaling.v2beta2.MetricValueStatusô"6MetricValueStatus holds the current value for a metric² +objectÊ­ +ì +averageUtilizationÕint32"¿currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.² +integer +· + averageValue¦ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"gaverageValue is the current value of the average of the metric across all relevant pods (as a quantity) + +valuex +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"9value is the current value of the metric (as a quantity). +¼ +!io.k8s.api.core.v1.SELinuxOptions–"NodeSpec describes the attributes that a node is created with.² -objectÊŸ -Ö - configSourceÅ -1#/definitions/io.k8s.api.core.v1.NodeConfigSource"If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field -† +A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. -externalIDx"kDeprecated. Not all kubelets will set this field. Remove field after 1.13. see: https://issues.k8s.io/61966² +Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² string -Q -podCIDRF"9PodCIDR represents the pod IP range assigned to the node.² +à +caBundle¶byte"¢caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² string -¬ -podCIDRsŸ"ØpodCIDRs represents the IP ranges assigned to the node for usage by Pods on that node. If this field is specified, the 0th entry must match the podCIDR field. It may contain at most 1 value for each of IPv4 and IPv6.² -arrayº - ² -stringú' -x-kubernetes-patch-strategymerge +– +serviceŠ +W#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReference"®service is a reference to the service for this webhook. Either service or url must be specified. - +If the webhook is running within the cluster, then you should use `service`. +ú +Vio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidationŸ"MCustomResourceValidation is a list of validation methods for CustomResources.² +objectÊÁ +¾ +openAPIV3Schemaª +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps"KopenAPIV3Schema is the OpenAPI v3 schema to use for validation and pruning. +š +0io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceå"JAPIResource specifies the name of a resource and whether it is namespaced.šnameš singularNameš +namespacedškindšverbs² +objectÊØ +h -providerIDs"fID of the node assigned by the cloud provider in the format: ://² +shortNamesZ">shortNames is a list of suggested short names of the resource.² +arrayº + ² string -c -taintsY" If specified, the node's taints.² -arrayº* -( -&#/definitions/io.k8s.api.core.v1.Taint -Ï - unschedulable½"®Unschedulable controls node schedulability of new pods. By default, node is schedulable. More info: https://kubernetes.io/docs/concepts/nodes/node/#manual-node-administration² -boolean -œ -$io.k8s.api.core.v1.SecretKeySelectoró",SecretKeySelector selects a key of a Secret.škey² -objectÊ° -V -keyO"BThe key of the secret to select from. Must be a valid secret key.² +Ì +storageVersionHashµ"§The hash value of the storage version, the version this resource is converted to when written to the data store. Value must be treated as opaque by clients. Only equality comparison on the value is valid. This is an alpha feature and may change or be removed in the future. The field is populated by the apiserver only if the StorageVersionHash feature gate is enabled. This field will remain optional even if it graduates.² string -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +« +verbs¡"„verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)² +arrayº + ² string -O -optionalC"5Specify whether the Secret or its key must be defined² -boolean -ž -Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpecÓ"£APIServiceSpec contains information for locating and communicating with a server. Only https is supported, though you are able to disable certificate verification.šgroupPriorityMinimumšversionPriority² -objectÊõ -± -groupPriorityMinimum˜int32"‚GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s² -integer -Í -insecureSkipTLSVerify³"¤InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server. This is strongly discouraged. You should use the CABundle instead.² += +name5"(name is the plural name of the resource.² +string +T + +namespacedF"8namespaced indicates if a resource is namespaced or not.² boolean -ù -serviceí -V#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.ServiceReference"’Service is a reference to the service for this API server. It must communicate on port 443. If the Service is nil, that means the handling for the API groupversion is handled locally on this server. The call will simply delegate to the normal handler chain to be fulfilled. -X -versionM"@Version is the API version this server hosts. For example, "v1"² +d +kind\"Okind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')² string -ä -versionPriorityÐint32"ºVersionPriority controls the ordering of this API version inside of its group. Must be greater than zero. The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10). Since it's inside of a group, the number can be small, probably in the 10s. In case of equal version priorities, the version string will be used to compute the order inside a group. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² -integer -ì -caBundleßbyte"¥CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.² -stringú# -x-kubernetes-list-type atomic +ž + singularName"ÿsingularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.² +string +‰ +versioný"ïversion is the preferred version of the resource. Empty implies the version of the containing resource list For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)".² +string +} -C -group:"-Group is the API group name this server hosts² +categorieso"Scategories is a list of the grouped resources this resource belongs to (e.g. 'all')² +arrayº + ² string Ç -#io.k8s.api.autoscaling.v1.ScaleSpecŸ":ScaleSpec describes the attributes of a scale subresource.² -objectÊU -S -replicasGint32"2desired number of instances for the scaled object.² -integer -€ -/io.k8s.api.autoscaling.v2beta2.PodsMetricStatusÌ"šPodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).šmetricšcurrent² -objectÊ -ƒ -metricy -=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector -„ -currenty ->#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric -” -%io.k8s.api.core.v1.NamespaceConditionê"=NamespaceCondition contains details about state of namespace.štypešstatus² -objectÊŒ -L -statusB"5Status of the condition, one of True, False, Unknown.² +group½"¯group is the preferred group of the resource. Empty implies the group of the containing resource list. For subresources, this may have a different value, for example: Scale".² string -< -type4"'Type of namespace controller condition.² +Ÿ +=io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirementÝ"xA label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.škeyšoperator² +objectÊà +š +key’"2key is the label key that the selector applies to.² +stringú' +x-kubernetes-patch-strategymerge +ú& +x-kubernetes-patch-merge-keykey + +Ž +operator"toperator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.² string -O -lastTransitionTime9 -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time - -message ² +’ +values‡"êvalues is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.² +arrayº + ² string - -reason ² +µ +6io.k8s.api.authorization.v1beta1.NonResourceAttributesú"{NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface² +objectÊo +8 +path0"#Path is the URL path of the request² string -º -io.k8s.api.rbac.v1.ClusterRole— "ˆClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.² -objectÊ -¹ -kind°"¢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² +3 +verb+"Verb is the standard HTTP verb² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. -{ -rulesr"4Rules holds all the PolicyRules for this ClusterRole² -arrayº/ -- -+#/definitions/io.k8s.api.rbac.v1.PolicyRule -© -aggregationRule• -0#/definitions/io.k8s.api.rbac.v1.AggregationRule"àAggregationRule is an optional field that describes how to build the Rules for this ClusterRole. If AggregationRule is set, then the Rules are controller managed and direct changes to Rules will be stomped by the controller. -¾ - -apiVersion¯"¡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² -stringúj -x-kubernetes-group-version-kindGE- group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - -¶ +° +Xio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceStatusÓ"ÅCustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza² +object +Ð -!io.k8s.api.apps.v1.ReplicaSetSpec -"4ReplicaSetSpec is the specification of a ReplicaSet.šselector² -objectÊÀ -ƒ -minReadySecondsïint32"ÙMinimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)² -integer -¡ -replicas”int32"þReplicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#what-is-a-replicationcontroller² +.io.k8s.api.autoscaling.v2beta2.HPAScalingRules +"”HPAScalingRules configures the scaling behavior for one direction. These Rules are applied after calculating DesiredReplicas from metrics for the HPA. They can limit the scaling velocity by specifying scaling policies. They can prevent flapping by specifying the stabilization window, so that the number of replicas is not set instantly, instead, the safest value from the stabilization window is chosen.² +objectÊ÷ +Ì +stabilizationWindowSeconds­int32"—StabilizationWindowSeconds is the number of seconds for which past recommendations should be considered while scaling up or scaling down. StabilizationWindowSeconds must be greater than or equal to zero and less than or equal to 3600 (one hour). If not set, use the default values: - For scale up: 0 (i.e. no stabilization is done). - For scale down: 300 (i.e. the stabilization window is 300 seconds long).² integer -ý -selectorð -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"«Selector is a label query over pods that should match the replica count. Label keys and values that must match in order to be controlled by this replica set. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors -“ -template† -0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"ÑTemplate is the object that describes the pod that will be created if insufficient replicas are detected. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template -’ -1io.k8s.api.autoscaling.v2beta1.ObjectMetricStatusÜ"ŽObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).štargetš -metricNameš currentValue² -objectÊ— -· - averageValue¦ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"gaverageValue is the current value of the average of the metric across all relevant pods (as a quantity) - - currentValue -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"@currentValue is the current value of the metric (as a quantity). -L - -metricName>"1metricName is the name of the metric in question.² +‘ +policies„"³policies is a list of potential scaling polices which can be used during scaling. At least one policy must be specified, otherwise the HPAScalingRules will be discarded as invalid² +arrayºA +? +=#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy +‘ + selectPolicy€"sselectPolicy is used to specify which policy should be used. If not set, the default value MaxPolicySelect is used.² string -÷ -selectorê -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¥selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics. -€ -targetv -H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"*target is the described Kubernetes object. -æ -8io.k8s.api.networking.v1.IngressClassParametersReference©"}IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.škindšname² -objectÊ -C -name;".Name is the name of resource being referenced.² +Ò +4io.k8s.api.core.v1.ScopedResourceSelectorRequirement™"A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.š scopeNamešoperator² +objectÊà +ƒ +operatorw"jRepresents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.² string - - namespace´"¦Namespace is the namespace of the resource being referenced. This field is required when scope is set to "Namespace" and must be unset when scope is set to "Cluster".² +M + scopeName@"3The name of the scope that the selector applies to.² string -Þ -scopeÔ"ÆScope represents if this refers to a cluster or namespace scoped resource. This may be set to "Cluster" (default) or "Namespace". Field can be enabled with IngressClassNamespacedParams feature gate.² +ˆ +valuesý"àAn array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.² +arrayº + ² string -Ú -apiGroupÍ"¿APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.² +À +Wio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScaleä "^CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.šspecReplicasPathšstatusReplicasPath² +objectÊÍ +á +labelSelectorPathË"½labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.² string -C -kind;".Kind is the type of resource being referenced.² +ã +specReplicasPathÎ"ÀspecReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.² string -¡ - io.k8s.api.core.v1.EnvFromSourceü":EnvFromSource represents the source of a set of ConfigMaps² -objectʱ -c - configMapRefS -3#/definitions/io.k8s.api.core.v1.ConfigMapEnvSource"The ConfigMap to select from -n -prefixd"WAn optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.² +€ +statusReplicasPathé"ÛstatusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.² string -Z - secretRefM -0#/definitions/io.k8s.api.core.v1.SecretEnvSource"The Secret to select from -¨A -/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMetaô@"lObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.² -objectÊ÷? -Þ - -finalizersÏ"ˆMust be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed. Finalizers may be processed and removed in any order. Order is NOT enforced because it introduces significant risk of stuck finalizers. finalizers is a shared field, any actor with permission can reorder it. If the finalizer list is processed in order, then this can lead to a situation in which the component responsible for the first finalizer in the list is waiting for a signal (field value, external system, or other) produced by a component responsible for a finalizer later in the list, resulting in a deadlock. Without enforced ordering finalizers are free to order amongst themselves and are not vulnerable to ordering changes in the list.² +ì +*io.k8s.api.authentication.v1beta1.UserInfo½"ZUserInfo holds the information about the user needed to implement the user.Info interface.² +objectÊÒ +n +extrae"9Any additional information provided by the authenticator.ª +² arrayº ² -stringú' -x-kubernetes-patch-strategymerge - -‚ -labels÷"ÙMap of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labelsª - ² string² object -õ -nameì"ÞName must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names² +Q +groupsG"+The names of groups this user is a part of.² +arrayº + ² string -¢ - namespace”"†Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the "default" namespace, but "default" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. +® +uid¦"˜A unique value that identifies this user across time. If this user is deleted and another user by the same name is added, they will have different UIDs.² +string +\ +usernameP"CThe name that uniquely identifies this user among all active users.² +string +ü +5io.k8s.api.autoscaling.v1.CrossVersionObjectReferenceÂ"bCrossVersionObjectReference contains enough information to let you identify the referred resource.škindšname² +objectÊÁ +˜ +kind"Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"² +string +l +named"WName of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names² +string +6 -Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces² +apiVersion("API version of the referent² string -ø -ownerReferencesä"¼List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.² -arrayºE -C -A#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReferenceú' -x-kubernetes-patch-strategymerge -ú& -x-kubernetes-patch-merge-keyuid +Ü +"io.k8s.api.apps.v1.StatefulSetListµ"0StatefulSetList is a collection of StatefulSets.šitems² +objectÊ +¾ -ê -selfLinkÝ"ÏSelfLink is a URL representing this object. Populated by the system. Read-only. +apiVersion¯"¡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² +string +F +items=² +arrayº0 +. +,#/definitions/io.k8s.api.apps.v1.StatefulSet +¹ +kind°"¢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² +string +I +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúY +x-kubernetes-group-version-kind64- group: apps + kind: StatefulSetList + version: v1 -DEPRECATED Kubernetes will stop propagating this field in 1.20 release and the field is planned to be removed in 1.21 release.² +ã +io.k8s.api.storage.v1.CSIDriver¿ "ÎCSIDriver captures information about a Container Storage Interface (CSI) volume driver deployed on the cluster. Kubernetes attach detach controller uses this object to determine whether attach is required. Kubelet uses this object to determine whether pod information needs to be passed on mount. CSIDriver objects are non-namespaced.šspec² +objectÊø +¾ + +apiVersion¯"¡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² string - - clusterName"ÿThe name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.² +¹ +kind°"¢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² +string +™ +metadataŒ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ÊStandard object metadata. metadata.Name indicates the name of the CSI driver that this object refers to; it MUST be the same name returned by the CSI GetPluginName() call for that driver. The driver name must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and alphanumerics between. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +] +specU +1#/definitions/io.k8s.api.storage.v1.CSIDriverSpec" Specification of the CSI Driver.ú] +x-kubernetes-group-version-kind:8- group: storage.k8s.io + kind: CSIDriver + version: v1 + +½ +-io.k8s.api.extensions.v1beta1.HTTPIngressPath‹ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² +objectÊ +¤ +backend˜ +:#/definitions/io.k8s.api.extensions.v1beta1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. +ž +path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² string ¶ - generateName¥"—GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server. +pathType©"›PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is + done on a path element by element basis. A path element refers is the + list of labels in the path split by the '/' separator. A request is a + match for path p if every p is an element-wise prefix of p of the + request path. Note that if the last element of the path is a substring + of the last element in request path, it is not a match (e.g. /foo/bar + matches /foo/bar/baz, but does not match /foo/barbaz). +* ImplementationSpecific: Interpretation of the Path matching is up to + the IngressClass. Implementations can treat this as a separate PathType + or treat it identically to Prefix or Exact path types. +Implementations are required to support all path types. Defaults to ImplementationSpecific.² +string +¤ -If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header). +=io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationListâ "OPriorityLevelConfigurationList is a list of PriorityLevelConfiguration objects.šitems² +objectÊñ +â +metadataÕ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"•`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¾ -Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency² +apiVersion¯"¡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² string -î -creationTimestampØ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"œCreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. +Œ +items‚"(`items` is a list of request-priorities.² +arrayºK +I +G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration +¹ +kind°"¢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² +stringú… +x-kubernetes-group-version-kindb`- group: flowcontrol.apiserver.k8s.io + kind: PriorityLevelConfigurationList + version: v1beta1 -Populated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -ð -deletionGracePeriodSecondsÑint64"»Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.² -integer -¤ -deletionTimestampŽ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"Ò -DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field, once the finalizers list is empty. As long as the finalizers list contains items, deletion is blocked. Once the deletionTimestamp is set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested. + +(io.k8s.api.core.v1.ContainerStateWaitingã"8ContainerStateWaiting is a waiting state of a container.² +objectÊš +O +messageD"7Message regarding why the container is not yet running.² +string +G +reason="0(brief) reason the container is not yet running.² +string +» +#io.k8s.api.core.v1.PersistentVolume“ "±PersistentVolume (PV) is a storage resource provisioned by an administrator. It is analogous to a node. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes² +objectÊõ -Populated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -‘ -resourceVersioný"ïAn opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources. +¾ -Populated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency² +apiVersion¯"¡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² string -³ -uid«"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. - -Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids² +¹ +kind°"¢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² string -À - annotations°"’Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotationsª - ² -string² -object -’ +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Š +spec +5#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec"ÇSpec defines a specification of a persistent volume owned by the cluster. Provisioned by an administrator. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumes +“ +statusˆ +7#/definitions/io.k8s.api.core.v1.PersistentVolumeStatus"ÌStatus represents the current information/status for the persistent volume. Populated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumesúX +x-kubernetes-group-version-kind53- group: "" + kind: PersistentVolume + version: v1 -generationƒint64"nA sequence number representing a specific generation of the desired state. Populated by the system. Read-only.² -integer -ƒ - managedFieldsñ"˜ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like "ci-cd". The set of fields is always in the version that the workflow used when modifying the object.² -arrayºI -G -E#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry - -!io.k8s.api.apps.v1.DeploymentListç"(DeploymentList is a list of Deployments.šitems² -objectÊË +Á +>io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehaviorþ"™HorizontalPodAutoscalerBehavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively).² +objectÊÓ +° + scaleDown¢ +<#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules"áscaleDown is scaling policy for scaling Down. If not set, the default value is to allow to scale down to minReplicas pods, with a 300 second stabilization window (i.e., the highest recommendation for the last 300sec is used). + +scaleUp‘ +<#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules"ÐscaleUp is scaling policy for scaling Up. If not set, the default value is the higher of: + * increase no more than 4 pods per 60 seconds + * double the number of pods per 60 seconds +No stabilization is used. +þ +$io.k8s.api.batch.v1beta1.CronJobListÕ")CronJobList is a collection of cron jobs.šitems² +objectʵ +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ¾ apiVersion¯"¡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² string h -items_"!Items is the list of Deployments.² -arrayº/ -- -+#/definitions/io.k8s.api.apps.v1.Deployment +items_"items is the list of CronJobs.² +arrayº2 +0 +.#/definitions/io.k8s.api.batch.v1beta1.CronJob ¹ kind°"¢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² +stringú[ +x-kubernetes-group-version-kind86- group: batch + kind: CronJobList + version: v1beta1 + +Õ +!io.k8s.api.core.v1.LimitRangeItem¯ "SLimitRangeItem defines a min/max usage limit for any resource that matches on kind.štype² +objectÊÄ +² +default¦"WDefault resource requirement limit value by resource name if resource limit is omitted.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +Ó +defaultRequestÀ"qDefaultRequest is the default resource requirement request value by resource name if resource request is omitted.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +‹ +maxƒ"4Max usage constraints on this kind by resource name.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +× +maxLimitRequestRatio¾"îMaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +‹ +minƒ"4Min usage constraints on this kind by resource name.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +A +type9",Type of resource that this limit applies to.² string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úX -x-kubernetes-group-version-kind53- group: apps - kind: DeploymentList - version: v1 +Ä +"io.k8s.api.storage.v1.StorageClass"ãStorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned. -Í -3io.k8s.api.authorization.v1.SubjectAccessReviewSpec•"¢SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² -objectÊá -N -groupsD"(Groups is the groups you're testing for.² +StorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.š provisioner² +objectÊ· +n +allowVolumeExpansionV"HAllowVolumeExpansion shows whether the storage class allow volume expand² +boolean +¾ + +apiVersion¯"¡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² +string +ì + mountOptionsÛ"¾Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. ["ro", "soft"]. Not validated - mount of the PVs will simply fail if one is invalid.² arrayº ² string -ª -nonResourceAttributes -?#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request -ª -resourceAttributes“ -<#/definitions/io.k8s.api.authorization.v1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request -> -uid7"*UID information about the requesting user.² +ø +volumeBindingModeâ"ÔVolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.² string -« -user¢"”User is the user you're testing for. If you specify "User" but not "Groups", then is it interpreted as "What if User were not a member of any groups² +Š +allowedTopologiesô"«Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.² +arrayº9 +7 +5#/definitions/io.k8s.api.core.v1.TopologySelectorTerm +¹ +kind°"¢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² string -Æ -extra¼"Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.ª -² -arrayº +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +‘ + +parameters‚"eParameters holds the parameters for the provisioner that should create volumes of this storage class.ª ² string² object -È -&io.k8s.api.batch.v1beta1.CronJobStatus"9CronJobStatus represents the current state of a cron job.² -objectÊÓ -¡ -active–"-A list of pointers to currently running jobs.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ObjectReferenceú# -x-kubernetes-list-type atomic - -– -lastScheduleTime -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"FInformation when was the last time the job was successfully scheduled. -“ -lastSuccessfulTime} -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"BInformation when was the last time the job successfully completed. -ž -8io.k8s.api.certificates.v1.CertificateSigningRequestSpecá"?CertificateSigningRequestSpec contains the certificate request.šrequestš -signerName² -objectÊú -„ -usagesù"¶usages specifies a set of key usages requested in the issued certificate. +N + provisioner?"2Provisioner indicates the type of the provisioner.² +string +— + reclaimPolicy…"xDynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.² +stringú` +x-kubernetes-group-version-kind=;- group: storage.k8s.io + kind: StorageClass + version: v1 -Requests for TLS client certificates typically request: "digital signature", "key encipherment", "client auth". +  -Requests for TLS serving certificates typically request: "key encipherment", "digital signature", "server auth". +=io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceÞ "[APIService represents a server for a particular GroupVersion. Name must be "version.group".² +objectʉ +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +¢ +spec™ +O#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceSpec"FSpec contains information for locating and communicating with a server +— +statusŒ +Q#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus"7Status contains derived information about an API server +¾ -Valid values are: - "signing", "digital signature", "content commitment", - "key encipherment", "key agreement", "data encipherment", - "cert sign", "crl sign", "encipher only", "decipher only", "any", - "server auth", "client auth", - "code signing", "email protection", "s/mime", - "ipsec end system", "ipsec tunnel", "ipsec user", - "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"² -arrayº - ² -stringú# -x-kubernetes-list-type atomic +apiVersion¯"¡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² +string +¹ +kind°"¢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² +stringúf +x-kubernetes-group-version-kindCA- kind: APIService + version: v1 + group: apiregistration.k8s.io -¤ -username—"‰username contains the name of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² +Ó +"io.k8s.api.apps.v1.StatefulSetSpec¬"8A StatefulSetSpec is the specification of a StatefulSet.šselectorštemplateš serviceName² +objectÊ¿ + +replicas‚int32"ìreplicas is the desired number of replicas of the given Template. These are replicas in the sense that they are instantiations of the same Template, but individual replicas also have a consistent identity. If unspecified, defaults to 1.² +integer +­ +revisionHistoryLimit”int32"þrevisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.² +integer +¨ +selector› +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Öselector is a label query over pods that should match the replica count. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors +û + serviceNameë"ÝserviceName is the name of the service that governs this StatefulSet. This service must exist before the StatefulSet, and is responsible for the network identity of the set. Pods get DNS/hostnames that follow the pattern: pod-specific-string.serviceName.default.svc.cluster.local where "pod-specific-string" is managed by the StatefulSet controller.² string -Å -extra»"Žextra contains extra attributes of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.ª -² -arrayº - ² -string² -object -Ý -groupsÒ"groups contains group membership of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² +¬ +templateŸ +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"êtemplate is the object that describes the pod that will be created if insufficient replicas are detected. Each pod stamped out by the StatefulSet will fulfill this Template, but have a unique identity from the rest of the StatefulSet. +å +updateStrategyÒ +:#/definitions/io.k8s.api.apps.v1.StatefulSetUpdateStrategy"“updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template. +þ +volumeClaimTemplateså"›volumeClaimTemplates is a list of claims that pods are allowed to reference. The StatefulSet controller is responsible for mapping network identities to claims in a way that maintains the identity of a pod. Every claim in this list must have at least one matching (by name) volumeMount in one container in the template. A claim in this list takes precedence over any volumes in the template, with the same name.² +arrayº: +8 +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim +¹ +podManagementPolicy¡"“podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.² +string +¶ +,io.k8s.api.authentication.v1.TokenReviewSpec…"ETokenReviewSpec is a description of the token authentication request.² +objectʯ +ó + audienceså"ÈAudiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.² arrayº ² -stringú# -x-kubernetes-list-type atomic - -ò -requestæbyte"¬request contains an x509 certificate signing request encoded in a "CERTIFICATE REQUEST" PEM block. When serialized as JSON or YAML, the data is additionally base64-encoded.² -stringú# -x-kubernetes-list-type atomic - - - -signerName"ósignerName indicates the requested signer, and is a qualified name. - -List/watch requests for CertificateSigningRequests can filter on this field using a "spec.signerName=NAME" fieldSelector. - -Well-known Kubernetes signers are: - 1. "kubernetes.io/kube-apiserver-client": issues client certificates that can be used to authenticate to kube-apiserver. - Requests for this signer are never auto-approved by kube-controller-manager, can be issued by the "csrsigning" controller in kube-controller-manager. - 2. "kubernetes.io/kube-apiserver-client-kubelet": issues client certificates that kubelets use to authenticate to kube-apiserver. - Requests for this signer can be auto-approved by the "csrapproving" controller in kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. - 3. "kubernetes.io/kubelet-serving" issues serving certificates that kubelets use to serve TLS endpoints, which kube-apiserver can connect to securely. - Requests for this signer are never auto-approved by kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. - -More details are available at https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers +string +7 +token."!Token is the opaque bearer token.² +string +† +io.k8s.api.core.v1.ServicePortã"3ServicePort contains information on service's port.šport² +objectʘ +â -Custom signerNames can also be specified. The signer defines: - 1. Trust distribution: how trust (CA bundles) are distributed. - 2. Permitted subjects: and behavior when a disallowed subject is requested. - 3. Required, permitted, or forbidden x509 extensions in the request (including whether subjectAltNames are allowed, which types, restrictions on allowed values) and behavior when a disallowed extension is requested. - 4. Required, permitted, or forbidden key usages / extended key usages. - 5. Expiration/certificate lifetime: whether it is fixed by the signer, configurable by the admin. - 6. Whether or not requests for CA certificates are allowed.² +targetPortÓ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"‘Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service +½ + appProtocol­"ŸThe application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.² string -™ -uid‘"ƒuid contains the uid of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² +² +name©"›The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. When considering the endpoints for a Service, this must match the 'name' field in the EndpointPort. Optional if only one ServicePort is defined on this service.² string -‡ -io.k8s.api.core.v1.Endpointsæ"ýEndpoints is a collection of endpoints that implement the actual service. Example: - Name: "mysvc", - Subsets: [ - { - Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], - Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] - }, - { - Addresses: [{"ip": "10.10.3.3"}], - Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] - }, - ]² -objectʃ -® -subsets¢"ßThe set of all endpoints is the union of all subsets. Addresses are placed into subsets according to the IPs they share. A single address with multiple ports, some of which are ready and some of which are not (because they come from different containers) will result in the address being displayed in different subsets for the different ports. No address will appear in both Addresses and NotReadyAddresses in the same subset. Sets of addresses and ports that comprise a service.² -arrayº3 -1 -/#/definitions/io.k8s.api.core.v1.EndpointSubset +‚ +nodePortõint32"ßThe port on each node on which this service is exposed when type is NodePort or LoadBalancer. Usually assigned by the system. If a value is specified, in-range, and not in use it will be used, otherwise the operation will fail. If not specified, a port will be allocated if this Service requires one. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport² +integer +K +portCint32".The port that will be exposed by this service.² +integer +j +protocol^"QThe IP protocol for this port. Supports "TCP", "UDP", and "SCTP". Default is TCP.² +string +ç +*io.k8s.api.flowcontrol.v1beta1.UserSubject¸"=UserSubject holds detailed information for user-kind subject.šname² +objectÊd +b +nameZ"M`name` is the username that matches, or "*" to match all usernames. Required.² +string +Ÿ +$io.k8s.api.node.v1beta1.RuntimeClassö"ØRuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are (currently) manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://git.k8s.io/enhancements/keps/sig-node/runtime-class.mdšhandler² +objectÊ ¾ apiVersion¯"¡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² string +Ð +handlerÄ"¶Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called "runc" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.² +string ¹ kind°"¢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² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúQ -x-kubernetes-group-version-kind.,- kind: Endpoints - version: v1 - group: "" +µ +metadata¨ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +ô +overheadç +.#/definitions/io.k8s.api.node.v1beta1.Overhead"´Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature. +› -¶ -*io.k8s.api.storage.v1.VolumeAttachmentList‡ "AVolumeAttachmentList is a collection of VolumeAttachment objects.šitems² -objectÊ -v -itemsm"&Items is the list of VolumeAttachments² -arrayº8 -6 -4#/definitions/io.k8s.api.storage.v1.VolumeAttachment +schedulingŒ +0#/definitions/io.k8s.api.node.v1beta1.Scheduling"×Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.úb +x-kubernetes-group-version-kind?=- group: node.k8s.io + kind: RuntimeClass + version: v1beta1 + +Ø +io.k8s.api.rbac.v1.Role¼"hRole is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.² +objectÊÝ +¾ + +apiVersion¯"¡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² +string ¹ kind°"¢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² string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +t +rulesk"-Rules holds all the PolicyRules for this Role² +arrayº/ +- ++#/definitions/io.k8s.api.rbac.v1.PolicyRuleúc +x-kubernetes-group-version-kind@>- version: v1 + group: rbac.authorization.k8s.io + kind: Role + +µ +]io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatusÓ"ÅCustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza² +object +à +?io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerConditionÿ"eHorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.štypešstatus² +objectÊù +« +lastTransitionTime” +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"YlastTransitionTime is the last time the condition transitioned from one status to another +g +message\"Omessage is a human-readable explanation containing details about the transition² +string +P +reasonF"9reason is the reason for the condition's last transition.² +string +S +statusI" beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² -integer -ì -caBundleßbyte"¥CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.² -stringú# -x-kubernetes-list-type atomic +¹ +kind°"¢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² +string +ß +metadataÒ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"If the Labels of a ReplicationController are empty, they are defaulted to be the same as the Pod(s) that the replication controller manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Œ +specƒ +:#/definitions/io.k8s.api.core.v1.ReplicationControllerSpec"ÄSpec defines the specification of the desired behavior of the replication controller. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Þ +statusÓ +<#/definitions/io.k8s.api.core.v1.ReplicationControllerStatus"’Status is the most recently observed status of the replication controller. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú] +x-kubernetes-group-version-kind:8- group: "" + kind: ReplicationController + version: v1 +… +!io.k8s.api.policy.v1beta1.IDRangeß"6IDRange provides a min/max of an allowed range of IDs.šminšmax² +objectÊŒ +E +min>int64")min is the start of the range, inclusive.² +integer C -group:"-Group is the API group name this server hosts² -string -± -groupPriorityMinimum˜int32"‚GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s² +max<int64"'max is the end of the range, inclusive.² integer -˜ -5io.k8s.api.authorization.v1.SubjectAccessReviewStatusÞ"SubjectAccessReviewStatusšallowed² -objectʪ -c -allowedX"JAllowed is required. True if the action would be allowed, false otherwise.² -boolean -‚ -denied÷"èDenied is optional. True if the action would be denied, otherwise false. If both allowed is false and denied is false, then the authorizer has no opinion on whether to authorize the action. Denied may not be true if Allowed is true.² -boolean -Þ -evaluationErrorÊ"¼EvaluationError is an indication that some error occurred during the authorization check. It is entirely possible to get an error and be able to continue determine authorization status in spite of it. For instance, RBAC can be missing a role, but enough roles are still present and bound to reason about the request.² -string -] -reasonS"FReason is optional. It indicates why a request was allowed or denied.² +— +Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.WebhookClientConfigÁ "WWebhookClientConfig contains the information to make a TLS connection with the webhook.² +objectÊÙ +à +caBundle¶byte"¢caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² string - -:io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReferenceÂ"bCrossVersionObjectReference contains enough information to let you identify the referred resource.škindšname² -objectÊÁ -6 +› +service +\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ServiceReference"®service is a reference to the service for this webhook. Either service or url must be specified. -apiVersion("API version of the referent² -string -˜ -kind"Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"² -string -l -named"WName of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names² +If the webhook is running within the cluster, then you should use `service`. +ò +urlê"Üurl gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified. + +The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. + +Please note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster. + +The scheme must be "https"; the URL must begin with "https://". + +A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. + +Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² string ð 4io.k8s.api.certificates.v1.CertificateSigningRequest·"¬CertificateSigningRequest objects provide a mechanism to obtain x509 certificates by submitting a certificate signing request, and having it asynchronously approved and issued. @@ -33006,13 +32440,6 @@ Kubelets use this API to obtain: This API can be used to request client certificates to authenticate to kube-apiserver (with the "kubernetes.io/kube-apiserver-client" signerName), or to obtain certificates from custom non-Kubernetes signers.šspec² objectÊý -¾ - -apiVersion¯"¡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² -string -¹ -kind°"¢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² -string K metadata? =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta @@ -33021,284 +32448,609 @@ K F#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestSpec"×spec contains the certificate request, and is immutable after creation. Only the request, signerName, and usages fields can be set on creation. Other fields are derived by Kubernetes and cannot be modified by users. ‚ status÷ -H#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestStatus"ªstatus contains information about whether the request is approved or denied, and the certificate issued by the signer, or the failure condition indicating signer failure.úr -x-kubernetes-group-version-kindOM- kind: CertificateSigningRequest - version: v1 - group: certificates.k8s.io - -„ -:io.k8s.api.certificates.v1.CertificateSigningRequestStatusÅ"ŽCertificateSigningRequestStatus contains conditions used to indicate approved/denied/failed status of the request, and the issued certificate.² -objectÊ¥ -Š - certificateú -byte"À -certificate is populated with an issued certificate by the signer after an Approved condition is present. This field is set via the /status subresource. Once populated, this field is immutable. - -If the certificate signing request is denied, a condition of type "Denied" is added and this field remains empty. If the signer cannot issue the certificate, a condition of type "Failed" is added and this field remains empty. +H#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestStatus"ªstatus contains information about whether the request is approved or denied, and the certificate issued by the signer, or the failure condition indicating signer failure. +¾ -Validation requirements: - 1. certificate must contain one or more PEM blocks. - 2. All PEM blocks must have the "CERTIFICATE" label, contain no headers, and the encoded data - must be a BER-encoded ASN.1 Certificate structure as described in section 4 of RFC5280. - 3. Non-PEM content may appear before or after the "CERTIFICATE" PEM blocks and is unvalidated, - to allow for explanatory text as described in section 5.2 of RFC7468. +apiVersion¯"¡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² +string +¹ +kind°"¢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² +stringúr +x-kubernetes-group-version-kindOM- group: certificates.k8s.io + kind: CertificateSigningRequest + version: v1 -If more than one PEM block is present, and the definition of the requested spec.signerName does not indicate otherwise, the first block is the issued certificate, and subsequent blocks should be treated as intermediate certificates and presented in TLS handshakes. +· +"io.k8s.api.core.v1.PodTemplateSpec"QPodTemplateSpec describes the data a pod should have when created from a template² +objectÊ® +Ö +specÍ +(#/definitions/io.k8s.api.core.v1.PodSpec" Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +ì +#io.k8s.api.core.v1.NodeConfigStatusÄ"WNodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource.² +objectÊÜ +Á +active¶ +1#/definitions/io.k8s.api.core.v1.NodeConfigSource"€Active reports the checkpointed config the node is actively using. Active will represent either the current version of the Assigned config, or the current LastKnownGood config, depending on whether attempting to use the Assigned config results in an error. +ù +assignedì +1#/definitions/io.k8s.api.core.v1.NodeConfigSource"¶Assigned reports the checkpointed config the node will try to use. When Node.Spec.ConfigSource is updated, the node checkpoints the associated config payload to local disk, along with a record indicating intended config. The node refers to this record to choose its config checkpoint, and reports this record in Assigned. Assigned only updates in the status after the record has been checkpointed to disk. When the Kubelet is restarted, it tries to make the Assigned config the Active config by loading and validating the checkpointed payload identified by Assigned. +  +error–"ˆError describes any problems reconciling the Spec.ConfigSource to the Active config. Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting to load or validate the Assigned config, etc. Errors may occur at different points while syncing config. Earlier errors (e.g. download or checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error by fixing the config assigned in Spec.ConfigSource. You can find additional information for debugging by searching the error message in the Kubelet log. Error is a human-readable description of the error state; machines can check whether or not Error is empty, but should not rely on the stability of the Error text across Kubelet versions.² +string +ö + lastKnownGoodä +1#/definitions/io.k8s.api.core.v1.NodeConfigSource"®LastKnownGood reports the checkpointed config the node will fall back to when it encounters an error attempting to use the Assigned config. The Assigned config becomes the LastKnownGood config when the node determines that the Assigned config is stable and correct. This is currently implemented as a 10-minute soak period starting when the local record of Assigned config is updated. If the Assigned config is Active at the end of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, because the local default config is always assumed good. You should not make assumptions about the node's method of determining config stability and correctness, as this may change or become configurable in the future. +• +0io.k8s.apimachinery.pkg.apis.meta.v1.APIVersionsà "APIVersions lists the versions that are available, to allow clients to discover the API at /api, which is the root path of the legacy v1 API.šversionsšserverAddressByClientCIDRs² +objectÊà +Y +versionsM"1versions are the api versions that are available.² +arrayº + ² +string +¾ -The certificate is encoded in PEM format. +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string +è +serverAddressByClientCIDRsÉ"éa map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.² +arrayºP +N +L#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDRúS +x-kubernetes-group-version-kind0.- group: "" + kind: APIVersions + version: v1 -When serialized as JSON or YAML, the data is additionally base64-encoded, so it consists of: +• +&io.k8s.api.storage.v1beta1.VolumeErrorê"DVolumeError captures an error encountered during a volume operation.² +objectÊ• +® +message¢"”String detailing the error encountered during Attach or Detach operation. This string may be logged, so it should not contain sensitive information.² +string +b +timeZ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"Time the error was encountered. +È +Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBoolq"oJSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property. + +!io.k8s.api.apps.v1.DeploymentListç"(DeploymentList is a list of Deployments.šitems² +objectÊË +¾ - base64( - -----BEGIN CERTIFICATE----- - ... - -----END CERTIFICATE----- - )² -stringú# -x-kubernetes-list-type atomic +apiVersion¯"¡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² +string +h +items_"!Items is the list of Deployments.² +arrayº/ +- ++#/definitions/io.k8s.api.apps.v1.Deployment +¹ +kind°"¢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² +string +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úX +x-kubernetes-group-version-kind53- group: apps + kind: DeploymentList + version: v1 -• +Ö +.io.k8s.api.policy.v1.PodDisruptionBudgetStatus£"ŠPodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.šdisruptionsAllowedšcurrentHealthyšdesiredHealthyš expectedPods² +objectÊÁ +â +observedGenerationËint64"µMost recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.² +integer +ô -conditions†"[conditions applied to the request. Known conditions are "Approved", "Denied", and "Failed".² -arrayºO -M -K#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestConditionú' +conditionså"ôConditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute + the number of allowed disruptions. Therefore no disruptions are + allowed and the status of the condition will be False. +- InsufficientPods: The number of pods are either at or below the number + required by the PodDisruptionBudget. No disruptions are + allowed and the status of the condition will be False. +- SufficientPods: There are more pods than required by the PodDisruptionBudget. + The condition will be True, and the number of allowed + disruptions are provided by the disruptionsAllowed property.² +arrayº@ +> +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú' x-kubernetes-list-map-keys - type ú x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -ä -'io.k8s.api.networking.v1.IngressBackend¸"DIngressBackend describes all endpoints for a given service and port.² -objectÊã -± -resource¤ -:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"åResource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, a service.Name and service.Port must not be specified. This is a mutually exclusive setting with "Service". -¬ -service  -<#/definitions/io.k8s.api.networking.v1.IngressServiceBackend"`Service references a Service as a Backend. This is a mutually exclusive setting with "Resource". -é -/io.k8s.api.authentication.v1.TokenRequestStatusµ"4TokenRequestStatus is the result of a token request.štokenšexpirationTimestamp² -objectÊÒ -– -expirationTimestamp -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DExpirationTimestamp is the time of expiration of the returned token. -7 -token."!Token is the opaque bearer token.² +E +currentHealthy3int32"current number of healthy pods² +integer +M +desiredHealthy;int32"&minimum desired number of healthy pods² +integer + + disruptedPodsû"¯DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.ª; +9 +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time² +object +` +disruptionsAllowedJint32"5Number of pod disruptions that are currently allowed.² +integer +[ + expectedPodsKint32"6total number of pods counted by this disruption budget² +integer +á +io.k8s.api.core.v1.Capabilities½"#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric -B -name:"-Name is the name of the resource in question.² + +#io.k8s.api.storage.v1.CSINodeDriverå "]CSINodeDriver holds information about the specification of one CSI driver installed on a nodešnamešnodeID² +objectÊç +¸ +nodeID­"ŸnodeID of the node from the driver point of view. This field enables Kubernetes to communicate with storage systems that do not share the same nomenclature for nodes. For example, Kubernetes may refer to a given node as "node1", but the storage system may refer to the same node as "nodeA". When Kubernetes issues a command to the storage system to attach a volume to a specific node, it can use this field to refer to the node name using the ID that the storage system will understand, e.g. "nodeA" instead of "node1". This field is required.² string -å -(io.k8s.api.batch.v1beta1.JobTemplateSpec¸"QJobTemplateSpec describes the data a Job should have when created from a template² -objectÊÖ -ù -metadataì -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ªStandard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -× -specÎ -)#/definitions/io.k8s.api.batch.v1.JobSpec" Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + + topologyKeys±"”topologyKeys is the list of keys supported by the driver. When a driver is initialized on a cluster, it provides a set of topology keys that it understands (e.g. "company.com/zone", "company.com/region"). When a driver is initialized on a node, it provides the same topology keys along with values. Kubelet will expose these topology keys as labels on its own node object. When Kubernetes does topology aware provisioning, it can use this list to determine which labels it should retrieve from the node object and pass back to the driver. It is possible for different nodes to use different topology keys. This can be empty if driver does not support topology.² +arrayº + ² +string +· + allocatable§ +7#/definitions/io.k8s.api.storage.v1.VolumeNodeResources"lallocatable represents the volume resources of a node that are available for scheduling. This field is beta. +ª +name¡"“This is the name of the CSI driver that this object refers to. This MUST be the same name returned by the CSI GetPluginName() call for that driver.² +string +ë +1io.k8s.api.storage.v1beta1.VolumeAttachmentStatusµ"CVolumeAttachmentStatus is the status of a VolumeAttachment request.šattached² +objectÊÖ +ë + detachErrorÛ +4#/definitions/io.k8s.api.storage.v1beta1.VolumeError"¢The last error encountered during detach operation, if any. This field must only be set by the entity completing the detach operation, i.e. the external-attacher. +ë + attachErrorÛ +4#/definitions/io.k8s.api.storage.v1beta1.VolumeError"¢The last error encountered during attach operation, if any. This field must only be set by the entity completing the attach operation, i.e. the external-attacher. +± +attached¤"•Indicates the volume is successfully attached. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.² +boolean +à +attachmentMetadata¬"ŽUpon successful attach, this field is populated with any information returned by the attach operation that must be passed into subsequent WaitForAttach or Mount calls. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.ª + ² +string² +object +í@ +Mio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps›@"[JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).² +objectʯ?   -%io.k8s.api.core.v1.ComponentConditionö"/Information about the condition of a component.štypešstatus² -objectʦ -s -messageh"[Message about the condition for a component. For example, information about a health check.² +x-kubernetes-map-type†"øx-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values: + +1) `granular`: + These maps are actual maps (key-value pairs) and each fields are independent + from each other (they can each be manipulated by separate actors). This is + the default behaviour for all maps. +2) `atomic`: the list is treated as a single entity, like a scalar. + Atomic maps will be entirely replaced when updated.² string -z -statusp"cStatus of the condition for a component. Valid values for "Healthy": "True", "False", or "Unknown".² + +id ² string -N -typeF"9Type of condition for a component. Valid value: "Healthy"² +m +itemsd +b#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray + +maxItemsint64² +integer + + maxLengthint64² +integer +$ + maxPropertiesint64² +integer +u +oneOfl² +arrayº_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps + +title ² +string + +$schema ² +string +v +additionalItemsc +a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool + + description ² +string + +exclusiveMinimum ² +boolean +d +not] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps + +pattern ² +string + +$ref ² +string +{ +additionalPropertiesc +a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool +u +allOfl² +arrayº_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps + +maximumdouble² +number +& +required² +arrayº + ² +string + +type ² +string +Þ +x-kubernetes-list-typeÃ"µx-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values: + +1) `atomic`: the list is treated as a single entity, like a scalar. + Atomic lists will be entirely replaced when updated. This extension + may be used on any type of list (struct, scalar, ...). +2) `set`: + Sets are lists that must not have multiple items with the same value. Each + value must be a scalar, an object with x-kubernetes-map-type `atomic` or an + array with x-kubernetes-list-type `atomic`. +3) `map`: + These lists are like maps in that their elements have a non-index key + used to identify them. Order is preserved upon merge. The map tag + must only be used on a list with elements of type object. +Defaults to atomic for arrays.² +string +Ô +defaultÈ +P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON"ódefault is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. CustomResourceDefinitions with defaults must be created using the v1 (or newer) CustomResourceDefinition API. + + minLengthint64² +integer +« +x-kubernetes-list-map-keysŒ"ïx-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map. + +This tag MUST only be used on lists that have the "x-kubernetes-list-type" extension set to "map". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported). + +The properties specified must either be required or have a default value, to ensure those properties are present for all list items.² +arrayº + ² +string +‚ +patternPropertiesmª_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² +object +{ + +propertiesmª_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² +object +Ó +x-kubernetes-embedded-resource°"¡x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).² +boolean +i +enuma² +arrayºT +R +P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON +s + externalDocsc +a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation +¶ +format«"format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated: + +- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like "0321751043" or "978-0321751041" - isbn10: an ISBN10 number string like "0321751043" - isbn13: an ISBN13 number string like "978-0321751041" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\d{3}[- ]?\d{2}[- ]?\d{4}$ - hexcolor: an hexadecimal color code like "#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like "rgb(255,255,2559" - byte: base64 encoded binary data - password: any kind of string - date: a date string like "2006-01-02" as defined by full-date in RFC3339 - duration: a duration string like "22 ns" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like "2014-12-15T19:30:20.000Z" as defined by date-time in RFC3339.² +string + +nullable ² +boolean +u +anyOfl² +arrayº_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps +] +exampleR +P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON + +exclusiveMaximum ² +boolean + +minItemsint64² +integer + +minimumdouble² +number +‡ +x-kubernetes-int-or-stringè"Ùx-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns: + +1) anyOf: + - type: integer + - type: string +2) allOf: + - anyOf: + - type: integer + - type: string + - ... zero or more² +boolean +˜ +$x-kubernetes-preserve-unknown-fieldsï"àx-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.² +boolean +| + definitionsmª_ +] +[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² +object +Š + dependencieszªl +j +h#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray² +object +$ + minPropertiesint64² +integer +! + +multipleOfdouble² +number + + uniqueItems ² +boolean +± +:io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpecò "_HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.šscaleTargetRefš maxReplicas² +objectÊã + +© + maxReplicas™int32"ƒmaxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.² +integer +¶ +metricsª"ßmetrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond.² +arrayº; +9 +7#/definitions/io.k8s.api.autoscaling.v2beta1.MetricSpec +ò + minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² +integer +† +scaleTargetRefó +H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"¦scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count. +í +1io.k8s.api.autoscaling.v2beta1.ObjectMetricSource·"‰ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).štargetš +metricNameš targetValue² +objectÊø +Ü +selectorÏ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Šselector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics. +€ +targetv +H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"*target is the described Kubernetes object. +Œ + targetValue} +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity">targetValue is the target value of the metric (as a quantity). +¶ + averageValue¥ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"faverageValue is the target value of the average of the metric across all relevant pods (as a quantity) +L + +metricName>"1metricName is the name of the metric in question.² string -c -errorZ"MCondition error code for a component. For example, a health check error code.² + +)io.k8s.api.extensions.v1beta1.IngressListá"'IngressList is a collection of Ingress.šitems² +objectʾ +Ð +metadataà +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¾ + +apiVersion¯"¡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² string -ù -,io.k8s.api.policy.v1.PodDisruptionBudgetSpecÈ"BPodDisruptionBudgetSpec is a description of a PodDisruptionBudget.² -objectÊõ -ð -maxUnavailableÝ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"›An eviction is allowed if at most "maxUnavailable" pods selected by "selector" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with "minAvailable". -Ç - minAvailable¶ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ôAn eviction is allowed if at least "minAvailable" pods selected by "selector" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying "100%". -µ -selector¨ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"·Label query over pods whose evictions are managed by the disruption budget. A null selector will match no pods, while an empty ({}) selector will select all pods within the namespace.ú) -x-kubernetes-patch-strategy -replace +l +itemsc"Items is the list of Ingress.² +arrayº7 +5 +3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +¹ +kind°"¢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² +stringú` +x-kubernetes-group-version-kind=;- group: extensions + kind: IngressList + version: v1beta1 -ƒ -Jio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion´", a generated name, or a reverse-domain name which ends with the unique CSI driver name. - -Objects are namespaced. - -More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ç - nodeTopology¶ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ñNodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable. -Ô -storageClassName¿"±The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.² +\ +usernameP"CThe name that uniquely identifies this user among all active users.² string +„ + +io.k8s.api.core.v1.NodeAffinityà ";Node affinity is a group of node affinity scheduling rules.² +objectÊ” +Þ +/preferredDuringSchedulingIgnoredDuringExecutionª"ÞThe scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.² +arrayº< +: +8#/definitions/io.k8s.api.core.v1.PreferredSchedulingTerm +° +.requiredDuringSchedulingIgnoredDuringExecutioný +-#/definitions/io.k8s.api.core.v1.NodeSelector"ËIf the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. +‡ +$io.k8s.api.networking.v1.IngressListÞ"'IngressList is a collection of Ingress.šitems² +objectʹ ¾ apiVersion¯"¡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² string -Ò -capacityÅ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"…Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields. - -The semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity. +g +items^"Items is the list of Ingress.² +arrayº2 +0 +.#/definitions/io.k8s.api.networking.v1.Ingress ¹ kind°"¢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² string -¶ -maximumVolumeSize  -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"àMaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields. +Ð +metadataà +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúb +x-kubernetes-group-version-kind?=- group: networking.k8s.io + kind: IngressList + version: v1 -This is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim.úk -x-kubernetes-group-version-kindHF- group: storage.k8s.io - kind: CSIStorageCapacity - version: v1beta1 +À +!io.k8s.api.core.v1.ContainerImageš"Describe a container imagešnames² +objectÊç +¡ +names—"{Names by which this image is known. e.g. ["k8s.gcr.io/hyperkube:v1.0.7", "dockerhub.io/google_containers/hyperkube:v1.0.7"]² +arrayº + ² +string +A + sizeBytes4int64"The size of the image in bytes.² +integer +¼ +&io.k8s.api.core.v1.GitRepoVolumeSource‘"÷Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling. -è -Iio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReferenceš";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² -objectÊ» -> -name6")name is the name of the service. Required² +DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.š +repository² +objectÊû +‹ + directoryý"ïTarget directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.² string -M - namespace@"3namespace is the namespace of the service. Required² +) + +repository"Repository URL² string -Y -pathQ"Dpath is an optional URL path at which the webhook will be contacted.² +@ +revision4"'Commit hash for the specified revision.² string -Î -portÅint32"¯port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.² -integer -³ -]io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersionÑ"//...` if `served` is true.² +k +itemsb"List of endpoint slices² +arrayº< +: +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice +¹ +kind°"¢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² string -ƒ -schemaø -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation"schema describes the schema used for validation and pruning of this version of the custom resource. Top-level and per-version schemas are mutually exclusive. Per-version schemas must not all be set to identical values (top-level validation schema should be used instead). -h -served^"Pserved is a flag enabling/disabling this version from being served via REST APIs² -boolean -ª -storagež"storage indicates this version should be used when persisting custom resources to storage. There must be exactly one version with storage=true.² -boolean -… - subresourcesô -f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources"‰subresources specify what subresources this version of the defined custom resource have. Top-level and per-version subresources are mutually exclusive. Per-version subresources must not all be set to identical values (top-level subresources should be used instead). -ñ -additionalPrinterColumnsÔ"ÖadditionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. Top-level and per-version columns are mutually exclusive. Per-version columns must not all be set to identical values (top-level columns should be used instead). If no top-level or per-version columns are specified, a single column displaying the age of the custom resource is used.² -arrayºn -l -j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition - +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úl +x-kubernetes-group-version-kindIG- kind: EndpointSliceList + version: v1beta1 + group: discovery.k8s.io -4io.k8s.api.authorization.v1beta1.SubjectAccessReviewä "PSubjectAccessReview checks whether or not a user or group can perform an action.šspec² -objectʇ -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -‹ -spec‚ -F#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec"8Spec holds information about the request being evaluated -¬ -status¡ -H#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not + +&io.k8s.api.networking.v1.NetworkPolicy— "INetworkPolicy describes what network traffic is allowed for a set of Pods² +objectÊÖ +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + +specy +8#/definitions/io.k8s.api.networking.v1.NetworkPolicySpec"=Specification of the desired behavior for this NetworkPolicy. ¾ apiVersion¯"¡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² string ¹ kind°"¢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² -stringúr -x-kubernetes-group-version-kindOM- group: authorization.k8s.io - kind: SubjectAccessReview - version: v1beta1 +stringúd +x-kubernetes-group-version-kindA?- kind: NetworkPolicy + version: v1 + group: networking.k8s.io -¹ -%io.k8s.api.autoscaling.v1.ScaleStatus"AScaleStatus represents the current status of a scale subresource.šreplicas² -objectʲ -Z -replicasNint32"9actual number of observed instances of the scaled object.² -integer -Ó -selectorÆ"¸label query over pods that should match the replicas count. This is same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors² -string -Ú +à +!io.k8s.api.batch.v1.CronJobStatus"9CronJobStatus represents the current state of a cron job.² +objectÊÓ +¡ +active–"-A list of pointers to currently running jobs.² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ObjectReferenceú# +x-kubernetes-list-type atomic -io.k8s.api.core.v1.Toleration¸ -"The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator .² -objectÊ™ -¸ -effect­"ŸEffect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.² -string -Ó -keyË"½Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.² -string -ö -operatoré"ÛOperator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.² +– +lastScheduleTime +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"FInformation when was the last time the job was successfully scheduled. +“ +lastSuccessfulTime} +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"BInformation when was the last time the job successfully completed. +Ö +io.k8s.api.batch.v1.JobList¶" JobList is a collection of jobs.šitems² +objectʨ +¾ + +apiVersion¯"¡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² string -ç -tolerationSecondsÑint64"»TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.² -integer -¢ -value˜"ŠValue is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.² +[ +itemsR"items is the list of Jobs.² +arrayº) +' +%#/definitions/io.k8s.api.batch.v1.Job +¹ +kind°"¢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² string -« -Vio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionÐ "…CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format <.spec.name>.<.spec.group>. Deprecated in v1.16, planned for removal in v1.22. Use apiextensions.k8s.io/v1 CustomResourceDefinition instead.šspec² -objectʸ +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúR +x-kubernetes-group-version-kind/-- group: batch + kind: JobList + version: v1 + +ˆ + +/io.k8s.api.authorization.v1.SubjectAccessReviewÔ "PSubjectAccessReview checks whether or not a user or group can perform an action.šspec² +objectÊü +§ +statusœ +C#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not ¾ apiVersion¯"¡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² @@ -33309,400 +33061,445 @@ apiVersion K metadata? =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -® -spec¥ -h#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec"9spec describes how the user wants the resources to appear -º -status¯ -j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus"Astatus indicates the actual state of the CustomResourceDefinitionúw -x-kubernetes-group-version-kindTR- group: apiextensions.k8s.io - kind: CustomResourceDefinition - version: v1beta1 +… +spec} +A#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec"8Spec holds information about the request being evaluatedúm +x-kubernetes-group-version-kindJH- group: authorization.k8s.io + kind: SubjectAccessReview + version: v1 -… -$io.k8s.api.coordination.v1.LeaseListÜ"%LeaseList is a list of Lease objects.šitems² -objectʹ +‰ +1io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerÓ +"-configuration of a horizontal pod autoscaler.² +objectʪ ¾ apiVersion¯"¡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² string -l -itemsc""Items is a list of schema objects.² -arrayº2 -0 -.#/definitions/io.k8s.api.coordination.v1.Lease ¹ kind°"¢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² string -Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúb -x-kubernetes-group-version-kind?=- kind: LeaseList - version: v1 - group: coordination.k8s.io - -¢9 -io.k8s.api.core.v1.Volume„9"[Volume represents a named volume in a pod that may be accessed by any container in the pod.šname² -objectÊ‘8 -Œ -cephfs -3#/definitions/io.k8s.api.core.v1.CephFSVolumeSource"JCephFS represents a Ceph FS mount on the host that shares a pod's lifetime -ž - downwardAPIŽ -8#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeSource"RDownwardAPI represents downward API about the pod that should populate this volume -Ö -emptyDirÉ -5#/definitions/io.k8s.api.core.v1.EmptyDirVolumeSource"EmptyDir represents a temporary directory that shares a pod's lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir -™ - storageos‹ -6#/definitions/io.k8s.api.core.v1.StorageOSVolumeSource"QStorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. -± -awsElasticBlockStore˜ -A#/definitions/io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource"ÒAWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore -» - ephemeral­ -6#/definitions/io.k8s.api.core.v1.EphemeralVolumeSource"òEphemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. - -Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity - tracking are needed, -c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through - a PersistentVolumeClaim (see EphemeralVolumeSource for more - information on the connection between this volume type - and PersistentVolumeClaim). - -Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. +Ð +metadataà +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ù +specÐ +C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec"ˆbehaviour of autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. +| +statusr +E#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus")current information about the autoscaler.úh +x-kubernetes-group-version-kindEC- version: v1 + group: autoscaling + kind: HorizontalPodAutoscaler -Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. +ƒ +0io.k8s.api.policy.v1beta1.FSGroupStrategyOptionsÎ"YFSGroupStrategyOptions defines the strategy type and options used to create the strategy.² +objectÊä +÷ +rangesì"©ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. Required for MustRunAs.² +arrayº3 +1 +/#/definitions/io.k8s.api.policy.v1beta1.IDRange +h +rule`"Srule is the strategy that will dictate what FSGroup is used in the SecurityContext.² +string +³ +'io.k8s.api.rbac.v1beta1.RoleBindingList‡ "¤RoleBindingList is a collection of RoleBindings Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBindingList, and will no longer be served in v1.22.šitems² +objectÊÓ +¾ -A pod can use both types of ephemeral volumes and persistent volumes at the same time. +apiVersion¯"¡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² +string +l +itemsc"Items is a list of RoleBindings² +arrayº5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding +¹ +kind°"¢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² +string +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ús +x-kubernetes-group-version-kindPN- group: rbac.authorization.k8s.io + kind: RoleBindingList + version: v1beta1 -This is a beta feature and only available when the GenericEphemeralVolume feature gate is enabled. -¬ -persistentVolumeClaim’ -B#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource"ËPersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - -quobyteƒ -4#/definitions/io.k8s.api.core.v1.QuobyteVolumeSource"KQuobyte represents a Quobyte mount on the host that shares a pod's lifetime -œ -scaleIO -4#/definitions/io.k8s.api.core.v1.ScaleIOVolumeSource"XScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. -Ÿ - azureFile‘ -6#/definitions/io.k8s.api.core.v1.AzureFileVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod. -¤ -gcePersistentDiskŽ ->#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource"ËGCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk -ˆ - configMap{ -6#/definitions/io.k8s.api.core.v1.ConfigMapVolumeSource"AConfigMap represents a configMap that should populate this volume -É -gitRepo½ -4#/definitions/io.k8s.api.core.v1.GitRepoVolumeSource"„GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container. -í -iscsiã -2#/definitions/io.k8s.api.core.v1.ISCSIVolumeSource"¬ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md -Î -photonPersistentDiskµ -A#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource"pPhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine -Ð -cinderÅ -3#/definitions/io.k8s.api.core.v1.CinderVolumeSource"Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md -ª -fc£ -/#/definitions/io.k8s.api.core.v1.FCVolumeSource"pFC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. -¬ +˜ -flexVolume -1#/definitions/io.k8s.api.core.v1.FlexVolumeSource"hFlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. -” -hostPath‡ -5#/definitions/io.k8s.api.core.v1.HostPathVolumeSource"ÍHostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath -¥ -portworxVolume’ -5#/definitions/io.k8s.api.core.v1.PortworxVolumeSource"YPortworxVolume represents a portworx volume attached and mounted on kubelets host machine -‹ - projected~ -6#/definitions/io.k8s.api.core.v1.ProjectedVolumeSource"DItems for all in one resources secrets, configmaps, and downward API -œ - azureDiskŽ -6#/definitions/io.k8s.api.core.v1.AzureDiskVolumeSource"TAzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. -º -csi² -0#/definitions/io.k8s.api.core.v1.CSIVolumeSource"~CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). -È -flocker¼ -4#/definitions/io.k8s.api.core.v1.FlockerVolumeSource"ƒFlocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running -Ø - glusterfsÊ -6#/definitions/io.k8s.api.core.v1.GlusterfsVolumeSource"Glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md -® -name¥"—Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² -string -Ä -nfs¼ -0#/definitions/io.k8s.api.core.v1.NFSVolumeSource"‡NFS represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs -É -rbdÁ -0#/definitions/io.k8s.api.core.v1.RBDVolumeSource"ŒRBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md -Å -secretº -3#/definitions/io.k8s.api.core.v1.SecretVolumeSource"‚Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret -¬ - vsphereVolumeš -?#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"WVsphereVolume represents a vSphere volume attached and mounted on kubelets host machine -´ -io.k8s.api.rbac.v1beta1.Subject"ÆSubject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.škindšname² -objectʪ -à -apiGroup¶"¨APIGroup holds the API group of the referenced subject. Defaults to "" for ServiceAccount subjects. Defaults to "rbac.authorization.k8s.io" for User and Group subjects.² +Wio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceColumnDefinition¼ "KCustomResourceColumnDefinition specifies a column for server side printing.šnameštypešjsonPath² +objectÊÇ + +priority€int32"êpriority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.² +integer +¯ +type¦"˜type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² string -à -kind×"ÉKind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". If the Authorizer does not recognized the kind value, the Authorizer should report an error.² +W + descriptionH";description is a human readable description of this column.² string -9 -name1"$Name of the object being referenced.² +¸ +format­"Ÿformat is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² string -à - namespaceµ"§Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty the Authorizer should report an error.² +ª +jsonPath"jsonPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.² string -À -!io.k8s.api.core.v1.ContainerImageš"Describe a container imagešnames² -objectÊç -¡ -names—"{Names by which this image is known. e.g. ["k8s.gcr.io/hyperkube:v1.0.7", "dockerhub.io/google_containers/hyperkube:v1.0.7"]² -arrayº - ² +B +name:"-name is a human readable name for the column.² string -A - sizeBytes4int64"The size of the image in bytes.² -integer -Ö -(io.k8s.api.core.v1.DownwardAPIVolumeFile© "XDownwardAPIVolumeFile represents information to create the file containing the pod fieldšpath² -objectʹ -» -mode²int32"œOptional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² -integer -Þ -pathÕ"ÇRequired: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..'² +è +=io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery¦"wGroupVersion contains the "group/version" and "version" string of a version. It is made a struct to keep extensibility.š groupVersionšversion² +objectÊ… +i + groupVersionY"LgroupVersion specifies the API group and version in the form "group/version"² string -î -resourceFieldRefÙ -6#/definitions/io.k8s.api.core.v1.ResourceFieldSelector"žSelects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. -¦ -fieldRef™ -4#/definitions/io.k8s.api.core.v1.ObjectFieldSelector"aRequired: Selects a field of the pod: only annotations, labels, name and namespace are supported. -™ -io.k8s.api.core.v1.EnvVarû"AEnvVar represents an environment variable present in a Container.šname² -objectÊ¢ -N -nameF"9Name of the environment variable. Must be a C_IDENTIFIER.² +— +version‹"~version specifies the version in the form of "version". This is to save the clients the trouble of splitting the GroupVersion.² string -» -value±"£Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".² +Æ +)io.k8s.api.authentication.v1.TokenRequest˜":TokenRequest requests a token for a given service account.šspec² +objectÊÜ +¹ +kind°"¢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² string -‘ - valueFromƒ --#/definitions/io.k8s.api.core.v1.EnvVarSource"RSource for the environment variable's value. Cannot be used if value is not empty. -î -"io.k8s.api.rbac.v1beta1.PolicyRuleÇ "¡PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.šverbs² -objectÊŒ +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +E +spec= +;#/definitions/io.k8s.api.authentication.v1.TokenRequestSpec +I +status? +=#/definitions/io.k8s.api.authentication.v1.TokenRequestStatus +¾ -¼ -nonResourceURLs¨"‹NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.² -arrayº - ² +apiVersion¯"¡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² +stringúg +x-kubernetes-group-version-kindDB- group: authentication.k8s.io + kind: TokenRequest + version: v1 + +– +3io.k8s.api.core.v1.PhotonPersistentDiskVolumeSourceÞ"8Represents a Photon Controller persistent disk resource.špdID² +objectÊŽ +I +pdIDA"4ID that identifies Photon Controller persistent disk² string -¨ - resourceNames–"zResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.² -arrayº - ² +À +fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +string +£ +:io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerListä"KHorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects.šitems² +objectÊŒ +˜ +itemsŽ"7items is the list of horizontal pod autoscaler objects.² +arrayºH +F +D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler +¹ +kind°"¢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² string +r +metadataf +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"'metadata is the standard list metadata. +¾ + +apiVersion¯"¡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² +stringúq +x-kubernetes-group-version-kindNL- group: autoscaling + kind: HorizontalPodAutoscalerList + version: v2beta2 + +ž +8io.k8s.api.certificates.v1.CertificateSigningRequestSpecá"?CertificateSigningRequestSpec contains the certificate request.šrequestš +signerName² +objectÊú ò - resourcesä"ÇResources is a list of resources this rule applies to. '*' represents all resources in the specified apiGroups. '*/foo' represents the subresource 'foo' for all resources in the specified apiGroups.² -arrayº - ² +requestæbyte"¬request contains an x509 certificate signing request encoded in a "CERTIFICATE REQUEST" PEM block. When serialized as JSON or YAML, the data is additionally base64-encoded.² +stringú# +x-kubernetes-list-type atomic + + + +signerName"ósignerName indicates the requested signer, and is a qualified name. + +List/watch requests for CertificateSigningRequests can filter on this field using a "spec.signerName=NAME" fieldSelector. + +Well-known Kubernetes signers are: + 1. "kubernetes.io/kube-apiserver-client": issues client certificates that can be used to authenticate to kube-apiserver. + Requests for this signer are never auto-approved by kube-controller-manager, can be issued by the "csrsigning" controller in kube-controller-manager. + 2. "kubernetes.io/kube-apiserver-client-kubelet": issues client certificates that kubelets use to authenticate to kube-apiserver. + Requests for this signer can be auto-approved by the "csrapproving" controller in kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. + 3. "kubernetes.io/kubelet-serving" issues serving certificates that kubelets use to serve TLS endpoints, which kube-apiserver can connect to securely. + Requests for this signer are never auto-approved by kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. + +More details are available at https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers + +Custom signerNames can also be specified. The signer defines: + 1. Trust distribution: how trust (CA bundles) are distributed. + 2. Permitted subjects: and behavior when a disallowed subject is requested. + 3. Required, permitted, or forbidden x509 extensions in the request (including whether subjectAltNames are allowed, which types, restrictions on allowed values) and behavior when a disallowed extension is requested. + 4. Required, permitted, or forbidden key usages / extended key usages. + 5. Expiration/certificate lifetime: whether it is fixed by the signer, configurable by the admin. + 6. Whether or not requests for CA certificates are allowed.² string -´ -verbsª"Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.² -arrayº - ² +™ +uid‘"ƒuid contains the uid of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² string -ó - apiGroupså"ÈAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.² +„ +usagesù"¶usages specifies a set of key usages requested in the issued certificate. + +Requests for TLS client certificates typically request: "digital signature", "key encipherment", "client auth". + +Requests for TLS serving certificates typically request: "key encipherment", "digital signature", "server auth". + +Valid values are: + "signing", "digital signature", "content commitment", + "key encipherment", "key agreement", "data encipherment", + "cert sign", "crl sign", "encipher only", "decipher only", "any", + "server auth", "client auth", + "code signing", "email protection", "s/mime", + "ipsec end system", "ipsec tunnel", "ipsec user", + "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"² arrayº ² +stringú# +x-kubernetes-list-type atomic + +¤ +username—"‰username contains the name of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² string -à -Nio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBoolq"oJSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property. -‰ -0io.k8s.api.authorization.v1beta1.NonResourceRuleÔ"LNonResourceRule holds information that describes a rule for the non-resourcešverbs² -objectÊï -Ë -nonResourceURLs·"šNonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path. "*" means all.² +Å +extra»"Žextra contains extra attributes of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.ª +² arrayº ² -string -ž -verbs”"xVerb is a list of kubernetes non-resource API verbs, like: get, post, put, delete, patch, head, options. "*" means all.² +string² +object +Ý +groupsÒ"groups contains group membership of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.² arrayº ² -string -… -9io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatusÇ "çSubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.š resourceRulesšnonResourceRulesš -incomplete² -objectÊž -Ý - -incompleteÎ"¿Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.² -boolean -› -nonResourceRules†"´NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² -arrayºB -@ ->#/definitions/io.k8s.api.authorization.v1beta1.NonResourceRule -Ž - resourceRulesü"­ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² -arrayº? -= -;#/definitions/io.k8s.api.authorization.v1beta1.ResourceRule -Œ -evaluationErrorø"êEvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.² -string -= -io.k8s.api.core.v1.Containerî<"AA single application container that you want to run within a pod.šname² -objectÊ•< -‚ - livenessProbeð -&#/definitions/io.k8s.api.core.v1.Probe"Å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 -” -portsŠ"ŠList of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated.² -arrayº2 -0 -.#/definitions/io.k8s.api.core.v1.ContainerPortú; -x-kubernetes-list-map-keys- containerPort -- protocol -ú -x-kubernetes-list-typemap -ú0 -x-kubernetes-patch-merge-keycontainerPort -ú' -x-kubernetes-patch-strategymerge +stringú# +x-kubernetes-list-type atomic -¡ -readinessProbeŽ -&#/definitions/io.k8s.api.core.v1.Probe"ã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 - -securityContextü -0#/definitions/io.k8s.api.core.v1.SecurityContext"ÇSecurity options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ -ó - volumeDevicesá"GvolumeDevices is the list of block devices to be used by the container.² -arrayº1 -/ --#/definitions/io.k8s.api.core.v1.VolumeDeviceú- -x-kubernetes-patch-merge-key  devicePath -ú' -x-kubernetes-patch-strategymerge +â +'io.k8s.api.core.v1.PersistentVolumeList¶ "9PersistentVolumeList is a list of PersistentVolume items.šitems² +objectÊ… +¾ -Ö -envFromÊ"ˆList of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.² -arrayº2 -0 -.#/definitions/io.k8s.api.core.v1.EnvFromSource - -imageƒ"õDocker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.² +apiVersion¯"¡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² string -¨ - lifecycleš -*#/definitions/io.k8s.api.core.v1.Lifecycle"lActions that the management system should take in response to container lifecycle events. Cannot be updated. -• -nameŒ"Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.² +³ +items©"eList of persistent volumes. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes² +arrayº5 +3 +1#/definitions/io.k8s.api.core.v1.PersistentVolume +¹ +kind°"¢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² string Ï -stdinÅ"¶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.² -boolean -À +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsú\ +x-kubernetes-group-version-kind97- group: "" + kind: PersistentVolumeList + version: v1 -workingDir±"£Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.² +¢ +Kio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceConditionÒ"NAPIServiceCondition describes the state of an APIService at a particular pointštypešstatus² +objectÊã +X +messageM"@Human-readable message indicating details about last transition.² string -û -commandï"ÒEntrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² +^ +reasonT"GUnique, one-word, CamelCase reason for the condition's last transition.² +string +Z +statusP"CStatus is the status of the condition. Can be True, False, Unknown.² +string +7 +type/""Type is the type of the condition.² +string +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +° +1io.k8s.api.authorization.v1.NonResourceAttributesú"{NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface² +objectÊo +8 +path0"#Path is the URL path of the request² +string +3 +verb+"Verb is the standard HTTP verb² +string +Î +7io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec’"¦SelfSubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² +objectÊÚ +ª +nonResourceAttributes +?#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request +ª +resourceAttributes“ +<#/definitions/io.k8s.api.authorization.v1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request +ÿ +!io.k8s.api.storage.v1.CSINodeListÙ"/CSINodeList is a collection of CSINode objects.šitems² +objectʯ +¾ + +apiVersion¯"¡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² +string +c +itemsZ"items is the list of CSINode² +arrayº/ +- ++#/definitions/io.k8s.api.storage.v1.CSINode +¹ +kind°"¢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² +string +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataú_ +x-kubernetes-group-version-kind<:- group: storage.k8s.io + kind: CSINodeList + version: v1 + +Á +Vio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceConversionæ +"MCustomResourceConversion describes how to convert different versions of a CR.šstrategy² +objectÊý +œ +conversionReviewVersionsÿ"âconversionReviewVersions is an ordered list of preferred `ConversionReview` versions the Webhook expects. The API server will use the first version in the list which it supports. If none of the versions specified in this list are supported by API server, conversion will fail for the custom resource. If a persisted Webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail. Defaults to `["v1beta1"]`.² arrayº ² string -‡ -imagePullPolicyó"åImage pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images² +Ñ +strategyÄ"¶strategy specifies how custom resources are converted between versions. Allowed values are: - `None`: The converter only change the apiVersion and would not touch any other field in the custom resource. - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information + is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhookClientConfig to be set.² string -× - stdinOnceÉ"º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² -boolean - -ttyz"lWhether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.² -boolean -ñ - volumeMountsà"HPod volumes to mount into the container's filesystem. Cannot be updated.² -arrayº0 -. -,#/definitions/io.k8s.api.core.v1.VolumeMountú, -x-kubernetes-patch-merge-key  -mountPath -ú' -x-kubernetes-patch-strategymerge +‡ +webhookClientConfigï +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.WebhookClientConfig"‹webhookClientConfig is the instructions for how to call the webhook if strategy is `Webhook`. Required when `strategy` is set to `Webhook`. +ð +"io.k8s.api.core.v1.PodAffinityTermÉ "ßDefines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is runningš topologyKey² +objectÊÊ -ß -argsÖ"¹Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² +Ž + labelSelector} +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"9A label query over a set of resources, in this case pods. +õ +namespaceSelectorß +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"šA label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled. +Å + +namespaces¶"™namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace"² arrayº ² string -â - resourcesÔ -5#/definitions/io.k8s.api.core.v1.ResourceRequirements"šCompute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ -Å -terminationMessagePathª"œOptional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.² +ö + topologyKeyæ"ØThis pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.² string -æ -terminationMessagePolicyÉ"»Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.² +¬ +1io.k8s.api.networking.v1.NetworkPolicyIngressRuleö"´NetworkPolicyIngressRule describes a particular set of traffic that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The traffic must match both ports and from.² +objectÊ° +Ù +fromÐ"„List of sources which should be able to access the pods selected for this rule. Items in this list are combined using a logical OR operation. If this field is empty or missing, this rule matches all sources (traffic not restricted by source). If this field is present and contains at least one item, this rule allows traffic only if the traffic matches at least one item in the from list.² +arrayº< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyPeer +Ñ +portsÇ"ûList of ports which should be made accessible on the pods selected for this rule. Each item in this list is combined using a logical OR. If this field is empty or missing, this rule matches all ports (traffic not restricted by port). If this field is present and contains at least one item, then this rule allows traffic only if the traffic matches at least one port in the list.² +arrayº< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyPort +Ý + +&io.k8s.api.core.v1.ScaleIOVolumeSource² +":ScaleIOVolumeSource represents a persistent ScaleIO volumešgatewayšsystemš secretRef² +objectÊÈ +Ð + secretRef +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"ˆSecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. +’ + storageMode‚"uIndicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.² string -ß -env×"IList of environment variables to set in the container. Cannot be updated.² -arrayº+ -) -'#/definitions/io.k8s.api.core.v1.EnvVarú' -x-kubernetes-patch-strategymerge -ú' -x-kubernetes-patch-merge-keyname +¡ +fsType–"ˆFilesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs".² +string +D +gateway9",The host address of the ScaleIO API Gateway.² +string +` -Ô - startupProbeà -&#/definitions/io.k8s.api.core.v1.Probe"˜StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes - +sslEnabledR"DFlag to enable/disable SSL communication with Gateway, default false² +boolean +[ + storagePoolL"?The ScaleIO Storage Pool associated with the protection domain.² +string +O +systemE"8The name of the storage system as configured in ScaleIO.² +string + -\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition¼ "KCustomResourceColumnDefinition specifies a column for server side printing.šnameštypešJSONPath² -objectÊÇ - -priority€int32"êpriority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.² -integer -¯ -type¦"˜type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² +volumeNames"fThe name of a volume already created in the ScaleIO system that is associated with this volume source.² string -ª -JSONPath"JSONPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.² +f +protectionDomainR"EThe name of the ScaleIO Protection Domain for the configured storage.² string -W - descriptionH";description is a human readable description of this column.² +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean + +"io.k8s.api.core.v1.SecurityContextè"ÜSecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.² +objectÊú +¥ + +privileged–"‡Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.² +boolean +Š + procMountü"îprocMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.² string -¸ -format­"Ÿformat is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² +½ + runAsNonRoot¬"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² +boolean +° + runAsUser¢int64"ŒThe UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² +integer +ô +seLinuxOptionsá +/#/definitions/io.k8s.api.core.v1.SELinuxOptions"­The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. +ç +seccompProfileÔ +/#/definitions/io.k8s.api.core.v1.SeccompProfile" The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. +Õ +allowPrivilegeEscalation¸"©AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN² +boolean +Æ + capabilitiesµ +-#/definitions/io.k8s.api.core.v1.Capabilities"ƒThe capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. +Ä +windowsOptions± +>#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions"îThe Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. +q +readOnlyRootFilesystemW"IWhether this container has a read-only root filesystem. Default is false.² +boolean +“ + +runAsGroup„int64"îThe GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² +integer +† + io.k8s.api.networking.v1.IPBlocká"ãIPBlock describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.šcidr² +objectÊå +v +cidrn"aCIDR is a string representing the IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64"² string -B -name:"-name is a human readable name for the column.² +ê +exceptß"ÂExcept is a slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64" Except values will be rejected if they are outside the CIDR range² +arrayº + ² string -ˆ - -/io.k8s.api.authorization.v1.SubjectAccessReviewÔ "PSubjectAccessReview checks whether or not a user or group can perform an action.šspec² -objectÊü -§ -statusœ -C#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not +· + io.k8s.api.coordination.v1.Lease’ "Lease defines a lease concept.² +objectÊ‚ ¾ apiVersion¯"¡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² @@ -33710,628 +33507,486 @@ apiVersion ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -… -spec} -A#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec"8Spec holds information about the request being evaluatedúm -x-kubernetes-group-version-kindJH- group: authorization.k8s.io - kind: SubjectAccessReview +µ +metadata¨ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ê +specÁ +2#/definitions/io.k8s.api.coordination.v1.LeaseSpec"ŠSpecification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú^ +x-kubernetes-group-version-kind;9- group: coordination.k8s.io + kind: Lease version: v1 -ç -1io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus±"ŽObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).šmetricšcurrentšdescribedObject² -objectÊì -„ -currenty ->#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric -] -describedObjectJ -H#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference -ƒ -metricy -=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector -Þ - io.k8s.api.events.v1.EventSeries¹"èEventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time. How often to update the EventSeries is up to the event reporters. The default event reporter in "k8s.io/client-go/tools/events/event_broadcaster.go" shows how this struct is updated on heartbeats and can guide customized reporter implementations.šcountšlastObservedTime² -objectʤ -n -counteint32"Pcount is the number of occurrences in this series up to the last heartbeat time.² -integer -± -lastObservedTimeœ -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"\lastObservedTime is the time when last Event from the series was seen before last heartbeat. -Ž +“ +"io.k8s.api.core.v1.NamespaceStatusì"GNamespaceStatus is information about the current status of a Namespace.² +objectÊ” +õ -*io.k8s.api.networking.v1.NetworkPolicyPeerß "lNetworkPolicyPeer describes a peer to allow traffic to/from. Only certain combinations of fields are allowed² -objectÊâ -Ô - podSelectorÄ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ÿThis is a label selector which selects Pods. This field follows standard label selector semantics; if present but empty, it selects all pods. +conditionsæ"LRepresents the latest available observations of a namespace's current state.² +arrayº7 +5 +3#/definitions/io.k8s.api.core.v1.NamespaceConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -If NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects the Pods matching PodSelector in the policy's own Namespace. -« -ipBlockŸ -.#/definitions/io.k8s.api.networking.v1.IPBlock"mIPBlock defines policy on a particular IPBlock. If this field is set then neither of the other fields can be. -Ú -namespaceSelectorÄ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ÿSelects Namespaces using cluster-scoped labels. This field follows standard label selector semantics; if present but empty, it selects all namespaces. +™ +phase"Phase is the current lifecycle phase of the namespace. More info: https://kubernetes.io/docs/tasks/administer-cluster/namespaces/² +string +‘ +io.k8s.api.batch.v1.JobStatusï"0JobStatus represents the current state of a Job.² +objectÊ® +¶ -If PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector. -Û -*io.k8s.api.networking.v1beta1.IngressClass¬ "óIngressClass represents the class of the Ingress, referenced by the Ingress Spec. The `ingressclass.kubernetes.io/is-default-class` annotation can be used to indicate that an IngressClass should be considered default. When a single IngressClass resource has this annotation set to true, new Ingress resources without a class specified will be assigned this default class.² -objectʼ -ç -specÞ -<#/definitions/io.k8s.api.networking.v1beta1.IngressClassSpec"Spec is the desired state of the IngressClass. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -¾ +conditions§"ëThe latest available observations of an object's current state. When a Job fails, one of the conditions will have type "Failed" and status true. When a Job is suspended, one of the conditions will have type "Suspended" and status true; when the Job is resumed, the status of this condition will become false. When a Job is completed, one of the conditions will have type "Complete" and status true. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² +arrayº2 +0 +.#/definitions/io.k8s.api.batch.v1.JobConditionú# +x-kubernetes-list-type atomic +ú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -apiVersion¯"¡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² -string -¹ -kind°"¢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² +M +failedCint32".The number of pods which reached phase Failed.² +integer +å + startTime× +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"›Represents time when the job controller started processing a job. When a Job is created in the suspended state, this field is not set until the first time it is resumed. This field is reset every time a Job is resumed from suspension. It is represented in RFC3339 form and is in UTC. +S + succeededFint32"1The number of pods which reached phase Succeeded.² +integer +C +active9int32"$The number of actively running pods.² +integer +Ü +completedIndexesÇ"¹CompletedIndexes holds the completed indexes when .spec.completionMode = "Indexed" in a text format. The indexes are represented as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the completed indexes are 1, 3, 4, 5 and 7, they are represented as "1,3-5,7".² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúh -x-kubernetes-group-version-kindEC- kind: IngressClass - version: v1beta1 - group: networking.k8s.io + +completionTime¯ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"óRepresents time when the job was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. The completion time is only set when the job finishes successfully. +à +4io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRuleŠ"·NonResourcePolicyRule is a predicate that matches non-resource requests according to their verb and the target non-resource URL. A NonResourcePolicyRule matches a request if and only if both (a) at least one member of verbs matches the request and (b) at least one member of nonResourceURLs matches the request.šverbsšnonResourceURLs² +objectʧ +Ð +nonResourceURLs¼"ü`nonResourceURLs` is a set of url prefixes that a user should have access to and may not be empty. For example: + - "/healthz" is legal + - "/hea*" is illegal + - "/hea" is legal but matches nothing + - "/hea/*" also matches nothing + - "/healthz/*" matches all per-component health checks. +"*" matches all non-resource urls. if it is present, it must be the only entry. Required.² +arrayº + ² +stringú +x-kubernetes-list-typeset -Ü -"io.k8s.api.apps.v1.StatefulSetListµ"0StatefulSetList is a collection of StatefulSets.šitems² -objectÊ -¾ +Ñ +verbsÇ"‡`verbs` is a list of matching verbs and may not be empty. "*" matches all verbs. If it is present, it must be the only entry. Required.² +arrayº + ² +stringú +x-kubernetes-list-typeset -apiVersion¯"¡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² -string -F -items=² -arrayº0 -. -,#/definitions/io.k8s.api.apps.v1.StatefulSet -¹ -kind°"¢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² -string -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúY -x-kubernetes-group-version-kind64- group: apps - kind: StatefulSetList - version: v1 +û -Ü -3io.k8s.api.authorization.v1.SelfSubjectAccessReview¤ "öSelfSubjectAccessReview checks whether or the current user can perform an action. Not filling in a spec.namespace means "in all namespaces". Self is a special case, because users should always be able to check whether they can perform an actionšspec² -objectÊ¡ -§ -statusœ -C#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not -¾ +[io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames› +"XCustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinitionšpluralškind² +objectÊ¢ +ô -apiVersion¯"¡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² +categorieså"Ècategories is a list of grouped resources this custom resource belongs to (e.g. 'all'). This is published in API discovery documents, and used by clients to support invocations like `kubectl get all`.² +arrayº + ² string -¹ -kind°"¢Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² +¾ +kindµ"§kind is the serialized kind of the resource. It is normally CamelCase and singular. Custom resource instances will use this value as the `kind` attribute in API calls.² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -ª -spec¡ -E#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec"XSpec holds information about the request being evaluated. user and groups must be emptyúq -x-kubernetes-group-version-kindNL- kind: SelfSubjectAccessReview - version: v1 - group: authorization.k8s.io - -£ -:io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerListä"KHorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects.šitems² -objectÊŒ -¾ - -apiVersion¯"¡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² +q +listKinde"XlistKind is the serialized kind of the list for this resource. Defaults to "`kind`List".² string -˜ -itemsŽ"7items is the list of horizontal pod autoscaler objects.² -arrayºH -F -D#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler -¹ -kind°"¢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² + +plural‚"ôplural is the plural name of the resource to serve. The custom resources are served under `/apis///.../`. Must match the name of the CustomResourceDefinition (in the form `.`). Must be all lowercase.² string -r -metadataf -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"'metadata is the standard list metadata.úq -x-kubernetes-group-version-kindNL- kind: HorizontalPodAutoscalerList - version: v2beta2 - group: autoscaling - -¹ -#io.k8s.api.rbac.v1beta1.RoleBinding‘ "¨RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBinding, and will no longer be served in v1.22.šroleRef² -objectÊÛ -å -roleRefÙ --#/definitions/io.k8s.api.rbac.v1beta1.RoleRef"§RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. -‰ -subjects}"=Subjects holds references to the objects the role applies to.² -arrayº1 -/ --#/definitions/io.k8s.api.rbac.v1beta1.Subject -¾ +á -apiVersion¯"¡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² +shortNamesÒ"µshortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get `. It must be all lowercase.² +arrayº + ² string -¹ -kind°"¢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² +€ +singulart"gsingular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata.úo -x-kubernetes-group-version-kindLJ- kind: RoleBinding - version: v1beta1 - group: rbac.authorization.k8s.io - -ô -io.k8s.api.core.v1.Event×"‰Event is a report of an event somewhere in the cluster. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.šmetadatašinvolvedObject² -objectÊÐ -J -countAint32",The number of times this event has occurred.² -integer -u - eventTimeh -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"(Time when this Event was first observed. -¦ -firstTimestamp“ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"XThe time at which the event was first recorded. (Time of server receipt is in TypeMeta.) -• - lastTimestampƒ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"HThe time at which the most recent occurrence of this event was recorded. -U -messageJ"=A human-readable description of the status of this operation.² +Ì +%io.k8s.api.apps.v1.DaemonSetCondition¢"IDaemonSetCondition describes the state of a DaemonSet at a certain point.štypešstatus² +objectʸ +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +Y +messageN"AA human readable message indicating details about the transition.² string -U -reportingInstance@"3ID of the controller instance, e.g. `kubelet-xyzf`.² +F +reason<"/The reason for the condition's last transition.² string -Ž -seriesƒ -,#/definitions/io.k8s.api.core.v1.EventSeries"SData about the Event series this event represents or nil if it's a singleton Event. +L +statusB"5Status of the condition, one of True, False, Unknown.² +string +1 +type)"Type of DaemonSet condition.² +string +ž +io.k8s.api.batch.v1.Job‚ "1Job represents the configuration of a single job.² +objectÊï +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Õ +specÌ +)#/definitions/io.k8s.api.batch.v1.JobSpec"žSpecification of the desired behavior of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + +status· ++#/definitions/io.k8s.api.batch.v1.JobStatus"‡Current status of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status ¾ apiVersion¯"¡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² string -j -involvedObjectX -0#/definitions/io.k8s.api.core.v1.ObjectReference"$The object that this event is about. ¹ kind°"¢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² +stringúN +x-kubernetes-group-version-kind+)- group: batch + kind: Job + version: v1 + +Òg +io.k8s.api.core.v1.ServiceSpec¯g"FServiceSpec describes the attributes that a user creates on a service.² +objectÊØf +× +loadBalancerClassÁ"³loadBalancerClass is the class of the load balancer implementation this Service belongs to. If specified, the value of this field must be a label-style identifier, with an optional prefix, e.g. "internal-vip" or "example.com/internal-vip". Unprefixed names are reserved for end-users. This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load balancer implementation is used, today this is typically done through the cloud provider integration, but should apply for any default implementation. If set, it is assumed that a load balancer implementation is watching for Services with a matching class. Any default load balancer implementation (e.g. cloud providers) should ignore Services that set this field. This field can only be set when creating or updating a Service to type 'LoadBalancer'. Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.² string -™ -reasonŽ"€This should be a short, machine understandable string that gives the reason for the transition into the object's current status.² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - -source„ -,#/definitions/io.k8s.api.core.v1.EventSource"TThe component reporting this event. Should be a short machine understandable string. -V -actionL"?What action was taken/failed regarding to the Regarding object.² +ã +loadBalancerIPÐ"ÂOnly applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.² string -r -relatedg -0#/definitions/io.k8s.api.core.v1.ObjectReference"3Optional secondary object for more complex actions. -p -reportingComponentZ"MName of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`.² +“ +loadBalancerSourceRangesö"ÙIf specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/² +arrayº + ² string -a -typeY"LType of this event (Normal, Warning), new types could be added in the future² -stringúM -x-kubernetes-group-version-kind*(- group: "" - kind: Event - version: v1 - -ð - io.k8s.api.discovery.v1.EndpointË"FEndpoint represents a single logical "backend" implementing a service.š addresses² -objectÊè -” - -conditions… -8#/definitions/io.k8s.api.discovery.v1.EndpointConditions"Iconditions contains information about the current status of the endpoint. -¾ -deprecatedTopology§"‰deprecatedTopology contains topology information part of the v1beta1 API. This field is deprecated, and will be removed when the v1beta1 API is removed (no sooner than kubernetes v1.24). While this field can hold values, it is not writable through the v1 API, and any attempts to write to it will be silently ignored. Topology information can be found in the zone and nodeName fields instead.ª +« +selectorž"€Route service traffic to pods with label keys and values matching this selector. If empty or not present, the service is assumed to have an external process managing its endpoints, which Kubernetes will not modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/ª ² string² object - -hints… -3#/definitions/io.k8s.api.discovery.v1.EndpointHints"Nhints contains information associated with how an endpoint should be consumed. -Î -hostnameÁ"³hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.² -string -Ú -nodeNameÍ"¿nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.² -string - - targetRef‚ -0#/definitions/io.k8s.api.core.v1.ObjectReference"NtargetRef is a reference to a Kubernetes object that represents this endpoint. -J -zoneB"5zone is the name of the Zone this endpoint exists in.² +¥ +sessionAffinity‘"ƒSupports "ClientIP" and "None". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² string -î - addressesà" addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.² +Õ + topologyKeysÄ"§topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value "*" may be used to mean "any topology". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. This field is deprecated and will be removed in a future version.² arrayº ² -stringú -x-kubernetes-list-typeset +string +Á +externalTrafficPolicy§"™externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. "Local" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. "Cluster" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.² +string +ë -ê +clusterIPsÜ "™ ClusterIPs is a list of IP addresses assigned to this service, and are usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be empty) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are "None", empty string (""), or a valid IP address. Setting this to "None" makes a "headless service" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. If this field is not specified, it will be initialized from the clusterIP field. If this field is specified, clients must ensure that clusterIPs[0] and clusterIP have the same value. -(io.k8s.api.policy.v1.PodDisruptionBudget½ -"hPodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods² -objectÊâ -¾ +Unless the "IPv6DualStack" feature gate is enabled, this field is limited to one value, which must be the same as the clusterIP field. If the feature gate is enabled, this field may hold a maximum of two entries (dual-stack IPs, in either order). These IPs must correspond to the values of the ipFamilies field. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² +arrayº + ² +stringú# +x-kubernetes-list-type atomic -apiVersion¯"¡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² +• +healthCheckNodePortýint32"çhealthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type).² +integer +ö +internalTrafficPolicyÜ"ÎInternalTrafficPolicy specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. "Cluster" routes internal traffic to a Service to all endpoints. "Local" routes traffic to node-local endpoints only, traffic is dropped if no node-local endpoints are ready. The default value is "Cluster".² string -¹ -kind°"¢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² +ˆ +ipFamilyPolicyõ"çIPFamilyPolicy represents the dual-stack-ness requested or required by this Service, and is gated by the "IPv6DualStack" feature gate. If there is no value provided, then this field will be set to SingleStack. Services can be "SingleStack" (a single IP family), "PreferDualStack" (two IP families on dual-stack configured clusters or a single IP family on single-stack clusters), or "RequireDualStack" (two IP families on dual-stack configured clusters, otherwise fail). The ipFamilies and clusterIPs fields depend on the value of this field. This field will be wiped when updating a service to type ExternalName.² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -‡ -spec -:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetSpec"ASpecification of the desired behavior of the PodDisruptionBudget. -ƒ -statusy -<#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetStatus"9Most recently observed status of the PodDisruptionBudget.ú_ -x-kubernetes-group-version-kind<:- group: policy - kind: PodDisruptionBudget - version: v1 +¬ +publishNotReadyAddresses"€publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered "ready" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.² +boolean +‰ +allocateLoadBalancerNodePortsç"ØallocateLoadBalancerNodePorts defines if NodePorts will be automatically allocated for services with type LoadBalancer. Default is "true". It may be set to "false" if the cluster load-balancer does not rely on NodePorts. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.² +boolean +š +sessionAffinityConfig€ +6#/definitions/io.k8s.api.core.v1.SessionAffinityConfig"FsessionAffinityConfig contains the configurations of session affinity. +ñ -› -2io.k8s.api.policy.v1beta1.RunAsUserStrategyOptionsä"_RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy.šrule² -objectÊí -k -rulec"Vrule is the strategy that will dictate the allowable RunAsUser values that may be set.² -string -ý -rangesò"¯ranges are the allowed ranges of uids that may be used. If you would like to force a single uid then supply a single range with the same start and end. Required for MustRunAs.² -arrayº3 -1 -/#/definitions/io.k8s.api.policy.v1beta1.IDRange -§ -6io.k8s.api.admissionregistration.v1.RuleWithOperationsì "‚RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.² -objectÊØ -´ - apiGroups¦"‰APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.² +ipFamiliesâ"ŸIPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the "IPv6DualStack" feature gate. This field is usually assigned automatically based on cluster configuration and the ipFamilyPolicy field. If this field is specified manually, the requested family is available in the cluster, and ipFamilyPolicy allows it, it will be used; otherwise creation of the service will fail. This field is conditionally mutable: it allows for adding or removing a secondary IP family, but it does not allow changing the primary IP family of the Service. Valid values are "IPv4" and "IPv6". This field only applies to Services of types ClusterIP, NodePort, and LoadBalancer, and does apply to "headless" services. This field will be wiped when updating a Service to type ExternalName. + +This field may hold a maximum of two entries (dual-stack families, in either order). These families must correspond to the values of the clusterIPs field, if specified. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.² arrayº ² -string -¼ - apiVersions¬"APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.² +stringú# +x-kubernetes-list-type atomic + +ò + externalIPsâ"ÅexternalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service. These IPs are not managed by Kubernetes. The user is responsible for ensuring that traffic arrives at a node with this IP. A common example is external load-balancers that are not part of the Kubernetes system.² arrayº ² string -  - -operations‘"ôOperations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.² +¸ + externalName§"™externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be "ExternalName".² +string +• +ports‹"ŸThe list of ports that are exposed by this service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² +arrayº0 +. +,#/definitions/io.k8s.api.core.v1.ServicePortú2 +x-kubernetes-list-map-keys- port +- protocol +ú +x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keyport +ú' +x-kubernetes-patch-strategymerge + +‹ +type‚"ôtype determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. "ClusterIP" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object or EndpointSlice objects. If clusterIP is "None", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a virtual IP. "NodePort" builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the clusterIP. "LoadBalancer" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the same endpoints as the clusterIP. "ExternalName" aliases this service to the specified externalName. Several other fields do not apply to ExternalName services. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types² +string +á + clusterIPÓ"ÅclusterIP is the IP address of the service and is usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be blank) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are "None", empty string (""), or a valid IP address. Setting this to "None" makes a "headless service" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² +string +™ +-io.k8s.apimachinery.pkg.api.resource.Quantityç"ÙQuantity is a fixed-point representation of a number. It provides convenient marshaling/unmarshaling in JSON and YAML, in addition to String() and AsInt64() accessors. + +The serialization format is: + + ::= + (Note that may be empty, from the "" case in .) + ::= 0 | 1 | ... | 9 ::= | ::= | . | . | . ::= "+" | "-" ::= | ::= | | ::= Ki | Mi | Gi | Ti | Pi | Ei + (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) + ::= m | "" | k | M | G | T | P | E + (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) + ::= "e" | "E" + +No matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities. + +When a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized. + +Before serializing, Quantity will be put in "canonical form". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that: + a. No precision is lost + b. No fractional digits will be emitted + c. The exponent (or suffix) is as large as possible. +The sign will be omitted unless the number is negative. + +Examples: + 1.5 will be serialized as "1500m" + 1.5Gi will be serialized as "1536Mi" + +Note that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise. + +Non-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.) + +This format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation.² +string +Ù +1io.k8s.api.autoscaling.v2beta2.ObjectMetricSource£"‰ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).šdescribedObjectštargetšmetric² +objectÊä +] +describedObjectJ +H#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference +ƒ +metricy +=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector +} +targets +9#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget"6target specifies the target value for the given metric +® +(io.k8s.api.core.v1.AzureFileVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod.š +secretNameš shareName² +objectÊ€ +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean +^ + +secretNameP"Cthe name of secret that contains Azure Storage Account Name and Key² +string +$ + shareName" +Share Name² +string +ƒ +,io.k8s.api.core.v1.PersistentVolumeClaimSpecÒ "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes² +objectÊ¿ +Ë + accessModes»"žAccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1² arrayº ² string -– - resourcesˆ"ëResources is a list of resources this rule applies to. - -For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. - -If wildcard is present, the validation rule will ensure resources do not overlap with each other. +Ô -Depending on the enclosing object, subresources might not be allowed. Required.² -arrayº - ² -string -£ -scope™"‹scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".² -string -„ -io.k8s.api.core.v1.KeyToPathã",Maps a string key to a path within a volume.škeyšpath² -objectÊ™ -' -key "The key to project.² -string -» -mode²int32"œOptional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² -integer -¯ -path¦"˜The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'.² -string -ú -io.k8s.api.core.v1.NodeListÚ"ONodeList is the whole list of all Nodes which have been registered with master.šitems² -objectÊŸ -¹ -kind°"¢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² +dataSourceÅ +:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"†This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. +Þ + resourcesÐ +5#/definitions/io.k8s.api.core.v1.ResourceRequirements"–Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources +ƒ +selectorw +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"3A label query over volumes to consider for binding. +¤ +storageClassName"Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds -¾ + -apiVersion¯"¡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² +volumeModeŽ"€volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.² string -N -itemsE" List of nodes² -arrayº) -' -%#/definitions/io.k8s.api.core.v1.NodeúP -x-kubernetes-group-version-kind-+- group: "" - kind: NodeList - version: v1 - -± -,io.k8s.api.core.v1.ReplicationControllerSpec€ "KReplicationControllerSpec is the specification of a replication controller.² -objectʤ +j -½ -template° -0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"ûTemplate is the object that describes the pod that will be created if insufficient replicas are detected. This takes precedence over a TemplateRef. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template -ƒ -minReadySecondsïint32"ÙMinimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)² -integer -  -replicas“int32"ýReplicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller² -integer -¸ -selector«"Selector is a label query over pods that should match the Replicas count. If Selector is empty, it is defaulted to the labels present on the Pod template. Label keys and values that must match in order to be controlled by this replication controller, if empty defaulted to labels on Pod template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectorsª - ² -string² -object -á -&io.k8s.api.scheduling.v1.PriorityClass¶"{PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.švalue² -objectÊ» -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -„ -preemptionPolicyï"áPreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.² +volumeName\"OVolumeName is the binding reference to the PersistentVolume backing this claim.² string -¨ -valuežint32"ˆThe value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.² -integer +Æ +-io.k8s.api.flowcontrol.v1beta1.FlowSchemaList” "/FlowSchemaList is a list of FlowSchema objects.šitems² +objectÊÔ +Þ +metadataÑ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‘`metadata` is the standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ¾ apiVersion¯"¡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² string -‹ - description|"odescription is an arbitrary string that usually provides guidelines on when this priority class should be used.² -string -¦ - globalDefault”"…globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.² -boolean +t +itemsk"!`items` is a list of FlowSchemas.² +arrayº; +9 +7#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema ¹ kind°"¢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² -stringúd -x-kubernetes-group-version-kindA?- group: scheduling.k8s.io - kind: PriorityClass - version: v1 +stringúu +x-kubernetes-group-version-kindRP- group: flowcontrol.apiserver.k8s.io + kind: FlowSchemaList + version: v1beta1 + +Ó +$io.k8s.api.networking.v1.IngressRuleª "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² +objectʬ +â + +hostÙ +"Ë +Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to + the IP in the Spec of the parent Ingress. +2. The `:` delimiter is not respected because ports are not allowed. + Currently the port of an Ingress is implicitly :80 for http and + :443 for https. +Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. + +Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² +string +E +http= +;#/definitions/io.k8s.api.networking.v1.HTTPIngressRuleValue +º +%io.k8s.api.networking.v1beta1.Ingress "€Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.² +objectʘ -Ò -+io.k8s.api.scheduling.v1beta1.PriorityClass¢"áDEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.švalue² -objectÊ» ¾ apiVersion¯"¡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² string -‹ - description|"odescription is an arbitrary string that usually provides guidelines on when this priority class should be used.² -string -¦ - globalDefault”"…globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.² -boolean ¹ kind°"¢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² string Ò metadataÅ =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -„ -preemptionPolicyï"áPreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.² -string -¨ -valuežint32"ˆThe value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.² -integerúi -x-kubernetes-group-version-kindFD- group: scheduling.k8s.io - kind: PriorityClass +Ý +specÔ +7#/definitions/io.k8s.api.networking.v1beta1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ã +statusØ +9#/definitions/io.k8s.api.networking.v1beta1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúc +x-kubernetes-group-version-kind@>- group: networking.k8s.io + kind: Ingress version: v1beta1 -š -0io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceå"JAPIResource specifies the name of a resource and whether it is namespaced.šnameš singularNameš -namespacedškindšverbs² -objectÊØ -} - -categorieso"Scategories is a list of the grouped resources this resource belongs to (e.g. 'all')² -arrayº - ² -string -= -name5"(name is the plural name of the resource.² -string -ž - singularName"ÿsingularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.² -string -« -verbs¡"„verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)² -arrayº - ² -string -Ç -group½"¯group is the preferred group of the resource. Empty implies the group of the containing resource list. For subresources, this may have a different value, for example: Scale".² -string -d -kind\"Okind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')² -string -T - -namespacedF"8namespaced indicates if a resource is namespaced or not.² -boolean -h - -shortNamesZ">shortNames is a list of suggested short names of the resource.² -arrayº - ² -string -Ì -storageVersionHashµ"§The hash value of the storage version, the version this resource is converted to when written to the data store. Value must be treated as opaque by clients. Only equality comparison on the value is valid. This is an alpha feature and may change or be removed in the future. The field is populated by the apiserver only if the StorageVersionHash feature gate is enabled. This field will remain optional even if it graduates.² -string -‰ -versioný"ïversion is the preferred version of the resource. Empty implies the version of the containing resource list For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)".² -string -… -6io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerÊ "ÎHorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.² -objectÊú +ä + io.k8s.api.core.v1.EndpointsList¿"%EndpointsList is a list of endpoints.šitems² +objectÊ© +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds ¾ apiVersion¯"¡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² string +X +itemsO"List of endpoints.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.Endpoints ¹ kind°"¢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² -string -à -metadataÓ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‘metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -„ -specû -H#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec"®spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. - -status… -J#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus"7status is the current information about the autoscaler.úm -x-kubernetes-group-version-kindJH- group: autoscaling - kind: HorizontalPodAutoscaler - version: v2beta1 +stringúU +x-kubernetes-group-version-kind20- version: v1 + group: "" + kind: EndpointsList -Ù -io.k8s.api.core.v1.HTTPHeader·">HTTPHeader describes a custom header to be used in HTTP probesšnamešvalue² -objectÊZ -* -name""The header field name² +Ä +"io.k8s.api.core.v1.ObjectReference "]ObjectReference contains enough information to let you inspect or modify the referred object.² +objectʯ +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -, -value#"The header field value² +Ž + namespace€"sNamespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/² string - -!io.k8s.api.core.v1.LimitRangeSpec÷"NLimitRangeSpec defines a min/max usage limit for resources that match on kind.šlimits² -objectÊ -Œ -limits"?Limits is the list of LimitRangeItem objects that are enforced.² -arrayº3 -1 -/#/definitions/io.k8s.api.core.v1.LimitRangeItem -î+ -(io.k8s.api.storage.v1beta1.CSIDriverSpecÁ+"2CSIDriverSpec is the specification of a CSIDriver.² -objectÊþ* -É -attachRequired¶"§attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called. - -This field is immutable.² -boolean -Û - fsGroupPolicyÉ"»Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate. - -This field is immutable.² +æ +resourceVersionÒ"ÄSpecific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency² string -© -podInfoOnMount– "‡ If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. "csi.storage.k8s.io/pod.name": pod.Name "csi.storage.k8s.io/pod.namespace": pod.Namespace "csi.storage.k8s.io/pod.uid": string(pod.UID) "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume - defined by a CSIVolumeSource, otherwise "false" - -"csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the "Persistent" and "Ephemeral" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver. - -This field is immutable.² -boolean -ÿ -requiresRepublishé"ÚRequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false. - -Note: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container. - -This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² -boolean -€ -storageCapacityì"ÝIf set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information. - -The check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object. - -Alternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published. - -This field is immutable. - -This is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.² -boolean -ê - tokenRequestsØ"éTokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: "csi.storage.k8s.io/serviceAccount.tokens": { - "": { - "token": , - "expirationTimestamp": , - }, - ... -} - -Note: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically. - -This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² -arrayº9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.TokenRequestú# -x-kubernetes-list-type atomic - -³ -volumeLifecycleModesš"ýVolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is "Persistent", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is "Ephemeral". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. - -This field is immutable.² -arrayº - ² + +uidz"mUID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids² string -× -Bio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON"JSON represents any valid JSON value. These types are supported: bool, int64, float64, string, []interface{}, map[string]interface{} and nil. - -Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceConditionÒ"NAPIServiceCondition describes the state of an APIService at a particular pointštypešstatus² -objectÊã 7 -type/""Type is the type of the condition.² -string -‘ -lastTransitionTime{ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. -X -messageM"@Human-readable message indicating details about last transition.² -string -^ -reasonT"GUnique, one-word, CamelCase reason for the condition's last transition.² -string -Z -statusP"CStatus is the status of the condition. Can be True, False, Unknown.² + +apiVersion)"API version of the referent.² string -î -#io.k8s.api.core.v1.FlexVolumeSourceÆ"hFlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin.šdriver² -objectÊÄ -O -driverE"8Driver is the name of the driver to use for this volume.² +Ô + fieldPathÆ"¸If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object.² string -Ä -fsType¹"«Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.² +— +kindŽ"€Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² string -O -optionsD"'Optional: Extra command options if any.ª - ² -string² -object -‚ -readOnlyv"hOptional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -Ó - secretRefÅ -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"‹Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts. -¦ - io.k8s.api.networking.v1.Ingress "€Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.² -objectÊŽ +° +.io.k8s.api.core.v1.ReplicationControllerStatusý"VReplicationControllerStatus represents the current status of a replication controller.šreplicas² +objectÊ‹ + +availableReplicas{int32"fThe number of available replicas (ready for at least minReadySeconds) for this replication controller.² +integer +Ž + +conditionsÿ"YRepresents the latest available observations of a replication controller's current state.² +arrayºC +A +?#/definitions/io.k8s.api.core.v1.ReplicationControllerConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge +— +fullyLabeledReplicasint32"jThe number of pods that have labels matching the labels of the pod template of the replication controller.² +integer +‹ +observedGenerationuint64"`ObservedGeneration reflects the generation of the most recently observed replication controller.² +integer +c + readyReplicasRint32"=The number of ready replicas for this replication controller.² +integer +× +replicasÊint32"´Replicas is the most recently oberved number of replicas. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller² +integer +Û +*io.k8s.api.networking.v1beta1.IngressClass¬ "óIngressClass represents the class of the Ingress, referenced by the Ingress Spec. The `ingressclass.kubernetes.io/is-default-class` annotation can be used to indicate that an IngressClass should be considered default. When a single IngressClass resource has this annotation set to true, new Ingress resources without a class specified will be assigned this default class.² +objectʼ ¾ apiVersion¯"¡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² @@ -34342,508 +33997,620 @@ apiVersion Ò metadataÅ =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ø -specÏ -2#/definitions/io.k8s.api.networking.v1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -Þ -statusÓ -4#/definitions/io.k8s.api.networking.v1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú^ -x-kubernetes-group-version-kind;9- group: networking.k8s.io - kind: Ingress - version: v1 +ç +specÞ +<#/definitions/io.k8s.api.networking.v1beta1.IngressClassSpec"Spec is the desired state of the IngressClass. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúh +x-kubernetes-group-version-kindEC- version: v1beta1 + group: networking.k8s.io + kind: IngressClass -Û -"io.k8s.api.policy.v1beta1.Eviction´ "ÒEviction evicts a pod from its node subject to certain policies and safety constraints. This is a subresource of Pod. A request to cause such an eviction is created by POSTing to .../pods//evictions.² -objectÊô -€ -metadatat -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"3ObjectMeta describes the pod that is being evicted. +æ +'io.k8s.api.policy.v1beta1.HostPortRangeº"HostPortRange defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.šminšmax² +objectÊŒ +C +max<int32"'max is the end of the range, inclusive.² +integer +E +min>int32")min is the start of the range, inclusive.² +integer +î +4io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceListµ "¦APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.š groupVersionš resources² +objectʈ +§ + resources™"Hresources contains the name of the resources and if they are namespaced.² +arrayºB +@ +>#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResource ¾ apiVersion¯"¡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² string -r - deleteOptionsa -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions"DeleteOptions may be provided +_ + groupVersionO"BgroupVersion is the group and version this APIResourceList is for.² +string ¹ kind°"¢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² -stringúY -x-kubernetes-group-version-kind64- group: policy - kind: Eviction - version: v1beta1 - -ð -&io.k8s.api.core.v1.NodeDaemonEndpointsÅ"FNodeDaemonEndpoints lists ports opened by daemons running on the Node.² -objectÊo -m -kubeletEndpointZ -/#/definitions/io.k8s.api.core.v1.DaemonEndpoint"'Endpoint on which Kubelet is listening. -î -?io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatusª² -objectÊ› -˜ - certificateˆbyte"OIf request was approved, the controller will place the issued certificate here.² -stringú# -x-kubernetes-list-type atomic - -ý - -conditionsî">Conditions applied to the request, such as approval or denial.² -arrayºT -R -P#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestConditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap - -Ý +stringúW +x-kubernetes-group-version-kind42- version: v1 + group: "" + kind: APIResourceList -&io.k8s.api.core.v1.ScaleIOVolumeSource² -":ScaleIOVolumeSource represents a persistent ScaleIO volumešgatewayšsystemš secretRef² -objectÊÈ -` +Í +io.k8s.api.core.v1.EventList¬"EventList is a list of events.šitems² +objectÊ¡ +¾ -sslEnabledR"DFlag to enable/disable SSL communication with Gateway, default false² -boolean - +apiVersion¯"¡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² +string +P +itemsG"List of events² +arrayº* +( +&#/definitions/io.k8s.api.core.v1.Event +¹ +kind°"¢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² +string +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúQ +x-kubernetes-group-version-kind.,- group: "" + kind: EventList + version: v1 -volumeNames"fThe name of a volume already created in the ScaleIO system that is associated with this volume source.² +õ +#io.k8s.api.core.v1.PodReadinessGateÍ":PodReadinessGate contains the reference to a pod conditionš conditionType² +objectÊs +q + conditionType`"SConditionType refers to a condition in the pod's condition list with matching type.² +string +Å +\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScaleä "^CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.šspecReplicasPathšstatusReplicasPath² +objectÊÍ +€ +statusReplicasPathé"ÛstatusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.² string -D -gateway9",The host address of the ScaleIO API Gateway.² +á +labelSelectorPathË"½labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.² string -Ð - secretRef -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"ˆSecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. -x -readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -’ - storageMode‚"uIndicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.² +ã +specReplicasPathÎ"ÀspecReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.² string -[ - storagePoolL"?The ScaleIO Storage Pool associated with the protection domain.² +† +0io.k8s.apimachinery.pkg.apis.meta.v1.StatusCauseÑ"xStatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.² +objectÊÈ +¶ +field¬"žThe field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional. + +Examples: + "name" - the field "name" on the current resource + "items[0].name" - the field "name" on the first array entry in "items"² string -O -systemE"8The name of the storage system as configured in ScaleIO.² + +messaget"gA human-readable description of the cause of the error. This field may be presented as-is to a reader.² string -¡ -fsType–"ˆFilesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs".² +‹ +reason€"sA machine-readable description of the cause of the error. If this value is empty there is no information available.² string -f -protectionDomainR"EThe name of the ScaleIO Protection Domain for the configured storage.² +ª +io.k8s.api.core.v1.SecretŒ"‚Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.² +objectʧ +¹ +kind°"¢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² string -Ÿ -=io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirementÝ"xA label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.škeyšoperator² -objectÊà -’ -values‡"êvalues is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.² -arrayº +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ê + +stringData»"stringData allows specifying non-binary secret data in string form. It is provided as a write-only input field for convenience. All keys and values are merged into the data field on write, overwriting any existing values. The stringData field is never output when reading from the API.ª ² +string² +object +M +typeE"8Used to facilitate programmatic handling of secret data.² string -š -key’"2key is the label key that the selector applies to.² -stringú' -x-kubernetes-patch-strategymerge -ú& -x-kubernetes-patch-merge-keykey +¾ -Ž -operator"toperator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.² +apiVersion¯"¡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² +string +Î +dataÅ"¡Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4ª +byte² +string² +object +å + immutable×"ÈImmutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.² +booleanúN +x-kubernetes-group-version-kind+)- version: v1 + group: "" + kind: Secret + +å +2io.k8s.api.core.v1.StorageOSPersistentVolumeSource® "2Represents a StorageOS persistent volume resource.² +objectÊë +À +fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² string -Æ -2io.k8s.api.core.v1.AzureFilePersistentVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod.š -secretNameš shareName² -objectÊŽ x readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² boolean -^ - -secretNameP"Cthe name of secret that contains Azure Storage Account Name and Key² -string +Ê + secretRef¼ +0#/definitions/io.k8s.api.core.v1.ObjectReference"‡SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. ‹ -secretNamespacex"kthe namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod² + +volumeName}"pVolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.² string -$ - shareName" -Share Name² +Ð +volumeNamespace¼"®VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.² string -ù -io.k8s.api.core.v1.LimitRange× "OLimitRange sets resource usage limits for each kind of resource in a Namespace.² -objectÊ¢ +ñ +io.k8s.api.node.v1.RuntimeClassÍ"ËRuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://kubernetes.io/docs/concepts/containers/runtime-class/šhandler² +objectʆ ¾ apiVersion¯"¡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² string +Ð +handlerÄ"¶Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called "runc" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.² +string ¹ kind°"¢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² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Í -specÄ -/#/definitions/io.k8s.api.core.v1.LimitRangeSpec"Spec defines the limits enforced. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúR -x-kubernetes-group-version-kind/-- group: "" - kind: LimitRange +µ +metadata¨ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +â +overheadÕ +)#/definitions/io.k8s.api.node.v1.Overhead"§Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see + https://kubernetes.io/docs/concepts/scheduling-eviction/pod-overhead/ +This field is in beta starting v1.18 and is only honored by servers that enable the PodOverhead feature. +– + +scheduling‡ ++#/definitions/io.k8s.api.node.v1.Scheduling"×Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.ú] +x-kubernetes-group-version-kind:8- group: node.k8s.io + kind: RuntimeClass version: v1 -Ò -=io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON"JSON represents any valid JSON value. These types are supported: bool, int64, float64, string, []interface{}, map[string]interface{} and nil. -Ò -)io.k8s.api.extensions.v1beta1.IngressSpec¤ ";IngressSpec describes the Ingress the user wishes to exist.² -objectÊØ -º -backend® -:#/definitions/io.k8s.api.extensions.v1beta1.IngressBackend"ïA default backend capable of servicing requests that don't match any rule. At least one of 'backend' or 'rules' must be specified. This field is optional to allow the loadbalancer controller or defaulting logic to specify a global default. -´ -ingressClassNameŸ"‘IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.² +û +io.k8s.api.core.v1.NodeAddressØ"8NodeAddress contains information for the node's address.štypešaddress² +objectÊ +) +address"The node address.² +string +R +typeJ"=Node address type, one of Hostname, ExternalIP or InternalIP.² +string +› + +,io.k8s.api.core.v1.PersistentVolumeClaimListê "CPersistentVolumeClaimList is a list of PersistentVolumeClaim items.šitems² +objectʪ +¾ + +apiVersion¯"¡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² string Ø -rulesÎ"ƒA list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.² -arrayº; -9 -7#/definitions/io.k8s.api.extensions.v1beta1.IngressRule -† -tlsþ"´TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.² +itemsÎ"„A list of persistent volume claims. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims² arrayº: 8 -6#/definitions/io.k8s.api.extensions.v1beta1.IngressTLS -ð -/io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus¼">FlowSchemaStatus represents the current state of a FlowSchema.² -objectÊí -ê - -conditionsÛ";`conditions` is a list of the current states of FlowSchema.² -arrayºD -B -@#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaConditionú -x-kubernetes-list-typemap -ú' -x-kubernetes-list-map-keys - type - -® -"io.k8s.api.rbac.v1.ClusterRoleList‡"/ClusterRoleList is a collection of ClusterRolesšitems² -objectÊÎ +6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim ¹ kind°"¢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² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata. -¾ - -apiVersion¯"¡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² -string -g -items^"Items is a list of ClusterRoles² -arrayº0 -. -,#/definitions/io.k8s.api.rbac.v1.ClusterRoleún -x-kubernetes-group-version-kindKI- group: rbac.authorization.k8s.io - kind: ClusterRoleList +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúa +x-kubernetes-group-version-kind><- kind: PersistentVolumeClaimList version: v1 + group: "" -‰ -!io.k8s.api.apps.v1.DeploymentSpecã "NDeploymentSpec is the specification of the desired behavior of the Deployment.šselectorštemplate² -objectÊî -  -progressDeadlineSeconds„int32"îThe maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.² -integer +ž +*io.k8s.api.apps.v1.DaemonSetUpdateStrategyï"XDaemonSetUpdateStrategy is a struct used to control the update strategy for a DaemonSet.² +objectʆ +o +typeg"ZType of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate.² +string ’ -replicas…int32"pNumber of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.² -integer -à -revisionHistoryLimitªint32"”The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.² -integer -ö -selectoré -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¤Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. -¹ -strategy¬ -3#/definitions/io.k8s.api.apps.v1.DeploymentStrategy"FThe deployment strategy to use to replace existing pods with new ones.ú, -x-kubernetes-patch-strategy  retainKeys - -q -templatee -0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"1Template describes the pods that will be created. -ƒ -minReadySecondsïint32"ÙMinimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)² -integer -@ -paused6"(Indicates that the deployment is paused.² + rollingUpdate€ +7#/definitions/io.k8s.api.apps.v1.RollingUpdateDaemonSet"ERolling update config params. Present only if type = "RollingUpdate". +ä +,io.k8s.api.core.v1.CSIPersistentVolumeSource³"RRepresents storage that is managed by an external CSI volume driver (Beta feature)šdriverš volumeHandle² +objectʸ +­ +controllerPublishSecretRefŽ +0#/definitions/io.k8s.api.core.v1.SecretReference"ÙControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. +² + volumeHandle¡"“VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls. Required.² +string +Ž +fsTypeƒ"vFilesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs".² +string +• +nodePublishSecretRefü +0#/definitions/io.k8s.api.core.v1.SecretReference"ÇNodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. +¡ +nodeStageSecretRefŠ +0#/definitions/io.k8s.api.core.v1.SecretReference"ÕNodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. +x +readOnlyl"^Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).² boolean -Ü - --io.k8s.api.authentication.v1beta1.TokenReviewª -"§TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.šspec² -objectÊü -© -statusž -A#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewStatus"YStatus is filled in by the server and indicates whether the request can be authenticated. +U +volumeAttributesA"$Attributes of the volume to publish.ª + ² +string² +object +× +controllerExpandSecretRef¹ +0#/definitions/io.k8s.api.core.v1.SecretReference"„ControllerExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerExpandVolume call. This is an alpha field and requires enabling ExpandCSIVolumes feature gate. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. +Y +driverO"BDriver is the name of the driver to use for this volume. Required.² +string +Ù +Bio.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition’"LPriorityLevelConfigurationCondition defines the condition of priority level.² +objectʵ +g +message\"O`message` is a human-readable message indicating details about last transition.² +string +l +reasonb"U`reason` is a unique, one-word, CamelCase reason for the condition's last transition.² +string +f +status\"O`status` is the status of the condition. Can be True, False, Unknown. Required.² +string +C +type;".`type` is the type of the condition. Required.² +string +® +lastTransitionTime— +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"\`lastTransitionTime` is the last time the condition transitioned from one status to another. +• +/io.k8s.api.storage.v1beta1.VolumeAttachmentSpecá"HVolumeAttachmentSpec is the specification of a VolumeAttachment request.šattacheršsourcešnodeName² +objectÊé +— +attacherŠ"}Attacher indicates the name of the volume driver that MUST handle this request. This is the name returned by GetPluginName().² +string +H +nodeName<"/The node that the volume should be attached to.² +string +‚ +sourcex +?#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentSource"5Source represents the volume that should be attached. +û +%io.k8s.api.discovery.v1.EndpointSliceÑ"ÜEndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.š addressTypeš endpoints² +objectÊã +ð + addressTypeà"ÒaddressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.² +string ¾ apiVersion¯"¡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² string +ß + endpointsÑ"jendpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.² +arrayº2 +0 +.#/definitions/io.k8s.api.discovery.v1.Endpointú# +x-kubernetes-list-type atomic + ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -ƒ -spec{ -?#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewSpec"8Spec holds information about the request being evaluatedúk -x-kubernetes-group-version-kindHF- group: authentication.k8s.io - kind: TokenReview - version: v1beta1 +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +¤ +portsš"®ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates "all ports". Each slice may include a maximum of 100 ports.² +arrayº6 +4 +2#/definitions/io.k8s.api.discovery.v1.EndpointPortú# +x-kubernetes-list-type atomic +úc +x-kubernetes-group-version-kind@>- group: discovery.k8s.io + kind: EndpointSlice + version: v1 -£ -io.k8s.api.core.v1.PortStatusšportšprotocol² -objectÊà -Ù -errorÏ"ÁError is to record the problem with the service port The format of the error shall comply with the following rules: - built-in error values shall be specified in this file and those shall use - CamelCase names -- cloud provider specific error values must have names that comply with the - format foo.example.com/CamelCase.² -string -i -portaint32"LPort is the port number of the service port of which status is recorded here² +å +'io.k8s.api.storage.v1beta1.TokenRequest¹": will be created for the connection.² string -‹ -reason€"sA machine-readable description of the cause of the error. If this value is empty there is no information available.² +0 +iqn)"Target iSCSI Qualified Name.² string -“ -%io.k8s.api.apps.v1.DeploymentStrategyé"HDeploymentStrategy describes how to replace existing pods with new ones.² -objectÊ -£ - rollingUpdate‘ -8#/definitions/io.k8s.api.apps.v1.RollingUpdateDeployment"URolling update config params. Present only if DeploymentStrategyType = RollingUpdate. -h -type`"SType of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.² +n +iscsiInterface\"OiSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).² string -Ç - -(io.k8s.api.authentication.v1.TokenReviewš -"§TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.šspec² -objectÊñ +4 +lun-int32"iSCSI Target Lun number.² +integer +³ +portals§"ŠiSCSI Target Portal List. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +arrayº + ² +string +k +readOnly_"QReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.² +boolean +z + secretRefm +0#/definitions/io.k8s.api.core.v1.SecretReference"9CHAP Secret for iSCSI target and initiator authentication +¤ + targetPortal“"…iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +string +R +chapAuthSession?"1whether support iSCSI Session CHAP authentication² +boolean +â + io.k8s.api.core.v1.NamespaceList½ "&NamespaceList is a list of Namespaces.šitems² +objectʦ ¾ apiVersion¯"¡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² string +Ô +itemsÊ"ŒItems is the list of Namespace objects in the list. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.Namespace ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -~ -specv -:#/definitions/io.k8s.api.authentication.v1.TokenReviewSpec"8Spec holds information about the request being evaluated -¤ -status™ -<#/definitions/io.k8s.api.authentication.v1.TokenReviewStatus"YStatus is filled in by the server and indicates whether the request can be authenticated.úf -x-kubernetes-group-version-kindCA- group: authentication.k8s.io - kind: TokenReview +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúU +x-kubernetes-group-version-kind20- kind: NamespaceList version: v1 + group: "" -º -%io.k8s.api.networking.v1beta1.Ingress "€Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.² -objectʘ +¥ +0io.k8s.api.networking.v1.NetworkPolicyEgressRuleð"ÐNetworkPolicyEgressRule describes a particular set of traffic that is allowed out of pods matched by a NetworkPolicySpec's podSelector. The traffic must match both ports and to. This type is beta-level in 1.8² +objectÊŽ +¯ +ports¥"ÙList of destination ports for outgoing traffic. Each item in this list is combined using a logical OR. If this field is empty or missing, this rule matches all ports (traffic not restricted by port). If this field is present and contains at least one item, then this rule allows traffic only if the traffic matches at least one port in the list.² +arrayº< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyPort +Ù +toÒ"†List of destinations for outgoing traffic of pods selected for this rule. Items in this list are combined using a logical OR operation. If this field is empty or missing, this rule matches all destinations (traffic not restricted by destination). If this field is present and contains at least one item, this rule allows traffic only if the traffic matches at least one item in the to list.² +arrayº< +: +8#/definitions/io.k8s.api.networking.v1.NetworkPolicyPeer +Ž +6io.k8s.api.authorization.v1.SelfSubjectRulesReviewSpecT² +objectÊF +D + namespace7"*Namespace to evaluate rules for. Required.² +string +ú +io.k8s.api.core.v1.NodeListÚ"ONodeList is the whole list of all Nodes which have been registered with master.šitems² +objectÊŸ +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +¾ -Ý -specÔ -7#/definitions/io.k8s.api.networking.v1beta1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -ã -statusØ -9#/definitions/io.k8s.api.networking.v1beta1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +apiVersion¯"¡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² +string +N +itemsE" List of nodes² +arrayº) +' +%#/definitions/io.k8s.api.core.v1.Node +¹ +kind°"¢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² +stringúP +x-kubernetes-group-version-kind-+- group: "" + kind: NodeList + version: v1 + +• +$io.k8s.api.core.v1.LocalVolumeSourceì"LLocal represents directly-attached storage with node affinity (Beta feature)špath² +objectʈ +€ +fsTypeõ"çFilesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified.² +string +‚ +pathz"mThe full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).² +string +Ý +)io.k8s.api.networking.v1beta1.IngressRule¯ "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² +objectʱ +â + +hostÙ +"Ë +Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to + the IP in the Spec of the parent Ingress. +2. The `:` delimiter is not respected because ports are not allowed. + Currently the port of an Ingress is implicitly :80 for http and + :443 for https. +Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. + +Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² +string +J +httpB +@#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressRuleValue +‚ + io.k8s.api.rbac.v1beta1.RoleListÝ"RoleList is a collection of Roles Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleList, and will no longer be served in v1.22.šitems² +objectÊÅ +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata. ¾ apiVersion¯"¡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² string +^ +itemsU"Items is a list of Roles² +arrayº. +, +*#/definitions/io.k8s.api.rbac.v1beta1.Role ¹ kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúc -x-kubernetes-group-version-kind@>- kind: Ingress +stringúl +x-kubernetes-group-version-kindIG- group: rbac.authorization.k8s.io + kind: RoleList version: v1beta1 - group: networking.k8s.io - -í - io.k8s.api.batch.v1beta1.CronJobÈ ":CronJob represents the configuration of a single cron job.² -objectÊ£ +Ž +&io.k8s.api.storage.v1beta1.CSINodeListã"/CSINodeList is a collection of CSINode objects.šitems² +objectÊ´ ¾ apiVersion¯"¡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² string +h +items_"items is the list of CSINode² +arrayº4 +2 +0#/definitions/io.k8s.api.storage.v1beta1.CSINode ¹ kind°"¢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² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -û -specò -2#/definitions/io.k8s.api.batch.v1beta1.CronJobSpec"»Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -Ð -statusÅ -4#/definitions/io.k8s.api.batch.v1beta1.CronJobStatus"ŒCurrent status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúW -x-kubernetes-group-version-kind42- version: v1beta1 - group: batch - kind: CronJob - -ó -"io.k8s.api.apps.v1.DaemonSetStatusÌ">DaemonSetStatus represents the current status of a daemon set.šcurrentNumberScheduledšnumberMisscheduledšdesiredNumberScheduledš numberReady² -objectʨ -õ - -conditionsæ"LRepresents the latest available observations of a DaemonSet's current state.² -arrayº7 -5 -3#/definitions/io.k8s.api.apps.v1.DaemonSetConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - Ê -numberAvailable¶int32" The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available (ready for at least spec.minReadySeconds)² -integer -Ý -numberMisscheduledÆint32"°The number of nodes that are running the daemon pod, but are not supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² -integer -˜ - numberReadyˆint32"sThe number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.² -integer -ä -collisionCountÑint32"»Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.² -integer -ã -currentNumberScheduledÈint32"²The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² -integer -ô -desiredNumberScheduledÙint32"ÃThe total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² -integer -Å -numberUnavailable¯int32"™The number of nodes that should be running the daemon pod and have none of the daemon pod running and available (ready for at least spec.minReadySeconds)² -integer -l -observedGenerationVint64"AThe most recent generation observed by the daemon set controller.² -integer -l -updatedNumberScheduledRint32"=The total number of nodes that are running updated daemon pod² -integer -ö -4io.k8s.api.authorization.v1.SubjectRulesReviewStatus½ "çSubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.š resourceRulesšnonResourceRulesš -incomplete² -objectÊ” -Œ -evaluationErrorø"êEvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.² -string -Ý +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúd +x-kubernetes-group-version-kindA?- kind: CSINodeList + version: v1beta1 + group: storage.k8s.io -incompleteÎ"¿Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.² -boolean -– -nonResourceRules"´NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² -arrayº= -; -9#/definitions/io.k8s.api.authorization.v1.NonResourceRule -‰ - resourceRules÷"­ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² -arrayº: -8 -6#/definitions/io.k8s.api.authorization.v1.ResourceRule -à -?io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerConditionÿ"eHorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.štypešstatus² -objectÊù +Í +3io.k8s.api.authorization.v1.SubjectAccessReviewSpec•"¢SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² +objectÊá +ª +nonResourceAttributes +?#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request +ª +resourceAttributes“ +<#/definitions/io.k8s.api.authorization.v1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request +> +uid7"*UID information about the requesting user.² +string « -lastTransitionTime” -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"YlastTransitionTime is the last time the condition transitioned from one status to another -g -message\"Omessage is a human-readable explanation containing details about the transition² +user¢"”User is the user you're testing for. If you specify "User" but not "Groups", then is it interpreted as "What if User were not a member of any groups² string -P -reasonF"9reason is the reason for the condition's last transition.² +Æ +extra¼"Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.ª +² +arrayº + ² +string² +object +N +groupsD"(Groups is the groups you're testing for.² +arrayº + ² string -S -statusI"<- group: node.k8s.io + kind: RuntimeClassList + version: v1 + +Ÿ +3io.k8s.api.autoscaling.v2beta1.ExternalMetricStatusç"nExternalMetricStatus indicates the current value of a global metric not associated with any Kubernetes object.š +metricNameš currentValue² +objectÊÌ +Ž + currentValue~ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"?currentValue is the current value of the metric (as a quantity) +d + +metricNameV"ImetricName is the name of a metric used for autoscaling in metric system.² +string +§ +metricSelector” +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"PmetricSelector is used to identify a specific time series within a given metric. +¨ +currentAverageValue +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"QcurrentAverageValue is the current value of metric averaged over autoscaled pods. +ì ++io.k8s.api.autoscaling.v2beta2.MetricStatus¼">MetricStatus describes the last-read state of a single metric.štype² +objectÊæ +Ë +containerResourceµ +J#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus"æcontainer resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +ô +externalç +A#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). + +object· +?#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). +• +podsŒ +=#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricStatus"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. +™ +resourceŒ +A#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +¥ +typeœ"Žtype is the type of metric source. It will be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each corresponds to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² +string +î +#io.k8s.api.core.v1.FlexVolumeSourceÆ"hFlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin.šdriver² +objectÊÄ +Ä +fsType¹"«Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.² +string +O +optionsD"'Optional: Extra command options if any.ª + ² +string² +object +‚ +readOnlyv"hOptional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean +Ó + secretRefÅ +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"‹Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts. +O +driverE"8Driver is the name of the driver to use for this volume.² +string +¥ +?io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatusá"VPriorityLevelConfigurationStatus represents the current state of a "request-priority".² +objectÊú +÷ + +conditionsè"8`conditions` is the current state of "request-priority".² +arrayºT +R +P#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationConditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap + +Œ +%io.k8s.api.rbac.v1.ClusterRoleBindingâ +"ŸClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.šroleRef² +objectʳ ¾ apiVersion¯"¡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² -stringúd -x-kubernetes-group-version-kindA?- group: storage.k8s.io - kind: CSINodeList - version: v1beta1 - -È -Gio.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationü "ˆValidatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and object without changing it. Deprecated in v1.16, planned for removal in v1.19. Use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration instead.² -objectÊÙ +string ¹ kind°"¢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² string -Ñ -metadataÄ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. -… -webhooksø"IWebhooks is a list of webhooks and the affected resources and operations.² -arrayºL -J -H#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge - -¾ +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. + +roleRef¶ +(#/definitions/io.k8s.api.rbac.v1.RoleRef"‰RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. +„ +subjectsx"=Subjects holds references to the objects the role applies to.² +arrayº, +* +(#/definitions/io.k8s.api.rbac.v1.Subjectúq +x-kubernetes-group-version-kindNL- group: rbac.authorization.k8s.io + kind: ClusterRoleBinding + version: v1 -apiVersion¯"¡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² -stringú… -x-kubernetes-group-version-kindb`- group: admissionregistration.k8s.io - kind: ValidatingWebhookConfiguration - version: v1beta1 +ý +io.k8s.api.rbac.v1.PolicyRuleÛ +"¡PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.šverbs² +objectÊ  +ó + apiGroupså"ÈAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.² +arrayº + ² +string +¼ +nonResourceURLs¨"‹NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.² +arrayº + ² +string +¨ + resourceNames–"zResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.² +arrayº + ² +string +† + resourcesy"]Resources is a list of resources this rule applies to. ResourceAll represents all resources.² +arrayº + ² +string +´ +verbsª"Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.² +arrayº + ² +string à 7io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview¤"ˆSelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.šspec² objectÊ‹ +¾ + +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string K metadata? =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta @@ -35002,61 +34950,52 @@ K I#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReviewSpec"9Spec holds information about the request being evaluated. ¬ status¡ -G#/definitions/io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatus"VStatus is filled in by the server and indicates the set of actions a user can perform. -¾ +G#/definitions/io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatus"VStatus is filled in by the server and indicates the set of actions a user can perform.úu +x-kubernetes-group-version-kindRP- group: authorization.k8s.io + kind: SelfSubjectRulesReview + version: v1beta1 + + +io.k8s.api.autoscaling.v1.Scalež "2Scale represents a scaling request for a resource.² +objectÊ‚ -apiVersion¯"¡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² -string ¹ kind°"¢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² -stringúu -x-kubernetes-group-version-kindRP- version: v1beta1 - group: authorization.k8s.io - kind: SelfSubjectRulesReview - -à -)io.k8s.api.core.v1.PersistentVolumeStatus•"DPersistentVolumeStatus is the current status of a persistent volume.² -objectÊÀ -j -message_"RA human-readable message indicating details about why the volume is in this state.² -string -» -phase±"£Phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase² string -“ -reasonˆ"{Reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.² -string -ë -%io.k8s.api.events.v1beta1.EventSeriesÁ"qEventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.šcountšlastObservedTime² -objectʤ -n -counteint32"Pcount is the number of occurrences in this series up to the last heartbeat time.² -integer -± -lastObservedTimeœ -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"\lastObservedTime is the time when last Event from the series was seen before last heartbeat. -à -io.k8s.api.storage.v1.CSINode¡ "ÎCSINode holds information about all CSI drivers installed on a node. CSI drivers do not need to create the CSINode object directly. As long as they use the node-driver-registrar sidecar container, the kubelet will automatically populate the CSINode object for the CSI driver as part of kubelet plugin registration. CSINode has the same name as a node. If the object is missing, it means either there are no CSI Drivers available on the node, or the Kubelet version is low enough that it doesn't create this object. CSINode has an OwnerReference that points to the corresponding node object.šspec² -objectÊÜ +Ñ +metadataÄ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. +Ñ +specÈ +1#/definitions/io.k8s.api.autoscaling.v1.ScaleSpec"’defines the behavior of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. +Ú +statusÏ +3#/definitions/io.k8s.api.autoscaling.v1.ScaleStatus"—current status of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. Read-only. ¾ apiVersion¯"¡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² -string -¹ -kind°"¢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² -string -| -metadatap -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"/metadata.name must be the Kubernetes node name. -_ -specW -/#/definitions/io.k8s.api.storage.v1.CSINodeSpec"$spec is the specification of CSINodeú[ -x-kubernetes-group-version-kind86- group: storage.k8s.io - kind: CSINode +stringúV +x-kubernetes-group-version-kind31- group: autoscaling + kind: Scale version: v1 -× -Hio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.ServiceReferenceŠ";ServiceReference holds a reference to Service.legacy.k8s.io² +è +Iio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReferenceš";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² +objectÊ» +> +name6")name is the name of the service. Required² +string +M + namespace@"3namespace is the namespace of the service. Required² +string +Y +pathQ"Dpath is an optional URL path at which the webhook will be contacted.² +string +Î +portÅint32"¯port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.² +integer +Ò +Cio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.ServiceReferenceŠ";ServiceReference holds a reference to Service.legacy.k8s.io² objectʾ 4 name,"Name is the name of the service² @@ -35067,956 +35006,766 @@ C À port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² integer -´ -4io.k8s.api.core.v1.PersistentVolumeClaimVolumeSourceû"žPersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).š claimName² -objectÊ¿ -Y -readOnlyM"?Will force the ReadOnly setting in VolumeMounts. Default false.² -boolean -á - claimNameÓ"ÅClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims² +¾ +-io.k8s.api.authentication.v1.TokenRequestSpecŒ "HTokenRequestSpec contains client provided parameters of a token request.š audiences² +objectʧ +• + audiences‡"êAudiences are the intendend audiences of the token. A recipient of a token must identitfy themself with an identifier in the list of audiences of the token, and otherwise should reject the token. A token issued for multiple audiences may be used to authenticate against any of the audiences listed but implies a high degree of trust between the target audiences.² +arrayº + ² string -$ -io.k8s.api.core.v1.PodStatusï#"¶PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.² -objectʧ" -› - -conditionsŒ"xCurrent service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² -arrayº1 -/ --#/definitions/io.k8s.api.core.v1.PodConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - -¬ -containerStatuses–"ÒThe list has one entry per container in the manifest. Each entry is currently the output of `docker inspect`. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ContainerStatus -g -hostIP]"PIP address of the host to which the pod is assigned. Empty if not yet scheduled.² +Ž +boundObjectRefû +?#/definitions/io.k8s.api.authentication.v1.BoundObjectReference"·BoundObjectRef is a reference to an object that the token will be bound to. The token will only be valid for as long as the bound object exists. NOTE: The API server's TokenReview endpoint will validate the BoundObjectRef, but other audiences may not. Keep ExpirationSeconds small if you want prompt revocation. +û +expirationSecondsåint64"ÏExpirationSeconds is the requested duration of validity of the request. The token issuer may return a token with a different validity duration so a client needs to check the 'expiration' field in a response.² +integer +æ +8io.k8s.api.networking.v1.IngressClassParametersReference©"}IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.škindšname² +objectÊ + + namespace´"¦Namespace is the namespace of the resource being referenced. This field is required when scope is set to "Namespace" and must be unset when scope is set to "Cluster".² string -ü -initContainerStatusesâ"žThe list has one entry per init container in the manifest. The most recent successful init container will have ready = true, the most recently started container will have startTime set. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ContainerStatus -x -podIPo"bIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.² +Þ +scopeÔ"ÆScope represents if this refers to a cluster or namespace scoped resource. This may be set to "Cluster" (default) or "Namespace". Field can be enabled with IngressClassNamespacedParams feature gate.² string -v -reasonl"_A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'² +Ú +apiGroupÍ"¿APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.² string -Û - startTimeÍ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"‘RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod. -‰ -ephemeralContainerStatusesê"¦Status for any ephemeral containers that have run in this pod. This field is alpha-level and is only populated by servers that enable the EphemeralContainers feature.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ContainerStatus +C +kind;".Kind is the type of resource being referenced.² +string +C +name;".Name is the name of resource being referenced.² +string + +io.k8s.api.core.v1.Probeä"€Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.² +objectÊÒ +‘ +execˆ ++#/definitions/io.k8s.api.core.v1.ExecAction"YOne and only one of the following should be specified. Exec specifies the action to take. +§ +failureThreshold’int32"}Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.² +integer k -message`"SA human readable message indicating details about why the pod is in this condition.² +httpGet` +.#/definitions/io.k8s.api.core.v1.HTTPGetAction".HTTPGet specifies the http request to perform. +} + periodSecondslint32"WHow often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.² +integer +â +timeoutSecondsÏint32"¹Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes² +integer +â +initialDelaySecondsÊint32"´Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes² +integer +Î +successThreshold¹int32"£Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.² +integer +‘ + tcpSocketƒ +0#/definitions/io.k8s.api.core.v1.TCPSocketAction"OTCPSocket specifies an action involving a TCP port. TCP hooks not yet supported +ö +terminationGracePeriodSecondsÔint64"¾Optional duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this value overrides the value provided by the pod spec. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate.² +integer +Ü +,io.k8s.api.storage.v1.VolumeAttachmentStatus«"CVolumeAttachmentStatus is the status of a VolumeAttachment request.šattached² +objectÊÌ +æ + attachErrorÖ +/#/definitions/io.k8s.api.storage.v1.VolumeError"¢The last error encountered during attach operation, if any. This field must only be set by the entity completing the attach operation, i.e. the external-attacher. +± +attached¤"•Indicates the volume is successfully attached. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.² +boolean +à +attachmentMetadata¬"ŽUpon successful attach, this field is populated with any information returned by the attach operation that must be passed into subsequent WaitForAttach or Mount calls. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.ª + ² +string² +object +æ + detachErrorÖ +/#/definitions/io.k8s.api.storage.v1.VolumeError"¢The last error encountered during detach operation, if any. This field must only be set by the entity completing the detach operation, i.e. the external-attacher. +‰ +'io.k8s.api.core.v1.HostPathVolumeSourceÝ"vRepresents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.špath² +objectÊÏ +Å +path¼"®Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath² string -Í -nominatedNodeName·"©nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.² +„ +type|"oType for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath² string -Æ -phase¼ "® The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values: - -Pending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod. - -More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase² +Æ +$io.k8s.api.core.v1.ISCSIVolumeSource "’Represents an ISCSI disk. ISCSI volumes can only be mounted as read/write once. ISCSI volumes support ownership management and SELinux relabeling.š targetPortalšiqnšlun² +objectÊÞ +n +iscsiInterface\"OiSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).² string -‡ -podIPsü"ðpodIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.² -arrayº* -( -&#/definitions/io.k8s.api.core.v1.PodIPú' -x-kubernetes-patch-strategymerge -ú% -x-kubernetes-patch-merge-keyip - -ƒ -qosClassö"èThe Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://git.k8s.io/community/contributors/design-proposals/node/resource-qos.md² +4 +lun-int32"iSCSI Target Lun number.² +integer + + secretRefr +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"9CHAP Secret for iSCSI target and initiator authentication +0 +iqn)"Target iSCSI Qualified Name.² string -“ - -,io.k8s.api.core.v1.ReplicationControllerListâ "EReplicationControllerList is a collection of replication controllers.šitems² -objectÊ  -Î -itemsÄ"{List of replication controllers. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller² -arrayº: -8 -6#/definitions/io.k8s.api.core.v1.ReplicationController -¹ -kind°"¢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² +³ +portals§"ŠiSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +arrayº + ² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds -¾ - -apiVersion¯"¡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² -stringúa -x-kubernetes-group-version-kind><- group: "" - kind: ReplicationControllerList - version: v1 - -¿ -.io.k8s.api.discovery.v1beta1.EndpointSliceListŒ"6EndpointSliceList represents a list of endpoint slicesšitems² -objectÊÎ k -itemsb"List of endpoint slices² -arrayº< -: -8#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice +readOnly_"QReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.² +boolean +¤ + targetPortal“"…iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +string +V +chapAuthDiscoveryA"3whether support iSCSI Discovery CHAP authentication² +boolean +R +chapAuthSession?"1whether support iSCSI Session CHAP authentication² +boolean +µ +fsTypeª"œFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi² +string +Ô + initiatorNameÂ"´Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection.² +string +– +'io.k8s.api.core.v1.PortworxVolumeSourceê";PortworxVolumeSource represents a Portworx volume resource.švolumeID² +objectÊ“ +Í +fsTypeÂ"´FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified.² +string +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean +G +volumeID;".VolumeID uniquely identifies a Portworx volume² +string +¬ +@io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationç +"‚MutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object.² +objectÊÒ ¹ kind°"¢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² string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. +Ñ +metadataÄ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. +þ +webhooksñ"IWebhooks is a list of webhooks and the affected resources and operations.² +arrayºE +C +A#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-patch-merge-keyname + ¾ apiVersion¯"¡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² -stringúl -x-kubernetes-group-version-kindIG- group: discovery.k8s.io - kind: EndpointSliceList - version: v1beta1 +stringú~ +x-kubernetes-group-version-kind[Y- group: admissionregistration.k8s.io + kind: MutatingWebhookConfiguration + version: v1 -· -2io.k8s.api.flowcontrol.v1beta1.FlowSchemaCondition€":FlowSchemaCondition describes conditions for a FlowSchema.² -objectʵ -g -message\"O`message` is a human-readable message indicating details about last transition.² -string -l -reasonb"U`reason` is a unique, one-word, CamelCase reason for the condition's last transition.² -string -f -status\"O`status` is the status of the condition. Can be True, False, Unknown. Required.² +¼ +)io.k8s.api.coordination.v1beta1.LeaseSpecŽ"(LeaseSpec is a specification of a Lease.² +objectÊÕ +e +holderIdentityS"FholderIdentity contains the identity of the holder of a current lease.² string -C -type;".`type` is the type of the condition. Required.² +È +leaseDurationSeconds¯int32"™leaseDurationSeconds is a duration that candidates for a lease need to wait to force acquire it. This is measure against time of last observed RenewTime.² +integer +r +leaseTransitions^int32"IleaseTransitions is the number of transitions of a lease between holders.² +integer +  + renewTime’ +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"RrenewTime is a time when the current holder of a lease has last updated the lease. +‰ + acquireTimez +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime":acquireTime is a time when the current lease was acquired. +¸ +,io.k8s.api.apps.v1.StatefulSetUpdateStrategy‡"ÏStatefulSetUpdateStrategy indicates the strategy that the StatefulSet controller will use to perform updates. It includes any additional parameters necessary to perform the update for the indicated strategy.² +objectʦ +¹ + rollingUpdate§ +A#/definitions/io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy"bRollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. +h +type`"SType indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.² string -® -lastTransitionTime— -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"\`lastTransitionTime` is the last time the condition transitioned from one status to another. -º -"io.k8s.api.rbac.v1.AggregationRule“"VAggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole² -objectʬ -© -clusterRoleSelectors"¼ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added² -arrayºD -B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector -¿ -'io.k8s.api.rbac.v1beta1.AggregationRule“"VAggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole² -objectʬ -© -clusterRoleSelectors"¼ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added² -arrayºD -B -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector -ø - -,io.k8s.apimachinery.pkg.runtime.RawExtensionÇ -"¹ -RawExtension is used to hold extensions in external versions. - -To use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types. +² +=io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpecð"¾This information is immutable after the request is created. Only the Request and Usages fields can be set on creation, other fields are derived by Kubernetes and cannot be modified by users.šrequest² +objectÊ– +¤ +usages™"ÖallowedUsages specifies a set of usage contexts the key will be valid for. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 + https://tools.ietf.org/html/rfc5280#section-4.2.1.12 +Valid values are: + "signing", + "digital signature", + "content commitment", + "key encipherment", + "key agreement", + "data encipherment", + "cert sign", + "crl sign", + "encipher only", + "decipher only", + "any", + "server auth", + "client auth", + "code signing", + "email protection", + "s/mime", + "ipsec end system", + "ipsec tunnel", + "ipsec user", + "timestamping", + "ocsp signing", + "microsoft sgc", + "netscape sgc"² +arrayº + ² +stringú# +x-kubernetes-list-type atomic -// Internal package: type MyAPIObject struct { - runtime.TypeMeta `json:",inline"` - MyPlugin runtime.Object `json:"myPlugin"` -} type PluginA struct { - AOption string `json:"aOption"` -} +d +usernameX"KInformation about the requesting user. See user.Info interface for details.² +string +† +extra}"QExtra information about the requesting user. See user.Info interface for details.ª +² +arrayº + ² +string² +object +ž +groups“"QGroup information about the requesting user. See user.Info interface for details.² +arrayº + ² +stringú# +x-kubernetes-list-type atomic -// External package: type MyAPIObject struct { - runtime.TypeMeta `json:",inline"` - MyPlugin runtime.RawExtension `json:"myPlugin"` -} type PluginA struct { - AOption string `json:"aOption"` -} +c +requestXbyte"Base64-encoded PKCS#10 CSR data² +stringú# +x-kubernetes-list-type atomic -// On the wire, the JSON will look something like this: { - "kind":"MyAPIObject", - "apiVersion":"v1", - "myPlugin": { - "kind":"PluginA", - "aOption":"foo", - }, -} +’ -So what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)² -object -… -8io.k8s.api.certificates.v1.CertificateSigningRequestListÈ"RCertificateSigningRequestList is a collection of CertificateSigningRequest objectsšitems² -objectÊä +signerNameƒ"õRequested signer for the request. It is a qualified name in the form: `scope-hostname.io/name`. If empty, it will be defaulted: + 1. If it's a kubelet client certificate, it is assigned + "kubernetes.io/kube-apiserver-client-kubelet". + 2. If it's a kubelet serving certificate, it is assigned + "kubernetes.io/kubelet-serving". + 3. Otherwise, it is assigned "kubernetes.io/legacy-unknown". +Distribution of trust for signers happens out of band. You can select on this field using `spec.signerName`.² +string +c +uid\"OUID information about the requesting user. See user.Info interface for details.² +string +õ +#io.k8s.api.core.v1.VolumeProjectionÍ"HProjection that may be projected along with other supported volume types² +objectÊô +’ +serviceAccountToken{ +>#/definitions/io.k8s.api.core.v1.ServiceAccountTokenProjection"9information about the serviceAccountToken data to project +t + configMapg +4#/definitions/io.k8s.api.core.v1.ConfigMapProjection"/information about the configMap data to project +z + downwardAPIk +6#/definitions/io.k8s.api.core.v1.DownwardAPIProjection"1information about the downwardAPI data to project +k +secreta +1#/definitions/io.k8s.api.core.v1.SecretProjection",information about the secret data to project +¹ +Eio.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationï "ÿMutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object. Deprecated in v1.16, planned for removal in v1.19. Use admissionregistration.k8s.io/v1 MutatingWebhookConfiguration instead.² +objectÊ× ¾ apiVersion¯"¡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² string -™ -items":items is a collection of CertificateSigningRequest objects² -arrayºF -D -B#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest ¹ kind°"¢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² string -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúv -x-kubernetes-group-version-kindSQ- group: certificates.k8s.io - kind: CertificateSigningRequestList - version: v1 +Ñ +metadataÄ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. +ƒ +webhooksö"IWebhooks is a list of webhooks and the affected resources and operations.² +arrayºJ +H +F#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge +úƒ +x-kubernetes-group-version-kind`^- group: admissionregistration.k8s.io + kind: MutatingWebhookConfiguration + version: v1beta1 -â -'io.k8s.api.core.v1.PersistentVolumeList¶ "9PersistentVolumeList is a list of PersistentVolume items.šitems² -objectÊ… +È +Gio.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationü "ˆValidatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and object without changing it. Deprecated in v1.16, planned for removal in v1.19. Use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration instead.² +objectÊÙ ¾ apiVersion¯"¡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² string -³ -items©"eList of persistent volumes. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes² -arrayº5 -3 -1#/definitions/io.k8s.api.core.v1.PersistentVolume ¹ kind°"¢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² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsú\ -x-kubernetes-group-version-kind97- group: "" - kind: PersistentVolumeList - version: v1 +Ñ +metadataÄ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. +… +webhooksø"IWebhooks is a list of webhooks and the affected resources and operations.² +arrayºL +J +H#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-patch-merge-keyname +ú… +x-kubernetes-group-version-kindb`- version: v1beta1 + group: admissionregistration.k8s.io + kind: ValidatingWebhookConfiguration -ë -%io.k8s.api.core.v1.ServiceAccountListÁ "6ServiceAccountList is a list of ServiceAccount objectsšitems² -objectÊ• +© ++io.k8s.api.storage.v1beta1.StorageClassListù"4StorageClassList is a collection of storage classes.šitems² +objectÊÀ +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ¾ apiVersion¯"¡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² string -à -items¹"wList of ServiceAccounts. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/² -arrayº3 -1 -/#/definitions/io.k8s.api.core.v1.ServiceAccount +t +itemsk"#Items is the list of StorageClasses² +arrayº9 +7 +5#/definitions/io.k8s.api.storage.v1beta1.StorageClass ¹ kind°"¢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² -string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúZ -x-kubernetes-group-version-kind75- group: "" - kind: ServiceAccountList - version: v1 +stringúi +x-kubernetes-group-version-kindFD- group: storage.k8s.io + kind: StorageClassList + version: v1beta1 -¹ -Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceListî"/APIServiceList is a list of APIService objects.šitems² -objectÊ´ -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta +´ + +Bio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceí "[APIService represents a server for a particular GroupVersion. Name must be "version.group".² +objectÊ“ ¾ apiVersion¯"¡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² string -j -itemsa² -arrayºT -R -P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService ¹ kind°"¢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² -stringúo -x-kubernetes-group-version-kindLJ- group: apiregistration.k8s.io - kind: APIServiceList - version: v1beta1 - -å -Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec‹"PCustomResourceDefinitionSpec describes how a user wants their resource to appearšgroupšnamesšscopešversions² -objectʇ -´ -namesª -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames"Bnames specify the resource and kind names for the custom resource. -© -preserveUnknownFields"€preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. This field is deprecated in favor of setting `x-preserve-unknown-fields` to true in `spec.versions[*].schema.openAPIV3Schema`. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.² -boolean -› -scope‘"ƒscope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`.² string -ó -versionsæ"ìversions is the list of all API versions of the defined custom resource. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² -arrayºj -h -f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersion -¥ +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +§ +specž +T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpec"FSpec contains information for locating and communicating with a server +œ +status‘ +V#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus"7Status contains derived information about an API serverúk +x-kubernetes-group-version-kindHF- group: apiregistration.k8s.io + kind: APIService + version: v1beta1 -conversion– -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversion"3conversion defines conversion settings for the CRD. -å -groupÛ"Ígroup is the API group of the defined custom resource. The custom resources are served under `/apis//...`. Must match the name of the CustomResourceDefinition (in the form `.`).² -string -é -#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimTemplate"‚Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). -apiVersion¯"¡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² +An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. + +This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. + +Required, must not be nil. +ö +io.k8s.api.core.v1.LifecycleÕ "ªLifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.² +objectÊ™ + + postStartó +(#/definitions/io.k8s.api.core.v1.Handler"ÆPostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks +’ +preStop† +(#/definitions/io.k8s.api.core.v1.Handler"ÙPreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod's termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod's termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks +Ü +*io.k8s.api.policy.v1beta1.AllowedCSIDriver­"RAllowedCSIDriver represents a single inline CSI Driver that is allowed to be used.šname² +objectÊD +B +name:"-Name is the registered name of the CSI driver² string -¹ -kind°"¢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² +Š +*io.k8s.api.storage.v1.VolumeAttachmentSpecÛ"HVolumeAttachmentSpec is the specification of a VolumeAttachment request.šattacheršsourcešnodeName² +objectÊã +— +attacherŠ"}Attacher indicates the name of the volume driver that MUST handle this request. This is the name returned by GetPluginName().² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -â -specÙ -7#/definitions/io.k8s.api.networking.v1.IngressClassSpec"Spec is the desired state of the IngressClass. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúc -x-kubernetes-group-version-kind@>- group: networking.k8s.io - kind: IngressClass - version: v1 - -« -)io.k8s.api.apps.v1.ControllerRevisionListý"UControllerRevisionList is a resource containing a list of ControllerRevision objects.šitems² -objectʬ -w -itemsn"(Items is the list of ControllerRevisions² -arrayº7 -5 -3#/definitions/io.k8s.api.apps.v1.ControllerRevision -¹ -kind°"¢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² +H +nodeName<"/The node that the volume should be attached to.² string -³ -metadata¦ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¾ - -apiVersion¯"¡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² -stringú` -x-kubernetes-group-version-kind=;- group: apps - kind: ControllerRevisionList - version: v1 - -– -4io.k8s.api.authorization.v1.LocalSubjectAccessReviewÝ "çLocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.šspec² -objectÊè -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -ñ -specè -A#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec"¢Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted. -§ -statusœ -C#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not +} +sources +:#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSource"5Source represents the volume that should be attached. +º +Bio.k8s.api.admissionregistration.v1.ValidatingWebhookConfigurationó +"‰ValidatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and object without changing it.² +objectÊÔ ¾ apiVersion¯"¡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² string ¹ kind°"¢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² -stringúr -x-kubernetes-group-version-kindOM- group: authorization.k8s.io - kind: LocalSubjectAccessReview +string +Ñ +metadataÄ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. +€ +webhooksó"IWebhooks is a list of webhooks and the affected resources and operations.² +arrayºG +E +C#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge +ú€ +x-kubernetes-group-version-kind][- group: admissionregistration.k8s.io + kind: ValidatingWebhookConfiguration version: v1 -‘ -io.k8s.api.batch.v1.JobStatusï"0JobStatus represents the current state of a Job.² -objectÊ® -Ü -completedIndexesÇ"¹CompletedIndexes holds the completed indexes when .spec.completionMode = "Indexed" in a text format. The indexes are represented as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the completed indexes are 1, 3, 4, 5 and 7, they are represented as "1,3-5,7".² +Ø +3io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus  "ÝResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source.šnamešcurrentAverageValue² +objectÊ” +× +currentAverageUtilization¹int32"£currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. It will only be present if `targetAverageValue` was set in the corresponding metric specification.² +integer +ó +currentAverageValueÛ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"›currentAverageValue is the current value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the "pods" metric source type. It will always be set, regardless of the corresponding metric specification. +B +name:"-name is the name of the resource in question.² string - -completionTime¯ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"óRepresents time when the job was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. The completion time is only set when the job finishes successfully. -¶ +‘ +%io.k8s.api.core.v1.VolumeNodeAffinityç"^VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from.² +objectÊy +w +requiredk +-#/definitions/io.k8s.api.core.v1.NodeSelector":Required specifies hard node constraints that must be met. +µ + io.k8s.api.node.v1beta1.Overhead"ROverhead structure represents the resource overhead associated with running a pod.² +objectÊ­ +ª +podFixed"NPodFixed represents the fixed resource overhead associated with running a pod.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +˜ +$io.k8s.api.apps.v1.StatefulSetStatusï "@StatefulSetStatus represents the current state of a StatefulSet.šreplicas² +objectÊ“ +ù -conditions§"ëThe latest available observations of an object's current state. When a Job fails, one of the conditions will have type "Failed" and status true. When a Job is suspended, one of the conditions will have type "Suspended" and status true; when the Job is resumed, the status of this condition will become false. When a Job is completed, one of the conditions will have type "Complete" and status true. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² -arrayº2 -0 -.#/definitions/io.k8s.api.batch.v1.JobConditionú' +conditionsê"NRepresents the latest available observations of a statefulset's current state.² +arrayº9 +7 +5#/definitions/io.k8s.api.apps.v1.StatefulSetConditionú' x-kubernetes-patch-merge-keytype ú' x-kubernetes-patch-strategymerge -ú# -x-kubernetes-list-type atomic -M -failedCint32".The number of pods which reached phase Failed.² -integer -å - startTime× -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"›Represents time when the job controller started processing a job. When a Job is created in the suspended state, this field is not set until the first time it is resumed. This field is reset every time a Job is resumed from suspension. It is represented in RFC3339 form and is in UTC. -S - succeededFint32"1The number of pods which reached phase Succeeded.² +¤ +currentRevision"‚currentRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).² +string +¯ +updatedReplicas›int32"…updatedReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by updateRevision.² integer -C -active9int32"$The number of actively running pods.² +f +replicasZint32"Ereplicas is the number of Pods created by the StatefulSet controller.² integer -Ç -0io.k8s.api.core.v1.GCEPersistentDiskVolumeSource’ "ÁRepresents a Persistent Disk resource in Google Compute Engine. - -A GCE PD must exist before mounting to a container. The disk must also be in the same GCE project and zone as the kubelet. A GCE PD can only be mounted as read/write once or read-only many times. GCE PDs support ownership management and SELinux relabeling.špdName² -objectʶ -Á -fsType¶"¨Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² +± +updateRevisionž"updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)² string -ù - partitionëint32"ÕThe partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² +þ +collisionCountëint32"ÕcollisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.² integer -² -pdName§"™Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² -string -¾ -readOnly±"¢ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² -boolean -á -io.k8s.api.core.v1.Capabilities½"HTTPHeader describes a custom header to be used in HTTP probesšnamešvalue² +objectÊZ +* +name""The header field name² string -Ò -readOnlyÅ"¶ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² -boolean -« - endpoints"EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² +, +value#"The header field value² string -· -"io.k8s.api.core.v1.PodTemplateSpec"QPodTemplateSpec describes the data a pod should have when created from a template² -objectÊ® -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ö -specÍ -(#/definitions/io.k8s.api.core.v1.PodSpec" Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -¡ -9io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationã "LPriorityLevelConfiguration represents the configuration of a priority level.² -objectÊ -¾ +ð +&io.k8s.api.core.v1.NodeDaemonEndpointsÅ"FNodeDaemonEndpoints lists ports opened by daemons running on the Node.² +objectÊo +m +kubeletEndpointZ +/#/definitions/io.k8s.api.core.v1.DaemonEndpoint"'Endpoint on which Kubelet is listening. +˜ +!io.k8s.api.core.v1.AttachedVolumeò"4AttachedVolume describes a volume attached to a nodešnameš +devicePath² +objectÊ™ +e -apiVersion¯"¡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² -string -¹ -kind°"¢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² +devicePathW"JDevicePath represents the device path where the volume should be available² string -ä -metadata× -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"•`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -” -spec‹ -K#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec"»`spec` is the specification of the desired behavior of a "request-priority". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -ƒ -statusø -M#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus"¦`status` is the current status of a "request-priority". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú -x-kubernetes-group-version-kind^\- group: flowcontrol.apiserver.k8s.io - kind: PriorityLevelConfiguration - version: v1beta1 - -° -1io.k8s.api.authorization.v1.NonResourceAttributesú"{NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface² -objectÊo -8 -path0"#Path is the URL path of the request² +0 +name("Name of the attached volume² string -3 -verb+"Verb is the standard HTTP verb² +Ö +(io.k8s.api.core.v1.DownwardAPIVolumeFile© "XDownwardAPIVolumeFile represents information to create the file containing the pod fieldšpath² +objectʹ +î +resourceFieldRefÙ +6#/definitions/io.k8s.api.core.v1.ResourceFieldSelector"žSelects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. +¦ +fieldRef™ +4#/definitions/io.k8s.api.core.v1.ObjectFieldSelector"aRequired: Selects a field of the pod: only annotations, labels, name and namespace are supported. +» +mode²int32"œOptional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +Þ +pathÕ"ÇRequired: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..'² string -ï -io.k8s.api.batch.v1.CronJobListË")CronJobList is a collection of cron jobs.šitems² -objectÊ° +¦ +!io.k8s.api.core.v1.ServiceAccount€"ºServiceAccount binds together: * a name, understood by users, and perhaps by peripheral systems, for an identity * a principal that can be authenticated and authorized * a set of secrets² +objectÊÛ ¾ apiVersion¯"¡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² string -c -itemsZ"items is the list of CronJobs.² -arrayº- -+ -)#/definitions/io.k8s.api.batch.v1.CronJob +× +automountServiceAccountToken¶"§AutomountServiceAccountToken indicates whether pods running as this service account should have an API token automatically mounted. Can be overridden at the pod level.² +boolean +å +imagePullSecretsÐ"‡ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod² +arrayº9 +7 +5#/definitions/io.k8s.api.core.v1.LocalObjectReference ¹ kind°"¢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² string -Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúV -x-kubernetes-group-version-kind31- group: batch - kind: CronJobList +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ä +secrets¸" Secrets is the list of secrets allowed to be used by pods running using this ServiceAccount. More info: https://kubernetes.io/docs/concepts/configuration/secret² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ObjectReferenceú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-patch-merge-keyname +úV +x-kubernetes-group-version-kind31- kind: ServiceAccount version: v1 + group: "" -ä -,io.k8s.api.core.v1.CSIPersistentVolumeSource³"RRepresents storage that is managed by an external CSI volume driver (Beta feature)šdriverš volumeHandle² -objectʸ -­ -controllerPublishSecretRefŽ -0#/definitions/io.k8s.api.core.v1.SecretReference"ÙControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. -Y -driverO"BDriver is the name of the driver to use for this volume. Required.² -string -• -nodePublishSecretRefü -0#/definitions/io.k8s.api.core.v1.SecretReference"ÇNodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. -² - volumeHandle¡"“VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls. Required.² -string -× -controllerExpandSecretRef¹ -0#/definitions/io.k8s.api.core.v1.SecretReference"„ControllerExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerExpandVolume call. This is an alpha field and requires enabling ExpandCSIVolumes feature gate. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. -Ž -fsTypeƒ"vFilesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs".² +® +"io.k8s.api.rbac.v1.ClusterRoleList‡"/ClusterRoleList is a collection of ClusterRolesšitems² +objectÊÎ +¾ + +apiVersion¯"¡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² string -¡ -nodeStageSecretRefŠ -0#/definitions/io.k8s.api.core.v1.SecretReference"ÕNodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. -x -readOnlyl"^Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).² -boolean -U -volumeAttributesA"$Attributes of the volume to publish.ª - ² -string² -object -å -.io.k8s.api.rbac.v1beta1.ClusterRoleBindingList² "ºClusterRoleBindingList is a collection of ClusterRoleBindings. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoleBindingList, and will no longer be served in v1.22.šitems² -objectÊá +g +items^"Items is a list of ClusterRoles² +arrayº0 +. +,#/definitions/io.k8s.api.rbac.v1.ClusterRole ¹ kind°"¢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² string f metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata. +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ún +x-kubernetes-group-version-kindKI- version: v1 + group: rbac.authorization.k8s.io + kind: ClusterRoleList + +à +Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionListä"KCustomResourceDefinitionList is a list of CustomResourceDefinition objects.šitems² +objectÊ‚ ¾ apiVersion¯"¡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² string -z -itemsq"&Items is a list of ClusterRoleBindings² -arrayº< -: -8#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingúz -x-kubernetes-group-version-kindWU- group: rbac.authorization.k8s.io - kind: ClusterRoleBindingList - version: v1beta1 - -¨ -_io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionConditionÄ"YCustomResourceDefinitionCondition contains details for the current condition of this pod.štypešstatus² -objectÊÊ -e -messageZ"Mmessage is a human-readable message indicating details about last transition.² -string -j -reason`"Sreason is a unique, one-word, CamelCase reason for the condition's last transition.² -string -Z -statusP"Cstatus is the status of the condition. Can be True, False, Unknown.² -string -q -typei"\type is the type of the condition. Types include Established, NamesAccepted and Terminating.² -string -¥ -lastTransitionTimeŽ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"SlastTransitionTime last time the condition transitioned from one status to another. -ò -Tio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray™"–JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes. -® - -"io.k8s.api.core.v1.ComponentStatus‡ -"yComponentStatus (and ComponentStatusList) holds the cluster validation info. Deprecated: This API is deprecated in v1.19+² -objectÊ£ -Î - -conditions¿"%List of component conditions observed² -arrayº7 -5 -3#/definitions/io.k8s.api.core.v1.ComponentConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - +· +items­"6items list individual CustomResourceDefinition objects² +arrayºh +f +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition ¹ kind°"¢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² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¾ - -apiVersion¯"¡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² -stringúW -x-kubernetes-group-version-kind42- group: "" - kind: ComponentStatus - version: v1 +I +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaú{ +x-kubernetes-group-version-kindXV- group: apiextensions.k8s.io + kind: CustomResourceDefinitionList + version: v1beta1 -õ -0io.k8s.api.core.v1.ServiceAccountTokenProjectionÀ"ìServiceAccountTokenProjection represents a projected service account token volume. This projection can be used to insert a service account token into the pods runtime filesystem for use against APIs (Kubernetes API Server or otherwise).špath² -objectÊ» -’ -audience…"÷Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver.² -string -¹ -expirationSeconds£int64"ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes.² -integer -h -path`"SPath is the path relative to the mount point of the file to project the token into.² +§ +6io.k8s.api.admissionregistration.v1.RuleWithOperationsì "‚RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.² +objectÊØ +¼ + apiVersions¬"APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.² +arrayº + ² string -ã -1io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec­ "BPodDisruptionBudgetSpec is a description of a PodDisruptionBudget.² -objectÊÚ -š -selector -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"œLabel query over pods whose evictions are managed by the disruption budget. A null selector selects no pods. An empty selector ({}) also selects no pods, which differs from standard behavior of selecting all pods. In policy/v1, an empty selector will select all pods in the namespace.ú) -x-kubernetes-patch-strategy -replace - -ð -maxUnavailableÝ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"›An eviction is allowed if at most "maxUnavailable" pods selected by "selector" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with "minAvailable". -Ç - minAvailable¶ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ôAn eviction is allowed if at least "minAvailable" pods selected by "selector" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying "100%". -„ - -io.k8s.api.core.v1.NodeAffinityà ";Node affinity is a group of node affinity scheduling rules.² -objectÊ” -° -.requiredDuringSchedulingIgnoredDuringExecutioný --#/definitions/io.k8s.api.core.v1.NodeSelector"ËIf the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. -Þ -/preferredDuringSchedulingIgnoredDuringExecutionª"ÞThe scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.² -arrayº< -: -8#/definitions/io.k8s.api.core.v1.PreferredSchedulingTerm -à -0io.k8s.api.core.v1.PersistentVolumeClaimTemplateŽ"sPersistentVolumeClaimTemplate is used to produce PersistentVolumeClaim objects as part of an EphemeralVolumeSource.šspec² -objectʃ -è -metadataÛ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"™May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. -• -specŒ -:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimSpec"ÍThe specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. -¾ -io.k8s.api.core.v1.PodAffinity› "?Pod affinity is a group of inter pod affinity scheduling rules.² -objectÊË - -Ù -.requiredDuringSchedulingIgnoredDuringExecution¦"âIf the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.PodAffinityTerm -ì -/preferredDuringSchedulingIgnoredDuringExecution¸"ìThe scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.² -arrayº< -: -8#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm -° -.io.k8s.api.core.v1.ReplicationControllerStatusý"VReplicationControllerStatus represents the current status of a replication controller.šreplicas² -objectÊ‹ -c - readyReplicasRint32"=The number of ready replicas for this replication controller.² -integer -× -replicasÊint32"´Replicas is the most recently oberved number of replicas. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller² -integer - -availableReplicas{int32"fThe number of available replicas (ready for at least minReadySeconds) for this replication controller.² -integer -Ž - -conditionsÿ"YRepresents the latest available observations of a replication controller's current state.² -arrayºC -A -?#/definitions/io.k8s.api.core.v1.ReplicationControllerConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - -— -fullyLabeledReplicasint32"jThe number of pods that have labels matching the labels of the pod template of the replication controller.² -integer -‹ -observedGenerationuint64"`ObservedGeneration reflects the generation of the most recently observed replication controller.² -integer - -+io.k8s.api.networking.v1beta1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² -objectʈ -… - loadBalanceru -3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. -…, -:io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookÆ+"`ValidatingWebhook describes an admission webhook and the resources and operations it applies to.šnameš clientConfig² -objectÊ¿* -œ -timeoutSeconds‰int32"óTimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.² -integer -ž - clientConfig -J#/definitions/io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig"?ClientConfig defines how to communicate with the hook. Required -Ü -namespaceSelectorÆ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. +  -For example, to run the webhook on any objects whose namespace is not associated with "runlevel" of "0" or "1"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "runlevel", - "operator": "NotIn", - "values": [ - "0", - "1" - ] - } - ] -} +operations‘"ôOperations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.² +arrayº + ² +string +– + resourcesˆ"ëResources is a list of resources this rule applies to. -If instead you want to only run the webhook on any objects whose namespace is associated with the "environment" of "prod" or "staging"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "environment", - "operator": "In", - "values": [ - "prod", - "staging" - ] - } - ] -} +For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. -See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors. +If wildcard is present, the validation rule will ensure resources do not overlap with each other. -Default to the empty LabelSelector, which matches everything. -î -rulesä"‡Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.² -arrayºM -K -I#/definitions/io.k8s.api.admissionregistration.v1beta1.RuleWithOperations -ç -nameÞ"ÐThe name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where "imagepolicy" is the name of the webhook, and kubernetes.io is the name of the organization. Required.² +Depending on the enclosing object, subresources might not be allowed. Required.² +arrayº + ² string -é -objectSelectorÖ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‘ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything. -Ø - sideEffectsÈ"ºSideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.² +£ +scope™"‹scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".² string -° -admissionReviewVersions”"÷AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.² +´ + apiGroups¦"‰APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.² arrayº ² string -® - failurePolicyœ"ŽFailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Ignore.² +¼ +3io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy„"kRollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.² +objectʈ +… + partitionxint32"cPartition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.² +integer +Ü +io.k8s.api.core.v1.ServiceList¹"%ServiceList holds a list of services.šitems² +objectÊ¥ +¹ +kind°"¢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² string -— - matchPolicy‡"ùmatchPolicy defines how the "rules" list is used to match incoming requests. Allowed values are "Exact" or "Equivalent". +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +¾ -- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook. +apiVersion¯"¡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² +string +T +itemsK"List of services² +arrayº, +* +(#/definitions/io.k8s.api.core.v1.ServiceúS +x-kubernetes-group-version-kind0.- kind: ServiceList + version: v1 + group: "" -- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook. +Î +"io.k8s.api.storage.v1beta1.CSINode§ "ÊDEPRECATED - This group version of CSINode is deprecated by storage/v1/CSINode. See the release notes for more information. CSINode holds information about all CSI drivers installed on a node. CSI drivers do not need to create the CSINode object directly. As long as they use the node-driver-registrar sidecar container, the kubelet will automatically populate the CSINode object for the CSI driver as part of kubelet plugin registration. CSINode has the same name as a node. If the object is missing, it means either there are no CSI Drivers available on the node, or the Kubelet version is low enough that it doesn't create this object. CSINode has an OwnerReference that points to the corresponding node object.šspec² +objectÊá +| +metadatap +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"/metadata.name must be the Kubernetes node name. +d +spec\ +4#/definitions/io.k8s.api.storage.v1beta1.CSINodeSpec"$spec is the specification of CSINode +¾ -Defaults to "Exact"² -string -˜ -$io.k8s.api.apps.v1.StatefulSetStatusï "@StatefulSetStatus represents the current state of a StatefulSet.šreplicas² -objectÊ“ -¤ -currentRevision"‚currentRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).² -string -Ü -observedGenerationÅint64"¯observedGeneration is the most recent generation observed for this StatefulSet. It corresponds to the StatefulSet's generation, which is updated on mutation by the API Server.² -integer -Œ - readyReplicas{int32"freadyReplicas is the number of Pods created by the StatefulSet controller that have a Ready Condition.² -integer -± -updateRevisionž"updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)² +apiVersion¯"¡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² string -þ -collisionCountëint32"ÕcollisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.² -integer -ù - -conditionsê"NRepresents the latest available observations of a statefulset's current state.² -arrayº9 -7 -5#/definitions/io.k8s.api.apps.v1.StatefulSetConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge +¹ +kind°"¢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² +stringú` +x-kubernetes-group-version-kind=;- group: storage.k8s.io + kind: CSINode + version: v1beta1 -° -currentReplicasœint32"†currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.² -integer -f -replicasZint32"Ereplicas is the number of Pods created by the StatefulSet controller.² -integer -¯ -updatedReplicas›int32"…updatedReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by updateRevision.² -integer · $io.k8s.api.coordination.v1.LeaseSpecŽ"(LeaseSpec is a specification of a Lease.² objectÊÕ @@ -36035,132 +35784,176 @@ r   renewTime’ <#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"RrenewTime is a time when the current holder of a lease has last updated the lease. -µ -2io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorþ"ËA label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.² -objectÊü -É -matchExpressions´"VmatchExpressions is a list of label selector requirements. The requirements are ANDed.² -arrayºO -M -K#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement -­ - matchLabels"ÿmatchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.ª +¦ +io.k8s.api.core.v1.HostAlias…"oHostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file.² +objectÊ… +L + hostnames?"#Hostnames for the above IP address.² +arrayº ² -string² -objectú" -x-kubernetes-map-type atomic - -¹ -;io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptionsù"dSupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy.² -objectÊ„ -t -rulel"_rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.² -string -‹ -ranges€"½ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end. Required for MustRunAs.² -arrayº3 -1 -/#/definitions/io.k8s.api.policy.v1beta1.IDRange -­ -/io.k8s.api.autoscaling.v2beta2.MetricIdentifierù"FMetricIdentifier defines the name and optionally selector for a metricšname² -objectÊ› -Ý -selectorÐ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‹selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics. -9 -name1"$name is the name of the given metric² string -¢ -'io.k8s.api.core.v1.EmptyDirVolumeSourceö"uRepresents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.² -objectÊð -… -mediumú"ìWhat type of storage medium should back this directory. The default is "" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir² +5 +ip/""IP address of the host file entry.² string -å - sizeLimit× -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"—Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir -— -io.k8s.api.core.v1.PodConditionó"DPodCondition contains details for the current condition of this pod.štypešstatus² -objectÊŽ -· -status¬"žStatus is the status of the condition. Can be True, False, Unknown. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² +ƒ +3io.k8s.api.autoscaling.v2beta2.ResourceMetricStatusË"ÝResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source.šnamešcurrent² +objectÊË +„ +currenty +>#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric +B +name:"-Name is the name of the resource in question.² string -“ -typeŠ"}Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² +ð +(io.k8s.api.core.v1.ContainerStateRunningÃ"8ContainerStateRunning is a running state of a container.² +objectÊ{ +y + startedAtl +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"1Time at which the container was last (re-)started +‚ ++io.k8s.api.networking.v1.ServiceBackendPortÒ"8ServiceBackendPort is the service port being referenced.² +objectʉ + +number„int32"oNumber is the numerical port number (e.g. 80) on the Service. This is a mutually exclusive setting with "Name".² +integer +u +namem"`Name is the name of the port on the Service. This is a mutually exclusive setting with "Number".² string -n - lastProbeTime] -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time""Last time we probed the condition. -‘ -lastTransitionTime{ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. -X -messageM"@Human-readable message indicating details about last transition.² +Ë +,io.k8s.api.networking.v1beta1.IngressBackendš"DIngressBackend describes all endpoints for a given service and port.² +objectÊÅ +ø +resourceë +:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"¬Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified. +I + serviceName:"-Specifies the name of the referenced service.² string -^ -reasonT"GUnique, one-word, CamelCase reason for the condition's last transition.² +} + servicePortn +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"-Specifies the port of the referenced service. +´ +io.k8s.api.rbac.v1beta1.Subject"ÆSubject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.škindšname² +objectʪ +à +apiGroup¶"¨APIGroup holds the API group of the referenced subject. Defaults to "" for ServiceAccount subjects. Defaults to "rbac.authorization.k8s.io" for User and Group subjects.² string -ƒ -io.k8s.api.core.v1.EndpointPortß"5EndpointPort is a tuple that describes a single port.šport² -objectÊ’ -½ - appProtocol­"ŸThe application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.² +à +kind×"ÉKind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". If the Authorizer does not recognized the kind value, the Authorizer should report an error.² string -¬ -name£"•The name of this port. This must match the 'name' field in the corresponding ServicePort. Must be a DNS_LABEL. Optional only if one port is defined.² +9 +name1"$Name of the object being referenced.² string -= -port5int32" The port number of the endpoint.² -integer -b -protocolV"IThe IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.² +à + namespaceµ"§Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty the Authorizer should report an error.² string -‘ -%io.k8s.api.core.v1.VolumeNodeAffinityç"^VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from.² -objectÊy -w -requiredk --#/definitions/io.k8s.api.core.v1.NodeSelector":Required specifies hard node constraints that must be met. - --io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpecë "GFlowSchemaSpec describes how the FlowSchema's specification looks like.špriorityLevelConfiguration² -objectÊö +” +Aio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceSpecÎ"£APIServiceSpec contains information for locating and communicating with a server. Only https is supported, though you are able to disable certificate verification.šgroupPriorityMinimumšversionPriority² +objectÊð +ì +caBundleßbyte"¥CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.² +stringú# +x-kubernetes-list-type atomic -¦ -distinguisherMethodŽ -D#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod"Å`distinguisherMethod` defines how to compute the flow distinguisher for requests that match this schema. `nil` specifies that the distinguisher is disabled and thus will always be the empty string. - -matchingPrecedenceøint32"â`matchingPrecedence` is used to choose among the FlowSchemas that match a given request. The chosen FlowSchema is among those with the numerically lowest (which we take to be logically highest) MatchingPrecedence. Each MatchingPrecedence value must be ranged in [1,10000]. Note that if the precedence is not specified, it will be set to 1000 as default.² +C +group:"-Group is the API group name this server hosts² +string +± +groupPriorityMinimum˜int32"‚GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s² integer -Á -priorityLevelConfiguration¢ -P#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference"Í`priorityLevelConfiguration` should reference a PriorityLevelConfiguration in the cluster. If the reference cannot be resolved, the FlowSchema will be ignored and marked as invalid in its status. Required. +Í +insecureSkipTLSVerify³"¤InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server. This is strongly discouraged. You should use the CABundle instead.² +boolean ô -rulesê"ì`rules` describes which requests will match this flow schema. This FlowSchema matches a request if and only if at least one member of rules matches the request. if it is an empty slice, there will be no requests matching the FlowSchema.² -arrayºH -F -D#/definitions/io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjectsú# -x-kubernetes-list-type atomic +serviceè +Q#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.ServiceReference"’Service is a reference to the service for this API server. It must communicate on port 443. If the Service is nil, that means the handling for the API groupversion is handled locally on this server. The call will simply delegate to the normal handler chain to be fulfilled. +X +versionM"@Version is the API version this server hosts. For example, "v1"² +string +ä +versionPriorityÐint32"ºVersionPriority controls the ordering of this API version inside of its group. Must be greater than zero. The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10). Since it's inside of a group, the number can be small, probably in the 10s. In case of equal version priorities, the version string will be used to compute the order inside a group. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² +integer +ö + +name6")name is the name of the service. Required² +string +M + namespace@"3namespace is the namespace of the service. Required² +string +Y +pathQ"Dpath is an optional URL path at which the webhook will be contacted.² +string +Î +portÅint32"¯port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.² +integer +Ñ + io.k8s.api.core.v1.ScopeSelector¬"nA scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.² +objectÊ­ +ª +matchExpressions•"@A list of scope selector requirements by scope of the resources.² +arrayºF +D +B#/definitions/io.k8s.api.core.v1.ScopedResourceSelectorRequirement +Å +/io.k8s.api.storage.v1beta1.VolumeAttachmentList‘ "AVolumeAttachmentList is a collection of VolumeAttachment objects.šitems² +objectÊÇ ¾ apiVersion¯"¡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² string -Õ -itemsË"0Items is the list of CSIStorageCapacity objects.² -arrayº? -= -;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityú' -x-kubernetes-list-map-keys - name -ú -x-kubernetes-list-typemap - +{ +itemsr"&Items is the list of VolumeAttachments² +arrayº= +; +9#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment ¹ kind°"¢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² string Ê metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúo -x-kubernetes-group-version-kindLJ- group: storage.k8s.io - kind: CSIStorageCapacityList +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúm +x-kubernetes-group-version-kindJH- group: storage.k8s.io + kind: VolumeAttachmentList version: v1beta1 -Ó -7io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry— "sManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource that the fieldset applies to.² -objectÊ“ -¦ -time -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"bTime is timestamp of when these fields were set. It should always be empty if Operation is 'Apply' -– - -apiVersion‡"ùAPIVersion defines the version of this resource that this field set applies to. The format is "group/version" just like the top-level APIVersion field. It is necessary to track the version of a field set because it cannot be automatically converted.² -string -  +ð -fieldsType‘"ƒFieldsType is the discriminator for the different fields format and version. There is currently only one possible value: "FieldsV1"² +"1metricName is the name of the metric in question.² string -ª -io.k8s.api.core.v1.SecretŒ"‚Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.² -objectʧ -M -typeE"8Used to facilitate programmatic handling of secret data.² +÷ +selectorê +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¥selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics. +€ +targetv +H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"*target is the described Kubernetes object. +€ +/io.k8s.api.autoscaling.v2beta2.PodsMetricStatusÌ"šPodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).šmetricšcurrent² +objectÊ +„ +currenty +>#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric +ƒ +metricy +=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector +² +0io.k8s.api.core.v1.WindowsSecurityContextOptionsý"OWindowsSecurityContextOptions contain Windows-specific options and credentials.² +objectÊ +m +gmsaCredentialSpecNameS"FGMSACredentialSpecName is the name of the GMSA credential spec to use.² string -¾ - -apiVersion¯"¡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² +¿ + runAsUserName­"ŸThe UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² string -Î -dataÅ"¡Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4ª -byte² -string² -object -å - immutable×"ÈImmutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.² -boolean -¹ -kind°"¢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² +é +gmsaCredentialSpecÒ"ÄGMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ê - -stringData»"stringData allows specifying non-binary secret data in string form. It is provided as a write-only input field for convenience. All keys and values are merged into the data field on write, overwriting any existing values. The stringData field is never output when reading from the API.ª +¢ +io.k8s.api.node.v1.Scheduling€"TScheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.² +objectÊ› +ç + nodeSelectorÖ"¸nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.ª ² string² -objectúN -x-kubernetes-group-version-kind+)- group: "" - kind: Secret - version: v1 +object +® + tolerationsž"¹tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.² +arrayº/ +- ++#/definitions/io.k8s.api.core.v1.Tolerationú# +x-kubernetes-list-type atomic -« -/io.k8s.api.core.v1.CinderPersistentVolumeSource÷"ëRepresents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.švolumeID² -objectÊï -ƒ -fsTypeø"êFilesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² -string -Á -readOnly´"¥Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² -boolean -™ - secretRef‹ -0#/definitions/io.k8s.api.core.v1.SecretReference"WOptional: points to a secret object containing parameters used to connect to OpenStack. -† -volumeIDz"mvolume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +‡ +3io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReferenceÏ"ÇOwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field.š +apiVersionškindšnamešuid² +objectÊÕ +l +named"WName of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names² string -¥ -?io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatusá"VPriorityLevelConfigurationStatus represents the current state of a "request-priority".² -objectÊú -÷ - -conditionsè"8`conditions` is the current state of "request-priority".² -arrayºT -R -P#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationConditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap - -“ -*io.k8s.apimachinery.pkg.apis.meta.v1.Patche"XPatch is provided to give a concrete name and type to the Kubernetes PATCH request body.² -object -¦ -+io.k8s.api.core.v1.ContainerStateTerminatedö">ContainerStateTerminated is a terminated state of a container.šexitCode² -objectÊœ -R - containerIDC"6Container's ID in the format 'docker://'² +i +uidb"UUID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids² string -W -exitCodeKint32"6Exit status from the last termination of the container² -integer -t +7 -finishedAtf -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"+Time at which the container last terminated -O -messageD"7Message regarding the last termination of the container² -string -P -reasonF"9(brief) reason from the last termination of the container² +apiVersion)"API version of the referent.² string -P -signalFint32"1Signal from the last termination of the container² -integer - - startedAtt -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"9Time at which previous execution of the container started -Ñ - io.k8s.api.core.v1.ScopeSelector¬"nA scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.² -objectÊ­ -ª -matchExpressions•"@A list of scope selector requirements by scope of the resources.² -arrayºF -D -B#/definitions/io.k8s.api.core.v1.ScopedResourceSelectorRequirement -‘ -(io.k8s.api.core.v1.SessionAffinityConfigä"HSessionAffinityConfig represents the configurations of session affinity.² -objectÊ‹ -ˆ -clientIP| -/#/definitions/io.k8s.api.core.v1.ClientIPConfig"IclientIP contains the configurations of Client IP based session affinity. -ë -/io.k8s.api.discovery.v1beta1.EndpointConditions·"CEndpointConditions represents the current condition of an endpoint.² -objectÊã -Ó -readyÉ"ºready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be "true" for terminating endpoints.² -boolean -Ù -servingÍ"¾serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.² +Î +blockOwnerDeletion·"¨If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.² boolean -® - terminatingž"terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.² +V + +controllerH":If true, this reference points to the managing controller.² boolean -è -=io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery¦"wGroupVersion contains the "group/version" and "version" string of a version. It is made a struct to keep extensibility.š groupVersionšversion² -objectÊ… -i - groupVersionY"LgroupVersion specifies the API group and version in the form "group/version"² -string — -version‹"~version specifies the version in the form of "version". This is to save the clients the trouble of splitting the GroupVersion.² +kindŽ"€Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² string -ó -=io.k8s.api.certificates.v1.CertificateSigningRequestCondition± "^CertificateSigningRequestCondition describes a condition of a CertificateSigningRequest objectštypešstatus² -objectʲ -L -reasonB"5reason indicates a brief reason for the request state² +« +&io.k8s.api.core.v1.ConfigMapProjection€ "åAdapts a ConfigMap into a projected volume. + +The contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.² +objectʉ +ª +items "âIf unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.KeyToPath +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -– -status‹"~status of the condition, one of True, False, Unknown. Approved, Denied, and Failed conditions may not be "False" or "Unknown".² +S +optionalG"9Specify whether the ConfigMap or its keys must be defined² +boolean +¨ +#io.k8s.api.core.v1.NodeConfigSource€"uNodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.² +objectÊ{ +y + configMapl +:#/definitions/io.k8s.api.core.v1.ConfigMapNodeConfigSource".ConfigMap is a reference to a Node's ConfigMap +æ ++io.k8s.api.autoscaling.v2beta2.MetricTarget¶"aMetricTarget defines the target value, average value, or average utilization of a specific metricštype² +objectʽ +€ +valuew +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"8value is the target value of the metric (as a quantity). +™ +averageUtilization‚int32"ìaverageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. Currently only valid for Resource metric source type² +integer +¶ + averageValue¥ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"faverageValue is the target value of the average of the metric across all relevant pods (as a quantity) +c +type["Ntype represents whether the metric type is Utilization, Value, or AverageValue² +string +ï +-io.k8s.api.storage.v1beta1.CSIStorageCapacity½"ÞCSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes. + +For example this can express things like: - StorageClass "standard" has "1234 GiB" available in "topology.kubernetes.io/zone=us-east1" - StorageClass "localssd" has "10 GiB" available in "kubernetes.io/hostname=knode-abc123" + +The following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero + +The producer of these objects can decide which approach is more suitable. + +They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate is enabled there and a CSI driver opts into capacity-aware scheduling with CSIDriver.StorageCapacity.šstorageClassName² +objectÊÌ +Ç + nodeTopology¶ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ñNodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable. +Ô +storageClassName¿"±The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.² string -˜ -type"type of the condition. Known conditions are "Approved", "Denied", and "Failed". +¾ -An "Approved" condition is added via the /approval subresource, indicating the request was approved and should be issued by the signer. +apiVersion¯"¡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² +string +Ò +capacityÅ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"…Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields. -A "Denied" condition is added via the /approval subresource, indicating the request was denied and should not be issued by the signer. +The semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity. +¹ +kind°"¢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² +string +¶ +maximumVolumeSize  +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"àMaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields. -A "Failed" condition is added via the /status subresource, indicating the signer failed to issue the certificate. +This is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim. + +metadata +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ÎStandard object's metadata. The name has no particular meaning. It must be be a DNS subdomain (dots allowed, 253 characters). To ensure that there are no conflicts with other CSI drivers on the cluster, the recommendation is to use csisc-, a generated name, or a reverse-domain name which ends with the unique CSI driver name. -Approved and Denied conditions are mutually exclusive. Approved, Denied, and Failed conditions cannot be removed once added. +Objects are namespaced. -Only one condition of a given type is allowed.² -string -¶ -lastTransitionTimeŸ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ãlastTransitionTime is the time the condition last transitioned from one status to another. If unset, when a new condition type is added or an existing condition's status is changed, the server defaults this to the current time. -Œ -lastUpdateTimez -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"?lastUpdateTime is the time of the last update to this condition -f -message["Nmessage contains a human readable message with details about the request state² +More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúk +x-kubernetes-group-version-kindHF- group: storage.k8s.io + kind: CSIStorageCapacity + version: v1beta1 + +ì +!io.k8s.api.core.v1.SeccompProfileÆ"fSeccompProfile defines a pod/container's seccomp profile settings. Only one profile source may be set.štype² +objectÊÓ +¯ +localhostProfileš"ŒlocalhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost".² string -… -)io.k8s.api.policy.v1beta1.AllowedHostPath×"AllowedHostPath defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined.² -objectʶ -­ +ž +type•"‡type indicates which kind of seccomp profile will be applied. Valid options are: -pathPrefixž"pathPrefix is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path. +Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.² +stringúr +x-kubernetes-unions[Y- discriminator: type + fields-to-discriminateBy: + localhostProfile: LocalhostProfile -Examples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`² +è +%io.k8s.api.discovery.v1beta1.Endpoint¾"FEndpoint represents a single logical "backend" implementing a service.š addresses² +objectÊÛ +” +hintsŠ +8#/definitions/io.k8s.api.discovery.v1beta1.EndpointHints"Nhints contains information associated with how an endpoint should be consumed. +Î +hostnameÁ"³hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.² string -ƒ -readOnlyw"iwhen set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly.² -boolean -¬ -+io.k8s.apimachinery.pkg.apis.meta.v1.Statusü"CStatus is a return value for calls that don't return other objects.² -objectÊ× -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds -ä -reasonÙ"ËA machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.² +Ú +nodeNameÍ"¿nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.² string -À -statusµ"§Status of the operation. One of: "Success" or "Failure". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status² + + targetRef‚ +0#/definitions/io.k8s.api.core.v1.ObjectReference"NtargetRef is a reference to a Kubernetes object that represents this endpoint. +ó +topologyæ"Ètopology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node + where the endpoint is located. This should match the corresponding + node label. +* topology.kubernetes.io/zone: the value indicates the zone where the + endpoint is located. This should match the corresponding node label. +* topology.kubernetes.io/region: the value indicates the region where the + endpoint is located. This should match the corresponding node label. +This field is deprecated and will be removed in future api versions.ª + ² +string² +object +î + addressesà" addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.² +arrayº + ² +stringú +x-kubernetes-list-typeset + +™ + +conditionsŠ +=#/definitions/io.k8s.api.discovery.v1beta1.EndpointConditions"Iconditions contains information about the current status of the endpoint. +Ÿ +(io.k8s.api.node.v1beta1.RuntimeClassListò"3RuntimeClassList is a list of RuntimeClass objects.šitems² +objectʽ +p +itemsg""Items is a list of schema objects.² +arrayº6 +4 +2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass +¹ +kind°"¢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² string +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ¾ apiVersion¯"¡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² -string -V -codeNint32"9Suggested HTTP return code for this status, 0 if not set.² -integer -¬ -details  -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails"ÛExtended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type. +stringúf +x-kubernetes-group-version-kindCA- group: node.k8s.io + kind: RuntimeClassList + version: v1beta1 + +» +,io.k8s.api.policy.v1.PodDisruptionBudgetListŠ "@PodDisruptionBudgetList is a collection of PodDisruptionBudgets.šitems² +objectÊË ¹ kind°"¢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² string -U -messageJ"=A human-readable description of the status of this operation.² -stringúN -x-kubernetes-group-version-kind+)- group: "" - kind: Status - version: v1 +Ð +metadataà +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¾ -ž -*io.k8s.api.apps.v1.DaemonSetUpdateStrategyï"XDaemonSetUpdateStrategy is a struct used to control the update strategy for a DaemonSet.² -objectʆ -’ - rollingUpdate€ -7#/definitions/io.k8s.api.apps.v1.RollingUpdateDaemonSet"ERolling update config params. Present only if type = "RollingUpdate". -o -typeg"ZType of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate.² -string -Ö -&io.k8s.api.apps.v1.ReplicaSetCondition«"LReplicaSetCondition describes the state of a replica set at a certain point.štypešstatus² -objectʾ -Y -messageN"AA human readable message indicating details about the transition.² -string -F -reason<"/The reason for the condition's last transition.² -string -L -statusB"5Status of the condition, one of True, False, Unknown.² -string -3 -type+"Type of replica set condition.² +apiVersion¯"¡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² string -• -lastTransitionTime -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DThe last time the condition transitioned from one status to another. -¾ -/io.k8s.api.autoscaling.v2beta1.PodsMetricSourceŠ"åPodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.š -metricNameštargetAverageValue² -objectÊñ -K +y +itemsp"'Items is a list of PodDisruptionBudgets² +arrayº: +8 +6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetúc +x-kubernetes-group-version-kind@>- group: policy + kind: PodDisruptionBudgetList + version: v1 -metricName="0metricName is the name of the metric in question² -string -Ü -selectorÏ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Šselector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics. - -targetAverageValue« -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ltargetAverageValue is the target value of the average of the metric across all relevant pods (as a quantity) -Õ -!io.k8s.api.core.v1.LimitRangeItem¯ "SLimitRangeItem defines a min/max usage limit for any resource that matches on kind.štype² -objectÊÄ -A -type9",Type of resource that this limit applies to.² -string -² -default¦"WDefault resource requirement limit value by resource name if resource limit is omitted.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -Ó -defaultRequestÀ"qDefaultRequest is the default resource requirement request value by resource name if resource request is omitted.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -‹ -maxƒ"4Max usage constraints on this kind by resource name.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -× -maxLimitRequestRatio¾"îMaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -‹ -minƒ"4Min usage constraints on this kind by resource name.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -å -'io.k8s.api.storage.v1beta1.TokenRequest¹"#/definitions/io.k8s.api.policy.v1beta1.SELinuxStrategyOptions"OseLinux is the strategy that will dictate the allowable labels that may be set. -” -allowedCSIDriversþ"²AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate.² -arrayº< -: -8#/definitions/io.k8s.api.policy.v1beta1.AllowedCSIDriver -¿ -allowedHostPathsª"`allowedHostPaths is an allowlist of host paths. Empty indicates that all host paths may be used.² -arrayº; -9 -7#/definitions/io.k8s.api.policy.v1beta1.AllowedHostPath -· -defaultAllowPrivilegeEscalation“"„defaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.² +ÿ +requiresRepublishé"ÚRequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false. + +Note: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container. + +This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² boolean -œ - hostPortsŽ"FhostPorts determines which host port ranges are allowed to be exposed.² +€ +storageCapacityì"ÝIf set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information. + +The check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object. + +Alternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published. + +This field is immutable. + +This is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.² +boolean +ê + tokenRequestsØ"éTokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: "csi.storage.k8s.io/serviceAccount.tokens": { + "": { + "token": , + "expirationTimestamp": , + }, + ... +} + +Note: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically. + +This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² arrayº9 7 -5#/definitions/io.k8s.api.policy.v1beta1.HostPortRange -p - hostNetworka"ShostNetwork determines if the policy allows the use of HostNetwork in the pod spec.² -boolean -Í - runtimeClass¼ -C#/definitions/io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions"ôruntimeClass is the strategy that will dictate the allowable RuntimeClasses for a pod. If this field is omitted, the pod's runtimeClassName field is unrestricted. Enforcement of this field depends on the RuntimeClass feature gate being enabled. -d -hostPIDY"KhostPID determines if the policy allows the use of HostPID in the pod spec.² -boolean -­ - runAsUserŸ -@#/definitions/io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions"[runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. -¥ -volumes™"}volumes is an allowlist of volume plugins. Empty indicates that no volumes may be used. To allow all volumes you may use '*'.² -arrayº - ² -string -² -allowedCapabilitiesš"ýallowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both allowedCapabilities and requiredDropCapabilities.² -arrayº - ² -string -· -allowedFlexVolumes "ÓallowedFlexVolumes is an allowlist of Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the "volumes" field.² -arrayº= -; -9#/definitions/io.k8s.api.policy.v1beta1.AllowedFlexVolume -’ -defaultAddCapabilities÷"ÚdefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the allowedCapabilities list.² -arrayº - ² -string - -forbiddenSysctlsø"ÛforbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in "*" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. +5#/definitions/io.k8s.api.storage.v1beta1.TokenRequestú# +x-kubernetes-list-type atomic -Examples: e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. e.g. "foo.*" forbids "foo.bar", "foo.baz", etc.² +³ +volumeLifecycleModesš"ýVolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is "Persistent", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is "Ephemeral". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. + +This field is immutable.² arrayº ² string -d -hostIPCY"KhostIPC determines if the policy allows the use of HostIPC in the pod spec.² -boolean -ö -readOnlyRootFilesystemÛ"ÌreadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.² +É +attachRequired¶"§attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called. + +This field is immutable.² boolean -Ç -requiredDropCapabilitiesª"requiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.² -arrayº - ² +Û + fsGroupPolicyÉ"»Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate. + +This field is immutable.² string -´ +Î +'io.k8s.api.storage.v1beta1.StorageClass¢"ãStorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned. -runAsGroup¥ -A#/definitions/io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions"ßRunAsGroup is the strategy that will dictate the allowable RunAsGroup values that may be set. If this field is omitted, the pod's RunAsGroup can take any value. This field requires the RunAsGroup feature gate to be enabled. -¤ -allowPrivilegeEscalation‡"yallowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.² +StorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.š provisioner² +objectÊ· +n +allowVolumeExpansionV"HAllowVolumeExpansion shows whether the storage class allow volume expand² boolean -ú -allowedProcMountTypesà"ÃAllowedProcMountTypes is an allowlist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.² +Š +allowedTopologiesô"«Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.² +arrayº9 +7 +5#/definitions/io.k8s.api.core.v1.TopologySelectorTerm +¾ + +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string +ì + mountOptionsÛ"¾Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. ["ro", "soft"]. Not validated - mount of the PVs will simply fail if one is invalid.² arrayº ² string -î -allowedUnsafeSysctlsÕ"¸allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in "*" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to allowlist all allowed unsafe sysctls explicitly to avoid rejection. +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +‘ -Examples: e.g. "foo/*" allows "foo/bar", "foo/baz", etc. e.g. "foo.*" allows "foo.bar", "foo.baz", etc.² -arrayº +parameters‚"eParameters holds the parameters for the provisioner that should create volumes of this storage class.ª ² +string² +object +N + provisioner?"2Provisioner indicates the type of the provisioner.² string -¥ -fsGroup™ ->#/definitions/io.k8s.api.policy.v1beta1.FSGroupStrategyOptions"WfsGroup is the strategy that will dictate what fs group is used by the SecurityContext. -Ò -supplementalGroups» -I#/definitions/io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions"nsupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. -Õ -Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversionÿ"MCustomResourceConversion describes how to convert different versions of a CR.šstrategy² -objectÊ– -Å -strategy¸"ªstrategy specifies how custom resources are converted between versions. Allowed values are: - `None`: The converter only change the apiVersion and would not touch any other field in the custom resource. - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information - is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhook to be set.² +— + reclaimPolicy…"xDynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.² string -Ë -webhook¿ -X#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion"cwebhook describes how to call the conversion webhook. Required when `strategy` is set to `Webhook`. -í@ -Mio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps›@"[JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).² -objectʯ? -Ô -defaultÈ -P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON"ódefault is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. CustomResourceDefinitions with defaults must be created using the v1 (or newer) CustomResourceDefinition API. -| - definitionsmª_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² -object -s - externalDocsc -a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation -¶ -format«"format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated: +ø +volumeBindingModeâ"ÔVolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.² +stringúe +x-kubernetes-group-version-kindB@- group: storage.k8s.io + kind: StorageClass + version: v1beta1 + +¬ +Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArrayN"LJSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array. +ì +7io.k8s.api.admissionregistration.v1.WebhookClientConfig° "VWebhookClientConfig contains the information to make a TLS connection with the webhook² +objectÊÉ +Å +caBundle¸byte"¤`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² +string +‡ +serviceû +B#/definitions/io.k8s.api.admissionregistration.v1.ServiceReference"´`service` is a reference to the service for this webhook. Either `service` or `url` must be specified. + +If the webhook is running within the cluster, then you should use `service`. +ô +urlì"Þ`url` gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified. + +The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. + +Please note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster. + +The scheme must be "https"; the URL must begin with "https://". + +A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. -- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like "0321751043" or "978-0321751041" - isbn10: an ISBN10 number string like "0321751043" - isbn13: an ISBN13 number string like "978-0321751041" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\d{3}[- ]?\d{2}[- ]?\d{4}$ - hexcolor: an hexadecimal color code like "#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like "rgb(255,255,2559" - byte: base64 encoded binary data - password: any kind of string - date: a date string like "2006-01-02" as defined by full-date in RFC3339 - duration: a duration string like "22 ns" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like "2014-12-15T19:30:20.000Z" as defined by date-time in RFC3339.² -string - -id ² +Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² string -u -oneOfl² -arrayº_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps - -title ² +„ ++io.k8s.api.authorization.v1.NonResourceRuleÔ"LNonResourceRule holds information that describes a rule for the non-resourcešverbs² +objectÊï +Ë +nonResourceURLs·"šNonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path. "*" means all.² +arrayº + ² string -u -anyOfl² -arrayº_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps - - minLengthint64² -integer - -pattern ² +ž +verbs”"xVerb is a list of kubernetes non-resource API verbs, like: get, post, put, delete, patch, head, options. "*" means all.² +arrayº + ² string - -type ² +¡ + io.k8s.api.core.v1.EnvFromSourceü":EnvFromSource represents the source of a set of ConfigMaps² +objectʱ +c + configMapRefS +3#/definitions/io.k8s.api.core.v1.ConfigMapEnvSource"The ConfigMap to select from +n +prefixd"WAn optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.² string - - uniqueItems ² -boolean -Ó -x-kubernetes-embedded-resource°"¡x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).² -boolean -˜ -$x-kubernetes-preserve-unknown-fieldsï"àx-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.² -boolean -Š - dependencieszªl -j -h#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray² -object -i -enuma² -arrayºT -R -P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON -{ - -propertiesmª_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² -object -{ -additionalPropertiesc -a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool - - description ² +Z + secretRefM +0#/definitions/io.k8s.api.core.v1.SecretEnvSource"The Secret to select from +› +io.k8s.api.core.v1.ExecActionù"1ExecAction describes a "run in container" action.² +objectÊ· +´ +command¨"‹Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.² +arrayº + ² string - -exclusiveMaximum ² -boolean - -exclusiveMinimum ² -boolean - -maximumdouble² -number -  -x-kubernetes-map-type†"øx-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values: +ù +io.k8s.api.core.v1.LimitRange× "OLimitRange sets resource usage limits for each kind of resource in a Namespace.² +objectÊ¢ +¾ -1) `granular`: - These maps are actual maps (key-value pairs) and each fields are independent - from each other (they can each be manipulated by separate actors). This is - the default behaviour for all maps. -2) `atomic`: the list is treated as a single entity, like a scalar. - Atomic maps will be entirely replaced when updated.² +apiVersion¯"¡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² string - -$schema ² +¹ +kind°"¢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² string -v -additionalItemsc -a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool -u -allOfl² -arrayº_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps - - maxLengthint64² -integer -! +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Í +specÄ +/#/definitions/io.k8s.api.core.v1.LimitRangeSpec"Spec defines the limits enforced. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúR +x-kubernetes-group-version-kind/-- group: "" + kind: LimitRange + version: v1 -multipleOfdouble² -number - -$ref ² +É +.io.k8s.api.networking.v1beta1.IngressClassList–"3IngressClassList is a collection of IngressClasses.šitems² +objectÊÛ +¾ + +apiVersion¯"¡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² string -$ - maxPropertiesint64² -integer -$ - minPropertiesint64² -integer - -minimumdouble² -number - -nullable ² -boolean -‚ -patternPropertiesmª_ -] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps² -object -& -required² -arrayº - ² +x +itemso"$Items is the list of IngressClasses.² +arrayº< +: +8#/definitions/io.k8s.api.networking.v1beta1.IngressClass +¹ +kind°"¢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² string -m -itemsd -b#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray - -maxItemsint64² -integer - -minItemsint64² -integer -d -not] -[#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps -] -exampleR -P#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON -« -x-kubernetes-list-map-keysŒ"ïx-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map. +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úl +x-kubernetes-group-version-kindIG- group: networking.k8s.io + kind: IngressClassList + version: v1beta1 -This tag MUST only be used on lists that have the "x-kubernetes-list-type" extension set to "map". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported). +ˆ +-io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupÖ"YAPIGroup contains the name, the supported versions, and the preferred version of a group.šnamešversions² +objectʇ +¾ -The properties specified must either be required or have a default value, to ensure those properties are present for all list items.² -arrayº - ² +apiVersion¯"¡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² string -Þ -x-kubernetes-list-typeÃ"µx-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values: - -1) `atomic`: the list is treated as a single entity, like a scalar. - Atomic lists will be entirely replaced when updated. This extension - may be used on any type of list (struct, scalar, ...). -2) `set`: - Sets are lists that must not have multiple items with the same value. Each - value must be a scalar, an object with x-kubernetes-map-type `atomic` or an - array with x-kubernetes-list-type `atomic`. -3) `map`: - These lists are like maps in that their elements have a non-index key - used to identify them. Order is preserved upon merge. The map tag - must only be used on a list with elements of type object. -Defaults to atomic for arrays.² +¹ +kind°"¢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² string -‡ -x-kubernetes-int-or-stringè"Ùx-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns: +3 +name+"name is the name of the group.² +string +Ç +preferredVersion² +K#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery"cpreferredVersion is the version preferred by the API server, which probably is the storage version. +è +serverAddressByClientCIDRsÉ"éa map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.² +arrayºP +N +L#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR + +versions"2versions are the versions supported in this group.² +arrayºO +M +K#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscoveryúP +x-kubernetes-group-version-kind-+- group: "" + kind: APIGroup + version: v1 -1) anyOf: - - type: integer - - type: string -2) allOf: - - anyOf: - - type: integer - - type: string - - ... zero or more² -boolean Ø $io.k8s.apimachinery.pkg.version.Info¯"TInfo contains versioning information. how we'll want to distribute that information.šmajoršminorš gitVersionš gitCommitš gitTreeStateš buildDateš goVersionšcompileršplatform² objectÊä + + buildDate ² +string + + gitCommit ² +string + + gitTreeState ² +string  gitVersion ² string - - goVersion ² -string  major ² string - - buildDate ² -string  compiler ² string  - gitCommit ² -string - - gitTreeState ² + goVersion ² string  minor ² @@ -37211,240 +36706,477 @@ gitVersion  platform ² string -¼ -)io.k8s.api.coordination.v1beta1.LeaseSpecŽ"(LeaseSpec is a specification of a Lease.² -objectÊÕ -‰ - acquireTimez -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime":acquireTime is a time when the current lease was acquired. -e -holderIdentityS"FholderIdentity contains the identity of the holder of a current lease.² +È +&io.k8s.api.apps.v1.DeploymentCondition"KDeploymentCondition describes the state of a deployment at a certain point.štypešstatus² +objectʱ +Y +messageN"AA human readable message indicating details about the transition.² string -È -leaseDurationSeconds¯int32"™leaseDurationSeconds is a duration that candidates for a lease need to wait to force acquire it. This is measure against time of last observed RenewTime.² +F +reason<"/The reason for the condition's last transition.² +string +L +statusB"5Status of the condition, one of True, False, Unknown.² +string +2 +type*"Type of deployment condition.² +string +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +v +lastUpdateTimed +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time")The last time this condition was updated. +Õ& +io.k8s.api.batch.v1.JobSpecµ&"7JobSpec describes how the job execution will look like.štemplate² +objectÊâ% +Û +templateÎ +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"™Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ +ó +ttlSecondsAfterFinished×int32"ÁttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes. This field is alpha-level and is only honored by servers that enable the TTLAfterFinished feature.² +integer +¿ +completionMode¬"žCompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. + +`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. + +`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. + +This field is alpha-level and is only honored by servers that enable the IndexedJob feature gate. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, the controller skips updates for the Job.² +string +Ð + completionsÀint32"ªSpecifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² +integer +¹ +manualSelector¦"—manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector² +boolean +¦ + parallelism–int32"€Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² +integer + +selector +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ËA label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors +” +suspendˆ"ùSuspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. This is an alpha field and requires the SuspendJob feature gate to be enabled; otherwise this field may not be set to true. Defaults to false.² +boolean +æ +activeDeadlineSecondsÌint64"¶Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.² integer r -leaseTransitions^int32"IleaseTransitions is the number of transitions of a lease between holders.² + backoffLimitbint32"MSpecifies the number of retries before marking this job failed. Defaults to 6² integer -  - renewTime’ -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"RrenewTime is a time when the current holder of a lease has last updated the lease. -ú -(io.k8s.api.core.v1.ConfigMapVolumeSourceÍ "ÅAdapts a ConfigMap into a volume. +’ +Xio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersionµ"//...` if `served` is true.² +string +Þ +schemaÓ +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceValidation"pschema describes the schema used for validation, pruning, and defaulting of this version of the custom resource. +h +served^"Pserved is a flag enabling/disabling this version from being served via REST APIs² +boolean +ª +storagež"storage indicates this version should be used when persisting custom resources to storage. There must be exactly one version with storage=true.² +boolean +Î + subresources½ +a#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresources"Xsubresources specify what subresources this version of the defined custom resource have. +¹ +Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceListî"/APIServiceList is a list of APIService objects.šitems² +objectÊ´ +j +itemsa² +arrayºT +R +P#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService +¹ +kind°"¢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² string -– -3io.k8s.api.core.v1.PhotonPersistentDiskVolumeSourceÞ"8Represents a Photon Controller persistent disk resource.špdID² -objectÊŽ I -pdIDA"4ID that identifies Photon Controller persistent disk² +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta +¾ + +apiVersion¯"¡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² +stringúo +x-kubernetes-group-version-kindLJ- kind: APIServiceList + version: v1beta1 + group: apiregistration.k8s.io + + +/io.k8s.api.autoscaling.v2beta1.PodsMetricStatusÜ"šPodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).š +metricNamešcurrentAverageValue² +objectÊ +Å +currentAverageValue­ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ncurrentAverageValue is the current value of the average of the metric across all relevant pods (as a quantity) +K + +metricName="0metricName is the name of the metric in question² string -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +õ +selectorè +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"£selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics. +ð +/io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus¼">FlowSchemaStatus represents the current state of a FlowSchema.² +objectÊí +ê + +conditionsÛ";`conditions` is a list of the current states of FlowSchema.² +arrayºD +B +@#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaConditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap + +¹ +%io.k8s.api.autoscaling.v1.ScaleStatus"AScaleStatus represents the current status of a scale subresource.šreplicas² +objectʲ +Z +replicasNint32"9actual number of observed instances of the scaled object.² +integer +Ó +selectorÆ"¸label query over pods that should match the replicas count. This is same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors² string -· -1io.k8s.api.storage.v1beta1.VolumeAttachmentSource"ÝVolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.² -objectÊ’ -À -inlineVolumeSpec« -5#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec"ñinlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is beta-level and is only honored by servers that enabled the CSIMigration feature. -M -persistentVolumeName5"(Name of the persistent volume to attach.² +à +)io.k8s.api.core.v1.PersistentVolumeStatus•"DPersistentVolumeStatus is the current status of a persistent volume.² +objectÊÀ +j +message_"RA human-readable message indicating details about why the volume is in this state.² string -û -%io.k8s.api.discovery.v1.EndpointSliceÑ"ÜEndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.š addressTypeš endpoints² -objectÊã -¤ -portsš"®ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates "all ports". Each slice may include a maximum of 100 ports.² -arrayº6 -4 -2#/definitions/io.k8s.api.discovery.v1.EndpointPortú# -x-kubernetes-list-type atomic +» +phase±"£Phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase² +string +“ +reasonˆ"{Reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.² +string +¿ +'io.k8s.api.rbac.v1beta1.AggregationRule“"VAggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole² +objectʬ +© +clusterRoleSelectors"¼ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added² +arrayºD +B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +± +'io.k8s.api.rbac.v1beta1.ClusterRoleList… "¢ClusterRoleList is a collection of ClusterRoles. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoles, and will no longer be served in v1.22.šitems² +objectÊÓ +¾ + +apiVersion¯"¡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² +string +l +itemsc"Items is a list of ClusterRoles² +arrayº5 +3 +1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole +¹ +kind°"¢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² +string +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ús +x-kubernetes-group-version-kindPN- group: rbac.authorization.k8s.io + kind: ClusterRoleList + version: v1beta1 + +˜ +io.k8s.api.apps.v1.DaemonSet÷ "7DaemonSet represents the configuration of a daemon set.² +objectÊÙ + +¹ +kind°"¢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² +string +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ó +specÊ +.#/definitions/io.k8s.api.apps.v1.DaemonSetSpec"—The desired behavior of this daemon set. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +® +status£ +0#/definitions/io.k8s.api.apps.v1.DaemonSetStatus"îThe current status of this daemon set. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +¾ -ð - addressTypeà"ÒaddressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.² -string +apiVersion¯"¡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² +stringúS +x-kubernetes-group-version-kind0.- group: apps + kind: DaemonSet + version: v1 + +• +io.k8s.api.apps.v1.Deploymentó"@Deployment enables declarative updates for Pods and ReplicaSets.² +objectÊË +o +statuse +1#/definitions/io.k8s.api.apps.v1.DeploymentStatus"0Most recently observed status of the Deployment. ¾ apiVersion¯"¡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² string -ß - endpointsÑ"jendpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.² -arrayº2 -0 -.#/definitions/io.k8s.api.discovery.v1.Endpointú# -x-kubernetes-list-type atomic - ¹ kind°"¢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² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata.úc -x-kubernetes-group-version-kind@>- group: discovery.k8s.io - kind: EndpointSlice +f +metadataZ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. +s +speck +/#/definitions/io.k8s.api.apps.v1.DeploymentSpec"8Specification of the desired behavior of the Deployment.úT +x-kubernetes-group-version-kind1/- group: apps + kind: Deployment version: v1 -“ -io.k8s.api.events.v1.Eventô"¾Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.š eventTime² -objectʽ -— - eventTime‰ -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"IeventTime is the time when this Event was first observed. It is required. -¶ - regarding¨ -0#/definitions/io.k8s.api.core.v1.ObjectReference"óregarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object. -Ñ -relatedÅ -0#/definitions/io.k8s.api.core.v1.ObjectReference"related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object. -š -series -.#/definitions/io.k8s.api.events.v1.EventSeries"]series is data about the Event series this event represents or nil if it's a singleton Event. -Ì -actionÁ"³action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field cannot be empty for new Events and it can have at most 128 characters.² +í[ +io.k8s.api.core.v1.PodSpecÎ[""PodSpec is a description of a pod.š +containers² +objectÊŽ[ +ÿ +ephemeralContainersç"ÌList of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature.² +arrayº7 +5 +3#/definitions/io.k8s.api.core.v1.EphemeralContainerú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge + +† +hostnamez"mSpecifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.² string -¾ +‰ +initContainersö"äList of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.Containerú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge -apiVersion¯"¡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² +û +setHostnameAsFQDNå"ÖIf true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.² +boolean +ö + dnsPolicyè"ÚSet DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.² string -¿ -deprecatedLastTimestamp£ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"hdeprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. -¦ -deprecatedSource‘ -,#/definitions/io.k8s.api.core.v1.EventSource"adeprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. -³ -typeª"œtype is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable. This field cannot be empty for new Events.² +Û +enableServiceLinksÄ"µEnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.² +boolean +“ +serviceAccount€"sDeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.² string -ˆ -deprecatedCountuint32"`deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.² +ý +terminationGracePeriodSecondsÛint64"ÅOptional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.² integer -Á -deprecatedFirstTimestamp¤ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ideprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. -¹ -kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -½ -note´"¦note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.² +” +priorityClassNameþ"ðIf specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.² string -¤ -reason™"‹reason is why the action was taken. It is human-readable. This field cannot be empty for new Events and it can have at most 128 characters.² +ñ +runtimeClassNameÜ"ÎRuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.² string -¹ -reportingController¡"“reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.² +g +affinity[ +)#/definitions/io.k8s.api.core.v1.Affinity".If specified, the pod's scheduling constraints +À + hostNetwork°"¡Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.² +boolean +R +hostPIDG"9Use the host's pid namespace. Optional: Default to false.² +boolean +Ï +priorityÂint32"¬The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.² +integer +q + tolerationsb"$If specified, the pod's tolerations.² +arrayº/ +- ++#/definitions/io.k8s.api.core.v1.Toleration +» + hostAliases«"›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.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.HostAliasú% +x-kubernetes-patch-merge-keyip +ú' +x-kubernetes-patch-strategymerge + +R +hostIPCG"9Use the host's ipc namespace. Optional: Default to false.² +boolean +× +imagePullSecretsÂ"¥ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod² +arrayº9 +7 +5#/definitions/io.k8s.api.core.v1.LocalObjectReferenceú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-patch-merge-keyname + +œ + nodeSelector‹"íNodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ª + ² +string² +object +„ +preemptionPolicyï"áPreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.² string - -reportingInstance¬"žreportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.² -stringúX -x-kubernetes-group-version-kind53- version: v1 - group: events.k8s.io - kind: Event +ô +shareProcessNamespaceÚ"ËShare a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.² +boolean +þ +topologySpreadConstraintsà"ÐTopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.² +arrayº= +; +9#/definitions/io.k8s.api.core.v1.TopologySpreadConstraintúB +x-kubernetes-list-map-keys$"- topologyKey +- whenUnsatisfiable +ú +x-kubernetes-list-typemap +ú. +x-kubernetes-patch-merge-key topologyKey +ú' +x-kubernetes-patch-strategymerge -Ï -*io.k8s.api.networking.v1.NetworkPolicyPort "6NetworkPolicyPort describes a port to allow traffic on² -objectÊÙ - -protocolu"hThe protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.² +• +automountServiceAccountTokenu"gAutomountServiceAccountToken indicates whether a service account token should be automatically mounted.² +boolean +Æ + dnsConfig¸ +-#/definitions/io.k8s.api.core.v1.PodDNSConfig"†Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. +Î + subdomainÀ"²If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all.² string -™ -endPortint32"÷If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate "NetworkPolicyEndPort".² -integer -¶ -port­ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ëThe port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched. -È -$io.k8s.api.discovery.v1beta1.ForZoneŸ"LForZone provides information about which zones should consume this endpoint.šname² -objectÊ< -: -name2"%name represents the name of the zone.² +á + restartPolicyÏ"ÁRestart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy² string - -6io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethodâ"EFlowDistinguisherMethod specifies the method of a flow distinguisher.štype² -objectÊ… -‚ -typez"m`type` is the type of flow distinguisher method The supported types are "ByUser" and "ByNamespace". Required.² +£ + schedulerName‘"ƒIf specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.² string -Ï -!io.k8s.api.storage.v1.CSINodeSpec©"\CSINodeSpec holds information about the specification of all CSI drivers installed on a nodešdrivers² -objectʲ -¯ -drivers£"Šdrivers is a list of information of all CSI Drivers existing on a node. If all drivers in the list are uninstalled, this can become empty.² +ó +readinessGatesà"›If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md² arrayº5 3 -1#/definitions/io.k8s.api.storage.v1.CSINodeDriverú' +1#/definitions/io.k8s.api.core.v1.PodReadinessGate +Ð +serviceAccountName¹"«ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/² +string +Ô +nodeNameÇ"¹NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.² +string +ð +overheadã"“Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +ó +securityContextß +3#/definitions/io.k8s.api.core.v1.PodSecurityContext"§SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field. +¬ +volumes "†List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes² +arrayº+ +) +'#/definitions/io.k8s.api.core.v1.Volumeú' +x-kubernetes-patch-merge-keyname +ú2 +x-kubernetes-patch-strategymerge,retainKeys + +ü +activeDeadlineSecondsâint64"ÌOptional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.² +integer +¼ + +containers­"›List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.Containerú' x-kubernetes-patch-merge-keyname ú' x-kubernetes-patch-strategymerge -” --io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1â"ÔFieldsV1 stores a set of fields in a data structure like a Trie, in JSON format. +º +)io.k8s.api.networking.v1.IngressClassListŒ"3IngressClassList is a collection of IngressClasses.šitems² +objectÊÖ +¹ +kind°"¢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² +string +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. +¾ -Each key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:', where is the name of a field in a struct, or key in a map 'v:', where is the exact json formatted value of a list item 'i:', where is position of a item in a list 'k:', where is a map of a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set. +apiVersion¯"¡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² +string +s +itemsj"$Items is the list of IngressClasses.² +arrayº7 +5 +3#/definitions/io.k8s.api.networking.v1.IngressClassúg +x-kubernetes-group-version-kindDB- group: networking.k8s.io + kind: IngressClassList + version: v1 -The exact format is defined in sigs.k8s.io/structured-merge-diff² -object -õ -!io.k8s.api.core.v1.FCVolumeSourceÏ"«Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.² -objectÊ’ -: -lun3int32"Optional: FC target lun number² -integer -‚ -readOnlyv"hOptional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -T +î +"io.k8s.api.rbac.v1beta1.PolicyRuleÇ "¡PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.šverbs² +objectÊŒ -targetWWNsF"*Optional: FC target worldwide names (WWNs)² +ó + apiGroupså"ÈAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.² arrayº ² string -µ -wwids«"ŽOptional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.² +¼ +nonResourceURLs¨"‹NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.² arrayº ² string -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² -string -Ÿ -io.k8s.api.core.v1.PodIP‚"¦IP address information for entries in the (plural) PodIPs field. Each entry includes: - IP: An IP address allocated to the pod. Routable at least within the cluster.² -objectÊK -I -ipC"6ip is an IP address (IPv4 or IPv6) assigned to the pod² +¨ + resourceNames–"zResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.² +arrayº + ² string -Ê -io.k8s.api.core.v1.Sysctl¬"+Sysctl defines a kernel parameter to be setšnamešvalue² -objectÊb -. -name&"Name of a property to set² +ò + resourcesä"ÇResources is a list of resources this rule applies to. '*' represents all resources in the specified apiGroups. '*/foo' represents the subresource 'foo' for all resources in the specified apiGroups.² +arrayº + ² string -0 -value'"Value of a property to set² +´ +verbsª"Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.² +arrayº + ² string -® -(io.k8s.api.core.v1.AzureFileVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod.š +Ï +!io.k8s.api.storage.v1.CSINodeSpec©"\CSINodeSpec holds information about the specification of all CSI drivers installed on a nodešdrivers² +objectʲ +¯ +drivers£"Šdrivers is a list of information of all CSI Drivers existing on a node. If all drivers in the list are uninstalled, this can become empty.² +arrayº5 +3 +1#/definitions/io.k8s.api.storage.v1.CSINodeDriverú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge + +í +Oio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray™"–JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes. +Æ +2io.k8s.api.core.v1.AzureFilePersistentVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod.š secretNameš shareName² -objectÊ€ +objectÊŽ x readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² boolean @@ -37452,201 +37184,336 @@ x secretNameP"Cthe name of secret that contains Azure Storage Account Name and Key² string +‹ +secretNamespacex"kthe namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod² +string $ shareName" Share Name² string -ý -io.k8s.api.core.v1.Taintà"`The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint.škeyšeffect² -objectÊà -  -effect•"‡Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute.² -string -D -key="0Required. The taint key to be applied to a node.² +£ +io.k8s.api.core.v1.PodList„ "PodList is a list of Pods.šitems² +objectÊÿ +¾ + +apiVersion¯"¡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² string ­ - timeAddedŸ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"dTimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. -E -value<"/The taint value corresponding to the taint key.² +items£"lList of pods. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md² +arrayº( +& +$#/definitions/io.k8s.api.core.v1.Pod +¹ +kind°"¢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² string -Ó -$io.k8s.api.networking.v1.IngressRuleª "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² -objectʬ -â +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúO +x-kubernetes-group-version-kind,*- group: "" + kind: PodList + version: v1 -hostÙ -"Ë -Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to - the IP in the Spec of the parent Ingress. -2. The `:` delimiter is not respected because ports are not allowed. - Currently the port of an Ingress is implicitly :80 for http and - :443 for https. -Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. +‚ +#io.k8s.api.events.v1beta1.EventListÚ"%EventList is a list of Event objects.šitems² +objectʸ +¾ -Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² +apiVersion¯"¡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² string -E -http= -;#/definitions/io.k8s.api.networking.v1.HTTPIngressRuleValue -µ -#io.k8s.api.networking.v1.IngressTLS"MIngressTLS describes the transport layer security associated with an Ingress.² -objectʯ -À -hosts¶"óHosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.² +k +itemsb""items is a list of schema objects.² +arrayº1 +/ +-#/definitions/io.k8s.api.events.v1beta1.Event +¹ +kind°"¢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² +string +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúa +x-kubernetes-group-version-kind><- version: v1beta1 + group: events.k8s.io + kind: EventList + +à +@io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration› "èLimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues: + * How are requests for this priority level limited? + * What should be done with requests that exceed the limit?² +objectÊ¡ +ö +assuredConcurrencySharesÙint32"Ã`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) --- the number of requests that may be executing at a time --- for each such priority level: + + ACV(l) = ceil( SCL * ACS(l) / ( sum[priority levels k] ACS(k) ) ) + +bigger numbers of ACS mean more reserved concurrent requests (at the expense of every other PL). This field has a default value of 30.² +integer +¥ + limitResponse“ +:#/definitions/io.k8s.api.flowcontrol.v1beta1.LimitResponse"U`limitResponse` indicates what to do with requests that can not be executed right now +´ +$io.k8s.api.networking.v1.IngressSpec‹";IngressSpec describes the Ingress the user wishes to exist.² +objectÊ¿ +ß +defaultBackendÌ +5#/definitions/io.k8s.api.networking.v1.IngressBackend"’DefaultBackend is the backend that should handle requests that don't match any rule. If Rules are not specified, DefaultBackend must be specified. If DefaultBackend is not set, the handling of requests that do not match any of the rules will be up to the Ingress controller. +´ +ingressClassNameŸ"‘IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.² +string +ù +rulesï"ƒA list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.² +arrayº6 +4 +2#/definitions/io.k8s.api.networking.v1.IngressRuleú# +x-kubernetes-list-type atomic + +§ +tlsŸ"´TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.² +arrayº5 +3 +1#/definitions/io.k8s.api.networking.v1.IngressTLSú# +x-kubernetes-list-type atomic + +ƒ +(io.k8s.api.storage.v1beta1.CSINodeDriverÖ "]CSINodeDriver holds information about the specification of one CSI driver installed on a nodešnamešnodeID² +objectÊØ +¨ + allocatable˜ +<#/definitions/io.k8s.api.storage.v1beta1.VolumeNodeResources"Xallocatable represents the volume resources of a node that are available for scheduling. +ª +name¡"“This is the name of the CSI driver that this object refers to. This MUST be the same name returned by the CSI GetPluginName() call for that driver.² +string +¸ +nodeID­"ŸnodeID of the node from the driver point of view. This field enables Kubernetes to communicate with storage systems that do not share the same nomenclature for nodes. For example, Kubernetes may refer to a given node as "node1", but the storage system may refer to the same node as "nodeA". When Kubernetes issues a command to the storage system to attach a volume to a specific node, it can use this field to refer to the node name using the ID that the storage system will understand, e.g. "nodeA" instead of "node1". This field is required.² +string + + topologyKeys±"”topologyKeys is the list of keys supported by the driver. When a driver is initialized on a cluster, it provides a set of topology keys that it understands (e.g. "company.com/zone", "company.com/region"). When a driver is initialized on a node, it provides the same topology keys along with values. Kubelet will expose these topology keys as labels on its own node object. When Kubernetes does topology aware provisioning, it can use this list to determine which labels it should retrieve from the node object and pass back to the driver. It is possible for different nodes to use different topology keys. This can be empty if driver does not support topology.² arrayº ² -stringú# -x-kubernetes-list-type atomic +string +§ +Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArrayN"LJSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array. +– +4io.k8s.api.authorization.v1.LocalSubjectAccessReviewÝ "çLocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.šspec² +objectÊè +§ +statusœ +C#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not +¾ -é +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +ñ +specè +A#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec"¢Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted.úr +x-kubernetes-group-version-kindOM- group: authorization.k8s.io + kind: LocalSubjectAccessReview + version: v1 -secretNameÚ"ÌSecretName is the name of the secret used to terminate TLS traffic on port 443. Field is left optional to allow TLS routing based on SNI hostname alone. If the SNI host in a listener conflicts with the "Host" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.² + +3io.k8s.api.authorization.v1beta1.ResourceAttributeså"tResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface² +objectÊà +‚ +namez"mName is the name of the resource being requested for a "get" or deleted for a "delete". "" (empty) means all.² string -ì -Nio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation™"YExternalDocumentation allows referencing an external resource for extended documentation.² -objectÊ0 - - description ² +ô + namespaceæ"ØNamespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces "" (empty) is defaulted for LocalSubjectAccessReviews "" (empty) is empty for cluster-scoped resources "" (empty) means "all" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview² string - -url ² +X +resourceL"?Resource is one of the existing resource types. "*" means all.² string -è -"io.k8s.api.core.v1.ContainerStatusÁ "JContainerStatus contains details for the current status of this container.šnamešreadyš restartCountšimagešimageID² -objectʶ - -r -namej"]This must be a DNS_LABEL. Each container in a pod must have a unique name. Cannot be updated.² +^ + subresourceO"BSubresource is one of the existing resource types. "" means none.² +string +ƒ +verb{"nVerb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. "*" means all.² string S - containerIDD"7Container's ID in the format 'docker://'.² +versionH";Version is the API Version of the Resource. "*" means all.² string -z -imageq"dThe image the container is running. More info: https://kubernetes.io/docs/concepts/containers/images² +M +groupD"7Group is the API Group of the Resource. "*" means all.² string +ü +&io.k8s.api.networking.v1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² +objectʈ +… + loadBalanceru +3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. +Û +3io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus£"ŠPodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.šdisruptionsAllowedšcurrentHealthyšdesiredHealthyš expectedPods² +objectÊÁ +ô + +conditionså"ôConditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute + the number of allowed disruptions. Therefore no disruptions are + allowed and the status of the condition will be False. +- InsufficientPods: The number of pods are either at or below the number + required by the PodDisruptionBudget. No disruptions are + allowed and the status of the condition will be False. +- SufficientPods: There are more pods than required by the PodDisruptionBudget. + The condition will be True, and the number of allowed + disruptions are provided by the disruptionsAllowed property.² +arrayº@ +> +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge + +E +currentHealthy3int32"current number of healthy pods² +integer +M +desiredHealthy;int32"&minimum desired number of healthy pods² +integer + + disruptedPodsû"¯DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.ª; 9 -imageID."!ImageID of the container's image.² -string -° -started¤"•Specifies whether the container has passed its startup probe. Initialized as false, becomes true after startupProbe is considered successful. Resets to false when the container is restarted, or if kubelet loses state temporarily. Is always true when no startupProbe is defined.² -boolean -l -statec -/#/definitions/io.k8s.api.core.v1.ContainerState"0Details about the container's current condition. -y - lastStatel -/#/definitions/io.k8s.api.core.v1.ContainerState"9Details about the container's last termination condition. -V -readyM"?Specifies whether the container has passed its readiness probe.² -boolean -¿ - restartCount®int32"˜The number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed. Note that this is calculated from dead containers. But those containers are subject to garbage collection. This value will get capped at 5 by GC.² +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time² +object +` +disruptionsAllowedJint32"5Number of pod disruptions that are currently allowed.² integer -ç -.io.k8s.api.core.v1.ISCSIPersistentVolumeSource´ "®ISCSIPersistentVolumeSource represents an ISCSI disk. ISCSI volumes can only be mounted as read/write once. ISCSI volumes support ownership management and SELinux relabeling.š targetPortalšiqnšlun² -objectÊÙ -V -chapAuthDiscoveryA"3whether support iSCSI Discovery CHAP authentication² -boolean -Ô - initiatorNameÂ"´Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection.² +[ + expectedPodsKint32"6total number of pods counted by this disruption budget² +integer +â +observedGenerationËint64"µMost recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.² +integer +Ý +$io.k8s.api.storage.v1beta1.CSIDriver´"¹CSIDriver captures information about a Container Storage Interface (CSI) volume driver deployed on the cluster. CSI drivers do not need to create the CSIDriver object directly. Instead they may use the cluster-driver-registrar sidecar container. When deployed with a CSI driver it automatically creates a CSIDriver object representing the driver. Kubernetes attach detach controller uses this object to determine whether attach is required. Kubelet uses this object to determine whether pod information needs to be passed on mount. CSIDriver objects are non-namespaced.šspec² +objectÊý +¾ + +apiVersion¯"¡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² string -z - secretRefm -0#/definitions/io.k8s.api.core.v1.SecretReference"9CHAP Secret for iSCSI target and initiator authentication -¤ - targetPortal“"…iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +¹ +kind°"¢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² string -R -chapAuthSession?"1whether support iSCSI Session CHAP authentication² +™ +metadataŒ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ÊStandard object metadata. metadata.Name indicates the name of the CSI driver that this object refers to; it MUST be the same name returned by the CSI GetPluginName() call for that driver. The driver name must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and alphanumerics between. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +b +specZ +6#/definitions/io.k8s.api.storage.v1beta1.CSIDriverSpec" Specification of the CSI Driver.úb +x-kubernetes-group-version-kind?=- group: storage.k8s.io + kind: CSIDriver + version: v1beta1 + +… +9io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatusÇ "çSubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.š resourceRulesšnonResourceRulesš +incomplete² +objectÊž +Œ +evaluationErrorø"êEvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.² +string +Ý + +incompleteÎ"¿Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.² boolean -µ -fsTypeª"œFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi² +› +nonResourceRules†"´NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² +arrayºB +@ +>#/definitions/io.k8s.api.authorization.v1beta1.NonResourceRule +Ž + resourceRulesü"­ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² +arrayº? += +;#/definitions/io.k8s.api.authorization.v1beta1.ResourceRule + +(io.k8s.api.networking.v1.HTTPIngressPathâ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² +objectÊØ + +Ÿ +backend“ +5#/definitions/io.k8s.api.networking.v1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. +ž +path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² string -0 -iqn)"Target iSCSI Qualified Name.² +’ +pathType…"÷PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is + done on a path element by element basis. A path element refers is the + list of labels in the path split by the '/' separator. A request is a + match for path p if every p is an element-wise prefix of p of the + request path. Note that if the last element of the path is a substring + of the last element in request path, it is not a match (e.g. /foo/bar + matches /foo/bar/baz, but does not match /foo/barbaz). +* ImplementationSpecific: Interpretation of the Path matching is up to + the IngressClass. Implementations can treat this as a separate PathType + or treat it identically to Prefix or Exact path types. +Implementations are required to support all path types.² string +Þ + io.k8s.api.events.v1.EventSeries¹"èEventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time. How often to update the EventSeries is up to the event reporters. The default event reporter in "k8s.io/client-go/tools/events/event_broadcaster.go" shows how this struct is updated on heartbeats and can guide customized reporter implementations.šcountšlastObservedTime² +objectʤ n -iscsiInterface\"OiSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).² -string -4 -lun-int32"iSCSI Target Lun number.² +counteint32"Pcount is the number of occurrences in this series up to the last heartbeat time.² integer -³ -portals§"ŠiSCSI Target Portal List. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² -arrayº - ² -string -k -readOnly_"QReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.² -boolean -· -'io.k8s.api.core.v1.LocalObjectReference‹"sLocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.² -objectʇ -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +± +lastObservedTimeœ +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"\lastObservedTime is the time when last Event from the series was seen before last heartbeat. +‹ +#io.k8s.api.storage.v1.CSIDriverListã"3CSIDriverList is a collection of CSIDriver objects.šitems² +objectʳ +¹ +kind°"¢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² string -° -)io.k8s.api.discovery.v1.EndpointSliceList‚"6EndpointSliceList represents a list of endpoint slicesšitems² -objectÊÉ +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ¾ apiVersion¯"¡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² string -f -items]"List of endpoint slices² -arrayº7 -5 -3#/definitions/io.k8s.api.discovery.v1.EndpointSlice -¹ -kind°"¢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² -string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úg -x-kubernetes-group-version-kindDB- version: v1 - group: discovery.k8s.io - kind: EndpointSliceList +g +items^"items is the list of CSIDriver² +arrayº1 +/ +-#/definitions/io.k8s.api.storage.v1.CSIDriverúa +x-kubernetes-group-version-kind><- group: storage.k8s.io + kind: CSIDriverList + version: v1 -ù -Xio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourcesœ"YCustomResourceSubresources defines the status and scale subresources for CustomResources.² -objectʲ -¾ -status³ -k#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatus"Ãstatus indicates the custom resource should serve a `/status` subresource. When enabled: 1. requests to the custom resource primary endpoint ignore changes to the `status` stanza of the object. 2. requests to the custom resource `/status` subresource ignore changes to anything other than the `status` stanza of the object. -î -scaleä -j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScale"vscale indicates the custom resource should serve a `/scale` subresource that returns an `autoscaling/v1` Scale object. -Ö -4io.k8s.api.admissionregistration.v1.ServiceReference";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² -objectʾ -@ -name8"+`name` is the name of the service. Required² -string -O - namespaceB"5`namespace` is the namespace of the service. Required² +ñ +Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation™"YExternalDocumentation allows referencing an external resource for extended documentation.² +objectÊ0 + + description ² string -f -path^"Q`path` is an optional URL path which will be sent in any request to this service.² + +url ² string -À -port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² +ÿ +5io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpecÅ"-specification of a horizontal pod autoscaler.šscaleTargetRefš maxReplicas² +objectÊè +× +targetCPUUtilizationPercentage´int32"žtarget average CPU utilization (represented as a percentage of requested CPU) over all the pods; if not specified the default autoscaling policy will be used.² +integer + + maxReplicas~int32"iupper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas.² +integer +ò + minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² integer +† +scaleTargetRefó +C#/definitions/io.k8s.api.autoscaling.v1.CrossVersionObjectReference"«reference to scaled resource; horizontal pod autoscaler will learn the current resource consumption and will set the desired number of pods by using its Scale subresource. º MicroTime is version of Time with microsecond level precision.² -string -ò -)io.k8s.apimachinery.pkg.apis.meta.v1.TimeÄ date-time"«Time is a wrapper around time.Time which supports correct marshaling to YAML and JSON. Wrappers are provided for many of the factory methods that the time package offers.² -string -² -=io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpecð"¾This information is immutable after the request is created. Only the Request and Usages fields can be set on creation, other fields are derived by Kubernetes and cannot be modified by users.šrequest² -objectÊ– -¤ -usages™"ÖallowedUsages specifies a set of usage contexts the key will be valid for. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 - https://tools.ietf.org/html/rfc5280#section-4.2.1.12 -Valid values are: - "signing", - "digital signature", - "content commitment", - "key encipherment", - "key agreement", - "data encipherment", - "cert sign", - "crl sign", - "encipher only", - "decipher only", - "any", - "server auth", - "client auth", - "code signing", - "email protection", - "s/mime", - "ipsec end system", - "ipsec tunnel", - "ipsec user", - "timestamping", - "ocsp signing", - "microsoft sgc", - "netscape sgc"² +targetWWNsF"*Optional: FC target worldwide names (WWNs)² arrayº ² -stringú# -x-kubernetes-list-type atomic - -d -usernameX"KInformation about the requesting user. See user.Info interface for details.² string -† -extra}"QExtra information about the requesting user. See user.Info interface for details.ª -² -arrayº - ² -string² -object -ž -groups“"QGroup information about the requesting user. See user.Info interface for details.² +µ +wwids«"ŽOptional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.² arrayº ² -stringú# -x-kubernetes-list-type atomic - -c -requestXbyte"Base64-encoded PKCS#10 CSR data² -stringú# -x-kubernetes-list-type atomic - -’ - -signerNameƒ"õRequested signer for the request. It is a qualified name in the form: `scope-hostname.io/name`. If empty, it will be defaulted: - 1. If it's a kubelet client certificate, it is assigned - "kubernetes.io/kube-apiserver-client-kubelet". - 2. If it's a kubelet serving certificate, it is assigned - "kubernetes.io/kubelet-serving". - 3. Otherwise, it is assigned "kubernetes.io/legacy-unknown". -Distribution of trust for signers happens out of band. You can select on this field using `spec.signerName`.² -string -c -uid\"OUID information about the requesting user. See user.Info interface for details.² -string -Ë -,io.k8s.api.extensions.v1beta1.IngressBackendš"DIngressBackend describes all endpoints for a given service and port.² -objectÊÅ -ø -resourceë -:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"¬Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified. -I - serviceName:"-Specifies the name of the referenced service.² -string -} - servicePortn -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"-Specifies the port of the referenced service. -¤ - -=io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationListâ "OPriorityLevelConfigurationList is a list of PriorityLevelConfiguration objects.šitems² -objectÊñ -Œ -items‚"(`items` is a list of request-priorities.² -arrayºK -I -G#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration -¹ -kind°"¢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² string -â -metadataÕ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"•`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¾ - -apiVersion¯"¡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² -stringú… -x-kubernetes-group-version-kindb`- group: flowcontrol.apiserver.k8s.io - kind: PriorityLevelConfigurationList - version: v1beta1 - -š -&io.k8s.api.storage.v1.StorageClassListï"4StorageClassList is a collection of storage classes.šitems² -objectÊ» +˜ +*io.k8s.api.rbac.v1beta1.ClusterRoleBindingé "—ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoleBinding, and will no longer be served in v1.22.šroleRef² +objectʽ ¾ apiVersion¯"¡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² string -o -itemsf"#Items is the list of StorageClasses² -arrayº4 -2 -0#/definitions/io.k8s.api.storage.v1.StorageClass ¹ kind°"¢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² string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúd -x-kubernetes-group-version-kindA?- group: storage.k8s.io - kind: StorageClassList - version: v1 - -ê -%io.k8s.api.core.v1.PodSecurityContextÀ"ôPodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.² -objectʺ -° -fsGroupChangePolicy˜"ŠfsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.² -string -£ +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +Ç +roleRef» +-#/definitions/io.k8s.api.rbac.v1beta1.RoleRef"‰RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. +‰ +subjects}"=Subjects holds references to the objects the role applies to.² +arrayº1 +/ +-#/definitions/io.k8s.api.rbac.v1beta1.Subjectúv +x-kubernetes-group-version-kindSQ- group: rbac.authorization.k8s.io + kind: ClusterRoleBinding + version: v1beta1 -runAsGroup”int64"þThe GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.² +ƒ +#io.k8s.api.apps.v1.DeploymentStatusÛ "HDeploymentStatus is the most recently observed status of the Deployment.² +objectÊ‚ +] + readyReplicasLint32"7Total number of ready pods targeted by this deployment.² integer -º - runAsNonRoot©"šIndicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² -boolean -Í -windowsOptionsº ->#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions"÷The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. -Ñ -sysctlsÅ"ŠSysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.² -arrayº+ -) -'#/definitions/io.k8s.api.core.v1.Sysctl -È -fsGroup¼int64"¦A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: - -1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- - -If unset, the Kubelet will not modify the ownership and permissions of any volume.² +ƒ +replicaswint32"bTotal number of non-terminated pods targeted by this deployment (their labels match the selector).² integer -À - runAsUser²int64"œThe UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.² +Á +unavailableReplicas©int32"“Total number of unavailable pods targeted by this deployment. This is the total number of pods that are still required for the deployment to have 100% available capacity. They may either be pods that are running but not yet available or pods that still have not been created.² integer -… -seLinuxOptionsò -/#/definitions/io.k8s.api.core.v1.SELinuxOptions"¾The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. -~ -seccompProfilel -/#/definitions/io.k8s.api.core.v1.SeccompProfile"9The seccomp options to use by the containers in this pod. -ç -supplementalGroupsÐ"«A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.² -arrayº -int64² +Œ +updatedReplicasyint32"dTotal number of non-terminated pods targeted by this deployment that have the desired template spec.² integer -º -.io.k8s.api.networking.v1beta1.IngressClassSpec‡"DIngressClassSpec provides information about the class of an Ingress.² -objectʲ -¦ +Š +availableReplicasuint32"`Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.² +integer +Þ +collisionCountËint32"µCount of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.² +integer +÷ -controller—"‰Controller refers to the name of the controller that should handle this class. This allows for different "flavors" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. "acme.io/ingress-controller". This field is immutable.² -string -† +conditionsè"MRepresents the latest available observations of a deployment's current state.² +arrayº8 +6 +4#/definitions/io.k8s.api.apps.v1.DeploymentConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -parameters÷ -K#/definitions/io.k8s.api.networking.v1beta1.IngressClassParametersReference"§Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters. -³ -'io.k8s.api.rbac.v1beta1.RoleBindingList‡ "¤RoleBindingList is a collection of RoleBindings Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBindingList, and will no longer be served in v1.22.šitems² -objectÊÓ -¾ +` +observedGenerationJint64"5The generation observed by the deployment controller.² +integer +Á +!io.k8s.api.core.v1.DaemonEndpoint›"CDaemonEndpoint contains information about a single Daemon endpoint.šPort² +objectÊA +? +Port7int32""Port number of the given endpoint.² +integer +Æ +&io.k8s.api.core.v1.ObjectFieldSelector›"?ObjectFieldSelector selects an APIVersioned field of an object.š fieldPath² +objectÊ¿ +h -apiVersion¯"¡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² -string -l -itemsc"Items is a list of RoleBindings² -arrayº5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding -¹ -kind°"¢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² +apiVersionZ"MVersion of the schema the FieldPath is written in terms of, defaults to "v1".² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ús -x-kubernetes-group-version-kindPN- group: rbac.authorization.k8s.io - kind: RoleBindingList - version: v1beta1 - -§ -"io.k8s.api.core.v1.NFSVolumeSource€"€Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.šserveršpath² -objectÊÞ -€ -pathx"kPath that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² +S + fieldPathF"9Path of the field to select in the specified API version.² string -à -readOnly¶"§ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² -boolean -’ -server‡"zServer is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs² +ä +$io.k8s.api.core.v1.ResourceQuotaSpec»"GResourceQuotaSpec defines the desired hard limits to enforce for Quota.² +objectÊã +ß +hardÖ"†hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +Ü + scopeSelectorÊ +.#/definitions/io.k8s.api.core.v1.ScopeSelector"—scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched. +Ÿ +scopes”"xA collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.² +arrayº + ² string -Ý -)io.k8s.api.networking.v1beta1.IngressRule¯ "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² -objectʱ -â - -hostÙ -"Ë -Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to - the IP in the Spec of the parent Ingress. -2. The `:` delimiter is not respected because ports are not allowed. - Currently the port of an Ingress is implicitly :80 for http and - :443 for https. -Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. +ð + io.k8s.api.discovery.v1.EndpointË"FEndpoint represents a single logical "backend" implementing a service.š addresses² +objectÊè +î + addressesà" addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.² +arrayº + ² +stringú +x-kubernetes-list-typeset -Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² -string -J -httpB -@#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressRuleValue -§ -"io.k8s.api.node.v1beta1.Scheduling€"TScheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.² -objectÊ› -® - tolerationsž"¹tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.² -arrayº/ -- -+#/definitions/io.k8s.api.core.v1.Tolerationú# -x-kubernetes-list-type atomic +” -ç - nodeSelectorÖ"¸nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.ª +conditions… +8#/definitions/io.k8s.api.discovery.v1.EndpointConditions"Iconditions contains information about the current status of the endpoint. +¾ +deprecatedTopology§"‰deprecatedTopology contains topology information part of the v1beta1 API. This field is deprecated, and will be removed when the v1beta1 API is removed (no sooner than kubernetes v1.24). While this field can hold values, it is not writable through the v1 API, and any attempts to write to it will be silently ignored. Topology information can be found in the zone and nodeName fields instead.ª ² string² object -ÿ -!io.k8s.api.storage.v1.CSINodeListÙ"/CSINodeList is a collection of CSINode objects.šitems² -objectʯ + +hints… +3#/definitions/io.k8s.api.discovery.v1.EndpointHints"Nhints contains information associated with how an endpoint should be consumed. +Î +hostnameÁ"³hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.² +string +Ú +nodeNameÍ"¿nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.² +string + + targetRef‚ +0#/definitions/io.k8s.api.core.v1.ObjectReference"NtargetRef is a reference to a Kubernetes object that represents this endpoint. +J +zoneB"5zone is the name of the Zone this endpoint exists in.² +string + +6io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethodâ"EFlowDistinguisherMethod specifies the method of a flow distinguisher.štype² +objectÊ… +‚ +typez"m`type` is the type of flow distinguisher method The supported types are "ByUser" and "ByNamespace". Required.² +string +ð +Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceValidationš"MCustomResourceValidation is a list of validation methods for CustomResources.² +objectʼ +¹ +openAPIV3Schema¥ +V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps"KopenAPIV3Schema is the OpenAPI v3 schema to use for validation and pruning. +Ñ +!io.k8s.api.apps.v1.ReplicaSetList« ".ReplicaSetList is a collection of ReplicaSets.šitems² +objectʉ ¾ apiVersion¯"¡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² string -c -itemsZ"items is the list of CSINode² +· +items­"oList of ReplicaSets. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller² arrayº/ - -+#/definitions/io.k8s.api.storage.v1.CSINode ++#/definitions/io.k8s.api.apps.v1.ReplicaSet ¹ kind°"¢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² string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataú_ -x-kubernetes-group-version-kind<:- group: storage.k8s.io - kind: CSINodeList +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúX +x-kubernetes-group-version-kind53- group: apps + kind: ReplicaSetList version: v1 -  - -=io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceÞ "[APIService represents a server for a particular GroupVersion. Name must be "version.group".² -objectʉ -¾ +í + io.k8s.api.batch.v1beta1.CronJobÈ ":CronJob represents the configuration of a single cron job.² +objectÊ£ -apiVersion¯"¡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² -string ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -¢ -spec™ -O#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceSpec"FSpec contains information for locating and communicating with a server -— -statusŒ -Q#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus"7Status contains derived information about an API serverúf -x-kubernetes-group-version-kindCA- kind: APIService - version: v1 - group: apiregistration.k8s.io +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +û +specò +2#/definitions/io.k8s.api.batch.v1beta1.CronJobSpec"»Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Ð +statusÅ +4#/definitions/io.k8s.api.batch.v1beta1.CronJobStatus"ŒCurrent status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +¾ -© -0io.k8s.api.autoscaling.v2beta2.MetricValueStatusô"6MetricValueStatus holds the current value for a metric² -objectÊ­ -ì -averageUtilizationÕint32"¿currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.² -integer -· - averageValue¦ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"gaverageValue is the current value of the average of the metric across all relevant pods (as a quantity) - -valuex -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"9value is the current value of the metric (as a quantity). -ä - io.k8s.api.core.v1.EndpointsList¿"%EndpointsList is a list of endpoints.šitems² -objectÊ© +apiVersion¯"¡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² +stringúW +x-kubernetes-group-version-kind42- group: batch + kind: CronJob + version: v1beta1 + +Ø +)io.k8s.api.rbac.v1.ClusterRoleBindingListª"=ClusterRoleBindingList is a collection of ClusterRoleBindingsšitems² +objectÊÜ ¾ apiVersion¯"¡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² string -X -itemsO"List of endpoints.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.Endpoints +u +itemsl"&Items is a list of ClusterRoleBindings² +arrayº7 +5 +3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding ¹ kind°"¢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² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúU -x-kubernetes-group-version-kind20- version: v1 - group: "" - kind: EndpointsList +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.úu +x-kubernetes-group-version-kindRP- group: rbac.authorization.k8s.io + kind: ClusterRoleBindingList + version: v1 -¦ -io.k8s.api.core.v1.HostAlias…"oHostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file.² -objectÊ… -L - hostnames?"#Hostnames for the above IP address.² -arrayº - ² +¨ +_io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionConditionÄ"YCustomResourceDefinitionCondition contains details for the current condition of this pod.štypešstatus² +objectÊÊ +q +typei"\type is the type of the condition. Types include Established, NamesAccepted and Terminating.² string -5 -ip/""IP address of the host file entry.² +¥ +lastTransitionTimeŽ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"SlastTransitionTime last time the condition transitioned from one status to another. +e +messageZ"Mmessage is a human-readable message indicating details about last transition.² string -¼ -(io.k8s.api.authorization.v1.ResourceRule"¬ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.šverbs² -objectÊÉ -ƒ - apiGroupsõ"ØAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "*" means all.² -arrayº - ² +j +reason`"Sreason is a unique, one-word, CamelCase reason for the condition's last transition.² string -¹ - resourceNames§"ŠResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. "*" means all.² -arrayº - ² +Z +statusP"Cstatus is the status of the condition. Can be True, False, Unknown.² string -ä - resourcesÖ"¹Resources is a list of resources this rule applies to. "*" means all in the specified apiGroups. - "*/foo" represents the subresource 'foo' for all resources in the specified apiGroups.² -arrayº - ² +ç +1io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus±"ŽObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).šmetricšcurrentšdescribedObject² +objectÊì +„ +currenty +>#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric +] +describedObjectJ +H#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference +ƒ +metricy +=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector +™ +io.k8s.api.core.v1.EnvVarû"AEnvVar represents an environment variable present in a Container.šname² +objectÊ¢ +N +nameF"9Name of the environment variable. Must be a C_IDENTIFIER.² string - -verbs“"wVerb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. "*" means all.² -arrayº - ² +» +value±"£Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".² string - -io.k8s.api.core.v1.Probeä"€Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.² -objectÊÒ -‘ -execˆ -+#/definitions/io.k8s.api.core.v1.ExecAction"YOne and only one of the following should be specified. Exec specifies the action to take. -§ -failureThreshold’int32"}Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.² -integer -â -initialDelaySecondsÊint32"´Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes² -integer -Î -successThreshold¹int32"£Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.² -integer -â -timeoutSecondsÏint32"¹Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes² -integer -k -httpGet` -.#/definitions/io.k8s.api.core.v1.HTTPGetAction".HTTPGet specifies the http request to perform. -} - periodSecondslint32"WHow often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.² -integer ‘ - tcpSocketƒ -0#/definitions/io.k8s.api.core.v1.TCPSocketAction"OTCPSocket specifies an action involving a TCP port. TCP hooks not yet supported -ö -terminationGracePeriodSecondsÔint64"¾Optional duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this value overrides the value provided by the pod spec. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate.² -integer -À -Wio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScaleä "^CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.šspecReplicasPathšstatusReplicasPath² -objectÊÍ -ã -specReplicasPathÎ"ÀspecReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.² -string -€ -statusReplicasPathé"ÛstatusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.² -string -á -labelSelectorPathË"½labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.² -string -– -'io.k8s.api.core.v1.PortworxVolumeSourceê";PortworxVolumeSource represents a Portworx volume resource.švolumeID² -objectÊ“ -Í -fsTypeÂ"´FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified.² + valueFromƒ +-#/definitions/io.k8s.api.core.v1.EnvVarSource"RSource for the environment variable's value. Cannot be used if value is not empty. +ä + io.k8s.api.core.v1.HTTPGetAction¿"=HTTPGetAction describes an action based on HTTP Get requests.šport² +objectÊê +7 +path/""Path to access on the HTTP server.² string -x -readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -G -volumeID;".VolumeID uniquely identifies a Portworx volume² +Ç +port¾ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"}Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. +R +schemeH";Scheme to use for connecting to the host. Defaults to HTTP.² string -Òg -io.k8s.api.core.v1.ServiceSpec¯g"FServiceSpec describes the attributes that a user creates on a service.² -objectÊØf -× -loadBalancerClassÁ"³loadBalancerClass is the class of the load balancer implementation this Service belongs to. If specified, the value of this field must be a label-style identifier, with an optional prefix, e.g. "internal-vip" or "example.com/internal-vip". Unprefixed names are reserved for end-users. This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load balancer implementation is used, today this is typically done through the cloud provider integration, but should apply for any default implementation. If set, it is assumed that a load balancer implementation is watching for Services with a matching class. Any default load balancer implementation (e.g. cloud providers) should ignore Services that set this field. This field can only be set when creating or updating a Service to type 'LoadBalancer'. Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.² +} +hostu"hHost name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead.² string -• -ports‹"ŸThe list of ports that are exposed by this service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² -arrayº0 -. -,#/definitions/io.k8s.api.core.v1.ServicePortú' -x-kubernetes-patch-strategymerge -ú2 -x-kubernetes-list-map-keys- port -- protocol -ú -x-kubernetes-list-typemap -ú' -x-kubernetes-patch-merge-keyport - -« -selectorž"€Route service traffic to pods with label keys and values matching this selector. If empty or not present, the service is assumed to have an external process managing its endpoints, which Kubernetes will not modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/ª +‘ + httpHeaders"CCustom headers to set in the request. HTTP allows repeated headers.² +arrayº/ +- ++#/definitions/io.k8s.api.core.v1.HTTPHeader +ž +.io.k8s.api.core.v1.PersistentVolumeClaimStatusë"OPersistentVolumeClaimStatus is the current status of a persistent volume claim.² +objectÊ‹ +Ò + accessModesÂ"¥AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1² +arrayº ² -string² -object -á - clusterIPÓ"ÅclusterIP is the IP address of the service and is usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be blank) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are "None", empty string (""), or a valid IP address. Setting this to "None" makes a "headless service" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² -string -Á -externalTrafficPolicy§"™externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. "Local" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. "Cluster" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.² string -• -healthCheckNodePortýint32"çhealthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type).² -integer -ñ - -ipFamiliesâ"ŸIPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the "IPv6DualStack" feature gate. This field is usually assigned automatically based on cluster configuration and the ipFamilyPolicy field. If this field is specified manually, the requested family is available in the cluster, and ipFamilyPolicy allows it, it will be used; otherwise creation of the service will fail. This field is conditionally mutable: it allows for adding or removing a secondary IP family, but it does not allow changing the primary IP family of the Service. Valid values are "IPv4" and "IPv6". This field only applies to Services of types ClusterIP, NodePort, and LoadBalancer, and does apply to "headless" services. This field will be wiped when updating a Service to type ExternalName. +• +capacityˆ"9Represents the actual resources of the underlying volume.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +Ç -This field may hold a maximum of two entries (dual-stack families, in either order). These families must correspond to the values of the clusterIPs field, if specified. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.² -arrayº - ² -stringú# -x-kubernetes-list-type atomic +conditions¸"‘Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.² +arrayºC +A +?#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -Õ - topologyKeysÄ"§topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value "*" may be used to mean "any topology". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. This field is deprecated and will be removed in a future version.² -arrayº - ² -string -‰ -allocateLoadBalancerNodePortsç"ØallocateLoadBalancerNodePorts defines if NodePorts will be automatically allocated for services with type LoadBalancer. Default is "true". It may be set to "false" if the cluster load-balancer does not rely on NodePorts. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.² -boolean -¸ - externalName§"™externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be "ExternalName".² -string -ã -loadBalancerIPÐ"ÂOnly applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.² -string -š -sessionAffinityConfig€ -6#/definitions/io.k8s.api.core.v1.SessionAffinityConfig"FsessionAffinityConfig contains the configurations of session affinity. -ò - externalIPsâ"ÅexternalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service. These IPs are not managed by Kubernetes. The user is responsible for ensuring that traffic arrives at a node with this IP. A common example is external load-balancers that are not part of the Kubernetes system.² -arrayº - ² +R +phaseI""1Group to map volume access to Default is no group² string -ë - -clusterIPsÜ "™ ClusterIPs is a list of IP addresses assigned to this service, and are usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be empty) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are "None", empty string (""), or a valid IP address. Setting this to "None" makes a "headless service" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. If this field is not specified, it will be initialized from the clusterIP field. If this field is specified, clients must ensure that clusterIPs[0] and clusterIP have the same value. - -Unless the "IPv6DualStack" feature gate is enabled, this field is limited to one value, which must be the same as the clusterIP field. If the feature gate is enabled, this field may hold a maximum of two entries (dual-stack IPs, in either order). These IPs must correspond to the values of the ipFamilies field. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies² -arrayº - ² -stringú# -x-kubernetes-list-type atomic - -ˆ -ipFamilyPolicyõ"çIPFamilyPolicy represents the dual-stack-ness requested or required by this Service, and is gated by the "IPv6DualStack" feature gate. If there is no value provided, then this field will be set to SingleStack. Services can be "SingleStack" (a single IP family), "PreferDualStack" (two IP families on dual-stack configured clusters or a single IP family on single-stack clusters), or "RequireDualStack" (two IP families on dual-stack configured clusters, otherwise fail). The ipFamilies and clusterIPs fields depend on the value of this field. This field will be wiped when updating a service to type ExternalName.² +‚ +readOnlyv"hReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false.² +boolean +á +registryÔ"ÆRegistry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes² string -“ -loadBalancerSourceRangesö"ÙIf specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/² -arrayº - ² +œ +tenant‘"ƒTenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin² string -¬ -publishNotReadyAddresses"€publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered "ready" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.² -boolean -æ -'io.k8s.api.policy.v1beta1.HostPortRangeº"HostPortRange defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.šminšmax² -objectÊŒ -C -max<int32"'max is the end of the range, inclusive.² -integer -E -min>int32")min is the start of the range, inclusive.² -integer ê? Hio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps?"[JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).² objectʱ> -v -additionalProperties^ -\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool +$ + minPropertiesint64² +integer p anyOfg² arrayºZ X V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps -v - -propertieshªZ + + description ² +string +X +exampleM +K#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON +h +items_ +]#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray + +maxItemsint64² +integer + + maxLengthint64² +integer +} +patternPropertieshªZ X V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps² object -Þ -x-kubernetes-list-typeÃ"µx-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values: +n + externalDocs^ +\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation +$ + maxPropertiesint64² +integer + +minItemsint64² +integer + +minimumdouble² +number +! -1) `atomic`: the list is treated as a single entity, like a scalar. - Atomic lists will be entirely replaced when updated. This extension - may be used on any type of list (struct, scalar, ...). -2) `set`: - Sets are lists that must not have multiple items with the same value. Each - value must be a scalar, an object with x-kubernetes-map-type `atomic` or an - array with x-kubernetes-list-type `atomic`. -3) `map`: - These lists are like maps in that their elements have a non-index key - used to identify them. Order is preserved upon merge. The map tag - must only be used on a list with elements of type object. -Defaults to atomic for arrays.² +multipleOfdouble² +number + +pattern ² +string + +$ref ² string - - uniqueItems ² -boolean - -default‘ -K#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON"Ádefault is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. Defaulting requires spec.preserveUnknownFields to be false. d enum\² arrayºO M K#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON - -maximumdouble² -number - -minItemsint64² -integer & required² arrayº ² string -} -patternPropertieshªZ -X -V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps² -object -Ó -x-kubernetes-embedded-resource°"¡x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).² -boolean + +maximumdouble² +number + + minLengthint64² +integer + +type ² +string ‡ x-kubernetes-int-or-stringè"Ùx-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns: @@ -38287,21 +37958,81 @@ V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSche - type: string - ... zero or more² boolean +Þ +x-kubernetes-list-typeÃ"µx-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values: + +1) `atomic`: the list is treated as a single entity, like a scalar. + Atomic lists will be entirely replaced when updated. This extension + may be used on any type of list (struct, scalar, ...). +2) `set`: + Sets are lists that must not have multiple items with the same value. Each + value must be a scalar, an object with x-kubernetes-map-type `atomic` or an + array with x-kubernetes-list-type `atomic`. +3) `map`: + These lists are like maps in that their elements have a non-index key + used to identify them. Order is preserved upon merge. The map tag + must only be used on a list with elements of type object. +Defaults to atomic for arrays.² +string +w + definitionshªZ +X +V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps² +object +v + +propertieshªZ +X +V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps² +object + +title ² +string +« +x-kubernetes-list-map-keysŒ"ïx-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map. + +This tag MUST only be used on lists that have the "x-kubernetes-list-type" extension set to "map". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported). + +The properties specified must either be required or have a default value, to ensure those properties are present for all list items.² +arrayº + ² +string +… + dependenciesuªg +e +c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArray² +object -exclusiveMaximum ² +exclusiveMinimum ² boolean -n - externalDocs^ -\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation +p +oneOfg² +arrayºZ +X +V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps +˜ +$x-kubernetes-preserve-unknown-fieldsï"àx-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.² +boolean +q +additionalItems^ +\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool +p +allOfg² +arrayºZ +X +V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps + +default‘ +K#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON"Ádefault is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. Defaulting requires spec.preserveUnknownFields to be false.  id ² string - - maxLengthint64² -integer -$ - minPropertiesint64² -integer + +nullable ² +boolean +Ó +x-kubernetes-embedded-resource°"¡x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).² +boolean   x-kubernetes-map-type†"øx-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values: @@ -38315,391 +38046,287 @@ $  $schema ² string -X -exampleM -K#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON +v +additionalProperties^ +\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool -exclusiveMinimum ² +exclusiveMaximum ² boolean -! +¶ +format«"format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated: -multipleOfdouble² -number +- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like "0321751043" or "978-0321751041" - isbn10: an ISBN10 number string like "0321751043" - isbn13: an ISBN13 number string like "978-0321751041" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\d{3}[- ]?\d{2}[- ]?\d{4}$ - hexcolor: an hexadecimal color code like "#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like "rgb(255,255,2559" - byte: base64 encoded binary data - password: any kind of string - date: a date string like "2006-01-02" as defined by full-date in RFC3339 - duration: a duration string like "22 ns" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like "2014-12-15T19:30:20.000Z" as defined by date-time in RFC3339.² +string _ notX V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps - -$ref ² -string - -minimumdouble² -number - -nullable ² + + uniqueItems ² boolean -p -oneOfg² -arrayºZ -X -V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps -« -x-kubernetes-list-map-keysŒ"ïx-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map. - -This tag MUST only be used on lists that have the "x-kubernetes-list-type" extension set to "map". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported). - -The properties specified must either be required or have a default value, to ensure those properties are present for all list items.² -arrayº - ² -string -p -allOfg² -arrayºZ -X -V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps -h -items_ -]#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray - -maxItemsint64² +Œ +7io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatusÐ"-current status of a horizontal pod autoscaleršcurrentReplicasšdesiredReplicas² +objectÊî +ß +currentCPUUtilizationPercentage»int32"¥current average CPU utilization over all pods, represented as a percentage of requested CPU, e.g. 70 means that an average pod is using now 70% of its requested CPU.² integer - - minLengthint64² +f +currentReplicasSint32">current number of replicas of pods managed by this autoscaler.² integer - -type ² -string -$ - maxPropertiesint64² +f +desiredReplicasSint32">desired number of replicas of pods managed by this autoscaler.² integer - -pattern ² -string - -title ² -string -q -additionalItems^ -\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool -w - definitionshªZ -X -V#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps² -object -… - dependenciesuªg -e -c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArray² -object - - description ² +Ù + lastScaleTimeÇ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"‹last time the HorizontalPodAutoscaler scaled the number of pods; used by the autoscaler to control how often the number of pods is changed. +^ +observedGenerationHint64"3most recent generation observed by this autoscaler.² +integer +à +?io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerConditionÿ"eHorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.štypešstatus² +objectÊù +« +lastTransitionTime” +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"YlastTransitionTime is the last time the condition transitioned from one status to another +g +message\"Omessage is a human-readable explanation containing details about the transition² string -¶ -format«"format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated: - -- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like "0321751043" or "978-0321751041" - isbn10: an ISBN10 number string like "0321751043" - isbn13: an ISBN13 number string like "978-0321751041" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\d{3}[- ]?\d{2}[- ]?\d{4}$ - hexcolor: an hexadecimal color code like "#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like "rgb(255,255,2559" - byte: base64 encoded binary data - password: any kind of string - date: a date string like "2006-01-02" as defined by full-date in RFC3339 - duration: a duration string like "22 ns" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like "2014-12-15T19:30:20.000Z" as defined by date-time in RFC3339.² +P +reasonF"9reason is the reason for the condition's last transition.² string -˜ -$x-kubernetes-preserve-unknown-fieldsï"àx-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.² -boolean -— -)io.k8s.api.apps.v1.RollingUpdateDaemonSeté"BSpec to control the desired behavior of daemon set rolling update.² -objectÊ– -× - -maxSurgeÊ - -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ˆ -The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. -¹ -maxUnavailable¦ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"äThe maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update. -ä - io.k8s.api.core.v1.HTTPGetAction¿"=HTTPGetAction describes an action based on HTTP Get requests.šport² -objectÊê -‘ - httpHeaders"CCustom headers to set in the request. HTTP allows repeated headers.² -arrayº/ -- -+#/definitions/io.k8s.api.core.v1.HTTPHeader -7 -path/""Path to access on the HTTP server.² +S +statusI"#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric +B +name:"-Name is the name of the resource in question.² string -û -io.k8s.api.core.v1.NodeAddressØ"8NodeAddress contains information for the node's address.štypešaddress² -objectÊ -) -address"The node address.² +b + containerU"HContainer is the name of the container in the pods of the scaling target² string -R -typeJ"=Node address type, one of Hostname, ExternalIP or InternalIP.² +ä +'io.k8s.api.networking.v1.IngressBackend¸"DIngressBackend describes all endpoints for a given service and port.² +objectÊã +± +resource¤ +:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"åResource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, a service.Name and service.Port must not be specified. This is a mutually exclusive setting with "Service". +¬ +service  +<#/definitions/io.k8s.api.networking.v1.IngressServiceBackend"`Service references a Service as a Backend. This is a mutually exclusive setting with "Resource". +Ù +io.k8s.api.core.v1.Affinity¹"1Affinity is a group of affinity scheduling rules.² +objectÊ÷ +´ + podAffinity¤ +,#/definitions/io.k8s.api.core.v1.PodAffinity"tDescribes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). +Å +podAntiAffinity± +0#/definitions/io.k8s.api.core.v1.PodAntiAffinity"}Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). +v + nodeAffinityf +-#/definitions/io.k8s.api.core.v1.NodeAffinity"5Describes node affinity scheduling rules for the pod. +æ +(io.k8s.api.core.v1.GlusterfsVolumeSource¹"‹Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.š endpointsšpath² +objectʉ +« + endpoints"EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² string -¦ -io.k8s.api.events.v1beta1.Event‚"¾Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.š eventTime² -objectÊÆ -Ñ -relatedÅ -0#/definitions/io.k8s.api.core.v1.ObjectReference"related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object. -¦ -action›"action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field can have at most 128 characters.² +ƒ +path{"nPath is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² string -Á -deprecatedFirstTimestamp¤ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ideprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. +Ò +readOnlyÅ"¶ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod² +boolean +ë +%io.k8s.api.core.v1.ServiceAccountListÁ "6ServiceAccountList is a list of ServiceAccount objectsšitems² +objectÊ• +à +items¹"wList of ServiceAccounts. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/² +arrayº3 +1 +/#/definitions/io.k8s.api.core.v1.ServiceAccount ¹ kind°"¢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² string -| -reasonr"ereason is why the action was taken. It is human-readable. This field can have at most 128 characters.² -string -¹ -reportingController¡"“reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.² -string -Ÿ -series” -3#/definitions/io.k8s.api.events.v1beta1.EventSeries"]series is data about the Event series this event represents or nil if it's a singleton Event. -¿ -deprecatedLastTimestamp£ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"hdeprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. -¦ -deprecatedSource‘ -,#/definitions/io.k8s.api.core.v1.EventSource"adeprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. -— - eventTime‰ -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"IeventTime is the time when this Event was first observed. It is required. -½ -note´"¦note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.² -string - -reportingInstance¬"žreportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.² -string -† -type~"qtype is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable.² -string +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds ¾ apiVersion¯"¡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² -string -ˆ -deprecatedCountuint32"`deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.² -integer -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¶ - regarding¨ -0#/definitions/io.k8s.api.core.v1.ObjectReference"óregarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object.ú] -x-kubernetes-group-version-kind:8- group: events.k8s.io - kind: Event - version: v1beta1 - -° -io.k8s.api.node.v1.Overhead"ROverhead structure represents the resource overhead associated with running a pod.² -objectÊ­ -ª -podFixed"NPodFixed represents the fixed resource overhead associated with running a pod.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -… -!io.k8s.api.policy.v1beta1.IDRangeß"6IDRange provides a min/max of an allowed range of IDs.šminšmax² -objectÊŒ -C -max<int64"'max is the end of the range, inclusive.² -integer -E -min>int64")min is the start of the range, inclusive.² -integer -£ -Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionConditionÄ"YCustomResourceDefinitionCondition contains details for the current condition of this pod.štypešstatus² -objectÊÊ -Z -statusP"Cstatus is the status of the condition. Can be True, False, Unknown.² -string -q -typei"\type is the type of the condition. Types include Established, NamesAccepted and Terminating.² -string -¥ -lastTransitionTimeŽ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"SlastTransitionTime last time the condition transitioned from one status to another. -e -messageZ"Mmessage is a human-readable message indicating details about last transition.² -string -j -reason`"Sreason is a unique, one-word, CamelCase reason for the condition's last transition.² -string -…" -Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec¦!"PCustomResourceDefinitionSpec describes how a user wants their resource to appearšgroupšnamesšscope² -objectÊ­ -à - subresources² -f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources"Çsubresources specify what subresources the defined custom resource has. If present, this field configures subresources for all versions. Top-level and per-version subresources are mutually exclusive. -ª - -conversion› -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceConversion"3conversion defines conversion settings for the CRD. -¹ -names¯ -i#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames"Bnames specify the resource and kind names for the custom resource. -Ñ -preserveUnknownFields·"¨preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. If false, schemas must be defined for all versions. Defaults to true in v1beta for backwards compatibility. Deprecated: will be required to be false in v1. Preservation of unknown fields can be specified in the validation schema using the `x-kubernetes-preserve-unknown-fields: true` extension. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.² -boolean -Î +stringúZ +x-kubernetes-group-version-kind75- version: v1 + group: "" + kind: ServiceAccountList -validation¿ -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation"Övalidation describes the schema used for validation and pruning of the custom resource. If present, this validation schema is used to validate all versions. Top-level and per-version schemas are mutually exclusive. -Ï -versionÃ"µversion is the API version of the defined custom resource. The custom resources are served under `/apis///...`. Must match the name of the first item in the `versions` list if `version` and `versions` are both specified. Optional if `versions` is specified. Deprecated: use `versions` instead.² -string - -versions"‘versions is the list of all API versions of the defined custom resource. Optional if `version` is specified. The name of the first item in the `versions` list must match the `version` field if `version` and `versions` are both specified. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² -arrayºo -m -k#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersion -Å -additionalPrinterColumns¨"ªadditionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. If present, this field configures columns for all versions. Top-level and per-version columns are mutually exclusive. If no top-level or per-version columns are specified, a single column displaying the age of the custom resource is used.² -arrayºn -l -j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition -å -groupÛ"Ígroup is the API group of the defined custom resource. The custom resources are served under `/apis//...`. Must match the name of the CustomResourceDefinition (in the form `.`).² -string -´ -scopeª"œscope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`. Default is `Namespaced`.² +Ò +)io.k8s.api.networking.v1beta1.IngressSpec¤ ";IngressSpec describes the Ingress the user wishes to exist.² +objectÊØ +´ +ingressClassNameŸ"‘IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.² string -ð -(io.k8s.api.core.v1.ContainerStateRunningÃ"8ContainerStateRunning is a running state of a container.² -objectÊ{ -y - startedAtl -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"1Time at which the container was last (re-)started -ž -(io.k8s.api.core.v1.ProjectedVolumeSourceñ"$Represents a projected volume source² -objectʼ -Î - defaultMode¾int32"¨Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² -integer -i -sources^"list of volume projections² -arrayº5 -3 -1#/definitions/io.k8s.api.core.v1.VolumeProjection -ø -"io.k8s.api.core.v1.RBDVolumeSourceÑ "ˆRepresents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management and SELinux relabeling.šmonitorsšimage² -objectʤ -« -keyringŸ"‘Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +Ø +rulesÎ"ƒA list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.² +arrayº; +9 +7#/definitions/io.k8s.api.networking.v1beta1.IngressRule +† +tlsþ"´TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.² +arrayº: +8 +6#/definitions/io.k8s.api.networking.v1beta1.IngressTLS +º +backend® +:#/definitions/io.k8s.api.networking.v1beta1.IngressBackend"ïA default backend capable of servicing requests that don't match any rule. At least one of 'backend' or 'rules' must be specified. This field is optional to allow the loadbalancer controller or defaulting logic to specify a global default. +˜ +.io.k8s.api.authorization.v1.ResourceAttributeså"tResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface² +objectÊà +ƒ +verb{"nVerb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. "*" means all.² string -Ž -monitors"eA collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² -arrayº - ² +S +versionH";Version is the API Version of the Resource. "*" means all.² string -€ -poolx"kThe rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +M +groupD"7Group is the API Group of the Resource. "*" means all.² string -´ -readOnly§"˜ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² -boolean -ù - secretRefë -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"±SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it ‚ -userz"mThe rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +namez"mName is the name of the resource being requested for a "get" or deleted for a "delete". "" (empty) means all.² string -³ -fsType¨"šFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd² +ô + namespaceæ"ØNamespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces "" (empty) is defaulted for LocalSubjectAccessReviews "" (empty) is empty for cluster-scoped resources "" (empty) means "all" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview² string -r -imagei"\The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +X +resourceL"?Resource is one of the existing resource types. "*" means all.² string -ì -#io.k8s.api.core.v1.NodeConfigStatusÄ"WNodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource.² -objectÊÜ -  -error–"ˆError describes any problems reconciling the Spec.ConfigSource to the Active config. Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting to load or validate the Assigned config, etc. Errors may occur at different points while syncing config. Earlier errors (e.g. download or checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error by fixing the config assigned in Spec.ConfigSource. You can find additional information for debugging by searching the error message in the Kubelet log. Error is a human-readable description of the error state; machines can check whether or not Error is empty, but should not rely on the stability of the Error text across Kubelet versions.² +^ + subresourceO"BSubresource is one of the existing resource types. "" means none.² string -ö - lastKnownGoodä -1#/definitions/io.k8s.api.core.v1.NodeConfigSource"®LastKnownGood reports the checkpointed config the node will fall back to when it encounters an error attempting to use the Assigned config. The Assigned config becomes the LastKnownGood config when the node determines that the Assigned config is stable and correct. This is currently implemented as a 10-minute soak period starting when the local record of Assigned config is updated. If the Assigned config is Active at the end of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, because the local default config is always assumed good. You should not make assumptions about the node's method of determining config stability and correctness, as this may change or become configurable in the future. -Á -active¶ -1#/definitions/io.k8s.api.core.v1.NodeConfigSource"€Active reports the checkpointed config the node is actively using. Active will represent either the current version of the Assigned config, or the current LastKnownGood config, depending on whether attempting to use the Assigned config results in an error. -ù -assignedì -1#/definitions/io.k8s.api.core.v1.NodeConfigSource"¶Assigned reports the checkpointed config the node will try to use. When Node.Spec.ConfigSource is updated, the node checkpoints the associated config payload to local disk, along with a record indicating intended config. The node refers to this record to choose its config checkpoint, and reports this record in Assigned. Assigned only updates in the status after the record has been checkpointed to disk. When the Kubelet is restarted, it tries to make the Assigned config the Active config by loading and validating the checkpointed payload identified by Assigned. -¢ - io.k8s.api.core.v1.ServiceStatusý"9ServiceStatus represents the current status of a service.² -objectʳ -” - -conditions…"Current service state² -arrayº@ -> -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú -x-kubernetes-list-typemap -ú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge -ú' -x-kubernetes-list-map-keys - type +” +)io.k8s.api.coordination.v1beta1.LeaseListæ"%LeaseList is a list of Lease objects.šitems² +objectʾ +¾ -™ - loadBalancerˆ -3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus"QLoadBalancer contains the current status of the load-balancer, if one is present. -Á --io.k8s.api.authorization.v1beta1.ResourceRule"¬ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.šverbs² -objectÊÉ -ä - resourcesÖ"¹Resources is a list of resources this rule applies to. "*" means all in the specified apiGroups. - "*/foo" represents the subresource 'foo' for all resources in the specified apiGroups.² -arrayº - ² +apiVersion¯"¡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² string - -verbs“"wVerb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. "*" means all.² -arrayº - ² +q +itemsh""Items is a list of schema objects.² +arrayº7 +5 +3#/definitions/io.k8s.api.coordination.v1beta1.Lease +¹ +kind°"¢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² string -ƒ - apiGroupsõ"ØAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "*" means all.² -arrayº - ² +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúg +x-kubernetes-group-version-kindDB- group: coordination.k8s.io + kind: LeaseList + version: v1beta1 + +¨ +%io.k8s.api.core.v1.PodDNSConfigOption"9PodDNSConfigOption defines DNS resolver options of a pod.² +objectÊ6 + +name" Required.² string -¹ - resourceNames§"ŠResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. "*" means all.² -arrayº - ² + +value ² string -ä -"io.k8s.api.core.v1.CSIVolumeSource½ "TRepresents a source location of a volume to mount, managed by an external CSI driveršdriver² -objectÊÏ -¢ -driver—"‰Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster.² +Ö + io.k8s.api.core.v1.ResourceQuota± "FResourceQuota sets aggregate quota restrictions enforced per namespace² +objectÊ‚ + +¾ + +apiVersion¯"¡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² string -Ë -fsTypeÀ"²Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply.² +¹ +kind°"¢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² string -¥ -nodePublishSecretRefŒ -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"ÒNodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. -m -readOnlya"SSpecifies a read-only configuration for the volume. Defaults to false (read/write).² +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +à +specº +2#/definitions/io.k8s.api.core.v1.ResourceQuotaSpec"ƒSpec defines the desired quota. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ç +statusÜ +4#/definitions/io.k8s.api.core.v1.ResourceQuotaStatus"£Status defines the actual enforced quota and its current usage. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúU +x-kubernetes-group-version-kind20- group: "" + kind: ResourceQuota + version: v1 + +¥ +%io.k8s.api.core.v1.SecretVolumeSourceû "íAdapts a Secret into a volume. + +The contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.² +objectÊü +ê + defaultModeÚint32"ÄOptional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +¤ +itemsš"ÜIf unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.KeyToPath +P +optionalD"6Specify whether the Secret or its keys must be defined² boolean - -volumeAttributes­"VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values.ª - ² -string² -object +“ + +secretName„"wName of the secret in the pod's namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret² +string +… +io.k8s.api.core.v1.Serviceæ "çService is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy.² +objectÊ› + +þ +statusó +.#/definitions/io.k8s.api.core.v1.ServiceStatus"ÀMost recently observed status of the service. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +¾ + +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Å +spec¼ +,#/definitions/io.k8s.api.core.v1.ServiceSpec"‹Spec defines the behavior of a service. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúO +x-kubernetes-group-version-kind,*- group: "" + kind: Service + version: v1 + +Ý +)io.k8s.api.extensions.v1beta1.IngressRule¯ "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² +objectʱ +J +httpB +@#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue +â + +hostÙ +"Ë +Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to + the IP in the Spec of the parent Ingress. +2. The `:` delimiter is not respected because ports are not allowed. + Currently the port of an Ingress is implicitly :80 for http and + :443 for https. +Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. + +Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² +string ƒ !io.k8s.api.core.v1.EndpointSubsetÝ"³EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given: { @@ -38725,430 +38352,367 @@ The resulting set of endpoints can be viewed as: arrayº1 / -#/definitions/io.k8s.api.core.v1.EndpointPort -Œ -%io.k8s.api.rbac.v1.ClusterRoleBindingâ -"ŸClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.šroleRef² -objectʳ -¾ - -apiVersion¯"¡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² +ì +&io.k8s.api.core.v1.FlockerVolumeSourceÁ"ÃRepresents a Flocker volume mounted by the Flocker agent. One and only one of datasetName and datasetUUID should be set. Flocker volumes do not support ownership management or SELinux relabeling.² +objectÊì +ˆ + datasetNamey"lName of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated² string -¹ -kind°"¢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² +_ + datasetUUIDP"CUUID of the dataset. This is unique identifier of a Flocker dataset² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. - -roleRef¶ -(#/definitions/io.k8s.api.rbac.v1.RoleRef"‰RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. -„ -subjectsx"=Subjects holds references to the objects the role applies to.² -arrayº, -* -(#/definitions/io.k8s.api.rbac.v1.Subjectúq -x-kubernetes-group-version-kindNL- version: v1 - group: rbac.authorization.k8s.io - kind: ClusterRoleBinding - -  -+io.k8s.api.storage.v1beta1.VolumeAttachmentð "—VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node. +Œ +&io.k8s.api.storage.v1.VolumeAttachmentá "—VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node. VolumeAttachment objects are non-namespaced.šspec² -objectÊÔ +objectÊÊ +Ð +metadataà +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¤ +spec› +8#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSpec"_Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system. +Ð +statusÅ +:#/definitions/io.k8s.api.storage.v1.VolumeAttachmentStatus"†Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher. ¾ apiVersion¯"¡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² string ¹ kind°"¢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² -string -Ð -metadataà -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -© -spec  -=#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentSpec"_Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system. -Õ -statusÊ -?#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentStatus"†Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher.úi -x-kubernetes-group-version-kindFD- version: v1beta1 - group: storage.k8s.io +stringúd +x-kubernetes-group-version-kindA?- group: storage.k8s.io kind: VolumeAttachment + version: v1 -§ -Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArrayN"LJSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array. -Ù -%io.k8s.api.core.v1.LoadBalancerStatus¯"#/definitions/io.k8s.api.networking.v1.NetworkPolicyEgressRule -ã -ingress×"„List of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)² -arrayºC -A -?#/definitions/io.k8s.api.networking.v1.NetworkPolicyIngressRule -Û - podSelectorË -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"†Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace. -­ - policyTypes"€List of rule types that the NetworkPolicy relates to. Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ "Egress" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include "Egress" (since such a policy would not include an Egress section and would otherwise default to just [ "Ingress" ]). This field is beta-level in 1.8² -arrayº - ² +!io.k8s.api.storage.v1.VolumeErrorê"DVolumeError captures an error encountered during a volume operation.² +objectÊ• +® +message¢"”String detailing the error encountered during Attach or Detach operation. This string may be logged, so it should not contain sensitive information.² string -ò, -2io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions»,":DeleteOptions may be provided when deleting an API object.² -objectÊ‹ +b +timeZ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"Time the error was encountered. +í +1io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList·"RAPIGroupList is a list of APIGroup, to allow clients to discover the API at /apis.šgroups² +objectÊô ¾ apiVersion¯"¡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² string -  -dryRun•"øWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed² -arrayº - ² -string -Þ -gracePeriodSecondsÇint64"±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.² -integer +u +groupsk"groups is a list of APIGroup.² +arrayº? += +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup ¹ kind°"¢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² -string -Ä -orphanDependents¯" Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.² -boolean - - preconditions° -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions"lMust be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned. -û -propagationPolicyå"×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.² -stringúá -x-kubernetes-group-version-kind½º- kind: DeleteOptions - version: v1 - group: "" -- group: admission.k8s.io - kind: DeleteOptions - version: v1 -- group: admission.k8s.io - kind: DeleteOptions - version: v1beta1 -- kind: DeleteOptions - version: v1 - group: admissionregistration.k8s.io -- kind: DeleteOptions - version: v1beta1 - group: admissionregistration.k8s.io -- group: apiextensions.k8s.io - kind: DeleteOptions - version: v1 -- group: apiextensions.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: apiregistration.k8s.io - kind: DeleteOptions - version: v1 -- group: apiregistration.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: apps - kind: DeleteOptions - version: v1 -- group: apps - kind: DeleteOptions - version: v1beta1 -- group: apps - kind: DeleteOptions - version: v1beta2 -- group: authentication.k8s.io - kind: DeleteOptions - version: v1 -- group: authentication.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: authorization.k8s.io - kind: DeleteOptions - version: v1 -- group: authorization.k8s.io - kind: DeleteOptions - version: v1beta1 -- kind: DeleteOptions - version: v1 - group: autoscaling -- group: autoscaling - kind: DeleteOptions - version: v2beta1 -- group: autoscaling - kind: DeleteOptions - version: v2beta2 -- version: v1 - group: batch - kind: DeleteOptions -- group: batch - kind: DeleteOptions - version: v1beta1 -- group: certificates.k8s.io - kind: DeleteOptions - version: v1 -- group: certificates.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: coordination.k8s.io - kind: DeleteOptions - version: v1 -- group: coordination.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: discovery.k8s.io - kind: DeleteOptions - version: v1 -- group: discovery.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: events.k8s.io - kind: DeleteOptions - version: v1 -- group: events.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: extensions - kind: DeleteOptions - version: v1beta1 -- group: flowcontrol.apiserver.k8s.io - kind: DeleteOptions - version: v1alpha1 -- group: flowcontrol.apiserver.k8s.io - kind: DeleteOptions - version: v1beta1 -- version: v1alpha1 - group: imagepolicy.k8s.io - kind: DeleteOptions -- group: internal.apiserver.k8s.io - kind: DeleteOptions - version: v1alpha1 -- version: v1 - group: networking.k8s.io - kind: DeleteOptions -- version: v1beta1 - group: networking.k8s.io - kind: DeleteOptions -- group: node.k8s.io - kind: DeleteOptions - version: v1 -- group: node.k8s.io - kind: DeleteOptions - version: v1alpha1 -- group: node.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: policy - kind: DeleteOptions - version: v1 -- kind: DeleteOptions - version: v1beta1 - group: policy -- group: rbac.authorization.k8s.io - kind: DeleteOptions - version: v1 -- group: rbac.authorization.k8s.io - kind: DeleteOptions - version: v1alpha1 -- group: rbac.authorization.k8s.io - kind: DeleteOptions - version: v1beta1 -- group: scheduling.k8s.io - kind: DeleteOptions - version: v1 -- group: scheduling.k8s.io - kind: DeleteOptions - version: v1alpha1 -- group: scheduling.k8s.io - kind: DeleteOptions - version: v1beta1 -- kind: DeleteOptions - version: v1 - group: storage.k8s.io -- group: storage.k8s.io - kind: DeleteOptions - version: v1alpha1 -- group: storage.k8s.io - kind: DeleteOptions - version: v1beta1 +stringúT +x-kubernetes-group-version-kind1/- group: "" + kind: APIGroupList + version: v1 -È -&io.k8s.api.apps.v1.DeploymentCondition"KDeploymentCondition describes the state of a deployment at a certain point.štypešstatus² -objectʱ -2 -type*"Type of deployment condition.² +‡ +io.k8s.api.core.v1.Endpointsæ"ýEndpoints is a collection of endpoints that implement the actual service. Example: + Name: "mysvc", + Subsets: [ + { + Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], + Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] + }, + { + Addresses: [{"ip": "10.10.3.3"}], + Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] + }, + ]² +objectʃ +¾ + +apiVersion¯"¡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² string -‘ -lastTransitionTime{ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. -v -lastUpdateTimed -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time")The last time this condition was updated. -Y -messageN"AA human readable message indicating details about the transition.² +¹ +kind°"¢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² string -F -reason<"/The reason for the condition's last transition.² +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +® +subsets¢"ßThe set of all endpoints is the union of all subsets. Addresses are placed into subsets according to the IPs they share. A single address with multiple ports, some of which are ready and some of which are not (because they come from different containers) will result in the address being displayed in different subsets for the different ports. No address will appear in both Addresses and NotReadyAddresses in the same subset. Sets of addresses and ports that comprise a service.² +arrayº3 +1 +/#/definitions/io.k8s.api.core.v1.EndpointSubsetúQ +x-kubernetes-group-version-kind.,- group: "" + kind: Endpoints + version: v1 + +¢ + io.k8s.api.core.v1.ServiceStatusý"9ServiceStatus represents the current status of a service.² +objectʳ +” + +conditions…"Current service state² +arrayº@ +> +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge + +™ + loadBalancerˆ +3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus"QLoadBalancer contains the current status of the load-balancer, if one is present. + +!io.k8s.api.core.v1.LimitRangeSpec÷"NLimitRangeSpec defines a min/max usage limit for resources that match on kind.šlimits² +objectÊ +Œ +limits"?Limits is the list of LimitRangeItem objects that are enforced.² +arrayº3 +1 +/#/definitions/io.k8s.api.core.v1.LimitRangeItem +½ +-io.k8s.api.networking.v1beta1.HTTPIngressPath‹ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² +objectÊ +¤ +backend˜ +:#/definitions/io.k8s.api.networking.v1beta1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. +ž +path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² string -L -statusB"5Status of the condition, one of True, False, Unknown.² +¶ +pathType©"›PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is + done on a path element by element basis. A path element refers is the + list of labels in the path split by the '/' separator. A request is a + match for path p if every p is an element-wise prefix of p of the + request path. Note that if the last element of the path is a substring + of the last element in request path, it is not a match (e.g. /foo/bar + matches /foo/bar/baz, but does not match /foo/barbaz). +* ImplementationSpecific: Interpretation of the Path matching is up to + the IngressClass. Implementations can treat this as a separate PathType + or treat it identically to Prefix or Exact path types. +Implementations are required to support all path types. Defaults to ImplementationSpecific.² string -¾ --io.k8s.api.authentication.v1.TokenRequestSpecŒ "HTokenRequestSpec contains client provided parameters of a token request.š audiences² -objectʧ -• - audiences‡"êAudiences are the intendend audiences of the token. A recipient of a token must identitfy themself with an identifier in the list of audiences of the token, and otherwise should reject the token. A token issued for multiple audiences may be used to authenticate against any of the audiences listed but implies a high degree of trust between the target audiences.² -arrayº - ² +ý ++io.k8s.api.policy.v1beta1.PodSecurityPolicyÍ "˜PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated in 1.21.² +objectʾ +j +specb +=#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicySpec"!spec defines the policy enforced. +¾ + +apiVersion¯"¡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² string -Ž -boundObjectRefû -?#/definitions/io.k8s.api.authentication.v1.BoundObjectReference"·BoundObjectRef is a reference to an object that the token will be bound to. The token will only be valid for as long as the bound object exists. NOTE: The API server's TokenReview endpoint will validate the BoundObjectRef, but other audiences may not. Keep ExpirationSeconds small if you want prompt revocation. -û -expirationSecondsåint64"ÏExpirationSeconds is the requested duration of validity of the request. The token issuer may return a token with a different validity duration so a client needs to check the 'expiration' field in a response.² -integer -Í -/io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy™"WHPAScalingPolicy is a single policy which must hold true for a specified past interval.štypešvalueš periodSeconds² -objectÊ’ -Ê - periodSeconds¸int32"¢PeriodSeconds specifies the window of time for which the policy should hold true. PeriodSeconds must be greater than zero and less than or equal to 1800 (30 min).² -integer -@ -type8"+Type is used to specify the scaling policy.² +¹ +kind°"¢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² string -€ -valuewint32"bValue contains the amount of change which is permitted by the policy. It must be greater than zero² -integer -Ÿ -:io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerListà"GHorizontalPodAutoscaler is a list of horizontal pod autoscaler objects.šitems² -objectÊŒ +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúb +x-kubernetes-group-version-kind?=- group: policy + kind: PodSecurityPolicy + version: v1beta1 + +á +&io.k8s.api.scheduling.v1.PriorityClass¶"{PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.švalue² +objectÊ» ¹ kind°"¢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² string -r -metadataf -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"'metadata is the standard list metadata. +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +„ +preemptionPolicyï"áPreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.² +string +¨ +valuežint32"ˆThe value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.² +integer ¾ apiVersion¯"¡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² string -˜ -itemsŽ"7items is the list of horizontal pod autoscaler objects.² -arrayºH -F -D#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerúq -x-kubernetes-group-version-kindNL- group: autoscaling - kind: HorizontalPodAutoscalerList - version: v2beta1 +‹ + description|"odescription is an arbitrary string that usually provides guidelines on when this priority class should be used.² +string +¦ + globalDefault”"…globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.² +booleanúd +x-kubernetes-group-version-kindA?- group: scheduling.k8s.io + kind: PriorityClass + version: v1 -è -%io.k8s.api.discovery.v1beta1.Endpoint¾"FEndpoint represents a single logical "backend" implementing a service.š addresses² -objectÊÛ -Ú -nodeNameÍ"¿nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.² +ö +4io.k8s.api.authorization.v1.SubjectRulesReviewStatus½ "çSubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.š resourceRulesšnonResourceRulesš +incomplete² +objectÊ” +Œ +evaluationErrorø"êEvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.² string - - targetRef‚ -0#/definitions/io.k8s.api.core.v1.ObjectReference"NtargetRef is a reference to a Kubernetes object that represents this endpoint. -ó -topologyæ"Ètopology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node - where the endpoint is located. This should match the corresponding - node label. -* topology.kubernetes.io/zone: the value indicates the zone where the - endpoint is located. This should match the corresponding node label. -* topology.kubernetes.io/region: the value indicates the region where the - endpoint is located. This should match the corresponding node label. -This field is deprecated and will be removed in future api versions.ª +Ý + +incompleteÎ"¿Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.² +boolean +– +nonResourceRules"´NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² +arrayº= +; +9#/definitions/io.k8s.api.authorization.v1.NonResourceRule +‰ + resourceRules÷"­ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.² +arrayº: +8 +6#/definitions/io.k8s.api.authorization.v1.ResourceRule +‰ +0io.k8s.api.authorization.v1beta1.NonResourceRuleÔ"LNonResourceRule holds information that describes a rule for the non-resourcešverbs² +objectÊï +Ë +nonResourceURLs·"šNonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path. "*" means all.² +arrayº ² -string² -object -î - addressesà" addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.² +string +ž +verbs”"xVerb is a list of kubernetes non-resource API verbs, like: get, post, put, delete, patch, head, options. "*" means all.² arrayº ² -stringú -x-kubernetes-list-typeset +string +­ +:io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpecî"_HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.šscaleTargetRefš maxReplicas² +objectÊß +® +behavior¡ +L#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior"Ðbehavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively). If not set, the default HPAScalingRules for scale up and scale down are used. +© + maxReplicas™int32"ƒmaxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.² +integer + +metricsõ"ªmetrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond. If not set, the default metric will be set to 80% average CPU utilization.² +arrayº; +9 +7#/definitions/io.k8s.api.autoscaling.v2beta2.MetricSpec +ò + minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² +integer +† +scaleTargetRefó +H#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference"¦scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count. +» +"io.k8s.api.core.v1.EndpointAddress”" +type6")Type of replication controller condition.² string -X -resourceL"?Resource is one of the existing resource types. "*" means all.² +• +lastTransitionTime +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DThe last time the condition transitioned from one status to another. +Y +messageN"AA human readable message indicating details about the transition.² string -^ - subresourceO"BSubresource is one of the existing resource types. "" means none.² +F +reason<"/The reason for the condition's last transition.² string -ƒ -verb{"nVerb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. "*" means all.² +å +'io.k8s.api.core.v1.ConfigMapKeySelector¹"Selects a key from a ConfigMap.škey² +objectʃ +& +key"The key to select.² string -S -versionH";Version is the API Version of the Resource. "*" means all.² +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -M -groupD"7Group is the API Group of the Resource. "*" means all.² +R +optionalF"8Specify whether the ConfigMap or its key must be defined² +boolean +Æ +,io.k8s.api.core.v1.ConfigMapNodeConfigSource•"lConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.š namespacešnameškubeletConfigKey² +objectÊò +¹ +kubeletConfigKey¤"–KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.² string -Ò -Cio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.ServiceReferenceŠ";ServiceReference holds a reference to Service.legacy.k8s.io² -objectʾ -4 -name,"Name is the name of the service² +p +nameh"[Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.² string -C - namespace6")Namespace is the namespace of the service² + + namespacer"eNamespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.² +string +± +resourceVersion"ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.² string +Œ +uid„"wUID is the metadata.UID of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.² +string +à +(io.k8s.api.core.v1.StorageOSVolumeSource³ "2Represents a StorageOS persistent volume resource.² +objectÊð À -port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² -integer -å -,io.k8s.api.flowcontrol.v1beta1.LimitResponse´"PLimitResponse defines how to handle requests that can not be executed right now.štype² -objectÊé -à -queuing· -A#/definitions/io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration"r`queuing` holds the configuration parameters for queuing. This field may be non-empty only if `type` is `"Queue"`. -  -type—"‰`type` is "Queue" or "Reject". "Queue" means that requests that can not be executed upon arrival are held in a queue until they can be executed or a queuing limit is reached. "Reject" means that requests that can not be executed upon arrival are rejected. Required.² -stringú` -x-kubernetes-unionsIG- discriminator: type - fields-to-discriminateBy: - queuing: Queuing - -Ÿ --io.k8s.api.networking.v1.HTTPIngressRuleValueí"£HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http:///? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² -objectÊ° -­ -paths£"4A collection of paths that map requests to backends.² -arrayº: -8 -6#/definitions/io.k8s.api.networking.v1.HTTPIngressPathú# -x-kubernetes-list-type atomic +fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +string +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean +Ï + secretRefÁ +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"‡SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. +‹ -ü -&io.k8s.api.networking.v1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² -objectʈ -… - loadBalanceru -3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. -Ÿ -(io.k8s.api.node.v1beta1.RuntimeClassListò"3RuntimeClassList is a list of RuntimeClass objects.šitems² -objectʽ +volumeName}"pVolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.² +string +Ð +volumeNamespace¼"®VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.² +string +Û +"io.k8s.api.policy.v1beta1.Eviction´ "ÒEviction evicts a pod from its node subject to certain policies and safety constraints. This is a subresource of Pod. A request to cause such an eviction is created by POSTing to .../pods//evictions.² +objectÊô ¾ apiVersion¯"¡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² string -p -itemsg""Items is a list of schema objects.² -arrayº6 -4 -2#/definitions/io.k8s.api.node.v1beta1.RuntimeClass +r + deleteOptionsa +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions"DeleteOptions may be provided ¹ kind°"¢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² string -Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúf -x-kubernetes-group-version-kindCA- group: node.k8s.io - kind: RuntimeClassList +€ +metadatat +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"3ObjectMeta describes the pod that is being evicted.úY +x-kubernetes-group-version-kind64- group: policy + kind: Eviction version: v1beta1 - -/io.k8s.apimachinery.pkg.util.intstr.IntOrStringŽ int-or-string"ñIntOrString is a type that can hold an int32 or a string. When used in JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number.² -string -‰ -1io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerÓ -"-configuration of a horizontal pod autoscaler.² -objectʪ +  ++io.k8s.api.storage.v1beta1.VolumeAttachmentð "—VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node. + +VolumeAttachment objects are non-namespaced.šspec² +objectÊÔ ¾ apiVersion¯"¡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² @@ -39267,789 +38829,766 @@ apiVersion Ð metadataà =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ù -specÐ -C#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec"ˆbehaviour of autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. -| -statusr -E#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus")current information about the autoscaler.úh -x-kubernetes-group-version-kindEC- kind: HorizontalPodAutoscaler - version: v1 - group: autoscaling - -ž -io.k8s.api.batch.v1.Job‚ "1Job represents the configuration of a single job.² -objectÊï -¹ -kind°"¢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² -string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +© +spec  +=#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentSpec"_Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system. Õ -specÌ -)#/definitions/io.k8s.api.batch.v1.JobSpec"žSpecification of the desired behavior of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - -status· -+#/definitions/io.k8s.api.batch.v1.JobStatus"‡Current status of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -¾ +statusÊ +?#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentStatus"†Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher.úi +x-kubernetes-group-version-kindFD- group: storage.k8s.io + kind: VolumeAttachment + version: v1beta1 -apiVersion¯"¡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² -stringúN -x-kubernetes-group-version-kind+)- version: v1 - group: batch - kind: Job +å +Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec‹"PCustomResourceDefinitionSpec describes how a user wants their resource to appearšgroupšnamesšscopešversions² +objectʇ +¥ -¯ -$io.k8s.api.discovery.v1.EndpointPort† "7EndpointPort represents a Port used by an EndpointSlice² -objectʾ -b -protocolV"IThe IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.² +conversion– +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversion"3conversion defines conversion settings for the CRD. +å +groupÛ"Ígroup is the API group of the defined custom resource. The custom resources are served under `/apis//...`. Must match the name of the CustomResourceDefinition (in the form `.`).² string -Ù - appProtocolÉ"»The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.² +´ +namesª +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames"Bnames specify the resource and kind names for the custom resource. +© +preserveUnknownFields"€preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. This field is deprecated in favor of setting `x-preserve-unknown-fields` to true in `spec.versions[*].schema.openAPIV3Schema`. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.² +boolean +› +scope‘"ƒscope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`.² string -Å -name¼"®The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.² +ó +versionsæ"ìversions is the list of all API versions of the defined custom resource. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² +arrayºj +h +f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersion +Ö +4io.k8s.api.admissionregistration.v1.ServiceReference";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² +objectʾ +@ +name8"+`name` is the name of the service. Required² string -³ -portªint32"”The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.² +O + namespaceB"5`namespace` is the namespace of the service. Required² +string +f +path^"Q`path` is an optional URL path which will be sent in any request to this service.² +string +À +port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² integer -º -)io.k8s.api.networking.v1.IngressClassListŒ"3IngressClassList is a collection of IngressClasses.šitems² -objectÊÖ -¹ -kind°"¢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² +¾ +/io.k8s.api.autoscaling.v2beta1.PodsMetricSourceŠ"åPodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.š +metricNameštargetAverageValue² +objectÊñ +K + +metricName="0metricName is the name of the metric in question² string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. -¾ +Ü +selectorÏ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Šselector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics. + +targetAverageValue« +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ltargetAverageValue is the target value of the average of the metric across all relevant pods (as a quantity) +Å +-io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta“"£ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.² +objectÊÞ +ä +continue×"Écontinue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.² +string +ß +remainingItemCountÈint64"²remainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and the field will be left unset and omitted during serialization. If the list is complete (either because it is not chunking or because this is the last chunk), then there are no more remaining items and this field will be left unset and omitted during serialization. Servers older than v1.15 do not set this field. The intended use of the remainingItemCount is *estimating* the size of a collection. Clients should not rely on the remainingItemCount to be set or to be exact.² +integer +¥ +resourceVersion‘"ƒString that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency² +string +ê +selfLinkÝ"ÏselfLink is a URL representing this object. Populated by the system. Read-only. -apiVersion¯"¡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² +DEPRECATED Kubernetes will stop propagating this field in 1.20 release and the field is planned to be removed in 1.21 release.² string -s -itemsj"$Items is the list of IngressClasses.² -arrayº7 -5 -3#/definitions/io.k8s.api.networking.v1.IngressClassúg -x-kubernetes-group-version-kindDB- group: networking.k8s.io - kind: IngressClassList - version: v1 +ô +io.k8s.api.core.v1.NodeØ "iNode is a worker node in Kubernetes. Each node will have a unique identifier in the cache (i.e. in etcd).² +objectÊ -Õ -5io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList›"*list of horizontal pod autoscaler objects.šitems² -objectÊé ¾ apiVersion¯"¡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² string -… -items|"*list of horizontal pod autoscaler objects.² -arrayºC -A -?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler ¹ kind°"¢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² string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úl -x-kubernetes-group-version-kindIG- group: autoscaling - kind: HorizontalPodAutoscalerList +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¿ +spec¶ +)#/definitions/io.k8s.api.core.v1.NodeSpec"ˆSpec defines the behavior of a node. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ø +statusí ++#/definitions/io.k8s.api.core.v1.NodeStatus"½Most recently observed status of the node. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúL +x-kubernetes-group-version-kind)'- group: "" + kind: Node version: v1 -Æ -,io.k8s.api.core.v1.ConfigMapNodeConfigSource•"lConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.š namespacešnameškubeletConfigKey² -objectÊò -p -nameh"[Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.² +ý +,io.k8s.api.core.v1.RBDPersistentVolumeSourceÌ "ˆRepresents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management and SELinux relabeling.šmonitorsšimage² +objectÊŸ +€ +poolx"kThe rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string - - namespacer"eNamespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.² +´ +readOnly§"˜ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +boolean +ô + secretRefæ +0#/definitions/io.k8s.api.core.v1.SecretReference"±SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it +‚ +userz"mThe rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -± -resourceVersion"ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.² +³ +fsType¨"šFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd² string -Œ -uid„"wUID is the metadata.UID of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.² +r +imagei"\The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -¹ -kubeletConfigKey¤"–KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.² +« +keyringŸ"‘Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -³ -,io.k8s.api.core.v1.TypedLocalObjectReference‚"~TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.škindšname² -objectÊå -Ú -apiGroupÍ"¿APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.² +Ž +monitors"eA collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +arrayº + ² string -B -kind:"-Kind is the type of resource being referenced² +ë +%io.k8s.api.events.v1beta1.EventSeriesÁ"qEventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.šcountšlastObservedTime² +objectʤ +n +counteint32"Pcount is the number of occurrences in this series up to the last heartbeat time.² +integer +± +lastObservedTimeœ +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"\lastObservedTime is the time when last Event from the series was seen before last heartbeat. +ù +,io.k8s.api.policy.v1.PodDisruptionBudgetSpecÈ"BPodDisruptionBudgetSpec is a description of a PodDisruptionBudget.² +objectÊõ +Ç + minAvailable¶ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ôAn eviction is allowed if at least "minAvailable" pods selected by "selector" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying "100%". +µ +selector¨ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"·Label query over pods whose evictions are managed by the disruption budget. A null selector will match no pods, while an empty ({}) selector will select all pods within the namespace.ú) +x-kubernetes-patch-strategy +replace + +ð +maxUnavailableÝ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"›An eviction is allowed if at most "maxUnavailable" pods selected by "selector" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with "minAvailable". +ê +Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresources’"YCustomResourceSubresources defines the status and scale subresources for CustomResources.² +objectʨ +é +scaleß +e#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScale"vscale indicates the custom resource should serve a `/scale` subresource that returns an `autoscaling/v1` Scale object. +¹ +status® +f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceStatus"Ãstatus indicates the custom resource should serve a `/status` subresource. When enabled: 1. requests to the custom resource primary endpoint ignore changes to the `status` stanza of the object. 2. requests to the custom resource `/status` subresource ignore changes to anything other than the `status` stanza of the object. + +Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceConditionÒ"NAPIServiceCondition describes the state of an APIService at a particular pointštypešstatus² +objectÊã +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +X +messageM"@Human-readable message indicating details about last transition.² string -B -name:"-Name is the name of resource being referenced² +^ +reasonT"GUnique, one-word, CamelCase reason for the condition's last transition.² string -Ñ -!io.k8s.api.apps.v1.ReplicaSetList« ".ReplicaSetList is a collection of ReplicaSets.šitems² -objectʉ -· -items­"oList of ReplicaSets. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller² -arrayº/ -- -+#/definitions/io.k8s.api.apps.v1.ReplicaSet +Z +statusP"CStatus is the status of the condition. Can be True, False, Unknown.² +string +7 +type/""Type is the type of the condition.² +string +Ù +io.k8s.api.batch.v1.CronJob¹ ":CronJob represents the configuration of a single cron job.² +objectÊ™ + ¹ kind°"¢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² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +ö +specí +-#/definitions/io.k8s.api.batch.v1.CronJobSpec"»Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Ë +statusÀ +/#/definitions/io.k8s.api.batch.v1.CronJobStatus"ŒCurrent status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status ¾ apiVersion¯"¡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² -stringúX -x-kubernetes-group-version-kind53- group: apps - kind: ReplicaSetList +stringúR +x-kubernetes-group-version-kind/-- group: batch + kind: CronJob version: v1 -Œ -7io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatusÐ"-current status of a horizontal pod autoscaleršcurrentReplicasšdesiredReplicas² -objectÊî -ß -currentCPUUtilizationPercentage»int32"¥current average CPU utilization over all pods, represented as a percentage of requested CPU, e.g. 70 means that an average pod is using now 70% of its requested CPU.² -integer -f -currentReplicasSint32">current number of replicas of pods managed by this autoscaler.² -integer -f -desiredReplicasSint32">desired number of replicas of pods managed by this autoscaler.² -integer -Ù - lastScaleTimeÇ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"‹last time the HorizontalPodAutoscaler scaled the number of pods; used by the autoscaler to control how often the number of pods is changed. -^ -observedGenerationHint64"3most recent generation observed by this autoscaler.² -integer -ž -.io.k8s.api.core.v1.PersistentVolumeClaimStatusë"OPersistentVolumeClaimStatus is the current status of a persistent volume claim.² -objectÊ‹ -Ò - accessModesÂ"¥AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1² -arrayº - ² +¦ ++io.k8s.api.core.v1.ContainerStateTerminatedö">ContainerStateTerminated is a terminated state of a container.šexitCode² +objectÊœ + + startedAtt +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"9Time at which previous execution of the container started +R + containerIDC"6Container's ID in the format 'docker://'² string -• -capacityˆ"9Represents the actual resources of the underlying volume.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -Ç - -conditions¸"‘Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.² -arrayºC -A -?#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimConditionú' -x-kubernetes-patch-strategymerge -ú' -x-kubernetes-patch-merge-keytype +W +exitCodeKint32"6Exit status from the last termination of the container² +integer +t -R -phaseI" -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap -ú' +conditionsŒ"xCurrent service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions² +arrayº1 +/ +-#/definitions/io.k8s.api.core.v1.PodConditionú' x-kubernetes-patch-merge-keytype ú' x-kubernetes-patch-strategymerge -E -currentHealthy3int32"current number of healthy pods² -integer -M -desiredHealthy;int32"&minimum desired number of healthy pods² -integer - - disruptedPodsû"¯DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.ª; -9 -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time² -object -` -disruptionsAllowedJint32"5Number of pod disruptions that are currently allowed.² -integer -[ - expectedPodsKint32"6total number of pods counted by this disruption budget² -integer - -/io.k8s.api.autoscaling.v2beta1.PodsMetricStatusÜ"šPodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).š -metricNamešcurrentAverageValue² -objectÊ -õ -selectorè -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"£selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics. -Å -currentAverageValue­ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ncurrentAverageValue is the current value of the average of the metric across all relevant pods (as a quantity) -K - -metricName="0metricName is the name of the metric in question² +¬ +containerStatuses–"ÒThe list has one entry per container in the manifest. Each entry is currently the output of `docker inspect`. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ContainerStatus +‰ +ephemeralContainerStatusesê"¦Status for any ephemeral containers that have run in this pod. This field is alpha-level and is only populated by servers that enable the EphemeralContainers feature.² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ContainerStatus +ü +initContainerStatusesâ"žThe list has one entry per init container in the manifest. The most recent successful init container will have ready = true, the most recently started container will have startTime set. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ContainerStatus +k +message`"SA human readable message indicating details about why the pod is in this condition.² string -õ - -io.k8s.api.batch.v1.CronJobSpecÑ -"YCronJobSpec describes how the job execution will look like and when it will actually run.šscheduleš jobTemplate² -objectÊÎ -  -suspend”"…This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.² -boolean -Ì -concurrencyPolicy¶"¨Specifies how to treat concurrent executions of a Job. Valid values are: - "Allow" (default): allows CronJobs to run concurrently; - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - "Replace": cancels currently running job and replaces it with a new one² +Í +nominatedNodeName·"©nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.² string - -failedJobsHistoryLimituint32"`The number of failed finished jobs to retain. Value must be non-negative integer. Defaults to 1.² -integer -„ - jobTemplateu -1#/definitions/io.k8s.api.batch.v1.JobTemplateSpec"@Specifies the job that will be created when executing a CronJob. -] -scheduleQ"DThe schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.² +Æ +phase¼ "® The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values: + +Pending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod. + +More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase² string -Ç -startingDeadlineSeconds«int64"•Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.² -integer -— -successfulJobsHistoryLimityint32"dThe number of successful finished jobs to retain. Value must be non-negative integer. Defaults to 3.² -integer -« -&io.k8s.api.core.v1.ConfigMapProjection€ "åAdapts a ConfigMap into a projected volume. +‡ +podIPsü"ðpodIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.² +arrayº* +( +&#/definitions/io.k8s.api.core.v1.PodIPú% +x-kubernetes-patch-merge-keyip +ú' +x-kubernetes-patch-strategymerge -The contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.² -objectʉ -ª -items "âIf unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.KeyToPath -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +ƒ +qosClassö"èThe Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://git.k8s.io/community/contributors/design-proposals/node/resource-qos.md² string -S -optionalG"9Specify whether the ConfigMap or its keys must be defined² -boolean - -3io.k8s.api.authorization.v1beta1.ResourceAttributeså"tResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface² -objectÊà -ƒ -verb{"nVerb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. "*" means all.² +v +reasonl"_A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'² string -S -versionH";Version is the API Version of the Resource. "*" means all.² +Ì +\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatusë"RCustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition² +objectʈ +ù + acceptedNamesç +i#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames"zacceptedNames are the names that are actually being used to serve discovery. They may be different than the names in spec. +ª + +conditions›"Nconditions indicate state for particular aspects of a CustomResourceDefinition² +arrayºq +o +m#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionConditionú +x-kubernetes-list-typemap +ú' +x-kubernetes-list-map-keys - type + +Ü +storedVersionsÉ"¬storedVersions lists all versions of CustomResources that were ever persisted. Tracking these versions allows a migration path for stored versions in etcd. The field is mutable so a migration controller can finish a migration to another version (ensuring no old objects are left in storage), and then remove the rest of the versions from this list. Versions may not be removed from `spec.versions` while they exist in this list.² +arrayº + ² string -M -groupD"7Group is the API Group of the Resource. "*" means all.² +´4 +3io.k8s.api.admissionregistration.v1.MutatingWebhookü3"^MutatingWebhook describes an admission webhook and the resources and operations it applies to.šnameš clientConfigš sideEffectsšadmissionReviewVersions² +objectÊÏ2 +œ +timeoutSeconds‰int32"óTimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.² +integer +– +admissionReviewVersionsú"ÝAdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.² +arrayº + ² string -‚ -namez"mName is the name of the resource being requested for a "get" or deleted for a "delete". "" (empty) means all.² +¬ + failurePolicyš"ŒFailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Fail.² string -ô - namespaceæ"ØNamespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces "" (empty) is defaulted for LocalSubjectAccessReviews "" (empty) is empty for cluster-scoped resources "" (empty) means "all" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview² +é +objectSelectorÖ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‘ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything. +é +rulesß"‡Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.² +arrayºH +F +D#/definitions/io.k8s.api.admissionregistration.v1.RuleWithOperations + +reinvocationPolicyù"ëreinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are "Never" and "IfNeeded". + +Never: the webhook will not be called more than once in a single admission evaluation. + +IfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead. + +Defaults to "Never".² string -X -resourceL"?Resource is one of the existing resource types. "*" means all.² +õ + sideEffectså"×SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.² string -^ - subresourceO"BSubresource is one of the existing resource types. "" means none.² +™ + clientConfigˆ +E#/definitions/io.k8s.api.admissionregistration.v1.WebhookClientConfig"?ClientConfig defines how to communicate with the hook. Required +œ + matchPolicyŒ"þmatchPolicy defines how the "rules" list is used to match incoming requests. Allowed values are "Exact" or "Equivalent". + +- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook. + +- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook. + +Defaults to "Equivalent"² string -ƒ -3io.k8s.api.autoscaling.v2beta2.ResourceMetricStatusË"ÝResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source.šnamešcurrent² -objectÊË -„ -currenty ->#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric -B -name:"-Name is the name of the resource in question.² +ç +nameÞ"ÐThe name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where "imagepolicy" is the name of the webhook, and kubernetes.io is the name of the organization. Required.² string -à -"io.k8s.api.core.v1.PodAntiAffinity¹ "IPod anti affinity is a group of inter pod anti affinity scheduling rules.² -objectÊß +Ý +namespaceSelectorÇ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‚ NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. -ö -/preferredDuringSchedulingIgnoredDuringExecutionÂ"öThe scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.² -arrayº< -: -8#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm -ã -.requiredDuringSchedulingIgnoredDuringExecution°"ìIf the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.PodAffinityTerm -à -!io.k8s.api.batch.v1.CronJobStatus"9CronJobStatus represents the current state of a cron job.² -objectÊÓ -¡ -active–"-A list of pointers to currently running jobs.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ObjectReferenceú# -x-kubernetes-list-type atomic +For example, to run the webhook on any objects whose namespace is not associated with "runlevel" of "0" or "1"; you will set the selector as follows: "namespaceSelector": { + "matchExpressions": [ + { + "key": "runlevel", + "operator": "NotIn", + "values": [ + "0", + "1" + ] + } + ] +} -– -lastScheduleTime -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"FInformation when was the last time the job was successfully scheduled. +If instead you want to only run the webhook on any objects whose namespace is associated with the "environment" of "prod" or "staging"; you will set the selector as follows: "namespaceSelector": { + "matchExpressions": [ + { + "key": "environment", + "operator": "In", + "values": [ + "prod", + "staging" + ] + } + ] +} + +See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors. + +Default to the empty LabelSelector, which matches everything. +· + io.k8s.api.apps.v1.DaemonSetSpec’ "3DaemonSetSpec is the specification of a daemon set.šselectorštemplate² +objectʸ + +’ +minReadySecondsþint32"èThe minimum number of seconds for which a newly created DaemonSet pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready).² +integer +¿ +revisionHistoryLimit¦int32"The number of old history to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.² +integer +Á +selector´ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ïA label query over pods that are managed by the daemon set. Must match in order to be controlled. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors +„ +template÷ +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"ÂAn object that describes the pod that will be created. The DaemonSet will create exactly one copy of this pod on every node that matches the template's node selector (or on every node if no node selector is specified). More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template “ -lastSuccessfulTime} -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"BInformation when was the last time the job successfully completed. -‰ -'io.k8s.api.core.v1.HostPathVolumeSourceÝ"vRepresents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.špath² -objectÊÏ -Å -path¼"®Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath² -string -„ -type|"oType for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath² -string -² -0io.k8s.api.core.v1.WindowsSecurityContextOptionsý"OWindowsSecurityContextOptions contain Windows-specific options and credentials.² -objectÊ -é -gmsaCredentialSpecÒ"ÄGMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.² -string -m -gmsaCredentialSpecNameS"FGMSACredentialSpecName is the name of the GMSA credential spec to use.² +updateStrategy€ +8#/definitions/io.k8s.api.apps.v1.DaemonSetUpdateStrategy"DAn update strategy to replace existing DaemonSet pods with new pods. +Ö +io.k8s.api.core.v1.VolumeDevice²"JvolumeDevice describes a mapping of a raw block device within a container.šnameš +devicePath² +objectÊà +l + +devicePath^"QdevicePath is the path inside of the container that the device will be mapped to.² string -¿ - runAsUserName­"ŸThe UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² +S +nameK">name must match the name of a persistentVolumeClaim in the pod² string - -)io.k8s.api.extensions.v1beta1.IngressListá"'IngressList is a collection of Ingress.šitems² -objectʾ +© +*io.k8s.api.scheduling.v1.PriorityClassListú"6PriorityClassList is a collection of priority classes.šitems² +objectÊÀ ¾ apiVersion¯"¡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² string -l -itemsc"Items is the list of Ingress.² -arrayº7 -5 -3#/definitions/io.k8s.api.extensions.v1beta1.Ingress +t +itemsk"$items is the list of PriorityClasses² +arrayº8 +6 +4#/definitions/io.k8s.api.scheduling.v1.PriorityClass ¹ kind°"¢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² string -Ð -metadataà -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataú` -x-kubernetes-group-version-kind=;- group: extensions - kind: IngressList - version: v1beta1 - -† - io.k8s.api.networking.v1.IPBlocká"ãIPBlock describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.šcidr² -objectÊå -v -cidrn"aCIDR is a string representing the IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64"² -string -ê -exceptß"ÂExcept is a slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64" Except values will be rejected if they are outside the CIDR range² -arrayº - ² -string -¼ -3io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy„"kRollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.² -objectʈ -… - partitionxint32"cPartition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.² -integer - -io.k8s.api.autoscaling.v1.Scalež "2Scale represents a scaling request for a resource.² -objectÊ‚ +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúh +x-kubernetes-group-version-kindEC- version: v1 + group: scheduling.k8s.io + kind: PriorityClassList -Ñ -specÈ -1#/definitions/io.k8s.api.autoscaling.v1.ScaleSpec"’defines the behavior of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. -Ú -statusÏ -3#/definitions/io.k8s.api.autoscaling.v1.ScaleStatus"—current status of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. Read-only. +¶ +*io.k8s.api.storage.v1.VolumeAttachmentList‡ "AVolumeAttachmentList is a collection of VolumeAttachment objects.šitems² +objectÊ ¾ apiVersion¯"¡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² string +v +itemsm"&Items is the list of VolumeAttachments² +arrayº8 +6 +4#/definitions/io.k8s.api.storage.v1.VolumeAttachment ¹ kind°"¢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² string -Ñ -metadataÄ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‚Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.úV -x-kubernetes-group-version-kind31- kind: Scale +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúh +x-kubernetes-group-version-kindEC- group: storage.k8s.io + kind: VolumeAttachmentList version: v1 - group: autoscaling -ð +« +Vio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionÐ "…CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format <.spec.name>.<.spec.group>. Deprecated in v1.16, planned for removal in v1.22. Use apiextensions.k8s.io/v1 CustomResourceDefinition instead.šspec² +objectʸ +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +® +spec¥ +h#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec"9spec describes how the user wants the resources to appear +º +status¯ +j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus"Astatus indicates the actual state of the CustomResourceDefinition +¾ -//.../`. Must match the name of the CustomResourceDefinition (in the form `.`). Must be all lowercase.² -string -á +Ü -shortNamesÒ"µshortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get `. It must be all lowercase.² -arrayº - ² -string -€ -singulart"gsingular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.² -string -ô +-io.k8s.api.authentication.v1beta1.TokenReviewª +"§TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.šspec² +objectÊü +¾ -categorieså"Ècategories is a list of grouped resources this custom resource belongs to (e.g. 'all'). This is published in API discovery documents, and used by clients to support invocations like `kubectl get all`.² -arrayº - ² -string -Ó -1io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"%Represents a vSphere volume resource.š -volumePath² -objectÊÚ -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² -string -x -storagePolicyIDe"XStorage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.² -string -V -storagePolicyNameA"4Storage Policy Based Management (SPBM) profile name.² +apiVersion¯"¡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² string -C - -volumePath5"(Path that identifies vSphere volume vmdk² +¹ +kind°"¢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² string -Ÿ -(io.k8s.api.core.v1.AzureDiskVolumeSourceò"TAzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.šdiskNamešdiskURI² -objectÊø K - cachingMode<"/Host Caching mode: None, Read Only, Read Write.² -string -F -diskName:"-The Name of the data disk in the blob storage² -string -A -diskURI6")The URI the data disk in the blob storage² -string -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² -string -à -kind×"ÉExpected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared² -string -x -readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -² - io.k8s.api.core.v1.NodeCondition"8NodeCondition contains condition information for a node.štypešstatus² -objectÊ´ -€ -lastHeartbeatTimek -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"0Last time we got an update on a given condition. -Œ -lastTransitionTimev -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time";Last time the condition transit from one status to another. -X -messageM"@Human readable message indicating details about last transition.² +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +ƒ +spec{ +?#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewSpec"8Spec holds information about the request being evaluated +© +statusž +A#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewStatus"YStatus is filled in by the server and indicates whether the request can be authenticated.úk +x-kubernetes-group-version-kindHF- group: authentication.k8s.io + kind: TokenReview + version: v1beta1 + +ì ++io.k8s.api.autoscaling.v2beta1.MetricStatus¼">MetricStatus describes the last-read state of a single metric.štype² +objectÊæ +ô +externalç +A#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). + +object· +?#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). +• +podsŒ +=#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricStatus"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. +™ +resourceŒ +A#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +¥ +typeœ"Žtype is the type of metric source. It will be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each corresponds to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² string -J -reason@"3(brief) reason for the condition's last transition.² +Ë +containerResourceµ +J#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus"æcontainer resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +  +%io.k8s.api.core.v1.ComponentConditionö"/Information about the condition of a component.štypešstatus² +objectʦ +s +messageh"[Message about the condition for a component. For example, information about a health check.² string -L -statusB"5Status of the condition, one of True, False, Unknown.² +z +statusp"cStatus of the condition for a component. Valid values for "Healthy": "True", "False", or "Unknown".² string -, -type$"Type of node condition.² +N +typeF"9Type of condition for a component. Valid value: "Healthy"² string -à -(io.k8s.api.core.v1.StorageOSVolumeSource³ "2Represents a StorageOS persistent volume resource.² -objectÊð -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +c +errorZ"MCondition error code for a component. For example, a health check error code.² string -x -readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -Ï - secretRefÁ -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"‡SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. -‹ +ž +(io.k8s.api.core.v1.ProjectedVolumeSourceñ"$Represents a projected volume source² +objectʼ +Î + defaultMode¾int32"¨Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +i +sources^"list of volume projections² +arrayº5 +3 +1#/definitions/io.k8s.api.core.v1.VolumeProjection + +*io.k8s.api.discovery.v1beta1.EndpointHintsà"KEndpointHints provides hints describing how an endpoint should be consumed.² +objectÊ„ + +forZonesô"ˆforZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing. May contain a maximum of 8 entries.² +arrayº6 +4 +2#/definitions/io.k8s.api.discovery.v1beta1.ForZoneú# +x-kubernetes-list-type atomic -volumeName}"pVolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.² +Ÿ +3io.k8s.api.flowcontrol.v1beta1.QueuingConfigurationç +"CQueuingConfiguration holds the configuration parameters for queuing² +objectÊ“ + +¢ +handSize•int32"ÿ`handSize` is a small positive number that configures the shuffle sharding of requests into queues. When enqueuing a request at this priority level the request's flow identifier (a string pair) is hashed and the hash value is used to shuffle the list of queues and deal a hand of the size specified here. The request is put into one of the shortest queues in that hand. `handSize` must be no larger than `queues`, and should be significantly smaller (so that a few heavy flows do not saturate most of the queues). See the user-facing documentation for more extensive guidance on setting this field. This field has a default value of 8.² +integer +“ +queueLengthLimitþint32"è`queueLengthLimit` is the maximum number of requests allowed to be waiting in a given queue of this priority level at a time; excess requests are rejected. This value must be positive. If not specified, it will be defaulted to 50.² +integer +Õ +queuesÊint32"´`queues` is the number of queues for this priority level. The queues exist independently at each apiserver. The value must be positive. Setting it to 1 effectively precludes shufflesharding and thus makes the distinguisher method of associated flow schemas irrelevant. This field has a default value of 64.² +integer +š +&io.k8s.api.storage.v1.StorageClassListï"4StorageClassList is a collection of storage classes.šitems² +objectÊ» +¹ +kind°"¢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² string -Ð -volumeNamespace¼"®VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.² +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +¾ + +apiVersion¯"¡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² string -Ë -,io.k8s.api.networking.v1beta1.IngressBackendš"DIngressBackend describes all endpoints for a given service and port.² -objectÊÅ -} - servicePortn -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"-Specifies the port of the referenced service. -ø -resourceë -:#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference"¬Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified. -I - serviceName:"-Specifies the name of the referenced service.² +o +itemsf"#Items is the list of StorageClasses² +arrayº4 +2 +0#/definitions/io.k8s.api.storage.v1.StorageClassúd +x-kubernetes-group-version-kindA?- group: storage.k8s.io + kind: StorageClassList + version: v1 + +ú +//.../`. Must match the name of the CustomResourceDefinition (in the form `.`). Must be all lowercase.² +C +name;".Name is the name of resource being referenced.² string -á - -shortNamesÒ"µshortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get `. It must be all lowercase.² +í +5io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions³"iRuntimeClassStrategyOptions define the strategy that will dictate the allowable RuntimeClasses for a pod.šallowedRuntimeClassNames² +objectÊž +º +allowedRuntimeClassNames"€allowedRuntimeClassNames is an allowlist of RuntimeClass names that may be specified on a pod. A value of "*" means that any RuntimeClass name is allowed, and must be the only item in the list. An empty list requires the RuntimeClassName field to be unset.² arrayº ² string -€ -singulart"gsingular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.² -string -ü -5io.k8s.api.autoscaling.v1.CrossVersionObjectReferenceÂ"bCrossVersionObjectReference contains enough information to let you identify the referred resource.škindšname² -objectÊÁ -l -named"WName of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names² -string -6 - -apiVersion("API version of the referent² -string -˜ -kind"Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"² -string -¦ -%io.k8s.api.core.v1.CinderVolumeSourceü"ëRepresents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.švolumeID² -objectÊô -† -volumeIDz"mvolume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +Þ +defaultRuntimeClassNameÂ"´defaultRuntimeClassName is the default RuntimeClassName to set on the pod. The default MUST be allowed by the allowedRuntimeClassNames list. A value of nil does not mutate the Pod.² string -ƒ -fsTypeø"êFilesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +¦ +Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionÐ +"”CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format <.spec.name>.<.spec.group>.šspec² +objectÊ® +¹ +kind°"¢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² string -Á -readOnly´"¥Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² -boolean -ž - secretRef -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"WOptional: points to a secret object containing parameters used to connect to OpenStack. - -+io.k8s.api.extensions.v1beta1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² -objectʈ -… - loadBalanceru -3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. -í -1io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList·"RAPIGroupList is a list of APIGroup, to allow clients to discover the API at /apis.šgroups² -objectÊô +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +© +spec  +c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec"9spec describes how the user wants the resources to appear +µ +statusª +e#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionStatus"Astatus indicates the actual state of the CustomResourceDefinition ¾ apiVersion¯"¡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² -string -u -groupsk"groups is a list of APIGroup.² -arrayº? -= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup -¹ -kind°"¢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² -stringúT -x-kubernetes-group-version-kind1/- group: "" - kind: APIGroupList +stringúr +x-kubernetes-group-version-kindOM- group: apiextensions.k8s.io + kind: CustomResourceDefinition version: v1 -– -2io.k8s.apimachinery.pkg.apis.meta.v1.Preconditionsß"ZPreconditions must be fulfilled before an operation (update, delete, etc.) is carried out.² -objectÊu -D -resourceVersion1"$Specifies the target ResourceVersion² -string -- -uid&"Specifies the target UID.² -string -© -&io.k8s.api.core.v1.LoadBalancerIngressþ"LoadBalancerIngress represents the status of a load-balancer ingress point: traffic intended for the service should be sent to an ingress point.² -objectÊÜ -{ -hostnameo"bHostname is set for load-balancer ingress points that are DNS based (typically AWS load-balancers)² -string -{ -ipu"hIP is set for load-balancer ingress points that are IP based (typically GCE or OpenStack load-balancers)² -string -ß -portsÕ"qPorts is a list of records of service ports If used, every port defined in the service should have an entry in it² -arrayº/ -- -+#/definitions/io.k8s.api.core.v1.PortStatusú# -x-kubernetes-list-type atomic +” +-io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1â"ÔFieldsV1 stores a set of fields in a data structure like a Trie, in JSON format. -• -$io.k8s.api.core.v1.LocalVolumeSourceì"LLocal represents directly-attached storage with node affinity (Beta feature)špath² -objectʈ -€ -fsTypeõ"çFilesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified.² +Each key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:', where is the name of a field in a struct, or key in a map 'v:', where is the exact json formatted value of a list item 'i:', where is position of a item in a list 'k:', where is a map of a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set. + +The exact format is defined in sigs.k8s.io/structured-merge-diff² +object +» +1io.k8s.api.authentication.v1beta1.TokenReviewSpec…"ETokenReviewSpec is a description of the token authentication request.² +objectʯ +ó + audienceså"ÈAudiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.² +arrayº + ² string -‚ -pathz"mThe full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).² +7 +token."!Token is the opaque bearer token.² string -‚ -#io.k8s.api.events.v1beta1.EventListÚ"%EventList is a list of Event objects.šitems² -objectʸ -Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +… +6io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerÊ "ÎHorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.² +objectÊú ¾ apiVersion¯"¡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² string -k -itemsb""items is a list of schema objects.² -arrayº1 -/ --#/definitions/io.k8s.api.events.v1beta1.Event ¹ kind°"¢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² -stringúa -x-kubernetes-group-version-kind><- version: v1beta1 - group: events.k8s.io - kind: EventList - -¸ -/io.k8s.api.scheduling.v1beta1.PriorityClassList„ "6PriorityClassList is a collection of priority classes.šitems² -objectÊÅ -¾ +string +à +metadataÓ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‘metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +„ +specû +H#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec"®spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. + +status… +J#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus"7status is the current information about the autoscaler.úm +x-kubernetes-group-version-kindJH- group: autoscaling + kind: HorizontalPodAutoscaler + version: v2beta2 -apiVersion¯"¡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² +È +(io.k8s.api.core.v1.ResourceFieldSelector›"ZResourceFieldSelector represents container resources (cpu, memory) and their output formatšresource² +objectÊ¥ +Y + containerNameH";Container name: required for volumes, optional for env vars² string -y -itemsp"$items is the list of PriorityClasses² -arrayº= -; -9#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass -¹ -kind°"¢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² + +divisor„ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ESpecifies the output format of the exposed resources, defaults to "1" +5 +resource)"Required: resource to select² string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúm -x-kubernetes-group-version-kindJH- kind: PriorityClassList - version: v1beta1 - group: scheduling.k8s.io - -“ -;io.k8s.api.authorization.v1beta1.SelfSubjectRulesReviewSpecT² -objectÊF -D - namespace7"*Namespace to evaluate rules for. Required.² +‚ +'io.k8s.api.core.v1.ResourceRequirementsÖ"AResourceRequirements describes the compute resource requirements.² +objectÊ„ +ö +limitsë"›Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +ˆ +requestsû"«Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +¨ +3io.k8s.api.core.v1.TopologySelectorLabelRequirementð"~A topology selector requirement is a selector that matches given label. This is an alpha feature and may change in the future.škeyšvalues² +objectÊÒ +? +key8"+The label key that the selector applies to.² +string +Ž +valuesƒ"gAn array of string values. One value must match the label to be selected. Each entry in Values is ORed.² +arrayº + ² string -è -(io.k8s.api.core.v1.EphemeralVolumeSource» "JRepresents an ephemeral volume that is handled by a normal storage driver.² -objectÊà -Ý -volumeClaimTemplateÅ ->#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimTemplate"‚Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). - -An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. - -This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. +ƒ +2io.k8s.api.extensions.v1beta1.HTTPIngressRuleValueÌ"£HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http:///? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² +objectÊ +Œ +paths‚"4A collection of paths that map requests to backends.² +arrayº? += +;#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressPath +¦ + io.k8s.api.networking.v1.Ingress "€Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.² +objectÊŽ -Required, must not be nil. -Ø -io.k8s.api.rbac.v1.Role¼"hRole is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.² -objectÊÝ ¾ apiVersion¯"¡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² @@ -40264,730 +39758,972 @@ apiVersion ¹ kind°"¢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² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. -t -rulesk"-Rules holds all the PolicyRules for this Role² -arrayº/ -- -+#/definitions/io.k8s.api.rbac.v1.PolicyRuleúc -x-kubernetes-group-version-kind@>- group: rbac.authorization.k8s.io - kind: Role +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ø +specÏ +2#/definitions/io.k8s.api.networking.v1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Þ +statusÓ +4#/definitions/io.k8s.api.networking.v1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú^ +x-kubernetes-group-version-kind;9- group: networking.k8s.io + kind: Ingress version: v1 -È -(io.k8s.api.core.v1.ResourceFieldSelector›"ZResourceFieldSelector represents container resources (cpu, memory) and their output formatšresource² -objectÊ¥ - -divisor„ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ESpecifies the output format of the exposed resources, defaults to "1" -5 -resource)"Required: resource to select² -string +Ö +&io.k8s.api.apps.v1.ReplicaSetCondition«"LReplicaSetCondition describes the state of a replica set at a certain point.štypešstatus² +objectʾ +• +lastTransitionTime +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DThe last time the condition transitioned from one status to another. Y - containerNameH";Container name: required for volumes, optional for env vars² +messageN"AA human readable message indicating details about the transition.² string -Ž -+io.k8s.api.core.v1.TopologySpreadConstraintÞ"XTopologySpreadConstraint specifies how to spread matching pods among the given topology.šmaxSkewš topologyKeyšwhenUnsatisfiable² -objectÊÉ -û - labelSelectoré -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¤LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. -Ì -maxSkewÀint32"ªMaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.² -integer -§ - topologyKey—"‰TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field.² +F +reason<"/The reason for the condition's last transition.² string -Ï -whenUnsatisfiable¹"«WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. -A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it *more* imbalanced. It's a required field.² +L +statusB"5Status of the condition, one of True, False, Unknown.² string -– -)io.k8s.api.networking.v1beta1.IngressListè"'IngressList is a collection of Ingress.šitems² -objectʾ +3 +type+"Type of replica set condition.² +string +¼ +(io.k8s.api.authorization.v1.ResourceRule"¬ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.šverbs² +objectÊÉ +¹ + resourceNames§"ŠResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. "*" means all.² +arrayº + ² +string +ä + resourcesÖ"¹Resources is a list of resources this rule applies to. "*" means all in the specified apiGroups. + "*/foo" represents the subresource 'foo' for all resources in the specified apiGroups.² +arrayº + ² +string + +verbs“"wVerb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. "*" means all.² +arrayº + ² +string +ƒ + apiGroupsõ"ØAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "*" means all.² +arrayº + ² +string +ð +8io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview³ "öSelfSubjectAccessReview checks whether or the current user can perform an action. Not filling in a spec.namespace means "in all namespaces". Self is a special case, because users should always be able to check whether they can perform an actionšspec² +objectÊ« ¾ apiVersion¯"¡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² string -l -itemsc"Items is the list of Ingress.² -arrayº7 -5 -3#/definitions/io.k8s.api.networking.v1beta1.Ingress ¹ kind°"¢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² string -Ð -metadataà -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúg -x-kubernetes-group-version-kindDB- version: v1beta1 - group: networking.k8s.io - kind: IngressList +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +¯ +spec¦ +J#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewSpec"XSpec holds information about the request being evaluated. user and groups must be empty +¬ +status¡ +H#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or notúv +x-kubernetes-group-version-kindSQ- group: authorization.k8s.io + kind: SelfSubjectAccessReview + version: v1beta1 -’ -Xio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersionµ"//...` if `served` is true.² +Ç +0io.k8s.api.core.v1.GCEPersistentDiskVolumeSource’ "ÁRepresents a Persistent Disk resource in Google Compute Engine. + +A GCE PD must exist before mounting to a container. The disk must also be in the same GCE project and zone as the kubelet. A GCE PD can only be mounted as read/write once or read-only many times. GCE PDs support ownership management and SELinux relabeling.špdName² +objectʶ +² +pdName§"™Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² string -Þ -schemaÓ -_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceValidation"pschema describes the schema used for validation, pruning, and defaulting of this version of the custom resource. -h -served^"Pserved is a flag enabling/disabling this version from being served via REST APIs² +¾ +readOnly±"¢ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² boolean -¶ -,io.k8s.api.authentication.v1.TokenReviewSpec…"ETokenReviewSpec is a description of the token authentication request.² -objectʯ -7 -token."!Token is the opaque bearer token.² +Á +fsType¶"¨Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² string -ó - audienceså"ÈAudiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.² +ù + partitionëint32"ÕThe partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk² +integer +ä +io.k8s.api.core.v1.PodDNSConfigÀ"_PodDNSConfig defines the DNS parameters of a pod in addition to those generated from DNSPolicy.² +objectÊÐ +Ä + nameservers´"—A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed.² arrayº ² string -û -)io.k8s.api.autoscaling.v2beta1.MetricSpecÍ"|MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).štype² -objectʹ - -object· -?#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricSource"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). -• -podsŒ -=#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricSource"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. -™ -resourceŒ -A#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricSource"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -£ -typeš"Œtype is the type of metric source. It should be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each mapping to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² +µ +options©"âA list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy.² +arrayº7 +5 +3#/definitions/io.k8s.api.core.v1.PodDNSConfigOption +Î +searchesÁ"¤A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed.² +arrayº + ² string -  -containerResourceŠ -J#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource"»container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag. -ô -externalç -A#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricSource"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). -û -io.k8s.api.core.v1.HandlerÜ"6Handler defines a specific action that should be taken² -objectÊ• -‘ -execˆ -+#/definitions/io.k8s.api.core.v1.ExecAction"YOne and only one of the following should be specified. Exec specifies the action to take. -k -httpGet` -.#/definitions/io.k8s.api.core.v1.HTTPGetAction".HTTPGet specifies the http request to perform. -‘ - tcpSocketƒ -0#/definitions/io.k8s.api.core.v1.TCPSocketAction"OTCPSocket specifies an action involving a TCP port. TCP hooks not yet supported - -"io.k8s.api.core.v1.SecurityContextè"ÜSecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.² -objectÊú -½ - runAsNonRoot¬"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² -boolean -ô -seLinuxOptionsá -/#/definitions/io.k8s.api.core.v1.SELinuxOptions"­The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. -ç -seccompProfileÔ -/#/definitions/io.k8s.api.core.v1.SeccompProfile" The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. -Æ - capabilitiesµ --#/definitions/io.k8s.api.core.v1.Capabilities"ƒThe capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. -Š - procMountü"îprocMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.² +ë + +0io.k8s.api.core.v1.ScaleIOPersistentVolumeSource¶ +"DScaleIOPersistentVolumeSource represents a persistent ScaleIO volumešgatewayšsystemš secretRef² +objectÊ +[ + storagePoolL"?The ScaleIO Storage Pool associated with the protection domain.² string -“ + -runAsGroup„int64"îThe GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² -integer -° - runAsUser¢int64"ŒThe UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² -integer -Ä -windowsOptions± ->#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions"îThe Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. -Õ -allowPrivilegeEscalation¸"©AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN² +volumeNames"fThe name of a volume already created in the ScaleIO system that is associated with this volume source.² +string +f +protectionDomainR"EThe name of the ScaleIO Protection Domain for the configured storage.² +string +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² boolean -¥ +` -privileged–"‡Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.² -boolean -q -readOnlyRootFilesystemW"IWhether this container has a read-only root filesystem. Default is false.² +sslEnabledR"DFlag to enable/disable SSL communication with Gateway, default false² boolean -¨ -3io.k8s.api.core.v1.TopologySelectorLabelRequirementð"~A topology selector requirement is a selector that matches given label. This is an alpha feature and may change in the future.škeyšvalues² -objectÊÒ -? -key8"+The label key that the selector applies to.² -string -Ž -valuesƒ"gAn array of string values. One value must match the label to be selected. Each entry in Values is ORed.² -arrayº - ² +’ + storageMode‚"uIndicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.² string -¥ ->io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDRâ"ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match.š -clientCIDRš serverAddress² -objectʦ -€ - -clientCIDRr"eThe CIDR with which clients can match their IP to figure out the server address that they should use.² +O +systemE"8The name of the storage system as configured in ScaleIO.² string   - serverAddressŽ"€Address of this server, suitable for a client that matches the above CIDR. This can be a hostname, hostname:port, IP or IP:port.² +fsType•"‡Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs"² string -˜ -io.k8s.api.apps.v1.DaemonSet÷ "7DaemonSet represents the configuration of a daemon set.² -objectÊÙ - -¹ -kind°"¢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² +D +gateway9",The host address of the ScaleIO API Gateway.² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ó -specÊ -.#/definitions/io.k8s.api.apps.v1.DaemonSetSpec"—The desired behavior of this daemon set. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -® -status£ -0#/definitions/io.k8s.api.apps.v1.DaemonSetStatus"îThe current status of this daemon set. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -¾ - -apiVersion¯"¡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² -stringúS -x-kubernetes-group-version-kind0.- version: v1 - group: apps - kind: DaemonSet - -þ -$io.k8s.api.batch.v1beta1.CronJobListÕ")CronJobList is a collection of cron jobs.šitems² -objectʵ Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¾ - -apiVersion¯"¡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² + secretRef½ +0#/definitions/io.k8s.api.core.v1.SecretReference"ˆSecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. +³ +,io.k8s.api.core.v1.TypedLocalObjectReference‚"~TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.škindšname² +objectÊå +Ú +apiGroupÍ"¿APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.² string -h -items_"items is the list of CronJobs.² -arrayº2 -0 -.#/definitions/io.k8s.api.batch.v1beta1.CronJob -¹ -kind°"¢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² -stringú[ -x-kubernetes-group-version-kind86- group: batch - kind: CronJobList - version: v1beta1 - -¼ -&io.k8s.api.core.v1.GitRepoVolumeSource‘"÷Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling. - -DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.š -repository² -objectÊû -‹ - directoryý"ïTarget directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.² +B +kind:"-Kind is the type of resource being referenced² string -) - -repository"Repository URL² +B +name:"-Name is the name of resource being referenced² string +Û +9io.k8s.api.admissionregistration.v1beta1.ServiceReference";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² +objectʾ @ -revision4"'Commit hash for the specified revision.² +name8"+`name` is the name of the service. Required² string -ë -)io.k8s.api.flowcontrol.v1beta1.FlowSchema½ "æFlowSchema defines the schema of a group of flows. Note that a flow is made up of a set of inbound API requests with similar attributes and is identified by a pair of strings: the name of the FlowSchema and a "flow distinguisher".² -objectÊÑ +O + namespaceB"5`namespace` is the namespace of the service. Required² +string +f +path^"Q`path` is an optional URL path which will be sent in any request to this service.² +string +À +port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² +integer +“ +%io.k8s.api.apps.v1.DeploymentStrategyé"HDeploymentStrategy describes how to replace existing pods with new ones.² +objectÊ +h +type`"SType of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.² +string +£ + rollingUpdate‘ +8#/definitions/io.k8s.api.apps.v1.RollingUpdateDeployment"URolling update config params. Present only if DeploymentStrategyType = RollingUpdate. +“ +*io.k8s.apimachinery.pkg.apis.meta.v1.Patche"XPatch is provided to give a concrete name and type to the Kubernetes PATCH request body.² +object +Ú +io.k8s.api.core.v1.NodeStatus¸"=NodeStatus is information about the current status of a node.² +objectÊê +q +imagesg"%List of container images on this node² +arrayº3 +1 +/#/definitions/io.k8s.api.core.v1.ContainerImage +¯ +nodeInfo¢ +/#/definitions/io.k8s.api.core.v1.NodeSystemInfo"oSet of ids/uuids to uniquely identify the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info +d + volumesInUseT"8List of attachable volumes in use (mounted) by the node.² +arrayº + ² +string +¥ -ä -metadata× -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"•`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -ü -specó -;#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpec"³`spec` is the specification of the desired behavior of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -ë -statusà -=#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus"ž`status` is the current status of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -¾ +conditions–"€Conditions is an array of current observed node conditions. More info: https://kubernetes.io/docs/concepts/nodes/node/#condition² +arrayº2 +0 +.#/definitions/io.k8s.api.core.v1.NodeConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge -apiVersion¯"¡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² +t +daemonEndpointsa +4#/definitions/io.k8s.api.core.v1.NodeDaemonEndpoints")Endpoints of daemons running on the Node. +â +capacityÕ"…Capacity represents the total resources of a node. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacityª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +‘ +config† +1#/definitions/io.k8s.api.core.v1.NodeConfigStatus"QStatus of the config assigned to the node via the dynamic Kubelet config feature. +Í +phaseÃ"µNodePhase is the recently observed lifecycle phase of the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#phase The field is never populated, and now is deprecated.² string -¹ -kind°"¢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² -stringúq -x-kubernetes-group-version-kindNL- group: flowcontrol.apiserver.k8s.io - kind: FlowSchema - version: v1beta1 +ƒ +volumesAttachedp".List of volumes that are attached to the node.² +arrayº3 +1 +/#/definitions/io.k8s.api.core.v1.AttachedVolume +¦ + addresses˜"„List of addresses reachable to the node. Queried from cloud provider, if available. More info: https://kubernetes.io/docs/concepts/nodes/node/#addresses Note: This field is declared as mergeable, but the merge key is not sufficiently unique, which can cause data corruption when it is merged. Callers should instead use a full-replacement patch. See http://pr.k8s.io/79391 for an example.² +arrayº0 +. +,#/definitions/io.k8s.api.core.v1.NodeAddressú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-patch-merge-keytype -Ø -3io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus  "ÝResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source.šnamešcurrentAverageValue² -objectÊ” -B -name:"-name is the name of the resource in question.² -string -× -currentAverageUtilization¹int32"£currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. It will only be present if `targetAverageValue` was set in the corresponding metric specification.² -integer -ó -currentAverageValueÛ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"›currentAverageValue is the current value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the "pods" metric source type. It will always be set, regardless of the corresponding metric specification. -û -)io.k8s.api.autoscaling.v2beta2.MetricSpecÍ"|MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).štype² -objectʹ -ô -externalç -A#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricSource"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). - -object· -?#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricSource"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). -• -podsŒ -=#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricSource"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. -™ -resourceŒ -A#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricSource"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -£ -typeš"Œtype is the type of metric source. It should be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each mapping to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² +Æ + allocatable¶"gAllocatable represents the resources of a node that are available for scheduling. Defaults to Capacity.ª? += +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² +object +º +"io.k8s.api.rbac.v1.AggregationRule“"VAggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole² +objectʬ +© +clusterRoleSelectors"¼ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added² +arrayºD +B +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +à +"io.k8s.api.core.v1.SecretReference¹"lSecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace² +objectʼ +V +nameN"AName is unique within a namespace to reference a secret resource.² string -  -containerResourceŠ -J#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource"»container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag. -â - io.k8s.api.core.v1.NamespaceList½ "&NamespaceList is a list of Namespaces.šitems² -objectʦ +b + namespaceU"HNamespace defines the space within which the secret name must be unique.² +string +¤ + +Iio.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationListÖ "KMutatingWebhookConfigurationList is a list of MutatingWebhookConfiguration.šitems² +objectÊç ¾ apiVersion¯"¡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² string -Ô -itemsÊ"ŒItems is the list of Namespace objects in the list. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.Namespace +• +items‹"%List of MutatingWebhookConfiguration.² +arrayºW +U +S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration ¹ kind°"¢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² string Ï metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúU -x-kubernetes-group-version-kind20- group: "" - kind: NamespaceList - version: v1 +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsú‡ +x-kubernetes-group-version-kinddb- version: v1beta1 + group: admissionregistration.k8s.io + kind: MutatingWebhookConfigurationList -í[ -io.k8s.api.core.v1.PodSpecÎ[""PodSpec is a description of a pod.š -containers² -objectÊŽ[ +Ø +Cio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus"AAPIServiceStatus contains derived information about an API server² +objectʾ » - hostAliases«"›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.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.HostAliasú% -x-kubernetes-patch-merge-keyip + +conditions¬"$Current service state of apiService.² +arrayºX +V +T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceConditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keytype ú' x-kubernetes-patch-strategymerge -Ï -priorityÂint32"¬The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.² +ê +%io.k8s.api.core.v1.PodSecurityContextÀ"ôPodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.² +objectʺ +È +fsGroup¼int64"¦A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: + +1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- + +If unset, the Kubelet will not modify the ownership and permissions of any volume.² integer -• -automountServiceAccountTokenu"gAutomountServiceAccountToken indicates whether a service account token should be automatically mounted.² +° +fsGroupChangePolicy˜"ŠfsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.² +string +À + runAsUser²int64"œThe UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.² +integer +… +seLinuxOptionsò +/#/definitions/io.k8s.api.core.v1.SELinuxOptions"¾The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. +Í +windowsOptionsº +>#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions"÷The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. +£ + +runAsGroup”int64"þThe GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.² +integer +º + runAsNonRoot©"šIndicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.² boolean -† -hostnamez"mSpecifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.² +~ +seccompProfilel +/#/definitions/io.k8s.api.core.v1.SeccompProfile"9The seccomp options to use by the containers in this pod. +ç +supplementalGroupsÐ"«A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.² +arrayº +int64² +integer +Ñ +sysctlsÅ"ŠSysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.² +arrayº+ +) +'#/definitions/io.k8s.api.core.v1.Sysctl +œ +$io.k8s.api.core.v1.SecretKeySelectoró",SecretKeySelector selects a key of a Secret.škey² +objectÊ° +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -„ -preemptionPolicyï"áPreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.² +O +optionalC"5Specify whether the Secret or its key must be defined² +boolean +V +keyO"BThe key of the secret to select from. Must be a valid secret key.² string -ó -securityContextß -3#/definitions/io.k8s.api.core.v1.PodSecurityContext"§SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field. -Ô -nodeNameÇ"¹NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.² +‘ +(io.k8s.api.core.v1.SessionAffinityConfigä"HSessionAffinityConfig represents the configurations of session affinity.² +objectÊ‹ +ˆ +clientIP| +/#/definitions/io.k8s.api.core.v1.ClientIPConfig"IclientIP contains the configurations of Client IP based session affinity. +  +)io.k8s.api.storage.v1.VolumeNodeResourcesò"JVolumeNodeResources is a set of resource limits for scheduling of volumes.² +objectÊ— +” +countŠint32"ôMaximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is not specified, then the supported number of volumes on this node is unbounded.² +integer +ç +3io.k8s.api.autoscaling.v2beta2.ResourceMetricSource¯"ÊResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. Only one "target" type should be set.šnameštarget² +objectÊà +B +name:"-name is the name of the resource in question.² string -œ - nodeSelector‹"íNodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ª +} +targets +9#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget"6target specifies the target value for the given metric +È +&io.k8s.api.batch.v1beta1.CronJobStatus"9CronJobStatus represents the current state of a cron job.² +objectÊÓ +“ +lastSuccessfulTime} +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"BInformation when was the last time the job successfully completed. +¡ +active–"-A list of pointers to currently running jobs.² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ObjectReferenceú# +x-kubernetes-list-type atomic + +– +lastScheduleTime +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"FInformation when was the last time the job was successfully scheduled. + +-io.k8s.api.core.v1.FlexPersistentVolumeSourceÝ"ƒFlexPersistentVolumeSource represents a generic persistent volume resource that is provisioned/attached using an exec based plugin.šdriver² +objectÊ¿ +O +driverE"8Driver is the name of the driver to use for this volume.² +string +Ä +fsType¹"«Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.² +string +O +optionsD"'Optional: Extra command options if any.ª ² string² object -” -priorityClassNameþ"ðIf specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.² -string -ô -shareProcessNamespaceÚ"ËShare a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.² -boolean -ý -terminationGracePeriodSecondsÛint64"ÅOptional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.² -integer -Æ - dnsConfig¸ --#/definitions/io.k8s.api.core.v1.PodDNSConfig"†Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. -À - hostNetwork°"¡Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.² +‚ +readOnlyv"hOptional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² boolean -“ -serviceAccount€"sDeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.² +Î + secretRefÀ +0#/definitions/io.k8s.api.core.v1.SecretReference"‹Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts. +„ +io.k8s.api.rbac.v1.RoleListä"!RoleList is a collection of Rolesšitems² +objectÊÀ +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata. +¾ + +apiVersion¯"¡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² string -û -setHostnameAsFQDNå"ÖIf true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.² -boolean -¼ +Y +itemsP"Items is a list of Roles² +arrayº) +' +%#/definitions/io.k8s.api.rbac.v1.Role +¹ +kind°"¢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² +stringúg +x-kubernetes-group-version-kindDB- group: rbac.authorization.k8s.io + kind: RoleList + version: v1 -containers­"›List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.Containerú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge + +:io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReferenceÂ"bCrossVersionObjectReference contains enough information to let you identify the referred resource.škindšname² +objectÊÁ +l +named"WName of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names² +string +6 -ÿ -ephemeralContainersç"ÌList of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature.² -arrayº7 -5 -3#/definitions/io.k8s.api.core.v1.EphemeralContainerú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +apiVersion("API version of the referent² +string +˜ +kind"Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"² +string +ƒ +io.k8s.api.core.v1.EndpointPortß"5EndpointPort is a tuple that describes a single port.šport² +objectÊ’ +b +protocolV"IThe IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.² +string +½ + appProtocol­"ŸThe application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.² +string +¬ +name£"•The name of this port. This must match the 'name' field in the corresponding ServicePort. Must be a DNS_LABEL. Optional only if one port is defined.² +string += +port5int32" The port number of the endpoint.² +integer +º -× -imagePullSecretsÂ"¥ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod² -arrayº9 -7 -5#/definitions/io.k8s.api.core.v1.LocalObjectReferenceú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +'.² string -Ð -serviceAccountName¹"«ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/² +z +imageq"dThe image the container is running. More info: https://kubernetes.io/docs/concepts/containers/images² string -ü -activeDeadlineSecondsâint64"ÌOptional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.² +¿ + restartCount®int32"˜The number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed. Note that this is calculated from dead containers. But those containers are subject to garbage collection. This value will get capped at 5 by GC.² integer -g -affinity[ -)#/definitions/io.k8s.api.core.v1.Affinity".If specified, the pod's scheduling constraints -R -hostIPCG"9Use the host's ipc namespace. Optional: Default to false.² +9 +imageID."!ImageID of the container's image.² +string +y + lastStatel +/#/definitions/io.k8s.api.core.v1.ContainerState"9Details about the container's last termination condition. +r +namej"]This must be a DNS_LABEL. Each container in a pod must have a unique name. Cannot be updated.² +string +V +readyM"?Specifies whether the container has passed its readiness probe.² boolean -R -hostPIDG"9Use the host's pid namespace. Optional: Default to false.² +° +started¤"•Specifies whether the container has passed its startup probe. Initialized as false, becomes true after startupProbe is considered successful. Resets to false when the container is restarted, or if kubelet loses state temporarily. Is always true when no startupProbe is defined.² boolean -ö - dnsPolicyè"ÚSet DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.² +l +statec +/#/definitions/io.k8s.api.core.v1.ContainerState"0Details about the container's current condition. +© +&io.k8s.api.core.v1.LoadBalancerIngressþ"LoadBalancerIngress represents the status of a load-balancer ingress point: traffic intended for the service should be sent to an ingress point.² +objectÊÜ +{ +hostnameo"bHostname is set for load-balancer ingress points that are DNS based (typically AWS load-balancers)² string -ð -overheadã"“Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -ñ -runtimeClassNameÜ"ÎRuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.² +{ +ipu"hIP is set for load-balancer ingress points that are IP based (typically GCE or OpenStack load-balancers)² string -q - tolerationsb"$If specified, the pod's tolerations.² +ß +portsÕ"qPorts is a list of records of service ports If used, every port defined in the service should have an entry in it² arrayº/ - -+#/definitions/io.k8s.api.core.v1.Toleration -þ -topologySpreadConstraintsà"ÐTopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.² -arrayº= -; -9#/definitions/io.k8s.api.core.v1.TopologySpreadConstraintúB -x-kubernetes-list-map-keys$"- topologyKey -- whenUnsatisfiable -ú -x-kubernetes-list-typemap -ú. -x-kubernetes-patch-merge-key topologyKey -ú' -x-kubernetes-patch-strategymerge ++#/definitions/io.k8s.api.core.v1.PortStatusú# +x-kubernetes-list-type atomic -¬ -volumes "†List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes² -arrayº+ -) -'#/definitions/io.k8s.api.core.v1.Volumeú' -x-kubernetes-patch-merge-keyname -ú2 -x-kubernetes-patch-strategymerge,retainKeys +‚ +*io.k8s.api.core.v1.PreferredSchedulingTermÓ"®An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).šweightš +preference² +objectÊý +‚ -Û -enableServiceLinksÄ"µEnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.² -boolean -‰ -initContainersö"äList of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.Containerú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +preferencet +1#/definitions/io.k8s.api.core.v1.NodeSelectorTerm"?A node selector term, associated with the corresponding weight. +v +weightlint32"WWeight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.² +integer +› +.io.k8s.api.storage.v1beta1.VolumeNodeResourcesè"JVolumeNodeResources is a set of resource limits for scheduling of volumes.² +objectÊ +Š +count€int32"êMaximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is nil, then the supported number of volumes on this node is unbounded.² +integer +•4 +8io.k8s.api.admissionregistration.v1beta1.MutatingWebhookØ3"^MutatingWebhook describes an admission webhook and the resources and operations it applies to.šnameš clientConfig² +objectÊÓ2 +° +admissionReviewVersions”"÷AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.² +arrayº + ² +string +ž + clientConfig +J#/definitions/io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig"?ClientConfig defines how to communicate with the hook. Required +ç +nameÞ"ÐThe name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where "imagepolicy" is the name of the webhook, and kubernetes.io is the name of the organization. Required.² +string +Ý +namespaceSelectorÇ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‚ NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. -ó -readinessGatesà"›If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md² -arrayº5 -3 -1#/definitions/io.k8s.api.core.v1.PodReadinessGate -£ - schedulerName‘"ƒIf specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.² +For example, to run the webhook on any objects whose namespace is not associated with "runlevel" of "0" or "1"; you will set the selector as follows: "namespaceSelector": { + "matchExpressions": [ + { + "key": "runlevel", + "operator": "NotIn", + "values": [ + "0", + "1" + ] + } + ] +} + +If instead you want to only run the webhook on any objects whose namespace is associated with the "environment" of "prod" or "staging"; you will set the selector as follows: "namespaceSelector": { + "matchExpressions": [ + { + "key": "environment", + "operator": "In", + "values": [ + "prod", + "staging" + ] + } + ] +} + +See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors. + +Default to the empty LabelSelector, which matches everything. +é +objectSelectorÖ +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‘ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything. + +reinvocationPolicyù"ëreinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are "Never" and "IfNeeded". + +Never: the webhook will not be called more than once in a single admission evaluation. + +IfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead. + +Defaults to "Never".² string -Î - subdomainÀ"²If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all.² +î +rulesä"‡Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.² +arrayºM +K +I#/definitions/io.k8s.api.admissionregistration.v1beta1.RuleWithOperations +œ +timeoutSeconds‰int32"óTimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.² +integer +® + failurePolicyœ"ŽFailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Ignore.² +string +— + matchPolicy‡"ùmatchPolicy defines how the "rules" list is used to match incoming requests. Allowed values are "Exact" or "Equivalent". + +- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook. + +- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook. + +Defaults to "Exact"² +string +Ø + sideEffectsÈ"ºSideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.² +string +… +6io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerÊ "ÎHorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.² +objectÊú +„ +specû +H#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec"®spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. + +status… +J#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus"7status is the current information about the autoscaler. +¾ + +apiVersion¯"¡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² string -÷ --io.k8s.api.policy.v1beta1.PodDisruptionBudgetÅ "hPodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods² -objectÊå ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta - -spec„ -?#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec"ASpecification of the desired behavior of the PodDisruptionBudget. -ˆ -status~ -A#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus"9Most recently observed status of the PodDisruptionBudget. -¾ - -apiVersion¯"¡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² -stringúd -x-kubernetes-group-version-kindA?- kind: PodDisruptionBudget - version: v1beta1 - group: policy +à +metadataÓ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"‘metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúm +x-kubernetes-group-version-kindJH- group: autoscaling + kind: HorizontalPodAutoscaler + version: v2beta1 -Û -9io.k8s.api.admissionregistration.v1beta1.ServiceReference";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² -objectʾ -À -port·int32"¡If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).² -integer -@ -name8"+`name` is the name of the service. Required² +Ó +7io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry— "sManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource that the fieldset applies to.² +objectÊ“ + +fieldsV1 +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1"QFieldsV1 holds the first JSON version format as described in the "FieldsV1" type. +W +managerL"?Manager is an identifier of the workflow managing these fields.² string -O - namespaceB"5`namespace` is the namespace of the service. Required² +² + operation¤"–Operation is the type of operation which lead to this ManagedFieldsEntry being created. The only valid values for this field are 'Apply' and 'Update'.² string -f -path^"Q`path` is an optional URL path which will be sent in any request to this service.² +¦ +time +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"bTime is timestamp of when these fields were set. It should always be empty if Operation is 'Apply' +– + +apiVersion‡"ùAPIVersion defines the version of this resource that this field set applies to. The format is "group/version" just like the top-level APIVersion field. It is necessary to track the version of a field set because it cannot be automatically converted.² string -ö -The certificate request itself and any additional information. - -statusw -M#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus"&Derived information about the request. +¡ +replicas”int32"þReplicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#what-is-a-replicationcontroller² +integer +ý +selectorð +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"«Selector is a label query over pods that should match the replica count. Label keys and values that must match in order to be controlled by this replica set. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors +“ +template† +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"ÑTemplate is the object that describes the pod that will be created if insufficient replicas are detected. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template +Ù +%io.k8s.api.core.v1.LoadBalancerStatus¯""1metricName is the name of the metric in question.² -string -Ü -selectorÏ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Šselector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics. -€ -targetv -H#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference"*target is the described Kubernetes object. -Œ - targetValue} -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity">targetValue is the target value of the metric (as a quantity). -† -3io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSourceÎ -"¡Represents a Persistent Disk resource in AWS. +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúm +x-kubernetes-group-version-kindJH- group: scheduling.k8s.io + kind: PriorityClassList + version: v1beta1 -An AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling.švolumeID² -objectÊ -Ä -fsType¹"«Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² -string -¨ - partitionšint32"„The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).² +ò +Tio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray™"–JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes. +‰ +!io.k8s.api.apps.v1.DeploymentSpecã "NDeploymentSpec is the specification of the desired behavior of the Deployment.šselectorštemplate² +objectÊî +ƒ +minReadySecondsïint32"ÙMinimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)² integer -ä -readOnly×"ÈSpecify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² +@ +paused6"(Indicates that the deployment is paused.² boolean -´ -volumeID§"™Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² -string -˜ -!io.k8s.api.core.v1.AttachedVolumeò"4AttachedVolume describes a volume attached to a nodešnameš -devicePath² -objectÊ™ -e +  +progressDeadlineSeconds„int32"îThe maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.² +integer +’ +replicas…int32"pNumber of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.² +integer +à +revisionHistoryLimitªint32"”The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.² +integer +ö +selectoré +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¤Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. +¹ +strategy¬ +3#/definitions/io.k8s.api.apps.v1.DeploymentStrategy"FThe deployment strategy to use to replace existing pods with new ones.ú, +x-kubernetes-patch-strategy  retainKeys -devicePathW"JDevicePath represents the device path where the volume should be available² -string -0 -name("Name of the attached volume² -string -ç -%io.k8s.api.authentication.v1.UserInfo½"ZUserInfo holds the information about the user needed to implement the user.Info interface.² -objectÊÒ -® -uid¦"˜A unique value that identifies this user across time. If this user is deleted and another user by the same name is added, they will have different UIDs.² -string -\ -usernameP"CThe name that uniquely identifies this user among all active users.² +q +templatee +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"1Template describes the pods that will be created. +Ÿ +io.k8s.api.core.v1.NodeSelectorû"¼A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.šnodeSelectorTerms² +objectÊ™ +– +nodeSelectorTerms€"/? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² +objectÊ +Œ +paths‚"4A collection of paths that map requests to backends.² +arrayº? += +;#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressPath + + +\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition¼ "KCustomResourceColumnDefinition specifies a column for server side printing.šnameštypešJSONPath² +objectÊÇ +ª +JSONPath"JSONPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.² string -¿ - subPathExpr¯"¡Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive.² +W + descriptionH";description is a human readable description of this column.² string -q - mountPathd"WPath within the container at which the volume should be mounted. Must not contain ':'.² +¸ +format­"Ÿformat is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² string -Õ -mountPropagationÀ"²mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.² +B +name:"-name is a human readable name for the column.² string -: -name2"%This must match the Name of a Volume.² + +priority€int32"êpriority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.² +integer +¯ +type¦"˜type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.² string -t -readOnlyh"ZMounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.² -boolean -‡ -$io.k8s.api.networking.v1.IngressListÞ"'IngressList is a collection of Ingress.šitems² -objectʹ +í +io.k8s.api.apps.v1.ReplicaSetË "YReplicaSet ensures that a specified number of pod replicas are running at any given time.² +objectÊŠ +õ +specì +/#/definitions/io.k8s.api.apps.v1.ReplicaSetSpec"¸Spec defines the specification of the desired behavior of the ReplicaSet. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +Ç +status¼ +1#/definitions/io.k8s.api.apps.v1.ReplicaSetStatus"†Status is the most recently observed status of the ReplicaSet. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status ¾ apiVersion¯"¡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² string -g -items^"Items is the list of Ingress.² -arrayº2 -0 -.#/definitions/io.k8s.api.networking.v1.Ingress ¹ kind°"¢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² string -Ð -metadataà -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúb -x-kubernetes-group-version-kind?=- group: networking.k8s.io - kind: IngressList +È +metadata» +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ùIf the Labels of a ReplicaSet are empty, they are defaulted to be the same as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúT +x-kubernetes-group-version-kind1/- group: apps + kind: ReplicaSet version: v1 -» -,io.k8s.api.policy.v1.PodDisruptionBudgetListŠ "@PodDisruptionBudgetList is a collection of PodDisruptionBudgets.šitems² -objectÊË +ó +io.k8s.api.events.v1.EventListÐ"%EventList is a list of Event objects.šitems² +objectʳ ¾ apiVersion¯"¡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² string -y -itemsp"'Items is a list of PodDisruptionBudgets² -arrayº: -8 -6#/definitions/io.k8s.api.policy.v1.PodDisruptionBudget +f +items]""items is a list of schema objects.² +arrayº, +* +(#/definitions/io.k8s.api.events.v1.Event ¹ kind°"¢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² string -Ð -metadataà -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúc -x-kubernetes-group-version-kind@>- version: v1 - group: policy - kind: PodDisruptionBudgetList - -¤, -5io.k8s.api.admissionregistration.v1.ValidatingWebhookê+"`ValidatingWebhook describes an admission webhook and the resources and operations it applies to.šnameš clientConfigš sideEffectsšadmissionReviewVersions² -objectÊ»* -– -admissionReviewVersionsú"ÝAdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.² -arrayº - ² -string -¬ - failurePolicyš"ŒFailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Fail.² -string -é -objectSelectorÖ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"‘ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything. -é -rulesß"‡Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.² -arrayºH -F -D#/definitions/io.k8s.api.admissionregistration.v1.RuleWithOperations -™ - clientConfigˆ -E#/definitions/io.k8s.api.admissionregistration.v1.WebhookClientConfig"?ClientConfig defines how to communicate with the hook. Required -œ - matchPolicyŒ"þmatchPolicy defines how the "rules" list is used to match incoming requests. Allowed values are "Exact" or "Equivalent". - -- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook. - -- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and "rules" only included `apiGroups:["apps"], apiVersions:["v1"], resources: ["deployments"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook. +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataú\ +x-kubernetes-group-version-kind97- group: events.k8s.io + kind: EventList + version: v1 -Defaults to "Equivalent"² +ª + io.k8s.api.batch.v1.JobCondition…".JobCondition describes current state of a job.štypešstatus² +objectʶ +? +type7"*Type of job condition, Complete or Failed.² string -ç -nameÞ"ÐThe name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where "imagepolicy" is the name of the webhook, and kubernetes.io is the name of the organization. Required.² +p + lastProbeTime_ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"$Last time the condition was checked. +Œ +lastTransitionTimev +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time";Last time the condition transit from one status to another. +X +messageM"@Human readable message indicating details about last transition.² string -Ü -namespaceSelectorÆ -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. - -For example, to run the webhook on any objects whose namespace is not associated with "runlevel" of "0" or "1"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "runlevel", - "operator": "NotIn", - "values": [ - "0", - "1" - ] - } - ] -} - -If instead you want to only run the webhook on any objects whose namespace is associated with the "environment" of "prod" or "staging"; you will set the selector as follows: "namespaceSelector": { - "matchExpressions": [ - { - "key": "environment", - "operator": "In", - "values": [ - "prod", - "staging" - ] - } - ] -} - -See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors. - -Default to the empty LabelSelector, which matches everything. -õ - sideEffectså"×SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.² +J +reason@"3(brief) reason for the condition's last transition.² string -œ -timeoutSeconds‰int32"óTimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.² -integer -ì -7io.k8s.api.admissionregistration.v1.WebhookClientConfig° "VWebhookClientConfig contains the information to make a TLS connection with the webhook² -objectÊÉ -Å -caBundle¸byte"¤`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² +L +statusB"5Status of the condition, one of True, False, Unknown.² string -‡ -serviceû -B#/definitions/io.k8s.api.admissionregistration.v1.ServiceReference"´`service` is a reference to the service for this webhook. Either `service` or `url` must be specified. - -If the webhook is running within the cluster, then you should use `service`. -ô -urlì"Þ`url` gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified. - -The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. - -Please note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster. - -The scheme must be "https"; the URL must begin with "https://". - -A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. - -Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² +à +io.k8s.api.discovery.v1.ForZoneŸ"LForZone provides information about which zones should consume this endpoint.šname² +objectÊ< +: +name2"%name represents the name of the zone.² string -Ó -"io.k8s.api.apps.v1.StatefulSetSpec¬"8A StatefulSetSpec is the specification of a StatefulSet.šselectorštemplateš serviceName² -objectÊ¿ - -replicas‚int32"ìreplicas is the desired number of replicas of the given Template. These are replicas in the sense that they are instantiations of the same Template, but individual replicas also have a consistent identity. If unspecified, defaults to 1.² -integer -­ -revisionHistoryLimit”int32"þrevisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.² -integer -¨ -selector› -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"Öselector is a label query over pods that should match the replica count. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors -û - serviceNameë"ÝserviceName is the name of the service that governs this StatefulSet. This service must exist before the StatefulSet, and is responsible for the network identity of the set. Pods get DNS/hostnames that follow the pattern: pod-specific-string.serviceName.default.svc.cluster.local where "pod-specific-string" is managed by the StatefulSet controller.² +Ó +*io.k8s.api.networking.v1.NetworkPolicySpec¤"?NetworkPolicySpec provides the specification of a NetworkPolicyš podSelector² +objectÊÆ +Ï +egressÄ"òList of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8² +arrayºB +@ +>#/definitions/io.k8s.api.networking.v1.NetworkPolicyEgressRule +ã +ingress×"„List of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)² +arrayºC +A +?#/definitions/io.k8s.api.networking.v1.NetworkPolicyIngressRule +Û + podSelectorË +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"†Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace. +­ + policyTypes"€List of rule types that the NetworkPolicy relates to. Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ "Egress" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include "Egress" (since such a policy would not include an Egress section and would otherwise default to just [ "Ingress" ]). This field is beta-level in 1.8² +arrayº + ² string -¬ -templateŸ -0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"êtemplate is the object that describes the pod that will be created if insufficient replicas are detected. Each pod stamped out by the StatefulSet will fulfill this Template, but have a unique identity from the rest of the StatefulSet. -å -updateStrategyÒ -:#/definitions/io.k8s.api.apps.v1.StatefulSetUpdateStrategy"“updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template. -þ -volumeClaimTemplateså"›volumeClaimTemplates is a list of claims that pods are allowed to reference. The StatefulSet controller is responsible for mapping network identities to claims in a way that maintains the identity of a pod. Every claim in this list must have at least one matching (by name) volumeMount in one container in the template. A claim in this list takes precedence over any volumes in the template, with the same name.² -arrayº: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim -¹ -podManagementPolicy¡"“podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.² +…" +Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec¦!"PCustomResourceDefinitionSpec describes how a user wants their resource to appearšgroupšnamesšscope² +objectÊ­ +Ñ +preserveUnknownFields·"¨preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. If false, schemas must be defined for all versions. Defaults to true in v1beta for backwards compatibility. Deprecated: will be required to be false in v1. Preservation of unknown fields can be specified in the validation schema using the `x-kubernetes-preserve-unknown-fields: true` extension. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.² +boolean +´ +scopeª"œscope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`. Default is `Namespaced`.² string -¾ -%io.k8s.api.extensions.v1beta1.Ingress”"‹Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc. DEPRECATED - This group version of Ingress is deprecated by networking.k8s.io/v1beta1 Ingress. See the release notes for more information.² -objectʘ - -¾ +à + subresources² +f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources"Çsubresources specify what subresources the defined custom resource has. If present, this field configures subresources for all versions. Top-level and per-version subresources are mutually exclusive. +ª -apiVersion¯"¡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² -string -¹ -kind°"¢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² +conversion› +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceConversion"3conversion defines conversion settings for the CRD. +å +groupÛ"Ígroup is the API group of the defined custom resource. The custom resources are served under `/apis//...`. Must match the name of the CustomResourceDefinition (in the form `.`).² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ý -specÔ -7#/definitions/io.k8s.api.extensions.v1beta1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -ã -statusØ -9#/definitions/io.k8s.api.extensions.v1beta1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú\ -x-kubernetes-group-version-kind97- group: extensions - kind: Ingress - version: v1beta1 +¹ +names¯ +i#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames"Bnames specify the resource and kind names for the custom resource. + +versions"‘versions is the list of all API versions of the defined custom resource. Optional if `version` is specified. The name of the first item in the `versions` list must match the `version` field if `version` and `versions` are both specified. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² +arrayºo +m +k#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersion +Å +additionalPrinterColumns¨"ªadditionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. If present, this field configures columns for all versions. Top-level and per-version columns are mutually exclusive. If no top-level or per-version columns are specified, a single column displaying the age of the custom resource is used.² +arrayºn +l +j#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition +Î -® -"io.k8s.api.rbac.v1.RoleBindingList‡"/RoleBindingList is a collection of RoleBindingsšitems² -objectÊÎ +validation¿ +d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation"Övalidation describes the schema used for validation and pruning of the custom resource. If present, this validation schema is used to validate all versions. Top-level and per-version schemas are mutually exclusive. +Ï +versionÃ"µversion is the API version of the defined custom resource. The custom resources are served under `/apis///...`. Must match the name of the first item in the `versions` list if `version` and `versions` are both specified. Optional if `versions` is specified. Deprecated: use `versions` instead.² +string +Õ +5io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList›"*list of horizontal pod autoscaler objects.šitems² +objectÊé ¾ apiVersion¯"¡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² string -g -items^"Items is a list of RoleBindings² -arrayº0 -. -,#/definitions/io.k8s.api.rbac.v1.RoleBinding +… +items|"*list of horizontal pod autoscaler objects.² +arrayºC +A +?#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler ¹ kind°"¢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² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ún -x-kubernetes-group-version-kindKI- group: rbac.authorization.k8s.io - kind: RoleBindingList +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úl +x-kubernetes-group-version-kindIG- group: autoscaling + kind: HorizontalPodAutoscalerList version: v1 -¿ -"io.k8s.api.core.v1.SecretEnvSource˜"¹SecretEnvSource selects a Secret to populate the environment variables with. - -The contents of the target Secret's Data field will represent the key-value pairs as environment variables.² -objectÊÍ -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +é +"1Group to map volume access to Default is no group² -string -‚ -readOnlyv"hReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false.² -boolean -á -registryÔ"ÆRegistry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes² -string -œ -tenant‘"ƒTenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin² -string -æ -0io.k8s.api.policy.v1beta1.SELinuxStrategyOptions±"]SELinuxStrategyOptions defines the strategy type and any options used to create the strategy.šrule² -objectʼ -a -ruleY"Lrule is the strategy that will dictate the allowable labels that may be set.² -string -Ö -seLinuxOptionsà -/#/definitions/io.k8s.api.core.v1.SELinuxOptions"seLinuxOptions required to run as; required for MustRunAs More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ -Õ& -io.k8s.api.batch.v1.JobSpecµ&"7JobSpec describes how the job execution will look like.štemplate² -objectÊâ% -¦ - parallelism–int32"€Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² -integer -” -suspendˆ"ùSuspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. This is an alpha field and requires the SuspendJob feature gate to be enabled; otherwise this field may not be set to true. Defaults to false.² -boolean -æ -activeDeadlineSecondsÌint64"¶Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.² -integer -¿ -completionMode¬"žCompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. - -`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. - -`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +– +spec +K#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec">The certificate request itself and any additional information. + +statusw +M#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus"&Derived information about the request.úw +x-kubernetes-group-version-kindTR- group: certificates.k8s.io + kind: CertificateSigningRequest + version: v1beta1 -This field is alpha-level and is only honored by servers that enable the IndexedJob feature gate. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, the controller skips updates for the Job.² -string -Ð - completionsÀint32"ªSpecifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/² -integer -Û -templateÎ -0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"™Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ -ó -ttlSecondsAfterFinished×int32"ÁttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes. This field is alpha-level and is only honored by servers that enable the TTLAfterFinished feature.² -integer -r - backoffLimitbint32"MSpecifies the number of retries before marking this job failed. Defaults to 6² -integer -¹ -manualSelector¦"—manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector² -boolean - -selector -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"ËA label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors -· - io.k8s.api.coordination.v1.Lease’ "Lease defines a lease concept.² -objectÊ‚ +þ +io.k8s.api.core.v1.Bindingß "¡Binding ties one object to another; for example, a pod is bound to a node by a scheduler. Deprecated in 1.7, please use the bindings subresource of pods instead.štarget² +objectÊÑ ¾ apiVersion¯"¡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² @@ -41617,41 +41085,57 @@ apiVersion ¹ kind°"¢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² string -µ -metadata¨ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ê -specÁ -2#/definitions/io.k8s.api.coordination.v1.LeaseSpec"ŠSpecification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú^ -x-kubernetes-group-version-kind;9- group: coordination.k8s.io - kind: Lease +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +} +targets +0#/definitions/io.k8s.api.core.v1.ObjectReference"?The target object that you want to bind to the standard object.úO +x-kubernetes-group-version-kind,*- group: "" + kind: Binding version: v1 -› - -,io.k8s.api.core.v1.PersistentVolumeClaimListê "CPersistentVolumeClaimList is a list of PersistentVolumeClaim items.šitems² -objectʪ -¹ -kind°"¢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² +¢ +'io.k8s.api.core.v1.EmptyDirVolumeSourceö"uRepresents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.² +objectÊð +… +mediumú"ìWhat type of storage medium should back this directory. The default is "" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds -¾ - -apiVersion¯"¡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² +å + sizeLimit× +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"—Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir +à +0io.k8s.api.core.v1.PersistentVolumeClaimTemplateŽ"sPersistentVolumeClaimTemplate is used to produce PersistentVolumeClaim objects as part of an EphemeralVolumeSource.šspec² +objectʃ +è +metadataÛ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"™May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. +• +specŒ +:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimSpec"ÍThe specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. +õ +0io.k8s.api.core.v1.ServiceAccountTokenProjectionÀ"ìServiceAccountTokenProjection represents a projected service account token volume. This projection can be used to insert a service account token into the pods runtime filesystem for use against APIs (Kubernetes API Server or otherwise).špath² +objectÊ» +’ +audience…"÷Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver.² string -Ø -itemsÎ"„A list of persistent volume claims. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims² -arrayº: -8 -6#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimúa -x-kubernetes-group-version-kind><- group: "" - kind: PersistentVolumeClaimList - version: v1 - -± -3io.k8s.api.autoscaling.v2beta2.ExternalMetricSourceù"ÐExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster).šmetricštarget² +¹ +expirationSeconds£int64"ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes.² +integer +h +path`"SPath is the path relative to the mount point of the file to project the token into.² +string +× +3io.k8s.api.autoscaling.v2beta2.ExternalMetricStatusŸ"nExternalMetricStatus indicates the current value of a global metric not associated with any Kubernetes object.šmetricšcurrent² +objectÊ +„ +currenty +>#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric +ƒ +metricy +=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector + +/io.k8s.api.autoscaling.v2beta2.PodsMetricSourceŽ"åPodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.šmetricštarget² objectÊ… ƒ metricy @@ -41659,119 +41143,230 @@ apiVersion } targets 9#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget"6target specifies the target value for the given metric -Å --io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta“"£ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.² -objectÊÞ -ê -selfLinkÝ"ÏselfLink is a URL representing this object. Populated by the system. Read-only. +¢9 +io.k8s.api.core.v1.Volume„9"[Volume represents a named volume in a pod that may be accessed by any container in the pod.šname² +objectÊ‘8 + +quobyteƒ +4#/definitions/io.k8s.api.core.v1.QuobyteVolumeSource"KQuobyte represents a Quobyte mount on the host that shares a pod's lifetime +Ÿ + azureFile‘ +6#/definitions/io.k8s.api.core.v1.AzureFileVolumeSource"WAzureFile represents an Azure File Service mount on the host and bind mount to the pod. +Ð +cinderÅ +3#/definitions/io.k8s.api.core.v1.CinderVolumeSource"Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md +ˆ + configMap{ +6#/definitions/io.k8s.api.core.v1.ConfigMapVolumeSource"AConfigMap represents a configMap that should populate this volume +Ä +nfs¼ +0#/definitions/io.k8s.api.core.v1.NFSVolumeSource"‡NFS represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs +Î +photonPersistentDiskµ +A#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource"pPhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine +» + ephemeral­ +6#/definitions/io.k8s.api.core.v1.EphemeralVolumeSource"òEphemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. -DEPRECATED Kubernetes will stop propagating this field in 1.20 release and the field is planned to be removed in 1.21 release.² -string -ä -continue×"Écontinue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.² -string -ß -remainingItemCountÈint64"²remainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and the field will be left unset and omitted during serialization. If the list is complete (either because it is not chunking or because this is the last chunk), then there are no more remaining items and this field will be left unset and omitted during serialization. Servers older than v1.15 do not set this field. The intended use of the remainingItemCount is *estimating* the size of a collection. Clients should not rely on the remainingItemCount to be set or to be exact.² -integer -¥ -resourceVersion‘"ƒString that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency² -string -‡ -3io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReferenceÏ"ÇOwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field.š -apiVersionškindšnamešuid² -objectÊÕ -— -kindŽ"€Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² -string -l -named"WName of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names² -string -i -uidb"UUID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids² -string -7 +Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity + tracking are needed, +c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through + a PersistentVolumeClaim (see EphemeralVolumeSource for more + information on the connection between this volume type + and PersistentVolumeClaim). -apiVersion)"API version of the referent.² -string -Î -blockOwnerDeletion·"¨If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.² -boolean -V +Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. -controllerH":If true, this reference points to the managing controller.² -boolean -Ÿ -$io.k8s.api.node.v1beta1.RuntimeClassö"ØRuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are (currently) manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://git.k8s.io/enhancements/keps/sig-node/runtime-class.mdšhandler² -objectÊ -› +Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. -schedulingŒ -0#/definitions/io.k8s.api.node.v1beta1.Scheduling"×Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes. -¾ +A pod can use both types of ephemeral volumes and persistent volumes at the same time. -apiVersion¯"¡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² -string -Ð -handlerÄ"¶Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called "runc" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.² -string -¹ -kind°"¢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² +This is a beta feature and only available when the GenericEphemeralVolume feature gate is enabled. +Ø + glusterfsÊ +6#/definitions/io.k8s.api.core.v1.GlusterfsVolumeSource"Glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md +É +rbdÁ +0#/definitions/io.k8s.api.core.v1.RBDVolumeSource"ŒRBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md +œ + azureDiskŽ +6#/definitions/io.k8s.api.core.v1.AzureDiskVolumeSource"TAzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. +ž + downwardAPIŽ +8#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeSource"RDownwardAPI represents downward API about the pod that should populate this volume +É +gitRepo½ +4#/definitions/io.k8s.api.core.v1.GitRepoVolumeSource"„GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container. +œ +scaleIO +4#/definitions/io.k8s.api.core.v1.ScaleIOVolumeSource"XScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. +” +hostPath‡ +5#/definitions/io.k8s.api.core.v1.HostPathVolumeSource"ÍHostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath +® +name¥"—Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -µ -metadata¨ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -ô -overheadç -.#/definitions/io.k8s.api.node.v1beta1.Overhead"´Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature.úb -x-kubernetes-group-version-kind?=- group: node.k8s.io - kind: RuntimeClass - version: v1beta1 +¬ +persistentVolumeClaim’ +B#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource"ËPersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims +¤ +gcePersistentDiskŽ +>#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource"ËGCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk +í +iscsiã +2#/definitions/io.k8s.api.core.v1.ISCSIVolumeSource"¬ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md +Å +secretº +3#/definitions/io.k8s.api.core.v1.SecretVolumeSource"‚Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret +¬ -Ä -"io.k8s.api.storage.v1.StorageClass"ãStorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned. +flexVolume +1#/definitions/io.k8s.api.core.v1.FlexVolumeSource"hFlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. +± +awsElasticBlockStore˜ +A#/definitions/io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource"ÒAWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore +º +csi² +0#/definitions/io.k8s.api.core.v1.CSIVolumeSource"~CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). +‹ + projected~ +6#/definitions/io.k8s.api.core.v1.ProjectedVolumeSource"DItems for all in one resources secrets, configmaps, and downward API +¬ + vsphereVolumeš +?#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"WVsphereVolume represents a vSphere volume attached and mounted on kubelets host machine +™ + storageos‹ +6#/definitions/io.k8s.api.core.v1.StorageOSVolumeSource"QStorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. +Œ +cephfs +3#/definitions/io.k8s.api.core.v1.CephFSVolumeSource"JCephFS represents a Ceph FS mount on the host that shares a pod's lifetime +Ö +emptyDirÉ +5#/definitions/io.k8s.api.core.v1.EmptyDirVolumeSource"EmptyDir represents a temporary directory that shares a pod's lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir +ª +fc£ +/#/definitions/io.k8s.api.core.v1.FCVolumeSource"pFC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. +È +flocker¼ +4#/definitions/io.k8s.api.core.v1.FlockerVolumeSource"ƒFlocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running +¥ +portworxVolume’ +5#/definitions/io.k8s.api.core.v1.PortworxVolumeSource"YPortworxVolume represents a portworx volume attached and mounted on kubelets host machine +ó +"io.k8s.api.apps.v1.DaemonSetStatusÌ">DaemonSetStatus represents the current status of a daemon set.šcurrentNumberScheduledšnumberMisscheduledšdesiredNumberScheduledš numberReady² +objectʨ +˜ + numberReadyˆint32"sThe number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.² +integer +Å +numberUnavailable¯int32"™The number of nodes that should be running the daemon pod and have none of the daemon pod running and available (ready for at least spec.minReadySeconds)² +integer +õ -StorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.š provisioner² -objectÊ· +conditionsæ"LRepresents the latest available observations of a DaemonSet's current state.² +arrayº7 +5 +3#/definitions/io.k8s.api.apps.v1.DaemonSetConditionú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge + +ã +currentNumberScheduledÈint32"²The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² +integer +Ê +numberAvailable¶int32" The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available (ready for at least spec.minReadySeconds)² +integer +Ý +numberMisscheduledÆint32"°The number of nodes that are running the daemon pod, but are not supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² +integer +ä +collisionCountÑint32"»Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.² +integer +ô +desiredNumberScheduledÙint32"ÃThe total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/² +integer +l +observedGenerationVint64"AThe most recent generation observed by the daemon set controller.² +integer +l +updatedNumberScheduledRint32"=The total number of nodes that are running updated daemon pod² +integer +Ç +#io.k8s.api.autoscaling.v1.ScaleSpecŸ":ScaleSpec describes the attributes of a scale subresource.² +objectÊU +S +replicasGint32"2desired number of instances for the scaled object.² +integer +ê + +(io.k8s.api.policy.v1.PodDisruptionBudget½ +"hPodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods² +objectÊâ +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +‡ +spec +:#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetSpec"ASpecification of the desired behavior of the PodDisruptionBudget. +ƒ +statusy +<#/definitions/io.k8s.api.policy.v1.PodDisruptionBudgetStatus"9Most recently observed status of the PodDisruptionBudget. ¾ apiVersion¯"¡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² string ¹ kind°"¢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² +stringú_ +x-kubernetes-group-version-kind<:- kind: PodDisruptionBudget + version: v1 + group: policy + +¯ +*io.k8s.api.apps.v1.RollingUpdateDeployment€ "7Spec to control the desired behavior of rolling update.² +objectʸ +å +maxSurgeØ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"–The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods. +Í +maxUnavailableº +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"øThe maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods. +ø +3io.k8s.api.autoscaling.v2beta1.ResourceMetricSourceÀ"ÊResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. Only one "target" type should be set.šname² +objectÊÝ +B +name:"-name is the name of the resource in question.² string -ì - mountOptionsÛ"¾Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. ["ro", "soft"]. Not validated - mount of the PVs will simply fail if one is invalid.² -arrayº - ² -string -N - provisioner?"2Provisioner indicates the type of the provisioner.² -string -ø -volumeBindingModeâ"ÔVolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.² -string -n -allowVolumeExpansionV"HAllowVolumeExpansion shows whether the storage class allow volume expand² -boolean -Š -allowedTopologiesô"«Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.² -arrayº9 -7 -5#/definitions/io.k8s.api.core.v1.TopologySelectorTerm -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -‘ +ð +targetAverageUtilizationÓint32"½targetAverageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.² +integer +£ +targetAverageValueŒ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"ÌtargetAverageValue is the target value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the "pods" metric source type. +´ +io.k8s.api.rbac.v1.RoleBinding‘ "·RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.šroleRef² +objectÊÑ +à +roleRefÔ +(#/definitions/io.k8s.api.rbac.v1.RoleRef"§RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. +„ +subjectsx"=Subjects holds references to the objects the role applies to.² +arrayº, +* +(#/definitions/io.k8s.api.rbac.v1.Subject +¾ -parameters‚"eParameters holds the parameters for the provisioner that should create volumes of this storage class.ª - ² -string² -object -— - reclaimPolicy…"xDynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.² -stringú` -x-kubernetes-group-version-kind=;- group: storage.k8s.io - kind: StorageClass +apiVersion¯"¡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² +string +¹ +kind°"¢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² +string +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata.új +x-kubernetes-group-version-kindGE- group: rbac.authorization.k8s.io + kind: RoleBinding version: v1 ° @@ -41797,274 +41392,468 @@ U#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigu kind: ValidatingWebhookConfigurationList version: v1beta1 -ˆ -%io.k8s.api.apps.v1.ControllerRevisionÞ"±ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.šrevision² -objectʱ -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -b -revisionVint64"ARevision indicates the revision of the state represented by Data.² -integer +„ +:io.k8s.api.certificates.v1.CertificateSigningRequestStatusÅ"ŽCertificateSigningRequestStatus contains conditions used to indicate approved/denied/failed status of the request, and the issued certificate.² +objectÊ¥ +Š + certificateú +byte"À +certificate is populated with an issued certificate by the signer after an Approved condition is present. This field is set via the /status subresource. Once populated, this field is immutable. + +If the certificate signing request is denied, a condition of type "Denied" is added and this field remains empty. If the signer cannot issue the certificate, a condition of type "Failed" is added and this field remains empty. + +Validation requirements: + 1. certificate must contain one or more PEM blocks. + 2. All PEM blocks must have the "CERTIFICATE" label, contain no headers, and the encoded data + must be a BER-encoded ASN.1 Certificate structure as described in section 4 of RFC5280. + 3. Non-PEM content may appear before or after the "CERTIFICATE" PEM blocks and is unvalidated, + to allow for explanatory text as described in section 5.2 of RFC7468. + +If more than one PEM block is present, and the definition of the requested spec.signerName does not indicate otherwise, the first block is the issued certificate, and subsequent blocks should be treated as intermediate certificates and presented in TLS handshakes. + +The certificate is encoded in PEM format. + +When serialized as JSON or YAML, the data is additionally base64-encoded, so it consists of: + + base64( + -----BEGIN CERTIFICATE----- + ... + -----END CERTIFICATE----- + )² +stringú# +x-kubernetes-list-type atomic + +• + +conditions†"[conditions applied to the request. Known conditions are "Approved", "Denied", and "Failed".² +arrayºO +M +K#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestConditionú' +x-kubernetes-list-map-keys - type +ú +x-kubernetes-list-typemap + + ++io.k8s.api.networking.v1beta1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² +objectʈ +… + loadBalanceru +3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. +š +(io.k8s.api.storage.v1beta1.CSIDriverListí"3CSIDriverList is a collection of CSIDriver objects.šitems² +objectʸ ¾ apiVersion¯"¡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² string -y -dataq -:#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension"3Data is the serialized representation of the state. +l +itemsc"items is the list of CSIDriver² +arrayº6 +4 +2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver ¹ kind°"¢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² -stringú\ -x-kubernetes-group-version-kind97- group: apps - kind: ControllerRevision - version: v1 +string +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúf +x-kubernetes-group-version-kindCA- version: v1beta1 + group: storage.k8s.io + kind: CSIDriverList -ð -8io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview³ "öSelfSubjectAccessReview checks whether or the current user can perform an action. Not filling in a spec.namespace means "in all namespaces". Self is a special case, because users should always be able to check whether they can perform an actionšspec² -objectÊ« -¾ +ö -apiVersion¯"¡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² +Vio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames› +"XCustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinitionšpluralškind² +objectÊ¢ +q +listKinde"XlistKind is the serialized kind of the list for this resource. Defaults to "`kind`List".² string -¹ -kind°"¢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² + +plural‚"ôplural is the plural name of the resource to serve. The custom resources are served under `/apis///.../`. Must match the name of the CustomResourceDefinition (in the form `.`). Must be all lowercase.² +string +á + +shortNamesÒ"µshortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get `. It must be all lowercase.² +arrayº + ² +string +€ +singulart"gsingular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.² +string +ô + +categorieså"Ècategories is a list of grouped resources this custom resource belongs to (e.g. 'all'). This is published in API discovery documents, and used by clients to support invocations like `kubectl get all`.² +arrayº + ² +string +¾ +kindµ"§kind is the serialized kind of the resource. It is normally CamelCase and singular. Custom resource instances will use this value as the `kind` attribute in API calls.² +string +Ù +.io.k8s.apimachinery.pkg.apis.meta.v1.Condition¦ "TCondition contains details for one aspect of the current state of this API Resource.štypešstatusšlastTransitionTimešreasonšmessage² +objectʉ + +L +statusB"5status of the condition, one of True, False, Unknown.² +string +T +typeL"?type of condition in CamelCase or in foo.example.com/CamelCase.² +string +¸ +lastTransitionTime¡ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ålastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + +messagev"imessage is a human readable message indicating details about the transition. This may be an empty string.² +string +È +observedGeneration±int64"›observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.² +integer +Ø +reasonÍ"¿reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.² +string + +/io.k8s.apimachinery.pkg.util.intstr.IntOrStringŽ int-or-string"ñIntOrString is a type that can hold an int32 or a string. When used in JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number.² string +ž +io.k8s.api.apps.v1.StatefulSetû +"ŸStatefulSet represents a set of pods with consistent identities. Identities are defined as: + - Network: A single stable DNS and hostname. + - Storage: As many VolumeClaims as requested. +The StatefulSet guarantees that a given network identity will always map to the same storage identity.² +objectÊò K metadata? =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +t +specl +0#/definitions/io.k8s.api.apps.v1.StatefulSetSpec"8Spec defines the desired identities of pods in this set. ¯ -spec¦ -J#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewSpec"XSpec holds information about the request being evaluated. user and groups must be empty -¬ -status¡ -H#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or notúv -x-kubernetes-group-version-kindSQ- group: authorization.k8s.io - kind: SelfSubjectAccessReview - version: v1beta1 - -Ù -&io.k8s.api.storage.v1beta1.CSINodeSpec®"\CSINodeSpec holds information about the specification of all CSI drivers installed on a nodešdrivers² -objectÊ· -´ -drivers¨"Šdrivers is a list of information of all CSI Drivers existing on a node. If all drivers in the list are uninstalled, this can become empty.² -arrayº: -8 -6#/definitions/io.k8s.api.storage.v1beta1.CSINodeDriverú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge - -© -+io.k8s.api.storage.v1beta1.StorageClassListù"4StorageClassList is a collection of storage classes.šitems² -objectÊÀ +status¤ +2#/definitions/io.k8s.api.apps.v1.StatefulSetStatus"nStatus is the current status of Pods in this StatefulSet. This data may be out of date by some window of time. ¾ apiVersion¯"¡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² string -t -itemsk"#Items is the list of StorageClasses² -arrayº9 -7 -5#/definitions/io.k8s.api.storage.v1beta1.StorageClass ¹ kind°"¢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² -string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúi -x-kubernetes-group-version-kindFD- version: v1beta1 - group: storage.k8s.io - kind: StorageClassList +stringúU +x-kubernetes-group-version-kind20- group: apps + kind: StatefulSet + version: v1 -å -2io.k8s.api.core.v1.StorageOSPersistentVolumeSource® "2Represents a StorageOS persistent volume resource.² -objectÊë -Ð -volumeNamespace¼"®VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.² -string -À -fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +¿ +"io.k8s.api.core.v1.SecretEnvSource˜"¹SecretEnvSource selects a Secret to populate the environment variables with. + +The contents of the target Secret's Data field will represent the key-value pairs as environment variables.² +objectÊÍ +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -x -readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +D +optional8"*Specify whether the Secret must be defined² boolean -Ê - secretRef¼ -0#/definitions/io.k8s.api.core.v1.ObjectReference"‡SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. -‹ - -volumeName}"pVolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.² +ë +io.k8s.api.core.v1.EventSourceÈ".EventSource contains information for an event.² +objectʉ +F + component9",Component from which the event is generated.² string -Ý -)io.k8s.api.extensions.v1beta1.IngressRule¯ "ìIngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.² -objectʱ -J -httpB -@#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue -â +? +host7"*Node name on which the event is generated.² +string +‹ +&io.k8s.api.flowcontrol.v1beta1.Subjectà"´Subject matches the originator of a request, as identified by the request authentication system. There are three ways of matching an originator; by user, group, or service account.škind² +objectÊ +D +group; +9#/definitions/io.k8s.api.flowcontrol.v1beta1.GroupSubject + +kind"Required² +string +V +serviceAccountD +B#/definitions/io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubject +B +user: +8#/definitions/io.k8s.api.flowcontrol.v1beta1.UserSubjectúŽ +x-kubernetes-unionswu- fields-to-discriminateBy: + group: Group + serviceAccount: ServiceAccount + user: User + discriminator: kind -hostÙ -"Ë -Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the "host" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to - the IP in the Spec of the parent Ingress. -2. The `:` delimiter is not respected because ports are not allowed. - Currently the port of an Ingress is implicitly :80 for http and - :443 for https. -Both these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue. +Ž -Host can be "precise" which is a domain name without the terminating dot of a network host (e.g. "foo.bar.com") or "wildcard", which is a domain name prefixed with a single wildcard label (e.g. "*.foo.com"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "*"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.² +io.k8s.api.core.v1.NodeSpecî ">NodeSpec describes the attributes that a node is created with.² +objectÊŸ +Ï + unschedulable½"®Unschedulable controls node schedulability of new pods. By default, node is schedulable. More info: https://kubernetes.io/docs/concepts/nodes/node/#manual-node-administration² +boolean +Ö + configSourceÅ +1#/definitions/io.k8s.api.core.v1.NodeConfigSource"If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field +† + +externalIDx"kDeprecated. Not all kubelets will set this field. Remove field after 1.13. see: https://issues.k8s.io/61966² string -Ü -*io.k8s.api.policy.v1beta1.AllowedCSIDriver­"RAllowedCSIDriver represents a single inline CSI Driver that is allowed to be used.šname² -objectÊD -B -name:"-Name is the registered name of the CSI driver² +Q +podCIDRF"9PodCIDR represents the pod IP range assigned to the node.² string -¥ -%io.k8s.api.core.v1.SecretVolumeSourceû "íAdapts a Secret into a volume. +¬ +podCIDRsŸ"ØpodCIDRs represents the IP ranges assigned to the node for usage by Pods on that node. If this field is specified, the 0th entry must match the podCIDR field. It may contain at most 1 value for each of IPv4 and IPv6.² +arrayº + ² +stringú' +x-kubernetes-patch-strategymerge -The contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.² -objectÊü -ê - defaultModeÚint32"ÄOptional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² -integer -¤ -itemsš"ÜIf unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.KeyToPath -P -optionalD"6Specify whether the Secret or its keys must be defined² -boolean -“ + -secretName„"wName of the secret in the pod's namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret² +providerIDs"fID of the node assigned by the cloud provider in the format: ://² string -ê -Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresources’"YCustomResourceSubresources defines the status and scale subresources for CustomResources.² -objectʨ -é -scaleß -e#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScale"vscale indicates the custom resource should serve a `/scale` subresource that returns an `autoscaling/v1` Scale object. -¹ -status® -f#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceStatus"Ãstatus indicates the custom resource should serve a `/status` subresource. When enabled: 1. requests to the custom resource primary endpoint ignore changes to the `status` stanza of the object. 2. requests to the custom resource `/status` subresource ignore changes to anything other than the `status` stanza of the object. -Ø -Cio.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus"AAPIServiceStatus contains derived information about an API server² -objectʾ -» +c +taintsY" If specified, the node's taints.² +arrayº* +( +&#/definitions/io.k8s.api.core.v1.Taint +ó +'io.k8s.api.core.v1.TopologySelectorTermÇ"‘A topology selector term represents the result of label queries. A null or empty topology selector term matches no objects. The requirements of them are ANDed. It provides a subset of functionality as NodeSelectorTerm. This is an alpha feature and may change in the future.² +objectʤ +¡ +matchLabelExpressions‡"3A list of topology selector requirements by labels.² +arrayºE +C +A#/definitions/io.k8s.api.core.v1.TopologySelectorLabelRequirement +ð +6io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjectsµ "•PolicyRulesWithSubjects prescribes a test that applies to a request to an apiserver. The test considers the subject making the request, the verb being requested, and the resource to be acted upon. This PolicyRulesWithSubjects matches a request if and only if both (a) at least one member of subjects matches the request and (b) at least one member of resourceRules or nonResourceRules matches the request.šsubjects² +objectʃ +Ù + resourceRulesÇ"Î`resourceRules` is a slice of ResourcePolicyRules that identify matching requests according to their verb and the target resource. At least one of `resourceRules` and `nonResourceRules` has to be non-empty.² +arrayºC +A +?#/definitions/io.k8s.api.flowcontrol.v1beta1.ResourcePolicyRuleú# +x-kubernetes-list-type atomic -conditions¬"$Current service state of apiService.² -arrayºX -V -T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceConditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap -ú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge + +subjectsô"†subjects is the list of normal user, serviceaccount, or group that this rule cares about. There must be at least one member in this slice. A slice that includes both the system:authenticated and system:unauthenticated user groups matches every request. Required.² +arrayº8 +6 +4#/definitions/io.k8s.api.flowcontrol.v1beta1.Subjectú# +x-kubernetes-list-type atomic -ª -9io.k8s.api.authorization.v1beta1.LocalSubjectAccessReviewì "çLocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.šspec² -objectÊò +  +nonResourceRules‹"`nonResourceRules` is a list of NonResourcePolicyRules that identify matching requests according to their verb and the target non-resource URL.² +arrayºF +D +B#/definitions/io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRuleú# +x-kubernetes-list-type atomic + +· +/io.k8s.api.policy.v1beta1.PodSecurityPolicyListƒ "=PodSecurityPolicyList is a list of PodSecurityPolicy objects.šitems² +objectÊÄ ¾ apiVersion¯"¡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² string +w +itemsn""items is a list of schema objects.² +arrayº= +; +9#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -ö -specí -F#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec"¢Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted. -¬ -status¡ -H#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or notúw -x-kubernetes-group-version-kindTR- group: authorization.k8s.io - kind: LocalSubjectAccessReview - version: v1beta1 +Ë +metadata¾ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúf +x-kubernetes-group-version-kindCA- version: v1beta1 + group: policy + kind: PodSecurityPolicyList -ª - io.k8s.api.batch.v1.JobCondition…".JobCondition describes current state of a job.štypešstatus² -objectʶ -Œ -lastTransitionTimev -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time";Last time the condition transit from one status to another. -X -messageM"@Human readable message indicating details about last transition.² +å. +/io.k8s.api.policy.v1beta1.PodSecurityPolicySpec±."2PodSecurityPolicySpec defines the policy enforced.šseLinuxš runAsUseršsupplementalGroupsšfsGroup² +objectʹ- +¤ +allowPrivilegeEscalation‡"yallowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.² +boolean +· +allowedFlexVolumes "ÓallowedFlexVolumes is an allowlist of Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the "volumes" field.² +arrayº= +; +9#/definitions/io.k8s.api.policy.v1beta1.AllowedFlexVolume +¿ +allowedHostPathsª"`allowedHostPaths is an allowlist of host paths. Empty indicates that all host paths may be used.² +arrayº; +9 +7#/definitions/io.k8s.api.policy.v1beta1.AllowedHostPath +’ +defaultAddCapabilities÷"ÚdefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the allowedCapabilities list.² +arrayº + ² string -J -reason@"3(brief) reason for the condition's last transition.² +· +defaultAllowPrivilegeEscalation“"„defaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.² +boolean + +forbiddenSysctlsø"ÛforbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in "*" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. + +Examples: e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. e.g. "foo.*" forbids "foo.bar", "foo.baz", etc.² +arrayº + ² string -L -statusB"5Status of the condition, one of True, False, Unknown.² +p + hostNetworka"ShostNetwork determines if the policy allows the use of HostNetwork in the pod spec.² +boolean +_ + +privilegedQ"Cprivileged determines if a pod can request to be run as privileged.² +boolean +ö +readOnlyRootFilesystemÛ"ÌreadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.² +boolean +Í + runtimeClass¼ +C#/definitions/io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions"ôruntimeClass is the strategy that will dictate the allowable RuntimeClasses for a pod. If this field is omitted, the pod's runtimeClassName field is unrestricted. Enforcement of this field depends on the RuntimeClass feature gate being enabled. +¥ +volumes™"}volumes is an allowlist of volume plugins. Empty indicates that no volumes may be used. To allow all volumes you may use '*'.² +arrayº + ² string -? -type7"*Type of job condition, Complete or Failed.² +² +allowedCapabilitiesš"ýallowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both allowedCapabilities and requiredDropCapabilities.² +arrayº + ² string -p - lastProbeTime_ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"$Last time the condition was checked. -ö6 -%io.k8s.api.core.v1.EphemeralContainerÌ6"ƒAn EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag.šname² -objectÊ°1 -ß -env×"IList of environment variables to set in the container. Cannot be updated.² -arrayº+ -) -'#/definitions/io.k8s.api.core.v1.EnvVarú' -x-kubernetes-patch-merge-keyname -ú' -x-kubernetes-patch-strategymerge +î +allowedUnsafeSysctlsÕ"¸allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in "*" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to allowlist all allowed unsafe sysctls explicitly to avoid rejection. -© -name "’Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers.² +Examples: e.g. "foo/*" allows "foo/bar", "foo/baz", etc. e.g. "foo.*" allows "foo.bar", "foo.baz", etc.² +arrayº + ² +string +¥ +fsGroup™ +>#/definitions/io.k8s.api.policy.v1beta1.FSGroupStrategyOptions"WfsGroup is the strategy that will dictate what fs group is used by the SecurityContext. +d +hostPIDY"KhostPID determines if the policy allows the use of HostPID in the pod spec.² +boolean +œ + hostPortsŽ"FhostPorts determines which host port ranges are allowed to be exposed.² +arrayº9 +7 +5#/definitions/io.k8s.api.policy.v1beta1.HostPortRange +­ + runAsUserŸ +@#/definitions/io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions"[runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. + +seLinux‘ +>#/definitions/io.k8s.api.policy.v1beta1.SELinuxStrategyOptions"OseLinux is the strategy that will dictate the allowable labels that may be set. +Ò +supplementalGroups» +I#/definitions/io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions"nsupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. +” +allowedCSIDriversþ"²AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate.² +arrayº< +: +8#/definitions/io.k8s.api.policy.v1beta1.AllowedCSIDriver +´ + +runAsGroup¥ +A#/definitions/io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions"ßRunAsGroup is the strategy that will dictate the allowable RunAsGroup values that may be set. If this field is omitted, the pod's RunAsGroup can take any value. This field requires the RunAsGroup feature gate to be enabled. +ú +allowedProcMountTypesà"ÃAllowedProcMountTypes is an allowlist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.² +arrayº + ² string -y -portsp"/Ports are not allowed for ephemeral containers.² -arrayº2 -0 -.#/definitions/io.k8s.api.core.v1.ContainerPort -l -readinessProbeZ -&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. - -securityContextl -0#/definitions/io.k8s.api.core.v1.SecurityContext"8SecurityContext is not allowed for ephemeral containers. -× - stdinOnceÉ"º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² +d +hostIPCY"KhostIPC determines if the policy allows the use of HostIPC in the pod spec.² boolean -í -targetContainerNameÕ"ÇIf set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature.² -string -ß -argsÖ"¹Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² +Ç +requiredDropCapabilitiesª"requiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.² arrayº ² string -û -commandï"ÒEntrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² +â +Hio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus•"AAPIServiceStatus contains derived information about an API server² +objectÊà +À + +conditions±"$Current service state of apiService.² +arrayº] +[ +Y#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceConditionú +x-kubernetes-list-typemap +ú' +x-kubernetes-patch-merge-keytype +ú' +x-kubernetes-patch-strategymerge +ú' +x-kubernetes-list-map-keys - type + +ÿ +%io.k8s.api.core.v1.CephFSVolumeSourceÕ "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.šmonitors² +objectÊ« +˜ +user"Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² +string +¦ +monitors™"}Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² arrayº ² string -i -image`"SDocker image name. More info: https://kubernetes.io/docs/concepts/containers/images² +e +path]"POptional: Used as the mounted root, rather than the full Ceph tree, default is /² string -‡ -imagePullPolicyó"åImage pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images² +Î +readOnlyÁ"²Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² +boolean +¾ + +secretFile¯"¡Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² +string +ë + secretRefÝ +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"£Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it +ú +(io.k8s.api.core.v1.ConfigMapVolumeSourceÍ "ÅAdapts a ConfigMap into a volume. + +The contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.² +objectÊö +ê + defaultModeÚint32"ÄOptional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +ª +items "âIf unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.KeyToPath +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string +S +optionalG"9Specify whether the ConfigMap or its keys must be defined² +boolean += +io.k8s.api.core.v1.Containerî<"AA single application container that you want to run within a pod.šname² +objectÊ•< +‚ + livenessProbeð +&#/definitions/io.k8s.api.core.v1.Probe"Å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 +¡ +readinessProbeŽ +&#/definitions/io.k8s.api.core.v1.Probe"ã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 +â + resourcesÔ +5#/definitions/io.k8s.api.core.v1.ResourceRequirements"šCompute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + +securityContextü +0#/definitions/io.k8s.api.core.v1.SecurityContext"ÇSecurity options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ +Ô + startupProbeà +&#/definitions/io.k8s.api.core.v1.Probe"˜StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes Å terminationMessagePathª"œOptional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.² string -æ -terminationMessagePolicyÉ"»Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.² -string ñ volumeMountsà"HPod volumes to mount into the container's filesystem. Cannot be updated.² arrayº0 @@ -42075,19 +41864,17 @@ mountPath ú' x-kubernetes-patch-strategymerge -Á - resources³ -5#/definitions/io.k8s.api.core.v1.ResourceRequirements"zResources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. +Ö +envFromÊ"ˆList of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.² +arrayº2 +0 +.#/definitions/io.k8s.api.core.v1.EnvFromSource Ï stdinÅ"¶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.² boolean  ttyz"lWhether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.² boolean -À - -workingDir±"£Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.² -string ó volumeDevicesá"GvolumeDevices is the list of block devices to be used by the container.² arrayº1 @@ -42097,126 +41884,73 @@ workingDir ú' x-kubernetes-patch-strategymerge -Ö -envFromÊ"ˆList of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.² -arrayº2 -0 -.#/definitions/io.k8s.api.core.v1.EnvFromSource -m - lifecycle` -*#/definitions/io.k8s.api.core.v1.Lifecycle"2Lifecycle is not allowed for ephemeral containers. -k - livenessProbeZ -&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. -j - startupProbeZ -&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. -ž -3io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptionsæ"`RunAsGroupStrategyOptions defines the strategy type and any options used to create the strategy.šrule² -objectÊî -ý -rangesò"¯ranges are the allowed ranges of gids that may be used. If you would like to force a single gid then supply a single range with the same start and end. Required for MustRunAs.² -arrayº3 -1 -/#/definitions/io.k8s.api.policy.v1beta1.IDRange -l -ruled"Wrule is the strategy that will dictate the allowable RunAsGroup values that may be set.² +À + +workingDir±"£Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.² string -— -Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.WebhookClientConfigÁ "WWebhookClientConfig contains the information to make a TLS connection with the webhook.² -objectÊÙ -à -caBundle¶byte"¢caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.² + +imageƒ"õDocker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.² string -› -service -\#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ServiceReference"®service is a reference to the service for this webhook. Either service or url must be specified. - -If the webhook is running within the cluster, then you should use `service`. -ò -urlê"Üurl gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified. - -The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. - -Please note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster. - -The scheme must be "https"; the URL must begin with "https://". - -A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier. +ß +env×"IList of environment variables to set in the container. Cannot be updated.² +arrayº+ +) +'#/definitions/io.k8s.api.core.v1.EnvVarú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge -Attempting to use a user or basic auth e.g. "user:password@" is not allowed. Fragments ("#...") and query parameters ("?...") are not allowed, either.² -string -ú -- version: v1 + group: networking.k8s.io + kind: IngressClass -í -io.k8s.api.apps.v1.ReplicaSetË "YReplicaSet ensures that a specified number of pod replicas are running at any given time.² -objectÊŠ +Ò +io.k8s.api.rbac.v1beta1.Role± "ÒRole is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 Role, and will no longer be served in v1.22.² +objectÊâ ¾ apiVersion¯"¡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² @@ -42250,304 +41978,421 @@ apiVersion ¹ kind°"¢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² string -È -metadata» -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ùIf the Labels of a ReplicaSet are empty, they are defaulted to be the same as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -õ -specì -/#/definitions/io.k8s.api.apps.v1.ReplicaSetSpec"¸Spec defines the specification of the desired behavior of the ReplicaSet. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -Ç -status¼ -1#/definitions/io.k8s.api.apps.v1.ReplicaSetStatus"†Status is the most recently observed status of the ReplicaSet. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúT -x-kubernetes-group-version-kind1/- group: apps - kind: ReplicaSet - version: v1 - -Ù -io.k8s.api.batch.v1.CronJob¹ ":CronJob represents the configuration of a single cron job.² -objectÊ™ +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +y +rulesp"-Rules holds all the PolicyRules for this Role² +arrayº4 +2 +0#/definitions/io.k8s.api.rbac.v1beta1.PolicyRuleúh +x-kubernetes-group-version-kindEC- kind: Role + version: v1beta1 + group: rbac.authorization.k8s.io -¾ +Ï +$io.k8s.api.batch.v1beta1.CronJobSpec¦ "YCronJobSpec describes how the job execution will look like and when it will actually run.šscheduleš jobTemplate² +objectÊ£ -apiVersion¯"¡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² +¿ +successfulJobsHistoryLimit int32"ŠThe number of successful finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified. Defaults to 3.² +integer +  +suspend”"…This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.² +boolean +Ì +concurrencyPolicy¶"¨Specifies how to treat concurrent executions of a Job. Valid values are: - "Allow" (default): allows CronJobs to run concurrently; - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - "Replace": cancels currently running job and replaces it with a new one² string -¹ -kind°"¢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² +· +failedJobsHistoryLimitœint32"†The number of failed finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.² +integer +‰ + jobTemplatez +6#/definitions/io.k8s.api.batch.v1beta1.JobTemplateSpec"@Specifies the job that will be created when executing a CronJob. +] +scheduleQ"DThe schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -ö -specí --#/definitions/io.k8s.api.batch.v1.CronJobSpec"»Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -Ë -statusÀ -/#/definitions/io.k8s.api.batch.v1.CronJobStatus"ŒCurrent status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúR -x-kubernetes-group-version-kind/-- group: batch - kind: CronJob - version: v1 +Ç +startingDeadlineSeconds«int64"•Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.² +integer +Î +%io.k8s.api.core.v1.ConfigMapEnvSource¤"ÂConfigMapEnvSource selects a ConfigMap to populate the environment variables with. -Ž -6io.k8s.api.authorization.v1.SelfSubjectRulesReviewSpecT² -objectÊF -D - namespace7"*Namespace to evaluate rules for. Required.² +The contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.² +objectÊÐ +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -¼ -!io.k8s.api.core.v1.SELinuxOptions–".<.spec.group>.šspec² -objectÊ® -µ -statusª -e#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionStatus"Astatus indicates the actual state of the CustomResourceDefinition -¾ - -apiVersion¯"¡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² +Õ +mountPropagationÀ"²mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.² string -¹ -kind°"¢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² +´ +.io.k8s.api.networking.v1.IngressServiceBackend"CIngressServiceBackend references a Kubernetes Service as a Backend.šname² +objectʦ +x +namep"cName is the referenced service. The service must exist in the same namespace as the Ingress object.² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta © -spec  -c#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec"9spec describes how the user wants the resources to appearúr -x-kubernetes-group-version-kindOM- group: apiextensions.k8s.io - kind: CustomResourceDefinition - version: v1 +port  +9#/definitions/io.k8s.api.networking.v1.ServiceBackendPort"cPort of the referenced service. A port name or port number is required for a IngressServiceBackend. +· +1io.k8s.api.storage.v1beta1.VolumeAttachmentSource"ÝVolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.² +objectÊ’ +À +inlineVolumeSpec« +5#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec"ñinlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is beta-level and is only honored by servers that enabled the CSIMigration feature. +M +persistentVolumeName5"(Name of the persistent volume to attach.² +string +£ +Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionConditionÄ"YCustomResourceDefinitionCondition contains details for the current condition of this pod.štypešstatus² +objectÊÊ +e +messageZ"Mmessage is a human-readable message indicating details about last transition.² +string +j +reason`"Sreason is a unique, one-word, CamelCase reason for the condition's last transition.² +string +Z +statusP"Cstatus is the status of the condition. Can be True, False, Unknown.² +string +q +typei"\type is the type of the condition. Types include Established, NamesAccepted and Terminating.² +string +¥ +lastTransitionTimeŽ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"SlastTransitionTime last time the condition transitioned from one status to another. +ö6 +%io.k8s.api.core.v1.EphemeralContainerÌ6"ƒAn EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag.šname² +objectÊ°1 +Ö +envFromÊ"ˆList of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.² +arrayº2 +0 +.#/definitions/io.k8s.api.core.v1.EnvFromSource +‡ +imagePullPolicyó"åImage pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images² +string +© +name "’Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers.² +string + +securityContextl +0#/definitions/io.k8s.api.core.v1.SecurityContext"8SecurityContext is not allowed for ephemeral containers. +í +targetContainerNameÕ"ÇIf set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature.² +string +ó + volumeDevicesá"GvolumeDevices is the list of block devices to be used by the container.² +arrayº1 +/ +-#/definitions/io.k8s.api.core.v1.VolumeDeviceú- +x-kubernetes-patch-merge-key  devicePath +ú' +x-kubernetes-patch-strategymerge -æ -*io.k8s.api.discovery.v1.EndpointConditions·"CEndpointConditions represents the current condition of an endpoint.² -objectÊã -Ó -readyÉ"ºready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be "true" for terminating endpoints.² -boolean -Ù -servingÍ"¾serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.² -boolean -® - terminatingž"terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.² -boolean - -(io.k8s.api.extensions.v1beta1.IngressTLSâ"MIngressTLS describes the transport layer security associated with an Ingress.² -objectÊ„ -š -hosts"óHosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.² +ß +argsÖ"¹Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² +arrayº + ² +string +û +commandï"ÒEntrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell² arrayº ² string -ä +À -secretNameÕ"ÇSecretName is the name of the secret used to terminate SSL traffic on 443. Field is left optional to allow SSL routing based on SNI hostname alone. If the SNI host in a listener conflicts with the "Host" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.² +workingDir±"£Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.² string -© -*io.k8s.api.scheduling.v1.PriorityClassListú"6PriorityClassList is a collection of priority classes.šitems² -objectÊÀ -¾ +Á + resources³ +5#/definitions/io.k8s.api.core.v1.ResourceRequirements"zResources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. +j + startupProbeZ +&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. +ñ + volumeMountsà"HPod volumes to mount into the container's filesystem. Cannot be updated.² +arrayº0 +. +,#/definitions/io.k8s.api.core.v1.VolumeMountú, +x-kubernetes-patch-merge-key  +mountPath +ú' +x-kubernetes-patch-strategymerge -apiVersion¯"¡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² +ß +env×"IList of environment variables to set in the container. Cannot be updated.² +arrayº+ +) +'#/definitions/io.k8s.api.core.v1.EnvVarú' +x-kubernetes-patch-merge-keyname +ú' +x-kubernetes-patch-strategymerge + +l +readinessProbeZ +&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. +Ï +stdinÅ"¶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.² +boolean +× + stdinOnceÉ"º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² +boolean +æ +terminationMessagePolicyÉ"»Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.² string -t -itemsk"$items is the list of PriorityClasses² -arrayº8 -6 -4#/definitions/io.k8s.api.scheduling.v1.PriorityClass -¹ -kind°"¢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² + +ttyz"lWhether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.² +boolean +m + lifecycle` +*#/definitions/io.k8s.api.core.v1.Lifecycle"2Lifecycle is not allowed for ephemeral containers. +k + livenessProbeZ +&#/definitions/io.k8s.api.core.v1.Probe"0Probes are not allowed for ephemeral containers. +Å +terminationMessagePathª"œOptional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.² string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúh -x-kubernetes-group-version-kindEC- group: scheduling.k8s.io - kind: PriorityClassList - version: v1 - -† -io.k8s.api.core.v1.ServicePortã"3ServicePort contains information on service's port.šport² -objectʘ -j -protocol^"QThe IP protocol for this port. Supports "TCP", "UDP", and "SCTP". Default is TCP.² +i +image`"SDocker image name. More info: https://kubernetes.io/docs/concepts/containers/images² string -â - -targetPortÓ -=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"‘Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service -½ - appProtocol­"ŸThe application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.² +y +portsp"/Ports are not allowed for ephemeral containers.² +arrayº2 +0 +.#/definitions/io.k8s.api.core.v1.ContainerPort +· +'io.k8s.api.core.v1.LocalObjectReference‹"sLocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.² +objectʇ +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string -² -name©"›The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. When considering the endpoints for a Service, this must match the 'name' field in the EndpointPort. Optional if only one ServicePort is defined on this service.² +° +Bio.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReferenceé"jPriorityLevelConfigurationReference contains information that points to the "request-priority" being used.šname² +objectÊh +f +name^"Q`name` is the name of the priority level configuration being referenced Required.² string -‚ -nodePortõint32"ßThe port on each node on which this service is exposed when type is NodePort or LoadBalancer. Usually assigned by the system. If a value is specified, in-range, and not in use it will be used, otherwise the operation will fail. If not specified, a port will be allocated if this Service requires one. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport² -integer -K -portCint32".The port that will be exposed by this service.² -integer -É -.io.k8s.api.networking.v1beta1.IngressClassList–"3IngressClassList is a collection of IngressClasses.šitems² -objectÊÛ +¹ +#io.k8s.api.rbac.v1beta1.RoleBinding‘ "¨RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBinding, and will no longer be served in v1.22.šroleRef² +objectÊÛ +‰ +subjects}"=Subjects holds references to the objects the role applies to.² +arrayº1 +/ +-#/definitions/io.k8s.api.rbac.v1beta1.Subject ¾ apiVersion¯"¡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² string -x -itemso"$Items is the list of IngressClasses.² -arrayº< -: -8#/definitions/io.k8s.api.networking.v1beta1.IngressClass ¹ kind°"¢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² string -b -metadataV -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úl -x-kubernetes-group-version-kindIG- group: networking.k8s.io - kind: IngressClassList +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +å +roleRefÙ +-#/definitions/io.k8s.api.rbac.v1beta1.RoleRef"§RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.úo +x-kubernetes-group-version-kindLJ- group: rbac.authorization.k8s.io + kind: RoleBinding version: v1beta1 -ƒ -0io.k8s.api.policy.v1beta1.FSGroupStrategyOptionsÎ"YFSGroupStrategyOptions defines the strategy type and options used to create the strategy.² -objectÊä -÷ -rangesì"©ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. Required for MustRunAs.² -arrayº3 -1 -/#/definitions/io.k8s.api.policy.v1beta1.IDRange -h -rule`"Srule is the strategy that will dictate what FSGroup is used in the SecurityContext.² +– +2io.k8s.apimachinery.pkg.apis.meta.v1.Preconditionsß"ZPreconditions must be fulfilled before an operation (update, delete, etc.) is carried out.² +objectÊu +- +uid&"Specifies the target UID.² string -± -'io.k8s.api.rbac.v1beta1.ClusterRoleList… "¢ClusterRoleList is a collection of ClusterRoles. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoles, and will no longer be served in v1.22.šitems² -objectÊÓ -¾ - -apiVersion¯"¡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² +D +resourceVersion1"$Specifies the target ResourceVersion² string -l -itemsc"Items is a list of ClusterRoles² -arrayº5 -3 -1#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole +ç +io.k8s.api.core.v1.ConfigMapÆ"7ConfigMap holds configuration data for pods to consume.² +objectʪ +˜ + +binaryData‰"åBinaryData contains the binary data. Each key must consist of alphanumeric characters, '-', '_' or '.'. BinaryData can contain byte sequences that are not in the UTF-8 range. The keys stored in BinaryData must not overlap with the ones in the Data field, this is enforced during validation process. Using this field will require 1.10+ apiserver and kubelet.ª +byte² +string² +object +Ï +dataÆ"¨Data contains the configuration data. Each key must consist of alphanumeric characters, '-', '_' or '.'. Values with non-UTF-8 byte sequences must use the BinaryData field. The keys stored in Data must not overlap with the keys in the BinaryData field, this is enforced during validation process.ª + ² +string² +object +è + immutableÚ"ËImmutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.² +boolean ¹ kind°"¢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² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ús -x-kubernetes-group-version-kindPN- group: rbac.authorization.k8s.io - kind: ClusterRoleList - version: v1beta1 - -ì -&io.k8s.api.core.v1.FlockerVolumeSourceÁ"ÃRepresents a Flocker volume mounted by the Flocker agent. One and only one of datasetName and datasetUUID should be set. Flocker volumes do not support ownership management or SELinux relabeling.² -objectÊì -ˆ - datasetNamey"lName of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated² -string -_ - datasetUUIDP"CUUID of the dataset. This is unique identifier of a Flocker dataset² -string -» -#io.k8s.api.core.v1.PersistentVolume“ "±PersistentVolume (PV) is a storage resource provisioned by an administrator. It is analogous to a node. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes² -objectÊõ - Ò metadataÅ =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Š -spec -5#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec"ÇSpec defines a specification of a persistent volume owned by the cluster. Provisioned by an administrator. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumes -“ -statusˆ -7#/definitions/io.k8s.api.core.v1.PersistentVolumeStatus"ÌStatus represents the current information/status for the persistent volume. Populated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumes ¾ apiVersion¯"¡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² -string -¹ -kind°"¢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² -stringúX -x-kubernetes-group-version-kind53- group: "" - kind: PersistentVolume +stringúQ +x-kubernetes-group-version-kind.,- group: "" + kind: ConfigMap version: v1 -ì -!io.k8s.api.core.v1.SeccompProfileÆ"fSeccompProfile defines a pod/container's seccomp profile settings. Only one profile source may be set.štype² -objectÊÓ -ž -type•"‡type indicates which kind of seccomp profile will be applied. Valid options are: - -Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.² +Ó +1io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource"%Represents a vSphere volume resource.š +volumePath² +objectÊÚ +À +fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² string -¯ -localhostProfileš"ŒlocalhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost".² -stringúr -x-kubernetes-unions[Y- discriminator: type - fields-to-discriminateBy: - localhostProfile: LocalhostProfile - - -#io.k8s.api.node.v1.RuntimeClassListè"3RuntimeClassList is a list of RuntimeClass objects.šitems² -objectʸ -¾ +x +storagePolicyIDe"XStorage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.² +string +V +storagePolicyNameA"4Storage Policy Based Management (SPBM) profile name.² +string +C -apiVersion¯"¡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² +volumePath5"(Path that identifies vSphere volume vmdk² string -k -itemsb""Items is a list of schema objects.² -arrayº1 -/ --#/definitions/io.k8s.api.node.v1.RuntimeClass -¹ -kind°"¢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² +´ +4io.k8s.api.core.v1.PersistentVolumeClaimVolumeSourceû"žPersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).š claimName² +objectÊ¿ +á + claimNameÓ"ÅClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims² string -Ë -metadata¾ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúa -x-kubernetes-group-version-kind><- kind: RuntimeClassList - version: v1 - group: node.k8s.io +Y +readOnlyM"?Will force the ReadOnly setting in VolumeMounts. Default false.² +boolean +° +)io.k8s.api.networking.v1.IngressClassSpec‚"DIngressClassSpec provides information about the class of an Ingress.² +objectÊ­ +¦ -›, -#io.k8s.api.storage.v1.CSIDriverSpecó+"2CSIDriverSpec is the specification of a CSIDriver.² -objectÊ°+ -Û - fsGroupPolicyÉ"»Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate. +controller—"‰Controller refers to the name of the controller that should handle this class. This allows for different "flavors" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. "acme.io/ingress-controller". This field is immutable.² +string + -This field is immutable.² +parametersò +F#/definitions/io.k8s.api.networking.v1.IngressClassParametersReference"§Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters. +¬ +;io.k8s.api.admissionregistration.v1beta1.RuleWithOperationsì "‚RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.² +objectÊØ +´ + apiGroups¦"‰APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.² +arrayº + ² string -© -podInfoOnMount– "‡ If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. "csi.storage.k8s.io/pod.name": pod.Name "csi.storage.k8s.io/pod.namespace": pod.Namespace "csi.storage.k8s.io/pod.uid": string(pod.UID) "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume - defined by a CSIVolumeSource, otherwise "false" +¼ + apiVersions¬"APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.² +arrayº + ² +string +  -"csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the "Persistent" and "Ephemeral" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver. +operations‘"ôOperations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.² +arrayº + ² +string +– + resourcesˆ"ëResources is a list of resources this rule applies to. -This field is immutable.² -boolean -ÿ -requiresRepublishé"ÚRequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false. +For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. -Note: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container. +If wildcard is present, the validation rule will ensure resources do not overlap with each other. -This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² -boolean +Depending on the enclosing object, subresources might not be allowed. Required.² +arrayº + ² +string +£ +scope™"‹scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".² +string +² + io.k8s.api.core.v1.NodeCondition"8NodeCondition contains condition information for a node.štypešstatus² +objectÊ´ +, +type$"Type of node condition.² +string +€ +lastHeartbeatTimek +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"0Last time we got an update on a given condition. +Œ +lastTransitionTimev +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time";Last time the condition transit from one status to another. +X +messageM"@Human readable message indicating details about last transition.² +string +J +reason@"3(brief) reason for the condition's last transition.² +string +L +statusB"5Status of the condition, one of True, False, Unknown.² +string +Ú +8io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec"¢SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² +objectÊé +Æ +extra¼"Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.ª +² +arrayº + ² +string² +object +M +groupD"(Groups is the groups you're testing for.² +arrayº + ² +string +¯ +nonResourceAttributes• +D#/definitions/io.k8s.api.authorization.v1beta1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request +¯ +resourceAttributes˜ +A#/definitions/io.k8s.api.authorization.v1beta1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request +> +uid7"*UID information about the requesting user.² +string +ª +user¡"“User is the user you're testing for. If you specify "User" but not "Group", then is it interpreted as "What if User were not a member of any groups² +string +â +io.k8s.api.rbac.v1.RoleRefÃ"?RoleRef contains information that points to the role being usedšapiGroupškindšname² +objectÊÚ +P +apiGroupD"7APIGroup is the group for the resource being referenced² +string +B +kind:"-Kind is the type of resource being referenced² +string +B +name:"-Name is the name of resource being referenced² +string +›, +#io.k8s.api.storage.v1.CSIDriverSpecó+"2CSIDriverSpec is the specification of a CSIDriver.² +objectÊ°+ € storageCapacityì"ÝIf set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information. @@ -42590,9 +42435,49 @@ This field is immutable. This field is immutable.² boolean -Î -"io.k8s.api.storage.v1beta1.CSINode§ "ÊDEPRECATED - This group version of CSINode is deprecated by storage/v1/CSINode. See the release notes for more information. CSINode holds information about all CSI drivers installed on a node. CSI drivers do not need to create the CSINode object directly. As long as they use the node-driver-registrar sidecar container, the kubelet will automatically populate the CSINode object for the CSI driver as part of kubelet plugin registration. CSINode has the same name as a node. If the object is missing, it means either there are no CSI Drivers available on the node, or the Kubelet version is low enough that it doesn't create this object. CSINode has an OwnerReference that points to the corresponding node object.šspec² -objectÊá +Û + fsGroupPolicyÉ"»Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate. + +This field is immutable.² +string +© +podInfoOnMount– "‡ If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. "csi.storage.k8s.io/pod.name": pod.Name "csi.storage.k8s.io/pod.namespace": pod.Namespace "csi.storage.k8s.io/pod.uid": string(pod.UID) "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume + defined by a CSIVolumeSource, otherwise "false" + +"csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the "Persistent" and "Ephemeral" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver. + +This field is immutable.² +boolean +ÿ +requiresRepublishé"ÚRequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false. + +Note: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container. + +This is a beta feature and only available when the CSIServiceAccountToken feature is enabled.² +boolean +ì +Nio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation™"YExternalDocumentation allows referencing an external resource for extended documentation.² +objectÊ0 + +url ² +string + + description ² +string +ƒ +Jio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion´"#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus"7current contains the current value for the given metric - -io.k8s.api.core.v1.EventSeriesÞ"qEventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.² -objectÊÜ -` -countWint32"BNumber of occurrences in this series up to the last heartbeat time² -integer -x -lastObservedTimed -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"$Time of the last occurrence observed -à -"io.k8s.api.core.v1.SecretReference¹"lSecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace² -objectʼ -V -nameN"AName is unique within a namespace to reference a secret resource.² +Ý +#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceúW -x-kubernetes-group-version-kind42- group: "" - kind: APIResourceList +I +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúj +x-kubernetes-group-version-kindGE- group: apiregistration.k8s.io + kind: APIServiceList version: v1 -â -Hio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus•"AAPIServiceStatus contains derived information about an API server² -objectÊà -À - -conditions±"$Current service state of apiService.² -arrayº] -[ -Y#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceConditionú -x-kubernetes-list-typemap -ú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge -ú' -x-kubernetes-list-map-keys - type +Ò +3io.k8s.api.autoscaling.v2beta1.ExternalMetricSourceš"ùExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). Exactly one "target" type should be set.š +metricName² +objectÊ‚ +L -Æ -%io.k8s.api.coordination.v1beta1.Leaseœ "Lease defines a lease concept.² -objectʇ +metricName>"1metricName is the name of the metric in question.² +string +§ +metricSelector” +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"PmetricSelector is used to identify a specific time series within a given metric. +Ë +targetAverageValue´ +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"utargetAverageValue is the target per-pod value of global metric (as a quantity). Mutually exclusive with TargetValue. +¹ + targetValue© +;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"jtargetValue is the target value of the metric (as a quantity). Mutually exclusive with TargetAverageValue. +Ï +*io.k8s.api.networking.v1.NetworkPolicyPort "6NetworkPolicyPort describes a port to allow traffic on² +objectÊÙ +™ +endPortint32"÷If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate "NetworkPolicyEndPort".² +integer +¶ +port­ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"ëThe port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched. + +protocolu"hThe protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.² +string +ý +io.k8s.api.core.v1.Taintà"`The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint.škeyšeffect² +objectÊà +  +effect•"‡Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute.² +string +D +key="0Required. The taint key to be applied to a node.² +string +­ + timeAddedŸ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"dTimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. +E +value<"/The taint value corresponding to the taint key.² +string +° +)io.k8s.api.discovery.v1.EndpointSliceList‚"6EndpointSliceList represents a list of endpoint slicesšitems² +objectÊÉ ¾ apiVersion¯"¡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² string +f +items]"List of endpoint slices² +arrayº7 +5 +3#/definitions/io.k8s.api.discovery.v1.EndpointSlice ¹ kind°"¢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² string -µ -metadata¨ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Ï -specÆ -7#/definitions/io.k8s.api.coordination.v1beta1.LeaseSpec"ŠSpecification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúc -x-kubernetes-group-version-kind@>- version: v1beta1 - group: coordination.k8s.io - kind: Lease +b +metadataV +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard list metadata.úg +x-kubernetes-group-version-kindDB- group: discovery.k8s.io + kind: EndpointSliceList + version: v1 -· -!io.k8s.api.core.v1.NodeSystemInfo‘ "CNodeSystemInfo is a set of ids/uuids to uniquely identify the node.š machineIDš -systemUUIDšbootIDš kernelVersionšosImagešcontainerRuntimeVersionškubeletVersionškubeProxyVersionšoperatingSystemš architecture² -objectÊ¢ -ß - machineIDÑ"ÃMachineID reported by the node. For unique machine identification in the cluster this field is preferred. Learn more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html² + ++io.k8s.api.extensions.v1beta1.IngressStatusÑ"8IngressStatus describe the current state of the Ingress.² +objectʈ +… + loadBalanceru +3#/definitions/io.k8s.api.core.v1.LoadBalancerStatus">LoadBalancer contains the current status of the load-balancer. +˜ +5io.k8s.api.authorization.v1.SubjectAccessReviewStatusÞ"SubjectAccessReviewStatusšallowed² +objectʪ +c +allowedX"JAllowed is required. True if the action would be allowed, false otherwise.² +boolean +‚ +denied÷"èDenied is optional. True if the action would be denied, otherwise false. If both allowed is false and denied is false, then the authorizer has no opinion on whether to authorize the action. Denied may not be true if Allowed is true.² +boolean +Þ +evaluationErrorÊ"¼EvaluationError is an indication that some error occurred during the authorization check. It is entirely possible to get an error and be able to continue determine authorization status in spite of it. For instance, RBAC can be missing a role, but enough roles are still present and bound to reason about the request.² string -þ - -systemUUIDï"áSystemUUID reported by the node. For unique machine identification MachineID is preferred. This field is specific to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid² +] +reasonS"FReason is optional. It indicates why a request was allowed or denied.² string -B - architecture2"%The Architecture reported by the node² +— +"io.k8s.api.core.v1.TCPSocketActionð"=TCPSocketAction describes an action based on opening a socketšport² +objectÊ› +Ç +port¾ +=#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString"}Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. +O +hostG":Optional: Host name to connect to, defaults to the pod IP.² string -4 -bootID*"Boot ID reported by the node.² +³ +]io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersionÑ"//...` if `served` is true.² string -H -kubeProxyVersion4"'KubeProxy Version reported by the node.² +é ++io.k8s.api.flowcontrol.v1beta1.GroupSubject¹"?GroupSubject holds detailed information for group-kind subject.šname² +objectÊâ +ß +nameÖ"Èname is the user group that matches, or "*" to match all user groups. See https://github.com/kubernetes/apiserver/blob/master/pkg/authentication/user/user.go for some well-known group names. Required.² string -n - kernelVersion]"PKernel Version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64).² +Ú ++io.k8s.api.policy.v1beta1.AllowedFlexVolumeª"LAllowedFlexVolume represents a single Flexvolume that is allowed to be used.šdriver² +objectÊE +C +driver9",driver is the name of the Flexvolume driver.² string -D -kubeletVersion2"%Kubelet Version reported by the node.² + +1io.k8s.api.core.v1.PersistentVolumeClaimConditionÙ"BPersistentVolumeClaimCondition contails details about state of pvcštypešstatus² +objectÊö +n + lastProbeTime] +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time""Last time we probed the condition. +‘ +lastTransitionTime{ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"@Last time the condition transitioned from one status to another. +X +messageM"@Human-readable message indicating details about last transition.² string -I -operatingSystem6")The Operating System reported by the node² +é +reasonÞ"ÐUnique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports "ResizeStarted" that means the underlying persistent volume is being resized.² string -n -osImagec"VOS Image reported by the node from /etc/os-release (e.g. Debian GNU/Linux 7 (wheezy)).² + +status ² string -‚ -*io.k8s.api.core.v1.PreferredSchedulingTermÓ"®An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).šweightš -preference² -objectÊý -‚ - -preferencet -1#/definitions/io.k8s.api.core.v1.NodeSelectorTerm"?A node selector term, associated with the corresponding weight. -v -weightlint32"WWeight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.² -integer -à -Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionListä"KCustomResourceDefinitionList is a list of CustomResourceDefinition objects.šitems² -objectÊ‚ -¹ -kind°"¢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 -I -metadata= -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta -¾ +Ú -apiVersion¯"¡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² +io.k8s.api.core.v1.Toleration¸ +"The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator .² +objectÊ™ +¸ +effect­"ŸEffect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.² string -· -items­"6items list individual CustomResourceDefinition objects² -arrayºh -f -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionú{ -x-kubernetes-group-version-kindXV- group: apiextensions.k8s.io - kind: CustomResourceDefinitionList - version: v1beta1 - -ì -*io.k8s.api.authentication.v1beta1.UserInfo½"ZUserInfo holds the information about the user needed to implement the user.Info interface.² -objectÊÒ -Q -groupsG"+The names of groups this user is a part of.² -arrayº - ² +Ó +keyË"½Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.² string -® -uid¦"˜A unique value that identifies this user across time. If this user is deleted and another user by the same name is added, they will have different UIDs.² +ö +operatoré"ÛOperator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.² string -\ -usernameP"CThe name that uniquely identifies this user among all active users.² +ç +tolerationSecondsÑint64"»TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.² +integer +¢ +value˜"ŠValue is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.² string -n -extrae"9Any additional information provided by the authenticator.ª -² -arrayº +± +,io.k8s.api.core.v1.ReplicationControllerSpec€ "KReplicationControllerSpec is the specification of a replication controller.² +objectʤ + +ƒ +minReadySecondsïint32"ÙMinimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)² +integer +  +replicas“int32"ýReplicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller² +integer +¸ +selector«"Selector is a label query over pods that should match the Replicas count. If Selector is empty, it is defaulted to the labels present on the Pod template. Label keys and values that must match in order to be controlled by this replication controller, if empty defaulted to labels on Pod template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectorsª ² string² object -à -4io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRuleŠ"·NonResourcePolicyRule is a predicate that matches non-resource requests according to their verb and the target non-resource URL. A NonResourcePolicyRule matches a request if and only if both (a) at least one member of verbs matches the request and (b) at least one member of nonResourceURLs matches the request.šverbsšnonResourceURLs² -objectʧ -Ð -nonResourceURLs¼"ü`nonResourceURLs` is a set of url prefixes that a user should have access to and may not be empty. For example: - - "/healthz" is legal - - "/hea*" is illegal - - "/hea" is legal but matches nothing - - "/hea/*" also matches nothing - - "/healthz/*" matches all per-component health checks. -"*" matches all non-resource urls. if it is present, it must be the only entry. Required.² -arrayº - ² -stringú -x-kubernetes-list-typeset - -Ñ -verbsÇ"‡`verbs` is a list of matching verbs and may not be empty. "*" matches all verbs. If it is present, it must be the only entry. Required.² -arrayº - ² -stringú -x-kubernetes-list-typeset - -› -.io.k8s.api.storage.v1beta1.VolumeNodeResourcesè"JVolumeNodeResources is a set of resource limits for scheduling of volumes.² -objectÊ -Š -count€int32"êMaximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is nil, then the supported number of volumes on this node is unbounded.² -integer -Ú -*io.k8s.api.core.v1.WeightedPodAffinityTerm«"vThe weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)šweightšpodAffinityTerm² -objectʉ - -podAffinityTerm| -0#/definitions/io.k8s.api.core.v1.PodAffinityTerm"HRequired. A pod affinity term, associated with the corresponding weight. -u -weightkint32"Vweight associated with matching the corresponding podAffinityTerm, in the range 1-100.² +½ +template° +0#/definitions/io.k8s.api.core.v1.PodTemplateSpec"ûTemplate is the object that describes the pod that will be created if insufficient replicas are detected. This takes precedence over a TemplateRef. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template +Ê +io.k8s.api.core.v1.Sysctl¬"+Sysctl defines a kernel parameter to be setšnamešvalue² +objectÊb +0 +value'"Value of a property to set² +string +. +name&"Name of a property to set² +string +Ž ++io.k8s.api.core.v1.TopologySpreadConstraintÞ"XTopologySpreadConstraint specifies how to spread matching pods among the given topology.šmaxSkewš topologyKeyšwhenUnsatisfiable² +objectÊÉ +Ì +maxSkewÀint32"ªMaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.² integer - -*io.k8s.api.discovery.v1beta1.EndpointHintsà"KEndpointHints provides hints describing how an endpoint should be consumed.² -objectÊ„ - -forZonesô"ˆforZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing. May contain a maximum of 8 entries.² -arrayº6 -4 -2#/definitions/io.k8s.api.discovery.v1beta1.ForZoneú# -x-kubernetes-list-type atomic - -• -io.k8s.api.apps.v1.Deploymentó"@Deployment enables declarative updates for Pods and ReplicaSets.² -objectÊË -¾ - -apiVersion¯"¡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² +§ + topologyKey—"‰TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field.² string -¹ -kind°"¢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² +Ï +whenUnsatisfiable¹"«WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, + but giving higher precedence to topologies that would help reduce the + skew. +A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it *more* imbalanced. It's a required field.² string -f -metadataZ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. -s -speck -/#/definitions/io.k8s.api.apps.v1.DeploymentSpec"8Specification of the desired behavior of the Deployment. -o -statuse -1#/definitions/io.k8s.api.apps.v1.DeploymentStatus"0Most recently observed status of the Deployment.úT -x-kubernetes-group-version-kind1/- group: apps - kind: Deployment - version: v1 - -„ - -/io.k8s.api.core.v1.CephFSPersistentVolumeSourceÐ "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.šmonitors² -objectʦ -¦ -monitors™"}Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² -arrayº - ² +û + labelSelectoré +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"¤LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. +ˆ +.io.k8s.apimachinery.pkg.apis.meta.v1.MicroTimeV date-time">MicroTime is version of Time with microsecond level precision.² string -e -path]"POptional: Used as the mounted root, rather than the full Ceph tree, default is /² +„ +io.k8s.api.core.v1.KeyToPathã",Maps a string key to a path within a volume.škeyšpath² +objectÊ™ +' +key "The key to project.² string -Î -readOnlyÁ"²Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² -boolean -¾ - -secretFile¯"¡Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² +» +mode²int32"œOptional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +¯ +path¦"˜The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'.² string -æ - secretRefØ -0#/definitions/io.k8s.api.core.v1.SecretReference"£Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it -˜ -user"Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² +” +%io.k8s.api.core.v1.NamespaceConditionê"=NamespaceCondition contains details about state of namespace.štypešstatus² +objectÊŒ + +message ² string - --io.k8s.api.core.v1.FlexPersistentVolumeSourceÝ"ƒFlexPersistentVolumeSource represents a generic persistent volume resource that is provisioned/attached using an exec based plugin.šdriver² -objectÊ¿ -Ä -fsType¹"«Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.² + +reason ² +string +L +statusB"5Status of the condition, one of True, False, Unknown.² +string +< +type4"'Type of namespace controller condition.² string O -optionsD"'Optional: Extra command options if any.ª - ² -string² -object -‚ -readOnlyv"hOptional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² -boolean -Î - secretRefÀ -0#/definitions/io.k8s.api.core.v1.SecretReference"‹Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts. -O -driverE"8Driver is the name of the driver to use for this volume.² +lastTransitionTime9 +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time +á +&io.k8s.api.core.v1.ComponentStatusList¶ "Status of all the conditions for the component as a list of ComponentStatus objects. Deprecated: This API is deprecated in v1.19+šitems² +objectʽ +l +itemsc" List of ComponentStatus objects.² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.ComponentStatus +¹ +kind°"¢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² string -¢ -io.k8s.api.node.v1.Scheduling€"TScheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.² -objectÊ› -ç - nodeSelectorÖ"¸nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.ª - ² -string² -object -® - tolerationsž"¹tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.² -arrayº/ -- -+#/definitions/io.k8s.api.core.v1.Tolerationú# -x-kubernetes-list-type atomic +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +¾ + +apiVersion¯"¡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² +stringú[ +x-kubernetes-group-version-kind86- group: "" + kind: ComponentStatusList + version: v1 + + +(io.k8s.api.core.v1.PersistentVolumeClaim• "NPersistentVolumeClaim is a user's request for and claim to a persistent volume² +objectÊÖ -ˆ --io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupÖ"YAPIGroup contains the name, the supported versions, and the preferred version of a group.šnamešversions² -objectʇ ¾ apiVersion¯"¡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² @@ -42960,130 +42869,193 @@ apiVersion ¹ kind°"¢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² string -3 -name+"name is the name of the group.² -string -Ç -preferredVersion² -K#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery"cpreferredVersion is the version preferred by the API server, which probably is the storage version. -è -serverAddressByClientCIDRsÉ"éa map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.² -arrayºP -N -L#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR - -versions"2versions are the versions supported in this group.² -arrayºO -M -K#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscoveryúP -x-kubernetes-group-version-kind-+- kind: APIGroup +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +ø +specï +:#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimSpec"°Spec defines the desired characteristics of a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims +† +statusû +<#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimStatus"ºStatus represents the current information/status of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaimsú] +x-kubernetes-group-version-kind:8- kind: PersistentVolumeClaim version: v1 group: "" -ÿ -%io.k8s.api.core.v1.CephFSVolumeSourceÕ "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.šmonitors² -objectÊ« -¾ - -secretFile¯"¡Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² -string -ë - secretRefÝ -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"£Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it -˜ -user"Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² -string -¦ -monitors™"}Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² + +(io.k8s.api.extensions.v1beta1.IngressTLSâ"MIngressTLS describes the transport layer security associated with an Ingress.² +objectÊ„ +š +hosts"óHosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.² arrayº ² string -e -path]"POptional: Used as the mounted root, rather than the full Ceph tree, default is /² -string -Î -readOnlyÁ"²Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it² -boolean -Ÿ -3io.k8s.api.flowcontrol.v1beta1.QueuingConfigurationç -"CQueuingConfiguration holds the configuration parameters for queuing² -objectÊ“ +ä -¢ -handSize•int32"ÿ`handSize` is a small positive number that configures the shuffle sharding of requests into queues. When enqueuing a request at this priority level the request's flow identifier (a string pair) is hashed and the hash value is used to shuffle the list of queues and deal a hand of the size specified here. The request is put into one of the shortest queues in that hand. `handSize` must be no larger than `queues`, and should be significantly smaller (so that a few heavy flows do not saturate most of the queues). See the user-facing documentation for more extensive guidance on setting this field. This field has a default value of 8.² -integer -“ -queueLengthLimitþint32"è`queueLengthLimit` is the maximum number of requests allowed to be waiting in a given queue of this priority level at a time; excess requests are rejected. This value must be positive. If not specified, it will be defaulted to 50.² -integer -Õ -queuesÊint32"´`queues` is the number of queues for this priority level. The queues exist independently at each apiserver. The value must be positive. Setting it to 1 effectively precludes shufflesharding and thus makes the distinguisher method of associated flow schemas irrelevant. This field has a default value of 64.² -integer -´ +secretNameÕ"ÇSecretName is the name of the secret used to terminate SSL traffic on 443. Field is left optional to allow SSL routing based on SNI hostname alone. If the SNI host in a listener conflicts with the "Host" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.² +string +Ÿ +-io.k8s.api.networking.v1.HTTPIngressRuleValueí"£HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http:///? -> backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.špaths² +objectÊ° +­ +paths£"4A collection of paths that map requests to backends.² +arrayº: +8 +6#/definitions/io.k8s.api.networking.v1.HTTPIngressPathú# +x-kubernetes-list-type atomic -Bio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceí "[APIService represents a server for a particular GroupVersion. Name must be "version.group".² -objectÊ“ -§ -specž -T#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpec"FSpec contains information for locating and communicating with a server -œ -status‘ -V#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus"7Status contains derived information about an API server +™ +1io.k8s.api.policy.v1beta1.PodDisruptionBudgetListã"@PodDisruptionBudgetList is a collection of PodDisruptionBudgets.šitems² +objectÊŸ ¾ apiVersion¯"¡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² string +U +itemsL² +arrayº? += +;#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget ¹ kind°"¢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² string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMetaúk -x-kubernetes-group-version-kindHF- group: apiregistration.k8s.io - kind: APIService +I +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúh +x-kubernetes-group-version-kindEC- kind: PodDisruptionBudgetList version: v1beta1 + group: policy - -(io.k8s.api.core.v1.ContainerStateWaitingã"8ContainerStateWaiting is a waiting state of a container.² -objectÊš -O -messageD"7Message regarding why the container is not yet running.² +Õ +Qio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversionÿ"MCustomResourceConversion describes how to convert different versions of a CR.šstrategy² +objectÊ– +Å +strategy¸"ªstrategy specifies how custom resources are converted between versions. Allowed values are: - `None`: The converter only change the apiVersion and would not touch any other field in the custom resource. - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information + is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhook to be set.² string -G -reason="0(brief) reason the container is not yet running.² +Ë +webhook¿ +X#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion"cwebhook describes how to call the conversion webhook. Required when `strategy` is set to `Webhook`. +Æ +%io.k8s.api.coordination.v1beta1.Leaseœ "Lease defines a lease concept.² +objectʇ +¹ +kind°"¢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² string -Á -!io.k8s.api.core.v1.DaemonEndpoint›"CDaemonEndpoint contains information about a single Daemon endpoint.šPort² -objectÊA -? -Port7int32""Port number of the given endpoint.² -integer -à -io.k8s.api.discovery.v1.ForZoneŸ"LForZone provides information about which zones should consume this endpoint.šname² -objectÊ< -: -name2"%name represents the name of the zone.² +µ +metadata¨ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ï +specÆ +7#/definitions/io.k8s.api.coordination.v1beta1.LeaseSpec"ŠSpecification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +¾ + +apiVersion¯"¡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² +stringúc +x-kubernetes-group-version-kind@>- group: coordination.k8s.io + kind: Lease + version: v1beta1 + +Ÿ +(io.k8s.api.core.v1.AzureDiskVolumeSourceò"TAzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.šdiskNamešdiskURI² +objectÊø +À +fsTypeµ"§Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.² +string +à +kind×"ÉExpected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared² +string +x +readOnlyl"^Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.² +boolean +K + cachingMode<"/Host Caching mode: None, Read Only, Read Write.² string -‚ -1io.k8s.api.core.v1.ReplicationControllerConditionÌ"bReplicationControllerCondition describes the state of a replication controller at a certain point.štypešstatus² -objectÊÉ F -reason<"/The reason for the condition's last transition.² +diskName:"-The Name of the data disk in the blob storage² string -L -statusB"5Status of the condition, one of True, False, Unknown.² +A +diskURI6")The URI the data disk in the blob storage² string -> -type6")Type of replication controller condition.² +û +)io.k8s.api.autoscaling.v2beta1.MetricSpecÍ"|MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).štype² +objectʹ + +object· +?#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricSource"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). +• +podsŒ +=#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricSource"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. +™ +resourceŒ +A#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricSource"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +£ +typeš"Œtype is the type of metric source. It should be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each mapping to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² string -• -lastTransitionTime -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"DThe last time the condition transitioned from one status to another. -Y -messageN"AA human readable message indicating details about the transition.² +  +containerResourceŠ +J#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource"»container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag. +ô +externalç +A#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricSource"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). +û +)io.k8s.api.autoscaling.v2beta2.MetricSpecÍ"|MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).štype² +objectʹ +™ +resourceŒ +A#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricSource"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. +£ +typeš"Œtype is the type of metric source. It should be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each mapping to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² +string +  +containerResourceŠ +J#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource"»container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag. +ô +externalç +A#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricSource"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). + +object· +?#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricSource"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). +• +podsŒ +=#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricSource"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. +¦ +%io.k8s.api.core.v1.CinderVolumeSourceü"ëRepresents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.švolumeID² +objectÊô +ƒ +fsTypeø"êFilesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +string +Á +readOnly´"¥Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +boolean +ž + secretRef +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"WOptional: points to a secret object containing parameters used to connect to OpenStack. +† +volumeIDz"mvolume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +string +Æ +#io.k8s.api.core.v1.SecretProjectionž"Adapts a secret into a projected volume. + +The contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.² +objectÊÿ +¤ +itemsš"ÜIf unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² +arrayº. +, +*#/definitions/io.k8s.api.core.v1.KeyToPath +„ +name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² string +O +optionalC"5Specify whether the Secret or its key must be defined² +boolean ´ )io.k8s.api.discovery.v1beta1.EndpointPort† "7EndpointPort represents a Port used by an EndpointSlice² objectʾ +Ù + appProtocolÉ"»The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.² +string Å name¼"®The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.² string @@ -43093,224 +43065,384 @@ Y b protocolV"IThe IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.² string -Ù - appProtocolÉ"»The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.² -string -¬ -Zio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArrayN"LJSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array. -ð -1io.k8s.api.authentication.v1.BoundObjectReferenceº"JBoundObjectReference is a reference to an object that a token is bound to.² -objectÊß -7 +± +/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEventý"6Event represents a single event to a watched resource.štypešobject² +objectÊ× +¿ +object´ +:#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension"õObject is: + * If Type is Added or Modified: the new state of the object. + * If Type is Deleted: the state of the object immediately before deletion. + * If Type is Error: *Status is recommended; other types may make sense + depending on context. + +type ² +stringúË +x-kubernetes-group-version-kind§¤- group: "" + kind: WatchEvent + version: v1 +- version: v1 + group: admission.k8s.io + kind: WatchEvent +- group: admission.k8s.io + kind: WatchEvent + version: v1beta1 +- group: admissionregistration.k8s.io + kind: WatchEvent + version: v1 +- group: admissionregistration.k8s.io + kind: WatchEvent + version: v1beta1 +- group: apiextensions.k8s.io + kind: WatchEvent + version: v1 +- kind: WatchEvent + version: v1beta1 + group: apiextensions.k8s.io +- group: apiregistration.k8s.io + kind: WatchEvent + version: v1 +- group: apiregistration.k8s.io + kind: WatchEvent + version: v1beta1 +- group: apps + kind: WatchEvent + version: v1 +- group: apps + kind: WatchEvent + version: v1beta1 +- group: apps + kind: WatchEvent + version: v1beta2 +- kind: WatchEvent + version: v1 + group: authentication.k8s.io +- group: authentication.k8s.io + kind: WatchEvent + version: v1beta1 +- kind: WatchEvent + version: v1 + group: authorization.k8s.io +- group: authorization.k8s.io + kind: WatchEvent + version: v1beta1 +- group: autoscaling + kind: WatchEvent + version: v1 +- kind: WatchEvent + version: v2beta1 + group: autoscaling +- group: autoscaling + kind: WatchEvent + version: v2beta2 +- group: batch + kind: WatchEvent + version: v1 +- group: batch + kind: WatchEvent + version: v1beta1 +- group: certificates.k8s.io + kind: WatchEvent + version: v1 +- group: certificates.k8s.io + kind: WatchEvent + version: v1beta1 +- group: coordination.k8s.io + kind: WatchEvent + version: v1 +- group: coordination.k8s.io + kind: WatchEvent + version: v1beta1 +- group: discovery.k8s.io + kind: WatchEvent + version: v1 +- group: discovery.k8s.io + kind: WatchEvent + version: v1beta1 +- group: events.k8s.io + kind: WatchEvent + version: v1 +- group: events.k8s.io + kind: WatchEvent + version: v1beta1 +- group: extensions + kind: WatchEvent + version: v1beta1 +- kind: WatchEvent + version: v1alpha1 + group: flowcontrol.apiserver.k8s.io +- group: flowcontrol.apiserver.k8s.io + kind: WatchEvent + version: v1beta1 +- group: imagepolicy.k8s.io + kind: WatchEvent + version: v1alpha1 +- kind: WatchEvent + version: v1alpha1 + group: internal.apiserver.k8s.io +- group: networking.k8s.io + kind: WatchEvent + version: v1 +- group: networking.k8s.io + kind: WatchEvent + version: v1beta1 +- group: node.k8s.io + kind: WatchEvent + version: v1 +- version: v1alpha1 + group: node.k8s.io + kind: WatchEvent +- group: node.k8s.io + kind: WatchEvent + version: v1beta1 +- version: v1 + group: policy + kind: WatchEvent +- version: v1beta1 + group: policy + kind: WatchEvent +- kind: WatchEvent + version: v1 + group: rbac.authorization.k8s.io +- version: v1alpha1 + group: rbac.authorization.k8s.io + kind: WatchEvent +- group: rbac.authorization.k8s.io + kind: WatchEvent + version: v1beta1 +- group: scheduling.k8s.io + kind: WatchEvent + version: v1 +- group: scheduling.k8s.io + kind: WatchEvent + version: v1alpha1 +- group: scheduling.k8s.io + kind: WatchEvent + version: v1beta1 +- group: storage.k8s.io + kind: WatchEvent + version: v1 +- group: storage.k8s.io + kind: WatchEvent + version: v1alpha1 +- group: storage.k8s.io + kind: WatchEvent + version: v1beta1 -apiVersion)"API version of the referent.² +Á +-io.k8s.api.authorization.v1beta1.ResourceRule"¬ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.šverbs² +objectÊÉ +ƒ + apiGroupsõ"ØAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "*" means all.² +arrayº + ² string -N -kindF"9Kind of the referent. Valid kinds are 'Pod' and 'Secret'.² +¹ + resourceNames§"ŠResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. "*" means all.² +arrayº + ² string -* -name""Name of the referent.² +ä + resourcesÖ"¹Resources is a list of resources this rule applies to. "*" means all in the specified apiGroups. + "*/foo" represents the subresource 'foo' for all resources in the specified apiGroups.² +arrayº + ² string -( -uid!"UID of the referent.² + +verbs“"wVerb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. "*" means all.² +arrayº + ² string -Ò -3io.k8s.api.autoscaling.v2beta1.ExternalMetricSourceš"ùExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). Exactly one "target" type should be set.š -metricName² -objectÊ‚ -Ë -targetAverageValue´ -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"utargetAverageValue is the target per-pod value of global metric (as a quantity). Mutually exclusive with TargetValue. -¹ - targetValue© -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity"jtargetValue is the target value of the metric (as a quantity). Mutually exclusive with TargetAverageValue. -L + +:io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatusÞ"SubjectAccessReviewStatusšallowed² +objectʪ +‚ +denied÷"èDenied is optional. True if the action would be denied, otherwise false. If both allowed is false and denied is false, then the authorizer has no opinion on whether to authorize the action. Denied may not be true if Allowed is true.² +boolean +Þ +evaluationErrorÊ"¼EvaluationError is an indication that some error occurred during the authorization check. It is entirely possible to get an error and be able to continue determine authorization status in spite of it. For instance, RBAC can be missing a role, but enough roles are still present and bound to reason about the request.² +string +] +reasonS"FReason is optional. It indicates why a request was allowed or denied.² +string +c +allowedX"JAllowed is required. True if the action would be allowed, false otherwise.² +boolean +ž +Fio.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpecÓ"£APIServiceSpec contains information for locating and communicating with a server. Only https is supported, though you are able to disable certificate verification.šgroupPriorityMinimumšversionPriority² +objectÊõ +ì +caBundleßbyte"¥CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.² +stringú# +x-kubernetes-list-type atomic + +C +group:"-Group is the API group name this server hosts² +string +± +groupPriorityMinimum˜int32"‚GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s² +integer +Í +insecureSkipTLSVerify³"¤InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server. This is strongly discouraged. You should use the CABundle instead.² +boolean +ù +serviceí +V#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.ServiceReference"’Service is a reference to the service for this API server. It must communicate on port 443. If the Service is nil, that means the handling for the API groupversion is handled locally on this server. The call will simply delegate to the normal handler chain to be fulfilled. +X +versionM"@Version is the API version this server hosts. For example, "v1"² +string +ä +versionPriorityÐint32"ºVersionPriority controls the ordering of this API version inside of its group. Must be greater than zero. The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10). Since it's inside of a group, the number can be small, probably in the 10s. In case of equal version priorities, the version string will be used to compute the order inside a group. If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.² +integer +· +!io.k8s.api.core.v1.NodeSystemInfo‘ "CNodeSystemInfo is a set of ids/uuids to uniquely identify the node.š machineIDš +systemUUIDšbootIDš kernelVersionšosImagešcontainerRuntimeVersionškubeletVersionškubeProxyVersionšoperatingSystemš architecture² +objectÊ¢ +H +kubeProxyVersion4"'KubeProxy Version reported by the node.² +string +D +kubeletVersion2"%Kubelet Version reported by the node.² +string +ß + machineIDÑ"ÃMachineID reported by the node. For unique machine identification in the cluster this field is preferred. Learn more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html² +string +I +operatingSystem6")The Operating System reported by the node² +string +þ -metricName>"1metricName is the name of the metric in question.² +systemUUIDï"áSystemUUID reported by the node. For unique machine identification MachineID is preferred. This field is specific to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid² string -§ -metricSelector” -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"PmetricSelector is used to identify a specific time series within a given metric. -à -?io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerConditionÿ"eHorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.štypešstatus² -objectÊù -« -lastTransitionTime” -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"YlastTransitionTime is the last time the condition transitioned from one status to another -g -message\"Omessage is a human-readable explanation containing details about the transition² +n + kernelVersion]"PKernel Version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64).² string -P -reasonF"9reason is the reason for the condition's last transition.² +4 +bootID*"Boot ID reported by the node.² string -S -statusI" ::= - (Note that may be empty, from the "" case in .) - ::= 0 | 1 | ... | 9 ::= | ::= | . | . | . ::= "+" | "-" ::= | ::= | | ::= Ki | Mi | Gi | Ti | Pi | Ei - (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) - ::= m | "" | k | M | G | T | P | E - (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) - ::= "e" | "E" - -No matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities. - -When a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized. - -Before serializing, Quantity will be put in "canonical form". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that: - a. No precision is lost - b. No fractional digits will be emitted - c. The exponent (or suffix) is as large as possible. -The sign will be omitted unless the number is negative. - -Examples: - 1.5 will be serialized as "1500m" - 1.5Gi will be serialized as "1536Mi" - -Note that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise. - -Non-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.) - -This format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation.² +B + architecture2"%The Architecture reported by the node² string -­ -:io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpecî"_HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.šscaleTargetRefš maxReplicas² -objectÊß -ò - minReplicasâint32"ÌminReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.² -integer -† -scaleTargetRefó -H#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference"¦scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count. -® -behavior¡ -L#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior"Ðbehavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively). If not set, the default HPAScalingRules for scale up and scale down are used. -© - maxReplicas™int32"ƒmaxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.² -integer - -metricsõ"ªmetrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond. If not set, the default metric will be set to 80% average CPU utilization.² -arrayº; -9 -7#/definitions/io.k8s.api.autoscaling.v2beta2.MetricSpec -  -)io.k8s.api.storage.v1.VolumeNodeResourcesò"JVolumeNodeResources is a set of resource limits for scheduling of volumes.² -objectÊ— -” -countŠint32"ôMaximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is not specified, then the supported number of volumes on this node is unbounded.² -integer -µ -]io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatusÓ"ÅCustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza² -object -Ö -io.k8s.api.core.v1.VolumeDevice²"JvolumeDevice describes a mapping of a raw block device within a container.šnameš -devicePath² -objectÊà -l +¥ +>io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDRâ"ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match.š +clientCIDRš serverAddress² +objectʦ +€ -devicePath^"QdevicePath is the path inside of the container that the device will be mapped to.² +clientCIDRr"eThe CIDR with which clients can match their IP to figure out the server address that they should use.² string -S -nameK">name must match the name of a persistentVolumeClaim in the pod² +  + serverAddressŽ"€Address of this server, suitable for a client that matches the above CIDR. This can be a hostname, hostname:port, IP or IP:port.² string -¯ -io.k8s.api.rbac.v1.Subject"ÆSubject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.škindšname² -objectʪ -à -kind×"ÉKind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". If the Authorizer does not recognized the kind value, the Authorizer should report an error.² +Ô +(io.k8s.api.core.v1.DownwardAPIProjection§"™Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.² +objectÊ} +{ +itemsr")Items is a list of DownwardAPIVolume file² +arrayº: +8 +6#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile +‚ +*io.k8s.api.core.v1.DownwardAPIVolumeSourceÓ"“DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes support ownership management and SELinux relabeling.² +objectÊ® +¬ + defaultModeœint32"†Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.² +integer +} +itemst"+Items is a list of downward API volume file² +arrayº: +8 +6#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile +« +/io.k8s.api.core.v1.CinderPersistentVolumeSource÷"ëRepresents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.švolumeID² +objectÊï +Á +readOnly´"¥Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² +boolean +™ + secretRef‹ +0#/definitions/io.k8s.api.core.v1.SecretReference"WOptional: points to a secret object containing parameters used to connect to OpenStack. +† +volumeIDz"mvolume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² string -9 -name1"$Name of the object being referenced.² +ƒ +fsTypeø"êFilesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md² string +å +,io.k8s.api.flowcontrol.v1beta1.LimitResponse´"PLimitResponse defines how to handle requests that can not be executed right now.štype² +objectÊé à - namespaceµ"§Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty the Authorizer should report an error.² +queuing· +A#/definitions/io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration"r`queuing` holds the configuration parameters for queuing. This field may be non-empty only if `type` is `"Queue"`. +  +type—"‰`type` is "Queue" or "Reject". "Queue" means that requests that can not be executed upon arrival are held in a queue until they can be executed or a queuing limit is reached. "Reject" means that requests that can not be executed upon arrival are rejected. Required.² +stringú` +x-kubernetes-unionsIG- discriminator: type + fields-to-discriminateBy: + queuing: Queuing + +´ +Uio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionListÚ"KCustomResourceDefinitionList is a list of CustomResourceDefinition objects.šitems² +objectÊý +¾ + +apiVersion¯"¡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² string -à -apiGroup¶"¨APIGroup holds the API group of the referenced subject. Defaults to "" for ServiceAccount subjects. Defaults to "rbac.authorization.k8s.io" for User and Group subjects.² +² +items¨"6items list individual CustomResourceDefinition objects² +arrayºc +a +_#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition +¹ +kind°"¢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² string -ƒ -#io.k8s.api.apps.v1.DeploymentStatusÛ "HDeploymentStatus is the most recently observed status of the Deployment.² -objectÊ‚ -` -observedGenerationJint64"5The generation observed by the deployment controller.² -integer -] - readyReplicasLint32"7Total number of ready pods targeted by this deployment.² -integer -ƒ -replicaswint32"bTotal number of non-terminated pods targeted by this deployment (their labels match the selector).² -integer -Á -unavailableReplicas©int32"“Total number of unavailable pods targeted by this deployment. This is the total number of pods that are still required for the deployment to have 100% available capacity. They may either be pods that are running but not yet available or pods that still have not been created.² -integer -Œ -updatedReplicasyint32"dTotal number of non-terminated pods targeted by this deployment that have the desired template spec.² -integer -Š -availableReplicasuint32"`Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.² -integer -Þ -collisionCountËint32"µCount of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.² -integer -÷ +I +metadata= +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMetaúv +x-kubernetes-group-version-kindSQ- group: apiextensions.k8s.io + kind: CustomResourceDefinitionList + version: v1 -conditionsè"MRepresents the latest available observations of a deployment's current state.² -arrayº8 -6 -4#/definitions/io.k8s.api.apps.v1.DeploymentConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge +Ç -ì -+io.k8s.api.autoscaling.v2beta1.MetricStatus¼">MetricStatus describes the last-read state of a single metric.štype² -objectÊæ -Ë -containerResourceµ -J#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus"æcontainer resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -ô -externalç -A#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus"¡external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). - -object· -?#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus"tobject refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object). -• -podsŒ -=#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricStatus"Êpods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value. -™ -resourceŒ -A#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus"Æresource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the "pods" source. -¥ -typeœ"Žtype is the type of metric source. It will be one of "ContainerResource", "External", "Object", "Pods" or "Resource", each corresponds to a matching field in the object. Note: "ContainerResource" type is available on when the feature-gate HPAContainerMetrics is enabled² +(io.k8s.api.authentication.v1.TokenReviewš +"§TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.šspec² +objectÊñ +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta +~ +specv +:#/definitions/io.k8s.api.authentication.v1.TokenReviewSpec"8Spec holds information about the request being evaluated +¤ +status™ +<#/definitions/io.k8s.api.authentication.v1.TokenReviewStatus"YStatus is filled in by the server and indicates whether the request can be authenticated. +¾ + +apiVersion¯"¡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² string - -/io.k8s.api.autoscaling.v2beta2.PodsMetricSourceŽ"åPodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.šmetricštarget² -objectÊ… -ƒ -metricy -=#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier"8metric identifies the target metric by name and selector -} -targets -9#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget"6target specifies the target value for the given metric -ô -io.k8s.api.core.v1.NodeØ "iNode is a worker node in Kubernetes. Each node will have a unique identifier in the cache (i.e. in etcd).² -objectÊ +¹ +kind°"¢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² +stringúf +x-kubernetes-group-version-kindCA- version: v1 + group: authentication.k8s.io + kind: TokenReview -¿ -spec¶ -)#/definitions/io.k8s.api.core.v1.NodeSpec"ˆSpec defines the behavior of a node. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -ø -statusí -+#/definitions/io.k8s.api.core.v1.NodeStatus"½Most recently observed status of the node. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ª +9io.k8s.api.authorization.v1beta1.LocalSubjectAccessReviewì "çLocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.šspec² +objectÊò +ö +specí +F#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec"¢Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted. +¬ +status¡ +H#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus"UStatus is filled in by the server and indicates whether the request is allowed or not ¾ apiVersion¯"¡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² @@ -43318,16 +43450,39 @@ apiVersion ¹ kind°"¢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² string -Ò -metadataÅ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúL -x-kubernetes-group-version-kind)'- group: "" - kind: Node +K +metadata? +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMetaúw +x-kubernetes-group-version-kindTR- group: authorization.k8s.io + kind: LocalSubjectAccessReview + version: v1beta1 + +“ + +,io.k8s.api.core.v1.ReplicationControllerListâ "EReplicationControllerList is a collection of replication controllers.šitems² +objectÊ  +¹ +kind°"¢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² +string +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +¾ + +apiVersion¯"¡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² +string +Î +itemsÄ"{List of replication controllers. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller² +arrayº: +8 +6#/definitions/io.k8s.api.core.v1.ReplicationControllerúa +x-kubernetes-group-version-kind><- kind: ReplicationControllerList version: v1 + group: "" -… -io.k8s.api.core.v1.Serviceæ "çService is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy.² -objectÊ› +¾ +%io.k8s.api.extensions.v1beta1.Ingress”"‹Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc. DEPRECATED - This group version of Ingress is deprecated by networking.k8s.io/v1beta1 Ingress. See the release notes for more information.² +objectʘ ¾ @@ -43339,168 +43494,118 @@ apiVersion Ò metadataÅ =#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -Å -spec¼ -,#/definitions/io.k8s.api.core.v1.ServiceSpec"‹Spec defines the behavior of a service. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -þ -statusó -.#/definitions/io.k8s.api.core.v1.ServiceStatus"ÀMost recently observed status of the service. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúO -x-kubernetes-group-version-kind,*- group: "" - kind: Service - version: v1 +Ý +specÔ +7#/definitions/io.k8s.api.extensions.v1beta1.IngressSpec"˜Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ã +statusØ +9#/definitions/io.k8s.api.extensions.v1beta1.IngressStatus"šStatus is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusú\ +x-kubernetes-group-version-kind97- group: extensions + kind: Ingress + version: v1beta1 - -(io.k8s.api.networking.v1.HTTPIngressPathâ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² -objectÊØ +à +Nio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBoolq"oJSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property. +ø -’ -pathType…"÷PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is - done on a path element by element basis. A path element refers is the - list of labels in the path split by the '/' separator. A request is a - match for path p if every p is an element-wise prefix of p of the - request path. Note that if the last element of the path is a substring - of the last element in request path, it is not a match (e.g. /foo/bar - matches /foo/bar/baz, but does not match /foo/barbaz). -* ImplementationSpecific: Interpretation of the Path matching is up to - the IngressClass. Implementations can treat this as a separate PathType - or treat it identically to Prefix or Exact path types. -Implementations are required to support all path types.² -string -Ÿ -backend“ -5#/definitions/io.k8s.api.networking.v1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. -ž -path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² -string -´ -$io.k8s.api.networking.v1.IngressSpec‹";IngressSpec describes the Ingress the user wishes to exist.² -objectÊ¿ -§ -tlsŸ"´TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.² -arrayº5 -3 -1#/definitions/io.k8s.api.networking.v1.IngressTLSú# -x-kubernetes-list-type atomic +,io.k8s.apimachinery.pkg.runtime.RawExtensionÇ +"¹ +RawExtension is used to hold extensions in external versions. -ß -defaultBackendÌ -5#/definitions/io.k8s.api.networking.v1.IngressBackend"’DefaultBackend is the backend that should handle requests that don't match any rule. If Rules are not specified, DefaultBackend must be specified. If DefaultBackend is not set, the handling of requests that do not match any of the rules will be up to the Ingress controller. -´ -ingressClassNameŸ"‘IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.² -string -ù -rulesï"ƒA list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.² -arrayº6 -4 -2#/definitions/io.k8s.api.networking.v1.IngressRuleú# -x-kubernetes-list-type atomic +To use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types. -Š -*io.k8s.api.storage.v1.VolumeAttachmentSpecÛ"HVolumeAttachmentSpec is the specification of a VolumeAttachment request.šattacheršsourcešnodeName² -objectÊã -— -attacherŠ"}Attacher indicates the name of the volume driver that MUST handle this request. This is the name returned by GetPluginName().² -string -H -nodeName<"/The node that the volume should be attached to.² -string +// Internal package: type MyAPIObject struct { + runtime.TypeMeta `json:",inline"` + MyPlugin runtime.Object `json:"myPlugin"` +} type PluginA struct { + AOption string `json:"aOption"` } -sources -:#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSource"5Source represents the volume that should be attached. -µ -6io.k8s.api.authorization.v1beta1.NonResourceAttributesú"{NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface² -objectÊo -8 -path0"#Path is the URL path of the request² -string -3 -verb+"Verb is the standard HTTP verb² + +// External package: type MyAPIObject struct { + runtime.TypeMeta `json:",inline"` + MyPlugin runtime.RawExtension `json:"myPlugin"` +} type PluginA struct { + AOption string `json:"aOption"` +} + +// On the wire, the JSON will look something like this: { + "kind":"MyAPIObject", + "apiVersion":"v1", + "myPlugin": { + "kind":"PluginA", + "aOption":"foo", + }, +} + +So what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)² +object +õ + +io.k8s.api.batch.v1.CronJobSpecÑ +"YCronJobSpec describes how the job execution will look like and when it will actually run.šscheduleš jobTemplate² +objectÊÎ +Ç +startingDeadlineSeconds«int64"•Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.² +integer +— +successfulJobsHistoryLimityint32"dThe number of successful finished jobs to retain. Value must be non-negative integer. Defaults to 3.² +integer +  +suspend”"…This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.² +boolean +Ì +concurrencyPolicy¶"¨Specifies how to treat concurrent executions of a Job. Valid values are: - "Allow" (default): allows CronJobs to run concurrently; - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - "Replace": cancels currently running job and replaces it with a new one² string -Á ->io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehaviorþ"™HorizontalPodAutoscalerBehavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively).² -objectÊÓ -° - scaleDown¢ -<#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules"áscaleDown is scaling policy for scaling Down. If not set, the default value is to allow to scale down to minReplicas pods, with a 300 second stabilization window (i.e., the highest recommendation for the last 300sec is used). - -scaleUp‘ -<#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules"ÐscaleUp is scaling policy for scaling Up. If not set, the default value is the higher of: - * increase no more than 4 pods per 60 seconds - * double the number of pods per 60 seconds -No stabilization is used. -Æ -$io.k8s.api.core.v1.ISCSIVolumeSource "’Represents an ISCSI disk. ISCSI volumes can only be mounted as read/write once. ISCSI volumes support ownership management and SELinux relabeling.š targetPortalšiqnšlun² -objectÊÞ -¤ - targetPortal“"…iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² + +failedJobsHistoryLimituint32"`The number of failed finished jobs to retain. Value must be non-negative integer. Defaults to 1.² +integer +„ + jobTemplateu +1#/definitions/io.k8s.api.batch.v1.JobTemplateSpec"@Specifies the job that will be created when executing a CronJob. +] +scheduleQ"DThe schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.² string -V -chapAuthDiscoveryA"3whether support iSCSI Discovery CHAP authentication² -boolean -µ -fsTypeª"œFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi² +à +#io.k8s.api.batch.v1.JobTemplateSpec¸"QJobTemplateSpec describes the data a Job should have when created from a template² +objectÊÖ +ù +metadataì +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ªStandard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +× +specÎ +)#/definitions/io.k8s.api.batch.v1.JobSpec" Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +ø +"io.k8s.api.core.v1.RBDVolumeSourceÑ "ˆRepresents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management and SELinux relabeling.šmonitorsšimage² +objectʤ +‚ +userz"mThe rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -Ô - initiatorNameÂ"´Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection.² +³ +fsType¨"šFilesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd² string -4 -lun-int32"iSCSI Target Lun number.² -integer -k -readOnly_"QReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.² -boolean - - secretRefr -5#/definitions/io.k8s.api.core.v1.LocalObjectReference"9CHAP Secret for iSCSI target and initiator authentication -R -chapAuthSession?"1whether support iSCSI Session CHAP authentication² -boolean -0 -iqn)"Target iSCSI Qualified Name.² +r +imagei"\The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -n -iscsiInterface\"OiSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).² +« +keyringŸ"‘Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -³ -portals§"ŠiSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).² +Ž +monitors"eA collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² arrayº ² string -ò -"io.k8s.api.core.v1.PodTemplateListË"*PodTemplateList is a list of PodTemplates.šitems² -objectÊ® -¾ - -apiVersion¯"¡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² -string -] -itemsT"List of pod templates² -arrayº0 -. -,#/definitions/io.k8s.api.core.v1.PodTemplate -¹ -kind°"¢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² +€ +poolx"kThe rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúW -x-kubernetes-group-version-kind42- version: v1 - group: "" - kind: PodTemplateList - +´ +readOnly§"˜ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it² +boolean +ù + secretRefë +5#/definitions/io.k8s.api.core.v1.LocalObjectReference"±SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it  *io.k8s.api.discovery.v1beta1.EndpointSliceà"ÜEndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.š addressTypeš endpoints² objectÊí -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. -© -portsŸ"®ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates "all ports". Each slice may include a maximum of 100 ports.² -arrayº; -9 -7#/definitions/io.k8s.api.discovery.v1beta1.EndpointPortú# -x-kubernetes-list-type atomic - ð addressTypeà"ÒaddressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.² string @@ -43517,196 +43622,60 @@ apiVersion ¹ kind°"¢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² -stringúh +string +h +metadata\ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. +© +portsŸ"®ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates "all ports". Each slice may include a maximum of 100 ports.² +arrayº; +9 +7#/definitions/io.k8s.api.discovery.v1beta1.EndpointPortú# +x-kubernetes-list-type atomic +úh x-kubernetes-group-version-kindEC- version: v1beta1 group: discovery.k8s.io kind: EndpointSlice -‹ -&io.k8s.api.flowcontrol.v1beta1.Subjectà"´Subject matches the originator of a request, as identified by the request authentication system. There are three ways of matching an originator; by user, group, or service account.škind² -objectÊ -B -user: -8#/definitions/io.k8s.api.flowcontrol.v1beta1.UserSubject -D -group; -9#/definitions/io.k8s.api.flowcontrol.v1beta1.GroupSubject - -kind"Required² -string -V -serviceAccountD -B#/definitions/io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubjectúŽ -x-kubernetes-unionswu- discriminator: kind - fields-to-discriminateBy: - group: Group - serviceAccount: ServiceAccount - user: User - -Ö -.io.k8s.api.policy.v1.PodDisruptionBudgetStatus£"ŠPodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.šdisruptionsAllowedšcurrentHealthyšdesiredHealthyš expectedPods² -objectÊÁ -[ - expectedPodsKint32"6total number of pods counted by this disruption budget² -integer -â -observedGenerationËint64"µMost recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.² -integer -ô - -conditionså"ôConditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute - the number of allowed disruptions. Therefore no disruptions are - allowed and the status of the condition will be False. -- InsufficientPods: The number of pods are either at or below the number - required by the PodDisruptionBudget. No disruptions are - allowed and the status of the condition will be False. -- SufficientPods: There are more pods than required by the PodDisruptionBudget. - The condition will be True, and the number of allowed - disruptions are provided by the disruptionsAllowed property.² -arrayº@ -> -<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Conditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap -ú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - -E -currentHealthy3int32"current number of healthy pods² -integer -M -desiredHealthy;int32"&minimum desired number of healthy pods² -integer - - disruptedPodsû"¯DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.ª; -9 -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time² -object -` -disruptionsAllowedJint32"5Number of pod disruptions that are currently allowed.² -integer -š -(io.k8s.api.storage.v1beta1.CSIDriverListí"3CSIDriverList is a collection of CSIDriver objects.šitems² -objectʸ -¾ - -apiVersion¯"¡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² -string -l -itemsc"items is the list of CSIDriver² -arrayº6 -4 -2#/definitions/io.k8s.api.storage.v1beta1.CSIDriver -¹ -kind°"¢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² -string -Ê -metadata½ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúf -x-kubernetes-group-version-kindCA- kind: CSIDriverList - version: v1beta1 - group: storage.k8s.io - -á -&io.k8s.api.core.v1.ComponentStatusList¶ "Status of all the conditions for the component as a list of ComponentStatus objects. Deprecated: This API is deprecated in v1.19+šitems² -objectʽ -¾ - -apiVersion¯"¡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² -string -l -itemsc" List of ComponentStatus objects.² -arrayº4 -2 -0#/definitions/io.k8s.api.core.v1.ComponentStatus -¹ -kind°"¢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² -string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsú[ -x-kubernetes-group-version-kind86- kind: ComponentStatusList - version: v1 - group: "" - -ä -io.k8s.api.core.v1.PodDNSConfigÀ"_PodDNSConfig defines the DNS parameters of a pod in addition to those generated from DNSPolicy.² -objectÊÐ -Ä - nameservers´"—A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed.² -arrayº - ² -string -µ -options©"âA list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy.² -arrayº7 -5 -3#/definitions/io.k8s.api.core.v1.PodDNSConfigOption -Î -searchesÁ"¤A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed.² +µ +#io.k8s.api.networking.v1.IngressTLS"MIngressTLS describes the transport layer security associated with an Ingress.² +objectʯ +À +hosts¶"óHosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.² arrayº ² +stringú# +x-kubernetes-list-type atomic + +é + +secretNameÚ"ÌSecretName is the name of the secret used to terminate TLS traffic on port 443. Field is left optional to allow TLS routing based on SNI hostname alone. If the SNI host in a listener conflicts with the "Host" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.² string -£ -io.k8s.api.core.v1.PodList„ "PodList is a list of Pods.šitems² -objectÊÿ +® +"io.k8s.api.rbac.v1.RoleBindingList‡"/RoleBindingList is a collection of RoleBindingsšitems² +objectÊÎ ¾ apiVersion¯"¡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² string -­ -items£"lList of pods. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md² -arrayº( -& -$#/definitions/io.k8s.api.core.v1.Pod +g +items^"Items is a list of RoleBindings² +arrayº0 +. +,#/definitions/io.k8s.api.rbac.v1.RoleBinding ¹ kind°"¢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² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsúO -x-kubernetes-group-version-kind,*- group: "" - kind: PodList +f +metadataZ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.ún +x-kubernetes-group-version-kindKI- group: rbac.authorization.k8s.io + kind: RoleBindingList version: v1 -½ -Wio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionStatusá"RCustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition² -objectÊþ -Ü -storedVersionsÉ"¬storedVersions lists all versions of CustomResources that were ever persisted. Tracking these versions allows a migration path for stored versions in etcd. The field is mutable so a migration controller can finish a migration to another version (ensuring no old objects are left in storage), and then remove the rest of the versions from this list. Versions may not be removed from `spec.versions` while they exist in this list.² -arrayº - ² -string -ô - acceptedNamesâ -d#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames"zacceptedNames are the names that are actually being used to serve discovery. They may be different than the names in spec. -¥ - -conditions–"Nconditions indicate state for particular aspects of a CustomResourceDefinition² -arrayºl -j -h#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionConditionú' -x-kubernetes-list-map-keys - type -ú -x-kubernetes-list-typemap - å 2io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails® "éStatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.² objectʳ -¥ -uid"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids² -string -à -causesÕ"ƒThe Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.² -arrayºB -@ ->#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause -b -groupY"LThe group attribute of the resource associated with the status StatusReason.² -string  kind„"öThe kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² string @@ -43716,78 +43685,43 @@ b — retryAfterSecondsint32"ëIf specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.² integer -Æ -#io.k8s.api.core.v1.SecretProjectionž"Adapts a secret into a projected volume. - -The contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.² -objectÊÿ -¤ -itemsš"ÜIf unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.² -arrayº. -, -*#/definitions/io.k8s.api.core.v1.KeyToPath -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +¥ +uid"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids² string -O -optionalC"5Specify whether the Secret or its key must be defined² -boolean -´ -io.k8s.api.rbac.v1.RoleBinding‘ "·RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.šroleRef² -objectÊÑ -¾ - -apiVersion¯"¡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² +à +causesÕ"ƒThe Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.² +arrayºB +@ +>#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause +b +groupY"LThe group attribute of the resource associated with the status StatusReason.² string +ˆ +%io.k8s.api.apps.v1.ControllerRevisionÞ"±ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.šrevision² +objectʱ ¹ kind°"¢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² string -h -metadata\ -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object's metadata. -à -roleRefÔ -(#/definitions/io.k8s.api.rbac.v1.RoleRef"§RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error. -„ -subjectsx"=Subjects holds references to the objects the role applies to.² -arrayº, -* -(#/definitions/io.k8s.api.rbac.v1.Subjectúj -x-kubernetes-group-version-kindGE- group: rbac.authorization.k8s.io - kind: RoleBinding - version: v1 - -È -Sio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBoolq"oJSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property. -Ì -2io.k8s.api.authorization.v1.SelfSubjectRulesReview•"ˆSelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.šspec² -objectÊ -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -Š -spec -D#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReviewSpec"9Spec holds information about the request being evaluated. -§ -statusœ -B#/definitions/io.k8s.api.authorization.v1.SubjectRulesReviewStatus"VStatus is filled in by the server and indicates the set of actions a user can perform. +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +b +revisionVint64"ARevision indicates the revision of the state represented by Data.² +integer ¾ apiVersion¯"¡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² string -¹ -kind°"¢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² -stringúp -x-kubernetes-group-version-kindMK- group: authorization.k8s.io - kind: SelfSubjectRulesReview +y +dataq +:#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension"3Data is the serialized representation of the state.ú\ +x-kubernetes-group-version-kind97- group: apps + kind: ControllerRevision version: v1 Þ io.k8s.api.core.v1.ContainerPort¹">ContainerPort represents a network port in a single container.š containerPort² objectÊÚ -ˆ - containerPortwint32"bNumber of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.² -integer A hostIP7"*What host IP to bind the external port to.² string @@ -43800,394 +43734,460 @@ A Y protocolM"@Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".² string -‚ -'io.k8s.api.core.v1.ResourceRequirementsÖ"AResourceRequirements describes the compute resource requirements.² -objectÊ„ -ö -limitsë"›Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -ˆ -requestsû"«Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ª? -= -;#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity² -object -Ê -#io.k8s.api.apps.v1.ReplicaSetStatus¢"?ReplicaSetStatus represents the current status of a ReplicaSet.šreplicas² -objectÊÇ -Ø -replicasËint32"µReplicas is the most recently oberved number of replicas. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#what-is-a-replicationcontroller² -integer -… -availableReplicaspint32"[The number of available replicas (ready for at least minReadySeconds) for this replica set.² -integer -ø - -conditionsé"NRepresents the latest available observations of a replica set's current state.² -arrayº8 -6 -4#/definitions/io.k8s.api.apps.v1.ReplicaSetConditionú' -x-kubernetes-patch-merge-keytype -ú' -x-kubernetes-patch-strategymerge - -‹ -fullyLabeledReplicassint32"^The number of pods that have labels matching the labels of the pod template of the replicaset.² -integer - -observedGenerationiint64"TObservedGeneration reflects the generation of the most recently observed ReplicaSet.² -integer -X - readyReplicasGint32"2The number of ready replicas for this replica set.² +ˆ + containerPortwint32"bNumber of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.² integer -Œ -&io.k8s.api.storage.v1.VolumeAttachmentá "—VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node. +¨ -VolumeAttachment objects are non-namespaced.šspec² -objectÊÊ -Ð -statusÅ -:#/definitions/io.k8s.api.storage.v1.VolumeAttachmentStatus"†Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher. +1io.k8s.api.storage.v1beta1.CSIStorageCapacityListò "ECSIStorageCapacityList is a collection of CSIStorageCapacity objects.šitems² +objectÊ¢ ¾ apiVersion¯"¡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² string -¹ -kind°"¢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² -string -Ð -metadataà -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata -¤ -spec› -8#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSpec"_Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system.úd -x-kubernetes-group-version-kindA?- version: v1 - group: storage.k8s.io - kind: VolumeAttachment - -ð -"io.k8s.api.core.v1.PodAffinityTermÉ "ßDefines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is runningš topologyKey² -objectÊÊ - -ö - topologyKeyæ"ØThis pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.² -string -Ž - labelSelector} -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"9A label query over a set of resources, in this case pods. -õ -namespaceSelectorß -@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector"šA label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled. -Å - -namespaces¶"™namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace"² -arrayº - ² -string -Å -\io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScaleä "^CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.šspecReplicasPathšstatusReplicasPath² -objectÊÍ -á -labelSelectorPathË"½labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.² -string -ã -specReplicasPathÎ"ÀspecReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.² -string -€ -statusReplicasPathé"ÛstatusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.² -string -œ -io.k8s.api.core.v1.EnvVarSourceø"']`, `metadata.annotations['']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. -¤ -resourceFieldRef -6#/definitions/io.k8s.api.core.v1.ResourceFieldSelector"ÔSelects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. -v - secretKeyReff -2#/definitions/io.k8s.api.core.v1.SecretKeySelector"0Selects a key of a secret in the pod's namespace -i -configMapKeyRefV -5#/definitions/io.k8s.api.core.v1.ConfigMapKeySelector"Selects a key of a ConfigMap. -½ --io.k8s.api.networking.v1beta1.HTTPIngressPath‹ "oHTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.šbackend² -objectÊ -¤ -backend˜ -:#/definitions/io.k8s.api.networking.v1beta1.IngressBackend"ZBackend defines the referenced service endpoint to which the traffic will be forwarded to. -ž -path•"‡Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional "path" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.² -string -¶ -pathType©"›PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is - done on a path element by element basis. A path element refers is the - list of labels in the path split by the '/' separator. A request is a - match for path p if every p is an element-wise prefix of p of the - request path. Note that if the last element of the path is a substring - of the last element in request path, it is not a match (e.g. /foo/bar - matches /foo/bar/baz, but does not match /foo/barbaz). -* ImplementationSpecific: Interpretation of the Path matching is up to - the IngressClass. Implementations can treat this as a separate PathType - or treat it identically to Prefix or Exact path types. -Implementations are required to support all path types. Defaults to ImplementationSpecific.² -string -Ø -)io.k8s.api.rbac.v1.ClusterRoleBindingListª"=ClusterRoleBindingList is a collection of ClusterRoleBindingsšitems² -objectÊÜ -¾ +Õ +itemsË"0Items is the list of CSIStorageCapacity objects.² +arrayº? += +;#/definitions/io.k8s.api.storage.v1beta1.CSIStorageCapacityú' +x-kubernetes-list-map-keys - name +ú +x-kubernetes-list-typemap -apiVersion¯"¡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² -string -u -itemsl"&Items is a list of ClusterRoleBindings² -arrayº7 -5 -3#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding ¹ kind°"¢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² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.úu -x-kubernetes-group-version-kindRP- group: rbac.authorization.k8s.io - kind: ClusterRoleBindingList - version: v1 - -ý +Ê +metadata½ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"~Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataúo +x-kubernetes-group-version-kindLJ- group: storage.k8s.io + kind: CSIStorageCapacityList + version: v1beta1 -io.k8s.api.rbac.v1.PolicyRuleÛ -"¡PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.šverbs² -objectÊ  -¨ - resourceNames–"zResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.² -arrayº - ² -string -† - resourcesy"]Resources is a list of resources this rule applies to. ResourceAll represents all resources.² -arrayº - ² -string -´ -verbsª"Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.² -arrayº - ² -string -ó - apiGroupså"ÈAPIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.² -arrayº - ² +¬ ++io.k8s.apimachinery.pkg.apis.meta.v1.Statusü"CStatus is a return value for calls that don't return other objects.² +objectÊ× +U +messageJ"=A human-readable description of the status of this operation.² string -¼ -nonResourceURLs¨"‹NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.² -arrayº - ² +Ï +metadata +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +ä +reasonÙ"ËA machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.² +string +À +statusµ"§Status of the operation. One of: "Success" or "Failure". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status² string -Æ -)io.k8s.api.authentication.v1.TokenRequest˜":TokenRequest requests a token for a given service account.šspec² -objectÊÜ ¾ apiVersion¯"¡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² string +V +codeNint32"9Suggested HTTP return code for this status, 0 if not set.² +integer +¬ +details  +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails"ÛExtended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type. ¹ kind°"¢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² -string -K -metadata? -=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta -E -spec= -;#/definitions/io.k8s.api.authentication.v1.TokenRequestSpec -I -status? -=#/definitions/io.k8s.api.authentication.v1.TokenRequestStatusúg -x-kubernetes-group-version-kindDB- kind: TokenRequest +stringúN +x-kubernetes-group-version-kind+)- group: "" + kind: Status version: v1 - group: authentication.k8s.io -É -.io.k8s.api.authentication.v1.TokenReviewStatus–"DTokenReviewStatus is the result of the token authentication request.² -objectÊÁ -w -usero -3#/definitions/io.k8s.api.authentication.v1.UserInfo"8User is the UserInfo associated with the provided token. -’ - audiences„"çAudiences are audience identifiers chosen by the authenticator that are compatible with both the TokenReview and token. An identifier is any identifier in the intersection of the TokenReviewSpec audiences and the token's audiences. A client of the TokenReview API that sets the spec.audiences field should validate that a compatible audience identifier is returned in the status.audiences field to ensure that the TokenReview server is audience aware. If a TokenReview returns an empty status.audience field where status.authenticated is "true", the token is valid against the audience of the Kubernetes API server.² + +-io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpecë "GFlowSchemaSpec describes how the FlowSchema's specification looks like.špriorityLevelConfiguration² +objectÊö + +ô +rulesê"ì`rules` describes which requests will match this flow schema. This FlowSchema matches a request if and only if at least one member of rules matches the request. if it is an empty slice, there will be no requests matching the FlowSchema.² +arrayºH +F +D#/definitions/io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjectsú# +x-kubernetes-list-type atomic + +¦ +distinguisherMethodŽ +D#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod"Å`distinguisherMethod` defines how to compute the flow distinguisher for requests that match this schema. `nil` specifies that the distinguisher is disabled and thus will always be the empty string. + +matchingPrecedenceøint32"â`matchingPrecedence` is used to choose among the FlowSchemas that match a given request. The chosen FlowSchema is among those with the numerically lowest (which we take to be logically highest) MatchingPrecedence. Each MatchingPrecedence value must be ranged in [1,10000]. Note that if the precedence is not specified, it will be set to 1000 as default.² +integer +Á +priorityLevelConfiguration¢ +P#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference"Í`priorityLevelConfiguration` should reference a PriorityLevelConfiguration in the cluster. If the reference cannot be resolved, the FlowSchema will be ignored and marked as invalid in its status. Required. +” +(io.k8s.api.networking.v1beta1.IngressTLSç"MIngressTLS describes the transport layer security associated with an Ingress.² +objectʉ +š +hosts"óHosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.² arrayº ² string -g - authenticatedV"HAuthenticated indicates that the token was associated with a known user.² -boolean -H -error?"2Error indicates that the token couldn't be checked² -string -Î -7io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec’"¦SelfSubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set² -objectÊÚ -ª -nonResourceAttributes -?#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes"MNonResourceAttributes describes information for a non-resource access request -ª -resourceAttributes“ -<#/definitions/io.k8s.api.authorization.v1.ResourceAttributes"SResourceAuthorizationAttributes describes information for a resource access request -Ä -"io.k8s.api.core.v1.ObjectReference "]ObjectReference contains enough information to let you inspect or modify the referred object.² -objectʯ -æ -resourceVersionÒ"ÄSpecific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency² -string - -uidz"mUID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids² -string -7 +é -apiVersion)"API version of the referent.² +secretNameÚ"ÌSecretName is the name of the secret used to terminate TLS traffic on port 443. Field is left optional to allow TLS routing based on SNI hostname alone. If the SNI host in a listener conflicts with the "Host" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.² string -Ô - fieldPathÆ"¸If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object.² +¾ +io.k8s.api.core.v1.PodAffinity› "?Pod affinity is a group of inter pod affinity scheduling rules.² +objectÊË + +ì +/preferredDuringSchedulingIgnoredDuringExecution¸"ìThe scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.² +arrayº< +: +8#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm +Ù +.requiredDuringSchedulingIgnoredDuringExecution¦"âIf the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.² +arrayº4 +2 +0#/definitions/io.k8s.api.core.v1.PodAffinityTerm +¯ +io.k8s.api.rbac.v1.Subject"ÆSubject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.škindšname² +objectʪ +9 +name1"$Name of the object being referenced.² string -— -kindŽ"€Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds² +à + namespaceµ"§Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty the Authorizer should report an error.² string -„ -name|"oName of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names² +à +apiGroup¶"¨APIGroup holds the API group of the referenced subject. Defaults to "" for ServiceAccount subjects. Defaults to "rbac.authorization.k8s.io" for User and Group subjects.² string -Ž - namespace€"sNamespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/² +à +kind×"ÉKind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". If the Authorizer does not recognized the kind value, the Authorizer should report an error.² string -‚ - io.k8s.api.rbac.v1beta1.RoleListÝ"RoleList is a collection of Roles Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleList, and will no longer be served in v1.22.šitems² -objectÊÅ +« +)io.k8s.api.apps.v1.ControllerRevisionListý"UControllerRevisionList is a resource containing a list of ControllerRevision objects.šitems² +objectʬ ¾ apiVersion¯"¡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² string -^ -itemsU"Items is a list of Roles² -arrayº. -, -*#/definitions/io.k8s.api.rbac.v1beta1.Role +w +itemsn"(Items is the list of ControllerRevisions² +arrayº7 +5 +3#/definitions/io.k8s.api.apps.v1.ControllerRevision ¹ kind°"¢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² string -f -metadataZ -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"Standard object's metadata.úl -x-kubernetes-group-version-kindIG- group: rbac.authorization.k8s.io - kind: RoleList - version: v1beta1 - -¤ +³ +metadata¦ +;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"gMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataú` +x-kubernetes-group-version-kind=;- group: apps + kind: ControllerRevisionList + version: v1 -Iio.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationListÖ "KMutatingWebhookConfigurationList is a list of MutatingWebhookConfiguration.šitems² -objectÊç -¾ +† +3io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSourceÎ +"¡Represents a Persistent Disk resource in AWS. -apiVersion¯"¡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² +An AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling.švolumeID² +objectÊ +Ä +fsType¹"«Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² string -• -items‹"%List of MutatingWebhookConfiguration.² -arrayºW -U -S#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration -¹ -kind°"¢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² +¨ + partitionšint32"„The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).² +integer +ä +readOnly×"ÈSpecify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² +boolean +´ +volumeID§"™Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore² string -Ï -metadata -;#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"‚Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsú‡ -x-kubernetes-group-version-kinddb- group: admissionregistration.k8s.io - kind: MutatingWebhookConfigurationList - version: v1beta1 +ð +!io.k8s.api.core.v1.ClientIPConfigÊ"QClientIPConfig represents the configurations of Client IP based session affinity.² +objectÊè +å +timeoutSecondsÒint32"¼timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP". Default value is 10800(for 3 hours).² +integer +ò, +2io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions»,":DeleteOptions may be provided when deleting an API object.² +objectÊ‹ +¾ -¬ -;io.k8s.api.admissionregistration.v1beta1.RuleWithOperationsì "‚RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.² -objectÊØ -¼ - apiVersions¬"APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.² -arrayº - ² +apiVersion¯"¡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² string   - -operations‘"ôOperations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.² +dryRun•"øWhen present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed² arrayº ² string -– - resourcesˆ"ëResources is a list of resources this rule applies to. - -For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. - -If wildcard is present, the validation rule will ensure resources do not overlap with each other. +Þ +gracePeriodSecondsÇint64"±The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.² +integer +¹ +kind°"¢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² +string +Ä +orphanDependents¯" Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.² +boolean + + preconditions° +@#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions"lMust be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned. +û +propagationPolicyå"×Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.² +stringúá +x-kubernetes-group-version-kind½º- group: "" + kind: DeleteOptions + version: v1 +- group: admission.k8s.io + kind: DeleteOptions + version: v1 +- version: v1beta1 + group: admission.k8s.io + kind: DeleteOptions +- group: admissionregistration.k8s.io + kind: DeleteOptions + version: v1 +- group: admissionregistration.k8s.io + kind: DeleteOptions + version: v1beta1 +- kind: DeleteOptions + version: v1 + group: apiextensions.k8s.io +- group: apiextensions.k8s.io + kind: DeleteOptions + version: v1beta1 +- group: apiregistration.k8s.io + kind: DeleteOptions + version: v1 +- kind: DeleteOptions + version: v1beta1 + group: apiregistration.k8s.io +- version: v1 + group: apps + kind: DeleteOptions +- group: apps + kind: DeleteOptions + version: v1beta1 +- group: apps + kind: DeleteOptions + version: v1beta2 +- group: authentication.k8s.io + kind: DeleteOptions + version: v1 +- group: authentication.k8s.io + kind: DeleteOptions + version: v1beta1 +- version: v1 + group: authorization.k8s.io + kind: DeleteOptions +- group: authorization.k8s.io + kind: DeleteOptions + version: v1beta1 +- group: autoscaling + kind: DeleteOptions + version: v1 +- group: autoscaling + kind: DeleteOptions + version: v2beta1 +- version: v2beta2 + group: autoscaling + kind: DeleteOptions +- group: batch + kind: DeleteOptions + version: v1 +- group: batch + kind: DeleteOptions + version: v1beta1 +- group: certificates.k8s.io + kind: DeleteOptions + version: v1 +- kind: DeleteOptions + version: v1beta1 + group: certificates.k8s.io +- group: coordination.k8s.io + kind: DeleteOptions + version: v1 +- group: coordination.k8s.io + kind: DeleteOptions + version: v1beta1 +- kind: DeleteOptions + version: v1 + group: discovery.k8s.io +- group: discovery.k8s.io + kind: DeleteOptions + version: v1beta1 +- group: events.k8s.io + kind: DeleteOptions + version: v1 +- group: events.k8s.io + kind: DeleteOptions + version: v1beta1 +- kind: DeleteOptions + version: v1beta1 + group: extensions +- version: v1alpha1 + group: flowcontrol.apiserver.k8s.io + kind: DeleteOptions +- group: flowcontrol.apiserver.k8s.io + kind: DeleteOptions + version: v1beta1 +- group: imagepolicy.k8s.io + kind: DeleteOptions + version: v1alpha1 +- group: internal.apiserver.k8s.io + kind: DeleteOptions + version: v1alpha1 +- kind: DeleteOptions + version: v1 + group: networking.k8s.io +- kind: DeleteOptions + version: v1beta1 + group: networking.k8s.io +- group: node.k8s.io + kind: DeleteOptions + version: v1 +- group: node.k8s.io + kind: DeleteOptions + version: v1alpha1 +- group: node.k8s.io + kind: DeleteOptions + version: v1beta1 +- kind: DeleteOptions + version: v1 + group: policy +- version: v1beta1 + group: policy + kind: DeleteOptions +- group: rbac.authorization.k8s.io + kind: DeleteOptions + version: v1 +- version: v1alpha1 + group: rbac.authorization.k8s.io + kind: DeleteOptions +- version: v1beta1 + group: rbac.authorization.k8s.io + kind: DeleteOptions +- kind: DeleteOptions + version: v1 + group: scheduling.k8s.io +- group: scheduling.k8s.io + kind: DeleteOptions + version: v1alpha1 +- version: v1beta1 + group: scheduling.k8s.io + kind: DeleteOptions +- group: storage.k8s.io + kind: DeleteOptions + version: v1 +- group: storage.k8s.io + kind: DeleteOptions + version: v1alpha1 +- group: storage.k8s.io + kind: DeleteOptions + version: v1beta1 -Depending on the enclosing object, subresources might not be allowed. Required.² -arrayº - ² +“ +io.k8s.api.events.v1.Eventô"¾Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.š eventTime² +objectʽ + +reportingInstance¬"žreportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.² string -£ -scope™"‹scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".² +Ì +actionÁ"³action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field cannot be empty for new Events and it can have at most 128 characters.² string -´ - apiGroups¦"‰APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.² -arrayº - ² +¹ +kind°"¢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² string -ã -Bio.k8s.api.certificates.v1beta1.CertificateSigningRequestConditionœštype² -objectʆ -| -lastUpdateTimej -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"/timestamp for the last update to this condition -S -messageH";human readable message with details about the request state² +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ñ +relatedÅ +0#/definitions/io.k8s.api.core.v1.ObjectReference"related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object. +¹ +reportingController¡"“reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.² string -9 -reason/""brief reason for the request state² +ˆ +deprecatedCountuint32"`deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.² +integer +¦ +deprecatedSource‘ +,#/definitions/io.k8s.api.core.v1.EventSource"adeprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. +¤ +reason™"‹reason is why the action was taken. It is human-readable. This field cannot be empty for new Events and it can have at most 128 characters.² string -Ò -statusÇ"¹Status of the condition, one of True, False, Unknown. Approved, Denied, and Failed conditions may not be "False" or "Unknown". Defaults to "True". If unset, should be treated as "True".² +š +series +.#/definitions/io.k8s.api.events.v1.EventSeries"]series is data about the Event series this event represents or nil if it's a singleton Event. +¾ + +apiVersion¯"¡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² string -h -type`"Stype of the condition. Known conditions include "Approved", "Denied", and "Failed".² +— + eventTime‰ +<#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime"IeventTime is the time when this Event was first observed. It is required. +½ +note´"¦note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.² string ¶ -lastTransitionTimeŸ -7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ãlastTransitionTime is the time the condition last transitioned from one status to another. If unset, when a new condition type is added or an existing condition's status is changed, the server defaults this to the current time. -Ò -4io.k8s.api.core.v1.ScopedResourceSelectorRequirement™"A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.š scopeNamešoperator² -objectÊà -ƒ -operatorw"jRepresents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.² + regarding¨ +0#/definitions/io.k8s.api.core.v1.ObjectReference"óregarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object. +³ +typeª"œtype is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable. This field cannot be empty for new Events.² string +Á +deprecatedFirstTimestamp¤ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"ideprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. +¿ +deprecatedLastTimestamp£ +7#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time"hdeprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type.úX +x-kubernetes-group-version-kind53- kind: Event + version: v1 + group: events.k8s.io + +² +,io.k8s.api.storage.v1.VolumeAttachmentSource"ÝVolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.² +objectÊ’ +À +inlineVolumeSpec« +5#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec"ñinlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is beta-level and is only honored by servers that enabled the CSIMigration feature. M - scopeName@"3The name of the scope that the selector applies to.² -string -ˆ -valuesý"àAn array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.² -arrayº - ² -string -í -Nio.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ServiceReferenceš";ServiceReference holds a reference to Service.legacy.k8s.ioš namespacešname² -objectÊ» -> -name6")name is the name of the service. Required² +persistentVolumeName5"(Name of the persistent volume to attach.² string -M - namespace@"3namespace is the namespace of the service. Required² +œ +io.k8s.api.core.v1.EnvVarSourceø"']`, `metadata.annotations['']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. +¤ +resourceFieldRef +6#/definitions/io.k8s.api.core.v1.ResourceFieldSelector"ÔSelects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. +v + secretKeyReff +2#/definitions/io.k8s.api.core.v1.SecretKeySelector"0Selects a key of a secret in the pod's namespace +ã +io.k8s.api.core.v1.Namespace "MNamespace provides a scope for Names. Use of multiple namespaces is optional.² +objectÊ + +â +status× +0#/definitions/io.k8s.api.core.v1.NamespaceStatus"¢Status describes the current status of a Namespace. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status +¾ + +apiVersion¯"¡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² string -Y -pathQ"Dpath is an optional URL path at which the webhook will be contacted.² +¹ +kind°"¢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² string -Î -portÅint32"¯port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.² -integerb +Ò +metadataÅ +=#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"ƒStandard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata +Ö +specÍ +.#/definitions/io.k8s.api.core.v1.NamespaceSpec"šSpec defines the behavior of the Namespace. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusúQ +x-kubernetes-group-version-kind.,- group: "" + kind: Namespace + version: v1 +b  BearerTokenjO M diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go index 4f4ec3e4a..49647be4b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go @@ -11,7 +11,6 @@ import ( "compress/gzip" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -215,7 +214,7 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + err = os.WriteFile(_filePath(dir, name), data, info.Mode()) if err != nil { return err } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go index 475905b19..41ee0afc5 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go @@ -6,12 +6,13 @@ package openapi import ( "encoding/json" "fmt" - "io/ioutil" + "os" "path/filepath" "reflect" "strings" + "sync" - openapi_v2 "github.com/google/gnostic/openapiv2" + openapi_v2 "github.com/google/gnostic-models/openapiv2" "google.golang.org/protobuf/proto" "k8s.io/kube-openapi/pkg/validation/spec" "sigs.k8s.io/kustomize/kyaml/errors" @@ -21,14 +22,37 @@ import ( k8syaml "sigs.k8s.io/yaml" ) -// globalSchema contains global state information about the openapi -var globalSchema openapiData +var ( + // schemaLock is the lock for schema related globals. + // + // NOTE: This lock helps with preventing panics that might occur due to the data + // race that concurrent access on this variable might cause but it doesn't + // fully fix the issue described in https://github.com/kubernetes-sigs/kustomize/issues/4824. + // For instance concurrently running goroutines where each of them calls SetSchema() + // and/or GetSchemaVersion might end up received nil errors (success) whereas the + // seconds one would overwrite the global variable that has been written by the + // first one. + schemaLock sync.RWMutex //nolint:gochecknoglobals + + // kubernetesOpenAPIVersion specifies which builtin kubernetes schema to use. + kubernetesOpenAPIVersion string //nolint:gochecknoglobals + + // globalSchema contains global state information about the openapi + globalSchema openapiData //nolint:gochecknoglobals + + // customSchemaFile stores the custom OpenApi schema if it is provided + customSchema []byte //nolint:gochecknoglobals +) -// kubernetesOpenAPIVersion specifies which builtin kubernetes schema to use -var kubernetesOpenAPIVersion string +// schemaParseStatus is used in cases when a schema should be parsed, but the +// parsing may be delayed to a later time. +type schemaParseStatus uint32 -// customSchemaFile stores the custom OpenApi schema if it is provided -var customSchema []byte +const ( + schemaNotParsed schemaParseStatus = iota + schemaParseDelayed + schemaParsed +) // openapiData contains the parsed openapi state. this is in a struct rather than // a list of vars so that it can be reset from tests. @@ -43,13 +67,17 @@ type openapiData struct { // is namespaceable or not namespaceabilityByResourceType map[yaml.TypeMeta]bool - // noUseBuiltInSchema stores whether we want to prevent using the built-n + // noUseBuiltInSchema stores whether we want to prevent using the built-in // Kubernetes schema as part of the global schema noUseBuiltInSchema bool // schemaInit stores whether or not we've parsed the schema already, // so that we only reparse the when necessary (to speed up performance) schemaInit bool + + // defaultBuiltInSchemaParseStatus stores the parse status of the default + // built-in schema. + defaultBuiltInSchemaParseStatus schemaParseStatus } type format string @@ -104,7 +132,7 @@ var precomputedIsNamespaceScoped = map[yaml.TypeMeta]bool{ {APIVersion: "node.k8s.io/v1beta1", Kind: "RuntimeClass"}: false, {APIVersion: "policy/v1", Kind: "PodDisruptionBudget"}: true, {APIVersion: "policy/v1beta1", Kind: "PodDisruptionBudget"}: true, - {APIVersion: "policy/v1beta1", Kind: "PodSecurityPolicy"}: false, + {APIVersion: "policy/v1beta1", Kind: "PodSecurityPolicy"}: false, // remove after openapi upgrades to v1.25. {APIVersion: "rbac.authorization.k8s.io/v1", Kind: "ClusterRole"}: false, {APIVersion: "rbac.authorization.k8s.io/v1", Kind: "ClusterRoleBinding"}: false, {APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}: true, @@ -220,7 +248,7 @@ func definitionRefsFromRNode(object *yaml.RNode) ([]string, error) { // parseOpenAPI reads openAPIPath yaml and converts it to RNode func parseOpenAPI(openAPIPath string) (*yaml.RNode, error) { - b, err := ioutil.ReadFile(openAPIPath) + b, err := os.ReadFile(openAPIPath) if err != nil { return nil, err } @@ -278,9 +306,12 @@ func AddSchema(s []byte) error { // ResetOpenAPI resets the openapi data to empty func ResetOpenAPI() { + schemaLock.Lock() + defer schemaLock.Unlock() + globalSchema = openapiData{} - kubernetesOpenAPIVersion = "" customSchema = nil + kubernetesOpenAPIVersion = "" } // AddDefinitions adds the definitions to the global schema. @@ -370,18 +401,45 @@ func GetSchema(s string, schema *spec.Schema) (*ResourceSchema, error) { // be true if the resource is namespace-scoped, and false if the type is // cluster-scoped. func IsNamespaceScoped(typeMeta yaml.TypeMeta) (bool, bool) { - if res, f := precomputedIsNamespaceScoped[typeMeta]; f { - return res, true + if isNamespaceScoped, found := precomputedIsNamespaceScoped[typeMeta]; found { + return isNamespaceScoped, found + } + if isInitSchemaNeededForNamespaceScopeCheck() { + initSchema() } - return isNamespaceScopedFromSchema(typeMeta) -} - -func isNamespaceScopedFromSchema(typeMeta yaml.TypeMeta) (bool, bool) { - initSchema() isNamespaceScoped, found := globalSchema.namespaceabilityByResourceType[typeMeta] return isNamespaceScoped, found } +// isInitSchemaNeededForNamespaceScopeCheck returns true if initSchema is needed +// to ensure globalSchema.namespaceabilityByResourceType is fully populated for +// cases where a custom or non-default built-in schema is in use. +func isInitSchemaNeededForNamespaceScopeCheck() bool { + schemaLock.Lock() + defer schemaLock.Unlock() + + if globalSchema.schemaInit { + return false // globalSchema already is initialized. + } + if customSchema != nil { + return true // initSchema is needed. + } + if kubernetesOpenAPIVersion == "" || kubernetesOpenAPIVersion == kubernetesOpenAPIDefaultVersion { + // The default built-in schema is in use. Since + // precomputedIsNamespaceScoped aligns with the default built-in schema + // (verified by TestIsNamespaceScopedPrecompute), there is no need to + // call initSchema. + if globalSchema.defaultBuiltInSchemaParseStatus == schemaNotParsed { + // The schema may be needed for purposes other than namespace scope + // checks. Flag it to be parsed when that need arises. + globalSchema.defaultBuiltInSchemaParseStatus = schemaParseDelayed + } + return false + } + // A non-default built-in schema is in use. initSchema is needed. + return true +} + // IsCertainlyClusterScoped returns true for Node, Namespace, etc. and // false for Pod, Deployment, etc. and kinds that aren't recognized in the // openapi data. See: @@ -400,7 +458,7 @@ func SuppressBuiltInSchemaUse() { // Elements returns the Schema for the elements of an array. func (rs *ResourceSchema) Elements() *ResourceSchema { - // load the schema from swagger.json + // load the schema from swagger files initSchema() if len(rs.Schema.Type) != 1 || rs.Schema.Type[0] != "array" { @@ -446,7 +504,7 @@ func (rs *ResourceSchema) Lookup(path ...string) *ResourceSchema { // Field returns the Schema for a field. func (rs *ResourceSchema) Field(field string) *ResourceSchema { - // load the schema from swagger.json + // load the schema from swagger files initSchema() // locate the Schema @@ -459,7 +517,7 @@ func (rs *ResourceSchema) Field(field string) *ResourceSchema { // (the key doesn't matter, they all have the same value type) s = *rs.Schema.AdditionalProperties.Schema default: - // no Schema found from either swagger.json or line comments + // no Schema found from either swagger files or line comments return nil } @@ -545,24 +603,28 @@ const ( groupKey = "group" // versionKey is the key to lookup the version from the GVK extension versionKey = "version" - // kindKey is the the to lookup the kind from the GVK extension + // kindKey is the to lookup the kind from the GVK extension kindKey = "kind" ) // SetSchema sets the kubernetes OpenAPI schema version to use func SetSchema(openAPIField map[string]string, schema []byte, reset bool) error { + schemaLock.Lock() + defer schemaLock.Unlock() + // this should only be set once schemaIsSet := (kubernetesOpenAPIVersion != "") || customSchema != nil if schemaIsSet && !reset { return nil } - version, exists := openAPIField["version"] - if exists && schema != nil { - return fmt.Errorf("builtin version and custom schema provided, cannot use both") - } + version, versionProvided := openAPIField["version"] - if schema != nil { // use custom schema + // use custom schema + if schema != nil { + if versionProvided { + return fmt.Errorf("builtin version and custom schema provided, cannot use both") + } customSchema = schema kubernetesOpenAPIVersion = "custom" // if the schema is changed, initSchema should parse the new schema @@ -571,13 +633,14 @@ func SetSchema(openAPIField map[string]string, schema []byte, reset bool) error } // use builtin version - kubernetesOpenAPIVersion = strings.ReplaceAll(version, ".", "") + kubernetesOpenAPIVersion = version if kubernetesOpenAPIVersion == "" { return nil } if _, ok := kubernetesapi.OpenAPIMustAsset[kubernetesOpenAPIVersion]; !ok { return fmt.Errorf("the specified OpenAPI version is not built in") } + customSchema = nil // if the schema is changed, initSchema should parse the new schema globalSchema.schemaInit = false @@ -586,6 +649,9 @@ func SetSchema(openAPIField map[string]string, schema []byte, reset bool) error // GetSchemaVersion returns what kubernetes OpenAPI version is being used func GetSchemaVersion() string { + schemaLock.RLock() + defer schemaLock.RUnlock() + switch { case kubernetesOpenAPIVersion == "" && customSchema == nil: return kubernetesOpenAPIDefaultVersion @@ -598,6 +664,9 @@ func GetSchemaVersion() string { // initSchema parses the json schema func initSchema() { + schemaLock.Lock() + defer schemaLock.Unlock() + if globalSchema.schemaInit { return } @@ -607,16 +676,22 @@ func initSchema() { if customSchema != nil { err := parse(customSchema, JsonOrYaml) if err != nil { - panic("invalid schema file") + panic(fmt.Errorf("invalid schema file: %w", err)) } } else { - if kubernetesOpenAPIVersion == "" { + if kubernetesOpenAPIVersion == "" || kubernetesOpenAPIVersion == kubernetesOpenAPIDefaultVersion { parseBuiltinSchema(kubernetesOpenAPIDefaultVersion) + globalSchema.defaultBuiltInSchemaParseStatus = schemaParsed } else { parseBuiltinSchema(kubernetesOpenAPIVersion) } } + if globalSchema.defaultBuiltInSchemaParseStatus == schemaParseDelayed { + parseBuiltinSchema(kubernetesOpenAPIDefaultVersion) + globalSchema.defaultBuiltInSchemaParseStatus = schemaParsed + } + if err := parse(kustomizationapi.MustAsset(kustomizationAPIAssetName), JsonOrYaml); err != nil { // this should never happen panic(err) @@ -629,11 +704,10 @@ func parseBuiltinSchema(version string) { // don't parse the built in schema return } - // parse the swagger, this should never fail assetName := filepath.Join( "kubernetesapi", - version, + strings.ReplaceAll(version, ".", "_"), "swagger.pb") if err := parse(kubernetesapi.OpenAPIMustAsset[version](assetName), Proto); err != nil { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/gvk.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/gvk.go index 2c8cbb1f5..0289cadd7 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/gvk.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/gvk.go @@ -11,7 +11,7 @@ import ( ) // Gvk identifies a Kubernetes API type. -// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md +// https://git.k8s.io/design-proposals-archive/api-machinery/api-group.md type Gvk struct { Group string `json:"group,omitempty" yaml:"group,omitempty"` Version string `json:"version,omitempty" yaml:"version,omitempty"` @@ -97,38 +97,35 @@ func (x Gvk) String() string { return strings.Join([]string{k, v, g}, fieldSep) } -// legacySortString returns an older version of String() that LegacyOrderTransformer depends on -// to keep its ordering stable across Kustomize versions -func (x Gvk) legacySortString() string { - legacyNoGroup := "~G" - legacyNoVersion := "~V" - legacyNoKind := "~K" - legacyFieldSeparator := "_" +// stableSortString returns a GVK representation that ensures determinism and +// backwards-compatibility in testing, logging, ... +func (x Gvk) stableSortString() string { + stableNoGroup := "~G" + stableNoVersion := "~V" + stableNoKind := "~K" + stableFieldSeparator := "_" g := x.Group if g == "" { - g = legacyNoGroup + g = stableNoGroup } v := x.Version if v == "" { - v = legacyNoVersion + v = stableNoVersion } k := x.Kind if k == "" { - k = legacyNoKind + k = stableNoKind } - return strings.Join([]string{g, v, k}, legacyFieldSeparator) + return strings.Join([]string{g, v, k}, stableFieldSeparator) } // ApiVersion returns the combination of Group and Version func (x Gvk) ApiVersion() string { - var sb strings.Builder if x.Group != "" { - sb.WriteString(x.Group) - sb.WriteString("/") + return x.Group + "/" + x.Version } - sb.WriteString(x.Version) - return sb.String() + return x.Version } // StringWoEmptyField returns a string representation of the GVK. Non-exist @@ -203,7 +200,7 @@ func (x Gvk) IsLessThan(o Gvk) bool { if indexI != indexJ { return indexI < indexJ } - return x.legacySortString() < o.legacySortString() + return x.stableSortString() < o.stableSortString() } // IsSelected returns true if `selector` selects `x`; otherwise, false. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/resid.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/resid.go index f786f1366..cddbcdde6 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/resid.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/resid/resid.go @@ -60,25 +60,6 @@ func (id ResId) String() string { []string{id.Gvk.String(), strings.Join([]string{nm, ns}, fieldSep)}, separator) } -// LegacySortString returns an older version of String() that LegacyOrderTransformer depends on -// to keep its ordering stable across Kustomize versions -func (id ResId) LegacySortString() string { - legacyNoNamespace := "~X" - legacyNoName := "~N" - legacySeparator := "|" - - ns := id.Namespace - if ns == "" { - ns = legacyNoNamespace - } - nm := id.Name - if nm == "" { - nm = legacyNoName - } - return strings.Join( - []string{id.Gvk.String(), ns, nm}, legacySeparator) -} - func FromString(s string) ResId { values := strings.Split(s, separator) gvk := GvkFromString(values[0]) diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go index c855144d7..6b36d7d3a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go @@ -308,7 +308,10 @@ func (r RunFns) getFunctionFilters(global bool, fns ...*yaml.RNode) ( var fltrs []kio.Filter for i := range fns { api := fns[i] - spec := runtimeutil.GetFunctionSpec(api) + spec, err := runtimeutil.GetFunctionSpec(api) + if err != nil { + return nil, fmt.Errorf("failed to get FunctionSpec: %w", err) + } if spec == nil { // resource doesn't have function spec continue diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go index 07f02afb0..d590e5328 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go @@ -10,7 +10,7 @@ func (s String) Len() int { } func (s String) List() []string { - var val []string + val := make([]string, 0, len(s)) for k := range s { val = append(val, k) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/add.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/add.go deleted file mode 100644 index 22bd184e9..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/add.go +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "reflect" - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// Add creates or updates setter or substitution references from resource fields. -// Requires that at least one of FieldValue and FieldName have been set. -type Add struct { - // FieldValue if set will add the OpenAPI reference to fields if they have this value. - // Optional. If unspecified match all field values. - FieldValue string - - // FieldName if set will add the OpenAPI reference to fields with this name or path - // FieldName may be the full name of the field, full path to the field, or the path suffix. - // e.g. all of the following would match spec.template.spec.containers.image -- - // [image, containers.image, spec.containers.image, template.spec.containers.image, - // spec.template.spec.containers.image] - // Optional. If unspecified match all field names. - FieldName string - - // Ref is the OpenAPI reference to set on the matching fields as a comment. - Ref string - - // ListValues are the value of a list setter. - ListValues []string - - // Type is the type of the setter value - Type string - - // Count is the number of fields the setter applies to - Count int - - SettersSchema *spec.Schema -} - -// Filter implements yaml.Filter -func (a *Add) Filter(object *yaml.RNode) (*yaml.RNode, error) { - if a.FieldName == "" && a.FieldValue == "" { - return nil, errors.Errorf("must specify either fieldName or fieldValue") - } - if a.Ref == "" { - return nil, errors.Errorf("must specify ref") - } - return object, accept(a, object, a.SettersSchema) -} - -func (a *Add) visitSequence(_ *yaml.RNode, _ string, _ *openapi.ResourceSchema) error { - // no-op - return nil -} - -// visitMapping implements visitor -// visitMapping visits the fields in input MappingNode and adds setter/subst ref -// if the path path spec matches with input FiledName -func (a *Add) visitMapping(object *yaml.RNode, p string, _ *openapi.ResourceSchema) error { - return object.VisitFields(func(node *yaml.MapNode) error { - if node.Value.YNode().Kind != yaml.SequenceNode { - return nil - } - - key, err := node.Key.String() - if err != nil { - return err - } - - // derive the list values for the sequence node to write it to openAPI definitions - var values []string - for _, sc := range node.Value.Content() { - values = append(values, sc.Value) - } - - // pathToKey refers to the path address of the key node ex: metadata.annotations - // p is the path till parent node, pathToKey is obtained by appending child key - pathToKey := p + "." + strings.Trim(key, "\n") - if a.FieldName != "" && strings.HasSuffix(pathToKey, a.FieldName) { - // check if there are different values for field path before adding ref to the field - if len(a.ListValues) > 0 && !reflect.DeepEqual(values, a.ListValues) { - return errors.Errorf("setters can only be created for fields with same values, "+ - "encountered different array values for specified field path: %s, %s", values, a.ListValues) - } - a.ListValues = values - a.Count++ - return a.addRef(node.Key) - } - return nil - }) -} - -// visitScalar implements visitor -// visitScalar will set the field metadata on each scalar field whose name + value match -func (a *Add) visitScalar(object *yaml.RNode, p string, _, _ *openapi.ResourceSchema) error { - // check if the field matches - if a.Type == "array" { - return nil - } - if a.FieldName != "" && !strings.HasSuffix(p, a.FieldName) { - return nil - } - if a.FieldValue != "" && a.FieldValue != object.YNode().Value { - return nil - } - a.Count++ - return a.addRef(object) -} - -// addRef adds the setter/subst ref to the object node as a line comment -func (a *Add) addRef(object *yaml.RNode) error { - // read the field metadata - fm := fieldmeta.FieldMeta{SettersSchema: a.SettersSchema} - if err := fm.Read(object); err != nil { - return err - } - - // create the ref on the field metadata - r, err := spec.NewRef(a.Ref) - if err != nil { - return err - } - fm.Schema.Ref = r - - // write the field metadata - if err := fm.Write(object); err != nil { - return err - } - return nil -} - -// SetterDefinition may be used to update a files OpenAPI definitions with a new setter. -type SetterDefinition struct { - // Name is the name of the setter to create or update. - Name string `yaml:"name"` - - // Value is the value of the setter. - Value string `yaml:"value"` - - // ListValues are the value of a list setter. - ListValues []string `yaml:"listValues,omitempty"` - - // SetBy is the person or role that last set the value. - SetBy string `yaml:"setBy,omitempty"` - - // Description is a description of the value. - Description string `yaml:"description,omitempty"` - - // Count is the number of fields set by this setter. - Count int `yaml:"count,omitempty"` - - // Type is the type of the setter value. - Type string `yaml:"type,omitempty"` - - // Schema is the openAPI schema for setter constraints. - Schema string `yaml:"schema,omitempty"` - - // EnumValues is a map of possible setter values to actual field values. - // If EnumValues is specified, then the value set the by user 1) MUST - // be present in the enumValues map as a key, and 2) the map entry value - // MUST be used as the value to set in the configuration (rather than the key) - // Example -- may be used for t-shirt sizing values by allowing cpu to be - // set to small, medium or large, and then mapping these values to cpu values -- 0.5, 2, 8 - EnumValues map[string]string `yaml:"enumValues,omitempty"` - - // Required indicates that the setter must be set by package consumer before - // live apply/preview. This field is added to the setter definition to record - // the package publisher's intent to make the setter required to be set. - Required bool `yaml:"required,omitempty"` - - // IsSet indicates the specified field has been explicitly assigned. - IsSet bool `yaml:"isSet,omitempty"` -} - -func (sd SetterDefinition) AddToFile(path string) error { - return yaml.UpdateFile(sd, path) -} - -func (sd SetterDefinition) Filter(object *yaml.RNode) (*yaml.RNode, error) { - key := fieldmeta.SetterDefinitionPrefix + sd.Name - - definitions, err := object.Pipe(yaml.LookupCreate( - yaml.MappingNode, openapi.SupplementaryOpenAPIFieldName, "definitions")) - if err != nil { - return nil, err - } - - setterDef, err := definitions.Pipe(yaml.LookupCreate(yaml.MappingNode, key)) - if err != nil { - return nil, err - } - - if sd.Schema != "" { - schNode, err := yaml.ConvertJSONToYamlNode(sd.Schema) - if err != nil { - return nil, err - } - - err = definitions.PipeE(yaml.SetField(key, schNode)) - if err != nil { - return nil, err - } - // don't write the schema to the extension - sd.Schema = "" - } - - if sd.Description != "" { - err = setterDef.PipeE(yaml.FieldSetter{Name: "description", StringValue: sd.Description}) - if err != nil { - return nil, err - } - // don't write the description to the extension - sd.Description = "" - } - - if sd.Type != "" { - err = setterDef.PipeE(yaml.FieldSetter{Name: "type", StringValue: sd.Type}) - if err != nil { - return nil, err - } - // don't write the type to the extension - sd.Type = "" - } - - ext, err := setterDef.Pipe(yaml.LookupCreate(yaml.MappingNode, K8sCliExtensionKey)) - if err != nil { - return nil, err - } - - b, err := yaml.Marshal(sd) - if err != nil { - return nil, err - } - y, err := yaml.Parse(string(b)) - if err != nil { - return nil, err - } - - if err := ext.PipeE(yaml.SetField("setter", y)); err != nil { - return nil, err - } - - return object, nil -} - -// SetterDefinition may be used to update a files OpenAPI definitions with a new substitution. -type SubstitutionDefinition struct { - // Name is the name of the substitution to create or update - Name string `yaml:"name"` - - // Pattern is the substitution pattern into which setter values are substituted - Pattern string `yaml:"pattern"` - - // Values are setters which are substituted into pattern to produce a field value - Values []Value `yaml:"values"` -} - -type Value struct { - // Marker is the string marker in pattern that is replace by the referenced setter. - Marker string `yaml:"marker"` - - // Ref is a reference to a setter to pull the replacement value from. - Ref string `yaml:"ref"` -} - -func (sd SubstitutionDefinition) AddToFile(path string) error { - return yaml.UpdateFile(sd, path) -} - -func (sd SubstitutionDefinition) Filter(object *yaml.RNode) (*yaml.RNode, error) { - // create the substitution extension value by marshalling the SubstitutionDefinition itself - b, err := yaml.Marshal(sd) - if err != nil { - return nil, err - } - sub, err := yaml.Parse(string(b)) - if err != nil { - return nil, err - } - - // lookup or create the definition for the substitution - defKey := fieldmeta.SubstitutionDefinitionPrefix + sd.Name - def, err := object.Pipe(yaml.LookupCreate( - yaml.MappingNode, openapi.SupplementaryOpenAPIFieldName, "definitions", defKey, "x-k8s-cli")) - if err != nil { - return nil, err - } - - // set the substitution on the definition - if err := def.PipeE(yaml.SetField("substitution", sub)); err != nil { - return nil, err - } - - return object, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/delete.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/delete.go deleted file mode 100644 index 5c127a138..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/delete.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// Delete delete openAPI definition references from resource fields. -type Delete struct { - // Name is the name of the openAPI definition to delete. - Name string - - // DefinitionPrefix is the prefix of the OpenAPI definition type - DefinitionPrefix string - - SettersSchema *spec.Schema -} - -// Filter implements yaml.Filter -func (d *Delete) Filter(object *yaml.RNode) (*yaml.RNode, error) { - return object, accept(d, object, d.SettersSchema) -} - -func (d *Delete) visitSequence(_ *yaml.RNode, _ string, _ *openapi.ResourceSchema) error { - // no-op - return nil -} - -func (d *Delete) visitMapping(object *yaml.RNode, _ string, _ *openapi.ResourceSchema) error { - fieldRNodes, err := object.FieldRNodes() - if err != nil { - return err - } - - // for each of the field node key visit it as scalar to delete the array setter comment - for _, fieldRNode := range fieldRNodes { - err := d.visitScalar(fieldRNode, "", nil, nil) - if err != nil { - return err - } - } - return nil -} - -// visitScalar implements visitor -// visitScalar will remove the reference on each scalar field whose name matches. -func (d *Delete) visitScalar(object *yaml.RNode, _ string, _, _ *openapi.ResourceSchema) error { - // read the field metadata - fm := fieldmeta.FieldMeta{SettersSchema: d.SettersSchema} - if err := fm.Read(object); err != nil { - return err - } - - // Delete the reference iff the ref string matches with DefinitionPrefix - if strings.HasSuffix(fm.Schema.Ref.String(), d.DefinitionPrefix+d.Name) { - // remove the ref on the metadata - fm.Schema.Ref = spec.Ref{} - - // write the field metadata - if err := fm.Write(object); err != nil { - return err - } - } - - return nil -} - -// DeleterDefinition may be used to update a files OpenAPI definitions with a new setter. -type DeleterDefinition struct { - // Name is the name of the openAPI definition to delete. - Name string `yaml:"name"` - - // DefinitionPrefix is the prefix of the OpenAPI definition type - DefinitionPrefix string `yaml:"definitionPrefix"` -} - -func (dd DeleterDefinition) DeleteFromFile(path string) error { - return yaml.UpdateFile(dd, path) -} - -// SubstReferringDefinition check if the definition used in substitution and return the substitution name if true -func SubstReferringDefinition(definitions *yaml.RNode, key string) string { - fieldNames, err := definitions.Fields() - if err != nil { - return "" - } - for _, fieldName := range fieldNames { - // the definition key -- contains the substitution name - subkey := definitions.Field(fieldName).Key.YNode().Value - if strings.HasPrefix(subkey, fieldmeta.SubstitutionDefinitionPrefix) { - substNode, err := definitions.Field(fieldName).Value.Pipe(yaml.Lookup(K8sCliExtensionKey, "substitution")) - if err != nil { - continue - } - - b, err := substNode.MarshalJSON() - if err != nil { - continue - } - - subst := SubstitutionDefinition{} - if err := yaml.Unmarshal(b, &subst); err != nil { - continue - } - // Check the ref in value to see if it contains the setter key - for _, v := range subst.Values { - if strings.HasSuffix(v.Ref, key) { - return subst.Name - } - } - } - } - - return "" -} - -func (dd DeleterDefinition) Filter(object *yaml.RNode) (*yaml.RNode, error) { - key := dd.DefinitionPrefix + dd.Name - var defType string - - switch dd.DefinitionPrefix { - case fieldmeta.SubstitutionDefinitionPrefix: - defType = "substitution" - case fieldmeta.SetterDefinitionPrefix: - defType = "setter" - default: - return nil, errors.Errorf("the input delete definitionPrefix does't match any of openAPI definitions, "+ - "allowed values [%s, %s]", fieldmeta.SetterDefinitionPrefix, fieldmeta.SubstitutionDefinitionPrefix) - } - - definitions, err := object.Pipe(yaml.Lookup(openapi.SupplementaryOpenAPIFieldName, "definitions")) - if err != nil { - return nil, err - } - // return error if the setter to be deleted doesn't exist - if definitions == nil || definitions.Field(key) == nil { - return nil, errors.Errorf("%s %q does not exist", defType, dd.Name) - } - - subst := SubstReferringDefinition(definitions, key) - - if subst != "" { - return nil, errors.Errorf("%s %q is used in substitution %q, please delete the parent substitution first", defType, dd.Name, subst) - } - - _, err = definitions.Pipe(yaml.FieldClearer{Name: key}) - if err != nil { - return nil, err - } - // remove definitions if it's empty - _, err = object.Pipe(yaml.Lookup(openapi.SupplementaryOpenAPIFieldName), yaml.FieldClearer{Name: "definitions", IfEmpty: true}) - if err != nil { - return nil, err - } - - // remove openApi if it's empty - _, err = object.Pipe(yaml.FieldClearer{Name: openapi.SupplementaryOpenAPIFieldName, IfEmpty: true}) - if err != nil { - return nil, err - } - - return object, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/doc.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/doc.go deleted file mode 100644 index 90ae3ed90..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/doc.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 -// -// Package setters2 contains libraries for setting resource field values from OpenAPI setter -// extensions. -// -// Setters -// -// Setters are used to programmatically set configuration field values -- e.g. through a cli or ui. -// -// Setters are defined through OpenAPI definitions using the x-k8s-cli extension. -// Note: additional OpenAPI definitions may be registered through openapi.AddSchema([]byte) -// -// Example OpenAPI schema containing a setter: -// -// { -// "definitions": { -// "io.k8s.cli.setters.replicas": { -// "x-k8s-cli": { -// "setter": { -// "name": "replicas", -// "value": "4" -// } -// } -// } -// } -// } -// -// Setter fields: -// -// x-k8s-cli.setter.name: name of the setter -// x-k8s-cli.setter.value: value of the setter that should be applied to fields -// -// The setter definition key must be of the form "io.k8s.cli.setters.NAME", where NAME matches the -// value of "x-k8s-cli.setter.name". -// -// When Set.Filter is called, the named setter will have its value applied to all resource -// fields referencing it. -// -// Fields may reference setters through a yaml comment containing the serialized JSON OpenAPI. -// -// Example Deployment resource with a "spec.replicas" field set by the "replicas" setter: -// -// apiVersion: apps/v1 -// kind: Deployment -// metadata: -// name: nginx-deployment -// spec: -// replicas: 4 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"} -// -// If the OpenAPI io.k8s.cli.setters.replicas x-k8s-cli.setter.value was changed from "4" to "5", -// then calling Set{Name: "replicas"}.Filter(deployment) would update the Deployment spec.replicas -// value from 4 to 5. -// -// Updated OpenAPI: -// -// { -// "definitions": { -// "io.k8s.cli.setters.replicas": { -// "x-k8s-cli": { -// "setter": { -// "name": "replicas", -// "value": "5" -// } -// } -// } -// } -// } -// -// Updated Deployment Configuration: -// -// apiVersion: apps/v1 -// kind: Deployment -// metadata: -// name: nginx-deployment -// spec: -// replicas: 5 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas"} -// -// Substitutions -// -// Substitutions are used to programmatically set configuration field values using multiple -// setters which are substituted into a pattern string. -// -// Substitutions may be used when a field value does not cleanly map to a single setter, but -// instead matches some string pattern where setters may be substituted in. -// -// Fields may reference substitutions the same way they do setters, however substitutions -// reference setters from which they are derived. -// -// Example OpenAPI schema containing a substitution derived from 2 setters: -// -// { -// "definitions": { -// "io.k8s.cli.setters.image-name": { -// "x-k8s-cli": { -// "setter": { -// "name": "image-name", -// "value": "nginx" -// } -// } -// }, -// "io.k8s.cli.setters.image-tag": { -// "x-k8s-cli": { -// "setter": { -// "name": "image-tag", -// "value": "1.8.1" -// } -// } -// }, -// "io.k8s.cli.substitutions.image-name-tag": { -// "x-k8s-cli": { -// "substitution": { -// "name": "image-name-tag", -// "pattern": "IMAGE_NAME:IMAGE_TAG", -// "values": [ -// {"marker": "IMAGE_NAME", "ref": "#/definitions/io.k8s.cli.setters.image-name"} -// {"marker": "IMAGE_TAG", "ref": "#/definitions/io.k8s.cli.setters.image-tag"} -// ] -// } -// } -// } -// } -// } -// -// Substitution Fields. -// -// x-k8s-cli.substitution.name: name of the substitution -// x-k8s-cli.substitution.pattern: string pattern to substitute markers into -// x-k8s-cli.substitution.values.marker: the marker substring within pattern to replace -// x-k8s-cli.substitution.values.ref: the setter ref containing the value to replace the marker with -// -// The substitution is composed of a "pattern" containing markers, and a list of setter "values" -// which are substituted into the markers. -// -// Example Deployment with substitution: -// -// apiVersion: apps/v1 -// kind: Deployment -// metadata: -// name: nginx-deployment -// spec: -// template: -// spec: -// containers: -// - name: nginx -// image: nginx:1.8.1 # {"$ref": "#/definitions/io.k8s.cli.substitutions.image-name-tag"} -// -// spec.template.spec.containers[name=nginx].image is set by the "image" substitution any time -// either "image-name" or "image-tag" is set. Whenever any setter referenced by a substitution -// is set, the substitution will be recalculated by substituting its values into its pattern. -// -// -// If the OpenAPI io.k8s.cli.setters.image-name x-k8s-cli.setter.value was changed from "1.8.1" -// to "1.8.2", then calling either Set{Name: "image-name"}.Filter(deployment) or -// Set{Name: "image-tag"}.Filter(deployment) would update the Deployment field -// spec.template.spec.container[name=nginx].image from "nginx:1.8.1" to "nginx:1.8.2". -// -// Adding Field References -// -// References to setters and substitutions may be added to fields using the Add Filter. -// Add will write a JSON OpenAPI string as a comment to any fields matching the specified -// FieldName add FieldValue. -package setters2 diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/list.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/list.go deleted file mode 100644 index 17a39ad7f..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/list.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "sort" - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// List lists the setters specified in the OpenAPI -// excludes the subpackages which contain file with -// name OpenAPIFileName in them -type List struct { - Name string - - OpenAPIFileName string - - Setters []SetterDefinition - - Substitutions []SubstitutionDefinition - - SettersSchema *spec.Schema -} - -// ListSetters initializes l.Setters with the setters from the OpenAPI definitions in the file -func (l *List) ListSetters(openAPIPath, resourcePath string) error { - y, err := yaml.ReadFile(openAPIPath) - if err != nil { - return err - } - return l.listSetters(y, resourcePath) -} - -// ListSubst initializes l.Substitutions with the substitutions from the OpenAPI definitions in the file -func (l *List) ListSubst(openAPIPath string) error { - y, err := yaml.ReadFile(openAPIPath) - if err != nil { - return err - } - return l.listSubst(y) -} - -func (l *List) listSetters(object *yaml.RNode, resourcePath string) error { - // read the OpenAPI definitions - def, err := object.Pipe(yaml.LookupCreate(yaml.MappingNode, "openAPI", "definitions")) - if err != nil { - return err - } - if yaml.IsMissingOrNull(def) { - return nil - } - - // iterate over definitions -- find those that are setters - err = def.VisitFields(func(node *yaml.MapNode) error { - setter := SetterDefinition{} - - // the definition key -- contains the setter name - key := node.Key.YNode().Value - - if !strings.HasPrefix(key, fieldmeta.SetterDefinitionPrefix) { - // not a setter -- doesn't have the right prefix - return nil - } - - setterNode, err := node.Value.Pipe(yaml.Lookup(K8sCliExtensionKey, "setter")) - if err != nil { - return err - } - if yaml.IsMissingOrNull(setterNode) { - // has the setter prefix, but missing the setter extension - return errors.Errorf("missing x-k8s-cli.setter for %s", key) - } - - // unmarshal the yaml for the setter extension into the definition struct - b, err := setterNode.String() - if err != nil { - return err - } - if err := yaml.Unmarshal([]byte(b), &setter); err != nil { - return err - } - - if l.Name != "" && l.Name != setter.Name { - // not the setter that was requested by list - return nil - } - - // the description is not part of the extension, and should be pulled out - // separately from the extension values. - description := node.Value.Field("description") - if description != nil { - setter.Description = description.Value.YNode().Value - } - - // count the number of fields set by this setter - setter.Count, err = l.count(resourcePath, setter.Name) - if err != nil { - return err - } - - l.Setters = append(l.Setters, setter) - return nil - }) - if err != nil { - return err - } - - // sort the setters by their name - sort.Slice(l.Setters, func(i, j int) bool { - return l.Setters[i].Name < l.Setters[j].Name - }) - - return nil -} - -func (l *List) listSubst(object *yaml.RNode) error { - // read the OpenAPI definitions - def, err := object.Pipe(yaml.LookupCreate(yaml.MappingNode, "openAPI", "definitions")) - if err != nil { - return err - } - if yaml.IsMissingOrNull(def) { - return nil - } - - // iterate over definitions -- find those that are substitutions - err = def.VisitFields(func(node *yaml.MapNode) error { - subst := SubstitutionDefinition{} - - // the definition key -- contains the substitution name - key := node.Key.YNode().Value - - if !strings.HasPrefix(key, fieldmeta.SubstitutionDefinitionPrefix) { - // not a substitution -- doesn't have the right prefix - return nil - } - - substNode, err := node.Value.Pipe(yaml.Lookup(K8sCliExtensionKey, "substitution")) - if err != nil { - return err - } - if yaml.IsMissingOrNull(substNode) { - // has the substitution prefix, but missing the setter extension - return errors.Errorf("missing x-k8s-cli.substitution for %s", key) - } - - // unmarshal the yaml for the substitution extension into the definition struct - b, err := substNode.String() - if err != nil { - return err - } - if err := yaml.Unmarshal([]byte(b), &subst); err != nil { - return err - } - - if l.Name != "" && l.Name != subst.Name { - // not the substitution that was requested by list - return nil - } - - l.Substitutions = append(l.Substitutions, subst) - return nil - }) - if err != nil { - return err - } - - // sort the substitutions by their name - sort.Slice(l.Substitutions, func(i, j int) bool { - return l.Substitutions[i].Name < l.Substitutions[j].Name - }) - - return nil -} - -// count returns the number of fields set by the setter with name -// this excludes all the subpackages with openAPI file in them -// set filter is leveraged for this but the resources are not written -// back to files as only LocalPackageReader is invoked and not writer -func (l *List) count(path, name string) (int, error) { - s := &Set{Name: name, SettersSchema: l.SettersSchema} - err := kio.Pipeline{ - Inputs: []kio.Reader{&kio.LocalPackageReader{PackagePath: path, PackageFileName: l.OpenAPIFileName}}, - Filters: []kio.Filter{kio.FilterAll(s)}, - }.Execute() - - return s.Count, err -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/set.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/set.go deleted file mode 100644 index 4b078d1c7..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/set.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "fmt" - "strings" - "text/template" - - "k8s.io/kube-openapi/pkg/validation/spec" - "k8s.io/kube-openapi/pkg/validation/strfmt" - "k8s.io/kube-openapi/pkg/validation/validate" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - goyaml "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/kio/kioutil" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/sets" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// Set sets resource field values from an OpenAPI setter -type Set struct { - // Name is the name of the setter to set on the object. i.e. matches the x-k8s-cli.setter.name - // of the setter that should have its value applied to fields which reference it. - Name string - - // Count is the number of fields that were updated by calling Filter - Count int - - // SetAll if set to true will set all setters regardless of name - SetAll bool - - SettersSchema *spec.Schema -} - -// Filter implements Set as a yaml.Filter -func (s *Set) Filter(object *yaml.RNode) (*yaml.RNode, error) { - return object, accept(s, object, s.SettersSchema) -} - -// isMatch returns true if the setter with name should have the field -// value set -func (s *Set) isMatch(name string) bool { - return s.SetAll || s.Name == name -} - -func (s *Set) visitMapping(_ *yaml.RNode, p string, _ *openapi.ResourceSchema) error { - return nil -} - -// visitSequence will perform setters for sequences -func (s *Set) visitSequence(object *yaml.RNode, p string, schema *openapi.ResourceSchema) error { - ext, err := getExtFromComment(schema) - if err != nil { - return err - } - if ext == nil || ext.Setter == nil || !s.isMatch(ext.Setter.Name) || - len(ext.Setter.ListValues) == 0 { - // setter was not invoked for this sequence - return nil - } - s.Count++ - - // set the values on the sequences - var elements []*yaml.Node - if len(ext.Setter.ListValues) > 0 { - if err := validateAgainstSchema(ext, schema.Schema); err != nil { - return err - } - } - for i := range ext.Setter.ListValues { - v := ext.Setter.ListValues[i] - n := yaml.NewScalarRNode(v).YNode() - n.Style = yaml.DoubleQuotedStyle - elements = append(elements, n) - } - object.YNode().Content = elements - object.YNode().Style = yaml.FoldedStyle - return nil -} - -// visitScalar -func (s *Set) visitScalar(object *yaml.RNode, p string, oa, settersSchema *openapi.ResourceSchema) error { - // get the openAPI for this field describing how to apply the setter - ext, err := getExtFromComment(settersSchema) - if err != nil { - return err - } - if ext == nil { - return nil - } - - var k8sSchema *spec.Schema - if oa != nil { - k8sSchema = oa.Schema - } - - // perform a direct set of the field if it matches - ok, err := s.set(object, ext, k8sSchema, settersSchema.Schema) - if err != nil { - return err - } - if ok { - s.Count++ - return nil - } - - // perform a substitution of the field if it matches - sub, err := s.substitute(object, ext) - if err != nil { - return err - } - if sub { - s.Count++ - } - return nil -} - -// substitute updates the value of field from ext if ext contains a substitution that -// depends on a setter whose name matches s.Name. -func (s *Set) substitute(field *yaml.RNode, ext *CliExtension) (bool, error) { - // check partial setters to see if they contain the setter as part of a - // substitution - if ext.Substitution == nil { - return false, nil - } - - // track the visited nodes to detect cycles in nested substitutions - visited := sets.String{} - - // nameMatch indicates if the input substitution depends on the specified setter, - // the substitution in ext is parsed recursively and if the setter in Set is hit while - // parsing, it indicates the match - nameMatch := false - - res, err := s.substituteUtil(ext, visited, &nameMatch) - if err != nil { - return false, err - } - - if !nameMatch { - // doesn't depend on the setter, don't modify its value - return false, nil - } - - field.YNode().Value = res - - // substitutions are always strings - field.YNode().Tag = yaml.NodeTagString - - return true, nil -} - -// substituteUtil recursively parses nested substitutions in ext and sets the setter value -// returns error if cyclic substitution is detected or any other unexpected errors -func (s *Set) substituteUtil(ext *CliExtension, visited sets.String, nameMatch *bool) (string, error) { - // check if the substitution has already been visited and throw error as cycles - // are not allowed in nested substitutions - if visited.Has(ext.Substitution.Name) { - return "", errors.Errorf( - "cyclic substitution detected with name " + ext.Substitution.Name) - } - - visited.Insert(ext.Substitution.Name) - pattern := ext.Substitution.Pattern - - // substitute each setter into the pattern to get the new value - // if substitution references to another substitution, recursively - // process the nested substitutions to replace the pattern with setter values - for _, v := range ext.Substitution.Values { - if v.Ref == "" { - return "", errors.Errorf( - "missing reference on substitution " + ext.Substitution.Name) - } - ref, err := spec.NewRef(v.Ref) - if err != nil { - return "", errors.Wrap(err) - } - def, err := openapi.Resolve(&ref, s.SettersSchema) // resolve the def to its openAPI def - if err != nil { - return "", errors.Wrap(err) - } - defExt, err := GetExtFromSchema(def) // parse the extension out of the openAPI - if err != nil { - return "", errors.Wrap(err) - } - - if defExt.Substitution != nil { - // parse recursively if it reference is substitution - substVal, err := s.substituteUtil(defExt, visited, nameMatch) - if err != nil { - return "", err - } - pattern = strings.ReplaceAll(pattern, v.Marker, substVal) - continue - } - - // if code reaches this point, this is a setter, so validate the setter schema - if err := validateAgainstSchema(defExt, def); err != nil { - return "", err - } - - if s.isMatch(defExt.Setter.Name) { - // the substitution depends on the specified setter - *nameMatch = true - } - - if val, found := defExt.Setter.EnumValues[defExt.Setter.Value]; found { - // the setter has an enum-map. we should replace the marker with the - // enum value looked up from the map rather than the enum key - pattern = strings.ReplaceAll(pattern, v.Marker, val) - } else { - pattern = strings.ReplaceAll(pattern, v.Marker, defExt.Setter.Value) - } - } - - return pattern, nil -} - -// set applies the value from ext to field if its name matches s.Name -func (s *Set) set(field *yaml.RNode, ext *CliExtension, k8sSch, sch *spec.Schema) (bool, error) { - // check full setter - if ext.Setter == nil || !s.isMatch(ext.Setter.Name) { - return false, nil - } - - if err := validateAgainstSchema(ext, sch); err != nil { - return false, err - } - - if val, found := ext.Setter.EnumValues[ext.Setter.Value]; found { - // the setter has an enum-map. we should replace the marker with the - // enum value looked up from the map rather than the enum key - field.YNode().Value = val - return true, nil - } - - // this has a full setter, set its value - field.YNode().Value = ext.Setter.Value - - // format the node so it is quoted if it is a string. If there is - // type information on the setter schema, we use it. Otherwise we - // fall back to the field schema if it exists. - if len(sch.Type) > 0 { - yaml.FormatNonStringStyle(field.YNode(), *sch) - } else if k8sSch != nil { - yaml.FormatNonStringStyle(field.YNode(), *k8sSch) - } - return true, nil -} - -// validateAgainstSchema validates the input setter value against user provided -// openAI schema -func validateAgainstSchema(ext *CliExtension, sch *spec.Schema) error { - fixSchemaTypes(sch) - sc := spec.Schema{} - sc.Properties = map[string]spec.Schema{} - sc.Properties[ext.Setter.Name] = *sch - - var inputYAML string - if len(ext.Setter.ListValues) > 0 { - // tmplText contains the template we will use to produce a yaml - // document that we can use for validation. - var tmplText string - if sch.Items != nil && sch.Items.Schema != nil && - shouldQuoteSetterValue(ext.Setter.ListValues, sch.Items.Schema.Type) { - // If string is one of the legal types for the value, we - // output it with quotes in the yaml document to make sure it - // is later parsed as a string. - tmplText = `{{.key}}:{{block "list" .values}}{{"\n"}}{{range .}}{{printf "- %q\n" .}}{{end}}{{end}}` - } else { - // If string is not specifically set as the type, we just - // let the yaml unmarshaller detect the correct type. Thus, we - // do not add quotes around the value. - tmplText = `{{.key}}:{{block "list" .values}}{{"\n"}}{{range .}}{{println "-" .}}{{end}}{{end}}` - } - - tmpl, err := template.New("validator").Parse(tmplText) - if err != nil { - return err - } - var builder strings.Builder - err = tmpl.Execute(&builder, map[string]interface{}{ - "key": ext.Setter.Name, - "values": ext.Setter.ListValues, - }) - if err != nil { - return err - } - inputYAML = builder.String() - } else { - var format string - // Only add quotes around the value is string is one of the - // types in the schema. - if shouldQuoteSetterValue([]string{ext.Setter.Value}, sch.Type) { - format = "%s: \"%s\"" - } else { - format = "%s: %s" - } - inputYAML = fmt.Sprintf(format, ext.Setter.Name, ext.Setter.Value) - } - - input := map[string]interface{}{} - err := goyaml.Unmarshal([]byte(inputYAML), &input) - if err != nil { - return err - } - err = validate.AgainstSchema(&sc, input, strfmt.Default) - if err != nil { - return errors.Errorf("The input value doesn't validate against provided OpenAPI schema: %v\n", err.Error()) - } - return nil -} - -// shouldQuoteSetterValue returns true if string is one of the types in the -// schema, or if the value ends in a ':' (the yaml parser gets confused by -// the ':' at the end unless the value is quoted) -func shouldQuoteSetterValue(a []string, schType spec.StringOrArray) bool { - if schType.Contains("string") { - return true - } - - for _, s := range a { - if strings.HasSuffix(s, ":") { - return true - } - } - return false -} - -// fixSchemaTypes traverses the schema and checks for some common -// errors for the type field. This currently involves users using -// 'int' instead of 'integer' and 'bool' instead of 'boolean'. Early versions -// of setters didn't validate this, so there are users that have invalid -// types in their packages. -func fixSchemaTypes(sc *spec.Schema) { - for i := range sc.Type { - currentType := sc.Type[i] - if currentType == "int" { - sc.Type[i] = "integer" - } - if currentType == "bool" { - sc.Type[i] = "boolean" - } - } - - if items := sc.Items; items != nil { - if items.Schema != nil { - fixSchemaTypes(items.Schema) - } - for i := range items.Schemas { - schema := items.Schemas[i] - fixSchemaTypes(&schema) - } - } -} - -// SetOpenAPI updates a setter value -type SetOpenAPI struct { - // Name is the name of the setter to add - Name string `yaml:"name"` - // Value is the current value of the setter - Value string `yaml:"value"` - - // ListValue is the current value for a list of items - ListValues []string `yaml:"listValue"` - - Description string `yaml:"description"` - - SetBy string `yaml:"setBy"` - - IsSet bool `yaml:"isSet"` -} - -// UpdateFile updates the OpenAPI definitions in a file with the given setter value. -func (s SetOpenAPI) UpdateFile(path string) error { - return yaml.UpdateFile(s, path) -} - -func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) { - key := fieldmeta.SetterDefinitionPrefix + s.Name - oa, err := object.Pipe(yaml.Lookup("openAPI", "definitions", key)) - if err != nil { - return nil, err - } - if oa == nil { - return nil, errors.Errorf("setter %q is not found", s.Name) - } - def, err := oa.Pipe(yaml.Lookup("x-k8s-cli", "setter")) - if err != nil { - return nil, err - } - if def == nil { - return nil, errors.Errorf("setter %q is not found", s.Name) - } - - // record the OpenAPI type for the setter - var t string - if n := oa.Field("type"); n != nil { - t = n.Value.YNode().Value - } - - // if the setter contains an enumValues map, then ensure the set value appears - // as a key in the map - if values, err := def.Pipe( - yaml.Lookup("enumValues")); err != nil { - // error looking up the enumValues - return nil, err - } else if values != nil { - // contains enumValues map -- validate the set value against the map entries - - // get the enumValues keys - fields, err := values.Fields() - if err != nil { - return nil, err - } - - // search for the user provided value in the set of allowed values - var match bool - for i := range fields { - if fields[i] == s.Value { - // found a match, we are good - match = true - break - } - } - if !match { - // no match found -- provide an informative error to the user - return nil, errors.Errorf("%s does not match the possible values for %s: [%s]", - s.Value, s.Name, strings.Join(fields, ",")) - } - } - - v := yaml.NewScalarRNode(s.Value) - // values are always represented as strings the OpenAPI - // since the are unmarshalled into strings. Use double quote style to - // ensure this consistently. - v.YNode().Tag = yaml.NodeTagString - v.YNode().Style = yaml.DoubleQuotedStyle - - if t != "array" { - // set a scalar value - if err := def.PipeE(&yaml.FieldSetter{Name: "value", Value: v}); err != nil { - return nil, err - } - } else { - // set a list value - if err := def.PipeE(&yaml.FieldClearer{Name: "value"}); err != nil { - return nil, err - } - // create the list values - var elements []*yaml.Node - n := yaml.NewScalarRNode(s.Value).YNode() - n.Tag = yaml.NodeTagString - n.Style = yaml.DoubleQuotedStyle - elements = append(elements, n) - for i := range s.ListValues { - v := s.ListValues[i] - n := yaml.NewScalarRNode(v).YNode() - n.Style = yaml.DoubleQuotedStyle - elements = append(elements, n) - } - l := yaml.NewRNode(&yaml.Node{ - Kind: yaml.SequenceNode, - Content: elements, - }) - - def.YNode().Style = yaml.FoldedStyle - if err := def.PipeE(&yaml.FieldSetter{Name: "listValues", Value: l}); err != nil { - return nil, err - } - } - - if err := def.PipeE(&yaml.FieldSetter{Name: "setBy", StringValue: s.SetBy}); err != nil { - return nil, err - } - - if s.IsSet { - n := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: "true", - Tag: yaml.NodeTagBool, - } - if err := def.PipeE(&yaml.FieldSetter{Name: "isSet", Value: yaml.NewRNode(n)}); err != nil { - return nil, err - } - } - - if s.Description != "" { - d, err := object.Pipe(yaml.LookupCreate( - yaml.MappingNode, "openAPI", "definitions", key)) - if err != nil { - return nil, err - } - if err := d.PipeE(&yaml.FieldSetter{Name: "description", StringValue: s.Description}); err != nil { - return nil, err - } - } - - return object, nil -} - -// SetAll applies the set filter for all yaml nodes and only returns the nodes whose -// corresponding file has at least one node with input setter -func SetAll(s *Set) kio.Filter { - return kio.FilterFunc(func(nodes []*yaml.RNode) ([]*yaml.RNode, error) { - filesToUpdate := sets.String{} - // for each node record the set fields count before and after filter is applied and - // store the corresponding file paths if there is an increment in setters count - for i := range nodes { - preCount := s.Count - _, err := s.Filter(nodes[i]) - if err != nil { - return nil, errors.Wrap(err) - } - if s.Count > preCount { - path, _, err := kioutil.GetFileAnnotations(nodes[i]) - if err != nil { - return nil, errors.Wrap(err) - } - filesToUpdate.Insert(path) - } - } - var nodesInUpdatedFiles []*yaml.RNode - // return only the nodes whose corresponding file has at least one node with input setter - for i := range nodes { - path, _, err := kioutil.GetFileAnnotations(nodes[i]) - if err != nil { - return nil, errors.Wrap(err) - } - if filesToUpdate.Has(path) { - nodesInUpdatedFiles = append(nodesInUpdatedFiles, nodes[i]) - } - } - return nodesInUpdatedFiles, nil - }) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/deletercreator.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/deletercreator.go deleted file mode 100644 index 13c2d1815..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/deletercreator.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package settersutil - -import ( - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/setters2" -) - -// DeleterCreator delete a definition in the OpenAPI definitions, and removes references -// to the definition from matching resource fields. -type DeleterCreator struct { - // Name is the name of the setter or substitution to delete - Name string - - // DefinitionPrefix is the prefix of the OpenAPI definition type - DefinitionPrefix string - - RecurseSubPackages bool - - OpenAPIFileName string - - // Path to openAPI file - OpenAPIPath string - - // Path to resources folder - ResourcesPath string - - SettersSchema *spec.Schema -} - -func (d DeleterCreator) Delete() error { - dd := setters2.DeleterDefinition{ - Name: d.Name, - DefinitionPrefix: d.DefinitionPrefix, - } - if err := dd.DeleteFromFile(d.OpenAPIPath); err != nil { - return err - } - - // Update the resources with the deleter reference - inout := &kio.LocalPackageReadWriter{PackagePath: d.ResourcesPath, PackageFileName: d.OpenAPIFileName} - return kio.Pipeline{ - Inputs: []kio.Reader{inout}, - Filters: []kio.Filter{kio.FilterAll( - &setters2.Delete{ - Name: d.Name, - DefinitionPrefix: d.DefinitionPrefix, - SettersSchema: d.SettersSchema, - })}, - Outputs: []kio.Writer{inout}, - }.Execute() -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/fieldsetter.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/fieldsetter.go deleted file mode 100644 index 8b753661e..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/fieldsetter.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package settersutil - -import ( - "io/ioutil" - "os" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// FieldSetter sets the value for a field setter. -type FieldSetter struct { - // Name is the name of the setter to set - Name string - - // Value is the value to set - Value string - - // ListValues contains a list of values to set on a Sequence - ListValues []string - - Description string - - SetBy string - - Count int - - OpenAPIPath string - - OpenAPIFileName string - - ResourcesPath string - - RecurseSubPackages bool - - IsSet bool - - SettersSchema *spec.Schema -} - -func (fs *FieldSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { - fs.Count, _ = fs.Set() - return nil, nil -} - -// Set updates the OpenAPI definitions and resources with the new setter value -func (fs *FieldSetter) Set() (int, error) { - // Update the OpenAPI definitions - soa := setters2.SetOpenAPI{ - Name: fs.Name, - Value: fs.Value, - ListValues: fs.ListValues, - Description: fs.Description, - SetBy: fs.SetBy, - IsSet: fs.IsSet, - } - - // the input field value is updated in the openAPI file and then parsed - // at to get the value and set it to resource files, but if there is error - // after updating openAPI file and while updating resources, the openAPI - // file should be reverted, as set operation failed - stat, err := os.Stat(fs.OpenAPIPath) - if err != nil { - return 0, err - } - - curOpenAPI, err := ioutil.ReadFile(fs.OpenAPIPath) - if err != nil { - return 0, err - } - - // write the new input value to openAPI file - if err := soa.UpdateFile(fs.OpenAPIPath); err != nil { - return 0, err - } - - // Load the updated definitions - sc, err := openapi.SchemaFromFile(fs.OpenAPIPath) - if err != nil { - return 0, err - } - fs.SettersSchema = sc - - // Update the resources with the new value - // Set NoDeleteFiles to true as SetAll will return only the nodes of files which should be updated and - // hence, rest of the files should not be deleted - inout := &kio.LocalPackageReadWriter{PackagePath: fs.ResourcesPath, NoDeleteFiles: true, PackageFileName: fs.OpenAPIFileName} - s := &setters2.Set{Name: fs.Name, SettersSchema: sc} - err = kio.Pipeline{ - Inputs: []kio.Reader{inout}, - Filters: []kio.Filter{setters2.SetAll(s)}, - Outputs: []kio.Writer{inout}, - }.Execute() - - // revert openAPI file if set operation fails - if err != nil { - if writeErr := ioutil.WriteFile(fs.OpenAPIPath, curOpenAPI, stat.Mode().Perm()); writeErr != nil { - return 0, writeErr - } - } - return s.Count, err -} - -// SetAllSetterDefinitions reads all the Setter Definitions from the input OpenAPI -// file and sets all values for the resource configs in the provided destination directories. -// If syncOpenAPI is true, the openAPI files in destination directories are also -// updated with the setter values in the input openAPI file -func SetAllSetterDefinitions(openAPIPath string, dirs ...string) error { - sc, err := openapi.SchemaFromFile(openAPIPath) - if err != nil { - return err - } - for _, destDir := range dirs { - rw := &kio.LocalPackageReadWriter{ - PackagePath: destDir, - // set output won't include resources from files which - // weren't modified. make sure we don't delete them. - NoDeleteFiles: true, - } - - // apply all of the setters to the directory - err := kio.Pipeline{ - Inputs: []kio.Reader{rw}, - // Set all of the setters - Filters: []kio.Filter{setters2.SetAll(&setters2.Set{SetAll: true, SettersSchema: sc})}, - Outputs: []kio.Writer{rw}, - }.Execute() - if err != nil { - return err - } - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/settercreator.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/settercreator.go deleted file mode 100644 index ded388a8a..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/settercreator.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package settersutil - -import ( - "fmt" - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/setters2" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// SetterCreator creates or updates a setter in the OpenAPI definitions, and inserts references -// to the setter from matching resource fields. -type SetterCreator struct { - // Name is the name of the setter to create or update. - Name string - - SetBy string - - Description string - - Type string - - Schema string - - // FieldName if set will add the OpenAPI reference to fields with this name or path - // FieldName may be the full name of the field, full path to the field, or the path suffix. - // e.g. all of the following would match spec.template.spec.containers.image -- - // [image, containers.image, spec.containers.image, template.spec.containers.image, - // spec.template.spec.containers.image] - // Optional. If unspecified match all field names. - FieldName string - - // FieldValue if set will add the OpenAPI reference to fields if they have this value. - // Optional. If unspecified match all field values. - FieldValue string - - // Required indicates that the setter must be set by package consumer before - // live apply/preview. This field is added to the setter definition to record - // the package publisher's intent to make the setter required to be set. - Required bool - - RecurseSubPackages bool - - OpenAPIFileName string - - // Path to openAPI file - OpenAPIPath string - - // Path to resources folder - ResourcesPath string - - SettersSchema *spec.Schema -} - -func (c *SetterCreator) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { - return nil, c.Create() -} - -func (c *SetterCreator) Create() error { - err := c.validateSetterInfo() - if err != nil { - return err - } - err = validateSchema(c.Schema) - if err != nil { - return errors.Errorf("invalid schema: %v", err) - } - - // Update the resources with the setter reference - inout := &kio.LocalPackageReadWriter{PackagePath: c.ResourcesPath} - a := &setters2.Add{ - FieldName: c.FieldName, - FieldValue: c.FieldValue, - Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + c.Name, - Type: c.Type, - SettersSchema: c.SettersSchema, - } - err = kio.Pipeline{ - Inputs: []kio.Reader{inout}, - Filters: []kio.Filter{kio.FilterAll(a)}, - Outputs: []kio.Writer{inout}, - }.Execute() - if a.Count == 0 { - fmt.Printf("setter %q doesn't match any field in resource configs, "+ - "but creating setter definition\n", c.Name) - } - if err != nil { - return err - } - - // Update the OpenAPI definitions to hace the setter - sd := setters2.SetterDefinition{ - Name: c.Name, Value: c.FieldValue, SetBy: c.SetBy, Description: c.Description, - Type: c.Type, Schema: c.Schema, Required: c.Required, - } - if err := sd.AddToFile(c.OpenAPIPath); err != nil { - return err - } - - // Load the updated definitions - sc, err := openapi.SchemaFromFile(c.OpenAPIPath) - if err != nil { - return err - } - c.SettersSchema = sc - // if the setter is of array type write the derived list values back to - // openAPI definitions - if len(a.ListValues) > 0 { - sd.ListValues = a.ListValues - sd.Value = "" - if err := sd.AddToFile(c.OpenAPIPath); err != nil { - return err - } - } - - return nil -} - -// The types recognized by by the go openapi validation library: -// https://github.com/go-openapi/validate/blob/master/helpers.go#L35 -var validTypeValues = []string{ - "object", "array", "string", "integer", "number", "boolean", "file", "null", -} - -// validateSchema parses the provided schema and validates it. -func validateSchema(schema string) error { - var sc spec.Schema - err := sc.UnmarshalJSON([]byte(schema)) - if err != nil { - return errors.Errorf("unable to parse schema: %v", err) - } - return validateSchemaTypes(&sc) -} - -// validateSchemaTypes traverses the schema and checks that only valid types -// are used. -func validateSchemaTypes(sc *spec.Schema) error { - if len(sc.Type) > 1 { - return errors.Errorf("only one type is supported: %s", strings.Join(sc.Type, ", ")) - } - - if len(sc.Type) == 1 { - t := sc.Type[0] - var match bool - for _, validType := range validTypeValues { - if t == validType { - match = true - } - } - if !match { - return errors.Errorf("type %q is not supported. Must be one of: %s", - t, strings.Join(validTypeValues, ", ")) - } - } - - if items := sc.Items; items != nil { - if items.Schema != nil { - err := validateSchemaTypes(items.Schema) - if err != nil { - return err - } - } - for i := range items.Schemas { - schema := items.Schemas[i] - err := validateSchemaTypes(&schema) - if err != nil { - return err - } - } - } - return nil -} - -func (c SetterCreator) validateSetterInfo() error { - // check if substitution with same name exists and throw error - ref, err := spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name) - if err != nil { - return err - } - - subst, _ := openapi.Resolve(&ref, c.SettersSchema) - // if substitution already exists with the input setter name, throw error - if subst != nil { - return errors.Errorf("substitution with name %q already exists, "+ - "substitution and setter can't have same name", c.Name) - } - - // check if setter with same name exists and throw error - ref, err = spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + c.Name) - if err != nil { - return err - } - - setter, _ := openapi.Resolve(&ref, c.SettersSchema) - // if setter already exists with the input setter name, throw error - if setter != nil { - return errors.Errorf("setter with name %q already exists, "+ - "if you want to modify it, please delete the existing setter and recreate it", c.Name) - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/substitutioncreator.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/substitutioncreator.go deleted file mode 100644 index 8891ecc33..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/settersutil/substitutioncreator.go +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package settersutil - -import ( - "fmt" - "io/ioutil" - "os" - "regexp" - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/kio" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/sets" - "sigs.k8s.io/kustomize/kyaml/setters2" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// SubstitutionCreator creates or updates a substitution in the OpenAPI definitions, and -// inserts references to the substitution from matching resource fields. -type SubstitutionCreator struct { - // Name is the name of the substitution to create - Name string - - // Pattern is the substitution pattern - Pattern string - - // Values are the substitution values for the pattern - Values []setters2.Value - - // FieldName if set will add the OpenAPI reference to fields with this name or path - // FieldName may be the full name of the field, full path to the field, or the path suffix. - // e.g. all of the following would match spec.template.spec.containers.image -- - // [image, containers.image, spec.containers.image, template.spec.containers.image, - // spec.template.spec.containers.image] - // Optional. If unspecified match all field names. - FieldName string - - // FieldValue if set will add the OpenAPI reference to fields if they have this value. - // Optional. If unspecified match all field values. - FieldValue string - - // Path to openAPI file - OpenAPIPath string - - OpenAPIFileName string - - RecurseSubPackages bool - - // Path to resources folder - ResourcesPath string - - SettersSchema *spec.Schema -} - -func (c *SubstitutionCreator) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { - return nil, c.Create() -} - -func (c SubstitutionCreator) Create() error { - err := c.validateSubstitutionInfo() - if err != nil { - return err - } - values, err := c.markersAndRefs(c.Name, c.Pattern) - if err != nil { - return err - } - c.Values = values - d := setters2.SubstitutionDefinition{ - Name: c.Name, - Values: c.Values, - Pattern: c.Pattern, - } - - // the input substitution definition is updated in the openAPI file and then parsed - // to check if there are any cycles in nested substitutions, if there are - // any, the openAPI file will be reverted to current state and error is thrown - stat, err := os.Stat(c.OpenAPIPath) - if err != nil { - return err - } - - curOpenAPI, err := ioutil.ReadFile(c.OpenAPIPath) - if err != nil { - return err - } - - if err := d.AddToFile(c.OpenAPIPath); err != nil { - return err - } - - // Load the updated definitions - sc, err := openapi.SchemaFromFile(c.OpenAPIPath) - if err != nil { - return err - } - c.SettersSchema = sc - - visited := sets.String{} - ref, err := spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name) - if err != nil { - return err - } - - schema, err := openapi.Resolve(&ref, c.SettersSchema) - if err != nil { - return err - } - - ext, err := setters2.GetExtFromSchema(schema) - if err != nil { - return err - } - - err = c.CreateSettersForSubstitution(c.OpenAPIPath) - if err != nil { - return err - } - - // Load the updated definitions after setters are created - sc, err = openapi.SchemaFromFile(c.OpenAPIPath) - if err != nil { - return err - } - c.SettersSchema = sc - - // revert openAPI file if there are cycles detected in created input substitution - if err := c.checkForCycles(ext, visited); err != nil { - if writeErr := ioutil.WriteFile(c.OpenAPIPath, curOpenAPI, stat.Mode().Perm()); writeErr != nil { - return writeErr - } - return err - } - - a := &setters2.Add{ - FieldName: c.FieldName, - FieldValue: c.FieldValue, - Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name, - SettersSchema: c.SettersSchema, - } - - // Update the resources with the substitution reference - inout := &kio.LocalPackageReadWriter{PackagePath: c.ResourcesPath, PackageFileName: c.OpenAPIFileName} - err = kio.Pipeline{ - Inputs: []kio.Reader{inout}, - Filters: []kio.Filter{kio.FilterAll(a)}, - Outputs: []kio.Writer{inout}, - }.Execute() - - if a.Count == 0 { - fmt.Printf("substitution %s doesn't match any field value in resource configs, "+ - "but creating substitution definition\n", c.Name) - } - return err -} - -// createMarkersAndRefs takes the input pattern, creates setter/substitution markers -// and corresponding openAPI refs -func (c *SubstitutionCreator) markersAndRefs(substName, pattern string) ([]setters2.Value, error) { - var values []setters2.Value - // extract setter name tokens from pattern enclosed in ${} - re := regexp.MustCompile(`\$\{([^}]*)\}`) - markers := re.FindAllString(pattern, -1) - if len(markers) == 0 { - return nil, errors.Errorf("unable to find setter or substitution names in pattern, " + - "setter names must be enclosed in ${}") - } - - for _, marker := range markers { - name := strings.TrimSuffix(strings.TrimPrefix(marker, "${"), "}") - if name == substName { - return nil, fmt.Errorf("setters must have different name than the substitution: %s", name) - } - - ref, err := spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + name) - if err != nil { - return nil, err - } - - var markerRef string - subst, _ := openapi.Resolve(&ref, c.SettersSchema) - // check if the substitution exists with the marker name or fall back to creating setter - // ref with the name - if subst != nil { - markerRef = fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + name - } else { - markerRef = fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + name - } - - values = append( - values, - setters2.Value{Marker: marker, Ref: markerRef}, - ) - } - return values, nil -} - -// CreateSettersForSubstitution creates the setters for all the references in the substitution -// values if they don't already exist in openAPIPath file. -func (c SubstitutionCreator) CreateSettersForSubstitution(openAPIPath string) error { - y, err := yaml.ReadFile(openAPIPath) - if err != nil { - return err - } - - m, err := c.GetValuesForMarkers() - if err != nil { - return err - } - - // for each ref in values, check if the setter or substitution already exists, if not create setter - for _, value := range c.Values { - // continue if ref is a substitution, as it has already been checked if it exists - // as part of preRunE - if strings.Contains(value.Ref, fieldmeta.SubstitutionDefinitionPrefix) { - fmt.Printf("found a substitution with name %q\n", value.Marker) - continue - } - setterObj, err := y.Pipe(yaml.Lookup( - // get the setter key from ref. Ex: from #/definitions/io.k8s.cli.setters.image_setter - // extract io.k8s.cli.setters.image_setter - "openAPI", "definitions", strings.TrimPrefix(value.Ref, fieldmeta.DefinitionsPrefix))) - - if err != nil { - return err - } - - if setterObj == nil { - name := strings.TrimPrefix(value.Ref, fieldmeta.DefinitionsPrefix+fieldmeta.SetterDefinitionPrefix) - value := m[value.Marker] - fmt.Printf("unable to find setter with name %s, creating new setter with value %s\n", name, value) - sd := setters2.SetterDefinition{ - // get the setter name from ref. Ex: from #/definitions/io.k8s.cli.setters.image_setter - // extract image_setter - Name: name, - Value: value, - } - err := sd.AddToFile(openAPIPath) - if err != nil { - return err - } - } - } - return nil -} - -func (c SubstitutionCreator) checkForCycles(ext *setters2.CliExtension, visited sets.String) error { - // check if the substitution has already been visited and throw error as cycles - // are not allowed in nested substitutions - if visited.Has(ext.Substitution.Name) { - return errors.Errorf( - "cyclic substitution detected with name " + ext.Substitution.Name) - } - - visited.Insert(ext.Substitution.Name) - - // substitute each setter into the pattern to get the new value - // if substitution references to another substitution, recursively - // process the nested substitutions to replace the pattern with setter values - for _, v := range ext.Substitution.Values { - if v.Ref == "" { - return errors.Errorf( - "missing reference on substitution " + ext.Substitution.Name) - } - ref, err := spec.NewRef(v.Ref) - if err != nil { - return errors.Wrap(err) - } - def, err := openapi.Resolve(&ref, c.SettersSchema) // resolve the def to its openAPI def - if err != nil { - return errors.Wrap(err) - } - defExt, err := setters2.GetExtFromSchema(def) // parse the extension out of the openAPI - if err != nil { - return errors.Wrap(err) - } - - if defExt.Substitution != nil { - // parse recursively if it reference is substitution - err := c.checkForCycles(defExt, visited) - if err != nil { - return err - } - } - } - - return nil -} - -// GetValuesForMarkers parses the pattern and field value to derive values for the -// markers in the pattern string. Returns error if the marker values can't be derived -func (c SubstitutionCreator) GetValuesForMarkers() (map[string]string, error) { - m := make(map[string]string) - indices, err := c.GetStartIndices() - if err != nil { - return nil, err - } - fv := c.FieldValue - pattern := c.Pattern - fvInd := 0 - patternInd := 0 - // iterate fv, pattern with indices fvInd, patternInd respectively and when patternInd hits the index of a marker, - // freeze patternInd and iterate fvInd and capture string till we find the substring just after current marker - // and before next marker - - // Ex: fv = "something/ubuntu:0.1.0", pattern = "something/IMAGE:VERSION", till patternInd reaches 10 - // just proceed fvInd and patternInd and check if fv[fvInd]==pattern[patternInd] when patternInd is 10, - // freeze patternInd and move fvInd till it sees substring ':' which derives IMAGE = ubuntu and so on. - for fvInd < len(fv) && patternInd < len(pattern) { - // if we hit marker index, extract its corresponding value - if marker, ok := indices[patternInd]; ok { - // increment the patternInd to end of marker. This helps us to extract the substring before next marker. - patternInd += len(marker) - var value string - if value, fvInd, err = c.extractValueForMarker(fvInd, fv, patternInd, indices); err != nil { - return nil, err - } - // if marker is repeated in the pattern, make sure that the corresponding values - // are same and throw error if not. - if prevValue, ok := m[marker]; ok && prevValue != value { - return nil, errors.Errorf( - "marker %s is found to have different values %s and %s", marker, prevValue, value) - } - m[marker] = value - } else { - // Ex: fv = "samething/ubuntu:0.1.0" pattern = "something/IMAGE:VERSION". Error out at 'a' in fv. - if fv[fvInd] != pattern[patternInd] { - return nil, errors.Errorf( - "unable to derive values for markers, " + - "create setters for all markers and then try again") - } - fvInd++ - patternInd++ - } - } - // check if both strings are completely visited or throw error - if fvInd < len(fv) || patternInd < len(pattern) { - return nil, errors.Errorf( - "unable to derive values for markers, " + - "create setters for all markers and then try again") - } - return m, nil -} - -// GetStartIndices returns the start indices of all the markers in the pattern -func (c SubstitutionCreator) GetStartIndices() (map[int]string, error) { - indices := make(map[int]string) - for _, value := range c.Values { - found := false - for i := range c.Pattern { - if strings.HasPrefix(c.Pattern[i:], value.Marker) { - indices[i] = value.Marker - found = true - } - } - if !found { - return nil, errors.Errorf("unable to find marker " + value.Marker + " in the pattern") - } - } - if err := validateMarkers(indices); err != nil { - return nil, err - } - return indices, nil -} - -// validateMarkers takes the indices map, checks if any of 2 markers not have delimiters, -// checks if any marker is substring of other and returns error -func validateMarkers(indices map[int]string) error { - for k1, v1 := range indices { - for k2, v2 := range indices { - if k1 != k2 && k1+len(v1) == k2 { - return errors.Errorf( - "markers %s and %s are found to have no delimiters between them,"+ - " pre-create setters and try again", v1, v2) - } - if v1 != v2 && strings.Contains(v1, v2) { - return errors.Errorf( - "markers %s is substring of %s,"+ - " no marker should be substring of other", v2, v1) - } - } - } - return nil -} - -// extractValueForMarker returns the value string for a marker and the incremented index -func (c SubstitutionCreator) extractValueForMarker(fvInd int, fv string, patternInd int, indices map[int]string) (string, int, error) { - nonMarkerStr := strTillNextMarker(indices, patternInd, c.Pattern) - - // return the remaining string of fv till end if patternInd is at end of pattern - if patternInd == len(c.Pattern) { - return fv[fvInd:], len(fv), nil - } - - // split remaining fv starting from fvInd with the non marker substring delimiter and get the first value - // In example fv = "something/ubuntu::0.1.0", pattern = "something/IMAGE::VERSION", - // split with "::" delimiter in fv which gives markerValue = ubuntu for marker IMAGE - // increment fvInd by length of extracted marker value and return fvInd - if markerValues := strings.Split(fv[fvInd:], nonMarkerStr); len(markerValues) > 0 { - return markerValues[0], fvInd + len(markerValues[0]), nil - } - - return "", -1, errors.Errorf( - "unable to derive values for markers," + - " create setters for all markers and then try again") -} - -// substrOfLen takes a string, start index and length and returns substring of given length -// or till end of string -func substrOfLen(str string, startInd int, length int) string { - return str[startInd:min(len(str), startInd+length)] -} - -// strTillNextMarker takes in the indices map, a start index and returns the substring till -// start of next marker -func strTillNextMarker(indices map[int]string, startInd int, pattern string) string { - // initialize with max value which is length of pattern - nextMarkerStartInd := len(pattern) - for ind := range indices { - if ind > startInd { - nextMarkerStartInd = min(ind-startInd, nextMarkerStartInd) - } - } - return substrOfLen(pattern, startInd, nextMarkerStartInd) -} - -func min(a int, b int) int { - if a < b { - return a - } - return b -} - -func (c SubstitutionCreator) validateSubstitutionInfo() error { - // check if substitution with same name exists and throw error - ref, err := spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name) - if err != nil { - return err - } - - subst, _ := openapi.Resolve(&ref, c.SettersSchema) - // if substitution already exists with the input substitution name, throw error - if subst != nil { - return errors.Errorf("substitution with name %q already exists", c.Name) - } - - // check if setter with same name exists and throw error - ref, err = spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + c.Name) - if err != nil { - return err - } - - setter, _ := openapi.Resolve(&ref, c.SettersSchema) - // if setter already exists with input substitution name, throw error - if setter != nil { - return errors.Errorf(fmt.Sprintf("setter with name %q already exists, "+ - "substitution and setter can't have same name", c.Name)) - } - - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/types.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/types.go deleted file mode 100644 index b389835e3..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/types.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "encoding/json" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/openapi" -) - -type CliExtension struct { - Setter *setter `yaml:"setter,omitempty" json:"setter,omitempty"` - Substitution *substitution `yaml:"substitution,omitempty" json:"substitution,omitempty"` -} - -type setter struct { - Name string `yaml:"name,omitempty" json:"name,omitempty"` - Value string `yaml:"value,omitempty" json:"value,omitempty"` - ListValues []string `yaml:"listValues,omitempty" json:"listValues,omitempty"` - EnumValues map[string]string `yaml:"enumValues,omitempty" json:"enumValues,omitempty"` - Required bool `yaml:"required,omitempty" json:"required,omitempty"` - IsSet bool `yaml:"isSet,omitempty" json:"isSet,omitempty"` -} - -type substitution struct { - Name string `yaml:"name,omitempty" json:"name,omitempty"` - Pattern string `yaml:"pattern,omitempty" json:"pattern,omitempty"` - Values []substitutionSetterReference `yaml:"values,omitempty" json:"values,omitempty"` -} - -type substitutionSetterReference struct { - Ref string `yaml:"ref,omitempty" json:"ref,omitempty"` - Marker string `yaml:"marker,omitempty" json:"marker,omitempty"` -} - -// K8sCliExtensionKey is the name of the OpenAPI field containing the setter extensions -const K8sCliExtensionKey = "x-k8s-cli" - -// GetExtFromSchema returns the cliExtension openAPI extension if it is present in schema -func GetExtFromSchema(schema *spec.Schema) (*CliExtension, error) { - cep := schema.VendorExtensible.Extensions[K8sCliExtensionKey] - if cep == nil { - return nil, nil - } - b, err := json.Marshal(cep) - if err != nil { - return nil, err - } - val := &CliExtension{} - if err := json.Unmarshal(b, val); err != nil { - return nil, err - } - return val, nil -} - -// getExtFromComment returns the cliExtension openAPI extension if it is present as -// a comment on the field. -func getExtFromComment(schema *openapi.ResourceSchema) (*CliExtension, error) { - if schema == nil { - // no schema found - // TODO(pwittrock): should this be an error if it doesn't resolve? - return nil, nil - } - - // get the cli extension from the openapi (contains setter information) - ext, err := GetExtFromSchema(schema.Schema) - if err != nil { - return nil, errors.Wrap(err) - } - return ext, nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/util.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/util.go deleted file mode 100644 index 7b16c9730..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/util.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "strings" - - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" -) - -// CheckRequiredSettersSet iterates through all the setter definitions in openAPI -// schema and returns error if any of the setter has required field true and isSet false -func CheckRequiredSettersSet(settersSchema *spec.Schema) error { - for key := range settersSchema.Definitions { - if strings.Contains(key, fieldmeta.SetterDefinitionPrefix) { - val := settersSchema.Definitions[key] - defExt, err := GetExtFromSchema(&val) // parse the extension out of the openAPI - if err != nil { - return errors.Wrap(err) - } - if defExt.Setter != nil && defExt.Setter.Required && !defExt.Setter.IsSet { - return errors.Errorf("setter %s is required but not set, "+ - "please set it to new value and try again", strings.TrimPrefix(key, fieldmeta.SetterDefinitionPrefix)) - } - } - } - return nil -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/walk.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/walk.go deleted file mode 100644 index 88c71b077..000000000 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/setters2/walk.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package setters2 - -import ( - "k8s.io/kube-openapi/pkg/validation/spec" - "sigs.k8s.io/kustomize/kyaml/fieldmeta" - "sigs.k8s.io/kustomize/kyaml/openapi" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -// visitor is implemented by structs which need to walk the configuration. -// visitor is provided to accept to walk configuration -type visitor interface { - // visitScalar is called for each scalar field value on a resource - // node is the scalar field value - // path is the path to the field; path elements are separated by '.' - // oa is the OpenAPI schema for the field - visitScalar(node *yaml.RNode, path string, oa *openapi.ResourceSchema, fieldOA *openapi.ResourceSchema) error - - // visitSequence is called for each sequence field value on a resource - // node is the sequence field value - // path is the path to the field - // oa is the OpenAPI schema for the field - visitSequence(node *yaml.RNode, path string, oa *openapi.ResourceSchema) error - - // visitMapping is called for each Mapping field value on a resource - // node is the mapping field value - // path is the path to the field - // oa is the OpenAPI schema for the field - visitMapping(node *yaml.RNode, path string, oa *openapi.ResourceSchema) error -} - -// accept invokes the appropriate function on v for each field in object -func accept(v visitor, object *yaml.RNode, settersSchema *spec.Schema) error { - // get the OpenAPI for the type if it exists - oa := getSchema(object, nil, "", settersSchema) - return acceptImpl(v, object, "", oa, settersSchema) -} - -// acceptImpl implements accept using recursion -func acceptImpl(v visitor, object *yaml.RNode, p string, oa *openapi.ResourceSchema, settersSchema *spec.Schema) error { - switch object.YNode().Kind { - case yaml.DocumentNode: - // Traverse the child of the document - return accept(v, yaml.NewRNode(object.YNode()), settersSchema) - case yaml.MappingNode: - if err := v.visitMapping(object, p, oa); err != nil { - return err - } - return object.VisitFields(func(node *yaml.MapNode) error { - // get the schema for the field and propagate it - fieldSchema := getSchema(node.Key, oa, node.Key.YNode().Value, settersSchema) - // Traverse each field value - return acceptImpl(v, node.Value, p+"."+node.Key.YNode().Value, fieldSchema, settersSchema) - }) - case yaml.SequenceNode: - // get the schema for the sequence node, use the schema provided if not present - // on the field - if err := v.visitSequence(object, p, oa); err != nil { - return err - } - // get the schema for the elements - schema := getSchema(object, oa, "", settersSchema) - return object.VisitElements(func(node *yaml.RNode) error { - // Traverse each list element - return acceptImpl(v, node, p, schema, settersSchema) - }) - case yaml.ScalarNode: - // Visit the scalar field - fieldSchema := getSchema(object, oa, "", settersSchema) - return v.visitScalar(object, p, oa, fieldSchema) - } - return nil -} - -// getSchema returns OpenAPI schema for an RNode or field of the -// RNode. It will overriding the provide schema with field specific values -// if they are found -// r is the Node to get the Schema for -// s is the provided schema for the field if known -// field is the name of the field -func getSchema(r *yaml.RNode, s *openapi.ResourceSchema, field string, settersSchema *spec.Schema) *openapi.ResourceSchema { - // get the override schema if it exists on the field - fm := fieldmeta.FieldMeta{SettersSchema: settersSchema} - if err := fm.Read(r); err == nil && !fm.IsEmpty() { - // per-field schema, this is fine - if fm.Schema.Ref.String() != "" { - // resolve the reference - s, err := openapi.Resolve(&fm.Schema.Ref, settersSchema) - if err == nil && s != nil { - fm.Schema = *s - } - } - return &openapi.ResourceSchema{Schema: &fm.Schema} - } - - // get the schema for a field of the node if the field is provided - if s != nil && field != "" { - return s.Field(field) - } - - // get the schema for the elements if this is a list - if s != nil && r.YNode().Kind == yaml.SequenceNode { - return s.Elements() - } - - // use the provided schema if present - if s != nil { - return s - } - - if yaml.IsMissingOrNull(r) { - return nil - } - - // lookup the schema for the type - m, _ := r.GetMeta() - if m.Kind == "" || m.APIVersion == "" { - return nil - } - return openapi.SchemaForResourceType(yaml.TypeMeta{Kind: m.Kind, APIVersion: m.APIVersion}) -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/utils/pathsplitter.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/utils/pathsplitter.go index aa560299f..6ce1f899d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/utils/pathsplitter.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/utils/pathsplitter.go @@ -11,6 +11,13 @@ import "strings" func PathSplitter(path string, delimiter string) []string { ps := strings.Split(path, delimiter) var res []string + + // allow path to start with forward slash + // i.e. /a/b/c + if len(ps) > 1 && ps[0] == "" { + ps = ps[1:] + } + res = append(res, ps[0]) for i := 1; i < len(ps); i++ { last := len(res) - 1 diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go index 48a025444..12c72ae83 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go @@ -7,7 +7,7 @@ import ( "bytes" "io" - "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) const ( @@ -87,6 +87,16 @@ var MappingNode yaml.Kind = yaml.MappingNode var ScalarNode yaml.Kind = yaml.ScalarNode var SequenceNode yaml.Kind = yaml.SequenceNode +func nodeKindString(k yaml.Kind) string { + return map[yaml.Kind]string{ + yaml.SequenceNode: "SequenceNode", + yaml.MappingNode: "MappingNode", + yaml.ScalarNode: "ScalarNode", + yaml.DocumentNode: "DocumentNode", + yaml.AliasNode: "AliasNode", + }[k] +} + var DoubleQuotedStyle yaml.Style = yaml.DoubleQuotedStyle var FlowStyle yaml.Style = yaml.FlowStyle var FoldedStyle yaml.Style = yaml.FoldedStyle diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go index a47114000..55709322a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go @@ -7,9 +7,9 @@ import ( "reflect" "strings" - y1_1 "gopkg.in/yaml.v2" "k8s.io/kube-openapi/pkg/validation/spec" - y1_2 "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" + y1_1 "sigs.k8s.io/yaml/goyaml.v2" + y1_2 "sigs.k8s.io/yaml/goyaml.v3" ) // typeToTag maps OpenAPI schema types to yaml 1.2 tags @@ -47,7 +47,7 @@ func FormatNonStringStyle(node *Node, schema spec.Schema) { } // if the node tag is null, make sure we don't add any non-null tags - // https://github.com/GoogleContainerTools/kpt/issues/2321 + // https://github.com/kptdev/kpt/issues/2321 if node.Tag == NodeTagNull { // must NOT quote null values node.Style = 0 diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go index e364035e6..e7d4b5f7b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go @@ -68,7 +68,7 @@ func (y *YFilter) UnmarshalYAML(unmarshal func(interface{}) error) error { type YFilters []YFilter func (y YFilters) Filters() []Filter { - var f []Filter + f := make([]Filter, 0, len(y)) for i := range y { f = append(f, y[i].Filter) } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go index e693f88a1..e80eb48bf 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go @@ -11,7 +11,7 @@ import ( "github.com/davecgh/go-spew/spew" "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) // Append creates an ElementAppender @@ -197,36 +197,37 @@ func (c FieldClearer) Filter(rn *RNode) (*RNode, error) { return nil, err } - for i := 0; i < len(rn.Content()); i += 2 { - // if name matches, remove these 2 elements from the list because - // they are treated as a fieldName/fieldValue pair. - if rn.Content()[i].Value == c.Name { - if c.IfEmpty { - if len(rn.Content()[i+1].Content) > 0 { - continue - } - } + var removed *RNode + visitFieldsWhileTrue(rn.Content(), func(key, value *yaml.Node, keyIndex int) bool { + if key.Value != c.Name { + return true + } - // save the item we are about to remove - removed := NewRNode(rn.Content()[i+1]) - if len(rn.YNode().Content) > i+2 { - l := len(rn.YNode().Content) - // remove from the middle of the list - rn.YNode().Content = rn.Content()[:i] - rn.YNode().Content = append( - rn.YNode().Content, - rn.Content()[i+2:l]...) - } else { - // remove from the end of the list - rn.YNode().Content = rn.Content()[:i] + // the name matches: remove these 2 elements from the list because + // they are treated as a fieldName/fieldValue pair. + if c.IfEmpty { + if len(value.Content) > 0 { + return true } + } - // return the removed field name and value - return removed, nil + // save the item we are about to remove + removed = NewRNode(value) + if len(rn.YNode().Content) > keyIndex+2 { + l := len(rn.YNode().Content) + // remove from the middle of the list + rn.YNode().Content = rn.Content()[:keyIndex] + rn.YNode().Content = append( + rn.YNode().Content, + rn.Content()[keyIndex+2:l]...) + } else { + // remove from the end of the list + rn.YNode().Content = rn.Content()[:keyIndex] } - } - // nothing removed - return nil, nil + return false + }) + + return removed, nil } func MatchElement(field, value string) ElementMatcher { @@ -402,14 +403,15 @@ func (f FieldMatcher) Filter(rn *RNode) (*RNode, error) { return nil, err } - for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { - isMatchingField := rn.Content()[i].Value == f.Name - if isMatchingField { - requireMatchFieldValue := f.Value != nil - if !requireMatchFieldValue || rn.Content()[i+1].Value == f.Value.YNode().Value { - return NewRNode(rn.Content()[i+1]), nil - } + var returnNode *RNode + requireMatchFieldValue := f.Value != nil + visitMappingNodeFields(rn.Content(), func(key, value *yaml.Node) { + if !requireMatchFieldValue || value.Value == f.Value.YNode().Value { + returnNode = NewRNode(value) } + }, f.Name) + if returnNode != nil { + return returnNode, nil } if f.Create != nil { @@ -550,7 +552,7 @@ func (l PathGetter) getFilter(part, nextPart string, fieldPath *[]string) (Filte default: // mapping node *fieldPath = append(*fieldPath, part) - return l.fieldFilter(part, l.getKind(nextPart)) + return l.fieldFilter(part, getPathPartKind(nextPart, l.Create)) } } @@ -590,15 +592,18 @@ func (l PathGetter) fieldFilter( return FieldMatcher{Name: name, Create: &RNode{value: &yaml.Node{Kind: kind, Style: l.Style}}}, nil } -func (l PathGetter) getKind(nextPart string) yaml.Kind { +func getPathPartKind(nextPart string, defaultKind yaml.Kind) yaml.Kind { if IsListIndex(nextPart) { // if nextPart is of the form [a=b], then it is an index into a Sequence // so the current part must be a SequenceNode return yaml.SequenceNode } + if IsIdxNumber(nextPart) { + return yaml.SequenceNode + } if nextPart == "" { - // final name in the path, use the l.Create defined Kind - return l.Create + // final name in the path, use the default kind provided + return defaultKind } // non-sequence intermediate Node @@ -640,13 +645,19 @@ func (s MapEntrySetter) Filter(rn *RNode) (*RNode, error) { if s.Name == "" { s.Name = GetValue(s.Key) } - for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { - isMatchingField := rn.Content()[i].Value == s.Name - if isMatchingField { - rn.Content()[i] = s.Key.YNode() - rn.Content()[i+1] = s.Value.YNode() - return rn, nil + + content := rn.Content() + fieldStillNotFound := true + visitFieldsWhileTrue(content, func(key, value *yaml.Node, keyIndex int) bool { + if key.Value == s.Name { + content[keyIndex] = s.Key.YNode() + content[keyIndex+1] = s.Value.YNode() + fieldStillNotFound = false } + return fieldStillNotFound + }) + if !fieldStillNotFound { + return rn, nil } // create the field @@ -679,6 +690,10 @@ type FieldSetter struct { // when setting it. Otherwise, if an existing node is found, the style is // retained. OverrideStyle bool `yaml:"overrideStyle,omitempty"` + + // AppendKeyStyle defines the style of the key when no existing node is + // found, and a new node is appended. + AppendKeyStyle Style `yaml:"appendKeyStyle,omitempty"` } func (s FieldSetter) Filter(rn *RNode) (*RNode, error) { @@ -736,6 +751,7 @@ func (s FieldSetter) Filter(rn *RNode) (*RNode, error) { &yaml.Node{ Kind: yaml.ScalarNode, Value: s.Name, + Style: s.AppendKeyStyle, HeadComment: s.Comments.HeadComment, LineComment: s.Comments.LineComment, FootComment: s.Comments.FootComment, @@ -794,12 +810,22 @@ func ErrorIfAnyInvalidAndNonNull(kind yaml.Kind, rn ...*RNode) error { return nil } -var nodeTypeIndex = map[yaml.Kind]string{ - yaml.SequenceNode: "SequenceNode", - yaml.MappingNode: "MappingNode", - yaml.ScalarNode: "ScalarNode", - yaml.DocumentNode: "DocumentNode", - yaml.AliasNode: "AliasNode", +type InvalidNodeKindError struct { + expectedKind yaml.Kind + node *RNode +} + +func (e *InvalidNodeKindError) Error() string { + msg := fmt.Sprintf("wrong node kind: expected %s but got %s", + nodeKindString(e.expectedKind), nodeKindString(e.node.YNode().Kind)) + if content, err := e.node.String(); err == nil { + msg += fmt.Sprintf(": node contents:\n%s", content) + } + return msg +} + +func (e *InvalidNodeKindError) ActualNodeKind() Kind { + return e.node.YNode().Kind } func ErrorIfInvalid(rn *RNode, kind yaml.Kind) error { @@ -809,11 +835,7 @@ func ErrorIfInvalid(rn *RNode, kind yaml.Kind) error { } if rn.YNode().Kind != kind { - s, _ := rn.String() - return errors.Errorf( - "wrong Node Kind for %s expected: %v was %v: value: {%s}", - strings.Join(rn.FieldPath(), "."), - nodeTypeIndex[kind], nodeTypeIndex[rn.YNode().Kind], strings.TrimSpace(s)) + return &InvalidNodeKindError{node: rn, expectedKind: kind} } if kind == yaml.MappingNode { @@ -859,9 +881,3 @@ func SplitIndexNameValue(p string) (string, string, error) { } return parts[0], parts[1], nil } - -// IncrementFieldIndex increments i to point to the next field name element in -// a slice of Contents. -func IncrementFieldIndex(i int) int { - return i + 2 -} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go index 2ae8c1665..a7d901672 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go @@ -5,7 +5,7 @@ package yaml import ( "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) // AnnotationClearer removes an annotation at metadata.annotations. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go index d53f563d6..8e40d4c2b 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go @@ -4,9 +4,13 @@ package yaml import ( + "fmt" "regexp" "strconv" "strings" + + "sigs.k8s.io/kustomize/kyaml/errors" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) // PathMatcher returns all RNodes matching the path wrapped in a SequenceNode. @@ -21,7 +25,7 @@ type PathMatcher struct { // Each path part may be one of: // * FieldMatcher -- e.g. "spec" // * Map Key -- e.g. "app.k8s.io/version" - // * List Entry -- e.g. "[name=nginx]" or "[=-jar]" + // * List Entry -- e.g. "[name=nginx]" or "[=-jar]" or "0" // // Map Keys and Fields are equivalent. // See FieldMatcher for more on Fields and Map Keys. @@ -43,10 +47,18 @@ type PathMatcher struct { // This is useful for if the nodes are to be printed in FlowStyle. StripComments bool - val *RNode - field string - matchRegex string - indexNumber int + // Create will cause missing path parts to be created as they are walked. + // + // * The leaf Node (final path) will be created with a Kind matching Create + // * Intermediary Nodes will be created as either a MappingNodes or + // SequenceNodes as appropriate for each's Path location. + // * Nodes identified by an index will only be created if the index indicates + // an append operation (i.e. index=len(list)) + Create yaml.Kind `yaml:"create,omitempty"` + + val *RNode + field string + matchRegex string } func (p *PathMatcher) stripComments(n *Node) { @@ -109,7 +121,7 @@ func (p *PathMatcher) doMatchEvery(rn *RNode) (*RNode, error) { func (p *PathMatcher) visitEveryElem(elem *RNode) error { fieldName := p.Path[0] // recurse on the matching element - pm := &PathMatcher{Path: p.Path[1:]} + pm := &PathMatcher{Path: p.Path[1:], Create: p.Create} add, err := pm.filter(elem) for k, v := range pm.Matches { p.Matches[k] = v @@ -125,13 +137,25 @@ func (p *PathMatcher) visitEveryElem(elem *RNode) error { func (p *PathMatcher) doField(rn *RNode) (*RNode, error) { // lookup the field field, err := rn.Pipe(Get(p.Path[0])) - if err != nil || field == nil { - // if the field doesn't exist, return nil + if err != nil || (!IsCreate(p.Create) && field == nil) { return nil, err } + if IsCreate(p.Create) && field == nil { + var nextPart string + if len(p.Path) > 1 { + nextPart = p.Path[1] + } + nextPartKind := getPathPartKind(nextPart, p.Create) + field = &RNode{value: &yaml.Node{Kind: nextPartKind}} + err := rn.PipeE(SetField(p.Path[0], field)) + if err != nil { + return nil, err + } + } + // recurse on the field, removing the first element of the path - pm := &PathMatcher{Path: p.Path[1:]} + pm := &PathMatcher{Path: p.Path[1:], Create: p.Create} p.val, err = pm.filter(field) p.Matches = pm.Matches return p.val, err @@ -144,18 +168,33 @@ func (p *PathMatcher) doIndexSeq(rn *RNode) (*RNode, error) { if err != nil { return nil, err } - p.indexNumber = idx elements, err := rn.Elements() if err != nil { return nil, err } + if len(elements) == idx && IsCreate(p.Create) { + var nextPart string + if len(p.Path) > 1 { + nextPart = p.Path[1] + } + elem := &yaml.Node{Kind: getPathPartKind(nextPart, p.Create)} + err = rn.PipeE(Append(elem)) + if err != nil { + return nil, errors.WrapPrefixf(err, "failed to append element for %q", p.Path[0]) + } + elements = append(elements, NewRNode(elem)) + } + + if len(elements) < idx+1 { + return nil, fmt.Errorf("index %d specified but only %d elements found", idx, len(elements)) + } // get target element element := elements[idx] // recurse on the matching element - pm := &PathMatcher{Path: p.Path[1:]} + pm := &PathMatcher{Path: p.Path[1:], Create: p.Create} add, err := pm.filter(element) for k, v := range pm.Matches { p.Matches[k] = v @@ -176,16 +215,39 @@ func (p *PathMatcher) doSeq(rn *RNode) (*RNode, error) { return nil, err } - if p.field == "" { + primitiveElement := len(p.field) == 0 + if primitiveElement { err = rn.VisitElements(p.visitPrimitiveElem) } else { err = rn.VisitElements(p.visitElem) } - if err != nil || p.val == nil || len(p.val.YNode().Content) == 0 { + if err != nil { return nil, err } + if !p.val.IsNil() && len(p.val.YNode().Content) == 0 { + p.val = nil + } - return p.val, nil + if !IsCreate(p.Create) || p.val != nil { + return p.val, nil + } + + var elem *yaml.Node + valueNode := NewScalarRNode(p.matchRegex).YNode() + if primitiveElement { + elem = valueNode + } else { + elem = &yaml.Node{ + Kind: yaml.MappingNode, + Content: []*yaml.Node{{Kind: yaml.ScalarNode, Value: p.field}, valueNode}, + } + } + err = rn.PipeE(Append(elem)) + if err != nil { + return nil, errors.WrapPrefixf(err, "failed to create element for %q", p.Path[0]) + } + // re-do the sequence search; this time we'll find the element we just created + return p.doSeq(rn) } func (p *PathMatcher) visitPrimitiveElem(elem *RNode) error { @@ -228,7 +290,7 @@ func (p *PathMatcher) visitElem(elem *RNode) error { } // recurse on the matching element - pm := &PathMatcher{Path: p.Path[1:]} + pm := &PathMatcher{Path: p.Path[1:], Create: p.Create} add, err := pm.filter(elem) for k, v := range pm.Matches { p.Matches[k] = v diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go index ab0c8244c..8b328ab9d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go @@ -1,7 +1,7 @@ // Copyright 2019 The Kubernetes Authors. // SPDX-License-Identifier: Apache-2.0 -// Package merge contains libraries for merging fields from one RNode to another +// Package merge2 contains libraries for merging fields from one RNode to another // RNode package merge2 @@ -20,7 +20,7 @@ func Merge(src, dest *yaml.RNode, mergeOptions yaml.MergeOptions) (*yaml.RNode, }.Walk() } -// Merge parses the arguments, and merges fields from srcStr into destStr. +// MergeStrings parses the arguments, and merges fields from srcStr into destStr. func MergeStrings(srcStr, destStr string, infer bool, mergeOptions yaml.MergeOptions) (string, error) { src, err := yaml.Parse(srcStr) if err != nil { @@ -64,6 +64,12 @@ func (m Merger) VisitMap(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.R return walk.ClearNode, nil } + // If Origin is missing, preserve explicitly set null in Dest ("null", "~", etc) + if nodes.Origin().IsNil() && !nodes.Dest().IsNil() && len(nodes.Dest().YNode().Value) > 0 { + // Return a new node so that it won't have a "!!null" tag and therefore won't be cleared. + return yaml.NewScalarRNode(nodes.Dest().YNode().Value), nil + } + return nodes.Origin(), nil } if nodes.Origin().IsTaggedNull() { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go index 07bb8a0e1..bf3b5347f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go @@ -6,17 +6,17 @@ package yaml import ( "encoding/json" "fmt" - "io/ioutil" "log" + "os" "regexp" "strconv" "strings" "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" "sigs.k8s.io/kustomize/kyaml/sliceutil" "sigs.k8s.io/kustomize/kyaml/utils" "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) // MakeNullNode returns an RNode that represents an empty document. @@ -53,7 +53,7 @@ func Parse(value string) (*RNode, error) { // ReadFile parses a single Resource from a yaml file. // To parse multiple resources, consider a kio.ByteReader func ReadFile(path string) (*RNode, error) { - b, err := ioutil.ReadFile(path) + b, err := os.ReadFile(path) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func WriteFile(node *RNode, path string) error { if err != nil { return err } - return ioutil.WriteFile(path, []byte(out), 0600) + return errors.WrapPrefixf(os.WriteFile(path, []byte(out), 0600), "writing RNode to file") } // UpdateFile reads the file at path, applies the filter to it, and write the result back. @@ -242,11 +242,7 @@ func (rn *RNode) IsTaggedNull() bool { // IsNilOrEmpty is true if the node is nil, // has no YNode, or has YNode that appears empty. func (rn *RNode) IsNilOrEmpty() bool { - return rn.IsNil() || - IsYNodeTaggedNull(rn.YNode()) || - IsYNodeEmptyMap(rn.YNode()) || - IsYNodeEmptySeq(rn.YNode()) || - IsYNodeZero(rn.YNode()) + return rn.IsNil() || IsYNodeNilOrEmpty(rn.YNode()) } // IsStringValue is true if the RNode is not nil and is scalar string node @@ -420,12 +416,11 @@ func (rn *RNode) SetApiVersion(av string) { // given field, so this function cannot be used to make distinctions // between these cases. func (rn *RNode) getMapFieldValue(field string) *yaml.Node { - for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { - if rn.Content()[i].Value == field { - return rn.Content()[i+1] - } - } - return nil + var result *yaml.Node + visitMappingNodeFields(rn.Content(), func(key, value *yaml.Node) { + result = value + }, field) + return result } // GetName returns the name, or empty string if @@ -440,31 +435,33 @@ func (rn *RNode) getMetaStringField(fName string) string { if md == nil { return "" } - f := md.Field(fName) - if f.IsNilOrEmpty() { - return "" - } - return GetValue(f.Value) + var result string + visitMappingNodeFields(md.Content, func(key, value *yaml.Node) { + if !IsYNodeNilOrEmpty(value) { + result = value.Value + } + }, fName) + return result } -// getMetaData returns the RNode holding the value of the metadata field. +// getMetaData returns the *yaml.Node of the metadata field. // Return nil if field not found (no error). -func (rn *RNode) getMetaData() *RNode { +func (rn *RNode) getMetaData() *yaml.Node { if IsMissingOrNull(rn) { return nil } - var n *RNode + content := rn.Content() if rn.YNode().Kind == DocumentNode { // get the content if this is the document node - n = NewRNode(rn.Content()[0]) - } else { - n = rn + content = content[0].Content } - mf := n.Field(MetadataField) - if mf.IsNilOrEmpty() { - return nil - } - return mf.Value + var mf *yaml.Node + visitMappingNodeFields(content, func(key, value *yaml.Node) { + if !IsYNodeNilOrEmpty(value) { + mf = value + } + }, MetadataField) + return mf } // SetName sets the metadata name field. @@ -496,14 +493,14 @@ func (rn *RNode) SetNamespace(ns string) error { } // GetAnnotations gets the metadata annotations field. -// If the field is missing, returns an empty map. +// If the annotations field is missing, returns an empty map. // Use another method to check for missing metadata. -func (rn *RNode) GetAnnotations() map[string]string { - meta := rn.getMetaData() - if meta == nil { - return make(map[string]string) - } - return rn.getMapFromMeta(meta, AnnotationsField) +// If specific annotations are provided, then the map is +// restricted to only those entries with keys that match +// one of the specific annotations. If no annotations are +// provided, then the map will contain all entries. +func (rn *RNode) GetAnnotations(annotations ...string) map[string]string { + return rn.getMapFromMeta(AnnotationsField, annotations...) } // SetAnnotations tries to set the metadata annotations field. @@ -512,24 +509,45 @@ func (rn *RNode) SetAnnotations(m map[string]string) error { } // GetLabels gets the metadata labels field. -// If the field is missing, returns an empty map. +// If the labels field is missing, returns an empty map. // Use another method to check for missing metadata. -func (rn *RNode) GetLabels() map[string]string { +// If specific labels are provided, then the map is +// restricted to only those entries with keys that match +// one of the specific labels. If no labels are +// provided, then the map will contain all entries. +func (rn *RNode) GetLabels(labels ...string) map[string]string { + return rn.getMapFromMeta(LabelsField, labels...) +} + +// getMapFromMeta returns a map, sometimes empty, from the fName +// field in the node's metadata field. +// If specific fields are provided, then the map is +// restricted to only those entries with keys that match +// one of the specific fields. If no fields are +// provided, then the map will contain all entries. +func (rn *RNode) getMapFromMeta(fName string, fields ...string) map[string]string { meta := rn.getMetaData() if meta == nil { return make(map[string]string) } - return rn.getMapFromMeta(meta, LabelsField) -} -// getMapFromMeta returns map, sometimes empty, from metadata. -func (rn *RNode) getMapFromMeta(meta *RNode, fName string) map[string]string { - result := make(map[string]string) - if f := meta.Field(fName); !f.IsNilOrEmpty() { - _ = f.Value.VisitFields(func(node *MapNode) error { - result[GetValue(node.Key)] = GetValue(node.Value) - return nil - }) + var result map[string]string + + visitMappingNodeFields(meta.Content, func(_, fNameValue *yaml.Node) { + // fName is found in metadata; create the map from its content + expectedSize := len(fields) + if expectedSize == 0 { + expectedSize = len(fNameValue.Content) / 2 //nolint: gomnd + } + result = make(map[string]string, expectedSize) + + visitMappingNodeFields(fNameValue.Content, func(key, value *yaml.Node) { + result[key.Value] = value.Value + }, fields...) + }, fName) + + if result == nil { + return make(map[string]string) } return result } @@ -696,9 +714,9 @@ func (rn *RNode) Fields() ([]string, error) { return nil, errors.Wrap(err) } var fields []string - for i := 0; i < len(rn.Content()); i += 2 { - fields = append(fields, rn.Content()[i].Value) - } + visitMappingNodeFields(rn.Content(), func(key, value *yaml.Node) { + fields = append(fields, key.Value) + }) return fields, nil } @@ -709,13 +727,12 @@ func (rn *RNode) FieldRNodes() ([]*RNode, error) { return nil, errors.Wrap(err) } var fields []*RNode - for i := 0; i < len(rn.Content()); i += 2 { - yNode := rn.Content()[i] + visitMappingNodeFields(rn.Content(), func(key, value *yaml.Node) { // for each key node in the input mapping node contents create equivalent rNode rNode := &RNode{} - rNode.SetYNode(yNode) + rNode.SetYNode(key) fields = append(fields, rNode) - } + }) return fields, nil } @@ -725,13 +742,11 @@ func (rn *RNode) Field(field string) *MapNode { if rn.YNode().Kind != yaml.MappingNode { return nil } - for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { - isMatchingField := rn.Content()[i].Value == field - if isMatchingField { - return &MapNode{Key: NewRNode(rn.Content()[i]), Value: NewRNode(rn.Content()[i+1])} - } - } - return nil + var result *MapNode + visitMappingNodeFields(rn.Content(), func(key, value *yaml.Node) { + result = &MapNode{Key: NewRNode(key), Value: NewRNode(value)} + }, field) + return result } // VisitFields calls fn for each field in the RNode. @@ -752,6 +767,59 @@ func (rn *RNode) VisitFields(fn func(node *MapNode) error) error { return nil } +// visitMappingNodeFields calls fn for fields in the content, in content order. +// The caller is responsible to ensure the node is a mapping node. If fieldNames +// are specified, then fn is called only for the fields that match the given +// fieldNames. +func visitMappingNodeFields(content []*yaml.Node, fn func(key, value *yaml.Node), fieldNames ...string) { + switch len(fieldNames) { + case 0: // visit all fields + visitFieldsWhileTrue(content, func(key, value *yaml.Node, _ int) bool { + fn(key, value) + return true + }) + case 1: // visit single field + visitFieldsWhileTrue(content, func(key, value *yaml.Node, _ int) bool { + if key == nil { + return true + } + if fieldNames[0] == key.Value { + fn(key, value) + return false + } + return true + }) + default: // visit specified fields + fieldsStillToVisit := make(map[string]bool, len(fieldNames)) + for _, fieldName := range fieldNames { + fieldsStillToVisit[fieldName] = true + } + visitFieldsWhileTrue(content, func(key, value *yaml.Node, _ int) bool { + if key == nil { + return true + } + if fieldsStillToVisit[key.Value] { + fn(key, value) + delete(fieldsStillToVisit, key.Value) + } + return len(fieldsStillToVisit) > 0 + }) + } +} + +// visitFieldsWhileTrue calls fn for the fields in content, in content order, +// until either fn returns false or all fields have been visited. The caller +// should ensure that content is from a mapping node, or fits the same expected +// pattern (consecutive key/value entries in the slice). +func visitFieldsWhileTrue(content []*yaml.Node, fn func(key, value *yaml.Node, keyIndex int) bool) { + for i := 0; i < len(content); i += 2 { + continueVisiting := fn(content[i], content[i+1], i) + if !continueVisiting { + return + } + } +} + // Elements returns the list of elements in the RNode. // Returns an error for non-SequenceNodes. func (rn *RNode) Elements() ([]*RNode, error) { @@ -937,7 +1005,11 @@ func deAnchor(yn *yaml.Node) (res *yaml.Node, err error) { case yaml.ScalarNode: return yn, nil case yaml.AliasNode: - return deAnchor(yn.Alias) + result, err := deAnchor(yn.Alias) + if err != nil { + return nil, err + } + return CopyYNode(result), nil case yaml.MappingNode: toMerge, err := removeMergeTags(yn) if err != nil { @@ -1003,17 +1075,19 @@ func findMergeValues(yn *yaml.Node) ([]*yaml.Node, error) { // it fails. func getMergeTagValue(yn *yaml.Node) (*yaml.Node, error) { var result *yaml.Node - for i := 0; i < len(yn.Content); i += 2 { - key := yn.Content[i] - value := yn.Content[i+1] + var err error + visitFieldsWhileTrue(yn.Content, func(key, value *yaml.Node, _ int) bool { if isMerge(key) { if result != nil { - return nil, fmt.Errorf("duplicate merge key") + err = fmt.Errorf("duplicate merge key") + result = nil + return false } result = value } - } - return result, nil + return true + }) + return result, err } // removeMergeTags removes all merge tags and returns a ordered list of yaml diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go index 5fbbba1b0..73f5d8406 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go @@ -8,8 +8,8 @@ import ( "strings" "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml" "sigs.k8s.io/kustomize/kyaml/sets" + yaml "sigs.k8s.io/yaml/goyaml.v3" ) // CopyYNode returns a distinct copy of its argument. @@ -39,11 +39,20 @@ func IsYNodeEmptyMap(n *yaml.Node) bool { return n != nil && n.Kind == yaml.MappingNode && len(n.Content) == 0 } -// IsYNodeEmptyMap is true if the Node is a non-nil empty sequence. +// IsYNodeEmptySeq is true if the Node is a non-nil empty sequence. func IsYNodeEmptySeq(n *yaml.Node) bool { return n != nil && n.Kind == yaml.SequenceNode && len(n.Content) == 0 } +// IsYNodeNilOrEmpty is true if the Node is nil or appears empty. +func IsYNodeNilOrEmpty(n *yaml.Node) bool { + return n == nil || + IsYNodeTaggedNull(n) || + IsYNodeEmptyMap(n) || + IsYNodeEmptySeq(n) || + IsYNodeZero(n) +} + // IsYNodeEmptyDoc is true if the node is a Document with no content. // E.g.: "---\n---" func IsYNodeEmptyDoc(n *yaml.Node) bool { @@ -238,3 +247,53 @@ type MergeOptions struct { // source list to destination or append. ListIncreaseDirection MergeOptionsListIncreaseDirection } + +// Since ObjectMeta and TypeMeta are stable, we manually create DeepCopy funcs for ResourceMeta and ObjectMeta. +// For TypeMeta and NameMeta no DeepCopy funcs are required, as they only contain basic types. + +// DeepCopyInto copies the receiver, writing into out. in must be non-nil. +func (in *ObjectMeta) DeepCopyInto(out *ObjectMeta) { + *out = *in + out.NameMeta = in.NameMeta + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy copies the receiver, creating a new ObjectMeta. +func (in *ObjectMeta) DeepCopy() *ObjectMeta { + if in == nil { + return nil + } + out := new(ObjectMeta) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto copies the receiver, writing into out. in must be non-nil. +func (in *ResourceMeta) DeepCopyInto(out *ResourceMeta) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) +} + +// DeepCopy copies the receiver, creating a new ResourceMeta. +func (in *ResourceMeta) DeepCopy() *ResourceMeta { + if in == nil { + return nil + } + out := new(ResourceMeta) + in.DeepCopyInto(out) + return out +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go index 7657ebc0f..5cea8d92f 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go @@ -217,7 +217,7 @@ func (l *Walker) setAssociativeSequenceElements(valuesList [][]string, keys []st // Add the val to the sequence. val will replace the item in the sequence if // there is an item that matches all key-value pairs. Otherwise val will be appended - // the the sequence. + // the sequence. _, err = itemsToBeAdded.Pipe(yaml.ElementSetter{ Element: val.YNode(), Keys: validKeys, diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go index 998af6d32..afeec0a5a 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go +++ b/tools/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go @@ -58,7 +58,7 @@ func (l Walker) walkMap() (*yaml.RNode, error) { if l.Schema != nil { s = l.Schema.Field(key) } - fv, commentSch := l.fieldValue(key) + fv, commentSch, keyStyles := l.fieldValue(key) if commentSch != nil { s = commentSch } @@ -90,7 +90,13 @@ func (l Walker) walkMap() (*yaml.RNode, error) { } // this handles empty and non-empty values - _, err = dest.Pipe(yaml.FieldSetter{Name: key, Comments: comments, Value: val}) + fieldSetter := yaml.FieldSetter{ + Name: key, + Comments: comments, + AppendKeyStyle: keyStyles[val], + Value: val, + } + _, err = dest.Pipe(fieldSetter) if err != nil { return nil, err } @@ -153,10 +159,12 @@ func (l Walker) fieldNames() []string { return result } -// fieldValue returns a slice containing each source's value for fieldName -func (l Walker) fieldValue(fieldName string) ([]*yaml.RNode, *openapi.ResourceSchema) { +// fieldValue returns a slice containing each source's value for fieldName, the +// schema, and a map of each source's value to the style for the source's key. +func (l Walker) fieldValue(fieldName string) ([]*yaml.RNode, *openapi.ResourceSchema, map[*yaml.RNode]yaml.Style) { var fields []*yaml.RNode var sch *openapi.ResourceSchema + keyStyles := make(map[*yaml.RNode]yaml.Style, len(l.Sources)) for i := range l.Sources { if l.Sources[i] == nil { fields = append(fields, nil) @@ -165,9 +173,12 @@ func (l Walker) fieldValue(fieldName string) ([]*yaml.RNode, *openapi.ResourceSc field := l.Sources[i].Field(fieldName) f, s := l.valueIfPresent(field) fields = append(fields, f) + if field != nil && field.Key != nil && field.Key.YNode() != nil { + keyStyles[f] = field.Key.YNode().Style + } if sch == nil && !s.IsMissingOrNull() { sch = s } } - return fields, sch + return fields, sch, keyStyles } diff --git a/tools/vendor/sigs.k8s.io/yaml/LICENSE b/tools/vendor/sigs.k8s.io/yaml/LICENSE index 7805d36de..093d6d3ed 100644 --- a/tools/vendor/sigs.k8s.io/yaml/LICENSE +++ b/tools/vendor/sigs.k8s.io/yaml/LICENSE @@ -48,3 +48,259 @@ 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. + +# The forked go-yaml.v3 library under this project is covered by two +different licenses (MIT and Apache): + +#### MIT License #### + +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 Canonical Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +# The forked go-yaml.v2 library under the project is covered by an +Apache license: + + 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/tools/vendor/sigs.k8s.io/yaml/OWNERS b/tools/vendor/sigs.k8s.io/yaml/OWNERS index 325b40b07..003a149e1 100644 --- a/tools/vendor/sigs.k8s.io/yaml/OWNERS +++ b/tools/vendor/sigs.k8s.io/yaml/OWNERS @@ -2,26 +2,22 @@ approvers: - dims -- lavalamp +- jpbetz - smarterclayton - deads2k - sttts - liggitt -- caesarxuchao reviewers: - dims - thockin -- lavalamp +- jpbetz - smarterclayton - wojtek-t - deads2k - derekwaynecarr -- caesarxuchao - mikedanese - liggitt -- gmarek - sttts -- ncdc - tallclair labels: - sig/api-machinery diff --git a/tools/vendor/sigs.k8s.io/yaml/fields.go b/tools/vendor/sigs.k8s.io/yaml/fields.go index 235b7f2cf..0ea28bd03 100644 --- a/tools/vendor/sigs.k8s.io/yaml/fields.go +++ b/tools/vendor/sigs.k8s.io/yaml/fields.go @@ -16,53 +16,53 @@ import ( "unicode/utf8" ) -// indirect walks down v allocating pointers as needed, +// indirect walks down 'value' allocating pointers as needed, // until it gets to a non-pointer. // if it encounters an Unmarshaler, indirect stops and returns that. // if decodingNull is true, indirect stops at the last pointer so it can be set to nil. -func indirect(v reflect.Value, decodingNull bool) (json.Unmarshaler, encoding.TextUnmarshaler, reflect.Value) { - // If v is a named type and is addressable, +func indirect(value reflect.Value, decodingNull bool) (json.Unmarshaler, encoding.TextUnmarshaler, reflect.Value) { + // If 'value' is a named type and is addressable, // start with its address, so that if the type has pointer methods, // we find them. - if v.Kind() != reflect.Ptr && v.Type().Name() != "" && v.CanAddr() { - v = v.Addr() + if value.Kind() != reflect.Ptr && value.Type().Name() != "" && value.CanAddr() { + value = value.Addr() } for { // Load value from interface, but only if the result will be // usefully addressable. - if v.Kind() == reflect.Interface && !v.IsNil() { - e := v.Elem() - if e.Kind() == reflect.Ptr && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Ptr) { - v = e + if value.Kind() == reflect.Interface && !value.IsNil() { + element := value.Elem() + if element.Kind() == reflect.Ptr && !element.IsNil() && (!decodingNull || element.Elem().Kind() == reflect.Ptr) { + value = element continue } } - if v.Kind() != reflect.Ptr { + if value.Kind() != reflect.Ptr { break } - if v.Elem().Kind() != reflect.Ptr && decodingNull && v.CanSet() { + if value.Elem().Kind() != reflect.Ptr && decodingNull && value.CanSet() { break } - if v.IsNil() { - if v.CanSet() { - v.Set(reflect.New(v.Type().Elem())) + if value.IsNil() { + if value.CanSet() { + value.Set(reflect.New(value.Type().Elem())) } else { - v = reflect.New(v.Type().Elem()) + value = reflect.New(value.Type().Elem()) } } - if v.Type().NumMethod() > 0 { - if u, ok := v.Interface().(json.Unmarshaler); ok { + if value.Type().NumMethod() > 0 { + if u, ok := value.Interface().(json.Unmarshaler); ok { return u, nil, reflect.Value{} } - if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + if u, ok := value.Interface().(encoding.TextUnmarshaler); ok { return nil, u, reflect.Value{} } } - v = v.Elem() + value = value.Elem() } - return nil, nil, v + return nil, nil, value } // A field represents a single field found in a struct. @@ -134,8 +134,8 @@ func typeFields(t reflect.Type) []field { next := []field{{typ: t}} // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} + var count map[reflect.Type]int + var nextCount map[reflect.Type]int // Types already visited at an earlier level. visited := map[reflect.Type]bool{} @@ -348,8 +348,9 @@ const ( // 4) simpleLetterEqualFold, no specials, no non-letters. // // The letters S and K are special because they map to 3 runes, not just 2: -// * S maps to s and to U+017F 'Å¿' Latin small letter long s -// * k maps to K and to U+212A 'K' Kelvin sign +// - S maps to s and to U+017F 'Å¿' Latin small letter long s +// - k maps to K and to U+212A 'K' Kelvin sign +// // See http://play.golang.org/p/tTxjOc0OGo // // The returned function is specialized for matching against s and @@ -420,10 +421,8 @@ func equalFoldRight(s, t []byte) bool { t = t[size:] } - if len(t) > 0 { - return false - } - return true + + return len(t) <= 0 } // asciiEqualFold is a specialization of bytes.EqualFold for use when diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/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/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE.libyaml b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE.libyaml new file mode 100644 index 000000000..8da58fbf6 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE.libyaml @@ -0,0 +1,31 @@ +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original copyright and license: + + apic.go + emitterc.go + parserc.go + readerc.go + scannerc.go + writerc.go + yamlh.go + yamlprivateh.go + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/NOTICE b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/NOTICE similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/NOTICE rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v2/NOTICE diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/OWNERS b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/OWNERS new file mode 100644 index 000000000..73be0a3a9 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/OWNERS @@ -0,0 +1,24 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- dims +- jpbetz +- smarterclayton +- deads2k +- sttts +- liggitt +- natasha41575 +- knverey +reviewers: +- dims +- thockin +- jpbetz +- smarterclayton +- deads2k +- derekwaynecarr +- mikedanese +- liggitt +- sttts +- tallclair +labels: +- sig/api-machinery diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/README.md b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/README.md new file mode 100644 index 000000000..53f4139dc --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/README.md @@ -0,0 +1,143 @@ +# go-yaml fork + +This package is a fork of the go-yaml library and is intended solely for consumption +by kubernetes projects. In this fork, we plan to support only critical changes required for +kubernetes, such as small bug fixes and regressions. Larger, general-purpose feature requests +should be made in the upstream go-yaml library, and we will reject such changes in this fork +unless we are pulling them from upstream. + +This fork is based on v2.4.0: https://github.com/go-yaml/yaml/releases/tag/v2.4.0 + +# YAML support for the Go language + +Introduction +------------ + +The yaml package enables Go programs to comfortably encode and decode YAML +values. It was developed within [Canonical](https://www.canonical.com) as +part of the [juju](https://juju.ubuntu.com) project, and is based on a +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) +C library to parse and generate YAML data quickly and reliably. + +Compatibility +------------- + +The yaml package supports most of YAML 1.1 and 1.2, including support for +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet +implemented, and base-60 floats from YAML 1.1 are purposefully not +supported since they're a poor design and are gone in YAML 1.2. + +Installation and usage +---------------------- + +The import path for the package is *gopkg.in/yaml.v2*. + +To install it, run: + + go get gopkg.in/yaml.v2 + +API documentation +----------------- + +If opened in a browser, the import path itself leads to the API documentation: + + * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2) + +API stability +------------- + +The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in). + + +License +------- + +The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details. + + +Example +------- + +```Go +package main + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v2" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +// Note: struct fields must be public in order for unmarshal to +// correctly populate the data. +type T struct { + A string + B struct { + RenamedC int `yaml:"c"` + D []int `yaml:",flow"` + } +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + +This example will generate the following output: + +``` +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go new file mode 100644 index 000000000..acf71402c --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go @@ -0,0 +1,744 @@ +package yaml + +import ( + "io" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// Reader read handler. +func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_reader.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_reader_read_handler + parser.input_reader = r +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +var disableLineWrapping = false + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + } + if disableLineWrapping { + emitter.best_width = -1 + } +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// yaml_writer_write_handler uses emitter.output_writer to write the +// emitted text. +func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_writer.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_writer_write_handler + emitter.output_writer = w +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +//// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize( + event *yaml_event_t, + version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, + implicit bool, +) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } +} + +///* +// * Create ALIAS. +// */ +// +//YAML_DECLARE(int) +//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) +//{ +// mark yaml_mark_t = { 0, 0, 0 } +// anchor_copy *yaml_char_t = NULL +// +// assert(event) // Non-NULL event object is expected. +// assert(anchor) // Non-NULL anchor is expected. +// +// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 +// +// anchor_copy = yaml_strdup(anchor) +// if (!anchor_copy) +// return 0 +// +// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) +// +// return 1 +//} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compiler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/decode.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/decode.go new file mode 100644 index 000000000..129bc2a97 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/decode.go @@ -0,0 +1,815 @@ +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +const ( + documentNode = 1 << iota + mappingNode + sequenceNode + scalarNode + aliasNode +) + +type node struct { + kind int + line, column int + tag string + // For an alias node, alias holds the resolved alias. + alias *node + value string + implicit bool + children []*node + anchors map[string]*node +} + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *node + doneInit bool +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + if len(b) == 0 { + b = []byte{'\n'} + } + yaml_parser_set_input_string(&p.parser, b) + return &p +} + +func newParserFromReader(r io.Reader) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + yaml_parser_set_input_reader(&p.parser, r) + return &p +} + +func (p *parser) init() { + if p.doneInit { + return + } + p.expect(yaml_STREAM_START_EVENT) + p.doneInit = true +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +// expect consumes an event from the event stream and +// checks that it's of the expected type. +func (p *parser) expect(e yaml_event_type_t) { + if p.event.typ == yaml_NO_EVENT { + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + } + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + if p.event.typ != e { + p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) + p.fail() + } + yaml_event_delete(&p.event) + p.event.typ = yaml_NO_EVENT +} + +// peek peeks at the next event in the event stream, +// puts the results into p.event and returns the event type. +func (p *parser) peek() yaml_event_type_t { + if p.event.typ != yaml_NO_EVENT { + return p.event.typ + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *node, anchor []byte) { + if anchor != nil { + p.doc.anchors[string(anchor)] = n + } +} + +func (p *parser) parse() *node { + p.init() + switch p.peek() { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + default: + panic("attempted to parse unknown event: " + p.event.typ.String()) + } +} + +func (p *parser) node(kind int) *node { + return &node{ + kind: kind, + line: p.event.start_mark.line, + column: p.event.start_mark.column, + } +} + +func (p *parser) document() *node { + n := p.node(documentNode) + n.anchors = make(map[string]*node) + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + n.children = append(n.children, p.parse()) + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *node { + n := p.node(aliasNode) + n.value = string(p.event.anchor) + n.alias = p.doc.anchors[n.value] + if n.alias == nil { + failf("unknown anchor '%s' referenced", n.value) + } + p.expect(yaml_ALIAS_EVENT) + return n +} + +func (p *parser) scalar() *node { + n := p.node(scalarNode) + n.value = string(p.event.value) + n.tag = string(p.event.tag) + n.implicit = p.event.implicit + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *node { + n := p.node(sequenceNode) + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + n.children = append(n.children, p.parse()) + } + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *node { + n := p.node(mappingNode) + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + n.children = append(n.children, p.parse(), p.parse()) + } + p.expect(yaml_MAPPING_END_EVENT) + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *node + aliases map[*node]bool + mapType reflect.Type + terrors []string + strict bool + + decodeCount int + aliasCount int + aliasDepth int +} + +var ( + mapItemType = reflect.TypeOf(MapItem{}) + durationType = reflect.TypeOf(time.Duration(0)) + defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = defaultMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder(strict bool) *decoder { + d := &decoder{mapType: defaultMapType, strict: strict} + d.aliases = make(map[*node]bool) + return d +} + +func (d *decoder) terror(n *node, tag string, out reflect.Value) { + if n.tag != "" { + tag = n.tag + } + value := n.value + if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + if u, ok := out.Addr().Interface().(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +const ( + // 400,000 decode operations is ~500kb of dense object declarations, or + // ~5kb of dense object declarations with 10000% alias expansion + alias_ratio_range_low = 400000 + + // 4,000,000 decode operations is ~5MB of dense object declarations, or + // ~4.5MB of dense object declarations with 10% alias expansion + alias_ratio_range_high = 4000000 + + // alias_ratio_range is the range over which we scale allowed alias ratios + alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) +) + +func allowedAliasRatio(decodeCount int) float64 { + switch { + case decodeCount <= alias_ratio_range_low: + // allow 99% to come from alias expansion for small-to-medium documents + return 0.99 + case decodeCount >= alias_ratio_range_high: + // allow 10% to come from alias expansion for very large documents + return 0.10 + default: + // scale smoothly from 99% down to 10% over the range. + // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. + // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). + return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) + } +} + +func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { + d.decodeCount++ + if d.aliasDepth > 0 { + d.aliasCount++ + } + if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { + failf("document contains excessive aliasing") + } + switch n.kind { + case documentNode: + return d.document(n, out) + case aliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.kind { + case scalarNode: + good = d.scalar(n, out) + case mappingNode: + good = d.mapping(n, out) + case sequenceNode: + good = d.sequence(n, out) + default: + panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) + } + return good +} + +func (d *decoder) document(n *node, out reflect.Value) (good bool) { + if len(n.children) == 1 { + d.doc = n + d.unmarshal(n.children[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *node, out reflect.Value) (good bool) { + if d.aliases[n] { + // TODO this could actually be allowed in some circumstances. + failf("anchor '%s' value contains itself", n.value) + } + d.aliases[n] = true + d.aliasDepth++ + good = d.unmarshal(n.alias, out) + d.aliasDepth-- + delete(d.aliases, n) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) scalar(n *node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.tag == "" && !n.implicit { + tag = yaml_STR_TAG + resolved = n.value + } else { + tag, resolved = resolve(n.tag, n.value) + if tag == yaml_BINARY_TAG { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + if out.Kind() == reflect.Map && !out.CanAddr() { + resetMap(out) + } else { + out.Set(reflect.Zero(out.Type())) + } + return true + } + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + // We've resolved to exactly the type we want, so use that. + out.Set(resolvedv) + return true + } + // Perhaps we can use the value as a TextUnmarshaler to + // set its value. + if out.CanAddr() { + u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) + if ok { + var text []byte + if tag == yaml_BINARY_TAG { + text = []byte(resolved.(string)) + } else { + // We let any value be unmarshaled into TextUnmarshaler. + // That might be more lax than we'd like, but the + // TextUnmarshaler itself should bowl out any dubious values. + text = []byte(n.value) + } + err := u.UnmarshalText(text) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == yaml_BINARY_TAG { + out.SetString(resolved.(string)) + return true + } + if resolved != nil { + out.SetString(n.value) + return true + } + case reflect.Interface: + if resolved == nil { + out.Set(reflect.Zero(out.Type())) + } else if tag == yaml_TIMESTAMP_TAG { + // It looks like a timestamp but for backward compatibility + // reasons we set it as a string, so that code that unmarshals + // timestamp-like values into interface{} will continue to + // see a string and not a time.Time. + // TODO(v3) Drop this. + out.Set(reflect.ValueOf(n.value)) + } else { + out.Set(reflect.ValueOf(resolved)) + } + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch resolved := resolved.(type) { + case int: + if !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + return true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + return true + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + return true + case int64: + out.SetFloat(float64(resolved)) + return true + case uint64: + out.SetFloat(float64(resolved)) + return true + case float64: + out.SetFloat(resolved) + return true + } + case reflect.Struct: + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + out.Set(resolvedv) + return true + } + case reflect.Ptr: + if out.Type().Elem() == reflect.TypeOf(resolved) { + // TODO DOes this make sense? When is out a Ptr except when decoding a nil value? + elem := reflect.New(out.Type().Elem()) + elem.Elem().Set(reflect.ValueOf(resolved)) + out.Set(elem) + return true + } + } + d.terror(n, tag, out) + return false +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { + l := len(n.children) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), l) + } + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, yaml_SEQ_TAG, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.children[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + out.Set(out.Slice(0, j)) + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Slice: + return d.mappingSlice(n, out) + case reflect.Map: + // okay + case reflect.Interface: + if d.mapType.Kind() == reflect.Map { + iface := out + out = reflect.MakeMap(d.mapType) + iface.Set(out) + } else { + slicev := reflect.New(d.mapType).Elem() + if !d.mappingSlice(n, slicev) { + return false + } + out.Set(slicev) + return true + } + default: + d.terror(n, yaml_MAP_TAG, out) + return false + } + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + mapType := d.mapType + if outt.Key() == ifaceType && outt.Elem() == ifaceType { + d.mapType = outt + } + + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + } + l := len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.children[i], k) { + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.children[i+1], e) { + d.setMapIndex(n.children[i+1], out, k, e) + } + } + } + d.mapType = mapType + return true +} + +func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) { + if d.strict && out.MapIndex(k) != zeroValue { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface())) + return + } + out.SetMapIndex(k, v) +} + +func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { + outt := out.Type() + if outt.Elem() != mapItemType { + d.terror(n, yaml_MAP_TAG, out) + return false + } + + mapType := d.mapType + d.mapType = outt + + var slice []MapItem + var l = len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + item := MapItem{} + k := reflect.ValueOf(&item.Key).Elem() + if d.unmarshal(n.children[i], k) { + v := reflect.ValueOf(&item.Value).Elem() + if d.unmarshal(n.children[i+1], v) { + slice = append(slice, item) + } + } + } + out.Set(reflect.ValueOf(slice)) + d.mapType = mapType + return true +} + +func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + name := settableValueOf("") + l := len(n.children) + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) + elemType = inlineMap.Type().Elem() + } + + var doneFields []bool + if d.strict { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + for i := 0; i < l; i += 2 { + ni := n.children[i] + if isMerge(ni) { + d.merge(n.children[i+1], out) + continue + } + if !d.unmarshal(ni, name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + if d.strict { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = out.FieldByIndex(info.Inline) + } + d.unmarshal(n.children[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.children[i+1], value) + d.setMapIndex(n.children[i+1], inlineMap, name, value) + } else if d.strict { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type())) + } + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) merge(n *node, out reflect.Value) { + switch n.kind { + case mappingNode: + d.unmarshal(n, out) + case aliasNode: + if n.alias != nil && n.alias.kind != mappingNode { + failWantMap() + } + d.unmarshal(n, out) + case sequenceNode: + // Step backwards as earlier nodes take precedence. + for i := len(n.children) - 1; i >= 0; i-- { + ni := n.children[i] + if ni.kind == aliasNode { + if ni.alias != nil && ni.alias.kind != mappingNode { + failWantMap() + } + } else if ni.kind != mappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } +} + +func isMerge(n *node) bool { + return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/emitterc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/emitterc.go new file mode 100644 index 000000000..a1c2cc526 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/emitterc.go @@ -0,0 +1,1685 @@ +package yaml + +import ( + "bytes" + "fmt" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + emitter.column = 0 + emitter.line++ + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + emitter.column = 0 + emitter.line++ + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + emitter.indent += emitter.best_indent + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + return yaml_emitter_emit_node(emitter, event, true, false, false, false) +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) + } +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an anchor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + return true + } + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[i]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + emitter.indention = true + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + if !put(emitter, '%') { + return false + } + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + emitter.whitespace = false + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/encode.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/encode.go new file mode 100644 index 000000000..0ee738e11 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/encode.go @@ -0,0 +1,390 @@ +package yaml + +import ( + "encoding" + "fmt" + "io" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// jsonNumber is the interface of the encoding/json.Number datatype. +// Repeating the interface here avoids a dependency on encoding/json, and also +// supports other libraries like jsoniter, which use a similar datatype with +// the same interface. Detecting this interface is useful when dealing with +// structures containing json.Number, which is a string under the hood. The +// encoder should prefer the use of Int64(), Float64() and string(), in that +// order, when encoding this type. +type jsonNumber interface { + Float64() (float64, error) + Int64() (int64, error) + String() string +} + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool + // doneInit holds whether the initial stream_start_event has been + // emitted. + doneInit bool +} + +func newEncoder() *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func newEncoderWithWriter(w io.Writer) *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_writer(&e.emitter, w) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func (e *encoder) init() { + if e.doneInit { + return + } + yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.emit() + e.doneInit = true +} + +func (e *encoder) finish() { + e.emitter.open_ended = false + yaml_stream_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + e.must(yaml_emitter_emit(&e.emitter, &e.event)) +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshalDoc(tag string, in reflect.Value) { + e.init() + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.emit() + e.marshal(tag, in) + yaml_document_end_event_initialize(&e.event, true) + e.emit() +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch m := iface.(type) { + case jsonNumber: + integer, err := m.Int64() + if err == nil { + // In this case the json.Number is a valid int64 + in = reflect.ValueOf(integer) + break + } + float, err := m.Float64() + if err == nil { + // In this case the json.Number is a valid float64 + in = reflect.ValueOf(float) + break + } + // fallback case - no number could be obtained + in = reflect.ValueOf(m.String()) + case time.Time, *time.Time: + // Although time.Time implements TextMarshaler, + // we don't want to treat it as a string for YAML + // purposes because YAML has special support for + // timestamps. + case Marshaler: + v, err := m.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + in = reflect.ValueOf(v) + case encoding.TextMarshaler: + text, err := m.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + case nil: + e.nilv() + return + } + switch in.Kind() { + case reflect.Interface: + e.marshal(tag, in.Elem()) + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + if in.Type() == ptrTimeType { + e.timev(tag, in.Elem()) + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Struct: + if in.Type() == timeType { + e.timev(tag, in) + } else { + e.structv(tag, in) + } + case reflect.Slice, reflect.Array: + if in.Type().Elem() == mapItemType { + e.itemsv(tag, in) + } else { + e.slicev(tag, in) + } + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if in.Type() == durationType { + e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) + } else { + e.intv(tag, in) + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) itemsv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) + for _, item := range slice { + e.marshal("", reflect.ValueOf(item.Key)) + e.marshal("", reflect.ValueOf(item.Value)) + } + }) +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = in.FieldByIndex(info.Inline) + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.emit() + f() + yaml_mapping_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + canUsePlain := true + switch { + case !utf8.ValidString(s): + if tag == yaml_BINARY_TAG { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if tag != "" { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = yaml_BINARY_TAG + s = encodeBase64(s) + case tag == "": + // Check to see if it would resolve to a specific + // tag when encoded unquoted. If it doesn't, + // there's no need to quote it. + rtag, _ := resolve("", s) + canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s) + } + // Note: it's possible for user code to emit invalid YAML + // if they explicitly specify a tag and a string containing + // text that's incompatible with that tag. + switch { + case strings.Contains(s, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { + implicit := tag == "" + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.emit() +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/parserc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/parserc.go new file mode 100644 index 000000000..81d05dfe5 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/parserc.go @@ -0,0 +1,1095 @@ +package yaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + return &parser.tokens[parser.tokens_head] + } + return nil +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// * +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected ", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** +// +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// ************* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + return true +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// block_node ::= ALIAS +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// flow_node ::= ALIAS +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// ************************* +// block_content ::= block_collection | flow_collection | SCALAR +// ****** +// flow_content ::= flow_collection | SCALAR +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* +// +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +// +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// +// +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true +} + +// +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * *** * +// +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * ***** * +// +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/readerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/readerc.go new file mode 100644 index 000000000..7c1f5fac3 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/readerc.go @@ -0,0 +1,412 @@ +package yaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // [Go] This function was changed to guarantee the requested length size at EOF. + // The fact we need to do this is pretty awful, but the description above implies + // for that to be the case, and there are tests + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + // [Go] ACTUALLY! Read the documentation of this function above. + // This is just broken. To return true, we need to have the + // given length in the buffer. Not doing that means every single + // check that calls this function to make sure the buffer has a + // given length is Go) panicking; or C) accessing invalid memory. + //return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + low, high = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + buffer_len += 1 + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + buffer_len += 2 + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + buffer_len += 3 + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + buffer_len += 4 + } + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + // [Go] Read the documentation of this function above. To return true, + // we need to have the given length in the buffer. Not doing that means + // every single check that calls this function to make sure the buffer + // has a given length is Go) panicking; or C) accessing invalid memory. + // This happens here due to the EOF above breaking early. + for buffer_len < length { + parser.buffer[buffer_len] = 0 + buffer_len++ + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/resolve.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/resolve.go new file mode 100644 index 000000000..4120e0c91 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/resolve.go @@ -0,0 +1,258 @@ +package yaml + +import ( + "encoding/base64" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}}, + {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}}, + {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}}, + {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}}, + {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}}, + {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}}, + {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", yaml_MERGE_TAG, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + // TODO This can easily be made faster and produce less garbage. + if strings.HasPrefix(tag, longTagPrefix) { + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG: + return true + } + return false +} + +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) + +func resolve(tag string, in string) (rtag string, out interface{}) { + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: + return + case yaml_FLOAT_TAG: + if rtag == yaml_INT_TAG { + switch v := out.(type) { + case int64: + rtag = yaml_FLOAT_TAG + out = float64(v) + return + case int: + rtag = yaml_FLOAT_TAG + out = float64(v) + return + } + } + } + failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) + }() + + // Any data is accepted as a !!str or !!binary. + // Otherwise, the prefix is enough of a hint about what it might be. + hint := byte('N') + if in != "" { + hint = resolveTable[in[0]] + } + if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG { + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + // Base 60 floats are a bad idea, were dropped in YAML 1.2, and + // are purposefully unsupported here. They're still quoted on + // the way out for compatibility with other parser, though. + + switch hint { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + + case 'D', 'S': + // Int, float, or timestamp. + // Only try values as a timestamp if the value is unquoted or there's an explicit + // !!timestamp tag. + if tag == "" || tag == yaml_TIMESTAMP_TAG { + t, ok := parseTimestamp(in) + if ok { + return yaml_TIMESTAMP_TAG, t + } + } + + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + if yamlStyleFloat.MatchString(plain) { + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + } + default: + panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") + } + } + return yaml_STR_TAG, in +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} + +// This is a subset of the formats allowed by the regular expression +// defined at http://yaml.org/type/timestamp.html. +var allowedTimestampFormats = []string{ + "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. + "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". + "2006-1-2 15:4:5.999999999", // space separated with no time zone + "2006-1-2", // date only + // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" + // from the set of examples. +} + +// parseTimestamp parses s as a timestamp string and +// returns the timestamp and reports whether it succeeded. +// Timestamp formats are defined at http://yaml.org/type/timestamp.html +func parseTimestamp(s string) (time.Time, bool) { + // TODO write code to check all the formats supported by + // http://yaml.org/type/timestamp.html instead of using time.Parse. + + // Quick check: all date formats start with YYYY-. + i := 0 + for ; i < len(s); i++ { + if c := s[i]; c < '0' || c > '9' { + break + } + } + if i != 4 || i == len(s) || s[i] != '-' { + return time.Time{}, false + } + for _, format := range allowedTimestampFormats { + if t, err := time.Parse(format, s); err == nil { + return t, true + } + } + return time.Time{}, false +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/scannerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/scannerc.go new file mode 100644 index 000000000..0b9bb6030 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/scannerc.go @@ -0,0 +1,2711 @@ +package yaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, problem) +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + if parser.tokens_head != len(parser.tokens) { + // If queue is non-empty, check if any potential simple key may + // occupy the head position. + head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] + if !ok { + break + } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { + return false + } else if !valid { + break + } + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { + if !simple_key.possible { + return false, true + } + + // The 1.2 specification says: + // + // "If the ? indicator is omitted, parsing needs to see past the + // implicit key to recognize it as such. To limit the amount of + // lookahead required, the “:†indicator must appear at most 1024 + // Unicode characters beyond the start of the key. In addition, the key + // is restricted to a single line." + // + if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { + // Check if the potential simple key to be removed is required. + if simple_key.required { + return false, yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + return false, true + } + return true, true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + } + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) + } + return true +} + +// max_flow_level limits the flow_level +const max_flow_level = 10000 + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ + possible: false, + required: false, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + }) + + // Increase the flow level. + parser.flow_level++ + if parser.flow_level > max_flow_level { + return yaml_parser_set_scanner_error(parser, + "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_flow_level)) + } + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + last := len(parser.simple_keys) - 1 + delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) + parser.simple_keys = parser.simple_keys[:last] + } + return true +} + +// max_indents limits the indents stack size +const max_indents = 10000 + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + if len(parser.indents) > max_indents { + return yaml_parser_set_scanner_error(parser, + "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_indents)) + } + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each indentation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + // Loop through the indentation levels in the stack. + for parser.indent > column { + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + parser.simple_keys_by_tok = make(map[int]int) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { + return false + + } else if valid { + + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + delete(parser.simple_keys_by_tok, simple_key.token_number) + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +// +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && string(s) != "!" { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + hasTag := len(head) > 0 + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + hasTag = true + } + + if !hasTag { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the indentation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + + // Get the indentation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the indentation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following indentation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan indentation spaces and line breaks for a block scalar. Determine the +// indentation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the indentation spaces and line breaks. + max_indent := 0 + for { + // Eat the indentation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the indentation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an indentation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab characters that abuse indentation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violates indentation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check indentation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/sorter.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/sorter.go new file mode 100644 index 000000000..4c45e660a --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/sorter.go @@ -0,0 +1,113 @@ +package yaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + return bl + } + var ai, bi int + var an, bn int64 + if ar[i] == '0' || br[i] == '0' { + for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + if ar[j] != '0' { + an = 1 + bn = 1 + break + } + } + } + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/writerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/writerc.go new file mode 100644 index 000000000..a2dde608c --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/writerc.go @@ -0,0 +1,26 @@ +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go new file mode 100644 index 000000000..30813884c --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go @@ -0,0 +1,478 @@ +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/go-yaml/yaml +// +package yaml + +import ( + "errors" + "fmt" + "io" + "reflect" + "strings" + "sync" +) + +// MapSlice encodes and decodes as a YAML map. +// The order of keys is preserved when encoding and decoding. +type MapSlice []MapItem + +// MapItem is an item in a MapSlice. +type MapItem struct { + Key, Value interface{} +} + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. The UnmarshalYAML +// method receives a function that may be called to unmarshal the original +// YAML value into a field or variable. It is safe to call the unmarshal +// function parameter more than once if necessary. +type Unmarshaler interface { + UnmarshalYAML(unmarshal func(interface{}) error) error +} + +// The Marshaler interface may be implemented by types to customize their +// behavior when being marshaled into a YAML document. The returned value +// is marshaled in place of the original value implementing Marshaler. +// +// If an error is returned by MarshalYAML, the marshaling procedure stops +// and returns with the provided error. +type Marshaler interface { + MarshalYAML() (interface{}, error) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the out value. +// +// Maps and pointers (to a struct, string, int, etc) are accepted as out +// values. If an internal pointer within a struct is not initialized, +// the yaml package will initialize it if necessary for unmarshalling +// the provided data. The out parameter must not be nil. +// +// The type of the decoded values should be compatible with the respective +// values in out. If one or more values cannot be decoded due to a type +// mismatches, decoding continues partially until the end of the YAML +// content, and a *yaml.TypeError is returned with details for all +// missed values. +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and are unmarshalled using the field name +// lowercased as the default key. Custom keys may be defined via the +// "yaml" name in the field tag: the content preceding the first comma +// is used as the key, and the following comma-separated options are +// used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +// +func Unmarshal(in []byte, out interface{}) (err error) { + return unmarshal(in, out, false) +} + +// UnmarshalStrict is like Unmarshal except that any fields that are found +// in the data that do not have corresponding struct members, or mapping +// keys that are duplicates, will result in +// an error. +func UnmarshalStrict(in []byte, out interface{}) (err error) { + return unmarshal(in, out, true) +} + +// A Decoder reads and decodes YAML values from an input stream. +type Decoder struct { + strict bool + parser *parser +} + +// NewDecoder returns a new decoder that reads from r. +// +// The decoder introduces its own buffering and may read +// data from r beyond the YAML values requested. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + parser: newParserFromReader(r), + } +} + +// SetStrict sets whether strict decoding behaviour is enabled when +// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict. +func (dec *Decoder) SetStrict(strict bool) { + dec.strict = strict +} + +// Decode reads the next YAML-encoded value from its input +// and stores it in the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (dec *Decoder) Decode(v interface{}) (err error) { + d := newDecoder(dec.strict) + defer handleErr(&err) + node := dec.parser.parse() + if node == nil { + return io.EOF + } + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(node, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +func unmarshal(in []byte, out interface{}, strict bool) (err error) { + defer handleErr(&err) + d := newDecoder(strict) + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + v := reflect.ValueOf(out) + if v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + d.unmarshal(node, v) + } + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps and pointers (to struct, string, int, etc) are accepted as the in value. +// +// Struct fields are only marshalled if they are exported (have an upper case +// first letter), and are marshalled using the field name lowercased as the +// default key. Custom keys may be defined via the "yaml" name in the field +// tag: the content preceding the first comma is used as the key, and the +// following comma-separated options are used to tweak the marshalling process. +// Conflicting names result in a runtime error. +// +// The field tag format accepted is: +// +// `(...) yaml:"[][,[,]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Zero valued structs will be omitted if all their public +// fields are zero, unless they implement an IsZero +// method (see the IsZeroer interface type), in which +// case the field will be excluded if IsZero returns true. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps). +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +// An Encoder writes YAML values to an output stream. +type Encoder struct { + encoder *encoder +} + +// NewEncoder returns a new encoder that writes to w. +// The Encoder should be closed after use to flush all data +// to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + encoder: newEncoderWithWriter(w), + } +} + +// Encode writes the YAML encoding of v to the stream. +// If multiple items are encoded to the stream, the +// second and subsequent document will be preceded +// with a "---" document separator, but the first will not. +// +// See the documentation for Marshal for details about the conversion of Go +// values to YAML. +func (e *Encoder) Encode(v interface{}) (err error) { + defer handleErr(&err) + e.encoder.marshalDoc("", reflect.ValueOf(v)) + return nil +} + +// Close closes the encoder by writing any remaining data. +// It does not write a stream terminating string "...". +func (e *Encoder) Close() (err error) { + defer handleErr(&err) + e.encoder.finish() + return nil +} + +func handleErr(err *error) { + if v := recover(); v != nil { + if e, ok := v.(yamlError); ok { + *err = e.err + } else { + panic(v) + } + } +} + +type yamlError struct { + err error +} + +func fail(err error) { + panic(yamlError{err}) +} + +func failf(format string, args ...interface{}) { + panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) +} + +// A TypeError is returned by Unmarshal when one or more fields in +// the YAML document cannot be properly decoded into the requested +// types. When this error is returned, the value is still +// unmarshaled partially. +type TypeError struct { + Errors []string +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from mgo/bson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + // Id holds the unique field identifier, so we can cheaply + // check for field duplicates without maintaining an extra map. + Id int + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" && !field.Anonymous { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct: + sinfo, err := getStructInfo(field.Type) + if err != nil { + return nil, err + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + finfo.Id = len(fieldsList) + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + default: + //return nil, errors.New("Option ,inline needs a struct value or map field") + return nil, errors.New("Option ,inline needs a struct value field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + info.Id = len(fieldsList) + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{ + FieldsMap: fieldsMap, + FieldsList: fieldsList, + InlineMap: inlineMap, + } + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +// IsZeroer is used to check whether an object is zero to +// determine whether it should be omitted when marshaling +// with the omitempty flag. One notable implementation +// is time.Time. +type IsZeroer interface { + IsZero() bool +} + +func isZero(v reflect.Value) bool { + kind := v.Kind() + if z, ok := v.Interface().(IsZeroer); ok { + if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { + return true + } + return z.IsZero() + } + switch kind { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + vt := v.Type() + for i := v.NumField() - 1; i >= 0; i-- { + if vt.Field(i).PkgPath != "" { + continue // Private field + } + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} + +// FutureLineWrap globally disables line wrapping when encoding long strings. +// This is a temporary and thus deprecated method introduced to faciliate +// migration towards v3, which offers more control of line lengths on +// individual encodings, and has a default matching the behavior introduced +// by this function. +// +// The default formatting of v2 was erroneously changed in v2.3.0 and reverted +// in v2.4.0, at which point this function was introduced to help migration. +func FutureLineWrap() { + disableLineWrapping = true +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlh.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlh.go new file mode 100644 index 000000000..f6a9c8e34 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlh.go @@ -0,0 +1,739 @@ +package yaml + +import ( + "fmt" + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota + + yaml_PLAIN_SCALAR_STYLE // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. +) + +var eventStrings = []string{ + yaml_NO_EVENT: "none", + yaml_STREAM_START_EVENT: "stream start", + yaml_STREAM_END_EVENT: "stream end", + yaml_DOCUMENT_START_EVENT: "document start", + yaml_DOCUMENT_END_EVENT: "document end", + yaml_ALIAS_EVENT: "alias", + yaml_SCALAR_EVENT: "scalar", + yaml_SEQUENCE_START_EVENT: "sequence start", + yaml_SEQUENCE_END_EVENT: "sequence end", + yaml_MAPPING_START_EVENT: "mapping start", + yaml_MAPPING_END_EVENT: "mapping end", +} + +func (e yaml_event_type_t) String() string { + if e < 0 || int(e) >= len(eventStrings) { + return fmt.Sprintf("unknown event %d", e) + } + return eventStrings[e] +} + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + // Not in original libyaml. + yaml_BINARY_TAG = "tag:yaml.org,2002:binary" + yaml_MERGE_TAG = "tag:yaml.org,2002:merge" + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// yaml_parser_set_input(). +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occurred. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_reader io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// yaml_emitter_set_output(). +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +// +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_writer io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlprivateh.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlprivateh.go new file mode 100644 index 000000000..8110ce3c3 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v2/yamlprivateh.go @@ -0,0 +1,173 @@ +package yaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/LICENSE b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/LICENSE similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/LICENSE rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/LICENSE diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/NOTICE b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/NOTICE new file mode 100644 index 000000000..866d74a7a --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/NOTICE @@ -0,0 +1,13 @@ +Copyright 2011-2016 Canonical Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/OWNERS b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/OWNERS new file mode 100644 index 000000000..73be0a3a9 --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/OWNERS @@ -0,0 +1,24 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- dims +- jpbetz +- smarterclayton +- deads2k +- sttts +- liggitt +- natasha41575 +- knverey +reviewers: +- dims +- thockin +- jpbetz +- smarterclayton +- deads2k +- derekwaynecarr +- mikedanese +- liggitt +- sttts +- tallclair +labels: +- sig/api-machinery diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/README.md b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/README.md similarity index 87% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/README.md rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/README.md index 08eb1babd..b1a6b2e9e 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/README.md +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/README.md @@ -1,3 +1,13 @@ +# go-yaml fork + +This package is a fork of the go-yaml library and is intended solely for consumption +by kubernetes projects. In this fork, we plan to support only critical changes required for +kubernetes, such as small bug fixes and regressions. Larger, general-purpose feature requests +should be made in the upstream go-yaml library, and we will reject such changes in this fork +unless we are pulling them from upstream. + +This fork is based on v3.0.1: https://github.com/go-yaml/yaml/releases/tag/v3.0.1. + # YAML support for the Go language Introduction diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/apic.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/apic.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/apic.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/apic.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/decode.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/decode.go similarity index 93% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/decode.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/decode.go index df36e3a30..0173b6982 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/decode.go +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/decode.go @@ -100,7 +100,10 @@ func (p *parser) peek() yaml_event_type_t { if p.event.typ != yaml_NO_EVENT { return p.event.typ } - if !yaml_parser_parse(&p.parser, &p.event) { + // It's curious choice from the underlying API to generally return a + // positive result on success, but on this case return true in an error + // scenario. This was the source of bugs in the past (issue #666). + if !yaml_parser_parse(&p.parser, &p.event) || p.parser.error != yaml_NO_ERROR { p.fail() } return p.event.typ @@ -320,6 +323,8 @@ type decoder struct { decodeCount int aliasCount int aliasDepth int + + mergedFields map[interface{}]bool } var ( @@ -808,6 +813,11 @@ func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { } } + mergedFields := d.mergedFields + d.mergedFields = nil + + var mergeNode *Node + mapIsNew := false if out.IsNil() { out.Set(reflect.MakeMap(outt)) @@ -815,11 +825,18 @@ func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { } for i := 0; i < l; i += 2 { if isMerge(n.Content[i]) { - d.merge(n.Content[i+1], out) + mergeNode = n.Content[i+1] continue } k := reflect.New(kt).Elem() if d.unmarshal(n.Content[i], k) { + if mergedFields != nil { + ki := k.Interface() + if mergedFields[ki] { + continue + } + mergedFields[ki] = true + } kkind := k.Kind() if kkind == reflect.Interface { kkind = k.Elem().Kind() @@ -833,6 +850,12 @@ func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { } } } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } + d.stringMapType = stringMapType d.generalMapType = generalMapType return true @@ -844,7 +867,8 @@ func isStringMap(n *Node) bool { } l := len(n.Content) for i := 0; i < l; i += 2 { - if n.Content[i].ShortTag() != strTag { + shortTag := n.Content[i].ShortTag() + if shortTag != strTag && shortTag != mergeTag { return false } } @@ -861,7 +885,6 @@ func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { var elemType reflect.Type if sinfo.InlineMap != -1 { inlineMap = out.Field(sinfo.InlineMap) - inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) elemType = inlineMap.Type().Elem() } @@ -870,6 +893,9 @@ func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { d.prepare(n, field) } + mergedFields := d.mergedFields + d.mergedFields = nil + var mergeNode *Node var doneFields []bool if d.uniqueKeys { doneFields = make([]bool, len(sinfo.FieldsList)) @@ -879,13 +905,20 @@ func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { for i := 0; i < l; i += 2 { ni := n.Content[i] if isMerge(ni) { - d.merge(n.Content[i+1], out) + mergeNode = n.Content[i+1] continue } if !d.unmarshal(ni, name) { continue } - if info, ok := sinfo.FieldsMap[name.String()]; ok { + sname := name.String() + if mergedFields != nil { + if mergedFields[sname] { + continue + } + mergedFields[sname] = true + } + if info, ok := sinfo.FieldsMap[sname]; ok { if d.uniqueKeys { if doneFields[info.Id] { d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) @@ -911,6 +944,11 @@ func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) } } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } return true } @@ -918,19 +956,29 @@ func failWantMap() { failf("map merge requires map or sequence of maps as the value") } -func (d *decoder) merge(n *Node, out reflect.Value) { - switch n.Kind { +func (d *decoder) merge(parent *Node, merge *Node, out reflect.Value) { + mergedFields := d.mergedFields + if mergedFields == nil { + d.mergedFields = make(map[interface{}]bool) + for i := 0; i < len(parent.Content); i += 2 { + k := reflect.New(ifaceType).Elem() + if d.unmarshal(parent.Content[i], k) { + d.mergedFields[k.Interface()] = true + } + } + } + + switch merge.Kind { case MappingNode: - d.unmarshal(n, out) + d.unmarshal(merge, out) case AliasNode: - if n.Alias != nil && n.Alias.Kind != MappingNode { + if merge.Alias != nil && merge.Alias.Kind != MappingNode { failWantMap() } - d.unmarshal(n, out) + d.unmarshal(merge, out) case SequenceNode: - // Step backwards as earlier nodes take precedence. - for i := len(n.Content) - 1; i >= 0; i-- { - ni := n.Content[i] + for i := 0; i < len(merge.Content); i++ { + ni := merge.Content[i] if ni.Kind == AliasNode { if ni.Alias != nil && ni.Alias.Kind != MappingNode { failWantMap() @@ -943,6 +991,8 @@ func (d *decoder) merge(n *Node, out reflect.Value) { default: failWantMap() } + + d.mergedFields = mergedFields } func isMerge(n *Node) bool { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/emitterc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/emitterc.go similarity index 95% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/emitterc.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/emitterc.go index f0f3d1867..6ea0ae8c1 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/emitterc.go +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/emitterc.go @@ -226,7 +226,7 @@ func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_ } // Increase the indentation level. -func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool, compact_seq bool) bool { +func yaml_emitter_increase_indent_compact(emitter *yaml_emitter_t, flow, indentless bool, compact_seq bool) bool { emitter.indents = append(emitter.indents, emitter.indent) if emitter.indent < 0 { if flow { @@ -241,10 +241,14 @@ func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool emitter.indent += 2 } else { // Everything else aligns to the chosen indentation. - emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) - } - if compact_seq { - emitter.indent = emitter.indent - 2 + emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent) + if compact_seq { + // The value compact_seq passed in is almost always set to `false` when this function is called, + // except when we are dealing with sequence nodes. So this gets triggered to subtract 2 only when we + // are increasing the indent to account for sequence nodes, which will be correct because we need to + // subtract 2 to account for the - at the beginning of the sequence node. + emitter.indent = emitter.indent - 2 + } } } return true @@ -491,7 +495,7 @@ func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_eve if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { return false } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -537,7 +541,7 @@ func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_e if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { return false } - if !yaml_emitter_increase_indent(emitter, true, false, false) { + if !yaml_emitter_increase_indent(emitter, true, false) { return false } emitter.flow_level++ @@ -560,7 +564,7 @@ func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_e if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { return false } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -605,7 +609,7 @@ func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_e return false } } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -620,7 +624,7 @@ func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_eve if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { return false } - if !yaml_emitter_increase_indent(emitter, true, false, false) { + if !yaml_emitter_increase_indent(emitter, true, false) { return false } emitter.flow_level++ @@ -646,7 +650,7 @@ func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_eve if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { return false } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -719,7 +723,7 @@ func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_e return false } } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -731,9 +735,16 @@ func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_e // Expect a block item node. func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { if first { + // emitter.mapping context tells us if we are currently in a mapping context. + // emiiter.column tells us which column we are in in the yaml output. 0 is the first char of the column. + // emitter.indentation tells us if the last character was an indentation character. + // emitter.compact_sequence_indent tells us if '- ' is considered part of the indentation for sequence elements. + // So, `seq` means that we are in a mapping context, and we are either at the first char of the column or + // the last character was not an indentation character, and we consider '- ' part of the indentation + // for sequence elements. seq := emitter.mapping_context && (emitter.column == 0 || !emitter.indention) && emitter.compact_sequence_indent - if !yaml_emitter_increase_indent(emitter, false, false, seq){ + if !yaml_emitter_increase_indent_compact(emitter, false, false, seq) { return false } } @@ -757,7 +768,7 @@ func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_ if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { return false } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -769,7 +780,7 @@ func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_ // Expect a block key node. func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { if first { - if !yaml_emitter_increase_indent(emitter, false, false, false) { + if !yaml_emitter_increase_indent(emitter, false, false) { return false } } @@ -833,7 +844,7 @@ func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_ } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { // An indented block follows, so write the comment right now. emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment @@ -843,7 +854,7 @@ func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_ if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { return false } - if !yaml_emitter_process_line_comment(emitter, false) { + if !yaml_emitter_process_line_comment(emitter) { return false } if !yaml_emitter_process_foot_comment(emitter) { @@ -901,7 +912,7 @@ func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool if !yaml_emitter_process_tag(emitter) { return false } - if !yaml_emitter_increase_indent(emitter, true, false, false) { + if !yaml_emitter_increase_indent(emitter, true, false) { return false } if !yaml_emitter_process_scalar(emitter) { @@ -1149,8 +1160,12 @@ func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { } // Write an line comment. -func yaml_emitter_process_line_comment(emitter *yaml_emitter_t, linebreak bool) bool { +func yaml_emitter_process_line_comment_linebreak(emitter *yaml_emitter_t, linebreak bool) bool { if len(emitter.line_comment) == 0 { + // The next 3 lines are needed to resolve an issue with leading newlines + // See https://github.com/go-yaml/yaml/issues/755 + // When linebreak is set to true, put_break will be called and will add + // the needed newline. if linebreak && !put_break(emitter) { return false } @@ -1902,7 +1917,7 @@ func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - if !yaml_emitter_process_line_comment(emitter, true) { + if !yaml_emitter_process_line_comment_linebreak(emitter, true) { return false } //emitter.indention = true @@ -1939,7 +1954,7 @@ func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) boo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - if !yaml_emitter_process_line_comment(emitter, true) { + if !yaml_emitter_process_line_comment_linebreak(emitter, true) { return false } diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/encode.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/encode.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/encode.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/encode.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/parserc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/parserc.go similarity index 99% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/parserc.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/parserc.go index ac66fccc0..268558a0d 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/parserc.go +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/parserc.go @@ -687,6 +687,9 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) + if token == nil { + return false + } parser.marks = append(parser.marks, token.start_mark) skip_token(parser) } @@ -786,7 +789,7 @@ func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { } token := peek_token(parser) - if token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + if token == nil || token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { return } @@ -813,6 +816,9 @@ func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) + if token == nil { + return false + } parser.marks = append(parser.marks, token.start_mark) skip_token(parser) } @@ -922,6 +928,9 @@ func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_ev func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) + if token == nil { + return false + } parser.marks = append(parser.marks, token.start_mark) skip_token(parser) } diff --git a/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/patch.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/patch.go new file mode 100644 index 000000000..b98c3321e --- /dev/null +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/patch.go @@ -0,0 +1,39 @@ +/* +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 yaml + +// yaml_emitter_increase_indent preserves the original signature and delegates to +// yaml_emitter_increase_indent_compact without compact-sequence indentation +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + return yaml_emitter_increase_indent_compact(emitter, flow, indentless, false) +} + +// CompactSeqIndent makes it so that '- ' is considered part of the indentation. +func (e *Encoder) CompactSeqIndent() { + e.encoder.emitter.compact_sequence_indent = true +} + +// DefaultSeqIndent makes it so that '- ' is not considered part of the indentation. +func (e *Encoder) DefaultSeqIndent() { + e.encoder.emitter.compact_sequence_indent = false +} + +// yaml_emitter_process_line_comment preserves the original signature and delegates to +// yaml_emitter_process_line_comment_linebreak passing false for linebreak +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { + return yaml_emitter_process_line_comment_linebreak(emitter, false) +} diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/readerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/readerc.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/readerc.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/readerc.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/resolve.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/resolve.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/resolve.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/resolve.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/scannerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/scannerc.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/scannerc.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/scannerc.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/sorter.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/sorter.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/sorter.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/sorter.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/writerc.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/writerc.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/writerc.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/writerc.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yaml.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yaml.go similarity index 98% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yaml.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yaml.go index bb6418dba..8cec6da48 100644 --- a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yaml.go +++ b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yaml.go @@ -278,16 +278,6 @@ func (e *Encoder) SetIndent(spaces int) { e.encoder.indent = spaces } -// CompactSeqIndent makes it so that '- ' is considered part of the indentation. -func (e *Encoder) CompactSeqIndent() { - e.encoder.emitter.compact_sequence_indent = true -} - -// DefaultSeqIndent makes it so that '- ' is not considered part of the indentation. -func (e *Encoder) DefaultSeqIndent() { - e.encoder.emitter.compact_sequence_indent = false -} - // Close closes the encoder by writing any remaining data. // It does not write a stream terminating string "...". func (e *Encoder) Close() (err error) { diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yamlh.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yamlh.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yamlh.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yamlh.go diff --git a/tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yamlprivateh.go b/tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yamlprivateh.go similarity index 100% rename from tools/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml/yamlprivateh.go rename to tools/vendor/sigs.k8s.io/yaml/goyaml.v3/yamlprivateh.go diff --git a/tools/vendor/sigs.k8s.io/yaml/yaml.go b/tools/vendor/sigs.k8s.io/yaml/yaml.go index efbc535d4..fc10246bd 100644 --- a/tools/vendor/sigs.k8s.io/yaml/yaml.go +++ b/tools/vendor/sigs.k8s.io/yaml/yaml.go @@ -1,3 +1,19 @@ +/* +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 yaml import ( @@ -8,56 +24,59 @@ import ( "reflect" "strconv" - "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml/goyaml.v2" ) -// Marshal marshals the object into JSON then converts JSON to YAML and returns the -// YAML. -func Marshal(o interface{}) ([]byte, error) { - j, err := json.Marshal(o) +// Marshal marshals obj into JSON using stdlib json.Marshal, and then converts JSON to YAML using JSONToYAML (see that method for more reference) +func Marshal(obj interface{}) ([]byte, error) { + jsonBytes, err := json.Marshal(obj) if err != nil { - return nil, fmt.Errorf("error marshaling into JSON: %v", err) + return nil, fmt.Errorf("error marshaling into JSON: %w", err) } - y, err := JSONToYAML(j) - if err != nil { - return nil, fmt.Errorf("error converting JSON to YAML: %v", err) - } - - return y, nil + return JSONToYAML(jsonBytes) } // JSONOpt is a decoding option for decoding from JSON format. type JSONOpt func(*json.Decoder) *json.Decoder -// Unmarshal converts YAML to JSON then uses JSON to unmarshal into an object, -// optionally configuring the behavior of the JSON unmarshal. -func Unmarshal(y []byte, o interface{}, opts ...JSONOpt) error { - return yamlUnmarshal(y, o, false, opts...) +// Unmarshal first converts the given YAML to JSON, and then unmarshals the JSON into obj. Options for the +// standard library json.Decoder can be optionally specified, e.g. to decode untyped numbers into json.Number instead of float64, or to disallow unknown fields (but for that purpose, see also UnmarshalStrict). obj must be a non-nil pointer. +// +// Important notes about the Unmarshal logic: +// +// - Decoding is case-insensitive, unlike the rest of Kubernetes API machinery, as this is using the stdlib json library. This might be confusing to users. +// - This decodes any number (although it is an integer) into a float64 if the type of obj is unknown, e.g. *map[string]interface{}, *interface{}, or *[]interface{}. This means integers above +/- 2^53 will lose precision when round-tripping. Make a JSONOpt that calls d.UseNumber() to avoid this. +// - Duplicate fields, including in-case-sensitive matches, are ignored in an undefined order. Note that the YAML specification forbids duplicate fields, so this logic is more permissive than it needs to. See UnmarshalStrict for an alternative. +// - Unknown fields, i.e. serialized data that do not map to a field in obj, are ignored. Use d.DisallowUnknownFields() or UnmarshalStrict to override. +// - As per the YAML 1.1 specification, which yaml.v2 used underneath implements, literal 'yes' and 'no' strings without quotation marks will be converted to true/false implicitly. +// - YAML non-string keys, e.g. ints, bools and floats, are converted to strings implicitly during the YAML to JSON conversion process. +// - There are no compatibility guarantees for returned error values. +func Unmarshal(yamlBytes []byte, obj interface{}, opts ...JSONOpt) error { + return unmarshal(yamlBytes, obj, yaml.Unmarshal, opts...) } -// UnmarshalStrict strictly converts YAML to JSON then uses JSON to unmarshal -// into an object, optionally configuring the behavior of the JSON unmarshal. -func UnmarshalStrict(y []byte, o interface{}, opts ...JSONOpt) error { - return yamlUnmarshal(y, o, true, append(opts, DisallowUnknownFields)...) +// UnmarshalStrict is similar to Unmarshal (please read its documentation for reference), with the following exceptions: +// +// - Duplicate fields in an object yield an error. This is according to the YAML specification. +// - If obj, or any of its recursive children, is a struct, presence of fields in the serialized data unknown to the struct will yield an error. +func UnmarshalStrict(yamlBytes []byte, obj interface{}, opts ...JSONOpt) error { + return unmarshal(yamlBytes, obj, yaml.UnmarshalStrict, append(opts, DisallowUnknownFields)...) } -// yamlUnmarshal unmarshals the given YAML byte stream into the given interface, +// unmarshal unmarshals the given YAML byte stream into the given interface, // optionally performing the unmarshalling strictly -func yamlUnmarshal(y []byte, o interface{}, strict bool, opts ...JSONOpt) error { - vo := reflect.ValueOf(o) - unmarshalFn := yaml.Unmarshal - if strict { - unmarshalFn = yaml.UnmarshalStrict - } - j, err := yamlToJSON(y, &vo, unmarshalFn) +func unmarshal(yamlBytes []byte, obj interface{}, unmarshalFn func([]byte, interface{}) error, opts ...JSONOpt) error { + jsonTarget := reflect.ValueOf(obj) + + jsonBytes, err := yamlToJSONTarget(yamlBytes, &jsonTarget, unmarshalFn) if err != nil { - return fmt.Errorf("error converting YAML to JSON: %v", err) + return fmt.Errorf("error converting YAML to JSON: %w", err) } - err = jsonUnmarshal(bytes.NewReader(j), o, opts...) + err = jsonUnmarshal(bytes.NewReader(jsonBytes), obj, opts...) if err != nil { - return fmt.Errorf("error unmarshaling JSON: %v", err) + return fmt.Errorf("error unmarshaling JSON: %w", err) } return nil @@ -67,21 +86,26 @@ func yamlUnmarshal(y []byte, o interface{}, strict bool, opts ...JSONOpt) error // object, optionally applying decoder options prior to decoding. We are not // using json.Unmarshal directly as we want the chance to pass in non-default // options. -func jsonUnmarshal(r io.Reader, o interface{}, opts ...JSONOpt) error { - d := json.NewDecoder(r) +func jsonUnmarshal(reader io.Reader, obj interface{}, opts ...JSONOpt) error { + d := json.NewDecoder(reader) for _, opt := range opts { d = opt(d) } - if err := d.Decode(&o); err != nil { + if err := d.Decode(&obj); err != nil { return fmt.Errorf("while decoding JSON: %v", err) } return nil } -// JSONToYAML Converts JSON to YAML. +// JSONToYAML converts JSON to YAML. Notable implementation details: +// +// - Duplicate fields, are case-sensitively ignored in an undefined order. +// - The sequence indentation style is compact, which means that the "- " marker for a YAML sequence will be on the same indentation level as the sequence field name. +// - Unlike Unmarshal, all integers, up to 64 bits, are preserved during this round-trip. func JSONToYAML(j []byte) ([]byte, error) { // Convert the JSON to an object. var jsonObj interface{} + // We are using yaml.Unmarshal here (instead of json.Unmarshal) because the // Go JSON library doesn't try to pick the right number type (int, float, // etc.) when unmarshalling to interface{}, it just picks float64 @@ -93,35 +117,46 @@ func JSONToYAML(j []byte) ([]byte, error) { } // Marshal this object into YAML. - return yaml.Marshal(jsonObj) + yamlBytes, err := yaml.Marshal(jsonObj) + if err != nil { + return nil, err + } + + return yamlBytes, nil } // YAMLToJSON converts YAML to JSON. Since JSON is a subset of YAML, // passing JSON through this method should be a no-op. // -// Things YAML can do that are not supported by JSON: -// * In YAML you can have binary and null keys in your maps. These are invalid -// in JSON. (int and float keys are converted to strings.) -// * Binary data in YAML with the !!binary tag is not supported. If you want to -// use binary data with this library, encode the data as base64 as usual but do -// not use the !!binary tag in your YAML. This will ensure the original base64 -// encoded data makes it all the way through to the JSON. +// Some things YAML can do that are not supported by JSON: +// - In YAML you can have binary and null keys in your maps. These are invalid +// in JSON, and therefore int, bool and float keys are converted to strings implicitly. +// - Binary data in YAML with the !!binary tag is not supported. If you want to +// use binary data with this library, encode the data as base64 as usual but do +// not use the !!binary tag in your YAML. This will ensure the original base64 +// encoded data makes it all the way through to the JSON. +// - And more... read the YAML specification for more details. +// +// Notable about the implementation: // -// For strict decoding of YAML, use YAMLToJSONStrict. +// - Duplicate fields are case-sensitively ignored in an undefined order. Note that the YAML specification forbids duplicate fields, so this logic is more permissive than it needs to. See YAMLToJSONStrict for an alternative. +// - As per the YAML 1.1 specification, which yaml.v2 used underneath implements, literal 'yes' and 'no' strings without quotation marks will be converted to true/false implicitly. +// - Unlike Unmarshal, all integers, up to 64 bits, are preserved during this round-trip. +// - There are no compatibility guarantees for returned error values. func YAMLToJSON(y []byte) ([]byte, error) { - return yamlToJSON(y, nil, yaml.Unmarshal) + return yamlToJSONTarget(y, nil, yaml.Unmarshal) } // YAMLToJSONStrict is like YAMLToJSON but enables strict YAML decoding, // returning an error on any duplicate field names. func YAMLToJSONStrict(y []byte) ([]byte, error) { - return yamlToJSON(y, nil, yaml.UnmarshalStrict) + return yamlToJSONTarget(y, nil, yaml.UnmarshalStrict) } -func yamlToJSON(y []byte, jsonTarget *reflect.Value, yamlUnmarshal func([]byte, interface{}) error) ([]byte, error) { +func yamlToJSONTarget(yamlBytes []byte, jsonTarget *reflect.Value, unmarshalFn func([]byte, interface{}) error) ([]byte, error) { // Convert the YAML to an object. var yamlObj interface{} - err := yamlUnmarshal(y, &yamlObj) + err := unmarshalFn(yamlBytes, &yamlObj) if err != nil { return nil, err } @@ -136,7 +171,11 @@ func yamlToJSON(y []byte, jsonTarget *reflect.Value, yamlUnmarshal func([]byte, } // Convert this object to JSON and return the data. - return json.Marshal(jsonObj) + jsonBytes, err := json.Marshal(jsonObj) + if err != nil { + return nil, err + } + return jsonBytes, nil } func convertToJSONableObject(yamlObj interface{}, jsonTarget *reflect.Value) (interface{}, error) { @@ -147,13 +186,13 @@ func convertToJSONableObject(yamlObj interface{}, jsonTarget *reflect.Value) (in // decoding into the value, we're just checking if the ultimate target is a // string. if jsonTarget != nil { - ju, tu, pv := indirect(*jsonTarget, false) + jsonUnmarshaler, textUnmarshaler, pointerValue := indirect(*jsonTarget, false) // We have a JSON or Text Umarshaler at this level, so we can't be trying // to decode into a string. - if ju != nil || tu != nil { + if jsonUnmarshaler != nil || textUnmarshaler != nil { jsonTarget = nil } else { - jsonTarget = &pv + jsonTarget = &pointerValue } } @@ -205,7 +244,7 @@ func convertToJSONableObject(yamlObj interface{}, jsonTarget *reflect.Value) (in keyString = "false" } default: - return nil, fmt.Errorf("Unsupported map key of type: %s, key: %+#v, value: %+#v", + return nil, fmt.Errorf("unsupported map key of type: %s, key: %+#v, value: %+#v", reflect.TypeOf(k), k, v) } diff --git a/tools/vendor/sigs.k8s.io/yaml/yaml_go110.go b/tools/vendor/sigs.k8s.io/yaml/yaml_go110.go index ab3e06a22..94abc1719 100644 --- a/tools/vendor/sigs.k8s.io/yaml/yaml_go110.go +++ b/tools/vendor/sigs.k8s.io/yaml/yaml_go110.go @@ -1,7 +1,24 @@ // This file contains changes that are only compatible with go 1.10 and onwards. +//go:build go1.10 // +build go1.10 +/* +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 yaml import "encoding/json"